Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVojtech Bubnik <bubnikv@gmail.com>2021-04-12 12:06:09 +0300
committerVojtech Bubnik <bubnikv@gmail.com>2021-04-12 12:06:09 +0300
commit978c3a6c8984bdf7d852bd071718e70ee11e0063 (patch)
tree5e62926a8c962c7b6d5ccb1c1a1c2c525bafe4a9
parent580d739d6f377fcf76456051e1816aae2fb35bad (diff)
parentfcabe8a0f47807bb7efff3fdcecf35c49d02556b (diff)
Merge tag 'version_2.3.0' into stable
version_2.3.0
-rw-r--r--.github/CONTRIBUTING.md12
-rw-r--r--CMakeLists.txt28
-rw-r--r--PrusaSlicer.mobin0 -> 249853 bytes
-rw-r--r--README.md2
-rw-r--r--cmake/modules/FindDBus.cmake59
-rw-r--r--cmake/modules/FindGTK3.cmake46
-rw-r--r--cmake/modules/FindOpenVDB.cmake2
-rw-r--r--cmake/modules/PrecompiledHeader.cmake26
-rw-r--r--deps/CGAL/CGAL.cmake11
-rw-r--r--deps/CGAL/cgal/CGALConfigVersion.cmake25
-rw-r--r--deps/CMakeLists.txt96
-rw-r--r--deps/EXPAT/EXPAT.cmake9
-rw-r--r--deps/EXPAT/expat/CMakeLists.txt71
-rw-r--r--deps/EXPAT/expat/COPYING21
-rw-r--r--deps/EXPAT/expat/README146
-rw-r--r--deps/EXPAT/expat/ascii.h92
-rw-r--r--deps/EXPAT/expat/asciitab.h36
-rw-r--r--deps/EXPAT/expat/config.cmake.in4
-rw-r--r--deps/EXPAT/expat/expat.h1048
-rw-r--r--deps/EXPAT/expat/expat_config.h33
-rw-r--r--deps/EXPAT/expat/expat_external.h129
-rw-r--r--deps/EXPAT/expat/iasciitab.h37
-rw-r--r--deps/EXPAT/expat/internal.h95
-rw-r--r--deps/EXPAT/expat/latin1tab.h36
-rw-r--r--deps/EXPAT/expat/nametab.h150
-rw-r--r--deps/EXPAT/expat/utf8tab.h37
-rw-r--r--deps/EXPAT/expat/xmlparse.c6458
-rw-r--r--deps/EXPAT/expat/xmlrole.c1322
-rw-r--r--deps/EXPAT/expat/xmlrole.h114
-rw-r--r--deps/EXPAT/expat/xmltok.c1737
-rw-r--r--deps/EXPAT/expat/xmltok.h322
-rw-r--r--deps/EXPAT/expat/xmltok_impl.h46
-rw-r--r--deps/EXPAT/expat/xmltok_impl.inc1779
-rw-r--r--deps/EXPAT/expat/xmltok_ns.inc115
-rw-r--r--deps/GLEW/GLEW.cmake1
-rw-r--r--deps/GMP/GMP.cmake13
-rw-r--r--deps/OpenCSG/OpenCSG.cmake4
-rw-r--r--deps/PNG/PNG.cmake23
-rw-r--r--deps/deps-linux.cmake51
-rw-r--r--deps/deps-macos.cmake29
-rw-r--r--deps/deps-mingw.cmake16
-rw-r--r--deps/deps-unix-common.cmake8
-rw-r--r--deps/deps-windows.cmake63
-rw-r--r--deps/wxWidgets/wxWidgets.cmake44
-rw-r--r--doc/How to build - Linux et al.md4
-rw-r--r--doc/How to build - Mac OS.md26
-rw-r--r--doc/How to build - Windows.md58
-rwxr-xr-xresources/data/flatpak/com.prusa3d.PrusaSlicer.desktop12
-rwxr-xr-xresources/data/flatpak/com.prusa3d.PrusaSlicer.metainfo.xml62
-rw-r--r--resources/icons/Pmetal_001.pngbin0 -> 80450 bytes
-rw-r--r--resources/icons/PrusaSlicer-gcodeviewer.icobin0 -> 120297 bytes
-rw-r--r--resources/icons/PrusaSlicer-gcodeviewer_128px.pngbin0 -> 9332 bytes
-rw-r--r--resources/icons/PrusaSlicer-gcodeviewer_192px.pngbin0 -> 13981 bytes
-rw-r--r--resources/icons/PrusaSlicer-gcodeviewer_32px.pngbin0 -> 1795 bytes
-rw-r--r--resources/icons/add.svg31
-rw-r--r--resources/icons/arrange.svg21
-rw-r--r--resources/icons/attention.svg12
-rw-r--r--resources/icons/cancel.svg10
-rw-r--r--resources/icons/cog_.svg17
-rw-r--r--resources/icons/collapse.svg16
-rw-r--r--resources/icons/copy.svg46
-rw-r--r--resources/icons/cross_focus_large.svg81
-rw-r--r--resources/icons/delete_all.svg30
-rw-r--r--resources/icons/dot_small.svg8
-rw-r--r--resources/icons/empty.svg8
-rw-r--r--resources/icons/exit.svg13
-rw-r--r--resources/icons/fdm_supports.svg19
-rw-r--r--resources/icons/instance_add.svg78
-rw-r--r--resources/icons/instance_remove.svg73
-rw-r--r--resources/icons/ironing.svg27
-rw-r--r--resources/icons/notification_close.svg18
-rw-r--r--resources/icons/notification_close_hover.svg66
-rw-r--r--resources/icons/notification_eject_sd.svg75
-rw-r--r--resources/icons/notification_eject_sd_hover.svg76
-rw-r--r--resources/icons/notification_error.svg71
-rw-r--r--resources/icons/notification_minimalize.svg14
-rw-r--r--resources/icons/notification_minimalize_hover.svg58
-rw-r--r--resources/icons/notification_warning.svg70
-rw-r--r--resources/icons/paste.svg33
-rw-r--r--resources/icons/prusa_slicer_logo.svg5
-rw-r--r--resources/icons/redo_toolbar.svg24
-rw-r--r--resources/icons/remove.svg94
-rw-r--r--resources/icons/seam.svg35
-rw-r--r--resources/icons/search.svg4
-rw-r--r--resources/icons/search_.svg26
-rw-r--r--resources/icons/search_blink.svg13
-rw-r--r--resources/icons/search_gray.svg4
-rw-r--r--resources/icons/settings.svg68
-rw-r--r--resources/icons/splashscreen-gcodepreview.jpgbin0 -> 127316 bytes
-rw-r--r--resources/icons/splashscreen.jpgbin0 -> 128296 bytes
-rw-r--r--resources/icons/split_objects.svg21
-rw-r--r--resources/icons/split_parts.svg20
-rw-r--r--resources/icons/switch_presets.svg52
-rw-r--r--resources/icons/thumb_left.svg54
-rw-r--r--resources/icons/thumb_right.svg54
-rw-r--r--resources/icons/tick_mark.svg6
-rw-r--r--resources/icons/timer_dot.svg72
-rw-r--r--resources/icons/timer_dot_empty.svg73
-rw-r--r--resources/icons/undo_toolbar.svg24
-rw-r--r--resources/icons/white/dot.svg8
-rw-r--r--resources/icons/white/dot_small.svg8
-rw-r--r--resources/icons/white/drop_to_bed.svg15
-rw-r--r--resources/icons/white/edit_uni.svg20
-rw-r--r--resources/icons/white/exit.svg13
-rw-r--r--resources/icons/white/eye_closed.svg13
-rw-r--r--resources/icons/white/eye_open.svg11
-rw-r--r--resources/icons/white/lock_closed_f.svg10
-rw-r--r--resources/icons/white/search.svg4
-rw-r--r--resources/icons/white/switch_presets.svg52
-rw-r--r--resources/localization/PrusaSlicer.pot7301
-rw-r--r--resources/localization/cs/PrusaSlicer.mobin248835 -> 295751 bytes
-rw-r--r--resources/localization/cs/PrusaSlicer_cs.po7331
-rw-r--r--resources/localization/de/PrusaSlicer.mobin256755 -> 304709 bytes
-rw-r--r--resources/localization/de/PrusaSlicer_de.po7352
-rw-r--r--resources/localization/es/PrusaSlicer.mobin255091 -> 303645 bytes
-rw-r--r--resources/localization/es/PrusaSlicer_es.po7367
-rw-r--r--resources/localization/fr/PrusaSlicer.mobin262886 -> 312845 bytes
-rw-r--r--resources/localization/fr/PrusaSlicer_fr.po7335
-rw-r--r--resources/localization/it/PrusaSlicer.mobin251443 -> 299072 bytes
-rw-r--r--resources/localization/it/PrusaSlicer_it.po6667
-rw-r--r--resources/localization/ko/PrusaSlicer.mobin247955 -> 247956 bytes
-rw-r--r--resources/localization/ko/PrusaSlicer_ko_KR.po2
-rw-r--r--resources/localization/list.txt35
-rw-r--r--resources/localization/nl/PrusaSlicer.mobin240125 -> 286933 bytes
-rw-r--r--resources/localization/nl/PrusaSlicer_nl.po8601
-rw-r--r--resources/localization/pl/PrusaSlicer.mobin249993 -> 296282 bytes
-rw-r--r--resources/localization/pl/PrusaSlicer_pl.po7520
-rw-r--r--resources/localization/pt_br/PrusaSlicer.mobin249894 -> 299485 bytes
-rw-r--r--resources/localization/pt_br/PrusaSlicer_pt_br.po9823
-rw-r--r--resources/localization/ru/PrusaSlicer.mobin0 -> 261986 bytes
-rw-r--r--resources/localization/ru/PrusaSlicer_ru.po12847
-rw-r--r--resources/profiles/Anycubic.idx9
-rw-r--r--resources/profiles/Anycubic.ini1778
-rw-r--r--resources/profiles/Anycubic/AK.pngbin0 -> 211675 bytes
-rw-r--r--resources/profiles/Anycubic/AKLP_Bed.stl145756
-rw-r--r--resources/profiles/Anycubic/AKLP_thumbnail.pngbin0 -> 39130 bytes
-rw-r--r--resources/profiles/Anycubic/AK_Bed.stlbin0 -> 706984 bytes
-rw-r--r--resources/profiles/Anycubic/AK_thumbnail.pngbin0 -> 37936 bytes
-rw-r--r--resources/profiles/Anycubic/I3MEGAS_thumbnail.pngbin0 -> 35986 bytes
-rw-r--r--resources/profiles/Anycubic/I3MEGA_thumbnail.pngbin0 -> 35818 bytes
-rw-r--r--resources/profiles/Anycubic/MEGA0_thumbnail.pngbin0 -> 45793 bytes
-rw-r--r--resources/profiles/Anycubic/PREDATOR_thumbnail.pngbin0 -> 34536 bytes
-rw-r--r--resources/profiles/Anycubic/mega0.svg32
-rw-r--r--resources/profiles/Anycubic/mega0_bed.stlbin0 -> 50484 bytes
-rw-r--r--resources/profiles/BIBO.idx3
-rw-r--r--resources/profiles/BIBO.ini1709
-rw-r--r--resources/profiles/BIBO/BIBO2_thumbnail.pngbin43217 -> 33796 bytes
-rw-r--r--resources/profiles/Creality.idx14
-rw-r--r--resources/profiles/Creality.ini635
-rw-r--r--resources/profiles/Creality/CR10MINI_thumbnail.pngbin0 -> 28912 bytes
-rw-r--r--resources/profiles/Creality/CR10S4_thumbnail.pngbin0 -> 30672 bytes
-rw-r--r--resources/profiles/Creality/CR10S5_thumbnail.pngbin0 -> 30672 bytes
-rw-r--r--resources/profiles/Creality/CR10SPROV2_thumbnail.pngbin0 -> 21910 bytes
-rw-r--r--resources/profiles/Creality/CR10SPRO_thumbnail.pngbin0 -> 27983 bytes
-rw-r--r--resources/profiles/Creality/CR10S_thumbnail.pngbin0 -> 42283 bytes
-rw-r--r--resources/profiles/Creality/CR10V2_thumbnail.pngbin0 -> 21914 bytes
-rw-r--r--resources/profiles/Creality/CR10V3_thumbnail.pngbin0 -> 23781 bytes
-rw-r--r--resources/profiles/Creality/CR10_thumbnail.pngbin0 -> 41010 bytes
-rw-r--r--resources/profiles/Creality/CR20PRO_thumbnail.pngbin0 -> 38308 bytes
-rw-r--r--resources/profiles/Creality/CR20_thumbnail.pngbin0 -> 27924 bytes
-rw-r--r--resources/profiles/Creality/ENDER2_thumbnail.pngbin0 -> 35192 bytes
-rw-r--r--resources/profiles/Creality/ENDER3BLTOUCH_thumbnail.pngbin0 -> 42054 bytes
-rw-r--r--resources/profiles/Creality/ENDER3V2_thumbnail.pngbin0 -> 29849 bytes
-rw-r--r--resources/profiles/Creality/ENDER3_thumbnail.pngbin59603 -> 42054 bytes
-rw-r--r--resources/profiles/Creality/ENDER5PLUS_thumbnail.pngbin0 -> 34582 bytes
-rw-r--r--resources/profiles/Creality/ENDER5_thumbnail.pngbin0 -> 50897 bytes
-rw-r--r--resources/profiles/Creality/cr10.svg4
-rw-r--r--resources/profiles/Creality/cr10_bed.stl2774
-rw-r--r--resources/profiles/Creality/cr10mini.svg4
-rw-r--r--resources/profiles/Creality/cr10mini_bed.stl2774
-rw-r--r--resources/profiles/Creality/cr10s4.svg4
-rw-r--r--resources/profiles/Creality/cr10s4_bed.stl2774
-rw-r--r--resources/profiles/Creality/cr10s5.svg4
-rw-r--r--resources/profiles/Creality/cr10s5_bed.stl2774
-rw-r--r--resources/profiles/Creality/cr10v2_bed.stl2774
-rw-r--r--resources/profiles/Creality/cr20.svg4
-rw-r--r--resources/profiles/Creality/ender2.svg560
-rw-r--r--resources/profiles/Creality/ender2_bed.stl2774
-rw-r--r--resources/profiles/Creality/ender3.svg8
-rw-r--r--resources/profiles/Creality/ender3_bed.stlbin50484 -> 115894 bytes
-rw-r--r--resources/profiles/Creality/ender5plus.svg4
-rw-r--r--resources/profiles/Creality/ender5plus_bed.stl2774
-rw-r--r--resources/profiles/FLSun.idx2
-rw-r--r--resources/profiles/FLSun.ini842
-rw-r--r--resources/profiles/FLSun/Q5.svg59
-rw-r--r--resources/profiles/FLSun/Q5_bed.stlbin0 -> 426484 bytes
-rw-r--r--resources/profiles/FLSun/Q5_thumbnail.pngbin0 -> 19653 bytes
-rw-r--r--resources/profiles/FLSun/QQSP.svg59
-rw-r--r--resources/profiles/FLSun/QQSP_bed.stlbin0 -> 426484 bytes
-rw-r--r--resources/profiles/FLSun/QQSP_thumbnail.pngbin0 -> 33801 bytes
-rw-r--r--resources/profiles/LulzBot.idx2
-rw-r--r--resources/profiles/LulzBot.ini16
-rw-r--r--resources/profiles/LulzBot/MINI_AERO_thumbnail.pngbin47193 -> 49631 bytes
-rw-r--r--resources/profiles/LulzBot/TAZ6_AERO_thumbnail.pngbin63735 -> 42665 bytes
-rw-r--r--resources/profiles/PrusaResearch.idx30
-rw-r--r--resources/profiles/PrusaResearch.ini2157
-rw-r--r--resources/profiles/TriLAB.idx8
-rw-r--r--resources/profiles/TriLAB.ini893
-rw-r--r--resources/profiles/TriLAB/DQ2+FP2_thumbnail.pngbin0 -> 34779 bytes
-rw-r--r--resources/profiles/TriLAB/DQ2+FP_thumbnail.pngbin0 -> 34779 bytes
-rw-r--r--resources/profiles/TriLAB/DQ2P+FP2_thumbnail.pngbin0 -> 33149 bytes
-rw-r--r--resources/profiles/TriLAB/DQ2P+FP_thumbnail.pngbin0 -> 33149 bytes
-rw-r--r--resources/profiles/TriLAB/DQ2P_thumbnail.pngbin0 -> 33149 bytes
-rw-r--r--resources/profiles/TriLAB/DQ2_thumbnail.pngbin0 -> 34779 bytes
-rw-r--r--resources/profiles/TriLAB/DQL_thumbnail.pngbin0 -> 31190 bytes
-rw-r--r--resources/profiles/TriLAB/DQM_thumbnail.pngbin0 -> 37184 bytes
-rw-r--r--resources/profiles/TriLAB/DQXL_thumbnail.pngbin0 -> 34282 bytes
-rw-r--r--resources/profiles/TriLAB/dq2_bed.stlbin0 -> 604284 bytes
-rw-r--r--resources/shaders/gouraud.fs36
-rw-r--r--resources/shaders/gouraud.vs30
-rw-r--r--resources/shaders/gouraud_light.fs11
-rw-r--r--resources/shaders/gouraud_light.vs38
-rw-r--r--resources/shaders/options_110.fs8
-rw-r--r--resources/shaders/options_110.vs22
-rw-r--r--resources/shaders/options_120.fs22
-rw-r--r--resources/shaders/options_120.vs22
-rw-r--r--resources/shaders/toolpaths_lines.fs28
-rw-r--r--resources/shaders/toolpaths_lines.vs19
-rw-r--r--resources/shaders/variable_layer_height.vs6
-rw-r--r--sandboxes/CMakeLists.txt1
-rw-r--r--sandboxes/aabb-evaluation/CMakeLists.txt2
-rw-r--r--sandboxes/aabb-evaluation/aabb-evaluation.cpp224
-rw-r--r--sandboxes/opencsg/CMakeLists.txt1
-rw-r--r--sandboxes/opencsg/main.cpp2
-rw-r--r--src/CMakeLists.txt87
-rw-r--r--src/PrusaSlicer.cpp251
-rw-r--r--src/PrusaSlicer_app_msvc.cpp8
-rw-r--r--src/Shiny/ShinyOutput.c6
-rw-r--r--src/admesh/stl.h12
-rw-r--r--src/admesh/stlinit.cpp14
-rw-r--r--src/clipper/CMakeLists.txt4
-rw-r--r--src/clipper/clipper.cpp58
-rw-r--r--src/hidapi/linux/hid.c8
-rw-r--r--src/imgui/README.md9
-rw-r--r--src/imgui/imconfig.h85
-rw-r--r--src/imgui/imgui.cpp5885
-rw-r--r--src/imgui/imgui.h1620
-rw-r--r--src/imgui/imgui_demo.cpp2553
-rw-r--r--src/imgui/imgui_draw.cpp1291
-rw-r--r--src/imgui/imgui_internal.h1448
-rw-r--r--src/imgui/imgui_widgets.cpp4408
-rw-r--r--src/imgui/imstb_rectpack.h26
-rw-r--r--src/imgui/imstb_textedit.h26
-rw-r--r--src/imgui/imstb_truetype.h95
-rw-r--r--src/libnest2d/LICENSE.txt816
-rw-r--r--src/libnest2d/include/libnest2d/backends/clipper/geometries.hpp6
-rw-r--r--src/libnest2d/include/libnest2d/geometry_traits.hpp3
-rw-r--r--src/libnest2d/include/libnest2d/libnest2d.hpp1
-rw-r--r--src/libnest2d/include/libnest2d/nester.hpp8
-rw-r--r--src/libnest2d/include/libnest2d/placers/nfpplacer.hpp298
-rw-r--r--src/libnest2d/include/libnest2d/selections/firstfit.hpp5
-rw-r--r--src/libnest2d/include/libnest2d/selections/selection_boilerplate.hpp3
-rw-r--r--src/libnest2d/tools/svgtools.hpp25
-rw-r--r--src/libslic3r/AABBTreeIndirect.hpp759
-rw-r--r--src/libslic3r/AppConfig.cpp (renamed from src/slic3r/GUI/AppConfig.cpp)213
-rw-r--r--src/libslic3r/AppConfig.hpp (renamed from src/slic3r/GUI/AppConfig.hpp)28
-rw-r--r--src/libslic3r/Arrange.cpp430
-rw-r--r--src/libslic3r/Arrange.hpp183
-rw-r--r--src/libslic3r/BoundingBox.cpp19
-rw-r--r--src/libslic3r/BoundingBox.hpp64
-rw-r--r--src/libslic3r/BridgeDetector.cpp2
-rw-r--r--src/libslic3r/CMakeLists.txt78
-rw-r--r--src/libslic3r/ClipperUtils.cpp73
-rw-r--r--src/libslic3r/ClipperUtils.hpp2
-rw-r--r--src/libslic3r/Config.cpp43
-rw-r--r--src/libslic3r/Config.hpp229
-rw-r--r--src/libslic3r/CustomGCode.cpp17
-rw-r--r--src/libslic3r/CustomGCode.hpp26
-rw-r--r--src/libslic3r/EdgeGrid.cpp132
-rw-r--r--src/libslic3r/EdgeGrid.hpp50
-rw-r--r--src/libslic3r/ElephantFootCompensation.cpp11
-rw-r--r--src/libslic3r/ExPolygon.cpp38
-rw-r--r--src/libslic3r/ExPolygon.hpp23
-rw-r--r--src/libslic3r/Exception.hpp31
-rw-r--r--src/libslic3r/ExtrusionEntity.cpp43
-rw-r--r--src/libslic3r/ExtrusionEntity.hpp13
-rw-r--r--src/libslic3r/ExtrusionEntityCollection.hpp5
-rw-r--r--src/libslic3r/FileParserError.hpp8
-rw-r--r--src/libslic3r/Fill/Fill.cpp222
-rw-r--r--src/libslic3r/Fill/Fill.hpp5
-rw-r--r--src/libslic3r/Fill/Fill3DHoneycomb.cpp14
-rw-r--r--src/libslic3r/Fill/Fill3DHoneycomb.hpp12
-rw-r--r--src/libslic3r/Fill/FillAdaptive.cpp1545
-rw-r--r--src/libslic3r/Fill/FillAdaptive.hpp79
-rw-r--r--src/libslic3r/Fill/FillBase.cpp1690
-rw-r--r--src/libslic3r/Fill/FillBase.hpp47
-rw-r--r--src/libslic3r/Fill/FillConcentric.cpp10
-rw-r--r--src/libslic3r/Fill/FillConcentric.hpp12
-rw-r--r--src/libslic3r/Fill/FillGyroid.cpp32
-rw-r--r--src/libslic3r/Fill/FillGyroid.hpp10
-rw-r--r--src/libslic3r/Fill/FillHoneycomb.cpp80
-rw-r--r--src/libslic3r/Fill/FillHoneycomb.hpp12
-rw-r--r--src/libslic3r/Fill/FillLine.cpp122
-rw-r--r--src/libslic3r/Fill/FillLine.hpp49
-rw-r--r--src/libslic3r/Fill/FillPlanePath.cpp103
-rw-r--r--src/libslic3r/Fill/FillPlanePath.hpp34
-rw-r--r--src/libslic3r/Fill/FillRectilinear.cpp3032
-rw-r--r--src/libslic3r/Fill/FillRectilinear.hpp112
-rw-r--r--src/libslic3r/Fill/FillRectilinear2.cpp1476
-rw-r--r--src/libslic3r/Fill/FillRectilinear2.hpp74
-rw-r--r--src/libslic3r/Fill/FillRectilinear3.cpp1642
-rw-r--r--src/libslic3r/Fill/FillRectilinear3.hpp83
-rw-r--r--src/libslic3r/Flow.cpp6
-rw-r--r--src/libslic3r/Flow.hpp7
-rw-r--r--src/libslic3r/Format/3mf.cpp324
-rw-r--r--src/libslic3r/Format/3mf.hpp8
-rw-r--r--src/libslic3r/Format/AMF.cpp82
-rw-r--r--src/libslic3r/Format/OBJ.cpp9
-rw-r--r--src/libslic3r/Format/PRUS.cpp10
-rw-r--r--src/libslic3r/Format/SL1.cpp481
-rw-r--r--src/libslic3r/Format/SL1.hpp62
-rw-r--r--src/libslic3r/Format/objparser.cpp15
-rw-r--r--src/libslic3r/GCode.cpp2432
-rw-r--r--src/libslic3r/GCode.hpp117
-rw-r--r--src/libslic3r/GCode/Analyzer.cpp1193
-rw-r--r--src/libslic3r/GCode/Analyzer.hpp305
-rw-r--r--src/libslic3r/GCode/AvoidCrossingPerimeters.cpp1377
-rw-r--r--src/libslic3r/GCode/AvoidCrossingPerimeters.hpp70
-rw-r--r--src/libslic3r/GCode/CoolingBuffer.cpp14
-rw-r--r--src/libslic3r/GCode/GCodeProcessor.cpp2530
-rw-r--r--src/libslic3r/GCode/GCodeProcessor.hpp610
-rw-r--r--src/libslic3r/GCode/PostProcessor.cpp23
-rw-r--r--src/libslic3r/GCode/PostProcessor.hpp2
-rw-r--r--src/libslic3r/GCode/PressureEqualizer.cpp11
-rw-r--r--src/libslic3r/GCode/PreviewData.cpp516
-rw-r--r--src/libslic3r/GCode/PreviewData.hpp397
-rw-r--r--src/libslic3r/GCode/PrintExtents.cpp3
-rw-r--r--src/libslic3r/GCode/SeamPlacer.cpp848
-rw-r--r--src/libslic3r/GCode/SeamPlacer.hpp109
-rw-r--r--src/libslic3r/GCode/SpiralVase.cpp20
-rw-r--r--src/libslic3r/GCode/SpiralVase.hpp12
-rw-r--r--src/libslic3r/GCode/ThumbnailData.cpp5
-rw-r--r--src/libslic3r/GCode/ThumbnailData.hpp6
-rw-r--r--src/libslic3r/GCode/ToolOrdering.cpp23
-rw-r--r--src/libslic3r/GCode/ToolOrdering.hpp6
-rw-r--r--src/libslic3r/GCode/WipeTower.cpp281
-rw-r--r--src/libslic3r/GCode/WipeTower.hpp19
-rw-r--r--src/libslic3r/GCodeReader.cpp6
-rw-r--r--src/libslic3r/GCodeReader.hpp13
-rw-r--r--src/libslic3r/GCodeSender.cpp6
-rw-r--r--src/libslic3r/GCodeTimeEstimator.cpp1703
-rw-r--r--src/libslic3r/GCodeTimeEstimator.hpp498
-rw-r--r--src/libslic3r/GCodeWriter.cpp37
-rw-r--r--src/libslic3r/Geometry.cpp11
-rw-r--r--src/libslic3r/Geometry.hpp255
-rw-r--r--src/libslic3r/Layer.cpp31
-rw-r--r--src/libslic3r/Layer.hpp24
-rw-r--r--src/libslic3r/LayerRegion.cpp16
-rw-r--r--src/libslic3r/Line.cpp35
-rw-r--r--src/libslic3r/Line.hpp40
-rw-r--r--src/libslic3r/MTUtils.hpp242
-rw-r--r--src/libslic3r/MarchingSquares.hpp448
-rw-r--r--src/libslic3r/MeshBoolean.cpp12
-rw-r--r--src/libslic3r/Model.cpp416
-rw-r--r--src/libslic3r/Model.hpp367
-rw-r--r--src/libslic3r/ModelArrange.cpp85
-rw-r--r--src/libslic3r/ModelArrange.hpp71
-rw-r--r--src/libslic3r/MotionPlanner.cpp362
-rw-r--r--src/libslic3r/MotionPlanner.hpp91
-rw-r--r--src/libslic3r/MultiPoint.cpp18
-rw-r--r--src/libslic3r/MultiPoint.hpp7
-rw-r--r--src/libslic3r/ObjectID.cpp2
-rw-r--r--src/libslic3r/ObjectID.hpp51
-rw-r--r--src/libslic3r/OpenVDBUtils.cpp37
-rw-r--r--src/libslic3r/OpenVDBUtils.hpp1
-rw-r--r--src/libslic3r/Optimize/BruteforceOptimizer.hpp140
-rw-r--r--src/libslic3r/Optimize/NLoptOptimizer.hpp233
-rw-r--r--src/libslic3r/Optimize/Optimizer.hpp182
-rw-r--r--src/libslic3r/PNGReadWrite.cpp225
-rw-r--r--src/libslic3r/PNGReadWrite.hpp82
-rw-r--r--src/libslic3r/PerimeterGenerator.cpp8
-rw-r--r--src/libslic3r/PerimeterGenerator.hpp3
-rw-r--r--src/libslic3r/PlaceholderParser.cpp51
-rw-r--r--src/libslic3r/PlaceholderParser.hpp18
-rw-r--r--src/libslic3r/Point.cpp24
-rw-r--r--src/libslic3r/Point.hpp153
-rw-r--r--src/libslic3r/Polygon.cpp51
-rw-r--r--src/libslic3r/Polygon.hpp29
-rw-r--r--src/libslic3r/Polyline.cpp7
-rw-r--r--src/libslic3r/Polyline.hpp4
-rw-r--r--src/libslic3r/Preset.cpp (renamed from src/slic3r/GUI/Preset.cpp)1118
-rw-r--r--src/libslic3r/Preset.hpp (renamed from src/slic3r/GUI/Preset.hpp)330
-rw-r--r--src/libslic3r/PresetBundle.cpp (renamed from src/slic3r/GUI/PresetBundle.cpp)641
-rw-r--r--src/libslic3r/PresetBundle.hpp (renamed from src/slic3r/GUI/PresetBundle.hpp)35
-rw-r--r--src/libslic3r/Print.cpp264
-rw-r--r--src/libslic3r/Print.hpp105
-rw-r--r--src/libslic3r/PrintBase.cpp16
-rw-r--r--src/libslic3r/PrintBase.hpp222
-rw-r--r--src/libslic3r/PrintConfig.cpp431
-rw-r--r--src/libslic3r/PrintConfig.hpp244
-rw-r--r--src/libslic3r/PrintObject.cpp395
-rw-r--r--src/libslic3r/PrintRegion.cpp5
-rw-r--r--src/libslic3r/SLA/AGGRaster.hpp223
-rw-r--r--src/libslic3r/SLA/BoostAdapter.hpp4
-rw-r--r--src/libslic3r/SLA/Clustering.cpp152
-rw-r--r--src/libslic3r/SLA/Clustering.hpp58
-rw-r--r--src/libslic3r/SLA/Common.cpp769
-rw-r--r--src/libslic3r/SLA/Common.hpp32
-rw-r--r--src/libslic3r/SLA/Concurrency.hpp110
-rw-r--r--src/libslic3r/SLA/Contour3D.cpp16
-rw-r--r--src/libslic3r/SLA/Contour3D.hpp13
-rw-r--r--src/libslic3r/SLA/Hollowing.cpp18
-rw-r--r--src/libslic3r/SLA/Hollowing.hpp5
-rw-r--r--src/libslic3r/SLA/IndexedMesh.cpp433
-rw-r--r--src/libslic3r/SLA/IndexedMesh.hpp (renamed from src/libslic3r/SLA/EigenMesh3D.hpp)118
-rw-r--r--src/libslic3r/SLA/JobController.hpp1
-rw-r--r--src/libslic3r/SLA/Pad.cpp203
-rw-r--r--src/libslic3r/SLA/Raster.cpp320
-rw-r--r--src/libslic3r/SLA/Raster.hpp157
-rw-r--r--src/libslic3r/SLA/RasterBase.cpp89
-rw-r--r--src/libslic3r/SLA/RasterBase.hpp124
-rw-r--r--src/libslic3r/SLA/RasterToPolygons.cpp91
-rw-r--r--src/libslic3r/SLA/RasterToPolygons.hpp15
-rw-r--r--src/libslic3r/SLA/RasterWriter.cpp151
-rw-r--r--src/libslic3r/SLA/RasterWriter.hpp130
-rw-r--r--src/libslic3r/SLA/ReprojectPointsOnMesh.hpp47
-rw-r--r--src/libslic3r/SLA/Rotfinder.cpp377
-rw-r--r--src/libslic3r/SLA/Rotfinder.hpp15
-rw-r--r--src/libslic3r/SLA/SpatIndex.cpp161
-rw-r--r--src/libslic3r/SLA/SpatIndex.hpp2
-rw-r--r--src/libslic3r/SLA/SupportPoint.hpp8
-rw-r--r--src/libslic3r/SLA/SupportPointGenerator.cpp388
-rw-r--r--src/libslic3r/SLA/SupportPointGenerator.hpp42
-rw-r--r--src/libslic3r/SLA/SupportTree.cpp20
-rw-r--r--src/libslic3r/SLA/SupportTree.hpp38
-rw-r--r--src/libslic3r/SLA/SupportTreeBuilder.cpp387
-rw-r--r--src/libslic3r/SLA/SupportTreeBuilder.hpp230
-rw-r--r--src/libslic3r/SLA/SupportTreeBuildsteps.cpp1174
-rw-r--r--src/libslic3r/SLA/SupportTreeBuildsteps.hpp171
-rw-r--r--src/libslic3r/SLA/SupportTreeIGL.cpp621
-rw-r--r--src/libslic3r/SLA/SupportTreeMesher.cpp266
-rw-r--r--src/libslic3r/SLA/SupportTreeMesher.hpp117
-rw-r--r--src/libslic3r/SLAPrint.cpp105
-rw-r--r--src/libslic3r/SLAPrint.hpp89
-rw-r--r--src/libslic3r/SLAPrintSteps.cpp126
-rw-r--r--src/libslic3r/SLAPrintSteps.hpp2
-rw-r--r--src/libslic3r/SVG.cpp150
-rw-r--r--src/libslic3r/SVG.hpp24
-rw-r--r--src/libslic3r/Semver.hpp4
-rw-r--r--src/libslic3r/ShortestPath.cpp62
-rw-r--r--src/libslic3r/ShortestPath.hpp2
-rw-r--r--src/libslic3r/SlicesToTriangleMesh.cpp128
-rw-r--r--src/libslic3r/SlicesToTriangleMesh.hpp24
-rw-r--r--src/libslic3r/Slicing.cpp13
-rw-r--r--src/libslic3r/Slicing.hpp7
-rw-r--r--src/libslic3r/SupportMaterial.cpp77
-rw-r--r--src/libslic3r/Technologies.hpp123
-rw-r--r--src/libslic3r/Thread.cpp242
-rw-r--r--src/libslic3r/Thread.hpp57
-rw-r--r--src/libslic3r/TriangleMesh.cpp101
-rw-r--r--src/libslic3r/TriangleMesh.hpp15
-rw-r--r--src/libslic3r/TriangleSelector.cpp768
-rw-r--r--src/libslic3r/TriangleSelector.hpp170
-rw-r--r--src/libslic3r/TriangulateWall.cpp133
-rw-r--r--src/libslic3r/TriangulateWall.hpp17
-rw-r--r--src/libslic3r/Utils.hpp49
-rw-r--r--src/libslic3r/VoronoiOffset.cpp855
-rw-r--r--src/libslic3r/VoronoiOffset.hpp25
-rw-r--r--src/libslic3r/VoronoiVisualUtils.hpp415
-rw-r--r--src/libslic3r/Zipper.cpp85
-rw-r--r--src/libslic3r/Zipper.hpp4
-rw-r--r--src/libslic3r/format.hpp57
-rw-r--r--src/libslic3r/libslic3r.h138
-rw-r--r--src/libslic3r/miniz_extension.cpp88
-rw-r--r--src/libslic3r/miniz_extension.hpp21
-rw-r--r--src/libslic3r/pchheader.hpp1
-rw-r--r--src/libslic3r/utils.cpp31
-rw-r--r--src/platform/msw/PrusaSlicer-gcodeviewer.rc.in25
-rw-r--r--src/platform/msw/PrusaSlicer.rc.in2
-rw-r--r--src/platform/osx/Info.plist.in2
-rw-r--r--src/platform/unix/PrusaGcodeviewer.desktop9
-rw-r--r--src/platform/unix/PrusaSlicer.desktop12
-rw-r--r--src/slic3r/CMakeLists.txt98
-rw-r--r--src/slic3r/Config/Snapshot.cpp78
-rw-r--r--src/slic3r/Config/Snapshot.hpp17
-rw-r--r--src/slic3r/Config/Version.cpp5
-rw-r--r--src/slic3r/Config/Version.hpp4
-rw-r--r--src/slic3r/GUI/2DBed.cpp4
-rw-r--r--src/slic3r/GUI/3DBed.cpp324
-rw-r--r--src/slic3r/GUI/3DBed.hpp54
-rw-r--r--src/slic3r/GUI/3DScene.cpp853
-rw-r--r--src/slic3r/GUI/3DScene.hpp169
-rw-r--r--src/slic3r/GUI/AboutDialog.cpp51
-rw-r--r--src/slic3r/GUI/AboutDialog.hpp4
-rw-r--r--src/slic3r/GUI/BackgroundSlicingProcess.cpp170
-rw-r--r--src/slic3r/GUI/BackgroundSlicingProcess.hpp73
-rw-r--r--src/slic3r/GUI/BedShapeDialog.cpp334
-rw-r--r--src/slic3r/GUI/BedShapeDialog.hpp41
-rw-r--r--src/slic3r/GUI/BitmapCache.cpp49
-rw-r--r--src/slic3r/GUI/BitmapCache.hpp8
-rw-r--r--src/slic3r/GUI/Camera.cpp50
-rw-r--r--src/slic3r/GUI/Camera.hpp36
-rw-r--r--src/slic3r/GUI/ConfigExceptions.hpp10
-rw-r--r--src/slic3r/GUI/ConfigManipulation.cpp59
-rw-r--r--src/slic3r/GUI/ConfigManipulation.hpp16
-rw-r--r--src/slic3r/GUI/ConfigSnapshotDialog.cpp21
-rw-r--r--src/slic3r/GUI/ConfigWizard.cpp925
-rw-r--r--src/slic3r/GUI/ConfigWizard_private.hpp190
-rw-r--r--src/slic3r/GUI/DoubleSlider.cpp1141
-rw-r--r--src/slic3r/GUI/DoubleSlider.hpp95
-rw-r--r--src/slic3r/GUI/ExtraRenderers.cpp333
-rw-r--r--src/slic3r/GUI/ExtraRenderers.hpp162
-rw-r--r--src/slic3r/GUI/ExtruderSequenceDialog.cpp13
-rw-r--r--src/slic3r/GUI/Field.cpp499
-rw-r--r--src/slic3r/GUI/Field.hpp123
-rw-r--r--src/slic3r/GUI/FirmwareDialog.cpp4
-rw-r--r--src/slic3r/GUI/GCodeViewer.cpp2958
-rw-r--r--src/slic3r/GUI/GCodeViewer.hpp560
-rw-r--r--src/slic3r/GUI/GLCanvas3D.cpp2898
-rw-r--r--src/slic3r/GUI/GLCanvas3D.hpp359
-rw-r--r--src/slic3r/GUI/GLCanvas3DManager.cpp411
-rw-r--r--src/slic3r/GUI/GLModel.cpp531
-rw-r--r--src/slic3r/GUI/GLModel.hpp68
-rw-r--r--src/slic3r/GUI/GLSelectionRectangle.cpp8
-rw-r--r--src/slic3r/GUI/GLShader.cpp509
-rw-r--r--src/slic3r/GUI/GLShader.hpp99
-rw-r--r--src/slic3r/GUI/GLShadersManager.cpp80
-rw-r--r--src/slic3r/GUI/GLShadersManager.hpp30
-rw-r--r--src/slic3r/GUI/GLTexture.cpp146
-rw-r--r--src/slic3r/GUI/GLToolbar.cpp241
-rw-r--r--src/slic3r/GUI/GLToolbar.hpp23
-rw-r--r--src/slic3r/GUI/GUI.cpp118
-rw-r--r--src/slic3r/GUI/GUI.hpp22
-rw-r--r--src/slic3r/GUI/GUI_App.cpp1385
-rw-r--r--src/slic3r/GUI/GUI_App.hpp117
-rw-r--r--src/slic3r/GUI/GUI_Init.cpp99
-rw-r--r--src/slic3r/GUI/GUI_Init.hpp27
-rw-r--r--src/slic3r/GUI/GUI_ObjectLayers.cpp34
-rw-r--r--src/slic3r/GUI/GUI_ObjectLayers.hpp1
-rw-r--r--src/slic3r/GUI/GUI_ObjectList.cpp758
-rw-r--r--src/slic3r/GUI/GUI_ObjectList.hpp60
-rw-r--r--src/slic3r/GUI/GUI_ObjectManipulation.cpp146
-rw-r--r--src/slic3r/GUI/GUI_ObjectManipulation.hpp17
-rw-r--r--src/slic3r/GUI/GUI_ObjectSettings.cpp31
-rw-r--r--src/slic3r/GUI/GUI_ObjectSettings.hpp5
-rw-r--r--src/slic3r/GUI/GUI_Preview.cpp770
-rw-r--r--src/slic3r/GUI/GUI_Preview.hpp122
-rw-r--r--src/slic3r/GUI/GUI_Utils.cpp34
-rw-r--r--src/slic3r/GUI/GUI_Utils.hpp77
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoBase.cpp5
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoBase.hpp10
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoCut.cpp57
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp353
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp47
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp112
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp12
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp503
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp36
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp667
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp150
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp12
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp38
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoScale.cpp1
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoScale.hpp2
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp262
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp43
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp395
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp42
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmos.hpp1
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp465
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp307
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmosManager.cpp464
-rw-r--r--src/slic3r/GUI/Gizmos/GLGizmosManager.hpp77
-rw-r--r--src/slic3r/GUI/I18N.hpp2
-rw-r--r--src/slic3r/GUI/ImGuiWrapper.cpp537
-rw-r--r--src/slic3r/GUI/ImGuiWrapper.hpp25
-rw-r--r--src/slic3r/GUI/InstanceCheck.cpp623
-rw-r--r--src/slic3r/GUI/InstanceCheck.hpp101
-rw-r--r--src/slic3r/GUI/InstanceCheckMac.h9
-rw-r--r--src/slic3r/GUI/InstanceCheckMac.mm84
-rw-r--r--src/slic3r/GUI/Job.hpp155
-rw-r--r--src/slic3r/GUI/Jobs/ArrangeJob.cpp227
-rw-r--r--src/slic3r/GUI/Jobs/ArrangeJob.hpp97
-rw-r--r--src/slic3r/GUI/Jobs/FillBedJob.cpp172
-rw-r--r--src/slic3r/GUI/Jobs/FillBedJob.hpp46
-rw-r--r--src/slic3r/GUI/Jobs/Job.cpp122
-rw-r--r--src/slic3r/GUI/Jobs/Job.hpp111
-rw-r--r--src/slic3r/GUI/Jobs/ProgressIndicator.hpp (renamed from src/slic3r/GUI/ProgressIndicator.hpp)0
-rw-r--r--src/slic3r/GUI/Jobs/RotoptimizeJob.cpp85
-rw-r--r--src/slic3r/GUI/Jobs/RotoptimizeJob.hpp24
-rw-r--r--src/slic3r/GUI/Jobs/SLAImportJob.cpp230
-rw-r--r--src/slic3r/GUI/Jobs/SLAImportJob.hpp31
-rw-r--r--src/slic3r/GUI/KBShortcutsDialog.cpp400
-rw-r--r--src/slic3r/GUI/KBShortcutsDialog.hpp10
-rw-r--r--src/slic3r/GUI/LambdaObjectDialog.cpp200
-rw-r--r--src/slic3r/GUI/LambdaObjectDialog.hpp59
-rw-r--r--src/slic3r/GUI/MainFrame.cpp1255
-rw-r--r--src/slic3r/GUI/MainFrame.hpp77
-rw-r--r--src/slic3r/GUI/MeshUtils.cpp76
-rw-r--r--src/slic3r/GUI/MeshUtils.hpp39
-rw-r--r--src/slic3r/GUI/Mouse3DController.cpp464
-rw-r--r--src/slic3r/GUI/Mouse3DController.hpp27
-rw-r--r--src/slic3r/GUI/MsgDialog.cpp20
-rw-r--r--src/slic3r/GUI/MsgDialog.hpp8
-rw-r--r--src/slic3r/GUI/NotificationManager.cpp1512
-rw-r--r--src/slic3r/GUI/NotificationManager.hpp490
-rw-r--r--src/slic3r/GUI/OG_CustomCtrl.cpp745
-rw-r--r--src/slic3r/GUI/OG_CustomCtrl.hpp116
-rw-r--r--src/slic3r/GUI/ObjectDataViewModel.cpp341
-rw-r--r--src/slic3r/GUI/ObjectDataViewModel.hpp171
-rw-r--r--src/slic3r/GUI/OpenGLManager.cpp342
-rw-r--r--src/slic3r/GUI/OpenGLManager.hpp (renamed from src/slic3r/GUI/GLCanvas3DManager.hpp)96
-rw-r--r--src/slic3r/GUI/OptionsGroup.cpp640
-rw-r--r--src/slic3r/GUI/OptionsGroup.hpp179
-rw-r--r--src/slic3r/GUI/PhysicalPrinterDialog.cpp649
-rw-r--r--src/slic3r/GUI/PhysicalPrinterDialog.hpp108
-rw-r--r--src/slic3r/GUI/Plater.cpp3027
-rw-r--r--src/slic3r/GUI/Plater.hpp171
-rw-r--r--src/slic3r/GUI/Preferences.cpp443
-rw-r--r--src/slic3r/GUI/Preferences.hpp12
-rw-r--r--src/slic3r/GUI/PresetComboBoxes.cpp1099
-rw-r--r--src/slic3r/GUI/PresetComboBoxes.hpp198
-rw-r--r--src/slic3r/GUI/PresetHints.cpp56
-rw-r--r--src/slic3r/GUI/PresetHints.hpp2
-rw-r--r--src/slic3r/GUI/PrintHostDialogs.cpp110
-rw-r--r--src/slic3r/GUI/PrintHostDialogs.hpp10
-rw-r--r--src/slic3r/GUI/ProgressStatusBar.hpp2
-rw-r--r--src/slic3r/GUI/RemovableDriveManager.cpp149
-rw-r--r--src/slic3r/GUI/RemovableDriveManager.hpp8
-rw-r--r--src/slic3r/GUI/SavePresetDialog.cpp379
-rw-r--r--src/slic3r/GUI/SavePresetDialog.hpp103
-rw-r--r--src/slic3r/GUI/Search.cpp670
-rw-r--r--src/slic3r/GUI/Search.hpp218
-rw-r--r--src/slic3r/GUI/Selection.cpp267
-rw-r--r--src/slic3r/GUI/Selection.hpp44
-rw-r--r--src/slic3r/GUI/SysInfoDialog.cpp26
-rw-r--r--src/slic3r/GUI/Tab.cpp2413
-rw-r--r--src/slic3r/GUI/Tab.hpp176
-rw-r--r--src/slic3r/GUI/UnsavedChangesDialog.cpp1219
-rw-r--r--src/slic3r/GUI/UnsavedChangesDialog.hpp276
-rw-r--r--src/slic3r/GUI/UpdateDialogs.cpp2
-rw-r--r--src/slic3r/GUI/format.hpp73
-rw-r--r--src/slic3r/GUI/fts_fuzzy_match.h260
-rw-r--r--src/slic3r/GUI/wxExtensions.cpp209
-rw-r--r--src/slic3r/GUI/wxExtensions.hpp76
-rw-r--r--src/slic3r/Utils/ASCIIFolding.cpp907
-rw-r--r--src/slic3r/Utils/ASCIIFolding.hpp10
-rw-r--r--src/slic3r/Utils/AstroBox.hpp2
-rw-r--r--src/slic3r/Utils/Duet.cpp107
-rw-r--r--src/slic3r/Utils/Duet.hpp15
-rw-r--r--src/slic3r/Utils/FixModelByWin10.cpp32
-rw-r--r--src/slic3r/Utils/FlashAir.cpp4
-rw-r--r--src/slic3r/Utils/FlashAir.hpp2
-rw-r--r--src/slic3r/Utils/Http.cpp170
-rw-r--r--src/slic3r/Utils/Http.hpp19
-rw-r--r--src/slic3r/Utils/OctoPrint.cpp24
-rw-r--r--src/slic3r/Utils/OctoPrint.hpp16
-rw-r--r--src/slic3r/Utils/PresetUpdater.cpp239
-rw-r--r--src/slic3r/Utils/PresetUpdater.hpp6
-rw-r--r--src/slic3r/Utils/PrintHost.cpp4
-rw-r--r--src/slic3r/Utils/PrintHost.hpp11
-rw-r--r--src/slic3r/Utils/Process.cpp167
-rw-r--r--src/slic3r/Utils/Process.hpp25
-rw-r--r--src/slic3r/Utils/Profile.hpp19
-rw-r--r--src/slic3r/Utils/Repetier.cpp268
-rw-r--r--src/slic3r/Utils/Repetier.hpp52
-rw-r--r--src/slic3r/Utils/Serial.cpp12
-rw-r--r--src/slic3r/Utils/Thread.hpp28
-rw-r--r--src/slic3r/Utils/UndoRedo.cpp77
-rw-r--r--src/slic3r/Utils/UndoRedo.hpp2
-rw-r--r--src/slic3r/pchheader.hpp4
-rw-r--r--t/shells.t9
-rw-r--r--tests/catch2/catch.hpp3094
-rw-r--r--tests/fff_print/CMakeLists.txt4
-rw-r--r--tests/fff_print/test_data.cpp80
-rw-r--r--tests/fff_print/test_model.cpp8
-rw-r--r--tests/fff_print/test_print.cpp1
-rw-r--r--tests/fff_print/test_printobject.cpp1
-rw-r--r--tests/fff_print/test_support_material.cpp11
-rw-r--r--tests/fff_print/test_trianglemesh.cpp37
-rw-r--r--tests/libnest2d/libnest2d_tests_main.cpp137
-rw-r--r--tests/libslic3r/CMakeLists.txt12
-rw-r--r--tests/libslic3r/test_aabbindirect.cpp61
-rw-r--r--tests/libslic3r/test_clipper_offset.cpp8
-rw-r--r--tests/libslic3r/test_clipper_utils.cpp2
-rw-r--r--tests/libslic3r/test_config.cpp12
-rw-r--r--tests/libslic3r/test_elephant_foot_compensation.cpp2
-rw-r--r--tests/libslic3r/test_geometry.cpp18
-rw-r--r--tests/libslic3r/test_marchingsquares.cpp376
-rw-r--r--tests/libslic3r/test_optimizers.cpp59
-rw-r--r--tests/libslic3r/test_png_io.cpp55
-rw-r--r--tests/libslic3r/test_voronoi.cpp1397
-rw-r--r--tests/sla_print/CMakeLists.txt5
-rw-r--r--tests/sla_print/sla_print_tests.cpp84
-rw-r--r--tests/sla_print/sla_raycast_tests.cpp7
-rw-r--r--tests/sla_print/sla_supptgen_tests.cpp146
-rw-r--r--tests/sla_print/sla_test_utils.cpp146
-rw-r--r--tests/sla_print/sla_test_utils.hpp34
-rw-r--r--tests/slic3rutils/slic3rutils_tests_main.cpp40
-rw-r--r--version.inc6
-rw-r--r--xs/CMakeLists.txt11
-rw-r--r--xs/lib/Slic3r/XS.pm1
-rw-r--r--xs/main.xs.in4
-rw-r--r--xs/src/perlglue.cpp4
-rw-r--r--xs/src/xsinit.h4
-rw-r--r--xs/t/15_config.t6
-rw-r--r--xs/t/18_motionplanner.t92
-rw-r--r--xs/xsp/Config.xsp6
-rw-r--r--xs/xsp/Filler.xsp4
-rw-r--r--xs/xsp/GCode.xsp33
-rw-r--r--xs/xsp/Geometry.xsp2
-rw-r--r--xs/xsp/Layer.xsp3
-rw-r--r--xs/xsp/Model.xsp15
-rw-r--r--xs/xsp/MotionPlanner.xsp15
-rw-r--r--xs/xsp/PerimeterGenerator.xsp2
-rw-r--r--xs/xsp/Print.xsp21
-rw-r--r--xs/xsp/my.map12
-rw-r--r--xs/xsp/typemap.xspt12
708 files changed, 323896 insertions, 68109 deletions
diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md
index ecf8a9177..2bc74fd82 100644
--- a/.github/CONTRIBUTING.md
+++ b/.github/CONTRIBUTING.md
@@ -1,13 +1,13 @@
-Did you encounter an issue with using Slic3r? Fear not! This guide will help you to write a good bug report in just a few, simple steps.
+Did you encounter an issue with using PrusaSlicer? Fear not! This guide will help you to write a good bug report in just a few, simple steps.
-There is a good chance that the issue, you have encountered, is already reported. Please check the [list of reported issues](https://github.com/alexrj/Slic3r/issues) before creating a new issue report. If you find an existing issue report, feel free to add further information to that report.
+There is a good chance that the issue, you have encountered, is already reported. Please check the [list of reported issues](https://github.com/prusa3d/PrusaSlicer/issues) before creating a new issue report. If you find an existing issue report, feel free to add further information to that report.
-If possible, please include the following information when [reporting an issue](https://github.com/alexrj/Slic3r/issues/new):
-* Slic3r version (See the about dialog for the version number. If running from git, please include the git commit ID from `git rev-parse HEAD` also.)
+If possible, please include the following information when [reporting an issue](https://github.com/prusa3d/PrusaSlicer/issues/new):
+* PrusaSlicer version (See the about dialog for the version number. If running from git, please include the git commit ID from `git rev-parse HEAD` also.)
* Operating system type + version
* Steps to reproduce the issue, including:
* Command line parameters used, if any
- * Slic3r configuration file (Use ``Export Config...`` from the ``File`` menu - please don't export a bundle)
+ * PrusaSlicer configuration file (Use ``Export Config...`` from the ``File`` menu - please don't export a bundle)
* Expected result
* Actual result
* Any error messages
@@ -17,5 +17,5 @@ If possible, please include the following information when [reporting an issue](
Please make sure only to include one issue per report. If you encounter multiple, unrelated issues, please report them as such.
-Simon Tatham has written an excellent on article on [How to Report Bugs Effectively](http://www.chiark.greenend.org.uk/~sgtatham/bugs.html) which is well worth reading, although it is not specific to Slic3r.
+Simon Tatham has written an excellent on article on [How to Report Bugs Effectively](http://www.chiark.greenend.org.uk/~sgtatham/bugs.html) which is well worth reading, although it is not specific to PrusaSlicer.
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 52be8e847..c15371c9a 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.8)
+cmake_minimum_required(VERSION 3.13)
project(PrusaSlicer)
include("version.inc")
@@ -35,6 +35,11 @@ option(SLIC3R_ASAN "Enable ASan on Clang and GCC" 0)
set(SLIC3R_GTK "2" CACHE STRING "GTK version to use with wxWidgets on Linux")
+if (APPLE)
+ set(CMAKE_FIND_FRAMEWORK LAST)
+ set(CMAKE_FIND_APPBUNDLE LAST)
+endif ()
+
# Proposal for C++ unit tests and sandboxes
option(SLIC3R_BUILD_SANDBOXES "Build development sandboxes" OFF)
option(SLIC3R_BUILD_TESTS "Build unit tests" ON)
@@ -160,6 +165,9 @@ if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
# Boost on Raspberry-Pi does not link to pthreads.
set(THREADS_PREFER_PTHREAD_FLAG ON)
find_package(Threads REQUIRED)
+
+ find_package(DBus REQUIRED)
+ include_directories(${DBUS_INCLUDE_DIRS})
endif()
if (CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUXX)
@@ -221,7 +229,7 @@ if(WIN32)
add_definitions(-D_USE_MATH_DEFINES -D_WIN32 -D_CRT_SECURE_NO_WARNINGS -D_SCL_SECURE_NO_WARNINGS)
if(MSVC)
# BOOST_ALL_NO_LIB: Avoid the automatic linking of Boost libraries on Windows. Rather rely on explicit linking.
- add_definitions(-DBOOST_ALL_NO_LIB -DBOOST_USE_WINAPI_VERSION=0x601 )
+ add_definitions(-DBOOST_ALL_NO_LIB -DBOOST_USE_WINAPI_VERSION=0x601 -DBOOST_SYSTEM_USE_UTF8 )
endif(MSVC)
endif(WIN32)
@@ -369,9 +377,9 @@ include_directories(BEFORE SYSTEM ${EIGEN3_INCLUDE_DIR})
# Find expat or use bundled version
# Always use the system libexpat on Linux.
-if (NOT SLIC3R_STATIC OR CMAKE_SYSTEM_NAME STREQUAL "Linux")
- find_package(EXPAT)
-endif ()
+
+find_package(EXPAT)
+
if (NOT EXPAT_FOUND)
add_library(expat STATIC
${LIBDIR}/expat/xmlparse.c
@@ -382,8 +390,10 @@ if (NOT EXPAT_FOUND)
set(EXPAT_INCLUDE_DIRS ${LIBDIR}/expat/)
set(EXPAT_LIBRARIES expat)
endif ()
-include_directories(${EXPAT_INCLUDE_DIRS})
+find_package(PNG REQUIRED)
+
+set(OpenGL_GL_PREFERENCE "LEGACY")
find_package(OpenGL REQUIRED)
# Find glew or use bundled version
@@ -500,9 +510,15 @@ endif()
if (WIN32)
install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${CMAKE_INSTALL_PREFIX}/resources")
elseif (SLIC3R_FHS)
+ # CMAKE_INSTALL_FULL_DATAROOTDIR: read-only architecture-independent data root (share)
set(SLIC3R_FHS_RESOURCES "${CMAKE_INSTALL_FULL_DATAROOTDIR}/PrusaSlicer")
install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${SLIC3R_FHS_RESOURCES}")
+ install(FILES src/platform/unix/PrusaSlicer.desktop DESTINATION ${SLIC3R_FHS_RESOURCES}/applications)
+ install(FILES src/platform/unix/PrusaGcodeviewer.desktop DESTINATION ${SLIC3R_FHS_RESOURCES}/applications)
else ()
+ install(FILES src/platform/unix/PrusaSlicer.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/resources/applications)
+ install(FILES src/platform/unix/PrusaGcodeviewer.desktop DESTINATION ${CMAKE_INSTALL_PREFIX}/resources/applications)
install(DIRECTORY "${SLIC3R_RESOURCES_DIR}/" DESTINATION "${CMAKE_INSTALL_PREFIX}/resources")
endif ()
+
configure_file(${LIBDIR}/platform/unix/fhs.hpp.in ${LIBDIR_BIN}/platform/unix/fhs.hpp)
diff --git a/PrusaSlicer.mo b/PrusaSlicer.mo
new file mode 100644
index 000000000..94853e146
--- /dev/null
+++ b/PrusaSlicer.mo
Binary files differ
diff --git a/README.md b/README.md
index 6fd1af4e2..2b93a47b0 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,7 @@ 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](https://github.com/Slic3r/Slic3r) by Alessandro Ranelucci and the RepRap community.
+PrusaSlicer is based on [Slic3r](https://github.com/Slic3r/Slic3r) by Alessandro Ranellucci and the RepRap community.
See the [project homepage](https://www.prusa3d.com/slic3r-prusa-edition/) and
the [documentation directory](doc/) for more information.
diff --git a/cmake/modules/FindDBus.cmake b/cmake/modules/FindDBus.cmake
new file mode 100644
index 000000000..1d0f29dd7
--- /dev/null
+++ b/cmake/modules/FindDBus.cmake
@@ -0,0 +1,59 @@
+# - Try to find DBus
+# Once done, this will define
+#
+# DBUS_FOUND - system has DBus
+# DBUS_INCLUDE_DIRS - the DBus include directories
+# DBUS_LIBRARIES - link these to use DBus
+#
+# Copyright (C) 2012 Raphael Kubo da Costa <rakuco@webkit.org>
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS
+# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+FIND_PACKAGE(PkgConfig)
+PKG_CHECK_MODULES(PC_DBUS QUIET dbus-1)
+
+FIND_LIBRARY(DBUS_LIBRARIES
+ NAMES dbus-1
+ HINTS ${PC_DBUS_LIBDIR}
+ ${PC_DBUS_LIBRARY_DIRS}
+)
+
+FIND_PATH(DBUS_INCLUDE_DIR
+ NAMES dbus/dbus.h
+ HINTS ${PC_DBUS_INCLUDEDIR}
+ ${PC_DBUS_INCLUDE_DIRS}
+)
+
+GET_FILENAME_COMPONENT(_DBUS_LIBRARY_DIR ${DBUS_LIBRARIES} PATH)
+FIND_PATH(DBUS_ARCH_INCLUDE_DIR
+ NAMES dbus/dbus-arch-deps.h
+ HINTS ${PC_DBUS_INCLUDEDIR}
+ ${PC_DBUS_INCLUDE_DIRS}
+ ${_DBUS_LIBRARY_DIR}
+ ${DBUS_INCLUDE_DIR}
+ PATH_SUFFIXES include
+)
+
+SET(DBUS_INCLUDE_DIRS ${DBUS_INCLUDE_DIR} ${DBUS_ARCH_INCLUDE_DIR})
+
+INCLUDE(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(DBUS REQUIRED_VARS DBUS_INCLUDE_DIRS DBUS_LIBRARIES) \ No newline at end of file
diff --git a/cmake/modules/FindGTK3.cmake b/cmake/modules/FindGTK3.cmake
new file mode 100644
index 000000000..9f62658d0
--- /dev/null
+++ b/cmake/modules/FindGTK3.cmake
@@ -0,0 +1,46 @@
+# - Try to find GTK+ 3
+# Once done, this will define
+#
+# GTK3_FOUND - system has GTK+ 3.
+# GTK3_INCLUDE_DIRS - the GTK+ 3. include directories
+# GTK3_LIBRARIES - link these to use GTK+ 3.
+#
+# Copyright (C) 2012 Raphael Kubo da Costa <rakuco@webkit.org>
+# Copyright (C) 2013 Igalia S.L.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER AND ITS CONTRIBUTORS ``AS
+# IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+# THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+# PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR ITS
+# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
+# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
+# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
+# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+find_package(PkgConfig)
+pkg_check_modules(GTK3 QUIET gtk+-3.0)
+set(VERSION_OK TRUE)
+if (GTK3_VERSION)
+if (GTK3_FIND_VERSION_EXACT)
+if (NOT("${GTK3_FIND_VERSION}" VERSION_EQUAL "${GTK3_VERSION}"))
+set(VERSION_OK FALSE)
+endif ()
+else ()
+if ("${GTK3_VERSION}" VERSION_LESS "${GTK3_FIND_VERSION}")
+set(VERSION_OK FALSE)
+endif ()
+endif ()
+endif ()
+include(FindPackageHandleStandardArgs)
+FIND_PACKAGE_HANDLE_STANDARD_ARGS(GTK3 DEFAULT_MSG GTK3_INCLUDE_DIRS GTK3_LIBRARIES VERSION_OK)
diff --git a/cmake/modules/FindOpenVDB.cmake b/cmake/modules/FindOpenVDB.cmake
index bddc346b9..02420fed8 100644
--- a/cmake/modules/FindOpenVDB.cmake
+++ b/cmake/modules/FindOpenVDB.cmake
@@ -234,7 +234,7 @@ foreach(COMPONENT ${OpenVDB_FIND_COMPONENTS})
if (_is_multi)
list(APPEND OpenVDB_LIB_COMPONENTS ${OpenVDB_${COMPONENT}_LIBRARY_RELEASE})
- if (MSVC OR OpenVDB_${COMPONENT}_LIBRARY_DEBUG)
+ if (OpenVDB_${COMPONENT}_LIBRARY_DEBUG)
list(APPEND OpenVDB_LIB_COMPONENTS ${OpenVDB_${COMPONENT}_LIBRARY_DEBUG})
endif ()
diff --git a/cmake/modules/PrecompiledHeader.cmake b/cmake/modules/PrecompiledHeader.cmake
index 2f62a7dbe..7ef80aacf 100644
--- a/cmake/modules/PrecompiledHeader.cmake
+++ b/cmake/modules/PrecompiledHeader.cmake
@@ -52,6 +52,10 @@
# CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
+
+# Use the new builtin CMake function if possible or fall back to the old one.
+if (CMAKE_VERSION VERSION_LESS 3.16)
+
include(CMakeParseArguments)
macro(combine_arguments _variable)
@@ -102,6 +106,10 @@ function(export_all_flags _filename)
endfunction()
function(add_precompiled_header _target _input)
+
+ message(STATUS "Adding precompiled header ${_input} to target ${_target} with legacy method. "
+ "Update your cmake instance to use the native PCH functions.")
+
cmake_parse_arguments(_PCH "FORCEINCLUDE" "SOURCE_CXX;SOURCE_C" "" ${ARGN})
get_filename_component(_input_we ${_input} NAME_WE)
@@ -241,3 +249,21 @@ function(add_precompiled_header _target _input)
endforeach()
endif(CMAKE_COMPILER_IS_GNUCXX)
endfunction()
+
+else ()
+
+function(add_precompiled_header _target _input)
+ message(STATUS "Adding precompiled header ${_input} to target ${_target}.")
+ target_precompile_headers(${_target} PRIVATE ${_input})
+
+ get_target_property(_sources ${_target} SOURCES)
+ list(FILTER _sources INCLUDE REGEX ".*\\.mm?")
+
+ if (_sources)
+ message(STATUS "PCH skipping sources: ${_sources}")
+ endif ()
+
+ set_source_files_properties(${_sources} PROPERTIES SKIP_PRECOMPILE_HEADERS ON)
+endfunction()
+
+endif (CMAKE_VERSION VERSION_LESS 3.16)
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..8a15bb8ac
--- /dev/null
+++ b/deps/CGAL/cgal/CGALConfigVersion.cmake
@@ -0,0 +1,25 @@
+# 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() \ No newline at end of file
diff --git a/deps/CMakeLists.txt b/deps/CMakeLists.txt
index 3935e38c3..718945828 100644
--- a/deps/CMakeLists.txt
+++ b/deps/CMakeLists.txt
@@ -34,7 +34,10 @@ endif ()
set(DESTDIR "${CMAKE_CURRENT_BINARY_DIR}/destdir" CACHE PATH "Destination directory")
option(DEP_DEBUG "Build debug variants (only applicable on Windows)" ON)
-option(DEP_WX_STABLE "Build against wxWidgets stable 3.0 as opposed to default 3.1 (Linux only)" OFF)
+
+if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ option(DEP_WX_GTK3 "Build wxWidgets against GTK3" OFF)
+endif()
# On developer machines, it can be enabled to speed up compilation and suppress warnings coming from IGL.
# FIXME:
@@ -126,50 +129,77 @@ else()
include("deps-linux.cmake")
endif()
+set(ZLIB_PKG "")
+if (NOT ZLIB_FOUND)
+ include(ZLIB/ZLIB.cmake)
+ set(ZLIB_PKG dep_ZLIB)
+endif ()
+set(PNG_PKG "")
+if (NOT PNG_FOUND)
+ include(PNG/PNG.cmake)
+ set(PNG_PKG dep_PNG)
+endif ()
+set(EXPAT_PKG "")
+if (NOT EXPAT_FOUND)
+ include(EXPAT/EXPAT.cmake)
+ set(EXPAT_PKG dep_EXPAT)
+endif ()
+
include(GLEW/GLEW.cmake)
include(OpenCSG/OpenCSG.cmake)
-
include(GMP/GMP.cmake)
include(MPFR/MPFR.cmake)
include(CGAL/CGAL.cmake)
+include(wxWidgets/wxWidgets.cmake)
-if (MSVC)
+if (NOT "${ZLIB_PKG}" STREQUAL "")
+ add_dependencies(dep_blosc ${ZLIB_PKG})
+ add_dependencies(dep_openexr ${ZLIB_PKG})
+endif ()
- add_custom_target(deps ALL
- DEPENDS
- dep_boost
- dep_tbb
- dep_libcurl
- dep_wxwidgets
- dep_gtest
- dep_cereal
- dep_nlopt
- # dep_qhull # Experimental
- dep_ZLIB # on Windows we still need zlib
- dep_openvdb
- dep_OpenCSG
- dep_CGAL
+set(_dep_list
+ dep_boost
+ dep_tbb
+ dep_libcurl
+ dep_wxWidgets
+ dep_gtest
+ dep_cereal
+ dep_nlopt
+ dep_openvdb
+ dep_OpenCSG
+ dep_CGAL
+ ${PNG_PKG}
+ ${ZLIB_PKG}
+ ${EXPAT_PKG}
)
-else()
-
- add_custom_target(deps ALL
- DEPENDS
- dep_boost
- dep_tbb
- dep_libcurl
- dep_wxwidgets
- dep_gtest
- dep_cereal
- dep_nlopt
- dep_qhull
- dep_openvdb
- dep_OpenCSG
- dep_CGAL
- # dep_libigl # Not working, static build has different Eigen
+if ("${CMAKE_SIZEOF_VOID_P}" STREQUAL "8")
+ # Patch the boost::polygon library with a custom one.
+ ExternalProject_Add(dep_boost_polygon
+ EXCLUDE_FROM_ALL ON
+ GIT_REPOSITORY "https://github.com/prusa3d/polygon"
+ GIT_TAG prusaslicer_gmp
+ DEPENDS dep_boost
+ CONFIGURE_COMMAND ""
+ BUILD_COMMAND ""
+ INSTALL_COMMAND ${CMAKE_COMMAND} -E copy_directory
+ "${CMAKE_CURRENT_BINARY_DIR}/dep_boost_polygon-prefix/src/dep_boost_polygon/include/boost/polygon"
+ "${DESTDIR}/usr/local/include/boost/polygon"
)
+ # Only override boost::Polygon Voronoi implementation with Vojtech's GMP hacks on 64bit platforms.
+ list(APPEND _dep_list "dep_boost_polygon")
+endif ()
+if (MSVC)
+ # Experimental
+ #list(APPEND _dep_list "dep_qhull")
+else()
+ list(APPEND _dep_list "dep_qhull")
+ # Not working, static build has different Eigen
+ #list(APPEND _dep_list "dep_libigl")
endif()
+add_custom_target(deps ALL DEPENDS ${_dep_list})
+
# Note: I'm not using any of the LOG_xxx options in ExternalProject_Add() commands
# because they seem to generate bogus build files (possibly a bug in ExternalProject).
diff --git a/deps/EXPAT/EXPAT.cmake b/deps/EXPAT/EXPAT.cmake
new file mode 100644
index 000000000..ed5eb220f
--- /dev/null
+++ b/deps/EXPAT/EXPAT.cmake
@@ -0,0 +1,9 @@
+prusaslicer_add_cmake_project(EXPAT
+ # GIT_REPOSITORY https://github.com/nigels-com/glew.git
+ # GIT_TAG 3a8eff7 # 2.1.0
+ SOURCE_DIR ${CMAKE_CURRENT_LIST_DIR}/expat
+)
+
+if (MSVC)
+ add_debug_dep(dep_EXPAT)
+endif ()
diff --git a/deps/EXPAT/expat/CMakeLists.txt b/deps/EXPAT/expat/CMakeLists.txt
new file mode 100644
index 000000000..fa54c098f
--- /dev/null
+++ b/deps/EXPAT/expat/CMakeLists.txt
@@ -0,0 +1,71 @@
+cmake_minimum_required(VERSION 3.0)
+
+project(EXPAT)
+
+if (BUILD_SHARED_LIBS AND MSVC)
+ set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON)
+endif()
+
+add_library(expat
+ xmlparse.c
+ xmlrole.c
+ xmltok.c
+)
+
+target_include_directories(expat PRIVATE ${PROJECT_SOURCE_DIR})
+
+include(GNUInstallDirs)
+
+install(
+ FILES
+ ${PROJECT_SOURCE_DIR}/expat.h
+ ${PROJECT_SOURCE_DIR}/expat_config.h
+ ${PROJECT_SOURCE_DIR}/expat_external.h
+ DESTINATION
+ ${CMAKE_INSTALL_INCLUDEDIR}
+)
+
+add_library(EXPAT INTERFACE)
+target_link_libraries(EXPAT INTERFACE expat)
+
+include(CMakePackageConfigHelpers)
+
+write_basic_package_version_file(
+ "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
+ VERSION 1.95
+ COMPATIBILITY AnyNewerVersion
+)
+
+install(TARGETS expat EXPAT
+ EXPORT ${PROJECT_NAME}Targets
+ RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
+ ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
+ INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
+)
+
+export(EXPORT ${PROJECT_NAME}Targets
+ FILE "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Targets.cmake"
+ NAMESPACE ${PROJECT_NAME}:: )
+
+set(ConfigPackageLocation ${CMAKE_INSTALL_LIBDIR}/cmake/${PROJECT_NAME})
+
+install(EXPORT ${PROJECT_NAME}Targets
+ FILE
+ "${PROJECT_NAME}Targets.cmake"
+ NAMESPACE
+ ${PROJECT_NAME}::
+ DESTINATION
+ ${ConfigPackageLocation}
+)
+
+configure_file(config.cmake.in ${PROJECT_NAME}Config.cmake @ONLY)
+
+install(
+ FILES
+ "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}Config.cmake"
+ "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_NAME}ConfigVersion.cmake"
+ DESTINATION
+ ${ConfigPackageLocation}
+)
+
diff --git a/deps/EXPAT/expat/COPYING b/deps/EXPAT/expat/COPYING
new file mode 100644
index 000000000..092c83bae
--- /dev/null
+++ b/deps/EXPAT/expat/COPYING
@@ -0,0 +1,21 @@
+Copyright (c) 1998-2000 Thai Open Source Software Center Ltd and Clark Cooper
+Copyright (c) 2001-2016 Expat maintainers
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+"Software"), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be included
+in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/deps/EXPAT/expat/README b/deps/EXPAT/expat/README
new file mode 100644
index 000000000..40873a6f8
--- /dev/null
+++ b/deps/EXPAT/expat/README
@@ -0,0 +1,146 @@
+Expat, Release 2.2.0, stripped and modified for inclusion into Slic3r.
+Only the library sources needed for static linking were left.
+
+The original README follows:
+---------------------------------------------------------------------
+
+
+
+ Expat, Release 2.2.0
+
+This is Expat, a C library for parsing XML, written by James Clark.
+Expat is a stream-oriented XML parser. This means that you register
+handlers with the parser before starting the parse. These handlers
+are called when the parser discovers the associated structures in the
+document being parsed. A start tag is an example of the kind of
+structures for which you may register handlers.
+
+Windows users should use the expat_win32bin package, which includes
+both precompiled libraries and executables, and source code for
+developers.
+
+Expat is free software. You may copy, distribute, and modify it under
+the terms of the License contained in the file COPYING distributed
+with this package. This license is the same as the MIT/X Consortium
+license.
+
+Versions of Expat that have an odd minor version (the middle number in
+the release above), are development releases and should be considered
+as beta software. Releases with even minor version numbers are
+intended to be production grade software.
+
+If you are building Expat from a check-out from the CVS repository,
+you need to run a script that generates the configure script using the
+GNU autoconf and libtool tools. To do this, you need to have
+autoconf 2.58 or newer. Run the script like this:
+
+ ./buildconf.sh
+
+Once this has been done, follow the same instructions as for building
+from a source distribution.
+
+To build Expat from a source distribution, you first run the
+configuration shell script in the top level distribution directory:
+
+ ./configure
+
+There are many options which you may provide to configure (which you
+can discover by running configure with the --help option). But the
+one of most interest is the one that sets the installation directory.
+By default, the configure script will set things up to install
+libexpat into /usr/local/lib, expat.h into /usr/local/include, and
+xmlwf into /usr/local/bin. If, for example, you'd prefer to install
+into /home/me/mystuff/lib, /home/me/mystuff/include, and
+/home/me/mystuff/bin, you can tell configure about that with:
+
+ ./configure --prefix=/home/me/mystuff
+
+Another interesting option is to enable 64-bit integer support for
+line and column numbers and the over-all byte index:
+
+ ./configure CPPFLAGS=-DXML_LARGE_SIZE
+
+However, such a modification would be a breaking change to the ABI
+and is therefore not recommended for general use - e.g. as part of
+a Linux distribution - but rather for builds with special requirements.
+
+After running the configure script, the "make" command will build
+things and "make install" will install things into their proper
+location. Have a look at the "Makefile" to learn about additional
+"make" options. Note that you need to have write permission into
+the directories into which things will be installed.
+
+If you are interested in building Expat to provide document
+information in UTF-16 encoding rather than the default UTF-8, follow
+these instructions (after having run "make distclean"):
+
+ 1. For UTF-16 output as unsigned short (and version/error
+ strings as char), run:
+
+ ./configure CPPFLAGS=-DXML_UNICODE
+
+ For UTF-16 output as wchar_t (incl. version/error strings),
+ run:
+
+ ./configure CFLAGS="-g -O2 -fshort-wchar" \
+ CPPFLAGS=-DXML_UNICODE_WCHAR_T
+
+ 2. Edit the MakeFile, changing:
+
+ LIBRARY = libexpat.la
+
+ to:
+
+ LIBRARY = libexpatw.la
+
+ (Note the additional "w" in the library name.)
+
+ 3. Run "make buildlib" (which builds the library only).
+ Or, to save step 2, run "make buildlib LIBRARY=libexpatw.la".
+
+ 4. Run "make installlib" (which installs the library only).
+ Or, if step 2 was omitted, run "make installlib LIBRARY=libexpatw.la".
+
+Using DESTDIR or INSTALL_ROOT is enabled, with INSTALL_ROOT being the default
+value for DESTDIR, and the rest of the make file using only DESTDIR.
+It works as follows:
+ $ make install DESTDIR=/path/to/image
+overrides the in-makefile set DESTDIR, while both
+ $ INSTALL_ROOT=/path/to/image make install
+ $ make install INSTALL_ROOT=/path/to/image
+use DESTDIR=$(INSTALL_ROOT), even if DESTDIR eventually is defined in the
+environment, because variable-setting priority is
+1) commandline
+2) in-makefile
+3) environment
+
+Note: This only applies to the Expat library itself, building UTF-16 versions
+of xmlwf and the tests is currently not supported.
+
+Note for Solaris users: The "ar" command is usually located in
+"/usr/ccs/bin", which is not in the default PATH. You will need to
+add this to your path for the "make" command, and probably also switch
+to GNU make (the "make" found in /usr/ccs/bin does not seem to work
+properly -- apparently it does not understand .PHONY directives). If
+you're using ksh or bash, use this command to build:
+
+ PATH=/usr/ccs/bin:$PATH make
+
+When using Expat with a project using autoconf for configuration, you
+can use the probing macro in conftools/expat.m4 to determine how to
+include Expat. See the comments at the top of that file for more
+information.
+
+A reference manual is available in the file doc/reference.html in this
+distribution.
+
+The homepage for this project is http://www.libexpat.org/. There
+are links there to connect you to the bug reports page. If you need
+to report a bug when you don't have access to a browser, you may also
+send a bug report by email to expat-bugs@mail.libexpat.org.
+
+Discussion related to the direction of future expat development takes
+place on expat-discuss@mail.libexpat.org. Archives of this list and
+other Expat-related lists may be found at:
+
+ http://mail.libexpat.org/mailman/listinfo/
diff --git a/deps/EXPAT/expat/ascii.h b/deps/EXPAT/expat/ascii.h
new file mode 100644
index 000000000..d10530b09
--- /dev/null
+++ b/deps/EXPAT/expat/ascii.h
@@ -0,0 +1,92 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+ See the file COPYING for copying permission.
+*/
+
+#define ASCII_A 0x41
+#define ASCII_B 0x42
+#define ASCII_C 0x43
+#define ASCII_D 0x44
+#define ASCII_E 0x45
+#define ASCII_F 0x46
+#define ASCII_G 0x47
+#define ASCII_H 0x48
+#define ASCII_I 0x49
+#define ASCII_J 0x4A
+#define ASCII_K 0x4B
+#define ASCII_L 0x4C
+#define ASCII_M 0x4D
+#define ASCII_N 0x4E
+#define ASCII_O 0x4F
+#define ASCII_P 0x50
+#define ASCII_Q 0x51
+#define ASCII_R 0x52
+#define ASCII_S 0x53
+#define ASCII_T 0x54
+#define ASCII_U 0x55
+#define ASCII_V 0x56
+#define ASCII_W 0x57
+#define ASCII_X 0x58
+#define ASCII_Y 0x59
+#define ASCII_Z 0x5A
+
+#define ASCII_a 0x61
+#define ASCII_b 0x62
+#define ASCII_c 0x63
+#define ASCII_d 0x64
+#define ASCII_e 0x65
+#define ASCII_f 0x66
+#define ASCII_g 0x67
+#define ASCII_h 0x68
+#define ASCII_i 0x69
+#define ASCII_j 0x6A
+#define ASCII_k 0x6B
+#define ASCII_l 0x6C
+#define ASCII_m 0x6D
+#define ASCII_n 0x6E
+#define ASCII_o 0x6F
+#define ASCII_p 0x70
+#define ASCII_q 0x71
+#define ASCII_r 0x72
+#define ASCII_s 0x73
+#define ASCII_t 0x74
+#define ASCII_u 0x75
+#define ASCII_v 0x76
+#define ASCII_w 0x77
+#define ASCII_x 0x78
+#define ASCII_y 0x79
+#define ASCII_z 0x7A
+
+#define ASCII_0 0x30
+#define ASCII_1 0x31
+#define ASCII_2 0x32
+#define ASCII_3 0x33
+#define ASCII_4 0x34
+#define ASCII_5 0x35
+#define ASCII_6 0x36
+#define ASCII_7 0x37
+#define ASCII_8 0x38
+#define ASCII_9 0x39
+
+#define ASCII_TAB 0x09
+#define ASCII_SPACE 0x20
+#define ASCII_EXCL 0x21
+#define ASCII_QUOT 0x22
+#define ASCII_AMP 0x26
+#define ASCII_APOS 0x27
+#define ASCII_MINUS 0x2D
+#define ASCII_PERIOD 0x2E
+#define ASCII_COLON 0x3A
+#define ASCII_SEMI 0x3B
+#define ASCII_LT 0x3C
+#define ASCII_EQUALS 0x3D
+#define ASCII_GT 0x3E
+#define ASCII_LSQB 0x5B
+#define ASCII_RSQB 0x5D
+#define ASCII_UNDERSCORE 0x5F
+#define ASCII_LPAREN 0x28
+#define ASCII_RPAREN 0x29
+#define ASCII_FF 0x0C
+#define ASCII_SLASH 0x2F
+#define ASCII_HASH 0x23
+#define ASCII_PIPE 0x7C
+#define ASCII_COMMA 0x2C
diff --git a/deps/EXPAT/expat/asciitab.h b/deps/EXPAT/expat/asciitab.h
new file mode 100644
index 000000000..79a15c28c
--- /dev/null
+++ b/deps/EXPAT/expat/asciitab.h
@@ -0,0 +1,36 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+ See the file COPYING for copying permission.
+*/
+
+/* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
+/* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
+/* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML,
+/* 0x0C */ BT_NONXML, BT_CR, BT_NONXML, BT_NONXML,
+/* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
+/* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
+/* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
+/* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
+/* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM,
+/* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS,
+/* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS,
+/* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL,
+/* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT,
+/* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT,
+/* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI,
+/* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST,
+/* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX,
+/* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT,
+/* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB,
+/* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT,
+/* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX,
+/* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT,
+/* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER,
+/* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER,
diff --git a/deps/EXPAT/expat/config.cmake.in b/deps/EXPAT/expat/config.cmake.in
new file mode 100644
index 000000000..8edb5bbbd
--- /dev/null
+++ b/deps/EXPAT/expat/config.cmake.in
@@ -0,0 +1,4 @@
+include(${CMAKE_CURRENT_LIST_DIR}/EXPATTargets.cmake)
+set(EXPAT_LIBRARIES EXPAT::expat)
+set(EXPAT_INCLUDE_DIRS ${_IMPORT_PREFIX}/${CMAKE_INSTALL_INCLUDEDIR})
+
diff --git a/deps/EXPAT/expat/expat.h b/deps/EXPAT/expat/expat.h
new file mode 100644
index 000000000..086e24b39
--- /dev/null
+++ b/deps/EXPAT/expat/expat.h
@@ -0,0 +1,1048 @@
+/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
+ See the file COPYING for copying permission.
+*/
+
+#ifndef Expat_INCLUDED
+#define Expat_INCLUDED 1
+
+#ifdef __VMS
+/* 0 1 2 3 0 1 2 3
+ 1234567890123456789012345678901 1234567890123456789012345678901 */
+#define XML_SetProcessingInstructionHandler XML_SetProcessingInstrHandler
+#define XML_SetUnparsedEntityDeclHandler XML_SetUnparsedEntDeclHandler
+#define XML_SetStartNamespaceDeclHandler XML_SetStartNamespcDeclHandler
+#define XML_SetExternalEntityRefHandlerArg XML_SetExternalEntRefHandlerArg
+#endif
+
+#include <stdlib.h>
+#include "expat_external.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct XML_ParserStruct;
+typedef struct XML_ParserStruct *XML_Parser;
+
+/* Should this be defined using stdbool.h when C99 is available? */
+typedef unsigned char XML_Bool;
+#define XML_TRUE ((XML_Bool) 1)
+#define XML_FALSE ((XML_Bool) 0)
+
+/* The XML_Status enum gives the possible return values for several
+ API functions. The preprocessor #defines are included so this
+ stanza can be added to code that still needs to support older
+ versions of Expat 1.95.x:
+
+ #ifndef XML_STATUS_OK
+ #define XML_STATUS_OK 1
+ #define XML_STATUS_ERROR 0
+ #endif
+
+ Otherwise, the #define hackery is quite ugly and would have been
+ dropped.
+*/
+enum XML_Status {
+ XML_STATUS_ERROR = 0,
+#define XML_STATUS_ERROR XML_STATUS_ERROR
+ XML_STATUS_OK = 1,
+#define XML_STATUS_OK XML_STATUS_OK
+ XML_STATUS_SUSPENDED = 2
+#define XML_STATUS_SUSPENDED XML_STATUS_SUSPENDED
+};
+
+enum XML_Error {
+ XML_ERROR_NONE,
+ XML_ERROR_NO_MEMORY,
+ XML_ERROR_SYNTAX,
+ XML_ERROR_NO_ELEMENTS,
+ XML_ERROR_INVALID_TOKEN,
+ XML_ERROR_UNCLOSED_TOKEN,
+ XML_ERROR_PARTIAL_CHAR,
+ XML_ERROR_TAG_MISMATCH,
+ XML_ERROR_DUPLICATE_ATTRIBUTE,
+ XML_ERROR_JUNK_AFTER_DOC_ELEMENT,
+ XML_ERROR_PARAM_ENTITY_REF,
+ XML_ERROR_UNDEFINED_ENTITY,
+ XML_ERROR_RECURSIVE_ENTITY_REF,
+ XML_ERROR_ASYNC_ENTITY,
+ XML_ERROR_BAD_CHAR_REF,
+ XML_ERROR_BINARY_ENTITY_REF,
+ XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF,
+ XML_ERROR_MISPLACED_XML_PI,
+ XML_ERROR_UNKNOWN_ENCODING,
+ XML_ERROR_INCORRECT_ENCODING,
+ XML_ERROR_UNCLOSED_CDATA_SECTION,
+ XML_ERROR_EXTERNAL_ENTITY_HANDLING,
+ XML_ERROR_NOT_STANDALONE,
+ XML_ERROR_UNEXPECTED_STATE,
+ XML_ERROR_ENTITY_DECLARED_IN_PE,
+ XML_ERROR_FEATURE_REQUIRES_XML_DTD,
+ XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING,
+ /* Added in 1.95.7. */
+ XML_ERROR_UNBOUND_PREFIX,
+ /* Added in 1.95.8. */
+ XML_ERROR_UNDECLARING_PREFIX,
+ XML_ERROR_INCOMPLETE_PE,
+ XML_ERROR_XML_DECL,
+ XML_ERROR_TEXT_DECL,
+ XML_ERROR_PUBLICID,
+ XML_ERROR_SUSPENDED,
+ XML_ERROR_NOT_SUSPENDED,
+ XML_ERROR_ABORTED,
+ XML_ERROR_FINISHED,
+ XML_ERROR_SUSPEND_PE,
+ /* Added in 2.0. */
+ XML_ERROR_RESERVED_PREFIX_XML,
+ XML_ERROR_RESERVED_PREFIX_XMLNS,
+ XML_ERROR_RESERVED_NAMESPACE_URI
+};
+
+enum XML_Content_Type {
+ XML_CTYPE_EMPTY = 1,
+ XML_CTYPE_ANY,
+ XML_CTYPE_MIXED,
+ XML_CTYPE_NAME,
+ XML_CTYPE_CHOICE,
+ XML_CTYPE_SEQ
+};
+
+enum XML_Content_Quant {
+ XML_CQUANT_NONE,
+ XML_CQUANT_OPT,
+ XML_CQUANT_REP,
+ XML_CQUANT_PLUS
+};
+
+/* If type == XML_CTYPE_EMPTY or XML_CTYPE_ANY, then quant will be
+ XML_CQUANT_NONE, and the other fields will be zero or NULL.
+ If type == XML_CTYPE_MIXED, then quant will be NONE or REP and
+ numchildren will contain number of elements that may be mixed in
+ and children point to an array of XML_Content cells that will be
+ all of XML_CTYPE_NAME type with no quantification.
+
+ If type == XML_CTYPE_NAME, then the name points to the name, and
+ the numchildren field will be zero and children will be NULL. The
+ quant fields indicates any quantifiers placed on the name.
+
+ CHOICE and SEQ will have name NULL, the number of children in
+ numchildren and children will point, recursively, to an array
+ of XML_Content cells.
+
+ The EMPTY, ANY, and MIXED types will only occur at top level.
+*/
+
+typedef struct XML_cp XML_Content;
+
+struct XML_cp {
+ enum XML_Content_Type type;
+ enum XML_Content_Quant quant;
+ XML_Char * name;
+ unsigned int numchildren;
+ XML_Content * children;
+};
+
+
+/* This is called for an element declaration. See above for
+ description of the model argument. It's the caller's responsibility
+ to free model when finished with it.
+*/
+typedef void (XMLCALL *XML_ElementDeclHandler) (void *userData,
+ const XML_Char *name,
+ XML_Content *model);
+
+XMLPARSEAPI(void)
+XML_SetElementDeclHandler(XML_Parser parser,
+ XML_ElementDeclHandler eldecl);
+
+/* The Attlist declaration handler is called for *each* attribute. So
+ a single Attlist declaration with multiple attributes declared will
+ generate multiple calls to this handler. The "default" parameter
+ may be NULL in the case of the "#IMPLIED" or "#REQUIRED"
+ keyword. The "isrequired" parameter will be true and the default
+ value will be NULL in the case of "#REQUIRED". If "isrequired" is
+ true and default is non-NULL, then this is a "#FIXED" default.
+*/
+typedef void (XMLCALL *XML_AttlistDeclHandler) (
+ void *userData,
+ const XML_Char *elname,
+ const XML_Char *attname,
+ const XML_Char *att_type,
+ const XML_Char *dflt,
+ int isrequired);
+
+XMLPARSEAPI(void)
+XML_SetAttlistDeclHandler(XML_Parser parser,
+ XML_AttlistDeclHandler attdecl);
+
+/* The XML declaration handler is called for *both* XML declarations
+ and text declarations. The way to distinguish is that the version
+ parameter will be NULL for text declarations. The encoding
+ parameter may be NULL for XML declarations. The standalone
+ parameter will be -1, 0, or 1 indicating respectively that there
+ was no standalone parameter in the declaration, that it was given
+ as no, or that it was given as yes.
+*/
+typedef void (XMLCALL *XML_XmlDeclHandler) (void *userData,
+ const XML_Char *version,
+ const XML_Char *encoding,
+ int standalone);
+
+XMLPARSEAPI(void)
+XML_SetXmlDeclHandler(XML_Parser parser,
+ XML_XmlDeclHandler xmldecl);
+
+
+typedef struct {
+ void *(*malloc_fcn)(size_t size);
+ void *(*realloc_fcn)(void *ptr, size_t size);
+ void (*free_fcn)(void *ptr);
+} XML_Memory_Handling_Suite;
+
+/* Constructs a new parser; encoding is the encoding specified by the
+ external protocol or NULL if there is none specified.
+*/
+XMLPARSEAPI(XML_Parser)
+XML_ParserCreate(const XML_Char *encoding);
+
+/* Constructs a new parser and namespace processor. Element type
+ names and attribute names that belong to a namespace will be
+ expanded; unprefixed attribute names are never expanded; unprefixed
+ element type names are expanded only if there is a default
+ namespace. The expanded name is the concatenation of the namespace
+ URI, the namespace separator character, and the local part of the
+ name. If the namespace separator is '\0' then the namespace URI
+ and the local part will be concatenated without any separator.
+ It is a programming error to use the separator '\0' with namespace
+ triplets (see XML_SetReturnNSTriplet).
+*/
+XMLPARSEAPI(XML_Parser)
+XML_ParserCreateNS(const XML_Char *encoding, XML_Char namespaceSeparator);
+
+
+/* Constructs a new parser using the memory management suite referred to
+ by memsuite. If memsuite is NULL, then use the standard library memory
+ suite. If namespaceSeparator is non-NULL it creates a parser with
+ namespace processing as described above. The character pointed at
+ will serve as the namespace separator.
+
+ All further memory operations used for the created parser will come from
+ the given suite.
+*/
+XMLPARSEAPI(XML_Parser)
+XML_ParserCreate_MM(const XML_Char *encoding,
+ const XML_Memory_Handling_Suite *memsuite,
+ const XML_Char *namespaceSeparator);
+
+/* Prepare a parser object to be re-used. This is particularly
+ valuable when memory allocation overhead is disproportionatly high,
+ such as when a large number of small documnents need to be parsed.
+ All handlers are cleared from the parser, except for the
+ unknownEncodingHandler. The parser's external state is re-initialized
+ except for the values of ns and ns_triplets.
+
+ Added in Expat 1.95.3.
+*/
+XMLPARSEAPI(XML_Bool)
+XML_ParserReset(XML_Parser parser, const XML_Char *encoding);
+
+/* atts is array of name/value pairs, terminated by 0;
+ names and values are 0 terminated.
+*/
+typedef void (XMLCALL *XML_StartElementHandler) (void *userData,
+ const XML_Char *name,
+ const XML_Char **atts);
+
+typedef void (XMLCALL *XML_EndElementHandler) (void *userData,
+ const XML_Char *name);
+
+
+/* s is not 0 terminated. */
+typedef void (XMLCALL *XML_CharacterDataHandler) (void *userData,
+ const XML_Char *s,
+ int len);
+
+/* target and data are 0 terminated */
+typedef void (XMLCALL *XML_ProcessingInstructionHandler) (
+ void *userData,
+ const XML_Char *target,
+ const XML_Char *data);
+
+/* data is 0 terminated */
+typedef void (XMLCALL *XML_CommentHandler) (void *userData,
+ const XML_Char *data);
+
+typedef void (XMLCALL *XML_StartCdataSectionHandler) (void *userData);
+typedef void (XMLCALL *XML_EndCdataSectionHandler) (void *userData);
+
+/* This is called for any characters in the XML document for which
+ there is no applicable handler. This includes both characters that
+ are part of markup which is of a kind that is not reported
+ (comments, markup declarations), or characters that are part of a
+ construct which could be reported but for which no handler has been
+ supplied. The characters are passed exactly as they were in the XML
+ document except that they will be encoded in UTF-8 or UTF-16.
+ Line boundaries are not normalized. Note that a byte order mark
+ character is not passed to the default handler. There are no
+ guarantees about how characters are divided between calls to the
+ default handler: for example, a comment might be split between
+ multiple calls.
+*/
+typedef void (XMLCALL *XML_DefaultHandler) (void *userData,
+ const XML_Char *s,
+ int len);
+
+/* This is called for the start of the DOCTYPE declaration, before
+ any DTD or internal subset is parsed.
+*/
+typedef void (XMLCALL *XML_StartDoctypeDeclHandler) (
+ void *userData,
+ const XML_Char *doctypeName,
+ const XML_Char *sysid,
+ const XML_Char *pubid,
+ int has_internal_subset);
+
+/* This is called for the start of the DOCTYPE declaration when the
+ closing > is encountered, but after processing any external
+ subset.
+*/
+typedef void (XMLCALL *XML_EndDoctypeDeclHandler)(void *userData);
+
+/* This is called for entity declarations. The is_parameter_entity
+ argument will be non-zero if the entity is a parameter entity, zero
+ otherwise.
+
+ For internal entities (<!ENTITY foo "bar">), value will
+ be non-NULL and systemId, publicID, and notationName will be NULL.
+ The value string is NOT nul-terminated; the length is provided in
+ the value_length argument. Since it is legal to have zero-length
+ values, do not use this argument to test for internal entities.
+
+ For external entities, value will be NULL and systemId will be
+ non-NULL. The publicId argument will be NULL unless a public
+ identifier was provided. The notationName argument will have a
+ non-NULL value only for unparsed entity declarations.
+
+ Note that is_parameter_entity can't be changed to XML_Bool, since
+ that would break binary compatibility.
+*/
+typedef void (XMLCALL *XML_EntityDeclHandler) (
+ void *userData,
+ const XML_Char *entityName,
+ int is_parameter_entity,
+ const XML_Char *value,
+ int value_length,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId,
+ const XML_Char *notationName);
+
+XMLPARSEAPI(void)
+XML_SetEntityDeclHandler(XML_Parser parser,
+ XML_EntityDeclHandler handler);
+
+/* OBSOLETE -- OBSOLETE -- OBSOLETE
+ This handler has been superseded by the EntityDeclHandler above.
+ It is provided here for backward compatibility.
+
+ This is called for a declaration of an unparsed (NDATA) entity.
+ The base argument is whatever was set by XML_SetBase. The
+ entityName, systemId and notationName arguments will never be
+ NULL. The other arguments may be.
+*/
+typedef void (XMLCALL *XML_UnparsedEntityDeclHandler) (
+ void *userData,
+ const XML_Char *entityName,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId,
+ const XML_Char *notationName);
+
+/* This is called for a declaration of notation. The base argument is
+ whatever was set by XML_SetBase. The notationName will never be
+ NULL. The other arguments can be.
+*/
+typedef void (XMLCALL *XML_NotationDeclHandler) (
+ void *userData,
+ const XML_Char *notationName,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+/* When namespace processing is enabled, these are called once for
+ each namespace declaration. The call to the start and end element
+ handlers occur between the calls to the start and end namespace
+ declaration handlers. For an xmlns attribute, prefix will be
+ NULL. For an xmlns="" attribute, uri will be NULL.
+*/
+typedef void (XMLCALL *XML_StartNamespaceDeclHandler) (
+ void *userData,
+ const XML_Char *prefix,
+ const XML_Char *uri);
+
+typedef void (XMLCALL *XML_EndNamespaceDeclHandler) (
+ void *userData,
+ const XML_Char *prefix);
+
+/* This is called if the document is not standalone, that is, it has an
+ external subset or a reference to a parameter entity, but does not
+ have standalone="yes". If this handler returns XML_STATUS_ERROR,
+ then processing will not continue, and the parser will return a
+ XML_ERROR_NOT_STANDALONE error.
+ If parameter entity parsing is enabled, then in addition to the
+ conditions above this handler will only be called if the referenced
+ entity was actually read.
+*/
+typedef int (XMLCALL *XML_NotStandaloneHandler) (void *userData);
+
+/* This is called for a reference to an external parsed general
+ entity. The referenced entity is not automatically parsed. The
+ application can parse it immediately or later using
+ XML_ExternalEntityParserCreate.
+
+ The parser argument is the parser parsing the entity containing the
+ reference; it can be passed as the parser argument to
+ XML_ExternalEntityParserCreate. The systemId argument is the
+ system identifier as specified in the entity declaration; it will
+ not be NULL.
+
+ The base argument is the system identifier that should be used as
+ the base for resolving systemId if systemId was relative; this is
+ set by XML_SetBase; it may be NULL.
+
+ The publicId argument is the public identifier as specified in the
+ entity declaration, or NULL if none was specified; the whitespace
+ in the public identifier will have been normalized as required by
+ the XML spec.
+
+ The context argument specifies the parsing context in the format
+ expected by the context argument to XML_ExternalEntityParserCreate;
+ context is valid only until the handler returns, so if the
+ referenced entity is to be parsed later, it must be copied.
+ context is NULL only when the entity is a parameter entity.
+
+ The handler should return XML_STATUS_ERROR if processing should not
+ continue because of a fatal error in the handling of the external
+ entity. In this case the calling parser will return an
+ XML_ERROR_EXTERNAL_ENTITY_HANDLING error.
+
+ Note that unlike other handlers the first argument is the parser,
+ not userData.
+*/
+typedef int (XMLCALL *XML_ExternalEntityRefHandler) (
+ XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *base,
+ const XML_Char *systemId,
+ const XML_Char *publicId);
+
+/* This is called in two situations:
+ 1) An entity reference is encountered for which no declaration
+ has been read *and* this is not an error.
+ 2) An internal entity reference is read, but not expanded, because
+ XML_SetDefaultHandler has been called.
+ Note: skipped parameter entities in declarations and skipped general
+ entities in attribute values cannot be reported, because
+ the event would be out of sync with the reporting of the
+ declarations or attribute values
+*/
+typedef void (XMLCALL *XML_SkippedEntityHandler) (
+ void *userData,
+ const XML_Char *entityName,
+ int is_parameter_entity);
+
+/* This structure is filled in by the XML_UnknownEncodingHandler to
+ provide information to the parser about encodings that are unknown
+ to the parser.
+
+ The map[b] member gives information about byte sequences whose
+ first byte is b.
+
+ If map[b] is c where c is >= 0, then b by itself encodes the
+ Unicode scalar value c.
+
+ If map[b] is -1, then the byte sequence is malformed.
+
+ If map[b] is -n, where n >= 2, then b is the first byte of an
+ n-byte sequence that encodes a single Unicode scalar value.
+
+ The data member will be passed as the first argument to the convert
+ function.
+
+ The convert function is used to convert multibyte sequences; s will
+ point to a n-byte sequence where map[(unsigned char)*s] == -n. The
+ convert function must return the Unicode scalar value represented
+ by this byte sequence or -1 if the byte sequence is malformed.
+
+ The convert function may be NULL if the encoding is a single-byte
+ encoding, that is if map[b] >= -1 for all bytes b.
+
+ When the parser is finished with the encoding, then if release is
+ not NULL, it will call release passing it the data member; once
+ release has been called, the convert function will not be called
+ again.
+
+ Expat places certain restrictions on the encodings that are supported
+ using this mechanism.
+
+ 1. Every ASCII character that can appear in a well-formed XML document,
+ other than the characters
+
+ $@\^`{}~
+
+ must be represented by a single byte, and that byte must be the
+ same byte that represents that character in ASCII.
+
+ 2. No character may require more than 4 bytes to encode.
+
+ 3. All characters encoded must have Unicode scalar values <=
+ 0xFFFF, (i.e., characters that would be encoded by surrogates in
+ UTF-16 are not allowed). Note that this restriction doesn't
+ apply to the built-in support for UTF-8 and UTF-16.
+
+ 4. No Unicode character may be encoded by more than one distinct
+ sequence of bytes.
+*/
+typedef struct {
+ int map[256];
+ void *data;
+ int (XMLCALL *convert)(void *data, const char *s);
+ void (XMLCALL *release)(void *data);
+} XML_Encoding;
+
+/* This is called for an encoding that is unknown to the parser.
+
+ The encodingHandlerData argument is that which was passed as the
+ second argument to XML_SetUnknownEncodingHandler.
+
+ The name argument gives the name of the encoding as specified in
+ the encoding declaration.
+
+ If the callback can provide information about the encoding, it must
+ fill in the XML_Encoding structure, and return XML_STATUS_OK.
+ Otherwise it must return XML_STATUS_ERROR.
+
+ If info does not describe a suitable encoding, then the parser will
+ return an XML_UNKNOWN_ENCODING error.
+*/
+typedef int (XMLCALL *XML_UnknownEncodingHandler) (
+ void *encodingHandlerData,
+ const XML_Char *name,
+ XML_Encoding *info);
+
+XMLPARSEAPI(void)
+XML_SetElementHandler(XML_Parser parser,
+ XML_StartElementHandler start,
+ XML_EndElementHandler end);
+
+XMLPARSEAPI(void)
+XML_SetStartElementHandler(XML_Parser parser,
+ XML_StartElementHandler handler);
+
+XMLPARSEAPI(void)
+XML_SetEndElementHandler(XML_Parser parser,
+ XML_EndElementHandler handler);
+
+XMLPARSEAPI(void)
+XML_SetCharacterDataHandler(XML_Parser parser,
+ XML_CharacterDataHandler handler);
+
+XMLPARSEAPI(void)
+XML_SetProcessingInstructionHandler(XML_Parser parser,
+ XML_ProcessingInstructionHandler handler);
+XMLPARSEAPI(void)
+XML_SetCommentHandler(XML_Parser parser,
+ XML_CommentHandler handler);
+
+XMLPARSEAPI(void)
+XML_SetCdataSectionHandler(XML_Parser parser,
+ XML_StartCdataSectionHandler start,
+ XML_EndCdataSectionHandler end);
+
+XMLPARSEAPI(void)
+XML_SetStartCdataSectionHandler(XML_Parser parser,
+ XML_StartCdataSectionHandler start);
+
+XMLPARSEAPI(void)
+XML_SetEndCdataSectionHandler(XML_Parser parser,
+ XML_EndCdataSectionHandler end);
+
+/* This sets the default handler and also inhibits expansion of
+ internal entities. These entity references will be passed to the
+ default handler, or to the skipped entity handler, if one is set.
+*/
+XMLPARSEAPI(void)
+XML_SetDefaultHandler(XML_Parser parser,
+ XML_DefaultHandler handler);
+
+/* This sets the default handler but does not inhibit expansion of
+ internal entities. The entity reference will not be passed to the
+ default handler.
+*/
+XMLPARSEAPI(void)
+XML_SetDefaultHandlerExpand(XML_Parser parser,
+ XML_DefaultHandler handler);
+
+XMLPARSEAPI(void)
+XML_SetDoctypeDeclHandler(XML_Parser parser,
+ XML_StartDoctypeDeclHandler start,
+ XML_EndDoctypeDeclHandler end);
+
+XMLPARSEAPI(void)
+XML_SetStartDoctypeDeclHandler(XML_Parser parser,
+ XML_StartDoctypeDeclHandler start);
+
+XMLPARSEAPI(void)
+XML_SetEndDoctypeDeclHandler(XML_Parser parser,
+ XML_EndDoctypeDeclHandler end);
+
+XMLPARSEAPI(void)
+XML_SetUnparsedEntityDeclHandler(XML_Parser parser,
+ XML_UnparsedEntityDeclHandler handler);
+
+XMLPARSEAPI(void)
+XML_SetNotationDeclHandler(XML_Parser parser,
+ XML_NotationDeclHandler handler);
+
+XMLPARSEAPI(void)
+XML_SetNamespaceDeclHandler(XML_Parser parser,
+ XML_StartNamespaceDeclHandler start,
+ XML_EndNamespaceDeclHandler end);
+
+XMLPARSEAPI(void)
+XML_SetStartNamespaceDeclHandler(XML_Parser parser,
+ XML_StartNamespaceDeclHandler start);
+
+XMLPARSEAPI(void)
+XML_SetEndNamespaceDeclHandler(XML_Parser parser,
+ XML_EndNamespaceDeclHandler end);
+
+XMLPARSEAPI(void)
+XML_SetNotStandaloneHandler(XML_Parser parser,
+ XML_NotStandaloneHandler handler);
+
+XMLPARSEAPI(void)
+XML_SetExternalEntityRefHandler(XML_Parser parser,
+ XML_ExternalEntityRefHandler handler);
+
+/* If a non-NULL value for arg is specified here, then it will be
+ passed as the first argument to the external entity ref handler
+ instead of the parser object.
+*/
+XMLPARSEAPI(void)
+XML_SetExternalEntityRefHandlerArg(XML_Parser parser,
+ void *arg);
+
+XMLPARSEAPI(void)
+XML_SetSkippedEntityHandler(XML_Parser parser,
+ XML_SkippedEntityHandler handler);
+
+XMLPARSEAPI(void)
+XML_SetUnknownEncodingHandler(XML_Parser parser,
+ XML_UnknownEncodingHandler handler,
+ void *encodingHandlerData);
+
+/* This can be called within a handler for a start element, end
+ element, processing instruction or character data. It causes the
+ corresponding markup to be passed to the default handler.
+*/
+XMLPARSEAPI(void)
+XML_DefaultCurrent(XML_Parser parser);
+
+/* If do_nst is non-zero, and namespace processing is in effect, and
+ a name has a prefix (i.e. an explicit namespace qualifier) then
+ that name is returned as a triplet in a single string separated by
+ the separator character specified when the parser was created: URI
+ + sep + local_name + sep + prefix.
+
+ If do_nst is zero, then namespace information is returned in the
+ default manner (URI + sep + local_name) whether or not the name
+ has a prefix.
+
+ Note: Calling XML_SetReturnNSTriplet after XML_Parse or
+ XML_ParseBuffer has no effect.
+*/
+
+XMLPARSEAPI(void)
+XML_SetReturnNSTriplet(XML_Parser parser, int do_nst);
+
+/* This value is passed as the userData argument to callbacks. */
+XMLPARSEAPI(void)
+XML_SetUserData(XML_Parser parser, void *userData);
+
+/* Returns the last value set by XML_SetUserData or NULL. */
+#define XML_GetUserData(parser) (*(void **)(parser))
+
+/* This is equivalent to supplying an encoding argument to
+ XML_ParserCreate. On success XML_SetEncoding returns non-zero,
+ zero otherwise.
+ Note: Calling XML_SetEncoding after XML_Parse or XML_ParseBuffer
+ has no effect and returns XML_STATUS_ERROR.
+*/
+XMLPARSEAPI(enum XML_Status)
+XML_SetEncoding(XML_Parser parser, const XML_Char *encoding);
+
+/* If this function is called, then the parser will be passed as the
+ first argument to callbacks instead of userData. The userData will
+ still be accessible using XML_GetUserData.
+*/
+XMLPARSEAPI(void)
+XML_UseParserAsHandlerArg(XML_Parser parser);
+
+/* If useDTD == XML_TRUE is passed to this function, then the parser
+ will assume that there is an external subset, even if none is
+ specified in the document. In such a case the parser will call the
+ externalEntityRefHandler with a value of NULL for the systemId
+ argument (the publicId and context arguments will be NULL as well).
+ Note: For the purpose of checking WFC: Entity Declared, passing
+ useDTD == XML_TRUE will make the parser behave as if the document
+ had a DTD with an external subset.
+ Note: If this function is called, then this must be done before
+ the first call to XML_Parse or XML_ParseBuffer, since it will
+ have no effect after that. Returns
+ XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING.
+ Note: If the document does not have a DOCTYPE declaration at all,
+ then startDoctypeDeclHandler and endDoctypeDeclHandler will not
+ be called, despite an external subset being parsed.
+ Note: If XML_DTD is not defined when Expat is compiled, returns
+ XML_ERROR_FEATURE_REQUIRES_XML_DTD.
+*/
+XMLPARSEAPI(enum XML_Error)
+XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD);
+
+
+/* Sets the base to be used for resolving relative URIs in system
+ identifiers in declarations. Resolving relative identifiers is
+ left to the application: this value will be passed through as the
+ base argument to the XML_ExternalEntityRefHandler,
+ XML_NotationDeclHandler and XML_UnparsedEntityDeclHandler. The base
+ argument will be copied. Returns XML_STATUS_ERROR if out of memory,
+ XML_STATUS_OK otherwise.
+*/
+XMLPARSEAPI(enum XML_Status)
+XML_SetBase(XML_Parser parser, const XML_Char *base);
+
+XMLPARSEAPI(const XML_Char *)
+XML_GetBase(XML_Parser parser);
+
+/* Returns the number of the attribute/value pairs passed in last call
+ to the XML_StartElementHandler that were specified in the start-tag
+ rather than defaulted. Each attribute/value pair counts as 2; thus
+ this correspondds to an index into the atts array passed to the
+ XML_StartElementHandler.
+*/
+XMLPARSEAPI(int)
+XML_GetSpecifiedAttributeCount(XML_Parser parser);
+
+/* Returns the index of the ID attribute passed in the last call to
+ XML_StartElementHandler, or -1 if there is no ID attribute. Each
+ attribute/value pair counts as 2; thus this correspondds to an
+ index into the atts array passed to the XML_StartElementHandler.
+*/
+XMLPARSEAPI(int)
+XML_GetIdAttributeIndex(XML_Parser parser);
+
+#ifdef XML_ATTR_INFO
+/* Source file byte offsets for the start and end of attribute names and values.
+ The value indices are exclusive of surrounding quotes; thus in a UTF-8 source
+ file an attribute value of "blah" will yield:
+ info->valueEnd - info->valueStart = 4 bytes.
+*/
+typedef struct {
+ XML_Index nameStart; /* Offset to beginning of the attribute name. */
+ XML_Index nameEnd; /* Offset after the attribute name's last byte. */
+ XML_Index valueStart; /* Offset to beginning of the attribute value. */
+ XML_Index valueEnd; /* Offset after the attribute value's last byte. */
+} XML_AttrInfo;
+
+/* Returns an array of XML_AttrInfo structures for the attribute/value pairs
+ passed in last call to the XML_StartElementHandler that were specified
+ in the start-tag rather than defaulted. Each attribute/value pair counts
+ as 1; thus the number of entries in the array is
+ XML_GetSpecifiedAttributeCount(parser) / 2.
+*/
+XMLPARSEAPI(const XML_AttrInfo *)
+XML_GetAttributeInfo(XML_Parser parser);
+#endif
+
+/* Parses some input. Returns XML_STATUS_ERROR if a fatal error is
+ detected. The last call to XML_Parse must have isFinal true; len
+ may be zero for this call (or any other).
+
+ Though the return values for these functions has always been
+ described as a Boolean value, the implementation, at least for the
+ 1.95.x series, has always returned exactly one of the XML_Status
+ values.
+*/
+XMLPARSEAPI(enum XML_Status)
+XML_Parse(XML_Parser parser, const char *s, int len, int isFinal);
+
+XMLPARSEAPI(void *)
+XML_GetBuffer(XML_Parser parser, int len);
+
+XMLPARSEAPI(enum XML_Status)
+XML_ParseBuffer(XML_Parser parser, int len, int isFinal);
+
+/* Stops parsing, causing XML_Parse() or XML_ParseBuffer() to return.
+ Must be called from within a call-back handler, except when aborting
+ (resumable = 0) an already suspended parser. Some call-backs may
+ still follow because they would otherwise get lost. Examples:
+ - endElementHandler() for empty elements when stopped in
+ startElementHandler(),
+ - endNameSpaceDeclHandler() when stopped in endElementHandler(),
+ and possibly others.
+
+ Can be called from most handlers, including DTD related call-backs,
+ except when parsing an external parameter entity and resumable != 0.
+ Returns XML_STATUS_OK when successful, XML_STATUS_ERROR otherwise.
+ Possible error codes:
+ - XML_ERROR_SUSPENDED: when suspending an already suspended parser.
+ - XML_ERROR_FINISHED: when the parser has already finished.
+ - XML_ERROR_SUSPEND_PE: when suspending while parsing an external PE.
+
+ When resumable != 0 (true) then parsing is suspended, that is,
+ XML_Parse() and XML_ParseBuffer() return XML_STATUS_SUSPENDED.
+ Otherwise, parsing is aborted, that is, XML_Parse() and XML_ParseBuffer()
+ return XML_STATUS_ERROR with error code XML_ERROR_ABORTED.
+
+ *Note*:
+ This will be applied to the current parser instance only, that is, if
+ there is a parent parser then it will continue parsing when the
+ externalEntityRefHandler() returns. It is up to the implementation of
+ the externalEntityRefHandler() to call XML_StopParser() on the parent
+ parser (recursively), if one wants to stop parsing altogether.
+
+ When suspended, parsing can be resumed by calling XML_ResumeParser().
+*/
+XMLPARSEAPI(enum XML_Status)
+XML_StopParser(XML_Parser parser, XML_Bool resumable);
+
+/* Resumes parsing after it has been suspended with XML_StopParser().
+ Must not be called from within a handler call-back. Returns same
+ status codes as XML_Parse() or XML_ParseBuffer().
+ Additional error code XML_ERROR_NOT_SUSPENDED possible.
+
+ *Note*:
+ This must be called on the most deeply nested child parser instance
+ first, and on its parent parser only after the child parser has finished,
+ to be applied recursively until the document entity's parser is restarted.
+ That is, the parent parser will not resume by itself and it is up to the
+ application to call XML_ResumeParser() on it at the appropriate moment.
+*/
+XMLPARSEAPI(enum XML_Status)
+XML_ResumeParser(XML_Parser parser);
+
+enum XML_Parsing {
+ XML_INITIALIZED,
+ XML_PARSING,
+ XML_FINISHED,
+ XML_SUSPENDED
+};
+
+typedef struct {
+ enum XML_Parsing parsing;
+ XML_Bool finalBuffer;
+} XML_ParsingStatus;
+
+/* Returns status of parser with respect to being initialized, parsing,
+ finished, or suspended and processing the final buffer.
+ XXX XML_Parse() and XML_ParseBuffer() should return XML_ParsingStatus,
+ XXX with XML_FINISHED_OK or XML_FINISHED_ERROR replacing XML_FINISHED
+*/
+XMLPARSEAPI(void)
+XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status);
+
+/* Creates an XML_Parser object that can parse an external general
+ entity; context is a '\0'-terminated string specifying the parse
+ context; encoding is a '\0'-terminated string giving the name of
+ the externally specified encoding, or NULL if there is no
+ externally specified encoding. The context string consists of a
+ sequence of tokens separated by formfeeds (\f); a token consisting
+ of a name specifies that the general entity of the name is open; a
+ token of the form prefix=uri specifies the namespace for a
+ particular prefix; a token of the form =uri specifies the default
+ namespace. This can be called at any point after the first call to
+ an ExternalEntityRefHandler so longer as the parser has not yet
+ been freed. The new parser is completely independent and may
+ safely be used in a separate thread. The handlers and userData are
+ initialized from the parser argument. Returns NULL if out of memory.
+ Otherwise returns a new XML_Parser object.
+*/
+XMLPARSEAPI(XML_Parser)
+XML_ExternalEntityParserCreate(XML_Parser parser,
+ const XML_Char *context,
+ const XML_Char *encoding);
+
+enum XML_ParamEntityParsing {
+ XML_PARAM_ENTITY_PARSING_NEVER,
+ XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE,
+ XML_PARAM_ENTITY_PARSING_ALWAYS
+};
+
+/* Controls parsing of parameter entities (including the external DTD
+ subset). If parsing of parameter entities is enabled, then
+ references to external parameter entities (including the external
+ DTD subset) will be passed to the handler set with
+ XML_SetExternalEntityRefHandler. The context passed will be 0.
+
+ Unlike external general entities, external parameter entities can
+ only be parsed synchronously. If the external parameter entity is
+ to be parsed, it must be parsed during the call to the external
+ entity ref handler: the complete sequence of
+ XML_ExternalEntityParserCreate, XML_Parse/XML_ParseBuffer and
+ XML_ParserFree calls must be made during this call. After
+ XML_ExternalEntityParserCreate has been called to create the parser
+ for the external parameter entity (context must be 0 for this
+ call), it is illegal to make any calls on the old parser until
+ XML_ParserFree has been called on the newly created parser.
+ If the library has been compiled without support for parameter
+ entity parsing (ie without XML_DTD being defined), then
+ XML_SetParamEntityParsing will return 0 if parsing of parameter
+ entities is requested; otherwise it will return non-zero.
+ Note: If XML_SetParamEntityParsing is called after XML_Parse or
+ XML_ParseBuffer, then it has no effect and will always return 0.
+*/
+XMLPARSEAPI(int)
+XML_SetParamEntityParsing(XML_Parser parser,
+ enum XML_ParamEntityParsing parsing);
+
+/* Sets the hash salt to use for internal hash calculations.
+ Helps in preventing DoS attacks based on predicting hash
+ function behavior. This must be called before parsing is started.
+ Returns 1 if successful, 0 when called after parsing has started.
+*/
+XMLPARSEAPI(int)
+XML_SetHashSalt(XML_Parser parser,
+ unsigned long hash_salt);
+
+/* If XML_Parse or XML_ParseBuffer have returned XML_STATUS_ERROR, then
+ XML_GetErrorCode returns information about the error.
+*/
+XMLPARSEAPI(enum XML_Error)
+XML_GetErrorCode(XML_Parser parser);
+
+/* These functions return information about the current parse
+ location. They may be called from any callback called to report
+ some parse event; in this case the location is the location of the
+ first of the sequence of characters that generated the event. When
+ called from callbacks generated by declarations in the document
+ prologue, the location identified isn't as neatly defined, but will
+ be within the relevant markup. When called outside of the callback
+ functions, the position indicated will be just past the last parse
+ event (regardless of whether there was an associated callback).
+
+ They may also be called after returning from a call to XML_Parse
+ or XML_ParseBuffer. If the return value is XML_STATUS_ERROR then
+ the location is the location of the character at which the error
+ was detected; otherwise the location is the location of the last
+ parse event, as described above.
+*/
+XMLPARSEAPI(XML_Size) XML_GetCurrentLineNumber(XML_Parser parser);
+XMLPARSEAPI(XML_Size) XML_GetCurrentColumnNumber(XML_Parser parser);
+XMLPARSEAPI(XML_Index) XML_GetCurrentByteIndex(XML_Parser parser);
+
+/* Return the number of bytes in the current event.
+ Returns 0 if the event is in an internal entity.
+*/
+XMLPARSEAPI(int)
+XML_GetCurrentByteCount(XML_Parser parser);
+
+/* If XML_CONTEXT_BYTES is defined, returns the input buffer, sets
+ the integer pointed to by offset to the offset within this buffer
+ of the current parse position, and sets the integer pointed to by size
+ to the size of this buffer (the number of input bytes). Otherwise
+ returns a NULL pointer. Also returns a NULL pointer if a parse isn't
+ active.
+
+ NOTE: The character pointer returned should not be used outside
+ the handler that makes the call.
+*/
+XMLPARSEAPI(const char *)
+XML_GetInputContext(XML_Parser parser,
+ int *offset,
+ int *size);
+
+/* For backwards compatibility with previous versions. */
+#define XML_GetErrorLineNumber XML_GetCurrentLineNumber
+#define XML_GetErrorColumnNumber XML_GetCurrentColumnNumber
+#define XML_GetErrorByteIndex XML_GetCurrentByteIndex
+
+/* Frees the content model passed to the element declaration handler */
+XMLPARSEAPI(void)
+XML_FreeContentModel(XML_Parser parser, XML_Content *model);
+
+/* Exposing the memory handling functions used in Expat */
+XMLPARSEAPI(void *)
+XML_ATTR_MALLOC
+XML_ATTR_ALLOC_SIZE(2)
+XML_MemMalloc(XML_Parser parser, size_t size);
+
+XMLPARSEAPI(void *)
+XML_ATTR_ALLOC_SIZE(3)
+XML_MemRealloc(XML_Parser parser, void *ptr, size_t size);
+
+XMLPARSEAPI(void)
+XML_MemFree(XML_Parser parser, void *ptr);
+
+/* Frees memory used by the parser. */
+XMLPARSEAPI(void)
+XML_ParserFree(XML_Parser parser);
+
+/* Returns a string describing the error. */
+XMLPARSEAPI(const XML_LChar *)
+XML_ErrorString(enum XML_Error code);
+
+/* Return a string containing the version number of this expat */
+XMLPARSEAPI(const XML_LChar *)
+XML_ExpatVersion(void);
+
+typedef struct {
+ int major;
+ int minor;
+ int micro;
+} XML_Expat_Version;
+
+/* Return an XML_Expat_Version structure containing numeric version
+ number information for this version of expat.
+*/
+XMLPARSEAPI(XML_Expat_Version)
+XML_ExpatVersionInfo(void);
+
+/* Added in Expat 1.95.5. */
+enum XML_FeatureEnum {
+ XML_FEATURE_END = 0,
+ XML_FEATURE_UNICODE,
+ XML_FEATURE_UNICODE_WCHAR_T,
+ XML_FEATURE_DTD,
+ XML_FEATURE_CONTEXT_BYTES,
+ XML_FEATURE_MIN_SIZE,
+ XML_FEATURE_SIZEOF_XML_CHAR,
+ XML_FEATURE_SIZEOF_XML_LCHAR,
+ XML_FEATURE_NS,
+ XML_FEATURE_LARGE_SIZE,
+ XML_FEATURE_ATTR_INFO
+ /* Additional features must be added to the end of this enum. */
+};
+
+typedef struct {
+ enum XML_FeatureEnum feature;
+ const XML_LChar *name;
+ long int value;
+} XML_Feature;
+
+XMLPARSEAPI(const XML_Feature *)
+XML_GetFeatureList(void);
+
+
+/* Expat follows the semantic versioning convention.
+ See http://semver.org.
+*/
+#define XML_MAJOR_VERSION 2
+#define XML_MINOR_VERSION 2
+#define XML_MICRO_VERSION 0
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* not Expat_INCLUDED */
diff --git a/deps/EXPAT/expat/expat_config.h b/deps/EXPAT/expat/expat_config.h
new file mode 100644
index 000000000..8aa80db0d
--- /dev/null
+++ b/deps/EXPAT/expat/expat_config.h
@@ -0,0 +1,33 @@
+/*================================================================
+** Copyright 2000, Clark Cooper
+** All rights reserved.
+**
+** This is free software. You are permitted to copy, distribute, or modify
+** it under the terms of the MIT/X license (contained in the COPYING file
+** with this distribution.)
+*/
+
+#ifndef EXPATCONFIG_H
+#define EXPATCONFIG_H
+
+#include <memory.h>
+#include <string.h>
+
+#define XML_NS 1
+#define XML_DTD 1
+#define XML_CONTEXT_BYTES 1024
+
+/* we will assume all Windows platforms are little endian */
+#define BYTEORDER 1234
+
+/* Windows has memmove() available. */
+#define HAVE_MEMMOVE
+
+#ifdef WIN32
+ #define WIN32_LEAN_AND_MEAN
+ #include <windows.h>
+ #undef WIN32_LEAN_AND_MEAN
+#else
+#endif
+
+#endif /* ifndef EXPATCONFIG_H */
diff --git a/deps/EXPAT/expat/expat_external.h b/deps/EXPAT/expat/expat_external.h
new file mode 100644
index 000000000..56cd84367
--- /dev/null
+++ b/deps/EXPAT/expat/expat_external.h
@@ -0,0 +1,129 @@
+/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
+ See the file COPYING for copying permission.
+*/
+
+#ifndef Expat_External_INCLUDED
+#define Expat_External_INCLUDED 1
+
+/* External API definitions */
+
+#if defined(_MSC_EXTENSIONS) && !defined(__BEOS__) && !defined(__CYGWIN__)
+#define XML_USE_MSC_EXTENSIONS 1
+#endif
+
+/* Expat tries very hard to make the API boundary very specifically
+ defined. There are two macros defined to control this boundary;
+ each of these can be defined before including this header to
+ achieve some different behavior, but doing so it not recommended or
+ tested frequently.
+
+ XMLCALL - The calling convention to use for all calls across the
+ "library boundary." This will default to cdecl, and
+ try really hard to tell the compiler that's what we
+ want.
+
+ XMLIMPORT - Whatever magic is needed to note that a function is
+ to be imported from a dynamically loaded library
+ (.dll, .so, or .sl, depending on your platform).
+
+ The XMLCALL macro was added in Expat 1.95.7. The only one which is
+ expected to be directly useful in client code is XMLCALL.
+
+ Note that on at least some Unix versions, the Expat library must be
+ compiled with the cdecl calling convention as the default since
+ system headers may assume the cdecl convention.
+*/
+#ifndef XMLCALL
+#if defined(_MSC_VER)
+#define XMLCALL __cdecl
+#elif defined(__GNUC__) && defined(__i386) && !defined(__INTEL_COMPILER)
+#define XMLCALL __attribute__((cdecl))
+#else
+/* For any platform which uses this definition and supports more than
+ one calling convention, we need to extend this definition to
+ declare the convention used on that platform, if it's possible to
+ do so.
+
+ If this is the case for your platform, please file a bug report
+ with information on how to identify your platform via the C
+ pre-processor and how to specify the same calling convention as the
+ platform's malloc() implementation.
+*/
+#define XMLCALL
+#endif
+#endif /* not defined XMLCALL */
+
+
+#if !defined(XML_STATIC) && !defined(XMLIMPORT)
+#ifndef XML_BUILDING_EXPAT
+/* using Expat from an application */
+
+#ifdef XML_USE_MSC_EXTENSIONS
+// #define XMLIMPORT __declspec(dllimport)
+#endif
+
+#endif
+#endif /* not defined XML_STATIC */
+
+#if !defined(XMLIMPORT) && defined(__GNUC__) && (__GNUC__ >= 4)
+#define XMLIMPORT __attribute__ ((visibility ("default")))
+#endif
+
+/* If we didn't define it above, define it away: */
+#ifndef XMLIMPORT
+#define XMLIMPORT
+#endif
+
+#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 96))
+#define XML_ATTR_MALLOC __attribute__((__malloc__))
+#else
+#define XML_ATTR_MALLOC
+#endif
+
+#if defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3))
+#define XML_ATTR_ALLOC_SIZE(x) __attribute__((__alloc_size__(x)))
+#else
+#define XML_ATTR_ALLOC_SIZE(x)
+#endif
+
+#define XMLPARSEAPI(type) XMLIMPORT type XMLCALL
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef XML_UNICODE_WCHAR_T
+#define XML_UNICODE
+#endif
+
+#ifdef XML_UNICODE /* Information is UTF-16 encoded. */
+#ifdef XML_UNICODE_WCHAR_T
+typedef wchar_t XML_Char;
+typedef wchar_t XML_LChar;
+#else
+typedef unsigned short XML_Char;
+typedef char XML_LChar;
+#endif /* XML_UNICODE_WCHAR_T */
+#else /* Information is UTF-8 encoded. */
+typedef char XML_Char;
+typedef char XML_LChar;
+#endif /* XML_UNICODE */
+
+#ifdef XML_LARGE_SIZE /* Use large integers for file/stream positions. */
+#if defined(XML_USE_MSC_EXTENSIONS) && _MSC_VER < 1400
+typedef __int64 XML_Index;
+typedef unsigned __int64 XML_Size;
+#else
+typedef long long XML_Index;
+typedef unsigned long long XML_Size;
+#endif
+#else
+typedef long XML_Index;
+typedef unsigned long XML_Size;
+#endif /* XML_LARGE_SIZE */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* not Expat_External_INCLUDED */
diff --git a/deps/EXPAT/expat/iasciitab.h b/deps/EXPAT/expat/iasciitab.h
new file mode 100644
index 000000000..24a1d5ccc
--- /dev/null
+++ b/deps/EXPAT/expat/iasciitab.h
@@ -0,0 +1,37 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+ See the file COPYING for copying permission.
+*/
+
+/* Like asciitab.h, except that 0xD has code BT_S rather than BT_CR */
+/* 0x00 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
+/* 0x04 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
+/* 0x08 */ BT_NONXML, BT_S, BT_LF, BT_NONXML,
+/* 0x0C */ BT_NONXML, BT_S, BT_NONXML, BT_NONXML,
+/* 0x10 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
+/* 0x14 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
+/* 0x18 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
+/* 0x1C */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
+/* 0x20 */ BT_S, BT_EXCL, BT_QUOT, BT_NUM,
+/* 0x24 */ BT_OTHER, BT_PERCNT, BT_AMP, BT_APOS,
+/* 0x28 */ BT_LPAR, BT_RPAR, BT_AST, BT_PLUS,
+/* 0x2C */ BT_COMMA, BT_MINUS, BT_NAME, BT_SOL,
+/* 0x30 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT,
+/* 0x34 */ BT_DIGIT, BT_DIGIT, BT_DIGIT, BT_DIGIT,
+/* 0x38 */ BT_DIGIT, BT_DIGIT, BT_COLON, BT_SEMI,
+/* 0x3C */ BT_LT, BT_EQUALS, BT_GT, BT_QUEST,
+/* 0x40 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX,
+/* 0x44 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT,
+/* 0x48 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0x4C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0x50 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0x54 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0x58 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_LSQB,
+/* 0x5C */ BT_OTHER, BT_RSQB, BT_OTHER, BT_NMSTRT,
+/* 0x60 */ BT_OTHER, BT_HEX, BT_HEX, BT_HEX,
+/* 0x64 */ BT_HEX, BT_HEX, BT_HEX, BT_NMSTRT,
+/* 0x68 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0x6C */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0x70 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0x74 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0x78 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER,
+/* 0x7C */ BT_VERBAR, BT_OTHER, BT_OTHER, BT_OTHER,
diff --git a/deps/EXPAT/expat/internal.h b/deps/EXPAT/expat/internal.h
new file mode 100644
index 000000000..94cb98e15
--- /dev/null
+++ b/deps/EXPAT/expat/internal.h
@@ -0,0 +1,95 @@
+/* internal.h
+
+ Internal definitions used by Expat. This is not needed to compile
+ client code.
+
+ The following calling convention macros are defined for frequently
+ called functions:
+
+ FASTCALL - Used for those internal functions that have a simple
+ body and a low number of arguments and local variables.
+
+ PTRCALL - Used for functions called though function pointers.
+
+ PTRFASTCALL - Like PTRCALL, but for low number of arguments.
+
+ inline - Used for selected internal functions for which inlining
+ may improve performance on some platforms.
+
+ Note: Use of these macros is based on judgement, not hard rules,
+ and therefore subject to change.
+*/
+
+#if defined(__GNUC__) && defined(__i386__) && !defined(__MINGW32__)
+/* We'll use this version by default only where we know it helps.
+
+ regparm() generates warnings on Solaris boxes. See SF bug #692878.
+
+ Instability reported with egcs on a RedHat Linux 7.3.
+ Let's comment out:
+ #define FASTCALL __attribute__((stdcall, regparm(3)))
+ and let's try this:
+*/
+#define FASTCALL __attribute__((regparm(3)))
+#define PTRFASTCALL __attribute__((regparm(3)))
+#endif
+
+/* Using __fastcall seems to have an unexpected negative effect under
+ MS VC++, especially for function pointers, so we won't use it for
+ now on that platform. It may be reconsidered for a future release
+ if it can be made more effective.
+ Likely reason: __fastcall on Windows is like stdcall, therefore
+ the compiler cannot perform stack optimizations for call clusters.
+*/
+
+/* Make sure all of these are defined if they aren't already. */
+
+#ifndef FASTCALL
+#define FASTCALL
+#endif
+
+#ifndef PTRCALL
+#define PTRCALL
+#endif
+
+#ifndef PTRFASTCALL
+#define PTRFASTCALL
+#endif
+
+#ifndef XML_MIN_SIZE
+#if !defined(__cplusplus) && !defined(inline)
+#ifdef __GNUC__
+#define inline __inline
+#endif /* __GNUC__ */
+#endif
+#endif /* XML_MIN_SIZE */
+
+#ifdef __cplusplus
+#define inline inline
+#else
+#ifndef inline
+#define inline
+#endif
+#endif
+
+#ifndef UNUSED_P
+# ifdef __GNUC__
+# define UNUSED_P(p) UNUSED_ ## p __attribute__((__unused__))
+# else
+# define UNUSED_P(p) UNUSED_ ## p
+# endif
+#endif
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+void
+align_limit_to_full_utf8_characters(const char * from, const char ** fromLimRef);
+
+
+#ifdef __cplusplus
+}
+#endif
diff --git a/deps/EXPAT/expat/latin1tab.h b/deps/EXPAT/expat/latin1tab.h
new file mode 100644
index 000000000..53c25d76b
--- /dev/null
+++ b/deps/EXPAT/expat/latin1tab.h
@@ -0,0 +1,36 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+ See the file COPYING for copying permission.
+*/
+
+/* 0x80 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,
+/* 0x84 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,
+/* 0x88 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,
+/* 0x8C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,
+/* 0x90 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,
+/* 0x94 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,
+/* 0x98 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,
+/* 0x9C */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,
+/* 0xA0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,
+/* 0xA4 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,
+/* 0xA8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER,
+/* 0xAC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,
+/* 0xB0 */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,
+/* 0xB4 */ BT_OTHER, BT_NMSTRT, BT_OTHER, BT_NAME,
+/* 0xB8 */ BT_OTHER, BT_OTHER, BT_NMSTRT, BT_OTHER,
+/* 0xBC */ BT_OTHER, BT_OTHER, BT_OTHER, BT_OTHER,
+/* 0xC0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0xC4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0xC8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0xCC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0xD0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0xD4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER,
+/* 0xD8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0xDC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0xE0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0xE4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0xE8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0xEC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0xF0 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0xF4 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_OTHER,
+/* 0xF8 */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
+/* 0xFC */ BT_NMSTRT, BT_NMSTRT, BT_NMSTRT, BT_NMSTRT,
diff --git a/deps/EXPAT/expat/nametab.h b/deps/EXPAT/expat/nametab.h
new file mode 100644
index 000000000..b05e62c77
--- /dev/null
+++ b/deps/EXPAT/expat/nametab.h
@@ -0,0 +1,150 @@
+static const unsigned namingBitmap[] = {
+0x00000000, 0x00000000, 0x00000000, 0x00000000,
+0x00000000, 0x00000000, 0x00000000, 0x00000000,
+0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+0x00000000, 0x04000000, 0x87FFFFFE, 0x07FFFFFE,
+0x00000000, 0x00000000, 0xFF7FFFFF, 0xFF7FFFFF,
+0xFFFFFFFF, 0x7FF3FFFF, 0xFFFFFDFE, 0x7FFFFFFF,
+0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFE00F, 0xFC31FFFF,
+0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF,
+0xFFFFFFFF, 0xF80001FF, 0x00000003, 0x00000000,
+0x00000000, 0x00000000, 0x00000000, 0x00000000,
+0xFFFFD740, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD,
+0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF,
+0xFFFF0003, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF,
+0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE,
+0x0000007F, 0x00000000, 0xFFFF0000, 0x000707FF,
+0x00000000, 0x07FFFFFE, 0x000007FE, 0xFFFE0000,
+0xFFFFFFFF, 0x7CFFFFFF, 0x002F7FFF, 0x00000060,
+0xFFFFFFE0, 0x23FFFFFF, 0xFF000000, 0x00000003,
+0xFFF99FE0, 0x03C5FDFF, 0xB0000000, 0x00030003,
+0xFFF987E0, 0x036DFDFF, 0x5E000000, 0x001C0000,
+0xFFFBAFE0, 0x23EDFDFF, 0x00000000, 0x00000001,
+0xFFF99FE0, 0x23CDFDFF, 0xB0000000, 0x00000003,
+0xD63DC7E0, 0x03BFC718, 0x00000000, 0x00000000,
+0xFFFDDFE0, 0x03EFFDFF, 0x00000000, 0x00000003,
+0xFFFDDFE0, 0x03EFFDFF, 0x40000000, 0x00000003,
+0xFFFDDFE0, 0x03FFFDFF, 0x00000000, 0x00000003,
+0x00000000, 0x00000000, 0x00000000, 0x00000000,
+0xFFFFFFFE, 0x000D7FFF, 0x0000003F, 0x00000000,
+0xFEF02596, 0x200D6CAE, 0x0000001F, 0x00000000,
+0x00000000, 0x00000000, 0xFFFFFEFF, 0x000003FF,
+0x00000000, 0x00000000, 0x00000000, 0x00000000,
+0x00000000, 0x00000000, 0x00000000, 0x00000000,
+0x00000000, 0xFFFFFFFF, 0xFFFF003F, 0x007FFFFF,
+0x0007DAED, 0x50000000, 0x82315001, 0x002C62AB,
+0x40000000, 0xF580C900, 0x00000007, 0x02010800,
+0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+0x0FFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0x03FFFFFF,
+0x3F3FFFFF, 0xFFFFFFFF, 0xAAFF3F3F, 0x3FFFFFFF,
+0xFFFFFFFF, 0x5FDFFFFF, 0x0FCF1FDC, 0x1FDC1FFF,
+0x00000000, 0x00004C40, 0x00000000, 0x00000000,
+0x00000007, 0x00000000, 0x00000000, 0x00000000,
+0x00000080, 0x000003FE, 0xFFFFFFFE, 0xFFFFFFFF,
+0x001FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x07FFFFFF,
+0xFFFFFFE0, 0x00001FFF, 0x00000000, 0x00000000,
+0x00000000, 0x00000000, 0x00000000, 0x00000000,
+0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+0xFFFFFFFF, 0x0000003F, 0x00000000, 0x00000000,
+0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF, 0xFFFFFFFF,
+0xFFFFFFFF, 0x0000000F, 0x00000000, 0x00000000,
+0x00000000, 0x07FF6000, 0x87FFFFFE, 0x07FFFFFE,
+0x00000000, 0x00800000, 0xFF7FFFFF, 0xFF7FFFFF,
+0x00FFFFFF, 0x00000000, 0xFFFF0000, 0xFFFFFFFF,
+0xFFFFFFFF, 0xF80001FF, 0x00030003, 0x00000000,
+0xFFFFFFFF, 0xFFFFFFFF, 0x0000003F, 0x00000003,
+0xFFFFD7C0, 0xFFFFFFFB, 0x547F7FFF, 0x000FFFFD,
+0xFFFFDFFE, 0xFFFFFFFF, 0xDFFEFFFF, 0xFFFFFFFF,
+0xFFFF007B, 0xFFFFFFFF, 0xFFFF199F, 0x033FCFFF,
+0x00000000, 0xFFFE0000, 0x027FFFFF, 0xFFFFFFFE,
+0xFFFE007F, 0xBBFFFFFB, 0xFFFF0016, 0x000707FF,
+0x00000000, 0x07FFFFFE, 0x0007FFFF, 0xFFFF03FF,
+0xFFFFFFFF, 0x7CFFFFFF, 0xFFEF7FFF, 0x03FF3DFF,
+0xFFFFFFEE, 0xF3FFFFFF, 0xFF1E3FFF, 0x0000FFCF,
+0xFFF99FEE, 0xD3C5FDFF, 0xB080399F, 0x0003FFCF,
+0xFFF987E4, 0xD36DFDFF, 0x5E003987, 0x001FFFC0,
+0xFFFBAFEE, 0xF3EDFDFF, 0x00003BBF, 0x0000FFC1,
+0xFFF99FEE, 0xF3CDFDFF, 0xB0C0398F, 0x0000FFC3,
+0xD63DC7EC, 0xC3BFC718, 0x00803DC7, 0x0000FF80,
+0xFFFDDFEE, 0xC3EFFDFF, 0x00603DDF, 0x0000FFC3,
+0xFFFDDFEC, 0xC3EFFDFF, 0x40603DDF, 0x0000FFC3,
+0xFFFDDFEC, 0xC3FFFDFF, 0x00803DCF, 0x0000FFC3,
+0x00000000, 0x00000000, 0x00000000, 0x00000000,
+0xFFFFFFFE, 0x07FF7FFF, 0x03FF7FFF, 0x00000000,
+0xFEF02596, 0x3BFF6CAE, 0x03FF3F5F, 0x00000000,
+0x03000000, 0xC2A003FF, 0xFFFFFEFF, 0xFFFE03FF,
+0xFEBF0FDF, 0x02FE3FFF, 0x00000000, 0x00000000,
+0x00000000, 0x00000000, 0x00000000, 0x00000000,
+0x00000000, 0x00000000, 0x1FFF0000, 0x00000002,
+0x000000A0, 0x003EFFFE, 0xFFFFFFFE, 0xFFFFFFFF,
+0x661FFFFF, 0xFFFFFFFE, 0xFFFFFFFF, 0x77FFFFFF,
+};
+static const unsigned char nmstrtPages[] = {
+0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x00,
+0x00, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F,
+0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13,
+0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x15, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
+static const unsigned char namePages[] = {
+0x19, 0x03, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x00,
+0x00, 0x1F, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25,
+0x10, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x13,
+0x26, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x27, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x17,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x18,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+};
diff --git a/deps/EXPAT/expat/utf8tab.h b/deps/EXPAT/expat/utf8tab.h
new file mode 100644
index 000000000..7bb3e7760
--- /dev/null
+++ b/deps/EXPAT/expat/utf8tab.h
@@ -0,0 +1,37 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+ See the file COPYING for copying permission.
+*/
+
+
+/* 0x80 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,
+/* 0x84 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,
+/* 0x88 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,
+/* 0x8C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,
+/* 0x90 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,
+/* 0x94 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,
+/* 0x98 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,
+/* 0x9C */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,
+/* 0xA0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,
+/* 0xA4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,
+/* 0xA8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,
+/* 0xAC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,
+/* 0xB0 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,
+/* 0xB4 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,
+/* 0xB8 */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,
+/* 0xBC */ BT_TRAIL, BT_TRAIL, BT_TRAIL, BT_TRAIL,
+/* 0xC0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2,
+/* 0xC4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2,
+/* 0xC8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2,
+/* 0xCC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2,
+/* 0xD0 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2,
+/* 0xD4 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2,
+/* 0xD8 */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2,
+/* 0xDC */ BT_LEAD2, BT_LEAD2, BT_LEAD2, BT_LEAD2,
+/* 0xE0 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3,
+/* 0xE4 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3,
+/* 0xE8 */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3,
+/* 0xEC */ BT_LEAD3, BT_LEAD3, BT_LEAD3, BT_LEAD3,
+/* 0xF0 */ BT_LEAD4, BT_LEAD4, BT_LEAD4, BT_LEAD4,
+/* 0xF4 */ BT_LEAD4, BT_NONXML, BT_NONXML, BT_NONXML,
+/* 0xF8 */ BT_NONXML, BT_NONXML, BT_NONXML, BT_NONXML,
+/* 0xFC */ BT_NONXML, BT_NONXML, BT_MALFORM, BT_MALFORM,
diff --git a/deps/EXPAT/expat/xmlparse.c b/deps/EXPAT/expat/xmlparse.c
new file mode 100644
index 000000000..fbe5e0200
--- /dev/null
+++ b/deps/EXPAT/expat/xmlparse.c
@@ -0,0 +1,6458 @@
+/* Copyright (c) 1998, 1999, 2000 Thai Open Source Software Center Ltd
+ See the file COPYING for copying permission.
+*/
+
+#include <stddef.h>
+#include <string.h> /* memset(), memcpy() */
+#include <assert.h>
+#include <limits.h> /* UINT_MAX */
+
+#ifdef WIN32
+#define getpid GetCurrentProcessId
+#else
+#include <sys/time.h> /* gettimeofday() */
+#include <sys/types.h> /* getpid() */
+#include <unistd.h> /* getpid() */
+#endif
+
+#define XML_BUILDING_EXPAT 1
+
+#include "expat_config.h"
+#include "ascii.h"
+#include "expat.h"
+
+#ifdef XML_UNICODE
+#define XML_ENCODE_MAX XML_UTF16_ENCODE_MAX
+#define XmlConvert XmlUtf16Convert
+#define XmlGetInternalEncoding XmlGetUtf16InternalEncoding
+#define XmlGetInternalEncodingNS XmlGetUtf16InternalEncodingNS
+#define XmlEncode XmlUtf16Encode
+/* Using pointer subtraction to convert to integer type. */
+#define MUST_CONVERT(enc, s) (!(enc)->isUtf16 || (((char *)(s) - (char *)NULL) & 1))
+typedef unsigned short ICHAR;
+#else
+#define XML_ENCODE_MAX XML_UTF8_ENCODE_MAX
+#define XmlConvert XmlUtf8Convert
+#define XmlGetInternalEncoding XmlGetUtf8InternalEncoding
+#define XmlGetInternalEncodingNS XmlGetUtf8InternalEncodingNS
+#define XmlEncode XmlUtf8Encode
+#define MUST_CONVERT(enc, s) (!(enc)->isUtf8)
+typedef char ICHAR;
+#endif
+
+
+#ifndef XML_NS
+
+#define XmlInitEncodingNS XmlInitEncoding
+#define XmlInitUnknownEncodingNS XmlInitUnknownEncoding
+#undef XmlGetInternalEncodingNS
+#define XmlGetInternalEncodingNS XmlGetInternalEncoding
+#define XmlParseXmlDeclNS XmlParseXmlDecl
+
+#endif
+
+#ifdef XML_UNICODE
+
+#ifdef XML_UNICODE_WCHAR_T
+#define XML_T(x) (const wchar_t)x
+#define XML_L(x) L ## x
+#else
+#define XML_T(x) (const unsigned short)x
+#define XML_L(x) x
+#endif
+
+#else
+
+#define XML_T(x) x
+#define XML_L(x) x
+
+#endif
+
+/* Round up n to be a multiple of sz, where sz is a power of 2. */
+#define ROUND_UP(n, sz) (((n) + ((sz) - 1)) & ~((sz) - 1))
+
+/* Handle the case where memmove() doesn't exist. */
+#ifndef HAVE_MEMMOVE
+#ifdef HAVE_BCOPY
+#define memmove(d,s,l) bcopy((s),(d),(l))
+#else
+#error memmove does not exist on this platform, nor is a substitute available
+#endif /* HAVE_BCOPY */
+#endif /* HAVE_MEMMOVE */
+
+#include "internal.h"
+#include "xmltok.h"
+#include "xmlrole.h"
+
+typedef const XML_Char *KEY;
+
+typedef struct {
+ KEY name;
+} NAMED;
+
+typedef struct {
+ NAMED **v;
+ unsigned char power;
+ size_t size;
+ size_t used;
+ const XML_Memory_Handling_Suite *mem;
+} HASH_TABLE;
+
+/* Basic character hash algorithm, taken from Python's string hash:
+ h = h * 1000003 ^ character, the constant being a prime number.
+
+*/
+#ifdef XML_UNICODE
+#define CHAR_HASH(h, c) \
+ (((h) * 0xF4243) ^ (unsigned short)(c))
+#else
+#define CHAR_HASH(h, c) \
+ (((h) * 0xF4243) ^ (unsigned char)(c))
+#endif
+
+/* For probing (after a collision) we need a step size relative prime
+ to the hash table size, which is a power of 2. We use double-hashing,
+ since we can calculate a second hash value cheaply by taking those bits
+ of the first hash value that were discarded (masked out) when the table
+ index was calculated: index = hash & mask, where mask = table->size - 1.
+ We limit the maximum step size to table->size / 4 (mask >> 2) and make
+ it odd, since odd numbers are always relative prime to a power of 2.
+*/
+#define SECOND_HASH(hash, mask, power) \
+ ((((hash) & ~(mask)) >> ((power) - 1)) & ((mask) >> 2))
+#define PROBE_STEP(hash, mask, power) \
+ ((unsigned char)((SECOND_HASH(hash, mask, power)) | 1))
+
+typedef struct {
+ NAMED **p;
+ NAMED **end;
+} HASH_TABLE_ITER;
+
+#define INIT_TAG_BUF_SIZE 32 /* must be a multiple of sizeof(XML_Char) */
+#define INIT_DATA_BUF_SIZE 1024
+#define INIT_ATTS_SIZE 16
+#define INIT_ATTS_VERSION 0xFFFFFFFF
+#define INIT_BLOCK_SIZE 1024
+#define INIT_BUFFER_SIZE 1024
+
+#define EXPAND_SPARE 24
+
+typedef struct binding {
+ struct prefix *prefix;
+ struct binding *nextTagBinding;
+ struct binding *prevPrefixBinding;
+ const struct attribute_id *attId;
+ XML_Char *uri;
+ int uriLen;
+ int uriAlloc;
+} BINDING;
+
+typedef struct prefix {
+ const XML_Char *name;
+ BINDING *binding;
+} PREFIX;
+
+typedef struct {
+ const XML_Char *str;
+ const XML_Char *localPart;
+ const XML_Char *prefix;
+ int strLen;
+ int uriLen;
+ int prefixLen;
+} TAG_NAME;
+
+/* TAG represents an open element.
+ The name of the element is stored in both the document and API
+ encodings. The memory buffer 'buf' is a separately-allocated
+ memory area which stores the name. During the XML_Parse()/
+ XMLParseBuffer() when the element is open, the memory for the 'raw'
+ version of the name (in the document encoding) is shared with the
+ document buffer. If the element is open across calls to
+ XML_Parse()/XML_ParseBuffer(), the buffer is re-allocated to
+ contain the 'raw' name as well.
+
+ A parser re-uses these structures, maintaining a list of allocated
+ TAG objects in a free list.
+*/
+typedef struct tag {
+ struct tag *parent; /* parent of this element */
+ const char *rawName; /* tagName in the original encoding */
+ int rawNameLength;
+ TAG_NAME name; /* tagName in the API encoding */
+ char *buf; /* buffer for name components */
+ char *bufEnd; /* end of the buffer */
+ BINDING *bindings;
+} TAG;
+
+typedef struct {
+ const XML_Char *name;
+ const XML_Char *textPtr;
+ int textLen; /* length in XML_Chars */
+ int processed; /* # of processed bytes - when suspended */
+ const XML_Char *systemId;
+ const XML_Char *base;
+ const XML_Char *publicId;
+ const XML_Char *notation;
+ XML_Bool open;
+ XML_Bool is_param;
+ XML_Bool is_internal; /* true if declared in internal subset outside PE */
+} ENTITY;
+
+typedef struct {
+ enum XML_Content_Type type;
+ enum XML_Content_Quant quant;
+ const XML_Char * name;
+ int firstchild;
+ int lastchild;
+ int childcnt;
+ int nextsib;
+} CONTENT_SCAFFOLD;
+
+#define INIT_SCAFFOLD_ELEMENTS 32
+
+typedef struct block {
+ struct block *next;
+ int size;
+ XML_Char s[1];
+} BLOCK;
+
+typedef struct {
+ BLOCK *blocks;
+ BLOCK *freeBlocks;
+ const XML_Char *end;
+ XML_Char *ptr;
+ XML_Char *start;
+ const XML_Memory_Handling_Suite *mem;
+} STRING_POOL;
+
+/* The XML_Char before the name is used to determine whether
+ an attribute has been specified. */
+typedef struct attribute_id {
+ XML_Char *name;
+ PREFIX *prefix;
+ XML_Bool maybeTokenized;
+ XML_Bool xmlns;
+} ATTRIBUTE_ID;
+
+typedef struct {
+ const ATTRIBUTE_ID *id;
+ XML_Bool isCdata;
+ const XML_Char *value;
+} DEFAULT_ATTRIBUTE;
+
+typedef struct {
+ unsigned long version;
+ unsigned long hash;
+ const XML_Char *uriName;
+} NS_ATT;
+
+typedef struct {
+ const XML_Char *name;
+ PREFIX *prefix;
+ const ATTRIBUTE_ID *idAtt;
+ int nDefaultAtts;
+ int allocDefaultAtts;
+ DEFAULT_ATTRIBUTE *defaultAtts;
+} ELEMENT_TYPE;
+
+typedef struct {
+ HASH_TABLE generalEntities;
+ HASH_TABLE elementTypes;
+ HASH_TABLE attributeIds;
+ HASH_TABLE prefixes;
+ STRING_POOL pool;
+ STRING_POOL entityValuePool;
+ /* false once a parameter entity reference has been skipped */
+ XML_Bool keepProcessing;
+ /* true once an internal or external PE reference has been encountered;
+ this includes the reference to an external subset */
+ XML_Bool hasParamEntityRefs;
+ XML_Bool standalone;
+#ifdef XML_DTD
+ /* indicates if external PE has been read */
+ XML_Bool paramEntityRead;
+ HASH_TABLE paramEntities;
+#endif /* XML_DTD */
+ PREFIX defaultPrefix;
+ /* === scaffolding for building content model === */
+ XML_Bool in_eldecl;
+ CONTENT_SCAFFOLD *scaffold;
+ unsigned contentStringLen;
+ unsigned scaffSize;
+ unsigned scaffCount;
+ int scaffLevel;
+ int *scaffIndex;
+} DTD;
+
+typedef struct open_internal_entity {
+ const char *internalEventPtr;
+ const char *internalEventEndPtr;
+ struct open_internal_entity *next;
+ ENTITY *entity;
+ int startTagLevel;
+ XML_Bool betweenDecl; /* WFC: PE Between Declarations */
+} OPEN_INTERNAL_ENTITY;
+
+typedef enum XML_Error PTRCALL Processor(XML_Parser parser,
+ const char *start,
+ const char *end,
+ const char **endPtr);
+
+static Processor prologProcessor;
+static Processor prologInitProcessor;
+static Processor contentProcessor;
+static Processor cdataSectionProcessor;
+#ifdef XML_DTD
+static Processor ignoreSectionProcessor;
+static Processor externalParEntProcessor;
+static Processor externalParEntInitProcessor;
+static Processor entityValueProcessor;
+static Processor entityValueInitProcessor;
+#endif /* XML_DTD */
+static Processor epilogProcessor;
+static Processor errorProcessor;
+static Processor externalEntityInitProcessor;
+static Processor externalEntityInitProcessor2;
+static Processor externalEntityInitProcessor3;
+static Processor externalEntityContentProcessor;
+static Processor internalEntityProcessor;
+
+static enum XML_Error
+handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName);
+static enum XML_Error
+processXmlDecl(XML_Parser parser, int isGeneralTextEntity,
+ const char *s, const char *next);
+static enum XML_Error
+initializeEncoding(XML_Parser parser);
+static enum XML_Error
+doProlog(XML_Parser parser, const ENCODING *enc, const char *s,
+ const char *end, int tok, const char *next, const char **nextPtr,
+ XML_Bool haveMore);
+static enum XML_Error
+processInternalEntity(XML_Parser parser, ENTITY *entity,
+ XML_Bool betweenDecl);
+static enum XML_Error
+doContent(XML_Parser parser, int startTagLevel, const ENCODING *enc,
+ const char *start, const char *end, const char **endPtr,
+ XML_Bool haveMore);
+static enum XML_Error
+doCdataSection(XML_Parser parser, const ENCODING *, const char **startPtr,
+ const char *end, const char **nextPtr, XML_Bool haveMore);
+#ifdef XML_DTD
+static enum XML_Error
+doIgnoreSection(XML_Parser parser, const ENCODING *, const char **startPtr,
+ const char *end, const char **nextPtr, XML_Bool haveMore);
+#endif /* XML_DTD */
+
+static enum XML_Error
+storeAtts(XML_Parser parser, const ENCODING *, const char *s,
+ TAG_NAME *tagNamePtr, BINDING **bindingsPtr);
+static enum XML_Error
+addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
+ const XML_Char *uri, BINDING **bindingsPtr);
+static int
+defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *, XML_Bool isCdata,
+ XML_Bool isId, const XML_Char *dfltValue, XML_Parser parser);
+static enum XML_Error
+storeAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata,
+ const char *, const char *, STRING_POOL *);
+static enum XML_Error
+appendAttributeValue(XML_Parser parser, const ENCODING *, XML_Bool isCdata,
+ const char *, const char *, STRING_POOL *);
+static ATTRIBUTE_ID *
+getAttributeId(XML_Parser parser, const ENCODING *enc, const char *start,
+ const char *end);
+static int
+setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *);
+static enum XML_Error
+storeEntityValue(XML_Parser parser, const ENCODING *enc, const char *start,
+ const char *end);
+static int
+reportProcessingInstruction(XML_Parser parser, const ENCODING *enc,
+ const char *start, const char *end);
+static int
+reportComment(XML_Parser parser, const ENCODING *enc, const char *start,
+ const char *end);
+static void
+reportDefault(XML_Parser parser, const ENCODING *enc, const char *start,
+ const char *end);
+
+static const XML_Char * getContext(XML_Parser parser);
+static XML_Bool
+setContext(XML_Parser parser, const XML_Char *context);
+
+static void FASTCALL normalizePublicId(XML_Char *s);
+
+static DTD * dtdCreate(const XML_Memory_Handling_Suite *ms);
+/* do not call if parentParser != NULL */
+static void dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms);
+static void
+dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms);
+static int
+dtdCopy(XML_Parser oldParser,
+ DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms);
+static int
+copyEntityTable(XML_Parser oldParser,
+ HASH_TABLE *, STRING_POOL *, const HASH_TABLE *);
+static NAMED *
+lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize);
+static void FASTCALL
+hashTableInit(HASH_TABLE *, const XML_Memory_Handling_Suite *ms);
+static void FASTCALL hashTableClear(HASH_TABLE *);
+static void FASTCALL hashTableDestroy(HASH_TABLE *);
+static void FASTCALL
+hashTableIterInit(HASH_TABLE_ITER *, const HASH_TABLE *);
+static NAMED * FASTCALL hashTableIterNext(HASH_TABLE_ITER *);
+
+static void FASTCALL
+poolInit(STRING_POOL *, const XML_Memory_Handling_Suite *ms);
+static void FASTCALL poolClear(STRING_POOL *);
+static void FASTCALL poolDestroy(STRING_POOL *);
+static XML_Char *
+poolAppend(STRING_POOL *pool, const ENCODING *enc,
+ const char *ptr, const char *end);
+static XML_Char *
+poolStoreString(STRING_POOL *pool, const ENCODING *enc,
+ const char *ptr, const char *end);
+static XML_Bool FASTCALL poolGrow(STRING_POOL *pool);
+static const XML_Char * FASTCALL
+poolCopyString(STRING_POOL *pool, const XML_Char *s);
+static const XML_Char *
+poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n);
+static const XML_Char * FASTCALL
+poolAppendString(STRING_POOL *pool, const XML_Char *s);
+
+static int FASTCALL nextScaffoldPart(XML_Parser parser);
+static XML_Content * build_model(XML_Parser parser);
+static ELEMENT_TYPE *
+getElementType(XML_Parser parser, const ENCODING *enc,
+ const char *ptr, const char *end);
+
+static unsigned long generate_hash_secret_salt(XML_Parser parser);
+static XML_Bool startParsing(XML_Parser parser);
+
+static XML_Parser
+parserCreate(const XML_Char *encodingName,
+ const XML_Memory_Handling_Suite *memsuite,
+ const XML_Char *nameSep,
+ DTD *dtd);
+
+static void
+parserInit(XML_Parser parser, const XML_Char *encodingName);
+
+#define poolStart(pool) ((pool)->start)
+#define poolEnd(pool) ((pool)->ptr)
+#define poolLength(pool) ((pool)->ptr - (pool)->start)
+#define poolChop(pool) ((void)--(pool->ptr))
+#define poolLastChar(pool) (((pool)->ptr)[-1])
+#define poolDiscard(pool) ((pool)->ptr = (pool)->start)
+#define poolFinish(pool) ((pool)->start = (pool)->ptr)
+#define poolAppendChar(pool, c) \
+ (((pool)->ptr == (pool)->end && !poolGrow(pool)) \
+ ? 0 \
+ : ((*((pool)->ptr)++ = c), 1))
+
+struct XML_ParserStruct {
+ /* The first member must be userData so that the XML_GetUserData
+ macro works. */
+ void *m_userData;
+ void *m_handlerArg;
+ char *m_buffer;
+ const XML_Memory_Handling_Suite m_mem;
+ /* first character to be parsed */
+ const char *m_bufferPtr;
+ /* past last character to be parsed */
+ char *m_bufferEnd;
+ /* allocated end of buffer */
+ const char *m_bufferLim;
+ XML_Index m_parseEndByteIndex;
+ const char *m_parseEndPtr;
+ XML_Char *m_dataBuf;
+ XML_Char *m_dataBufEnd;
+ XML_StartElementHandler m_startElementHandler;
+ XML_EndElementHandler m_endElementHandler;
+ XML_CharacterDataHandler m_characterDataHandler;
+ XML_ProcessingInstructionHandler m_processingInstructionHandler;
+ XML_CommentHandler m_commentHandler;
+ XML_StartCdataSectionHandler m_startCdataSectionHandler;
+ XML_EndCdataSectionHandler m_endCdataSectionHandler;
+ XML_DefaultHandler m_defaultHandler;
+ XML_StartDoctypeDeclHandler m_startDoctypeDeclHandler;
+ XML_EndDoctypeDeclHandler m_endDoctypeDeclHandler;
+ XML_UnparsedEntityDeclHandler m_unparsedEntityDeclHandler;
+ XML_NotationDeclHandler m_notationDeclHandler;
+ XML_StartNamespaceDeclHandler m_startNamespaceDeclHandler;
+ XML_EndNamespaceDeclHandler m_endNamespaceDeclHandler;
+ XML_NotStandaloneHandler m_notStandaloneHandler;
+ XML_ExternalEntityRefHandler m_externalEntityRefHandler;
+ XML_Parser m_externalEntityRefHandlerArg;
+ XML_SkippedEntityHandler m_skippedEntityHandler;
+ XML_UnknownEncodingHandler m_unknownEncodingHandler;
+ XML_ElementDeclHandler m_elementDeclHandler;
+ XML_AttlistDeclHandler m_attlistDeclHandler;
+ XML_EntityDeclHandler m_entityDeclHandler;
+ XML_XmlDeclHandler m_xmlDeclHandler;
+ const ENCODING *m_encoding;
+ INIT_ENCODING m_initEncoding;
+ const ENCODING *m_internalEncoding;
+ const XML_Char *m_protocolEncodingName;
+ XML_Bool m_ns;
+ XML_Bool m_ns_triplets;
+ void *m_unknownEncodingMem;
+ void *m_unknownEncodingData;
+ void *m_unknownEncodingHandlerData;
+ void (XMLCALL *m_unknownEncodingRelease)(void *);
+ PROLOG_STATE m_prologState;
+ Processor *m_processor;
+ enum XML_Error m_errorCode;
+ const char *m_eventPtr;
+ const char *m_eventEndPtr;
+ const char *m_positionPtr;
+ OPEN_INTERNAL_ENTITY *m_openInternalEntities;
+ OPEN_INTERNAL_ENTITY *m_freeInternalEntities;
+ XML_Bool m_defaultExpandInternalEntities;
+ int m_tagLevel;
+ ENTITY *m_declEntity;
+ const XML_Char *m_doctypeName;
+ const XML_Char *m_doctypeSysid;
+ const XML_Char *m_doctypePubid;
+ const XML_Char *m_declAttributeType;
+ const XML_Char *m_declNotationName;
+ const XML_Char *m_declNotationPublicId;
+ ELEMENT_TYPE *m_declElementType;
+ ATTRIBUTE_ID *m_declAttributeId;
+ XML_Bool m_declAttributeIsCdata;
+ XML_Bool m_declAttributeIsId;
+ DTD *m_dtd;
+ const XML_Char *m_curBase;
+ TAG *m_tagStack;
+ TAG *m_freeTagList;
+ BINDING *m_inheritedBindings;
+ BINDING *m_freeBindingList;
+ int m_attsSize;
+ int m_nSpecifiedAtts;
+ int m_idAttIndex;
+ ATTRIBUTE *m_atts;
+ NS_ATT *m_nsAtts;
+ unsigned long m_nsAttsVersion;
+ unsigned char m_nsAttsPower;
+#ifdef XML_ATTR_INFO
+ XML_AttrInfo *m_attInfo;
+#endif
+ POSITION m_position;
+ STRING_POOL m_tempPool;
+ STRING_POOL m_temp2Pool;
+ char *m_groupConnector;
+ unsigned int m_groupSize;
+ XML_Char m_namespaceSeparator;
+ XML_Parser m_parentParser;
+ XML_ParsingStatus m_parsingStatus;
+#ifdef XML_DTD
+ XML_Bool m_isParamEntity;
+ XML_Bool m_useForeignDTD;
+ enum XML_ParamEntityParsing m_paramEntityParsing;
+#endif
+ unsigned long m_hash_secret_salt;
+};
+
+#define MALLOC(s) (parser->m_mem.malloc_fcn((s)))
+#define REALLOC(p,s) (parser->m_mem.realloc_fcn((p),(s)))
+#define FREE(p) (parser->m_mem.free_fcn((p)))
+
+#define userData (parser->m_userData)
+#define handlerArg (parser->m_handlerArg)
+#define startElementHandler (parser->m_startElementHandler)
+#define endElementHandler (parser->m_endElementHandler)
+#define characterDataHandler (parser->m_characterDataHandler)
+#define processingInstructionHandler \
+ (parser->m_processingInstructionHandler)
+#define commentHandler (parser->m_commentHandler)
+#define startCdataSectionHandler \
+ (parser->m_startCdataSectionHandler)
+#define endCdataSectionHandler (parser->m_endCdataSectionHandler)
+#define defaultHandler (parser->m_defaultHandler)
+#define startDoctypeDeclHandler (parser->m_startDoctypeDeclHandler)
+#define endDoctypeDeclHandler (parser->m_endDoctypeDeclHandler)
+#define unparsedEntityDeclHandler \
+ (parser->m_unparsedEntityDeclHandler)
+#define notationDeclHandler (parser->m_notationDeclHandler)
+#define startNamespaceDeclHandler \
+ (parser->m_startNamespaceDeclHandler)
+#define endNamespaceDeclHandler (parser->m_endNamespaceDeclHandler)
+#define notStandaloneHandler (parser->m_notStandaloneHandler)
+#define externalEntityRefHandler \
+ (parser->m_externalEntityRefHandler)
+#define externalEntityRefHandlerArg \
+ (parser->m_externalEntityRefHandlerArg)
+#define internalEntityRefHandler \
+ (parser->m_internalEntityRefHandler)
+#define skippedEntityHandler (parser->m_skippedEntityHandler)
+#define unknownEncodingHandler (parser->m_unknownEncodingHandler)
+#define elementDeclHandler (parser->m_elementDeclHandler)
+#define attlistDeclHandler (parser->m_attlistDeclHandler)
+#define entityDeclHandler (parser->m_entityDeclHandler)
+#define xmlDeclHandler (parser->m_xmlDeclHandler)
+#define encoding (parser->m_encoding)
+#define initEncoding (parser->m_initEncoding)
+#define internalEncoding (parser->m_internalEncoding)
+#define unknownEncodingMem (parser->m_unknownEncodingMem)
+#define unknownEncodingData (parser->m_unknownEncodingData)
+#define unknownEncodingHandlerData \
+ (parser->m_unknownEncodingHandlerData)
+#define unknownEncodingRelease (parser->m_unknownEncodingRelease)
+#define protocolEncodingName (parser->m_protocolEncodingName)
+#define ns (parser->m_ns)
+#define ns_triplets (parser->m_ns_triplets)
+#define prologState (parser->m_prologState)
+#define processor (parser->m_processor)
+#define errorCode (parser->m_errorCode)
+#define eventPtr (parser->m_eventPtr)
+#define eventEndPtr (parser->m_eventEndPtr)
+#define positionPtr (parser->m_positionPtr)
+#define position (parser->m_position)
+#define openInternalEntities (parser->m_openInternalEntities)
+#define freeInternalEntities (parser->m_freeInternalEntities)
+#define defaultExpandInternalEntities \
+ (parser->m_defaultExpandInternalEntities)
+#define tagLevel (parser->m_tagLevel)
+#define buffer (parser->m_buffer)
+#define bufferPtr (parser->m_bufferPtr)
+#define bufferEnd (parser->m_bufferEnd)
+#define parseEndByteIndex (parser->m_parseEndByteIndex)
+#define parseEndPtr (parser->m_parseEndPtr)
+#define bufferLim (parser->m_bufferLim)
+#define dataBuf (parser->m_dataBuf)
+#define dataBufEnd (parser->m_dataBufEnd)
+#define _dtd (parser->m_dtd)
+#define curBase (parser->m_curBase)
+#define declEntity (parser->m_declEntity)
+#define doctypeName (parser->m_doctypeName)
+#define doctypeSysid (parser->m_doctypeSysid)
+#define doctypePubid (parser->m_doctypePubid)
+#define declAttributeType (parser->m_declAttributeType)
+#define declNotationName (parser->m_declNotationName)
+#define declNotationPublicId (parser->m_declNotationPublicId)
+#define declElementType (parser->m_declElementType)
+#define declAttributeId (parser->m_declAttributeId)
+#define declAttributeIsCdata (parser->m_declAttributeIsCdata)
+#define declAttributeIsId (parser->m_declAttributeIsId)
+#define freeTagList (parser->m_freeTagList)
+#define freeBindingList (parser->m_freeBindingList)
+#define inheritedBindings (parser->m_inheritedBindings)
+#define tagStack (parser->m_tagStack)
+#define atts (parser->m_atts)
+#define attsSize (parser->m_attsSize)
+#define nSpecifiedAtts (parser->m_nSpecifiedAtts)
+#define idAttIndex (parser->m_idAttIndex)
+#define nsAtts (parser->m_nsAtts)
+#define nsAttsVersion (parser->m_nsAttsVersion)
+#define nsAttsPower (parser->m_nsAttsPower)
+#define attInfo (parser->m_attInfo)
+#define tempPool (parser->m_tempPool)
+#define temp2Pool (parser->m_temp2Pool)
+#define groupConnector (parser->m_groupConnector)
+#define groupSize (parser->m_groupSize)
+#define namespaceSeparator (parser->m_namespaceSeparator)
+#define parentParser (parser->m_parentParser)
+#define ps_parsing (parser->m_parsingStatus.parsing)
+#define ps_finalBuffer (parser->m_parsingStatus.finalBuffer)
+#ifdef XML_DTD
+#define isParamEntity (parser->m_isParamEntity)
+#define useForeignDTD (parser->m_useForeignDTD)
+#define paramEntityParsing (parser->m_paramEntityParsing)
+#endif /* XML_DTD */
+#define hash_secret_salt (parser->m_hash_secret_salt)
+
+XML_Parser XMLCALL
+XML_ParserCreate(const XML_Char *encodingName)
+{
+ return XML_ParserCreate_MM(encodingName, NULL, NULL);
+}
+
+XML_Parser XMLCALL
+XML_ParserCreateNS(const XML_Char *encodingName, XML_Char nsSep)
+{
+ XML_Char tmp[2];
+ *tmp = nsSep;
+ return XML_ParserCreate_MM(encodingName, NULL, tmp);
+}
+
+static const XML_Char implicitContext[] = {
+ ASCII_x, ASCII_m, ASCII_l, ASCII_EQUALS, ASCII_h, ASCII_t, ASCII_t, ASCII_p,
+ ASCII_COLON, ASCII_SLASH, ASCII_SLASH, ASCII_w, ASCII_w, ASCII_w,
+ ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD, ASCII_o, ASCII_r, ASCII_g,
+ ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L, ASCII_SLASH, ASCII_1, ASCII_9,
+ ASCII_9, ASCII_8, ASCII_SLASH, ASCII_n, ASCII_a, ASCII_m, ASCII_e,
+ ASCII_s, ASCII_p, ASCII_a, ASCII_c, ASCII_e, '\0'
+};
+
+static unsigned long
+gather_time_entropy(void)
+{
+#ifdef WIN32
+ FILETIME ft;
+ GetSystemTimeAsFileTime(&ft); /* never fails */
+ return ft.dwHighDateTime ^ ft.dwLowDateTime;
+#else
+ struct timeval tv;
+ int gettimeofday_res;
+
+ gettimeofday_res = gettimeofday(&tv, NULL);
+ assert (gettimeofday_res == 0);
+
+ /* Microseconds time is <20 bits entropy */
+ return tv.tv_usec;
+#endif
+}
+
+static unsigned long
+generate_hash_secret_salt(XML_Parser parser)
+{
+ /* Process ID is 0 bits entropy if attacker has local access
+ * XML_Parser address is few bits of entropy if attacker has local access */
+ // Prusa3D specific: Fix for a following warning, which turns to an error on some Perl/XS installations:
+ // error: cast from 'XML_Parser' to 'long unsigned int' loses precision [-fpermissive]
+ unsigned long *parser_addr = (unsigned long*)&parser;
+ const unsigned long entropy =
+ gather_time_entropy() ^ getpid() ^ *parser_addr;
+
+ /* Factors are 2^31-1 and 2^61-1 (Mersenne primes M31 and M61) */
+ if (sizeof(unsigned long) == 4) {
+ return entropy * 2147483647;
+ } else {
+ return entropy * (unsigned long)2305843009213693951;
+ }
+}
+
+static XML_Bool /* only valid for root parser */
+startParsing(XML_Parser parser)
+{
+ /* hash functions must be initialized before setContext() is called */
+ if (hash_secret_salt == 0)
+ hash_secret_salt = generate_hash_secret_salt(parser);
+ if (ns) {
+ /* implicit context only set for root parser, since child
+ parsers (i.e. external entity parsers) will inherit it
+ */
+ return setContext(parser, implicitContext);
+ }
+ return XML_TRUE;
+}
+
+XML_Parser XMLCALL
+XML_ParserCreate_MM(const XML_Char *encodingName,
+ const XML_Memory_Handling_Suite *memsuite,
+ const XML_Char *nameSep)
+{
+ return parserCreate(encodingName, memsuite, nameSep, NULL);
+}
+
+static XML_Parser
+parserCreate(const XML_Char *encodingName,
+ const XML_Memory_Handling_Suite *memsuite,
+ const XML_Char *nameSep,
+ DTD *dtd)
+{
+ XML_Parser parser;
+
+ if (memsuite) {
+ XML_Memory_Handling_Suite *mtemp;
+ parser = (XML_Parser)
+ memsuite->malloc_fcn(sizeof(struct XML_ParserStruct));
+ if (parser != NULL) {
+ mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem);
+ mtemp->malloc_fcn = memsuite->malloc_fcn;
+ mtemp->realloc_fcn = memsuite->realloc_fcn;
+ mtemp->free_fcn = memsuite->free_fcn;
+ }
+ }
+ else {
+ XML_Memory_Handling_Suite *mtemp;
+ parser = (XML_Parser)malloc(sizeof(struct XML_ParserStruct));
+ if (parser != NULL) {
+ mtemp = (XML_Memory_Handling_Suite *)&(parser->m_mem);
+ mtemp->malloc_fcn = malloc;
+ mtemp->realloc_fcn = realloc;
+ mtemp->free_fcn = free;
+ }
+ }
+
+ if (!parser)
+ return parser;
+
+ buffer = NULL;
+ bufferLim = NULL;
+
+ attsSize = INIT_ATTS_SIZE;
+ atts = (ATTRIBUTE *)MALLOC(attsSize * sizeof(ATTRIBUTE));
+ if (atts == NULL) {
+ FREE(parser);
+ return NULL;
+ }
+#ifdef XML_ATTR_INFO
+ attInfo = (XML_AttrInfo*)MALLOC(attsSize * sizeof(XML_AttrInfo));
+ if (attInfo == NULL) {
+ FREE(atts);
+ FREE(parser);
+ return NULL;
+ }
+#endif
+ dataBuf = (XML_Char *)MALLOC(INIT_DATA_BUF_SIZE * sizeof(XML_Char));
+ if (dataBuf == NULL) {
+ FREE(atts);
+#ifdef XML_ATTR_INFO
+ FREE(attInfo);
+#endif
+ FREE(parser);
+ return NULL;
+ }
+ dataBufEnd = dataBuf + INIT_DATA_BUF_SIZE;
+
+ if (dtd)
+ _dtd = dtd;
+ else {
+ _dtd = dtdCreate(&parser->m_mem);
+ if (_dtd == NULL) {
+ FREE(dataBuf);
+ FREE(atts);
+#ifdef XML_ATTR_INFO
+ FREE(attInfo);
+#endif
+ FREE(parser);
+ return NULL;
+ }
+ }
+
+ freeBindingList = NULL;
+ freeTagList = NULL;
+ freeInternalEntities = NULL;
+
+ groupSize = 0;
+ groupConnector = NULL;
+
+ unknownEncodingHandler = NULL;
+ unknownEncodingHandlerData = NULL;
+
+ namespaceSeparator = ASCII_EXCL;
+ ns = XML_FALSE;
+ ns_triplets = XML_FALSE;
+
+ nsAtts = NULL;
+ nsAttsVersion = 0;
+ nsAttsPower = 0;
+
+ poolInit(&tempPool, &(parser->m_mem));
+ poolInit(&temp2Pool, &(parser->m_mem));
+ parserInit(parser, encodingName);
+
+ if (encodingName && !protocolEncodingName) {
+ XML_ParserFree(parser);
+ return NULL;
+ }
+
+ if (nameSep) {
+ ns = XML_TRUE;
+ internalEncoding = XmlGetInternalEncodingNS();
+ namespaceSeparator = *nameSep;
+ }
+ else {
+ internalEncoding = XmlGetInternalEncoding();
+ }
+
+ return parser;
+}
+
+static void
+parserInit(XML_Parser parser, const XML_Char *encodingName)
+{
+ processor = prologInitProcessor;
+ XmlPrologStateInit(&prologState);
+ protocolEncodingName = (encodingName != NULL
+ ? poolCopyString(&tempPool, encodingName)
+ : NULL);
+ curBase = NULL;
+ XmlInitEncoding(&initEncoding, &encoding, 0);
+ userData = NULL;
+ handlerArg = NULL;
+ startElementHandler = NULL;
+ endElementHandler = NULL;
+ characterDataHandler = NULL;
+ processingInstructionHandler = NULL;
+ commentHandler = NULL;
+ startCdataSectionHandler = NULL;
+ endCdataSectionHandler = NULL;
+ defaultHandler = NULL;
+ startDoctypeDeclHandler = NULL;
+ endDoctypeDeclHandler = NULL;
+ unparsedEntityDeclHandler = NULL;
+ notationDeclHandler = NULL;
+ startNamespaceDeclHandler = NULL;
+ endNamespaceDeclHandler = NULL;
+ notStandaloneHandler = NULL;
+ externalEntityRefHandler = NULL;
+ externalEntityRefHandlerArg = parser;
+ skippedEntityHandler = NULL;
+ elementDeclHandler = NULL;
+ attlistDeclHandler = NULL;
+ entityDeclHandler = NULL;
+ xmlDeclHandler = NULL;
+ bufferPtr = buffer;
+ bufferEnd = buffer;
+ parseEndByteIndex = 0;
+ parseEndPtr = NULL;
+ declElementType = NULL;
+ declAttributeId = NULL;
+ declEntity = NULL;
+ doctypeName = NULL;
+ doctypeSysid = NULL;
+ doctypePubid = NULL;
+ declAttributeType = NULL;
+ declNotationName = NULL;
+ declNotationPublicId = NULL;
+ declAttributeIsCdata = XML_FALSE;
+ declAttributeIsId = XML_FALSE;
+ memset(&position, 0, sizeof(POSITION));
+ errorCode = XML_ERROR_NONE;
+ eventPtr = NULL;
+ eventEndPtr = NULL;
+ positionPtr = NULL;
+ openInternalEntities = NULL;
+ defaultExpandInternalEntities = XML_TRUE;
+ tagLevel = 0;
+ tagStack = NULL;
+ inheritedBindings = NULL;
+ nSpecifiedAtts = 0;
+ unknownEncodingMem = NULL;
+ unknownEncodingRelease = NULL;
+ unknownEncodingData = NULL;
+ parentParser = NULL;
+ ps_parsing = XML_INITIALIZED;
+#ifdef XML_DTD
+ isParamEntity = XML_FALSE;
+ useForeignDTD = XML_FALSE;
+ paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER;
+#endif
+ hash_secret_salt = 0;
+}
+
+/* moves list of bindings to freeBindingList */
+static void FASTCALL
+moveToFreeBindingList(XML_Parser parser, BINDING *bindings)
+{
+ while (bindings) {
+ BINDING *b = bindings;
+ bindings = bindings->nextTagBinding;
+ b->nextTagBinding = freeBindingList;
+ freeBindingList = b;
+ }
+}
+
+XML_Bool XMLCALL
+XML_ParserReset(XML_Parser parser, const XML_Char *encodingName)
+{
+ TAG *tStk;
+ OPEN_INTERNAL_ENTITY *openEntityList;
+ if (parentParser)
+ return XML_FALSE;
+ /* move tagStack to freeTagList */
+ tStk = tagStack;
+ while (tStk) {
+ TAG *tag = tStk;
+ tStk = tStk->parent;
+ tag->parent = freeTagList;
+ moveToFreeBindingList(parser, tag->bindings);
+ tag->bindings = NULL;
+ freeTagList = tag;
+ }
+ /* move openInternalEntities to freeInternalEntities */
+ openEntityList = openInternalEntities;
+ while (openEntityList) {
+ OPEN_INTERNAL_ENTITY *openEntity = openEntityList;
+ openEntityList = openEntity->next;
+ openEntity->next = freeInternalEntities;
+ freeInternalEntities = openEntity;
+ }
+ moveToFreeBindingList(parser, inheritedBindings);
+ FREE(unknownEncodingMem);
+ if (unknownEncodingRelease)
+ unknownEncodingRelease(unknownEncodingData);
+ poolClear(&tempPool);
+ poolClear(&temp2Pool);
+ parserInit(parser, encodingName);
+ dtdReset(_dtd, &parser->m_mem);
+ return XML_TRUE;
+}
+
+enum XML_Status XMLCALL
+XML_SetEncoding(XML_Parser parser, const XML_Char *encodingName)
+{
+ /* Block after XML_Parse()/XML_ParseBuffer() has been called.
+ XXX There's no way for the caller to determine which of the
+ XXX possible error cases caused the XML_STATUS_ERROR return.
+ */
+ if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)
+ return XML_STATUS_ERROR;
+ if (encodingName == NULL)
+ protocolEncodingName = NULL;
+ else {
+ protocolEncodingName = poolCopyString(&tempPool, encodingName);
+ if (!protocolEncodingName)
+ return XML_STATUS_ERROR;
+ }
+ return XML_STATUS_OK;
+}
+
+XML_Parser XMLCALL
+XML_ExternalEntityParserCreate(XML_Parser oldParser,
+ const XML_Char *context,
+ const XML_Char *encodingName)
+{
+ XML_Parser parser = oldParser;
+ DTD *newDtd = NULL;
+ DTD *oldDtd = _dtd;
+ XML_StartElementHandler oldStartElementHandler = startElementHandler;
+ XML_EndElementHandler oldEndElementHandler = endElementHandler;
+ XML_CharacterDataHandler oldCharacterDataHandler = characterDataHandler;
+ XML_ProcessingInstructionHandler oldProcessingInstructionHandler
+ = processingInstructionHandler;
+ XML_CommentHandler oldCommentHandler = commentHandler;
+ XML_StartCdataSectionHandler oldStartCdataSectionHandler
+ = startCdataSectionHandler;
+ XML_EndCdataSectionHandler oldEndCdataSectionHandler
+ = endCdataSectionHandler;
+ XML_DefaultHandler oldDefaultHandler = defaultHandler;
+ XML_UnparsedEntityDeclHandler oldUnparsedEntityDeclHandler
+ = unparsedEntityDeclHandler;
+ XML_NotationDeclHandler oldNotationDeclHandler = notationDeclHandler;
+ XML_StartNamespaceDeclHandler oldStartNamespaceDeclHandler
+ = startNamespaceDeclHandler;
+ XML_EndNamespaceDeclHandler oldEndNamespaceDeclHandler
+ = endNamespaceDeclHandler;
+ XML_NotStandaloneHandler oldNotStandaloneHandler = notStandaloneHandler;
+ XML_ExternalEntityRefHandler oldExternalEntityRefHandler
+ = externalEntityRefHandler;
+ XML_SkippedEntityHandler oldSkippedEntityHandler = skippedEntityHandler;
+ XML_UnknownEncodingHandler oldUnknownEncodingHandler
+ = unknownEncodingHandler;
+ XML_ElementDeclHandler oldElementDeclHandler = elementDeclHandler;
+ XML_AttlistDeclHandler oldAttlistDeclHandler = attlistDeclHandler;
+ XML_EntityDeclHandler oldEntityDeclHandler = entityDeclHandler;
+ XML_XmlDeclHandler oldXmlDeclHandler = xmlDeclHandler;
+ ELEMENT_TYPE * oldDeclElementType = declElementType;
+
+ void *oldUserData = userData;
+ void *oldHandlerArg = handlerArg;
+ XML_Bool oldDefaultExpandInternalEntities = defaultExpandInternalEntities;
+ XML_Parser oldExternalEntityRefHandlerArg = externalEntityRefHandlerArg;
+#ifdef XML_DTD
+ enum XML_ParamEntityParsing oldParamEntityParsing = paramEntityParsing;
+ int oldInEntityValue = prologState.inEntityValue;
+#endif
+ XML_Bool oldns_triplets = ns_triplets;
+ /* Note that the new parser shares the same hash secret as the old
+ parser, so that dtdCopy and copyEntityTable can lookup values
+ from hash tables associated with either parser without us having
+ to worry which hash secrets each table has.
+ */
+ unsigned long oldhash_secret_salt = hash_secret_salt;
+
+#ifdef XML_DTD
+ if (!context)
+ newDtd = oldDtd;
+#endif /* XML_DTD */
+
+ /* Note that the magical uses of the pre-processor to make field
+ access look more like C++ require that `parser' be overwritten
+ here. This makes this function more painful to follow than it
+ would be otherwise.
+ */
+ if (ns) {
+ XML_Char tmp[2];
+ *tmp = namespaceSeparator;
+ parser = parserCreate(encodingName, &parser->m_mem, tmp, newDtd);
+ }
+ else {
+ parser = parserCreate(encodingName, &parser->m_mem, NULL, newDtd);
+ }
+
+ if (!parser)
+ return NULL;
+
+ startElementHandler = oldStartElementHandler;
+ endElementHandler = oldEndElementHandler;
+ characterDataHandler = oldCharacterDataHandler;
+ processingInstructionHandler = oldProcessingInstructionHandler;
+ commentHandler = oldCommentHandler;
+ startCdataSectionHandler = oldStartCdataSectionHandler;
+ endCdataSectionHandler = oldEndCdataSectionHandler;
+ defaultHandler = oldDefaultHandler;
+ unparsedEntityDeclHandler = oldUnparsedEntityDeclHandler;
+ notationDeclHandler = oldNotationDeclHandler;
+ startNamespaceDeclHandler = oldStartNamespaceDeclHandler;
+ endNamespaceDeclHandler = oldEndNamespaceDeclHandler;
+ notStandaloneHandler = oldNotStandaloneHandler;
+ externalEntityRefHandler = oldExternalEntityRefHandler;
+ skippedEntityHandler = oldSkippedEntityHandler;
+ unknownEncodingHandler = oldUnknownEncodingHandler;
+ elementDeclHandler = oldElementDeclHandler;
+ attlistDeclHandler = oldAttlistDeclHandler;
+ entityDeclHandler = oldEntityDeclHandler;
+ xmlDeclHandler = oldXmlDeclHandler;
+ declElementType = oldDeclElementType;
+ userData = oldUserData;
+ if (oldUserData == oldHandlerArg)
+ handlerArg = userData;
+ else
+ handlerArg = parser;
+ if (oldExternalEntityRefHandlerArg != oldParser)
+ externalEntityRefHandlerArg = oldExternalEntityRefHandlerArg;
+ defaultExpandInternalEntities = oldDefaultExpandInternalEntities;
+ ns_triplets = oldns_triplets;
+ hash_secret_salt = oldhash_secret_salt;
+ parentParser = oldParser;
+#ifdef XML_DTD
+ paramEntityParsing = oldParamEntityParsing;
+ prologState.inEntityValue = oldInEntityValue;
+ if (context) {
+#endif /* XML_DTD */
+ if (!dtdCopy(oldParser, _dtd, oldDtd, &parser->m_mem)
+ || !setContext(parser, context)) {
+ XML_ParserFree(parser);
+ return NULL;
+ }
+ processor = externalEntityInitProcessor;
+#ifdef XML_DTD
+ }
+ else {
+ /* The DTD instance referenced by _dtd is shared between the document's
+ root parser and external PE parsers, therefore one does not need to
+ call setContext. In addition, one also *must* not call setContext,
+ because this would overwrite existing prefix->binding pointers in
+ _dtd with ones that get destroyed with the external PE parser.
+ This would leave those prefixes with dangling pointers.
+ */
+ isParamEntity = XML_TRUE;
+ XmlPrologStateInitExternalEntity(&prologState);
+ processor = externalParEntInitProcessor;
+ }
+#endif /* XML_DTD */
+ return parser;
+}
+
+static void FASTCALL
+destroyBindings(BINDING *bindings, XML_Parser parser)
+{
+ for (;;) {
+ BINDING *b = bindings;
+ if (!b)
+ break;
+ bindings = b->nextTagBinding;
+ FREE(b->uri);
+ FREE(b);
+ }
+}
+
+void XMLCALL
+XML_ParserFree(XML_Parser parser)
+{
+ TAG *tagList;
+ OPEN_INTERNAL_ENTITY *entityList;
+ if (parser == NULL)
+ return;
+ /* free tagStack and freeTagList */
+ tagList = tagStack;
+ for (;;) {
+ TAG *p;
+ if (tagList == NULL) {
+ if (freeTagList == NULL)
+ break;
+ tagList = freeTagList;
+ freeTagList = NULL;
+ }
+ p = tagList;
+ tagList = tagList->parent;
+ FREE(p->buf);
+ destroyBindings(p->bindings, parser);
+ FREE(p);
+ }
+ /* free openInternalEntities and freeInternalEntities */
+ entityList = openInternalEntities;
+ for (;;) {
+ OPEN_INTERNAL_ENTITY *openEntity;
+ if (entityList == NULL) {
+ if (freeInternalEntities == NULL)
+ break;
+ entityList = freeInternalEntities;
+ freeInternalEntities = NULL;
+ }
+ openEntity = entityList;
+ entityList = entityList->next;
+ FREE(openEntity);
+ }
+
+ destroyBindings(freeBindingList, parser);
+ destroyBindings(inheritedBindings, parser);
+ poolDestroy(&tempPool);
+ poolDestroy(&temp2Pool);
+#ifdef XML_DTD
+ /* external parameter entity parsers share the DTD structure
+ parser->m_dtd with the root parser, so we must not destroy it
+ */
+ if (!isParamEntity && _dtd)
+#else
+ if (_dtd)
+#endif /* XML_DTD */
+ dtdDestroy(_dtd, (XML_Bool)!parentParser, &parser->m_mem);
+ FREE((void *)atts);
+#ifdef XML_ATTR_INFO
+ FREE((void *)attInfo);
+#endif
+ FREE(groupConnector);
+ FREE(buffer);
+ FREE(dataBuf);
+ FREE(nsAtts);
+ FREE(unknownEncodingMem);
+ if (unknownEncodingRelease)
+ unknownEncodingRelease(unknownEncodingData);
+ FREE(parser);
+}
+
+void XMLCALL
+XML_UseParserAsHandlerArg(XML_Parser parser)
+{
+ handlerArg = parser;
+}
+
+enum XML_Error XMLCALL
+XML_UseForeignDTD(XML_Parser parser, XML_Bool useDTD)
+{
+#ifdef XML_DTD
+ /* block after XML_Parse()/XML_ParseBuffer() has been called */
+ if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)
+ return XML_ERROR_CANT_CHANGE_FEATURE_ONCE_PARSING;
+ useForeignDTD = useDTD;
+ return XML_ERROR_NONE;
+#else
+ return XML_ERROR_FEATURE_REQUIRES_XML_DTD;
+#endif
+}
+
+void XMLCALL
+XML_SetReturnNSTriplet(XML_Parser parser, int do_nst)
+{
+ /* block after XML_Parse()/XML_ParseBuffer() has been called */
+ if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)
+ return;
+ ns_triplets = do_nst ? XML_TRUE : XML_FALSE;
+}
+
+void XMLCALL
+XML_SetUserData(XML_Parser parser, void *p)
+{
+ if (handlerArg == userData)
+ handlerArg = userData = p;
+ else
+ userData = p;
+}
+
+enum XML_Status XMLCALL
+XML_SetBase(XML_Parser parser, const XML_Char *p)
+{
+ if (p) {
+ p = poolCopyString(&_dtd->pool, p);
+ if (!p)
+ return XML_STATUS_ERROR;
+ curBase = p;
+ }
+ else
+ curBase = NULL;
+ return XML_STATUS_OK;
+}
+
+const XML_Char * XMLCALL
+XML_GetBase(XML_Parser parser)
+{
+ return curBase;
+}
+
+int XMLCALL
+XML_GetSpecifiedAttributeCount(XML_Parser parser)
+{
+ return nSpecifiedAtts;
+}
+
+int XMLCALL
+XML_GetIdAttributeIndex(XML_Parser parser)
+{
+ return idAttIndex;
+}
+
+#ifdef XML_ATTR_INFO
+const XML_AttrInfo * XMLCALL
+XML_GetAttributeInfo(XML_Parser parser)
+{
+ return attInfo;
+}
+#endif
+
+void XMLCALL
+XML_SetElementHandler(XML_Parser parser,
+ XML_StartElementHandler start,
+ XML_EndElementHandler end)
+{
+ startElementHandler = start;
+ endElementHandler = end;
+}
+
+void XMLCALL
+XML_SetStartElementHandler(XML_Parser parser,
+ XML_StartElementHandler start) {
+ startElementHandler = start;
+}
+
+void XMLCALL
+XML_SetEndElementHandler(XML_Parser parser,
+ XML_EndElementHandler end) {
+ endElementHandler = end;
+}
+
+void XMLCALL
+XML_SetCharacterDataHandler(XML_Parser parser,
+ XML_CharacterDataHandler handler)
+{
+ characterDataHandler = handler;
+}
+
+void XMLCALL
+XML_SetProcessingInstructionHandler(XML_Parser parser,
+ XML_ProcessingInstructionHandler handler)
+{
+ processingInstructionHandler = handler;
+}
+
+void XMLCALL
+XML_SetCommentHandler(XML_Parser parser,
+ XML_CommentHandler handler)
+{
+ commentHandler = handler;
+}
+
+void XMLCALL
+XML_SetCdataSectionHandler(XML_Parser parser,
+ XML_StartCdataSectionHandler start,
+ XML_EndCdataSectionHandler end)
+{
+ startCdataSectionHandler = start;
+ endCdataSectionHandler = end;
+}
+
+void XMLCALL
+XML_SetStartCdataSectionHandler(XML_Parser parser,
+ XML_StartCdataSectionHandler start) {
+ startCdataSectionHandler = start;
+}
+
+void XMLCALL
+XML_SetEndCdataSectionHandler(XML_Parser parser,
+ XML_EndCdataSectionHandler end) {
+ endCdataSectionHandler = end;
+}
+
+void XMLCALL
+XML_SetDefaultHandler(XML_Parser parser,
+ XML_DefaultHandler handler)
+{
+ defaultHandler = handler;
+ defaultExpandInternalEntities = XML_FALSE;
+}
+
+void XMLCALL
+XML_SetDefaultHandlerExpand(XML_Parser parser,
+ XML_DefaultHandler handler)
+{
+ defaultHandler = handler;
+ defaultExpandInternalEntities = XML_TRUE;
+}
+
+void XMLCALL
+XML_SetDoctypeDeclHandler(XML_Parser parser,
+ XML_StartDoctypeDeclHandler start,
+ XML_EndDoctypeDeclHandler end)
+{
+ startDoctypeDeclHandler = start;
+ endDoctypeDeclHandler = end;
+}
+
+void XMLCALL
+XML_SetStartDoctypeDeclHandler(XML_Parser parser,
+ XML_StartDoctypeDeclHandler start) {
+ startDoctypeDeclHandler = start;
+}
+
+void XMLCALL
+XML_SetEndDoctypeDeclHandler(XML_Parser parser,
+ XML_EndDoctypeDeclHandler end) {
+ endDoctypeDeclHandler = end;
+}
+
+void XMLCALL
+XML_SetUnparsedEntityDeclHandler(XML_Parser parser,
+ XML_UnparsedEntityDeclHandler handler)
+{
+ unparsedEntityDeclHandler = handler;
+}
+
+void XMLCALL
+XML_SetNotationDeclHandler(XML_Parser parser,
+ XML_NotationDeclHandler handler)
+{
+ notationDeclHandler = handler;
+}
+
+void XMLCALL
+XML_SetNamespaceDeclHandler(XML_Parser parser,
+ XML_StartNamespaceDeclHandler start,
+ XML_EndNamespaceDeclHandler end)
+{
+ startNamespaceDeclHandler = start;
+ endNamespaceDeclHandler = end;
+}
+
+void XMLCALL
+XML_SetStartNamespaceDeclHandler(XML_Parser parser,
+ XML_StartNamespaceDeclHandler start) {
+ startNamespaceDeclHandler = start;
+}
+
+void XMLCALL
+XML_SetEndNamespaceDeclHandler(XML_Parser parser,
+ XML_EndNamespaceDeclHandler end) {
+ endNamespaceDeclHandler = end;
+}
+
+void XMLCALL
+XML_SetNotStandaloneHandler(XML_Parser parser,
+ XML_NotStandaloneHandler handler)
+{
+ notStandaloneHandler = handler;
+}
+
+void XMLCALL
+XML_SetExternalEntityRefHandler(XML_Parser parser,
+ XML_ExternalEntityRefHandler handler)
+{
+ externalEntityRefHandler = handler;
+}
+
+void XMLCALL
+XML_SetExternalEntityRefHandlerArg(XML_Parser parser, void *arg)
+{
+ if (arg)
+ externalEntityRefHandlerArg = (XML_Parser)arg;
+ else
+ externalEntityRefHandlerArg = parser;
+}
+
+void XMLCALL
+XML_SetSkippedEntityHandler(XML_Parser parser,
+ XML_SkippedEntityHandler handler)
+{
+ skippedEntityHandler = handler;
+}
+
+void XMLCALL
+XML_SetUnknownEncodingHandler(XML_Parser parser,
+ XML_UnknownEncodingHandler handler,
+ void *data)
+{
+ unknownEncodingHandler = handler;
+ unknownEncodingHandlerData = data;
+}
+
+void XMLCALL
+XML_SetElementDeclHandler(XML_Parser parser,
+ XML_ElementDeclHandler eldecl)
+{
+ elementDeclHandler = eldecl;
+}
+
+void XMLCALL
+XML_SetAttlistDeclHandler(XML_Parser parser,
+ XML_AttlistDeclHandler attdecl)
+{
+ attlistDeclHandler = attdecl;
+}
+
+void XMLCALL
+XML_SetEntityDeclHandler(XML_Parser parser,
+ XML_EntityDeclHandler handler)
+{
+ entityDeclHandler = handler;
+}
+
+void XMLCALL
+XML_SetXmlDeclHandler(XML_Parser parser,
+ XML_XmlDeclHandler handler) {
+ xmlDeclHandler = handler;
+}
+
+int XMLCALL
+XML_SetParamEntityParsing(XML_Parser parser,
+ enum XML_ParamEntityParsing peParsing)
+{
+ /* block after XML_Parse()/XML_ParseBuffer() has been called */
+ if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)
+ return 0;
+#ifdef XML_DTD
+ paramEntityParsing = peParsing;
+ return 1;
+#else
+ return peParsing == XML_PARAM_ENTITY_PARSING_NEVER;
+#endif
+}
+
+int XMLCALL
+XML_SetHashSalt(XML_Parser parser,
+ unsigned long hash_salt)
+{
+ /* block after XML_Parse()/XML_ParseBuffer() has been called */
+ if (ps_parsing == XML_PARSING || ps_parsing == XML_SUSPENDED)
+ return 0;
+ hash_secret_salt = hash_salt;
+ return 1;
+}
+
+enum XML_Status XMLCALL
+XML_Parse(XML_Parser parser, const char *s, int len, int isFinal)
+{
+ switch (ps_parsing) {
+ case XML_SUSPENDED:
+ errorCode = XML_ERROR_SUSPENDED;
+ return XML_STATUS_ERROR;
+ case XML_FINISHED:
+ errorCode = XML_ERROR_FINISHED;
+ return XML_STATUS_ERROR;
+ case XML_INITIALIZED:
+ if (parentParser == NULL && !startParsing(parser)) {
+ errorCode = XML_ERROR_NO_MEMORY;
+ return XML_STATUS_ERROR;
+ }
+ default:
+ ps_parsing = XML_PARSING;
+ }
+
+ if (len == 0) {
+ ps_finalBuffer = (XML_Bool)isFinal;
+ if (!isFinal)
+ return XML_STATUS_OK;
+ positionPtr = bufferPtr;
+ parseEndPtr = bufferEnd;
+
+ /* If data are left over from last buffer, and we now know that these
+ data are the final chunk of input, then we have to check them again
+ to detect errors based on that fact.
+ */
+ errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr);
+
+ if (errorCode == XML_ERROR_NONE) {
+ switch (ps_parsing) {
+ case XML_SUSPENDED:
+ XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position);
+ positionPtr = bufferPtr;
+ return XML_STATUS_SUSPENDED;
+ case XML_INITIALIZED:
+ case XML_PARSING:
+ ps_parsing = XML_FINISHED;
+ /* fall through */
+ default:
+ return XML_STATUS_OK;
+ }
+ }
+ eventEndPtr = eventPtr;
+ processor = errorProcessor;
+ return XML_STATUS_ERROR;
+ }
+#ifndef XML_CONTEXT_BYTES
+ else if (bufferPtr == bufferEnd) {
+ const char *end;
+ int nLeftOver;
+ enum XML_Status result;
+ parseEndByteIndex += len;
+ positionPtr = s;
+ ps_finalBuffer = (XML_Bool)isFinal;
+
+ errorCode = processor(parser, s, parseEndPtr = s + len, &end);
+
+ if (errorCode != XML_ERROR_NONE) {
+ eventEndPtr = eventPtr;
+ processor = errorProcessor;
+ return XML_STATUS_ERROR;
+ }
+ else {
+ switch (ps_parsing) {
+ case XML_SUSPENDED:
+ result = XML_STATUS_SUSPENDED;
+ break;
+ case XML_INITIALIZED:
+ case XML_PARSING:
+ if (isFinal) {
+ ps_parsing = XML_FINISHED;
+ return XML_STATUS_OK;
+ }
+ /* fall through */
+ default:
+ result = XML_STATUS_OK;
+ }
+ }
+
+ XmlUpdatePosition(encoding, positionPtr, end, &position);
+ nLeftOver = s + len - end;
+ if (nLeftOver) {
+ if (buffer == NULL || nLeftOver > bufferLim - buffer) {
+ /* FIXME avoid integer overflow */
+ char *temp;
+ temp = (buffer == NULL
+ ? (char *)MALLOC(len * 2)
+ : (char *)REALLOC(buffer, len * 2));
+ if (temp == NULL) {
+ errorCode = XML_ERROR_NO_MEMORY;
+ eventPtr = eventEndPtr = NULL;
+ processor = errorProcessor;
+ return XML_STATUS_ERROR;
+ }
+ buffer = temp;
+ bufferLim = buffer + len * 2;
+ }
+ memcpy(buffer, end, nLeftOver);
+ }
+ bufferPtr = buffer;
+ bufferEnd = buffer + nLeftOver;
+ positionPtr = bufferPtr;
+ parseEndPtr = bufferEnd;
+ eventPtr = bufferPtr;
+ eventEndPtr = bufferPtr;
+ return result;
+ }
+#endif /* not defined XML_CONTEXT_BYTES */
+ else {
+ void *buff = XML_GetBuffer(parser, len);
+ if (buff == NULL)
+ return XML_STATUS_ERROR;
+ else {
+ memcpy(buff, s, len);
+ return XML_ParseBuffer(parser, len, isFinal);
+ }
+ }
+}
+
+enum XML_Status XMLCALL
+XML_ParseBuffer(XML_Parser parser, int len, int isFinal)
+{
+ const char *start;
+ enum XML_Status result = XML_STATUS_OK;
+
+ switch (ps_parsing) {
+ case XML_SUSPENDED:
+ errorCode = XML_ERROR_SUSPENDED;
+ return XML_STATUS_ERROR;
+ case XML_FINISHED:
+ errorCode = XML_ERROR_FINISHED;
+ return XML_STATUS_ERROR;
+ case XML_INITIALIZED:
+ if (parentParser == NULL && !startParsing(parser)) {
+ errorCode = XML_ERROR_NO_MEMORY;
+ return XML_STATUS_ERROR;
+ }
+ default:
+ ps_parsing = XML_PARSING;
+ }
+
+ start = bufferPtr;
+ positionPtr = start;
+ bufferEnd += len;
+ parseEndPtr = bufferEnd;
+ parseEndByteIndex += len;
+ ps_finalBuffer = (XML_Bool)isFinal;
+
+ errorCode = processor(parser, start, parseEndPtr, &bufferPtr);
+
+ if (errorCode != XML_ERROR_NONE) {
+ eventEndPtr = eventPtr;
+ processor = errorProcessor;
+ return XML_STATUS_ERROR;
+ }
+ else {
+ switch (ps_parsing) {
+ case XML_SUSPENDED:
+ result = XML_STATUS_SUSPENDED;
+ break;
+ case XML_INITIALIZED:
+ case XML_PARSING:
+ if (isFinal) {
+ ps_parsing = XML_FINISHED;
+ return result;
+ }
+ default: ; /* should not happen */
+ }
+ }
+
+ XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position);
+ positionPtr = bufferPtr;
+ return result;
+}
+
+void * XMLCALL
+XML_GetBuffer(XML_Parser parser, int len)
+{
+ if (len < 0) {
+ errorCode = XML_ERROR_NO_MEMORY;
+ return NULL;
+ }
+ switch (ps_parsing) {
+ case XML_SUSPENDED:
+ errorCode = XML_ERROR_SUSPENDED;
+ return NULL;
+ case XML_FINISHED:
+ errorCode = XML_ERROR_FINISHED;
+ return NULL;
+ default: ;
+ }
+
+ if (len > bufferLim - bufferEnd) {
+#ifdef XML_CONTEXT_BYTES
+ int keep;
+#endif /* defined XML_CONTEXT_BYTES */
+ /* Do not invoke signed arithmetic overflow: */
+ int neededSize = (int) ((unsigned)len + (unsigned)(bufferEnd - bufferPtr));
+ if (neededSize < 0) {
+ errorCode = XML_ERROR_NO_MEMORY;
+ return NULL;
+ }
+#ifdef XML_CONTEXT_BYTES
+ keep = (int)(bufferPtr - buffer);
+ if (keep > XML_CONTEXT_BYTES)
+ keep = XML_CONTEXT_BYTES;
+ neededSize += keep;
+#endif /* defined XML_CONTEXT_BYTES */
+ if (neededSize <= bufferLim - buffer) {
+#ifdef XML_CONTEXT_BYTES
+ if (keep < bufferPtr - buffer) {
+ int offset = (int)(bufferPtr - buffer) - keep;
+ memmove(buffer, &buffer[offset], bufferEnd - bufferPtr + keep);
+ bufferEnd -= offset;
+ bufferPtr -= offset;
+ }
+#else
+ memmove(buffer, bufferPtr, bufferEnd - bufferPtr);
+ bufferEnd = buffer + (bufferEnd - bufferPtr);
+ bufferPtr = buffer;
+#endif /* not defined XML_CONTEXT_BYTES */
+ }
+ else {
+ char *newBuf;
+ int bufferSize = (int)(bufferLim - bufferPtr);
+ if (bufferSize == 0)
+ bufferSize = INIT_BUFFER_SIZE;
+ do {
+ /* Do not invoke signed arithmetic overflow: */
+ bufferSize = (int) (2U * (unsigned) bufferSize);
+ } while (bufferSize < neededSize && bufferSize > 0);
+ if (bufferSize <= 0) {
+ errorCode = XML_ERROR_NO_MEMORY;
+ return NULL;
+ }
+ newBuf = (char *)MALLOC(bufferSize);
+ if (newBuf == 0) {
+ errorCode = XML_ERROR_NO_MEMORY;
+ return NULL;
+ }
+ bufferLim = newBuf + bufferSize;
+#ifdef XML_CONTEXT_BYTES
+ if (bufferPtr) {
+ int keep = (int)(bufferPtr - buffer);
+ if (keep > XML_CONTEXT_BYTES)
+ keep = XML_CONTEXT_BYTES;
+ memcpy(newBuf, &bufferPtr[-keep], bufferEnd - bufferPtr + keep);
+ FREE(buffer);
+ buffer = newBuf;
+ bufferEnd = buffer + (bufferEnd - bufferPtr) + keep;
+ bufferPtr = buffer + keep;
+ }
+ else {
+ bufferEnd = newBuf + (bufferEnd - bufferPtr);
+ bufferPtr = buffer = newBuf;
+ }
+#else
+ if (bufferPtr) {
+ memcpy(newBuf, bufferPtr, bufferEnd - bufferPtr);
+ FREE(buffer);
+ }
+ bufferEnd = newBuf + (bufferEnd - bufferPtr);
+ bufferPtr = buffer = newBuf;
+#endif /* not defined XML_CONTEXT_BYTES */
+ }
+ eventPtr = eventEndPtr = NULL;
+ positionPtr = NULL;
+ }
+ return bufferEnd;
+}
+
+enum XML_Status XMLCALL
+XML_StopParser(XML_Parser parser, XML_Bool resumable)
+{
+ switch (ps_parsing) {
+ case XML_SUSPENDED:
+ if (resumable) {
+ errorCode = XML_ERROR_SUSPENDED;
+ return XML_STATUS_ERROR;
+ }
+ ps_parsing = XML_FINISHED;
+ break;
+ case XML_FINISHED:
+ errorCode = XML_ERROR_FINISHED;
+ return XML_STATUS_ERROR;
+ default:
+ if (resumable) {
+#ifdef XML_DTD
+ if (isParamEntity) {
+ errorCode = XML_ERROR_SUSPEND_PE;
+ return XML_STATUS_ERROR;
+ }
+#endif
+ ps_parsing = XML_SUSPENDED;
+ }
+ else
+ ps_parsing = XML_FINISHED;
+ }
+ return XML_STATUS_OK;
+}
+
+enum XML_Status XMLCALL
+XML_ResumeParser(XML_Parser parser)
+{
+ enum XML_Status result = XML_STATUS_OK;
+
+ if (ps_parsing != XML_SUSPENDED) {
+ errorCode = XML_ERROR_NOT_SUSPENDED;
+ return XML_STATUS_ERROR;
+ }
+ ps_parsing = XML_PARSING;
+
+ errorCode = processor(parser, bufferPtr, parseEndPtr, &bufferPtr);
+
+ if (errorCode != XML_ERROR_NONE) {
+ eventEndPtr = eventPtr;
+ processor = errorProcessor;
+ return XML_STATUS_ERROR;
+ }
+ else {
+ switch (ps_parsing) {
+ case XML_SUSPENDED:
+ result = XML_STATUS_SUSPENDED;
+ break;
+ case XML_INITIALIZED:
+ case XML_PARSING:
+ if (ps_finalBuffer) {
+ ps_parsing = XML_FINISHED;
+ return result;
+ }
+ default: ;
+ }
+ }
+
+ XmlUpdatePosition(encoding, positionPtr, bufferPtr, &position);
+ positionPtr = bufferPtr;
+ return result;
+}
+
+void XMLCALL
+XML_GetParsingStatus(XML_Parser parser, XML_ParsingStatus *status)
+{
+ assert(status != NULL);
+ *status = parser->m_parsingStatus;
+}
+
+enum XML_Error XMLCALL
+XML_GetErrorCode(XML_Parser parser)
+{
+ return errorCode;
+}
+
+XML_Index XMLCALL
+XML_GetCurrentByteIndex(XML_Parser parser)
+{
+ if (eventPtr)
+ return (XML_Index)(parseEndByteIndex - (parseEndPtr - eventPtr));
+ return -1;
+}
+
+int XMLCALL
+XML_GetCurrentByteCount(XML_Parser parser)
+{
+ if (eventEndPtr && eventPtr)
+ return (int)(eventEndPtr - eventPtr);
+ return 0;
+}
+
+const char * XMLCALL
+XML_GetInputContext(XML_Parser parser, int *offset, int *size)
+{
+#ifdef XML_CONTEXT_BYTES
+ if (eventPtr && buffer) {
+ *offset = (int)(eventPtr - buffer);
+ *size = (int)(bufferEnd - buffer);
+ return buffer;
+ }
+#endif /* defined XML_CONTEXT_BYTES */
+ return (char *) 0;
+}
+
+XML_Size XMLCALL
+XML_GetCurrentLineNumber(XML_Parser parser)
+{
+ if (eventPtr && eventPtr >= positionPtr) {
+ XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);
+ positionPtr = eventPtr;
+ }
+ return position.lineNumber + 1;
+}
+
+XML_Size XMLCALL
+XML_GetCurrentColumnNumber(XML_Parser parser)
+{
+ if (eventPtr && eventPtr >= positionPtr) {
+ XmlUpdatePosition(encoding, positionPtr, eventPtr, &position);
+ positionPtr = eventPtr;
+ }
+ return position.columnNumber;
+}
+
+void XMLCALL
+XML_FreeContentModel(XML_Parser parser, XML_Content *model)
+{
+ FREE(model);
+}
+
+void * XMLCALL
+XML_MemMalloc(XML_Parser parser, size_t size)
+{
+ return MALLOC(size);
+}
+
+void * XMLCALL
+XML_MemRealloc(XML_Parser parser, void *ptr, size_t size)
+{
+ return REALLOC(ptr, size);
+}
+
+void XMLCALL
+XML_MemFree(XML_Parser parser, void *ptr)
+{
+ FREE(ptr);
+}
+
+void XMLCALL
+XML_DefaultCurrent(XML_Parser parser)
+{
+ if (defaultHandler) {
+ if (openInternalEntities)
+ reportDefault(parser,
+ internalEncoding,
+ openInternalEntities->internalEventPtr,
+ openInternalEntities->internalEventEndPtr);
+ else
+ reportDefault(parser, encoding, eventPtr, eventEndPtr);
+ }
+}
+
+const XML_LChar * XMLCALL
+XML_ErrorString(enum XML_Error code)
+{
+ static const XML_LChar* const message[] = {
+ 0,
+ XML_L("out of memory"),
+ XML_L("syntax error"),
+ XML_L("no element found"),
+ XML_L("not well-formed (invalid token)"),
+ XML_L("unclosed token"),
+ XML_L("partial character"),
+ XML_L("mismatched tag"),
+ XML_L("duplicate attribute"),
+ XML_L("junk after document element"),
+ XML_L("illegal parameter entity reference"),
+ XML_L("undefined entity"),
+ XML_L("recursive entity reference"),
+ XML_L("asynchronous entity"),
+ XML_L("reference to invalid character number"),
+ XML_L("reference to binary entity"),
+ XML_L("reference to external entity in attribute"),
+ XML_L("XML or text declaration not at start of entity"),
+ XML_L("unknown encoding"),
+ XML_L("encoding specified in XML declaration is incorrect"),
+ XML_L("unclosed CDATA section"),
+ XML_L("error in processing external entity reference"),
+ XML_L("document is not standalone"),
+ XML_L("unexpected parser state - please send a bug report"),
+ XML_L("entity declared in parameter entity"),
+ XML_L("requested feature requires XML_DTD support in Expat"),
+ XML_L("cannot change setting once parsing has begun"),
+ XML_L("unbound prefix"),
+ XML_L("must not undeclare prefix"),
+ XML_L("incomplete markup in parameter entity"),
+ XML_L("XML declaration not well-formed"),
+ XML_L("text declaration not well-formed"),
+ XML_L("illegal character(s) in public id"),
+ XML_L("parser suspended"),
+ XML_L("parser not suspended"),
+ XML_L("parsing aborted"),
+ XML_L("parsing finished"),
+ XML_L("cannot suspend in external parameter entity"),
+ XML_L("reserved prefix (xml) must not be undeclared or bound to another namespace name"),
+ XML_L("reserved prefix (xmlns) must not be declared or undeclared"),
+ XML_L("prefix must not be bound to one of the reserved namespace names")
+ };
+ if (code > 0 && code < sizeof(message)/sizeof(message[0]))
+ return message[code];
+ return NULL;
+}
+
+const XML_LChar * XMLCALL
+XML_ExpatVersion(void) {
+
+ /* V1 is used to string-ize the version number. However, it would
+ string-ize the actual version macro *names* unless we get them
+ substituted before being passed to V1. CPP is defined to expand
+ a macro, then rescan for more expansions. Thus, we use V2 to expand
+ the version macros, then CPP will expand the resulting V1() macro
+ with the correct numerals. */
+ /* ### I'm assuming cpp is portable in this respect... */
+
+#define V1(a,b,c) XML_L(#a)XML_L(".")XML_L(#b)XML_L(".")XML_L(#c)
+#define V2(a,b,c) XML_L("expat_")V1(a,b,c)
+
+ return V2(XML_MAJOR_VERSION, XML_MINOR_VERSION, XML_MICRO_VERSION);
+
+#undef V1
+#undef V2
+}
+
+XML_Expat_Version XMLCALL
+XML_ExpatVersionInfo(void)
+{
+ XML_Expat_Version version;
+
+ version.major = XML_MAJOR_VERSION;
+ version.minor = XML_MINOR_VERSION;
+ version.micro = XML_MICRO_VERSION;
+
+ return version;
+}
+
+const XML_Feature * XMLCALL
+XML_GetFeatureList(void)
+{
+ static const XML_Feature features[] = {
+ {XML_FEATURE_SIZEOF_XML_CHAR, XML_L("sizeof(XML_Char)"),
+ sizeof(XML_Char)},
+ {XML_FEATURE_SIZEOF_XML_LCHAR, XML_L("sizeof(XML_LChar)"),
+ sizeof(XML_LChar)},
+#ifdef XML_UNICODE
+ {XML_FEATURE_UNICODE, XML_L("XML_UNICODE"), 0},
+#endif
+#ifdef XML_UNICODE_WCHAR_T
+ {XML_FEATURE_UNICODE_WCHAR_T, XML_L("XML_UNICODE_WCHAR_T"), 0},
+#endif
+#ifdef XML_DTD
+ {XML_FEATURE_DTD, XML_L("XML_DTD"), 0},
+#endif
+#ifdef XML_CONTEXT_BYTES
+ {XML_FEATURE_CONTEXT_BYTES, XML_L("XML_CONTEXT_BYTES"),
+ XML_CONTEXT_BYTES},
+#endif
+#ifdef XML_MIN_SIZE
+ {XML_FEATURE_MIN_SIZE, XML_L("XML_MIN_SIZE"), 0},
+#endif
+#ifdef XML_NS
+ {XML_FEATURE_NS, XML_L("XML_NS"), 0},
+#endif
+#ifdef XML_LARGE_SIZE
+ {XML_FEATURE_LARGE_SIZE, XML_L("XML_LARGE_SIZE"), 0},
+#endif
+#ifdef XML_ATTR_INFO
+ {XML_FEATURE_ATTR_INFO, XML_L("XML_ATTR_INFO"), 0},
+#endif
+ {XML_FEATURE_END, NULL, 0}
+ };
+
+ return features;
+}
+
+/* Initially tag->rawName always points into the parse buffer;
+ for those TAG instances opened while the current parse buffer was
+ processed, and not yet closed, we need to store tag->rawName in a more
+ permanent location, since the parse buffer is about to be discarded.
+*/
+static XML_Bool
+storeRawNames(XML_Parser parser)
+{
+ TAG *tag = tagStack;
+ while (tag) {
+ int bufSize;
+ int nameLen = sizeof(XML_Char) * (tag->name.strLen + 1);
+ char *rawNameBuf = tag->buf + nameLen;
+ /* Stop if already stored. Since tagStack is a stack, we can stop
+ at the first entry that has already been copied; everything
+ below it in the stack is already been accounted for in a
+ previous call to this function.
+ */
+ if (tag->rawName == rawNameBuf)
+ break;
+ /* For re-use purposes we need to ensure that the
+ size of tag->buf is a multiple of sizeof(XML_Char).
+ */
+ bufSize = nameLen + ROUND_UP(tag->rawNameLength, sizeof(XML_Char));
+ if (bufSize > tag->bufEnd - tag->buf) {
+ char *temp = (char *)REALLOC(tag->buf, bufSize);
+ if (temp == NULL)
+ return XML_FALSE;
+ /* if tag->name.str points to tag->buf (only when namespace
+ processing is off) then we have to update it
+ */
+ if (tag->name.str == (XML_Char *)tag->buf)
+ tag->name.str = (XML_Char *)temp;
+ /* if tag->name.localPart is set (when namespace processing is on)
+ then update it as well, since it will always point into tag->buf
+ */
+ if (tag->name.localPart)
+ tag->name.localPart = (XML_Char *)temp + (tag->name.localPart -
+ (XML_Char *)tag->buf);
+ tag->buf = temp;
+ tag->bufEnd = temp + bufSize;
+ rawNameBuf = temp + nameLen;
+ }
+ memcpy(rawNameBuf, tag->rawName, tag->rawNameLength);
+ tag->rawName = rawNameBuf;
+ tag = tag->parent;
+ }
+ return XML_TRUE;
+}
+
+static enum XML_Error PTRCALL
+contentProcessor(XML_Parser parser,
+ const char *start,
+ const char *end,
+ const char **endPtr)
+{
+ enum XML_Error result = doContent(parser, 0, encoding, start, end,
+ endPtr, (XML_Bool)!ps_finalBuffer);
+ if (result == XML_ERROR_NONE) {
+ if (!storeRawNames(parser))
+ return XML_ERROR_NO_MEMORY;
+ }
+ return result;
+}
+
+static enum XML_Error PTRCALL
+externalEntityInitProcessor(XML_Parser parser,
+ const char *start,
+ const char *end,
+ const char **endPtr)
+{
+ enum XML_Error result = initializeEncoding(parser);
+ if (result != XML_ERROR_NONE)
+ return result;
+ processor = externalEntityInitProcessor2;
+ return externalEntityInitProcessor2(parser, start, end, endPtr);
+}
+
+static enum XML_Error PTRCALL
+externalEntityInitProcessor2(XML_Parser parser,
+ const char *start,
+ const char *end,
+ const char **endPtr)
+{
+ const char *next = start; /* XmlContentTok doesn't always set the last arg */
+ int tok = XmlContentTok(encoding, start, end, &next);
+ switch (tok) {
+ case XML_TOK_BOM:
+ /* If we are at the end of the buffer, this would cause the next stage,
+ i.e. externalEntityInitProcessor3, to pass control directly to
+ doContent (by detecting XML_TOK_NONE) without processing any xml text
+ declaration - causing the error XML_ERROR_MISPLACED_XML_PI in doContent.
+ */
+ if (next == end && !ps_finalBuffer) {
+ *endPtr = next;
+ return XML_ERROR_NONE;
+ }
+ start = next;
+ break;
+ case XML_TOK_PARTIAL:
+ if (!ps_finalBuffer) {
+ *endPtr = start;
+ return XML_ERROR_NONE;
+ }
+ eventPtr = start;
+ return XML_ERROR_UNCLOSED_TOKEN;
+ case XML_TOK_PARTIAL_CHAR:
+ if (!ps_finalBuffer) {
+ *endPtr = start;
+ return XML_ERROR_NONE;
+ }
+ eventPtr = start;
+ return XML_ERROR_PARTIAL_CHAR;
+ }
+ processor = externalEntityInitProcessor3;
+ return externalEntityInitProcessor3(parser, start, end, endPtr);
+}
+
+static enum XML_Error PTRCALL
+externalEntityInitProcessor3(XML_Parser parser,
+ const char *start,
+ const char *end,
+ const char **endPtr)
+{
+ int tok;
+ const char *next = start; /* XmlContentTok doesn't always set the last arg */
+ eventPtr = start;
+ tok = XmlContentTok(encoding, start, end, &next);
+ eventEndPtr = next;
+
+ switch (tok) {
+ case XML_TOK_XML_DECL:
+ {
+ enum XML_Error result;
+ result = processXmlDecl(parser, 1, start, next);
+ if (result != XML_ERROR_NONE)
+ return result;
+ switch (ps_parsing) {
+ case XML_SUSPENDED:
+ *endPtr = next;
+ return XML_ERROR_NONE;
+ case XML_FINISHED:
+ return XML_ERROR_ABORTED;
+ default:
+ start = next;
+ }
+ }
+ break;
+ case XML_TOK_PARTIAL:
+ if (!ps_finalBuffer) {
+ *endPtr = start;
+ return XML_ERROR_NONE;
+ }
+ return XML_ERROR_UNCLOSED_TOKEN;
+ case XML_TOK_PARTIAL_CHAR:
+ if (!ps_finalBuffer) {
+ *endPtr = start;
+ return XML_ERROR_NONE;
+ }
+ return XML_ERROR_PARTIAL_CHAR;
+ }
+ processor = externalEntityContentProcessor;
+ tagLevel = 1;
+ return externalEntityContentProcessor(parser, start, end, endPtr);
+}
+
+static enum XML_Error PTRCALL
+externalEntityContentProcessor(XML_Parser parser,
+ const char *start,
+ const char *end,
+ const char **endPtr)
+{
+ enum XML_Error result = doContent(parser, 1, encoding, start, end,
+ endPtr, (XML_Bool)!ps_finalBuffer);
+ if (result == XML_ERROR_NONE) {
+ if (!storeRawNames(parser))
+ return XML_ERROR_NO_MEMORY;
+ }
+ return result;
+}
+
+static enum XML_Error
+doContent(XML_Parser parser,
+ int startTagLevel,
+ const ENCODING *enc,
+ const char *s,
+ const char *end,
+ const char **nextPtr,
+ XML_Bool haveMore)
+{
+ /* save one level of indirection */
+ DTD * const dtd = _dtd;
+
+ const char **eventPP;
+ const char **eventEndPP;
+ if (enc == encoding) {
+ eventPP = &eventPtr;
+ eventEndPP = &eventEndPtr;
+ }
+ else {
+ eventPP = &(openInternalEntities->internalEventPtr);
+ eventEndPP = &(openInternalEntities->internalEventEndPtr);
+ }
+ *eventPP = s;
+
+ for (;;) {
+ const char *next = s; /* XmlContentTok doesn't always set the last arg */
+ int tok = XmlContentTok(enc, s, end, &next);
+ *eventEndPP = next;
+ switch (tok) {
+ case XML_TOK_TRAILING_CR:
+ if (haveMore) {
+ *nextPtr = s;
+ return XML_ERROR_NONE;
+ }
+ *eventEndPP = end;
+ if (characterDataHandler) {
+ XML_Char c = 0xA;
+ characterDataHandler(handlerArg, &c, 1);
+ }
+ else if (defaultHandler)
+ reportDefault(parser, enc, s, end);
+ /* We are at the end of the final buffer, should we check for
+ XML_SUSPENDED, XML_FINISHED?
+ */
+ if (startTagLevel == 0)
+ return XML_ERROR_NO_ELEMENTS;
+ if (tagLevel != startTagLevel)
+ return XML_ERROR_ASYNC_ENTITY;
+ *nextPtr = end;
+ return XML_ERROR_NONE;
+ case XML_TOK_NONE:
+ if (haveMore) {
+ *nextPtr = s;
+ return XML_ERROR_NONE;
+ }
+ if (startTagLevel > 0) {
+ if (tagLevel != startTagLevel)
+ return XML_ERROR_ASYNC_ENTITY;
+ *nextPtr = s;
+ return XML_ERROR_NONE;
+ }
+ return XML_ERROR_NO_ELEMENTS;
+ case XML_TOK_INVALID:
+ *eventPP = next;
+ return XML_ERROR_INVALID_TOKEN;
+ case XML_TOK_PARTIAL:
+ if (haveMore) {
+ *nextPtr = s;
+ return XML_ERROR_NONE;
+ }
+ return XML_ERROR_UNCLOSED_TOKEN;
+ case XML_TOK_PARTIAL_CHAR:
+ if (haveMore) {
+ *nextPtr = s;
+ return XML_ERROR_NONE;
+ }
+ return XML_ERROR_PARTIAL_CHAR;
+ case XML_TOK_ENTITY_REF:
+ {
+ const XML_Char *name;
+ ENTITY *entity;
+ XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc,
+ s + enc->minBytesPerChar,
+ next - enc->minBytesPerChar);
+ if (ch) {
+ if (characterDataHandler)
+ characterDataHandler(handlerArg, &ch, 1);
+ else if (defaultHandler)
+ reportDefault(parser, enc, s, next);
+ break;
+ }
+ name = poolStoreString(&dtd->pool, enc,
+ s + enc->minBytesPerChar,
+ next - enc->minBytesPerChar);
+ if (!name)
+ return XML_ERROR_NO_MEMORY;
+ entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0);
+ poolDiscard(&dtd->pool);
+ /* First, determine if a check for an existing declaration is needed;
+ if yes, check that the entity exists, and that it is internal,
+ otherwise call the skipped entity or default handler.
+ */
+ if (!dtd->hasParamEntityRefs || dtd->standalone) {
+ if (!entity)
+ return XML_ERROR_UNDEFINED_ENTITY;
+ else if (!entity->is_internal)
+ return XML_ERROR_ENTITY_DECLARED_IN_PE;
+ }
+ else if (!entity) {
+ if (skippedEntityHandler)
+ skippedEntityHandler(handlerArg, name, 0);
+ else if (defaultHandler)
+ reportDefault(parser, enc, s, next);
+ break;
+ }
+ if (entity->open)
+ return XML_ERROR_RECURSIVE_ENTITY_REF;
+ if (entity->notation)
+ return XML_ERROR_BINARY_ENTITY_REF;
+ if (entity->textPtr) {
+ enum XML_Error result;
+ if (!defaultExpandInternalEntities) {
+ if (skippedEntityHandler)
+ skippedEntityHandler(handlerArg, entity->name, 0);
+ else if (defaultHandler)
+ reportDefault(parser, enc, s, next);
+ break;
+ }
+ result = processInternalEntity(parser, entity, XML_FALSE);
+ if (result != XML_ERROR_NONE)
+ return result;
+ }
+ else if (externalEntityRefHandler) {
+ const XML_Char *context;
+ entity->open = XML_TRUE;
+ context = getContext(parser);
+ entity->open = XML_FALSE;
+ if (!context)
+ return XML_ERROR_NO_MEMORY;
+ if (!externalEntityRefHandler(externalEntityRefHandlerArg,
+ context,
+ entity->base,
+ entity->systemId,
+ entity->publicId))
+ return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
+ poolDiscard(&tempPool);
+ }
+ else if (defaultHandler)
+ reportDefault(parser, enc, s, next);
+ break;
+ }
+ case XML_TOK_START_TAG_NO_ATTS:
+ /* fall through */
+ case XML_TOK_START_TAG_WITH_ATTS:
+ {
+ TAG *tag;
+ enum XML_Error result;
+ XML_Char *toPtr;
+ if (freeTagList) {
+ tag = freeTagList;
+ freeTagList = freeTagList->parent;
+ }
+ else {
+ tag = (TAG *)MALLOC(sizeof(TAG));
+ if (!tag)
+ return XML_ERROR_NO_MEMORY;
+ tag->buf = (char *)MALLOC(INIT_TAG_BUF_SIZE);
+ if (!tag->buf) {
+ FREE(tag);
+ return XML_ERROR_NO_MEMORY;
+ }
+ tag->bufEnd = tag->buf + INIT_TAG_BUF_SIZE;
+ }
+ tag->bindings = NULL;
+ tag->parent = tagStack;
+ tagStack = tag;
+ tag->name.localPart = NULL;
+ tag->name.prefix = NULL;
+ tag->rawName = s + enc->minBytesPerChar;
+ tag->rawNameLength = XmlNameLength(enc, tag->rawName);
+ ++tagLevel;
+ {
+ const char *rawNameEnd = tag->rawName + tag->rawNameLength;
+ const char *fromPtr = tag->rawName;
+ toPtr = (XML_Char *)tag->buf;
+ for (;;) {
+ int bufSize;
+ int convLen;
+ const enum XML_Convert_Result convert_res = XmlConvert(enc,
+ &fromPtr, rawNameEnd,
+ (ICHAR **)&toPtr, (ICHAR *)tag->bufEnd - 1);
+ convLen = (int)(toPtr - (XML_Char *)tag->buf);
+ if ((convert_res == XML_CONVERT_COMPLETED) || (convert_res == XML_CONVERT_INPUT_INCOMPLETE)) {
+ tag->name.strLen = convLen;
+ break;
+ }
+ bufSize = (int)(tag->bufEnd - tag->buf) << 1;
+ {
+ char *temp = (char *)REALLOC(tag->buf, bufSize);
+ if (temp == NULL)
+ return XML_ERROR_NO_MEMORY;
+ tag->buf = temp;
+ tag->bufEnd = temp + bufSize;
+ toPtr = (XML_Char *)temp + convLen;
+ }
+ }
+ }
+ tag->name.str = (XML_Char *)tag->buf;
+ *toPtr = XML_T('\0');
+ result = storeAtts(parser, enc, s, &(tag->name), &(tag->bindings));
+ if (result)
+ return result;
+ if (startElementHandler)
+ startElementHandler(handlerArg, tag->name.str,
+ (const XML_Char **)atts);
+ else if (defaultHandler)
+ reportDefault(parser, enc, s, next);
+ poolClear(&tempPool);
+ break;
+ }
+ case XML_TOK_EMPTY_ELEMENT_NO_ATTS:
+ /* fall through */
+ case XML_TOK_EMPTY_ELEMENT_WITH_ATTS:
+ {
+ const char *rawName = s + enc->minBytesPerChar;
+ enum XML_Error result;
+ BINDING *bindings = NULL;
+ XML_Bool noElmHandlers = XML_TRUE;
+ TAG_NAME name;
+ name.str = poolStoreString(&tempPool, enc, rawName,
+ rawName + XmlNameLength(enc, rawName));
+ if (!name.str)
+ return XML_ERROR_NO_MEMORY;
+ poolFinish(&tempPool);
+ result = storeAtts(parser, enc, s, &name, &bindings);
+ if (result)
+ return result;
+ poolFinish(&tempPool);
+ if (startElementHandler) {
+ startElementHandler(handlerArg, name.str, (const XML_Char **)atts);
+ noElmHandlers = XML_FALSE;
+ }
+ if (endElementHandler) {
+ if (startElementHandler)
+ *eventPP = *eventEndPP;
+ endElementHandler(handlerArg, name.str);
+ noElmHandlers = XML_FALSE;
+ }
+ if (noElmHandlers && defaultHandler)
+ reportDefault(parser, enc, s, next);
+ poolClear(&tempPool);
+ while (bindings) {
+ BINDING *b = bindings;
+ if (endNamespaceDeclHandler)
+ endNamespaceDeclHandler(handlerArg, b->prefix->name);
+ bindings = bindings->nextTagBinding;
+ b->nextTagBinding = freeBindingList;
+ freeBindingList = b;
+ b->prefix->binding = b->prevPrefixBinding;
+ }
+ }
+ if (tagLevel == 0)
+ return epilogProcessor(parser, next, end, nextPtr);
+ break;
+ case XML_TOK_END_TAG:
+ if (tagLevel == startTagLevel)
+ return XML_ERROR_ASYNC_ENTITY;
+ else {
+ int len;
+ const char *rawName;
+ TAG *tag = tagStack;
+ tagStack = tag->parent;
+ tag->parent = freeTagList;
+ freeTagList = tag;
+ rawName = s + enc->minBytesPerChar*2;
+ len = XmlNameLength(enc, rawName);
+ if (len != tag->rawNameLength
+ || memcmp(tag->rawName, rawName, len) != 0) {
+ *eventPP = rawName;
+ return XML_ERROR_TAG_MISMATCH;
+ }
+ --tagLevel;
+ if (endElementHandler) {
+ const XML_Char *localPart;
+ const XML_Char *prefix;
+ XML_Char *uri;
+ localPart = tag->name.localPart;
+ if (ns && localPart) {
+ /* localPart and prefix may have been overwritten in
+ tag->name.str, since this points to the binding->uri
+ buffer which gets re-used; so we have to add them again
+ */
+ uri = (XML_Char *)tag->name.str + tag->name.uriLen;
+ /* don't need to check for space - already done in storeAtts() */
+ while (*localPart) *uri++ = *localPart++;
+ prefix = (XML_Char *)tag->name.prefix;
+ if (ns_triplets && prefix) {
+ *uri++ = namespaceSeparator;
+ while (*prefix) *uri++ = *prefix++;
+ }
+ *uri = XML_T('\0');
+ }
+ endElementHandler(handlerArg, tag->name.str);
+ }
+ else if (defaultHandler)
+ reportDefault(parser, enc, s, next);
+ while (tag->bindings) {
+ BINDING *b = tag->bindings;
+ if (endNamespaceDeclHandler)
+ endNamespaceDeclHandler(handlerArg, b->prefix->name);
+ tag->bindings = tag->bindings->nextTagBinding;
+ b->nextTagBinding = freeBindingList;
+ freeBindingList = b;
+ b->prefix->binding = b->prevPrefixBinding;
+ }
+ if (tagLevel == 0)
+ return epilogProcessor(parser, next, end, nextPtr);
+ }
+ break;
+ case XML_TOK_CHAR_REF:
+ {
+ int n = XmlCharRefNumber(enc, s);
+ if (n < 0)
+ return XML_ERROR_BAD_CHAR_REF;
+ if (characterDataHandler) {
+ XML_Char buf[XML_ENCODE_MAX];
+ characterDataHandler(handlerArg, buf, XmlEncode(n, (ICHAR *)buf));
+ }
+ else if (defaultHandler)
+ reportDefault(parser, enc, s, next);
+ }
+ break;
+ case XML_TOK_XML_DECL:
+ return XML_ERROR_MISPLACED_XML_PI;
+ case XML_TOK_DATA_NEWLINE:
+ if (characterDataHandler) {
+ XML_Char c = 0xA;
+ characterDataHandler(handlerArg, &c, 1);
+ }
+ else if (defaultHandler)
+ reportDefault(parser, enc, s, next);
+ break;
+ case XML_TOK_CDATA_SECT_OPEN:
+ {
+ enum XML_Error result;
+ if (startCdataSectionHandler)
+ startCdataSectionHandler(handlerArg);
+#if 0
+ /* Suppose you doing a transformation on a document that involves
+ changing only the character data. You set up a defaultHandler
+ and a characterDataHandler. The defaultHandler simply copies
+ characters through. The characterDataHandler does the
+ transformation and writes the characters out escaping them as
+ necessary. This case will fail to work if we leave out the
+ following two lines (because & and < inside CDATA sections will
+ be incorrectly escaped).
+
+ However, now we have a start/endCdataSectionHandler, so it seems
+ easier to let the user deal with this.
+ */
+ else if (characterDataHandler)
+ characterDataHandler(handlerArg, dataBuf, 0);
+#endif
+ else if (defaultHandler)
+ reportDefault(parser, enc, s, next);
+ result = doCdataSection(parser, enc, &next, end, nextPtr, haveMore);
+ if (result != XML_ERROR_NONE)
+ return result;
+ else if (!next) {
+ processor = cdataSectionProcessor;
+ return result;
+ }
+ }
+ break;
+ case XML_TOK_TRAILING_RSQB:
+ if (haveMore) {
+ *nextPtr = s;
+ return XML_ERROR_NONE;
+ }
+ if (characterDataHandler) {
+ if (MUST_CONVERT(enc, s)) {
+ ICHAR *dataPtr = (ICHAR *)dataBuf;
+ XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd);
+ characterDataHandler(handlerArg, dataBuf,
+ (int)(dataPtr - (ICHAR *)dataBuf));
+ }
+ else
+ characterDataHandler(handlerArg,
+ (XML_Char *)s,
+ (int)((XML_Char *)end - (XML_Char *)s));
+ }
+ else if (defaultHandler)
+ reportDefault(parser, enc, s, end);
+ /* We are at the end of the final buffer, should we check for
+ XML_SUSPENDED, XML_FINISHED?
+ */
+ if (startTagLevel == 0) {
+ *eventPP = end;
+ return XML_ERROR_NO_ELEMENTS;
+ }
+ if (tagLevel != startTagLevel) {
+ *eventPP = end;
+ return XML_ERROR_ASYNC_ENTITY;
+ }
+ *nextPtr = end;
+ return XML_ERROR_NONE;
+ case XML_TOK_DATA_CHARS:
+ {
+ XML_CharacterDataHandler charDataHandler = characterDataHandler;
+ if (charDataHandler) {
+ if (MUST_CONVERT(enc, s)) {
+ for (;;) {
+ ICHAR *dataPtr = (ICHAR *)dataBuf;
+ const enum XML_Convert_Result convert_res = XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
+ *eventEndPP = s;
+ charDataHandler(handlerArg, dataBuf,
+ (int)(dataPtr - (ICHAR *)dataBuf));
+ if ((convert_res == XML_CONVERT_COMPLETED) || (convert_res == XML_CONVERT_INPUT_INCOMPLETE))
+ break;
+ *eventPP = s;
+ }
+ }
+ else
+ charDataHandler(handlerArg,
+ (XML_Char *)s,
+ (int)((XML_Char *)next - (XML_Char *)s));
+ }
+ else if (defaultHandler)
+ reportDefault(parser, enc, s, next);
+ }
+ break;
+ case XML_TOK_PI:
+ if (!reportProcessingInstruction(parser, enc, s, next))
+ return XML_ERROR_NO_MEMORY;
+ break;
+ case XML_TOK_COMMENT:
+ if (!reportComment(parser, enc, s, next))
+ return XML_ERROR_NO_MEMORY;
+ break;
+ default:
+ if (defaultHandler)
+ reportDefault(parser, enc, s, next);
+ break;
+ }
+ *eventPP = s = next;
+ switch (ps_parsing) {
+ case XML_SUSPENDED:
+ *nextPtr = next;
+ return XML_ERROR_NONE;
+ case XML_FINISHED:
+ return XML_ERROR_ABORTED;
+ default: ;
+ }
+ }
+ /* not reached */
+}
+
+/* Precondition: all arguments must be non-NULL;
+ Purpose:
+ - normalize attributes
+ - check attributes for well-formedness
+ - generate namespace aware attribute names (URI, prefix)
+ - build list of attributes for startElementHandler
+ - default attributes
+ - process namespace declarations (check and report them)
+ - generate namespace aware element name (URI, prefix)
+*/
+static enum XML_Error
+storeAtts(XML_Parser parser, const ENCODING *enc,
+ const char *attStr, TAG_NAME *tagNamePtr,
+ BINDING **bindingsPtr)
+{
+ DTD * const dtd = _dtd; /* save one level of indirection */
+ ELEMENT_TYPE *elementType;
+ int nDefaultAtts;
+ const XML_Char **appAtts; /* the attribute list for the application */
+ int attIndex = 0;
+ int prefixLen;
+ int i;
+ int n;
+ XML_Char *uri;
+ int nPrefixes = 0;
+ BINDING *binding;
+ const XML_Char *localPart;
+
+ /* lookup the element type name */
+ elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, tagNamePtr->str,0);
+ if (!elementType) {
+ const XML_Char *name = poolCopyString(&dtd->pool, tagNamePtr->str);
+ if (!name)
+ return XML_ERROR_NO_MEMORY;
+ elementType = (ELEMENT_TYPE *)lookup(parser, &dtd->elementTypes, name,
+ sizeof(ELEMENT_TYPE));
+ if (!elementType)
+ return XML_ERROR_NO_MEMORY;
+ if (ns && !setElementTypePrefix(parser, elementType))
+ return XML_ERROR_NO_MEMORY;
+ }
+ nDefaultAtts = elementType->nDefaultAtts;
+
+ /* get the attributes from the tokenizer */
+ n = XmlGetAttributes(enc, attStr, attsSize, atts);
+ if (n + nDefaultAtts > attsSize) {
+ int oldAttsSize = attsSize;
+ ATTRIBUTE *temp;
+#ifdef XML_ATTR_INFO
+ XML_AttrInfo *temp2;
+#endif
+ attsSize = n + nDefaultAtts + INIT_ATTS_SIZE;
+ temp = (ATTRIBUTE *)REALLOC((void *)atts, attsSize * sizeof(ATTRIBUTE));
+ if (temp == NULL)
+ return XML_ERROR_NO_MEMORY;
+ atts = temp;
+#ifdef XML_ATTR_INFO
+ temp2 = (XML_AttrInfo *)REALLOC((void *)attInfo, attsSize * sizeof(XML_AttrInfo));
+ if (temp2 == NULL)
+ return XML_ERROR_NO_MEMORY;
+ attInfo = temp2;
+#endif
+ if (n > oldAttsSize)
+ XmlGetAttributes(enc, attStr, n, atts);
+ }
+
+ appAtts = (const XML_Char **)atts;
+ for (i = 0; i < n; i++) {
+ ATTRIBUTE *currAtt = &atts[i];
+#ifdef XML_ATTR_INFO
+ XML_AttrInfo *currAttInfo = &attInfo[i];
+#endif
+ /* add the name and value to the attribute list */
+ ATTRIBUTE_ID *attId = getAttributeId(parser, enc, currAtt->name,
+ currAtt->name
+ + XmlNameLength(enc, currAtt->name));
+ if (!attId)
+ return XML_ERROR_NO_MEMORY;
+#ifdef XML_ATTR_INFO
+ currAttInfo->nameStart = parseEndByteIndex - (parseEndPtr - currAtt->name);
+ currAttInfo->nameEnd = currAttInfo->nameStart +
+ XmlNameLength(enc, currAtt->name);
+ currAttInfo->valueStart = parseEndByteIndex -
+ (parseEndPtr - currAtt->valuePtr);
+ currAttInfo->valueEnd = parseEndByteIndex - (parseEndPtr - currAtt->valueEnd);
+#endif
+ /* Detect duplicate attributes by their QNames. This does not work when
+ namespace processing is turned on and different prefixes for the same
+ namespace are used. For this case we have a check further down.
+ */
+ if ((attId->name)[-1]) {
+ if (enc == encoding)
+ eventPtr = atts[i].name;
+ return XML_ERROR_DUPLICATE_ATTRIBUTE;
+ }
+ (attId->name)[-1] = 1;
+ appAtts[attIndex++] = attId->name;
+ if (!atts[i].normalized) {
+ enum XML_Error result;
+ XML_Bool isCdata = XML_TRUE;
+
+ /* figure out whether declared as other than CDATA */
+ if (attId->maybeTokenized) {
+ int j;
+ for (j = 0; j < nDefaultAtts; j++) {
+ if (attId == elementType->defaultAtts[j].id) {
+ isCdata = elementType->defaultAtts[j].isCdata;
+ break;
+ }
+ }
+ }
+
+ /* normalize the attribute value */
+ result = storeAttributeValue(parser, enc, isCdata,
+ atts[i].valuePtr, atts[i].valueEnd,
+ &tempPool);
+ if (result)
+ return result;
+ appAtts[attIndex] = poolStart(&tempPool);
+ poolFinish(&tempPool);
+ }
+ else {
+ /* the value did not need normalizing */
+ appAtts[attIndex] = poolStoreString(&tempPool, enc, atts[i].valuePtr,
+ atts[i].valueEnd);
+ if (appAtts[attIndex] == 0)
+ return XML_ERROR_NO_MEMORY;
+ poolFinish(&tempPool);
+ }
+ /* handle prefixed attribute names */
+ if (attId->prefix) {
+ if (attId->xmlns) {
+ /* deal with namespace declarations here */
+ enum XML_Error result = addBinding(parser, attId->prefix, attId,
+ appAtts[attIndex], bindingsPtr);
+ if (result)
+ return result;
+ --attIndex;
+ }
+ else {
+ /* deal with other prefixed names later */
+ attIndex++;
+ nPrefixes++;
+ (attId->name)[-1] = 2;
+ }
+ }
+ else
+ attIndex++;
+ }
+
+ /* set-up for XML_GetSpecifiedAttributeCount and XML_GetIdAttributeIndex */
+ nSpecifiedAtts = attIndex;
+ if (elementType->idAtt && (elementType->idAtt->name)[-1]) {
+ for (i = 0; i < attIndex; i += 2)
+ if (appAtts[i] == elementType->idAtt->name) {
+ idAttIndex = i;
+ break;
+ }
+ }
+ else
+ idAttIndex = -1;
+
+ /* do attribute defaulting */
+ for (i = 0; i < nDefaultAtts; i++) {
+ const DEFAULT_ATTRIBUTE *da = elementType->defaultAtts + i;
+ if (!(da->id->name)[-1] && da->value) {
+ if (da->id->prefix) {
+ if (da->id->xmlns) {
+ enum XML_Error result = addBinding(parser, da->id->prefix, da->id,
+ da->value, bindingsPtr);
+ if (result)
+ return result;
+ }
+ else {
+ (da->id->name)[-1] = 2;
+ nPrefixes++;
+ appAtts[attIndex++] = da->id->name;
+ appAtts[attIndex++] = da->value;
+ }
+ }
+ else {
+ (da->id->name)[-1] = 1;
+ appAtts[attIndex++] = da->id->name;
+ appAtts[attIndex++] = da->value;
+ }
+ }
+ }
+ appAtts[attIndex] = 0;
+
+ /* expand prefixed attribute names, check for duplicates,
+ and clear flags that say whether attributes were specified */
+ i = 0;
+ if (nPrefixes) {
+ int j; /* hash table index */
+ unsigned long version = nsAttsVersion;
+ int nsAttsSize = (int)1 << nsAttsPower;
+ /* size of hash table must be at least 2 * (# of prefixed attributes) */
+ if ((nPrefixes << 1) >> nsAttsPower) { /* true for nsAttsPower = 0 */
+ NS_ATT *temp;
+ /* hash table size must also be a power of 2 and >= 8 */
+ while (nPrefixes >> nsAttsPower++);
+ if (nsAttsPower < 3)
+ nsAttsPower = 3;
+ nsAttsSize = (int)1 << nsAttsPower;
+ temp = (NS_ATT *)REALLOC(nsAtts, nsAttsSize * sizeof(NS_ATT));
+ if (!temp)
+ return XML_ERROR_NO_MEMORY;
+ nsAtts = temp;
+ version = 0; /* force re-initialization of nsAtts hash table */
+ }
+ /* using a version flag saves us from initializing nsAtts every time */
+ if (!version) { /* initialize version flags when version wraps around */
+ version = INIT_ATTS_VERSION;
+ for (j = nsAttsSize; j != 0; )
+ nsAtts[--j].version = version;
+ }
+ nsAttsVersion = --version;
+
+ /* expand prefixed names and check for duplicates */
+ for (; i < attIndex; i += 2) {
+ const XML_Char *s = appAtts[i];
+ if (s[-1] == 2) { /* prefixed */
+ ATTRIBUTE_ID *id;
+ const BINDING *b;
+ unsigned long uriHash = hash_secret_salt;
+ ((XML_Char *)s)[-1] = 0; /* clear flag */
+ id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, s, 0);
+ if (!id || !id->prefix)
+ return XML_ERROR_NO_MEMORY;
+ b = id->prefix->binding;
+ if (!b)
+ return XML_ERROR_UNBOUND_PREFIX;
+
+ /* as we expand the name we also calculate its hash value */
+ for (j = 0; j < b->uriLen; j++) {
+ const XML_Char c = b->uri[j];
+ if (!poolAppendChar(&tempPool, c))
+ return XML_ERROR_NO_MEMORY;
+ uriHash = CHAR_HASH(uriHash, c);
+ }
+ while (*s++ != XML_T(ASCII_COLON))
+ ;
+ do { /* copies null terminator */
+ const XML_Char c = *s;
+ if (!poolAppendChar(&tempPool, *s))
+ return XML_ERROR_NO_MEMORY;
+ uriHash = CHAR_HASH(uriHash, c);
+ } while (*s++);
+
+ { /* Check hash table for duplicate of expanded name (uriName).
+ Derived from code in lookup(parser, HASH_TABLE *table, ...).
+ */
+ unsigned char step = 0;
+ unsigned long mask = nsAttsSize - 1;
+ j = uriHash & mask; /* index into hash table */
+ while (nsAtts[j].version == version) {
+ /* for speed we compare stored hash values first */
+ if (uriHash == nsAtts[j].hash) {
+ const XML_Char *s1 = poolStart(&tempPool);
+ const XML_Char *s2 = nsAtts[j].uriName;
+ /* s1 is null terminated, but not s2 */
+ for (; *s1 == *s2 && *s1 != 0; s1++, s2++);
+ if (*s1 == 0)
+ return XML_ERROR_DUPLICATE_ATTRIBUTE;
+ }
+ if (!step)
+ step = PROBE_STEP(uriHash, mask, nsAttsPower);
+ j < step ? (j += nsAttsSize - step) : (j -= step);
+ }
+ }
+
+ if (ns_triplets) { /* append namespace separator and prefix */
+ tempPool.ptr[-1] = namespaceSeparator;
+ s = b->prefix->name;
+ do {
+ if (!poolAppendChar(&tempPool, *s))
+ return XML_ERROR_NO_MEMORY;
+ } while (*s++);
+ }
+
+ /* store expanded name in attribute list */
+ s = poolStart(&tempPool);
+ poolFinish(&tempPool);
+ appAtts[i] = s;
+
+ /* fill empty slot with new version, uriName and hash value */
+ nsAtts[j].version = version;
+ nsAtts[j].hash = uriHash;
+ nsAtts[j].uriName = s;
+
+ if (!--nPrefixes) {
+ i += 2;
+ break;
+ }
+ }
+ else /* not prefixed */
+ ((XML_Char *)s)[-1] = 0; /* clear flag */
+ }
+ }
+ /* clear flags for the remaining attributes */
+ for (; i < attIndex; i += 2)
+ ((XML_Char *)(appAtts[i]))[-1] = 0;
+ for (binding = *bindingsPtr; binding; binding = binding->nextTagBinding)
+ binding->attId->name[-1] = 0;
+
+ if (!ns)
+ return XML_ERROR_NONE;
+
+ /* expand the element type name */
+ if (elementType->prefix) {
+ binding = elementType->prefix->binding;
+ if (!binding)
+ return XML_ERROR_UNBOUND_PREFIX;
+ localPart = tagNamePtr->str;
+ while (*localPart++ != XML_T(ASCII_COLON))
+ ;
+ }
+ else if (dtd->defaultPrefix.binding) {
+ binding = dtd->defaultPrefix.binding;
+ localPart = tagNamePtr->str;
+ }
+ else
+ return XML_ERROR_NONE;
+ prefixLen = 0;
+ if (ns_triplets && binding->prefix->name) {
+ for (; binding->prefix->name[prefixLen++];)
+ ; /* prefixLen includes null terminator */
+ }
+ tagNamePtr->localPart = localPart;
+ tagNamePtr->uriLen = binding->uriLen;
+ tagNamePtr->prefix = binding->prefix->name;
+ tagNamePtr->prefixLen = prefixLen;
+ for (i = 0; localPart[i++];)
+ ; /* i includes null terminator */
+ n = i + binding->uriLen + prefixLen;
+ if (n > binding->uriAlloc) {
+ TAG *p;
+ uri = (XML_Char *)MALLOC((n + EXPAND_SPARE) * sizeof(XML_Char));
+ if (!uri)
+ return XML_ERROR_NO_MEMORY;
+ binding->uriAlloc = n + EXPAND_SPARE;
+ memcpy(uri, binding->uri, binding->uriLen * sizeof(XML_Char));
+ for (p = tagStack; p; p = p->parent)
+ if (p->name.str == binding->uri)
+ p->name.str = uri;
+ FREE(binding->uri);
+ binding->uri = uri;
+ }
+ /* if namespaceSeparator != '\0' then uri includes it already */
+ uri = binding->uri + binding->uriLen;
+ memcpy(uri, localPart, i * sizeof(XML_Char));
+ /* we always have a namespace separator between localPart and prefix */
+ if (prefixLen) {
+ uri += i - 1;
+ *uri = namespaceSeparator; /* replace null terminator */
+ memcpy(uri + 1, binding->prefix->name, prefixLen * sizeof(XML_Char));
+ }
+ tagNamePtr->str = binding->uri;
+ return XML_ERROR_NONE;
+}
+
+/* addBinding() overwrites the value of prefix->binding without checking.
+ Therefore one must keep track of the old value outside of addBinding().
+*/
+static enum XML_Error
+addBinding(XML_Parser parser, PREFIX *prefix, const ATTRIBUTE_ID *attId,
+ const XML_Char *uri, BINDING **bindingsPtr)
+{
+ static const XML_Char xmlNamespace[] = {
+ ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH,
+ ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD,
+ ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_X, ASCII_M, ASCII_L,
+ ASCII_SLASH, ASCII_1, ASCII_9, ASCII_9, ASCII_8, ASCII_SLASH,
+ ASCII_n, ASCII_a, ASCII_m, ASCII_e, ASCII_s, ASCII_p, ASCII_a, ASCII_c,
+ ASCII_e, '\0'
+ };
+ static const int xmlLen =
+ (int)sizeof(xmlNamespace)/sizeof(XML_Char) - 1;
+ static const XML_Char xmlnsNamespace[] = {
+ ASCII_h, ASCII_t, ASCII_t, ASCII_p, ASCII_COLON, ASCII_SLASH, ASCII_SLASH,
+ ASCII_w, ASCII_w, ASCII_w, ASCII_PERIOD, ASCII_w, ASCII_3, ASCII_PERIOD,
+ ASCII_o, ASCII_r, ASCII_g, ASCII_SLASH, ASCII_2, ASCII_0, ASCII_0,
+ ASCII_0, ASCII_SLASH, ASCII_x, ASCII_m, ASCII_l, ASCII_n, ASCII_s,
+ ASCII_SLASH, '\0'
+ };
+ static const int xmlnsLen =
+ (int)sizeof(xmlnsNamespace)/sizeof(XML_Char) - 1;
+
+ XML_Bool mustBeXML = XML_FALSE;
+ XML_Bool isXML = XML_TRUE;
+ XML_Bool isXMLNS = XML_TRUE;
+
+ BINDING *b;
+ int len;
+
+ /* empty URI is only valid for default namespace per XML NS 1.0 (not 1.1) */
+ if (*uri == XML_T('\0') && prefix->name)
+ return XML_ERROR_UNDECLARING_PREFIX;
+
+ if (prefix->name
+ && prefix->name[0] == XML_T(ASCII_x)
+ && prefix->name[1] == XML_T(ASCII_m)
+ && prefix->name[2] == XML_T(ASCII_l)) {
+
+ /* Not allowed to bind xmlns */
+ if (prefix->name[3] == XML_T(ASCII_n)
+ && prefix->name[4] == XML_T(ASCII_s)
+ && prefix->name[5] == XML_T('\0'))
+ return XML_ERROR_RESERVED_PREFIX_XMLNS;
+
+ if (prefix->name[3] == XML_T('\0'))
+ mustBeXML = XML_TRUE;
+ }
+
+ for (len = 0; uri[len]; len++) {
+ if (isXML && (len > xmlLen || uri[len] != xmlNamespace[len]))
+ isXML = XML_FALSE;
+
+ if (!mustBeXML && isXMLNS
+ && (len > xmlnsLen || uri[len] != xmlnsNamespace[len]))
+ isXMLNS = XML_FALSE;
+ }
+ isXML = isXML && len == xmlLen;
+ isXMLNS = isXMLNS && len == xmlnsLen;
+
+ if (mustBeXML != isXML)
+ return mustBeXML ? XML_ERROR_RESERVED_PREFIX_XML
+ : XML_ERROR_RESERVED_NAMESPACE_URI;
+
+ if (isXMLNS)
+ return XML_ERROR_RESERVED_NAMESPACE_URI;
+
+ if (namespaceSeparator)
+ len++;
+ if (freeBindingList) {
+ b = freeBindingList;
+ if (len > b->uriAlloc) {
+ XML_Char *temp = (XML_Char *)REALLOC(b->uri,
+ sizeof(XML_Char) * (len + EXPAND_SPARE));
+ if (temp == NULL)
+ return XML_ERROR_NO_MEMORY;
+ b->uri = temp;
+ b->uriAlloc = len + EXPAND_SPARE;
+ }
+ freeBindingList = b->nextTagBinding;
+ }
+ else {
+ b = (BINDING *)MALLOC(sizeof(BINDING));
+ if (!b)
+ return XML_ERROR_NO_MEMORY;
+ b->uri = (XML_Char *)MALLOC(sizeof(XML_Char) * (len + EXPAND_SPARE));
+ if (!b->uri) {
+ FREE(b);
+ return XML_ERROR_NO_MEMORY;
+ }
+ b->uriAlloc = len + EXPAND_SPARE;
+ }
+ b->uriLen = len;
+ memcpy(b->uri, uri, len * sizeof(XML_Char));
+ if (namespaceSeparator)
+ b->uri[len - 1] = namespaceSeparator;
+ b->prefix = prefix;
+ b->attId = attId;
+ b->prevPrefixBinding = prefix->binding;
+ /* NULL binding when default namespace undeclared */
+ if (*uri == XML_T('\0') && prefix == &_dtd->defaultPrefix)
+ prefix->binding = NULL;
+ else
+ prefix->binding = b;
+ b->nextTagBinding = *bindingsPtr;
+ *bindingsPtr = b;
+ /* if attId == NULL then we are not starting a namespace scope */
+ if (attId && startNamespaceDeclHandler)
+ startNamespaceDeclHandler(handlerArg, prefix->name,
+ prefix->binding ? uri : 0);
+ return XML_ERROR_NONE;
+}
+
+/* The idea here is to avoid using stack for each CDATA section when
+ the whole file is parsed with one call.
+*/
+static enum XML_Error PTRCALL
+cdataSectionProcessor(XML_Parser parser,
+ const char *start,
+ const char *end,
+ const char **endPtr)
+{
+ enum XML_Error result = doCdataSection(parser, encoding, &start, end,
+ endPtr, (XML_Bool)!ps_finalBuffer);
+ if (result != XML_ERROR_NONE)
+ return result;
+ if (start) {
+ if (parentParser) { /* we are parsing an external entity */
+ processor = externalEntityContentProcessor;
+ return externalEntityContentProcessor(parser, start, end, endPtr);
+ }
+ else {
+ processor = contentProcessor;
+ return contentProcessor(parser, start, end, endPtr);
+ }
+ }
+ return result;
+}
+
+/* startPtr gets set to non-null if the section is closed, and to null if
+ the section is not yet closed.
+*/
+static enum XML_Error
+doCdataSection(XML_Parser parser,
+ const ENCODING *enc,
+ const char **startPtr,
+ const char *end,
+ const char **nextPtr,
+ XML_Bool haveMore)
+{
+ const char *s = *startPtr;
+ const char **eventPP;
+ const char **eventEndPP;
+ if (enc == encoding) {
+ eventPP = &eventPtr;
+ *eventPP = s;
+ eventEndPP = &eventEndPtr;
+ }
+ else {
+ eventPP = &(openInternalEntities->internalEventPtr);
+ eventEndPP = &(openInternalEntities->internalEventEndPtr);
+ }
+ *eventPP = s;
+ *startPtr = NULL;
+
+ for (;;) {
+ const char *next;
+ int tok = XmlCdataSectionTok(enc, s, end, &next);
+ *eventEndPP = next;
+ switch (tok) {
+ case XML_TOK_CDATA_SECT_CLOSE:
+ if (endCdataSectionHandler)
+ endCdataSectionHandler(handlerArg);
+#if 0
+ /* see comment under XML_TOK_CDATA_SECT_OPEN */
+ else if (characterDataHandler)
+ characterDataHandler(handlerArg, dataBuf, 0);
+#endif
+ else if (defaultHandler)
+ reportDefault(parser, enc, s, next);
+ *startPtr = next;
+ *nextPtr = next;
+ if (ps_parsing == XML_FINISHED)
+ return XML_ERROR_ABORTED;
+ else
+ return XML_ERROR_NONE;
+ case XML_TOK_DATA_NEWLINE:
+ if (characterDataHandler) {
+ XML_Char c = 0xA;
+ characterDataHandler(handlerArg, &c, 1);
+ }
+ else if (defaultHandler)
+ reportDefault(parser, enc, s, next);
+ break;
+ case XML_TOK_DATA_CHARS:
+ {
+ XML_CharacterDataHandler charDataHandler = characterDataHandler;
+ if (charDataHandler) {
+ if (MUST_CONVERT(enc, s)) {
+ for (;;) {
+ ICHAR *dataPtr = (ICHAR *)dataBuf;
+ const enum XML_Convert_Result convert_res = XmlConvert(enc, &s, next, &dataPtr, (ICHAR *)dataBufEnd);
+ *eventEndPP = next;
+ charDataHandler(handlerArg, dataBuf,
+ (int)(dataPtr - (ICHAR *)dataBuf));
+ if ((convert_res == XML_CONVERT_COMPLETED) || (convert_res == XML_CONVERT_INPUT_INCOMPLETE))
+ break;
+ *eventPP = s;
+ }
+ }
+ else
+ charDataHandler(handlerArg,
+ (XML_Char *)s,
+ (int)((XML_Char *)next - (XML_Char *)s));
+ }
+ else if (defaultHandler)
+ reportDefault(parser, enc, s, next);
+ }
+ break;
+ case XML_TOK_INVALID:
+ *eventPP = next;
+ return XML_ERROR_INVALID_TOKEN;
+ case XML_TOK_PARTIAL_CHAR:
+ if (haveMore) {
+ *nextPtr = s;
+ return XML_ERROR_NONE;
+ }
+ return XML_ERROR_PARTIAL_CHAR;
+ case XML_TOK_PARTIAL:
+ case XML_TOK_NONE:
+ if (haveMore) {
+ *nextPtr = s;
+ return XML_ERROR_NONE;
+ }
+ return XML_ERROR_UNCLOSED_CDATA_SECTION;
+ default:
+ *eventPP = next;
+ return XML_ERROR_UNEXPECTED_STATE;
+ }
+
+ *eventPP = s = next;
+ switch (ps_parsing) {
+ case XML_SUSPENDED:
+ *nextPtr = next;
+ return XML_ERROR_NONE;
+ case XML_FINISHED:
+ return XML_ERROR_ABORTED;
+ default: ;
+ }
+ }
+ /* not reached */
+}
+
+#ifdef XML_DTD
+
+/* The idea here is to avoid using stack for each IGNORE section when
+ the whole file is parsed with one call.
+*/
+static enum XML_Error PTRCALL
+ignoreSectionProcessor(XML_Parser parser,
+ const char *start,
+ const char *end,
+ const char **endPtr)
+{
+ enum XML_Error result = doIgnoreSection(parser, encoding, &start, end,
+ endPtr, (XML_Bool)!ps_finalBuffer);
+ if (result != XML_ERROR_NONE)
+ return result;
+ if (start) {
+ processor = prologProcessor;
+ return prologProcessor(parser, start, end, endPtr);
+ }
+ return result;
+}
+
+/* startPtr gets set to non-null is the section is closed, and to null
+ if the section is not yet closed.
+*/
+static enum XML_Error
+doIgnoreSection(XML_Parser parser,
+ const ENCODING *enc,
+ const char **startPtr,
+ const char *end,
+ const char **nextPtr,
+ XML_Bool haveMore)
+{
+ const char *next;
+ int tok;
+ const char *s = *startPtr;
+ const char **eventPP;
+ const char **eventEndPP;
+ if (enc == encoding) {
+ eventPP = &eventPtr;
+ *eventPP = s;
+ eventEndPP = &eventEndPtr;
+ }
+ else {
+ eventPP = &(openInternalEntities->internalEventPtr);
+ eventEndPP = &(openInternalEntities->internalEventEndPtr);
+ }
+ *eventPP = s;
+ *startPtr = NULL;
+ tok = XmlIgnoreSectionTok(enc, s, end, &next);
+ *eventEndPP = next;
+ switch (tok) {
+ case XML_TOK_IGNORE_SECT:
+ if (defaultHandler)
+ reportDefault(parser, enc, s, next);
+ *startPtr = next;
+ *nextPtr = next;
+ if (ps_parsing == XML_FINISHED)
+ return XML_ERROR_ABORTED;
+ else
+ return XML_ERROR_NONE;
+ case XML_TOK_INVALID:
+ *eventPP = next;
+ return XML_ERROR_INVALID_TOKEN;
+ case XML_TOK_PARTIAL_CHAR:
+ if (haveMore) {
+ *nextPtr = s;
+ return XML_ERROR_NONE;
+ }
+ return XML_ERROR_PARTIAL_CHAR;
+ case XML_TOK_PARTIAL:
+ case XML_TOK_NONE:
+ if (haveMore) {
+ *nextPtr = s;
+ return XML_ERROR_NONE;
+ }
+ return XML_ERROR_SYNTAX; /* XML_ERROR_UNCLOSED_IGNORE_SECTION */
+ default:
+ *eventPP = next;
+ return XML_ERROR_UNEXPECTED_STATE;
+ }
+ /* not reached */
+}
+
+#endif /* XML_DTD */
+
+static enum XML_Error
+initializeEncoding(XML_Parser parser)
+{
+ const char *s;
+#ifdef XML_UNICODE
+ char encodingBuf[128];
+ if (!protocolEncodingName)
+ s = NULL;
+ else {
+ int i;
+ for (i = 0; protocolEncodingName[i]; i++) {
+ if (i == sizeof(encodingBuf) - 1
+ || (protocolEncodingName[i] & ~0x7f) != 0) {
+ encodingBuf[0] = '\0';
+ break;
+ }
+ encodingBuf[i] = (char)protocolEncodingName[i];
+ }
+ encodingBuf[i] = '\0';
+ s = encodingBuf;
+ }
+#else
+ s = protocolEncodingName;
+#endif
+ if ((ns ? XmlInitEncodingNS : XmlInitEncoding)(&initEncoding, &encoding, s))
+ return XML_ERROR_NONE;
+ return handleUnknownEncoding(parser, protocolEncodingName);
+}
+
+static enum XML_Error
+processXmlDecl(XML_Parser parser, int isGeneralTextEntity,
+ const char *s, const char *next)
+{
+ const char *encodingName = NULL;
+ const XML_Char *storedEncName = NULL;
+ const ENCODING *newEncoding = NULL;
+ const char *version = NULL;
+ const char *versionend;
+ const XML_Char *storedversion = NULL;
+ int standalone = -1;
+ if (!(ns
+ ? XmlParseXmlDeclNS
+ : XmlParseXmlDecl)(isGeneralTextEntity,
+ encoding,
+ s,
+ next,
+ &eventPtr,
+ &version,
+ &versionend,
+ &encodingName,
+ &newEncoding,
+ &standalone)) {
+ if (isGeneralTextEntity)
+ return XML_ERROR_TEXT_DECL;
+ else
+ return XML_ERROR_XML_DECL;
+ }
+ if (!isGeneralTextEntity && standalone == 1) {
+ _dtd->standalone = XML_TRUE;
+#ifdef XML_DTD
+ if (paramEntityParsing == XML_PARAM_ENTITY_PARSING_UNLESS_STANDALONE)
+ paramEntityParsing = XML_PARAM_ENTITY_PARSING_NEVER;
+#endif /* XML_DTD */
+ }
+ if (xmlDeclHandler) {
+ if (encodingName != NULL) {
+ storedEncName = poolStoreString(&temp2Pool,
+ encoding,
+ encodingName,
+ encodingName
+ + XmlNameLength(encoding, encodingName));
+ if (!storedEncName)
+ return XML_ERROR_NO_MEMORY;
+ poolFinish(&temp2Pool);
+ }
+ if (version) {
+ storedversion = poolStoreString(&temp2Pool,
+ encoding,
+ version,
+ versionend - encoding->minBytesPerChar);
+ if (!storedversion)
+ return XML_ERROR_NO_MEMORY;
+ }
+ xmlDeclHandler(handlerArg, storedversion, storedEncName, standalone);
+ }
+ else if (defaultHandler)
+ reportDefault(parser, encoding, s, next);
+ if (protocolEncodingName == NULL) {
+ if (newEncoding) {
+ if (newEncoding->minBytesPerChar != encoding->minBytesPerChar) {
+ eventPtr = encodingName;
+ return XML_ERROR_INCORRECT_ENCODING;
+ }
+ encoding = newEncoding;
+ }
+ else if (encodingName) {
+ enum XML_Error result;
+ if (!storedEncName) {
+ storedEncName = poolStoreString(
+ &temp2Pool, encoding, encodingName,
+ encodingName + XmlNameLength(encoding, encodingName));
+ if (!storedEncName)
+ return XML_ERROR_NO_MEMORY;
+ }
+ result = handleUnknownEncoding(parser, storedEncName);
+ poolClear(&temp2Pool);
+ if (result == XML_ERROR_UNKNOWN_ENCODING)
+ eventPtr = encodingName;
+ return result;
+ }
+ }
+
+ if (storedEncName || storedversion)
+ poolClear(&temp2Pool);
+
+ return XML_ERROR_NONE;
+}
+
+static enum XML_Error
+handleUnknownEncoding(XML_Parser parser, const XML_Char *encodingName)
+{
+ if (unknownEncodingHandler) {
+ XML_Encoding info;
+ int i;
+ for (i = 0; i < 256; i++)
+ info.map[i] = -1;
+ info.convert = NULL;
+ info.data = NULL;
+ info.release = NULL;
+ if (unknownEncodingHandler(unknownEncodingHandlerData, encodingName,
+ &info)) {
+ ENCODING *enc;
+ unknownEncodingMem = MALLOC(XmlSizeOfUnknownEncoding());
+ if (!unknownEncodingMem) {
+ if (info.release)
+ info.release(info.data);
+ return XML_ERROR_NO_MEMORY;
+ }
+ enc = (ns
+ ? XmlInitUnknownEncodingNS
+ : XmlInitUnknownEncoding)(unknownEncodingMem,
+ info.map,
+ info.convert,
+ info.data);
+ if (enc) {
+ unknownEncodingData = info.data;
+ unknownEncodingRelease = info.release;
+ encoding = enc;
+ return XML_ERROR_NONE;
+ }
+ }
+ if (info.release != NULL)
+ info.release(info.data);
+ }
+ return XML_ERROR_UNKNOWN_ENCODING;
+}
+
+static enum XML_Error PTRCALL
+prologInitProcessor(XML_Parser parser,
+ const char *s,
+ const char *end,
+ const char **nextPtr)
+{
+ enum XML_Error result = initializeEncoding(parser);
+ if (result != XML_ERROR_NONE)
+ return result;
+ processor = prologProcessor;
+ return prologProcessor(parser, s, end, nextPtr);
+}
+
+#ifdef XML_DTD
+
+static enum XML_Error PTRCALL
+externalParEntInitProcessor(XML_Parser parser,
+ const char *s,
+ const char *end,
+ const char **nextPtr)
+{
+ enum XML_Error result = initializeEncoding(parser);
+ if (result != XML_ERROR_NONE)
+ return result;
+
+ /* we know now that XML_Parse(Buffer) has been called,
+ so we consider the external parameter entity read */
+ _dtd->paramEntityRead = XML_TRUE;
+
+ if (prologState.inEntityValue) {
+ processor = entityValueInitProcessor;
+ return entityValueInitProcessor(parser, s, end, nextPtr);
+ }
+ else {
+ processor = externalParEntProcessor;
+ return externalParEntProcessor(parser, s, end, nextPtr);
+ }
+}
+
+static enum XML_Error PTRCALL
+entityValueInitProcessor(XML_Parser parser,
+ const char *s,
+ const char *end,
+ const char **nextPtr)
+{
+ int tok;
+ const char *start = s;
+ const char *next = start;
+ eventPtr = start;
+
+ for (;;) {
+ tok = XmlPrologTok(encoding, start, end, &next);
+ eventEndPtr = next;
+ if (tok <= 0) {
+ if (!ps_finalBuffer && tok != XML_TOK_INVALID) {
+ *nextPtr = s;
+ return XML_ERROR_NONE;
+ }
+ switch (tok) {
+ case XML_TOK_INVALID:
+ return XML_ERROR_INVALID_TOKEN;
+ case XML_TOK_PARTIAL:
+ return XML_ERROR_UNCLOSED_TOKEN;
+ case XML_TOK_PARTIAL_CHAR:
+ return XML_ERROR_PARTIAL_CHAR;
+ case XML_TOK_NONE: /* start == end */
+ default:
+ break;
+ }
+ /* found end of entity value - can store it now */
+ return storeEntityValue(parser, encoding, s, end);
+ }
+ else if (tok == XML_TOK_XML_DECL) {
+ enum XML_Error result;
+ result = processXmlDecl(parser, 0, start, next);
+ if (result != XML_ERROR_NONE)
+ return result;
+ switch (ps_parsing) {
+ case XML_SUSPENDED:
+ *nextPtr = next;
+ return XML_ERROR_NONE;
+ case XML_FINISHED:
+ return XML_ERROR_ABORTED;
+ default:
+ *nextPtr = next;
+ }
+ /* stop scanning for text declaration - we found one */
+ processor = entityValueProcessor;
+ return entityValueProcessor(parser, next, end, nextPtr);
+ }
+ /* If we are at the end of the buffer, this would cause XmlPrologTok to
+ return XML_TOK_NONE on the next call, which would then cause the
+ function to exit with *nextPtr set to s - that is what we want for other
+ tokens, but not for the BOM - we would rather like to skip it;
+ then, when this routine is entered the next time, XmlPrologTok will
+ return XML_TOK_INVALID, since the BOM is still in the buffer
+ */
+ else if (tok == XML_TOK_BOM && next == end && !ps_finalBuffer) {
+ *nextPtr = next;
+ return XML_ERROR_NONE;
+ }
+ start = next;
+ eventPtr = start;
+ }
+}
+
+static enum XML_Error PTRCALL
+externalParEntProcessor(XML_Parser parser,
+ const char *s,
+ const char *end,
+ const char **nextPtr)
+{
+ const char *next = s;
+ int tok;
+
+ tok = XmlPrologTok(encoding, s, end, &next);
+ if (tok <= 0) {
+ if (!ps_finalBuffer && tok != XML_TOK_INVALID) {
+ *nextPtr = s;
+ return XML_ERROR_NONE;
+ }
+ switch (tok) {
+ case XML_TOK_INVALID:
+ return XML_ERROR_INVALID_TOKEN;
+ case XML_TOK_PARTIAL:
+ return XML_ERROR_UNCLOSED_TOKEN;
+ case XML_TOK_PARTIAL_CHAR:
+ return XML_ERROR_PARTIAL_CHAR;
+ case XML_TOK_NONE: /* start == end */
+ default:
+ break;
+ }
+ }
+ /* This would cause the next stage, i.e. doProlog to be passed XML_TOK_BOM.
+ However, when parsing an external subset, doProlog will not accept a BOM
+ as valid, and report a syntax error, so we have to skip the BOM
+ */
+ else if (tok == XML_TOK_BOM) {
+ s = next;
+ tok = XmlPrologTok(encoding, s, end, &next);
+ }
+
+ processor = prologProcessor;
+ return doProlog(parser, encoding, s, end, tok, next,
+ nextPtr, (XML_Bool)!ps_finalBuffer);
+}
+
+static enum XML_Error PTRCALL
+entityValueProcessor(XML_Parser parser,
+ const char *s,
+ const char *end,
+ const char **nextPtr)
+{
+ const char *start = s;
+ const char *next = s;
+ const ENCODING *enc = encoding;
+ int tok;
+
+ for (;;) {
+ tok = XmlPrologTok(enc, start, end, &next);
+ if (tok <= 0) {
+ if (!ps_finalBuffer && tok != XML_TOK_INVALID) {
+ *nextPtr = s;
+ return XML_ERROR_NONE;
+ }
+ switch (tok) {
+ case XML_TOK_INVALID:
+ return XML_ERROR_INVALID_TOKEN;
+ case XML_TOK_PARTIAL:
+ return XML_ERROR_UNCLOSED_TOKEN;
+ case XML_TOK_PARTIAL_CHAR:
+ return XML_ERROR_PARTIAL_CHAR;
+ case XML_TOK_NONE: /* start == end */
+ default:
+ break;
+ }
+ /* found end of entity value - can store it now */
+ return storeEntityValue(parser, enc, s, end);
+ }
+ start = next;
+ }
+}
+
+#endif /* XML_DTD */
+
+static enum XML_Error PTRCALL
+prologProcessor(XML_Parser parser,
+ const char *s,
+ const char *end,
+ const char **nextPtr)
+{
+ const char *next = s;
+ int tok = XmlPrologTok(encoding, s, end, &next);
+ return doProlog(parser, encoding, s, end, tok, next,
+ nextPtr, (XML_Bool)!ps_finalBuffer);
+}
+
+static enum XML_Error
+doProlog(XML_Parser parser,
+ const ENCODING *enc,
+ const char *s,
+ const char *end,
+ int tok,
+ const char *next,
+ const char **nextPtr,
+ XML_Bool haveMore)
+{
+#ifdef XML_DTD
+ static const XML_Char externalSubsetName[] = { ASCII_HASH , '\0' };
+#endif /* XML_DTD */
+ static const XML_Char atypeCDATA[] =
+ { ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
+ static const XML_Char atypeID[] = { ASCII_I, ASCII_D, '\0' };
+ static const XML_Char atypeIDREF[] =
+ { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' };
+ static const XML_Char atypeIDREFS[] =
+ { ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' };
+ static const XML_Char atypeENTITY[] =
+ { ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' };
+ static const XML_Char atypeENTITIES[] = { ASCII_E, ASCII_N,
+ ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S, '\0' };
+ static const XML_Char atypeNMTOKEN[] = {
+ ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' };
+ static const XML_Char atypeNMTOKENS[] = { ASCII_N, ASCII_M, ASCII_T,
+ ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S, '\0' };
+ static const XML_Char notationPrefix[] = { ASCII_N, ASCII_O, ASCII_T,
+ ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N, ASCII_LPAREN, '\0' };
+ static const XML_Char enumValueSep[] = { ASCII_PIPE, '\0' };
+ static const XML_Char enumValueStart[] = { ASCII_LPAREN, '\0' };
+
+ /* save one level of indirection */
+ DTD * const dtd = _dtd;
+
+ const char **eventPP;
+ const char **eventEndPP;
+ enum XML_Content_Quant quant;
+
+ if (enc == encoding) {
+ eventPP = &eventPtr;
+ eventEndPP = &eventEndPtr;
+ }
+ else {
+ eventPP = &(openInternalEntities->internalEventPtr);
+ eventEndPP = &(openInternalEntities->internalEventEndPtr);
+ }
+
+ for (;;) {
+ int role;
+ XML_Bool handleDefault = XML_TRUE;
+ *eventPP = s;
+ *eventEndPP = next;
+ if (tok <= 0) {
+ if (haveMore && tok != XML_TOK_INVALID) {
+ *nextPtr = s;
+ return XML_ERROR_NONE;
+ }
+ switch (tok) {
+ case XML_TOK_INVALID:
+ *eventPP = next;
+ return XML_ERROR_INVALID_TOKEN;
+ case XML_TOK_PARTIAL:
+ return XML_ERROR_UNCLOSED_TOKEN;
+ case XML_TOK_PARTIAL_CHAR:
+ return XML_ERROR_PARTIAL_CHAR;
+ case -XML_TOK_PROLOG_S:
+ tok = -tok;
+ break;
+ case XML_TOK_NONE:
+#ifdef XML_DTD
+ /* for internal PE NOT referenced between declarations */
+ if (enc != encoding && !openInternalEntities->betweenDecl) {
+ *nextPtr = s;
+ return XML_ERROR_NONE;
+ }
+ /* WFC: PE Between Declarations - must check that PE contains
+ complete markup, not only for external PEs, but also for
+ internal PEs if the reference occurs between declarations.
+ */
+ if (isParamEntity || enc != encoding) {
+ if (XmlTokenRole(&prologState, XML_TOK_NONE, end, end, enc)
+ == XML_ROLE_ERROR)
+ return XML_ERROR_INCOMPLETE_PE;
+ *nextPtr = s;
+ return XML_ERROR_NONE;
+ }
+#endif /* XML_DTD */
+ return XML_ERROR_NO_ELEMENTS;
+ default:
+ tok = -tok;
+ next = end;
+ break;
+ }
+ }
+ role = XmlTokenRole(&prologState, tok, s, next, enc);
+ switch (role) {
+ case XML_ROLE_XML_DECL:
+ {
+ enum XML_Error result = processXmlDecl(parser, 0, s, next);
+ if (result != XML_ERROR_NONE)
+ return result;
+ enc = encoding;
+ handleDefault = XML_FALSE;
+ }
+ break;
+ case XML_ROLE_DOCTYPE_NAME:
+ if (startDoctypeDeclHandler) {
+ doctypeName = poolStoreString(&tempPool, enc, s, next);
+ if (!doctypeName)
+ return XML_ERROR_NO_MEMORY;
+ poolFinish(&tempPool);
+ doctypePubid = NULL;
+ handleDefault = XML_FALSE;
+ }
+ doctypeSysid = NULL; /* always initialize to NULL */
+ break;
+ case XML_ROLE_DOCTYPE_INTERNAL_SUBSET:
+ if (startDoctypeDeclHandler) {
+ startDoctypeDeclHandler(handlerArg, doctypeName, doctypeSysid,
+ doctypePubid, 1);
+ doctypeName = NULL;
+ poolClear(&tempPool);
+ handleDefault = XML_FALSE;
+ }
+ break;
+#ifdef XML_DTD
+ case XML_ROLE_TEXT_DECL:
+ {
+ enum XML_Error result = processXmlDecl(parser, 1, s, next);
+ if (result != XML_ERROR_NONE)
+ return result;
+ enc = encoding;
+ handleDefault = XML_FALSE;
+ }
+ break;
+#endif /* XML_DTD */
+ case XML_ROLE_DOCTYPE_PUBLIC_ID:
+#ifdef XML_DTD
+ useForeignDTD = XML_FALSE;
+ declEntity = (ENTITY *)lookup(parser,
+ &dtd->paramEntities,
+ externalSubsetName,
+ sizeof(ENTITY));
+ if (!declEntity)
+ return XML_ERROR_NO_MEMORY;
+#endif /* XML_DTD */
+ dtd->hasParamEntityRefs = XML_TRUE;
+ if (startDoctypeDeclHandler) {
+ XML_Char *pubId;
+ if (!XmlIsPublicId(enc, s, next, eventPP))
+ return XML_ERROR_PUBLICID;
+ pubId = poolStoreString(&tempPool, enc,
+ s + enc->minBytesPerChar,
+ next - enc->minBytesPerChar);
+ if (!pubId)
+ return XML_ERROR_NO_MEMORY;
+ normalizePublicId(pubId);
+ poolFinish(&tempPool);
+ doctypePubid = pubId;
+ handleDefault = XML_FALSE;
+ goto alreadyChecked;
+ }
+ /* fall through */
+ case XML_ROLE_ENTITY_PUBLIC_ID:
+ if (!XmlIsPublicId(enc, s, next, eventPP))
+ return XML_ERROR_PUBLICID;
+ alreadyChecked:
+ if (dtd->keepProcessing && declEntity) {
+ XML_Char *tem = poolStoreString(&dtd->pool,
+ enc,
+ s + enc->minBytesPerChar,
+ next - enc->minBytesPerChar);
+ if (!tem)
+ return XML_ERROR_NO_MEMORY;
+ normalizePublicId(tem);
+ declEntity->publicId = tem;
+ poolFinish(&dtd->pool);
+ if (entityDeclHandler)
+ handleDefault = XML_FALSE;
+ }
+ break;
+ case XML_ROLE_DOCTYPE_CLOSE:
+ if (doctypeName) {
+ startDoctypeDeclHandler(handlerArg, doctypeName,
+ doctypeSysid, doctypePubid, 0);
+ poolClear(&tempPool);
+ handleDefault = XML_FALSE;
+ }
+ /* doctypeSysid will be non-NULL in the case of a previous
+ XML_ROLE_DOCTYPE_SYSTEM_ID, even if startDoctypeDeclHandler
+ was not set, indicating an external subset
+ */
+#ifdef XML_DTD
+ if (doctypeSysid || useForeignDTD) {
+ XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs;
+ dtd->hasParamEntityRefs = XML_TRUE;
+ if (paramEntityParsing && externalEntityRefHandler) {
+ ENTITY *entity = (ENTITY *)lookup(parser,
+ &dtd->paramEntities,
+ externalSubsetName,
+ sizeof(ENTITY));
+ if (!entity)
+ return XML_ERROR_NO_MEMORY;
+ if (useForeignDTD)
+ entity->base = curBase;
+ dtd->paramEntityRead = XML_FALSE;
+ if (!externalEntityRefHandler(externalEntityRefHandlerArg,
+ 0,
+ entity->base,
+ entity->systemId,
+ entity->publicId))
+ return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
+ if (dtd->paramEntityRead) {
+ if (!dtd->standalone &&
+ notStandaloneHandler &&
+ !notStandaloneHandler(handlerArg))
+ return XML_ERROR_NOT_STANDALONE;
+ }
+ /* if we didn't read the foreign DTD then this means that there
+ is no external subset and we must reset dtd->hasParamEntityRefs
+ */
+ else if (!doctypeSysid)
+ dtd->hasParamEntityRefs = hadParamEntityRefs;
+ /* end of DTD - no need to update dtd->keepProcessing */
+ }
+ useForeignDTD = XML_FALSE;
+ }
+#endif /* XML_DTD */
+ if (endDoctypeDeclHandler) {
+ endDoctypeDeclHandler(handlerArg);
+ handleDefault = XML_FALSE;
+ }
+ break;
+ case XML_ROLE_INSTANCE_START:
+#ifdef XML_DTD
+ /* if there is no DOCTYPE declaration then now is the
+ last chance to read the foreign DTD
+ */
+ if (useForeignDTD) {
+ XML_Bool hadParamEntityRefs = dtd->hasParamEntityRefs;
+ dtd->hasParamEntityRefs = XML_TRUE;
+ if (paramEntityParsing && externalEntityRefHandler) {
+ ENTITY *entity = (ENTITY *)lookup(parser, &dtd->paramEntities,
+ externalSubsetName,
+ sizeof(ENTITY));
+ if (!entity)
+ return XML_ERROR_NO_MEMORY;
+ entity->base = curBase;
+ dtd->paramEntityRead = XML_FALSE;
+ if (!externalEntityRefHandler(externalEntityRefHandlerArg,
+ 0,
+ entity->base,
+ entity->systemId,
+ entity->publicId))
+ return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
+ if (dtd->paramEntityRead) {
+ if (!dtd->standalone &&
+ notStandaloneHandler &&
+ !notStandaloneHandler(handlerArg))
+ return XML_ERROR_NOT_STANDALONE;
+ }
+ /* if we didn't read the foreign DTD then this means that there
+ is no external subset and we must reset dtd->hasParamEntityRefs
+ */
+ else
+ dtd->hasParamEntityRefs = hadParamEntityRefs;
+ /* end of DTD - no need to update dtd->keepProcessing */
+ }
+ }
+#endif /* XML_DTD */
+ processor = contentProcessor;
+ return contentProcessor(parser, s, end, nextPtr);
+ case XML_ROLE_ATTLIST_ELEMENT_NAME:
+ declElementType = getElementType(parser, enc, s, next);
+ if (!declElementType)
+ return XML_ERROR_NO_MEMORY;
+ goto checkAttListDeclHandler;
+ case XML_ROLE_ATTRIBUTE_NAME:
+ declAttributeId = getAttributeId(parser, enc, s, next);
+ if (!declAttributeId)
+ return XML_ERROR_NO_MEMORY;
+ declAttributeIsCdata = XML_FALSE;
+ declAttributeType = NULL;
+ declAttributeIsId = XML_FALSE;
+ goto checkAttListDeclHandler;
+ case XML_ROLE_ATTRIBUTE_TYPE_CDATA:
+ declAttributeIsCdata = XML_TRUE;
+ declAttributeType = atypeCDATA;
+ goto checkAttListDeclHandler;
+ case XML_ROLE_ATTRIBUTE_TYPE_ID:
+ declAttributeIsId = XML_TRUE;
+ declAttributeType = atypeID;
+ goto checkAttListDeclHandler;
+ case XML_ROLE_ATTRIBUTE_TYPE_IDREF:
+ declAttributeType = atypeIDREF;
+ goto checkAttListDeclHandler;
+ case XML_ROLE_ATTRIBUTE_TYPE_IDREFS:
+ declAttributeType = atypeIDREFS;
+ goto checkAttListDeclHandler;
+ case XML_ROLE_ATTRIBUTE_TYPE_ENTITY:
+ declAttributeType = atypeENTITY;
+ goto checkAttListDeclHandler;
+ case XML_ROLE_ATTRIBUTE_TYPE_ENTITIES:
+ declAttributeType = atypeENTITIES;
+ goto checkAttListDeclHandler;
+ case XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN:
+ declAttributeType = atypeNMTOKEN;
+ goto checkAttListDeclHandler;
+ case XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS:
+ declAttributeType = atypeNMTOKENS;
+ checkAttListDeclHandler:
+ if (dtd->keepProcessing && attlistDeclHandler)
+ handleDefault = XML_FALSE;
+ break;
+ case XML_ROLE_ATTRIBUTE_ENUM_VALUE:
+ case XML_ROLE_ATTRIBUTE_NOTATION_VALUE:
+ if (dtd->keepProcessing && attlistDeclHandler) {
+ const XML_Char *prefix;
+ if (declAttributeType) {
+ prefix = enumValueSep;
+ }
+ else {
+ prefix = (role == XML_ROLE_ATTRIBUTE_NOTATION_VALUE
+ ? notationPrefix
+ : enumValueStart);
+ }
+ if (!poolAppendString(&tempPool, prefix))
+ return XML_ERROR_NO_MEMORY;
+ if (!poolAppend(&tempPool, enc, s, next))
+ return XML_ERROR_NO_MEMORY;
+ declAttributeType = tempPool.start;
+ handleDefault = XML_FALSE;
+ }
+ break;
+ case XML_ROLE_IMPLIED_ATTRIBUTE_VALUE:
+ case XML_ROLE_REQUIRED_ATTRIBUTE_VALUE:
+ if (dtd->keepProcessing) {
+ if (!defineAttribute(declElementType, declAttributeId,
+ declAttributeIsCdata, declAttributeIsId,
+ 0, parser))
+ return XML_ERROR_NO_MEMORY;
+ if (attlistDeclHandler && declAttributeType) {
+ if (*declAttributeType == XML_T(ASCII_LPAREN)
+ || (*declAttributeType == XML_T(ASCII_N)
+ && declAttributeType[1] == XML_T(ASCII_O))) {
+ /* Enumerated or Notation type */
+ if (!poolAppendChar(&tempPool, XML_T(ASCII_RPAREN))
+ || !poolAppendChar(&tempPool, XML_T('\0')))
+ return XML_ERROR_NO_MEMORY;
+ declAttributeType = tempPool.start;
+ poolFinish(&tempPool);
+ }
+ *eventEndPP = s;
+ attlistDeclHandler(handlerArg, declElementType->name,
+ declAttributeId->name, declAttributeType,
+ 0, role == XML_ROLE_REQUIRED_ATTRIBUTE_VALUE);
+ poolClear(&tempPool);
+ handleDefault = XML_FALSE;
+ }
+ }
+ break;
+ case XML_ROLE_DEFAULT_ATTRIBUTE_VALUE:
+ case XML_ROLE_FIXED_ATTRIBUTE_VALUE:
+ if (dtd->keepProcessing) {
+ const XML_Char *attVal;
+ enum XML_Error result =
+ storeAttributeValue(parser, enc, declAttributeIsCdata,
+ s + enc->minBytesPerChar,
+ next - enc->minBytesPerChar,
+ &dtd->pool);
+ if (result)
+ return result;
+ attVal = poolStart(&dtd->pool);
+ poolFinish(&dtd->pool);
+ /* ID attributes aren't allowed to have a default */
+ if (!defineAttribute(declElementType, declAttributeId,
+ declAttributeIsCdata, XML_FALSE, attVal, parser))
+ return XML_ERROR_NO_MEMORY;
+ if (attlistDeclHandler && declAttributeType) {
+ if (*declAttributeType == XML_T(ASCII_LPAREN)
+ || (*declAttributeType == XML_T(ASCII_N)
+ && declAttributeType[1] == XML_T(ASCII_O))) {
+ /* Enumerated or Notation type */
+ if (!poolAppendChar(&tempPool, XML_T(ASCII_RPAREN))
+ || !poolAppendChar(&tempPool, XML_T('\0')))
+ return XML_ERROR_NO_MEMORY;
+ declAttributeType = tempPool.start;
+ poolFinish(&tempPool);
+ }
+ *eventEndPP = s;
+ attlistDeclHandler(handlerArg, declElementType->name,
+ declAttributeId->name, declAttributeType,
+ attVal,
+ role == XML_ROLE_FIXED_ATTRIBUTE_VALUE);
+ poolClear(&tempPool);
+ handleDefault = XML_FALSE;
+ }
+ }
+ break;
+ case XML_ROLE_ENTITY_VALUE:
+ if (dtd->keepProcessing) {
+ enum XML_Error result = storeEntityValue(parser, enc,
+ s + enc->minBytesPerChar,
+ next - enc->minBytesPerChar);
+ if (declEntity) {
+ declEntity->textPtr = poolStart(&dtd->entityValuePool);
+ declEntity->textLen = (int)(poolLength(&dtd->entityValuePool));
+ poolFinish(&dtd->entityValuePool);
+ if (entityDeclHandler) {
+ *eventEndPP = s;
+ entityDeclHandler(handlerArg,
+ declEntity->name,
+ declEntity->is_param,
+ declEntity->textPtr,
+ declEntity->textLen,
+ curBase, 0, 0, 0);
+ handleDefault = XML_FALSE;
+ }
+ }
+ else
+ poolDiscard(&dtd->entityValuePool);
+ if (result != XML_ERROR_NONE)
+ return result;
+ }
+ break;
+ case XML_ROLE_DOCTYPE_SYSTEM_ID:
+#ifdef XML_DTD
+ useForeignDTD = XML_FALSE;
+#endif /* XML_DTD */
+ dtd->hasParamEntityRefs = XML_TRUE;
+ if (startDoctypeDeclHandler) {
+ doctypeSysid = poolStoreString(&tempPool, enc,
+ s + enc->minBytesPerChar,
+ next - enc->minBytesPerChar);
+ if (doctypeSysid == NULL)
+ return XML_ERROR_NO_MEMORY;
+ poolFinish(&tempPool);
+ handleDefault = XML_FALSE;
+ }
+#ifdef XML_DTD
+ else
+ /* use externalSubsetName to make doctypeSysid non-NULL
+ for the case where no startDoctypeDeclHandler is set */
+ doctypeSysid = externalSubsetName;
+#endif /* XML_DTD */
+ if (!dtd->standalone
+#ifdef XML_DTD
+ && !paramEntityParsing
+#endif /* XML_DTD */
+ && notStandaloneHandler
+ && !notStandaloneHandler(handlerArg))
+ return XML_ERROR_NOT_STANDALONE;
+#ifndef XML_DTD
+ break;
+#else /* XML_DTD */
+ if (!declEntity) {
+ declEntity = (ENTITY *)lookup(parser,
+ &dtd->paramEntities,
+ externalSubsetName,
+ sizeof(ENTITY));
+ if (!declEntity)
+ return XML_ERROR_NO_MEMORY;
+ declEntity->publicId = NULL;
+ }
+ /* fall through */
+#endif /* XML_DTD */
+ case XML_ROLE_ENTITY_SYSTEM_ID:
+ if (dtd->keepProcessing && declEntity) {
+ declEntity->systemId = poolStoreString(&dtd->pool, enc,
+ s + enc->minBytesPerChar,
+ next - enc->minBytesPerChar);
+ if (!declEntity->systemId)
+ return XML_ERROR_NO_MEMORY;
+ declEntity->base = curBase;
+ poolFinish(&dtd->pool);
+ if (entityDeclHandler)
+ handleDefault = XML_FALSE;
+ }
+ break;
+ case XML_ROLE_ENTITY_COMPLETE:
+ if (dtd->keepProcessing && declEntity && entityDeclHandler) {
+ *eventEndPP = s;
+ entityDeclHandler(handlerArg,
+ declEntity->name,
+ declEntity->is_param,
+ 0,0,
+ declEntity->base,
+ declEntity->systemId,
+ declEntity->publicId,
+ 0);
+ handleDefault = XML_FALSE;
+ }
+ break;
+ case XML_ROLE_ENTITY_NOTATION_NAME:
+ if (dtd->keepProcessing && declEntity) {
+ declEntity->notation = poolStoreString(&dtd->pool, enc, s, next);
+ if (!declEntity->notation)
+ return XML_ERROR_NO_MEMORY;
+ poolFinish(&dtd->pool);
+ if (unparsedEntityDeclHandler) {
+ *eventEndPP = s;
+ unparsedEntityDeclHandler(handlerArg,
+ declEntity->name,
+ declEntity->base,
+ declEntity->systemId,
+ declEntity->publicId,
+ declEntity->notation);
+ handleDefault = XML_FALSE;
+ }
+ else if (entityDeclHandler) {
+ *eventEndPP = s;
+ entityDeclHandler(handlerArg,
+ declEntity->name,
+ 0,0,0,
+ declEntity->base,
+ declEntity->systemId,
+ declEntity->publicId,
+ declEntity->notation);
+ handleDefault = XML_FALSE;
+ }
+ }
+ break;
+ case XML_ROLE_GENERAL_ENTITY_NAME:
+ {
+ if (XmlPredefinedEntityName(enc, s, next)) {
+ declEntity = NULL;
+ break;
+ }
+ if (dtd->keepProcessing) {
+ const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next);
+ if (!name)
+ return XML_ERROR_NO_MEMORY;
+ declEntity = (ENTITY *)lookup(parser, &dtd->generalEntities, name,
+ sizeof(ENTITY));
+ if (!declEntity)
+ return XML_ERROR_NO_MEMORY;
+ if (declEntity->name != name) {
+ poolDiscard(&dtd->pool);
+ declEntity = NULL;
+ }
+ else {
+ poolFinish(&dtd->pool);
+ declEntity->publicId = NULL;
+ declEntity->is_param = XML_FALSE;
+ /* if we have a parent parser or are reading an internal parameter
+ entity, then the entity declaration is not considered "internal"
+ */
+ declEntity->is_internal = !(parentParser || openInternalEntities);
+ if (entityDeclHandler)
+ handleDefault = XML_FALSE;
+ }
+ }
+ else {
+ poolDiscard(&dtd->pool);
+ declEntity = NULL;
+ }
+ }
+ break;
+ case XML_ROLE_PARAM_ENTITY_NAME:
+#ifdef XML_DTD
+ if (dtd->keepProcessing) {
+ const XML_Char *name = poolStoreString(&dtd->pool, enc, s, next);
+ if (!name)
+ return XML_ERROR_NO_MEMORY;
+ declEntity = (ENTITY *)lookup(parser, &dtd->paramEntities,
+ name, sizeof(ENTITY));
+ if (!declEntity)
+ return XML_ERROR_NO_MEMORY;
+ if (declEntity->name != name) {
+ poolDiscard(&dtd->pool);
+ declEntity = NULL;
+ }
+ else {
+ poolFinish(&dtd->pool);
+ declEntity->publicId = NULL;
+ declEntity->is_param = XML_TRUE;
+ /* if we have a parent parser or are reading an internal parameter
+ entity, then the entity declaration is not considered "internal"
+ */
+ declEntity->is_internal = !(parentParser || openInternalEntities);
+ if (entityDeclHandler)
+ handleDefault = XML_FALSE;
+ }
+ }
+ else {
+ poolDiscard(&dtd->pool);
+ declEntity = NULL;
+ }
+#else /* not XML_DTD */
+ declEntity = NULL;
+#endif /* XML_DTD */
+ break;
+ case XML_ROLE_NOTATION_NAME:
+ declNotationPublicId = NULL;
+ declNotationName = NULL;
+ if (notationDeclHandler) {
+ declNotationName = poolStoreString(&tempPool, enc, s, next);
+ if (!declNotationName)
+ return XML_ERROR_NO_MEMORY;
+ poolFinish(&tempPool);
+ handleDefault = XML_FALSE;
+ }
+ break;
+ case XML_ROLE_NOTATION_PUBLIC_ID:
+ if (!XmlIsPublicId(enc, s, next, eventPP))
+ return XML_ERROR_PUBLICID;
+ if (declNotationName) { /* means notationDeclHandler != NULL */
+ XML_Char *tem = poolStoreString(&tempPool,
+ enc,
+ s + enc->minBytesPerChar,
+ next - enc->minBytesPerChar);
+ if (!tem)
+ return XML_ERROR_NO_MEMORY;
+ normalizePublicId(tem);
+ declNotationPublicId = tem;
+ poolFinish(&tempPool);
+ handleDefault = XML_FALSE;
+ }
+ break;
+ case XML_ROLE_NOTATION_SYSTEM_ID:
+ if (declNotationName && notationDeclHandler) {
+ const XML_Char *systemId
+ = poolStoreString(&tempPool, enc,
+ s + enc->minBytesPerChar,
+ next - enc->minBytesPerChar);
+ if (!systemId)
+ return XML_ERROR_NO_MEMORY;
+ *eventEndPP = s;
+ notationDeclHandler(handlerArg,
+ declNotationName,
+ curBase,
+ systemId,
+ declNotationPublicId);
+ handleDefault = XML_FALSE;
+ }
+ poolClear(&tempPool);
+ break;
+ case XML_ROLE_NOTATION_NO_SYSTEM_ID:
+ if (declNotationPublicId && notationDeclHandler) {
+ *eventEndPP = s;
+ notationDeclHandler(handlerArg,
+ declNotationName,
+ curBase,
+ 0,
+ declNotationPublicId);
+ handleDefault = XML_FALSE;
+ }
+ poolClear(&tempPool);
+ break;
+ case XML_ROLE_ERROR:
+ switch (tok) {
+ case XML_TOK_PARAM_ENTITY_REF:
+ /* PE references in internal subset are
+ not allowed within declarations. */
+ return XML_ERROR_PARAM_ENTITY_REF;
+ case XML_TOK_XML_DECL:
+ return XML_ERROR_MISPLACED_XML_PI;
+ default:
+ return XML_ERROR_SYNTAX;
+ }
+#ifdef XML_DTD
+ case XML_ROLE_IGNORE_SECT:
+ {
+ enum XML_Error result;
+ if (defaultHandler)
+ reportDefault(parser, enc, s, next);
+ handleDefault = XML_FALSE;
+ result = doIgnoreSection(parser, enc, &next, end, nextPtr, haveMore);
+ if (result != XML_ERROR_NONE)
+ return result;
+ else if (!next) {
+ processor = ignoreSectionProcessor;
+ return result;
+ }
+ }
+ break;
+#endif /* XML_DTD */
+ case XML_ROLE_GROUP_OPEN:
+ if (prologState.level >= groupSize) {
+ if (groupSize) {
+ char *temp = (char *)REALLOC(groupConnector, groupSize *= 2);
+ if (temp == NULL)
+ return XML_ERROR_NO_MEMORY;
+ groupConnector = temp;
+ if (dtd->scaffIndex) {
+ int *temp = (int *)REALLOC(dtd->scaffIndex,
+ groupSize * sizeof(int));
+ if (temp == NULL)
+ return XML_ERROR_NO_MEMORY;
+ dtd->scaffIndex = temp;
+ }
+ }
+ else {
+ groupConnector = (char *)MALLOC(groupSize = 32);
+ if (!groupConnector)
+ return XML_ERROR_NO_MEMORY;
+ }
+ }
+ groupConnector[prologState.level] = 0;
+ if (dtd->in_eldecl) {
+ int myindex = nextScaffoldPart(parser);
+ if (myindex < 0)
+ return XML_ERROR_NO_MEMORY;
+ dtd->scaffIndex[dtd->scaffLevel] = myindex;
+ dtd->scaffLevel++;
+ dtd->scaffold[myindex].type = XML_CTYPE_SEQ;
+ if (elementDeclHandler)
+ handleDefault = XML_FALSE;
+ }
+ break;
+ case XML_ROLE_GROUP_SEQUENCE:
+ if (groupConnector[prologState.level] == ASCII_PIPE)
+ return XML_ERROR_SYNTAX;
+ groupConnector[prologState.level] = ASCII_COMMA;
+ if (dtd->in_eldecl && elementDeclHandler)
+ handleDefault = XML_FALSE;
+ break;
+ case XML_ROLE_GROUP_CHOICE:
+ if (groupConnector[prologState.level] == ASCII_COMMA)
+ return XML_ERROR_SYNTAX;
+ if (dtd->in_eldecl
+ && !groupConnector[prologState.level]
+ && (dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type
+ != XML_CTYPE_MIXED)
+ ) {
+ dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type
+ = XML_CTYPE_CHOICE;
+ if (elementDeclHandler)
+ handleDefault = XML_FALSE;
+ }
+ groupConnector[prologState.level] = ASCII_PIPE;
+ break;
+ case XML_ROLE_PARAM_ENTITY_REF:
+#ifdef XML_DTD
+ case XML_ROLE_INNER_PARAM_ENTITY_REF:
+ dtd->hasParamEntityRefs = XML_TRUE;
+ if (!paramEntityParsing)
+ dtd->keepProcessing = dtd->standalone;
+ else {
+ const XML_Char *name;
+ ENTITY *entity;
+ name = poolStoreString(&dtd->pool, enc,
+ s + enc->minBytesPerChar,
+ next - enc->minBytesPerChar);
+ if (!name)
+ return XML_ERROR_NO_MEMORY;
+ entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0);
+ poolDiscard(&dtd->pool);
+ /* first, determine if a check for an existing declaration is needed;
+ if yes, check that the entity exists, and that it is internal,
+ otherwise call the skipped entity handler
+ */
+ if (prologState.documentEntity &&
+ (dtd->standalone
+ ? !openInternalEntities
+ : !dtd->hasParamEntityRefs)) {
+ if (!entity)
+ return XML_ERROR_UNDEFINED_ENTITY;
+ else if (!entity->is_internal)
+ return XML_ERROR_ENTITY_DECLARED_IN_PE;
+ }
+ else if (!entity) {
+ dtd->keepProcessing = dtd->standalone;
+ /* cannot report skipped entities in declarations */
+ if ((role == XML_ROLE_PARAM_ENTITY_REF) && skippedEntityHandler) {
+ skippedEntityHandler(handlerArg, name, 1);
+ handleDefault = XML_FALSE;
+ }
+ break;
+ }
+ if (entity->open)
+ return XML_ERROR_RECURSIVE_ENTITY_REF;
+ if (entity->textPtr) {
+ enum XML_Error result;
+ XML_Bool betweenDecl =
+ (role == XML_ROLE_PARAM_ENTITY_REF ? XML_TRUE : XML_FALSE);
+ result = processInternalEntity(parser, entity, betweenDecl);
+ if (result != XML_ERROR_NONE)
+ return result;
+ handleDefault = XML_FALSE;
+ break;
+ }
+ if (externalEntityRefHandler) {
+ dtd->paramEntityRead = XML_FALSE;
+ entity->open = XML_TRUE;
+ if (!externalEntityRefHandler(externalEntityRefHandlerArg,
+ 0,
+ entity->base,
+ entity->systemId,
+ entity->publicId)) {
+ entity->open = XML_FALSE;
+ return XML_ERROR_EXTERNAL_ENTITY_HANDLING;
+ }
+ entity->open = XML_FALSE;
+ handleDefault = XML_FALSE;
+ if (!dtd->paramEntityRead) {
+ dtd->keepProcessing = dtd->standalone;
+ break;
+ }
+ }
+ else {
+ dtd->keepProcessing = dtd->standalone;
+ break;
+ }
+ }
+#endif /* XML_DTD */
+ if (!dtd->standalone &&
+ notStandaloneHandler &&
+ !notStandaloneHandler(handlerArg))
+ return XML_ERROR_NOT_STANDALONE;
+ break;
+
+ /* Element declaration stuff */
+
+ case XML_ROLE_ELEMENT_NAME:
+ if (elementDeclHandler) {
+ declElementType = getElementType(parser, enc, s, next);
+ if (!declElementType)
+ return XML_ERROR_NO_MEMORY;
+ dtd->scaffLevel = 0;
+ dtd->scaffCount = 0;
+ dtd->in_eldecl = XML_TRUE;
+ handleDefault = XML_FALSE;
+ }
+ break;
+
+ case XML_ROLE_CONTENT_ANY:
+ case XML_ROLE_CONTENT_EMPTY:
+ if (dtd->in_eldecl) {
+ if (elementDeclHandler) {
+ XML_Content * content = (XML_Content *) MALLOC(sizeof(XML_Content));
+ if (!content)
+ return XML_ERROR_NO_MEMORY;
+ content->quant = XML_CQUANT_NONE;
+ content->name = NULL;
+ content->numchildren = 0;
+ content->children = NULL;
+ content->type = ((role == XML_ROLE_CONTENT_ANY) ?
+ XML_CTYPE_ANY :
+ XML_CTYPE_EMPTY);
+ *eventEndPP = s;
+ elementDeclHandler(handlerArg, declElementType->name, content);
+ handleDefault = XML_FALSE;
+ }
+ dtd->in_eldecl = XML_FALSE;
+ }
+ break;
+
+ case XML_ROLE_CONTENT_PCDATA:
+ if (dtd->in_eldecl) {
+ dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel - 1]].type
+ = XML_CTYPE_MIXED;
+ if (elementDeclHandler)
+ handleDefault = XML_FALSE;
+ }
+ break;
+
+ case XML_ROLE_CONTENT_ELEMENT:
+ quant = XML_CQUANT_NONE;
+ goto elementContent;
+ case XML_ROLE_CONTENT_ELEMENT_OPT:
+ quant = XML_CQUANT_OPT;
+ goto elementContent;
+ case XML_ROLE_CONTENT_ELEMENT_REP:
+ quant = XML_CQUANT_REP;
+ goto elementContent;
+ case XML_ROLE_CONTENT_ELEMENT_PLUS:
+ quant = XML_CQUANT_PLUS;
+ elementContent:
+ if (dtd->in_eldecl) {
+ ELEMENT_TYPE *el;
+ const XML_Char *name;
+ int nameLen;
+ const char *nxt = (quant == XML_CQUANT_NONE
+ ? next
+ : next - enc->minBytesPerChar);
+ int myindex = nextScaffoldPart(parser);
+ if (myindex < 0)
+ return XML_ERROR_NO_MEMORY;
+ dtd->scaffold[myindex].type = XML_CTYPE_NAME;
+ dtd->scaffold[myindex].quant = quant;
+ el = getElementType(parser, enc, s, nxt);
+ if (!el)
+ return XML_ERROR_NO_MEMORY;
+ name = el->name;
+ dtd->scaffold[myindex].name = name;
+ nameLen = 0;
+ for (; name[nameLen++]; );
+ dtd->contentStringLen += nameLen;
+ if (elementDeclHandler)
+ handleDefault = XML_FALSE;
+ }
+ break;
+
+ case XML_ROLE_GROUP_CLOSE:
+ quant = XML_CQUANT_NONE;
+ goto closeGroup;
+ case XML_ROLE_GROUP_CLOSE_OPT:
+ quant = XML_CQUANT_OPT;
+ goto closeGroup;
+ case XML_ROLE_GROUP_CLOSE_REP:
+ quant = XML_CQUANT_REP;
+ goto closeGroup;
+ case XML_ROLE_GROUP_CLOSE_PLUS:
+ quant = XML_CQUANT_PLUS;
+ closeGroup:
+ if (dtd->in_eldecl) {
+ if (elementDeclHandler)
+ handleDefault = XML_FALSE;
+ dtd->scaffLevel--;
+ dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel]].quant = quant;
+ if (dtd->scaffLevel == 0) {
+ if (!handleDefault) {
+ XML_Content *model = build_model(parser);
+ if (!model)
+ return XML_ERROR_NO_MEMORY;
+ *eventEndPP = s;
+ elementDeclHandler(handlerArg, declElementType->name, model);
+ }
+ dtd->in_eldecl = XML_FALSE;
+ dtd->contentStringLen = 0;
+ }
+ }
+ break;
+ /* End element declaration stuff */
+
+ case XML_ROLE_PI:
+ if (!reportProcessingInstruction(parser, enc, s, next))
+ return XML_ERROR_NO_MEMORY;
+ handleDefault = XML_FALSE;
+ break;
+ case XML_ROLE_COMMENT:
+ if (!reportComment(parser, enc, s, next))
+ return XML_ERROR_NO_MEMORY;
+ handleDefault = XML_FALSE;
+ break;
+ case XML_ROLE_NONE:
+ switch (tok) {
+ case XML_TOK_BOM:
+ handleDefault = XML_FALSE;
+ break;
+ }
+ break;
+ case XML_ROLE_DOCTYPE_NONE:
+ if (startDoctypeDeclHandler)
+ handleDefault = XML_FALSE;
+ break;
+ case XML_ROLE_ENTITY_NONE:
+ if (dtd->keepProcessing && entityDeclHandler)
+ handleDefault = XML_FALSE;
+ break;
+ case XML_ROLE_NOTATION_NONE:
+ if (notationDeclHandler)
+ handleDefault = XML_FALSE;
+ break;
+ case XML_ROLE_ATTLIST_NONE:
+ if (dtd->keepProcessing && attlistDeclHandler)
+ handleDefault = XML_FALSE;
+ break;
+ case XML_ROLE_ELEMENT_NONE:
+ if (elementDeclHandler)
+ handleDefault = XML_FALSE;
+ break;
+ } /* end of big switch */
+
+ if (handleDefault && defaultHandler)
+ reportDefault(parser, enc, s, next);
+
+ switch (ps_parsing) {
+ case XML_SUSPENDED:
+ *nextPtr = next;
+ return XML_ERROR_NONE;
+ case XML_FINISHED:
+ return XML_ERROR_ABORTED;
+ default:
+ s = next;
+ tok = XmlPrologTok(enc, s, end, &next);
+ }
+ }
+ /* not reached */
+}
+
+static enum XML_Error PTRCALL
+epilogProcessor(XML_Parser parser,
+ const char *s,
+ const char *end,
+ const char **nextPtr)
+{
+ processor = epilogProcessor;
+ eventPtr = s;
+ for (;;) {
+ const char *next = NULL;
+ int tok = XmlPrologTok(encoding, s, end, &next);
+ eventEndPtr = next;
+ switch (tok) {
+ /* report partial linebreak - it might be the last token */
+ case -XML_TOK_PROLOG_S:
+ if (defaultHandler) {
+ reportDefault(parser, encoding, s, next);
+ if (ps_parsing == XML_FINISHED)
+ return XML_ERROR_ABORTED;
+ }
+ *nextPtr = next;
+ return XML_ERROR_NONE;
+ case XML_TOK_NONE:
+ *nextPtr = s;
+ return XML_ERROR_NONE;
+ case XML_TOK_PROLOG_S:
+ if (defaultHandler)
+ reportDefault(parser, encoding, s, next);
+ break;
+ case XML_TOK_PI:
+ if (!reportProcessingInstruction(parser, encoding, s, next))
+ return XML_ERROR_NO_MEMORY;
+ break;
+ case XML_TOK_COMMENT:
+ if (!reportComment(parser, encoding, s, next))
+ return XML_ERROR_NO_MEMORY;
+ break;
+ case XML_TOK_INVALID:
+ eventPtr = next;
+ return XML_ERROR_INVALID_TOKEN;
+ case XML_TOK_PARTIAL:
+ if (!ps_finalBuffer) {
+ *nextPtr = s;
+ return XML_ERROR_NONE;
+ }
+ return XML_ERROR_UNCLOSED_TOKEN;
+ case XML_TOK_PARTIAL_CHAR:
+ if (!ps_finalBuffer) {
+ *nextPtr = s;
+ return XML_ERROR_NONE;
+ }
+ return XML_ERROR_PARTIAL_CHAR;
+ default:
+ return XML_ERROR_JUNK_AFTER_DOC_ELEMENT;
+ }
+ eventPtr = s = next;
+ switch (ps_parsing) {
+ case XML_SUSPENDED:
+ *nextPtr = next;
+ return XML_ERROR_NONE;
+ case XML_FINISHED:
+ return XML_ERROR_ABORTED;
+ default: ;
+ }
+ }
+}
+
+static enum XML_Error
+processInternalEntity(XML_Parser parser, ENTITY *entity,
+ XML_Bool betweenDecl)
+{
+ const char *textStart, *textEnd;
+ const char *next;
+ enum XML_Error result;
+ OPEN_INTERNAL_ENTITY *openEntity;
+
+ if (freeInternalEntities) {
+ openEntity = freeInternalEntities;
+ freeInternalEntities = openEntity->next;
+ }
+ else {
+ openEntity = (OPEN_INTERNAL_ENTITY *)MALLOC(sizeof(OPEN_INTERNAL_ENTITY));
+ if (!openEntity)
+ return XML_ERROR_NO_MEMORY;
+ }
+ entity->open = XML_TRUE;
+ entity->processed = 0;
+ openEntity->next = openInternalEntities;
+ openInternalEntities = openEntity;
+ openEntity->entity = entity;
+ openEntity->startTagLevel = tagLevel;
+ openEntity->betweenDecl = betweenDecl;
+ openEntity->internalEventPtr = NULL;
+ openEntity->internalEventEndPtr = NULL;
+ textStart = (char *)entity->textPtr;
+ textEnd = (char *)(entity->textPtr + entity->textLen);
+
+#ifdef XML_DTD
+ if (entity->is_param) {
+ int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next);
+ result = doProlog(parser, internalEncoding, textStart, textEnd, tok,
+ next, &next, XML_FALSE);
+ }
+ else
+#endif /* XML_DTD */
+ result = doContent(parser, tagLevel, internalEncoding, textStart,
+ textEnd, &next, XML_FALSE);
+
+ if (result == XML_ERROR_NONE) {
+ if (textEnd != next && ps_parsing == XML_SUSPENDED) {
+ entity->processed = (int)(next - textStart);
+ processor = internalEntityProcessor;
+ }
+ else {
+ entity->open = XML_FALSE;
+ openInternalEntities = openEntity->next;
+ /* put openEntity back in list of free instances */
+ openEntity->next = freeInternalEntities;
+ freeInternalEntities = openEntity;
+ }
+ }
+ return result;
+}
+
+static enum XML_Error PTRCALL
+internalEntityProcessor(XML_Parser parser,
+ const char *s,
+ const char *end,
+ const char **nextPtr)
+{
+ ENTITY *entity;
+ const char *textStart, *textEnd;
+ const char *next;
+ enum XML_Error result;
+ OPEN_INTERNAL_ENTITY *openEntity = openInternalEntities;
+ if (!openEntity)
+ return XML_ERROR_UNEXPECTED_STATE;
+
+ entity = openEntity->entity;
+ textStart = ((char *)entity->textPtr) + entity->processed;
+ textEnd = (char *)(entity->textPtr + entity->textLen);
+
+#ifdef XML_DTD
+ if (entity->is_param) {
+ int tok = XmlPrologTok(internalEncoding, textStart, textEnd, &next);
+ result = doProlog(parser, internalEncoding, textStart, textEnd, tok,
+ next, &next, XML_FALSE);
+ }
+ else
+#endif /* XML_DTD */
+ result = doContent(parser, openEntity->startTagLevel, internalEncoding,
+ textStart, textEnd, &next, XML_FALSE);
+
+ if (result != XML_ERROR_NONE)
+ return result;
+ else if (textEnd != next && ps_parsing == XML_SUSPENDED) {
+ entity->processed = (int)(next - (char *)entity->textPtr);
+ return result;
+ }
+ else {
+ entity->open = XML_FALSE;
+ openInternalEntities = openEntity->next;
+ /* put openEntity back in list of free instances */
+ openEntity->next = freeInternalEntities;
+ freeInternalEntities = openEntity;
+ }
+
+#ifdef XML_DTD
+ if (entity->is_param) {
+ int tok;
+ processor = prologProcessor;
+ tok = XmlPrologTok(encoding, s, end, &next);
+ return doProlog(parser, encoding, s, end, tok, next, nextPtr,
+ (XML_Bool)!ps_finalBuffer);
+ }
+ else
+#endif /* XML_DTD */
+ {
+ processor = contentProcessor;
+ /* see externalEntityContentProcessor vs contentProcessor */
+ return doContent(parser, parentParser ? 1 : 0, encoding, s, end,
+ nextPtr, (XML_Bool)!ps_finalBuffer);
+ }
+}
+
+static enum XML_Error PTRCALL
+errorProcessor(XML_Parser parser,
+ const char *UNUSED_P(s),
+ const char *UNUSED_P(end),
+ const char **UNUSED_P(nextPtr))
+{
+ return errorCode;
+}
+
+static enum XML_Error
+storeAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
+ const char *ptr, const char *end,
+ STRING_POOL *pool)
+{
+ enum XML_Error result = appendAttributeValue(parser, enc, isCdata, ptr,
+ end, pool);
+ if (result)
+ return result;
+ if (!isCdata && poolLength(pool) && poolLastChar(pool) == 0x20)
+ poolChop(pool);
+ if (!poolAppendChar(pool, XML_T('\0')))
+ return XML_ERROR_NO_MEMORY;
+ return XML_ERROR_NONE;
+}
+
+static enum XML_Error
+appendAttributeValue(XML_Parser parser, const ENCODING *enc, XML_Bool isCdata,
+ const char *ptr, const char *end,
+ STRING_POOL *pool)
+{
+ DTD * const dtd = _dtd; /* save one level of indirection */
+ for (;;) {
+ const char *next;
+ int tok = XmlAttributeValueTok(enc, ptr, end, &next);
+ switch (tok) {
+ case XML_TOK_NONE:
+ return XML_ERROR_NONE;
+ case XML_TOK_INVALID:
+ if (enc == encoding)
+ eventPtr = next;
+ return XML_ERROR_INVALID_TOKEN;
+ case XML_TOK_PARTIAL:
+ if (enc == encoding)
+ eventPtr = ptr;
+ return XML_ERROR_INVALID_TOKEN;
+ case XML_TOK_CHAR_REF:
+ {
+ XML_Char buf[XML_ENCODE_MAX];
+ int i;
+ int n = XmlCharRefNumber(enc, ptr);
+ if (n < 0) {
+ if (enc == encoding)
+ eventPtr = ptr;
+ return XML_ERROR_BAD_CHAR_REF;
+ }
+ if (!isCdata
+ && n == 0x20 /* space */
+ && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20))
+ break;
+ n = XmlEncode(n, (ICHAR *)buf);
+ if (!n) {
+ if (enc == encoding)
+ eventPtr = ptr;
+ return XML_ERROR_BAD_CHAR_REF;
+ }
+ for (i = 0; i < n; i++) {
+ if (!poolAppendChar(pool, buf[i]))
+ return XML_ERROR_NO_MEMORY;
+ }
+ }
+ break;
+ case XML_TOK_DATA_CHARS:
+ if (!poolAppend(pool, enc, ptr, next))
+ return XML_ERROR_NO_MEMORY;
+ break;
+ case XML_TOK_TRAILING_CR:
+ next = ptr + enc->minBytesPerChar;
+ /* fall through */
+ case XML_TOK_ATTRIBUTE_VALUE_S:
+ case XML_TOK_DATA_NEWLINE:
+ if (!isCdata && (poolLength(pool) == 0 || poolLastChar(pool) == 0x20))
+ break;
+ if (!poolAppendChar(pool, 0x20))
+ return XML_ERROR_NO_MEMORY;
+ break;
+ case XML_TOK_ENTITY_REF:
+ {
+ const XML_Char *name;
+ ENTITY *entity;
+ char checkEntityDecl;
+ XML_Char ch = (XML_Char) XmlPredefinedEntityName(enc,
+ ptr + enc->minBytesPerChar,
+ next - enc->minBytesPerChar);
+ if (ch) {
+ if (!poolAppendChar(pool, ch))
+ return XML_ERROR_NO_MEMORY;
+ break;
+ }
+ name = poolStoreString(&temp2Pool, enc,
+ ptr + enc->minBytesPerChar,
+ next - enc->minBytesPerChar);
+ if (!name)
+ return XML_ERROR_NO_MEMORY;
+ entity = (ENTITY *)lookup(parser, &dtd->generalEntities, name, 0);
+ poolDiscard(&temp2Pool);
+ /* First, determine if a check for an existing declaration is needed;
+ if yes, check that the entity exists, and that it is internal.
+ */
+ if (pool == &dtd->pool) /* are we called from prolog? */
+ checkEntityDecl =
+#ifdef XML_DTD
+ prologState.documentEntity &&
+#endif /* XML_DTD */
+ (dtd->standalone
+ ? !openInternalEntities
+ : !dtd->hasParamEntityRefs);
+ else /* if (pool == &tempPool): we are called from content */
+ checkEntityDecl = !dtd->hasParamEntityRefs || dtd->standalone;
+ if (checkEntityDecl) {
+ if (!entity)
+ return XML_ERROR_UNDEFINED_ENTITY;
+ else if (!entity->is_internal)
+ return XML_ERROR_ENTITY_DECLARED_IN_PE;
+ }
+ else if (!entity) {
+ /* Cannot report skipped entity here - see comments on
+ skippedEntityHandler.
+ if (skippedEntityHandler)
+ skippedEntityHandler(handlerArg, name, 0);
+ */
+ /* Cannot call the default handler because this would be
+ out of sync with the call to the startElementHandler.
+ if ((pool == &tempPool) && defaultHandler)
+ reportDefault(parser, enc, ptr, next);
+ */
+ break;
+ }
+ if (entity->open) {
+ if (enc == encoding)
+ eventPtr = ptr;
+ return XML_ERROR_RECURSIVE_ENTITY_REF;
+ }
+ if (entity->notation) {
+ if (enc == encoding)
+ eventPtr = ptr;
+ return XML_ERROR_BINARY_ENTITY_REF;
+ }
+ if (!entity->textPtr) {
+ if (enc == encoding)
+ eventPtr = ptr;
+ return XML_ERROR_ATTRIBUTE_EXTERNAL_ENTITY_REF;
+ }
+ else {
+ enum XML_Error result;
+ const XML_Char *textEnd = entity->textPtr + entity->textLen;
+ entity->open = XML_TRUE;
+ result = appendAttributeValue(parser, internalEncoding, isCdata,
+ (char *)entity->textPtr,
+ (char *)textEnd, pool);
+ entity->open = XML_FALSE;
+ if (result)
+ return result;
+ }
+ }
+ break;
+ default:
+ if (enc == encoding)
+ eventPtr = ptr;
+ return XML_ERROR_UNEXPECTED_STATE;
+ }
+ ptr = next;
+ }
+ /* not reached */
+}
+
+static enum XML_Error
+storeEntityValue(XML_Parser parser,
+ const ENCODING *enc,
+ const char *entityTextPtr,
+ const char *entityTextEnd)
+{
+ DTD * const dtd = _dtd; /* save one level of indirection */
+ STRING_POOL *pool = &(dtd->entityValuePool);
+ enum XML_Error result = XML_ERROR_NONE;
+#ifdef XML_DTD
+ int oldInEntityValue = prologState.inEntityValue;
+ prologState.inEntityValue = 1;
+#endif /* XML_DTD */
+ /* never return Null for the value argument in EntityDeclHandler,
+ since this would indicate an external entity; therefore we
+ have to make sure that entityValuePool.start is not null */
+ if (!pool->blocks) {
+ if (!poolGrow(pool))
+ return XML_ERROR_NO_MEMORY;
+ }
+
+ for (;;) {
+ const char *next;
+ int tok = XmlEntityValueTok(enc, entityTextPtr, entityTextEnd, &next);
+ switch (tok) {
+ case XML_TOK_PARAM_ENTITY_REF:
+#ifdef XML_DTD
+ if (isParamEntity || enc != encoding) {
+ const XML_Char *name;
+ ENTITY *entity;
+ name = poolStoreString(&tempPool, enc,
+ entityTextPtr + enc->minBytesPerChar,
+ next - enc->minBytesPerChar);
+ if (!name) {
+ result = XML_ERROR_NO_MEMORY;
+ goto endEntityValue;
+ }
+ entity = (ENTITY *)lookup(parser, &dtd->paramEntities, name, 0);
+ poolDiscard(&tempPool);
+ if (!entity) {
+ /* not a well-formedness error - see XML 1.0: WFC Entity Declared */
+ /* cannot report skipped entity here - see comments on
+ skippedEntityHandler
+ if (skippedEntityHandler)
+ skippedEntityHandler(handlerArg, name, 0);
+ */
+ dtd->keepProcessing = dtd->standalone;
+ goto endEntityValue;
+ }
+ if (entity->open) {
+ if (enc == encoding)
+ eventPtr = entityTextPtr;
+ result = XML_ERROR_RECURSIVE_ENTITY_REF;
+ goto endEntityValue;
+ }
+ if (entity->systemId) {
+ if (externalEntityRefHandler) {
+ dtd->paramEntityRead = XML_FALSE;
+ entity->open = XML_TRUE;
+ if (!externalEntityRefHandler(externalEntityRefHandlerArg,
+ 0,
+ entity->base,
+ entity->systemId,
+ entity->publicId)) {
+ entity->open = XML_FALSE;
+ result = XML_ERROR_EXTERNAL_ENTITY_HANDLING;
+ goto endEntityValue;
+ }
+ entity->open = XML_FALSE;
+ if (!dtd->paramEntityRead)
+ dtd->keepProcessing = dtd->standalone;
+ }
+ else
+ dtd->keepProcessing = dtd->standalone;
+ }
+ else {
+ entity->open = XML_TRUE;
+ result = storeEntityValue(parser,
+ internalEncoding,
+ (char *)entity->textPtr,
+ (char *)(entity->textPtr
+ + entity->textLen));
+ entity->open = XML_FALSE;
+ if (result)
+ goto endEntityValue;
+ }
+ break;
+ }
+#endif /* XML_DTD */
+ /* In the internal subset, PE references are not legal
+ within markup declarations, e.g entity values in this case. */
+ eventPtr = entityTextPtr;
+ result = XML_ERROR_PARAM_ENTITY_REF;
+ goto endEntityValue;
+ case XML_TOK_NONE:
+ result = XML_ERROR_NONE;
+ goto endEntityValue;
+ case XML_TOK_ENTITY_REF:
+ case XML_TOK_DATA_CHARS:
+ if (!poolAppend(pool, enc, entityTextPtr, next)) {
+ result = XML_ERROR_NO_MEMORY;
+ goto endEntityValue;
+ }
+ break;
+ case XML_TOK_TRAILING_CR:
+ next = entityTextPtr + enc->minBytesPerChar;
+ /* fall through */
+ case XML_TOK_DATA_NEWLINE:
+ if (pool->end == pool->ptr && !poolGrow(pool)) {
+ result = XML_ERROR_NO_MEMORY;
+ goto endEntityValue;
+ }
+ *(pool->ptr)++ = 0xA;
+ break;
+ case XML_TOK_CHAR_REF:
+ {
+ XML_Char buf[XML_ENCODE_MAX];
+ int i;
+ int n = XmlCharRefNumber(enc, entityTextPtr);
+ if (n < 0) {
+ if (enc == encoding)
+ eventPtr = entityTextPtr;
+ result = XML_ERROR_BAD_CHAR_REF;
+ goto endEntityValue;
+ }
+ n = XmlEncode(n, (ICHAR *)buf);
+ if (!n) {
+ if (enc == encoding)
+ eventPtr = entityTextPtr;
+ result = XML_ERROR_BAD_CHAR_REF;
+ goto endEntityValue;
+ }
+ for (i = 0; i < n; i++) {
+ if (pool->end == pool->ptr && !poolGrow(pool)) {
+ result = XML_ERROR_NO_MEMORY;
+ goto endEntityValue;
+ }
+ *(pool->ptr)++ = buf[i];
+ }
+ }
+ break;
+ case XML_TOK_PARTIAL:
+ if (enc == encoding)
+ eventPtr = entityTextPtr;
+ result = XML_ERROR_INVALID_TOKEN;
+ goto endEntityValue;
+ case XML_TOK_INVALID:
+ if (enc == encoding)
+ eventPtr = next;
+ result = XML_ERROR_INVALID_TOKEN;
+ goto endEntityValue;
+ default:
+ if (enc == encoding)
+ eventPtr = entityTextPtr;
+ result = XML_ERROR_UNEXPECTED_STATE;
+ goto endEntityValue;
+ }
+ entityTextPtr = next;
+ }
+endEntityValue:
+#ifdef XML_DTD
+ prologState.inEntityValue = oldInEntityValue;
+#endif /* XML_DTD */
+ return result;
+}
+
+static void FASTCALL
+normalizeLines(XML_Char *s)
+{
+ XML_Char *p;
+ for (;; s++) {
+ if (*s == XML_T('\0'))
+ return;
+ if (*s == 0xD)
+ break;
+ }
+ p = s;
+ do {
+ if (*s == 0xD) {
+ *p++ = 0xA;
+ if (*++s == 0xA)
+ s++;
+ }
+ else
+ *p++ = *s++;
+ } while (*s);
+ *p = XML_T('\0');
+}
+
+static int
+reportProcessingInstruction(XML_Parser parser, const ENCODING *enc,
+ const char *start, const char *end)
+{
+ const XML_Char *target;
+ XML_Char *data;
+ const char *tem;
+ if (!processingInstructionHandler) {
+ if (defaultHandler)
+ reportDefault(parser, enc, start, end);
+ return 1;
+ }
+ start += enc->minBytesPerChar * 2;
+ tem = start + XmlNameLength(enc, start);
+ target = poolStoreString(&tempPool, enc, start, tem);
+ if (!target)
+ return 0;
+ poolFinish(&tempPool);
+ data = poolStoreString(&tempPool, enc,
+ XmlSkipS(enc, tem),
+ end - enc->minBytesPerChar*2);
+ if (!data)
+ return 0;
+ normalizeLines(data);
+ processingInstructionHandler(handlerArg, target, data);
+ poolClear(&tempPool);
+ return 1;
+}
+
+static int
+reportComment(XML_Parser parser, const ENCODING *enc,
+ const char *start, const char *end)
+{
+ XML_Char *data;
+ if (!commentHandler) {
+ if (defaultHandler)
+ reportDefault(parser, enc, start, end);
+ return 1;
+ }
+ data = poolStoreString(&tempPool,
+ enc,
+ start + enc->minBytesPerChar * 4,
+ end - enc->minBytesPerChar * 3);
+ if (!data)
+ return 0;
+ normalizeLines(data);
+ commentHandler(handlerArg, data);
+ poolClear(&tempPool);
+ return 1;
+}
+
+static void
+reportDefault(XML_Parser parser, const ENCODING *enc,
+ const char *s, const char *end)
+{
+ if (MUST_CONVERT(enc, s)) {
+ enum XML_Convert_Result convert_res;
+ const char **eventPP;
+ const char **eventEndPP;
+ if (enc == encoding) {
+ eventPP = &eventPtr;
+ eventEndPP = &eventEndPtr;
+ }
+ else {
+ eventPP = &(openInternalEntities->internalEventPtr);
+ eventEndPP = &(openInternalEntities->internalEventEndPtr);
+ }
+ do {
+ ICHAR *dataPtr = (ICHAR *)dataBuf;
+ convert_res = XmlConvert(enc, &s, end, &dataPtr, (ICHAR *)dataBufEnd);
+ *eventEndPP = s;
+ defaultHandler(handlerArg, dataBuf, (int)(dataPtr - (ICHAR *)dataBuf));
+ *eventPP = s;
+ } while ((convert_res != XML_CONVERT_COMPLETED) && (convert_res != XML_CONVERT_INPUT_INCOMPLETE));
+ }
+ else
+ defaultHandler(handlerArg, (XML_Char *)s, (int)((XML_Char *)end - (XML_Char *)s));
+}
+
+
+static int
+defineAttribute(ELEMENT_TYPE *type, ATTRIBUTE_ID *attId, XML_Bool isCdata,
+ XML_Bool isId, const XML_Char *value, XML_Parser parser)
+{
+ DEFAULT_ATTRIBUTE *att;
+ if (value || isId) {
+ /* The handling of default attributes gets messed up if we have
+ a default which duplicates a non-default. */
+ int i;
+ for (i = 0; i < type->nDefaultAtts; i++)
+ if (attId == type->defaultAtts[i].id)
+ return 1;
+ if (isId && !type->idAtt && !attId->xmlns)
+ type->idAtt = attId;
+ }
+ if (type->nDefaultAtts == type->allocDefaultAtts) {
+ if (type->allocDefaultAtts == 0) {
+ type->allocDefaultAtts = 8;
+ type->defaultAtts = (DEFAULT_ATTRIBUTE *)MALLOC(type->allocDefaultAtts
+ * sizeof(DEFAULT_ATTRIBUTE));
+ if (!type->defaultAtts)
+ return 0;
+ }
+ else {
+ DEFAULT_ATTRIBUTE *temp;
+ int count = type->allocDefaultAtts * 2;
+ temp = (DEFAULT_ATTRIBUTE *)
+ REALLOC(type->defaultAtts, (count * sizeof(DEFAULT_ATTRIBUTE)));
+ if (temp == NULL)
+ return 0;
+ type->allocDefaultAtts = count;
+ type->defaultAtts = temp;
+ }
+ }
+ att = type->defaultAtts + type->nDefaultAtts;
+ att->id = attId;
+ att->value = value;
+ att->isCdata = isCdata;
+ if (!isCdata)
+ attId->maybeTokenized = XML_TRUE;
+ type->nDefaultAtts += 1;
+ return 1;
+}
+
+static int
+setElementTypePrefix(XML_Parser parser, ELEMENT_TYPE *elementType)
+{
+ DTD * const dtd = _dtd; /* save one level of indirection */
+ const XML_Char *name;
+ for (name = elementType->name; *name; name++) {
+ if (*name == XML_T(ASCII_COLON)) {
+ PREFIX *prefix;
+ const XML_Char *s;
+ for (s = elementType->name; s != name; s++) {
+ if (!poolAppendChar(&dtd->pool, *s))
+ return 0;
+ }
+ if (!poolAppendChar(&dtd->pool, XML_T('\0')))
+ return 0;
+ prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool),
+ sizeof(PREFIX));
+ if (!prefix)
+ return 0;
+ if (prefix->name == poolStart(&dtd->pool))
+ poolFinish(&dtd->pool);
+ else
+ poolDiscard(&dtd->pool);
+ elementType->prefix = prefix;
+
+ }
+ }
+ return 1;
+}
+
+static ATTRIBUTE_ID *
+getAttributeId(XML_Parser parser, const ENCODING *enc,
+ const char *start, const char *end)
+{
+ DTD * const dtd = _dtd; /* save one level of indirection */
+ ATTRIBUTE_ID *id;
+ const XML_Char *name;
+ if (!poolAppendChar(&dtd->pool, XML_T('\0')))
+ return NULL;
+ name = poolStoreString(&dtd->pool, enc, start, end);
+ if (!name)
+ return NULL;
+ /* skip quotation mark - its storage will be re-used (like in name[-1]) */
+ ++name;
+ id = (ATTRIBUTE_ID *)lookup(parser, &dtd->attributeIds, name, sizeof(ATTRIBUTE_ID));
+ if (!id)
+ return NULL;
+ if (id->name != name)
+ poolDiscard(&dtd->pool);
+ else {
+ poolFinish(&dtd->pool);
+ if (!ns)
+ ;
+ else if (name[0] == XML_T(ASCII_x)
+ && name[1] == XML_T(ASCII_m)
+ && name[2] == XML_T(ASCII_l)
+ && name[3] == XML_T(ASCII_n)
+ && name[4] == XML_T(ASCII_s)
+ && (name[5] == XML_T('\0') || name[5] == XML_T(ASCII_COLON))) {
+ if (name[5] == XML_T('\0'))
+ id->prefix = &dtd->defaultPrefix;
+ else
+ id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, name + 6, sizeof(PREFIX));
+ id->xmlns = XML_TRUE;
+ }
+ else {
+ int i;
+ for (i = 0; name[i]; i++) {
+ /* attributes without prefix are *not* in the default namespace */
+ if (name[i] == XML_T(ASCII_COLON)) {
+ int j;
+ for (j = 0; j < i; j++) {
+ if (!poolAppendChar(&dtd->pool, name[j]))
+ return NULL;
+ }
+ if (!poolAppendChar(&dtd->pool, XML_T('\0')))
+ return NULL;
+ id->prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&dtd->pool),
+ sizeof(PREFIX));
+ if (!id->prefix)
+ return NULL;
+ if (id->prefix->name == poolStart(&dtd->pool))
+ poolFinish(&dtd->pool);
+ else
+ poolDiscard(&dtd->pool);
+ break;
+ }
+ }
+ }
+ }
+ return id;
+}
+
+#define CONTEXT_SEP XML_T(ASCII_FF)
+
+static const XML_Char *
+getContext(XML_Parser parser)
+{
+ DTD * const dtd = _dtd; /* save one level of indirection */
+ HASH_TABLE_ITER iter;
+ XML_Bool needSep = XML_FALSE;
+
+ if (dtd->defaultPrefix.binding) {
+ int i;
+ int len;
+ if (!poolAppendChar(&tempPool, XML_T(ASCII_EQUALS)))
+ return NULL;
+ len = dtd->defaultPrefix.binding->uriLen;
+ if (namespaceSeparator)
+ len--;
+ for (i = 0; i < len; i++)
+ if (!poolAppendChar(&tempPool, dtd->defaultPrefix.binding->uri[i]))
+ return NULL;
+ needSep = XML_TRUE;
+ }
+
+ hashTableIterInit(&iter, &(dtd->prefixes));
+ for (;;) {
+ int i;
+ int len;
+ const XML_Char *s;
+ PREFIX *prefix = (PREFIX *)hashTableIterNext(&iter);
+ if (!prefix)
+ break;
+ if (!prefix->binding)
+ continue;
+ if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP))
+ return NULL;
+ for (s = prefix->name; *s; s++)
+ if (!poolAppendChar(&tempPool, *s))
+ return NULL;
+ if (!poolAppendChar(&tempPool, XML_T(ASCII_EQUALS)))
+ return NULL;
+ len = prefix->binding->uriLen;
+ if (namespaceSeparator)
+ len--;
+ for (i = 0; i < len; i++)
+ if (!poolAppendChar(&tempPool, prefix->binding->uri[i]))
+ return NULL;
+ needSep = XML_TRUE;
+ }
+
+
+ hashTableIterInit(&iter, &(dtd->generalEntities));
+ for (;;) {
+ const XML_Char *s;
+ ENTITY *e = (ENTITY *)hashTableIterNext(&iter);
+ if (!e)
+ break;
+ if (!e->open)
+ continue;
+ if (needSep && !poolAppendChar(&tempPool, CONTEXT_SEP))
+ return NULL;
+ for (s = e->name; *s; s++)
+ if (!poolAppendChar(&tempPool, *s))
+ return 0;
+ needSep = XML_TRUE;
+ }
+
+ if (!poolAppendChar(&tempPool, XML_T('\0')))
+ return NULL;
+ return tempPool.start;
+}
+
+static XML_Bool
+setContext(XML_Parser parser, const XML_Char *context)
+{
+ DTD * const dtd = _dtd; /* save one level of indirection */
+ const XML_Char *s = context;
+
+ while (*context != XML_T('\0')) {
+ if (*s == CONTEXT_SEP || *s == XML_T('\0')) {
+ ENTITY *e;
+ if (!poolAppendChar(&tempPool, XML_T('\0')))
+ return XML_FALSE;
+ e = (ENTITY *)lookup(parser, &dtd->generalEntities, poolStart(&tempPool), 0);
+ if (e)
+ e->open = XML_TRUE;
+ if (*s != XML_T('\0'))
+ s++;
+ context = s;
+ poolDiscard(&tempPool);
+ }
+ else if (*s == XML_T(ASCII_EQUALS)) {
+ PREFIX *prefix;
+ if (poolLength(&tempPool) == 0)
+ prefix = &dtd->defaultPrefix;
+ else {
+ if (!poolAppendChar(&tempPool, XML_T('\0')))
+ return XML_FALSE;
+ prefix = (PREFIX *)lookup(parser, &dtd->prefixes, poolStart(&tempPool),
+ sizeof(PREFIX));
+ if (!prefix)
+ return XML_FALSE;
+ if (prefix->name == poolStart(&tempPool)) {
+ prefix->name = poolCopyString(&dtd->pool, prefix->name);
+ if (!prefix->name)
+ return XML_FALSE;
+ }
+ poolDiscard(&tempPool);
+ }
+ for (context = s + 1;
+ *context != CONTEXT_SEP && *context != XML_T('\0');
+ context++)
+ if (!poolAppendChar(&tempPool, *context))
+ return XML_FALSE;
+ if (!poolAppendChar(&tempPool, XML_T('\0')))
+ return XML_FALSE;
+ if (addBinding(parser, prefix, NULL, poolStart(&tempPool),
+ &inheritedBindings) != XML_ERROR_NONE)
+ return XML_FALSE;
+ poolDiscard(&tempPool);
+ if (*context != XML_T('\0'))
+ ++context;
+ s = context;
+ }
+ else {
+ if (!poolAppendChar(&tempPool, *s))
+ return XML_FALSE;
+ s++;
+ }
+ }
+ return XML_TRUE;
+}
+
+static void FASTCALL
+normalizePublicId(XML_Char *publicId)
+{
+ XML_Char *p = publicId;
+ XML_Char *s;
+ for (s = publicId; *s; s++) {
+ switch (*s) {
+ case 0x20:
+ case 0xD:
+ case 0xA:
+ if (p != publicId && p[-1] != 0x20)
+ *p++ = 0x20;
+ break;
+ default:
+ *p++ = *s;
+ }
+ }
+ if (p != publicId && p[-1] == 0x20)
+ --p;
+ *p = XML_T('\0');
+}
+
+static DTD *
+dtdCreate(const XML_Memory_Handling_Suite *ms)
+{
+ DTD *p = (DTD *)ms->malloc_fcn(sizeof(DTD));
+ if (p == NULL)
+ return p;
+ poolInit(&(p->pool), ms);
+ poolInit(&(p->entityValuePool), ms);
+ hashTableInit(&(p->generalEntities), ms);
+ hashTableInit(&(p->elementTypes), ms);
+ hashTableInit(&(p->attributeIds), ms);
+ hashTableInit(&(p->prefixes), ms);
+#ifdef XML_DTD
+ p->paramEntityRead = XML_FALSE;
+ hashTableInit(&(p->paramEntities), ms);
+#endif /* XML_DTD */
+ p->defaultPrefix.name = NULL;
+ p->defaultPrefix.binding = NULL;
+
+ p->in_eldecl = XML_FALSE;
+ p->scaffIndex = NULL;
+ p->scaffold = NULL;
+ p->scaffLevel = 0;
+ p->scaffSize = 0;
+ p->scaffCount = 0;
+ p->contentStringLen = 0;
+
+ p->keepProcessing = XML_TRUE;
+ p->hasParamEntityRefs = XML_FALSE;
+ p->standalone = XML_FALSE;
+ return p;
+}
+
+static void
+dtdReset(DTD *p, const XML_Memory_Handling_Suite *ms)
+{
+ HASH_TABLE_ITER iter;
+ hashTableIterInit(&iter, &(p->elementTypes));
+ for (;;) {
+ ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter);
+ if (!e)
+ break;
+ if (e->allocDefaultAtts != 0)
+ ms->free_fcn(e->defaultAtts);
+ }
+ hashTableClear(&(p->generalEntities));
+#ifdef XML_DTD
+ p->paramEntityRead = XML_FALSE;
+ hashTableClear(&(p->paramEntities));
+#endif /* XML_DTD */
+ hashTableClear(&(p->elementTypes));
+ hashTableClear(&(p->attributeIds));
+ hashTableClear(&(p->prefixes));
+ poolClear(&(p->pool));
+ poolClear(&(p->entityValuePool));
+ p->defaultPrefix.name = NULL;
+ p->defaultPrefix.binding = NULL;
+
+ p->in_eldecl = XML_FALSE;
+
+ ms->free_fcn(p->scaffIndex);
+ p->scaffIndex = NULL;
+ ms->free_fcn(p->scaffold);
+ p->scaffold = NULL;
+
+ p->scaffLevel = 0;
+ p->scaffSize = 0;
+ p->scaffCount = 0;
+ p->contentStringLen = 0;
+
+ p->keepProcessing = XML_TRUE;
+ p->hasParamEntityRefs = XML_FALSE;
+ p->standalone = XML_FALSE;
+}
+
+static void
+dtdDestroy(DTD *p, XML_Bool isDocEntity, const XML_Memory_Handling_Suite *ms)
+{
+ HASH_TABLE_ITER iter;
+ hashTableIterInit(&iter, &(p->elementTypes));
+ for (;;) {
+ ELEMENT_TYPE *e = (ELEMENT_TYPE *)hashTableIterNext(&iter);
+ if (!e)
+ break;
+ if (e->allocDefaultAtts != 0)
+ ms->free_fcn(e->defaultAtts);
+ }
+ hashTableDestroy(&(p->generalEntities));
+#ifdef XML_DTD
+ hashTableDestroy(&(p->paramEntities));
+#endif /* XML_DTD */
+ hashTableDestroy(&(p->elementTypes));
+ hashTableDestroy(&(p->attributeIds));
+ hashTableDestroy(&(p->prefixes));
+ poolDestroy(&(p->pool));
+ poolDestroy(&(p->entityValuePool));
+ if (isDocEntity) {
+ ms->free_fcn(p->scaffIndex);
+ ms->free_fcn(p->scaffold);
+ }
+ ms->free_fcn(p);
+}
+
+/* Do a deep copy of the DTD. Return 0 for out of memory, non-zero otherwise.
+ The new DTD has already been initialized.
+*/
+static int
+dtdCopy(XML_Parser oldParser, DTD *newDtd, const DTD *oldDtd, const XML_Memory_Handling_Suite *ms)
+{
+ HASH_TABLE_ITER iter;
+
+ /* Copy the prefix table. */
+
+ hashTableIterInit(&iter, &(oldDtd->prefixes));
+ for (;;) {
+ const XML_Char *name;
+ const PREFIX *oldP = (PREFIX *)hashTableIterNext(&iter);
+ if (!oldP)
+ break;
+ name = poolCopyString(&(newDtd->pool), oldP->name);
+ if (!name)
+ return 0;
+ if (!lookup(oldParser, &(newDtd->prefixes), name, sizeof(PREFIX)))
+ return 0;
+ }
+
+ hashTableIterInit(&iter, &(oldDtd->attributeIds));
+
+ /* Copy the attribute id table. */
+
+ for (;;) {
+ ATTRIBUTE_ID *newA;
+ const XML_Char *name;
+ const ATTRIBUTE_ID *oldA = (ATTRIBUTE_ID *)hashTableIterNext(&iter);
+
+ if (!oldA)
+ break;
+ /* Remember to allocate the scratch byte before the name. */
+ if (!poolAppendChar(&(newDtd->pool), XML_T('\0')))
+ return 0;
+ name = poolCopyString(&(newDtd->pool), oldA->name);
+ if (!name)
+ return 0;
+ ++name;
+ newA = (ATTRIBUTE_ID *)lookup(oldParser, &(newDtd->attributeIds), name,
+ sizeof(ATTRIBUTE_ID));
+ if (!newA)
+ return 0;
+ newA->maybeTokenized = oldA->maybeTokenized;
+ if (oldA->prefix) {
+ newA->xmlns = oldA->xmlns;
+ if (oldA->prefix == &oldDtd->defaultPrefix)
+ newA->prefix = &newDtd->defaultPrefix;
+ else
+ newA->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes),
+ oldA->prefix->name, 0);
+ }
+ }
+
+ /* Copy the element type table. */
+
+ hashTableIterInit(&iter, &(oldDtd->elementTypes));
+
+ for (;;) {
+ int i;
+ ELEMENT_TYPE *newE;
+ const XML_Char *name;
+ const ELEMENT_TYPE *oldE = (ELEMENT_TYPE *)hashTableIterNext(&iter);
+ if (!oldE)
+ break;
+ name = poolCopyString(&(newDtd->pool), oldE->name);
+ if (!name)
+ return 0;
+ newE = (ELEMENT_TYPE *)lookup(oldParser, &(newDtd->elementTypes), name,
+ sizeof(ELEMENT_TYPE));
+ if (!newE)
+ return 0;
+ if (oldE->nDefaultAtts) {
+ newE->defaultAtts = (DEFAULT_ATTRIBUTE *)
+ ms->malloc_fcn(oldE->nDefaultAtts * sizeof(DEFAULT_ATTRIBUTE));
+ if (!newE->defaultAtts) {
+ ms->free_fcn(newE);
+ return 0;
+ }
+ }
+ if (oldE->idAtt)
+ newE->idAtt = (ATTRIBUTE_ID *)
+ lookup(oldParser, &(newDtd->attributeIds), oldE->idAtt->name, 0);
+ newE->allocDefaultAtts = newE->nDefaultAtts = oldE->nDefaultAtts;
+ if (oldE->prefix)
+ newE->prefix = (PREFIX *)lookup(oldParser, &(newDtd->prefixes),
+ oldE->prefix->name, 0);
+ for (i = 0; i < newE->nDefaultAtts; i++) {
+ newE->defaultAtts[i].id = (ATTRIBUTE_ID *)
+ lookup(oldParser, &(newDtd->attributeIds), oldE->defaultAtts[i].id->name, 0);
+ newE->defaultAtts[i].isCdata = oldE->defaultAtts[i].isCdata;
+ if (oldE->defaultAtts[i].value) {
+ newE->defaultAtts[i].value
+ = poolCopyString(&(newDtd->pool), oldE->defaultAtts[i].value);
+ if (!newE->defaultAtts[i].value)
+ return 0;
+ }
+ else
+ newE->defaultAtts[i].value = NULL;
+ }
+ }
+
+ /* Copy the entity tables. */
+ if (!copyEntityTable(oldParser,
+ &(newDtd->generalEntities),
+ &(newDtd->pool),
+ &(oldDtd->generalEntities)))
+ return 0;
+
+#ifdef XML_DTD
+ if (!copyEntityTable(oldParser,
+ &(newDtd->paramEntities),
+ &(newDtd->pool),
+ &(oldDtd->paramEntities)))
+ return 0;
+ newDtd->paramEntityRead = oldDtd->paramEntityRead;
+#endif /* XML_DTD */
+
+ newDtd->keepProcessing = oldDtd->keepProcessing;
+ newDtd->hasParamEntityRefs = oldDtd->hasParamEntityRefs;
+ newDtd->standalone = oldDtd->standalone;
+
+ /* Don't want deep copying for scaffolding */
+ newDtd->in_eldecl = oldDtd->in_eldecl;
+ newDtd->scaffold = oldDtd->scaffold;
+ newDtd->contentStringLen = oldDtd->contentStringLen;
+ newDtd->scaffSize = oldDtd->scaffSize;
+ newDtd->scaffLevel = oldDtd->scaffLevel;
+ newDtd->scaffIndex = oldDtd->scaffIndex;
+
+ return 1;
+} /* End dtdCopy */
+
+static int
+copyEntityTable(XML_Parser oldParser,
+ HASH_TABLE *newTable,
+ STRING_POOL *newPool,
+ const HASH_TABLE *oldTable)
+{
+ HASH_TABLE_ITER iter;
+ const XML_Char *cachedOldBase = NULL;
+ const XML_Char *cachedNewBase = NULL;
+
+ hashTableIterInit(&iter, oldTable);
+
+ for (;;) {
+ ENTITY *newE;
+ const XML_Char *name;
+ const ENTITY *oldE = (ENTITY *)hashTableIterNext(&iter);
+ if (!oldE)
+ break;
+ name = poolCopyString(newPool, oldE->name);
+ if (!name)
+ return 0;
+ newE = (ENTITY *)lookup(oldParser, newTable, name, sizeof(ENTITY));
+ if (!newE)
+ return 0;
+ if (oldE->systemId) {
+ const XML_Char *tem = poolCopyString(newPool, oldE->systemId);
+ if (!tem)
+ return 0;
+ newE->systemId = tem;
+ if (oldE->base) {
+ if (oldE->base == cachedOldBase)
+ newE->base = cachedNewBase;
+ else {
+ cachedOldBase = oldE->base;
+ tem = poolCopyString(newPool, cachedOldBase);
+ if (!tem)
+ return 0;
+ cachedNewBase = newE->base = tem;
+ }
+ }
+ if (oldE->publicId) {
+ tem = poolCopyString(newPool, oldE->publicId);
+ if (!tem)
+ return 0;
+ newE->publicId = tem;
+ }
+ }
+ else {
+ const XML_Char *tem = poolCopyStringN(newPool, oldE->textPtr,
+ oldE->textLen);
+ if (!tem)
+ return 0;
+ newE->textPtr = tem;
+ newE->textLen = oldE->textLen;
+ }
+ if (oldE->notation) {
+ const XML_Char *tem = poolCopyString(newPool, oldE->notation);
+ if (!tem)
+ return 0;
+ newE->notation = tem;
+ }
+ newE->is_param = oldE->is_param;
+ newE->is_internal = oldE->is_internal;
+ }
+ return 1;
+}
+
+#define INIT_POWER 6
+
+static XML_Bool FASTCALL
+keyeq(KEY s1, KEY s2)
+{
+ for (; *s1 == *s2; s1++, s2++)
+ if (*s1 == 0)
+ return XML_TRUE;
+ return XML_FALSE;
+}
+
+static unsigned long FASTCALL
+hash(XML_Parser parser, KEY s)
+{
+ unsigned long h = hash_secret_salt;
+ while (*s)
+ h = CHAR_HASH(h, *s++);
+ return h;
+}
+
+static NAMED *
+lookup(XML_Parser parser, HASH_TABLE *table, KEY name, size_t createSize)
+{
+ size_t i;
+ if (table->size == 0) {
+ size_t tsize;
+ if (!createSize)
+ return NULL;
+ table->power = INIT_POWER;
+ /* table->size is a power of 2 */
+ table->size = (size_t)1 << INIT_POWER;
+ tsize = table->size * sizeof(NAMED *);
+ table->v = (NAMED **)table->mem->malloc_fcn(tsize);
+ if (!table->v) {
+ table->size = 0;
+ return NULL;
+ }
+ memset(table->v, 0, tsize);
+ i = hash(parser, name) & ((unsigned long)table->size - 1);
+ }
+ else {
+ unsigned long h = hash(parser, name);
+ unsigned long mask = (unsigned long)table->size - 1;
+ unsigned char step = 0;
+ i = h & mask;
+ while (table->v[i]) {
+ if (keyeq(name, table->v[i]->name))
+ return table->v[i];
+ if (!step)
+ step = PROBE_STEP(h, mask, table->power);
+ i < step ? (i += table->size - step) : (i -= step);
+ }
+ if (!createSize)
+ return NULL;
+
+ /* check for overflow (table is half full) */
+ if (table->used >> (table->power - 1)) {
+ unsigned char newPower = table->power + 1;
+ size_t newSize = (size_t)1 << newPower;
+ unsigned long newMask = (unsigned long)newSize - 1;
+ size_t tsize = newSize * sizeof(NAMED *);
+ NAMED **newV = (NAMED **)table->mem->malloc_fcn(tsize);
+ if (!newV)
+ return NULL;
+ memset(newV, 0, tsize);
+ for (i = 0; i < table->size; i++)
+ if (table->v[i]) {
+ unsigned long newHash = hash(parser, table->v[i]->name);
+ size_t j = newHash & newMask;
+ step = 0;
+ while (newV[j]) {
+ if (!step)
+ step = PROBE_STEP(newHash, newMask, newPower);
+ j < step ? (j += newSize - step) : (j -= step);
+ }
+ newV[j] = table->v[i];
+ }
+ table->mem->free_fcn(table->v);
+ table->v = newV;
+ table->power = newPower;
+ table->size = newSize;
+ i = h & newMask;
+ step = 0;
+ while (table->v[i]) {
+ if (!step)
+ step = PROBE_STEP(h, newMask, newPower);
+ i < step ? (i += newSize - step) : (i -= step);
+ }
+ }
+ }
+ table->v[i] = (NAMED *)table->mem->malloc_fcn(createSize);
+ if (!table->v[i])
+ return NULL;
+ memset(table->v[i], 0, createSize);
+ table->v[i]->name = name;
+ (table->used)++;
+ return table->v[i];
+}
+
+static void FASTCALL
+hashTableClear(HASH_TABLE *table)
+{
+ size_t i;
+ for (i = 0; i < table->size; i++) {
+ table->mem->free_fcn(table->v[i]);
+ table->v[i] = NULL;
+ }
+ table->used = 0;
+}
+
+static void FASTCALL
+hashTableDestroy(HASH_TABLE *table)
+{
+ size_t i;
+ for (i = 0; i < table->size; i++)
+ table->mem->free_fcn(table->v[i]);
+ table->mem->free_fcn(table->v);
+}
+
+static void FASTCALL
+hashTableInit(HASH_TABLE *p, const XML_Memory_Handling_Suite *ms)
+{
+ p->power = 0;
+ p->size = 0;
+ p->used = 0;
+ p->v = NULL;
+ p->mem = ms;
+}
+
+static void FASTCALL
+hashTableIterInit(HASH_TABLE_ITER *iter, const HASH_TABLE *table)
+{
+ iter->p = table->v;
+ iter->end = iter->p + table->size;
+}
+
+static NAMED * FASTCALL
+hashTableIterNext(HASH_TABLE_ITER *iter)
+{
+ while (iter->p != iter->end) {
+ NAMED *tem = *(iter->p)++;
+ if (tem)
+ return tem;
+ }
+ return NULL;
+}
+
+static void FASTCALL
+poolInit(STRING_POOL *pool, const XML_Memory_Handling_Suite *ms)
+{
+ pool->blocks = NULL;
+ pool->freeBlocks = NULL;
+ pool->start = NULL;
+ pool->ptr = NULL;
+ pool->end = NULL;
+ pool->mem = ms;
+}
+
+static void FASTCALL
+poolClear(STRING_POOL *pool)
+{
+ if (!pool->freeBlocks)
+ pool->freeBlocks = pool->blocks;
+ else {
+ BLOCK *p = pool->blocks;
+ while (p) {
+ BLOCK *tem = p->next;
+ p->next = pool->freeBlocks;
+ pool->freeBlocks = p;
+ p = tem;
+ }
+ }
+ pool->blocks = NULL;
+ pool->start = NULL;
+ pool->ptr = NULL;
+ pool->end = NULL;
+}
+
+static void FASTCALL
+poolDestroy(STRING_POOL *pool)
+{
+ BLOCK *p = pool->blocks;
+ while (p) {
+ BLOCK *tem = p->next;
+ pool->mem->free_fcn(p);
+ p = tem;
+ }
+ p = pool->freeBlocks;
+ while (p) {
+ BLOCK *tem = p->next;
+ pool->mem->free_fcn(p);
+ p = tem;
+ }
+}
+
+static XML_Char *
+poolAppend(STRING_POOL *pool, const ENCODING *enc,
+ const char *ptr, const char *end)
+{
+ if (!pool->ptr && !poolGrow(pool))
+ return NULL;
+ for (;;) {
+ const enum XML_Convert_Result convert_res = XmlConvert(enc, &ptr, end, (ICHAR **)&(pool->ptr), (ICHAR *)pool->end);
+ if ((convert_res == XML_CONVERT_COMPLETED) || (convert_res == XML_CONVERT_INPUT_INCOMPLETE))
+ break;
+ if (!poolGrow(pool))
+ return NULL;
+ }
+ return pool->start;
+}
+
+static const XML_Char * FASTCALL
+poolCopyString(STRING_POOL *pool, const XML_Char *s)
+{
+ do {
+ if (!poolAppendChar(pool, *s))
+ return NULL;
+ } while (*s++);
+ s = pool->start;
+ poolFinish(pool);
+ return s;
+}
+
+static const XML_Char *
+poolCopyStringN(STRING_POOL *pool, const XML_Char *s, int n)
+{
+ if (!pool->ptr && !poolGrow(pool))
+ return NULL;
+ for (; n > 0; --n, s++) {
+ if (!poolAppendChar(pool, *s))
+ return NULL;
+ }
+ s = pool->start;
+ poolFinish(pool);
+ return s;
+}
+
+static const XML_Char * FASTCALL
+poolAppendString(STRING_POOL *pool, const XML_Char *s)
+{
+ while (*s) {
+ if (!poolAppendChar(pool, *s))
+ return NULL;
+ s++;
+ }
+ return pool->start;
+}
+
+static XML_Char *
+poolStoreString(STRING_POOL *pool, const ENCODING *enc,
+ const char *ptr, const char *end)
+{
+ if (!poolAppend(pool, enc, ptr, end))
+ return NULL;
+ if (pool->ptr == pool->end && !poolGrow(pool))
+ return NULL;
+ *(pool->ptr)++ = 0;
+ return pool->start;
+}
+
+static XML_Bool FASTCALL
+poolGrow(STRING_POOL *pool)
+{
+ if (pool->freeBlocks) {
+ if (pool->start == 0) {
+ pool->blocks = pool->freeBlocks;
+ pool->freeBlocks = pool->freeBlocks->next;
+ pool->blocks->next = NULL;
+ pool->start = pool->blocks->s;
+ pool->end = pool->start + pool->blocks->size;
+ pool->ptr = pool->start;
+ return XML_TRUE;
+ }
+ if (pool->end - pool->start < pool->freeBlocks->size) {
+ BLOCK *tem = pool->freeBlocks->next;
+ pool->freeBlocks->next = pool->blocks;
+ pool->blocks = pool->freeBlocks;
+ pool->freeBlocks = tem;
+ memcpy(pool->blocks->s, pool->start,
+ (pool->end - pool->start) * sizeof(XML_Char));
+ pool->ptr = pool->blocks->s + (pool->ptr - pool->start);
+ pool->start = pool->blocks->s;
+ pool->end = pool->start + pool->blocks->size;
+ return XML_TRUE;
+ }
+ }
+ if (pool->blocks && pool->start == pool->blocks->s) {
+ BLOCK *temp;
+ int blockSize = (int)((unsigned)(pool->end - pool->start)*2U);
+
+ if (blockSize < 0)
+ return XML_FALSE;
+
+ temp = (BLOCK *)
+ pool->mem->realloc_fcn(pool->blocks,
+ (offsetof(BLOCK, s)
+ + blockSize * sizeof(XML_Char)));
+ if (temp == NULL)
+ return XML_FALSE;
+ pool->blocks = temp;
+ pool->blocks->size = blockSize;
+ pool->ptr = pool->blocks->s + (pool->ptr - pool->start);
+ pool->start = pool->blocks->s;
+ pool->end = pool->start + blockSize;
+ }
+ else {
+ BLOCK *tem;
+ int blockSize = (int)(pool->end - pool->start);
+
+ if (blockSize < 0)
+ return XML_FALSE;
+
+ if (blockSize < INIT_BLOCK_SIZE)
+ blockSize = INIT_BLOCK_SIZE;
+ else
+ blockSize *= 2;
+ tem = (BLOCK *)pool->mem->malloc_fcn(offsetof(BLOCK, s)
+ + blockSize * sizeof(XML_Char));
+ if (!tem)
+ return XML_FALSE;
+ tem->size = blockSize;
+ tem->next = pool->blocks;
+ pool->blocks = tem;
+ if (pool->ptr != pool->start)
+ memcpy(tem->s, pool->start,
+ (pool->ptr - pool->start) * sizeof(XML_Char));
+ pool->ptr = tem->s + (pool->ptr - pool->start);
+ pool->start = tem->s;
+ pool->end = tem->s + blockSize;
+ }
+ return XML_TRUE;
+}
+
+static int FASTCALL
+nextScaffoldPart(XML_Parser parser)
+{
+ DTD * const dtd = _dtd; /* save one level of indirection */
+ CONTENT_SCAFFOLD * me;
+ int next;
+
+ if (!dtd->scaffIndex) {
+ dtd->scaffIndex = (int *)MALLOC(groupSize * sizeof(int));
+ if (!dtd->scaffIndex)
+ return -1;
+ dtd->scaffIndex[0] = 0;
+ }
+
+ if (dtd->scaffCount >= dtd->scaffSize) {
+ CONTENT_SCAFFOLD *temp;
+ if (dtd->scaffold) {
+ temp = (CONTENT_SCAFFOLD *)
+ REALLOC(dtd->scaffold, dtd->scaffSize * 2 * sizeof(CONTENT_SCAFFOLD));
+ if (temp == NULL)
+ return -1;
+ dtd->scaffSize *= 2;
+ }
+ else {
+ temp = (CONTENT_SCAFFOLD *)MALLOC(INIT_SCAFFOLD_ELEMENTS
+ * sizeof(CONTENT_SCAFFOLD));
+ if (temp == NULL)
+ return -1;
+ dtd->scaffSize = INIT_SCAFFOLD_ELEMENTS;
+ }
+ dtd->scaffold = temp;
+ }
+ next = dtd->scaffCount++;
+ me = &dtd->scaffold[next];
+ if (dtd->scaffLevel) {
+ CONTENT_SCAFFOLD *parent = &dtd->scaffold[dtd->scaffIndex[dtd->scaffLevel-1]];
+ if (parent->lastchild) {
+ dtd->scaffold[parent->lastchild].nextsib = next;
+ }
+ if (!parent->childcnt)
+ parent->firstchild = next;
+ parent->lastchild = next;
+ parent->childcnt++;
+ }
+ me->firstchild = me->lastchild = me->childcnt = me->nextsib = 0;
+ return next;
+}
+
+static void
+build_node(XML_Parser parser,
+ int src_node,
+ XML_Content *dest,
+ XML_Content **contpos,
+ XML_Char **strpos)
+{
+ DTD * const dtd = _dtd; /* save one level of indirection */
+ dest->type = dtd->scaffold[src_node].type;
+ dest->quant = dtd->scaffold[src_node].quant;
+ if (dest->type == XML_CTYPE_NAME) {
+ const XML_Char *src;
+ dest->name = *strpos;
+ src = dtd->scaffold[src_node].name;
+ for (;;) {
+ *(*strpos)++ = *src;
+ if (!*src)
+ break;
+ src++;
+ }
+ dest->numchildren = 0;
+ dest->children = NULL;
+ }
+ else {
+ unsigned int i;
+ int cn;
+ dest->numchildren = dtd->scaffold[src_node].childcnt;
+ dest->children = *contpos;
+ *contpos += dest->numchildren;
+ for (i = 0, cn = dtd->scaffold[src_node].firstchild;
+ i < dest->numchildren;
+ i++, cn = dtd->scaffold[cn].nextsib) {
+ build_node(parser, cn, &(dest->children[i]), contpos, strpos);
+ }
+ dest->name = NULL;
+ }
+}
+
+static XML_Content *
+build_model (XML_Parser parser)
+{
+ DTD * const dtd = _dtd; /* save one level of indirection */
+ XML_Content *ret;
+ XML_Content *cpos;
+ XML_Char * str;
+ int allocsize = (dtd->scaffCount * sizeof(XML_Content)
+ + (dtd->contentStringLen * sizeof(XML_Char)));
+
+ ret = (XML_Content *)MALLOC(allocsize);
+ if (!ret)
+ return NULL;
+
+ str = (XML_Char *) (&ret[dtd->scaffCount]);
+ cpos = &ret[1];
+
+ build_node(parser, 0, ret, &cpos, &str);
+ return ret;
+}
+
+static ELEMENT_TYPE *
+getElementType(XML_Parser parser,
+ const ENCODING *enc,
+ const char *ptr,
+ const char *end)
+{
+ DTD * const dtd = _dtd; /* save one level of indirection */
+ const XML_Char *name = poolStoreString(&dtd->pool, enc, ptr, end);
+ ELEMENT_TYPE *ret;
+
+ if (!name)
+ return NULL;
+ ret = (ELEMENT_TYPE *) lookup(parser, &dtd->elementTypes, name, sizeof(ELEMENT_TYPE));
+ if (!ret)
+ return NULL;
+ if (ret->name != name)
+ poolDiscard(&dtd->pool);
+ else {
+ poolFinish(&dtd->pool);
+ if (!setElementTypePrefix(parser, ret))
+ return NULL;
+ }
+ return ret;
+}
diff --git a/deps/EXPAT/expat/xmlrole.c b/deps/EXPAT/expat/xmlrole.c
new file mode 100644
index 000000000..8475238d3
--- /dev/null
+++ b/deps/EXPAT/expat/xmlrole.c
@@ -0,0 +1,1322 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+ See the file COPYING for copying permission.
+*/
+
+#include <stddef.h>
+#include "expat_config.h"
+#include "expat_external.h"
+#include "internal.h"
+#include "xmlrole.h"
+#include "ascii.h"
+
+/* Doesn't check:
+
+ that ,| are not mixed in a model group
+ content of literals
+
+*/
+
+static const char KW_ANY[] = {
+ ASCII_A, ASCII_N, ASCII_Y, '\0' };
+static const char KW_ATTLIST[] = {
+ ASCII_A, ASCII_T, ASCII_T, ASCII_L, ASCII_I, ASCII_S, ASCII_T, '\0' };
+static const char KW_CDATA[] = {
+ ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
+static const char KW_DOCTYPE[] = {
+ ASCII_D, ASCII_O, ASCII_C, ASCII_T, ASCII_Y, ASCII_P, ASCII_E, '\0' };
+static const char KW_ELEMENT[] = {
+ ASCII_E, ASCII_L, ASCII_E, ASCII_M, ASCII_E, ASCII_N, ASCII_T, '\0' };
+static const char KW_EMPTY[] = {
+ ASCII_E, ASCII_M, ASCII_P, ASCII_T, ASCII_Y, '\0' };
+static const char KW_ENTITIES[] = {
+ ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_I, ASCII_E, ASCII_S,
+ '\0' };
+static const char KW_ENTITY[] = {
+ ASCII_E, ASCII_N, ASCII_T, ASCII_I, ASCII_T, ASCII_Y, '\0' };
+static const char KW_FIXED[] = {
+ ASCII_F, ASCII_I, ASCII_X, ASCII_E, ASCII_D, '\0' };
+static const char KW_ID[] = {
+ ASCII_I, ASCII_D, '\0' };
+static const char KW_IDREF[] = {
+ ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, '\0' };
+static const char KW_IDREFS[] = {
+ ASCII_I, ASCII_D, ASCII_R, ASCII_E, ASCII_F, ASCII_S, '\0' };
+#ifdef XML_DTD
+static const char KW_IGNORE[] = {
+ ASCII_I, ASCII_G, ASCII_N, ASCII_O, ASCII_R, ASCII_E, '\0' };
+#endif
+static const char KW_IMPLIED[] = {
+ ASCII_I, ASCII_M, ASCII_P, ASCII_L, ASCII_I, ASCII_E, ASCII_D, '\0' };
+#ifdef XML_DTD
+static const char KW_INCLUDE[] = {
+ ASCII_I, ASCII_N, ASCII_C, ASCII_L, ASCII_U, ASCII_D, ASCII_E, '\0' };
+#endif
+static const char KW_NDATA[] = {
+ ASCII_N, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
+static const char KW_NMTOKEN[] = {
+ ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, '\0' };
+static const char KW_NMTOKENS[] = {
+ ASCII_N, ASCII_M, ASCII_T, ASCII_O, ASCII_K, ASCII_E, ASCII_N, ASCII_S,
+ '\0' };
+static const char KW_NOTATION[] =
+ { ASCII_N, ASCII_O, ASCII_T, ASCII_A, ASCII_T, ASCII_I, ASCII_O, ASCII_N,
+ '\0' };
+static const char KW_PCDATA[] = {
+ ASCII_P, ASCII_C, ASCII_D, ASCII_A, ASCII_T, ASCII_A, '\0' };
+static const char KW_PUBLIC[] = {
+ ASCII_P, ASCII_U, ASCII_B, ASCII_L, ASCII_I, ASCII_C, '\0' };
+static const char KW_REQUIRED[] = {
+ ASCII_R, ASCII_E, ASCII_Q, ASCII_U, ASCII_I, ASCII_R, ASCII_E, ASCII_D,
+ '\0' };
+static const char KW_SYSTEM[] = {
+ ASCII_S, ASCII_Y, ASCII_S, ASCII_T, ASCII_E, ASCII_M, '\0' };
+
+#ifndef MIN_BYTES_PER_CHAR
+#define MIN_BYTES_PER_CHAR(enc) ((enc)->minBytesPerChar)
+#endif
+
+#ifdef XML_DTD
+#define setTopLevel(state) \
+ ((state)->handler = ((state)->documentEntity \
+ ? internalSubset \
+ : externalSubset1))
+#else /* not XML_DTD */
+#define setTopLevel(state) ((state)->handler = internalSubset)
+#endif /* not XML_DTD */
+
+typedef int PTRCALL PROLOG_HANDLER(PROLOG_STATE *state,
+ int tok,
+ const char *ptr,
+ const char *end,
+ const ENCODING *enc);
+
+static PROLOG_HANDLER
+ prolog0, prolog1, prolog2,
+ doctype0, doctype1, doctype2, doctype3, doctype4, doctype5,
+ internalSubset,
+ entity0, entity1, entity2, entity3, entity4, entity5, entity6,
+ entity7, entity8, entity9, entity10,
+ notation0, notation1, notation2, notation3, notation4,
+ attlist0, attlist1, attlist2, attlist3, attlist4, attlist5, attlist6,
+ attlist7, attlist8, attlist9,
+ element0, element1, element2, element3, element4, element5, element6,
+ element7,
+#ifdef XML_DTD
+ externalSubset0, externalSubset1,
+ condSect0, condSect1, condSect2,
+#endif /* XML_DTD */
+ declClose,
+ error;
+
+static int FASTCALL common(PROLOG_STATE *state, int tok);
+
+static int PTRCALL
+prolog0(PROLOG_STATE *state,
+ int tok,
+ const char *ptr,
+ const char *end,
+ const ENCODING *enc)
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ state->handler = prolog1;
+ return XML_ROLE_NONE;
+ case XML_TOK_XML_DECL:
+ state->handler = prolog1;
+ return XML_ROLE_XML_DECL;
+ case XML_TOK_PI:
+ state->handler = prolog1;
+ return XML_ROLE_PI;
+ case XML_TOK_COMMENT:
+ state->handler = prolog1;
+ return XML_ROLE_COMMENT;
+ case XML_TOK_BOM:
+ return XML_ROLE_NONE;
+ case XML_TOK_DECL_OPEN:
+ if (!XmlNameMatchesAscii(enc,
+ ptr + 2 * MIN_BYTES_PER_CHAR(enc),
+ end,
+ KW_DOCTYPE))
+ break;
+ state->handler = doctype0;
+ return XML_ROLE_DOCTYPE_NONE;
+ case XML_TOK_INSTANCE_START:
+ state->handler = error;
+ return XML_ROLE_INSTANCE_START;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+prolog1(PROLOG_STATE *state,
+ int tok,
+ const char *ptr,
+ const char *end,
+ const ENCODING *enc)
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_NONE;
+ case XML_TOK_PI:
+ return XML_ROLE_PI;
+ case XML_TOK_COMMENT:
+ return XML_ROLE_COMMENT;
+ case XML_TOK_BOM:
+ return XML_ROLE_NONE;
+ case XML_TOK_DECL_OPEN:
+ if (!XmlNameMatchesAscii(enc,
+ ptr + 2 * MIN_BYTES_PER_CHAR(enc),
+ end,
+ KW_DOCTYPE))
+ break;
+ state->handler = doctype0;
+ return XML_ROLE_DOCTYPE_NONE;
+ case XML_TOK_INSTANCE_START:
+ state->handler = error;
+ return XML_ROLE_INSTANCE_START;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+prolog2(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_NONE;
+ case XML_TOK_PI:
+ return XML_ROLE_PI;
+ case XML_TOK_COMMENT:
+ return XML_ROLE_COMMENT;
+ case XML_TOK_INSTANCE_START:
+ state->handler = error;
+ return XML_ROLE_INSTANCE_START;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+doctype0(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_DOCTYPE_NONE;
+ case XML_TOK_NAME:
+ case XML_TOK_PREFIXED_NAME:
+ state->handler = doctype1;
+ return XML_ROLE_DOCTYPE_NAME;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+doctype1(PROLOG_STATE *state,
+ int tok,
+ const char *ptr,
+ const char *end,
+ const ENCODING *enc)
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_DOCTYPE_NONE;
+ case XML_TOK_OPEN_BRACKET:
+ state->handler = internalSubset;
+ return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
+ case XML_TOK_DECL_CLOSE:
+ state->handler = prolog2;
+ return XML_ROLE_DOCTYPE_CLOSE;
+ case XML_TOK_NAME:
+ if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
+ state->handler = doctype3;
+ return XML_ROLE_DOCTYPE_NONE;
+ }
+ if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
+ state->handler = doctype2;
+ return XML_ROLE_DOCTYPE_NONE;
+ }
+ break;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+doctype2(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_DOCTYPE_NONE;
+ case XML_TOK_LITERAL:
+ state->handler = doctype3;
+ return XML_ROLE_DOCTYPE_PUBLIC_ID;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+doctype3(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_DOCTYPE_NONE;
+ case XML_TOK_LITERAL:
+ state->handler = doctype4;
+ return XML_ROLE_DOCTYPE_SYSTEM_ID;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+doctype4(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_DOCTYPE_NONE;
+ case XML_TOK_OPEN_BRACKET:
+ state->handler = internalSubset;
+ return XML_ROLE_DOCTYPE_INTERNAL_SUBSET;
+ case XML_TOK_DECL_CLOSE:
+ state->handler = prolog2;
+ return XML_ROLE_DOCTYPE_CLOSE;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+doctype5(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_DOCTYPE_NONE;
+ case XML_TOK_DECL_CLOSE:
+ state->handler = prolog2;
+ return XML_ROLE_DOCTYPE_CLOSE;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+internalSubset(PROLOG_STATE *state,
+ int tok,
+ const char *ptr,
+ const char *end,
+ const ENCODING *enc)
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_NONE;
+ case XML_TOK_DECL_OPEN:
+ if (XmlNameMatchesAscii(enc,
+ ptr + 2 * MIN_BYTES_PER_CHAR(enc),
+ end,
+ KW_ENTITY)) {
+ state->handler = entity0;
+ return XML_ROLE_ENTITY_NONE;
+ }
+ if (XmlNameMatchesAscii(enc,
+ ptr + 2 * MIN_BYTES_PER_CHAR(enc),
+ end,
+ KW_ATTLIST)) {
+ state->handler = attlist0;
+ return XML_ROLE_ATTLIST_NONE;
+ }
+ if (XmlNameMatchesAscii(enc,
+ ptr + 2 * MIN_BYTES_PER_CHAR(enc),
+ end,
+ KW_ELEMENT)) {
+ state->handler = element0;
+ return XML_ROLE_ELEMENT_NONE;
+ }
+ if (XmlNameMatchesAscii(enc,
+ ptr + 2 * MIN_BYTES_PER_CHAR(enc),
+ end,
+ KW_NOTATION)) {
+ state->handler = notation0;
+ return XML_ROLE_NOTATION_NONE;
+ }
+ break;
+ case XML_TOK_PI:
+ return XML_ROLE_PI;
+ case XML_TOK_COMMENT:
+ return XML_ROLE_COMMENT;
+ case XML_TOK_PARAM_ENTITY_REF:
+ return XML_ROLE_PARAM_ENTITY_REF;
+ case XML_TOK_CLOSE_BRACKET:
+ state->handler = doctype5;
+ return XML_ROLE_DOCTYPE_NONE;
+ case XML_TOK_NONE:
+ return XML_ROLE_NONE;
+ }
+ return common(state, tok);
+}
+
+#ifdef XML_DTD
+
+static int PTRCALL
+externalSubset0(PROLOG_STATE *state,
+ int tok,
+ const char *ptr,
+ const char *end,
+ const ENCODING *enc)
+{
+ state->handler = externalSubset1;
+ if (tok == XML_TOK_XML_DECL)
+ return XML_ROLE_TEXT_DECL;
+ return externalSubset1(state, tok, ptr, end, enc);
+}
+
+static int PTRCALL
+externalSubset1(PROLOG_STATE *state,
+ int tok,
+ const char *ptr,
+ const char *end,
+ const ENCODING *enc)
+{
+ switch (tok) {
+ case XML_TOK_COND_SECT_OPEN:
+ state->handler = condSect0;
+ return XML_ROLE_NONE;
+ case XML_TOK_COND_SECT_CLOSE:
+ if (state->includeLevel == 0)
+ break;
+ state->includeLevel -= 1;
+ return XML_ROLE_NONE;
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_NONE;
+ case XML_TOK_CLOSE_BRACKET:
+ break;
+ case XML_TOK_NONE:
+ if (state->includeLevel)
+ break;
+ return XML_ROLE_NONE;
+ default:
+ return internalSubset(state, tok, ptr, end, enc);
+ }
+ return common(state, tok);
+}
+
+#endif /* XML_DTD */
+
+static int PTRCALL
+entity0(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ENTITY_NONE;
+ case XML_TOK_PERCENT:
+ state->handler = entity1;
+ return XML_ROLE_ENTITY_NONE;
+ case XML_TOK_NAME:
+ state->handler = entity2;
+ return XML_ROLE_GENERAL_ENTITY_NAME;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+entity1(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ENTITY_NONE;
+ case XML_TOK_NAME:
+ state->handler = entity7;
+ return XML_ROLE_PARAM_ENTITY_NAME;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+entity2(PROLOG_STATE *state,
+ int tok,
+ const char *ptr,
+ const char *end,
+ const ENCODING *enc)
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ENTITY_NONE;
+ case XML_TOK_NAME:
+ if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
+ state->handler = entity4;
+ return XML_ROLE_ENTITY_NONE;
+ }
+ if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
+ state->handler = entity3;
+ return XML_ROLE_ENTITY_NONE;
+ }
+ break;
+ case XML_TOK_LITERAL:
+ state->handler = declClose;
+ state->role_none = XML_ROLE_ENTITY_NONE;
+ return XML_ROLE_ENTITY_VALUE;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+entity3(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ENTITY_NONE;
+ case XML_TOK_LITERAL:
+ state->handler = entity4;
+ return XML_ROLE_ENTITY_PUBLIC_ID;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+entity4(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ENTITY_NONE;
+ case XML_TOK_LITERAL:
+ state->handler = entity5;
+ return XML_ROLE_ENTITY_SYSTEM_ID;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+entity5(PROLOG_STATE *state,
+ int tok,
+ const char *ptr,
+ const char *end,
+ const ENCODING *enc)
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ENTITY_NONE;
+ case XML_TOK_DECL_CLOSE:
+ setTopLevel(state);
+ return XML_ROLE_ENTITY_COMPLETE;
+ case XML_TOK_NAME:
+ if (XmlNameMatchesAscii(enc, ptr, end, KW_NDATA)) {
+ state->handler = entity6;
+ return XML_ROLE_ENTITY_NONE;
+ }
+ break;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+entity6(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ENTITY_NONE;
+ case XML_TOK_NAME:
+ state->handler = declClose;
+ state->role_none = XML_ROLE_ENTITY_NONE;
+ return XML_ROLE_ENTITY_NOTATION_NAME;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+entity7(PROLOG_STATE *state,
+ int tok,
+ const char *ptr,
+ const char *end,
+ const ENCODING *enc)
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ENTITY_NONE;
+ case XML_TOK_NAME:
+ if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
+ state->handler = entity9;
+ return XML_ROLE_ENTITY_NONE;
+ }
+ if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
+ state->handler = entity8;
+ return XML_ROLE_ENTITY_NONE;
+ }
+ break;
+ case XML_TOK_LITERAL:
+ state->handler = declClose;
+ state->role_none = XML_ROLE_ENTITY_NONE;
+ return XML_ROLE_ENTITY_VALUE;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+entity8(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ENTITY_NONE;
+ case XML_TOK_LITERAL:
+ state->handler = entity9;
+ return XML_ROLE_ENTITY_PUBLIC_ID;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+entity9(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ENTITY_NONE;
+ case XML_TOK_LITERAL:
+ state->handler = entity10;
+ return XML_ROLE_ENTITY_SYSTEM_ID;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+entity10(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ENTITY_NONE;
+ case XML_TOK_DECL_CLOSE:
+ setTopLevel(state);
+ return XML_ROLE_ENTITY_COMPLETE;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+notation0(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_NOTATION_NONE;
+ case XML_TOK_NAME:
+ state->handler = notation1;
+ return XML_ROLE_NOTATION_NAME;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+notation1(PROLOG_STATE *state,
+ int tok,
+ const char *ptr,
+ const char *end,
+ const ENCODING *enc)
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_NOTATION_NONE;
+ case XML_TOK_NAME:
+ if (XmlNameMatchesAscii(enc, ptr, end, KW_SYSTEM)) {
+ state->handler = notation3;
+ return XML_ROLE_NOTATION_NONE;
+ }
+ if (XmlNameMatchesAscii(enc, ptr, end, KW_PUBLIC)) {
+ state->handler = notation2;
+ return XML_ROLE_NOTATION_NONE;
+ }
+ break;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+notation2(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_NOTATION_NONE;
+ case XML_TOK_LITERAL:
+ state->handler = notation4;
+ return XML_ROLE_NOTATION_PUBLIC_ID;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+notation3(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_NOTATION_NONE;
+ case XML_TOK_LITERAL:
+ state->handler = declClose;
+ state->role_none = XML_ROLE_NOTATION_NONE;
+ return XML_ROLE_NOTATION_SYSTEM_ID;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+notation4(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_NOTATION_NONE;
+ case XML_TOK_LITERAL:
+ state->handler = declClose;
+ state->role_none = XML_ROLE_NOTATION_NONE;
+ return XML_ROLE_NOTATION_SYSTEM_ID;
+ case XML_TOK_DECL_CLOSE:
+ setTopLevel(state);
+ return XML_ROLE_NOTATION_NO_SYSTEM_ID;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+attlist0(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ATTLIST_NONE;
+ case XML_TOK_NAME:
+ case XML_TOK_PREFIXED_NAME:
+ state->handler = attlist1;
+ return XML_ROLE_ATTLIST_ELEMENT_NAME;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+attlist1(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ATTLIST_NONE;
+ case XML_TOK_DECL_CLOSE:
+ setTopLevel(state);
+ return XML_ROLE_ATTLIST_NONE;
+ case XML_TOK_NAME:
+ case XML_TOK_PREFIXED_NAME:
+ state->handler = attlist2;
+ return XML_ROLE_ATTRIBUTE_NAME;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+attlist2(PROLOG_STATE *state,
+ int tok,
+ const char *ptr,
+ const char *end,
+ const ENCODING *enc)
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ATTLIST_NONE;
+ case XML_TOK_NAME:
+ {
+ static const char * const types[] = {
+ KW_CDATA,
+ KW_ID,
+ KW_IDREF,
+ KW_IDREFS,
+ KW_ENTITY,
+ KW_ENTITIES,
+ KW_NMTOKEN,
+ KW_NMTOKENS,
+ };
+ int i;
+ for (i = 0; i < (int)(sizeof(types)/sizeof(types[0])); i++)
+ if (XmlNameMatchesAscii(enc, ptr, end, types[i])) {
+ state->handler = attlist8;
+ return XML_ROLE_ATTRIBUTE_TYPE_CDATA + i;
+ }
+ }
+ if (XmlNameMatchesAscii(enc, ptr, end, KW_NOTATION)) {
+ state->handler = attlist5;
+ return XML_ROLE_ATTLIST_NONE;
+ }
+ break;
+ case XML_TOK_OPEN_PAREN:
+ state->handler = attlist3;
+ return XML_ROLE_ATTLIST_NONE;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+attlist3(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ATTLIST_NONE;
+ case XML_TOK_NMTOKEN:
+ case XML_TOK_NAME:
+ case XML_TOK_PREFIXED_NAME:
+ state->handler = attlist4;
+ return XML_ROLE_ATTRIBUTE_ENUM_VALUE;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+attlist4(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ATTLIST_NONE;
+ case XML_TOK_CLOSE_PAREN:
+ state->handler = attlist8;
+ return XML_ROLE_ATTLIST_NONE;
+ case XML_TOK_OR:
+ state->handler = attlist3;
+ return XML_ROLE_ATTLIST_NONE;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+attlist5(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ATTLIST_NONE;
+ case XML_TOK_OPEN_PAREN:
+ state->handler = attlist6;
+ return XML_ROLE_ATTLIST_NONE;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+attlist6(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ATTLIST_NONE;
+ case XML_TOK_NAME:
+ state->handler = attlist7;
+ return XML_ROLE_ATTRIBUTE_NOTATION_VALUE;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+attlist7(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ATTLIST_NONE;
+ case XML_TOK_CLOSE_PAREN:
+ state->handler = attlist8;
+ return XML_ROLE_ATTLIST_NONE;
+ case XML_TOK_OR:
+ state->handler = attlist6;
+ return XML_ROLE_ATTLIST_NONE;
+ }
+ return common(state, tok);
+}
+
+/* default value */
+static int PTRCALL
+attlist8(PROLOG_STATE *state,
+ int tok,
+ const char *ptr,
+ const char *end,
+ const ENCODING *enc)
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ATTLIST_NONE;
+ case XML_TOK_POUND_NAME:
+ if (XmlNameMatchesAscii(enc,
+ ptr + MIN_BYTES_PER_CHAR(enc),
+ end,
+ KW_IMPLIED)) {
+ state->handler = attlist1;
+ return XML_ROLE_IMPLIED_ATTRIBUTE_VALUE;
+ }
+ if (XmlNameMatchesAscii(enc,
+ ptr + MIN_BYTES_PER_CHAR(enc),
+ end,
+ KW_REQUIRED)) {
+ state->handler = attlist1;
+ return XML_ROLE_REQUIRED_ATTRIBUTE_VALUE;
+ }
+ if (XmlNameMatchesAscii(enc,
+ ptr + MIN_BYTES_PER_CHAR(enc),
+ end,
+ KW_FIXED)) {
+ state->handler = attlist9;
+ return XML_ROLE_ATTLIST_NONE;
+ }
+ break;
+ case XML_TOK_LITERAL:
+ state->handler = attlist1;
+ return XML_ROLE_DEFAULT_ATTRIBUTE_VALUE;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+attlist9(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ATTLIST_NONE;
+ case XML_TOK_LITERAL:
+ state->handler = attlist1;
+ return XML_ROLE_FIXED_ATTRIBUTE_VALUE;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+element0(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ELEMENT_NONE;
+ case XML_TOK_NAME:
+ case XML_TOK_PREFIXED_NAME:
+ state->handler = element1;
+ return XML_ROLE_ELEMENT_NAME;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+element1(PROLOG_STATE *state,
+ int tok,
+ const char *ptr,
+ const char *end,
+ const ENCODING *enc)
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ELEMENT_NONE;
+ case XML_TOK_NAME:
+ if (XmlNameMatchesAscii(enc, ptr, end, KW_EMPTY)) {
+ state->handler = declClose;
+ state->role_none = XML_ROLE_ELEMENT_NONE;
+ return XML_ROLE_CONTENT_EMPTY;
+ }
+ if (XmlNameMatchesAscii(enc, ptr, end, KW_ANY)) {
+ state->handler = declClose;
+ state->role_none = XML_ROLE_ELEMENT_NONE;
+ return XML_ROLE_CONTENT_ANY;
+ }
+ break;
+ case XML_TOK_OPEN_PAREN:
+ state->handler = element2;
+ state->level = 1;
+ return XML_ROLE_GROUP_OPEN;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+element2(PROLOG_STATE *state,
+ int tok,
+ const char *ptr,
+ const char *end,
+ const ENCODING *enc)
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ELEMENT_NONE;
+ case XML_TOK_POUND_NAME:
+ if (XmlNameMatchesAscii(enc,
+ ptr + MIN_BYTES_PER_CHAR(enc),
+ end,
+ KW_PCDATA)) {
+ state->handler = element3;
+ return XML_ROLE_CONTENT_PCDATA;
+ }
+ break;
+ case XML_TOK_OPEN_PAREN:
+ state->level = 2;
+ state->handler = element6;
+ return XML_ROLE_GROUP_OPEN;
+ case XML_TOK_NAME:
+ case XML_TOK_PREFIXED_NAME:
+ state->handler = element7;
+ return XML_ROLE_CONTENT_ELEMENT;
+ case XML_TOK_NAME_QUESTION:
+ state->handler = element7;
+ return XML_ROLE_CONTENT_ELEMENT_OPT;
+ case XML_TOK_NAME_ASTERISK:
+ state->handler = element7;
+ return XML_ROLE_CONTENT_ELEMENT_REP;
+ case XML_TOK_NAME_PLUS:
+ state->handler = element7;
+ return XML_ROLE_CONTENT_ELEMENT_PLUS;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+element3(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ELEMENT_NONE;
+ case XML_TOK_CLOSE_PAREN:
+ state->handler = declClose;
+ state->role_none = XML_ROLE_ELEMENT_NONE;
+ return XML_ROLE_GROUP_CLOSE;
+ case XML_TOK_CLOSE_PAREN_ASTERISK:
+ state->handler = declClose;
+ state->role_none = XML_ROLE_ELEMENT_NONE;
+ return XML_ROLE_GROUP_CLOSE_REP;
+ case XML_TOK_OR:
+ state->handler = element4;
+ return XML_ROLE_ELEMENT_NONE;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+element4(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ELEMENT_NONE;
+ case XML_TOK_NAME:
+ case XML_TOK_PREFIXED_NAME:
+ state->handler = element5;
+ return XML_ROLE_CONTENT_ELEMENT;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+element5(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ELEMENT_NONE;
+ case XML_TOK_CLOSE_PAREN_ASTERISK:
+ state->handler = declClose;
+ state->role_none = XML_ROLE_ELEMENT_NONE;
+ return XML_ROLE_GROUP_CLOSE_REP;
+ case XML_TOK_OR:
+ state->handler = element4;
+ return XML_ROLE_ELEMENT_NONE;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+element6(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ELEMENT_NONE;
+ case XML_TOK_OPEN_PAREN:
+ state->level += 1;
+ return XML_ROLE_GROUP_OPEN;
+ case XML_TOK_NAME:
+ case XML_TOK_PREFIXED_NAME:
+ state->handler = element7;
+ return XML_ROLE_CONTENT_ELEMENT;
+ case XML_TOK_NAME_QUESTION:
+ state->handler = element7;
+ return XML_ROLE_CONTENT_ELEMENT_OPT;
+ case XML_TOK_NAME_ASTERISK:
+ state->handler = element7;
+ return XML_ROLE_CONTENT_ELEMENT_REP;
+ case XML_TOK_NAME_PLUS:
+ state->handler = element7;
+ return XML_ROLE_CONTENT_ELEMENT_PLUS;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+element7(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_ELEMENT_NONE;
+ case XML_TOK_CLOSE_PAREN:
+ state->level -= 1;
+ if (state->level == 0) {
+ state->handler = declClose;
+ state->role_none = XML_ROLE_ELEMENT_NONE;
+ }
+ return XML_ROLE_GROUP_CLOSE;
+ case XML_TOK_CLOSE_PAREN_ASTERISK:
+ state->level -= 1;
+ if (state->level == 0) {
+ state->handler = declClose;
+ state->role_none = XML_ROLE_ELEMENT_NONE;
+ }
+ return XML_ROLE_GROUP_CLOSE_REP;
+ case XML_TOK_CLOSE_PAREN_QUESTION:
+ state->level -= 1;
+ if (state->level == 0) {
+ state->handler = declClose;
+ state->role_none = XML_ROLE_ELEMENT_NONE;
+ }
+ return XML_ROLE_GROUP_CLOSE_OPT;
+ case XML_TOK_CLOSE_PAREN_PLUS:
+ state->level -= 1;
+ if (state->level == 0) {
+ state->handler = declClose;
+ state->role_none = XML_ROLE_ELEMENT_NONE;
+ }
+ return XML_ROLE_GROUP_CLOSE_PLUS;
+ case XML_TOK_COMMA:
+ state->handler = element6;
+ return XML_ROLE_GROUP_SEQUENCE;
+ case XML_TOK_OR:
+ state->handler = element6;
+ return XML_ROLE_GROUP_CHOICE;
+ }
+ return common(state, tok);
+}
+
+#ifdef XML_DTD
+
+static int PTRCALL
+condSect0(PROLOG_STATE *state,
+ int tok,
+ const char *ptr,
+ const char *end,
+ const ENCODING *enc)
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_NONE;
+ case XML_TOK_NAME:
+ if (XmlNameMatchesAscii(enc, ptr, end, KW_INCLUDE)) {
+ state->handler = condSect1;
+ return XML_ROLE_NONE;
+ }
+ if (XmlNameMatchesAscii(enc, ptr, end, KW_IGNORE)) {
+ state->handler = condSect2;
+ return XML_ROLE_NONE;
+ }
+ break;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+condSect1(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_NONE;
+ case XML_TOK_OPEN_BRACKET:
+ state->handler = externalSubset1;
+ state->includeLevel += 1;
+ return XML_ROLE_NONE;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+condSect2(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return XML_ROLE_NONE;
+ case XML_TOK_OPEN_BRACKET:
+ state->handler = externalSubset1;
+ return XML_ROLE_IGNORE_SECT;
+ }
+ return common(state, tok);
+}
+
+#endif /* XML_DTD */
+
+static int PTRCALL
+declClose(PROLOG_STATE *state,
+ int tok,
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ switch (tok) {
+ case XML_TOK_PROLOG_S:
+ return state->role_none;
+ case XML_TOK_DECL_CLOSE:
+ setTopLevel(state);
+ return state->role_none;
+ }
+ return common(state, tok);
+}
+
+static int PTRCALL
+error(PROLOG_STATE *UNUSED_P(state),
+ int UNUSED_P(tok),
+ const char *UNUSED_P(ptr),
+ const char *UNUSED_P(end),
+ const ENCODING *UNUSED_P(enc))
+{
+ return XML_ROLE_NONE;
+}
+
+static int FASTCALL
+common(PROLOG_STATE *state, int tok)
+{
+#ifdef XML_DTD
+ if (!state->documentEntity && tok == XML_TOK_PARAM_ENTITY_REF)
+ return XML_ROLE_INNER_PARAM_ENTITY_REF;
+#endif
+ state->handler = error;
+ return XML_ROLE_ERROR;
+}
+
+void
+XmlPrologStateInit(PROLOG_STATE *state)
+{
+ state->handler = prolog0;
+#ifdef XML_DTD
+ state->documentEntity = 1;
+ state->includeLevel = 0;
+ state->inEntityValue = 0;
+#endif /* XML_DTD */
+}
+
+#ifdef XML_DTD
+
+void
+XmlPrologStateInitExternalEntity(PROLOG_STATE *state)
+{
+ state->handler = externalSubset0;
+ state->documentEntity = 0;
+ state->includeLevel = 0;
+}
+
+#endif /* XML_DTD */
diff --git a/deps/EXPAT/expat/xmlrole.h b/deps/EXPAT/expat/xmlrole.h
new file mode 100644
index 000000000..4dd9f06f9
--- /dev/null
+++ b/deps/EXPAT/expat/xmlrole.h
@@ -0,0 +1,114 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+ See the file COPYING for copying permission.
+*/
+
+#ifndef XmlRole_INCLUDED
+#define XmlRole_INCLUDED 1
+
+#ifdef __VMS
+/* 0 1 2 3 0 1 2 3
+ 1234567890123456789012345678901 1234567890123456789012345678901 */
+#define XmlPrologStateInitExternalEntity XmlPrologStateInitExternalEnt
+#endif
+
+#include "xmltok.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+enum {
+ XML_ROLE_ERROR = -1,
+ XML_ROLE_NONE = 0,
+ XML_ROLE_XML_DECL,
+ XML_ROLE_INSTANCE_START,
+ XML_ROLE_DOCTYPE_NONE,
+ XML_ROLE_DOCTYPE_NAME,
+ XML_ROLE_DOCTYPE_SYSTEM_ID,
+ XML_ROLE_DOCTYPE_PUBLIC_ID,
+ XML_ROLE_DOCTYPE_INTERNAL_SUBSET,
+ XML_ROLE_DOCTYPE_CLOSE,
+ XML_ROLE_GENERAL_ENTITY_NAME,
+ XML_ROLE_PARAM_ENTITY_NAME,
+ XML_ROLE_ENTITY_NONE,
+ XML_ROLE_ENTITY_VALUE,
+ XML_ROLE_ENTITY_SYSTEM_ID,
+ XML_ROLE_ENTITY_PUBLIC_ID,
+ XML_ROLE_ENTITY_COMPLETE,
+ XML_ROLE_ENTITY_NOTATION_NAME,
+ XML_ROLE_NOTATION_NONE,
+ XML_ROLE_NOTATION_NAME,
+ XML_ROLE_NOTATION_SYSTEM_ID,
+ XML_ROLE_NOTATION_NO_SYSTEM_ID,
+ XML_ROLE_NOTATION_PUBLIC_ID,
+ XML_ROLE_ATTRIBUTE_NAME,
+ XML_ROLE_ATTRIBUTE_TYPE_CDATA,
+ XML_ROLE_ATTRIBUTE_TYPE_ID,
+ XML_ROLE_ATTRIBUTE_TYPE_IDREF,
+ XML_ROLE_ATTRIBUTE_TYPE_IDREFS,
+ XML_ROLE_ATTRIBUTE_TYPE_ENTITY,
+ XML_ROLE_ATTRIBUTE_TYPE_ENTITIES,
+ XML_ROLE_ATTRIBUTE_TYPE_NMTOKEN,
+ XML_ROLE_ATTRIBUTE_TYPE_NMTOKENS,
+ XML_ROLE_ATTRIBUTE_ENUM_VALUE,
+ XML_ROLE_ATTRIBUTE_NOTATION_VALUE,
+ XML_ROLE_ATTLIST_NONE,
+ XML_ROLE_ATTLIST_ELEMENT_NAME,
+ XML_ROLE_IMPLIED_ATTRIBUTE_VALUE,
+ XML_ROLE_REQUIRED_ATTRIBUTE_VALUE,
+ XML_ROLE_DEFAULT_ATTRIBUTE_VALUE,
+ XML_ROLE_FIXED_ATTRIBUTE_VALUE,
+ XML_ROLE_ELEMENT_NONE,
+ XML_ROLE_ELEMENT_NAME,
+ XML_ROLE_CONTENT_ANY,
+ XML_ROLE_CONTENT_EMPTY,
+ XML_ROLE_CONTENT_PCDATA,
+ XML_ROLE_GROUP_OPEN,
+ XML_ROLE_GROUP_CLOSE,
+ XML_ROLE_GROUP_CLOSE_REP,
+ XML_ROLE_GROUP_CLOSE_OPT,
+ XML_ROLE_GROUP_CLOSE_PLUS,
+ XML_ROLE_GROUP_CHOICE,
+ XML_ROLE_GROUP_SEQUENCE,
+ XML_ROLE_CONTENT_ELEMENT,
+ XML_ROLE_CONTENT_ELEMENT_REP,
+ XML_ROLE_CONTENT_ELEMENT_OPT,
+ XML_ROLE_CONTENT_ELEMENT_PLUS,
+ XML_ROLE_PI,
+ XML_ROLE_COMMENT,
+#ifdef XML_DTD
+ XML_ROLE_TEXT_DECL,
+ XML_ROLE_IGNORE_SECT,
+ XML_ROLE_INNER_PARAM_ENTITY_REF,
+#endif /* XML_DTD */
+ XML_ROLE_PARAM_ENTITY_REF
+};
+
+typedef struct prolog_state {
+ int (PTRCALL *handler) (struct prolog_state *state,
+ int tok,
+ const char *ptr,
+ const char *end,
+ const ENCODING *enc);
+ unsigned level;
+ int role_none;
+#ifdef XML_DTD
+ unsigned includeLevel;
+ int documentEntity;
+ int inEntityValue;
+#endif /* XML_DTD */
+} PROLOG_STATE;
+
+void XmlPrologStateInit(PROLOG_STATE *);
+#ifdef XML_DTD
+void XmlPrologStateInitExternalEntity(PROLOG_STATE *);
+#endif /* XML_DTD */
+
+#define XmlTokenRole(state, tok, ptr, end, enc) \
+ (((state)->handler)(state, tok, ptr, end, enc))
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* not XmlRole_INCLUDED */
diff --git a/deps/EXPAT/expat/xmltok.c b/deps/EXPAT/expat/xmltok.c
new file mode 100644
index 000000000..f10b459ff
--- /dev/null
+++ b/deps/EXPAT/expat/xmltok.c
@@ -0,0 +1,1737 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+ See the file COPYING for copying permission.
+*/
+
+#include <stddef.h>
+#include "expat_config.h"
+#include "expat_external.h"
+#include "internal.h"
+#include "xmltok.h"
+#include "nametab.h"
+
+#ifdef XML_DTD
+#define IGNORE_SECTION_TOK_VTABLE , PREFIX(ignoreSectionTok)
+#else
+#define IGNORE_SECTION_TOK_VTABLE /* as nothing */
+#endif
+
+#define VTABLE1 \
+ { PREFIX(prologTok), PREFIX(contentTok), \
+ PREFIX(cdataSectionTok) IGNORE_SECTION_TOK_VTABLE }, \
+ { PREFIX(attributeValueTok), PREFIX(entityValueTok) }, \
+ PREFIX(sameName), \
+ PREFIX(nameMatchesAscii), \
+ PREFIX(nameLength), \
+ PREFIX(skipS), \
+ PREFIX(getAtts), \
+ PREFIX(charRefNumber), \
+ PREFIX(predefinedEntityName), \
+ PREFIX(updatePosition), \
+ PREFIX(isPublicId)
+
+#define VTABLE VTABLE1, PREFIX(toUtf8), PREFIX(toUtf16)
+
+#define UCS2_GET_NAMING(pages, hi, lo) \
+ (namingBitmap[(pages[hi] << 3) + ((lo) >> 5)] & (1u << ((lo) & 0x1F)))
+
+/* A 2 byte UTF-8 representation splits the characters 11 bits between
+ the bottom 5 and 6 bits of the bytes. We need 8 bits to index into
+ pages, 3 bits to add to that index and 5 bits to generate the mask.
+*/
+#define UTF8_GET_NAMING2(pages, byte) \
+ (namingBitmap[((pages)[(((byte)[0]) >> 2) & 7] << 3) \
+ + ((((byte)[0]) & 3) << 1) \
+ + ((((byte)[1]) >> 5) & 1)] \
+ & (1u << (((byte)[1]) & 0x1F)))
+
+/* A 3 byte UTF-8 representation splits the characters 16 bits between
+ the bottom 4, 6 and 6 bits of the bytes. We need 8 bits to index
+ into pages, 3 bits to add to that index and 5 bits to generate the
+ mask.
+*/
+#define UTF8_GET_NAMING3(pages, byte) \
+ (namingBitmap[((pages)[((((byte)[0]) & 0xF) << 4) \
+ + ((((byte)[1]) >> 2) & 0xF)] \
+ << 3) \
+ + ((((byte)[1]) & 3) << 1) \
+ + ((((byte)[2]) >> 5) & 1)] \
+ & (1u << (((byte)[2]) & 0x1F)))
+
+#define UTF8_GET_NAMING(pages, p, n) \
+ ((n) == 2 \
+ ? UTF8_GET_NAMING2(pages, (const unsigned char *)(p)) \
+ : ((n) == 3 \
+ ? UTF8_GET_NAMING3(pages, (const unsigned char *)(p)) \
+ : 0))
+
+/* Detection of invalid UTF-8 sequences is based on Table 3.1B
+ of Unicode 3.2: http://www.unicode.org/unicode/reports/tr28/
+ with the additional restriction of not allowing the Unicode
+ code points 0xFFFF and 0xFFFE (sequences EF,BF,BF and EF,BF,BE).
+ Implementation details:
+ (A & 0x80) == 0 means A < 0x80
+ and
+ (A & 0xC0) == 0xC0 means A > 0xBF
+*/
+
+#define UTF8_INVALID2(p) \
+ ((*p) < 0xC2 || ((p)[1] & 0x80) == 0 || ((p)[1] & 0xC0) == 0xC0)
+
+#define UTF8_INVALID3(p) \
+ (((p)[2] & 0x80) == 0 \
+ || \
+ ((*p) == 0xEF && (p)[1] == 0xBF \
+ ? \
+ (p)[2] > 0xBD \
+ : \
+ ((p)[2] & 0xC0) == 0xC0) \
+ || \
+ ((*p) == 0xE0 \
+ ? \
+ (p)[1] < 0xA0 || ((p)[1] & 0xC0) == 0xC0 \
+ : \
+ ((p)[1] & 0x80) == 0 \
+ || \
+ ((*p) == 0xED ? (p)[1] > 0x9F : ((p)[1] & 0xC0) == 0xC0)))
+
+#define UTF8_INVALID4(p) \
+ (((p)[3] & 0x80) == 0 || ((p)[3] & 0xC0) == 0xC0 \
+ || \
+ ((p)[2] & 0x80) == 0 || ((p)[2] & 0xC0) == 0xC0 \
+ || \
+ ((*p) == 0xF0 \
+ ? \
+ (p)[1] < 0x90 || ((p)[1] & 0xC0) == 0xC0 \
+ : \
+ ((p)[1] & 0x80) == 0 \
+ || \
+ ((*p) == 0xF4 ? (p)[1] > 0x8F : ((p)[1] & 0xC0) == 0xC0)))
+
+static int PTRFASTCALL
+isNever(const ENCODING *UNUSED_P(enc), const char *UNUSED_P(p))
+{
+ return 0;
+}
+
+static int PTRFASTCALL
+utf8_isName2(const ENCODING *UNUSED_P(enc), const char *p)
+{
+ return UTF8_GET_NAMING2(namePages, (const unsigned char *)p);
+}
+
+static int PTRFASTCALL
+utf8_isName3(const ENCODING *UNUSED_P(enc), const char *p)
+{
+ return UTF8_GET_NAMING3(namePages, (const unsigned char *)p);
+}
+
+#define utf8_isName4 isNever
+
+static int PTRFASTCALL
+utf8_isNmstrt2(const ENCODING *UNUSED_P(enc), const char *p)
+{
+ return UTF8_GET_NAMING2(nmstrtPages, (const unsigned char *)p);
+}
+
+static int PTRFASTCALL
+utf8_isNmstrt3(const ENCODING *UNUSED_P(enc), const char *p)
+{
+ return UTF8_GET_NAMING3(nmstrtPages, (const unsigned char *)p);
+}
+
+#define utf8_isNmstrt4 isNever
+
+static int PTRFASTCALL
+utf8_isInvalid2(const ENCODING *UNUSED_P(enc), const char *p)
+{
+ return UTF8_INVALID2((const unsigned char *)p);
+}
+
+static int PTRFASTCALL
+utf8_isInvalid3(const ENCODING *UNUSED_P(enc), const char *p)
+{
+ return UTF8_INVALID3((const unsigned char *)p);
+}
+
+static int PTRFASTCALL
+utf8_isInvalid4(const ENCODING *UNUSED_P(enc), const char *p)
+{
+ return UTF8_INVALID4((const unsigned char *)p);
+}
+
+struct normal_encoding {
+ ENCODING enc;
+ unsigned char type[256];
+#ifdef XML_MIN_SIZE
+ int (PTRFASTCALL *byteType)(const ENCODING *, const char *);
+ int (PTRFASTCALL *isNameMin)(const ENCODING *, const char *);
+ int (PTRFASTCALL *isNmstrtMin)(const ENCODING *, const char *);
+ int (PTRFASTCALL *byteToAscii)(const ENCODING *, const char *);
+ int (PTRCALL *charMatches)(const ENCODING *, const char *, int);
+#endif /* XML_MIN_SIZE */
+ int (PTRFASTCALL *isName2)(const ENCODING *, const char *);
+ int (PTRFASTCALL *isName3)(const ENCODING *, const char *);
+ int (PTRFASTCALL *isName4)(const ENCODING *, const char *);
+ int (PTRFASTCALL *isNmstrt2)(const ENCODING *, const char *);
+ int (PTRFASTCALL *isNmstrt3)(const ENCODING *, const char *);
+ int (PTRFASTCALL *isNmstrt4)(const ENCODING *, const char *);
+ int (PTRFASTCALL *isInvalid2)(const ENCODING *, const char *);
+ int (PTRFASTCALL *isInvalid3)(const ENCODING *, const char *);
+ int (PTRFASTCALL *isInvalid4)(const ENCODING *, const char *);
+};
+
+#define AS_NORMAL_ENCODING(enc) ((const struct normal_encoding *) (enc))
+
+#ifdef XML_MIN_SIZE
+
+#define STANDARD_VTABLE(E) \
+ E ## byteType, \
+ E ## isNameMin, \
+ E ## isNmstrtMin, \
+ E ## byteToAscii, \
+ E ## charMatches,
+
+#else
+
+#define STANDARD_VTABLE(E) /* as nothing */
+
+#endif
+
+#define NORMAL_VTABLE(E) \
+ E ## isName2, \
+ E ## isName3, \
+ E ## isName4, \
+ E ## isNmstrt2, \
+ E ## isNmstrt3, \
+ E ## isNmstrt4, \
+ E ## isInvalid2, \
+ E ## isInvalid3, \
+ E ## isInvalid4
+
+#define NULL_VTABLE \
+ /* isName2 */ NULL, \
+ /* isName3 */ NULL, \
+ /* isName4 */ NULL, \
+ /* isNmstrt2 */ NULL, \
+ /* isNmstrt3 */ NULL, \
+ /* isNmstrt4 */ NULL, \
+ /* isInvalid2 */ NULL, \
+ /* isInvalid3 */ NULL, \
+ /* isInvalid4 */ NULL
+
+static int FASTCALL checkCharRefNumber(int);
+
+#include "xmltok_impl.h"
+#include "ascii.h"
+
+#ifdef XML_MIN_SIZE
+#define sb_isNameMin isNever
+#define sb_isNmstrtMin isNever
+#endif
+
+#ifdef XML_MIN_SIZE
+#define MINBPC(enc) ((enc)->minBytesPerChar)
+#else
+/* minimum bytes per character */
+#define MINBPC(enc) 1
+#endif
+
+#define SB_BYTE_TYPE(enc, p) \
+ (((struct normal_encoding *)(enc))->type[(unsigned char)*(p)])
+
+#ifdef XML_MIN_SIZE
+static int PTRFASTCALL
+sb_byteType(const ENCODING *enc, const char *p)
+{
+ return SB_BYTE_TYPE(enc, p);
+}
+#define BYTE_TYPE(enc, p) \
+ (AS_NORMAL_ENCODING(enc)->byteType(enc, p))
+#else
+#define BYTE_TYPE(enc, p) SB_BYTE_TYPE(enc, p)
+#endif
+
+#ifdef XML_MIN_SIZE
+#define BYTE_TO_ASCII(enc, p) \
+ (AS_NORMAL_ENCODING(enc)->byteToAscii(enc, p))
+static int PTRFASTCALL
+sb_byteToAscii(const ENCODING *enc, const char *p)
+{
+ return *p;
+}
+#else
+#define BYTE_TO_ASCII(enc, p) (*(p))
+#endif
+
+#define IS_NAME_CHAR(enc, p, n) \
+ (AS_NORMAL_ENCODING(enc)->isName ## n(enc, p))
+#define IS_NMSTRT_CHAR(enc, p, n) \
+ (AS_NORMAL_ENCODING(enc)->isNmstrt ## n(enc, p))
+#define IS_INVALID_CHAR(enc, p, n) \
+ (AS_NORMAL_ENCODING(enc)->isInvalid ## n(enc, p))
+
+#ifdef XML_MIN_SIZE
+#define IS_NAME_CHAR_MINBPC(enc, p) \
+ (AS_NORMAL_ENCODING(enc)->isNameMin(enc, p))
+#define IS_NMSTRT_CHAR_MINBPC(enc, p) \
+ (AS_NORMAL_ENCODING(enc)->isNmstrtMin(enc, p))
+#else
+#define IS_NAME_CHAR_MINBPC(enc, p) (0)
+#define IS_NMSTRT_CHAR_MINBPC(enc, p) (0)
+#endif
+
+#ifdef XML_MIN_SIZE
+#define CHAR_MATCHES(enc, p, c) \
+ (AS_NORMAL_ENCODING(enc)->charMatches(enc, p, c))
+static int PTRCALL
+sb_charMatches(const ENCODING *enc, const char *p, int c)
+{
+ return *p == c;
+}
+#else
+/* c is an ASCII character */
+#define CHAR_MATCHES(enc, p, c) (*(p) == c)
+#endif
+
+#define PREFIX(ident) normal_ ## ident
+#define XML_TOK_IMPL_C
+#include "xmltok_impl.inc"
+#undef XML_TOK_IMPL_C
+
+#undef MINBPC
+#undef BYTE_TYPE
+#undef BYTE_TO_ASCII
+#undef CHAR_MATCHES
+#undef IS_NAME_CHAR
+#undef IS_NAME_CHAR_MINBPC
+#undef IS_NMSTRT_CHAR
+#undef IS_NMSTRT_CHAR_MINBPC
+#undef IS_INVALID_CHAR
+
+enum { /* UTF8_cvalN is value of masked first byte of N byte sequence */
+ UTF8_cval1 = 0x00,
+ UTF8_cval2 = 0xc0,
+ UTF8_cval3 = 0xe0,
+ UTF8_cval4 = 0xf0
+};
+
+void
+align_limit_to_full_utf8_characters(const char * from, const char ** fromLimRef)
+{
+ const char * fromLim = *fromLimRef;
+ size_t walked = 0;
+ for (; fromLim > from; fromLim--, walked++) {
+ const unsigned char prev = (unsigned char)fromLim[-1];
+ if ((prev & 0xf8u) == 0xf0u) { /* 4-byte character, lead by 0b11110xxx byte */
+ if (walked + 1 >= 4) {
+ fromLim += 4 - 1;
+ break;
+ } else {
+ walked = 0;
+ }
+ } else if ((prev & 0xf0u) == 0xe0u) { /* 3-byte character, lead by 0b1110xxxx byte */
+ if (walked + 1 >= 3) {
+ fromLim += 3 - 1;
+ break;
+ } else {
+ walked = 0;
+ }
+ } else if ((prev & 0xe0u) == 0xc0u) { /* 2-byte character, lead by 0b110xxxxx byte */
+ if (walked + 1 >= 2) {
+ fromLim += 2 - 1;
+ break;
+ } else {
+ walked = 0;
+ }
+ } else if ((prev & 0x80u) == 0x00u) { /* 1-byte character, matching 0b0xxxxxxx */
+ break;
+ }
+ }
+ *fromLimRef = fromLim;
+}
+
+static enum XML_Convert_Result PTRCALL
+utf8_toUtf8(const ENCODING *UNUSED_P(enc),
+ const char **fromP, const char *fromLim,
+ char **toP, const char *toLim)
+{
+ enum XML_Convert_Result res = XML_CONVERT_COMPLETED;
+ char *to;
+ const char *from;
+ if (fromLim - *fromP > toLim - *toP) {
+ /* Avoid copying partial characters. */
+ res = XML_CONVERT_OUTPUT_EXHAUSTED;
+ fromLim = *fromP + (toLim - *toP);
+ align_limit_to_full_utf8_characters(*fromP, &fromLim);
+ }
+ for (to = *toP, from = *fromP; (from < fromLim) && (to < toLim); from++, to++)
+ *to = *from;
+ *fromP = from;
+ *toP = to;
+
+ if ((to == toLim) && (from < fromLim))
+ return XML_CONVERT_OUTPUT_EXHAUSTED;
+ else
+ return res;
+}
+
+static enum XML_Convert_Result PTRCALL
+utf8_toUtf16(const ENCODING *enc,
+ const char **fromP, const char *fromLim,
+ unsigned short **toP, const unsigned short *toLim)
+{
+ enum XML_Convert_Result res = XML_CONVERT_COMPLETED;
+ unsigned short *to = *toP;
+ const char *from = *fromP;
+ while (from < fromLim && to < toLim) {
+ switch (((struct normal_encoding *)enc)->type[(unsigned char)*from]) {
+ case BT_LEAD2:
+ if (fromLim - from < 2) {
+ res = XML_CONVERT_INPUT_INCOMPLETE;
+ break;
+ }
+ *to++ = (unsigned short)(((from[0] & 0x1f) << 6) | (from[1] & 0x3f));
+ from += 2;
+ break;
+ case BT_LEAD3:
+ if (fromLim - from < 3) {
+ res = XML_CONVERT_INPUT_INCOMPLETE;
+ break;
+ }
+ *to++ = (unsigned short)(((from[0] & 0xf) << 12)
+ | ((from[1] & 0x3f) << 6) | (from[2] & 0x3f));
+ from += 3;
+ break;
+ case BT_LEAD4:
+ {
+ unsigned long n;
+ if (toLim - to < 2) {
+ res = XML_CONVERT_OUTPUT_EXHAUSTED;
+ goto after;
+ }
+ if (fromLim - from < 4) {
+ res = XML_CONVERT_INPUT_INCOMPLETE;
+ goto after;
+ }
+ n = ((from[0] & 0x7) << 18) | ((from[1] & 0x3f) << 12)
+ | ((from[2] & 0x3f) << 6) | (from[3] & 0x3f);
+ n -= 0x10000;
+ to[0] = (unsigned short)((n >> 10) | 0xD800);
+ to[1] = (unsigned short)((n & 0x3FF) | 0xDC00);
+ to += 2;
+ from += 4;
+ }
+ break;
+ default:
+ *to++ = *from++;
+ break;
+ }
+ }
+after:
+ *fromP = from;
+ *toP = to;
+ return res;
+}
+
+#ifdef XML_NS
+static const struct normal_encoding utf8_encoding_ns = {
+ { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 },
+ {
+#include "asciitab.h"
+#include "utf8tab.h"
+ },
+ STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_)
+};
+#endif
+
+static const struct normal_encoding utf8_encoding = {
+ { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 },
+ {
+#define BT_COLON BT_NMSTRT
+#include "asciitab.h"
+#undef BT_COLON
+#include "utf8tab.h"
+ },
+ STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_)
+};
+
+#ifdef XML_NS
+
+static const struct normal_encoding internal_utf8_encoding_ns = {
+ { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 },
+ {
+#include "iasciitab.h"
+#include "utf8tab.h"
+ },
+ STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_)
+};
+
+#endif
+
+static const struct normal_encoding internal_utf8_encoding = {
+ { VTABLE1, utf8_toUtf8, utf8_toUtf16, 1, 1, 0 },
+ {
+#define BT_COLON BT_NMSTRT
+#include "iasciitab.h"
+#undef BT_COLON
+#include "utf8tab.h"
+ },
+ STANDARD_VTABLE(sb_) NORMAL_VTABLE(utf8_)
+};
+
+static enum XML_Convert_Result PTRCALL
+latin1_toUtf8(const ENCODING *UNUSED_P(enc),
+ const char **fromP, const char *fromLim,
+ char **toP, const char *toLim)
+{
+ for (;;) {
+ unsigned char c;
+ if (*fromP == fromLim)
+ return XML_CONVERT_COMPLETED;
+ c = (unsigned char)**fromP;
+ if (c & 0x80) {
+ if (toLim - *toP < 2)
+ return XML_CONVERT_OUTPUT_EXHAUSTED;
+ *(*toP)++ = (char)((c >> 6) | UTF8_cval2);
+ *(*toP)++ = (char)((c & 0x3f) | 0x80);
+ (*fromP)++;
+ }
+ else {
+ if (*toP == toLim)
+ return XML_CONVERT_OUTPUT_EXHAUSTED;
+ *(*toP)++ = *(*fromP)++;
+ }
+ }
+}
+
+static enum XML_Convert_Result PTRCALL
+latin1_toUtf16(const ENCODING *UNUSED_P(enc),
+ const char **fromP, const char *fromLim,
+ unsigned short **toP, const unsigned short *toLim)
+{
+ while (*fromP < fromLim && *toP < toLim)
+ *(*toP)++ = (unsigned char)*(*fromP)++;
+
+ if ((*toP == toLim) && (*fromP < fromLim))
+ return XML_CONVERT_OUTPUT_EXHAUSTED;
+ else
+ return XML_CONVERT_COMPLETED;
+}
+
+#ifdef XML_NS
+
+static const struct normal_encoding latin1_encoding_ns = {
+ { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 },
+ {
+#include "asciitab.h"
+#include "latin1tab.h"
+ },
+ STANDARD_VTABLE(sb_) NULL_VTABLE
+};
+
+#endif
+
+static const struct normal_encoding latin1_encoding = {
+ { VTABLE1, latin1_toUtf8, latin1_toUtf16, 1, 0, 0 },
+ {
+#define BT_COLON BT_NMSTRT
+#include "asciitab.h"
+#undef BT_COLON
+#include "latin1tab.h"
+ },
+ STANDARD_VTABLE(sb_) NULL_VTABLE
+};
+
+static enum XML_Convert_Result PTRCALL
+ascii_toUtf8(const ENCODING *UNUSED_P(enc),
+ const char **fromP, const char *fromLim,
+ char **toP, const char *toLim)
+{
+ while (*fromP < fromLim && *toP < toLim)
+ *(*toP)++ = *(*fromP)++;
+
+ if ((*toP == toLim) && (*fromP < fromLim))
+ return XML_CONVERT_OUTPUT_EXHAUSTED;
+ else
+ return XML_CONVERT_COMPLETED;
+}
+
+#ifdef XML_NS
+
+static const struct normal_encoding ascii_encoding_ns = {
+ { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 },
+ {
+#include "asciitab.h"
+/* BT_NONXML == 0 */
+ },
+ STANDARD_VTABLE(sb_) NULL_VTABLE
+};
+
+#endif
+
+static const struct normal_encoding ascii_encoding = {
+ { VTABLE1, ascii_toUtf8, latin1_toUtf16, 1, 1, 0 },
+ {
+#define BT_COLON BT_NMSTRT
+#include "asciitab.h"
+#undef BT_COLON
+/* BT_NONXML == 0 */
+ },
+ STANDARD_VTABLE(sb_) NULL_VTABLE
+};
+
+static int PTRFASTCALL
+unicode_byte_type(char hi, char lo)
+{
+ switch ((unsigned char)hi) {
+ case 0xD8: case 0xD9: case 0xDA: case 0xDB:
+ return BT_LEAD4;
+ case 0xDC: case 0xDD: case 0xDE: case 0xDF:
+ return BT_TRAIL;
+ case 0xFF:
+ switch ((unsigned char)lo) {
+ case 0xFF:
+ case 0xFE:
+ return BT_NONXML;
+ }
+ break;
+ }
+ return BT_NONASCII;
+}
+
+#define DEFINE_UTF16_TO_UTF8(E) \
+static enum XML_Convert_Result PTRCALL \
+E ## toUtf8(const ENCODING *UNUSED_P(enc), \
+ const char **fromP, const char *fromLim, \
+ char **toP, const char *toLim) \
+{ \
+ const char *from = *fromP; \
+ fromLim = from + (((fromLim - from) >> 1) << 1); /* shrink to even */ \
+ for (; from < fromLim; from += 2) { \
+ int plane; \
+ unsigned char lo2; \
+ unsigned char lo = GET_LO(from); \
+ unsigned char hi = GET_HI(from); \
+ switch (hi) { \
+ case 0: \
+ if (lo < 0x80) { \
+ if (*toP == toLim) { \
+ *fromP = from; \
+ return XML_CONVERT_OUTPUT_EXHAUSTED; \
+ } \
+ *(*toP)++ = lo; \
+ break; \
+ } \
+ /* fall through */ \
+ case 0x1: case 0x2: case 0x3: \
+ case 0x4: case 0x5: case 0x6: case 0x7: \
+ if (toLim - *toP < 2) { \
+ *fromP = from; \
+ return XML_CONVERT_OUTPUT_EXHAUSTED; \
+ } \
+ *(*toP)++ = ((lo >> 6) | (hi << 2) | UTF8_cval2); \
+ *(*toP)++ = ((lo & 0x3f) | 0x80); \
+ break; \
+ default: \
+ if (toLim - *toP < 3) { \
+ *fromP = from; \
+ return XML_CONVERT_OUTPUT_EXHAUSTED; \
+ } \
+ /* 16 bits divided 4, 6, 6 amongst 3 bytes */ \
+ *(*toP)++ = ((hi >> 4) | UTF8_cval3); \
+ *(*toP)++ = (((hi & 0xf) << 2) | (lo >> 6) | 0x80); \
+ *(*toP)++ = ((lo & 0x3f) | 0x80); \
+ break; \
+ case 0xD8: case 0xD9: case 0xDA: case 0xDB: \
+ if (toLim - *toP < 4) { \
+ *fromP = from; \
+ return XML_CONVERT_OUTPUT_EXHAUSTED; \
+ } \
+ if (fromLim - from < 4) { \
+ *fromP = from; \
+ return XML_CONVERT_INPUT_INCOMPLETE; \
+ } \
+ plane = (((hi & 0x3) << 2) | ((lo >> 6) & 0x3)) + 1; \
+ *(*toP)++ = ((plane >> 2) | UTF8_cval4); \
+ *(*toP)++ = (((lo >> 2) & 0xF) | ((plane & 0x3) << 4) | 0x80); \
+ from += 2; \
+ lo2 = GET_LO(from); \
+ *(*toP)++ = (((lo & 0x3) << 4) \
+ | ((GET_HI(from) & 0x3) << 2) \
+ | (lo2 >> 6) \
+ | 0x80); \
+ *(*toP)++ = ((lo2 & 0x3f) | 0x80); \
+ break; \
+ } \
+ } \
+ *fromP = from; \
+ if (from < fromLim) \
+ return XML_CONVERT_INPUT_INCOMPLETE; \
+ else \
+ return XML_CONVERT_COMPLETED; \
+}
+
+#define DEFINE_UTF16_TO_UTF16(E) \
+static enum XML_Convert_Result PTRCALL \
+E ## toUtf16(const ENCODING *UNUSED_P(enc), \
+ const char **fromP, const char *fromLim, \
+ unsigned short **toP, const unsigned short *toLim) \
+{ \
+ enum XML_Convert_Result res = XML_CONVERT_COMPLETED; \
+ fromLim = *fromP + (((fromLim - *fromP) >> 1) << 1); /* shrink to even */ \
+ /* Avoid copying first half only of surrogate */ \
+ if (fromLim - *fromP > ((toLim - *toP) << 1) \
+ && (GET_HI(fromLim - 2) & 0xF8) == 0xD8) { \
+ fromLim -= 2; \
+ res = XML_CONVERT_INPUT_INCOMPLETE; \
+ } \
+ for (; *fromP < fromLim && *toP < toLim; *fromP += 2) \
+ *(*toP)++ = (GET_HI(*fromP) << 8) | GET_LO(*fromP); \
+ if ((*toP == toLim) && (*fromP < fromLim)) \
+ return XML_CONVERT_OUTPUT_EXHAUSTED; \
+ else \
+ return res; \
+}
+
+#define SET2(ptr, ch) \
+ (((ptr)[0] = ((ch) & 0xff)), ((ptr)[1] = ((ch) >> 8)))
+#define GET_LO(ptr) ((unsigned char)(ptr)[0])
+#define GET_HI(ptr) ((unsigned char)(ptr)[1])
+
+DEFINE_UTF16_TO_UTF8(little2_)
+DEFINE_UTF16_TO_UTF16(little2_)
+
+#undef SET2
+#undef GET_LO
+#undef GET_HI
+
+#define SET2(ptr, ch) \
+ (((ptr)[0] = ((ch) >> 8)), ((ptr)[1] = ((ch) & 0xFF)))
+#define GET_LO(ptr) ((unsigned char)(ptr)[1])
+#define GET_HI(ptr) ((unsigned char)(ptr)[0])
+
+DEFINE_UTF16_TO_UTF8(big2_)
+DEFINE_UTF16_TO_UTF16(big2_)
+
+#undef SET2
+#undef GET_LO
+#undef GET_HI
+
+#define LITTLE2_BYTE_TYPE(enc, p) \
+ ((p)[1] == 0 \
+ ? ((struct normal_encoding *)(enc))->type[(unsigned char)*(p)] \
+ : unicode_byte_type((p)[1], (p)[0]))
+#define LITTLE2_BYTE_TO_ASCII(enc, p) ((p)[1] == 0 ? (p)[0] : -1)
+#define LITTLE2_CHAR_MATCHES(enc, p, c) ((p)[1] == 0 && (p)[0] == c)
+#define LITTLE2_IS_NAME_CHAR_MINBPC(enc, p) \
+ UCS2_GET_NAMING(namePages, (unsigned char)p[1], (unsigned char)p[0])
+#define LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p) \
+ UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[1], (unsigned char)p[0])
+
+#ifdef XML_MIN_SIZE
+
+static int PTRFASTCALL
+little2_byteType(const ENCODING *enc, const char *p)
+{
+ return LITTLE2_BYTE_TYPE(enc, p);
+}
+
+static int PTRFASTCALL
+little2_byteToAscii(const ENCODING *enc, const char *p)
+{
+ return LITTLE2_BYTE_TO_ASCII(enc, p);
+}
+
+static int PTRCALL
+little2_charMatches(const ENCODING *enc, const char *p, int c)
+{
+ return LITTLE2_CHAR_MATCHES(enc, p, c);
+}
+
+static int PTRFASTCALL
+little2_isNameMin(const ENCODING *enc, const char *p)
+{
+ return LITTLE2_IS_NAME_CHAR_MINBPC(enc, p);
+}
+
+static int PTRFASTCALL
+little2_isNmstrtMin(const ENCODING *enc, const char *p)
+{
+ return LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p);
+}
+
+#undef VTABLE
+#define VTABLE VTABLE1, little2_toUtf8, little2_toUtf16
+
+#else /* not XML_MIN_SIZE */
+
+#undef PREFIX
+#define PREFIX(ident) little2_ ## ident
+#define MINBPC(enc) 2
+/* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */
+#define BYTE_TYPE(enc, p) LITTLE2_BYTE_TYPE(enc, p)
+#define BYTE_TO_ASCII(enc, p) LITTLE2_BYTE_TO_ASCII(enc, p)
+#define CHAR_MATCHES(enc, p, c) LITTLE2_CHAR_MATCHES(enc, p, c)
+#define IS_NAME_CHAR(enc, p, n) 0
+#define IS_NAME_CHAR_MINBPC(enc, p) LITTLE2_IS_NAME_CHAR_MINBPC(enc, p)
+#define IS_NMSTRT_CHAR(enc, p, n) (0)
+#define IS_NMSTRT_CHAR_MINBPC(enc, p) LITTLE2_IS_NMSTRT_CHAR_MINBPC(enc, p)
+
+#define XML_TOK_IMPL_C
+#include "xmltok_impl.inc"
+#undef XML_TOK_IMPL_C
+
+#undef MINBPC
+#undef BYTE_TYPE
+#undef BYTE_TO_ASCII
+#undef CHAR_MATCHES
+#undef IS_NAME_CHAR
+#undef IS_NAME_CHAR_MINBPC
+#undef IS_NMSTRT_CHAR
+#undef IS_NMSTRT_CHAR_MINBPC
+#undef IS_INVALID_CHAR
+
+#endif /* not XML_MIN_SIZE */
+
+#ifdef XML_NS
+
+static const struct normal_encoding little2_encoding_ns = {
+ { VTABLE, 2, 0,
+#if BYTEORDER == 1234
+ 1
+#else
+ 0
+#endif
+ },
+ {
+#include "asciitab.h"
+#include "latin1tab.h"
+ },
+ STANDARD_VTABLE(little2_) NULL_VTABLE
+};
+
+#endif
+
+static const struct normal_encoding little2_encoding = {
+ { VTABLE, 2, 0,
+#if BYTEORDER == 1234
+ 1
+#else
+ 0
+#endif
+ },
+ {
+#define BT_COLON BT_NMSTRT
+#include "asciitab.h"
+#undef BT_COLON
+#include "latin1tab.h"
+ },
+ STANDARD_VTABLE(little2_) NULL_VTABLE
+};
+
+#if BYTEORDER != 4321
+
+#ifdef XML_NS
+
+static const struct normal_encoding internal_little2_encoding_ns = {
+ { VTABLE, 2, 0, 1 },
+ {
+#include "iasciitab.h"
+#include "latin1tab.h"
+ },
+ STANDARD_VTABLE(little2_) NULL_VTABLE
+};
+
+#endif
+
+static const struct normal_encoding internal_little2_encoding = {
+ { VTABLE, 2, 0, 1 },
+ {
+#define BT_COLON BT_NMSTRT
+#include "iasciitab.h"
+#undef BT_COLON
+#include "latin1tab.h"
+ },
+ STANDARD_VTABLE(little2_) NULL_VTABLE
+};
+
+#endif
+
+
+#define BIG2_BYTE_TYPE(enc, p) \
+ ((p)[0] == 0 \
+ ? ((struct normal_encoding *)(enc))->type[(unsigned char)(p)[1]] \
+ : unicode_byte_type((p)[0], (p)[1]))
+#define BIG2_BYTE_TO_ASCII(enc, p) ((p)[0] == 0 ? (p)[1] : -1)
+#define BIG2_CHAR_MATCHES(enc, p, c) ((p)[0] == 0 && (p)[1] == c)
+#define BIG2_IS_NAME_CHAR_MINBPC(enc, p) \
+ UCS2_GET_NAMING(namePages, (unsigned char)p[0], (unsigned char)p[1])
+#define BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p) \
+ UCS2_GET_NAMING(nmstrtPages, (unsigned char)p[0], (unsigned char)p[1])
+
+#ifdef XML_MIN_SIZE
+
+static int PTRFASTCALL
+big2_byteType(const ENCODING *enc, const char *p)
+{
+ return BIG2_BYTE_TYPE(enc, p);
+}
+
+static int PTRFASTCALL
+big2_byteToAscii(const ENCODING *enc, const char *p)
+{
+ return BIG2_BYTE_TO_ASCII(enc, p);
+}
+
+static int PTRCALL
+big2_charMatches(const ENCODING *enc, const char *p, int c)
+{
+ return BIG2_CHAR_MATCHES(enc, p, c);
+}
+
+static int PTRFASTCALL
+big2_isNameMin(const ENCODING *enc, const char *p)
+{
+ return BIG2_IS_NAME_CHAR_MINBPC(enc, p);
+}
+
+static int PTRFASTCALL
+big2_isNmstrtMin(const ENCODING *enc, const char *p)
+{
+ return BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p);
+}
+
+#undef VTABLE
+#define VTABLE VTABLE1, big2_toUtf8, big2_toUtf16
+
+#else /* not XML_MIN_SIZE */
+
+#undef PREFIX
+#define PREFIX(ident) big2_ ## ident
+#define MINBPC(enc) 2
+/* CHAR_MATCHES is guaranteed to have MINBPC bytes available. */
+#define BYTE_TYPE(enc, p) BIG2_BYTE_TYPE(enc, p)
+#define BYTE_TO_ASCII(enc, p) BIG2_BYTE_TO_ASCII(enc, p)
+#define CHAR_MATCHES(enc, p, c) BIG2_CHAR_MATCHES(enc, p, c)
+#define IS_NAME_CHAR(enc, p, n) 0
+#define IS_NAME_CHAR_MINBPC(enc, p) BIG2_IS_NAME_CHAR_MINBPC(enc, p)
+#define IS_NMSTRT_CHAR(enc, p, n) (0)
+#define IS_NMSTRT_CHAR_MINBPC(enc, p) BIG2_IS_NMSTRT_CHAR_MINBPC(enc, p)
+
+#define XML_TOK_IMPL_C
+#include "xmltok_impl.inc"
+#undef XML_TOK_IMPL_C
+
+#undef MINBPC
+#undef BYTE_TYPE
+#undef BYTE_TO_ASCII
+#undef CHAR_MATCHES
+#undef IS_NAME_CHAR
+#undef IS_NAME_CHAR_MINBPC
+#undef IS_NMSTRT_CHAR
+#undef IS_NMSTRT_CHAR_MINBPC
+#undef IS_INVALID_CHAR
+
+#endif /* not XML_MIN_SIZE */
+
+#ifdef XML_NS
+
+static const struct normal_encoding big2_encoding_ns = {
+ { VTABLE, 2, 0,
+#if BYTEORDER == 4321
+ 1
+#else
+ 0
+#endif
+ },
+ {
+#include "asciitab.h"
+#include "latin1tab.h"
+ },
+ STANDARD_VTABLE(big2_) NULL_VTABLE
+};
+
+#endif
+
+static const struct normal_encoding big2_encoding = {
+ { VTABLE, 2, 0,
+#if BYTEORDER == 4321
+ 1
+#else
+ 0
+#endif
+ },
+ {
+#define BT_COLON BT_NMSTRT
+#include "asciitab.h"
+#undef BT_COLON
+#include "latin1tab.h"
+ },
+ STANDARD_VTABLE(big2_) NULL_VTABLE
+};
+
+#if BYTEORDER != 1234
+
+#ifdef XML_NS
+
+static const struct normal_encoding internal_big2_encoding_ns = {
+ { VTABLE, 2, 0, 1 },
+ {
+#include "iasciitab.h"
+#include "latin1tab.h"
+ },
+ STANDARD_VTABLE(big2_) NULL_VTABLE
+};
+
+#endif
+
+static const struct normal_encoding internal_big2_encoding = {
+ { VTABLE, 2, 0, 1 },
+ {
+#define BT_COLON BT_NMSTRT
+#include "iasciitab.h"
+#undef BT_COLON
+#include "latin1tab.h"
+ },
+ STANDARD_VTABLE(big2_) NULL_VTABLE
+};
+
+#endif
+
+#undef PREFIX
+
+static int FASTCALL
+streqci(const char *s1, const char *s2)
+{
+ for (;;) {
+ char c1 = *s1++;
+ char c2 = *s2++;
+ if (ASCII_a <= c1 && c1 <= ASCII_z)
+ c1 += ASCII_A - ASCII_a;
+ if (ASCII_a <= c2 && c2 <= ASCII_z)
+ c2 += ASCII_A - ASCII_a;
+ if (c1 != c2)
+ return 0;
+ if (!c1)
+ break;
+ }
+ return 1;
+}
+
+static void PTRCALL
+initUpdatePosition(const ENCODING *UNUSED_P(enc), const char *ptr,
+ const char *end, POSITION *pos)
+{
+ normal_updatePosition(&utf8_encoding.enc, ptr, end, pos);
+}
+
+static int
+toAscii(const ENCODING *enc, const char *ptr, const char *end)
+{
+ char buf[1];
+ char *p = buf;
+ XmlUtf8Convert(enc, &ptr, end, &p, p + 1);
+ if (p == buf)
+ return -1;
+ else
+ return buf[0];
+}
+
+static int FASTCALL
+isSpace(int c)
+{
+ switch (c) {
+ case 0x20:
+ case 0xD:
+ case 0xA:
+ case 0x9:
+ return 1;
+ }
+ return 0;
+}
+
+/* Return 1 if there's just optional white space or there's an S
+ followed by name=val.
+*/
+static int
+parsePseudoAttribute(const ENCODING *enc,
+ const char *ptr,
+ const char *end,
+ const char **namePtr,
+ const char **nameEndPtr,
+ const char **valPtr,
+ const char **nextTokPtr)
+{
+ int c;
+ char open;
+ if (ptr == end) {
+ *namePtr = NULL;
+ return 1;
+ }
+ if (!isSpace(toAscii(enc, ptr, end))) {
+ *nextTokPtr = ptr;
+ return 0;
+ }
+ do {
+ ptr += enc->minBytesPerChar;
+ } while (isSpace(toAscii(enc, ptr, end)));
+ if (ptr == end) {
+ *namePtr = NULL;
+ return 1;
+ }
+ *namePtr = ptr;
+ for (;;) {
+ c = toAscii(enc, ptr, end);
+ if (c == -1) {
+ *nextTokPtr = ptr;
+ return 0;
+ }
+ if (c == ASCII_EQUALS) {
+ *nameEndPtr = ptr;
+ break;
+ }
+ if (isSpace(c)) {
+ *nameEndPtr = ptr;
+ do {
+ ptr += enc->minBytesPerChar;
+ } while (isSpace(c = toAscii(enc, ptr, end)));
+ if (c != ASCII_EQUALS) {
+ *nextTokPtr = ptr;
+ return 0;
+ }
+ break;
+ }
+ ptr += enc->minBytesPerChar;
+ }
+ if (ptr == *namePtr) {
+ *nextTokPtr = ptr;
+ return 0;
+ }
+ ptr += enc->minBytesPerChar;
+ c = toAscii(enc, ptr, end);
+ while (isSpace(c)) {
+ ptr += enc->minBytesPerChar;
+ c = toAscii(enc, ptr, end);
+ }
+ if (c != ASCII_QUOT && c != ASCII_APOS) {
+ *nextTokPtr = ptr;
+ return 0;
+ }
+ open = (char)c;
+ ptr += enc->minBytesPerChar;
+ *valPtr = ptr;
+ for (;; ptr += enc->minBytesPerChar) {
+ c = toAscii(enc, ptr, end);
+ if (c == open)
+ break;
+ if (!(ASCII_a <= c && c <= ASCII_z)
+ && !(ASCII_A <= c && c <= ASCII_Z)
+ && !(ASCII_0 <= c && c <= ASCII_9)
+ && c != ASCII_PERIOD
+ && c != ASCII_MINUS
+ && c != ASCII_UNDERSCORE) {
+ *nextTokPtr = ptr;
+ return 0;
+ }
+ }
+ *nextTokPtr = ptr + enc->minBytesPerChar;
+ return 1;
+}
+
+static const char KW_version[] = {
+ ASCII_v, ASCII_e, ASCII_r, ASCII_s, ASCII_i, ASCII_o, ASCII_n, '\0'
+};
+
+static const char KW_encoding[] = {
+ ASCII_e, ASCII_n, ASCII_c, ASCII_o, ASCII_d, ASCII_i, ASCII_n, ASCII_g, '\0'
+};
+
+static const char KW_standalone[] = {
+ ASCII_s, ASCII_t, ASCII_a, ASCII_n, ASCII_d, ASCII_a, ASCII_l, ASCII_o,
+ ASCII_n, ASCII_e, '\0'
+};
+
+static const char KW_yes[] = {
+ ASCII_y, ASCII_e, ASCII_s, '\0'
+};
+
+static const char KW_no[] = {
+ ASCII_n, ASCII_o, '\0'
+};
+
+static int
+doParseXmlDecl(const ENCODING *(*encodingFinder)(const ENCODING *,
+ const char *,
+ const char *),
+ int isGeneralTextEntity,
+ const ENCODING *enc,
+ const char *ptr,
+ const char *end,
+ const char **badPtr,
+ const char **versionPtr,
+ const char **versionEndPtr,
+ const char **encodingName,
+ const ENCODING **encoding,
+ int *standalone)
+{
+ const char *val = NULL;
+ const char *name = NULL;
+ const char *nameEnd = NULL;
+ ptr += 5 * enc->minBytesPerChar;
+ end -= 2 * enc->minBytesPerChar;
+ if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)
+ || !name) {
+ *badPtr = ptr;
+ return 0;
+ }
+ if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_version)) {
+ if (!isGeneralTextEntity) {
+ *badPtr = name;
+ return 0;
+ }
+ }
+ else {
+ if (versionPtr)
+ *versionPtr = val;
+ if (versionEndPtr)
+ *versionEndPtr = ptr;
+ if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) {
+ *badPtr = ptr;
+ return 0;
+ }
+ if (!name) {
+ if (isGeneralTextEntity) {
+ /* a TextDecl must have an EncodingDecl */
+ *badPtr = ptr;
+ return 0;
+ }
+ return 1;
+ }
+ }
+ if (XmlNameMatchesAscii(enc, name, nameEnd, KW_encoding)) {
+ int c = toAscii(enc, val, end);
+ if (!(ASCII_a <= c && c <= ASCII_z) && !(ASCII_A <= c && c <= ASCII_Z)) {
+ *badPtr = val;
+ return 0;
+ }
+ if (encodingName)
+ *encodingName = val;
+ if (encoding)
+ *encoding = encodingFinder(enc, val, ptr - enc->minBytesPerChar);
+ if (!parsePseudoAttribute(enc, ptr, end, &name, &nameEnd, &val, &ptr)) {
+ *badPtr = ptr;
+ return 0;
+ }
+ if (!name)
+ return 1;
+ }
+ if (!XmlNameMatchesAscii(enc, name, nameEnd, KW_standalone)
+ || isGeneralTextEntity) {
+ *badPtr = name;
+ return 0;
+ }
+ if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_yes)) {
+ if (standalone)
+ *standalone = 1;
+ }
+ else if (XmlNameMatchesAscii(enc, val, ptr - enc->minBytesPerChar, KW_no)) {
+ if (standalone)
+ *standalone = 0;
+ }
+ else {
+ *badPtr = val;
+ return 0;
+ }
+ while (isSpace(toAscii(enc, ptr, end)))
+ ptr += enc->minBytesPerChar;
+ if (ptr != end) {
+ *badPtr = ptr;
+ return 0;
+ }
+ return 1;
+}
+
+static int FASTCALL
+checkCharRefNumber(int result)
+{
+ switch (result >> 8) {
+ case 0xD8: case 0xD9: case 0xDA: case 0xDB:
+ case 0xDC: case 0xDD: case 0xDE: case 0xDF:
+ return -1;
+ case 0:
+ if (latin1_encoding.type[result] == BT_NONXML)
+ return -1;
+ break;
+ case 0xFF:
+ if (result == 0xFFFE || result == 0xFFFF)
+ return -1;
+ break;
+ }
+ return result;
+}
+
+int FASTCALL
+XmlUtf8Encode(int c, char *buf)
+{
+ enum {
+ /* minN is minimum legal resulting value for N byte sequence */
+ min2 = 0x80,
+ min3 = 0x800,
+ min4 = 0x10000
+ };
+
+ if (c < 0)
+ return 0;
+ if (c < min2) {
+ buf[0] = (char)(c | UTF8_cval1);
+ return 1;
+ }
+ if (c < min3) {
+ buf[0] = (char)((c >> 6) | UTF8_cval2);
+ buf[1] = (char)((c & 0x3f) | 0x80);
+ return 2;
+ }
+ if (c < min4) {
+ buf[0] = (char)((c >> 12) | UTF8_cval3);
+ buf[1] = (char)(((c >> 6) & 0x3f) | 0x80);
+ buf[2] = (char)((c & 0x3f) | 0x80);
+ return 3;
+ }
+ if (c < 0x110000) {
+ buf[0] = (char)((c >> 18) | UTF8_cval4);
+ buf[1] = (char)(((c >> 12) & 0x3f) | 0x80);
+ buf[2] = (char)(((c >> 6) & 0x3f) | 0x80);
+ buf[3] = (char)((c & 0x3f) | 0x80);
+ return 4;
+ }
+ return 0;
+}
+
+int FASTCALL
+XmlUtf16Encode(int charNum, unsigned short *buf)
+{
+ if (charNum < 0)
+ return 0;
+ if (charNum < 0x10000) {
+ buf[0] = (unsigned short)charNum;
+ return 1;
+ }
+ if (charNum < 0x110000) {
+ charNum -= 0x10000;
+ buf[0] = (unsigned short)((charNum >> 10) + 0xD800);
+ buf[1] = (unsigned short)((charNum & 0x3FF) + 0xDC00);
+ return 2;
+ }
+ return 0;
+}
+
+struct unknown_encoding {
+ struct normal_encoding normal;
+ CONVERTER convert;
+ void *userData;
+ unsigned short utf16[256];
+ char utf8[256][4];
+};
+
+#define AS_UNKNOWN_ENCODING(enc) ((const struct unknown_encoding *) (enc))
+
+int
+XmlSizeOfUnknownEncoding(void)
+{
+ return sizeof(struct unknown_encoding);
+}
+
+static int PTRFASTCALL
+unknown_isName(const ENCODING *enc, const char *p)
+{
+ const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc);
+ int c = uenc->convert(uenc->userData, p);
+ if (c & ~0xFFFF)
+ return 0;
+ return UCS2_GET_NAMING(namePages, c >> 8, c & 0xFF);
+}
+
+static int PTRFASTCALL
+unknown_isNmstrt(const ENCODING *enc, const char *p)
+{
+ const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc);
+ int c = uenc->convert(uenc->userData, p);
+ if (c & ~0xFFFF)
+ return 0;
+ return UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xFF);
+}
+
+static int PTRFASTCALL
+unknown_isInvalid(const ENCODING *enc, const char *p)
+{
+ const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc);
+ int c = uenc->convert(uenc->userData, p);
+ return (c & ~0xFFFF) || checkCharRefNumber(c) < 0;
+}
+
+static enum XML_Convert_Result PTRCALL
+unknown_toUtf8(const ENCODING *enc,
+ const char **fromP, const char *fromLim,
+ char **toP, const char *toLim)
+{
+ const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc);
+ char buf[XML_UTF8_ENCODE_MAX];
+ for (;;) {
+ const char *utf8;
+ int n;
+ if (*fromP == fromLim)
+ return XML_CONVERT_COMPLETED;
+ utf8 = uenc->utf8[(unsigned char)**fromP];
+ n = *utf8++;
+ if (n == 0) {
+ int c = uenc->convert(uenc->userData, *fromP);
+ n = XmlUtf8Encode(c, buf);
+ if (n > toLim - *toP)
+ return XML_CONVERT_OUTPUT_EXHAUSTED;
+ utf8 = buf;
+ *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP]
+ - (BT_LEAD2 - 2));
+ }
+ else {
+ if (n > toLim - *toP)
+ return XML_CONVERT_OUTPUT_EXHAUSTED;
+ (*fromP)++;
+ }
+ do {
+ *(*toP)++ = *utf8++;
+ } while (--n != 0);
+ }
+}
+
+static enum XML_Convert_Result PTRCALL
+unknown_toUtf16(const ENCODING *enc,
+ const char **fromP, const char *fromLim,
+ unsigned short **toP, const unsigned short *toLim)
+{
+ const struct unknown_encoding *uenc = AS_UNKNOWN_ENCODING(enc);
+ while (*fromP < fromLim && *toP < toLim) {
+ unsigned short c = uenc->utf16[(unsigned char)**fromP];
+ if (c == 0) {
+ c = (unsigned short)
+ uenc->convert(uenc->userData, *fromP);
+ *fromP += (AS_NORMAL_ENCODING(enc)->type[(unsigned char)**fromP]
+ - (BT_LEAD2 - 2));
+ }
+ else
+ (*fromP)++;
+ *(*toP)++ = c;
+ }
+
+ if ((*toP == toLim) && (*fromP < fromLim))
+ return XML_CONVERT_OUTPUT_EXHAUSTED;
+ else
+ return XML_CONVERT_COMPLETED;
+}
+
+ENCODING *
+XmlInitUnknownEncoding(void *mem,
+ int *table,
+ CONVERTER convert,
+ void *userData)
+{
+ int i;
+ struct unknown_encoding *e = (struct unknown_encoding *)mem;
+ for (i = 0; i < (int)sizeof(struct normal_encoding); i++)
+ ((char *)mem)[i] = ((char *)&latin1_encoding)[i];
+ for (i = 0; i < 128; i++)
+ if (latin1_encoding.type[i] != BT_OTHER
+ && latin1_encoding.type[i] != BT_NONXML
+ && table[i] != i)
+ return 0;
+ for (i = 0; i < 256; i++) {
+ int c = table[i];
+ if (c == -1) {
+ e->normal.type[i] = BT_MALFORM;
+ /* This shouldn't really get used. */
+ e->utf16[i] = 0xFFFF;
+ e->utf8[i][0] = 1;
+ e->utf8[i][1] = 0;
+ }
+ else if (c < 0) {
+ if (c < -4)
+ return 0;
+ e->normal.type[i] = (unsigned char)(BT_LEAD2 - (c + 2));
+ e->utf8[i][0] = 0;
+ e->utf16[i] = 0;
+ }
+ else if (c < 0x80) {
+ if (latin1_encoding.type[c] != BT_OTHER
+ && latin1_encoding.type[c] != BT_NONXML
+ && c != i)
+ return 0;
+ e->normal.type[i] = latin1_encoding.type[c];
+ e->utf8[i][0] = 1;
+ e->utf8[i][1] = (char)c;
+ e->utf16[i] = (unsigned short)(c == 0 ? 0xFFFF : c);
+ }
+ else if (checkCharRefNumber(c) < 0) {
+ e->normal.type[i] = BT_NONXML;
+ /* This shouldn't really get used. */
+ e->utf16[i] = 0xFFFF;
+ e->utf8[i][0] = 1;
+ e->utf8[i][1] = 0;
+ }
+ else {
+ if (c > 0xFFFF)
+ return 0;
+ if (UCS2_GET_NAMING(nmstrtPages, c >> 8, c & 0xff))
+ e->normal.type[i] = BT_NMSTRT;
+ else if (UCS2_GET_NAMING(namePages, c >> 8, c & 0xff))
+ e->normal.type[i] = BT_NAME;
+ else
+ e->normal.type[i] = BT_OTHER;
+ e->utf8[i][0] = (char)XmlUtf8Encode(c, e->utf8[i] + 1);
+ e->utf16[i] = (unsigned short)c;
+ }
+ }
+ e->userData = userData;
+ e->convert = convert;
+ if (convert) {
+ e->normal.isName2 = unknown_isName;
+ e->normal.isName3 = unknown_isName;
+ e->normal.isName4 = unknown_isName;
+ e->normal.isNmstrt2 = unknown_isNmstrt;
+ e->normal.isNmstrt3 = unknown_isNmstrt;
+ e->normal.isNmstrt4 = unknown_isNmstrt;
+ e->normal.isInvalid2 = unknown_isInvalid;
+ e->normal.isInvalid3 = unknown_isInvalid;
+ e->normal.isInvalid4 = unknown_isInvalid;
+ }
+ e->normal.enc.utf8Convert = unknown_toUtf8;
+ e->normal.enc.utf16Convert = unknown_toUtf16;
+ return &(e->normal.enc);
+}
+
+/* If this enumeration is changed, getEncodingIndex and encodings
+must also be changed. */
+enum {
+ UNKNOWN_ENC = -1,
+ ISO_8859_1_ENC = 0,
+ US_ASCII_ENC,
+ UTF_8_ENC,
+ UTF_16_ENC,
+ UTF_16BE_ENC,
+ UTF_16LE_ENC,
+ /* must match encodingNames up to here */
+ NO_ENC
+};
+
+static const char KW_ISO_8859_1[] = {
+ ASCII_I, ASCII_S, ASCII_O, ASCII_MINUS, ASCII_8, ASCII_8, ASCII_5, ASCII_9,
+ ASCII_MINUS, ASCII_1, '\0'
+};
+static const char KW_US_ASCII[] = {
+ ASCII_U, ASCII_S, ASCII_MINUS, ASCII_A, ASCII_S, ASCII_C, ASCII_I, ASCII_I,
+ '\0'
+};
+static const char KW_UTF_8[] = {
+ ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_8, '\0'
+};
+static const char KW_UTF_16[] = {
+ ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, '\0'
+};
+static const char KW_UTF_16BE[] = {
+ ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_B, ASCII_E,
+ '\0'
+};
+static const char KW_UTF_16LE[] = {
+ ASCII_U, ASCII_T, ASCII_F, ASCII_MINUS, ASCII_1, ASCII_6, ASCII_L, ASCII_E,
+ '\0'
+};
+
+static int FASTCALL
+getEncodingIndex(const char *name)
+{
+ static const char * const encodingNames[] = {
+ KW_ISO_8859_1,
+ KW_US_ASCII,
+ KW_UTF_8,
+ KW_UTF_16,
+ KW_UTF_16BE,
+ KW_UTF_16LE,
+ };
+ int i;
+ if (name == NULL)
+ return NO_ENC;
+ for (i = 0; i < (int)(sizeof(encodingNames)/sizeof(encodingNames[0])); i++)
+ if (streqci(name, encodingNames[i]))
+ return i;
+ return UNKNOWN_ENC;
+}
+
+/* For binary compatibility, we store the index of the encoding
+ specified at initialization in the isUtf16 member.
+*/
+
+#define INIT_ENC_INDEX(enc) ((int)(enc)->initEnc.isUtf16)
+#define SET_INIT_ENC_INDEX(enc, i) ((enc)->initEnc.isUtf16 = (char)i)
+
+/* This is what detects the encoding. encodingTable maps from
+ encoding indices to encodings; INIT_ENC_INDEX(enc) is the index of
+ the external (protocol) specified encoding; state is
+ XML_CONTENT_STATE if we're parsing an external text entity, and
+ XML_PROLOG_STATE otherwise.
+*/
+
+
+static int
+initScan(const ENCODING * const *encodingTable,
+ const INIT_ENCODING *enc,
+ int state,
+ const char *ptr,
+ const char *end,
+ const char **nextTokPtr)
+{
+ const ENCODING **encPtr;
+
+ if (ptr >= end)
+ return XML_TOK_NONE;
+ encPtr = enc->encPtr;
+ if (ptr + 1 == end) {
+ /* only a single byte available for auto-detection */
+#ifndef XML_DTD /* FIXME */
+ /* a well-formed document entity must have more than one byte */
+ if (state != XML_CONTENT_STATE)
+ return XML_TOK_PARTIAL;
+#endif
+ /* so we're parsing an external text entity... */
+ /* if UTF-16 was externally specified, then we need at least 2 bytes */
+ switch (INIT_ENC_INDEX(enc)) {
+ case UTF_16_ENC:
+ case UTF_16LE_ENC:
+ case UTF_16BE_ENC:
+ return XML_TOK_PARTIAL;
+ }
+ switch ((unsigned char)*ptr) {
+ case 0xFE:
+ case 0xFF:
+ case 0xEF: /* possibly first byte of UTF-8 BOM */
+ if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC
+ && state == XML_CONTENT_STATE)
+ break;
+ /* fall through */
+ case 0x00:
+ case 0x3C:
+ return XML_TOK_PARTIAL;
+ }
+ }
+ else {
+ switch (((unsigned char)ptr[0] << 8) | (unsigned char)ptr[1]) {
+ case 0xFEFF:
+ if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC
+ && state == XML_CONTENT_STATE)
+ break;
+ *nextTokPtr = ptr + 2;
+ *encPtr = encodingTable[UTF_16BE_ENC];
+ return XML_TOK_BOM;
+ /* 00 3C is handled in the default case */
+ case 0x3C00:
+ if ((INIT_ENC_INDEX(enc) == UTF_16BE_ENC
+ || INIT_ENC_INDEX(enc) == UTF_16_ENC)
+ && state == XML_CONTENT_STATE)
+ break;
+ *encPtr = encodingTable[UTF_16LE_ENC];
+ return XmlTok(*encPtr, state, ptr, end, nextTokPtr);
+ case 0xFFFE:
+ if (INIT_ENC_INDEX(enc) == ISO_8859_1_ENC
+ && state == XML_CONTENT_STATE)
+ break;
+ *nextTokPtr = ptr + 2;
+ *encPtr = encodingTable[UTF_16LE_ENC];
+ return XML_TOK_BOM;
+ case 0xEFBB:
+ /* Maybe a UTF-8 BOM (EF BB BF) */
+ /* If there's an explicitly specified (external) encoding
+ of ISO-8859-1 or some flavour of UTF-16
+ and this is an external text entity,
+ don't look for the BOM,
+ because it might be a legal data.
+ */
+ if (state == XML_CONTENT_STATE) {
+ int e = INIT_ENC_INDEX(enc);
+ if (e == ISO_8859_1_ENC || e == UTF_16BE_ENC
+ || e == UTF_16LE_ENC || e == UTF_16_ENC)
+ break;
+ }
+ if (ptr + 2 == end)
+ return XML_TOK_PARTIAL;
+ if ((unsigned char)ptr[2] == 0xBF) {
+ *nextTokPtr = ptr + 3;
+ *encPtr = encodingTable[UTF_8_ENC];
+ return XML_TOK_BOM;
+ }
+ break;
+ default:
+ if (ptr[0] == '\0') {
+ /* 0 isn't a legal data character. Furthermore a document
+ entity can only start with ASCII characters. So the only
+ way this can fail to be big-endian UTF-16 if it it's an
+ external parsed general entity that's labelled as
+ UTF-16LE.
+ */
+ if (state == XML_CONTENT_STATE && INIT_ENC_INDEX(enc) == UTF_16LE_ENC)
+ break;
+ *encPtr = encodingTable[UTF_16BE_ENC];
+ return XmlTok(*encPtr, state, ptr, end, nextTokPtr);
+ }
+ else if (ptr[1] == '\0') {
+ /* We could recover here in the case:
+ - parsing an external entity
+ - second byte is 0
+ - no externally specified encoding
+ - no encoding declaration
+ by assuming UTF-16LE. But we don't, because this would mean when
+ presented just with a single byte, we couldn't reliably determine
+ whether we needed further bytes.
+ */
+ if (state == XML_CONTENT_STATE)
+ break;
+ *encPtr = encodingTable[UTF_16LE_ENC];
+ return XmlTok(*encPtr, state, ptr, end, nextTokPtr);
+ }
+ break;
+ }
+ }
+ *encPtr = encodingTable[INIT_ENC_INDEX(enc)];
+ return XmlTok(*encPtr, state, ptr, end, nextTokPtr);
+}
+
+
+#define NS(x) x
+#define ns(x) x
+#define XML_TOK_NS_C
+#include "xmltok_ns.inc"
+#undef XML_TOK_NS_C
+#undef NS
+#undef ns
+
+#ifdef XML_NS
+
+#define NS(x) x ## NS
+#define ns(x) x ## _ns
+
+#define XML_TOK_NS_C
+#include "xmltok_ns.inc"
+#undef XML_TOK_NS_C
+
+#undef NS
+#undef ns
+
+ENCODING *
+XmlInitUnknownEncodingNS(void *mem,
+ int *table,
+ CONVERTER convert,
+ void *userData)
+{
+ ENCODING *enc = XmlInitUnknownEncoding(mem, table, convert, userData);
+ if (enc)
+ ((struct normal_encoding *)enc)->type[ASCII_COLON] = BT_COLON;
+ return enc;
+}
+
+#endif /* XML_NS */
diff --git a/deps/EXPAT/expat/xmltok.h b/deps/EXPAT/expat/xmltok.h
new file mode 100644
index 000000000..752007e8b
--- /dev/null
+++ b/deps/EXPAT/expat/xmltok.h
@@ -0,0 +1,322 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+ See the file COPYING for copying permission.
+*/
+
+#ifndef XmlTok_INCLUDED
+#define XmlTok_INCLUDED 1
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* The following token may be returned by XmlContentTok */
+#define XML_TOK_TRAILING_RSQB -5 /* ] or ]] at the end of the scan; might be
+ start of illegal ]]> sequence */
+/* The following tokens may be returned by both XmlPrologTok and
+ XmlContentTok.
+*/
+#define XML_TOK_NONE -4 /* The string to be scanned is empty */
+#define XML_TOK_TRAILING_CR -3 /* A CR at the end of the scan;
+ might be part of CRLF sequence */
+#define XML_TOK_PARTIAL_CHAR -2 /* only part of a multibyte sequence */
+#define XML_TOK_PARTIAL -1 /* only part of a token */
+#define XML_TOK_INVALID 0
+
+/* The following tokens are returned by XmlContentTok; some are also
+ returned by XmlAttributeValueTok, XmlEntityTok, XmlCdataSectionTok.
+*/
+#define XML_TOK_START_TAG_WITH_ATTS 1
+#define XML_TOK_START_TAG_NO_ATTS 2
+#define XML_TOK_EMPTY_ELEMENT_WITH_ATTS 3 /* empty element tag <e/> */
+#define XML_TOK_EMPTY_ELEMENT_NO_ATTS 4
+#define XML_TOK_END_TAG 5
+#define XML_TOK_DATA_CHARS 6
+#define XML_TOK_DATA_NEWLINE 7
+#define XML_TOK_CDATA_SECT_OPEN 8
+#define XML_TOK_ENTITY_REF 9
+#define XML_TOK_CHAR_REF 10 /* numeric character reference */
+
+/* The following tokens may be returned by both XmlPrologTok and
+ XmlContentTok.
+*/
+#define XML_TOK_PI 11 /* processing instruction */
+#define XML_TOK_XML_DECL 12 /* XML decl or text decl */
+#define XML_TOK_COMMENT 13
+#define XML_TOK_BOM 14 /* Byte order mark */
+
+/* The following tokens are returned only by XmlPrologTok */
+#define XML_TOK_PROLOG_S 15
+#define XML_TOK_DECL_OPEN 16 /* <!foo */
+#define XML_TOK_DECL_CLOSE 17 /* > */
+#define XML_TOK_NAME 18
+#define XML_TOK_NMTOKEN 19
+#define XML_TOK_POUND_NAME 20 /* #name */
+#define XML_TOK_OR 21 /* | */
+#define XML_TOK_PERCENT 22
+#define XML_TOK_OPEN_PAREN 23
+#define XML_TOK_CLOSE_PAREN 24
+#define XML_TOK_OPEN_BRACKET 25
+#define XML_TOK_CLOSE_BRACKET 26
+#define XML_TOK_LITERAL 27
+#define XML_TOK_PARAM_ENTITY_REF 28
+#define XML_TOK_INSTANCE_START 29
+
+/* The following occur only in element type declarations */
+#define XML_TOK_NAME_QUESTION 30 /* name? */
+#define XML_TOK_NAME_ASTERISK 31 /* name* */
+#define XML_TOK_NAME_PLUS 32 /* name+ */
+#define XML_TOK_COND_SECT_OPEN 33 /* <![ */
+#define XML_TOK_COND_SECT_CLOSE 34 /* ]]> */
+#define XML_TOK_CLOSE_PAREN_QUESTION 35 /* )? */
+#define XML_TOK_CLOSE_PAREN_ASTERISK 36 /* )* */
+#define XML_TOK_CLOSE_PAREN_PLUS 37 /* )+ */
+#define XML_TOK_COMMA 38
+
+/* The following token is returned only by XmlAttributeValueTok */
+#define XML_TOK_ATTRIBUTE_VALUE_S 39
+
+/* The following token is returned only by XmlCdataSectionTok */
+#define XML_TOK_CDATA_SECT_CLOSE 40
+
+/* With namespace processing this is returned by XmlPrologTok for a
+ name with a colon.
+*/
+#define XML_TOK_PREFIXED_NAME 41
+
+#ifdef XML_DTD
+#define XML_TOK_IGNORE_SECT 42
+#endif /* XML_DTD */
+
+#ifdef XML_DTD
+#define XML_N_STATES 4
+#else /* not XML_DTD */
+#define XML_N_STATES 3
+#endif /* not XML_DTD */
+
+#define XML_PROLOG_STATE 0
+#define XML_CONTENT_STATE 1
+#define XML_CDATA_SECTION_STATE 2
+#ifdef XML_DTD
+#define XML_IGNORE_SECTION_STATE 3
+#endif /* XML_DTD */
+
+#define XML_N_LITERAL_TYPES 2
+#define XML_ATTRIBUTE_VALUE_LITERAL 0
+#define XML_ENTITY_VALUE_LITERAL 1
+
+/* The size of the buffer passed to XmlUtf8Encode must be at least this. */
+#define XML_UTF8_ENCODE_MAX 4
+/* The size of the buffer passed to XmlUtf16Encode must be at least this. */
+#define XML_UTF16_ENCODE_MAX 2
+
+typedef struct position {
+ /* first line and first column are 0 not 1 */
+ XML_Size lineNumber;
+ XML_Size columnNumber;
+} POSITION;
+
+typedef struct {
+ const char *name;
+ const char *valuePtr;
+ const char *valueEnd;
+ char normalized;
+} ATTRIBUTE;
+
+struct encoding;
+typedef struct encoding ENCODING;
+
+typedef int (PTRCALL *SCANNER)(const ENCODING *,
+ const char *,
+ const char *,
+ const char **);
+
+enum XML_Convert_Result {
+ XML_CONVERT_COMPLETED = 0,
+ XML_CONVERT_INPUT_INCOMPLETE = 1,
+ XML_CONVERT_OUTPUT_EXHAUSTED = 2 /* and therefore potentially input remaining as well */
+};
+
+struct encoding {
+ SCANNER scanners[XML_N_STATES];
+ SCANNER literalScanners[XML_N_LITERAL_TYPES];
+ int (PTRCALL *sameName)(const ENCODING *,
+ const char *,
+ const char *);
+ int (PTRCALL *nameMatchesAscii)(const ENCODING *,
+ const char *,
+ const char *,
+ const char *);
+ int (PTRFASTCALL *nameLength)(const ENCODING *, const char *);
+ const char *(PTRFASTCALL *skipS)(const ENCODING *, const char *);
+ int (PTRCALL *getAtts)(const ENCODING *enc,
+ const char *ptr,
+ int attsMax,
+ ATTRIBUTE *atts);
+ int (PTRFASTCALL *charRefNumber)(const ENCODING *enc, const char *ptr);
+ int (PTRCALL *predefinedEntityName)(const ENCODING *,
+ const char *,
+ const char *);
+ void (PTRCALL *updatePosition)(const ENCODING *,
+ const char *ptr,
+ const char *end,
+ POSITION *);
+ int (PTRCALL *isPublicId)(const ENCODING *enc,
+ const char *ptr,
+ const char *end,
+ const char **badPtr);
+ enum XML_Convert_Result (PTRCALL *utf8Convert)(const ENCODING *enc,
+ const char **fromP,
+ const char *fromLim,
+ char **toP,
+ const char *toLim);
+ enum XML_Convert_Result (PTRCALL *utf16Convert)(const ENCODING *enc,
+ const char **fromP,
+ const char *fromLim,
+ unsigned short **toP,
+ const unsigned short *toLim);
+ int minBytesPerChar;
+ char isUtf8;
+ char isUtf16;
+};
+
+/* Scan the string starting at ptr until the end of the next complete
+ token, but do not scan past eptr. Return an integer giving the
+ type of token.
+
+ Return XML_TOK_NONE when ptr == eptr; nextTokPtr will not be set.
+
+ Return XML_TOK_PARTIAL when the string does not contain a complete
+ token; nextTokPtr will not be set.
+
+ Return XML_TOK_INVALID when the string does not start a valid
+ token; nextTokPtr will be set to point to the character which made
+ the token invalid.
+
+ Otherwise the string starts with a valid token; nextTokPtr will be
+ set to point to the character following the end of that token.
+
+ Each data character counts as a single token, but adjacent data
+ characters may be returned together. Similarly for characters in
+ the prolog outside literals, comments and processing instructions.
+*/
+
+
+#define XmlTok(enc, state, ptr, end, nextTokPtr) \
+ (((enc)->scanners[state])(enc, ptr, end, nextTokPtr))
+
+#define XmlPrologTok(enc, ptr, end, nextTokPtr) \
+ XmlTok(enc, XML_PROLOG_STATE, ptr, end, nextTokPtr)
+
+#define XmlContentTok(enc, ptr, end, nextTokPtr) \
+ XmlTok(enc, XML_CONTENT_STATE, ptr, end, nextTokPtr)
+
+#define XmlCdataSectionTok(enc, ptr, end, nextTokPtr) \
+ XmlTok(enc, XML_CDATA_SECTION_STATE, ptr, end, nextTokPtr)
+
+#ifdef XML_DTD
+
+#define XmlIgnoreSectionTok(enc, ptr, end, nextTokPtr) \
+ XmlTok(enc, XML_IGNORE_SECTION_STATE, ptr, end, nextTokPtr)
+
+#endif /* XML_DTD */
+
+/* This is used for performing a 2nd-level tokenization on the content
+ of a literal that has already been returned by XmlTok.
+*/
+#define XmlLiteralTok(enc, literalType, ptr, end, nextTokPtr) \
+ (((enc)->literalScanners[literalType])(enc, ptr, end, nextTokPtr))
+
+#define XmlAttributeValueTok(enc, ptr, end, nextTokPtr) \
+ XmlLiteralTok(enc, XML_ATTRIBUTE_VALUE_LITERAL, ptr, end, nextTokPtr)
+
+#define XmlEntityValueTok(enc, ptr, end, nextTokPtr) \
+ XmlLiteralTok(enc, XML_ENTITY_VALUE_LITERAL, ptr, end, nextTokPtr)
+
+#define XmlSameName(enc, ptr1, ptr2) (((enc)->sameName)(enc, ptr1, ptr2))
+
+#define XmlNameMatchesAscii(enc, ptr1, end1, ptr2) \
+ (((enc)->nameMatchesAscii)(enc, ptr1, end1, ptr2))
+
+#define XmlNameLength(enc, ptr) \
+ (((enc)->nameLength)(enc, ptr))
+
+#define XmlSkipS(enc, ptr) \
+ (((enc)->skipS)(enc, ptr))
+
+#define XmlGetAttributes(enc, ptr, attsMax, atts) \
+ (((enc)->getAtts)(enc, ptr, attsMax, atts))
+
+#define XmlCharRefNumber(enc, ptr) \
+ (((enc)->charRefNumber)(enc, ptr))
+
+#define XmlPredefinedEntityName(enc, ptr, end) \
+ (((enc)->predefinedEntityName)(enc, ptr, end))
+
+#define XmlUpdatePosition(enc, ptr, end, pos) \
+ (((enc)->updatePosition)(enc, ptr, end, pos))
+
+#define XmlIsPublicId(enc, ptr, end, badPtr) \
+ (((enc)->isPublicId)(enc, ptr, end, badPtr))
+
+#define XmlUtf8Convert(enc, fromP, fromLim, toP, toLim) \
+ (((enc)->utf8Convert)(enc, fromP, fromLim, toP, toLim))
+
+#define XmlUtf16Convert(enc, fromP, fromLim, toP, toLim) \
+ (((enc)->utf16Convert)(enc, fromP, fromLim, toP, toLim))
+
+typedef struct {
+ ENCODING initEnc;
+ const ENCODING **encPtr;
+} INIT_ENCODING;
+
+int XmlParseXmlDecl(int isGeneralTextEntity,
+ const ENCODING *enc,
+ const char *ptr,
+ const char *end,
+ const char **badPtr,
+ const char **versionPtr,
+ const char **versionEndPtr,
+ const char **encodingNamePtr,
+ const ENCODING **namedEncodingPtr,
+ int *standalonePtr);
+
+int XmlInitEncoding(INIT_ENCODING *, const ENCODING **, const char *name);
+const ENCODING *XmlGetUtf8InternalEncoding(void);
+const ENCODING *XmlGetUtf16InternalEncoding(void);
+int FASTCALL XmlUtf8Encode(int charNumber, char *buf);
+int FASTCALL XmlUtf16Encode(int charNumber, unsigned short *buf);
+int XmlSizeOfUnknownEncoding(void);
+
+
+typedef int (XMLCALL *CONVERTER) (void *userData, const char *p);
+
+ENCODING *
+XmlInitUnknownEncoding(void *mem,
+ int *table,
+ CONVERTER convert,
+ void *userData);
+
+int XmlParseXmlDeclNS(int isGeneralTextEntity,
+ const ENCODING *enc,
+ const char *ptr,
+ const char *end,
+ const char **badPtr,
+ const char **versionPtr,
+ const char **versionEndPtr,
+ const char **encodingNamePtr,
+ const ENCODING **namedEncodingPtr,
+ int *standalonePtr);
+
+int XmlInitEncodingNS(INIT_ENCODING *, const ENCODING **, const char *name);
+const ENCODING *XmlGetUtf8InternalEncodingNS(void);
+const ENCODING *XmlGetUtf16InternalEncodingNS(void);
+ENCODING *
+XmlInitUnknownEncodingNS(void *mem,
+ int *table,
+ CONVERTER convert,
+ void *userData);
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* not XmlTok_INCLUDED */
diff --git a/deps/EXPAT/expat/xmltok_impl.h b/deps/EXPAT/expat/xmltok_impl.h
new file mode 100644
index 000000000..da0ea60a6
--- /dev/null
+++ b/deps/EXPAT/expat/xmltok_impl.h
@@ -0,0 +1,46 @@
+/*
+Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+See the file COPYING for copying permission.
+*/
+
+enum {
+ BT_NONXML,
+ BT_MALFORM,
+ BT_LT,
+ BT_AMP,
+ BT_RSQB,
+ BT_LEAD2,
+ BT_LEAD3,
+ BT_LEAD4,
+ BT_TRAIL,
+ BT_CR,
+ BT_LF,
+ BT_GT,
+ BT_QUOT,
+ BT_APOS,
+ BT_EQUALS,
+ BT_QUEST,
+ BT_EXCL,
+ BT_SOL,
+ BT_SEMI,
+ BT_NUM,
+ BT_LSQB,
+ BT_S,
+ BT_NMSTRT,
+ BT_COLON,
+ BT_HEX,
+ BT_DIGIT,
+ BT_NAME,
+ BT_MINUS,
+ BT_OTHER, /* known not to be a name or name start character */
+ BT_NONASCII, /* might be a name or name start character */
+ BT_PERCNT,
+ BT_LPAR,
+ BT_RPAR,
+ BT_AST,
+ BT_PLUS,
+ BT_COMMA,
+ BT_VERBAR
+};
+
+#include <stddef.h>
diff --git a/deps/EXPAT/expat/xmltok_impl.inc b/deps/EXPAT/expat/xmltok_impl.inc
new file mode 100644
index 000000000..5f779c057
--- /dev/null
+++ b/deps/EXPAT/expat/xmltok_impl.inc
@@ -0,0 +1,1779 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+ See the file COPYING for copying permission.
+*/
+
+/* This file is included! */
+#ifdef XML_TOK_IMPL_C
+
+#ifndef IS_INVALID_CHAR
+#define IS_INVALID_CHAR(enc, ptr, n) (0)
+#endif
+
+#define INVALID_LEAD_CASE(n, ptr, nextTokPtr) \
+ case BT_LEAD ## n: \
+ if (end - ptr < n) \
+ return XML_TOK_PARTIAL_CHAR; \
+ if (IS_INVALID_CHAR(enc, ptr, n)) { \
+ *(nextTokPtr) = (ptr); \
+ return XML_TOK_INVALID; \
+ } \
+ ptr += n; \
+ break;
+
+#define INVALID_CASES(ptr, nextTokPtr) \
+ INVALID_LEAD_CASE(2, ptr, nextTokPtr) \
+ INVALID_LEAD_CASE(3, ptr, nextTokPtr) \
+ INVALID_LEAD_CASE(4, ptr, nextTokPtr) \
+ case BT_NONXML: \
+ case BT_MALFORM: \
+ case BT_TRAIL: \
+ *(nextTokPtr) = (ptr); \
+ return XML_TOK_INVALID;
+
+#define CHECK_NAME_CASE(n, enc, ptr, end, nextTokPtr) \
+ case BT_LEAD ## n: \
+ if (end - ptr < n) \
+ return XML_TOK_PARTIAL_CHAR; \
+ if (!IS_NAME_CHAR(enc, ptr, n)) { \
+ *nextTokPtr = ptr; \
+ return XML_TOK_INVALID; \
+ } \
+ ptr += n; \
+ break;
+
+#define CHECK_NAME_CASES(enc, ptr, end, nextTokPtr) \
+ case BT_NONASCII: \
+ if (!IS_NAME_CHAR_MINBPC(enc, ptr)) { \
+ *nextTokPtr = ptr; \
+ return XML_TOK_INVALID; \
+ } \
+ case BT_NMSTRT: \
+ case BT_HEX: \
+ case BT_DIGIT: \
+ case BT_NAME: \
+ case BT_MINUS: \
+ ptr += MINBPC(enc); \
+ break; \
+ CHECK_NAME_CASE(2, enc, ptr, end, nextTokPtr) \
+ CHECK_NAME_CASE(3, enc, ptr, end, nextTokPtr) \
+ CHECK_NAME_CASE(4, enc, ptr, end, nextTokPtr)
+
+#define CHECK_NMSTRT_CASE(n, enc, ptr, end, nextTokPtr) \
+ case BT_LEAD ## n: \
+ if (end - ptr < n) \
+ return XML_TOK_PARTIAL_CHAR; \
+ if (!IS_NMSTRT_CHAR(enc, ptr, n)) { \
+ *nextTokPtr = ptr; \
+ return XML_TOK_INVALID; \
+ } \
+ ptr += n; \
+ break;
+
+#define CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr) \
+ case BT_NONASCII: \
+ if (!IS_NMSTRT_CHAR_MINBPC(enc, ptr)) { \
+ *nextTokPtr = ptr; \
+ return XML_TOK_INVALID; \
+ } \
+ case BT_NMSTRT: \
+ case BT_HEX: \
+ ptr += MINBPC(enc); \
+ break; \
+ CHECK_NMSTRT_CASE(2, enc, ptr, end, nextTokPtr) \
+ CHECK_NMSTRT_CASE(3, enc, ptr, end, nextTokPtr) \
+ CHECK_NMSTRT_CASE(4, enc, ptr, end, nextTokPtr)
+
+#ifndef PREFIX
+#define PREFIX(ident) ident
+#endif
+
+
+#define HAS_CHARS(enc, ptr, end, count) \
+ (end - ptr >= count * MINBPC(enc))
+
+#define HAS_CHAR(enc, ptr, end) \
+ HAS_CHARS(enc, ptr, end, 1)
+
+#define REQUIRE_CHARS(enc, ptr, end, count) \
+ { \
+ if (! HAS_CHARS(enc, ptr, end, count)) { \
+ return XML_TOK_PARTIAL; \
+ } \
+ }
+
+#define REQUIRE_CHAR(enc, ptr, end) \
+ REQUIRE_CHARS(enc, ptr, end, 1)
+
+
+/* ptr points to character following "<!-" */
+
+static int PTRCALL
+PREFIX(scanComment)(const ENCODING *enc, const char *ptr,
+ const char *end, const char **nextTokPtr)
+{
+ if (HAS_CHAR(enc, ptr, end)) {
+ if (!CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ ptr += MINBPC(enc);
+ while (HAS_CHAR(enc, ptr, end)) {
+ switch (BYTE_TYPE(enc, ptr)) {
+ INVALID_CASES(ptr, nextTokPtr)
+ case BT_MINUS:
+ ptr += MINBPC(enc);
+ REQUIRE_CHAR(enc, ptr, end);
+ if (CHAR_MATCHES(enc, ptr, ASCII_MINUS)) {
+ ptr += MINBPC(enc);
+ REQUIRE_CHAR(enc, ptr, end);
+ if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_COMMENT;
+ }
+ break;
+ default:
+ ptr += MINBPC(enc);
+ break;
+ }
+ }
+ }
+ return XML_TOK_PARTIAL;
+}
+
+/* ptr points to character following "<!" */
+
+static int PTRCALL
+PREFIX(scanDecl)(const ENCODING *enc, const char *ptr,
+ const char *end, const char **nextTokPtr)
+{
+ REQUIRE_CHAR(enc, ptr, end);
+ switch (BYTE_TYPE(enc, ptr)) {
+ case BT_MINUS:
+ return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
+ case BT_LSQB:
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_COND_SECT_OPEN;
+ case BT_NMSTRT:
+ case BT_HEX:
+ ptr += MINBPC(enc);
+ break;
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ while (HAS_CHAR(enc, ptr, end)) {
+ switch (BYTE_TYPE(enc, ptr)) {
+ case BT_PERCNT:
+ REQUIRE_CHARS(enc, ptr, end, 2);
+ /* don't allow <!ENTITY% foo "whatever"> */
+ switch (BYTE_TYPE(enc, ptr + MINBPC(enc))) {
+ case BT_S: case BT_CR: case BT_LF: case BT_PERCNT:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ /* fall through */
+ case BT_S: case BT_CR: case BT_LF:
+ *nextTokPtr = ptr;
+ return XML_TOK_DECL_OPEN;
+ case BT_NMSTRT:
+ case BT_HEX:
+ ptr += MINBPC(enc);
+ break;
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ }
+ return XML_TOK_PARTIAL;
+}
+
+static int PTRCALL
+PREFIX(checkPiTarget)(const ENCODING *UNUSED_P(enc), const char *ptr,
+ const char *end, int *tokPtr)
+{
+ int upper = 0;
+ *tokPtr = XML_TOK_PI;
+ if (end - ptr != MINBPC(enc)*3)
+ return 1;
+ switch (BYTE_TO_ASCII(enc, ptr)) {
+ case ASCII_x:
+ break;
+ case ASCII_X:
+ upper = 1;
+ break;
+ default:
+ return 1;
+ }
+ ptr += MINBPC(enc);
+ switch (BYTE_TO_ASCII(enc, ptr)) {
+ case ASCII_m:
+ break;
+ case ASCII_M:
+ upper = 1;
+ break;
+ default:
+ return 1;
+ }
+ ptr += MINBPC(enc);
+ switch (BYTE_TO_ASCII(enc, ptr)) {
+ case ASCII_l:
+ break;
+ case ASCII_L:
+ upper = 1;
+ break;
+ default:
+ return 1;
+ }
+ if (upper)
+ return 0;
+ *tokPtr = XML_TOK_XML_DECL;
+ return 1;
+}
+
+/* ptr points to character following "<?" */
+
+static int PTRCALL
+PREFIX(scanPi)(const ENCODING *enc, const char *ptr,
+ const char *end, const char **nextTokPtr)
+{
+ int tok;
+ const char *target = ptr;
+ REQUIRE_CHAR(enc, ptr, end);
+ switch (BYTE_TYPE(enc, ptr)) {
+ CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ while (HAS_CHAR(enc, ptr, end)) {
+ switch (BYTE_TYPE(enc, ptr)) {
+ CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
+ case BT_S: case BT_CR: case BT_LF:
+ if (!PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ ptr += MINBPC(enc);
+ while (HAS_CHAR(enc, ptr, end)) {
+ switch (BYTE_TYPE(enc, ptr)) {
+ INVALID_CASES(ptr, nextTokPtr)
+ case BT_QUEST:
+ ptr += MINBPC(enc);
+ REQUIRE_CHAR(enc, ptr, end);
+ if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
+ *nextTokPtr = ptr + MINBPC(enc);
+ return tok;
+ }
+ break;
+ default:
+ ptr += MINBPC(enc);
+ break;
+ }
+ }
+ return XML_TOK_PARTIAL;
+ case BT_QUEST:
+ if (!PREFIX(checkPiTarget)(enc, target, ptr, &tok)) {
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ ptr += MINBPC(enc);
+ REQUIRE_CHAR(enc, ptr, end);
+ if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
+ *nextTokPtr = ptr + MINBPC(enc);
+ return tok;
+ }
+ /* fall through */
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ }
+ return XML_TOK_PARTIAL;
+}
+
+static int PTRCALL
+PREFIX(scanCdataSection)(const ENCODING *UNUSED_P(enc), const char *ptr,
+ const char *end, const char **nextTokPtr)
+{
+ static const char CDATA_LSQB[] = { ASCII_C, ASCII_D, ASCII_A,
+ ASCII_T, ASCII_A, ASCII_LSQB };
+ int i;
+ /* CDATA[ */
+ REQUIRE_CHARS(enc, ptr, end, 6);
+ for (i = 0; i < 6; i++, ptr += MINBPC(enc)) {
+ if (!CHAR_MATCHES(enc, ptr, CDATA_LSQB[i])) {
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ }
+ *nextTokPtr = ptr;
+ return XML_TOK_CDATA_SECT_OPEN;
+}
+
+static int PTRCALL
+PREFIX(cdataSectionTok)(const ENCODING *enc, const char *ptr,
+ const char *end, const char **nextTokPtr)
+{
+ if (ptr >= end)
+ return XML_TOK_NONE;
+ if (MINBPC(enc) > 1) {
+ size_t n = end - ptr;
+ if (n & (MINBPC(enc) - 1)) {
+ n &= ~(MINBPC(enc) - 1);
+ if (n == 0)
+ return XML_TOK_PARTIAL;
+ end = ptr + n;
+ }
+ }
+ switch (BYTE_TYPE(enc, ptr)) {
+ case BT_RSQB:
+ ptr += MINBPC(enc);
+ REQUIRE_CHAR(enc, ptr, end);
+ if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB))
+ break;
+ ptr += MINBPC(enc);
+ REQUIRE_CHAR(enc, ptr, end);
+ if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {
+ ptr -= MINBPC(enc);
+ break;
+ }
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_CDATA_SECT_CLOSE;
+ case BT_CR:
+ ptr += MINBPC(enc);
+ REQUIRE_CHAR(enc, ptr, end);
+ if (BYTE_TYPE(enc, ptr) == BT_LF)
+ ptr += MINBPC(enc);
+ *nextTokPtr = ptr;
+ return XML_TOK_DATA_NEWLINE;
+ case BT_LF:
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_DATA_NEWLINE;
+ INVALID_CASES(ptr, nextTokPtr)
+ default:
+ ptr += MINBPC(enc);
+ break;
+ }
+ while (HAS_CHAR(enc, ptr, end)) {
+ switch (BYTE_TYPE(enc, ptr)) {
+#define LEAD_CASE(n) \
+ case BT_LEAD ## n: \
+ if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \
+ *nextTokPtr = ptr; \
+ return XML_TOK_DATA_CHARS; \
+ } \
+ ptr += n; \
+ break;
+ LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
+#undef LEAD_CASE
+ case BT_NONXML:
+ case BT_MALFORM:
+ case BT_TRAIL:
+ case BT_CR:
+ case BT_LF:
+ case BT_RSQB:
+ *nextTokPtr = ptr;
+ return XML_TOK_DATA_CHARS;
+ default:
+ ptr += MINBPC(enc);
+ break;
+ }
+ }
+ *nextTokPtr = ptr;
+ return XML_TOK_DATA_CHARS;
+}
+
+/* ptr points to character following "</" */
+
+static int PTRCALL
+PREFIX(scanEndTag)(const ENCODING *enc, const char *ptr,
+ const char *end, const char **nextTokPtr)
+{
+ REQUIRE_CHAR(enc, ptr, end);
+ switch (BYTE_TYPE(enc, ptr)) {
+ CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ while (HAS_CHAR(enc, ptr, end)) {
+ switch (BYTE_TYPE(enc, ptr)) {
+ CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
+ case BT_S: case BT_CR: case BT_LF:
+ for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
+ switch (BYTE_TYPE(enc, ptr)) {
+ case BT_S: case BT_CR: case BT_LF:
+ break;
+ case BT_GT:
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_END_TAG;
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ }
+ return XML_TOK_PARTIAL;
+#ifdef XML_NS
+ case BT_COLON:
+ /* no need to check qname syntax here,
+ since end-tag must match exactly */
+ ptr += MINBPC(enc);
+ break;
+#endif
+ case BT_GT:
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_END_TAG;
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ }
+ return XML_TOK_PARTIAL;
+}
+
+/* ptr points to character following "&#X" */
+
+static int PTRCALL
+PREFIX(scanHexCharRef)(const ENCODING *enc, const char *ptr,
+ const char *end, const char **nextTokPtr)
+{
+ if (HAS_CHAR(enc, ptr, end)) {
+ switch (BYTE_TYPE(enc, ptr)) {
+ case BT_DIGIT:
+ case BT_HEX:
+ break;
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
+ switch (BYTE_TYPE(enc, ptr)) {
+ case BT_DIGIT:
+ case BT_HEX:
+ break;
+ case BT_SEMI:
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_CHAR_REF;
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ }
+ }
+ return XML_TOK_PARTIAL;
+}
+
+/* ptr points to character following "&#" */
+
+static int PTRCALL
+PREFIX(scanCharRef)(const ENCODING *enc, const char *ptr,
+ const char *end, const char **nextTokPtr)
+{
+ if (HAS_CHAR(enc, ptr, end)) {
+ if (CHAR_MATCHES(enc, ptr, ASCII_x))
+ return PREFIX(scanHexCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
+ switch (BYTE_TYPE(enc, ptr)) {
+ case BT_DIGIT:
+ break;
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ for (ptr += MINBPC(enc); HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
+ switch (BYTE_TYPE(enc, ptr)) {
+ case BT_DIGIT:
+ break;
+ case BT_SEMI:
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_CHAR_REF;
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ }
+ }
+ return XML_TOK_PARTIAL;
+}
+
+/* ptr points to character following "&" */
+
+static int PTRCALL
+PREFIX(scanRef)(const ENCODING *enc, const char *ptr, const char *end,
+ const char **nextTokPtr)
+{
+ REQUIRE_CHAR(enc, ptr, end);
+ switch (BYTE_TYPE(enc, ptr)) {
+ CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
+ case BT_NUM:
+ return PREFIX(scanCharRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ while (HAS_CHAR(enc, ptr, end)) {
+ switch (BYTE_TYPE(enc, ptr)) {
+ CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
+ case BT_SEMI:
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_ENTITY_REF;
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ }
+ return XML_TOK_PARTIAL;
+}
+
+/* ptr points to character following first character of attribute name */
+
+static int PTRCALL
+PREFIX(scanAtts)(const ENCODING *enc, const char *ptr, const char *end,
+ const char **nextTokPtr)
+{
+#ifdef XML_NS
+ int hadColon = 0;
+#endif
+ while (HAS_CHAR(enc, ptr, end)) {
+ switch (BYTE_TYPE(enc, ptr)) {
+ CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
+#ifdef XML_NS
+ case BT_COLON:
+ if (hadColon) {
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ hadColon = 1;
+ ptr += MINBPC(enc);
+ REQUIRE_CHAR(enc, ptr, end);
+ switch (BYTE_TYPE(enc, ptr)) {
+ CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ break;
+#endif
+ case BT_S: case BT_CR: case BT_LF:
+ for (;;) {
+ int t;
+
+ ptr += MINBPC(enc);
+ REQUIRE_CHAR(enc, ptr, end);
+ t = BYTE_TYPE(enc, ptr);
+ if (t == BT_EQUALS)
+ break;
+ switch (t) {
+ case BT_S:
+ case BT_LF:
+ case BT_CR:
+ break;
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ }
+ /* fall through */
+ case BT_EQUALS:
+ {
+ int open;
+#ifdef XML_NS
+ hadColon = 0;
+#endif
+ for (;;) {
+ ptr += MINBPC(enc);
+ REQUIRE_CHAR(enc, ptr, end);
+ open = BYTE_TYPE(enc, ptr);
+ if (open == BT_QUOT || open == BT_APOS)
+ break;
+ switch (open) {
+ case BT_S:
+ case BT_LF:
+ case BT_CR:
+ break;
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ }
+ ptr += MINBPC(enc);
+ /* in attribute value */
+ for (;;) {
+ int t;
+ REQUIRE_CHAR(enc, ptr, end);
+ t = BYTE_TYPE(enc, ptr);
+ if (t == open)
+ break;
+ switch (t) {
+ INVALID_CASES(ptr, nextTokPtr)
+ case BT_AMP:
+ {
+ int tok = PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, &ptr);
+ if (tok <= 0) {
+ if (tok == XML_TOK_INVALID)
+ *nextTokPtr = ptr;
+ return tok;
+ }
+ break;
+ }
+ case BT_LT:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ default:
+ ptr += MINBPC(enc);
+ break;
+ }
+ }
+ ptr += MINBPC(enc);
+ REQUIRE_CHAR(enc, ptr, end);
+ switch (BYTE_TYPE(enc, ptr)) {
+ case BT_S:
+ case BT_CR:
+ case BT_LF:
+ break;
+ case BT_SOL:
+ goto sol;
+ case BT_GT:
+ goto gt;
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ /* ptr points to closing quote */
+ for (;;) {
+ ptr += MINBPC(enc);
+ REQUIRE_CHAR(enc, ptr, end);
+ switch (BYTE_TYPE(enc, ptr)) {
+ CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
+ case BT_S: case BT_CR: case BT_LF:
+ continue;
+ case BT_GT:
+ gt:
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_START_TAG_WITH_ATTS;
+ case BT_SOL:
+ sol:
+ ptr += MINBPC(enc);
+ REQUIRE_CHAR(enc, ptr, end);
+ if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_EMPTY_ELEMENT_WITH_ATTS;
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ break;
+ }
+ break;
+ }
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ }
+ return XML_TOK_PARTIAL;
+}
+
+/* ptr points to character following "<" */
+
+static int PTRCALL
+PREFIX(scanLt)(const ENCODING *enc, const char *ptr, const char *end,
+ const char **nextTokPtr)
+{
+#ifdef XML_NS
+ int hadColon;
+#endif
+ REQUIRE_CHAR(enc, ptr, end);
+ switch (BYTE_TYPE(enc, ptr)) {
+ CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
+ case BT_EXCL:
+ ptr += MINBPC(enc);
+ REQUIRE_CHAR(enc, ptr, end);
+ switch (BYTE_TYPE(enc, ptr)) {
+ case BT_MINUS:
+ return PREFIX(scanComment)(enc, ptr + MINBPC(enc), end, nextTokPtr);
+ case BT_LSQB:
+ return PREFIX(scanCdataSection)(enc, ptr + MINBPC(enc),
+ end, nextTokPtr);
+ }
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ case BT_QUEST:
+ return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
+ case BT_SOL:
+ return PREFIX(scanEndTag)(enc, ptr + MINBPC(enc), end, nextTokPtr);
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+#ifdef XML_NS
+ hadColon = 0;
+#endif
+ /* we have a start-tag */
+ while (HAS_CHAR(enc, ptr, end)) {
+ switch (BYTE_TYPE(enc, ptr)) {
+ CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
+#ifdef XML_NS
+ case BT_COLON:
+ if (hadColon) {
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ hadColon = 1;
+ ptr += MINBPC(enc);
+ REQUIRE_CHAR(enc, ptr, end);
+ switch (BYTE_TYPE(enc, ptr)) {
+ CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ break;
+#endif
+ case BT_S: case BT_CR: case BT_LF:
+ {
+ ptr += MINBPC(enc);
+ while (HAS_CHAR(enc, ptr, end)) {
+ switch (BYTE_TYPE(enc, ptr)) {
+ CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
+ case BT_GT:
+ goto gt;
+ case BT_SOL:
+ goto sol;
+ case BT_S: case BT_CR: case BT_LF:
+ ptr += MINBPC(enc);
+ continue;
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ return PREFIX(scanAtts)(enc, ptr, end, nextTokPtr);
+ }
+ return XML_TOK_PARTIAL;
+ }
+ case BT_GT:
+ gt:
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_START_TAG_NO_ATTS;
+ case BT_SOL:
+ sol:
+ ptr += MINBPC(enc);
+ REQUIRE_CHAR(enc, ptr, end);
+ if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_EMPTY_ELEMENT_NO_ATTS;
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ }
+ return XML_TOK_PARTIAL;
+}
+
+static int PTRCALL
+PREFIX(contentTok)(const ENCODING *enc, const char *ptr, const char *end,
+ const char **nextTokPtr)
+{
+ if (ptr >= end)
+ return XML_TOK_NONE;
+ if (MINBPC(enc) > 1) {
+ size_t n = end - ptr;
+ if (n & (MINBPC(enc) - 1)) {
+ n &= ~(MINBPC(enc) - 1);
+ if (n == 0)
+ return XML_TOK_PARTIAL;
+ end = ptr + n;
+ }
+ }
+ switch (BYTE_TYPE(enc, ptr)) {
+ case BT_LT:
+ return PREFIX(scanLt)(enc, ptr + MINBPC(enc), end, nextTokPtr);
+ case BT_AMP:
+ return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
+ case BT_CR:
+ ptr += MINBPC(enc);
+ if (! HAS_CHAR(enc, ptr, end))
+ return XML_TOK_TRAILING_CR;
+ if (BYTE_TYPE(enc, ptr) == BT_LF)
+ ptr += MINBPC(enc);
+ *nextTokPtr = ptr;
+ return XML_TOK_DATA_NEWLINE;
+ case BT_LF:
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_DATA_NEWLINE;
+ case BT_RSQB:
+ ptr += MINBPC(enc);
+ if (! HAS_CHAR(enc, ptr, end))
+ return XML_TOK_TRAILING_RSQB;
+ if (!CHAR_MATCHES(enc, ptr, ASCII_RSQB))
+ break;
+ ptr += MINBPC(enc);
+ if (! HAS_CHAR(enc, ptr, end))
+ return XML_TOK_TRAILING_RSQB;
+ if (!CHAR_MATCHES(enc, ptr, ASCII_GT)) {
+ ptr -= MINBPC(enc);
+ break;
+ }
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ INVALID_CASES(ptr, nextTokPtr)
+ default:
+ ptr += MINBPC(enc);
+ break;
+ }
+ while (HAS_CHAR(enc, ptr, end)) {
+ switch (BYTE_TYPE(enc, ptr)) {
+#define LEAD_CASE(n) \
+ case BT_LEAD ## n: \
+ if (end - ptr < n || IS_INVALID_CHAR(enc, ptr, n)) { \
+ *nextTokPtr = ptr; \
+ return XML_TOK_DATA_CHARS; \
+ } \
+ ptr += n; \
+ break;
+ LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
+#undef LEAD_CASE
+ case BT_RSQB:
+ if (HAS_CHARS(enc, ptr, end, 2)) {
+ if (!CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_RSQB)) {
+ ptr += MINBPC(enc);
+ break;
+ }
+ if (HAS_CHARS(enc, ptr, end, 3)) {
+ if (!CHAR_MATCHES(enc, ptr + 2*MINBPC(enc), ASCII_GT)) {
+ ptr += MINBPC(enc);
+ break;
+ }
+ *nextTokPtr = ptr + 2*MINBPC(enc);
+ return XML_TOK_INVALID;
+ }
+ }
+ /* fall through */
+ case BT_AMP:
+ case BT_LT:
+ case BT_NONXML:
+ case BT_MALFORM:
+ case BT_TRAIL:
+ case BT_CR:
+ case BT_LF:
+ *nextTokPtr = ptr;
+ return XML_TOK_DATA_CHARS;
+ default:
+ ptr += MINBPC(enc);
+ break;
+ }
+ }
+ *nextTokPtr = ptr;
+ return XML_TOK_DATA_CHARS;
+}
+
+/* ptr points to character following "%" */
+
+static int PTRCALL
+PREFIX(scanPercent)(const ENCODING *enc, const char *ptr, const char *end,
+ const char **nextTokPtr)
+{
+ REQUIRE_CHAR(enc, ptr, end);
+ switch (BYTE_TYPE(enc, ptr)) {
+ CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
+ case BT_S: case BT_LF: case BT_CR: case BT_PERCNT:
+ *nextTokPtr = ptr;
+ return XML_TOK_PERCENT;
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ while (HAS_CHAR(enc, ptr, end)) {
+ switch (BYTE_TYPE(enc, ptr)) {
+ CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
+ case BT_SEMI:
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_PARAM_ENTITY_REF;
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ }
+ return XML_TOK_PARTIAL;
+}
+
+static int PTRCALL
+PREFIX(scanPoundName)(const ENCODING *enc, const char *ptr, const char *end,
+ const char **nextTokPtr)
+{
+ REQUIRE_CHAR(enc, ptr, end);
+ switch (BYTE_TYPE(enc, ptr)) {
+ CHECK_NMSTRT_CASES(enc, ptr, end, nextTokPtr)
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ while (HAS_CHAR(enc, ptr, end)) {
+ switch (BYTE_TYPE(enc, ptr)) {
+ CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
+ case BT_CR: case BT_LF: case BT_S:
+ case BT_RPAR: case BT_GT: case BT_PERCNT: case BT_VERBAR:
+ *nextTokPtr = ptr;
+ return XML_TOK_POUND_NAME;
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ }
+ return -XML_TOK_POUND_NAME;
+}
+
+static int PTRCALL
+PREFIX(scanLit)(int open, const ENCODING *enc,
+ const char *ptr, const char *end,
+ const char **nextTokPtr)
+{
+ while (HAS_CHAR(enc, ptr, end)) {
+ int t = BYTE_TYPE(enc, ptr);
+ switch (t) {
+ INVALID_CASES(ptr, nextTokPtr)
+ case BT_QUOT:
+ case BT_APOS:
+ ptr += MINBPC(enc);
+ if (t != open)
+ break;
+ if (! HAS_CHAR(enc, ptr, end))
+ return -XML_TOK_LITERAL;
+ *nextTokPtr = ptr;
+ switch (BYTE_TYPE(enc, ptr)) {
+ case BT_S: case BT_CR: case BT_LF:
+ case BT_GT: case BT_PERCNT: case BT_LSQB:
+ return XML_TOK_LITERAL;
+ default:
+ return XML_TOK_INVALID;
+ }
+ default:
+ ptr += MINBPC(enc);
+ break;
+ }
+ }
+ return XML_TOK_PARTIAL;
+}
+
+static int PTRCALL
+PREFIX(prologTok)(const ENCODING *enc, const char *ptr, const char *end,
+ const char **nextTokPtr)
+{
+ int tok;
+ if (ptr >= end)
+ return XML_TOK_NONE;
+ if (MINBPC(enc) > 1) {
+ size_t n = end - ptr;
+ if (n & (MINBPC(enc) - 1)) {
+ n &= ~(MINBPC(enc) - 1);
+ if (n == 0)
+ return XML_TOK_PARTIAL;
+ end = ptr + n;
+ }
+ }
+ switch (BYTE_TYPE(enc, ptr)) {
+ case BT_QUOT:
+ return PREFIX(scanLit)(BT_QUOT, enc, ptr + MINBPC(enc), end, nextTokPtr);
+ case BT_APOS:
+ return PREFIX(scanLit)(BT_APOS, enc, ptr + MINBPC(enc), end, nextTokPtr);
+ case BT_LT:
+ {
+ ptr += MINBPC(enc);
+ REQUIRE_CHAR(enc, ptr, end);
+ switch (BYTE_TYPE(enc, ptr)) {
+ case BT_EXCL:
+ return PREFIX(scanDecl)(enc, ptr + MINBPC(enc), end, nextTokPtr);
+ case BT_QUEST:
+ return PREFIX(scanPi)(enc, ptr + MINBPC(enc), end, nextTokPtr);
+ case BT_NMSTRT:
+ case BT_HEX:
+ case BT_NONASCII:
+ case BT_LEAD2:
+ case BT_LEAD3:
+ case BT_LEAD4:
+ *nextTokPtr = ptr - MINBPC(enc);
+ return XML_TOK_INSTANCE_START;
+ }
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ case BT_CR:
+ if (ptr + MINBPC(enc) == end) {
+ *nextTokPtr = end;
+ /* indicate that this might be part of a CR/LF pair */
+ return -XML_TOK_PROLOG_S;
+ }
+ /* fall through */
+ case BT_S: case BT_LF:
+ for (;;) {
+ ptr += MINBPC(enc);
+ if (! HAS_CHAR(enc, ptr, end))
+ break;
+ switch (BYTE_TYPE(enc, ptr)) {
+ case BT_S: case BT_LF:
+ break;
+ case BT_CR:
+ /* don't split CR/LF pair */
+ if (ptr + MINBPC(enc) != end)
+ break;
+ /* fall through */
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_PROLOG_S;
+ }
+ }
+ *nextTokPtr = ptr;
+ return XML_TOK_PROLOG_S;
+ case BT_PERCNT:
+ return PREFIX(scanPercent)(enc, ptr + MINBPC(enc), end, nextTokPtr);
+ case BT_COMMA:
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_COMMA;
+ case BT_LSQB:
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_OPEN_BRACKET;
+ case BT_RSQB:
+ ptr += MINBPC(enc);
+ if (! HAS_CHAR(enc, ptr, end))
+ return -XML_TOK_CLOSE_BRACKET;
+ if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
+ REQUIRE_CHARS(enc, ptr, end, 2);
+ if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_GT)) {
+ *nextTokPtr = ptr + 2*MINBPC(enc);
+ return XML_TOK_COND_SECT_CLOSE;
+ }
+ }
+ *nextTokPtr = ptr;
+ return XML_TOK_CLOSE_BRACKET;
+ case BT_LPAR:
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_OPEN_PAREN;
+ case BT_RPAR:
+ ptr += MINBPC(enc);
+ if (! HAS_CHAR(enc, ptr, end))
+ return -XML_TOK_CLOSE_PAREN;
+ switch (BYTE_TYPE(enc, ptr)) {
+ case BT_AST:
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_CLOSE_PAREN_ASTERISK;
+ case BT_QUEST:
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_CLOSE_PAREN_QUESTION;
+ case BT_PLUS:
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_CLOSE_PAREN_PLUS;
+ case BT_CR: case BT_LF: case BT_S:
+ case BT_GT: case BT_COMMA: case BT_VERBAR:
+ case BT_RPAR:
+ *nextTokPtr = ptr;
+ return XML_TOK_CLOSE_PAREN;
+ }
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ case BT_VERBAR:
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_OR;
+ case BT_GT:
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_DECL_CLOSE;
+ case BT_NUM:
+ return PREFIX(scanPoundName)(enc, ptr + MINBPC(enc), end, nextTokPtr);
+#define LEAD_CASE(n) \
+ case BT_LEAD ## n: \
+ if (end - ptr < n) \
+ return XML_TOK_PARTIAL_CHAR; \
+ if (IS_NMSTRT_CHAR(enc, ptr, n)) { \
+ ptr += n; \
+ tok = XML_TOK_NAME; \
+ break; \
+ } \
+ if (IS_NAME_CHAR(enc, ptr, n)) { \
+ ptr += n; \
+ tok = XML_TOK_NMTOKEN; \
+ break; \
+ } \
+ *nextTokPtr = ptr; \
+ return XML_TOK_INVALID;
+ LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
+#undef LEAD_CASE
+ case BT_NMSTRT:
+ case BT_HEX:
+ tok = XML_TOK_NAME;
+ ptr += MINBPC(enc);
+ break;
+ case BT_DIGIT:
+ case BT_NAME:
+ case BT_MINUS:
+#ifdef XML_NS
+ case BT_COLON:
+#endif
+ tok = XML_TOK_NMTOKEN;
+ ptr += MINBPC(enc);
+ break;
+ case BT_NONASCII:
+ if (IS_NMSTRT_CHAR_MINBPC(enc, ptr)) {
+ ptr += MINBPC(enc);
+ tok = XML_TOK_NAME;
+ break;
+ }
+ if (IS_NAME_CHAR_MINBPC(enc, ptr)) {
+ ptr += MINBPC(enc);
+ tok = XML_TOK_NMTOKEN;
+ break;
+ }
+ /* fall through */
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ while (HAS_CHAR(enc, ptr, end)) {
+ switch (BYTE_TYPE(enc, ptr)) {
+ CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
+ case BT_GT: case BT_RPAR: case BT_COMMA:
+ case BT_VERBAR: case BT_LSQB: case BT_PERCNT:
+ case BT_S: case BT_CR: case BT_LF:
+ *nextTokPtr = ptr;
+ return tok;
+#ifdef XML_NS
+ case BT_COLON:
+ ptr += MINBPC(enc);
+ switch (tok) {
+ case XML_TOK_NAME:
+ REQUIRE_CHAR(enc, ptr, end);
+ tok = XML_TOK_PREFIXED_NAME;
+ switch (BYTE_TYPE(enc, ptr)) {
+ CHECK_NAME_CASES(enc, ptr, end, nextTokPtr)
+ default:
+ tok = XML_TOK_NMTOKEN;
+ break;
+ }
+ break;
+ case XML_TOK_PREFIXED_NAME:
+ tok = XML_TOK_NMTOKEN;
+ break;
+ }
+ break;
+#endif
+ case BT_PLUS:
+ if (tok == XML_TOK_NMTOKEN) {
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_NAME_PLUS;
+ case BT_AST:
+ if (tok == XML_TOK_NMTOKEN) {
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_NAME_ASTERISK;
+ case BT_QUEST:
+ if (tok == XML_TOK_NMTOKEN) {
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_NAME_QUESTION;
+ default:
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ }
+ }
+ return -tok;
+}
+
+static int PTRCALL
+PREFIX(attributeValueTok)(const ENCODING *enc, const char *ptr,
+ const char *end, const char **nextTokPtr)
+{
+ const char *start;
+ if (ptr >= end)
+ return XML_TOK_NONE;
+ else if (! HAS_CHAR(enc, ptr, end))
+ return XML_TOK_PARTIAL;
+ start = ptr;
+ while (HAS_CHAR(enc, ptr, end)) {
+ switch (BYTE_TYPE(enc, ptr)) {
+#define LEAD_CASE(n) \
+ case BT_LEAD ## n: ptr += n; break;
+ LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
+#undef LEAD_CASE
+ case BT_AMP:
+ if (ptr == start)
+ return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
+ *nextTokPtr = ptr;
+ return XML_TOK_DATA_CHARS;
+ case BT_LT:
+ /* this is for inside entity references */
+ *nextTokPtr = ptr;
+ return XML_TOK_INVALID;
+ case BT_LF:
+ if (ptr == start) {
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_DATA_NEWLINE;
+ }
+ *nextTokPtr = ptr;
+ return XML_TOK_DATA_CHARS;
+ case BT_CR:
+ if (ptr == start) {
+ ptr += MINBPC(enc);
+ if (! HAS_CHAR(enc, ptr, end))
+ return XML_TOK_TRAILING_CR;
+ if (BYTE_TYPE(enc, ptr) == BT_LF)
+ ptr += MINBPC(enc);
+ *nextTokPtr = ptr;
+ return XML_TOK_DATA_NEWLINE;
+ }
+ *nextTokPtr = ptr;
+ return XML_TOK_DATA_CHARS;
+ case BT_S:
+ if (ptr == start) {
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_ATTRIBUTE_VALUE_S;
+ }
+ *nextTokPtr = ptr;
+ return XML_TOK_DATA_CHARS;
+ default:
+ ptr += MINBPC(enc);
+ break;
+ }
+ }
+ *nextTokPtr = ptr;
+ return XML_TOK_DATA_CHARS;
+}
+
+static int PTRCALL
+PREFIX(entityValueTok)(const ENCODING *enc, const char *ptr,
+ const char *end, const char **nextTokPtr)
+{
+ const char *start;
+ if (ptr >= end)
+ return XML_TOK_NONE;
+ else if (! HAS_CHAR(enc, ptr, end))
+ return XML_TOK_PARTIAL;
+ start = ptr;
+ while (HAS_CHAR(enc, ptr, end)) {
+ switch (BYTE_TYPE(enc, ptr)) {
+#define LEAD_CASE(n) \
+ case BT_LEAD ## n: ptr += n; break;
+ LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
+#undef LEAD_CASE
+ case BT_AMP:
+ if (ptr == start)
+ return PREFIX(scanRef)(enc, ptr + MINBPC(enc), end, nextTokPtr);
+ *nextTokPtr = ptr;
+ return XML_TOK_DATA_CHARS;
+ case BT_PERCNT:
+ if (ptr == start) {
+ int tok = PREFIX(scanPercent)(enc, ptr + MINBPC(enc),
+ end, nextTokPtr);
+ return (tok == XML_TOK_PERCENT) ? XML_TOK_INVALID : tok;
+ }
+ *nextTokPtr = ptr;
+ return XML_TOK_DATA_CHARS;
+ case BT_LF:
+ if (ptr == start) {
+ *nextTokPtr = ptr + MINBPC(enc);
+ return XML_TOK_DATA_NEWLINE;
+ }
+ *nextTokPtr = ptr;
+ return XML_TOK_DATA_CHARS;
+ case BT_CR:
+ if (ptr == start) {
+ ptr += MINBPC(enc);
+ if (! HAS_CHAR(enc, ptr, end))
+ return XML_TOK_TRAILING_CR;
+ if (BYTE_TYPE(enc, ptr) == BT_LF)
+ ptr += MINBPC(enc);
+ *nextTokPtr = ptr;
+ return XML_TOK_DATA_NEWLINE;
+ }
+ *nextTokPtr = ptr;
+ return XML_TOK_DATA_CHARS;
+ default:
+ ptr += MINBPC(enc);
+ break;
+ }
+ }
+ *nextTokPtr = ptr;
+ return XML_TOK_DATA_CHARS;
+}
+
+#ifdef XML_DTD
+
+static int PTRCALL
+PREFIX(ignoreSectionTok)(const ENCODING *enc, const char *ptr,
+ const char *end, const char **nextTokPtr)
+{
+ int level = 0;
+ if (MINBPC(enc) > 1) {
+ size_t n = end - ptr;
+ if (n & (MINBPC(enc) - 1)) {
+ n &= ~(MINBPC(enc) - 1);
+ end = ptr + n;
+ }
+ }
+ while (HAS_CHAR(enc, ptr, end)) {
+ switch (BYTE_TYPE(enc, ptr)) {
+ INVALID_CASES(ptr, nextTokPtr)
+ case BT_LT:
+ ptr += MINBPC(enc);
+ REQUIRE_CHAR(enc, ptr, end);
+ if (CHAR_MATCHES(enc, ptr, ASCII_EXCL)) {
+ ptr += MINBPC(enc);
+ REQUIRE_CHAR(enc, ptr, end);
+ if (CHAR_MATCHES(enc, ptr, ASCII_LSQB)) {
+ ++level;
+ ptr += MINBPC(enc);
+ }
+ }
+ break;
+ case BT_RSQB:
+ ptr += MINBPC(enc);
+ REQUIRE_CHAR(enc, ptr, end);
+ if (CHAR_MATCHES(enc, ptr, ASCII_RSQB)) {
+ ptr += MINBPC(enc);
+ REQUIRE_CHAR(enc, ptr, end);
+ if (CHAR_MATCHES(enc, ptr, ASCII_GT)) {
+ ptr += MINBPC(enc);
+ if (level == 0) {
+ *nextTokPtr = ptr;
+ return XML_TOK_IGNORE_SECT;
+ }
+ --level;
+ }
+ }
+ break;
+ default:
+ ptr += MINBPC(enc);
+ break;
+ }
+ }
+ return XML_TOK_PARTIAL;
+}
+
+#endif /* XML_DTD */
+
+static int PTRCALL
+PREFIX(isPublicId)(const ENCODING *enc, const char *ptr, const char *end,
+ const char **badPtr)
+{
+ ptr += MINBPC(enc);
+ end -= MINBPC(enc);
+ for (; HAS_CHAR(enc, ptr, end); ptr += MINBPC(enc)) {
+ switch (BYTE_TYPE(enc, ptr)) {
+ case BT_DIGIT:
+ case BT_HEX:
+ case BT_MINUS:
+ case BT_APOS:
+ case BT_LPAR:
+ case BT_RPAR:
+ case BT_PLUS:
+ case BT_COMMA:
+ case BT_SOL:
+ case BT_EQUALS:
+ case BT_QUEST:
+ case BT_CR:
+ case BT_LF:
+ case BT_SEMI:
+ case BT_EXCL:
+ case BT_AST:
+ case BT_PERCNT:
+ case BT_NUM:
+#ifdef XML_NS
+ case BT_COLON:
+#endif
+ break;
+ case BT_S:
+ if (CHAR_MATCHES(enc, ptr, ASCII_TAB)) {
+ *badPtr = ptr;
+ return 0;
+ }
+ break;
+ case BT_NAME:
+ case BT_NMSTRT:
+ if (!(BYTE_TO_ASCII(enc, ptr) & ~0x7f))
+ break;
+ default:
+ switch (BYTE_TO_ASCII(enc, ptr)) {
+ case 0x24: /* $ */
+ case 0x40: /* @ */
+ break;
+ default:
+ *badPtr = ptr;
+ return 0;
+ }
+ break;
+ }
+ }
+ return 1;
+}
+
+/* This must only be called for a well-formed start-tag or empty
+ element tag. Returns the number of attributes. Pointers to the
+ first attsMax attributes are stored in atts.
+*/
+
+static int PTRCALL
+PREFIX(getAtts)(const ENCODING *enc, const char *ptr,
+ int attsMax, ATTRIBUTE *atts)
+{
+ enum { other, inName, inValue } state = inName;
+ int nAtts = 0;
+ int open = 0; /* defined when state == inValue;
+ initialization just to shut up compilers */
+
+ for (ptr += MINBPC(enc);; ptr += MINBPC(enc)) {
+ switch (BYTE_TYPE(enc, ptr)) {
+#define START_NAME \
+ if (state == other) { \
+ if (nAtts < attsMax) { \
+ atts[nAtts].name = ptr; \
+ atts[nAtts].normalized = 1; \
+ } \
+ state = inName; \
+ }
+#define LEAD_CASE(n) \
+ case BT_LEAD ## n: START_NAME ptr += (n - MINBPC(enc)); break;
+ LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
+#undef LEAD_CASE
+ case BT_NONASCII:
+ case BT_NMSTRT:
+ case BT_HEX:
+ START_NAME
+ break;
+#undef START_NAME
+ case BT_QUOT:
+ if (state != inValue) {
+ if (nAtts < attsMax)
+ atts[nAtts].valuePtr = ptr + MINBPC(enc);
+ state = inValue;
+ open = BT_QUOT;
+ }
+ else if (open == BT_QUOT) {
+ state = other;
+ if (nAtts < attsMax)
+ atts[nAtts].valueEnd = ptr;
+ nAtts++;
+ }
+ break;
+ case BT_APOS:
+ if (state != inValue) {
+ if (nAtts < attsMax)
+ atts[nAtts].valuePtr = ptr + MINBPC(enc);
+ state = inValue;
+ open = BT_APOS;
+ }
+ else if (open == BT_APOS) {
+ state = other;
+ if (nAtts < attsMax)
+ atts[nAtts].valueEnd = ptr;
+ nAtts++;
+ }
+ break;
+ case BT_AMP:
+ if (nAtts < attsMax)
+ atts[nAtts].normalized = 0;
+ break;
+ case BT_S:
+ if (state == inName)
+ state = other;
+ else if (state == inValue
+ && nAtts < attsMax
+ && atts[nAtts].normalized
+ && (ptr == atts[nAtts].valuePtr
+ || BYTE_TO_ASCII(enc, ptr) != ASCII_SPACE
+ || BYTE_TO_ASCII(enc, ptr + MINBPC(enc)) == ASCII_SPACE
+ || BYTE_TYPE(enc, ptr + MINBPC(enc)) == open))
+ atts[nAtts].normalized = 0;
+ break;
+ case BT_CR: case BT_LF:
+ /* This case ensures that the first attribute name is counted
+ Apart from that we could just change state on the quote. */
+ if (state == inName)
+ state = other;
+ else if (state == inValue && nAtts < attsMax)
+ atts[nAtts].normalized = 0;
+ break;
+ case BT_GT:
+ case BT_SOL:
+ if (state != inValue)
+ return nAtts;
+ break;
+ default:
+ break;
+ }
+ }
+ /* not reached */
+}
+
+static int PTRFASTCALL
+PREFIX(charRefNumber)(const ENCODING *UNUSED_P(enc), const char *ptr)
+{
+ int result = 0;
+ /* skip &# */
+ ptr += 2*MINBPC(enc);
+ if (CHAR_MATCHES(enc, ptr, ASCII_x)) {
+ for (ptr += MINBPC(enc);
+ !CHAR_MATCHES(enc, ptr, ASCII_SEMI);
+ ptr += MINBPC(enc)) {
+ int c = BYTE_TO_ASCII(enc, ptr);
+ switch (c) {
+ case ASCII_0: case ASCII_1: case ASCII_2: case ASCII_3: case ASCII_4:
+ case ASCII_5: case ASCII_6: case ASCII_7: case ASCII_8: case ASCII_9:
+ result <<= 4;
+ result |= (c - ASCII_0);
+ break;
+ case ASCII_A: case ASCII_B: case ASCII_C:
+ case ASCII_D: case ASCII_E: case ASCII_F:
+ result <<= 4;
+ result += 10 + (c - ASCII_A);
+ break;
+ case ASCII_a: case ASCII_b: case ASCII_c:
+ case ASCII_d: case ASCII_e: case ASCII_f:
+ result <<= 4;
+ result += 10 + (c - ASCII_a);
+ break;
+ }
+ if (result >= 0x110000)
+ return -1;
+ }
+ }
+ else {
+ for (; !CHAR_MATCHES(enc, ptr, ASCII_SEMI); ptr += MINBPC(enc)) {
+ int c = BYTE_TO_ASCII(enc, ptr);
+ result *= 10;
+ result += (c - ASCII_0);
+ if (result >= 0x110000)
+ return -1;
+ }
+ }
+ return checkCharRefNumber(result);
+}
+
+static int PTRCALL
+PREFIX(predefinedEntityName)(const ENCODING *UNUSED_P(enc), const char *ptr,
+ const char *end)
+{
+ switch ((end - ptr)/MINBPC(enc)) {
+ case 2:
+ if (CHAR_MATCHES(enc, ptr + MINBPC(enc), ASCII_t)) {
+ switch (BYTE_TO_ASCII(enc, ptr)) {
+ case ASCII_l:
+ return ASCII_LT;
+ case ASCII_g:
+ return ASCII_GT;
+ }
+ }
+ break;
+ case 3:
+ if (CHAR_MATCHES(enc, ptr, ASCII_a)) {
+ ptr += MINBPC(enc);
+ if (CHAR_MATCHES(enc, ptr, ASCII_m)) {
+ ptr += MINBPC(enc);
+ if (CHAR_MATCHES(enc, ptr, ASCII_p))
+ return ASCII_AMP;
+ }
+ }
+ break;
+ case 4:
+ switch (BYTE_TO_ASCII(enc, ptr)) {
+ case ASCII_q:
+ ptr += MINBPC(enc);
+ if (CHAR_MATCHES(enc, ptr, ASCII_u)) {
+ ptr += MINBPC(enc);
+ if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
+ ptr += MINBPC(enc);
+ if (CHAR_MATCHES(enc, ptr, ASCII_t))
+ return ASCII_QUOT;
+ }
+ }
+ break;
+ case ASCII_a:
+ ptr += MINBPC(enc);
+ if (CHAR_MATCHES(enc, ptr, ASCII_p)) {
+ ptr += MINBPC(enc);
+ if (CHAR_MATCHES(enc, ptr, ASCII_o)) {
+ ptr += MINBPC(enc);
+ if (CHAR_MATCHES(enc, ptr, ASCII_s))
+ return ASCII_APOS;
+ }
+ }
+ break;
+ }
+ }
+ return 0;
+}
+
+static int PTRCALL
+PREFIX(sameName)(const ENCODING *enc, const char *ptr1, const char *ptr2)
+{
+ for (;;) {
+ switch (BYTE_TYPE(enc, ptr1)) {
+#define LEAD_CASE(n) \
+ case BT_LEAD ## n: \
+ if (*ptr1++ != *ptr2++) \
+ return 0;
+ LEAD_CASE(4) LEAD_CASE(3) LEAD_CASE(2)
+#undef LEAD_CASE
+ /* fall through */
+ if (*ptr1++ != *ptr2++)
+ return 0;
+ break;
+ case BT_NONASCII:
+ case BT_NMSTRT:
+#ifdef XML_NS
+ case BT_COLON:
+#endif
+ case BT_HEX:
+ case BT_DIGIT:
+ case BT_NAME:
+ case BT_MINUS:
+ if (*ptr2++ != *ptr1++)
+ return 0;
+ if (MINBPC(enc) > 1) {
+ if (*ptr2++ != *ptr1++)
+ return 0;
+ if (MINBPC(enc) > 2) {
+ if (*ptr2++ != *ptr1++)
+ return 0;
+ if (MINBPC(enc) > 3) {
+ if (*ptr2++ != *ptr1++)
+ return 0;
+ }
+ }
+ }
+ break;
+ default:
+ if (MINBPC(enc) == 1 && *ptr1 == *ptr2)
+ return 1;
+ switch (BYTE_TYPE(enc, ptr2)) {
+ case BT_LEAD2:
+ case BT_LEAD3:
+ case BT_LEAD4:
+ case BT_NONASCII:
+ case BT_NMSTRT:
+#ifdef XML_NS
+ case BT_COLON:
+#endif
+ case BT_HEX:
+ case BT_DIGIT:
+ case BT_NAME:
+ case BT_MINUS:
+ return 0;
+ default:
+ return 1;
+ }
+ }
+ }
+ /* not reached */
+}
+
+static int PTRCALL
+PREFIX(nameMatchesAscii)(const ENCODING *UNUSED_P(enc), const char *ptr1,
+ const char *end1, const char *ptr2)
+{
+ for (; *ptr2; ptr1 += MINBPC(enc), ptr2++) {
+ if (end1 - ptr1 < MINBPC(enc))
+ return 0;
+ if (!CHAR_MATCHES(enc, ptr1, *ptr2))
+ return 0;
+ }
+ return ptr1 == end1;
+}
+
+static int PTRFASTCALL
+PREFIX(nameLength)(const ENCODING *enc, const char *ptr)
+{
+ const char *start = ptr;
+ for (;;) {
+ switch (BYTE_TYPE(enc, ptr)) {
+#define LEAD_CASE(n) \
+ case BT_LEAD ## n: ptr += n; break;
+ LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
+#undef LEAD_CASE
+ case BT_NONASCII:
+ case BT_NMSTRT:
+#ifdef XML_NS
+ case BT_COLON:
+#endif
+ case BT_HEX:
+ case BT_DIGIT:
+ case BT_NAME:
+ case BT_MINUS:
+ ptr += MINBPC(enc);
+ break;
+ default:
+ return (int)(ptr - start);
+ }
+ }
+}
+
+static const char * PTRFASTCALL
+PREFIX(skipS)(const ENCODING *enc, const char *ptr)
+{
+ for (;;) {
+ switch (BYTE_TYPE(enc, ptr)) {
+ case BT_LF:
+ case BT_CR:
+ case BT_S:
+ ptr += MINBPC(enc);
+ break;
+ default:
+ return ptr;
+ }
+ }
+}
+
+static void PTRCALL
+PREFIX(updatePosition)(const ENCODING *enc,
+ const char *ptr,
+ const char *end,
+ POSITION *pos)
+{
+ while (HAS_CHAR(enc, ptr, end)) {
+ switch (BYTE_TYPE(enc, ptr)) {
+#define LEAD_CASE(n) \
+ case BT_LEAD ## n: \
+ ptr += n; \
+ break;
+ LEAD_CASE(2) LEAD_CASE(3) LEAD_CASE(4)
+#undef LEAD_CASE
+ case BT_LF:
+ pos->columnNumber = (XML_Size)-1;
+ pos->lineNumber++;
+ ptr += MINBPC(enc);
+ break;
+ case BT_CR:
+ pos->lineNumber++;
+ ptr += MINBPC(enc);
+ if (HAS_CHAR(enc, ptr, end) && BYTE_TYPE(enc, ptr) == BT_LF)
+ ptr += MINBPC(enc);
+ pos->columnNumber = (XML_Size)-1;
+ break;
+ default:
+ ptr += MINBPC(enc);
+ break;
+ }
+ pos->columnNumber++;
+ }
+}
+
+#undef DO_LEAD_CASE
+#undef MULTIBYTE_CASES
+#undef INVALID_CASES
+#undef CHECK_NAME_CASE
+#undef CHECK_NAME_CASES
+#undef CHECK_NMSTRT_CASE
+#undef CHECK_NMSTRT_CASES
+
+#endif /* XML_TOK_IMPL_C */
diff --git a/deps/EXPAT/expat/xmltok_ns.inc b/deps/EXPAT/expat/xmltok_ns.inc
new file mode 100644
index 000000000..c3b88fdf4
--- /dev/null
+++ b/deps/EXPAT/expat/xmltok_ns.inc
@@ -0,0 +1,115 @@
+/* Copyright (c) 1998, 1999 Thai Open Source Software Center Ltd
+ See the file COPYING for copying permission.
+*/
+
+/* This file is included! */
+#ifdef XML_TOK_NS_C
+
+const ENCODING *
+NS(XmlGetUtf8InternalEncoding)(void)
+{
+ return &ns(internal_utf8_encoding).enc;
+}
+
+const ENCODING *
+NS(XmlGetUtf16InternalEncoding)(void)
+{
+#if BYTEORDER == 1234
+ return &ns(internal_little2_encoding).enc;
+#elif BYTEORDER == 4321
+ return &ns(internal_big2_encoding).enc;
+#else
+ const short n = 1;
+ return (*(const char *)&n
+ ? &ns(internal_little2_encoding).enc
+ : &ns(internal_big2_encoding).enc);
+#endif
+}
+
+static const ENCODING * const NS(encodings)[] = {
+ &ns(latin1_encoding).enc,
+ &ns(ascii_encoding).enc,
+ &ns(utf8_encoding).enc,
+ &ns(big2_encoding).enc,
+ &ns(big2_encoding).enc,
+ &ns(little2_encoding).enc,
+ &ns(utf8_encoding).enc /* NO_ENC */
+};
+
+static int PTRCALL
+NS(initScanProlog)(const ENCODING *enc, const char *ptr, const char *end,
+ const char **nextTokPtr)
+{
+ return initScan(NS(encodings), (const INIT_ENCODING *)enc,
+ XML_PROLOG_STATE, ptr, end, nextTokPtr);
+}
+
+static int PTRCALL
+NS(initScanContent)(const ENCODING *enc, const char *ptr, const char *end,
+ const char **nextTokPtr)
+{
+ return initScan(NS(encodings), (const INIT_ENCODING *)enc,
+ XML_CONTENT_STATE, ptr, end, nextTokPtr);
+}
+
+int
+NS(XmlInitEncoding)(INIT_ENCODING *p, const ENCODING **encPtr,
+ const char *name)
+{
+ int i = getEncodingIndex(name);
+ if (i == UNKNOWN_ENC)
+ return 0;
+ SET_INIT_ENC_INDEX(p, i);
+ p->initEnc.scanners[XML_PROLOG_STATE] = NS(initScanProlog);
+ p->initEnc.scanners[XML_CONTENT_STATE] = NS(initScanContent);
+ p->initEnc.updatePosition = initUpdatePosition;
+ p->encPtr = encPtr;
+ *encPtr = &(p->initEnc);
+ return 1;
+}
+
+static const ENCODING *
+NS(findEncoding)(const ENCODING *enc, const char *ptr, const char *end)
+{
+#define ENCODING_MAX 128
+ char buf[ENCODING_MAX];
+ char *p = buf;
+ int i;
+ XmlUtf8Convert(enc, &ptr, end, &p, p + ENCODING_MAX - 1);
+ if (ptr != end)
+ return 0;
+ *p = 0;
+ if (streqci(buf, KW_UTF_16) && enc->minBytesPerChar == 2)
+ return enc;
+ i = getEncodingIndex(buf);
+ if (i == UNKNOWN_ENC)
+ return 0;
+ return NS(encodings)[i];
+}
+
+int
+NS(XmlParseXmlDecl)(int isGeneralTextEntity,
+ const ENCODING *enc,
+ const char *ptr,
+ const char *end,
+ const char **badPtr,
+ const char **versionPtr,
+ const char **versionEndPtr,
+ const char **encodingName,
+ const ENCODING **encoding,
+ int *standalone)
+{
+ return doParseXmlDecl(NS(findEncoding),
+ isGeneralTextEntity,
+ enc,
+ ptr,
+ end,
+ badPtr,
+ versionPtr,
+ versionEndPtr,
+ encodingName,
+ encoding,
+ standalone);
+}
+
+#endif /* XML_TOK_NS_C */
diff --git a/deps/GLEW/GLEW.cmake b/deps/GLEW/GLEW.cmake
index fcbdcd20c..5916ce7eb 100644
--- a/deps/GLEW/GLEW.cmake
+++ b/deps/GLEW/GLEW.cmake
@@ -1,4 +1,5 @@
# We have to check for OpenGL to compile GLEW
+set(OpenGL_GL_PREFERENCE "LEGACY") # to prevent a nasty warning by cmake
find_package(OpenGL QUIET REQUIRED)
prusaslicer_add_cmake_project(
diff --git a/deps/GMP/GMP.cmake b/deps/GMP/GMP.cmake
index 08b286891..a7fe19355 100644
--- a/deps/GMP/GMP.cmake
+++ b/deps/GMP/GMP.cmake
@@ -19,15 +19,18 @@ if (MSVC)
else ()
set(_gmp_ccflags "-O2 -DNDEBUG -fPIC -DPIC -Wall -Wmissing-prototypes -Wpointer-arith -pedantic -fomit-frame-pointer -fno-common")
set(_gmp_build_tgt "${CMAKE_SYSTEM_PROCESSOR}")
- if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm")
- set(_gmp_ccflags "${_gmp_ccflags} -march=armv7-a") # Works on RPi-4
- set(_gmp_build_tgt armv7)
- endif()
if (APPLE)
+ if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm")
+ set(_gmp_build_tgt aarch64)
+ endif()
set(_gmp_ccflags "${_gmp_ccflags} -mmacosx-version-min=${DEP_OSX_TARGET}")
set(_gmp_build_tgt "--build=${_gmp_build_tgt}-apple-darwin")
elseif(CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ if (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm")
+ set(_gmp_ccflags "${_gmp_ccflags} -march=armv7-a") # Works on RPi-4
+ set(_gmp_build_tgt armv7)
+ endif()
set(_gmp_build_tgt "--build=${_gmp_build_tgt}-pc-linux-gnu")
else ()
set(_gmp_build_tgt "") # let it guess
@@ -35,7 +38,7 @@ else ()
ExternalProject_Add(dep_GMP
# URL https://gmplib.org/download/gmp/gmp-6.1.2.tar.bz2
- URL https://gmplib.org/download/gmp/gmp-6.2.0.tar.lz
+ URL https://gmplib.org/download/gmp/gmp-6.2.1.tar.bz2
BUILD_IN_SOURCE ON
CONFIGURE_COMMAND env "CFLAGS=${_gmp_ccflags}" "CXXFLAGS=${_gmp_ccflags}" ./configure --enable-shared=no --enable-cxx=yes --enable-static=yes "--prefix=${DESTDIR}/usr/local" ${_gmp_build_tgt}
BUILD_COMMAND make -j
diff --git a/deps/OpenCSG/OpenCSG.cmake b/deps/OpenCSG/OpenCSG.cmake
index d9de5e152..fda74cd45 100644
--- a/deps/OpenCSG/OpenCSG.cmake
+++ b/deps/OpenCSG/OpenCSG.cmake
@@ -6,8 +6,8 @@ prusaslicer_add_cmake_project(OpenCSG
DEPENDS dep_GLEW
)
-if (TARGET dep_ZLIB)
- add_dependencies(dep_OpenCSG dep_ZLIB)
+if (TARGET ${ZLIB_PKG})
+ add_dependencies(dep_OpenCSG ${ZLIB_PKG})
endif()
if (MSVC)
diff --git a/deps/PNG/PNG.cmake b/deps/PNG/PNG.cmake
new file mode 100644
index 000000000..e07afec6d
--- /dev/null
+++ b/deps/PNG/PNG.cmake
@@ -0,0 +1,23 @@
+if (APPLE)
+ # Only disable NEON extension for Apple ARM builds, leave it enabled for Raspberry PI.
+ set(_disable_neon_extension "-DPNG_ARM_NEON=off")
+else ()
+ set(_disable_neon_extension "")
+endif ()
+
+prusaslicer_add_cmake_project(PNG
+ GIT_REPOSITORY https://github.com/glennrp/libpng.git
+ GIT_TAG v1.6.35
+ DEPENDS ${ZLIB_PKG}
+ CMAKE_ARGS
+ -DPNG_SHARED=OFF
+ -DPNG_STATIC=ON
+ -DPNG_PREFIX=prusaslicer_
+ -DPNG_TESTS=OFF
+ -DDISABLE_DEPENDENCY_TRACKING=OFF
+ ${_disable_neon_extension}
+)
+
+if (MSVC)
+ add_debug_dep(dep_PNG)
+endif ()
diff --git a/deps/deps-linux.cmake b/deps/deps-linux.cmake
index 9050a0701..420638d2f 100644
--- a/deps/deps-linux.cmake
+++ b/deps/deps-linux.cmake
@@ -3,6 +3,14 @@ set(DEP_CMAKE_OPTS "-DCMAKE_POSITION_INDEPENDENT_CODE=ON")
include("deps-unix-common.cmake")
+# Some Linuxes may have very old libpng, so it's best to bundle it instead of relying on the system version.
+# find_package(PNG QUIET)
+# if (NOT PNG_FOUND)
+# message(WARNING "No PNG dev package found in system, building static library. You should install the system package.")
+# endif ()
+
+#TODO UDEV
+
ExternalProject_Add(dep_boost
EXCLUDE_FROM_ALL 1
URL "https://dl.bintray.com/boostorg/release/1.70.0/source/boost_1_70_0.tar.gz"
@@ -55,7 +63,12 @@ ExternalProject_Add(dep_libcurl
--enable-versioned-symbols
--enable-threaded-resolver
--with-random=/dev/urandom
- --with-ca-bundle=/etc/ssl/certs/ca-certificates.crt
+
+ # CA root certificate paths will be set for openssl at runtime.
+ --without-ca-bundle
+ --without-ca-path
+ --with-ca-fallback # to look for the ssl backend's ca store
+
--disable-ldap
--disable-ldaps
--disable-manual
@@ -67,7 +80,6 @@ ExternalProject_Add(dep_libcurl
--disable-smb
--disable-smtp
--disable-gopher
- --disable-crypto-auth
--without-gssapi
--without-libpsl
--without-libidn2
@@ -88,39 +100,4 @@ ExternalProject_Add(dep_libcurl
INSTALL_COMMAND make install "DESTDIR=${DESTDIR}"
)
-if (DEP_WX_STABLE)
- set(DEP_WX_TAG "v3.0.4")
-else ()
- set(DEP_WX_TAG "v3.1.1-patched")
-endif()
-
-ExternalProject_Add(dep_wxwidgets
- EXCLUDE_FROM_ALL 1
- GIT_REPOSITORY "https://github.com/prusa3d/wxWidgets"
- GIT_TAG "${DEP_WX_TAG}"
- BUILD_IN_SOURCE 1
- # PATCH_COMMAND "${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_SOURCE_DIR}/wxwidgets-pngprefix.h" src/png/pngprefix.h
- CONFIGURE_COMMAND ./configure
- "--prefix=${DESTDIR}/usr/local"
- --disable-shared
- --with-gtk=2
- --with-opengl
- --enable-unicode
- --enable-graphics_ctx
- --with-regex=builtin
- --with-libpng=builtin
- --with-libxpm=builtin
- --with-libjpeg=builtin
- --with-libtiff=builtin
- --with-zlib
- --with-expat=builtin
- --disable-precomp-headers
- --enable-debug_info
- --enable-debug_gdb
- --disable-debug
- --disable-debug_flag
- BUILD_COMMAND make "-j${NPROC}" && make -C locale allmo
- INSTALL_COMMAND make install
-)
-
add_dependencies(dep_openvdb dep_boost)
diff --git a/deps/deps-macos.cmake b/deps/deps-macos.cmake
index 17300b247..f985cc561 100644
--- a/deps/deps-macos.cmake
+++ b/deps/deps-macos.cmake
@@ -9,6 +9,8 @@ set(DEP_CMAKE_OPTS
"-DCMAKE_OSX_DEPLOYMENT_TARGET=${DEP_OSX_TARGET}"
"-DCMAKE_CXX_FLAGS=${DEP_WERRORS_SDK}"
"-DCMAKE_C_FLAGS=${DEP_WERRORS_SDK}"
+ "-DCMAKE_FIND_FRAMEWORK=LAST"
+ "-DCMAKE_FIND_APPBUNDLE=LAST"
)
include("deps-unix-common.cmake")
@@ -65,7 +67,6 @@ ExternalProject_Add(dep_libcurl
--disable-smb
--disable-smtp
--disable-gopher
- --disable-crypto-auth
--without-gssapi
--without-libpsl
--without-libidn2
@@ -86,30 +87,4 @@ ExternalProject_Add(dep_libcurl
INSTALL_COMMAND make install "DESTDIR=${DESTDIR}"
)
-ExternalProject_Add(dep_wxwidgets
- EXCLUDE_FROM_ALL 1
- GIT_REPOSITORY "https://github.com/prusa3d/wxWidgets"
- GIT_TAG v3.1.3-patched
- BUILD_IN_SOURCE 1
-# PATCH_COMMAND "${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_SOURCE_DIR}/wxwidgets-pngprefix.h" src/png/pngprefix.h
- CONFIGURE_COMMAND env "CXXFLAGS=${DEP_WERRORS_SDK}" "CFLAGS=${DEP_WERRORS_SDK}" ./configure
- "--prefix=${DESTDIR}/usr/local"
- --disable-shared
- --with-osx_cocoa
- --with-macosx-sdk=${CMAKE_OSX_SYSROOT}
- "--with-macosx-version-min=${DEP_OSX_TARGET}"
- --with-opengl
- --with-regex=builtin
- --with-libpng=builtin
- --with-libxpm=builtin
- --with-libjpeg=builtin
- --with-libtiff=builtin
- --with-zlib
- --with-expat=builtin
- --disable-debug
- --disable-debug_flag
- BUILD_COMMAND make "-j${NPROC}" && PATH=/usr/local/opt/gettext/bin/:$ENV{PATH} make -C locale allmo
- INSTALL_COMMAND make install
-)
-
add_dependencies(dep_openvdb dep_boost) \ No newline at end of file
diff --git a/deps/deps-mingw.cmake b/deps/deps-mingw.cmake
index bfe5f9fe4..89b7e2b43 100644
--- a/deps/deps-mingw.cmake
+++ b/deps/deps-mingw.cmake
@@ -57,20 +57,4 @@ ExternalProject_Add(dep_libcurl
-DCURL_DISABLE_GOPHER=ON
-DCMAKE_INSTALL_PREFIX=${DESTDIR}/usr/local
${DEP_CMAKE_OPTS}
-)
-
-ExternalProject_Add(dep_wxwidgets
- EXCLUDE_FROM_ALL 1
- GIT_REPOSITORY "https://github.com/prusa3d/wxWidgets"
- GIT_TAG v3.1.1-patched
-# URL "https://github.com/wxWidgets/wxWidgets/releases/download/v3.1.1/wxWidgets-3.1.1.tar.bz2"
-# URL_HASH SHA256=c925dfe17e8f8b09eb7ea9bfdcfcc13696a3e14e92750effd839f5e10726159e
-# PATCH_COMMAND "${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_SOURCE_DIR}\\wxwidgets-pngprefix.h" src\\png\\pngprefix.h
- CMAKE_ARGS
- -DBUILD_SHARED_LIBS=OFF
- -DwxUSE_LIBPNG=builtin
- -DwxUSE_ZLIB=builtin
- -DwxUSE_OPENGL=ON
- -DCMAKE_INSTALL_PREFIX=${DESTDIR}/usr/local
- ${DEP_CMAKE_OPTS}
) \ No newline at end of file
diff --git a/deps/deps-unix-common.cmake b/deps/deps-unix-common.cmake
index 3f3a70c6a..46c9f8864 100644
--- a/deps/deps-unix-common.cmake
+++ b/deps/deps-unix-common.cmake
@@ -9,9 +9,15 @@ endif ()
find_package(ZLIB QUIET)
if (NOT ZLIB_FOUND)
- include(ZLIB/ZLIB.cmake)
+ message(WARNING "No ZLIB dev package found in system, building static library. You should install the system package.")
endif ()
+# TODO Evaluate expat modifications in the bundled version and test with system versions in various distros and OSX SDKs
+# find_package(EXPAT QUIET)
+# if (NOT EXPAT_FOUND)
+# message(WARNING "No EXPAT dev package found in system, building static library. Consider installing the system package.")
+# endif ()
+
ExternalProject_Add(dep_tbb
EXCLUDE_FROM_ALL 1
URL "https://github.com/wjakob/tbb/archive/a0dc9bf76d0120f917b641ed095360448cabc85b.tar.gz"
diff --git a/deps/deps-windows.cmake b/deps/deps-windows.cmake
index 600168c1a..ac93b4932 100644
--- a/deps/deps-windows.cmake
+++ b/deps/deps-windows.cmake
@@ -35,8 +35,6 @@ else ()
set(DEP_PLATFORM "x64")
endif ()
-
-
if (${DEP_DEBUG})
set(DEP_BOOST_DEBUG "debug")
else ()
@@ -149,38 +147,6 @@ ExternalProject_Add(dep_nlopt
add_debug_dep(dep_nlopt)
-include(ZLIB/ZLIB.cmake)
-# ExternalProject_Add(dep_zlib
-# EXCLUDE_FROM_ALL 1
-# URL "https://zlib.net/zlib-1.2.11.tar.xz"
-# URL_HASH SHA256=4ff941449631ace0d4d203e3483be9dbc9da454084111f97ea0a2114e19bf066
-# CMAKE_GENERATOR "${DEP_MSVC_GEN}"
-# CMAKE_GENERATOR_PLATFORM "${DEP_PLATFORM}"
-# CMAKE_ARGS
-# -DSKIP_INSTALL_FILES=ON # Prevent installation of man pages et al.
-# "-DINSTALL_BIN_DIR=${CMAKE_CURRENT_BINARY_DIR}\\fallout" # I found no better way of preventing zlib from creating & installing DLLs :-/
-# -DCMAKE_POSITION_INDEPENDENT_CODE=ON
-# "-DCMAKE_INSTALL_PREFIX:PATH=${DESTDIR}\\usr\\local"
-# BUILD_COMMAND msbuild /m /P:Configuration=Release INSTALL.vcxproj
-# INSTALL_COMMAND ""
-# )
-
-add_debug_dep(dep_ZLIB)
-
-# The following steps are unfortunately needed to remove the _static suffix on libraries
-# ExternalProject_Add_Step(dep_zlib fix_static
-# DEPENDEES install
-# COMMAND "${CMAKE_COMMAND}" -E rename zlibstatic.lib zlib.lib
-# WORKING_DIRECTORY "${DESTDIR}\\usr\\local\\lib\\"
-# )
-# if (${DEP_DEBUG})
-# ExternalProject_Add_Step(dep_zlib fix_static_debug
-# DEPENDEES install
-# COMMAND "${CMAKE_COMMAND}" -E rename zlibstaticd.lib zlibd.lib
-# WORKING_DIRECTORY "${DESTDIR}\\usr\\local\\lib\\"
-# )
-# endif ()
-
if (${DEPS_BITS} EQUAL 32)
set(DEP_LIBCURL_TARGET "x86")
else ()
@@ -243,36 +209,12 @@ endif ()
find_package(Git REQUIRED)
-ExternalProject_Add(dep_wxwidgets
- EXCLUDE_FROM_ALL 1
- GIT_REPOSITORY "https://github.com/prusa3d/wxWidgets"
- GIT_TAG v3.1.1-patched
-# URL "https://github.com/wxWidgets/wxWidgets/releases/download/v3.1.1/wxWidgets-3.1.1.tar.bz2"
-# URL_HASH SHA256=c925dfe17e8f8b09eb7ea9bfdcfcc13696a3e14e92750effd839f5e10726159e
- BUILD_IN_SOURCE 1
-# PATCH_COMMAND "${CMAKE_COMMAND}" -E copy "${CMAKE_CURRENT_SOURCE_DIR}\\wxwidgets-pngprefix.h" src\\png\\pngprefix.h
- CONFIGURE_COMMAND ""
- BUILD_COMMAND cd build\\msw && nmake /f makefile.vc BUILD=release SHARED=0 UNICODE=1 USE_GUI=1 "${DEP_WXWIDGETS_TARGET}"
- INSTALL_COMMAND "${CMAKE_COMMAND}" -E copy_directory include "${DESTDIR}\\usr\\local\\include"
- && "${CMAKE_COMMAND}" -E copy_directory "lib\\${DEP_WXWIDGETS_LIBDIR}" "${DESTDIR}\\usr\\local\\lib\\${DEP_WXWIDGETS_LIBDIR}"
-)
-if (${DEP_DEBUG})
- ExternalProject_Get_Property(dep_wxwidgets SOURCE_DIR)
- ExternalProject_Add_Step(dep_wxwidgets build_debug
- DEPENDEES build
- DEPENDERS install
- COMMAND cd build\\msw && nmake /f makefile.vc BUILD=debug SHARED=0 UNICODE=1 USE_GUI=1 "${DEP_WXWIDGETS_TARGET}"
- WORKING_DIRECTORY "${SOURCE_DIR}"
- )
-endif ()
-
ExternalProject_Add(dep_blosc
EXCLUDE_FROM_ALL 1
#URL https://github.com/Blosc/c-blosc/archive/v1.17.0.zip
#URL_HASH SHA256=7463a1df566704f212263312717ab2c36b45d45cba6cd0dccebf91b2cc4b4da9
GIT_REPOSITORY https://github.com/Blosc/c-blosc.git
GIT_TAG e63775855294b50820ef44d1b157f4de1cc38d3e #v1.17.0
- DEPENDS dep_ZLIB
CMAKE_GENERATOR "${DEP_MSVC_GEN}"
CMAKE_GENERATOR_PLATFORM "${DEP_PLATFORM}"
CMAKE_ARGS
@@ -298,8 +240,7 @@ add_debug_dep(dep_blosc)
ExternalProject_Add(dep_openexr
EXCLUDE_FROM_ALL 1
GIT_REPOSITORY https://github.com/openexr/openexr.git
- GIT_TAG eae0e337c9f5117e78114fd05f7a415819df413a #v2.4.0
- DEPENDS dep_ZLIB
+ GIT_TAG eae0e337c9f5117e78114fd05f7a415819df413a #v2.4.0
CMAKE_GENERATOR "${DEP_MSVC_GEN}"
CMAKE_GENERATOR_PLATFORM "${DEP_PLATFORM}"
CMAKE_ARGS
@@ -352,4 +293,4 @@ if (${DEP_DEBUG})
COMMAND msbuild /m /P:Configuration=Debug INSTALL.vcxproj
WORKING_DIRECTORY "${BINARY_DIR}"
)
-endif ()
+endif () \ No newline at end of file
diff --git a/deps/wxWidgets/wxWidgets.cmake b/deps/wxWidgets/wxWidgets.cmake
new file mode 100644
index 000000000..ee38309a6
--- /dev/null
+++ b/deps/wxWidgets/wxWidgets.cmake
@@ -0,0 +1,44 @@
+if (APPLE AND ${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm")
+ # The new OSX 11 (Big Sur) is not compatible with wxWidgets 3.1.3.
+ # Let's use patched wxWidgets 3.1.4, even though it is not quite tested.
+ set(_wx_git_tag v3.1.4-patched)
+else ()
+ # Use the tested patched wxWidgets 3.1.3 everywhere else.
+ set(_wx_git_tag v3.1.3-patched)
+endif ()
+
+# set(_patch_command "")
+set(_wx_toolkit "")
+if(CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ set(_gtk_ver 2)
+ if (DEP_WX_GTK3)
+ set(_gtk_ver 3)
+ endif ()
+ set(_wx_toolkit "-DwxBUILD_TOOLKIT=gtk${_gtk_ver}")
+endif()
+
+prusaslicer_add_cmake_project(wxWidgets
+ GIT_REPOSITORY "https://github.com/prusa3d/wxWidgets"
+ GIT_TAG ${_wx_git_tag}
+ # PATCH_COMMAND "${_patch_command}"
+ DEPENDS ${PNG_PKG} ${ZLIB_PKG} ${EXPAT_PKG}
+ CMAKE_ARGS
+ -DwxBUILD_PRECOMP=ON
+ ${_wx_toolkit}
+ "-DCMAKE_DEBUG_POSTFIX:STRING="
+ -DwxBUILD_DEBUG_LEVEL=0
+ -DwxUSE_DETECT_SM=OFF
+ -DwxUSE_UNICODE=ON
+ -DwxUSE_OPENGL=ON
+ -DwxUSE_LIBPNG=sys
+ -DwxUSE_ZLIB=sys
+ -DwxUSE_REGEX=builtin
+ -DwxUSE_LIBXPM=builtin
+ -DwxUSE_LIBJPEG=builtin
+ -DwxUSE_LIBTIFF=builtin
+ -DwxUSE_EXPAT=sys
+)
+
+if (MSVC)
+ add_debug_dep(dep_wxWidgets)
+endif () \ No newline at end of file
diff --git a/doc/How to build - Linux et al.md b/doc/How to build - Linux et al.md
index 9206ae1ed..a8f2441be 100644
--- a/doc/How to build - Linux et al.md
+++ b/doc/How to build - Linux et al.md
@@ -56,6 +56,10 @@ This is done by passing this option to CMake:
Note that PrusaSlicer is tested with wxWidgets 3.0 somewhat sporadically and so there may be bugs in bleeding edge releases.
+When building on ubuntu 20.04 focal fossa, the package libwxgtk3.0-gtk3-dev needs to be installed instead of libwxgtk3.0-dev and you should use:
+
+ -DSLIC3R_WX_STABLE=1 -DSLIC3R_GTK=3
+
### Build variant
By default PrusaSlicer builds the release variant.
diff --git a/doc/How to build - Mac OS.md b/doc/How to build - Mac OS.md
index 082c560b7..bab40ea26 100644
--- a/doc/How to build - Mac OS.md
+++ b/doc/How to build - Mac OS.md
@@ -79,3 +79,29 @@ This is set in the property list file
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Info.plist
To remove the limitation, simply delete the key `MinimumSDKVersion` from that file.
+
+
+# TL; DR
+
+Works on a fresh installation of MacOS Catalina 10.15.6
+
+- Install [brew](https://brew.sh/):
+- Open Terminal
+
+- Enter:
+
+```brew install cmake git gettext
+brew update
+brew upgrade
+git clone https://github.com/prusa3d/PrusaSlicer/
+cd PrusaSlicer/deps
+mkdir build
+cd build
+cmake ..
+make
+cd ../..
+mkdir build
+cd build
+cmake .. -DCMAKE_PREFIX_PATH="$PWD/../deps/build/destdir/usr/local"
+make
+src/prusa-slicer
diff --git a/doc/How to build - Windows.md b/doc/How to build - Windows.md
index c2dc31ce3..979ad9b62 100644
--- a/doc/How to build - Windows.md
+++ b/doc/How to build - Windows.md
@@ -124,45 +124,33 @@ intermediate files, which are not handled correctly by either `b2.exe` or possib
# Noob guide (step by step)
-Install Visual Studio Community 2019 from
-visualstudio.microsoft.com/vs/
-Select all workload options for C++
+- Install Visual Studio Community 2019 from [visualstudio.microsoft.com/vs/](https://visualstudio.microsoft.com/vs/)
+- Select all workload options for C++
+- Install git for Windows from [gitforwindows.org](https://gitforwindows.org/)
+ - download and run the exe accepting all defaults
+- Download `PrusaSlicer-master.zip` from github
+ - This example will use the directory c:\PrusaSlicer and unzipped to `c:\PrusaSlicer\PrusaSlicer-master\` so this will be the prefix for all the steps. Substitute your as required prefix.
+- Go to the Windows Start Menu and Click on "Visual Studio 2019" folder, then select the ->"x64 Native Tools Command Prompt" to open a command window
-Install git for Windows from
-gitforwindows.org
-download and run the exe accepting all defaults
+ cd c:\PrusaSlicer\PrusaSlicer-master\deps
+ mkdir build
+ cd build
+ cmake .. -G "Visual Studio 16 2019" -DDESTDIR="c:\PrusaSlicer\PrusaSlicer-master"
+ msbuild /m ALL_BUILD.vcxproj // This took 13.5 minutes on the following machine: core I7-7700K @ 4.2Ghz with 32GB main memory and 20min on an average laptop
+ cd c:\PrusaSlicer\PrusaSlicer-master\
+ mkdir build
+ cd build
+ cmake .. -G "Visual Studio 16 2019" -DCMAKE_PREFIX_PATH="c:\PrusaSlicer\PrusaSlicer-master\usr\local"
-download PrusaSlicer-master.zip from github
-I downloaded this to c:\PrusaSlicer and unzipped to c:\PrusaSlicer\PrusaSlicer-master\ so this will be my prefix for all my steps. Substitute your prefix.
+- Open Visual Studio for c++ development (VS asks this the first time you start it)
-Go to the Windows Start Menu and Click on "Visual Studio 2019" folder, then select the ->"x64 Native Tools Command Prompt" to open a command window
+`Open->Project/Solution` or `File->Open->Project/Solution` (depending on which dialog comes up first)
-cd c:\PrusaSlicer\PrusaSlicer-master\deps
+- Click on `c:\PrusaSlicer\PrusaSlicer-master\build\PrusaSlicer.sln`
-mkdir build
+`Debug->Start Debugging` or `Debug->Start Without debugging`
-cd build
+- PrusaSlicer should start.
+- You're up and running!
-cmake .. -G "Visual Studio 16 2019" -DDESTDIR="c:\PrusaSlicer\PrusaSlicer-master"
-
-msbuild /m ALL_BUILD.vcxproj // This took 13.5 minutes on my machine: core I7-7700K @ 4.2Ghz with 32GB main memory and 20min on a average laptop
-
-cd c:\PrusaSlicer\PrusaSlicer-master\
-
-mkdir build
-
-cd build
-
-cmake .. -G "Visual Studio 16 2019" -DCMAKE_PREFIX_PATH="c:\PrusaSlicer\PrusaSlicer-master\usr\local"
-
-open Visual Studio for c++ development (VS asks this the first time you start it)
-
-Open->Project/Solution or File->Open->Project/Solution (depending on which dialog comes up first)
-
-click on c:\PrusaSlicer\PrusaSlicer-master\build\PrusaSlicer.sln
-
-Debug->Start Debugging or Debug->Start Without debugging
-PrusaSlicer should start. You're up and running!
-
-
-note: Thanks to @douggorgen for the original guide, as an answer for a issue
+Note: Thanks to @douggorgen for the original guide, as an answer for a issue
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component type="desktop">
+ <id>com.prusa3d.PrusaSlicer</id>
+ <launchable type="desktop-id">com.prusa3d.PrusaSlicer.desktop</launchable>
+ <provides>
+ <id>prusa-slicer.desktop</id>
+ </provides>
+ <name>PrusaSlicer</name>
+ <summary>Powerful 3D printing slicer optimized for Prusa printers</summary>
+ <metadata_license>0BSD</metadata_license>
+ <project_license>AGPL-3.0-only</project_license>
+ <description>
+ <p>
+ 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.
+ </p>
+ <p>
+ PrusaSlicer is based on Slic3r by Alessandro Ranelucci and the RepRap community.
+ </p>
+ <p>
+ What are some of PrusaSlicer's main features?
+ </p>
+ <ul>
+ <li>multi-platform (Linux/Mac/Win) and packaged as standalone-app with no dependencies required</li>
+ <li>complete command-line interface to use it with no GUI</li>
+ <li>multi-material (multiple extruders) object printing</li>
+ <li>multiple G-code flavors supported (RepRap, Makerbot, Mach3, Machinekit etc.)</li>
+ <li>ability to plate multiple objects having distinct print settings</li>
+ <li>multithread processing</li>
+ <li>STL auto-repair (tolerance for broken models)</li>
+ <li>wide automated unit testing</li>
+ </ul>
+ </description>
+ <url type="homepage">https://www.prusa3d.com/prusaslicer/</url>
+ <url type="help">https://help.prusa3d.com</url>
+ <url type="bugtracker">https://github.com/prusa3d/PrusaSlicer/issues</url>
+ <screenshots>
+ <screenshot type="default">
+ <image>https://user-images.githubusercontent.com/590307/78981854-24d07580-7b21-11ea-9441-77923534a659.png</image>
+ </screenshot>
+ <screenshot>
+ <image>https://user-images.githubusercontent.com/590307/78981860-2863fc80-7b21-11ea-8c2d-8ff79ced2578.png</image>
+ </screenshot>
+ <screenshot>
+ <image>https://user-images.githubusercontent.com/590307/78981862-28fc9300-7b21-11ea-9b0d-d03e16b709d3.png</image>
+ </screenshot>
+ </screenshots>
+ <content_rating type="oars-1.1" />
+ <releases>
+ <release version="2.2.0" date="2020-03-21">
+ <description>
+ <p>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.</p>
+ </description>
+ </release>
+ </releases>
+</component>
diff --git a/resources/icons/Pmetal_001.png b/resources/icons/Pmetal_001.png
new file mode 100644
index 000000000..c848f839c
--- /dev/null
+++ b/resources/icons/Pmetal_001.png
Binary files differ
diff --git a/resources/icons/PrusaSlicer-gcodeviewer.ico b/resources/icons/PrusaSlicer-gcodeviewer.ico
new file mode 100644
index 000000000..1cd867e29
--- /dev/null
+++ b/resources/icons/PrusaSlicer-gcodeviewer.ico
Binary files differ
diff --git a/resources/icons/PrusaSlicer-gcodeviewer_128px.png b/resources/icons/PrusaSlicer-gcodeviewer_128px.png
new file mode 100644
index 000000000..475ddb68e
--- /dev/null
+++ b/resources/icons/PrusaSlicer-gcodeviewer_128px.png
Binary files differ
diff --git a/resources/icons/PrusaSlicer-gcodeviewer_192px.png b/resources/icons/PrusaSlicer-gcodeviewer_192px.png
new file mode 100644
index 000000000..2f3b03683
--- /dev/null
+++ b/resources/icons/PrusaSlicer-gcodeviewer_192px.png
Binary files differ
diff --git a/resources/icons/PrusaSlicer-gcodeviewer_32px.png b/resources/icons/PrusaSlicer-gcodeviewer_32px.png
new file mode 100644
index 000000000..eaba5e21d
--- /dev/null
+++ b/resources/icons/PrusaSlicer-gcodeviewer_32px.png
Binary files differ
diff --git a/resources/icons/add.svg b/resources/icons/add.svg
index 8a9b253de..37050d748 100644
--- a/resources/icons/add.svg
+++ b/resources/icons/add.svg
@@ -1,17 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
-<path fill="#FFFFFF" d="M87.29,22.62H34.71c-1.39,0-3.14,0.69-4.16,1.63L9.81,43.46c-1.05,0.98-1.82,2.73-1.82,4.16v54.31
- c0,1.9,1.55,3.45,3.45,3.45h55.17c1.4,0,3.15-0.7,4.16-1.67l12.41-11.83c0.69-0.66,0.72-1.75,0.06-2.44s-1.75-0.71-2.44-0.06
- L70.05,99.63v-53.2c0.26-0.19,0.51-0.39,0.72-0.61L87.3,28.29v33.12c0,0.35-0.02,0.64-0.04,0.85c-0.51,0.55-0.62,1.39-0.22,2.06
- c0.49,0.82,1.55,1.08,2.37,0.59l0.25-0.15c0.67-0.4,1.09-1.1,1.09-3.35V26.07C90.74,24.17,89.2,22.62,87.29,22.62z M11.44,47.62
- L11.44,47.62h55.17v54.31H11.44V47.62z M68.26,43.46c-0.33,0.35-1.18,0.71-1.65,0.71H14.12L32.9,26.78
- c0.37-0.35,1.31-0.71,1.82-0.71h49.94L68.26,43.46z"/>
-<path id="_x2B__1_" fill="#ED6B21" d="M110.57,82.1c0,0.95-0.78,1.72-1.72,1.72h-4.31c-0.95,0-1.72,0.78-1.72,1.72v4.31
- c0,0.95-0.78,1.72-1.72,1.72h-4.31c-0.95,0-1.72-0.78-1.72-1.72v-4.31c0-0.95-0.78-1.72-1.72-1.72h-4.31
- c-0.95,0-1.72-0.78-1.72-1.72v-4.31c0-0.95,0.78-1.72,1.72-1.72h4.31c0.95,0,1.72-0.78,1.72-1.72v-4.31c0-0.95,0.78-1.72,1.72-1.72
- h4.31c0.95,0,1.72,0.78,1.72,1.72v4.31c0,0.95,0.78,1.72,1.72,1.72h4.31c0.95,0,1.72,0.78,1.72,1.72V82.1z M120.05,79.95
- c0-11.65-9.47-21.12-21.12-21.12S77.81,68.3,77.81,79.95s9.47,21.12,21.12,21.12S120.05,91.59,120.05,79.95z M116.6,79.95
- c0,9.74-7.93,17.67-17.67,17.67s-17.67-7.93-17.67-17.67s7.93-17.67,17.67-17.67S116.6,70.2,116.6,79.95z"/>
+<g id="ADD">
+ <path fill="#FFFFFF" d="M72.3,117.5H10.5v-75h75v23.27c1.61-0.56,3.28-0.99,5-1.29V41.04l27-27V72.3c1.89,1.71,3.57,3.65,5,5.76V8
+ c0-0.05-0.01-0.1-0.02-0.15c0-0.06-0.01-0.11-0.02-0.17c-0.03-0.22-0.08-0.43-0.15-0.62c0,0,0-0.01,0-0.01c0,0,0,0,0,0
+ c-0.01-0.03-0.03-0.05-0.04-0.08c-0.05-0.11-0.11-0.21-0.17-0.31c-0.03-0.04-0.05-0.08-0.08-0.11c-0.06-0.08-0.13-0.16-0.2-0.24
+ c-0.03-0.03-0.06-0.07-0.09-0.1c-0.09-0.09-0.19-0.17-0.3-0.25c-0.01-0.01-0.02-0.02-0.04-0.03c-0.12-0.08-0.24-0.15-0.38-0.2
+ c-0.04-0.02-0.09-0.03-0.13-0.05c-0.1-0.04-0.2-0.07-0.3-0.09c-0.05-0.01-0.09-0.02-0.14-0.03c-0.15-0.03-0.3-0.05-0.45-0.05H48
+ c-0.57,0-1.12,0.19-1.56,0.55l-40,32c-0.03,0.03-0.06,0.06-0.09,0.09c-0.07,0.06-0.13,0.12-0.19,0.19
+ c-0.05,0.06-0.1,0.12-0.15,0.18c-0.05,0.07-0.09,0.13-0.14,0.2c-0.04,0.07-0.08,0.14-0.12,0.21c-0.03,0.07-0.07,0.15-0.09,0.22
+ c-0.03,0.08-0.05,0.16-0.07,0.24c-0.02,0.08-0.04,0.15-0.05,0.23c-0.01,0.09-0.02,0.18-0.03,0.27c0,0.04-0.01,0.08-0.01,0.13v80
+ c0,1.38,1.12,2.5,2.5,2.5h70.06C75.95,121.07,74.01,119.39,72.3,117.5z M48.88,10.5h65.09l-27,27H15.13L48.88,10.5z"/>
+ <g>
+ <path fill="#ED6B21" d="M96,69.5c-14.61,0-26.5,11.89-26.5,26.5s11.89,26.5,26.5,26.5s26.5-11.89,26.5-26.5S110.61,69.5,96,69.5z
+ M96,117.5c-11.86,0-21.5-9.64-21.5-21.5S84.14,74.5,96,74.5s21.5,9.64,21.5,21.5S107.86,117.5,96,117.5z"/>
+ <path fill="#ED6B21" d="M112,93.5H98.5V80c0-1.38-1.12-2.5-2.5-2.5s-2.5,1.12-2.5,2.5v13.5H80c-1.38,0-2.5,1.12-2.5,2.5
+ s1.12,2.5,2.5,2.5h13.5V112c0,1.38,1.12,2.5,2.5,2.5s2.5-1.12,2.5-2.5V98.5H112c1.38,0,2.5-1.12,2.5-2.5S113.38,93.5,112,93.5z"/>
+ </g>
+</g>
</svg>
diff --git a/resources/icons/arrange.svg b/resources/icons/arrange.svg
index 4f30e979e..62cf939e9 100644
--- a/resources/icons/arrange.svg
+++ b/resources/icons/arrange.svg
@@ -1,24 +1,23 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
-<g id="ARRANGE">
- <path fill="#FFFFFF" d="M113.85,14.27v99.36h-99.7V14.27H113.85 M115.85,8.27H12.15c-2.2,0-4,1.8-4,4v103.36c0,2.2,1.8,4,4,4h103.7
- c2.2,0,4-1.8,4-4V12.27C119.85,10.07,118.05,8.27,115.85,8.27L115.85,8.27z"/>
+<g id="arrange">
<g>
- <path fill="#ED6B21" d="M48.04,99.24c0,2.2-1.8,4-4,4H28.11c-2.2,0-4-1.8-4-4v-47c0-2.2,1.8-4,4-4h15.94c2.2,0,4,1.8,4,4
- L48.04,99.24L48.04,99.24z"/>
+ <path fill="#FFFFFF" d="M120,122.5H8c-1.38,0-2.5-1.12-2.5-2.5V8c0-1.38,1.12-2.5,2.5-2.5h112c1.38,0,2.5,1.12,2.5,2.5v112
+ C122.5,121.38,121.38,122.5,120,122.5z M10.5,117.5h107v-107h-107V117.5z"/>
</g>
<g>
- <path fill="#ED6B21" d="M28.11,40.38c-2.2,0-4-1.8-4-4v-7.72c0-2.2,1.8-4,4-4h15.94c2.2,0,4,1.8,4,4v7.72c0,2.2-1.8,4-4,4H28.11z"
- />
+ <path fill="#ED6B21" d="M104,58.5H24c-1.38,0-2.5-1.12-2.5-2.5V24c0-1.38,1.12-2.5,2.5-2.5h80c1.38,0,2.5,1.12,2.5,2.5v32
+ C106.5,57.38,105.38,58.5,104,58.5z M26.5,53.5h75v-27h-75V53.5z"/>
</g>
<g>
- <path fill="#ED6B21" d="M68,103.24c-2.2,0-4-1.8-4-4V83.67c0-2.2,1.8-4,4-4h31.89c2.2,0,4,1.8,4,4v15.57c0,2.2-1.8,4-4,4H68z"/>
+ <path fill="#ED6B21" d="M48,106.5H24c-1.38,0-2.5-1.12-2.5-2.5V72c0-1.38,1.12-2.5,2.5-2.5h24c1.38,0,2.5,1.12,2.5,2.5v32
+ C50.5,105.38,49.38,106.5,48,106.5z M26.5,101.5h19v-27h-19V101.5z"/>
</g>
<g>
- <path fill="#ED6B21" d="M103.89,59.95c0,2.2-1.8,4-4,4H68c-2.2,0-4-1.8-4-4V28.66c0-2.2,1.8-4,4-4h31.89c2.2,0,4,1.8,4,4V59.95z"
- />
+ <path fill="#ED6B21" d="M104,106.5H64c-1.38,0-2.5-1.12-2.5-2.5V72c0-1.38,1.12-2.5,2.5-2.5h40c1.38,0,2.5,1.12,2.5,2.5v32
+ C106.5,105.38,105.38,106.5,104,106.5z M66.5,101.5h35v-27h-35V101.5z"/>
</g>
</g>
</svg>
diff --git a/resources/icons/attention.svg b/resources/icons/attention.svg
new file mode 100644
index 000000000..934bd3b41
--- /dev/null
+++ b/resources/icons/attention.svg
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
+<g id="attention">
+ <path fill="#ED0000" d="M8,1.85l5.29,3.53V7v3.62L8,14.15l-5.29-3.53V7V5.38L8,1.85 M8,1L2,5v2v4l6,4l6-4V7V5L8,1L8,1z"/>
+
+ <path fill="none" stroke="#ED0000" stroke-linecap="round" stroke-width="3" d="M8 4 L8 8" />
+
+ <circle fill="#ED0000" cx="8" cy="12" r="1.5"/>
+</g>
+</svg>
diff --git a/resources/icons/cancel.svg b/resources/icons/cancel.svg
new file mode 100644
index 000000000..da44606a0
--- /dev/null
+++ b/resources/icons/cancel.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
+<g id="resin">
+ <rect x="4" y="7" fill="#ED6B21" width="8" height="8"/>
+ <path fill="none" stroke="#808080" stroke-linecap="round" stroke-miterlimit="10" d="M4.5,15h6.99c0.28,0,0.5-0.23,0.5-0.5V6
+ c0-1-2-1-2-2s0-1,0-1h1V1.5C11,1.23,10.77,1,10.5,1H5.5C5.23,1,5,1.23,5,1.5V3h1v1c0,1-2,1-2,2v8.5C4,14.77,4.23,15,4.5,15z"/>
+</g>
+</svg>
diff --git a/resources/icons/cog_.svg b/resources/icons/cog_.svg
new file mode 100644
index 000000000..94cab0a8e
--- /dev/null
+++ b/resources/icons/cog_.svg
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
+<g id="machine_x2B_cog">
+ <path fill="#FFFFFF" d="M13.77,6.39c-0.13-0.47-0.32-0.92-0.55-1.33l0.43-1.3l-1.41-1.41l-1.3,0.43c-0.42-0.23-0.86-0.42-1.33-0.55
+ L9,1H7L6.39,2.23C5.92,2.36,5.47,2.54,5.06,2.78l-1.3-0.43L2.34,3.76l0.43,1.3C2.54,5.47,2.36,5.92,2.23,6.39L1,7v2l1.23,0.61
+ c0.13,0.47,0.32,0.92,0.55,1.33l-0.43,1.3l1.41,1.41l1.3-0.43c0.42,0.23,0.86,0.42,1.33,0.55L7,15h2l0.61-1.23
+ c0.47-0.13,0.92-0.32,1.33-0.55l1.3,0.43l1.41-1.41l-0.43-1.3c0.23-0.42,0.42-0.86,0.55-1.33L15,9V7L13.77,6.39z M8,13
+ c-2.76,0-5-2.24-5-5s2.24-5,5-5s5,2.24,5,5S10.76,13,8,13z"/>
+ <path fill="#ED6B21" d="M11.3,7.08c-0.07-0.27-0.18-0.52-0.31-0.76l0.25-0.74l-0.81-0.81L9.68,5.01C9.45,4.88,9.19,4.78,8.92,4.7
+ L8.57,4H7.43L7.08,4.7C6.81,4.78,6.55,4.88,6.32,5.01L5.58,4.77L4.77,5.58l0.25,0.74C4.88,6.55,4.78,6.81,4.7,7.08L4,7.43v1.14
+ l0.7,0.35c0.07,0.27,0.18,0.52,0.31,0.76l-0.25,0.74l0.81,0.81l0.74-0.25c0.24,0.13,0.49,0.24,0.76,0.31L7.43,12h1.14l0.35-0.7
+ c0.27-0.07,0.52-0.18,0.76-0.31l0.74,0.25l0.81-0.81l-0.25-0.74c0.13-0.24,0.24-0.49,0.31-0.76L12,8.57V7.43L11.3,7.08z M8,10.86
+ c-1.58,0-2.86-1.28-2.86-2.86S6.42,5.14,8,5.14S10.86,6.42,10.86,8S9.58,10.86,8,10.86z"/>
+</g>
+</svg>
diff --git a/resources/icons/collapse.svg b/resources/icons/collapse.svg
new file mode 100644
index 000000000..c0d6f43d5
--- /dev/null
+++ b/resources/icons/collapse.svg
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
+<g id="cross">
+ <g><line fill="none" stroke="#ED6B21" stroke-width="1" stroke-linecap="round" stroke-miterlimit="10" x1="12" y1="1" x2="15" y2="4"/></g>
+ <g><line fill="none" stroke="#ED6B21" stroke-width="1" stroke-linecap="round" stroke-miterlimit="10" x1="12" y1="7" x2="15" y2="4"/></g>
+ <g><line fill="none" stroke="#ED6B21" stroke-width="1" stroke-linecap="round" stroke-miterlimit="10" x1="8" y1="1" x2="11" y2="4"/></g>
+ <g><line fill="none" stroke="#ED6B21" stroke-width="1" stroke-linecap="round" stroke-miterlimit="10" x1="8" y1="7" x2="11" y2="4"/></g>
+
+ <g><line fill="none" stroke="#ED6B21" stroke-width="1" stroke-linecap="round" stroke-miterlimit="10" x1="4" y1="9" x2="1" y2="12"/></g>
+ <g><line fill="none" stroke="#ED6B21" stroke-width="1" stroke-linecap="round" stroke-miterlimit="10" x1="4" y1="15" x2="1" y2="12"/></g>
+ <g><line fill="none" stroke="#ED6B21" stroke-width="1" stroke-linecap="round" stroke-miterlimit="10" x1="8" y1="9" x2="5" y2="12"/></g>
+ <g><line fill="none" stroke="#ED6B21" stroke-width="1" stroke-linecap="round" stroke-miterlimit="10" x1="8" y1="15" x2="5" y2="12"/></g>
+</g>
+</svg>
diff --git a/resources/icons/copy.svg b/resources/icons/copy.svg
index 9b8430dd7..345c2590b 100644
--- a/resources/icons/copy.svg
+++ b/resources/icons/copy.svg
@@ -1,37 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
<g id="copy">
<g>
- <path fill="#ED6B21" d="M115.76,51.2l-8.06-8.06c-2.47-2.47-6.97-4.34-10.47-4.34h-50.8c-4.2,0-7.62,3.42-7.62,7.62v66.04
- c0,4.2,3.42,7.62,7.62,7.62h66.04c4.2,0,7.62-3.42,7.62-7.62v-50.8C120.09,58.17,118.23,53.67,115.76,51.2z M111.42,54.04h-6.57
- v-6.57L111.42,54.04z M115.01,112.47c0,1.4-1.14,2.54-2.54,2.54H46.43c-1.4,0-2.54-1.14-2.54-2.54V46.42
- c0-1.4,1.14-2.54,2.54-2.54h50.8c0.74,0,1.63,0.18,2.54,0.46v12.24c0,1.4,1.14,2.54,2.54,2.54h12.24c0.28,0.91,0.46,1.8,0.46,2.54
- V112.47z"/>
- <path fill="#ED6B21" d="M53.97,59.13h35.72c1.4,0,2.54-1.14,2.54-2.54s-1.14-2.54-2.54-2.54H53.97c-1.4,0-2.54,1.14-2.54,2.54
- S52.56,59.13,53.97,59.13z"/>
- <path fill="#ED6B21" d="M104.93,69.29H53.97c-1.4,0-2.54,1.14-2.54,2.54s1.14,2.54,2.54,2.54h50.96c1.4,0,2.54-1.14,2.54-2.54
- S106.33,69.29,104.93,69.29z"/>
- <path fill="#ED6B21" d="M104.93,84.53H53.97c-1.4,0-2.54,1.14-2.54,2.54s1.14,2.54,2.54,2.54h50.96c1.4,0,2.54-1.14,2.54-2.54
- S106.33,84.53,104.93,84.53z"/>
- <path fill="#ED6B21" d="M104.93,99.77H53.97c-1.4,0-2.54,1.14-2.54,2.54s1.14,2.54,2.54,2.54h50.96c1.4,0,2.54-1.14,2.54-2.54
- S106.33,99.77,104.93,99.77z"/>
+ <path fill="#FFFFFF" d="M38.24,29.83l-15.49,8.94c-0.77,0.45-1.25,1.27-1.25,2.17v17.89c0,0.89,0.48,1.72,1.25,2.17l15.49,8.94
+ c0.39,0.22,0.82,0.33,1.25,0.33s0.86-0.11,1.25-0.33L48,65.75v-5.77l-8.51,4.91l-12.99-7.5v-15l12.99-7.5L48,39.8v-5.77
+ l-7.26-4.19C39.97,29.39,39.02,29.39,38.24,29.83z"/>
+ <path fill="#FFFFFF" d="M48,85.5H10.5v-75h43V24c0,1.38,1.12,2.5,2.5,2.5h13.5V32h5v-8c0-0.17-0.02-0.33-0.05-0.49
+ c-0.02-0.11-0.06-0.22-0.1-0.33c-0.02-0.05-0.02-0.09-0.04-0.14c-0.05-0.12-0.11-0.23-0.18-0.34c-0.02-0.03-0.03-0.06-0.05-0.09
+ c-0.09-0.14-0.2-0.26-0.31-0.38L57.77,6.23c-0.12-0.12-0.24-0.22-0.38-0.31c-0.04-0.02-0.08-0.04-0.11-0.06
+ c-0.1-0.06-0.2-0.12-0.32-0.17c-0.05-0.02-0.11-0.03-0.16-0.05c-0.1-0.03-0.2-0.07-0.3-0.09C56.33,5.52,56.17,5.5,56,5.5H8
+ C6.62,5.5,5.5,6.62,5.5,8v80c0,1.38,1.12,2.5,2.5,2.5h40V85.5z M58.5,14.04l7.46,7.46H58.5V14.04z"/>
</g>
<g>
- <path fill="#FFFFFF" d="M85.27,20.71l-8.06-8.06c-2.47-2.47-6.97-4.34-10.47-4.34h-50.8c-4.2,0-7.62,3.42-7.62,7.62v66.04
- c0,4.2,3.42,7.62,7.62,7.62h17.78c1.4,0,2.54-1.14,2.54-2.54s-1.14-2.54-2.54-2.54H15.94c-1.4,0-2.54-1.14-2.54-2.54V15.94
- c0-1.4,1.14-2.54,2.54-2.54h50.8c0.74,0,1.63,0.18,2.54,0.46V26.1c0,1.4,1.14,2.54,2.54,2.54h12.45c0.16,0.49,0.25,0.93,0.25,1.27
- v3.81c0,1.4,1.14,2.54,2.54,2.54c1.4,0,2.54-1.14,2.54-2.54v-3.81C89.61,27.14,87.75,23.19,85.27,20.71z M74.37,16.99l6.57,6.57
- h-6.57V16.99z"/>
- <path fill="#FFFFFF" d="M59.21,23.56H23.48c-1.4,0-2.54,1.14-2.54,2.54s1.14,2.54,2.54,2.54h35.72c1.4,0,2.54-1.14,2.54-2.54
- S60.61,23.56,59.21,23.56z"/>
- <path fill="#FFFFFF" d="M28.73,38.8h-5.24c-1.4,0-2.54,1.14-2.54,2.54s1.14,2.54,2.54,2.54h5.24c1.4,0,2.54-1.14,2.54-2.54
- S30.13,38.8,28.73,38.8z"/>
- <path fill="#FFFFFF" d="M28.73,54.04h-5.24c-1.4,0-2.54,1.14-2.54,2.54s1.14,2.54,2.54,2.54h5.24c1.4,0,2.54-1.14,2.54-2.54
- S30.13,54.04,28.73,54.04z"/>
- <path fill="#FFFFFF" d="M28.73,69.29h-5.24c-1.4,0-2.54,1.14-2.54,2.54s1.14,2.54,2.54,2.54h5.24c1.4,0,2.54-1.14,2.54-2.54
- S30.13,69.29,28.73,69.29z"/>
+ <path fill="#ED6B21" d="M122.45,55.51c-0.02-0.11-0.06-0.22-0.1-0.33c-0.02-0.05-0.02-0.09-0.04-0.14
+ c-0.05-0.12-0.11-0.23-0.18-0.34c-0.02-0.03-0.03-0.06-0.05-0.09c-0.09-0.14-0.2-0.26-0.31-0.38l-15.99-15.99
+ c-0.12-0.12-0.24-0.22-0.38-0.31c-0.04-0.02-0.08-0.04-0.11-0.06c-0.1-0.06-0.2-0.12-0.32-0.17c-0.05-0.02-0.11-0.03-0.16-0.05
+ c-0.1-0.03-0.2-0.07-0.3-0.09c-0.16-0.03-0.33-0.05-0.49-0.05H56c-1.38,0-2.5,1.12-2.5,2.5v80c0,1.38,1.12,2.5,2.5,2.5h64
+ c1.38,0,2.5-1.12,2.5-2.5V56C122.5,55.83,122.48,55.67,122.45,55.51z M106.5,46.04l7.46,7.46h-7.46V46.04z M58.5,117.5v-75h43V56
+ c0,1.38,1.12,2.5,2.5,2.5h13.5v59H58.5z"/>
+ <path fill="#ED6B21" d="M104.23,70.78l-15.49-8.94c-0.77-0.45-1.73-0.45-2.5,0l-15.49,8.94c-0.77,0.45-1.25,1.27-1.25,2.17v17.89
+ c0,0.89,0.48,1.72,1.25,2.17l15.49,8.94c0.39,0.22,0.82,0.33,1.25,0.33s0.86-0.11,1.25-0.33L104.23,93
+ c0.77-0.45,1.25-1.27,1.25-2.17V72.94C105.48,72.05,105.01,71.23,104.23,70.78z M100.48,89.39l-12.99,7.5l-12.99-7.5v-15
+ l12.99-7.5l12.99,7.5V89.39z"/>
</g>
</g>
</svg>
diff --git a/resources/icons/cross_focus_large.svg b/resources/icons/cross_focus_large.svg
new file mode 100644
index 000000000..c246f2bd9
--- /dev/null
+++ b/resources/icons/cross_focus_large.svg
@@ -0,0 +1,81 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
+ sodipodi:docname="cross_megafocus.svg"
+ xml:space="preserve"
+ enable-background="new 0 0 16 16"
+ viewBox="0 0 16 16"
+ y="0px"
+ x="0px"
+ id="Layer_1"
+ version="1.0"><metadata
+ id="metadata16"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs14" /><sodipodi:namedview
+ inkscape:current-layer="Layer_1"
+ inkscape:window-maximized="1"
+ inkscape:window-y="-9"
+ inkscape:window-x="-9"
+ inkscape:cy="8"
+ inkscape:cx="8"
+ inkscape:zoom="47.0625"
+ showgrid="false"
+ id="namedview12"
+ inkscape:window-height="1721"
+ inkscape:window-width="3200"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0"
+ guidetolerance="10"
+ gridtolerance="10"
+ objecttolerance="10"
+ borderopacity="1"
+ bordercolor="#666666"
+ pagecolor="#ffffff" />
+<g
+ style="opacity:1;fill-opacity:1"
+ transform="matrix(1.1,0,0,1.1,-0.8,-0.8)"
+ id="cross">
+ <g
+ style="fill-opacity:1"
+ id="g4">
+
+ <line
+ style="fill-opacity:1"
+ id="line2"
+ y2="14"
+ x2="2"
+ y1="2"
+ x1="14"
+ stroke-miterlimit="10"
+ stroke-linecap="round"
+ stroke-width="3"
+ stroke="#ed6b21"
+ fill="none" />
+ </g>
+ <g
+ style="fill-opacity:1"
+ id="g8">
+
+ <line
+ style="fill-opacity:1"
+ id="line6"
+ y2="14"
+ x2="14"
+ y1="2"
+ x1="2"
+ stroke-miterlimit="10"
+ stroke-linecap="round"
+ stroke-width="3"
+ stroke="#ed6b21"
+ fill="none" />
+ </g>
+</g>
+</svg>
diff --git a/resources/icons/delete_all.svg b/resources/icons/delete_all.svg
index 80e2e503c..dfa943812 100644
--- a/resources/icons/delete_all.svg
+++ b/resources/icons/delete_all.svg
@@ -1,31 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
-<g id="DELETE_ALL_1_">
- <path fill="#FFFFFF" d="M103.52,43.87l-13.31,69.97H37.79L24.48,43.87H103.52 M108.77,37.87H19.23c-1.1,0-1.83,0.88-1.63,1.96
- l14.84,78.04c0.21,1.08,1.27,1.96,2.37,1.96h58.36c1.1,0,2.17-0.88,2.37-1.96l14.84-78.04C110.6,38.75,109.87,37.87,108.77,37.87
- L108.77,37.87z"/>
+<g id="delete_x5F_all">
<g>
- <path fill="#ED6B21" d="M89.38,22.97c-1.1,0-2-0.9-2-2v-10.9c0-1.1-0.9-2-2-2H42.62c-1.1,0-2,0.9-2,2v10.9c0,1.1-0.9,2-2,2H19.23
- c-1.1,0-2,0.9-2,2v3.45c0,1.1,0.9,2,2,2h89.54c1.1,0,2-0.9,2-2v-3.45c0-1.1-0.9-2-2-2H89.38z M79.59,20.97c0,1.1-0.9,2-2,2H50.41
- c-1.1,0-2-0.9-2-2v-3.45c0-1.1,0.9-2,2-2h27.18c1.1,0,2,0.9,2,2V20.97z"/>
+ <path fill="#FFFFFF" d="M104,122.5H24c-1.29,0-2.37-0.99-2.49-2.27l-8-88c-0.06-0.7,0.17-1.39,0.64-1.91
+ C14.63,29.8,15.3,29.5,16,29.5h96c0.7,0,1.37,0.3,1.85,0.81c0.47,0.52,0.71,1.21,0.64,1.91l-8,88
+ C106.37,121.51,105.29,122.5,104,122.5z M26.28,117.5h75.43l7.55-83H18.74L26.28,117.5z"/>
</g>
<g>
- <path fill="#FFFFFF" d="M93.17,73.5H34.83c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h58.34c0.83,0,1.5,0.67,1.5,1.5
- S94,73.5,93.17,73.5z"/>
- </g>
- <g>
- <path fill="#FFFFFF" d="M90.14,89.45H37.96c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h52.18c0.83,0,1.5,0.67,1.5,1.5
- S90.97,89.45,90.14,89.45z"/>
- </g>
- <g>
- <path fill="#FFFFFF" d="M87.1,105.4H40.9c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h46.2c0.83,0,1.5,0.67,1.5,1.5
- S87.93,105.4,87.1,105.4z"/>
- </g>
- <g>
- <path fill="#FFFFFF" d="M96.2,57.56H31.8c-0.83,0-1.5-0.67-1.5-1.5s0.67-1.5,1.5-1.5h64.4c0.83,0,1.5,0.67,1.5,1.5
- S97.03,57.56,96.2,57.56z"/>
+ <path fill="#ED6B21" d="M112,26.5H16c-1.38,0-2.5-1.12-2.5-2.5v-8c0-1.38,1.12-2.5,2.5-2.5h29.5V8c0-1.38,1.12-2.5,2.5-2.5h32
+ c1.38,0,2.5,1.12,2.5,2.5v5.5H112c1.38,0,2.5,1.12,2.5,2.5v8C114.5,25.38,113.38,26.5,112,26.5z M18.5,21.5h91v-3H80
+ c-1.38,0-2.5-1.12-2.5-2.5v-5.5h-27V16c0,1.38-1.12,2.5-2.5,2.5H18.5V21.5z"/>
</g>
</g>
</svg>
diff --git a/resources/icons/dot_small.svg b/resources/icons/dot_small.svg
new file mode 100644
index 000000000..474142a57
--- /dev/null
+++ b/resources/icons/dot_small.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
+<g>
+ <circle fill="#808080" cx="8" cy="8" r="2"/>
+</g>
+</svg>
diff --git a/resources/icons/empty.svg b/resources/icons/empty.svg
new file mode 100644
index 000000000..b8ba0a651
--- /dev/null
+++ b/resources/icons/empty.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
+<g>
+ <circle fill="#808080" cx="8" cy="8" r="0"/>
+</g>
+</svg>
diff --git a/resources/icons/exit.svg b/resources/icons/exit.svg
new file mode 100644
index 000000000..30091b381
--- /dev/null
+++ b/resources/icons/exit.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="exit" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve">
+<path fill="#ED6B21" d="M63.4,45.46l-20-15c-2.51-1.88-6.06-1.37-7.94,1.13c-1.88,2.5-1.37,6.06,1.13,7.94l6.39,4.79H10
+ c-3.13,0-5.67,2.54-5.67,5.67s2.54,5.67,5.67,5.67h32.99l-6.39,4.8c-2.5,1.88-3.01,5.43-1.13,7.94c1.11,1.49,2.82,2.27,4.54,2.27
+ c1.18,0,2.38-0.37,3.4-1.13l20-15c1.43-1.07,2.27-2.75,2.27-4.54C65.67,48.22,64.83,46.54,63.4,45.46z"/>
+<g>
+ <path fill="#808080" d="M90,92.83H40c-1.57,0-2.83-1.27-2.83-2.83V80c0-1.57,1.27-2.83,2.83-2.83s2.83,1.27,2.83,2.83v7.17h44.33
+ V12.83H42.83V20c0,1.57-1.27,2.83-2.83,2.83s-2.83-1.27-2.83-2.83V10c0-1.57,1.27-2.83,2.83-2.83h50c1.57,0,2.83,1.27,2.83,2.83v80
+ C92.83,91.57,91.57,92.83,90,92.83z"/>
+</g>
+</svg>
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 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 25.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<g id="paint_x5F_supports">
+ <path fill="#ED6B21" d="M88,38.93c-0.83,0-1.5,0.67-1.5,1.5V70.5h-5V45.14c0-0.83-0.67-1.5-1.5-1.5s-1.5,0.67-1.5,1.5V70.5h-5V49.8
+ c0-0.83-0.67-1.5-1.5-1.5s-1.5,0.67-1.5,1.5v20.7h-5V53.84c0-0.83-0.67-1.5-1.5-1.5s-1.5,0.67-1.5,1.5V70.5h-5V49.8
+ c0-0.83-0.67-1.5-1.5-1.5s-1.5,0.67-1.5,1.5v20.7h-5V45.14c0-0.83-0.67-1.5-1.5-1.5s-1.5,0.67-1.5,1.5V70.5h-5V40.43
+ c0-0.83-0.67-1.5-1.5-1.5s-1.5,0.67-1.5,1.5V72v10.99c0,3.59,2.92,6.51,6.51,6.51h2.98c0.67,0.01,6.51,0.24,6.51,6.5v16
+ c0,3.29,1.99,9.5,9.5,9.5s9.5-6.21,9.5-9.5V96c0-6.26,5.84-6.49,6.5-6.5h3c3.59,0,6.5-2.92,6.5-6.5V72V40.43
+ C89.5,39.6,88.83,38.93,88,38.93z M86.5,83c0,1.93-1.57,3.5-3.5,3.5h-3c-3.29,0-9.5,1.99-9.5,9.5v15.99
+ c-0.01,0.67-0.24,6.51-6.5,6.51s-6.49-5.84-6.5-6.5V96c0-7.51-6.21-9.5-9.5-9.5h-2.99c-1.94,0-3.51-1.57-3.51-3.51V73.5h45V83z"/>
+ <g>
+ <path fill="#FFFFFF" d="M64,48.03c-0.26,0-0.52-0.07-0.75-0.2l-48-27.69c-0.46-0.27-0.75-0.76-0.75-1.3V8c0-0.83,0.67-1.5,1.5-1.5
+ s1.5,0.67,1.5,1.5v9.98L64,44.8l46.5-26.83V8c0-0.83,0.67-1.5,1.5-1.5s1.5,0.67,1.5,1.5v10.84c0,0.54-0.29,1.03-0.75,1.3
+ l-48,27.69C64.52,47.97,64.26,48.03,64,48.03z"/>
+ </g>
+</g>
+</svg>
diff --git a/resources/icons/instance_add.svg b/resources/icons/instance_add.svg
index 5ef492cfa..a466c51db 100644
--- a/resources/icons/instance_add.svg
+++ b/resources/icons/instance_add.svg
@@ -1,50 +1,46 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
-<g id="ADD_INSTANCE">
+<g id="instance_x5F_add">
<g>
- <path fill="#ED6B21" d="M88.01,57.95c0-1.1-0.9-2-2-2H74c-1.1,0-2-0.9-2-2V41.94c0-1.1-0.9-2-2-2H58c-1.1,0-2,0.9-2,2v12.01
- c0,1.1-0.9,2-2,2H41.99c-1.1,0-2,0.9-2,2v12.01c0,1.1,0.9,2,2,2H54c1.1,0,2,0.9,2,2v12.01c0,1.1,0.9,2,2,2h12c1.1,0,2-0.9,2-2
- V73.95c0-1.1,0.9-2,2-2h12.01c1.1,0,2-0.9,2-2V57.95z"/>
+ <path fill="#FFFFFF" d="M65.02,122.49c-1.36,0-2.47-1.09-2.5-2.45c-0.03-1.38,1.07-2.52,2.45-2.55c3.71-0.07,7.4-0.52,10.98-1.33
+ c1.34-0.31,2.69,0.54,2.99,1.88c0.31,1.35-0.54,2.69-1.88,2.99c-3.91,0.89-7.95,1.38-12,1.46
+ C65.05,122.49,65.04,122.49,65.02,122.49z M51.6,121.12c-0.18,0-0.37-0.02-0.55-0.06c-3.93-0.89-7.79-2.19-11.46-3.88
+ c-1.25-0.58-1.8-2.06-1.23-3.32c0.58-1.25,2.06-1.8,3.32-1.23c3.35,1.54,6.88,2.73,10.47,3.55c1.35,0.3,2.19,1.64,1.89,2.99
+ C53.78,120.33,52.74,121.12,51.6,121.12z M89.21,116.52c-0.91,0-1.79-0.5-2.23-1.37c-0.62-1.23-0.13-2.74,1.1-3.36
+ c3.29-1.66,6.42-3.67,9.3-5.98c1.08-0.86,2.65-0.69,3.51,0.39c0.86,1.08,0.69,2.65-0.39,3.51c-3.15,2.52-6.58,4.72-10.17,6.53
+ C89.97,116.44,89.58,116.52,89.21,116.52z M29.14,110.33c-0.55,0-1.1-0.18-1.56-0.54c-3.15-2.51-6.06-5.36-8.63-8.46
+ c-0.88-1.06-0.73-2.64,0.33-3.52c1.06-0.88,2.64-0.74,3.52,0.33c2.35,2.84,5.01,5.44,7.9,7.74c1.08,0.86,1.26,2.43,0.4,3.51
+ C30.61,110.01,29.88,110.33,29.14,110.33z M108.39,100.64c-0.53,0-1.07-0.17-1.52-0.52c-1.09-0.84-1.3-2.41-0.46-3.51
+ c2.25-2.93,4.21-6.09,5.81-9.41c0.6-1.24,2.1-1.77,3.34-1.17c1.24,0.6,1.77,2.09,1.17,3.34c-1.75,3.63-3.89,7.09-6.35,10.29
+ C109.88,100.31,109.14,100.64,108.39,100.64z M13.58,90.89c-0.93,0-1.82-0.52-2.25-1.41c-1.76-3.63-3.14-7.46-4.11-11.37
+ c-0.33-1.34,0.49-2.7,1.83-3.03c1.34-0.33,2.7,0.49,3.03,1.83c0.89,3.58,2.15,7.07,3.76,10.39c0.6,1.24,0.08,2.74-1.16,3.34
+ C14.32,90.81,13.94,90.89,13.58,90.89z M118.82,78.01c-0.17,0-0.34-0.02-0.51-0.05c-1.35-0.28-2.22-1.61-1.94-2.96
+ c0.75-3.59,1.13-7.29,1.13-11l0-0.23c0-1.38,1.12-2.5,2.5-2.5s2.5,1.12,2.5,2.5l0,0.2c0,4.08-0.42,8.12-1.24,12.05
+ C121.02,77.2,119.98,78.01,118.82,78.01z M8,66.62c-1.38,0-2.5-1.12-2.5-2.5V64c0-4.01,0.41-8.01,1.21-11.9
+ c0.28-1.35,1.6-2.22,2.95-1.94c1.35,0.28,2.22,1.6,1.94,2.95C10.87,56.67,10.5,60.33,10.5,64v0.12C10.5,65.5,9.38,66.62,8,66.62z
+ M118.33,52.88c-1.12,0-2.14-0.76-2.42-1.89c-0.89-3.57-2.17-7.07-3.78-10.39c-0.61-1.24-0.09-2.74,1.15-3.34
+ c1.24-0.6,2.74-0.09,3.34,1.15c1.77,3.63,3.16,7.45,4.14,11.36c0.33,1.34-0.48,2.7-1.82,3.03
+ C118.74,52.85,118.53,52.88,118.33,52.88z M13.48,42.32c-0.36,0-0.73-0.08-1.08-0.25c-1.25-0.6-1.77-2.09-1.17-3.34
+ c1.74-3.63,3.87-7.1,6.33-10.3c0.84-1.09,2.41-1.3,3.51-0.46c1.1,0.84,1.3,2.41,0.46,3.51c-2.25,2.93-4.2,6.1-5.79,9.42
+ C15.3,41.79,14.41,42.32,13.48,42.32z M107.05,30.68c-0.72,0-1.43-0.31-1.92-0.9c-2.36-2.84-5.03-5.44-7.92-7.73
+ c-1.08-0.86-1.26-2.43-0.41-3.51c0.86-1.08,2.43-1.26,3.51-0.41c3.16,2.5,6.07,5.34,8.65,8.44c0.88,1.06,0.74,2.64-0.32,3.52
+ C108.18,30.49,107.61,30.68,107.05,30.68z M28.97,22.81c-0.73,0-1.46-0.32-1.95-0.94c-0.86-1.08-0.69-2.65,0.38-3.51
+ c3.15-2.53,6.56-4.73,10.16-6.55c1.23-0.63,2.74-0.13,3.36,1.1c0.62,1.23,0.13,2.74-1.1,3.36c-3.28,1.67-6.41,3.69-9.29,6
+ C30.07,22.63,29.52,22.81,28.97,22.81z M87.25,15.54c-0.35,0-0.7-0.07-1.04-0.23c-3.36-1.53-6.88-2.72-10.48-3.52
+ c-1.35-0.3-2.2-1.64-1.89-2.99c0.3-1.35,1.64-2.2,2.99-1.89c3.94,0.88,7.79,2.18,11.46,3.86c1.26,0.57,1.81,2.06,1.23,3.31
+ C89.11,15,88.2,15.54,87.25,15.54z M51.37,11.93c-1.14,0-2.17-0.78-2.43-1.94c-0.31-1.35,0.53-2.69,1.88-3
+ c3.91-0.9,7.95-1.4,12-1.48c1.38-0.04,2.52,1.07,2.55,2.45c0.03,1.38-1.07,2.52-2.45,2.55c-3.7,0.07-7.39,0.53-10.97,1.35
+ C51.75,11.91,51.56,11.93,51.37,11.93z"/>
</g>
<g>
- <path fill="#FFFFFF" d="M67.06,119.73c-2.1,0-3.87-1.64-3.99-3.77c-0.13-2.21,1.56-4.1,3.76-4.23c1.85-0.11,3.71-0.32,5.53-0.64
- c2.17-0.38,4.25,1.07,4.63,3.25s-1.07,4.25-3.25,4.63c-2.12,0.37-4.29,0.63-6.45,0.75C67.22,119.73,67.14,119.73,67.06,119.73z
- M55.05,119.05c-0.23,0-0.46-0.02-0.69-0.06c-2.13-0.37-4.26-0.87-6.32-1.49c-2.12-0.63-3.32-2.86-2.69-4.98s2.86-3.32,4.98-2.69
- c1.77,0.53,3.59,0.96,5.41,1.27c2.18,0.38,3.63,2.45,3.25,4.63C58.65,117.68,56.96,119.05,55.05,119.05z M84.58,115.58
- c-1.55,0-3.02-0.9-3.67-2.41c-0.88-2.03,0.06-4.38,2.08-5.26c1.69-0.73,3.36-1.57,4.96-2.5c1.91-1.11,4.36-0.46,5.47,1.46
- c1.11,1.91,0.46,4.36-1.46,5.47c-1.87,1.08-3.82,2.07-5.8,2.92C85.65,115.47,85.11,115.58,84.58,115.58z M38.12,112.91
- c-0.68,0-1.37-0.17-2-0.54c-1.87-1.08-3.69-2.28-5.43-3.57c-1.77-1.32-2.14-3.82-0.82-5.6c1.32-1.77,3.82-2.14,5.6-0.82
- c1.49,1.11,3.05,2.13,4.65,3.06c1.91,1.1,2.57,3.55,1.47,5.46C40.84,112.2,39.5,112.91,38.12,112.91z M99.61,105.67
- c-1.06,0-2.12-0.42-2.91-1.25c-1.52-1.61-1.45-4.14,0.16-5.66c1.35-1.27,2.63-2.64,3.82-4.05c1.42-1.69,3.94-1.91,5.64-0.49
- c1.69,1.42,1.91,3.94,0.49,5.64c-1.39,1.65-2.88,3.24-4.45,4.72C101.58,105.3,100.59,105.67,99.61,105.67z M24.32,101.35
- c-1.14,0-2.27-0.48-3.06-1.42c-1.39-1.65-2.7-3.4-3.89-5.2c-1.22-1.84-0.71-4.32,1.13-5.54c1.84-1.22,4.32-0.71,5.54,1.13
- c1.02,1.54,2.14,3.04,3.33,4.46c1.42,1.69,1.21,4.21-0.48,5.64C26.14,101.04,25.23,101.35,24.32,101.35z M110.36,91.23
- c-0.6,0-1.22-0.14-1.79-0.43c-1.97-0.99-2.77-3.4-1.78-5.37c0.83-1.65,1.57-3.37,2.2-5.11c0.75-2.08,3.05-3.15,5.13-2.39
- c2.08,0.75,3.15,3.05,2.39,5.13c-0.74,2.03-1.61,4.04-2.58,5.97C113.24,90.42,111.83,91.23,110.36,91.23z M15.28,85.78
- c-1.63,0-3.16-1-3.76-2.63c-0.74-2.03-1.37-4.12-1.87-6.22c-0.51-2.15,0.82-4.31,2.97-4.82s4.31,0.82,4.82,2.97
- c0.43,1.8,0.97,3.59,1.6,5.32c0.76,2.08-0.31,4.37-2.38,5.13C16.2,85.7,15.73,85.78,15.28,85.78z M115.53,73.97
- c-0.15,0-0.31-0.01-0.46-0.03c-2.19-0.25-3.77-2.24-3.52-4.43c0.21-1.83,0.32-3.7,0.32-5.56v-0.21c0-2.21,1.79-4,4-4s4,1.79,4,4
- v0.15c0,2.22-0.12,4.4-0.37,6.53C119.26,72.47,117.53,73.97,115.53,73.97z M12.13,68.05c-2.21,0-4-1.79-4-4h4l-4-0.05
- c0-2.18,0.12-4.33,0.36-6.42c0.25-2.19,2.24-3.76,4.43-3.52c2.2,0.25,3.77,2.23,3.52,4.43c-0.21,1.8-0.31,3.64-0.31,5.46v0.1
- C16.13,66.26,14.34,68.05,12.13,68.05z M114.43,55.8c-1.81,0-3.45-1.23-3.89-3.07c-0.43-1.8-0.98-3.59-1.61-5.32
- c-0.76-2.07,0.3-4.37,2.37-5.14c2.07-0.76,4.37,0.3,5.14,2.37c0.74,2.02,1.38,4.11,1.88,6.22c0.52,2.15-0.81,4.31-2.95,4.82
- C115.06,55.76,114.74,55.8,114.43,55.8z M15.21,50.31c-0.45,0-0.91-0.08-1.36-0.24c-2.08-0.75-3.15-3.04-2.4-5.12
- c0.73-2.03,1.6-4.04,2.56-5.97C15,37,17.4,36.2,19.38,37.19c1.98,0.99,2.77,3.39,1.79,5.37c-0.83,1.65-1.57,3.37-2.19,5.11
- C18.38,49.3,16.85,50.31,15.21,50.31z M107.24,39.3c-1.29,0-2.57-0.63-3.34-1.79c-1.02-1.54-2.15-3.04-3.34-4.45
- c-1.43-1.69-1.22-4.21,0.47-5.64s4.21-1.22,5.64,0.47c1.39,1.65,2.71,3.39,3.9,5.19c1.22,1.84,0.72,4.32-1.12,5.54
- C108.77,39.08,108,39.3,107.24,39.3z M24.19,34.7c-0.91,0-1.82-0.31-2.56-0.93c-1.69-1.42-1.92-3.94-0.5-5.63
- c1.38-1.66,2.88-3.25,4.44-4.73c1.6-1.52,4.13-1.45,5.65,0.15s1.45,4.13-0.15,5.65c-1.34,1.27-2.62,2.64-3.81,4.06
- C26.47,34.21,25.33,34.7,24.19,34.7z M94.83,26.24c-0.83,0-1.66-0.26-2.38-0.79c-1.49-1.1-3.05-2.13-4.66-3.05
- c-1.92-1.1-2.58-3.54-1.48-5.46c1.1-1.91,3.54-2.58,5.46-1.48c1.87,1.07,3.7,2.27,5.44,3.56c1.78,1.31,2.15,3.82,0.83,5.6
- C97.27,25.68,96.06,26.24,94.83,26.24z M37.95,23.09c-1.38,0-2.72-0.71-3.46-1.99c-1.11-1.91-0.46-4.36,1.44-5.47
- c1.86-1.08,3.81-2.07,5.79-2.93c2.03-0.88,4.38,0.05,5.26,2.07c0.88,2.03-0.05,4.38-2.07,5.26c-1.69,0.74-3.36,1.58-4.96,2.51
- C39.33,22.92,38.64,23.09,37.95,23.09z M78.72,18.21c-0.38,0-0.76-0.05-1.13-0.17c-1.77-0.52-3.59-0.95-5.42-1.26
- c-2.18-0.37-3.64-2.44-3.26-4.62s2.45-3.64,4.62-3.26c2.13,0.37,4.26,0.86,6.33,1.47c2.12,0.63,3.33,2.85,2.7,4.97
- C82.04,17.08,80.45,18.21,78.72,18.21z M54.84,16.89c-1.9,0-3.59-1.36-3.93-3.3c-0.39-2.17,1.06-4.25,3.24-4.64
- c2.12-0.38,4.29-0.63,6.45-0.76c2.19-0.14,4.1,1.55,4.23,3.75c0.13,2.21-1.55,4.1-3.75,4.23c-1.85,0.11-3.71,0.33-5.52,0.66
- C55.31,16.87,55.07,16.89,54.84,16.89z"/>
+ <path fill="#ED6B21" d="M64,98.5c-1.38,0-2.5-1.12-2.5-2.5V32c0-1.38,1.12-2.5,2.5-2.5s2.5,1.12,2.5,2.5v64
+ C66.5,97.38,65.38,98.5,64,98.5z"/>
+ </g>
+ <g>
+ <path fill="#ED6B21" d="M96,66.5H32c-1.38,0-2.5-1.12-2.5-2.5s1.12-2.5,2.5-2.5h64c1.38,0,2.5,1.12,2.5,2.5S97.38,66.5,96,66.5z"
+ />
</g>
</g>
</svg>
diff --git a/resources/icons/instance_remove.svg b/resources/icons/instance_remove.svg
index 466752ea8..7f9b4f7e1 100644
--- a/resources/icons/instance_remove.svg
+++ b/resources/icons/instance_remove.svg
@@ -1,49 +1,42 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
-<g id="REMOVE_INSTANCE">
+<g id="instance_x5F_remove">
<g>
- <path fill="#ED6B21" d="M88.01,57.95c0-1.1-0.9-2-2-2H41.99c-1.1,0-2,0.9-2,2v12.01c0,1.1,0.9,2,2,2h44.02c1.1,0,2-0.9,2-2V57.95z
- "/>
+ <path fill="#FFFFFF" d="M65.02,122.49c-1.36,0-2.47-1.09-2.5-2.45c-0.03-1.38,1.07-2.52,2.45-2.55c3.71-0.07,7.4-0.52,10.98-1.33
+ c1.34-0.31,2.69,0.54,2.99,1.88c0.31,1.35-0.54,2.69-1.88,2.99c-3.91,0.89-7.95,1.38-12,1.46
+ C65.05,122.49,65.04,122.49,65.02,122.49z M51.6,121.12c-0.18,0-0.37-0.02-0.55-0.06c-3.93-0.89-7.79-2.19-11.46-3.88
+ c-1.25-0.58-1.8-2.06-1.23-3.32c0.58-1.25,2.06-1.8,3.32-1.23c3.35,1.54,6.88,2.73,10.47,3.55c1.35,0.3,2.19,1.64,1.89,2.99
+ C53.78,120.33,52.74,121.12,51.6,121.12z M89.21,116.52c-0.91,0-1.79-0.5-2.23-1.37c-0.62-1.23-0.13-2.74,1.1-3.36
+ c3.29-1.66,6.42-3.67,9.3-5.98c1.08-0.86,2.65-0.69,3.51,0.39c0.86,1.08,0.69,2.65-0.39,3.51c-3.15,2.52-6.58,4.72-10.17,6.53
+ C89.97,116.44,89.58,116.52,89.21,116.52z M29.14,110.33c-0.55,0-1.1-0.18-1.56-0.54c-3.15-2.51-6.06-5.36-8.63-8.46
+ c-0.88-1.06-0.73-2.64,0.33-3.52c1.06-0.88,2.64-0.74,3.52,0.33c2.35,2.84,5.01,5.44,7.9,7.74c1.08,0.86,1.26,2.43,0.4,3.51
+ C30.61,110.01,29.88,110.33,29.14,110.33z M108.39,100.64c-0.53,0-1.07-0.17-1.52-0.52c-1.09-0.84-1.3-2.41-0.46-3.51
+ c2.25-2.93,4.21-6.09,5.81-9.41c0.6-1.24,2.1-1.77,3.34-1.17c1.24,0.6,1.77,2.09,1.17,3.34c-1.75,3.63-3.89,7.09-6.35,10.29
+ C109.88,100.31,109.14,100.64,108.39,100.64z M13.58,90.89c-0.93,0-1.82-0.52-2.25-1.41c-1.76-3.63-3.14-7.46-4.11-11.37
+ c-0.33-1.34,0.49-2.7,1.83-3.03c1.34-0.33,2.7,0.49,3.03,1.83c0.89,3.58,2.15,7.07,3.76,10.39c0.6,1.24,0.08,2.74-1.16,3.34
+ C14.32,90.81,13.94,90.89,13.58,90.89z M118.82,78.01c-0.17,0-0.34-0.02-0.51-0.05c-1.35-0.28-2.22-1.61-1.94-2.96
+ c0.75-3.59,1.13-7.29,1.13-11l0-0.23c0-1.38,1.12-2.5,2.5-2.5s2.5,1.12,2.5,2.5l0,0.2c0,4.08-0.42,8.12-1.24,12.05
+ C121.02,77.2,119.98,78.01,118.82,78.01z M8,66.62c-1.38,0-2.5-1.12-2.5-2.5V64c0-4.01,0.41-8.01,1.21-11.9
+ c0.28-1.35,1.6-2.22,2.95-1.94c1.35,0.28,2.22,1.6,1.94,2.95C10.87,56.67,10.5,60.33,10.5,64v0.12C10.5,65.5,9.38,66.62,8,66.62z
+ M118.33,52.88c-1.12,0-2.14-0.76-2.42-1.89c-0.89-3.57-2.17-7.07-3.78-10.39c-0.61-1.24-0.09-2.74,1.15-3.34
+ c1.24-0.6,2.74-0.09,3.34,1.15c1.77,3.63,3.16,7.45,4.14,11.36c0.33,1.34-0.48,2.7-1.82,3.03
+ C118.74,52.85,118.53,52.88,118.33,52.88z M13.48,42.32c-0.36,0-0.73-0.08-1.08-0.25c-1.25-0.6-1.77-2.09-1.17-3.34
+ c1.74-3.63,3.87-7.1,6.33-10.3c0.84-1.09,2.41-1.3,3.51-0.46c1.1,0.84,1.3,2.41,0.46,3.51c-2.25,2.93-4.2,6.1-5.79,9.42
+ C15.3,41.79,14.41,42.32,13.48,42.32z M107.05,30.68c-0.72,0-1.43-0.31-1.92-0.9c-2.36-2.84-5.03-5.44-7.92-7.73
+ c-1.08-0.86-1.26-2.43-0.41-3.51c0.86-1.08,2.43-1.26,3.51-0.41c3.16,2.5,6.07,5.34,8.65,8.44c0.88,1.06,0.74,2.64-0.32,3.52
+ C108.18,30.49,107.61,30.68,107.05,30.68z M28.97,22.81c-0.73,0-1.46-0.32-1.95-0.94c-0.86-1.08-0.69-2.65,0.38-3.51
+ c3.15-2.53,6.56-4.73,10.16-6.55c1.23-0.63,2.74-0.13,3.36,1.1c0.62,1.23,0.13,2.74-1.1,3.36c-3.28,1.67-6.41,3.69-9.29,6
+ C30.07,22.63,29.52,22.81,28.97,22.81z M87.25,15.54c-0.35,0-0.7-0.07-1.04-0.23c-3.36-1.53-6.88-2.72-10.48-3.52
+ c-1.35-0.3-2.2-1.64-1.89-2.99c0.3-1.35,1.64-2.2,2.99-1.89c3.94,0.88,7.79,2.18,11.46,3.86c1.26,0.57,1.81,2.06,1.23,3.31
+ C89.11,15,88.2,15.54,87.25,15.54z M51.37,11.93c-1.14,0-2.17-0.78-2.43-1.94c-0.31-1.35,0.53-2.69,1.88-3
+ c3.91-0.9,7.95-1.4,12-1.48c1.38-0.04,2.52,1.07,2.55,2.45c0.03,1.38-1.07,2.52-2.45,2.55c-3.7,0.07-7.39,0.53-10.97,1.35
+ C51.75,11.91,51.56,11.93,51.37,11.93z"/>
</g>
<g>
- <path fill="#FFFFFF" d="M67.06,119.73c-2.1,0-3.87-1.64-3.99-3.77c-0.13-2.21,1.56-4.1,3.76-4.23c1.85-0.11,3.71-0.32,5.53-0.64
- c2.17-0.38,4.25,1.07,4.63,3.25s-1.07,4.25-3.25,4.63c-2.12,0.37-4.29,0.63-6.45,0.75C67.22,119.73,67.14,119.73,67.06,119.73z
- M55.05,119.05c-0.23,0-0.46-0.02-0.69-0.06c-2.13-0.37-4.26-0.87-6.32-1.49c-2.12-0.63-3.32-2.86-2.69-4.98s2.86-3.32,4.98-2.69
- c1.77,0.53,3.59,0.96,5.41,1.27c2.18,0.38,3.63,2.45,3.25,4.63C58.65,117.68,56.96,119.05,55.05,119.05z M84.58,115.58
- c-1.55,0-3.02-0.9-3.67-2.41c-0.88-2.03,0.06-4.38,2.08-5.26c1.69-0.73,3.36-1.57,4.96-2.5c1.91-1.11,4.36-0.46,5.47,1.46
- c1.11,1.91,0.46,4.36-1.46,5.47c-1.87,1.08-3.82,2.07-5.8,2.92C85.65,115.47,85.11,115.58,84.58,115.58z M38.12,112.91
- c-0.68,0-1.37-0.17-2-0.54c-1.87-1.08-3.69-2.28-5.43-3.57c-1.77-1.32-2.14-3.82-0.82-5.6c1.32-1.77,3.82-2.14,5.6-0.82
- c1.49,1.11,3.05,2.13,4.65,3.06c1.91,1.1,2.57,3.55,1.47,5.46C40.84,112.2,39.5,112.91,38.12,112.91z M99.61,105.67
- c-1.06,0-2.12-0.42-2.91-1.25c-1.52-1.61-1.45-4.14,0.16-5.66c1.35-1.27,2.63-2.64,3.82-4.05c1.42-1.69,3.94-1.91,5.64-0.49
- c1.69,1.42,1.91,3.94,0.49,5.64c-1.39,1.65-2.88,3.24-4.45,4.72C101.58,105.3,100.59,105.67,99.61,105.67z M24.32,101.35
- c-1.14,0-2.27-0.48-3.06-1.42c-1.39-1.65-2.7-3.4-3.89-5.2c-1.22-1.84-0.71-4.32,1.13-5.54c1.84-1.22,4.32-0.71,5.54,1.13
- c1.02,1.54,2.14,3.04,3.33,4.46c1.42,1.69,1.21,4.21-0.48,5.64C26.14,101.04,25.23,101.35,24.32,101.35z M110.36,91.23
- c-0.6,0-1.22-0.14-1.79-0.43c-1.97-0.99-2.77-3.4-1.78-5.37c0.83-1.65,1.57-3.37,2.2-5.11c0.75-2.08,3.05-3.15,5.13-2.39
- c2.08,0.75,3.15,3.05,2.39,5.13c-0.74,2.03-1.61,4.04-2.58,5.97C113.24,90.42,111.83,91.23,110.36,91.23z M15.28,85.78
- c-1.63,0-3.16-1-3.76-2.63c-0.74-2.03-1.37-4.12-1.87-6.22c-0.51-2.15,0.82-4.31,2.97-4.82s4.31,0.82,4.82,2.97
- c0.43,1.8,0.97,3.59,1.6,5.32c0.76,2.08-0.31,4.37-2.38,5.13C16.2,85.7,15.73,85.78,15.28,85.78z M115.53,73.97
- c-0.15,0-0.31-0.01-0.46-0.03c-2.19-0.25-3.77-2.24-3.52-4.43c0.21-1.83,0.32-3.7,0.32-5.56v-0.21c0-2.21,1.79-4,4-4s4,1.79,4,4
- v0.15c0,2.22-0.12,4.4-0.37,6.53C119.26,72.47,117.53,73.97,115.53,73.97z M12.13,68.05c-2.21,0-4-1.79-4-4h4l-4-0.05
- c0-2.18,0.12-4.33,0.36-6.42c0.25-2.19,2.24-3.76,4.43-3.52c2.2,0.25,3.77,2.23,3.52,4.43c-0.21,1.8-0.31,3.64-0.31,5.46v0.1
- C16.13,66.26,14.34,68.05,12.13,68.05z M114.43,55.8c-1.81,0-3.45-1.23-3.89-3.07c-0.43-1.8-0.98-3.59-1.61-5.32
- c-0.76-2.07,0.3-4.37,2.37-5.14c2.07-0.76,4.37,0.3,5.14,2.37c0.74,2.02,1.38,4.11,1.88,6.22c0.52,2.15-0.81,4.31-2.95,4.82
- C115.06,55.76,114.74,55.8,114.43,55.8z M15.21,50.31c-0.45,0-0.91-0.08-1.36-0.24c-2.08-0.75-3.15-3.04-2.4-5.12
- c0.73-2.03,1.6-4.04,2.56-5.97C15,37,17.4,36.2,19.38,37.19c1.98,0.99,2.77,3.39,1.79,5.37c-0.83,1.65-1.57,3.37-2.19,5.11
- C18.38,49.3,16.85,50.31,15.21,50.31z M107.24,39.3c-1.29,0-2.57-0.63-3.34-1.79c-1.02-1.54-2.15-3.04-3.34-4.45
- c-1.43-1.69-1.22-4.21,0.47-5.64s4.21-1.22,5.64,0.47c1.39,1.65,2.71,3.39,3.9,5.19c1.22,1.84,0.72,4.32-1.12,5.54
- C108.77,39.08,108,39.3,107.24,39.3z M24.19,34.7c-0.91,0-1.82-0.31-2.56-0.93c-1.69-1.42-1.92-3.94-0.5-5.63
- c1.38-1.66,2.88-3.25,4.44-4.73c1.6-1.52,4.13-1.45,5.65,0.15s1.45,4.13-0.15,5.65c-1.34,1.27-2.62,2.64-3.81,4.06
- C26.47,34.21,25.33,34.7,24.19,34.7z M94.83,26.24c-0.83,0-1.66-0.26-2.38-0.79c-1.49-1.1-3.05-2.13-4.66-3.05
- c-1.92-1.1-2.58-3.54-1.48-5.46c1.1-1.91,3.54-2.58,5.46-1.48c1.87,1.07,3.7,2.27,5.44,3.56c1.78,1.31,2.15,3.82,0.83,5.6
- C97.27,25.68,96.06,26.24,94.83,26.24z M37.95,23.09c-1.38,0-2.72-0.71-3.46-1.99c-1.11-1.91-0.46-4.36,1.44-5.47
- c1.86-1.08,3.81-2.07,5.79-2.93c2.03-0.88,4.38,0.05,5.26,2.07c0.88,2.03-0.05,4.38-2.07,5.26c-1.69,0.74-3.36,1.58-4.96,2.51
- C39.33,22.92,38.64,23.09,37.95,23.09z M78.72,18.21c-0.38,0-0.76-0.05-1.13-0.17c-1.77-0.52-3.59-0.95-5.42-1.26
- c-2.18-0.37-3.64-2.44-3.26-4.62s2.45-3.64,4.62-3.26c2.13,0.37,4.26,0.86,6.33,1.47c2.12,0.63,3.33,2.85,2.7,4.97
- C82.04,17.08,80.45,18.21,78.72,18.21z M54.84,16.89c-1.9,0-3.59-1.36-3.93-3.3c-0.39-2.17,1.06-4.25,3.24-4.64
- c2.12-0.38,4.29-0.63,6.45-0.76c2.19-0.14,4.1,1.55,4.23,3.75c0.13,2.21-1.55,4.1-3.75,4.23c-1.85,0.11-3.71,0.33-5.52,0.66
- C55.31,16.87,55.07,16.89,54.84,16.89z"/>
+ <path fill="#ED6B21" d="M96,66.5H32c-1.38,0-2.5-1.12-2.5-2.5s1.12-2.5,2.5-2.5h64c1.38,0,2.5,1.12,2.5,2.5S97.38,66.5,96,66.5z"
+ />
</g>
</g>
</svg>
diff --git a/resources/icons/ironing.svg b/resources/icons/ironing.svg
new file mode 100644
index 000000000..94917d6bf
--- /dev/null
+++ b/resources/icons/ironing.svg
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.2.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
+<g id="ironing">
+ <g>
+ <path fill="#ED6B21" d="M14,9.42H2c-0.39,0-0.71-0.32-0.71-0.71C1.29,7.08,2.07,4,5,4h8c0.33,0,0.61,0.22,0.69,0.54l1,4
+ c0.05,0.21,0,0.44-0.13,0.61C14.42,9.32,14.22,9.42,14,9.42z M2.77,8h10.32l-0.65-2.58H5C3.39,5.42,2.91,7.03,2.77,8z"/>
+ </g>
+ <g>
+ <path fill="#ED6B21" d="M13,5.42c-0.39,0-0.71-0.32-0.71-0.71v-1c0-1.18-0.99-1.29-1.3-1.29H6c-0.39,0-0.71-0.32-0.71-0.71
+ S5.61,1,6,1h5c1.05,0,2.61,0.68,2.7,2.52c0,0.03,0,0.06,0,0.08v1.1C13.71,5.1,13.39,5.42,13,5.42z"/>
+ </g>
+ <g>
+ <path fill="#808080" d="M14.65,15H1.35C1.16,15,1,14.84,1,14.65s0.16-0.35,0.35-0.35h13.29c0.2,0,0.35,0.16,0.35,0.35
+ S14.84,15,14.65,15z"/>
+ </g>
+ <g>
+ <path fill="#808080" d="M14.65,13H1.35C1.16,13,1,12.84,1,12.65s0.16-0.35,0.35-0.35h13.29c0.2,0,0.35,0.16,0.35,0.35
+ S14.84,13,14.65,13z"/>
+ </g>
+ <g>
+ <path fill="#808080" d="M14.65,11H1.35C1.16,11,1,10.84,1,10.65s0.16-0.35,0.35-0.35h13.29c0.2,0,0.35,0.16,0.35,0.35
+ S14.84,11,14.65,11z"/>
+ </g>
+</g>
+</svg>
diff --git a/resources/icons/notification_close.svg b/resources/icons/notification_close.svg
new file mode 100644
index 000000000..708d8bfef
--- /dev/null
+++ b/resources/icons/notification_close.svg
@@ -0,0 +1,18 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.2.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="close_window" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
+ y="0px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve">
+<g>
+ <path fill="#ED6B21" d="M80,92.83H20c-7.08,0-12.83-5.76-12.83-12.84V20c0-7.08,5.76-12.83,12.83-12.83h60
+ c7.08,0,12.84,5.76,12.84,12.83v60C92.83,87.08,87.08,92.83,80,92.83z M20,12.83c-3.95,0-7.17,3.21-7.17,7.17v60
+ c0,3.95,3.21,7.17,7.17,7.17h60c3.95,0,7.17-3.21,7.17-7.17V20c0-3.95-3.21-7.17-7.17-7.17H20z"/>
+</g>
+<g>
+ <path fill="#ED6B21" d="M70,75.67c-1.45,0-2.9-0.55-4.01-1.66l-40-40c-2.21-2.21-2.21-5.8,0-8.02s5.8-2.21,8.02,0l40,40
+ c2.21,2.21,2.21,5.8,0,8.02C72.9,75.12,71.45,75.67,70,75.67z"/>
+</g>
+<g>
+ <path fill="#ED6B21" d="M30,75.67c-1.45,0-2.9-0.55-4.01-1.66c-2.21-2.21-2.21-5.8,0-8.02l40-40c2.21-2.21,5.8-2.21,8.02,0
+ c2.21,2.21,2.21,5.8,0,8.02l-40,40C32.9,75.12,31.45,75.67,30,75.67z"/>
+</g>
+</svg>
diff --git a/resources/icons/notification_close_hover.svg b/resources/icons/notification_close_hover.svg
new file mode 100644
index 000000000..a04dce21a
--- /dev/null
+++ b/resources/icons/notification_close_hover.svg
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
+ sodipodi:docname="notification_close_hover.svg"
+ xml:space="preserve"
+ enable-background="new 0 0 100 100"
+ viewBox="0 0 100 100"
+ y="0px"
+ x="0px"
+ id="close_window"
+ version="1.0"><metadata
+ id="metadata19"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs17" /><sodipodi:namedview
+ inkscape:current-layer="close_window"
+ inkscape:window-maximized="1"
+ inkscape:window-y="-8"
+ inkscape:window-x="-8"
+ inkscape:cy="50"
+ inkscape:cx="50"
+ inkscape:zoom="10.08"
+ showgrid="false"
+ id="namedview15"
+ inkscape:window-height="1377"
+ inkscape:window-width="2560"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0"
+ guidetolerance="10"
+ gridtolerance="10"
+ objecttolerance="10"
+ borderopacity="1"
+ bordercolor="#666666"
+ pagecolor="#ffffff" />
+<g
+ transform="matrix(1.15,0,0,1.15,-7.50075,-7.5)"
+ id="g4">
+ <path
+ id="path2"
+ d="M 80,92.83 H 20 C 12.92,92.83 7.17,87.07 7.17,79.99 V 20 C 7.17,12.92 12.93,7.17 20,7.17 h 60 c 7.08,0 12.84,5.76 12.84,12.83 V 80 C 92.83,87.08 87.08,92.83 80,92.83 Z m -60,-80 c -3.95,0 -7.17,3.21 -7.17,7.17 v 60 c 0,3.95 3.21,7.17 7.17,7.17 h 60 c 3.95,0 7.17,-3.21 7.17,-7.17 V 20 c 0,-3.95 -3.21,-7.17 -7.17,-7.17 z"
+ fill="#ED6B21" />
+</g>
+<g
+ transform="matrix(1.15,0,0,1.15,-7.50075,-7.5)"
+ id="g8">
+ <path
+ id="path6"
+ d="m 70,75.67 c -1.45,0 -2.9,-0.55 -4.01,-1.66 l -40,-40 c -2.21,-2.21 -2.21,-5.8 0,-8.02 2.21,-2.22 5.8,-2.21 8.02,0 l 40,40 c 2.21,2.21 2.21,5.8 0,8.02 -1.11,1.11 -2.56,1.66 -4.01,1.66 z"
+ fill="#ED6B21" />
+</g>
+<g
+ transform="matrix(1.15,0,0,1.15,-7.50075,-7.5)"
+ id="g12">
+ <path
+ id="path10"
+ d="m 30,75.67 c -1.45,0 -2.9,-0.55 -4.01,-1.66 -2.21,-2.21 -2.21,-5.8 0,-8.02 l 40,-40 c 2.21,-2.21 5.8,-2.21 8.02,0 2.21,2.21 2.21,5.8 0,8.02 l -40,40 C 32.9,75.12 31.45,75.67 30,75.67 Z"
+ fill="#ED6B21" />
+</g>
+</svg>
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 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 800 800"
+ style="enable-background:new 0 0 800 800;"
+ xml:space="preserve"
+ sodipodi:docname="notification_eject_sd_hover.svg"
+ inkscape:version="1.0 (4035a4fb49, 2020-05-01)"><metadata
+ id="metadata15"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs13" /><sodipodi:namedview
+ inkscape:document-rotation="0"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="3840"
+ inkscape:window-height="2066"
+ id="namedview11"
+ showgrid="false"
+ inkscape:zoom="1.26"
+ inkscape:cx="400"
+ inkscape:cy="396.42857"
+ inkscape:window-x="-11"
+ inkscape:window-y="-11"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" />
+<style
+ type="text/css"
+ id="style2">
+ .st0{fill:#ED6B21;}
+</style>
+<path
+ style="stroke-width:0.85"
+ class="st0"
+ d="m 565.50264,534.98775 v 60.775 h -330.565 v -60.775 h 330.565 m 27.88,-48.195 h -386.24 c -11.22,0 -20.315,9.095 -20.315,20.315 v 116.535 c 0,11.22 9.095,20.315 20.315,20.315 h 386.24 c 11.22,0 20.315,-9.095 20.315,-20.315 v -116.45 c 0,-11.22 -9.095,-20.4 -20.315,-20.4 z"
+ id="path4" />
+<path
+ style="stroke-width:0.85"
+ class="st0"
+ d="m 400.09264,235.70275 116.96,155.295 h -233.75 l 116.79,-155.295 m 0,-66.64 c -6.12,0 -12.155,2.72 -16.235,8.16 l -172.635,229.5 c -10.115,13.43 -0.51,32.555 16.235,32.555 h 345.355 c 16.745,0 26.35,-19.125 16.235,-32.555 l -172.805,-229.5 c -3.995,-5.44 -10.03,-8.16 -16.15,-8.16 z"
+ id="path6" />
+<g
+ id="g4"
+ transform="matrix(0.9775,0,0,0.9775,53.547,53.54775)">
+ <path
+ id="path2"
+ class="st0"
+ d="M 597.2,701.3 H 110.6 C 53.2,701.3 6.5,654.6 6.5,597.2 V 110.6 C 6.5,53.2 53.2,6.5 110.6,6.5 h 486.6 c 57.4,0 104.1,46.7 104.1,104.1 v 486.6 c 0,57.4 -46.7,104.1 -104.1,104.1 z M 110.6,52.4 c -32,0 -58.2,26 -58.2,58.2 v 486.6 c 0,32 26,58.2 58.2,58.2 h 486.6 c 32,0 58.2,-26 58.2,-58.2 V 110.6 c 0,-32 -26,-58.2 -58.2,-58.2 z" />
+</g>
+<path
+ style="fill:#ed6b21;fill-opacity:1;stroke-width:0.674603"
+ d="m 150.65676,738.12999 c -12.4717,-1.39663 -26.66772,-5.94192 -37.84321,-12.11671 -17.754551,-9.80992 -33.768844,-26.68981 -42.418124,-44.71089 -5.985061,-12.4701 -8.760227,-23.35456 -9.821918,-38.52249 -0.48061,-6.8663 -0.640464,-87.42616 -0.497289,-250.61508 0.195544,-222.88027 0.294923,-240.94223 1.356742,-246.58759 4.2349,-22.51562 13.68014,-40.62012 29.200931,-55.97194 14.237938,-14.082924 31.958648,-23.427941 52.602238,-27.739791 5.87892,-1.227937 14.00696,-1.268146 256.3492,-1.268146 h 250.27778 l 7.08334,1.561512 c 21.30688,4.697075 36.90336,13.216072 51.96052,28.381502 14.67865,14.784203 23.1932,30.350373 27.76125,50.752683 l 1.56791,7.00271 v 250.95239 c 0,242.72256 -0.0418,251.15149 -1.26428,257.0238 -9.30592,44.69034 -45.18963,77.43352 -89.75566,81.90028 -9.17898,0.92002 -488.33076,0.87927 -496.55943,-0.0425 z M 652.87275,692.49 c 19.93824,-6.17834 34.6922,-21.42493 40.00111,-41.33675 l 1.51306,-5.67494 V 399.58544 153.69259 l -1.52571,-5.73412 c -5.66288,-21.28292 -21.4158,-36.89778 -42.2051,-41.83523 -5.63965,-1.33941 -7.66026,-1.3488 -253.17948,-1.17613 l -247.49447,0.17405 -4.72222,1.5953 c -18.05932,6.10093 -31.7315,19.23923 -37.4918,36.0278 -1.04762,3.05333 -2.22128,7.52472 -2.60813,9.93642 -0.47859,2.9836 -0.705,81.91876 -0.70847,246.99889 -0.005,218.14117 0.10226,243.1829 1.05916,248.25397 4.27172,22.63802 22.24346,40.86392 44.80877,45.4425 3.58848,0.72811 49.16893,0.87009 250.95237,0.78171 l 246.56747,-0.10801 z"
+ id="path17" /><path
+ style="fill:#ed6b21;fill-opacity:1;stroke-width:0.674603"
+ d="m 218.59688,436.65333 c -4.13129,-2.06443 -6.86895,-4.83026 -9.31331,-9.40915 -1.8345,-3.43648 -1.79343,-12.82008 0.0723,-16.52778 1.6224,-3.22405 174.17376,-232.72362 177.28101,-235.79015 3.40221,-3.35765 7.0012,-4.88322 12.34326,-5.23218 4.15899,-0.27168 5.32913,-0.0718 8.86231,1.51379 2.23886,1.00474 4.97342,2.78734 6.07682,3.96132 4.02813,4.28582 175.25817,232.2757 176.9048,235.54571 2.34584,4.65861 2.38759,12.10251 0.0927,16.52929 -2.00877,3.87485 -5.74351,7.80536 -9.18863,9.67026 l -2.69841,1.4607 -178.1462,0.17362 -178.14619,0.17362 z m 298.67589,-45.66907 c -0.0611,-1.0035 -116.48775,-154.99008 -117.18534,-154.99008 -0.71184,0 -116.84805,154.02591 -116.8632,154.99008 -0.004,0.27827 52.6617,0.50595 117.03571,0.50595 64.374,0 117.02978,-0.22768 117.01283,-0.50595 z"
+ id="path19" /><path
+ style="fill:#ed6b21;fill-opacity:1;stroke-width:0.674603"
+ d="m 202.23056,642.87591 c -4.08272,-1.10499 -7.53117,-3.30912 -10.37477,-6.63124 -4.63948,-5.42019 -4.43387,-2.10678 -4.42657,-71.33297 l 0.007,-62.44927 1.60268,-3.44194 c 1.88877,-4.05635 5.3977,-7.75734 9.36436,-9.8769 l 2.84915,-1.52243 h 199.00794 199.00793 l 2.84915,1.52243 c 3.96665,2.11956 7.47559,5.82055 9.36436,9.8769 l 1.60267,3.44194 0.007,62.44927 c 0.008,69.78764 0.26152,65.98231 -4.79028,71.72146 -1.4904,1.69319 -4.37627,3.87229 -6.52672,4.9283 l -3.85513,1.89304 -196.30953,0.12602 c -153.67069,0.0987 -196.97613,-0.0544 -199.37859,-0.70461 z M 565.87502,565.20052 V 534.50608 H 400.25994 234.64486 v 30.69444 30.69446 h 165.61508 165.61508 z"
+ id="path21" /></svg>
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 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="Layer_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 800 800"
+ style="enable-background:new 0 0 800 800;"
+ xml:space="preserve"
+ sodipodi:docname="notification_eject_sd.svg"
+ inkscape:version="1.0 (4035a4fb49, 2020-05-01)"><metadata
+ id="metadata15"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs13" /><sodipodi:namedview
+ inkscape:document-rotation="0"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1918"
+ inkscape:window-height="2054"
+ id="namedview11"
+ showgrid="false"
+ inkscape:zoom="1.26"
+ inkscape:cx="400"
+ inkscape:cy="401.5873"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="Layer_1" />
+<style
+ type="text/css"
+ id="style2">
+ .st0{fill:#ED6B21;}
+</style>
+<path
+ class="st0"
+ d="M594.8,558.9v71.5H205.9v-71.5H594.8 M627.6,502.2H173.2c-13.2,0-23.9,10.7-23.9,23.9v137.1 c0,13.2,10.7,23.9,23.9,23.9h454.4c13.2,0,23.9-10.7,23.9-23.9V526.2C651.5,513,640.8,502.2,627.6,502.2L627.6,502.2z"
+ id="path4" />
+<path
+ class="st0"
+ d="M400.2,206.8l137.6,182.7h-275L400.2,206.8 M400.2,128.4c-7.2,0-14.3,3.2-19.1,9.6l-203.1,270 c-11.9,15.8-0.6,38.3,19.1,38.3h406.3c19.7,0,31-22.5,19.1-38.3l-203.3-270C414.5,131.6,407.4,128.4,400.2,128.4L400.2,128.4z"
+ id="path6" />
+<g
+ id="g4"
+ transform="matrix(1.15,0,0,1.15,-7.50075,-7.5)">
+ <path
+ id="path2"
+ class="st0"
+ d="M597.2,701.3H110.6c-57.4,0-104.1-46.7-104.1-104.1V110.6C6.5,53.2,53.2,6.5,110.6,6.5h486.6 c57.4,0,104.1,46.7,104.1,104.1v486.6C701.3,654.6,654.6,701.3,597.2,701.3z M110.6,52.4c-32,0-58.2,26-58.2,58.2v486.6 c0,32,26,58.2,58.2,58.2h486.6c32,0,58.2-26,58.2-58.2V110.6c0-32-26-58.2-58.2-58.2L110.6,52.4z" />
+</g>
+<path
+ style="fill:#ed6b21;fill-opacity:1;stroke-width:0.793651"
+ d="M 107.81901,798.00119 C 77.966509,794.83135 49.146122,779.90354 30.060545,757.72544 16.219297,741.64143 7.2605087,723.64471 2.5844311,702.53048 L 0.79365079,694.44444 V 399.60317 104.7619 L 2.5707889,96.74281 C 8.1200484,71.702533 18.222321,53.056007 35.651802,35.682695 53.220959,18.170156 71.802034,8.0954675 96.708127,2.5778576 L 104.7619,0.79365079 h 294.44445 c 281.74132,0 294.75136,0.0623952 301.55851,1.44626191 16.67428,3.3898194 30.80854,9.2277743 44.45639,18.3620833 30.56319,20.455498 49.17772,51.734599 52.83931,88.789134 0.52246,5.28681 0.71992,107.13501 0.57277,295.37077 -0.21452,274.44189 -0.28952,287.63907 -1.67476,294.84127 -9.63677,50.10325 -47.25156,87.71807 -97.3554,97.35548 -7.21079,1.38698 -20.15876,1.45445 -296.82539,1.54754 -159.10715,0.0532 -291.83859,-0.17373 -294.95877,-0.505 z m 582.70983,-52.40653 c 14.11333,-2.49918 25.86756,-8.65506 36.13916,-18.92666 10.4238,-10.4238 16.61917,-22.37735 18.96341,-36.58863 0.59763,-3.62296 0.78014,-91.16224 0.61306,-294.04762 -0.2267,-275.2812 -0.30507,-289.11319 -1.66353,-293.6508 -2.29132,-7.653498 -8.052,-18.790275 -12.80623,-24.757484 -7.93878,-9.964272 -18.57499,-17.346949 -31.48512,-21.854079 l -7.43245,-2.594784 -291.12328,-0.20372 C 142.50327,52.78948 110.02937,52.90047 105.30529,53.98405 79.968659,59.795581 61.031339,78.238321 54.164726,103.78898 l -1.754497,6.52848 -0.240323,282.14286 c -0.151001,177.27655 0.04527,285.53516 0.528069,291.26984 2.318854,27.5434 19.073236,49.76542 44.524247,59.05433 10.087718,3.68173 -4.026285,3.51395 301.243128,3.58099 197.57151,0.0434 288.82563,-0.19746 292.06349,-0.77082 z"
+ id="path19" /><path
+ id="path12"
+ d="M 107.81901,798.00119 C 71.793616,794.17587 39.726024,774.51428 19.725029,743.98814 11.604149,731.59381 6.0410683,718.13847 2.5844311,702.53048 L 0.79365079,694.44444 V 399.20635 103.96825 L 3.035741,94.554887 C 8.7824143,70.427608 18.557382,52.794942 35.676163,35.676161 52.78713,18.565194 70.514246,8.724096 94.444444,3.0513179 l 9.523806,-2.25766869 h 294.84127 c 282.12524,0 295.14809,0.0623746 301.95534,1.44626189 16.66109,3.3871391 30.79289,9.2216269 44.45639,18.3543829 30.53954,20.412782 49.17677,51.732756 52.83931,88.796836 0.52246,5.28681 0.71992,107.13501 0.57277,295.37077 -0.21452,274.44188 -0.28952,287.63907 -1.67476,294.84127 -8.48938,44.13777 -38.62564,78.86883 -80.59962,92.88841 -19.37815,6.47239 11.16453,5.88739 -313.58117,6.0062 -159.10715,0.0579 -291.83859,-0.16532 -294.95877,-0.49659 z m 583.84766,-52.6969 c 13.48971,-2.42242 24.94716,-8.60413 35.32488,-19.05909 10.25229,-10.3286 16.66154,-22.92711 18.61985,-36.60068 0.66689,-4.65647 0.83196,-81.74243 0.62956,-294.0096 C 745.9846,126.77174 745.87745,107.60752 744.6044,102.9114 738.42079,80.100871 721.07257,62.283764 697.9879,55.03493 l -5.92441,-1.860328 H 399.20635 106.34921 L 98.809524,55.78721 C 75.623265,63.821579 59.178748,82.101475 53.902861,105.70593 52.59901,111.53938 52.514615,128.88593 52.47105,400 l -0.04629,288.09524 2.080286,7.60155 c 6.270993,22.91476 22.15377,39.95711 44.384633,47.62505 3.584011,1.23621 7.998091,1.91356 14.999211,2.30168 5.45635,0.30249 136.34921,0.59491 290.87301,0.64982 232.38849,0.0826 281.98128,-0.0849 286.90477,-0.96905 z"
+ style="fill:#ed6b21;fill-opacity:1;stroke-width:0.793651" /><path
+ id="path14"
+ d="m 188.74939,444.33528 c -4.767,-1.68913 -10.12828,-6.7592 -12.71276,-12.02223 -2.90908,-5.92405 -3.07868,-13.78271 -0.41474,-19.21781 1.59087,-3.24578 204.04455,-273.05533 208.24079,-277.52202 0.98764,-1.05129 4.03672,-3.01468 6.77574,-4.3631 4.52929,-2.22976 5.50158,-2.41761 10.74224,-2.07541 6.86047,0.44798 10.76603,2.25377 15.37601,7.10932 3.73681,3.93587 203.30677,268.8636 207.0044,274.79691 2.05716,3.30097 2.4722,4.84315 2.70946,10.06767 0.23771,5.23447 -0.0137,6.8089 -1.6588,10.38763 -2.76417,6.01319 -5.53229,8.93875 -11.0814,11.71167 l -4.85687,2.42701 -208.40498,-0.0627 c -181.84257,-0.0547 -208.82739,-0.21233 -211.71909,-1.23698 z m 348.94902,-54.98925 c 0,-0.9027 -136.36908,-182.10669 -137.30528,-182.44799 -0.54415,-0.19837 -135.36926,178.28524 -137.53574,182.07198 -0.54249,0.9482 19.37332,1.10934 137.10317,1.10934 83.74346,0 137.73785,-0.28747 137.73785,-0.73333 z"
+ style="fill:#ed6b21;fill-opacity:1;stroke-width:0.793651" /><path
+ id="path16"
+ d="m 168.25397,686.16973 c -7.05465,-1.71645 -13.06577,-6.58064 -16.33102,-13.21504 L 150,669.04762 v -74.20635 -74.20635 l 1.8935,-4.19003 c 1.12593,-2.49152 3.46026,-5.59868 5.75857,-7.66505 7.33695,-6.59655 -16.73947,-6.00214 243.08455,-6.00144 l 231.80306,6.3e-4 4.76912,2.2562 c 5.31341,2.5137 9.30333,6.56248 11.81369,11.98794 1.66145,3.59075 1.67116,4.0432 1.67116,77.8181 v 74.20635 l -1.92294,3.90707 c -2.44721,4.97227 -6.5951,9.12016 -11.60261,11.6026 l -3.93477,1.95064 -231.3492,0.12055 c -127.24207,0.0663 -232.42064,-0.14013 -233.73016,-0.45875 z m 426.5873,-91.72529 V 558.33333 H 400 205.15873 v 36.11111 36.11111 H 400 594.84127 Z"
+ style="fill:#ed6b21;fill-opacity:1;stroke-width:0.793651" /></svg>
diff --git a/resources/icons/notification_error.svg b/resources/icons/notification_error.svg
new file mode 100644
index 000000000..5356e7af6
--- /dev/null
+++ b/resources/icons/notification_error.svg
@@ -0,0 +1,71 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ id="error"
+ x="0px"
+ y="0px"
+ viewBox="0 0 200 200"
+ enable-background="new 0 0 100 100"
+ xml:space="preserve"
+ sodipodi:docname="notification_error.svg"
+ width="200"
+ height="200"
+ inkscape:version="1.0 (4035a4fb49, 2020-05-01)"><metadata
+ id="metadata19"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs17" /><sodipodi:namedview
+ inkscape:document-rotation="0"
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="2560"
+ inkscape:window-height="1377"
+ id="namedview15"
+ showgrid="false"
+ inkscape:zoom="5.04"
+ inkscape:cx="117.17146"
+ inkscape:cy="98.609664"
+ inkscape:window-x="-8"
+ inkscape:window-y="-8"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="error" />
+<g
+ id="g4"
+ transform="matrix(2.52,0,0,2.52,-26,-26)">
+ <path
+ fill="#ed6b21"
+ d="m 50,54.25 c -2.35,0 -4.25,-1.9 -4.25,-4.25 V 35 c 0,-2.35 1.9,-4.25 4.25,-4.25 2.35,0 4.25,1.9 4.25,4.25 v 15 c 0,2.35 -1.9,4.25 -4.25,4.25 z"
+ id="path2" />
+</g>
+<g
+ id="g8"
+ transform="matrix(2.52,0,0,2.52,-26,-26)">
+ <circle
+ fill="#ed6b21"
+ cx="50"
+ cy="65"
+ r="5"
+ id="circle6" />
+</g>
+<g
+ id="g12"
+ transform="matrix(2.52,0,0,2.52,-26,-26)">
+ <path
+ fill="#ed6b21"
+ d="M 50,89.25 C 28.36,89.25 10.75,71.64 10.75,50 10.75,28.36 28.36,10.75 50,10.75 71.64,10.75 89.25,28.36 89.25,50 89.25,71.64 71.64,89.25 50,89.25 Z m 0,-70 C 33.05,19.25 19.25,33.04 19.25,50 19.25,66.95 33.04,80.75 50,80.75 66.95,80.75 80.75,66.96 80.75,50 80.75,33.05 66.95,19.25 50,19.25 Z"
+ id="path10" />
+</g>
+</svg>
diff --git a/resources/icons/notification_minimalize.svg b/resources/icons/notification_minimalize.svg
new file mode 100644
index 000000000..bb3ae9b7a
--- /dev/null
+++ b/resources/icons/notification_minimalize.svg
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.2.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="minimalize_window" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px"
+ y="0px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve">
+<g>
+ <path fill="#ED6B21" d="M80,92.83H20c-7.08,0-12.83-5.76-12.83-12.84V20c0-7.08,5.76-12.83,12.83-12.83h60
+ c7.08,0,12.84,5.76,12.84,12.83v60C92.83,87.08,87.08,92.83,80,92.83z M20,12.83c-3.95,0-7.17,3.21-7.17,7.17v60
+ c0,3.95,3.21,7.17,7.17,7.17h60c3.95,0,7.17-3.21,7.17-7.17V20c0-3.95-3.21-7.17-7.17-7.17H20z"/>
+</g>
+<g>
+ <path fill="#ED6B21" d="M70,75.67H30c-3.13,0-5.67-2.54-5.67-5.67v-5c0-3.13,2.54-5.67,5.67-5.67h40c3.13,0,5.67,2.54,5.67,5.67v5
+ C75.67,73.13,73.13,75.67,70,75.67z"/>
+</g>
+</svg>
diff --git a/resources/icons/notification_minimalize_hover.svg b/resources/icons/notification_minimalize_hover.svg
new file mode 100644
index 000000000..bc5bc6cca
--- /dev/null
+++ b/resources/icons/notification_minimalize_hover.svg
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
+ sodipodi:docname="notification_minimalize.svg"
+ xml:space="preserve"
+ enable-background="new 0 0 100 100"
+ viewBox="0 0 100 100"
+ y="0px"
+ x="0px"
+ id="minimalize_window"
+ version="1.0"><metadata
+ id="metadata15"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /></cc:Work></rdf:RDF></metadata><defs
+ id="defs13" /><sodipodi:namedview
+ inkscape:current-layer="minimalize_window"
+ inkscape:window-maximized="1"
+ inkscape:window-y="-8"
+ inkscape:window-x="-8"
+ inkscape:cy="50"
+ inkscape:cx="50"
+ inkscape:zoom="10.08"
+ showgrid="false"
+ id="namedview11"
+ inkscape:window-height="1377"
+ inkscape:window-width="2560"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0"
+ guidetolerance="10"
+ gridtolerance="10"
+ objecttolerance="10"
+ borderopacity="1"
+ bordercolor="#666666"
+ pagecolor="#ffffff" />
+<g
+ transform="matrix(1.15,0,0,1.15,-7.50075,-7.5)"
+ id="g4">
+ <path
+ id="path2"
+ d="M 80,92.83 H 20 C 12.92,92.83 7.17,87.07 7.17,79.99 V 20 C 7.17,12.92 12.93,7.17 20,7.17 h 60 c 7.08,0 12.84,5.76 12.84,12.83 V 80 C 92.83,87.08 87.08,92.83 80,92.83 Z m -60,-80 c -3.95,0 -7.17,3.21 -7.17,7.17 v 60 c 0,3.95 3.21,7.17 7.17,7.17 h 60 c 3.95,0 7.17,-3.21 7.17,-7.17 V 20 c 0,-3.95 -3.21,-7.17 -7.17,-7.17 z"
+ fill="#ed6b21" />
+</g>
+<g
+ transform="matrix(1.15,0,0,1.15,-7.50075,-7.5)"
+ id="g8">
+ <path
+ id="path6"
+ d="M 70,75.67 H 30 c -3.13,0 -5.67,-2.54 -5.67,-5.67 v -5 c 0,-3.13 2.54,-5.67 5.67,-5.67 h 40 c 3.13,0 5.67,2.54 5.67,5.67 v 5 c 0,3.13 -2.54,5.67 -5.67,5.67 z"
+ fill="#ed6b21" />
+</g>
+</svg>
diff --git a/resources/icons/notification_warning.svg b/resources/icons/notification_warning.svg
new file mode 100644
index 000000000..6ba7a046d
--- /dev/null
+++ b/resources/icons/notification_warning.svg
@@ -0,0 +1,70 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
+ height="200"
+ width="200"
+ sodipodi:docname="notification_warning.svg"
+ xml:space="preserve"
+ enable-background="new 0 0 100 100"
+ viewBox="0 0 200 200"
+ y="0px"
+ x="0px"
+ id="warning"
+ version="1.0"><metadata
+ id="metadata19"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs17" /><sodipodi:namedview
+ inkscape:current-layer="warning"
+ inkscape:window-maximized="1"
+ inkscape:window-y="-8"
+ inkscape:window-x="-8"
+ inkscape:cy="71.071558"
+ inkscape:cx="34.775892"
+ inkscape:zoom="3.5638182"
+ showgrid="false"
+ id="namedview15"
+ inkscape:window-height="1377"
+ inkscape:window-width="2560"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0"
+ guidetolerance="10"
+ gridtolerance="10"
+ objecttolerance="10"
+ borderopacity="1"
+ bordercolor="#666666"
+ pagecolor="#ffffff" />
+<g
+ transform="matrix(2.2,0,0,2.2,-9.9977389,-10)"
+ id="g4">
+ <path
+ id="path2"
+ d="M 90,89.25 H 10 C 8.48,89.25 7.08,88.44 6.32,87.13 5.56,85.82 5.55,84.2 6.31,82.89 l 40,-70 c 0.76,-1.33 2.17,-2.14 3.69,-2.14 1.53,0 2.93,0.82 3.69,2.14 l 40,70 c 0.75,1.32 0.75,2.93 -0.01,4.24 -0.76,1.32 -2.16,2.12 -3.68,2.12 z M 17.33,80.75 H 82.68 L 50,23.57 Z"
+ fill="#ed6b21" />
+</g>
+<g
+ transform="matrix(2.2,0,0,2.2,-9.9977389,-10)"
+ id="g8">
+ <path
+ id="path6"
+ d="m 50,59.25 c -2.35,0 -4.25,-1.9 -4.25,-4.25 V 40 c 0,-2.35 1.9,-4.25 4.25,-4.25 2.35,0 4.25,1.9 4.25,4.25 v 15 c 0,2.35 -1.9,4.25 -4.25,4.25 z"
+ fill="#ed6b21" />
+</g>
+<g
+ transform="matrix(2.2,0,0,2.2,-9.9977389,-10)"
+ id="g12">
+ <circle
+ id="circle10"
+ r="5"
+ cy="70"
+ cx="50"
+ fill="#ed6b21" />
+</g>
+</svg>
diff --git a/resources/icons/paste.svg b/resources/icons/paste.svg
index 028ffb8ea..bcfe567de 100644
--- a/resources/icons/paste.svg
+++ b/resources/icons/paste.svg
@@ -1,27 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
<g id="paste">
- <path fill="#FFFFFF" d="M33.73,107.03H15.94c-1.4,0-2.54-1.14-2.54-2.54V23.52c0-1.4,1.14-2.54,2.54-2.54h7.62v5.08
- c0,1.4,1.14,2.54,2.54,2.54h45.72c1.4,0,2.54-1.14,2.54-2.54v-5.08h7.62c1.4,0,2.54,1.14,2.54,2.54v10.16
- c0,1.4,1.14,2.54,2.54,2.54c1.4,0,2.54-1.14,2.54-2.54V23.52c0-4.2-3.42-7.62-7.62-7.62h-7.62v-5.08c0-1.4-1.14-2.54-2.54-2.54
- H26.11c-1.4,0-2.54,1.14-2.54,2.54v5.08h-7.62c-4.2,0-7.62,3.42-7.62,7.62v80.97c0,4.2,3.42,7.62,7.62,7.62h17.78
- c1.4,0,2.54-1.14,2.54-2.54C36.27,108.16,35.13,107.03,33.73,107.03z M28.65,13.36h40.64v10.16H28.65V13.36z"/>
+ <path fill="#FFFFFF" d="M48,101.5H10.5v-83h11V24c0,1.38,1.12,2.5,2.5,2.5h48c1.38,0,2.5-1.12,2.5-2.5v-5.5h11V32h5V16
+ c0-1.38-1.12-2.5-2.5-2.5H74.5V8c0-1.38-1.12-2.5-2.5-2.5H24c-1.38,0-2.5,1.12-2.5,2.5v5.5H8c-1.38,0-2.5,1.12-2.5,2.5v88
+ c0,1.38,1.12,2.5,2.5,2.5h40V101.5z M26.5,10.5h43v11h-43V10.5z"/>
<g>
- <path fill="#ED6B21" d="M53.97,59.08h35.72c1.4,0,2.54-1.14,2.54-2.54c0-1.4-1.14-2.54-2.54-2.54H53.97
- c-1.4,0-2.54,1.14-2.54,2.54C51.43,57.94,52.56,59.08,53.97,59.08z"/>
- <path fill="#ED6B21" d="M104.93,69.24H53.97c-1.4,0-2.54,1.14-2.54,2.54c0,1.4,1.14,2.54,2.54,2.54h50.96
- c1.4,0,2.54-1.14,2.54-2.54C107.47,70.38,106.33,69.24,104.93,69.24z"/>
- <path fill="#ED6B21" d="M104.93,99.72H53.97c-1.4,0-2.54,1.14-2.54,2.54s1.14,2.54,2.54,2.54h50.96c1.4,0,2.54-1.14,2.54-2.54
- S106.33,99.72,104.93,99.72z"/>
- <path fill="#ED6B21" d="M115.75,51.15l-8.06-8.06c-2.47-2.47-6.97-4.34-10.47-4.34h-50.8c-4.2,0-7.62,3.42-7.62,7.62v66.04
- c0,4.2,3.42,7.62,7.62,7.62h66.04c4.2,0,7.62-3.42,7.62-7.62v-50.8C120.09,58.12,118.23,53.62,115.75,51.15z M104.85,47.43
- l6.57,6.57h-6.57V47.43z M115.01,112.42c0,1.4-1.14,2.54-2.54,2.54H46.43c-1.4,0-2.54-1.14-2.54-2.54V46.38
- c0-1.4,1.14-2.54,2.54-2.54h50.8c0.74,0,1.63,0.18,2.54,0.46v12.24c0,1.4,1.14,2.54,2.54,2.54h12.24c0.28,0.91,0.46,1.8,0.46,2.54
- V112.42z"/>
- <path fill="#ED6B21" d="M104.93,84.48H53.97c-1.4,0-2.54,1.14-2.54,2.54c0,1.4,1.14,2.54,2.54,2.54h50.96
- c1.4,0,2.54-1.14,2.54-2.54C107.47,85.62,106.33,84.48,104.93,84.48z"/>
+ <path fill="#ED6B21" d="M122.45,55.51c-0.02-0.11-0.06-0.22-0.1-0.33c-0.02-0.05-0.02-0.09-0.04-0.14
+ c-0.05-0.12-0.11-0.23-0.18-0.34c-0.02-0.03-0.03-0.06-0.05-0.09c-0.09-0.14-0.2-0.26-0.31-0.38l-15.99-15.99
+ c-0.12-0.12-0.24-0.22-0.38-0.31c-0.04-0.02-0.08-0.04-0.11-0.06c-0.1-0.06-0.2-0.12-0.32-0.17c-0.05-0.02-0.11-0.03-0.16-0.05
+ c-0.1-0.03-0.2-0.07-0.3-0.09c-0.16-0.03-0.33-0.05-0.49-0.05H56c-1.38,0-2.5,1.12-2.5,2.5v80c0,1.38,1.12,2.5,2.5,2.5h64
+ c1.38,0,2.5-1.12,2.5-2.5V56C122.5,55.83,122.48,55.67,122.45,55.51z M106.5,46.04l7.46,7.46h-7.46V46.04z M58.5,117.5v-75h43V56
+ c0,1.38,1.12,2.5,2.5,2.5h13.5v59H58.5z"/>
+ <path fill="#ED6B21" d="M104.23,70.78l-15.49-8.94c-0.77-0.45-1.73-0.45-2.5,0l-15.49,8.94c-0.77,0.45-1.25,1.27-1.25,2.17v17.89
+ c0,0.89,0.48,1.72,1.25,2.17l15.49,8.94c0.39,0.22,0.82,0.33,1.25,0.33s0.86-0.11,1.25-0.33L104.23,93
+ c0.77-0.45,1.25-1.27,1.25-2.17V72.94C105.48,72.05,105.01,71.23,104.23,70.78z M100.48,89.39l-12.99,7.5l-12.99-7.5v-15
+ l12.99-7.5l12.99,7.5V89.39z"/>
</g>
</g>
</svg>
diff --git a/resources/icons/prusa_slicer_logo.svg b/resources/icons/prusa_slicer_logo.svg
new file mode 100644
index 000000000..927c3e70b
--- /dev/null
+++ b/resources/icons/prusa_slicer_logo.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="800" height="800" viewBox="0 0 800 800">
+ <circle cx="400" cy="400" r="400" fill="#fff"/>
+ <path d="M599.3,186.8c-93.9-93.9-246.1-93.9-340,0s-93.9,246.1,0,340Z" transform="translate(0 0)" fill="#363636"/>
+ <path d="M202.7,612.5c93.9,93.9,246.1,93.9,340,0s93.9-246.1,0-340" transform="translate(0 0)" fill="#ed6b21"/>
+</svg>
diff --git a/resources/icons/redo_toolbar.svg b/resources/icons/redo_toolbar.svg
index d005f8373..d2aca2cc7 100644
--- a/resources/icons/redo_toolbar.svg
+++ b/resources/icons/redo_toolbar.svg
@@ -1,13 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 23.0.6, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
-<path id="undo_1_" fill="#ED6B21" d="M1.95,7.01h10.24L8.86,2.51c-0.31-0.42-0.22-1.01,0.2-1.32c0.42-0.31,1.01-0.22,1.32,0.2
- l4.44,6.01c0,0.01,0.01,0.01,0.01,0.02c0.01,0.01,0.02,0.03,0.03,0.04c0.01,0.02,0.03,0.05,0.04,0.07c0.01,0.02,0.02,0.03,0.03,0.05
- c0.01,0.01,0.01,0.03,0.02,0.04c0.01,0.02,0.02,0.05,0.02,0.07c0.01,0.02,0.01,0.04,0.02,0.06c0,0.01,0,0.03,0.01,0.04
- c0,0.02,0.01,0.05,0.01,0.07c0,0.02,0.01,0.05,0.01,0.07c0,0.01,0,0.01,0,0.02c0,0.01,0,0.01,0,0.02c0,0.02,0,0.05-0.01,0.07
- c0,0.02,0,0.05-0.01,0.07c0,0.01,0,0.03-0.01,0.04c0,0.02-0.01,0.04-0.02,0.06c-0.01,0.02-0.01,0.05-0.02,0.07
- c-0.01,0.01-0.01,0.03-0.02,0.04c-0.01,0.02-0.02,0.04-0.03,0.05c-0.01,0.02-0.02,0.04-0.04,0.07c-0.01,0.01-0.02,0.03-0.03,0.04
- c0,0.01-0.01,0.01-0.01,0.02l-4.54,6.05c-0.19,0.25-0.47,0.38-0.76,0.38c-0.2,0-0.4-0.06-0.57-0.19c-0.42-0.31-0.5-0.91-0.19-1.32
- l3.41-4.54H1.95C1.42,8.91,1,8.48,1,7.96C1,7.44,1.42,7.01,1.95,7.01z"/>
+ viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<g id="redo">
+ <g>
+ <path fill="#ED6B21" d="M91.43,72.21c-0.73,0-1.46-0.32-1.95-0.94c-0.86-1.08-0.69-2.65,0.39-3.51L116,46.86l-26.13-20.9
+ c-1.08-0.86-1.25-2.44-0.39-3.51c0.86-1.08,2.43-1.25,3.51-0.39l28.57,22.86c0.59,0.47,0.94,1.19,0.94,1.95s-0.35,1.48-0.94,1.95
+ L92.99,71.67C92.53,72.04,91.98,72.21,91.43,72.21z"/>
+ </g>
+ <g>
+ <path fill="#ED6B21" d="M80,106.5H36.57C19.44,106.5,5.5,92.56,5.5,75.43s13.94-31.07,31.07-31.07H120c1.38,0,2.5,1.12,2.5,2.5
+ s-1.12,2.5-2.5,2.5H36.57c-14.38,0-26.07,11.7-26.07,26.07s11.7,26.07,26.07,26.07H80c1.38,0,2.5,1.12,2.5,2.5
+ S81.38,106.5,80,106.5z"/>
+ </g>
+</g>
</svg>
diff --git a/resources/icons/remove.svg b/resources/icons/remove.svg
index acd21256c..1bb830d91 100644
--- a/resources/icons/remove.svg
+++ b/resources/icons/remove.svg
@@ -1,44 +1,60 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
-<path fill="#FFFFFF" d="M38.11,44.25H25.75c-0.95,0-1.72,0.77-1.72,1.72s0.77,1.72,1.72,1.72H38.1c0.95,0,1.72-0.77,1.72-1.72
- C39.83,45.02,39.06,44.25,38.11,44.25z M45.89,45.97c0,0.95,0.77,1.72,1.72,1.72h12.35c0.95,0,1.72-0.77,1.72-1.72
- s-0.77-1.72-1.72-1.72H47.61C46.66,44.25,45.89,45.02,45.89,45.97z M68.11,43.6c-0.33,0.28-0.52,0.65-0.59,1.04
- c-0.59,0.27-1,0.87-1,1.56v5.6c0,0.95,0.77,1.72,1.72,1.72c0.95,0,1.72-0.77,1.72-1.72v-5.34c0.12-0.06,0.24-0.13,0.35-0.22
- c0.13-0.11,0.25-0.23,0.36-0.34l8.27-8.77c0.65-0.69,0.62-1.78-0.07-2.43s-1.78-0.62-2.43,0.07l-8.27,8.78
- C68.16,43.56,68.14,43.58,68.11,43.6z M68.25,76.84c-0.95,0-1.72,0.77-1.72,1.72V89.1c0,0.95,0.77,1.72,1.72,1.72
- c0.95,0,1.72-0.77,1.72-1.72V78.56C69.97,77.61,69.2,76.84,68.25,76.84z M69.97,59.91c0-0.95-0.77-1.72-1.72-1.72
- c-0.95,0-1.72,0.77-1.72,1.72v10.54c0,0.95,0.77,1.72,1.72,1.72c0.95,0,1.72-0.77,1.72-1.72V59.91z M88.92,56.35
- c-0.95,0-1.72,0.77-1.72,1.72v3.4c0,0.34-0.02,0.63-0.04,0.85c-0.51,0.55-0.62,1.38-0.22,2.06c0.32,0.54,0.89,0.84,1.48,0.84
- c0.3,0,0.6-0.08,0.88-0.24l0.25-0.15c0.67-0.4,1.09-1.1,1.09-3.35v-3.4C90.64,57.12,89.87,56.35,88.92,56.35z M41.81,26.17h11.3
- c0.95,0,1.72-0.77,1.72-1.72s-0.77-1.72-1.72-1.72h-11.3c-0.95,0-1.72,0.77-1.72,1.72S40.86,26.17,41.81,26.17z M87.2,22.73h-5.39
- c-0.95,0-1.72,0.77-1.72,1.72s0.77,1.72,1.72,1.72h2.75l-1.58,1.68c-0.65,0.69-0.62,1.78,0.07,2.43c0.33,0.31,0.76,0.47,1.18,0.47
- c0.46,0,0.91-0.18,1.25-0.54l1.72-1.82v0.99c0,0.95,0.77,1.72,1.72,1.72c0.95,0,1.72-0.77,1.72-1.72v-3.21
- C90.64,24.27,89.09,22.73,87.2,22.73z M61.81,26.17h11.3c0.95,0,1.72-0.77,1.72-1.72s-0.77-1.72-1.72-1.72h-11.3
- c-0.95,0-1.72,0.77-1.72,1.72S60.86,26.17,61.81,26.17z M9.71,67.54c0.95,0,1.72-0.77,1.72-1.72v-11.3c0-0.95-0.77-1.72-1.72-1.72
- s-1.72,0.77-1.72,1.72v11.3C7.99,66.77,8.76,67.54,9.71,67.54z M24.65,33.86c0.42,0,0.84-0.15,1.17-0.46l7.04-6.52
- c0.14-0.13,0.46-0.34,0.9-0.51c0.89-0.34,1.34-1.33,1-2.22s-1.33-1.34-2.22-1c-0.8,0.3-1.52,0.73-2.03,1.2l-7.04,6.52
- c-0.7,0.65-0.74,1.74-0.09,2.43C23.73,33.68,24.19,33.86,24.65,33.86z M70.35,99.28l-0.37,0.36v-2.43c0-0.95-0.77-1.72-1.72-1.72
- c-0.95,0-1.72,0.77-1.72,1.72v4.72H61.3c-0.95,0-1.72,0.77-1.72,1.72s0.77,1.72,1.72,1.72h5.23c1.4,0,3.15-0.7,4.16-1.66l2.03-1.94
- c0.69-0.66,0.71-1.75,0.06-2.43C72.13,98.65,71.03,98.63,70.35,99.28z M52.6,101.93H41.3c-0.95,0-1.72,0.77-1.72,1.72
- s0.77,1.72,1.72,1.72h11.3c0.95,0,1.72-0.77,1.72-1.72S53.55,101.93,52.6,101.93z M88.92,36.35c-0.95,0-1.72,0.77-1.72,1.72v11.3
- c0,0.95,0.77,1.72,1.72,1.72c0.95,0,1.72-0.77,1.72-1.72v-11.3C90.64,37.12,89.87,36.35,88.92,36.35z M32.61,101.93H21.3
- c-0.95,0-1.72,0.77-1.72,1.72s0.77,1.72,1.72,1.72h11.3c0.95,0,1.72-0.77,1.72-1.72S33.56,101.93,32.61,101.93z M9.71,87.54
- c0.95,0,1.72-0.77,1.72-1.72v-11.3c0-0.95-0.77-1.72-1.72-1.72s-1.72,0.77-1.72,1.72v11.3C7.99,86.77,8.76,87.54,9.71,87.54z
- M12.61,101.93h-1.18v-7.42c0-0.95-0.77-1.72-1.72-1.72s-1.72,0.77-1.72,1.72v7.42c0,1.9,1.54,3.44,3.44,3.44h1.18
- c0.95,0,1.72-0.77,1.72-1.72S13.56,101.93,12.61,101.93z M19.53,36.88c-0.65-0.7-1.74-0.74-2.43-0.09l-7.3,6.76
- c-0.55,0.51-0.93,1.15-1.16,1.6C8.22,46,8.56,47.03,9.41,47.46c0.25,0.12,0.51,0.18,0.77,0.18h0.01c0.14,0.04,0.29,0.07,0.45,0.07
- h5.6c0.95,0,1.72-0.77,1.72-1.72s-0.77-1.72-1.72-1.72h-2.13l5.33-4.94C20.14,38.66,20.18,37.57,19.53,36.88z M80.7,89.4l-4.05,3.86
- c-0.69,0.66-0.71,1.75-0.06,2.43c0.34,0.35,0.79,0.53,1.25,0.53c0.43,0,0.86-0.16,1.19-0.48l4.05-3.86
- c0.69-0.66,0.71-1.75,0.06-2.43C82.48,88.77,81.39,88.75,80.7,89.4z"/>
-<g>
- <path fill="#ED6B21" d="M98.82,101.06c-11.63,0-21.09-9.46-21.09-21.09s9.46-21.09,21.09-21.09s21.09,9.46,21.09,21.09
- S110.45,101.06,98.82,101.06z M98.82,62.32c-9.73,0-17.65,7.92-17.65,17.65s7.92,17.65,17.65,17.65s17.65-7.92,17.65-17.65
- S108.55,62.32,98.82,62.32z"/>
-</g>
-<g>
- <path fill="#ED6B21" d="M110.44,81.84c0,1.1-0.9,2-2,2H89.2c-1.1,0-2-0.9-2-2v-3.75c0-1.1,0.9-2,2-2h19.25c1.1,0,2,0.9,2,2
- L110.44,81.84L110.44,81.84z"/>
+<g id="remove_1_">
+ <g>
+ <path fill="#FFFFFF" d="M98.71,29.29c0.49,0.49,1.13,0.73,1.77,0.73s1.28-0.24,1.77-0.73l7.05-7.05c0.98-0.98,0.98-2.56,0-3.54
+ c-0.98-0.98-2.56-0.98-3.54,0l-7.05,7.05C97.73,26.74,97.73,28.32,98.71,29.29z"/>
+ <path fill="#FFFFFF" d="M82,42.5h3.5V46c0,1.38,1.12,2.5,2.5,2.5s2.5-1.12,2.5-2.5v-4.96l3.51-3.51c0.98-0.98,0.98-2.56,0-3.54
+ c-0.98-0.98-2.56-0.98-3.54,0l-3.51,3.51H82c-1.38,0-2.5,1.12-2.5,2.5S80.62,42.5,82,42.5z"/>
+ <path fill="#FFFFFF" d="M113.97,10.5c-0.95,0.98-0.94,2.54,0.02,3.51c0.49,0.49,1.13,0.73,1.77,0.73c0.63,0,1.26-0.24,1.75-0.71
+ c0.02,1.37,1.13,2.47,2.5,2.47c1.38,0,2.5-1.12,2.5-2.5V8c0-0.05-0.01-0.1-0.02-0.15c0-0.06-0.01-0.11-0.02-0.17
+ c-0.03-0.22-0.08-0.43-0.15-0.62c0,0,0-0.01,0-0.01c0,0,0,0,0,0c-0.01-0.03-0.03-0.05-0.04-0.08c-0.05-0.11-0.11-0.21-0.17-0.31
+ c-0.03-0.04-0.05-0.08-0.08-0.11c-0.06-0.08-0.13-0.16-0.2-0.24c-0.03-0.03-0.06-0.07-0.09-0.1c-0.09-0.09-0.19-0.17-0.3-0.25
+ c-0.01-0.01-0.02-0.02-0.04-0.03c-0.12-0.08-0.24-0.15-0.38-0.2c-0.04-0.02-0.09-0.03-0.13-0.05c-0.1-0.04-0.2-0.07-0.3-0.09
+ c-0.05-0.01-0.09-0.02-0.14-0.03c-0.15-0.03-0.3-0.05-0.45-0.05h-6c-1.38,0-2.5,1.12-2.5,2.5C111.5,9.37,112.6,10.48,113.97,10.5z
+ "/>
+ <path fill="#FFFFFF" d="M89.49,10.5h11.31c1.38,0,2.5-1.12,2.5-2.5s-1.12-2.5-2.5-2.5H89.49c-1.38,0-2.5,1.12-2.5,2.5
+ S88.11,10.5,89.49,10.5z"/>
+ <path fill="#FFFFFF" d="M88,57.92c-1.38,0-2.5,1.12-2.5,2.5v5.35c1.61-0.56,3.28-0.99,5-1.29v-4.06
+ C90.5,59.04,89.38,57.92,88,57.92z"/>
+ <path fill="#FFFFFF" d="M117.5,63.91c0,1.38,1.12,2.5,2.5,2.5s2.5-1.12,2.5-2.5V52.39c0-1.38-1.12-2.5-2.5-2.5s-2.5,1.12-2.5,2.5
+ V63.91z"/>
+ <path fill="#FFFFFF" d="M64.99,10.5H76.3c1.38,0,2.5-1.12,2.5-2.5s-1.12-2.5-2.5-2.5H64.99c-1.38,0-2.5,1.12-2.5,2.5
+ S63.6,10.5,64.99,10.5z"/>
+ <path fill="#FFFFFF" d="M120,24.94c-1.38,0-2.5,1.12-2.5,2.5v11.52c0,1.38,1.12,2.5,2.5,2.5s2.5-1.12,2.5-2.5V27.44
+ C122.5,26.06,121.38,24.94,120,24.94z"/>
+ <path fill="#FFFFFF" d="M14.76,37.63c0.59-0.88,0.58-2.07-0.12-2.94c-0.86-1.08-2.44-1.25-3.51-0.39l-4.69,3.75
+ c-0.03,0.03-0.06,0.06-0.09,0.09c-0.07,0.06-0.13,0.12-0.19,0.19c-0.05,0.06-0.1,0.12-0.15,0.18c-0.05,0.07-0.09,0.13-0.14,0.2
+ c-0.04,0.07-0.08,0.14-0.12,0.21c-0.03,0.07-0.07,0.15-0.09,0.22c-0.03,0.08-0.05,0.15-0.07,0.23c-0.02,0.08-0.04,0.15-0.05,0.23
+ c-0.01,0.09-0.02,0.17-0.03,0.26c0,0.04-0.01,0.09-0.01,0.13v6c0,1.38,1.12,2.5,2.5,2.5s2.5-1.12,2.5-2.5v-3.5H14
+ c1.38,0,2.5-1.12,2.5-2.5C16.5,38.89,15.77,37.95,14.76,37.63z"/>
+ <path fill="#FFFFFF" d="M40.79,37.5H28.42c-1.38,0-2.5,1.12-2.5,2.5s1.12,2.5,2.5,2.5h12.36c1.38,0,2.5-1.12,2.5-2.5
+ S42.17,37.5,40.79,37.5z"/>
+ <path fill="#FFFFFF" d="M54.29,8c0-1.38-1.12-2.5-2.5-2.5H48c-0.57,0-1.12,0.19-1.56,0.55l-5.87,4.7
+ c-1.08,0.86-1.25,2.44-0.39,3.51c0.49,0.62,1.22,0.94,1.95,0.94c0.55,0,1.1-0.18,1.56-0.55l5.19-4.15h2.91
+ C53.17,10.5,54.29,9.38,54.29,8z"/>
+ <path fill="#FFFFFF" d="M40.79,117.5H28.42c-1.38,0-2.5,1.12-2.5,2.5s1.12,2.5,2.5,2.5h12.36c1.38,0,2.5-1.12,2.5-2.5
+ S42.17,117.5,40.79,117.5z"/>
+ <path fill="#FFFFFF" d="M67.58,117.5H55.21c-1.38,0-2.5,1.12-2.5,2.5s1.12,2.5,2.5,2.5h12.36c1.38,0,2.5-1.12,2.5-2.5
+ S68.96,117.5,67.58,117.5z"/>
+ <path fill="#FFFFFF" d="M52.71,40c0,1.38,1.12,2.5,2.5,2.5h12.36c1.38,0,2.5-1.12,2.5-2.5s-1.12-2.5-2.5-2.5H55.21
+ C53.83,37.5,52.71,38.62,52.71,40z"/>
+ <path fill="#FFFFFF" d="M8,102.08c1.38,0,2.5-1.12,2.5-2.5V87.21c0-1.38-1.12-2.5-2.5-2.5s-2.5,1.12-2.5,2.5v12.36
+ C5.5,100.96,6.62,102.08,8,102.08z"/>
+ <path fill="#FFFFFF" d="M8,75.29c1.38,0,2.5-1.12,2.5-2.5V60.42c0-1.38-1.12-2.5-2.5-2.5s-2.5,1.12-2.5,2.5v12.36
+ C5.5,74.17,6.62,75.29,8,75.29z"/>
+ <path fill="#FFFFFF" d="M14,117.5h-3.5V114c0-1.38-1.12-2.5-2.5-2.5s-2.5,1.12-2.5,2.5v6c0,1.38,1.12,2.5,2.5,2.5h6
+ c1.38,0,2.5-1.12,2.5-2.5S15.38,117.5,14,117.5z"/>
+ <path fill="#FFFFFF" d="M33.77,19.38c-0.86-1.08-2.44-1.25-3.51-0.39l-8.83,7.07c-1.08,0.86-1.25,2.44-0.39,3.51
+ c0.49,0.62,1.22,0.94,1.95,0.94c0.55,0,1.1-0.18,1.56-0.55l8.83-7.07C34.46,22.03,34.64,20.46,33.77,19.38z"/>
+ </g>
+ <g>
+ <path fill="#ED6B21" d="M96,69.5c-14.61,0-26.5,11.89-26.5,26.5s11.89,26.5,26.5,26.5s26.5-11.89,26.5-26.5S110.61,69.5,96,69.5z
+ M96,117.5c-11.86,0-21.5-9.64-21.5-21.5S84.14,74.5,96,74.5s21.5,9.64,21.5,21.5S107.86,117.5,96,117.5z"/>
+ <path fill="#ED6B21" d="M112,93.5H80c-1.38,0-2.5,1.12-2.5,2.5s1.12,2.5,2.5,2.5h32c1.38,0,2.5-1.12,2.5-2.5S113.38,93.5,112,93.5
+ z"/>
+ </g>
</g>
</svg>
diff --git a/resources/icons/seam.svg b/resources/icons/seam.svg
new file mode 100644
index 000000000..a7e7980cc
--- /dev/null
+++ b/resources/icons/seam.svg
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<g id="paint_x5F_seams_2_">
+
+ <polyline fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
+ 120,32 64,8 8,32 8,96 64,120 "/>
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
+ M120,96"/>
+
+ <polyline fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
+ 8,32 64,56 64,120 "/>
+
+ <line fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="64" y1="56" x2="120" y2="32"/>
+
+ <line fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="64" y1="120" x2="120" y2="96"/>
+
+ <line fill="none" stroke="#FFFFFF" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="120" y1="96" x2="120" y2="32"/>
+
+ <line fill="none" stroke="#ED6B21" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="88.05" y1="53.69" x2="95.96" y2="50.3"/>
+
+ <line fill="none" stroke="#ED6B21" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="95.96" y1="58.3" x2="103.99" y2="54.86"/>
+
+ <line fill="none" stroke="#ED6B21" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="88.05" y1="69.69" x2="95.96" y2="66.3"/>
+
+ <line fill="none" stroke="#ED6B21" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="80.05" y1="81.12" x2="88.05" y2="77.69"/>
+
+ <line fill="none" stroke="#ED6B21" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="71.94" y1="92.6" x2="80.05" y2="89.12"/>
+
+ <line fill="none" stroke="#ED6B21" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="80.05" y1="97.12" x2="88.05" y2="93.69"/>
+
+ <line fill="none" stroke="#ED6B21" stroke-width="3" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="88.05" y1="101.69" x2="96.13" y2="98.23"/>
+</g>
+</svg>
diff --git a/resources/icons/search.svg b/resources/icons/search.svg
new file mode 100644
index 000000000..6421c7e05
--- /dev/null
+++ b/resources/icons/search.svg
@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24px" height="24px">
+<path fill="#808080" d="M 13.261719 14.867188 L 15.742188 17.347656 C 15.363281 18.070313 15.324219 18.789063 15.722656 19.1875 L 20.25 23.714844 C 20.820313 24.285156 22.0625 23.972656 23.015625 23.015625 C 23.972656 22.058594 24.285156 20.820313 23.714844 20.25 L 19.191406 15.722656 C 18.789063 15.324219 18.070313 15.363281 17.347656 15.738281 L 14.867188 13.261719 Z M 8.5 0 C 3.804688 0 0 3.804688 0 8.5 C 0 13.195313 3.804688 17 8.5 17 C 13.195313 17 17 13.195313 17 8.5 C 17 3.804688 13.195313 0 8.5 0 Z M 8.5 15 C 4.910156 15 2 12.089844 2 8.5 C 2 4.910156 4.910156 2 8.5 2 C 12.089844 2 15 4.910156 15 8.5 C 15 12.089844 12.089844 15 8.5 15 Z"/>
+<path fill="#ED6B21" d="M 13.261719 14.867188 L 19.191406 15.722656 C 18.789063 15.324219 18.070313 15.363281 17.347656 15.738281 M 8.5 0 C 3.804688 0 0 3.804688 0 8.5 C 0 13.195313 3.804688 17 8.5 17 C 13.195313 17 17 13.195313 17 8.5 C 17 3.804688 13.195313 0 8.5 0 Z M 8.5 15 C 4.910156 15 2 12.089844 2 8.5 C 2 4.910156 4.910156 2 8.5 2 C 12.089844 2 15 4.910156 15 8.5 C 15 12.089844 12.089844 15 8.5 15 Z"/>
+</svg> \ No newline at end of file
diff --git a/resources/icons/search_.svg b/resources/icons/search_.svg
new file mode 100644
index 000000000..2985ceb56
--- /dev/null
+++ b/resources/icons/search_.svg
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<g id="search">
+ <g>
+ <path fill="#ED6B21" d="M52,98.5C26.36,98.5,5.5,77.64,5.5,52C5.5,26.36,26.36,5.5,52,5.5c25.64,0,46.5,20.86,46.5,46.5
+ C98.5,77.64,77.64,98.5,52,98.5z M52,10.5c-22.88,0-41.5,18.62-41.5,41.5c0,22.88,18.62,41.5,41.5,41.5
+ c22.88,0,41.5-18.62,41.5-41.5C93.5,29.12,74.88,10.5,52,10.5z"/>
+ </g>
+ <g>
+ <path fill="#ED6B21" d="M117.47,119.97c-0.64,0-1.28-0.24-1.77-0.73L81.34,84.88c-0.98-0.98-0.98-2.56,0-3.54s2.56-0.98,3.54,0
+ l34.36,34.36c0.98,0.98,0.98,2.56,0,3.54C118.75,119.72,118.11,119.97,117.47,119.97z"/>
+ </g>
+ <g>
+ <path fill="#ED6B21" d="M117.47,122.47c-1.28,0-2.56-0.49-3.54-1.46L92.46,99.54c-1.95-1.95-1.95-5.12,0-7.07
+ c1.95-1.95,5.12-1.95,7.07,0L121,113.93c1.95,1.95,1.95,5.12,0,7.07C120.03,121.98,118.75,122.47,117.47,122.47z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M52,77.59c-0.43,0-0.86-0.11-1.25-0.33l-20-11.55c-0.77-0.45-1.25-1.27-1.25-2.17V40.45
+ c0-0.89,0.48-1.72,1.25-2.17l20-11.55c0.77-0.45,1.73-0.45,2.5,0l20,11.55c0.77,0.45,1.25,1.27,1.25,2.17v23.09
+ c0,0.89-0.48,1.72-1.25,2.17l-20,11.55C52.86,77.48,52.43,77.59,52,77.59z M34.5,62.1L52,72.21l17.5-10.1V41.9L52,31.79L34.5,41.9
+ V62.1z M72,63.55L72,63.55L72,63.55z"/>
+ </g>
+</g>
+</svg>
diff --git a/resources/icons/search_blink.svg b/resources/icons/search_blink.svg
new file mode 100644
index 000000000..d005f8373
--- /dev/null
+++ b/resources/icons/search_blink.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.6, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
+<path id="undo_1_" fill="#ED6B21" d="M1.95,7.01h10.24L8.86,2.51c-0.31-0.42-0.22-1.01,0.2-1.32c0.42-0.31,1.01-0.22,1.32,0.2
+ l4.44,6.01c0,0.01,0.01,0.01,0.01,0.02c0.01,0.01,0.02,0.03,0.03,0.04c0.01,0.02,0.03,0.05,0.04,0.07c0.01,0.02,0.02,0.03,0.03,0.05
+ c0.01,0.01,0.01,0.03,0.02,0.04c0.01,0.02,0.02,0.05,0.02,0.07c0.01,0.02,0.01,0.04,0.02,0.06c0,0.01,0,0.03,0.01,0.04
+ c0,0.02,0.01,0.05,0.01,0.07c0,0.02,0.01,0.05,0.01,0.07c0,0.01,0,0.01,0,0.02c0,0.01,0,0.01,0,0.02c0,0.02,0,0.05-0.01,0.07
+ c0,0.02,0,0.05-0.01,0.07c0,0.01,0,0.03-0.01,0.04c0,0.02-0.01,0.04-0.02,0.06c-0.01,0.02-0.01,0.05-0.02,0.07
+ c-0.01,0.01-0.01,0.03-0.02,0.04c-0.01,0.02-0.02,0.04-0.03,0.05c-0.01,0.02-0.02,0.04-0.04,0.07c-0.01,0.01-0.02,0.03-0.03,0.04
+ c0,0.01-0.01,0.01-0.01,0.02l-4.54,6.05c-0.19,0.25-0.47,0.38-0.76,0.38c-0.2,0-0.4-0.06-0.57-0.19c-0.42-0.31-0.5-0.91-0.19-1.32
+ l3.41-4.54H1.95C1.42,8.91,1,8.48,1,7.96C1,7.44,1.42,7.01,1.95,7.01z"/>
+</svg>
diff --git a/resources/icons/search_gray.svg b/resources/icons/search_gray.svg
new file mode 100644
index 000000000..043c2e3b2
--- /dev/null
+++ b/resources/icons/search_gray.svg
@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24px" height="24px">
+<path fill="#808080" d="M 13.261719 14.867188 L 15.742188 17.347656 C 15.363281 18.070313 15.324219 18.789063 15.722656 19.1875 L 20.25 23.714844 C 20.820313 24.285156 22.0625 23.972656 23.015625 23.015625 C 23.972656 22.058594 24.285156 20.820313 23.714844 20.25 L 19.191406 15.722656 C 18.789063 15.324219 18.070313 15.363281 17.347656 15.738281 L 14.867188 13.261719 Z M 8.5 0 C 3.804688 0 0 3.804688 0 8.5 C 0 13.195313 3.804688 17 8.5 17 C 13.195313 17 17 13.195313 17 8.5 C 17 3.804688 13.195313 0 8.5 0 Z M 8.5 15 C 4.910156 15 2 12.089844 2 8.5 C 2 4.910156 4.910156 2 8.5 2 C 12.089844 2 15 4.910156 15 8.5 C 15 12.089844 12.089844 15 8.5 15 Z"/>
+<path fill="#808080" d="M 13.261719 14.867188 L 19.191406 15.722656 C 18.789063 15.324219 18.070313 15.363281 17.347656 15.738281 M 8.5 0 C 3.804688 0 0 3.804688 0 8.5 C 0 13.195313 3.804688 17 8.5 17 C 13.195313 17 17 13.195313 17 8.5 C 17 3.804688 13.195313 0 8.5 0 Z M 8.5 15 C 4.910156 15 2 12.089844 2 8.5 C 2 4.910156 4.910156 2 8.5 2 C 12.089844 2 15 4.910156 15 8.5 C 15 12.089844 12.089844 15 8.5 15 Z"/>
+</svg> \ No newline at end of file
diff --git a/resources/icons/settings.svg b/resources/icons/settings.svg
new file mode 100644
index 000000000..db5bf458d
--- /dev/null
+++ b/resources/icons/settings.svg
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<g id="settings">
+ <g>
+ <g>
+ <path fill="#ED6B21" d="M51.99,81.99c-0.56,0-1.12-0.11-1.66-0.33c-1.06-0.44-1.88-1.27-2.32-2.33l-1.69-4.1
+ c-1.61,0.12-3.24,0.11-4.86-0.02l-1.71,4.1c-0.91,2.19-3.44,3.22-5.62,2.31l-9.97-4.17c-2.19-0.91-3.22-3.44-2.31-5.62l1.71-4.1
+ c-1.23-1.06-2.38-2.21-3.43-3.44l-4.1,1.69c-1.06,0.43-2.23,0.43-3.29-0.01c-1.06-0.44-1.88-1.27-2.32-2.33l-4.1-10
+ c-0.9-2.19,0.15-4.71,2.34-5.61l4.1-1.69c-0.12-1.61-0.11-3.24,0.02-4.86l-4.1-1.71c-1.06-0.44-1.88-1.27-2.32-2.33
+ c-0.44-1.06-0.43-2.23,0.01-3.29l4.17-9.97c0.44-1.06,1.27-1.88,2.33-2.32c1.06-0.44,2.23-0.43,3.29,0.01l4.1,1.71
+ c1.06-1.23,2.21-2.38,3.44-3.43l-1.69-4.1c-0.44-1.06-0.43-2.23,0.01-3.29s1.27-1.88,2.33-2.32l10-4.1
+ c2.19-0.9,4.71,0.15,5.61,2.34l1.69,4.1c1.61-0.12,3.24-0.11,4.86,0.02l1.71-4.1c0.44-1.06,1.27-1.88,2.33-2.32
+ c1.06-0.44,2.23-0.43,3.29,0.01l9.97,4.17c1.06,0.44,1.88,1.27,2.32,2.33c0.44,1.06,0.43,2.23-0.01,3.29l-1.71,4.1
+ c1.23,1.06,2.38,2.21,3.43,3.44l4.1-1.69c1.06-0.44,2.23-0.43,3.29,0.01c1.06,0.44,1.88,1.27,2.32,2.33l4.1,9.99
+ c0.44,1.06,0.43,2.23-0.01,3.29s-1.27,1.88-2.33,2.32l-4.1,1.69c0.12,1.61,0.11,3.24-0.02,4.86l4.1,1.71
+ c2.19,0.91,3.22,3.44,2.31,5.62l-4.17,9.97c-0.91,2.19-3.44,3.22-5.62,2.31l-4.1-1.71c-1.06,1.23-2.21,2.38-3.44,3.43l1.69,4.1
+ c0.44,1.06,0.43,2.23-0.01,3.29c-0.44,1.06-1.27,1.88-2.33,2.32l-10,4.1C53.1,81.88,52.54,81.99,51.99,81.99z M46.77,70.18
+ c1.75,0,3.33,1.03,4,2.66l1.61,3.93l8.7-3.57l-1.61-3.93c-0.72-1.75-0.21-3.75,1.27-4.97c1.25-1.03,2.42-2.2,3.47-3.46
+ c1.22-1.47,3.2-1.97,4.95-1.24l3.95,1.65l3.62-8.67l-3.95-1.65c-1.74-0.73-2.78-2.49-2.59-4.39c0.16-1.63,0.17-3.28,0.02-4.9
+ c-0.17-1.91,0.89-3.68,2.64-4.4l3.93-1.61l-3.57-8.7l-3.93,1.61c-1.75,0.72-3.75,0.21-4.97-1.27c-1.03-1.25-2.2-2.42-3.46-3.47
+ c-1.47-1.22-1.97-3.21-1.24-4.94l1.65-3.95l-8.67-3.62l-1.65,3.95c-0.73,1.74-2.49,2.78-4.39,2.59c-1.63-0.16-3.28-0.17-4.9-0.02
+ c-1.91,0.16-3.68-0.89-4.4-2.64l-1.61-3.93l-8.7,3.57l1.61,3.93c0.72,1.75,0.21,3.75-1.27,4.97c-1.25,1.04-2.42,2.2-3.47,3.46
+ c-1.22,1.47-3.21,1.97-4.95,1.24l-3.95-1.65l-3.62,8.67l3.95,1.65c1.74,0.73,2.78,2.49,2.59,4.39c-0.16,1.63-0.17,3.28-0.02,4.9
+ c0.17,1.91-0.89,3.68-2.64,4.4l-3.93,1.61l3.57,8.7l3.93-1.61c1.75-0.72,3.75-0.21,4.97,1.27c1.04,1.25,2.2,2.42,3.46,3.47
+ c1.47,1.22,1.97,3.21,1.24,4.95l-1.65,3.95l8.67,3.62l1.65-3.95c0.73-1.74,2.49-2.79,4.39-2.59c1.63,0.16,3.28,0.17,4.9,0.02
+ C46.5,70.19,46.63,70.18,46.77,70.18z M77.04,36.27C77.04,36.27,77.04,36.28,77.04,36.27L77.04,36.27z"/>
+ </g>
+ <g>
+ <path fill="#ED6B21" d="M44,60.91c-2.21,0-4.42-0.44-6.52-1.32c-4.17-1.74-7.4-5-9.12-9.17c-1.71-4.18-1.7-8.77,0.04-12.93
+ s5-7.4,9.17-9.12c4.18-1.71,8.77-1.7,12.93,0.04c4.17,1.74,7.4,5,9.12,9.17c1.71,4.18,1.7,8.77-0.04,12.93s-5,7.4-9.17,9.12
+ C48.35,60.48,46.17,60.91,44,60.91z M44,32.09c-1.53,0-3.06,0.3-4.52,0.9c-2.94,1.21-5.23,3.49-6.46,6.42s-1.24,6.17-0.03,9.11
+ c1.21,2.94,3.49,5.23,6.42,6.46c2.93,1.23,6.17,1.23,9.11,0.03c2.94-1.21,5.23-3.49,6.46-6.42s1.24-6.17,0.03-9.11l0,0
+ c-1.21-2.94-3.49-5.23-6.42-6.46C47.11,32.4,45.56,32.09,44,32.09z"/>
+ </g>
+ </g>
+ <g>
+ <g>
+ <path fill="#FFFFFF" d="M97.4,122.5h-7.98c-2.11,0-3.83-1.72-3.83-3.83v-2.81c-0.86-0.3-1.71-0.65-2.53-1.05l-1.99,1.99
+ c-1.49,1.49-3.92,1.49-5.41,0l-5.64-5.65c-0.72-0.72-1.12-1.68-1.12-2.71c0-1.02,0.4-1.98,1.12-2.71l1.99-1.99
+ c-0.4-0.82-0.75-1.67-1.05-2.53h-2.81c-2.11,0-3.83-1.72-3.83-3.83v-7.98c0-2.11,1.72-3.83,3.83-3.83h2.81
+ c0.3-0.86,0.65-1.71,1.05-2.53l-1.99-1.99c-1.49-1.49-1.49-3.92,0-5.41l5.64-5.64c1.49-1.49,3.92-1.49,5.41,0L83.06,72
+ c0.82-0.4,1.67-0.75,2.53-1.05v-2.81c0-2.11,1.72-3.83,3.83-3.83h7.98c2.11,0,3.83,1.72,3.83,3.83v2.81
+ c0.86,0.3,1.71,0.65,2.53,1.05l1.99-1.99c1.45-1.45,3.97-1.45,5.41,0l5.64,5.64c1.49,1.49,1.49,3.92,0,5.41l-1.99,1.99
+ c0.4,0.83,0.75,1.67,1.05,2.53h2.81c2.11,0,3.83,1.72,3.83,3.83v7.98c0,2.11-1.72,3.83-3.83,3.83h-2.81
+ c-0.3,0.86-0.65,1.71-1.05,2.53l1.99,1.99c0.72,0.72,1.12,1.68,1.12,2.71c0,1.02-0.4,1.99-1.12,2.71l-5.64,5.64
+ c-1.44,1.44-3.97,1.45-5.41,0l-1.99-1.99c-0.83,0.4-1.67,0.75-2.53,1.05v2.81C101.22,120.78,99.51,122.5,97.4,122.5z
+ M90.59,117.5h5.64v-2.49c0-1.69,1.1-3.16,2.73-3.67c1.11-0.34,2.19-0.79,3.23-1.34c1.5-0.8,3.3-0.53,4.49,0.65l1.78,1.78
+ l3.99-3.99l-1.78-1.77c-1.19-1.19-1.45-3-0.66-4.5c0.55-1.04,1-2.12,1.34-3.23c0.51-1.63,1.98-2.73,3.67-2.73h2.49v-5.64h-2.49
+ c-1.69,0-3.16-1.1-3.67-2.73c-0.34-1.11-0.79-2.19-1.34-3.23c-0.8-1.5-0.53-3.31,0.66-4.49l1.78-1.78l-3.99-3.99l-1.78,1.78
+ c-1.19,1.19-3,1.45-4.5,0.65c-1.03-0.55-2.12-1-3.23-1.34c-1.63-0.51-2.73-1.98-2.73-3.67v-2.49h-5.64v2.49
+ c0,1.69-1.1,3.16-2.73,3.67c-1.11,0.34-2.19,0.79-3.23,1.34c-1.5,0.8-3.31,0.53-4.5-0.66l-1.77-1.77l-3.99,3.99l1.78,1.78
+ c1.19,1.19,1.45,2.99,0.65,4.5c-0.55,1.03-1,2.12-1.34,3.23c-0.51,1.63-1.98,2.73-3.67,2.73h-2.49v5.64h2.49
+ c1.69,0,3.16,1.1,3.67,2.73c0.34,1.11,0.8,2.2,1.34,3.23c0.8,1.5,0.53,3.3-0.66,4.49l-1.78,1.78l3.99,3.99l1.78-1.78
+ c1.19-1.19,2.99-1.45,4.49-0.66c1.04,0.55,2.13,1,3.23,1.34c1.63,0.51,2.73,1.98,2.73,3.67V117.5z M72.39,104.52
+ C72.39,104.52,72.39,104.53,72.39,104.52C72.39,104.53,72.39,104.52,72.39,104.52z M72.62,83.67
+ C72.62,83.67,72.62,83.67,72.62,83.67L72.62,83.67z M104.52,72.39C104.52,72.39,104.52,72.39,104.52,72.39
+ C104.52,72.39,104.52,72.39,104.52,72.39z"/>
+ </g>
+ <g>
+ <path fill="#FFFFFF" d="M93.41,106.54c-7.24,0-13.14-5.89-13.14-13.14s5.89-13.14,13.14-13.14s13.14,5.89,13.14,13.14
+ S100.65,106.54,93.41,106.54z M93.41,85.27c-4.49,0-8.14,3.65-8.14,8.14s3.65,8.14,8.14,8.14s8.14-3.65,8.14-8.14
+ S97.89,85.27,93.41,85.27z"/>
+ </g>
+ </g>
+</g>
+</svg>
diff --git a/resources/icons/splashscreen-gcodepreview.jpg b/resources/icons/splashscreen-gcodepreview.jpg
new file mode 100644
index 000000000..3bae38493
--- /dev/null
+++ b/resources/icons/splashscreen-gcodepreview.jpg
Binary files differ
diff --git a/resources/icons/splashscreen.jpg b/resources/icons/splashscreen.jpg
new file mode 100644
index 000000000..754e24588
--- /dev/null
+++ b/resources/icons/splashscreen.jpg
Binary files differ
diff --git a/resources/icons/split_objects.svg b/resources/icons/split_objects.svg
index a7ccc5df8..e822fd35a 100644
--- a/resources/icons/split_objects.svg
+++ b/resources/icons/split_objects.svg
@@ -1,19 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
-<g id="OBJECTS">
+<g id="split_x5F_objects">
<g>
- <path fill="#FFFFFF" d="M34.63,91.95h-17.3c-4.96,0-9-4.04-9-9V17.28c0-4.96,4.04-9,9-9H83c4.96,0,9,4.04,9,9v17.3
- c0,1.66-1.34,3-3,3s-3-1.34-3-3v-17.3c0-1.65-1.35-3-3-3H17.32c-1.65,0-3,1.35-3,3v65.67c0,1.65,1.35,3,3,3h17.3
- c1.66,0,3,1.34,3,3S36.28,91.95,34.63,91.95z"/>
+ <path fill="#FFFFFF" d="M32,90.5H8c-1.38,0-2.5-1.12-2.5-2.5V8c0-1.38,1.12-2.5,2.5-2.5h80c1.38,0,2.5,1.12,2.5,2.5v24
+ c0,1.38-1.12,2.5-2.5,2.5s-2.5-1.12-2.5-2.5V10.5h-75v75H32c1.38,0,2.5,1.12,2.5,2.5S33.38,90.5,32,90.5z"/>
</g>
<g>
- <path fill="#ED6B21" d="M114.89,42.35H47.57c-2.85,0-5.18,2.33-5.18,5.18v67.32c0,2.85,2.33,5.18,5.18,5.18h67.32
- c2.85,0,5.18-2.33,5.18-5.18V47.52C120.07,44.68,117.74,42.35,114.89,42.35z M101.82,94.28c0,12.63-6.35,18.27-20.89,18.27
- s-20.42-5.64-20.42-18.27v-25.9c0-12.95,5.64-18.27,20.42-18.27c14.77,0,20.89,5.32,20.89,18.27V94.28z"/>
- <path fill="#ED6B21" d="M80.93,59.8c-7.94,0-9.45,3.58-9.45,9.14v24.78c0,5.8,1.51,9.13,9.45,9.13s9.93-3.33,9.93-9.13V68.94
- C90.86,63.38,89.43,59.8,80.93,59.8z"/>
+ <path fill="#ED6B21" d="M120,122.5H40c-1.38,0-2.5-1.12-2.5-2.5V40c0-1.38,1.12-2.5,2.5-2.5h80c1.38,0,2.5,1.12,2.5,2.5v80
+ C122.5,121.38,121.38,122.5,120,122.5z M42.5,117.5h75v-75h-75V117.5z"/>
+ </g>
+ <g>
+ <path fill="#ED6B21" d="M86,106.5H74c-6.89,0-12.5-5.61-12.5-12.5V66c0-6.89,5.61-12.5,12.5-12.5h12c6.89,0,12.5,5.61,12.5,12.5
+ v28C98.5,100.89,92.89,106.5,86,106.5z M74,58.5c-4.14,0-7.5,3.36-7.5,7.5v28c0,4.14,3.36,7.5,7.5,7.5h12c4.14,0,7.5-3.36,7.5-7.5
+ V66c0-4.14-3.36-7.5-7.5-7.5H74z"/>
</g>
</g>
</svg>
diff --git a/resources/icons/split_parts.svg b/resources/icons/split_parts.svg
index 82a292770..5cfef0f33 100644
--- a/resources/icons/split_parts.svg
+++ b/resources/icons/split_parts.svg
@@ -1,18 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 23.0.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
-<g id="PARTS">
+<g id="split_x5F_parts_1_">
<g>
- <path fill="#FFFFFF" d="M34.63,91.95h-17.3c-4.96,0-9-4.04-9-9V17.28c0-4.96,4.04-9,9-9H83c4.96,0,9,4.04,9,9v17.3
- c0,1.66-1.34,3-3,3s-3-1.34-3-3v-17.3c0-1.65-1.35-3-3-3H17.32c-1.65,0-3,1.35-3,3v65.67c0,1.65,1.35,3,3,3h17.3
- c1.66,0,3,1.34,3,3S36.28,91.95,34.63,91.95z"/>
+ <path fill="#FFFFFF" d="M32,90.5H8c-1.38,0-2.5-1.12-2.5-2.5V8c0-1.38,1.12-2.5,2.5-2.5h80c1.38,0,2.5,1.12,2.5,2.5v24
+ c0,1.38-1.12,2.5-2.5,2.5s-2.5-1.12-2.5-2.5V10.5h-75v75H32c1.38,0,2.5,1.12,2.5,2.5S33.38,90.5,32,90.5z"/>
</g>
<g>
- <path fill="#ED6B21" d="M114.91,42.32H47.57c-2.85,0-5.18,2.33-5.18,5.18v67.34c0,2.85,2.33,5.18,5.18,5.18h67.34
- c2.85,0,5.18-2.33,5.18-5.18V47.5C120.09,44.65,117.76,42.32,114.91,42.32z M99.95,74.39c0,12.84-7.27,18.81-22.04,18.81h-4.28
- v19.05H62.25V50.09h15.66c15.02,0,22.04,5.41,22.04,18.57C99.95,68.66,99.95,74.39,99.95,74.39z"/>
- <path fill="#ED6B21" d="M78.07,60.26h-4.52v22.2h4.36c8.08,0,10.74-2.74,10.74-8.64v-4.6C88.65,63.33,86.71,60.26,78.07,60.26z"/>
+ <path fill="#ED6B21" d="M120,122.5H40c-1.38,0-2.5-1.12-2.5-2.5V40c0-1.38,1.12-2.5,2.5-2.5h80c1.38,0,2.5,1.12,2.5,2.5v80
+ C122.5,121.38,121.38,122.5,120,122.5z M42.5,117.5h75v-75h-75V117.5z"/>
+ </g>
+ <g>
+ <path fill="#ED6B21" d="M64,106.5c-1.38,0-2.5-1.12-2.5-2.5V61c0-4.14,3.36-7.5,7.5-7.5h17c6.89,0,12.5,5.61,12.5,12.5v4
+ c0,6.89-5.61,12.5-12.5,12.5H66.5V104C66.5,105.38,65.38,106.5,64,106.5z M66.5,77.5H86c4.14,0,7.5-3.36,7.5-7.5v-4
+ c0-4.14-3.36-7.5-7.5-7.5H69c-1.38,0-2.5,1.12-2.5,2.5V77.5z"/>
</g>
</g>
</svg>
diff --git a/resources/icons/switch_presets.svg b/resources/icons/switch_presets.svg
new file mode 100644
index 000000000..a5f3fbefb
--- /dev/null
+++ b/resources/icons/switch_presets.svg
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="change_x5F_profile_copy" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ x="0px" y="0px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve">
+<rect x="-45" y="5" display="none" fill="#FFFFFF" width="55" height="90"/>
+<rect x="90" y="5" transform="matrix(-1 -1.224647e-16 1.224647e-16 -1 235 100)" display="none" fill="#FFFFFF" width="55" height="90"/>
+<path fill="#ED6B21" d="M88.52,28.64c-1.25-0.94-3.03-0.69-3.97,0.57l-1.72,2.29V15c0-1.57-1.27-2.83-2.83-2.83H65
+ c-1.57,0-2.83,1.27-2.83,2.83s1.27,2.83,2.83,2.83h12.17V31.5l-1.72-2.29c-0.94-1.25-2.72-1.5-3.97-0.57
+ c-1.25,0.94-1.51,2.72-0.57,3.97l6.82,9.09c0.54,0.71,1.38,1.13,2.27,1.13s1.73-0.42,2.27-1.13l6.82-9.09
+ C90.03,31.36,89.77,29.58,88.52,28.64z"/>
+<path fill="#ED6B21" d="M35,82.17H22.83V68.5l1.72,2.29c0.56,0.74,1.41,1.13,2.27,1.13c0.59,0,1.19-0.18,1.7-0.57
+ c1.25-0.94,1.51-2.72,0.57-3.97l-6.82-9.09c-0.54-0.71-1.38-1.13-2.27-1.13s-1.73,0.42-2.27,1.13l-6.82,9.09
+ c-0.94,1.25-0.69,3.03,0.57,3.97c1.25,0.94,3.03,0.69,3.97-0.57l1.72-2.29V85c0,1.57,1.27,2.83,2.83,2.83h15
+ c1.57,0,2.83-1.27,2.83-2.83S36.57,82.17,35,82.17z"/>
+<polyline display="none" fill="none" stroke="#ED6B21" stroke-width="11.3386" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
+ 35,65 15,50 35,35 "/>
+<g>
+ <path fill="#808080" d="M50.01,41.11c0-0.75-0.3-1.47-0.83-2l-1.99-1.99H50c1.57,0,2.83-1.27,2.83-2.83v-8.57
+ c0-1.57-1.27-2.83-2.83-2.83h-2.81l1.99-1.99c0.53-0.53,0.83-1.25,0.83-2s-0.3-1.47-0.83-2l-6.06-6.06c-1.06-1.06-2.95-1.06-4.01,0
+ l-1.99,1.99V10c0-1.57-1.27-2.83-2.83-2.83h-8.57c-1.57,0-2.83,1.27-2.83,2.83v2.81l-1.99-1.99c-0.53-0.53-1.25-0.83-2-0.83
+ s-1.47,0.3-2,0.83l-6.06,6.06c-0.53,0.53-0.83,1.25-0.83,2s0.3,1.47,0.83,2l1.99,1.99H10c-1.57,0-2.83,1.27-2.83,2.83v8.57
+ c0,1.57,1.27,2.83,2.83,2.83h2.81l-1.99,1.99c-0.53,0.53-0.83,1.25-0.83,2s0.3,1.47,0.83,2l6.06,6.06c1.11,1.11,2.9,1.11,4.01,0
+ l1.99-1.99V50c0,1.57,1.27,2.83,2.83,2.83h8.57c1.57,0,2.83-1.27,2.83-2.83v-2.81l1.99,1.99c1.11,1.11,2.9,1.11,4.01,0l6.06-6.06
+ C49.71,42.58,50.01,41.86,50.01,41.11z M47.17,31.45h-2.05c-1.27,0-2.38,0.84-2.73,2.06c-0.27,0.96-0.66,1.89-1.14,2.76
+ c-0.62,1.11-0.43,2.49,0.47,3.39l1.45,1.45l-2.05,2.05l-1.45-1.45c-0.9-0.9-2.28-1.09-3.39-0.47c-0.87,0.49-1.8,0.87-2.76,1.14
+ c-1.22,0.35-2.06,1.46-2.06,2.73v2.05h-2.9v-2.05c0-1.27-0.84-2.38-2.06-2.73c-0.96-0.27-1.89-0.66-2.76-1.14
+ c-1.11-0.62-2.49-0.43-3.39,0.47l-1.45,1.45l-2.05-2.05l1.45-1.45c0.9-0.9,1.09-2.28,0.47-3.39c-0.49-0.87-0.87-1.8-1.14-2.76
+ c-0.35-1.22-1.46-2.06-2.73-2.06h-2.05v-2.9h2.05c1.27,0,2.38-0.84,2.73-2.06c0.27-0.96,0.66-1.89,1.14-2.76
+ c0.62-1.11,0.43-2.49-0.47-3.39l-1.45-1.45l2.05-2.05l1.45,1.45c0.9,0.9,2.28,1.09,3.39,0.47c0.87-0.49,1.8-0.87,2.76-1.14
+ c1.22-0.35,2.06-1.46,2.06-2.73v-2.05h2.9v2.05c0,1.27,0.84,2.38,2.06,2.73c0.96,0.27,1.89,0.66,2.76,1.14
+ c1.11,0.62,2.49,0.43,3.39-0.47l1.45-1.45l2.05,2.05l-1.45,1.45c-0.9,0.9-1.09,2.28-0.47,3.39c0.49,0.87,0.87,1.8,1.14,2.76
+ c0.35,1.22,1.46,2.06,2.73,2.06h2.05V31.45z"/>
+ <path fill="#808080" d="M90,62.88h-2.81l1.99-1.99c1.11-1.11,1.11-2.9,0-4.01l-6.06-6.06c-1.11-1.11-2.9-1.11-4.01,0l-1.99,1.99V50
+ c0-1.57-1.27-2.83-2.83-2.83h-8.57c-1.57,0-2.83,1.27-2.83,2.83v2.81l-1.99-1.99c-1.11-1.11-2.9-1.11-4.01,0l-6.06,6.06
+ c-1.11,1.11-1.11,2.9,0,4.01l1.99,1.99H50c-1.57,0-2.83,1.27-2.83,2.83v8.57c0,1.57,1.27,2.83,2.83,2.83h2.81l-1.99,1.99
+ c-1.11,1.11-1.11,2.9,0,4.01l6.06,6.06c1.11,1.11,2.9,1.11,4.01,0l1.99-1.99V90c0,1.57,1.27,2.83,2.83,2.83h8.57
+ c1.57,0,2.83-1.27,2.83-2.83v-2.81l1.99,1.99c1.11,1.11,2.9,1.11,4.01,0l6.06-6.06c1.11-1.11,1.11-2.9,0-4.01l-1.99-1.99H90
+ c1.57,0,2.83-1.27,2.83-2.83v-8.57C92.83,64.15,91.57,62.88,90,62.88z M87.17,71.45h-2.05c-1.27,0-2.38,0.84-2.73,2.06
+ c-0.27,0.96-0.66,1.89-1.14,2.76c-0.62,1.11-0.43,2.49,0.47,3.39l1.45,1.45l-2.05,2.05l-1.45-1.45c-0.9-0.9-2.28-1.09-3.39-0.47
+ c-0.87,0.49-1.8,0.87-2.76,1.15c-1.22,0.35-2.06,1.46-2.06,2.73v2.05h-2.9v-2.05c0-1.27-0.84-2.38-2.06-2.73
+ c-0.96-0.27-1.89-0.66-2.76-1.15c-1.11-0.62-2.49-0.43-3.39,0.47l-1.45,1.45l-2.05-2.05l1.45-1.45c0.9-0.9,1.09-2.28,0.47-3.39
+ c-0.49-0.87-0.87-1.8-1.14-2.76c-0.35-1.22-1.46-2.06-2.73-2.06h-2.05v-2.9h2.05c1.27,0,2.38-0.84,2.73-2.06
+ c0.27-0.96,0.66-1.89,1.14-2.76c0.62-1.11,0.43-2.49-0.47-3.39l-1.45-1.45l2.05-2.05l1.45,1.45c0.9,0.9,2.28,1.09,3.39,0.47
+ c0.87-0.49,1.8-0.87,2.76-1.14c1.22-0.35,2.06-1.46,2.06-2.73v-2.05h2.9v2.05c0,1.27,0.84,2.38,2.06,2.73
+ c0.96,0.27,1.89,0.66,2.76,1.14c1.11,0.62,2.49,0.43,3.39-0.47l1.45-1.45l2.05,2.05l-1.45,1.45c-0.9,0.9-1.09,2.28-0.47,3.39
+ c0.49,0.87,0.87,1.8,1.14,2.76c0.35,1.22,1.46,2.06,2.73,2.06h2.05V71.45z"/>
+ <path fill="#808080" d="M30,22.17c-4.32,0-7.83,3.51-7.83,7.83s3.51,7.83,7.83,7.83s7.83-3.51,7.83-7.83S34.32,22.17,30,22.17z
+ M30,32.17c-1.19,0-2.17-0.97-2.17-2.17s0.97-2.17,2.17-2.17s2.17,0.97,2.17,2.17S31.19,32.17,30,32.17z"/>
+ <path fill="#808080" d="M70,62.17c-4.32,0-7.83,3.51-7.83,7.83s3.51,7.83,7.83,7.83s7.83-3.51,7.83-7.83S74.32,62.17,70,62.17z
+ M70,72.17c-1.19,0-2.17-0.97-2.17-2.17s0.97-2.17,2.17-2.17s2.17,0.97,2.17,2.17S71.19,72.17,70,72.17z"/>
+</g>
+</svg>
diff --git a/resources/icons/thumb_left.svg b/resources/icons/thumb_left.svg
new file mode 100644
index 000000000..ef78bd141
--- /dev/null
+++ b/resources/icons/thumb_left.svg
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
+ sodipodi:docname="thumb_left.svg"
+ xml:space="preserve"
+ enable-background="new 0 0 16 16"
+ viewBox="0 0 16 16"
+ y="0px"
+ x="0px"
+ id="Layer_1"
+ version="1.0"><metadata
+ id="metadata32"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs30" /><sodipodi:namedview
+ inkscape:current-layer="Layer_1"
+ inkscape:window-maximized="0"
+ inkscape:window-y="0"
+ inkscape:window-x="1268"
+ inkscape:cy="8"
+ inkscape:cx="8"
+ inkscape:zoom="63"
+ showgrid="false"
+ id="namedview28"
+ inkscape:window-height="1368"
+ inkscape:window-width="1283"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0"
+ guidetolerance="10"
+ gridtolerance="10"
+ objecttolerance="10"
+ borderopacity="1"
+ bordercolor="#666666"
+ pagecolor="#ffffff" />
+<g
+ transform="rotate(-90,8.0158731,7.984127)"
+ id="hex_x5F_plus">
+ <g
+ id="g24">
+ <polygon
+ id="polygon22"
+ style="stroke:#ffffff;stroke-width:1"
+ points="15,7 15,5 8,0 1,5 1,7 1,8 15,8 "
+ fill="#ed6b21" />
+ </g>
+</g>
+</svg>
diff --git a/resources/icons/thumb_right.svg b/resources/icons/thumb_right.svg
new file mode 100644
index 000000000..f3748525d
--- /dev/null
+++ b/resources/icons/thumb_right.svg
@@ -0,0 +1,54 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
+ sodipodi:docname="thumb_right.svg"
+ xml:space="preserve"
+ enable-background="new 0 0 16 16"
+ viewBox="0 0 16 16"
+ y="0px"
+ x="0px"
+ id="Layer_1"
+ version="1.0"><metadata
+ id="metadata32"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs30" /><sodipodi:namedview
+ inkscape:current-layer="Layer_1"
+ inkscape:window-maximized="0"
+ inkscape:window-y="0"
+ inkscape:window-x="1268"
+ inkscape:cy="8"
+ inkscape:cx="8"
+ inkscape:zoom="63"
+ showgrid="false"
+ id="namedview28"
+ inkscape:window-height="1368"
+ inkscape:window-width="1283"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0"
+ guidetolerance="10"
+ gridtolerance="10"
+ objecttolerance="10"
+ borderopacity="1"
+ bordercolor="#666666"
+ pagecolor="#ffffff" />
+<g
+ transform="matrix(0,-1,-1,0,16.012532,16)"
+ id="hex_x5F_plus">
+ <g
+ id="g24">
+ <polygon
+ id="polygon22"
+ style="stroke:#ffffff;stroke-width:1"
+ points="15,8 15,7 15,5 8,0 1,5 1,7 1,8 "
+ fill="#ed6b21" />
+ </g>
+</g>
+</svg>
diff --git a/resources/icons/tick_mark.svg b/resources/icons/tick_mark.svg
new file mode 100644
index 000000000..4ccab2192
--- /dev/null
+++ b/resources/icons/tick_mark.svg
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg version="1.1" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg">
+ <g transform="translate(0 -292.77)">
+ <path d="m2.2728 301.7 3.2932 4.8789 8.3542-11.435" fill="none" stroke="#00af00" stroke-linecap="round" stroke-linejoin="round" stroke-width="1.9994"/>
+ </g>
+</svg>
diff --git a/resources/icons/timer_dot.svg b/resources/icons/timer_dot.svg
new file mode 100644
index 000000000..3a77962b6
--- /dev/null
+++ b/resources/icons/timer_dot.svg
@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
+ sodipodi:docname="timer_dot.svg"
+ xml:space="preserve"
+ enable-background="new 0 0 16 16"
+ viewBox="0 0 16 16"
+ y="0px"
+ x="0px"
+ id="Layer_1"
+ version="1.0"><metadata
+ id="metadata11"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><defs
+ id="defs9"><linearGradient
+ id="linearGradient830"
+ inkscape:collect="always"><stop
+ id="stop826"
+ offset="0"
+ style="stop-color:#000000;stop-opacity:1;" /><stop
+ id="stop828"
+ offset="1"
+ style="stop-color:#000000;stop-opacity:0;" /></linearGradient><radialGradient
+ gradientUnits="userSpaceOnUse"
+ r="3.5"
+ fy="8"
+ fx="8"
+ cy="8"
+ cx="8"
+ id="radialGradient832"
+ xlink:href="#linearGradient830"
+ inkscape:collect="always" /></defs><sodipodi:namedview
+ inkscape:document-rotation="0"
+ inkscape:current-layer="Layer_1"
+ inkscape:window-maximized="1"
+ inkscape:window-y="-11"
+ inkscape:window-x="-11"
+ inkscape:cy="6.66147"
+ inkscape:cx="7.0304602"
+ inkscape:zoom="83.4386"
+ showgrid="false"
+ id="namedview7"
+ inkscape:window-height="2066"
+ inkscape:window-width="3840"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0"
+ guidetolerance="10"
+ gridtolerance="10"
+ objecttolerance="10"
+ borderopacity="1"
+ bordercolor="#666666"
+ pagecolor="#ffffff" />
+<g
+ transform="matrix(0.7,0,0,0.7,2.4,2.4)"
+ style="fill:#bf6637;fill-opacity:1;stroke:none;stroke-opacity:1"
+ id="g4">
+ <circle
+ style="fill:#bf6637;fill-opacity:1;stroke:none;stroke-opacity:1"
+ id="circle2"
+ r="3"
+ cy="8"
+ cx="8" />
+</g>
+</svg>
diff --git a/resources/icons/timer_dot_empty.svg b/resources/icons/timer_dot_empty.svg
new file mode 100644
index 000000000..a8e776b49
--- /dev/null
+++ b/resources/icons/timer_dot_empty.svg
@@ -0,0 +1,73 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:xlink="http://www.w3.org/1999/xlink"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.0"
+ id="Layer_1"
+ x="0px"
+ y="0px"
+ viewBox="0 0 16 16"
+ enable-background="new 0 0 16 16"
+ xml:space="preserve"
+ sodipodi:docname="timer_dot_empty.svg"
+ inkscape:version="0.92.4 (5da689c313, 2019-01-14)"><metadata
+ id="metadata11"><rdf:RDF><cc:Work
+ rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+ id="defs9"><linearGradient
+ inkscape:collect="always"
+ id="linearGradient830"><stop
+ style="stop-color:#000000;stop-opacity:1;"
+ offset="0"
+ id="stop826" /><stop
+ style="stop-color:#000000;stop-opacity:0;"
+ offset="1"
+ id="stop828" /></linearGradient><radialGradient
+ inkscape:collect="always"
+ xlink:href="#linearGradient830"
+ id="radialGradient832"
+ cx="8"
+ cy="8"
+ fx="8"
+ fy="8"
+ r="3.5"
+ gradientUnits="userSpaceOnUse" /></defs><sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="3840"
+ inkscape:window-height="2066"
+ id="namedview7"
+ showgrid="false"
+ inkscape:zoom="83.4386"
+ inkscape:cx="7.0304602"
+ inkscape:cy="6.66147"
+ inkscape:window-x="-11"
+ inkscape:window-y="-11"
+ inkscape:window-maximized="1"
+ inkscape:current-layer="Layer_1" />
+<g
+ id="g4"
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-opacity:1"
+ transform="matrix(0.7,0,0,0.7,2.4,2.4)">
+ <circle
+ cx="8"
+ cy="8"
+ r="3"
+ id="circle2"
+ style="fill:#000000;fill-opacity:1;stroke:none;stroke-opacity:1" />
+</g>
+</svg> \ No newline at end of file
diff --git a/resources/icons/undo_toolbar.svg b/resources/icons/undo_toolbar.svg
index 15778a7ba..2fc25bf73 100644
--- a/resources/icons/undo_toolbar.svg
+++ b/resources/icons/undo_toolbar.svg
@@ -1,13 +1,17 @@
<?xml version="1.0" encoding="utf-8"?>
-<!-- Generator: Adobe Illustrator 23.0.6, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
- viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
-<path id="undo_1_" fill="#ED6B21" d="M14.05,7.01H3.82l3.32-4.51c0.31-0.42,0.22-1.01-0.2-1.32c-0.42-0.31-1.01-0.22-1.32,0.2
- L1.18,7.4c0,0.01-0.01,0.01-0.01,0.02C1.17,7.43,1.16,7.44,1.15,7.46C1.13,7.48,1.12,7.5,1.11,7.53C1.1,7.54,1.09,7.56,1.08,7.58
- C1.08,7.59,1.07,7.61,1.06,7.62C1.06,7.65,1.05,7.67,1.04,7.69C1.04,7.71,1.03,7.73,1.02,7.75c0,0.01,0,0.03-0.01,0.04
- c0,0.02-0.01,0.05-0.01,0.07C1.01,7.89,1,7.92,1,7.94c0,0.01,0,0.01,0,0.02c0,0.01,0,0.01,0,0.02c0,0.02,0,0.05,0.01,0.07
- c0,0.02,0,0.05,0.01,0.07c0,0.01,0,0.03,0.01,0.04c0,0.02,0.01,0.04,0.02,0.06C1.05,8.26,1.06,8.28,1.07,8.3
- c0.01,0.01,0.01,0.03,0.02,0.04C1.09,8.36,1.1,8.38,1.11,8.4c0.01,0.02,0.02,0.04,0.04,0.07c0.01,0.01,0.02,0.03,0.03,0.04
- c0,0.01,0.01,0.01,0.01,0.02l4.54,6.05c0.19,0.25,0.47,0.38,0.76,0.38c0.2,0,0.4-0.06,0.57-0.19c0.42-0.31,0.5-0.91,0.19-1.32
- L3.84,8.91h10.22c0.52,0,0.95-0.42,0.95-0.95C15,7.44,14.58,7.01,14.05,7.01z"/>
+ viewBox="0 0 128 128" enable-background="new 0 0 128 128" xml:space="preserve">
+<g id="redo">
+ <g>
+ <path fill="#ED6B21" d="M36.57,72.21c0.73,0,1.46-0.32,1.95-0.94c0.86-1.08,0.69-2.65-0.39-3.51L12,46.86l26.13-20.9
+ c1.08-0.86,1.25-2.44,0.39-3.51c-0.86-1.08-2.43-1.25-3.51-0.39L6.44,44.9C5.85,45.38,5.5,46.1,5.5,46.86s0.35,1.48,0.94,1.95
+ l28.57,22.86C35.47,72.04,36.02,72.21,36.57,72.21z"/>
+ </g>
+ <g>
+ <path fill="#ED6B21" d="M48,106.5h43.43c17.13,0,31.07-13.94,31.07-31.07s-13.94-31.07-31.07-31.07H8c-1.38,0-2.5,1.12-2.5,2.5
+ s1.12,2.5,2.5,2.5h83.43c14.38,0,26.07,11.7,26.07,26.07s-11.7,26.07-26.07,26.07H48c-1.38,0-2.5,1.12-2.5,2.5
+ S46.62,106.5,48,106.5z"/>
+ </g>
+</g>
</svg>
diff --git a/resources/icons/white/dot.svg b/resources/icons/white/dot.svg
new file mode 100644
index 000000000..90fbaf7fb
--- /dev/null
+++ b/resources/icons/white/dot.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
+<g>
+ <circle fill="#FFFFFF" cx="8" cy="8" r="3"/>
+</g>
+</svg>
diff --git a/resources/icons/white/dot_small.svg b/resources/icons/white/dot_small.svg
new file mode 100644
index 000000000..74df44208
--- /dev/null
+++ b/resources/icons/white/dot_small.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
+<g>
+ <circle fill="#FFFFFF" cx="8" cy="8" r="2"/>
+</g>
+</svg>
diff --git a/resources/icons/white/drop_to_bed.svg b/resources/icons/white/drop_to_bed.svg
new file mode 100644
index 000000000..76243f897
--- /dev/null
+++ b/resources/icons/white/drop_to_bed.svg
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
+<g id="modifer_x5F_bed">
+
+ <line fill="none" stroke="#ED6B21" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="2" y1="13" x2="13" y2="13"/>
+ <path fill="#FFFFFF" d="M10.87,7.48c-0.2,0-0.37,0.16-0.37,0.37v1.47v0.74c0,0.2-0.17,0.37-0.37,0.37H4.97
+ c-0.2,0-0.37-0.17-0.37-0.37L4.57,4.91c0-0.1,0.04-0.19,0.11-0.26c0.07-0.07,0.16-0.11,0.26-0.11l2.25,0v0
+ c0.2,0,0.37-0.16,0.37-0.37c0-0.2-0.16-0.37-0.37-0.37H5.71c0,0-0.01,0-0.01,0l-0.76,0c-0.3,0-0.57,0.12-0.78,0.33
+ C3.95,4.34,3.83,4.61,3.83,4.91l0.03,5.15c0,0.61,0.5,1.1,1.11,1.1h5.16c0.61,0,1.11-0.5,1.11-1.11V9.32V7.85
+ C11.24,7.65,11.07,7.48,10.87,7.48z"/>
+ <circle fill="#FFFFFF" stroke="#FFFFFF" stroke-miterlimit="10" cx="10.88" cy="4.12" r="2.12"/>
+</g>
+</svg>
diff --git a/resources/icons/white/edit_uni.svg b/resources/icons/white/edit_uni.svg
new file mode 100644
index 000000000..661924763
--- /dev/null
+++ b/resources/icons/white/edit_uni.svg
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
+<g id="edit_x5F_uni">
+ <path fill="#FFFFFF" d="M8,1.85l5.29,3.53V7v3.62L8,14.15l-5.29-3.53V7V5.38L8,1.85 M8,1L2,5v2v4l6,4l6-4V7V5L8,1L8,1z"/>
+ <path fill="#ED6B21" d="M11.87,7.36l-0.43-0.22c-0.07-0.04-0.16-0.13-0.18-0.21l-0.2-0.48c-0.04-0.07-0.04-0.2-0.02-0.28l0.15-0.46
+ c0.03-0.08,0-0.19-0.06-0.25l-0.6-0.6c-0.06-0.06-0.17-0.08-0.25-0.06L9.83,4.97c-0.08,0.03-0.2,0.02-0.28-0.02l-0.48-0.2
+ C8.99,4.72,8.89,4.64,8.85,4.57L8.64,4.13C8.6,4.06,8.5,4,8.42,4H7.58C7.5,4,7.4,4.06,7.36,4.13L7.15,4.57
+ C7.11,4.64,7.01,4.72,6.94,4.75l-0.48,0.2c-0.07,0.04-0.2,0.04-0.28,0.02L5.72,4.81c-0.08-0.03-0.19,0-0.25,0.06l-0.6,0.6
+ C4.82,5.53,4.79,5.64,4.81,5.72l0.15,0.46c0.03,0.08,0.02,0.2-0.02,0.28l-0.2,0.48C4.72,7.01,4.64,7.11,4.57,7.15L4.13,7.36
+ C4.06,7.4,4,7.5,4,7.58v0.84C4,8.5,4.06,8.6,4.13,8.64l0.43,0.22c0.07,0.04,0.16,0.13,0.18,0.21l0.2,0.48
+ c0.04,0.07,0.04,0.2,0.02,0.28l-0.15,0.46c-0.03,0.08,0,0.19,0.06,0.25l0.6,0.6c0.06,0.06,0.17,0.08,0.25,0.06l0.46-0.15
+ c0.08-0.03,0.2-0.02,0.28,0.02l0.48,0.2c0.08,0.03,0.17,0.11,0.21,0.18l0.22,0.43C7.4,11.94,7.5,12,7.58,12h0.84
+ c0.08,0,0.18-0.06,0.22-0.13l0.22-0.43c0.04-0.07,0.13-0.16,0.21-0.18l0.48-0.2c0.07-0.04,0.2-0.04,0.28-0.02l0.46,0.15
+ c0.08,0.03,0.19,0,0.25-0.06l0.6-0.6c0.06-0.06,0.08-0.17,0.06-0.25l-0.15-0.46c-0.03-0.08-0.02-0.2,0.02-0.28l0.2-0.48
+ c0.03-0.08,0.11-0.17,0.18-0.21l0.43-0.22C11.94,8.6,12,8.5,12,8.42V7.58C12,7.5,11.94,7.4,11.87,7.36z M8,10.29
+ c-1.26,0-2.29-1.03-2.29-2.29c0-1.26,1.03-2.29,2.29-2.29S10.29,6.74,10.29,8C10.29,9.26,9.26,10.29,8,10.29z"/>
+</g>
+</svg>
diff --git a/resources/icons/white/exit.svg b/resources/icons/white/exit.svg
new file mode 100644
index 000000000..e5aebcfc2
--- /dev/null
+++ b/resources/icons/white/exit.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="exit" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve">
+<path fill="#ED6B21" d="M63.4,45.46l-20-15c-2.51-1.88-6.06-1.37-7.94,1.13c-1.88,2.5-1.37,6.06,1.13,7.94l6.39,4.79H10
+ c-3.13,0-5.67,2.54-5.67,5.67s2.54,5.67,5.67,5.67h32.99l-6.39,4.8c-2.5,1.88-3.01,5.43-1.13,7.94c1.11,1.49,2.82,2.27,4.54,2.27
+ c1.18,0,2.38-0.37,3.4-1.13l20-15c1.43-1.07,2.27-2.75,2.27-4.54C65.67,48.22,64.83,46.54,63.4,45.46z"/>
+<g>
+ <path fill="#FFFFFF" d="M90,92.83H40c-1.57,0-2.83-1.27-2.83-2.83V80c0-1.57,1.27-2.83,2.83-2.83s2.83,1.27,2.83,2.83v7.17h44.33
+ V12.83H42.83V20c0,1.57-1.27,2.83-2.83,2.83s-2.83-1.27-2.83-2.83V10c0-1.57,1.27-2.83,2.83-2.83h50c1.57,0,2.83,1.27,2.83,2.83v80
+ C92.83,91.57,91.57,92.83,90,92.83z"/>
+</g>
+</svg>
diff --git a/resources/icons/white/eye_closed.svg b/resources/icons/white/eye_closed.svg
new file mode 100644
index 000000000..0cdd16ae0
--- /dev/null
+++ b/resources/icons/white/eye_closed.svg
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
+<g id="eye_x5F_close">
+ <path fill="none" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
+ M2,8c0,0,2,4,6,4s6-4,6-4s-2-4-6-4S2,8,2,8z"/>
+
+ <circle fill="none" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" cx="8" cy="8" r="1"/>
+
+ <line fill="none" stroke="#ED6B21" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" x1="2" y1="14" x2="14" y2="2"/>
+</g>
+</svg>
diff --git a/resources/icons/white/eye_open.svg b/resources/icons/white/eye_open.svg
new file mode 100644
index 000000000..1b320da07
--- /dev/null
+++ b/resources/icons/white/eye_open.svg
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.4, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
+<g id="eye_x5F_open">
+ <path fill="none" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" d="
+ M2,8c0,0,2,4,6,4s6-4,6-4s-2-4-6-4S2,8,2,8z"/>
+
+ <circle fill="none" stroke="#FFFFFF" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" cx="8" cy="8" r="1"/>
+</g>
+</svg>
diff --git a/resources/icons/white/lock_closed_f.svg b/resources/icons/white/lock_closed_f.svg
new file mode 100644
index 000000000..412c93c16
--- /dev/null
+++ b/resources/icons/white/lock_closed_f.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 23.0.3, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+ viewBox="0 0 16 16" enable-background="new 0 0 16 16" xml:space="preserve">
+<g id="lock_x5F_closed">
+ <path fill="none" stroke="#FFFFFF" stroke-width="3" stroke-miterlimit="9" d="M4,8V4c0,0,0-2,2-2c1,0,3,0,4,0c2,0,2,2,2,2v4"/>
+ <path fill="#FFFFFF" d="M13,8H3C2.45,8,2,8.45,2,9v5c0,0.55,0.45,1,1,1h10c0.55,0,1-0.45,1-1V9C14,8.45,13.55,8,13,8z M10,12H8.91
+ c-0.21,0.58-0.76,1-1.41,1C6.67,13,6,12.33,6,11.5S6.67,10,7.5,10c0.65,0,1.2,0.42,1.41,1H10V12z"/>
+</g>
+</svg>
diff --git a/resources/icons/white/search.svg b/resources/icons/white/search.svg
new file mode 100644
index 000000000..679bb30f7
--- /dev/null
+++ b/resources/icons/white/search.svg
@@ -0,0 +1,4 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" width="24px" height="24px">
+<path fill="#FFFFFF" d="M 13.261719 14.867188 L 15.742188 17.347656 C 15.363281 18.070313 15.324219 18.789063 15.722656 19.1875 L 20.25 23.714844 C 20.820313 24.285156 22.0625 23.972656 23.015625 23.015625 C 23.972656 22.058594 24.285156 20.820313 23.714844 20.25 L 19.191406 15.722656 C 18.789063 15.324219 18.070313 15.363281 17.347656 15.738281 L 14.867188 13.261719 Z M 8.5 0 C 3.804688 0 0 3.804688 0 8.5 C 0 13.195313 3.804688 17 8.5 17 C 13.195313 17 17 13.195313 17 8.5 C 17 3.804688 13.195313 0 8.5 0 Z M 8.5 15 C 4.910156 15 2 12.089844 2 8.5 C 2 4.910156 4.910156 2 8.5 2 C 12.089844 2 15 4.910156 15 8.5 C 15 12.089844 12.089844 15 8.5 15 Z"/>
+<path fill="#ED6B21" d="M 13.261719 14.867188 L 19.191406 15.722656 C 18.789063 15.324219 18.070313 15.363281 17.347656 15.738281 M 8.5 0 C 3.804688 0 0 3.804688 0 8.5 C 0 13.195313 3.804688 17 8.5 17 C 13.195313 17 17 13.195313 17 8.5 C 17 3.804688 13.195313 0 8.5 0 Z M 8.5 15 C 4.910156 15 2 12.089844 2 8.5 C 2 4.910156 4.910156 2 8.5 2 C 12.089844 2 15 4.910156 15 8.5 C 15 12.089844 12.089844 15 8.5 15 Z"/>
+</svg> \ No newline at end of file
diff --git a/resources/icons/white/switch_presets.svg b/resources/icons/white/switch_presets.svg
new file mode 100644
index 000000000..efcc3670c
--- /dev/null
+++ b/resources/icons/white/switch_presets.svg
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
+<svg version="1.0" id="change_x5F_profile_copy" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
+ x="0px" y="0px" viewBox="0 0 100 100" enable-background="new 0 0 100 100" xml:space="preserve">
+<rect x="-45" y="5" display="none" fill="#FFFFFF" width="55" height="90"/>
+<rect x="90" y="5" transform="matrix(-1 -1.224647e-16 1.224647e-16 -1 235 100)" display="none" fill="#FFFFFF" width="55" height="90"/>
+<path fill="#ED6B21" d="M88.52,28.64c-1.25-0.94-3.03-0.69-3.97,0.57l-1.72,2.29V15c0-1.57-1.27-2.83-2.83-2.83H65
+ c-1.57,0-2.83,1.27-2.83,2.83s1.27,2.83,2.83,2.83h12.17V31.5l-1.72-2.29c-0.94-1.25-2.72-1.5-3.97-0.57
+ c-1.25,0.94-1.51,2.72-0.57,3.97l6.82,9.09c0.54,0.71,1.38,1.13,2.27,1.13s1.73-0.42,2.27-1.13l6.82-9.09
+ C90.03,31.36,89.77,29.58,88.52,28.64z"/>
+<path fill="#ED6B21" d="M35,82.17H22.83V68.5l1.72,2.29c0.56,0.74,1.41,1.13,2.27,1.13c0.59,0,1.19-0.18,1.7-0.57
+ c1.25-0.94,1.51-2.72,0.57-3.97l-6.82-9.09c-0.54-0.71-1.38-1.13-2.27-1.13s-1.73,0.42-2.27,1.13l-6.82,9.09
+ c-0.94,1.25-0.69,3.03,0.57,3.97c1.25,0.94,3.03,0.69,3.97-0.57l1.72-2.29V85c0,1.57,1.27,2.83,2.83,2.83h15
+ c1.57,0,2.83-1.27,2.83-2.83S36.57,82.17,35,82.17z"/>
+<polyline display="none" fill="none" stroke="#ED6B21" stroke-width="11.3386" stroke-linecap="round" stroke-linejoin="round" stroke-miterlimit="10" points="
+ 35,65 15,50 35,35 "/>
+<g>
+ <path fill="#FFFFFF" d="M50.01,41.11c0-0.75-0.3-1.47-0.83-2l-1.99-1.99H50c1.57,0,2.83-1.27,2.83-2.83v-8.57
+ c0-1.57-1.27-2.83-2.83-2.83h-2.81l1.99-1.99c0.53-0.53,0.83-1.25,0.83-2s-0.3-1.47-0.83-2l-6.06-6.06c-1.06-1.06-2.95-1.06-4.01,0
+ l-1.99,1.99V10c0-1.57-1.27-2.83-2.83-2.83h-8.57c-1.57,0-2.83,1.27-2.83,2.83v2.81l-1.99-1.99c-0.53-0.53-1.25-0.83-2-0.83
+ s-1.47,0.3-2,0.83l-6.06,6.06c-0.53,0.53-0.83,1.25-0.83,2s0.3,1.47,0.83,2l1.99,1.99H10c-1.57,0-2.83,1.27-2.83,2.83v8.57
+ c0,1.57,1.27,2.83,2.83,2.83h2.81l-1.99,1.99c-0.53,0.53-0.83,1.25-0.83,2s0.3,1.47,0.83,2l6.06,6.06c1.11,1.11,2.9,1.11,4.01,0
+ l1.99-1.99V50c0,1.57,1.27,2.83,2.83,2.83h8.57c1.57,0,2.83-1.27,2.83-2.83v-2.81l1.99,1.99c1.11,1.11,2.9,1.11,4.01,0l6.06-6.06
+ C49.71,42.58,50.01,41.86,50.01,41.11z M47.17,31.45h-2.05c-1.27,0-2.38,0.84-2.73,2.06c-0.27,0.96-0.66,1.89-1.14,2.76
+ c-0.62,1.11-0.43,2.49,0.47,3.39l1.45,1.45l-2.05,2.05l-1.45-1.45c-0.9-0.9-2.28-1.09-3.39-0.47c-0.87,0.49-1.8,0.87-2.76,1.14
+ c-1.22,0.35-2.06,1.46-2.06,2.73v2.05h-2.9v-2.05c0-1.27-0.84-2.38-2.06-2.73c-0.96-0.27-1.89-0.66-2.76-1.14
+ c-1.11-0.62-2.49-0.43-3.39,0.47l-1.45,1.45l-2.05-2.05l1.45-1.45c0.9-0.9,1.09-2.28,0.47-3.39c-0.49-0.87-0.87-1.8-1.14-2.76
+ c-0.35-1.22-1.46-2.06-2.73-2.06h-2.05v-2.9h2.05c1.27,0,2.38-0.84,2.73-2.06c0.27-0.96,0.66-1.89,1.14-2.76
+ c0.62-1.11,0.43-2.49-0.47-3.39l-1.45-1.45l2.05-2.05l1.45,1.45c0.9,0.9,2.28,1.09,3.39,0.47c0.87-0.49,1.8-0.87,2.76-1.14
+ c1.22-0.35,2.06-1.46,2.06-2.73v-2.05h2.9v2.05c0,1.27,0.84,2.38,2.06,2.73c0.96,0.27,1.89,0.66,2.76,1.14
+ c1.11,0.62,2.49,0.43,3.39-0.47l1.45-1.45l2.05,2.05l-1.45,1.45c-0.9,0.9-1.09,2.28-0.47,3.39c0.49,0.87,0.87,1.8,1.14,2.76
+ c0.35,1.22,1.46,2.06,2.73,2.06h2.05V31.45z"/>
+ <path fill="#FFFFFF" d="M90,62.88h-2.81l1.99-1.99c1.11-1.11,1.11-2.9,0-4.01l-6.06-6.06c-1.11-1.11-2.9-1.11-4.01,0l-1.99,1.99V50
+ c0-1.57-1.27-2.83-2.83-2.83h-8.57c-1.57,0-2.83,1.27-2.83,2.83v2.81l-1.99-1.99c-1.11-1.11-2.9-1.11-4.01,0l-6.06,6.06
+ c-1.11,1.11-1.11,2.9,0,4.01l1.99,1.99H50c-1.57,0-2.83,1.27-2.83,2.83v8.57c0,1.57,1.27,2.83,2.83,2.83h2.81l-1.99,1.99
+ c-1.11,1.11-1.11,2.9,0,4.01l6.06,6.06c1.11,1.11,2.9,1.11,4.01,0l1.99-1.99V90c0,1.57,1.27,2.83,2.83,2.83h8.57
+ c1.57,0,2.83-1.27,2.83-2.83v-2.81l1.99,1.99c1.11,1.11,2.9,1.11,4.01,0l6.06-6.06c1.11-1.11,1.11-2.9,0-4.01l-1.99-1.99H90
+ c1.57,0,2.83-1.27,2.83-2.83v-8.57C92.83,64.15,91.57,62.88,90,62.88z M87.17,71.45h-2.05c-1.27,0-2.38,0.84-2.73,2.06
+ c-0.27,0.96-0.66,1.89-1.14,2.76c-0.62,1.11-0.43,2.49,0.47,3.39l1.45,1.45l-2.05,2.05l-1.45-1.45c-0.9-0.9-2.28-1.09-3.39-0.47
+ c-0.87,0.49-1.8,0.87-2.76,1.15c-1.22,0.35-2.06,1.46-2.06,2.73v2.05h-2.9v-2.05c0-1.27-0.84-2.38-2.06-2.73
+ c-0.96-0.27-1.89-0.66-2.76-1.15c-1.11-0.62-2.49-0.43-3.39,0.47l-1.45,1.45l-2.05-2.05l1.45-1.45c0.9-0.9,1.09-2.28,0.47-3.39
+ c-0.49-0.87-0.87-1.8-1.14-2.76c-0.35-1.22-1.46-2.06-2.73-2.06h-2.05v-2.9h2.05c1.27,0,2.38-0.84,2.73-2.06
+ c0.27-0.96,0.66-1.89,1.14-2.76c0.62-1.11,0.43-2.49-0.47-3.39l-1.45-1.45l2.05-2.05l1.45,1.45c0.9,0.9,2.28,1.09,3.39,0.47
+ c0.87-0.49,1.8-0.87,2.76-1.14c1.22-0.35,2.06-1.46,2.06-2.73v-2.05h2.9v2.05c0,1.27,0.84,2.38,2.06,2.73
+ c0.96,0.27,1.89,0.66,2.76,1.14c1.11,0.62,2.49,0.43,3.39-0.47l1.45-1.45l2.05,2.05l-1.45,1.45c-0.9,0.9-1.09,2.28-0.47,3.39
+ c0.49,0.87,0.87,1.8,1.14,2.76c0.35,1.22,1.46,2.06,2.73,2.06h2.05V71.45z"/>
+ <path fill="#FFFFFF" d="M30,22.17c-4.32,0-7.83,3.51-7.83,7.83s3.51,7.83,7.83,7.83s7.83-3.51,7.83-7.83S34.32,22.17,30,22.17z
+ M30,32.17c-1.19,0-2.17-0.97-2.17-2.17s0.97-2.17,2.17-2.17s2.17,0.97,2.17,2.17S31.19,32.17,30,32.17z"/>
+ <path fill="#FFFFFF" d="M70,62.17c-4.32,0-7.83,3.51-7.83,7.83s3.51,7.83,7.83,7.83s7.83-3.51,7.83-7.83S74.32,62.17,70,62.17z
+ M70,72.17c-1.19,0-2.17-0.97-2.17-2.17s0.97-2.17,2.17-2.17s2.17,0.97,2.17,2.17S71.19,72.17,70,72.17z"/>
+</g>
+</svg>
diff --git a/resources/localization/PrusaSlicer.pot b/resources/localization/PrusaSlicer.pot
index 6e72e438c..5c328e479 100644
--- a/resources/localization/PrusaSlicer.pot
+++ b/resources/localization/PrusaSlicer.pot
@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-03-16 13:41+0100\n"
+"POT-Creation-Date: 2020-12-18 13:59+0100\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -18,271 +18,285 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
-#: src/slic3r/GUI/AboutDialog.cpp:41 src/slic3r/GUI/AboutDialog.cpp:294
+#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:299
msgid "Portions copyright"
msgstr ""
-#: src/slic3r/GUI/AboutDialog.cpp:129 src/slic3r/GUI/AboutDialog.cpp:258
+#: src/slic3r/GUI/AboutDialog.cpp:135 src/slic3r/GUI/AboutDialog.cpp:263
msgid "Copyright"
msgstr ""
#. TRN "Slic3r _is licensed under the_ License"
-#: src/slic3r/GUI/AboutDialog.cpp:131
+#: src/slic3r/GUI/AboutDialog.cpp:137
msgid ""
"License agreements of all following programs (libraries) are part of "
"application license agreement"
msgstr ""
-#: src/slic3r/GUI/AboutDialog.cpp:201
+#: src/slic3r/GUI/AboutDialog.cpp:206
#, possible-c-format
msgid "About %s"
msgstr ""
-#: src/slic3r/GUI/AboutDialog.cpp:233 src/slic3r/GUI/MainFrame.cpp:69
+#: src/slic3r/GUI/AboutDialog.cpp:238 src/slic3r/GUI/AboutDialog.cpp:361
+#: src/slic3r/GUI/GUI_App.cpp:235 src/slic3r/GUI/MainFrame.cpp:151
msgid "Version"
msgstr ""
#. TRN "Slic3r _is licensed under the_ License"
-#: src/slic3r/GUI/AboutDialog.cpp:260
+#: src/slic3r/GUI/AboutDialog.cpp:265 src/slic3r/GUI/GUI_App.cpp:240
msgid "is licensed under the"
msgstr ""
-#: src/slic3r/GUI/AboutDialog.cpp:261
+#: src/slic3r/GUI/AboutDialog.cpp:266 src/slic3r/GUI/GUI_App.cpp:240
msgid "GNU Affero General Public License, version 3"
msgstr ""
-#: src/slic3r/GUI/AboutDialog.cpp:262
+#: src/slic3r/GUI/AboutDialog.cpp:267
msgid ""
"PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap "
"community."
msgstr ""
-#: src/slic3r/GUI/AboutDialog.cpp:263
+#: src/slic3r/GUI/AboutDialog.cpp:268
msgid ""
"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, "
"Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and "
"numerous others."
msgstr ""
-#: src/slic3r/GUI/AppConfig.cpp:114
+#: src/slic3r/GUI/AboutDialog.cpp:304
+msgid "Copy Version Info"
+msgstr ""
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:78
+#, possible-c-format
msgid ""
-"Error parsing PrusaSlicer config file, it is probably corrupted. Try to "
-"manually delete the file to recover from the error. Your user profiles will "
-"not be affected."
+"%s has encountered an error. It was likely caused by running out of memory. "
+"If you are sure you have enough RAM on your system, this may also be a bug "
+"and we would be glad if you reported it."
+msgstr ""
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:163
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183
+msgid "Unknown error occured during exporting G-code."
msgstr ""
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:108
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:168
msgid ""
"Copying of the temporary G-code to the output G-code failed. Maybe the SD "
-"card is write locked?"
+"card is write locked?\n"
+"Error message: %1%"
msgstr ""
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:111
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:171
msgid ""
"Copying of the temporary G-code to the output G-code failed. There might be "
"problem with target device, please try exporting again or using different "
"device. The corrupted output G-code is at %1%.tmp."
msgstr ""
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:114
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:174
msgid ""
"Renaming of the G-code after copying to the selected destination folder has "
"failed. Current path is %1%.tmp. Please try exporting again."
msgstr ""
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:117
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:177
msgid ""
"Copying of the temporary G-code has finished but the original code at %1% "
"couldn't be opened during copy check. The output G-code is at %2%.tmp."
msgstr ""
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:120
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:180
msgid ""
"Copying of the temporary G-code has finished but the exported code couldn't "
"be opened during copy check. The output G-code is at %1%.tmp."
msgstr ""
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:127
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:479
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:187
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:536
msgid "Running post-processing scripts"
msgstr ""
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:129
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:189
msgid "G-code file exported to %1%"
msgstr ""
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:133
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:194
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:243
msgid "Slicing complete"
msgstr ""
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:179
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:238
msgid "Masked SLA file exported to %1%"
msgstr ""
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:221
-#, possible-c-format
-msgid ""
-"%s has encountered an error. It was likely caused by running out of memory. "
-"If you are sure you have enough RAM on your system, this may also be a bug "
-"and we would be glad if you reported it."
-msgstr ""
-
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:481
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:539
msgid "Copying of the temporary G-code to the output G-code failed"
msgstr ""
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:506
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:562
msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue"
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.cpp:66 src/slic3r/GUI/GUI_ObjectList.cpp:2067
-msgid "Shape"
+#: src/slic3r/GUI/BedShapeDialog.cpp:93
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:240 src/slic3r/GUI/Plater.cpp:162
+#: src/slic3r/GUI/Tab.cpp:2536
+msgid "Size"
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.cpp:73
-msgid "Rectangular"
+#: src/slic3r/GUI/BedShapeDialog.cpp:94
+msgid "Origin"
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.cpp:77
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:232 src/slic3r/GUI/Plater.cpp:160
-#: src/slic3r/GUI/Tab.cpp:2309
-msgid "Size"
+#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:771
+msgid "Diameter"
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.cpp:78
+#: src/slic3r/GUI/BedShapeDialog.cpp:110
msgid "Size in X and Y of the rectangular plate."
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.cpp:84
-msgid "Origin"
-msgstr ""
-
-#: src/slic3r/GUI/BedShapeDialog.cpp:85
+#: src/slic3r/GUI/BedShapeDialog.cpp:121
msgid ""
"Distance of the 0,0 G-code coordinate from the front left corner of the "
"rectangle."
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.cpp:89
-msgid "Circular"
-msgstr ""
-
-#: src/slic3r/GUI/BedShapeDialog.cpp:92 src/slic3r/GUI/ConfigWizard.cpp:233
-#: src/slic3r/GUI/ConfigWizard.cpp:985 src/slic3r/GUI/ConfigWizard.cpp:999
-#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:87
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:142
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:333
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:94
-#: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:75
-#: src/libslic3r/PrintConfig.cpp:82 src/libslic3r/PrintConfig.cpp:91
-#: src/libslic3r/PrintConfig.cpp:122 src/libslic3r/PrintConfig.cpp:188
-#: src/libslic3r/PrintConfig.cpp:246 src/libslic3r/PrintConfig.cpp:321
-#: src/libslic3r/PrintConfig.cpp:329 src/libslic3r/PrintConfig.cpp:379
-#: src/libslic3r/PrintConfig.cpp:505 src/libslic3r/PrintConfig.cpp:516
-#: src/libslic3r/PrintConfig.cpp:534 src/libslic3r/PrintConfig.cpp:712
-#: src/libslic3r/PrintConfig.cpp:1231 src/libslic3r/PrintConfig.cpp:1292
-#: src/libslic3r/PrintConfig.cpp:1310 src/libslic3r/PrintConfig.cpp:1328
-#: src/libslic3r/PrintConfig.cpp:1384 src/libslic3r/PrintConfig.cpp:1394
-#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1524
-#: src/libslic3r/PrintConfig.cpp:1565 src/libslic3r/PrintConfig.cpp:1573
-#: src/libslic3r/PrintConfig.cpp:1583 src/libslic3r/PrintConfig.cpp:1591
-#: src/libslic3r/PrintConfig.cpp:1599 src/libslic3r/PrintConfig.cpp:1682
-#: src/libslic3r/PrintConfig.cpp:1921 src/libslic3r/PrintConfig.cpp:1992
-#: src/libslic3r/PrintConfig.cpp:2026 src/libslic3r/PrintConfig.cpp:2154
-#: src/libslic3r/PrintConfig.cpp:2233 src/libslic3r/PrintConfig.cpp:2240
-#: src/libslic3r/PrintConfig.cpp:2247 src/libslic3r/PrintConfig.cpp:2277
-#: src/libslic3r/PrintConfig.cpp:2287 src/libslic3r/PrintConfig.cpp:2297
-#: src/libslic3r/PrintConfig.cpp:2457 src/libslic3r/PrintConfig.cpp:2491
-#: src/libslic3r/PrintConfig.cpp:2630 src/libslic3r/PrintConfig.cpp:2639
-#: src/libslic3r/PrintConfig.cpp:2648 src/libslic3r/PrintConfig.cpp:2658
-#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2722
-#: src/libslic3r/PrintConfig.cpp:2734 src/libslic3r/PrintConfig.cpp:2754
-#: src/libslic3r/PrintConfig.cpp:2764 src/libslic3r/PrintConfig.cpp:2774
-#: src/libslic3r/PrintConfig.cpp:2792 src/libslic3r/PrintConfig.cpp:2807
-#: src/libslic3r/PrintConfig.cpp:2821 src/libslic3r/PrintConfig.cpp:2832
-#: src/libslic3r/PrintConfig.cpp:2845 src/libslic3r/PrintConfig.cpp:2890
-#: src/libslic3r/PrintConfig.cpp:2900 src/libslic3r/PrintConfig.cpp:2909
-#: src/libslic3r/PrintConfig.cpp:2919 src/libslic3r/PrintConfig.cpp:2935
-#: src/libslic3r/PrintConfig.cpp:2959
+#: src/slic3r/GUI/BedShapeDialog.cpp:129 src/slic3r/GUI/ConfigWizard.cpp:242
+#: src/slic3r/GUI/ConfigWizard.cpp:1368 src/slic3r/GUI/ConfigWizard.cpp:1382
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:88
+#: src/slic3r/GUI/GCodeViewer.cpp:2337 src/slic3r/GUI/GCodeViewer.cpp:2343
+#: src/slic3r/GUI/GCodeViewer.cpp:2351 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:179
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:145
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:96
+#: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:77
+#: src/libslic3r/PrintConfig.cpp:84 src/libslic3r/PrintConfig.cpp:95
+#: src/libslic3r/PrintConfig.cpp:135 src/libslic3r/PrintConfig.cpp:244
+#: src/libslic3r/PrintConfig.cpp:302 src/libslic3r/PrintConfig.cpp:377
+#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:435
+#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:576
+#: src/libslic3r/PrintConfig.cpp:594 src/libslic3r/PrintConfig.cpp:774
+#: src/libslic3r/PrintConfig.cpp:1258 src/libslic3r/PrintConfig.cpp:1439
+#: src/libslic3r/PrintConfig.cpp:1500 src/libslic3r/PrintConfig.cpp:1518
+#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1594
+#: src/libslic3r/PrintConfig.cpp:1604 src/libslic3r/PrintConfig.cpp:1729
+#: src/libslic3r/PrintConfig.cpp:1737 src/libslic3r/PrintConfig.cpp:1778
+#: src/libslic3r/PrintConfig.cpp:1786 src/libslic3r/PrintConfig.cpp:1796
+#: src/libslic3r/PrintConfig.cpp:1804 src/libslic3r/PrintConfig.cpp:1812
+#: src/libslic3r/PrintConfig.cpp:1875 src/libslic3r/PrintConfig.cpp:2141
+#: src/libslic3r/PrintConfig.cpp:2212 src/libslic3r/PrintConfig.cpp:2246
+#: src/libslic3r/PrintConfig.cpp:2375 src/libslic3r/PrintConfig.cpp:2454
+#: src/libslic3r/PrintConfig.cpp:2461 src/libslic3r/PrintConfig.cpp:2468
+#: src/libslic3r/PrintConfig.cpp:2498 src/libslic3r/PrintConfig.cpp:2508
+#: src/libslic3r/PrintConfig.cpp:2518 src/libslic3r/PrintConfig.cpp:2678
+#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2851
+#: src/libslic3r/PrintConfig.cpp:2860 src/libslic3r/PrintConfig.cpp:2869
+#: src/libslic3r/PrintConfig.cpp:2879 src/libslic3r/PrintConfig.cpp:2944
+#: src/libslic3r/PrintConfig.cpp:2954 src/libslic3r/PrintConfig.cpp:2966
+#: src/libslic3r/PrintConfig.cpp:2986 src/libslic3r/PrintConfig.cpp:2996
+#: src/libslic3r/PrintConfig.cpp:3006 src/libslic3r/PrintConfig.cpp:3024
+#: src/libslic3r/PrintConfig.cpp:3039 src/libslic3r/PrintConfig.cpp:3053
+#: src/libslic3r/PrintConfig.cpp:3064 src/libslic3r/PrintConfig.cpp:3077
+#: src/libslic3r/PrintConfig.cpp:3122 src/libslic3r/PrintConfig.cpp:3132
+#: src/libslic3r/PrintConfig.cpp:3141 src/libslic3r/PrintConfig.cpp:3151
+#: src/libslic3r/PrintConfig.cpp:3167 src/libslic3r/PrintConfig.cpp:3191
msgid "mm"
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/libslic3r/PrintConfig.cpp:709
-msgid "Diameter"
-msgstr ""
-
-#: src/slic3r/GUI/BedShapeDialog.cpp:94
+#: src/slic3r/GUI/BedShapeDialog.cpp:131
msgid ""
"Diameter of the print bed. It is assumed that origin (0,0) is located in the "
"center."
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.cpp:98 src/slic3r/GUI/GUI_Preview.cpp:249
-#: src/libslic3r/ExtrusionEntity.cpp:322
+#: src/slic3r/GUI/BedShapeDialog.cpp:141
+msgid "Rectangular"
+msgstr ""
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:142
+msgid "Circular"
+msgstr ""
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:143 src/slic3r/GUI/GUI_Preview.cpp:243
+#: src/libslic3r/ExtrusionEntity.cpp:323 src/libslic3r/ExtrusionEntity.cpp:358
msgid "Custom"
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.cpp:102
+#: src/slic3r/GUI/BedShapeDialog.cpp:145
+msgid "Invalid"
+msgstr ""
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:156 src/slic3r/GUI/BedShapeDialog.cpp:222
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2288
+msgid "Shape"
+msgstr ""
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:243
msgid "Load shape from STL..."
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.cpp:155
+#: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/MainFrame.cpp:1826
msgid "Settings"
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.cpp:172
+#: src/slic3r/GUI/BedShapeDialog.cpp:315
msgid "Texture"
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.cpp:182 src/slic3r/GUI/BedShapeDialog.cpp:261
+#: src/slic3r/GUI/BedShapeDialog.cpp:325 src/slic3r/GUI/BedShapeDialog.cpp:405
msgid "Load..."
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.cpp:190 src/slic3r/GUI/BedShapeDialog.cpp:269
-#: src/slic3r/GUI/Tab.cpp:3145
+#: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/BedShapeDialog.cpp:413
+#: src/slic3r/GUI/Tab.cpp:3484
msgid "Remove"
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.cpp:223 src/slic3r/GUI/BedShapeDialog.cpp:302
+#: src/slic3r/GUI/BedShapeDialog.cpp:366 src/slic3r/GUI/BedShapeDialog.cpp:446
msgid "Not found:"
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.cpp:251
+#: src/slic3r/GUI/BedShapeDialog.cpp:395
msgid "Model"
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.cpp:487
+#: src/slic3r/GUI/BedShapeDialog.cpp:563
msgid "Choose an STL file to import bed shape from:"
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.cpp:494 src/slic3r/GUI/BedShapeDialog.cpp:543
-#: src/slic3r/GUI/BedShapeDialog.cpp:566
+#: src/slic3r/GUI/BedShapeDialog.cpp:570 src/slic3r/GUI/BedShapeDialog.cpp:619
+#: src/slic3r/GUI/BedShapeDialog.cpp:642
msgid "Invalid file format."
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.cpp:505
+#: src/slic3r/GUI/BedShapeDialog.cpp:581
msgid "Error! Invalid model"
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.cpp:513
+#: src/slic3r/GUI/BedShapeDialog.cpp:589
msgid "The selected file contains no geometry."
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.cpp:517
+#: src/slic3r/GUI/BedShapeDialog.cpp:593
msgid ""
"The selected file contains several disjoint areas. This is not supported."
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.cpp:532
+#: src/slic3r/GUI/BedShapeDialog.cpp:608
msgid "Choose a file to import bed texture from (PNG/SVG):"
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.cpp:555
+#: src/slic3r/GUI/BedShapeDialog.cpp:631
msgid "Choose an STL file to import bed model from:"
msgstr ""
-#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:944
+#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1327
msgid "Bed Shape"
msgstr ""
@@ -336,8 +350,8 @@ msgid ""
msgstr ""
#: src/slic3r/GUI/ConfigManipulation.cpp:49
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1109
-#: src/libslic3r/PrintConfig.cpp:71
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1387
+#: src/libslic3r/PrintConfig.cpp:73
msgid "Layer height"
msgstr ""
@@ -348,7 +362,7 @@ msgid ""
"The first layer height will be reset to 0.01."
msgstr ""
-#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:889
+#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:969
msgid "First layer height"
msgstr ""
@@ -414,219 +428,250 @@ msgstr ""
msgid "Support Generator"
msgstr ""
-#: src/slic3r/GUI/ConfigManipulation.cpp:208
+#: src/slic3r/GUI/ConfigManipulation.cpp:198
msgid "The %1% infill pattern is not supposed to work at 100%% density."
msgstr ""
-#: src/slic3r/GUI/ConfigManipulation.cpp:210
+#: src/slic3r/GUI/ConfigManipulation.cpp:201
msgid "Shall I switch to rectilinear fill pattern?"
msgstr ""
-#: src/slic3r/GUI/ConfigManipulation.cpp:211
-#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:96
-#: src/slic3r/GUI/GUI_ObjectList.cpp:612 src/slic3r/GUI/Plater.cpp:532
-#: src/slic3r/GUI/Tab.cpp:1151 src/slic3r/GUI/Tab.cpp:1152
-#: src/libslic3r/PrintConfig.cpp:203 src/libslic3r/PrintConfig.cpp:416
-#: src/libslic3r/PrintConfig.cpp:436 src/libslic3r/PrintConfig.cpp:776
-#: src/libslic3r/PrintConfig.cpp:790 src/libslic3r/PrintConfig.cpp:827
-#: src/libslic3r/PrintConfig.cpp:981 src/libslic3r/PrintConfig.cpp:991
-#: src/libslic3r/PrintConfig.cpp:1009 src/libslic3r/PrintConfig.cpp:1028
-#: src/libslic3r/PrintConfig.cpp:1047 src/libslic3r/PrintConfig.cpp:1735
-#: src/libslic3r/PrintConfig.cpp:1752
+#: src/slic3r/GUI/ConfigManipulation.cpp:202
+#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:93
+#: src/slic3r/GUI/GUI_ObjectList.cpp:668 src/slic3r/GUI/Plater.cpp:389
+#: src/slic3r/GUI/Tab.cpp:1432 src/slic3r/GUI/Tab.cpp:1434
+#: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:472
+#: src/libslic3r/PrintConfig.cpp:496 src/libslic3r/PrintConfig.cpp:848
+#: src/libslic3r/PrintConfig.cpp:862 src/libslic3r/PrintConfig.cpp:899
+#: src/libslic3r/PrintConfig.cpp:1076 src/libslic3r/PrintConfig.cpp:1086
+#: src/libslic3r/PrintConfig.cpp:1153 src/libslic3r/PrintConfig.cpp:1172
+#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:1928
+#: src/libslic3r/PrintConfig.cpp:1945
msgid "Infill"
msgstr ""
-#: src/slic3r/GUI/ConfigManipulation.cpp:318
+#: src/slic3r/GUI/ConfigManipulation.cpp:320
msgid "Head penetration should not be greater than the head width."
msgstr ""
-#: src/slic3r/GUI/ConfigManipulation.cpp:320
+#: src/slic3r/GUI/ConfigManipulation.cpp:322
msgid "Invalid Head penetration"
msgstr ""
-#: src/slic3r/GUI/ConfigManipulation.cpp:331
+#: src/slic3r/GUI/ConfigManipulation.cpp:333
msgid "Pinhead diameter should be smaller than the pillar diameter."
msgstr ""
-#: src/slic3r/GUI/ConfigManipulation.cpp:333
+#: src/slic3r/GUI/ConfigManipulation.cpp:335
msgid "Invalid pinhead diameter"
msgstr ""
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:18
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19
msgid "Upgrade"
msgstr ""
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:20
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21
msgid "Downgrade"
msgstr ""
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23
msgid "Before roll back"
msgstr ""
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:143
msgid "User"
msgstr ""
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:27
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28
+#: src/slic3r/GUI/GUI_Preview.cpp:229 src/libslic3r/ExtrusionEntity.cpp:309
msgid "Unknown"
msgstr ""
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:43
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:44
msgid "Active"
msgstr ""
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:50
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51
msgid "PrusaSlicer version"
msgstr ""
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1562
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 src/libslic3r/Preset.cpp:1298
msgid "print"
msgstr ""
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:56
msgid "filaments"
msgstr ""
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1566
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 src/libslic3r/Preset.cpp:1300
+msgid "SLA print"
+msgstr ""
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 src/slic3r/GUI/Plater.cpp:696
+#: src/libslic3r/Preset.cpp:1301
+msgid "SLA material"
+msgstr ""
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:62 src/libslic3r/Preset.cpp:1302
msgid "printer"
msgstr ""
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:1027
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:66 src/slic3r/GUI/Tab.cpp:1304
msgid "vendor"
msgstr ""
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:66
msgid "version"
msgstr ""
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:67
msgid "min PrusaSlicer version"
msgstr ""
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69
msgid "max PrusaSlicer version"
msgstr ""
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:72
msgid "model"
msgstr ""
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:72
msgid "variants"
msgstr ""
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:84
#, possible-c-format
msgid "Incompatible with this %s"
msgstr ""
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:87
msgid "Activate"
msgstr ""
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:104
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:113
msgid "Configuration Snapshots"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:233
+#: src/slic3r/GUI/ConfigWizard.cpp:242
msgid "nozzle"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:237
+#: src/slic3r/GUI/ConfigWizard.cpp:246
msgid "Alternate nozzles:"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:304
+#: src/slic3r/GUI/ConfigWizard.cpp:310
msgid "All standard"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:304
+#: src/slic3r/GUI/ConfigWizard.cpp:310
msgid "Standard"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:305 src/slic3r/GUI/ConfigWizard.cpp:588
-#: src/slic3r/GUI/Tab.cpp:3204
+#: src/slic3r/GUI/ConfigWizard.cpp:311 src/slic3r/GUI/ConfigWizard.cpp:605
+#: src/slic3r/GUI/Tab.cpp:3565 src/slic3r/GUI/UnsavedChangesDialog.cpp:933
msgid "All"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:306 src/slic3r/GUI/ConfigWizard.cpp:589
-#: src/slic3r/GUI/Plater.cpp:504 src/slic3r/GUI/Plater.cpp:644
-#: src/libslic3r/ExtrusionEntity.cpp:309
+#: src/slic3r/GUI/ConfigWizard.cpp:312 src/slic3r/GUI/ConfigWizard.cpp:606
+#: src/slic3r/GUI/DoubleSlider.cpp:1859 src/slic3r/GUI/Plater.cpp:361
+#: src/slic3r/GUI/Plater.cpp:504
msgid "None"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:442
+#: src/slic3r/GUI/ConfigWizard.cpp:452
#, possible-c-format
msgid "Welcome to the %s Configuration Assistant"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:444
+#: src/slic3r/GUI/ConfigWizard.cpp:454
#, possible-c-format
msgid "Welcome to the %s Configuration Wizard"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:446
+#: src/slic3r/GUI/ConfigWizard.cpp:456
msgid "Welcome"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:448
+#: src/slic3r/GUI/ConfigWizard.cpp:458
#, possible-c-format
msgid ""
"Hello, welcome to %s! This %s helps you with the initial configuration; just "
"a few settings and you will be ready to print."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:453
+#: src/slic3r/GUI/ConfigWizard.cpp:463
msgid "Remove user profiles (a snapshot will be taken beforehand)"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:496
+#: src/slic3r/GUI/ConfigWizard.cpp:506
#, possible-c-format
msgid "%s Family"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:580
+#: src/slic3r/GUI/ConfigWizard.cpp:594
+msgid "Printer:"
+msgstr ""
+
+#: src/slic3r/GUI/ConfigWizard.cpp:596
msgid "Vendor:"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:581
+#: src/slic3r/GUI/ConfigWizard.cpp:597
msgid "Profile:"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:618 src/slic3r/GUI/ConfigWizard.cpp:646
+#: src/slic3r/GUI/ConfigWizard.cpp:669 src/slic3r/GUI/ConfigWizard.cpp:819
+#: src/slic3r/GUI/ConfigWizard.cpp:880 src/slic3r/GUI/ConfigWizard.cpp:1017
msgid "(All)"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:747
+#: src/slic3r/GUI/ConfigWizard.cpp:698
+msgid ""
+"Filaments marked with <b>*</b> are <b>not</b> compatible with some installed "
+"printers."
+msgstr ""
+
+#: src/slic3r/GUI/ConfigWizard.cpp:701
+msgid "All installed printers are compatible with the selected filament."
+msgstr ""
+
+#: src/slic3r/GUI/ConfigWizard.cpp:721
+msgid ""
+"Only the following installed printers are compatible with the selected "
+"filament:"
+msgstr ""
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1107
msgid "Custom Printer Setup"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:747
+#: src/slic3r/GUI/ConfigWizard.cpp:1107
msgid "Custom Printer"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:749
+#: src/slic3r/GUI/ConfigWizard.cpp:1109
msgid "Define a custom printer profile"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:751
+#: src/slic3r/GUI/ConfigWizard.cpp:1111
msgid "Custom profile name:"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:776
+#: src/slic3r/GUI/ConfigWizard.cpp:1136
msgid "Automatic updates"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:776
+#: src/slic3r/GUI/ConfigWizard.cpp:1136
msgid "Updates"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:784 src/slic3r/GUI/Preferences.cpp:64
+#: src/slic3r/GUI/ConfigWizard.cpp:1144 src/slic3r/GUI/Preferences.cpp:94
msgid "Check for application updates"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:788
+#: src/slic3r/GUI/ConfigWizard.cpp:1148
#, possible-c-format
msgid ""
"If enabled, %s checks for new application versions online. When a new "
@@ -635,11 +680,11 @@ msgid ""
"notification mechanisms, no automatic installation is done."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:794 src/slic3r/GUI/Preferences.cpp:80
+#: src/slic3r/GUI/ConfigWizard.cpp:1154 src/slic3r/GUI/Preferences.cpp:129
msgid "Update built-in Presets automatically"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:798
+#: src/slic3r/GUI/ConfigWizard.cpp:1158
#, possible-c-format
msgid ""
"If enabled, %s downloads updates of built-in system presets in the "
@@ -648,30 +693,30 @@ msgid ""
"startup."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:801
+#: src/slic3r/GUI/ConfigWizard.cpp:1161
msgid ""
"Updates are never applied without user's consent and never overwrite user's "
"customized settings."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:806
+#: src/slic3r/GUI/ConfigWizard.cpp:1166
msgid ""
"Additionally a backup snapshot of the whole configuration is created before "
"an update is applied."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:813 src/slic3r/GUI/GUI_ObjectList.cpp:1672
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4025 src/slic3r/GUI/Plater.cpp:3292
-#: src/slic3r/GUI/Plater.cpp:4001 src/slic3r/GUI/Plater.cpp:4030
+#: src/slic3r/GUI/ConfigWizard.cpp:1173 src/slic3r/GUI/GUI_ObjectList.cpp:1825
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4567 src/slic3r/GUI/Plater.cpp:3116
+#: src/slic3r/GUI/Plater.cpp:4001 src/slic3r/GUI/Plater.cpp:4032
msgid "Reload from disk"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:816
+#: src/slic3r/GUI/ConfigWizard.cpp:1176
msgid ""
"Export full pathnames of models and parts sources into 3mf and amf files"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:820
+#: src/slic3r/GUI/ConfigWizard.cpp:1180
msgid ""
"If enabled, allows the Reload from disk command to automatically find and "
"load the files when invoked.\n"
@@ -679,11 +724,23 @@ msgid ""
"using an open file dialog."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:828
+#: src/slic3r/GUI/ConfigWizard.cpp:1190
+msgid "Files association"
+msgstr ""
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1192 src/slic3r/GUI/Preferences.cpp:112
+msgid "Associate .3mf files to PrusaSlicer"
+msgstr ""
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1193 src/slic3r/GUI/Preferences.cpp:119
+msgid "Associate .stl files to PrusaSlicer"
+msgstr ""
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1204
msgid "View mode"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:830
+#: src/slic3r/GUI/ConfigWizard.cpp:1206
msgid ""
"PrusaSlicer's user interfaces comes in three variants:\n"
"Simple, Advanced, and Expert.\n"
@@ -692,272 +749,290 @@ msgid ""
"fine-tuning, they are suitable for advanced and expert users, respectively."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:835
+#: src/slic3r/GUI/ConfigWizard.cpp:1211
msgid "Simple mode"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:836
+#: src/slic3r/GUI/ConfigWizard.cpp:1212
msgid "Advanced mode"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:837
+#: src/slic3r/GUI/ConfigWizard.cpp:1213
msgid "Expert mode"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:871
+#: src/slic3r/GUI/ConfigWizard.cpp:1219
+msgid "The size of the object can be specified in inches"
+msgstr ""
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1220
+msgid "Use inches"
+msgstr ""
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1254
msgid "Other Vendors"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:875
+#: src/slic3r/GUI/ConfigWizard.cpp:1258
#, possible-c-format
msgid "Pick another vendor supported by %s"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:906
+#: src/slic3r/GUI/ConfigWizard.cpp:1289
msgid "Firmware Type"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:906 src/slic3r/GUI/Tab.cpp:1970
+#: src/slic3r/GUI/ConfigWizard.cpp:1289 src/slic3r/GUI/Tab.cpp:2172
msgid "Firmware"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:910
+#: src/slic3r/GUI/ConfigWizard.cpp:1293
msgid "Choose the type of firmware used by your printer."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:944
+#: src/slic3r/GUI/ConfigWizard.cpp:1327
msgid "Bed Shape and Size"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:947
+#: src/slic3r/GUI/ConfigWizard.cpp:1330
msgid "Set the shape of your printer's bed."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:967
+#: src/slic3r/GUI/ConfigWizard.cpp:1350
msgid "Filament and Nozzle Diameters"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:967
+#: src/slic3r/GUI/ConfigWizard.cpp:1350
msgid "Print Diameters"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:981
+#: src/slic3r/GUI/ConfigWizard.cpp:1364
msgid "Enter the diameter of your printer's hot end nozzle."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:984
+#: src/slic3r/GUI/ConfigWizard.cpp:1367
msgid "Nozzle Diameter:"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:994
+#: src/slic3r/GUI/ConfigWizard.cpp:1377
msgid "Enter the diameter of your filament."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:995
+#: src/slic3r/GUI/ConfigWizard.cpp:1378
msgid ""
"Good precision is required, so use a caliper and do multiple measurements "
"along the filament, then compute the average."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:998
+#: src/slic3r/GUI/ConfigWizard.cpp:1381
msgid "Filament Diameter:"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1032
-msgid "Extruder and Bed Temperatures"
+#: src/slic3r/GUI/ConfigWizard.cpp:1415
+msgid "Nozzle and Bed Temperatures"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1032
+#: src/slic3r/GUI/ConfigWizard.cpp:1415
msgid "Temperatures"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1048
+#: src/slic3r/GUI/ConfigWizard.cpp:1431
msgid "Enter the temperature needed for extruding your filament."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1049
+#: src/slic3r/GUI/ConfigWizard.cpp:1432
msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1052
+#: src/slic3r/GUI/ConfigWizard.cpp:1435
msgid "Extrusion Temperature:"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1053 src/slic3r/GUI/ConfigWizard.cpp:1067
+#: src/slic3r/GUI/ConfigWizard.cpp:1436 src/slic3r/GUI/ConfigWizard.cpp:1450
+#: src/libslic3r/PrintConfig.cpp:202 src/libslic3r/PrintConfig.cpp:950
+#: src/libslic3r/PrintConfig.cpp:994 src/libslic3r/PrintConfig.cpp:2294
msgid "°C"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1062
+#: src/slic3r/GUI/ConfigWizard.cpp:1445
msgid ""
"Enter the bed temperature needed for getting your filament to stick to your "
"heated bed."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1063
+#: src/slic3r/GUI/ConfigWizard.cpp:1446
msgid ""
"A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have "
"no heated bed."
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1066
+#: src/slic3r/GUI/ConfigWizard.cpp:1449
msgid "Bed Temperature:"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1515 src/slic3r/GUI/ConfigWizard.cpp:2097
+#: src/slic3r/GUI/ConfigWizard.cpp:1909 src/slic3r/GUI/ConfigWizard.cpp:2582
msgid "Filaments"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1515 src/slic3r/GUI/ConfigWizard.cpp:2099
+#: src/slic3r/GUI/ConfigWizard.cpp:1909 src/slic3r/GUI/ConfigWizard.cpp:2584
msgid "SLA Materials"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1569
+#: src/slic3r/GUI/ConfigWizard.cpp:1963
msgid "FFF Technology Printers"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1574
+#: src/slic3r/GUI/ConfigWizard.cpp:1968
msgid "SLA Technology Printers"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1810 src/slic3r/GUI/DoubleSlider.cpp:1905
-#: src/slic3r/GUI/DoubleSlider.cpp:1926 src/slic3r/GUI/GUI.cpp:246
+#: src/slic3r/GUI/ConfigWizard.cpp:2274 src/slic3r/GUI/DoubleSlider.cpp:2245
+#: src/slic3r/GUI/DoubleSlider.cpp:2265 src/slic3r/GUI/GUI.cpp:244
msgid "Notice"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1830
+#: src/slic3r/GUI/ConfigWizard.cpp:2295
msgid "The following FFF printer models have no filament selected:"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1834
+#: src/slic3r/GUI/ConfigWizard.cpp:2299
msgid "Do you want to select default filaments for these FFF printer models?"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1848
+#: src/slic3r/GUI/ConfigWizard.cpp:2313
msgid "The following SLA printer models have no materials selected:"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:1852
+#: src/slic3r/GUI/ConfigWizard.cpp:2317
msgid "Do you want to select default SLA materials for these printer models?"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:2060
+#: src/slic3r/GUI/ConfigWizard.cpp:2545
msgid "Select all standard printers"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:2063
+#: src/slic3r/GUI/ConfigWizard.cpp:2548
msgid "< &Back"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:2064
+#: src/slic3r/GUI/ConfigWizard.cpp:2549
msgid "&Next >"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:2065
+#: src/slic3r/GUI/ConfigWizard.cpp:2550
msgid "&Finish"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:2066 src/slic3r/GUI/FirmwareDialog.cpp:151
+#: src/slic3r/GUI/ConfigWizard.cpp:2551 src/slic3r/GUI/FirmwareDialog.cpp:151
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:248
#: src/slic3r/GUI/ProgressStatusBar.cpp:26
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:656
msgid "Cancel"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:2079
+#: src/slic3r/GUI/ConfigWizard.cpp:2564
msgid "Prusa FFF Technology Printers"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:2082
+#: src/slic3r/GUI/ConfigWizard.cpp:2567
msgid "Prusa MSLA Technology Printers"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:2097
+#: src/slic3r/GUI/ConfigWizard.cpp:2582
msgid "Filament Profiles Selection"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:2097 src/slic3r/GUI/GUI_ObjectList.cpp:3622
+#: src/slic3r/GUI/ConfigWizard.cpp:2582 src/slic3r/GUI/ConfigWizard.cpp:2584
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4144
msgid "Type:"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:2099
+#: src/slic3r/GUI/ConfigWizard.cpp:2584
msgid "SLA Material Profiles Selection"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:2099
-msgid "Layer height:"
-msgstr ""
-
-#: src/slic3r/GUI/ConfigWizard.cpp:2196
+#: src/slic3r/GUI/ConfigWizard.cpp:2701
msgid "Configuration Assistant"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:2197
+#: src/slic3r/GUI/ConfigWizard.cpp:2702
msgid "Configuration &Assistant"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:2199
+#: src/slic3r/GUI/ConfigWizard.cpp:2704
msgid "Configuration Wizard"
msgstr ""
-#: src/slic3r/GUI/ConfigWizard.cpp:2200
+#: src/slic3r/GUI/ConfigWizard.cpp:2705
msgid "Configuration &Wizard"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:79
+#: src/slic3r/GUI/DoubleSlider.cpp:97
msgid "Place bearings in slots and resume printing"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:950
+#: src/slic3r/GUI/DoubleSlider.cpp:1224
msgid "One layer mode"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:952
+#: src/slic3r/GUI/DoubleSlider.cpp:1226
msgid "Discard all custom changes"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:955
+#: src/slic3r/GUI/DoubleSlider.cpp:1230 src/slic3r/GUI/DoubleSlider.cpp:1995
+msgid "Jump to move"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1233
#, possible-c-format
-msgid "Jump to height %s or Set extruder sequence for the entire print"
+msgid ""
+"Jump to height %s\n"
+"Set ruler mode\n"
+"or Set extruder sequence for the entire print"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:957 src/slic3r/GUI/DoubleSlider.cpp:1529
-#: src/slic3r/GUI/DoubleSlider.cpp:1651
-msgid "Jump to height"
+#: src/slic3r/GUI/DoubleSlider.cpp:1236
+#, possible-c-format
+msgid ""
+"Jump to height %s\n"
+"or Set ruler mode"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:960
+#: src/slic3r/GUI/DoubleSlider.cpp:1241
msgid "Edit current color - Right click the colored slider segment"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:970
+#: src/slic3r/GUI/DoubleSlider.cpp:1251
msgid "Print mode"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:984
+#: src/slic3r/GUI/DoubleSlider.cpp:1265
msgid "Add extruder change - Left click"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:986
+#: src/slic3r/GUI/DoubleSlider.cpp:1267
msgid ""
"Add color change - Left click for predefined color or Shift + Left click for "
"custom color selection"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:988
+#: src/slic3r/GUI/DoubleSlider.cpp:1269
msgid "Add color change - Left click"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:989
+#: src/slic3r/GUI/DoubleSlider.cpp:1270
msgid "or press \"+\" key"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:991
+#: src/slic3r/GUI/DoubleSlider.cpp:1272
msgid "Add another code - Ctrl + Left click"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:992
+#: src/slic3r/GUI/DoubleSlider.cpp:1273
msgid "Add another code - Right click"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:998
+#: src/slic3r/GUI/DoubleSlider.cpp:1279
msgid ""
"The sequential print is on.\n"
"It's impossible to apply any custom G-code for objects printing "
@@ -965,258 +1040,326 @@ msgid ""
"This code won't be processed during G-code generation."
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1005
+#: src/slic3r/GUI/DoubleSlider.cpp:1288
msgid "Color change (\"%1%\")"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1006
+#: src/slic3r/GUI/DoubleSlider.cpp:1289
msgid "Color change (\"%1%\") for Extruder %2%"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1009
+#: src/slic3r/GUI/DoubleSlider.cpp:1291
msgid "Pause print (\"%1%\")"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1011
+#: src/slic3r/GUI/DoubleSlider.cpp:1293
+msgid "Custom template (\"%1%\")"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1295
msgid "Extruder (tool) is changed to Extruder \"%1%\""
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1019
+#: src/slic3r/GUI/DoubleSlider.cpp:1302
msgid "Note"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1021
+#: src/slic3r/GUI/DoubleSlider.cpp:1304
msgid ""
"G-code associated to this tick mark is in a conflict with print mode.\n"
"Editing it will cause changes of Slider data."
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1024
+#: src/slic3r/GUI/DoubleSlider.cpp:1307
msgid ""
"There is a color change for extruder that won't be used till the end of "
"print job.\n"
"This code won't be processed during G-code generation."
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1027
+#: src/slic3r/GUI/DoubleSlider.cpp:1310
msgid ""
"There is an extruder change set to the same extruder.\n"
"This code won't be processed during G-code generation."
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1030
+#: src/slic3r/GUI/DoubleSlider.cpp:1313
msgid ""
"There is a color change for extruder that has not been used before.\n"
"Check your settings to avoid redundant color changes."
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1035
+#: src/slic3r/GUI/DoubleSlider.cpp:1318
msgid "Delete tick mark - Left click or press \"-\" key"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1037
+#: src/slic3r/GUI/DoubleSlider.cpp:1320
msgid "Edit tick mark - Ctrl + Left click"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1038
+#: src/slic3r/GUI/DoubleSlider.cpp:1321
msgid "Edit tick mark - Right click"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1134 src/slic3r/GUI/DoubleSlider.cpp:1170
-#: src/slic3r/GUI/GLCanvas3D.cpp:977 src/slic3r/GUI/GUI_ObjectList.cpp:1712
-#: src/slic3r/GUI/Tab.cpp:2305 src/libslic3r/GCode/PreviewData.cpp:445
+#: src/slic3r/GUI/DoubleSlider.cpp:1417 src/slic3r/GUI/DoubleSlider.cpp:1451
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1864
#, possible-c-format
msgid "Extruder %d"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1135 src/slic3r/GUI/GUI_ObjectList.cpp:1713
+#: src/slic3r/GUI/DoubleSlider.cpp:1418 src/slic3r/GUI/GUI_ObjectList.cpp:1865
msgid "active"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1144
+#: src/slic3r/GUI/DoubleSlider.cpp:1427
msgid "Switch code to Change extruder"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1144 src/slic3r/GUI/GUI_ObjectList.cpp:1679
+#: src/slic3r/GUI/DoubleSlider.cpp:1427 src/slic3r/GUI/GUI_ObjectList.cpp:1832
msgid "Change extruder"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1145
+#: src/slic3r/GUI/DoubleSlider.cpp:1428
msgid "Change extruder (N/A)"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1147
+#: src/slic3r/GUI/DoubleSlider.cpp:1430
msgid "Use another extruder"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1171
+#: src/slic3r/GUI/DoubleSlider.cpp:1452
msgid "used"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1179
+#: src/slic3r/GUI/DoubleSlider.cpp:1460
msgid "Switch code to Color change (%1%) for:"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1180
+#: src/slic3r/GUI/DoubleSlider.cpp:1461
msgid "Add color change (%1%) for:"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1477
+#: src/slic3r/GUI/DoubleSlider.cpp:1797
msgid "Add color change"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1487
+#: src/slic3r/GUI/DoubleSlider.cpp:1808
msgid "Add pause print"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1490
+#: src/slic3r/GUI/DoubleSlider.cpp:1812
+msgid "Add custom template"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1815
msgid "Add custom G-code"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1508
+#: src/slic3r/GUI/DoubleSlider.cpp:1833
msgid "Edit color"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1509
+#: src/slic3r/GUI/DoubleSlider.cpp:1834
msgid "Edit pause print message"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1510
+#: src/slic3r/GUI/DoubleSlider.cpp:1835
msgid "Edit custom G-code"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1516
+#: src/slic3r/GUI/DoubleSlider.cpp:1841
msgid "Delete color change"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1517
+#: src/slic3r/GUI/DoubleSlider.cpp:1842
msgid "Delete tool change"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1518
+#: src/slic3r/GUI/DoubleSlider.cpp:1843
msgid "Delete pause print"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1519
+#: src/slic3r/GUI/DoubleSlider.cpp:1844
msgid "Delete custom G-code"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1532
+#: src/slic3r/GUI/DoubleSlider.cpp:1854 src/slic3r/GUI/DoubleSlider.cpp:1995
+msgid "Jump to height"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1859
+msgid "Hide ruler"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1863
+msgid "Show object height"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1863
+msgid "Show object height on the ruler"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1867
+msgid "Show estimated print time"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1867
+msgid "Show estimated print time on the ruler"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1871
+msgid "Ruler mode"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1871
+msgid "Set ruler mode"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1876
msgid "Set extruder sequence for the entire print"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1618
+#: src/slic3r/GUI/DoubleSlider.cpp:1962
msgid "Enter custom G-code used on current layer"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1619
+#: src/slic3r/GUI/DoubleSlider.cpp:1963
msgid "Custom G-code on current layer (%1% mm)."
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1634
+#: src/slic3r/GUI/DoubleSlider.cpp:1978
msgid "Enter short message shown on Printer display when a print is paused"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1635
+#: src/slic3r/GUI/DoubleSlider.cpp:1979
msgid "Message for pause print on current layer (%1% mm)."
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1650
+#: src/slic3r/GUI/DoubleSlider.cpp:1994
+msgid "Enter the move you want to jump to"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1994
msgid "Enter the height you want to jump to"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1899
+#: src/slic3r/GUI/DoubleSlider.cpp:2239
msgid "The last color change data was saved for a single extruder printing."
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1900 src/slic3r/GUI/DoubleSlider.cpp:1916
+#: src/slic3r/GUI/DoubleSlider.cpp:2240 src/slic3r/GUI/DoubleSlider.cpp:2255
msgid "The last color change data was saved for a multi extruder printing."
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1902
+#: src/slic3r/GUI/DoubleSlider.cpp:2242
msgid "Your current changes will delete all saved color changes."
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1903 src/slic3r/GUI/DoubleSlider.cpp:1924
+#: src/slic3r/GUI/DoubleSlider.cpp:2243 src/slic3r/GUI/DoubleSlider.cpp:2263
msgid "Are you sure you want to continue?"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1917
+#: src/slic3r/GUI/DoubleSlider.cpp:2256
msgid ""
"Select YES if you want to delete all saved tool changes, \n"
"NO if you want all tool changes switch to color changes, \n"
"or CANCEL to leave it unchanged."
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1920
+#: src/slic3r/GUI/DoubleSlider.cpp:2259
msgid "Do you want to delete all saved tool changes?"
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1922
+#: src/slic3r/GUI/DoubleSlider.cpp:2261
msgid ""
"The last color change data was saved for a multi extruder printing with tool "
"changes for whole print."
msgstr ""
-#: src/slic3r/GUI/DoubleSlider.cpp:1923
+#: src/slic3r/GUI/DoubleSlider.cpp:2262
msgid "Your current changes will delete all saved extruder (tool) changes."
msgstr ""
-#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:23
+#: src/slic3r/GUI/ExtraRenderers.cpp:297 src/slic3r/GUI/GUI_ObjectList.cpp:512
+#: src/slic3r/GUI/GUI_ObjectList.cpp:524 src/slic3r/GUI/GUI_ObjectList.cpp:1033
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4582
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4592
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4627
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:209
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:266
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:291
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:499 src/libslic3r/PrintConfig.cpp:552
+msgid "default"
+msgstr ""
+
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:24
msgid "Set extruder sequence"
msgstr ""
-#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:39
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:40
msgid "Set extruder change for every"
msgstr ""
-#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:52
-#: src/libslic3r/PrintConfig.cpp:362 src/libslic3r/PrintConfig.cpp:994
-#: src/libslic3r/PrintConfig.cpp:1505 src/libslic3r/PrintConfig.cpp:1690
-#: src/libslic3r/PrintConfig.cpp:1757 src/libslic3r/PrintConfig.cpp:1937
-#: src/libslic3r/PrintConfig.cpp:1983
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:53
+#: src/libslic3r/PrintConfig.cpp:418 src/libslic3r/PrintConfig.cpp:1089
+#: src/libslic3r/PrintConfig.cpp:1718 src/libslic3r/PrintConfig.cpp:1883
+#: src/libslic3r/PrintConfig.cpp:1950 src/libslic3r/PrintConfig.cpp:2157
+#: src/libslic3r/PrintConfig.cpp:2203
msgid "layers"
msgstr ""
-#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:136
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:137
msgid "Set extruder(tool) sequence"
msgstr ""
-#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:182
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:183
msgid "Remove extruder from sequence"
msgstr ""
-#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:192
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:193
msgid "Add extruder to sequence"
msgstr ""
-#: src/slic3r/GUI/Field.cpp:136
+#: src/slic3r/GUI/Field.cpp:197
msgid "default value"
msgstr ""
-#: src/slic3r/GUI/Field.cpp:139
+#: src/slic3r/GUI/Field.cpp:200
msgid "parameter name"
msgstr ""
-#: src/slic3r/GUI/Field.cpp:150 src/slic3r/GUI/OptionsGroup.cpp:598
+#: src/slic3r/GUI/Field.cpp:211 src/slic3r/GUI/OptionsGroup.cpp:781
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:886
msgid "N/A"
msgstr ""
-#: src/slic3r/GUI/Field.cpp:175
+#: src/slic3r/GUI/Field.cpp:233
#, possible-c-format
msgid "%s doesn't support percentage"
msgstr ""
-#: src/slic3r/GUI/Field.cpp:195 src/slic3r/GUI/Field.cpp:226
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:383
+#: src/slic3r/GUI/Field.cpp:253 src/slic3r/GUI/Field.cpp:307
+#: src/slic3r/GUI/Field.cpp:1520 src/slic3r/GUI/GUI_ObjectLayers.cpp:413
msgid "Invalid numeric input."
msgstr ""
-#: src/slic3r/GUI/Field.cpp:204
+#: src/slic3r/GUI/Field.cpp:264
+#, possible-c-format
+msgid ""
+"Input value is out of range\n"
+"Are you sure that %s is a correct value and that you want to continue?"
+msgstr ""
+
+#: src/slic3r/GUI/Field.cpp:266 src/slic3r/GUI/Field.cpp:326
+msgid "Parameter validation"
+msgstr ""
+
+#: src/slic3r/GUI/Field.cpp:279 src/slic3r/GUI/Field.cpp:373
+#: src/slic3r/GUI/Field.cpp:1532
msgid "Input value is out of range"
msgstr ""
-#: src/slic3r/GUI/Field.cpp:240
+#: src/slic3r/GUI/Field.cpp:323
#, possible-c-format
msgid ""
"Do you mean %s%% instead of %s %s?\n"
@@ -1224,8 +1367,10 @@ msgid ""
"or NO if you are sure that %s %s is a correct value."
msgstr ""
-#: src/slic3r/GUI/Field.cpp:243
-msgid "Parameter validation"
+#: src/slic3r/GUI/Field.cpp:381
+msgid ""
+"Invalid input format. Expected vector of dimensions in the following format: "
+"\"%1%\""
msgstr ""
#: src/slic3r/GUI/FirmwareDialog.cpp:150
@@ -1300,8 +1445,9 @@ msgstr ""
msgid "Firmware image:"
msgstr ""
-#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1706
-#: src/slic3r/GUI/Tab.cpp:1768
+#: src/slic3r/GUI/FirmwareDialog.cpp:805
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:289
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364
msgid "Browse"
msgstr ""
@@ -1334,8 +1480,8 @@ msgid "Advanced: Output log"
msgstr ""
#: src/slic3r/GUI/FirmwareDialog.cpp:852
-#: src/slic3r/GUI/Mouse3DController.cpp:355
-#: src/slic3r/GUI/PrintHostDialogs.cpp:161
+#: src/slic3r/GUI/Mouse3DController.cpp:551
+#: src/slic3r/GUI/PrintHostDialogs.cpp:189
msgid "Close"
msgstr ""
@@ -1353,11 +1499,226 @@ msgstr ""
msgid "Cancelling..."
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/slic3r/GUI/GLCanvas3D.cpp:4596
+#: src/slic3r/GUI/GCodeViewer.cpp:239
+msgid "Tool position"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:1016
+msgid "Generating toolpaths"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:1405
+msgid "Generating vertex buffer"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:1496
+msgid "Generating index buffers"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2225
+msgid "Click to hide"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2225
+msgid "Click to show"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2337
+msgid "up to"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2343
+msgid "above"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2351
+msgid "from"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2351
+msgid "to"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2379 src/slic3r/GUI/GCodeViewer.cpp:2387
+#: src/slic3r/GUI/GUI_Preview.cpp:214 src/slic3r/GUI/GUI_Preview.cpp:533
+#: src/slic3r/GUI/GUI_Preview.cpp:942
+msgid "Feature type"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2379 src/slic3r/GUI/GCodeViewer.cpp:2387
+#: src/slic3r/GUI/RammingChart.cpp:76
+msgid "Time"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2387
+msgid "Percentage"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2390
+msgid "Height (mm)"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2391
+msgid "Width (mm)"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2392
+msgid "Speed (mm/s)"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2393
+msgid "Fan Speed (%)"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2394
+msgid "Volumetric flow rate (mm³/s)"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2395 src/slic3r/GUI/GUI_Preview.cpp:220
+#: src/slic3r/GUI/GUI_Preview.cpp:326 src/slic3r/GUI/GUI_Preview.cpp:471
+#: src/slic3r/GUI/GUI_Preview.cpp:532 src/slic3r/GUI/GUI_Preview.cpp:878
+#: src/slic3r/GUI/GUI_Preview.cpp:942
+msgid "Tool"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2396 src/slic3r/GUI/GUI_Preview.cpp:221
+#: src/slic3r/GUI/GUI_Preview.cpp:530 src/slic3r/GUI/GUI_Preview.cpp:941
+msgid "Color Print"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2432 src/slic3r/GUI/GCodeViewer.cpp:2467
+#: src/slic3r/GUI/GCodeViewer.cpp:2472 src/slic3r/GUI/GUI_ObjectList.cpp:312
+#: src/slic3r/GUI/wxExtensions.cpp:519 src/libslic3r/PrintConfig.cpp:547
+msgid "Extruder"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2443
+msgid "Default color"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2467
+msgid "default color"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2562 src/slic3r/GUI/GCodeViewer.cpp:2608
+msgid "Color change"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2581 src/slic3r/GUI/GCodeViewer.cpp:2606
+msgid "Print"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2607 src/slic3r/GUI/GCodeViewer.cpp:2624
+msgid "Pause"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2612 src/slic3r/GUI/GCodeViewer.cpp:2615
+msgid "Event"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2612 src/slic3r/GUI/GCodeViewer.cpp:2615
+msgid "Remaining time"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2615
+msgid "Duration"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2650 src/slic3r/GUI/GUI_Preview.cpp:1023
+#: src/libslic3r/PrintConfig.cpp:2380
+msgid "Travel"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2653
+msgid "Movement"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2654
+msgid "Extrusion"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2655 src/slic3r/GUI/Tab.cpp:1694
+#: src/slic3r/GUI/Tab.cpp:2582
+msgid "Retraction"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2672 src/slic3r/GUI/GCodeViewer.cpp:2675
+#: src/slic3r/GUI/GUI_Preview.cpp:1024
+msgid "Wipe"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2706 src/slic3r/GUI/GUI_Preview.cpp:248
+#: src/slic3r/GUI/GUI_Preview.cpp:262
+msgid "Options"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2709 src/slic3r/GUI/GUI_Preview.cpp:1025
+msgid "Retractions"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2710 src/slic3r/GUI/GUI_Preview.cpp:1026
+msgid "Deretractions"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2711 src/slic3r/GUI/GUI_Preview.cpp:1027
+msgid "Tool changes"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2712 src/slic3r/GUI/GUI_Preview.cpp:1028
+msgid "Color changes"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2713 src/slic3r/GUI/GUI_Preview.cpp:1029
+msgid "Print pauses"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2714 src/slic3r/GUI/GUI_Preview.cpp:1030
+msgid "Custom G-codes"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2725 src/slic3r/GUI/GCodeViewer.cpp:2749
+#: src/slic3r/GUI/Plater.cpp:697 src/libslic3r/PrintConfig.cpp:117
+msgid "Printer"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2727 src/slic3r/GUI/GCodeViewer.cpp:2754
+#: src/slic3r/GUI/Plater.cpp:693
+msgid "Print settings"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2730 src/slic3r/GUI/GCodeViewer.cpp:2760
+#: src/slic3r/GUI/Plater.cpp:694 src/slic3r/GUI/Tab.cpp:1794
+#: src/slic3r/GUI/Tab.cpp:1795
+msgid "Filament"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2785 src/slic3r/GUI/GCodeViewer.cpp:2790
+#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1135
+#: src/slic3r/GUI/Plater.cpp:1220
+msgid "Estimated printing time"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2785
+msgid "Normal mode"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2790
+msgid "Stealth mode"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2817
+msgid "Show stealth mode"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2821
+msgid "Show normal mode"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:236 src/slic3r/GUI/GLCanvas3D.cpp:4610
msgid "Variable layer height"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:237
+#: src/slic3r/GUI/GLCanvas3D.cpp:238
msgid "Left mouse button:"
msgstr ""
@@ -1365,299 +1726,435 @@ msgstr ""
msgid "Add detail"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:243
+#: src/slic3r/GUI/GLCanvas3D.cpp:242
msgid "Right mouse button:"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:246
+#: src/slic3r/GUI/GLCanvas3D.cpp:244
msgid "Remove detail"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:249
+#: src/slic3r/GUI/GLCanvas3D.cpp:246
msgid "Shift + Left mouse button:"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:252
+#: src/slic3r/GUI/GLCanvas3D.cpp:248
msgid "Reset to base"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:255
+#: src/slic3r/GUI/GLCanvas3D.cpp:250
msgid "Shift + Right mouse button:"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:258
+#: src/slic3r/GUI/GLCanvas3D.cpp:252
msgid "Smoothing"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:261
+#: src/slic3r/GUI/GLCanvas3D.cpp:254
msgid "Mouse wheel:"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:264
+#: src/slic3r/GUI/GLCanvas3D.cpp:256
msgid "Increase/decrease edit area"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:267
+#: src/slic3r/GUI/GLCanvas3D.cpp:259
msgid "Adaptive"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:273
+#: src/slic3r/GUI/GLCanvas3D.cpp:265
msgid "Quality / Speed"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:277
+#: src/slic3r/GUI/GLCanvas3D.cpp:268
msgid "Higher print quality versus higher print speed."
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:288
+#: src/slic3r/GUI/GLCanvas3D.cpp:279
msgid "Smooth"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:294 src/libslic3r/PrintConfig.cpp:511
+#: src/slic3r/GUI/GLCanvas3D.cpp:285 src/libslic3r/PrintConfig.cpp:571
msgid "Radius"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:304
+#: src/slic3r/GUI/GLCanvas3D.cpp:295
msgid "Keep min"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:313
+#: src/slic3r/GUI/GLCanvas3D.cpp:304 src/slic3r/GUI/GLCanvas3D.cpp:4050
msgid "Reset"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:599
+#: src/slic3r/GUI/GLCanvas3D.cpp:566
msgid "Variable layer height - Manual edit"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:685
-msgid "An object outside the print area was detected"
+#: src/slic3r/GUI/GLCanvas3D.cpp:634
+msgid "An object outside the print area was detected."
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:686
-msgid "A toolpath outside the print area was detected"
+#: src/slic3r/GUI/GLCanvas3D.cpp:635
+msgid "A toolpath outside the print area was detected."
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:687
-msgid "SLA supports outside the print area were detected"
+#: src/slic3r/GUI/GLCanvas3D.cpp:636
+msgid "SLA supports outside the print area were detected."
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:688
-msgid "Some objects are not visible"
+#: src/slic3r/GUI/GLCanvas3D.cpp:637
+msgid "Some objects are not visible."
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:690
+#: src/slic3r/GUI/GLCanvas3D.cpp:639
msgid ""
-"An object outside the print area was detected\n"
-"Resolve the current problem to continue slicing"
+"An object outside the print area was detected.\n"
+"Resolve the current problem to continue slicing."
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:904 src/slic3r/GUI/GLCanvas3D.cpp:933
-msgid "Default print color"
-msgstr ""
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:934 src/slic3r/GUI/GLCanvas3D.cpp:943
-#: src/slic3r/GUI/GLCanvas3D.cpp:982
-msgid "Pause print or custom G-code"
+#: src/slic3r/GUI/GLCanvas3D.cpp:949
+msgid "Seq."
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:955
-#, possible-c-format
-msgid "up to %.2f mm"
+#: src/slic3r/GUI/GLCanvas3D.cpp:1455
+msgid "Variable layer height - Reset"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:959
-#, possible-c-format
-msgid "above %.2f mm"
+#: src/slic3r/GUI/GLCanvas3D.cpp:1463
+msgid "Variable layer height - Adaptive"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:963
-#, possible-c-format
-msgid "%.2f - %.2f mm"
+#: src/slic3r/GUI/GLCanvas3D.cpp:1471
+msgid "Variable layer height - Smooth all"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:995
-#, possible-c-format
-msgid "Color change for Extruder %d at %.2f mm"
+#: src/slic3r/GUI/GLCanvas3D.cpp:1876
+msgid "Mirror Object"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:1305
-msgid "Seq."
+#: src/slic3r/GUI/GLCanvas3D.cpp:2746
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:520
+msgid "Gizmo-Move"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:1701
-msgid "Variable layer height - Reset"
+#: src/slic3r/GUI/GLCanvas3D.cpp:2832
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:522
+msgid "Gizmo-Rotate"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:1709
-msgid "Variable layer height - Adaptive"
+#: src/slic3r/GUI/GLCanvas3D.cpp:3388
+msgid "Move Object"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:1717
-msgid "Variable layer height - Smooth all"
+#: src/slic3r/GUI/GLCanvas3D.cpp:3858 src/slic3r/GUI/GLCanvas3D.cpp:4571
+msgid "Switch to Settings"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:2053
-msgid "Mirror Object"
+#: src/slic3r/GUI/GLCanvas3D.cpp:3859 src/slic3r/GUI/GLCanvas3D.cpp:4571
+msgid "Print Settings Tab"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:2921
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:570
-msgid "Gizmo-Move"
+#: src/slic3r/GUI/GLCanvas3D.cpp:3860 src/slic3r/GUI/GLCanvas3D.cpp:4572
+msgid "Filament Settings Tab"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:3001
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:572
-msgid "Gizmo-Rotate"
+#: src/slic3r/GUI/GLCanvas3D.cpp:3860 src/slic3r/GUI/GLCanvas3D.cpp:4572
+msgid "Material Settings Tab"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:3529
-msgid "Move Object"
+#: src/slic3r/GUI/GLCanvas3D.cpp:3861 src/slic3r/GUI/GLCanvas3D.cpp:4573
+msgid "Printer Settings Tab"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:4070
+#: src/slic3r/GUI/GLCanvas3D.cpp:3909
msgid "Undo History"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:4070
+#: src/slic3r/GUI/GLCanvas3D.cpp:3909
msgid "Redo History"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:4088
+#: src/slic3r/GUI/GLCanvas3D.cpp:3930
#, possible-c-format
msgid "Undo %1$d Action"
msgid_plural "Undo %1$d Actions"
msgstr[0] ""
msgstr[1] ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:4088
+#: src/slic3r/GUI/GLCanvas3D.cpp:3930
#, possible-c-format
msgid "Redo %1$d Action"
msgid_plural "Redo %1$d Actions"
msgstr[0] ""
msgstr[1] ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:4490
+#: src/slic3r/GUI/GLCanvas3D.cpp:3950 src/slic3r/GUI/GLCanvas3D.cpp:4589
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 src/slic3r/GUI/Search.cpp:351
+msgid "Search"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3964 src/slic3r/GUI/GLCanvas3D.cpp:3972
+#: src/slic3r/GUI/Search.cpp:358
+msgid "Enter a search term"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4003
+msgid "Arrange options"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4033
+msgid "Press %1%left mouse button to enter the exact value"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4035
+msgid "Spacing"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4042
+msgid "Enable rotations (slow)"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4060 src/slic3r/GUI/GLCanvas3D.cpp:4481
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 src/slic3r/GUI/Plater.cpp:1648
+msgid "Arrange"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4455
msgid "Add..."
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:4498 src/slic3r/GUI/GUI_ObjectList.cpp:1726
-#: src/slic3r/GUI/Plater.cpp:3998 src/slic3r/GUI/Plater.cpp:4020
-#: src/slic3r/GUI/Tab.cpp:3145
+#: src/slic3r/GUI/GLCanvas3D.cpp:4463 src/slic3r/GUI/GUI_ObjectList.cpp:1878
+#: src/slic3r/GUI/Plater.cpp:3998 src/slic3r/GUI/Plater.cpp:4022
+#: src/slic3r/GUI/Tab.cpp:3484
msgid "Delete"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:4507 src/slic3r/GUI/KBShortcutsDialog.cpp:131
-#: src/slic3r/GUI/Plater.cpp:4740
+#: src/slic3r/GUI/GLCanvas3D.cpp:4472 src/slic3r/GUI/KBShortcutsDialog.cpp:88
+#: src/slic3r/GUI/Plater.cpp:5107
msgid "Delete all"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:4516 src/slic3r/GUI/KBShortcutsDialog.cpp:157
-#: src/slic3r/GUI/Plater.cpp:2816
-msgid "Arrange"
+#: src/slic3r/GUI/GLCanvas3D.cpp:4481 src/slic3r/GUI/KBShortcutsDialog.cpp:121
+msgid "Arrange selection"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:4516 src/slic3r/GUI/KBShortcutsDialog.cpp:158
-msgid "Arrange selection"
+#: src/slic3r/GUI/GLCanvas3D.cpp:4481
+msgid "Click right mouse button to show arrangement options"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:4528
+#: src/slic3r/GUI/GLCanvas3D.cpp:4503
msgid "Copy"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:4537
+#: src/slic3r/GUI/GLCanvas3D.cpp:4512
msgid "Paste"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:4549 src/slic3r/GUI/Plater.cpp:3855
-#: src/slic3r/GUI/Plater.cpp:3867 src/slic3r/GUI/Plater.cpp:4007
+#: src/slic3r/GUI/GLCanvas3D.cpp:4524 src/slic3r/GUI/Plater.cpp:3857
+#: src/slic3r/GUI/Plater.cpp:3869 src/slic3r/GUI/Plater.cpp:4007
msgid "Add instance"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:4560 src/slic3r/GUI/Plater.cpp:4009
+#: src/slic3r/GUI/GLCanvas3D.cpp:4535 src/slic3r/GUI/Plater.cpp:4009
msgid "Remove instance"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:4573
+#: src/slic3r/GUI/GLCanvas3D.cpp:4548
msgid "Split to objects"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:4583 src/slic3r/GUI/GUI_ObjectList.cpp:1495
+#: src/slic3r/GUI/GLCanvas3D.cpp:4558 src/slic3r/GUI/GUI_ObjectList.cpp:1650
msgid "Split to parts"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:4647 src/slic3r/GUI/KBShortcutsDialog.cpp:132
-#: src/slic3r/GUI/MainFrame.cpp:662
+#: src/slic3r/GUI/GLCanvas3D.cpp:4660 src/slic3r/GUI/KBShortcutsDialog.cpp:89
+#: src/slic3r/GUI/MainFrame.cpp:1125
msgid "Undo"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:4647 src/slic3r/GUI/GLCanvas3D.cpp:4680
-msgid "Click right mouse button to open History"
+#: src/slic3r/GUI/GLCanvas3D.cpp:4660 src/slic3r/GUI/GLCanvas3D.cpp:4699
+msgid "Click right mouse button to open/close History"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:4664
+#: src/slic3r/GUI/GLCanvas3D.cpp:4683
msgid "Next Undo action: %1%"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:4680 src/slic3r/GUI/KBShortcutsDialog.cpp:133
-#: src/slic3r/GUI/MainFrame.cpp:665
+#: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:90
+#: src/slic3r/GUI/MainFrame.cpp:1128
msgid "Redo"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:4696
+#: src/slic3r/GUI/GLCanvas3D.cpp:4721
msgid "Next Redo action: %1%"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:6609
+#: src/slic3r/GUI/GLCanvas3D.cpp:6345
msgid "Selection-Add from rectangle"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3D.cpp:6628
+#: src/slic3r/GUI/GLCanvas3D.cpp:6364
msgid "Selection-Remove from rectangle"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:306
-#, possible-c-format
-msgid ""
-"PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n"
-"while OpenGL version %s, render %s, vendor %s was detected."
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:54
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:151 src/libslic3r/PrintConfig.cpp:3690
+msgid "Cut"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:309
-msgid "You may need to update your graphics card driver."
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:179
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487
+msgid "in"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:312
-msgid ""
-"As a workaround, you may run PrusaSlicer with a software rendered 3D "
-"graphics by running prusa-slicer.exe with the --sw_renderer parameter."
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:185
+msgid "Keep upper part"
msgstr ""
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:314
-msgid "Unsupported OpenGL version"
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:186
+msgid "Keep lower part"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:42
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3424
-msgid "Cut"
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:187
+msgid "Rotate lower part upwards"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:168
-msgid "Keep upper part"
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:192
+msgid "Perform cut"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:169
-msgid "Keep lower part"
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33
+msgid "Paint-on supports"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170
-msgid "Rotate lower part upwards"
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:25
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57
+msgid "Clipping of view"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:175
-msgid "Perform cut"
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:26
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58
+msgid "Reset direction"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:27
+msgid "Brush size"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:28
+msgid "Brush shape"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:29
+msgid "Left mouse button"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47
+msgid "Enforce supports"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31
+msgid "Right mouse button"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:373
+msgid "Block supports"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33
+msgid "Shift + Left mouse button"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:368
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:378
+msgid "Remove selection"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35
+msgid "Remove all selection"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36
+msgid "Circle"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1595
+msgid "Sphere"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:129
+msgid "Autoset by angle"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:136
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:118
+msgid "Reset selection"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:160
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141
+msgid "Alt + Mouse wheel"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:178
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:159
+msgid "Paints all facets inside, regardless of their orientation."
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:192
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:173
+msgid "Ignores facets facing away from the camera."
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:203
+msgid "Ctrl + Mouse wheel"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:233
+msgid "Autoset custom supports"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:45
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:235
+msgid "Threshold:"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242
+msgid "Enforce"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:245
+msgid "Block"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:295
+msgid "Block supports by angle"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:296
+msgid "Add supports by angle"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:40
msgid "Place on face"
msgstr ""
@@ -1674,11 +2171,12 @@ msgid "Offset"
msgstr ""
#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:56
msgid "Quality"
msgstr ""
#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44
-#: src/libslic3r/PrintConfig.cpp:2951
+#: src/libslic3r/PrintConfig.cpp:3183
msgid "Closing distance"
msgstr ""
@@ -1698,64 +2196,68 @@ msgstr ""
msgid "Remove all holes"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57
-msgid "Clipping of view"
-msgstr ""
-
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58
-msgid "Reset direction"
-msgstr ""
-
#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51
msgid "Show supports"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:423
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:308
msgid "Add drainage hole"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:541
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:424
msgid "Delete drainage hole"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:815
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:624
msgid "Hollowing parameter change"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:887
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:693
msgid "Change drainage hole diameter"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:979
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:785
msgid "Hollow and drill"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1061
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:835
msgid "Move drainage hole"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:64
msgid "Move"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:449
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:480
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:499
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:517
-#: src/libslic3r/PrintConfig.cpp:3473
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:461
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:527
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562
+#: src/libslic3r/PrintConfig.cpp:3739
msgid "Rotate"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:47
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:230
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:500
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:518
-#: src/libslic3r/PrintConfig.cpp:3488
+#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:78
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:238
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:547
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563
+#: src/libslic3r/PrintConfig.cpp:3754
msgid "Scale"
msgstr ""
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:30
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:381
+msgid "Enforce seam"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:383
+msgid "Block seam"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:46
+msgid "Seam painting"
+msgstr ""
+
#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47
msgid "Head diameter"
msgstr ""
@@ -1765,7 +2267,7 @@ msgid "Lock supports under new islands"
msgstr ""
#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1361
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218
msgid "Remove selected points"
msgstr ""
@@ -1774,12 +2276,12 @@ msgid "Remove all points"
msgstr ""
#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221
msgid "Apply changes"
msgstr ""
#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222
msgid "Discard changes"
msgstr ""
@@ -1788,12 +2290,12 @@ msgid "Minimal points distance"
msgstr ""
#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54
-#: src/libslic3r/PrintConfig.cpp:2781
+#: src/libslic3r/PrintConfig.cpp:3013
msgid "Support points density"
msgstr ""
#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224
msgid "Auto-generate points"
msgstr ""
@@ -1801,149 +2303,216 @@ msgstr ""
msgid "Manual editing"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:484
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:374
msgid "Add support point"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:621
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:514
msgid "Delete support point"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:810
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:694
msgid "Change point head diameter"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:878
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:762
msgid "Support parameter change"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:986
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869
msgid "SLA Support Points"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1007
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897
msgid "SLA gizmo turned on"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1035
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:911
msgid "Do you want to save your manually edited support points?"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1036
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912
msgid "Save changes?"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1048
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:924
msgid "SLA gizmo turned off"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1087
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:955
msgid "Move support point"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1186
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1048
msgid "Support points edit"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1258
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1127
msgid "Autogeneration will erase all manually edited points."
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1259
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1128
msgid "Are you sure you want to do it?"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 src/slic3r/GUI/GUI.cpp:258
-#: src/slic3r/GUI/Tab.cpp:3075 src/slic3r/GUI/WipeTowerDialog.cpp:45
-#: src/slic3r/GUI/WipeTowerDialog.cpp:366
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1129 src/slic3r/GUI/GUI.cpp:256
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:557
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:581
+#: src/slic3r/GUI/WipeTowerDialog.cpp:45 src/slic3r/GUI/WipeTowerDialog.cpp:366
msgid "Warning"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1134
msgid "Autogenerate support points"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1324
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1181
msgid "SLA gizmo keyboard shortcuts"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1335
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1192
msgid "Note: some shortcuts work in (non)editing mode only."
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1353
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1356
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1357
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214
msgid "Left click"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1353
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210
msgid "Add point"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1354
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211
msgid "Right click"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1354
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211
msgid "Remove point"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1355
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1358
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1359
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216
msgid "Drag"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1355
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212
msgid "Move point"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1356
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213
msgid "Add point to selection"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1357
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214
msgid "Remove point from selection"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1358
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215
msgid "Select by rectangle"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1359
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216
msgid "Deselect by rectangle"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1360
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217
msgid "Select all points"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1362
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219
msgid "Mouse wheel"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1362
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219
msgid "Move clipping plane"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220
msgid "Reset clipping plane"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223
msgid "Switch to editing mode"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:497
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:521
+msgid "Gizmo-Scale"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:630
msgid "Gizmo-Place on Face"
msgstr ""
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:571
-msgid "Gizmo-Scale"
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:39
+msgid "Entering Paint-on supports"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:40
+msgid "Entering Seam painting"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:47
+msgid "Leaving Seam painting"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:48
+msgid "Leaving Paint-on supports"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:371
+msgid "Add supports"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:239
+msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community."
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:241
+msgid ""
+"Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas "
+"Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others."
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:242
+msgid "Artwork model by Nora Al-Badri and Jan Nikolai Nelles"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:382
+msgid ""
+"Starting with %1% 2.3, configuration directory on Linux has changed "
+"(according to XDG Base Directory Specification) to \n"
+"%2%.\n"
+"\n"
+"This directory did not exist yet (maybe you run the new version for the "
+"first time).\n"
+"However, an old %1% configuration directory was detected in \n"
+"%3%.\n"
+"\n"
+"Consider moving the contents of the old directory to the new location in "
+"order to access your profiles, etc.\n"
+"Note that if you decide to downgrade %1% in future, it will use the old "
+"location again.\n"
+"\n"
+"What do you want to do now?"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:390
+#, possible-c-format
+msgid "%s - BREAKING CHANGE"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:392
+msgid "Quit, I will move my data now"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:184
+#: src/slic3r/GUI/GUI_App.cpp:392
+msgid "Start the application"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:580
#, possible-c-format
msgid ""
"%s has encountered an error. It was likely caused by running out of memory. "
@@ -1953,235 +2522,321 @@ msgid ""
"The application will now terminate."
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:187
+#: src/slic3r/GUI/GUI_App.cpp:583
msgid "Fatal error"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:487
-msgid "Changing of an application language"
+#: src/slic3r/GUI/GUI_App.cpp:587
+msgid ""
+"PrusaSlicer has encountered a localization error. Please report to "
+"PrusaSlicer team, what language was active and in which scenario this issue "
+"happened. Thank you.\n"
+"\n"
+"The application will now terminate."
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:590
+msgid "Critical error"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:711
+msgid ""
+"Error parsing PrusaSlicer config file, it is probably corrupted. Try to "
+"manually delete the file to recover from the error. Your user profiles will "
+"not be affected."
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:717
+msgid ""
+"Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to "
+"manually delete the file to recover from the error."
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:490 src/slic3r/GUI/GUI_App.cpp:498
+#: src/slic3r/GUI/GUI_App.cpp:771
+#, possible-c-format
+msgid ""
+"%s\n"
+"Do you want to continue?"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:773 src/slic3r/GUI/UnsavedChangesDialog.cpp:665
+msgid "Remember my choice"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:808
+msgid "Loading configuration"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:876
+msgid "Preparing settings tabs"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:1115
+msgid ""
+"You have the following presets with saved options for \"Print Host upload\""
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:1119
+msgid ""
+"But since this version of PrusaSlicer we don't show this information in "
+"Printer Settings anymore.\n"
+"Settings will be available in physical printers settings."
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:1121
+msgid ""
+"By default new Printer devices will be named as \"Printer N\" during its "
+"creation.\n"
+"Note: This name can be changed later from the physical printers settings"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:1124 src/slic3r/GUI/PhysicalPrinterDialog.cpp:626
+msgid "Information"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:1137 src/slic3r/GUI/GUI_App.cpp:1148
msgid "Recreating"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:503
+#: src/slic3r/GUI/GUI_App.cpp:1153
msgid "Loading of current presets"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:508
+#: src/slic3r/GUI/GUI_App.cpp:1158
msgid "Loading of a mode view"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:587
+#: src/slic3r/GUI/GUI_App.cpp:1234
msgid "Choose one file (3MF/AMF):"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:599
+#: src/slic3r/GUI/GUI_App.cpp:1246
msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:660
+#: src/slic3r/GUI/GUI_App.cpp:1258
+msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:1269
+msgid "Changing of an application language"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:1392
msgid "Select the language"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:660
+#: src/slic3r/GUI/GUI_App.cpp:1392
msgid "Language"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:828
+#: src/slic3r/GUI/GUI_App.cpp:1541
+msgid "modified"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:1590
#, possible-c-format
msgid "Run %s"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:831
+#: src/slic3r/GUI/GUI_App.cpp:1594
msgid "&Configuration Snapshots"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:831
+#: src/slic3r/GUI/GUI_App.cpp:1594
msgid "Inspect / activate configuration snapshots"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:832
+#: src/slic3r/GUI/GUI_App.cpp:1595
msgid "Take Configuration &Snapshot"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:832
+#: src/slic3r/GUI/GUI_App.cpp:1595
msgid "Capture a configuration snapshot"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:833
+#: src/slic3r/GUI/GUI_App.cpp:1596
msgid "Check for updates"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:833
+#: src/slic3r/GUI/GUI_App.cpp:1596
msgid "Check for configuration updates"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:835
+#: src/slic3r/GUI/GUI_App.cpp:1599
msgid "&Preferences"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:841
+#: src/slic3r/GUI/GUI_App.cpp:1605
msgid "Application preferences"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:844 src/slic3r/GUI/wxExtensions.cpp:756
+#: src/slic3r/GUI/GUI_App.cpp:1610 src/slic3r/GUI/wxExtensions.cpp:685
msgid "Simple"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:844
+#: src/slic3r/GUI/GUI_App.cpp:1610
msgid "Simple View Mode"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:845 src/slic3r/GUI/GUI_ObjectList.cpp:104
-#: src/slic3r/GUI/GUI_ObjectList.cpp:620 src/slic3r/GUI/Tab.cpp:1147
-#: src/slic3r/GUI/Tab.cpp:1162 src/slic3r/GUI/Tab.cpp:1262
-#: src/slic3r/GUI/Tab.cpp:1265 src/slic3r/GUI/Tab.cpp:1526
-#: src/slic3r/GUI/Tab.cpp:1990 src/slic3r/GUI/Tab.cpp:3720
-#: src/slic3r/GUI/wxExtensions.cpp:757 src/libslic3r/PrintConfig.cpp:88
-#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:223
-#: src/libslic3r/PrintConfig.cpp:1037 src/libslic3r/PrintConfig.cpp:2283
-#: src/libslic3r/PrintConfig.cpp:2455
+#: src/slic3r/GUI/GUI_App.cpp:1612 src/slic3r/GUI/wxExtensions.cpp:687
+msgctxt "Mode"
msgid "Advanced"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:845
+#: src/slic3r/GUI/GUI_App.cpp:1612
msgid "Advanced View Mode"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:846 src/slic3r/GUI/wxExtensions.cpp:758
+#: src/slic3r/GUI/GUI_App.cpp:1613 src/slic3r/GUI/wxExtensions.cpp:688
msgid "Expert"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:846
+#: src/slic3r/GUI/GUI_App.cpp:1613
msgid "Expert View Mode"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:851
+#: src/slic3r/GUI/GUI_App.cpp:1618
msgid "Mode"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:851
+#: src/slic3r/GUI/GUI_App.cpp:1618
#, possible-c-format
msgid "%s View Mode"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:853
+#: src/slic3r/GUI/GUI_App.cpp:1621
msgid "&Language"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:855
+#: src/slic3r/GUI/GUI_App.cpp:1624
msgid "Flash printer &firmware"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:855
+#: src/slic3r/GUI/GUI_App.cpp:1624
msgid "Upload a firmware image into an Arduino based printer"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:870
+#: src/slic3r/GUI/GUI_App.cpp:1640
msgid "Taking configuration snapshot"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:870
+#: src/slic3r/GUI/GUI_App.cpp:1640
msgid "Snapshot name"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:917
+#: src/slic3r/GUI/GUI_App.cpp:1669
+msgid "Failed to activate configuration snapshot."
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:1719
+msgid "Language selection"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:1721
msgid ""
"Switching the language will trigger application restart.\n"
"You will lose content of the plater."
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:919
+#: src/slic3r/GUI/GUI_App.cpp:1723
msgid "Do you want to proceed?"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:920
-msgid "Language selection"
+#: src/slic3r/GUI/GUI_App.cpp:1750
+msgid "&Configuration"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:944
-msgid "&Configuration"
+#: src/slic3r/GUI/GUI_App.cpp:1781
+msgid "The preset(s) modifications are successfully saved"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:968
-msgid "The presets on the following tabs were modified"
+#: src/slic3r/GUI/GUI_App.cpp:1802
+msgid "The uploads are still ongoing"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:968 src/slic3r/GUI/Tab.cpp:2935
-msgid "Discard changes and continue anyway?"
+#: src/slic3r/GUI/GUI_App.cpp:1802
+msgid "Stop them and continue anyway?"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:971
-msgid "Unsaved Presets"
+#: src/slic3r/GUI/GUI_App.cpp:1805
+msgid "Ongoing uploads"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:1120 src/slic3r/GUI/Tab.cpp:2947
+#: src/slic3r/GUI/GUI_App.cpp:2019 src/slic3r/GUI/Tab.cpp:3242
msgid "It's impossible to print multi-part object(s) with SLA technology."
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:1121
+#: src/slic3r/GUI/GUI_App.cpp:2020
msgid "Please check and fix your object list."
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:1122 src/slic3r/GUI/Plater.cpp:2375
-#: src/slic3r/GUI/Tab.cpp:2949
+#: src/slic3r/GUI/GUI_App.cpp:2021 src/slic3r/GUI/Jobs/SLAImportJob.cpp:210
+#: src/slic3r/GUI/Plater.cpp:2359 src/slic3r/GUI/Tab.cpp:3244
msgid "Attention!"
msgstr ""
-#: src/slic3r/GUI/GUI_App.cpp:1139
+#: src/slic3r/GUI/GUI_App.cpp:2038
msgid "Select a gcode file:"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27
+#: src/slic3r/GUI/GUI_Init.cpp:73 src/slic3r/GUI/GUI_Init.cpp:76
+msgid "PrusaSlicer GUI initialization failed"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_Init.cpp:76
+msgid "Fatal error, exception catched: %1%"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29
msgid "Start at height"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29
msgid "Stop at height"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:158
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:161
msgid "Remove layer range"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:162
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:165
msgid "Add layer range"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:95
-#: src/slic3r/GUI/GUI_ObjectList.cpp:611 src/libslic3r/PrintConfig.cpp:72
-#: src/libslic3r/PrintConfig.cpp:175 src/libslic3r/PrintConfig.cpp:184
-#: src/libslic3r/PrintConfig.cpp:408 src/libslic3r/PrintConfig.cpp:470
-#: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:890
-#: src/libslic3r/PrintConfig.cpp:1075 src/libslic3r/PrintConfig.cpp:1374
-#: src/libslic3r/PrintConfig.cpp:1441 src/libslic3r/PrintConfig.cpp:1622
-#: src/libslic3r/PrintConfig.cpp:2081 src/libslic3r/PrintConfig.cpp:2140
-#: src/libslic3r/PrintConfig.cpp:2149
+#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:92
+#: src/slic3r/GUI/GUI_ObjectList.cpp:667 src/libslic3r/PrintConfig.cpp:74
+#: src/libslic3r/PrintConfig.cpp:189 src/libslic3r/PrintConfig.cpp:231
+#: src/libslic3r/PrintConfig.cpp:240 src/libslic3r/PrintConfig.cpp:464
+#: src/libslic3r/PrintConfig.cpp:530 src/libslic3r/PrintConfig.cpp:538
+#: src/libslic3r/PrintConfig.cpp:970 src/libslic3r/PrintConfig.cpp:1219
+#: src/libslic3r/PrintConfig.cpp:1584 src/libslic3r/PrintConfig.cpp:1650
+#: src/libslic3r/PrintConfig.cpp:1835 src/libslic3r/PrintConfig.cpp:2302
+#: src/libslic3r/PrintConfig.cpp:2361 src/libslic3r/PrintConfig.cpp:2370
msgid "Layers and Perimeters"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:97
-#: src/slic3r/GUI/GUI_ObjectList.cpp:613 src/slic3r/GUI/GUI_Preview.cpp:246
-#: src/slic3r/GUI/Tab.cpp:1181 src/slic3r/GUI/Tab.cpp:1182
-#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/PrintConfig.cpp:370
-#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1873
-#: src/libslic3r/PrintConfig.cpp:1879 src/libslic3r/PrintConfig.cpp:1887
-#: src/libslic3r/PrintConfig.cpp:1899 src/libslic3r/PrintConfig.cpp:1909
-#: src/libslic3r/PrintConfig.cpp:1917 src/libslic3r/PrintConfig.cpp:1932
-#: src/libslic3r/PrintConfig.cpp:1953 src/libslic3r/PrintConfig.cpp:1965
-#: src/libslic3r/PrintConfig.cpp:1981 src/libslic3r/PrintConfig.cpp:1990
-#: src/libslic3r/PrintConfig.cpp:1999 src/libslic3r/PrintConfig.cpp:2010
-#: src/libslic3r/PrintConfig.cpp:2024 src/libslic3r/PrintConfig.cpp:2032
-#: src/libslic3r/PrintConfig.cpp:2033 src/libslic3r/PrintConfig.cpp:2042
-#: src/libslic3r/PrintConfig.cpp:2050 src/libslic3r/PrintConfig.cpp:2064
+#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:95
+#: src/slic3r/GUI/GUI_ObjectList.cpp:670 src/slic3r/GUI/GUI_Preview.cpp:240
+#: src/slic3r/GUI/Tab.cpp:1472 src/slic3r/GUI/Tab.cpp:1474
+#: src/libslic3r/ExtrusionEntity.cpp:320 src/libslic3r/ExtrusionEntity.cpp:352
+#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:1715
+#: src/libslic3r/PrintConfig.cpp:2093 src/libslic3r/PrintConfig.cpp:2099
+#: src/libslic3r/PrintConfig.cpp:2107 src/libslic3r/PrintConfig.cpp:2119
+#: src/libslic3r/PrintConfig.cpp:2129 src/libslic3r/PrintConfig.cpp:2137
+#: src/libslic3r/PrintConfig.cpp:2152 src/libslic3r/PrintConfig.cpp:2173
+#: src/libslic3r/PrintConfig.cpp:2185 src/libslic3r/PrintConfig.cpp:2201
+#: src/libslic3r/PrintConfig.cpp:2210 src/libslic3r/PrintConfig.cpp:2219
+#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2244
+#: src/libslic3r/PrintConfig.cpp:2252 src/libslic3r/PrintConfig.cpp:2253
+#: src/libslic3r/PrintConfig.cpp:2262 src/libslic3r/PrintConfig.cpp:2270
+#: src/libslic3r/PrintConfig.cpp:2284
msgid "Support material"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:101
-#: src/slic3r/GUI/GUI_ObjectList.cpp:617 src/libslic3r/PrintConfig.cpp:2259
-#: src/libslic3r/PrintConfig.cpp:2267
+#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:99
+#: src/slic3r/GUI/GUI_ObjectList.cpp:674 src/libslic3r/PrintConfig.cpp:2480
+#: src/libslic3r/PrintConfig.cpp:2488
msgid "Wipe options"
msgstr ""
@@ -2205,404 +2860,432 @@ msgstr ""
msgid "Add support blocker"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:614
-#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/Tab.cpp:1206
-#: src/libslic3r/PrintConfig.cpp:235 src/libslic3r/PrintConfig.cpp:458
-#: src/libslic3r/PrintConfig.cpp:919 src/libslic3r/PrintConfig.cpp:1048
-#: src/libslic3r/PrintConfig.cpp:1431 src/libslic3r/PrintConfig.cpp:1668
-#: src/libslic3r/PrintConfig.cpp:1723 src/libslic3r/PrintConfig.cpp:1775
-#: src/libslic3r/PrintConfig.cpp:2125
+#: src/slic3r/GUI/GUI_ObjectList.cpp:94 src/slic3r/GUI/GUI_ObjectList.cpp:669
+#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/Tab.cpp:1442
+#: src/libslic3r/ExtrusionEntity.cpp:316 src/libslic3r/ExtrusionEntity.cpp:344
+#: src/libslic3r/PrintConfig.cpp:1226 src/libslic3r/PrintConfig.cpp:1232
+#: src/libslic3r/PrintConfig.cpp:1246 src/libslic3r/PrintConfig.cpp:1256
+#: src/libslic3r/PrintConfig.cpp:1264 src/libslic3r/PrintConfig.cpp:1266
+msgid "Ironing"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:671
+#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/Tab.cpp:1498
+#: src/libslic3r/PrintConfig.cpp:291 src/libslic3r/PrintConfig.cpp:518
+#: src/libslic3r/PrintConfig.cpp:1012 src/libslic3r/PrintConfig.cpp:1192
+#: src/libslic3r/PrintConfig.cpp:1265 src/libslic3r/PrintConfig.cpp:1640
+#: src/libslic3r/PrintConfig.cpp:1916 src/libslic3r/PrintConfig.cpp:1968
+#: src/libslic3r/PrintConfig.cpp:2346
msgid "Speed"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:99 src/slic3r/GUI/GUI_ObjectList.cpp:615
-#: src/slic3r/GUI/Tab.cpp:1241 src/slic3r/GUI/Tab.cpp:1861
-#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:1002
-#: src/libslic3r/PrintConfig.cpp:1409 src/libslic3r/PrintConfig.cpp:1744
-#: src/libslic3r/PrintConfig.cpp:1945 src/libslic3r/PrintConfig.cpp:1972
+#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:672
+#: src/slic3r/GUI/Tab.cpp:1534 src/slic3r/GUI/Tab.cpp:2112
+#: src/libslic3r/PrintConfig.cpp:548 src/libslic3r/PrintConfig.cpp:1146
+#: src/libslic3r/PrintConfig.cpp:1618 src/libslic3r/PrintConfig.cpp:1937
+#: src/libslic3r/PrintConfig.cpp:2165 src/libslic3r/PrintConfig.cpp:2192
msgid "Extruders"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:100 src/slic3r/GUI/GUI_ObjectList.cpp:616
-#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:555
-#: src/libslic3r/PrintConfig.cpp:877 src/libslic3r/PrintConfig.cpp:1010
-#: src/libslic3r/PrintConfig.cpp:1418 src/libslic3r/PrintConfig.cpp:1764
-#: src/libslic3r/PrintConfig.cpp:1954 src/libslic3r/PrintConfig.cpp:2113
+#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:673
+#: src/libslic3r/PrintConfig.cpp:507 src/libslic3r/PrintConfig.cpp:616
+#: src/libslic3r/PrintConfig.cpp:957 src/libslic3r/PrintConfig.cpp:1154
+#: src/libslic3r/PrintConfig.cpp:1627 src/libslic3r/PrintConfig.cpp:1957
+#: src/libslic3r/PrintConfig.cpp:2174 src/libslic3r/PrintConfig.cpp:2334
msgid "Extrusion Width"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/GUI_ObjectList.cpp:622
-#: src/slic3r/GUI/Plater.cpp:500 src/slic3r/GUI/Tab.cpp:3661
-#: src/slic3r/GUI/Tab.cpp:3662 src/libslic3r/PrintConfig.cpp:2621
-#: src/libslic3r/PrintConfig.cpp:2628 src/libslic3r/PrintConfig.cpp:2637
-#: src/libslic3r/PrintConfig.cpp:2646 src/libslic3r/PrintConfig.cpp:2656
-#: src/libslic3r/PrintConfig.cpp:2692 src/libslic3r/PrintConfig.cpp:2699
-#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2720
-#: src/libslic3r/PrintConfig.cpp:2729 src/libslic3r/PrintConfig.cpp:2742
-#: src/libslic3r/PrintConfig.cpp:2752 src/libslic3r/PrintConfig.cpp:2761
-#: src/libslic3r/PrintConfig.cpp:2771 src/libslic3r/PrintConfig.cpp:2782
-#: src/libslic3r/PrintConfig.cpp:2790
+#: src/slic3r/GUI/GUI_ObjectList.cpp:102 src/slic3r/GUI/GUI_ObjectList.cpp:677
+#: src/slic3r/GUI/Tab.cpp:1428 src/slic3r/GUI/Tab.cpp:1452
+#: src/slic3r/GUI/Tab.cpp:1555 src/slic3r/GUI/Tab.cpp:1558
+#: src/slic3r/GUI/Tab.cpp:1855 src/slic3r/GUI/Tab.cpp:2197
+#: src/slic3r/GUI/Tab.cpp:4114 src/libslic3r/PrintConfig.cpp:92
+#: src/libslic3r/PrintConfig.cpp:132 src/libslic3r/PrintConfig.cpp:279
+#: src/libslic3r/PrintConfig.cpp:1097 src/libslic3r/PrintConfig.cpp:1181
+#: src/libslic3r/PrintConfig.cpp:2504 src/libslic3r/PrintConfig.cpp:2676
+msgid "Advanced"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:679
+#: src/slic3r/GUI/Plater.cpp:357 src/slic3r/GUI/Tab.cpp:4048
+#: src/slic3r/GUI/Tab.cpp:4049 src/libslic3r/PrintConfig.cpp:2842
+#: src/libslic3r/PrintConfig.cpp:2849 src/libslic3r/PrintConfig.cpp:2858
+#: src/libslic3r/PrintConfig.cpp:2867 src/libslic3r/PrintConfig.cpp:2877
+#: src/libslic3r/PrintConfig.cpp:2887 src/libslic3r/PrintConfig.cpp:2924
+#: src/libslic3r/PrintConfig.cpp:2931 src/libslic3r/PrintConfig.cpp:2942
+#: src/libslic3r/PrintConfig.cpp:2952 src/libslic3r/PrintConfig.cpp:2961
+#: src/libslic3r/PrintConfig.cpp:2974 src/libslic3r/PrintConfig.cpp:2984
+#: src/libslic3r/PrintConfig.cpp:2993 src/libslic3r/PrintConfig.cpp:3003
+#: src/libslic3r/PrintConfig.cpp:3014 src/libslic3r/PrintConfig.cpp:3022
msgid "Supports"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:107 src/slic3r/GUI/GUI_ObjectList.cpp:623
-#: src/slic3r/GUI/Plater.cpp:640 src/slic3r/GUI/Tab.cpp:3695
-#: src/slic3r/GUI/Tab.cpp:3696 src/libslic3r/PrintConfig.cpp:2798
-#: src/libslic3r/PrintConfig.cpp:2805 src/libslic3r/PrintConfig.cpp:2819
-#: src/libslic3r/PrintConfig.cpp:2830 src/libslic3r/PrintConfig.cpp:2840
-#: src/libslic3r/PrintConfig.cpp:2862 src/libslic3r/PrintConfig.cpp:2873
-#: src/libslic3r/PrintConfig.cpp:2880 src/libslic3r/PrintConfig.cpp:2887
-#: src/libslic3r/PrintConfig.cpp:2898 src/libslic3r/PrintConfig.cpp:2907
-#: src/libslic3r/PrintConfig.cpp:2916
+#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:680
+#: src/slic3r/GUI/Plater.cpp:500 src/slic3r/GUI/Tab.cpp:4089
+#: src/slic3r/GUI/Tab.cpp:4090 src/slic3r/GUI/Tab.cpp:4161
+#: src/libslic3r/PrintConfig.cpp:3030 src/libslic3r/PrintConfig.cpp:3037
+#: src/libslic3r/PrintConfig.cpp:3051 src/libslic3r/PrintConfig.cpp:3062
+#: src/libslic3r/PrintConfig.cpp:3072 src/libslic3r/PrintConfig.cpp:3094
+#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3112
+#: src/libslic3r/PrintConfig.cpp:3119 src/libslic3r/PrintConfig.cpp:3130
+#: src/libslic3r/PrintConfig.cpp:3139 src/libslic3r/PrintConfig.cpp:3148
msgid "Pad"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:108 src/slic3r/GUI/Tab.cpp:3713
-#: src/slic3r/GUI/Tab.cpp:3714 src/libslic3r/SLA/Hollowing.cpp:46
-#: src/libslic3r/SLA/Hollowing.cpp:58 src/libslic3r/SLA/Hollowing.cpp:67
-#: src/libslic3r/SLA/Hollowing.cpp:76 src/libslic3r/PrintConfig.cpp:2926
-#: src/libslic3r/PrintConfig.cpp:2933 src/libslic3r/PrintConfig.cpp:2943
-#: src/libslic3r/PrintConfig.cpp:2952
+#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:4107
+#: src/slic3r/GUI/Tab.cpp:4108 src/libslic3r/SLA/Hollowing.cpp:45
+#: src/libslic3r/SLA/Hollowing.cpp:57 src/libslic3r/SLA/Hollowing.cpp:66
+#: src/libslic3r/SLA/Hollowing.cpp:75 src/libslic3r/PrintConfig.cpp:3158
+#: src/libslic3r/PrintConfig.cpp:3165 src/libslic3r/PrintConfig.cpp:3175
+#: src/libslic3r/PrintConfig.cpp:3184
msgid "Hollowing"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:275
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153
+#: src/slic3r/GUI/GUI_ObjectList.cpp:300
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:161
msgid "Name"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:283 src/slic3r/GUI/Tab.cpp:1490
-#: src/slic3r/GUI/wxExtensions.cpp:598 src/libslic3r/PrintConfig.cpp:487
-msgid "Extruder"
-msgstr ""
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:287 src/slic3r/GUI/GUI_ObjectList.cpp:400
+#: src/slic3r/GUI/GUI_ObjectList.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:457
msgid "Editing"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:345
+#: src/slic3r/GUI/GUI_ObjectList.cpp:402
#, possible-c-format
msgid "Auto-repaired (%d errors):"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:352
+#: src/slic3r/GUI/GUI_ObjectList.cpp:409
msgid "degenerate facets"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:353
+#: src/slic3r/GUI/GUI_ObjectList.cpp:410
msgid "edges fixed"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:354
+#: src/slic3r/GUI/GUI_ObjectList.cpp:411
msgid "facets removed"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:355
+#: src/slic3r/GUI/GUI_ObjectList.cpp:412
msgid "facets added"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:356
+#: src/slic3r/GUI/GUI_ObjectList.cpp:413
msgid "facets reversed"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:357
+#: src/slic3r/GUI/GUI_ObjectList.cpp:414
msgid "backwards edges"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:365
+#: src/slic3r/GUI/GUI_ObjectList.cpp:422
msgid "Right button click the icon to fix STL through Netfabb"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:402
+#: src/slic3r/GUI/GUI_ObjectList.cpp:459
msgid "Right button click the icon to change the object settings"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:404
+#: src/slic3r/GUI/GUI_ObjectList.cpp:461
msgid "Click the icon to change the object settings"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:408
+#: src/slic3r/GUI/GUI_ObjectList.cpp:465
msgid "Right button click the icon to change the object printable property"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:410
+#: src/slic3r/GUI/GUI_ObjectList.cpp:467
msgid "Click the icon to change the object printable property"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:455 src/slic3r/GUI/GUI_ObjectList.cpp:467
-#: src/slic3r/GUI/GUI_ObjectList.cpp:925 src/slic3r/GUI/GUI_ObjectList.cpp:4036
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4046
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4081
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:200
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:257
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:282
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:490
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:1753
-msgid "default"
-msgstr ""
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:534
+#: src/slic3r/GUI/GUI_ObjectList.cpp:590
msgid "Change Extruder"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:549
+#: src/slic3r/GUI/GUI_ObjectList.cpp:605
msgid "Rename Object"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:549
+#: src/slic3r/GUI/GUI_ObjectList.cpp:605
msgid "Rename Sub-object"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1099
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3850
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1247
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4372
msgid "Instances to Separated Objects"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1114
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1262
msgid "Volumes in Object reordered"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1114
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1262
msgid "Object reordered"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1190
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1538
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1544
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1857
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1338
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1693
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1699
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2081
#, possible-c-format
msgid "Quick Add Settings (%s)"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1273
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1428
msgid "Select showing settings"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1322
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1477
msgid "Add Settings for Layers"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1323
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1478
msgid "Add Settings for Sub-object"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1324
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1479
msgid "Add Settings for Object"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1394
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1549
msgid "Add Settings Bundle for Height range"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1395
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1550
msgid "Add Settings Bundle for Sub-object"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1396
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1551
msgid "Add Settings Bundle for Object"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1435
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1590
msgid "Load"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1440
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1472
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1476
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1595
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1627
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1631
msgid "Box"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1440
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1595
msgid "Cylinder"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1440
-msgid "Sphere"
-msgstr ""
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1440
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1595
msgid "Slab"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1508
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1663
msgid "Height range Modifier"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1517
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1672
msgid "Add settings"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1597
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1750
msgid "Change type"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1607
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1619
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1760
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1772
msgid "Set as a Separated Object"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1619
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1772
msgid "Set as a Separated Objects"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1629
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1782
msgid "Printable"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1644
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1797
msgid "Rename"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1655
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1808
msgid "Fix through the Netfabb"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1665 src/slic3r/GUI/Plater.cpp:4033
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1818 src/slic3r/GUI/Plater.cpp:4035
msgid "Export as STL"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1672
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4025 src/slic3r/GUI/Plater.cpp:4001
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1825
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4567 src/slic3r/GUI/Plater.cpp:4001
msgid "Reload the selected volumes from disk"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1679
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1832
msgid "Set extruder for selected items"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1712 src/libslic3r/PrintConfig.cpp:335
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1864 src/libslic3r/PrintConfig.cpp:391
msgid "Default"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1732
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1884
msgid "Scale to print volume"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1732
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1884
msgid "Scale the selected object to fit the print volume"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1801
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2059
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1913 src/slic3r/GUI/Plater.cpp:5224
+msgid "Convert from imperial units"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1915 src/slic3r/GUI/Plater.cpp:5224
+msgid "Revert conversion from imperial units"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1944
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1952
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2630 src/libslic3r/PrintConfig.cpp:3730
+msgid "Merge"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1944
+msgid "Merge objects to the one multipart object"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1952
+msgid "Merge objects to the one single object"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2026
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2283
msgid "Add Shape"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1887
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2111
msgid "Load Part"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1926
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2150
msgid "Error!"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2001
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2225
msgid "Add Generic Subobject"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2030
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2254
msgid "Generic"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2148
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2250
-msgid "Last instance of an object cannot be deleted."
-msgstr ""
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2160
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2380
msgid "Delete Settings"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2184
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2402
msgid "Delete All Instances from Object"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2200
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2418
msgid "Delete Height Range"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2231
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2450
msgid "From Object List You can't delete the last solid part from object."
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2235
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2454
msgid "Delete Subobject"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2254
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2469
+msgid "Last instance of an object cannot be deleted."
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2473
msgid "Delete Instance"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2278 src/slic3r/GUI/Plater.cpp:3045
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2497 src/slic3r/GUI/Plater.cpp:2865
msgid ""
"The selected object couldn't be split because it contains only one part."
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2282
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2501
msgid "Split to Parts"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2336
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2637
+msgid "Merged"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2721
+msgid "Merge all parts to the one single object"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2753
msgid "Add Layers"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2462
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2907
msgid "Group manipulation"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2474
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2919
msgid "Object manipulation"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2487
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2932
msgid "Object Settings to modify"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2491
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2936
msgid "Part Settings to modify"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2496
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2941
msgid "Layer range Settings to modify"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2502
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2947
msgid "Part manipulation"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2508
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2953
msgid "Instance manipulation"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2515
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2960
msgid "Height ranges"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2515
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2960
msgid "Settings for height range"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2701
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3144
msgid "Delete Selected Item"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2838
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3332
msgid "Delete Selected"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2914
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2942
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2962
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3408
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3436
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3456
msgid "Add Height Range"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3008
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3502
msgid ""
"Cannot insert a new layer range after the current layer range.\n"
"The next layer range is too thin to be split to two\n"
"without violating the minimum layer height."
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3012
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3506
msgid ""
"Cannot insert a new layer range between the current and the next layer "
"range.\n"
@@ -2610,206 +3293,212 @@ msgid ""
"is thinner than the minimum layer height allowed."
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3017
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3511
msgid ""
"Cannot insert a new layer range after the current layer range.\n"
"Current layer range overlaps with the next layer range."
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3070
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3570
msgid "Edit Height Range"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3360
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3865
msgid "Selection-Remove from list"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3368
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3873
msgid "Selection-Add from list"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3486
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4008
msgid "Object or Instance"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3487
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3620
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4009
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4142
msgid "Part"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3487
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4009
msgid "Layer"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3489
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4011
msgid "Unsupported selection"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3490
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4012
#, possible-c-format
msgid "You started your selection with %s Item."
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3491
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4013
#, possible-c-format
msgid "In this mode you can select only other %s Items%s"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3494
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4016
msgid "of a current Object"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3499
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3574 src/slic3r/GUI/Plater.cpp:141
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4021
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4096 src/slic3r/GUI/Plater.cpp:143
msgid "Info"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3615
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4137
msgid "You can't change a type of the last solid part of the object."
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3620
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4142
msgid "Modifier"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3620
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4142
msgid "Support Enforcer"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3620
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4142
msgid "Support Blocker"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3622
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4144
msgid "Select type of part"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3627
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4149
msgid "Change Part Type"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3872
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4394
msgid "Enter new name"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3872
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4394
msgid "Renaming"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3888
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3995 src/slic3r/GUI/Tab.cpp:3519
-#: src/slic3r/GUI/Tab.cpp:3523
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4410
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4537
+#: src/slic3r/GUI/SavePresetDialog.cpp:101
+#: src/slic3r/GUI/SavePresetDialog.cpp:109
msgid "The supplied name is not valid;"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3889
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3996 src/slic3r/GUI/Tab.cpp:3520
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4411
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4538
+#: src/slic3r/GUI/SavePresetDialog.cpp:102
msgid "the following characters are not allowed:"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4040
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4586
msgid "Select extruder number:"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4041
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4587
msgid "This extruder will be set for selected items"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4066
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4612
msgid "Change Extruders"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4163 src/slic3r/GUI/Selection.cpp:1475
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4709 src/slic3r/GUI/Selection.cpp:1485
msgid "Set Printable"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4163 src/slic3r/GUI/Selection.cpp:1475
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4709 src/slic3r/GUI/Selection.cpp:1485
msgid "Set Unprintable"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:68
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:111
msgid "World coordinates"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:63
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:106
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:69
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:112
msgid "Local coordinates"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:82
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:88
msgid "Select coordinate space, in which the transformation will be performed."
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:641
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:163 src/libslic3r/GCode.cpp:537
msgid "Object name"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:215
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:457
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:223
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:505
msgid "Position"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:458
-#: src/slic3r/GUI/Mouse3DController.cpp:290
-#: src/slic3r/GUI/Mouse3DController.cpp:313
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:224
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:506
+#: src/slic3r/GUI/Mouse3DController.cpp:486
+#: src/slic3r/GUI/Mouse3DController.cpp:507
msgid "Rotation"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:271
#, possible-c-format
msgid "Toggle %c axis mirroring"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:297
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:305
msgid "Set Mirror"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:337
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:349
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:345
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:357
msgid "Drop to bed"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:372
msgid "Reset rotation"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:394
msgid "Reset Rotation"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:397
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:407
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409
msgid "Reset scale"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:459
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:423
+msgid "Inches"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:507
msgid "Scale factors"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:561
msgid "Translate"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:625
msgid ""
"You cannot use non-uniform scaling mode for multiple objects/parts selection"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:750
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:797
msgid "Set Position"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:781
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:828
msgid "Set Orientation"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:846
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:893
msgid "Set Scale"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:925
msgid ""
"The currently manipulated object is tilted (rotation angles are not "
"multiples of 90°).\n"
@@ -2818,1474 +3507,2026 @@ msgid ""
"once the rotation is embedded into the object coordinates."
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:878
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:928
msgid ""
"This operation is irreversible.\n"
"Do you want to proceed?"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:59
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:62
msgid "Additional Settings"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:95
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:98
msgid "Remove parameter"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:101
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:104
#, possible-c-format
msgid "Delete Option %s"
msgstr ""
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:152
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:157
#, possible-c-format
msgid "Change Option %s"
msgstr ""
-#: src/slic3r/GUI/GUI_Preview.cpp:218
+#: src/slic3r/GUI/GUI_Preview.cpp:212
msgid "View"
msgstr ""
-#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/GUI_Preview.cpp:575
-#: src/libslic3r/GCode/PreviewData.cpp:345
-msgid "Feature type"
-msgstr ""
-
-#: src/slic3r/GUI/GUI_Preview.cpp:222 src/libslic3r/PrintConfig.cpp:500
+#: src/slic3r/GUI/GUI_Preview.cpp:215 src/libslic3r/PrintConfig.cpp:560
msgid "Height"
msgstr ""
-#: src/slic3r/GUI/GUI_Preview.cpp:223 src/libslic3r/PrintConfig.cpp:2245
+#: src/slic3r/GUI/GUI_Preview.cpp:216 src/libslic3r/PrintConfig.cpp:2466
msgid "Width"
msgstr ""
-#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/Tab.cpp:1513
+#: src/slic3r/GUI/GUI_Preview.cpp:218 src/slic3r/GUI/Tab.cpp:1840
msgid "Fan speed"
msgstr ""
-#: src/slic3r/GUI/GUI_Preview.cpp:226
+#: src/slic3r/GUI/GUI_Preview.cpp:219
msgid "Volumetric flow rate"
msgstr ""
-#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/GUI_Preview.cpp:335
-#: src/slic3r/GUI/GUI_Preview.cpp:519 src/slic3r/GUI/GUI_Preview.cpp:574
-#: src/slic3r/GUI/GUI_Preview.cpp:835 src/libslic3r/GCode/PreviewData.cpp:357
-msgid "Tool"
-msgstr ""
-
-#: src/slic3r/GUI/GUI_Preview.cpp:228 src/slic3r/GUI/GUI_Preview.cpp:572
-#: src/libslic3r/GCode/PreviewData.cpp:359
-msgid "Color Print"
-msgstr ""
-
-#: src/slic3r/GUI/GUI_Preview.cpp:231
+#: src/slic3r/GUI/GUI_Preview.cpp:224
msgid "Show"
msgstr ""
-#: src/slic3r/GUI/GUI_Preview.cpp:234 src/slic3r/GUI/GUI_Preview.cpp:235
+#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/GUI_Preview.cpp:245
msgid "Feature types"
msgstr ""
-#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:310
+#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/ExtrusionEntity.cpp:310
+#: src/libslic3r/ExtrusionEntity.cpp:332
msgid "Perimeter"
msgstr ""
-#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:311
+#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/ExtrusionEntity.cpp:311
+#: src/libslic3r/ExtrusionEntity.cpp:334
msgid "External perimeter"
msgstr ""
-#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:312
+#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/ExtrusionEntity.cpp:312
+#: src/libslic3r/ExtrusionEntity.cpp:336
msgid "Overhang perimeter"
msgstr ""
-#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:313
+#: src/slic3r/GUI/GUI_Preview.cpp:233 src/libslic3r/ExtrusionEntity.cpp:313
+#: src/libslic3r/ExtrusionEntity.cpp:338
msgid "Internal infill"
msgstr ""
-#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:314
-#: src/libslic3r/PrintConfig.cpp:1763 src/libslic3r/PrintConfig.cpp:1774
+#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/ExtrusionEntity.cpp:314
+#: src/libslic3r/ExtrusionEntity.cpp:340 src/libslic3r/PrintConfig.cpp:1956
+#: src/libslic3r/PrintConfig.cpp:1967
msgid "Solid infill"
msgstr ""
-#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:315
-#: src/libslic3r/PrintConfig.cpp:2112 src/libslic3r/PrintConfig.cpp:2124
+#: src/slic3r/GUI/GUI_Preview.cpp:235 src/libslic3r/ExtrusionEntity.cpp:315
+#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/PrintConfig.cpp:2333
+#: src/libslic3r/PrintConfig.cpp:2345
msgid "Top solid infill"
msgstr ""
-#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:316
+#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:317
+#: src/libslic3r/ExtrusionEntity.cpp:346
msgid "Bridge infill"
msgstr ""
-#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:317
-#: src/libslic3r/PrintConfig.cpp:918
+#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:318
+#: src/libslic3r/ExtrusionEntity.cpp:348 src/libslic3r/PrintConfig.cpp:1011
msgid "Gap fill"
msgstr ""
-#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1171
-#: src/libslic3r/ExtrusionEntity.cpp:318
+#: src/slic3r/GUI/GUI_Preview.cpp:239 src/slic3r/GUI/Tab.cpp:1462
+#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/ExtrusionEntity.cpp:350
msgid "Skirt"
msgstr ""
-#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:320
-#: src/libslic3r/PrintConfig.cpp:1998
+#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:321
+#: src/libslic3r/ExtrusionEntity.cpp:354 src/libslic3r/PrintConfig.cpp:2218
msgid "Support material interface"
msgstr ""
-#: src/slic3r/GUI/GUI_Preview.cpp:248 src/slic3r/GUI/Tab.cpp:1252
-#: src/libslic3r/ExtrusionEntity.cpp:321
+#: src/slic3r/GUI/GUI_Preview.cpp:242 src/slic3r/GUI/Tab.cpp:1545
+#: src/libslic3r/ExtrusionEntity.cpp:322 src/libslic3r/ExtrusionEntity.cpp:356
msgid "Wipe tower"
msgstr ""
-#: src/slic3r/GUI/GUI_Preview.cpp:253 src/libslic3r/PrintConfig.cpp:2159
-msgid "Travel"
+#: src/slic3r/GUI/GUI_Preview.cpp:1031
+msgid "Shells"
msgstr ""
-#: src/slic3r/GUI/GUI_Preview.cpp:254
-msgid "Retractions"
+#: src/slic3r/GUI/GUI_Preview.cpp:1032
+msgid "Tool marker"
msgstr ""
-#: src/slic3r/GUI/GUI_Preview.cpp:255
-msgid "Unretractions"
+#: src/slic3r/GUI/GUI_Preview.cpp:1033
+msgid "Legend/Estimated printing time"
msgstr ""
-#: src/slic3r/GUI/GUI_Preview.cpp:256
-msgid "Shells"
+#: src/slic3r/GUI/ImGuiWrapper.cpp:804 src/slic3r/GUI/Search.cpp:389
+msgid "Use for search"
+msgstr ""
+
+#: src/slic3r/GUI/ImGuiWrapper.cpp:805 src/slic3r/GUI/Search.cpp:383
+msgid "Category"
+msgstr ""
+
+#: src/slic3r/GUI/ImGuiWrapper.cpp:807 src/slic3r/GUI/Search.cpp:385
+msgid "Search in English"
msgstr ""
-#: src/slic3r/GUI/GUI_Preview.cpp:257
-msgid "Legend"
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:145
+msgid "Arranging"
msgstr ""
-#: src/slic3r/GUI/Job.hpp:123
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:175
+msgid "Could not arrange model objects! Some geometries may be invalid."
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:181
+msgid "Arranging canceled."
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:182
+msgid "Arranging done."
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/Job.cpp:75
msgid "ERROR: not enough resources to execute a new job."
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:41 src/slic3r/GUI/MainFrame.cpp:789
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:41
+msgid "Searching for optimal orientation"
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:73
+msgid "Orientation search canceled."
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:74
+msgid "Orientation found."
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:35
+msgid "Choose SLA archive:"
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:39
+msgid "Import file"
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:46
+msgid "Import model and profile"
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47
+msgid "Import profile only"
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48
+msgid "Import model only"
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:59
+msgid "Accurate"
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60
+msgid "Balanced"
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61
+msgid "Quick"
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135
+msgid "Importing SLA archive"
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:159
+msgid "Importing canceled."
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:160
+msgid "Importing done."
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:208 src/slic3r/GUI/Plater.cpp:2357
+msgid "You cannot load SLA project with a multi-part object on the bed"
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:209 src/slic3r/GUI/Plater.cpp:2358
+#: src/slic3r/GUI/Tab.cpp:3243
+msgid "Please check your object list before preset changing."
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:17 src/slic3r/GUI/MainFrame.cpp:894
msgid "Keyboard Shortcuts"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:112
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:69
msgid "New project, clear plater"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:113
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:70
msgid "Open project STL/OBJ/AMF/3MF with config, clear plater"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:114
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:71
msgid "Save project (3mf)"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:115
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:72
msgid "Save project as (3mf)"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:116
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:73
msgid "(Re)slice"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:118
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:75
msgid "Import STL/OBJ/AMF/3MF without config, keep plater"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:119
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:76
msgid "Import Config from ini/amf/3mf/gcode"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:120
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:77
msgid "Load Config from ini/amf/3mf/gcode and merge"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 src/slic3r/GUI/Plater.cpp:896
-#: src/slic3r/GUI/Plater.cpp:5562 src/libslic3r/PrintConfig.cpp:3375
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 src/slic3r/GUI/Plater.cpp:770
+#: src/slic3r/GUI/Plater.cpp:6054 src/libslic3r/PrintConfig.cpp:3635
msgid "Export G-code"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Plater.cpp:5563
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 src/slic3r/GUI/Plater.cpp:6055
msgid "Send G-code"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:124
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:81
msgid "Export config"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 src/slic3r/GUI/Plater.cpp:885
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:82 src/slic3r/GUI/Plater.cpp:758
msgid "Export to SD card / Flash drive"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:126
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:83
msgid "Eject SD card / Flash drive"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:128
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:85
msgid "Select all objects"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:129
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:86
msgid "Deselect all"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:130
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:87
msgid "Delete selected"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:134
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:91
msgid "Copy to clipboard"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:135
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:92
msgid "Paste from clipboard"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:136
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:94
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:96
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:187
msgid "Reload plater from disk"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:138
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:100
msgid "Select Plater Tab"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:139
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:101
msgid "Select Print Settings Tab"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:140
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:102
msgid "Select Filament Settings Tab"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:141
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:103
msgid "Select Printer Settings Tab"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:142
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:104
msgid "Switch to 3D"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:143
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:105
msgid "Switch to Preview"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:144
-#: src/slic3r/GUI/PrintHostDialogs.cpp:136
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:106
+#: src/slic3r/GUI/PrintHostDialogs.cpp:165
msgid "Print host upload queue"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:146
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 src/slic3r/GUI/MainFrame.cpp:65
+#: src/slic3r/GUI/MainFrame.cpp:1191
+msgid "Open new instance"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:109
msgid "Camera view"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:147
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:110
msgid "Show/Hide object/instance labels"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 src/slic3r/GUI/Preferences.cpp:10
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 src/slic3r/GUI/Preferences.cpp:13
msgid "Preferences"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:151
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:114
msgid "Show keyboard shortcuts list"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:154
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:117
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:191
msgid "Commands"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:159
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:122
msgid "Add Instance of the selected object"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:160
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:123
msgid "Remove Instance of the selected object"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:161
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:124
msgid ""
"Press to select multiple objects\n"
"or move multiple objects with mouse"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:162
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:125
msgid "Press to activate selection rectangle"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:126
msgid "Press to activate deselection rectangle"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:204
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:214
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:127
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:196
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:226
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:243
msgid "Arrow Up"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:127
msgid "Move selection 10 mm in positive Y direction"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:128
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:197
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:220
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:227
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:244
msgid "Arrow Down"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:128
msgid "Move selection 10 mm in negative Y direction"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:129
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:198
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:221
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:228
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:241
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:246
msgid "Arrow Left"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:129
msgid "Move selection 10 mm in negative X direction"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:130
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:199
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:229
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:242
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:247
msgid "Arrow Right"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:130
msgid "Move selection 10 mm in positive X direction"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:131
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:132
msgid "Any arrow"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:131
msgid "Movement step set to 1 mm"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:132
msgid "Movement in camera space"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:133
msgid "Page Up"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:133
msgid "Rotate selection 45 degrees CCW"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:134
msgid "Page Down"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:134
msgid "Rotate selection 45 degrees CW"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:172
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:135
msgid "Gizmo move"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:173
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:136
msgid "Gizmo scale"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:174
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:137
msgid "Gizmo rotate"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:138
msgid "Gizmo cut"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:176
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:139
msgid "Gizmo Place face on bed"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:177
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:140
msgid "Gizmo SLA hollow"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:178
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:141
msgid "Gizmo SLA support points"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:142
msgid "Unselect gizmo or clear selection"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:180
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:143
msgid "Change camera type (perspective, orthographic)"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:181
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:144
msgid "Zoom to Bed"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:182
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:145
msgid ""
"Zoom to selected object\n"
"or all objects in scene, if none selected"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:183
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:146
msgid "Zoom in"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:184
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:147
msgid "Zoom out"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:185
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:148
+msgid "Switch between Editor/Preview"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:149
+msgid "Collapse/Expand the sidebar"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:152
+msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:154
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:158
msgid "Show/Hide 3Dconnexion devices settings dialog"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 src/slic3r/GUI/MainFrame.cpp:256
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 src/slic3r/GUI/MainFrame.cpp:331
+#: src/slic3r/GUI/MainFrame.cpp:343
msgid "Plater"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:195
-#, possible-c-format
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
+msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
+msgid "Gizmo move: Press to snap by 1mm"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:172
+msgid "Gizmo scale: Press to snap by 5%"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:173
+msgid "Gizmo scale: Scale selection to fit print volume"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:174
+msgid "Gizmo scale: Press to activate one direction scaling"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
+msgid "Gizmo scale: Press to scale selected objects around their own center"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:176
+msgid "Gizmo rotate: Press to rotate selected objects around their own center"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+msgid "Gizmos"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
msgid ""
-"Press to snap by 5% in Gizmo scale\n"
-"or to snap by 1mm in Gizmo move"
+"The following shortcuts are applicable when the specified gizmo is active"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 src/slic3r/GUI/MainFrame.cpp:1244
+msgid "Open a G-code file"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 src/slic3r/GUI/MainFrame.cpp:1142
+#: src/slic3r/GUI/MainFrame.cpp:1146 src/slic3r/GUI/MainFrame.cpp:1249
+#: src/slic3r/GUI/MainFrame.cpp:1253
+msgid "Reload the plater from disk"
msgstr ""
#: src/slic3r/GUI/KBShortcutsDialog.cpp:196
-msgid ""
-"Scale selection to fit print volume\n"
-"in Gizmo scale"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:200
+msgid "Vertical slider - Move active thumb Up"
msgstr ""
#: src/slic3r/GUI/KBShortcutsDialog.cpp:197
-msgid "Press to activate one direction scaling in Gizmo scale"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:201
+msgid "Vertical slider - Move active thumb Down"
msgstr ""
#: src/slic3r/GUI/KBShortcutsDialog.cpp:198
-msgid ""
-"Press to scale (in Gizmo scale) or rotate (in Gizmo rotate)\n"
-"selected objects around their own center"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:202
+msgid "Horizontal slider - Move active thumb Left"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:201
-msgid "Gizmos"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:199
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:203
+msgid "Horizontal slider - Move active thumb Right"
msgstr ""
#: src/slic3r/GUI/KBShortcutsDialog.cpp:204
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:206
-msgid "Upper Layer"
+msgid "On/Off one layer mode of the vertical slider"
msgstr ""
#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
+msgid "Show/Hide Legend and Estimated printing time"
+msgstr ""
+
#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
-msgid "Lower Layer"
+msgid "Upper layer"
msgstr ""
#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
-msgid "Show/Hide Legend"
+msgid "Lower layer"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:209
+msgid "Upper Layer"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/Plater.cpp:4172
-#: src/slic3r/GUI/Tab.cpp:2375
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:210
+msgid "Lower Layer"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:211
+msgid "Show/Hide Legend & Estimated printing time"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 src/slic3r/GUI/Plater.cpp:4200
+#: src/slic3r/GUI/Tab.cpp:2602
msgid "Preview"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:214
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+msgid "Move active thumb Up"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:220
+msgid "Move active thumb Down"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:221
+msgid "Set upper thumb as active"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
+msgid "Set lower thumb as active"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:223
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:230
+msgid "Add color change marker for current layer"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:224
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:231
+msgid "Delete color change marker for current layer"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:226
msgid "Move current slider thumb Up"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:227
msgid "Move current slider thumb Down"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:228
msgid "Set upper thumb to current slider thumb"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:229
msgid "Set lower thumb to current slider thumb"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
-msgid "Add color change marker for current layer"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:233
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:234
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:249
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:250
+msgid ""
+"Press to speed up 5 times while moving thumb\n"
+"with arrow keys or mouse wheel"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
-msgid "Delete color change marker for current layer"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:237
+msgid "Vertical Slider"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
-msgid "Layers Slider"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:237
+msgid ""
+"The following shortcuts are applicable in G-code preview when the vertical "
+"slider is active"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:241
+msgid "Move active thumb Left"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:242
+msgid "Move active thumb Right"
msgstr ""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:245
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:243
+msgid "Set left thumb as active"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:244
+msgid "Set right thumb as active"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:246
+msgid "Move active slider thumb Left"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:247
+msgid "Move active slider thumb Right"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:253
+msgid "Horizontal Slider"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:253
+msgid ""
+"The following shortcuts are applicable in G-code preview when the horizontal "
+"slider is active"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:276
msgid "Keyboard shortcuts"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:71
+#: src/slic3r/GUI/MainFrame.cpp:65 src/slic3r/GUI/MainFrame.cpp:79
+#: src/slic3r/GUI/MainFrame.cpp:1191
+msgid "Open a new PrusaSlicer instance"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:68 src/slic3r/GUI/MainFrame.cpp:81
+msgid "G-code preview"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:68 src/slic3r/GUI/MainFrame.cpp:1091
+msgid "Open G-code viewer"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:79 src/slic3r/GUI/MainFrame.cpp:1260
+msgid "Open PrusaSlicer"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:81
+msgid "Open new G-code viewer"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:153
msgid ""
-" - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/"
+"Remember to check for updates at https://github.com/prusa3d/PrusaSlicer/"
"releases"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:226
+#: src/slic3r/GUI/MainFrame.cpp:510
msgid "based on Slic3r"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:478
+#: src/slic3r/GUI/MainFrame.cpp:866
+msgid "Prusa 3D &Drivers"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:866
+msgid "Open the Prusa3D drivers download page in your browser"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:868
+msgid "Software &Releases"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:868
+msgid "Open the software releases page in your browser"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:874
+#, possible-c-format
+msgid "%s &Website"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:875
+#, possible-c-format
+msgid "Open the %s website in your browser"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:881
+msgid "System &Info"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:881
+msgid "Show system information"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:883
+msgid "Show &Configuration Folder"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:883
+msgid "Show user configuration folder (datadir)"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:885
+msgid "Report an I&ssue"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:885
+#, possible-c-format
+msgid "Report an issue on %s"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:888 src/slic3r/GUI/MainFrame.cpp:891
+#, possible-c-format
+msgid "&About %s"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:888 src/slic3r/GUI/MainFrame.cpp:891
+msgid "Show about dialog"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:894
+msgid "Show the list of the keyboard shortcuts"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:908
+msgid "Iso"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:908
+msgid "Iso View"
+msgstr ""
+
+#. TRN To be shown in the main menu View->Top
+#. TRN To be shown in Print Settings "Top solid layers"
+#: src/slic3r/GUI/MainFrame.cpp:912 src/libslic3r/PrintConfig.cpp:2360
+#: src/libslic3r/PrintConfig.cpp:2369
+msgid "Top"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:912
+msgid "Top View"
+msgstr ""
+
+#. TRN To be shown in the main menu View->Bottom
+#. TRN To be shown in Print Settings "Bottom solid layers"
+#. TRN To be shown in Print Settings "Top solid layers"
+#: src/slic3r/GUI/MainFrame.cpp:915 src/libslic3r/PrintConfig.cpp:230
+#: src/libslic3r/PrintConfig.cpp:239
+msgid "Bottom"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:915
+msgid "Bottom View"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:917
+msgid "Front"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:917
+msgid "Front View"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:919 src/libslic3r/PrintConfig.cpp:1845
+msgid "Rear"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:919
+msgid "Rear View"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:921
+msgid "Left"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:921
+msgid "Left View"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:923
+msgid "Right"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:923
+msgid "Right View"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:936
msgid "&New Project"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:478
+#: src/slic3r/GUI/MainFrame.cpp:936
msgid "Start a new project"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:481
+#: src/slic3r/GUI/MainFrame.cpp:939
msgid "&Open Project"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:481
+#: src/slic3r/GUI/MainFrame.cpp:939
msgid "Open a project file"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:486
+#: src/slic3r/GUI/MainFrame.cpp:944
msgid "Recent projects"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:495
+#: src/slic3r/GUI/MainFrame.cpp:953
msgid ""
"The selected project is no longer available.\n"
"Do you want to remove it from the recent projects list?"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:495 src/slic3r/GUI/MainFrame.cpp:866
-#: src/slic3r/GUI/PrintHostDialogs.cpp:231
+#: src/slic3r/GUI/MainFrame.cpp:953 src/slic3r/GUI/MainFrame.cpp:1343
+#: src/slic3r/GUI/PrintHostDialogs.cpp:263
msgid "Error"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:520
+#: src/slic3r/GUI/MainFrame.cpp:978
msgid "&Save Project"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:520
+#: src/slic3r/GUI/MainFrame.cpp:978
msgid "Save current project file"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:524 src/slic3r/GUI/MainFrame.cpp:526
+#: src/slic3r/GUI/MainFrame.cpp:982 src/slic3r/GUI/MainFrame.cpp:984
msgid "Save Project &as"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:524 src/slic3r/GUI/MainFrame.cpp:526
+#: src/slic3r/GUI/MainFrame.cpp:982 src/slic3r/GUI/MainFrame.cpp:984
msgid "Save current project file as"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:534
+#: src/slic3r/GUI/MainFrame.cpp:992
msgid "Import STL/OBJ/AM&F/3MF"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:534
+#: src/slic3r/GUI/MainFrame.cpp:992
msgid "Load a model"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:538
+#: src/slic3r/GUI/MainFrame.cpp:996
+msgid "Import STL (imperial units)"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:996
+msgid "Load an model saved with imperial units"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1000
+msgid "Import SL1 archive"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1000
+msgid "Load an SL1 archive"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1005
msgid "Import &Config"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:538
+#: src/slic3r/GUI/MainFrame.cpp:1005
msgid "Load exported configuration file"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:541
+#: src/slic3r/GUI/MainFrame.cpp:1008
msgid "Import Config from &project"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:541
+#: src/slic3r/GUI/MainFrame.cpp:1008
msgid "Load configuration from project file"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:545
+#: src/slic3r/GUI/MainFrame.cpp:1012
msgid "Import Config &Bundle"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:545
+#: src/slic3r/GUI/MainFrame.cpp:1012
msgid "Load presets from a bundle"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:548
+#: src/slic3r/GUI/MainFrame.cpp:1015
msgid "&Import"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:551 src/slic3r/GUI/MainFrame.cpp:830
+#: src/slic3r/GUI/MainFrame.cpp:1018 src/slic3r/GUI/MainFrame.cpp:1305
msgid "Export &G-code"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:551
+#: src/slic3r/GUI/MainFrame.cpp:1018
msgid "Export current plate as G-code"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:555 src/slic3r/GUI/MainFrame.cpp:831
+#: src/slic3r/GUI/MainFrame.cpp:1022 src/slic3r/GUI/MainFrame.cpp:1306
msgid "S&end G-code"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:555
+#: src/slic3r/GUI/MainFrame.cpp:1022
msgid "Send to print current plate as G-code"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:559
+#: src/slic3r/GUI/MainFrame.cpp:1026
msgid "Export G-code to SD card / Flash drive"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:559
+#: src/slic3r/GUI/MainFrame.cpp:1026
msgid "Export current plate as G-code to SD card / Flash drive"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:563
+#: src/slic3r/GUI/MainFrame.cpp:1030
msgid "Export plate as &STL"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:563
+#: src/slic3r/GUI/MainFrame.cpp:1030
msgid "Export current plate as STL"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:566
+#: src/slic3r/GUI/MainFrame.cpp:1033
msgid "Export plate as STL &including supports"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:566
+#: src/slic3r/GUI/MainFrame.cpp:1033
msgid "Export current plate as STL including supports"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:569
+#: src/slic3r/GUI/MainFrame.cpp:1036
msgid "Export plate as &AMF"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:569
+#: src/slic3r/GUI/MainFrame.cpp:1036
msgid "Export current plate as AMF"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:573
+#: src/slic3r/GUI/MainFrame.cpp:1040 src/slic3r/GUI/MainFrame.cpp:1257
msgid "Export &toolpaths as OBJ"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:573
+#: src/slic3r/GUI/MainFrame.cpp:1040 src/slic3r/GUI/MainFrame.cpp:1257
msgid "Export toolpaths as OBJ"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:577
+#: src/slic3r/GUI/MainFrame.cpp:1044
msgid "Export &Config"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:577
+#: src/slic3r/GUI/MainFrame.cpp:1044
msgid "Export current configuration to file"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:580
+#: src/slic3r/GUI/MainFrame.cpp:1047
msgid "Export Config &Bundle"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:580
+#: src/slic3r/GUI/MainFrame.cpp:1047
msgid "Export all presets to file"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:583
+#: src/slic3r/GUI/MainFrame.cpp:1050
+msgid "Export Config Bundle With Physical Printers"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1050
+msgid "Export all presets including physical printers to file"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1053
msgid "&Export"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:585
+#: src/slic3r/GUI/MainFrame.cpp:1055
msgid "Ejec&t SD card / Flash drive"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:585
+#: src/slic3r/GUI/MainFrame.cpp:1055
msgid "Eject SD card / Flash drive after the G-code was exported to it."
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:593
+#: src/slic3r/GUI/MainFrame.cpp:1063
msgid "Quick Slice"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:593
+#: src/slic3r/GUI/MainFrame.cpp:1063
msgid "Slice a file into a G-code"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:599
+#: src/slic3r/GUI/MainFrame.cpp:1069
msgid "Quick Slice and Save As"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:599
+#: src/slic3r/GUI/MainFrame.cpp:1069
msgid "Slice a file into a G-code, save as"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:605
+#: src/slic3r/GUI/MainFrame.cpp:1075
msgid "Repeat Last Quick Slice"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:605
+#: src/slic3r/GUI/MainFrame.cpp:1075
msgid "Repeat last quick slice"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:613
+#: src/slic3r/GUI/MainFrame.cpp:1083
msgid "(Re)Slice No&w"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:613
+#: src/slic3r/GUI/MainFrame.cpp:1083
msgid "Start new slicing process"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:617
+#: src/slic3r/GUI/MainFrame.cpp:1087
msgid "&Repair STL file"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:617
+#: src/slic3r/GUI/MainFrame.cpp:1087
msgid "Automatically repair an STL file"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:621
+#: src/slic3r/GUI/MainFrame.cpp:1091
+msgid "&G-code preview"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1094 src/slic3r/GUI/MainFrame.cpp:1264
msgid "&Quit"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:621
+#: src/slic3r/GUI/MainFrame.cpp:1094 src/slic3r/GUI/MainFrame.cpp:1264
#, possible-c-format
msgid "Quit %s"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:646
+#: src/slic3r/GUI/MainFrame.cpp:1109
msgid "&Select all"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:647
+#: src/slic3r/GUI/MainFrame.cpp:1110
msgid "Selects all objects"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:649
+#: src/slic3r/GUI/MainFrame.cpp:1112
msgid "D&eselect all"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:650
+#: src/slic3r/GUI/MainFrame.cpp:1113
msgid "Deselects all objects"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:653
+#: src/slic3r/GUI/MainFrame.cpp:1116
msgid "&Delete selected"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:654
+#: src/slic3r/GUI/MainFrame.cpp:1117
msgid "Deletes the current selection"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:656
+#: src/slic3r/GUI/MainFrame.cpp:1119
msgid "Delete &all"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:657
+#: src/slic3r/GUI/MainFrame.cpp:1120
msgid "Deletes all objects"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:661
+#: src/slic3r/GUI/MainFrame.cpp:1124
msgid "&Undo"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:664
+#: src/slic3r/GUI/MainFrame.cpp:1127
msgid "&Redo"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:669
+#: src/slic3r/GUI/MainFrame.cpp:1132
msgid "&Copy"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:670
+#: src/slic3r/GUI/MainFrame.cpp:1133
msgid "Copy selection to clipboard"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:672
+#: src/slic3r/GUI/MainFrame.cpp:1135
msgid "&Paste"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:673
+#: src/slic3r/GUI/MainFrame.cpp:1136
msgid "Paste clipboard"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:677
+#: src/slic3r/GUI/MainFrame.cpp:1141 src/slic3r/GUI/MainFrame.cpp:1145
+#: src/slic3r/GUI/MainFrame.cpp:1248 src/slic3r/GUI/MainFrame.cpp:1252
msgid "Re&load from disk"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:678
-msgid "Reload the plater from disk"
+#: src/slic3r/GUI/MainFrame.cpp:1151
+msgid "Searc&h"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:687
+#: src/slic3r/GUI/MainFrame.cpp:1152
+msgid "Search in settings"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1160
msgid "&Plater Tab"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:687
+#: src/slic3r/GUI/MainFrame.cpp:1160
msgid "Show the plater"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:695
+#: src/slic3r/GUI/MainFrame.cpp:1165
msgid "P&rint Settings Tab"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:695
+#: src/slic3r/GUI/MainFrame.cpp:1165
msgid "Show the print settings"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:698 src/slic3r/GUI/MainFrame.cpp:833
+#: src/slic3r/GUI/MainFrame.cpp:1168 src/slic3r/GUI/MainFrame.cpp:1308
msgid "&Filament Settings Tab"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:698
+#: src/slic3r/GUI/MainFrame.cpp:1168
msgid "Show the filament settings"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:702
+#: src/slic3r/GUI/MainFrame.cpp:1172
msgid "Print&er Settings Tab"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:702
+#: src/slic3r/GUI/MainFrame.cpp:1172
msgid "Show the printer settings"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:707
+#: src/slic3r/GUI/MainFrame.cpp:1178
msgid "3&D"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:707
+#: src/slic3r/GUI/MainFrame.cpp:1178
msgid "Show the 3D editing view"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:710
+#: src/slic3r/GUI/MainFrame.cpp:1181
msgid "Pre&view"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:710
+#: src/slic3r/GUI/MainFrame.cpp:1181
msgid "Show the 3D slices preview"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:729
+#: src/slic3r/GUI/MainFrame.cpp:1187
msgid "Print &Host Upload Queue"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:729
+#: src/slic3r/GUI/MainFrame.cpp:1187
msgid "Display the Print Host Upload Queue window"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:739
-msgid "Iso"
+#: src/slic3r/GUI/MainFrame.cpp:1201
+msgid "Show &labels"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:739
-msgid "Iso View"
+#: src/slic3r/GUI/MainFrame.cpp:1201
+msgid "Show object/instance labels in 3D scene"
msgstr ""
-#. TRN To be shown in the main menu View->Top
-#. TRN To be shown in Print Settings "Top solid layers"
-#: src/slic3r/GUI/MainFrame.cpp:743 src/libslic3r/PrintConfig.cpp:2139
-#: src/libslic3r/PrintConfig.cpp:2148
-msgid "Top"
+#: src/slic3r/GUI/MainFrame.cpp:1204
+msgid "&Collapse sidebar"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:743
-msgid "Top View"
+#: src/slic3r/GUI/MainFrame.cpp:1204 src/slic3r/GUI/Plater.cpp:2247
+msgid "Collapse sidebar"
msgstr ""
-#. TRN To be shown in the main menu View->Bottom
-#. TRN To be shown in Print Settings "Bottom solid layers"
-#. TRN To be shown in Print Settings "Top solid layers"
-#: src/slic3r/GUI/MainFrame.cpp:746 src/libslic3r/PrintConfig.cpp:174
-#: src/libslic3r/PrintConfig.cpp:183
-msgid "Bottom"
+#: src/slic3r/GUI/MainFrame.cpp:1216 src/slic3r/GUI/MainFrame.cpp:1279
+msgid "&File"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:746
-msgid "Bottom View"
+#: src/slic3r/GUI/MainFrame.cpp:1217
+msgid "&Edit"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:748
-msgid "Front"
+#: src/slic3r/GUI/MainFrame.cpp:1218
+msgid "&Window"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:748
-msgid "Front View"
+#: src/slic3r/GUI/MainFrame.cpp:1219 src/slic3r/GUI/MainFrame.cpp:1280
+msgid "&View"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:750 src/libslic3r/PrintConfig.cpp:1632
-msgid "Rear"
+#: src/slic3r/GUI/MainFrame.cpp:1222 src/slic3r/GUI/MainFrame.cpp:1283
+msgid "&Help"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:750
-msgid "Rear View"
+#: src/slic3r/GUI/MainFrame.cpp:1244
+msgid "&Open G-code"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:752
-msgid "Left"
+#: src/slic3r/GUI/MainFrame.cpp:1260
+msgid "Open &PrusaSlicer"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:752
-msgid "Left View"
+#: src/slic3r/GUI/MainFrame.cpp:1305
+msgid "E&xport"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:754
-msgid "Right"
+#: src/slic3r/GUI/MainFrame.cpp:1306
+msgid "S&end to print"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:754
-msgid "Right View"
+#: src/slic3r/GUI/MainFrame.cpp:1308
+msgid "Mate&rial Settings Tab"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:757
-msgid "Show &labels"
+#: src/slic3r/GUI/MainFrame.cpp:1331
+msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:757
-msgid "Show object/instance labels in 3D scene"
+#: src/slic3r/GUI/MainFrame.cpp:1342
+msgid "No previously sliced file."
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:765
-msgid "Prusa 3D &Drivers"
+#: src/slic3r/GUI/MainFrame.cpp:1348
+msgid "Previously sliced file ("
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:765
-msgid "Open the Prusa3D drivers download page in your browser"
+#: src/slic3r/GUI/MainFrame.cpp:1348
+msgid ") not found."
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:767
-msgid "Software &Releases"
+#: src/slic3r/GUI/MainFrame.cpp:1349
+msgid "File Not Found"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:767
-msgid "Open the software releases page in your browser"
+#: src/slic3r/GUI/MainFrame.cpp:1384
+#, possible-c-format
+msgid "Save %s file as:"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1384
+msgid "SVG"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:773
+#: src/slic3r/GUI/MainFrame.cpp:1384
+msgid "G-code"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1396
+msgid "Save zip file as:"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1405 src/slic3r/GUI/Plater.cpp:3009
+#: src/slic3r/GUI/Plater.cpp:5581 src/slic3r/GUI/Tab.cpp:1575
+#: src/slic3r/GUI/Tab.cpp:4115
+msgid "Slicing"
+msgstr ""
+
+#. TRN "Processing input_file_basename"
+#: src/slic3r/GUI/MainFrame.cpp:1407
#, possible-c-format
-msgid "%s &Website"
+msgid "Processing %s"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1430
+msgid "%1% was successfully sliced."
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1432
+msgid "Slicing Done!"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1447
+msgid "Select the STL file to repair:"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1457
+msgid "Save OBJ file (less prone to coordinate errors than STL) as:"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1469
+msgid "Your file was repaired."
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1469 src/libslic3r/PrintConfig.cpp:3735
+msgid "Repair"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1483
+msgid "Save configuration as:"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1502 src/slic3r/GUI/MainFrame.cpp:1564
+msgid "Select configuration to load:"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:774
+#: src/slic3r/GUI/MainFrame.cpp:1538
+msgid "Save presets bundle as:"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1585
#, possible-c-format
-msgid "Open the %s website in your browser"
+msgid "%d presets successfully imported."
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:780
-msgid "System &Info"
+#: src/slic3r/GUI/Mouse3DController.cpp:461
+msgid "3Dconnexion settings"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:780
-msgid "Show system information"
+#: src/slic3r/GUI/Mouse3DController.cpp:472
+msgid "Device:"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:782
-msgid "Show &Configuration Folder"
+#: src/slic3r/GUI/Mouse3DController.cpp:477
+msgid "Speed:"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:782
-msgid "Show user configuration folder (datadir)"
+#: src/slic3r/GUI/Mouse3DController.cpp:480
+#: src/slic3r/GUI/Mouse3DController.cpp:501
+msgid "Translation"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:784
-msgid "Report an I&ssue"
+#: src/slic3r/GUI/Mouse3DController.cpp:492
+#: src/slic3r/GUI/Mouse3DController.cpp:501
+msgid "Zoom"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:784
+#: src/slic3r/GUI/Mouse3DController.cpp:498
+msgid "Deadzone:"
+msgstr ""
+
+#: src/slic3r/GUI/Mouse3DController.cpp:513
+msgid "Options:"
+msgstr ""
+
+#: src/slic3r/GUI/Mouse3DController.cpp:516
+msgid "Swap Y/Z axes"
+msgstr ""
+
+#: src/slic3r/GUI/MsgDialog.cpp:70
#, possible-c-format
-msgid "Report an issue on %s"
+msgid "%s error"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:786
+#: src/slic3r/GUI/MsgDialog.cpp:71
#, possible-c-format
-msgid "&About %s"
+msgid "%s has encountered an error"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:786
-msgid "Show about dialog"
+#: src/slic3r/GUI/NotificationManager.hpp:471
+msgid "3D Mouse disconnected."
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:789
-msgid "Show the list of the keyboard shortcuts"
+#: src/slic3r/GUI/NotificationManager.hpp:474
+msgid "Configuration update is available."
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:802
-msgid "&File"
+#: src/slic3r/GUI/NotificationManager.hpp:474
+msgid "See more."
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:803
-msgid "&Edit"
+#: src/slic3r/GUI/NotificationManager.hpp:476
+msgid "New version is available."
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:804
-msgid "&Window"
+#: src/slic3r/GUI/NotificationManager.hpp:476
+msgid "See Releases page."
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:805
-msgid "&View"
+#: src/slic3r/GUI/NotificationManager.hpp:479
+msgid ""
+"You have just added a G-code for color change, but its value is empty.\n"
+"To export the G-code correctly, check the \"Color Change G-code\" in "
+"\"Printer Settings > Custom G-code\""
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:808
-msgid "&Help"
+#: src/slic3r/GUI/NotificationManager.cpp:490
+#: src/slic3r/GUI/NotificationManager.cpp:500
+msgid "More"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:830
-msgid "E&xport"
+#: src/slic3r/GUI/NotificationManager.cpp:864
+#: src/slic3r/GUI/NotificationManager.cpp:1141
+msgid "Export G-Code."
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:831
-msgid "S&end to print"
+#: src/slic3r/GUI/NotificationManager.cpp:908
+msgid "Open Folder."
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:833
-msgid "Mate&rial Settings Tab"
+#: src/slic3r/GUI/NotificationManager.cpp:946
+msgid "Eject drive"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:854
-msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):"
+#: src/slic3r/GUI/NotificationManager.cpp:1060
+#: src/slic3r/GUI/NotificationManager.cpp:1076
+#: src/slic3r/GUI/NotificationManager.cpp:1087
+msgid "ERROR:"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:865
-msgid "No previously sliced file."
+#: src/slic3r/GUI/NotificationManager.cpp:1065
+#: src/slic3r/GUI/NotificationManager.cpp:1080
+#: src/slic3r/GUI/NotificationManager.cpp:1095
+msgid "WARNING:"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:871
-msgid "Previously sliced file ("
+#: src/slic3r/GUI/NotificationManager.cpp:1144
+msgid "Slicing finished."
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:871
-msgid ") not found."
+#: src/slic3r/GUI/NotificationManager.cpp:1186
+msgid "Exporting finished."
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:872
-msgid "File Not Found"
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:58
+msgid "Instances"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:907
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:62
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:225
#, possible-c-format
-msgid "Save %s file as:"
+msgid "Instance %d"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:907
-msgid "SVG"
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3962
+#: src/slic3r/GUI/Tab.cpp:4044
+msgid "Layers"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:907
-msgid "G-code"
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:96
+msgid "Range"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:919
-msgid "Save zip file as:"
+#: src/slic3r/GUI/OpenGLManager.cpp:259
+#, possible-c-format
+msgid ""
+"PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n"
+"while OpenGL version %s, render %s, vendor %s was detected."
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:928 src/slic3r/GUI/Plater.cpp:3188
-#: src/slic3r/GUI/Plater.cpp:5165 src/slic3r/GUI/Tab.cpp:1282
-#: src/slic3r/GUI/Tab.cpp:3721
-msgid "Slicing"
+#: src/slic3r/GUI/OpenGLManager.cpp:262
+msgid "You may need to update your graphics card driver."
msgstr ""
-#. TRN "Processing input_file_basename"
-#: src/slic3r/GUI/MainFrame.cpp:930
+#: src/slic3r/GUI/OpenGLManager.cpp:265
+msgid ""
+"As a workaround, you may run PrusaSlicer with a software rendered 3D "
+"graphics by running prusa-slicer.exe with the --sw_renderer parameter."
+msgstr ""
+
+#: src/slic3r/GUI/OpenGLManager.cpp:267
+msgid "Unsupported OpenGL version"
+msgstr ""
+
+#: src/slic3r/GUI/OpenGLManager.cpp:275
#, possible-c-format
-msgid "Processing %s"
+msgid ""
+"Unable to load the following shaders:\n"
+"%s"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:953
-msgid " was successfully sliced."
+#: src/slic3r/GUI/OpenGLManager.cpp:276
+msgid "Error loading shaders"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:955
-msgid "Slicing Done!"
+#: src/slic3r/GUI/OptionsGroup.cpp:335
+msgctxt "Layers"
+msgid "Top"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:970
-msgid "Select the STL file to repair:"
+#: src/slic3r/GUI/OptionsGroup.cpp:335
+msgctxt "Layers"
+msgid "Bottom"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:980
-msgid "Save OBJ file (less prone to coordinate errors than STL) as:"
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:51
+msgid "Delete this preset from this printer device"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:992
-msgid "Your file was repaired."
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:81
+msgid "This printer will be shown in the presets list as"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:992 src/libslic3r/PrintConfig.cpp:3469
-msgid "Repair"
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:155
+msgid "Physical Printer"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:1006
-msgid "Save configuration as:"
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:161
+msgid "Type here the name of your printer device"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:1025 src/slic3r/GUI/MainFrame.cpp:1087
-msgid "Select configuration to load:"
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:172
+msgid "Descriptive name for the printer"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:1061
-msgid "Save presets bundle as:"
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:176
+msgid "Add preset for this printer device"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:1108
-#, possible-c-format
-msgid "%d presets successfully imported."
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:205 src/slic3r/GUI/Tab.cpp:2064
+msgid "Print Host upload"
msgstr ""
-#: src/slic3r/GUI/Mouse3DController.cpp:258
-msgid "3Dconnexion settings"
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:260
+msgid "Connection to printers connected via the print host failed."
msgstr ""
-#: src/slic3r/GUI/Mouse3DController.cpp:273
-msgid "Device:"
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:302
+msgid "Test"
msgstr ""
-#: src/slic3r/GUI/Mouse3DController.cpp:280
-msgid "Speed:"
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:307
+msgid "Could not get a valid Printer Host reference"
msgstr ""
-#: src/slic3r/GUI/Mouse3DController.cpp:284
-#: src/slic3r/GUI/Mouse3DController.cpp:307
-msgid "Translation"
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:319
+msgid "Success!"
msgstr ""
-#: src/slic3r/GUI/Mouse3DController.cpp:296
-#: src/slic3r/GUI/Mouse3DController.cpp:307
-msgid "Zoom"
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:329
+msgid "Refresh Printers"
msgstr ""
-#: src/slic3r/GUI/Mouse3DController.cpp:303
-msgid "Deadzone:"
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:356
+msgid ""
+"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-"
+"signed certificate."
msgstr ""
-#: src/slic3r/GUI/MsgDialog.cpp:73
-#, possible-c-format
-msgid "%s error"
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:366
+msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*"
msgstr ""
-#: src/slic3r/GUI/MsgDialog.cpp:74
-#, possible-c-format
-msgid "%s has encountered an error"
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:367
+msgid "Open CA certificate file"
msgstr ""
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:56
-msgid "Instances"
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:395
+#: src/libslic3r/PrintConfig.cpp:124
+msgid "HTTPS CA File"
msgstr ""
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:60
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:216
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:396
#, possible-c-format
-msgid "Instance %d"
+msgid ""
+"On this system, %s uses HTTPS certificates from the system Certificate Store "
+"or Keychain."
msgstr ""
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3575
-#: src/slic3r/GUI/Tab.cpp:3657
-msgid "Layers"
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:397
+msgid ""
+"To use a custom CA file, please import your CA file into Certificate Store / "
+"Keychain."
msgstr ""
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:94
-msgid "Range"
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:543
+msgid "The supplied name is empty. It can't be saved."
msgstr ""
-#: src/slic3r/GUI/OptionsGroup.cpp:274
-msgctxt "Layers"
-msgid "Top"
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:547
+msgid "You should change the name of your printer device."
msgstr ""
-#: src/slic3r/GUI/OptionsGroup.cpp:274
-msgctxt "Layers"
-msgid "Bottom"
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:555
+msgid "Printer with name \"%1%\" already exists."
+msgstr ""
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:556
+msgid "Replace?"
+msgstr ""
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:579
+msgid ""
+"Following printer preset(s) is duplicated:%1%The above preset for printer "
+"\"%2%\" will be used just once."
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:161
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:625
+msgid "It's not possible to delete the last related preset for the printer."
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:163
msgid "Volume"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:162
+#: src/slic3r/GUI/Plater.cpp:164
msgid "Facets"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:163
+#: src/slic3r/GUI/Plater.cpp:165
msgid "Materials"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:166
+#: src/slic3r/GUI/Plater.cpp:168
msgid "Manifold"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:216
+#: src/slic3r/GUI/Plater.cpp:218
msgid "Sliced Info"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:235 src/slic3r/GUI/Plater.cpp:1234
+#: src/slic3r/GUI/Plater.cpp:237 src/slic3r/GUI/Plater.cpp:1151
msgid "Used Filament (m)"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:236
+#: src/slic3r/GUI/Plater.cpp:238 src/slic3r/GUI/Plater.cpp:1163
msgid "Used Filament (mm³)"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:237
+#: src/slic3r/GUI/Plater.cpp:239 src/slic3r/GUI/Plater.cpp:1170
msgid "Used Filament (g)"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:238
+#: src/slic3r/GUI/Plater.cpp:240
msgid "Used Material (unit)"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:239
+#: src/slic3r/GUI/Plater.cpp:241
msgid "Cost (money)"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:240 src/slic3r/GUI/Plater.cpp:1221
-#: src/slic3r/GUI/Plater.cpp:1263
-msgid "Estimated printing time"
-msgstr ""
-
-#: src/slic3r/GUI/Plater.cpp:241
+#: src/slic3r/GUI/Plater.cpp:243
msgid "Number of tool changes"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:348
-msgid "Click to edit preset"
-msgstr ""
-
-#: src/slic3r/GUI/Plater.cpp:503
+#: src/slic3r/GUI/Plater.cpp:360
msgid "Select what kind of support do you need"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:505 src/libslic3r/PrintConfig.cpp:1908
-#: src/libslic3r/PrintConfig.cpp:2691
+#: src/slic3r/GUI/Plater.cpp:362 src/libslic3r/PrintConfig.cpp:2128
+#: src/libslic3r/PrintConfig.cpp:2923
msgid "Support on build plate only"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:506 src/slic3r/GUI/Plater.cpp:629
+#: src/slic3r/GUI/Plater.cpp:363 src/slic3r/GUI/Plater.cpp:489
msgid "For support enforcers only"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:507
+#: src/slic3r/GUI/Plater.cpp:364
msgid "Everywhere"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:539 src/slic3r/GUI/Tab.cpp:1178
+#: src/slic3r/GUI/Plater.cpp:396 src/slic3r/GUI/Tab.cpp:1469
msgid "Brim"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:541
+#: src/slic3r/GUI/Plater.cpp:398
msgid ""
"This flag enables the brim that will be printed around each object on the "
"first layer."
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:549
+#: src/slic3r/GUI/Plater.cpp:406
msgid "Purging volumes"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:643
+#: src/slic3r/GUI/Plater.cpp:503
msgid "Select what kind of pad do you need"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:645
+#: src/slic3r/GUI/Plater.cpp:505
msgid "Below object"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:646
+#: src/slic3r/GUI/Plater.cpp:506
msgid "Around object"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:820
-msgid "Print settings"
-msgstr ""
-
-#: src/slic3r/GUI/Plater.cpp:821 src/slic3r/GUI/Tab.cpp:1481
-#: src/slic3r/GUI/Tab.cpp:1482
-msgid "Filament"
-msgstr ""
-
-#: src/slic3r/GUI/Plater.cpp:822
+#: src/slic3r/GUI/Plater.cpp:695
msgid "SLA print settings"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:823 src/slic3r/GUI/Preset.cpp:1565
-msgid "SLA material"
-msgstr ""
-
-#: src/slic3r/GUI/Plater.cpp:824
-msgid "Printer"
-msgstr ""
-
-#: src/slic3r/GUI/Plater.cpp:883 src/slic3r/GUI/Plater.cpp:5563
+#: src/slic3r/GUI/Plater.cpp:756 src/slic3r/GUI/Plater.cpp:6055
msgid "Send to printer"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:884
-msgid "Remove device"
-msgstr ""
-
-#: src/slic3r/GUI/Plater.cpp:897 src/slic3r/GUI/Plater.cpp:3188
-#: src/slic3r/GUI/Plater.cpp:5168
+#: src/slic3r/GUI/Plater.cpp:771 src/slic3r/GUI/Plater.cpp:3009
+#: src/slic3r/GUI/Plater.cpp:5584
msgid "Slice now"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1047
+#: src/slic3r/GUI/Plater.cpp:926
msgid "Hold Shift to Slice & Export G-code"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1157
+#: src/slic3r/GUI/Plater.cpp:1071
#, possible-c-format
msgid "%d (%d shells)"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1162
+#: src/slic3r/GUI/Plater.cpp:1076
#, possible-c-format
msgid "Auto-repaired (%d errors)"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1165
+#: src/slic3r/GUI/Plater.cpp:1079
#, possible-c-format
msgid ""
"%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d "
"facets reversed, %d backwards edges"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1175
+#: src/slic3r/GUI/Plater.cpp:1089
msgid "Yes"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1196
+#: src/slic3r/GUI/Plater.cpp:1110
msgid "Used Material (ml)"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1199
+#: src/slic3r/GUI/Plater.cpp:1113
msgid "object(s)"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1199
+#: src/slic3r/GUI/Plater.cpp:1113
msgid "supports and pad"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1236 src/slic3r/GUI/Plater.cpp:1250
+#: src/slic3r/GUI/Plater.cpp:1151
+msgid "Used Filament (in)"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1153 src/slic3r/GUI/Plater.cpp:1206
msgid "objects"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1236 src/slic3r/GUI/Plater.cpp:1250
+#: src/slic3r/GUI/Plater.cpp:1153 src/slic3r/GUI/Plater.cpp:1206
msgid "wipe tower"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1248 src/libslic3r/PrintConfig.cpp:760
-#: src/libslic3r/PrintConfig.cpp:2517 src/libslic3r/PrintConfig.cpp:2518
-msgid "Cost"
+#: src/slic3r/GUI/Plater.cpp:1163
+msgid "Used Filament (in³)"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1265 src/libslic3r/PrintConfig.cpp:582
-msgid "Color"
+#: src/slic3r/GUI/Plater.cpp:1189
+msgid "Filament at extruder %1%"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1266
-msgid "Pause"
+#: src/slic3r/GUI/Plater.cpp:1195
+msgid "(including spool)"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1204 src/libslic3r/PrintConfig.cpp:822
+#: src/libslic3r/PrintConfig.cpp:2738 src/libslic3r/PrintConfig.cpp:2739
+msgid "Cost"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1291
+#: src/slic3r/GUI/Plater.cpp:1222
msgid "normal mode"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1296
+#: src/slic3r/GUI/Plater.cpp:1232
msgid "stealth mode"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1400
+#: src/slic3r/GUI/Plater.cpp:1403 src/slic3r/GUI/Plater.cpp:4923
+#, possible-c-format
+msgid "%s - Drop project file"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1410 src/slic3r/GUI/Plater.cpp:4930
+msgid "Open as project"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1411 src/slic3r/GUI/Plater.cpp:4931
+msgid "Import geometry only"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1412 src/slic3r/GUI/Plater.cpp:4932
+msgid "Import config only"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1415 src/slic3r/GUI/Plater.cpp:4935
+msgid "Select an action to apply to the file"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1416 src/slic3r/GUI/Plater.cpp:4936
+msgid "Action"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1424 src/slic3r/GUI/Plater.cpp:4944
+msgid "Don't show again"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1469 src/slic3r/GUI/Plater.cpp:4981
+msgid "You can open only one .gcode file at a time."
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1470 src/slic3r/GUI/Plater.cpp:4982
+msgid "Drag and drop G-code file"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1524 src/slic3r/GUI/Plater.cpp:4796
+#: src/slic3r/GUI/Plater.cpp:5036
+msgid "Import Object"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1546 src/slic3r/GUI/Plater.cpp:5058
msgid "Load File"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:1404
+#: src/slic3r/GUI/Plater.cpp:1551 src/slic3r/GUI/Plater.cpp:5063
msgid "Load Files"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2205
+#: src/slic3r/GUI/Plater.cpp:1654
+msgid "Fill bed"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1660
+msgid "Optimize Rotation"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1666
+msgid "Import SLA archive"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:2129
#, possible-c-format
msgid ""
-"Unmounting successful. The device %s(%s) can now be safely removed from the "
+"Successfully unmounted. The device %s(%s) can now be safely removed from the "
"computer."
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2208
+#: src/slic3r/GUI/Plater.cpp:2134
#, possible-c-format
msgid "Ejecting of device %s(%s) has failed."
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2221
+#: src/slic3r/GUI/Plater.cpp:2153
msgid "New Project"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2335
+#: src/slic3r/GUI/Plater.cpp:2246
+msgid "Expand sidebar"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:2319
msgid "Loading"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2345
-#, possible-c-format
-msgid "Processing input file %s"
+#: src/slic3r/GUI/Plater.cpp:2329
+msgid "Loading file"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2373
-msgid "You cannot load SLA project with a multi-part object on the bed"
+#: src/slic3r/GUI/Plater.cpp:2415
+#, possible-c-format
+msgid ""
+"Some object(s) in file %s looks like saved in inches.\n"
+"Should I consider them as a saved in inches and convert them?"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2374 src/slic3r/GUI/Tab.cpp:2948
-msgid "Please check your object list before preset changing."
+#: src/slic3r/GUI/Plater.cpp:2417
+msgid "The object appears to be saved in inches"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2419
+#: src/slic3r/GUI/Plater.cpp:2425
msgid ""
"This file contains several objects positioned at multiple heights.\n"
"Instead of considering them as multiple objects, should I consider\n"
"this file as a single object having multiple parts?"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2422 src/slic3r/GUI/Plater.cpp:2475
+#: src/slic3r/GUI/Plater.cpp:2428 src/slic3r/GUI/Plater.cpp:2481
msgid "Multi-part object detected"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2429
+#: src/slic3r/GUI/Plater.cpp:2435
msgid ""
"This file cannot be loaded in a simple mode. Do you want to switch to an "
"advanced mode?"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2430
+#: src/slic3r/GUI/Plater.cpp:2436
msgid "Detected advanced data"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2452
+#: src/slic3r/GUI/Plater.cpp:2458
#, possible-c-format
msgid ""
"You can't to add the object(s) from %s because of one or some of them "
"is(are) multi-part"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2472
+#: src/slic3r/GUI/Plater.cpp:2478
msgid ""
"Multiple objects were loaded for a multi-material printer.\n"
"Instead of considering them as multiple objects, should I consider\n"
"these files to represent a single object having multiple parts?"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2488
+#: src/slic3r/GUI/Plater.cpp:2494
msgid "Loaded"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2590
+#: src/slic3r/GUI/Plater.cpp:2596
msgid ""
"Your object appears to be too large, so it was automatically scaled down to "
"fit your print bed."
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2591
+#: src/slic3r/GUI/Plater.cpp:2597
msgid "Object too large?"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2653
+#: src/slic3r/GUI/Plater.cpp:2659
msgid "Export STL file:"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2660
+#: src/slic3r/GUI/Plater.cpp:2666
msgid "Export AMF file:"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2666
+#: src/slic3r/GUI/Plater.cpp:2672
msgid "Save file as:"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2672
+#: src/slic3r/GUI/Plater.cpp:2678
msgid "Export OBJ file:"
msgstr ""
@@ -4297,125 +5538,87 @@ msgstr ""
msgid "Reset Project"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:2822
-msgid "Hollow"
-msgstr ""
-
-#: src/slic3r/GUI/Plater.cpp:2829
-msgid "Optimize Rotation"
-msgstr ""
-
-#: src/slic3r/GUI/Plater.cpp:2875
-msgid "Arranging"
-msgstr ""
-
-#: src/slic3r/GUI/Plater.cpp:2902
-msgid "Could not arrange model objects! Some geometries may be invalid."
-msgstr ""
-
-#: src/slic3r/GUI/Plater.cpp:2908
-msgid "Arranging canceled."
-msgstr ""
-
-#: src/slic3r/GUI/Plater.cpp:2909
-msgid "Arranging done."
-msgstr ""
-
-#: src/slic3r/GUI/Plater.cpp:2925
-msgid "Searching for optimal orientation"
-msgstr ""
-
-#: src/slic3r/GUI/Plater.cpp:2958
-msgid "Orientation search canceled."
-msgstr ""
-
-#: src/slic3r/GUI/Plater.cpp:2959
-msgid "Orientation found."
-msgstr ""
-
-#: src/slic3r/GUI/Plater.cpp:2989
-msgid "Indexing hollowed object"
-msgstr ""
-
-#: src/slic3r/GUI/Plater.cpp:2993
-msgid "Hollowing cancelled."
-msgstr ""
-
-#: src/slic3r/GUI/Plater.cpp:2994
-msgid "Hollowing done."
-msgstr ""
-
-#: src/slic3r/GUI/Plater.cpp:2996
-msgid "Hollowing failed."
-msgstr ""
-
-#: src/slic3r/GUI/Plater.cpp:3037
+#: src/slic3r/GUI/Plater.cpp:2857
msgid ""
"The selected object can't be split because it contains more than one volume/"
"material."
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3048
+#: src/slic3r/GUI/Plater.cpp:2868
msgid "Split to Objects"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3173
+#: src/slic3r/GUI/Plater.cpp:2993 src/slic3r/GUI/Plater.cpp:3723
msgid "Invalid data"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3182
+#: src/slic3r/GUI/Plater.cpp:3003
msgid "Ready to slice"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3220 src/slic3r/GUI/PrintHostDialogs.cpp:232
+#: src/slic3r/GUI/Plater.cpp:3041 src/slic3r/GUI/PrintHostDialogs.cpp:264
msgid "Cancelling"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3237
+#: src/slic3r/GUI/Plater.cpp:3060
msgid "Another export job is currently running."
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3353
+#: src/slic3r/GUI/Plater.cpp:3177
msgid "Please select the file to reload"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3388
+#: src/slic3r/GUI/Plater.cpp:3212
msgid "It is not allowed to change the file to reload"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3388
+#: src/slic3r/GUI/Plater.cpp:3212
msgid "Do you want to retry"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3406
+#: src/slic3r/GUI/Plater.cpp:3230
msgid "Reload from:"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3495
+#: src/slic3r/GUI/Plater.cpp:3323
msgid "Unable to reload:"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3500
+#: src/slic3r/GUI/Plater.cpp:3328
msgid "Error during reload"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3519
+#: src/slic3r/GUI/Plater.cpp:3347
msgid "Reload all from disk"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3540
-msgid "Fix Throught NetFabb"
+#: src/slic3r/GUI/Plater.cpp:3374
+msgid ""
+"ERROR: Please close all manipulators available from the left toolbar before "
+"fixing the mesh."
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3731
-msgid "Export failed"
+#: src/slic3r/GUI/Plater.cpp:3380
+msgid "Fix through NetFabb"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3741 src/slic3r/GUI/PrintHostDialogs.cpp:233
+#: src/slic3r/GUI/Plater.cpp:3397
+msgid "Custom supports and seams were removed after repairing the mesh."
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:3680
+msgid "There are active warnings concerning sliced models:"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:3691
+msgid "generated warnings"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:3731 src/slic3r/GUI/PrintHostDialogs.cpp:265
msgid "Cancelled"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:3998 src/slic3r/GUI/Plater.cpp:4020
+#: src/slic3r/GUI/Plater.cpp:3998 src/slic3r/GUI/Plater.cpp:4022
msgid "Remove the selected object"
msgstr ""
@@ -4435,211 +5638,228 @@ msgstr ""
msgid "Change the number of instances of the selected object"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4030
+#: src/slic3r/GUI/Plater.cpp:4013
+msgid "Fill bed with instances"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:4013
+msgid "Fill the remaining area of bed with instances of the selected object"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:4032
msgid "Reload the selected object from disk"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4033
+#: src/slic3r/GUI/Plater.cpp:4035
msgid "Export the selected object as STL file"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4062
+#: src/slic3r/GUI/Plater.cpp:4065
msgid "Along X axis"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4062
+#: src/slic3r/GUI/Plater.cpp:4065
msgid "Mirror the selected object along the X axis"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4064
+#: src/slic3r/GUI/Plater.cpp:4067
msgid "Along Y axis"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4064
+#: src/slic3r/GUI/Plater.cpp:4067
msgid "Mirror the selected object along the Y axis"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4066
+#: src/slic3r/GUI/Plater.cpp:4069
msgid "Along Z axis"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4066
+#: src/slic3r/GUI/Plater.cpp:4069
msgid "Mirror the selected object along the Z axis"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4069
+#: src/slic3r/GUI/Plater.cpp:4072
msgid "Mirror"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4069
+#: src/slic3r/GUI/Plater.cpp:4072
msgid "Mirror the selected object"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4081
+#: src/slic3r/GUI/Plater.cpp:4084
msgid "To objects"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4081 src/slic3r/GUI/Plater.cpp:4101
+#: src/slic3r/GUI/Plater.cpp:4084 src/slic3r/GUI/Plater.cpp:4104
msgid "Split the selected object into individual objects"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4083
+#: src/slic3r/GUI/Plater.cpp:4086
msgid "To parts"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4083 src/slic3r/GUI/Plater.cpp:4115
+#: src/slic3r/GUI/Plater.cpp:4086 src/slic3r/GUI/Plater.cpp:4122
msgid "Split the selected object into individual sub-parts"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4086 src/slic3r/GUI/Plater.cpp:4101
-#: src/slic3r/GUI/Plater.cpp:4115 src/libslic3r/PrintConfig.cpp:3493
+#: src/slic3r/GUI/Plater.cpp:4089 src/slic3r/GUI/Plater.cpp:4104
+#: src/slic3r/GUI/Plater.cpp:4122 src/libslic3r/PrintConfig.cpp:3759
msgid "Split"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4086
+#: src/slic3r/GUI/Plater.cpp:4089
msgid "Split the selected object"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4107
+#: src/slic3r/GUI/Plater.cpp:4111
msgid "Optimize orientation"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4107
+#: src/slic3r/GUI/Plater.cpp:4112
msgid "Optimize the rotation of the object for better print results."
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4164
+#: src/slic3r/GUI/Plater.cpp:4192
msgid "3D editor view"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4471
+#: src/slic3r/GUI/Plater.cpp:4564
msgid ""
"%1% printer was active at the time the target Undo / Redo snapshot was "
"taken. Switching to %1% printer requires reloading of %1% presets."
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4646
+#: src/slic3r/GUI/Plater.cpp:4768
msgid "Load Project"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4674
-msgid "Import Object"
+#: src/slic3r/GUI/Plater.cpp:4800
+msgid "Import Objects"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4678
-msgid "Import Objects"
+#: src/slic3r/GUI/Plater.cpp:4868
+msgid "The selected file"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:4868
+msgid "does not contain valid gcode."
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:4869
+msgid "Error while loading .gcode file"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4740
+#: src/slic3r/GUI/Plater.cpp:5107
msgid "All objects will be removed, continue?"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4748
+#: src/slic3r/GUI/Plater.cpp:5115
msgid "Delete Selected Objects"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4756
+#: src/slic3r/GUI/Plater.cpp:5123
msgid "Increase Instances"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4791
+#: src/slic3r/GUI/Plater.cpp:5157
msgid "Decrease Instances"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4822
+#: src/slic3r/GUI/Plater.cpp:5188
msgid "Enter the number of copies:"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4823
+#: src/slic3r/GUI/Plater.cpp:5189
msgid "Copies of the selected object"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4827
+#: src/slic3r/GUI/Plater.cpp:5193
#, possible-c-format
msgid "Set numbers of copies to %d"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4857
+#: src/slic3r/GUI/Plater.cpp:5259
msgid "Cut by Plane"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4908
+#: src/slic3r/GUI/Plater.cpp:5316
msgid "Save G-code file as:"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:4908
+#: src/slic3r/GUI/Plater.cpp:5316
msgid "Save SL1 file as:"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:5043
+#: src/slic3r/GUI/Plater.cpp:5463
#, possible-c-format
msgid "STL file exported to %s"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:5060
+#: src/slic3r/GUI/Plater.cpp:5480
#, possible-c-format
msgid "AMF file exported to %s"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:5063
+#: src/slic3r/GUI/Plater.cpp:5483
#, possible-c-format
msgid "Error exporting AMF file %s"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:5096
+#: src/slic3r/GUI/Plater.cpp:5512
#, possible-c-format
msgid "3MF file exported to %s"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:5101
+#: src/slic3r/GUI/Plater.cpp:5517
#, possible-c-format
msgid "Error exporting 3MF file %s"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:5562
+#: src/slic3r/GUI/Plater.cpp:6054
msgid "Export"
msgstr ""
-#: src/slic3r/GUI/Plater.cpp:5648
+#: src/slic3r/GUI/Plater.cpp:6149
msgid "Paste From Clipboard"
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1847
-#: src/slic3r/GUI/Tab.cpp:2059
+#: src/slic3r/GUI/Preferences.cpp:56 src/slic3r/GUI/Tab.cpp:2098
+#: src/slic3r/GUI/Tab.cpp:2285 src/slic3r/GUI/Tab.cpp:2393
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1080
msgid "General"
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:39
+#: src/slic3r/GUI/Preferences.cpp:69
msgid "Remember output directory"
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:41
+#: src/slic3r/GUI/Preferences.cpp:71
msgid ""
"If this is enabled, Slic3r will prompt the last output directory instead of "
"the one containing the input files."
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:47
+#: src/slic3r/GUI/Preferences.cpp:77
msgid "Auto-center parts"
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:49
+#: src/slic3r/GUI/Preferences.cpp:79
msgid ""
"If this is enabled, Slic3r will auto-center objects around the print bed "
"center."
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:55
+#: src/slic3r/GUI/Preferences.cpp:85
msgid "Background processing"
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:57
+#: src/slic3r/GUI/Preferences.cpp:87
msgid ""
"If this is enabled, Slic3r will pre-process objects as soon as they're "
"loaded in order to save time when exporting G-code."
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:66
+#: src/slic3r/GUI/Preferences.cpp:96
msgid ""
"If enabled, PrusaSlicer will check for the new versions of itself online. "
"When a new version becomes available a notification is displayed at the next "
@@ -4647,17 +5867,25 @@ msgid ""
"notification mechanisms, no automatic installation is done."
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:72
+#: src/slic3r/GUI/Preferences.cpp:102
msgid "Export sources full pathnames to 3mf and amf"
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:74
+#: src/slic3r/GUI/Preferences.cpp:104
msgid ""
"If enabled, allows the Reload from disk command to automatically find and "
"load the files when invoked."
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:82
+#: src/slic3r/GUI/Preferences.cpp:114
+msgid "If enabled, sets PrusaSlicer as default application to open .3mf files."
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:121
+msgid "If enabled, sets PrusaSlicer as default application to open .stl files."
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:131
msgid ""
"If enabled, Slic3r downloads updates of built-in system presets in the "
"background. These updates are downloaded into a separate temporary location. "
@@ -4665,328 +5893,511 @@ msgid ""
"startup."
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:87
+#: src/slic3r/GUI/Preferences.cpp:136
msgid "Suppress \" - default - \" presets"
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:89
+#: src/slic3r/GUI/Preferences.cpp:138
msgid ""
"Suppress \" - default - \" presets in the Print / Filament / Printer "
"selections once there are any other valid presets available."
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:95
+#: src/slic3r/GUI/Preferences.cpp:144
msgid "Show incompatible print and filament presets"
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:97
+#: src/slic3r/GUI/Preferences.cpp:146
msgid ""
"When checked, the print and filament presets are shown in the preset editor "
"even if they are marked as incompatible with the active printer"
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:104
+#: src/slic3r/GUI/Preferences.cpp:152
+msgid "Show drop project dialog"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:154
+msgid ""
+"When checked, whenever dragging and dropping a project file on the "
+"application, shows a dialog asking to select the action to take on the file "
+"to load."
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:161 src/slic3r/GUI/Preferences.cpp:165
+msgid "Allow just a single PrusaSlicer instance"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:163
+msgid ""
+"On OSX there is always only one instance of app running by default. However "
+"it is allowed to run multiple instances of same app from the command line. "
+"In such case this settings will allow only one instance."
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:167
+msgid ""
+"If this is enabled, when starting PrusaSlicer and another instance of the "
+"same PrusaSlicer is already running, that instance will be reactivated "
+"instead."
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:173
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:671
+msgid "Ask for unsaved changes when closing application"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:175
+msgid "When closing the application, always ask for unsaved changes"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:180
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:672
+msgid "Ask for unsaved changes when selecting new preset"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:182
+msgid "Always ask for unsaved changes when selecting new preset"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:190
+msgid "Associate .gcode files to PrusaSlicer G-code Viewer"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:192
+msgid ""
+"If enabled, sets PrusaSlicer G-code Viewer as default application to open ."
+"gcode files."
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:201
msgid "Use Retina resolution for the 3D scene"
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:106
+#: src/slic3r/GUI/Preferences.cpp:203
msgid ""
"If enabled, the 3D scene will be rendered in Retina resolution. If you are "
"experiencing 3D performance problems, disabling this option may help."
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:113
+#: src/slic3r/GUI/Preferences.cpp:211 src/slic3r/GUI/Preferences.cpp:213
+msgid "Show splash screen"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:220
+msgid "Enable support for legacy 3DConnexion devices"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:222
+msgid ""
+"If enabled, the legacy 3DConnexion devices settings dialog is available by "
+"pressing CTRL+M"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:232
msgid "Camera"
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:119
+#: src/slic3r/GUI/Preferences.cpp:237
msgid "Use perspective camera"
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:121
+#: src/slic3r/GUI/Preferences.cpp:239
msgid ""
"If enabled, use perspective camera. If not enabled, use orthographic camera."
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:126
+#: src/slic3r/GUI/Preferences.cpp:244
msgid "Use free camera"
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:128
+#: src/slic3r/GUI/Preferences.cpp:246
msgid "If enabled, use free camera. If not enabled, use constrained camera."
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:133
+#: src/slic3r/GUI/Preferences.cpp:251
+msgid "Reverse direction of zoom with mouse wheel"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:253
+msgid "If enabled, reverses the direction of zoom with mouse wheel"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:261
msgid "GUI"
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:143
+#: src/slic3r/GUI/Preferences.cpp:276
+msgid "Sequential slider applied only to top layer"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:278
+msgid ""
+"If enabled, changes made using the sequential slider, in preview, apply only "
+"to gcode top layer. If disabled, changes made using the sequential slider, "
+"in preview, apply to the whole gcode."
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:285
+msgid "Show sidebar collapse/expand button"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:287
+msgid ""
+"If enabled, the button for the collapse sidebar will be appeared in top "
+"right corner of the 3D Scene"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:292
+msgid "Suppress to open hyperlink in browser"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:294
+msgid ""
+"If enabled, the descriptions of configuration parameters in settings tabs "
+"wouldn't work as hyperlinks. If disabled, the descriptions of configuration "
+"parameters in settings tabs will work as hyperlinks."
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:300
msgid "Use custom size for toolbar icons"
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:145
+#: src/slic3r/GUI/Preferences.cpp:302
msgid "If enabled, you can change size of toolbar icons manually."
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:172
+#: src/slic3r/GUI/Preferences.cpp:320
+msgid "Render"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:325
+msgid "Use environment map"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:327
+msgid "If enabled, renders object using the environment map."
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:352
#, possible-c-format
msgid "You need to restart %s to make the changes effective."
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:222
+#: src/slic3r/GUI/Preferences.cpp:427
msgid "Icon size in a respect to the default size"
msgstr ""
-#: src/slic3r/GUI/Preferences.cpp:237
+#: src/slic3r/GUI/Preferences.cpp:442
msgid "Select toolbar icon size in respect to the default one."
msgstr ""
-#: src/slic3r/GUI/Preset.cpp:250
-msgid "modified"
+#: src/slic3r/GUI/Preferences.cpp:473
+msgid "Old regular layout with the tab bar"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:474
+msgid "New layout, access via settings button in the top menu"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:475
+msgid "Settings in non-modal window"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:484
+msgid "Layout Options"
msgstr ""
-#: src/slic3r/GUI/Preset.cpp:1150 src/slic3r/GUI/Preset.cpp:1205
-#: src/slic3r/GUI/Preset.cpp:1283 src/slic3r/GUI/Preset.cpp:1325
-#: src/slic3r/GUI/PresetBundle.cpp:1599 src/slic3r/GUI/PresetBundle.cpp:1697
+#: src/slic3r/GUI/PresetComboBoxes.cpp:197
+#: src/slic3r/GUI/PresetComboBoxes.cpp:235
+#: src/slic3r/GUI/PresetComboBoxes.cpp:761
+#: src/slic3r/GUI/PresetComboBoxes.cpp:811
+#: src/slic3r/GUI/PresetComboBoxes.cpp:925
+#: src/slic3r/GUI/PresetComboBoxes.cpp:969
msgid "System presets"
msgstr ""
-#: src/slic3r/GUI/Preset.cpp:1209 src/slic3r/GUI/Preset.cpp:1329
-#: src/slic3r/GUI/PresetBundle.cpp:1702
+#: src/slic3r/GUI/PresetComboBoxes.cpp:239
+#: src/slic3r/GUI/PresetComboBoxes.cpp:815
+#: src/slic3r/GUI/PresetComboBoxes.cpp:973
msgid "User presets"
msgstr ""
-#: src/slic3r/GUI/Preset.cpp:1242
-msgid "Add/Remove materials"
+#: src/slic3r/GUI/PresetComboBoxes.cpp:250
+msgid "Incompatible presets"
msgstr ""
-#: src/slic3r/GUI/Preset.cpp:1244
-msgid "Add/Remove printers"
+#: src/slic3r/GUI/PresetComboBoxes.cpp:285
+msgid "Are you sure you want to delete \"%1%\" printer?"
msgstr ""
-#: src/slic3r/GUI/Preset.cpp:1563
-msgid "filament"
+#: src/slic3r/GUI/PresetComboBoxes.cpp:287
+msgid "Delete Physical Printer"
msgstr ""
-#: src/slic3r/GUI/Preset.cpp:1564
-msgid "SLA print"
+#: src/slic3r/GUI/PresetComboBoxes.cpp:624
+msgid "Click to edit preset"
+msgstr ""
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:680
+#: src/slic3r/GUI/PresetComboBoxes.cpp:710
+msgid "Add/Remove presets"
msgstr ""
-#: src/slic3r/GUI/PresetBundle.cpp:1729
+#: src/slic3r/GUI/PresetComboBoxes.cpp:685
+#: src/slic3r/GUI/PresetComboBoxes.cpp:715 src/slic3r/GUI/Tab.cpp:2990
+msgid "Add physical printer"
+msgstr ""
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:699
+msgid "Edit preset"
+msgstr ""
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:703 src/slic3r/GUI/Tab.cpp:2990
+msgid "Edit physical printer"
+msgstr ""
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:706
+msgid "Delete physical printer"
+msgstr ""
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:826
+#: src/slic3r/GUI/PresetComboBoxes.cpp:987
+msgid "Physical printers"
+msgstr ""
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:850
msgid "Add/Remove filaments"
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:29
+#: src/slic3r/GUI/PresetComboBoxes.cpp:852
+msgid "Add/Remove materials"
+msgstr ""
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:854
+#: src/slic3r/GUI/PresetComboBoxes.cpp:1011
+msgid "Add/Remove printers"
+msgstr ""
+
+#: src/slic3r/GUI/PresetHints.cpp:32
msgid ""
"If estimated layer time is below ~%1%s, fan will run at %2%%% and print "
"speed will be reduced so that no less than %3%s are spent on that layer "
"(however, speed will never be reduced below %4%mm/s)."
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:36
+#: src/slic3r/GUI/PresetHints.cpp:39
msgid ""
"If estimated layer time is greater, but still below ~%1%s, fan will run at a "
"proportionally decreasing speed between %2%%% and %3%%%."
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:40
-msgid "During the other layers, fan"
+#: src/slic3r/GUI/PresetHints.cpp:49
+msgid "Fan speed will be ramped from zero at layer %1% to %2%%% at layer %3%."
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:42
-msgid "Fan"
+#: src/slic3r/GUI/PresetHints.cpp:51
+msgid "During the other layers, fan will always run at %1%%%"
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:48
-msgid "will always run at %1%%%"
+#: src/slic3r/GUI/PresetHints.cpp:51
+msgid "Fan will always run at %1%%%"
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:51
+#: src/slic3r/GUI/PresetHints.cpp:53
msgid "except for the first %1% layers."
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:53
+#: src/slic3r/GUI/PresetHints.cpp:55
msgid "except for the first layer."
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:55
-msgid "will be turned off."
+#: src/slic3r/GUI/PresetHints.cpp:58
+msgid "During the other layers, fan will be turned off."
+msgstr ""
+
+#: src/slic3r/GUI/PresetHints.cpp:58
+msgid "Fan will be turned off."
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:156
+#: src/slic3r/GUI/PresetHints.cpp:159
msgid "external perimeters"
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:165
+#: src/slic3r/GUI/PresetHints.cpp:168
msgid "perimeters"
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:174
+#: src/slic3r/GUI/PresetHints.cpp:177
msgid "infill"
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:184
+#: src/slic3r/GUI/PresetHints.cpp:187
msgid "solid infill"
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:192
+#: src/slic3r/GUI/PresetHints.cpp:195
msgid "top solid infill"
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:203
+#: src/slic3r/GUI/PresetHints.cpp:206
msgid "support"
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:213
+#: src/slic3r/GUI/PresetHints.cpp:216
msgid "support interface"
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:222
msgid "First layer volumetric"
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:222
msgid "Bridging volumetric"
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:222
msgid "Volumetric"
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:220
+#: src/slic3r/GUI/PresetHints.cpp:223
msgid "flow rate is maximized"
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:223
+#: src/slic3r/GUI/PresetHints.cpp:226
msgid "by the print profile maximum"
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:224
+#: src/slic3r/GUI/PresetHints.cpp:227
msgid "when printing"
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:225
+#: src/slic3r/GUI/PresetHints.cpp:228
msgid "with a volumetric rate"
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:229
+#: src/slic3r/GUI/PresetHints.cpp:232
#, possible-c-format
msgid "%3.2f mm³/s at filament speed %3.2f mm/s."
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:247
+#: src/slic3r/GUI/PresetHints.cpp:250
msgid ""
"Recommended object thin wall thickness: Not available due to invalid layer "
"height."
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:263
+#: src/slic3r/GUI/PresetHints.cpp:266
#, possible-c-format
msgid "Recommended object thin wall thickness for layer height %.2f and"
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:270
+#: src/slic3r/GUI/PresetHints.cpp:273
#, possible-c-format
msgid "%d lines: %.2f mm"
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:274
+#: src/slic3r/GUI/PresetHints.cpp:277
msgid ""
"Recommended object thin wall thickness: Not available due to excessively "
"small extrusion width."
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:304
+#: src/slic3r/GUI/PresetHints.cpp:306
msgid ""
"Top / bottom shell thickness hint: Not available due to invalid layer height."
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:317
+#: src/slic3r/GUI/PresetHints.cpp:319
msgid "Top shell is %1% mm thick for layer height %2% mm."
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:320
+#: src/slic3r/GUI/PresetHints.cpp:322
msgid "Minimum top shell thickness is %1% mm."
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:323
+#: src/slic3r/GUI/PresetHints.cpp:325
msgid "Top is open."
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:336
+#: src/slic3r/GUI/PresetHints.cpp:338
msgid "Bottom shell is %1% mm thick for layer height %2% mm."
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:339
+#: src/slic3r/GUI/PresetHints.cpp:341
msgid "Minimum bottom shell thickness is %1% mm."
msgstr ""
-#: src/slic3r/GUI/PresetHints.cpp:342
+#: src/slic3r/GUI/PresetHints.cpp:344
msgid "Bottom is open."
msgstr ""
-#: src/slic3r/GUI/PrintHostDialogs.cpp:33
+#: src/slic3r/GUI/PrintHostDialogs.cpp:35
msgid "Send G-Code to printer host"
msgstr ""
-#: src/slic3r/GUI/PrintHostDialogs.cpp:33
+#: src/slic3r/GUI/PrintHostDialogs.cpp:35
msgid "Upload to Printer Host with the following filename:"
msgstr ""
-#: src/slic3r/GUI/PrintHostDialogs.cpp:35
+#: src/slic3r/GUI/PrintHostDialogs.cpp:37
msgid "Start printing after upload"
msgstr ""
-#: src/slic3r/GUI/PrintHostDialogs.cpp:42
+#: src/slic3r/GUI/PrintHostDialogs.cpp:45
msgid "Use forward slashes ( / ) as a directory separator if needed."
msgstr ""
-#: src/slic3r/GUI/PrintHostDialogs.cpp:149
+#: src/slic3r/GUI/PrintHostDialogs.cpp:58
+msgid "Group"
+msgstr ""
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:176
msgid "ID"
msgstr ""
-#: src/slic3r/GUI/PrintHostDialogs.cpp:150
+#: src/slic3r/GUI/PrintHostDialogs.cpp:177
msgid "Progress"
msgstr ""
-#: src/slic3r/GUI/PrintHostDialogs.cpp:151
+#: src/slic3r/GUI/PrintHostDialogs.cpp:178
msgid "Status"
msgstr ""
-#: src/slic3r/GUI/PrintHostDialogs.cpp:152
+#: src/slic3r/GUI/PrintHostDialogs.cpp:179
msgid "Host"
msgstr ""
-#: src/slic3r/GUI/PrintHostDialogs.cpp:153
+#: src/slic3r/GUI/PrintHostDialogs.cpp:180
msgid "Filename"
msgstr ""
-#: src/slic3r/GUI/PrintHostDialogs.cpp:154
+#: src/slic3r/GUI/PrintHostDialogs.cpp:181
msgid "Error Message"
msgstr ""
-#: src/slic3r/GUI/PrintHostDialogs.cpp:157
+#: src/slic3r/GUI/PrintHostDialogs.cpp:184
msgid "Cancel selected"
msgstr ""
-#: src/slic3r/GUI/PrintHostDialogs.cpp:159
+#: src/slic3r/GUI/PrintHostDialogs.cpp:186
msgid "Show error message"
msgstr ""
-#: src/slic3r/GUI/PrintHostDialogs.cpp:198
-#: src/slic3r/GUI/PrintHostDialogs.cpp:229
+#: src/slic3r/GUI/PrintHostDialogs.cpp:228
+#: src/slic3r/GUI/PrintHostDialogs.cpp:261
msgid "Enqueued"
msgstr ""
-#: src/slic3r/GUI/PrintHostDialogs.cpp:230
+#: src/slic3r/GUI/PrintHostDialogs.cpp:262
msgid "Uploading"
msgstr ""
-#: src/slic3r/GUI/PrintHostDialogs.cpp:234
+#: src/slic3r/GUI/PrintHostDialogs.cpp:266
msgid "Completed"
msgstr ""
-#: src/slic3r/GUI/PrintHostDialogs.cpp:272
+#: src/slic3r/GUI/PrintHostDialogs.cpp:304
msgid "Error uploading to print host:"
msgstr ""
@@ -4994,17 +6405,13 @@ msgstr ""
msgid "NO RAMMING AT ALL"
msgstr ""
-#: src/slic3r/GUI/RammingChart.cpp:76
-msgid "Time"
-msgstr ""
-
#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83
-#: src/libslic3r/PrintConfig.cpp:644 src/libslic3r/PrintConfig.cpp:688
-#: src/libslic3r/PrintConfig.cpp:703 src/libslic3r/PrintConfig.cpp:2415
-#: src/libslic3r/PrintConfig.cpp:2424 src/libslic3r/PrintConfig.cpp:2534
-#: src/libslic3r/PrintConfig.cpp:2542 src/libslic3r/PrintConfig.cpp:2550
-#: src/libslic3r/PrintConfig.cpp:2557 src/libslic3r/PrintConfig.cpp:2565
-#: src/libslic3r/PrintConfig.cpp:2573
+#: src/libslic3r/PrintConfig.cpp:706 src/libslic3r/PrintConfig.cpp:750
+#: src/libslic3r/PrintConfig.cpp:765 src/libslic3r/PrintConfig.cpp:2636
+#: src/libslic3r/PrintConfig.cpp:2645 src/libslic3r/PrintConfig.cpp:2755
+#: src/libslic3r/PrintConfig.cpp:2763 src/libslic3r/PrintConfig.cpp:2771
+#: src/libslic3r/PrintConfig.cpp:2778 src/libslic3r/PrintConfig.cpp:2786
+#: src/libslic3r/PrintConfig.cpp:2794
msgid "s"
msgstr ""
@@ -5012,441 +6419,498 @@ msgstr ""
msgid "Volumetric speed"
msgstr ""
-#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:601
-#: src/libslic3r/PrintConfig.cpp:1250
+#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:663
+#: src/libslic3r/PrintConfig.cpp:1458
msgid "mm³/s"
msgstr ""
-#: src/slic3r/GUI/Selection.cpp:147
+#: src/slic3r/GUI/SavePresetDialog.cpp:57
+#, possible-c-format
+msgid "Save %s as:"
+msgstr ""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:110
+msgid "the following suffix is not allowed:"
+msgstr ""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:116
+msgid "The supplied name is not available."
+msgstr ""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:122
+msgid "Cannot overwrite a system profile."
+msgstr ""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:127
+msgid "Cannot overwrite an external profile."
+msgstr ""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:134
+msgid "Preset with name \"%1%\" already exists."
+msgstr ""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:136
+msgid ""
+"Preset with name \"%1%\" already exists and is incompatible with selected "
+"printer."
+msgstr ""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:137
+msgid "Note: This preset will be replaced after saving"
+msgstr ""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:142
+msgid "The name cannot be empty."
+msgstr ""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:147
+msgid "The name cannot start with space character."
+msgstr ""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:152
+msgid "The name cannot end with space character."
+msgstr ""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:186
+#: src/slic3r/GUI/SavePresetDialog.cpp:192
+msgid "Save preset"
+msgstr ""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:215
+msgctxt "PresetName"
+msgid "Copy"
+msgstr ""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:273
+msgid ""
+"You have selected physical printer \"%1%\" \n"
+"with related printer preset \"%2%\""
+msgstr ""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:306
+msgid "What would you like to do with \"%1%\" preset after saving?"
+msgstr ""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:309
+msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\""
+msgstr ""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:310
+msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\""
+msgstr ""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:311
+msgid "Just switch to \"%1%\" preset"
+msgstr ""
+
+#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2421
+msgid "Stealth"
+msgstr ""
+
+#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2415
+msgid "Normal"
+msgstr ""
+
+#: src/slic3r/GUI/Selection.cpp:172
msgid "Selection-Add"
msgstr ""
-#: src/slic3r/GUI/Selection.cpp:188
+#: src/slic3r/GUI/Selection.cpp:213
msgid "Selection-Remove"
msgstr ""
-#: src/slic3r/GUI/Selection.cpp:220
+#: src/slic3r/GUI/Selection.cpp:245
msgid "Selection-Add Object"
msgstr ""
-#: src/slic3r/GUI/Selection.cpp:239
+#: src/slic3r/GUI/Selection.cpp:264
msgid "Selection-Remove Object"
msgstr ""
-#: src/slic3r/GUI/Selection.cpp:257
+#: src/slic3r/GUI/Selection.cpp:282
msgid "Selection-Add Instance"
msgstr ""
-#: src/slic3r/GUI/Selection.cpp:276
+#: src/slic3r/GUI/Selection.cpp:301
msgid "Selection-Remove Instance"
msgstr ""
-#: src/slic3r/GUI/Selection.cpp:377
+#: src/slic3r/GUI/Selection.cpp:402
msgid "Selection-Add All"
msgstr ""
-#: src/slic3r/GUI/Selection.cpp:403
+#: src/slic3r/GUI/Selection.cpp:428
msgid "Selection-Remove All"
msgstr ""
-#: src/slic3r/GUI/Selection.cpp:940
+#: src/slic3r/GUI/Selection.cpp:960
msgid "Scale To Fit"
msgstr ""
-#: src/slic3r/GUI/Selection.cpp:1477
+#: src/slic3r/GUI/Selection.cpp:1487
msgid "Set Printable Instance"
msgstr ""
-#: src/slic3r/GUI/Selection.cpp:1477
+#: src/slic3r/GUI/Selection.cpp:1487
msgid "Set Unprintable Instance"
msgstr ""
-#: src/slic3r/GUI/SysInfoDialog.cpp:78
+#: src/slic3r/GUI/SysInfoDialog.cpp:82
msgid "System Information"
msgstr ""
-#: src/slic3r/GUI/SysInfoDialog.cpp:154
+#: src/slic3r/GUI/SysInfoDialog.cpp:158
msgid "Copy to Clipboard"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:265
+#: src/slic3r/GUI/Tab.cpp:109 src/libslic3r/PrintConfig.cpp:321
msgid "Compatible printers"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:51
+#: src/slic3r/GUI/Tab.cpp:110
msgid "Select the printers this profile is compatible with."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:280
+#: src/slic3r/GUI/Tab.cpp:115 src/libslic3r/PrintConfig.cpp:336
msgid "Compatible print profiles"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:57
+#: src/slic3r/GUI/Tab.cpp:116
msgid "Select the print profiles this profile is compatible with."
msgstr ""
#. TRN "Save current Settings"
-#: src/slic3r/GUI/Tab.cpp:133
+#: src/slic3r/GUI/Tab.cpp:211
#, possible-c-format
msgid "Save current %s"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:134
+#: src/slic3r/GUI/Tab.cpp:212
msgid "Delete this preset"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:139
+#: src/slic3r/GUI/Tab.cpp:216
msgid ""
"Hover the cursor over buttons to find more information \n"
"or click this button."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:241
-msgid "Add a new printer"
+#: src/slic3r/GUI/Tab.cpp:220
+msgid "Search in settings [%1%]"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:963
+#: src/slic3r/GUI/Tab.cpp:1237
msgid "Detach from system preset"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:975
+#: src/slic3r/GUI/Tab.cpp:1250
msgid ""
"A copy of the current system preset will be created, which will be detached "
"from the system preset."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:976
+#: src/slic3r/GUI/Tab.cpp:1251
msgid ""
"The current custom preset will be detached from the parent system preset."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:979
+#: src/slic3r/GUI/Tab.cpp:1254
msgid "Modifications to the current profile will be saved."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:982
+#: src/slic3r/GUI/Tab.cpp:1257
msgid ""
"This action is not revertable.\n"
"Do you want to proceed?"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:984
+#: src/slic3r/GUI/Tab.cpp:1259
msgid "Detach preset"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1010
+#: src/slic3r/GUI/Tab.cpp:1285
msgid "This is a default preset."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1012
+#: src/slic3r/GUI/Tab.cpp:1287
msgid "This is a system preset."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1014
+#: src/slic3r/GUI/Tab.cpp:1289
msgid "Current preset is inherited from the default preset."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1016
+#: src/slic3r/GUI/Tab.cpp:1293
msgid "Current preset is inherited from"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1020
+#: src/slic3r/GUI/Tab.cpp:1297
msgid "It can't be deleted or modified."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1021
+#: src/slic3r/GUI/Tab.cpp:1298
msgid ""
"Any modifications should be saved as a new preset inherited from this one."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1022
+#: src/slic3r/GUI/Tab.cpp:1299
msgid "To do that please specify a new name for the preset."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1026
+#: src/slic3r/GUI/Tab.cpp:1303
msgid "Additional information:"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1032
+#: src/slic3r/GUI/Tab.cpp:1309
msgid "printer model"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1040
+#: src/slic3r/GUI/Tab.cpp:1317
msgid "default print profile"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1043
+#: src/slic3r/GUI/Tab.cpp:1320
msgid "default filament profile"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1057
+#: src/slic3r/GUI/Tab.cpp:1334
msgid "default SLA material profile"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1061
+#: src/slic3r/GUI/Tab.cpp:1338
msgid "default SLA print profile"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1069
+#: src/slic3r/GUI/Tab.cpp:1346
msgid "full profile name"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1070
+#: src/slic3r/GUI/Tab.cpp:1347
msgid "symbolic profile name"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1108 src/slic3r/GUI/Tab.cpp:3655
+#: src/slic3r/GUI/Tab.cpp:1385 src/slic3r/GUI/Tab.cpp:4042
msgid "Layers and perimeters"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1113
+#: src/slic3r/GUI/Tab.cpp:1391
msgid "Vertical shells"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1124
+#: src/slic3r/GUI/Tab.cpp:1403
msgid "Horizontal shells"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1125 src/libslic3r/PrintConfig.cpp:1787
+#: src/slic3r/GUI/Tab.cpp:1404 src/libslic3r/PrintConfig.cpp:1980
msgid "Solid layers"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1129
+#: src/slic3r/GUI/Tab.cpp:1409
msgid "Minimum shell thickness"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1140
+#: src/slic3r/GUI/Tab.cpp:1420
msgid "Quality (slower slicing)"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1158
+#: src/slic3r/GUI/Tab.cpp:1448
msgid "Reducing printing time"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1170
+#: src/slic3r/GUI/Tab.cpp:1460
msgid "Skirt and brim"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1188
+#: src/slic3r/GUI/Tab.cpp:1480
msgid "Raft"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1192
+#: src/slic3r/GUI/Tab.cpp:1484
msgid "Options for support material and raft"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1207
+#: src/slic3r/GUI/Tab.cpp:1499
msgid "Speed for print moves"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1219
+#: src/slic3r/GUI/Tab.cpp:1512
msgid "Speed for non-print moves"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1222
+#: src/slic3r/GUI/Tab.cpp:1515
msgid "Modifiers"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1225
+#: src/slic3r/GUI/Tab.cpp:1518
msgid "Acceleration control (advanced)"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1232
+#: src/slic3r/GUI/Tab.cpp:1525
msgid "Autospeed (advanced)"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1240
+#: src/slic3r/GUI/Tab.cpp:1533
msgid "Multiple Extruders"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1248
+#: src/slic3r/GUI/Tab.cpp:1541
msgid "Ooze prevention"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1266
+#: src/slic3r/GUI/Tab.cpp:1559
msgid "Extrusion width"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1276
+#: src/slic3r/GUI/Tab.cpp:1569
msgid "Overlap"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1279
+#: src/slic3r/GUI/Tab.cpp:1572
msgid "Flow"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1288
+#: src/slic3r/GUI/Tab.cpp:1581
msgid "Other"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1291 src/slic3r/GUI/Tab.cpp:3724
+#: src/slic3r/GUI/Tab.cpp:1584 src/slic3r/GUI/Tab.cpp:4118
msgid "Output options"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1292
+#: src/slic3r/GUI/Tab.cpp:1585
msgid "Sequential printing"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1294
-msgid "Extruder clearance (mm)"
+#: src/slic3r/GUI/Tab.cpp:1587
+msgid "Extruder clearance"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1299 src/slic3r/GUI/Tab.cpp:3725
+#: src/slic3r/GUI/Tab.cpp:1592 src/slic3r/GUI/Tab.cpp:4119
msgid "Output file"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1306 src/libslic3r/PrintConfig.cpp:1453
+#: src/slic3r/GUI/Tab.cpp:1599 src/libslic3r/PrintConfig.cpp:1662
msgid "Post-processing scripts"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1312 src/slic3r/GUI/Tab.cpp:1313
-#: src/slic3r/GUI/Tab.cpp:1596 src/slic3r/GUI/Tab.cpp:1597
-#: src/slic3r/GUI/Tab.cpp:2035 src/slic3r/GUI/Tab.cpp:2036
-#: src/slic3r/GUI/Tab.cpp:2117 src/slic3r/GUI/Tab.cpp:2118
-#: src/slic3r/GUI/Tab.cpp:3598 src/slic3r/GUI/Tab.cpp:3599
+#: src/slic3r/GUI/Tab.cpp:1605 src/slic3r/GUI/Tab.cpp:1606
+#: src/slic3r/GUI/Tab.cpp:1927 src/slic3r/GUI/Tab.cpp:1928
+#: src/slic3r/GUI/Tab.cpp:2266 src/slic3r/GUI/Tab.cpp:2267
+#: src/slic3r/GUI/Tab.cpp:2342 src/slic3r/GUI/Tab.cpp:2343
+#: src/slic3r/GUI/Tab.cpp:3985 src/slic3r/GUI/Tab.cpp:3986
msgid "Notes"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1319 src/slic3r/GUI/Tab.cpp:1604
-#: src/slic3r/GUI/Tab.cpp:2042 src/slic3r/GUI/Tab.cpp:2124
-#: src/slic3r/GUI/Tab.cpp:3606 src/slic3r/GUI/Tab.cpp:3730
+#: src/slic3r/GUI/Tab.cpp:1612 src/slic3r/GUI/Tab.cpp:1935
+#: src/slic3r/GUI/Tab.cpp:2273 src/slic3r/GUI/Tab.cpp:2349
+#: src/slic3r/GUI/Tab.cpp:3993 src/slic3r/GUI/Tab.cpp:4124
msgid "Dependencies"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1320 src/slic3r/GUI/Tab.cpp:1605
-#: src/slic3r/GUI/Tab.cpp:2043 src/slic3r/GUI/Tab.cpp:2125
-#: src/slic3r/GUI/Tab.cpp:3607 src/slic3r/GUI/Tab.cpp:3731
+#: src/slic3r/GUI/Tab.cpp:1613 src/slic3r/GUI/Tab.cpp:1936
+#: src/slic3r/GUI/Tab.cpp:2274 src/slic3r/GUI/Tab.cpp:2350
+#: src/slic3r/GUI/Tab.cpp:3994 src/slic3r/GUI/Tab.cpp:4125
msgid "Profile dependencies"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1379 src/slic3r/GUI/Tab.cpp:1434
+#: src/slic3r/GUI/Tab.cpp:1693
msgid "Filament Overrides"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1380 src/slic3r/GUI/Tab.cpp:1439
-#: src/slic3r/GUI/Tab.cpp:2355
-msgid "Retraction"
+#: src/slic3r/GUI/Tab.cpp:1815
+msgid "Temperature"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1489 src/libslic3r/PrintConfig.cpp:2074
-msgid "Temperature"
+#: src/slic3r/GUI/Tab.cpp:1816
+msgid "Nozzle"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1495
+#: src/slic3r/GUI/Tab.cpp:1821
msgid "Bed"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1500
+#: src/slic3r/GUI/Tab.cpp:1826
msgid "Cooling"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1501 src/libslic3r/PrintConfig.cpp:1355
-#: src/libslic3r/PrintConfig.cpp:2207
+#: src/slic3r/GUI/Tab.cpp:1828 src/libslic3r/PrintConfig.cpp:1565
+#: src/libslic3r/PrintConfig.cpp:2428
msgid "Enable"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1512
+#: src/slic3r/GUI/Tab.cpp:1839
msgid "Fan settings"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1521
+#: src/slic3r/GUI/Tab.cpp:1850
msgid "Cooling thresholds"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1527
+#: src/slic3r/GUI/Tab.cpp:1856
msgid "Filament properties"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1534
+#: src/slic3r/GUI/Tab.cpp:1863
msgid "Print speed override"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1544
+#: src/slic3r/GUI/Tab.cpp:1873
msgid "Wipe tower parameters"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1547
+#: src/slic3r/GUI/Tab.cpp:1876
msgid "Toolchange parameters with single extruder MM printers"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1561
+#: src/slic3r/GUI/Tab.cpp:1889
msgid "Ramming settings"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1583 src/slic3r/GUI/Tab.cpp:1998
+#: src/slic3r/GUI/Tab.cpp:1912 src/slic3r/GUI/Tab.cpp:2205
+#: src/libslic3r/PrintConfig.cpp:2063
msgid "Custom G-code"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1584 src/slic3r/GUI/Tab.cpp:1999
-#: src/libslic3r/PrintConfig.cpp:1820 src/libslic3r/PrintConfig.cpp:1835
+#: src/slic3r/GUI/Tab.cpp:1913 src/slic3r/GUI/Tab.cpp:2206
+#: src/libslic3r/PrintConfig.cpp:2013 src/libslic3r/PrintConfig.cpp:2028
msgid "Start G-code"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1590 src/slic3r/GUI/Tab.cpp:2005
-#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:395
+#: src/slic3r/GUI/Tab.cpp:1920 src/slic3r/GUI/Tab.cpp:2213
+#: src/libslic3r/PrintConfig.cpp:441 src/libslic3r/PrintConfig.cpp:451
msgid "End G-code"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1639
+#: src/slic3r/GUI/Tab.cpp:1970
msgid "Volumetric flow hints not available"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1725 src/slic3r/GUI/Tab.cpp:1938
-msgid "Test"
-msgstr ""
-
-#: src/slic3r/GUI/Tab.cpp:1734
-msgid "Could not get a valid Printer Host reference"
-msgstr ""
-
-#: src/slic3r/GUI/Tab.cpp:1740 src/slic3r/GUI/Tab.cpp:1951
-msgid "Success!"
-msgstr ""
-
-#: src/slic3r/GUI/Tab.cpp:1760
-msgid ""
-"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-"
-"signed certificate."
-msgstr ""
-
-#: src/slic3r/GUI/Tab.cpp:1775
-msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*"
-msgstr ""
-
-#: src/slic3r/GUI/Tab.cpp:1776
-msgid "Open CA certificate file"
-msgstr ""
-
-#: src/slic3r/GUI/Tab.cpp:1803 src/libslic3r/PrintConfig.cpp:111
-msgid "HTTPS CA File"
-msgstr ""
-
-#: src/slic3r/GUI/Tab.cpp:1804
-#, possible-c-format
-msgid ""
-"On this system, %s uses HTTPS certificates from the system Certificate Store "
-"or Keychain."
-msgstr ""
-
-#: src/slic3r/GUI/Tab.cpp:1805
+#: src/slic3r/GUI/Tab.cpp:2066
msgid ""
-"To use a custom CA file, please import your CA file into Certificate Store / "
-"Keychain."
+"Note: All parameters from this group are moved to the Physical Printer "
+"settings (see changelog).\n"
+"\n"
+"A new Physical Printer profile is created by clicking on the \"cog\" icon "
+"right of the Printer profiles combo box, by selecting the \"Add physical "
+"printer\" item in the Printer combo box. The Physical Printer profile editor "
+"opens also when clicking on the \"cog\" icon in the Printer settings tab. "
+"The Physical Printer profiles are being stored into PrusaSlicer/"
+"physical_printer directory."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1848 src/slic3r/GUI/Tab.cpp:2060
+#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2286
msgid "Size and coordinates"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1857
+#: src/slic3r/GUI/Tab.cpp:2108 src/slic3r/GUI/UnsavedChangesDialog.cpp:1080
msgid "Capabilities"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1862
+#: src/slic3r/GUI/Tab.cpp:2113
msgid "Number of extruders of the printer."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1890
+#: src/slic3r/GUI/Tab.cpp:2141
msgid ""
"Single Extruder Multi Material is selected, \n"
"and all extruders must have the same diameter.\n"
@@ -5454,256 +6918,231 @@ msgid ""
"nozzle diameter value?"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1893 src/slic3r/GUI/Tab.cpp:2325
-#: src/libslic3r/PrintConfig.cpp:1326
+#: src/slic3r/GUI/Tab.cpp:2144 src/slic3r/GUI/Tab.cpp:2552
+#: src/libslic3r/PrintConfig.cpp:1534
msgid "Nozzle diameter"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1923
-msgid "USB/Serial connection"
-msgstr ""
-
-#: src/slic3r/GUI/Tab.cpp:1924 src/libslic3r/PrintConfig.cpp:1661
-msgid "Serial port"
-msgstr ""
-
-#: src/slic3r/GUI/Tab.cpp:1929
-msgid "Rescan serial ports"
-msgstr ""
-
-#: src/slic3r/GUI/Tab.cpp:1951
-msgid "Connection to printer works correctly."
+#: src/slic3r/GUI/Tab.cpp:2220 src/libslic3r/PrintConfig.cpp:209
+msgid "Before layer change G-code"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1954
-msgid "Connection failed."
+#: src/slic3r/GUI/Tab.cpp:2227 src/libslic3r/PrintConfig.cpp:1273
+msgid "After layer change G-code"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:2112
-msgid "Print Host upload"
+#: src/slic3r/GUI/Tab.cpp:2234 src/libslic3r/PrintConfig.cpp:2321
+msgid "Tool change G-code"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2011 src/libslic3r/PrintConfig.cpp:153
-msgid "Before layer change G-code"
+#: src/slic3r/GUI/Tab.cpp:2241
+msgid "Between objects G-code (for sequential printing)"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2017 src/libslic3r/PrintConfig.cpp:1080
-msgid "After layer change G-code"
+#: src/slic3r/GUI/Tab.cpp:2248
+msgid "Color Change G-code"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2023 src/libslic3r/PrintConfig.cpp:2100
-msgid "Tool change G-code"
+#: src/slic3r/GUI/Tab.cpp:2254 src/libslic3r/PrintConfig.cpp:2054
+msgid "Pause Print G-code"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2029
-msgid "Between objects G-code (for sequential printing)"
+#: src/slic3r/GUI/Tab.cpp:2260
+msgid "Template Custom G-code"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2067
+#: src/slic3r/GUI/Tab.cpp:2293
msgid "Display"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2082
+#: src/slic3r/GUI/Tab.cpp:2308
msgid "Tilt"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2083
+#: src/slic3r/GUI/Tab.cpp:2309
msgid "Tilt time"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2089 src/slic3r/GUI/Tab.cpp:3582
+#: src/slic3r/GUI/Tab.cpp:2315 src/slic3r/GUI/Tab.cpp:3969
msgid "Corrections"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2106 src/slic3r/GUI/Tab.cpp:3578
+#: src/slic3r/GUI/Tab.cpp:2332 src/slic3r/GUI/Tab.cpp:3965
msgid "Exposure"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2173 src/slic3r/GUI/Tab.cpp:2258
-#: src/libslic3r/PrintConfig.cpp:1129 src/libslic3r/PrintConfig.cpp:1146
-#: src/libslic3r/PrintConfig.cpp:1163 src/libslic3r/PrintConfig.cpp:1179
-#: src/libslic3r/PrintConfig.cpp:1189 src/libslic3r/PrintConfig.cpp:1199
-#: src/libslic3r/PrintConfig.cpp:1209
+#: src/slic3r/GUI/Tab.cpp:2391 src/slic3r/GUI/Tab.cpp:2485
+#: src/libslic3r/PrintConfig.cpp:1302 src/libslic3r/PrintConfig.cpp:1337
+#: src/libslic3r/PrintConfig.cpp:1354 src/libslic3r/PrintConfig.cpp:1371
+#: src/libslic3r/PrintConfig.cpp:1387 src/libslic3r/PrintConfig.cpp:1397
+#: src/libslic3r/PrintConfig.cpp:1407 src/libslic3r/PrintConfig.cpp:1417
msgid "Machine limits"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2187
+#: src/slic3r/GUI/Tab.cpp:2414
msgid "Values in this column are for Normal mode"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2188
-msgid "Normal"
-msgstr ""
-
-#: src/slic3r/GUI/Tab.cpp:2193
+#: src/slic3r/GUI/Tab.cpp:2420
msgid "Values in this column are for Stealth mode"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2194
-msgid "Stealth"
-msgstr ""
-
-#: src/slic3r/GUI/Tab.cpp:2202
+#: src/slic3r/GUI/Tab.cpp:2429
msgid "Maximum feedrates"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2207
+#: src/slic3r/GUI/Tab.cpp:2434
msgid "Maximum accelerations"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2214
+#: src/slic3r/GUI/Tab.cpp:2441
msgid "Jerk limits"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2219
+#: src/slic3r/GUI/Tab.cpp:2446
msgid "Minimum feedrates"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2283 src/slic3r/GUI/Tab.cpp:2291
+#: src/slic3r/GUI/Tab.cpp:2510 src/slic3r/GUI/Tab.cpp:2518
msgid "Single extruder MM setup"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2292
+#: src/slic3r/GUI/Tab.cpp:2519
msgid "Single extruder multimaterial parameters"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2323
+#: src/slic3r/GUI/Tab.cpp:2550
msgid ""
"This is a single extruder multimaterial printer, diameters of all extruders "
"will be set to the new value. Do you want to proceed?"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2347
+#: src/slic3r/GUI/Tab.cpp:2574
msgid "Layer height limits"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2352
+#: src/slic3r/GUI/Tab.cpp:2579
msgid "Position (for multi-extruder printers)"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2358
+#: src/slic3r/GUI/Tab.cpp:2585
msgid "Only lift Z"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2371
+#: src/slic3r/GUI/Tab.cpp:2598
msgid ""
"Retraction when tool is disabled (advanced settings for multi-extruder "
"setups)"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2379
+#: src/slic3r/GUI/Tab.cpp:2605
msgid "Reset to Filament Color"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2560
+#: src/slic3r/GUI/Tab.cpp:2783
msgid ""
"The Wipe option is not available when using the Firmware Retraction mode.\n"
"\n"
"Shall I disable it in order to enable Firmware Retraction?"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2562
+#: src/slic3r/GUI/Tab.cpp:2785
msgid "Firmware Retraction"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2908
-#, possible-c-format
-msgid "Default preset (%s)"
-msgstr ""
-
-#: src/slic3r/GUI/Tab.cpp:2909
-#, possible-c-format
-msgid "Preset (%s)"
-msgstr ""
-
-#: src/slic3r/GUI/Tab.cpp:2926
-msgid "has the following unsaved changes:"
-msgstr ""
-
-#: src/slic3r/GUI/Tab.cpp:2929
-msgid "is not compatible with printer"
-msgstr ""
-
-#: src/slic3r/GUI/Tab.cpp:2930
-msgid "is not compatible with print profile"
+#: src/slic3r/GUI/Tab.cpp:3376
+msgid "Detached"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2932
-msgid "and it has the following unsaved changes:"
+#: src/slic3r/GUI/Tab.cpp:3439
+msgid "remove"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:2936
-msgid "Unsaved Changes"
+#: src/slic3r/GUI/Tab.cpp:3439
+msgid "delete"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3030
-msgid "Detached"
+#: src/slic3r/GUI/Tab.cpp:3448
+msgid "It's a last preset for this physical printer."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3030
-msgctxt "PresetName"
-msgid "Copy"
+#: src/slic3r/GUI/Tab.cpp:3453
+msgid ""
+"Are you sure you want to delete \"%1%\" preset from the physical printer "
+"\"%2%\"?"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3059
-msgid "The supplied name is empty. It can't be saved."
+#: src/slic3r/GUI/Tab.cpp:3465
+msgid ""
+"The physical printer(s) below is based on the preset, you are going to "
+"delete."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3064
-msgid "Cannot overwrite a system profile."
+#: src/slic3r/GUI/Tab.cpp:3469
+msgid ""
+"Note, that selected preset will be deleted from this/those printer(s) too."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3068
-msgid "Cannot overwrite an external profile."
+#: src/slic3r/GUI/Tab.cpp:3473
+msgid ""
+"The physical printer(s) below is based only on the preset, you are going to "
+"delete."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3073
-msgid "Preset with name \"%1%\" already exists."
+#: src/slic3r/GUI/Tab.cpp:3477
+msgid ""
+"Note, that this/those printer(s) will be deleted after deleting of the "
+"selected preset."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3074
-msgid "Replace?"
+#: src/slic3r/GUI/Tab.cpp:3481
+msgid "Are you sure you want to %1% the selected preset?"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3142
-msgid "remove"
+#. TRN Remove/Delete
+#: src/slic3r/GUI/Tab.cpp:3486
+msgid "%1% Preset"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3142
-msgid "delete"
+#: src/slic3r/GUI/Tab.cpp:3567 src/slic3r/GUI/Tab.cpp:3639
+msgid "Set"
msgstr ""
-#. TRN remove/delete
-#: src/slic3r/GUI/Tab.cpp:3144
-msgid "Are you sure you want to %1% the selected preset?"
+#: src/slic3r/GUI/Tab.cpp:3703
+msgid ""
+"Machine limits will be emitted to G-code and used to estimate print time."
msgstr ""
-#. TRN Remove/Delete
-#: src/slic3r/GUI/Tab.cpp:3147
-msgid "%1% Preset"
+#: src/slic3r/GUI/Tab.cpp:3706
+msgid ""
+"Machine limits will NOT be emitted to G-code, however they will be used to "
+"estimate print time, which may therefore not be accurate as the printer may "
+"apply a different set of machine limits."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3206 src/slic3r/GUI/Tab.cpp:3276
-msgid "Set"
+#: src/slic3r/GUI/Tab.cpp:3710
+msgid ""
+"Machine limits are not set, therefore the print time estimate may not be "
+"accurate."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3315
+#: src/slic3r/GUI/Tab.cpp:3732
msgid "LOCKED LOCK"
msgstr ""
#. TRN Description for "LOCKED LOCK"
-#: src/slic3r/GUI/Tab.cpp:3317
+#: src/slic3r/GUI/Tab.cpp:3734
msgid ""
"indicates that the settings are the same as the system (or default) values "
"for the current option group"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3319
+#: src/slic3r/GUI/Tab.cpp:3736
msgid "UNLOCKED LOCK"
msgstr ""
#. TRN Description for "UNLOCKED LOCK"
-#: src/slic3r/GUI/Tab.cpp:3321
+#: src/slic3r/GUI/Tab.cpp:3738
msgid ""
"indicates that some settings were changed and are not equal to the system "
"(or default) values for the current option group.\n"
@@ -5711,23 +7150,23 @@ msgid ""
"to the system (or default) values."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3326
+#: src/slic3r/GUI/Tab.cpp:3743
msgid "WHITE BULLET"
msgstr ""
#. TRN Description for "WHITE BULLET"
-#: src/slic3r/GUI/Tab.cpp:3328
+#: src/slic3r/GUI/Tab.cpp:3745
msgid ""
"for the left button: indicates a non-system (or non-default) preset,\n"
"for the right button: indicates that the settings hasn't been modified."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3331
+#: src/slic3r/GUI/Tab.cpp:3748
msgid "BACK ARROW"
msgstr ""
#. TRN Description for "BACK ARROW"
-#: src/slic3r/GUI/Tab.cpp:3333
+#: src/slic3r/GUI/Tab.cpp:3750
msgid ""
"indicates that the settings were changed and are not equal to the last saved "
"preset for the current option group.\n"
@@ -5735,13 +7174,13 @@ msgid ""
"to the last saved preset."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3343
+#: src/slic3r/GUI/Tab.cpp:3760
msgid ""
"LOCKED LOCK icon indicates that the settings are the same as the system (or "
"default) values for the current option group"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3345
+#: src/slic3r/GUI/Tab.cpp:3762
msgid ""
"UNLOCKED LOCK icon indicates that some settings were changed and are not "
"equal to the system (or default) values for the current option group.\n"
@@ -5749,17 +7188,17 @@ msgid ""
"default) values."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3348
+#: src/slic3r/GUI/Tab.cpp:3765
msgid "WHITE BULLET icon indicates a non system (or non default) preset."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3351
+#: src/slic3r/GUI/Tab.cpp:3768
msgid ""
"WHITE BULLET icon indicates that the settings are the same as in the last "
"saved preset for the current option group."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3353
+#: src/slic3r/GUI/Tab.cpp:3770
msgid ""
"BACK ARROW icon indicates that the settings were changed and are not equal "
"to the last saved preset for the current option group.\n"
@@ -5767,84 +7206,197 @@ msgid ""
"preset."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3359
+#: src/slic3r/GUI/Tab.cpp:3776
msgid ""
"LOCKED LOCK icon indicates that the value is the same as the system (or "
"default) value."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3360
+#: src/slic3r/GUI/Tab.cpp:3777
msgid ""
"UNLOCKED LOCK icon indicates that the value was changed and is not equal to "
"the system (or default) value.\n"
"Click to reset current value to the system (or default) value."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3366
+#: src/slic3r/GUI/Tab.cpp:3783
msgid ""
"WHITE BULLET icon indicates that the value is the same as in the last saved "
"preset."
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3367
+#: src/slic3r/GUI/Tab.cpp:3784
msgid ""
"BACK ARROW icon indicates that the value was changed and is not equal to the "
"last saved preset.\n"
"Click to reset current value to the last saved preset."
msgstr ""
-#. TRN Preset
-#: src/slic3r/GUI/Tab.cpp:3480
-#, possible-c-format
-msgid "Save %s as:"
+#: src/slic3r/GUI/Tab.cpp:3928 src/slic3r/GUI/Tab.cpp:3930
+msgid "Material"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3524
-msgid "the following suffix is not allowed:"
+#: src/slic3r/GUI/Tab.cpp:4052
+msgid "Support head"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3528
-msgid "The supplied name is not available."
+#: src/slic3r/GUI/Tab.cpp:4057
+msgid "Support pillar"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3541 src/slic3r/GUI/Tab.cpp:3543
-msgid "Material"
+#: src/slic3r/GUI/Tab.cpp:4080
+msgid "Connection of the support sticks and junctions"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3665
-msgid "Support head"
+#: src/slic3r/GUI/Tab.cpp:4085
+msgid "Automatic generation"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3670
-msgid "Support pillar"
+#: src/slic3r/GUI/Tab.cpp:4159
+msgid ""
+"\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n"
+"To enable \"%1%\", please switch off \"%2%\""
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3686
-msgid "Connection of the support sticks and junctions"
+#: src/slic3r/GUI/Tab.cpp:4161 src/libslic3r/PrintConfig.cpp:3002
+msgid "Object elevation"
msgstr ""
-#: src/slic3r/GUI/Tab.cpp:3691
-msgid "Automatic generation"
+#: src/slic3r/GUI/Tab.cpp:4161 src/libslic3r/PrintConfig.cpp:3104
+msgid "Pad around object"
msgstr ""
-#: src/slic3r/GUI/Tab.hpp:336 src/slic3r/GUI/Tab.hpp:441
+#: src/slic3r/GUI/Tab.hpp:370 src/slic3r/GUI/Tab.hpp:492
msgid "Print Settings"
msgstr ""
-#: src/slic3r/GUI/Tab.hpp:363
+#: src/slic3r/GUI/Tab.hpp:401
msgid "Filament Settings"
msgstr ""
-#: src/slic3r/GUI/Tab.hpp:399
+#: src/slic3r/GUI/Tab.hpp:442
msgid "Printer Settings"
msgstr ""
-#: src/slic3r/GUI/Tab.hpp:426
+#: src/slic3r/GUI/Tab.hpp:476
msgid "Material Settings"
msgstr ""
-#: src/slic3r/GUI/Tab.hpp:453
-msgid "Save preset"
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:149
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:158
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:857
+msgid "Undef"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:537
+msgid "PrusaSlicer is closing: Unsaved Changes"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:554
+msgid "Switching Presets: Unsaved Changes"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:620
+msgid "Old Value"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:621
+msgid "New Value"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:652
+msgid "Transfer"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:653
+msgid "Discard"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:654
+msgid "Save"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:674
+msgid "PrusaSlicer will remember your action."
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:676
+msgid ""
+"You will not be asked about the unsaved changes the next time you close "
+"PrusaSlicer."
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:677
+msgid ""
+"You will not be asked about the unsaved changes the next time you switch a "
+"preset."
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:678
+msgid ""
+"Visit \"Preferences\" and check \"%1%\"\n"
+"to be asked about unsaved changes again."
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:680
+msgid "PrusaSlicer: Don't ask me again"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:747
+msgid ""
+"Some fields are too long to fit. Right mouse click reveals the full text."
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:749
+msgid "All settings changes will be discarded."
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:752
+msgid "Save the selected options."
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:752
+msgid "Transfer the selected settings to the newly selected preset."
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:756
+msgid "Save the selected options to preset \"%1%\"."
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:757
+msgid "Transfer the selected options to the newly selected preset \"%1%\"."
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1019
+msgid "The following presets were modified:"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1024
+msgid "Preset \"%1%\" has the following unsaved changes:"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1028
+msgid ""
+"Preset \"%1%\" is not compatible with the new printer profile and it has the "
+"following unsaved changes:"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1029
+msgid ""
+"Preset \"%1%\" is not compatible with the new print profile and it has the "
+"following unsaved changes:"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1075
+msgid "Extruders count"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1197
+msgid "Old value"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1198
+msgid "New value"
msgstr ""
#: src/slic3r/GUI/UpdateDialogs.cpp:38
@@ -6081,17 +7633,17 @@ msgstr ""
msgid "Show advanced settings"
msgstr ""
-#: src/slic3r/GUI/wxExtensions.cpp:706
+#: src/slic3r/GUI/wxExtensions.cpp:627
#, possible-c-format
msgid "Switch to the %s mode"
msgstr ""
-#: src/slic3r/GUI/wxExtensions.cpp:707
+#: src/slic3r/GUI/wxExtensions.cpp:628
#, possible-c-format
msgid "Current mode is %s"
msgstr ""
-#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:69
+#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:68
#, possible-c-format
msgid "Mismatched type of print host: %s"
msgstr ""
@@ -6108,25 +7660,25 @@ msgstr ""
msgid "Note: AstroBox version at least 1.1.0 is required."
msgstr ""
-#: src/slic3r/Utils/Duet.cpp:49
+#: src/slic3r/Utils/Duet.cpp:47
msgid "Connection to Duet works correctly."
msgstr ""
-#: src/slic3r/Utils/Duet.cpp:55
+#: src/slic3r/Utils/Duet.cpp:53
msgid "Could not connect to Duet"
msgstr ""
-#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:139
+#: src/slic3r/Utils/Duet.cpp:88 src/slic3r/Utils/Duet.cpp:151
#: src/slic3r/Utils/FlashAir.cpp:122 src/slic3r/Utils/FlashAir.cpp:143
#: src/slic3r/Utils/FlashAir.cpp:159
msgid "Unknown error occured"
msgstr ""
-#: src/slic3r/Utils/Duet.cpp:133
+#: src/slic3r/Utils/Duet.cpp:145
msgid "Wrong password"
msgstr ""
-#: src/slic3r/Utils/Duet.cpp:136
+#: src/slic3r/Utils/Duet.cpp:148
msgid "Could not get resources to create a new connection"
msgstr ""
@@ -6163,7 +7715,7 @@ msgid "Model fixing"
msgstr ""
#: src/slic3r/Utils/FixModelByWin10.cpp:341
-msgid "Exporting model..."
+msgid "Exporting model"
msgstr ""
#: src/slic3r/Utils/FixModelByWin10.cpp:368
@@ -6229,312 +7781,347 @@ msgid ""
"is required."
msgstr ""
-#: src/slic3r/Utils/OctoPrint.cpp:84
+#: src/slic3r/Utils/OctoPrint.cpp:83
msgid "Connection to OctoPrint works correctly."
msgstr ""
-#: src/slic3r/Utils/OctoPrint.cpp:90
+#: src/slic3r/Utils/OctoPrint.cpp:89
msgid "Could not connect to OctoPrint"
msgstr ""
-#: src/slic3r/Utils/OctoPrint.cpp:92
+#: src/slic3r/Utils/OctoPrint.cpp:91
msgid "Note: OctoPrint version at least 1.1.0 is required."
msgstr ""
-#: src/slic3r/Utils/OctoPrint.cpp:179
+#: src/slic3r/Utils/OctoPrint.cpp:185
msgid "Connection to Prusa SL1 works correctly."
msgstr ""
-#: src/slic3r/Utils/OctoPrint.cpp:185
+#: src/slic3r/Utils/OctoPrint.cpp:191
msgid "Could not connect to Prusa SLA"
msgstr ""
-#: src/slic3r/Utils/PresetUpdater.cpp:705
+#: src/slic3r/Utils/PresetUpdater.cpp:727
#, possible-c-format
msgid "requires min. %s and max. %s"
msgstr ""
-#: src/slic3r/Utils/PresetUpdater.cpp:710
+#: src/slic3r/Utils/PresetUpdater.cpp:731
#, possible-c-format
msgid "requires min. %s"
msgstr ""
-#: src/slic3r/Utils/PresetUpdater.cpp:713
+#: src/slic3r/Utils/PresetUpdater.cpp:734
#, possible-c-format
msgid "requires max. %s"
msgstr ""
-#: src/libslic3r/SLA/Pad.cpp:691
-msgid "Pad brim size is too small for the current configuration."
+#: src/slic3r/Utils/Http.cpp:73
+msgid ""
+"Could not detect system SSL certificate store. PrusaSlicer will be unable to "
+"establish secure network connections."
+msgstr ""
+
+#: src/slic3r/Utils/Http.cpp:78
+msgid "PrusaSlicer detected system SSL certificate store in: %1%"
+msgstr ""
+
+#: src/slic3r/Utils/Http.cpp:82
+msgid ""
+"To specify the system certificate store manually, please set the %1% "
+"environment variable to the correct CA bundle and restart the application."
+msgstr ""
+
+#: src/slic3r/Utils/Http.cpp:91
+msgid ""
+"CURL init has failed. PrusaSlicer will be unable to establish network "
+"connections. See logs for additional details."
+msgstr ""
+
+#: src/slic3r/Utils/Process.cpp:151
+msgid "Open G-code file:"
+msgstr ""
+
+#: src/libslic3r/GCode.cpp:518
+msgid "There is an object with no extrusions on the first layer."
+msgstr ""
+
+#: src/libslic3r/GCode.cpp:536
+msgid "Empty layers detected, the output would not be printable."
msgstr ""
-#: src/libslic3r/Zipper.cpp:32
+#: src/libslic3r/GCode.cpp:537
+msgid "Print z"
+msgstr ""
+
+#: src/libslic3r/GCode.cpp:538
+msgid ""
+"This is usually caused by negligibly small extrusions or by a faulty model. "
+"Try to repair the model or change its orientation on the bed."
+msgstr ""
+
+#: src/libslic3r/GCode.cpp:1261
+msgid ""
+"Your print is very close to the priming regions. Make sure there is no "
+"collision."
+msgstr ""
+
+#: src/libslic3r/ExtrusionEntity.cpp:324 src/libslic3r/ExtrusionEntity.cpp:360
+msgid "Mixed"
+msgstr ""
+
+#: src/libslic3r/Flow.cpp:61
+msgid ""
+"Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible."
+msgstr ""
+
+#: src/libslic3r/Format/3mf.cpp:1668
+msgid ""
+"The selected 3mf file has been saved with a newer version of %1% and is not "
+"compatible."
+msgstr ""
+
+#: src/libslic3r/Format/AMF.cpp:958
+msgid ""
+"The selected amf file has been saved with a newer version of %1% and is not "
+"compatible."
+msgstr ""
+
+#: src/libslic3r/miniz_extension.cpp:91
msgid "undefined error"
msgstr ""
-#: src/libslic3r/Zipper.cpp:34
+#: src/libslic3r/miniz_extension.cpp:93
msgid "too many files"
msgstr ""
-#: src/libslic3r/Zipper.cpp:36
+#: src/libslic3r/miniz_extension.cpp:95
msgid "file too large"
msgstr ""
-#: src/libslic3r/Zipper.cpp:38
+#: src/libslic3r/miniz_extension.cpp:97
msgid "unsupported method"
msgstr ""
-#: src/libslic3r/Zipper.cpp:40
+#: src/libslic3r/miniz_extension.cpp:99
msgid "unsupported encryption"
msgstr ""
-#: src/libslic3r/Zipper.cpp:42
+#: src/libslic3r/miniz_extension.cpp:101
msgid "unsupported feature"
msgstr ""
-#: src/libslic3r/Zipper.cpp:44
+#: src/libslic3r/miniz_extension.cpp:103
msgid "failed finding central directory"
msgstr ""
-#: src/libslic3r/Zipper.cpp:46
+#: src/libslic3r/miniz_extension.cpp:105
msgid "not a ZIP archive"
msgstr ""
-#: src/libslic3r/Zipper.cpp:48
+#: src/libslic3r/miniz_extension.cpp:107
msgid "invalid header or archive is corrupted"
msgstr ""
-#: src/libslic3r/Zipper.cpp:50
+#: src/libslic3r/miniz_extension.cpp:109
msgid "unsupported multidisk archive"
msgstr ""
-#: src/libslic3r/Zipper.cpp:52
+#: src/libslic3r/miniz_extension.cpp:111
msgid "decompression failed or archive is corrupted"
msgstr ""
-#: src/libslic3r/Zipper.cpp:54
+#: src/libslic3r/miniz_extension.cpp:113
msgid "compression failed"
msgstr ""
-#: src/libslic3r/Zipper.cpp:56
+#: src/libslic3r/miniz_extension.cpp:115
msgid "unexpected decompressed size"
msgstr ""
-#: src/libslic3r/Zipper.cpp:58
+#: src/libslic3r/miniz_extension.cpp:117
msgid "CRC-32 check failed"
msgstr ""
-#: src/libslic3r/Zipper.cpp:60
+#: src/libslic3r/miniz_extension.cpp:119
msgid "unsupported central directory size"
msgstr ""
-#: src/libslic3r/Zipper.cpp:62
+#: src/libslic3r/miniz_extension.cpp:121
msgid "allocation failed"
msgstr ""
-#: src/libslic3r/Zipper.cpp:64
+#: src/libslic3r/miniz_extension.cpp:123
msgid "file open failed"
msgstr ""
-#: src/libslic3r/Zipper.cpp:66
+#: src/libslic3r/miniz_extension.cpp:125
msgid "file create failed"
msgstr ""
-#: src/libslic3r/Zipper.cpp:68
+#: src/libslic3r/miniz_extension.cpp:127
msgid "file write failed"
msgstr ""
-#: src/libslic3r/Zipper.cpp:70
+#: src/libslic3r/miniz_extension.cpp:129
msgid "file read failed"
msgstr ""
-#: src/libslic3r/Zipper.cpp:72
+#: src/libslic3r/miniz_extension.cpp:131
msgid "file close failed"
msgstr ""
-#: src/libslic3r/Zipper.cpp:74
+#: src/libslic3r/miniz_extension.cpp:133
msgid "file seek failed"
msgstr ""
-#: src/libslic3r/Zipper.cpp:76
+#: src/libslic3r/miniz_extension.cpp:135
msgid "file stat failed"
msgstr ""
-#: src/libslic3r/Zipper.cpp:78
+#: src/libslic3r/miniz_extension.cpp:137
msgid "invalid parameter"
msgstr ""
-#: src/libslic3r/Zipper.cpp:80
+#: src/libslic3r/miniz_extension.cpp:139
msgid "invalid filename"
msgstr ""
-#: src/libslic3r/Zipper.cpp:82
+#: src/libslic3r/miniz_extension.cpp:141
msgid "buffer too small"
msgstr ""
-#: src/libslic3r/Zipper.cpp:84
+#: src/libslic3r/miniz_extension.cpp:143
msgid "internal error"
msgstr ""
-#: src/libslic3r/Zipper.cpp:86
+#: src/libslic3r/miniz_extension.cpp:145
msgid "file not found"
msgstr ""
-#: src/libslic3r/Zipper.cpp:88
+#: src/libslic3r/miniz_extension.cpp:147
msgid "archive is too large"
msgstr ""
-#: src/libslic3r/Zipper.cpp:90
+#: src/libslic3r/miniz_extension.cpp:149
msgid "validation failed"
msgstr ""
-#: src/libslic3r/Zipper.cpp:92
+#: src/libslic3r/miniz_extension.cpp:151
msgid "write calledback failed"
msgstr ""
-#: src/libslic3r/Zipper.cpp:102
-msgid "Error with zip archive"
-msgstr ""
-
-#: src/libslic3r/GCode.cpp:640
-msgid "Empty layers detected, the output would not be printable."
-msgstr ""
-
-#: src/libslic3r/GCode.cpp:641
-msgid "Print z"
-msgstr ""
-
-#: src/libslic3r/GCode.cpp:642
-msgid ""
-"This is usually caused by negligibly small extrusions or by a faulty model. "
-"Try to repair the model or change its orientation on the bed."
-msgstr ""
-
-#: src/libslic3r/ExtrusionEntity.cpp:323
-msgid "Mixed"
-msgstr ""
-
-#: src/libslic3r/Flow.cpp:61
-msgid ""
-"Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible."
-msgstr ""
-
-#: src/libslic3r/Format/3mf.cpp:1630
-msgid ""
-"The selected 3mf file has been saved with a newer version of %1% and is not "
-"compatible."
-msgstr ""
-
-#: src/libslic3r/Format/AMF.cpp:934
-msgid ""
-"The selected amf file has been saved with a newer version of %1% and is not "
-"compatible."
+#: src/libslic3r/Preset.cpp:1299
+msgid "filament"
msgstr ""
-#: src/libslic3r/Print.cpp:1218
+#: src/libslic3r/Print.cpp:1251
msgid "All objects are outside of the print volume."
msgstr ""
-#: src/libslic3r/Print.cpp:1221
+#: src/libslic3r/Print.cpp:1254
msgid "The supplied settings will cause an empty print."
msgstr ""
-#: src/libslic3r/Print.cpp:1225
+#: src/libslic3r/Print.cpp:1258
msgid "Some objects are too close; your extruder will collide with them."
msgstr ""
-#: src/libslic3r/Print.cpp:1227
+#: src/libslic3r/Print.cpp:1260
msgid ""
"Some objects are too tall and cannot be printed without extruder collisions."
msgstr ""
-#: src/libslic3r/Print.cpp:1236
-msgid "The Spiral Vase option can only be used when printing a single object."
+#: src/libslic3r/Print.cpp:1269
+msgid ""
+"Only a single object may be printed at a time in Spiral Vase mode. Either "
+"remove all but the last object, or enable sequential mode by "
+"\"complete_objects\"."
msgstr ""
-#: src/libslic3r/Print.cpp:1243
+#: src/libslic3r/Print.cpp:1277
msgid ""
"The Spiral Vase option can only be used when printing single material "
"objects."
msgstr ""
-#: src/libslic3r/Print.cpp:1256
+#: src/libslic3r/Print.cpp:1290
msgid ""
"The wipe tower is only supported if all extruders have the same nozzle "
"diameter and use filaments of the same diameter."
msgstr ""
-#: src/libslic3r/Print.cpp:1261
+#: src/libslic3r/Print.cpp:1296
msgid ""
-"The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter "
-"and Repetier G-code flavors."
+"The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, "
+"RepRapFirmware and Repetier G-code flavors."
msgstr ""
-#: src/libslic3r/Print.cpp:1263
+#: src/libslic3r/Print.cpp:1298
msgid ""
"The Wipe Tower is currently only supported with the relative extruder "
"addressing (use_relative_e_distances=1)."
msgstr ""
-#: src/libslic3r/Print.cpp:1265
+#: src/libslic3r/Print.cpp:1300
msgid "Ooze prevention is currently not supported with the wipe tower enabled."
msgstr ""
-#: src/libslic3r/Print.cpp:1267
+#: src/libslic3r/Print.cpp:1302
msgid ""
"The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)."
msgstr ""
-#: src/libslic3r/Print.cpp:1269
+#: src/libslic3r/Print.cpp:1304
msgid ""
"The Wipe Tower is currently not supported for multimaterial sequential "
"prints."
msgstr ""
-#: src/libslic3r/Print.cpp:1290
+#: src/libslic3r/Print.cpp:1325
msgid ""
"The Wipe Tower is only supported for multiple objects if they have equal "
"layer heights"
msgstr ""
-#: src/libslic3r/Print.cpp:1292
+#: src/libslic3r/Print.cpp:1327
msgid ""
"The Wipe Tower is only supported for multiple objects if they are printed "
"over an equal number of raft layers"
msgstr ""
-#: src/libslic3r/Print.cpp:1294
+#: src/libslic3r/Print.cpp:1329
msgid ""
"The Wipe Tower is only supported for multiple objects if they are printed "
"with the same support_material_contact_distance"
msgstr ""
-#: src/libslic3r/Print.cpp:1296
+#: src/libslic3r/Print.cpp:1331
msgid ""
"The Wipe Tower is only supported for multiple objects if they are sliced "
"equally."
msgstr ""
-#: src/libslic3r/Print.cpp:1338
+#: src/libslic3r/Print.cpp:1373
msgid ""
"The Wipe tower is only supported if all objects have the same variable layer "
"height"
msgstr ""
-#: src/libslic3r/Print.cpp:1364
+#: src/libslic3r/Print.cpp:1399
msgid ""
"One or more object were assigned an extruder that the printer does not have."
msgstr ""
-#: src/libslic3r/Print.cpp:1373
+#: src/libslic3r/Print.cpp:1408
msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm"
msgstr ""
-#: src/libslic3r/Print.cpp:1376
+#: src/libslic3r/Print.cpp:1411
msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm"
msgstr ""
-#: src/libslic3r/Print.cpp:1387
+#: src/libslic3r/Print.cpp:1422
msgid ""
"Printing with multiple extruders of differing nozzle diameters. If support "
"is to be printed with the current extruder (support_material_extruder == 0 "
@@ -6542,13 +8129,13 @@ msgid ""
"same diameter."
msgstr ""
-#: src/libslic3r/Print.cpp:1395
+#: src/libslic3r/Print.cpp:1430
msgid ""
"For the Wipe Tower to work with the soluble supports, the support layers "
"need to be synchronized with the object layers."
msgstr ""
-#: src/libslic3r/Print.cpp:1399
+#: src/libslic3r/Print.cpp:1434
msgid ""
"The Wipe Tower currently supports the non-soluble supports only if they are "
"printed with the current extruder without triggering a tool change. (both "
@@ -6556,132 +8143,136 @@ msgid ""
"set to 0)."
msgstr ""
-#: src/libslic3r/Print.cpp:1421
+#: src/libslic3r/Print.cpp:1456
msgid "First layer height can't be greater than nozzle diameter"
msgstr ""
-#: src/libslic3r/Print.cpp:1426
+#: src/libslic3r/Print.cpp:1461
msgid "Layer height can't be greater than nozzle diameter"
msgstr ""
-#: src/libslic3r/Print.cpp:1583
+#: src/libslic3r/Print.cpp:1620
msgid "Infilling layers"
msgstr ""
-#: src/libslic3r/Print.cpp:1605
+#: src/libslic3r/Print.cpp:1646
msgid "Generating skirt"
msgstr ""
-#: src/libslic3r/Print.cpp:1613
+#: src/libslic3r/Print.cpp:1655
msgid "Generating brim"
msgstr ""
-#: src/libslic3r/Print.cpp:1637
+#: src/libslic3r/Print.cpp:1678
msgid "Exporting G-code"
msgstr ""
-#: src/libslic3r/Print.cpp:1641
+#: src/libslic3r/Print.cpp:1682
msgid "Generating G-code"
msgstr ""
-#: src/libslic3r/SLAPrint.cpp:615
+#: src/libslic3r/SLA/Pad.cpp:532
+msgid "Pad brim size is too small for the current configuration."
+msgstr ""
+
+#: src/libslic3r/SLAPrint.cpp:630
msgid ""
"Cannot proceed without support points! Add support points or disable support "
"generation."
msgstr ""
-#: src/libslic3r/SLAPrint.cpp:627
+#: src/libslic3r/SLAPrint.cpp:642
msgid ""
"Elevation is too low for object. Use the \"Pad around object\" feature to "
"print the object without elevation."
msgstr ""
-#: src/libslic3r/SLAPrint.cpp:633
+#: src/libslic3r/SLAPrint.cpp:648
msgid ""
"The endings of the support pillars will be deployed on the gap between the "
"object and the pad. 'Support base safety distance' has to be greater than "
"the 'Pad object gap' parameter to avoid this."
msgstr ""
-#: src/libslic3r/SLAPrint.cpp:648
+#: src/libslic3r/SLAPrint.cpp:663
msgid "Exposition time is out of printer profile bounds."
msgstr ""
-#: src/libslic3r/SLAPrint.cpp:655
+#: src/libslic3r/SLAPrint.cpp:670
msgid "Initial exposition time is out of printer profile bounds."
msgstr ""
-#: src/libslic3r/SLAPrint.cpp:762
+#: src/libslic3r/SLAPrint.cpp:786
msgid "Slicing done"
msgstr ""
-#: src/libslic3r/SLAPrintSteps.cpp:43
+#: src/libslic3r/SLAPrintSteps.cpp:44
msgid "Hollowing model"
msgstr ""
-#: src/libslic3r/SLAPrintSteps.cpp:44
+#: src/libslic3r/SLAPrintSteps.cpp:45
msgid "Drilling holes into model."
msgstr ""
-#: src/libslic3r/SLAPrintSteps.cpp:45
+#: src/libslic3r/SLAPrintSteps.cpp:46
msgid "Slicing model"
msgstr ""
-#: src/libslic3r/SLAPrintSteps.cpp:46 src/libslic3r/SLAPrintSteps.cpp:356
+#: src/libslic3r/SLAPrintSteps.cpp:47 src/libslic3r/SLAPrintSteps.cpp:359
msgid "Generating support points"
msgstr ""
-#: src/libslic3r/SLAPrintSteps.cpp:47
+#: src/libslic3r/SLAPrintSteps.cpp:48
msgid "Generating support tree"
msgstr ""
-#: src/libslic3r/SLAPrintSteps.cpp:48
+#: src/libslic3r/SLAPrintSteps.cpp:49
msgid "Generating pad"
msgstr ""
-#: src/libslic3r/SLAPrintSteps.cpp:49
+#: src/libslic3r/SLAPrintSteps.cpp:50
msgid "Slicing supports"
msgstr ""
-#: src/libslic3r/SLAPrintSteps.cpp:64
+#: src/libslic3r/SLAPrintSteps.cpp:65
msgid "Merging slices and calculating statistics"
msgstr ""
-#: src/libslic3r/SLAPrintSteps.cpp:65
+#: src/libslic3r/SLAPrintSteps.cpp:66
msgid "Rasterizing layers"
msgstr ""
-#: src/libslic3r/SLAPrintSteps.cpp:190
-msgid "Too much overlapping holes."
+#: src/libslic3r/SLAPrintSteps.cpp:192
+msgid "Too many overlapping holes."
msgstr ""
-#: src/libslic3r/SLAPrintSteps.cpp:199
+#: src/libslic3r/SLAPrintSteps.cpp:201
msgid ""
"Drilling holes into the mesh failed. This is usually caused by broken model. "
"Try to fix it first."
msgstr ""
-#: src/libslic3r/SLAPrintSteps.cpp:245
+#: src/libslic3r/SLAPrintSteps.cpp:247
msgid ""
"Slicing had to be stopped due to an internal error: Inconsistent slice index."
msgstr ""
-#: src/libslic3r/SLAPrintSteps.cpp:413 src/libslic3r/SLAPrintSteps.cpp:422
-#: src/libslic3r/SLAPrintSteps.cpp:461
+#: src/libslic3r/SLAPrintSteps.cpp:411 src/libslic3r/SLAPrintSteps.cpp:420
+#: src/libslic3r/SLAPrintSteps.cpp:459
msgid "Visualizing supports"
msgstr ""
-#: src/libslic3r/SLAPrintSteps.cpp:453
+#: src/libslic3r/SLAPrintSteps.cpp:451
msgid "No pad can be generated for this model with the current configuration"
msgstr ""
-#: src/libslic3r/SLAPrintSteps.cpp:621
+#: src/libslic3r/SLAPrintSteps.cpp:619
msgid ""
"There are unprintable objects. Try to adjust support settings to make the "
"objects printable."
msgstr ""
-#: src/libslic3r/PrintBase.cpp:71
+#: src/libslic3r/PrintBase.cpp:72
msgid "Failed processing of the output_filename_format template."
msgstr ""
@@ -6702,110 +8293,163 @@ msgid "Bed custom model"
msgstr ""
#: src/libslic3r/PrintConfig.cpp:66
-msgid "Picture sizes to be stored into a .gcode and .sl1 files"
+msgid "G-code thumbnails"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:73
+#: src/libslic3r/PrintConfig.cpp:67
+msgid ""
+"Picture sizes to be stored into a .gcode and .sl1 files, in the following "
+"format: \"XxY, XxY, ...\""
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:75
msgid ""
"This setting controls the height (and thus the total number) of the slices/"
"layers. Thinner layers give better accuracy but take more time to print."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:80
+#: src/libslic3r/PrintConfig.cpp:82
msgid "Max print height"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:81
+#: src/libslic3r/PrintConfig.cpp:83
msgid ""
"Set this to the maximum height that can be reached by your extruder while "
"printing."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:87
+#: src/libslic3r/PrintConfig.cpp:91
msgid "Slice gap closing radius"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:89
+#: src/libslic3r/PrintConfig.cpp:93
msgid ""
"Cracks smaller than 2x gap closing radius are being filled during the "
"triangle mesh slicing. The gap closing operation may reduce the final print "
"resolution, therefore it is advisable to keep the value reasonably low."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:97
+#: src/libslic3r/PrintConfig.cpp:101
msgid "Hostname, IP or URL"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:98
+#: src/libslic3r/PrintConfig.cpp:102
msgid ""
"Slic3r can upload G-code files to a printer host. This field should contain "
-"the hostname, IP address or URL of the printer host instance."
+"the hostname, IP address or URL of the printer host instance. Print host "
+"behind HAProxy with basic auth enabled can be accessed by putting the user "
+"name and password into the URL in the following format: https://username:"
+"password@your-octopi-address/"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:104
+#: src/libslic3r/PrintConfig.cpp:110
msgid "API Key / Password"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:105
+#: src/libslic3r/PrintConfig.cpp:111
msgid ""
"Slic3r can upload G-code files to a printer host. This field should contain "
"the API Key or the password required for authentication."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:112
+#: src/libslic3r/PrintConfig.cpp:118
+msgid "Name of the printer"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:125
msgid ""
"Custom CA certificate file can be specified for HTTPS OctoPrint connections, "
"in crt/pem format. If left blank, the default OS CA certificate repository "
"is used."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:118
+#: src/libslic3r/PrintConfig.cpp:131
msgid "Elephant foot compensation"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:120
+#: src/libslic3r/PrintConfig.cpp:133
msgid ""
"The first layer will be shrunk in the XY plane by the configured value to "
"compensate for the 1st layer squish aka an Elephant Foot effect."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:136
+#: src/libslic3r/PrintConfig.cpp:149
+msgid "Password"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:155
+msgid "Printer preset name"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:156
+msgid "Related printer preset name"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:161
+msgid "Authorization Type"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:166
+msgid "API key"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:167
+msgid "HTTP digest"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:180
msgid "Avoid crossing perimeters"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:137
+#: src/libslic3r/PrintConfig.cpp:181
msgid ""
"Optimize travel moves in order to minimize the crossing of perimeters. This "
"is mostly useful with Bowden extruders which suffer from oozing. This "
"feature slows down both the print and the G-code generation."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:144 src/libslic3r/PrintConfig.cpp:2071
+#: src/libslic3r/PrintConfig.cpp:188
+msgid "Avoid crossing perimeters - Max detour length"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:190
+msgid ""
+"The maximum detour length for avoid crossing perimeters. If the detour is "
+"longer than this value, avoid crossing perimeters is not applied for this "
+"travel path. Detour length could be specified either as an absolute value or "
+"as percentage (for example 50%) of a direct travel path."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:193
+msgid "mm or % (zero to disable)"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:199 src/libslic3r/PrintConfig.cpp:2291
msgid "Other layers"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:145
+#: src/libslic3r/PrintConfig.cpp:200
msgid ""
"Bed temperature for layers after the first one. Set this to zero to disable "
"bed temperature control commands in the output."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:147
+#: src/libslic3r/PrintConfig.cpp:203
msgid "Bed temperature"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:154
+#: src/libslic3r/PrintConfig.cpp:210
msgid ""
"This custom code is inserted at every layer change, right before the Z move. "
"Note that you can use placeholder variables for all Slic3r settings as well "
"as [layer_num] and [layer_z]."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:164
+#: src/libslic3r/PrintConfig.cpp:220
msgid "Between objects G-code"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:165
+#: src/libslic3r/PrintConfig.cpp:221
msgid ""
"This code is inserted between objects when using sequential printing. By "
"default extruder and bed temperature are reset using non-wait command; "
@@ -6815,80 +8459,81 @@ msgid ""
"S[first_layer_temperature]\" command wherever you want."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:176
+#: src/libslic3r/PrintConfig.cpp:232
msgid "Number of solid layers to generate on bottom surfaces."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:177
+#: src/libslic3r/PrintConfig.cpp:233
msgid "Bottom solid layers"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:185
+#: src/libslic3r/PrintConfig.cpp:241
msgid ""
"The number of bottom solid layers is increased above bottom_solid_layers if "
"necessary to satisfy minimum thickness of bottom shell."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:187
+#: src/libslic3r/PrintConfig.cpp:243
msgid "Minimum bottom shell thickness"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:193
+#: src/libslic3r/PrintConfig.cpp:249
msgid "Bridge"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:194
+#: src/libslic3r/PrintConfig.cpp:250
msgid ""
"This is the acceleration your printer will use for bridges. Set zero to "
"disable acceleration control for bridges."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:196 src/libslic3r/PrintConfig.cpp:339
-#: src/libslic3r/PrintConfig.cpp:862 src/libslic3r/PrintConfig.cpp:984
-#: src/libslic3r/PrintConfig.cpp:1152 src/libslic3r/PrintConfig.cpp:1201
-#: src/libslic3r/PrintConfig.cpp:1211 src/libslic3r/PrintConfig.cpp:1403
+#: src/libslic3r/PrintConfig.cpp:252 src/libslic3r/PrintConfig.cpp:395
+#: src/libslic3r/PrintConfig.cpp:940 src/libslic3r/PrintConfig.cpp:1079
+#: src/libslic3r/PrintConfig.cpp:1360 src/libslic3r/PrintConfig.cpp:1409
+#: src/libslic3r/PrintConfig.cpp:1419 src/libslic3r/PrintConfig.cpp:1612
msgid "mm/s²"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:202
+#: src/libslic3r/PrintConfig.cpp:258
msgid "Bridging angle"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:204
+#: src/libslic3r/PrintConfig.cpp:260
msgid ""
"Bridging angle override. If left to zero, the bridging angle will be "
"calculated automatically. Otherwise the provided angle will be used for all "
"bridges. Use 180° for zero angle."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:207 src/libslic3r/PrintConfig.cpp:780
-#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1650
-#: src/libslic3r/PrintConfig.cpp:1901 src/libslic3r/PrintConfig.cpp:2056
-#: src/libslic3r/PrintConfig.cpp:2254 src/libslic3r/PrintConfig.cpp:2744
-#: src/libslic3r/PrintConfig.cpp:2865
+#: src/libslic3r/PrintConfig.cpp:263 src/libslic3r/PrintConfig.cpp:852
+#: src/libslic3r/PrintConfig.cpp:1853 src/libslic3r/PrintConfig.cpp:1863
+#: src/libslic3r/PrintConfig.cpp:2121 src/libslic3r/PrintConfig.cpp:2276
+#: src/libslic3r/PrintConfig.cpp:2475 src/libslic3r/PrintConfig.cpp:2976
+#: src/libslic3r/PrintConfig.cpp:3097
msgid "°"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:213
+#: src/libslic3r/PrintConfig.cpp:269
msgid "Bridges fan speed"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:214
+#: src/libslic3r/PrintConfig.cpp:270
msgid "This fan speed is enforced during all bridges and overhangs."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:215 src/libslic3r/PrintConfig.cpp:792
-#: src/libslic3r/PrintConfig.cpp:1219 src/libslic3r/PrintConfig.cpp:1282
-#: src/libslic3r/PrintConfig.cpp:1532 src/libslic3r/PrintConfig.cpp:2432
-#: src/libslic3r/PrintConfig.cpp:2784
+#: src/libslic3r/PrintConfig.cpp:271 src/libslic3r/PrintConfig.cpp:864
+#: src/libslic3r/PrintConfig.cpp:1248 src/libslic3r/PrintConfig.cpp:1427
+#: src/libslic3r/PrintConfig.cpp:1490 src/libslic3r/PrintConfig.cpp:1745
+#: src/libslic3r/PrintConfig.cpp:2653 src/libslic3r/PrintConfig.cpp:2890
+#: src/libslic3r/PrintConfig.cpp:3016
msgid "%"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:222
+#: src/libslic3r/PrintConfig.cpp:278
msgid "Bridge flow ratio"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:224
+#: src/libslic3r/PrintConfig.cpp:280
msgid ""
"This factor affects the amount of plastic for bridging. You can decrease it "
"slightly to pull the extrudates and prevent sagging, although default "
@@ -6896,83 +8541,84 @@ msgid ""
"before tweaking this."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:234
+#: src/libslic3r/PrintConfig.cpp:290
msgid "Bridges"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:236
+#: src/libslic3r/PrintConfig.cpp:292
msgid "Speed for printing bridges."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:237 src/libslic3r/PrintConfig.cpp:609
-#: src/libslic3r/PrintConfig.cpp:617 src/libslic3r/PrintConfig.cpp:626
-#: src/libslic3r/PrintConfig.cpp:634 src/libslic3r/PrintConfig.cpp:661
-#: src/libslic3r/PrintConfig.cpp:680 src/libslic3r/PrintConfig.cpp:922
-#: src/libslic3r/PrintConfig.cpp:1050 src/libslic3r/PrintConfig.cpp:1135
-#: src/libslic3r/PrintConfig.cpp:1169 src/libslic3r/PrintConfig.cpp:1181
-#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:1241
-#: src/libslic3r/PrintConfig.cpp:1300 src/libslic3r/PrintConfig.cpp:1433
-#: src/libslic3r/PrintConfig.cpp:1607 src/libslic3r/PrintConfig.cpp:1616
-#: src/libslic3r/PrintConfig.cpp:2035 src/libslic3r/PrintConfig.cpp:2161
+#: src/libslic3r/PrintConfig.cpp:293 src/libslic3r/PrintConfig.cpp:671
+#: src/libslic3r/PrintConfig.cpp:679 src/libslic3r/PrintConfig.cpp:688
+#: src/libslic3r/PrintConfig.cpp:696 src/libslic3r/PrintConfig.cpp:723
+#: src/libslic3r/PrintConfig.cpp:742 src/libslic3r/PrintConfig.cpp:1015
+#: src/libslic3r/PrintConfig.cpp:1194 src/libslic3r/PrintConfig.cpp:1267
+#: src/libslic3r/PrintConfig.cpp:1343 src/libslic3r/PrintConfig.cpp:1377
+#: src/libslic3r/PrintConfig.cpp:1389 src/libslic3r/PrintConfig.cpp:1399
+#: src/libslic3r/PrintConfig.cpp:1449 src/libslic3r/PrintConfig.cpp:1508
+#: src/libslic3r/PrintConfig.cpp:1642 src/libslic3r/PrintConfig.cpp:1820
+#: src/libslic3r/PrintConfig.cpp:1829 src/libslic3r/PrintConfig.cpp:2255
+#: src/libslic3r/PrintConfig.cpp:2382
msgid "mm/s"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:244
+#: src/libslic3r/PrintConfig.cpp:300
msgid "Brim width"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:245
+#: src/libslic3r/PrintConfig.cpp:301
msgid ""
"Horizontal width of the brim that will be printed around each object on the "
"first layer."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:252
+#: src/libslic3r/PrintConfig.cpp:308
msgid "Clip multi-part objects"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:253
+#: src/libslic3r/PrintConfig.cpp:309
msgid ""
"When printing multi-material objects, this settings will make Slic3r to clip "
"the overlapping object parts one by the other (2nd part will be clipped by "
"the 1st, 3rd part will be clipped by the 1st and 2nd etc)."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:260
+#: src/libslic3r/PrintConfig.cpp:316
msgid "Colorprint height"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:261
+#: src/libslic3r/PrintConfig.cpp:317
msgid "Heights at which a filament change is to occur."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:271
+#: src/libslic3r/PrintConfig.cpp:327
msgid "Compatible printers condition"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:272
+#: src/libslic3r/PrintConfig.cpp:328
msgid ""
"A boolean expression using the configuration values of an active printer "
"profile. If this expression evaluates to true, this profile is considered "
"compatible with the active printer profile."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:286
+#: src/libslic3r/PrintConfig.cpp:342
msgid "Compatible print profiles condition"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:287
+#: src/libslic3r/PrintConfig.cpp:343
msgid ""
"A boolean expression using the configuration values of an active print "
"profile. If this expression evaluates to true, this profile is considered "
"compatible with the active print profile."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:304
+#: src/libslic3r/PrintConfig.cpp:360
msgid "Complete individual objects"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:305
+#: src/libslic3r/PrintConfig.cpp:361
msgid ""
"When printing multiple objects or copies, this feature will complete each "
"object before moving onto next one (and starting it from its bottom layer). "
@@ -6980,97 +8626,97 @@ msgid ""
"warn and prevent you from extruder collisions, but beware."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:313
+#: src/libslic3r/PrintConfig.cpp:369
msgid "Enable auto cooling"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:314
+#: src/libslic3r/PrintConfig.cpp:370
msgid ""
"This flag enables the automatic cooling logic that adjusts print speed and "
"fan speed according to layer printing time."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:319
+#: src/libslic3r/PrintConfig.cpp:375
msgid "Cooling tube position"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:320
+#: src/libslic3r/PrintConfig.cpp:376
msgid "Distance of the center-point of the cooling tube from the extruder tip."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:327
+#: src/libslic3r/PrintConfig.cpp:383
msgid "Cooling tube length"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:328
+#: src/libslic3r/PrintConfig.cpp:384
msgid "Length of the cooling tube to limit space for cooling moves inside it."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:336
+#: src/libslic3r/PrintConfig.cpp:392
msgid ""
"This is the acceleration your printer will be reset to after the role-"
"specific acceleration values are used (perimeter/infill). Set zero to "
"prevent resetting acceleration at all."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:345
+#: src/libslic3r/PrintConfig.cpp:401
msgid "Default filament profile"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:346
+#: src/libslic3r/PrintConfig.cpp:402
msgid ""
"Default filament profile associated with the current printer profile. On "
"selection of the current printer profile, this filament profile will be "
"activated."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:352
+#: src/libslic3r/PrintConfig.cpp:408
msgid "Default print profile"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:353 src/libslic3r/PrintConfig.cpp:2599
-#: src/libslic3r/PrintConfig.cpp:2610
+#: src/libslic3r/PrintConfig.cpp:409 src/libslic3r/PrintConfig.cpp:2820
+#: src/libslic3r/PrintConfig.cpp:2831
msgid ""
"Default print profile associated with the current printer profile. On "
"selection of the current printer profile, this print profile will be "
"activated."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:359
+#: src/libslic3r/PrintConfig.cpp:415
msgid "Disable fan for the first"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:360
+#: src/libslic3r/PrintConfig.cpp:416
msgid ""
"You can set this to a positive value to disable fan at all during the first "
"layers, so that it does not make adhesion worse."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:369
+#: src/libslic3r/PrintConfig.cpp:425
msgid "Don't support bridges"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:371
+#: src/libslic3r/PrintConfig.cpp:427
msgid ""
"Experimental option for preventing support material from being generated "
"under bridged areas."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:377
+#: src/libslic3r/PrintConfig.cpp:433
msgid "Distance between copies"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:378
+#: src/libslic3r/PrintConfig.cpp:434
msgid "Distance used for the auto-arrange feature of the plater."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:386
+#: src/libslic3r/PrintConfig.cpp:442
msgid ""
"This end procedure is inserted at the end of the output file. Note that you "
"can use placeholder variables for all PrusaSlicer settings."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:396
+#: src/libslic3r/PrintConfig.cpp:452
msgid ""
"This end procedure is inserted at the end of the output file, before the "
"printer end gcode (and before any toolchange from this filament in case of "
@@ -7079,62 +8725,70 @@ msgid ""
"in extruder order."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:407
+#: src/libslic3r/PrintConfig.cpp:463
msgid "Ensure vertical shell thickness"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:409
+#: src/libslic3r/PrintConfig.cpp:465
msgid ""
"Add solid infill near sloping surfaces to guarantee the vertical shell "
"thickness (top+bottom solid layers)."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:415
+#: src/libslic3r/PrintConfig.cpp:471
msgid "Top fill pattern"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:417
+#: src/libslic3r/PrintConfig.cpp:473
msgid ""
"Fill pattern for top infill. This only affects the top visible layer, and "
"not its adjacent solid shells."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:843
-#: src/libslic3r/PrintConfig.cpp:2016
+#: src/libslic3r/PrintConfig.cpp:483 src/libslic3r/PrintConfig.cpp:918
+#: src/libslic3r/PrintConfig.cpp:2236
msgid "Rectilinear"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:849
+#: src/libslic3r/PrintConfig.cpp:484
+msgid "Monotonic"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:485 src/libslic3r/PrintConfig.cpp:919
+msgid "Aligned Rectilinear"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:925
msgid "Concentric"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:427 src/libslic3r/PrintConfig.cpp:853
+#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:929
msgid "Hilbert Curve"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:428 src/libslic3r/PrintConfig.cpp:854
+#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:930
msgid "Archimedean Chords"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:855
+#: src/libslic3r/PrintConfig.cpp:489 src/libslic3r/PrintConfig.cpp:931
msgid "Octagram Spiral"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:435
+#: src/libslic3r/PrintConfig.cpp:495
msgid "Bottom fill pattern"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:437
+#: src/libslic3r/PrintConfig.cpp:497
msgid ""
"Fill pattern for bottom infill. This only affects the bottom external "
"visible layer, and not its adjacent solid shells."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:446 src/libslic3r/PrintConfig.cpp:457
+#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:517
msgid "External perimeters"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:448
+#: src/libslic3r/PrintConfig.cpp:508
msgid ""
"Set this to a non-zero value to set a manual extrusion width for external "
"perimeters. If left zero, default extrusion width will be used if set, "
@@ -7142,43 +8796,43 @@ msgid ""
"(for example 200%), it will be computed over layer height."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:451 src/libslic3r/PrintConfig.cpp:560
-#: src/libslic3r/PrintConfig.cpp:882 src/libslic3r/PrintConfig.cpp:895
-#: src/libslic3r/PrintConfig.cpp:1015 src/libslic3r/PrintConfig.cpp:1041
-#: src/libslic3r/PrintConfig.cpp:1423 src/libslic3r/PrintConfig.cpp:1768
-#: src/libslic3r/PrintConfig.cpp:1890 src/libslic3r/PrintConfig.cpp:1958
-#: src/libslic3r/PrintConfig.cpp:2118
+#: src/libslic3r/PrintConfig.cpp:511 src/libslic3r/PrintConfig.cpp:621
+#: src/libslic3r/PrintConfig.cpp:962 src/libslic3r/PrintConfig.cpp:975
+#: src/libslic3r/PrintConfig.cpp:1104 src/libslic3r/PrintConfig.cpp:1159
+#: src/libslic3r/PrintConfig.cpp:1185 src/libslic3r/PrintConfig.cpp:1632
+#: src/libslic3r/PrintConfig.cpp:1961 src/libslic3r/PrintConfig.cpp:2110
+#: src/libslic3r/PrintConfig.cpp:2178 src/libslic3r/PrintConfig.cpp:2339
msgid "mm or %"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:459
+#: src/libslic3r/PrintConfig.cpp:519
msgid ""
"This separate setting will affect the speed of external perimeters (the "
"visible ones). If expressed as percentage (for example: 80%) it will be "
"calculated on the perimeters speed setting above. Set to zero for auto."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:462 src/libslic3r/PrintConfig.cpp:904
-#: src/libslic3r/PrintConfig.cpp:1727 src/libslic3r/PrintConfig.cpp:1779
-#: src/libslic3r/PrintConfig.cpp:2002 src/libslic3r/PrintConfig.cpp:2131
+#: src/libslic3r/PrintConfig.cpp:522 src/libslic3r/PrintConfig.cpp:984
+#: src/libslic3r/PrintConfig.cpp:1920 src/libslic3r/PrintConfig.cpp:1972
+#: src/libslic3r/PrintConfig.cpp:2222 src/libslic3r/PrintConfig.cpp:2352
msgid "mm/s or %"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:469
+#: src/libslic3r/PrintConfig.cpp:529
msgid "External perimeters first"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:471
+#: src/libslic3r/PrintConfig.cpp:531
msgid ""
"Print contour perimeters from the outermost one to the innermost one instead "
"of the default inverse order."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:477
+#: src/libslic3r/PrintConfig.cpp:537
msgid "Extra perimeters if needed"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:479
+#: src/libslic3r/PrintConfig.cpp:539
#, possible-c-format
msgid ""
"Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r "
@@ -7186,14 +8840,14 @@ msgid ""
"is supported."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:489
+#: src/libslic3r/PrintConfig.cpp:549
msgid ""
"The extruder to use (unless more specific extruder settings are specified). "
"This value overrides perimeter and infill extruders, but not the support "
"extruders."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:501
+#: src/libslic3r/PrintConfig.cpp:561
msgid ""
"Set this to the vertical distance between your nozzle tip and (usually) the "
"X carriage rods. In other words, this is the height of the clearance "
@@ -7201,26 +8855,26 @@ msgid ""
"extruder can peek before colliding with other printed objects."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:512
+#: src/libslic3r/PrintConfig.cpp:572
msgid ""
"Set this to the clearance radius around your extruder. If the extruder is "
"not centered, choose the largest value for safety. This setting is used to "
"check for collisions and to display the graphical preview in the plater."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:522
+#: src/libslic3r/PrintConfig.cpp:582
msgid "Extruder Color"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:583
+#: src/libslic3r/PrintConfig.cpp:583 src/libslic3r/PrintConfig.cpp:645
msgid "This is only used in the Slic3r interface as a visual help."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:529
+#: src/libslic3r/PrintConfig.cpp:589
msgid "Extruder offset"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:530
+#: src/libslic3r/PrintConfig.cpp:590
msgid ""
"If your firmware doesn't handle the extruder displacement you need the G-"
"code to take it into account. This option lets you specify the displacement "
@@ -7228,21 +8882,21 @@ msgid ""
"coordinates (they will be subtracted from the XY coordinate)."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:539
+#: src/libslic3r/PrintConfig.cpp:599
msgid "Extrusion axis"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:540
+#: src/libslic3r/PrintConfig.cpp:600
msgid ""
"Use this option to set the axis letter associated to your printer's extruder "
"(usually E but some printers use A)."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:545
+#: src/libslic3r/PrintConfig.cpp:605
msgid "Extrusion multiplier"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:546
+#: src/libslic3r/PrintConfig.cpp:606
msgid ""
"This factor changes the amount of flow proportionally. You may need to tweak "
"this setting to get nice surface finish and correct single wall widths. "
@@ -7250,11 +8904,11 @@ msgid ""
"more, check filament diameter and your firmware E steps."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:554
+#: src/libslic3r/PrintConfig.cpp:615
msgid "Default extrusion width"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:556
+#: src/libslic3r/PrintConfig.cpp:617
msgid ""
"Set this to a non-zero value to allow a manual extrusion width. If left to "
"zero, Slic3r derives extrusion widths from the nozzle diameter (see the "
@@ -7263,119 +8917,123 @@ msgid ""
"height."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:566
+#: src/libslic3r/PrintConfig.cpp:628
msgid "Keep fan always on"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:567
+#: src/libslic3r/PrintConfig.cpp:629
msgid ""
"If this is enabled, fan will never be disabled and will be kept running at "
"least at its minimum speed. Useful for PLA, harmful for ABS."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:572
+#: src/libslic3r/PrintConfig.cpp:634
msgid "Enable fan if layer print time is below"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:573
+#: src/libslic3r/PrintConfig.cpp:635
msgid ""
"If layer print time is estimated below this number of seconds, fan will be "
"enabled and its speed will be calculated by interpolating the minimum and "
"maximum speeds."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:575 src/libslic3r/PrintConfig.cpp:1715
+#: src/libslic3r/PrintConfig.cpp:637 src/libslic3r/PrintConfig.cpp:1908
msgid "approximate seconds"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:588
+#: src/libslic3r/PrintConfig.cpp:644
+msgid "Color"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:650
msgid "Filament notes"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:589
+#: src/libslic3r/PrintConfig.cpp:651
msgid "You can put your notes regarding the filament here."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:597 src/libslic3r/PrintConfig.cpp:1247
+#: src/libslic3r/PrintConfig.cpp:659 src/libslic3r/PrintConfig.cpp:1455
msgid "Max volumetric speed"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:598
+#: src/libslic3r/PrintConfig.cpp:660
msgid ""
"Maximum volumetric speed allowed for this filament. Limits the maximum "
"volumetric speed of a print to the minimum of print and filament volumetric "
"speed. Set to zero for no limit."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:607
+#: src/libslic3r/PrintConfig.cpp:669
msgid "Loading speed"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:608
+#: src/libslic3r/PrintConfig.cpp:670
msgid "Speed used for loading the filament on the wipe tower."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:615
+#: src/libslic3r/PrintConfig.cpp:677
msgid "Loading speed at the start"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:616
+#: src/libslic3r/PrintConfig.cpp:678
msgid "Speed used at the very beginning of loading phase."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:623
+#: src/libslic3r/PrintConfig.cpp:685
msgid "Unloading speed"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:624
+#: src/libslic3r/PrintConfig.cpp:686
msgid ""
"Speed used for unloading the filament on the wipe tower (does not affect "
"initial part of unloading just after ramming)."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:632
+#: src/libslic3r/PrintConfig.cpp:694
msgid "Unloading speed at the start"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:633
+#: src/libslic3r/PrintConfig.cpp:695
msgid ""
"Speed used for unloading the tip of the filament immediately after ramming."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:640
+#: src/libslic3r/PrintConfig.cpp:702
msgid "Delay after unloading"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:641
+#: src/libslic3r/PrintConfig.cpp:703
msgid ""
"Time to wait after the filament is unloaded. May help to get reliable "
"toolchanges with flexible materials that may need more time to shrink to "
"original dimensions."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:650
+#: src/libslic3r/PrintConfig.cpp:712
msgid "Number of cooling moves"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:651
+#: src/libslic3r/PrintConfig.cpp:713
msgid ""
"Filament is cooled by being moved back and forth in the cooling tubes. "
"Specify desired number of these moves."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:659
+#: src/libslic3r/PrintConfig.cpp:721
msgid "Speed of the first cooling move"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:660
+#: src/libslic3r/PrintConfig.cpp:722
msgid "Cooling moves are gradually accelerating beginning at this speed."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:667
+#: src/libslic3r/PrintConfig.cpp:729
msgid "Minimal purge on wipe tower"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:668
+#: src/libslic3r/PrintConfig.cpp:730
msgid ""
"After a tool change, the exact position of the newly loaded filament inside "
"the nozzle may not be known, and the filament pressure is likely not yet "
@@ -7384,63 +9042,63 @@ msgid ""
"to produce successive infill or sacrificial object extrusions reliably."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:672
+#: src/libslic3r/PrintConfig.cpp:734
msgid "mm³"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:678
+#: src/libslic3r/PrintConfig.cpp:740
msgid "Speed of the last cooling move"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:679
+#: src/libslic3r/PrintConfig.cpp:741
msgid "Cooling moves are gradually accelerating towards this speed."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:686
+#: src/libslic3r/PrintConfig.cpp:748
msgid "Filament load time"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:687
+#: src/libslic3r/PrintConfig.cpp:749
msgid ""
"Time for the printer firmware (or the Multi Material Unit 2.0) to load a new "
"filament during a tool change (when executing the T code). This time is "
"added to the total print time by the G-code time estimator."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:694
+#: src/libslic3r/PrintConfig.cpp:756
msgid "Ramming parameters"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:695
+#: src/libslic3r/PrintConfig.cpp:757
msgid ""
"This string is edited by RammingDialog and contains ramming specific "
"parameters."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:701
+#: src/libslic3r/PrintConfig.cpp:763
msgid "Filament unload time"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:702
+#: src/libslic3r/PrintConfig.cpp:764
msgid ""
"Time for the printer firmware (or the Multi Material Unit 2.0) to unload a "
"filament during a tool change (when executing the T code). This time is "
"added to the total print time by the G-code time estimator."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:710
+#: src/libslic3r/PrintConfig.cpp:772
msgid ""
"Enter your filament diameter here. Good precision is required, so use a "
"caliper and do multiple measurements along the filament, then compute the "
"average."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:717 src/libslic3r/PrintConfig.cpp:2510
-#: src/libslic3r/PrintConfig.cpp:2511
+#: src/libslic3r/PrintConfig.cpp:779 src/libslic3r/PrintConfig.cpp:2731
+#: src/libslic3r/PrintConfig.cpp:2732
msgid "Density"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:718
+#: src/libslic3r/PrintConfig.cpp:780
msgid ""
"Enter your filament density here. This is only for statistical information. "
"A decent way is to weigh a known length of filament and compute the ratio of "
@@ -7448,117 +9106,145 @@ msgid ""
"displacement."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:721
+#: src/libslic3r/PrintConfig.cpp:783
msgid "g/cm³"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:726
+#: src/libslic3r/PrintConfig.cpp:788
msgid "Filament type"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:727
+#: src/libslic3r/PrintConfig.cpp:789
msgid "The filament material type for use in custom G-codes."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:754
+#: src/libslic3r/PrintConfig.cpp:816
msgid "Soluble material"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:755
+#: src/libslic3r/PrintConfig.cpp:817
msgid "Soluble material is most likely used for a soluble support."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:761
+#: src/libslic3r/PrintConfig.cpp:823
msgid ""
"Enter your filament cost per kg here. This is only for statistical "
"information."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:762
+#: src/libslic3r/PrintConfig.cpp:824
msgid "money/kg"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:771 src/libslic3r/PrintConfig.cpp:2594
+#: src/libslic3r/PrintConfig.cpp:829
+msgid "Spool weight"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:830
+msgid ""
+"Enter weight of the empty filament spool. One may weigh a partially consumed "
+"filament spool before printing and one may compare the measured weight with "
+"the calculated weight of the filament with the spool to find out whether the "
+"amount of filament on the spool is sufficient to finish the print."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:834
+msgid "g"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:843 src/libslic3r/PrintConfig.cpp:2815
msgid "(Unknown)"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:775
+#: src/libslic3r/PrintConfig.cpp:847
msgid "Fill angle"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:777
+#: src/libslic3r/PrintConfig.cpp:849
msgid ""
"Default base angle for infill orientation. Cross-hatching will be applied to "
"this. Bridges will be infilled using the best direction Slic3r can detect, "
"so this setting does not affect them."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:789
+#: src/libslic3r/PrintConfig.cpp:861
msgid "Fill density"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:791
+#: src/libslic3r/PrintConfig.cpp:863
msgid "Density of internal infill, expressed in the range 0% - 100%."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:826
+#: src/libslic3r/PrintConfig.cpp:898
msgid "Fill pattern"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:828
+#: src/libslic3r/PrintConfig.cpp:900
msgid "Fill pattern for general low-density infill."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:844
+#: src/libslic3r/PrintConfig.cpp:920
msgid "Grid"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:845
+#: src/libslic3r/PrintConfig.cpp:921
msgid "Triangles"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:846
+#: src/libslic3r/PrintConfig.cpp:922
msgid "Stars"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:847
+#: src/libslic3r/PrintConfig.cpp:923
msgid "Cubic"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:848
+#: src/libslic3r/PrintConfig.cpp:924
msgid "Line"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:850 src/libslic3r/PrintConfig.cpp:2018
+#: src/libslic3r/PrintConfig.cpp:926 src/libslic3r/PrintConfig.cpp:2238
msgid "Honeycomb"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:851
+#: src/libslic3r/PrintConfig.cpp:927
msgid "3D Honeycomb"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:852
+#: src/libslic3r/PrintConfig.cpp:928
msgid "Gyroid"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:859 src/libslic3r/PrintConfig.cpp:868
-#: src/libslic3r/PrintConfig.cpp:876 src/libslic3r/PrintConfig.cpp:910
+#: src/libslic3r/PrintConfig.cpp:932
+msgid "Adaptive Cubic"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:933
+msgid "Support Cubic"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:937 src/libslic3r/PrintConfig.cpp:946
+#: src/libslic3r/PrintConfig.cpp:956 src/libslic3r/PrintConfig.cpp:990
msgid "First layer"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:860
+#: src/libslic3r/PrintConfig.cpp:938
msgid ""
"This is the acceleration your printer will use for first layer. Set zero to "
"disable acceleration control for first layer."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:869
+#: src/libslic3r/PrintConfig.cpp:947
+msgid "First layer bed temperature"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:948
msgid ""
"Heated build plate temperature for the first layer. Set this to zero to "
"disable bed temperature control commands in the output."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:878
+#: src/libslic3r/PrintConfig.cpp:958
msgid ""
"Set this to a non-zero value to set a manual extrusion width for first "
"layer. You can use this to force fatter extrudates for better adhesion. If "
@@ -7566,7 +9252,7 @@ msgid ""
"layer height. If set to zero, it will use the default extrusion width."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:891
+#: src/libslic3r/PrintConfig.cpp:971
msgid ""
"When printing with very low layer heights, you might still want to print a "
"thicker bottom layer to improve adhesion and tolerance for non perfect build "
@@ -7574,47 +9260,64 @@ msgid ""
"example: 150%) over the default layer height."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:900
+#: src/libslic3r/PrintConfig.cpp:980
msgid "First layer speed"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:901
+#: src/libslic3r/PrintConfig.cpp:981
msgid ""
"If expressed as absolute value in mm/s, this speed will be applied to all "
"the print moves of the first layer, regardless of their type. If expressed "
"as a percentage (for example: 40%) it will scale the default speeds."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:911
+#: src/libslic3r/PrintConfig.cpp:991
+msgid "First layer nozzle temperature"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:992
msgid ""
-"Extruder temperature for first layer. If you want to control temperature "
+"Nozzle temperature for the first layer. If you want to control temperature "
"manually during print, set this to zero to disable temperature control "
-"commands in the output file."
+"commands in the output G-code."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:920
+#: src/libslic3r/PrintConfig.cpp:1000
+msgid "Full fan speed at layer"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1001
+msgid ""
+"Fan speed will be ramped up linearly from zero at layer "
+"\"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". "
+"\"full_fan_speed_layer\" will be ignored if lower than "
+"\"disable_fan_first_layers\", in which case the fan will be running at "
+"maximum allowed speed at layer \"disable_fan_first_layers\" + 1."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1013
msgid ""
"Speed for filling small gaps using short zigzag moves. Keep this reasonably "
"low to avoid too much shaking and resonance issues. Set zero to disable gaps "
"filling."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:928
+#: src/libslic3r/PrintConfig.cpp:1021
msgid "Verbose G-code"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:929
+#: src/libslic3r/PrintConfig.cpp:1022
msgid ""
"Enable this to get a commented G-code file, with each line explained by a "
"descriptive text. If you print from SD card, the additional weight of the "
"file could make your firmware slow down."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:936
+#: src/libslic3r/PrintConfig.cpp:1029
msgid "G-code flavor"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:937
+#: src/libslic3r/PrintConfig.cpp:1030
msgid ""
"Some G/M-code commands, including temperature control and others, are not "
"universal. Set this option to your printer's firmware to get a compatible "
@@ -7622,15 +9325,15 @@ msgid ""
"extrusion value at all."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:960
+#: src/libslic3r/PrintConfig.cpp:1055
msgid "No extrusion"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:965
+#: src/libslic3r/PrintConfig.cpp:1060
msgid "Label objects"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:966
+#: src/libslic3r/PrintConfig.cpp:1061
msgid ""
"Enable this to add comments into the G-Code labeling print moves with what "
"object they belong to, which is useful for the Octoprint CancelObject "
@@ -7638,46 +9341,91 @@ msgid ""
"setup and Wipe into Object / Wipe into Infill."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:973
+#: src/libslic3r/PrintConfig.cpp:1068
msgid "High extruder current on filament swap"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:974
+#: src/libslic3r/PrintConfig.cpp:1069
msgid ""
"It may be beneficial to increase the extruder motor current during the "
"filament exchange sequence to allow for rapid ramming feed rates and to "
"overcome resistance when loading a filament with an ugly shaped tip."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:982
+#: src/libslic3r/PrintConfig.cpp:1077
msgid ""
"This is the acceleration your printer will use for infill. Set zero to "
"disable acceleration control for infill."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:990
+#: src/libslic3r/PrintConfig.cpp:1085
msgid "Combine infill every"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:992
+#: src/libslic3r/PrintConfig.cpp:1087
msgid ""
"This feature allows to combine infill and speed up your print by extruding "
"thicker infill layers while preserving thin perimeters, thus accuracy."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:995
+#: src/libslic3r/PrintConfig.cpp:1090
msgid "Combine infill every n layers"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1001
+#: src/libslic3r/PrintConfig.cpp:1096
+msgid "Length of the infill anchor"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1098
+msgid ""
+"Connect an infill line to an internal perimeter with a short segment of an "
+"additional perimeter. If expressed as percentage (example: 15%) it is "
+"calculated over infill extrusion width. PrusaSlicer tries to connect two "
+"close infill lines to a short perimeter segment. If no such perimeter "
+"segment shorter than infill_anchor_max is found, the infill line is "
+"connected to a perimeter segment at just one side and the length of the "
+"perimeter segment taken is limited to this parameter, but no longer than "
+"anchor_length_max. Set this parameter to zero to disable anchoring "
+"perimeters connected to a single infill line."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1113
+msgid "0 (no open anchors)"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1118 src/libslic3r/PrintConfig.cpp:1140
+msgid "1000 (unlimited)"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1123
+msgid "Maximum length of the infill anchor"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1125
+msgid ""
+"Connect an infill line to an internal perimeter with a short segment of an "
+"additional perimeter. If expressed as percentage (example: 15%) it is "
+"calculated over infill extrusion width. PrusaSlicer tries to connect two "
+"close infill lines to a short perimeter segment. If no such perimeter "
+"segment shorter than this parameter is found, the infill line is connected "
+"to a perimeter segment at just one side and the length of the perimeter "
+"segment taken is limited to infill_anchor, but no longer than this "
+"parameter. Set this parameter to zero to disable anchoring."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1135
+msgid "0 (not anchored)"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1145
msgid "Infill extruder"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1003
+#: src/libslic3r/PrintConfig.cpp:1147
msgid "The extruder to use when printing infill."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1011
+#: src/libslic3r/PrintConfig.cpp:1155
msgid ""
"Set this to a non-zero value to set a manual extrusion width for infill. If "
"left zero, default extrusion width will be used if set, otherwise 1.125 x "
@@ -7686,32 +9434,32 @@ msgid ""
"example 90%) it will be computed over layer height."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1021
+#: src/libslic3r/PrintConfig.cpp:1165
msgid "Infill before perimeters"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1022
+#: src/libslic3r/PrintConfig.cpp:1166
msgid ""
"This option will switch the print order of perimeters and infill, making the "
"latter first."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1027
+#: src/libslic3r/PrintConfig.cpp:1171
msgid "Only infill where needed"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1029
+#: src/libslic3r/PrintConfig.cpp:1173
msgid ""
"This option will limit infill to the areas actually needed for supporting "
"ceilings (it will act as internal support material). If enabled, slows down "
"the G-code generation due to the multiple checks involved."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1036
+#: src/libslic3r/PrintConfig.cpp:1180
msgid "Infill/perimeters overlap"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1038
+#: src/libslic3r/PrintConfig.cpp:1182
msgid ""
"This setting applies an additional overlap between infill and perimeters for "
"better bonding. Theoretically this shouldn't be needed, but backlash might "
@@ -7719,30 +9467,71 @@ msgid ""
"perimeter extrusion width."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1049
+#: src/libslic3r/PrintConfig.cpp:1193
msgid "Speed for printing the internal fill. Set to zero for auto."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1057
+#: src/libslic3r/PrintConfig.cpp:1201
msgid "Inherits profile"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1058
+#: src/libslic3r/PrintConfig.cpp:1202
msgid "Name of the profile, from which this profile inherits."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1071
+#: src/libslic3r/PrintConfig.cpp:1215
msgid "Interface shells"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1072
+#: src/libslic3r/PrintConfig.cpp:1216
msgid ""
"Force the generation of solid shells between adjacent materials/volumes. "
"Useful for multi-extruder prints with translucent materials or manual "
"soluble support material."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1081
+#: src/libslic3r/PrintConfig.cpp:1224
+msgid "Enable ironing"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1225
+msgid ""
+"Enable ironing of the top layers with the hot print head for smooth surface"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1231 src/libslic3r/PrintConfig.cpp:1233
+msgid "Ironing Type"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1238
+msgid "All top surfaces"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1239
+msgid "Topmost surface only"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1240
+msgid "All solid surfaces"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1245
+msgid "Flow rate"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1247
+msgid "Percent of a flow rate relative to object's normal layer height."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1255
+msgid "Spacing between ironing passes"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1257
+msgid "Distance between ironing lines"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1274
msgid ""
"This custom code is inserted at every layer change, right after the Z move "
"and before the extruder moves to the first layer point. Note that you can "
@@ -7750,11 +9539,11 @@ msgid ""
"[layer_z]."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1092
+#: src/libslic3r/PrintConfig.cpp:1285
msgid "Supports remaining times"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1093
+#: src/libslic3r/PrintConfig.cpp:1286
msgid ""
"Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute "
"intervals into the G-code to let the firmware show accurate remaining time. "
@@ -7762,151 +9551,175 @@ msgid ""
"firmware supports M73 Qxx Sxx for the silent mode."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1101
+#: src/libslic3r/PrintConfig.cpp:1294
msgid "Supports stealth mode"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1102
+#: src/libslic3r/PrintConfig.cpp:1295
msgid "The firmware supports stealth mode"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1125
+#: src/libslic3r/PrintConfig.cpp:1300
+msgid "How to apply limits"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1301
+msgid "Purpose of Machine Limits"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1303
+msgid "How to apply the Machine Limits"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1308
+msgid "Emit to G-code"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1309
+msgid "Use for time estimate"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1310
+msgid "Ignore"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1333
msgid "Maximum feedrate X"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1126
+#: src/libslic3r/PrintConfig.cpp:1334
msgid "Maximum feedrate Y"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1127
+#: src/libslic3r/PrintConfig.cpp:1335
msgid "Maximum feedrate Z"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1128
+#: src/libslic3r/PrintConfig.cpp:1336
msgid "Maximum feedrate E"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1131
+#: src/libslic3r/PrintConfig.cpp:1339
msgid "Maximum feedrate of the X axis"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1132
+#: src/libslic3r/PrintConfig.cpp:1340
msgid "Maximum feedrate of the Y axis"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1133
+#: src/libslic3r/PrintConfig.cpp:1341
msgid "Maximum feedrate of the Z axis"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1134
+#: src/libslic3r/PrintConfig.cpp:1342
msgid "Maximum feedrate of the E axis"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1142
+#: src/libslic3r/PrintConfig.cpp:1350
msgid "Maximum acceleration X"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1143
+#: src/libslic3r/PrintConfig.cpp:1351
msgid "Maximum acceleration Y"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1144
+#: src/libslic3r/PrintConfig.cpp:1352
msgid "Maximum acceleration Z"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1145
+#: src/libslic3r/PrintConfig.cpp:1353
msgid "Maximum acceleration E"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1148
+#: src/libslic3r/PrintConfig.cpp:1356
msgid "Maximum acceleration of the X axis"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1149
+#: src/libslic3r/PrintConfig.cpp:1357
msgid "Maximum acceleration of the Y axis"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1150
+#: src/libslic3r/PrintConfig.cpp:1358
msgid "Maximum acceleration of the Z axis"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1151
+#: src/libslic3r/PrintConfig.cpp:1359
msgid "Maximum acceleration of the E axis"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1159
+#: src/libslic3r/PrintConfig.cpp:1367
msgid "Maximum jerk X"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1160
+#: src/libslic3r/PrintConfig.cpp:1368
msgid "Maximum jerk Y"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1161
+#: src/libslic3r/PrintConfig.cpp:1369
msgid "Maximum jerk Z"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1162
+#: src/libslic3r/PrintConfig.cpp:1370
msgid "Maximum jerk E"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1165
+#: src/libslic3r/PrintConfig.cpp:1373
msgid "Maximum jerk of the X axis"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1166
+#: src/libslic3r/PrintConfig.cpp:1374
msgid "Maximum jerk of the Y axis"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1167
+#: src/libslic3r/PrintConfig.cpp:1375
msgid "Maximum jerk of the Z axis"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1168
+#: src/libslic3r/PrintConfig.cpp:1376
msgid "Maximum jerk of the E axis"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1178
+#: src/libslic3r/PrintConfig.cpp:1386
msgid "Minimum feedrate when extruding"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1180
+#: src/libslic3r/PrintConfig.cpp:1388
msgid "Minimum feedrate when extruding (M205 S)"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1188
+#: src/libslic3r/PrintConfig.cpp:1396
msgid "Minimum travel feedrate"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1190
+#: src/libslic3r/PrintConfig.cpp:1398
msgid "Minimum travel feedrate (M205 T)"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1198
+#: src/libslic3r/PrintConfig.cpp:1406
msgid "Maximum acceleration when extruding"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1200
+#: src/libslic3r/PrintConfig.cpp:1408
msgid "Maximum acceleration when extruding (M204 S)"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1208
+#: src/libslic3r/PrintConfig.cpp:1416
msgid "Maximum acceleration when retracting"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1210
+#: src/libslic3r/PrintConfig.cpp:1418
msgid "Maximum acceleration when retracting (M204 T)"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1217 src/libslic3r/PrintConfig.cpp:1226
+#: src/libslic3r/PrintConfig.cpp:1425 src/libslic3r/PrintConfig.cpp:1434
msgid "Max"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1218
+#: src/libslic3r/PrintConfig.cpp:1426
msgid "This setting represents the maximum speed of your fan."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1227
+#: src/libslic3r/PrintConfig.cpp:1435
#, possible-c-format
msgid ""
"This is the highest printable layer height for this extruder, used to cap "
@@ -7915,28 +9728,28 @@ msgid ""
"adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1237
+#: src/libslic3r/PrintConfig.cpp:1445
msgid "Max print speed"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1238
+#: src/libslic3r/PrintConfig.cpp:1446
msgid ""
"When setting other speed settings to 0 Slic3r will autocalculate the optimal "
"speed in order to keep constant extruder pressure. This experimental setting "
"is used to set the highest print speed you want to allow."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1248
+#: src/libslic3r/PrintConfig.cpp:1456
msgid ""
"This experimental setting is used to set the maximum volumetric speed your "
"extruder supports."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1257
+#: src/libslic3r/PrintConfig.cpp:1465
msgid "Max volumetric slope positive"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1258 src/libslic3r/PrintConfig.cpp:1269
+#: src/libslic3r/PrintConfig.cpp:1466 src/libslic3r/PrintConfig.cpp:1477
msgid ""
"This experimental setting is used to limit the speed of change in extrusion "
"rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate "
@@ -7944,95 +9757,95 @@ msgid ""
"s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1262 src/libslic3r/PrintConfig.cpp:1273
+#: src/libslic3r/PrintConfig.cpp:1470 src/libslic3r/PrintConfig.cpp:1481
msgid "mm³/s²"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1268
+#: src/libslic3r/PrintConfig.cpp:1476
msgid "Max volumetric slope negative"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1280 src/libslic3r/PrintConfig.cpp:1289
+#: src/libslic3r/PrintConfig.cpp:1488 src/libslic3r/PrintConfig.cpp:1497
msgid "Min"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1281
+#: src/libslic3r/PrintConfig.cpp:1489
msgid "This setting represents the minimum PWM your fan needs to work."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1290
+#: src/libslic3r/PrintConfig.cpp:1498
msgid ""
"This is the lowest printable layer height for this extruder and limits the "
"resolution for variable layer height. Typical values are between 0.05 mm and "
"0.1 mm."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1298
+#: src/libslic3r/PrintConfig.cpp:1506
msgid "Min print speed"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1299
+#: src/libslic3r/PrintConfig.cpp:1507
msgid "Slic3r will not scale speed down below this speed."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1306
+#: src/libslic3r/PrintConfig.cpp:1514
msgid "Minimal filament extrusion length"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1307
+#: src/libslic3r/PrintConfig.cpp:1515
msgid ""
"Generate no less than the number of skirt loops required to consume the "
"specified amount of filament on the bottom layer. For multi-extruder "
"machines, this minimum applies to each extruder."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1316
+#: src/libslic3r/PrintConfig.cpp:1524
msgid "Configuration notes"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1317
+#: src/libslic3r/PrintConfig.cpp:1525
msgid ""
"You can put here your personal notes. This text will be added to the G-code "
"header comments."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1327
+#: src/libslic3r/PrintConfig.cpp:1535
msgid ""
"This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1332
+#: src/libslic3r/PrintConfig.cpp:1540
msgid "Host Type"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1333
+#: src/libslic3r/PrintConfig.cpp:1541
msgid ""
"Slic3r can upload G-code files to a printer host. This field must contain "
"the kind of the host."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1348
+#: src/libslic3r/PrintConfig.cpp:1558
msgid "Only retract when crossing perimeters"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1349
+#: src/libslic3r/PrintConfig.cpp:1559
msgid ""
"Disables retraction when the travel path does not exceed the upper layer's "
"perimeters (and thus any ooze will be probably invisible)."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1356
+#: src/libslic3r/PrintConfig.cpp:1566
msgid ""
"This option will drop the temperature of the inactive extruders to prevent "
"oozing. It will enable a tall skirt automatically and move extruders outside "
"such skirt when changing temperatures."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1363
+#: src/libslic3r/PrintConfig.cpp:1573
msgid "Output filename format"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1364
+#: src/libslic3r/PrintConfig.cpp:1574
msgid ""
"You can use all configuration options as variables inside this template. For "
"example: [layer_height], [fill_density] etc. You can also use [timestamp], "
@@ -8040,31 +9853,31 @@ msgid ""
"[input_filename], [input_filename_base]."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1373
+#: src/libslic3r/PrintConfig.cpp:1583
msgid "Detect bridging perimeters"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1375
+#: src/libslic3r/PrintConfig.cpp:1585
msgid ""
"Experimental option to adjust flow for overhangs (bridge flow will be used), "
"to apply bridge speed to them and enable fan."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1381
+#: src/libslic3r/PrintConfig.cpp:1591
msgid "Filament parking position"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1382
+#: src/libslic3r/PrintConfig.cpp:1592
msgid ""
"Distance of the extruder tip from the position where the filament is parked "
"when unloaded. This should match the value in printer firmware."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1390
+#: src/libslic3r/PrintConfig.cpp:1600
msgid "Extra loading distance"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1391
+#: src/libslic3r/PrintConfig.cpp:1601
msgid ""
"When set to zero, the distance the filament is moved from parking position "
"during load is exactly the same as it was moved back during unload. When "
@@ -8072,28 +9885,27 @@ msgid ""
"than unloading."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1399 src/libslic3r/PrintConfig.cpp:1417
-#: src/libslic3r/PrintConfig.cpp:1430 src/libslic3r/PrintConfig.cpp:1440
+#: src/libslic3r/PrintConfig.cpp:1609 src/libslic3r/PrintConfig.cpp:1626
+#: src/libslic3r/PrintConfig.cpp:1639 src/libslic3r/PrintConfig.cpp:1649
msgid "Perimeters"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1400
+#: src/libslic3r/PrintConfig.cpp:1610
msgid ""
-"This is the acceleration your printer will use for perimeters. A high value "
-"like 9000 usually gives good results if your hardware is up to the job. Set "
-"zero to disable acceleration control for perimeters."
+"This is the acceleration your printer will use for perimeters. Set zero to "
+"disable acceleration control for perimeters."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1408
+#: src/libslic3r/PrintConfig.cpp:1617
msgid "Perimeter extruder"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1410
+#: src/libslic3r/PrintConfig.cpp:1619
msgid ""
"The extruder to use when printing perimeters and brim. First extruder is 1."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1419
+#: src/libslic3r/PrintConfig.cpp:1628
msgid ""
"Set this to a non-zero value to set a manual extrusion width for perimeters. "
"You may want to use thinner extrudates to get more accurate surfaces. If "
@@ -8102,12 +9914,12 @@ msgid ""
"it will be computed over layer height."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1432
+#: src/libslic3r/PrintConfig.cpp:1641
msgid ""
"Speed for perimeters (contours, aka vertical shells). Set to zero for auto."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1442
+#: src/libslic3r/PrintConfig.cpp:1651
msgid ""
"This option sets the number of perimeters to generate for each layer. Note "
"that Slic3r may increase this number automatically when it detects sloping "
@@ -8115,11 +9927,11 @@ msgid ""
"Perimeters option is enabled."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1446
+#: src/libslic3r/PrintConfig.cpp:1655
msgid "(minimum)"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1454
+#: src/libslic3r/PrintConfig.cpp:1663
msgid ""
"If you want to process the output G-code through custom scripts, just list "
"their absolute paths here. Separate multiple scripts with a semicolon. "
@@ -8128,55 +9940,55 @@ msgid ""
"environment variables."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1466
+#: src/libslic3r/PrintConfig.cpp:1675
msgid "Printer type"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1467
+#: src/libslic3r/PrintConfig.cpp:1676
msgid "Type of the printer."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1472
+#: src/libslic3r/PrintConfig.cpp:1681
msgid "Printer notes"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1473
+#: src/libslic3r/PrintConfig.cpp:1682
msgid "You can put your notes regarding the printer here."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1481
+#: src/libslic3r/PrintConfig.cpp:1690
msgid "Printer vendor"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1482
+#: src/libslic3r/PrintConfig.cpp:1691
msgid "Name of the printer vendor."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1487
+#: src/libslic3r/PrintConfig.cpp:1696
msgid "Printer variant"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1488
+#: src/libslic3r/PrintConfig.cpp:1697
msgid ""
"Name of the printer variant. For example, the printer variants may be "
"differentiated by a nozzle diameter."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1501
+#: src/libslic3r/PrintConfig.cpp:1714
msgid "Raft layers"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1503
+#: src/libslic3r/PrintConfig.cpp:1716
msgid ""
"The object will be raised by this number of layers, and support material "
"will be generated under it."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1511
+#: src/libslic3r/PrintConfig.cpp:1724
msgid "Resolution"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1512
+#: src/libslic3r/PrintConfig.cpp:1725
msgid ""
"Minimum detail resolution, used to simplify the input file for speeding up "
"the slicing job and reducing memory usage. High-resolution models often "
@@ -8184,289 +9996,277 @@ msgid ""
"simplification and use full resolution from input."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1522
+#: src/libslic3r/PrintConfig.cpp:1735
msgid "Minimum travel after retraction"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1523
+#: src/libslic3r/PrintConfig.cpp:1736
msgid ""
"Retraction is not triggered when travel moves are shorter than this length."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1529
+#: src/libslic3r/PrintConfig.cpp:1742
msgid "Retract amount before wipe"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1530
+#: src/libslic3r/PrintConfig.cpp:1743
msgid ""
"With bowden extruders, it may be wise to do some amount of quick retract "
"before doing the wipe movement."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1537
+#: src/libslic3r/PrintConfig.cpp:1750
msgid "Retract on layer change"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1538
+#: src/libslic3r/PrintConfig.cpp:1751
msgid "This flag enforces a retraction whenever a Z move is done."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1551
+#: src/libslic3r/PrintConfig.cpp:1756 src/libslic3r/PrintConfig.cpp:1764
msgid "Length"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1544
+#: src/libslic3r/PrintConfig.cpp:1757
msgid "Retraction Length"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1545
+#: src/libslic3r/PrintConfig.cpp:1758
msgid ""
"When retraction is triggered, filament is pulled back by the specified "
"amount (the length is measured on raw filament, before it enters the "
"extruder)."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1547 src/libslic3r/PrintConfig.cpp:1556
+#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1769
msgid "mm (zero to disable)"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1552
+#: src/libslic3r/PrintConfig.cpp:1765
msgid "Retraction Length (Toolchange)"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1553
+#: src/libslic3r/PrintConfig.cpp:1766
msgid ""
"When retraction is triggered before changing tool, filament is pulled back "
"by the specified amount (the length is measured on raw filament, before it "
"enters the extruder)."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1561
+#: src/libslic3r/PrintConfig.cpp:1774
msgid "Lift Z"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1562
+#: src/libslic3r/PrintConfig.cpp:1775
msgid ""
"If you set this to a positive value, Z is quickly raised every time a "
"retraction is triggered. When using multiple extruders, only the setting for "
"the first extruder will be considered."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1569
+#: src/libslic3r/PrintConfig.cpp:1782
msgid "Above Z"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1570
+#: src/libslic3r/PrintConfig.cpp:1783
msgid "Only lift Z above"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1571
+#: src/libslic3r/PrintConfig.cpp:1784
msgid ""
"If you set this to a positive value, Z lift will only take place above the "
"specified absolute Z. You can tune this setting for skipping lift on the "
"first layers."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1578
+#: src/libslic3r/PrintConfig.cpp:1791
msgid "Below Z"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1579
+#: src/libslic3r/PrintConfig.cpp:1792
msgid "Only lift Z below"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1580
+#: src/libslic3r/PrintConfig.cpp:1793
msgid ""
"If you set this to a positive value, Z lift will only take place below the "
"specified absolute Z. You can tune this setting for limiting lift to the "
"first layers."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1588 src/libslic3r/PrintConfig.cpp:1596
+#: src/libslic3r/PrintConfig.cpp:1801 src/libslic3r/PrintConfig.cpp:1809
msgid "Extra length on restart"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1589
+#: src/libslic3r/PrintConfig.cpp:1802
msgid ""
"When the retraction is compensated after the travel move, the extruder will "
"push this additional amount of filament. This setting is rarely needed."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1597
+#: src/libslic3r/PrintConfig.cpp:1810
msgid ""
"When the retraction is compensated after changing tool, the extruder will "
"push this additional amount of filament."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1604 src/libslic3r/PrintConfig.cpp:1605
+#: src/libslic3r/PrintConfig.cpp:1817 src/libslic3r/PrintConfig.cpp:1818
msgid "Retraction Speed"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1606
+#: src/libslic3r/PrintConfig.cpp:1819
msgid "The speed for retractions (it only applies to the extruder motor)."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1612 src/libslic3r/PrintConfig.cpp:1613
+#: src/libslic3r/PrintConfig.cpp:1825 src/libslic3r/PrintConfig.cpp:1826
msgid "Deretraction Speed"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1614
+#: src/libslic3r/PrintConfig.cpp:1827
msgid ""
"The speed for loading of a filament into extruder after retraction (it only "
"applies to the extruder motor). If left to zero, the retraction speed is "
"used."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1621
+#: src/libslic3r/PrintConfig.cpp:1834
msgid "Seam position"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1623
+#: src/libslic3r/PrintConfig.cpp:1836
msgid "Position of perimeters starting points."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1629
+#: src/libslic3r/PrintConfig.cpp:1842
msgid "Random"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1630
+#: src/libslic3r/PrintConfig.cpp:1843
msgid "Nearest"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1631
+#: src/libslic3r/PrintConfig.cpp:1844
msgid "Aligned"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1639
+#: src/libslic3r/PrintConfig.cpp:1852
msgid "Direction"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1641
+#: src/libslic3r/PrintConfig.cpp:1854
msgid "Preferred direction of the seam"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1642
+#: src/libslic3r/PrintConfig.cpp:1855
msgid "Seam preferred direction"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1649
+#: src/libslic3r/PrintConfig.cpp:1862
msgid "Jitter"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1651
+#: src/libslic3r/PrintConfig.cpp:1864
msgid "Seam preferred direction jitter"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1652
+#: src/libslic3r/PrintConfig.cpp:1865
msgid "Preferred direction of the seam - jitter"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1662
-msgid "USB/serial port for printer connection."
-msgstr ""
-
-#: src/libslic3r/PrintConfig.cpp:1669
-msgid "Serial port speed"
-msgstr ""
-
-#: src/libslic3r/PrintConfig.cpp:1670
-msgid "Speed (baud) of USB/serial port for printer connection."
-msgstr ""
-
-#: src/libslic3r/PrintConfig.cpp:1679
+#: src/libslic3r/PrintConfig.cpp:1872
msgid "Distance from object"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1680
+#: src/libslic3r/PrintConfig.cpp:1873
msgid ""
"Distance between skirt and object(s). Set this to zero to attach the skirt "
"to the object(s) and get a brim for better adhesion."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1687
+#: src/libslic3r/PrintConfig.cpp:1880
msgid "Skirt height"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1688
+#: src/libslic3r/PrintConfig.cpp:1881
msgid ""
"Height of skirt expressed in layers. Set this to a tall value to use skirt "
"as a shield against drafts."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1695
+#: src/libslic3r/PrintConfig.cpp:1888
msgid "Draft shield"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1696
+#: src/libslic3r/PrintConfig.cpp:1889
msgid ""
"If enabled, the skirt will be as tall as a highest printed object. This is "
"useful to protect an ABS or ASA print from warping and detaching from print "
"bed due to wind draft."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1702
+#: src/libslic3r/PrintConfig.cpp:1895
msgid "Loops (minimum)"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1703
+#: src/libslic3r/PrintConfig.cpp:1896
msgid "Skirt Loops"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1704
+#: src/libslic3r/PrintConfig.cpp:1897
msgid ""
"Number of loops for the skirt. If the Minimum Extrusion Length option is "
"set, the number of loops might be greater than the one configured here. Set "
"this to zero to disable skirt completely."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1712
+#: src/libslic3r/PrintConfig.cpp:1905
msgid "Slow down if layer print time is below"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1713
+#: src/libslic3r/PrintConfig.cpp:1906
msgid ""
"If layer print time is estimated below this number of seconds, print moves "
"speed will be scaled down to extend duration to this value."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1722
+#: src/libslic3r/PrintConfig.cpp:1915
msgid "Small perimeters"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1724
+#: src/libslic3r/PrintConfig.cpp:1917
msgid ""
"This separate setting will affect the speed of perimeters having radius <= "
"6.5mm (usually holes). If expressed as percentage (for example: 80%) it will "
"be calculated on the perimeters speed setting above. Set to zero for auto."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1734
+#: src/libslic3r/PrintConfig.cpp:1927
msgid "Solid infill threshold area"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1736
+#: src/libslic3r/PrintConfig.cpp:1929
msgid ""
"Force solid infill for regions having a smaller area than the specified "
"threshold."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1737
+#: src/libslic3r/PrintConfig.cpp:1930
msgid "mm²"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1743
+#: src/libslic3r/PrintConfig.cpp:1936
msgid "Solid infill extruder"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1745
+#: src/libslic3r/PrintConfig.cpp:1938
msgid "The extruder to use when printing solid infill."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1751
+#: src/libslic3r/PrintConfig.cpp:1944
msgid "Solid infill every"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1753
+#: src/libslic3r/PrintConfig.cpp:1946
msgid ""
"This feature allows to force a solid layer every given number of layers. "
"Zero to disable. You can set this to any value (for example 9999); Slic3r "
@@ -8474,7 +10274,7 @@ msgid ""
"according to nozzle diameter and layer height."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1765
+#: src/libslic3r/PrintConfig.cpp:1958
msgid ""
"Set this to a non-zero value to set a manual extrusion width for infill for "
"solid surfaces. If left zero, default extrusion width will be used if set, "
@@ -8482,46 +10282,46 @@ msgid ""
"(for example 90%) it will be computed over layer height."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1776
+#: src/libslic3r/PrintConfig.cpp:1969
msgid ""
"Speed for printing solid regions (top/bottom/internal horizontal shells). "
"This can be expressed as a percentage (for example: 80%) over the default "
"infill speed above. Set to zero for auto."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1788
+#: src/libslic3r/PrintConfig.cpp:1981
msgid "Number of solid layers to generate on top and bottom surfaces."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1794 src/libslic3r/PrintConfig.cpp:1795
+#: src/libslic3r/PrintConfig.cpp:1987 src/libslic3r/PrintConfig.cpp:1988
msgid "Minimum thickness of a top / bottom shell"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1801
+#: src/libslic3r/PrintConfig.cpp:1994
msgid "Spiral vase"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1802
+#: src/libslic3r/PrintConfig.cpp:1995
msgid ""
"This feature will raise Z gradually while printing a single-walled object in "
"order to remove any visible seam. This option requires a single perimeter, "
"no infill, no top solid layers and no support material. You can still set "
"any number of bottom solid layers as well as skirt/brim loops. It won't work "
-"when printing more than an object."
+"when printing more than one single object."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1810
+#: src/libslic3r/PrintConfig.cpp:2003
msgid "Temperature variation"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1811
+#: src/libslic3r/PrintConfig.cpp:2004
msgid ""
"Temperature difference to be applied when an extruder is not active. Enables "
"a full-height \"sacrificial\" skirt on which the nozzles are periodically "
"wiped."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1821
+#: src/libslic3r/PrintConfig.cpp:2014
msgid ""
"This start procedure is inserted at the beginning, after bed has reached the "
"target temperature and extruder just started heating, and before extruder "
@@ -8532,7 +10332,7 @@ msgid ""
"put a \"M109 S[first_layer_temperature]\" command wherever you want."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1836
+#: src/libslic3r/PrintConfig.cpp:2029
msgid ""
"This start procedure is inserted at the beginning, after any printer start "
"gcode (and after any toolchange to this filament in case of multi-material "
@@ -8545,29 +10345,45 @@ msgid ""
"extruders, the gcode is processed in extruder order."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1852
+#: src/libslic3r/PrintConfig.cpp:2045
+msgid "Color change G-code"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2046
+msgid "This G-code will be used as a code for the color change"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2055
+msgid "This G-code will be used as a code for the pause print"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2064
+msgid "This G-code will be used as a custom code"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2072
msgid "Single Extruder Multi Material"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1853
+#: src/libslic3r/PrintConfig.cpp:2073
msgid "The printer multiplexes filaments into a single hot end."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1858
+#: src/libslic3r/PrintConfig.cpp:2078
msgid "Prime all printing extruders"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1859
+#: src/libslic3r/PrintConfig.cpp:2079
msgid ""
"If enabled, all printing extruders will be primed at the front edge of the "
"print bed at the start of the print."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1864
+#: src/libslic3r/PrintConfig.cpp:2084
msgid "No sparse layers (EXPERIMENTAL)"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1865
+#: src/libslic3r/PrintConfig.cpp:2085
msgid ""
"If enabled, the wipe tower will not be printed on layers with no "
"toolchanges. On layers with a toolchange, extruder will travel downward to "
@@ -8575,75 +10391,75 @@ msgid ""
"with the print."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1872
+#: src/libslic3r/PrintConfig.cpp:2092
msgid "Generate support material"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1874
+#: src/libslic3r/PrintConfig.cpp:2094
msgid "Enable support material generation."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1878
+#: src/libslic3r/PrintConfig.cpp:2098
msgid "Auto generated supports"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1880
+#: src/libslic3r/PrintConfig.cpp:2100
msgid ""
"If checked, supports will be generated automatically based on the overhang "
"threshold value. If unchecked, supports will be generated inside the "
"\"Support Enforcer\" volumes only."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1886
+#: src/libslic3r/PrintConfig.cpp:2106
msgid "XY separation between an object and its support"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1888
+#: src/libslic3r/PrintConfig.cpp:2108
msgid ""
"XY separation between an object and its support. If expressed as percentage "
"(for example 50%), it will be calculated over external perimeter width."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1898
+#: src/libslic3r/PrintConfig.cpp:2118
msgid "Pattern angle"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1900
+#: src/libslic3r/PrintConfig.cpp:2120
msgid ""
"Use this setting to rotate the support material pattern on the horizontal "
"plane."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1910 src/libslic3r/PrintConfig.cpp:2693
+#: src/libslic3r/PrintConfig.cpp:2130 src/libslic3r/PrintConfig.cpp:2925
msgid ""
"Only create support if it lies on a build plate. Don't create support on a "
"print."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1916
+#: src/libslic3r/PrintConfig.cpp:2136
msgid "Contact Z distance"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1918
+#: src/libslic3r/PrintConfig.cpp:2138
msgid ""
"The vertical distance between object and support material interface. Setting "
"this to 0 will also prevent Slic3r from using bridge flow and speed for the "
"first object layer."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1925
+#: src/libslic3r/PrintConfig.cpp:2145
msgid "0 (soluble)"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1926
+#: src/libslic3r/PrintConfig.cpp:2146
msgid "0.2 (detachable)"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1931
+#: src/libslic3r/PrintConfig.cpp:2151
msgid "Enforce support for the first"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1933
+#: src/libslic3r/PrintConfig.cpp:2153
msgid ""
"Generate support material for the specified number of layers counting from "
"bottom, regardless of whether normal support material is enabled or not and "
@@ -8651,21 +10467,21 @@ msgid ""
"of objects having a very thin or poor footprint on the build plate."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1938
+#: src/libslic3r/PrintConfig.cpp:2158
msgid "Enforce support for the first n layers"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1944
+#: src/libslic3r/PrintConfig.cpp:2164
msgid "Support material/raft/skirt extruder"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1946
+#: src/libslic3r/PrintConfig.cpp:2166
msgid ""
"The extruder to use when printing support material, raft and skirt (1+, 0 to "
"use the current extruder to minimize tool changes)."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1955
+#: src/libslic3r/PrintConfig.cpp:2175
msgid ""
"Set this to a non-zero value to set a manual extrusion width for support "
"material. If left zero, default extrusion width will be used if set, "
@@ -8673,89 +10489,89 @@ msgid ""
"example 90%) it will be computed over layer height."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1964
+#: src/libslic3r/PrintConfig.cpp:2184
msgid "Interface loops"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1966
+#: src/libslic3r/PrintConfig.cpp:2186
msgid ""
"Cover the top contact layer of the supports with loops. Disabled by default."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1971
+#: src/libslic3r/PrintConfig.cpp:2191
msgid "Support material/raft interface extruder"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1973
+#: src/libslic3r/PrintConfig.cpp:2193
msgid ""
"The extruder to use when printing support material interface (1+, 0 to use "
"the current extruder to minimize tool changes). This affects raft too."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1980
+#: src/libslic3r/PrintConfig.cpp:2200
msgid "Interface layers"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1982
+#: src/libslic3r/PrintConfig.cpp:2202
msgid ""
"Number of interface layers to insert between the object(s) and support "
"material."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1989
+#: src/libslic3r/PrintConfig.cpp:2209
msgid "Interface pattern spacing"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:1991
+#: src/libslic3r/PrintConfig.cpp:2211
msgid "Spacing between interface lines. Set zero to get a solid interface."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2000
+#: src/libslic3r/PrintConfig.cpp:2220
msgid ""
"Speed for printing support material interface layers. If expressed as "
"percentage (for example 50%) it will be calculated over support material "
"speed."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2009
+#: src/libslic3r/PrintConfig.cpp:2229
msgid "Pattern"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2011
+#: src/libslic3r/PrintConfig.cpp:2231
msgid "Pattern used to generate support material."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2017
+#: src/libslic3r/PrintConfig.cpp:2237
msgid "Rectilinear grid"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2023
+#: src/libslic3r/PrintConfig.cpp:2243
msgid "Pattern spacing"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2025
+#: src/libslic3r/PrintConfig.cpp:2245
msgid "Spacing between support material lines."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2034
+#: src/libslic3r/PrintConfig.cpp:2254
msgid "Speed for printing support material."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2041
+#: src/libslic3r/PrintConfig.cpp:2261
msgid "Synchronize with object layers"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2043
+#: src/libslic3r/PrintConfig.cpp:2263
msgid ""
"Synchronize support layers with the object print layers. This is useful with "
"multi-material printers, where the extruder switch is expensive."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2049
+#: src/libslic3r/PrintConfig.cpp:2269
msgid "Overhang threshold"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2051
+#: src/libslic3r/PrintConfig.cpp:2271
msgid ""
"Support material will not be generated for overhangs whose slope angle (90° "
"= vertical) is above the given threshold. In other words, this value "
@@ -8764,43 +10580,47 @@ msgid ""
"detection (recommended)."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2063
+#: src/libslic3r/PrintConfig.cpp:2283
msgid "With sheath around the support"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2065
+#: src/libslic3r/PrintConfig.cpp:2285
msgid ""
"Add a sheath (a single perimeter line) around the base support. This makes "
"the support more reliable, but also more difficult to remove."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2072
+#: src/libslic3r/PrintConfig.cpp:2292
msgid ""
-"Extruder temperature for layers after the first one. Set this to zero to "
-"disable temperature control commands in the output."
+"Nozzle temperature for layers after the first one. Set this to zero to "
+"disable temperature control commands in the output G-code."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2080
+#: src/libslic3r/PrintConfig.cpp:2295
+msgid "Nozzle temperature"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2301
msgid "Detect thin walls"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2082
+#: src/libslic3r/PrintConfig.cpp:2303
msgid ""
"Detect single-width walls (parts where two extrusions don't fit and we need "
"to collapse them into a single trace)."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2088
+#: src/libslic3r/PrintConfig.cpp:2309
msgid "Threads"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2089
+#: src/libslic3r/PrintConfig.cpp:2310
msgid ""
"Threads are used to parallelize long-running tasks. Optimal threads number "
"is slightly above the number of available cores/processors."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2101
+#: src/libslic3r/PrintConfig.cpp:2322
msgid ""
"This custom code is inserted before every toolchange. Placeholder variables "
"for all PrusaSlicer settings as well as {previous_extruder} and "
@@ -8810,7 +10630,7 @@ msgid ""
"behaviour both before and after the toolchange."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2114
+#: src/libslic3r/PrintConfig.cpp:2335
msgid ""
"Set this to a non-zero value to set a manual extrusion width for infill for "
"top surfaces. You may want to use thinner extrudates to fill all narrow "
@@ -8819,7 +10639,7 @@ msgid ""
"percentage (for example 90%) it will be computed over layer height."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2126
+#: src/libslic3r/PrintConfig.cpp:2347
msgid ""
"Speed for printing top solid layers (it only applies to the uppermost "
"external layers and not to their internal solid layers). You may want to "
@@ -8828,54 +10648,54 @@ msgid ""
"for auto."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2141
+#: src/libslic3r/PrintConfig.cpp:2362
msgid "Number of solid layers to generate on top surfaces."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2142
+#: src/libslic3r/PrintConfig.cpp:2363
msgid "Top solid layers"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2150
+#: src/libslic3r/PrintConfig.cpp:2371
msgid ""
"The number of top solid layers is increased above top_solid_layers if "
"necessary to satisfy minimum thickness of top shell. This is useful to "
"prevent pillowing effect when printing with variable layer height."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2153
+#: src/libslic3r/PrintConfig.cpp:2374
msgid "Minimum top shell thickness"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2160
+#: src/libslic3r/PrintConfig.cpp:2381
msgid "Speed for travel moves (jumps between distant extrusion points)."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2168
+#: src/libslic3r/PrintConfig.cpp:2389
msgid "Use firmware retraction"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2169
+#: src/libslic3r/PrintConfig.cpp:2390
msgid ""
"This experimental setting uses G10 and G11 commands to have the firmware "
"handle the retraction. This is only supported in recent Marlin."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2175
+#: src/libslic3r/PrintConfig.cpp:2396
msgid "Use relative E distances"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2176
+#: src/libslic3r/PrintConfig.cpp:2397
msgid ""
"If your firmware requires relative E values, check this, otherwise leave it "
"unchecked. Most firmwares use absolute values."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2182
+#: src/libslic3r/PrintConfig.cpp:2403
msgid "Use volumetric E"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2183
+#: src/libslic3r/PrintConfig.cpp:2404
msgid ""
"This experimental setting uses outputs the E values in cubic millimeters "
"instead of linear millimeters. If your firmware doesn't already know "
@@ -8885,127 +10705,127 @@ msgid ""
"only supported in recent Marlin."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2193
+#: src/libslic3r/PrintConfig.cpp:2414
msgid "Enable variable layer height feature"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2194
+#: src/libslic3r/PrintConfig.cpp:2415
msgid ""
"Some printers or printer setups may have difficulties printing with a "
"variable layer height. Enabled by default."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2200
+#: src/libslic3r/PrintConfig.cpp:2421
msgid "Wipe while retracting"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2201
+#: src/libslic3r/PrintConfig.cpp:2422
msgid ""
"This flag will move the nozzle while retracting to minimize the possible "
"blob on leaky extruders."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2208
+#: src/libslic3r/PrintConfig.cpp:2429
msgid ""
"Multi material printers may need to prime or purge extruders on tool "
"changes. Extrude the excess material into the wipe tower."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2214
+#: src/libslic3r/PrintConfig.cpp:2435
msgid "Purging volumes - load/unload volumes"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2215
+#: src/libslic3r/PrintConfig.cpp:2436
msgid ""
"This vector saves required volumes to change from/to each tool used on the "
"wipe tower. These values are used to simplify creation of the full purging "
"volumes below."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2221
+#: src/libslic3r/PrintConfig.cpp:2442
msgid "Purging volumes - matrix"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2222
+#: src/libslic3r/PrintConfig.cpp:2443
msgid ""
"This matrix describes volumes (in cubic milimetres) required to purge the "
"new filament on the wipe tower for any given pair of tools."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2231
+#: src/libslic3r/PrintConfig.cpp:2452
msgid "Position X"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2232
+#: src/libslic3r/PrintConfig.cpp:2453
msgid "X coordinate of the left front corner of a wipe tower"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2238
+#: src/libslic3r/PrintConfig.cpp:2459
msgid "Position Y"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2239
+#: src/libslic3r/PrintConfig.cpp:2460
msgid "Y coordinate of the left front corner of a wipe tower"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2246
+#: src/libslic3r/PrintConfig.cpp:2467
msgid "Width of a wipe tower"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2252
+#: src/libslic3r/PrintConfig.cpp:2473
msgid "Wipe tower rotation angle"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2253
+#: src/libslic3r/PrintConfig.cpp:2474
msgid "Wipe tower rotation angle with respect to x-axis."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2260
+#: src/libslic3r/PrintConfig.cpp:2481
msgid "Wipe into this object's infill"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2261
+#: src/libslic3r/PrintConfig.cpp:2482
msgid ""
"Purging after toolchange will done inside this object's infills. This lowers "
"the amount of waste but may result in longer print time due to additional "
"travel moves."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2268
+#: src/libslic3r/PrintConfig.cpp:2489
msgid "Wipe into this object"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2269
+#: src/libslic3r/PrintConfig.cpp:2490
msgid ""
"Object will be used to purge the nozzle after a toolchange to save material "
"that would otherwise end up in the wipe tower and decrease print time. "
"Colours of the objects will be mixed as a result."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2275
+#: src/libslic3r/PrintConfig.cpp:2496
msgid "Maximal bridging distance"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2276
+#: src/libslic3r/PrintConfig.cpp:2497
msgid "Maximal distance between supports on sparse infill sections."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2282
+#: src/libslic3r/PrintConfig.cpp:2503
msgid "XY Size Compensation"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2284
+#: src/libslic3r/PrintConfig.cpp:2505
msgid ""
"The object will be grown/shrunk in the XY plane by the configured value "
"(negative = inwards, positive = outwards). This might be useful for fine-"
"tuning hole sizes."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2292
+#: src/libslic3r/PrintConfig.cpp:2513
msgid "Z offset"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2293
+#: src/libslic3r/PrintConfig.cpp:2514
msgid ""
"This value will be added (or subtracted) from all the Z coordinates in the "
"output G-code. It is used to compensate for bad Z endstop position: for "
@@ -9013,408 +10833,414 @@ msgid ""
"print bed, set this to -0.3 (or fix your endstop)."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2360
+#: src/libslic3r/PrintConfig.cpp:2581
msgid "Display width"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2361
+#: src/libslic3r/PrintConfig.cpp:2582
msgid "Width of the display"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2366
+#: src/libslic3r/PrintConfig.cpp:2587
msgid "Display height"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2367
+#: src/libslic3r/PrintConfig.cpp:2588
msgid "Height of the display"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2372
+#: src/libslic3r/PrintConfig.cpp:2593
msgid "Number of pixels in"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2374
+#: src/libslic3r/PrintConfig.cpp:2595
msgid "Number of pixels in X"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2380
+#: src/libslic3r/PrintConfig.cpp:2601
msgid "Number of pixels in Y"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2385
+#: src/libslic3r/PrintConfig.cpp:2606
msgid "Display horizontal mirroring"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2386
+#: src/libslic3r/PrintConfig.cpp:2607
msgid "Mirror horizontally"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2387
+#: src/libslic3r/PrintConfig.cpp:2608
msgid "Enable horizontal mirroring of output images"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2392
+#: src/libslic3r/PrintConfig.cpp:2613
msgid "Display vertical mirroring"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2393
+#: src/libslic3r/PrintConfig.cpp:2614
msgid "Mirror vertically"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2394
+#: src/libslic3r/PrintConfig.cpp:2615
msgid "Enable vertical mirroring of output images"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2399
+#: src/libslic3r/PrintConfig.cpp:2620
msgid "Display orientation"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2400
+#: src/libslic3r/PrintConfig.cpp:2621
msgid ""
"Set the actual LCD display orientation inside the SLA printer. Portrait mode "
"will flip the meaning of display width and height parameters and the output "
"images will be rotated by 90 degrees."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2406
+#: src/libslic3r/PrintConfig.cpp:2627
msgid "Landscape"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2407
+#: src/libslic3r/PrintConfig.cpp:2628
msgid "Portrait"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2412
+#: src/libslic3r/PrintConfig.cpp:2633
msgid "Fast"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2413
+#: src/libslic3r/PrintConfig.cpp:2634
msgid "Fast tilt"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2414
+#: src/libslic3r/PrintConfig.cpp:2635
msgid "Time of the fast tilt"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2421
+#: src/libslic3r/PrintConfig.cpp:2642
msgid "Slow"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2422
+#: src/libslic3r/PrintConfig.cpp:2643
msgid "Slow tilt"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2423
+#: src/libslic3r/PrintConfig.cpp:2644
msgid "Time of the slow tilt"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2430
+#: src/libslic3r/PrintConfig.cpp:2651
msgid "Area fill"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2431
+#: src/libslic3r/PrintConfig.cpp:2652
msgid ""
"The percentage of the bed area. \n"
"If the print area exceeds the specified value, \n"
"then a slow tilt will be used, otherwise - a fast tilt"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2438 src/libslic3r/PrintConfig.cpp:2439
-#: src/libslic3r/PrintConfig.cpp:2440
+#: src/libslic3r/PrintConfig.cpp:2659 src/libslic3r/PrintConfig.cpp:2660
+#: src/libslic3r/PrintConfig.cpp:2661
msgid "Printer scaling correction"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2446 src/libslic3r/PrintConfig.cpp:2447
+#: src/libslic3r/PrintConfig.cpp:2667 src/libslic3r/PrintConfig.cpp:2668
msgid "Printer absolute correction"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2448
+#: src/libslic3r/PrintConfig.cpp:2669
msgid ""
"Will inflate or deflate the sliced 2D polygons according to the sign of the "
"correction."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2454
+#: src/libslic3r/PrintConfig.cpp:2675
msgid "Elephant foot minimum width"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2456
+#: src/libslic3r/PrintConfig.cpp:2677
msgid ""
"Minimum width of features to maintain when doing elephant foot compensation."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2463 src/libslic3r/PrintConfig.cpp:2464
+#: src/libslic3r/PrintConfig.cpp:2684 src/libslic3r/PrintConfig.cpp:2685
msgid "Printer gamma correction"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2465
+#: src/libslic3r/PrintConfig.cpp:2686
msgid ""
"This will apply a gamma correction to the rasterized 2D polygons. A gamma "
"value of zero means thresholding with the threshold in the middle. This "
"behaviour eliminates antialiasing without losing holes in polygons."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2477 src/libslic3r/PrintConfig.cpp:2478
+#: src/libslic3r/PrintConfig.cpp:2698 src/libslic3r/PrintConfig.cpp:2699
msgid "SLA material type"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2489 src/libslic3r/PrintConfig.cpp:2490
+#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2711
msgid "Initial layer height"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2496 src/libslic3r/PrintConfig.cpp:2497
+#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2718
msgid "Bottle volume"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2498
+#: src/libslic3r/PrintConfig.cpp:2719
msgid "ml"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2503 src/libslic3r/PrintConfig.cpp:2504
+#: src/libslic3r/PrintConfig.cpp:2724 src/libslic3r/PrintConfig.cpp:2725
msgid "Bottle weight"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2505
+#: src/libslic3r/PrintConfig.cpp:2726
msgid "kg"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2512
+#: src/libslic3r/PrintConfig.cpp:2733
msgid "g/ml"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2519
+#: src/libslic3r/PrintConfig.cpp:2740
msgid "money/bottle"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2524
+#: src/libslic3r/PrintConfig.cpp:2745
msgid "Faded layers"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2525
+#: src/libslic3r/PrintConfig.cpp:2746
msgid ""
"Number of the layers needed for the exposure time fade from initial exposure "
"time to the exposure time"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2532 src/libslic3r/PrintConfig.cpp:2533
+#: src/libslic3r/PrintConfig.cpp:2753 src/libslic3r/PrintConfig.cpp:2754
msgid "Minimum exposure time"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2540 src/libslic3r/PrintConfig.cpp:2541
+#: src/libslic3r/PrintConfig.cpp:2761 src/libslic3r/PrintConfig.cpp:2762
msgid "Maximum exposure time"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2548 src/libslic3r/PrintConfig.cpp:2549
+#: src/libslic3r/PrintConfig.cpp:2769 src/libslic3r/PrintConfig.cpp:2770
msgid "Exposure time"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2555 src/libslic3r/PrintConfig.cpp:2556
+#: src/libslic3r/PrintConfig.cpp:2776 src/libslic3r/PrintConfig.cpp:2777
msgid "Minimum initial exposure time"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2563 src/libslic3r/PrintConfig.cpp:2564
+#: src/libslic3r/PrintConfig.cpp:2784 src/libslic3r/PrintConfig.cpp:2785
msgid "Maximum initial exposure time"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2572
+#: src/libslic3r/PrintConfig.cpp:2792 src/libslic3r/PrintConfig.cpp:2793
msgid "Initial exposure time"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2578 src/libslic3r/PrintConfig.cpp:2579
+#: src/libslic3r/PrintConfig.cpp:2799 src/libslic3r/PrintConfig.cpp:2800
msgid "Correction for expansion"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2585
+#: src/libslic3r/PrintConfig.cpp:2806
msgid "SLA print material notes"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2586
+#: src/libslic3r/PrintConfig.cpp:2807
msgid "You can put your notes regarding the SLA print material here."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2598 src/libslic3r/PrintConfig.cpp:2609
+#: src/libslic3r/PrintConfig.cpp:2819 src/libslic3r/PrintConfig.cpp:2830
msgid "Default SLA material profile"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2620
+#: src/libslic3r/PrintConfig.cpp:2841
msgid "Generate supports"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2622
+#: src/libslic3r/PrintConfig.cpp:2843
msgid "Generate supports for the models"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2627
-msgid "Support head front diameter"
+#: src/libslic3r/PrintConfig.cpp:2848
+msgid "Pinhead front diameter"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2629
+#: src/libslic3r/PrintConfig.cpp:2850
msgid "Diameter of the pointing side of the head"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2636
-msgid "Support head penetration"
+#: src/libslic3r/PrintConfig.cpp:2857
+msgid "Head penetration"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2638
+#: src/libslic3r/PrintConfig.cpp:2859
msgid "How much the pinhead has to penetrate the model surface"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2645
-msgid "Support head width"
+#: src/libslic3r/PrintConfig.cpp:2866
+msgid "Pinhead width"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2647
+#: src/libslic3r/PrintConfig.cpp:2868
msgid "Width from the back sphere center to the front sphere center"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2655
-msgid "Support pillar diameter"
+#: src/libslic3r/PrintConfig.cpp:2876
+msgid "Pillar diameter"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2657
+#: src/libslic3r/PrintConfig.cpp:2878
msgid "Diameter in mm of the support pillars"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2665
+#: src/libslic3r/PrintConfig.cpp:2886
+msgid "Small pillar diameter percent"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2888
+msgid ""
+"The percentage of smaller pillars compared to the normal pillar diameter "
+"which are used in problematic areas where a normal pilla cannot fit."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2897
msgid "Max bridges on a pillar"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2667
+#: src/libslic3r/PrintConfig.cpp:2899
msgid ""
"Maximum number of bridges that can be placed on a pillar. Bridges hold "
"support point pinheads and connect to pillars as small branches."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2675
-msgid "Support pillar connection mode"
+#: src/libslic3r/PrintConfig.cpp:2907
+msgid "Pillar connection mode"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2676
+#: src/libslic3r/PrintConfig.cpp:2908
msgid ""
"Controls the bridge type between two neighboring pillars. Can be zig-zag, "
"cross (double zig-zag) or dynamic which will automatically switch between "
"the first two depending on the distance of the two pillars."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2684
+#: src/libslic3r/PrintConfig.cpp:2916
msgid "Zig-Zag"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2685
+#: src/libslic3r/PrintConfig.cpp:2917
msgid "Cross"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2686
+#: src/libslic3r/PrintConfig.cpp:2918
msgid "Dynamic"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2698
+#: src/libslic3r/PrintConfig.cpp:2930
msgid "Pillar widening factor"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2700
+#: src/libslic3r/PrintConfig.cpp:2932
msgid ""
"Merging bridges or pillars into another pillars can increase the radius. "
"Zero means no increase, one means full increase."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2709
+#: src/libslic3r/PrintConfig.cpp:2941
msgid "Support base diameter"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2711
+#: src/libslic3r/PrintConfig.cpp:2943
msgid "Diameter in mm of the pillar base"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2719
+#: src/libslic3r/PrintConfig.cpp:2951
msgid "Support base height"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2721
+#: src/libslic3r/PrintConfig.cpp:2953
msgid "The height of the pillar base cone"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2728
+#: src/libslic3r/PrintConfig.cpp:2960
msgid "Support base safety distance"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2731
+#: src/libslic3r/PrintConfig.cpp:2963
msgid ""
"The minimum distance of the pillar base from the model in mm. Makes sense in "
"zero elevation mode where a gap according to this parameter is inserted "
"between the model and the pad."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2741
+#: src/libslic3r/PrintConfig.cpp:2973
msgid "Critical angle"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2743
+#: src/libslic3r/PrintConfig.cpp:2975
msgid "The default angle for connecting support sticks and junctions."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2751
+#: src/libslic3r/PrintConfig.cpp:2983
msgid "Max bridge length"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2753
+#: src/libslic3r/PrintConfig.cpp:2985
msgid "The max length of a bridge"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2760
+#: src/libslic3r/PrintConfig.cpp:2992
msgid "Max pillar linking distance"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2762
+#: src/libslic3r/PrintConfig.cpp:2994
msgid ""
"The max distance of two pillars to get linked with each other. A zero value "
"will prohibit pillar cascading."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2770
-msgid "Object elevation"
-msgstr ""
-
-#: src/libslic3r/PrintConfig.cpp:2772
+#: src/libslic3r/PrintConfig.cpp:3004
msgid ""
"How much the supports should lift up the supported object. If \"Pad around "
"object\" is enabled, this value is ignored."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2783
+#: src/libslic3r/PrintConfig.cpp:3015
msgid "This is a relative measure of support points density."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2789
+#: src/libslic3r/PrintConfig.cpp:3021
msgid "Minimal distance of the support points"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2791
+#: src/libslic3r/PrintConfig.cpp:3023
msgid "No support points will be placed closer than this threshold."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2797
+#: src/libslic3r/PrintConfig.cpp:3029
msgid "Use pad"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2799
+#: src/libslic3r/PrintConfig.cpp:3031
msgid "Add a pad underneath the supported model"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2804
+#: src/libslic3r/PrintConfig.cpp:3036
msgid "Pad wall thickness"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2806
+#: src/libslic3r/PrintConfig.cpp:3038
msgid "The thickness of the pad and its optional cavity walls."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2814
+#: src/libslic3r/PrintConfig.cpp:3046
msgid "Pad wall height"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2815
+#: src/libslic3r/PrintConfig.cpp:3047
msgid ""
"Defines the pad cavity depth. Set to zero to disable the cavity. Be careful "
"when enabling this feature, as some resins may produce an extreme suction "
@@ -9422,115 +11248,111 @@ msgid ""
"difficult."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2828
+#: src/libslic3r/PrintConfig.cpp:3060
msgid "Pad brim size"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2829
+#: src/libslic3r/PrintConfig.cpp:3061
msgid "How far should the pad extend around the contained geometry"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2839
+#: src/libslic3r/PrintConfig.cpp:3071
msgid "Max merge distance"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2841
+#: src/libslic3r/PrintConfig.cpp:3073
msgid ""
"Some objects can get along with a few smaller pads instead of a single big "
"one. This parameter defines how far the center of two smaller pads should "
"be. If theyare closer, they will get merged into one pad."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2861
+#: src/libslic3r/PrintConfig.cpp:3093
msgid "Pad wall slope"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2863
+#: src/libslic3r/PrintConfig.cpp:3095
msgid ""
"The slope of the pad wall relative to the bed plane. 90 degrees means "
"straight walls."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2872
-msgid "Pad around object"
-msgstr ""
-
-#: src/libslic3r/PrintConfig.cpp:2874
+#: src/libslic3r/PrintConfig.cpp:3106
msgid "Create pad around object and ignore the support elevation"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2879
+#: src/libslic3r/PrintConfig.cpp:3111
msgid "Pad around object everywhere"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2881
+#: src/libslic3r/PrintConfig.cpp:3113
msgid "Force pad around object everywhere"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2886
+#: src/libslic3r/PrintConfig.cpp:3118
msgid "Pad object gap"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2888
+#: src/libslic3r/PrintConfig.cpp:3120
msgid ""
"The gap between the object bottom and the generated pad in zero elevation "
"mode."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2897
+#: src/libslic3r/PrintConfig.cpp:3129
msgid "Pad object connector stride"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2899
+#: src/libslic3r/PrintConfig.cpp:3131
msgid ""
"Distance between two connector sticks which connect the object and the "
"generated pad."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2906
+#: src/libslic3r/PrintConfig.cpp:3138
msgid "Pad object connector width"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2908
+#: src/libslic3r/PrintConfig.cpp:3140
msgid ""
"Width of the connector sticks which connect the object and the generated pad."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2915
+#: src/libslic3r/PrintConfig.cpp:3147
msgid "Pad object connector penetration"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2918
+#: src/libslic3r/PrintConfig.cpp:3150
msgid "How much should the tiny connectors penetrate into the model body."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2925
+#: src/libslic3r/PrintConfig.cpp:3157
msgid "Enable hollowing"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2927
+#: src/libslic3r/PrintConfig.cpp:3159
msgid "Hollow out a model to have an empty interior"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2932
+#: src/libslic3r/PrintConfig.cpp:3164
msgid "Wall thickness"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2934
+#: src/libslic3r/PrintConfig.cpp:3166
msgid "Minimum wall thickness of a hollowed model."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2942
+#: src/libslic3r/PrintConfig.cpp:3174
msgid "Accuracy"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2944
+#: src/libslic3r/PrintConfig.cpp:3176
msgid ""
"Performance vs accuracy of calculation. Lower values may produce unwanted "
"artifacts."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:2954
+#: src/libslic3r/PrintConfig.cpp:3186
msgid ""
"Hollowing is done in two steps: first, an imaginary interior is calculated "
"deeper (offset plus the closing distance) in the object and then it's "
@@ -9539,292 +11361,291 @@ msgid ""
"most."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3342
+#: src/libslic3r/PrintConfig.cpp:3602
msgid "Export OBJ"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3343
+#: src/libslic3r/PrintConfig.cpp:3603
msgid "Export the model(s) as OBJ."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3354
+#: src/libslic3r/PrintConfig.cpp:3614
msgid "Export SLA"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3355
+#: src/libslic3r/PrintConfig.cpp:3615
msgid "Slice the model and export SLA printing layers as PNG."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3360
+#: src/libslic3r/PrintConfig.cpp:3620
msgid "Export 3MF"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3361
+#: src/libslic3r/PrintConfig.cpp:3621
msgid "Export the model(s) as 3MF."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3365
+#: src/libslic3r/PrintConfig.cpp:3625
msgid "Export AMF"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3366
+#: src/libslic3r/PrintConfig.cpp:3626
msgid "Export the model(s) as AMF."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3370
+#: src/libslic3r/PrintConfig.cpp:3630
msgid "Export STL"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3371
+#: src/libslic3r/PrintConfig.cpp:3631
msgid "Export the model(s) as STL."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3376
+#: src/libslic3r/PrintConfig.cpp:3636
msgid "Slice the model and export toolpaths as G-code."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3381
+#: src/libslic3r/PrintConfig.cpp:3641
+msgid "G-code viewer"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3642
+msgid "Visualize an already sliced and saved G-code"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3647
msgid "Slice"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3382
+#: src/libslic3r/PrintConfig.cpp:3648
msgid ""
"Slice the model as FFF or SLA based on the printer_technology configuration "
"value."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3387
+#: src/libslic3r/PrintConfig.cpp:3653
msgid "Help"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3388
+#: src/libslic3r/PrintConfig.cpp:3654
msgid "Show this help."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3393
+#: src/libslic3r/PrintConfig.cpp:3659
msgid "Help (FFF options)"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3394
+#: src/libslic3r/PrintConfig.cpp:3660
msgid "Show the full list of print/G-code configuration options."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3398
+#: src/libslic3r/PrintConfig.cpp:3664
msgid "Help (SLA options)"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3399
+#: src/libslic3r/PrintConfig.cpp:3665
msgid "Show the full list of SLA print configuration options."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3403
+#: src/libslic3r/PrintConfig.cpp:3669
msgid "Output Model Info"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3404
+#: src/libslic3r/PrintConfig.cpp:3670
msgid "Write information about the model to the console."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3408
+#: src/libslic3r/PrintConfig.cpp:3674
msgid "Save config file"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3409
+#: src/libslic3r/PrintConfig.cpp:3675
msgid "Save configuration to the specified file."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3419
+#: src/libslic3r/PrintConfig.cpp:3685
msgid "Align XY"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3420
+#: src/libslic3r/PrintConfig.cpp:3686
msgid "Align the model to the given point."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3425
+#: src/libslic3r/PrintConfig.cpp:3691
msgid "Cut model at the given Z."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3446
+#: src/libslic3r/PrintConfig.cpp:3712
msgid "Center"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3447
+#: src/libslic3r/PrintConfig.cpp:3713
msgid "Center the print around the given center."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3451
+#: src/libslic3r/PrintConfig.cpp:3717
msgid "Don't arrange"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3452
+#: src/libslic3r/PrintConfig.cpp:3718
msgid ""
"Do not rearrange the given models before merging and keep their original XY "
"coordinates."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3455
+#: src/libslic3r/PrintConfig.cpp:3721
msgid "Duplicate"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3456
+#: src/libslic3r/PrintConfig.cpp:3722
msgid "Multiply copies by this factor."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3460
+#: src/libslic3r/PrintConfig.cpp:3726
msgid "Duplicate by grid"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3461
+#: src/libslic3r/PrintConfig.cpp:3727
msgid "Multiply copies by creating a grid."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3464
-msgid "Merge"
-msgstr ""
-
-#: src/libslic3r/PrintConfig.cpp:3465
+#: src/libslic3r/PrintConfig.cpp:3731
msgid ""
"Arrange the supplied models in a plate and merge them in a single model in "
"order to perform actions once."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3470
+#: src/libslic3r/PrintConfig.cpp:3736
msgid ""
"Try to repair any non-manifold meshes (this option is implicitly added "
"whenever we need to slice the model to perform the requested action)."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3474
+#: src/libslic3r/PrintConfig.cpp:3740
msgid "Rotation angle around the Z axis in degrees."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3478
+#: src/libslic3r/PrintConfig.cpp:3744
msgid "Rotate around X"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3479
+#: src/libslic3r/PrintConfig.cpp:3745
msgid "Rotation angle around the X axis in degrees."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3483
+#: src/libslic3r/PrintConfig.cpp:3749
msgid "Rotate around Y"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3484
+#: src/libslic3r/PrintConfig.cpp:3750
msgid "Rotation angle around the Y axis in degrees."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3489
+#: src/libslic3r/PrintConfig.cpp:3755
msgid "Scaling factor or percentage."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3494
+#: src/libslic3r/PrintConfig.cpp:3760
msgid ""
"Detect unconnected parts in the given model(s) and split them into separate "
"objects."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3497
+#: src/libslic3r/PrintConfig.cpp:3763
msgid "Scale to Fit"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3498
+#: src/libslic3r/PrintConfig.cpp:3764
msgid "Scale to fit the given volume."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3507
+#: src/libslic3r/PrintConfig.cpp:3773
msgid "Ignore non-existent config files"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3508
+#: src/libslic3r/PrintConfig.cpp:3774
msgid "Do not fail if a file supplied to --load does not exist."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3511
+#: src/libslic3r/PrintConfig.cpp:3777
msgid "Load config file"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3512
+#: src/libslic3r/PrintConfig.cpp:3778
msgid ""
"Load configuration from the specified file. It can be used more than once to "
"load options from multiple files."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3515
+#: src/libslic3r/PrintConfig.cpp:3781
msgid "Output File"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3516
+#: src/libslic3r/PrintConfig.cpp:3782
msgid ""
"The file where the output will be written (if not specified, it will be "
"based on the input file)."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3526
+#: src/libslic3r/PrintConfig.cpp:3786
+msgid "Single instance mode"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3787
+msgid ""
+"If enabled, the command line arguments are sent to an existing instance of "
+"GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides "
+"the \"single_instance\" configuration value from application preferences."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3798
msgid "Data directory"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3527
+#: src/libslic3r/PrintConfig.cpp:3799
msgid ""
"Load and store settings at the given directory. This is useful for "
"maintaining different profiles or including configurations from a network "
"storage."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3530
+#: src/libslic3r/PrintConfig.cpp:3802
msgid "Logging level"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3531
+#: src/libslic3r/PrintConfig.cpp:3803
msgid ""
"Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:"
"trace\n"
"For example. loglevel=2 logs fatal, error and warning level messages."
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3537
+#: src/libslic3r/PrintConfig.cpp:3809
msgid "Render with a software renderer"
msgstr ""
-#: src/libslic3r/PrintConfig.cpp:3538
+#: src/libslic3r/PrintConfig.cpp:3810
msgid ""
"Render with a software renderer. The bundled MESA software renderer is "
"loaded instead of the default OpenGL driver."
msgstr ""
-#: src/libslic3r/PrintObject.cpp:108
+#: src/libslic3r/Zipper.cpp:27
+msgid "Error with zip archive"
+msgstr ""
+
+#: src/libslic3r/PrintObject.cpp:112
msgid "Processing triangulated mesh"
msgstr ""
-#: src/libslic3r/PrintObject.cpp:152
+#: src/libslic3r/PrintObject.cpp:157
msgid "Generating perimeters"
msgstr ""
-#: src/libslic3r/PrintObject.cpp:255
+#: src/libslic3r/PrintObject.cpp:260
msgid "Preparing infill"
msgstr ""
-#: src/libslic3r/PrintObject.cpp:395
+#: src/libslic3r/PrintObject.cpp:421
msgid "Generating support material"
msgstr ""
-
-#: src/libslic3r/GCode/PreviewData.cpp:347
-msgid "Height (mm)"
-msgstr ""
-
-#: src/libslic3r/GCode/PreviewData.cpp:349
-msgid "Width (mm)"
-msgstr ""
-
-#: src/libslic3r/GCode/PreviewData.cpp:351
-msgid "Speed (mm/s)"
-msgstr ""
-
-#: src/libslic3r/GCode/PreviewData.cpp:353
-msgid "Fan Speed (%)"
-msgstr ""
-
-#: src/libslic3r/GCode/PreviewData.cpp:355
-msgid "Volumetric flow rate (mm³/s)"
-msgstr ""
diff --git a/resources/localization/cs/PrusaSlicer.mo b/resources/localization/cs/PrusaSlicer.mo
index 95c509366..18981be48 100644
--- a/resources/localization/cs/PrusaSlicer.mo
+++ b/resources/localization/cs/PrusaSlicer.mo
Binary files differ
diff --git a/resources/localization/cs/PrusaSlicer_cs.po b/resources/localization/cs/PrusaSlicer_cs.po
index cad51dbfa..0d23d1257 100644
--- a/resources/localization/cs/PrusaSlicer_cs.po
+++ b/resources/localization/cs/PrusaSlicer_cs.po
@@ -5,376 +5,399 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
-"X-Generator: Poedit 2.3\n"
-"Project-Id-Version: \n"
-"POT-Creation-Date: \n"
-"PO-Revision-Date: \n"
-"Last-Translator: \n"
-"Language-Team: \n"
-
-#: src/slic3r/GUI/MainFrame.cpp:66
-msgid " - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/releases"
-msgstr " - Nezapomeňte zkontrolovat aktualizace na http://github.com/prusa3d/PrusaSlicer/releases"
-
-#: src/slic3r/GUI/MainFrame.cpp:872
-msgid " was successfully sliced."
-msgstr " byl úspěšně slicován."
-
-#: src/libslic3r/PrintConfig.cpp:215 src/libslic3r/PrintConfig.cpp:792
-#: src/libslic3r/PrintConfig.cpp:1219 src/libslic3r/PrintConfig.cpp:1282
-#: src/libslic3r/PrintConfig.cpp:1532 src/libslic3r/PrintConfig.cpp:2425
-#: src/libslic3r/PrintConfig.cpp:2767
+"X-Generator: PhraseApp (phraseapp.com)\n"
+
+#: src/slic3r/GUI/Tab.cpp:4124
+msgid "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\nTo enable \"%1%\", please switch off \"%2%\""
+msgstr "\"%1%\" je deaktivováno, protože \"%2%\" je zapnuto v kategorii \"%3%\".\nChcete-li povolit \"%1%\",, vypněte \"%2%\""
+
+#: src/libslic3r/PrintConfig.cpp:249 src/libslic3r/PrintConfig.cpp:828
+#: src/libslic3r/PrintConfig.cpp:1148 src/libslic3r/PrintConfig.cpp:1327
+#: src/libslic3r/PrintConfig.cpp:1390 src/libslic3r/PrintConfig.cpp:1640
+#: src/libslic3r/PrintConfig.cpp:2568 src/libslic3r/PrintConfig.cpp:2805
+#: src/libslic3r/PrintConfig.cpp:2931
msgid "%"
msgstr "%"
-#: src/slic3r/GUI/GLCanvas3D.cpp:963
-#, c-format
-msgid "%.2f - %.2f mm"
-msgstr "%.2f - %.2f mm"
-
#. TRN Remove/Delete
-#: src/slic3r/GUI/Tab.cpp:3126
+#: src/slic3r/GUI/Tab.cpp:3425
msgid "%1% Preset"
msgstr "%1% Přednastavení"
-#: src/slic3r/GUI/Plater.cpp:4400
+#: src/slic3r/GUI/Plater.cpp:4423
msgid "%1% printer was active at the time the target Undo / Redo snapshot was taken. Switching to %1% printer requires reloading of %1% presets."
msgstr "%1% tiskárna byla aktivní v dobÄ›, kdy byly pořízeny kroky ZpÄ›t / VpÅ™ed. PÅ™epnutí na tiskárnu %1% vyžaduje opÄ›tovné naÄtení pÅ™edvoleb %1%."
-#: src/libslic3r/Print.cpp:1374
+#: src/slic3r/GUI/MainFrame.cpp:1585
+msgid "%1% was successfully sliced."
+msgstr "%1% byl úspěšně naslicován."
+
+#: src/libslic3r/Print.cpp:1400
msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm"
msgstr "%1%=%2% mm je příliš nízké na to, aby bylo možné tisknout ve výšce vrstvy %3% mm"
-#: src/slic3r/GUI/PresetHints.cpp:229
-#, c-format
+#: src/slic3r/GUI/PresetHints.cpp:228
+#, possible-c-format
msgid "%3.2f mm³/s at filament speed %3.2f mm/s."
msgstr "%3.2f mm³/s při rychlosti filamentu %3.2f mm/s."
-#: src/slic3r/GUI/Plater.cpp:1152
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:1061
+#, possible-c-format
msgid "%d (%d shells)"
msgstr "%d (%d obalů)"
-#: src/slic3r/GUI/Plater.cpp:1160
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:1069
+#, possible-c-format
msgid "%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d facets reversed, %d backwards edges"
msgstr "%d poškozených faset, %d okrajů opraveno, %d faset odstraněno, %d faset přidáno, %d faset navráceno, %d zadních okrajů"
-#: src/slic3r/GUI/PresetHints.cpp:270
-#, c-format
+#: src/slic3r/GUI/PresetHints.cpp:269
+#, possible-c-format
msgid "%d lines: %.2f mm"
msgstr "%d perimetry: %.2f mm"
-#: src/slic3r/GUI/MainFrame.cpp:1027
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:1728
+#, possible-c-format
msgid "%d presets successfully imported."
msgstr "%d přednastavení úspěšně importováno."
-#: src/slic3r/GUI/MainFrame.cpp:692
-#, c-format
+#: src/slic3r/GUI/GUI_App.cpp:718
+#, possible-c-format
+msgid "%s\nDo you want to continue?"
+msgstr "%s\nChcete pokraÄovat?"
+
+#: src/slic3r/GUI/MainFrame.cpp:917 src/slic3r/GUI/MainFrame.cpp:1316
+#, possible-c-format
msgid "%s &Website"
msgstr "%s &Webová stránka"
+#: src/slic3r/GUI/GUI_App.cpp:394
+#, possible-c-format
+msgid "%s - BREAKING CHANGE"
+msgstr "%s - ZLOMOVÃ ZMÄšNA"
+
+#: src/slic3r/GUI/Plater.cpp:1410
+#, possible-c-format
+msgid "%s - Drop project file"
+msgstr "%s - Otevírání projektu"
+
#: src/slic3r/GUI/UpdateDialogs.cpp:211
-#, c-format
+#, possible-c-format
msgid "%s configuration is incompatible"
msgstr "Konfigurace %s není kompatibilní"
-#: src/slic3r/GUI/Field.cpp:175
-#, c-format
+#: src/slic3r/GUI/Field.cpp:223
+#, possible-c-format
msgid "%s doesn't support percentage"
msgstr "%s nepodporuje procenta"
#: src/slic3r/GUI/MsgDialog.cpp:73
-#, c-format
+#, possible-c-format
msgid "%s error"
msgstr "%s chyba"
-#: src/slic3r/GUI/ConfigWizard.cpp:481
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:499
+#, possible-c-format
msgid "%s Family"
msgstr "%s Rodina"
#: src/slic3r/GUI/MsgDialog.cpp:74
-#, c-format
+#, possible-c-format
msgid "%s has encountered an error"
msgstr "Došlo k chybě v programu %s"
-#: src/slic3r/GUI/GUI_App.cpp:138
-#, c-format
-msgid ""
-"%s has encountered an error. It was likely caused by running out of memory. If you are sure you have enough RAM on your system, this may also be a bug and we would be glad if you reported it.\n"
-"\n"
-"The application will now terminate."
-msgstr ""
-"%s zaznamenal chybu. Bylo to pravděpodobně způsobeno nedostatkem paměti. Pokud jste si jisti, že máte v systému dostatek paměti RAM, může to být také chyba programu a v takovém případě bychom byli rádi, kdybyste nám to nahlásili.\n"
-"\n"
-"Aplikace se nyní ukonÄí."
+#: src/slic3r/GUI/GUI_App.cpp:528
+#, possible-c-format
+msgid "%s has encountered an error. It was likely caused by running out of memory. If you are sure you have enough RAM on your system, this may also be a bug and we would be glad if you reported it.\n\nThe application will now terminate."
+msgstr "%s zaznamenal chybu. Bylo to pravdÄ›podobnÄ› způsobeno nedostatkem pamÄ›ti. Pokud jste si jisti, že máte v systému dostatek pamÄ›ti RAM, může to být také chyba programu a v takovém případÄ› bychom byli rádi, kdybyste nám to nahlásili.\n\nAplikace se nyní ukonÄí."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:222
-#, c-format
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:62
+#, possible-c-format
msgid "%s has encountered an error. It was likely caused by running out of memory. If you are sure you have enough RAM on your system, this may also be a bug and we would be glad if you reported it."
msgstr "%s zaznamenal chybu. Bylo to pravděpodobně způsobeno nedostatkem paměti. Pokud jste si jisti, že máte v systému dostatek paměti RAM, může to být také chyba programu a v takovém případě bychom byli rádi, kdybyste nám to nahlásili."
-#: src/slic3r/GUI/UpdateDialogs.cpp:308
-#, c-format
+#: src/slic3r/GUI/UpdateDialogs.cpp:309
+#, possible-c-format
msgid "%s has no configuration updates available."
msgstr "%s nemá k dispozici žádné aktualizace konfigurace."
#: src/slic3r/GUI/UpdateDialogs.cpp:148 src/slic3r/GUI/UpdateDialogs.cpp:210
-#, c-format
+#, possible-c-format
msgid "%s incompatibility"
msgstr "Není kompatibilní s %s"
#: src/slic3r/GUI/UpdateDialogs.cpp:270
-#, c-format
-msgid ""
-"%s now uses an updated configuration structure.\n"
-"\n"
-"So called 'System presets' have been introduced, which hold the built-in default settings for various printers. These System presets cannot be modified, instead, users now may create their own presets inheriting settings from one of the System presets.\n"
-"An inheriting preset may either inherit a particular value from its parent or override it with a customized value.\n"
-"\n"
-"Please proceed with the %s that follows to set up the new presets and to choose whether to enable automatic preset updates."
-msgstr ""
-"%s nyní používá aktualizovanou konfiguraÄní strukturu.\n"
-"\n"
-"Byly uvedeny takzvaná \"Systémová pÅ™ednastavení\", která obsahují výchozí nastavení pro rozliÄné tiskárny. Tato systémová pÅ™ednastavení nemohou být upravena, místo toho si nyní uživatel může vytvoÅ™it svá vlastní pÅ™ednastavení tím, že zdÄ›dí nastavení z jednoho ze systémových pÅ™ednastavení.\n"
-"NovÄ› vytvoÅ™ené pÅ™ednastavení může buÄ zdÄ›dit urÄitou hodnotu od svého pÅ™edchůdce nebo ji pÅ™epsat upravenou hodnotou.\n"
-"\n"
-"Při nastavování nových předvoleb postupujte podle pokynů v %s a vyberte, zda chcete povolit automatické přednastavené aktualizace."
-
-#: src/slic3r/GUI/GUI_App.cpp:820
-#, c-format
+#, possible-c-format
+msgid "%s now uses an updated configuration structure.\n\nSo called 'System presets' have been introduced, which hold the built-in default settings for various printers. These System presets cannot be modified, instead, users now may create their own presets inheriting settings from one of the System presets.\nAn inheriting preset may either inherit a particular value from its parent or override it with a customized value.\n\nPlease proceed with the %s that follows to set up the new presets and to choose whether to enable automatic preset updates."
+msgstr "%s nyní používá aktualizovanou konfiguraÄní strukturu.\n\nByly uvedeny takzvaná \"Systémová pÅ™ednastavení\", která obsahují výchozí nastavení pro rozliÄné tiskárny. Tato systémová pÅ™ednastavení nemohou být upravena, místo toho si nyní uživatel může vytvoÅ™it svá vlastní pÅ™ednastavení tím, že zdÄ›dí nastavení z jednoho ze systémových pÅ™ednastavení.\nNovÄ› vytvoÅ™ené pÅ™ednastavení může buÄ zdÄ›dit urÄitou hodnotu od svého pÅ™edchůdce nebo ji pÅ™epsat upravenou hodnotou.\n\nPÅ™i nastavování nových pÅ™edvoleb postupujte podle pokynů v %s a vyberte, zda chcete povolit automatické pÅ™ednastavené aktualizace."
+
+#: src/slic3r/GUI/GUI_App.cpp:1512
+#, possible-c-format
msgid "%s View Mode"
msgstr "%s Režim zobrazení"
#: src/slic3r/GUI/UpdateDialogs.cpp:151
-#, c-format
-msgid ""
-"%s will now start updates. Otherwise it won't be able to start.\n"
-"\n"
-"Note that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n"
-"\n"
-"Updated configuration bundles:"
-msgstr ""
-"%s nyní spustí aktualizaci. Jinak nebude moci být spuštěn.\n"
-"\n"
-"Nejprve bude vytvořen kompletní snímek konfigurace a v případě problému s novou verzí lze provést obnovu.\n"
-"\n"
-"Aktualizované balíÄky konfigurace:"
-
-#: src/slic3r/GUI/MainFrame.cpp:705
-#, c-format
+#, possible-c-format
+msgid "%s will now start updates. Otherwise it won't be able to start.\n\nNote that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n\nUpdated configuration bundles:"
+msgstr "%s nyní spustí aktualizaci. Jinak nebude moci být spuÅ¡tÄ›n.\n\nNejprve bude vytvoÅ™en kompletní snímek konfigurace a v případÄ› problému s novou verzí lze provést obnovu.\n\nAktualizované balíÄky konfigurace:"
+
+#: src/slic3r/GUI/MainFrame.cpp:933 src/slic3r/GUI/MainFrame.cpp:937
+#: src/slic3r/GUI/MainFrame.cpp:1329
+#, possible-c-format
msgid "&About %s"
msgstr "&O %su"
-#: src/slic3r/GUI/GUI_App.cpp:908
+#: src/slic3r/GUI/MainFrame.cpp:1297
+msgid "&Collapse sidebar"
+msgstr "&Sbalit postranní panel"
+
+#: src/slic3r/GUI/GUI_App.cpp:1645
msgid "&Configuration"
msgstr "&Konfigurace"
-#: src/slic3r/GUI/GUI_App.cpp:800
+#: src/slic3r/GUI/GUI_App.cpp:1480
msgid "&Configuration Snapshots"
msgstr "Zálohy konfigura&ce"
-#: src/slic3r/GUI/MainFrame.cpp:588
+#: src/slic3r/GUI/MainFrame.cpp:1194
msgid "&Copy"
msgstr "&Kopírovat"
-#: src/slic3r/GUI/MainFrame.cpp:572
+#: src/slic3r/GUI/MainFrame.cpp:1178
msgid "&Delete selected"
msgstr "Sma&zat vybrané"
-#: src/slic3r/GUI/MainFrame.cpp:722
+#: src/slic3r/GUI/MainFrame.cpp:1348 src/slic3r/GUI/MainFrame.cpp:1358
msgid "&Edit"
msgstr "&Editovat"
-#: src/slic3r/GUI/MainFrame.cpp:506
+#: src/slic3r/GUI/MainFrame.cpp:1103
msgid "&Export"
msgstr "&Exportovat"
-#: src/slic3r/GUI/MainFrame.cpp:617 src/slic3r/GUI/MainFrame.cpp:752
+#: src/slic3r/GUI/MainFrame.cpp:1224 src/slic3r/GUI/MainFrame.cpp:1451
msgid "&Filament Settings Tab"
-msgstr "Panel nastavení &filamentu"
+msgstr "Panel Nastavení &filamentu"
-#: src/slic3r/GUI/MainFrame.cpp:721
+#: src/slic3r/GUI/MainFrame.cpp:1347 src/slic3r/GUI/MainFrame.cpp:1357
+#: src/slic3r/GUI/MainFrame.cpp:1417
msgid "&File"
msgstr "&Soubor"
-#: src/slic3r/GUI/ConfigWizard.cpp:1981
+#: src/slic3r/GUI/ConfigWizard.cpp:2492
msgid "&Finish"
msgstr "&DokonÄit"
-#: src/slic3r/GUI/MainFrame.cpp:727
+#: src/slic3r/GUI/MainFrame.cpp:1141
+msgid "&G-code preview"
+msgstr "&G-code prohlížeÄ"
+
+#: src/slic3r/GUI/MainFrame.cpp:1353 src/slic3r/GUI/MainFrame.cpp:1363
+#: src/slic3r/GUI/MainFrame.cpp:1423
msgid "&Help"
msgstr "&Pomoc"
-#: src/slic3r/GUI/MainFrame.cpp:474
+#: src/slic3r/GUI/MainFrame.cpp:1065
msgid "&Import"
msgstr "&Importovat"
-#: src/slic3r/GUI/GUI_App.cpp:822
+#: src/slic3r/GUI/GUI_App.cpp:1517
msgid "&Language"
msgstr "&Jazyk"
-#: src/slic3r/GUI/MainFrame.cpp:405
+#: src/slic3r/GUI/MainFrame.cpp:986
msgid "&New Project"
msgstr "&Nový projekt"
-#: src/slic3r/GUI/ConfigWizard.cpp:1980
+#: src/slic3r/GUI/ConfigWizard.cpp:2491
msgid "&Next >"
msgstr "&Další>"
-#: src/slic3r/GUI/MainFrame.cpp:408
+#: src/slic3r/GUI/MainFrame.cpp:1391
+msgid "&Open G-code"
+msgstr "&Otevřít G-code"
+
+#: src/slic3r/GUI/MainFrame.cpp:989
msgid "&Open Project"
msgstr "&Otevřít projekt"
-#: src/slic3r/GUI/MainFrame.cpp:591
+#: src/slic3r/GUI/MainFrame.cpp:1197
msgid "&Paste"
msgstr "Vloži&t"
-#: src/slic3r/GUI/MainFrame.cpp:606
+#: src/slic3r/GUI/MainFrame.cpp:1216
msgid "&Plater Tab"
msgstr "&Panel Podložka"
-#: src/slic3r/GUI/GUI_App.cpp:804
+#: src/slic3r/GUI/GUI_App.cpp:1487
msgid "&Preferences"
msgstr "Nas&tavení"
-#: src/slic3r/GUI/MainFrame.cpp:540
+#: src/slic3r/GUI/MainFrame.cpp:1144 src/slic3r/GUI/MainFrame.cpp:1402
msgid "&Quit"
msgstr "UkonÄi&t"
-#: src/slic3r/GUI/MainFrame.cpp:583
+#: src/slic3r/GUI/MainFrame.cpp:1189
msgid "&Redo"
msgstr "&Vpřed"
-#: src/slic3r/GUI/MainFrame.cpp:536
+#: src/slic3r/GUI/MainFrame.cpp:1137
msgid "&Repair STL file"
msgstr "Op&ravit soubor STL"
-#: src/slic3r/GUI/MainFrame.cpp:446
+#: src/slic3r/GUI/MainFrame.cpp:1028
msgid "&Save Project"
msgstr "&Uložit projekt"
-#: src/slic3r/GUI/MainFrame.cpp:565
+#: src/slic3r/GUI/MainFrame.cpp:1171
msgid "&Select all"
msgstr "Vybrat &vše"
-#: src/slic3r/GUI/MainFrame.cpp:580
+#: src/slic3r/GUI/MainFrame.cpp:1186
msgid "&Undo"
msgstr "&Zpět"
-#: src/slic3r/GUI/MainFrame.cpp:724
+#: src/slic3r/GUI/MainFrame.cpp:1350 src/slic3r/GUI/MainFrame.cpp:1360
+#: src/slic3r/GUI/MainFrame.cpp:1418
msgid "&View"
msgstr "&Zobrazení"
-#: src/slic3r/GUI/MainFrame.cpp:723
+#: src/slic3r/GUI/MainFrame.cpp:1349 src/slic3r/GUI/MainFrame.cpp:1359
msgid "&Window"
msgstr "&Okno"
-#: src/slic3r/GUI/ConfigWizard.cpp:603 src/slic3r/GUI/ConfigWizard.cpp:631
+#: src/slic3r/GUI/ConfigWizard.cpp:662 src/slic3r/GUI/ConfigWizard.cpp:812
+#: src/slic3r/GUI/ConfigWizard.cpp:873 src/slic3r/GUI/ConfigWizard.cpp:1007
msgid "(All)"
msgstr "(VÅ¡echny)"
-#: src/libslic3r/PrintConfig.cpp:1446
+#: src/slic3r/GUI/Plater.cpp:1195
+msgid "(including spool)"
+msgstr "(vÄetnÄ› cívky)"
+
+#: src/libslic3r/PrintConfig.cpp:1554
msgid "(minimum)"
msgstr "(minimálně)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:116
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:109
msgid "(Re)slice"
msgstr "(Znovu)Slicovat"
-#: src/slic3r/GUI/MainFrame.cpp:532
+#: src/slic3r/GUI/MainFrame.cpp:1133
msgid "(Re)Slice No&w"
msgstr "&(Znovu) Slicovat"
-#: src/libslic3r/PrintConfig.cpp:771 src/libslic3r/PrintConfig.cpp:2587
+#: src/libslic3r/PrintConfig.cpp:807 src/libslic3r/PrintConfig.cpp:2730
msgid "(Unknown)"
msgstr "(Neznámý)"
-#: src/slic3r/GUI/MainFrame.cpp:790
+#: src/slic3r/GUI/MainFrame.cpp:1491
msgid ") not found."
msgstr ") nebyl nalezen."
-#: src/libslic3r/PrintConfig.cpp:1918
+#: src/libslic3r/PrintConfig.cpp:1085
+msgid "0 (no open anchors)"
+msgstr "0 (žádné otevřené kotvy)"
+
+#: src/libslic3r/PrintConfig.cpp:1107
+msgid "0 (not anchored)"
+msgstr "0 (není ukotven)"
+
+#: src/libslic3r/PrintConfig.cpp:2060
msgid "0 (soluble)"
msgstr "0 (rozpustné)"
-#: src/libslic3r/PrintConfig.cpp:1919
+#: src/libslic3r/PrintConfig.cpp:2061
msgid "0.2 (detachable)"
msgstr "0.2 (oddělitelné)"
-#: src/slic3r/GUI/MainFrame.cpp:626
+#: src/libslic3r/PrintConfig.cpp:1090 src/libslic3r/PrintConfig.cpp:1112
+msgid "1000 (unlimited)"
+msgstr "1 000 (neomezenÄ›)"
+
+#: src/slic3r/GUI/MainFrame.cpp:1234
msgid "3&D"
msgstr "3&D"
-#: src/slic3r/GUI/Plater.cpp:4097
+#: src/slic3r/GUI/Plater.cpp:4044
msgid "3D editor view"
msgstr "Zobrazení 3D editoru"
-#: src/libslic3r/PrintConfig.cpp:851
+#: src/libslic3r/PrintConfig.cpp:889
msgid "3D Honeycomb"
msgstr "3D Plástev"
-#: src/slic3r/GUI/Mouse3DController.cpp:274
+#: src/slic3r/GUI/NotificationManager.hpp:318
+msgid "3D Mouse disconnected."
+msgstr "3D myš odpojena."
+
+#: src/slic3r/GUI/Mouse3DController.cpp:263
msgid "3Dconnexion settings"
msgstr "Nastavení 3DConnexion"
-#: src/slic3r/GUI/Plater.cpp:5038
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:5167
+#, possible-c-format
msgid "3MF file exported to %s"
msgstr "Soubor 3MF byl exportován do %s"
-#: src/slic3r/GUI/ConfigWizard.cpp:1979
+#: src/slic3r/GUI/ConfigWizard.cpp:2490
msgid "< &Back"
msgstr "<&Zpět"
-#: src/libslic3r/PrintConfig.cpp:287
+#: src/libslic3r/PrintConfig.cpp:321
msgid "A boolean expression using the configuration values of an active print profile. If this expression evaluates to true, this profile is considered compatible with the active print profile."
msgstr "Logický výraz může používat konfiguraÄní hodnoty aktivního profilu tiskárny. Pokud je tento logický výraz pravdivý, potom je tento profil považován za kompatibilní s aktivním profilem tiskárny."
-#: src/libslic3r/PrintConfig.cpp:272
+#: src/libslic3r/PrintConfig.cpp:306
msgid "A boolean expression using the configuration values of an active printer profile. If this expression evaluates to true, this profile is considered compatible with the active printer profile."
msgstr "Logický výraz může používat konfiguraÄní hodnoty aktivního profilu tiskárny. Pokud je tento logický výraz pravdivý, potom je tento profil považován za kompatibilní s aktivním profilem tiskárny."
-#: src/slic3r/GUI/Tab.cpp:975
+#: src/slic3r/GUI/Tab.cpp:1237
msgid "A copy of the current system preset will be created, which will be detached from the system preset."
msgstr "Bude vytvořena oddělená kopie aktuálního systémového přednastavení."
-#: src/slic3r/GUI/ConfigWizard.cpp:1034
+#: src/slic3r/GUI/ConfigWizard.cpp:1400
msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS."
msgstr "Obecným pravidlem je 160 až 230 °C pro PLA a 215 až 250 °C pro ABS."
-#: src/slic3r/GUI/ConfigWizard.cpp:1048
+#: src/slic3r/GUI/ConfigWizard.cpp:1414
msgid "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have no heated bed."
msgstr "Obecným pravidlem je 60 °C pro PLA a 110 °C pro ABS. Zadejte nula, pokud nemáte vyhřívanou podložku."
-#: src/slic3r/GUI/GLCanvas3D.cpp:686
-msgid "A toolpath outside the print area was detected"
-msgstr "Byla detekována dráha mimo tiskovou oblast"
+#: src/slic3r/GUI/GLCanvas3D.cpp:634
+msgid "A toolpath outside the print area was detected."
+msgstr "Byla detekována cesta mimo tiskovou oblast."
-#: src/slic3r/GUI/AboutDialog.cpp:199
-#, c-format
+#: src/slic3r/GUI/AboutDialog.cpp:212 src/slic3r/GUI/AboutDialog.cpp:215
+#, possible-c-format
msgid "About %s"
msgstr "O %s"
-#: src/slic3r/GUI/GLCanvas3D.cpp:959
-#, c-format
-msgid "above %.2f mm"
-msgstr "nad %.2f mm"
+#: src/slic3r/GUI/GCodeViewer.cpp:2189
+msgid "above"
+msgstr "nad"
-#: src/libslic3r/PrintConfig.cpp:1569
+#: src/libslic3r/PrintConfig.cpp:1677
msgid "Above Z"
msgstr "Nad Z"
-#: src/slic3r/GUI/Tab.cpp:1164
+#: src/slic3r/GUI/Tab.cpp:1494
msgid "Acceleration control (advanced)"
msgstr "Kontrola akcelerací (pokroÄilé)"
-#: src/libslic3r/PrintConfig.cpp:2925
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:221
+#: src/libslic3r/PrintConfig.cpp:3089
msgid "Accuracy"
msgstr "Přesnost"
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:59
+msgid "Accurate"
+msgstr "Přesné"
+
+#: src/slic3r/GUI/Plater.cpp:1423
+msgid "Action"
+msgstr "Akce"
+
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78
msgid "Activate"
msgstr "Aktivovat"
@@ -383,67 +406,75 @@ msgstr "Aktivovat"
msgid "Active"
msgstr "Aktivní"
-#: src/slic3r/GUI/DoubleSlider.cpp:1135 src/slic3r/GUI/GUI_ObjectList.cpp:1705
+#: src/slic3r/GUI/DoubleSlider.cpp:1264 src/slic3r/GUI/GUI_ObjectList.cpp:1833
msgid "active"
msgstr "aktivní"
-#: src/slic3r/GUI/GLCanvas3D.cpp:267
+#: src/slic3r/GUI/GLCanvas3D.cpp:254
msgid "Adaptive"
msgstr "Adaptivní"
-#: src/slic3r/GUI/Tab.cpp:241
-msgid "Add a new printer"
-msgstr "Přidat novou tiskárnu"
+#: src/libslic3r/PrintConfig.cpp:894
+msgid "Adaptive Cubic"
+msgstr "Kubická adaptivní"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:314
+msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\""
+msgstr "Přidat \"%1%\" jako další přednasatevení pro fyzickou tikárnu \"%2%\""
-#: src/libslic3r/PrintConfig.cpp:2782
+#: src/libslic3r/PrintConfig.cpp:2946
msgid "Add a pad underneath the supported model"
msgstr "Pod podepíraný model přidá podložku"
-#: src/libslic3r/PrintConfig.cpp:2058
+#: src/libslic3r/PrintConfig.cpp:2200
msgid "Add a sheath (a single perimeter line) around the base support. This makes the support more reliable, but also more difficult to remove."
msgstr "PÅ™idá pouzdro (jednu obvodovou Äáru) kolem podpÄ›r. Díky tomu je podpora spolehlivÄ›jší, ale také obtížnÄ›jší na odstranÄ›ní."
-#: src/slic3r/GUI/DoubleSlider.cpp:991
+#: src/slic3r/GUI/DoubleSlider.cpp:1114
msgid "Add another code - Ctrl + Left click"
msgstr "Přidat další kód - Ctrl + Levé kliknutí"
-#: src/slic3r/GUI/DoubleSlider.cpp:992
+#: src/slic3r/GUI/DoubleSlider.cpp:1115
msgid "Add another code - Right click"
msgstr "PÅ™idání jiného kódu - Pravé tlaÄítko"
-#: src/slic3r/GUI/DoubleSlider.cpp:1477
+#: src/slic3r/GUI/DoubleSlider.cpp:1665
msgid "Add color change"
msgstr "Přidat změnu barvy"
-#: src/slic3r/GUI/DoubleSlider.cpp:1180
+#: src/slic3r/GUI/DoubleSlider.cpp:1307
msgid "Add color change (%1%) for:"
msgstr "Přidat změnu barvy (%1%) pro:"
-#: src/slic3r/GUI/DoubleSlider.cpp:988
+#: src/slic3r/GUI/DoubleSlider.cpp:1111
msgid "Add color change - Left click"
msgstr "PÅ™idat zmÄ›nu barvy - Levé tlaÄítko myÅ¡i"
-#: src/slic3r/GUI/DoubleSlider.cpp:986
+#: src/slic3r/GUI/DoubleSlider.cpp:1109
msgid "Add color change - Left click for predefined color or Shift + Left click for custom color selection"
msgstr "PÅ™idat zmÄ›nu barvy - Levé tlaÄítko myÅ¡i pro pÅ™eddefinovanou barvu, nebo Shift + Levé tlaÄítko myÅ¡i pro výbÄ›r vlastní barvy"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
msgid "Add color change marker for current layer"
msgstr "PÅ™idat znaÄku zmÄ›ny barvy pro aktuální vrstvu"
-#: src/slic3r/GUI/DoubleSlider.cpp:1490
+#: src/slic3r/GUI/DoubleSlider.cpp:1682
msgid "Add custom G-code"
msgstr "Přidat vlastní G-code"
-#: src/slic3r/GUI/GLCanvas3D.cpp:240
+#: src/slic3r/GUI/DoubleSlider.cpp:1679
+msgid "Add custom template"
+msgstr "Přidat vlastní šablonu"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:235
msgid "Add detail"
msgstr "Přidat detail"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:421
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:308
msgid "Add drainage hole"
msgstr "Přidání odtokového otvoru"
-#: src/slic3r/GUI/DoubleSlider.cpp:984
+#: src/slic3r/GUI/DoubleSlider.cpp:1107
msgid "Add extruder change - Left click"
msgstr "PÅ™idat zmÄ›nu extruderu - Levé tlaÄítko myÅ¡i"
@@ -451,30 +482,30 @@ msgstr "PÅ™idat zmÄ›nu extruderu - Levé tlaÄítko myÅ¡i"
msgid "Add extruder to sequence"
msgstr "Přidat extruder do seznamu"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1993
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2152
msgid "Add Generic Subobject"
msgstr "PÅ™idání obecného DílÄího objektu"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2896
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2925
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2943
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3297
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3325
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3345
msgid "Add Height Range"
msgstr "Přidání Rozsahu vrstev"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4526 src/slic3r/GUI/Plater.cpp:3788
-#: src/slic3r/GUI/Plater.cpp:3800 src/slic3r/GUI/Plater.cpp:3940
+#: src/slic3r/GUI/GLCanvas3D.cpp:4892 src/slic3r/GUI/Plater.cpp:3708
+#: src/slic3r/GUI/Plater.cpp:3720 src/slic3r/GUI/Plater.cpp:3858
msgid "Add instance"
msgstr "Přidat instanci"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:159
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:153
msgid "Add Instance of the selected object"
msgstr "Přidat instanci vybraného objektu"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:162
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:165
msgid "Add layer range"
msgstr "Přidat rozsah vrstev"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2328
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2692
msgid "Add Layers"
msgstr "Přidat Vrstvy"
@@ -482,12 +513,12 @@ msgstr "Přidat Vrstvy"
msgid "Add modifier"
msgstr "Přidat modifikátor"
-#: src/libslic3r/PrintConfig.cpp:479
-#, no-c-format
+#: src/libslic3r/PrintConfig.cpp:515
+#, possible-c-format
msgid "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r keeps adding perimeters, until more than 70% of the loop immediately above is supported."
msgstr "PÅ™idání více perimetrů, pokud je potÅ™eba, pro vyvarování se tvorbÄ› mezer v Å¡ikmých plochách. Slic3r pokraÄuje v pÅ™idávání perimetrů, dokud není podepÅ™eno více než 70% perimetrů v následující vrstvÄ›."
-#: src/slic3r/GUI/Plater.cpp:3940
+#: src/slic3r/GUI/Plater.cpp:3858
msgid "Add one more instance of the selected object"
msgstr "Přidejte jednu nebo více instancí vybraného objektu"
@@ -495,52 +526,61 @@ msgstr "Přidejte jednu nebo více instancí vybraného objektu"
msgid "Add part"
msgstr "Přidat díl"
-#: src/slic3r/GUI/DoubleSlider.cpp:1487
+#: src/slic3r/GUI/DoubleSlider.cpp:1675
msgid "Add pause print"
msgstr "Přidat pozastavení tisku"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363
+#: src/slic3r/GUI/PresetComboBoxes.cpp:627
+#: src/slic3r/GUI/PresetComboBoxes.cpp:674
+msgid "Add physical printer"
+msgstr "Přidat fyzickou tiskárnu"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210
msgid "Add point"
msgstr "Přidat bod"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213
msgid "Add point to selection"
msgstr "Přidat bod k výběru"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1509
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:180
+msgid "Add preset for this printer device"
+msgstr "Přidat přednastavení pro tuto tiskárnu"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1640
msgid "Add settings"
msgstr "Přidat nastavení"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1386
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1517
msgid "Add Settings Bundle for Height range"
msgstr "Přidání Skupiny nastavení pro Výškový rozsah"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1388
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1519
msgid "Add Settings Bundle for Object"
msgstr "Přidání skupiny nastavení pro Objekt"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1387
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1518
msgid "Add Settings Bundle for Sub-object"
msgstr "PÅ™idání skupiny nastavení pro DílÄí objekt"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1314
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1445
msgid "Add Settings for Layers"
msgstr "Přidání nastavení pro Vrstvy"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1316
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1447
msgid "Add Settings for Object"
msgstr "Přidání nastavení pro Objekty"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1315
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1446
msgid "Add Settings for Sub-object"
msgstr "PÅ™idání nastavení pro DílÄí objeky"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1793
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2051
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1953
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2210
msgid "Add Shape"
msgstr "Přidat Tvar"
-#: src/libslic3r/PrintConfig.cpp:409
+#: src/libslic3r/PrintConfig.cpp:443
msgid "Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top+bottom solid layers)."
msgstr "Přidá plnou výplň u šikmých ploch pro garanci tloušťky svislých stěn (vrchních a spodních plných vrstev)."
@@ -552,11 +592,19 @@ msgstr "Přidat blokátor podpěr"
msgid "Add support enforcer"
msgstr "Přidat vynucení podpěr"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:494
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:374
msgid "Add support point"
msgstr "Přidání podpěrného bodu"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4467
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:371
+msgid "Add supports"
+msgstr "Přidání podpěr"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:293
+msgid "Add supports by angle"
+msgstr "Přidat podpěry dle úhlu"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4833
msgid "Add..."
msgstr "Přidat..."
@@ -564,23 +612,29 @@ msgstr "Přidat..."
msgid "Add/Remove filaments"
msgstr "Přidání / Odebrání filamentů"
-#: src/slic3r/GUI/Preset.cpp:1201
+#: src/slic3r/GUI/PresetComboBoxes.cpp:813
msgid "Add/Remove materials"
msgstr "Přidání / Odebrání materiálů"
-#: src/slic3r/GUI/Preset.cpp:1203
+#: src/slic3r/GUI/PresetComboBoxes.cpp:622
+#: src/slic3r/GUI/PresetComboBoxes.cpp:669
+msgid "Add/Remove presets"
+msgstr "Přidat/Odebrat přednastavení"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:815
+#: src/slic3r/GUI/PresetComboBoxes.cpp:972
msgid "Add/Remove printers"
msgstr "Přidat/Odebrat tiskárny"
-#: src/slic3r/GUI/Tab.cpp:970
+#: src/slic3r/GUI/Tab.cpp:1288
msgid "Additional information:"
msgstr "Doplňující informace:"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:59
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:62
msgid "Additional Settings"
msgstr "Další nastavení"
-#: src/slic3r/GUI/ConfigWizard.cpp:791
+#: src/slic3r/GUI/ConfigWizard.cpp:1150
msgid "Additionally a backup snapshot of the whole configuration is created before an update is applied."
msgstr "Dále je před nainstalováním aktualizace vytvořena záloha veškerého nastavení."
@@ -588,23 +642,22 @@ msgstr "Dále je před nainstalováním aktualizace vytvořena záloha veškeré
msgid "Address"
msgstr "Adresa"
-#: src/slic3r/GUI/GUI_App.cpp:814 src/slic3r/GUI/GUI_ObjectList.cpp:104
-#: src/slic3r/GUI/GUI_ObjectList.cpp:622 src/slic3r/GUI/Tab.cpp:1087
-#: src/slic3r/GUI/Tab.cpp:1102 src/slic3r/GUI/Tab.cpp:1201
-#: src/slic3r/GUI/Tab.cpp:1204 src/slic3r/GUI/Tab.cpp:1470
-#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:3661
-#: src/slic3r/GUI/wxExtensions.cpp:754 src/libslic3r/PrintConfig.cpp:88
-#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:223
-#: src/libslic3r/PrintConfig.cpp:1037 src/libslic3r/PrintConfig.cpp:2276
-#: src/libslic3r/PrintConfig.cpp:2448
+#: src/slic3r/GUI/GUI_ObjectList.cpp:102 src/slic3r/GUI/GUI_ObjectList.cpp:661
+#: src/slic3r/GUI/Tab.cpp:1409 src/slic3r/GUI/Tab.cpp:1430
+#: src/slic3r/GUI/Tab.cpp:1531 src/slic3r/GUI/Tab.cpp:1534
+#: src/slic3r/GUI/Tab.cpp:1816 src/slic3r/GUI/Tab.cpp:2152
+#: src/slic3r/GUI/Tab.cpp:4080 src/libslic3r/PrintConfig.cpp:90
+#: src/libslic3r/PrintConfig.cpp:121 src/libslic3r/PrintConfig.cpp:257
+#: src/libslic3r/PrintConfig.cpp:1081 src/libslic3r/PrintConfig.cpp:2419
+#: src/libslic3r/PrintConfig.cpp:2591
msgid "Advanced"
msgstr "PokroÄilý"
-#: src/slic3r/GUI/ConfigWizard.cpp:821
+#: src/slic3r/GUI/ConfigWizard.cpp:1180
msgid "Advanced mode"
msgstr "PokroÄilý režim"
-#: src/slic3r/GUI/GUI_App.cpp:814
+#: src/slic3r/GUI/GUI_App.cpp:1506
msgid "Advanced View Mode"
msgstr "PokroÄilý režim"
@@ -612,227 +665,299 @@ msgstr "PokroÄilý režim"
msgid "Advanced: Output log"
msgstr "PokroÄilý:  Výstupní log"
-#: src/libslic3r/PrintConfig.cpp:668
+#: src/libslic3r/PrintConfig.cpp:704
msgid "After a tool change, the exact position of the newly loaded filament inside the nozzle may not be known, and the filament pressure is likely not yet stable. Before purging the print head into an infill or a sacrificial object, Slic3r will always prime this amount of material into the wipe tower to produce successive infill or sacrificial object extrusions reliably."
msgstr "Po výmÄ›nÄ› nástroje nemusí být známa pÅ™esná poloha novÄ› zavedeného filamentu uvnitÅ™ trysky a tlak filamentu pravdÄ›podobnÄ› jeÅ¡tÄ› není stabilní. PÅ™ed vyÄiÅ¡tÄ›ním tiskové hlavy do výplnÄ› nebo do objektu bude Slic3r toto množství materiálu vždy vytlaÄovat do Äistící věže, aby se spolehlivÄ› vytvoÅ™ily následné výplnÄ› nebo objekty."
-#: src/slic3r/GUI/Tab.cpp:1994 src/libslic3r/PrintConfig.cpp:1080
+#: src/slic3r/GUI/Tab.cpp:2182 src/libslic3r/PrintConfig.cpp:1173
msgid "After layer change G-code"
msgstr "G-code po změně vrstvy"
-#: src/libslic3r/PrintConfig.cpp:3398
+#: src/libslic3r/PrintConfig.cpp:3597
msgid "Align the model to the given point."
msgstr "Zarovnejte model s daným bodem."
-#: src/libslic3r/PrintConfig.cpp:3397
+#: src/libslic3r/PrintConfig.cpp:3596
msgid "Align XY"
msgstr "Zarovnat XY"
-#: src/libslic3r/PrintConfig.cpp:1631
+#: src/libslic3r/PrintConfig.cpp:1739
msgid "Aligned"
msgstr "Zarovnaný"
-#: src/slic3r/GUI/ConfigWizard.cpp:290 src/slic3r/GUI/ConfigWizard.cpp:573
-#: src/slic3r/GUI/Tab.cpp:3174
+#: src/libslic3r/PrintConfig.cpp:470 src/libslic3r/PrintConfig.cpp:902
+msgid "Aligned Rectilinear"
+msgstr "Zarovnaná přímoÄará"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:308 src/slic3r/GUI/ConfigWizard.cpp:598
+#: src/slic3r/GUI/Tab.cpp:3507 src/slic3r/GUI/UnsavedChangesDialog.cpp:921
msgid "All"
msgstr "VÅ¡echny"
-#: src/libslic3r/Print.cpp:1219
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:197
+msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button"
+msgstr "VÅ¡echna gizma: Rotace - levé talÄítko myÅ¡i; Posun - pravé tlaÄítko myÅ¡i"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:694
+msgid "All installed printers are compatible with the selected filament."
+msgstr "Všechny instalované tiskárny jsou kompatibilní s vybraným filamentem."
+
+#: src/libslic3r/Print.cpp:1245
msgid "All objects are outside of the print volume."
msgstr "Všechny objekty jsou mimo tiskový prostor."
-#: src/slic3r/GUI/Plater.cpp:4669
+#: src/slic3r/GUI/Plater.cpp:4774
msgid "All objects will be removed, continue?"
msgstr "VÅ¡echny objekty budou odebrány, pokraÄovat?"
-#: src/slic3r/GUI/ConfigWizard.cpp:289
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:737
+msgid "All settings changes will be discarded."
+msgstr "Všechny změny v nastavení budou zahozeny."
+
+#: src/libslic3r/PrintConfig.cpp:1212
+msgid "All solid surfaces"
+msgstr "Všechny plné povrchy"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:307
msgid "All standard"
msgstr "Všechny běžné"
-#: src/libslic3r/Zipper.cpp:62
+#: src/libslic3r/PrintConfig.cpp:1210
+msgid "All top surfaces"
+msgstr "Všechny horní povrchy"
+
+#: src/libslic3r/miniz_extension.cpp:121
msgid "allocation failed"
msgstr "alokace selhala"
-#: src/slic3r/GUI/Plater.cpp:3995
+#: src/slic3r/GUI/Preferences.cpp:161 src/slic3r/GUI/Preferences.cpp:165
+msgid "Allow just a single PrusaSlicer instance"
+msgstr "Povolit pouze jednu instanci PrusaSliceru"
+
+#: src/slic3r/GUI/Plater.cpp:3915
msgid "Along X axis"
msgstr "Podél osy X"
-#: src/slic3r/GUI/Plater.cpp:3997
+#: src/slic3r/GUI/Plater.cpp:3917
msgid "Along Y axis"
msgstr "Podél osy Y"
-#: src/slic3r/GUI/Plater.cpp:3999
+#: src/slic3r/GUI/Plater.cpp:3919
msgid "Along Z axis"
msgstr "Podél osy Z"
-#: src/slic3r/GUI/ConfigWizard.cpp:222
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:160
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141
+msgid "Alt + Mouse wheel"
+msgstr "Alt + koleÄko myÅ¡i"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:240
msgid "Alternate nozzles:"
msgstr "Alternativní trysky:"
-#: src/slic3r/GUI/Plater.cpp:5002
-#, c-format
+#: src/slic3r/GUI/Preferences.cpp:163
+msgid "Always ask for unsaved changes when selecting new preset"
+msgstr "Při výběru nového přednastavení se vždy dotázat na neuložené změny"
+
+#: src/slic3r/GUI/Plater.cpp:5135
+#, possible-c-format
msgid "AMF file exported to %s"
msgstr "Soubor AMF byl exportován do %s"
-#: src/slic3r/GUI/GLCanvas3D.cpp:690
-msgid ""
-"An object outside the print area was detected\n"
-"Resolve the current problem to continue slicing"
-msgstr ""
-"Byl detekován objekt mimo tiskovou oblast\n"
-"Pro pokraÄování ve slicování vyÅ™eÅ¡te tento problém"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:685
-msgid "An object outside the print area was detected"
-msgstr "Byl detekován objekt mimo tiskovou oblast"
+#: src/slic3r/GUI/GLCanvas3D.cpp:638
+msgid "An object outside the print area was detected.\nResolve the current problem to continue slicing."
+msgstr "Byl detekován objekt mimo tiskovou oblast.\nPro pokraÄování ve slicování vyÅ™eÅ¡te tento problém."
-#: src/slic3r/GUI/Tab.cpp:2943
-msgid "and it has the following unsaved changes:"
-msgstr "a má neuložené následující změny:"
+#: src/slic3r/GUI/GLCanvas3D.cpp:633
+msgid "An object outside the print area was detected."
+msgstr "Byl detekován objekt mimo tiskovou oblast."
-#: src/slic3r/GUI/Plater.cpp:3170
+#: src/slic3r/GUI/Plater.cpp:2972
msgid "Another export job is currently running."
msgstr "V souÄasné dobÄ› běží jiná úloha exportu."
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:162
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
msgid "Any arrow"
msgstr "Å ipky"
-#: src/slic3r/GUI/Tab.cpp:965
+#: src/slic3r/GUI/Tab.cpp:1283
msgid "Any modifications should be saved as a new preset inherited from this one."
msgstr "Jakékoliv úpravy by měly být uloženy jako nové přednastavení zděděná z tohoto."
-#: src/libslic3r/PrintConfig.cpp:104
+#: src/libslic3r/PrintConfig.cpp:162
+msgid "API key"
+msgstr "API klíÄ"
+
+#: src/libslic3r/PrintConfig.cpp:106
msgid "API Key / Password"
msgstr "API klÃ­Ä / Heslo"
-#: src/slic3r/GUI/GUI_App.cpp:810
+#: src/slic3r/GUI/GUI_App.cpp:1493
msgid "Application preferences"
msgstr "Nastavení aplikace"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1374
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221
msgid "Apply changes"
msgstr "Aplikovat změny"
-#: src/libslic3r/PrintConfig.cpp:575 src/libslic3r/PrintConfig.cpp:1708
+#: src/libslic3r/PrintConfig.cpp:611 src/libslic3r/PrintConfig.cpp:1823
msgid "approximate seconds"
msgstr "vteřin přibližně"
-#: src/libslic3r/PrintConfig.cpp:428 src/libslic3r/PrintConfig.cpp:854
+#: src/libslic3r/PrintConfig.cpp:464 src/libslic3r/PrintConfig.cpp:892
msgid "Archimedean Chords"
msgstr "Archimedean Chords"
-#: src/libslic3r/Zipper.cpp:88
+#: src/libslic3r/miniz_extension.cpp:147
msgid "archive is too large"
msgstr "archiv je moc velký"
-#. TRN remove/delete
-#: src/slic3r/GUI/Tab.cpp:3123
+#: src/slic3r/GUI/Tab.cpp:3420
msgid "Are you sure you want to %1% the selected preset?"
msgstr "Opravdu chcete %1% vybrané přednastavení?"
#: src/slic3r/GUI/FirmwareDialog.cpp:902
-msgid ""
-"Are you sure you want to cancel firmware flashing?\n"
-"This could leave your printer in an unusable state!"
-msgstr ""
-"Opravdu chcete ukonÄit nahrávání firmware?\n"
-"Tiskárna může zůstat v nefunkÄním stavu!"
+msgid "Are you sure you want to cancel firmware flashing?\nThis could leave your printer in an unusable state!"
+msgstr "Opravdu chcete ukonÄit nahrávání firmware?\nTiskárna může zůstat v nefunkÄním stavu!"
-#: src/slic3r/GUI/DoubleSlider.cpp:1903 src/slic3r/GUI/DoubleSlider.cpp:1924
+#: src/slic3r/GUI/DoubleSlider.cpp:2122 src/slic3r/GUI/DoubleSlider.cpp:2142
msgid "Are you sure you want to continue?"
msgstr "Opravdu chcete pokraÄovat?"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269
+#: src/slic3r/GUI/Tab.cpp:3392
+msgid "Are you sure you want to delete \"%1%\" preset from the physical printer \"%2%\"?"
+msgstr "Opravdu chcete odstranit přednastavení \"%1%\" z fyzické tiskárny \"%2%\"?"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:658
+msgid "Are you sure you want to delete \"%1%\" printer?"
+msgstr "Opravdu chcete odstranit tiskárnu \"%1%\"?"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1128
msgid "Are you sure you want to do it?"
msgstr "Opravdu to chcete udělat?"
-#: src/libslic3r/PrintConfig.cpp:2423
+#: src/libslic3r/PrintConfig.cpp:2566
msgid "Area fill"
msgstr "Zaplněná plocha"
-#: src/slic3r/GUI/Plater.cpp:641
+#: src/slic3r/GUI/Plater.cpp:507
msgid "Around object"
msgstr "Okolo objektu"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:157
-#: src/slic3r/GUI/Plater.cpp:2754
+#: src/slic3r/GUI/GLCanvas3D.cpp:4859 src/slic3r/GUI/KBShortcutsDialog.cpp:151
+#: src/slic3r/GUI/Plater.cpp:1549
msgid "Arrange"
msgstr "Uspořádat"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:158
+#: src/slic3r/GUI/GLCanvas3D.cpp:3889
+msgid "Arrange options"
+msgstr "Volby uspořádání"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4859 src/slic3r/GUI/KBShortcutsDialog.cpp:152
msgid "Arrange selection"
msgstr "Uspořádat výběr"
-#: src/libslic3r/PrintConfig.cpp:3443
+#: src/libslic3r/PrintConfig.cpp:3642
msgid "Arrange the supplied models in a plate and merge them in a single model in order to perform actions once."
msgstr "Uspořádejte modely na tiskovou podložku a sluÄte je do jednoho modelu, abyste s nimi mohli provádÄ›t akce jednou."
-#: src/slic3r/GUI/Plater.cpp:2813
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:149
msgid "Arranging"
msgstr "Uspořádávání"
-#: src/slic3r/GUI/Plater.cpp:2841
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:182
msgid "Arranging canceled."
msgstr "Uspořádávání zrušeno."
-#: src/slic3r/GUI/Plater.cpp:2842
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:183
msgid "Arranging done."
msgstr "Uspořádávání dokonÄeno."
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:159
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:206
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
msgid "Arrow Down"
msgstr "Šipka dolů"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:160
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:229
msgid "Arrow Left"
msgstr "Å ipka vlevo"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:161
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:230
msgid "Arrow Right"
msgstr "Å ipka vpravo"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:204
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:214
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:158
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
msgid "Arrow Up"
msgstr "Å ipka nahoru"
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:290
+#: src/slic3r/GUI/GUI_App.cpp:246
+msgid "Artwork model by Nora Al-Badri and Jan Nikolai Nelles"
+msgstr "Model od Nory Al-Badri a Jana Nikolaje Nellese"
+
+#: src/slic3r/GUI/OpenGLManager.cpp:265
msgid "As a workaround, you may run PrusaSlicer with a software rendered 3D graphics by running prusa-slicer.exe with the --sw_renderer parameter."
msgstr "Řešením může být spuštění PrusaSliceru se softwarovým vykreslováním 3D grafiky a to spuštěním prusa-slicer.exe s parametrem --sw_renderer."
-#: src/slic3r/GUI/GUI_App.cpp:1086 src/slic3r/GUI/Plater.cpp:2313
-#: src/slic3r/GUI/Tab.cpp:2960
+#: src/slic3r/GUI/Preferences.cpp:154
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:659
+msgid "Ask for unsaved changes when closing application"
+msgstr "Zeptat se na neuložené změny při zavírání aplikace"
+
+#: src/slic3r/GUI/Preferences.cpp:161
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:660
+msgid "Ask for unsaved changes when selecting new preset"
+msgstr "Zeptat se na neuložené změny při výběru nového profilu"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1183 src/slic3r/GUI/Preferences.cpp:91
+msgid "Associate .3mf files to PrusaSlicer"
+msgstr "Otevírat soubory .3mf v PrusaSliceru"
+
+#: src/slic3r/GUI/Preferences.cpp:177
+msgid "Associate .gcode files to PrusaSlicer G-code Viewer"
+msgstr "Otevírat soubory .gcode v prohlížeÄi PrusaSlicer G-code Viewer"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1184 src/slic3r/GUI/Preferences.cpp:98
+msgid "Associate .stl files to PrusaSlicer"
+msgstr "Otevírat soubory .stl v PrusaSliceru"
+
+#: src/slic3r/GUI/GUI_App.cpp:1878 src/slic3r/GUI/Jobs/SLAImportJob.cpp:210
+#: src/slic3r/GUI/Plater.cpp:2256 src/slic3r/GUI/Tab.cpp:3189
msgid "Attention!"
msgstr "Pozor!"
-#: src/libslic3r/PrintConfig.cpp:1871
+#: src/libslic3r/PrintConfig.cpp:150
+msgid "Authorization Type"
+msgstr "Typ oprávnění"
+
+#: src/libslic3r/PrintConfig.cpp:2013
msgid "Auto generated supports"
msgstr "Automaticky generované podpěry"
-#: src/slic3r/GUI/Preferences.cpp:47
+#: src/slic3r/GUI/Preferences.cpp:64
msgid "Auto-center parts"
msgstr "Auto-centrování objektů"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1377
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224
msgid "Auto-generate points"
msgstr "Automatické generování bodů"
-#: src/slic3r/GUI/Plater.cpp:1157
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:1066
+#, possible-c-format
msgid "Auto-repaired (%d errors)"
msgstr "Automaticky opraveno (%d chyb)"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:339
-#, c-format
+#: src/slic3r/GUI/GUI_ObjectList.cpp:386
+#, possible-c-format
msgid "Auto-repaired (%d errors):"
msgstr "Automaticky opraveno ( %d chyb):"
@@ -840,67 +965,75 @@ msgstr "Automaticky opraveno ( %d chyb):"
msgid "Autodetected"
msgstr "Automaticky detekováno"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1134
msgid "Autogenerate support points"
msgstr "Automatické generování podpěrných bodů"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1127
msgid "Autogeneration will erase all manually edited points."
msgstr "Automatické generování vymaže vÅ¡echny ruÄnÄ› vytvoÅ™ené body."
-#: src/slic3r/GUI/Tab.cpp:3632
+#: src/slic3r/GUI/Tab.cpp:4051
msgid "Automatic generation"
msgstr "Automatické generování"
-#: src/slic3r/GUI/ConfigWizard.cpp:761
+#: src/slic3r/GUI/ConfigWizard.cpp:1120
msgid "Automatic updates"
msgstr "Automatické aktualizace"
-#: src/slic3r/GUI/MainFrame.cpp:536
+#: src/slic3r/GUI/MainFrame.cpp:1137
msgid "Automatically repair an STL file"
msgstr "Automaticky opravit STL soubor"
-#: src/slic3r/GUI/Tab.cpp:1171
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:129
+msgid "Autoset by angle"
+msgstr "Automaticky podle úhlu"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:233
+msgid "Autoset custom supports"
+msgstr "Automatické nastavení podpěr"
+
+#: src/slic3r/GUI/Tab.cpp:1501
msgid "Autospeed (advanced)"
msgstr "Automatická rychlost (pokroÄilé)"
-#: src/libslic3r/PrintConfig.cpp:136
+#: src/libslic3r/PrintConfig.cpp:169
msgid "Avoid crossing perimeters"
msgstr "Vyhnout se přejíždění perimetrů"
-#: src/slic3r/GUI/Tab.cpp:3268
+#: src/libslic3r/PrintConfig.cpp:188
+msgid "Avoid crossing perimeters - Max detour length"
+msgstr "Vyhnout se přejíždění perimetrů - maximální délka objízdné cesty"
+
+#: src/slic3r/GUI/Tab.cpp:3705
msgid "BACK ARROW"
msgstr "Å IPKA ZPÄšT"
-#: src/slic3r/GUI/Tab.cpp:3290
-msgid ""
-"BACK ARROW icon indicates that the settings were changed and are not equal to the last saved preset for the current option group.\n"
-"Click to reset all settings for the current option group to the last saved preset."
-msgstr ""
-"Ikona ŠIPKY ZPĚT indikuje, že došlo ke změně nastavení, které není shodné s naposledy uloženým přednastavením pro aktuální skupinu nastavení.\n"
-"Klikněte pro reset všech nastavení pro aktuální skupinu nastavení na naposledy uložené přednastavení."
+#: src/slic3r/GUI/Tab.cpp:3727
+msgid "BACK ARROW icon indicates that the settings were changed and are not equal to the last saved preset for the current option group.\nClick to reset all settings for the current option group to the last saved preset."
+msgstr "Ikona ŠIPKY ZPĚT indikuje, že došlo ke změně nastavení, které není shodné s naposledy uloženým přednastavením pro aktuální skupinu nastavení.\nKlikněte pro reset všech nastavení pro aktuální skupinu nastavení na naposledy uložené přednastavení."
-#: src/slic3r/GUI/Tab.cpp:3304
-msgid ""
-"BACK ARROW icon indicates that the value was changed and is not equal to the last saved preset.\n"
-"Click to reset current value to the last saved preset."
-msgstr ""
-"Ikona ŠIPKY ZPĚT indikuje, že se hodnota změnila a není shodná s naposledy uloženým přednastavením.\n"
-"KliknÄ›te pro reset souÄasné hodnoty na naposledy uložené pÅ™ednastavení."
+#: src/slic3r/GUI/Tab.cpp:3741
+msgid "BACK ARROW icon indicates that the value was changed and is not equal to the last saved preset.\nClick to reset current value to the last saved preset."
+msgstr "Ikona Å IPKY ZPÄšT indikuje, že se hodnota zmÄ›nila a není shodná s naposledy uloženým pÅ™ednastavením.\nKliknÄ›te pro reset souÄasné hodnoty na naposledy uložené pÅ™ednastavení."
-#: src/slic3r/GUI/Preferences.cpp:55
+#: src/slic3r/GUI/Preferences.cpp:72
msgid "Background processing"
msgstr "Zpracování na pozadí"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:351
+#: src/slic3r/GUI/GUI_ObjectList.cpp:398
msgid "backwards edges"
msgstr "zadní okraje"
-#: src/slic3r/GUI/MainFrame.cpp:174
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60
+msgid "Balanced"
+msgstr "Vyvážené"
+
+#: src/slic3r/GUI/MainFrame.cpp:535 src/slic3r/GUI/MainFrame.cpp:537
msgid "based on Slic3r"
msgstr "založený na Slic3r"
-#: src/slic3r/GUI/Tab.cpp:1439
+#: src/slic3r/GUI/Tab.cpp:1785
msgid "Bed"
msgstr "Tisková podložka"
@@ -912,7 +1045,7 @@ msgstr "Vlastní model podložky"
msgid "Bed custom texture"
msgstr "Vlastní textura podložky"
-#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:929
+#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1295
msgid "Bed Shape"
msgstr "Tvar tiskové podložky"
@@ -920,23 +1053,23 @@ msgstr "Tvar tiskové podložky"
msgid "Bed shape"
msgstr "Tvar tiskové podložky"
-#: src/slic3r/GUI/ConfigWizard.cpp:929
+#: src/slic3r/GUI/ConfigWizard.cpp:1295
msgid "Bed Shape and Size"
msgstr "Tvar a rozměr podložky"
-#: src/libslic3r/PrintConfig.cpp:147
+#: src/libslic3r/PrintConfig.cpp:181
msgid "Bed temperature"
msgstr "Teplota tiskové podložky"
-#: src/libslic3r/PrintConfig.cpp:145
+#: src/libslic3r/PrintConfig.cpp:178
msgid "Bed temperature for layers after the first one. Set this to zero to disable bed temperature control commands in the output."
msgstr "Teplota tiskové podložky pro další vrstvy po první vrstvě. Nastavením na hodnotu nula vypnete ovládací příkazy teploty tiskové podložky ve výstupu."
-#: src/slic3r/GUI/ConfigWizard.cpp:1051
+#: src/slic3r/GUI/ConfigWizard.cpp:1417
msgid "Bed Temperature:"
msgstr "Teplota tiskové podložky:"
-#: src/slic3r/GUI/Tab.cpp:1988 src/libslic3r/PrintConfig.cpp:153
+#: src/slic3r/GUI/Tab.cpp:2175 src/libslic3r/PrintConfig.cpp:187
msgid "Before layer change G-code"
msgstr "G-code před změnou vrstvy"
@@ -944,143 +1077,183 @@ msgstr "G-code před změnou vrstvy"
msgid "Before roll back"
msgstr "Před vrácením zpět"
-#: src/slic3r/GUI/Plater.cpp:640
+#: src/slic3r/GUI/Plater.cpp:506
msgid "Below object"
msgstr "Pod objektem"
-#: src/libslic3r/PrintConfig.cpp:1578
+#: src/libslic3r/PrintConfig.cpp:1686
msgid "Below Z"
msgstr "Pod Z"
-#: src/libslic3r/PrintConfig.cpp:164
+#: src/libslic3r/PrintConfig.cpp:198
msgid "Between objects G-code"
msgstr "G-code mezi objekty"
-#: src/slic3r/GUI/Tab.cpp:2006
+#: src/slic3r/GUI/Tab.cpp:2196
msgid "Between objects G-code (for sequential printing)"
msgstr "G-code mezi objekty (pro sekvenÄní tisk)"
-#: src/libslic3r/PrintConfig.cpp:2489 src/libslic3r/PrintConfig.cpp:2490
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242
+msgid "Block"
+msgstr "Blokovat"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:383
+msgid "Block seam"
+msgstr "Blokace Å¡vu"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:373
+msgid "Block supports"
+msgstr "Blokování podpěr"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:292
+msgid "Block supports by angle"
+msgstr "Blokování podpěr dle úhlu"
+
+#: src/libslic3r/PrintConfig.cpp:2632 src/libslic3r/PrintConfig.cpp:2633
msgid "Bottle volume"
msgstr "Objem láhve"
-#: src/libslic3r/PrintConfig.cpp:2496 src/libslic3r/PrintConfig.cpp:2497
+#: src/libslic3r/PrintConfig.cpp:2639 src/libslic3r/PrintConfig.cpp:2640
msgid "Bottle weight"
msgstr "Hmotnost láhve"
#. TRN To be shown in the main menu View->Bottom
#. TRN To be shown in Print Settings "Bottom solid layers"
#. TRN To be shown in Print Settings "Top solid layers"
-#: src/slic3r/GUI/MainFrame.cpp:665 src/libslic3r/PrintConfig.cpp:174
-#: src/libslic3r/PrintConfig.cpp:183
+#: src/slic3r/GUI/MainFrame.cpp:962 src/slic3r/GUI/MainFrame.cpp:1282
+#: src/libslic3r/PrintConfig.cpp:208 src/libslic3r/PrintConfig.cpp:217
msgid "Bottom"
msgstr "Zespod"
-#: src/libslic3r/PrintConfig.cpp:435
+#: src/libslic3r/PrintConfig.cpp:471
msgid "Bottom fill pattern"
msgstr "Vzor spodní výplně"
-#: src/slic3r/GUI/PresetHints.cpp:342
+#: src/slic3r/GUI/PresetHints.cpp:340
msgid "Bottom is open."
msgstr "Spodní Äást je otevÅ™ená."
-#: src/slic3r/GUI/PresetHints.cpp:336
+#: src/slic3r/GUI/PresetHints.cpp:334
msgid "Bottom shell is %1% mm thick for layer height %2% mm."
msgstr "Tloušťka spodní skořepiny je %1% mm při výšce vrstvy %2% mm."
-#: src/libslic3r/PrintConfig.cpp:177
+#: src/libslic3r/PrintConfig.cpp:211
msgid "Bottom solid layers"
msgstr "Plné spodní vrstvy"
-#: src/slic3r/GUI/MainFrame.cpp:665
+#: src/slic3r/GUI/MainFrame.cpp:962 src/slic3r/GUI/MainFrame.cpp:1282
msgid "Bottom View"
msgstr "Pohled zespod"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1432
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1464
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1468
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1595
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1599
msgid "Box"
msgstr "Kostka"
-#: src/libslic3r/PrintConfig.cpp:193
+#: src/libslic3r/PrintConfig.cpp:227
msgid "Bridge"
msgstr "Most"
-#: src/libslic3r/PrintConfig.cpp:222
+#: src/libslic3r/PrintConfig.cpp:256
msgid "Bridge flow ratio"
msgstr "Poměr průtoku při vytváření mostů"
-#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:316
+#: src/slic3r/GUI/GUI_Preview.cpp:308 src/libslic3r/ExtrusionEntity.cpp:321
+#: src/libslic3r/ExtrusionEntity.cpp:350
msgid "Bridge infill"
msgstr "Výplň mostů"
-#: src/libslic3r/PrintConfig.cpp:234
+#: src/libslic3r/PrintConfig.cpp:268
msgid "Bridges"
msgstr "Mosty"
-#: src/libslic3r/PrintConfig.cpp:213
+#: src/libslic3r/PrintConfig.cpp:247
msgid "Bridges fan speed"
msgstr "Rychlost ventilátoru při vytváření mostů"
-#: src/libslic3r/PrintConfig.cpp:202
+#: src/libslic3r/PrintConfig.cpp:236
msgid "Bridging angle"
msgstr "Úhel vytváření mostů"
-#: src/libslic3r/PrintConfig.cpp:204
+#: src/libslic3r/PrintConfig.cpp:238
msgid "Bridging angle override. If left to zero, the bridging angle will be calculated automatically. Otherwise the provided angle will be used for all bridges. Use 180° for zero angle."
-msgstr "PÅ™epsání úhlu vytváření mostů. Nastavením hodnoty na nulu se bude úhel vytváření mostů vypoÄítávat automaticky. PÅ™i zadání jiného úhlu, bude pro vÅ¡echny mosty použitý zadaný úhel. Pro nulový úhel zadejte 180°."
+msgstr "PÅ™epsání úhlu vytváření mostů. Nastavením hodnoty na nulu se bude úhel vytváření mostů vypoÄítávat automaticky. PÅ™i zadání jiného úhlu bude pro vÅ¡echny mosty použitý zadaný úhel. Pro nulový úhel zadejte 180°."
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:218
msgid "Bridging volumetric"
msgstr "Volumetrická hodnota mostů"
-#: src/slic3r/GUI/Plater.cpp:534 src/slic3r/GUI/Tab.cpp:1117
+#: src/slic3r/GUI/Plater.cpp:400 src/slic3r/GUI/Tab.cpp:1446
msgid "Brim"
msgstr "Límec"
-#: src/libslic3r/PrintConfig.cpp:244
+#: src/libslic3r/PrintConfig.cpp:278
msgid "Brim width"
msgstr "Šířka límce"
-#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1658
-#: src/slic3r/GUI/Tab.cpp:1721
+#: src/slic3r/GUI/FirmwareDialog.cpp:805
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:271
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327
msgid "Browse"
msgstr "Procházet"
-#: src/libslic3r/Zipper.cpp:82
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:28
+msgid "Brush shape"
+msgstr "Tvar štětce"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:27
+msgid "Brush size"
+msgstr "Velikost štětce"
+
+#: src/libslic3r/miniz_extension.cpp:141
msgid "buffer too small"
msgstr "buffer je příliš malý"
+#: src/slic3r/GUI/GUI_App.cpp:1152
+msgid "But since this version of PrusaSlicer we don't show this information in Printer Settings anymore.\nSettings will be available in physical printers settings."
+msgstr "Ale od této verze PrusaSliceru již nebudeme tyto informace zobrazovat v Nastavení tiskárny.\nNastavení bude k dispozici v nastavení fyzických tiskáren."
+
#: src/slic3r/GUI/ButtonsDescription.cpp:16
msgid "Buttons And Text Colors Description"
msgstr "Barvy pro textové popisky a tlaÄítka"
-#: src/slic3r/GUI/PresetHints.cpp:223
+#: src/slic3r/GUI/GUI_App.cpp:1084
+msgid "By default new Printer devices will be named as \"Printer N\" during its creation.\nNote: This name can be changed later from the physical printers settings"
+msgstr "Ve výchozím stavu budou při vytváření nové tiskárny pojmenovány jako „Printer N“.\nPoznámka: Tento název lze později změnit v nastavení fyzických tiskáren"
+
+#: src/slic3r/GUI/PresetHints.cpp:222
msgid "by the print profile maximum"
msgstr "maximem pro profil tisku"
-#: src/slic3r/GUI/Preferences.cpp:113
+#: src/slic3r/GUI/Preferences.cpp:178
msgid "Camera"
msgstr "Kamera"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:144
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:140
msgid "Camera view"
msgstr "Pohled kamery"
-#: src/slic3r/GUI/ConfigWizard.cpp:1982 src/slic3r/GUI/FirmwareDialog.cpp:151
+#: src/slic3r/GUI/ConfigWizard.cpp:2493 src/slic3r/GUI/FirmwareDialog.cpp:151
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:245
#: src/slic3r/GUI/ProgressStatusBar.cpp:26
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:644
msgid "Cancel"
msgstr "Zrušit"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:157
+#: src/slic3r/GUI/PrintHostDialogs.cpp:155
msgid "Cancel selected"
msgstr "Zrušit vybrané"
-#: src/slic3r/GUI/Plater.cpp:3669 src/slic3r/GUI/PrintHostDialogs.cpp:233
+#: src/slic3r/GUI/Plater.cpp:3589 src/slic3r/GUI/PrintHostDialogs.cpp:233
msgid "Cancelled"
msgstr "Zrušeno"
-#: src/slic3r/GUI/Plater.cpp:3153 src/slic3r/GUI/PrintHostDialogs.cpp:232
+#: src/slic3r/GUI/Plater.cpp:2953 src/slic3r/GUI/PrintHostDialogs.cpp:232
msgid "Cancelling"
msgstr "Zrušení"
@@ -1092,108 +1265,100 @@ msgstr "UkonÄování..."
msgid "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible."
msgstr "Nelze vypoÄítat šířku extrudování pro %1%: PromÄ›nná \"%2%\" není dostupná."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3017
-msgid ""
-"Cannot insert a new layer range after the current layer range.\n"
-"Current layer range overlaps with the next layer range."
-msgstr ""
-"Nelze vložit nový rozsah vrstev za aktuální rozsah vrstev.\n"
-"Aktuální rozsah vrstev se překrývá s dalším rozsahem vrstev."
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3400
+msgid "Cannot insert a new layer range after the current layer range.\nCurrent layer range overlaps with the next layer range."
+msgstr "Nelze vložit nový rozsah vrstev za aktuální rozsah vrstev.\nAktuální rozsah vrstev se překrývá s dalším rozsahem vrstev."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3008
-msgid ""
-"Cannot insert a new layer range after the current layer range.\n"
-"The next layer range is too thin to be split to two\n"
-"without violating the minimum layer height."
-msgstr ""
-"Nelze vložit nový rozsah vrstev za aktuální rozsah vrstev.\n"
-"Další rozsah vrstev je příliš tenký na to, aby byl rozdělen na dva\n"
-"bez porušení minimální výšky vrstvy."
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3391
+msgid "Cannot insert a new layer range after the current layer range.\nThe next layer range is too thin to be split to two\nwithout violating the minimum layer height."
+msgstr "Nelze vložit nový rozsah vrstev za aktuální rozsah vrstev.\nDalší rozsah vrstev je příliš tenký na to, aby byl rozdělen na dva\nbez porušení minimální výšky vrstvy."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3012
-msgid ""
-"Cannot insert a new layer range between the current and the next layer range.\n"
-"The gap between the current layer range and the next layer range\n"
-"is thinner than the minimum layer height allowed."
-msgstr ""
-"Nelze vložit nový rozsah vrstev mezi aktuální a následující rozsah vrstev.\n"
-"Mezera mezi aktuálním rozsahem vrstev a dalším rozsahem vrstev\n"
-"je tenÄí, než je minimální povolená výška vrstvy."
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3395
+msgid "Cannot insert a new layer range between the current and the next layer range.\nThe gap between the current layer range and the next layer range\nis thinner than the minimum layer height allowed."
+msgstr "Nelze vložit nový rozsah vrstev mezi aktuální a následující rozsah vrstev.\nMezera mezi aktuálním rozsahem vrstev a dalším rozsahem vrstev\nje tenÄí, než je minimální povolená výška vrstvy."
-#: src/slic3r/GUI/Tab.cpp:3073
+#: src/slic3r/GUI/SavePresetDialog.cpp:137
msgid "Cannot overwrite a system profile."
msgstr "Nelze přepsat systémový profil."
-#: src/slic3r/GUI/Tab.cpp:3077
+#: src/slic3r/GUI/SavePresetDialog.cpp:142
msgid "Cannot overwrite an external profile."
msgstr "Nelze přepsat externí profil."
-#: src/libslic3r/SLAPrint.cpp:613
+#: src/libslic3r/SLAPrint.cpp:627
msgid "Cannot proceed without support points! Add support points or disable support generation."
msgstr "Nelze pokraÄovat bez podpÄ›rných bodů! PÅ™idejte podpÄ›rné body nebo zakažte generování podpÄ›r."
-#: src/slic3r/GUI/Tab.cpp:1834
+#: src/slic3r/GUI/Tab.cpp:2068 src/slic3r/GUI/UnsavedChangesDialog.cpp:1066
msgid "Capabilities"
msgstr "Možnosti"
-#: src/slic3r/GUI/GUI_App.cpp:801
+#: src/slic3r/GUI/GUI_App.cpp:1481
msgid "Capture a configuration snapshot"
msgstr "Vytvořit aktuální zálohu konfigurace"
-#: src/libslic3r/PrintConfig.cpp:3424
+#: src/slic3r/GUI/ImGuiWrapper.cpp:801 src/slic3r/GUI/Search.cpp:458
+msgid "Category"
+msgstr "Kategorie"
+
+#: src/libslic3r/PrintConfig.cpp:3623
msgid "Center"
msgstr "Střed"
-#: src/libslic3r/PrintConfig.cpp:3425
+#: src/libslic3r/PrintConfig.cpp:3624
msgid "Center the print around the given center."
msgstr "Vycentrujte tisk kolem daného středu."
-#: src/slic3r/GUI/Tab.cpp:1728
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:329
msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*"
msgstr "Soubory s certifikátem (*.crt, *.pem)|*.crt;*.pem|Všechny soubory|*.*"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:180
+#: src/slic3r/GUI/SavePresetDialog.cpp:313
+msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\""
+msgstr "Změnit \"%1%\" na\"%2%\" pro tuto fyzickou tiskárnu \"%3%\""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:174
msgid "Change camera type (perspective, orthographic)"
msgstr "Změna typu kamery (perspektivní, ortografická)"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:885
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:693
msgid "Change drainage hole diameter"
msgstr "Změna poloměru odtokového otvoru"
-#: src/slic3r/GUI/DoubleSlider.cpp:1144 src/slic3r/GUI/GUI_ObjectList.cpp:1671
+#: src/slic3r/GUI/DoubleSlider.cpp:1273 src/slic3r/GUI/GUI_ObjectList.cpp:1800
msgid "Change extruder"
msgstr "Změnit extruder"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:536
+#: src/slic3r/GUI/GUI_ObjectList.cpp:574
msgid "Change Extruder"
msgstr "Změnit Extruder"
-#: src/slic3r/GUI/DoubleSlider.cpp:1145
+#: src/slic3r/GUI/DoubleSlider.cpp:1274
msgid "Change extruder (N/A)"
msgstr "Změnit extruder (N/A)"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3997
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4484
msgid "Change Extruders"
msgstr "Změnit Extrudery"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:152
-#, c-format
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:157
+#, possible-c-format
msgid "Change Option %s"
msgstr "Změna parametru %s"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3558
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4021
msgid "Change Part Type"
msgstr "ZmÄ›na typu Äásti"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:820
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:694
msgid "Change point head diameter"
msgstr "Změna průměru hrotu"
-#: src/slic3r/GUI/Plater.cpp:3944
+#: src/slic3r/GUI/Plater.cpp:3862
msgid "Change the number of instances of the selected object"
msgstr "ZmÄ›ní poÄet instancí vybraného objektu"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1589
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1718
msgid "Change type"
msgstr "Změnit typ"
@@ -1201,125 +1366,176 @@ msgstr "Změnit typ"
msgid "Changelog && Download"
msgstr "Changelog && Stažení"
-#: src/slic3r/GUI/GUI_App.cpp:442
+#: src/slic3r/GUI/GUI_App.cpp:1245
msgid "Changing of an application language"
msgstr "Změnit jazyk aplikace"
-#: src/slic3r/GUI/ConfigWizard.cpp:769 src/slic3r/GUI/Preferences.cpp:64
+#: src/slic3r/GUI/ConfigWizard.cpp:1128 src/slic3r/GUI/Preferences.cpp:81
msgid "Check for application updates"
msgstr "Zkontrolovat aktualizace aplikace"
-#: src/slic3r/GUI/GUI_App.cpp:802
+#: src/slic3r/GUI/GUI_App.cpp:1482
msgid "Check for configuration updates"
msgstr "Zkontrolujte aktualizace konfigurace"
-#: src/slic3r/GUI/GUI_App.cpp:802
+#: src/slic3r/GUI/GUI_App.cpp:1482
msgid "Check for updates"
msgstr "Zkontrolovat akt&ualizace"
-#: src/slic3r/GUI/BedShapeDialog.cpp:532
+#: src/slic3r/Utils/PresetUpdater.cpp:412
+#: src/slic3r/Utils/PresetUpdater.cpp:420
+msgid "checking install indices"
+msgstr "kontrola indexů instalace"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:608
msgid "Choose a file to import bed texture from (PNG/SVG):"
msgstr "Vyberte soubor, ze kterého chcete importovat texturu pro tiskovou podložku (PNG/SVG):"
-#: src/slic3r/GUI/MainFrame.cpp:773
+#: src/slic3r/GUI/MainFrame.cpp:1474
msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):"
msgstr "Zvolit soubor ke slicování (STL/OBJ/AMF/3MF/PRUSA):"
-#: src/slic3r/GUI/BedShapeDialog.cpp:555
+#: src/slic3r/GUI/BedShapeDialog.cpp:631
msgid "Choose an STL file to import bed model from:"
msgstr "Vyberte STL soubor, ze kterého chcete importovat model tiskové podložky:"
-#: src/slic3r/GUI/BedShapeDialog.cpp:487
+#: src/slic3r/GUI/BedShapeDialog.cpp:563
msgid "Choose an STL file to import bed shape from:"
msgstr "Vyberte STL soubor, ze kterého chcete importovat tvar tiskové podložky:"
-#: src/slic3r/GUI/GUI_App.cpp:555
+#: src/slic3r/GUI/GUI_App.cpp:1208
msgid "Choose one file (3MF/AMF):"
msgstr "Vyberte jeden soubor (3MF/AMF):"
-#: src/slic3r/GUI/GUI_App.cpp:567
+#: src/slic3r/GUI/GUI_App.cpp:1233
+msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):"
+msgstr "Vyberte jeden soubor (GCODE/.GCO/.G/.ngc/NGC):"
+
+#: src/slic3r/GUI/GUI_App.cpp:1220
msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):"
msgstr "Vyberte jeden nebo více souborů (STL/OBJ/AMF/3MF/PRUSA):"
-#: src/slic3r/GUI/ConfigWizard.cpp:895
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:35
+msgid "Choose SLA archive:"
+msgstr "Vyberte SLA archiv:"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1261
msgid "Choose the type of firmware used by your printer."
msgstr "Vyberte typ firmware používaný vaší tiskárnou."
-#: src/slic3r/GUI/BedShapeDialog.cpp:89
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36
+msgid "Circle"
+msgstr "Kruh"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:142
msgid "Circular"
msgstr "Kruhový"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4624 src/slic3r/GUI/GLCanvas3D.cpp:4657
-msgid "Click right mouse button to open History"
-msgstr "Stiskem pravého tlaÄítka myÅ¡i se zobrazí Historie"
+#: src/slic3r/GUI/GLCanvas3D.cpp:5028 src/slic3r/GUI/GLCanvas3D.cpp:5067
+msgid "Click right mouse button to open/close History"
+msgstr "Stisk pravého tlaÄítka myÅ¡i pro zobrazení/skrytí Historie"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4341
+msgid "Click right mouse button to show arrangement options"
+msgstr "Kliknutím pravým tlaÄítkem myÅ¡i zobrazíte možnosti uspořádání"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:404
+#: src/slic3r/GUI/GUI_ObjectList.cpp:451
msgid "Click the icon to change the object printable property"
msgstr "Klepnutím na ikonu zmÄ›níte příznak objektu, zda se bude tisknout Äi nikoliv"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:398
+#: src/slic3r/GUI/GUI_ObjectList.cpp:445
msgid "Click the icon to change the object settings"
msgstr "Pro změnu nastavení objektu klikněte na ikonu"
-#: src/slic3r/GUI/Plater.cpp:343
+#: src/slic3r/GUI/PresetComboBoxes.cpp:566
msgid "Click to edit preset"
msgstr "Klikněte pro editaci přednastavení"
-#: src/libslic3r/PrintConfig.cpp:252
+#: src/slic3r/GUI/GCodeViewer.cpp:2071
+msgid "Click to hide"
+msgstr "Kliknutím skryjete"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2071
+msgid "Click to show"
+msgstr "Kliknutím zobrazíte"
+
+#: src/libslic3r/PrintConfig.cpp:286
msgid "Clip multi-part objects"
msgstr "PÅ™ipnutí objektů z více Äástí k sobÄ›"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:25
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57
msgid "Clipping of view"
-msgstr "Řezová rovina"
+msgstr "Řez rovinou"
#: src/slic3r/GUI/FirmwareDialog.cpp:852
-#: src/slic3r/GUI/Mouse3DController.cpp:364
-#: src/slic3r/GUI/PrintHostDialogs.cpp:161
+#: src/slic3r/GUI/Mouse3DController.cpp:353
+#: src/slic3r/GUI/PrintHostDialogs.cpp:159
msgid "Close"
msgstr "Zavřít"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45
-#: src/libslic3r/PrintConfig.cpp:2934
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44
+#: src/libslic3r/PrintConfig.cpp:3098
msgid "Closing distance"
msgstr "Vzdálenost uzavření"
-#: src/slic3r/GUI/Plater.cpp:1260 src/libslic3r/PrintConfig.cpp:582
+#: src/slic3r/GUI/MainFrame.cpp:1297 src/slic3r/GUI/Plater.cpp:2144
+msgid "Collapse sidebar"
+msgstr "Sbalit postranní panel"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:180
+msgid "Collapse/Expand the sidebar"
+msgstr "Sbalit/Rozbalit postranní panel"
+
+#: src/slic3r/GUI/Plater.cpp:1198 src/libslic3r/PrintConfig.cpp:618
msgid "Color"
msgstr "Barva"
-#: src/slic3r/GUI/DoubleSlider.cpp:1005
+#: src/slic3r/GUI/GCodeViewer.cpp:2410 src/slic3r/GUI/GCodeViewer.cpp:2438
+msgid "Color change"
+msgstr "Změna barvy"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1130
msgid "Color change (\"%1%\")"
msgstr "Změna barvy (\"%1%\")"
-#: src/slic3r/GUI/DoubleSlider.cpp:1006
+#: src/slic3r/GUI/DoubleSlider.cpp:1131
msgid "Color change (\"%1%\") for Extruder %2%"
msgstr "Změna barvy (\"%1%\") pro Extruder %2%"
-#: src/slic3r/GUI/GLCanvas3D.cpp:995
-#, c-format
-msgid "Color change for Extruder %d at %.2f mm"
-msgstr "Změna barvy pro extruder %d ve výšce %.2f mm"
+#: src/slic3r/GUI/Tab.cpp:2203
+msgid "Color Change G-code"
+msgstr "G-code pro změnu barvy"
+
+#: src/libslic3r/PrintConfig.cpp:1960
+msgid "Color change G-code"
+msgstr "G-code pro změnu barvy"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2531 src/slic3r/GUI/GUI_Preview.cpp:1475
+msgid "Color changes"
+msgstr "Změny barev"
-#: src/slic3r/GUI/GUI_Preview.cpp:228 src/slic3r/GUI/GUI_Preview.cpp:572
-#: src/libslic3r/GCode/PreviewData.cpp:359
+#: src/slic3r/GUI/GCodeViewer.cpp:2242 src/slic3r/GUI/GUI_Preview.cpp:282
+#: src/slic3r/GUI/GUI_Preview.cpp:784 src/libslic3r/GCode/PreviewData.cpp:364
msgid "Color Print"
msgstr "Barevný tisk"
-#: src/libslic3r/PrintConfig.cpp:260
+#: src/libslic3r/PrintConfig.cpp:294
msgid "Colorprint height"
msgstr "Výška barevného tisku"
-#: src/libslic3r/PrintConfig.cpp:990
+#: src/libslic3r/PrintConfig.cpp:1034
msgid "Combine infill every"
msgstr "Kombinovat výplň každou"
-#: src/libslic3r/PrintConfig.cpp:995
+#: src/libslic3r/PrintConfig.cpp:1039
msgid "Combine infill every n layers"
msgstr "Kombinovat výplň každou n vrstvu"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:154
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:148
msgid "Commands"
msgstr "Příkazy"
@@ -1327,23 +1543,23 @@ msgstr "Příkazy"
msgid "Comment:"
msgstr "Komentář:"
-#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:280
+#: src/slic3r/GUI/Tab.cpp:107 src/libslic3r/PrintConfig.cpp:314
msgid "Compatible print profiles"
msgstr "Kompatibilní tiskové profily"
-#: src/libslic3r/PrintConfig.cpp:286
+#: src/libslic3r/PrintConfig.cpp:320
msgid "Compatible print profiles condition"
msgstr "Stav kompatibilních tiskových profilů"
-#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:265
+#: src/slic3r/GUI/Tab.cpp:101 src/libslic3r/PrintConfig.cpp:299
msgid "Compatible printers"
msgstr "Kompatibilní tiskárny"
-#: src/libslic3r/PrintConfig.cpp:271
+#: src/libslic3r/PrintConfig.cpp:305
msgid "Compatible printers condition"
msgstr "Stav kompatibilních tiskáren"
-#: src/libslic3r/PrintConfig.cpp:304
+#: src/libslic3r/PrintConfig.cpp:338
msgid "Complete individual objects"
msgstr "DokonÄení individuálních objektů"
@@ -1351,27 +1567,27 @@ msgstr "DokonÄení individuálních objektů"
msgid "Completed"
msgstr "DokonÄeno"
-#: src/libslic3r/Zipper.cpp:54
+#: src/libslic3r/miniz_extension.cpp:113
msgid "compression failed"
msgstr "komprese se nezdařila"
-#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:849
+#: src/libslic3r/PrintConfig.cpp:462 src/libslic3r/PrintConfig.cpp:887
msgid "Concentric"
msgstr "Koncentrická"
-#: src/slic3r/GUI/ConfigWizard.cpp:2110
+#: src/slic3r/GUI/ConfigWizard.cpp:2625
msgid "Configuration &Assistant"
msgstr "Průvodce n&astavením"
-#: src/slic3r/GUI/ConfigWizard.cpp:2113
+#: src/slic3r/GUI/ConfigWizard.cpp:2628
msgid "Configuration &Wizard"
msgstr "Průvodce &nastavením"
-#: src/slic3r/GUI/ConfigWizard.cpp:2109
+#: src/slic3r/GUI/ConfigWizard.cpp:2624
msgid "Configuration Assistant"
msgstr "Průvodce nastavení tiskárny"
-#: src/libslic3r/PrintConfig.cpp:1316
+#: src/libslic3r/PrintConfig.cpp:1424
msgid "Configuration notes"
msgstr "KonfiguraÄní poznámky"
@@ -1387,11 +1603,15 @@ msgstr "Aktualizace nastavení"
msgid "Configuration update is available"
msgstr "Je k dispozici aktualizace nastavení"
-#: src/slic3r/GUI/UpdateDialogs.cpp:303
+#: src/slic3r/GUI/NotificationManager.hpp:321
+msgid "Configuration update is available."
+msgstr "Je k dispozici aktualizace konfigurace."
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:304
msgid "Configuration updates"
msgstr "Aktualizace konfigurace"
-#: src/slic3r/GUI/ConfigWizard.cpp:2112
+#: src/slic3r/GUI/ConfigWizard.cpp:2627
msgid "Configuration Wizard"
msgstr "Průvodce nastavením"
@@ -1399,15 +1619,19 @@ msgstr "Průvodce nastavením"
msgid "Confirmation"
msgstr "Potvrzení"
-#: src/slic3r/GUI/Tab.cpp:1931
-msgid "Connection failed."
-msgstr "Připojení selhalo."
+#: src/libslic3r/PrintConfig.cpp:1070
+msgid "Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. PrusaSlicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max. Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
+msgstr "PÅ™ipojení výplnÄ› k vnitÅ™nímu perimetru krátkým segmentem dalšího perimetru. Pokud je vyjádÅ™eno v procentech (příklad: 15%), vypoÄítává se z šířky extruze infilu. PrusaSlicer se pokouší spojit dvÄ› blízké výplňová Äáry krátkým obvodovým perimetrem. Pokud není nalezen žádný takový obvodový perimetr kratší než infill_anchor_max, je výplňová Äára spojena s obvodovým perimetrem pouze na jedné stranÄ› a délka odebraného obvodového perimetru je omezena na tento parametr, ale ne dále než anchor_length_max. Nastavením tohoto parametru na nulu deaktivujete kotvící perimetry pÅ™ipojené k jedné výplňové Äáře."
-#: src/slic3r/GUI/Tab.cpp:3627
+#: src/libslic3r/PrintConfig.cpp:1097
+msgid "Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. PrusaSlicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter. Set this parameter to zero to disable anchoring."
+msgstr "PÅ™ipojení výplnÄ› k vnitÅ™nímu perimetru krátkým segmentem dalšího perimetru. Pokud je vyjádÅ™eno v procentech (příklad: 15%), vypoÄítává se z šířky extruze infilu. PrusaSlicer se pokouší spojit dvÄ› blízké výplňová Äáry krátkým obvodovým perimetrem. Pokud není nalezen žádný takový obvodový perimetr kratší než tento parametr, je výplňová Äára spojena s obvodovým perimetrem pouze na jedné stranÄ› a délka odebraného obvodového perimetru je omezena na infill_anchor, ale ne delší než tento parametr. Nastavením tohoto parametru na nulu ukotvení zakážete."
+
+#: src/slic3r/GUI/Tab.cpp:4046
msgid "Connection of the support sticks and junctions"
msgstr "Spojení podpůrných tyÄí a spojek"
-#: src/slic3r/Utils/AstroBox.cpp:83
+#: src/slic3r/Utils/AstroBox.cpp:84
msgid "Connection to AstroBox works correctly."
msgstr "Připojení k AstroBoxu funguje správně."
@@ -1423,124 +1647,148 @@ msgstr "Připojení k FlashAir funguje správně a nahrávání je povoleno."
msgid "Connection to OctoPrint works correctly."
msgstr "Připojení k OctoPrint pracuje správně."
-#: src/slic3r/GUI/Tab.cpp:1928
-msgid "Connection to printer works correctly."
-msgstr "Připojení k tiskárně pracuje správně."
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:260
+msgid "Connection to printers connected via the print host failed."
+msgstr "Připojení k tiskárnám připojených prostřednictvím tiskového serveru se nezdařilo."
-#: src/slic3r/Utils/OctoPrint.cpp:176
+#: src/slic3r/Utils/OctoPrint.cpp:185
msgid "Connection to Prusa SL1 works correctly."
msgstr "Připojení k tiskárně Prusa SL1 funguje správně."
-#: src/libslic3r/PrintConfig.cpp:1909
+#: src/libslic3r/PrintConfig.cpp:2051
msgid "Contact Z distance"
msgstr "Mezera mezi podpěrami a objektem v ose Z"
-#: src/slic3r/GUI/AboutDialog.cpp:261
+#: src/slic3r/GUI/AboutDialog.cpp:286
msgid "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and numerous others."
msgstr "Příspěvky od Henrika Brixa Andersena, Nicolase Dandrimonta, Marka Hindessa, Petra Ledviny, Josefa Lenoxe, Y. Sapira, Mika Sheldrakeho, Vojtěcha Bubnika a mnoha dalších."
-#: src/libslic3r/PrintConfig.cpp:2659
+#: src/slic3r/GUI/GUI_App.cpp:245
+msgid "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others."
+msgstr "Příspěvky od Vojtěcha Bubníka, Enrica Turriho, Oleksandry Iushchenko, Tamáse Mészárose, Lukáše Matěny, Vojtěcha Krále, Davida Kocíka a řady dalších."
+
+#: src/libslic3r/PrintConfig.cpp:2823
msgid "Controls the bridge type between two neighboring pillars. Can be zig-zag, cross (double zig-zag) or dynamic which will automatically switch between the first two depending on the distance of the two pillars."
msgstr "Řídí typ mostu mezi dvěma sousedními sloupky. Může být zig-zag, cross (dvojitý zig-zag) nebo dynamic, který automaticky přepíná mezi prvními dvěma v závislosti na vzdálenosti dvou sloupků."
-#: src/slic3r/GUI/Tab.cpp:1444
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1858 src/slic3r/GUI/Plater.cpp:4886
+msgid "Convert from imperial units"
+msgstr "Převod z imperiálních jednotek"
+
+#: src/slic3r/GUI/Tab.cpp:1790
msgid "Cooling"
msgstr "Chlazení"
-#: src/libslic3r/PrintConfig.cpp:660
+#: src/libslic3r/PrintConfig.cpp:696
msgid "Cooling moves are gradually accelerating beginning at this speed."
msgstr "Chladicí pohyby se postupnÄ› zrychlují a zaÄínají touto rychlostí."
-#: src/libslic3r/PrintConfig.cpp:679
+#: src/libslic3r/PrintConfig.cpp:715
msgid "Cooling moves are gradually accelerating towards this speed."
msgstr "Chladící pohyby se postupně zrychlují až k této rychlosti."
-#: src/slic3r/GUI/Tab.cpp:1465
+#: src/slic3r/GUI/Tab.cpp:1811
msgid "Cooling thresholds"
msgstr "Podmínky chlazení"
-#: src/libslic3r/PrintConfig.cpp:327
+#: src/libslic3r/PrintConfig.cpp:361
msgid "Cooling tube length"
msgstr "Délka chladící trubiÄky"
-#: src/libslic3r/PrintConfig.cpp:319
+#: src/libslic3r/PrintConfig.cpp:353
msgid "Cooling tube position"
msgstr "Pozice chladící trubiÄky"
-#: src/slic3r/GUI/Plater.cpp:4752
+#: src/slic3r/GUI/Plater.cpp:4856
msgid "Copies of the selected object"
msgstr "Kopie vybraného modelu"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4505
+#: src/slic3r/GUI/GLCanvas3D.cpp:4871
msgid "Copy"
msgstr "Kopírovat"
-#: src/slic3r/GUI/MainFrame.cpp:589
+#: src/slic3r/GUI/MainFrame.cpp:1195
msgid "Copy selection to clipboard"
msgstr "Kopírovat výběr do schránky"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:132
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:127
msgid "Copy to clipboard"
msgstr "Kopírovat do schránky"
-#: src/slic3r/GUI/SysInfoDialog.cpp:154
+#: src/slic3r/GUI/SysInfoDialog.cpp:177
msgid "Copy to Clipboard"
msgstr "Kopírovat do Schránky"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:121
+#: src/slic3r/GUI/AboutDialog.cpp:304
+msgid "Copy Version Info"
+msgstr "Zkopírovat Äíslo verze"
+
+#: src/slic3r/Utils/PresetUpdater.cpp:84
+msgid "Copying of file %1% to %2% failed.\nError message : %3%\nCopying was triggered by function: %4%"
+msgstr "Kopírování souboru %1% do %2% se nezdařilo.\nChybová zpráva: %3%\nTato chyba nastala ve funkci: %4%"
+
+#: src/slic3r/Utils/PresetUpdater.cpp:91
+msgid "Copying of file %1% to %2% failed. Permissions fail at target file after copying.\nError message : %3%\nCopying was triggered by function: %4%"
+msgstr "Kopírování souboru %1% do %2% se nezdaÅ™ilo. Pro kopírování z/do cílového souboru nemáte dostateÄná oprávnÄ›ní.\nChybová zpráva: %3%\nTato chyba nastala ve funkci: %4%"
+
+#: src/slic3r/Utils/PresetUpdater.cpp:70
+msgid "Copying of file %1% to %2% failed. Permissions fail at target file before copying.\nError message : %3%\nThis error happend during %4% phase."
+msgstr "Kopírování souboru %1% do %2% se nezdaÅ™ilo. Pro kopírování z/do cílového souboru nemáte dostateÄná oprávnÄ›ní.\nChybová zpráva: %3%\nTato chyba nastala ve funkci: %4%"
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:156
msgid "Copying of the temporary G-code has finished but the exported code couldn't be opened during copy check. The output G-code is at %1%.tmp."
msgstr "Kopírování doÄasného G-codu bylo dokonÄeno, ale exportovaný G-code nemohl být bÄ›hem kontroly kopírování otevÅ™en. Výstupní G-cod je v %1%.tmp."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:118
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:153
msgid "Copying of the temporary G-code has finished but the original code at %1% couldn't be opened during copy check. The output G-code is at %2%.tmp."
msgstr "Kopírování doÄasného G-codu bylo dokonÄeno, ale původní G-code na %1% nemohl být bÄ›hem kontroly kopírování otevÅ™en. Výstupní G-code je v %2%.tmp."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:480
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:522
msgid "Copying of the temporary G-code to the output G-code failed"
msgstr "Kopírování doÄasného G-codu do výstupního G-codu selhalo"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:109
-msgid "Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?"
-msgstr "Kopírování doÄasného G-codu do výstupního G-codu se nezdaÅ™ilo. Není SD karta chránÄ›ná proti zápisu?"
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:163
+msgid "Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?\nError message: %1%"
+msgstr "Kopírování doÄasného G-codu do výstupního G-codu se nezdaÅ™ilo. Není SD karta chránÄ›ná proti zápisu?\nChybová hláška: %1%"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:112
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:147
msgid "Copying of the temporary G-code to the output G-code failed. There might be problem with target device, please try exporting again or using different device. The corrupted output G-code is at %1%.tmp."
msgstr "Kopírování doÄasného G-codu do výstupního G-codu se nezdaÅ™ilo. Může to být problém s cílovým zařízením. Zkuste exportovat znovu nebo použijte jiné zařízení. PoÅ¡kozený výstupní G-code je v %1%.tmp."
-#: src/slic3r/GUI/AboutDialog.cpp:127 src/slic3r/GUI/AboutDialog.cpp:256
+#: src/slic3r/GUI/AboutDialog.cpp:139 src/slic3r/GUI/AboutDialog.cpp:281
msgid "Copyright"
msgstr "Autorská práva"
-#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2572
+#: src/libslic3r/PrintConfig.cpp:2714 src/libslic3r/PrintConfig.cpp:2715
msgid "Correction for expansion"
msgstr "Korekce expanze"
-#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:3519
+#: src/slic3r/GUI/Tab.cpp:2270 src/slic3r/GUI/Tab.cpp:3935
msgid "Corrections"
msgstr "Korekce"
-#: src/slic3r/GUI/Plater.cpp:1243 src/libslic3r/PrintConfig.cpp:760
-#: src/libslic3r/PrintConfig.cpp:2510 src/libslic3r/PrintConfig.cpp:2511
+#: src/slic3r/GUI/Plater.cpp:1158 src/libslic3r/PrintConfig.cpp:796
+#: src/libslic3r/PrintConfig.cpp:2653 src/libslic3r/PrintConfig.cpp:2654
msgid "Cost"
msgstr "Náklady"
-#: src/slic3r/GUI/Plater.cpp:239
+#: src/slic3r/GUI/Plater.cpp:245
msgid "Cost (money)"
msgstr "Cena (peníze)"
-#: src/slic3r/GUI/Plater.cpp:2835
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:176
msgid "Could not arrange model objects! Some geometries may be invalid."
msgstr "Objekty nelze uspořádat! Některé geometrie mohou být neplatné."
-#: src/slic3r/Utils/AstroBox.cpp:89
+#: src/slic3r/Utils/AstroBox.cpp:90
msgid "Could not connect to AstroBox"
msgstr "Nelze se připojit k AstroBoxu"
-#: src/slic3r/Utils/Duet.cpp:54
+#: src/slic3r/Utils/Duet.cpp:55
msgid "Could not connect to Duet"
msgstr "Nelze se připojit k Duet"
-#: src/slic3r/Utils/FlashAir.cpp:73
+#: src/slic3r/Utils/FlashAir.cpp:74
msgid "Could not connect to FlashAir"
msgstr "Nelze se spojit s FlashAir"
@@ -1548,56 +1796,73 @@ msgstr "Nelze se spojit s FlashAir"
msgid "Could not connect to OctoPrint"
msgstr "Nelze se spojit s OctoPrintem"
-#: src/slic3r/Utils/OctoPrint.cpp:181
+#: src/slic3r/Utils/OctoPrint.cpp:191
msgid "Could not connect to Prusa SLA"
msgstr "Nelze se připojit k Prusa SLA"
-#: src/slic3r/GUI/Tab.cpp:1687
+#: src/slic3r/Utils/Http.cpp:73
+msgid "Could not detect system SSL certificate store. PrusaSlicer will be unable to establish secure network connections."
+msgstr "ÚložiÅ¡tÄ› systémových certifikátů SSL se nepodaÅ™ilo zjistit. PrusaSlicer nebude schopen navázat zabezpeÄené síťové pÅ™ipojení."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:289
msgid "Could not get a valid Printer Host reference"
msgstr "Nelze získat platný odkaz na tiskový server"
-#: src/slic3r/Utils/Duet.cpp:134
+#: src/slic3r/Utils/Duet.cpp:136
msgid "Could not get resources to create a new connection"
msgstr "Nelze získat prostředky pro vytvoření nového spojení"
-#: src/libslic3r/PrintConfig.cpp:1959
+#: src/libslic3r/PrintConfig.cpp:2101
msgid "Cover the top contact layer of the supports with loops. Disabled by default."
msgstr "Zakrýt smyÄkami horní kontaktní vrstvu podpÄ›r. Ve výchozím nastavení zakázáno."
-#: src/libslic3r/PrintConfig.cpp:89
+#: src/libslic3r/PrintConfig.cpp:91
msgid "Cracks smaller than 2x gap closing radius are being filled during the triangle mesh slicing. The gap closing operation may reduce the final print resolution, therefore it is advisable to keep the value reasonably low."
msgstr "Praskliny menší než 2x polomÄ›r uzavÅ™ení mezery se vyplní bÄ›hem slicování trojúhelníkových sítí. Operace uzavírání mezery může snížit koneÄné rozliÅ¡ení tisku, proto je vhodné udržovat rozumnÄ› nízkou hodnotu."
-#: src/libslic3r/Zipper.cpp:58
+#: src/libslic3r/miniz_extension.cpp:117
msgid "CRC-32 check failed"
msgstr "CRC-32 kontrola selhala"
-#: src/libslic3r/PrintConfig.cpp:2857
+#: src/libslic3r/PrintConfig.cpp:3021
msgid "Create pad around object and ignore the support elevation"
msgstr "Vytvoří podložku kolem objektu a ignorujte nadzvednutí objektu podpěrami"
-#: src/libslic3r/PrintConfig.cpp:2724
+#: src/libslic3r/PrintConfig.cpp:2888
msgid "Critical angle"
msgstr "Kritický úhel"
-#: src/libslic3r/PrintConfig.cpp:2668
+#: src/slic3r/GUI/GUI_App.cpp:589
+msgid "Critical error"
+msgstr "Kritická chyba"
+
+#: src/libslic3r/PrintConfig.cpp:2832
msgid "Cross"
msgstr "Cross"
-#: src/libslic3r/PrintConfig.cpp:847
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:203
+msgid "Ctrl + Mouse wheel"
+msgstr "Ctrl + koleÄko myÅ¡i"
+
+#: src/libslic3r/PrintConfig.cpp:885
msgid "Cubic"
msgstr "Kubická"
-#: src/slic3r/GUI/wxExtensions.cpp:704
-#, c-format
+#: src/slic3r/Utils/Http.cpp:91
+msgid "CURL init has failed. PrusaSlicer will be unable to establish network connections. See logs for additional details."
+msgstr "CURL init selhal. PrusaSlicer nebude schopen navázat síťová připojení. Další podrobnosti najdete v logu."
+
+#: src/slic3r/GUI/wxExtensions.cpp:624
+#, possible-c-format
msgid "Current mode is %s"
msgstr "Aktuální režim je %s"
-#: src/slic3r/GUI/Tab.cpp:959
+#: src/slic3r/GUI/Tab.cpp:1278
msgid "Current preset is inherited from"
msgstr "Aktuální nastavení je zděděné od"
-#: src/slic3r/GUI/Tab.cpp:957
+#: src/slic3r/GUI/Tab.cpp:1276
msgid "Current preset is inherited from the default preset."
msgstr "Aktuální nastavení je zděděno z výchozího nastavení."
@@ -1605,486 +1870,521 @@ msgstr "Aktuální nastavení je zděděno z výchozího nastavení."
msgid "Current version:"
msgstr "Aktuální verze:"
-#: src/slic3r/GUI/BedShapeDialog.cpp:98 src/slic3r/GUI/GUI_Preview.cpp:249
-#: src/libslic3r/ExtrusionEntity.cpp:322
+#: src/slic3r/GUI/BedShapeDialog.cpp:143 src/slic3r/GUI/GUI_Preview.cpp:314
+#: src/libslic3r/ExtrusionEntity.cpp:327 src/libslic3r/ExtrusionEntity.cpp:362
msgid "Custom"
msgstr "Vlastní"
-#: src/libslic3r/PrintConfig.cpp:112
+#: src/libslic3r/PrintConfig.cpp:114
msgid "Custom CA certificate file can be specified for HTTPS OctoPrint connections, in crt/pem format. If left blank, the default OS CA certificate repository is used."
msgstr "Pro HTTPS připojení OctoPrintu lze zadat vlastní CA certifikát ve formátu crt/pem. Pokud zůstane pole prázdné, použije se výchozí úložiště certifikátů OS CA."
-#: src/slic3r/GUI/Tab.cpp:1527 src/slic3r/GUI/Tab.cpp:1975
+#: src/slic3r/GUI/Tab.cpp:1872 src/slic3r/GUI/Tab.cpp:2160
+#: src/libslic3r/PrintConfig.cpp:1978
msgid "Custom G-code"
msgstr "Vlastní G-code"
-#: src/slic3r/GUI/DoubleSlider.cpp:1619
+#: src/slic3r/GUI/DoubleSlider.cpp:1815
msgid "Custom G-code on current layer (%1% mm)."
msgstr "Vlastní G-code v souÄasné vrstvÄ› (%1% mm)."
-#: src/slic3r/GUI/ConfigWizard.cpp:732
+#: src/slic3r/GUI/GCodeViewer.cpp:2580 src/slic3r/GUI/GUI_Preview.cpp:1477
+msgid "Custom G-codes"
+msgstr "Vlastní G-cody"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1091
msgid "Custom Printer"
msgstr "Vlastní tiskárna"
-#: src/slic3r/GUI/ConfigWizard.cpp:732
+#: src/slic3r/GUI/ConfigWizard.cpp:1091
msgid "Custom Printer Setup"
msgstr "Vlastní nastavení tiskárny"
-#: src/slic3r/GUI/ConfigWizard.cpp:736
+#: src/slic3r/GUI/ConfigWizard.cpp:1095
msgid "Custom profile name:"
msgstr "Vlastní název profilu:"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:42
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3402
+#: src/slic3r/GUI/Plater.cpp:3397
+msgid "Custom supports and seams were removed after repairing the mesh."
+msgstr "Po opravě modelu byly odstraněny vlastní podpěry a švy."
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1135
+msgid "Custom template (\"%1%\")"
+msgstr "Vlastní šablona (\"%1%\")"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:146 src/libslic3r/PrintConfig.cpp:3601
msgid "Cut"
msgstr "Řezat"
-#: src/slic3r/GUI/Plater.cpp:4786
+#: src/slic3r/GUI/Plater.cpp:4921
msgid "Cut by Plane"
msgstr "Řez Rovinou"
-#: src/libslic3r/PrintConfig.cpp:3403
+#: src/libslic3r/PrintConfig.cpp:3602
msgid "Cut model at the given Z."
msgstr "Rozříznout model v dané výšce Z."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1432
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
msgid "Cylinder"
msgstr "Válec"
-#: src/slic3r/GUI/MainFrame.cpp:568
+#: src/slic3r/GUI/MainFrame.cpp:1174
msgid "D&eselect all"
msgstr "OdznaÄit vÅ¡&e"
-#: src/libslic3r/PrintConfig.cpp:3504
+#: src/libslic3r/PrintConfig.cpp:3709
msgid "Data directory"
msgstr "Složka Data"
-#: src/slic3r/GUI/Mouse3DController.cpp:313
+#: src/slic3r/GUI/Mouse3DController.cpp:300
msgid "Deadzone:"
msgstr "Mrtvá zóna:"
-#: src/libslic3r/Zipper.cpp:52
+#: src/libslic3r/miniz_extension.cpp:111
msgid "decompression failed or archive is corrupted"
msgstr "dekomprese selhala nebo je archiv poškozen"
-#: src/slic3r/GUI/Plater.cpp:4720
+#: src/slic3r/GUI/Plater.cpp:4824
msgid "Decrease Instances"
msgstr "Odebrání Instancí"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1704 src/libslic3r/PrintConfig.cpp:335
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1832 src/libslic3r/PrintConfig.cpp:369
msgid "Default"
msgstr "Výchozí"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:457 src/slic3r/GUI/GUI_ObjectList.cpp:469
-#: src/slic3r/GUI/GUI_ObjectList.cpp:917 src/slic3r/GUI/GUI_ObjectList.cpp:3967
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3977
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4012
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:200
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:257
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:282
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:490
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:1753
+#: src/slic3r/GUI/ExtraRenderers.cpp:297 src/slic3r/GUI/GUI_ObjectList.cpp:496
+#: src/slic3r/GUI/GUI_ObjectList.cpp:508 src/slic3r/GUI/GUI_ObjectList.cpp:1015
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4454
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4464
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4499
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:202
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:259
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:284
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:492
msgid "default"
msgstr "výchozí"
-#: src/libslic3r/PrintConfig.cpp:777
+#: src/libslic3r/PrintConfig.cpp:813
msgid "Default base angle for infill orientation. Cross-hatching will be applied to this. Bridges will be infilled using the best direction Slic3r can detect, so this setting does not affect them."
msgstr "Výchozí úhel pro orientaci výplně. Bude pro něj použito křížové šrafování. Mosty budou vyplněny nejlepším směrem, který Slic3r dokáže rozpoznat, takže toto nastavení je neovlivní."
-#: src/libslic3r/PrintConfig.cpp:554
+#: src/slic3r/GUI/GCodeViewer.cpp:2289
+msgid "Default color"
+msgstr "Výchozí barva"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2313
+msgid "default color"
+msgstr "výchozí barva"
+
+#: src/libslic3r/PrintConfig.cpp:590
msgid "Default extrusion width"
msgstr "Výchozí šířka extruze"
-#: src/slic3r/GUI/Tab.cpp:987
+#: src/slic3r/GUI/Tab.cpp:1305
msgid "default filament profile"
msgstr "výchozí profil filamentu"
-#: src/libslic3r/PrintConfig.cpp:345
+#: src/libslic3r/PrintConfig.cpp:379
msgid "Default filament profile"
msgstr "Výchozí profil filamentu"
-#: src/libslic3r/PrintConfig.cpp:346
+#: src/libslic3r/PrintConfig.cpp:380
msgid "Default filament profile associated with the current printer profile. On selection of the current printer profile, this filament profile will be activated."
msgstr "Výchozí materiálový profil spojený se souÄasným profilem tiskárny. PÅ™i výbÄ›ru souÄasného profilu tiskárny se aktivuje tento materiálový profil."
-#: src/slic3r/GUI/Tab.cpp:2919
-#, c-format
-msgid "Default preset (%s)"
-msgstr "Výchozí přednastavení (%s)"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:904 src/slic3r/GUI/GLCanvas3D.cpp:933
-msgid "Default print color"
-msgstr "Výchozí barva tisku"
-
-#: src/slic3r/GUI/Tab.cpp:984
+#: src/slic3r/GUI/Tab.cpp:1302
msgid "default print profile"
msgstr "výchozí tiskový profil"
-#: src/libslic3r/PrintConfig.cpp:352
+#: src/libslic3r/PrintConfig.cpp:386
msgid "Default print profile"
msgstr "Výchozí tiskový profil"
-#: src/libslic3r/PrintConfig.cpp:353 src/libslic3r/PrintConfig.cpp:2592
-#: src/libslic3r/PrintConfig.cpp:2603
+#: src/libslic3r/PrintConfig.cpp:387 src/libslic3r/PrintConfig.cpp:2735
+#: src/libslic3r/PrintConfig.cpp:2746
msgid "Default print profile associated with the current printer profile. On selection of the current printer profile, this print profile will be activated."
msgstr "Výchozí tiskový profil spojený se souÄasným profilem tiskárny. PÅ™i výbÄ›ru souÄasného profilu tiskárny se aktivuje tento tiskový profil."
-#: src/slic3r/GUI/Tab.cpp:1001
+#: src/slic3r/GUI/Tab.cpp:1319
msgid "default SLA material profile"
msgstr "výchozí profil pro SLA materiál"
-#: src/libslic3r/PrintConfig.cpp:2591 src/libslic3r/PrintConfig.cpp:2602
+#: src/libslic3r/PrintConfig.cpp:2734 src/libslic3r/PrintConfig.cpp:2745
msgid "Default SLA material profile"
msgstr "Výchozí profil pro SLA materiál"
-#: src/slic3r/GUI/Tab.cpp:1005
+#: src/slic3r/GUI/Tab.cpp:1323
msgid "default SLA print profile"
msgstr "výchozí SLA tiskový profil"
-#: src/slic3r/GUI/Field.cpp:136
+#: src/slic3r/GUI/Field.cpp:184
msgid "default value"
msgstr "výchozí hodnota"
-#: src/slic3r/GUI/ConfigWizard.cpp:734
+#: src/slic3r/GUI/ConfigWizard.cpp:1093
msgid "Define a custom printer profile"
msgstr "Vytvořit vlastní tiskový profil"
-#: src/libslic3r/PrintConfig.cpp:2798
+#: src/libslic3r/PrintConfig.cpp:2962
msgid "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful when enabling this feature, as some resins may produce an extreme suction effect inside the cavity, which makes peeling the print off the vat foil difficult."
msgstr "Definuje hloubku dutiny. Chcete-li dutinu vypnout, nastavte ji na nulu. PÅ™i povolování této funkce buÄte opatrní, protože nÄ›které pryskyÅ™ice mohou způsobit extrémní sací efekt uvnitÅ™ dutiny, což ztěžuje odlupování tisku z fólie ve vaniÄce."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:346
+#: src/slic3r/GUI/GUI_ObjectList.cpp:393
msgid "degenerate facets"
msgstr "degenerace facetů"
-#: src/libslic3r/PrintConfig.cpp:640
+#: src/libslic3r/PrintConfig.cpp:676
msgid "Delay after unloading"
msgstr "Zpoždění po vyjmutí"
-#: src/slic3r/GUI/Tab.cpp:3121
+#: src/slic3r/GUI/Tab.cpp:3386
msgid "delete"
msgstr "smazat"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4475 src/slic3r/GUI/GUI_ObjectList.cpp:1718
-#: src/slic3r/GUI/Plater.cpp:3931 src/slic3r/GUI/Plater.cpp:3953
-#: src/slic3r/GUI/Tab.cpp:3124
+#: src/slic3r/GUI/GLCanvas3D.cpp:4841 src/slic3r/GUI/GUI_ObjectList.cpp:1846
+#: src/slic3r/GUI/Plater.cpp:3849 src/slic3r/GUI/Plater.cpp:3871
+#: src/slic3r/GUI/Tab.cpp:3423
msgid "Delete"
msgstr "Smazat"
-#: src/slic3r/GUI/MainFrame.cpp:575
+#: src/slic3r/GUI/MainFrame.cpp:1181
msgid "Delete &all"
msgstr "Sm&azat vše"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4484 src/slic3r/GUI/KBShortcutsDialog.cpp:129
-#: src/slic3r/GUI/Plater.cpp:4669
+#: src/slic3r/GUI/GLCanvas3D.cpp:4850 src/slic3r/GUI/KBShortcutsDialog.cpp:124
+#: src/slic3r/GUI/Plater.cpp:4774
msgid "Delete all"
msgstr "Smazat vše"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2176
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2341
msgid "Delete All Instances from Object"
msgstr "Smazat všechny instance objektu"
-#: src/slic3r/GUI/DoubleSlider.cpp:1516
+#: src/slic3r/GUI/DoubleSlider.cpp:1708
msgid "Delete color change"
msgstr "Smazat změnu barvy"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:220
msgid "Delete color change marker for current layer"
msgstr "Odebrat znaÄku zmÄ›ny barvy pro aktuální vrstvu"
-#: src/slic3r/GUI/DoubleSlider.cpp:1519
+#: src/slic3r/GUI/DoubleSlider.cpp:1711
msgid "Delete custom G-code"
msgstr "Smazat vlastní G-code"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:539
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:424
msgid "Delete drainage hole"
msgstr "Odstranění odtokového otvoru"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2192
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2357
msgid "Delete Height Range"
msgstr "Odstranění Rozsahu vrstev"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2246
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2412
msgid "Delete Instance"
msgstr "Smazání Instance"
-#: src/slic3r/GUI/Plater.cpp:2712
+#: src/slic3r/GUI/Plater.cpp:2673
msgid "Delete Object"
msgstr "Smazat Objekt"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:101
-#, c-format
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:104
+#, possible-c-format
msgid "Delete Option %s"
msgstr "Odebrání parametru %s"
-#: src/slic3r/GUI/DoubleSlider.cpp:1518
+#: src/slic3r/GUI/DoubleSlider.cpp:1710
msgid "Delete pause print"
msgstr "Odebrat pozastavení tisku"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:128
+#: src/slic3r/GUI/PresetComboBoxes.cpp:652
+msgid "Delete physical printer"
+msgstr "Odstranit fyzickou tiskárnu"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:659
+msgid "Delete Physical Printer"
+msgstr "Odstranit fyzickou tiskárnu"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:123
msgid "Delete selected"
msgstr "Smazat vybrané"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2830
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3221
msgid "Delete Selected"
msgstr "Smazání vybraných"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2693
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3083
msgid "Delete Selected Item"
msgstr "Smazat vybrané položky"
-#: src/slic3r/GUI/Plater.cpp:4677
+#: src/slic3r/GUI/Plater.cpp:4782
msgid "Delete Selected Objects"
msgstr "Odstranit vybrané objekty"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2152
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2319
msgid "Delete Settings"
msgstr "Smazat Nastavení"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2227
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2393
msgid "Delete Subobject"
msgstr "Smazání dílÄího objektu"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:631
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:514
msgid "Delete support point"
msgstr "Odebrání podpěrného bodu"
-#: src/slic3r/GUI/Tab.cpp:134
+#: src/slic3r/GUI/Tab.cpp:204
msgid "Delete this preset"
msgstr "Smazat přednastavení"
-#: src/slic3r/GUI/DoubleSlider.cpp:1035
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:55
+msgid "Delete this preset from this printer device"
+msgstr "Odstranit toto přednastavení z této tiskárny"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1160
msgid "Delete tick mark - Left click or press \"-\" key"
msgstr "Smazat znaÄku - Levé tlaÄítko myÅ¡i nebo klávesa \"-\""
-#: src/slic3r/GUI/DoubleSlider.cpp:1517
+#: src/slic3r/GUI/DoubleSlider.cpp:1709
msgid "Delete tool change"
msgstr "Smazat změnu nástroje"
-#: src/slic3r/GUI/MainFrame.cpp:576
+#: src/slic3r/GUI/MainFrame.cpp:1182
msgid "Deletes all objects"
msgstr "Smazat všechny objekty"
-#: src/slic3r/GUI/MainFrame.cpp:573
+#: src/slic3r/GUI/MainFrame.cpp:1179
msgid "Deletes the current selection"
msgstr "Smaže aktuální výběr"
-#: src/libslic3r/PrintConfig.cpp:717 src/libslic3r/PrintConfig.cpp:2503
-#: src/libslic3r/PrintConfig.cpp:2504
+#: src/libslic3r/PrintConfig.cpp:753 src/libslic3r/PrintConfig.cpp:2646
+#: src/libslic3r/PrintConfig.cpp:2647
msgid "Density"
msgstr "Hustota"
-#: src/libslic3r/PrintConfig.cpp:791
+#: src/libslic3r/PrintConfig.cpp:827
msgid "Density of internal infill, expressed in the range 0% - 100%."
-msgstr "Hustota vnitřní výplně, vyjádřená v rozmezí 0% až 100%."
+msgstr "Hustota vnitřní výplně vyjádřená v rozmezí 0 až 100 %."
-#: src/slic3r/GUI/Tab.cpp:1258 src/slic3r/GUI/Tab.cpp:1548
-#: src/slic3r/GUI/Tab.cpp:2019 src/slic3r/GUI/Tab.cpp:2135
-#: src/slic3r/GUI/Tab.cpp:3543 src/slic3r/GUI/Tab.cpp:3671
+#: src/slic3r/GUI/Tab.cpp:1588 src/slic3r/GUI/Tab.cpp:1895
+#: src/slic3r/GUI/Tab.cpp:2228 src/slic3r/GUI/Tab.cpp:2304
+#: src/slic3r/GUI/Tab.cpp:3959 src/slic3r/GUI/Tab.cpp:4090
msgid "Dependencies"
msgstr "Závislosti"
-#: src/libslic3r/PrintConfig.cpp:1612 src/libslic3r/PrintConfig.cpp:1613
+#: src/libslic3r/PrintConfig.cpp:1720 src/libslic3r/PrintConfig.cpp:1721
msgid "Deretraction Speed"
msgstr "Rychlost deretrakce"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:127
+#: src/slic3r/GUI/GCodeViewer.cpp:2529 src/slic3r/GUI/GUI_Preview.cpp:337
+#: src/slic3r/GUI/GUI_Preview.cpp:1473
+msgid "Deretractions"
+msgstr "Deretrakce"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:172
+msgid "Descriptive name for the printer"
+msgstr "Popisný název tiskárny"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:122
msgid "Deselect all"
msgstr "OdznaÄit vÅ¡e"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1369
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216
msgid "Deselect by rectangle"
msgstr "OdznaÄit obdélníkovým výbÄ›rem myÅ¡i"
-#: src/slic3r/GUI/MainFrame.cpp:569
+#: src/slic3r/GUI/MainFrame.cpp:1175
msgid "Deselects all objects"
msgstr "OdznaÄit vÅ¡echny objekty"
-#: src/slic3r/GUI/Tab.cpp:963
+#: src/slic3r/GUI/Tab.cpp:1224
msgid "Detach from system preset"
msgstr "Oddělit od systémového přednastavení"
-#: src/slic3r/GUI/Tab.cpp:984
+#: src/slic3r/GUI/Tab.cpp:1246
msgid "Detach preset"
msgstr "Oddělení přednastavení"
-#: src/slic3r/GUI/Tab.cpp:3029
+#: src/slic3r/GUI/Tab.cpp:3323
msgid "Detached"
msgstr "Odpojeno"
-#: src/libslic3r/PrintConfig.cpp:1373
+#: src/libslic3r/PrintConfig.cpp:1481
msgid "Detect bridging perimeters"
msgstr "Detekovat perimetry přemostění"
-#: src/libslic3r/PrintConfig.cpp:2075
+#: src/libslic3r/PrintConfig.cpp:2218
msgid "Detect single-width walls (parts where two extrusions don't fit and we need to collapse them into a single trace)."
msgstr "Detekuje stÄ›ny o tlouÅ¡Å¥ce jedné Äáry (Äásti, kam se dvÄ› Äáry nemohou vejít a je potÅ™eba slouÄit je do Äáry jedné)."
-#: src/libslic3r/PrintConfig.cpp:2073
+#: src/libslic3r/PrintConfig.cpp:2216
msgid "Detect thin walls"
msgstr "Detekovat tenké zdi"
-#: src/libslic3r/PrintConfig.cpp:3472
+#: src/libslic3r/PrintConfig.cpp:3671
msgid "Detect unconnected parts in the given model(s) and split them into separate objects."
msgstr "Rozpoznat nepÅ™ipojené Äásti daného modelu(ů) a rozdÄ›lit je do samostatných objektů."
-#: src/slic3r/GUI/Plater.cpp:2368
+#: src/slic3r/GUI/Plater.cpp:2330
msgid "Detected advanced data"
msgstr "Byla detekována data z pokroÄilého režimu"
-#: src/slic3r/GUI/Mouse3DController.cpp:289
+#: src/slic3r/GUI/Mouse3DController.cpp:274
msgid "Device:"
msgstr "Zařízení:"
-#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/libslic3r/PrintConfig.cpp:709
+#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:745
msgid "Diameter"
msgstr "Průměr"
-#: src/libslic3r/PrintConfig.cpp:2694
+#: src/libslic3r/PrintConfig.cpp:2858
msgid "Diameter in mm of the pillar base"
msgstr "Průměr základny podpěr v mm"
-#: src/libslic3r/PrintConfig.cpp:2650
+#: src/libslic3r/PrintConfig.cpp:2793
msgid "Diameter in mm of the support pillars"
msgstr "Průměr podpěrných sloupů v mm"
-#: src/libslic3r/PrintConfig.cpp:2622
+#: src/libslic3r/PrintConfig.cpp:2765
msgid "Diameter of the pointing side of the head"
msgstr "Průměr konce podpůrného hrotu"
-#: src/slic3r/GUI/BedShapeDialog.cpp:94
+#: src/slic3r/GUI/BedShapeDialog.cpp:131
msgid "Diameter of the print bed. It is assumed that origin (0,0) is located in the center."
msgstr "PrůmÄ›r tiskové podložky. PÅ™epokládaný poÄátek (0,0) je umístÄ›n uprostÅ™ed."
-#: src/libslic3r/PrintConfig.cpp:1639
+#: src/libslic3r/PrintConfig.cpp:1747
msgid "Direction"
msgstr "Směr"
-#: src/libslic3r/PrintConfig.cpp:359
+#: src/libslic3r/PrintConfig.cpp:393
msgid "Disable fan for the first"
msgstr "Vypnutí chlazení pro prvních"
-#: src/libslic3r/PrintConfig.cpp:1349
+#: src/libslic3r/PrintConfig.cpp:1457
msgid "Disables retraction when the travel path does not exceed the upper layer's perimeters (and thus any ooze will be probably invisible)."
msgstr "Vypne retrakce, pokud dráha nepÅ™ekroÄí perimetr vrchní vrstvy (a proto bude pravdÄ›podobnÄ› jakékoliv odkapávání neviditelné)."
-#: src/slic3r/GUI/DoubleSlider.cpp:952
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:641
+msgid "Discard"
+msgstr "Zahodit"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1066
msgid "Discard all custom changes"
msgstr "Odstranit všechny vámi provedené změny"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1375
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222
msgid "Discard changes"
msgstr "Zahodit změny"
-#: src/slic3r/GUI/GUI_App.cpp:932 src/slic3r/GUI/Tab.cpp:2946
-msgid "Discard changes and continue anyway?"
-msgstr "Zahodit zmÄ›ny a pokraÄovat?"
-
-#: src/slic3r/GUI/Tab.cpp:2078
+#: src/slic3r/GUI/Tab.cpp:2248
msgid "Display"
msgstr "Displej"
-#: src/libslic3r/PrintConfig.cpp:2359
+#: src/libslic3r/PrintConfig.cpp:2502
msgid "Display height"
msgstr "Výška displeje"
-#: src/libslic3r/PrintConfig.cpp:2378
+#: src/libslic3r/PrintConfig.cpp:2521
msgid "Display horizontal mirroring"
msgstr "Horizontální zrcadlení displeje"
-#: src/libslic3r/PrintConfig.cpp:2392
+#: src/libslic3r/PrintConfig.cpp:2535
msgid "Display orientation"
msgstr "Orientace displeje"
-#: src/slic3r/GUI/MainFrame.cpp:648
+#: src/slic3r/GUI/MainFrame.cpp:1258
msgid "Display the Print Host Upload Queue window"
msgstr "Zobrazit okno s frontou nahrávání do tiskového serveru"
-#: src/libslic3r/PrintConfig.cpp:2385
+#: src/libslic3r/PrintConfig.cpp:2528
msgid "Display vertical mirroring"
msgstr "Vertikální zrcadlení displeje"
-#: src/libslic3r/PrintConfig.cpp:2353
+#: src/libslic3r/PrintConfig.cpp:2496
msgid "Display width"
msgstr "Šířka displeje"
-#: src/libslic3r/PrintConfig.cpp:377
+#: src/libslic3r/PrintConfig.cpp:411
msgid "Distance between copies"
msgstr "Vzdálenost mezi kopiemi"
-#: src/libslic3r/PrintConfig.cpp:1680
+#: src/libslic3r/PrintConfig.cpp:1157
+msgid "Distance between ironing lines"
+msgstr "Vzdálenost mezi žehlicími tahy"
+
+#: src/libslic3r/PrintConfig.cpp:1788
msgid "Distance between skirt and object(s). Set this to zero to attach the skirt to the object(s) and get a brim for better adhesion."
msgstr "Vzdálenost mezi obrysem a objektem (objekty). Nastavte tuto hodnotu na nulu, pro slouÄení obrysu s pÅ™edmÄ›tem (pÅ™edmÄ›ty) a tvorbu límce pro dosažení lepší pÅ™ilnavosti."
-#: src/libslic3r/PrintConfig.cpp:2882
+#: src/libslic3r/PrintConfig.cpp:3046
msgid "Distance between two connector sticks which connect the object and the generated pad."
msgstr "RozteÄ mezi dvÄ›mi spojkami, které spojují objekt s vygenerovanou podložkou."
-#: src/libslic3r/PrintConfig.cpp:1679
+#: src/libslic3r/PrintConfig.cpp:1787
msgid "Distance from object"
msgstr "Vzdálenost od objektu"
-#: src/slic3r/GUI/BedShapeDialog.cpp:85
+#: src/slic3r/GUI/BedShapeDialog.cpp:121
msgid "Distance of the 0,0 G-code coordinate from the front left corner of the rectangle."
msgstr "Vzdálenost souřadnice 0,0 G-code od předního levého rohu obdélníku."
-#: src/libslic3r/PrintConfig.cpp:320
+#: src/libslic3r/PrintConfig.cpp:354
msgid "Distance of the center-point of the cooling tube from the extruder tip."
msgstr "Vzdálenost ze stÅ™edu chladící trubiÄky ke Å¡piÄce extruderu."
-#: src/libslic3r/PrintConfig.cpp:1382
+#: src/libslic3r/PrintConfig.cpp:1490
msgid "Distance of the extruder tip from the position where the filament is parked when unloaded. This should match the value in printer firmware."
msgstr "Vzdálenost Å¡piÄky extruderu od místa, kde je zaparkován filament pÅ™i vytažení. MÄ›la by se shodovat s hodnotou ve firmware tiskárny."
-#: src/libslic3r/PrintConfig.cpp:378
+#: src/libslic3r/PrintConfig.cpp:412
msgid "Distance used for the auto-arrange feature of the plater."
msgstr "Vzdálenost, použitá pro funkci automatického rozmístění po podložce."
-#: src/libslic3r/PrintConfig.cpp:3486
+#: src/libslic3r/PrintConfig.cpp:3685
msgid "Do not fail if a file supplied to --load does not exist."
msgstr "Nepodaří se, pokud neexistuje soubor dodaný k pÅ™epínaÄi --load."
-#: src/libslic3r/PrintConfig.cpp:3430
+#: src/libslic3r/PrintConfig.cpp:3629
msgid "Do not rearrange the given models before merging and keep their original XY coordinates."
msgstr "NepÅ™euspořádávejte modely pÅ™ed slouÄením a tím ponecháním jejich původních souÅ™adnic v XY."
-#: src/slic3r/GUI/Field.cpp:240
-#, c-format
-msgid ""
-"Do you mean %s%% instead of %s %s?\n"
-"Select YES if you want to change this value to %s%%, \n"
-"or NO if you are sure that %s %s is a correct value."
-msgstr ""
-"Myslíte %s%% namísto %s %s?\n"
-"Vyberte ANO, pokud chcete změnit tuto hodnotu na %s%%,\n"
-"nebo NE, pokud jste si jisti, že %s %s je správná hodnota."
+#: src/slic3r/GUI/Field.cpp:288
+#, possible-c-format
+msgid "Do you mean %s%% instead of %s %s?\nSelect YES if you want to change this value to %s%%, \nor NO if you are sure that %s %s is a correct value."
+msgstr "Myslíte %s%% namísto %s %s?\nVyberte ANO, pokud chcete změnit tuto hodnotu na %s%%,\nnebo NE, pokud jste si jisti, že %s %s je správná hodnota."
-#: src/slic3r/GUI/DoubleSlider.cpp:1920
+#: src/slic3r/GUI/DoubleSlider.cpp:2138
msgid "Do you want to delete all saved tool changes?"
msgstr "Opravdu chcete odstranit všechny uložené změny nástrojů?"
-#: src/slic3r/GUI/GUI_App.cpp:884
+#: src/slic3r/GUI/GUI_App.cpp:1610
msgid "Do you want to proceed?"
msgstr "Chcete pokraÄovat?"
-#: src/slic3r/GUI/Plater.cpp:3321
+#: src/slic3r/GUI/Plater.cpp:3124
msgid "Do you want to retry"
msgstr "Chcete to zkusit znovu"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1045
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:911
msgid "Do you want to save your manually edited support points?"
msgstr "Chcete uložit ruÄnÄ› upravené podpÄ›rné body?"
-#: src/slic3r/GUI/ConfigWizard.cpp:1834
+#: src/slic3r/GUI/ConfigWizard.cpp:2261
msgid "Do you want to select default filaments for these FFF printer models?"
msgstr "Chcete pro tyto modely FFF tiskáren vybrat výchozí filamenty?"
-#: src/slic3r/GUI/ConfigWizard.cpp:1852
+#: src/slic3r/GUI/ConfigWizard.cpp:2279
msgid "Do you want to select default SLA materials for these printer models?"
msgstr "Chcete pro tyto modely tiskáren vybrat výchozí SLA materiály?"
-#: src/libslic3r/PrintConfig.cpp:3429
+#: src/slic3r/GUI/Plater.cpp:4751
+msgid "does not contain valid gcode."
+msgstr "neobsahuje platný G-code."
+
+#: src/libslic3r/PrintConfig.cpp:3628
msgid "Don't arrange"
msgstr "Neuspořádávat"
@@ -2092,7 +2392,11 @@ msgstr "Neuspořádávat"
msgid "Don't notify about new releases any more"
msgstr "Neupozorňovat na nové verze"
-#: src/libslic3r/PrintConfig.cpp:369
+#: src/slic3r/GUI/Plater.cpp:1431
+msgid "Don't show again"
+msgstr "Znovu nezobrazovat"
+
+#: src/libslic3r/PrintConfig.cpp:403
msgid "Don't support bridges"
msgstr "Nevytvářet podpěry pod mosty"
@@ -2100,262 +2404,348 @@ msgstr "Nevytvářet podpěry pod mosty"
msgid "Downgrade"
msgstr "Downgrade"
-#: src/libslic3r/PrintConfig.cpp:1695
+#: src/libslic3r/PrintConfig.cpp:1803
msgid "Draft shield"
msgstr "Ochranný štít"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1368
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1369
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216
msgid "Drag"
msgstr "Tažení"
-#: src/libslic3r/SLAPrintSteps.cpp:44
+#: src/slic3r/GUI/Plater.cpp:1406
+msgid "Drag and drop G-code file"
+msgstr "Přetáhněte soubor G-code"
+
+#: src/libslic3r/SLAPrintSteps.cpp:45
msgid "Drilling holes into model."
msgstr "Vrtání otvorů do modelu."
-#: src/libslic3r/SLAPrintSteps.cpp:199
+#: src/libslic3r/SLAPrintSteps.cpp:201
msgid "Drilling holes into the mesh failed. This is usually caused by broken model. Try to fix it first."
msgstr "Vrtání otvorů do meshe selhalo. Je to obvykle způsobené poškozeným modelem. Zkuste ho nejprve opravit."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:337
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:349
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:345
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:357
msgid "Drop to bed"
msgstr "Spadnout na podložku"
-#: src/libslic3r/PrintConfig.cpp:3433
+#: src/libslic3r/PrintConfig.cpp:3632
msgid "Duplicate"
msgstr "Duplikovat"
-#: src/libslic3r/PrintConfig.cpp:3438
+#: src/libslic3r/PrintConfig.cpp:3637
msgid "Duplicate by grid"
msgstr "Duplikovat mřížkou"
-#: src/slic3r/GUI/PresetHints.cpp:40
-msgid "During the other layers, fan"
-msgstr "V průběhu ostatních vrstev, ventilátor"
+#: src/slic3r/GUI/GCodeViewer.cpp:2445
+msgid "Duration"
+msgstr "Doba trvání"
-#: src/libslic3r/PrintConfig.cpp:2669
+#: src/slic3r/GUI/PresetHints.cpp:51
+msgid "During the other layers, fan will always run at %1%%%"
+msgstr "Během ostatních vrstev bude ventilátor vždy běžet na %1%%%"
+
+#: src/slic3r/GUI/PresetHints.cpp:58
+msgid "During the other layers, fan will be turned off."
+msgstr "Během ostatních vrstev bude ventilátor vypnutý."
+
+#: src/libslic3r/PrintConfig.cpp:2833
msgid "Dynamic"
msgstr "Dynamic"
-#: src/slic3r/GUI/MainFrame.cpp:749
+#: src/slic3r/GUI/MainFrame.cpp:1448
msgid "E&xport"
msgstr "E&xportovat"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:347
+#: src/slic3r/GUI/GUI_ObjectList.cpp:394
msgid "edges fixed"
msgstr "hrany opraveny"
-#: src/slic3r/GUI/DoubleSlider.cpp:1508
+#: src/slic3r/GUI/DoubleSlider.cpp:1700
msgid "Edit color"
msgstr "Upravit barvu"
-#: src/slic3r/GUI/DoubleSlider.cpp:960
+#: src/slic3r/GUI/DoubleSlider.cpp:1083
msgid "Edit current color - Right click the colored slider segment"
msgstr "Upravit aktuální barvu - Klik pravým tlaÄítkem na barevný segment posuvníku"
-#: src/slic3r/GUI/DoubleSlider.cpp:1510
+#: src/slic3r/GUI/DoubleSlider.cpp:1702
msgid "Edit custom G-code"
msgstr "Upravit vlastní G-code"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3003
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3459
msgid "Edit Height Range"
msgstr "Úprava Rozsahu vrstev"
-#: src/slic3r/GUI/DoubleSlider.cpp:1509
+#: src/slic3r/GUI/DoubleSlider.cpp:1701
msgid "Edit pause print message"
msgstr "Upravit zprávu při pozastavení tisku"
-#: src/slic3r/GUI/DoubleSlider.cpp:1037
+#: src/slic3r/GUI/PresetComboBoxes.cpp:645
+msgid "Edit physical printer"
+msgstr "Upravit fyzickou tiskárnu"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:641
+msgid "Edit preset"
+msgstr "Upravit přednastavení"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1162
msgid "Edit tick mark - Ctrl + Left click"
msgstr "Upravit znaÄku - Ctrl + Levé tlaÄítko myÅ¡i"
-#: src/slic3r/GUI/DoubleSlider.cpp:1038
+#: src/slic3r/GUI/DoubleSlider.cpp:1163
msgid "Edit tick mark - Right click"
msgstr "Upravit znaÄku - Pravé tlaÄítko myÅ¡i"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:282 src/slic3r/GUI/GUI_ObjectList.cpp:394
+#: src/slic3r/GUI/GUI_ObjectList.cpp:300 src/slic3r/GUI/GUI_ObjectList.cpp:441
msgid "Editing"
msgstr "Editace"
-#: src/slic3r/GUI/MainFrame.cpp:547
+#: src/slic3r/GUI/MainFrame.cpp:1105
msgid "Ejec&t SD card / Flash drive"
msgstr "Vysunou&t SD kartu / Flash disk"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:126
+#: src/slic3r/GUI/NotificationManager.cpp:780
+msgid "Eject drive"
+msgstr "Vysunout úložiště"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:119
msgid "Eject SD card / Flash drive"
msgstr "Vysunout SD kartu / Flash disk"
-#: src/slic3r/GUI/MainFrame.cpp:547
+#: src/slic3r/GUI/MainFrame.cpp:1105
msgid "Eject SD card / Flash drive after the G-code was exported to it."
msgstr "Vysunout SD kartu / Flash disk po vyexportování G-codu."
-#: src/slic3r/GUI/Plater.cpp:2202
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:2034
+#, possible-c-format
msgid "Ejecting of device %s(%s) has failed."
msgstr "Vysunutí zařízení %s(%s) se nezdařilo."
-#: src/libslic3r/PrintConfig.cpp:118
+#: src/libslic3r/PrintConfig.cpp:120
msgid "Elephant foot compensation"
msgstr "Kompenzace rozplácnutí první vrstvy"
-#: src/libslic3r/PrintConfig.cpp:2447
+#: src/libslic3r/PrintConfig.cpp:2590
msgid "Elephant foot minimum width"
msgstr "Minimální šířka po kompenzaci rozplácnutí první vrstvy"
-#: src/libslic3r/SLAPrint.cpp:625
+#: src/libslic3r/SLAPrint.cpp:639
msgid "Elevation is too low for object. Use the \"Pad around object\" feature to print the object without elevation."
msgstr "Nadzvednutí objektu je příliš malé. Pomocí funkce „Podložka okolo objektu“ můžete objekt vytisknout bez nadzvednutí nad podložku."
-#: src/libslic3r/PrintConfig.cpp:1093
+#: src/libslic3r/PrintConfig.cpp:1186
msgid "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute intervals into the G-code to let the firmware show accurate remaining time. As of now only the Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 firmware supports M73 Qxx Sxx for the silent mode."
msgstr "Vkládání M73 P[poÄet vytiÅ¡tÄ›ných procent] R[zbývající Äas v minutách] v 1 minutových intervalech do G-codu, aby firmware ukázal pÅ™esný zbývající Äas. M73 nyní rozpoznává pouze firmware tiskárny Prusa i3 MK3. Firmware i3 MK3 také podporuje M73 Qxx Sxx pro tichý režim."
-#: src/libslic3r/GCode.cpp:637
+#: src/libslic3r/PrintConfig.cpp:1217
+msgid "Emit to G-code"
+msgstr "Emitivat do G-codu"
+
+#: src/libslic3r/GCode.cpp:622
msgid "Empty layers detected, the output would not be printable."
msgstr "Byly detekovány prázdné vrstvy, model by nebylo možné vytisknout."
-#: src/slic3r/GUI/Tab.cpp:1445 src/libslic3r/PrintConfig.cpp:1355
-#: src/libslic3r/PrintConfig.cpp:2200
+#: src/slic3r/GUI/Tab.cpp:1791 src/libslic3r/PrintConfig.cpp:1463
+#: src/libslic3r/PrintConfig.cpp:2343
msgid "Enable"
msgstr "Zapnout"
-#: src/libslic3r/PrintConfig.cpp:313
+#: src/libslic3r/PrintConfig.cpp:347
msgid "Enable auto cooling"
msgstr "Zapnutí automatického chlazení"
-#: src/libslic3r/PrintConfig.cpp:572
+#: src/libslic3r/PrintConfig.cpp:608
msgid "Enable fan if layer print time is below"
msgstr "Zapnout ventilátor, pokud je doba tisku vrstvy kratší než"
-#: src/libslic3r/PrintConfig.cpp:2908
+#: src/libslic3r/PrintConfig.cpp:3072
msgid "Enable hollowing"
msgstr "Povolit tvorbu dutin"
-#: src/libslic3r/PrintConfig.cpp:2380
+#: src/libslic3r/PrintConfig.cpp:2523
msgid "Enable horizontal mirroring of output images"
msgstr "Zapne horizontální zrcadlení výstupních obrázků"
-#: src/libslic3r/PrintConfig.cpp:1867
+#: src/libslic3r/PrintConfig.cpp:1124
+msgid "Enable ironing"
+msgstr "Zapnout ironing"
+
+#: src/libslic3r/PrintConfig.cpp:1125
+msgid "Enable ironing of the top layers with the hot print head for smooth surface"
+msgstr "Pro hladké vrchní vrstvy povolte ironing pomocí ohřáté tiskové hlavy"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3901
+msgid "Enable rotations (slow)"
+msgstr "Povolit rotace (pomalé)"
+
+#: src/slic3r/GUI/Preferences.cpp:207
+msgid "Enable support for legacy 3DConnexion devices"
+msgstr "Povit podporu pro starší zařízení 3DConnexion"
+
+#: src/libslic3r/PrintConfig.cpp:2009
msgid "Enable support material generation."
msgstr "Zapne generování podpěr."
-#: src/libslic3r/PrintConfig.cpp:966
+#: src/libslic3r/PrintConfig.cpp:1010
msgid "Enable this to add comments into the G-Code labeling print moves with what object they belong to, which is useful for the Octoprint CancelObject plugin. This settings is NOT compatible with Single Extruder Multi Material setup and Wipe into Object / Wipe into Infill."
msgstr "ZapnÄ›te tuto možnost, chcete-li do G-Code pÅ™idávat komentáře, které budou urÄovat, přísluÅ¡nost tiskových pohybů k jednotlivým objektům. To je užiteÄné pro Octoprint plugin CancelObject. Nastavení NENà kompatibilní se Single Extruder Multi Material konfigurací a s ÄiÅ¡tÄ›ním trysky do objektu / výplnÄ›."
-#: src/libslic3r/PrintConfig.cpp:929
+#: src/libslic3r/PrintConfig.cpp:973
msgid "Enable this to get a commented G-code file, with each line explained by a descriptive text. If you print from SD card, the additional weight of the file could make your firmware slow down."
msgstr "Aktivací získáte komentovaný soubor G-code, pÅ™iÄemž každý řádek je doplnÄ›n popisným textem. Pokud tisknete z SD karty, dodateÄné informace v souboru můžou zpomalit firmware."
-#: src/libslic3r/PrintConfig.cpp:2186
+#: src/libslic3r/PrintConfig.cpp:2329
msgid "Enable variable layer height feature"
msgstr "Zapnout variabilní výšku vrstev"
-#: src/libslic3r/PrintConfig.cpp:2387
+#: src/libslic3r/PrintConfig.cpp:2530
msgid "Enable vertical mirroring of output images"
msgstr "Zapne vertikální zrcadlení výstupních obrázků"
-#: src/slic3r/GUI/Tab.cpp:1534 src/slic3r/GUI/Tab.cpp:1982
-#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:395
+#: src/slic3r/GUI/Tab.cpp:1880 src/slic3r/GUI/Tab.cpp:2168
+#: src/libslic3r/PrintConfig.cpp:419 src/libslic3r/PrintConfig.cpp:429
msgid "End G-code"
msgstr "Konec G-code"
-#: src/libslic3r/PrintConfig.cpp:1924
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:239
+msgid "Enforce"
+msgstr "Vynutit"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:30
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:381
+msgid "Enforce seam"
+msgstr "Vynucení švu"
+
+#: src/libslic3r/PrintConfig.cpp:2066
msgid "Enforce support for the first"
msgstr "Zesílit podpěry pro prvních"
-#: src/libslic3r/PrintConfig.cpp:1931
+#: src/libslic3r/PrintConfig.cpp:2073
msgid "Enforce support for the first n layers"
msgstr "Vynucení podpěr pro prvních n vrstev"
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47
+msgid "Enforce supports"
+msgstr "Vynucení podpěr"
+
#: src/slic3r/GUI/PrintHostDialogs.cpp:198
#: src/slic3r/GUI/PrintHostDialogs.cpp:229
msgid "Enqueued"
msgstr "Zařazeno do fronty"
-#: src/libslic3r/PrintConfig.cpp:407
+#: src/libslic3r/PrintConfig.cpp:441
msgid "Ensure vertical shell thickness"
msgstr "Zajistit tloušťku svislých stěn"
-#: src/slic3r/GUI/DoubleSlider.cpp:1618
+#: src/slic3r/GUI/GLCanvas3D.cpp:4402 src/slic3r/GUI/GLCanvas3D.cpp:4410
+#: src/slic3r/GUI/Search.cpp:433
+msgid "Enter a search term"
+msgstr "Zadejte hledaný výraz"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1814
msgid "Enter custom G-code used on current layer"
msgstr "Vložte vlastní G-code použitý v této vrstvě"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3803
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4266
msgid "Enter new name"
msgstr "Zadejte nový název"
-#: src/slic3r/GUI/DoubleSlider.cpp:1634
+#: src/slic3r/GUI/DoubleSlider.cpp:1830
msgid "Enter short message shown on Printer display when a print is paused"
msgstr "Zadejte krátkou zprávu, která se zobrazí na displeji tiskárny při pozastavení tisku"
-#: src/slic3r/GUI/ConfigWizard.cpp:1047
+#: src/slic3r/GUI/ConfigWizard.cpp:1413
msgid "Enter the bed temperature needed for getting your filament to stick to your heated bed."
msgstr "Zadejte požadovanou teplotu filamentu, aby se spojil s vyhřívanou podložkou."
-#: src/slic3r/GUI/ConfigWizard.cpp:979
+#: src/slic3r/GUI/ConfigWizard.cpp:1345
msgid "Enter the diameter of your filament."
msgstr "Zadejte průměr vašeho filamentu."
-#: src/slic3r/GUI/ConfigWizard.cpp:966
+#: src/slic3r/GUI/ConfigWizard.cpp:1332
msgid "Enter the diameter of your printer's hot end nozzle."
msgstr "Zadejte průměr trysky hotendu vaší tiskárny."
-#: src/slic3r/GUI/DoubleSlider.cpp:1650
+#: src/slic3r/GUI/DoubleSlider.cpp:1851 src/slic3r/GUI/DoubleSlider.cpp:1855
msgid "Enter the height you want to jump to"
msgstr "Zadejte výšku, na kterou chcete přejít"
-#: src/slic3r/GUI/Plater.cpp:4751
+#: src/slic3r/GUI/DoubleSlider.cpp:1851
+msgid "Enter the move you want to jump to"
+msgstr "Zadejte pohyb v rámci vrstvy, na který chcete přejít"
+
+#: src/slic3r/GUI/Plater.cpp:4855
msgid "Enter the number of copies:"
msgstr "Zadejte poÄet kopií:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1033
+#: src/slic3r/GUI/ConfigWizard.cpp:1399
msgid "Enter the temperature needed for extruding your filament."
msgstr "Zadejte požadovanou teplotu pro extruzi vašeho filamentu."
-#: src/libslic3r/PrintConfig.cpp:761
+#: src/libslic3r/PrintConfig.cpp:813
+msgid "Enter weight of the empty filament spool. One may weigh a partially consumed filament spool before printing and one may compare the measured weight with the calculated weight of the filament with the spool to find out whether the amount of filament on the spool is sufficient to finish the print."
+msgstr "Zadejte hmotnost prázdné cívky. Díky tomu budete moci urÄit, zda máte na cívce dostateÄné množství filamentu pro dokonÄení tisku. Zvážíte cívku s ÄásteÄnÄ› spotÅ™ebovaným filamentem a hodnotu porovnáte s vypoÄtenou hmotností vypoÄítanou PrusaSlicerem. "
+
+#: src/libslic3r/PrintConfig.cpp:797
msgid "Enter your filament cost per kg here. This is only for statistical information."
msgstr "Zde zadejte cenu filamentu za kg. Slouží pouze pro statistické informace."
-#: src/libslic3r/PrintConfig.cpp:718
+#: src/libslic3r/PrintConfig.cpp:754
msgid "Enter your filament density here. This is only for statistical information. A decent way is to weigh a known length of filament and compute the ratio of the length to volume. Better is to calculate the volume directly through displacement."
msgstr "Zde zadejte hustotu filamentu. Toto je pouze pro statistické informace. Přípustný způsob je zvážit známou délku filamentu a vypoÄítat pomÄ›r délky k objemu. Je lepší vypoÄítat objem přímo pÅ™es posun."
-#: src/libslic3r/PrintConfig.cpp:710
+#: src/libslic3r/PrintConfig.cpp:746
msgid "Enter your filament diameter here. Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average."
msgstr "Zde zadejte průmÄ›r filamentu. Je zapotÅ™ebí správné pÅ™esnosti, proto použijte Å¡upleru a proveÄte nÄ›kolik měření podél filamentu, poté vypoÄtete průmÄ›r."
-#: src/slic3r/GUI/MainFrame.cpp:422 src/slic3r/GUI/MainFrame.cpp:785
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:39
+msgid "Entering Paint-on supports"
+msgstr "Vstup do Malování podpěr"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:40
+msgid "Entering Seam painting"
+msgstr "Vstup do Malování švu"
+
+#: src/slic3r/GUI/MainFrame.cpp:1003 src/slic3r/GUI/MainFrame.cpp:1486
#: src/slic3r/GUI/PrintHostDialogs.cpp:231
msgid "Error"
msgstr "Chyba"
#: src/slic3r/GUI/FirmwareDialog.cpp:645
-#, c-format
+#, possible-c-format
msgid "Error accessing port at %s: %s"
msgstr "Chyba při přístupu k portu na %s : %s"
-#: src/slic3r/GUI/Plater.cpp:3433
+#: src/slic3r/GUI/Plater.cpp:3238
msgid "Error during reload"
msgstr "Chyba pÅ™i opÄ›tovném naÄtení souboru"
-#: src/slic3r/GUI/Plater.cpp:5043
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:5172
+#, possible-c-format
msgid "Error exporting 3MF file %s"
msgstr "Chyba při exportu souboru 3MF %s"
-#: src/slic3r/GUI/Plater.cpp:5005
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:5138
+#, possible-c-format
msgid "Error exporting AMF file %s"
msgstr "Chyba při exportu souboru AMF %s"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:154
+#: src/slic3r/GUI/OpenGLManager.cpp:276
+msgid "Error loading shaders"
+msgstr "Chyba pÅ™i naÄítání shaderů"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:152
msgid "Error Message"
msgstr "Chybová hláška"
-#: src/slic3r/GUI/AppConfig.cpp:114
+#: src/slic3r/GUI/GUI_App.cpp:661
+msgid "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to manually delete the file to recover from the error."
+msgstr "Chyba pÅ™i zpracování konfiguraÄního souboru PrusaGCodeVieweru. Je pravdÄ›podobnÄ› poÅ¡kozený. Pro zotavení zkuste soubor ruÄnÄ› odstranit."
+
+#: src/slic3r/GUI/GUI_App.cpp:655 src/slic3r/GUI/GUI_App.cpp:670
msgid "Error parsing PrusaSlicer config file, it is probably corrupted. Try to manually delete the file to recover from the error. Your user profiles will not be affected."
msgstr "Chyba pÅ™i naÄítání konfiguraÄního souboru PrusaSliceru. Soubor je pravdÄ›podobnÄ› poÅ¡kozen. Zkuste soubor ruÄnÄ› smazat . VaÅ¡e uživatelské profily nebudou ovlivnÄ›ny."
@@ -2363,163 +2753,195 @@ msgstr "Chyba pÅ™i naÄítání konfiguraÄního souboru PrusaSliceru. Soubor je
msgid "Error uploading to print host:"
msgstr "Chyba při nahrávání do tiskového serveru:"
-#: src/libslic3r/Zipper.cpp:102
+#: src/slic3r/GUI/Plater.cpp:4752
+msgid "Error while loading .gcode file"
+msgstr "Chyba pÅ™i naÄítání souboru .gcode"
+
+#: src/libslic3r/Zipper.cpp:27
msgid "Error with zip archive"
msgstr "Chyba v zip archivu"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1918
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2077
msgid "Error!"
msgstr "Chyba!"
-#: src/slic3r/GUI/BedShapeDialog.cpp:505
+#: src/slic3r/GUI/BedShapeDialog.cpp:581
msgid "Error! Invalid model"
msgstr "Chyba! Neplatný model"
+#: src/slic3r/GUI/NotificationManager.cpp:667
+#: src/slic3r/GUI/NotificationManager.cpp:683
+#: src/slic3r/GUI/NotificationManager.cpp:694
+msgid "ERROR:"
+msgstr "CHYBA:"
+
#: src/slic3r/GUI/FirmwareDialog.cpp:647
-#, c-format
+#, possible-c-format
msgid "Error: %s"
msgstr "Chyba: %s"
-#: src/slic3r/GUI/Job.hpp:123
+#: src/slic3r/GUI/Jobs/Job.cpp:74
msgid "ERROR: not enough resources to execute a new job."
msgstr "CHYBA: nedostatek prostředků ke spuštění nové úlohy."
-#: src/slic3r/GUI/Plater.cpp:240 src/slic3r/GUI/Plater.cpp:1216
-#: src/slic3r/GUI/Plater.cpp:1258
+#: src/slic3r/GUI/Plater.cpp:3374
+msgid "ERROR: Please close all manipulators available from the left toolbar before fixing the mesh."
+msgstr "CHYBA: Před opravou modelu zavřete všechny manipulátory dostupné z levého panelu nástrojů."
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2552 src/slic3r/GUI/GCodeViewer.cpp:2557
+#: src/slic3r/GUI/Plater.cpp:246 src/slic3r/GUI/Plater.cpp:1125
+#: src/slic3r/GUI/Plater.cpp:1175 src/slic3r/GUI/Plater.cpp:1196
msgid "Estimated printing time"
msgstr "Odhadovaný Äas tisku"
-#: src/slic3r/GUI/Plater.cpp:502
+#: src/slic3r/GUI/GCodeViewer.cpp:2442 src/slic3r/GUI/GCodeViewer.cpp:2445
+msgid "Event"
+msgstr "Akce"
+
+#: src/slic3r/GUI/Plater.cpp:368
msgid "Everywhere"
msgstr "VÅ¡ude"
-#: src/slic3r/GUI/PresetHints.cpp:51
+#: src/slic3r/GUI/PresetHints.cpp:50
msgid "except for the first %1% layers."
msgstr "s výjimkou prvních %1% vrstev."
-#: src/slic3r/GUI/PresetHints.cpp:53
+#: src/slic3r/GUI/PresetHints.cpp:52
msgid "except for the first layer."
msgstr "vyjma první vrstvy."
-#: src/libslic3r/Print.cpp:1377
+#: src/libslic3r/Print.cpp:1403
msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm"
msgstr "Příliš velká hodnota proměnné %1% =%2% mm pro tisk s průměrem trysky %3% mm"
#: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246
-#, c-format
+#, possible-c-format
msgid "Exit %s"
msgstr "UkonÄit %s"
-#: src/libslic3r/PrintConfig.cpp:371
+#: src/slic3r/GUI/Plater.cpp:2143
+msgid "Expand sidebar"
+msgstr "Rozbalit postranní panel"
+
+#: src/libslic3r/PrintConfig.cpp:405
msgid "Experimental option for preventing support material from being generated under bridged areas."
msgstr "Experimentální nastavení pro zabránění tvorbě podpěr v oblastech po mosty."
-#: src/libslic3r/PrintConfig.cpp:1375
+#: src/libslic3r/PrintConfig.cpp:1483
msgid "Experimental option to adjust flow for overhangs (bridge flow will be used), to apply bridge speed to them and enable fan."
msgstr "Experimentální volba pro nastavení průtoku pro přesahy (použije se průtok jako u mostů), aplikuje se na ně rychlost mostu a spustí se ventilátor."
-#: src/slic3r/GUI/GUI_App.cpp:815 src/slic3r/GUI/wxExtensions.cpp:755
+#: src/slic3r/GUI/GUI_App.cpp:1507 src/slic3r/GUI/wxExtensions.cpp:676
msgid "Expert"
msgstr "Expert"
-#: src/slic3r/GUI/ConfigWizard.cpp:822
+#: src/slic3r/GUI/ConfigWizard.cpp:1181
msgid "Expert mode"
msgstr "Expertní režim"
-#: src/slic3r/GUI/GUI_App.cpp:815
+#: src/slic3r/GUI/GUI_App.cpp:1507
msgid "Expert View Mode"
msgstr "Režim Expert"
-#: src/slic3r/GUI/Plater.cpp:5521
+#: src/slic3r/GUI/Plater.cpp:5706
msgid "Export"
msgstr "Exportovat"
-#: src/slic3r/GUI/MainFrame.cpp:500
+#: src/slic3r/GUI/MainFrame.cpp:1094
msgid "Export &Config"
msgstr "Exportovat Konfigura&ci"
-#: src/slic3r/GUI/MainFrame.cpp:477 src/slic3r/GUI/MainFrame.cpp:749
+#: src/slic3r/GUI/MainFrame.cpp:1068 src/slic3r/GUI/MainFrame.cpp:1448
msgid "Export &G-code"
msgstr "Exportovat &G-code"
-#: src/slic3r/GUI/MainFrame.cpp:496
+#: src/slic3r/GUI/MainFrame.cpp:1090 src/slic3r/GUI/MainFrame.cpp:1395
msgid "Export &toolpaths as OBJ"
msgstr "Exportovat &trasy extruderu jako OBJ"
-#: src/libslic3r/PrintConfig.cpp:3338
+#: src/libslic3r/PrintConfig.cpp:3531
msgid "Export 3MF"
msgstr "Exportovat 3MF"
-#: src/slic3r/GUI/MainFrame.cpp:503
+#: src/slic3r/GUI/MainFrame.cpp:1100
+msgid "Export all presets including physical printers to file"
+msgstr "Exportovat do souboru vÅ¡echna pÅ™ednastavení vÄetnÄ› fyzických tiskáren"
+
+#: src/slic3r/GUI/MainFrame.cpp:1097
msgid "Export all presets to file"
msgstr "Exportovat všechna přednastavení do souboru"
-#: src/libslic3r/PrintConfig.cpp:3343
+#: src/libslic3r/PrintConfig.cpp:3536
msgid "Export AMF"
msgstr "Exportovat AMF"
-#: src/slic3r/GUI/Plater.cpp:2598
+#: src/slic3r/GUI/Plater.cpp:2560
msgid "Export AMF file:"
msgstr "Exportovat AMF soubor:"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1657 src/slic3r/GUI/Plater.cpp:3966
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1786 src/slic3r/GUI/Plater.cpp:3884
msgid "Export as STL"
msgstr "Exportovat jako STL"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:124
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:117
msgid "Export config"
msgstr "Exportovat konfiguraci"
-#: src/slic3r/GUI/MainFrame.cpp:503
+#: src/slic3r/GUI/MainFrame.cpp:1097
msgid "Export Config &Bundle"
msgstr "Exportovat KonfiguraÄní &Balík"
-#: src/slic3r/GUI/MainFrame.cpp:500
+#: src/slic3r/GUI/MainFrame.cpp:1100
+msgid "Export Config Bundle With Physical Printers"
+msgstr "Exportovat KonfiguraÄní balík vÄetnÄ› fyzických tiskáren"
+
+#: src/slic3r/GUI/MainFrame.cpp:1094
msgid "Export current configuration to file"
msgstr "Exportovat souÄasnou konfiguraci do souboru"
-#: src/slic3r/GUI/MainFrame.cpp:492
+#: src/slic3r/GUI/MainFrame.cpp:1086
msgid "Export current plate as AMF"
msgstr "Exportovat stávající plochu jako AMF"
-#: src/slic3r/GUI/MainFrame.cpp:477
+#: src/slic3r/GUI/MainFrame.cpp:1068
msgid "Export current plate as G-code"
msgstr "Exportovat stávající plochu do G-code"
-#: src/slic3r/GUI/MainFrame.cpp:521
+#: src/slic3r/GUI/MainFrame.cpp:1076
msgid "Export current plate as G-code to SD card / Flash drive"
msgstr "Exportovat aktuální podložku jako G-code na SD kartu / Flash disk"
-#: src/slic3r/GUI/MainFrame.cpp:486
+#: src/slic3r/GUI/MainFrame.cpp:1080
msgid "Export current plate as STL"
msgstr "Exportovat stávající plochu jako STL"
-#: src/slic3r/GUI/MainFrame.cpp:489
+#: src/slic3r/GUI/MainFrame.cpp:1083
msgid "Export current plate as STL including supports"
msgstr "Exportovat stávající plochu vÄetnÄ› podpÄ›r jako STL"
-#: src/slic3r/GUI/Plater.cpp:3664
-msgid "Export failed"
-msgstr "Exportování selhalo"
-
-#: src/slic3r/GUI/ConfigWizard.cpp:801
+#: src/slic3r/GUI/ConfigWizard.cpp:1160
msgid "Export full pathnames of models and parts sources into 3mf and amf files"
msgstr "Exportovat úplné zdrojové cesty modelů a dílů do souborů 3mf a amf"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 src/slic3r/GUI/Plater.cpp:891
-#: src/slic3r/GUI/Plater.cpp:5521 src/libslic3r/PrintConfig.cpp:3353
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/Plater.cpp:766
+#: src/slic3r/GUI/Plater.cpp:5706 src/libslic3r/PrintConfig.cpp:3546
msgid "Export G-code"
msgstr "Exportovat G-code"
-#: src/slic3r/GUI/MainFrame.cpp:521
+#: src/slic3r/GUI/MainFrame.cpp:1076
msgid "Export G-code to SD card / Flash drive"
msgstr "Exportovat G-code na SD kartu / Flash disk"
-#: src/libslic3r/PrintConfig.cpp:3320
+#: src/slic3r/GUI/NotificationManager.cpp:631
+#: src/slic3r/GUI/NotificationManager.cpp:748
+msgid "Export G-Code."
+msgstr "Export G-codu."
+
+#: src/libslic3r/PrintConfig.cpp:3513
msgid "Export OBJ"
msgstr "Exportovat OBJ"
-#: src/slic3r/GUI/Plater.cpp:2610
+#: src/slic3r/GUI/Plater.cpp:2572
msgid "Export OBJ file:"
msgstr "Exportovat OBJ soubor:"
@@ -2527,212 +2949,215 @@ msgstr "Exportovat OBJ soubor:"
msgid "Export of a temporary 3mf file failed"
msgstr "Export doÄasného 3MF souboru selhalo"
-#: src/slic3r/GUI/MainFrame.cpp:492
+#: src/slic3r/GUI/MainFrame.cpp:1086
msgid "Export plate as &AMF"
msgstr "Exportovat plochu jako &AMF"
-#: src/slic3r/GUI/MainFrame.cpp:486
+#: src/slic3r/GUI/MainFrame.cpp:1080
msgid "Export plate as &STL"
msgstr "Exportovat plochu jako &STL"
-#: src/slic3r/GUI/MainFrame.cpp:489
+#: src/slic3r/GUI/MainFrame.cpp:1083
msgid "Export plate as STL &including supports"
msgstr "Exportovat t&iskovou plochu vÄetnÄ› podpÄ›r jako STL"
-#: src/libslic3r/PrintConfig.cpp:3332
+#: src/libslic3r/PrintConfig.cpp:3525
msgid "Export SLA"
msgstr "Exportovat SLA"
-#: src/slic3r/GUI/Preferences.cpp:72
+#: src/slic3r/GUI/Preferences.cpp:89
msgid "Export sources full pathnames to 3mf and amf"
msgstr "Exportovat absolutní cesty k 3mf a amf souborům"
-#: src/libslic3r/PrintConfig.cpp:3348
+#: src/libslic3r/PrintConfig.cpp:3541
msgid "Export STL"
msgstr "Exportovat STL"
-#: src/slic3r/GUI/Plater.cpp:2591
+#: src/slic3r/GUI/Plater.cpp:2553
msgid "Export STL file:"
msgstr "Exportovat STL soubor:"
-#: src/libslic3r/PrintConfig.cpp:3339
+#: src/libslic3r/PrintConfig.cpp:3532
msgid "Export the model(s) as 3MF."
msgstr "Exportovat model(y) jako 3MF."
-#: src/libslic3r/PrintConfig.cpp:3344
+#: src/libslic3r/PrintConfig.cpp:3537
msgid "Export the model(s) as AMF."
msgstr "Exportovat model(y) jako AMF."
-#: src/libslic3r/PrintConfig.cpp:3321
+#: src/libslic3r/PrintConfig.cpp:3514
msgid "Export the model(s) as OBJ."
msgstr "Exportovat model(y) jako OBJ."
-#: src/libslic3r/PrintConfig.cpp:3349
+#: src/libslic3r/PrintConfig.cpp:3542
msgid "Export the model(s) as STL."
msgstr "Exportovat model(y) jako STL."
-#: src/slic3r/GUI/Plater.cpp:3966
+#: src/slic3r/GUI/Plater.cpp:3884
msgid "Export the selected object as STL file"
msgstr "Exportovat vybrané objekty jako STL soubor"
-#: src/slic3r/GUI/Plater.cpp:880
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 src/slic3r/GUI/Plater.cpp:755
msgid "Export to SD card / Flash drive"
msgstr "Export na SD kartu / Flash disk"
-#: src/slic3r/GUI/MainFrame.cpp:496
+#: src/slic3r/GUI/MainFrame.cpp:1090 src/slic3r/GUI/MainFrame.cpp:1395
msgid "Export toolpaths as OBJ"
msgstr "Exportovat trasy extruderu jako OBJ"
-#: src/libslic3r/Print.cpp:1638
+#: src/slic3r/GUI/NotificationManager.hpp:317
+msgid "Exporting finished."
+msgstr "Exportování dokonÄeno."
+
+#: src/libslic3r/Print.cpp:1676
msgid "Exporting G-code"
msgstr "Exportování souboru G-code"
#: src/slic3r/Utils/FixModelByWin10.cpp:341
-msgid "Exporting model..."
-msgstr "Exportování modelu..."
+msgid "Exporting model"
+msgstr "Exportování modelu"
#: src/slic3r/Utils/FixModelByWin10.cpp:219
#: src/slic3r/Utils/FixModelByWin10.cpp:359
msgid "Exporting source model"
msgstr "Exportování zdrojového modelu"
-#: src/libslic3r/SLAPrint.cpp:646
+#: src/libslic3r/SLAPrint.cpp:660
msgid "Exposition time is out of printer profile bounds."
msgstr "Doba osvitu je mimo rozsah profilu tiskárny."
-#: src/slic3r/GUI/Tab.cpp:2117 src/slic3r/GUI/Tab.cpp:3515
+#: src/slic3r/GUI/Tab.cpp:2287 src/slic3r/GUI/Tab.cpp:3931
msgid "Exposure"
msgstr "Osvit"
-#: src/libslic3r/PrintConfig.cpp:2541 src/libslic3r/PrintConfig.cpp:2542
+#: src/libslic3r/PrintConfig.cpp:2684 src/libslic3r/PrintConfig.cpp:2685
msgid "Exposure time"
msgstr "Doba osvitu"
-#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:311
+#: src/slic3r/GUI/GUI_Preview.cpp:302 src/libslic3r/ExtrusionEntity.cpp:315
+#: src/libslic3r/ExtrusionEntity.cpp:338
msgid "External perimeter"
msgstr "Vnější perimetr"
-#: src/slic3r/GUI/PresetHints.cpp:156
+#: src/slic3r/GUI/PresetHints.cpp:155
msgid "external perimeters"
msgstr "vnější perimetry"
-#: src/libslic3r/PrintConfig.cpp:446 src/libslic3r/PrintConfig.cpp:457
+#: src/libslic3r/PrintConfig.cpp:482 src/libslic3r/PrintConfig.cpp:493
msgid "External perimeters"
msgstr "Vnější perimetry"
-#: src/libslic3r/PrintConfig.cpp:469
+#: src/libslic3r/PrintConfig.cpp:505
msgid "External perimeters first"
msgstr "Nejprve tisknout vnější perimetry"
-#: src/libslic3r/PrintConfig.cpp:1588 src/libslic3r/PrintConfig.cpp:1596
+#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1704
msgid "Extra length on restart"
msgstr "Extra vzdálenost při návratu"
-#: src/libslic3r/PrintConfig.cpp:1390
+#: src/libslic3r/PrintConfig.cpp:1498
msgid "Extra loading distance"
msgstr "Extra délka při zavádění"
-#: src/libslic3r/PrintConfig.cpp:477
+#: src/libslic3r/PrintConfig.cpp:513
msgid "Extra perimeters if needed"
msgstr "Extra perimetry (pokud jsou potřeba)"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:278 src/slic3r/GUI/Tab.cpp:1434
-#: src/slic3r/GUI/wxExtensions.cpp:598 src/libslic3r/PrintConfig.cpp:487
+#: src/slic3r/GUI/GCodeViewer.cpp:2277 src/slic3r/GUI/GCodeViewer.cpp:2313
+#: src/slic3r/GUI/GCodeViewer.cpp:2318 src/slic3r/GUI/GUI_ObjectList.cpp:296
+#: src/slic3r/GUI/Tab.cpp:1780 src/slic3r/GUI/wxExtensions.cpp:515
+#: src/libslic3r/PrintConfig.cpp:523
msgid "Extruder"
msgstr "Extruder"
-#: src/slic3r/GUI/DoubleSlider.cpp:1134 src/slic3r/GUI/DoubleSlider.cpp:1170
-#: src/slic3r/GUI/GLCanvas3D.cpp:977 src/slic3r/GUI/GUI_ObjectList.cpp:1704
-#: src/slic3r/GUI/Tab.cpp:2320 src/libslic3r/GCode/PreviewData.cpp:445
-#, c-format
+#: src/slic3r/GUI/DoubleSlider.cpp:1263 src/slic3r/GUI/DoubleSlider.cpp:1297
+#: src/slic3r/GUI/GLCanvas3D.cpp:983 src/slic3r/GUI/GUI_ObjectList.cpp:1832
+#: src/slic3r/GUI/Tab.cpp:2489 src/libslic3r/GCode/PreviewData.cpp:450
+#, possible-c-format
msgid "Extruder %d"
msgstr "Extruder %d"
-#: src/slic3r/GUI/DoubleSlider.cpp:1011
+#: src/slic3r/GUI/DoubleSlider.cpp:1137
msgid "Extruder (tool) is changed to Extruder \"%1%\""
msgstr "Extruder (nástroj) se změní na Extruder \"%1%\""
-#: src/slic3r/GUI/ConfigWizard.cpp:1017
-msgid "Extruder and Bed Temperatures"
-msgstr "Teploty extruderu a podložky"
-
#: src/slic3r/GUI/WipeTowerDialog.cpp:255
msgid "Extruder changed to"
msgstr "Extruder změněn na"
-#: src/slic3r/GUI/Tab.cpp:1233
-msgid "Extruder clearance (mm)"
-msgstr "Kolizní oblast extruderu (mm)"
+#: src/slic3r/GUI/Tab.cpp:1589
+msgid "Extruder clearance"
+msgstr "Kolizní oblast extruderu"
-#: src/libslic3r/PrintConfig.cpp:522
+#: src/libslic3r/PrintConfig.cpp:558
msgid "Extruder Color"
msgstr "Barva extruderu"
-#: src/libslic3r/PrintConfig.cpp:529
+#: src/libslic3r/PrintConfig.cpp:565
msgid "Extruder offset"
msgstr "Odsazení extruderu"
-#: src/libslic3r/PrintConfig.cpp:911
-msgid "Extruder temperature for first layer. If you want to control temperature manually during print, set this to zero to disable temperature control commands in the output file."
-msgstr "Teplota extruderu pro první vrstvu. Chcete-li bÄ›hem tisku ruÄnÄ› ovládat teplotu, nastavte tuto hodnotu na nulu, aby se ve výstupním souboru zakázaly příkazy pro řízení teploty."
-
-#: src/libslic3r/PrintConfig.cpp:2065
-msgid "Extruder temperature for layers after the first one. Set this to zero to disable temperature control commands in the output."
-msgstr "Teplota extruderu pro následující vrstvy po vrstvě první. Nastavte tuto hodnotu na nulu, abyste zakázali příkazy pro řízení teploty na výstupu."
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:99 src/slic3r/GUI/GUI_ObjectList.cpp:617
-#: src/slic3r/GUI/Tab.cpp:1180 src/slic3r/GUI/Tab.cpp:1838
-#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:1002
-#: src/libslic3r/PrintConfig.cpp:1409 src/libslic3r/PrintConfig.cpp:1737
-#: src/libslic3r/PrintConfig.cpp:1938 src/libslic3r/PrintConfig.cpp:1965
+#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:656
+#: src/slic3r/GUI/Tab.cpp:1510 src/slic3r/GUI/Tab.cpp:2072
+#: src/libslic3r/PrintConfig.cpp:524 src/libslic3r/PrintConfig.cpp:1046
+#: src/libslic3r/PrintConfig.cpp:1517 src/libslic3r/PrintConfig.cpp:1852
+#: src/libslic3r/PrintConfig.cpp:2080 src/libslic3r/PrintConfig.cpp:2107
msgid "Extruders"
msgstr "Extrudery"
-#: src/libslic3r/PrintConfig.cpp:539
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1061
+msgid "Extruders count"
+msgstr "PoÄet extruderů"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2493
+msgid "Extrusion"
+msgstr "Extruze"
+
+#: src/libslic3r/PrintConfig.cpp:575
msgid "Extrusion axis"
msgstr "Osa extruderu"
-#: src/libslic3r/PrintConfig.cpp:545
+#: src/libslic3r/PrintConfig.cpp:581
msgid "Extrusion multiplier"
msgstr "NásobiÄ extruze"
-#: src/slic3r/GUI/ConfigWizard.cpp:1037
+#: src/slic3r/GUI/ConfigWizard.cpp:1403
msgid "Extrusion Temperature:"
msgstr "Teplota extruze:"
-#: src/slic3r/GUI/Tab.cpp:1205
+#: src/slic3r/GUI/Tab.cpp:1535
msgid "Extrusion width"
msgstr "Šířka extruze"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:100 src/slic3r/GUI/GUI_ObjectList.cpp:618
-#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:555
-#: src/libslic3r/PrintConfig.cpp:877 src/libslic3r/PrintConfig.cpp:1010
-#: src/libslic3r/PrintConfig.cpp:1418 src/libslic3r/PrintConfig.cpp:1757
-#: src/libslic3r/PrintConfig.cpp:1947 src/libslic3r/PrintConfig.cpp:2106
+#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:657
+#: src/libslic3r/PrintConfig.cpp:483 src/libslic3r/PrintConfig.cpp:591
+#: src/libslic3r/PrintConfig.cpp:919 src/libslic3r/PrintConfig.cpp:1054
+#: src/libslic3r/PrintConfig.cpp:1526 src/libslic3r/PrintConfig.cpp:1872
+#: src/libslic3r/PrintConfig.cpp:2089 src/libslic3r/PrintConfig.cpp:2249
msgid "Extrusion Width"
msgstr "Šíře extruze"
-#: src/slic3r/GUI/Plater.cpp:162
+#: src/slic3r/GUI/Plater.cpp:168
msgid "Facets"
msgstr "Facety"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:349
+#: src/slic3r/GUI/GUI_ObjectList.cpp:396
msgid "facets added"
msgstr "facety přidány"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:348
+#: src/slic3r/GUI/GUI_ObjectList.cpp:395
msgid "facets removed"
msgstr "facety odebrány"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:350
+#: src/slic3r/GUI/GUI_ObjectList.cpp:397
msgid "facets reversed"
msgstr "facety otoÄeny"
-#: src/libslic3r/PrintConfig.cpp:2517
+#: src/libslic3r/PrintConfig.cpp:2660
msgid "Faded layers"
msgstr "Vrstvy poÄáteÄního osvitu"
-#: src/libslic3r/Zipper.cpp:44
+#: src/libslic3r/miniz_extension.cpp:103
msgid "failed finding central directory"
msgstr "selhalo nalezení kořenového adresáře"
@@ -2740,105 +3165,135 @@ msgstr "selhalo nalezení kořenového adresáře"
msgid "Failed loading the input model."
msgstr "NaÄtení vstupního modelu se nezdaÅ™ilo."
-#: src/libslic3r/PrintBase.cpp:71
+#: src/libslic3r/PrintBase.cpp:72
msgid "Failed processing of the output_filename_format template."
msgstr "Zpracování šablony output_filename_format selhalo."
-#: src/slic3r/GUI/PresetHints.cpp:42
-msgid "Fan"
-msgstr "Ventilátor"
+#: src/slic3r/GUI/GUI_App.cpp:1648
+msgid "Failed to activate configuration snapshot."
+msgstr "Aktivace konfiguraÄního snapshotu se nezdaÅ™ila."
-#: src/slic3r/GUI/Tab.cpp:1456
+#: src/slic3r/GUI/Tab.cpp:1802
msgid "Fan settings"
msgstr "Nastavení ventilátoru"
-#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/Tab.cpp:1457
+#: src/slic3r/GUI/GUI_Preview.cpp:279 src/slic3r/GUI/Tab.cpp:1803
msgid "Fan speed"
msgstr "Rychlost ventilátoru"
-#: src/libslic3r/GCode/PreviewData.cpp:353
+#: src/slic3r/GUI/GCodeViewer.cpp:2239 src/libslic3r/GCode/PreviewData.cpp:358
msgid "Fan Speed (%)"
msgstr "Rychlost ventilátoru (%)"
-#: src/libslic3r/PrintConfig.cpp:2405
+#: src/slic3r/GUI/PresetHints.cpp:49
+msgid "Fan speed will be ramped from zero at layer %1% to %2%%% at layer %3%."
+msgstr "Rychlost ventilátoru se zvýší z nuly ve vrstvě %1% na %2%%% ve vrstvě %3%."
+
+#: src/libslic3r/PrintConfig.cpp:1001
+msgid "Fan speed will be ramped up linearly from zero at layer \"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower than \"disable_fan_first_layers\", in which case the fan will be running at maximum allowed speed at layer \"disable_fan_first_layers\" + 1."
+msgstr "OtáÄky ventilátoru se lineárnÄ› zvýší z nuly ve vrstvÄ› \"disable_fan_first_layers\" na maximum ve vrstvÄ› \"full_fan_speed_layer\". Hodnota \"full_fan_speed_layer\" bude ignorována, pokud je nižší než \"disable_fan_first_layers\", v takovém případÄ› se bude ventilátor toÄit na maximální povolenou hodnotu ve vrstvÄ› \"disable_fan_first_layers\" + 1."
+
+#: src/slic3r/GUI/PresetHints.cpp:51
+msgid "Fan will always run at %1%%%"
+msgstr "Ventilátor vždy poběží na %1%%%"
+
+#: src/slic3r/GUI/PresetHints.cpp:58
+msgid "Fan will be turned off."
+msgstr "Ventilátor bude vypnutý."
+
+#: src/libslic3r/PrintConfig.cpp:2548
msgid "Fast"
msgstr "Rychlý"
-#: src/libslic3r/PrintConfig.cpp:2406
+#: src/libslic3r/PrintConfig.cpp:2549
msgid "Fast tilt"
msgstr "Rychlý náklon"
-#: src/slic3r/GUI/GUI_App.cpp:141
+#: src/slic3r/GUI/GUI_App.cpp:531
msgid "Fatal error"
msgstr "Fatální chyba"
-#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/GUI_Preview.cpp:575
-#: src/libslic3r/GCode/PreviewData.cpp:345
+#: src/slic3r/GUI/GUI_Init.cpp:88
+msgid "Fatal error, exception catched: %1%"
+msgstr "Závažná chyba, zachycená výjimka: %1%"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2225 src/slic3r/GUI/GCodeViewer.cpp:2233
+#: src/slic3r/GUI/GUI_Preview.cpp:275 src/slic3r/GUI/GUI_Preview.cpp:787
+#: src/libslic3r/GCode/PreviewData.cpp:350
msgid "Feature type"
msgstr "Typ"
-#: src/slic3r/GUI/GUI_Preview.cpp:234 src/slic3r/GUI/GUI_Preview.cpp:235
+#: src/slic3r/GUI/GUI_Preview.cpp:293 src/slic3r/GUI/GUI_Preview.cpp:295
+#: src/slic3r/GUI/GUI_Preview.cpp:316
msgid "Feature types"
-msgstr "Typy extruzí"
+msgstr "Typy extrudování"
-#: src/slic3r/GUI/ConfigWizard.cpp:1525
+#: src/slic3r/GUI/ConfigWizard.cpp:1926
msgid "FFF Technology Printers"
msgstr "Tiskárny technologie FFF"
-#: src/slic3r/GUI/Plater.cpp:816 src/slic3r/GUI/Tab.cpp:1425
-#: src/slic3r/GUI/Tab.cpp:1426
+#: src/slic3r/GUI/Plater.cpp:691 src/slic3r/GUI/Tab.cpp:1770
+#: src/slic3r/GUI/Tab.cpp:1771
msgid "Filament"
msgstr "Filament"
-#: src/slic3r/GUI/Preset.cpp:1522
+#: src/libslic3r/Preset.cpp:1301
msgid "filament"
msgstr "filament"
-#: src/slic3r/GUI/ConfigWizard.cpp:952
+#: src/slic3r/GUI/ConfigWizard.cpp:1318
msgid "Filament and Nozzle Diameters"
msgstr "Průměr filamentu a trysky"
-#: src/slic3r/GUI/ConfigWizard.cpp:983
+#: src/slic3r/GUI/Plater.cpp:1189
+msgid "Filament at extruder %1%"
+msgstr "Filament v extruderu %1%"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1349
msgid "Filament Diameter:"
msgstr "Průměr filamentu:"
-#: src/libslic3r/PrintConfig.cpp:651
+#: src/libslic3r/PrintConfig.cpp:687
msgid "Filament is cooled by being moved back and forth in the cooling tubes. Specify desired number of these moves."
msgstr "Filament je chlazen pohyby tam a zpÄ›t v chladicí trubiÄce. Zadejte požadovaný poÄet tÄ›chto pohybů."
-#: src/libslic3r/PrintConfig.cpp:686
+#: src/libslic3r/PrintConfig.cpp:722
msgid "Filament load time"
msgstr "Doba zavádění filamentu"
-#: src/libslic3r/PrintConfig.cpp:588
+#: src/libslic3r/PrintConfig.cpp:624
msgid "Filament notes"
msgstr "Poznámky k filamentu"
-#: src/slic3r/GUI/Tab.cpp:1323 src/slic3r/GUI/Tab.cpp:1378
+#: src/slic3r/GUI/Tab.cpp:1669
msgid "Filament Overrides"
msgstr "Přepsání globálních hodnot"
-#: src/libslic3r/PrintConfig.cpp:1381
+#: src/libslic3r/PrintConfig.cpp:1489
msgid "Filament parking position"
msgstr "Parkovací pozice filamentu"
-#: src/slic3r/GUI/ConfigWizard.cpp:2013
+#: src/slic3r/GUI/ConfigWizard.cpp:2524
msgid "Filament Profiles Selection"
msgstr "Výběr Filamentových Profilů"
-#: src/slic3r/GUI/Tab.cpp:1471
+#: src/slic3r/GUI/Tab.cpp:1817
msgid "Filament properties"
msgstr "Vlastnosti filamentu"
-#: src/slic3r/GUI/Tab.hpp:355
+#: src/slic3r/GUI/Tab.hpp:409
msgid "Filament Settings"
msgstr "Nastavení filamentu"
-#: src/libslic3r/PrintConfig.cpp:726
+#: src/slic3r/GUI/GLCanvas3D.cpp:4304 src/slic3r/GUI/GLCanvas3D.cpp:4940
+msgid "Filament Settings Tab"
+msgstr "Panel Nastavení filamentu"
+
+#: src/libslic3r/PrintConfig.cpp:762
msgid "Filament type"
msgstr "Typ filamentu"
-#: src/libslic3r/PrintConfig.cpp:701
+#: src/libslic3r/PrintConfig.cpp:737
msgid "Filament unload time"
msgstr "Doba vysouvání filamentu"
@@ -2846,83 +3301,103 @@ msgstr "Doba vysouvání filamentu"
msgid "filaments"
msgstr "filamenty"
-#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2013
+#: src/slic3r/GUI/ConfigWizard.cpp:1872 src/slic3r/GUI/ConfigWizard.cpp:2524
msgid "Filaments"
msgstr "Filamenty"
-#: src/libslic3r/Zipper.cpp:72
+#: src/slic3r/GUI/ConfigWizard.cpp:691
+msgid "Filaments marked with <b>*</b> are <b>not</b> compatible with some installed printers."
+msgstr "Filamenty oznaÄené znakem <b>*</b> <b>nejsou</b> kompatibilní s nÄ›kterými nainstalovanými tiskárnami."
+
+#: src/libslic3r/miniz_extension.cpp:131
msgid "file close failed"
msgstr "zavření souboru selhalo"
-#: src/libslic3r/Zipper.cpp:66
+#: src/libslic3r/miniz_extension.cpp:125
msgid "file create failed"
msgstr "vytvoření souboru selhalo"
-#: src/slic3r/GUI/MainFrame.cpp:791
+#: src/slic3r/GUI/MainFrame.cpp:1492
msgid "File Not Found"
msgstr "Soubor nenalezen"
-#: src/libslic3r/Zipper.cpp:86
+#: src/libslic3r/miniz_extension.cpp:145
msgid "file not found"
msgstr "soubor nenalezen"
-#: src/libslic3r/Zipper.cpp:64
+#: src/libslic3r/miniz_extension.cpp:123
msgid "file open failed"
msgstr "otevření souboru selhalo"
-#: src/libslic3r/Zipper.cpp:70
+#: src/libslic3r/miniz_extension.cpp:129
msgid "file read failed"
msgstr "Ätení souboru se nezdaÅ™ilo"
-#: src/libslic3r/Zipper.cpp:74
+#: src/libslic3r/miniz_extension.cpp:133
msgid "file seek failed"
msgstr "hledání souboru selhalo"
-#: src/libslic3r/Zipper.cpp:76
+#: src/libslic3r/miniz_extension.cpp:135
msgid "file stat failed"
msgstr "soubor stat selhal"
-#: src/libslic3r/Zipper.cpp:36
+#: src/libslic3r/miniz_extension.cpp:95
msgid "file too large"
msgstr "soubor je příliš velký"
-#: src/libslic3r/Zipper.cpp:68
+#: src/libslic3r/miniz_extension.cpp:127
msgid "file write failed"
msgstr "zápis souboru se nezdařil"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:153
+#: src/slic3r/GUI/PrintHostDialogs.cpp:151
msgid "Filename"
msgstr "Název souboru"
-#: src/libslic3r/PrintConfig.cpp:775
+#: src/slic3r/GUI/ConfigWizard.cpp:1181
+msgid "Files association"
+msgstr "Asociace souborů"
+
+#: src/libslic3r/PrintConfig.cpp:811
msgid "Fill angle"
msgstr "Úhel výplně"
-#: src/libslic3r/PrintConfig.cpp:789
+#: src/slic3r/GUI/Plater.cpp:1651
+msgid "Fill bed"
+msgstr "Vyplnit podložku"
+
+#: src/slic3r/GUI/Plater.cpp:3936
+msgid "Fill bed with instances"
+msgstr "Vyplnit tiskovou plochu instancemi"
+
+#: src/libslic3r/PrintConfig.cpp:825
msgid "Fill density"
msgstr "Hustota výplně"
-#: src/libslic3r/PrintConfig.cpp:826
+#: src/libslic3r/PrintConfig.cpp:862
msgid "Fill pattern"
msgstr "Vzor výplně"
-#: src/libslic3r/PrintConfig.cpp:437
+#: src/libslic3r/PrintConfig.cpp:473
msgid "Fill pattern for bottom infill. This only affects the bottom external visible layer, and not its adjacent solid shells."
msgstr "Vzor výplně pro spodní vrstvy. Ovlivňuje pouze spodní vnější viditelné vrstvy. Neovlivňuje následné plné vrstvy."
-#: src/libslic3r/PrintConfig.cpp:828
+#: src/libslic3r/PrintConfig.cpp:864
msgid "Fill pattern for general low-density infill."
msgstr "Vzor výplně pro obecnou výplň s nízkou hustotou."
-#: src/libslic3r/PrintConfig.cpp:417
+#: src/libslic3r/PrintConfig.cpp:451
msgid "Fill pattern for top infill. This only affects the top visible layer, and not its adjacent solid shells."
msgstr "Nastavte vzor pro horní výplň. Ovlivňuje pouze horní viditelnou vrstvu a ne její sousední plné vrstvy."
+#: src/slic3r/GUI/Plater.cpp:3936
+msgid "Fill the remaining area of bed with instances of the selected object"
+msgstr "Vyplní zbývající tiskovou plochu instancemi vybraného objektu"
+
#: src/slic3r/GUI/BonjourDialog.cpp:225
msgid "Finished"
msgstr "DokonÄeno"
-#: src/slic3r/GUI/ConfigWizard.cpp:891 src/slic3r/GUI/Tab.cpp:1947
+#: src/slic3r/GUI/ConfigWizard.cpp:1257 src/slic3r/GUI/Tab.cpp:2132
msgid "Firmware"
msgstr "Firmware"
@@ -2934,44 +3409,56 @@ msgstr "Aktualizace firmware"
msgid "Firmware image:"
msgstr "Soubor s firmware:"
-#: src/slic3r/GUI/Tab.cpp:2577
+#: src/slic3r/GUI/Tab.cpp:2733
msgid "Firmware Retraction"
msgstr "Firmware Retrakce"
-#: src/slic3r/GUI/ConfigWizard.cpp:891
+#: src/slic3r/GUI/ConfigWizard.cpp:1257
msgid "Firmware Type"
msgstr "Typ firmware"
-#: src/libslic3r/PrintConfig.cpp:859 src/libslic3r/PrintConfig.cpp:868
-#: src/libslic3r/PrintConfig.cpp:876 src/libslic3r/PrintConfig.cpp:910
+#: src/libslic3r/PrintConfig.cpp:899 src/libslic3r/PrintConfig.cpp:908
+#: src/libslic3r/PrintConfig.cpp:918 src/libslic3r/PrintConfig.cpp:952
msgid "First layer"
msgstr "První vrstva"
-#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:889
+#: src/libslic3r/PrintConfig.cpp:909
+msgid "First layer bed temperature"
+msgstr "Teplota tiskové podložky při první vrstvě"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:60 src/libslic3r/PrintConfig.cpp:931
msgid "First layer height"
msgstr "Výška první vrstvy"
-#: src/libslic3r/Print.cpp:1422
+#: src/libslic3r/Print.cpp:1448
msgid "First layer height can't be greater than nozzle diameter"
msgstr "Výška první vrstvy nesmí být větší než průměr trysky"
-#: src/libslic3r/PrintConfig.cpp:900
+#: src/libslic3r/PrintConfig.cpp:960
+msgid "First layer nozzle temperature"
+msgstr "Teplota trysky při první vrstvě"
+
+#: src/libslic3r/PrintConfig.cpp:942
msgid "First layer speed"
msgstr "Rychlost první vrstvy"
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:218
msgid "First layer volumetric"
msgstr "Volumetrická hodnota první vrstvy"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1647
+#: src/slic3r/GUI/Plater.cpp:3380
+msgid "Fix through NetFabb"
+msgstr "Opravit pomocí NetFabb"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1776
msgid "Fix through the Netfabb"
msgstr "Opravit pomocí služby Netfabb"
-#: src/slic3r/GUI/Plater.cpp:3473
+#: src/slic3r/GUI/Plater.cpp:3278
msgid "Fix Throught NetFabb"
msgstr "Opravit pomocí Netfabb"
-#: src/slic3r/GUI/GUI_App.cpp:824
+#: src/slic3r/GUI/GUI_App.cpp:1522
msgid "Flash printer &firmware"
msgstr "Nahrát &firmware tiskárny"
@@ -2999,54 +3486,52 @@ msgstr "Probíhá nahrávání firmware. Prosím neodpojujte tiskárnu!"
msgid "Flashing succeeded!"
msgstr "Nahrávání bylo úspěšné!"
-#: src/slic3r/GUI/Tab.cpp:1218
+#: src/slic3r/GUI/Tab.cpp:1548
msgid "Flow"
msgstr "Průtok"
-#: src/slic3r/GUI/PresetHints.cpp:220
+#: src/libslic3r/PrintConfig.cpp:1145
+msgid "Flow rate"
+msgstr "Průtok"
+
+#: src/slic3r/GUI/PresetHints.cpp:219
msgid "flow rate is maximized"
msgstr "průtok je maximalizován"
-#: src/slic3r/GUI/UpdateDialogs.cpp:286
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:555
+msgid "Following printer preset(s) is duplicated:%1%The above preset for printer \"%2%\" will be used just once."
+msgstr "Následující přednastavení tiskárny je duplicitní:%1%Výše uvedené přednastavení bude pro tiskárnu \"%2%\" použito pouze jednou."
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:287
msgid "For more information please visit our wiki page:"
msgstr "Pro více informací prosím navštivte naší wiki stránku:"
-#: src/slic3r/GUI/Plater.cpp:501 src/slic3r/GUI/Plater.cpp:624
+#: src/slic3r/GUI/Plater.cpp:367 src/slic3r/GUI/Plater.cpp:490
msgid "For support enforcers only"
msgstr "Pouze pro vynucené podpěry"
#. TRN Description for "WHITE BULLET"
-#: src/slic3r/GUI/Tab.cpp:3267
-msgid ""
-"for the left button: indicates a non-system (or non-default) preset,\n"
-"for the right button: indicates that the settings hasn't been modified."
-msgstr ""
-"na levé straně: indikuje nesystémové (jiné než výchozí) přednastavení,\n"
-"na pravé straně: indikuje, že nastavení nebylo změněno."
+#: src/slic3r/GUI/Tab.cpp:3702
+msgid "for the left button: indicates a non-system (or non-default) preset,\nfor the right button: indicates that the settings hasn't been modified."
+msgstr "na levé straně: indikuje nesystémové (jiné než výchozí) přednastavení,\nna pravé straně: indikuje, že nastavení nebylo změněno."
-#: src/slic3r/GUI/ConfigManipulation.cpp:136
-msgid ""
-"For the Wipe Tower to work with the soluble supports, the support layers\n"
-"need to be synchronized with the object layers."
-msgstr ""
-"U Äistící věže pokud pracujte s rozpustnými materiály, je tÅ™eba\n"
-"synchronizovat vrstvy podpěr s vrstvami objektů."
+#: src/slic3r/GUI/ConfigManipulation.cpp:135
+msgid "For the Wipe Tower to work with the soluble supports, the support layers\nneed to be synchronized with the object layers."
+msgstr "U Äistící věže pokud pracujte s rozpustnými materiály, je tÅ™eba\nsynchronizovat vrstvy podpÄ›r s vrstvami objektů."
-#: src/libslic3r/Print.cpp:1396
+#: src/libslic3r/Print.cpp:1422
msgid "For the Wipe Tower to work with the soluble supports, the support layers need to be synchronized with the object layers."
-msgstr ""
-"U Äistící věže pokud pracujte s rozpustnými materiály, je tÅ™eba\n"
-"synchronizovat vrstvy podpěr s vrstvami objektů."
+msgstr "U Äistící věže pokud pracujte s rozpustnými materiály, je tÅ™eba\nsynchronizovat vrstvy podpÄ›r s vrstvami objektů."
-#: src/libslic3r/PrintConfig.cpp:2864
+#: src/libslic3r/PrintConfig.cpp:3028
msgid "Force pad around object everywhere"
msgstr "Vynutit podložku všude okolo objektů"
-#: src/libslic3r/PrintConfig.cpp:1729
+#: src/libslic3r/PrintConfig.cpp:1844
msgid "Force solid infill for regions having a smaller area than the specified threshold."
msgstr "Vynucení plné výplně pro oblasti, které mají menší plochu, než je stanovená prahová hodnota."
-#: src/libslic3r/PrintConfig.cpp:1072
+#: src/libslic3r/PrintConfig.cpp:1116
msgid "Force the generation of solid shells between adjacent materials/volumes. Useful for multi-extruder prints with translucent materials or manual soluble support material."
msgstr "Vynucení vytváření pevných skoÅ™epin mezi sousedními materiály/objemy. UžiteÄné pro tisk s více extrudery s průsvitnými materiály nebo ruÄnÄ› rozpustným podpůrným materiálem."
@@ -3054,248 +3539,317 @@ msgstr "Vynucení vytváření pevných skořepin mezi sousedními materiály/ob
msgid "From"
msgstr "Předchozí extruder"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2223
+#: src/slic3r/GUI/GCodeViewer.cpp:2197
+msgid "from"
+msgstr "z"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2389
msgid "From Object List You can't delete the last solid part from object."
msgstr "Ze seznamu objektů nemůžete smazat poslední Äást objektu."
-#: src/slic3r/GUI/MainFrame.cpp:667
+#: src/slic3r/GUI/MainFrame.cpp:964 src/slic3r/GUI/MainFrame.cpp:1284
msgid "Front"
msgstr "Zepředu"
-#: src/slic3r/GUI/MainFrame.cpp:667
+#: src/slic3r/GUI/MainFrame.cpp:964 src/slic3r/GUI/MainFrame.cpp:1284
msgid "Front View"
msgstr "Pohled zepředu"
-#: src/slic3r/GUI/Tab.cpp:1013
+#: src/libslic3r/PrintConfig.cpp:1000
+msgid "Full fan speed at layer"
+msgstr "Maximální otáÄky ventilátoru ve vrstvÄ›"
+
+#: src/slic3r/GUI/Tab.cpp:1331
msgid "full profile name"
msgstr "celé jméno profilu"
-#: src/slic3r/GUI/MainFrame.cpp:826
+#: src/libslic3r/PrintConfig.cpp:817
+msgid "g"
+msgstr "g"
+
+#: src/slic3r/GUI/MainFrame.cpp:1527
msgid "G-code"
msgstr "G-code"
-#: src/slic3r/GUI/DoubleSlider.cpp:1021
-msgid ""
-"G-code associated to this tick mark is in a conflict with print mode.\n"
-"Editing it will cause changes of Slider data."
-msgstr ""
-"G-code na této znaÄce je v rozporu s tiskovým režimem.\n"
-"Editace způsobí změny v posuvníku."
+#: src/slic3r/GUI/DoubleSlider.cpp:1146
+msgid "G-code associated to this tick mark is in a conflict with print mode.\nEditing it will cause changes of Slider data."
+msgstr "G-code na této znaÄce je v rozporu s tiskovým režimem.\nEditace způsobí zmÄ›ny v posuvníku."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:130
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:165
msgid "G-code file exported to %1%"
msgstr "G-code byl exportován do %1%"
-#: src/libslic3r/PrintConfig.cpp:936
+#: src/libslic3r/PrintConfig.cpp:980
msgid "G-code flavor"
msgstr "Druh G-code"
-#: src/libslic3r/PrintConfig.cpp:721
+#: src/slic3r/GUI/MainFrame.cpp:66 src/slic3r/GUI/MainFrame.cpp:79
+msgid "G-code preview"
+msgstr "Náhled G-codu"
+
+#: src/libslic3r/PrintConfig.cpp:66
+msgid "G-code thumbnails"
+msgstr "Náhledy G-codu"
+
+#: src/libslic3r/PrintConfig.cpp:3552
+msgid "G-code viewer"
+msgstr "ProhlížeÄ G-codu"
+
+#: src/libslic3r/PrintConfig.cpp:757
msgid "g/cm³"
msgstr "g/cm³"
-#: src/libslic3r/PrintConfig.cpp:2505
+#: src/libslic3r/PrintConfig.cpp:2648
msgid "g/ml"
msgstr "g/ml"
-#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:317
-#: src/libslic3r/PrintConfig.cpp:918
+#: src/slic3r/GUI/GUI_Preview.cpp:309 src/libslic3r/ExtrusionEntity.cpp:322
+#: src/libslic3r/ExtrusionEntity.cpp:352 src/libslic3r/PrintConfig.cpp:962
msgid "Gap fill"
msgstr "Výplň tenkých stěn"
-#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1796
-#: src/slic3r/GUI/Tab.cpp:2040
+#: src/slic3r/GUI/Preferences.cpp:24 src/slic3r/GUI/Tab.cpp:2058
+#: src/slic3r/GUI/Tab.cpp:2240 src/slic3r/GUI/Tab.cpp:2348
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1066
msgid "General"
msgstr "Obecné"
-#: src/libslic3r/PrintConfig.cpp:1307
+#: src/libslic3r/PrintConfig.cpp:1415
msgid "Generate no less than the number of skirt loops required to consume the specified amount of filament on the bottom layer. For multi-extruder machines, this minimum applies to each extruder."
-msgstr "Nevygenerovat ménÄ›, než poÄet obrysových smyÄek, potÅ™ebných ke spotÅ™ebování specifikovaného množství filamentu na spodní vrstvu. U strojů s více extrudery platí toto minimum pro každý extruder."
+msgstr "Nevygenerovat ménÄ› než je poÄet obrysových smyÄek potÅ™ebných ke spotÅ™ebování specifikovaného množství filamentu na spodní vrstvu. U strojů s více extrudery platí toto minimum pro každý extruder."
-#: src/libslic3r/PrintConfig.cpp:1865
+#: src/libslic3r/PrintConfig.cpp:2007
msgid "Generate support material"
msgstr "Generovat podpěry"
-#: src/libslic3r/PrintConfig.cpp:1926
+#: src/libslic3r/PrintConfig.cpp:2068
msgid "Generate support material for the specified number of layers counting from bottom, regardless of whether normal support material is enabled or not and regardless of any angle threshold. This is useful for getting more adhesion of objects having a very thin or poor footprint on the build plate."
msgstr "Vygeneruje podpÄ›ry pro zadaný poÄet vrstev poÄítaných od spodního okraje, bez ohledu na to, zda jsou povoleny standartní podpÄ›ry nebo nikoliv a bez ohledu na jakýkoli prah úhlu. To je užiteÄné pro získání vÄ›tší pÅ™ilnavosti pÅ™edmÄ›tů s velmi tenkou nebo Å¡patnou stopou na tiskové podložce."
-#: src/libslic3r/PrintConfig.cpp:2613
+#: src/libslic3r/PrintConfig.cpp:2756
msgid "Generate supports"
msgstr "Generovat podpěry"
-#: src/libslic3r/PrintConfig.cpp:2615
+#: src/libslic3r/PrintConfig.cpp:2758
msgid "Generate supports for the models"
msgstr "Generovat podpěry modelů"
-#: src/libslic3r/Print.cpp:1614
+#: src/slic3r/GUI/Plater.cpp:3554
+msgid "generated warnings"
+msgstr "generovaná varování"
+
+#: src/libslic3r/Print.cpp:1645
msgid "Generating brim"
msgstr "Generování límce"
-#: src/libslic3r/Print.cpp:1642
+#: src/libslic3r/Print.cpp:1680
msgid "Generating G-code"
msgstr "Generování G-code"
-#: src/libslic3r/SLAPrintSteps.cpp:48
+#: src/slic3r/GUI/GCodeViewer.cpp:1392
+msgid "Generating index buffers"
+msgstr "Generování indexových bufferů"
+
+#: src/libslic3r/SLAPrintSteps.cpp:49
msgid "Generating pad"
msgstr "Generování podložky"
-#: src/libslic3r/PrintObject.cpp:152
+#: src/libslic3r/PrintObject.cpp:158
msgid "Generating perimeters"
msgstr "Generování perimetrů"
-#: src/libslic3r/Print.cpp:1606
+#: src/libslic3r/Print.cpp:1636
msgid "Generating skirt"
msgstr "Generování obrysových smyÄek"
-#: src/libslic3r/PrintObject.cpp:395
+#: src/libslic3r/PrintObject.cpp:422
msgid "Generating support material"
msgstr "Generování podpěr"
-#: src/libslic3r/SLAPrintSteps.cpp:46 src/libslic3r/SLAPrintSteps.cpp:356
+#: src/libslic3r/SLAPrintSteps.cpp:47 src/libslic3r/SLAPrintSteps.cpp:359
msgid "Generating support points"
msgstr "Generování podpěrných bodů"
-#: src/libslic3r/SLAPrintSteps.cpp:47
+#: src/libslic3r/SLAPrintSteps.cpp:48
msgid "Generating support tree"
msgstr "Generování podpěr typu strom"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2022
+#: src/slic3r/GUI/GCodeViewer.cpp:933
+msgid "Generating toolpaths"
+msgstr "Generování cest nástroje"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:1318
+msgid "Generating vertex buffer"
+msgstr "Generování vrcholového bufferu"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2181
msgid "Generic"
msgstr "Obecný"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
+#: src/slic3r/Utils/PresetUpdater.cpp:600
+msgid "getting config updates"
+msgstr "získávání aktualizací konfigurace"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
msgid "Gizmo cut"
msgstr "Gizmo řez"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:172
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
msgid "Gizmo move"
msgstr "Gizmo posuv"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:176
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:198
+msgid "Gizmo move: Press to snap by 1mm"
+msgstr "Gizmo posuvu: Stiskni pro 1mm krok"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
msgid "Gizmo Place face on bed"
msgstr "Gizmo Umístit plochou na podložku"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:174
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
msgid "Gizmo rotate"
msgstr "Gizmo rotace"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:173
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:203
+msgid "Gizmo rotate: Press to rotate selected objects around their own center"
+msgstr "Gizmo rotace: Stiskni pro rotaci vybraných objektů kolem jejich vlastních středů"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
msgid "Gizmo scale"
msgstr "Gizmo měřítko"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:177
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:201
+msgid "Gizmo scale: Press to activate one direction scaling"
+msgstr "Gizmo měřítko: Stiskem aktivujete změnu velikosti pouze v jednom směru"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:202
+msgid "Gizmo scale: Press to scale selected objects around their own center"
+msgstr "Gizmo měřítko: Stiskni pro změnu velikosti vybraných objektů v jejich vlastních středech"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:199
+msgid "Gizmo scale: Press to snap by 5%"
+msgstr "Gizmo měřítko: Stiskni pro 5% krok"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:200
+msgid "Gizmo scale: Scale selection to fit print volume"
+msgstr "Gizmo měřítko: Vyplnit tiskový objem aktivním výběrem modelů"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
msgid "Gizmo SLA hollow"
msgstr "Gizmo SLA dutina"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:178
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:172
msgid "Gizmo SLA support points"
msgstr "Gizmo SLA podpěrné body"
-#: src/slic3r/GUI/GLCanvas3D.cpp:2921
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562
+#: src/slic3r/GUI/GLCanvas3D.cpp:3165
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:520
msgid "Gizmo-Move"
msgstr "Gizmo-Posuv"
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:489
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:639
msgid "Gizmo-Place on Face"
msgstr "Gizmo-Umístit plochou na podložku"
-#: src/slic3r/GUI/GLCanvas3D.cpp:3001
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:564
+#: src/slic3r/GUI/GLCanvas3D.cpp:3249
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:522
msgid "Gizmo-Rotate"
msgstr "Gizmo-OtáÄení"
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:563
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:521
msgid "Gizmo-Scale"
msgstr "Gizmo-Měřítko"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:201
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:199
msgid "Gizmos"
msgstr "Gizma"
-#: src/slic3r/GUI/AboutDialog.cpp:259
+#: src/slic3r/GUI/AboutDialog.cpp:284 src/slic3r/GUI/GUI_App.cpp:244
msgid "GNU Affero General Public License, version 3"
msgstr "GNU Affero General Public License, verze 3"
-#: src/slic3r/GUI/ConfigWizard.cpp:980
+#: src/slic3r/GUI/ConfigWizard.cpp:1346
msgid "Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average."
msgstr "Je zapotÅ™ebí velká pÅ™esnost, proto použijte posuvné měřítko (Å¡upleru) a proveÄte nÄ›kolik měření po délce filamentu, poté vypoÄítejte průmÄ›r."
-#: src/libslic3r/PrintConfig.cpp:844
+#: src/libslic3r/PrintConfig.cpp:882
msgid "Grid"
msgstr "Mřížka"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2454
+#: src/slic3r/GUI/PrintHostDialogs.cpp:57
+msgid "Group"
+msgstr "Skupina"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2846
msgid "Group manipulation"
msgstr "Manipulace se skupinou"
-#: src/slic3r/GUI/Preferences.cpp:133
+#: src/slic3r/GUI/Preferences.cpp:200
msgid "GUI"
msgstr "GUI"
-#: src/libslic3r/PrintConfig.cpp:852
+#: src/libslic3r/PrintConfig.cpp:890
msgid "Gyroid"
msgstr "Gyroid"
-#: src/slic3r/GUI/Tab.cpp:2937
-msgid "has the following unsaved changes:"
-msgstr "má neuložené následující změny:"
-
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47
msgid "Head diameter"
msgstr "Průměr hrotu"
-#: src/slic3r/GUI/ConfigManipulation.cpp:317
+#: src/libslic3r/PrintConfig.cpp:2772
+msgid "Head penetration"
+msgstr "Průnik podpěry do modelu"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:322
msgid "Head penetration should not be greater than the head width."
msgstr "Průnik hrotu podpěry by neměl být větší než je tloušťka hrotu podpěry."
-#: src/libslic3r/PrintConfig.cpp:869
+#: src/libslic3r/PrintConfig.cpp:910
msgid "Heated build plate temperature for the first layer. Set this to zero to disable bed temperature control commands in the output."
msgstr "Teplota vyhřívané tiskové podložky pro první vrstvu. Nastavením tuto hodnoty na nulu vypnete příkazy pro řízení teploty ve vrstvě ve výstupu."
-#: src/slic3r/GUI/GUI_Preview.cpp:222 src/libslic3r/PrintConfig.cpp:500
+#: src/slic3r/GUI/GUI_Preview.cpp:276 src/libslic3r/PrintConfig.cpp:536
msgid "Height"
msgstr "Výška"
-#: src/libslic3r/GCode/PreviewData.cpp:347
+#: src/slic3r/GUI/GCodeViewer.cpp:2236 src/libslic3r/GCode/PreviewData.cpp:352
msgid "Height (mm)"
msgstr "Výška (mm)"
-#: src/libslic3r/PrintConfig.cpp:1688
+#: src/libslic3r/PrintConfig.cpp:1796
msgid "Height of skirt expressed in layers. Set this to a tall value to use skirt as a shield against drafts."
msgstr "Výška obrysu vyjádřená ve vrstvách. Nastavte tuto hodnotu vysokou, pro použití obrysu jako stínění proti průvanu."
-#: src/libslic3r/PrintConfig.cpp:2360
+#: src/libslic3r/PrintConfig.cpp:2503
msgid "Height of the display"
msgstr "Výška displeje"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1500
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1631
msgid "Height range Modifier"
msgstr "Modifikátor Výškového rozsahu"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2507
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2899
msgid "Height ranges"
msgstr "Výškové rozsahy"
-#: src/libslic3r/PrintConfig.cpp:261
+#: src/libslic3r/PrintConfig.cpp:295
msgid "Heights at which a filament change is to occur."
msgstr "Výšky, při kterých má dojít ke změně filamentu."
-#: src/slic3r/GUI/ConfigWizard.cpp:433
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:451
+#, possible-c-format
msgid "Hello, welcome to %s! This %s helps you with the initial configuration; just a few settings and you will be ready to print."
msgstr "Ahoj, vítejte v %su! Tento %s vám pomůže se základní konfigurací; jen několik nastavení a budete připraveni tisknout."
-#: src/libslic3r/PrintConfig.cpp:3365
+#: src/libslic3r/PrintConfig.cpp:3564
msgid "Help"
msgstr "Nápověda"
-#: src/libslic3r/PrintConfig.cpp:3371
+#: src/libslic3r/PrintConfig.cpp:3570
msgid "Help (FFF options)"
msgstr "Nápověda (pro FFF)"
-#: src/libslic3r/PrintConfig.cpp:3376
+#: src/libslic3r/PrintConfig.cpp:3575
msgid "Help (SLA options)"
msgstr "Nápověda (pro SLA)"
@@ -3303,96 +3857,100 @@ msgstr "Nápověda (pro SLA)"
msgid "Here you can adjust required purging volume (mm³) for any given pair of tools."
msgstr "Zde můžete upravit požadovaný objem ÄiÅ¡tÄ›ní (mm³) pro kteroukoliv dvojici extruderů."
-#: src/libslic3r/PrintConfig.cpp:973
+#: src/slic3r/GUI/DoubleSlider.cpp:1849
+msgid "Hide ruler"
+msgstr "Skrýt pravítko"
+
+#: src/libslic3r/PrintConfig.cpp:1017
msgid "High extruder current on filament swap"
msgstr "Zvýšený proud do extruderového motoru při výměně filamentu"
-#: src/slic3r/GUI/GLCanvas3D.cpp:277
+#: src/slic3r/GUI/GLCanvas3D.cpp:263
msgid "Higher print quality versus higher print speed."
msgstr "Vyšší kvalita tisku versus vyšší rychlost tisku."
-#: src/libslic3r/PrintConfig.cpp:427 src/libslic3r/PrintConfig.cpp:853
+#: src/libslic3r/PrintConfig.cpp:463 src/libslic3r/PrintConfig.cpp:891
msgid "Hilbert Curve"
msgstr "Hilbertova křivka"
-#: src/slic3r/GUI/Plater.cpp:1042
+#: src/slic3r/GUI/Plater.cpp:916
msgid "Hold Shift to Slice & Export G-code"
msgstr "Stiskni Shift pro Slicování & Export G-codu"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46
msgid "Hole depth"
msgstr "Hloubka otvoru"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45
msgid "Hole diameter"
msgstr "Průměr otvoru"
-#: src/slic3r/GUI/Plater.cpp:2760
-msgid "Hollow"
-msgstr "Vydutit"
-
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:977
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:785
msgid "Hollow and drill"
msgstr "Vydutit a vyvrtat"
-#: src/libslic3r/PrintConfig.cpp:2910
+#: src/libslic3r/PrintConfig.cpp:3074
msgid "Hollow out a model to have an empty interior"
msgstr "Vyduťte model, abyste měli vnitřek prázdný"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40
msgid "Hollow this object"
msgstr "Vydutit tento objekt"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:108 src/slic3r/GUI/Tab.cpp:3654
-#: src/slic3r/GUI/Tab.cpp:3655 src/libslic3r/SLA/Hollowing.cpp:46
-#: src/libslic3r/SLA/Hollowing.cpp:58 src/libslic3r/SLA/Hollowing.cpp:67
-#: src/libslic3r/SLA/Hollowing.cpp:76 src/libslic3r/PrintConfig.cpp:2909
-#: src/libslic3r/PrintConfig.cpp:2916 src/libslic3r/PrintConfig.cpp:2926
-#: src/libslic3r/PrintConfig.cpp:2935
+#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:4073
+#: src/slic3r/GUI/Tab.cpp:4074 src/libslic3r/SLA/Hollowing.cpp:45
+#: src/libslic3r/SLA/Hollowing.cpp:57 src/libslic3r/SLA/Hollowing.cpp:66
+#: src/libslic3r/SLA/Hollowing.cpp:75 src/libslic3r/PrintConfig.cpp:3073
+#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090
+#: src/libslic3r/PrintConfig.cpp:3099
msgid "Hollowing"
msgstr "Vytvoření dutiny"
-#: src/slic3r/GUI/Plater.cpp:2926
-msgid "Hollowing cancelled."
-msgstr "Vytváření dutiny bylo zrušeno."
-
-#: src/slic3r/GUI/Plater.cpp:2927
-msgid "Hollowing done."
-msgstr "VydutÄ›ní dokonÄeno."
-
-#: src/slic3r/GUI/Plater.cpp:2929
-msgid "Hollowing failed."
-msgstr "Vydutění selhalo."
-
-#: src/libslic3r/PrintConfig.cpp:2937
+#: src/libslic3r/PrintConfig.cpp:3101
msgid "Hollowing is done in two steps: first, an imaginary interior is calculated deeper (offset plus the closing distance) in the object and then it's inflated back to the specified offset. A greater closing distance makes the interior more rounded. At zero, the interior will resemble the exterior the most."
msgstr "Tvorba dutiny se provádí ve dvou krocích: nejprve se imaginární vnitÅ™ní stÄ›na vypoÄítá hloubÄ›ji (offset plus vzdálenost uzavÅ™ení) v objektu a poté se nafoukne zpÄ›t na zadaný offset. Díky vÄ›tší vzdálenosti uzavÅ™ení je vnitÅ™ek modelu zaoblenÄ›jší. PÅ™i nulové hodnotÄ› se vnitÅ™ek modelu nejvíce podobá vnÄ›jÅ¡ku modelu."
-#: src/libslic3r/SLAPrintSteps.cpp:43
+#: src/libslic3r/SLAPrintSteps.cpp:44
msgid "Hollowing model"
msgstr "Vydutění modelu"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:813
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:624
msgid "Hollowing parameter change"
msgstr "Změna parametru dutiny"
-#: src/libslic3r/PrintConfig.cpp:850 src/libslic3r/PrintConfig.cpp:2011
+#: src/libslic3r/PrintConfig.cpp:888 src/libslic3r/PrintConfig.cpp:2153
msgid "Honeycomb"
msgstr "Plástev"
-#: src/slic3r/GUI/Tab.cpp:1064
+#: src/slic3r/GUI/Tab.cpp:1386
msgid "Horizontal shells"
msgstr "Vodorovné stěny"
-#: src/libslic3r/PrintConfig.cpp:245
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:253
+msgid "Horizontal Slider"
+msgstr "Horizontální posuvník"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:209
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:213
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:238
+msgid "Horizontal slider - Move active thumb Left"
+msgstr "Horizontální posuvník - Pohyb aktivním ukazatelem vlevo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:210
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:214
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:239
+msgid "Horizontal slider - Move active thumb Right"
+msgstr "Horizontální posuvník - Pohyb aktivním ukazatelem vpravo"
+
+#: src/libslic3r/PrintConfig.cpp:279
msgid "Horizontal width of the brim that will be printed around each object on the first layer."
-msgstr "Šírka límce který bude vytištěn v první vrstvě okolo každého objektu."
+msgstr "Šířka límce, který bude vytištěn v první vrstvě okolo každého objektu."
-#: src/slic3r/GUI/PrintHostDialogs.cpp:152
+#: src/slic3r/GUI/PrintHostDialogs.cpp:150
msgid "Host"
msgstr "Server"
-#: src/libslic3r/PrintConfig.cpp:1332
+#: src/libslic3r/PrintConfig.cpp:1440
msgid "Host Type"
msgstr "Typ tiskového serveru"
@@ -3400,197 +3958,275 @@ msgstr "Typ tiskového serveru"
msgid "Hostname"
msgstr "Název serveru"
-#: src/libslic3r/PrintConfig.cpp:97
+#: src/libslic3r/PrintConfig.cpp:99
msgid "Hostname, IP or URL"
msgstr "Název serveru, IP nebo URL"
-#: src/slic3r/GUI/Tab.cpp:139
-msgid ""
-"Hover the cursor over buttons to find more information \n"
-"or click this button."
-msgstr ""
-"Pro více informací pÅ™ejeÄte kurzorem nad tlaÄítky\n"
-"nebo na tlaÄítko kliknÄ›te."
+#: src/slic3r/GUI/Tab.cpp:210
+msgid "Hover the cursor over buttons to find more information \nor click this button."
+msgstr "Pro více informací pÅ™ejeÄte kurzorem nad tlaÄítky\nnebo na tlaÄítko kliknÄ›te."
-#: src/libslic3r/PrintConfig.cpp:2812
+#: src/libslic3r/PrintConfig.cpp:2976
msgid "How far should the pad extend around the contained geometry"
msgstr "Jak široká má být podložka kolem geometrie"
-#: src/libslic3r/PrintConfig.cpp:2901
+#: src/libslic3r/PrintConfig.cpp:3065
msgid "How much should the tiny connectors penetrate into the model body."
msgstr "Jak hluboko mají spojky proniknou do modelu."
-#: src/libslic3r/PrintConfig.cpp:2631
+#: src/libslic3r/PrintConfig.cpp:2774
msgid "How much the pinhead has to penetrate the model surface"
msgstr "Jak moc hrot podpěry pronikne do povrchu modelu"
-#: src/libslic3r/PrintConfig.cpp:2755
+#: src/libslic3r/PrintConfig.cpp:2919
msgid "How much the supports should lift up the supported object. If \"Pad around object\" is enabled, this value is ignored."
msgstr "O kolik mají podpěry nadzvednout podporovaný objekt. V případě zvolení možnosti \"Podložka okolo objektu\" bude tato hodnota ignorována."
-#: src/libslic3r/PrintConfig.cpp:111
+#: src/libslic3r/PrintConfig.cpp:1209
+msgid "How to apply limits"
+msgstr "Uplatnění limitů"
+
+#: src/libslic3r/PrintConfig.cpp:1203
+msgid "How to apply the Machine Limits"
+msgstr "Jak se mají projevit limity stroje"
+
+#: src/libslic3r/PrintConfig.cpp:163
+msgid "HTTP digest"
+msgstr "HTTP digest"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:358
+#: src/libslic3r/PrintConfig.cpp:113
msgid "HTTPS CA File"
msgstr "Soubor HTTPS CA"
-#: src/slic3r/GUI/Tab.cpp:1713
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:319
msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate."
msgstr "Soubor HTTPS CA je volitelný. Je nutný pouze pokud použijte HTTPS certifikát s vlastním podpisem."
-#: src/slic3r/GUI/Preferences.cpp:222
+#: src/slic3r/GUI/Preferences.cpp:376
msgid "Icon size in a respect to the default size"
msgstr "Velikost ikon vůÄi výchozí velikosti"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:149
+#: src/slic3r/GUI/PrintHostDialogs.cpp:147
msgid "ID"
msgstr "ID"
-#: src/libslic3r/PrintConfig.cpp:1873
+#: src/libslic3r/PrintConfig.cpp:2015
msgid "If checked, supports will be generated automatically based on the overhang threshold value. If unchecked, supports will be generated inside the \"Support Enforcer\" volumes only."
msgstr "Pokud je zaškrtnuto, budou podpěry generovány automaticky na základě prahové hodnoty převisu. Pokud není zaškrtnuto, bude podpěra generována pouze v místech, kde je umístěn objekt pro \"Vynucení podpěr\"."
-#: src/slic3r/GUI/ConfigWizard.cpp:773
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:1132
+#, possible-c-format
msgid "If enabled, %s checks for new application versions online. When a new version becomes available, a notification is displayed at the next application startup (never during program usage). This is only a notification mechanisms, no automatic installation is done."
msgstr "Pokud je povoleno, kontroluje %s nově dostupné verze. V případě, že je nová verze k dispozici, zobrazí se notifikace při dalším startu programu (nikdy během užívání aplikace). Tento systém slouží pouze pro upozornění uživatele, nedochází k automatické instalaci."
-#: src/slic3r/GUI/ConfigWizard.cpp:783
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:1142
+#, possible-c-format
msgid "If enabled, %s downloads updates of built-in system presets in the background.These updates are downloaded into a separate temporary location.When a new preset version becomes available it is offered at application startup."
msgstr "Pokud je povoleno, stáhne %s na pozadí aktualizace vestavÄ›ných systémových pÅ™ednastavení. Tyto aktualizace jsou staženy do doÄasného umístÄ›ní. Pokud je k dispozici nové pÅ™ednastavení, zobrazí se upozornÄ›ní pÅ™i startu programu."
-#: src/libslic3r/PrintConfig.cpp:1852
+#: src/libslic3r/PrintConfig.cpp:1994
msgid "If enabled, all printing extruders will be primed at the front edge of the print bed at the start of the print."
msgstr "Pokud je tato možnost povolena, vÅ¡echny tiskové extrudery na zaÄátku tisku vytlaÄí na pÅ™edním okraji podložky malé množství materiálu."
-#: src/slic3r/GUI/ConfigWizard.cpp:805
-msgid ""
-"If enabled, allows the Reload from disk command to automatically find and load the files when invoked.\n"
-"If not enabled, the Reload from disk command will ask to select each file using an open file dialog."
-msgstr ""
-"Pokud je povoleno, v případÄ› vyžádání, umožňuje funkci „Znovu naÄíst z disku“ automaticky vyhledat a naÄíst soubory.\n"
-"Pokud není povoleno, funkce „Znovu naÄíst z disku“ požádá o zadání cest ke každému souboru pomocí dialogového okna."
+#: src/slic3r/GUI/ConfigWizard.cpp:1164
+msgid "If enabled, allows the Reload from disk command to automatically find and load the files when invoked.\nIf not enabled, the Reload from disk command will ask to select each file using an open file dialog."
+msgstr "Pokud je povoleno, v případÄ› vyžádání, umožňuje funkci „Znovu naÄíst z disku“ automaticky vyhledat a naÄíst soubory.\nPokud není povoleno, funkce „Znovu naÄíst z disku“ požádá o zadání cest ke každému souboru pomocí dialogového okna."
-#: src/slic3r/GUI/Preferences.cpp:74
+#: src/slic3r/GUI/Preferences.cpp:91
msgid "If enabled, allows the Reload from disk command to automatically find and load the files when invoked."
msgstr "Pokud je povoleno, v případÄ› vyžádání, umožňuje funkci „Znovu naÄíst z disku“ automaticky vyhledat a naÄíst soubory."
-#: src/slic3r/GUI/Preferences.cpp:66
+#: src/slic3r/GUI/Preferences.cpp:238
+msgid "If enabled, changes made using the sequential slider, in preview, apply only to gcode top layer. If disabled, changes made using the sequential slider, in preview, apply to the whole gcode."
+msgstr "Pokud je povoleno, pohyby sekvenÄního posuvníku v náhledu G-codu se aplikují pouze na horní vrstvu. Pokud je zakázáno, aplikují se na celý G-code."
+
+#: src/slic3r/GUI/Preferences.cpp:83
msgid "If enabled, PrusaSlicer will check for the new versions of itself online. When a new version becomes available a notification is displayed at the next application startup (never during program usage). This is only a notification mechanisms, no automatic installation is done."
msgstr "Pokud je povoleno, PrusaSlicer kontroluje nově dostupné verze programu. V případě, že je nová verze k dispozici, zobrazí se notifikace při dalším startu programu (nikdy během užívání aplikace). Tento systém slouží pouze pro upozornění uživatele, nedochází k automatické instalaci."
-#: src/slic3r/GUI/Preferences.cpp:82
+#: src/slic3r/GUI/Preferences.cpp:270
+msgid "If enabled, renders object using the environment map."
+msgstr "Pokud je povoleno, vykreslí objekt za pomoci mapy prostředí."
+
+#: src/slic3r/GUI/Preferences.cpp:200
+msgid "If enabled, reverses the direction of zoom with mouse wheel"
+msgstr "Pokud je povoleno, pÅ™i zoomu obrátí funkci koleÄka myÅ¡i"
+
+#: src/slic3r/GUI/Preferences.cpp:93
+msgid "If enabled, sets PrusaSlicer as default application to open .3mf files."
+msgstr "Pokud je zašktnuto, PrusaSlicer bude výchozí aplikaci pro otevírání souborů .3mf."
+
+#: src/slic3r/GUI/Preferences.cpp:100
+msgid "If enabled, sets PrusaSlicer as default application to open .stl files."
+msgstr "Pokud je zašktnuto, PrusaSlicer bude výchozí aplikaci pro otevírání souborů .stl."
+
+#: src/slic3r/GUI/Preferences.cpp:179
+msgid "If enabled, sets PrusaSlicer G-code Viewer as default application to open .gcode files."
+msgstr "Pokud je zašktnuto, PrusaSlicer bude výchozí aplikaci pro otevírání souborů .gcode."
+
+#: src/slic3r/GUI/Preferences.cpp:99
msgid "If enabled, Slic3r downloads updates of built-in system presets in the background. These updates are downloaded into a separate temporary location. When a new preset version becomes available it is offered at application startup."
msgstr "Pokud je povoleno, stáhne Slic3r na pozadí aktualizace vestavÄ›ných systémových pÅ™ednastavení. Tyto aktualizace jsou staženy do doÄasného umístÄ›ní. Pokud je k dispozici nové pÅ™ednastavení, zobrazí se upozornÄ›ní pÅ™i startu programu."
-#: src/slic3r/GUI/Preferences.cpp:106
+#: src/slic3r/GUI/Preferences.cpp:137
msgid "If enabled, the 3D scene will be rendered in Retina resolution. If you are experiencing 3D performance problems, disabling this option may help."
msgstr "Pokud je tato volba povolena, bude 3D scéna vykreslena v rozlišení Retina. Pokud dochází k potížím s výkonem, zkuste tuto volbu vypnout."
-#: src/libslic3r/PrintConfig.cpp:1696
+#: src/slic3r/GUI/Preferences.cpp:215
+msgid "If enabled, the button for the collapse sidebar will be appeared in top right corner of the 3D Scene"
+msgstr "Pokud je povoleno, bude v pravém horním rohu 3D scény zobrazeno tlaÄítko pro ovládání boÄního panelu"
+
+#: src/libslic3r/PrintConfig.cpp:3698
+msgid "If enabled, the command line arguments are sent to an existing instance of GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides the \"single_instance\" configuration value from application preferences."
+msgstr "Pokud je povoleno, argumenty příkazového řádku se odešlou do existující instance grafického uživatelského rozhraní PrusaSlicer,u nebo se aktivuje existující okno PrusaSlicer. Přepíše hodnotu konfigurace „single_instance“ z nastavení aplikace."
+
+#: src/slic3r/GUI/Preferences.cpp:294
+msgid "If enabled, the descriptions of configuration parameters in settings tabs wouldn't work as hyperlinks. If disabled, the descriptions of configuration parameters in settings tabs will work as hyperlinks."
+msgstr "Pokud je aÅ¡krtnuto, popisky konfiguraÄních parametrů na kartách nastavení nebudou fungovat jako hypertextové odkazy. Pokud není zaÅ¡krtnuto, popisy konfiguraÄních parametrů budou fungovat jako hypertextové odkazy."
+
+#: src/slic3r/GUI/Preferences.cpp:209
+msgid "If enabled, the legacy 3DConnexion devices settings dialog is available by pressing CTRL+M"
+msgstr "Pokud je povoleno, je dialogové okno nastavení pro starší zařízení 3DConnexion k dispozici stisknutím kombinace kláves CTRL + M."
+
+#: src/libslic3r/PrintConfig.cpp:1804
msgid "If enabled, the skirt will be as tall as a highest printed object. This is useful to protect an ABS or ASA print from warping and detaching from print bed due to wind draft."
msgstr "Pokud je tato možnost povolena, bude obrys (skirt) stejnÄ› vysoký jako nejvyšší tiÅ¡tÄ›ný objekt. To je užiteÄné k ochranÄ› modelu pÅ™i tisku z ABS nebo ASA pÅ™ed deformací a odlepením od tiskové podložky v důsledku průvanu."
-#: src/libslic3r/PrintConfig.cpp:1858
+#: src/libslic3r/PrintConfig.cpp:2000
msgid "If enabled, the wipe tower will not be printed on layers with no toolchanges. On layers with a toolchange, extruder will travel downward to print the wipe tower. User is responsible for ensuring there is no collision with the print."
msgstr "Pokud je tato možnost povolena, nebude Äistící věž vytiÅ¡tÄ›na ve vrstvách bez zmÄ›ny barvy. U vrstev s výmÄ›nou sjede extruder smÄ›rem dolů a vytiskne vrstvu Äistící věže. Uživatel je odpovÄ›dný za to, že nedojde ke kolizi tiskové hlavy s tiskem."
-#: src/slic3r/GUI/Preferences.cpp:128
+#: src/slic3r/GUI/Preferences.cpp:193
msgid "If enabled, use free camera. If not enabled, use constrained camera."
msgstr "Pokud je zaškrtnuto, použije „free kameru“. Pokud není, použije „constrained kameru“."
-#: src/slic3r/GUI/Preferences.cpp:121
+#: src/slic3r/GUI/Preferences.cpp:186
msgid "If enabled, use perspective camera. If not enabled, use orthographic camera."
msgstr "Pokud je zaškrtnuto, použije perspektivní kameru. Pokud není, použije ortografickou kameru."
-#: src/slic3r/GUI/Preferences.cpp:145
+#: src/slic3r/GUI/Preferences.cpp:222
msgid "If enabled, you can change size of toolbar icons manually."
msgstr "Pokud je zaškrtnuto, můžete nastavit velikost ikon na panelu nástrojů."
-#: src/slic3r/GUI/PresetHints.cpp:29
+#: src/slic3r/GUI/PresetHints.cpp:28
msgid "If estimated layer time is below ~%1%s, fan will run at %2%%% and print speed will be reduced so that no less than %3%s are spent on that layer (however, speed will never be reduced below %4%mm/s)."
msgstr "Pokud je odhadovaný Äas vrstvy nižší než ~%1%s, bude ventilátor pracovat na %2%%% a rychlost tisku bude snížena tak, aby na tuto vrstvu nebylo použito ménÄ› než %3%s (rychlost vÅ¡ak nikdy nebude snížena pod %4%mm/s)."
-#: src/slic3r/GUI/PresetHints.cpp:36
+#: src/slic3r/GUI/PresetHints.cpp:35
msgid "If estimated layer time is greater, but still below ~%1%s, fan will run at a proportionally decreasing speed between %2%%% and %3%%%."
msgstr "Pokud je odhadovaný Äas vrstvy delší, ale stále pod ~%1%s, bude ventilátor pracovat s plynule klesající rychlostí mezi %2%%% a %3%%%."
-#: src/libslic3r/PrintConfig.cpp:901
+#: src/libslic3r/PrintConfig.cpp:943
msgid "If expressed as absolute value in mm/s, this speed will be applied to all the print moves of the first layer, regardless of their type. If expressed as a percentage (for example: 40%) it will scale the default speeds."
msgstr "Pokud je vyjádřena jako absolutní hodnota v mm / s, bude tato rychlost použita pro všechny pohyby tisku první vrstvy bez ohledu na jejich typ. Pokud je hodnota vyjádřena procenty (například: 40%), změní v závislosti na výchozích rychlostech."
-#: src/libslic3r/PrintConfig.cpp:573
+#: src/libslic3r/PrintConfig.cpp:609
msgid "If layer print time is estimated below this number of seconds, fan will be enabled and its speed will be calculated by interpolating the minimum and maximum speeds."
msgstr "Pokud je doba tisku vrstvy odhadnuta jako kratší než tato nastavená hodnota ve vteÅ™inách, ventilátor bude aktivován a jeho rychlost bude vypoÄtena interpolací minimální a maximální rychlosti."
-#: src/libslic3r/PrintConfig.cpp:1706
+#: src/libslic3r/PrintConfig.cpp:1821
msgid "If layer print time is estimated below this number of seconds, print moves speed will be scaled down to extend duration to this value."
msgstr "Pokud je doba tisku vrstvy odhadnuta kratší než tento poÄet sekund, rychlost tisku se zpomalí, aby se prodloužila doba tisku této vrstvy."
-#: src/libslic3r/PrintConfig.cpp:567
+#: src/libslic3r/PrintConfig.cpp:603
msgid "If this is enabled, fan will never be disabled and will be kept running at least at its minimum speed. Useful for PLA, harmful for ABS."
msgstr "Pokud je tato funkce zapnutá, ventilátor nebude nikdy vypnut a bude udržován v chodu alespoň rychlostí která je nastavena jako minimální rychlost. UžiteÄné pro PLA, Å¡kodlivé pro ABS."
-#: src/slic3r/GUI/Preferences.cpp:49
+#: src/slic3r/GUI/Preferences.cpp:66
msgid "If this is enabled, Slic3r will auto-center objects around the print bed center."
msgstr "Pokud je tato možnost povolena, Slic3r bude automaticky centrovat objekty kolem středu tiskové plochy."
-#: src/slic3r/GUI/Preferences.cpp:57
+#: src/slic3r/GUI/Preferences.cpp:74
msgid "If this is enabled, Slic3r will pre-process objects as soon as they're loaded in order to save time when exporting G-code."
msgstr "Pokud je tato možnost povolena, Slic3r pÅ™edprojektuje objekty, jakmile budou naÄteny, aby Å¡etÅ™il Äas pÅ™i exportu G-code."
-#: src/slic3r/GUI/Preferences.cpp:41
+#: src/slic3r/GUI/Preferences.cpp:54
msgid "If this is enabled, Slic3r will prompt the last output directory instead of the one containing the input files."
msgstr "Pokud je tato volba povolena, Slic3r vyvolá poslední výstupní adresář namísto toho, který obsahuje vstupní soubory."
-#: src/libslic3r/PrintConfig.cpp:1562
+#: src/slic3r/GUI/Preferences.cpp:125
+msgid "If this is enabled, when starting PrusaSlicer and another instance of the same PrusaSlicer is already running, that instance will be reactivated instead."
+msgstr "Pokud je tato možnost povolena, tak v případě již běžícího PrusaSliceru bude při pokusu spuštění dalšího PrusaSliceru aktivována právě tato instance."
+
+#: src/libslic3r/PrintConfig.cpp:1670
msgid "If you set this to a positive value, Z is quickly raised every time a retraction is triggered. When using multiple extruders, only the setting for the first extruder will be considered."
msgstr "Zadáním kladné hodnoty, se Z rychle přizvedne při každém vyvolání retrakce. Při použití více extruderů bude použito pouze nastavení pro první extruder."
-#: src/libslic3r/PrintConfig.cpp:1571
+#: src/libslic3r/PrintConfig.cpp:1679
msgid "If you set this to a positive value, Z lift will only take place above the specified absolute Z. You can tune this setting for skipping lift on the first layers."
msgstr "Zadáním kladné hodnoty se zdvih Z uskuteÄní pouze nad zadanou absolutní hodnotou Z. Toto nastavení můžete zvolit pro pÅ™eskoÄení pÅ™izvednutí u prvních vrstev."
-#: src/libslic3r/PrintConfig.cpp:1580
+#: src/libslic3r/PrintConfig.cpp:1688
msgid "If you set this to a positive value, Z lift will only take place below the specified absolute Z. You can tune this setting for limiting lift to the first layers."
msgstr "Zadáním kladné hodnoty se zdvih Z uskuteÄní pouze pod zadanou absolutní hodnotou Z. Toto nastavení můžete zvolit pro pÅ™eskoÄení pÅ™izvednutí u prvních vrstev."
-#: src/libslic3r/PrintConfig.cpp:1454
+#: src/libslic3r/PrintConfig.cpp:1562
msgid "If you want to process the output G-code through custom scripts, just list their absolute paths here. Separate multiple scripts with a semicolon. Scripts will be passed the absolute path to the G-code file as the first argument, and they can access the Slic3r config settings by reading environment variables."
msgstr "Pokud chcete zpracovat výstupní G-code pomocí vlastních skriptů, staÄí zde uvést jejich absolutní cesty. OddÄ›lte více skriptů stÅ™edníkem. Skripty pÅ™edají absolutní cestu k souboru G-code jako první argument a mohou pÅ™istupovat k nastavení konfigurace Slic3ru Ätením promÄ›nných prostÅ™edí."
-#: src/libslic3r/PrintConfig.cpp:530
+#: src/libslic3r/PrintConfig.cpp:566
msgid "If your firmware doesn't handle the extruder displacement you need the G-code to take it into account. This option lets you specify the displacement of each extruder with respect to the first one. It expects positive coordinates (they will be subtracted from the XY coordinate)."
msgstr "Pokud firmware nezpracovává umístÄ›ní extruderu správnÄ›, potÅ™ebujete aby to vzal G-code v úvahu. Toto nastavení umožňuje urÄit odsazení každého extruderu vzhledem k prvnímu. OÄekávají se pozitivní souÅ™adnice (budou odeÄteny od souÅ™adnice XY)."
-#: src/libslic3r/PrintConfig.cpp:2169
+#: src/libslic3r/PrintConfig.cpp:2312
msgid "If your firmware requires relative E values, check this, otherwise leave it unchecked. Most firmwares use absolute values."
msgstr "Pokud váš firmware vyžaduje relativní hodnoty E, zaškrtněte toto, jinak nechte nezaškrtnuté. Většina firmwarů používá absolutní hodnoty."
-#: src/libslic3r/PrintConfig.cpp:3485
+#: src/libslic3r/PrintConfig.cpp:1219
+msgid "Ignore"
+msgstr "Ignorovat"
+
+#: src/libslic3r/PrintConfig.cpp:3684
msgid "Ignore non-existent config files"
msgstr "Ignorovat neexistující konfiguraÄní soubory"
-#: src/slic3r/GUI/MainFrame.cpp:464
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:192
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:173
+msgid "Ignores facets facing away from the camera."
+msgstr "Ignoruje fasety směřující pryÄ od kamery."
+
+#: src/slic3r/GUI/MainFrame.cpp:1055
msgid "Import &Config"
msgstr "Importovat Konfigura&ci"
-#: src/slic3r/GUI/MainFrame.cpp:471
+#: src/slic3r/GUI/MainFrame.cpp:1062
msgid "Import Config &Bundle"
msgstr "Importovat KonfiguraÄní &Balík"
-#: src/slic3r/GUI/MainFrame.cpp:467
+#: src/slic3r/GUI/MainFrame.cpp:1058
msgid "Import Config from &project"
msgstr "NaÄíst konfiguraci z &projektu"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:119
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:112
msgid "Import Config from ini/amf/3mf/gcode"
msgstr "NaÄíst konfiguraci ze souboru ini/amf/3mf/gcode"
-#: src/slic3r/GUI/Plater.cpp:4603
+#: src/slic3r/GUI/Plater.cpp:1419
+msgid "Import config only"
+msgstr "Importovat pouze konfiguraci"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:39
+msgid "Import file"
+msgstr "Importovat soubor"
+
+#: src/slic3r/GUI/Plater.cpp:1418
+msgid "Import geometry only"
+msgstr "Importovat pouze modely"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:46
+msgid "Import model and profile"
+msgstr "Importovat model a profil"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48
+msgid "Import model only"
+msgstr "Importujte pouze model"
+
+#: src/slic3r/GUI/Plater.cpp:4655
msgid "Import Object"
msgstr "Importovat Objekt"
-#: src/slic3r/GUI/Plater.cpp:4607
+#: src/slic3r/GUI/Plater.cpp:4659
msgid "Import Objects"
msgstr "Importovat Objekty"
@@ -3598,476 +4234,581 @@ msgstr "Importovat Objekty"
msgid "Import of the repaired 3mf file failed"
msgstr "Import opraveného 3MF souboru selhal"
-#: src/slic3r/GUI/MainFrame.cpp:460
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47
+msgid "Import profile only"
+msgstr "Importovat pouze profil"
+
+#: src/slic3r/GUI/MainFrame.cpp:1050
+msgid "Import SL1 archive"
+msgstr "Importovat SL1 archiv"
+
+#: src/slic3r/GUI/Plater.cpp:1561
+msgid "Import SLA archive"
+msgstr "Importovat SLA archiv"
+
+#: src/slic3r/GUI/MainFrame.cpp:1046
+msgid "Import STL (imperial units)"
+msgstr "Importovat STL (imperiální jednotky)"
+
+#: src/slic3r/GUI/MainFrame.cpp:1042
msgid "Import STL/OBJ/AM&F/3MF"
msgstr "Importovat STL/OBJ/AM&F/3MF"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:118
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:111
msgid "Import STL/OBJ/AMF/3MF without config, keep plater"
msgstr "Importovat STL/OBJ/AMF/3MF bez konfigurace, zachová stávající podložku"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3422
-#, c-format
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:159
+msgid "Importing canceled."
+msgstr "Import zrušen."
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:160
+msgid "Importing done."
+msgstr "Import dokonÄen."
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135
+msgid "Importing SLA archive"
+msgstr "Importuje se SLA archiv"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487
+msgid "in"
+msgstr "in"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3885
+#, possible-c-format
msgid "In this mode you can select only other %s Items%s"
msgstr "V tomto režimu můžete vybrat pouze jinou/jiný %s %s"
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:423
+msgid "Inches"
+msgstr "Palce"
+
#: src/slic3r/GUI/UpdateDialogs.cpp:230
msgid "Incompatible bundles:"
msgstr "Nekompatibilní balíky:"
+#: src/slic3r/GUI/PresetComboBoxes.cpp:241
+msgid "Incompatible presets"
+msgstr "Nekompatibilní předvolby"
+
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75
-#, c-format
+#, possible-c-format
msgid "Incompatible with this %s"
msgstr "Nekompatibilní s tímto %s"
-#: src/slic3r/GUI/Plater.cpp:4685
+#: src/slic3r/GUI/Plater.cpp:4790
msgid "Increase Instances"
msgstr "Přidání Instancí"
-#: src/slic3r/GUI/GLCanvas3D.cpp:264
+#: src/slic3r/GUI/GLCanvas3D.cpp:251
msgid "Increase/decrease edit area"
msgstr "Zvětšit / zmenšit oblast úprav"
-#: src/slic3r/GUI/Plater.cpp:2922
-msgid "Indexing hollowed object"
-msgstr "Indexování dutého objektu"
-
#. TRN Description for "UNLOCKED LOCK"
-#: src/slic3r/GUI/Tab.cpp:3258
-msgid ""
-"indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\n"
-"Click the UNLOCKED LOCK icon to reset all settings for current option group to the system (or default) values."
-msgstr ""
-"indikuje, že některá nastavení byla změněna a nejsou shodná se systémovými (výchozími) hodnotami pro danou skupinu nastavení.\n"
-"KliknÄ›te na ikonu ODEMKNUTÉHO ZÃMKU pro reset vÅ¡ech nastavení aktuální skupiny nastavení na systémové (nebo výchozí) hodnoty."
+#: src/slic3r/GUI/Tab.cpp:3695
+msgid "indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\nClick the UNLOCKED LOCK icon to reset all settings for current option group to the system (or default) values."
+msgstr "indikuje, že nÄ›která nastavení byla zmÄ›nÄ›na a nejsou shodná se systémovými (výchozími) hodnotami pro danou skupinu nastavení.\nKliknÄ›te na ikonu ODEMKNUTÉHO ZÃMKU pro reset vÅ¡ech nastavení aktuální skupiny nastavení na systémové (nebo výchozí) hodnoty."
#. TRN Description for "LOCKED LOCK"
-#: src/slic3r/GUI/Tab.cpp:3254
+#: src/slic3r/GUI/Tab.cpp:3691
msgid "indicates that the settings are the same as the system (or default) values for the current option group"
msgstr "indikuje, že nastavení jsou stejná jako systémové (výchozí) hodnoty pro aktuální skupinu nastavení"
#. TRN Description for "BACK ARROW"
-#: src/slic3r/GUI/Tab.cpp:3270
-msgid ""
-"indicates that the settings were changed and are not equal to the last saved preset for the current option group.\n"
-"Click the BACK ARROW icon to reset all settings for the current option group to the last saved preset."
-msgstr ""
-"indikuje, že došlo ke změně nastavení, které není shodné s naposledy uloženým přednastavením pro aktuální skupinu nastavení.\n"
-"Klikněte na ikonu ŠIPKY ZPĚT pro reset všech nastavení pro aktuální skupinu nastavení na naposledy uložené přednastavení."
-
-#: src/slic3r/GUI/ConfigManipulation.cpp:211
-#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:96
-#: src/slic3r/GUI/GUI_ObjectList.cpp:614 src/slic3r/GUI/Plater.cpp:527
-#: src/slic3r/GUI/Tab.cpp:1091 src/slic3r/GUI/Tab.cpp:1092
-#: src/libslic3r/PrintConfig.cpp:203 src/libslic3r/PrintConfig.cpp:416
-#: src/libslic3r/PrintConfig.cpp:436 src/libslic3r/PrintConfig.cpp:776
-#: src/libslic3r/PrintConfig.cpp:790 src/libslic3r/PrintConfig.cpp:827
-#: src/libslic3r/PrintConfig.cpp:981 src/libslic3r/PrintConfig.cpp:991
-#: src/libslic3r/PrintConfig.cpp:1009 src/libslic3r/PrintConfig.cpp:1028
-#: src/libslic3r/PrintConfig.cpp:1047 src/libslic3r/PrintConfig.cpp:1728
-#: src/libslic3r/PrintConfig.cpp:1745
+#: src/slic3r/GUI/Tab.cpp:3707
+msgid "indicates that the settings were changed and are not equal to the last saved preset for the current option group.\nClick the BACK ARROW icon to reset all settings for the current option group to the last saved preset."
+msgstr "indikuje, že došlo ke změně nastavení, které není shodné s naposledy uloženým přednastavením pro aktuální skupinu nastavení.\nKlikněte na ikonu ŠIPKY ZPĚT pro reset všech nastavení pro aktuální skupinu nastavení na naposledy uložené přednastavení."
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:210
+#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:93
+#: src/slic3r/GUI/GUI_ObjectList.cpp:652 src/slic3r/GUI/Plater.cpp:393
+#: src/slic3r/GUI/Tab.cpp:1413 src/slic3r/GUI/Tab.cpp:1414
+#: src/libslic3r/PrintConfig.cpp:237 src/libslic3r/PrintConfig.cpp:450
+#: src/libslic3r/PrintConfig.cpp:472 src/libslic3r/PrintConfig.cpp:812
+#: src/libslic3r/PrintConfig.cpp:826 src/libslic3r/PrintConfig.cpp:863
+#: src/libslic3r/PrintConfig.cpp:1025 src/libslic3r/PrintConfig.cpp:1035
+#: src/libslic3r/PrintConfig.cpp:1053 src/libslic3r/PrintConfig.cpp:1072
+#: src/libslic3r/PrintConfig.cpp:1091 src/libslic3r/PrintConfig.cpp:1843
+#: src/libslic3r/PrintConfig.cpp:1860
msgid "Infill"
msgstr "Výplň"
-#: src/slic3r/GUI/PresetHints.cpp:174
+#: src/slic3r/GUI/PresetHints.cpp:173
msgid "infill"
msgstr "výplň"
-#: src/libslic3r/PrintConfig.cpp:1021
+#: src/libslic3r/PrintConfig.cpp:1065
msgid "Infill before perimeters"
msgstr "Tisknout výplň před tiskem perimetrů"
-#: src/libslic3r/PrintConfig.cpp:1001
+#: src/libslic3r/PrintConfig.cpp:1045
msgid "Infill extruder"
msgstr "Extruder pro výplň"
-#: src/libslic3r/PrintConfig.cpp:1036
+#: src/libslic3r/PrintConfig.cpp:1080
msgid "Infill/perimeters overlap"
msgstr "Přesah pro výplň/perimetry"
-#: src/libslic3r/Print.cpp:1584
+#: src/libslic3r/Print.cpp:1610
msgid "Infilling layers"
msgstr "Generování výplně vrstev"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3430
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3505 src/slic3r/GUI/Plater.cpp:141
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3893
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3968 src/slic3r/GUI/Plater.cpp:147
msgid "Info"
msgstr "Info"
-#: src/libslic3r/PrintConfig.cpp:1057
+#: src/slic3r/GUI/GUI_App.cpp:1087 src/slic3r/GUI/Tab.cpp:3435
+msgid "Information"
+msgstr "Informace"
+
+#: src/libslic3r/PrintConfig.cpp:1101
msgid "Inherits profile"
msgstr "Zdědí profil"
-#: src/libslic3r/SLAPrint.cpp:653
+#: src/libslic3r/SLAPrint.cpp:667
msgid "Initial exposition time is out of printer profile bounds."
msgstr "Doba poÄáteÄního osvitu je mimo rozsah profilu tiskárny."
-#: src/libslic3r/PrintConfig.cpp:2564 src/libslic3r/PrintConfig.cpp:2565
+#: src/libslic3r/PrintConfig.cpp:2707 src/libslic3r/PrintConfig.cpp:2708
msgid "Initial exposure time"
msgstr "Doba poÄáteÄního osvitu"
-#: src/libslic3r/PrintConfig.cpp:2482 src/libslic3r/PrintConfig.cpp:2483
+#: src/libslic3r/PrintConfig.cpp:2625 src/libslic3r/PrintConfig.cpp:2626
msgid "Initial layer height"
msgstr "Výška první vrstvy"
-#: src/slic3r/GUI/Field.cpp:204
+#: src/slic3r/GUI/Field.cpp:269
+#, possible-c-format
+msgid "Input value is out of range\nAre you sure that %s is a correct value and that you want to continue?"
+msgstr "Vstupní hodnota je mimo povolený rozsah\nJste si jisti, že %s je správná hodnota a že chcete pokraÄovat?"
+
+#: src/slic3r/GUI/Field.cpp:252 src/slic3r/GUI/Field.cpp:1370
msgid "Input value is out of range"
msgstr "Zadaná hodnota je mimo rozsah"
-#: src/slic3r/GUI/GUI_App.cpp:800
+#: src/slic3r/GUI/GUI_App.cpp:1480
msgid "Inspect / activate configuration snapshots"
msgstr "Zkontrolovat / aktivovat zálohy konfigurace"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:60
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:216
-#, c-format
+#: src/slic3r/Utils/PresetUpdater.cpp:120
+msgid "install"
+msgstr "instralovat"
+
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:62
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:218
+#, possible-c-format
msgid "Instance %d"
msgstr "Instance %d"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2500
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2892
msgid "Instance manipulation"
msgstr "Manipulace s instancí objektu"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:56
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:58
msgid "Instances"
msgstr "Instance"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1091
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3781
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1215
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4244
msgid "Instances to Separated Objects"
msgstr "Změna instance na samostatný objekt"
-#: src/libslic3r/PrintConfig.cpp:1973
+#: src/libslic3r/PrintConfig.cpp:2115
msgid "Interface layers"
msgstr "Kontaktní vrstvy"
-#: src/libslic3r/PrintConfig.cpp:1957
+#: src/libslic3r/PrintConfig.cpp:2099
msgid "Interface loops"
msgstr "Kontaktní smyÄky"
-#: src/libslic3r/PrintConfig.cpp:1982
+#: src/libslic3r/PrintConfig.cpp:2124
msgid "Interface pattern spacing"
msgstr "RozteÄ kontaktních vrstev"
-#: src/libslic3r/PrintConfig.cpp:1071
+#: src/libslic3r/PrintConfig.cpp:1115
msgid "Interface shells"
msgstr "Mezilehlé stěny"
-#: src/libslic3r/Zipper.cpp:84
+#: src/libslic3r/miniz_extension.cpp:143
msgid "internal error"
msgstr "interní chyba"
-#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:313
+#: src/slic3r/GUI/GUI_Preview.cpp:304 src/libslic3r/ExtrusionEntity.cpp:317
+#: src/libslic3r/ExtrusionEntity.cpp:342
msgid "Internal infill"
msgstr "Vnitřní výplň"
-#: src/slic3r/GUI/Plater.cpp:3106
+#: src/slic3r/GUI/BedShapeDialog.cpp:145
+msgid "Invalid"
+msgstr "Neplatný"
+
+#: src/slic3r/GUI/Plater.cpp:2906 src/slic3r/GUI/Plater.cpp:3583
msgid "Invalid data"
msgstr "Neplatná data"
-#: src/slic3r/GUI/BedShapeDialog.cpp:494 src/slic3r/GUI/BedShapeDialog.cpp:543
-#: src/slic3r/GUI/BedShapeDialog.cpp:566
+#: src/slic3r/GUI/BedShapeDialog.cpp:570 src/slic3r/GUI/BedShapeDialog.cpp:619
+#: src/slic3r/GUI/BedShapeDialog.cpp:642
msgid "Invalid file format."
msgstr "Neplatný formát souboru."
-#: src/libslic3r/Zipper.cpp:80
+#: src/libslic3r/miniz_extension.cpp:139
msgid "invalid filename"
msgstr "neplatný název souboru"
-#: src/slic3r/GUI/ConfigManipulation.cpp:319
+#: src/slic3r/GUI/ConfigManipulation.cpp:324
msgid "Invalid Head penetration"
msgstr "Neplatný průnik podpěry do modelu"
-#: src/libslic3r/Zipper.cpp:48
+#: src/libslic3r/miniz_extension.cpp:107
msgid "invalid header or archive is corrupted"
msgstr "neplatná hlaviÄka nebo je archiv poÅ¡kozen"
-#: src/slic3r/GUI/Field.cpp:195 src/slic3r/GUI/Field.cpp:226
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:376
+#: src/slic3r/GUI/Field.cpp:375
+msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
+msgstr "Neplatný vstupní formát. OÄekává se vektor rozmÄ›rů v následujícím formátu: \"%1%\""
+
+#: src/slic3r/GUI/Field.cpp:243 src/slic3r/GUI/Field.cpp:274
+#: src/slic3r/GUI/Field.cpp:1358 src/slic3r/GUI/GUI_ObjectLayers.cpp:413
msgid "Invalid numeric input."
msgstr "Neplatný Äíselný vstup."
-#: src/libslic3r/Zipper.cpp:78
+#: src/libslic3r/miniz_extension.cpp:137
msgid "invalid parameter"
msgstr "neplatný parametr"
-#: src/slic3r/GUI/ConfigManipulation.cpp:332
+#: src/slic3r/GUI/ConfigManipulation.cpp:337
msgid "Invalid pinhead diameter"
msgstr "Průměr hrotu podpěry je neplatný"
+#: src/slic3r/GUI/GUI_ObjectList.cpp:94 src/slic3r/GUI/GUI_ObjectList.cpp:653
+#: src/slic3r/GUI/GUI_Preview.cpp:307 src/slic3r/GUI/Tab.cpp:1420
+#: src/libslic3r/ExtrusionEntity.cpp:320 src/libslic3r/ExtrusionEntity.cpp:348
+#: src/libslic3r/PrintConfig.cpp:1126 src/libslic3r/PrintConfig.cpp:1132
+#: src/libslic3r/PrintConfig.cpp:1146 src/libslic3r/PrintConfig.cpp:1156
+msgid "Ironing"
+msgstr "Ironing"
+
+#: src/libslic3r/PrintConfig.cpp:1131 src/libslic3r/PrintConfig.cpp:1133
+msgid "Ironing Type"
+msgstr "Způsob vyhlazování"
+
+#: src/slic3r/GUI/GUI_App.cpp:243
+msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community."
+msgstr "je založen na Slic3r od Alessandra Ranellucciho a RepRap komunity."
+
#. TRN "Slic3r _is licensed under the_ License"
-#: src/slic3r/GUI/AboutDialog.cpp:258
+#: src/slic3r/GUI/AboutDialog.cpp:283 src/slic3r/GUI/GUI_App.cpp:244
msgid "is licensed under the"
msgstr "je licencován pod"
-#: src/slic3r/GUI/Tab.cpp:2941
-msgid "is not compatible with print profile"
-msgstr "není kompatibilní s tiskovým profilem"
-
-#: src/slic3r/GUI/Tab.cpp:2940
-msgid "is not compatible with printer"
-msgstr "není kompatibilní s tiskárnou"
-
-#: src/slic3r/GUI/MainFrame.cpp:658
+#: src/slic3r/GUI/MainFrame.cpp:955 src/slic3r/GUI/MainFrame.cpp:1275
msgid "Iso"
msgstr "Izometrické"
-#: src/slic3r/GUI/MainFrame.cpp:658
+#: src/slic3r/GUI/MainFrame.cpp:955 src/slic3r/GUI/MainFrame.cpp:1275
msgid "Iso View"
msgstr "Izometrické zobrazení"
-#: src/slic3r/GUI/Tab.cpp:964
+#: src/slic3r/GUI/Tab.cpp:1282
msgid "It can't be deleted or modified."
msgstr "Nelze smazat nebo upravit."
-#: src/slic3r/GUI/Plater.cpp:3321
+#: src/slic3r/GUI/Plater.cpp:3124
msgid "It is not allowed to change the file to reload"
msgstr "Není možné zmÄ›nit soubor, který má být znovu naÄten"
-#: src/libslic3r/PrintConfig.cpp:974
+#: src/libslic3r/PrintConfig.cpp:1018
msgid "It may be beneficial to increase the extruder motor current during the filament exchange sequence to allow for rapid ramming feed rates and to overcome resistance when loading a filament with an ugly shaped tip."
msgstr "Může být užiteÄné zvýšit proud motoru extruderu bÄ›hem sekvence výmÄ›ny filamentu, aby se umožnily vysoké rychlosti zavádÄ›ní filamentu a aby se pÅ™ekonal odpor pÅ™i zavádÄ›ní filamentu s oÅ¡klivÄ› tvarovanou Å¡piÄkou."
-#: src/slic3r/GUI/GUI_App.cpp:1084 src/slic3r/GUI/Tab.cpp:2958
+#: src/slic3r/GUI/Tab.cpp:3413
+msgid "It's a last preset for this physical printer."
+msgstr "Toto je poslední přednastavení pro tuto fyzickou tiskárnu."
+
+#: src/slic3r/GUI/GUI_App.cpp:1876 src/slic3r/GUI/Tab.cpp:3187
msgid "It's impossible to print multi-part object(s) with SLA technology."
msgstr "SLA technologií nelze tisknout vícedílné objekty."
-#: src/slic3r/GUI/Tab.cpp:2229
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:601
+msgid "It's not possible to delete the last related preset for the printer."
+msgstr "Není možné odstranit poslední související přednastavení tiskárny."
+
+#: src/slic3r/GUI/Tab.cpp:2398
msgid "Jerk limits"
msgstr "Ryv limity"
-#: src/libslic3r/PrintConfig.cpp:1649
+#: src/libslic3r/PrintConfig.cpp:1757
msgid "Jitter"
msgstr "Rozkmit (Jitter)"
-#: src/slic3r/GUI/DoubleSlider.cpp:957 src/slic3r/GUI/DoubleSlider.cpp:1529
-#: src/slic3r/GUI/DoubleSlider.cpp:1651
+#: src/slic3r/GUI/DoubleSlider.cpp:1077 src/slic3r/GUI/DoubleSlider.cpp:1721
+#: src/slic3r/GUI/DoubleSlider.cpp:1852 src/slic3r/GUI/DoubleSlider.cpp:1856
msgid "Jump to height"
msgstr "Přechod do výšky"
-#: src/slic3r/GUI/DoubleSlider.cpp:955
-#, c-format
-msgid "Jump to height %s or Set extruder sequence for the entire print"
-msgstr "Přechod do výšky %s nebo Nastavení sekvence extruderů pro celý tisk"
+#: src/slic3r/GUI/DoubleSlider.cpp:1223
+#, possible-c-format
+msgid "Jump to height %s\nor Set ruler mode"
+msgstr "Přechod do výšky %s\nnebo Nastavení režimu pravítka"
-#: src/libslic3r/PrintConfig.cpp:566
+#: src/slic3r/GUI/DoubleSlider.cpp:1220
+#, possible-c-format
+msgid "Jump to height %s\nSet ruler mode\nor Set extruder sequence for the entire print"
+msgstr "Přechod do výšky %s\nNastavení režimu pravítka\nnebo Nastavení sekvence extruderů pro celý tisk"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1071 src/slic3r/GUI/DoubleSlider.cpp:1852
+msgid "Jump to move"
+msgstr "Přechod na pohyb v rámci vrstvy"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:315
+msgid "Just switch to \"%1%\" preset"
+msgstr "Pouze se přepnout do profilu \"%1%\""
+
+#: src/libslic3r/PrintConfig.cpp:602
msgid "Keep fan always on"
msgstr "Ventilátor vždy zapnutý"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:169
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:171
msgid "Keep lower part"
msgstr "Zachovat spodní Äást"
-#: src/slic3r/GUI/GLCanvas3D.cpp:304
+#: src/slic3r/GUI/GLCanvas3D.cpp:290
msgid "Keep min"
msgstr "Zachovat minima"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:168
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170
msgid "Keep upper part"
msgstr "Zachovat horní Äást"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:41 src/slic3r/GUI/MainFrame.cpp:708
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:37
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:39 src/slic3r/GUI/MainFrame.cpp:941
+#: src/slic3r/GUI/MainFrame.cpp:1332
msgid "Keyboard Shortcuts"
msgstr "Klávesové zkratky"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:245
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:259
msgid "Keyboard shortcuts"
msgstr "Klávesové zkratky"
-#: src/libslic3r/PrintConfig.cpp:2498
+#: src/libslic3r/PrintConfig.cpp:2641
msgid "kg"
msgstr "kg"
-#: src/libslic3r/PrintConfig.cpp:965
+#: src/libslic3r/PrintConfig.cpp:1009
msgid "Label objects"
msgstr "OznaÄování objektů"
-#: src/libslic3r/PrintConfig.cpp:2399
+#: src/libslic3r/PrintConfig.cpp:2542
msgid "Landscape"
msgstr "Orientace na šířku"
-#: src/slic3r/GUI/GUI_App.cpp:629
+#: src/slic3r/GUI/GUI_App.cpp:1295
msgid "Language"
msgstr "Jazyk"
-#: src/slic3r/GUI/GUI_App.cpp:885
+#: src/slic3r/GUI/GUI_App.cpp:1605 src/slic3r/GUI/GUI_App.cpp:1614
msgid "Language selection"
msgstr "Výběr jazyka"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2140
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2242
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2307
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2408
msgid "Last instance of an object cannot be deleted."
msgstr "Poslední instanci objektu nelze odstranit."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3418
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3881
msgid "Layer"
msgstr "Vrstva"
-#: src/slic3r/GUI/ConfigManipulation.cpp:49
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1049
+#: src/slic3r/GUI/ConfigManipulation.cpp:48
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1371
#: src/libslic3r/PrintConfig.cpp:71
msgid "Layer height"
msgstr "Výška vrstvy"
-#: src/libslic3r/Print.cpp:1427
+#: src/libslic3r/Print.cpp:1453
msgid "Layer height can't be greater than nozzle diameter"
msgstr "Výška vrstvy nemůže být větší než je průměr trysky"
-#: src/slic3r/GUI/Tab.cpp:2362
+#: src/slic3r/GUI/Tab.cpp:2531
msgid "Layer height limits"
msgstr "Výškové limity vrstvy"
-#: src/slic3r/GUI/ConfigWizard.cpp:2015
-msgid "Layer height:"
-msgstr "Výška vrstvy:"
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2488
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2880
msgid "Layer range Settings to modify"
msgstr "Nastavení pro vrstvy v rozsahu"
#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:52
-#: src/libslic3r/PrintConfig.cpp:362 src/libslic3r/PrintConfig.cpp:994
-#: src/libslic3r/PrintConfig.cpp:1505 src/libslic3r/PrintConfig.cpp:1690
-#: src/libslic3r/PrintConfig.cpp:1750 src/libslic3r/PrintConfig.cpp:1930
-#: src/libslic3r/PrintConfig.cpp:1976
+#: src/libslic3r/PrintConfig.cpp:396 src/libslic3r/PrintConfig.cpp:1038
+#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:1798
+#: src/libslic3r/PrintConfig.cpp:1865 src/libslic3r/PrintConfig.cpp:2072
+#: src/libslic3r/PrintConfig.cpp:2118
msgid "layers"
msgstr "vrstva(y)"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3512
-#: src/slic3r/GUI/Tab.cpp:3600
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3928
+#: src/slic3r/GUI/Tab.cpp:4010
msgid "Layers"
msgstr "Vrstvy"
-#: src/slic3r/GUI/Tab.cpp:1048 src/slic3r/GUI/Tab.cpp:3598
+#: src/slic3r/GUI/Tab.cpp:1370 src/slic3r/GUI/Tab.cpp:4008
msgid "Layers and perimeters"
msgstr "Vrstvy a perimetry"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:95
-#: src/slic3r/GUI/GUI_ObjectList.cpp:613 src/libslic3r/PrintConfig.cpp:72
-#: src/libslic3r/PrintConfig.cpp:175 src/libslic3r/PrintConfig.cpp:184
-#: src/libslic3r/PrintConfig.cpp:408 src/libslic3r/PrintConfig.cpp:470
-#: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:890
-#: src/libslic3r/PrintConfig.cpp:1075 src/libslic3r/PrintConfig.cpp:1374
-#: src/libslic3r/PrintConfig.cpp:1441 src/libslic3r/PrintConfig.cpp:1622
-#: src/libslic3r/PrintConfig.cpp:2074 src/libslic3r/PrintConfig.cpp:2133
-#: src/libslic3r/PrintConfig.cpp:2142
+#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:92
+#: src/slic3r/GUI/GUI_ObjectList.cpp:651 src/libslic3r/PrintConfig.cpp:72
+#: src/libslic3r/PrintConfig.cpp:209 src/libslic3r/PrintConfig.cpp:218
+#: src/libslic3r/PrintConfig.cpp:442 src/libslic3r/PrintConfig.cpp:506
+#: src/libslic3r/PrintConfig.cpp:514 src/libslic3r/PrintConfig.cpp:932
+#: src/libslic3r/PrintConfig.cpp:1119 src/libslic3r/PrintConfig.cpp:1482
+#: src/libslic3r/PrintConfig.cpp:1549 src/libslic3r/PrintConfig.cpp:1730
+#: src/libslic3r/PrintConfig.cpp:2217 src/libslic3r/PrintConfig.cpp:2276
+#: src/libslic3r/PrintConfig.cpp:2285
msgid "Layers and Perimeters"
msgstr "Vrstvy a perimetry"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
-msgid "Layers Slider"
-msgstr "Posuvníky"
-
-#: src/slic3r/GUI/OptionsGroup.cpp:258
+#: src/slic3r/GUI/OptionsGroup.cpp:293
msgctxt "Layers"
msgid "Bottom"
msgstr "Spodních"
-#: src/slic3r/GUI/OptionsGroup.cpp:258
+#: src/slic3r/GUI/OptionsGroup.cpp:293
msgctxt "Layers"
msgid "Top"
msgstr "Vrchních"
-#: src/slic3r/GUI/MainFrame.cpp:671
+#: src/slic3r/GUI/Preferences.cpp:440
+msgid "Layout Options"
+msgstr "Možnosti rozložení"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:48
+msgid "Leaving Paint-on supports"
+msgstr "Opuštění Malování podpěr"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:47
+msgid "Leaving Seam painting"
+msgstr "Opuštění Malování švu"
+
+#: src/slic3r/GUI/MainFrame.cpp:968 src/slic3r/GUI/MainFrame.cpp:1288
msgid "Left"
msgstr "Zleva"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214
msgid "Left click"
msgstr "Levý klik"
-#: src/slic3r/GUI/GLCanvas3D.cpp:237
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:29
+msgid "Left mouse button"
+msgstr "Levé tlaÄítko myÅ¡i"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:233
msgid "Left mouse button:"
msgstr "Levé tlaÄítko myÅ¡i:"
-#: src/slic3r/GUI/MainFrame.cpp:671
+#: src/slic3r/GUI/MainFrame.cpp:968 src/slic3r/GUI/MainFrame.cpp:1288
msgid "Left View"
msgstr "Pohled zleva"
-#: src/slic3r/GUI/GUI_Preview.cpp:257
-msgid "Legend"
-msgstr "Legenda"
+#: src/slic3r/GUI/GUI_Preview.cpp:1480
+msgid "Legend/Estimated printing time"
+msgstr "Legenda / Odhadovaný Äas tisku"
-#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1551
+#: src/libslic3r/PrintConfig.cpp:1651 src/libslic3r/PrintConfig.cpp:1659
msgid "Length"
msgstr "Vzdálenost"
-#: src/libslic3r/PrintConfig.cpp:328
+#: src/libslic3r/PrintConfig.cpp:362
msgid "Length of the cooling tube to limit space for cooling moves inside it."
msgstr "Délka kovové trubiÄky urÄené pro ochlazení a zformování filamentu po vytažení z extruderu."
+#: src/libslic3r/PrintConfig.cpp:1068
+msgid "Length of the infill anchor"
+msgstr "Délka výplňové kotvy"
+
#. TRN "Slic3r _is licensed under the_ License"
-#: src/slic3r/GUI/AboutDialog.cpp:129
+#: src/slic3r/GUI/AboutDialog.cpp:141
msgid "License agreements of all following programs (libraries) are part of application license agreement"
msgstr "LicenÄní ujednání vÅ¡ech následujících programů (knihoven) je souÄástí licenÄní smlouvy"
-#: src/libslic3r/PrintConfig.cpp:1561
+#: src/libslic3r/PrintConfig.cpp:1669
msgid "Lift Z"
msgstr "Zvednout Z"
-#: src/libslic3r/PrintConfig.cpp:848
+#: src/libslic3r/PrintConfig.cpp:886
msgid "Line"
msgstr "Čára"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1427
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1558
msgid "Load"
msgstr "NaÄíst"
-#: src/slic3r/GUI/MainFrame.cpp:460
+#: src/slic3r/GUI/MainFrame.cpp:1042
msgid "Load a model"
msgstr "NaÄíst model"
-#: src/libslic3r/PrintConfig.cpp:3505
+#: src/slic3r/GUI/MainFrame.cpp:1046
+msgid "Load an model saved with imperial units"
+msgstr "NaÄíst jako model v imperiálních jednotkách"
+
+#: src/slic3r/GUI/MainFrame.cpp:1058
+msgid "Load an SL1 archive"
+msgstr "NaÄíst SL1 archiv"
+
+#: src/libslic3r/PrintConfig.cpp:3710
msgid "Load and store settings at the given directory. This is useful for maintaining different profiles or including configurations from a network storage."
msgstr "NaÄtÄ›te a uložte nastavení z/do daného adresáře. To je užiteÄné pro udržování různých profilů nebo konfigurací ze síťového úložiÅ¡tÄ›."
-#: src/libslic3r/PrintConfig.cpp:3489
+#: src/libslic3r/PrintConfig.cpp:3688
msgid "Load config file"
msgstr "NaÄíst konfiguraÄní soubor"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:120
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:113
msgid "Load Config from ini/amf/3mf/gcode and merge"
msgstr "NaÄíst konfiguraci zesouboru ini/amf/3mf/gcode a slouÄit"
-#: src/slic3r/GUI/MainFrame.cpp:467
+#: src/slic3r/GUI/MainFrame.cpp:1058
msgid "Load configuration from project file"
msgstr "NaÄíst konfiguraci z projektu"
-#: src/libslic3r/PrintConfig.cpp:3490
+#: src/libslic3r/PrintConfig.cpp:3689
msgid "Load configuration from the specified file. It can be used more than once to load options from multiple files."
msgstr "NaÄíst konfiguraci ze zadaného souboru. Může být použito vícekrát než jednou pro naÄtení z více souborů."
-#: src/slic3r/GUI/MainFrame.cpp:464
+#: src/slic3r/GUI/MainFrame.cpp:1055
msgid "Load exported configuration file"
msgstr "NaÄíst exportovaný konfiguraÄní soubor"
-#: src/slic3r/GUI/Plater.cpp:1395
+#: src/slic3r/GUI/Plater.cpp:1543 src/slic3r/GUI/Plater.cpp:4976
msgid "Load File"
-msgstr "NaÄtení souboru"
+msgstr "NaÄíst soubor"
-#: src/slic3r/GUI/Plater.cpp:1399
+#: src/slic3r/GUI/Plater.cpp:1548 src/slic3r/GUI/Plater.cpp:4981
msgid "Load Files"
-msgstr "Naštení souborů"
+msgstr "NaÄíst soubory"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1879
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2038
msgid "Load Part"
msgstr "PÅ™idání Äásti"
-#: src/slic3r/GUI/MainFrame.cpp:471
+#: src/slic3r/GUI/MainFrame.cpp:1062
msgid "Load presets from a bundle"
msgstr "NaÄíst pÅ™ednastavení z balíku"
-#: src/slic3r/GUI/Plater.cpp:4575
+#: src/slic3r/GUI/Plater.cpp:4627
msgid "Load Project"
msgstr "NaÄíst Projekt"
-#: src/slic3r/GUI/BedShapeDialog.cpp:102
+#: src/slic3r/GUI/BedShapeDialog.cpp:243
msgid "Load shape from STL..."
msgstr "NaÄíst tvar ze souboru STL…"
-#: src/slic3r/GUI/BedShapeDialog.cpp:182 src/slic3r/GUI/BedShapeDialog.cpp:261
+#: src/slic3r/GUI/BedShapeDialog.cpp:325 src/slic3r/GUI/BedShapeDialog.cpp:405
msgid "Load..."
msgstr "NaÄíst..."
@@ -4075,19 +4816,27 @@ msgstr "NaÄíst..."
msgid "loaded"
msgstr "zaváděn"
-#: src/slic3r/GUI/Plater.cpp:2426
+#: src/slic3r/GUI/Plater.cpp:2388
msgid "Loaded"
msgstr "NaÄteno"
-#: src/slic3r/GUI/Plater.cpp:2273
+#: src/slic3r/GUI/Plater.cpp:2216
msgid "Loading"
msgstr "NaÄítání"
-#: src/slic3r/GUI/GUI_App.cpp:474
+#: src/slic3r/GUI/GUI_App.cpp:797
+msgid "Loading configuration"
+msgstr "NaÄítání konfigurace"
+
+#: src/slic3r/GUI/Plater.cpp:2226
+msgid "Loading file"
+msgstr "NaÄítání souboru"
+
+#: src/slic3r/GUI/GUI_App.cpp:1125
msgid "Loading of a mode view"
msgstr "NaÄítání režimu zobrazení"
-#: src/slic3r/GUI/GUI_App.cpp:466
+#: src/slic3r/GUI/GUI_App.cpp:1120
msgid "Loading of current presets"
msgstr "NaÄítání aktuálních pÅ™edvoleb"
@@ -4096,101 +4845,121 @@ msgstr "NaÄítání aktuálních pÅ™edvoleb"
msgid "Loading repaired model"
msgstr "NaÄítaní opraveného modelu"
-#: src/libslic3r/PrintConfig.cpp:607
+#: src/libslic3r/PrintConfig.cpp:643
msgid "Loading speed"
msgstr "Rychlost zavádění"
-#: src/libslic3r/PrintConfig.cpp:615
+#: src/libslic3r/PrintConfig.cpp:651
msgid "Loading speed at the start"
msgstr "PoÄáteÄní rychlost zavádÄ›ní"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:63
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:106
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:69
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:112
msgid "Local coordinates"
msgstr "Lokální souřadnice"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48
msgid "Lock supports under new islands"
msgstr "Ukotvi podpěry pod novými ostrůvky"
-#: src/slic3r/GUI/Tab.cpp:3252
+#: src/slic3r/GUI/Tab.cpp:3689
msgid "LOCKED LOCK"
msgstr "ZAMÄŒENÃ ZÃMEK"
-#: src/slic3r/GUI/Tab.cpp:3280
+#: src/slic3r/GUI/Tab.cpp:3717
msgid "LOCKED LOCK icon indicates that the settings are the same as the system (or default) values for the current option group"
msgstr "Ikona ZAMKNUTÉHO ZÃMKU indikuje, že nastavení jsou stejná jako systémové (nebo výchozí) hodnoty pro aktuální skupinu nastavení"
-#: src/slic3r/GUI/Tab.cpp:3296
+#: src/slic3r/GUI/Tab.cpp:3733
msgid "LOCKED LOCK icon indicates that the value is the same as the system (or default) value."
msgstr "Ikona ZAMKNUTÉHO ZÃMKU indikuje, že hodnota je shodná se systémovou (výchozí) hodnotou."
-#: src/libslic3r/PrintConfig.cpp:3508
+#: src/libslic3r/PrintConfig.cpp:3713
msgid "Logging level"
msgstr "Úroveň logování"
-#: src/libslic3r/PrintConfig.cpp:1695
+#: src/libslic3r/PrintConfig.cpp:1810
msgid "Loops (minimum)"
msgstr "SmyÄek (minimálnÄ›)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:206
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
msgid "Lower Layer"
msgstr "Nižší vrstva"
-#: src/slic3r/GUI/Tab.cpp:2188 src/slic3r/GUI/Tab.cpp:2273
-#: src/libslic3r/PrintConfig.cpp:1129 src/libslic3r/PrintConfig.cpp:1146
-#: src/libslic3r/PrintConfig.cpp:1163 src/libslic3r/PrintConfig.cpp:1179
-#: src/libslic3r/PrintConfig.cpp:1189 src/libslic3r/PrintConfig.cpp:1199
-#: src/libslic3r/PrintConfig.cpp:1209
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+msgid "Lower layer"
+msgstr "Spodní vrstva"
+
+#: src/slic3r/GUI/Tab.cpp:2346 src/slic3r/GUI/Tab.cpp:2442
+#: src/libslic3r/PrintConfig.cpp:1202 src/libslic3r/PrintConfig.cpp:1237
+#: src/libslic3r/PrintConfig.cpp:1254 src/libslic3r/PrintConfig.cpp:1271
+#: src/libslic3r/PrintConfig.cpp:1287 src/libslic3r/PrintConfig.cpp:1297
+#: src/libslic3r/PrintConfig.cpp:1307 src/libslic3r/PrintConfig.cpp:1317
msgid "Machine limits"
msgstr "Limity stroje"
-#: src/slic3r/GUI/Plater.cpp:166
+#: src/slic3r/GUI/Tab.cpp:3667
+msgid "Machine limits are not set, therefore the print time estimate may not be accurate."
+msgstr "Nejsou nastaveny limity zařízení, proto nemusí být odhad doby tisku přesný."
+
+#: src/slic3r/GUI/Tab.cpp:3660
+msgid "Machine limits will be emitted to G-code and used to estimate print time."
+msgstr "Limity stroje budou emitovány do G-codu a budou použity k odhadu doby tisku."
+
+#: src/slic3r/GUI/Tab.cpp:3663
+msgid "Machine limits will NOT be emitted to G-code, however they will be used to estimate print time, which may therefore not be accurate as the printer may apply a different set of machine limits."
+msgstr "Limity stroje NEBUDOU aplikovány do G-codu, ale budou použity k odhadu doby tisku, což však nemusí být přesné, protože tiskárna může použít jinou sadu limitů."
+
+#: src/slic3r/GUI/Plater.cpp:172
msgid "Manifold"
msgstr "Model OK"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56
msgid "Manual editing"
msgstr "Manuální úprava"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:180
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:214
msgid "Masked SLA file exported to %1%"
msgstr "Soubor pro SLA byl exportován do %1%"
-#: src/slic3r/GUI/MainFrame.cpp:752
+#: src/slic3r/GUI/MainFrame.cpp:1451
msgid "Mate&rial Settings Tab"
-msgstr "Panel nastavení mate&riálu"
+msgstr "Panel Nastavení mate&riálu"
-#: src/slic3r/GUI/Tab.cpp:3478 src/slic3r/GUI/Tab.cpp:3480
+#: src/slic3r/GUI/Tab.cpp:3894 src/slic3r/GUI/Tab.cpp:3896
msgid "Material"
msgstr "Materiál"
-#: src/slic3r/GUI/Tab.hpp:416
+#: src/slic3r/GUI/Tab.hpp:486
msgid "Material Settings"
msgstr "Nastavení materiálu"
-#: src/slic3r/GUI/Plater.cpp:163
+#: src/slic3r/GUI/GLCanvas3D.cpp:4304 src/slic3r/GUI/GLCanvas3D.cpp:4940
+msgid "Material Settings Tab"
+msgstr "Panel Nastavení materiálu"
+
+#: src/slic3r/GUI/Plater.cpp:169
msgid "Materials"
msgstr "Materiálů"
-#: src/libslic3r/PrintConfig.cpp:1217 src/libslic3r/PrintConfig.cpp:1226
+#: src/libslic3r/PrintConfig.cpp:1325 src/libslic3r/PrintConfig.cpp:1334
msgid "Max"
msgstr "Maximum"
-#: src/libslic3r/PrintConfig.cpp:2734
+#: src/libslic3r/PrintConfig.cpp:2898
msgid "Max bridge length"
msgstr "Maximální délka mostu"
-#: src/libslic3r/PrintConfig.cpp:2658
+#: src/libslic3r/PrintConfig.cpp:2812
msgid "Max bridges on a pillar"
msgstr "Max poÄet mostů na sloupu"
-#: src/libslic3r/PrintConfig.cpp:2822
+#: src/libslic3r/PrintConfig.cpp:2986
msgid "Max merge distance"
msgstr "Maximální vzdálenost pro slouÄení"
-#: src/libslic3r/PrintConfig.cpp:2743
+#: src/libslic3r/PrintConfig.cpp:2907
msgid "Max pillar linking distance"
msgstr "Max. vzdálenost propojení podpěr"
@@ -4198,7 +4967,7 @@ msgstr "Max. vzdálenost propojení podpěr"
msgid "Max print height"
msgstr "Maximální výška tisku"
-#: src/libslic3r/PrintConfig.cpp:1237
+#: src/libslic3r/PrintConfig.cpp:1345
msgid "Max print speed"
msgstr "Maximální rychlost tisku"
@@ -4206,171 +4975,193 @@ msgstr "Maximální rychlost tisku"
msgid "max PrusaSlicer version"
msgstr "max PrusaSlicer verze"
-#: src/libslic3r/PrintConfig.cpp:1268
+#: src/libslic3r/PrintConfig.cpp:1376
msgid "Max volumetric slope negative"
msgstr "Maximální negativní objemový sklon"
-#: src/libslic3r/PrintConfig.cpp:1257
+#: src/libslic3r/PrintConfig.cpp:1365
msgid "Max volumetric slope positive"
msgstr "Maximální pozitivní objemový sklon"
-#: src/libslic3r/PrintConfig.cpp:597 src/libslic3r/PrintConfig.cpp:1247
+#: src/libslic3r/PrintConfig.cpp:633 src/libslic3r/PrintConfig.cpp:1355
msgid "Max volumetric speed"
msgstr "Maximální objemová rychlost"
-#: src/libslic3r/PrintConfig.cpp:2268
+#: src/libslic3r/PrintConfig.cpp:2411
msgid "Maximal bridging distance"
msgstr "Maximální vzdálenost přemostění"
-#: src/libslic3r/PrintConfig.cpp:2269
+#: src/libslic3r/PrintConfig.cpp:2412
msgid "Maximal distance between supports on sparse infill sections."
msgstr "Maximální vzdálenost mezi podpÄ›rami u Äástí s řídkou výplní."
-#: src/libslic3r/PrintConfig.cpp:1145
+#: src/libslic3r/PrintConfig.cpp:1253
msgid "Maximum acceleration E"
msgstr "Maximální zrychlení E"
-#: src/libslic3r/PrintConfig.cpp:1151
+#: src/libslic3r/PrintConfig.cpp:1259
msgid "Maximum acceleration of the E axis"
msgstr "Maximální zrychlení osy E"
-#: src/libslic3r/PrintConfig.cpp:1148
+#: src/libslic3r/PrintConfig.cpp:1256
msgid "Maximum acceleration of the X axis"
msgstr "Maximální zrychlení osy X"
-#: src/libslic3r/PrintConfig.cpp:1149
+#: src/libslic3r/PrintConfig.cpp:1257
msgid "Maximum acceleration of the Y axis"
msgstr "Maximální zrychlení osy Y"
-#: src/libslic3r/PrintConfig.cpp:1150
+#: src/libslic3r/PrintConfig.cpp:1258
msgid "Maximum acceleration of the Z axis"
msgstr "Maximální zrychlení osy Z"
-#: src/libslic3r/PrintConfig.cpp:1198
+#: src/libslic3r/PrintConfig.cpp:1306
msgid "Maximum acceleration when extruding"
msgstr "Maximální zrychlení při extruzi"
-#: src/libslic3r/PrintConfig.cpp:1200
+#: src/libslic3r/PrintConfig.cpp:1308
msgid "Maximum acceleration when extruding (M204 S)"
msgstr "Maximální zrychlení při extruzi (M204 S)"
-#: src/libslic3r/PrintConfig.cpp:1208
+#: src/libslic3r/PrintConfig.cpp:1316
msgid "Maximum acceleration when retracting"
msgstr "Maximální zrychlení při retrakci"
-#: src/libslic3r/PrintConfig.cpp:1210
+#: src/libslic3r/PrintConfig.cpp:1318
msgid "Maximum acceleration when retracting (M204 T)"
msgstr "Maximální zrychlení při retrakci (M204 T)"
-#: src/libslic3r/PrintConfig.cpp:1142
+#: src/libslic3r/PrintConfig.cpp:1250
msgid "Maximum acceleration X"
msgstr "Maximální zrychlení X"
-#: src/libslic3r/PrintConfig.cpp:1143
+#: src/libslic3r/PrintConfig.cpp:1251
msgid "Maximum acceleration Y"
msgstr "Maximální zrychlení Y"
-#: src/libslic3r/PrintConfig.cpp:1144
+#: src/libslic3r/PrintConfig.cpp:1252
msgid "Maximum acceleration Z"
msgstr "Maximální zrychlení Z"
-#: src/slic3r/GUI/Tab.cpp:2222
+#: src/slic3r/GUI/Tab.cpp:2391
msgid "Maximum accelerations"
msgstr "Maximální zrychlení"
-#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2534
+#: src/libslic3r/PrintConfig.cpp:2676 src/libslic3r/PrintConfig.cpp:2677
msgid "Maximum exposure time"
msgstr "Maximální doba osvitu"
-#: src/libslic3r/PrintConfig.cpp:1128
+#: src/libslic3r/PrintConfig.cpp:1236
msgid "Maximum feedrate E"
msgstr "Maximální rychlost posuvu E"
-#: src/libslic3r/PrintConfig.cpp:1134
+#: src/libslic3r/PrintConfig.cpp:1242
msgid "Maximum feedrate of the E axis"
msgstr "Maximální rychlost posuvu osy E"
-#: src/libslic3r/PrintConfig.cpp:1131
+#: src/libslic3r/PrintConfig.cpp:1239
msgid "Maximum feedrate of the X axis"
msgstr "Maximální rychlost posuvu osy X"
-#: src/libslic3r/PrintConfig.cpp:1132
+#: src/libslic3r/PrintConfig.cpp:1240
msgid "Maximum feedrate of the Y axis"
msgstr "Maximální rychlost posuvu osy Y"
-#: src/libslic3r/PrintConfig.cpp:1133
+#: src/libslic3r/PrintConfig.cpp:1241
msgid "Maximum feedrate of the Z axis"
msgstr "Maximální rychlost posuvu osy Z"
-#: src/libslic3r/PrintConfig.cpp:1125
+#: src/libslic3r/PrintConfig.cpp:1233
msgid "Maximum feedrate X"
msgstr "Maximální rychlost posuvu X"
-#: src/libslic3r/PrintConfig.cpp:1126
+#: src/libslic3r/PrintConfig.cpp:1234
msgid "Maximum feedrate Y"
msgstr "Maximální rychlost posuvu Y"
-#: src/libslic3r/PrintConfig.cpp:1127
+#: src/libslic3r/PrintConfig.cpp:1235
msgid "Maximum feedrate Z"
msgstr "Maximální rychlost posuvu Z"
-#: src/slic3r/GUI/Tab.cpp:2217
+#: src/slic3r/GUI/Tab.cpp:2386
msgid "Maximum feedrates"
msgstr "Maximální rychlosti posuvu"
-#: src/libslic3r/PrintConfig.cpp:2556 src/libslic3r/PrintConfig.cpp:2557
+#: src/libslic3r/PrintConfig.cpp:2699 src/libslic3r/PrintConfig.cpp:2700
msgid "Maximum initial exposure time"
msgstr "Maximální doba poÄáteÄního osvitu"
-#: src/libslic3r/PrintConfig.cpp:1162
+#: src/libslic3r/PrintConfig.cpp:1270
msgid "Maximum jerk E"
msgstr "Maximální ryv E"
-#: src/libslic3r/PrintConfig.cpp:1168
+#: src/libslic3r/PrintConfig.cpp:1276
msgid "Maximum jerk of the E axis"
msgstr "Maximální ryv (jerk) osy E"
-#: src/libslic3r/PrintConfig.cpp:1165
+#: src/libslic3r/PrintConfig.cpp:1273
msgid "Maximum jerk of the X axis"
msgstr "Maximální ryv (jerk) osy X"
-#: src/libslic3r/PrintConfig.cpp:1166
+#: src/libslic3r/PrintConfig.cpp:1274
msgid "Maximum jerk of the Y axis"
msgstr "Maximální ryv (jerk) osy Y"
-#: src/libslic3r/PrintConfig.cpp:1167
+#: src/libslic3r/PrintConfig.cpp:1275
msgid "Maximum jerk of the Z axis"
msgstr "Maximální ryv (jerk) osy Z"
-#: src/libslic3r/PrintConfig.cpp:1159
+#: src/libslic3r/PrintConfig.cpp:1267
msgid "Maximum jerk X"
msgstr "Maximální ryv X"
-#: src/libslic3r/PrintConfig.cpp:1160
+#: src/libslic3r/PrintConfig.cpp:1268
msgid "Maximum jerk Y"
msgstr "Maximální ryv Y"
-#: src/libslic3r/PrintConfig.cpp:1161
+#: src/libslic3r/PrintConfig.cpp:1269
msgid "Maximum jerk Z"
msgstr "Maximální ryv Z"
-#: src/libslic3r/PrintConfig.cpp:2660
+#: src/libslic3r/PrintConfig.cpp:1095
+msgid "Maximum length of the infill anchor"
+msgstr "Maximální délka výplňové kotvy"
+
+#: src/libslic3r/PrintConfig.cpp:2814
msgid "Maximum number of bridges that can be placed on a pillar. Bridges hold support point pinheads and connect to pillars as small branches."
msgstr "Maximální poÄet mostů, které mohou být umístÄ›ny na podpÄ›rný sloup. Mosty drží hroty podpÄ›r a pÅ™ipojují se ke sloupům jako malé vÄ›tve."
-#: src/libslic3r/PrintConfig.cpp:598
+#: src/libslic3r/PrintConfig.cpp:634
msgid "Maximum volumetric speed allowed for this filament. Limits the maximum volumetric speed of a print to the minimum of print and filament volumetric speed. Set to zero for no limit."
msgstr "Maximální povolený objem průtoku pro tento filament. Omezuje maximální rychlost průtoku pro tisk až na minimální rychlost průtoku pro tisk a filament. Zadejte nulu pro nastavení bez omezení."
-#: src/libslic3r/PrintConfig.cpp:3442
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1868
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1876
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2569 src/libslic3r/PrintConfig.cpp:3641
msgid "Merge"
msgstr "SlouÄit"
-#: src/libslic3r/PrintConfig.cpp:2683
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2660
+msgid "Merge all parts to the one single object"
+msgstr "SlouÄit vÅ¡echny Äásti do jednoho jediného objektu"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1868
+msgid "Merge objects to the one multipart object"
+msgstr "SlouÄit objekty do jednoho vícedílného objektu"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1876
+msgid "Merge objects to the one single object"
+msgstr "SlouÄit objekty do jednoho jediného objektu"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2576
+msgid "Merged"
+msgstr "SlouÄení"
+
+#: src/libslic3r/PrintConfig.cpp:2847
msgid "Merging bridges or pillars into another pillars can increase the radius. Zero means no increase, one means full increase."
msgstr "SlouÄení mostů nebo podpÄ›r do jiných podpÄ›r může zvýšit polomÄ›r. Hodnota 0 znamená žádné zvýšení, hodnota 1 znamená maximální zvýšení."
-#: src/libslic3r/SLAPrintSteps.cpp:64
+#: src/libslic3r/SLAPrintSteps.cpp:65
msgid "Merging slices and calculating statistics"
msgstr "SluÄování tiskových vrstev a výpoÄet statistik"
@@ -4378,15 +5169,15 @@ msgstr "SluÄování tiskových vrstev a výpoÄet statistik"
msgid "Mesh repair failed."
msgstr "Oprava meshe selhala."
-#: src/slic3r/GUI/DoubleSlider.cpp:1635
+#: src/slic3r/GUI/DoubleSlider.cpp:1831
msgid "Message for pause print on current layer (%1% mm)."
msgstr "Zpráva při pozastavení tisku na aktuální vrstvě ve výšce (%1% mm)."
-#: src/libslic3r/PrintConfig.cpp:1280 src/libslic3r/PrintConfig.cpp:1289
+#: src/libslic3r/PrintConfig.cpp:1388 src/libslic3r/PrintConfig.cpp:1397
msgid "Min"
msgstr "Minimum"
-#: src/libslic3r/PrintConfig.cpp:1298
+#: src/libslic3r/PrintConfig.cpp:1406
msgid "Min print speed"
msgstr "Minimální rychlost tisku"
@@ -4394,232 +5185,241 @@ msgstr "Minimální rychlost tisku"
msgid "min PrusaSlicer version"
msgstr "min PrusaSlicer verze"
-#: src/libslic3r/PrintConfig.cpp:2772
+#: src/libslic3r/PrintConfig.cpp:2936
msgid "Minimal distance of the support points"
msgstr "Minimální vzdálenost podpěrných bodů"
-#: src/libslic3r/PrintConfig.cpp:1306
+#: src/libslic3r/PrintConfig.cpp:1414
msgid "Minimal filament extrusion length"
msgstr "Minimální délka extruze filamentu"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53
msgid "Minimal points distance"
msgstr "Minimální vzdálenost bodů"
-#: src/libslic3r/PrintConfig.cpp:667
+#: src/libslic3r/PrintConfig.cpp:703
msgid "Minimal purge on wipe tower"
msgstr "Minimální vytlaÄený objem na Äistící věži"
-#: src/libslic3r/PrintConfig.cpp:187
+#: src/libslic3r/PrintConfig.cpp:221
msgid "Minimum bottom shell thickness"
msgstr "Minimální tloušťka spodní skořepiny"
-#: src/slic3r/GUI/PresetHints.cpp:339
+#: src/slic3r/GUI/PresetHints.cpp:337
msgid "Minimum bottom shell thickness is %1% mm."
msgstr "Minimální tloušťka spodní skořepiny je %1% mm."
-#: src/libslic3r/PrintConfig.cpp:1512
+#: src/libslic3r/PrintConfig.cpp:1620
msgid "Minimum detail resolution, used to simplify the input file for speeding up the slicing job and reducing memory usage. High-resolution models often carry more detail than printers can render. Set to zero to disable any simplification and use full resolution from input."
msgstr "Minimální rozliÅ¡ení detailů, které se používají pro zjednoduÅ¡ení vstupního souboru pro urychlení slicovací úlohy a snížení využití pamÄ›ti. Modely s vysokým rozliÅ¡ením Äasto obsahují více detailů než tiskárny dokážou vykreslit. Nastavte na nulu, chcete-li zakázat jakékoli zjednoduÅ¡ení a použít vstup v plném rozliÅ¡ení."
-#: src/libslic3r/PrintConfig.cpp:2525 src/libslic3r/PrintConfig.cpp:2526
+#: src/libslic3r/PrintConfig.cpp:2668 src/libslic3r/PrintConfig.cpp:2669
msgid "Minimum exposure time"
msgstr "Minimální doba osvitu"
-#: src/libslic3r/PrintConfig.cpp:1178
+#: src/libslic3r/PrintConfig.cpp:1286
msgid "Minimum feedrate when extruding"
msgstr "Minimální rychlosti posuvu během extruze"
-#: src/libslic3r/PrintConfig.cpp:1180
+#: src/libslic3r/PrintConfig.cpp:1288
msgid "Minimum feedrate when extruding (M205 S)"
msgstr "Minimální rychlosti posuvu během extruze (M205 S)"
-#: src/slic3r/GUI/Tab.cpp:2234
+#: src/slic3r/GUI/Tab.cpp:2403
msgid "Minimum feedrates"
msgstr "Minimální rychlosti posuvu"
-#: src/libslic3r/PrintConfig.cpp:2548 src/libslic3r/PrintConfig.cpp:2549
+#: src/libslic3r/PrintConfig.cpp:2691 src/libslic3r/PrintConfig.cpp:2692
msgid "Minimum initial exposure time"
msgstr "Minimální doba poÄáteÄního osvitu"
-#: src/slic3r/GUI/Tab.cpp:1069
+#: src/slic3r/GUI/Tab.cpp:1391
msgid "Minimum shell thickness"
msgstr "Minimální tloušťka skořepiny"
-#: src/libslic3r/PrintConfig.cpp:1787 src/libslic3r/PrintConfig.cpp:1788
+#: src/libslic3r/PrintConfig.cpp:1902 src/libslic3r/PrintConfig.cpp:1903
msgid "Minimum thickness of a top / bottom shell"
msgstr "Minimální tloušťka vrchní / spodní skořepiny"
-#: src/libslic3r/PrintConfig.cpp:2146
+#: src/libslic3r/PrintConfig.cpp:2289
msgid "Minimum top shell thickness"
msgstr "Minimální tloušťka vrchní skořepiny"
-#: src/slic3r/GUI/PresetHints.cpp:320
+#: src/slic3r/GUI/PresetHints.cpp:318
msgid "Minimum top shell thickness is %1% mm."
msgstr "Minimální tloušťka vrchní skořepiny je %1% mm."
-#: src/libslic3r/PrintConfig.cpp:1522
+#: src/libslic3r/PrintConfig.cpp:1630
msgid "Minimum travel after retraction"
msgstr "Minimální dráha extruderu po retrakci"
-#: src/libslic3r/PrintConfig.cpp:1188
+#: src/libslic3r/PrintConfig.cpp:1296
msgid "Minimum travel feedrate"
msgstr "Minimální rychlost při přesunu"
-#: src/libslic3r/PrintConfig.cpp:1190
+#: src/libslic3r/PrintConfig.cpp:1298
msgid "Minimum travel feedrate (M205 T)"
msgstr "Minimální rychlost při přesunu (M205 T)"
-#: src/libslic3r/PrintConfig.cpp:2917
+#: src/libslic3r/PrintConfig.cpp:3081
msgid "Minimum wall thickness of a hollowed model."
msgstr "Minimální tloušťka stěny dutého modelu."
-#: src/libslic3r/PrintConfig.cpp:2449
+#: src/libslic3r/PrintConfig.cpp:2592
msgid "Minimum width of features to maintain when doing elephant foot compensation."
msgstr "Minimální šířka prvků, které je třeba zachovat při provádění kompenzace rozplácnutí první vrstvy."
-#: src/slic3r/GUI/Plater.cpp:4002
+#: src/slic3r/GUI/Plater.cpp:3922
msgid "Mirror"
msgstr "Zrcadlit"
-#: src/libslic3r/PrintConfig.cpp:2379
+#: src/libslic3r/PrintConfig.cpp:2522
msgid "Mirror horizontally"
msgstr "Zrcadlit horizontálně"
-#: src/slic3r/GUI/GLCanvas3D.cpp:2053
+#: src/slic3r/GUI/GLCanvas3D.cpp:2226
msgid "Mirror Object"
msgstr "Zrcadlit Objekt"
-#: src/slic3r/GUI/Plater.cpp:4002
+#: src/slic3r/GUI/Plater.cpp:3922
msgid "Mirror the selected object"
msgstr "Zrcadlit vybraný objekt"
-#: src/slic3r/GUI/Plater.cpp:3995
+#: src/slic3r/GUI/Plater.cpp:3915
msgid "Mirror the selected object along the X axis"
msgstr "Zrcadlit rozměr vybraného objektu podél osy X"
-#: src/slic3r/GUI/Plater.cpp:3997
+#: src/slic3r/GUI/Plater.cpp:3917
msgid "Mirror the selected object along the Y axis"
msgstr "Zrcadlit rozměr vybraného objektu podél osy Y"
-#: src/slic3r/GUI/Plater.cpp:3999
+#: src/slic3r/GUI/Plater.cpp:3919
msgid "Mirror the selected object along the Z axis"
msgstr "Zrcadlit rozměr vybraného objektu podél osy Z"
-#: src/libslic3r/PrintConfig.cpp:2386
+#: src/libslic3r/PrintConfig.cpp:2529
msgid "Mirror vertically"
msgstr "Zrcadlit vertikálně"
-#: src/slic3r/Utils/AstroBox.cpp:68 src/slic3r/Utils/OctoPrint.cpp:68
-#, c-format
+#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:68
+#, possible-c-format
msgid "Mismatched type of print host: %s"
msgstr "Nesprávný typ tiskového serveru: % s"
-#: src/libslic3r/ExtrusionEntity.cpp:323
+#: src/libslic3r/ExtrusionEntity.cpp:328 src/libslic3r/ExtrusionEntity.cpp:364
msgid "Mixed"
msgstr "Smíšený"
-#: src/libslic3r/PrintConfig.cpp:2491
+#: src/libslic3r/PrintConfig.cpp:2634
msgid "ml"
msgstr "ml"
-#: src/slic3r/GUI/BedShapeDialog.cpp:92 src/slic3r/GUI/ConfigWizard.cpp:218
-#: src/slic3r/GUI/ConfigWizard.cpp:970 src/slic3r/GUI/ConfigWizard.cpp:984
+#: src/slic3r/GUI/BedShapeDialog.cpp:129 src/slic3r/GUI/ConfigWizard.cpp:236
+#: src/slic3r/GUI/ConfigWizard.cpp:1336 src/slic3r/GUI/ConfigWizard.cpp:1350
#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:87
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:135
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:333
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:94
+#: src/slic3r/GUI/GCodeViewer.cpp:2183 src/slic3r/GUI/GCodeViewer.cpp:2189
+#: src/slic3r/GUI/GCodeViewer.cpp:2197 src/slic3r/GUI/GUI_ObjectLayers.cpp:145
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:96
#: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:75
-#: src/libslic3r/PrintConfig.cpp:82 src/libslic3r/PrintConfig.cpp:91
-#: src/libslic3r/PrintConfig.cpp:122 src/libslic3r/PrintConfig.cpp:188
-#: src/libslic3r/PrintConfig.cpp:246 src/libslic3r/PrintConfig.cpp:321
-#: src/libslic3r/PrintConfig.cpp:329 src/libslic3r/PrintConfig.cpp:379
-#: src/libslic3r/PrintConfig.cpp:505 src/libslic3r/PrintConfig.cpp:516
-#: src/libslic3r/PrintConfig.cpp:534 src/libslic3r/PrintConfig.cpp:712
-#: src/libslic3r/PrintConfig.cpp:1231 src/libslic3r/PrintConfig.cpp:1292
-#: src/libslic3r/PrintConfig.cpp:1310 src/libslic3r/PrintConfig.cpp:1328
-#: src/libslic3r/PrintConfig.cpp:1384 src/libslic3r/PrintConfig.cpp:1394
-#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1524
-#: src/libslic3r/PrintConfig.cpp:1565 src/libslic3r/PrintConfig.cpp:1573
-#: src/libslic3r/PrintConfig.cpp:1583 src/libslic3r/PrintConfig.cpp:1591
-#: src/libslic3r/PrintConfig.cpp:1599 src/libslic3r/PrintConfig.cpp:1682
-#: src/libslic3r/PrintConfig.cpp:1914 src/libslic3r/PrintConfig.cpp:1985
-#: src/libslic3r/PrintConfig.cpp:2019 src/libslic3r/PrintConfig.cpp:2147
-#: src/libslic3r/PrintConfig.cpp:2226 src/libslic3r/PrintConfig.cpp:2233
-#: src/libslic3r/PrintConfig.cpp:2240 src/libslic3r/PrintConfig.cpp:2270
-#: src/libslic3r/PrintConfig.cpp:2280 src/libslic3r/PrintConfig.cpp:2290
-#: src/libslic3r/PrintConfig.cpp:2450 src/libslic3r/PrintConfig.cpp:2484
-#: src/libslic3r/PrintConfig.cpp:2623 src/libslic3r/PrintConfig.cpp:2632
-#: src/libslic3r/PrintConfig.cpp:2641 src/libslic3r/PrintConfig.cpp:2651
-#: src/libslic3r/PrintConfig.cpp:2695 src/libslic3r/PrintConfig.cpp:2705
-#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2737
-#: src/libslic3r/PrintConfig.cpp:2747 src/libslic3r/PrintConfig.cpp:2757
-#: src/libslic3r/PrintConfig.cpp:2775 src/libslic3r/PrintConfig.cpp:2790
-#: src/libslic3r/PrintConfig.cpp:2804 src/libslic3r/PrintConfig.cpp:2815
-#: src/libslic3r/PrintConfig.cpp:2828 src/libslic3r/PrintConfig.cpp:2873
-#: src/libslic3r/PrintConfig.cpp:2883 src/libslic3r/PrintConfig.cpp:2892
-#: src/libslic3r/PrintConfig.cpp:2902 src/libslic3r/PrintConfig.cpp:2918
-#: src/libslic3r/PrintConfig.cpp:2942
+#: src/libslic3r/PrintConfig.cpp:82 src/libslic3r/PrintConfig.cpp:93
+#: src/libslic3r/PrintConfig.cpp:124 src/libslic3r/PrintConfig.cpp:222
+#: src/libslic3r/PrintConfig.cpp:280 src/libslic3r/PrintConfig.cpp:355
+#: src/libslic3r/PrintConfig.cpp:363 src/libslic3r/PrintConfig.cpp:413
+#: src/libslic3r/PrintConfig.cpp:541 src/libslic3r/PrintConfig.cpp:552
+#: src/libslic3r/PrintConfig.cpp:570 src/libslic3r/PrintConfig.cpp:748
+#: src/libslic3r/PrintConfig.cpp:1158 src/libslic3r/PrintConfig.cpp:1339
+#: src/libslic3r/PrintConfig.cpp:1400 src/libslic3r/PrintConfig.cpp:1418
+#: src/libslic3r/PrintConfig.cpp:1436 src/libslic3r/PrintConfig.cpp:1492
+#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1624
+#: src/libslic3r/PrintConfig.cpp:1632 src/libslic3r/PrintConfig.cpp:1673
+#: src/libslic3r/PrintConfig.cpp:1681 src/libslic3r/PrintConfig.cpp:1691
+#: src/libslic3r/PrintConfig.cpp:1699 src/libslic3r/PrintConfig.cpp:1707
+#: src/libslic3r/PrintConfig.cpp:1790 src/libslic3r/PrintConfig.cpp:2056
+#: src/libslic3r/PrintConfig.cpp:2127 src/libslic3r/PrintConfig.cpp:2161
+#: src/libslic3r/PrintConfig.cpp:2290 src/libslic3r/PrintConfig.cpp:2369
+#: src/libslic3r/PrintConfig.cpp:2376 src/libslic3r/PrintConfig.cpp:2383
+#: src/libslic3r/PrintConfig.cpp:2413 src/libslic3r/PrintConfig.cpp:2423
+#: src/libslic3r/PrintConfig.cpp:2433 src/libslic3r/PrintConfig.cpp:2593
+#: src/libslic3r/PrintConfig.cpp:2627 src/libslic3r/PrintConfig.cpp:2766
+#: src/libslic3r/PrintConfig.cpp:2775 src/libslic3r/PrintConfig.cpp:2784
+#: src/libslic3r/PrintConfig.cpp:2794 src/libslic3r/PrintConfig.cpp:2859
+#: src/libslic3r/PrintConfig.cpp:2869 src/libslic3r/PrintConfig.cpp:2881
+#: src/libslic3r/PrintConfig.cpp:2901 src/libslic3r/PrintConfig.cpp:2911
+#: src/libslic3r/PrintConfig.cpp:2921 src/libslic3r/PrintConfig.cpp:2939
+#: src/libslic3r/PrintConfig.cpp:2954 src/libslic3r/PrintConfig.cpp:2968
+#: src/libslic3r/PrintConfig.cpp:2979 src/libslic3r/PrintConfig.cpp:2992
+#: src/libslic3r/PrintConfig.cpp:3037 src/libslic3r/PrintConfig.cpp:3047
+#: src/libslic3r/PrintConfig.cpp:3056 src/libslic3r/PrintConfig.cpp:3066
+#: src/libslic3r/PrintConfig.cpp:3082 src/libslic3r/PrintConfig.cpp:3106
msgid "mm"
msgstr "mm"
-#: src/libslic3r/PrintConfig.cpp:1547 src/libslic3r/PrintConfig.cpp:1556
+#: src/libslic3r/PrintConfig.cpp:1655 src/libslic3r/PrintConfig.cpp:1664
msgid "mm (zero to disable)"
msgstr "mm (nula pro vypnutí)"
-#: src/libslic3r/PrintConfig.cpp:451 src/libslic3r/PrintConfig.cpp:560
-#: src/libslic3r/PrintConfig.cpp:882 src/libslic3r/PrintConfig.cpp:895
-#: src/libslic3r/PrintConfig.cpp:1015 src/libslic3r/PrintConfig.cpp:1041
-#: src/libslic3r/PrintConfig.cpp:1423 src/libslic3r/PrintConfig.cpp:1761
-#: src/libslic3r/PrintConfig.cpp:1883 src/libslic3r/PrintConfig.cpp:1951
-#: src/libslic3r/PrintConfig.cpp:2111
+#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:596
+#: src/libslic3r/PrintConfig.cpp:924 src/libslic3r/PrintConfig.cpp:937
+#: src/libslic3r/PrintConfig.cpp:1059 src/libslic3r/PrintConfig.cpp:1085
+#: src/libslic3r/PrintConfig.cpp:1531 src/libslic3r/PrintConfig.cpp:1876
+#: src/libslic3r/PrintConfig.cpp:2025 src/libslic3r/PrintConfig.cpp:2093
+#: src/libslic3r/PrintConfig.cpp:2254
msgid "mm or %"
msgstr "mm nebo %"
-#: src/libslic3r/PrintConfig.cpp:237 src/libslic3r/PrintConfig.cpp:609
-#: src/libslic3r/PrintConfig.cpp:617 src/libslic3r/PrintConfig.cpp:626
-#: src/libslic3r/PrintConfig.cpp:634 src/libslic3r/PrintConfig.cpp:661
-#: src/libslic3r/PrintConfig.cpp:680 src/libslic3r/PrintConfig.cpp:922
-#: src/libslic3r/PrintConfig.cpp:1050 src/libslic3r/PrintConfig.cpp:1135
-#: src/libslic3r/PrintConfig.cpp:1169 src/libslic3r/PrintConfig.cpp:1181
-#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:1241
-#: src/libslic3r/PrintConfig.cpp:1300 src/libslic3r/PrintConfig.cpp:1433
-#: src/libslic3r/PrintConfig.cpp:1607 src/libslic3r/PrintConfig.cpp:1616
-#: src/libslic3r/PrintConfig.cpp:2028 src/libslic3r/PrintConfig.cpp:2154
+#: src/libslic3r/PrintConfig.cpp:193
+msgid "mm or % (zero to disable)"
+msgstr "mm nebo % (nula pro deaktivaci)"
+
+#: src/libslic3r/PrintConfig.cpp:271 src/libslic3r/PrintConfig.cpp:645
+#: src/libslic3r/PrintConfig.cpp:653 src/libslic3r/PrintConfig.cpp:662
+#: src/libslic3r/PrintConfig.cpp:670 src/libslic3r/PrintConfig.cpp:697
+#: src/libslic3r/PrintConfig.cpp:716 src/libslic3r/PrintConfig.cpp:966
+#: src/libslic3r/PrintConfig.cpp:1094 src/libslic3r/PrintConfig.cpp:1167
+#: src/libslic3r/PrintConfig.cpp:1243 src/libslic3r/PrintConfig.cpp:1277
+#: src/libslic3r/PrintConfig.cpp:1289 src/libslic3r/PrintConfig.cpp:1299
+#: src/libslic3r/PrintConfig.cpp:1349 src/libslic3r/PrintConfig.cpp:1408
+#: src/libslic3r/PrintConfig.cpp:1541 src/libslic3r/PrintConfig.cpp:1715
+#: src/libslic3r/PrintConfig.cpp:1724 src/libslic3r/PrintConfig.cpp:2170
+#: src/libslic3r/PrintConfig.cpp:2297
msgid "mm/s"
msgstr "mm/s"
-#: src/libslic3r/PrintConfig.cpp:462 src/libslic3r/PrintConfig.cpp:904
-#: src/libslic3r/PrintConfig.cpp:1720 src/libslic3r/PrintConfig.cpp:1772
-#: src/libslic3r/PrintConfig.cpp:1995 src/libslic3r/PrintConfig.cpp:2124
+#: src/libslic3r/PrintConfig.cpp:498 src/libslic3r/PrintConfig.cpp:946
+#: src/libslic3r/PrintConfig.cpp:1835 src/libslic3r/PrintConfig.cpp:1887
+#: src/libslic3r/PrintConfig.cpp:2137 src/libslic3r/PrintConfig.cpp:2267
msgid "mm/s or %"
msgstr "mm/s nebo %"
-#: src/libslic3r/PrintConfig.cpp:196 src/libslic3r/PrintConfig.cpp:339
-#: src/libslic3r/PrintConfig.cpp:862 src/libslic3r/PrintConfig.cpp:984
-#: src/libslic3r/PrintConfig.cpp:1152 src/libslic3r/PrintConfig.cpp:1201
-#: src/libslic3r/PrintConfig.cpp:1211 src/libslic3r/PrintConfig.cpp:1403
+#: src/libslic3r/PrintConfig.cpp:230 src/libslic3r/PrintConfig.cpp:373
+#: src/libslic3r/PrintConfig.cpp:902 src/libslic3r/PrintConfig.cpp:1028
+#: src/libslic3r/PrintConfig.cpp:1260 src/libslic3r/PrintConfig.cpp:1309
+#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1511
msgid "mm/s²"
msgstr "mm/s²"
-#: src/libslic3r/PrintConfig.cpp:1730
+#: src/libslic3r/PrintConfig.cpp:1845
msgid "mm²"
msgstr "mm²"
-#: src/libslic3r/PrintConfig.cpp:672
+#: src/libslic3r/PrintConfig.cpp:708
msgid "mm³"
msgstr "mm³"
-#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:601
-#: src/libslic3r/PrintConfig.cpp:1250
+#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:637
+#: src/libslic3r/PrintConfig.cpp:1358
msgid "mm³/s"
msgstr "mm³/s"
-#: src/libslic3r/PrintConfig.cpp:1262 src/libslic3r/PrintConfig.cpp:1273
+#: src/libslic3r/PrintConfig.cpp:1370 src/libslic3r/PrintConfig.cpp:1381
msgid "mm³/s²"
msgstr "mm³/s²"
-#: src/slic3r/GUI/GUI_App.cpp:820
+#: src/slic3r/GUI/GUI_App.cpp:1512
msgid "Mode"
msgstr "Reži&m"
@@ -4627,7 +5427,7 @@ msgstr "Reži&m"
msgid "model"
msgstr "model"
-#: src/slic3r/GUI/BedShapeDialog.cpp:251
+#: src/slic3r/GUI/BedShapeDialog.cpp:395
msgid "Model"
msgstr "Model"
@@ -4656,151 +5456,192 @@ msgstr "Oprava modelu byla dokonÄena"
msgid "Model repaired successfully"
msgstr "Model byl úspěšně opraven"
-#: src/slic3r/GUI/Tab.cpp:979
+#: src/slic3r/GUI/GUI_App.cpp:1506 src/slic3r/GUI/wxExtensions.cpp:675
+msgctxt "Mode"
+msgid "Advanced"
+msgstr "PokroÄilý"
+
+#: src/slic3r/GUI/Tab.cpp:1241
msgid "Modifications to the current profile will be saved."
msgstr "Úpravy aktuálního profilu budou uloženy."
-#: src/slic3r/GUI/Preset.cpp:247
+#: src/slic3r/GUI/GUI_App.cpp:1425
msgid "modified"
msgstr "upraveno"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
msgid "Modifier"
msgstr "Modifikátor"
-#: src/slic3r/GUI/Tab.cpp:1161
+#: src/slic3r/GUI/Tab.cpp:1491
msgid "Modifiers"
msgstr "Modifikátory"
-#: src/libslic3r/PrintConfig.cpp:2512
+#: src/libslic3r/PrintConfig.cpp:2655
msgid "money/bottle"
msgstr "cena/láhev"
-#: src/libslic3r/PrintConfig.cpp:762
+#: src/libslic3r/PrintConfig.cpp:798
msgid "money/kg"
msgstr "korun/kg"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372
+#: src/libslic3r/PrintConfig.cpp:461
+msgid "Monotonic"
+msgstr "Monotónní"
+
+#: src/slic3r/GUI/NotificationManager.cpp:305
+#: src/slic3r/GUI/NotificationManager.cpp:315
+msgid "More"
+msgstr "Více"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219
msgid "Mouse wheel"
msgstr "KoleÄko myÅ¡i"
-#: src/slic3r/GUI/GLCanvas3D.cpp:261
+#: src/slic3r/GUI/GLCanvas3D.cpp:249
msgid "Mouse wheel:"
msgstr "KoleÄko myÅ¡i:"
-#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:64
msgid "Move"
msgstr "Přesunout"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:255
+msgid "Move active slider thumb Left"
+msgstr "Posunout ukazatel aktivního posuvníku vlevo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:256
+msgid "Move active slider thumb Right"
+msgstr "Posunout ukazatel aktivního posuvníku vpravo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:220
+msgid "Move active thumb Down"
+msgstr "Posunout aktivní ukazatel dolů"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:241
+msgid "Move active thumb Left"
+msgstr "Posunout aktivní ukazatel vlevo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:242
+msgid "Move active thumb Right"
+msgstr "Posunout aktivní ukazatel vpravo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+msgid "Move active thumb Up"
+msgstr "Posunout aktivní ukazatel nahoru"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219
msgid "Move clipping plane"
msgstr "Posunout řezovou rovinu"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
msgid "Move current slider thumb Down"
msgstr "Posunout aktivní posuvník dolů"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:214
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
msgid "Move current slider thumb Up"
msgstr "Posunout aktivní posuvník nahoru"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1059
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:835
msgid "Move drainage hole"
msgstr "Posun odtokového otvoru"
-#: src/slic3r/GUI/GLCanvas3D.cpp:3505
+#: src/slic3r/GUI/GLCanvas3D.cpp:3810
msgid "Move Object"
msgstr "Posunutí Objektu"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212
msgid "Move point"
msgstr "Posunout bod"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:160
msgid "Move selection 10 mm in negative X direction"
msgstr "Posun výběru o 10 mm v záporném směru osy X"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:159
msgid "Move selection 10 mm in negative Y direction"
msgstr "Posun výběru o 10 mm v záporném směru osy Y"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:161
msgid "Move selection 10 mm in positive X direction"
msgstr "Posun výběru o 10 mm v kladném směru osy X"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:158
msgid "Move selection 10 mm in positive Y direction"
msgstr "Posun výběru o 10 mm v kladném směru osy Y"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1097
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:955
msgid "Move support point"
msgstr "Posun podpěrného bodu"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
+#: src/slic3r/GUI/GCodeViewer.cpp:2492
+msgid "Movement"
+msgstr "Přejezd"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
msgid "Movement in camera space"
msgstr "Posun výběru v ortogonálním prostoru kamery"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:162
msgid "Movement step set to 1 mm"
msgstr "Krok pro posun výběru o velikosti 1 mm"
-#: src/libslic3r/PrintConfig.cpp:2201
+#: src/libslic3r/PrintConfig.cpp:2344
msgid "Multi material printers may need to prime or purge extruders on tool changes. Extrude the excess material into the wipe tower."
msgstr "Multimateriálové tiskárny mohou potÅ™ebovat, aby pÅ™i výmÄ›nÄ› nástrojů vyÄistili extrudery. VytlaÄí pÅ™ebyteÄný materiál do Äistící věže."
-#: src/slic3r/GUI/Plater.cpp:2360 src/slic3r/GUI/Plater.cpp:2413
+#: src/slic3r/GUI/Plater.cpp:2322 src/slic3r/GUI/Plater.cpp:2375
msgid "Multi-part object detected"
msgstr "Detekován objekt obsahující více Äástí"
#: src/slic3r/GUI/FirmwareDialog.cpp:419 src/slic3r/GUI/FirmwareDialog.cpp:454
-#, c-format
+#, possible-c-format
msgid "Multiple %s devices found. Please only connect one at a time for flashing."
msgstr "Bylo nalezeno více zařízení %s . Během flashování mějte připojené pouze jedno."
-#: src/slic3r/GUI/Tab.cpp:1179
+#: src/slic3r/GUI/Tab.cpp:1509
msgid "Multiple Extruders"
msgstr "Více Extruderů"
-#: src/slic3r/GUI/Plater.cpp:2410
-msgid ""
-"Multiple objects were loaded for a multi-material printer.\n"
-"Instead of considering them as multiple objects, should I consider\n"
-"these files to represent a single object having multiple parts?"
-msgstr ""
-"Bylo nahráno více objektů pro multi materiálovou tiskárnu.\n"
-"Mají být vloženy jako jeden objekt obsahující více Äástí, \n"
-"namísto vložení několika objektů?"
+#: src/slic3r/GUI/Plater.cpp:2372
+msgid "Multiple objects were loaded for a multi-material printer.\nInstead of considering them as multiple objects, should I consider\nthese files to represent a single object having multiple parts?"
+msgstr "Bylo nahráno více objektů pro multi materiálovou tiskárnu.\nMají být vloženy jako jeden objekt obsahující více Äástí, \nnamísto vložení nÄ›kolika objektů?"
-#: src/libslic3r/PrintConfig.cpp:3439
+#: src/libslic3r/PrintConfig.cpp:3638
msgid "Multiply copies by creating a grid."
msgstr "Vynásobí kopie vytvořením mřížky."
-#: src/libslic3r/PrintConfig.cpp:3434
+#: src/libslic3r/PrintConfig.cpp:3633
msgid "Multiply copies by this factor."
msgstr "Vynásobí kopie tímto Äíslem."
-#: src/slic3r/GUI/Field.cpp:150 src/slic3r/GUI/OptionsGroup.cpp:580
+#: src/slic3r/GUI/Field.cpp:198 src/slic3r/GUI/OptionsGroup.cpp:715
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:874
msgid "N/A"
msgstr "N/A"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:270
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153
+#: src/slic3r/GUI/GUI_ObjectList.cpp:284
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:161
msgid "Name"
msgstr "Název"
-#: src/libslic3r/PrintConfig.cpp:1488
+#: src/libslic3r/PrintConfig.cpp:114
+msgid "Name of the printer"
+msgstr "Název tiskárny"
+
+#: src/libslic3r/PrintConfig.cpp:1596
msgid "Name of the printer variant. For example, the printer variants may be differentiated by a nozzle diameter."
msgstr "Název varianty tiskárny. Varianty tiskárny mohou být například rozlišeny podle průměru trysky."
-#: src/libslic3r/PrintConfig.cpp:1482
+#: src/libslic3r/PrintConfig.cpp:1590
msgid "Name of the printer vendor."
msgstr "Název prodejce tiskárny."
-#: src/libslic3r/PrintConfig.cpp:1058
+#: src/libslic3r/PrintConfig.cpp:1102
msgid "Name of the profile, from which this profile inherits."
msgstr "Název profilu, ze kterého tento profil zdědí."
-#: src/libslic3r/PrintConfig.cpp:1630
+#: src/libslic3r/PrintConfig.cpp:1738
msgid "Nearest"
msgstr "Nejbližší"
@@ -4808,16 +5649,32 @@ msgstr "Nejbližší"
msgid "Network lookup"
msgstr "Hledání v síti"
-#: src/slic3r/GUI/Plater.cpp:2151
+#: src/slic3r/GUI/Preferences.cpp:430
+msgid "New layout, access via settings button in the top menu"
+msgstr "Nové rozvržení, přístup pÅ™es tlaÄítko nastavení v horním menu"
+
+#: src/slic3r/GUI/Plater.cpp:2056
msgid "New Project"
msgstr "Nový Projekt"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:112
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:105
msgid "New project, clear plater"
msgstr "Nový projekt, odstranit modely na podložce"
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:609
+msgid "New Value"
+msgstr "Nová hodnota"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1178
+msgid "New value"
+msgstr "Nová hodnota"
+
+#: src/slic3r/GUI/NotificationManager.hpp:322
+msgid "New version is available."
+msgstr "K dispozici je nová verze."
+
#: src/slic3r/GUI/UpdateDialogs.cpp:38
-#, c-format
+#, possible-c-format
msgid "New version of %s is available"
msgstr "Je dostupná nová verze %s"
@@ -4825,23 +5682,23 @@ msgstr "Je dostupná nová verze %s"
msgid "New version:"
msgstr "Nová verze:"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4673
+#: src/slic3r/GUI/GLCanvas3D.cpp:5089
msgid "Next Redo action: %1%"
msgstr "Akce vpřed: %1%"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4641
+#: src/slic3r/GUI/GLCanvas3D.cpp:5051
msgid "Next Undo action: %1%"
msgstr "Akce zpět: %1%"
-#: src/libslic3r/PrintConfig.cpp:960
+#: src/libslic3r/PrintConfig.cpp:1004
msgid "No extrusion"
msgstr "Žádná extruze"
-#: src/libslic3r/SLAPrintSteps.cpp:453
+#: src/libslic3r/SLAPrintSteps.cpp:451
msgid "No pad can be generated for this model with the current configuration"
msgstr "Pro aktuální model nelze vygenerovat žádnou podložku"
-#: src/slic3r/GUI/MainFrame.cpp:784
+#: src/slic3r/GUI/MainFrame.cpp:1485
msgid "No previously sliced file."
msgstr "Žádné dříve slicované soubory."
@@ -4849,175 +5706,215 @@ msgstr "Žádné dříve slicované soubory."
msgid "NO RAMMING AT ALL"
msgstr "ŽÃDNà RAPIDNà EXTRUZE"
-#: src/libslic3r/PrintConfig.cpp:1857
+#: src/libslic3r/PrintConfig.cpp:1999
msgid "No sparse layers (EXPERIMENTAL)"
msgstr "Bez řídkých vrstev (EXPERIMENTÃLNÃ)"
-#: src/libslic3r/PrintConfig.cpp:2774
+#: src/libslic3r/PrintConfig.cpp:2938
msgid "No support points will be placed closer than this threshold."
msgstr "Žádné podpůrné body nebudou umístěny blíže než je tento práh."
-#: src/slic3r/GUI/UpdateDialogs.cpp:303
+#: src/slic3r/GUI/UpdateDialogs.cpp:304
msgid "No updates available"
msgstr "Žádné aktualizace nejsou dostupné"
-#: src/slic3r/GUI/ConfigWizard.cpp:291 src/slic3r/GUI/ConfigWizard.cpp:574
-#: src/slic3r/GUI/Plater.cpp:499 src/slic3r/GUI/Plater.cpp:639
-#: src/libslic3r/ExtrusionEntity.cpp:309
+#: src/slic3r/GUI/ConfigWizard.cpp:309 src/slic3r/GUI/ConfigWizard.cpp:599
+#: src/slic3r/GUI/Plater.cpp:365 src/slic3r/GUI/Plater.cpp:505
+#: src/libslic3r/ExtrusionEntity.cpp:312
msgid "None"
msgstr "Žádné"
-#: src/slic3r/GUI/Tab.cpp:2203
+#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2372
msgid "Normal"
msgstr "Normální"
-#: src/slic3r/GUI/Plater.cpp:1286
+#: src/slic3r/GUI/Plater.cpp:1177 src/slic3r/GUI/Plater.cpp:1224
msgid "normal mode"
msgstr "normální režim"
-#: src/libslic3r/Zipper.cpp:46
+#: src/slic3r/GUI/GCodeViewer.cpp:2552
+msgid "Normal mode"
+msgstr "Normální režim"
+
+#: src/libslic3r/miniz_extension.cpp:105
msgid "not a ZIP archive"
msgstr "není ZIP archiv"
-#: src/slic3r/GUI/BedShapeDialog.cpp:223 src/slic3r/GUI/BedShapeDialog.cpp:302
+#: src/slic3r/GUI/BedShapeDialog.cpp:366 src/slic3r/GUI/BedShapeDialog.cpp:446
msgid "Not found:"
msgstr "Nenalezeno:"
-#: src/slic3r/GUI/DoubleSlider.cpp:1019
+#: src/slic3r/GUI/DoubleSlider.cpp:1144
msgid "Note"
msgstr "Poznámka"
-#: src/slic3r/Utils/AstroBox.cpp:89
+#: src/slic3r/GUI/Tab.cpp:3408
+msgid "Note, that selected preset will be deleted from this/those printer(s) too."
+msgstr "Upozorňujeme, že vybrané přednastavené bude odstraněno také z těchto tiskáren."
+
+#: src/slic3r/GUI/Tab.cpp:3416
+msgid "Note, that this/those printer(s) will be deleted after deleting of the selected preset."
+msgstr "Upozorňujeme, že tato/tyto tiskárny budou odstraněny po odstranění vybraného přednastavení."
+
+#: src/slic3r/GUI/Tab.cpp:2039
+msgid "Note: All parameters from this group are moved to the Physical Printer settings (see changelog).\n\nA new Physical Printer profile is created by clicking on the \"cog\" icon right of the Printer profiles combo box, by selecting the \"Add physical printer\" item in the Printer combo box. The Physical Printer profile editor opens also when clicking on the \"cog\" icon in the Printer settings tab. The Physical Printer profiles are being stored into PrusaSlicer/physical_printer directory."
+msgstr "Poznámka: VÅ¡echna nastavení z této sekce jsou pÅ™esunuta do nastavení Fyzické tiskárny (viz changelog).\n\nNový profil Fyzické tiskárny lze vytvoÅ™it kliknutím na ikonu „ozubeného koleÄka“ vpravo od pole se seznamem profilů tiskáren a výbÄ›rem položky „PÅ™idat fyzickou tiskárnu“. Editor fyzické tiskárny se otevÅ™e po kliknutí na ikonu „ozubeného koleÄka“ na kartÄ› Nastavení tiskárny. Profily fyzických tiskáren se ukládají do adresáře PrusaSlicer/physical_printer directory."
+
+#: src/slic3r/Utils/AstroBox.cpp:92
msgid "Note: AstroBox version at least 1.1.0 is required."
msgstr "Poznámka: Je vyžadována verze AstroBoxu nejméně 1.1.0."
-#: src/slic3r/Utils/FlashAir.cpp:73
+#: src/slic3r/Utils/FlashAir.cpp:76
msgid "Note: FlashAir with firmware 2.00.02 or newer and activated upload function is required."
msgstr "Poznámka: Vyžaduje se FlashAir s firmwarem 2.00.02 nebo novějším a aktivovanou funkcí nahrávání."
-#: src/slic3r/Utils/OctoPrint.cpp:89
+#: src/slic3r/Utils/OctoPrint.cpp:91
msgid "Note: OctoPrint version at least 1.1.0 is required."
msgstr "Poznámka: Je vyžadován OctoPrint ve verzi alespoň 1.1.0."
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1345
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1192
msgid "Note: some shortcuts work in (non)editing mode only."
msgstr "Poznámka: některé zkratky nefungují v režimu editace."
-#: src/slic3r/GUI/Tab.cpp:1251 src/slic3r/GUI/Tab.cpp:1252
-#: src/slic3r/GUI/Tab.cpp:1540 src/slic3r/GUI/Tab.cpp:1541
-#: src/slic3r/GUI/Tab.cpp:2012 src/slic3r/GUI/Tab.cpp:2013
-#: src/slic3r/GUI/Tab.cpp:2128 src/slic3r/GUI/Tab.cpp:2129
-#: src/slic3r/GUI/Tab.cpp:3535 src/slic3r/GUI/Tab.cpp:3536
+#: src/slic3r/GUI/SavePresetDialog.cpp:151
+msgid "Note: This preset will be replaced after saving"
+msgstr "Upozornění: Taoto přednastavení bude po uložení nahrazeno"
+
+#: src/slic3r/GUI/Tab.cpp:1581 src/slic3r/GUI/Tab.cpp:1582
+#: src/slic3r/GUI/Tab.cpp:1887 src/slic3r/GUI/Tab.cpp:1888
+#: src/slic3r/GUI/Tab.cpp:2221 src/slic3r/GUI/Tab.cpp:2222
+#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/Tab.cpp:2298
+#: src/slic3r/GUI/Tab.cpp:3951 src/slic3r/GUI/Tab.cpp:3952
msgid "Notes"
msgstr "Poznámky"
-#: src/slic3r/GUI/ConfigWizard.cpp:1751 src/slic3r/GUI/DoubleSlider.cpp:1905
-#: src/slic3r/GUI/DoubleSlider.cpp:1926 src/slic3r/GUI/GUI.cpp:245
+#: src/slic3r/GUI/ConfigWizard.cpp:2237 src/slic3r/GUI/DoubleSlider.cpp:2124
+#: src/slic3r/GUI/DoubleSlider.cpp:2144 src/slic3r/GUI/GUI.cpp:244
msgid "Notice"
msgstr "Oznámení"
-#: src/slic3r/GUI/ConfigWizard.cpp:218
+#: src/slic3r/GUI/ConfigWizard.cpp:236
msgid "nozzle"
msgstr "tryska"
-#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2340
-#: src/libslic3r/PrintConfig.cpp:1326
+#: src/slic3r/GUI/Tab.cpp:1790
+msgid "Nozzle"
+msgstr "Tryska"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1392
+msgid "Nozzle and Bed Temperatures"
+msgstr "Teplota trysky a tiskové podložky"
+
+#: src/slic3r/GUI/Tab.cpp:2104 src/slic3r/GUI/Tab.cpp:2509
+#: src/libslic3r/PrintConfig.cpp:1434
msgid "Nozzle diameter"
msgstr "Průměr trysky"
-#: src/slic3r/GUI/ConfigWizard.cpp:969
+#: src/slic3r/GUI/ConfigWizard.cpp:1335
msgid "Nozzle Diameter:"
msgstr "Průměr trysky:"
-#: src/libslic3r/PrintConfig.cpp:650
+#: src/libslic3r/PrintConfig.cpp:2201
+msgid "Nozzle temperature"
+msgstr "Teplota trysky"
+
+#: src/libslic3r/PrintConfig.cpp:2198
+msgid "Nozzle temperature for layers after the first one. Set this to zero to disable temperature control commands in the output G-code."
+msgstr "Teplota trysky od druhé vrstvy dále. Nastavte tuto hodnotu na nulu, abyste zakázali příkazy pro řízení teploty ve výstupním G-codu."
+
+#: src/libslic3r/PrintConfig.cpp:961
+msgid "Nozzle temperature for the first layer. If you want to control temperature manually during print, set this to zero to disable temperature control commands in the output G-code."
+msgstr "Teplota trysky pro první vrstvu. Chcete-li bÄ›hem tisku ruÄnÄ› ovládat teplotu, nastavte tuto hodnotu na nulu, aby se ve výstupním G-codu neobjevily příkazy pro řízení teploty."
+
+#: src/libslic3r/PrintConfig.cpp:686
msgid "Number of cooling moves"
msgstr "PoÄet chladících pohybů"
-#: src/slic3r/GUI/Tab.cpp:1839
+#: src/slic3r/GUI/Tab.cpp:2073
msgid "Number of extruders of the printer."
msgstr "PoÄet extrudérů tiskárny."
-#: src/libslic3r/PrintConfig.cpp:1975
+#: src/libslic3r/PrintConfig.cpp:2117
msgid "Number of interface layers to insert between the object(s) and support material."
msgstr "PoÄet interface vrstev vložených mezi objekt (objekty) a podpÄ›ry."
-#: src/libslic3r/PrintConfig.cpp:1697
+#: src/libslic3r/PrintConfig.cpp:1812
msgid "Number of loops for the skirt. If the Minimum Extrusion Length option is set, the number of loops might be greater than the one configured here. Set this to zero to disable skirt completely."
msgstr "PoÄet obrysových smyÄek. Je-li nastavena možnost Minimální délka extruze, poÄet obrysových smyÄek může být vÄ›tší než poÄet zde nakonfigurovaných. Nastavte tuto hodnotu na nulu, pro úplné deaktivování."
-#: src/libslic3r/PrintConfig.cpp:2365
+#: src/libslic3r/PrintConfig.cpp:2508
msgid "Number of pixels in"
msgstr "PoÄet pixelů v ose"
-#: src/libslic3r/PrintConfig.cpp:2367
+#: src/libslic3r/PrintConfig.cpp:2510
msgid "Number of pixels in X"
msgstr "PoÄet pixelů v ose X"
-#: src/libslic3r/PrintConfig.cpp:2373
+#: src/libslic3r/PrintConfig.cpp:2516
msgid "Number of pixels in Y"
msgstr "PoÄet pixelů v ose Y"
-#: src/libslic3r/PrintConfig.cpp:176
+#: src/libslic3r/PrintConfig.cpp:210
msgid "Number of solid layers to generate on bottom surfaces."
msgstr "PoÄet plných vrstev."
-#: src/libslic3r/PrintConfig.cpp:1781
+#: src/libslic3r/PrintConfig.cpp:1896
msgid "Number of solid layers to generate on top and bottom surfaces."
msgstr "PoÄet plných vrstev generovaných na vrchních a spodních površích."
-#: src/libslic3r/PrintConfig.cpp:2134
+#: src/libslic3r/PrintConfig.cpp:2277
msgid "Number of solid layers to generate on top surfaces."
msgstr "PoÄet vrchních generovaných plných vrstev."
-#: src/libslic3r/PrintConfig.cpp:2518
+#: src/libslic3r/PrintConfig.cpp:2661
msgid "Number of the layers needed for the exposure time fade from initial exposure time to the exposure time"
msgstr "PoÄet vrstev potÅ™ebných pro pÅ™echod z poÄáteÄní doby osvitu na dobu osvitu"
-#: src/slic3r/GUI/Plater.cpp:241
+#: src/slic3r/GUI/Plater.cpp:247
msgid "Number of tool changes"
msgstr "PoÄet zmÄ›n nástroje"
-#: src/libslic3r/PrintConfig.cpp:2753
+#: src/slic3r/GUI/Tab.cpp:4127 src/libslic3r/PrintConfig.cpp:2917
msgid "Object elevation"
msgstr "Nadzvednutí objektu"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2466
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2858
msgid "Object manipulation"
msgstr "Manipulace s objektem"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:638
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:163 src/libslic3r/GCode.cpp:623
msgid "Object name"
msgstr "Jméno objektu"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3417
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3880
msgid "Object or Instance"
msgstr "Objekt nebo Instanci"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1106
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1230
msgid "Object reordered"
msgstr "Zěna pořadí objektů"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2479
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2871
msgid "Object Settings to modify"
msgstr "Změna nastavení objektu"
-#: src/slic3r/GUI/Plater.cpp:2529
+#: src/slic3r/GUI/Plater.cpp:2491
msgid "Object too large?"
msgstr "Objekt moc velký?"
-#: src/libslic3r/PrintConfig.cpp:2262
+#: src/libslic3r/PrintConfig.cpp:2405
msgid "Object will be used to purge the nozzle after a toolchange to save material that would otherwise end up in the wipe tower and decrease print time. Colours of the objects will be mixed as a result."
msgstr "Objekty budou použity k vyÄiÅ¡tÄ›ní barvy filamentu v trysce po zmÄ›nÄ› extruderu, aby se uÅ¡etÅ™il materiál, který by jinak skonÄil v Äistící věži. Výsledkem budou objekty s náhodnÄ› mixovanými barvami."
-#: src/slic3r/GUI/Plater.cpp:1194
+#: src/slic3r/GUI/Plater.cpp:1103
msgid "object(s)"
msgstr "objekt(y)"
-#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245
+#: src/slic3r/GUI/Plater.cpp:1143 src/slic3r/GUI/Plater.cpp:1160
msgid "objects"
msgstr "objekty"
-#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:855
+#: src/libslic3r/PrintConfig.cpp:465 src/libslic3r/PrintConfig.cpp:893
msgid "Octagram Spiral"
msgstr "Octagram Spiral"
@@ -5025,64 +5922,113 @@ msgstr "Octagram Spiral"
msgid "OctoPrint version"
msgstr "Verze OctoPrintu"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3425
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3888
msgid "of a current Object"
msgstr "souÄasného Objektu"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42
msgid "Offset"
msgstr "Odsazení"
-#: src/slic3r/GUI/Tab.cpp:1755
-#, c-format
+#: src/slic3r/GUI/Preferences.cpp:422
+msgid "Old regular layout with the tab bar"
+msgstr "Původní rozložení s panelem karet"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:608
+msgid "Old Value"
+msgstr "Stará hodnota"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1177
+msgid "Old value"
+msgstr "Stará hodnota"
+
+#: src/slic3r/GUI/Preferences.cpp:123
+msgid "On OSX there is always only one instance of app running by default. However it is allowed to run multiple instances of same app from the command line. In such case this settings will allow only one instance."
+msgstr "Na OSX je ve výchozím nastavení vždy spuštěna pouze jedna instance aplikace. Je však povoleno spouštět více instancí stejné aplikace z příkazového řádku. V takovém případě toto nastavení povolí pouze jednu instanci."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:359
+#, possible-c-format
msgid "On this system, %s uses HTTPS certificates from the system Certificate Store or Keychain."
msgstr "V tomto systému používá %s certifikáty HTTPS ze systému Certificate Store nebo Keychain."
-#: src/slic3r/GUI/DoubleSlider.cpp:950
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
+msgid "On/Off one layer mode of the vertical slider"
+msgstr "Zapnou/vypnout režim jedné vrstvy vertikálního posuvníku"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1064
msgid "One layer mode"
msgstr "Zobrazení po jedné vrstvě"
-#: src/libslic3r/Print.cpp:1365
+#: src/libslic3r/Print.cpp:1391
msgid "One or more object were assigned an extruder that the printer does not have."
msgstr "Jeden nebo více objektů bylo přiřazeno extruderu, který tiskárna nemá."
-#: src/libslic3r/PrintConfig.cpp:1903 src/libslic3r/PrintConfig.cpp:2676
+#: src/slic3r/GUI/GUI_App.cpp:1784
+msgid "Ongoing uploads"
+msgstr "Probíhá nahrávání"
+
+#: src/libslic3r/Print.cpp:1269
+msgid "Only a single object may be printed at a time in Spiral Vase mode. Either remove all but the last object, or enable sequential mode by \"complete_objects\"."
+msgstr "V režimu spirálové vázy lze souÄasnÄ› tisknout pouze jeden objekt. BuÄ odeberte vÅ¡echny objekty kromÄ› posledního, nebo povolte sekvenÄní režim pomocí \"complete_objects\"."
+
+#: src/libslic3r/PrintConfig.cpp:2045 src/libslic3r/PrintConfig.cpp:2840
msgid "Only create support if it lies on a build plate. Don't create support on a print."
msgstr "Podpěry vytvářet pouze v případě, že leží na tiskové podložce. Nevytváří podpěry na výtisky."
-#: src/libslic3r/PrintConfig.cpp:1027
+#: src/libslic3r/PrintConfig.cpp:1071
msgid "Only infill where needed"
msgstr "Výplň pouze kde je potřeba"
-#: src/slic3r/GUI/Tab.cpp:2373
+#: src/slic3r/GUI/Tab.cpp:2542
msgid "Only lift Z"
msgstr "Pouze zvednout Z"
-#: src/libslic3r/PrintConfig.cpp:1570
+#: src/libslic3r/PrintConfig.cpp:1678
msgid "Only lift Z above"
msgstr "Zvednout Z pouze nad"
-#: src/libslic3r/PrintConfig.cpp:1579
+#: src/libslic3r/PrintConfig.cpp:1687
msgid "Only lift Z below"
msgstr "Zvednout Z pouze pod"
-#: src/libslic3r/PrintConfig.cpp:1348
+#: src/libslic3r/PrintConfig.cpp:1456
msgid "Only retract when crossing perimeters"
msgstr "Provést retrakci pouze při přejíždění perimetrů"
-#: src/slic3r/GUI/Tab.cpp:1187
+#: src/slic3r/GUI/ConfigWizard.cpp:714
+msgid "Only the following installed printers are compatible with the selected filament:"
+msgstr "S vybraným filamentem jsou kompatibilní pouze následující nainstalované tiskárny:"
+
+#: src/slic3r/GUI/Tab.cpp:1517
msgid "Ooze prevention"
msgstr "Prevence odkapávání"
-#: src/libslic3r/Print.cpp:1266
+#: src/libslic3r/Print.cpp:1292
msgid "Ooze prevention is currently not supported with the wipe tower enabled."
msgstr "V souÄasné dobÄ› není funkce \"Prevence odkapávání\" filamentu podporována spoleÄnÄ› s povolenou Äistící věží."
-#: src/slic3r/GUI/MainFrame.cpp:408
+#: src/slic3r/GUI/MainFrame.cpp:1398
+msgid "Open &PrusaSlicer"
+msgstr "Otevřít &PrusaSlicer"
+
+#: src/slic3r/GUI/MainFrame.cpp:1391
+msgid "Open a G-code file"
+msgstr "Otevřít G-code"
+
+#: src/slic3r/GUI/MainFrame.cpp:63 src/slic3r/GUI/MainFrame.cpp:77
+#: src/slic3r/GUI/MainFrame.cpp:1262
+msgid "Open a new PrusaSlicer instance"
+msgstr "Otevře novou instanci PrusaSliceru"
+
+#: src/slic3r/GUI/MainFrame.cpp:989
msgid "Open a project file"
msgstr "Otevřít soubor s projektem"
-#: src/slic3r/GUI/Tab.cpp:1729
+#: src/slic3r/GUI/Plater.cpp:1417
+msgid "Open as project"
+msgstr "Otevřít jako projekt"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:330
msgid "Open CA certificate file"
msgstr "Otevřít soubor s certifikátem CA"
@@ -5095,116 +6041,150 @@ msgstr "Otevře stránku s changelogem"
msgid "Open download page"
msgstr "Otevře stránku pro stažení programu"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:113
+#: src/slic3r/GUI/NotificationManager.cpp:742
+msgid "Open Folder."
+msgstr "Otevřít složku"
+
+#: src/slic3r/Utils/Process.cpp:151
+msgid "Open G-code file:"
+msgstr "Otevřít soubor G-code:"
+
+#: src/slic3r/GUI/MainFrame.cpp:66 src/slic3r/GUI/MainFrame.cpp:1141
+msgid "Open G-code viewer"
+msgstr "Otevřít prohlížeÄ G-codu"
+
+#: src/slic3r/GUI/MainFrame.cpp:79
+msgid "Open new G-code viewer"
+msgstr "Otevřít nový prohlížeÄ G-codu"
+
+#: src/slic3r/GUI/MainFrame.cpp:63 src/slic3r/GUI/MainFrame.cpp:1262
+msgid "Open new instance"
+msgstr "Otevřít novou instanci"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:106
msgid "Open project STL/OBJ/AMF/3MF with config, clear plater"
msgstr "Otevřít projekt STL/OBJ/AMF/3MF s konfigurací, odstranit modely na podložce"
-#: src/slic3r/GUI/MainFrame.cpp:693
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:77 src/slic3r/GUI/MainFrame.cpp:1398
+msgid "Open PrusaSlicer"
+msgstr "Otevřít PrusaSlicer"
+
+#: src/slic3r/GUI/MainFrame.cpp:918 src/slic3r/GUI/MainFrame.cpp:1317
+#, possible-c-format
msgid "Open the %s website in your browser"
msgstr "Otevřít webovou stránku %s v prohlížeÄi"
-#: src/slic3r/GUI/MainFrame.cpp:684
+#: src/slic3r/GUI/MainFrame.cpp:909 src/slic3r/GUI/MainFrame.cpp:1308
msgid "Open the Prusa3D drivers download page in your browser"
msgstr "Otevřít stránku pro stahování Prusa 3D ovladaÄů ve vaÅ¡em prohlížeÄi"
-#: src/slic3r/GUI/MainFrame.cpp:686
+#: src/slic3r/GUI/MainFrame.cpp:911 src/slic3r/GUI/MainFrame.cpp:1310
msgid "Open the software releases page in your browser"
msgstr "Otevřít stránku s verzemi tohoto softwaru ve vaÅ¡em prohlížeÄi"
-#: src/slic3r/GUI/Plater.cpp:4040
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:220 src/slic3r/GUI/Plater.cpp:3961
msgid "Optimize orientation"
msgstr "Optimalizovat orientaci"
-#: src/slic3r/GUI/Plater.cpp:2767
+#: src/slic3r/GUI/Plater.cpp:1555
msgid "Optimize Rotation"
msgstr "Optimalizovat Orientaci"
-#: src/slic3r/GUI/Plater.cpp:4040
+#: src/slic3r/GUI/Plater.cpp:3962
msgid "Optimize the rotation of the object for better print results."
msgstr "Optimalizujte rotaci objektu pro lepší výsledky tisku."
-#: src/libslic3r/PrintConfig.cpp:137
+#: src/libslic3r/PrintConfig.cpp:170
msgid "Optimize travel moves in order to minimize the crossing of perimeters. This is mostly useful with Bowden extruders which suffer from oozing. This feature slows down both the print and the G-code generation."
msgstr "Optimalizovat rychloposuny do poÅ™adí aby se minimalizovalo pÅ™ejíždÄ›ní perimetrů. Nejvíce užiteÄné u Bowdenových extruderů které trpí na vytékání filamentu. Toto nastavení zpomaluje tisk i generování G-code."
-#: src/slic3r/GUI/Tab.cpp:1131
+#: src/slic3r/GUI/GCodeViewer.cpp:2525 src/slic3r/GUI/GUI_Preview.cpp:320
+#: src/slic3r/GUI/GUI_Preview.cpp:333
+msgid "Options"
+msgstr "Volby"
+
+#: src/slic3r/GUI/Tab.cpp:1460
msgid "Options for support material and raft"
msgstr "Volby pro podpěry a raft"
-#: src/slic3r/GUI/DoubleSlider.cpp:989
+#: src/slic3r/GUI/Mouse3DController.cpp:315
+msgid "Options:"
+msgstr "Možnosti:"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1112
msgid "or press \"+\" key"
msgstr "nebo stiskněte klávesu „+“"
-#: src/slic3r/GUI/Plater.cpp:2892
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:74
msgid "Orientation found."
msgstr "Orientace nalezena."
-#: src/slic3r/GUI/Plater.cpp:2891
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:73
msgid "Orientation search canceled."
msgstr "Hledání optimální orientace zrušeno."
-#: src/slic3r/GUI/BedShapeDialog.cpp:84
+#: src/slic3r/GUI/BedShapeDialog.cpp:94
msgid "Origin"
msgstr "PoÄátek"
-#: src/slic3r/GUI/Tab.cpp:1227
+#: src/slic3r/GUI/Tab.cpp:1557
msgid "Other"
msgstr "Ostatní"
-#: src/libslic3r/PrintConfig.cpp:144 src/libslic3r/PrintConfig.cpp:2064
+#: src/libslic3r/PrintConfig.cpp:177 src/libslic3r/PrintConfig.cpp:2206
msgid "Other layers"
msgstr "Ostatní vrstvy"
-#: src/slic3r/GUI/ConfigWizard.cpp:856
+#: src/slic3r/GUI/ConfigWizard.cpp:1222
msgid "Other Vendors"
msgstr "Ostatní výrobci"
-#: src/slic3r/GUI/Tab.cpp:1238 src/slic3r/GUI/Tab.cpp:3666
+#: src/slic3r/GUI/Tab.cpp:1568 src/slic3r/GUI/Tab.cpp:4085
msgid "Output file"
msgstr "Výstupní soubor"
-#: src/libslic3r/PrintConfig.cpp:3493
+#: src/libslic3r/PrintConfig.cpp:3692
msgid "Output File"
msgstr "Výstupní soubor"
-#: src/libslic3r/PrintConfig.cpp:1363
+#: src/libslic3r/PrintConfig.cpp:1471
msgid "Output filename format"
msgstr "Formát názvu výstupního souboru"
-#: src/libslic3r/PrintConfig.cpp:3381
+#: src/libslic3r/PrintConfig.cpp:3580
msgid "Output Model Info"
msgstr "Info o výstupním modelu"
-#: src/slic3r/GUI/Tab.cpp:1230 src/slic3r/GUI/Tab.cpp:3665
+#: src/slic3r/GUI/Tab.cpp:1560 src/slic3r/GUI/Tab.cpp:4084
msgid "Output options"
msgstr "Možnosti výstupu"
-#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:312
+#: src/slic3r/GUI/GUI_Preview.cpp:303 src/libslic3r/ExtrusionEntity.cpp:316
+#: src/libslic3r/ExtrusionEntity.cpp:340
msgid "Overhang perimeter"
msgstr "Perimetr převisu"
-#: src/libslic3r/PrintConfig.cpp:2042
+#: src/libslic3r/PrintConfig.cpp:2184
msgid "Overhang threshold"
msgstr "Mezní úhel převisu"
-#: src/slic3r/GUI/Tab.cpp:1215
+#: src/slic3r/GUI/Tab.cpp:1545
msgid "Overlap"
msgstr "Překrytí"
-#: src/slic3r/GUI/MainFrame.cpp:614
+#: src/slic3r/GUI/MainFrame.cpp:1221
msgid "P&rint Settings Tab"
-msgstr "Panel nastavení &tisku"
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:107 src/slic3r/GUI/GUI_ObjectList.cpp:625
-#: src/slic3r/GUI/Plater.cpp:635 src/slic3r/GUI/Tab.cpp:3636
-#: src/slic3r/GUI/Tab.cpp:3637 src/libslic3r/PrintConfig.cpp:2781
-#: src/libslic3r/PrintConfig.cpp:2788 src/libslic3r/PrintConfig.cpp:2802
-#: src/libslic3r/PrintConfig.cpp:2813 src/libslic3r/PrintConfig.cpp:2823
-#: src/libslic3r/PrintConfig.cpp:2845 src/libslic3r/PrintConfig.cpp:2856
-#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:2870
-#: src/libslic3r/PrintConfig.cpp:2881 src/libslic3r/PrintConfig.cpp:2890
-#: src/libslic3r/PrintConfig.cpp:2899
+msgstr "Panel Nastavení &tisku"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:664
+#: src/slic3r/GUI/Plater.cpp:501 src/slic3r/GUI/Tab.cpp:4055
+#: src/slic3r/GUI/Tab.cpp:4056 src/slic3r/GUI/Tab.cpp:4127
+#: src/libslic3r/PrintConfig.cpp:2945 src/libslic3r/PrintConfig.cpp:2952
+#: src/libslic3r/PrintConfig.cpp:2966 src/libslic3r/PrintConfig.cpp:2977
+#: src/libslic3r/PrintConfig.cpp:2987 src/libslic3r/PrintConfig.cpp:3009
+#: src/libslic3r/PrintConfig.cpp:3020 src/libslic3r/PrintConfig.cpp:3027
+#: src/libslic3r/PrintConfig.cpp:3034 src/libslic3r/PrintConfig.cpp:3045
+#: src/libslic3r/PrintConfig.cpp:3054 src/libslic3r/PrintConfig.cpp:3063
msgid "Pad"
msgstr "Podložka"
@@ -5212,443 +6192,517 @@ msgstr "Podložka"
msgid "Pad and Support"
msgstr "Podložka a Podpěry"
-#: src/libslic3r/PrintConfig.cpp:2855
+#: src/slic3r/GUI/Tab.cpp:4127 src/libslic3r/PrintConfig.cpp:3019
msgid "Pad around object"
msgstr "Podložka okolo objektu"
-#: src/libslic3r/PrintConfig.cpp:2862
+#: src/libslic3r/PrintConfig.cpp:3026
msgid "Pad around object everywhere"
msgstr "Podložka všude okolo objektu"
-#: src/libslic3r/PrintConfig.cpp:2811
+#: src/libslic3r/PrintConfig.cpp:2975
msgid "Pad brim size"
msgstr "Velikost límce podložky"
-#: src/libslic3r/SLA/Pad.cpp:691
+#: src/libslic3r/SLA/Pad.cpp:532
msgid "Pad brim size is too small for the current configuration."
msgstr "Velikost okraje podložky je pro aktuální konfiguraci příliš malá."
-#: src/libslic3r/PrintConfig.cpp:2898
+#: src/libslic3r/PrintConfig.cpp:3062
msgid "Pad object connector penetration"
msgstr "Průnik spojky Podložka-Objekt"
-#: src/libslic3r/PrintConfig.cpp:2880
+#: src/libslic3r/PrintConfig.cpp:3044
msgid "Pad object connector stride"
msgstr "RozteÄ spojek Podložka-Objekt"
-#: src/libslic3r/PrintConfig.cpp:2889
+#: src/libslic3r/PrintConfig.cpp:3053
msgid "Pad object connector width"
msgstr "Šířka spojky Podložka-Objekt"
-#: src/libslic3r/PrintConfig.cpp:2869
+#: src/libslic3r/PrintConfig.cpp:3033
msgid "Pad object gap"
msgstr "Mezera Podložka-Objekt"
-#: src/libslic3r/PrintConfig.cpp:2797
+#: src/libslic3r/PrintConfig.cpp:2961
msgid "Pad wall height"
msgstr "Výška boÄnice podložky"
-#: src/libslic3r/PrintConfig.cpp:2844
+#: src/libslic3r/PrintConfig.cpp:3008
msgid "Pad wall slope"
msgstr "Sklon boÄnice podložky"
-#: src/libslic3r/PrintConfig.cpp:2787
+#: src/libslic3r/PrintConfig.cpp:2951
msgid "Pad wall thickness"
msgstr "Tloušťka stěny podložky"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
msgid "Page Down"
msgstr "Page Down"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
msgid "Page Up"
msgstr "Page Up"
-#: src/slic3r/GUI/Field.cpp:139
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33
+msgid "Paint-on supports"
+msgstr "Malování podpěr"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:178
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:159
+msgid "Paints all facets inside, regardless of their orientation."
+msgstr "Maluje na všechny facety bez ohledu na jejich orientaci."
+
+#: src/slic3r/GUI/Field.cpp:187
msgid "parameter name"
msgstr "název parametru"
-#: src/slic3r/GUI/Field.cpp:243
+#: src/slic3r/GUI/Field.cpp:291
msgid "Parameter validation"
msgstr "Validace parametru"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3418
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3881
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
msgid "Part"
msgstr "Část"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2494
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2886
msgid "Part manipulation"
msgstr "Manipulace s Äástmi"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2483
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2875
msgid "Part Settings to modify"
msgstr "ZmÄ›na nastavení Äásti"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4514
+#: src/libslic3r/PrintConfig.cpp:138
+msgid "Password"
+msgstr "Heslo"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4880
msgid "Paste"
msgstr "Vložit"
-#: src/slic3r/GUI/MainFrame.cpp:592
+#: src/slic3r/GUI/MainFrame.cpp:1198
msgid "Paste clipboard"
msgstr "Vložit ze schránky"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:133
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:128
msgid "Paste from clipboard"
msgstr "Vložit ze schránky"
-#: src/slic3r/GUI/Plater.cpp:5606
+#: src/slic3r/GUI/Plater.cpp:5803
msgid "Paste From Clipboard"
msgstr "Vložení ze schránky"
-#: src/libslic3r/PrintConfig.cpp:2002
+#: src/libslic3r/PrintConfig.cpp:2144
msgid "Pattern"
msgstr "Vzor"
-#: src/libslic3r/PrintConfig.cpp:1891
+#: src/libslic3r/PrintConfig.cpp:2033
msgid "Pattern angle"
msgstr "Úhel vzoru"
-#: src/libslic3r/PrintConfig.cpp:2016
+#: src/libslic3r/PrintConfig.cpp:2158
msgid "Pattern spacing"
msgstr "RozteÄ podpÄ›r"
-#: src/libslic3r/PrintConfig.cpp:2004
+#: src/libslic3r/PrintConfig.cpp:2146
msgid "Pattern used to generate support material."
msgstr "Vzor použitý pro generování podpěr."
-#: src/slic3r/GUI/Plater.cpp:1261
+#: src/slic3r/GUI/GCodeViewer.cpp:2437 src/slic3r/GUI/GCodeViewer.cpp:2460
+#: src/slic3r/GUI/Plater.cpp:1199
msgid "Pause"
msgstr "Pozastavení"
-#: src/slic3r/GUI/DoubleSlider.cpp:1009
+#: src/slic3r/GUI/DoubleSlider.cpp:1133
msgid "Pause print (\"%1%\")"
msgstr "Pozastavení tisku (\"%1%\")"
-#: src/slic3r/GUI/GLCanvas3D.cpp:934 src/slic3r/GUI/GLCanvas3D.cpp:943
-#: src/slic3r/GUI/GLCanvas3D.cpp:982
-msgid "Pause print or custom G-code"
-msgstr "Pozastavit tisk nebo vložit vlastní G-code"
+#: src/slic3r/GUI/Tab.cpp:2209 src/libslic3r/PrintConfig.cpp:1969
+msgid "Pause Print G-code"
+msgstr "G-code pro pozastavení tisku"
+
+#: src/libslic3r/PrintConfig.cpp:1147
+msgid "Percent of a flow rate relative to object's normal layer height."
+msgstr "Procento průtoku vzhledem k normální výšce vrstvy objektu."
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2233
+msgid "Percentage"
+msgstr "Procentuálně"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:175
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:177
msgid "Perform cut"
msgstr "Provést řez"
-#: src/libslic3r/PrintConfig.cpp:2927
+#: src/libslic3r/PrintConfig.cpp:3091
msgid "Performance vs accuracy of calculation. Lower values may produce unwanted artifacts."
msgstr "Rychlost vs. pÅ™esnost výpoÄtu. Nižší hodnoty mohou způsobit nežádoucí artefakty."
-#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:310
+#: src/slic3r/GUI/GUI_Preview.cpp:301 src/libslic3r/ExtrusionEntity.cpp:314
+#: src/libslic3r/ExtrusionEntity.cpp:336
msgid "Perimeter"
msgstr "Perimetr"
-#: src/libslic3r/PrintConfig.cpp:1408
+#: src/libslic3r/PrintConfig.cpp:1516
msgid "Perimeter extruder"
msgstr "Extruder pro perimetry"
-#: src/slic3r/GUI/PresetHints.cpp:165
+#: src/slic3r/GUI/PresetHints.cpp:164
msgid "perimeters"
msgstr "perimetry"
-#: src/libslic3r/PrintConfig.cpp:1399 src/libslic3r/PrintConfig.cpp:1417
-#: src/libslic3r/PrintConfig.cpp:1430 src/libslic3r/PrintConfig.cpp:1440
+#: src/libslic3r/PrintConfig.cpp:1507 src/libslic3r/PrintConfig.cpp:1525
+#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1548
msgid "Perimeters"
msgstr "Perimetry"
-#: src/slic3r/GUI/ConfigWizard.cpp:860
-#, c-format
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:159
+msgid "Physical Printer"
+msgstr "Fyzická tiskárna"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:789
+#: src/slic3r/GUI/PresetComboBoxes.cpp:948
+msgid "Physical printers"
+msgstr "Fyzické tiskárny"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1226
+#, possible-c-format
msgid "Pick another vendor supported by %s"
msgstr "Vyberte si jiného výrobce, který je podporováný programem %s"
-#: src/libslic3r/PrintConfig.cpp:66
-msgid "Picture sizes to be stored into a .gcode and .sl1 files"
-msgstr "Velikosti obrázků, které mají být uloženy do souborů .gcode a .sl1"
+#: src/libslic3r/PrintConfig.cpp:67
+msgid "Picture sizes to be stored into a .gcode and .sl1 files, in the following format: \"XxY, XxY, ...\""
+msgstr "Velikosti obrázků, které mají být uloženy do souborů .gcode a .sl1, v následujícím formátu: „XxY, XxY, ...“"
+
+#: src/libslic3r/PrintConfig.cpp:2822
+msgid "Pillar connection mode"
+msgstr "Způsob propojení podpěr"
+
+#: src/libslic3r/PrintConfig.cpp:2791
+msgid "Pillar diameter"
+msgstr "Průměr podpěry"
-#: src/libslic3r/PrintConfig.cpp:2681
+#: src/libslic3r/PrintConfig.cpp:2845
msgid "Pillar widening factor"
msgstr "Koeficient rozšiřování podpěry"
-#: src/slic3r/GUI/ConfigManipulation.cpp:330
+#: src/slic3r/GUI/ConfigManipulation.cpp:335
msgid "Pinhead diameter should be smaller than the pillar diameter."
msgstr "Průměr hrotu podpěry by měl být menší než průměr podpěrných sloupů."
-#: src/slic3r/GUI/DoubleSlider.cpp:79
+#: src/libslic3r/PrintConfig.cpp:2763
+msgid "Pinhead front diameter"
+msgstr "Průměr podpěrného hrotu"
+
+#: src/libslic3r/PrintConfig.cpp:2781
+msgid "Pinhead width"
+msgstr "Šířka podpěrného hrotu"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:110
msgid "Place bearings in slots and resume printing"
msgstr "Vložte ložiska do otvorů a pokraÄujte v tisku"
-#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:45
+#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:41
msgid "Place on face"
msgstr "Umístit plochou na podložku"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 src/slic3r/GUI/MainFrame.cpp:204
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 src/slic3r/GUI/MainFrame.cpp:340
+#: src/slic3r/GUI/MainFrame.cpp:352
msgid "Plater"
msgstr "Podložka"
-#: src/slic3r/GUI/GUI_App.cpp:1085
+#: src/slic3r/GUI/GUI_App.cpp:1877
msgid "Please check and fix your object list."
msgstr "Zkontrolujte a opravte seznam objektů."
-#: src/slic3r/GUI/Plater.cpp:2312 src/slic3r/GUI/Tab.cpp:2959
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:209 src/slic3r/GUI/Plater.cpp:2255
+#: src/slic3r/GUI/Tab.cpp:3188
msgid "Please check your object list before preset changing."
msgstr "Před změnou nastavení zkontrolujte prosím seznam objektů."
-#: src/slic3r/GUI/Plater.cpp:3286
+#: src/slic3r/GUI/Plater.cpp:3089
msgid "Please select the file to reload"
msgstr "Vyberte soubor, který chcete znovu naÄíst"
-#: src/slic3r/GUI/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:291
+#: src/slic3r/GUI/AboutDialog.cpp:43 src/slic3r/GUI/AboutDialog.cpp:48
+#: src/slic3r/GUI/AboutDialog.cpp:317
msgid "Portions copyright"
msgstr "Autorská práva"
-#: src/libslic3r/PrintConfig.cpp:2400
+#: src/libslic3r/PrintConfig.cpp:2543
msgid "Portrait"
msgstr "Orientace na výšku"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:215
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:457
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:223
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:505
msgid "Position"
msgstr "Pozice"
-#: src/slic3r/GUI/Tab.cpp:2367
+#: src/slic3r/GUI/Tab.cpp:2536
msgid "Position (for multi-extruder printers)"
msgstr "Pozice (pro tiskárny s více extrudery)"
-#: src/libslic3r/PrintConfig.cpp:1623
+#: src/libslic3r/PrintConfig.cpp:1731
msgid "Position of perimeters starting points."
msgstr "Pozice zaÄátku perimetrů."
-#: src/libslic3r/PrintConfig.cpp:2224
+#: src/libslic3r/PrintConfig.cpp:2367
msgid "Position X"
msgstr "Pozice X"
-#: src/libslic3r/PrintConfig.cpp:2231
+#: src/libslic3r/PrintConfig.cpp:2374
msgid "Position Y"
msgstr "Pozice Y"
-#: src/slic3r/GUI/Tab.cpp:1245 src/libslic3r/PrintConfig.cpp:1453
+#: src/slic3r/GUI/Tab.cpp:1575 src/libslic3r/PrintConfig.cpp:1561
msgid "Post-processing scripts"
msgstr "PostprodukÄní skripty"
-#: src/slic3r/GUI/MainFrame.cpp:629
+#: src/slic3r/GUI/MainFrame.cpp:1237
msgid "Pre&view"
msgstr "&Náhled"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 src/slic3r/GUI/Preferences.cpp:10
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 src/slic3r/GUI/Preferences.cpp:12
msgid "Preferences"
msgstr "Nastavení"
-#: src/libslic3r/PrintConfig.cpp:1641
+#: src/libslic3r/PrintConfig.cpp:1749
msgid "Preferred direction of the seam"
msgstr "Preferovaný směr švu"
-#: src/libslic3r/PrintConfig.cpp:1652
+#: src/libslic3r/PrintConfig.cpp:1760
msgid "Preferred direction of the seam - jitter"
msgstr "Preferovaný směr švu - rozkmit"
-#: src/libslic3r/PrintObject.cpp:255
+#: src/libslic3r/PrintObject.cpp:261
msgid "Preparing infill"
msgstr "Příprava výplně"
-#: src/slic3r/GUI/Tab.cpp:2920
-#, c-format
-msgid "Preset (%s)"
-msgstr "Přednastavení (%s)"
+#: src/slic3r/GUI/GUI_App.cpp:855
+msgid "Preparing settings tabs"
+msgstr "Příprava karet s nastavením"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1009
+msgid "Preset \"%1%\" has the following unsaved changes:"
+msgstr "Přednastavení \"%1%\"má následující neuložené změny:"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1014
+msgid "Preset \"%1%\" is not compatible with the new print profile and it has the following unsaved changes:"
+msgstr "Přednastavení \"%1%\" není kompatibilní s novým tiskovým profilem a obsahuje následující neuložené změny:"
-#: src/slic3r/GUI/Tab.cpp:3082
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1013
+msgid "Preset \"%1%\" is not compatible with the new printer profile and it has the following unsaved changes:"
+msgstr "Přednastavení \"%1%\" není kompatibilní s novým profilem tiskárny a má následující neuložené změny:"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:136
+msgid "Preset with name \"%1%\" already exists and is incompatible with selected printer."
+msgstr "Přednastavení s názvem \"%1%\" již existuje a není kompatibilní s vybranou tiskárnou."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:148
msgid "Preset with name \"%1%\" already exists."
msgstr "Přednastavení s názvem \"%1%\" již existuje."
-#: src/slic3r/GUI/Tab.cpp:3029
+#: src/slic3r/GUI/SavePresetDialog.cpp:219
msgctxt "PresetName"
msgid "Copy"
msgstr "Kopie"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
+#: src/slic3r/GUI/GLCanvas3D.cpp:3990
+msgid "Press %1%left mouse button to enter the exact value"
+msgstr "Pro zadání pÅ™esné hodnoty stiskni %1%levé tlaÄítko myÅ¡i"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:157
msgid "Press to activate deselection rectangle"
msgstr "Stiskem aktivujete obdélníkové odstranění výběru"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:197
-msgid "Press to activate one direction scaling in Gizmo scale"
-msgstr "Stiskem aktivujete změnu velikosti pouze v jednom směru"
-
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:162
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:156
msgid "Press to activate selection rectangle"
msgstr "Stiskem aktivujete obdélníkový výběr"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:198
-msgid ""
-"Press to scale (in Gizmo scale) or rotate (in Gizmo rotate)\n"
-"selected objects around their own center"
-msgstr ""
-"Změna velikosti nebo rotace\n"
-"vybraných objektů kolem vlastních středů"
-
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:161
-msgid ""
-"Press to select multiple objects\n"
-"or move multiple objects with mouse"
-msgstr ""
-"Stisknutím vyberte více objektů\n"
-"nebo přesuňte více objektů pomocí myši"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:155
+msgid "Press to select multiple objects\nor move multiple objects with mouse"
+msgstr "Stisknutím vyberte více objektů\nnebo přesuňte více objektů pomocí myši"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:195
-#, no-c-format
-msgid ""
-"Press to snap by 5% in Gizmo scale\n"
-"or to snap by 1mm in Gizmo move"
-msgstr ""
-"Stiskni pro 5% krok při změně velikosti,\n"
-"nebo 1mm krok při posunu"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:221
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:231
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:232
+msgid "Press to speed up 5 times while moving thumb\nwith arrow keys or mouse wheel"
+msgstr "5× zrychlíte pohyb posuvníku pomocí\nÅ¡ipek nebo koleÄkem myÅ¡i"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/Plater.cpp:4105
-#: src/slic3r/GUI/Tab.cpp:2390
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:212 src/slic3r/GUI/Plater.cpp:4052
+#: src/slic3r/GUI/Tab.cpp:2559
msgid "Preview"
msgstr "Náhled"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41
msgid "Preview hollowed and drilled model"
msgstr "Náhled dutého modelu"
-#: src/slic3r/GUI/MainFrame.cpp:790
+#: src/slic3r/GUI/MainFrame.cpp:1491
msgid "Previously sliced file ("
msgstr "Dříve slicovaný soubor ("
-#: src/libslic3r/PrintConfig.cpp:1851
+#: src/libslic3r/PrintConfig.cpp:1993
msgid "Prime all printing extruders"
msgstr "Příprava všech tiskových extruderů"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1521
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/libslic3r/Preset.cpp:1300
msgid "print"
msgstr "tisk"
-#: src/slic3r/GUI/MainFrame.cpp:648
+#: src/slic3r/GUI/GCodeViewer.cpp:2436 src/slic3r/GUI/GCodeViewer.cpp:2451
+msgid "Print"
+msgstr "Tisk"
+
+#: src/slic3r/GUI/MainFrame.cpp:1258
msgid "Print &Host Upload Queue"
msgstr "Fronta na&hrávání do tiskového serveru"
-#: src/libslic3r/PrintConfig.cpp:471
+#: src/libslic3r/PrintConfig.cpp:507
msgid "Print contour perimeters from the outermost one to the innermost one instead of the default inverse order."
msgstr "Tisk obrysových perimetrů od vnÄ›jších po vnitÅ™ní namísto opaÄného výchozího poÅ™adí."
-#: src/slic3r/GUI/ConfigWizard.cpp:952
+#: src/slic3r/GUI/ConfigWizard.cpp:1318
msgid "Print Diameters"
msgstr "Parametry extruderu"
-#: src/slic3r/GUI/Tab.cpp:1944 src/slic3r/GUI/Tab.cpp:2123
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:209 src/slic3r/GUI/Tab.cpp:2024
msgid "Print Host upload"
-msgstr "Nahrání do tiskového serveru"
+msgstr "Nahrávání do tiskového serveru"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:142
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:138
#: src/slic3r/GUI/PrintHostDialogs.cpp:136
msgid "Print host upload queue"
msgstr "Fronta nahrávaní do tiskového serveru"
-#: src/slic3r/GUI/DoubleSlider.cpp:970
+#: src/slic3r/GUI/DoubleSlider.cpp:1093
msgid "Print mode"
msgstr "Režim tisku"
-#: src/slic3r/GUI/Tab.hpp:328 src/slic3r/GUI/Tab.hpp:431
+#: src/slic3r/GUI/GCodeViewer.cpp:2579 src/slic3r/GUI/GUI_Preview.cpp:1476
+msgid "Print pauses"
+msgstr "Pauzy tisku"
+
+#: src/slic3r/GUI/Tab.hpp:378 src/slic3r/GUI/Tab.hpp:502
msgid "Print Settings"
msgstr "Nastavení tisku"
-#: src/slic3r/GUI/Plater.cpp:815
+#: src/slic3r/GUI/Plater.cpp:690
msgid "Print settings"
msgstr "Nastavení tisku"
-#: src/slic3r/GUI/Tab.cpp:1478
+#: src/slic3r/GUI/GLCanvas3D.cpp:4303 src/slic3r/GUI/GLCanvas3D.cpp:4939
+msgid "Print Settings Tab"
+msgstr "Panel Nastavení tisku"
+
+#: src/slic3r/GUI/Tab.cpp:1824
msgid "Print speed override"
msgstr "Přepsání rychlosti tisku"
-#: src/libslic3r/GCode.cpp:638
+#: src/libslic3r/GCode.cpp:623
msgid "Print z"
msgstr "Tisk ve výšce"
-#: src/slic3r/GUI/MainFrame.cpp:621
+#: src/slic3r/GUI/MainFrame.cpp:1228
msgid "Print&er Settings Tab"
-msgstr "Panel nastav&ení tiskárny"
+msgstr "Panel Nastav&ení tiskárny"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1621
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1750
msgid "Printable"
msgstr "Tisknout objekt"
-#: src/slic3r/GUI/Plater.cpp:819
+#: src/slic3r/GUI/Plater.cpp:694
msgid "Printer"
msgstr "Tiskárna"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1525
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/libslic3r/Preset.cpp:1304
msgid "printer"
msgstr "tiskárna"
-#: src/libslic3r/PrintConfig.cpp:2439 src/libslic3r/PrintConfig.cpp:2440
+#: src/libslic3r/PrintConfig.cpp:2582 src/libslic3r/PrintConfig.cpp:2583
msgid "Printer absolute correction"
msgstr "Absolutní korekce tiskárny"
-#: src/libslic3r/PrintConfig.cpp:2456 src/libslic3r/PrintConfig.cpp:2457
+#: src/libslic3r/PrintConfig.cpp:2599 src/libslic3r/PrintConfig.cpp:2600
msgid "Printer gamma correction"
msgstr "Gamma korekce tiskárny"
-#: src/slic3r/GUI/Tab.cpp:976
+#: src/slic3r/GUI/Tab.cpp:1294
msgid "printer model"
msgstr "model tiskárny"
-#: src/libslic3r/PrintConfig.cpp:1472
+#: src/libslic3r/PrintConfig.cpp:1580
msgid "Printer notes"
msgstr "Poznámky o tiskárně"
-#: src/libslic3r/PrintConfig.cpp:2431 src/libslic3r/PrintConfig.cpp:2432
-#: src/libslic3r/PrintConfig.cpp:2433
+#: src/libslic3r/PrintConfig.cpp:144
+msgid "Printer preset name"
+msgstr "Název přednastavení tiskárny"
+
+#: src/libslic3r/PrintConfig.cpp:2574 src/libslic3r/PrintConfig.cpp:2575
+#: src/libslic3r/PrintConfig.cpp:2576
msgid "Printer scaling correction"
msgstr "Korekce měřítka tisku"
-#: src/slic3r/GUI/Tab.hpp:391
+#: src/slic3r/GUI/Tab.hpp:453
msgid "Printer Settings"
msgstr "Nastavení tiskárny"
+#: src/slic3r/GUI/GLCanvas3D.cpp:4305 src/slic3r/GUI/GLCanvas3D.cpp:4941
+msgid "Printer Settings Tab"
+msgstr "Panel Nastavení tiskárny"
+
#: src/libslic3r/PrintConfig.cpp:43 src/libslic3r/PrintConfig.cpp:44
msgid "Printer technology"
msgstr "Technologie tisku"
-#: src/libslic3r/PrintConfig.cpp:1466
+#: src/libslic3r/PrintConfig.cpp:1574
msgid "Printer type"
msgstr "Typ tiskárny"
-#: src/libslic3r/PrintConfig.cpp:1487
+#: src/libslic3r/PrintConfig.cpp:1595
msgid "Printer variant"
msgstr "Varianta tiskárny"
-#: src/libslic3r/PrintConfig.cpp:1481
+#: src/libslic3r/PrintConfig.cpp:1589
msgid "Printer vendor"
msgstr "Prodejce tiskárny"
-#: src/libslic3r/Print.cpp:1388
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:476
+msgid "Printer with name \"%1%\" already exists."
+msgstr "Tiskárna s názvem \"%1%\" již existuje."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:587
+msgid "Printer:"
+msgstr "Tiskárna:"
+
+#: src/libslic3r/Print.cpp:1414
msgid "Printing with multiple extruders of differing nozzle diameters. If support is to be printed with the current extruder (support_material_extruder == 0 or support_material_interface_extruder == 0), all nozzles have to be of the same diameter."
msgstr "Tisk s více extrudery různých průměrů trysek. Má-li být podpěra tisknuta aktuálním extruderem (support_material_extruder == 0 nebo support_material_interface_extruder == 0), musí mít všechny trysky stejný průměr."
#. TRN "Processing input_file_basename"
-#: src/slic3r/GUI/MainFrame.cpp:849
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:1550
+#, possible-c-format
msgid "Processing %s"
msgstr "Zpracovávám %s"
-#: src/slic3r/GUI/Plater.cpp:2283
-#, c-format
-msgid "Processing input file %s"
-msgstr "Zpracovávám vstupní soubor %s"
-
-#: src/libslic3r/PrintObject.cpp:108
+#: src/libslic3r/PrintObject.cpp:114
msgid "Processing triangulated mesh"
msgstr "Zpracovávám tringulaÄní sítÄ›"
-#: src/slic3r/GUI/Tab.cpp:1259 src/slic3r/GUI/Tab.cpp:1549
-#: src/slic3r/GUI/Tab.cpp:2020 src/slic3r/GUI/Tab.cpp:2136
-#: src/slic3r/GUI/Tab.cpp:3544 src/slic3r/GUI/Tab.cpp:3672
+#: src/slic3r/GUI/Tab.cpp:1589 src/slic3r/GUI/Tab.cpp:1896
+#: src/slic3r/GUI/Tab.cpp:2229 src/slic3r/GUI/Tab.cpp:2305
+#: src/slic3r/GUI/Tab.cpp:3960 src/slic3r/GUI/Tab.cpp:4091
msgid "Profile dependencies"
msgstr "Profilové závislosti"
-#: src/slic3r/GUI/ConfigWizard.cpp:566
+#: src/slic3r/GUI/ConfigWizard.cpp:590
msgid "Profile:"
msgstr "Profil:"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:150
+#: src/slic3r/GUI/PrintHostDialogs.cpp:148
msgid "Progress"
msgstr "Průběh"
@@ -5656,101 +6710,129 @@ msgstr "Průběh"
msgid "Progress:"
msgstr "Průběh:"
-#: src/slic3r/GUI/MainFrame.cpp:684
+#: src/slic3r/GUI/MainFrame.cpp:909 src/slic3r/GUI/MainFrame.cpp:1308
msgid "Prusa 3D &Drivers"
msgstr "Prusa 3&D OvladaÄe"
-#: src/slic3r/GUI/ConfigWizard.cpp:1995
+#: src/slic3r/GUI/ConfigWizard.cpp:2506
msgid "Prusa FFF Technology Printers"
msgstr "Prusa tiskárny technologie FFF"
-#: src/slic3r/GUI/ConfigWizard.cpp:1998
+#: src/slic3r/GUI/ConfigWizard.cpp:2509
msgid "Prusa MSLA Technology Printers"
msgstr "Prusa tiskárny technologie MSLA"
-#: src/slic3r/GUI/AboutDialog.cpp:260
+#: src/slic3r/Utils/Http.cpp:78
+msgid "PrusaSlicer detected system SSL certificate store in: %1%"
+msgstr "PrusaSlicer detekoval úložiště SSL certifikátu v: %1%"
+
+#: src/slic3r/GUI/GUI_Init.cpp:85 src/slic3r/GUI/GUI_Init.cpp:88
+msgid "PrusaSlicer GUI initialization failed"
+msgstr "Inicializace grafického uživatelského rozhraní PrusaSliceru se nezdařila"
+
+#: src/slic3r/GUI/GUI_App.cpp:586
+msgid "PrusaSlicer has encountered a localization error. Please report to PrusaSlicer team, what language was active and in which scenario this issue happened. Thank you.\n\nThe application will now terminate."
+msgstr "V aplikaci PrusaSlicer doÅ¡lo k chybÄ› v lokalizaci. Nahlaste PrusaSlicer týmu, jaký jazyk byl aktivní a ve kterém scénáři k tomuto problému doÅ¡lo. DÄ›kujeme.\n\nAplikace bude nyní ukonÄena."
+
+#: src/slic3r/GUI/AboutDialog.cpp:285
msgid "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap community."
msgstr "PrusaSlicer je založen na Slic3r od Alessandra Ranellucciho a RepRap komunity."
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:284
-#, c-format
-msgid ""
-"PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n"
-"while OpenGL version %s, render %s, vendor %s was detected."
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:525
+msgid "PrusaSlicer is closing: Unsaved Changes"
+msgstr "PrusaSlicer se zavírá: Neuložené změny"
+
+#: src/slic3r/GUI/OpenGLManager.cpp:259
+#, possible-c-format
+msgid "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \nwhile OpenGL version %s, render %s, vendor %s was detected."
msgstr "PrusaSlicer vyžaduje grafický ovladaÄ s funkÄním OpenGL 2.0. Zatímco byla detekována verze OpenGL %s, render %s, výrobce %s."
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:50
msgid "PrusaSlicer version"
msgstr "verze PrusaSliceru"
-#: src/slic3r/GUI/ConfigWizard.cpp:815
-msgid ""
-"PrusaSlicer's user interfaces comes in three variants:\n"
-"Simple, Advanced, and Expert.\n"
-"The Simple mode shows only the most frequently used settings relevant for regular 3D printing. The other two offer progressively more sophisticated fine-tuning, they are suitable for advanced and expert users, respectively."
-msgstr ""
-"Uživatelské rozhraní PrusaSlicer je k dispozici ve třech variantách:\n"
-"Jednoduché, pokroÄilé a expertní.\n"
-"Jednoduchý režim zobrazuje pouze nejÄastÄ›ji používaná nastavení relevantní pro běžný 3D tisk. Další dva nabízejí detailnÄ›jší doladÄ›ní a proto jsou vhodné pro pokroÄilé a expertní uživatele."
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:662
+msgid "PrusaSlicer will remember your action."
+msgstr "PrusaSlicer si vaši akci zapamatuje."
-#: src/libslic3r/PrintConfig.cpp:2254
+#: src/slic3r/GUI/ConfigWizard.cpp:1174
+msgid "PrusaSlicer's user interfaces comes in three variants:\nSimple, Advanced, and Expert.\nThe Simple mode shows only the most frequently used settings relevant for regular 3D printing. The other two offer progressively more sophisticated fine-tuning, they are suitable for advanced and expert users, respectively."
+msgstr "Uživatelské rozhraní PrusaSlicer je k dispozici ve tÅ™ech variantách:\nJednoduché, pokroÄilé a expertní.\nJednoduchý režim zobrazuje pouze nejÄastÄ›ji používaná nastavení relevantní pro běžný 3D tisk. Další dva nabízejí detailnÄ›jší doladÄ›ní a proto jsou vhodné pro pokroÄilé a expertní uživatele."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:668
+msgid "PrusaSlicer: Don't ask me again"
+msgstr "PrusaSlicer: Již se znavu neptat"
+
+#: src/libslic3r/PrintConfig.cpp:2397
msgid "Purging after toolchange will done inside this object's infills. This lowers the amount of waste but may result in longer print time due to additional travel moves."
msgstr "VyÄiÅ¡tÄ›ní trysky po výmÄ›nÄ› filamentu se provede uvnitÅ™ výplní tohoto objektu. Tím se snižuje množství odpadu, ale může to mít za následek delší dobu tisku v důsledku dodateÄných pohybů."
-#: src/slic3r/GUI/Plater.cpp:544
+#: src/slic3r/GUI/Plater.cpp:410
msgid "Purging volumes"
msgstr "Objemy ÄiÅ¡tÄ›ní"
-#: src/libslic3r/PrintConfig.cpp:2207
+#: src/libslic3r/PrintConfig.cpp:2350
msgid "Purging volumes - load/unload volumes"
msgstr "Objemy ÄiÅ¡tÄ›ní - zavádÄ›né / vyjmuté objemy"
-#: src/libslic3r/PrintConfig.cpp:2214
+#: src/libslic3r/PrintConfig.cpp:2357
msgid "Purging volumes - matrix"
msgstr "Objemy ÄiÅ¡tÄ›ní - matice"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44
+#: src/libslic3r/PrintConfig.cpp:1201
+msgid "Purpose of Machine Limits"
+msgstr "ÚÄel limitů stroje"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43
msgid "Quality"
msgstr "Kvalita"
-#: src/slic3r/GUI/Tab.cpp:1080
+#: src/slic3r/GUI/Tab.cpp:1402
msgid "Quality (slower slicing)"
msgstr "Kvalita (pomalejší slicing)"
-#: src/slic3r/GUI/GLCanvas3D.cpp:273
+#: src/slic3r/GUI/GLCanvas3D.cpp:260
msgid "Quality / Speed"
msgstr "Kvalita / Rychlost"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1182
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1530
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1536
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1849
-#, c-format
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61
+msgid "Quick"
+msgstr "Rychlé"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1306
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1661
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1667
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2008
+#, possible-c-format
msgid "Quick Add Settings (%s)"
msgstr "Rychlé přidání nastavení (%s)"
-#: src/slic3r/GUI/MainFrame.cpp:512
+#: src/slic3r/GUI/MainFrame.cpp:1113
msgid "Quick Slice"
msgstr "Rychlé Slicování"
-#: src/slic3r/GUI/MainFrame.cpp:518
+#: src/slic3r/GUI/MainFrame.cpp:1119
msgid "Quick Slice and Save As"
msgstr "Rychlé Slicování a Uložit jako"
-#: src/slic3r/GUI/MainFrame.cpp:540
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:1144 src/slic3r/GUI/MainFrame.cpp:1402
+#, possible-c-format
msgid "Quit %s"
msgstr "UkonÄit %s"
-#: src/slic3r/GUI/GLCanvas3D.cpp:294 src/libslic3r/PrintConfig.cpp:511
+#: src/slic3r/GUI/GUI_App.cpp:396
+msgid "Quit, I will move my data now"
+msgstr "Zavřít aplikaci, přesunu si svá data"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:280 src/libslic3r/PrintConfig.cpp:547
msgid "Radius"
msgstr "Rádius"
-#: src/slic3r/GUI/Tab.cpp:1127
+#: src/slic3r/GUI/Tab.cpp:1456
msgid "Raft"
msgstr "Raft"
-#: src/libslic3r/PrintConfig.cpp:1501
+#: src/libslic3r/PrintConfig.cpp:1609
msgid "Raft layers"
msgstr "Vrstev raftu"
@@ -5759,14 +6841,8 @@ msgid "Ramming customization"
msgstr "Přizpůsobení rapidní extruze"
#: src/slic3r/GUI/WipeTowerDialog.cpp:41
-msgid ""
-"Ramming denotes the rapid extrusion just before a tool change in a single-extruder MM printer. Its purpose is to properly shape the end of the unloaded filament so it does not prevent insertion of the new filament and can itself be reinserted later. This phase is important and different materials can require different extrusion speeds to get the good shape. For this reason, the extrusion rates during ramming are adjustable.\n"
-"\n"
-"This is an expert-level setting, incorrect adjustment will likely lead to jams, extruder wheel grinding into filament etc."
-msgstr ""
-"Rapidní extruze oznaÄuje rychlé vytlaÄení filamentu tÄ›snÄ› pÅ™ed jeho výmÄ›nou za jiný v multi material tiskárnÄ› s jedním extruderem. ÚÄelem je správnÄ› vytvarovat konec vysouvaného filamentu tak, aby neblokoval zasunutí nového filamentu a také mohl být sám pozdÄ›ji opÄ›tovnÄ› zasunut. Tento proces je důležitý a rozdílné materiály mohou pro získání optimálního tvaru vyžadovat různé rychlosti extruze. Z tohoto důvodu jsou objemové průtoky pÅ™i rapidní extruzi uživatelsky upravitelné.\n"
-"\n"
-"Toto nastavení je urÄeno pro pokroÄilé uživatele, nesprávné nastavení velmi pravdÄ›podobnÄ› povede k zaseknutí filamentu, vybrouÅ¡ení filamentu podávacím koleÄkem, atd."
+msgid "Ramming denotes the rapid extrusion just before a tool change in a single-extruder MM printer. Its purpose is to properly shape the end of the unloaded filament so it does not prevent insertion of the new filament and can itself be reinserted later. This phase is important and different materials can require different extrusion speeds to get the good shape. For this reason, the extrusion rates during ramming are adjustable.\n\nThis is an expert-level setting, incorrect adjustment will likely lead to jams, extruder wheel grinding into filament etc."
+msgstr "Rapidní extruze oznaÄuje rychlé vytlaÄení filamentu tÄ›snÄ› pÅ™ed jeho výmÄ›nou za jiný v multi material tiskárnÄ› s jedním extruderem. ÚÄelem je správnÄ› vytvarovat konec vysouvaného filamentu tak, aby neblokoval zasunutí nového filamentu a také mohl být sám pozdÄ›ji opÄ›tovnÄ› zasunut. Tento proces je důležitý a rozdílné materiály mohou pro získání optimálního tvaru vyžadovat různé rychlosti extruze. Z tohoto důvodu jsou objemové průtoky pÅ™i rapidní extruzi uživatelsky upravitelné.\n\nToto nastavení je urÄeno pro pokroÄilé uživatele, nesprávné nastavení velmi pravdÄ›podobnÄ› povede k zaseknutí filamentu, vybrouÅ¡ení filamentu podávacím koleÄkem, atd."
#: src/slic3r/GUI/WipeTowerDialog.cpp:91
msgid "Ramming line spacing"
@@ -5776,27 +6852,27 @@ msgstr "Rozestup linek při rapidní extruzi"
msgid "Ramming line width"
msgstr "Šířka linky při rapidní extruzi"
-#: src/libslic3r/PrintConfig.cpp:694
+#: src/libslic3r/PrintConfig.cpp:730
msgid "Ramming parameters"
msgstr "Parametry rapidní extruze"
-#: src/slic3r/GUI/Tab.cpp:1505
+#: src/slic3r/GUI/Tab.cpp:1850
msgid "Ramming settings"
msgstr "Nastavení rapidní extruze"
-#: src/libslic3r/PrintConfig.cpp:1629
+#: src/libslic3r/PrintConfig.cpp:1737
msgid "Random"
msgstr "Náhodný"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:94
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:96
msgid "Range"
msgstr "Rozsah"
-#: src/libslic3r/SLAPrintSteps.cpp:65
+#: src/libslic3r/SLAPrintSteps.cpp:66
msgid "Rasterizing layers"
msgstr "Rasterizace vrstev"
-#: src/slic3r/GUI/MainFrame.cpp:596
+#: src/slic3r/GUI/MainFrame.cpp:1202
msgid "Re&load from disk"
msgstr "Znovu &naÄíst z disku"
@@ -5808,211 +6884,244 @@ msgstr "Přenastavit"
msgid "Ready"
msgstr "Připraveno"
-#: src/slic3r/GUI/Plater.cpp:3115
+#: src/slic3r/GUI/Plater.cpp:2915
msgid "Ready to slice"
msgstr "Připraven ke slicování"
-#: src/slic3r/GUI/MainFrame.cpp:669 src/libslic3r/PrintConfig.cpp:1632
+#: src/slic3r/GUI/MainFrame.cpp:966 src/slic3r/GUI/MainFrame.cpp:1286
+#: src/libslic3r/PrintConfig.cpp:1740
msgid "Rear"
msgstr "Zezadu"
-#: src/slic3r/GUI/MainFrame.cpp:669
+#: src/slic3r/GUI/MainFrame.cpp:966 src/slic3r/GUI/MainFrame.cpp:1286
msgid "Rear View"
msgstr "Pohled zezadu"
-#: src/slic3r/GUI/MainFrame.cpp:413
+#: src/slic3r/GUI/MainFrame.cpp:994
msgid "Recent projects"
msgstr "N&edávné projekty"
-#: src/slic3r/GUI/PresetHints.cpp:263
-#, c-format
+#: src/slic3r/GUI/PresetHints.cpp:262
+#, possible-c-format
msgid "Recommended object thin wall thickness for layer height %.2f and"
msgstr "DoporuÄená tlouÅ¡Å¥ka stÄ›ny objektu pro výšku vrstvy %.2f a"
-#: src/slic3r/GUI/PresetHints.cpp:274
+#: src/slic3r/GUI/PresetHints.cpp:273
msgid "Recommended object thin wall thickness: Not available due to excessively small extrusion width."
msgstr "DoporuÄená tlouÅ¡Å¥ka stÄ›ny objektu: Není k dispozici kvůli příliÅ¡ malé šířce extruze."
-#: src/slic3r/GUI/PresetHints.cpp:247
+#: src/slic3r/GUI/PresetHints.cpp:246
msgid "Recommended object thin wall thickness: Not available due to invalid layer height."
msgstr "DoporuÄená tlouÅ¡Å¥ka stÄ›ny objektu: Není k dispozici kvůli neplatné výšce vrstvy."
-#: src/slic3r/GUI/GUI_App.cpp:450 src/slic3r/GUI/GUI_App.cpp:459
+#: src/slic3r/GUI/GUI_App.cpp:1102 src/slic3r/GUI/GUI_App.cpp:1115
msgid "Recreating"
msgstr "Obnovení"
-#: src/slic3r/GUI/BedShapeDialog.cpp:73
+#: src/slic3r/GUI/BedShapeDialog.cpp:141
msgid "Rectangular"
msgstr "Obdélníkový"
-#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:843
-#: src/libslic3r/PrintConfig.cpp:2009
+#: src/libslic3r/PrintConfig.cpp:460 src/libslic3r/PrintConfig.cpp:881
+#: src/libslic3r/PrintConfig.cpp:2151
msgid "Rectilinear"
msgstr "PřímoÄará"
-#: src/libslic3r/PrintConfig.cpp:2010
+#: src/libslic3r/PrintConfig.cpp:2152
msgid "Rectilinear grid"
msgstr "PřímoÄará mřížka"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4657 src/slic3r/GUI/KBShortcutsDialog.cpp:131
-#: src/slic3r/GUI/MainFrame.cpp:584
+#: src/slic3r/GUI/GLCanvas3D.cpp:5067 src/slic3r/GUI/KBShortcutsDialog.cpp:126
+#: src/slic3r/GUI/MainFrame.cpp:1190
msgid "Redo"
msgstr "Vpřed"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4065
-#, c-format
+#: src/slic3r/GUI/GLCanvas3D.cpp:4382
+#, possible-c-format
msgid "Redo %1$d Action"
msgid_plural "Redo %1$d Actions"
msgstr[0] "%1$d Akce Vpřed"
msgstr[1] "%1$d Akce Vpřed"
msgstr[2] "%1$d Akcí Vpřed"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4047
+#: src/slic3r/GUI/GLCanvas3D.cpp:4361
msgid "Redo History"
msgstr "Historie operací Vpřed"
-#: src/slic3r/GUI/Tab.cpp:1098
+#: src/slic3r/GUI/Tab.cpp:1426
msgid "Reducing printing time"
msgstr "Zkracování tiskového Äasu"
-#: src/slic3r/GUI/Plater.cpp:3452
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327
+msgid "Refresh Printers"
+msgstr "Obnovit tiskárny"
+
+#: src/libslic3r/PrintConfig.cpp:145
+msgid "Related printer preset name"
+msgstr "Název souvisejícího přednastavení tiskárny"
+
+#: src/slic3r/GUI/Plater.cpp:3257
msgid "Reload all from disk"
msgstr "VÅ¡e znovu naÄíst z disku"
-#: src/slic3r/GUI/ConfigWizard.cpp:798 src/slic3r/GUI/GUI_ObjectList.cpp:1664
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3956 src/slic3r/GUI/Plater.cpp:3225
-#: src/slic3r/GUI/Plater.cpp:3934 src/slic3r/GUI/Plater.cpp:3963
+#: src/slic3r/GUI/ConfigWizard.cpp:1157 src/slic3r/GUI/GUI_ObjectList.cpp:1793
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4439 src/slic3r/GUI/Plater.cpp:3028
+#: src/slic3r/GUI/Plater.cpp:3852 src/slic3r/GUI/Plater.cpp:3881
msgid "Reload from disk"
msgstr "Znovu naÄíst z disku"
-#: src/slic3r/GUI/Plater.cpp:3339
+#: src/slic3r/GUI/Plater.cpp:3142
msgid "Reload from:"
msgstr "Znovu naÄíst z:"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:134
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:129
msgid "Reload plater from disk"
msgstr "Znovu naÄíst podložku z disku"
-#: src/slic3r/GUI/MainFrame.cpp:597
+#: src/slic3r/GUI/MainFrame.cpp:1203
msgid "Reload the plater from disk"
msgstr "Znovu naÄíst podložku z disku"
-#: src/slic3r/GUI/Plater.cpp:3963
+#: src/slic3r/GUI/Plater.cpp:3881
msgid "Reload the selected object from disk"
msgstr "Znovu naÄíst vybraný objekt z disku"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1664
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3956 src/slic3r/GUI/Plater.cpp:3934
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1793
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4439 src/slic3r/GUI/Plater.cpp:3852
msgid "Reload the selected volumes from disk"
msgstr "Znovu naÄíst vybrané objekty z disku"
-#: src/slic3r/GUI/Preferences.cpp:39
+#: src/slic3r/GUI/GCodeViewer.cpp:2442 src/slic3r/GUI/GCodeViewer.cpp:2445
+msgid "Remaining time"
+msgstr "Zbývající Äas"
+
+#: src/slic3r/GUI/GUI_App.cpp:720 src/slic3r/GUI/UnsavedChangesDialog.cpp:653
+msgid "Remember my choice"
+msgstr "Zapamatovat moji volbu"
+
+#: src/slic3r/GUI/Preferences.cpp:52
msgid "Remember output directory"
msgstr "Pamatovat si výstupní složku"
-#: src/slic3r/GUI/Tab.cpp:3121
+#: src/slic3r/GUI/MainFrame.cpp:166
+msgid "Remember to check for updates at https://github.com/prusa3d/PrusaSlicer/releases"
+msgstr "Nezapomeňte zkontrolovat aktualizace na https://github.com/prusa3d/PrusaSlicer/releases"
+
+#: src/slic3r/GUI/Tab.cpp:3386
msgid "remove"
msgstr "odebrat"
-#: src/slic3r/GUI/BedShapeDialog.cpp:190 src/slic3r/GUI/BedShapeDialog.cpp:269
-#: src/slic3r/GUI/Tab.cpp:3124
+#: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/BedShapeDialog.cpp:413
+#: src/slic3r/GUI/Tab.cpp:3423
msgid "Remove"
msgstr "Odebrat"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48
msgid "Remove all holes"
msgstr "Odebrat všechny otvory"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50
msgid "Remove all points"
msgstr "Odebrat všechny body"
-#: src/slic3r/GUI/GLCanvas3D.cpp:246
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35
+msgid "Remove all selection"
+msgstr "Smazat celý výběr"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:239
msgid "Remove detail"
msgstr "Ubrat detail"
-#: src/slic3r/GUI/Plater.cpp:879
-msgid "Remove device"
-msgstr "Odebrat zařízení"
-
#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:182
msgid "Remove extruder from sequence"
msgstr "Odebrat extruder ze seznamu"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4537 src/slic3r/GUI/Plater.cpp:3942
+#: src/slic3r/GUI/GLCanvas3D.cpp:4903 src/slic3r/GUI/Plater.cpp:3860
msgid "Remove instance"
msgstr "Odebrat instanci"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:160
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:154
msgid "Remove Instance of the selected object"
msgstr "Odebrat instanci vybraného objektu"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:153
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:161
msgid "Remove layer range"
msgstr "Odstranit rozsah vrstev"
-#: src/slic3r/GUI/Plater.cpp:3942
+#: src/slic3r/GUI/Plater.cpp:3860
msgid "Remove one instance of the selected object"
msgstr "Odebere jednu instanci vybraného objektu"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:95
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:98
msgid "Remove parameter"
msgstr "Odebrat parametr"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211
msgid "Remove point"
msgstr "Odebrat bod"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214
msgid "Remove point from selection"
msgstr "Odebrat bod z výběru"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47
msgid "Remove selected holes"
msgstr "Smazat oznaÄené otvory"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1371
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218
msgid "Remove selected points"
msgstr "Odebrat oznaÄené body"
-#: src/slic3r/GUI/Plater.cpp:3931 src/slic3r/GUI/Plater.cpp:3953
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:368
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:378
+msgid "Remove selection"
+msgstr "Odebrat výběr"
+
+#: src/slic3r/GUI/Plater.cpp:3849 src/slic3r/GUI/Plater.cpp:3871
msgid "Remove the selected object"
msgstr "Odstranit vybraný objekt"
-#: src/slic3r/GUI/ConfigWizard.cpp:453
+#: src/slic3r/GUI/ConfigWizard.cpp:456
msgid "Remove user profiles (a snapshot will be taken beforehand)"
msgstr "Odstranit uživatelské profily (předtím bude proveden snapshot)"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1636
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1765
msgid "Rename"
msgstr "Přejmenovat"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:589
msgid "Rename Object"
msgstr "Přejmenování objektu"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:589
msgid "Rename Sub-object"
msgstr "PÅ™ejmenování dílÄího objektu"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3803
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4266
msgid "Renaming"
msgstr "Přejmenování"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:115
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:150
msgid "Renaming of the G-code after copying to the selected destination folder has failed. Current path is %1%.tmp. Please try exporting again."
msgstr "Přejmenování G-codu po zkopírování do vybrané cílové složky se nezdařilo. Aktuální cesta je %1%.tmp. Zkuste to prosím znovu."
-#: src/libslic3r/PrintConfig.cpp:3515
+#: src/slic3r/GUI/Preferences.cpp:255
+msgid "Render"
+msgstr "Render"
+
+#: src/libslic3r/PrintConfig.cpp:3720
msgid "Render with a software renderer"
-msgstr "Vykreslení pomocí softwaru"
+msgstr "Vykreslování pomocí softwaru"
-#: src/libslic3r/PrintConfig.cpp:3516
+#: src/libslic3r/PrintConfig.cpp:3721
msgid "Render with a software renderer. The bundled MESA software renderer is loaded instead of the default OpenGL driver."
msgstr "Vykreslení pomocí softwaru. Namísto výchozího ovladaÄe OpenGL je naÄten dodaný softwarový renderer MESA."
-#: src/slic3r/GUI/MainFrame.cpp:911 src/libslic3r/PrintConfig.cpp:3447
+#: src/slic3r/GUI/MainFrame.cpp:1612 src/libslic3r/PrintConfig.cpp:3646
msgid "Repair"
msgstr "Oprava"
@@ -6036,39 +7145,39 @@ msgstr "Opravený soubor 3MF neobsahuje žádný objemové těleso"
msgid "Repairing model by the Netfabb service"
msgstr "Opravování modelu službou Netfabb"
-#: src/slic3r/GUI/MainFrame.cpp:524
+#: src/slic3r/GUI/MainFrame.cpp:1125
msgid "Repeat last quick slice"
msgstr "Opakovat poslední rychlé slicování"
-#: src/slic3r/GUI/MainFrame.cpp:524
+#: src/slic3r/GUI/MainFrame.cpp:1125
msgid "Repeat Last Quick Slice"
msgstr "Opakovat poslední rychlé slicování"
-#: src/slic3r/GUI/Tab.cpp:3083
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:477
msgid "Replace?"
msgstr "Nahradit?"
-#: src/slic3r/GUI/MainFrame.cpp:703
+#: src/slic3r/GUI/MainFrame.cpp:928 src/slic3r/GUI/MainFrame.cpp:1327
msgid "Report an I&ssue"
msgstr "Nahlá&sit chybu"
-#: src/slic3r/GUI/MainFrame.cpp:703
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:928 src/slic3r/GUI/MainFrame.cpp:1327
+#, possible-c-format
msgid "Report an issue on %s"
msgstr "Nahlásit chybu v programu %s"
-#: src/slic3r/Utils/PresetUpdater.cpp:713
-#, c-format
+#: src/slic3r/Utils/PresetUpdater.cpp:733
+#, possible-c-format
msgid "requires max. %s"
msgstr "vyžaduje max. %s"
-#: src/slic3r/Utils/PresetUpdater.cpp:710
-#, c-format
+#: src/slic3r/Utils/PresetUpdater.cpp:730
+#, possible-c-format
msgid "requires min. %s"
msgstr "vyžaduje min. %s"
-#: src/slic3r/Utils/PresetUpdater.cpp:705
-#, c-format
+#: src/slic3r/Utils/PresetUpdater.cpp:726
+#, possible-c-format
msgid "requires min. %s and max. %s"
msgstr "vyžaduje min. %s a max. %s"
@@ -6076,270 +7185,304 @@ msgstr "vyžaduje min. %s a max. %s"
msgid "Rescan"
msgstr "Skenovat"
-#: src/slic3r/GUI/Tab.cpp:1906
-msgid "Rescan serial ports"
-msgstr "Znovu prohledat sériové porty"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:313
+#: src/slic3r/GUI/GLCanvas3D.cpp:299
msgid "Reset"
msgstr "Výchozí"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1373
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220
msgid "Reset clipping plane"
msgstr "Obnovit řezovou rovinu"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:59
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:26
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58
msgid "Reset direction"
msgstr "Resetovat směr"
-#: src/slic3r/GUI/Plater.cpp:2723
+#: src/slic3r/GUI/Plater.cpp:2684
msgid "Reset Project"
msgstr "Resetovat Projekt"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:372
msgid "Reset rotation"
msgstr "Výchozí natoÄení"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:394
msgid "Reset Rotation"
msgstr "Výchozí NatoÄení"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:397
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:407
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409
msgid "Reset scale"
msgstr "Výchozí měřítko"
-#: src/slic3r/GUI/GLCanvas3D.cpp:252
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:136
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:118
+msgid "Reset selection"
+msgstr "Resetovat výběr"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:243
msgid "Reset to base"
msgstr "Obnovit na výchozí"
-#: src/slic3r/GUI/Tab.cpp:2394
+#: src/slic3r/GUI/Tab.cpp:2564
msgid "Reset to Filament Color"
-msgstr "Obnovit barvu filamentu"
+msgstr "Obnovit na barvu filamentu"
-#: src/libslic3r/PrintConfig.cpp:1511
+#: src/libslic3r/PrintConfig.cpp:1619
msgid "Resolution"
msgstr "Rozlišení"
-#: src/libslic3r/PrintConfig.cpp:1529
+#: src/libslic3r/PrintConfig.cpp:1637
msgid "Retract amount before wipe"
msgstr "Délka retrakce pÅ™ed oÄiÅ¡tÄ›ním"
-#: src/libslic3r/PrintConfig.cpp:1537
+#: src/libslic3r/PrintConfig.cpp:1645
msgid "Retract on layer change"
msgstr "Retrakce při změně vrstvy"
-#: src/slic3r/GUI/Tab.cpp:1324 src/slic3r/GUI/Tab.cpp:1383
-#: src/slic3r/GUI/Tab.cpp:2370
+#: src/slic3r/GUI/GCodeViewer.cpp:2494 src/slic3r/GUI/Tab.cpp:1670
+#: src/slic3r/GUI/Tab.cpp:2539
msgid "Retraction"
msgstr "Retrakce"
-#: src/libslic3r/PrintConfig.cpp:1523
+#: src/libslic3r/PrintConfig.cpp:1631
msgid "Retraction is not triggered when travel moves are shorter than this length."
msgstr "Retrakce není spuštěna, pokud jsou rychloposuny pojezdu kratší než tato délka."
-#: src/libslic3r/PrintConfig.cpp:1544
+#: src/libslic3r/PrintConfig.cpp:1652
msgid "Retraction Length"
msgstr "Vzdálenost retrakce"
-#: src/libslic3r/PrintConfig.cpp:1552
+#: src/libslic3r/PrintConfig.cpp:1660
msgid "Retraction Length (Toolchange)"
msgstr "Vzdálenost retrakce (při změně extruderu)"
-#: src/libslic3r/PrintConfig.cpp:1604 src/libslic3r/PrintConfig.cpp:1605
+#: src/libslic3r/PrintConfig.cpp:1712 src/libslic3r/PrintConfig.cpp:1713
msgid "Retraction Speed"
msgstr "Rychlost retrakce"
-#: src/slic3r/GUI/Tab.cpp:2386
+#: src/slic3r/GUI/Tab.cpp:2555
msgid "Retraction when tool is disabled (advanced settings for multi-extruder setups)"
msgstr "Retrakce pro neaktivní extruder (pokroÄilé nastavení pro tiskárny typu MultiMaterial)"
-#: src/slic3r/GUI/GUI_Preview.cpp:254
+#: src/slic3r/GUI/GCodeViewer.cpp:2528 src/slic3r/GUI/GUI_Preview.cpp:336
+#: src/slic3r/GUI/GUI_Preview.cpp:1472
msgid "Retractions"
msgstr "Retrakce"
-#: src/slic3r/GUI/MainFrame.cpp:673
+#: src/slic3r/GUI/Preferences.cpp:198
+msgid "Reverse direction of zoom with mouse wheel"
+msgstr "Reverzovat funkci koleÄka myÅ¡i pÅ™i zoomu"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1861 src/slic3r/GUI/Plater.cpp:4886
+msgid "Revert conversion from imperial units"
+msgstr "Vrátit převod z imperiálních jednotek"
+
+#: src/slic3r/GUI/MainFrame.cpp:970 src/slic3r/GUI/MainFrame.cpp:1290
msgid "Right"
msgstr "Zprava"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:402
+#: src/slic3r/GUI/GUI_ObjectList.cpp:449
msgid "Right button click the icon to change the object printable property"
msgstr "Klepnutím pravým tlaÄítkem myÅ¡i na ikonu zmÄ›níte nastavení tisku pro objekt"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:396
+#: src/slic3r/GUI/GUI_ObjectList.cpp:443
msgid "Right button click the icon to change the object settings"
msgstr "Klepnutím pravým tlaÄítkem myÅ¡i na ikonu zmÄ›níte nastavení objektu"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:359
+#: src/slic3r/GUI/GUI_ObjectList.cpp:406
msgid "Right button click the icon to fix STL through Netfabb"
msgstr "Klepnutím pravým tlaÄítkem myÅ¡i se spustí oprava STL souboru pomocí služby Netfabb"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211
msgid "Right click"
msgstr "Pravý klik"
-#: src/slic3r/GUI/GLCanvas3D.cpp:243
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31
+msgid "Right mouse button"
+msgstr "Pravé tlaÄítko myÅ¡i"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:237
msgid "Right mouse button:"
msgstr "Pravé tlaÄítko myÅ¡i:"
-#: src/slic3r/GUI/MainFrame.cpp:673
+#: src/slic3r/GUI/MainFrame.cpp:970 src/slic3r/GUI/MainFrame.cpp:1290
msgid "Right View"
msgstr "Pohled zprava"
-#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:449
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:480
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:499
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:517
-#: src/libslic3r/PrintConfig.cpp:3451
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:513
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:527
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562
+#: src/libslic3r/PrintConfig.cpp:3650
msgid "Rotate"
msgstr "OtoÄit"
-#: src/libslic3r/PrintConfig.cpp:3456
+#: src/libslic3r/PrintConfig.cpp:3655
msgid "Rotate around X"
msgstr "OtoÄit okolo osy X"
-#: src/libslic3r/PrintConfig.cpp:3461
+#: src/libslic3r/PrintConfig.cpp:3660
msgid "Rotate around Y"
msgstr "OtoÄit okolo osy Y"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:172
msgid "Rotate lower part upwards"
msgstr "OtoÄit spodní Äást Å™ezem dolů"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
msgid "Rotate selection 45 degrees CCW"
msgstr "OtoÄení výbÄ›ru o 45 ° proti smÄ›ru hodinových ruÄiÄek"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
msgid "Rotate selection 45 degrees CW"
msgstr "OtoÄení výbÄ›ru o 45 ° po smÄ›ru hodinových ruÄiÄek"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:458
-#: src/slic3r/GUI/Mouse3DController.cpp:304
-#: src/slic3r/GUI/Mouse3DController.cpp:321
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:210
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:224
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:506
+#: src/slic3r/GUI/Mouse3DController.cpp:288
+#: src/slic3r/GUI/Mouse3DController.cpp:309
msgid "Rotation"
msgstr "OtáÄení"
-#: src/libslic3r/PrintConfig.cpp:3457
+#: src/libslic3r/PrintConfig.cpp:3656
msgid "Rotation angle around the X axis in degrees."
msgstr "Úhel otoÄení kolem osy X ve stupních."
-#: src/libslic3r/PrintConfig.cpp:3462
+#: src/libslic3r/PrintConfig.cpp:3661
msgid "Rotation angle around the Y axis in degrees."
msgstr "Úhel otoÄení kolem osy Y ve stupních."
-#: src/libslic3r/PrintConfig.cpp:3452
+#: src/libslic3r/PrintConfig.cpp:3651
msgid "Rotation angle around the Z axis in degrees."
msgstr "Úhel otoÄení kolem osy Z ve stupních."
-#: src/slic3r/GUI/GUI_App.cpp:797
-#, c-format
+#: src/slic3r/GUI/DoubleSlider.cpp:1836
+msgid "Ruler mode"
+msgstr "Režim pravítka"
+
+#: src/slic3r/GUI/GUI_App.cpp:1474
+#, possible-c-format
msgid "Run %s"
msgstr "Spustit %s"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:128
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:478
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:163
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:520
msgid "Running post-processing scripts"
msgstr "Vykonávají se postprodukÄní skripty"
#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83
-#: src/libslic3r/PrintConfig.cpp:644 src/libslic3r/PrintConfig.cpp:688
-#: src/libslic3r/PrintConfig.cpp:703 src/libslic3r/PrintConfig.cpp:2408
-#: src/libslic3r/PrintConfig.cpp:2417 src/libslic3r/PrintConfig.cpp:2527
-#: src/libslic3r/PrintConfig.cpp:2535 src/libslic3r/PrintConfig.cpp:2543
-#: src/libslic3r/PrintConfig.cpp:2550 src/libslic3r/PrintConfig.cpp:2558
-#: src/libslic3r/PrintConfig.cpp:2566
+#: src/libslic3r/PrintConfig.cpp:680 src/libslic3r/PrintConfig.cpp:724
+#: src/libslic3r/PrintConfig.cpp:739 src/libslic3r/PrintConfig.cpp:2551
+#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2670
+#: src/libslic3r/PrintConfig.cpp:2678 src/libslic3r/PrintConfig.cpp:2686
+#: src/libslic3r/PrintConfig.cpp:2693 src/libslic3r/PrintConfig.cpp:2701
+#: src/libslic3r/PrintConfig.cpp:2709
msgid "s"
msgstr "s"
-#: src/slic3r/GUI/MainFrame.cpp:481 src/slic3r/GUI/MainFrame.cpp:750
+#: src/slic3r/GUI/MainFrame.cpp:1072 src/slic3r/GUI/MainFrame.cpp:1449
msgid "S&end G-code"
msgstr "Od&eslat G-code"
-#: src/slic3r/GUI/MainFrame.cpp:750
+#: src/slic3r/GUI/MainFrame.cpp:1449
msgid "S&end to print"
msgstr "Od&eslat do tiskárny"
-#. TRN Preset
-#: src/slic3r/GUI/Tab.cpp:3417
-#, c-format
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:642
+msgid "Save"
+msgstr "Uložit"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:72
+#, possible-c-format
msgid "Save %s as:"
msgstr "Uložit %s jako:"
-#: src/slic3r/GUI/MainFrame.cpp:826
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:1527
+#, possible-c-format
msgid "Save %s file as:"
msgstr "Uložit %s soubor jako:"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1046
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912
msgid "Save changes?"
msgstr "Uložit změny?"
-#: src/libslic3r/PrintConfig.cpp:3386
+#: src/libslic3r/PrintConfig.cpp:3585
msgid "Save config file"
msgstr "Uložit konfiguraÄní soubor"
-#: src/slic3r/GUI/MainFrame.cpp:925
+#: src/slic3r/GUI/MainFrame.cpp:1626
msgid "Save configuration as:"
msgstr "Uložit konfiguraci jako:"
-#: src/libslic3r/PrintConfig.cpp:3387
+#: src/libslic3r/PrintConfig.cpp:3586
msgid "Save configuration to the specified file."
msgstr "Uložit konfiguraci do zadaného souboru."
#. TRN "Save current Settings"
-#: src/slic3r/GUI/Tab.cpp:133
-#, c-format
+#: src/slic3r/GUI/Tab.cpp:203
+#, possible-c-format
msgid "Save current %s"
msgstr "Uložit stávající %s"
-#: src/slic3r/GUI/MainFrame.cpp:446
+#: src/slic3r/GUI/MainFrame.cpp:1028
msgid "Save current project file"
msgstr "Uložit stávající projekt"
-#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452
+#: src/slic3r/GUI/MainFrame.cpp:1032 src/slic3r/GUI/MainFrame.cpp:1034
msgid "Save current project file as"
msgstr "Uložit stávající projekt jako"
-#: src/slic3r/GUI/Plater.cpp:2604
+#: src/slic3r/GUI/Plater.cpp:2566
msgid "Save file as:"
msgstr "Uložit soubor jako:"
-#: src/slic3r/GUI/Plater.cpp:4839
+#: src/slic3r/GUI/Plater.cpp:4975
msgid "Save G-code file as:"
msgstr "Uložit G-code jako:"
-#: src/slic3r/GUI/MainFrame.cpp:899
+#: src/slic3r/GUI/MainFrame.cpp:1600
msgid "Save OBJ file (less prone to coordinate errors than STL) as:"
msgstr "Uložit soubor OBJ (méně náchylný na chyby souřadnic než STL) jako:"
-#: src/slic3r/GUI/Tab.hpp:443
+#: src/slic3r/GUI/SavePresetDialog.cpp:190
+#: src/slic3r/GUI/SavePresetDialog.cpp:196
msgid "Save preset"
msgstr "Uložit přednastavení"
-#: src/slic3r/GUI/MainFrame.cpp:980
+#: src/slic3r/GUI/MainFrame.cpp:1681
msgid "Save presets bundle as:"
msgstr "Uložit balík přednastavení jako:"
-#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452
+#: src/slic3r/GUI/MainFrame.cpp:1032 src/slic3r/GUI/MainFrame.cpp:1034
msgid "Save Project &as"
msgstr "Uložit Projekt j&ako"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:114
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:107
msgid "Save project (3mf)"
msgstr "Uložit projekt (3mf)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:115
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:108
msgid "Save project as (3mf)"
msgstr "Uložit projekt jako (3mf)"
-#: src/slic3r/GUI/Plater.cpp:4839
+#: src/slic3r/GUI/Plater.cpp:4975
msgid "Save SL1 file as:"
msgstr "Uložit SL1 soubor jako:"
-#: src/slic3r/GUI/MainFrame.cpp:838
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:744
+msgid "Save the selected options to preset \"%1%\"."
+msgstr "Uloží vybraná nastaneví do přednastavení \"%1%\"."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:740
+msgid "Save the selected options."
+msgstr "Uložte vybrané možnosti."
+
+#: src/slic3r/GUI/MainFrame.cpp:1539
msgid "Save zip file as:"
msgstr "Uložit ZIP soubor jako:"
@@ -6349,221 +7492,244 @@ msgstr "Uložit ZIP soubor jako:"
msgid "Saving mesh into the 3MF container failed."
msgstr "Ukládání meshe do 3MF kontejneru selhalo."
-#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:47
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:230
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:500
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:518
-#: src/libslic3r/PrintConfig.cpp:3466
+#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:78
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:238
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:547
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563
+#: src/libslic3r/PrintConfig.cpp:3665
msgid "Scale"
msgstr "Měřítko"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:459
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:507
msgid "Scale factors"
msgstr "Měřítka"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:196
-msgid ""
-"Scale selection to fit print volume\n"
-"in Gizmo scale"
-msgstr ""
-"Vyplnit tiskovou plochu aktivním výběrem\n"
-"v Gizmo režimu měřítko"
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1724
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1852
msgid "Scale the selected object to fit the print volume"
msgstr "Přizpůsobit měřítko vybraného objektu, aby se objekt vešel do tiksového objemu"
-#: src/libslic3r/PrintConfig.cpp:3475
+#: src/libslic3r/PrintConfig.cpp:3674
msgid "Scale to Fit"
msgstr "Vyplnit tiskový objem"
-#: src/slic3r/GUI/Selection.cpp:939
+#: src/slic3r/GUI/Selection.cpp:988
msgid "Scale To Fit"
msgstr "Vyplnit tiskový objem"
-#: src/libslic3r/PrintConfig.cpp:3476
+#: src/libslic3r/PrintConfig.cpp:3675
msgid "Scale to fit the given volume."
msgstr "Změnit velikost, aby se objekt vešel do zadaného tiskového prostoru."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1724
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1852
msgid "Scale to print volume"
msgstr "Změnit velikost podle tiskového objemu"
-#: src/libslic3r/PrintConfig.cpp:3467
+#: src/libslic3r/PrintConfig.cpp:3666
msgid "Scaling factor or percentage."
msgstr "Procentuální měřítko."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:505
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:545
msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue"
msgstr "Plánování nahrávání do `%1%`. Viz Okno -> Fronta nahrávaní do tiskového serveru"
-#: src/libslic3r/PrintConfig.cpp:1621
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:46
+msgid "Seam painting"
+msgstr "Malování pozice švu"
+
+#: src/libslic3r/PrintConfig.cpp:1729
msgid "Seam position"
msgstr "Pozice Å¡vu"
-#: src/libslic3r/PrintConfig.cpp:1642
+#: src/libslic3r/PrintConfig.cpp:1750
msgid "Seam preferred direction"
msgstr "Preferovaný směr švu"
-#: src/libslic3r/PrintConfig.cpp:1651
+#: src/libslic3r/PrintConfig.cpp:1759
msgid "Seam preferred direction jitter"
msgstr "Seam preferred direction jitter"
+#: src/slic3r/GUI/MainFrame.cpp:1207
+msgid "Searc&h"
+msgstr "Vy&hledávání"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4402 src/slic3r/GUI/GLCanvas3D.cpp:4957
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 src/slic3r/GUI/Search.cpp:426
+msgid "Search"
+msgstr "Vyhledávání"
+
+#: src/slic3r/GUI/ImGuiWrapper.cpp:803 src/slic3r/GUI/Search.cpp:460
+msgid "Search in English"
+msgstr "Hledat v angliÄtinÄ›"
+
+#: src/slic3r/GUI/MainFrame.cpp:1216
+msgid "Search in settings"
+msgstr "Vyhledávání v nastavení"
+
+#: src/slic3r/GUI/Tab.cpp:222
+msgid "Search in settings [%1%]"
+msgstr "Hledat v nastavení [%1%]"
+
#: src/slic3r/GUI/BonjourDialog.cpp:218
msgid "Searching for devices"
msgstr "Hledám zařízení"
-#: src/slic3r/GUI/Plater.cpp:2858
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:41
msgid "Searching for optimal orientation"
msgstr "Hledání optimální orientace"
-#: src/slic3r/GUI/GUI_App.cpp:1103
+#: src/slic3r/GUI/NotificationManager.hpp:321
+msgid "See more."
+msgstr "Více"
+
+#: src/slic3r/GUI/NotificationManager.hpp:322
+msgid "See Releases page."
+msgstr "Viz stránka s releasy."
+
+#: src/slic3r/GUI/GUI_App.cpp:1895
msgid "Select a gcode file:"
msgstr "Vyberte soubor gcode:"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:126
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:121
msgid "Select all objects"
msgstr "Vybrat všechny objekty"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1370
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217
msgid "Select all points"
msgstr "Vybrat všechny body"
-#: src/slic3r/GUI/ConfigWizard.cpp:1976
+#: src/slic3r/GUI/ConfigWizard.cpp:2487
msgid "Select all standard printers"
msgstr "Vybrat všechny standardní tiskárny"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1368
+#: src/slic3r/GUI/Plater.cpp:1422
+msgid "Select an action to apply to the file"
+msgstr "Vyberte jak chcete na soubor otevřít"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215
msgid "Select by rectangle"
msgstr "OznaÄit obdélníkovým výbÄ›rem myÅ¡i"
-#: src/slic3r/GUI/MainFrame.cpp:944 src/slic3r/GUI/MainFrame.cpp:1006
+#: src/slic3r/GUI/MainFrame.cpp:1645 src/slic3r/GUI/MainFrame.cpp:1707
msgid "Select configuration to load:"
msgstr "Zvolte konfiguraci k naÄtení:"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:82
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:88
msgid "Select coordinate space, in which the transformation will be performed."
msgstr "Vyberte souřadnicový prostor, ve kterém bude provedena transformace."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3971
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4458
msgid "Select extruder number:"
msgstr "Vyberte Äíslo extruderu:"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:138
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:134
msgid "Select Filament Settings Tab"
msgstr "Zobrazit panel Nastavení filamentu"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:136
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:132
msgid "Select Plater Tab"
msgstr "Zobrazit panel Podložka"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:137
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:133
msgid "Select Print Settings Tab"
msgstr "Zobrazit panel Nastavení tisku"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:139
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:135
msgid "Select Printer Settings Tab"
msgstr "Zobrazit panel Nastavení tiskárny"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1265
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1396
msgid "Select showing settings"
msgstr "Zvolte nastavení zobrazení"
-#: src/slic3r/GUI/GUI_App.cpp:629
+#: src/slic3r/GUI/GUI_App.cpp:1295
msgid "Select the language"
msgstr "Výběr jazyka"
-#: src/slic3r/GUI/Tab.cpp:57
+#: src/slic3r/GUI/Tab.cpp:108
msgid "Select the print profiles this profile is compatible with."
msgstr "Vyberte tiskové profily, s nimiž je tento profil kompatibilní."
-#: src/slic3r/GUI/Tab.cpp:51
+#: src/slic3r/GUI/Tab.cpp:102
msgid "Select the printers this profile is compatible with."
msgstr "Vyberte tiskárny, s nimiž je tento profil kompatibilní."
-#: src/slic3r/GUI/MainFrame.cpp:889
+#: src/slic3r/GUI/MainFrame.cpp:1590
msgid "Select the STL file to repair:"
msgstr "Vyberte STL soubor k opravÄ›:"
-#: src/slic3r/GUI/Preferences.cpp:237
+#: src/slic3r/GUI/Preferences.cpp:391
msgid "Select toolbar icon size in respect to the default one."
msgstr "Vyberte velikost ikon na panelu nástrojů vzhledem k výchozí velikosti."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3553
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4016
msgid "Select type of part"
msgstr "Vyberte typ souÄásti"
-#: src/slic3r/GUI/Plater.cpp:638
+#: src/slic3r/GUI/Plater.cpp:504
msgid "Select what kind of pad do you need"
msgstr "Vyberte, jaký typ podložky potřebujete"
-#: src/slic3r/GUI/Plater.cpp:498
+#: src/slic3r/GUI/Plater.cpp:364
msgid "Select what kind of support do you need"
msgstr "Vyberte typ podpěr, které potřebujete"
-#: src/slic3r/GUI/DoubleSlider.cpp:1917
-msgid ""
-"Select YES if you want to delete all saved tool changes, \n"
-"NO if you want all tool changes switch to color changes, \n"
-"or CANCEL to leave it unchanged."
-msgstr ""
-"Vyberte ANO, pokud chcete odstranit všechny uložené změny nástroje,\n"
-"NE, pokud chcete, aby se všechny změny nástroje přepnout na změny barev,\n"
-"nebo ZRUŠIT pro ponechání beze změny."
+#: src/slic3r/GUI/DoubleSlider.cpp:2135
+msgid "Select YES if you want to delete all saved tool changes, \nNO if you want all tool changes switch to color changes, \nor CANCEL to leave it unchanged."
+msgstr "Vyberte ANO, pokud chcete odstranit všechny uložené změny nástroje,\nNE, pokud chcete, aby se všechny změny nástroje přepnout na změny barev,\nnebo ZRUŠIT pro ponechání beze změny."
-#: src/slic3r/GUI/Selection.cpp:146
+#: src/slic3r/GUI/Selection.cpp:191
msgid "Selection-Add"
msgstr "Výběř - Přidání"
-#: src/slic3r/GUI/Selection.cpp:376
+#: src/slic3r/GUI/Selection.cpp:421
msgid "Selection-Add All"
msgstr "VýbÄ›r - OznaÄení vÅ¡eho"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3299
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3762
msgid "Selection-Add from list"
msgstr "Výběr - Přidání v seznamu"
-#: src/slic3r/GUI/GLCanvas3D.cpp:6598
+#: src/slic3r/GUI/GLCanvas3D.cpp:7193
msgid "Selection-Add from rectangle"
msgstr "Výběr - Přidání obdélníkovým výběrem"
-#: src/slic3r/GUI/Selection.cpp:256
+#: src/slic3r/GUI/Selection.cpp:301
msgid "Selection-Add Instance"
msgstr "Výběr - Přidání Instance"
-#: src/slic3r/GUI/Selection.cpp:219
+#: src/slic3r/GUI/Selection.cpp:264
msgid "Selection-Add Object"
msgstr "Výběr - Přidání Objektu"
-#: src/slic3r/GUI/Selection.cpp:187
+#: src/slic3r/GUI/Selection.cpp:232
msgid "Selection-Remove"
msgstr "Výběr - Odebrání"
-#: src/slic3r/GUI/Selection.cpp:402
+#: src/slic3r/GUI/Selection.cpp:447
msgid "Selection-Remove All"
msgstr "Výběr - Zrušení"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3291
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3754
msgid "Selection-Remove from list"
msgstr "Výběr - Odebrání v seznamu"
-#: src/slic3r/GUI/GLCanvas3D.cpp:6617
+#: src/slic3r/GUI/GLCanvas3D.cpp:7212
msgid "Selection-Remove from rectangle"
msgstr "Výběr - Odebrání obdélníkovým výběrem"
-#: src/slic3r/GUI/Selection.cpp:275
+#: src/slic3r/GUI/Selection.cpp:320
msgid "Selection-Remove Instance"
msgstr "Výběr - Odebrání Instance"
-#: src/slic3r/GUI/Selection.cpp:238
+#: src/slic3r/GUI/Selection.cpp:283
msgid "Selection-Remove Object"
msgstr "Výběr - Odebrání Objektu"
-#: src/slic3r/GUI/MainFrame.cpp:566
+#: src/slic3r/GUI/MainFrame.cpp:1172
msgid "Selects all objects"
msgstr "Vybrat všechny objekty"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Plater.cpp:5522
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 src/slic3r/GUI/Plater.cpp:5707
msgid "Send G-code"
msgstr "Odeslat G-code"
@@ -6571,29 +7737,25 @@ msgstr "Odeslat G-code"
msgid "Send G-Code to printer host"
msgstr "Odeslat G-Code do tiskového serveru"
-#: src/slic3r/GUI/MainFrame.cpp:481
+#: src/slic3r/GUI/MainFrame.cpp:1072
msgid "Send to print current plate as G-code"
msgstr "Odeslat k tisku stávající plochu jako G-code"
-#: src/slic3r/GUI/Plater.cpp:878 src/slic3r/GUI/Plater.cpp:5522
+#: src/slic3r/GUI/Plater.cpp:753 src/slic3r/GUI/Plater.cpp:5707
msgid "Send to printer"
msgstr "Odeslat do tiskárny"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1305
+#: src/slic3r/GUI/GLCanvas3D.cpp:1312
msgid "Seq."
msgstr "Sekv."
-#: src/slic3r/GUI/Tab.cpp:1231
+#: src/slic3r/GUI/Tab.cpp:1561
msgid "Sequential printing"
msgstr "SekvenÄní tisk"
-#: src/slic3r/GUI/Tab.cpp:1901 src/libslic3r/PrintConfig.cpp:1661
-msgid "Serial port"
-msgstr "Sériový port"
-
-#: src/libslic3r/PrintConfig.cpp:1669
-msgid "Serial port speed"
-msgstr "Rychlost sériového portu"
+#: src/slic3r/GUI/Preferences.cpp:230
+msgid "Sequential slider applied only to top layer"
+msgstr "Použití sekvenÄního posuvníku pouze na horní vrstvu"
#: src/slic3r/GUI/FirmwareDialog.cpp:807
msgid "Serial port:"
@@ -6603,17 +7765,16 @@ msgstr "Sériový port:"
msgid "Service name"
msgstr "Název služby"
-#: src/slic3r/GUI/Tab.cpp:1802 src/slic3r/GUI/Tab.cpp:2046
-#: src/slic3r/GUI/Tab.cpp:3176
+#: src/slic3r/GUI/Tab.cpp:3509 src/slic3r/GUI/Tab.cpp:3588
msgid "Set"
msgstr "Nastavit"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1599
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1611
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1728
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1740
msgid "Set as a Separated Object"
msgstr "Změnit na samostatný objekt"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1611
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1740
msgid "Set as a Separated Objects"
msgstr "Převést na oddělené objekty"
@@ -6621,7 +7782,7 @@ msgstr "Převést na oddělené objekty"
msgid "Set extruder change for every"
msgstr "Nastavit změnu extruderu po každých"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1671
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1800
msgid "Set extruder for selected items"
msgstr "Zvolte extruder pro vybrané položky"
@@ -6629,7 +7790,7 @@ msgstr "Zvolte extruder pro vybrané položky"
msgid "Set extruder sequence"
msgstr "Nastavte pořadí extruderu"
-#: src/slic3r/GUI/DoubleSlider.cpp:1532
+#: src/slic3r/GUI/DoubleSlider.cpp:1728
msgid "Set extruder sequence for the entire print"
msgstr "Nastavení sekvence extruderů pro celý tisk"
@@ -6637,84 +7798,100 @@ msgstr "Nastavení sekvence extruderů pro celý tisk"
msgid "Set extruder(tool) sequence"
msgstr "Nastavte pořadí extruderu(nástroje)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:243
+msgid "Set left thumb as active"
+msgstr "Nastavit levý ukazatel jako aktivní"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
+msgid "Set lower thumb as active"
+msgstr "Nastavit spodní ukazatel jako aktivní"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
msgid "Set lower thumb to current slider thumb"
msgstr "Aktivovat spodní ukazatel aktivního posuvníku"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:297
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:305
msgid "Set Mirror"
msgstr "Zrcadlení"
-#: src/slic3r/GUI/Plater.cpp:3944
+#: src/slic3r/GUI/Plater.cpp:3862
msgid "Set number of instances"
msgstr "Zadat poÄet instancí"
-#: src/slic3r/GUI/Plater.cpp:4756
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:4860
+#, possible-c-format
msgid "Set numbers of copies to %d"
msgstr "Nastavení poÄtu kopií na %d"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:781
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:828
msgid "Set Orientation"
msgstr "Změna orientace"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:750
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:797
msgid "Set Position"
msgstr "Nastavení pozice"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4581 src/slic3r/GUI/Selection.cpp:1513
msgid "Set Printable"
msgstr "Zvolen příznak Tisknout objekt"
-#: src/slic3r/GUI/Selection.cpp:1475
+#: src/slic3r/GUI/Selection.cpp:1515
msgid "Set Printable Instance"
msgstr "Zvolen příznak Tisknout Instanci"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:846
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:244
+msgid "Set right thumb as active"
+msgstr "Nastavit pravý ukazatel jako aktivní"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1836
+msgid "Set ruler mode"
+msgstr "Nastavení režimu pravítka"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:893
msgid "Set Scale"
msgstr "Nastavení měřítka"
-#: src/libslic3r/PrintConfig.cpp:2393
+#: src/libslic3r/PrintConfig.cpp:2536
msgid "Set the actual LCD display orientation inside the SLA printer. Portrait mode will flip the meaning of display width and height parameters and the output images will be rotated by 90 degrees."
msgstr "Nastavte skuteÄnou orientaci LCD displeje uvnitÅ™ SLA tiskárny. Režim Orientace na výšku pÅ™evrátí význam parametrů šířky a výšky a výstupní obrazy budou otoÄeny o 90 stupňů."
-#: src/slic3r/GUI/ConfigWizard.cpp:932
+#: src/slic3r/GUI/ConfigWizard.cpp:1298
msgid "Set the shape of your printer's bed."
msgstr "Nastavte tvar a rozměry vaší tiskové podložky."
-#: src/libslic3r/PrintConfig.cpp:556
+#: src/libslic3r/PrintConfig.cpp:592
msgid "Set this to a non-zero value to allow a manual extrusion width. If left to zero, Slic3r derives extrusion widths from the nozzle diameter (see the tooltips for perimeter extrusion width, infill extrusion width etc). If expressed as percentage (for example: 230%), it will be computed over layer height."
-msgstr "Nastavením kladné hodnoty povolíte manuální šířku extruze. Pokud je hodnota ponechána na nule, Slic3r odvozuje šířku extruze z průmÄ›ru trysky (viz nápovÄ›dy pro šířku extruze perimetru, šířku extruze výplnÄ› apod.). Pokud je hodnota vyjádÅ™ena procenty (například: 230%), vypoÄítá se z výšky vrstvy."
+msgstr "Nastavením kladné hodnoty povolíte manuální nastavení šířky extruze. Pokud je hodnota ponechána na nule, Slic3r odvozuje šířku extruze z průmÄ›ru trysky (viz nápovÄ›dy pro šířku extruze perimetru, šířku extruze výplnÄ› apod.). Pokud je hodnota vyjádÅ™ena procenty (například: 230%), vypoÄítá se z výšky vrstvy."
-#: src/libslic3r/PrintConfig.cpp:448
+#: src/libslic3r/PrintConfig.cpp:484
msgid "Set this to a non-zero value to set a manual extrusion width for external perimeters. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 200%), it will be computed over layer height."
msgstr "Nastavením na kladnou hodnotu, definuje šířku manuální extruze pro vnÄ›jší obvod. Pokud je ponechána nula, použije se výchozí šířka extruze, pokud je nastavena, jinak se použije průmÄ›r trysky 1,125 x. Pokud je hodnota vyjádÅ™ena jako procento (například 200%), vypoÄítá se podle výšky vrstvy."
-#: src/libslic3r/PrintConfig.cpp:878
+#: src/libslic3r/PrintConfig.cpp:920
msgid "Set this to a non-zero value to set a manual extrusion width for first layer. You can use this to force fatter extrudates for better adhesion. If expressed as percentage (for example 120%) it will be computed over first layer height. If set to zero, it will use the default extrusion width."
-msgstr "Nastavením kladné hodnoty zvolíte manuální šířku vytlaÄování pro první vrstvu. Toto můžete použít k vytlaÄování tlustší extruze pro lepší pÅ™ilnavost. Pokud je vyjádÅ™eno jako procenty (například 120%), bude vypoÄteno z výšky první vrstvy. Pokud je nastavena na nulu, použije se výchozí šířka vytlaÄování."
+msgstr "Nastavením kladné hodnoty povolíte manuální nastavení šířky vytlaÄování pro první vrstvu. Toto můžete použít k vytlaÄování tlustší extruze pro lepší pÅ™ilnavost. Pokud je vyjádÅ™eno jako procenty (například 120%), bude vypoÄteno z výšky první vrstvy. Pokud je nastavena na nulu, použije se výchozí šířka vytlaÄování."
-#: src/libslic3r/PrintConfig.cpp:1758
+#: src/libslic3r/PrintConfig.cpp:1873
msgid "Set this to a non-zero value to set a manual extrusion width for infill for solid surfaces. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 90%) it will be computed over layer height."
msgstr "Zadejte kladnou hodnotu, chcete-li nastavit manuálnÄ› šířku extruze pro výplň plných povrchů. Pokud je ponechána nula, použije se standardní šířka extruze, pokud je nastavena, jinak se použije průmÄ›r trysky 1,125 x. Pokud je vyjádÅ™ena procenty (například 90%), bude vypoÄtena z výšky vrstvy."
-#: src/libslic3r/PrintConfig.cpp:2107
+#: src/libslic3r/PrintConfig.cpp:2250
msgid "Set this to a non-zero value to set a manual extrusion width for infill for top surfaces. You may want to use thinner extrudates to fill all narrow regions and get a smoother finish. If left zero, default extrusion width will be used if set, otherwise nozzle diameter will be used. If expressed as percentage (for example 90%) it will be computed over layer height."
msgstr "Zadejte kladnou hodnotu, chcete-li nastavit manuálnÄ› šířku extruze pro výplň vrchních ploch. Možná budete chtít použít tenÄí extruzi, abyste vyplnili vÅ¡echny úzké oblasti a získali hladší povrch. Pokud je ponechána nula, použije se výchozí šířka extruze, pokud je nastavena, jinak se použije průmÄ›r trysky. Pokud je vyjádÅ™ena procenty (například 90%), bude vypoÄtena z výšky vrstvy."
-#: src/libslic3r/PrintConfig.cpp:1011
+#: src/libslic3r/PrintConfig.cpp:1055
msgid "Set this to a non-zero value to set a manual extrusion width for infill. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. You may want to use fatter extrudates to speed up the infill and make your parts stronger. If expressed as percentage (for example 90%) it will be computed over layer height."
-msgstr "Nastavením kladné hodnoty upravíte manuálnÄ› šířku extruze pro výplň. Pokud je ponechána nula, použije se standardní šířka extruze, pokud je nastavena, jinak se použije průmÄ›r trysky 1,125 x. Je možné, že budete chtít použít tlustší extruze, pro zrychlení výplnÄ› a zpevnÄ›ní vaÅ¡ich výtisků. Pokud je vyjádÅ™eno jako procenty (například 90%), bude vypoÄteno z výšky vrstvy."
+msgstr "Nastavením kladné hodnoty povolíte manuální nastavení šířky extruze pro výplň. Pokud je ponechána nula, použije se standardní šířka extruze, pokud je nastavena, jinak se použije průmÄ›r trysky 1,125 x. Je možné, že budete chtít použít tlustší extruze, pro zrychlení výplnÄ› a zpevnÄ›ní vaÅ¡ich výtisků. Pokud je vyjádÅ™eno jako procenty (například 90%), bude vypoÄteno z výšky vrstvy."
-#: src/libslic3r/PrintConfig.cpp:1419
+#: src/libslic3r/PrintConfig.cpp:1527
msgid "Set this to a non-zero value to set a manual extrusion width for perimeters. You may want to use thinner extrudates to get more accurate surfaces. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 200%) it will be computed over layer height."
msgstr "Nastavením na kladnou hodnotu nastavíte manuálnÄ› šířku vytlaÄování perimetrů. Chcete-li získat pÅ™esnÄ›jší povrchy, můžete použít tenÄí extruze. Pokud je ponechána nula, použije se standardní šířka extruze, pokud je nastavena, jinak se použije průmÄ›r trysky 1,125 x. Pokud je vyjádÅ™eno procenty (například 200%), vypoÄte se z výšky vrstvy."
-#: src/libslic3r/PrintConfig.cpp:1948
+#: src/libslic3r/PrintConfig.cpp:2090
msgid "Set this to a non-zero value to set a manual extrusion width for support material. If left zero, default extrusion width will be used if set, otherwise nozzle diameter will be used. If expressed as percentage (for example 90%) it will be computed over layer height."
msgstr "Zadejte kladnou hodnotu, chcete-li nastavit manuálnÄ› šířku extruze pro podpÄ›ry. Pokud je ponechána nula, použije se výchozí šířka extruze, pokud je nastavena, jinak se použije průmÄ›r trysky. Pokud je vyjádÅ™ena procenty (například 90%), bude vypoÄtena z výšky vrstvy."
-#: src/libslic3r/PrintConfig.cpp:512
+#: src/libslic3r/PrintConfig.cpp:548
msgid "Set this to the clearance radius around your extruder. If the extruder is not centered, choose the largest value for safety. This setting is used to check for collisions and to display the graphical preview in the plater."
msgstr "Zadejte horizontální rádius kolizního prostoru okolo extruderu. Pokud tryska není v centru tohoto rádiusu, zvolte nejdelší vzdálenost. Toto nastavení slouží ke kontrole kolizí a zobrazení grafického náhledu na podložce."
@@ -6722,87 +7899,98 @@ msgstr "Zadejte horizontální rádius kolizního prostoru okolo extruderu. Poku
msgid "Set this to the maximum height that can be reached by your extruder while printing."
msgstr "Nastavte tuto hodnotu na maximální výšku, která může být dosažena extruderem během tisku."
-#: src/libslic3r/PrintConfig.cpp:501
+#: src/libslic3r/PrintConfig.cpp:537
msgid "Set this to the vertical distance between your nozzle tip and (usually) the X carriage rods. In other words, this is the height of the clearance cylinder around your extruder, and it represents the maximum depth the extruder can peek before colliding with other printed objects."
msgstr "Zadejte vertikální vzdálenost mezi tryskou a (obvykle) tyÄemi osy X. Jinými slovy, je to výška kolizního prostoru okolo extruderu a pÅ™edstavuje maximální hloubku, které může extruder dosáhnout pÅ™ed kolizí s jinými, již vytiÅ¡tÄ›nými, objekty."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4581 src/slic3r/GUI/Selection.cpp:1513
msgid "Set Unprintable"
msgstr "Odebrán příznak Tisknout objekt"
-#: src/slic3r/GUI/Selection.cpp:1475
+#: src/slic3r/GUI/Selection.cpp:1515
msgid "Set Unprintable Instance"
msgstr "Odebrán příznak Tisknout Instanci"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:221
+msgid "Set upper thumb as active"
+msgstr "Nastavit horní ukazatel jako aktivní"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
msgid "Set upper thumb to current slider thumb"
msgstr "Aktivovat horní ukazatel aktivního posuvníku"
-#: src/libslic3r/PrintConfig.cpp:3509
-msgid ""
-"Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:trace\n"
-"For example. loglevel=2 logs fatal, error and warning level messages."
-msgstr ""
-"Zvolte úroveň logování: 0:fatalní chyby, 1:chyby, 2:varování, 3:info, 4:ladění, 5:trasování\n"
-"Například. loglevel=2 zaznamenává fatální chyby, chyby a varovné zprávy."
+#: src/libslic3r/PrintConfig.cpp:3714
+msgid "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:trace\nFor example. loglevel=2 logs fatal, error and warning level messages."
+msgstr "Zvolte úroveň logování: 0:fatalní chyby, 1:chyby, 2:varování, 3:info, 4:ladění, 5:trasování\nNapříklad. loglevel=2 zaznamenává fatální chyby, chyby a varovné zprávy."
-#: src/slic3r/GUI/BedShapeDialog.cpp:155
+#: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/MainFrame.cpp:1969
msgid "Settings"
msgstr "Nastavení"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2507
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2899
msgid "Settings for height range"
msgstr "Nastavení pro výškový rozsah"
-#: src/slic3r/GUI/ConfigManipulation.cpp:162
+#: src/slic3r/GUI/Preferences.cpp:431
+msgid "Settings in non-modal window"
+msgstr "Nastavení v nemodálním okně"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:161
msgid "Shall I adjust those settings for supports?"
msgstr "Mám upravit tato nastavení pro podpěry?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:89
+#: src/slic3r/GUI/ConfigManipulation.cpp:88
msgid "Shall I adjust those settings in order to enable Spiral Vase?"
msgstr "Mám tato nastavení upravit tak, aby bylo možné povolit režim Váza?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:119
+#: src/slic3r/GUI/ConfigManipulation.cpp:118
msgid "Shall I adjust those settings in order to enable the Wipe Tower?"
msgstr "Mám tato nastavení upravit tak, aby bylo možné povolit Čistící Věž?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:210
+#: src/slic3r/GUI/ConfigManipulation.cpp:209
msgid "Shall I switch to rectilinear fill pattern?"
msgstr "Mám pÅ™epnout na přímoÄarý vzor výplnÄ›?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:139
+#: src/slic3r/GUI/ConfigManipulation.cpp:138
msgid "Shall I synchronize support layers in order to enable the Wipe Tower?"
msgstr "Mám synchronizovat vrstvy podpěr, aby bylo možné zapnout Čistící Věž?"
-#: src/slic3r/GUI/BedShapeDialog.cpp:66 src/slic3r/GUI/GUI_ObjectList.cpp:2059
+#: src/slic3r/GUI/BedShapeDialog.cpp:156 src/slic3r/GUI/BedShapeDialog.cpp:222
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2215
msgid "Shape"
msgstr "Tvar"
-#: src/slic3r/GUI/GUI_Preview.cpp:256
+#: src/slic3r/GUI/GUI_Preview.cpp:338 src/slic3r/GUI/GUI_Preview.cpp:1478
msgid "Shells"
msgstr "Skořepiny"
-#: src/slic3r/GUI/GLCanvas3D.cpp:249
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33
+msgid "Shift + Left mouse button"
+msgstr "Shift + levé tlaÄítko myÅ¡i"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:241
msgid "Shift + Left mouse button:"
msgstr "Shift + Levé tlaÄítko myÅ¡i:"
-#: src/slic3r/GUI/GLCanvas3D.cpp:255
+#: src/slic3r/GUI/GLCanvas3D.cpp:245
msgid "Shift + Right mouse button:"
msgstr "Shift + Pravé tlaÄítko myÅ¡i:"
-#: src/slic3r/GUI/GUI_Preview.cpp:231
+#: src/slic3r/GUI/GUI_Preview.cpp:286 src/slic3r/GUI/GUI_Preview.cpp:288
msgid "Show"
msgstr "Zobrazit"
-#: src/slic3r/GUI/MainFrame.cpp:701
+#: src/slic3r/GUI/MainFrame.cpp:926 src/slic3r/GUI/MainFrame.cpp:1325
msgid "Show &Configuration Folder"
msgstr "Otevřít adresář s &konfiguracemi"
-#: src/slic3r/GUI/MainFrame.cpp:676
+#: src/slic3r/GUI/MainFrame.cpp:1294
msgid "Show &labels"
msgstr "Zobrazit &popisky"
-#: src/slic3r/GUI/MainFrame.cpp:705
+#: src/slic3r/GUI/MainFrame.cpp:933 src/slic3r/GUI/MainFrame.cpp:937
+#: src/slic3r/GUI/MainFrame.cpp:1329
msgid "Show about dialog"
msgstr "Zobrazit okno o Slic3ru"
@@ -6810,549 +7998,619 @@ msgstr "Zobrazit okno o Slic3ru"
msgid "Show advanced settings"
msgstr "Zobrazit rozšířená nastavení"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:159
+#: src/slic3r/GUI/Preferences.cpp:120
+msgid "Show drop project dialog"
+msgstr "Zobrazit dialogové okno při přetažení projektu"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:157
msgid "Show error message"
msgstr "Zobrazit chybovou hlášku"
-#: src/slic3r/GUI/Preferences.cpp:95
+#: src/slic3r/GUI/DoubleSlider.cpp:1832
+msgid "Show estimated print time"
+msgstr "Zobrazit odhadovanou dobu tisku"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1832
+msgid "Show estimated print time on the ruler"
+msgstr "Zobrazit odhadovanou dobu tisku na pravítku"
+
+#: src/slic3r/GUI/Preferences.cpp:112
msgid "Show incompatible print and filament presets"
msgstr "Zobrazit nekompatibilní přednastavení tisku a filamentu"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:151
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:145
msgid "Show keyboard shortcuts list"
msgstr "Zobrazit přehled klávesových zkratek"
-#: src/slic3r/GUI/MainFrame.cpp:676
+#: src/slic3r/GUI/GCodeViewer.cpp:2591
+msgid "Show normal mode"
+msgstr "V normálním režimu"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1828
+msgid "Show object height"
+msgstr "Zobrazit výšku objektu"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1828
+msgid "Show object height on the ruler"
+msgstr "Zobrazit výšku objektu na pravítku"
+
+#: src/slic3r/GUI/MainFrame.cpp:1294
msgid "Show object/instance labels in 3D scene"
msgstr "Zobrazit popisky objektů / instancí ve 3D scéně"
+#: src/slic3r/GUI/Preferences.cpp:213
+msgid "Show sidebar collapse/expand button"
+msgstr "Zobrazit tlaÄítko sbalit/rozbalit postranní panel"
+
#: src/slic3r/GUI/WipeTowerDialog.cpp:377
msgid "Show simplified settings"
msgstr "Zobrazit jednoduché nastavení"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:52
+#: src/slic3r/GUI/Preferences.cpp:169 src/slic3r/GUI/Preferences.cpp:171
+msgid "Show splash screen"
+msgstr "Zobrazovat úvodní obrazovku"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2586
+msgid "Show stealth mode"
+msgstr "Tichý režim"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51
msgid "Show supports"
msgstr "Zobrazit podpěry"
-#: src/slic3r/GUI/MainFrame.cpp:699
+#: src/slic3r/GUI/MainFrame.cpp:924 src/slic3r/GUI/MainFrame.cpp:1323
msgid "Show system information"
msgstr "Zobrazit systémové informace"
-#: src/slic3r/GUI/MainFrame.cpp:626
+#: src/slic3r/GUI/MainFrame.cpp:1234
msgid "Show the 3D editing view"
msgstr "Zobrazit 3D editaci"
-#: src/slic3r/GUI/MainFrame.cpp:629
+#: src/slic3r/GUI/MainFrame.cpp:1237
msgid "Show the 3D slices preview"
msgstr "Zobrazit 3D náhled vrstev"
-#: src/slic3r/GUI/MainFrame.cpp:617
+#: src/slic3r/GUI/MainFrame.cpp:1224
msgid "Show the filament settings"
msgstr "Zobrazit nastavení filamentu"
-#: src/libslic3r/PrintConfig.cpp:3372
+#: src/libslic3r/PrintConfig.cpp:3571
msgid "Show the full list of print/G-code configuration options."
msgstr "Zobrazit kompletní seznam možností konfigurace tisku / G-codu."
-#: src/libslic3r/PrintConfig.cpp:3377
+#: src/libslic3r/PrintConfig.cpp:3576
msgid "Show the full list of SLA print configuration options."
msgstr "Zobrazit kompletní seznam možností konfigurace SLA tisku."
-#: src/slic3r/GUI/MainFrame.cpp:708
+#: src/slic3r/GUI/MainFrame.cpp:941 src/slic3r/GUI/MainFrame.cpp:1332
msgid "Show the list of the keyboard shortcuts"
msgstr "Zobrazit seznam klávesových zkratek"
-#: src/slic3r/GUI/MainFrame.cpp:606
+#: src/slic3r/GUI/MainFrame.cpp:1216
msgid "Show the plater"
msgstr "Zobrazit podložku"
-#: src/slic3r/GUI/MainFrame.cpp:614
+#: src/slic3r/GUI/MainFrame.cpp:1221
msgid "Show the print settings"
msgstr "Zobrazit nastavení tisku"
-#: src/slic3r/GUI/MainFrame.cpp:621
+#: src/slic3r/GUI/MainFrame.cpp:1228
msgid "Show the printer settings"
msgstr "Zobrazit nastavení tiskárny"
-#: src/libslic3r/PrintConfig.cpp:3366
+#: src/libslic3r/PrintConfig.cpp:3565
msgid "Show this help."
msgstr "Zobrazí tuto nápovědu."
-#: src/slic3r/GUI/MainFrame.cpp:701
+#: src/slic3r/GUI/MainFrame.cpp:926 src/slic3r/GUI/MainFrame.cpp:1325
msgid "Show user configuration folder (datadir)"
msgstr "Zobrazit uživatelský adresář konfigurace (datadir)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:185
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:182
msgid "Show/Hide 3Dconnexion devices settings dialog"
msgstr "Zobrazit / skrýt dialogové okno nastavení zařízení 3Dconnexion"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
-msgid "Show/Hide Legend"
-msgstr "Zobrazit/Skrýt Legendu"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
+msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled"
+msgstr "Zobrazit/skrýt okno s nastavením 3Dconnexion zařízení, pokud je zaškrtnuto"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:146
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+msgid "Show/Hide Legend & Estimated printing time"
+msgstr "Zobrazit/skrýt legendu a odhadované tiskové Äasy"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+msgid "Show/Hide Legend and Estimated printing time"
+msgstr "Zobrazit/skrýt legendu a odhadované tiskové Äasy"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:141
msgid "Show/Hide object/instance labels"
msgstr "Zobrazit/skrýt popisky objektů/instancí"
-#: src/slic3r/GUI/GUI_App.cpp:813 src/slic3r/GUI/wxExtensions.cpp:753
+#: src/slic3r/GUI/GUI_App.cpp:1504 src/slic3r/GUI/wxExtensions.cpp:673
msgid "Simple"
msgstr "Jednoduchý"
-#: src/slic3r/GUI/ConfigWizard.cpp:820
+#: src/slic3r/GUI/ConfigWizard.cpp:1179
msgid "Simple mode"
msgstr "Jednoduchý režim"
-#: src/slic3r/GUI/GUI_App.cpp:813
+#: src/slic3r/GUI/GUI_App.cpp:1504
msgid "Simple View Mode"
msgstr "Jednoduchý režim"
-#: src/slic3r/GUI/Tab.cpp:2298 src/slic3r/GUI/Tab.cpp:2306
+#: src/slic3r/GUI/Tab.cpp:2467 src/slic3r/GUI/Tab.cpp:2475
msgid "Single extruder MM setup"
msgstr "Nastavení jednoho extruderu MM"
-#: src/libslic3r/PrintConfig.cpp:1845
+#: src/libslic3r/PrintConfig.cpp:1987
msgid "Single Extruder Multi Material"
msgstr "MultiMaterial tisk s jedním extrudérem"
-#: src/slic3r/GUI/Tab.cpp:1867
-msgid ""
-"Single Extruder Multi Material is selected, \n"
-"and all extruders must have the same diameter.\n"
-"Do you want to change the diameter for all extruders to first extruder nozzle diameter value?"
-msgstr ""
-"Je zvolená Multi Materiálová tiskárna s jedním extruderem,\n"
-"a proto všechny extrudery musí mít stejný průměr.\n"
-"Chcete nastavit průměry všech extruderových trysek podle průměru prvního extruderu?"
+#: src/slic3r/GUI/Tab.cpp:2101
+msgid "Single Extruder Multi Material is selected, \nand all extruders must have the same diameter.\nDo you want to change the diameter for all extruders to first extruder nozzle diameter value?"
+msgstr "Je zvolená Multi Materiálová tiskárna s jedním extruderem,\na proto všechny extrudery musí mít stejný průměr.\nChcete nastavit průměry všech extruderových trysek podle průměru prvního extruderu?"
-#: src/slic3r/GUI/Tab.cpp:2307
+#: src/slic3r/GUI/Tab.cpp:2476
msgid "Single extruder multimaterial parameters"
msgstr "Parametry jednoho multi materiálového extruderu"
-#: src/slic3r/GUI/BedShapeDialog.cpp:77
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:232 src/slic3r/GUI/Plater.cpp:160
-#: src/slic3r/GUI/Tab.cpp:2324
+#: src/slic3r/GUI/Preferences.cpp:120 src/libslic3r/PrintConfig.cpp:3689
+msgid "Single instance mode"
+msgstr "Režim jedné instance"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:93
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:240 src/slic3r/GUI/Plater.cpp:166
+#: src/slic3r/GUI/Tab.cpp:2493
msgid "Size"
msgstr "Rozměr"
-#: src/slic3r/GUI/Tab.cpp:1797 src/slic3r/GUI/Tab.cpp:2041
+#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:2241
msgid "Size and coordinates"
msgstr "RozmÄ›ry a poÄátek"
-#: src/slic3r/GUI/BedShapeDialog.cpp:78
+#: src/slic3r/GUI/BedShapeDialog.cpp:110
msgid "Size in X and Y of the rectangular plate."
msgstr "Rozměr obdélníkové tiskové podložky v ose X a Y."
-#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1111
-#: src/libslic3r/ExtrusionEntity.cpp:318
+#: src/slic3r/GUI/GUI_Preview.cpp:310 src/slic3r/GUI/Tab.cpp:1439
+#: src/libslic3r/ExtrusionEntity.cpp:323 src/libslic3r/ExtrusionEntity.cpp:354
msgid "Skirt"
msgstr "Obrys"
-#: src/slic3r/GUI/Tab.cpp:1110
+#: src/slic3r/GUI/Tab.cpp:1438
msgid "Skirt and brim"
msgstr "Obrys a límec"
-#: src/libslic3r/PrintConfig.cpp:1687
+#: src/libslic3r/PrintConfig.cpp:1795
msgid "Skirt height"
msgstr "Výška obrysu"
-#: src/libslic3r/PrintConfig.cpp:1696
+#: src/libslic3r/PrintConfig.cpp:1811
msgid "Skirt Loops"
msgstr "PoÄet obrysových smyÄek"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1334
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1181
msgid "SLA gizmo keyboard shortcuts"
msgstr "Klávesové zkratky pro SLA gizma"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1058
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:924
msgid "SLA gizmo turned off"
msgstr "UkonÄení režimu SLA gizmo"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1017
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897
msgid "SLA gizmo turned on"
msgstr "Vstup do režimu SLA gizmo"
-#: src/slic3r/GUI/Plater.cpp:818 src/slic3r/GUI/Preset.cpp:1524
+#: src/slic3r/GUI/Plater.cpp:693 src/libslic3r/Preset.cpp:1303
msgid "SLA material"
msgstr "SLA materiál"
-#: src/slic3r/GUI/ConfigWizard.cpp:2015
+#: src/slic3r/GUI/ConfigWizard.cpp:2526
msgid "SLA Material Profiles Selection"
msgstr "Výběr SLA materiálových profilů"
-#: src/libslic3r/PrintConfig.cpp:2470 src/libslic3r/PrintConfig.cpp:2471
+#: src/libslic3r/PrintConfig.cpp:2613 src/libslic3r/PrintConfig.cpp:2614
msgid "SLA material type"
msgstr "Typ SLA materiálu"
-#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2015
+#: src/slic3r/GUI/ConfigWizard.cpp:1872 src/slic3r/GUI/ConfigWizard.cpp:2526
msgid "SLA Materials"
msgstr "SLA Materiály"
-#: src/slic3r/GUI/Preset.cpp:1523
+#: src/libslic3r/Preset.cpp:1302
msgid "SLA print"
msgstr "SLA tisk"
-#: src/libslic3r/PrintConfig.cpp:2578
+#: src/libslic3r/PrintConfig.cpp:2721
msgid "SLA print material notes"
msgstr "Poznámky pro SLA materiál"
-#: src/slic3r/GUI/Plater.cpp:817
+#: src/slic3r/GUI/Plater.cpp:692
msgid "SLA print settings"
msgstr "Nastavení SLA tisku"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:996
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869
msgid "SLA Support Points"
msgstr "SLA Podpěrné Body"
-#: src/slic3r/GUI/GLCanvas3D.cpp:687
-msgid "SLA supports outside the print area were detected"
-msgstr "Byly zjištěny SLA podpěry mimo tiskovou oblast"
+#: src/slic3r/GUI/GLCanvas3D.cpp:635
+msgid "SLA supports outside the print area were detected."
+msgstr "Byly zjištěny SLA podpěry mimo tiskovou oblast."
-#: src/slic3r/GUI/ConfigWizard.cpp:1530
+#: src/slic3r/GUI/ConfigWizard.cpp:1931
msgid "SLA Technology Printers"
msgstr "Tiskárny technologie SLA"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1432
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
msgid "Slab"
msgstr "Deska"
-#: src/libslic3r/PrintConfig.cpp:1333
+#: src/libslic3r/PrintConfig.cpp:1441
msgid "Slic3r can upload G-code files to a printer host. This field must contain the kind of the host."
msgstr "Slic3r může nahrát soubory G-code do tiskového serveru. Toto pole musí obsahovat druh tiskového serveru."
-#: src/libslic3r/PrintConfig.cpp:105
+#: src/libslic3r/PrintConfig.cpp:107
msgid "Slic3r can upload G-code files to a printer host. This field should contain the API Key or the password required for authentication."
msgstr "Slic3r může nahrát soubory do tiskového serveru. Toto pole by mÄ›lo obsahovat klÃ­Ä API požadovaný pro ověření."
-#: src/libslic3r/PrintConfig.cpp:98
-msgid "Slic3r can upload G-code files to a printer host. This field should contain the hostname, IP address or URL of the printer host instance."
-msgstr "Slic3r může nahrát soubory G-code do tiskového serveru. Toto pole by mělo obsahovat název serveru (hostname), IP adresu nebo URL tiskového serveru."
+#: src/libslic3r/PrintConfig.cpp:100
+msgid "Slic3r can upload G-code files to a printer host. This field should contain the hostname, IP address or URL of the printer host instance. Print host behind HAProxy with basic auth enabled can be accessed by putting the user name and password into the URL in the following format: https://username:password@your-octopi-address/"
+msgstr "Slic3r může nahrávat G-cody do tiskového serveru. Toto pole by mělo obsahovat název hostitele, IP adresu nebo URL tiskového serveru. K tiskovému serveru za HAProxy se zapnutým ověřením basic auth lze přistupovat zadáním uživatelského jména a hesla do adresy URL v následujícím formátu: https://username: password@your-octopi-address/"
-#: src/libslic3r/PrintConfig.cpp:1299
+#: src/libslic3r/PrintConfig.cpp:1407
msgid "Slic3r will not scale speed down below this speed."
msgstr "Slic3r nebude měnit rychlost pod tuto rychlost."
-#: src/libslic3r/PrintConfig.cpp:3359
+#: src/libslic3r/PrintConfig.cpp:3558
msgid "Slice"
msgstr "Slicovat"
-#: src/slic3r/GUI/MainFrame.cpp:512
+#: src/slic3r/GUI/MainFrame.cpp:1113
msgid "Slice a file into a G-code"
msgstr "Slicovat soubor do G-code"
-#: src/slic3r/GUI/MainFrame.cpp:518
+#: src/slic3r/GUI/MainFrame.cpp:1119
msgid "Slice a file into a G-code, save as"
msgstr "Slicovat soubor do G-code, uložit jako"
-#: src/libslic3r/PrintConfig.cpp:87
+#: src/libslic3r/PrintConfig.cpp:89
msgid "Slice gap closing radius"
msgstr "Poloměr uzavření mezery v tiskové vrstvě"
-#: src/slic3r/GUI/Plater.cpp:892 src/slic3r/GUI/Plater.cpp:3121
-#: src/slic3r/GUI/Plater.cpp:5110
+#: src/slic3r/GUI/Plater.cpp:767 src/slic3r/GUI/Plater.cpp:2921
+#: src/slic3r/GUI/Plater.cpp:5237
msgid "Slice now"
msgstr "Slicovat"
-#: src/libslic3r/PrintConfig.cpp:3333
+#: src/libslic3r/PrintConfig.cpp:3526
msgid "Slice the model and export SLA printing layers as PNG."
msgstr "Naslicuje model a exportuje SLA tiskové vrstvy jako PNG soubory."
-#: src/libslic3r/PrintConfig.cpp:3354
+#: src/libslic3r/PrintConfig.cpp:3547
msgid "Slice the model and export toolpaths as G-code."
msgstr "Naslicujte model a exportujte trasy jako G-code."
-#: src/libslic3r/PrintConfig.cpp:3360
+#: src/libslic3r/PrintConfig.cpp:3559
msgid "Slice the model as FFF or SLA based on the printer_technology configuration value."
msgstr "Slicovat model jako FFF nebo SLA tisk na základÄ› konfiguraÄní hodnoty printer_technology."
-#: src/slic3r/GUI/Plater.cpp:216
+#: src/slic3r/GUI/Plater.cpp:222
msgid "Sliced Info"
msgstr "Informace o slicování"
-#: src/slic3r/GUI/MainFrame.cpp:847 src/slic3r/GUI/Plater.cpp:3121
-#: src/slic3r/GUI/Plater.cpp:5107 src/slic3r/GUI/Tab.cpp:1221
-#: src/slic3r/GUI/Tab.cpp:3662
+#: src/slic3r/GUI/MainFrame.cpp:1548 src/slic3r/GUI/Plater.cpp:2921
+#: src/slic3r/GUI/Plater.cpp:5234 src/slic3r/GUI/Tab.cpp:1551
+#: src/slic3r/GUI/Tab.cpp:4081
msgid "Slicing"
msgstr "Slicování"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:134
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:184
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:170
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:219
msgid "Slicing complete"
msgstr "Slicování dokonÄeno"
-#: src/libslic3r/SLAPrint.cpp:760
+#: src/libslic3r/SLAPrint.cpp:780
msgid "Slicing done"
msgstr "Slicování dokonÄeno"
-#: src/slic3r/GUI/MainFrame.cpp:874
+#: src/slic3r/GUI/MainFrame.cpp:1575
msgid "Slicing Done!"
msgstr "Slicování dokonÄeno!"
-#: src/libslic3r/SLAPrintSteps.cpp:245
+#: src/slic3r/GUI/NotificationManager.cpp:751
+msgid "Slicing finished."
+msgstr "Slicování dokonÄeno."
+
+#: src/libslic3r/SLAPrintSteps.cpp:247
msgid "Slicing had to be stopped due to an internal error: Inconsistent slice index."
msgstr "Slicování muselo být zastaveno kvůli vnitřní chybě: Nekonzistentní index řezů."
-#: src/libslic3r/SLAPrintSteps.cpp:45
+#: src/libslic3r/SLAPrintSteps.cpp:46
msgid "Slicing model"
msgstr "Slicuji model"
-#: src/libslic3r/SLAPrintSteps.cpp:49
+#: src/libslic3r/SLAPrintSteps.cpp:50
msgid "Slicing supports"
msgstr "Slicování podpěr"
-#: src/libslic3r/PrintConfig.cpp:2414
+#: src/libslic3r/PrintConfig.cpp:2557
msgid "Slow"
msgstr "Pomalý"
-#: src/libslic3r/PrintConfig.cpp:1705
+#: src/libslic3r/PrintConfig.cpp:1820
msgid "Slow down if layer print time is below"
msgstr "Zpomalit tisk pokud je doba tisku kratší než"
-#: src/libslic3r/PrintConfig.cpp:2415
+#: src/libslic3r/PrintConfig.cpp:2558
msgid "Slow tilt"
msgstr "Pomalý náklon"
-#: src/libslic3r/PrintConfig.cpp:1715
+#: src/libslic3r/PrintConfig.cpp:1830
msgid "Small perimeters"
msgstr "Malé perimetry"
-#: src/slic3r/GUI/GLCanvas3D.cpp:288
+#: src/libslic3r/PrintConfig.cpp:2801
+msgid "Small pillar diameter percent"
+msgstr "Procentní průměr malých pilířů"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:274
msgid "Smooth"
msgstr "Vyhladit"
-#: src/slic3r/GUI/GLCanvas3D.cpp:258
+#: src/slic3r/GUI/GLCanvas3D.cpp:247
msgid "Smoothing"
msgstr "Vyhlazení"
-#: src/slic3r/GUI/GUI_App.cpp:839
+#: src/slic3r/GUI/GUI_App.cpp:1540
msgid "Snapshot name"
msgstr "Název zálohy"
-#: src/slic3r/GUI/MainFrame.cpp:686
+#: src/slic3r/GUI/MainFrame.cpp:911 src/slic3r/GUI/MainFrame.cpp:1310
msgid "Software &Releases"
msgstr "Vydané ve&rze"
-#: src/slic3r/GUI/PresetHints.cpp:184
+#: src/slic3r/GUI/PresetHints.cpp:183
msgid "solid infill"
msgstr "plná výplň"
-#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:314
-#: src/libslic3r/PrintConfig.cpp:1756 src/libslic3r/PrintConfig.cpp:1767
+#: src/slic3r/GUI/GUI_Preview.cpp:305 src/libslic3r/ExtrusionEntity.cpp:318
+#: src/libslic3r/ExtrusionEntity.cpp:344 src/libslic3r/PrintConfig.cpp:1871
+#: src/libslic3r/PrintConfig.cpp:1882
msgid "Solid infill"
msgstr "Plná výplň"
-#: src/libslic3r/PrintConfig.cpp:1744
+#: src/libslic3r/PrintConfig.cpp:1859
msgid "Solid infill every"
msgstr "Plná výplň každou"
-#: src/libslic3r/PrintConfig.cpp:1736
+#: src/libslic3r/PrintConfig.cpp:1851
msgid "Solid infill extruder"
msgstr "Extruder pro plnou výplň"
-#: src/libslic3r/PrintConfig.cpp:1727
+#: src/libslic3r/PrintConfig.cpp:1842
msgid "Solid infill threshold area"
msgstr "Prahová hodnota plochy pro plnou výplň"
-#: src/slic3r/GUI/Tab.cpp:1065 src/libslic3r/PrintConfig.cpp:1780
+#: src/slic3r/GUI/Tab.cpp:1387 src/libslic3r/PrintConfig.cpp:1895
msgid "Solid layers"
msgstr "Plných vrstev"
-#: src/libslic3r/PrintConfig.cpp:754
+#: src/libslic3r/PrintConfig.cpp:790
msgid "Soluble material"
msgstr "Rozpustný materiál"
-#: src/libslic3r/PrintConfig.cpp:755
+#: src/libslic3r/PrintConfig.cpp:791
msgid "Soluble material is most likely used for a soluble support."
msgstr "Rozpustný materiál je převážně používán pro tisk rozpustných podpěr."
-#: src/libslic3r/PrintConfig.cpp:937
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:735
+msgid "Some fields are too long to fit. Right mouse click reveals the full text."
+msgstr "NÄ›která pole jsou příliÅ¡ dlouhá a nevejdou se. Kliknutím pravým tlaÄítkem myÅ¡i zobrazíte celý text."
+
+#: src/libslic3r/PrintConfig.cpp:981
msgid "Some G/M-code commands, including temperature control and others, are not universal. Set this option to your printer's firmware to get a compatible output. The \"No extrusion\" flavor prevents PrusaSlicer from exporting any extrusion value at all."
msgstr "NÄ›které příkazy G/M-code, vÄetnÄ› řízení teplot a další, nejsou univerzální. Vyberte typ firmware, který používá vaÅ¡e tiskárna pro dosažení kompatibilního výstupu. Příkazy typu \"No extrusion\" zabraňují PrusaSliceru zcela exportovat jakoukoliv hodnotu extruze."
-#: src/slic3r/GUI/GLCanvas3D.cpp:688
-msgid "Some objects are not visible"
-msgstr "Některé objekty nejsou vidět"
+#: src/slic3r/GUI/Plater.cpp:2309
+#, possible-c-format
+msgid "Some object(s) in file %s looks like saved in inches.\nShould I consider them as a saved in inches and convert them?"
+msgstr "Některé objekty v souboru %s se zdá, že jsou uložené v palcích.\nMám je považovat za uložené v palcích a převést je?"
-#: src/libslic3r/Print.cpp:1226
+#: src/slic3r/GUI/GLCanvas3D.cpp:636
+msgid "Some objects are not visible."
+msgstr "Některé objekty nejsou viditelné."
+
+#: src/libslic3r/Print.cpp:1252
msgid "Some objects are too close; your extruder will collide with them."
msgstr "Některé objekty jsou příliš blízko; Extruder do nich narazí."
-#: src/libslic3r/Print.cpp:1228
+#: src/libslic3r/Print.cpp:1254
msgid "Some objects are too tall and cannot be printed without extruder collisions."
msgstr "Některé objekty jsou příliš vysoké a nelze je tisknout bez kolizí extruderu."
-#: src/libslic3r/PrintConfig.cpp:2824
+#: src/libslic3r/PrintConfig.cpp:2988
msgid "Some objects can get along with a few smaller pads instead of a single big one. This parameter defines how far the center of two smaller pads should be. If theyare closer, they will get merged into one pad."
msgstr "NÄ›které objekty mohou být na nÄ›kolika menších podložkách namísto jedné velké. Tento parametr definuje, jak daleko může být stÅ™ed dvou menších podložek. Pokud budou blíže, budou slouÄeny do jedné podložky."
-#: src/libslic3r/PrintConfig.cpp:2187
+#: src/libslic3r/PrintConfig.cpp:2330
msgid "Some printers or printer setups may have difficulties printing with a variable layer height. Enabled by default."
msgstr "Některé tiskárny nebo nastavení tiskárny mohou mít potíže s tiskem s proměnnou výškou vrstvy. Ve výchozím nastavení je zapnuto."
-#: src/libslic3r/PrintConfig.cpp:1984
+#: src/slic3r/GUI/GLCanvas3D.cpp:3967
+msgid "Spacing"
+msgstr "Vzdálenost"
+
+#: src/libslic3r/PrintConfig.cpp:2126
msgid "Spacing between interface lines. Set zero to get a solid interface."
msgstr "RozteÄ linií kontaktních vrstev. Nastavte nulu pro získání plných kontaktních vrstev."
-#: src/libslic3r/PrintConfig.cpp:2018
+#: src/libslic3r/PrintConfig.cpp:1155
+msgid "Spacing between ironing passes"
+msgstr "Mezery mezi žehlicími tahy"
+
+#: src/libslic3r/PrintConfig.cpp:2160
msgid "Spacing between support material lines."
msgstr "RozteÄ linií podpÄ›r."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:616
-#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/Tab.cpp:1145
-#: src/libslic3r/PrintConfig.cpp:235 src/libslic3r/PrintConfig.cpp:458
-#: src/libslic3r/PrintConfig.cpp:919 src/libslic3r/PrintConfig.cpp:1048
-#: src/libslic3r/PrintConfig.cpp:1431 src/libslic3r/PrintConfig.cpp:1668
-#: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1768
-#: src/libslic3r/PrintConfig.cpp:2118
+#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:655
+#: src/slic3r/GUI/GUI_Preview.cpp:278 src/slic3r/GUI/Tab.cpp:1474
+#: src/libslic3r/PrintConfig.cpp:269 src/libslic3r/PrintConfig.cpp:494
+#: src/libslic3r/PrintConfig.cpp:963 src/libslic3r/PrintConfig.cpp:1092
+#: src/libslic3r/PrintConfig.cpp:1165 src/libslic3r/PrintConfig.cpp:1539
+#: src/libslic3r/PrintConfig.cpp:1776 src/libslic3r/PrintConfig.cpp:1831
+#: src/libslic3r/PrintConfig.cpp:1883 src/libslic3r/PrintConfig.cpp:2261
msgid "Speed"
msgstr "Rychlost"
-#: src/libslic3r/PrintConfig.cpp:1670
-msgid "Speed (baud) of USB/serial port for printer connection."
-msgstr "Rychlost (baud) USB/sériového portu pro připojení tiskárny."
-
-#: src/libslic3r/GCode/PreviewData.cpp:351
+#: src/slic3r/GUI/GCodeViewer.cpp:2238 src/libslic3r/GCode/PreviewData.cpp:356
msgid "Speed (mm/s)"
msgstr "Rychlost (mm/s)"
-#: src/libslic3r/PrintConfig.cpp:920
+#: src/libslic3r/PrintConfig.cpp:964
msgid "Speed for filling small gaps using short zigzag moves. Keep this reasonably low to avoid too much shaking and resonance issues. Set zero to disable gaps filling."
msgstr "Rychlost plnění malých mezer pomocí krátkých cikcak pohybů. Udržujte tuto hodnotu poměrně nízkou, aby nedošlo k přílišným otřesům a problémům s rezonancí. Nastavte nulu pro vypnutí vyplnění mezery."
-#: src/slic3r/GUI/Tab.cpp:1158
+#: src/slic3r/GUI/Tab.cpp:1488
msgid "Speed for non-print moves"
msgstr "Netiskové rychlosti"
-#: src/libslic3r/PrintConfig.cpp:1432
+#: src/libslic3r/PrintConfig.cpp:1540
msgid "Speed for perimeters (contours, aka vertical shells). Set to zero for auto."
msgstr "Rychlost pro perimetry (obrysy, neboli svislé stěny). Zadejte nulu pro automatické nastavení."
-#: src/slic3r/GUI/Tab.cpp:1146
+#: src/slic3r/GUI/Tab.cpp:1475
msgid "Speed for print moves"
msgstr "Rychlosti pohybů tiskárny"
-#: src/libslic3r/PrintConfig.cpp:236
+#: src/libslic3r/PrintConfig.cpp:270
msgid "Speed for printing bridges."
msgstr "Rychlost pro vytváření mostů."
-#: src/libslic3r/PrintConfig.cpp:1769
+#: src/libslic3r/PrintConfig.cpp:1884
msgid "Speed for printing solid regions (top/bottom/internal horizontal shells). This can be expressed as a percentage (for example: 80%) over the default infill speed above. Set to zero for auto."
msgstr "Rychlost tisku plných oblastí (vrchní / spodní / vnitřní vodorovné stěny). Může být vyjádřeno procenty (například: 80%) oproti výchozí rychlosti vyplnění. Pro automatické nastavení zadejte nulu."
-#: src/libslic3r/PrintConfig.cpp:1993
+#: src/libslic3r/PrintConfig.cpp:2135
msgid "Speed for printing support material interface layers. If expressed as percentage (for example 50%) it will be calculated over support material speed."
msgstr "Rychlost tisku podpÄ›rných interface vrstev. Pokud je vyjádÅ™en procentní podíl (například 50%), vypoÄítá se podle rychlosti tisku podpÄ›r."
-#: src/libslic3r/PrintConfig.cpp:2027
+#: src/libslic3r/PrintConfig.cpp:2169
msgid "Speed for printing support material."
msgstr "Rychlost tisku podpěr."
-#: src/libslic3r/PrintConfig.cpp:1049
+#: src/libslic3r/PrintConfig.cpp:1093
msgid "Speed for printing the internal fill. Set to zero for auto."
msgstr "Rychlost tisku vnitřní výplně. Pro automatické nastavení zadejte nulu."
-#: src/libslic3r/PrintConfig.cpp:2119
+#: src/libslic3r/PrintConfig.cpp:2262
msgid "Speed for printing top solid layers (it only applies to the uppermost external layers and not to their internal solid layers). You may want to slow down this to get a nicer surface finish. This can be expressed as a percentage (for example: 80%) over the solid infill speed above. Set to zero for auto."
msgstr "Rychlost tisku vrchních plných vrstev (vztahuje se pouze na nejvyšší horní vrstvy a nikoli na jejich vnitÅ™ní plné vrstvy). Rychlost lze zpomalit, abyste získali hezÄí povrchovou úpravu. Může být vyjádÅ™ena procenty (například: 80%) z rychlosti plné výplnÄ› materiálu výše. Pro automatické nastavení zadejte nulu."
-#: src/libslic3r/PrintConfig.cpp:2153
+#: src/libslic3r/PrintConfig.cpp:2296
msgid "Speed for travel moves (jumps between distant extrusion points)."
msgstr "Rychlost posunů (přejezdy mezi body extruze)."
-#: src/libslic3r/PrintConfig.cpp:659
+#: src/libslic3r/PrintConfig.cpp:695
msgid "Speed of the first cooling move"
msgstr "Rychlost prvního pohybu chlazení"
-#: src/libslic3r/PrintConfig.cpp:678
+#: src/libslic3r/PrintConfig.cpp:714
msgid "Speed of the last cooling move"
msgstr "Rychlost posledního pohybu chlazení"
-#: src/libslic3r/PrintConfig.cpp:616
+#: src/libslic3r/PrintConfig.cpp:652
msgid "Speed used at the very beginning of loading phase."
msgstr "Rychlost použitá na samém poÄátku zavádÄ›cí fáze."
-#: src/libslic3r/PrintConfig.cpp:608
+#: src/libslic3r/PrintConfig.cpp:644
msgid "Speed used for loading the filament on the wipe tower."
msgstr "Rychlost použitá pro zavádÄ›ní filamentu na Äistící věž."
-#: src/libslic3r/PrintConfig.cpp:624
+#: src/libslic3r/PrintConfig.cpp:660
msgid "Speed used for unloading the filament on the wipe tower (does not affect initial part of unloading just after ramming)."
msgstr "Rychlost vysouvání filamentu pÅ™i výmÄ›nÄ› na Äistící věži (úvodní Äást vysunutí okamžitÄ› po rapidní extruzi není ovlivnÄ›na)."
-#: src/libslic3r/PrintConfig.cpp:633
+#: src/libslic3r/PrintConfig.cpp:669
msgid "Speed used for unloading the tip of the filament immediately after ramming."
msgstr "Rychlost použitá pÅ™i vysouvání Å¡piÄky filamentu bezprostÅ™ednÄ› po rapidní extruzi."
-#: src/slic3r/GUI/Mouse3DController.cpp:296
+#: src/slic3r/GUI/Mouse3DController.cpp:279
msgid "Speed:"
msgstr "Rychlost:"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1432
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
msgid "Sphere"
msgstr "Koule"
-#: src/libslic3r/PrintConfig.cpp:1794
+#: src/libslic3r/PrintConfig.cpp:1909
msgid "Spiral vase"
msgstr "Spirálová váza"
-#: src/slic3r/GUI/ConfigManipulation.cpp:90
+#: src/slic3r/GUI/ConfigManipulation.cpp:89
msgid "Spiral Vase"
msgstr "Spirálová Váza"
-#: src/slic3r/GUI/Plater.cpp:4019 src/slic3r/GUI/Plater.cpp:4034
-#: src/slic3r/GUI/Plater.cpp:4048 src/libslic3r/PrintConfig.cpp:3471
+#: src/slic3r/GUI/Plater.cpp:3939 src/slic3r/GUI/Plater.cpp:3954
+#: src/slic3r/GUI/Plater.cpp:3972 src/libslic3r/PrintConfig.cpp:3670
msgid "Split"
msgstr "Rozdělit"
-#: src/slic3r/GUI/Plater.cpp:4019
+#: src/slic3r/GUI/Plater.cpp:3939
msgid "Split the selected object"
msgstr "Rozdělit vybraný objekt"
-#: src/slic3r/GUI/Plater.cpp:4014 src/slic3r/GUI/Plater.cpp:4034
+#: src/slic3r/GUI/Plater.cpp:3934 src/slic3r/GUI/Plater.cpp:3954
msgid "Split the selected object into individual objects"
msgstr "Rozdělit vybraný objekt na jednotlivé objekty"
-#: src/slic3r/GUI/Plater.cpp:4016 src/slic3r/GUI/Plater.cpp:4048
+#: src/slic3r/GUI/Plater.cpp:3936 src/slic3r/GUI/Plater.cpp:3972
msgid "Split the selected object into individual sub-parts"
msgstr "RozdÄ›lit vybraný objekt na jednotlivé dílÄí Äásti"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4550
+#: src/slic3r/GUI/GLCanvas3D.cpp:4916
msgid "Split to objects"
msgstr "Rozdělit na objekty"
-#: src/slic3r/GUI/Plater.cpp:2981
+#: src/slic3r/GUI/Plater.cpp:2774
msgid "Split to Objects"
msgstr "Rozdělit na Objekty"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4560 src/slic3r/GUI/GUI_ObjectList.cpp:1487
+#: src/slic3r/GUI/GLCanvas3D.cpp:4926 src/slic3r/GUI/GUI_ObjectList.cpp:1618
msgid "Split to parts"
msgstr "RozdÄ›lit na Äásti"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2274
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2440
msgid "Split to Parts"
msgstr "Rozdělit na Části"
-#: src/slic3r/GUI/ConfigWizard.cpp:289
+#: src/libslic3r/PrintConfig.cpp:812
+msgid "Spool weight"
+msgstr "Hmotnost cívky"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:307
msgid "Standard"
msgstr "Běžné"
-#: src/libslic3r/PrintConfig.cpp:846
+#: src/libslic3r/PrintConfig.cpp:884
msgid "Stars"
msgstr "Hvězdy"
-#: src/slic3r/GUI/MainFrame.cpp:405
+#: src/slic3r/GUI/MainFrame.cpp:986
msgid "Start a new project"
msgstr "Vytvořit nový projekt"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29
msgid "Start at height"
msgstr "ZaÄít ve výšce"
-#: src/slic3r/GUI/Tab.cpp:1528 src/slic3r/GUI/Tab.cpp:1976
-#: src/libslic3r/PrintConfig.cpp:1813 src/libslic3r/PrintConfig.cpp:1828
+#: src/slic3r/GUI/Tab.cpp:1873 src/slic3r/GUI/Tab.cpp:2161
+#: src/libslic3r/PrintConfig.cpp:1928 src/libslic3r/PrintConfig.cpp:1943
msgid "Start G-code"
msgstr "ZaÄátek G-code"
-#: src/slic3r/GUI/MainFrame.cpp:532
+#: src/slic3r/GUI/MainFrame.cpp:1133
msgid "Start new slicing process"
msgstr "Zahájit nový slicovací proces"
@@ -7360,7 +8618,15 @@ msgstr "Zahájit nový slicovací proces"
msgid "Start printing after upload"
msgstr "Spustit tisk po nahrání"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:151
+#: src/slic3r/GUI/GUI_App.cpp:396
+msgid "Start the application"
+msgstr "Spusťit aplikaci"
+
+#: src/slic3r/GUI/GUI_App.cpp:386
+msgid "Starting with %1% 2.3, configuration directory on Linux has changed (according to XDG Base Directory Specification) to \n%2%.\n\nThis directory did not exist yet (maybe you run the new version for the first time).\nHowever, an old %1% configuration directory was detected in \n%3%.\n\nConsider moving the contents of the old directory to the new location in order to access your profiles, etc.\nNote that if you decide to downgrade %1% in future, it will use the old location again.\n\nWhat do you want to do now?"
+msgstr "PoÄínaje %1% 2.3 se konfiguraÄní adresář v systému Linux zmÄ›nil (podle specifikace XDG Base Directory) na %2%.\n\nTento adresář jeÅ¡tÄ› neexistoval (možná používáte novou verzi poprvé).\nByl vÅ¡ak zjiÅ¡tÄ›n starý konfiguraÄní adresář %1% v\n%3%.\n\nZvažte pÅ™esunutí obsahu starého adresáře do nového umístÄ›ní za úÄelem přístupu k vaÅ¡im profilům atd.\nPamatujte, že pokud se v budoucnu rozhodnete %1% downgradovat, použije znovu staré umístÄ›ní.\n\nCo chcete udÄ›lat?"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:149
msgid "Status"
msgstr "Stav"
@@ -7368,867 +8634,873 @@ msgstr "Stav"
msgid "Status:"
msgstr "Stav:"
-#: src/slic3r/GUI/Tab.cpp:2209
+#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2378
msgid "Stealth"
msgstr "Tichý"
-#: src/slic3r/GUI/Plater.cpp:1291
+#: src/slic3r/GUI/Plater.cpp:1187 src/slic3r/GUI/Plater.cpp:1235
msgid "stealth mode"
msgstr "tichý režim"
-#: src/slic3r/GUI/Plater.cpp:4985
-#, c-format
+#: src/slic3r/GUI/GCodeViewer.cpp:2557
+msgid "Stealth mode"
+msgstr "Tichý režim"
+
+#: src/slic3r/GUI/Plater.cpp:5118
+#, possible-c-format
msgid "STL file exported to %s"
msgstr "Soubor STL exportován do %s"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29
msgid "Stop at height"
msgstr "SkonÄit ve výšce"
-#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:1928
+#: src/slic3r/GUI/GUI_App.cpp:1781
+msgid "Stop them and continue anyway?"
+msgstr "Chcete i pÅ™esto pokraÄovat a zastavit nahrávání?"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:295
msgid "Success!"
msgstr "Úspěch!"
-#: src/slic3r/GUI/PresetHints.cpp:203
+#: src/slic3r/GUI/Plater.cpp:2047
+#, possible-c-format
+msgid "Successfully unmounted. The device %s(%s) can now be safely removed from the computer."
+msgstr "Odpojení probÄ›hlo úspěšné. Zařízení %s(%s) lze nyní bezpeÄnÄ› odebrat z poÄítaÄe."
+
+#: src/slic3r/GUI/PresetHints.cpp:202
msgid "support"
msgstr "podpěry"
-#: src/libslic3r/PrintConfig.cpp:2692
+#: src/libslic3r/PrintConfig.cpp:2856
msgid "Support base diameter"
msgstr "Průměr podpěrné základny"
-#: src/libslic3r/PrintConfig.cpp:2702
+#: src/libslic3r/PrintConfig.cpp:2866
msgid "Support base height"
msgstr "Výška podpěrné základny"
-#: src/libslic3r/PrintConfig.cpp:2711
+#: src/libslic3r/PrintConfig.cpp:2875
msgid "Support base safety distance"
msgstr "BezpeÄná vzdálenost podpÄ›rné základny"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
msgid "Support Blocker"
msgstr "Blokátor podpěr"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3551
+#: src/libslic3r/PrintConfig.cpp:895
+msgid "Support Cubic"
+msgstr "Kubická podepíraná"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
msgid "Support Enforcer"
msgstr "Vynucení podpěr"
-#: src/slic3r/GUI/ConfigManipulation.cpp:163
+#: src/slic3r/GUI/ConfigManipulation.cpp:162
msgid "Support Generator"
msgstr "Generátor Podpěr"
-#: src/slic3r/GUI/Tab.cpp:3608
+#: src/slic3r/GUI/Tab.cpp:4018
msgid "Support head"
msgstr "Hrot podpěry"
-#: src/libslic3r/PrintConfig.cpp:2620
-msgid "Support head front diameter"
-msgstr "Průměr hrotu podpěry"
-
-#: src/libslic3r/PrintConfig.cpp:2629
-msgid "Support head penetration"
-msgstr "Průnik podpěry do modelu"
-
-#: src/libslic3r/PrintConfig.cpp:2638
-msgid "Support head width"
-msgstr "Tloušťka hrotu podpěry"
-
-#: src/slic3r/GUI/PresetHints.cpp:213
+#: src/slic3r/GUI/PresetHints.cpp:212
msgid "support interface"
msgstr "kontaktní vrstva podpěr"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:97
-#: src/slic3r/GUI/GUI_ObjectList.cpp:615 src/slic3r/GUI/GUI_Preview.cpp:246
-#: src/slic3r/GUI/Tab.cpp:1120 src/slic3r/GUI/Tab.cpp:1121
-#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/PrintConfig.cpp:370
-#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1866
-#: src/libslic3r/PrintConfig.cpp:1872 src/libslic3r/PrintConfig.cpp:1880
-#: src/libslic3r/PrintConfig.cpp:1892 src/libslic3r/PrintConfig.cpp:1902
-#: src/libslic3r/PrintConfig.cpp:1910 src/libslic3r/PrintConfig.cpp:1925
-#: src/libslic3r/PrintConfig.cpp:1946 src/libslic3r/PrintConfig.cpp:1958
-#: src/libslic3r/PrintConfig.cpp:1974 src/libslic3r/PrintConfig.cpp:1983
-#: src/libslic3r/PrintConfig.cpp:1992 src/libslic3r/PrintConfig.cpp:2003
-#: src/libslic3r/PrintConfig.cpp:2017 src/libslic3r/PrintConfig.cpp:2025
-#: src/libslic3r/PrintConfig.cpp:2026 src/libslic3r/PrintConfig.cpp:2035
-#: src/libslic3r/PrintConfig.cpp:2043 src/libslic3r/PrintConfig.cpp:2057
+#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:95
+#: src/slic3r/GUI/GUI_ObjectList.cpp:654 src/slic3r/GUI/GUI_Preview.cpp:311
+#: src/slic3r/GUI/Tab.cpp:1449 src/slic3r/GUI/Tab.cpp:1450
+#: src/libslic3r/ExtrusionEntity.cpp:324 src/libslic3r/ExtrusionEntity.cpp:356
+#: src/libslic3r/PrintConfig.cpp:404 src/libslic3r/PrintConfig.cpp:1610
+#: src/libslic3r/PrintConfig.cpp:2008 src/libslic3r/PrintConfig.cpp:2014
+#: src/libslic3r/PrintConfig.cpp:2022 src/libslic3r/PrintConfig.cpp:2034
+#: src/libslic3r/PrintConfig.cpp:2044 src/libslic3r/PrintConfig.cpp:2052
+#: src/libslic3r/PrintConfig.cpp:2067 src/libslic3r/PrintConfig.cpp:2088
+#: src/libslic3r/PrintConfig.cpp:2100 src/libslic3r/PrintConfig.cpp:2116
+#: src/libslic3r/PrintConfig.cpp:2125 src/libslic3r/PrintConfig.cpp:2134
+#: src/libslic3r/PrintConfig.cpp:2145 src/libslic3r/PrintConfig.cpp:2159
+#: src/libslic3r/PrintConfig.cpp:2167 src/libslic3r/PrintConfig.cpp:2168
+#: src/libslic3r/PrintConfig.cpp:2177 src/libslic3r/PrintConfig.cpp:2185
+#: src/libslic3r/PrintConfig.cpp:2199
msgid "Support material"
msgstr "Podpěry"
-#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:320
-#: src/libslic3r/PrintConfig.cpp:1991
+#: src/slic3r/GUI/GUI_Preview.cpp:312 src/libslic3r/ExtrusionEntity.cpp:325
+#: src/libslic3r/ExtrusionEntity.cpp:358 src/libslic3r/PrintConfig.cpp:2133
msgid "Support material interface"
msgstr "Kontaktní vrstvy podpěr"
-#: src/libslic3r/PrintConfig.cpp:2044
+#: src/libslic3r/PrintConfig.cpp:2186
msgid "Support material will not be generated for overhangs whose slope angle (90° = vertical) is above the given threshold. In other words, this value represent the most horizontal slope (measured from the horizontal plane) that you can print without support material. Set to zero for automatic detection (recommended)."
msgstr "PodpÄ›ry nebudou vytvoÅ™eny pro pÅ™evisy, jejichž úhel sklonu (90° = vertikální) je nad danou prahovou hodnotou. Jinými slovy, tato hodnota pÅ™edstavuje nejvÄ›tší horizontální sklon (měřený od horizontální roviny), který můžete tisknout bez podpÄ›rného materiálu. Nastavte na nulu pro automatickou detekci (doporuÄeno)."
-#: src/libslic3r/PrintConfig.cpp:1964
+#: src/libslic3r/PrintConfig.cpp:2106
msgid "Support material/raft interface extruder"
msgstr "Extruder pro kontaktní podpěry/raft"
-#: src/libslic3r/PrintConfig.cpp:1937
+#: src/libslic3r/PrintConfig.cpp:2079
msgid "Support material/raft/skirt extruder"
msgstr "Extruder pro podpěry/raft/obrys"
-#: src/slic3r/GUI/Plater.cpp:500 src/libslic3r/PrintConfig.cpp:1901
-#: src/libslic3r/PrintConfig.cpp:2674
+#: src/slic3r/GUI/Plater.cpp:366 src/libslic3r/PrintConfig.cpp:2043
+#: src/libslic3r/PrintConfig.cpp:2838
msgid "Support on build plate only"
msgstr "Pouze na tiskové podložce"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:888
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:762
msgid "Support parameter change"
msgstr "Změna nastavení podpěr"
-#: src/slic3r/GUI/Tab.cpp:3613
+#: src/slic3r/GUI/Tab.cpp:4023
msgid "Support pillar"
msgstr "Podpěrný pilíř"
-#: src/libslic3r/PrintConfig.cpp:2658
-msgid "Support pillar connection mode"
-msgstr "Propojení podpěr"
-
-#: src/libslic3r/PrintConfig.cpp:2648
-msgid "Support pillar diameter"
-msgstr "Tloušťka podpěry"
-
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55
-#: src/libslic3r/PrintConfig.cpp:2764
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54
+#: src/libslic3r/PrintConfig.cpp:2928
msgid "Support points density"
msgstr "Hustota podpěrných bodů"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1196
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1048
msgid "Support points edit"
msgstr "Úprava podpěrných bodů"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/GUI_ObjectList.cpp:624
-#: src/slic3r/GUI/Plater.cpp:495 src/slic3r/GUI/Tab.cpp:3604
-#: src/slic3r/GUI/Tab.cpp:3605 src/libslic3r/PrintConfig.cpp:2614
-#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2630
-#: src/libslic3r/PrintConfig.cpp:2639 src/libslic3r/PrintConfig.cpp:2649
-#: src/libslic3r/PrintConfig.cpp:2675 src/libslic3r/PrintConfig.cpp:2682
-#: src/libslic3r/PrintConfig.cpp:2693 src/libslic3r/PrintConfig.cpp:2703
-#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2725
-#: src/libslic3r/PrintConfig.cpp:2735 src/libslic3r/PrintConfig.cpp:2744
-#: src/libslic3r/PrintConfig.cpp:2754 src/libslic3r/PrintConfig.cpp:2765
-#: src/libslic3r/PrintConfig.cpp:2773
+#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:663
+#: src/slic3r/GUI/Plater.cpp:361 src/slic3r/GUI/Tab.cpp:4014
+#: src/slic3r/GUI/Tab.cpp:4015 src/libslic3r/PrintConfig.cpp:2757
+#: src/libslic3r/PrintConfig.cpp:2764 src/libslic3r/PrintConfig.cpp:2773
+#: src/libslic3r/PrintConfig.cpp:2782 src/libslic3r/PrintConfig.cpp:2792
+#: src/libslic3r/PrintConfig.cpp:2802 src/libslic3r/PrintConfig.cpp:2839
+#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2857
+#: src/libslic3r/PrintConfig.cpp:2867 src/libslic3r/PrintConfig.cpp:2876
+#: src/libslic3r/PrintConfig.cpp:2889 src/libslic3r/PrintConfig.cpp:2899
+#: src/libslic3r/PrintConfig.cpp:2908 src/libslic3r/PrintConfig.cpp:2918
+#: src/libslic3r/PrintConfig.cpp:2929 src/libslic3r/PrintConfig.cpp:2937
msgid "Supports"
msgstr "Podpěry"
-#: src/slic3r/GUI/Plater.cpp:1194
+#: src/slic3r/GUI/Plater.cpp:1103
msgid "supports and pad"
msgstr "podpěry a podložka"
-#: src/libslic3r/PrintConfig.cpp:1092
+#: src/libslic3r/PrintConfig.cpp:1185
msgid "Supports remaining times"
msgstr "Podpora zbývajících tiskových Äasů"
-#: src/libslic3r/PrintConfig.cpp:1101
+#: src/libslic3r/PrintConfig.cpp:1194
msgid "Supports stealth mode"
msgstr "Podporuje tichý režim"
-#: src/slic3r/GUI/ConfigManipulation.cpp:159
-msgid ""
-"Supports work better, if the following feature is enabled:\n"
-"- Detect bridging perimeters"
-msgstr ""
-"Podpěry fungují lépe, pokud je povolena funkce:\n"
-"- Detekovat perimetry přemostění"
+#: src/slic3r/GUI/ConfigManipulation.cpp:158
+msgid "Supports work better, if the following feature is enabled:\n- Detect bridging perimeters"
+msgstr "Podpěry fungují lépe, pokud je povolena funkce:\n- Detekovat perimetry přemostění"
-#: src/slic3r/GUI/Preferences.cpp:87
+#: src/slic3r/GUI/Preferences.cpp:104
msgid "Suppress \" - default - \" presets"
msgstr "PotlaÄit “ - výchozí - “ pÅ™ednastavení"
-#: src/slic3r/GUI/Preferences.cpp:89
+#: src/slic3r/GUI/Preferences.cpp:106
msgid "Suppress \" - default - \" presets in the Print / Filament / Printer selections once there are any other valid presets available."
msgstr "PotlaÄit “ - výchozí - “ pÅ™ednastavení v nabídkách Tisk / Filament / Tiskárna, jakmile budou k dispozici další platné pÅ™edvolby."
-#: src/slic3r/GUI/MainFrame.cpp:826
+#: src/slic3r/GUI/Preferences.cpp:276
+msgid "Suppress to open hyperlink in browser"
+msgstr "PotlaÄit otevírání hypertextových odkazů v prohlížeÄi"
+
+#: src/slic3r/GUI/MainFrame.cpp:1527
msgid "SVG"
msgstr "SVG"
-#: src/slic3r/GUI/DoubleSlider.cpp:1144
+#: src/slic3r/GUI/Mouse3DController.cpp:318
+msgid "Swap Y/Z axes"
+msgstr "Zaměnit osy Y/Z"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+msgid "Switch between Editor/Preview"
+msgstr "Přepínání mezi Editorem/Náhledem"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1273
msgid "Switch code to Change extruder"
msgstr "Zaměnit za příkaz na Změnu extruderu"
-#: src/slic3r/GUI/DoubleSlider.cpp:1179
+#: src/slic3r/GUI/DoubleSlider.cpp:1306
msgid "Switch code to Color change (%1%) for:"
msgstr "Zaměnit za příkaz na Změnu barvy (%1%) pro:"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:140
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:136
msgid "Switch to 3D"
msgstr "Přepnout do 3D"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1376
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223
msgid "Switch to editing mode"
msgstr "Přepnout do režimu editace"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:141
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:137
msgid "Switch to Preview"
msgstr "Přepnout do náhledu"
-#: src/slic3r/GUI/wxExtensions.cpp:703
-#, c-format
+#: src/slic3r/GUI/GLCanvas3D.cpp:4302 src/slic3r/GUI/GLCanvas3D.cpp:4939
+msgid "Switch to Settings"
+msgstr "Přepnout do Nastavení"
+
+#: src/slic3r/GUI/wxExtensions.cpp:623
+#, possible-c-format
msgid "Switch to the %s mode"
msgstr "Přepnout do režimu %s"
-#: src/slic3r/GUI/GUI_App.cpp:882
-msgid ""
-"Switching the language will trigger application restart.\n"
-"You will lose content of the plater."
-msgstr ""
-"Přepnutím jazyka se aplikace restartuje.\n"
-"Ztratíte obsah scény."
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:542
+msgid "Switching Presets: Unsaved Changes"
+msgstr "Přepnutí na jiné přednastavení: Neuložené změny"
+
+#: src/slic3r/GUI/GUI_App.cpp:1608
+msgid "Switching the language will trigger application restart.\nYou will lose content of the plater."
+msgstr "Přepnutím jazyka se aplikace restartuje.\nZtratíte obsah scény."
#: src/slic3r/GUI/WipeTowerDialog.cpp:365
-msgid ""
-"Switching to simple settings will discard changes done in the advanced mode!\n"
-"\n"
-"Do you want to proceed?"
-msgstr ""
-"PÅ™epnutím do jednoduchého nastavení ztratíte zmÄ›ny provedené v pokroÄilém režimu!\n"
-"\n"
-"Opravdu chcete pokraÄovat?"
+msgid "Switching to simple settings will discard changes done in the advanced mode!\n\nDo you want to proceed?"
+msgstr "PÅ™epnutím do jednoduchého nastavení ztratíte zmÄ›ny provedené v pokroÄilém režimu!\n\nOpravdu chcete pokraÄovat?"
-#: src/slic3r/GUI/Tab.cpp:1014
+#: src/slic3r/GUI/Tab.cpp:1332
msgid "symbolic profile name"
msgstr "symbolické jméno profilu"
-#: src/libslic3r/PrintConfig.cpp:2036
+#: src/libslic3r/PrintConfig.cpp:2178
msgid "Synchronize support layers with the object print layers. This is useful with multi-material printers, where the extruder switch is expensive."
msgstr "Synchronizování vrstev podpÄ›r s vrstvami objektu. Toto je velmi užiteÄné u multi-materiálových tiskáren, kde je pÅ™epínání extruderů drahé."
-#: src/libslic3r/PrintConfig.cpp:2034
+#: src/libslic3r/PrintConfig.cpp:2176
msgid "Synchronize with object layers"
msgstr "Synchronizovat s vrstvami objektu"
-#: src/slic3r/GUI/MainFrame.cpp:699
+#: src/slic3r/GUI/MainFrame.cpp:924 src/slic3r/GUI/MainFrame.cpp:1323
msgid "System &Info"
msgstr "&Informace o systému"
-#: src/slic3r/GUI/SysInfoDialog.cpp:78
+#: src/slic3r/GUI/SysInfoDialog.cpp:90 src/slic3r/GUI/SysInfoDialog.cpp:92
msgid "System Information"
msgstr "Systémové informace"
-#: src/slic3r/GUI/Preset.cpp:1109 src/slic3r/GUI/Preset.cpp:1164
-#: src/slic3r/GUI/Preset.cpp:1242 src/slic3r/GUI/Preset.cpp:1284
-#: src/slic3r/GUI/PresetBundle.cpp:1583 src/slic3r/GUI/PresetBundle.cpp:1672
+#: src/slic3r/GUI/PresetComboBoxes.cpp:188
+#: src/slic3r/GUI/PresetComboBoxes.cpp:226
+#: src/slic3r/GUI/PresetComboBoxes.cpp:724
+#: src/slic3r/GUI/PresetComboBoxes.cpp:774
+#: src/slic3r/GUI/PresetComboBoxes.cpp:886
+#: src/slic3r/GUI/PresetComboBoxes.cpp:930
msgid "System presets"
msgstr "Systémová přednastavení"
-#: src/slic3r/GUI/GUI_App.cpp:801
+#: src/slic3r/GUI/GUI_App.cpp:1481
msgid "Take Configuration &Snapshot"
msgstr "Prové&st Zálohu konfigurace"
-#: src/slic3r/GUI/GUI_App.cpp:839
+#: src/slic3r/GUI/GUI_App.cpp:1540
msgid "Taking configuration snapshot"
msgstr "Ukládání zálohy nastavení"
-#: src/slic3r/GUI/Tab.cpp:1433 src/libslic3r/PrintConfig.cpp:2067
+#: src/slic3r/GUI/Tab.cpp:1779
msgid "Temperature"
msgstr "Teplota"
-#: src/libslic3r/PrintConfig.cpp:1804
+#: src/libslic3r/PrintConfig.cpp:1919
msgid "Temperature difference to be applied when an extruder is not active. Enables a full-height \"sacrificial\" skirt on which the nozzles are periodically wiped."
msgstr "Teplotní rozdíl, který se použije v případÄ›, že extruder není aktivní. Umožňuje “obÄ›tní†obrysy v plné výšce objektu, na kterém jsou trysky periodicky oÄiÅ¡tÄ›ny."
-#: src/libslic3r/PrintConfig.cpp:1803
+#: src/libslic3r/PrintConfig.cpp:1918
msgid "Temperature variation"
msgstr "Kolísání teploty"
-#: src/slic3r/GUI/ConfigWizard.cpp:1017
+#: src/slic3r/GUI/ConfigWizard.cpp:1383
msgid "Temperatures"
msgstr "Teploty"
-#: src/slic3r/GUI/Tab.cpp:1677 src/slic3r/GUI/Tab.cpp:1915
+#: src/slic3r/GUI/Tab.cpp:2215
+msgid "Template Custom G-code"
+msgstr "Šablona s vlastním G-code"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:284
msgid "Test"
msgstr "Test"
-#: src/slic3r/GUI/BedShapeDialog.cpp:172
+#: src/slic3r/GUI/BedShapeDialog.cpp:315
msgid "Texture"
msgstr "Textura"
-#: src/slic3r/GUI/ConfigManipulation.cpp:208
+#: src/slic3r/GUI/ConfigManipulation.cpp:207
msgid "The %1% infill pattern is not supposed to work at 100%% density."
msgstr "Vzor výplnÄ› %1% není urÄen pro 100%% hustotu výplnÄ›."
#: src/slic3r/GUI/FirmwareDialog.cpp:548
-#, c-format
+#, possible-c-format
msgid "The %s device could not have been found"
msgstr "Zařízení %s nebylo nalezeno"
#: src/slic3r/GUI/FirmwareDialog.cpp:436
-#, c-format
-msgid ""
-"The %s device was not found.\n"
-"If the device is connected, please press the Reset button next to the USB connector ..."
+#, possible-c-format
+msgid "The %s device was not found.\nIf the device is connected, please press the Reset button next to the USB connector ..."
msgstr "Zařízení %s nebylo nalezeno. Pokud je zařízení pÅ™ipojeno, stisknÄ›te tlaÄítko Reset vedle USB konektoru ..."
-#: src/slic3r/GUI/Tab.cpp:976
+#: src/slic3r/GUI/Tab.cpp:1238
msgid "The current custom preset will be detached from the parent system preset."
msgstr "Aktuální vlastní pÅ™ednastavení bude oddÄ›leno od rodiÄovského systémového pÅ™ednastavení."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875
-msgid ""
-"The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n"
-"Non-uniform scaling of tilted objects is only possible in the World coordinate system,\n"
-"once the rotation is embedded into the object coordinates."
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:925
+msgid "The currently manipulated object is tilted (rotation angles are not multiples of 90°).\nNon-uniform scaling of tilted objects is only possible in the World coordinate system,\nonce the rotation is embedded into the object coordinates."
msgstr "MomentálnÄ› upravovaný objekt je pootoÄený (rotaÄní úhly nejsou násobky 90°). Nejednotné Å¡kálování naklonÄ›ných objektů je ve svÄ›tových koordinátech možné pouze tehdy, když je informace o rotacích zapsána do koordinátů daného objektu."
-#: src/libslic3r/PrintConfig.cpp:2726
+#: src/libslic3r/PrintConfig.cpp:2890
msgid "The default angle for connecting support sticks and junctions."
msgstr "Výchozí úhel pro pÅ™ipojení nosných tyÄí a spojek."
-#: src/libslic3r/SLAPrint.cpp:631
+#: src/libslic3r/SLAPrint.cpp:645
msgid "The endings of the support pillars will be deployed on the gap between the object and the pad. 'Support base safety distance' has to be greater than the 'Pad object gap' parameter to avoid this."
msgstr "Konce podpÄ›rných sloupů budou rozmístÄ›ny mezi pÅ™edmÄ›t a podložku. Proto musí být „BezpeÄná vzdálenost podpÄ›rné základny“ vÄ›tší než parametr „Mezera Podložka-Objekt“."
-#: src/libslic3r/PrintConfig.cpp:489
+#: src/libslic3r/PrintConfig.cpp:525
msgid "The extruder to use (unless more specific extruder settings are specified). This value overrides perimeter and infill extruders, but not the support extruders."
msgstr "Extruder, který chcete použít (pokud nejsou zvoleny specifiÄtÄ›jší nastavení extruderu). Tato hodnota pÅ™epíše nastavení perimetrového a výplňového exrtuderu, ale ne nastavení extruderu pro podpÄ›ry."
-#: src/libslic3r/PrintConfig.cpp:1003
+#: src/libslic3r/PrintConfig.cpp:1047
msgid "The extruder to use when printing infill."
msgstr "Extruder který se použije pro tisk výplní."
-#: src/libslic3r/PrintConfig.cpp:1410
+#: src/libslic3r/PrintConfig.cpp:1518
msgid "The extruder to use when printing perimeters and brim. First extruder is 1."
msgstr "Extruder, který se používá při tisku perimetrů a límce. První extruder je 1."
-#: src/libslic3r/PrintConfig.cpp:1738
+#: src/libslic3r/PrintConfig.cpp:1853
msgid "The extruder to use when printing solid infill."
msgstr "Extruder který bude použit při tisku plných výplní."
-#: src/libslic3r/PrintConfig.cpp:1966
+#: src/libslic3r/PrintConfig.cpp:2108
msgid "The extruder to use when printing support material interface (1+, 0 to use the current extruder to minimize tool changes). This affects raft too."
msgstr "Extruder, který se použije při tisku kontaktních vrstev podpěr (1+, 0 pro použití aktuálního extruderu, aby se minimalizovaly změny nástroje). To ovlivňuje i raft."
-#: src/libslic3r/PrintConfig.cpp:1939
+#: src/libslic3r/PrintConfig.cpp:2081
msgid "The extruder to use when printing support material, raft and skirt (1+, 0 to use the current extruder to minimize tool changes)."
msgstr "Extruder, který se používá při tisku podpěr, raftu a obrysu (1+, 0 pro použití aktuálního extruderu pro co nejméně změn nástroje)."
-#: src/libslic3r/PrintConfig.cpp:727
+#: src/libslic3r/PrintConfig.cpp:763
msgid "The filament material type for use in custom G-codes."
msgstr "Typ filamentu pro použití ve vlastních G-code."
-#: src/libslic3r/PrintConfig.cpp:3494
+#: src/libslic3r/PrintConfig.cpp:3693
msgid "The file where the output will be written (if not specified, it will be based on the input file)."
msgstr "Soubor, do kterého bude zapisován výstup (pokud není zadán, bude vycházet ze vstupního souboru)."
-#: src/libslic3r/PrintConfig.cpp:1102
+#: src/libslic3r/PrintConfig.cpp:1195
msgid "The firmware supports stealth mode"
msgstr "Firmware podporuje tichý režim"
-#: src/libslic3r/PrintConfig.cpp:120
+#: src/libslic3r/PrintConfig.cpp:122
msgid "The first layer will be shrunk in the XY plane by the configured value to compensate for the 1st layer squish aka an Elephant Foot effect."
msgstr "První vrstva bude v rovině XY zmenšena nakonfigurovanou hodnotou, která kompenzuje rozplácnutí první vrstvy."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3820
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3927 src/slic3r/GUI/Tab.cpp:3457
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4283
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4410
+#: src/slic3r/GUI/SavePresetDialog.cpp:117
msgid "the following characters are not allowed:"
msgstr "následující znaky nejsou povolené:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1830
+#: src/slic3r/GUI/ConfigWizard.cpp:2257
msgid "The following FFF printer models have no filament selected:"
msgstr "Následující modely FFF tiskáren nemají vybraný filament:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1848
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1004
+msgid "The following presets were modified:"
+msgstr "Byla upravena následující přednastavení:"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:253
+msgid "The following shortcuts are applicable in G-code preview when the horizontal slider is active"
+msgstr "Následující zkratky jsou použitelné v náhledu G-codu, když je aktivní vodorovný posuvník"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:237
+msgid "The following shortcuts are applicable in G-code preview when the vertical slider is active"
+msgstr "Následující zkratky jsou použitelné v náhledu G-codu, když je aktivní svislý posuvník"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+msgid "The following shortcuts are applicable when the specified gizmo is active"
+msgstr "Následující klávesové zkratky jsou funkÄní pÅ™i patÅ™iÄném aktivním gizmu"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2275
msgid "The following SLA printer models have no materials selected:"
msgstr "Následující modely SLA tiskáren nemají vybrané žádné materiály:"
-#: src/slic3r/GUI/Tab.cpp:3461
+#: src/slic3r/GUI/SavePresetDialog.cpp:125
msgid "the following suffix is not allowed:"
msgstr "následující přípona není povolená:"
-#: src/libslic3r/PrintConfig.cpp:2871
+#: src/libslic3r/PrintConfig.cpp:3035
msgid "The gap between the object bottom and the generated pad in zero elevation mode."
msgstr "Mezera mezi spodkem objektu a generovanou podložkou v režimu nulového nadzvednutí."
-#: src/libslic3r/PrintConfig.cpp:2704
+#: src/libslic3r/PrintConfig.cpp:2868
msgid "The height of the pillar base cone"
msgstr "Výška ukotvení podpěrného kužele"
-#: src/slic3r/GUI/DoubleSlider.cpp:1922
+#: src/slic3r/GUI/DoubleSlider.cpp:2140
msgid "The last color change data was saved for a multi extruder printing with tool changes for whole print."
msgstr "Poslední změny barev byly uloženy pro tisk s více extrudery se změnami nástrojů během celého tisku."
-#: src/slic3r/GUI/DoubleSlider.cpp:1900 src/slic3r/GUI/DoubleSlider.cpp:1916
+#: src/slic3r/GUI/DoubleSlider.cpp:2119 src/slic3r/GUI/DoubleSlider.cpp:2134
msgid "The last color change data was saved for a multi extruder printing."
msgstr "Poslední změny barev byly uloženy pro tisk s více extrudery."
-#: src/slic3r/GUI/DoubleSlider.cpp:1899
+#: src/slic3r/GUI/DoubleSlider.cpp:2118
msgid "The last color change data was saved for a single extruder printing."
msgstr "Poslední změny barev byly uloženy pro tisk s jedním extruderem."
-#: src/libslic3r/PrintConfig.cpp:2745
+#: src/libslic3r/PrintConfig.cpp:2909
msgid "The max distance of two pillars to get linked with each other. A zero value will prohibit pillar cascading."
msgstr "Maximální vzdálenost dvou podpůrných pilířů pro vzájemné provázání. Nulová hodnota zakáže provazování."
-#: src/libslic3r/PrintConfig.cpp:2736
+#: src/libslic3r/PrintConfig.cpp:2900
msgid "The max length of a bridge"
msgstr "Maximální délka přemostění"
-#: src/libslic3r/PrintConfig.cpp:2714
+#: src/libslic3r/PrintConfig.cpp:190
+msgid "The maximum detour length for avoid crossing perimeters. If the detour is longer than this value, avoid crossing perimeters is not applied for this travel path. Detour length could be specified either as an absolute value or as percentage (for example 50%) of a direct travel path."
+msgstr "Maximální délka objízdné trasy s cílem, aby nedoÅ¡lo k pÅ™ejetí pÅ™es perimetry. Pokud je objízdná trasa delší než tato hodnota, nebude dodrženo omezení pÅ™ejíždÄ›ní pÅ™es perimetry. Délka objízdné trasy může být zadána buÄ jako absolutní hodnota, nebo jako procento (například 50%) přímé cesty."
+
+#: src/libslic3r/PrintConfig.cpp:2878
msgid "The minimum distance of the pillar base from the model in mm. Makes sense in zero elevation mode where a gap according to this parameter is inserted between the model and the pad."
msgstr "Minimální vzdálenost základny podpěr od modelu v mm. Dává smysl v režimu nulového nadzvednutí nad podložku, kde je mezera podle tohoto parametru vložena mezi model a podložku."
-#: src/libslic3r/PrintConfig.cpp:185
+#: src/slic3r/GUI/SavePresetDialog.cpp:142
+msgid "The name cannot be empty."
+msgstr "Název nesmí být prázdný."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:152
+msgid "The name cannot end with space character."
+msgstr "Název nesmí konÄit mezerou."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:147
+msgid "The name cannot start with space character."
+msgstr "Název nesmí zaÄínat mezerou."
+
+#: src/libslic3r/PrintConfig.cpp:219
msgid "The number of bottom solid layers is increased above bottom_solid_layers if necessary to satisfy minimum thickness of bottom shell."
msgstr "PoÄet spodních plných vrstev je navýšen nad zadaný poÄet bottom_solid_layers, je-li to nutné k dosažení minimální tlouÅ¡Å¥ky spodní skoÅ™epiny."
-#: src/libslic3r/PrintConfig.cpp:2143
+#: src/libslic3r/PrintConfig.cpp:2286
msgid "The number of top solid layers is increased above top_solid_layers if necessary to satisfy minimum thickness of top shell. This is useful to prevent pillowing effect when printing with variable layer height."
msgstr "PoÄet vrchních plných vrstev je navýšen nad zadaný poÄet top_solid_layers, je-li to nutné k dosažení minimální tlouÅ¡Å¥ky vrchní skoÅ™epiny. Zabrání se tak tzv. „pillowing“ efektu pÅ™i tisku s promÄ›nnou výškou vrstvy."
-#: src/libslic3r/PrintConfig.cpp:2277
+#: src/slic3r/GUI/Plater.cpp:2326
+msgid "The object appears to be saved in inches"
+msgstr "Objekt se zdá být uložen v palcích"
+
+#: src/libslic3r/PrintConfig.cpp:2420
msgid "The object will be grown/shrunk in the XY plane by the configured value (negative = inwards, positive = outwards). This might be useful for fine-tuning hole sizes."
msgstr "Objekt bude roztažen / smrÅ¡tÄ›n v rovinÄ› XY nastavenou hodnotou (negativní = smÄ›rem dovnitÅ™, pozitivní = smÄ›rem ven). To může být užiteÄné pro jemné doladÄ›ní otvorů."
-#: src/libslic3r/PrintConfig.cpp:1503
+#: src/libslic3r/PrintConfig.cpp:1611
msgid "The object will be raised by this number of layers, and support material will be generated under it."
msgstr "Objekt se zvýší tímto poÄtem vrstev a pod ním bude vytvoÅ™en podpůrný materiál."
-#: src/libslic3r/PrintConfig.cpp:2424
-msgid ""
-"The percentage of the bed area. \n"
-"If the print area exceeds the specified value, \n"
-"then a slow tilt will be used, otherwise - a fast tilt"
-msgstr ""
-"Procentuálně vyjádřená zabraná tisková plocha.\n"
-"Pokud tisk zabere více než je zadaná hodnota,\n"
-"bude použit pomalý náklon. V ostatních případech bude použit rychlý náklon"
+#: src/libslic3r/PrintConfig.cpp:2803
+msgid "The percentage of smaller pillars compared to the normal pillar diameter which are used in problematic areas where a normal pilla cannot fit."
+msgstr "Procentuální velikost menších podpěrných pilířů oproti průměru normálních pilířů. Menší pilíře jsou použity v problematických místech, kam se normální nevejdou."
+
+#: src/libslic3r/PrintConfig.cpp:2567
+msgid "The percentage of the bed area. \nIf the print area exceeds the specified value, \nthen a slow tilt will be used, otherwise - a fast tilt"
+msgstr "Procentuálně vyjádřená zabraná tisková plocha.\nPokud tisk zabere více než je zadaná hodnota,\nbude použit pomalý náklon. V ostatních případech bude použit rychlý náklon"
-#: src/slic3r/GUI/GUI_App.cpp:932
-msgid "The presets on the following tabs were modified"
-msgstr "Byla upravena přednastavení na následujících kartách"
+#: src/slic3r/GUI/Tab.cpp:3430
+msgid "The physical printer(s) below is based on the preset, you are going to delete."
+msgstr "Níže uvedené fyzické tiskárny(a) vycházejí z přednastavení, které chcete smazat."
-#: src/libslic3r/PrintConfig.cpp:1846
+#: src/slic3r/GUI/Tab.cpp:3438
+msgid "The physical printer(s) below is based only on the preset, you are going to delete."
+msgstr "Níže uvedená fyzická tiskárna(y) je založena pouze na přednastavení, které chcete smazat."
+
+#: src/slic3r/GUI/GUI_App.cpp:1676
+msgid "The preset(s) modifications are successfully saved"
+msgstr "Změny v přednastavení byly úspěšně uloženy"
+
+#: src/libslic3r/PrintConfig.cpp:1988
msgid "The printer multiplexes filaments into a single hot end."
msgstr "Tiskárna přepíná několik filamentů v jednou hot endu."
-#: src/libslic3r/Format/3mf.cpp:1630
+#: src/libslic3r/Format/3mf.cpp:1667
msgid "The selected 3mf file has been saved with a newer version of %1% and is not compatible."
msgstr "Vybraný 3mf soubor byl uložen s novější verzí %1% a není kompatibilní."
-#: src/libslic3r/Format/AMF.cpp:934
+#: src/libslic3r/Format/AMF.cpp:955
msgid "The selected amf file has been saved with a newer version of %1% and is not compatible."
msgstr "Vybraný amf soubor byl uložen s novější verzí %1% a není kompatibilní."
-#: src/slic3r/GUI/BedShapeDialog.cpp:513
+#: src/slic3r/GUI/Plater.cpp:4751
+msgid "The selected file"
+msgstr "Vybraný soubor"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:589
msgid "The selected file contains no geometry."
msgstr "Vybraný soubor neobsahuje geometrii."
-#: src/slic3r/GUI/BedShapeDialog.cpp:517
+#: src/slic3r/GUI/BedShapeDialog.cpp:593
msgid "The selected file contains several disjoint areas. This is not supported."
msgstr "Vybraný soubor obsahuje několik nespojených ploch. Tato možnost není podporována."
-#: src/slic3r/GUI/Plater.cpp:2970
+#: src/slic3r/GUI/Plater.cpp:2763
msgid "The selected object can't be split because it contains more than one volume/material."
msgstr "Vybraný objekt nemůže být rozdělen, protože obsahuje více než jeden objem/materiál."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2270 src/slic3r/GUI/Plater.cpp:2978
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2436 src/slic3r/GUI/Plater.cpp:2771
msgid "The selected object couldn't be split because it contains only one part."
msgstr "Vybraný objekt nemůže být rozdÄ›len, protože obsahuje pouze jednu Äást."
-#: src/slic3r/GUI/MainFrame.cpp:461
-msgid ""
-"The selected project is no longer available.\n"
-"Do you want to remove it from the recent projects list?"
-msgstr ""
-"Vybraný projekt již není k dispozici.\n"
-"Chcete ho odstranit ze seznamu posledních projektů?"
+#: src/slic3r/GUI/MainFrame.cpp:1003
+msgid "The selected project is no longer available.\nDo you want to remove it from the recent projects list?"
+msgstr "Vybraný projekt již není k dispozici.\nChcete ho odstranit ze seznamu posledních projektů?"
-#: src/slic3r/GUI/DoubleSlider.cpp:998
-msgid ""
-"The sequential print is on.\n"
-"It's impossible to apply any custom G-code for objects printing sequentually.\n"
-"This code won't be processed during G-code generation."
-msgstr ""
-"SekvenÄní tisk je zapnutý.\n"
-"Není možné použít jakýkoliv vlastní G-kód pro objekty tisknuté sekvenÄnÄ›.\n"
-"Během generování G-kódu nebude tento kód zpracován."
+#: src/slic3r/GUI/DoubleSlider.cpp:1121
+msgid "The sequential print is on.\nIt's impossible to apply any custom G-code for objects printing sequentually.\nThis code won't be processed during G-code generation."
+msgstr "SekvenÄní tisk je zapnutý.\nNení možné použít jakýkoliv vlastní G-kód pro objekty tisknuté sekvenÄnÄ›.\nBÄ›hem generování G-kódu nebude tento kód zpracován."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1187
+msgid "The size of the object can be specified in inches"
+msgstr "Velikost objektu lze urÄit v palcích"
-#: src/libslic3r/PrintConfig.cpp:2846
+#: src/libslic3r/PrintConfig.cpp:3010
msgid "The slope of the pad wall relative to the bed plane. 90 degrees means straight walls."
msgstr "Sklon boÄnic vzhledem k podložce. 90 stupňů znamená kolmé stÄ›ny."
-#: src/libslic3r/PrintConfig.cpp:1614
+#: src/libslic3r/PrintConfig.cpp:1722
msgid "The speed for loading of a filament into extruder after retraction (it only applies to the extruder motor). If left to zero, the retraction speed is used."
msgstr "Rychlost vtlaÄení filamentu do extruderu po retrakci (vztahuje se pouze na motor extruderu). Pokud je ponecháno na nulu, použije se rychlost retrakce."
-#: src/libslic3r/PrintConfig.cpp:1606
+#: src/libslic3r/PrintConfig.cpp:1714
msgid "The speed for retractions (it only applies to the extruder motor)."
msgstr "Rychlost retrakce (toto nastavení platí pouze pro motor extruderu)."
-#: src/slic3r/GUI/ConfigManipulation.cpp:81
-#, no-c-format
-msgid ""
-"The Spiral Vase mode requires:\n"
-"- one perimeter\n"
-"- no top solid layers\n"
-"- 0% fill density\n"
-"- no support material\n"
-"- Ensure vertical shell thickness enabled\n"
-"- Detect thin walls disabled"
-msgstr ""
-"Režim Spiral Vase vyžaduje:\n"
-"- jeden perimetr\n"
-"- žádné horní plné vrstvy\n"
-"- 0% hustota výplně\n"
-"- bez podpěrného materiálu\n"
-"- aktivní volbu „Zajistit tloušťku svislých stěn“\n"
-"- neaktivní volbu „Detekce tenkých stěn“"
-
-#: src/libslic3r/Print.cpp:1237
-msgid "The Spiral Vase option can only be used when printing a single object."
-msgstr "Možnost \"Spirálová váza\" lze použít pouze při tisku jednoho objektu."
-
-#: src/libslic3r/Print.cpp:1244
+#: src/slic3r/GUI/ConfigManipulation.cpp:80
+#, possible-c-format
+msgid "The Spiral Vase mode requires:\n- one perimeter\n- no top solid layers\n- 0% fill density\n- no support material\n- Ensure vertical shell thickness enabled\n- Detect thin walls disabled"
+msgstr "Režim Spiral Vase vyžaduje:\n- jeden perimetr\n- žádné horní plné vrstvy\n- 0% hustota výplně\n- bez podpěrného materiálu\n- aktivní volbu „Zajistit tloušťku svislých stěn“\n- neaktivní volbu „Detekce tenkých stěn“"
+
+#: src/libslic3r/Print.cpp:1270
msgid "The Spiral Vase option can only be used when printing single material objects."
msgstr "Možnost \"Spirálová váza\" lze použít pouze při tisku jedním materiálem."
-#: src/slic3r/GUI/Tab.cpp:3068
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:464
msgid "The supplied name is empty. It can't be saved."
msgstr "Název je prázdný. Nelze uložit."
-#: src/slic3r/GUI/Tab.cpp:3465
+#: src/slic3r/GUI/SavePresetDialog.cpp:131
msgid "The supplied name is not available."
msgstr "Zadaný název není dostupný."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3819
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3926 src/slic3r/GUI/Tab.cpp:3456
-#: src/slic3r/GUI/Tab.cpp:3460
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4282
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4409
+#: src/slic3r/GUI/SavePresetDialog.cpp:116
+#: src/slic3r/GUI/SavePresetDialog.cpp:124
msgid "The supplied name is not valid;"
msgstr "Zadaný název není platný;"
-#: src/libslic3r/Print.cpp:1222
+#: src/libslic3r/Print.cpp:1248
msgid "The supplied settings will cause an empty print."
msgstr "Zadané nastavení způsobí prázdný tisk."
-#: src/libslic3r/PrintConfig.cpp:2789
+#: src/libslic3r/PrintConfig.cpp:2953
msgid "The thickness of the pad and its optional cavity walls."
msgstr "Tloušťka podložky a její volitelné duté stěny."
-#: src/libslic3r/PrintConfig.cpp:1911
+#: src/slic3r/GUI/GUI_App.cpp:1781
+msgid "The uploads are still ongoing"
+msgstr "Nahrávání stále probíhá"
+
+#: src/libslic3r/PrintConfig.cpp:2053
msgid "The vertical distance between object and support material interface. Setting this to 0 will also prevent Slic3r from using bridge flow and speed for the first object layer."
msgstr "Vertikální vzdálenost mezi objektem a podpěrami. Nastavením tohoto parametru na hodnotu 0 se také zabrání tomu, aby Slic3r použil parametry průtoku a rychlosti pro mosty při tisku první vrstvy objektu."
-#: src/slic3r/GUI/Tab.cpp:2575
-msgid ""
-"The Wipe option is not available when using the Firmware Retraction mode.\n"
-"\n"
-"Shall I disable it in order to enable Firmware Retraction?"
-msgstr ""
-"Možnost OÄistit není k dispozici pÅ™i použití režimu retrakcí z firmwaru.\n"
-"\n"
-"Mám ji deaktivovat, aby bylo možné povolit retrakce z firmwaru?"
+#: src/slic3r/GUI/Tab.cpp:2731
+msgid "The Wipe option is not available when using the Firmware Retraction mode.\n\nShall I disable it in order to enable Firmware Retraction?"
+msgstr "Možnost OÄistit není k dispozici pÅ™i použití režimu retrakcí z firmwaru.\n\nMám ji deaktivovat, aby bylo možné povolit retrakce z firmwaru?"
-#: src/libslic3r/Print.cpp:1268
+#: src/libslic3r/Print.cpp:1294
msgid "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)."
msgstr "ÄŒistíví Věž v souÄasné dobÄ› nepodporuje volumetric E (use_volumetric_e = 0)."
-#: src/slic3r/GUI/ConfigManipulation.cpp:115
-msgid ""
-"The Wipe Tower currently supports the non-soluble supports only\n"
-"if they are printed with the current extruder without triggering a tool change.\n"
-"(both support_material_extruder and support_material_interface_extruder need to be set to 0)."
-msgstr ""
-"ÄŒistící věž v souÄasné dobÄ› podporuje pouze nerozpustné podpÄ›ry\n"
-"pokud jsou vytištěny s aktuálním extrudérem bez spuštění výměny nástroje.\n"
-"(jak extruder pro tisk podpor tak extruder pro tisk kontaktních podpěr je třeba nastavit na 0)."
+#: src/slic3r/GUI/ConfigManipulation.cpp:114
+msgid "The Wipe Tower currently supports the non-soluble supports only\nif they are printed with the current extruder without triggering a tool change.\n(both support_material_extruder and support_material_interface_extruder need to be set to 0)."
+msgstr "ÄŒistící věž v souÄasné dobÄ› podporuje pouze nerozpustné podpÄ›ry\npokud jsou vytiÅ¡tÄ›ny s aktuálním extrudérem bez spuÅ¡tÄ›ní výmÄ›ny nástroje.\n(jak extruder pro tisk podpor tak extruder pro tisk kontaktních podpÄ›r je tÅ™eba nastavit na 0)."
-#: src/libslic3r/Print.cpp:1400
+#: src/libslic3r/Print.cpp:1426
msgid "The Wipe Tower currently supports the non-soluble supports only if they are printed with the current extruder without triggering a tool change. (both support_material_extruder and support_material_interface_extruder need to be set to 0)."
-msgstr ""
-"ÄŒistící věž v souÄasné dobÄ› podporuje pouze nerozpustné podpÄ›ry\n"
-"pokud jsou vytištěny s aktuálním extrudérem bez spuštění výměny nástroje.\n"
-"(jak extruder pro tisk podpor tak extruder pro tisk kontaktních podpěr je třeba nastavit na 0)."
+msgstr "ÄŒistící věž v souÄasné dobÄ› podporuje pouze nerozpustné podpÄ›ry\npokud jsou vytiÅ¡tÄ›ny s aktuálním extrudérem bez spuÅ¡tÄ›ní výmÄ›ny nástroje.\n(jak extruder pro tisk podpor tak extruder pro tisk kontaktních podpÄ›r je tÅ™eba nastavit na 0)."
-#: src/libslic3r/Print.cpp:1270
+#: src/libslic3r/Print.cpp:1296
msgid "The Wipe Tower is currently not supported for multimaterial sequential prints."
msgstr "ÄŒistící věž není momentálnÄ› podporována pro multimateriálové sekvenÄní tisky."
-#: src/libslic3r/Print.cpp:1262
-msgid "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter and Repetier G-code flavors."
-msgstr "ÄŒistící věž je v souÄasné dobÄ› možná pouze pro G-cody urÄené pro Marlin, RepRap/Sprinter a Repetier."
+#: src/libslic3r/Print.cpp:1290
+msgid "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, RepRapFirmware and Repetier G-code flavors."
+msgstr "ÄŒistící věž je v souÄasné dobÄ› možná pouze pro G-cody urÄené pro Marlin, RepRap/Sprinter, RepRapFirmware a Repetier."
-#: src/libslic3r/Print.cpp:1264
+#: src/libslic3r/Print.cpp:1290
msgid "The Wipe Tower is currently only supported with the relative extruder addressing (use_relative_e_distances=1)."
msgstr "ÄŒistící věž je v souÄasné dobÄ› možná pouze v případÄ› relativního adresování exruderu (use_relative_e_distances=1)."
-#: src/libslic3r/Print.cpp:1293
+#: src/libslic3r/Print.cpp:1319
msgid "The Wipe Tower is only supported for multiple objects if they are printed over an equal number of raft layers"
msgstr "ÄŒistící věž pro více objektů je možná pouze v případÄ›, že objekty mají stejný poÄet raft vrstev"
-#: src/libslic3r/Print.cpp:1295
+#: src/libslic3r/Print.cpp:1321
msgid "The Wipe Tower is only supported for multiple objects if they are printed with the same support_material_contact_distance"
msgstr "Čistící věž pro více objektů je možná pouze v případě, že objekty mají shodný parametr support_material_contact_distance"
-#: src/libslic3r/Print.cpp:1297
+#: src/libslic3r/Print.cpp:1323
msgid "The Wipe Tower is only supported for multiple objects if they are sliced equally."
msgstr "Čistící věž je při více objektech možná pouze v případě, že objekty jsou slicovány stejně."
-#: src/libslic3r/Print.cpp:1291
+#: src/libslic3r/Print.cpp:1317
msgid "The Wipe Tower is only supported for multiple objects if they have equal layer heights"
msgstr "Čistící věž je při více objektech možná pouze v případě, že objekty mají všechny vrstvy stejné výšky"
-#: src/libslic3r/Print.cpp:1257
+#: src/libslic3r/Print.cpp:1283
msgid "The wipe tower is only supported if all extruders have the same nozzle diameter and use filaments of the same diameter."
msgstr "Čistící věž je podporována pouze v případě, že všechny extrudery mají stejné průměry trysek a používají filamenty stejných průměrů."
-#: src/libslic3r/Print.cpp:1339
+#: src/libslic3r/Print.cpp:1365
msgid "The Wipe tower is only supported if all objects have the same variable layer height"
msgstr "Čistící věž je podporována pouze v případě, že všechny objekty mají stejnou variabilní výšku vrstvy"
-#: src/libslic3r/SLAPrintSteps.cpp:621
+#: src/slic3r/GUI/Plater.cpp:3563
+msgid "There are active warnings concerning sliced models:"
+msgstr "Varování týkající se slicovaných modelů:"
+
+#: src/libslic3r/SLAPrintSteps.cpp:619
msgid "There are unprintable objects. Try to adjust support settings to make the objects printable."
msgstr "Nacházejí se zde netisknutelné objekty. Zkuste upravit nastavení podpěr tak, aby bylo možné objekty vytisknout."
-#: src/slic3r/GUI/DoubleSlider.cpp:1030
-msgid ""
-"There is a color change for extruder that has not been used before.\n"
-"Check your settings to avoid redundant color changes."
-msgstr ""
-"Dochází zde ke změně barvy u extruderu, který dosud nebyl použit.\n"
-"Zkontrolujte nastavení, abyste se vyhnuli redundantním změnám barev."
+#: src/slic3r/GUI/DoubleSlider.cpp:1155
+msgid "There is a color change for extruder that has not been used before.\nCheck your settings to avoid redundant color changes."
+msgstr "Dochází zde ke změně barvy u extruderu, který dosud nebyl použit.\nZkontrolujte nastavení, abyste se vyhnuli redundantním změnám barev."
-#: src/slic3r/GUI/DoubleSlider.cpp:1024
-msgid ""
-"There is a color change for extruder that won't be used till the end of print job.\n"
-"This code won't be processed during G-code generation."
-msgstr ""
-"Dochází zde ke změně barvy u extruderu, který již do konce tisku nebude použit.\n"
-"Tento kód nebude během generování G-kódu zpracován."
+#: src/slic3r/GUI/DoubleSlider.cpp:1149
+msgid "There is a color change for extruder that won't be used till the end of print job.\nThis code won't be processed during G-code generation."
+msgstr "Dochází zde ke změně barvy u extruderu, který již do konce tisku nebude použit.\nTento kód nebude během generování G-kódu zpracován."
-#: src/slic3r/GUI/DoubleSlider.cpp:1027
-msgid ""
-"There is an extruder change set to the same extruder.\n"
-"This code won't be processed during G-code generation."
-msgstr ""
-"Je zde změna extruderu na ten samý extruder.\n"
-"Během generování G-codu nebude tento kód zpracován."
+#: src/slic3r/GUI/DoubleSlider.cpp:1152
+msgid "There is an extruder change set to the same extruder.\nThis code won't be processed during G-code generation."
+msgstr "Je zde změna extruderu na ten samý extruder.\nBěhem generování G-codu nebude tento kód zpracován."
+
+#: src/libslic3r/GCode.cpp:604
+msgid "There is an object with no extrusions on the first layer."
+msgstr "Je zde objekt, u kterého nedochází k extruzi v první vrstvě."
#: src/slic3r/GUI/UpdateDialogs.cpp:225
-#, c-format
+#, possible-c-format
msgid "This %s version: %s"
msgstr "Tento %s verze: %s"
-#: src/slic3r/GUI/Tab.cpp:982
-msgid ""
-"This action is not revertable.\n"
-"Do you want to proceed?"
-msgstr ""
-"Tato akce je nevratná.\n"
-"Chcete pokraÄovat?"
+#: src/slic3r/GUI/Tab.cpp:1244
+msgid "This action is not revertable.\nDo you want to proceed?"
+msgstr "Tato akce je nevratná.\nChcete pokraÄovat?"
-#: src/libslic3r/PrintConfig.cpp:165
+#: src/libslic3r/PrintConfig.cpp:199
msgid "This code is inserted between objects when using sequential printing. By default extruder and bed temperature are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."
msgstr "Tento kód je vložen mezi objekty, pokud je použit sekvenÄní tisk. Ve výchozím nastavení je resetován extruder a tisková podložka pomocí non-wait (neÄekacím) příkazem; nicménÄ› pokud jsou příkazy M104, M109, 140 nebo M190 detekovány v tomto vlastním kódu, Slic3r nebude pÅ™idávat teplotní příkazy. Můžete pÅ™idávat zástupné promÄ›nné pro veÅ¡keré nastavení Slic3ru, takže můžete vložit příkaz “M109 S[first_layer_temperature]†kamkoliv chcete."
-#: src/libslic3r/PrintConfig.cpp:1081
+#: src/libslic3r/PrintConfig.cpp:1174
msgid "This custom code is inserted at every layer change, right after the Z move and before the extruder moves to the first layer point. Note that you can use placeholder variables for all Slic3r settings as well as [layer_num] and [layer_z]."
msgstr "Tento vlastní kód je vložen při každé změně vrstvy, hned po pohybu Z a předtím, než se extruder přesune na první bod vrstvy. Můžete přidávat zástupné proměnné pro veškeré nastavení Slic3ru, stejně tak jako [layer_num] a [layer_z]."
-#: src/libslic3r/PrintConfig.cpp:154
+#: src/libslic3r/PrintConfig.cpp:188
msgid "This custom code is inserted at every layer change, right before the Z move. Note that you can use placeholder variables for all Slic3r settings as well as [layer_num] and [layer_z]."
msgstr "Tento vlastní kód je vložen pro každou změnu vrstvy, předtím než se pohne Z. Můžete přidávat zástupné proměnné pro veškeré nastavení Slic3ru stejně tak jako [layer_num] a [layer_z]."
-#: src/libslic3r/PrintConfig.cpp:2094
+#: src/libslic3r/PrintConfig.cpp:2237
msgid "This custom code is inserted before every toolchange. Placeholder variables for all PrusaSlicer settings as well as {previous_extruder} and {next_extruder} can be used. When a tool-changing command which changes to the correct extruder is included (such as T{next_extruder}), PrusaSlicer will emit no other such command. It is therefore possible to script custom behaviour both before and after the toolchange."
msgstr "Tento vlastní kód je vložen při každé změně nástroje (extruderu). Lze používat zástupné proměnné pro všechna nastavení PrusaSliceru stejně jako {previous_extruder} a {next_extruder}. Když je použit příkaz pro výměnu extruderu, který mění na požadovaný extruder (jako je T {next_extruder}), PrusaSlicer nevytvoří žádný jiný takový příkaz. Je tedy možné skriptovat vlastní chování před i po výměně nástroje."
-#: src/libslic3r/PrintConfig.cpp:396
+#: src/libslic3r/PrintConfig.cpp:430
msgid "This end procedure is inserted at the end of the output file, before the printer end gcode (and before any toolchange from this filament in case of multimaterial printers). Note that you can use placeholder variables for all PrusaSlicer settings. If you have multiple extruders, the gcode is processed in extruder order."
msgstr "Tento kód je vložen na konec výstupního souboru pÅ™ed tím, než tiskárna dokonÄí gcode (a pÅ™ed vÅ¡echny zmÄ›ny extruderu z tohoto filamentu v případÄ› multimateriálových tiskáren). Můžete pÅ™idávat zástupné promÄ›nné pro veÅ¡keré nastavení PrusaSliceru. Pokud máte tiskárnu s více extrudery, G-code je zpracováván v poÅ™adí extruderů."
-#: src/libslic3r/PrintConfig.cpp:386
+#: src/libslic3r/PrintConfig.cpp:420
msgid "This end procedure is inserted at the end of the output file. Note that you can use placeholder variables for all PrusaSlicer settings."
msgstr "Tento kód je vložen na konec výstupního souboru. Můžete také přidávat zástupné proměnné pro veškeré nastavení PrusaSliceru."
-#: src/libslic3r/PrintConfig.cpp:1258 src/libslic3r/PrintConfig.cpp:1269
+#: src/libslic3r/PrintConfig.cpp:1366 src/libslic3r/PrintConfig.cpp:1377
msgid "This experimental setting is used to limit the speed of change in extrusion rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds."
msgstr "Toto experimentální nastavení se používá k omezení rychlosti změny objemového průtoku. Hodnota 1,8mm³/s² zajišťuje, že změna objemového průtoku z 1,8 mm³/s (šířka extruze 0,45 mm, výška extruze 0,2 mm, rychlost posuvu 20 mm/s) na 5,4 mm³/s (rychlost posuvu 60 mm/s) potrvá nejméně 2 sekundy."
-#: src/libslic3r/PrintConfig.cpp:1248
+#: src/libslic3r/PrintConfig.cpp:1356
msgid "This experimental setting is used to set the maximum volumetric speed your extruder supports."
msgstr "Toto experimentální nastavení slouží k nastavení maximální objemové rychlosti, kterou váš extruder podporuje."
-#: src/libslic3r/PrintConfig.cpp:2162
+#: src/libslic3r/PrintConfig.cpp:2305
msgid "This experimental setting uses G10 and G11 commands to have the firmware handle the retraction. This is only supported in recent Marlin."
msgstr "Toto experimentální nastavení používá příkazy G10 a G11, aby si firmware poradil s retrakcí. Toto je podporováno pouze v posledních verzích firmwaru Marlin."
-#: src/libslic3r/PrintConfig.cpp:2176
+#: src/libslic3r/PrintConfig.cpp:2319
msgid "This experimental setting uses outputs the E values in cubic millimeters instead of linear millimeters. If your firmware doesn't already know filament diameter(s), you can put commands like 'M200 D[filament_diameter_0] T0' in your start G-code in order to turn volumetric mode on and use the filament diameter associated to the filament selected in Slic3r. This is only supported in recent Marlin."
-msgstr "Toto experimentální nastavení používá výstupní hodnoty E v kubických milimetrech místo lineárních milimetrů. Pokud firmware dosud nezná průmÄ›r (průmÄ›ry) filamentu, můžete v poÄáteÄním G-code zadat příkazy jako “M200 D [filament_diameter_0] T0â€, pro se zapnutí volumetrického režimu a použití průmÄ›ru filamentu pÅ™idruženého k vybranému filamentu ve Slic3ru. Toto je podporováno pouze v posledních verzích firmwaru Marlin."
+msgstr "Toto experimentální nastavení používá výstupní hodnoty E v kubických milimetrech místo lineárních milimetrů. Pokud firmware dosud nezná průmÄ›r (průmÄ›ry) filamentu, můžete v poÄáteÄním G-code zadat příkazy jako “M200 D [filament_diameter_0] T0â€, pro zapnutí volumetrického režimu a použití průmÄ›ru filamentu pÅ™idruženého k vybranému filamentu ve Slic3ru. Toto je podporováno pouze v posledních verzích firmwaru Marlin."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3972
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4459
msgid "This extruder will be set for selected items"
msgstr "Tento extruder bude nastaven pro vybrané položky"
-#: src/libslic3r/PrintConfig.cpp:224
+#: src/libslic3r/PrintConfig.cpp:258
msgid "This factor affects the amount of plastic for bridging. You can decrease it slightly to pull the extrudates and prevent sagging, although default settings are usually good and you should experiment with cooling (use a fan) before tweaking this."
-msgstr "Tato hodnota urÄuje množství vytlaÄeného plastu pÅ™i vytváření mostů. Mírným snížením této hodnoty můžete pÅ™edejít pronášení i když, pÅ™ednastavené hodnoty jsou vÄ›tÅ¡inou dobré a je lepší experimentovat s chlazením (využitím ventilátoru), než s touto hodnotou."
+msgstr "Tato hodnota urÄuje množství vytlaÄeného plastu pÅ™i vytváření mostů. Mírným snížením této hodnoty můžete pÅ™edejít pronášení, i když pÅ™ednastavené hodnoty jsou vÄ›tÅ¡inou dobré a je lepší experimentovat s chlazením (využitím ventilátoru) než s touto hodnotou."
-#: src/libslic3r/PrintConfig.cpp:546
+#: src/libslic3r/PrintConfig.cpp:582
msgid "This factor changes the amount of flow proportionally. You may need to tweak this setting to get nice surface finish and correct single wall widths. Usual values are between 0.9 and 1.1. If you think you need to change this more, check filament diameter and your firmware E steps."
-msgstr "Tento faktor mění poměrné množství průtoku. Možná bude třeba toto nastavení vyladit, pro dosažení hezkého povrchu a správné šířky jednotlivých stěn. Obvyklé hodnoty jsou mezi 0,9 a 1,1. Pokud si myslíte, že hodnotu potřebujete změnit více, zkontrolujte průměr filamentu a E kroky ve firmwaru."
+msgstr "Tento faktor mění poměrné množství průtoku. Možná bude třeba toto nastavení vyladit pro dosažení hezkého povrchu a správné šířky jednotlivých stěn. Obvyklé hodnoty jsou mezi 0,9 a 1,1. Pokud si myslíte, že hodnotu potřebujete změnit více, zkontrolujte průměr filamentu a E kroky ve firmwaru."
-#: src/libslic3r/PrintConfig.cpp:214
+#: src/libslic3r/PrintConfig.cpp:248
msgid "This fan speed is enforced during all bridges and overhangs."
msgstr "Nastavená rychlost ventilátoru je využita vždy při vytváření mostů a přesahů."
-#: src/libslic3r/PrintConfig.cpp:992
+#: src/libslic3r/PrintConfig.cpp:1036
msgid "This feature allows to combine infill and speed up your print by extruding thicker infill layers while preserving thin perimeters, thus accuracy."
msgstr "Tato funkce umožňuje kombinovat výplň a urychlit tisk pomocí extruzí silnějších výplňových vrstev při zachování tenkých obvodů, a tím i přesnosti."
-#: src/libslic3r/PrintConfig.cpp:1746
+#: src/libslic3r/PrintConfig.cpp:1861
msgid "This feature allows to force a solid layer every given number of layers. Zero to disable. You can set this to any value (for example 9999); Slic3r will automatically choose the maximum possible number of layers to combine according to nozzle diameter and layer height."
msgstr "Tato funkce umožňuje vynucení plné vrstvy za každý daný poÄet vrstev. Pro vypnutí nastavte nulu. Můžete nastavit libovolnou hodnotu (například 9999); Slic3r automaticky zvolí maximální poÄet vrstev, které se budou kombinovat podle průmÄ›ru trysky a výšky vrstvy."
-#: src/libslic3r/PrintConfig.cpp:1795
-msgid "This feature will raise Z gradually while printing a single-walled object in order to remove any visible seam. This option requires a single perimeter, no infill, no top solid layers and no support material. You can still set any number of bottom solid layers as well as skirt/brim loops. It won't work when printing more than an object."
-msgstr "Tato funkce zvýší postupnÄ› Z pÅ™i tisku jednovrstvého objektu, aby se odstranil jakýkoli viditelný Å¡ev. Tato volba vyžaduje jediný obvod, žádnou výplň, žádné vrchní plné vrstvy a žádný podpůrný materiál. Můžete stále nastavit libovolný poÄet spodních plných vrstev, stejnÄ› jako obrysové smyÄky / límec. PÅ™i tisku více než jednoho objektu nebude toto nastavení fungovat."
+#: src/libslic3r/PrintConfig.cpp:1995
+msgid "This feature will raise Z gradually while printing a single-walled object in order to remove any visible seam. This option requires a single perimeter, no infill, no top solid layers and no support material. You can still set any number of bottom solid layers as well as skirt/brim loops. It won't work when printing more than one single object."
+msgstr "Tato funkce zvýší postupnÄ› Z pÅ™i tisku jednovrstvého objektu, aby se odstranil jakýkoli viditelný Å¡ev. Tato volba vyžaduje jediný obvod, žádnou výplň, žádné vrchní plné vrstvy a žádný podpůrný materiál. Můžete stále nastavit libovolný poÄet spodních plných vrstev, stejnÄ› jako obrysové smyÄky / límec. PÅ™i tisku více než jednoho samostatného objektu nebude toto nastavení fungovat."
-#: src/slic3r/GUI/Plater.cpp:2367
+#: src/slic3r/GUI/Plater.cpp:2329
msgid "This file cannot be loaded in a simple mode. Do you want to switch to an advanced mode?"
msgstr "Tento soubor nelze naÄíst v jednoduchém režimu. Chcete pÅ™epnout do pokroÄilého režimu?"
-#: src/slic3r/GUI/Plater.cpp:2357
-msgid ""
-"This file contains several objects positioned at multiple heights.\n"
-"Instead of considering them as multiple objects, should I consider\n"
-"this file as a single object having multiple parts?"
-msgstr ""
-"Tento soubor obsahuje nÄ›kolik objektů umístÄ›ných v různých výškách. Mají být vloženy jako jeden objekt obsahující více Äástí,\n"
-"namísto vložení několika objektů?"
+#: src/slic3r/GUI/Plater.cpp:2319
+msgid "This file contains several objects positioned at multiple heights.\nInstead of considering them as multiple objects, should I consider\nthis file as a single object having multiple parts?"
+msgstr "Tento soubor obsahuje nÄ›kolik objektů umístÄ›ných v různých výškách. Mají být vloženy jako jeden objekt obsahující více Äástí,\nnamísto vložení nÄ›kolika objektů?"
#: src/slic3r/GUI/FirmwareDialog.cpp:332
-#, c-format
-msgid ""
-"This firmware hex file does not match the printer model.\n"
-"The hex file is intended for: %s\n"
-"Printer reported: %s\n"
-"\n"
-"Do you want to continue and flash this hex file anyway?\n"
-"Please only continue if you are sure this is the right thing to do."
-msgstr ""
-"Tento hex soubor s firmware neodpovídá modelu tiskárny.\n"
-"Soubor hex je urÄen pro: %s\n"
-"Tiskárna oznámila: %s\n"
-"\n"
-"Chcete i pÅ™esto pokraÄovat a nahrát do tiskárny hex soubor?\n"
-"PokraÄujte prosím, pouze pokud jste si jisti, že je to správný soubor."
-
-#: src/libslic3r/PrintConfig.cpp:314
+#, possible-c-format
+msgid "This firmware hex file does not match the printer model.\nThe hex file is intended for: %s\nPrinter reported: %s\n\nDo you want to continue and flash this hex file anyway?\nPlease only continue if you are sure this is the right thing to do."
+msgstr "Tento hex soubor s firmware neodpovídá modelu tiskárny.\nSoubor hex je urÄen pro: %s\nTiskárna oznámila: %s\n\nChcete i pÅ™esto pokraÄovat a nahrát do tiskárny hex soubor?\nPokraÄujte prosím, pouze pokud jste si jisti, že je to správný soubor."
+
+#: src/libslic3r/PrintConfig.cpp:348
msgid "This flag enables the automatic cooling logic that adjusts print speed and fan speed according to layer printing time."
msgstr "Zapne výpoÄet automatického chlazení, který upravuje rychlost tisku a ventilátoru v závislosti na délce tisku jedné vrstvy."
-#: src/slic3r/GUI/Plater.cpp:536
+#: src/slic3r/GUI/Plater.cpp:402
msgid "This flag enables the brim that will be printed around each object on the first layer."
msgstr "Tato vlajka zapíná límec, který bude vytištěn kolem každého objektu při první vrstvě."
-#: src/libslic3r/PrintConfig.cpp:1538
+#: src/libslic3r/PrintConfig.cpp:1646
msgid "This flag enforces a retraction whenever a Z move is done."
msgstr "Tato možnost vyvolá retrakci, kdykoli je proveden pohyb Z."
-#: src/libslic3r/PrintConfig.cpp:2194
+#: src/libslic3r/PrintConfig.cpp:2337
msgid "This flag will move the nozzle while retracting to minimize the possible blob on leaky extruders."
msgstr "Toto nastavení přemístí trysku při retrakci, aby se minimalizovalo možné vytékání materiálu."
-#: src/slic3r/GUI/Tab.cpp:953
+#: src/libslic3r/PrintConfig.cpp:1961
+msgid "This G-code will be used as a code for the color change"
+msgstr "Tento G-code bude použit jako kód pro změnu barvy"
+
+#: src/libslic3r/PrintConfig.cpp:1970
+msgid "This G-code will be used as a code for the pause print"
+msgstr "Tento G-code bude použit jako kód pro pozastavení tisku"
+
+#: src/libslic3r/PrintConfig.cpp:1979
+msgid "This G-code will be used as a custom code"
+msgstr "Tento G-code bude použit jako vlastní kód"
+
+#: src/slic3r/GUI/Tab.cpp:1272
msgid "This is a default preset."
msgstr "Toto je výchozí přednastavení."
-#: src/libslic3r/PrintConfig.cpp:2766
+#: src/libslic3r/PrintConfig.cpp:2930
msgid "This is a relative measure of support points density."
msgstr "Relativní míra hustoty podpěrných bodů."
-#: src/slic3r/GUI/Tab.cpp:2338
+#: src/slic3r/GUI/Tab.cpp:2507
msgid "This is a single extruder multimaterial printer, diameters of all extruders will be set to the new value. Do you want to proceed?"
msgstr "Jedná se o multimateriálovou tiskárnu s jedním extruderem, průmÄ›ry vÅ¡ech extruderů se nastaví na novou hodnotu. Chcete pokraÄovat?"
-#: src/slic3r/GUI/Tab.cpp:955
+#: src/slic3r/GUI/Tab.cpp:1274
msgid "This is a system preset."
msgstr "Toto je systémové přednastavení."
-#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:583
+#: src/libslic3r/PrintConfig.cpp:559 src/libslic3r/PrintConfig.cpp:619
msgid "This is only used in the Slic3r interface as a visual help."
msgstr "Toto je v Slic3ru jako názorná pomoc."
-#: src/libslic3r/PrintConfig.cpp:336
+#: src/libslic3r/PrintConfig.cpp:370
msgid "This is the acceleration your printer will be reset to after the role-specific acceleration values are used (perimeter/infill). Set zero to prevent resetting acceleration at all."
msgstr "Toto je hodnota akcelerace na kterou se tiskárna vrátí po specifických úpravách akcelerace například při tisku (perimetru/výplně). Nastavením na nulu zabráníte návratu rychlostí zcela."
-#: src/libslic3r/PrintConfig.cpp:194
+#: src/libslic3r/PrintConfig.cpp:228
msgid "This is the acceleration your printer will use for bridges. Set zero to disable acceleration control for bridges."
-msgstr "Nastavení akcelerace tiskárny při vytváření mostů. Nastavením na nulu vypnete ovládání akcelerace pro mosty."
+msgstr "Toto je zrychlení, které vaše tiskárna použije při vytváření mostů. Nastavením na nulu vypnete ovládání akcelerace pro mosty."
-#: src/libslic3r/PrintConfig.cpp:860
+#: src/libslic3r/PrintConfig.cpp:900
msgid "This is the acceleration your printer will use for first layer. Set zero to disable acceleration control for first layer."
msgstr "Toto je zrychlení, které vaše tiskárna použije pro první vrstvu. Nastavte nulu pro vypnutí řízení zrychlení pro první vrstvu."
-#: src/libslic3r/PrintConfig.cpp:982
+#: src/libslic3r/PrintConfig.cpp:1026
msgid "This is the acceleration your printer will use for infill. Set zero to disable acceleration control for infill."
msgstr "Toto je zrychlení, které vaše tiskárna použije pro výplň. Nastavte nulu, chcete-li vypnout řízení zrychlení pro výplň."
-#: src/libslic3r/PrintConfig.cpp:1400
-msgid "This is the acceleration your printer will use for perimeters. A high value like 9000 usually gives good results if your hardware is up to the job. Set zero to disable acceleration control for perimeters."
-msgstr "Jedná se o akceleraci, kterou vaše tiskárna použije pro perimetry. Vysoká hodnota, jako je 9000, obvykle dává dobré výsledky, pokud je váš hardware v pořádku. Nastavte nulu pro vypnutí řízení zrychlení pro perimetry."
+#: src/libslic3r/PrintConfig.cpp:1582
+msgid "This is the acceleration your printer will use for perimeters. Set zero to disable acceleration control for perimeters."
+msgstr "Toto je zrychlení, které vaše tiskárna použije pro perimetry. Nastavením na nulu vypnete ovládání akcelerace pro perimetry."
-#: src/libslic3r/PrintConfig.cpp:1327
+#: src/libslic3r/PrintConfig.cpp:1435
msgid "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)"
msgstr "Průměr trysky extruderu (například: 0.5, 0.35 atd.)"
-#: src/libslic3r/PrintConfig.cpp:1227
-#, no-c-format
+#: src/libslic3r/PrintConfig.cpp:1335
+#, possible-c-format
msgid "This is the highest printable layer height for this extruder, used to cap the variable layer height and support layer height. Maximum recommended layer height is 75% of the extrusion width to achieve reasonable inter-layer adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter."
msgstr "Toto je nejvÄ›tší možná výška vrstvy pro tento extruder, který se používá k zakrytí výšky promÄ›nné vrstvy a výšky podpůrné vrstvy. Maximální doporuÄená výška vrstvy Äiní 75% šířky vytlaÄování, aby se dosáhlo pÅ™iměřené pÅ™ilnavosti mezi vrstvami. Pokud je nastavena hodnota 0, je výška vrstvy omezena na 75% průmÄ›ru trysky."
-#: src/libslic3r/PrintConfig.cpp:1290
+#: src/libslic3r/PrintConfig.cpp:1398
msgid "This is the lowest printable layer height for this extruder and limits the resolution for variable layer height. Typical values are between 0.05 mm and 0.1 mm."
msgstr "Nejmenší tisknutelná výška vrstvy pro tento extruder. Omezuje rozlišení pro výšku proměnné vrstvy. Typické hodnoty jsou mezi 0,05 mm a 0,1 mm."
-#: src/libslic3r/GCode.cpp:639
+#: src/libslic3r/GCode.cpp:624
msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed."
msgstr "To je obvykle způsobeno zanedbatelně malým množstvím extrudovaného materiálu nebo chybným modelem. Zkuste model opravit nebo změnit jeho orientaci na podložce."
-#: src/libslic3r/PrintConfig.cpp:2215
+#: src/libslic3r/PrintConfig.cpp:2358
msgid "This matrix describes volumes (in cubic milimetres) required to purge the new filament on the wipe tower for any given pair of tools."
msgstr "Tato matice popisuje objemy (v kubických milimetrech) nutné k vyÄiÅ¡tÄ›ní nového filamentu na Äistící věži pro danou dvojici nástrojů."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:878
-msgid ""
-"This operation is irreversible.\n"
-"Do you want to proceed?"
-msgstr ""
-"Tato operace je nevratná.\n"
-"Chcete pokraÄovat?"
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:928
+msgid "This operation is irreversible.\nDo you want to proceed?"
+msgstr "Tato operace je nevratná.\nChcete pokraÄovat?"
-#: src/libslic3r/PrintConfig.cpp:1442
+#: src/libslic3r/PrintConfig.cpp:1550
msgid "This option sets the number of perimeters to generate for each layer. Note that Slic3r may increase this number automatically when it detects sloping surfaces which benefit from a higher number of perimeters if the Extra Perimeters option is enabled."
msgstr "Tato volba nastavuje poÄet perimetrů, které je tÅ™eba vygenerovat pro každou vrstvu. Slic3r může toto Äíslo automaticky zvýšit, pokud detekuje Å¡ikmé plochy, které se tisknou lépe s vyšším poÄtem obvodů, pokud je zapnuta možnost Extra perimetry."
-#: src/libslic3r/PrintConfig.cpp:1356
+#: src/libslic3r/PrintConfig.cpp:1464
msgid "This option will drop the temperature of the inactive extruders to prevent oozing. It will enable a tall skirt automatically and move extruders outside such skirt when changing temperatures."
msgstr "Tato volba sníží teplotu neaktivních extruderů, aby u nich nedošlo k vytékání."
-#: src/libslic3r/PrintConfig.cpp:1029
+#: src/libslic3r/PrintConfig.cpp:1073
msgid "This option will limit infill to the areas actually needed for supporting ceilings (it will act as internal support material). If enabled, slows down the G-code generation due to the multiple checks involved."
msgstr "Tato volba omezuje výplň na plochy skuteÄnÄ› potÅ™ebné pro podpÄ›ru stropů (bude se chovat jako vnitÅ™ní podpÄ›rný materiál). Je-li tato volba zapnuta, zpomaluje generování G-code kvůli nÄ›kolikanásobným kontrolám."
-#: src/libslic3r/PrintConfig.cpp:1022
+#: src/libslic3r/PrintConfig.cpp:1066
msgid "This option will switch the print order of perimeters and infill, making the latter first."
msgstr "Tato volba obrátí pořadí tisku obvodů a výplní."
-#: src/libslic3r/PrintConfig.cpp:459
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:85
+msgid "This printer will be shown in the presets list as"
+msgstr "Tato tiskárna se v seznamu přednastavení zobrazí jako"
+
+#: src/libslic3r/PrintConfig.cpp:495
msgid "This separate setting will affect the speed of external perimeters (the visible ones). If expressed as percentage (for example: 80%) it will be calculated on the perimeters speed setting above. Set to zero for auto."
msgstr "Toto oddÄ›lené nastavení ovlivní rychlost tisku vnÄ›jších perimetrů (tÄ›ch viditelných). Pokud je hodnota vyjádÅ™ena procenty (například: 80%), bude rychlost vypoÄítána z hodnoty rychlosti tisku perimetrů, nastavené výše. Nastavte nulu pro automatický výpoÄet."
-#: src/libslic3r/PrintConfig.cpp:1717
+#: src/libslic3r/PrintConfig.cpp:1832
msgid "This separate setting will affect the speed of perimeters having radius <= 6.5mm (usually holes). If expressed as percentage (for example: 80%) it will be calculated on the perimeters speed setting above. Set to zero for auto."
msgstr "Toto oddÄ›lené nastavení ovlivní rychlost perimetrů o polomÄ›ru <= 6,5 mm (obvykle díry). Pokud je vyjádÅ™eno jako procentní podíl (například: 80%), vypoÄte se z výše uvedeného nastavení rychlosti perimetrů. Pro automatické nastavení zadejte nulu."
-#: src/libslic3r/PrintConfig.cpp:1038
+#: src/libslic3r/PrintConfig.cpp:1082
msgid "This setting applies an additional overlap between infill and perimeters for better bonding. Theoretically this shouldn't be needed, but backlash might cause gaps. If expressed as percentage (example: 15%) it is calculated over perimeter extrusion width."
msgstr "Toto nastavení uplatňuje dodateÄné pÅ™ekrytí mezi výplní a obvodem pro lepší spojení. Teoreticky by to nemÄ›lo být potÅ™eba, ale reakce by mohla způsobit mezery. Pokud je vyjádÅ™eno procenty (například: 15%), vypoÄítá se z šířky extruze perimetrů."
@@ -8236,123 +9508,129 @@ msgstr "Toto nastavení uplatňuje dodateÄné pÅ™ekrytí mezi výplní a obvode
msgid "This setting controls the height (and thus the total number) of the slices/layers. Thinner layers give better accuracy but take more time to print."
msgstr "Toto nastavení řídí výšku (a tedy výsledný poÄet) Å™ezů/vrstev. TenÄí vrstva poskytuje lepší pÅ™esnost, ale tiskne se déle."
-#: src/libslic3r/PrintConfig.cpp:1218
+#: src/libslic3r/PrintConfig.cpp:1326
msgid "This setting represents the maximum speed of your fan."
msgstr "Toto nastavení vyjadřuje maximální rychlost ventilátoru."
-#: src/libslic3r/PrintConfig.cpp:1281
+#: src/libslic3r/PrintConfig.cpp:1389
msgid "This setting represents the minimum PWM your fan needs to work."
msgstr "Toto nastavení představuje minimální hodnotu PWM, kterou ventilátor potřebuje, aby pracoval."
-#: src/libslic3r/PrintConfig.cpp:1829
+#: src/libslic3r/PrintConfig.cpp:1944
msgid "This start procedure is inserted at the beginning, after any printer start gcode (and after any toolchange to this filament in case of multi-material printers). This is used to override settings for a specific filament. If PrusaSlicer detects M104, M109, M140 or M190 in your custom codes, such commands will not be prepended automatically so you're free to customize the order of heating commands and other custom actions. Note that you can use placeholder variables for all PrusaSlicer settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want. If you have multiple extruders, the gcode is processed in extruder order."
msgstr "Tento kód je vložen na zaÄátek tisku. Jakmile tiskárna zaÄne zpracovávat gcode (a po jakékoliv zmÄ›nÄ› extruderu na tento filament v případÄ› multimateriálového tisku). Slouží k pÅ™epsání nastavení pro konkrétní filament. Pokud PrusaSlicer detekuje příkazy M104, M109, M140 nebo M190 v uživatelsky definovaném kódu, tyto příkazy nebudou automaticky pÅ™ipojeny, takže si můžete pÅ™izpůsobit poÅ™adí příkazů pÅ™edehÅ™evu a dalších vlastních akcí. Také můžete pÅ™idávat zástupné promÄ›nné pro veÅ¡keré nastavení PrusaSliceru, takže můžete vložit příkaz “M109 S[first_layer_temperature]†kamkoliv chcete. Pokud máte tiskárnu s více extrudery, G-code je zpracováván v poÅ™adí extruderů."
-#: src/libslic3r/PrintConfig.cpp:1814
+#: src/libslic3r/PrintConfig.cpp:1929
msgid "This start procedure is inserted at the beginning, after bed has reached the target temperature and extruder just started heating, and before extruder has finished heating. If PrusaSlicer detects M104 or M190 in your custom codes, such commands will not be prepended automatically so you're free to customize the order of heating commands and other custom actions. Note that you can use placeholder variables for all PrusaSlicer settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."
msgstr "Tento kód je vložen na zaÄátek tisku. Po okamžiku dosažení požadované teploty podložky a zaÄátku nahřívání extruderu a pÅ™ed dokonÄení pÅ™edehÅ™evu trysky. Pokud PrusaSlicer detekuje příkazy M104, M190 v uživatelsky definovaném kódu, tyto příkazy nebudou automaticky pÅ™ipojeny, takže si můžete pÅ™izpůsobit poÅ™adí příkazů pÅ™edehÅ™evu a dalších vlastních akcí. Také můžete pÅ™idávat zástupné promÄ›nné pro veÅ¡keré nastavení PrusaSliceru, takže můžete vložit příkaz “M109 S[first_layer_temperature]†kamkoliv chcete."
-#: src/libslic3r/PrintConfig.cpp:695
+#: src/libslic3r/PrintConfig.cpp:731
msgid "This string is edited by RammingDialog and contains ramming specific parameters."
msgstr "This string is edited by RammingDialog and contains ramming specific parameters."
-#: src/libslic3r/PrintConfig.cpp:2286
+#: src/libslic3r/PrintConfig.cpp:2429
msgid "This value will be added (or subtracted) from all the Z coordinates in the output G-code. It is used to compensate for bad Z endstop position: for example, if your endstop zero actually leaves the nozzle 0.3mm far from the print bed, set this to -0.3 (or fix your endstop)."
msgstr "Tato hodnota bude pÅ™idána (nebo odeÄtena) ze vÅ¡ech souÅ™adnic Z ve výstupním G-code. Používá se ke kompenzování Å¡patné pozice endstopu Z. Například pokud endstop 0 skuteÄnÄ› ponechá trysku 0,3 mm daleko od tiskové podložky, nastavte hodnotu -0,3 (nebo dolaÄte svůj koncový doraz)."
-#: src/libslic3r/PrintConfig.cpp:2208
+#: src/libslic3r/PrintConfig.cpp:2351
msgid "This vector saves required volumes to change from/to each tool used on the wipe tower. These values are used to simplify creation of the full purging volumes below."
msgstr "Tento vektor ukládá potÅ™ebné objemy pro zmÄ›nu z/na každý extruder používaný na Äistící věži. Tyto hodnoty jsou použity pro zjednoduÅ¡ení vytvoÅ™ení celkových objemů ÄiÅ¡tÄ›ní níže."
#: src/slic3r/GUI/UpdateDialogs.cpp:216
-#, c-format
-msgid ""
-"This version of %s is not compatible with currently installed configuration bundles.\n"
-"This probably happened as a result of running an older %s after using a newer one.\n"
-"\n"
-"You may either exit %s and try again with a newer version, or you may re-run the initial configuration. Doing so will create a backup snapshot of the existing configuration before installing files compatible with this %s."
-msgstr ""
-"Tato verze %s není kompatibilní se souÄasnÄ› nainstalovanými balíÄky nastavení.\n"
-"Tato situace nejspíše nastala spuštěním starší verze %s po používání novější verze.\n"
-"\n"
-"Můžete buÄ ukonÄit %s a zkusit to znovu s novou verzí, nebo můžete znovu spustit výchozí konfiguraci. PÅ™ed instalací kompatibilního nastavení s touto verzí %s dojde k vytvoÅ™ení zálohy souÄasné konfigurace."
+#, possible-c-format
+msgid "This version of %s is not compatible with currently installed configuration bundles.\nThis probably happened as a result of running an older %s after using a newer one.\n\nYou may either exit %s and try again with a newer version, or you may re-run the initial configuration. Doing so will create a backup snapshot of the existing configuration before installing files compatible with this %s."
+msgstr "Tato verze %s není kompatibilní se souÄasnÄ› nainstalovanými balíÄky nastavení.\nTato situace nejspíše nastala spuÅ¡tÄ›ním starší verze %s po používání novÄ›jší verze.\n\nMůžete buÄ ukonÄit %s a zkusit to znovu s novou verzí, nebo můžete znovu spustit výchozí konfiguraci. PÅ™ed instalací kompatibilního nastavení s touto verzí %s dojde k vytvoÅ™ení zálohy souÄasné konfigurace."
-#: src/libslic3r/PrintConfig.cpp:2458
+#: src/libslic3r/PrintConfig.cpp:2601
msgid "This will apply a gamma correction to the rasterized 2D polygons. A gamma value of zero means thresholding with the threshold in the middle. This behaviour eliminates antialiasing without losing holes in polygons."
msgstr "Aplikuje gamma korekci na rastrové 2D polygony. Hodnota nula znamená nastavení prahové hodnoty doprostřed. Toto chování eliminuje antialiasing bez ztráty otvorů v polygonech."
-#: src/libslic3r/PrintConfig.cpp:2081
+#: src/libslic3r/PrintConfig.cpp:2224
msgid "Threads"
msgstr "Vlákna"
-#: src/libslic3r/PrintConfig.cpp:2082
+#: src/libslic3r/PrintConfig.cpp:2225
msgid "Threads are used to parallelize long-running tasks. Optimal threads number is slightly above the number of available cores/processors."
msgstr "Vlákna jsou používána pro paralelizaci ÄasovÄ› nároÄnÄ›jších úloh. Optimální poÄet vláken je mírnÄ› nad poÄtem dostupných jader/procesorů."
-#: src/slic3r/GUI/Tab.cpp:2093
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:235
+msgid "Threshold:"
+msgstr "Práh:"
+
+#: src/slic3r/GUI/Tab.cpp:2263
msgid "Tilt"
msgstr "Náklon"
-#: src/slic3r/GUI/Tab.cpp:2094
+#: src/slic3r/GUI/Tab.cpp:2264
msgid "Tilt time"
msgstr "Doba náklonu"
+#: src/slic3r/GUI/GCodeViewer.cpp:2225 src/slic3r/GUI/GCodeViewer.cpp:2233
#: src/slic3r/GUI/RammingChart.cpp:76
msgid "Time"
msgstr "ÄŒas"
-#: src/libslic3r/PrintConfig.cpp:687
+#: src/libslic3r/PrintConfig.cpp:723
msgid "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new filament during a tool change (when executing the T code). This time is added to the total print time by the G-code time estimator."
msgstr "Doba, po kterou firmware tiskárny (nebo jednotka Multi Material 2.0) zavádí nový filament bÄ›hem jeho výmÄ›ny (pÅ™i provádÄ›ní kódu T). Tento Äas je pÅ™idán k celkové dobÄ› tisku pomocí G-code odhadovaÄe tiskového Äasu."
-#: src/libslic3r/PrintConfig.cpp:702
+#: src/libslic3r/PrintConfig.cpp:738
msgid "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a filament during a tool change (when executing the T code). This time is added to the total print time by the G-code time estimator."
msgstr "Doba, po kterou firmware tiskárny (nebo jednotka Multi Material 2.0) vysouvá filament bÄ›hem jeho výmÄ›ny (pÅ™i provádÄ›ní kódu T). Tento Äas je pÅ™idán k celkové dobÄ› tisku pomocí G-code odhadovaÄe tiskového Äasu."
-#: src/libslic3r/PrintConfig.cpp:2407
+#: src/libslic3r/PrintConfig.cpp:2550
msgid "Time of the fast tilt"
msgstr "Doba trvání rychlého náklonu"
-#: src/libslic3r/PrintConfig.cpp:2416
+#: src/libslic3r/PrintConfig.cpp:2559
msgid "Time of the slow tilt"
msgstr "Doba trvání pomalého náklonu"
-#: src/libslic3r/PrintConfig.cpp:641
+#: src/libslic3r/PrintConfig.cpp:677
msgid "Time to wait after the filament is unloaded. May help to get reliable toolchanges with flexible materials that may need more time to shrink to original dimensions."
msgstr "Doba Äekání po vysunutí filamentu. Může pomoci ke spolehlivé zmÄ›nÄ› extruderu s flexibilními materiály, které potÅ™ebují více Äasu ke smrÅ¡tÄ›ní na původní rozmÄ›ry."
-#: src/slic3r/GUI/Tab.cpp:966
+#: src/slic3r/GUI/GCodeViewer.cpp:2197
+msgid "to"
+msgstr "do"
+
+#: src/slic3r/GUI/Tab.cpp:1284
msgid "To do that please specify a new name for the preset."
msgstr "Chcete-li akci provést, prosím nejdříve zadejte nový název přednastavení."
-#: src/slic3r/GUI/Plater.cpp:4014
+#: src/slic3r/GUI/Plater.cpp:3934
msgid "To objects"
msgstr "Na objekty"
-#: src/slic3r/GUI/Plater.cpp:4016
+#: src/slic3r/GUI/Plater.cpp:3936
msgid "To parts"
msgstr "Na Äásti"
-#: src/slic3r/GUI/Tab.cpp:1756
+#: src/slic3r/Utils/Http.cpp:82
+msgid "To specify the system certificate store manually, please set the %1% environment variable to the correct CA bundle and restart the application."
+msgstr "Chcete-li zadat úložiÅ¡tÄ› systémových certifikátů ruÄnÄ›, nastavte promÄ›nnou prostÅ™edí %1% na správný CA balíÄek a restartujte aplikaci."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:360
msgid "To use a custom CA file, please import your CA file into Certificate Store / Keychain."
msgstr "Chcete-li použít vlastní soubor CA, importujte soubor CA do Certificate Store / Keychain."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263
-#, c-format
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:271
+#, possible-c-format
msgid "Toggle %c axis mirroring"
msgstr "Přepnout zrcadlení podle osy %c"
-#: src/libslic3r/Zipper.cpp:34
+#: src/libslic3r/miniz_extension.cpp:93
msgid "too many files"
msgstr "příliš mnoho souborů"
-#: src/libslic3r/SLAPrintSteps.cpp:190
-msgid "Too much overlapping holes."
+#: src/libslic3r/SLAPrintSteps.cpp:192
+msgid "Too many overlapping holes."
msgstr "Příliš mnoho překrývajících se otvorů."
-#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/GUI_Preview.cpp:335
-#: src/slic3r/GUI/GUI_Preview.cpp:519 src/slic3r/GUI/GUI_Preview.cpp:574
-#: src/slic3r/GUI/GUI_Preview.cpp:835 src/libslic3r/GCode/PreviewData.cpp:357
+#: src/slic3r/GUI/GCodeViewer.cpp:2241 src/slic3r/GUI/GUI_Preview.cpp:281
+#: src/slic3r/GUI/GUI_Preview.cpp:453 src/slic3r/GUI/GUI_Preview.cpp:693
+#: src/slic3r/GUI/GUI_Preview.cpp:786 src/slic3r/GUI/GUI_Preview.cpp:1270
+#: src/libslic3r/GCode/PreviewData.cpp:362
msgid "Tool"
msgstr "Nástroj"
@@ -8360,54 +9638,71 @@ msgstr "Nástroj"
msgid "Tool #"
msgstr "Nástroj #"
-#: src/slic3r/GUI/Tab.cpp:2000 src/libslic3r/PrintConfig.cpp:2093
+#: src/slic3r/GUI/Tab.cpp:2189 src/libslic3r/PrintConfig.cpp:2236
msgid "Tool change G-code"
msgstr "G-code pro výměnu nástroje"
-#: src/slic3r/GUI/Tab.cpp:1491
+#: src/slic3r/GUI/GCodeViewer.cpp:2530 src/slic3r/GUI/GUI_Preview.cpp:1474
+msgid "Tool changes"
+msgstr "Výměny nástroje"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:1479
+msgid "Tool marker"
+msgstr "Vizualizace nástroje"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:223
+msgid "Tool position"
+msgstr "Poloha nástroje"
+
+#: src/slic3r/GUI/Tab.cpp:1837
msgid "Toolchange parameters with single extruder MM printers"
msgstr "Parametry při výměně (Multi Material s jedním extruderem)"
#. TRN To be shown in the main menu View->Top
#. TRN To be shown in Print Settings "Top solid layers"
-#: src/slic3r/GUI/MainFrame.cpp:662 src/libslic3r/PrintConfig.cpp:2132
-#: src/libslic3r/PrintConfig.cpp:2141
+#: src/slic3r/GUI/MainFrame.cpp:959 src/slic3r/GUI/MainFrame.cpp:1279
+#: src/libslic3r/PrintConfig.cpp:2275 src/libslic3r/PrintConfig.cpp:2284
msgid "Top"
msgstr "Shora"
-#: src/slic3r/GUI/PresetHints.cpp:304
+#: src/slic3r/GUI/PresetHints.cpp:302
msgid "Top / bottom shell thickness hint: Not available due to invalid layer height."
msgstr "Nápověda pro tloušťku vrchní / spodní skořepiny: Není k dipozici z důvodu neplatné výšky vrstvy."
-#: src/libslic3r/PrintConfig.cpp:415
+#: src/libslic3r/PrintConfig.cpp:449
msgid "Top fill pattern"
msgstr "Vzor výplně horní vrstvy"
-#: src/slic3r/GUI/PresetHints.cpp:323
+#: src/slic3r/GUI/PresetHints.cpp:321
msgid "Top is open."
msgstr "Horní Äást je otevÅ™ená."
-#: src/slic3r/GUI/PresetHints.cpp:317
+#: src/slic3r/GUI/PresetHints.cpp:315
msgid "Top shell is %1% mm thick for layer height %2% mm."
msgstr "Tloušťka vrchní skořepiny je %1% mm při výšce vrstvy %2% mm."
-#: src/slic3r/GUI/PresetHints.cpp:192
+#: src/slic3r/GUI/PresetHints.cpp:191
msgid "top solid infill"
msgstr "vrchní plná výplň"
-#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:315
-#: src/libslic3r/PrintConfig.cpp:2105 src/libslic3r/PrintConfig.cpp:2117
+#: src/slic3r/GUI/GUI_Preview.cpp:306 src/libslic3r/ExtrusionEntity.cpp:319
+#: src/libslic3r/ExtrusionEntity.cpp:346 src/libslic3r/PrintConfig.cpp:2248
+#: src/libslic3r/PrintConfig.cpp:2260
msgid "Top solid infill"
msgstr "Vrchní plné výplně"
-#: src/libslic3r/PrintConfig.cpp:2135
+#: src/libslic3r/PrintConfig.cpp:2278
msgid "Top solid layers"
msgstr "Vrchních plných vrstev"
-#: src/slic3r/GUI/MainFrame.cpp:662
+#: src/slic3r/GUI/MainFrame.cpp:959 src/slic3r/GUI/MainFrame.cpp:1279
msgid "Top View"
msgstr "Pohled svrchu"
+#: src/libslic3r/PrintConfig.cpp:1211
+msgid "Topmost surface only"
+msgstr "Pouze nejvrchnější vrstva"
+
#: src/slic3r/GUI/WipeTowerDialog.cpp:285
msgid "Total purging volume is calculated by summing two values below, depending on which tools are loaded/unloaded."
msgstr "Celkový objem ÄiÅ¡tÄ›ní je spoÄítán jako souÄet dvou hodnot níže v závislosti na tom, které extrudery jsou zavedeny/vyjmuty."
@@ -8420,171 +9715,181 @@ msgstr "Celkový objem rapidní extruze"
msgid "Total ramming time"
msgstr "Celkový Äas rapidní extruze"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:640
+msgid "Transfer"
+msgstr "Přenést"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:745
+msgid "Transfer the selected options to the newly selected preset \"%1%\"."
+msgstr "Přenese vybrané nastavení do nově vybraného přednastavení \"%1%\"."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:740
+msgid "Transfer the selected settings to the newly selected preset."
+msgstr "Přenést vybraná nastavení do nově zvoleného přednastavení."
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:561
msgid "Translate"
msgstr "Posunout"
-#: src/slic3r/GUI/Mouse3DController.cpp:300
-#: src/slic3r/GUI/Mouse3DController.cpp:317
+#: src/slic3r/GUI/Mouse3DController.cpp:282
+#: src/slic3r/GUI/Mouse3DController.cpp:303
msgid "Translation"
msgstr "Translace"
-#: src/slic3r/GUI/GUI_Preview.cpp:253 src/libslic3r/PrintConfig.cpp:2152
+#: src/slic3r/GUI/GCodeViewer.cpp:2489 src/slic3r/GUI/GUI_Preview.cpp:335
+#: src/slic3r/GUI/GUI_Preview.cpp:1471 src/libslic3r/PrintConfig.cpp:2295
msgid "Travel"
msgstr "Rychloposun"
-#: src/libslic3r/PrintConfig.cpp:845
+#: src/libslic3r/PrintConfig.cpp:883
msgid "Triangles"
msgstr "Trojúhelníky"
-#: src/libslic3r/PrintConfig.cpp:3448
+#: src/libslic3r/PrintConfig.cpp:3647
msgid "Try to repair any non-manifold meshes (this option is implicitly added whenever we need to slice the model to perform the requested action)."
msgstr "Pokuste se opravit nemanifoldní meshe (tato možnost je implicitně přidána vždy, když potřebujeme řezat model)."
-#: src/libslic3r/PrintConfig.cpp:1467
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:165
+msgid "Type here the name of your printer device"
+msgstr "Sem napište název pro vaší tiskárnu"
+
+#: src/libslic3r/PrintConfig.cpp:1575
msgid "Type of the printer."
msgstr "Typ tiskárny."
-#: src/slic3r/GUI/ConfigWizard.cpp:2013 src/slic3r/GUI/GUI_ObjectList.cpp:3553
+#: src/slic3r/GUI/ConfigWizard.cpp:2524 src/slic3r/GUI/ConfigWizard.cpp:2526
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4016
msgid "Type:"
msgstr "Typ:"
-#: src/slic3r/GUI/Plater.cpp:3428
+#: src/slic3r/GUI/OpenGLManager.cpp:275
+#, possible-c-format
+msgid "Unable to load the following shaders:\n%s"
+msgstr "Nelze naÄíst následující shadery: \n%s"
+
+#: src/slic3r/GUI/Plater.cpp:3233
msgid "Unable to reload:"
msgstr "Nelze znovu naÄíst:"
-#: src/libslic3r/Zipper.cpp:32
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:137
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:146
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:845
+msgid "Undef"
+msgstr "Nedefinováno"
+
+#: src/libslic3r/miniz_extension.cpp:91
msgid "undefined error"
msgstr "nedefinovaná chyba"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4624 src/slic3r/GUI/KBShortcutsDialog.cpp:130
-#: src/slic3r/GUI/MainFrame.cpp:581
+#: src/slic3r/GUI/GLCanvas3D.cpp:5028 src/slic3r/GUI/KBShortcutsDialog.cpp:125
+#: src/slic3r/GUI/MainFrame.cpp:1187
msgid "Undo"
msgstr "Zpět"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4065
-#, c-format
+#: src/slic3r/GUI/GLCanvas3D.cpp:4382
+#, possible-c-format
msgid "Undo %1$d Action"
msgid_plural "Undo %1$d Actions"
msgstr[0] "%1$d Akce Zpět"
msgstr[1] "%1$d Akce Zpět"
msgstr[2] "%1$d Akcí Zpět"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4047
+#: src/slic3r/GUI/GLCanvas3D.cpp:4361
msgid "Undo History"
msgstr "Historie operací Zpět"
-#: src/libslic3r/Zipper.cpp:56
+#: src/libslic3r/miniz_extension.cpp:115
msgid "unexpected decompressed size"
msgstr "neoÄekávaná dekomprimovaná velikost"
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:27
+#: src/slic3r/GUI/GUI_Preview.cpp:299 src/libslic3r/ExtrusionEntity.cpp:310
msgid "Unknown"
msgstr "Neznámý"
-#: src/slic3r/Utils/Duet.cpp:82 src/slic3r/Utils/Duet.cpp:137
-#: src/slic3r/Utils/FlashAir.cpp:119 src/slic3r/Utils/FlashAir.cpp:140
-#: src/slic3r/Utils/FlashAir.cpp:156
+#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:139
+#: src/slic3r/Utils/FlashAir.cpp:122 src/slic3r/Utils/FlashAir.cpp:143
+#: src/slic3r/Utils/FlashAir.cpp:159
msgid "Unknown error occured"
msgstr "Došlo k neznámé chybě"
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:178
+msgid "Unknown error occured during exporting G-code."
+msgstr "Během exportu G-codu došlo k neznámé chybě."
+
#: src/slic3r/GUI/WipeTowerDialog.cpp:263
msgid "unloaded"
msgstr "vyjmuto"
-#: src/libslic3r/PrintConfig.cpp:623
+#: src/libslic3r/PrintConfig.cpp:659
msgid "Unloading speed"
msgstr "Rychlost vysunutí"
-#: src/libslic3r/PrintConfig.cpp:632
+#: src/libslic3r/PrintConfig.cpp:668
msgid "Unloading speed at the start"
msgstr "PoÄáteÄní rychlost vysouvání filamentu"
-#: src/slic3r/GUI/Tab.cpp:3256
+#: src/slic3r/GUI/Tab.cpp:3693
msgid "UNLOCKED LOCK"
msgstr "ODEMÄŒENÃ ZÃMEK"
-#: src/slic3r/GUI/Tab.cpp:3282
-msgid ""
-"UNLOCKED LOCK icon indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\n"
-"Click to reset all settings for current option group to the system (or default) values."
+#: src/slic3r/GUI/Tab.cpp:3719
+msgid "UNLOCKED LOCK icon indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\nClick to reset all settings for current option group to the system (or default) values."
msgstr "Ikona ODEMKNUTÉHO ZÃMKU indikuje, že nÄ›která nastavení byla zmÄ›nÄ›na a nejsou shodná se systémovými (výchozími) hodnotami pro danou skupinu nastavení. KliknÄ›te pro reset vÅ¡ech nastavení aktuální skupiny nastavení na systémové hodnoty."
-#: src/slic3r/GUI/Tab.cpp:3297
-msgid ""
-"UNLOCKED LOCK icon indicates that the value was changed and is not equal to the system (or default) value.\n"
-"Click to reset current value to the system (or default) value."
-msgstr ""
-"Ikona ODEMKNUTÉHO ZÃMKU indikuje, že se hodnota zmÄ›nila a není shodná se systémovou (nebo výchozí) hodnotou.\n"
-"KliknÄ›te pro reset souÄasné hodnoty na systémovou hodnotu."
-
-#: src/slic3r/GUI/Plater.cpp:5203
-#, c-format
-msgid "Unmounting successful. The device %s(%s) can now be safely removed from the computer."
-msgstr "Odpojení probÄ›hlo úspěšné. Zařízení %s(%s) lze nyní bezpeÄnÄ› odebrat z poÄítaÄe."
-
-#: src/slic3r/GUI/GUI_Preview.cpp:255
-msgid "Unretractions"
-msgstr "Deretrakce"
-
-#: src/slic3r/GUI/Tab.cpp:2947
-msgid "Unsaved Changes"
-msgstr "Neuložené Změny"
+#: src/slic3r/GUI/Tab.cpp:3734
+msgid "UNLOCKED LOCK icon indicates that the value was changed and is not equal to the system (or default) value.\nClick to reset current value to the system (or default) value."
+msgstr "Ikona ODEMKNUTÉHO ZÃMKU indikuje, že se hodnota zmÄ›nila a není shodná se systémovou (nebo výchozí) hodnotou.\nKliknÄ›te pro reset souÄasné hodnoty na systémovou hodnotu."
-#: src/slic3r/GUI/GUI_App.cpp:935
-msgid "Unsaved Presets"
-msgstr "Neuložená přednastavení"
-
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:173
msgid "Unselect gizmo or clear selection"
msgstr "Zrušit gizmo nebo zrušit výběr"
-#: src/libslic3r/Zipper.cpp:60
+#: src/libslic3r/miniz_extension.cpp:119
msgid "unsupported central directory size"
msgstr "nepodporovaná velikost centrálního adresáře"
-#: src/libslic3r/Zipper.cpp:40
+#: src/libslic3r/miniz_extension.cpp:99
msgid "unsupported encryption"
msgstr "nepodporované šifrování"
-#: src/libslic3r/Zipper.cpp:42
+#: src/libslic3r/miniz_extension.cpp:101
msgid "unsupported feature"
msgstr "nepodporovaná funkce"
-#: src/libslic3r/Zipper.cpp:38
+#: src/libslic3r/miniz_extension.cpp:97
msgid "unsupported method"
msgstr "nepodporovaná metoda"
-#: src/libslic3r/Zipper.cpp:50
+#: src/libslic3r/miniz_extension.cpp:109
msgid "unsupported multidisk archive"
msgstr "nepodporovaný multidisk archiv"
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:292
+#: src/slic3r/GUI/OpenGLManager.cpp:267
msgid "Unsupported OpenGL version"
msgstr "Nepodporovaná verze OpenGL"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3420
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3883
msgid "Unsupported selection"
msgstr "Nepodporovaný výběr"
-#: src/slic3r/GUI/GLCanvas3D.cpp:955
-#, c-format
-msgid "up to %.2f mm"
-msgstr "do % .2f mm"
+#: src/slic3r/GUI/GCodeViewer.cpp:2183
+msgid "up to"
+msgstr "až do"
#: src/slic3r/GUI/UpdateDialogs.cpp:38
msgid "Update available"
msgstr "Je dostupná aktualizace"
-#: src/slic3r/GUI/ConfigWizard.cpp:779 src/slic3r/GUI/Preferences.cpp:80
+#: src/slic3r/GUI/ConfigWizard.cpp:1138 src/slic3r/GUI/Preferences.cpp:97
msgid "Update built-in Presets automatically"
msgstr "Aktualizovat vestavěné přednastavení automaticky"
-#: src/slic3r/GUI/ConfigWizard.cpp:761
+#: src/slic3r/GUI/ConfigWizard.cpp:1120
msgid "Updates"
msgstr "Aktualizace"
-#: src/slic3r/GUI/ConfigWizard.cpp:786
+#: src/slic3r/GUI/ConfigWizard.cpp:1145
msgid "Updates are never applied without user's consent and never overwrite user's customized settings."
msgstr "Aktualizace nejsou nikdy nainstalovány bez vědomí uživatele a nikdy nepřepíšou upravená uživatelská nastavení."
@@ -8592,7 +9897,7 @@ msgstr "Aktualizace nejsou nikdy nainstalovány bez vědomí uživatele a nikdy
msgid "Upgrade"
msgstr "Aktualizovat"
-#: src/slic3r/GUI/GUI_App.cpp:824
+#: src/slic3r/GUI/GUI_App.cpp:1522
msgid "Upload a firmware image into an Arduino based printer"
msgstr "Nahrát firmware do tiskárny s Arduinem"
@@ -8608,101 +9913,122 @@ msgstr "Nahrát soubor do tiskového serveru se jménem:"
msgid "Uploading"
msgstr "Nahrávání"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:204
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:206
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
msgid "Upper Layer"
msgstr "Vyšší vrstva"
-#: src/slic3r/GUI/Tab.cpp:1900
-msgid "USB/Serial connection"
-msgstr "USB/Sériové připojení"
-
-#: src/libslic3r/PrintConfig.cpp:1662
-msgid "USB/serial port for printer connection."
-msgstr "USB/sériový port pro připojení tiskárny."
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
+msgid "Upper layer"
+msgstr "Horní vrstva"
-#: src/slic3r/GUI/DoubleSlider.cpp:1147
+#: src/slic3r/GUI/DoubleSlider.cpp:1276
msgid "Use another extruder"
msgstr "Použít jiný extruder"
-#: src/slic3r/GUI/Preferences.cpp:143
+#: src/slic3r/GUI/Preferences.cpp:220
msgid "Use custom size for toolbar icons"
msgstr "Použít vlastní velikost ikon na panelu nástrojů"
-#: src/libslic3r/PrintConfig.cpp:2161
+#: src/slic3r/GUI/Preferences.cpp:268
+msgid "Use environment map"
+msgstr "Použít mapu prostředí"
+
+#: src/libslic3r/PrintConfig.cpp:2304
msgid "Use firmware retraction"
msgstr "Použít retrakce z firmwaru"
+#: src/slic3r/GUI/ImGuiWrapper.cpp:800 src/slic3r/GUI/Search.cpp:464
+msgid "Use for search"
+msgstr "Použit pro vyhledávání"
+
+#: src/libslic3r/PrintConfig.cpp:1218
+msgid "Use for time estimate"
+msgstr "Použít pro odhad Äasu"
+
#: src/slic3r/GUI/PrintHostDialogs.cpp:42
msgid "Use forward slashes ( / ) as a directory separator if needed."
msgstr "Pokud je to nutné, použijte pro oddělení složek lomítko ( / )."
-#: src/slic3r/GUI/Preferences.cpp:126
+#: src/slic3r/GUI/Preferences.cpp:191
msgid "Use free camera"
msgstr "Scéna v režimu „free camera“"
-#: src/libslic3r/PrintConfig.cpp:2780
+#: src/slic3r/GUI/ConfigWizard.cpp:1188
+msgid "Use inches"
+msgstr "Používat palce"
+
+#: src/libslic3r/PrintConfig.cpp:2944
msgid "Use pad"
msgstr "Použít podložku"
-#: src/slic3r/GUI/Preferences.cpp:119
+#: src/slic3r/GUI/Preferences.cpp:184
msgid "Use perspective camera"
msgstr "Perspektivní zobrazení scény"
-#: src/libslic3r/PrintConfig.cpp:2168
+#: src/libslic3r/PrintConfig.cpp:2311
msgid "Use relative E distances"
msgstr "Použít relativní E vzdálenosti"
-#: src/slic3r/GUI/Preferences.cpp:104
+#: src/slic3r/GUI/Preferences.cpp:135
msgid "Use Retina resolution for the 3D scene"
msgstr "Pro 3D scénu použít rozlišení Retina"
-#: src/libslic3r/PrintConfig.cpp:540
+#: src/libslic3r/PrintConfig.cpp:576
msgid "Use this option to set the axis letter associated to your printer's extruder (usually E but some printers use A)."
msgstr "Touto volbou nastavíte písmeno osy přidružené k extruderu tiskárny (obvykle E, ale některé tiskárny používají A)."
-#: src/libslic3r/PrintConfig.cpp:1893
+#: src/libslic3r/PrintConfig.cpp:2035
msgid "Use this setting to rotate the support material pattern on the horizontal plane."
msgstr "Toto nastavení použijte pro horizontální otoÄení vzoru."
-#: src/libslic3r/PrintConfig.cpp:2175
+#: src/libslic3r/PrintConfig.cpp:2318
msgid "Use volumetric E"
msgstr "Použít volumetrickou hodnotu E"
-#: src/slic3r/GUI/DoubleSlider.cpp:1171
+#: src/slic3r/GUI/DoubleSlider.cpp:1298
msgid "used"
msgstr "použitý"
-#: src/slic3r/GUI/Plater.cpp:237
+#: src/slic3r/GUI/Plater.cpp:243
msgid "Used Filament (g)"
msgstr "Použito Filamentu (g)"
-#: src/slic3r/GUI/Plater.cpp:235 src/slic3r/GUI/Plater.cpp:1229
+#: src/slic3r/GUI/Plater.cpp:1141
+msgid "Used Filament (in)"
+msgstr "Použito Filamentu (in)"
+
+#: src/slic3r/GUI/Plater.cpp:1153
+msgid "Used Filament (in³)"
+msgstr "Použito Filamentu (in³)"
+
+#: src/slic3r/GUI/Plater.cpp:241 src/slic3r/GUI/Plater.cpp:1141
msgid "Used Filament (m)"
msgstr "Použito Filamentu (m)"
-#: src/slic3r/GUI/Plater.cpp:236
+#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1153
msgid "Used Filament (mm³)"
msgstr "Použito Filamentu (mm³)"
-#: src/slic3r/GUI/Plater.cpp:1191
+#: src/slic3r/GUI/Plater.cpp:1100
msgid "Used Material (ml)"
msgstr "Použitý materiál (ml)"
-#: src/slic3r/GUI/Plater.cpp:238
+#: src/slic3r/GUI/Plater.cpp:244
msgid "Used Material (unit)"
msgstr "Použito materiálu (jednotka)"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 src/libslic3r/PrintConfig.cpp:132
msgid "User"
msgstr "Uživatel"
-#: src/slic3r/GUI/Preset.cpp:1168 src/slic3r/GUI/Preset.cpp:1288
-#: src/slic3r/GUI/PresetBundle.cpp:1677
+#: src/slic3r/GUI/PresetComboBoxes.cpp:230
+#: src/slic3r/GUI/PresetComboBoxes.cpp:778
+#: src/slic3r/GUI/PresetComboBoxes.cpp:934
msgid "User presets"
msgstr "Uživatelská přednastavení"
-#: src/libslic3r/Zipper.cpp:90
+#: src/libslic3r/miniz_extension.cpp:149
msgid "validation failed"
msgstr "validace selhala"
@@ -8714,31 +10040,31 @@ msgstr "Hodnota je shodná se systémovou hodnotou"
msgid "Value was changed and is not equal to the system value or the last saved preset"
msgstr "Hodnota byla změněna a není shodná se systémovou hodnotou nebo naposled uloženým přednastavením"
-#: src/slic3r/GUI/Tab.cpp:2202
+#: src/slic3r/GUI/Tab.cpp:2371
msgid "Values in this column are for Normal mode"
msgstr "Hodnoty v tomto sloupci jsou pro Normální režim"
-#: src/slic3r/GUI/Tab.cpp:2208
+#: src/slic3r/GUI/Tab.cpp:2377
msgid "Values in this column are for Stealth mode"
msgstr "Hodnoty v tomto sloupci jsou pro Tichý režim"
-#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/slic3r/GUI/GLCanvas3D.cpp:4573
+#: src/slic3r/GUI/GLCanvas3D.cpp:231 src/slic3r/GUI/GLCanvas3D.cpp:4978
msgid "Variable layer height"
msgstr "Variabilní výška vrstvy"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1709
+#: src/slic3r/GUI/GLCanvas3D.cpp:1786
msgid "Variable layer height - Adaptive"
msgstr "Variabilní výška vrstev - Adaptivní"
-#: src/slic3r/GUI/GLCanvas3D.cpp:599
+#: src/slic3r/GUI/GLCanvas3D.cpp:565
msgid "Variable layer height - Manual edit"
msgstr "Variabilní výška vrstev - RuÄní editace"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1701
+#: src/slic3r/GUI/GLCanvas3D.cpp:1778
msgid "Variable layer height - Reset"
msgstr "Variabilní výška vrstev - Reset"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1717
+#: src/slic3r/GUI/GLCanvas3D.cpp:1794
msgid "Variable layer height - Smooth all"
msgstr "Variabilní výška vrstev - Vyhladit vše"
@@ -8746,19 +10072,20 @@ msgstr "Variabilní výška vrstev - Vyhladit vše"
msgid "variants"
msgstr "varianty"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:971
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:1289
msgid "vendor"
msgstr "prodejce"
-#: src/slic3r/GUI/ConfigWizard.cpp:565
+#: src/slic3r/GUI/ConfigWizard.cpp:589
msgid "Vendor:"
msgstr "Prodejce:"
-#: src/libslic3r/PrintConfig.cpp:928
+#: src/libslic3r/PrintConfig.cpp:972
msgid "Verbose G-code"
msgstr "Komentáře do G-code"
-#: src/slic3r/GUI/AboutDialog.cpp:231 src/slic3r/GUI/MainFrame.cpp:64
+#: src/slic3r/GUI/AboutDialog.cpp:256 src/slic3r/GUI/GUI_App.cpp:239
+#: src/slic3r/GUI/MainFrame.cpp:164
msgid "Version"
msgstr "Verze"
@@ -8766,24 +10093,48 @@ msgstr "Verze"
msgid "version"
msgstr "verze"
-#: src/slic3r/GUI/Tab.cpp:1053
+#: src/slic3r/GUI/Tab.cpp:1375
msgid "Vertical shells"
msgstr "Svislé stěny"
-#: src/slic3r/GUI/GUI_Preview.cpp:218
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:237
+msgid "Vertical Slider"
+msgstr "Vertikální posuvník"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:212
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:231
+msgid "Vertical slider - Move active thumb Down"
+msgstr "Vertikální posuvník - Pohyb aktivním ukazatelem dolů"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:211
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:230
+msgid "Vertical slider - Move active thumb Up"
+msgstr "Vertikální posuvník - Pohyb aktivním ukazatelem nahoru"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:265 src/slic3r/GUI/GUI_Preview.cpp:271
msgid "View"
msgstr "Zobrazení"
-#: src/slic3r/GUI/ConfigWizard.cpp:813
+#: src/slic3r/GUI/ConfigWizard.cpp:1172
msgid "View mode"
msgstr "Režim zobrazení"
-#: src/libslic3r/SLAPrintSteps.cpp:413 src/libslic3r/SLAPrintSteps.cpp:422
-#: src/libslic3r/SLAPrintSteps.cpp:461
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:666
+msgid "Visit \"Preferences\" and check \"%1%\"\nto be asked about unsaved changes again."
+msgstr "Pro zrušení zapamatování jděte do Nastaneví a zaškrtněte \"%1%\"."
+
+#: src/libslic3r/PrintConfig.cpp:3553
+msgid "Visualize an already sliced and saved G-code"
+msgstr "Vizualizuje již naslicovaný a uložený G-code"
+
+#: src/libslic3r/SLAPrintSteps.cpp:411 src/libslic3r/SLAPrintSteps.cpp:420
+#: src/libslic3r/SLAPrintSteps.cpp:459
msgid "Visualizing supports"
msgstr "Vizualizace podpěr"
-#: src/slic3r/GUI/Plater.cpp:161
+#: src/slic3r/GUI/Plater.cpp:167
msgid "Volume"
msgstr "Obsah"
@@ -8791,23 +10142,23 @@ msgstr "Obsah"
msgid "Volume to purge (mm³) when the filament is being"
msgstr "Objem k vyÄiÅ¡tÄ›ní (mm³) pokud je filament"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1106
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1230
msgid "Volumes in Object reordered"
msgstr "Změna pořadí Těles v Objektu"
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:218
msgid "Volumetric"
msgstr "Volumetrický"
-#: src/slic3r/GUI/Tab.cpp:1591
+#: src/slic3r/GUI/Tab.cpp:1930
msgid "Volumetric flow hints not available"
msgstr "DoporuÄení pro objemový průtok nejsou k dispozici"
-#: src/slic3r/GUI/GUI_Preview.cpp:226
+#: src/slic3r/GUI/GUI_Preview.cpp:280
msgid "Volumetric flow rate"
msgstr "Objemový průtok"
-#: src/libslic3r/GCode/PreviewData.cpp:355
+#: src/slic3r/GUI/GCodeViewer.cpp:2240 src/libslic3r/GCode/PreviewData.cpp:360
msgid "Volumetric flow rate (mm³/s)"
msgstr "Objemový průtok (mm³/s)"
@@ -8815,151 +10166,167 @@ msgstr "Objemový průtok (mm³/s)"
msgid "Volumetric speed"
msgstr "Objemová rychlost"
-#: src/libslic3r/PrintConfig.cpp:2915
+#: src/libslic3r/PrintConfig.cpp:3079
msgid "Wall thickness"
msgstr "Tloušťka stěny"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1270 src/slic3r/GUI/GUI.cpp:251
-#: src/slic3r/GUI/Tab.cpp:3084 src/slic3r/GUI/WipeTowerDialog.cpp:45
-#: src/slic3r/GUI/WipeTowerDialog.cpp:366
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1129 src/slic3r/GUI/GUI.cpp:256
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:478
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:502
+#: src/slic3r/GUI/WipeTowerDialog.cpp:45 src/slic3r/GUI/WipeTowerDialog.cpp:366
msgid "Warning"
msgstr "Varování"
-#: src/slic3r/GUI/ConfigWizard.cpp:431
+#: src/slic3r/GUI/NotificationManager.cpp:672
+#: src/slic3r/GUI/NotificationManager.cpp:687
+#: src/slic3r/GUI/NotificationManager.cpp:702
+msgid "WARNING:"
+msgstr "VAROVÃNÃ:"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:449
msgid "Welcome"
msgstr "Vítejte"
-#: src/slic3r/GUI/ConfigWizard.cpp:427
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:445
+#, possible-c-format
msgid "Welcome to the %s Configuration Assistant"
msgstr "Vítejte v %s KonfiguraÄním Asistentu"
-#: src/slic3r/GUI/ConfigWizard.cpp:429
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:447
+#, possible-c-format
msgid "Welcome to the %s Configuration Wizard"
msgstr "Vítejte v %s KonfiguraÄním průvodci"
-#: src/slic3r/GUI/Preferences.cpp:97
+#: src/slic3r/GUI/SavePresetDialog.cpp:310
+msgid "What would you like to do with \"%1%\" preset after saving?"
+msgstr "Co chcete udělat s přednastavením \"%1%\" po uložení?"
+
+#: src/slic3r/GUI/Preferences.cpp:114
msgid "When checked, the print and filament presets are shown in the preset editor even if they are marked as incompatible with the active printer"
msgstr "Pokud je zaÅ¡krtnuto, pÅ™ednastavení tisku a filamentu se zobrazují v editoru pÅ™ednastavení, i když jsou oznaÄeny jako nekompatibilní s aktivní tiskárnou"
-#: src/slic3r/GUI/PresetHints.cpp:224
+#: src/slic3r/GUI/Preferences.cpp:122
+msgid "When checked, whenever dragging and dropping a project file on the application, shows a dialog asking to select the action to take on the file to load."
+msgstr "Je-li zaÅ¡krtnuto, pÅ™i každém pÅ™etažení souboru s projektem do aplikace se zobrazí dialogové okno s výzvou k výbÄ›ru akce, kterou se má soubor naÄíst."
+
+#: src/slic3r/GUI/Preferences.cpp:156
+msgid "When closing the application, always ask for unsaved changes"
+msgstr "Při zavírání aplikace vždy ptát na neuložené změny"
+
+#: src/slic3r/GUI/PresetHints.cpp:223
msgid "when printing"
msgstr "při tisku"
-#: src/libslic3r/PrintConfig.cpp:253
+#: src/libslic3r/PrintConfig.cpp:287
msgid "When printing multi-material objects, this settings will make Slic3r to clip the overlapping object parts one by the other (2nd part will be clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc)."
-msgstr "PÅ™ipnutí pÅ™ekrývajících se objektů jeden k druhému pÅ™i Multimateriálovém tisku. (Druhá Äást se pÅ™ipne k první, tÅ™etí Äást k první a druhé, atd)."
+msgstr "PÅ™ipnutí pÅ™ekrývajících se objektů jeden k druhému pÅ™i Multimateriálovém tisku. (Druhá Äást se pÅ™ipne k první, tÅ™etí Äást k první a druhé, atd.)"
-#: src/libslic3r/PrintConfig.cpp:305
+#: src/libslic3r/PrintConfig.cpp:339
msgid "When printing multiple objects or copies, this feature will complete each object before moving onto next one (and starting it from its bottom layer). This feature is useful to avoid the risk of ruined prints. Slic3r should warn and prevent you from extruder collisions, but beware."
msgstr "PÅ™i tisku více objektů nebo kopií tiskárna kompletnÄ› dokonÄí jeden objekt, pÅ™edtím než zaÄne tisknout druhý (zaÄíná od spodní vrstvy). Tato vlastnost je výhodná z důvodů snížení rizika zniÄených výtisků. Slic3r by mÄ›l varovat pÅ™i možné kolizi extruderu s objektem a zabránit mu, pÅ™esto doporuÄujeme obezÅ™etnost."
-#: src/libslic3r/PrintConfig.cpp:891
+#: src/libslic3r/PrintConfig.cpp:933
msgid "When printing with very low layer heights, you might still want to print a thicker bottom layer to improve adhesion and tolerance for non perfect build plates. This can be expressed as an absolute value or as a percentage (for example: 150%) over the default layer height."
msgstr "Při tisku s velmi nízkými výškami vrstev můžete stále vytisknout tlustší spodní vrstvu pro zlepšení přilnavosti a toleranci pro nedokonale zkalibrovanou tiskovou podložku. Může být vyjádřeno jako absolutní hodnota nebo jako procento (například: 150%) z výchozí výšky vrstvy."
-#: src/libslic3r/PrintConfig.cpp:1553
+#: src/libslic3r/PrintConfig.cpp:1661
msgid "When retraction is triggered before changing tool, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder)."
msgstr "Při výměně nástroje se spustí retrakce a filament se zatáhne zpět o zadané množství (délka se měří na surovém filamentu, než vstoupí do extruderu)."
-#: src/libslic3r/PrintConfig.cpp:1545
+#: src/libslic3r/PrintConfig.cpp:1653
msgid "When retraction is triggered, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder)."
msgstr "Při spuštění retrakce se filament zatáhne zpět o zadané množství (délka se měří na surovém filamentu, než vstoupí do extruderu)."
-#: src/libslic3r/PrintConfig.cpp:1391
+#: src/libslic3r/PrintConfig.cpp:1499
msgid "When set to zero, the distance the filament is moved from parking position during load is exactly the same as it was moved back during unload. When positive, it is loaded further, if negative, the loading move is shorter than unloading."
msgstr "Když je hodnota nastavena na nulu, vzdálenost o kterou se filament posune během zavádění, je stejná, jako zpětný posun během vysouvání filamentu. Je-li hodnota kladná, je filament posunut více,. Je-li hodnota záporná, posun při zavádění je kratší než při vysouvání."
-#: src/libslic3r/PrintConfig.cpp:1238
+#: src/libslic3r/PrintConfig.cpp:1346
msgid "When setting other speed settings to 0 Slic3r will autocalculate the optimal speed in order to keep constant extruder pressure. This experimental setting is used to set the highest print speed you want to allow."
msgstr "Pokud jsou vÅ¡echna ostatní nastavení rychlosti na hodnotÄ› nula, Slic3r automaticky vypoÄítá optimální rychlost pro udržení konstantního tlaku v extruderu. Toto experimentální nastavení slouží k nastavení nejvyšší rychlosti tisku, kterou chcete povolit."
-#: src/libslic3r/PrintConfig.cpp:1597
+#: src/libslic3r/PrintConfig.cpp:1705
msgid "When the retraction is compensated after changing tool, the extruder will push this additional amount of filament."
msgstr "Když je retrakce kompenzována po zmÄ›nÄ› nástroje, extruder vytlaÄuje toto další množství filamentu."
-#: src/libslic3r/PrintConfig.cpp:1589
+#: src/libslic3r/PrintConfig.cpp:1697
msgid "When the retraction is compensated after the travel move, the extruder will push this additional amount of filament. This setting is rarely needed."
msgstr "Když je retrakce kompenzována po rychloposunu, extruder vytlaÄuje toto další množství filamentu. Toto nastavení je zřídkakdy potÅ™eba."
-#: src/slic3r/GUI/Tab.cpp:3263
+#: src/slic3r/GUI/Tab.cpp:3700
msgid "WHITE BULLET"
msgstr "BÃLÃ TEÄŒKA"
-#: src/slic3r/GUI/Tab.cpp:3285
+#: src/slic3r/GUI/Tab.cpp:3722
msgid "WHITE BULLET icon indicates a non system (or non default) preset."
msgstr "Ikona BÃLÉ TEÄŒKY indikuje nesystémové (nebo jiné než výchozí) pÅ™ednastavení."
-#: src/slic3r/GUI/Tab.cpp:3288
+#: src/slic3r/GUI/Tab.cpp:3725
msgid "WHITE BULLET icon indicates that the settings are the same as in the last saved preset for the current option group."
msgstr "Ikona BÃLÉ TEÄŒKY indikuje, že nastavení jsou shodná s naposledy uloženým pÅ™ednastavením pro danou skupinu nastavení."
-#: src/slic3r/GUI/Tab.cpp:3303
+#: src/slic3r/GUI/Tab.cpp:3740
msgid "WHITE BULLET icon indicates that the value is the same as in the last saved preset."
msgstr "Ikona BÃLÉ TEÄŒKY indikuje, že je hodnota shodná s naposledy uloženým pÅ™ednastavením."
-#: src/slic3r/GUI/GUI_Preview.cpp:223 src/libslic3r/PrintConfig.cpp:2238
+#: src/slic3r/GUI/GUI_Preview.cpp:277 src/libslic3r/PrintConfig.cpp:2381
msgid "Width"
msgstr "Šířka"
-#: src/libslic3r/GCode/PreviewData.cpp:349
+#: src/slic3r/GUI/GCodeViewer.cpp:2237 src/libslic3r/GCode/PreviewData.cpp:354
msgid "Width (mm)"
msgstr "Šířka (mm)"
-#: src/libslic3r/PrintConfig.cpp:2640
+#: src/libslic3r/PrintConfig.cpp:2783
msgid "Width from the back sphere center to the front sphere center"
msgstr "Šířka od středu zadní koule ke středu přední koule"
-#: src/libslic3r/PrintConfig.cpp:2239
+#: src/libslic3r/PrintConfig.cpp:2382
msgid "Width of a wipe tower"
msgstr "Šířka Äistící věže"
-#: src/libslic3r/PrintConfig.cpp:2891
+#: src/libslic3r/PrintConfig.cpp:3055
msgid "Width of the connector sticks which connect the object and the generated pad."
msgstr "Šířka spojek, které spojují objekt s vygenerovanou podložkou."
-#: src/libslic3r/PrintConfig.cpp:2354
+#: src/libslic3r/PrintConfig.cpp:2497
msgid "Width of the display"
msgstr "Šířka displeje"
-#: src/slic3r/GUI/PresetHints.cpp:48
-msgid "will always run at %1%%%"
-msgstr "bude vždy běžet na %1%%%"
-
-#: src/slic3r/GUI/PresetHints.cpp:55
-msgid "will be turned off."
-msgstr "bude vypnut."
-
-#: src/libslic3r/PrintConfig.cpp:2441
+#: src/libslic3r/PrintConfig.cpp:2584
msgid "Will inflate or deflate the sliced 2D polygons according to the sign of the correction."
msgstr "Vytvoří offset každé vrstvy v rovině XY. Kladná hodnota - offset směrem ven, plocha polygonu se zvětší. Záporná hodnota - offset směrem dovnitř, plocha polygonu se zmenší."
-#: src/libslic3r/PrintConfig.cpp:2261
+#: src/slic3r/GUI/GCodeViewer.cpp:2660 src/slic3r/GUI/GCodeViewer.cpp:2663
+#: src/slic3r/GUI/GUI_Preview.cpp:978
+msgid "Wipe"
+msgstr "Čištění"
+
+#: src/libslic3r/PrintConfig.cpp:2404
msgid "Wipe into this object"
msgstr "VyÄistit do tohoto objektu"
-#: src/libslic3r/PrintConfig.cpp:2253
+#: src/libslic3r/PrintConfig.cpp:2396
msgid "Wipe into this object's infill"
msgstr "VyÄiÅ¡tÄ›ní do výplnÄ› tohoto objektu"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:101
-#: src/slic3r/GUI/GUI_ObjectList.cpp:619 src/libslic3r/PrintConfig.cpp:2252
-#: src/libslic3r/PrintConfig.cpp:2260
+#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:99
+#: src/slic3r/GUI/GUI_ObjectList.cpp:658 src/libslic3r/PrintConfig.cpp:2395
+#: src/libslic3r/PrintConfig.cpp:2403
msgid "Wipe options"
msgstr "Možnosti ÄiÅ¡tÄ›ní"
-#: src/slic3r/GUI/GUI_Preview.cpp:248 src/slic3r/GUI/Tab.cpp:1191
-#: src/libslic3r/ExtrusionEntity.cpp:321
+#: src/slic3r/GUI/GUI_Preview.cpp:313 src/slic3r/GUI/Tab.cpp:1521
+#: src/libslic3r/ExtrusionEntity.cpp:326 src/libslic3r/ExtrusionEntity.cpp:360
msgid "Wipe tower"
msgstr "Čistící věž"
-#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245
+#: src/slic3r/GUI/Plater.cpp:1143 src/slic3r/GUI/Plater.cpp:1160
msgid "wipe tower"
msgstr "Äistící věž"
-#: src/slic3r/GUI/ConfigManipulation.cpp:120
-#: src/slic3r/GUI/ConfigManipulation.cpp:140
+#: src/slic3r/GUI/ConfigManipulation.cpp:119
+#: src/slic3r/GUI/ConfigManipulation.cpp:139
msgid "Wipe Tower"
msgstr "Čistící Věž"
@@ -8967,131 +10334,141 @@ msgstr "Čistící Věž"
msgid "Wipe tower - Purging volume adjustment"
msgstr "ÄŒistící věž - Úprava objemu ÄiÅ¡tÄ›ní"
-#: src/slic3r/GUI/Tab.cpp:1488
+#: src/slic3r/GUI/Tab.cpp:1834
msgid "Wipe tower parameters"
msgstr "Parametry Äistící věže"
-#: src/libslic3r/PrintConfig.cpp:2245
+#: src/libslic3r/PrintConfig.cpp:2388
msgid "Wipe tower rotation angle"
msgstr "Úhel natoÄení Äistící věže"
-#: src/libslic3r/PrintConfig.cpp:2246
+#: src/libslic3r/PrintConfig.cpp:2389
msgid "Wipe tower rotation angle with respect to x-axis."
msgstr "Úhel natoÄení Äistící věže s ohledem na osu X."
-#: src/libslic3r/PrintConfig.cpp:2193
+#: src/libslic3r/PrintConfig.cpp:2336
msgid "Wipe while retracting"
msgstr "OÄistit pÅ™i retrakci"
-#: src/slic3r/GUI/PresetHints.cpp:225
+#: src/slic3r/GUI/PresetHints.cpp:224
msgid "with a volumetric rate"
msgstr "s objemovou rychlostí"
-#: src/libslic3r/PrintConfig.cpp:1530
+#: src/libslic3r/PrintConfig.cpp:1638
msgid "With bowden extruders, it may be wise to do some amount of quick retract before doing the wipe movement."
msgstr "U bowdenových extrudérů může být vhodné provést rychlé retrakce než se spustí oÄiÅ¡tÄ›ní."
-#: src/libslic3r/PrintConfig.cpp:2056
+#: src/libslic3r/PrintConfig.cpp:2198
msgid "With sheath around the support"
msgstr "Pouzdro okolo podpěr"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:68
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:111
msgid "World coordinates"
msgstr "Světové souřadnice"
#: src/slic3r/GUI/UpdateDialogs.cpp:92
-msgid ""
-"Would you like to install it?\n"
-"\n"
-"Note that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n"
-"\n"
-"Updated configuration bundles:"
-msgstr ""
-"Přejete si spustit instalaci?\n"
-"\n"
-"Nejprve bude provedena kompletní záloha nastavení. V případě problémů s novou verzí ji bude možné kdykoliv obnovit.\n"
-"\n"
-"Aktualizované balíÄky nastavení:"
+msgid "Would you like to install it?\n\nNote that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n\nUpdated configuration bundles:"
+msgstr "PÅ™ejete si spustit instalaci?\n\nNejprve bude provedena kompletní záloha nastavení. V případÄ› problémů s novou verzí ji bude možné kdykoliv obnovit.\n\nAktualizované balíÄky nastavení:"
+
+#: src/slic3r/GUI/GUI_App.cpp:1802
+msgid "Would you like to stop uploads and close the program?"
+msgstr "Chcete zastavit nahrávání a ukonÄit program?"
-#: src/libslic3r/Zipper.cpp:92
+#: src/libslic3r/miniz_extension.cpp:151
msgid "write calledback failed"
msgstr "zpětné volání se nezdařilo"
-#: src/libslic3r/PrintConfig.cpp:3382
+#: src/libslic3r/PrintConfig.cpp:3581
msgid "Write information about the model to the console."
msgstr "Vypsat informace o modelu do konsole."
-#: src/slic3r/Utils/Duet.cpp:131
+#: src/slic3r/Utils/Duet.cpp:133
msgid "Wrong password"
msgstr "Chybné heslo"
-#: src/libslic3r/PrintConfig.cpp:2225
+#: src/libslic3r/PrintConfig.cpp:2368
msgid "X coordinate of the left front corner of a wipe tower"
msgstr "X souÅ™adnice levého pÅ™edního rohu Äistící věže"
-#: src/libslic3r/PrintConfig.cpp:1879
+#: src/libslic3r/PrintConfig.cpp:2021
msgid "XY separation between an object and its support"
msgstr "XY vzdálenost mezi objektem a podpěrami"
-#: src/libslic3r/PrintConfig.cpp:1881
+#: src/libslic3r/PrintConfig.cpp:2023
msgid "XY separation between an object and its support. If expressed as percentage (for example 50%), it will be calculated over external perimeter width."
msgstr "XY vzdálenost mezi objektem a podpÄ›rami. Pokud je vyjádÅ™eno procenty (například 50%), bude vypoÄítána z šířky perimetru."
-#: src/libslic3r/PrintConfig.cpp:2275
+#: src/libslic3r/PrintConfig.cpp:2418
msgid "XY Size Compensation"
msgstr "Kompenzace XY rozměrů"
-#: src/libslic3r/PrintConfig.cpp:2232
+#: src/libslic3r/PrintConfig.cpp:2375
msgid "Y coordinate of the left front corner of a wipe tower"
msgstr "Y souÅ™adnice levého pÅ™edního rohu Äistící věže"
-#: src/slic3r/GUI/Plater.cpp:1170
+#: src/slic3r/GUI/Plater.cpp:1079
msgid "Yes"
msgstr "Ano"
-#: src/libslic3r/PrintConfig.cpp:1317
+#: src/slic3r/GUI/Plater.cpp:1405
+msgid "You can open only one .gcode file at a time."
+msgstr "Najednou můžete otevřít pouze jeden soubor .gcode."
+
+#: src/libslic3r/PrintConfig.cpp:1425
msgid "You can put here your personal notes. This text will be added to the G-code header comments."
msgstr "Zde můžete zadat své osobní poznámky. Tento text bude přidán do komentáře záhlaví G code."
-#: src/libslic3r/PrintConfig.cpp:589
+#: src/libslic3r/PrintConfig.cpp:625
msgid "You can put your notes regarding the filament here."
msgstr "Zde můžete vložit poznámky týkající se filamentu."
-#: src/libslic3r/PrintConfig.cpp:1473
+#: src/libslic3r/PrintConfig.cpp:1581
msgid "You can put your notes regarding the printer here."
msgstr "Zde můžete uvést poznámky týkající se tiskárny."
-#: src/libslic3r/PrintConfig.cpp:2579
+#: src/libslic3r/PrintConfig.cpp:2722
msgid "You can put your notes regarding the SLA print material here."
msgstr "Zde můžete vkládat své poznámky týkající se tiskového materiálu SLA."
-#: src/libslic3r/PrintConfig.cpp:360
+#: src/libslic3r/PrintConfig.cpp:394
msgid "You can set this to a positive value to disable fan at all during the first layers, so that it does not make adhesion worse."
msgstr "Nastavením poÄtu prvních vrstev s vypnutým chlazením pro nezhorÅ¡ování pÅ™ilnavosti."
-#: src/libslic3r/PrintConfig.cpp:1364
+#: src/libslic3r/PrintConfig.cpp:1472
msgid "You can use all configuration options as variables inside this template. For example: [layer_height], [fill_density] etc. You can also use [timestamp], [year], [month], [day], [hour], [minute], [second], [version], [input_filename], [input_filename_base]."
msgstr "V této šabloně můžete použít všechny možnosti konfigurace jako proměnné. Můžete například použít: [layer_height], [fill_density] etc. Také můžete použít [timestamp], [year], [month], [day], [hour], [minute], [second], [version], [input_filename], [input_filename_base]."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3546
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4009
msgid "You can't change a type of the last solid part of the object."
msgstr "Nelze zmÄ›nit typ poslední plné Äásti objektu."
-#: src/slic3r/GUI/Plater.cpp:2390
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:2352
+#, possible-c-format
msgid "You can't to add the object(s) from %s because of one or some of them is(are) multi-part"
msgstr "Nemůžete přidat objekt(y) z %s, protože jeden nebo některé z nich je(jsou) vícedílné"
-#: src/slic3r/GUI/Plater.cpp:2311
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:208 src/slic3r/GUI/Plater.cpp:2254
msgid "You cannot load SLA project with a multi-part object on the bed"
msgstr "Nelze naÄíst SLA projekt s objektem na podložce, který je složený z více Äástí"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:625
msgid "You cannot use non-uniform scaling mode for multiple objects/parts selection"
msgstr "Nemůžete použít nestejnomÄ›rnou zmÄ›nu měřítka pro více vybraných objektů/Äástí"
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:287
+#: src/slic3r/GUI/NotificationManager.hpp:459
+msgid "You have just added a G-code for color change, but its value is empty.\nTo export the G-code correctly, check the \"Color Change G-code\" in \"Printer Settings > Custom G-code\""
+msgstr "Právě jste přidali G-code pro změnu barvy, ale jeho obsah je prázdný.\nChcete-li exportovat G-code správně, zkontrolujte „G-code pro změnu barvy“ v „Nastavení tiskárny> Vlastní G-code“"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:277
+msgid "You have selected physical printer \"%1%\" \nwith related printer preset \"%2%\""
+msgstr "Vybrali jste fyzickou tiskárnu \"%1%\"\ns tiskovým přednastavením \"%2%\""
+
+#: src/slic3r/GUI/GUI_App.cpp:1078
+msgid "You have the following presets with saved options for \"Print Host upload\""
+msgstr "Následující přednastavení máte s uloženým nastavením pro „Nahrávání do tiskového serveru“"
+
+#: src/slic3r/GUI/OpenGLManager.cpp:262
msgid "You may need to update your graphics card driver."
msgstr "Možná budete muset aktualizovat ovladaÄ grafické karty."
@@ -9099,93 +10476,95 @@ msgstr "Možná budete muset aktualizovat ovladaÄ grafické karty."
msgid "You must install a configuration update."
msgstr "Je nutné nainstalovat aktualizaci konfigurace."
-#: src/slic3r/GUI/Preferences.cpp:172
-#, c-format
+#: src/slic3r/GUI/Preferences.cpp:299
+#, possible-c-format
msgid "You need to restart %s to make the changes effective."
msgstr "Chcete-li provést změny, musíte restartovat aplikaci %s."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3421
-#, c-format
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:468
+msgid "You should change the name of your printer device."
+msgstr "Měli byste změnit název tiskového zařízení."
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3884
+#, possible-c-format
msgid "You started your selection with %s Item."
msgstr "ZaÄali jste výbÄ›r s položkou %s."
-#: src/slic3r/GUI/DoubleSlider.cpp:1902
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:664
+msgid "You will not be asked about the unsaved changes the next time you close PrusaSlicer."
+msgstr "Při příštím zavření aplikace PrusaSlice nebudete dotázáni na neuložené změny."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:665
+msgid "You will not be asked about the unsaved changes the next time you switch a preset."
+msgstr "Při příštím přepnutí přednasatvení nebudete dotázáni na neuložené změny."
+
+#: src/slic3r/GUI/DoubleSlider.cpp:2121
msgid "Your current changes will delete all saved color changes."
msgstr "Vaše aktuálně provedené změny odstraní všechny uložené změny barev."
-#: src/slic3r/GUI/DoubleSlider.cpp:1923
+#: src/slic3r/GUI/DoubleSlider.cpp:2141
msgid "Your current changes will delete all saved extruder (tool) changes."
msgstr "Vaše aktuálně provedené změny odstraní všechny uložené změny extruderu (nástroje)."
-#: src/slic3r/GUI/MainFrame.cpp:911
+#: src/slic3r/GUI/MainFrame.cpp:1612
msgid "Your file was repaired."
msgstr "Váš soubor byl opraven."
-#: src/slic3r/GUI/Plater.cpp:2528
+#: src/slic3r/GUI/Plater.cpp:2490
msgid "Your object appears to be too large, so it was automatically scaled down to fit your print bed."
msgstr "Váš objekt se zdá být příliš velký, takže byl automaticky zmenšen, aby se vešel na tiskovou podložku."
-#: src/libslic3r/PrintConfig.cpp:2285
+#: src/libslic3r/GCode.cpp:1261
+msgid "Your print is very close to the priming regions. Make sure there is no collision."
+msgstr "Váš tisk je velmi blízko Äistícím oblastem. ZajistÄ›te, aby nedoÅ¡lo ke kolizi."
+
+#: src/libslic3r/PrintConfig.cpp:2428
msgid "Z offset"
msgstr "Odsazení Z"
-#: src/slic3r/GUI/ConfigManipulation.cpp:60
-msgid ""
-"Zero first layer height is not valid.\n"
-"\n"
-"The first layer height will be reset to 0.01."
-msgstr ""
-"Nulová výška první vrstvy není platná.\n"
-"\n"
-"Výška první vrstvy bude resetována na 0.01."
+#: src/slic3r/GUI/ConfigManipulation.cpp:59
+msgid "Zero first layer height is not valid.\n\nThe first layer height will be reset to 0.01."
+msgstr "Nulová výška první vrstvy není platná.\n\nVýška první vrstvy bude resetována na 0.01."
-#: src/slic3r/GUI/ConfigManipulation.cpp:48
-msgid ""
-"Zero layer height is not valid.\n"
-"\n"
-"The layer height will be reset to 0.01."
-msgstr ""
-"Nulová výška vrstvy není platná.\n"
-"\n"
-"Výška vrstvy bude resetována na 0.01."
+#: src/slic3r/GUI/ConfigManipulation.cpp:47
+msgid "Zero layer height is not valid.\n\nThe layer height will be reset to 0.01."
+msgstr "Nulová výška vrstvy není platná.\n\nVýška vrstvy bude resetována na 0.01."
-#: src/libslic3r/PrintConfig.cpp:2667
+#: src/libslic3r/PrintConfig.cpp:2831
msgid "Zig-Zag"
msgstr "Zig-Zag"
-#: src/slic3r/GUI/Mouse3DController.cpp:308
-#: src/slic3r/GUI/Mouse3DController.cpp:317
+#: src/slic3r/GUI/Mouse3DController.cpp:294
+#: src/slic3r/GUI/Mouse3DController.cpp:303
msgid "Zoom"
msgstr "Zoom"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:183
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:177
msgid "Zoom in"
msgstr "Přiblížit"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:184
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:178
msgid "Zoom out"
msgstr "Oddálit"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:181
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
msgid "Zoom to Bed"
msgstr "Pohled na tiskovou plochu"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:182
-msgid ""
-"Zoom to selected object\n"
-"or all objects in scene, if none selected"
-msgstr ""
-"Pohled na oznaÄený objekt, nebo na vÅ¡echny objekty ve scénÄ›,\n"
-"pokud není vybraný žádný objekt"
-
-#: src/libslic3r/PrintConfig.cpp:207 src/libslic3r/PrintConfig.cpp:780
-#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1650
-#: src/libslic3r/PrintConfig.cpp:1894 src/libslic3r/PrintConfig.cpp:2049
-#: src/libslic3r/PrintConfig.cpp:2247 src/libslic3r/PrintConfig.cpp:2727
-#: src/libslic3r/PrintConfig.cpp:2848
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:176
+msgid "Zoom to selected object\nor all objects in scene, if none selected"
+msgstr "Pohled na oznaÄený objekt, nebo na vÅ¡echny objekty ve scénÄ›,\npokud není vybraný žádný objekt"
+
+#: src/libslic3r/PrintConfig.cpp:241 src/libslic3r/PrintConfig.cpp:816
+#: src/libslic3r/PrintConfig.cpp:1748 src/libslic3r/PrintConfig.cpp:1758
+#: src/libslic3r/PrintConfig.cpp:2036 src/libslic3r/PrintConfig.cpp:2191
+#: src/libslic3r/PrintConfig.cpp:2390 src/libslic3r/PrintConfig.cpp:2891
+#: src/libslic3r/PrintConfig.cpp:3012
msgid "°"
msgstr "°"
-#: src/slic3r/GUI/ConfigWizard.cpp:1038 src/slic3r/GUI/ConfigWizard.cpp:1052
+#: src/slic3r/GUI/ConfigWizard.cpp:1404 src/slic3r/GUI/ConfigWizard.cpp:1418
+#: src/libslic3r/PrintConfig.cpp:180 src/libslic3r/PrintConfig.cpp:912
+#: src/libslic3r/PrintConfig.cpp:956 src/libslic3r/PrintConfig.cpp:2209
msgid "°C"
msgstr "°C"
diff --git a/resources/localization/de/PrusaSlicer.mo b/resources/localization/de/PrusaSlicer.mo
index 7a3021c30..7a7120cdf 100644
--- a/resources/localization/de/PrusaSlicer.mo
+++ b/resources/localization/de/PrusaSlicer.mo
Binary files differ
diff --git a/resources/localization/de/PrusaSlicer_de.po b/resources/localization/de/PrusaSlicer_de.po
index e926a6145..c929aa84f 100644
--- a/resources/localization/de/PrusaSlicer_de.po
+++ b/resources/localization/de/PrusaSlicer_de.po
@@ -5,376 +5,399 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 2.3\n"
-"Project-Id-Version: \n"
-"POT-Creation-Date: \n"
-"PO-Revision-Date: \n"
-"Last-Translator: \n"
-"Language-Team: \n"
-
-#: src/slic3r/GUI/MainFrame.cpp:66
-msgid " - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/releases"
-msgstr " - Denken Sie an die Überprüfung auf Updates unter http://github.com/prusa3d/PrusaSlicer/releases"
-
-#: src/slic3r/GUI/MainFrame.cpp:872
-msgid " was successfully sliced."
-msgstr " wurde erfolgreich gesliced."
-
-#: src/libslic3r/PrintConfig.cpp:215 src/libslic3r/PrintConfig.cpp:792
-#: src/libslic3r/PrintConfig.cpp:1219 src/libslic3r/PrintConfig.cpp:1282
-#: src/libslic3r/PrintConfig.cpp:1532 src/libslic3r/PrintConfig.cpp:2425
-#: src/libslic3r/PrintConfig.cpp:2767
+"X-Generator: PhraseApp (phraseapp.com)\n"
+
+#: src/slic3r/GUI/Tab.cpp:4124
+msgid "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\nTo enable \"%1%\", please switch off \"%2%\""
+msgstr "\"%1%\" ist deaktiviert, weil \"%2%\" in der Kategorie \"%3%\" eingeschaltet ist.\nUm \"%1%\" zu aktivieren, schalten Sie bitte \"%2%\" aus."
+
+#: src/libslic3r/PrintConfig.cpp:249 src/libslic3r/PrintConfig.cpp:828
+#: src/libslic3r/PrintConfig.cpp:1148 src/libslic3r/PrintConfig.cpp:1327
+#: src/libslic3r/PrintConfig.cpp:1390 src/libslic3r/PrintConfig.cpp:1640
+#: src/libslic3r/PrintConfig.cpp:2568 src/libslic3r/PrintConfig.cpp:2805
+#: src/libslic3r/PrintConfig.cpp:2931
msgid "%"
msgstr "%"
-#: src/slic3r/GUI/GLCanvas3D.cpp:963
-#, c-format
-msgid "%.2f - %.2f mm"
-msgstr "%.2f - %.2f mm"
-
#. TRN Remove/Delete
-#: src/slic3r/GUI/Tab.cpp:3126
+#: src/slic3r/GUI/Tab.cpp:3425
msgid "%1% Preset"
msgstr "%1% Voreinstellung"
-#: src/slic3r/GUI/Plater.cpp:4400
+#: src/slic3r/GUI/Plater.cpp:4423
msgid "%1% printer was active at the time the target Undo / Redo snapshot was taken. Switching to %1% printer requires reloading of %1% presets."
msgstr "Der %1% Drucker war zum Zeitpunkt der Aufnahme des Ziel-Rückgängig-/Wiederherstellungs-Schnappschusses aktiv. Die Umstellung auf den %1%-Drucker erfordert ein Neuladen der %1%-Voreinstellungen."
-#: src/libslic3r/Print.cpp:1374
+#: src/slic3r/GUI/MainFrame.cpp:1585
+msgid "%1% was successfully sliced."
+msgstr "%1% wurde erfolgreich gesliced."
+
+#: src/libslic3r/Print.cpp:1400
msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm"
msgstr "%1%=%2% mm ist zu niedrig, um auf einer Schichthöhe von %3% mm druckbar zu sein"
-#: src/slic3r/GUI/PresetHints.cpp:229
-#, c-format
+#: src/slic3r/GUI/PresetHints.cpp:228
+#, possible-c-format
msgid "%3.2f mm³/s at filament speed %3.2f mm/s."
msgstr "%3.2f mm³/s mit einer Filamentgeschwindigkeit von %3.2f mm/s."
-#: src/slic3r/GUI/Plater.cpp:1152
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:1061
+#, possible-c-format
msgid "%d (%d shells)"
msgstr "%d (%d Konturhüllen)"
-#: src/slic3r/GUI/Plater.cpp:1160
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:1069
+#, possible-c-format
msgid "%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d facets reversed, %d backwards edges"
msgstr "%d degenerierte Flächen, %d Kanten korrigiert, %d Flächen entfernt, %d Flächen hinzugefügt, %d Flächen umgekehrt, %d rückwärtige Kanten"
-#: src/slic3r/GUI/PresetHints.cpp:270
-#, c-format
+#: src/slic3r/GUI/PresetHints.cpp:269
+#, possible-c-format
msgid "%d lines: %.2f mm"
msgstr "%d Linien: %.2f mm"
-#: src/slic3r/GUI/MainFrame.cpp:1027
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:1728
+#, possible-c-format
msgid "%d presets successfully imported."
msgstr "%d Voreinstellungen erfolgreich importiert."
-#: src/slic3r/GUI/MainFrame.cpp:692
-#, c-format
+#: src/slic3r/GUI/GUI_App.cpp:718
+#, possible-c-format
+msgid "%s\nDo you want to continue?"
+msgstr "%s\nMöchten Sie fortfahren?"
+
+#: src/slic3r/GUI/MainFrame.cpp:917 src/slic3r/GUI/MainFrame.cpp:1316
+#, possible-c-format
msgid "%s &Website"
msgstr "%s &Webseite"
+#: src/slic3r/GUI/GUI_App.cpp:394
+#, possible-c-format
+msgid "%s - BREAKING CHANGE"
+msgstr "%s - BREAKING CHANGE"
+
+#: src/slic3r/GUI/Plater.cpp:1410
+#, possible-c-format
+msgid "%s - Drop project file"
+msgstr "%s - Drop Projektdatei"
+
#: src/slic3r/GUI/UpdateDialogs.cpp:211
-#, c-format
+#, possible-c-format
msgid "%s configuration is incompatible"
msgstr "%s Konfiguration ist nicht kompatibel"
-#: src/slic3r/GUI/Field.cpp:175
-#, c-format
+#: src/slic3r/GUI/Field.cpp:223
+#, possible-c-format
msgid "%s doesn't support percentage"
msgstr "%s akzeptiert keine Prozentangaben"
#: src/slic3r/GUI/MsgDialog.cpp:73
-#, c-format
+#, possible-c-format
msgid "%s error"
msgstr "%s Fehler"
-#: src/slic3r/GUI/ConfigWizard.cpp:481
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:499
+#, possible-c-format
msgid "%s Family"
msgstr "%s Familie"
#: src/slic3r/GUI/MsgDialog.cpp:74
-#, c-format
+#, possible-c-format
msgid "%s has encountered an error"
msgstr "%s ist auf einen Fehler gestoßen"
-#: src/slic3r/GUI/GUI_App.cpp:138
-#, c-format
-msgid ""
-"%s has encountered an error. It was likely caused by running out of memory. If you are sure you have enough RAM on your system, this may also be a bug and we would be glad if you reported it.\n"
-"\n"
-"The application will now terminate."
-msgstr ""
-"%s ist auf einen Fehler gestoßen. Es wurde wahrscheinlich dadurch verursacht, dass der Speicher knapp wird. Wenn Sie sicher sind, dass Sie genügend RAM auf Ihrem System haben, kann dies auch ein Programmfehler sein, und wir würden uns freuen, wenn Sie ihn melden würden.\n"
-"\n"
-"Die Anwendung wird nun beendet."
+#: src/slic3r/GUI/GUI_App.cpp:528
+#, possible-c-format
+msgid "%s has encountered an error. It was likely caused by running out of memory. If you are sure you have enough RAM on your system, this may also be a bug and we would be glad if you reported it.\n\nThe application will now terminate."
+msgstr "%s ist auf einen Fehler gestoßen. Es wurde wahrscheinlich dadurch verursacht, dass der Speicher knapp wird. Wenn Sie sicher sind, dass Sie genügend RAM auf Ihrem System haben, kann dies auch ein Programmfehler sein, und wir würden uns freuen, wenn Sie ihn melden würden.\n\nDie Anwendung wird nun beendet."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:222
-#, c-format
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:62
+#, possible-c-format
msgid "%s has encountered an error. It was likely caused by running out of memory. If you are sure you have enough RAM on your system, this may also be a bug and we would be glad if you reported it."
msgstr "%s ist auf einen Fehler gestoßen. Es wurde wahrscheinlich dadurch verursacht, dass der Speicher knapp wird. Wenn Sie sicher sind, dass Sie genügend RAM auf Ihrem System haben, kann dies auch ein Programmfehler sein, und wir würden uns freuen, wenn Sie ihn melden würden."
-#: src/slic3r/GUI/UpdateDialogs.cpp:308
-#, c-format
+#: src/slic3r/GUI/UpdateDialogs.cpp:309
+#, possible-c-format
msgid "%s has no configuration updates available."
msgstr "Für %s sind keine Konfigurationsaktualisierungen verfügbar."
#: src/slic3r/GUI/UpdateDialogs.cpp:148 src/slic3r/GUI/UpdateDialogs.cpp:210
-#, c-format
+#, possible-c-format
msgid "%s incompatibility"
msgstr "%s-Inkompatibilität"
#: src/slic3r/GUI/UpdateDialogs.cpp:270
-#, c-format
-msgid ""
-"%s now uses an updated configuration structure.\n"
-"\n"
-"So called 'System presets' have been introduced, which hold the built-in default settings for various printers. These System presets cannot be modified, instead, users now may create their own presets inheriting settings from one of the System presets.\n"
-"An inheriting preset may either inherit a particular value from its parent or override it with a customized value.\n"
-"\n"
-"Please proceed with the %s that follows to set up the new presets and to choose whether to enable automatic preset updates."
-msgstr ""
-"%s verwendet nun eine aktualisierte Konfigurationsstruktur.\n"
-"\n"
-"Sogenannte 'Systemeinstellungen' wurden eingeführt; diese enthalten die eingebauten Standardeinstellungen für verschiedene Drucker. Diese Systemeinstellungen können nicht verändert werden. Stattdessen können Benutzer nun ihre eigenen Voreinstellungen erstellen, die Werte von einer der Systemeinstellungen übernehmen.\n"
-"Eine übernehmende Voreinstellung kann entweder einen bestimmten Wert von ihrem Vorbild übernehmen, oder ihn mit einem eigenen Wert überschreiben.\n"
-"\n"
-"Bitte fahren Sie fort mit '%s'. Dies folgt nun, um die neuen Einstellungen einzurichten sowie auszuwählen, ob Einstellungen automatisch aktualisiert werden dürfen."
-
-#: src/slic3r/GUI/GUI_App.cpp:820
-#, c-format
+#, possible-c-format
+msgid "%s now uses an updated configuration structure.\n\nSo called 'System presets' have been introduced, which hold the built-in default settings for various printers. These System presets cannot be modified, instead, users now may create their own presets inheriting settings from one of the System presets.\nAn inheriting preset may either inherit a particular value from its parent or override it with a customized value.\n\nPlease proceed with the %s that follows to set up the new presets and to choose whether to enable automatic preset updates."
+msgstr "%s verwendet nun eine aktualisierte Konfigurationsstruktur.\n\nSogenannte 'Systemeinstellungen' wurden eingeführt; diese enthalten die eingebauten Standardeinstellungen für verschiedene Drucker. Diese Systemeinstellungen können nicht verändert werden. Stattdessen können Benutzer nun ihre eigenen Voreinstellungen erstellen, die Werte von einer der Systemeinstellungen übernehmen.\nEine übernehmende Voreinstellung kann entweder einen bestimmten Wert von ihrem Vorbild übernehmen, oder ihn mit einem eigenen Wert überschreiben.\n\nBitte fahren Sie fort mit '%s'. Dies folgt nun, um die neuen Einstellungen einzurichten sowie auszuwählen, ob Einstellungen automatisch aktualisiert werden dürfen."
+
+#: src/slic3r/GUI/GUI_App.cpp:1512
+#, possible-c-format
msgid "%s View Mode"
msgstr "%s Anzeigemodus"
#: src/slic3r/GUI/UpdateDialogs.cpp:151
-#, c-format
-msgid ""
-"%s will now start updates. Otherwise it won't be able to start.\n"
-"\n"
-"Note that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n"
-"\n"
-"Updated configuration bundles:"
-msgstr ""
-"%s beginnt nun mit der Aktualisierung. Andernfalls kann nicht gestartet werden.\n"
-"\n"
-"Beachten Sie, dass zuerst ein vollständiger Konfigurations-Snapshot erstellt wird. Er kann dann jederzeit wiederhergestellt werden, falls es ein Problem mit der neuen Version geben sollte.\n"
-"\n"
-"Aktualisierte Konfigurations-Bundles:"
-
-#: src/slic3r/GUI/MainFrame.cpp:705
-#, c-format
+#, possible-c-format
+msgid "%s will now start updates. Otherwise it won't be able to start.\n\nNote that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n\nUpdated configuration bundles:"
+msgstr "%s beginnt nun mit der Aktualisierung. Andernfalls kann nicht gestartet werden.\n\nBeachten Sie, dass zuerst ein vollständiger Konfigurations-Snapshot erstellt wird. Er kann dann jederzeit wiederhergestellt werden, falls es ein Problem mit der neuen Version geben sollte.\n\nAktualisierte Konfigurations-Bundles:"
+
+#: src/slic3r/GUI/MainFrame.cpp:933 src/slic3r/GUI/MainFrame.cpp:937
+#: src/slic3r/GUI/MainFrame.cpp:1329
+#, possible-c-format
msgid "&About %s"
msgstr "Ü&ber %s"
-#: src/slic3r/GUI/GUI_App.cpp:908
+#: src/slic3r/GUI/MainFrame.cpp:1297
+msgid "&Collapse sidebar"
+msgstr "Seitenleiste zuklappen (&C)"
+
+#: src/slic3r/GUI/GUI_App.cpp:1645
msgid "&Configuration"
msgstr "&Konfiguration"
-#: src/slic3r/GUI/GUI_App.cpp:800
+#: src/slic3r/GUI/GUI_App.cpp:1480
msgid "&Configuration Snapshots"
msgstr "Konfi&gurations-Momentaufnahmen"
-#: src/slic3r/GUI/MainFrame.cpp:588
+#: src/slic3r/GUI/MainFrame.cpp:1194
msgid "&Copy"
msgstr "&Kopieren"
-#: src/slic3r/GUI/MainFrame.cpp:572
+#: src/slic3r/GUI/MainFrame.cpp:1178
msgid "&Delete selected"
msgstr "Löschen aus&gewählt"
-#: src/slic3r/GUI/MainFrame.cpp:722
+#: src/slic3r/GUI/MainFrame.cpp:1348 src/slic3r/GUI/MainFrame.cpp:1358
msgid "&Edit"
msgstr "&Bearbeiten"
-#: src/slic3r/GUI/MainFrame.cpp:506
+#: src/slic3r/GUI/MainFrame.cpp:1103
msgid "&Export"
msgstr "&Export"
-#: src/slic3r/GUI/MainFrame.cpp:617 src/slic3r/GUI/MainFrame.cpp:752
+#: src/slic3r/GUI/MainFrame.cpp:1224 src/slic3r/GUI/MainFrame.cpp:1451
msgid "&Filament Settings Tab"
msgstr "&Filamenteinstellungen"
-#: src/slic3r/GUI/MainFrame.cpp:721
+#: src/slic3r/GUI/MainFrame.cpp:1347 src/slic3r/GUI/MainFrame.cpp:1357
+#: src/slic3r/GUI/MainFrame.cpp:1417
msgid "&File"
msgstr "&Datei"
-#: src/slic3r/GUI/ConfigWizard.cpp:1981
+#: src/slic3r/GUI/ConfigWizard.cpp:2492
msgid "&Finish"
msgstr "&Beenden"
-#: src/slic3r/GUI/MainFrame.cpp:727
+#: src/slic3r/GUI/MainFrame.cpp:1141
+msgid "&G-code preview"
+msgstr "&G-Code-Vorschau"
+
+#: src/slic3r/GUI/MainFrame.cpp:1353 src/slic3r/GUI/MainFrame.cpp:1363
+#: src/slic3r/GUI/MainFrame.cpp:1423
msgid "&Help"
msgstr "&Hilfe"
-#: src/slic3r/GUI/MainFrame.cpp:474
+#: src/slic3r/GUI/MainFrame.cpp:1065
msgid "&Import"
msgstr "&Import"
-#: src/slic3r/GUI/GUI_App.cpp:822
+#: src/slic3r/GUI/GUI_App.cpp:1517
msgid "&Language"
msgstr "Sp&rache"
-#: src/slic3r/GUI/MainFrame.cpp:405
+#: src/slic3r/GUI/MainFrame.cpp:986
msgid "&New Project"
msgstr "&Neues Projekt"
-#: src/slic3r/GUI/ConfigWizard.cpp:1980
+#: src/slic3r/GUI/ConfigWizard.cpp:2491
msgid "&Next >"
msgstr "&Weiter >"
-#: src/slic3r/GUI/MainFrame.cpp:408
+#: src/slic3r/GUI/MainFrame.cpp:1391
+msgid "&Open G-code"
+msgstr "Öffne G-C&ode"
+
+#: src/slic3r/GUI/MainFrame.cpp:989
msgid "&Open Project"
msgstr "Pr&ojekt öffnen"
-#: src/slic3r/GUI/MainFrame.cpp:591
+#: src/slic3r/GUI/MainFrame.cpp:1197
msgid "&Paste"
msgstr "Ei&nfügen"
-#: src/slic3r/GUI/MainFrame.cpp:606
+#: src/slic3r/GUI/MainFrame.cpp:1216
msgid "&Plater Tab"
msgstr "Druck&platte"
-#: src/slic3r/GUI/GUI_App.cpp:804
+#: src/slic3r/GUI/GUI_App.cpp:1487
msgid "&Preferences"
msgstr "&Einstellungen"
-#: src/slic3r/GUI/MainFrame.cpp:540
+#: src/slic3r/GUI/MainFrame.cpp:1144 src/slic3r/GUI/MainFrame.cpp:1402
msgid "&Quit"
msgstr "&Beenden"
-#: src/slic3r/GUI/MainFrame.cpp:583
+#: src/slic3r/GUI/MainFrame.cpp:1189
msgid "&Redo"
msgstr "&Redo"
-#: src/slic3r/GUI/MainFrame.cpp:536
+#: src/slic3r/GUI/MainFrame.cpp:1137
msgid "&Repair STL file"
msgstr "STL-Datei &reparieren"
-#: src/slic3r/GUI/MainFrame.cpp:446
+#: src/slic3r/GUI/MainFrame.cpp:1028
msgid "&Save Project"
msgstr "Projekt &sichern"
-#: src/slic3r/GUI/MainFrame.cpp:565
+#: src/slic3r/GUI/MainFrame.cpp:1171
msgid "&Select all"
msgstr "Alle&s auswählen"
-#: src/slic3r/GUI/MainFrame.cpp:580
+#: src/slic3r/GUI/MainFrame.cpp:1186
msgid "&Undo"
msgstr "&Undo"
-#: src/slic3r/GUI/MainFrame.cpp:724
+#: src/slic3r/GUI/MainFrame.cpp:1350 src/slic3r/GUI/MainFrame.cpp:1360
+#: src/slic3r/GUI/MainFrame.cpp:1418
msgid "&View"
msgstr "&Anzeige"
-#: src/slic3r/GUI/MainFrame.cpp:723
+#: src/slic3r/GUI/MainFrame.cpp:1349 src/slic3r/GUI/MainFrame.cpp:1359
msgid "&Window"
msgstr "&Fenster"
-#: src/slic3r/GUI/ConfigWizard.cpp:603 src/slic3r/GUI/ConfigWizard.cpp:631
+#: src/slic3r/GUI/ConfigWizard.cpp:662 src/slic3r/GUI/ConfigWizard.cpp:812
+#: src/slic3r/GUI/ConfigWizard.cpp:873 src/slic3r/GUI/ConfigWizard.cpp:1007
msgid "(All)"
msgstr "(Alles)"
-#: src/libslic3r/PrintConfig.cpp:1446
+#: src/slic3r/GUI/Plater.cpp:1195
+msgid "(including spool)"
+msgstr "(einschließlich Spule)"
+
+#: src/libslic3r/PrintConfig.cpp:1554
msgid "(minimum)"
msgstr "(Minimum)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:116
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:109
msgid "(Re)slice"
msgstr "(Re)Slice"
-#: src/slic3r/GUI/MainFrame.cpp:532
+#: src/slic3r/GUI/MainFrame.cpp:1133
msgid "(Re)Slice No&w"
msgstr "(Re)Slice jet&zt"
-#: src/libslic3r/PrintConfig.cpp:771 src/libslic3r/PrintConfig.cpp:2587
+#: src/libslic3r/PrintConfig.cpp:807 src/libslic3r/PrintConfig.cpp:2730
msgid "(Unknown)"
msgstr "(Unbekannt)"
-#: src/slic3r/GUI/MainFrame.cpp:790
+#: src/slic3r/GUI/MainFrame.cpp:1491
msgid ") not found."
msgstr ") nicht gefunden."
-#: src/libslic3r/PrintConfig.cpp:1918
+#: src/libslic3r/PrintConfig.cpp:1085
+msgid "0 (no open anchors)"
+msgstr "0 (keine offenen Anker)"
+
+#: src/libslic3r/PrintConfig.cpp:1107
+msgid "0 (not anchored)"
+msgstr "0 (nicht verankert)"
+
+#: src/libslic3r/PrintConfig.cpp:2060
msgid "0 (soluble)"
msgstr "0 (löslich)"
-#: src/libslic3r/PrintConfig.cpp:1919
+#: src/libslic3r/PrintConfig.cpp:2061
msgid "0.2 (detachable)"
msgstr "0,2 (lösbar)"
-#: src/slic3r/GUI/MainFrame.cpp:626
+#: src/libslic3r/PrintConfig.cpp:1090 src/libslic3r/PrintConfig.cpp:1112
+msgid "1000 (unlimited)"
+msgstr "1000 (unbegrenzt)"
+
+#: src/slic3r/GUI/MainFrame.cpp:1234
msgid "3&D"
msgstr "3&D"
-#: src/slic3r/GUI/Plater.cpp:4097
+#: src/slic3r/GUI/Plater.cpp:4044
msgid "3D editor view"
msgstr "3D Editiermodus"
-#: src/libslic3r/PrintConfig.cpp:851
+#: src/libslic3r/PrintConfig.cpp:889
msgid "3D Honeycomb"
msgstr "3D Bienenwabe"
-#: src/slic3r/GUI/Mouse3DController.cpp:274
+#: src/slic3r/GUI/NotificationManager.hpp:318
+msgid "3D Mouse disconnected."
+msgstr "3D-Maus nicht angeschlossen."
+
+#: src/slic3r/GUI/Mouse3DController.cpp:263
msgid "3Dconnexion settings"
msgstr "3Dconnexion Einstellungen"
-#: src/slic3r/GUI/Plater.cpp:5038
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:5167
+#, possible-c-format
msgid "3MF file exported to %s"
msgstr "3MF Datei exportiert nach %s"
-#: src/slic3r/GUI/ConfigWizard.cpp:1979
+#: src/slic3r/GUI/ConfigWizard.cpp:2490
msgid "< &Back"
msgstr "< &Zurück"
-#: src/libslic3r/PrintConfig.cpp:287
+#: src/libslic3r/PrintConfig.cpp:321
msgid "A boolean expression using the configuration values of an active print profile. If this expression evaluates to true, this profile is considered compatible with the active print profile."
msgstr "Ein boolescher Ausdruck, der die Konfigurationswerte eines aktiven Druckprofils verwendet. Wenn dieser Ausdruck als wahr bewertet wird, wird dieses Profil als kompatibel mit dem aktiven Druckprofil angesehen."
-#: src/libslic3r/PrintConfig.cpp:272
+#: src/libslic3r/PrintConfig.cpp:306
msgid "A boolean expression using the configuration values of an active printer profile. If this expression evaluates to true, this profile is considered compatible with the active printer profile."
msgstr "Ein boolescher Ausdruck, der die Konfigurationswerte eines aktiven Druckerprofils verwendet. Wenn dieser Ausdruck als wahr bewertet wird, wird dieses Profil als kompatibel mit dem aktiven Druckerprofil angesehen."
-#: src/slic3r/GUI/Tab.cpp:975
+#: src/slic3r/GUI/Tab.cpp:1237
msgid "A copy of the current system preset will be created, which will be detached from the system preset."
msgstr "Es wird eine Kopie der aktuellen Systemvoreinstellung erstellt, die von der Systemvoreinstellung gelöst wird."
-#: src/slic3r/GUI/ConfigWizard.cpp:1034
+#: src/slic3r/GUI/ConfigWizard.cpp:1400
msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS."
msgstr "Ein Daumenwert ist 160 bis 230 °C für PLA, und 215 bis 250 °C für ABS."
-#: src/slic3r/GUI/ConfigWizard.cpp:1048
+#: src/slic3r/GUI/ConfigWizard.cpp:1414
msgid "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have no heated bed."
msgstr "Ein Daumenwert ist 60 °C für PLA und 110 °C für ABS. Auf 0 setzen, falls kein beheiztes Druckbett vorhanden ist."
-#: src/slic3r/GUI/GLCanvas3D.cpp:686
-msgid "A toolpath outside the print area was detected"
-msgstr "Ein Werkzeugweg außerhalb des Druckbereichs wurde erkannt"
+#: src/slic3r/GUI/GLCanvas3D.cpp:634
+msgid "A toolpath outside the print area was detected."
+msgstr "Es wurde ein Werkzeugweg außerhalb des Druckbereichs erkannt."
-#: src/slic3r/GUI/AboutDialog.cpp:199
-#, c-format
+#: src/slic3r/GUI/AboutDialog.cpp:212 src/slic3r/GUI/AboutDialog.cpp:215
+#, possible-c-format
msgid "About %s"
msgstr "Ãœber %s"
-#: src/slic3r/GUI/GLCanvas3D.cpp:959
-#, c-format
-msgid "above %.2f mm"
-msgstr "oberhalb %.2f mm"
+#: src/slic3r/GUI/GCodeViewer.cpp:2189
+msgid "above"
+msgstr "über"
-#: src/libslic3r/PrintConfig.cpp:1569
+#: src/libslic3r/PrintConfig.cpp:1677
msgid "Above Z"
msgstr "Ãœber Z"
-#: src/slic3r/GUI/Tab.cpp:1164
+#: src/slic3r/GUI/Tab.cpp:1494
msgid "Acceleration control (advanced)"
msgstr "Beschleunigungskontrolle (fortgeschritten)"
-#: src/libslic3r/PrintConfig.cpp:2925
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:221
+#: src/libslic3r/PrintConfig.cpp:3089
msgid "Accuracy"
msgstr "Genauigkeit"
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:59
+msgid "Accurate"
+msgstr "Akkurat"
+
+#: src/slic3r/GUI/Plater.cpp:1423
+msgid "Action"
+msgstr "Aktion"
+
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78
msgid "Activate"
msgstr "Aktivieren"
@@ -383,67 +406,75 @@ msgstr "Aktivieren"
msgid "Active"
msgstr "Aktiv"
-#: src/slic3r/GUI/DoubleSlider.cpp:1135 src/slic3r/GUI/GUI_ObjectList.cpp:1705
+#: src/slic3r/GUI/DoubleSlider.cpp:1264 src/slic3r/GUI/GUI_ObjectList.cpp:1833
msgid "active"
msgstr "aktiv"
-#: src/slic3r/GUI/GLCanvas3D.cpp:267
+#: src/slic3r/GUI/GLCanvas3D.cpp:254
msgid "Adaptive"
msgstr "Adaptiv"
-#: src/slic3r/GUI/Tab.cpp:241
-msgid "Add a new printer"
-msgstr "Neuen Drucker hinzufügen"
+#: src/libslic3r/PrintConfig.cpp:894
+msgid "Adaptive Cubic"
+msgstr "Adaptiv kubisch"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:314
+msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\""
+msgstr "\"%1%\" als nächste Voreinstellung für den physischen Drucker \"%2%\" hinzufügen"
-#: src/libslic3r/PrintConfig.cpp:2782
+#: src/libslic3r/PrintConfig.cpp:2946
msgid "Add a pad underneath the supported model"
msgstr "Fügt eine Grundschicht unter das gestützte Modell"
-#: src/libslic3r/PrintConfig.cpp:2058
+#: src/libslic3r/PrintConfig.cpp:2200
msgid "Add a sheath (a single perimeter line) around the base support. This makes the support more reliable, but also more difficult to remove."
-msgstr "Fügen Sie eine Sheath (eine einzelne Druckkontur) um die Basisschicht herum hinzu. Das macht die Stützstrukturen zuverlässiger, aber auch schwieriger zu entfernen."
+msgstr "Fügen Sie eine Sheath (eine einzelne Druckkontur) um die Basisschicht herum hinzu. Das macht die Stützen zuverlässiger, aber auch schwieriger zu entfernen."
-#: src/slic3r/GUI/DoubleSlider.cpp:991
+#: src/slic3r/GUI/DoubleSlider.cpp:1114
msgid "Add another code - Ctrl + Left click"
msgstr "Weiteren Code hinzufügen - Strg + Linksklick"
-#: src/slic3r/GUI/DoubleSlider.cpp:992
+#: src/slic3r/GUI/DoubleSlider.cpp:1115
msgid "Add another code - Right click"
msgstr "Weiteren Code hinzufügen - Rechtsklick"
-#: src/slic3r/GUI/DoubleSlider.cpp:1477
+#: src/slic3r/GUI/DoubleSlider.cpp:1665
msgid "Add color change"
msgstr "Farbwechsel hinzufügen"
-#: src/slic3r/GUI/DoubleSlider.cpp:1180
+#: src/slic3r/GUI/DoubleSlider.cpp:1307
msgid "Add color change (%1%) for:"
msgstr "Farbwechsel (%1%) hinzufügen für:"
-#: src/slic3r/GUI/DoubleSlider.cpp:988
+#: src/slic3r/GUI/DoubleSlider.cpp:1111
msgid "Add color change - Left click"
msgstr "Farbwechsel hinzufügen - Linksklick"
-#: src/slic3r/GUI/DoubleSlider.cpp:986
+#: src/slic3r/GUI/DoubleSlider.cpp:1109
msgid "Add color change - Left click for predefined color or Shift + Left click for custom color selection"
msgstr "Farbwechsel hinzufügen - Linksklick für vordefinierte Farbe oder Shift + Linksklick für benutzerdefinierte Farbauswahl"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
msgid "Add color change marker for current layer"
msgstr "Fügt einen Farbwechselmarker der aktuellen Schicht hinzu"
-#: src/slic3r/GUI/DoubleSlider.cpp:1490
+#: src/slic3r/GUI/DoubleSlider.cpp:1682
msgid "Add custom G-code"
msgstr "Benutzerdefinierten G-Code hinzufügen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:240
+#: src/slic3r/GUI/DoubleSlider.cpp:1679
+msgid "Add custom template"
+msgstr "Benutzerdefinierte Vorlage hinzufügen"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:235
msgid "Add detail"
msgstr "Detail hinzufügen"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:421
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:308
msgid "Add drainage hole"
msgstr "Drainageloch hinzufügen"
-#: src/slic3r/GUI/DoubleSlider.cpp:984
+#: src/slic3r/GUI/DoubleSlider.cpp:1107
msgid "Add extruder change - Left click"
msgstr "Extruderwechsel hinzufügen - Linksklick"
@@ -451,30 +482,30 @@ msgstr "Extruderwechsel hinzufügen - Linksklick"
msgid "Add extruder to sequence"
msgstr "Extruder zur Sequenz hinzufügen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1993
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2152
msgid "Add Generic Subobject"
msgstr "Generische Subobjekt hinzufügen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2896
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2925
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2943
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3297
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3325
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3345
msgid "Add Height Range"
msgstr "Höhenbereich hinzufügen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4526 src/slic3r/GUI/Plater.cpp:3788
-#: src/slic3r/GUI/Plater.cpp:3800 src/slic3r/GUI/Plater.cpp:3940
+#: src/slic3r/GUI/GLCanvas3D.cpp:4892 src/slic3r/GUI/Plater.cpp:3708
+#: src/slic3r/GUI/Plater.cpp:3720 src/slic3r/GUI/Plater.cpp:3858
msgid "Add instance"
msgstr "Kopie hinzufügen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:159
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:153
msgid "Add Instance of the selected object"
msgstr "Kopie des gewählten Objektes hinzufügen"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:162
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:165
msgid "Add layer range"
msgstr "Schichtbereich hinzufügen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2328
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2692
msgid "Add Layers"
msgstr "Schichten hinzufügen"
@@ -482,12 +513,12 @@ msgstr "Schichten hinzufügen"
msgid "Add modifier"
msgstr "Modifizierer hinzufügen"
-#: src/libslic3r/PrintConfig.cpp:479
-#, no-c-format
+#: src/libslic3r/PrintConfig.cpp:515
+#, possible-c-format
msgid "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r keeps adding perimeters, until more than 70% of the loop immediately above is supported."
msgstr "Fügen Sie bei Bedarf weitere Perimeter hinzu, um Spalten in schrägen Wänden zu vermeiden. PrusaSlicer fügt immer wieder Perimeter hinzu, bis mehr als 70% der unmittelbar darüber liegenden Schleife unterstützt werden."
-#: src/slic3r/GUI/Plater.cpp:3940
+#: src/slic3r/GUI/Plater.cpp:3858
msgid "Add one more instance of the selected object"
msgstr "Eine weitere Kopie des gewählten Objekts hinzufügen"
@@ -495,52 +526,61 @@ msgstr "Eine weitere Kopie des gewählten Objekts hinzufügen"
msgid "Add part"
msgstr "Teil hinzufügen"
-#: src/slic3r/GUI/DoubleSlider.cpp:1487
+#: src/slic3r/GUI/DoubleSlider.cpp:1675
msgid "Add pause print"
msgstr "Druckpause hinzufügen"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363
+#: src/slic3r/GUI/PresetComboBoxes.cpp:627
+#: src/slic3r/GUI/PresetComboBoxes.cpp:674
+msgid "Add physical printer"
+msgstr "Physischen Drucker hinzufügen"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210
msgid "Add point"
msgstr "Punkt hinzufügen"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213
msgid "Add point to selection"
msgstr "Punkt zur Auswahl hinzufügen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1509
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:180
+msgid "Add preset for this printer device"
+msgstr "Voreinstellung für diesen Drucker hinzufügen"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1640
msgid "Add settings"
msgstr "Einstellungen hinzufügen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1386
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1517
msgid "Add Settings Bundle for Height range"
msgstr "Höhenbreich Einstellungsbündel hinzufügen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1388
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1519
msgid "Add Settings Bundle for Object"
msgstr "Objekt Einstellungsbündel hinzufügen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1387
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1518
msgid "Add Settings Bundle for Sub-object"
msgstr "Subobjekt Einstellungsbündel hinzufügen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1314
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1445
msgid "Add Settings for Layers"
msgstr "Schichten Einstellungen hinzufügen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1316
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1447
msgid "Add Settings for Object"
msgstr "Objekt Einstellungen hinzufügen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1315
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1446
msgid "Add Settings for Sub-object"
msgstr "Subobjekt Einstellungen hinzufügen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1793
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2051
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1953
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2210
msgid "Add Shape"
msgstr "Form hinzufügen"
-#: src/libslic3r/PrintConfig.cpp:409
+#: src/libslic3r/PrintConfig.cpp:443
msgid "Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top+bottom solid layers)."
msgstr "Fügen Sie massives Infill in der Nähe von schrägen Flächen hinzu, um die vertikale Schalenstärke zu gewährleisten (obere und untere massive Schichten)."
@@ -552,11 +592,19 @@ msgstr "Stützblocker hinzufügen"
msgid "Add support enforcer"
msgstr "Stützverstärker hinzufügen"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:494
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:374
msgid "Add support point"
msgstr "Stützpunkt hinzufügen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4467
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:371
+msgid "Add supports"
+msgstr "Stützen hinzufügen"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:293
+msgid "Add supports by angle"
+msgstr "Stützen nach Winkel hinzufügen"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4833
msgid "Add..."
msgstr "Hinzufügen..."
@@ -564,23 +612,29 @@ msgstr "Hinzufügen..."
msgid "Add/Remove filaments"
msgstr "Filamente hinzufügen/entfernen"
-#: src/slic3r/GUI/Preset.cpp:1201
+#: src/slic3r/GUI/PresetComboBoxes.cpp:813
msgid "Add/Remove materials"
msgstr "Materialien hinzufügen/entfernen"
-#: src/slic3r/GUI/Preset.cpp:1203
+#: src/slic3r/GUI/PresetComboBoxes.cpp:622
+#: src/slic3r/GUI/PresetComboBoxes.cpp:669
+msgid "Add/Remove presets"
+msgstr "Voreinstellungen hinzufügen/entfernen"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:815
+#: src/slic3r/GUI/PresetComboBoxes.cpp:972
msgid "Add/Remove printers"
msgstr "Drucker hinzufügen/entfernen"
-#: src/slic3r/GUI/Tab.cpp:970
+#: src/slic3r/GUI/Tab.cpp:1288
msgid "Additional information:"
msgstr "Weitere Informationen:"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:59
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:62
msgid "Additional Settings"
msgstr "Zusätzliche Einstellungen"
-#: src/slic3r/GUI/ConfigWizard.cpp:791
+#: src/slic3r/GUI/ConfigWizard.cpp:1150
msgid "Additionally a backup snapshot of the whole configuration is created before an update is applied."
msgstr "Zusätzlich wird eine Momentaufnahme der gesamten Konfiguration als Sicherung erstellt, bevor ein Update durchgeführt wird."
@@ -588,23 +642,22 @@ msgstr "Zusätzlich wird eine Momentaufnahme der gesamten Konfiguration als Sich
msgid "Address"
msgstr "Adresse"
-#: src/slic3r/GUI/GUI_App.cpp:814 src/slic3r/GUI/GUI_ObjectList.cpp:104
-#: src/slic3r/GUI/GUI_ObjectList.cpp:622 src/slic3r/GUI/Tab.cpp:1087
-#: src/slic3r/GUI/Tab.cpp:1102 src/slic3r/GUI/Tab.cpp:1201
-#: src/slic3r/GUI/Tab.cpp:1204 src/slic3r/GUI/Tab.cpp:1470
-#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:3661
-#: src/slic3r/GUI/wxExtensions.cpp:754 src/libslic3r/PrintConfig.cpp:88
-#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:223
-#: src/libslic3r/PrintConfig.cpp:1037 src/libslic3r/PrintConfig.cpp:2276
-#: src/libslic3r/PrintConfig.cpp:2448
+#: src/slic3r/GUI/GUI_ObjectList.cpp:102 src/slic3r/GUI/GUI_ObjectList.cpp:661
+#: src/slic3r/GUI/Tab.cpp:1409 src/slic3r/GUI/Tab.cpp:1430
+#: src/slic3r/GUI/Tab.cpp:1531 src/slic3r/GUI/Tab.cpp:1534
+#: src/slic3r/GUI/Tab.cpp:1816 src/slic3r/GUI/Tab.cpp:2152
+#: src/slic3r/GUI/Tab.cpp:4080 src/libslic3r/PrintConfig.cpp:90
+#: src/libslic3r/PrintConfig.cpp:121 src/libslic3r/PrintConfig.cpp:257
+#: src/libslic3r/PrintConfig.cpp:1081 src/libslic3r/PrintConfig.cpp:2419
+#: src/libslic3r/PrintConfig.cpp:2591
msgid "Advanced"
msgstr "Erweiterte Einstellungen"
-#: src/slic3r/GUI/ConfigWizard.cpp:821
+#: src/slic3r/GUI/ConfigWizard.cpp:1180
msgid "Advanced mode"
msgstr "Fortgeschrittener Modus"
-#: src/slic3r/GUI/GUI_App.cpp:814
+#: src/slic3r/GUI/GUI_App.cpp:1506
msgid "Advanced View Mode"
msgstr "Erweiterter Anzeigemodus"
@@ -612,225 +665,299 @@ msgstr "Erweiterter Anzeigemodus"
msgid "Advanced: Output log"
msgstr "Fortgeschritten: Ausgabeprotokoll"
-#: src/libslic3r/PrintConfig.cpp:668
+#: src/libslic3r/PrintConfig.cpp:704
msgid "After a tool change, the exact position of the newly loaded filament inside the nozzle may not be known, and the filament pressure is likely not yet stable. Before purging the print head into an infill or a sacrificial object, Slic3r will always prime this amount of material into the wipe tower to produce successive infill or sacrificial object extrusions reliably."
msgstr "Nach einem Werkzeugwechsel ist die genaue Position des neu geladenen Filaments innerhalb der Düse möglicherweise nicht bekannt, und der Filamentdruck ist wahrscheinlich noch nicht stabil. Bevor der Druckkopf in eine Füllung oder ein Opferobjekt wischt, wird PrusaSlicer immer diese Materialmenge in den Wischturm leiten, um aufeinanderfolgende Füll- oder Opferobjekt-Extrusionen zuverlässig herzustellen."
-#: src/slic3r/GUI/Tab.cpp:1994 src/libslic3r/PrintConfig.cpp:1080
+#: src/slic3r/GUI/Tab.cpp:2182 src/libslic3r/PrintConfig.cpp:1173
msgid "After layer change G-code"
msgstr "G-Code am Schichtende"
-#: src/libslic3r/PrintConfig.cpp:3398
+#: src/libslic3r/PrintConfig.cpp:3597
msgid "Align the model to the given point."
msgstr "Das Modell auf den angegebenen Punkt ausrichten."
-#: src/libslic3r/PrintConfig.cpp:3397
+#: src/libslic3r/PrintConfig.cpp:3596
msgid "Align XY"
msgstr "Ausrichten von XY"
-#: src/libslic3r/PrintConfig.cpp:1631
+#: src/libslic3r/PrintConfig.cpp:1739
msgid "Aligned"
msgstr "Ausgerichtet"
-#: src/slic3r/GUI/ConfigWizard.cpp:290 src/slic3r/GUI/ConfigWizard.cpp:573
-#: src/slic3r/GUI/Tab.cpp:3174
+#: src/libslic3r/PrintConfig.cpp:470 src/libslic3r/PrintConfig.cpp:902
+msgid "Aligned Rectilinear"
+msgstr "Ausgerichtet Geradlinig"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:308 src/slic3r/GUI/ConfigWizard.cpp:598
+#: src/slic3r/GUI/Tab.cpp:3507 src/slic3r/GUI/UnsavedChangesDialog.cpp:921
msgid "All"
msgstr "Alle"
-#: src/libslic3r/Print.cpp:1219
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:197
+msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button"
+msgstr "Alles Gizmos: Drehen - linke Maustaste; Schwenken - rechte Maustaste"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:694
+msgid "All installed printers are compatible with the selected filament."
+msgstr "Alle installierten Drucker sind mit dem ausgewählten Filament kompatibel."
+
+#: src/libslic3r/Print.cpp:1245
msgid "All objects are outside of the print volume."
msgstr "Alle Objekte befinden sich außerhalb des Druckraums."
-#: src/slic3r/GUI/Plater.cpp:4669
+#: src/slic3r/GUI/Plater.cpp:4774
msgid "All objects will be removed, continue?"
msgstr "Alle Objekte werden entfernt, fortfahren?"
-#: src/slic3r/GUI/ConfigWizard.cpp:289
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:737
+msgid "All settings changes will be discarded."
+msgstr "Alle Einstellungsänderungen werden verworfen."
+
+#: src/libslic3r/PrintConfig.cpp:1212
+msgid "All solid surfaces"
+msgstr "Alle massiven Oberflächen"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:307
msgid "All standard"
msgstr "Alles standard"
-#: src/libslic3r/Zipper.cpp:62
+#: src/libslic3r/PrintConfig.cpp:1210
+msgid "All top surfaces"
+msgstr "Alle Oberseiten"
+
+#: src/libslic3r/miniz_extension.cpp:121
msgid "allocation failed"
msgstr "Allokation fehlgeschlagen"
-#: src/slic3r/GUI/Plater.cpp:3995
+#: src/slic3r/GUI/Preferences.cpp:161 src/slic3r/GUI/Preferences.cpp:165
+msgid "Allow just a single PrusaSlicer instance"
+msgstr "Nur eine einzige PrusaSlicer-Instanz zulassen"
+
+#: src/slic3r/GUI/Plater.cpp:3915
msgid "Along X axis"
msgstr "Entlang der X Achse"
-#: src/slic3r/GUI/Plater.cpp:3997
+#: src/slic3r/GUI/Plater.cpp:3917
msgid "Along Y axis"
msgstr "Entlang der Y Achse"
-#: src/slic3r/GUI/Plater.cpp:3999
+#: src/slic3r/GUI/Plater.cpp:3919
msgid "Along Z axis"
msgstr "Entlang der Z Achse"
-#: src/slic3r/GUI/ConfigWizard.cpp:222
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:160
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141
+msgid "Alt + Mouse wheel"
+msgstr "Alt + Mausrad"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:240
msgid "Alternate nozzles:"
msgstr "Alternative Düsen:"
-#: src/slic3r/GUI/Plater.cpp:5002
-#, c-format
+#: src/slic3r/GUI/Preferences.cpp:163
+msgid "Always ask for unsaved changes when selecting new preset"
+msgstr "Immer nach nicht gespeicherten Änderungen fragen, wenn eine neue Voreinstellung ausgewählt wird"
+
+#: src/slic3r/GUI/Plater.cpp:5135
+#, possible-c-format
msgid "AMF file exported to %s"
msgstr "AMF Datei exportiert nach %s"
-#: src/slic3r/GUI/GLCanvas3D.cpp:690
-msgid ""
-"An object outside the print area was detected\n"
-"Resolve the current problem to continue slicing"
-msgstr ""
-"Ein Objekt außerhalb des Druckbereichs wurde erkannt.\n"
-"Beheben Sie das aktuelle Problem, um mit dem Slicen fortzufahren"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:685
-msgid "An object outside the print area was detected"
-msgstr "Ein Objekt außerhalb des Druckbereichs wurde erkannt"
+#: src/slic3r/GUI/GLCanvas3D.cpp:638
+msgid "An object outside the print area was detected.\nResolve the current problem to continue slicing."
+msgstr "Es wurde ein Objekt außerhalb des Druckbereichs erkannt.\nDas Problem lösen, um mit dem Slicen fortzufahren."
-#: src/slic3r/GUI/Tab.cpp:2943
-msgid "and it has the following unsaved changes:"
-msgstr "und hat die folgenden ungesicherten Änderungen:"
+#: src/slic3r/GUI/GLCanvas3D.cpp:633
+msgid "An object outside the print area was detected."
+msgstr "Es wurde ein Objekt außerhalb des Druckbereichs erkannt."
-#: src/slic3r/GUI/Plater.cpp:3170
+#: src/slic3r/GUI/Plater.cpp:2972
msgid "Another export job is currently running."
msgstr "Ein anderer Exportjob läuft zurzeit."
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:162
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
msgid "Any arrow"
msgstr "Jeder Pfeil"
-#: src/slic3r/GUI/Tab.cpp:965
+#: src/slic3r/GUI/Tab.cpp:1283
msgid "Any modifications should be saved as a new preset inherited from this one."
msgstr "Alle Änderungen sollten als neue Voreinstellungen gespeichert werden, die von diesem vererbt wurden."
-#: src/libslic3r/PrintConfig.cpp:104
+#: src/libslic3r/PrintConfig.cpp:162
+msgid "API key"
+msgstr "API Key"
+
+#: src/libslic3r/PrintConfig.cpp:106
msgid "API Key / Password"
msgstr "API Key / Kennwort"
-#: src/slic3r/GUI/GUI_App.cpp:810
+#: src/slic3r/GUI/GUI_App.cpp:1493
msgid "Application preferences"
msgstr "Anwendungseinstellungen"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1374
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221
msgid "Apply changes"
msgstr "Änderungen anwenden"
-#: src/libslic3r/PrintConfig.cpp:575 src/libslic3r/PrintConfig.cpp:1708
+#: src/libslic3r/PrintConfig.cpp:611 src/libslic3r/PrintConfig.cpp:1823
msgid "approximate seconds"
msgstr "ungefähre Sekunden"
-#: src/libslic3r/PrintConfig.cpp:428 src/libslic3r/PrintConfig.cpp:854
+#: src/libslic3r/PrintConfig.cpp:464 src/libslic3r/PrintConfig.cpp:892
msgid "Archimedean Chords"
msgstr "Archimedische Bögen"
-#: src/libslic3r/Zipper.cpp:88
+#: src/libslic3r/miniz_extension.cpp:147
msgid "archive is too large"
msgstr "Archiv ist zu groß"
-#. TRN remove/delete
-#: src/slic3r/GUI/Tab.cpp:3123
+#: src/slic3r/GUI/Tab.cpp:3420
msgid "Are you sure you want to %1% the selected preset?"
msgstr "Sind Sie sicher, dass Sie die gewählte Voreinstellung %1% möchten?"
#: src/slic3r/GUI/FirmwareDialog.cpp:902
-msgid ""
-"Are you sure you want to cancel firmware flashing?\n"
-"This could leave your printer in an unusable state!"
+msgid "Are you sure you want to cancel firmware flashing?\nThis could leave your printer in an unusable state!"
msgstr "Sind Sie sicher, dass Sie das Flashen der Firmware abbrechen wollen? Dies könnte Ihren Drucker in einen unbrauchbaren Zustand versetzen!"
-#: src/slic3r/GUI/DoubleSlider.cpp:1903 src/slic3r/GUI/DoubleSlider.cpp:1924
+#: src/slic3r/GUI/DoubleSlider.cpp:2122 src/slic3r/GUI/DoubleSlider.cpp:2142
msgid "Are you sure you want to continue?"
msgstr "Sind Sie sicher, dass Sie weitermachen wollen?"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269
+#: src/slic3r/GUI/Tab.cpp:3392
+msgid "Are you sure you want to delete \"%1%\" preset from the physical printer \"%2%\"?"
+msgstr "Sind Sie sicher, dass Sie die Voreinstellung \"%1%\" des physischen Drucker \"%2%\" löschen möchten?"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:658
+msgid "Are you sure you want to delete \"%1%\" printer?"
+msgstr "Sind Sie sicher, dass Sie den Drucker \"%1%\" löschen möchten?"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1128
msgid "Are you sure you want to do it?"
msgstr "Sind Sie sicher, dass Sie es tun wollen?"
-#: src/libslic3r/PrintConfig.cpp:2423
+#: src/libslic3r/PrintConfig.cpp:2566
msgid "Area fill"
msgstr "Bereichsfüllung"
-#: src/slic3r/GUI/Plater.cpp:641
+#: src/slic3r/GUI/Plater.cpp:507
msgid "Around object"
msgstr "Um das Objekt"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:157
-#: src/slic3r/GUI/Plater.cpp:2754
+#: src/slic3r/GUI/GLCanvas3D.cpp:4859 src/slic3r/GUI/KBShortcutsDialog.cpp:151
+#: src/slic3r/GUI/Plater.cpp:1549
msgid "Arrange"
msgstr "Anordnen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:158
+#: src/slic3r/GUI/GLCanvas3D.cpp:3889
+msgid "Arrange options"
+msgstr "Anordnungsoptionen"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4859 src/slic3r/GUI/KBShortcutsDialog.cpp:152
msgid "Arrange selection"
msgstr "Auswahl anordnen"
-#: src/libslic3r/PrintConfig.cpp:3443
+#: src/libslic3r/PrintConfig.cpp:3642
msgid "Arrange the supplied models in a plate and merge them in a single model in order to perform actions once."
msgstr "Die zur Verfügung stehenden Modelle in einer Platte anordnen und zu einem einzigen Modell zusammenführen, um Aktionen zusammen durchführen zu können."
-#: src/slic3r/GUI/Plater.cpp:2813
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:149
msgid "Arranging"
msgstr "Anordnen"
-#: src/slic3r/GUI/Plater.cpp:2841
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:182
msgid "Arranging canceled."
msgstr "Anordnen abgebrochen."
-#: src/slic3r/GUI/Plater.cpp:2842
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:183
msgid "Arranging done."
msgstr "Anordnung beendet."
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:159
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:206
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
msgid "Arrow Down"
msgstr "Pfeil runter"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:160
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:229
msgid "Arrow Left"
msgstr "Pfeil links"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:161
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:230
msgid "Arrow Right"
msgstr "Pfeil rechts"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:204
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:214
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:158
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
msgid "Arrow Up"
msgstr "Pfeil hoch"
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:290
+#: src/slic3r/GUI/GUI_App.cpp:246
+msgid "Artwork model by Nora Al-Badri and Jan Nikolai Nelles"
+msgstr "Artwork-Modell von Nora Al-Badri und Jan Nikolai Nelles"
+
+#: src/slic3r/GUI/OpenGLManager.cpp:265
msgid "As a workaround, you may run PrusaSlicer with a software rendered 3D graphics by running prusa-slicer.exe with the --sw_renderer parameter."
msgstr "Als Workaround können Sie PrusaSlicer mit einer software-gerenderten 3D-Grafik ausführen, indem Sie prusa-slicer.exe mit dem Parameter --sw_renderer ausführen."
-#: src/slic3r/GUI/GUI_App.cpp:1086 src/slic3r/GUI/Plater.cpp:2313
-#: src/slic3r/GUI/Tab.cpp:2960
+#: src/slic3r/GUI/Preferences.cpp:154
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:659
+msgid "Ask for unsaved changes when closing application"
+msgstr "Beim Schließen der Anwendung nach ungespeicherten Änderungen fragen"
+
+#: src/slic3r/GUI/Preferences.cpp:161
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:660
+msgid "Ask for unsaved changes when selecting new preset"
+msgstr "Nach nicht gespeicherten Änderungen fragen, wenn eine neue Voreinstellung ausgewählt wird"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1183 src/slic3r/GUI/Preferences.cpp:91
+msgid "Associate .3mf files to PrusaSlicer"
+msgstr ".3mf-Dateien mit PrusaSlicer verknüpfen"
+
+#: src/slic3r/GUI/Preferences.cpp:177
+msgid "Associate .gcode files to PrusaSlicer G-code Viewer"
+msgstr ".gcode-Dateien mit dem PrusaSlicer G-Code-Viewer verknüpfen"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1184 src/slic3r/GUI/Preferences.cpp:98
+msgid "Associate .stl files to PrusaSlicer"
+msgstr ".stl-Dateien mit PrusaSlicer verknüpfen"
+
+#: src/slic3r/GUI/GUI_App.cpp:1878 src/slic3r/GUI/Jobs/SLAImportJob.cpp:210
+#: src/slic3r/GUI/Plater.cpp:2256 src/slic3r/GUI/Tab.cpp:3189
msgid "Attention!"
msgstr "Achtung!"
-#: src/libslic3r/PrintConfig.cpp:1871
+#: src/libslic3r/PrintConfig.cpp:150
+msgid "Authorization Type"
+msgstr "Autorisierungs-Typ"
+
+#: src/libslic3r/PrintConfig.cpp:2013
msgid "Auto generated supports"
-msgstr "Stützstrukturen automatisch generieren"
+msgstr "Stützen automatisch generieren"
-#: src/slic3r/GUI/Preferences.cpp:47
+#: src/slic3r/GUI/Preferences.cpp:64
msgid "Auto-center parts"
msgstr "Teile automatisch zentrieren"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1377
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224
msgid "Auto-generate points"
msgstr "Punkte automatisch generieren"
-#: src/slic3r/GUI/Plater.cpp:1157
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:1066
+#, possible-c-format
msgid "Auto-repaired (%d errors)"
msgstr "Auto-Reparatur (%d Fehler)"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:339
-#, c-format
+#: src/slic3r/GUI/GUI_ObjectList.cpp:386
+#, possible-c-format
msgid "Auto-repaired (%d errors):"
msgstr "Auto-Reparatur (%d Fehler):"
@@ -838,65 +965,75 @@ msgstr "Auto-Reparatur (%d Fehler):"
msgid "Autodetected"
msgstr "Automatisch erkannt"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1134
msgid "Autogenerate support points"
msgstr "Stützpunkte automatisch generieren"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1127
msgid "Autogeneration will erase all manually edited points."
msgstr "Die automatische Generierung löscht alle manuell bearbeiteten Punkte."
-#: src/slic3r/GUI/Tab.cpp:3632
+#: src/slic3r/GUI/Tab.cpp:4051
msgid "Automatic generation"
msgstr "Automatische Erzeugung"
-#: src/slic3r/GUI/ConfigWizard.cpp:761
+#: src/slic3r/GUI/ConfigWizard.cpp:1120
msgid "Automatic updates"
msgstr "Automatische Updates"
-#: src/slic3r/GUI/MainFrame.cpp:536
+#: src/slic3r/GUI/MainFrame.cpp:1137
msgid "Automatically repair an STL file"
msgstr "Repariere automatisch die STL Datei"
-#: src/slic3r/GUI/Tab.cpp:1171
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:129
+msgid "Autoset by angle"
+msgstr "Automatisch setzen nach Winkel"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:233
+msgid "Autoset custom supports"
+msgstr "Automatische benutzerdefinierte Stützen"
+
+#: src/slic3r/GUI/Tab.cpp:1501
msgid "Autospeed (advanced)"
msgstr "Automatische Geschwindigkeit (fortgeschritten)"
-#: src/libslic3r/PrintConfig.cpp:136
+#: src/libslic3r/PrintConfig.cpp:169
msgid "Avoid crossing perimeters"
msgstr "Kreuzen der Kontur vermeiden"
-#: src/slic3r/GUI/Tab.cpp:3268
+#: src/libslic3r/PrintConfig.cpp:188
+msgid "Avoid crossing perimeters - Max detour length"
+msgstr "Kreuzen von Perimetern Vermeiden - Maximale Umleitungslänge"
+
+#: src/slic3r/GUI/Tab.cpp:3705
msgid "BACK ARROW"
msgstr "PFEIL ZURÃœCK"
-#: src/slic3r/GUI/Tab.cpp:3290
-msgid ""
-"BACK ARROW icon indicates that the settings were changed and are not equal to the last saved preset for the current option group.\n"
-"Click to reset all settings for the current option group to the last saved preset."
+#: src/slic3r/GUI/Tab.cpp:3727
+msgid "BACK ARROW icon indicates that the settings were changed and are not equal to the last saved preset for the current option group.\nClick to reset all settings for the current option group to the last saved preset."
msgstr "Das Symbol PFEIL ZURÜCK zeigt an, dass die Einstellungen geändert wurden und nicht mit dem zuletzt gespeicherten Preset für die aktuelle Optionsgruppe übereinstimmen. Klicken Sie hier, um alle Einstellungen für die aktuelle Optionsgruppe auf das zuletzt gespeicherte Preset zurückzusetzen."
-#: src/slic3r/GUI/Tab.cpp:3304
-msgid ""
-"BACK ARROW icon indicates that the value was changed and is not equal to the last saved preset.\n"
-"Click to reset current value to the last saved preset."
-msgstr ""
-"Das Symbol PFEIL ZURÜCK zeigt an, dass der Wert geändert wurde und nicht mit dem zuletzt gespeicherten Preset übereinstimmt. \n"
-"Klicken Sie, um den aktuellen Wert auf das zuletzt gespeicherte Preset zurückzusetzen."
+#: src/slic3r/GUI/Tab.cpp:3741
+msgid "BACK ARROW icon indicates that the value was changed and is not equal to the last saved preset.\nClick to reset current value to the last saved preset."
+msgstr "Das Symbol PFEIL ZURÜCK zeigt an, dass der Wert geändert wurde und nicht mit dem zuletzt gespeicherten Preset übereinstimmt. \nKlicken Sie, um den aktuellen Wert auf das zuletzt gespeicherte Preset zurückzusetzen."
-#: src/slic3r/GUI/Preferences.cpp:55
+#: src/slic3r/GUI/Preferences.cpp:72
msgid "Background processing"
msgstr "Hintergrundberechnung"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:351
+#: src/slic3r/GUI/GUI_ObjectList.cpp:398
msgid "backwards edges"
msgstr "umgekehrte Kanten"
-#: src/slic3r/GUI/MainFrame.cpp:174
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60
+msgid "Balanced"
+msgstr "Balanziert"
+
+#: src/slic3r/GUI/MainFrame.cpp:535 src/slic3r/GUI/MainFrame.cpp:537
msgid "based on Slic3r"
msgstr "basiert auf Slic3r"
-#: src/slic3r/GUI/Tab.cpp:1439
+#: src/slic3r/GUI/Tab.cpp:1785
msgid "Bed"
msgstr "Druckbett"
@@ -908,31 +1045,31 @@ msgstr "Druckbett individuelles Modell"
msgid "Bed custom texture"
msgstr "Druckbett individuelle Textur"
-#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:929
+#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1295
msgid "Bed Shape"
-msgstr "Druckbrettprofil"
+msgstr "Druckbettprofil"
#: src/libslic3r/PrintConfig.cpp:51
msgid "Bed shape"
msgstr "Druckbettkontur"
-#: src/slic3r/GUI/ConfigWizard.cpp:929
+#: src/slic3r/GUI/ConfigWizard.cpp:1295
msgid "Bed Shape and Size"
msgstr "Druckbettform und -größe"
-#: src/libslic3r/PrintConfig.cpp:147
+#: src/libslic3r/PrintConfig.cpp:181
msgid "Bed temperature"
msgstr "Druckbetttemperatur"
-#: src/libslic3r/PrintConfig.cpp:145
+#: src/libslic3r/PrintConfig.cpp:178
msgid "Bed temperature for layers after the first one. Set this to zero to disable bed temperature control commands in the output."
msgstr "Druckbetttemperatur für Schichten nach der ersten Schicht. Setzen Sie diesen Wert auf null, um die Befehle zur Steuerung der Betttemperatur im Output zu deaktivieren."
-#: src/slic3r/GUI/ConfigWizard.cpp:1051
+#: src/slic3r/GUI/ConfigWizard.cpp:1417
msgid "Bed Temperature:"
msgstr "Druckbetttemperatur:"
-#: src/slic3r/GUI/Tab.cpp:1988 src/libslic3r/PrintConfig.cpp:153
+#: src/slic3r/GUI/Tab.cpp:2175 src/libslic3r/PrintConfig.cpp:187
msgid "Before layer change G-code"
msgstr "G-Code vor dem Schichtwechsel"
@@ -940,143 +1077,183 @@ msgstr "G-Code vor dem Schichtwechsel"
msgid "Before roll back"
msgstr "Vor dem Zurückwechseln"
-#: src/slic3r/GUI/Plater.cpp:640
+#: src/slic3r/GUI/Plater.cpp:506
msgid "Below object"
msgstr "Unter dem Objekt"
-#: src/libslic3r/PrintConfig.cpp:1578
+#: src/libslic3r/PrintConfig.cpp:1686
msgid "Below Z"
msgstr "Unter Z"
-#: src/libslic3r/PrintConfig.cpp:164
+#: src/libslic3r/PrintConfig.cpp:198
msgid "Between objects G-code"
msgstr "G-Code zwischen Objekten"
-#: src/slic3r/GUI/Tab.cpp:2006
+#: src/slic3r/GUI/Tab.cpp:2196
msgid "Between objects G-code (for sequential printing)"
msgstr "G-Code zwischen Objekten (Sequentielles Drucken)"
-#: src/libslic3r/PrintConfig.cpp:2489 src/libslic3r/PrintConfig.cpp:2490
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242
+msgid "Block"
+msgstr "Blockieren"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:383
+msgid "Block seam"
+msgstr "Naht blockieren"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:373
+msgid "Block supports"
+msgstr "Stützen blockieren"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:292
+msgid "Block supports by angle"
+msgstr "Stützen nach Winkel blockieren"
+
+#: src/libslic3r/PrintConfig.cpp:2632 src/libslic3r/PrintConfig.cpp:2633
msgid "Bottle volume"
msgstr "Flaschenvolumen"
-#: src/libslic3r/PrintConfig.cpp:2496 src/libslic3r/PrintConfig.cpp:2497
+#: src/libslic3r/PrintConfig.cpp:2639 src/libslic3r/PrintConfig.cpp:2640
msgid "Bottle weight"
msgstr "Flaschengewicht"
#. TRN To be shown in the main menu View->Bottom
#. TRN To be shown in Print Settings "Bottom solid layers"
#. TRN To be shown in Print Settings "Top solid layers"
-#: src/slic3r/GUI/MainFrame.cpp:665 src/libslic3r/PrintConfig.cpp:174
-#: src/libslic3r/PrintConfig.cpp:183
+#: src/slic3r/GUI/MainFrame.cpp:962 src/slic3r/GUI/MainFrame.cpp:1282
+#: src/libslic3r/PrintConfig.cpp:208 src/libslic3r/PrintConfig.cpp:217
msgid "Bottom"
msgstr "Unten"
-#: src/libslic3r/PrintConfig.cpp:435
+#: src/libslic3r/PrintConfig.cpp:471
msgid "Bottom fill pattern"
msgstr "Bodenfüllmuster"
-#: src/slic3r/GUI/PresetHints.cpp:342
+#: src/slic3r/GUI/PresetHints.cpp:340
msgid "Bottom is open."
msgstr "Boden ist offen."
-#: src/slic3r/GUI/PresetHints.cpp:336
+#: src/slic3r/GUI/PresetHints.cpp:334
msgid "Bottom shell is %1% mm thick for layer height %2% mm."
msgstr "Die Bodenschale ist %1% mm stark für eine Schichthöhe von %2% mm."
-#: src/libslic3r/PrintConfig.cpp:177
+#: src/libslic3r/PrintConfig.cpp:211
msgid "Bottom solid layers"
msgstr "Massive Basisschichten"
-#: src/slic3r/GUI/MainFrame.cpp:665
+#: src/slic3r/GUI/MainFrame.cpp:962 src/slic3r/GUI/MainFrame.cpp:1282
msgid "Bottom View"
msgstr "Ansicht von unten"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1432
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1464
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1468
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1595
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1599
msgid "Box"
msgstr "Kubus"
-#: src/libslic3r/PrintConfig.cpp:193
+#: src/libslic3r/PrintConfig.cpp:227
msgid "Bridge"
msgstr "Überbrückung"
-#: src/libslic3r/PrintConfig.cpp:222
+#: src/libslic3r/PrintConfig.cpp:256
msgid "Bridge flow ratio"
msgstr "Brückenflussverhältnis"
-#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:316
+#: src/slic3r/GUI/GUI_Preview.cpp:308 src/libslic3r/ExtrusionEntity.cpp:321
+#: src/libslic3r/ExtrusionEntity.cpp:350
msgid "Bridge infill"
msgstr "Überbrückungs-Infill"
-#: src/libslic3r/PrintConfig.cpp:234
+#: src/libslic3r/PrintConfig.cpp:268
msgid "Bridges"
msgstr "Überbrückungen"
-#: src/libslic3r/PrintConfig.cpp:213
+#: src/libslic3r/PrintConfig.cpp:247
msgid "Bridges fan speed"
msgstr "Brückenlüftergeschwindigkeit"
-#: src/libslic3r/PrintConfig.cpp:202
+#: src/libslic3r/PrintConfig.cpp:236
msgid "Bridging angle"
msgstr "Überbrückungswinkel"
-#: src/libslic3r/PrintConfig.cpp:204
+#: src/libslic3r/PrintConfig.cpp:238
msgid "Bridging angle override. If left to zero, the bridging angle will be calculated automatically. Otherwise the provided angle will be used for all bridges. Use 180° for zero angle."
msgstr "Überbrückungswinkel Übersteuerung. Wird der Wert auf null gesetzt, wird der Überbrückungswinkel automatisch berechnet. Andernfalls wird der angegebene Winkel für alle Brücken verwendet. Verwenden Sie 180° für den Nullwinkel."
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:218
msgid "Bridging volumetric"
msgstr "Überbrückungvolumen"
-#: src/slic3r/GUI/Plater.cpp:534 src/slic3r/GUI/Tab.cpp:1117
+#: src/slic3r/GUI/Plater.cpp:400 src/slic3r/GUI/Tab.cpp:1446
msgid "Brim"
msgstr "Rand"
-#: src/libslic3r/PrintConfig.cpp:244
+#: src/libslic3r/PrintConfig.cpp:278
msgid "Brim width"
msgstr "Randbreite"
-#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1658
-#: src/slic3r/GUI/Tab.cpp:1721
+#: src/slic3r/GUI/FirmwareDialog.cpp:805
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:271
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327
msgid "Browse"
msgstr "Suchen"
-#: src/libslic3r/Zipper.cpp:82
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:28
+msgid "Brush shape"
+msgstr "Pinselform"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:27
+msgid "Brush size"
+msgstr "Pinselgröße"
+
+#: src/libslic3r/miniz_extension.cpp:141
msgid "buffer too small"
msgstr "Puffer zu klein"
+#: src/slic3r/GUI/GUI_App.cpp:1152
+msgid "But since this version of PrusaSlicer we don't show this information in Printer Settings anymore.\nSettings will be available in physical printers settings."
+msgstr "Seit dieser Version von PrusaSlicer zeigen wir diese Informationen nicht mehr in den Druckereinstellungen an.\nDie Einstellungen sind in den Einstellungen für physische Drucker verfügbar."
+
#: src/slic3r/GUI/ButtonsDescription.cpp:16
msgid "Buttons And Text Colors Description"
msgstr "Schaltflächen und Textfarben Beschreibung"
-#: src/slic3r/GUI/PresetHints.cpp:223
+#: src/slic3r/GUI/GUI_App.cpp:1084
+msgid "By default new Printer devices will be named as \"Printer N\" during its creation.\nNote: This name can be changed later from the physical printers settings"
+msgstr "Standardmäßig werden neue Drucker bei ihrer Erstellung als \"Drucker N\" bezeichnet.\nHinweis: Dieser Name kann später über die Einstellungen für physische Drucker geändert werden."
+
+#: src/slic3r/GUI/PresetHints.cpp:222
msgid "by the print profile maximum"
msgstr "mit dem Maximum des Druckerprofils"
-#: src/slic3r/GUI/Preferences.cpp:113
+#: src/slic3r/GUI/Preferences.cpp:178
msgid "Camera"
msgstr "Kamera"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:144
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:140
msgid "Camera view"
msgstr "Kameraansicht"
-#: src/slic3r/GUI/ConfigWizard.cpp:1982 src/slic3r/GUI/FirmwareDialog.cpp:151
+#: src/slic3r/GUI/ConfigWizard.cpp:2493 src/slic3r/GUI/FirmwareDialog.cpp:151
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:245
#: src/slic3r/GUI/ProgressStatusBar.cpp:26
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:644
msgid "Cancel"
msgstr "Abbrechen"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:157
+#: src/slic3r/GUI/PrintHostDialogs.cpp:155
msgid "Cancel selected"
msgstr "Abbruch ausgewählt"
-#: src/slic3r/GUI/Plater.cpp:3669 src/slic3r/GUI/PrintHostDialogs.cpp:233
+#: src/slic3r/GUI/Plater.cpp:3589 src/slic3r/GUI/PrintHostDialogs.cpp:233
msgid "Cancelled"
msgstr "Abgebrochen"
-#: src/slic3r/GUI/Plater.cpp:3153 src/slic3r/GUI/PrintHostDialogs.cpp:232
+#: src/slic3r/GUI/Plater.cpp:2953 src/slic3r/GUI/PrintHostDialogs.cpp:232
msgid "Cancelling"
msgstr "Abbrechen"
@@ -1088,106 +1265,100 @@ msgstr "Abbrechen..."
msgid "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible."
msgstr "Kann die Extrusionsbreite für %1% nicht berechnen: Variable \"%2%\" nicht zugänglich."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3017
-msgid ""
-"Cannot insert a new layer range after the current layer range.\n"
-"Current layer range overlaps with the next layer range."
-msgstr ""
-"Es kann kein neuer Schichtenbereich nach dem aktuellen Schichtenbereich eingefügt werden.\n"
-"Der aktuelle Schichtenbereich überschneidet sich mit dem nächsten Schichtenbereich."
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3400
+msgid "Cannot insert a new layer range after the current layer range.\nCurrent layer range overlaps with the next layer range."
+msgstr "Es kann kein neuer Schichtenbereich nach dem aktuellen Schichtenbereich eingefügt werden.\nDer aktuelle Schichtenbereich überschneidet sich mit dem nächsten Schichtenbereich."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3008
-msgid ""
-"Cannot insert a new layer range after the current layer range.\n"
-"The next layer range is too thin to be split to two\n"
-"without violating the minimum layer height."
-msgstr ""
-"Es kann kein neuer Schichtenbereich nach dem aktuellen Schichtenbereich eingefügt werden.\n"
-"Der nächste Schichtenbereich ist zu schmal, um auf zwei Schichten aufgeteilt zu werden ohne die Mindestschichthöhe zu verletzen."
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3391
+msgid "Cannot insert a new layer range after the current layer range.\nThe next layer range is too thin to be split to two\nwithout violating the minimum layer height."
+msgstr "Es kann kein neuer Schichtenbereich nach dem aktuellen Schichtenbereich eingefügt werden.\nDer nächste Schichtenbereich ist zu schmal, um auf zwei Schichten aufgeteilt zu werden ohne die Mindestschichthöhe zu verletzen."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3012
-msgid ""
-"Cannot insert a new layer range between the current and the next layer range.\n"
-"The gap between the current layer range and the next layer range\n"
-"is thinner than the minimum layer height allowed."
-msgstr ""
-"Es kann kein neuer Schichtenbereich zwischen dem aktuellen und dem nächsten Schichtenbereich eingefügt werden.\n"
-"Die Lücke zwischen dem aktuellen und dem nächsten Schichtenbereich ist ist schmaler als die minimal zulässige Schichthöhe."
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3395
+msgid "Cannot insert a new layer range between the current and the next layer range.\nThe gap between the current layer range and the next layer range\nis thinner than the minimum layer height allowed."
+msgstr "Es kann kein neuer Schichtenbereich zwischen dem aktuellen und dem nächsten Schichtenbereich eingefügt werden.\nDie Lücke zwischen dem aktuellen und dem nächsten Schichtenbereich ist ist schmaler als die minimal zulässige Schichthöhe."
-#: src/slic3r/GUI/Tab.cpp:3073
+#: src/slic3r/GUI/SavePresetDialog.cpp:137
msgid "Cannot overwrite a system profile."
msgstr "Systemprofil kann nicht überschrieben werden."
-#: src/slic3r/GUI/Tab.cpp:3077
+#: src/slic3r/GUI/SavePresetDialog.cpp:142
msgid "Cannot overwrite an external profile."
msgstr "Ein externes Profil kann nicht überschrieben werden."
-#: src/libslic3r/SLAPrint.cpp:613
+#: src/libslic3r/SLAPrint.cpp:627
msgid "Cannot proceed without support points! Add support points or disable support generation."
-msgstr "Ohne Stützpunkte kann nicht weitergearbeitet werden! Fügen Sie Stützpunkte hinzu oder deaktivieren Sie die Stützstruktur-Generierung."
+msgstr "Ohne Stützpunkte kann nicht weitergearbeitet werden! Fügen Sie Stützpunkte hinzu oder deaktivieren Sie die Stützen-Generierung."
-#: src/slic3r/GUI/Tab.cpp:1834
+#: src/slic3r/GUI/Tab.cpp:2068 src/slic3r/GUI/UnsavedChangesDialog.cpp:1066
msgid "Capabilities"
msgstr "Fähigkeiten"
-#: src/slic3r/GUI/GUI_App.cpp:801
+#: src/slic3r/GUI/GUI_App.cpp:1481
msgid "Capture a configuration snapshot"
msgstr "Erfassen einer Konfigurations-Momentaufnahme"
-#: src/libslic3r/PrintConfig.cpp:3424
+#: src/slic3r/GUI/ImGuiWrapper.cpp:801 src/slic3r/GUI/Search.cpp:458
+msgid "Category"
+msgstr "Kategorie"
+
+#: src/libslic3r/PrintConfig.cpp:3623
msgid "Center"
msgstr "Mitte"
-#: src/libslic3r/PrintConfig.cpp:3425
+#: src/libslic3r/PrintConfig.cpp:3624
msgid "Center the print around the given center."
msgstr "Zentriert den Druck um den angegebenen Mittelpunkt."
-#: src/slic3r/GUI/Tab.cpp:1728
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:329
msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*"
msgstr "Zertifikatsdatei (*.crt, *.pem)|*.crt;*.pem|alle Dateien|*.*"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:180
+#: src/slic3r/GUI/SavePresetDialog.cpp:313
+msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\""
+msgstr "\"%1%\" in \"%2%\" für den physischen Drucker \"%3%\" ändern."
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:174
msgid "Change camera type (perspective, orthographic)"
msgstr "Ändern des Kameratyps (perspektivisch, orthografisch)"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:885
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:693
msgid "Change drainage hole diameter"
msgstr "Durchmesser des Drainagelochs ändern"
-#: src/slic3r/GUI/DoubleSlider.cpp:1144 src/slic3r/GUI/GUI_ObjectList.cpp:1671
+#: src/slic3r/GUI/DoubleSlider.cpp:1273 src/slic3r/GUI/GUI_ObjectList.cpp:1800
msgid "Change extruder"
msgstr "Wechsel Extruder"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:536
+#: src/slic3r/GUI/GUI_ObjectList.cpp:574
msgid "Change Extruder"
msgstr "Wechsel Extruder"
-#: src/slic3r/GUI/DoubleSlider.cpp:1145
+#: src/slic3r/GUI/DoubleSlider.cpp:1274
msgid "Change extruder (N/A)"
msgstr "Extruder wechseln (nv)"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3997
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4484
msgid "Change Extruders"
msgstr "Wechsel Extruder"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:152
-#, c-format
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:157
+#, possible-c-format
msgid "Change Option %s"
msgstr "Ändere Option %s"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3558
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4021
msgid "Change Part Type"
msgstr "Teil Typ ändern"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:820
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:694
msgid "Change point head diameter"
msgstr "Ändern des Stützpunkt-Kopfdurchmessers"
-#: src/slic3r/GUI/Plater.cpp:3944
+#: src/slic3r/GUI/Plater.cpp:3862
msgid "Change the number of instances of the selected object"
msgstr "Anzahl der Kopien des gewählten Objektes ändern"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1589
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1718
msgid "Change type"
msgstr "Typ ändern"
@@ -1195,125 +1366,176 @@ msgstr "Typ ändern"
msgid "Changelog && Download"
msgstr "Changelog && Download"
-#: src/slic3r/GUI/GUI_App.cpp:442
+#: src/slic3r/GUI/GUI_App.cpp:1245
msgid "Changing of an application language"
msgstr "Wechsele die Anwendungssprache"
-#: src/slic3r/GUI/ConfigWizard.cpp:769 src/slic3r/GUI/Preferences.cpp:64
+#: src/slic3r/GUI/ConfigWizard.cpp:1128 src/slic3r/GUI/Preferences.cpp:81
msgid "Check for application updates"
msgstr "Nach Updates suchen"
-#: src/slic3r/GUI/GUI_App.cpp:802
+#: src/slic3r/GUI/GUI_App.cpp:1482
msgid "Check for configuration updates"
msgstr "Suche nach Konfigurationsaktualisierungen"
-#: src/slic3r/GUI/GUI_App.cpp:802
+#: src/slic3r/GUI/GUI_App.cpp:1482
msgid "Check for updates"
msgstr "Nach &Updates suchen"
-#: src/slic3r/GUI/BedShapeDialog.cpp:532
+#: src/slic3r/Utils/PresetUpdater.cpp:412
+#: src/slic3r/Utils/PresetUpdater.cpp:420
+msgid "checking install indices"
+msgstr "Überprüfung der Installationsindizes"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:608
msgid "Choose a file to import bed texture from (PNG/SVG):"
msgstr "Wählen Sie eine Datei aus, aus der Sie die Druckbetttextur importieren möchten (PNG/SVG):"
-#: src/slic3r/GUI/MainFrame.cpp:773
+#: src/slic3r/GUI/MainFrame.cpp:1474
msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):"
msgstr "Wählen Sie eine Datei zum Slicen (STL/OBJ/AMF/3MF/PRUSA):"
-#: src/slic3r/GUI/BedShapeDialog.cpp:555
+#: src/slic3r/GUI/BedShapeDialog.cpp:631
msgid "Choose an STL file to import bed model from:"
msgstr "Wählen Sie eine STL-Datei aus, aus der Sie das Druckbettmodell importieren möchten:"
-#: src/slic3r/GUI/BedShapeDialog.cpp:487
+#: src/slic3r/GUI/BedShapeDialog.cpp:563
msgid "Choose an STL file to import bed shape from:"
msgstr "Wählen Sie eine STL-Datei aus, aus der Sie die Druckbettform importieren möchten:"
-#: src/slic3r/GUI/GUI_App.cpp:555
+#: src/slic3r/GUI/GUI_App.cpp:1208
msgid "Choose one file (3MF/AMF):"
msgstr "Wählen Sie eine Datei (3MF/AMF):"
-#: src/slic3r/GUI/GUI_App.cpp:567
+#: src/slic3r/GUI/GUI_App.cpp:1233
+msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):"
+msgstr "Datei auswählen (GCODE/.GCO/.G/.ngc/NGC):"
+
+#: src/slic3r/GUI/GUI_App.cpp:1220
msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):"
msgstr "Wählen Sie eine oder mehrere Dateien (STL/OBJ/AMF/3MF/PRUSA):"
-#: src/slic3r/GUI/ConfigWizard.cpp:895
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:35
+msgid "Choose SLA archive:"
+msgstr "SLA Archiv wählen:"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1261
msgid "Choose the type of firmware used by your printer."
msgstr "Wählen Sie den Typ der von Ihrem Drucker verwendeten Firmware."
-#: src/slic3r/GUI/BedShapeDialog.cpp:89
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36
+msgid "Circle"
+msgstr "Kreis"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:142
msgid "Circular"
msgstr "Kreisförmig"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4624 src/slic3r/GUI/GLCanvas3D.cpp:4657
-msgid "Click right mouse button to open History"
-msgstr "Klicken Sie mit der rechten Maustaste, um den Verlauf zu öffnen"
+#: src/slic3r/GUI/GLCanvas3D.cpp:5028 src/slic3r/GUI/GLCanvas3D.cpp:5067
+msgid "Click right mouse button to open/close History"
+msgstr "Klicken Sie mit der rechten Maustaste, um die Historie zu öffnen/schließen"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4341
+msgid "Click right mouse button to show arrangement options"
+msgstr "Klicken Sie mit der rechten Maustaste, um Anordnungsoptionen anzuzeigen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:404
+#: src/slic3r/GUI/GUI_ObjectList.cpp:451
msgid "Click the icon to change the object printable property"
msgstr "Klicken Sie auf das Symbol, um die Druckbar-Eigenschaft des Objekts zu ändern"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:398
+#: src/slic3r/GUI/GUI_ObjectList.cpp:445
msgid "Click the icon to change the object settings"
msgstr "Klicken Sie auf das Symbol, um die Objekteinstellungen zu ändern"
-#: src/slic3r/GUI/Plater.cpp:343
+#: src/slic3r/GUI/PresetComboBoxes.cpp:566
msgid "Click to edit preset"
msgstr "Klicken zum Bearbeiten der Voreinstellung"
-#: src/libslic3r/PrintConfig.cpp:252
+#: src/slic3r/GUI/GCodeViewer.cpp:2071
+msgid "Click to hide"
+msgstr "Klicken zum Ausblenden"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2071
+msgid "Click to show"
+msgstr "Klicken zum Anzeigen"
+
+#: src/libslic3r/PrintConfig.cpp:286
msgid "Clip multi-part objects"
msgstr "Beschneiden von Objekten aus mehreren Teilen"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:25
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57
msgid "Clipping of view"
msgstr "Ausschnitt der Ansicht"
#: src/slic3r/GUI/FirmwareDialog.cpp:852
-#: src/slic3r/GUI/Mouse3DController.cpp:364
-#: src/slic3r/GUI/PrintHostDialogs.cpp:161
+#: src/slic3r/GUI/Mouse3DController.cpp:353
+#: src/slic3r/GUI/PrintHostDialogs.cpp:159
msgid "Close"
msgstr "Schließen"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45
-#: src/libslic3r/PrintConfig.cpp:2934
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44
+#: src/libslic3r/PrintConfig.cpp:3098
msgid "Closing distance"
msgstr "Schliessabstand"
-#: src/slic3r/GUI/Plater.cpp:1260 src/libslic3r/PrintConfig.cpp:582
+#: src/slic3r/GUI/MainFrame.cpp:1297 src/slic3r/GUI/Plater.cpp:2144
+msgid "Collapse sidebar"
+msgstr "Seitenleiste zuklappen"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:180
+msgid "Collapse/Expand the sidebar"
+msgstr "Seitenleiste zu-/ausklappen"
+
+#: src/slic3r/GUI/Plater.cpp:1198 src/libslic3r/PrintConfig.cpp:618
msgid "Color"
msgstr "Farbe"
-#: src/slic3r/GUI/DoubleSlider.cpp:1005
+#: src/slic3r/GUI/GCodeViewer.cpp:2410 src/slic3r/GUI/GCodeViewer.cpp:2438
+msgid "Color change"
+msgstr "Farbwechsel"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1130
msgid "Color change (\"%1%\")"
msgstr "Farbwechsel (\"%1%\")"
-#: src/slic3r/GUI/DoubleSlider.cpp:1006
+#: src/slic3r/GUI/DoubleSlider.cpp:1131
msgid "Color change (\"%1%\") for Extruder %2%"
msgstr "Farbwechsel (\"%1%\") für Extruder %2%"
-#: src/slic3r/GUI/GLCanvas3D.cpp:995
-#, c-format
-msgid "Color change for Extruder %d at %.2f mm"
-msgstr "Farbwechsel für Extruder %d bei %.2f mm"
+#: src/slic3r/GUI/Tab.cpp:2203
+msgid "Color Change G-code"
+msgstr "G-Code für Farbwechsel"
-#: src/slic3r/GUI/GUI_Preview.cpp:228 src/slic3r/GUI/GUI_Preview.cpp:572
-#: src/libslic3r/GCode/PreviewData.cpp:359
+#: src/libslic3r/PrintConfig.cpp:1960
+msgid "Color change G-code"
+msgstr "G-Code für Farbwechsel"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2531 src/slic3r/GUI/GUI_Preview.cpp:1475
+msgid "Color changes"
+msgstr "Farbwechsel"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2242 src/slic3r/GUI/GUI_Preview.cpp:282
+#: src/slic3r/GUI/GUI_Preview.cpp:784 src/libslic3r/GCode/PreviewData.cpp:364
msgid "Color Print"
msgstr "Color Print"
-#: src/libslic3r/PrintConfig.cpp:260
+#: src/libslic3r/PrintConfig.cpp:294
msgid "Colorprint height"
msgstr "Colorprint Höhe"
-#: src/libslic3r/PrintConfig.cpp:990
+#: src/libslic3r/PrintConfig.cpp:1034
msgid "Combine infill every"
msgstr "Infill kombinieren alle"
-#: src/libslic3r/PrintConfig.cpp:995
+#: src/libslic3r/PrintConfig.cpp:1039
msgid "Combine infill every n layers"
msgstr "Kombiniere das Infill all n Schichten"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:154
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:148
msgid "Commands"
msgstr "Befehle"
@@ -1321,23 +1543,23 @@ msgstr "Befehle"
msgid "Comment:"
msgstr "Kommentar:"
-#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:280
+#: src/slic3r/GUI/Tab.cpp:107 src/libslic3r/PrintConfig.cpp:314
msgid "Compatible print profiles"
msgstr "Kompatible Druckprofile"
-#: src/libslic3r/PrintConfig.cpp:286
+#: src/libslic3r/PrintConfig.cpp:320
msgid "Compatible print profiles condition"
msgstr "Kompatible Druckprofile Bedingung"
-#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:265
+#: src/slic3r/GUI/Tab.cpp:101 src/libslic3r/PrintConfig.cpp:299
msgid "Compatible printers"
msgstr "Kompatible Drucker"
-#: src/libslic3r/PrintConfig.cpp:271
+#: src/libslic3r/PrintConfig.cpp:305
msgid "Compatible printers condition"
msgstr "Kompatible Druckerbedingung"
-#: src/libslic3r/PrintConfig.cpp:304
+#: src/libslic3r/PrintConfig.cpp:338
msgid "Complete individual objects"
msgstr "Kompatible Einzelobjekte"
@@ -1345,27 +1567,27 @@ msgstr "Kompatible Einzelobjekte"
msgid "Completed"
msgstr "Fertig"
-#: src/libslic3r/Zipper.cpp:54
+#: src/libslic3r/miniz_extension.cpp:113
msgid "compression failed"
msgstr "Komprimierung fehlgeschlagen"
-#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:849
+#: src/libslic3r/PrintConfig.cpp:462 src/libslic3r/PrintConfig.cpp:887
msgid "Concentric"
msgstr "Konzentrisch"
-#: src/slic3r/GUI/ConfigWizard.cpp:2110
+#: src/slic3r/GUI/ConfigWizard.cpp:2625
msgid "Configuration &Assistant"
msgstr "Konfigurations &Assistent"
-#: src/slic3r/GUI/ConfigWizard.cpp:2113
+#: src/slic3r/GUI/ConfigWizard.cpp:2628
msgid "Configuration &Wizard"
msgstr "&Konfigurations-Assistent"
-#: src/slic3r/GUI/ConfigWizard.cpp:2109
+#: src/slic3r/GUI/ConfigWizard.cpp:2624
msgid "Configuration Assistant"
msgstr "Konfigurations-Assistent"
-#: src/libslic3r/PrintConfig.cpp:1316
+#: src/libslic3r/PrintConfig.cpp:1424
msgid "Configuration notes"
msgstr "Konfigurationsnotizen"
@@ -1381,11 +1603,15 @@ msgstr "Konfigurationsupdate"
msgid "Configuration update is available"
msgstr "Konfigurationsupdate ist verfügbar"
-#: src/slic3r/GUI/UpdateDialogs.cpp:303
+#: src/slic3r/GUI/NotificationManager.hpp:321
+msgid "Configuration update is available."
+msgstr "Konfigurationsupdate ist verfügbar."
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:304
msgid "Configuration updates"
msgstr "Konfigurationsupdates"
-#: src/slic3r/GUI/ConfigWizard.cpp:2112
+#: src/slic3r/GUI/ConfigWizard.cpp:2627
msgid "Configuration Wizard"
msgstr "Konfigurations-Assistent"
@@ -1393,15 +1619,19 @@ msgstr "Konfigurations-Assistent"
msgid "Confirmation"
msgstr "Bestätigung"
-#: src/slic3r/GUI/Tab.cpp:1931
-msgid "Connection failed."
-msgstr "Verbindung ist fehlgeschlagen."
+#: src/libslic3r/PrintConfig.cpp:1070
+msgid "Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. PrusaSlicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max. Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
+msgstr "Verbindet eine Infill-Linie mit einem kurzen Segment eines zusätzlichen Perimeters mit einem internen Perimeter. Wenn sie als Prozentsatz ausgedrückt wird (Beispiel: 15%), wird sie über die Breite der Infill-Extrusion berechnet. PrusaSlicer versucht, zwei nahe beieinander liegende Infill-Linien mit einem kurzen Umfangssegment zu verbinden. Wenn kein solches Perimetersegment gefunden wird, das kürzer als infill_anchor_max ist, wird die Infill-Linie nur an einer Seite mit einem Perimetersegment verbunden und die Länge des genommenen Perimetersegments ist auf diesen Parameter begrenzt, aber nicht länger als anchor_length_max. Setzen Sie diesen Parameter auf Null, um die Verankerung von Perimetern zu deaktivieren, die mit einer einzelnen Infill-Linie verbunden sind."
+
+#: src/libslic3r/PrintConfig.cpp:1097
+msgid "Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. PrusaSlicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter. Set this parameter to zero to disable anchoring."
+msgstr "Verbindet eine Infill-Linie mit einem kurzen Segment eines zusätzlichen Perimeters mit einem internen Perimeter. Wenn sie als Prozentsatz ausgedrückt wird (Beispiel: 15%), wird sie über die Breite der Infill-Extrusion berechnet. PrusaSlicer versucht, zwei nahe beieinander liegende Infill-Linien mit einem kurzen Umfangssegment zu verbinden. Wenn kein solches Perimetersegment gefunden wird, das kürzer als dieser Parameter ist, wird die Infill-Linie nur an einer Seite mit einem Perimetersegment verbunden und die Länge des genommenen Perimetersegments wird auf infill_anchor begrenzt, aber nicht länger als dieser Parameter. Setzen Sie diesen Parameter auf Null, um die Verankerung zu deaktivieren."
-#: src/slic3r/GUI/Tab.cpp:3627
+#: src/slic3r/GUI/Tab.cpp:4046
msgid "Connection of the support sticks and junctions"
msgstr "Verbindung von Stützstäben und Verbindungen"
-#: src/slic3r/Utils/AstroBox.cpp:83
+#: src/slic3r/Utils/AstroBox.cpp:84
msgid "Connection to AstroBox works correctly."
msgstr "Die Verbindung zur AstroBox funktioniert korrekt."
@@ -1417,124 +1647,148 @@ msgstr "Die Verbindung zu FlashAir funktioniert einwandfrei und der Upload ist a
msgid "Connection to OctoPrint works correctly."
msgstr "Verbindung zu OctoPrint funktioniert einwandfrei."
-#: src/slic3r/GUI/Tab.cpp:1928
-msgid "Connection to printer works correctly."
-msgstr "Verbindung zum Drucker funktioniert einwandfrei."
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:260
+msgid "Connection to printers connected via the print host failed."
+msgstr "Die Verbindung zu Druckern, die über den Druck-Host angeschlossen sind, ist fehlgeschlagen."
-#: src/slic3r/Utils/OctoPrint.cpp:176
+#: src/slic3r/Utils/OctoPrint.cpp:185
msgid "Connection to Prusa SL1 works correctly."
msgstr "Verbindung zum Prusa SL1 funktioniert einwandfrei."
-#: src/libslic3r/PrintConfig.cpp:1909
+#: src/libslic3r/PrintConfig.cpp:2051
msgid "Contact Z distance"
msgstr "Kontakt Z-Abstand"
-#: src/slic3r/GUI/AboutDialog.cpp:261
+#: src/slic3r/GUI/AboutDialog.cpp:286
msgid "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and numerous others."
msgstr "Beiträge von Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik und zahlreichen anderen."
-#: src/libslic3r/PrintConfig.cpp:2659
+#: src/slic3r/GUI/GUI_App.cpp:245
+msgid "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others."
+msgstr "Beiträge von Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas Meszaros, Lukas Matena, Vojtech Kral, David Kocik und zahlreichen anderen."
+
+#: src/libslic3r/PrintConfig.cpp:2823
msgid "Controls the bridge type between two neighboring pillars. Can be zig-zag, cross (double zig-zag) or dynamic which will automatically switch between the first two depending on the distance of the two pillars."
msgstr "Steuert den Brückentyp zwischen zwei benachbarten Säulen. Kann Zickzack, Kreuz (Doppelzickzack) oder dynamisch sein, das je nach Abstand der beiden Säulen automatisch zwischen den beiden erstgenannten umschaltet."
-#: src/slic3r/GUI/Tab.cpp:1444
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1858 src/slic3r/GUI/Plater.cpp:4886
+msgid "Convert from imperial units"
+msgstr "Von imperialen Einheiten umrechnen"
+
+#: src/slic3r/GUI/Tab.cpp:1790
msgid "Cooling"
msgstr "Kühlung"
-#: src/libslic3r/PrintConfig.cpp:660
+#: src/libslic3r/PrintConfig.cpp:696
msgid "Cooling moves are gradually accelerating beginning at this speed."
msgstr "Kühlbewegungen beschleunigen von dieser Anfangsgeschwindigkeit aus."
-#: src/libslic3r/PrintConfig.cpp:679
+#: src/libslic3r/PrintConfig.cpp:715
msgid "Cooling moves are gradually accelerating towards this speed."
msgstr "Kühlbewegungen beschleunigen auf diese Geschwindigkeit hin."
-#: src/slic3r/GUI/Tab.cpp:1465
+#: src/slic3r/GUI/Tab.cpp:1811
msgid "Cooling thresholds"
msgstr "Kühlungsschwellwerte"
-#: src/libslic3r/PrintConfig.cpp:327
+#: src/libslic3r/PrintConfig.cpp:361
msgid "Cooling tube length"
msgstr "Länge des Kühlschlauchs"
-#: src/libslic3r/PrintConfig.cpp:319
+#: src/libslic3r/PrintConfig.cpp:353
msgid "Cooling tube position"
msgstr "Position des Kühlschlauchs"
-#: src/slic3r/GUI/Plater.cpp:4752
+#: src/slic3r/GUI/Plater.cpp:4856
msgid "Copies of the selected object"
msgstr "Kopien des ausgewählten Objekts"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4505
+#: src/slic3r/GUI/GLCanvas3D.cpp:4871
msgid "Copy"
msgstr "Kopieren"
-#: src/slic3r/GUI/MainFrame.cpp:589
+#: src/slic3r/GUI/MainFrame.cpp:1195
msgid "Copy selection to clipboard"
msgstr "Auswahl in Zwischenablage kopieren"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:132
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:127
msgid "Copy to clipboard"
msgstr "Zu Zwischenablage kopieren"
-#: src/slic3r/GUI/SysInfoDialog.cpp:154
+#: src/slic3r/GUI/SysInfoDialog.cpp:177
msgid "Copy to Clipboard"
msgstr "Zu Zwischenablage kopieren"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:121
+#: src/slic3r/GUI/AboutDialog.cpp:304
+msgid "Copy Version Info"
+msgstr "Versionsinfo kopieren"
+
+#: src/slic3r/Utils/PresetUpdater.cpp:84
+msgid "Copying of file %1% to %2% failed.\nError message : %3%\nCopying was triggered by function: %4%"
+msgstr "Das Kopieren der Datei %1% nach %2% ist fehlgeschlagen.\nFehlermeldung : %3%\nKopieren wurde ausgelöst durch Funktion: %4%"
+
+#: src/slic3r/Utils/PresetUpdater.cpp:91
+msgid "Copying of file %1% to %2% failed. Permissions fail at target file after copying.\nError message : %3%\nCopying was triggered by function: %4%"
+msgstr "Kopieren der Datei %1% nach %2% fehlgeschlagen. Berechtigungsfehler der Zieldatei nach dem Kopieren.\nFehlermeldung : %3%\n Dieser Fehler wurde ausgelöst durch Funktion: %4%"
+
+#: src/slic3r/Utils/PresetUpdater.cpp:70
+msgid "Copying of file %1% to %2% failed. Permissions fail at target file before copying.\nError message : %3%\nThis error happend during %4% phase."
+msgstr "Kopieren der Datei %1% nach %2% fehlgeschlagen. Berechtigungsfehler der Zieldatei vor dem Kopieren.\nFehlermeldung : %3%\nDieser Fehler trat während der Phase %4% auf."
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:156
msgid "Copying of the temporary G-code has finished but the exported code couldn't be opened during copy check. The output G-code is at %1%.tmp."
msgstr "Das Kopieren des temporären G-Codes ist abgeschlossen, aber der exportierte Code konnte während der Kopierprüfung nicht geöffnet werden. Der Ausgabe-G-Code liegt in %1%.tmp."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:118
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:153
msgid "Copying of the temporary G-code has finished but the original code at %1% couldn't be opened during copy check. The output G-code is at %2%.tmp."
msgstr "Das Kopieren des temporären G-Codes ist abgeschlossen, aber der Originalcode aus %1% konnte während der Kopierprüfung nicht geöffnet werden. Der ausgegebene G-Code liegt in %2%.tmp."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:480
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:522
msgid "Copying of the temporary G-code to the output G-code failed"
msgstr "Das Kopieren des temporären G-Codes auf den Ausgabe-G-Code ist fehlgeschlagen"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:109
-msgid "Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?"
-msgstr "Das Kopieren des temporären G-Codes auf den Ausgabe-G-Code ist fehlgeschlagen. SD-Karte eventuell schreibgeschützt?"
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:163
+msgid "Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?\nError message: %1%"
+msgstr "Das Kopieren des temporären G-Codes auf den Ausgabe-G-Code ist fehlgeschlagen. Vielleicht ist die SD-Karte schreibgeschützt?\nFehlermeldung: %1%"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:112
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:147
msgid "Copying of the temporary G-code to the output G-code failed. There might be problem with target device, please try exporting again or using different device. The corrupted output G-code is at %1%.tmp."
msgstr "Das Kopieren des temporären G-Codes auf den Ausgabe-G-Code ist fehlgeschlagen. Es könnte ein Problem mit dem Zielgerät vorliegen, bitte versuchen Sie erneut zu exportieren oder ein anderes Gerät zu verwenden. Der beschädigte Ausgabe-G-Code liegt in %1%.tmp."
-#: src/slic3r/GUI/AboutDialog.cpp:127 src/slic3r/GUI/AboutDialog.cpp:256
+#: src/slic3r/GUI/AboutDialog.cpp:139 src/slic3r/GUI/AboutDialog.cpp:281
msgid "Copyright"
msgstr "Urheberrecht"
-#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2572
+#: src/libslic3r/PrintConfig.cpp:2714 src/libslic3r/PrintConfig.cpp:2715
msgid "Correction for expansion"
msgstr "Korrektur der Ausdehnung"
-#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:3519
+#: src/slic3r/GUI/Tab.cpp:2270 src/slic3r/GUI/Tab.cpp:3935
msgid "Corrections"
msgstr "Korrekturen"
-#: src/slic3r/GUI/Plater.cpp:1243 src/libslic3r/PrintConfig.cpp:760
-#: src/libslic3r/PrintConfig.cpp:2510 src/libslic3r/PrintConfig.cpp:2511
+#: src/slic3r/GUI/Plater.cpp:1158 src/libslic3r/PrintConfig.cpp:796
+#: src/libslic3r/PrintConfig.cpp:2653 src/libslic3r/PrintConfig.cpp:2654
msgid "Cost"
msgstr "Kosten"
-#: src/slic3r/GUI/Plater.cpp:239
+#: src/slic3r/GUI/Plater.cpp:245
msgid "Cost (money)"
msgstr "Kosten (Geld)"
-#: src/slic3r/GUI/Plater.cpp:2835
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:176
msgid "Could not arrange model objects! Some geometries may be invalid."
msgstr "Modellobjekte konnten nicht angeordnet werden! Einige Geometrien können ungültig sein."
-#: src/slic3r/Utils/AstroBox.cpp:89
+#: src/slic3r/Utils/AstroBox.cpp:90
msgid "Could not connect to AstroBox"
msgstr "Konnte keine Verbindung zur AstroBox herstellen"
-#: src/slic3r/Utils/Duet.cpp:54
+#: src/slic3r/Utils/Duet.cpp:55
msgid "Could not connect to Duet"
msgstr "Ich konnte keine Verbindung zum Duet herstellen"
-#: src/slic3r/Utils/FlashAir.cpp:73
+#: src/slic3r/Utils/FlashAir.cpp:74
msgid "Could not connect to FlashAir"
msgstr "Die Verbindung zu FlashAir konnte nicht hergestellt werden"
@@ -1542,56 +1796,73 @@ msgstr "Die Verbindung zu FlashAir konnte nicht hergestellt werden"
msgid "Could not connect to OctoPrint"
msgstr "Ich konnte keine Verbindung zu OctoPrint herstellen"
-#: src/slic3r/Utils/OctoPrint.cpp:181
+#: src/slic3r/Utils/OctoPrint.cpp:191
msgid "Could not connect to Prusa SLA"
msgstr "Ich konnte keine Verbindung zum Prusa SLA herstellen"
-#: src/slic3r/GUI/Tab.cpp:1687
+#: src/slic3r/Utils/Http.cpp:73
+msgid "Could not detect system SSL certificate store. PrusaSlicer will be unable to establish secure network connections."
+msgstr "Konnte den System-SSL-Zertifikatspeicher nicht erkennen. PrusaSlicer kann keine sicheren Netzwerkverbindungen herstellen."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:289
msgid "Could not get a valid Printer Host reference"
msgstr "Es konnte keine gültige Drucker-Host-Referenz ermittelt werden"
-#: src/slic3r/Utils/Duet.cpp:134
+#: src/slic3r/Utils/Duet.cpp:136
msgid "Could not get resources to create a new connection"
msgstr "Ressourcen zum Erstellen einer neuen Verbindung konnten nicht bezogen werden"
-#: src/libslic3r/PrintConfig.cpp:1959
+#: src/libslic3r/PrintConfig.cpp:2101
msgid "Cover the top contact layer of the supports with loops. Disabled by default."
-msgstr "Deckt die obere Kontaktschicht der Stützstrukturen mit Schleifen ab. Standardmäßig deaktiviert."
+msgstr "Deckt die obere Kontaktschicht der Stützen mit Schleifen ab. Standardmäßig deaktiviert."
-#: src/libslic3r/PrintConfig.cpp:89
+#: src/libslic3r/PrintConfig.cpp:91
msgid "Cracks smaller than 2x gap closing radius are being filled during the triangle mesh slicing. The gap closing operation may reduce the final print resolution, therefore it is advisable to keep the value reasonably low."
msgstr "Spalte, die kleiner als der doppelte Lückenschlussradius sind, werden während des Slicens des Dreiecksnetzes gefüllt. Der Lückenschluss kann die endgültige Druckauflösung verringern, daher ist es ratsam, den Wert relativ niedrig zu halten."
-#: src/libslic3r/Zipper.cpp:58
+#: src/libslic3r/miniz_extension.cpp:117
msgid "CRC-32 check failed"
msgstr "CRC-32 Check fehlgeschlagen"
-#: src/libslic3r/PrintConfig.cpp:2857
+#: src/libslic3r/PrintConfig.cpp:3021
msgid "Create pad around object and ignore the support elevation"
msgstr "Erstellt eine Grundschicht um das Objekt herum und ignoriert die Unterstützungshöhe"
-#: src/libslic3r/PrintConfig.cpp:2724
+#: src/libslic3r/PrintConfig.cpp:2888
msgid "Critical angle"
msgstr "Kritischer Winkel"
-#: src/libslic3r/PrintConfig.cpp:2668
+#: src/slic3r/GUI/GUI_App.cpp:589
+msgid "Critical error"
+msgstr "Kritischer Fehler"
+
+#: src/libslic3r/PrintConfig.cpp:2832
msgid "Cross"
msgstr "Kreuz"
-#: src/libslic3r/PrintConfig.cpp:847
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:203
+msgid "Ctrl + Mouse wheel"
+msgstr "Strg + Mausrad"
+
+#: src/libslic3r/PrintConfig.cpp:885
msgid "Cubic"
msgstr "Kubisch"
-#: src/slic3r/GUI/wxExtensions.cpp:704
-#, c-format
+#: src/slic3r/Utils/Http.cpp:91
+msgid "CURL init has failed. PrusaSlicer will be unable to establish network connections. See logs for additional details."
+msgstr "CURL Init ist fehlgeschlagen. PrusaSlicer ist nicht in der Lage, Netzwerkverbindungen herzustellen. Siehe Protokolle für weitere Details."
+
+#: src/slic3r/GUI/wxExtensions.cpp:624
+#, possible-c-format
msgid "Current mode is %s"
msgstr "Aktueller Modus ist %s"
-#: src/slic3r/GUI/Tab.cpp:959
+#: src/slic3r/GUI/Tab.cpp:1278
msgid "Current preset is inherited from"
msgstr "Aktuelle Voreinstellung ist abgeleitet von"
-#: src/slic3r/GUI/Tab.cpp:957
+#: src/slic3r/GUI/Tab.cpp:1276
msgid "Current preset is inherited from the default preset."
msgstr "Aktuelle Voreinstellung ist abgeleitet von der Standardvoreinstellung."
@@ -1599,486 +1870,521 @@ msgstr "Aktuelle Voreinstellung ist abgeleitet von der Standardvoreinstellung."
msgid "Current version:"
msgstr "Aktuelle Version:"
-#: src/slic3r/GUI/BedShapeDialog.cpp:98 src/slic3r/GUI/GUI_Preview.cpp:249
-#: src/libslic3r/ExtrusionEntity.cpp:322
+#: src/slic3r/GUI/BedShapeDialog.cpp:143 src/slic3r/GUI/GUI_Preview.cpp:314
+#: src/libslic3r/ExtrusionEntity.cpp:327 src/libslic3r/ExtrusionEntity.cpp:362
msgid "Custom"
msgstr "Benutzerdefiniert"
-#: src/libslic3r/PrintConfig.cpp:112
+#: src/libslic3r/PrintConfig.cpp:114
msgid "Custom CA certificate file can be specified for HTTPS OctoPrint connections, in crt/pem format. If left blank, the default OS CA certificate repository is used."
msgstr "Benutzerdefinierte CA-Zertifikatsdatei kann für HTTPS OctoPrint-Verbindungen im crt/pem-Format angegeben werden. Wenn das Feld leer bleibt, wird das standardmäßige Zertifikatsverzeichnis der Betriebssystem-Zertifizierungsstelle verwendet."
-#: src/slic3r/GUI/Tab.cpp:1527 src/slic3r/GUI/Tab.cpp:1975
+#: src/slic3r/GUI/Tab.cpp:1872 src/slic3r/GUI/Tab.cpp:2160
+#: src/libslic3r/PrintConfig.cpp:1978
msgid "Custom G-code"
msgstr "Benutzerdefinierter G-Code"
-#: src/slic3r/GUI/DoubleSlider.cpp:1619
+#: src/slic3r/GUI/DoubleSlider.cpp:1815
msgid "Custom G-code on current layer (%1% mm)."
msgstr "Benutzerdefinierter G-Code auf der aktuellen Ebene (%1% mm)."
-#: src/slic3r/GUI/ConfigWizard.cpp:732
+#: src/slic3r/GUI/GCodeViewer.cpp:2580 src/slic3r/GUI/GUI_Preview.cpp:1477
+msgid "Custom G-codes"
+msgstr "Benutzerdefinierte G-Codes"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1091
msgid "Custom Printer"
msgstr "Benutzerdefinierter Drucker"
-#: src/slic3r/GUI/ConfigWizard.cpp:732
+#: src/slic3r/GUI/ConfigWizard.cpp:1091
msgid "Custom Printer Setup"
msgstr "Benutzerdefinierte Drucker-Einrichtung"
-#: src/slic3r/GUI/ConfigWizard.cpp:736
+#: src/slic3r/GUI/ConfigWizard.cpp:1095
msgid "Custom profile name:"
msgstr "Benutzerdefinierter Profilname:"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:42
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3402
+#: src/slic3r/GUI/Plater.cpp:3397
+msgid "Custom supports and seams were removed after repairing the mesh."
+msgstr "Benutzerdefinierte Stützen und Nähte wurden nach der Reparatur des Netzes entfernt."
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1135
+msgid "Custom template (\"%1%\")"
+msgstr "Benutzerdefinierte Vorlage (\"%1%\")"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:146 src/libslic3r/PrintConfig.cpp:3601
msgid "Cut"
msgstr "Schneiden"
-#: src/slic3r/GUI/Plater.cpp:4786
+#: src/slic3r/GUI/Plater.cpp:4921
msgid "Cut by Plane"
msgstr "Schneiden durch Ebene"
-#: src/libslic3r/PrintConfig.cpp:3403
+#: src/libslic3r/PrintConfig.cpp:3602
msgid "Cut model at the given Z."
msgstr "Schneidet Modell am gegebenen Z-Wert."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1432
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
msgid "Cylinder"
msgstr "Zylinder"
-#: src/slic3r/GUI/MainFrame.cpp:568
+#: src/slic3r/GUI/MainFrame.cpp:1174
msgid "D&eselect all"
msgstr "All&es Abwählen"
-#: src/libslic3r/PrintConfig.cpp:3504
+#: src/libslic3r/PrintConfig.cpp:3709
msgid "Data directory"
msgstr "Datenverzeichnis"
-#: src/slic3r/GUI/Mouse3DController.cpp:313
+#: src/slic3r/GUI/Mouse3DController.cpp:300
msgid "Deadzone:"
msgstr "Todeszone:"
-#: src/libslic3r/Zipper.cpp:52
+#: src/libslic3r/miniz_extension.cpp:111
msgid "decompression failed or archive is corrupted"
msgstr "Entpacken fehlgeschlagen oder Archiv defekt"
-#: src/slic3r/GUI/Plater.cpp:4720
+#: src/slic3r/GUI/Plater.cpp:4824
msgid "Decrease Instances"
msgstr "Kopien verringern"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1704 src/libslic3r/PrintConfig.cpp:335
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1832 src/libslic3r/PrintConfig.cpp:369
msgid "Default"
msgstr "Standard"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:457 src/slic3r/GUI/GUI_ObjectList.cpp:469
-#: src/slic3r/GUI/GUI_ObjectList.cpp:917 src/slic3r/GUI/GUI_ObjectList.cpp:3967
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3977
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4012
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:200
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:257
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:282
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:490
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:1753
+#: src/slic3r/GUI/ExtraRenderers.cpp:297 src/slic3r/GUI/GUI_ObjectList.cpp:496
+#: src/slic3r/GUI/GUI_ObjectList.cpp:508 src/slic3r/GUI/GUI_ObjectList.cpp:1015
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4454
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4464
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4499
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:202
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:259
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:284
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:492
msgid "default"
msgstr "Standard"
-#: src/libslic3r/PrintConfig.cpp:777
+#: src/libslic3r/PrintConfig.cpp:813
msgid "Default base angle for infill orientation. Cross-hatching will be applied to this. Bridges will be infilled using the best direction Slic3r can detect, so this setting does not affect them."
msgstr "Standard-Grundwinkel für die Ausrichtung der Füllung. Hierfür werden Kreuzschraffuren verwendet. Brücken werden mit der besten Richtung gefüllt, die Slic3r erkennen kann, so dass diese Einstellung sie nicht beeinflusst."
-#: src/libslic3r/PrintConfig.cpp:554
+#: src/slic3r/GUI/GCodeViewer.cpp:2289
+msgid "Default color"
+msgstr "Standardfarbe"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2313
+msgid "default color"
+msgstr "Standardfarbe"
+
+#: src/libslic3r/PrintConfig.cpp:590
msgid "Default extrusion width"
msgstr "Standardextrusionsbreite"
-#: src/slic3r/GUI/Tab.cpp:987
+#: src/slic3r/GUI/Tab.cpp:1305
msgid "default filament profile"
msgstr "Standard-Filamentprofil"
-#: src/libslic3r/PrintConfig.cpp:345
+#: src/libslic3r/PrintConfig.cpp:379
msgid "Default filament profile"
msgstr "Standard-Filamentprofil"
-#: src/libslic3r/PrintConfig.cpp:346
+#: src/libslic3r/PrintConfig.cpp:380
msgid "Default filament profile associated with the current printer profile. On selection of the current printer profile, this filament profile will be activated."
msgstr "Standard-Filamentprofil, das dem aktuellen Druckerprofil zugeordnet ist. Bei Auswahl des aktuellen Druckerprofils wird dieses Filamentprofil aktiviert."
-#: src/slic3r/GUI/Tab.cpp:2919
-#, c-format
-msgid "Default preset (%s)"
-msgstr "Standard Voreinstellung(%s)"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:904 src/slic3r/GUI/GLCanvas3D.cpp:933
-msgid "Default print color"
-msgstr "Standard Druckfarbe"
-
-#: src/slic3r/GUI/Tab.cpp:984
+#: src/slic3r/GUI/Tab.cpp:1302
msgid "default print profile"
msgstr "Standard-Druckprofil"
-#: src/libslic3r/PrintConfig.cpp:352
+#: src/libslic3r/PrintConfig.cpp:386
msgid "Default print profile"
msgstr "Standard-Druckprofil"
-#: src/libslic3r/PrintConfig.cpp:353 src/libslic3r/PrintConfig.cpp:2592
-#: src/libslic3r/PrintConfig.cpp:2603
+#: src/libslic3r/PrintConfig.cpp:387 src/libslic3r/PrintConfig.cpp:2735
+#: src/libslic3r/PrintConfig.cpp:2746
msgid "Default print profile associated with the current printer profile. On selection of the current printer profile, this print profile will be activated."
msgstr "Standarddruckprofil, das dem aktuellen Druckerprofil zugeordnet ist. Bei Auswahl des aktuellen Druckerprofils wird dieses Druckprofil aktiviert."
-#: src/slic3r/GUI/Tab.cpp:1001
+#: src/slic3r/GUI/Tab.cpp:1319
msgid "default SLA material profile"
msgstr "Standard-SLA-Materialprofil"
-#: src/libslic3r/PrintConfig.cpp:2591 src/libslic3r/PrintConfig.cpp:2602
+#: src/libslic3r/PrintConfig.cpp:2734 src/libslic3r/PrintConfig.cpp:2745
msgid "Default SLA material profile"
msgstr "Standard-SLA-Materialprofil"
-#: src/slic3r/GUI/Tab.cpp:1005
+#: src/slic3r/GUI/Tab.cpp:1323
msgid "default SLA print profile"
msgstr "Standard-SLA-Druckprofil"
-#: src/slic3r/GUI/Field.cpp:136
+#: src/slic3r/GUI/Field.cpp:184
msgid "default value"
msgstr "Standardwert"
-#: src/slic3r/GUI/ConfigWizard.cpp:734
+#: src/slic3r/GUI/ConfigWizard.cpp:1093
msgid "Define a custom printer profile"
msgstr "Benutzerdefiniertes Druckerprofil definieren"
-#: src/libslic3r/PrintConfig.cpp:2798
+#: src/libslic3r/PrintConfig.cpp:2962
msgid "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful when enabling this feature, as some resins may produce an extreme suction effect inside the cavity, which makes peeling the print off the vat foil difficult."
msgstr "Definiert die Tiefe des Grundschichthohlraums. Zum Deaktivieren der Aushöhlung auf null setzen. Seien Sie vorsichtig, wenn Sie diese Funktion aktivieren, da einige Harze einen extremen Saugeffekt im Hohlraum erzeugen können, der das Abziehen des Drucks von der Wannenfolie erschwert."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:346
+#: src/slic3r/GUI/GUI_ObjectList.cpp:393
msgid "degenerate facets"
msgstr "entartete Facetten"
-#: src/libslic3r/PrintConfig.cpp:640
+#: src/libslic3r/PrintConfig.cpp:676
msgid "Delay after unloading"
msgstr "Verzögerung nach dem Entladen"
-#: src/slic3r/GUI/Tab.cpp:3121
+#: src/slic3r/GUI/Tab.cpp:3386
msgid "delete"
msgstr "löschen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4475 src/slic3r/GUI/GUI_ObjectList.cpp:1718
-#: src/slic3r/GUI/Plater.cpp:3931 src/slic3r/GUI/Plater.cpp:3953
-#: src/slic3r/GUI/Tab.cpp:3124
+#: src/slic3r/GUI/GLCanvas3D.cpp:4841 src/slic3r/GUI/GUI_ObjectList.cpp:1846
+#: src/slic3r/GUI/Plater.cpp:3849 src/slic3r/GUI/Plater.cpp:3871
+#: src/slic3r/GUI/Tab.cpp:3423
msgid "Delete"
msgstr "Löschen"
-#: src/slic3r/GUI/MainFrame.cpp:575
+#: src/slic3r/GUI/MainFrame.cpp:1181
msgid "Delete &all"
msgstr "&Alles löschen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4484 src/slic3r/GUI/KBShortcutsDialog.cpp:129
-#: src/slic3r/GUI/Plater.cpp:4669
+#: src/slic3r/GUI/GLCanvas3D.cpp:4850 src/slic3r/GUI/KBShortcutsDialog.cpp:124
+#: src/slic3r/GUI/Plater.cpp:4774
msgid "Delete all"
msgstr "Alle löschen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2176
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2341
msgid "Delete All Instances from Object"
msgstr "Alle Kopien des Objektes löschen"
-#: src/slic3r/GUI/DoubleSlider.cpp:1516
+#: src/slic3r/GUI/DoubleSlider.cpp:1708
msgid "Delete color change"
msgstr "Farbwechsel löschen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:220
msgid "Delete color change marker for current layer"
msgstr "Löscht einen Farbwechselmarker der aktuellen Schicht"
-#: src/slic3r/GUI/DoubleSlider.cpp:1519
+#: src/slic3r/GUI/DoubleSlider.cpp:1711
msgid "Delete custom G-code"
msgstr "Benutzerdefinierten G-Code löschen"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:539
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:424
msgid "Delete drainage hole"
msgstr "Drainageloch entfernen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2192
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2357
msgid "Delete Height Range"
msgstr "Höhenbereich löschen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2246
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2412
msgid "Delete Instance"
msgstr "Kopie löschen"
-#: src/slic3r/GUI/Plater.cpp:2712
+#: src/slic3r/GUI/Plater.cpp:2673
msgid "Delete Object"
msgstr "Objekt löschen"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:101
-#, c-format
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:104
+#, possible-c-format
msgid "Delete Option %s"
msgstr "Lösche Option %s"
-#: src/slic3r/GUI/DoubleSlider.cpp:1518
+#: src/slic3r/GUI/DoubleSlider.cpp:1710
msgid "Delete pause print"
msgstr "Druckpause löschen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:128
+#: src/slic3r/GUI/PresetComboBoxes.cpp:652
+msgid "Delete physical printer"
+msgstr "Physischen Drucker löschen"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:659
+msgid "Delete Physical Printer"
+msgstr "Physischen Drucker löschen"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:123
msgid "Delete selected"
msgstr "Löschen ausgewählt"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2830
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3221
msgid "Delete Selected"
msgstr "Löschen ausgewählt"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2693
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3083
msgid "Delete Selected Item"
msgstr "Gewähltes Element löschen"
-#: src/slic3r/GUI/Plater.cpp:4677
+#: src/slic3r/GUI/Plater.cpp:4782
msgid "Delete Selected Objects"
msgstr "Ausgewählte Objekte entfernen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2152
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2319
msgid "Delete Settings"
msgstr "Einstellungen löschen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2227
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2393
msgid "Delete Subobject"
msgstr "Subobjekt löschen"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:631
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:514
msgid "Delete support point"
msgstr "Stützpunkt löschen"
-#: src/slic3r/GUI/Tab.cpp:134
+#: src/slic3r/GUI/Tab.cpp:204
msgid "Delete this preset"
msgstr "Lösche diese Voreinstellung"
-#: src/slic3r/GUI/DoubleSlider.cpp:1035
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:55
+msgid "Delete this preset from this printer device"
+msgstr "Voreinstellung dieses Druckers löschen"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1160
msgid "Delete tick mark - Left click or press \"-\" key"
msgstr "Häkchen löschen - Linksklick oder Taste \"-\" drücken"
-#: src/slic3r/GUI/DoubleSlider.cpp:1517
+#: src/slic3r/GUI/DoubleSlider.cpp:1709
msgid "Delete tool change"
msgstr "Werkzeugwechsel löschen"
-#: src/slic3r/GUI/MainFrame.cpp:576
+#: src/slic3r/GUI/MainFrame.cpp:1182
msgid "Deletes all objects"
msgstr "Löscht alle Objekte"
-#: src/slic3r/GUI/MainFrame.cpp:573
+#: src/slic3r/GUI/MainFrame.cpp:1179
msgid "Deletes the current selection"
msgstr "Löscht die aktuelle Auswahl"
-#: src/libslic3r/PrintConfig.cpp:717 src/libslic3r/PrintConfig.cpp:2503
-#: src/libslic3r/PrintConfig.cpp:2504
+#: src/libslic3r/PrintConfig.cpp:753 src/libslic3r/PrintConfig.cpp:2646
+#: src/libslic3r/PrintConfig.cpp:2647
msgid "Density"
msgstr "Dichte"
-#: src/libslic3r/PrintConfig.cpp:791
+#: src/libslic3r/PrintConfig.cpp:827
msgid "Density of internal infill, expressed in the range 0% - 100%."
msgstr "Infilldichte. Als Prozentwert von 0% - 100% ausgedrückt."
-#: src/slic3r/GUI/Tab.cpp:1258 src/slic3r/GUI/Tab.cpp:1548
-#: src/slic3r/GUI/Tab.cpp:2019 src/slic3r/GUI/Tab.cpp:2135
-#: src/slic3r/GUI/Tab.cpp:3543 src/slic3r/GUI/Tab.cpp:3671
+#: src/slic3r/GUI/Tab.cpp:1588 src/slic3r/GUI/Tab.cpp:1895
+#: src/slic3r/GUI/Tab.cpp:2228 src/slic3r/GUI/Tab.cpp:2304
+#: src/slic3r/GUI/Tab.cpp:3959 src/slic3r/GUI/Tab.cpp:4090
msgid "Dependencies"
msgstr "Abhängigkeiten"
-#: src/libslic3r/PrintConfig.cpp:1612 src/libslic3r/PrintConfig.cpp:1613
+#: src/libslic3r/PrintConfig.cpp:1720 src/libslic3r/PrintConfig.cpp:1721
msgid "Deretraction Speed"
msgstr "Wiedereinzugsgeschwindigkeit"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:127
+#: src/slic3r/GUI/GCodeViewer.cpp:2529 src/slic3r/GUI/GUI_Preview.cpp:337
+#: src/slic3r/GUI/GUI_Preview.cpp:1473
+msgid "Deretractions"
+msgstr "Wiedereinzüge"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:172
+msgid "Descriptive name for the printer"
+msgstr "Beschreibender Name des Druckers"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:122
msgid "Deselect all"
msgstr "Alles abwählen"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1369
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216
msgid "Deselect by rectangle"
msgstr "Abwahl über Rechteck"
-#: src/slic3r/GUI/MainFrame.cpp:569
+#: src/slic3r/GUI/MainFrame.cpp:1175
msgid "Deselects all objects"
msgstr "Alle Objekte abwählen"
-#: src/slic3r/GUI/Tab.cpp:963
+#: src/slic3r/GUI/Tab.cpp:1224
msgid "Detach from system preset"
msgstr "Lösen von der Systemvoreinstellung"
-#: src/slic3r/GUI/Tab.cpp:984
+#: src/slic3r/GUI/Tab.cpp:1246
msgid "Detach preset"
msgstr "Lösen der Voreinstellugen"
-#: src/slic3r/GUI/Tab.cpp:3029
+#: src/slic3r/GUI/Tab.cpp:3323
msgid "Detached"
msgstr "Losgelöst"
-#: src/libslic3r/PrintConfig.cpp:1373
+#: src/libslic3r/PrintConfig.cpp:1481
msgid "Detect bridging perimeters"
msgstr "Umfangbrücken entdecken"
-#: src/libslic3r/PrintConfig.cpp:2075
+#: src/libslic3r/PrintConfig.cpp:2218
msgid "Detect single-width walls (parts where two extrusions don't fit and we need to collapse them into a single trace)."
msgstr "Erkennen von Wänden mit einfacher Breite (Teile, bei denen zwei Extrusionen nicht passen und wir sie in eine einzige Druckspur zusammenfassen müssen)."
-#: src/libslic3r/PrintConfig.cpp:2073
+#: src/libslic3r/PrintConfig.cpp:2216
msgid "Detect thin walls"
msgstr "Dünne Wände erkennen"
-#: src/libslic3r/PrintConfig.cpp:3472
+#: src/libslic3r/PrintConfig.cpp:3671
msgid "Detect unconnected parts in the given model(s) and split them into separate objects."
msgstr "Erkennung nicht zusammenhängender Teile in den angegebenen Modellen und Aufteilung in einzelne Objekte."
-#: src/slic3r/GUI/Plater.cpp:2368
+#: src/slic3r/GUI/Plater.cpp:2330
msgid "Detected advanced data"
msgstr "Erweiterte Daten gefunden"
-#: src/slic3r/GUI/Mouse3DController.cpp:289
+#: src/slic3r/GUI/Mouse3DController.cpp:274
msgid "Device:"
msgstr "Gerät:"
-#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/libslic3r/PrintConfig.cpp:709
+#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:745
msgid "Diameter"
msgstr "Durchmesser"
-#: src/libslic3r/PrintConfig.cpp:2694
+#: src/libslic3r/PrintConfig.cpp:2858
msgid "Diameter in mm of the pillar base"
msgstr "Durchmesser der Pfeilerbasis in mm"
-#: src/libslic3r/PrintConfig.cpp:2650
+#: src/libslic3r/PrintConfig.cpp:2793
msgid "Diameter in mm of the support pillars"
msgstr "Durchmesser der Stützpfeiler in mm"
-#: src/libslic3r/PrintConfig.cpp:2622
+#: src/libslic3r/PrintConfig.cpp:2765
msgid "Diameter of the pointing side of the head"
msgstr "Durchmesser der Spitzenseite des Kopfes"
-#: src/slic3r/GUI/BedShapeDialog.cpp:94
+#: src/slic3r/GUI/BedShapeDialog.cpp:131
msgid "Diameter of the print bed. It is assumed that origin (0,0) is located in the center."
msgstr "Durchmesser des Druckbettes. Es wird angenommen, dass der Ursprung (0,0) sich im Mittelpunkt befindet."
-#: src/libslic3r/PrintConfig.cpp:1639
+#: src/libslic3r/PrintConfig.cpp:1747
msgid "Direction"
msgstr "Richtung"
-#: src/libslic3r/PrintConfig.cpp:359
+#: src/libslic3r/PrintConfig.cpp:393
msgid "Disable fan for the first"
msgstr "Kein Lüfter für die ersten"
-#: src/libslic3r/PrintConfig.cpp:1349
+#: src/libslic3r/PrintConfig.cpp:1457
msgid "Disables retraction when the travel path does not exceed the upper layer's perimeters (and thus any ooze will be probably invisible)."
msgstr "Deaktiviert den Einzug, wenn der Verfahrweg die Perimeter der oberen Schicht nicht überschreitet (und somit ist der Auslauf wahrscheinlich unsichtbar)."
-#: src/slic3r/GUI/DoubleSlider.cpp:952
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:641
+msgid "Discard"
+msgstr "Verwerfen"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1066
msgid "Discard all custom changes"
msgstr "Alle benutzerdefinierten Änderungen verwerfen"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1375
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222
msgid "Discard changes"
msgstr "Änderungen verwerfen"
-#: src/slic3r/GUI/GUI_App.cpp:932 src/slic3r/GUI/Tab.cpp:2946
-msgid "Discard changes and continue anyway?"
-msgstr "Änderungen verwerfen und fortfahren?"
-
-#: src/slic3r/GUI/Tab.cpp:2078
+#: src/slic3r/GUI/Tab.cpp:2248
msgid "Display"
msgstr "Display"
-#: src/libslic3r/PrintConfig.cpp:2359
+#: src/libslic3r/PrintConfig.cpp:2502
msgid "Display height"
msgstr "Displayhöhe"
-#: src/libslic3r/PrintConfig.cpp:2378
+#: src/libslic3r/PrintConfig.cpp:2521
msgid "Display horizontal mirroring"
msgstr "Zeige horizontale Spiegelung"
-#: src/libslic3r/PrintConfig.cpp:2392
+#: src/libslic3r/PrintConfig.cpp:2535
msgid "Display orientation"
msgstr "Displayausrichtung"
-#: src/slic3r/GUI/MainFrame.cpp:648
+#: src/slic3r/GUI/MainFrame.cpp:1258
msgid "Display the Print Host Upload Queue window"
msgstr "Zeige das Druckhost Warteschlangenfenster"
-#: src/libslic3r/PrintConfig.cpp:2385
+#: src/libslic3r/PrintConfig.cpp:2528
msgid "Display vertical mirroring"
msgstr "Zeige vertikale Spiegelung"
-#: src/libslic3r/PrintConfig.cpp:2353
+#: src/libslic3r/PrintConfig.cpp:2496
msgid "Display width"
msgstr "Displaybreite"
-#: src/libslic3r/PrintConfig.cpp:377
+#: src/libslic3r/PrintConfig.cpp:411
msgid "Distance between copies"
msgstr "Abstand zwischen Kopien"
-#: src/libslic3r/PrintConfig.cpp:1680
+#: src/libslic3r/PrintConfig.cpp:1157
+msgid "Distance between ironing lines"
+msgstr "Abstand zwischen Bügellinien"
+
+#: src/libslic3r/PrintConfig.cpp:1788
msgid "Distance between skirt and object(s). Set this to zero to attach the skirt to the object(s) and get a brim for better adhesion."
msgstr "Distanz zwischen Schürze und Objekt. Auf null stellen um die Schürze an das Objekt zu verbinden und einen Rand für bessere Haftung zu generieren."
-#: src/libslic3r/PrintConfig.cpp:2882
+#: src/libslic3r/PrintConfig.cpp:3046
msgid "Distance between two connector sticks which connect the object and the generated pad."
msgstr "Abstand zwischen zwei Verbindungsstäben, die das Objekt mit der erzeugten Grundschicht verbinden."
-#: src/libslic3r/PrintConfig.cpp:1679
+#: src/libslic3r/PrintConfig.cpp:1787
msgid "Distance from object"
msgstr "Abstand vom Objekt"
-#: src/slic3r/GUI/BedShapeDialog.cpp:85
+#: src/slic3r/GUI/BedShapeDialog.cpp:121
msgid "Distance of the 0,0 G-code coordinate from the front left corner of the rectangle."
msgstr "Abstand der 0,0 G-Code-Koordinate von der linken vorderen Ecke des Rechtecks."
-#: src/libslic3r/PrintConfig.cpp:320
+#: src/libslic3r/PrintConfig.cpp:354
msgid "Distance of the center-point of the cooling tube from the extruder tip."
msgstr "Abstand des Mittelpunktes des Kühlrohres von der Extruderspitze."
-#: src/libslic3r/PrintConfig.cpp:1382
+#: src/libslic3r/PrintConfig.cpp:1490
msgid "Distance of the extruder tip from the position where the filament is parked when unloaded. This should match the value in printer firmware."
msgstr "Abstand der Extruderspitze von der Position, an der das Filament beim Entladen abgestellt wird. Dies sollte mit dem Wert in der Drucker-Firmware übereinstimmen."
-#: src/libslic3r/PrintConfig.cpp:378
+#: src/libslic3r/PrintConfig.cpp:412
msgid "Distance used for the auto-arrange feature of the plater."
msgstr "Abstand für die automatische Druckplattenbelegung."
-#: src/libslic3r/PrintConfig.cpp:3486
+#: src/libslic3r/PrintConfig.cpp:3685
msgid "Do not fail if a file supplied to --load does not exist."
msgstr "Nicht abbrechen, wenn eine an --load übergebene Datei nicht existiert."
-#: src/libslic3r/PrintConfig.cpp:3430
+#: src/libslic3r/PrintConfig.cpp:3629
msgid "Do not rearrange the given models before merging and keep their original XY coordinates."
msgstr "Die angegebenen Modelle werden vor dem Zusammenführen nicht neu angeordnet und behalten ihre ursprünglichen XY-Koordinaten."
-#: src/slic3r/GUI/Field.cpp:240
-#, c-format
-msgid ""
-"Do you mean %s%% instead of %s %s?\n"
-"Select YES if you want to change this value to %s%%, \n"
-"or NO if you are sure that %s %s is a correct value."
-msgstr ""
-"Meinen Sie%s anstelle von %s %s?\n"
-"Wählen Sie JA, wenn Sie diesen Wert auf %s%% ändern möchten, \n"
-"oder NEIN, wenn Sie sicher sind, dass %s %s ein korrekter Wert ist."
+#: src/slic3r/GUI/Field.cpp:288
+#, possible-c-format
+msgid "Do you mean %s%% instead of %s %s?\nSelect YES if you want to change this value to %s%%, \nor NO if you are sure that %s %s is a correct value."
+msgstr "Meinen Sie%s anstelle von %s %s?\nWählen Sie JA, wenn Sie diesen Wert auf %s%% ändern möchten, \noder NEIN, wenn Sie sicher sind, dass %s %s ein korrekter Wert ist."
-#: src/slic3r/GUI/DoubleSlider.cpp:1920
+#: src/slic3r/GUI/DoubleSlider.cpp:2138
msgid "Do you want to delete all saved tool changes?"
msgstr "Möchten Sie alle gespeicherten Werkzeugänderungen löschen?"
-#: src/slic3r/GUI/GUI_App.cpp:884
+#: src/slic3r/GUI/GUI_App.cpp:1610
msgid "Do you want to proceed?"
msgstr "Wollen Sie fortfahren?"
-#: src/slic3r/GUI/Plater.cpp:3321
+#: src/slic3r/GUI/Plater.cpp:3124
msgid "Do you want to retry"
msgstr "Möchten Sie es erneut versuchen"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1045
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:911
msgid "Do you want to save your manually edited support points?"
msgstr "Möchten Sie Ihre manuell bearbeiteten Stützpunkte speichern?"
-#: src/slic3r/GUI/ConfigWizard.cpp:1834
+#: src/slic3r/GUI/ConfigWizard.cpp:2261
msgid "Do you want to select default filaments for these FFF printer models?"
msgstr "Möchten Sie Standardfilamente für diese FFF-Druckermodelle auswählen?"
-#: src/slic3r/GUI/ConfigWizard.cpp:1852
+#: src/slic3r/GUI/ConfigWizard.cpp:2279
msgid "Do you want to select default SLA materials for these printer models?"
msgstr "Möchten Sie Standard-SLA-Materialien für diese Druckermodelle auswählen?"
-#: src/libslic3r/PrintConfig.cpp:3429
+#: src/slic3r/GUI/Plater.cpp:4751
+msgid "does not contain valid gcode."
+msgstr "enthält keinen gültigen G-Code."
+
+#: src/libslic3r/PrintConfig.cpp:3628
msgid "Don't arrange"
msgstr "Nicht Anordnen"
@@ -2086,7 +2392,11 @@ msgstr "Nicht Anordnen"
msgid "Don't notify about new releases any more"
msgstr "Keine Benachrichtigung mehr über neue Releases"
-#: src/libslic3r/PrintConfig.cpp:369
+#: src/slic3r/GUI/Plater.cpp:1431
+msgid "Don't show again"
+msgstr "Nicht mehr anzeigen"
+
+#: src/libslic3r/PrintConfig.cpp:403
msgid "Don't support bridges"
msgstr "Brücken nicht unterstützen"
@@ -2094,262 +2404,348 @@ msgstr "Brücken nicht unterstützen"
msgid "Downgrade"
msgstr "Downgrade"
-#: src/libslic3r/PrintConfig.cpp:1695
+#: src/libslic3r/PrintConfig.cpp:1803
msgid "Draft shield"
msgstr "Windschutz"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1368
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1369
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216
msgid "Drag"
msgstr "Ziehen"
-#: src/libslic3r/SLAPrintSteps.cpp:44
+#: src/slic3r/GUI/Plater.cpp:1406
+msgid "Drag and drop G-code file"
+msgstr "G-Code-Datei ziehen und ablegen"
+
+#: src/libslic3r/SLAPrintSteps.cpp:45
msgid "Drilling holes into model."
msgstr "Löcher in das Modell bohren."
-#: src/libslic3r/SLAPrintSteps.cpp:199
+#: src/libslic3r/SLAPrintSteps.cpp:201
msgid "Drilling holes into the mesh failed. This is usually caused by broken model. Try to fix it first."
msgstr "Das Bohren von Löchern in das Netz ist fehlgeschlagen. Dies wird normalerweise durch ein beschädigtes Modell verursacht. Versuchen Sie zuerst, es zu reparieren."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:337
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:349
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:345
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:357
msgid "Drop to bed"
msgstr "Auf das Druckbett fallen lassen"
-#: src/libslic3r/PrintConfig.cpp:3433
+#: src/libslic3r/PrintConfig.cpp:3632
msgid "Duplicate"
msgstr "Duplizieren"
-#: src/libslic3r/PrintConfig.cpp:3438
+#: src/libslic3r/PrintConfig.cpp:3637
msgid "Duplicate by grid"
msgstr "Duplizieren nach Raster"
-#: src/slic3r/GUI/PresetHints.cpp:40
-msgid "During the other layers, fan"
-msgstr "Während der übrigen Schichten, Lüfter"
+#: src/slic3r/GUI/GCodeViewer.cpp:2445
+msgid "Duration"
+msgstr "Dauer"
+
+#: src/slic3r/GUI/PresetHints.cpp:51
+msgid "During the other layers, fan will always run at %1%%%"
+msgstr "Bei den anderen Schichten läuft der Lüfter immer mit %1%%%"
+
+#: src/slic3r/GUI/PresetHints.cpp:58
+msgid "During the other layers, fan will be turned off."
+msgstr "Bei den anderen Schichten wird der Lüfter ausgeschaltet."
-#: src/libslic3r/PrintConfig.cpp:2669
+#: src/libslic3r/PrintConfig.cpp:2833
msgid "Dynamic"
msgstr "Dynamisch"
-#: src/slic3r/GUI/MainFrame.cpp:749
+#: src/slic3r/GUI/MainFrame.cpp:1448
msgid "E&xport"
msgstr "E&xport"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:347
+#: src/slic3r/GUI/GUI_ObjectList.cpp:394
msgid "edges fixed"
msgstr "Kanten korrigiert"
-#: src/slic3r/GUI/DoubleSlider.cpp:1508
+#: src/slic3r/GUI/DoubleSlider.cpp:1700
msgid "Edit color"
msgstr "Farbe bearbeiten"
-#: src/slic3r/GUI/DoubleSlider.cpp:960
+#: src/slic3r/GUI/DoubleSlider.cpp:1083
msgid "Edit current color - Right click the colored slider segment"
msgstr "Aktuelle Farbe bearbeiten - Rechtsklick auf das farbige Schiebereglersegment"
-#: src/slic3r/GUI/DoubleSlider.cpp:1510
+#: src/slic3r/GUI/DoubleSlider.cpp:1702
msgid "Edit custom G-code"
msgstr "Benutzerdefinierten G-Code bearbeiten"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3003
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3459
msgid "Edit Height Range"
msgstr "Höhenbereich bearbeiten"
-#: src/slic3r/GUI/DoubleSlider.cpp:1509
+#: src/slic3r/GUI/DoubleSlider.cpp:1701
msgid "Edit pause print message"
msgstr "Druckpausen-Mitteilung bearbeiten"
-#: src/slic3r/GUI/DoubleSlider.cpp:1037
+#: src/slic3r/GUI/PresetComboBoxes.cpp:645
+msgid "Edit physical printer"
+msgstr "Physischen Drucker bearbeiten"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:641
+msgid "Edit preset"
+msgstr "Voreinstellung bearbeiten"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1162
msgid "Edit tick mark - Ctrl + Left click"
msgstr "Häkchen bearbeiten - Strg + Linksklick"
-#: src/slic3r/GUI/DoubleSlider.cpp:1038
+#: src/slic3r/GUI/DoubleSlider.cpp:1163
msgid "Edit tick mark - Right click"
msgstr "Häkchen bearbeiten - Rechtsklick"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:282 src/slic3r/GUI/GUI_ObjectList.cpp:394
+#: src/slic3r/GUI/GUI_ObjectList.cpp:300 src/slic3r/GUI/GUI_ObjectList.cpp:441
msgid "Editing"
msgstr "Bearbeitung"
-#: src/slic3r/GUI/MainFrame.cpp:547
+#: src/slic3r/GUI/MainFrame.cpp:1105
msgid "Ejec&t SD card / Flash drive"
msgstr "SD-Kar&te/Flash-Laufwerk auswerfen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:126
+#: src/slic3r/GUI/NotificationManager.cpp:780
+msgid "Eject drive"
+msgstr "Laufwerk auswerfen"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:119
msgid "Eject SD card / Flash drive"
msgstr "SD-Karte/Flash-Laufwerk auswerfen"
-#: src/slic3r/GUI/MainFrame.cpp:547
+#: src/slic3r/GUI/MainFrame.cpp:1105
msgid "Eject SD card / Flash drive after the G-code was exported to it."
msgstr "SD-Karte / Flash-Laufwerk auswerfen, nachdem der G-Code dorthin exportiert wurde."
-#: src/slic3r/GUI/Plater.cpp:2202
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:2034
+#, possible-c-format
msgid "Ejecting of device %s(%s) has failed."
msgstr "Das Auswerfen von Gerät %s(%s) ist fehlgeschlagen."
-#: src/libslic3r/PrintConfig.cpp:118
+#: src/libslic3r/PrintConfig.cpp:120
msgid "Elephant foot compensation"
msgstr "Elefantenfußkompensation"
-#: src/libslic3r/PrintConfig.cpp:2447
+#: src/libslic3r/PrintConfig.cpp:2590
msgid "Elephant foot minimum width"
msgstr "Elefantenfuß Mindestbreite"
-#: src/libslic3r/SLAPrint.cpp:625
+#: src/libslic3r/SLAPrint.cpp:639
msgid "Elevation is too low for object. Use the \"Pad around object\" feature to print the object without elevation."
msgstr "Die Erhöhung ist zu niedrig für das Objekt. Verwenden Sie die Funktion \"Grundschicht um Object\", um das Objekt ohne Erhöhung zu drucken."
-#: src/libslic3r/PrintConfig.cpp:1093
+#: src/libslic3r/PrintConfig.cpp:1186
msgid "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute intervals into the G-code to let the firmware show accurate remaining time. As of now only the Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 firmware supports M73 Qxx Sxx for the silent mode."
msgstr "Schreibt M73 P[Prozent gedruckt] R[Restzeit in Minuten] im Abstand von 1 Minute in den G-Code, damit die Firmware die genaue Restzeit anzeigt. Ab sofort erkennt nur noch die Prusa i3 MK3 Firmware das M73. Die i3 MK3 Firmware unterstützt auch das M73 Qxx Sxx für den Silent Mode."
-#: src/libslic3r/GCode.cpp:637
+#: src/libslic3r/PrintConfig.cpp:1217
+msgid "Emit to G-code"
+msgstr "In G-Code ausgeben"
+
+#: src/libslic3r/GCode.cpp:622
msgid "Empty layers detected, the output would not be printable."
msgstr "Leere Schichten erkannt, die Ausgabe wäre nicht druckbar."
-#: src/slic3r/GUI/Tab.cpp:1445 src/libslic3r/PrintConfig.cpp:1355
-#: src/libslic3r/PrintConfig.cpp:2200
+#: src/slic3r/GUI/Tab.cpp:1791 src/libslic3r/PrintConfig.cpp:1463
+#: src/libslic3r/PrintConfig.cpp:2343
msgid "Enable"
msgstr "Aktivieren"
-#: src/libslic3r/PrintConfig.cpp:313
+#: src/libslic3r/PrintConfig.cpp:347
msgid "Enable auto cooling"
msgstr "Automatische Kühlung aktivieren"
-#: src/libslic3r/PrintConfig.cpp:572
+#: src/libslic3r/PrintConfig.cpp:608
msgid "Enable fan if layer print time is below"
msgstr "Lüfter einschalten wenn die Schichtdruckzeit geringer ist als"
-#: src/libslic3r/PrintConfig.cpp:2908
+#: src/libslic3r/PrintConfig.cpp:3072
msgid "Enable hollowing"
msgstr "Aushöhlung aktivieren"
-#: src/libslic3r/PrintConfig.cpp:2380
+#: src/libslic3r/PrintConfig.cpp:2523
msgid "Enable horizontal mirroring of output images"
msgstr "Horizontale Spiegelung der Ausgabebilder aktivieren"
-#: src/libslic3r/PrintConfig.cpp:1867
+#: src/libslic3r/PrintConfig.cpp:1124
+msgid "Enable ironing"
+msgstr "Bügeln aktivieren"
+
+#: src/libslic3r/PrintConfig.cpp:1125
+msgid "Enable ironing of the top layers with the hot print head for smooth surface"
+msgstr "Ermöglicht das Bügeln der oberen Schichten mit dem heißen Druckkopf für eine glatte Oberfläche"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3901
+msgid "Enable rotations (slow)"
+msgstr "Rotationen aktivieren (langsam)"
+
+#: src/slic3r/GUI/Preferences.cpp:207
+msgid "Enable support for legacy 3DConnexion devices"
+msgstr "Ältere 3DConnexion-Geräte unterstützen"
+
+#: src/libslic3r/PrintConfig.cpp:2009
msgid "Enable support material generation."
-msgstr "Aktiviert Generierung von Stützstrukturen."
+msgstr "Aktiviert Generierung von Stützmaterial."
-#: src/libslic3r/PrintConfig.cpp:966
+#: src/libslic3r/PrintConfig.cpp:1010
msgid "Enable this to add comments into the G-Code labeling print moves with what object they belong to, which is useful for the Octoprint CancelObject plugin. This settings is NOT compatible with Single Extruder Multi Material setup and Wipe into Object / Wipe into Infill."
msgstr "Aktivieren Sie dies, um Kommentare in den G-Code einzufügen, die die Druckbewegungen beschriften zu welchem Objekt sie gehören, was für das OctoPrint CancelObject Plugin nützlich ist. Diese Einstellungen sind NICHT kompatibel mit der Einstellung Single Extruder Multi Material und Wischen ins Objekt / Wischen ins Infill."
-#: src/libslic3r/PrintConfig.cpp:929
+#: src/libslic3r/PrintConfig.cpp:973
msgid "Enable this to get a commented G-code file, with each line explained by a descriptive text. If you print from SD card, the additional weight of the file could make your firmware slow down."
msgstr "Aktivieren Sie diese Option, um eine kommentierte G-Code-Datei zu erhalten, wobei jede Zeile durch einen beschreibenden Text erklärt wird. Wenn Sie von einer SD-Karte drucken, kann die zusätzliche Dateigröße dazu führen, dass Ihre Firmware langsamer wird."
-#: src/libslic3r/PrintConfig.cpp:2186
+#: src/libslic3r/PrintConfig.cpp:2329
msgid "Enable variable layer height feature"
msgstr "Variable Schichthöhen aktivieren"
-#: src/libslic3r/PrintConfig.cpp:2387
+#: src/libslic3r/PrintConfig.cpp:2530
msgid "Enable vertical mirroring of output images"
msgstr "Vertikale Spiegelung der Ausgabebilder aktivieren"
-#: src/slic3r/GUI/Tab.cpp:1534 src/slic3r/GUI/Tab.cpp:1982
-#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:395
+#: src/slic3r/GUI/Tab.cpp:1880 src/slic3r/GUI/Tab.cpp:2168
+#: src/libslic3r/PrintConfig.cpp:419 src/libslic3r/PrintConfig.cpp:429
msgid "End G-code"
msgstr "G-Code am Ende"
-#: src/libslic3r/PrintConfig.cpp:1924
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:239
+msgid "Enforce"
+msgstr "Erzwinge"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:30
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:381
+msgid "Enforce seam"
+msgstr "Naht erzwingen"
+
+#: src/libslic3r/PrintConfig.cpp:2066
msgid "Enforce support for the first"
-msgstr "Erzwinge Stützstrukturen bei den ersten"
+msgstr "Erzwinge Stützen bei den ersten"
-#: src/libslic3r/PrintConfig.cpp:1931
+#: src/libslic3r/PrintConfig.cpp:2073
msgid "Enforce support for the first n layers"
-msgstr "Erzwinge Stützstrukturen bei den ersten n Schichten"
+msgstr "Erzwinge Stützen bei den ersten n Schichten"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47
+msgid "Enforce supports"
+msgstr "Stützen erzwingen"
#: src/slic3r/GUI/PrintHostDialogs.cpp:198
#: src/slic3r/GUI/PrintHostDialogs.cpp:229
msgid "Enqueued"
msgstr "In der Warteschlange"
-#: src/libslic3r/PrintConfig.cpp:407
+#: src/libslic3r/PrintConfig.cpp:441
msgid "Ensure vertical shell thickness"
msgstr "Stelle die vertikale Hüllenstärke sicher"
-#: src/slic3r/GUI/DoubleSlider.cpp:1618
+#: src/slic3r/GUI/GLCanvas3D.cpp:4402 src/slic3r/GUI/GLCanvas3D.cpp:4410
+#: src/slic3r/GUI/Search.cpp:433
+msgid "Enter a search term"
+msgstr "Suchbegriff eingeben"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1814
msgid "Enter custom G-code used on current layer"
msgstr "Benutzerdefinierten G-Code für die aktuelle Schicht eingeben"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3803
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4266
msgid "Enter new name"
msgstr "Geben Sie den neuen Namen ein"
-#: src/slic3r/GUI/DoubleSlider.cpp:1634
+#: src/slic3r/GUI/DoubleSlider.cpp:1830
msgid "Enter short message shown on Printer display when a print is paused"
msgstr "Geben Sie eine kurze Nachricht ein, die auf dem Druckerdisplay angezeigt wird, wenn der Druck angehalten wird"
-#: src/slic3r/GUI/ConfigWizard.cpp:1047
+#: src/slic3r/GUI/ConfigWizard.cpp:1413
msgid "Enter the bed temperature needed for getting your filament to stick to your heated bed."
msgstr "Geben Sie die Druckbetttemperatur ein, die erforderlich ist, damit Ihr Filament an Ihrem beheizten Druckbett haftet."
-#: src/slic3r/GUI/ConfigWizard.cpp:979
+#: src/slic3r/GUI/ConfigWizard.cpp:1345
msgid "Enter the diameter of your filament."
msgstr "Geben Sie den Durchmesser des Filaments ein."
-#: src/slic3r/GUI/ConfigWizard.cpp:966
+#: src/slic3r/GUI/ConfigWizard.cpp:1332
msgid "Enter the diameter of your printer's hot end nozzle."
msgstr "Geben Sie den Durchmesser der Hotenddüse ein."
-#: src/slic3r/GUI/DoubleSlider.cpp:1650
+#: src/slic3r/GUI/DoubleSlider.cpp:1851 src/slic3r/GUI/DoubleSlider.cpp:1855
msgid "Enter the height you want to jump to"
msgstr "Geben Sie die Höhe ein, auf die Sie wechseln möchten"
-#: src/slic3r/GUI/Plater.cpp:4751
+#: src/slic3r/GUI/DoubleSlider.cpp:1851
+msgid "Enter the move you want to jump to"
+msgstr "Geben Sie die Bewegung ein, zu welcher Sie wechseln möchten"
+
+#: src/slic3r/GUI/Plater.cpp:4855
msgid "Enter the number of copies:"
msgstr "Geben Sie die Anzahl der Kopien ein:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1033
+#: src/slic3r/GUI/ConfigWizard.cpp:1399
msgid "Enter the temperature needed for extruding your filament."
msgstr "Geben Sie die Temperatur ein, die für die Extrusion Ihres Filaments benötigt wird."
-#: src/libslic3r/PrintConfig.cpp:761
+#: src/libslic3r/PrintConfig.cpp:813
+msgid "Enter weight of the empty filament spool. One may weigh a partially consumed filament spool before printing and one may compare the measured weight with the calculated weight of the filament with the spool to find out whether the amount of filament on the spool is sufficient to finish the print."
+msgstr "Gewicht der leeren Filament-Spule eingeben. Man kann eine teilweise verbrauchte Filament-Spule vor dem Drucken wiegen und das gemessene Gewicht mit dem berechneten Gewicht des Filaments mit der Spule vergleichen, um herauszufinden, ob die Menge des Filaments auf der Spule ausreicht, um den Druck zu beenden."
+
+#: src/libslic3r/PrintConfig.cpp:797
msgid "Enter your filament cost per kg here. This is only for statistical information."
msgstr "Geben Sie hier Ihre Filamentkosten pro kg ein. Dies dient ausschließlich statistischen Zwecken."
-#: src/libslic3r/PrintConfig.cpp:718
+#: src/libslic3r/PrintConfig.cpp:754
msgid "Enter your filament density here. This is only for statistical information. A decent way is to weigh a known length of filament and compute the ratio of the length to volume. Better is to calculate the volume directly through displacement."
msgstr "Geben Sie hier Ihre Filamentdichte ein. Dies dient ausschließlich statistischen Zwecken. Ein vernünftiger Weg ist es, eine bekannte Filamentlänge zu wiegen und das Verhältnis von Länge zu Volumen zu berechnen. Besser ist es, das Volumen direkt durch Verdrängung zu berechnen."
-#: src/libslic3r/PrintConfig.cpp:710
+#: src/libslic3r/PrintConfig.cpp:746
msgid "Enter your filament diameter here. Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average."
msgstr "Geben Sie hier Ihren Filamentdurchmesser ein. Eine hohe Genauigkeit ist erforderlich, also verwenden Sie einen Messschieber und führen Sie mehrere Messungen entlang des Filaments durch, um dann den Mittelwert zu berechnen."
-#: src/slic3r/GUI/MainFrame.cpp:422 src/slic3r/GUI/MainFrame.cpp:785
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:39
+msgid "Entering Paint-on supports"
+msgstr "Beginne Aufmal-Stützen"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:40
+msgid "Entering Seam painting"
+msgstr "Beginne Aufmal-Nähte"
+
+#: src/slic3r/GUI/MainFrame.cpp:1003 src/slic3r/GUI/MainFrame.cpp:1486
#: src/slic3r/GUI/PrintHostDialogs.cpp:231
msgid "Error"
msgstr "Fehler"
#: src/slic3r/GUI/FirmwareDialog.cpp:645
-#, c-format
+#, possible-c-format
msgid "Error accessing port at %s: %s"
msgstr "Fehler beim Zugriff auf Port bei %s:%s"
-#: src/slic3r/GUI/Plater.cpp:3433
+#: src/slic3r/GUI/Plater.cpp:3238
msgid "Error during reload"
msgstr "Fehler beim erneuten Laden"
-#: src/slic3r/GUI/Plater.cpp:5043
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:5172
+#, possible-c-format
msgid "Error exporting 3MF file %s"
msgstr "Fehler beim Exportieren der 3MF Datei %s"
-#: src/slic3r/GUI/Plater.cpp:5005
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:5138
+#, possible-c-format
msgid "Error exporting AMF file %s"
msgstr "Fehler beim Exportieren der AMF Datei %s"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:154
+#: src/slic3r/GUI/OpenGLManager.cpp:276
+msgid "Error loading shaders"
+msgstr "Fehler beim Laden von Shadern"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:152
msgid "Error Message"
msgstr "Fehlermeldung"
-#: src/slic3r/GUI/AppConfig.cpp:114
+#: src/slic3r/GUI/GUI_App.cpp:661
+msgid "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to manually delete the file to recover from the error."
+msgstr "Fehler beim Parsen der PrusaGCodeViewer-Konfigurationsdatei, sie ist wahrscheinlich beschädigt. Versuchen Sie, die Datei manuell zu löschen, um den Fehler zu beheben."
+
+#: src/slic3r/GUI/GUI_App.cpp:655 src/slic3r/GUI/GUI_App.cpp:670
msgid "Error parsing PrusaSlicer config file, it is probably corrupted. Try to manually delete the file to recover from the error. Your user profiles will not be affected."
msgstr "Fehler beim Parsen der PrusaSlicer-Konfigurationsdatei, sie ist wahrscheinlich beschädigt. Versuchen Sie, die Datei manuell zu löschen, um den Fehler zu beheben. Ihre Benutzerprofile sind davon nicht betroffen."
@@ -2357,163 +2753,195 @@ msgstr "Fehler beim Parsen der PrusaSlicer-Konfigurationsdatei, sie ist wahrsche
msgid "Error uploading to print host:"
msgstr "Fehler beim Hochloden zu Druckhost:"
-#: src/libslic3r/Zipper.cpp:102
+#: src/slic3r/GUI/Plater.cpp:4752
+msgid "Error while loading .gcode file"
+msgstr "Fehler beim Laden einer .gcode-Datei"
+
+#: src/libslic3r/Zipper.cpp:27
msgid "Error with zip archive"
msgstr "Fehler beim ZIP-Archiv"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1918
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2077
msgid "Error!"
msgstr "Fehler!"
-#: src/slic3r/GUI/BedShapeDialog.cpp:505
+#: src/slic3r/GUI/BedShapeDialog.cpp:581
msgid "Error! Invalid model"
msgstr "Fehler! Ungültiges Modell"
+#: src/slic3r/GUI/NotificationManager.cpp:667
+#: src/slic3r/GUI/NotificationManager.cpp:683
+#: src/slic3r/GUI/NotificationManager.cpp:694
+msgid "ERROR:"
+msgstr "FEHLER:"
+
#: src/slic3r/GUI/FirmwareDialog.cpp:647
-#, c-format
+#, possible-c-format
msgid "Error: %s"
msgstr "Fehler: %s"
-#: src/slic3r/GUI/Job.hpp:123
+#: src/slic3r/GUI/Jobs/Job.cpp:74
msgid "ERROR: not enough resources to execute a new job."
msgstr "FEHLER: Nicht genügend Ressourcen, um einen neuen Job auszuführen."
-#: src/slic3r/GUI/Plater.cpp:240 src/slic3r/GUI/Plater.cpp:1216
-#: src/slic3r/GUI/Plater.cpp:1258
+#: src/slic3r/GUI/Plater.cpp:3374
+msgid "ERROR: Please close all manipulators available from the left toolbar before fixing the mesh."
+msgstr "FEHLER: Bitte schließen Sie alle in der linken Symbolleiste verfügbaren Manipulatoren, bevor Sie das Netz reparieren."
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2552 src/slic3r/GUI/GCodeViewer.cpp:2557
+#: src/slic3r/GUI/Plater.cpp:246 src/slic3r/GUI/Plater.cpp:1125
+#: src/slic3r/GUI/Plater.cpp:1175 src/slic3r/GUI/Plater.cpp:1196
msgid "Estimated printing time"
msgstr "Erwartete Druckzeit"
-#: src/slic3r/GUI/Plater.cpp:502
+#: src/slic3r/GUI/GCodeViewer.cpp:2442 src/slic3r/GUI/GCodeViewer.cpp:2445
+msgid "Event"
+msgstr "Ereignis"
+
+#: src/slic3r/GUI/Plater.cpp:368
msgid "Everywhere"
msgstr "Ãœberall"
-#: src/slic3r/GUI/PresetHints.cpp:51
+#: src/slic3r/GUI/PresetHints.cpp:50
msgid "except for the first %1% layers."
msgstr "außer für die ersten %1% Schichten."
-#: src/slic3r/GUI/PresetHints.cpp:53
+#: src/slic3r/GUI/PresetHints.cpp:52
msgid "except for the first layer."
msgstr "außer für die erste Schicht."
-#: src/libslic3r/Print.cpp:1377
+#: src/libslic3r/Print.cpp:1403
msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm"
msgstr "Übermäßig %1%=%2% mm, um mit einem Düsendurchmesser von %3% mm druckbar zu sein"
#: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246
-#, c-format
+#, possible-c-format
msgid "Exit %s"
msgstr "%s beenden"
-#: src/libslic3r/PrintConfig.cpp:371
+#: src/slic3r/GUI/Plater.cpp:2143
+msgid "Expand sidebar"
+msgstr "Seitenleiste aufklappen"
+
+#: src/libslic3r/PrintConfig.cpp:405
msgid "Experimental option for preventing support material from being generated under bridged areas."
msgstr "Experimentelle Option zur Verhinderung der Bildung von Trägermaterial unter Überbrückungsflächen."
-#: src/libslic3r/PrintConfig.cpp:1375
+#: src/libslic3r/PrintConfig.cpp:1483
msgid "Experimental option to adjust flow for overhangs (bridge flow will be used), to apply bridge speed to them and enable fan."
msgstr "Experimentelle Option zur Anpassung des Durchflusses für Überhänge (Brückenvolumenfluss wird verwendet), zur Anwendung der Brückengeschwindigkeit und zur Aktivierung des Lüfters."
-#: src/slic3r/GUI/GUI_App.cpp:815 src/slic3r/GUI/wxExtensions.cpp:755
+#: src/slic3r/GUI/GUI_App.cpp:1507 src/slic3r/GUI/wxExtensions.cpp:676
msgid "Expert"
msgstr "Experte"
-#: src/slic3r/GUI/ConfigWizard.cpp:822
+#: src/slic3r/GUI/ConfigWizard.cpp:1181
msgid "Expert mode"
msgstr "Expertenmodus"
-#: src/slic3r/GUI/GUI_App.cpp:815
+#: src/slic3r/GUI/GUI_App.cpp:1507
msgid "Expert View Mode"
msgstr "Experten Anzeigemodus"
-#: src/slic3r/GUI/Plater.cpp:5521
+#: src/slic3r/GUI/Plater.cpp:5706
msgid "Export"
msgstr "Export"
-#: src/slic3r/GUI/MainFrame.cpp:500
+#: src/slic3r/GUI/MainFrame.cpp:1094
msgid "Export &Config"
msgstr "Export &Konfiguration"
-#: src/slic3r/GUI/MainFrame.cpp:477 src/slic3r/GUI/MainFrame.cpp:749
+#: src/slic3r/GUI/MainFrame.cpp:1068 src/slic3r/GUI/MainFrame.cpp:1448
msgid "Export &G-code"
msgstr "Export &G-Code"
-#: src/slic3r/GUI/MainFrame.cpp:496
+#: src/slic3r/GUI/MainFrame.cpp:1090 src/slic3r/GUI/MainFrame.cpp:1395
msgid "Export &toolpaths as OBJ"
-msgstr "&Werkzeugpfade als OBJ exportieren"
+msgstr "&Werkzeugwege als OBJ exportieren"
-#: src/libslic3r/PrintConfig.cpp:3338
+#: src/libslic3r/PrintConfig.cpp:3531
msgid "Export 3MF"
msgstr "Export 3MF"
-#: src/slic3r/GUI/MainFrame.cpp:503
+#: src/slic3r/GUI/MainFrame.cpp:1100
+msgid "Export all presets including physical printers to file"
+msgstr "Alle Voreinstellungen einschließlich physischer Drucker in eine Datei exportieren"
+
+#: src/slic3r/GUI/MainFrame.cpp:1097
msgid "Export all presets to file"
msgstr "Exportiere alle Voreinstellungen in eine Datei"
-#: src/libslic3r/PrintConfig.cpp:3343
+#: src/libslic3r/PrintConfig.cpp:3536
msgid "Export AMF"
msgstr "Exportiere AMF"
-#: src/slic3r/GUI/Plater.cpp:2598
+#: src/slic3r/GUI/Plater.cpp:2560
msgid "Export AMF file:"
msgstr "Exportiere AMF Datei:"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1657 src/slic3r/GUI/Plater.cpp:3966
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1786 src/slic3r/GUI/Plater.cpp:3884
msgid "Export as STL"
msgstr "Exportiere als STL"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:124
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:117
msgid "Export config"
msgstr "Konfiguration exportieren"
-#: src/slic3r/GUI/MainFrame.cpp:503
+#: src/slic3r/GUI/MainFrame.cpp:1097
msgid "Export Config &Bundle"
msgstr "Konfigurationssa&mlung exportieren"
-#: src/slic3r/GUI/MainFrame.cpp:500
+#: src/slic3r/GUI/MainFrame.cpp:1100
+msgid "Export Config Bundle With Physical Printers"
+msgstr "Konfigurations-Bundle mit physischen Druckern exportieren"
+
+#: src/slic3r/GUI/MainFrame.cpp:1094
msgid "Export current configuration to file"
msgstr "Exportiere die aktuelle Konfiguration in eine Datei"
-#: src/slic3r/GUI/MainFrame.cpp:492
+#: src/slic3r/GUI/MainFrame.cpp:1086
msgid "Export current plate as AMF"
msgstr "Exportiere die aktuelle Plattenbelegung als AMF"
-#: src/slic3r/GUI/MainFrame.cpp:477
+#: src/slic3r/GUI/MainFrame.cpp:1068
msgid "Export current plate as G-code"
msgstr "Exportiere die aktuelle Plattenbelegung als G-Code"
-#: src/slic3r/GUI/MainFrame.cpp:521
+#: src/slic3r/GUI/MainFrame.cpp:1076
msgid "Export current plate as G-code to SD card / Flash drive"
msgstr "Aktuelle Druckplatte als G-Code auf SD-Karte/Flash-Laufwerk exportieren"
-#: src/slic3r/GUI/MainFrame.cpp:486
+#: src/slic3r/GUI/MainFrame.cpp:1080
msgid "Export current plate as STL"
msgstr "Exportiere die aktuelle Plattenbelegung als STL"
-#: src/slic3r/GUI/MainFrame.cpp:489
+#: src/slic3r/GUI/MainFrame.cpp:1083
msgid "Export current plate as STL including supports"
-msgstr "Exportiert die aktuelle Plattenbelegung als STL einschließlich Stützstrukturen"
-
-#: src/slic3r/GUI/Plater.cpp:3664
-msgid "Export failed"
-msgstr "Export ist fehlgeschlagen"
+msgstr "Exportiert die aktuelle Plattenbelegung als STL einschließlich Stützen"
-#: src/slic3r/GUI/ConfigWizard.cpp:801
+#: src/slic3r/GUI/ConfigWizard.cpp:1160
msgid "Export full pathnames of models and parts sources into 3mf and amf files"
msgstr "Exportieren Sie die vollständigen Pfadnamen der Modelle und Teilequellen in 3mf- und amf-Dateien"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 src/slic3r/GUI/Plater.cpp:891
-#: src/slic3r/GUI/Plater.cpp:5521 src/libslic3r/PrintConfig.cpp:3353
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/Plater.cpp:766
+#: src/slic3r/GUI/Plater.cpp:5706 src/libslic3r/PrintConfig.cpp:3546
msgid "Export G-code"
msgstr "Export G-Code"
-#: src/slic3r/GUI/MainFrame.cpp:521
+#: src/slic3r/GUI/MainFrame.cpp:1076
msgid "Export G-code to SD card / Flash drive"
msgstr "G-Code auf SD-Karte/Flash-Laufwerk exportieren"
-#: src/libslic3r/PrintConfig.cpp:3320
+#: src/slic3r/GUI/NotificationManager.cpp:631
+#: src/slic3r/GUI/NotificationManager.cpp:748
+msgid "Export G-Code."
+msgstr "G-Code exportieren."
+
+#: src/libslic3r/PrintConfig.cpp:3513
msgid "Export OBJ"
msgstr "Exportiere OBJ"
-#: src/slic3r/GUI/Plater.cpp:2610
+#: src/slic3r/GUI/Plater.cpp:2572
msgid "Export OBJ file:"
msgstr "Exportiere OBJ Datei:"
@@ -2521,212 +2949,215 @@ msgstr "Exportiere OBJ Datei:"
msgid "Export of a temporary 3mf file failed"
msgstr "Export einer temporären 3MF Datei fehlgeschlagen"
-#: src/slic3r/GUI/MainFrame.cpp:492
+#: src/slic3r/GUI/MainFrame.cpp:1086
msgid "Export plate as &AMF"
msgstr "Exportiere die Plattenbelegung als &AMF"
-#: src/slic3r/GUI/MainFrame.cpp:486
+#: src/slic3r/GUI/MainFrame.cpp:1080
msgid "Export plate as &STL"
msgstr "Exportiere die Plattenbelegung als &STL"
-#: src/slic3r/GUI/MainFrame.cpp:489
+#: src/slic3r/GUI/MainFrame.cpp:1083
msgid "Export plate as STL &including supports"
-msgstr "Export&iere Plattenbelegung als STL einschließlich Stützstrukturen"
+msgstr "Export&iere Plattenbelegung als STL einschließlich Stützen"
-#: src/libslic3r/PrintConfig.cpp:3332
+#: src/libslic3r/PrintConfig.cpp:3525
msgid "Export SLA"
msgstr "Exportiere SLA"
-#: src/slic3r/GUI/Preferences.cpp:72
+#: src/slic3r/GUI/Preferences.cpp:89
msgid "Export sources full pathnames to 3mf and amf"
msgstr "Vollständige Pfadnamen der Quellen in 3mf und amf exportieren"
-#: src/libslic3r/PrintConfig.cpp:3348
+#: src/libslic3r/PrintConfig.cpp:3541
msgid "Export STL"
msgstr "Exportiere STL"
-#: src/slic3r/GUI/Plater.cpp:2591
+#: src/slic3r/GUI/Plater.cpp:2553
msgid "Export STL file:"
msgstr "Exportiere STL Datei:"
-#: src/libslic3r/PrintConfig.cpp:3339
+#: src/libslic3r/PrintConfig.cpp:3532
msgid "Export the model(s) as 3MF."
msgstr "Exportiert das/die Modell(e) als 3MF Datei."
-#: src/libslic3r/PrintConfig.cpp:3344
+#: src/libslic3r/PrintConfig.cpp:3537
msgid "Export the model(s) as AMF."
msgstr "Exportiert das/die Modell(e) als AMF Datei."
-#: src/libslic3r/PrintConfig.cpp:3321
+#: src/libslic3r/PrintConfig.cpp:3514
msgid "Export the model(s) as OBJ."
msgstr "Exportiert das/die Modell(e) als OBJ Datei."
-#: src/libslic3r/PrintConfig.cpp:3349
+#: src/libslic3r/PrintConfig.cpp:3542
msgid "Export the model(s) as STL."
msgstr "Exportiert das/die Modell(e) als STL Datei."
-#: src/slic3r/GUI/Plater.cpp:3966
+#: src/slic3r/GUI/Plater.cpp:3884
msgid "Export the selected object as STL file"
msgstr "Exportiere das gewählte Objekt als STL Datei"
-#: src/slic3r/GUI/Plater.cpp:880
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 src/slic3r/GUI/Plater.cpp:755
msgid "Export to SD card / Flash drive"
msgstr "Export auf SD-Karte/Flash-Laufwerk"
-#: src/slic3r/GUI/MainFrame.cpp:496
+#: src/slic3r/GUI/MainFrame.cpp:1090 src/slic3r/GUI/MainFrame.cpp:1395
msgid "Export toolpaths as OBJ"
-msgstr "Werkzeugpfad als OBJ exportieren"
+msgstr "Werkzeugweg als OBJ exportieren"
+
+#: src/slic3r/GUI/NotificationManager.hpp:317
+msgid "Exporting finished."
+msgstr "Exportieren beendet."
-#: src/libslic3r/Print.cpp:1638
+#: src/libslic3r/Print.cpp:1676
msgid "Exporting G-code"
msgstr "Exportiere G-Code"
#: src/slic3r/Utils/FixModelByWin10.cpp:341
-msgid "Exporting model..."
-msgstr "Exportiere Modell..."
+msgid "Exporting model"
+msgstr "Exportiere Modell"
#: src/slic3r/Utils/FixModelByWin10.cpp:219
#: src/slic3r/Utils/FixModelByWin10.cpp:359
msgid "Exporting source model"
msgstr "Exportieren des Quellmodells"
-#: src/libslic3r/SLAPrint.cpp:646
+#: src/libslic3r/SLAPrint.cpp:660
msgid "Exposition time is out of printer profile bounds."
msgstr "Belichtungszeit ist außerhalb der Druckerprofilgrenzen."
-#: src/slic3r/GUI/Tab.cpp:2117 src/slic3r/GUI/Tab.cpp:3515
+#: src/slic3r/GUI/Tab.cpp:2287 src/slic3r/GUI/Tab.cpp:3931
msgid "Exposure"
msgstr "Belichtung"
-#: src/libslic3r/PrintConfig.cpp:2541 src/libslic3r/PrintConfig.cpp:2542
+#: src/libslic3r/PrintConfig.cpp:2684 src/libslic3r/PrintConfig.cpp:2685
msgid "Exposure time"
msgstr "Belichtungszeit"
-#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:311
+#: src/slic3r/GUI/GUI_Preview.cpp:302 src/libslic3r/ExtrusionEntity.cpp:315
+#: src/libslic3r/ExtrusionEntity.cpp:338
msgid "External perimeter"
msgstr "Außenkontur"
-#: src/slic3r/GUI/PresetHints.cpp:156
+#: src/slic3r/GUI/PresetHints.cpp:155
msgid "external perimeters"
msgstr "Außenkonturen"
-#: src/libslic3r/PrintConfig.cpp:446 src/libslic3r/PrintConfig.cpp:457
+#: src/libslic3r/PrintConfig.cpp:482 src/libslic3r/PrintConfig.cpp:493
msgid "External perimeters"
msgstr "Außenkonturen"
-#: src/libslic3r/PrintConfig.cpp:469
+#: src/libslic3r/PrintConfig.cpp:505
msgid "External perimeters first"
msgstr "Außenkonturen zuerst drucken"
-#: src/libslic3r/PrintConfig.cpp:1588 src/libslic3r/PrintConfig.cpp:1596
+#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1704
msgid "Extra length on restart"
msgstr "Extra Länge bei Neustart"
-#: src/libslic3r/PrintConfig.cpp:1390
+#: src/libslic3r/PrintConfig.cpp:1498
msgid "Extra loading distance"
msgstr "Zusätzliche Ladestrecke"
-#: src/libslic3r/PrintConfig.cpp:477
+#: src/libslic3r/PrintConfig.cpp:513
msgid "Extra perimeters if needed"
msgstr "Extra Konturen wenn notwendig"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:278 src/slic3r/GUI/Tab.cpp:1434
-#: src/slic3r/GUI/wxExtensions.cpp:598 src/libslic3r/PrintConfig.cpp:487
+#: src/slic3r/GUI/GCodeViewer.cpp:2277 src/slic3r/GUI/GCodeViewer.cpp:2313
+#: src/slic3r/GUI/GCodeViewer.cpp:2318 src/slic3r/GUI/GUI_ObjectList.cpp:296
+#: src/slic3r/GUI/Tab.cpp:1780 src/slic3r/GUI/wxExtensions.cpp:515
+#: src/libslic3r/PrintConfig.cpp:523
msgid "Extruder"
msgstr "Extruder"
-#: src/slic3r/GUI/DoubleSlider.cpp:1134 src/slic3r/GUI/DoubleSlider.cpp:1170
-#: src/slic3r/GUI/GLCanvas3D.cpp:977 src/slic3r/GUI/GUI_ObjectList.cpp:1704
-#: src/slic3r/GUI/Tab.cpp:2320 src/libslic3r/GCode/PreviewData.cpp:445
-#, c-format
+#: src/slic3r/GUI/DoubleSlider.cpp:1263 src/slic3r/GUI/DoubleSlider.cpp:1297
+#: src/slic3r/GUI/GLCanvas3D.cpp:983 src/slic3r/GUI/GUI_ObjectList.cpp:1832
+#: src/slic3r/GUI/Tab.cpp:2489 src/libslic3r/GCode/PreviewData.cpp:450
+#, possible-c-format
msgid "Extruder %d"
msgstr "Extruder %d"
-#: src/slic3r/GUI/DoubleSlider.cpp:1011
+#: src/slic3r/GUI/DoubleSlider.cpp:1137
msgid "Extruder (tool) is changed to Extruder \"%1%\""
msgstr "Extruder (Werkzeug) ist geändert auf Extruder \"%1%\""
-#: src/slic3r/GUI/ConfigWizard.cpp:1017
-msgid "Extruder and Bed Temperatures"
-msgstr "Extruder- und Druckbetttemperatur"
-
#: src/slic3r/GUI/WipeTowerDialog.cpp:255
msgid "Extruder changed to"
msgstr "Extruder geändert auf"
-#: src/slic3r/GUI/Tab.cpp:1233
-msgid "Extruder clearance (mm)"
-msgstr "Extruder Abstand (mm)"
+#: src/slic3r/GUI/Tab.cpp:1589
+msgid "Extruder clearance"
+msgstr "Extruder Freiraum"
-#: src/libslic3r/PrintConfig.cpp:522
+#: src/libslic3r/PrintConfig.cpp:558
msgid "Extruder Color"
msgstr "Extruder Farbe"
-#: src/libslic3r/PrintConfig.cpp:529
+#: src/libslic3r/PrintConfig.cpp:565
msgid "Extruder offset"
msgstr "Extruder Offset"
-#: src/libslic3r/PrintConfig.cpp:911
-msgid "Extruder temperature for first layer. If you want to control temperature manually during print, set this to zero to disable temperature control commands in the output file."
-msgstr "Extrudertemperatur für die erste Schicht. Wenn Sie die Temperatur während des Druckvorgangs manuell regeln möchten, setzen Sie diesen Wert auf null, um die Temperatursteuerbefehle in der Ausgabedatei zu deaktivieren."
-
-#: src/libslic3r/PrintConfig.cpp:2065
-msgid "Extruder temperature for layers after the first one. Set this to zero to disable temperature control commands in the output."
-msgstr "Extrudertemperatur für Schichten nach der ersten Schicht. Setzen Sie diesen Wert auf null, um die Temperaturregelbefehle in der Ausgabedatei zu deaktivieren."
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:99 src/slic3r/GUI/GUI_ObjectList.cpp:617
-#: src/slic3r/GUI/Tab.cpp:1180 src/slic3r/GUI/Tab.cpp:1838
-#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:1002
-#: src/libslic3r/PrintConfig.cpp:1409 src/libslic3r/PrintConfig.cpp:1737
-#: src/libslic3r/PrintConfig.cpp:1938 src/libslic3r/PrintConfig.cpp:1965
+#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:656
+#: src/slic3r/GUI/Tab.cpp:1510 src/slic3r/GUI/Tab.cpp:2072
+#: src/libslic3r/PrintConfig.cpp:524 src/libslic3r/PrintConfig.cpp:1046
+#: src/libslic3r/PrintConfig.cpp:1517 src/libslic3r/PrintConfig.cpp:1852
+#: src/libslic3r/PrintConfig.cpp:2080 src/libslic3r/PrintConfig.cpp:2107
msgid "Extruders"
msgstr "Extruder"
-#: src/libslic3r/PrintConfig.cpp:539
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1061
+msgid "Extruders count"
+msgstr "Extruder Anzahl"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2493
+msgid "Extrusion"
+msgstr "Extrusion"
+
+#: src/libslic3r/PrintConfig.cpp:575
msgid "Extrusion axis"
msgstr "Extrusionsachse"
-#: src/libslic3r/PrintConfig.cpp:545
+#: src/libslic3r/PrintConfig.cpp:581
msgid "Extrusion multiplier"
msgstr "Extrusionsfaktor"
-#: src/slic3r/GUI/ConfigWizard.cpp:1037
+#: src/slic3r/GUI/ConfigWizard.cpp:1403
msgid "Extrusion Temperature:"
msgstr "Extrusionstemperatur:"
-#: src/slic3r/GUI/Tab.cpp:1205
+#: src/slic3r/GUI/Tab.cpp:1535
msgid "Extrusion width"
msgstr "Extrusionbreite"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:100 src/slic3r/GUI/GUI_ObjectList.cpp:618
-#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:555
-#: src/libslic3r/PrintConfig.cpp:877 src/libslic3r/PrintConfig.cpp:1010
-#: src/libslic3r/PrintConfig.cpp:1418 src/libslic3r/PrintConfig.cpp:1757
-#: src/libslic3r/PrintConfig.cpp:1947 src/libslic3r/PrintConfig.cpp:2106
+#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:657
+#: src/libslic3r/PrintConfig.cpp:483 src/libslic3r/PrintConfig.cpp:591
+#: src/libslic3r/PrintConfig.cpp:919 src/libslic3r/PrintConfig.cpp:1054
+#: src/libslic3r/PrintConfig.cpp:1526 src/libslic3r/PrintConfig.cpp:1872
+#: src/libslic3r/PrintConfig.cpp:2089 src/libslic3r/PrintConfig.cpp:2249
msgid "Extrusion Width"
msgstr "Extrusionsbreite"
-#: src/slic3r/GUI/Plater.cpp:162
+#: src/slic3r/GUI/Plater.cpp:168
msgid "Facets"
msgstr "Flächen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:349
+#: src/slic3r/GUI/GUI_ObjectList.cpp:396
msgid "facets added"
msgstr "Facetten hinzugefügt"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:348
+#: src/slic3r/GUI/GUI_ObjectList.cpp:395
msgid "facets removed"
msgstr "Facetten enfernt"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:350
+#: src/slic3r/GUI/GUI_ObjectList.cpp:397
msgid "facets reversed"
msgstr "Facetten umgekehrt"
-#: src/libslic3r/PrintConfig.cpp:2517
+#: src/libslic3r/PrintConfig.cpp:2660
msgid "Faded layers"
msgstr "Ausblendende Schichten"
-#: src/libslic3r/Zipper.cpp:44
+#: src/libslic3r/miniz_extension.cpp:103
msgid "failed finding central directory"
msgstr "Zentrales Verzeichnis nicht gefunden"
@@ -2734,105 +3165,135 @@ msgstr "Zentrales Verzeichnis nicht gefunden"
msgid "Failed loading the input model."
msgstr "Das Laden des Inputmodells ist fehlgeschlagen."
-#: src/libslic3r/PrintBase.cpp:71
+#: src/libslic3r/PrintBase.cpp:72
msgid "Failed processing of the output_filename_format template."
msgstr "Die Verarbeitung der output_filename_format Vorlage ist fehlgeschlagen."
-#: src/slic3r/GUI/PresetHints.cpp:42
-msgid "Fan"
-msgstr "Kühllüfter"
+#: src/slic3r/GUI/GUI_App.cpp:1648
+msgid "Failed to activate configuration snapshot."
+msgstr "Konfigurations-Snapshot konnte nicht aktiviert werden."
-#: src/slic3r/GUI/Tab.cpp:1456
+#: src/slic3r/GUI/Tab.cpp:1802
msgid "Fan settings"
msgstr "Lüfter Einstellungen"
-#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/Tab.cpp:1457
+#: src/slic3r/GUI/GUI_Preview.cpp:279 src/slic3r/GUI/Tab.cpp:1803
msgid "Fan speed"
msgstr "Lüftergeschwindigkeit"
-#: src/libslic3r/GCode/PreviewData.cpp:353
+#: src/slic3r/GUI/GCodeViewer.cpp:2239 src/libslic3r/GCode/PreviewData.cpp:358
msgid "Fan Speed (%)"
msgstr "Lüftergeschwindigkeit (%)"
-#: src/libslic3r/PrintConfig.cpp:2405
+#: src/slic3r/GUI/PresetHints.cpp:49
+msgid "Fan speed will be ramped from zero at layer %1% to %2%%% at layer %3%."
+msgstr "Die Lüfterdrehzahl wird rampenförmig von Null bei Schicht %1% auf %2%%% bei Schicht %3% erhöht."
+
+#: src/libslic3r/PrintConfig.cpp:1001
+msgid "Fan speed will be ramped up linearly from zero at layer \"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower than \"disable_fan_first_layers\", in which case the fan will be running at maximum allowed speed at layer \"disable_fan_first_layers\" + 1."
+msgstr "Die Lüfterdrehzahl wird linear von Null bei der Schicht \"disable_fan_first_layers\" bis zum Maximum bei der Schicht \"full_fan_speed_layer\" hochgefahren. \"full_fan_speed_layer\" wird ignoriert, wenn sie niedriger ist als \"disable_fan_first_layers\", in diesem Fall läuft der Lüfter mit der maximal zulässigen Drehzahl auf Schicht \"disable_fan_first_layers\" + 1."
+
+#: src/slic3r/GUI/PresetHints.cpp:51
+msgid "Fan will always run at %1%%%"
+msgstr "Der Lüfter läuft immer mit %1%%%"
+
+#: src/slic3r/GUI/PresetHints.cpp:58
+msgid "Fan will be turned off."
+msgstr "Der Lüfter wird ausgeschaltet."
+
+#: src/libslic3r/PrintConfig.cpp:2548
msgid "Fast"
msgstr "Schnell"
-#: src/libslic3r/PrintConfig.cpp:2406
+#: src/libslic3r/PrintConfig.cpp:2549
msgid "Fast tilt"
msgstr "Schnelles Kippen"
-#: src/slic3r/GUI/GUI_App.cpp:141
+#: src/slic3r/GUI/GUI_App.cpp:531
msgid "Fatal error"
msgstr "Fataler Fehler"
-#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/GUI_Preview.cpp:575
-#: src/libslic3r/GCode/PreviewData.cpp:345
+#: src/slic3r/GUI/GUI_Init.cpp:88
+msgid "Fatal error, exception catched: %1%"
+msgstr "Fataler Fehler, abgefangene Ausnahme: %1%"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2225 src/slic3r/GUI/GCodeViewer.cpp:2233
+#: src/slic3r/GUI/GUI_Preview.cpp:275 src/slic3r/GUI/GUI_Preview.cpp:787
+#: src/libslic3r/GCode/PreviewData.cpp:350
msgid "Feature type"
msgstr "Merkmalstyp"
-#: src/slic3r/GUI/GUI_Preview.cpp:234 src/slic3r/GUI/GUI_Preview.cpp:235
+#: src/slic3r/GUI/GUI_Preview.cpp:293 src/slic3r/GUI/GUI_Preview.cpp:295
+#: src/slic3r/GUI/GUI_Preview.cpp:316
msgid "Feature types"
msgstr "Merkmalstypen"
-#: src/slic3r/GUI/ConfigWizard.cpp:1525
+#: src/slic3r/GUI/ConfigWizard.cpp:1926
msgid "FFF Technology Printers"
msgstr "FFF Technologie Drucker"
-#: src/slic3r/GUI/Plater.cpp:816 src/slic3r/GUI/Tab.cpp:1425
-#: src/slic3r/GUI/Tab.cpp:1426
+#: src/slic3r/GUI/Plater.cpp:691 src/slic3r/GUI/Tab.cpp:1770
+#: src/slic3r/GUI/Tab.cpp:1771
msgid "Filament"
msgstr "Filament"
-#: src/slic3r/GUI/Preset.cpp:1522
+#: src/libslic3r/Preset.cpp:1301
msgid "filament"
msgstr "Filament"
-#: src/slic3r/GUI/ConfigWizard.cpp:952
+#: src/slic3r/GUI/ConfigWizard.cpp:1318
msgid "Filament and Nozzle Diameters"
msgstr "Filament- und Düsendurchmesser"
-#: src/slic3r/GUI/ConfigWizard.cpp:983
+#: src/slic3r/GUI/Plater.cpp:1189
+msgid "Filament at extruder %1%"
+msgstr "Filament auf Extruder %1%"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1349
msgid "Filament Diameter:"
msgstr "Filamentdurchmesser:"
-#: src/libslic3r/PrintConfig.cpp:651
+#: src/libslic3r/PrintConfig.cpp:687
msgid "Filament is cooled by being moved back and forth in the cooling tubes. Specify desired number of these moves."
msgstr "Das Filament wird durch Hin- und Herbewegen in den Kühlschläuchen abgekühlt. Geben Sie die gewünschte Anzahl dieser Bewegungen an."
-#: src/libslic3r/PrintConfig.cpp:686
+#: src/libslic3r/PrintConfig.cpp:722
msgid "Filament load time"
msgstr "Filament Ladezeit"
-#: src/libslic3r/PrintConfig.cpp:588
+#: src/libslic3r/PrintConfig.cpp:624
msgid "Filament notes"
msgstr "Filament Bemerkungen"
-#: src/slic3r/GUI/Tab.cpp:1323 src/slic3r/GUI/Tab.cpp:1378
+#: src/slic3r/GUI/Tab.cpp:1669
msgid "Filament Overrides"
msgstr "Filament Ãœbersteuerung"
-#: src/libslic3r/PrintConfig.cpp:1381
+#: src/libslic3r/PrintConfig.cpp:1489
msgid "Filament parking position"
msgstr "Filament Parkposition"
-#: src/slic3r/GUI/ConfigWizard.cpp:2013
+#: src/slic3r/GUI/ConfigWizard.cpp:2524
msgid "Filament Profiles Selection"
msgstr "Filament Profile Auswahl"
-#: src/slic3r/GUI/Tab.cpp:1471
+#: src/slic3r/GUI/Tab.cpp:1817
msgid "Filament properties"
msgstr "Filament Eigenschaften"
-#: src/slic3r/GUI/Tab.hpp:355
+#: src/slic3r/GUI/Tab.hpp:409
msgid "Filament Settings"
msgstr "Filamenteinstellungen"
-#: src/libslic3r/PrintConfig.cpp:726
+#: src/slic3r/GUI/GLCanvas3D.cpp:4304 src/slic3r/GUI/GLCanvas3D.cpp:4940
+msgid "Filament Settings Tab"
+msgstr "Filamenteinstellungsreiter"
+
+#: src/libslic3r/PrintConfig.cpp:762
msgid "Filament type"
msgstr "Filament Typ"
-#: src/libslic3r/PrintConfig.cpp:701
+#: src/libslic3r/PrintConfig.cpp:737
msgid "Filament unload time"
msgstr "Filament Entladezeit"
@@ -2840,83 +3301,103 @@ msgstr "Filament Entladezeit"
msgid "filaments"
msgstr "Filamente"
-#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2013
+#: src/slic3r/GUI/ConfigWizard.cpp:1872 src/slic3r/GUI/ConfigWizard.cpp:2524
msgid "Filaments"
msgstr "Filamente"
-#: src/libslic3r/Zipper.cpp:72
+#: src/slic3r/GUI/ConfigWizard.cpp:691
+msgid "Filaments marked with <b>*</b> are <b>not</b> compatible with some installed printers."
+msgstr "Mit <b>*</b> markierte Filamente sind <b>nicht</b> kompatibel mit einigen installierten Druckern."
+
+#: src/libslic3r/miniz_extension.cpp:131
msgid "file close failed"
msgstr "Dateischließen fehlgeschlagen"
-#: src/libslic3r/Zipper.cpp:66
+#: src/libslic3r/miniz_extension.cpp:125
msgid "file create failed"
msgstr "Dateierzeugen fehlgeschlagen"
-#: src/slic3r/GUI/MainFrame.cpp:791
+#: src/slic3r/GUI/MainFrame.cpp:1492
msgid "File Not Found"
msgstr "Datei nicht gefunden"
-#: src/libslic3r/Zipper.cpp:86
+#: src/libslic3r/miniz_extension.cpp:145
msgid "file not found"
msgstr "Datei nicht gefunden"
-#: src/libslic3r/Zipper.cpp:64
+#: src/libslic3r/miniz_extension.cpp:123
msgid "file open failed"
msgstr "Öffnen der Datei fehlgeschlagen"
-#: src/libslic3r/Zipper.cpp:70
+#: src/libslic3r/miniz_extension.cpp:129
msgid "file read failed"
msgstr "Dateilesen fehlgeschlagen"
-#: src/libslic3r/Zipper.cpp:74
+#: src/libslic3r/miniz_extension.cpp:133
msgid "file seek failed"
msgstr "Dateizugriff fehlgeschlagen"
-#: src/libslic3r/Zipper.cpp:76
+#: src/libslic3r/miniz_extension.cpp:135
msgid "file stat failed"
msgstr "Zugriff auf Dateieigenschaften fehlgeschlagen"
-#: src/libslic3r/Zipper.cpp:36
+#: src/libslic3r/miniz_extension.cpp:95
msgid "file too large"
msgstr "Datei zu groß"
-#: src/libslic3r/Zipper.cpp:68
+#: src/libslic3r/miniz_extension.cpp:127
msgid "file write failed"
msgstr "Schreiben der Datei fehlgeschlagen"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:153
+#: src/slic3r/GUI/PrintHostDialogs.cpp:151
msgid "Filename"
msgstr "Dateiname"
-#: src/libslic3r/PrintConfig.cpp:775
+#: src/slic3r/GUI/ConfigWizard.cpp:1181
+msgid "Files association"
+msgstr "Zuordnung der Dateien"
+
+#: src/libslic3r/PrintConfig.cpp:811
msgid "Fill angle"
msgstr "Füllwinkel"
-#: src/libslic3r/PrintConfig.cpp:789
+#: src/slic3r/GUI/Plater.cpp:1651
+msgid "Fill bed"
+msgstr "Bett auffüllen"
+
+#: src/slic3r/GUI/Plater.cpp:3936
+msgid "Fill bed with instances"
+msgstr "Bett mit Kopien auffüllen"
+
+#: src/libslic3r/PrintConfig.cpp:825
msgid "Fill density"
msgstr "Fülldichte"
-#: src/libslic3r/PrintConfig.cpp:826
+#: src/libslic3r/PrintConfig.cpp:862
msgid "Fill pattern"
msgstr "Füllmuster"
-#: src/libslic3r/PrintConfig.cpp:437
+#: src/libslic3r/PrintConfig.cpp:473
msgid "Fill pattern for bottom infill. This only affects the bottom external visible layer, and not its adjacent solid shells."
msgstr "Füllmuster für die Boden Füllung. Dies wirkt sich nur auf die äußere sichtbare Bodenschicht aus, nicht aber auf die angrenzenden massiven Konturen."
-#: src/libslic3r/PrintConfig.cpp:828
+#: src/libslic3r/PrintConfig.cpp:864
msgid "Fill pattern for general low-density infill."
msgstr "Füllmuster für allgemeines Infill mit niedriger Dichte."
-#: src/libslic3r/PrintConfig.cpp:417
+#: src/libslic3r/PrintConfig.cpp:451
msgid "Fill pattern for top infill. This only affects the top visible layer, and not its adjacent solid shells."
msgstr "Füllmuster für die obere Füllung. Dies betrifft nur die obere sichtbare Schicht und nicht die angrenzenden massiven Konturen."
+#: src/slic3r/GUI/Plater.cpp:3936
+msgid "Fill the remaining area of bed with instances of the selected object"
+msgstr "Den verbleibenden Bereich des Bettes mit Kopien des ausgewählten Objekts auffüllen"
+
#: src/slic3r/GUI/BonjourDialog.cpp:225
msgid "Finished"
msgstr "Fertig"
-#: src/slic3r/GUI/ConfigWizard.cpp:891 src/slic3r/GUI/Tab.cpp:1947
+#: src/slic3r/GUI/ConfigWizard.cpp:1257 src/slic3r/GUI/Tab.cpp:2132
msgid "Firmware"
msgstr "Firmware"
@@ -2928,44 +3409,56 @@ msgstr "Firmware Flasher"
msgid "Firmware image:"
msgstr "Firmware Image:"
-#: src/slic3r/GUI/Tab.cpp:2577
+#: src/slic3r/GUI/Tab.cpp:2733
msgid "Firmware Retraction"
msgstr "Firmware Einzug"
-#: src/slic3r/GUI/ConfigWizard.cpp:891
+#: src/slic3r/GUI/ConfigWizard.cpp:1257
msgid "Firmware Type"
msgstr "Firmware Typ"
-#: src/libslic3r/PrintConfig.cpp:859 src/libslic3r/PrintConfig.cpp:868
-#: src/libslic3r/PrintConfig.cpp:876 src/libslic3r/PrintConfig.cpp:910
+#: src/libslic3r/PrintConfig.cpp:899 src/libslic3r/PrintConfig.cpp:908
+#: src/libslic3r/PrintConfig.cpp:918 src/libslic3r/PrintConfig.cpp:952
msgid "First layer"
msgstr "Erste Schicht"
-#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:889
+#: src/libslic3r/PrintConfig.cpp:909
+msgid "First layer bed temperature"
+msgstr "Erste Schicht Bett-Temperatur"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:60 src/libslic3r/PrintConfig.cpp:931
msgid "First layer height"
msgstr "Höhe der ersten Schicht"
-#: src/libslic3r/Print.cpp:1422
+#: src/libslic3r/Print.cpp:1448
msgid "First layer height can't be greater than nozzle diameter"
msgstr "Schichthöhe der ersten Schicht darf nicht größer sein als der Düsendurchmesser"
-#: src/libslic3r/PrintConfig.cpp:900
+#: src/libslic3r/PrintConfig.cpp:960
+msgid "First layer nozzle temperature"
+msgstr "Erste Schicht Düsentemperatur"
+
+#: src/libslic3r/PrintConfig.cpp:942
msgid "First layer speed"
msgstr "Druckgeschwindigkeit der ersten Schicht"
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:218
msgid "First layer volumetric"
msgstr "Volumenparameter der ersten Schicht"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1647
+#: src/slic3r/GUI/Plater.cpp:3380
+msgid "Fix through NetFabb"
+msgstr "Reparieren mittels Netfabb"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1776
msgid "Fix through the Netfabb"
msgstr "Reparieren mittels Netfabb"
-#: src/slic3r/GUI/Plater.cpp:3473
+#: src/slic3r/GUI/Plater.cpp:3278
msgid "Fix Throught NetFabb"
msgstr "Reparieren mittels Netfabb"
-#: src/slic3r/GUI/GUI_App.cpp:824
+#: src/slic3r/GUI/GUI_App.cpp:1522
msgid "Flash printer &firmware"
msgstr "Flashe Drucker &Firmware"
@@ -2993,50 +3486,52 @@ msgstr "Es wird geflashed. Bitte nicht den Drucker abklemmen!"
msgid "Flashing succeeded!"
msgstr "Flashen erfolgreich!"
-#: src/slic3r/GUI/Tab.cpp:1218
+#: src/slic3r/GUI/Tab.cpp:1548
msgid "Flow"
msgstr "Fluss"
-#: src/slic3r/GUI/PresetHints.cpp:220
+#: src/libslic3r/PrintConfig.cpp:1145
+msgid "Flow rate"
+msgstr "Flussrate"
+
+#: src/slic3r/GUI/PresetHints.cpp:219
msgid "flow rate is maximized"
msgstr "die Durchflussmenge ist am Maximum"
-#: src/slic3r/GUI/UpdateDialogs.cpp:286
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:555
+msgid "Following printer preset(s) is duplicated:%1%The above preset for printer \"%2%\" will be used just once."
+msgstr "Folgende Druckervoreinstellung(en) wird (werden) dupliziert:%1% Die obige Voreinstellung für den Drucker \"%2%\" wird nur einmal verwendet."
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:287
msgid "For more information please visit our wiki page:"
msgstr "Für weitere Informationen besuchen Sie bitte unsere Wiki-Seite:"
-#: src/slic3r/GUI/Plater.cpp:501 src/slic3r/GUI/Plater.cpp:624
+#: src/slic3r/GUI/Plater.cpp:367 src/slic3r/GUI/Plater.cpp:490
msgid "For support enforcers only"
msgstr "Nur für Stützverstärker"
#. TRN Description for "WHITE BULLET"
-#: src/slic3r/GUI/Tab.cpp:3267
-msgid ""
-"for the left button: indicates a non-system (or non-default) preset,\n"
-"for the right button: indicates that the settings hasn't been modified."
-msgstr ""
-"Beim linken Knopf: zeigt eine Nicht-System- (oder Nicht-Standard-) Einstellung an.\n"
-"Beim rechten Knopf: zeigt an, dass die Einstellung nicht geändert wurde."
+#: src/slic3r/GUI/Tab.cpp:3702
+msgid "for the left button: indicates a non-system (or non-default) preset,\nfor the right button: indicates that the settings hasn't been modified."
+msgstr "Beim linken Knopf: zeigt eine Nicht-System- (oder Nicht-Standard-) Einstellung an.\nBeim rechten Knopf: zeigt an, dass die Einstellung nicht geändert wurde."
-#: src/slic3r/GUI/ConfigManipulation.cpp:136
-msgid ""
-"For the Wipe Tower to work with the soluble supports, the support layers\n"
-"need to be synchronized with the object layers."
+#: src/slic3r/GUI/ConfigManipulation.cpp:135
+msgid "For the Wipe Tower to work with the soluble supports, the support layers\nneed to be synchronized with the object layers."
msgstr "Damit der Reinigungsturm mit den löslichen Trägermaterialien arbeiten kann, müssen die Stützschichten mit den Objektschichten synchronisiert sein."
-#: src/libslic3r/Print.cpp:1396
+#: src/libslic3r/Print.cpp:1422
msgid "For the Wipe Tower to work with the soluble supports, the support layers need to be synchronized with the object layers."
msgstr "Damit der Reinigungsturm mit den löslichen Trägermaterialien arbeiten kann, müssen die Stützschichten mit den Objektschichten synchronisiert sein."
-#: src/libslic3r/PrintConfig.cpp:2864
+#: src/libslic3r/PrintConfig.cpp:3028
msgid "Force pad around object everywhere"
msgstr "Grundschicht überall um Objekt erzwingen"
-#: src/libslic3r/PrintConfig.cpp:1729
+#: src/libslic3r/PrintConfig.cpp:1844
msgid "Force solid infill for regions having a smaller area than the specified threshold."
msgstr "Massives Infill für Bereiche, die eine kleinere Fläche als die angegebene Schwelle aufweisen."
-#: src/libslic3r/PrintConfig.cpp:1072
+#: src/libslic3r/PrintConfig.cpp:1116
msgid "Force the generation of solid shells between adjacent materials/volumes. Useful for multi-extruder prints with translucent materials or manual soluble support material."
msgstr "Erzwingt die Erzeugung von massiven Schalen zwischen benachbarten Materialien/Volumina. Geeignet für Multiextruderdrucke mit transluzenten Materialien oder manuell löslichen Trägermaterialien."
@@ -3044,248 +3539,317 @@ msgstr "Erzwingt die Erzeugung von massiven Schalen zwischen benachbarten Materi
msgid "From"
msgstr "Von"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2223
+#: src/slic3r/GUI/GCodeViewer.cpp:2197
+msgid "from"
+msgstr "von"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2389
msgid "From Object List You can't delete the last solid part from object."
msgstr "Sie können nicht das letzte solide Teil des Objekts von der Objektliste löschen."
-#: src/slic3r/GUI/MainFrame.cpp:667
+#: src/slic3r/GUI/MainFrame.cpp:964 src/slic3r/GUI/MainFrame.cpp:1284
msgid "Front"
msgstr "Front"
-#: src/slic3r/GUI/MainFrame.cpp:667
+#: src/slic3r/GUI/MainFrame.cpp:964 src/slic3r/GUI/MainFrame.cpp:1284
msgid "Front View"
msgstr "Frontalansicht"
-#: src/slic3r/GUI/Tab.cpp:1013
+#: src/libslic3r/PrintConfig.cpp:1000
+msgid "Full fan speed at layer"
+msgstr "Volle Lüfterdrehzahl auf Schicht"
+
+#: src/slic3r/GUI/Tab.cpp:1331
msgid "full profile name"
msgstr "vollständiger Profilname"
-#: src/slic3r/GUI/MainFrame.cpp:826
+#: src/libslic3r/PrintConfig.cpp:817
+msgid "g"
+msgstr "g"
+
+#: src/slic3r/GUI/MainFrame.cpp:1527
msgid "G-code"
msgstr "G-Code"
-#: src/slic3r/GUI/DoubleSlider.cpp:1021
-msgid ""
-"G-code associated to this tick mark is in a conflict with print mode.\n"
-"Editing it will cause changes of Slider data."
-msgstr ""
-"Der mit diesem Häkchen verbundene G-Code steht in Konflikt mit dem Druckmodus.\n"
-"Seine Bearbeitung führt zu Änderungen der Slicer-Daten."
+#: src/slic3r/GUI/DoubleSlider.cpp:1146
+msgid "G-code associated to this tick mark is in a conflict with print mode.\nEditing it will cause changes of Slider data."
+msgstr "Der mit diesem Häkchen verbundene G-Code steht in Konflikt mit dem Druckmodus.\nSeine Bearbeitung führt zu Änderungen der Slicer-Daten."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:130
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:165
msgid "G-code file exported to %1%"
msgstr "G-Code Datei exportiert nach %1%"
-#: src/libslic3r/PrintConfig.cpp:936
+#: src/libslic3r/PrintConfig.cpp:980
msgid "G-code flavor"
msgstr "G-Code Typ"
-#: src/libslic3r/PrintConfig.cpp:721
+#: src/slic3r/GUI/MainFrame.cpp:66 src/slic3r/GUI/MainFrame.cpp:79
+msgid "G-code preview"
+msgstr "G-Code Vorschau"
+
+#: src/libslic3r/PrintConfig.cpp:66
+msgid "G-code thumbnails"
+msgstr "G-Code-Miniaturbilder"
+
+#: src/libslic3r/PrintConfig.cpp:3552
+msgid "G-code viewer"
+msgstr "G-Code-Viewer"
+
+#: src/libslic3r/PrintConfig.cpp:757
msgid "g/cm³"
msgstr "g/cm³"
-#: src/libslic3r/PrintConfig.cpp:2505
+#: src/libslic3r/PrintConfig.cpp:2648
msgid "g/ml"
msgstr "g/ml"
-#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:317
-#: src/libslic3r/PrintConfig.cpp:918
+#: src/slic3r/GUI/GUI_Preview.cpp:309 src/libslic3r/ExtrusionEntity.cpp:322
+#: src/libslic3r/ExtrusionEntity.cpp:352 src/libslic3r/PrintConfig.cpp:962
msgid "Gap fill"
msgstr "Lückenfüllung"
-#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1796
-#: src/slic3r/GUI/Tab.cpp:2040
+#: src/slic3r/GUI/Preferences.cpp:24 src/slic3r/GUI/Tab.cpp:2058
+#: src/slic3r/GUI/Tab.cpp:2240 src/slic3r/GUI/Tab.cpp:2348
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1066
msgid "General"
msgstr "Allgemein"
-#: src/libslic3r/PrintConfig.cpp:1307
+#: src/libslic3r/PrintConfig.cpp:1415
msgid "Generate no less than the number of skirt loops required to consume the specified amount of filament on the bottom layer. For multi-extruder machines, this minimum applies to each extruder."
msgstr "Erzeugt nicht weniger als die Anzahl der Schürzenschleifen, die benötigt wird, um die angegebene Menge an Filament auf der unteren Schicht zu verbrauchen. Bei Multiextruder-Maschinen gilt dieses Minimum für jeden Extruder."
-#: src/libslic3r/PrintConfig.cpp:1865
+#: src/libslic3r/PrintConfig.cpp:2007
msgid "Generate support material"
-msgstr "Generiere Stützstrukturen"
+msgstr "Generiere Stützmaterial"
-#: src/libslic3r/PrintConfig.cpp:1926
+#: src/libslic3r/PrintConfig.cpp:2068
msgid "Generate support material for the specified number of layers counting from bottom, regardless of whether normal support material is enabled or not and regardless of any angle threshold. This is useful for getting more adhesion of objects having a very thin or poor footprint on the build plate."
-msgstr "Generiere Stützstrukturen für die angegebene Anzahl von Schichten, die von unten gezählt werden, unabhängig davon, ob normale Stützstrukturen aktiviert sind oder nicht und unabhängig von einer Winkelschwelle. Dies ist nützlich, um die Haftung von Objekten mit einem sehr dünnen oder schlechten Standfuß auf der Bauplatte zu erhöhen."
+msgstr "Generiere Stützmaterial für die angegebene Anzahl von Schichten, die von unten gezählt werden, unabhängig davon, ob normales Stützmaterial aktiviert ist oder nicht und unabhängig von einer Winkelschwelle. Dies ist nützlich, um die Haftung von Objekten mit einem sehr dünnen oder schlechten Standfuß auf der Bauplatte zu erhöhen."
-#: src/libslic3r/PrintConfig.cpp:2613
+#: src/libslic3r/PrintConfig.cpp:2756
msgid "Generate supports"
-msgstr "Stützstrukturen generieren"
+msgstr "Stützen generieren"
-#: src/libslic3r/PrintConfig.cpp:2615
+#: src/libslic3r/PrintConfig.cpp:2758
msgid "Generate supports for the models"
-msgstr "Erzeugt Stützstrukturen für die Modelle"
+msgstr "Erzeugt Stützen für die Modelle"
+
+#: src/slic3r/GUI/Plater.cpp:3554
+msgid "generated warnings"
+msgstr "erzeugte Warnungen"
-#: src/libslic3r/Print.cpp:1614
+#: src/libslic3r/Print.cpp:1645
msgid "Generating brim"
msgstr "Generiere Rand"
-#: src/libslic3r/Print.cpp:1642
+#: src/libslic3r/Print.cpp:1680
msgid "Generating G-code"
msgstr "Generiere G-Code"
-#: src/libslic3r/SLAPrintSteps.cpp:48
+#: src/slic3r/GUI/GCodeViewer.cpp:1392
+msgid "Generating index buffers"
+msgstr "Generiere Indexpuffer"
+
+#: src/libslic3r/SLAPrintSteps.cpp:49
msgid "Generating pad"
msgstr "Generiere Grundschicht"
-#: src/libslic3r/PrintObject.cpp:152
+#: src/libslic3r/PrintObject.cpp:158
msgid "Generating perimeters"
msgstr "Generiere Außenkonturen"
-#: src/libslic3r/Print.cpp:1606
+#: src/libslic3r/Print.cpp:1636
msgid "Generating skirt"
msgstr "Generiere Schürze"
-#: src/libslic3r/PrintObject.cpp:395
+#: src/libslic3r/PrintObject.cpp:422
msgid "Generating support material"
-msgstr "Generiere Stützstrukturen"
+msgstr "Generiere Stützmaterial"
-#: src/libslic3r/SLAPrintSteps.cpp:46 src/libslic3r/SLAPrintSteps.cpp:356
+#: src/libslic3r/SLAPrintSteps.cpp:47 src/libslic3r/SLAPrintSteps.cpp:359
msgid "Generating support points"
msgstr "Erzeuge Stützpunkte"
-#: src/libslic3r/SLAPrintSteps.cpp:47
+#: src/libslic3r/SLAPrintSteps.cpp:48
msgid "Generating support tree"
msgstr "Erzeuge Baumstützstruktur"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2022
+#: src/slic3r/GUI/GCodeViewer.cpp:933
+msgid "Generating toolpaths"
+msgstr "Generiere Werkzeugwege"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:1318
+msgid "Generating vertex buffer"
+msgstr "Erzeuge den Vertex-Puffer"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2181
msgid "Generic"
msgstr "Generisch"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
+#: src/slic3r/Utils/PresetUpdater.cpp:600
+msgid "getting config updates"
+msgstr "Abrufen von Konfigurations-Updates"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
msgid "Gizmo cut"
msgstr "Gizmo Schnitt"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:172
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
msgid "Gizmo move"
msgstr "Gizmo Bewegung"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:176
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:198
+msgid "Gizmo move: Press to snap by 1mm"
+msgstr "Gizmo Bewegung: Drücken um um 1 mm zu Rasten"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
msgid "Gizmo Place face on bed"
msgstr "Gizmo auf Fläche platzieren"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:174
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
msgid "Gizmo rotate"
msgstr "Gizmo Rotieren"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:173
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:203
+msgid "Gizmo rotate: Press to rotate selected objects around their own center"
+msgstr "Gizmo Rotieren: Drücken, um ausgewählte Objekte um ihr eigenes Zentrum zu drehen"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
msgid "Gizmo scale"
msgstr "Gizmo Skalieren"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:177
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:201
+msgid "Gizmo scale: Press to activate one direction scaling"
+msgstr "Gizmo Skalieren: Drücken, um Eine-Richtung-Skalierung zu aktivieren"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:202
+msgid "Gizmo scale: Press to scale selected objects around their own center"
+msgstr "Gizmo Skalieren: Drücken, um ausgewählte Objekte um ihr eigenes Zentrum zu skalieren"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:199
+msgid "Gizmo scale: Press to snap by 5%"
+msgstr "Gizmo Skalieren: Drücken, um um 5% zu rasten"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:200
+msgid "Gizmo scale: Scale selection to fit print volume"
+msgstr "Gizmo Skalieren: Auswahl skalieren, um in das Druckvolumen zu passen"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
msgid "Gizmo SLA hollow"
msgstr "Gizmo SLA Aushöhlung"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:178
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:172
msgid "Gizmo SLA support points"
msgstr "Gizmo SLA Stützpunkte"
-#: src/slic3r/GUI/GLCanvas3D.cpp:2921
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562
+#: src/slic3r/GUI/GLCanvas3D.cpp:3165
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:520
msgid "Gizmo-Move"
msgstr "Gizmo Bewegen"
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:489
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:639
msgid "Gizmo-Place on Face"
msgstr "Gizmo Auf Fläche legen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:3001
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:564
+#: src/slic3r/GUI/GLCanvas3D.cpp:3249
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:522
msgid "Gizmo-Rotate"
msgstr "Gizmo-Rotation"
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:563
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:521
msgid "Gizmo-Scale"
msgstr "Gizmo Skalierung"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:201
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:199
msgid "Gizmos"
msgstr "Gizmos"
-#: src/slic3r/GUI/AboutDialog.cpp:259
+#: src/slic3r/GUI/AboutDialog.cpp:284 src/slic3r/GUI/GUI_App.cpp:244
msgid "GNU Affero General Public License, version 3"
msgstr "GNU Affero General Public License, Version 3"
-#: src/slic3r/GUI/ConfigWizard.cpp:980
+#: src/slic3r/GUI/ConfigWizard.cpp:1346
msgid "Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average."
msgstr "Eine hohe Genauigkeit ist erforderlich, also verwenden Sie einen Messschieber und führen Sie mehrere Messungen entlang des Filaments durch, um dann den Mittelwert zu berechnen."
-#: src/libslic3r/PrintConfig.cpp:844
+#: src/libslic3r/PrintConfig.cpp:882
msgid "Grid"
msgstr "Gitternetz"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2454
+#: src/slic3r/GUI/PrintHostDialogs.cpp:57
+msgid "Group"
+msgstr "Gruppe"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2846
msgid "Group manipulation"
msgstr "Gruppenbearbeitung"
-#: src/slic3r/GUI/Preferences.cpp:133
+#: src/slic3r/GUI/Preferences.cpp:200
msgid "GUI"
msgstr "GUI"
-#: src/libslic3r/PrintConfig.cpp:852
+#: src/libslic3r/PrintConfig.cpp:890
msgid "Gyroid"
msgstr "Gyroid"
-#: src/slic3r/GUI/Tab.cpp:2937
-msgid "has the following unsaved changes:"
-msgstr "hat die folgenden ungesicherten Änderungen:"
-
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47
msgid "Head diameter"
msgstr "Kopfdurchmesser"
-#: src/slic3r/GUI/ConfigManipulation.cpp:317
+#: src/libslic3r/PrintConfig.cpp:2772
+msgid "Head penetration"
+msgstr "Kopfeindringung"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:322
msgid "Head penetration should not be greater than the head width."
msgstr "Die Kopfeindringung sollte nicht größer als die Kopfbreite sein."
-#: src/libslic3r/PrintConfig.cpp:869
+#: src/libslic3r/PrintConfig.cpp:910
msgid "Heated build plate temperature for the first layer. Set this to zero to disable bed temperature control commands in the output."
msgstr "Druckbetttemperatur für die erste Schicht. Setzen Sie diesen Wert auf null, um die Befehle zur Steuerung der Betttemperatur im Ausgang zu deaktivieren."
-#: src/slic3r/GUI/GUI_Preview.cpp:222 src/libslic3r/PrintConfig.cpp:500
+#: src/slic3r/GUI/GUI_Preview.cpp:276 src/libslic3r/PrintConfig.cpp:536
msgid "Height"
msgstr "Höhe"
-#: src/libslic3r/GCode/PreviewData.cpp:347
+#: src/slic3r/GUI/GCodeViewer.cpp:2236 src/libslic3r/GCode/PreviewData.cpp:352
msgid "Height (mm)"
msgstr "Höhe (mm)"
-#: src/libslic3r/PrintConfig.cpp:1688
+#: src/libslic3r/PrintConfig.cpp:1796
msgid "Height of skirt expressed in layers. Set this to a tall value to use skirt as a shield against drafts."
msgstr "Höhe der Schürze in Schichten. Eine hohe Schürze kann gegen Zugluft schützen."
-#: src/libslic3r/PrintConfig.cpp:2360
+#: src/libslic3r/PrintConfig.cpp:2503
msgid "Height of the display"
msgstr "Displayhöhe"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1500
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1631
msgid "Height range Modifier"
msgstr "Höhenbereich Modifizierer"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2507
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2899
msgid "Height ranges"
msgstr "Höhenbereiche"
-#: src/libslic3r/PrintConfig.cpp:261
+#: src/libslic3r/PrintConfig.cpp:295
msgid "Heights at which a filament change is to occur."
msgstr "Höhen, bei denen eine Filamentwechsel stattfinden soll."
-#: src/slic3r/GUI/ConfigWizard.cpp:433
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:451
+#, possible-c-format
msgid "Hello, welcome to %s! This %s helps you with the initial configuration; just a few settings and you will be ready to print."
msgstr "Hallo, willkommen bei %s! Dieses %s hilft Ihnen bei der Erstkonfiguration; nur ein paar Einstellungen und Sie sind bereit zum Drucken."
-#: src/libslic3r/PrintConfig.cpp:3365
+#: src/libslic3r/PrintConfig.cpp:3564
msgid "Help"
msgstr "Hilfe"
-#: src/libslic3r/PrintConfig.cpp:3371
+#: src/libslic3r/PrintConfig.cpp:3570
msgid "Help (FFF options)"
msgstr "Hilfe (FFF Optionen)"
-#: src/libslic3r/PrintConfig.cpp:3376
+#: src/libslic3r/PrintConfig.cpp:3575
msgid "Help (SLA options)"
msgstr "Hilfe (SLA Optionen)"
@@ -3293,96 +3857,100 @@ msgstr "Hilfe (SLA Optionen)"
msgid "Here you can adjust required purging volume (mm³) for any given pair of tools."
msgstr "Hier können Sie das erforderliche Reinigungsvolumen (mm³) für ein beliebiges Werkzeugpaar einstellen."
-#: src/libslic3r/PrintConfig.cpp:973
+#: src/slic3r/GUI/DoubleSlider.cpp:1849
+msgid "Hide ruler"
+msgstr "Lineal verbergen"
+
+#: src/libslic3r/PrintConfig.cpp:1017
msgid "High extruder current on filament swap"
msgstr "Hohe Extruderstromstärke beim Filamentwechsel"
-#: src/slic3r/GUI/GLCanvas3D.cpp:277
+#: src/slic3r/GUI/GLCanvas3D.cpp:263
msgid "Higher print quality versus higher print speed."
msgstr "Höhere Druckqualität versus höhere Druckgeschwindigkeit."
-#: src/libslic3r/PrintConfig.cpp:427 src/libslic3r/PrintConfig.cpp:853
+#: src/libslic3r/PrintConfig.cpp:463 src/libslic3r/PrintConfig.cpp:891
msgid "Hilbert Curve"
msgstr "HIlbertkurve"
-#: src/slic3r/GUI/Plater.cpp:1042
+#: src/slic3r/GUI/Plater.cpp:916
msgid "Hold Shift to Slice & Export G-code"
msgstr "Halten Sie die Umschalttaste gedrückt, um zu slicen und den G-Code zu exportieren"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46
msgid "Hole depth"
msgstr "Lochtiefe"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45
msgid "Hole diameter"
msgstr "Lochdurchmesser"
-#: src/slic3r/GUI/Plater.cpp:2760
-msgid "Hollow"
-msgstr "Aushöhlen"
-
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:977
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:785
msgid "Hollow and drill"
msgstr "Aushöhlen und Bohren"
-#: src/libslic3r/PrintConfig.cpp:2910
+#: src/libslic3r/PrintConfig.cpp:3074
msgid "Hollow out a model to have an empty interior"
msgstr "Ein Modell aushöhlen, um einen leeren Innenraum zu erhalten"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40
msgid "Hollow this object"
msgstr "Dieses Objekt aushöhlen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:108 src/slic3r/GUI/Tab.cpp:3654
-#: src/slic3r/GUI/Tab.cpp:3655 src/libslic3r/SLA/Hollowing.cpp:46
-#: src/libslic3r/SLA/Hollowing.cpp:58 src/libslic3r/SLA/Hollowing.cpp:67
-#: src/libslic3r/SLA/Hollowing.cpp:76 src/libslic3r/PrintConfig.cpp:2909
-#: src/libslic3r/PrintConfig.cpp:2916 src/libslic3r/PrintConfig.cpp:2926
-#: src/libslic3r/PrintConfig.cpp:2935
+#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:4073
+#: src/slic3r/GUI/Tab.cpp:4074 src/libslic3r/SLA/Hollowing.cpp:45
+#: src/libslic3r/SLA/Hollowing.cpp:57 src/libslic3r/SLA/Hollowing.cpp:66
+#: src/libslic3r/SLA/Hollowing.cpp:75 src/libslic3r/PrintConfig.cpp:3073
+#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090
+#: src/libslic3r/PrintConfig.cpp:3099
msgid "Hollowing"
msgstr "Aushöhlen"
-#: src/slic3r/GUI/Plater.cpp:2926
-msgid "Hollowing cancelled."
-msgstr "Aushöhlen abgebrochen."
-
-#: src/slic3r/GUI/Plater.cpp:2927
-msgid "Hollowing done."
-msgstr "Aushöhlung erledigt."
-
-#: src/slic3r/GUI/Plater.cpp:2929
-msgid "Hollowing failed."
-msgstr "Das Aushöhlen ist fehlgeschlagen."
-
-#: src/libslic3r/PrintConfig.cpp:2937
+#: src/libslic3r/PrintConfig.cpp:3101
msgid "Hollowing is done in two steps: first, an imaginary interior is calculated deeper (offset plus the closing distance) in the object and then it's inflated back to the specified offset. A greater closing distance makes the interior more rounded. At zero, the interior will resemble the exterior the most."
msgstr "Das Aushöhlen erfolgt in zwei Schritten: Zuerst wird ein imaginärer Innenraum tiefer (Versatz plus Schließabstand) in das Objekt hinein berechnet und dann wird es wieder auf den angegebenen Versatz aufgeblasen. Ein größerer Schließabstand macht den Innenraum runder. Bei Null wird der Innenraum dem Außenraum am ähnlichsten sein."
-#: src/libslic3r/SLAPrintSteps.cpp:43
+#: src/libslic3r/SLAPrintSteps.cpp:44
msgid "Hollowing model"
msgstr "Aushöhlen des Modells"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:813
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:624
msgid "Hollowing parameter change"
msgstr "Änderung der Aushöhlungsparameter"
-#: src/libslic3r/PrintConfig.cpp:850 src/libslic3r/PrintConfig.cpp:2011
+#: src/libslic3r/PrintConfig.cpp:888 src/libslic3r/PrintConfig.cpp:2153
msgid "Honeycomb"
msgstr "Bienenwabe"
-#: src/slic3r/GUI/Tab.cpp:1064
+#: src/slic3r/GUI/Tab.cpp:1386
msgid "Horizontal shells"
msgstr "Horizontale Konturhüllen"
-#: src/libslic3r/PrintConfig.cpp:245
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:253
+msgid "Horizontal Slider"
+msgstr "Horizontaler Schieberegler"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:209
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:213
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:238
+msgid "Horizontal slider - Move active thumb Left"
+msgstr "Horizontaler Schieberegler - Aktiven Schieber nach links bewegen"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:210
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:214
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:239
+msgid "Horizontal slider - Move active thumb Right"
+msgstr "Horizontaler Schieberegler - Aktiven Schieber nach rechts bewegen"
+
+#: src/libslic3r/PrintConfig.cpp:279
msgid "Horizontal width of the brim that will be printed around each object on the first layer."
msgstr "Horizontalbreite des Randes, der um jedes Objekt auf der Bodenschicht gedruckt wird."
-#: src/slic3r/GUI/PrintHostDialogs.cpp:152
+#: src/slic3r/GUI/PrintHostDialogs.cpp:150
msgid "Host"
msgstr "Host"
-#: src/libslic3r/PrintConfig.cpp:1332
+#: src/libslic3r/PrintConfig.cpp:1440
msgid "Host Type"
msgstr "Host Typ"
@@ -3390,197 +3958,275 @@ msgstr "Host Typ"
msgid "Hostname"
msgstr "Hostname"
-#: src/libslic3r/PrintConfig.cpp:97
+#: src/libslic3r/PrintConfig.cpp:99
msgid "Hostname, IP or URL"
msgstr "Hostname, IP oder URL"
-#: src/slic3r/GUI/Tab.cpp:139
-msgid ""
-"Hover the cursor over buttons to find more information \n"
-"or click this button."
-msgstr ""
-"Bewegen Sie den Mauszeiger über die Schaltflächen, um weitere Informationen zu erhalten,\n"
-"oder klicken Sie auf diese Schaltfläche."
+#: src/slic3r/GUI/Tab.cpp:210
+msgid "Hover the cursor over buttons to find more information \nor click this button."
+msgstr "Bewegen Sie den Mauszeiger über die Schaltflächen, um weitere Informationen zu erhalten,\noder klicken Sie auf diese Schaltfläche."
-#: src/libslic3r/PrintConfig.cpp:2812
+#: src/libslic3r/PrintConfig.cpp:2976
msgid "How far should the pad extend around the contained geometry"
msgstr "Wie weit sich die Grundschicht um die enthaltene Geometrie erstrecken soll"
-#: src/libslic3r/PrintConfig.cpp:2901
+#: src/libslic3r/PrintConfig.cpp:3065
msgid "How much should the tiny connectors penetrate into the model body."
msgstr "Wie weit die kleinen Verbinder in den Modellkörper eindringen sollen."
-#: src/libslic3r/PrintConfig.cpp:2631
+#: src/libslic3r/PrintConfig.cpp:2774
msgid "How much the pinhead has to penetrate the model surface"
msgstr "Wie tief der Nadelkopf in die Modelloberfläche eindringt"
-#: src/libslic3r/PrintConfig.cpp:2755
+#: src/libslic3r/PrintConfig.cpp:2919
msgid "How much the supports should lift up the supported object. If \"Pad around object\" is enabled, this value is ignored."
msgstr "Wie viel die Stützen das unterstützte Objekt anheben sollen. Wenn \"Grundschicht um Objekt\" aktiviert ist, wird dieser Wert ignoriert."
-#: src/libslic3r/PrintConfig.cpp:111
+#: src/libslic3r/PrintConfig.cpp:1209
+msgid "How to apply limits"
+msgstr "Wie man Grenzen anwendet"
+
+#: src/libslic3r/PrintConfig.cpp:1203
+msgid "How to apply the Machine Limits"
+msgstr "Wie man Maschinengrenzen anwendet"
+
+#: src/libslic3r/PrintConfig.cpp:163
+msgid "HTTP digest"
+msgstr "HTTP Digest"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:358
+#: src/libslic3r/PrintConfig.cpp:113
msgid "HTTPS CA File"
msgstr "HTTPS CA Datei"
-#: src/slic3r/GUI/Tab.cpp:1713
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:319
msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate."
msgstr "HTTPS-CA-Datei ist optional. Sie wird nur benötigt, wenn Sie HTTPS mit einem selbstsignierten Zertifikat verwenden."
-#: src/slic3r/GUI/Preferences.cpp:222
+#: src/slic3r/GUI/Preferences.cpp:376
msgid "Icon size in a respect to the default size"
msgstr "Symbolgröße in Bezug auf die Standardgröße"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:149
+#: src/slic3r/GUI/PrintHostDialogs.cpp:147
msgid "ID"
msgstr "ID"
-#: src/libslic3r/PrintConfig.cpp:1873
+#: src/libslic3r/PrintConfig.cpp:2015
msgid "If checked, supports will be generated automatically based on the overhang threshold value. If unchecked, supports will be generated inside the \"Support Enforcer\" volumes only."
-msgstr "Wenn dieses Kontrollkästchen aktiviert ist, werden Stützstrukturen automatisch basierend auf dem Schwellenwert für den Überhang generiert. Wenn diese Option nicht aktiviert ist, werden Stützen nur innerhalb der Volumen der \"Stützverstärker\" generiert."
+msgstr "Wenn dieses Kontrollkästchen aktiviert ist, werden Stützen automatisch basierend auf dem Schwellenwert für den Überhang generiert. Wenn diese Option nicht aktiviert ist, werden Stützen nur innerhalb der Volumen der \"Stützverstärker\" generiert."
-#: src/slic3r/GUI/ConfigWizard.cpp:773
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:1132
+#, possible-c-format
msgid "If enabled, %s checks for new application versions online. When a new version becomes available, a notification is displayed at the next application startup (never during program usage). This is only a notification mechanisms, no automatic installation is done."
msgstr "Falls aktiviert, sucht %s online nach neuen Versionen der Anwendung. Falls eine neue Version verfügbar ist, wird eine Mitteilung beim nächsten Programmstart angezeigt (aber nie während der Programmausführung). Dies dient nur der Mitteilung; es findet keine automatische Installation statt."
-#: src/slic3r/GUI/ConfigWizard.cpp:783
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:1142
+#, possible-c-format
msgid "If enabled, %s downloads updates of built-in system presets in the background.These updates are downloaded into a separate temporary location.When a new preset version becomes available it is offered at application startup."
msgstr "Wenn aktiviert, lädt %s Updates der eingebauten Systemvoreinstellungen im Hintergrund herunter. Diese Updates werden in einen separaten temporären Speicherort heruntergeladen. Wenn eine neue Voreinstellungsversion verfügbar wird, wird sie beim Programmstart angeboten."
-#: src/libslic3r/PrintConfig.cpp:1852
+#: src/libslic3r/PrintConfig.cpp:1994
msgid "If enabled, all printing extruders will be primed at the front edge of the print bed at the start of the print."
msgstr "Wenn aktiviert, werden alle Druckextruder zu Beginn des Druckvorgangs an der Vorderkante des Druckbetts geprimt."
-#: src/slic3r/GUI/ConfigWizard.cpp:805
-msgid ""
-"If enabled, allows the Reload from disk command to automatically find and load the files when invoked.\n"
-"If not enabled, the Reload from disk command will ask to select each file using an open file dialog."
-msgstr ""
-"Wenn diese Option aktiviert ist, ermöglicht der Befehl Von Festplatte neu laden das automatische Suchen und Laden der Dateien, wenn er aufgerufen wird.\n"
-"Wenn nicht aktiviert, fordert der Befehl Von der Festplatte neu laden jede Datei über ein Dialogfeld zum Öffnen von Dateien zur Auswahl auf."
+#: src/slic3r/GUI/ConfigWizard.cpp:1164
+msgid "If enabled, allows the Reload from disk command to automatically find and load the files when invoked.\nIf not enabled, the Reload from disk command will ask to select each file using an open file dialog."
+msgstr "Wenn diese Option aktiviert ist, ermöglicht der Befehl Von Festplatte neu laden das automatische Suchen und Laden der Dateien, wenn er aufgerufen wird.\nWenn nicht aktiviert, fordert der Befehl Von der Festplatte neu laden jede Datei über ein Dialogfeld zum Öffnen von Dateien zur Auswahl auf."
-#: src/slic3r/GUI/Preferences.cpp:74
+#: src/slic3r/GUI/Preferences.cpp:91
msgid "If enabled, allows the Reload from disk command to automatically find and load the files when invoked."
msgstr "Wenn diese Option aktiviert ist, ermöglicht der Befehl \"Von Festplatte neu laden\" das automatische Suchen und Laden der Dateien, wenn er aufgerufen wird."
-#: src/slic3r/GUI/Preferences.cpp:66
+#: src/slic3r/GUI/Preferences.cpp:238
+msgid "If enabled, changes made using the sequential slider, in preview, apply only to gcode top layer. If disabled, changes made using the sequential slider, in preview, apply to the whole gcode."
+msgstr "Wenn diese Option aktiviert ist, gelten Änderungen, die mit dem sequentiellen Schieberegler in der Vorschau vorgenommen werden, nur für den G-Code der obersten Schicht. Wenn deaktiviert, werden Änderungen, die mit dem sequentiellen Schieberegler in der Vorschau vorgenommen werden, auf den gesamten G-Code angewendet."
+
+#: src/slic3r/GUI/Preferences.cpp:83
msgid "If enabled, PrusaSlicer will check for the new versions of itself online. When a new version becomes available a notification is displayed at the next application startup (never during program usage). This is only a notification mechanisms, no automatic installation is done."
msgstr "Wenn aktiviert, wird PrusaSlicer online nach den neuen Versionen von sich selbst suchen. Wenn eine neue Version verfügbar wird, wird beim nächsten Anwendungsstart (nie während der Programmnutzung) eine Benachrichtigung angezeigt. Dies ist nur ein Benachrichtigungsmechanismus, es erfolgt keine automatische Installation."
-#: src/slic3r/GUI/Preferences.cpp:82
+#: src/slic3r/GUI/Preferences.cpp:270
+msgid "If enabled, renders object using the environment map."
+msgstr "Wenn aktiviert, wird das Objekt mit Hilfe der Environment Map gerendert."
+
+#: src/slic3r/GUI/Preferences.cpp:200
+msgid "If enabled, reverses the direction of zoom with mouse wheel"
+msgstr "Wenn aktiviert, wird die Richtung des Zooms mit dem Mausrad umgekehrt"
+
+#: src/slic3r/GUI/Preferences.cpp:93
+msgid "If enabled, sets PrusaSlicer as default application to open .3mf files."
+msgstr "Wenn aktiviert, legt PrusaSlicer als Standardanwendung fest, um .3mf-Dateien zu öffnen."
+
+#: src/slic3r/GUI/Preferences.cpp:100
+msgid "If enabled, sets PrusaSlicer as default application to open .stl files."
+msgstr "Wenn aktiviert, legt PrusaSlicer als Standardanwendung zum Öffnen von .stl-Dateien fest."
+
+#: src/slic3r/GUI/Preferences.cpp:179
+msgid "If enabled, sets PrusaSlicer G-code Viewer as default application to open .gcode files."
+msgstr "Wenn aktiviert, legt PrusaSlicer G-Code-Viewer als Standardanwendung zum Öffnen von .gcode-Dateien fest."
+
+#: src/slic3r/GUI/Preferences.cpp:99
msgid "If enabled, Slic3r downloads updates of built-in system presets in the background. These updates are downloaded into a separate temporary location. When a new preset version becomes available it is offered at application startup."
msgstr "Wenn aktiviert, lädt Slic3r Updates der eingebauten Systemvoreinstellungen im Hintergrund herunter. Diese Updates werden in einen separaten temporären Speicherort heruntergeladen. Wenn eine neue Voreinstellungsversion verfügbar wird, wird sie beim Programmstart angeboten."
-#: src/slic3r/GUI/Preferences.cpp:106
+#: src/slic3r/GUI/Preferences.cpp:137
msgid "If enabled, the 3D scene will be rendered in Retina resolution. If you are experiencing 3D performance problems, disabling this option may help."
msgstr "Wenn aktiviert, wird die 3D-Szene in Retina-Auflösung gerendert. Wenn Sie Probleme mit der 3D-Leistung haben, kann es hilfreich sein, diese Option zu deaktivieren."
-#: src/libslic3r/PrintConfig.cpp:1696
+#: src/slic3r/GUI/Preferences.cpp:215
+msgid "If enabled, the button for the collapse sidebar will be appeared in top right corner of the 3D Scene"
+msgstr "Wenn aktiviert, wird die Schaltfläche zum Zusammenklappen der Seitenleiste in der oberen rechten Ecke der 3D-Szene angezeigt"
+
+#: src/libslic3r/PrintConfig.cpp:3698
+msgid "If enabled, the command line arguments are sent to an existing instance of GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides the \"single_instance\" configuration value from application preferences."
+msgstr "Wenn aktiviert, werden die Befehlszeilenargumente an eine vorhandene Instanz der GUI PrusaSlicer gesendet, oder ein vorhandenes PrusaSlicer-Fenster wird aktiviert. Ãœbersteuert den Konfigurationswert \"single_instance\" aus den Anwendungseinstellungen."
+
+#: src/slic3r/GUI/Preferences.cpp:294
+msgid "If enabled, the descriptions of configuration parameters in settings tabs wouldn't work as hyperlinks. If disabled, the descriptions of configuration parameters in settings tabs will work as hyperlinks."
+msgstr "Wenn aktiviert, funktionieren die Beschreibungen von Konfigurationsparametern in Einstellungsregistern nicht als Hyperlinks. Wenn diese Option deaktiviert ist, funktionieren die Beschreibungen von Konfigurationsparametern in Einstellungsregistern als Hyperlinks."
+
+#: src/slic3r/GUI/Preferences.cpp:209
+msgid "If enabled, the legacy 3DConnexion devices settings dialog is available by pressing CTRL+M"
+msgstr "Wenn aktiviert, ist der Einstellungsdialog für ältere 3DConnexion-Geräte durch Drücken von STRG+M verfügbar."
+
+#: src/libslic3r/PrintConfig.cpp:1804
msgid "If enabled, the skirt will be as tall as a highest printed object. This is useful to protect an ABS or ASA print from warping and detaching from print bed due to wind draft."
msgstr "Wenn diese Option aktiviert ist, wird die Schürze so hoch wie das höchste gedruckte Objekt sein. Dies ist nützlich, um einen ABS- oder ASA-Druck vor dem Verziehen und Ablösen vom Druckbett aufgrund von Zugluft zu schützen."
-#: src/libslic3r/PrintConfig.cpp:1858
+#: src/libslic3r/PrintConfig.cpp:2000
msgid "If enabled, the wipe tower will not be printed on layers with no toolchanges. On layers with a toolchange, extruder will travel downward to print the wipe tower. User is responsible for ensuring there is no collision with the print."
msgstr "Wenn aktiviert, wird der Reinigungsturm nicht auf Schichten ohne Werkzeugwechsel gedruckt. Bei Schichten mit Werkzeugwechsel fährt der Extruder nach unten, um den Reinigungsturm zu drucken. Der Benutzer ist dafür verantwortlich, dass es nicht zu einer Kollision mit dem Druck kommt."
-#: src/slic3r/GUI/Preferences.cpp:128
+#: src/slic3r/GUI/Preferences.cpp:193
msgid "If enabled, use free camera. If not enabled, use constrained camera."
msgstr "Wenn aktiviert, verwenden Sie eine freie Kamera. Wenn nicht aktiviert, verwenden Sie eine beschränkte Kamera."
-#: src/slic3r/GUI/Preferences.cpp:121
+#: src/slic3r/GUI/Preferences.cpp:186
msgid "If enabled, use perspective camera. If not enabled, use orthographic camera."
msgstr "Wenn aktiviert, verwenden Sie eine perspektivische Kamera. Wenn nicht aktiviert, verwenden Sie eine orthographische Kamera."
-#: src/slic3r/GUI/Preferences.cpp:145
+#: src/slic3r/GUI/Preferences.cpp:222
msgid "If enabled, you can change size of toolbar icons manually."
msgstr "Wenn aktiviert, können Sie die Größe der Symbolleistensymbole manuell ändern."
-#: src/slic3r/GUI/PresetHints.cpp:29
+#: src/slic3r/GUI/PresetHints.cpp:28
msgid "If estimated layer time is below ~%1%s, fan will run at %2%%% and print speed will be reduced so that no less than %3%s are spent on that layer (however, speed will never be reduced below %4%mm/s)."
msgstr "Wenn die geschätzte Schichtzeit unter ~%1%s liegt, läuft der Lüfter mit %2%%% und die Druckgeschwindigkeit wird reduziert, so dass nicht weniger als %3%s für diese Schicht verwendet werden (die Geschwindigkeit wird jedoch nie unter %4%mm/s reduziert)."
-#: src/slic3r/GUI/PresetHints.cpp:36
+#: src/slic3r/GUI/PresetHints.cpp:35
msgid "If estimated layer time is greater, but still below ~%1%s, fan will run at a proportionally decreasing speed between %2%%% and %3%%%."
msgstr "Falls die erwartete Schichtdruckzeit größer, aber noch unterhalb von ~%1%s ist, wird der Lüfter mit einer sich proportional verringernden Geschwindigkeit zwischen %2%%% und %3%%% laufen."
-#: src/libslic3r/PrintConfig.cpp:901
+#: src/libslic3r/PrintConfig.cpp:943
msgid "If expressed as absolute value in mm/s, this speed will be applied to all the print moves of the first layer, regardless of their type. If expressed as a percentage (for example: 40%) it will scale the default speeds."
msgstr "Wird diese Geschwindigkeit als Absolutwert in mm/s angegeben, so wird sie auf alle Druckbewegungen der ersten Lage angewendet, unabhängig von ihrem Typ. In Prozent ausgedrückt (z.B. 40%) skaliert es die voreingestellten Geschwindigkeiten."
-#: src/libslic3r/PrintConfig.cpp:573
+#: src/libslic3r/PrintConfig.cpp:609
msgid "If layer print time is estimated below this number of seconds, fan will be enabled and its speed will be calculated by interpolating the minimum and maximum speeds."
msgstr "Wenn die Druckzeit der Ebenen unter dieser Anzahl von Sekunden liegt, wird der Lüfter aktiviert und seine Geschwindigkeit durch Interpolation der minimalen und maximalen Geschwindigkeiten berechnet."
-#: src/libslic3r/PrintConfig.cpp:1706
+#: src/libslic3r/PrintConfig.cpp:1821
msgid "If layer print time is estimated below this number of seconds, print moves speed will be scaled down to extend duration to this value."
msgstr "Wenn die Druckzeit der Ebene unter dieser Anzahl von Sekunden liegt, wird die Geschwindigkeit des Druckvorgangs verringert, um die Zeitdauer auf diesen Wert zu verlängern."
-#: src/libslic3r/PrintConfig.cpp:567
+#: src/libslic3r/PrintConfig.cpp:603
msgid "If this is enabled, fan will never be disabled and will be kept running at least at its minimum speed. Useful for PLA, harmful for ABS."
msgstr "Wenn diese Option aktiviert ist, wird der Lüfter niemals deaktiviert und läuft mindestens mit seiner Minimaldrehzahl weiter. Sinnvoll für PLA, ungeignet für ABS."
-#: src/slic3r/GUI/Preferences.cpp:49
+#: src/slic3r/GUI/Preferences.cpp:66
msgid "If this is enabled, Slic3r will auto-center objects around the print bed center."
msgstr "Wenn diese Option aktiviert ist, zentriert PrusaSlicer Objekte automatisch um die Mitte des Druckbettes."
-#: src/slic3r/GUI/Preferences.cpp:57
+#: src/slic3r/GUI/Preferences.cpp:74
msgid "If this is enabled, Slic3r will pre-process objects as soon as they're loaded in order to save time when exporting G-code."
msgstr "Wenn diese Option aktiviert ist, wird PrusaSlicer Objekte vorverarbeiten, sobald sie geladen werden, um Zeit beim Export von G-Code zu sparen."
-#: src/slic3r/GUI/Preferences.cpp:41
+#: src/slic3r/GUI/Preferences.cpp:54
msgid "If this is enabled, Slic3r will prompt the last output directory instead of the one containing the input files."
msgstr "Wenn diese Option aktiviert ist, öffnet PrusaSlicer das letzte Ausgabeverzeichnis anstelle des Verzeichnisses, in dem sich die Eingabedateien befinden."
-#: src/libslic3r/PrintConfig.cpp:1562
+#: src/slic3r/GUI/Preferences.cpp:125
+msgid "If this is enabled, when starting PrusaSlicer and another instance of the same PrusaSlicer is already running, that instance will be reactivated instead."
+msgstr "Wenn dies aktiviert ist, wird beim Starten von PrusaSlicer, wenn bereits eine andere Instanz desselben PrusaSlicers läuft, diese Instanz stattdessen reaktiviert."
+
+#: src/libslic3r/PrintConfig.cpp:1670
msgid "If you set this to a positive value, Z is quickly raised every time a retraction is triggered. When using multiple extruders, only the setting for the first extruder will be considered."
msgstr "Wenn Sie diesen Wert auf einen positiven Wert setzen, wird Z bei jedem Auslösen eines Einzugs schnell angehoben. Bei Verwendung mehrerer Extruder wird nur die Einstellung für den ersten Extruder berücksichtigt."
-#: src/libslic3r/PrintConfig.cpp:1571
+#: src/libslic3r/PrintConfig.cpp:1679
msgid "If you set this to a positive value, Z lift will only take place above the specified absolute Z. You can tune this setting for skipping lift on the first layers."
msgstr "Wenn Sie diesen Wert auf einen positiven Wert setzen, erfolgt der Z-Hub nur oberhalb des angegebenen absoluten Z-Wertes. Sie können diese Einstellung für das Auslassen von Z-Hüben auf den ersten Ebenen einstellen."
-#: src/libslic3r/PrintConfig.cpp:1580
+#: src/libslic3r/PrintConfig.cpp:1688
msgid "If you set this to a positive value, Z lift will only take place below the specified absolute Z. You can tune this setting for limiting lift to the first layers."
msgstr "Wenn Sie diesen Wert auf einen positiven Wert setzen, erfolgt der Z-Hub nur unterhalb des angegebenen absoluten Z-Wertes. Sie können diese Einstellung so einstellen, dass der Z-Hub auf die ersten Lagen begrenzt wird."
-#: src/libslic3r/PrintConfig.cpp:1454
+#: src/libslic3r/PrintConfig.cpp:1562
msgid "If you want to process the output G-code through custom scripts, just list their absolute paths here. Separate multiple scripts with a semicolon. Scripts will be passed the absolute path to the G-code file as the first argument, and they can access the Slic3r config settings by reading environment variables."
msgstr "Wenn Sie den Ausgabe-G-Code durch eigene Skripte verarbeiten wollen, geben Sie hier einfach die absoluten Pfade an. Trennen Sie mehrere Skripte durch ein Semikolon. Skripten wird als erstes Argument der absolute Pfad zur G-Code-Datei übergeben, und sie können auf die PrusaSlicer-Konfigurationseinstellungen zugreifen, indem sie Umgebungsvariablen lesen."
-#: src/libslic3r/PrintConfig.cpp:530
+#: src/libslic3r/PrintConfig.cpp:566
msgid "If your firmware doesn't handle the extruder displacement you need the G-code to take it into account. This option lets you specify the displacement of each extruder with respect to the first one. It expects positive coordinates (they will be subtracted from the XY coordinate)."
msgstr "Wenn Ihre Firmware die Verschiebung des Extruders nicht beherrscht, benötigen Sie den G-Code, um sie zu berücksichtigen. Mit dieser Option können Sie die Verschiebung jedes Extruders in Bezug auf den ersten Extruder festlegen. Es erwartet positive Koordinaten (sie werden von der XY-Koordinate subtrahiert)."
-#: src/libslic3r/PrintConfig.cpp:2169
+#: src/libslic3r/PrintConfig.cpp:2312
msgid "If your firmware requires relative E values, check this, otherwise leave it unchecked. Most firmwares use absolute values."
msgstr "Wenn Ihre Firmware relative E-Werte benötigt, diese Option aktivieren, ansonsten lassen Sie sie unmarkiert. Die meisten Firmwares verwenden absolute Werte."
-#: src/libslic3r/PrintConfig.cpp:3485
+#: src/libslic3r/PrintConfig.cpp:1219
+msgid "Ignore"
+msgstr "Ignorieren"
+
+#: src/libslic3r/PrintConfig.cpp:3684
msgid "Ignore non-existent config files"
msgstr "Ignoriere fehlende Konfigurationsdateien"
-#: src/slic3r/GUI/MainFrame.cpp:464
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:192
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:173
+msgid "Ignores facets facing away from the camera."
+msgstr "Ignoriert die von der Kamera abgewandten Flächen."
+
+#: src/slic3r/GUI/MainFrame.cpp:1055
msgid "Import &Config"
msgstr "Importiere &Konfiguration"
-#: src/slic3r/GUI/MainFrame.cpp:471
+#: src/slic3r/GUI/MainFrame.cpp:1062
msgid "Import Config &Bundle"
msgstr "Importiere Konfi&gurationssamlung"
-#: src/slic3r/GUI/MainFrame.cpp:467
+#: src/slic3r/GUI/MainFrame.cpp:1058
msgid "Import Config from &project"
msgstr "Importiere Konfiguration von &Projekt"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:119
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:112
msgid "Import Config from ini/amf/3mf/gcode"
msgstr "Konfiguration aus ini/amf/3mf/gcode importieren"
-#: src/slic3r/GUI/Plater.cpp:4603
+#: src/slic3r/GUI/Plater.cpp:1419
+msgid "Import config only"
+msgstr "Nur Konfiguration importieren"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:39
+msgid "Import file"
+msgstr "Datei importieren"
+
+#: src/slic3r/GUI/Plater.cpp:1418
+msgid "Import geometry only"
+msgstr "Nur Geometrie importieren"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:46
+msgid "Import model and profile"
+msgstr "Modell und Profil importieren"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48
+msgid "Import model only"
+msgstr "Nur Modell importieren"
+
+#: src/slic3r/GUI/Plater.cpp:4655
msgid "Import Object"
msgstr "Objekt importieren"
-#: src/slic3r/GUI/Plater.cpp:4607
+#: src/slic3r/GUI/Plater.cpp:4659
msgid "Import Objects"
msgstr "Objekte importieren"
@@ -3588,476 +4234,581 @@ msgstr "Objekte importieren"
msgid "Import of the repaired 3mf file failed"
msgstr "Import einer reparierten 3MF Datei fehlgeschlagen"
-#: src/slic3r/GUI/MainFrame.cpp:460
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47
+msgid "Import profile only"
+msgstr "Nur Profil importieren"
+
+#: src/slic3r/GUI/MainFrame.cpp:1050
+msgid "Import SL1 archive"
+msgstr "SL1-Archiv importieren"
+
+#: src/slic3r/GUI/Plater.cpp:1561
+msgid "Import SLA archive"
+msgstr "SLA-Archiv importieren"
+
+#: src/slic3r/GUI/MainFrame.cpp:1046
+msgid "Import STL (imperial units)"
+msgstr "STL importieren (imperiale Einheiten)"
+
+#: src/slic3r/GUI/MainFrame.cpp:1042
msgid "Import STL/OBJ/AM&F/3MF"
msgstr "Importiere STL/OBJ/AM&F/3MF"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:118
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:111
msgid "Import STL/OBJ/AMF/3MF without config, keep plater"
msgstr "Importiere STL/OBJ/AMF/3MF mit Konfigurationsdaten, Druckplatte beibehalten"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3422
-#, c-format
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:159
+msgid "Importing canceled."
+msgstr "Importieren abgebrochen."
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:160
+msgid "Importing done."
+msgstr "Importieren abgeschlossen."
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135
+msgid "Importing SLA archive"
+msgstr "Importiere SLA-Archiv"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487
+msgid "in"
+msgstr "in"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3885
+#, possible-c-format
msgid "In this mode you can select only other %s Items%s"
msgstr "In diesem Modus wählen Sie nur andere %s Elemente%s"
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:423
+msgid "Inches"
+msgstr "Zoll"
+
#: src/slic3r/GUI/UpdateDialogs.cpp:230
msgid "Incompatible bundles:"
msgstr "Inkompatible Konfigurationssammlungen:"
+#: src/slic3r/GUI/PresetComboBoxes.cpp:241
+msgid "Incompatible presets"
+msgstr "Inkompatible Voreinstellungen"
+
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75
-#, c-format
+#, possible-c-format
msgid "Incompatible with this %s"
msgstr "Nicht kompatibel mit diesem %s"
-#: src/slic3r/GUI/Plater.cpp:4685
+#: src/slic3r/GUI/Plater.cpp:4790
msgid "Increase Instances"
msgstr "Kopien erhöhen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:264
+#: src/slic3r/GUI/GLCanvas3D.cpp:251
msgid "Increase/decrease edit area"
msgstr "Bearbeitungsbereich vergrößern/verkleinern"
-#: src/slic3r/GUI/Plater.cpp:2922
-msgid "Indexing hollowed object"
-msgstr "Indizierung ausgehöhlter Objekte"
-
#. TRN Description for "UNLOCKED LOCK"
-#: src/slic3r/GUI/Tab.cpp:3258
-msgid ""
-"indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\n"
-"Click the UNLOCKED LOCK icon to reset all settings for current option group to the system (or default) values."
-msgstr ""
-"zeigt an, dass einige Einstellungen geändert wurden und nicht mit den System- (oder Standard-) Werten für die aktuelle Optionsgruppe übereinstimmen.\n"
-"Klicken Sie auf das Symbol GEÖFFNETES SCHLOSS, um alle Einstellungen für die aktuelle Optionsgruppe auf die System- (oder Standard-) Werte zurückzusetzen."
+#: src/slic3r/GUI/Tab.cpp:3695
+msgid "indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\nClick the UNLOCKED LOCK icon to reset all settings for current option group to the system (or default) values."
+msgstr "zeigt an, dass einige Einstellungen geändert wurden und nicht mit den System- (oder Standard-) Werten für die aktuelle Optionsgruppe übereinstimmen.\nKlicken Sie auf das Symbol GEÖFFNETES SCHLOSS, um alle Einstellungen für die aktuelle Optionsgruppe auf die System- (oder Standard-) Werte zurückzusetzen."
#. TRN Description for "LOCKED LOCK"
-#: src/slic3r/GUI/Tab.cpp:3254
+#: src/slic3r/GUI/Tab.cpp:3691
msgid "indicates that the settings are the same as the system (or default) values for the current option group"
msgstr "zeigt an, dass die Einstellungen mit den System- (oder Standard-) Werten für die aktuelle Optionsgruppe übereinstimmen"
#. TRN Description for "BACK ARROW"
-#: src/slic3r/GUI/Tab.cpp:3270
-msgid ""
-"indicates that the settings were changed and are not equal to the last saved preset for the current option group.\n"
-"Click the BACK ARROW icon to reset all settings for the current option group to the last saved preset."
-msgstr ""
-"zeigt an, dass die Einstellungen geändert wurden und nicht mit dem zuletzt gespeicherten Preset für die aktuelle Optionsgruppe übereinstimmen.\n"
-"Klicken Sie auf das Symbol PFEIL ZURÜCK, um alle Einstellungen für die aktuelle Optionsgruppe auf das zuletzt gespeicherte Preset zurückzusetzen."
-
-#: src/slic3r/GUI/ConfigManipulation.cpp:211
-#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:96
-#: src/slic3r/GUI/GUI_ObjectList.cpp:614 src/slic3r/GUI/Plater.cpp:527
-#: src/slic3r/GUI/Tab.cpp:1091 src/slic3r/GUI/Tab.cpp:1092
-#: src/libslic3r/PrintConfig.cpp:203 src/libslic3r/PrintConfig.cpp:416
-#: src/libslic3r/PrintConfig.cpp:436 src/libslic3r/PrintConfig.cpp:776
-#: src/libslic3r/PrintConfig.cpp:790 src/libslic3r/PrintConfig.cpp:827
-#: src/libslic3r/PrintConfig.cpp:981 src/libslic3r/PrintConfig.cpp:991
-#: src/libslic3r/PrintConfig.cpp:1009 src/libslic3r/PrintConfig.cpp:1028
-#: src/libslic3r/PrintConfig.cpp:1047 src/libslic3r/PrintConfig.cpp:1728
-#: src/libslic3r/PrintConfig.cpp:1745
+#: src/slic3r/GUI/Tab.cpp:3707
+msgid "indicates that the settings were changed and are not equal to the last saved preset for the current option group.\nClick the BACK ARROW icon to reset all settings for the current option group to the last saved preset."
+msgstr "zeigt an, dass die Einstellungen geändert wurden und nicht mit dem zuletzt gespeicherten Preset für die aktuelle Optionsgruppe übereinstimmen.\nKlicken Sie auf das Symbol PFEIL ZURÜCK, um alle Einstellungen für die aktuelle Optionsgruppe auf das zuletzt gespeicherte Preset zurückzusetzen."
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:210
+#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:93
+#: src/slic3r/GUI/GUI_ObjectList.cpp:652 src/slic3r/GUI/Plater.cpp:393
+#: src/slic3r/GUI/Tab.cpp:1413 src/slic3r/GUI/Tab.cpp:1414
+#: src/libslic3r/PrintConfig.cpp:237 src/libslic3r/PrintConfig.cpp:450
+#: src/libslic3r/PrintConfig.cpp:472 src/libslic3r/PrintConfig.cpp:812
+#: src/libslic3r/PrintConfig.cpp:826 src/libslic3r/PrintConfig.cpp:863
+#: src/libslic3r/PrintConfig.cpp:1025 src/libslic3r/PrintConfig.cpp:1035
+#: src/libslic3r/PrintConfig.cpp:1053 src/libslic3r/PrintConfig.cpp:1072
+#: src/libslic3r/PrintConfig.cpp:1091 src/libslic3r/PrintConfig.cpp:1843
+#: src/libslic3r/PrintConfig.cpp:1860
msgid "Infill"
msgstr "Infill"
-#: src/slic3r/GUI/PresetHints.cpp:174
+#: src/slic3r/GUI/PresetHints.cpp:173
msgid "infill"
msgstr "Infill"
-#: src/libslic3r/PrintConfig.cpp:1021
+#: src/libslic3r/PrintConfig.cpp:1065
msgid "Infill before perimeters"
msgstr "Infill vor Kontur"
-#: src/libslic3r/PrintConfig.cpp:1001
+#: src/libslic3r/PrintConfig.cpp:1045
msgid "Infill extruder"
msgstr "Infill Extruder"
-#: src/libslic3r/PrintConfig.cpp:1036
+#: src/libslic3r/PrintConfig.cpp:1080
msgid "Infill/perimeters overlap"
msgstr "Infill/Kontur Ãœberlappung"
-#: src/libslic3r/Print.cpp:1584
+#: src/libslic3r/Print.cpp:1610
msgid "Infilling layers"
msgstr "Fülle Schichten"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3430
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3505 src/slic3r/GUI/Plater.cpp:141
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3893
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3968 src/slic3r/GUI/Plater.cpp:147
msgid "Info"
msgstr "Info"
-#: src/libslic3r/PrintConfig.cpp:1057
+#: src/slic3r/GUI/GUI_App.cpp:1087 src/slic3r/GUI/Tab.cpp:3435
+msgid "Information"
+msgstr "Informationen"
+
+#: src/libslic3r/PrintConfig.cpp:1101
msgid "Inherits profile"
msgstr "Ãœbernimmt Profil"
-#: src/libslic3r/SLAPrint.cpp:653
+#: src/libslic3r/SLAPrint.cpp:667
msgid "Initial exposition time is out of printer profile bounds."
msgstr "Anfang-Belichtungszeit ist außerhalb der Druckerprofilgrenzen."
-#: src/libslic3r/PrintConfig.cpp:2564 src/libslic3r/PrintConfig.cpp:2565
+#: src/libslic3r/PrintConfig.cpp:2707 src/libslic3r/PrintConfig.cpp:2708
msgid "Initial exposure time"
msgstr "Anfang-Belichtungszeit"
-#: src/libslic3r/PrintConfig.cpp:2482 src/libslic3r/PrintConfig.cpp:2483
+#: src/libslic3r/PrintConfig.cpp:2625 src/libslic3r/PrintConfig.cpp:2626
msgid "Initial layer height"
msgstr "Anfangsschichthöhe"
-#: src/slic3r/GUI/Field.cpp:204
+#: src/slic3r/GUI/Field.cpp:269
+#, possible-c-format
+msgid "Input value is out of range\nAre you sure that %s is a correct value and that you want to continue?"
+msgstr "Eingabewert liegt außerhalb des Bereichs\nSind Sie sicher, dass %s ein korrekter Wert ist und Sie fortfahren möchten?"
+
+#: src/slic3r/GUI/Field.cpp:252 src/slic3r/GUI/Field.cpp:1370
msgid "Input value is out of range"
msgstr "Der Eingabewert ist nicht im gültigen Bereich"
-#: src/slic3r/GUI/GUI_App.cpp:800
+#: src/slic3r/GUI/GUI_App.cpp:1480
msgid "Inspect / activate configuration snapshots"
msgstr "Inspiziere / aktiviere Konfigurations-Momentaufnahmen"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:60
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:216
-#, c-format
+#: src/slic3r/Utils/PresetUpdater.cpp:120
+msgid "install"
+msgstr "Installation"
+
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:62
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:218
+#, possible-c-format
msgid "Instance %d"
msgstr "Kopie %d"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2500
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2892
msgid "Instance manipulation"
msgstr "Kopie Bearbeitung"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:56
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:58
msgid "Instances"
msgstr "Kopien"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1091
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3781
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1215
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4244
msgid "Instances to Separated Objects"
msgstr "Kopien in einzelne Objekte wandeln"
-#: src/libslic3r/PrintConfig.cpp:1973
+#: src/libslic3r/PrintConfig.cpp:2115
msgid "Interface layers"
msgstr "Schnittstellen Schichten"
-#: src/libslic3r/PrintConfig.cpp:1957
+#: src/libslic3r/PrintConfig.cpp:2099
msgid "Interface loops"
msgstr "Kontaktschleifen"
-#: src/libslic3r/PrintConfig.cpp:1982
+#: src/libslic3r/PrintConfig.cpp:2124
msgid "Interface pattern spacing"
msgstr "Schnittstellenmuster Abstand"
-#: src/libslic3r/PrintConfig.cpp:1071
+#: src/libslic3r/PrintConfig.cpp:1115
msgid "Interface shells"
msgstr "Schnittstellenshells"
-#: src/libslic3r/Zipper.cpp:84
+#: src/libslic3r/miniz_extension.cpp:143
msgid "internal error"
msgstr "interner Fehler"
-#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:313
+#: src/slic3r/GUI/GUI_Preview.cpp:304 src/libslic3r/ExtrusionEntity.cpp:317
+#: src/libslic3r/ExtrusionEntity.cpp:342
msgid "Internal infill"
msgstr "Internes Infill"
-#: src/slic3r/GUI/Plater.cpp:3106
+#: src/slic3r/GUI/BedShapeDialog.cpp:145
+msgid "Invalid"
+msgstr "Ungültig"
+
+#: src/slic3r/GUI/Plater.cpp:2906 src/slic3r/GUI/Plater.cpp:3583
msgid "Invalid data"
msgstr "Ungültige Daten"
-#: src/slic3r/GUI/BedShapeDialog.cpp:494 src/slic3r/GUI/BedShapeDialog.cpp:543
-#: src/slic3r/GUI/BedShapeDialog.cpp:566
+#: src/slic3r/GUI/BedShapeDialog.cpp:570 src/slic3r/GUI/BedShapeDialog.cpp:619
+#: src/slic3r/GUI/BedShapeDialog.cpp:642
msgid "Invalid file format."
msgstr "Ungültiges Dateiformat."
-#: src/libslic3r/Zipper.cpp:80
+#: src/libslic3r/miniz_extension.cpp:139
msgid "invalid filename"
msgstr "ungültiger Dateiname"
-#: src/slic3r/GUI/ConfigManipulation.cpp:319
+#: src/slic3r/GUI/ConfigManipulation.cpp:324
msgid "Invalid Head penetration"
msgstr "Ungültige Eindringtiefe des Stützkopfes"
-#: src/libslic3r/Zipper.cpp:48
+#: src/libslic3r/miniz_extension.cpp:107
msgid "invalid header or archive is corrupted"
msgstr "ungültiger Dateiheader oder Archiv ist beschädigt"
-#: src/slic3r/GUI/Field.cpp:195 src/slic3r/GUI/Field.cpp:226
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:376
+#: src/slic3r/GUI/Field.cpp:375
+msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
+msgstr "Ungültiges Eingabeformat. Erwarteter Vektor der Abmessungen im folgenden Format: \"%1%\""
+
+#: src/slic3r/GUI/Field.cpp:243 src/slic3r/GUI/Field.cpp:274
+#: src/slic3r/GUI/Field.cpp:1358 src/slic3r/GUI/GUI_ObjectLayers.cpp:413
msgid "Invalid numeric input."
msgstr "Ungültige numerische Eingabe."
-#: src/libslic3r/Zipper.cpp:78
+#: src/libslic3r/miniz_extension.cpp:137
msgid "invalid parameter"
msgstr "ungültiger Parameter"
-#: src/slic3r/GUI/ConfigManipulation.cpp:332
+#: src/slic3r/GUI/ConfigManipulation.cpp:337
msgid "Invalid pinhead diameter"
msgstr "Ungültiger Nadelkopfdurchmesser"
+#: src/slic3r/GUI/GUI_ObjectList.cpp:94 src/slic3r/GUI/GUI_ObjectList.cpp:653
+#: src/slic3r/GUI/GUI_Preview.cpp:307 src/slic3r/GUI/Tab.cpp:1420
+#: src/libslic3r/ExtrusionEntity.cpp:320 src/libslic3r/ExtrusionEntity.cpp:348
+#: src/libslic3r/PrintConfig.cpp:1126 src/libslic3r/PrintConfig.cpp:1132
+#: src/libslic3r/PrintConfig.cpp:1146 src/libslic3r/PrintConfig.cpp:1156
+msgid "Ironing"
+msgstr "Bügeln"
+
+#: src/libslic3r/PrintConfig.cpp:1131 src/libslic3r/PrintConfig.cpp:1133
+msgid "Ironing Type"
+msgstr "Bügeltyp"
+
+#: src/slic3r/GUI/GUI_App.cpp:243
+msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community."
+msgstr "basiert auf Slic3r von Alessandro Ranellucci und der RepRap Community."
+
#. TRN "Slic3r _is licensed under the_ License"
-#: src/slic3r/GUI/AboutDialog.cpp:258
+#: src/slic3r/GUI/AboutDialog.cpp:283 src/slic3r/GUI/GUI_App.cpp:244
msgid "is licensed under the"
msgstr "ist unter der Lizenz der"
-#: src/slic3r/GUI/Tab.cpp:2941
-msgid "is not compatible with print profile"
-msgstr "ist mit dem Druckprofil nicht kompatibel"
-
-#: src/slic3r/GUI/Tab.cpp:2940
-msgid "is not compatible with printer"
-msgstr "ist mit dem Drucker nicht kompatibel"
-
-#: src/slic3r/GUI/MainFrame.cpp:658
+#: src/slic3r/GUI/MainFrame.cpp:955 src/slic3r/GUI/MainFrame.cpp:1275
msgid "Iso"
msgstr "Iso"
-#: src/slic3r/GUI/MainFrame.cpp:658
+#: src/slic3r/GUI/MainFrame.cpp:955 src/slic3r/GUI/MainFrame.cpp:1275
msgid "Iso View"
msgstr "Iso Ansicht"
-#: src/slic3r/GUI/Tab.cpp:964
+#: src/slic3r/GUI/Tab.cpp:1282
msgid "It can't be deleted or modified."
msgstr "Es ist keine Löschung oder Änderung möglich."
-#: src/slic3r/GUI/Plater.cpp:3321
+#: src/slic3r/GUI/Plater.cpp:3124
msgid "It is not allowed to change the file to reload"
msgstr "Es ist nicht erlaubt, die neu zu ladende Datei zu ändern"
-#: src/libslic3r/PrintConfig.cpp:974
+#: src/libslic3r/PrintConfig.cpp:1018
msgid "It may be beneficial to increase the extruder motor current during the filament exchange sequence to allow for rapid ramming feed rates and to overcome resistance when loading a filament with an ugly shaped tip."
msgstr "Es kann vorteilhaft sein, den Extrudermotorstrom während des Filamentwechselvorgangs zu erhöhen, um schnelle Rammvorschübe zu ermöglichen und den Widerstand beim Laden eines Filaments mit einer ungünstig geformten Spitze zu überwinden."
-#: src/slic3r/GUI/GUI_App.cpp:1084 src/slic3r/GUI/Tab.cpp:2958
+#: src/slic3r/GUI/Tab.cpp:3413
+msgid "It's a last preset for this physical printer."
+msgstr "Es handelt sich um die letzte Voreinstellung für diesen physischen Drucker."
+
+#: src/slic3r/GUI/GUI_App.cpp:1876 src/slic3r/GUI/Tab.cpp:3187
msgid "It's impossible to print multi-part object(s) with SLA technology."
msgstr "Es ist nicht möglich mehrteilige Objekte mit dem SLA-Verfahren zu drucken."
-#: src/slic3r/GUI/Tab.cpp:2229
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:601
+msgid "It's not possible to delete the last related preset for the printer."
+msgstr "Es ist nicht möglich, die letzte zugehörige Voreinstellung für den Drucker zu löschen."
+
+#: src/slic3r/GUI/Tab.cpp:2398
msgid "Jerk limits"
msgstr "Ruck-Begrenzungen"
-#: src/libslic3r/PrintConfig.cpp:1649
+#: src/libslic3r/PrintConfig.cpp:1757
msgid "Jitter"
msgstr "Jitter"
-#: src/slic3r/GUI/DoubleSlider.cpp:957 src/slic3r/GUI/DoubleSlider.cpp:1529
-#: src/slic3r/GUI/DoubleSlider.cpp:1651
+#: src/slic3r/GUI/DoubleSlider.cpp:1077 src/slic3r/GUI/DoubleSlider.cpp:1721
+#: src/slic3r/GUI/DoubleSlider.cpp:1852 src/slic3r/GUI/DoubleSlider.cpp:1856
msgid "Jump to height"
msgstr "Zur Höhe wechseln"
-#: src/slic3r/GUI/DoubleSlider.cpp:955
-#, c-format
-msgid "Jump to height %s or Set extruder sequence for the entire print"
-msgstr "Auf Höhe %s wechseln oder Extrudersequenz für den gesamten Druck einstellen"
+#: src/slic3r/GUI/DoubleSlider.cpp:1223
+#, possible-c-format
+msgid "Jump to height %s\nor Set ruler mode"
+msgstr "Auf Höhe %s springen\noder Linealmodus einstellen"
-#: src/libslic3r/PrintConfig.cpp:566
+#: src/slic3r/GUI/DoubleSlider.cpp:1220
+#, possible-c-format
+msgid "Jump to height %s\nSet ruler mode\nor Set extruder sequence for the entire print"
+msgstr "Auf Höhe %s springen\nLineal-Modus einstellen\noder Extrudersequenz für den gesamten Druck einstellen"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1071 src/slic3r/GUI/DoubleSlider.cpp:1852
+msgid "Jump to move"
+msgstr "Zum Bewegen wechseln"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:315
+msgid "Just switch to \"%1%\" preset"
+msgstr "Wechseln Sie einfach zur \"%1%\" Voreinstellung"
+
+#: src/libslic3r/PrintConfig.cpp:602
msgid "Keep fan always on"
msgstr "Lüfter ständig laufen lassen"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:169
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:171
msgid "Keep lower part"
msgstr "Unteren Teil behalten"
-#: src/slic3r/GUI/GLCanvas3D.cpp:304
+#: src/slic3r/GUI/GLCanvas3D.cpp:290
msgid "Keep min"
msgstr "Halte min"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:168
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170
msgid "Keep upper part"
msgstr "Oberen Teil behalten"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:41 src/slic3r/GUI/MainFrame.cpp:708
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:37
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:39 src/slic3r/GUI/MainFrame.cpp:941
+#: src/slic3r/GUI/MainFrame.cpp:1332
msgid "Keyboard Shortcuts"
msgstr "Tastaturkürzel"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:245
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:259
msgid "Keyboard shortcuts"
msgstr "Tastaturkürzel"
-#: src/libslic3r/PrintConfig.cpp:2498
+#: src/libslic3r/PrintConfig.cpp:2641
msgid "kg"
msgstr "kg"
-#: src/libslic3r/PrintConfig.cpp:965
+#: src/libslic3r/PrintConfig.cpp:1009
msgid "Label objects"
msgstr "Objekte benennen"
-#: src/libslic3r/PrintConfig.cpp:2399
+#: src/libslic3r/PrintConfig.cpp:2542
msgid "Landscape"
msgstr "Querformat"
-#: src/slic3r/GUI/GUI_App.cpp:629
+#: src/slic3r/GUI/GUI_App.cpp:1295
msgid "Language"
msgstr "Spache"
-#: src/slic3r/GUI/GUI_App.cpp:885
+#: src/slic3r/GUI/GUI_App.cpp:1605 src/slic3r/GUI/GUI_App.cpp:1614
msgid "Language selection"
msgstr "Sprachauswahl"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2140
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2242
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2307
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2408
msgid "Last instance of an object cannot be deleted."
msgstr "Letzte Kopie eines Objektes kann nicht gelöscht werden."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3418
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3881
msgid "Layer"
msgstr "Schicht"
-#: src/slic3r/GUI/ConfigManipulation.cpp:49
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1049
+#: src/slic3r/GUI/ConfigManipulation.cpp:48
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1371
#: src/libslic3r/PrintConfig.cpp:71
msgid "Layer height"
msgstr "Schichthöhe"
-#: src/libslic3r/Print.cpp:1427
+#: src/libslic3r/Print.cpp:1453
msgid "Layer height can't be greater than nozzle diameter"
msgstr "Schichthöhe darf nicht größer sein als der Düsendurchmesser"
-#: src/slic3r/GUI/Tab.cpp:2362
+#: src/slic3r/GUI/Tab.cpp:2531
msgid "Layer height limits"
msgstr "Schichthöhen Grenzen"
-#: src/slic3r/GUI/ConfigWizard.cpp:2015
-msgid "Layer height:"
-msgstr "Schichthöhe:"
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2488
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2880
msgid "Layer range Settings to modify"
msgstr "Schichtbereicheinstellungen zum Ändern"
#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:52
-#: src/libslic3r/PrintConfig.cpp:362 src/libslic3r/PrintConfig.cpp:994
-#: src/libslic3r/PrintConfig.cpp:1505 src/libslic3r/PrintConfig.cpp:1690
-#: src/libslic3r/PrintConfig.cpp:1750 src/libslic3r/PrintConfig.cpp:1930
-#: src/libslic3r/PrintConfig.cpp:1976
+#: src/libslic3r/PrintConfig.cpp:396 src/libslic3r/PrintConfig.cpp:1038
+#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:1798
+#: src/libslic3r/PrintConfig.cpp:1865 src/libslic3r/PrintConfig.cpp:2072
+#: src/libslic3r/PrintConfig.cpp:2118
msgid "layers"
msgstr "Schichten"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3512
-#: src/slic3r/GUI/Tab.cpp:3600
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3928
+#: src/slic3r/GUI/Tab.cpp:4010
msgid "Layers"
msgstr "Schichten"
-#: src/slic3r/GUI/Tab.cpp:1048 src/slic3r/GUI/Tab.cpp:3598
+#: src/slic3r/GUI/Tab.cpp:1370 src/slic3r/GUI/Tab.cpp:4008
msgid "Layers and perimeters"
msgstr "Schichten und Umfänge"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:95
-#: src/slic3r/GUI/GUI_ObjectList.cpp:613 src/libslic3r/PrintConfig.cpp:72
-#: src/libslic3r/PrintConfig.cpp:175 src/libslic3r/PrintConfig.cpp:184
-#: src/libslic3r/PrintConfig.cpp:408 src/libslic3r/PrintConfig.cpp:470
-#: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:890
-#: src/libslic3r/PrintConfig.cpp:1075 src/libslic3r/PrintConfig.cpp:1374
-#: src/libslic3r/PrintConfig.cpp:1441 src/libslic3r/PrintConfig.cpp:1622
-#: src/libslic3r/PrintConfig.cpp:2074 src/libslic3r/PrintConfig.cpp:2133
-#: src/libslic3r/PrintConfig.cpp:2142
+#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:92
+#: src/slic3r/GUI/GUI_ObjectList.cpp:651 src/libslic3r/PrintConfig.cpp:72
+#: src/libslic3r/PrintConfig.cpp:209 src/libslic3r/PrintConfig.cpp:218
+#: src/libslic3r/PrintConfig.cpp:442 src/libslic3r/PrintConfig.cpp:506
+#: src/libslic3r/PrintConfig.cpp:514 src/libslic3r/PrintConfig.cpp:932
+#: src/libslic3r/PrintConfig.cpp:1119 src/libslic3r/PrintConfig.cpp:1482
+#: src/libslic3r/PrintConfig.cpp:1549 src/libslic3r/PrintConfig.cpp:1730
+#: src/libslic3r/PrintConfig.cpp:2217 src/libslic3r/PrintConfig.cpp:2276
+#: src/libslic3r/PrintConfig.cpp:2285
msgid "Layers and Perimeters"
msgstr "Schichten und Konturen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
-msgid "Layers Slider"
-msgstr "Schichtenschieber"
-
-#: src/slic3r/GUI/OptionsGroup.cpp:258
+#: src/slic3r/GUI/OptionsGroup.cpp:293
msgctxt "Layers"
msgid "Bottom"
msgstr "Boden"
-#: src/slic3r/GUI/OptionsGroup.cpp:258
+#: src/slic3r/GUI/OptionsGroup.cpp:293
msgctxt "Layers"
msgid "Top"
msgstr "Decke"
-#: src/slic3r/GUI/MainFrame.cpp:671
+#: src/slic3r/GUI/Preferences.cpp:440
+msgid "Layout Options"
+msgstr "Layout-Optionen"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:48
+msgid "Leaving Paint-on supports"
+msgstr "Verlasse Aufmal-Stützen"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:47
+msgid "Leaving Seam painting"
+msgstr "Verlasse Aufmal-Nähte"
+
+#: src/slic3r/GUI/MainFrame.cpp:968 src/slic3r/GUI/MainFrame.cpp:1288
msgid "Left"
msgstr "Links"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214
msgid "Left click"
msgstr "Linker Mausklick"
-#: src/slic3r/GUI/GLCanvas3D.cpp:237
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:29
+msgid "Left mouse button"
+msgstr "Linke Maustaste"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:233
msgid "Left mouse button:"
msgstr "Linke Maustaste:"
-#: src/slic3r/GUI/MainFrame.cpp:671
+#: src/slic3r/GUI/MainFrame.cpp:968 src/slic3r/GUI/MainFrame.cpp:1288
msgid "Left View"
msgstr "Anicht von Links"
-#: src/slic3r/GUI/GUI_Preview.cpp:257
-msgid "Legend"
-msgstr "Legende"
+#: src/slic3r/GUI/GUI_Preview.cpp:1480
+msgid "Legend/Estimated printing time"
+msgstr "Legende/geschätzte Druckzeit"
-#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1551
+#: src/libslic3r/PrintConfig.cpp:1651 src/libslic3r/PrintConfig.cpp:1659
msgid "Length"
msgstr "Länge"
-#: src/libslic3r/PrintConfig.cpp:328
+#: src/libslic3r/PrintConfig.cpp:362
msgid "Length of the cooling tube to limit space for cooling moves inside it."
msgstr "Länge des Kühlschlauchs, um den Raum für Kühlbewegungen im Inneren zu begrenzen."
+#: src/libslic3r/PrintConfig.cpp:1068
+msgid "Length of the infill anchor"
+msgstr "Länge des Infill-Ankers"
+
#. TRN "Slic3r _is licensed under the_ License"
-#: src/slic3r/GUI/AboutDialog.cpp:129
+#: src/slic3r/GUI/AboutDialog.cpp:141
msgid "License agreements of all following programs (libraries) are part of application license agreement"
msgstr "Lizenzvereinbarungen für alle folgenden Programme (Bibliotheken) sind Teil der Anwendungslizenzvereinbarung"
-#: src/libslic3r/PrintConfig.cpp:1561
+#: src/libslic3r/PrintConfig.cpp:1669
msgid "Lift Z"
msgstr "Z Hebung"
-#: src/libslic3r/PrintConfig.cpp:848
+#: src/libslic3r/PrintConfig.cpp:886
msgid "Line"
msgstr "Linie"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1427
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1558
msgid "Load"
msgstr "Laden"
-#: src/slic3r/GUI/MainFrame.cpp:460
+#: src/slic3r/GUI/MainFrame.cpp:1042
msgid "Load a model"
msgstr "Lade ein Modell"
-#: src/libslic3r/PrintConfig.cpp:3505
+#: src/slic3r/GUI/MainFrame.cpp:1046
+msgid "Load an model saved with imperial units"
+msgstr "Laden eines mit imperialen Einheiten gespeicherten Modells"
+
+#: src/slic3r/GUI/MainFrame.cpp:1058
+msgid "Load an SL1 archive"
+msgstr "SL1-Archiv laden"
+
+#: src/libslic3r/PrintConfig.cpp:3710
msgid "Load and store settings at the given directory. This is useful for maintaining different profiles or including configurations from a network storage."
msgstr "Lädt und speichert Einstellungen im angegebenen Verzeichnis. Dies ist nützlich, um verschiedene Profile zu pflegen oder Konfigurationen aus einem Netzwerkspeicher zu übernehmen."
-#: src/libslic3r/PrintConfig.cpp:3489
+#: src/libslic3r/PrintConfig.cpp:3688
msgid "Load config file"
msgstr "Lade Konfigurationsdatei"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:120
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:113
msgid "Load Config from ini/amf/3mf/gcode and merge"
msgstr "Lade und füge Konfiguration von ini/amf/3mf/gcode hinzu"
-#: src/slic3r/GUI/MainFrame.cpp:467
+#: src/slic3r/GUI/MainFrame.cpp:1058
msgid "Load configuration from project file"
msgstr "Lade Konfiguration aus Projektdatei"
-#: src/libslic3r/PrintConfig.cpp:3490
+#: src/libslic3r/PrintConfig.cpp:3689
msgid "Load configuration from the specified file. It can be used more than once to load options from multiple files."
msgstr "Lädt die Konfiguration aus der angegebenen Datei. Es kann mehr als einmal verwendet werden, um Optionen aus mehreren Dateien zu laden."
-#: src/slic3r/GUI/MainFrame.cpp:464
+#: src/slic3r/GUI/MainFrame.cpp:1055
msgid "Load exported configuration file"
msgstr "Laden einer exportierten Konfigurationsdatei"
-#: src/slic3r/GUI/Plater.cpp:1395
+#: src/slic3r/GUI/Plater.cpp:1543 src/slic3r/GUI/Plater.cpp:4976
msgid "Load File"
msgstr "Datei laden"
-#: src/slic3r/GUI/Plater.cpp:1399
+#: src/slic3r/GUI/Plater.cpp:1548 src/slic3r/GUI/Plater.cpp:4981
msgid "Load Files"
msgstr "Dateien laden"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1879
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2038
msgid "Load Part"
msgstr "Teil laden"
-#: src/slic3r/GUI/MainFrame.cpp:471
+#: src/slic3r/GUI/MainFrame.cpp:1062
msgid "Load presets from a bundle"
msgstr "Lade Voreinstellungen aus einer Sammlung"
-#: src/slic3r/GUI/Plater.cpp:4575
+#: src/slic3r/GUI/Plater.cpp:4627
msgid "Load Project"
msgstr "Projekt laden"
-#: src/slic3r/GUI/BedShapeDialog.cpp:102
+#: src/slic3r/GUI/BedShapeDialog.cpp:243
msgid "Load shape from STL..."
msgstr "Lade Umriß von STL..."
-#: src/slic3r/GUI/BedShapeDialog.cpp:182 src/slic3r/GUI/BedShapeDialog.cpp:261
+#: src/slic3r/GUI/BedShapeDialog.cpp:325 src/slic3r/GUI/BedShapeDialog.cpp:405
msgid "Load..."
msgstr "Laden..."
@@ -4065,19 +4816,27 @@ msgstr "Laden..."
msgid "loaded"
msgstr "geladen wird"
-#: src/slic3r/GUI/Plater.cpp:2426
+#: src/slic3r/GUI/Plater.cpp:2388
msgid "Loaded"
msgstr "Geladen"
-#: src/slic3r/GUI/Plater.cpp:2273
+#: src/slic3r/GUI/Plater.cpp:2216
msgid "Loading"
msgstr "Lade"
-#: src/slic3r/GUI/GUI_App.cpp:474
+#: src/slic3r/GUI/GUI_App.cpp:797
+msgid "Loading configuration"
+msgstr "Lade Konfiguration"
+
+#: src/slic3r/GUI/Plater.cpp:2226
+msgid "Loading file"
+msgstr "Lade Datei"
+
+#: src/slic3r/GUI/GUI_App.cpp:1125
msgid "Loading of a mode view"
msgstr "Lade Anzeigemodus"
-#: src/slic3r/GUI/GUI_App.cpp:466
+#: src/slic3r/GUI/GUI_App.cpp:1120
msgid "Loading of current presets"
msgstr "Laden der aktuellen Voreinstellungen"
@@ -4086,101 +4845,121 @@ msgstr "Laden der aktuellen Voreinstellungen"
msgid "Loading repaired model"
msgstr "Lade repariertes Modell"
-#: src/libslic3r/PrintConfig.cpp:607
+#: src/libslic3r/PrintConfig.cpp:643
msgid "Loading speed"
msgstr "Ladegeschwindigkeit"
-#: src/libslic3r/PrintConfig.cpp:615
+#: src/libslic3r/PrintConfig.cpp:651
msgid "Loading speed at the start"
msgstr "Ladegeschwindigkeit zu Beginn"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:63
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:106
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:69
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:112
msgid "Local coordinates"
msgstr "Lokale Koordinaten"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48
msgid "Lock supports under new islands"
msgstr "Fixiere Stützen unter neuen Inseln"
-#: src/slic3r/GUI/Tab.cpp:3252
+#: src/slic3r/GUI/Tab.cpp:3689
msgid "LOCKED LOCK"
msgstr "GESCHLOSSENES SCHLOSS"
-#: src/slic3r/GUI/Tab.cpp:3280
+#: src/slic3r/GUI/Tab.cpp:3717
msgid "LOCKED LOCK icon indicates that the settings are the same as the system (or default) values for the current option group"
-msgstr "Das Symbol LOCKED LOCK zeigt an, dass die Einstellungen mit den System- (oder Standard-) Werten für die aktuelle Optionsgruppe übereinstimmen"
+msgstr "Das Symbol GESCHLOSSENES SCHLOSS zeigt an, dass die Einstellungen mit den System- (oder Standard-) Werten für die aktuelle Optionsgruppe übereinstimmen"
-#: src/slic3r/GUI/Tab.cpp:3296
+#: src/slic3r/GUI/Tab.cpp:3733
msgid "LOCKED LOCK icon indicates that the value is the same as the system (or default) value."
-msgstr "Das Symbol LOCKED LOCK zeigt an, dass der Wert mit dem System- (oder Standard-) Wert übereinstimmt."
+msgstr "Das Symbol GESCHLOSSENES SCHLOSS zeigt an, dass der Wert mit dem System- (oder Standard-) Wert übereinstimmt."
-#: src/libslic3r/PrintConfig.cpp:3508
+#: src/libslic3r/PrintConfig.cpp:3713
msgid "Logging level"
msgstr "Logging-Level"
-#: src/libslic3r/PrintConfig.cpp:1695
+#: src/libslic3r/PrintConfig.cpp:1810
msgid "Loops (minimum)"
msgstr "Schleifen (minimal)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:206
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
msgid "Lower Layer"
msgstr "Untere Schicht"
-#: src/slic3r/GUI/Tab.cpp:2188 src/slic3r/GUI/Tab.cpp:2273
-#: src/libslic3r/PrintConfig.cpp:1129 src/libslic3r/PrintConfig.cpp:1146
-#: src/libslic3r/PrintConfig.cpp:1163 src/libslic3r/PrintConfig.cpp:1179
-#: src/libslic3r/PrintConfig.cpp:1189 src/libslic3r/PrintConfig.cpp:1199
-#: src/libslic3r/PrintConfig.cpp:1209
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+msgid "Lower layer"
+msgstr "Untere Schicht"
+
+#: src/slic3r/GUI/Tab.cpp:2346 src/slic3r/GUI/Tab.cpp:2442
+#: src/libslic3r/PrintConfig.cpp:1202 src/libslic3r/PrintConfig.cpp:1237
+#: src/libslic3r/PrintConfig.cpp:1254 src/libslic3r/PrintConfig.cpp:1271
+#: src/libslic3r/PrintConfig.cpp:1287 src/libslic3r/PrintConfig.cpp:1297
+#: src/libslic3r/PrintConfig.cpp:1307 src/libslic3r/PrintConfig.cpp:1317
msgid "Machine limits"
msgstr "Maschinengrenzen"
-#: src/slic3r/GUI/Plater.cpp:166
+#: src/slic3r/GUI/Tab.cpp:3667
+msgid "Machine limits are not set, therefore the print time estimate may not be accurate."
+msgstr "Maschinengrenzen sind nicht gesetzt, daher ist die Schätzung der Druckzeit möglicherweise nicht genau."
+
+#: src/slic3r/GUI/Tab.cpp:3660
+msgid "Machine limits will be emitted to G-code and used to estimate print time."
+msgstr "Maschinengrenzen werden im G-Code ausgegeben und zur Schätzung der Druckzeit verwendet."
+
+#: src/slic3r/GUI/Tab.cpp:3663
+msgid "Machine limits will NOT be emitted to G-code, however they will be used to estimate print time, which may therefore not be accurate as the printer may apply a different set of machine limits."
+msgstr "Maschinenlimits werden NICHT im G-Code ausgegeben, sie werden jedoch zur Schätzung der Druckzeit verwendet, die daher möglicherweise nicht genau ist, da der Drucker möglicherweise eine andere Reihe von Maschinenlimits anwendet."
+
+#: src/slic3r/GUI/Plater.cpp:172
msgid "Manifold"
msgstr "Hülle ok"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56
msgid "Manual editing"
msgstr "Manuelle Bearbeitung"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:180
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:214
msgid "Masked SLA file exported to %1%"
msgstr "Maskierte SLA-Datei exportiert nach %1%"
-#: src/slic3r/GUI/MainFrame.cpp:752
+#: src/slic3r/GUI/MainFrame.cpp:1451
msgid "Mate&rial Settings Tab"
msgstr "Mate&rial Einstellungen"
-#: src/slic3r/GUI/Tab.cpp:3478 src/slic3r/GUI/Tab.cpp:3480
+#: src/slic3r/GUI/Tab.cpp:3894 src/slic3r/GUI/Tab.cpp:3896
msgid "Material"
msgstr "Material"
-#: src/slic3r/GUI/Tab.hpp:416
+#: src/slic3r/GUI/Tab.hpp:486
msgid "Material Settings"
msgstr "Material Einstellungen"
-#: src/slic3r/GUI/Plater.cpp:163
+#: src/slic3r/GUI/GLCanvas3D.cpp:4304 src/slic3r/GUI/GLCanvas3D.cpp:4940
+msgid "Material Settings Tab"
+msgstr "Materialeinstellungsreiter"
+
+#: src/slic3r/GUI/Plater.cpp:169
msgid "Materials"
msgstr "Material"
-#: src/libslic3r/PrintConfig.cpp:1217 src/libslic3r/PrintConfig.cpp:1226
+#: src/libslic3r/PrintConfig.cpp:1325 src/libslic3r/PrintConfig.cpp:1334
msgid "Max"
msgstr "Max"
-#: src/libslic3r/PrintConfig.cpp:2734
+#: src/libslic3r/PrintConfig.cpp:2898
msgid "Max bridge length"
msgstr "Max Überbrückungslänge"
-#: src/libslic3r/PrintConfig.cpp:2658
+#: src/libslic3r/PrintConfig.cpp:2812
msgid "Max bridges on a pillar"
msgstr "Max Brücken auf einem Pfeiler"
-#: src/libslic3r/PrintConfig.cpp:2822
+#: src/libslic3r/PrintConfig.cpp:2986
msgid "Max merge distance"
msgstr "Maximaler Zusammenfügeabstand"
-#: src/libslic3r/PrintConfig.cpp:2743
+#: src/libslic3r/PrintConfig.cpp:2907
msgid "Max pillar linking distance"
msgstr "Max. Pfeiler Verbindungsabstand"
@@ -4188,7 +4967,7 @@ msgstr "Max. Pfeiler Verbindungsabstand"
msgid "Max print height"
msgstr "Max. Druckhöhe"
-#: src/libslic3r/PrintConfig.cpp:1237
+#: src/libslic3r/PrintConfig.cpp:1345
msgid "Max print speed"
msgstr "Maximale Druckgeschwindigkeit"
@@ -4196,171 +4975,193 @@ msgstr "Maximale Druckgeschwindigkeit"
msgid "max PrusaSlicer version"
msgstr "max PrusaSlicer Version"
-#: src/libslic3r/PrintConfig.cpp:1268
+#: src/libslic3r/PrintConfig.cpp:1376
msgid "Max volumetric slope negative"
msgstr "Max. volumetrische Steigung negativ"
-#: src/libslic3r/PrintConfig.cpp:1257
+#: src/libslic3r/PrintConfig.cpp:1365
msgid "Max volumetric slope positive"
msgstr "Max. volumetrische Steigung positiv"
-#: src/libslic3r/PrintConfig.cpp:597 src/libslic3r/PrintConfig.cpp:1247
+#: src/libslic3r/PrintConfig.cpp:633 src/libslic3r/PrintConfig.cpp:1355
msgid "Max volumetric speed"
msgstr "Maximale Volumengeschwindigkeit"
-#: src/libslic3r/PrintConfig.cpp:2268
+#: src/libslic3r/PrintConfig.cpp:2411
msgid "Maximal bridging distance"
msgstr "Maximaler Überbrückungsabstand"
-#: src/libslic3r/PrintConfig.cpp:2269
+#: src/libslic3r/PrintConfig.cpp:2412
msgid "Maximal distance between supports on sparse infill sections."
msgstr "Maximalabstand zwischen Stützen auf spärlichen Infill-Abschnitten."
-#: src/libslic3r/PrintConfig.cpp:1145
+#: src/libslic3r/PrintConfig.cpp:1253
msgid "Maximum acceleration E"
msgstr "Maximale Beschleunigung E"
-#: src/libslic3r/PrintConfig.cpp:1151
+#: src/libslic3r/PrintConfig.cpp:1259
msgid "Maximum acceleration of the E axis"
msgstr "Maximale Beschleunigung der E-Achse"
-#: src/libslic3r/PrintConfig.cpp:1148
+#: src/libslic3r/PrintConfig.cpp:1256
msgid "Maximum acceleration of the X axis"
msgstr "Maximale Beschleunigung der X-Achse"
-#: src/libslic3r/PrintConfig.cpp:1149
+#: src/libslic3r/PrintConfig.cpp:1257
msgid "Maximum acceleration of the Y axis"
msgstr "Maximale Beschleunigung der Y-Achse"
-#: src/libslic3r/PrintConfig.cpp:1150
+#: src/libslic3r/PrintConfig.cpp:1258
msgid "Maximum acceleration of the Z axis"
msgstr "Maximale Beschleunigung der Z-Achse"
-#: src/libslic3r/PrintConfig.cpp:1198
+#: src/libslic3r/PrintConfig.cpp:1306
msgid "Maximum acceleration when extruding"
msgstr "Maximale Beschleunigung beim Extrudieren"
-#: src/libslic3r/PrintConfig.cpp:1200
+#: src/libslic3r/PrintConfig.cpp:1308
msgid "Maximum acceleration when extruding (M204 S)"
msgstr "Maximale Beschleunigung beim Extrudieren (M204 S)"
-#: src/libslic3r/PrintConfig.cpp:1208
+#: src/libslic3r/PrintConfig.cpp:1316
msgid "Maximum acceleration when retracting"
msgstr "Maximale Beschleunigung beim Einzug"
-#: src/libslic3r/PrintConfig.cpp:1210
+#: src/libslic3r/PrintConfig.cpp:1318
msgid "Maximum acceleration when retracting (M204 T)"
msgstr "Maximale Beschleunigung beim Einzug (M204 T)"
-#: src/libslic3r/PrintConfig.cpp:1142
+#: src/libslic3r/PrintConfig.cpp:1250
msgid "Maximum acceleration X"
msgstr "Maximale Beschleunigung X"
-#: src/libslic3r/PrintConfig.cpp:1143
+#: src/libslic3r/PrintConfig.cpp:1251
msgid "Maximum acceleration Y"
msgstr "Maximale Beschleunigung Y"
-#: src/libslic3r/PrintConfig.cpp:1144
+#: src/libslic3r/PrintConfig.cpp:1252
msgid "Maximum acceleration Z"
msgstr "Maximale Beschleunigung Z"
-#: src/slic3r/GUI/Tab.cpp:2222
+#: src/slic3r/GUI/Tab.cpp:2391
msgid "Maximum accelerations"
msgstr "Maximale Beschleunigungen"
-#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2534
+#: src/libslic3r/PrintConfig.cpp:2676 src/libslic3r/PrintConfig.cpp:2677
msgid "Maximum exposure time"
msgstr "Maximale Belichtungszeit"
-#: src/libslic3r/PrintConfig.cpp:1128
+#: src/libslic3r/PrintConfig.cpp:1236
msgid "Maximum feedrate E"
msgstr "Maximaler Vorschub E"
-#: src/libslic3r/PrintConfig.cpp:1134
+#: src/libslic3r/PrintConfig.cpp:1242
msgid "Maximum feedrate of the E axis"
msgstr "Maximaler Vorschub auf der E-Achse"
-#: src/libslic3r/PrintConfig.cpp:1131
+#: src/libslic3r/PrintConfig.cpp:1239
msgid "Maximum feedrate of the X axis"
msgstr "Maximaler Vorschub auf der X-Achse"
-#: src/libslic3r/PrintConfig.cpp:1132
+#: src/libslic3r/PrintConfig.cpp:1240
msgid "Maximum feedrate of the Y axis"
msgstr "Maximaler Vorschub auf der Y-Achse"
-#: src/libslic3r/PrintConfig.cpp:1133
+#: src/libslic3r/PrintConfig.cpp:1241
msgid "Maximum feedrate of the Z axis"
msgstr "Maximaler Vorschub auf der Z-Achse"
-#: src/libslic3r/PrintConfig.cpp:1125
+#: src/libslic3r/PrintConfig.cpp:1233
msgid "Maximum feedrate X"
msgstr "Maximaler Vorschub X"
-#: src/libslic3r/PrintConfig.cpp:1126
+#: src/libslic3r/PrintConfig.cpp:1234
msgid "Maximum feedrate Y"
msgstr "Maximaler Vorschub Y"
-#: src/libslic3r/PrintConfig.cpp:1127
+#: src/libslic3r/PrintConfig.cpp:1235
msgid "Maximum feedrate Z"
msgstr "Maximaler Vorschub Z"
-#: src/slic3r/GUI/Tab.cpp:2217
+#: src/slic3r/GUI/Tab.cpp:2386
msgid "Maximum feedrates"
msgstr "Maximaler Vorschub"
-#: src/libslic3r/PrintConfig.cpp:2556 src/libslic3r/PrintConfig.cpp:2557
+#: src/libslic3r/PrintConfig.cpp:2699 src/libslic3r/PrintConfig.cpp:2700
msgid "Maximum initial exposure time"
msgstr "Maximale Anfang-Belichtungszeit"
-#: src/libslic3r/PrintConfig.cpp:1162
+#: src/libslic3r/PrintConfig.cpp:1270
msgid "Maximum jerk E"
msgstr "Maximaler Ruck E"
-#: src/libslic3r/PrintConfig.cpp:1168
+#: src/libslic3r/PrintConfig.cpp:1276
msgid "Maximum jerk of the E axis"
msgstr "Maximaler Ruck auf der E-Achse"
-#: src/libslic3r/PrintConfig.cpp:1165
+#: src/libslic3r/PrintConfig.cpp:1273
msgid "Maximum jerk of the X axis"
msgstr "Maximaler Ruck auf der X-Achse"
-#: src/libslic3r/PrintConfig.cpp:1166
+#: src/libslic3r/PrintConfig.cpp:1274
msgid "Maximum jerk of the Y axis"
msgstr "Maximaler Ruck auf der Y-Achse"
-#: src/libslic3r/PrintConfig.cpp:1167
+#: src/libslic3r/PrintConfig.cpp:1275
msgid "Maximum jerk of the Z axis"
msgstr "Maximaler Ruck auf der Z-Achse"
-#: src/libslic3r/PrintConfig.cpp:1159
+#: src/libslic3r/PrintConfig.cpp:1267
msgid "Maximum jerk X"
msgstr "Maximaler Ruck X"
-#: src/libslic3r/PrintConfig.cpp:1160
+#: src/libslic3r/PrintConfig.cpp:1268
msgid "Maximum jerk Y"
msgstr "Maximaler Ruck Y"
-#: src/libslic3r/PrintConfig.cpp:1161
+#: src/libslic3r/PrintConfig.cpp:1269
msgid "Maximum jerk Z"
msgstr "Maximaler Ruck Z"
-#: src/libslic3r/PrintConfig.cpp:2660
+#: src/libslic3r/PrintConfig.cpp:1095
+msgid "Maximum length of the infill anchor"
+msgstr "Maximale Länge des Infill-Ankers"
+
+#: src/libslic3r/PrintConfig.cpp:2814
msgid "Maximum number of bridges that can be placed on a pillar. Bridges hold support point pinheads and connect to pillars as small branches."
msgstr "Maximale Anzahl von Brücken, die auf einen Pfeiler gesetzt werden können. Brücken halten Stützpunkt-Nadelköpfe und verbinden sich als kleine Äste mit den Pfeilern."
-#: src/libslic3r/PrintConfig.cpp:598
+#: src/libslic3r/PrintConfig.cpp:634
msgid "Maximum volumetric speed allowed for this filament. Limits the maximum volumetric speed of a print to the minimum of print and filament volumetric speed. Set to zero for no limit."
msgstr "Maximale volumetrische Geschwindigkeit, die für dieses Filament zulässig ist. Begrenzt die maximale volumetrische Geschwindigkeit eines Drucks auf das Minimum von Druck- und Filament-Volumengeschwindigkeit. Wird auf null gesetzt, wenn es keine Begrenzung gibt."
-#: src/libslic3r/PrintConfig.cpp:3442
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1868
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1876
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2569 src/libslic3r/PrintConfig.cpp:3641
msgid "Merge"
msgstr "Zusammenfügen"
-#: src/libslic3r/PrintConfig.cpp:2683
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2660
+msgid "Merge all parts to the one single object"
+msgstr "Alle Teile zu einem einzigen Objekt zusammenfügen"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1868
+msgid "Merge objects to the one multipart object"
+msgstr "Objekte zu einem mehrteiligen Objekt zusammenführen"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1876
+msgid "Merge objects to the one single object"
+msgstr "Objekte zu einem einzigen Objekt zusammenführen"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2576
+msgid "Merged"
+msgstr "Zusammengeführt"
+
+#: src/libslic3r/PrintConfig.cpp:2847
msgid "Merging bridges or pillars into another pillars can increase the radius. Zero means no increase, one means full increase."
msgstr "Das Zusammenfügen von Brücken oder Säulen in andere Säulen kann den Radius vergrößern. Null bedeutet keine Erhöhung, eins bedeutet volle Erhöhung."
-#: src/libslic3r/SLAPrintSteps.cpp:64
+#: src/libslic3r/SLAPrintSteps.cpp:65
msgid "Merging slices and calculating statistics"
msgstr "Zusammenführung der Slices und Berechnung der Statistiken"
@@ -4368,15 +5169,15 @@ msgstr "Zusammenführung der Slices und Berechnung der Statistiken"
msgid "Mesh repair failed."
msgstr "Netzreparatur fehlgeschlagen."
-#: src/slic3r/GUI/DoubleSlider.cpp:1635
+#: src/slic3r/GUI/DoubleSlider.cpp:1831
msgid "Message for pause print on current layer (%1% mm)."
msgstr "Meldung für die Druckpause auf der aktuellen Schicht (%1% mm)."
-#: src/libslic3r/PrintConfig.cpp:1280 src/libslic3r/PrintConfig.cpp:1289
+#: src/libslic3r/PrintConfig.cpp:1388 src/libslic3r/PrintConfig.cpp:1397
msgid "Min"
msgstr "Min"
-#: src/libslic3r/PrintConfig.cpp:1298
+#: src/libslic3r/PrintConfig.cpp:1406
msgid "Min print speed"
msgstr "Minimale Druckgeschwindigkeit"
@@ -4384,232 +5185,241 @@ msgstr "Minimale Druckgeschwindigkeit"
msgid "min PrusaSlicer version"
msgstr "min PrusaSlicer Version"
-#: src/libslic3r/PrintConfig.cpp:2772
+#: src/libslic3r/PrintConfig.cpp:2936
msgid "Minimal distance of the support points"
msgstr "Minimaler Abstand der Stützpunkte"
-#: src/libslic3r/PrintConfig.cpp:1306
+#: src/libslic3r/PrintConfig.cpp:1414
msgid "Minimal filament extrusion length"
msgstr "Minimale Filament Extrusionlänge"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53
msgid "Minimal points distance"
msgstr "Minimaler Prunktabstand"
-#: src/libslic3r/PrintConfig.cpp:667
+#: src/libslic3r/PrintConfig.cpp:703
msgid "Minimal purge on wipe tower"
msgstr "Minimale Wischmenge im Wischturm"
-#: src/libslic3r/PrintConfig.cpp:187
+#: src/libslic3r/PrintConfig.cpp:221
msgid "Minimum bottom shell thickness"
msgstr "Minimale Stärke der Bodenschale"
-#: src/slic3r/GUI/PresetHints.cpp:339
+#: src/slic3r/GUI/PresetHints.cpp:337
msgid "Minimum bottom shell thickness is %1% mm."
msgstr "Die Mindeststärke der Bodenschale beträgt %1% mm."
-#: src/libslic3r/PrintConfig.cpp:1512
+#: src/libslic3r/PrintConfig.cpp:1620
msgid "Minimum detail resolution, used to simplify the input file for speeding up the slicing job and reducing memory usage. High-resolution models often carry more detail than printers can render. Set to zero to disable any simplification and use full resolution from input."
msgstr "Minimale Detailauflösung, die verwendet wird, um die Eingabedatei zu vereinfachen, um den Slicingjob zu beschleunigen und den Speicherverbrauch zu reduzieren. Hochauflösende Modelle weisen oft mehr Details auf, als der Drucker wiedergeben kann. Setzen Sie den Wert auf Null, um die Vereinfachung zu deaktivieren und die volle Auflösung des Eingangsdatei zu verwenden."
-#: src/libslic3r/PrintConfig.cpp:2525 src/libslic3r/PrintConfig.cpp:2526
+#: src/libslic3r/PrintConfig.cpp:2668 src/libslic3r/PrintConfig.cpp:2669
msgid "Minimum exposure time"
msgstr "Minimale Belichtungszeit"
-#: src/libslic3r/PrintConfig.cpp:1178
+#: src/libslic3r/PrintConfig.cpp:1286
msgid "Minimum feedrate when extruding"
msgstr "Maximaler Vorschub bei Extrusion"
-#: src/libslic3r/PrintConfig.cpp:1180
+#: src/libslic3r/PrintConfig.cpp:1288
msgid "Minimum feedrate when extruding (M205 S)"
msgstr "Minimaler Vorschub beim Extrudieren (M205 S)"
-#: src/slic3r/GUI/Tab.cpp:2234
+#: src/slic3r/GUI/Tab.cpp:2403
msgid "Minimum feedrates"
msgstr "Minimaler Vorschub"
-#: src/libslic3r/PrintConfig.cpp:2548 src/libslic3r/PrintConfig.cpp:2549
+#: src/libslic3r/PrintConfig.cpp:2691 src/libslic3r/PrintConfig.cpp:2692
msgid "Minimum initial exposure time"
msgstr "Minimale Anfang-Belichtungszeit"
-#: src/slic3r/GUI/Tab.cpp:1069
+#: src/slic3r/GUI/Tab.cpp:1391
msgid "Minimum shell thickness"
msgstr "Minimale Schalenstärke"
-#: src/libslic3r/PrintConfig.cpp:1787 src/libslic3r/PrintConfig.cpp:1788
+#: src/libslic3r/PrintConfig.cpp:1902 src/libslic3r/PrintConfig.cpp:1903
msgid "Minimum thickness of a top / bottom shell"
msgstr "Mindeststärke einer Ober-/Bodenschale"
-#: src/libslic3r/PrintConfig.cpp:2146
+#: src/libslic3r/PrintConfig.cpp:2289
msgid "Minimum top shell thickness"
msgstr "Mindeststärke der oberen Schale"
-#: src/slic3r/GUI/PresetHints.cpp:320
+#: src/slic3r/GUI/PresetHints.cpp:318
msgid "Minimum top shell thickness is %1% mm."
msgstr "Die Mindeststärke der Oberschale beträgt %1% mm."
-#: src/libslic3r/PrintConfig.cpp:1522
+#: src/libslic3r/PrintConfig.cpp:1630
msgid "Minimum travel after retraction"
msgstr "Minimalbewegung nach Einziehen"
-#: src/libslic3r/PrintConfig.cpp:1188
+#: src/libslic3r/PrintConfig.cpp:1296
msgid "Minimum travel feedrate"
msgstr "Minimaler Vorschub im Eilgang"
-#: src/libslic3r/PrintConfig.cpp:1190
+#: src/libslic3r/PrintConfig.cpp:1298
msgid "Minimum travel feedrate (M205 T)"
msgstr "Minimaler Vorschub im Eilgang (M205 T)"
-#: src/libslic3r/PrintConfig.cpp:2917
+#: src/libslic3r/PrintConfig.cpp:3081
msgid "Minimum wall thickness of a hollowed model."
msgstr "Mindestwandstärke eines ausgehöhlten Modells."
-#: src/libslic3r/PrintConfig.cpp:2449
+#: src/libslic3r/PrintConfig.cpp:2592
msgid "Minimum width of features to maintain when doing elephant foot compensation."
msgstr "Mindestbreite der Merkmale, die bei der Kompensation des Elefantenfußes einzuhalten sind."
-#: src/slic3r/GUI/Plater.cpp:4002
+#: src/slic3r/GUI/Plater.cpp:3922
msgid "Mirror"
msgstr "Spiegeln"
-#: src/libslic3r/PrintConfig.cpp:2379
+#: src/libslic3r/PrintConfig.cpp:2522
msgid "Mirror horizontally"
msgstr "Horizontal spiegeln"
-#: src/slic3r/GUI/GLCanvas3D.cpp:2053
+#: src/slic3r/GUI/GLCanvas3D.cpp:2226
msgid "Mirror Object"
msgstr "Objekt spiegeln"
-#: src/slic3r/GUI/Plater.cpp:4002
+#: src/slic3r/GUI/Plater.cpp:3922
msgid "Mirror the selected object"
msgstr "Ausgewähltes Objekt spiegeln"
-#: src/slic3r/GUI/Plater.cpp:3995
+#: src/slic3r/GUI/Plater.cpp:3915
msgid "Mirror the selected object along the X axis"
msgstr "Ausgewähltes Objekt entlang der X-Achse spiegeln"
-#: src/slic3r/GUI/Plater.cpp:3997
+#: src/slic3r/GUI/Plater.cpp:3917
msgid "Mirror the selected object along the Y axis"
msgstr "Ausgewähltes Objekt entlang der Y-Achse spiegeln"
-#: src/slic3r/GUI/Plater.cpp:3999
+#: src/slic3r/GUI/Plater.cpp:3919
msgid "Mirror the selected object along the Z axis"
msgstr "Ausgewähltes Objekt entlang der Z-Achse spiegeln"
-#: src/libslic3r/PrintConfig.cpp:2386
+#: src/libslic3r/PrintConfig.cpp:2529
msgid "Mirror vertically"
msgstr "Vertikal spiegeln"
-#: src/slic3r/Utils/AstroBox.cpp:68 src/slic3r/Utils/OctoPrint.cpp:68
-#, c-format
+#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:68
+#, possible-c-format
msgid "Mismatched type of print host: %s"
msgstr "Nicht übereinstimmender Typ des Druckhosts: %s"
-#: src/libslic3r/ExtrusionEntity.cpp:323
+#: src/libslic3r/ExtrusionEntity.cpp:328 src/libslic3r/ExtrusionEntity.cpp:364
msgid "Mixed"
msgstr "Gemischt"
-#: src/libslic3r/PrintConfig.cpp:2491
+#: src/libslic3r/PrintConfig.cpp:2634
msgid "ml"
msgstr "ml"
-#: src/slic3r/GUI/BedShapeDialog.cpp:92 src/slic3r/GUI/ConfigWizard.cpp:218
-#: src/slic3r/GUI/ConfigWizard.cpp:970 src/slic3r/GUI/ConfigWizard.cpp:984
+#: src/slic3r/GUI/BedShapeDialog.cpp:129 src/slic3r/GUI/ConfigWizard.cpp:236
+#: src/slic3r/GUI/ConfigWizard.cpp:1336 src/slic3r/GUI/ConfigWizard.cpp:1350
#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:87
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:135
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:333
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:94
+#: src/slic3r/GUI/GCodeViewer.cpp:2183 src/slic3r/GUI/GCodeViewer.cpp:2189
+#: src/slic3r/GUI/GCodeViewer.cpp:2197 src/slic3r/GUI/GUI_ObjectLayers.cpp:145
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:96
#: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:75
-#: src/libslic3r/PrintConfig.cpp:82 src/libslic3r/PrintConfig.cpp:91
-#: src/libslic3r/PrintConfig.cpp:122 src/libslic3r/PrintConfig.cpp:188
-#: src/libslic3r/PrintConfig.cpp:246 src/libslic3r/PrintConfig.cpp:321
-#: src/libslic3r/PrintConfig.cpp:329 src/libslic3r/PrintConfig.cpp:379
-#: src/libslic3r/PrintConfig.cpp:505 src/libslic3r/PrintConfig.cpp:516
-#: src/libslic3r/PrintConfig.cpp:534 src/libslic3r/PrintConfig.cpp:712
-#: src/libslic3r/PrintConfig.cpp:1231 src/libslic3r/PrintConfig.cpp:1292
-#: src/libslic3r/PrintConfig.cpp:1310 src/libslic3r/PrintConfig.cpp:1328
-#: src/libslic3r/PrintConfig.cpp:1384 src/libslic3r/PrintConfig.cpp:1394
-#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1524
-#: src/libslic3r/PrintConfig.cpp:1565 src/libslic3r/PrintConfig.cpp:1573
-#: src/libslic3r/PrintConfig.cpp:1583 src/libslic3r/PrintConfig.cpp:1591
-#: src/libslic3r/PrintConfig.cpp:1599 src/libslic3r/PrintConfig.cpp:1682
-#: src/libslic3r/PrintConfig.cpp:1914 src/libslic3r/PrintConfig.cpp:1985
-#: src/libslic3r/PrintConfig.cpp:2019 src/libslic3r/PrintConfig.cpp:2147
-#: src/libslic3r/PrintConfig.cpp:2226 src/libslic3r/PrintConfig.cpp:2233
-#: src/libslic3r/PrintConfig.cpp:2240 src/libslic3r/PrintConfig.cpp:2270
-#: src/libslic3r/PrintConfig.cpp:2280 src/libslic3r/PrintConfig.cpp:2290
-#: src/libslic3r/PrintConfig.cpp:2450 src/libslic3r/PrintConfig.cpp:2484
-#: src/libslic3r/PrintConfig.cpp:2623 src/libslic3r/PrintConfig.cpp:2632
-#: src/libslic3r/PrintConfig.cpp:2641 src/libslic3r/PrintConfig.cpp:2651
-#: src/libslic3r/PrintConfig.cpp:2695 src/libslic3r/PrintConfig.cpp:2705
-#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2737
-#: src/libslic3r/PrintConfig.cpp:2747 src/libslic3r/PrintConfig.cpp:2757
-#: src/libslic3r/PrintConfig.cpp:2775 src/libslic3r/PrintConfig.cpp:2790
-#: src/libslic3r/PrintConfig.cpp:2804 src/libslic3r/PrintConfig.cpp:2815
-#: src/libslic3r/PrintConfig.cpp:2828 src/libslic3r/PrintConfig.cpp:2873
-#: src/libslic3r/PrintConfig.cpp:2883 src/libslic3r/PrintConfig.cpp:2892
-#: src/libslic3r/PrintConfig.cpp:2902 src/libslic3r/PrintConfig.cpp:2918
-#: src/libslic3r/PrintConfig.cpp:2942
+#: src/libslic3r/PrintConfig.cpp:82 src/libslic3r/PrintConfig.cpp:93
+#: src/libslic3r/PrintConfig.cpp:124 src/libslic3r/PrintConfig.cpp:222
+#: src/libslic3r/PrintConfig.cpp:280 src/libslic3r/PrintConfig.cpp:355
+#: src/libslic3r/PrintConfig.cpp:363 src/libslic3r/PrintConfig.cpp:413
+#: src/libslic3r/PrintConfig.cpp:541 src/libslic3r/PrintConfig.cpp:552
+#: src/libslic3r/PrintConfig.cpp:570 src/libslic3r/PrintConfig.cpp:748
+#: src/libslic3r/PrintConfig.cpp:1158 src/libslic3r/PrintConfig.cpp:1339
+#: src/libslic3r/PrintConfig.cpp:1400 src/libslic3r/PrintConfig.cpp:1418
+#: src/libslic3r/PrintConfig.cpp:1436 src/libslic3r/PrintConfig.cpp:1492
+#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1624
+#: src/libslic3r/PrintConfig.cpp:1632 src/libslic3r/PrintConfig.cpp:1673
+#: src/libslic3r/PrintConfig.cpp:1681 src/libslic3r/PrintConfig.cpp:1691
+#: src/libslic3r/PrintConfig.cpp:1699 src/libslic3r/PrintConfig.cpp:1707
+#: src/libslic3r/PrintConfig.cpp:1790 src/libslic3r/PrintConfig.cpp:2056
+#: src/libslic3r/PrintConfig.cpp:2127 src/libslic3r/PrintConfig.cpp:2161
+#: src/libslic3r/PrintConfig.cpp:2290 src/libslic3r/PrintConfig.cpp:2369
+#: src/libslic3r/PrintConfig.cpp:2376 src/libslic3r/PrintConfig.cpp:2383
+#: src/libslic3r/PrintConfig.cpp:2413 src/libslic3r/PrintConfig.cpp:2423
+#: src/libslic3r/PrintConfig.cpp:2433 src/libslic3r/PrintConfig.cpp:2593
+#: src/libslic3r/PrintConfig.cpp:2627 src/libslic3r/PrintConfig.cpp:2766
+#: src/libslic3r/PrintConfig.cpp:2775 src/libslic3r/PrintConfig.cpp:2784
+#: src/libslic3r/PrintConfig.cpp:2794 src/libslic3r/PrintConfig.cpp:2859
+#: src/libslic3r/PrintConfig.cpp:2869 src/libslic3r/PrintConfig.cpp:2881
+#: src/libslic3r/PrintConfig.cpp:2901 src/libslic3r/PrintConfig.cpp:2911
+#: src/libslic3r/PrintConfig.cpp:2921 src/libslic3r/PrintConfig.cpp:2939
+#: src/libslic3r/PrintConfig.cpp:2954 src/libslic3r/PrintConfig.cpp:2968
+#: src/libslic3r/PrintConfig.cpp:2979 src/libslic3r/PrintConfig.cpp:2992
+#: src/libslic3r/PrintConfig.cpp:3037 src/libslic3r/PrintConfig.cpp:3047
+#: src/libslic3r/PrintConfig.cpp:3056 src/libslic3r/PrintConfig.cpp:3066
+#: src/libslic3r/PrintConfig.cpp:3082 src/libslic3r/PrintConfig.cpp:3106
msgid "mm"
msgstr "mm"
-#: src/libslic3r/PrintConfig.cpp:1547 src/libslic3r/PrintConfig.cpp:1556
+#: src/libslic3r/PrintConfig.cpp:1655 src/libslic3r/PrintConfig.cpp:1664
msgid "mm (zero to disable)"
-msgstr "mm (null eingeben zum Deaktivieren)"
-
-#: src/libslic3r/PrintConfig.cpp:451 src/libslic3r/PrintConfig.cpp:560
-#: src/libslic3r/PrintConfig.cpp:882 src/libslic3r/PrintConfig.cpp:895
-#: src/libslic3r/PrintConfig.cpp:1015 src/libslic3r/PrintConfig.cpp:1041
-#: src/libslic3r/PrintConfig.cpp:1423 src/libslic3r/PrintConfig.cpp:1761
-#: src/libslic3r/PrintConfig.cpp:1883 src/libslic3r/PrintConfig.cpp:1951
-#: src/libslic3r/PrintConfig.cpp:2111
+msgstr "mm (Null zum Deaktivieren)"
+
+#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:596
+#: src/libslic3r/PrintConfig.cpp:924 src/libslic3r/PrintConfig.cpp:937
+#: src/libslic3r/PrintConfig.cpp:1059 src/libslic3r/PrintConfig.cpp:1085
+#: src/libslic3r/PrintConfig.cpp:1531 src/libslic3r/PrintConfig.cpp:1876
+#: src/libslic3r/PrintConfig.cpp:2025 src/libslic3r/PrintConfig.cpp:2093
+#: src/libslic3r/PrintConfig.cpp:2254
msgid "mm or %"
msgstr "mm oder %"
-#: src/libslic3r/PrintConfig.cpp:237 src/libslic3r/PrintConfig.cpp:609
-#: src/libslic3r/PrintConfig.cpp:617 src/libslic3r/PrintConfig.cpp:626
-#: src/libslic3r/PrintConfig.cpp:634 src/libslic3r/PrintConfig.cpp:661
-#: src/libslic3r/PrintConfig.cpp:680 src/libslic3r/PrintConfig.cpp:922
-#: src/libslic3r/PrintConfig.cpp:1050 src/libslic3r/PrintConfig.cpp:1135
-#: src/libslic3r/PrintConfig.cpp:1169 src/libslic3r/PrintConfig.cpp:1181
-#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:1241
-#: src/libslic3r/PrintConfig.cpp:1300 src/libslic3r/PrintConfig.cpp:1433
-#: src/libslic3r/PrintConfig.cpp:1607 src/libslic3r/PrintConfig.cpp:1616
-#: src/libslic3r/PrintConfig.cpp:2028 src/libslic3r/PrintConfig.cpp:2154
+#: src/libslic3r/PrintConfig.cpp:193
+msgid "mm or % (zero to disable)"
+msgstr "mm oder % (Null zum Deaktivieren)"
+
+#: src/libslic3r/PrintConfig.cpp:271 src/libslic3r/PrintConfig.cpp:645
+#: src/libslic3r/PrintConfig.cpp:653 src/libslic3r/PrintConfig.cpp:662
+#: src/libslic3r/PrintConfig.cpp:670 src/libslic3r/PrintConfig.cpp:697
+#: src/libslic3r/PrintConfig.cpp:716 src/libslic3r/PrintConfig.cpp:966
+#: src/libslic3r/PrintConfig.cpp:1094 src/libslic3r/PrintConfig.cpp:1167
+#: src/libslic3r/PrintConfig.cpp:1243 src/libslic3r/PrintConfig.cpp:1277
+#: src/libslic3r/PrintConfig.cpp:1289 src/libslic3r/PrintConfig.cpp:1299
+#: src/libslic3r/PrintConfig.cpp:1349 src/libslic3r/PrintConfig.cpp:1408
+#: src/libslic3r/PrintConfig.cpp:1541 src/libslic3r/PrintConfig.cpp:1715
+#: src/libslic3r/PrintConfig.cpp:1724 src/libslic3r/PrintConfig.cpp:2170
+#: src/libslic3r/PrintConfig.cpp:2297
msgid "mm/s"
msgstr "mm/s"
-#: src/libslic3r/PrintConfig.cpp:462 src/libslic3r/PrintConfig.cpp:904
-#: src/libslic3r/PrintConfig.cpp:1720 src/libslic3r/PrintConfig.cpp:1772
-#: src/libslic3r/PrintConfig.cpp:1995 src/libslic3r/PrintConfig.cpp:2124
+#: src/libslic3r/PrintConfig.cpp:498 src/libslic3r/PrintConfig.cpp:946
+#: src/libslic3r/PrintConfig.cpp:1835 src/libslic3r/PrintConfig.cpp:1887
+#: src/libslic3r/PrintConfig.cpp:2137 src/libslic3r/PrintConfig.cpp:2267
msgid "mm/s or %"
msgstr "mm/s oder %"
-#: src/libslic3r/PrintConfig.cpp:196 src/libslic3r/PrintConfig.cpp:339
-#: src/libslic3r/PrintConfig.cpp:862 src/libslic3r/PrintConfig.cpp:984
-#: src/libslic3r/PrintConfig.cpp:1152 src/libslic3r/PrintConfig.cpp:1201
-#: src/libslic3r/PrintConfig.cpp:1211 src/libslic3r/PrintConfig.cpp:1403
+#: src/libslic3r/PrintConfig.cpp:230 src/libslic3r/PrintConfig.cpp:373
+#: src/libslic3r/PrintConfig.cpp:902 src/libslic3r/PrintConfig.cpp:1028
+#: src/libslic3r/PrintConfig.cpp:1260 src/libslic3r/PrintConfig.cpp:1309
+#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1511
msgid "mm/s²"
msgstr "mm/s²"
-#: src/libslic3r/PrintConfig.cpp:1730
+#: src/libslic3r/PrintConfig.cpp:1845
msgid "mm²"
msgstr "mm²"
-#: src/libslic3r/PrintConfig.cpp:672
+#: src/libslic3r/PrintConfig.cpp:708
msgid "mm³"
msgstr "mm³"
-#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:601
-#: src/libslic3r/PrintConfig.cpp:1250
+#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:637
+#: src/libslic3r/PrintConfig.cpp:1358
msgid "mm³/s"
msgstr "mm³/s"
-#: src/libslic3r/PrintConfig.cpp:1262 src/libslic3r/PrintConfig.cpp:1273
+#: src/libslic3r/PrintConfig.cpp:1370 src/libslic3r/PrintConfig.cpp:1381
msgid "mm³/s²"
msgstr "mm³/s²"
-#: src/slic3r/GUI/GUI_App.cpp:820
+#: src/slic3r/GUI/GUI_App.cpp:1512
msgid "Mode"
msgstr "&Modus"
@@ -4617,7 +5427,7 @@ msgstr "&Modus"
msgid "model"
msgstr "Modell"
-#: src/slic3r/GUI/BedShapeDialog.cpp:251
+#: src/slic3r/GUI/BedShapeDialog.cpp:395
msgid "Model"
msgstr "Modell"
@@ -4646,151 +5456,192 @@ msgstr "Modellreparatur beendet"
msgid "Model repaired successfully"
msgstr "Modellreparatur erfolgreich"
-#: src/slic3r/GUI/Tab.cpp:979
+#: src/slic3r/GUI/GUI_App.cpp:1506 src/slic3r/GUI/wxExtensions.cpp:675
+msgctxt "Mode"
+msgid "Advanced"
+msgstr "Erweitert"
+
+#: src/slic3r/GUI/Tab.cpp:1241
msgid "Modifications to the current profile will be saved."
msgstr "Änderungen am aktuellen Profil werden gespeichert."
-#: src/slic3r/GUI/Preset.cpp:247
+#: src/slic3r/GUI/GUI_App.cpp:1425
msgid "modified"
msgstr "geändert"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
msgid "Modifier"
msgstr "Veränderer"
-#: src/slic3r/GUI/Tab.cpp:1161
+#: src/slic3r/GUI/Tab.cpp:1491
msgid "Modifiers"
msgstr "Veränderer"
-#: src/libslic3r/PrintConfig.cpp:2512
+#: src/libslic3r/PrintConfig.cpp:2655
msgid "money/bottle"
msgstr "Kosten/Flasche"
-#: src/libslic3r/PrintConfig.cpp:762
+#: src/libslic3r/PrintConfig.cpp:798
msgid "money/kg"
msgstr "Kosten/kg"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372
+#: src/libslic3r/PrintConfig.cpp:461
+msgid "Monotonic"
+msgstr "Monotonisch"
+
+#: src/slic3r/GUI/NotificationManager.cpp:305
+#: src/slic3r/GUI/NotificationManager.cpp:315
+msgid "More"
+msgstr "Mehr"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219
msgid "Mouse wheel"
msgstr "Mausrad"
-#: src/slic3r/GUI/GLCanvas3D.cpp:261
+#: src/slic3r/GUI/GLCanvas3D.cpp:249
msgid "Mouse wheel:"
msgstr "Mausrad:"
-#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:64
msgid "Move"
msgstr "Bewegen"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:255
+msgid "Move active slider thumb Left"
+msgstr "Bewege aktiven Schieberegler nach links"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:256
+msgid "Move active slider thumb Right"
+msgstr "Bewege aktiven Schieberegler nach rechts"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:220
+msgid "Move active thumb Down"
+msgstr "Aktiven Schieber nach unten bewegen"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:241
+msgid "Move active thumb Left"
+msgstr "Aktiven Schieber nach links bewegen"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:242
+msgid "Move active thumb Right"
+msgstr "Aktiven Schieber nach rechts bewegen"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+msgid "Move active thumb Up"
+msgstr "Aktiven Schieber nach oben bewegen"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219
msgid "Move clipping plane"
msgstr "Beschnittebene bewegen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
msgid "Move current slider thumb Down"
msgstr "Bewege aktuellen Schieberegler nach unten"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:214
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
msgid "Move current slider thumb Up"
msgstr "Bewege aktuellen Schieberegler nach oben"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1059
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:835
msgid "Move drainage hole"
msgstr "Drainageloch bewegen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:3505
+#: src/slic3r/GUI/GLCanvas3D.cpp:3810
msgid "Move Object"
msgstr "Objekt bewegen"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212
msgid "Move point"
msgstr "Punkt bewegen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:160
msgid "Move selection 10 mm in negative X direction"
msgstr "Auswahl 10 mm in negativer X-Richtung verschieben"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:159
msgid "Move selection 10 mm in negative Y direction"
msgstr "Auswahl 10 mm in negativer Y-Richtung verschieben"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:161
msgid "Move selection 10 mm in positive X direction"
msgstr "Auswahl 10 mm in positiver X-Richtung verschieben"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:158
msgid "Move selection 10 mm in positive Y direction"
msgstr "Auswahl 10 mm in positiver Y-Richtung verschieben"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1097
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:955
msgid "Move support point"
msgstr "Stützpunkt bewegen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
+#: src/slic3r/GUI/GCodeViewer.cpp:2492
+msgid "Movement"
+msgstr "Bewegung"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
msgid "Movement in camera space"
msgstr "Bewegung im Kameraraum"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:162
msgid "Movement step set to 1 mm"
msgstr "Bewegungsschritt auf 1 mm eingestellt"
-#: src/libslic3r/PrintConfig.cpp:2201
+#: src/libslic3r/PrintConfig.cpp:2344
msgid "Multi material printers may need to prime or purge extruders on tool changes. Extrude the excess material into the wipe tower."
msgstr "Multi-Material-Drucker müssen eventuell Extruder bei Werkzeugwechseln vor- oder nachspülen. Extrudieren Sie das überschüssige Material in den Reinigungsturm."
-#: src/slic3r/GUI/Plater.cpp:2360 src/slic3r/GUI/Plater.cpp:2413
+#: src/slic3r/GUI/Plater.cpp:2322 src/slic3r/GUI/Plater.cpp:2375
msgid "Multi-part object detected"
msgstr "Objekt mit mehreren Teilen erkannt"
#: src/slic3r/GUI/FirmwareDialog.cpp:419 src/slic3r/GUI/FirmwareDialog.cpp:454
-#, c-format
+#, possible-c-format
msgid "Multiple %s devices found. Please only connect one at a time for flashing."
msgstr "Mehrere %s Geräte gefunden. Bitte immer nur eins zum Flashen anschließen."
-#: src/slic3r/GUI/Tab.cpp:1179
+#: src/slic3r/GUI/Tab.cpp:1509
msgid "Multiple Extruders"
msgstr "Mehrere Extruder"
-#: src/slic3r/GUI/Plater.cpp:2410
-msgid ""
-"Multiple objects were loaded for a multi-material printer.\n"
-"Instead of considering them as multiple objects, should I consider\n"
-"these files to represent a single object having multiple parts?"
-msgstr ""
-"Für einen Multimaterialdrucker wurden mehrere Objekte geladen.\n"
-"Soll ich, anstatt sie als mehrere Objekte zu betrachten, \n"
-"diese Dateien als ein einzelnes Objekt mit mehreren Teilen behandeln?"
+#: src/slic3r/GUI/Plater.cpp:2372
+msgid "Multiple objects were loaded for a multi-material printer.\nInstead of considering them as multiple objects, should I consider\nthese files to represent a single object having multiple parts?"
+msgstr "Für einen Multimaterialdrucker wurden mehrere Objekte geladen.\nSoll ich, anstatt sie als mehrere Objekte zu betrachten, \ndiese Dateien als ein einzelnes Objekt mit mehreren Teilen behandeln?"
-#: src/libslic3r/PrintConfig.cpp:3439
+#: src/libslic3r/PrintConfig.cpp:3638
msgid "Multiply copies by creating a grid."
msgstr "Multiple Kopien durch Erstellen eines Rasters."
-#: src/libslic3r/PrintConfig.cpp:3434
+#: src/libslic3r/PrintConfig.cpp:3633
msgid "Multiply copies by this factor."
msgstr "Mehrfache Kopien mit diesem Faktor."
-#: src/slic3r/GUI/Field.cpp:150 src/slic3r/GUI/OptionsGroup.cpp:580
+#: src/slic3r/GUI/Field.cpp:198 src/slic3r/GUI/OptionsGroup.cpp:715
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:874
msgid "N/A"
msgstr "N.V."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:270
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153
+#: src/slic3r/GUI/GUI_ObjectList.cpp:284
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:161
msgid "Name"
msgstr "Name"
-#: src/libslic3r/PrintConfig.cpp:1488
+#: src/libslic3r/PrintConfig.cpp:114
+msgid "Name of the printer"
+msgstr "Name des Druckers"
+
+#: src/libslic3r/PrintConfig.cpp:1596
msgid "Name of the printer variant. For example, the printer variants may be differentiated by a nozzle diameter."
msgstr "Name der Druckervariante. Beispielsweise können die Druckervarianten durch einen Düsendurchmesser unterschieden werden."
-#: src/libslic3r/PrintConfig.cpp:1482
+#: src/libslic3r/PrintConfig.cpp:1590
msgid "Name of the printer vendor."
msgstr "Name des Druckerherstellers."
-#: src/libslic3r/PrintConfig.cpp:1058
+#: src/libslic3r/PrintConfig.cpp:1102
msgid "Name of the profile, from which this profile inherits."
msgstr "Name des Profils, von dem dieses Profil abgeleitet wurde."
-#: src/libslic3r/PrintConfig.cpp:1630
+#: src/libslic3r/PrintConfig.cpp:1738
msgid "Nearest"
msgstr "Nächste"
@@ -4798,16 +5649,32 @@ msgstr "Nächste"
msgid "Network lookup"
msgstr "Network Lookup"
-#: src/slic3r/GUI/Plater.cpp:2151
+#: src/slic3r/GUI/Preferences.cpp:430
+msgid "New layout, access via settings button in the top menu"
+msgstr "Neues Layout, Zugang über die Schaltfläche Einstellungen im oberen Menü"
+
+#: src/slic3r/GUI/Plater.cpp:2056
msgid "New Project"
msgstr "Neues Projekt"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:112
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:105
msgid "New project, clear plater"
msgstr "Neues Projekt, Druckplatte leeren"
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:609
+msgid "New Value"
+msgstr "Neuer Wert"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1178
+msgid "New value"
+msgstr "Neuer Wert"
+
+#: src/slic3r/GUI/NotificationManager.hpp:322
+msgid "New version is available."
+msgstr "Eine neue Version ist verfügbar."
+
#: src/slic3r/GUI/UpdateDialogs.cpp:38
-#, c-format
+#, possible-c-format
msgid "New version of %s is available"
msgstr "Eine neue Version von %s ist verfügbar"
@@ -4815,23 +5682,23 @@ msgstr "Eine neue Version von %s ist verfügbar"
msgid "New version:"
msgstr "Neue Version:"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4673
+#: src/slic3r/GUI/GLCanvas3D.cpp:5089
msgid "Next Redo action: %1%"
msgstr "Nächste Redo Aktion: %1%"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4641
+#: src/slic3r/GUI/GLCanvas3D.cpp:5051
msgid "Next Undo action: %1%"
msgstr "Nächste Undo-Aktion: %1%"
-#: src/libslic3r/PrintConfig.cpp:960
+#: src/libslic3r/PrintConfig.cpp:1004
msgid "No extrusion"
msgstr "Keine Extrusion"
-#: src/libslic3r/SLAPrintSteps.cpp:453
+#: src/libslic3r/SLAPrintSteps.cpp:451
msgid "No pad can be generated for this model with the current configuration"
msgstr "Für dieses Modell kann mit der aktuellen Konfiguration keine Grundschicht generiert werden"
-#: src/slic3r/GUI/MainFrame.cpp:784
+#: src/slic3r/GUI/MainFrame.cpp:1485
msgid "No previously sliced file."
msgstr "Keine vorher gesclicete Datei."
@@ -4839,175 +5706,215 @@ msgstr "Keine vorher gesclicete Datei."
msgid "NO RAMMING AT ALL"
msgstr "ÃœBERHAUPT KEIN RAMMEN"
-#: src/libslic3r/PrintConfig.cpp:1857
+#: src/libslic3r/PrintConfig.cpp:1999
msgid "No sparse layers (EXPERIMENTAL)"
msgstr "Keine spärlichen Schichten (EXPERIMENTELL)"
-#: src/libslic3r/PrintConfig.cpp:2774
+#: src/libslic3r/PrintConfig.cpp:2938
msgid "No support points will be placed closer than this threshold."
msgstr "Es werden keine Stützpunkte näher als dieser Schwellenwert platziert."
-#: src/slic3r/GUI/UpdateDialogs.cpp:303
+#: src/slic3r/GUI/UpdateDialogs.cpp:304
msgid "No updates available"
msgstr "Keine Updates verfügbar"
-#: src/slic3r/GUI/ConfigWizard.cpp:291 src/slic3r/GUI/ConfigWizard.cpp:574
-#: src/slic3r/GUI/Plater.cpp:499 src/slic3r/GUI/Plater.cpp:639
-#: src/libslic3r/ExtrusionEntity.cpp:309
+#: src/slic3r/GUI/ConfigWizard.cpp:309 src/slic3r/GUI/ConfigWizard.cpp:599
+#: src/slic3r/GUI/Plater.cpp:365 src/slic3r/GUI/Plater.cpp:505
+#: src/libslic3r/ExtrusionEntity.cpp:312
msgid "None"
msgstr "Kein"
-#: src/slic3r/GUI/Tab.cpp:2203
+#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2372
msgid "Normal"
msgstr "Normal"
-#: src/slic3r/GUI/Plater.cpp:1286
+#: src/slic3r/GUI/Plater.cpp:1177 src/slic3r/GUI/Plater.cpp:1224
msgid "normal mode"
msgstr "Normaler Modus"
-#: src/libslic3r/Zipper.cpp:46
+#: src/slic3r/GUI/GCodeViewer.cpp:2552
+msgid "Normal mode"
+msgstr "Normaler Modus"
+
+#: src/libslic3r/miniz_extension.cpp:105
msgid "not a ZIP archive"
msgstr "kein ZIP Archiv"
-#: src/slic3r/GUI/BedShapeDialog.cpp:223 src/slic3r/GUI/BedShapeDialog.cpp:302
+#: src/slic3r/GUI/BedShapeDialog.cpp:366 src/slic3r/GUI/BedShapeDialog.cpp:446
msgid "Not found:"
msgstr "Nicht gefunden:"
-#: src/slic3r/GUI/DoubleSlider.cpp:1019
+#: src/slic3r/GUI/DoubleSlider.cpp:1144
msgid "Note"
msgstr "Hinweis"
-#: src/slic3r/Utils/AstroBox.cpp:89
+#: src/slic3r/GUI/Tab.cpp:3408
+msgid "Note, that selected preset will be deleted from this/those printer(s) too."
+msgstr "Beachten Sie, dass die ausgewählte Voreinstellung auch von diesem/diesen Drucker(n) gelöscht wird."
+
+#: src/slic3r/GUI/Tab.cpp:3416
+msgid "Note, that this/those printer(s) will be deleted after deleting of the selected preset."
+msgstr "Beachten Sie, dass dieser/diese Drucker nach dem Löschen der ausgewählten Voreinstellung gelöscht werden."
+
+#: src/slic3r/GUI/Tab.cpp:2039
+msgid "Note: All parameters from this group are moved to the Physical Printer settings (see changelog).\n\nA new Physical Printer profile is created by clicking on the \"cog\" icon right of the Printer profiles combo box, by selecting the \"Add physical printer\" item in the Printer combo box. The Physical Printer profile editor opens also when clicking on the \"cog\" icon in the Printer settings tab. The Physical Printer profiles are being stored into PrusaSlicer/physical_printer directory."
+msgstr "Hinweis: Alle Parameter aus dieser Gruppe werden in die Einstellungen des physischen Druckers verschoben (siehe Changelog).\n\nEin neues physisches Druckerprofil wird erstellt, indem man auf das \"Zahnrad\"-Symbol rechts vom Auswahlfeld \"Druckerprofile\" klickt, indem man den Punkt \"Physischen Drucker hinzufügen\" im Auswahlfeld \"Drucker\" auswählt. Der Profil-Editor für physische Drucker wird auch durch Klicken auf das \"Zahnrad\"-Symbol in der Registerkarte \"Druckereinstellungen\" geöffnet. Die Profile des physischen Druckers werden im Verzeichnis PrusaSlicer/physical_printer gespeichert."
+
+#: src/slic3r/Utils/AstroBox.cpp:92
msgid "Note: AstroBox version at least 1.1.0 is required."
msgstr "Hinweis: Die AstroBox-Version 1.1.0 oder höher ist erforderlich."
-#: src/slic3r/Utils/FlashAir.cpp:73
+#: src/slic3r/Utils/FlashAir.cpp:76
msgid "Note: FlashAir with firmware 2.00.02 or newer and activated upload function is required."
msgstr "Hinweis: FlashAir mit Firmware 2.00.02 oder neuer und aktivierter Upload-Funktion ist erforderlich."
-#: src/slic3r/Utils/OctoPrint.cpp:89
+#: src/slic3r/Utils/OctoPrint.cpp:91
msgid "Note: OctoPrint version at least 1.1.0 is required."
msgstr "Hinweis: Es ist mindestens die OctoPrint-Version 1.1.0 erforderlich."
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1345
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1192
msgid "Note: some shortcuts work in (non)editing mode only."
msgstr "Hinweis: Einige Tastenkombinationen funktionieren nur im (Nicht-)Bearbeitungsmodus."
-#: src/slic3r/GUI/Tab.cpp:1251 src/slic3r/GUI/Tab.cpp:1252
-#: src/slic3r/GUI/Tab.cpp:1540 src/slic3r/GUI/Tab.cpp:1541
-#: src/slic3r/GUI/Tab.cpp:2012 src/slic3r/GUI/Tab.cpp:2013
-#: src/slic3r/GUI/Tab.cpp:2128 src/slic3r/GUI/Tab.cpp:2129
-#: src/slic3r/GUI/Tab.cpp:3535 src/slic3r/GUI/Tab.cpp:3536
+#: src/slic3r/GUI/SavePresetDialog.cpp:151
+msgid "Note: This preset will be replaced after saving"
+msgstr "Hinweis: Diese Voreinstellung wird nach dem Speichern ersetzt"
+
+#: src/slic3r/GUI/Tab.cpp:1581 src/slic3r/GUI/Tab.cpp:1582
+#: src/slic3r/GUI/Tab.cpp:1887 src/slic3r/GUI/Tab.cpp:1888
+#: src/slic3r/GUI/Tab.cpp:2221 src/slic3r/GUI/Tab.cpp:2222
+#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/Tab.cpp:2298
+#: src/slic3r/GUI/Tab.cpp:3951 src/slic3r/GUI/Tab.cpp:3952
msgid "Notes"
msgstr "Anmerkungen"
-#: src/slic3r/GUI/ConfigWizard.cpp:1751 src/slic3r/GUI/DoubleSlider.cpp:1905
-#: src/slic3r/GUI/DoubleSlider.cpp:1926 src/slic3r/GUI/GUI.cpp:245
+#: src/slic3r/GUI/ConfigWizard.cpp:2237 src/slic3r/GUI/DoubleSlider.cpp:2124
+#: src/slic3r/GUI/DoubleSlider.cpp:2144 src/slic3r/GUI/GUI.cpp:244
msgid "Notice"
msgstr "Hinweis"
-#: src/slic3r/GUI/ConfigWizard.cpp:218
+#: src/slic3r/GUI/ConfigWizard.cpp:236
msgid "nozzle"
msgstr "Düse"
-#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2340
-#: src/libslic3r/PrintConfig.cpp:1326
+#: src/slic3r/GUI/Tab.cpp:1790
+msgid "Nozzle"
+msgstr "Düse"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1392
+msgid "Nozzle and Bed Temperatures"
+msgstr "Düsen- und Bett-Temperaturen"
+
+#: src/slic3r/GUI/Tab.cpp:2104 src/slic3r/GUI/Tab.cpp:2509
+#: src/libslic3r/PrintConfig.cpp:1434
msgid "Nozzle diameter"
msgstr "Düsendurchmesser"
-#: src/slic3r/GUI/ConfigWizard.cpp:969
+#: src/slic3r/GUI/ConfigWizard.cpp:1335
msgid "Nozzle Diameter:"
msgstr "Düsendurchmesser:"
-#: src/libslic3r/PrintConfig.cpp:650
+#: src/libslic3r/PrintConfig.cpp:2201
+msgid "Nozzle temperature"
+msgstr "Düsentemperatur"
+
+#: src/libslic3r/PrintConfig.cpp:2198
+msgid "Nozzle temperature for layers after the first one. Set this to zero to disable temperature control commands in the output G-code."
+msgstr "Düsentemperatur für Schichten nach der ersten. Setzen Sie diesen Wert auf Null, um Temperatursteuerungsbefehle im ausgegebenen G-Code zu deaktivieren."
+
+#: src/libslic3r/PrintConfig.cpp:961
+msgid "Nozzle temperature for the first layer. If you want to control temperature manually during print, set this to zero to disable temperature control commands in the output G-code."
+msgstr "Düsentemperatur für die erste Schicht. Wenn Sie die Temperatur während des Drucks manuell steuern möchten, setzen Sie diesen Wert auf Null, um Temperatursteuerungsbefehle im ausgegebenen G-Code zu deaktivieren."
+
+#: src/libslic3r/PrintConfig.cpp:686
msgid "Number of cooling moves"
msgstr "Anzahl der Kühlbewegungen"
-#: src/slic3r/GUI/Tab.cpp:1839
+#: src/slic3r/GUI/Tab.cpp:2073
msgid "Number of extruders of the printer."
msgstr "Anzahl der Extruder des Druckers."
-#: src/libslic3r/PrintConfig.cpp:1975
+#: src/libslic3r/PrintConfig.cpp:2117
msgid "Number of interface layers to insert between the object(s) and support material."
msgstr "Anzahl der Schnittstellenschichten, die zwischen Objekt(en) und Trägermaterial eingefügt werden sollen."
-#: src/libslic3r/PrintConfig.cpp:1697
+#: src/libslic3r/PrintConfig.cpp:1812
msgid "Number of loops for the skirt. If the Minimum Extrusion Length option is set, the number of loops might be greater than the one configured here. Set this to zero to disable skirt completely."
msgstr "Anzahl der Schleifen für die Schürze. Wenn die Option Minimale Extrusionslänge gesetzt ist, kann die Anzahl der Schleifen größer sein als die hier konfigurierte. Setzen Sie diesen Wert auf null, um die Schürze komplett zu deaktivieren."
-#: src/libslic3r/PrintConfig.cpp:2365
+#: src/libslic3r/PrintConfig.cpp:2508
msgid "Number of pixels in"
msgstr "Anzahl an Pixeln in"
-#: src/libslic3r/PrintConfig.cpp:2367
+#: src/libslic3r/PrintConfig.cpp:2510
msgid "Number of pixels in X"
msgstr "Anzahl an Pixeln in X"
-#: src/libslic3r/PrintConfig.cpp:2373
+#: src/libslic3r/PrintConfig.cpp:2516
msgid "Number of pixels in Y"
msgstr "Anzahl an Pixeln in Y"
-#: src/libslic3r/PrintConfig.cpp:176
+#: src/libslic3r/PrintConfig.cpp:210
msgid "Number of solid layers to generate on bottom surfaces."
msgstr "Anzahl der zu erzeugenden massiven Schichten auf der Bodenfläche."
-#: src/libslic3r/PrintConfig.cpp:1781
+#: src/libslic3r/PrintConfig.cpp:1896
msgid "Number of solid layers to generate on top and bottom surfaces."
msgstr "Anzahl der zu erzeugenden massiven Schichten auf der Ober- und Unterseite."
-#: src/libslic3r/PrintConfig.cpp:2134
+#: src/libslic3r/PrintConfig.cpp:2277
msgid "Number of solid layers to generate on top surfaces."
msgstr "Anzahl der zu erzeugenden massiven Schichten auf der Oberseite."
-#: src/libslic3r/PrintConfig.cpp:2518
+#: src/libslic3r/PrintConfig.cpp:2661
msgid "Number of the layers needed for the exposure time fade from initial exposure time to the exposure time"
msgstr "Anzahl der für die Reduzierung der Belichtungszeit benötigten Schichten, von der anfänglichen bis zur Belichtungszeit"
-#: src/slic3r/GUI/Plater.cpp:241
+#: src/slic3r/GUI/Plater.cpp:247
msgid "Number of tool changes"
msgstr "Anzahl der Werkzeugwechsel"
-#: src/libslic3r/PrintConfig.cpp:2753
+#: src/slic3r/GUI/Tab.cpp:4127 src/libslic3r/PrintConfig.cpp:2917
msgid "Object elevation"
msgstr "Objekt-Hebung"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2466
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2858
msgid "Object manipulation"
msgstr "Objektbearbeitung"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:638
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:163 src/libslic3r/GCode.cpp:623
msgid "Object name"
msgstr "Objektname"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3417
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3880
msgid "Object or Instance"
msgstr "Objekt oder Kopie"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1106
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1230
msgid "Object reordered"
msgstr "Objekt neu angeordnet"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2479
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2871
msgid "Object Settings to modify"
msgstr "Abweichende Objekteigenschaften"
-#: src/slic3r/GUI/Plater.cpp:2529
+#: src/slic3r/GUI/Plater.cpp:2491
msgid "Object too large?"
msgstr "Objekt zu groß?"
-#: src/libslic3r/PrintConfig.cpp:2262
+#: src/libslic3r/PrintConfig.cpp:2405
msgid "Object will be used to purge the nozzle after a toolchange to save material that would otherwise end up in the wipe tower and decrease print time. Colours of the objects will be mixed as a result."
msgstr "Objekt wird zum Reinigen der Düse nach einem Materialwechsel verwendet, um Material zu sparen, das sonst im Reinigungsturm landen und die Druckzeit verkürzen würde. Die Farben der Objekte werden dabei gemischt."
-#: src/slic3r/GUI/Plater.cpp:1194
+#: src/slic3r/GUI/Plater.cpp:1103
msgid "object(s)"
msgstr "Objekt(e)"
-#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245
+#: src/slic3r/GUI/Plater.cpp:1143 src/slic3r/GUI/Plater.cpp:1160
msgid "objects"
msgstr "Objekte"
-#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:855
+#: src/libslic3r/PrintConfig.cpp:465 src/libslic3r/PrintConfig.cpp:893
msgid "Octagram Spiral"
msgstr "Achterstern-Spirale"
@@ -5015,64 +5922,113 @@ msgstr "Achterstern-Spirale"
msgid "OctoPrint version"
msgstr "OctoPrint Version"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3425
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3888
msgid "of a current Object"
msgstr "des aktuellen Objekts"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42
msgid "Offset"
msgstr "Offset"
-#: src/slic3r/GUI/Tab.cpp:1755
-#, c-format
+#: src/slic3r/GUI/Preferences.cpp:422
+msgid "Old regular layout with the tab bar"
+msgstr "Altes reguläres Layout mit der Registerleiste"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:608
+msgid "Old Value"
+msgstr "Alter Wert"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1177
+msgid "Old value"
+msgstr "Alter Wert"
+
+#: src/slic3r/GUI/Preferences.cpp:123
+msgid "On OSX there is always only one instance of app running by default. However it is allowed to run multiple instances of same app from the command line. In such case this settings will allow only one instance."
+msgstr "Unter OSX wird standardmäßig immer nur eine Instanz der Anwendung ausgeführt. Es ist jedoch erlaubt, mehrere Instanzen derselben Anwendung von der Befehlszeile aus auszuführen. In einem solchen Fall erlauben diese Einstellungen nur eine Instanz."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:359
+#, possible-c-format
msgid "On this system, %s uses HTTPS certificates from the system Certificate Store or Keychain."
msgstr "Auf diesem System verwendet %s HTTPS-Zertifikate aus dem System Zertifikatsspeicher oder Schlüsselbund."
-#: src/slic3r/GUI/DoubleSlider.cpp:950
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
+msgid "On/Off one layer mode of the vertical slider"
+msgstr "Ein/Aus Einschichtmodus des vertikalen Schiebereglers"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1064
msgid "One layer mode"
msgstr "Eine Schicht Modus"
-#: src/libslic3r/Print.cpp:1365
+#: src/libslic3r/Print.cpp:1391
msgid "One or more object were assigned an extruder that the printer does not have."
msgstr "Eines oder mehrere Objekte wurden einem Extruder zugewiesen, der auf diesem Drucker nicht vorhanden ist."
-#: src/libslic3r/PrintConfig.cpp:1903 src/libslic3r/PrintConfig.cpp:2676
+#: src/slic3r/GUI/GUI_App.cpp:1784
+msgid "Ongoing uploads"
+msgstr "Laufende Uploads"
+
+#: src/libslic3r/Print.cpp:1269
+msgid "Only a single object may be printed at a time in Spiral Vase mode. Either remove all but the last object, or enable sequential mode by \"complete_objects\"."
+msgstr "Im Modus \"Spiralvase\" darf immer nur ein einziges Objekt gedruckt werden. Entfernen Sie entweder alle bis auf das letzte Objekt, oder aktivieren Sie den sequenziellen Modus durch \"complete_objects\"."
+
+#: src/libslic3r/PrintConfig.cpp:2045 src/libslic3r/PrintConfig.cpp:2840
msgid "Only create support if it lies on a build plate. Don't create support on a print."
-msgstr "Nur dann Stützen schaffen, wenn sie auf der Druckplattform aufbauen. Erstellt keine Stützstrukturen, die auf dem Ausdruck gründen würden."
+msgstr "Nur dann Stützen schaffen, wenn sie auf der Druckplattform aufbauen. Erstellt keine Stützen, die auf dem Ausdruck gründen würden."
-#: src/libslic3r/PrintConfig.cpp:1027
+#: src/libslic3r/PrintConfig.cpp:1071
msgid "Only infill where needed"
msgstr "Infill nur wo es notwendig ist drucken"
-#: src/slic3r/GUI/Tab.cpp:2373
+#: src/slic3r/GUI/Tab.cpp:2542
msgid "Only lift Z"
msgstr "Nur Z anheben"
-#: src/libslic3r/PrintConfig.cpp:1570
+#: src/libslic3r/PrintConfig.cpp:1678
msgid "Only lift Z above"
msgstr "Z nur Anheben über"
-#: src/libslic3r/PrintConfig.cpp:1579
+#: src/libslic3r/PrintConfig.cpp:1687
msgid "Only lift Z below"
msgstr "Z anheben nur unter"
-#: src/libslic3r/PrintConfig.cpp:1348
+#: src/libslic3r/PrintConfig.cpp:1456
msgid "Only retract when crossing perimeters"
msgstr "Nur bei Umfangsüberquerungen einziehen"
-#: src/slic3r/GUI/Tab.cpp:1187
+#: src/slic3r/GUI/ConfigWizard.cpp:714
+msgid "Only the following installed printers are compatible with the selected filament:"
+msgstr "Nur die folgenden installierten Drucker sind mit dem ausgewählten Filament kompatibel:"
+
+#: src/slic3r/GUI/Tab.cpp:1517
msgid "Ooze prevention"
msgstr "Vermeidung von Nachsickern (Ooze)"
-#: src/libslic3r/Print.cpp:1266
+#: src/libslic3r/Print.cpp:1292
msgid "Ooze prevention is currently not supported with the wipe tower enabled."
msgstr "Die Sickervermeidung wird derzeit nicht unterstützt, wenn der Wischturm aktiviert ist."
-#: src/slic3r/GUI/MainFrame.cpp:408
+#: src/slic3r/GUI/MainFrame.cpp:1398
+msgid "Open &PrusaSlicer"
+msgstr "Öffne &PrusaSlicer"
+
+#: src/slic3r/GUI/MainFrame.cpp:1391
+msgid "Open a G-code file"
+msgstr "Öffne eine G-Code-Datei"
+
+#: src/slic3r/GUI/MainFrame.cpp:63 src/slic3r/GUI/MainFrame.cpp:77
+#: src/slic3r/GUI/MainFrame.cpp:1262
+msgid "Open a new PrusaSlicer instance"
+msgstr "Öffne eine neue PrusaSlicer-Instanz"
+
+#: src/slic3r/GUI/MainFrame.cpp:989
msgid "Open a project file"
msgstr "Öffne eine Projektdatei"
-#: src/slic3r/GUI/Tab.cpp:1729
+#: src/slic3r/GUI/Plater.cpp:1417
+msgid "Open as project"
+msgstr "Als Projekt öffnen"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:330
msgid "Open CA certificate file"
msgstr "Open CA Zertifikat Datei"
@@ -5085,116 +6041,150 @@ msgstr "Änderungsseite öffnen"
msgid "Open download page"
msgstr "Downloadseite öffnen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:113
+#: src/slic3r/GUI/NotificationManager.cpp:742
+msgid "Open Folder."
+msgstr "Öffne Ordner."
+
+#: src/slic3r/Utils/Process.cpp:151
+msgid "Open G-code file:"
+msgstr "Öffne G-Code-Datei:"
+
+#: src/slic3r/GUI/MainFrame.cpp:66 src/slic3r/GUI/MainFrame.cpp:1141
+msgid "Open G-code viewer"
+msgstr "G-Code-Viewer öffnen"
+
+#: src/slic3r/GUI/MainFrame.cpp:79
+msgid "Open new G-code viewer"
+msgstr "Neuen G-Code-Viewer öffnen"
+
+#: src/slic3r/GUI/MainFrame.cpp:63 src/slic3r/GUI/MainFrame.cpp:1262
+msgid "Open new instance"
+msgstr "Neue Instanz öffnen"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:106
msgid "Open project STL/OBJ/AMF/3MF with config, clear plater"
msgstr "Öffne Projekt STL/OBJ/AMF/3MF mit Konfiguration, Druckplatte leeren"
-#: src/slic3r/GUI/MainFrame.cpp:693
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:77 src/slic3r/GUI/MainFrame.cpp:1398
+msgid "Open PrusaSlicer"
+msgstr "PrusaSlicer öffnen"
+
+#: src/slic3r/GUI/MainFrame.cpp:918 src/slic3r/GUI/MainFrame.cpp:1317
+#, possible-c-format
msgid "Open the %s website in your browser"
msgstr "%s-Website in Ihrem Browser öffnen"
-#: src/slic3r/GUI/MainFrame.cpp:684
+#: src/slic3r/GUI/MainFrame.cpp:909 src/slic3r/GUI/MainFrame.cpp:1308
msgid "Open the Prusa3D drivers download page in your browser"
msgstr "Download-Seite für die Prusa3D-Treiber in Ihrem Browser öffnen"
-#: src/slic3r/GUI/MainFrame.cpp:686
+#: src/slic3r/GUI/MainFrame.cpp:911 src/slic3r/GUI/MainFrame.cpp:1310
msgid "Open the software releases page in your browser"
msgstr "Seite mit Programmversionen in Ihrem Browser öffnen"
-#: src/slic3r/GUI/Plater.cpp:4040
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:220 src/slic3r/GUI/Plater.cpp:3961
msgid "Optimize orientation"
msgstr "Optimiere Ausrichtung"
-#: src/slic3r/GUI/Plater.cpp:2767
+#: src/slic3r/GUI/Plater.cpp:1555
msgid "Optimize Rotation"
msgstr "Rotation optimieren"
-#: src/slic3r/GUI/Plater.cpp:4040
+#: src/slic3r/GUI/Plater.cpp:3962
msgid "Optimize the rotation of the object for better print results."
msgstr "Optimiere die Rotation des Objekts für ein besseres Druckergebnis."
-#: src/libslic3r/PrintConfig.cpp:137
+#: src/libslic3r/PrintConfig.cpp:170
msgid "Optimize travel moves in order to minimize the crossing of perimeters. This is mostly useful with Bowden extruders which suffer from oozing. This feature slows down both the print and the G-code generation."
msgstr "Optimieren Sie die Verfahrbewegungen, um das Überschreiten von Konturen zu minimieren. Dies ist vor allem bei Bowdenextrudern nützlich, die unter sickerndem Material leiden. Diese Funktion verlangsamt sowohl den Druck als auch die Generierung des G-Codes."
-#: src/slic3r/GUI/Tab.cpp:1131
+#: src/slic3r/GUI/GCodeViewer.cpp:2525 src/slic3r/GUI/GUI_Preview.cpp:320
+#: src/slic3r/GUI/GUI_Preview.cpp:333
+msgid "Options"
+msgstr "Optionen"
+
+#: src/slic3r/GUI/Tab.cpp:1460
msgid "Options for support material and raft"
-msgstr "Optionen für Stützstrukturen und Raft"
+msgstr "Optionen für Stützmaterial und Raft"
+
+#: src/slic3r/GUI/Mouse3DController.cpp:315
+msgid "Options:"
+msgstr "Optionen:"
-#: src/slic3r/GUI/DoubleSlider.cpp:989
+#: src/slic3r/GUI/DoubleSlider.cpp:1112
msgid "or press \"+\" key"
msgstr "oder drücken Sie die Taste \"+\""
-#: src/slic3r/GUI/Plater.cpp:2892
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:74
msgid "Orientation found."
msgstr "Ausrichtung gefunden."
-#: src/slic3r/GUI/Plater.cpp:2891
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:73
msgid "Orientation search canceled."
msgstr "Ausrichtungssuche abgebrochen."
-#: src/slic3r/GUI/BedShapeDialog.cpp:84
+#: src/slic3r/GUI/BedShapeDialog.cpp:94
msgid "Origin"
msgstr "Nullpunkt"
-#: src/slic3r/GUI/Tab.cpp:1227
+#: src/slic3r/GUI/Tab.cpp:1557
msgid "Other"
msgstr "Sonstige"
-#: src/libslic3r/PrintConfig.cpp:144 src/libslic3r/PrintConfig.cpp:2064
+#: src/libslic3r/PrintConfig.cpp:177 src/libslic3r/PrintConfig.cpp:2206
msgid "Other layers"
msgstr "Andere Schichten"
-#: src/slic3r/GUI/ConfigWizard.cpp:856
+#: src/slic3r/GUI/ConfigWizard.cpp:1222
msgid "Other Vendors"
msgstr "Andere Hersteller"
-#: src/slic3r/GUI/Tab.cpp:1238 src/slic3r/GUI/Tab.cpp:3666
+#: src/slic3r/GUI/Tab.cpp:1568 src/slic3r/GUI/Tab.cpp:4085
msgid "Output file"
msgstr "Ausgabedatei"
-#: src/libslic3r/PrintConfig.cpp:3493
+#: src/libslic3r/PrintConfig.cpp:3692
msgid "Output File"
msgstr "Ausgabedatei"
-#: src/libslic3r/PrintConfig.cpp:1363
+#: src/libslic3r/PrintConfig.cpp:1471
msgid "Output filename format"
msgstr "Ausgabe Dateinamen Format"
-#: src/libslic3r/PrintConfig.cpp:3381
+#: src/libslic3r/PrintConfig.cpp:3580
msgid "Output Model Info"
msgstr "Ausgabe Modellinformationen"
-#: src/slic3r/GUI/Tab.cpp:1230 src/slic3r/GUI/Tab.cpp:3665
+#: src/slic3r/GUI/Tab.cpp:1560 src/slic3r/GUI/Tab.cpp:4084
msgid "Output options"
msgstr "Ausgabeoptionen"
-#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:312
+#: src/slic3r/GUI/GUI_Preview.cpp:303 src/libslic3r/ExtrusionEntity.cpp:316
+#: src/libslic3r/ExtrusionEntity.cpp:340
msgid "Overhang perimeter"
msgstr "Überhängende Außenkontur"
-#: src/libslic3r/PrintConfig.cpp:2042
+#: src/libslic3r/PrintConfig.cpp:2184
msgid "Overhang threshold"
msgstr "Ãœberhangsschwellwert"
-#: src/slic3r/GUI/Tab.cpp:1215
+#: src/slic3r/GUI/Tab.cpp:1545
msgid "Overlap"
msgstr "Ãœberlappung"
-#: src/slic3r/GUI/MainFrame.cpp:614
+#: src/slic3r/GUI/MainFrame.cpp:1221
msgid "P&rint Settings Tab"
msgstr "D&ruckeinstellungen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:107 src/slic3r/GUI/GUI_ObjectList.cpp:625
-#: src/slic3r/GUI/Plater.cpp:635 src/slic3r/GUI/Tab.cpp:3636
-#: src/slic3r/GUI/Tab.cpp:3637 src/libslic3r/PrintConfig.cpp:2781
-#: src/libslic3r/PrintConfig.cpp:2788 src/libslic3r/PrintConfig.cpp:2802
-#: src/libslic3r/PrintConfig.cpp:2813 src/libslic3r/PrintConfig.cpp:2823
-#: src/libslic3r/PrintConfig.cpp:2845 src/libslic3r/PrintConfig.cpp:2856
-#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:2870
-#: src/libslic3r/PrintConfig.cpp:2881 src/libslic3r/PrintConfig.cpp:2890
-#: src/libslic3r/PrintConfig.cpp:2899
+#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:664
+#: src/slic3r/GUI/Plater.cpp:501 src/slic3r/GUI/Tab.cpp:4055
+#: src/slic3r/GUI/Tab.cpp:4056 src/slic3r/GUI/Tab.cpp:4127
+#: src/libslic3r/PrintConfig.cpp:2945 src/libslic3r/PrintConfig.cpp:2952
+#: src/libslic3r/PrintConfig.cpp:2966 src/libslic3r/PrintConfig.cpp:2977
+#: src/libslic3r/PrintConfig.cpp:2987 src/libslic3r/PrintConfig.cpp:3009
+#: src/libslic3r/PrintConfig.cpp:3020 src/libslic3r/PrintConfig.cpp:3027
+#: src/libslic3r/PrintConfig.cpp:3034 src/libslic3r/PrintConfig.cpp:3045
+#: src/libslic3r/PrintConfig.cpp:3054 src/libslic3r/PrintConfig.cpp:3063
msgid "Pad"
msgstr "Grundschicht (Pad)"
@@ -5202,443 +6192,517 @@ msgstr "Grundschicht (Pad)"
msgid "Pad and Support"
msgstr "Grundschicht und Stützen"
-#: src/libslic3r/PrintConfig.cpp:2855
+#: src/slic3r/GUI/Tab.cpp:4127 src/libslic3r/PrintConfig.cpp:3019
msgid "Pad around object"
msgstr "Grundschicht um Objekt"
-#: src/libslic3r/PrintConfig.cpp:2862
+#: src/libslic3r/PrintConfig.cpp:3026
msgid "Pad around object everywhere"
msgstr "Grundschicht überall um Objekt"
-#: src/libslic3r/PrintConfig.cpp:2811
+#: src/libslic3r/PrintConfig.cpp:2975
msgid "Pad brim size"
msgstr "Grundschicht Randgröße"
-#: src/libslic3r/SLA/Pad.cpp:691
+#: src/libslic3r/SLA/Pad.cpp:532
msgid "Pad brim size is too small for the current configuration."
msgstr "Die Randgröße der Grundschicht ist für die aktuelle Konfiguration zu klein."
-#: src/libslic3r/PrintConfig.cpp:2898
+#: src/libslic3r/PrintConfig.cpp:3062
msgid "Pad object connector penetration"
msgstr "Objektgrundschicht Verbindungseindringtiefe"
-#: src/libslic3r/PrintConfig.cpp:2880
+#: src/libslic3r/PrintConfig.cpp:3044
msgid "Pad object connector stride"
msgstr "Objektgrundschicht Verbindungsschritte"
-#: src/libslic3r/PrintConfig.cpp:2889
+#: src/libslic3r/PrintConfig.cpp:3053
msgid "Pad object connector width"
msgstr "Objektgrundschicht Verbinderbreite"
-#: src/libslic3r/PrintConfig.cpp:2869
+#: src/libslic3r/PrintConfig.cpp:3033
msgid "Pad object gap"
msgstr "Grundschicht Objekt Abstand"
-#: src/libslic3r/PrintConfig.cpp:2797
+#: src/libslic3r/PrintConfig.cpp:2961
msgid "Pad wall height"
msgstr "Grundschicht Wandhöhe"
-#: src/libslic3r/PrintConfig.cpp:2844
+#: src/libslic3r/PrintConfig.cpp:3008
msgid "Pad wall slope"
msgstr "Grundschicht Wandneigung"
-#: src/libslic3r/PrintConfig.cpp:2787
+#: src/libslic3r/PrintConfig.cpp:2951
msgid "Pad wall thickness"
msgstr "Grundschicht Wandstärke"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
msgid "Page Down"
msgstr "Page Down"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
msgid "Page Up"
msgstr "Page Up"
-#: src/slic3r/GUI/Field.cpp:139
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33
+msgid "Paint-on supports"
+msgstr "Aufmal-Stützen"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:178
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:159
+msgid "Paints all facets inside, regardless of their orientation."
+msgstr "Bemalt alle umfassten Flächen, unabhängig von ihrer Ausrichtung."
+
+#: src/slic3r/GUI/Field.cpp:187
msgid "parameter name"
msgstr "Parametername"
-#: src/slic3r/GUI/Field.cpp:243
+#: src/slic3r/GUI/Field.cpp:291
msgid "Parameter validation"
msgstr "Parameterüberprüfung"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3418
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3881
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
msgid "Part"
msgstr "Teil"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2494
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2886
msgid "Part manipulation"
msgstr "Teilbearbeitung"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2483
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2875
msgid "Part Settings to modify"
msgstr "Abweichende Teileigenschaften"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4514
+#: src/libslic3r/PrintConfig.cpp:138
+msgid "Password"
+msgstr "Kennwort"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4880
msgid "Paste"
msgstr "Einfügen"
-#: src/slic3r/GUI/MainFrame.cpp:592
+#: src/slic3r/GUI/MainFrame.cpp:1198
msgid "Paste clipboard"
msgstr "Aus Zwischenablage einfügen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:133
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:128
msgid "Paste from clipboard"
msgstr "Aus Zwischenablage einfügen"
-#: src/slic3r/GUI/Plater.cpp:5606
+#: src/slic3r/GUI/Plater.cpp:5803
msgid "Paste From Clipboard"
msgstr "Aus Zwischenablage einfügen"
-#: src/libslic3r/PrintConfig.cpp:2002
+#: src/libslic3r/PrintConfig.cpp:2144
msgid "Pattern"
msgstr "Muster"
-#: src/libslic3r/PrintConfig.cpp:1891
+#: src/libslic3r/PrintConfig.cpp:2033
msgid "Pattern angle"
msgstr "Muster Winkel"
-#: src/libslic3r/PrintConfig.cpp:2016
+#: src/libslic3r/PrintConfig.cpp:2158
msgid "Pattern spacing"
msgstr "Muster Abstand"
-#: src/libslic3r/PrintConfig.cpp:2004
+#: src/libslic3r/PrintConfig.cpp:2146
msgid "Pattern used to generate support material."
msgstr "Unterstützungsmaterialmuster."
-#: src/slic3r/GUI/Plater.cpp:1261
+#: src/slic3r/GUI/GCodeViewer.cpp:2437 src/slic3r/GUI/GCodeViewer.cpp:2460
+#: src/slic3r/GUI/Plater.cpp:1199
msgid "Pause"
msgstr "Pause"
-#: src/slic3r/GUI/DoubleSlider.cpp:1009
+#: src/slic3r/GUI/DoubleSlider.cpp:1133
msgid "Pause print (\"%1%\")"
msgstr "Druck pausieren (\"%1%\")"
-#: src/slic3r/GUI/GLCanvas3D.cpp:934 src/slic3r/GUI/GLCanvas3D.cpp:943
-#: src/slic3r/GUI/GLCanvas3D.cpp:982
-msgid "Pause print or custom G-code"
-msgstr "Druckpausen oder benutzerdefinierter G-Code"
+#: src/slic3r/GUI/Tab.cpp:2209 src/libslic3r/PrintConfig.cpp:1969
+msgid "Pause Print G-code"
+msgstr "Druckpausen G-Code"
+
+#: src/libslic3r/PrintConfig.cpp:1147
+msgid "Percent of a flow rate relative to object's normal layer height."
+msgstr "Prozent einer Flussrate relativ zur normalen Schichthöhe des Objekts."
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:175
+#: src/slic3r/GUI/GCodeViewer.cpp:2233
+msgid "Percentage"
+msgstr "Prozent"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:177
msgid "Perform cut"
msgstr "Schnitt ausführen"
-#: src/libslic3r/PrintConfig.cpp:2927
+#: src/libslic3r/PrintConfig.cpp:3091
msgid "Performance vs accuracy of calculation. Lower values may produce unwanted artifacts."
msgstr "Leistung vs. Genauigkeit der Berechnung. Niedrigere Werte können zu unerwünschten Artefakten führen."
-#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:310
+#: src/slic3r/GUI/GUI_Preview.cpp:301 src/libslic3r/ExtrusionEntity.cpp:314
+#: src/libslic3r/ExtrusionEntity.cpp:336
msgid "Perimeter"
msgstr "Außenkontur"
-#: src/libslic3r/PrintConfig.cpp:1408
+#: src/libslic3r/PrintConfig.cpp:1516
msgid "Perimeter extruder"
msgstr "Umfang Extruder"
-#: src/slic3r/GUI/PresetHints.cpp:165
+#: src/slic3r/GUI/PresetHints.cpp:164
msgid "perimeters"
msgstr "Außenkonturen"
-#: src/libslic3r/PrintConfig.cpp:1399 src/libslic3r/PrintConfig.cpp:1417
-#: src/libslic3r/PrintConfig.cpp:1430 src/libslic3r/PrintConfig.cpp:1440
+#: src/libslic3r/PrintConfig.cpp:1507 src/libslic3r/PrintConfig.cpp:1525
+#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1548
msgid "Perimeters"
msgstr "Konturen"
-#: src/slic3r/GUI/ConfigWizard.cpp:860
-#, c-format
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:159
+msgid "Physical Printer"
+msgstr "Physischer Drucker"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:789
+#: src/slic3r/GUI/PresetComboBoxes.cpp:948
+msgid "Physical printers"
+msgstr "Physische Drucker"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1226
+#, possible-c-format
msgid "Pick another vendor supported by %s"
msgstr "Wählen Sie einen anderen Hersteller, der von %s unterstützt wird"
-#: src/libslic3r/PrintConfig.cpp:66
-msgid "Picture sizes to be stored into a .gcode and .sl1 files"
-msgstr "Bildgrößen, die in einer.gcode und .sl1 Datei gespeichert werden sollen"
+#: src/libslic3r/PrintConfig.cpp:67
+msgid "Picture sizes to be stored into a .gcode and .sl1 files, in the following format: \"XxY, XxY, ...\""
+msgstr "Bildgrößen, die in einer .gcode- und .sl1-Datei gespeichert werden sollen, im folgenden Format: \"XxY, XxY, ...\""
-#: src/libslic3r/PrintConfig.cpp:2681
+#: src/libslic3r/PrintConfig.cpp:2822
+msgid "Pillar connection mode"
+msgstr "Pfeiler-Verbindungsmodus"
+
+#: src/libslic3r/PrintConfig.cpp:2791
+msgid "Pillar diameter"
+msgstr "Pfeiler-Durchmesser"
+
+#: src/libslic3r/PrintConfig.cpp:2845
msgid "Pillar widening factor"
msgstr "Pfeilerverbreiterungsfaktor"
-#: src/slic3r/GUI/ConfigManipulation.cpp:330
+#: src/slic3r/GUI/ConfigManipulation.cpp:335
msgid "Pinhead diameter should be smaller than the pillar diameter."
msgstr "Der Nadelkopfdurchmesser sollte kleiner sein als der Säulendurchmesser."
-#: src/slic3r/GUI/DoubleSlider.cpp:79
+#: src/libslic3r/PrintConfig.cpp:2763
+msgid "Pinhead front diameter"
+msgstr "Nadelkopf vorderer Durchmesser"
+
+#: src/libslic3r/PrintConfig.cpp:2781
+msgid "Pinhead width"
+msgstr "Nadelkopf Breite"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:110
msgid "Place bearings in slots and resume printing"
msgstr "Lager in Nuten einsetzen und Druck wieder aufnehmen"
-#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:45
+#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:41
msgid "Place on face"
msgstr "Auf Fläche legen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 src/slic3r/GUI/MainFrame.cpp:204
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 src/slic3r/GUI/MainFrame.cpp:340
+#: src/slic3r/GUI/MainFrame.cpp:352
msgid "Plater"
msgstr "Druckplatte"
-#: src/slic3r/GUI/GUI_App.cpp:1085
+#: src/slic3r/GUI/GUI_App.cpp:1877
msgid "Please check and fix your object list."
msgstr "Bitte überprüfen und korrigieren Sie Ihre Objektliste."
-#: src/slic3r/GUI/Plater.cpp:2312 src/slic3r/GUI/Tab.cpp:2959
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:209 src/slic3r/GUI/Plater.cpp:2255
+#: src/slic3r/GUI/Tab.cpp:3188
msgid "Please check your object list before preset changing."
msgstr "Bitte überprüfen Sie Ihre Objektliste, bevor Sie die Voreinstellungen ändern."
-#: src/slic3r/GUI/Plater.cpp:3286
+#: src/slic3r/GUI/Plater.cpp:3089
msgid "Please select the file to reload"
msgstr "Bitte wählen Sie die neu zu ladende Datei aus"
-#: src/slic3r/GUI/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:291
+#: src/slic3r/GUI/AboutDialog.cpp:43 src/slic3r/GUI/AboutDialog.cpp:48
+#: src/slic3r/GUI/AboutDialog.cpp:317
msgid "Portions copyright"
msgstr "Teile des Urheberrechts"
-#: src/libslic3r/PrintConfig.cpp:2400
+#: src/libslic3r/PrintConfig.cpp:2543
msgid "Portrait"
msgstr "Hochformat"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:215
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:457
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:223
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:505
msgid "Position"
msgstr "Position"
-#: src/slic3r/GUI/Tab.cpp:2367
+#: src/slic3r/GUI/Tab.cpp:2536
msgid "Position (for multi-extruder printers)"
msgstr "Position (für Multi-Extruder-Drucker)"
-#: src/libslic3r/PrintConfig.cpp:1623
+#: src/libslic3r/PrintConfig.cpp:1731
msgid "Position of perimeters starting points."
msgstr "Position des Startpunktes des Umfangs."
-#: src/libslic3r/PrintConfig.cpp:2224
+#: src/libslic3r/PrintConfig.cpp:2367
msgid "Position X"
msgstr "X-Position"
-#: src/libslic3r/PrintConfig.cpp:2231
+#: src/libslic3r/PrintConfig.cpp:2374
msgid "Position Y"
msgstr "Y-Position"
-#: src/slic3r/GUI/Tab.cpp:1245 src/libslic3r/PrintConfig.cpp:1453
+#: src/slic3r/GUI/Tab.cpp:1575 src/libslic3r/PrintConfig.cpp:1561
msgid "Post-processing scripts"
msgstr "Nachbearbeitungs Script"
-#: src/slic3r/GUI/MainFrame.cpp:629
+#: src/slic3r/GUI/MainFrame.cpp:1237
msgid "Pre&view"
msgstr "&Vorschau"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 src/slic3r/GUI/Preferences.cpp:10
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 src/slic3r/GUI/Preferences.cpp:12
msgid "Preferences"
msgstr "Einstellungen"
-#: src/libslic3r/PrintConfig.cpp:1641
+#: src/libslic3r/PrintConfig.cpp:1749
msgid "Preferred direction of the seam"
msgstr "Bevorzugte Richtung für die Naht"
-#: src/libslic3r/PrintConfig.cpp:1652
+#: src/libslic3r/PrintConfig.cpp:1760
msgid "Preferred direction of the seam - jitter"
msgstr "Bevorzugte Zitterrichtung für die Naht"
-#: src/libslic3r/PrintObject.cpp:255
+#: src/libslic3r/PrintObject.cpp:261
msgid "Preparing infill"
msgstr "Infill wird vorbereitet"
-#: src/slic3r/GUI/Tab.cpp:2920
-#, c-format
-msgid "Preset (%s)"
-msgstr "Voreinstellung (%s)"
+#: src/slic3r/GUI/GUI_App.cpp:855
+msgid "Preparing settings tabs"
+msgstr "Vorbereiten der Einstellungs-Registerkarten"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1009
+msgid "Preset \"%1%\" has the following unsaved changes:"
+msgstr "Die \"%1%\" Voreinstellung hat die folgenden ungespeicherten Änderungen:"
-#: src/slic3r/GUI/Tab.cpp:3082
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1014
+msgid "Preset \"%1%\" is not compatible with the new print profile and it has the following unsaved changes:"
+msgstr "Die \"%1%\" Voreinstellung ist mit dem neuen Druckprofil nicht kompatibel und weist die folgenden ungespeicherten Änderungen auf:"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1013
+msgid "Preset \"%1%\" is not compatible with the new printer profile and it has the following unsaved changes:"
+msgstr "Die \"%1%\" Voreinstellung ist mit dem neuen Druckerprofil nicht kompatibel und weist die folgenden ungespeicherten Änderungen auf:"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:136
+msgid "Preset with name \"%1%\" already exists and is incompatible with selected printer."
+msgstr "Die Voreinstellung mit dem Namen \"%1%\" existiert bereits und ist mit dem ausgewählten Drucker nicht kompatibel."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:148
msgid "Preset with name \"%1%\" already exists."
msgstr "Eine Voreinstellung mit dem Namen \"%1%\" existiert bereits."
-#: src/slic3r/GUI/Tab.cpp:3029
+#: src/slic3r/GUI/SavePresetDialog.cpp:219
msgctxt "PresetName"
msgid "Copy"
msgstr "Kopieren"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
+#: src/slic3r/GUI/GLCanvas3D.cpp:3990
+msgid "Press %1%left mouse button to enter the exact value"
+msgstr "%1%linke Maustaste drücken, um den genauen Wert einzugeben"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:157
msgid "Press to activate deselection rectangle"
msgstr "Drücken um das Abwahlrechteck zu aktivieren"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:197
-msgid "Press to activate one direction scaling in Gizmo scale"
-msgstr "Drücken um Eine-Richtungs-Skalierung im Skalierungsgizmo zu aktivieren"
-
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:162
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:156
msgid "Press to activate selection rectangle"
msgstr "Drücken um das Auswahlrechteck zu aktivieren"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:198
-msgid ""
-"Press to scale (in Gizmo scale) or rotate (in Gizmo rotate)\n"
-"selected objects around their own center"
-msgstr ""
-"Zum Skalieren drücken (in Gizmo-Skalierung) oder drehen (in Gizmo-Rotation)\n"
-"ausgewählter Objekte um ihr eigenes Zentrum herum"
-
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:161
-msgid ""
-"Press to select multiple objects\n"
-"or move multiple objects with mouse"
-msgstr ""
-"Drücken zum Auswählen des mehrteiligen Objekts \n"
-"oder Bewegen des mehrteiligen Objekts mit der Maus"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:155
+msgid "Press to select multiple objects\nor move multiple objects with mouse"
+msgstr "Drücken zum Auswählen des mehrteiligen Objekts \noder Bewegen des mehrteiligen Objekts mit der Maus"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:195
-#, no-c-format
-msgid ""
-"Press to snap by 5% in Gizmo scale\n"
-"or to snap by 1mm in Gizmo move"
-msgstr ""
-"Drücken um mit 5% bei der Gizmo Skalierung zu rasten\n"
-"oder mit 1 mm bei der Gizmo Bewegung"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:221
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:231
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:232
+msgid "Press to speed up 5 times while moving thumb\nwith arrow keys or mouse wheel"
+msgstr "Drücken, um 5 Mal schneller zu werden, während der Regler mit Pfeiltasten oder Mausrad bewegt wird"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/Plater.cpp:4105
-#: src/slic3r/GUI/Tab.cpp:2390
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:212 src/slic3r/GUI/Plater.cpp:4052
+#: src/slic3r/GUI/Tab.cpp:2559
msgid "Preview"
msgstr "Vorschau"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41
msgid "Preview hollowed and drilled model"
msgstr "Vorschau des ausgehöhlten und aufgebohrten Modells"
-#: src/slic3r/GUI/MainFrame.cpp:790
+#: src/slic3r/GUI/MainFrame.cpp:1491
msgid "Previously sliced file ("
msgstr "Vorher geslicete Datei ("
-#: src/libslic3r/PrintConfig.cpp:1851
+#: src/libslic3r/PrintConfig.cpp:1993
msgid "Prime all printing extruders"
msgstr "Alle Druckextruder vorfüllen"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1521
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/libslic3r/Preset.cpp:1300
msgid "print"
msgstr "Druck"
-#: src/slic3r/GUI/MainFrame.cpp:648
+#: src/slic3r/GUI/GCodeViewer.cpp:2436 src/slic3r/GUI/GCodeViewer.cpp:2451
+msgid "Print"
+msgstr "Druck"
+
+#: src/slic3r/GUI/MainFrame.cpp:1258
msgid "Print &Host Upload Queue"
msgstr "Druck&host Warteschlange"
-#: src/libslic3r/PrintConfig.cpp:471
+#: src/libslic3r/PrintConfig.cpp:507
msgid "Print contour perimeters from the outermost one to the innermost one instead of the default inverse order."
msgstr "Drucken Sie Konturumfänge von der äußersten zur innersten Kontur anstatt der standardmäßigen umgekehrten Reihenfolge."
-#: src/slic3r/GUI/ConfigWizard.cpp:952
+#: src/slic3r/GUI/ConfigWizard.cpp:1318
msgid "Print Diameters"
msgstr "Druckdurchmesser"
-#: src/slic3r/GUI/Tab.cpp:1944 src/slic3r/GUI/Tab.cpp:2123
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:209 src/slic3r/GUI/Tab.cpp:2024
msgid "Print Host upload"
msgstr "Hochladen zum Druckhost"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:142
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:138
#: src/slic3r/GUI/PrintHostDialogs.cpp:136
msgid "Print host upload queue"
msgstr "Druckhost Warteschlange"
-#: src/slic3r/GUI/DoubleSlider.cpp:970
+#: src/slic3r/GUI/DoubleSlider.cpp:1093
msgid "Print mode"
msgstr "Druckmodus"
-#: src/slic3r/GUI/Tab.hpp:328 src/slic3r/GUI/Tab.hpp:431
+#: src/slic3r/GUI/GCodeViewer.cpp:2579 src/slic3r/GUI/GUI_Preview.cpp:1476
+msgid "Print pauses"
+msgstr "Druckpausen"
+
+#: src/slic3r/GUI/Tab.hpp:378 src/slic3r/GUI/Tab.hpp:502
msgid "Print Settings"
msgstr "Druckeinstellungen"
-#: src/slic3r/GUI/Plater.cpp:815
+#: src/slic3r/GUI/Plater.cpp:690
msgid "Print settings"
msgstr "Druckeinstellungen"
-#: src/slic3r/GUI/Tab.cpp:1478
+#: src/slic3r/GUI/GLCanvas3D.cpp:4303 src/slic3r/GUI/GLCanvas3D.cpp:4939
+msgid "Print Settings Tab"
+msgstr "Druckeinstellungsreiter"
+
+#: src/slic3r/GUI/Tab.cpp:1824
msgid "Print speed override"
msgstr "Korrektur der Druckgeschwindigkeit"
-#: src/libslic3r/GCode.cpp:638
+#: src/libslic3r/GCode.cpp:623
msgid "Print z"
msgstr "Druck z"
-#: src/slic3r/GUI/MainFrame.cpp:621
+#: src/slic3r/GUI/MainFrame.cpp:1228
msgid "Print&er Settings Tab"
msgstr "Druck&ereinstellungen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1621
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1750
msgid "Printable"
msgstr "Druckbar"
-#: src/slic3r/GUI/Plater.cpp:819
+#: src/slic3r/GUI/Plater.cpp:694
msgid "Printer"
msgstr "Drucker"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1525
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/libslic3r/Preset.cpp:1304
msgid "printer"
msgstr "Drucker"
-#: src/libslic3r/PrintConfig.cpp:2439 src/libslic3r/PrintConfig.cpp:2440
+#: src/libslic3r/PrintConfig.cpp:2582 src/libslic3r/PrintConfig.cpp:2583
msgid "Printer absolute correction"
msgstr "Drucker absolute Korrektur"
-#: src/libslic3r/PrintConfig.cpp:2456 src/libslic3r/PrintConfig.cpp:2457
+#: src/libslic3r/PrintConfig.cpp:2599 src/libslic3r/PrintConfig.cpp:2600
msgid "Printer gamma correction"
msgstr "Drucker Gammakorrektur"
-#: src/slic3r/GUI/Tab.cpp:976
+#: src/slic3r/GUI/Tab.cpp:1294
msgid "printer model"
msgstr "Druckermodell"
-#: src/libslic3r/PrintConfig.cpp:1472
+#: src/libslic3r/PrintConfig.cpp:1580
msgid "Printer notes"
msgstr "Drucker Anmerkungen"
-#: src/libslic3r/PrintConfig.cpp:2431 src/libslic3r/PrintConfig.cpp:2432
-#: src/libslic3r/PrintConfig.cpp:2433
+#: src/libslic3r/PrintConfig.cpp:144
+msgid "Printer preset name"
+msgstr "Name der Druckervoreinstellung"
+
+#: src/libslic3r/PrintConfig.cpp:2574 src/libslic3r/PrintConfig.cpp:2575
+#: src/libslic3r/PrintConfig.cpp:2576
msgid "Printer scaling correction"
msgstr "Drucker skalierte Korrektur"
-#: src/slic3r/GUI/Tab.hpp:391
+#: src/slic3r/GUI/Tab.hpp:453
msgid "Printer Settings"
msgstr "Druckereinstellungen"
+#: src/slic3r/GUI/GLCanvas3D.cpp:4305 src/slic3r/GUI/GLCanvas3D.cpp:4941
+msgid "Printer Settings Tab"
+msgstr "Druckereinstellungsreiter"
+
#: src/libslic3r/PrintConfig.cpp:43 src/libslic3r/PrintConfig.cpp:44
msgid "Printer technology"
msgstr "Druckertechnologie"
-#: src/libslic3r/PrintConfig.cpp:1466
+#: src/libslic3r/PrintConfig.cpp:1574
msgid "Printer type"
msgstr "Druckertyp"
-#: src/libslic3r/PrintConfig.cpp:1487
+#: src/libslic3r/PrintConfig.cpp:1595
msgid "Printer variant"
msgstr "Druckervariante"
-#: src/libslic3r/PrintConfig.cpp:1481
+#: src/libslic3r/PrintConfig.cpp:1589
msgid "Printer vendor"
msgstr "Druckerhersteller"
-#: src/libslic3r/Print.cpp:1388
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:476
+msgid "Printer with name \"%1%\" already exists."
+msgstr "Drucker mit dem Namen \"%1%\" existiert bereits."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:587
+msgid "Printer:"
+msgstr "Drucker:"
+
+#: src/libslic3r/Print.cpp:1414
msgid "Printing with multiple extruders of differing nozzle diameters. If support is to be printed with the current extruder (support_material_extruder == 0 or support_material_interface_extruder == 0), all nozzles have to be of the same diameter."
msgstr "Der Druck erfolgt mit mehreren Extrudern mit unterschiedlichen Düsendurchmessern. Falls Stützen mit dem aktuellen Extruder gedruckt werden sollen (support_material_extruder == 0 oder support_material_interface_extruder == 0), müssen alle Druckdüsen den gleichen Durchmesser aufweisen."
#. TRN "Processing input_file_basename"
-#: src/slic3r/GUI/MainFrame.cpp:849
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:1550
+#, possible-c-format
msgid "Processing %s"
msgstr "Berechne %s"
-#: src/slic3r/GUI/Plater.cpp:2283
-#, c-format
-msgid "Processing input file %s"
-msgstr "Eingabe Datei %s wird verarbeitet"
-
-#: src/libslic3r/PrintObject.cpp:108
+#: src/libslic3r/PrintObject.cpp:114
msgid "Processing triangulated mesh"
msgstr "Verarbeitung der dreieckigen Netze"
-#: src/slic3r/GUI/Tab.cpp:1259 src/slic3r/GUI/Tab.cpp:1549
-#: src/slic3r/GUI/Tab.cpp:2020 src/slic3r/GUI/Tab.cpp:2136
-#: src/slic3r/GUI/Tab.cpp:3544 src/slic3r/GUI/Tab.cpp:3672
+#: src/slic3r/GUI/Tab.cpp:1589 src/slic3r/GUI/Tab.cpp:1896
+#: src/slic3r/GUI/Tab.cpp:2229 src/slic3r/GUI/Tab.cpp:2305
+#: src/slic3r/GUI/Tab.cpp:3960 src/slic3r/GUI/Tab.cpp:4091
msgid "Profile dependencies"
msgstr "Profil Abhängigkeiten"
-#: src/slic3r/GUI/ConfigWizard.cpp:566
+#: src/slic3r/GUI/ConfigWizard.cpp:590
msgid "Profile:"
msgstr "Profil:"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:150
+#: src/slic3r/GUI/PrintHostDialogs.cpp:148
msgid "Progress"
msgstr "Fortschritt"
@@ -5646,101 +6710,129 @@ msgstr "Fortschritt"
msgid "Progress:"
msgstr "Fortschritt:"
-#: src/slic3r/GUI/MainFrame.cpp:684
+#: src/slic3r/GUI/MainFrame.cpp:909 src/slic3r/GUI/MainFrame.cpp:1308
msgid "Prusa 3D &Drivers"
msgstr "Prusa 3&D Treiber"
-#: src/slic3r/GUI/ConfigWizard.cpp:1995
+#: src/slic3r/GUI/ConfigWizard.cpp:2506
msgid "Prusa FFF Technology Printers"
msgstr "Prusa FFF Technologie Drucker"
-#: src/slic3r/GUI/ConfigWizard.cpp:1998
+#: src/slic3r/GUI/ConfigWizard.cpp:2509
msgid "Prusa MSLA Technology Printers"
msgstr "Prusa MSLA Technologie Drucker"
-#: src/slic3r/GUI/AboutDialog.cpp:260
+#: src/slic3r/Utils/Http.cpp:78
+msgid "PrusaSlicer detected system SSL certificate store in: %1%"
+msgstr "PrusaSlicer erkannte System-SSL-Zertifikatspeicher in: %1%"
+
+#: src/slic3r/GUI/GUI_Init.cpp:85 src/slic3r/GUI/GUI_Init.cpp:88
+msgid "PrusaSlicer GUI initialization failed"
+msgstr "PrusaSlicer GUI-Initialisierung fehlgeschlagen"
+
+#: src/slic3r/GUI/GUI_App.cpp:586
+msgid "PrusaSlicer has encountered a localization error. Please report to PrusaSlicer team, what language was active and in which scenario this issue happened. Thank you.\n\nThe application will now terminate."
+msgstr "PrusaSlicer ist auf einen Lokalisierungsfehler gestoßen. Bitte melden Sie dem PrusaSlicer-Team, welche Sprache aktiv war und in welchem Szenario dieses Problem aufgetreten ist. Wir danken Ihnen.\n\nDie Anwendung wird nun beendet."
+
+#: src/slic3r/GUI/AboutDialog.cpp:285
msgid "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap community."
msgstr "PrusaSlicer basiert auf Slic3r von Alessandro Ranellucci und der RepRap Community."
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:284
-#, c-format
-msgid ""
-"PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n"
-"while OpenGL version %s, render %s, vendor %s was detected."
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:525
+msgid "PrusaSlicer is closing: Unsaved Changes"
+msgstr "PrusaSlicer wird geschlossen: Nicht gespeicherte Änderungen"
+
+#: src/slic3r/GUI/OpenGLManager.cpp:259
+#, possible-c-format
+msgid "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \nwhile OpenGL version %s, render %s, vendor %s was detected."
msgstr "PrusaSlicer benötigt einen OpenGL 2.0-fähigen Grafiktreiber, um korrekt zu laufen, während die OpenGL-Version %s, Render %s, Hersteller %s erkannt wurde."
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:50
msgid "PrusaSlicer version"
msgstr "PrusaSlicer Version"
-#: src/slic3r/GUI/ConfigWizard.cpp:815
-msgid ""
-"PrusaSlicer's user interfaces comes in three variants:\n"
-"Simple, Advanced, and Expert.\n"
-"The Simple mode shows only the most frequently used settings relevant for regular 3D printing. The other two offer progressively more sophisticated fine-tuning, they are suitable for advanced and expert users, respectively."
-msgstr ""
-"Die Benutzeroberflächen von PrusaSlicer sind in drei Varianten erhältlich:\n"
-"Einfach, Fortgeschritten und Experte.\n"
-"Der einfache Modus zeigt nur die am häufigsten verwendeten Einstellungen, die für den regulären 3D-Druck relevant sind. Die beiden anderen bieten eine immer anspruchsvollere Feinabstimmung, sie sind für fortgeschrittene bzw. erfahrene Anwender geeignet."
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:662
+msgid "PrusaSlicer will remember your action."
+msgstr "PrusaSlicer wird sich an Ihre Aktion erinnern."
-#: src/libslic3r/PrintConfig.cpp:2254
+#: src/slic3r/GUI/ConfigWizard.cpp:1174
+msgid "PrusaSlicer's user interfaces comes in three variants:\nSimple, Advanced, and Expert.\nThe Simple mode shows only the most frequently used settings relevant for regular 3D printing. The other two offer progressively more sophisticated fine-tuning, they are suitable for advanced and expert users, respectively."
+msgstr "Die Benutzeroberflächen von PrusaSlicer sind in drei Varianten erhältlich:\nEinfach, Fortgeschritten und Experte.\nDer einfache Modus zeigt nur die am häufigsten verwendeten Einstellungen, die für den regulären 3D-Druck relevant sind. Die beiden anderen bieten eine immer anspruchsvollere Feinabstimmung, sie sind für fortgeschrittene bzw. erfahrene Anwender geeignet."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:668
+msgid "PrusaSlicer: Don't ask me again"
+msgstr "PrusaSlicer: Fragen Sie mich nicht noch einmal"
+
+#: src/libslic3r/PrintConfig.cpp:2397
msgid "Purging after toolchange will done inside this object's infills. This lowers the amount of waste but may result in longer print time due to additional travel moves."
msgstr "Das Reinigen nach dem Werkzeugwechsel erfolgt innerhalb der Füllungen dieses Objekts. Dies reduziert die Abfallquote, kann aber aufgrund zusätzlicher Verfahrwege zu einer längeren Druckzeit führen."
-#: src/slic3r/GUI/Plater.cpp:544
+#: src/slic3r/GUI/Plater.cpp:410
msgid "Purging volumes"
msgstr "Reinigungsvolumen"
-#: src/libslic3r/PrintConfig.cpp:2207
+#: src/libslic3r/PrintConfig.cpp:2350
msgid "Purging volumes - load/unload volumes"
msgstr "Reinigungsvolumen - Lade-/Entladevolumen"
-#: src/libslic3r/PrintConfig.cpp:2214
+#: src/libslic3r/PrintConfig.cpp:2357
msgid "Purging volumes - matrix"
msgstr "Reinigungsvolumen - Matrix"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44
+#: src/libslic3r/PrintConfig.cpp:1201
+msgid "Purpose of Machine Limits"
+msgstr "Zweck der Maschinengrenzen"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43
msgid "Quality"
msgstr "Qualität"
-#: src/slic3r/GUI/Tab.cpp:1080
+#: src/slic3r/GUI/Tab.cpp:1402
msgid "Quality (slower slicing)"
msgstr "Qualität (langsameres Slicen)"
-#: src/slic3r/GUI/GLCanvas3D.cpp:273
+#: src/slic3r/GUI/GLCanvas3D.cpp:260
msgid "Quality / Speed"
msgstr "Qualität / Geschwindigkeit"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1182
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1530
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1536
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1849
-#, c-format
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61
+msgid "Quick"
+msgstr "Schnell"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1306
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1661
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1667
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2008
+#, possible-c-format
msgid "Quick Add Settings (%s)"
msgstr "Schnelles Einstellen (%s)"
-#: src/slic3r/GUI/MainFrame.cpp:512
+#: src/slic3r/GUI/MainFrame.cpp:1113
msgid "Quick Slice"
msgstr "Quick Slice"
-#: src/slic3r/GUI/MainFrame.cpp:518
+#: src/slic3r/GUI/MainFrame.cpp:1119
msgid "Quick Slice and Save As"
msgstr "Quick Slice und Speichern unter"
-#: src/slic3r/GUI/MainFrame.cpp:540
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:1144 src/slic3r/GUI/MainFrame.cpp:1402
+#, possible-c-format
msgid "Quit %s"
msgstr "%s verlassen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:294 src/libslic3r/PrintConfig.cpp:511
+#: src/slic3r/GUI/GUI_App.cpp:396
+msgid "Quit, I will move my data now"
+msgstr "Beenden, ich werde meine Daten jetzt verschieben"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:280 src/libslic3r/PrintConfig.cpp:547
msgid "Radius"
msgstr "Radius"
-#: src/slic3r/GUI/Tab.cpp:1127
+#: src/slic3r/GUI/Tab.cpp:1456
msgid "Raft"
msgstr "Raft"
-#: src/libslic3r/PrintConfig.cpp:1501
+#: src/libslic3r/PrintConfig.cpp:1609
msgid "Raft layers"
msgstr "Raftschichten"
@@ -5749,14 +6841,8 @@ msgid "Ramming customization"
msgstr "Einstellungen für das Rammen"
#: src/slic3r/GUI/WipeTowerDialog.cpp:41
-msgid ""
-"Ramming denotes the rapid extrusion just before a tool change in a single-extruder MM printer. Its purpose is to properly shape the end of the unloaded filament so it does not prevent insertion of the new filament and can itself be reinserted later. This phase is important and different materials can require different extrusion speeds to get the good shape. For this reason, the extrusion rates during ramming are adjustable.\n"
-"\n"
-"This is an expert-level setting, incorrect adjustment will likely lead to jams, extruder wheel grinding into filament etc."
-msgstr ""
-"Rammen steht für die beschleunigte Extrusion unmittelbar vor einem Werkzeugwechsel in einem MM-Drucker mit einem Extruder. Der Zweck ist, die Spitze des entladenen Filaments geeignet zu formen, damit es das Laden des neuen Filaments nicht behindert und später selber wieder eingeführt werden kann. Diese Phase ist wichtig und verschiedene Materialien können unterschiedliche Extrusionsgeschwindigkeiten benötigen, um die richtige Form zu erzielen. Aus diesem Grund können die Extrusionsraten für das Rammen angepasst werden.\n"
-"\n"
-"Dies ist eine Einstellung für fortgeschrittene Benutzer. Falsche Anpassungen werden sehr wahrscheinlich zu Verstopfungen führen oder dazu, dass die Zähne der Extruderwelle ins Filament einschneiden usw."
+msgid "Ramming denotes the rapid extrusion just before a tool change in a single-extruder MM printer. Its purpose is to properly shape the end of the unloaded filament so it does not prevent insertion of the new filament and can itself be reinserted later. This phase is important and different materials can require different extrusion speeds to get the good shape. For this reason, the extrusion rates during ramming are adjustable.\n\nThis is an expert-level setting, incorrect adjustment will likely lead to jams, extruder wheel grinding into filament etc."
+msgstr "Rammen steht für die beschleunigte Extrusion unmittelbar vor einem Werkzeugwechsel in einem MM-Drucker mit einem Extruder. Der Zweck ist, die Spitze des entladenen Filaments geeignet zu formen, damit es das Laden des neuen Filaments nicht behindert und später selber wieder eingeführt werden kann. Diese Phase ist wichtig und verschiedene Materialien können unterschiedliche Extrusionsgeschwindigkeiten benötigen, um die richtige Form zu erzielen. Aus diesem Grund können die Extrusionsraten für das Rammen angepasst werden.\n\nDies ist eine Einstellung für fortgeschrittene Benutzer. Falsche Anpassungen werden sehr wahrscheinlich zu Verstopfungen führen oder dazu, dass die Zähne der Extruderwelle ins Filament einschneiden usw."
#: src/slic3r/GUI/WipeTowerDialog.cpp:91
msgid "Ramming line spacing"
@@ -5766,27 +6852,27 @@ msgstr "Abstand der Rammlinien"
msgid "Ramming line width"
msgstr "Breite der Rammlinie"
-#: src/libslic3r/PrintConfig.cpp:694
+#: src/libslic3r/PrintConfig.cpp:730
msgid "Ramming parameters"
msgstr "Rammparameter"
-#: src/slic3r/GUI/Tab.cpp:1505
+#: src/slic3r/GUI/Tab.cpp:1850
msgid "Ramming settings"
msgstr "Einstellungen für das Rammen"
-#: src/libslic3r/PrintConfig.cpp:1629
+#: src/libslic3r/PrintConfig.cpp:1737
msgid "Random"
msgstr "Zufällig"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:94
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:96
msgid "Range"
msgstr "Bereich"
-#: src/libslic3r/SLAPrintSteps.cpp:65
+#: src/libslic3r/SLAPrintSteps.cpp:66
msgid "Rasterizing layers"
msgstr "Schichten werden gerastert"
-#: src/slic3r/GUI/MainFrame.cpp:596
+#: src/slic3r/GUI/MainFrame.cpp:1202
msgid "Re&load from disk"
msgstr "Erneutes &Laden von der Festplatte"
@@ -5798,210 +6884,243 @@ msgstr "Neu konfigurieren"
msgid "Ready"
msgstr "Fertig"
-#: src/slic3r/GUI/Plater.cpp:3115
+#: src/slic3r/GUI/Plater.cpp:2915
msgid "Ready to slice"
msgstr "Bereit zum Slicen"
-#: src/slic3r/GUI/MainFrame.cpp:669 src/libslic3r/PrintConfig.cpp:1632
+#: src/slic3r/GUI/MainFrame.cpp:966 src/slic3r/GUI/MainFrame.cpp:1286
+#: src/libslic3r/PrintConfig.cpp:1740
msgid "Rear"
msgstr "Hinten"
-#: src/slic3r/GUI/MainFrame.cpp:669
+#: src/slic3r/GUI/MainFrame.cpp:966 src/slic3r/GUI/MainFrame.cpp:1286
msgid "Rear View"
msgstr "Ansicht von Hinten"
-#: src/slic3r/GUI/MainFrame.cpp:413
+#: src/slic3r/GUI/MainFrame.cpp:994
msgid "Recent projects"
msgstr "L&etzte Projekte"
-#: src/slic3r/GUI/PresetHints.cpp:263
-#, c-format
+#: src/slic3r/GUI/PresetHints.cpp:262
+#, possible-c-format
msgid "Recommended object thin wall thickness for layer height %.2f and"
msgstr "Empfohlene Stärke der dünnen Wände des Objekts für die Schichthöhe %.2f und"
-#: src/slic3r/GUI/PresetHints.cpp:274
+#: src/slic3r/GUI/PresetHints.cpp:273
msgid "Recommended object thin wall thickness: Not available due to excessively small extrusion width."
msgstr "Empfohlene Stärke der dünnen Wände des Objekts: Nicht verfügbar wegen extrem geringer Extrusionsbreite."
-#: src/slic3r/GUI/PresetHints.cpp:247
+#: src/slic3r/GUI/PresetHints.cpp:246
msgid "Recommended object thin wall thickness: Not available due to invalid layer height."
msgstr "Empfohlene Stärke der dünnen Wände des Objekts: Nicht verfügbar wegen unzulässiger Schichthöhe."
-#: src/slic3r/GUI/GUI_App.cpp:450 src/slic3r/GUI/GUI_App.cpp:459
+#: src/slic3r/GUI/GUI_App.cpp:1102 src/slic3r/GUI/GUI_App.cpp:1115
msgid "Recreating"
msgstr "Neu Erzeugen"
-#: src/slic3r/GUI/BedShapeDialog.cpp:73
+#: src/slic3r/GUI/BedShapeDialog.cpp:141
msgid "Rectangular"
msgstr "Rechteckig"
-#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:843
-#: src/libslic3r/PrintConfig.cpp:2009
+#: src/libslic3r/PrintConfig.cpp:460 src/libslic3r/PrintConfig.cpp:881
+#: src/libslic3r/PrintConfig.cpp:2151
msgid "Rectilinear"
msgstr "Geradlinig"
-#: src/libslic3r/PrintConfig.cpp:2010
+#: src/libslic3r/PrintConfig.cpp:2152
msgid "Rectilinear grid"
msgstr "Rechtwinkliges Gitter"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4657 src/slic3r/GUI/KBShortcutsDialog.cpp:131
-#: src/slic3r/GUI/MainFrame.cpp:584
+#: src/slic3r/GUI/GLCanvas3D.cpp:5067 src/slic3r/GUI/KBShortcutsDialog.cpp:126
+#: src/slic3r/GUI/MainFrame.cpp:1190
msgid "Redo"
msgstr "Redo"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4065
-#, c-format
+#: src/slic3r/GUI/GLCanvas3D.cpp:4382
+#, possible-c-format
msgid "Redo %1$d Action"
msgid_plural "Redo %1$d Actions"
msgstr[0] "Redo %1$d Aktion"
msgstr[1] "Redo %1$d Aktionen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4047
+#: src/slic3r/GUI/GLCanvas3D.cpp:4361
msgid "Redo History"
msgstr "Redo Verlauf"
-#: src/slic3r/GUI/Tab.cpp:1098
+#: src/slic3r/GUI/Tab.cpp:1426
msgid "Reducing printing time"
msgstr "Druckzeit wird verkürzt"
-#: src/slic3r/GUI/Plater.cpp:3452
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327
+msgid "Refresh Printers"
+msgstr "Drucker aktualisieren"
+
+#: src/libslic3r/PrintConfig.cpp:145
+msgid "Related printer preset name"
+msgstr "Zugehöriger Name der Druckervoreinstellung"
+
+#: src/slic3r/GUI/Plater.cpp:3257
msgid "Reload all from disk"
msgstr "Alles von der Festplatte neu laden"
-#: src/slic3r/GUI/ConfigWizard.cpp:798 src/slic3r/GUI/GUI_ObjectList.cpp:1664
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3956 src/slic3r/GUI/Plater.cpp:3225
-#: src/slic3r/GUI/Plater.cpp:3934 src/slic3r/GUI/Plater.cpp:3963
+#: src/slic3r/GUI/ConfigWizard.cpp:1157 src/slic3r/GUI/GUI_ObjectList.cpp:1793
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4439 src/slic3r/GUI/Plater.cpp:3028
+#: src/slic3r/GUI/Plater.cpp:3852 src/slic3r/GUI/Plater.cpp:3881
msgid "Reload from disk"
msgstr "Neuladen von Festplatte"
-#: src/slic3r/GUI/Plater.cpp:3339
+#: src/slic3r/GUI/Plater.cpp:3142
msgid "Reload from:"
msgstr "Neuladen von:"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:134
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:129
msgid "Reload plater from disk"
msgstr "Druckplatte neu von der Festplatte laden"
-#: src/slic3r/GUI/MainFrame.cpp:597
+#: src/slic3r/GUI/MainFrame.cpp:1203
msgid "Reload the plater from disk"
msgstr "Druckplatte neu von der Festplatte laden"
-#: src/slic3r/GUI/Plater.cpp:3963
+#: src/slic3r/GUI/Plater.cpp:3881
msgid "Reload the selected object from disk"
msgstr "Das ausgewählte Objekt von der Festplatte neu laden"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1664
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3956 src/slic3r/GUI/Plater.cpp:3934
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1793
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4439 src/slic3r/GUI/Plater.cpp:3852
msgid "Reload the selected volumes from disk"
msgstr "Die ausgewählten Volumen von der Festplatte neu laden"
-#: src/slic3r/GUI/Preferences.cpp:39
+#: src/slic3r/GUI/GCodeViewer.cpp:2442 src/slic3r/GUI/GCodeViewer.cpp:2445
+msgid "Remaining time"
+msgstr "Restzeit"
+
+#: src/slic3r/GUI/GUI_App.cpp:720 src/slic3r/GUI/UnsavedChangesDialog.cpp:653
+msgid "Remember my choice"
+msgstr "Auswahl merken"
+
+#: src/slic3r/GUI/Preferences.cpp:52
msgid "Remember output directory"
msgstr "Ausgabeverzeichnis merken"
-#: src/slic3r/GUI/Tab.cpp:3121
+#: src/slic3r/GUI/MainFrame.cpp:166
+msgid "Remember to check for updates at https://github.com/prusa3d/PrusaSlicer/releases"
+msgstr "Denken Sie daran, nach Updates zu suchen unter https://github.com/prusa3d/PrusaSlicer/releases"
+
+#: src/slic3r/GUI/Tab.cpp:3386
msgid "remove"
msgstr "Entfernen"
-#: src/slic3r/GUI/BedShapeDialog.cpp:190 src/slic3r/GUI/BedShapeDialog.cpp:269
-#: src/slic3r/GUI/Tab.cpp:3124
+#: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/BedShapeDialog.cpp:413
+#: src/slic3r/GUI/Tab.cpp:3423
msgid "Remove"
msgstr "Entfernen"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48
msgid "Remove all holes"
msgstr "Alle Löcher entfernen"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50
msgid "Remove all points"
msgstr "Alle Punkte entfernen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:246
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35
+msgid "Remove all selection"
+msgstr "Gesamte Auswahl entfernen"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:239
msgid "Remove detail"
msgstr "Detail entfernen"
-#: src/slic3r/GUI/Plater.cpp:879
-msgid "Remove device"
-msgstr "Gerät entfernen"
-
#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:182
msgid "Remove extruder from sequence"
msgstr "Extruder aus der Sequenz entfernen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4537 src/slic3r/GUI/Plater.cpp:3942
+#: src/slic3r/GUI/GLCanvas3D.cpp:4903 src/slic3r/GUI/Plater.cpp:3860
msgid "Remove instance"
msgstr "Kopie entfernen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:160
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:154
msgid "Remove Instance of the selected object"
msgstr "Entfernt Kopie des gewählten Objekts"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:153
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:161
msgid "Remove layer range"
msgstr "Schichtbereich entfernen"
-#: src/slic3r/GUI/Plater.cpp:3942
+#: src/slic3r/GUI/Plater.cpp:3860
msgid "Remove one instance of the selected object"
msgstr "Entferne eine Kopie des gewählten Objekts"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:95
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:98
msgid "Remove parameter"
msgstr "Parameter entfernen"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211
msgid "Remove point"
msgstr "Punkt entfernen"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214
msgid "Remove point from selection"
msgstr "Punkt von Auswahl entfernen"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47
msgid "Remove selected holes"
msgstr "Ausgewählte Löcher entfernen"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1371
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218
msgid "Remove selected points"
msgstr "Ausgewählte Punkte entfernen"
-#: src/slic3r/GUI/Plater.cpp:3931 src/slic3r/GUI/Plater.cpp:3953
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:368
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:378
+msgid "Remove selection"
+msgstr "Auswahl entfernen"
+
+#: src/slic3r/GUI/Plater.cpp:3849 src/slic3r/GUI/Plater.cpp:3871
msgid "Remove the selected object"
msgstr "Ausgewähltes Objekt entfernen"
-#: src/slic3r/GUI/ConfigWizard.cpp:453
+#: src/slic3r/GUI/ConfigWizard.cpp:456
msgid "Remove user profiles (a snapshot will be taken beforehand)"
msgstr "Benutzerprofile entfernen (eine Momentaufnahme wird vorab erstellt)"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1636
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1765
msgid "Rename"
msgstr "Umbenennen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:589
msgid "Rename Object"
msgstr "Objekt umbenennen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:589
msgid "Rename Sub-object"
msgstr "Subobjekt umbenennen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3803
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4266
msgid "Renaming"
msgstr "Am Umbenennen"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:115
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:150
msgid "Renaming of the G-code after copying to the selected destination folder has failed. Current path is %1%.tmp. Please try exporting again."
msgstr "Das Umbenennen des G-Codes nach dem Kopieren in den ausgewählten Zielordner ist fehlgeschlagen. Der aktuelle Pfad ist %1%.tmp. Bitte versuchen Sie erneut zu exportieren."
-#: src/libslic3r/PrintConfig.cpp:3515
+#: src/slic3r/GUI/Preferences.cpp:255
+msgid "Render"
+msgstr "Render"
+
+#: src/libslic3r/PrintConfig.cpp:3720
msgid "Render with a software renderer"
msgstr "Rendern mit einem Software-Renderer"
-#: src/libslic3r/PrintConfig.cpp:3516
+#: src/libslic3r/PrintConfig.cpp:3721
msgid "Render with a software renderer. The bundled MESA software renderer is loaded instead of the default OpenGL driver."
msgstr "Rendern mit einem Software-Renderer. Der mitgelieferte MESA-Software-Renderer wird anstelle des standardmäßigen OpenGL-Treibers geladen."
-#: src/slic3r/GUI/MainFrame.cpp:911 src/libslic3r/PrintConfig.cpp:3447
+#: src/slic3r/GUI/MainFrame.cpp:1612 src/libslic3r/PrintConfig.cpp:3646
msgid "Repair"
msgstr "Reparieren"
@@ -6025,39 +7144,39 @@ msgstr "Die reparierte 3MF Datei enhält keine Volumen"
msgid "Repairing model by the Netfabb service"
msgstr "Reparieren des Modells durch den Netfabb-Dienst"
-#: src/slic3r/GUI/MainFrame.cpp:524
+#: src/slic3r/GUI/MainFrame.cpp:1125
msgid "Repeat last quick slice"
msgstr "Letzten Quick Slice wiederholen"
-#: src/slic3r/GUI/MainFrame.cpp:524
+#: src/slic3r/GUI/MainFrame.cpp:1125
msgid "Repeat Last Quick Slice"
msgstr "Letzten Quick Slice wiederholen"
-#: src/slic3r/GUI/Tab.cpp:3083
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:477
msgid "Replace?"
msgstr "Ersetzen?"
-#: src/slic3r/GUI/MainFrame.cpp:703
+#: src/slic3r/GUI/MainFrame.cpp:928 src/slic3r/GUI/MainFrame.cpp:1327
msgid "Report an I&ssue"
msgstr "Ein &Problem melden"
-#: src/slic3r/GUI/MainFrame.cpp:703
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:928 src/slic3r/GUI/MainFrame.cpp:1327
+#, possible-c-format
msgid "Report an issue on %s"
msgstr "Einen Problem melden über %s"
-#: src/slic3r/Utils/PresetUpdater.cpp:713
-#, c-format
+#: src/slic3r/Utils/PresetUpdater.cpp:733
+#, possible-c-format
msgid "requires max. %s"
msgstr "benötigt max. %s"
-#: src/slic3r/Utils/PresetUpdater.cpp:710
-#, c-format
+#: src/slic3r/Utils/PresetUpdater.cpp:730
+#, possible-c-format
msgid "requires min. %s"
msgstr "benötigt min. %s"
-#: src/slic3r/Utils/PresetUpdater.cpp:705
-#, c-format
+#: src/slic3r/Utils/PresetUpdater.cpp:726
+#, possible-c-format
msgid "requires min. %s and max. %s"
msgstr "benötigt min. %s und max. %s"
@@ -6065,270 +7184,304 @@ msgstr "benötigt min. %s und max. %s"
msgid "Rescan"
msgstr "Rescan"
-#: src/slic3r/GUI/Tab.cpp:1906
-msgid "Rescan serial ports"
-msgstr "Serielle Schnittstellen nochmals abfragen"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:313
+#: src/slic3r/GUI/GLCanvas3D.cpp:299
msgid "Reset"
msgstr "Rücksetzen"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1373
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220
msgid "Reset clipping plane"
msgstr "Beschnittebene zurücksetzen"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:59
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:26
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58
msgid "Reset direction"
msgstr "Richtung zurücksetzen"
-#: src/slic3r/GUI/Plater.cpp:2723
+#: src/slic3r/GUI/Plater.cpp:2684
msgid "Reset Project"
msgstr "Projekt zurücksetzen"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:372
msgid "Reset rotation"
msgstr "Rotation zurücksetzen"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:394
msgid "Reset Rotation"
msgstr "Rotation zurücksetzen"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:397
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:407
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409
msgid "Reset scale"
msgstr "Skalierung zurücksetzen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:252
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:136
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:118
+msgid "Reset selection"
+msgstr "Auswahl zurücksetzen"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:243
msgid "Reset to base"
msgstr "Zurücksetzen auf Basis"
-#: src/slic3r/GUI/Tab.cpp:2394
+#: src/slic3r/GUI/Tab.cpp:2564
msgid "Reset to Filament Color"
msgstr "Zurücksetzen auf Filamentfarbe"
-#: src/libslic3r/PrintConfig.cpp:1511
+#: src/libslic3r/PrintConfig.cpp:1619
msgid "Resolution"
msgstr "Auflösung"
-#: src/libslic3r/PrintConfig.cpp:1529
+#: src/libslic3r/PrintConfig.cpp:1637
msgid "Retract amount before wipe"
msgstr "Einzugslänge vor einer Reinigung"
-#: src/libslic3r/PrintConfig.cpp:1537
+#: src/libslic3r/PrintConfig.cpp:1645
msgid "Retract on layer change"
msgstr "Bei Schichtwechsel einziehen"
-#: src/slic3r/GUI/Tab.cpp:1324 src/slic3r/GUI/Tab.cpp:1383
-#: src/slic3r/GUI/Tab.cpp:2370
+#: src/slic3r/GUI/GCodeViewer.cpp:2494 src/slic3r/GUI/Tab.cpp:1670
+#: src/slic3r/GUI/Tab.cpp:2539
msgid "Retraction"
msgstr "Einzug"
-#: src/libslic3r/PrintConfig.cpp:1523
+#: src/libslic3r/PrintConfig.cpp:1631
msgid "Retraction is not triggered when travel moves are shorter than this length."
msgstr "Der Einzug wird nicht ausgelöst, wenn die Fahrbewegungen kürzer als diese Länge sind."
-#: src/libslic3r/PrintConfig.cpp:1544
+#: src/libslic3r/PrintConfig.cpp:1652
msgid "Retraction Length"
msgstr "Einzugslänge"
-#: src/libslic3r/PrintConfig.cpp:1552
+#: src/libslic3r/PrintConfig.cpp:1660
msgid "Retraction Length (Toolchange)"
msgstr "Einzugslänge (Werkzeugwechsel)"
-#: src/libslic3r/PrintConfig.cpp:1604 src/libslic3r/PrintConfig.cpp:1605
+#: src/libslic3r/PrintConfig.cpp:1712 src/libslic3r/PrintConfig.cpp:1713
msgid "Retraction Speed"
msgstr "Einzugsgeschwindigkeit"
-#: src/slic3r/GUI/Tab.cpp:2386
+#: src/slic3r/GUI/Tab.cpp:2555
msgid "Retraction when tool is disabled (advanced settings for multi-extruder setups)"
msgstr "Einzug, wenn das Werkzeug deaktiviert ist (weiterführende Einstellungen für Multi-Extruder-Einrichtungen)"
-#: src/slic3r/GUI/GUI_Preview.cpp:254
+#: src/slic3r/GUI/GCodeViewer.cpp:2528 src/slic3r/GUI/GUI_Preview.cpp:336
+#: src/slic3r/GUI/GUI_Preview.cpp:1472
msgid "Retractions"
msgstr "Einzüge"
-#: src/slic3r/GUI/MainFrame.cpp:673
+#: src/slic3r/GUI/Preferences.cpp:198
+msgid "Reverse direction of zoom with mouse wheel"
+msgstr "Umkehrung der Zoom-Richtung des Mausrads"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1861 src/slic3r/GUI/Plater.cpp:4886
+msgid "Revert conversion from imperial units"
+msgstr "Umrechnung von imperialen Einheiten rückgängig machen"
+
+#: src/slic3r/GUI/MainFrame.cpp:970 src/slic3r/GUI/MainFrame.cpp:1290
msgid "Right"
msgstr "Rechts"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:402
+#: src/slic3r/GUI/GUI_ObjectList.cpp:449
msgid "Right button click the icon to change the object printable property"
msgstr "Klicken Sie mit der rechten Maustaste auf das Symbol, um die Druckbar-Eigenschaft des Objekts zu ändern"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:396
+#: src/slic3r/GUI/GUI_ObjectList.cpp:443
msgid "Right button click the icon to change the object settings"
msgstr "Klicken Sie mit der rechten Maustaste auf das Symbol, um die Objekteinstellungen zu ändern"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:359
+#: src/slic3r/GUI/GUI_ObjectList.cpp:406
msgid "Right button click the icon to fix STL through Netfabb"
msgstr "Klicken Sie mit der rechten Maustaste auf das Symbol, um die STL über Netfabb zu reparieren"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211
msgid "Right click"
msgstr "Rechter Mausklick"
-#: src/slic3r/GUI/GLCanvas3D.cpp:243
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31
+msgid "Right mouse button"
+msgstr "Rechte Maustaste"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:237
msgid "Right mouse button:"
msgstr "Rechte Maustaste:"
-#: src/slic3r/GUI/MainFrame.cpp:673
+#: src/slic3r/GUI/MainFrame.cpp:970 src/slic3r/GUI/MainFrame.cpp:1290
msgid "Right View"
msgstr "Ansicht von rechts"
-#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:449
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:480
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:499
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:517
-#: src/libslic3r/PrintConfig.cpp:3451
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:513
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:527
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562
+#: src/libslic3r/PrintConfig.cpp:3650
msgid "Rotate"
msgstr "Drehen"
-#: src/libslic3r/PrintConfig.cpp:3456
+#: src/libslic3r/PrintConfig.cpp:3655
msgid "Rotate around X"
msgstr "Rotiere um X"
-#: src/libslic3r/PrintConfig.cpp:3461
+#: src/libslic3r/PrintConfig.cpp:3660
msgid "Rotate around Y"
msgstr "Rotiere um Y"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:172
msgid "Rotate lower part upwards"
msgstr "Unteren Teil umdrehen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
msgid "Rotate selection 45 degrees CCW"
msgstr "Auswahl um 45 Grad drehen gegen UZS"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
msgid "Rotate selection 45 degrees CW"
msgstr "Auswahl um 45 Grad drehen im UZS"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:458
-#: src/slic3r/GUI/Mouse3DController.cpp:304
-#: src/slic3r/GUI/Mouse3DController.cpp:321
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:210
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:224
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:506
+#: src/slic3r/GUI/Mouse3DController.cpp:288
+#: src/slic3r/GUI/Mouse3DController.cpp:309
msgid "Rotation"
msgstr "Rotation"
-#: src/libslic3r/PrintConfig.cpp:3457
+#: src/libslic3r/PrintConfig.cpp:3656
msgid "Rotation angle around the X axis in degrees."
msgstr "Rotationswinkel um die X-Achse in Grad."
-#: src/libslic3r/PrintConfig.cpp:3462
+#: src/libslic3r/PrintConfig.cpp:3661
msgid "Rotation angle around the Y axis in degrees."
msgstr "Rotationswinkel um die Y-Achse in Grad."
-#: src/libslic3r/PrintConfig.cpp:3452
+#: src/libslic3r/PrintConfig.cpp:3651
msgid "Rotation angle around the Z axis in degrees."
msgstr "Rotationswinkel um die Z-Achse in Grad."
-#: src/slic3r/GUI/GUI_App.cpp:797
-#, c-format
+#: src/slic3r/GUI/DoubleSlider.cpp:1836
+msgid "Ruler mode"
+msgstr "Lineal-Modus"
+
+#: src/slic3r/GUI/GUI_App.cpp:1474
+#, possible-c-format
msgid "Run %s"
msgstr "%s ausführen"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:128
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:478
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:163
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:520
msgid "Running post-processing scripts"
msgstr "Post-Prozess Scripts werden ausgeführt"
#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83
-#: src/libslic3r/PrintConfig.cpp:644 src/libslic3r/PrintConfig.cpp:688
-#: src/libslic3r/PrintConfig.cpp:703 src/libslic3r/PrintConfig.cpp:2408
-#: src/libslic3r/PrintConfig.cpp:2417 src/libslic3r/PrintConfig.cpp:2527
-#: src/libslic3r/PrintConfig.cpp:2535 src/libslic3r/PrintConfig.cpp:2543
-#: src/libslic3r/PrintConfig.cpp:2550 src/libslic3r/PrintConfig.cpp:2558
-#: src/libslic3r/PrintConfig.cpp:2566
+#: src/libslic3r/PrintConfig.cpp:680 src/libslic3r/PrintConfig.cpp:724
+#: src/libslic3r/PrintConfig.cpp:739 src/libslic3r/PrintConfig.cpp:2551
+#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2670
+#: src/libslic3r/PrintConfig.cpp:2678 src/libslic3r/PrintConfig.cpp:2686
+#: src/libslic3r/PrintConfig.cpp:2693 src/libslic3r/PrintConfig.cpp:2701
+#: src/libslic3r/PrintConfig.cpp:2709
msgid "s"
msgstr "s"
-#: src/slic3r/GUI/MainFrame.cpp:481 src/slic3r/GUI/MainFrame.cpp:750
+#: src/slic3r/GUI/MainFrame.cpp:1072 src/slic3r/GUI/MainFrame.cpp:1449
msgid "S&end G-code"
msgstr "S&ende G-code"
-#: src/slic3r/GUI/MainFrame.cpp:750
+#: src/slic3r/GUI/MainFrame.cpp:1449
msgid "S&end to print"
msgstr "Zum Drucken s&enden"
-#. TRN Preset
-#: src/slic3r/GUI/Tab.cpp:3417
-#, c-format
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:642
+msgid "Save"
+msgstr "Speichern"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:72
+#, possible-c-format
msgid "Save %s as:"
msgstr "Speichere %s als:"
-#: src/slic3r/GUI/MainFrame.cpp:826
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:1527
+#, possible-c-format
msgid "Save %s file as:"
msgstr "Speichere %s Datei als:"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1046
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912
msgid "Save changes?"
msgstr "Änderungen speichern?"
-#: src/libslic3r/PrintConfig.cpp:3386
+#: src/libslic3r/PrintConfig.cpp:3585
msgid "Save config file"
msgstr "Speichere Konfigurationsdatei"
-#: src/slic3r/GUI/MainFrame.cpp:925
+#: src/slic3r/GUI/MainFrame.cpp:1626
msgid "Save configuration as:"
msgstr "Konfiguration speichern unter:"
-#: src/libslic3r/PrintConfig.cpp:3387
+#: src/libslic3r/PrintConfig.cpp:3586
msgid "Save configuration to the specified file."
msgstr "Sichert die Konfiguration in der angegebenen Datei."
#. TRN "Save current Settings"
-#: src/slic3r/GUI/Tab.cpp:133
-#, c-format
+#: src/slic3r/GUI/Tab.cpp:203
+#, possible-c-format
msgid "Save current %s"
msgstr "Speichere aktuelle %s"
-#: src/slic3r/GUI/MainFrame.cpp:446
+#: src/slic3r/GUI/MainFrame.cpp:1028
msgid "Save current project file"
msgstr "Speichere aktuelle Projektdatei"
-#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452
+#: src/slic3r/GUI/MainFrame.cpp:1032 src/slic3r/GUI/MainFrame.cpp:1034
msgid "Save current project file as"
msgstr "Speichere aktuelle Projektdatei als"
-#: src/slic3r/GUI/Plater.cpp:2604
+#: src/slic3r/GUI/Plater.cpp:2566
msgid "Save file as:"
msgstr "Speichere Datei als:"
-#: src/slic3r/GUI/Plater.cpp:4839
+#: src/slic3r/GUI/Plater.cpp:4975
msgid "Save G-code file as:"
msgstr "Speichere G-Code Datei als:"
-#: src/slic3r/GUI/MainFrame.cpp:899
+#: src/slic3r/GUI/MainFrame.cpp:1600
msgid "Save OBJ file (less prone to coordinate errors than STL) as:"
msgstr "Speichern als OBJ-Datei (weniger anfällig für Koordinatenfehler als STL):"
-#: src/slic3r/GUI/Tab.hpp:443
+#: src/slic3r/GUI/SavePresetDialog.cpp:190
+#: src/slic3r/GUI/SavePresetDialog.cpp:196
msgid "Save preset"
msgstr "Sichern der Voreinstellung"
-#: src/slic3r/GUI/MainFrame.cpp:980
+#: src/slic3r/GUI/MainFrame.cpp:1681
msgid "Save presets bundle as:"
msgstr "Sichern der Voreinstellungssammlung unter:"
-#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452
+#: src/slic3r/GUI/MainFrame.cpp:1032 src/slic3r/GUI/MainFrame.cpp:1034
msgid "Save Project &as"
msgstr "Projekt sichern &als"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:114
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:107
msgid "Save project (3mf)"
msgstr "Speichere Projekt (3mf)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:115
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:108
msgid "Save project as (3mf)"
msgstr "Speichere Projekt als (3mf)"
-#: src/slic3r/GUI/Plater.cpp:4839
+#: src/slic3r/GUI/Plater.cpp:4975
msgid "Save SL1 file as:"
msgstr "Speichere SL1 Datei als:"
-#: src/slic3r/GUI/MainFrame.cpp:838
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:744
+msgid "Save the selected options to preset \"%1%\"."
+msgstr "Speichern der ausgewählten Optionen unter der Voreinstellung \"%1%\"."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:740
+msgid "Save the selected options."
+msgstr "Speichern der ausgewählten Optionen."
+
+#: src/slic3r/GUI/MainFrame.cpp:1539
msgid "Save zip file as:"
msgstr "Speichere Zip Datei als:"
@@ -6338,219 +7491,244 @@ msgstr "Speichere Zip Datei als:"
msgid "Saving mesh into the 3MF container failed."
msgstr "Sichern des Netzes in einen 3MF-Container fehlgeschlagen."
-#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:47
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:230
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:500
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:518
-#: src/libslic3r/PrintConfig.cpp:3466
+#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:78
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:238
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:547
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563
+#: src/libslic3r/PrintConfig.cpp:3665
msgid "Scale"
msgstr "Skalieren"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:459
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:507
msgid "Scale factors"
msgstr "Skalierungsfaktoren"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:196
-msgid ""
-"Scale selection to fit print volume\n"
-"in Gizmo scale"
-msgstr "Auswahl passend zum Druckvolumen in der Gizmo Skalierung anpassen"
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1724
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1852
msgid "Scale the selected object to fit the print volume"
msgstr "Skalieren des ausgewählten Objekts so, dass es in das Druckvolumen passt"
-#: src/libslic3r/PrintConfig.cpp:3475
+#: src/libslic3r/PrintConfig.cpp:3674
msgid "Scale to Fit"
msgstr "Passend skalieren"
-#: src/slic3r/GUI/Selection.cpp:939
+#: src/slic3r/GUI/Selection.cpp:988
msgid "Scale To Fit"
msgstr "Passend skalieren"
-#: src/libslic3r/PrintConfig.cpp:3476
+#: src/libslic3r/PrintConfig.cpp:3675
msgid "Scale to fit the given volume."
msgstr "Auf das gegebene Volumen skalieren."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1724
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1852
msgid "Scale to print volume"
msgstr "Auf Druckvolumen skalieren"
-#: src/libslic3r/PrintConfig.cpp:3467
+#: src/libslic3r/PrintConfig.cpp:3666
msgid "Scaling factor or percentage."
msgstr "Skalierungsfaktor oder Prozentsatz."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:505
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:545
msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue"
msgstr "Geplante Hochladung auf `%1%`. Siehe Fenster -> Druck-Host Uploadwarteschlange"
-#: src/libslic3r/PrintConfig.cpp:1621
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:46
+msgid "Seam painting"
+msgstr "Aufmal-Nähte"
+
+#: src/libslic3r/PrintConfig.cpp:1729
msgid "Seam position"
msgstr "Nahtposition"
-#: src/libslic3r/PrintConfig.cpp:1642
+#: src/libslic3r/PrintConfig.cpp:1750
msgid "Seam preferred direction"
msgstr "Bevorzugte Richtung für Nähte"
-#: src/libslic3r/PrintConfig.cpp:1651
+#: src/libslic3r/PrintConfig.cpp:1759
msgid "Seam preferred direction jitter"
msgstr "Bevorzugte Zitterrichtung für Nähte"
+#: src/slic3r/GUI/MainFrame.cpp:1207
+msgid "Searc&h"
+msgstr "Suc&hen"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4402 src/slic3r/GUI/GLCanvas3D.cpp:4957
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 src/slic3r/GUI/Search.cpp:426
+msgid "Search"
+msgstr "Suchen"
+
+#: src/slic3r/GUI/ImGuiWrapper.cpp:803 src/slic3r/GUI/Search.cpp:460
+msgid "Search in English"
+msgstr "Suche in Englisch"
+
+#: src/slic3r/GUI/MainFrame.cpp:1216
+msgid "Search in settings"
+msgstr "Suche in Einstellungen"
+
+#: src/slic3r/GUI/Tab.cpp:222
+msgid "Search in settings [%1%]"
+msgstr "Suche in Einstellungen [%1%]"
+
#: src/slic3r/GUI/BonjourDialog.cpp:218
msgid "Searching for devices"
msgstr "Es wird nach Geräten gesucht"
-#: src/slic3r/GUI/Plater.cpp:2858
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:41
msgid "Searching for optimal orientation"
msgstr "Suche nach der optimalen Orientierung"
-#: src/slic3r/GUI/GUI_App.cpp:1103
+#: src/slic3r/GUI/NotificationManager.hpp:321
+msgid "See more."
+msgstr "Siehe mehr."
+
+#: src/slic3r/GUI/NotificationManager.hpp:322
+msgid "See Releases page."
+msgstr "Siehe Releases-Seite."
+
+#: src/slic3r/GUI/GUI_App.cpp:1895
msgid "Select a gcode file:"
msgstr "Gcode Datei auswählen:"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:126
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:121
msgid "Select all objects"
msgstr "Alle Objekte auswählen"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1370
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217
msgid "Select all points"
msgstr "Alle Punkte auswählen"
-#: src/slic3r/GUI/ConfigWizard.cpp:1976
+#: src/slic3r/GUI/ConfigWizard.cpp:2487
msgid "Select all standard printers"
msgstr "Wähle alle Standarddrucker"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1368
+#: src/slic3r/GUI/Plater.cpp:1422
+msgid "Select an action to apply to the file"
+msgstr "Wählen Sie eine Aktion, die auf die Datei angewendet werden soll"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215
msgid "Select by rectangle"
msgstr "Auswahl über Rechteck"
-#: src/slic3r/GUI/MainFrame.cpp:944 src/slic3r/GUI/MainFrame.cpp:1006
+#: src/slic3r/GUI/MainFrame.cpp:1645 src/slic3r/GUI/MainFrame.cpp:1707
msgid "Select configuration to load:"
msgstr "Konfiguration zum Laden auswählen:"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:82
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:88
msgid "Select coordinate space, in which the transformation will be performed."
msgstr "Koordinatenraum wählen, in dem die Transformation durchgeführt wird."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3971
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4458
msgid "Select extruder number:"
msgstr "Wählen Sie die Extruder Nummer:"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:138
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:134
msgid "Select Filament Settings Tab"
msgstr "Wählt Filamenteinstellungsreiter"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:136
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:132
msgid "Select Plater Tab"
msgstr "Wählt Druckplattenreiter"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:137
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:133
msgid "Select Print Settings Tab"
msgstr "Wählt Druckeinstellungsreiter"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:139
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:135
msgid "Select Printer Settings Tab"
msgstr "Wählt Druckereinstellungsreiter"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1265
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1396
msgid "Select showing settings"
msgstr "Wähle Anzeigeeinstellungen"
-#: src/slic3r/GUI/GUI_App.cpp:629
+#: src/slic3r/GUI/GUI_App.cpp:1295
msgid "Select the language"
msgstr "Wählen Sie die Sprache aus"
-#: src/slic3r/GUI/Tab.cpp:57
+#: src/slic3r/GUI/Tab.cpp:108
msgid "Select the print profiles this profile is compatible with."
msgstr "Wählt die Druckprofile, die mit diesem Profil kompatibel sind."
-#: src/slic3r/GUI/Tab.cpp:51
+#: src/slic3r/GUI/Tab.cpp:102
msgid "Select the printers this profile is compatible with."
msgstr "Wählen Sie die Drucker aus, die mit diesem Profil kompatibel sind."
-#: src/slic3r/GUI/MainFrame.cpp:889
+#: src/slic3r/GUI/MainFrame.cpp:1590
msgid "Select the STL file to repair:"
msgstr "Geben Sie die STL-Datei an, die repariert werden soll:"
-#: src/slic3r/GUI/Preferences.cpp:237
+#: src/slic3r/GUI/Preferences.cpp:391
msgid "Select toolbar icon size in respect to the default one."
msgstr "Wählen Sie die Symbolgröße der Symbolleiste in Bezug auf die Standardgröße."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3553
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4016
msgid "Select type of part"
msgstr "Wählen Sie den Typ des Teils"
-#: src/slic3r/GUI/Plater.cpp:638
+#: src/slic3r/GUI/Plater.cpp:504
msgid "Select what kind of pad do you need"
msgstr "Wählen Sie aus, welche Art von Grundschicht Sie benötigen"
-#: src/slic3r/GUI/Plater.cpp:498
+#: src/slic3r/GUI/Plater.cpp:364
msgid "Select what kind of support do you need"
msgstr "Wählen Sie aus, welche Art von Unterstützung Sie benötigen"
-#: src/slic3r/GUI/DoubleSlider.cpp:1917
-msgid ""
-"Select YES if you want to delete all saved tool changes, \n"
-"NO if you want all tool changes switch to color changes, \n"
-"or CANCEL to leave it unchanged."
-msgstr ""
-"Wählen Sie JA, wenn Sie alle gespeicherten Werkzeugänderungen löschen möchten, \n"
-"NEIN, wenn Sie möchten, dass alle Werkzeugänderungen auf Farbwechsel umgestellt werden, \n"
-"oder ABBRECHEN, um sie unverändert zu lassen."
+#: src/slic3r/GUI/DoubleSlider.cpp:2135
+msgid "Select YES if you want to delete all saved tool changes, \nNO if you want all tool changes switch to color changes, \nor CANCEL to leave it unchanged."
+msgstr "Wählen Sie JA, wenn Sie alle gespeicherten Werkzeugänderungen löschen möchten, \nNEIN, wenn Sie möchten, dass alle Werkzeugänderungen auf Farbwechsel umgestellt werden, \noder ABBRECHEN, um sie unverändert zu lassen."
-#: src/slic3r/GUI/Selection.cpp:146
+#: src/slic3r/GUI/Selection.cpp:191
msgid "Selection-Add"
msgstr "Auswahl hinzufügen"
-#: src/slic3r/GUI/Selection.cpp:376
+#: src/slic3r/GUI/Selection.cpp:421
msgid "Selection-Add All"
msgstr "Auswahl Alles hinzufügen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3299
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3762
msgid "Selection-Add from list"
msgstr "Auswahl aus Liste hinzufügen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:6598
+#: src/slic3r/GUI/GLCanvas3D.cpp:7193
msgid "Selection-Add from rectangle"
msgstr "Auswahl über Rechteck hinzufügen"
-#: src/slic3r/GUI/Selection.cpp:256
+#: src/slic3r/GUI/Selection.cpp:301
msgid "Selection-Add Instance"
msgstr "Auswahl Kopie hinzufügen"
-#: src/slic3r/GUI/Selection.cpp:219
+#: src/slic3r/GUI/Selection.cpp:264
msgid "Selection-Add Object"
msgstr "Auswahl Objekt hinzufügen"
-#: src/slic3r/GUI/Selection.cpp:187
+#: src/slic3r/GUI/Selection.cpp:232
msgid "Selection-Remove"
msgstr "Auswahl entfernen"
-#: src/slic3r/GUI/Selection.cpp:402
+#: src/slic3r/GUI/Selection.cpp:447
msgid "Selection-Remove All"
msgstr "Auswahl Alles entfernen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3291
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3754
msgid "Selection-Remove from list"
msgstr "Auswahl aus Liste entfernen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:6617
+#: src/slic3r/GUI/GLCanvas3D.cpp:7212
msgid "Selection-Remove from rectangle"
msgstr "Auswahl über Rechteck entfernen"
-#: src/slic3r/GUI/Selection.cpp:275
+#: src/slic3r/GUI/Selection.cpp:320
msgid "Selection-Remove Instance"
msgstr "Auswahl Kopie entfernen"
-#: src/slic3r/GUI/Selection.cpp:238
+#: src/slic3r/GUI/Selection.cpp:283
msgid "Selection-Remove Object"
msgstr "Auswahl Objekt entfernen"
-#: src/slic3r/GUI/MainFrame.cpp:566
+#: src/slic3r/GUI/MainFrame.cpp:1172
msgid "Selects all objects"
msgstr "Alle Objekte auswählen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Plater.cpp:5522
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 src/slic3r/GUI/Plater.cpp:5707
msgid "Send G-code"
msgstr "Sende G-code"
@@ -6558,29 +7736,25 @@ msgstr "Sende G-code"
msgid "Send G-Code to printer host"
msgstr "Sende G-Code zum Druckerhost"
-#: src/slic3r/GUI/MainFrame.cpp:481
+#: src/slic3r/GUI/MainFrame.cpp:1072
msgid "Send to print current plate as G-code"
msgstr "Sende die aktuelle Plattenbelegung als G-Code zum Drucken"
-#: src/slic3r/GUI/Plater.cpp:878 src/slic3r/GUI/Plater.cpp:5522
+#: src/slic3r/GUI/Plater.cpp:753 src/slic3r/GUI/Plater.cpp:5707
msgid "Send to printer"
msgstr "Zum Drucker senden"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1305
+#: src/slic3r/GUI/GLCanvas3D.cpp:1312
msgid "Seq."
msgstr "Seq."
-#: src/slic3r/GUI/Tab.cpp:1231
+#: src/slic3r/GUI/Tab.cpp:1561
msgid "Sequential printing"
msgstr "Sequentielles Drucken"
-#: src/slic3r/GUI/Tab.cpp:1901 src/libslic3r/PrintConfig.cpp:1661
-msgid "Serial port"
-msgstr "Serieller Port"
-
-#: src/libslic3r/PrintConfig.cpp:1669
-msgid "Serial port speed"
-msgstr "Serielle Portgeschwindigkeit"
+#: src/slic3r/GUI/Preferences.cpp:230
+msgid "Sequential slider applied only to top layer"
+msgstr "Sequentieller Schieberegler wird nur auf die oberste Schicht angewendet"
#: src/slic3r/GUI/FirmwareDialog.cpp:807
msgid "Serial port:"
@@ -6590,17 +7764,16 @@ msgstr "Serieller Port:"
msgid "Service name"
msgstr "Name des Dienstes"
-#: src/slic3r/GUI/Tab.cpp:1802 src/slic3r/GUI/Tab.cpp:2046
-#: src/slic3r/GUI/Tab.cpp:3176
+#: src/slic3r/GUI/Tab.cpp:3509 src/slic3r/GUI/Tab.cpp:3588
msgid "Set"
msgstr "Setzen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1599
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1611
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1728
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1740
msgid "Set as a Separated Object"
msgstr "Als separates Objekt festlegen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1611
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1740
msgid "Set as a Separated Objects"
msgstr "Als separate Objekte festlegen"
@@ -6608,7 +7781,7 @@ msgstr "Als separate Objekte festlegen"
msgid "Set extruder change for every"
msgstr "Extruderwechsel bei jedem"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1671
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1800
msgid "Set extruder for selected items"
msgstr "Extruder für die gewählten Elemente wählen"
@@ -6616,7 +7789,7 @@ msgstr "Extruder für die gewählten Elemente wählen"
msgid "Set extruder sequence"
msgstr "Extrudersequenz einstellen"
-#: src/slic3r/GUI/DoubleSlider.cpp:1532
+#: src/slic3r/GUI/DoubleSlider.cpp:1728
msgid "Set extruder sequence for the entire print"
msgstr "Extrudersequenz für den gesamten Druck einstellen"
@@ -6624,84 +7797,100 @@ msgstr "Extrudersequenz für den gesamten Druck einstellen"
msgid "Set extruder(tool) sequence"
msgstr "Extruder(werkzeug)sequenz einstellen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:243
+msgid "Set left thumb as active"
+msgstr "Linken Schieber aktiv setzen"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
+msgid "Set lower thumb as active"
+msgstr "Unteren Schieber aktiv setzen"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
msgid "Set lower thumb to current slider thumb"
msgstr "Stelle den unteren Regler auf den aktuellen Schieberegler"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:297
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:305
msgid "Set Mirror"
msgstr "Spiegel setzen"
-#: src/slic3r/GUI/Plater.cpp:3944
+#: src/slic3r/GUI/Plater.cpp:3862
msgid "Set number of instances"
msgstr "Setze Anzahl der Kopien"
-#: src/slic3r/GUI/Plater.cpp:4756
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:4860
+#, possible-c-format
msgid "Set numbers of copies to %d"
msgstr "Setze Anzahl der Kopien auf %d"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:781
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:828
msgid "Set Orientation"
msgstr "Orientierung setzen"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:750
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:797
msgid "Set Position"
msgstr "Position setzen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4581 src/slic3r/GUI/Selection.cpp:1513
msgid "Set Printable"
msgstr "Setze Druckbar"
-#: src/slic3r/GUI/Selection.cpp:1475
+#: src/slic3r/GUI/Selection.cpp:1515
msgid "Set Printable Instance"
msgstr "Setze druckbare Kopie"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:846
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:244
+msgid "Set right thumb as active"
+msgstr "Rechten Schieber aktiv setzen"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1836
+msgid "Set ruler mode"
+msgstr "Lineal-Modus einstellen"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:893
msgid "Set Scale"
msgstr "Setze Skalierung"
-#: src/libslic3r/PrintConfig.cpp:2393
+#: src/libslic3r/PrintConfig.cpp:2536
msgid "Set the actual LCD display orientation inside the SLA printer. Portrait mode will flip the meaning of display width and height parameters and the output images will be rotated by 90 degrees."
msgstr "Setzt die aktuelle Ausrichtung der LCD-Anzeige im SLA-Drucker. Der Hochformatmodus kehrt die Bedeutung der Anzeigeparameter Breite und Höhe um und die Ausgabebilder werden um 90 Grad gedreht."
-#: src/slic3r/GUI/ConfigWizard.cpp:932
+#: src/slic3r/GUI/ConfigWizard.cpp:1298
msgid "Set the shape of your printer's bed."
msgstr "Stellen Sie die Konturen Ihres Druckerbettes ein."
-#: src/libslic3r/PrintConfig.cpp:556
+#: src/libslic3r/PrintConfig.cpp:592
msgid "Set this to a non-zero value to allow a manual extrusion width. If left to zero, Slic3r derives extrusion widths from the nozzle diameter (see the tooltips for perimeter extrusion width, infill extrusion width etc). If expressed as percentage (for example: 230%), it will be computed over layer height."
msgstr "Setzen Sie dies auf einen Nicht-Nullwert, um eine manuelle Extrusionsbreite zuzulassen. Falls auf null belassen, wird PrusaSlicer die Extrusionsbreiten vom Durchmesser der Druckdüse ableiten (siehe die Hilfstexte für die Extrusionsbreite für Außenkonturen, Infill usw.). Falls als Prozentwert (z.B. 230%) angegeben, wird dieser ausgehend von der Schichthöhe berechnet."
-#: src/libslic3r/PrintConfig.cpp:448
+#: src/libslic3r/PrintConfig.cpp:484
msgid "Set this to a non-zero value to set a manual extrusion width for external perimeters. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 200%), it will be computed over layer height."
msgstr "Setzen Sie dies auf einen Nicht-Nullwert, um eine manuelle Extrusionsbreite für externe Außenkonturen anzugeben. Falls auf null belassen, wird die Standard-Extrusionsbreite verwendet (falls angeben), ansonsten wird der Durchmesser der Druckdüse x 1,125 verwendet. Falls als Prozentwert (z.B. 200%) angegeben, wird dieser ausgehend von der Schichthöhe berechnet."
-#: src/libslic3r/PrintConfig.cpp:878
+#: src/libslic3r/PrintConfig.cpp:920
msgid "Set this to a non-zero value to set a manual extrusion width for first layer. You can use this to force fatter extrudates for better adhesion. If expressed as percentage (for example 120%) it will be computed over first layer height. If set to zero, it will use the default extrusion width."
msgstr "Setzen Sie dies auf einen Nicht-Nullwert, um eine manuelle Extrusionsbreite für die erste Druckschicht anzugeben. Sie können damit eine stärkere Extrusion für bessere Haftung erzwingen. Falls auf null belassen, wird die Standard-Extrusionsbreite verwendet. Falls als Prozentwert (z.B. 120%) angegeben, wird dieser ausgehend von der Schichthöhe berechnet."
-#: src/libslic3r/PrintConfig.cpp:1758
+#: src/libslic3r/PrintConfig.cpp:1873
msgid "Set this to a non-zero value to set a manual extrusion width for infill for solid surfaces. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 90%) it will be computed over layer height."
msgstr "Setzen Sie dies auf einen Nicht-Nullwert, um eine manuelle Extrusionsbreite für den Infill bei massiven Flächen anzugeben. Falls auf null belassen, wird die Standard-Extrusionsbreite verwendet (falls angeben), ansonsten wird der Durchmesser der Druckdüse x 1,125 verwendet. Falls als Prozentwert (z.B. 90%) angegeben, wird dieser ausgehend von der Schichthöhe berechnet."
-#: src/libslic3r/PrintConfig.cpp:2107
+#: src/libslic3r/PrintConfig.cpp:2250
msgid "Set this to a non-zero value to set a manual extrusion width for infill for top surfaces. You may want to use thinner extrudates to fill all narrow regions and get a smoother finish. If left zero, default extrusion width will be used if set, otherwise nozzle diameter will be used. If expressed as percentage (for example 90%) it will be computed over layer height."
msgstr "Setzen Sie dies auf einen Nicht-Nullwert, um eine manuelle Extrusionsbreite für die oberen Außenflächen anzugeben. Dünnere Extrusionsbreiten sind vorteilhaft, um Engstellen auszufüllen und um eine schönere Oberfläche zu erhalten. Falls auf null belassen, wird die Standard-Extrusionsbreite verwendet (falls angeben), ansonsten wird der Durchmesser der Druckdüse verwendet. Falls als Prozentwert (z.B. 90%) angegeben, wird dieser ausgehend von der Schichthöhe berechnet."
-#: src/libslic3r/PrintConfig.cpp:1011
+#: src/libslic3r/PrintConfig.cpp:1055
msgid "Set this to a non-zero value to set a manual extrusion width for infill. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. You may want to use fatter extrudates to speed up the infill and make your parts stronger. If expressed as percentage (for example 90%) it will be computed over layer height."
msgstr "Setzen Sie dies auf einen Nicht-Nullwert, um eine manuelle Extrusionsbreite für den Infill anzugeben. Falls auf null belassen, wird die Standard-Extrusionsbreite verwendet (falls angeben), ansonsten wird der Durchmesser der Druckdüse x 1,125 verwendet. Stärke Extrusionsbreiten sind vorteilhaft, um den Infill zu beschleunigen und um die Teile stärker zu machen. Falls als Prozentwert (z.B. 90%) angegeben, wird dieser ausgehend von der Schichthöhe berechnet."
-#: src/libslic3r/PrintConfig.cpp:1419
+#: src/libslic3r/PrintConfig.cpp:1527
msgid "Set this to a non-zero value to set a manual extrusion width for perimeters. You may want to use thinner extrudates to get more accurate surfaces. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 200%) it will be computed over layer height."
msgstr "Setzen Sie dies auf einen Nicht-Nullwert, um eine manuelle Extrusionsbreite für Außenkonturen anzugeben. Dünnere Extrusionsbreiten sind vorteilhaft, um genauere Oberflächen zu erhalten. Falls auf null belassen, wird die Standard-Extrusionsbreite verwendet (falls angeben), ansonsten wird der Durchmesser der Druckdüse x 1,125 verwendet. Falls als Prozentwert (z.B. 200%) angegeben, wird dieser ausgehend von der Schichthöhe berechnet."
-#: src/libslic3r/PrintConfig.cpp:1948
+#: src/libslic3r/PrintConfig.cpp:2090
msgid "Set this to a non-zero value to set a manual extrusion width for support material. If left zero, default extrusion width will be used if set, otherwise nozzle diameter will be used. If expressed as percentage (for example 90%) it will be computed over layer height."
-msgstr "Setzen Sie dies auf einen Nicht-Nullwert, um eine manuelle Extrusionsbreite für die Stützstrukturen anzugeben. Falls auf null belassen, wird die Standard-Extrusionsbreite verwendet (falls angeben), ansonsten wird der Durchmesser der Druckdüse verwendet. Als Prozentwert (z.B. 90%) angegeben, wird dieser ausgehend von der Schichthöhe berechnet."
+msgstr "Setzen Sie dies auf einen Nicht-Nullwert, um eine manuelle Extrusionsbreite für das Stützmaterial anzugeben. Falls auf null belassen, wird die Standard-Extrusionsbreite verwendet (falls angeben), ansonsten wird der Durchmesser der Druckdüse verwendet. Als Prozentwert (z.B. 90%) angegeben, wird dieser ausgehend von der Schichthöhe berechnet."
-#: src/libslic3r/PrintConfig.cpp:512
+#: src/libslic3r/PrintConfig.cpp:548
msgid "Set this to the clearance radius around your extruder. If the extruder is not centered, choose the largest value for safety. This setting is used to check for collisions and to display the graphical preview in the plater."
msgstr "Stellen Sie dies auf den Freiraumradius um Ihren Extruder ein. Wenn der Extruder nicht zentriert ist, wählen Sie zur Sicherheit den größten Wert. Diese Einstellung wird verwendet, um Kollisionen zu prüfen und die grafische Vorschau auf der Druckplatte anzuzeigen."
@@ -6709,87 +7898,98 @@ msgstr "Stellen Sie dies auf den Freiraumradius um Ihren Extruder ein. Wenn der
msgid "Set this to the maximum height that can be reached by your extruder while printing."
msgstr "Stellen Sie hier die maximale Höhe ein, die Ihr Extruder beim Drucken erreichen kann."
-#: src/libslic3r/PrintConfig.cpp:501
+#: src/libslic3r/PrintConfig.cpp:537
msgid "Set this to the vertical distance between your nozzle tip and (usually) the X carriage rods. In other words, this is the height of the clearance cylinder around your extruder, and it represents the maximum depth the extruder can peek before colliding with other printed objects."
msgstr "Stellen Sie dies auf den vertikalen Abstand zwischen Ihrer Düsenspitze und (in der Regel) den X-Wagenstangen ein. Mit anderen Worten, das ist die Höhe des Abstandszylinders um Ihren Extruder herum und stellt die maximale Tiefe dar, die der Extruder vor der Kollision mit anderen Druckobjekten sehen kann."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4581 src/slic3r/GUI/Selection.cpp:1513
msgid "Set Unprintable"
msgstr "Setze Undruckbar"
-#: src/slic3r/GUI/Selection.cpp:1475
+#: src/slic3r/GUI/Selection.cpp:1515
msgid "Set Unprintable Instance"
msgstr "Setze undruckbare Kopie"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:221
+msgid "Set upper thumb as active"
+msgstr "Oberen Schieber aktiv setzen"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
msgid "Set upper thumb to current slider thumb"
msgstr "Stelle den oberen Regler auf den aktuellen Schieberegler"
-#: src/libslic3r/PrintConfig.cpp:3509
-msgid ""
-"Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:trace\n"
-"For example. loglevel=2 logs fatal, error and warning level messages."
-msgstr ""
-"Stellt die Empfindlichkeit der Protokollierung ein. 0:fatal, 1:Fehler, 2:Warnung, 3:Info, 4:Debug, 5: Trace.\n"
-"Zum Beispiel. loglevel=2 protokolliert fatale, Fehler- und Warnstufenmeldungen."
+#: src/libslic3r/PrintConfig.cpp:3714
+msgid "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:trace\nFor example. loglevel=2 logs fatal, error and warning level messages."
+msgstr "Stellt die Empfindlichkeit der Protokollierung ein. 0:fatal, 1:Fehler, 2:Warnung, 3:Info, 4:Debug, 5: Trace.\nZum Beispiel. loglevel=2 protokolliert fatale, Fehler- und Warnstufenmeldungen."
-#: src/slic3r/GUI/BedShapeDialog.cpp:155
+#: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/MainFrame.cpp:1969
msgid "Settings"
msgstr "Einstellungen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2507
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2899
msgid "Settings for height range"
msgstr "Einstellungen für Höhenbereich"
-#: src/slic3r/GUI/ConfigManipulation.cpp:162
+#: src/slic3r/GUI/Preferences.cpp:431
+msgid "Settings in non-modal window"
+msgstr "Einstellungen im nicht-modalen Fenster"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:161
msgid "Shall I adjust those settings for supports?"
msgstr "Soll ich diese Einstellungen für Stützen anpassen?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:89
+#: src/slic3r/GUI/ConfigManipulation.cpp:88
msgid "Shall I adjust those settings in order to enable Spiral Vase?"
msgstr "Soll ich diese Einstellungen anpassen, um die Spiralvase zu aktivieren?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:119
+#: src/slic3r/GUI/ConfigManipulation.cpp:118
msgid "Shall I adjust those settings in order to enable the Wipe Tower?"
msgstr "Soll ich diese Einstellungen anpassen, um den Reinigungsturm zu aktivieren?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:210
+#: src/slic3r/GUI/ConfigManipulation.cpp:209
msgid "Shall I switch to rectilinear fill pattern?"
msgstr "Soll ich auf geradliniges Füllmuster wechseln?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:139
+#: src/slic3r/GUI/ConfigManipulation.cpp:138
msgid "Shall I synchronize support layers in order to enable the Wipe Tower?"
msgstr "Soll ich die Stützschichten synchronisieren, um den Reinigungsturm zu aktivieren?"
-#: src/slic3r/GUI/BedShapeDialog.cpp:66 src/slic3r/GUI/GUI_ObjectList.cpp:2059
+#: src/slic3r/GUI/BedShapeDialog.cpp:156 src/slic3r/GUI/BedShapeDialog.cpp:222
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2215
msgid "Shape"
msgstr "Form"
-#: src/slic3r/GUI/GUI_Preview.cpp:256
+#: src/slic3r/GUI/GUI_Preview.cpp:338 src/slic3r/GUI/GUI_Preview.cpp:1478
msgid "Shells"
msgstr "Konturhüllen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:249
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33
+msgid "Shift + Left mouse button"
+msgstr "Gross + Linke Maustaste"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:241
msgid "Shift + Left mouse button:"
msgstr "Gross + Linke Maustaste:"
-#: src/slic3r/GUI/GLCanvas3D.cpp:255
+#: src/slic3r/GUI/GLCanvas3D.cpp:245
msgid "Shift + Right mouse button:"
msgstr "Gross + Rechte Maustaste:"
-#: src/slic3r/GUI/GUI_Preview.cpp:231
+#: src/slic3r/GUI/GUI_Preview.cpp:286 src/slic3r/GUI/GUI_Preview.cpp:288
msgid "Show"
msgstr "Anzeigen"
-#: src/slic3r/GUI/MainFrame.cpp:701
+#: src/slic3r/GUI/MainFrame.cpp:926 src/slic3r/GUI/MainFrame.cpp:1325
msgid "Show &Configuration Folder"
msgstr "Zeige &Konfigurationsordner"
-#: src/slic3r/GUI/MainFrame.cpp:676
+#: src/slic3r/GUI/MainFrame.cpp:1294
msgid "Show &labels"
msgstr "Anzeigen &Beschriftungen"
-#: src/slic3r/GUI/MainFrame.cpp:705
+#: src/slic3r/GUI/MainFrame.cpp:933 src/slic3r/GUI/MainFrame.cpp:937
+#: src/slic3r/GUI/MainFrame.cpp:1329
msgid "Show about dialog"
msgstr "\"Ãœber\"-Dialog anzeigen"
@@ -6797,549 +7997,619 @@ msgstr "\"Ãœber\"-Dialog anzeigen"
msgid "Show advanced settings"
msgstr "Ausführliche Einstellungen anzeigen"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:159
+#: src/slic3r/GUI/Preferences.cpp:120
+msgid "Show drop project dialog"
+msgstr "Projekt-Drop-Dialog anzeigen"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:157
msgid "Show error message"
msgstr "Fehlermeldungen anzeigen"
-#: src/slic3r/GUI/Preferences.cpp:95
+#: src/slic3r/GUI/DoubleSlider.cpp:1832
+msgid "Show estimated print time"
+msgstr "Geschätzte Druckzeit anzeigen"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1832
+msgid "Show estimated print time on the ruler"
+msgstr "Geschätzte Druckzeit auf dem Lineal anzeigen"
+
+#: src/slic3r/GUI/Preferences.cpp:112
msgid "Show incompatible print and filament presets"
msgstr "Inkompatible Druck- und Filamenteinstellungen anzeigen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:151
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:145
msgid "Show keyboard shortcuts list"
msgstr "Liste der Tastaturkürzel anzeigen"
-#: src/slic3r/GUI/MainFrame.cpp:676
+#: src/slic3r/GUI/GCodeViewer.cpp:2591
+msgid "Show normal mode"
+msgstr "Normalen Modus zeigen"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1828
+msgid "Show object height"
+msgstr "Objekthöhe anzeigen"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1828
+msgid "Show object height on the ruler"
+msgstr "Objekthöhe auf dem Lineal anzeigen"
+
+#: src/slic3r/GUI/MainFrame.cpp:1294
msgid "Show object/instance labels in 3D scene"
msgstr "Objekt-/Kopiebeschriftungen in der 3D-Szene anzeigen"
+#: src/slic3r/GUI/Preferences.cpp:213
+msgid "Show sidebar collapse/expand button"
+msgstr "Schaltfläche zum Zu-/Ausklappen der Seitenleiste zeigen"
+
#: src/slic3r/GUI/WipeTowerDialog.cpp:377
msgid "Show simplified settings"
msgstr "Vereinfachte Einstellungen anzeigen"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:52
+#: src/slic3r/GUI/Preferences.cpp:169 src/slic3r/GUI/Preferences.cpp:171
+msgid "Show splash screen"
+msgstr "Startbildschirm anzeigen"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2586
+msgid "Show stealth mode"
+msgstr "Stealth Modus anzeigen"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51
msgid "Show supports"
msgstr "Stützen anzeigen"
-#: src/slic3r/GUI/MainFrame.cpp:699
+#: src/slic3r/GUI/MainFrame.cpp:924 src/slic3r/GUI/MainFrame.cpp:1323
msgid "Show system information"
msgstr "Systeminformationen anzeigen"
-#: src/slic3r/GUI/MainFrame.cpp:626
+#: src/slic3r/GUI/MainFrame.cpp:1234
msgid "Show the 3D editing view"
msgstr "Anzeigen des 3D Editiermodus"
-#: src/slic3r/GUI/MainFrame.cpp:629
+#: src/slic3r/GUI/MainFrame.cpp:1237
msgid "Show the 3D slices preview"
msgstr "Vorschau der 3D-Schnitte anzeigen"
-#: src/slic3r/GUI/MainFrame.cpp:617
+#: src/slic3r/GUI/MainFrame.cpp:1224
msgid "Show the filament settings"
msgstr "Filamenteinstellungen anzeigen"
-#: src/libslic3r/PrintConfig.cpp:3372
+#: src/libslic3r/PrintConfig.cpp:3571
msgid "Show the full list of print/G-code configuration options."
msgstr "Zeigt die vollständige Liste der Konfigurationsmöglichkeiten für Druck/GCode an."
-#: src/libslic3r/PrintConfig.cpp:3377
+#: src/libslic3r/PrintConfig.cpp:3576
msgid "Show the full list of SLA print configuration options."
msgstr "Zeigt die vollständige Liste der Konfigurationsmöglichkeiten für SLA Druck an."
-#: src/slic3r/GUI/MainFrame.cpp:708
+#: src/slic3r/GUI/MainFrame.cpp:941 src/slic3r/GUI/MainFrame.cpp:1332
msgid "Show the list of the keyboard shortcuts"
msgstr "Liste der Tastaturkürzel anzeigen"
-#: src/slic3r/GUI/MainFrame.cpp:606
+#: src/slic3r/GUI/MainFrame.cpp:1216
msgid "Show the plater"
msgstr "Druckplatte anzeigen"
-#: src/slic3r/GUI/MainFrame.cpp:614
+#: src/slic3r/GUI/MainFrame.cpp:1221
msgid "Show the print settings"
msgstr "Druckeinstellungen anzeigen"
-#: src/slic3r/GUI/MainFrame.cpp:621
+#: src/slic3r/GUI/MainFrame.cpp:1228
msgid "Show the printer settings"
msgstr "Druckereinstellungen anzeigen"
-#: src/libslic3r/PrintConfig.cpp:3366
+#: src/libslic3r/PrintConfig.cpp:3565
msgid "Show this help."
msgstr "Diese Hilfe zeigen."
-#: src/slic3r/GUI/MainFrame.cpp:701
+#: src/slic3r/GUI/MainFrame.cpp:926 src/slic3r/GUI/MainFrame.cpp:1325
msgid "Show user configuration folder (datadir)"
msgstr "Zeige Benutzerkonfigurationsordner (datadir)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:185
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:182
msgid "Show/Hide 3Dconnexion devices settings dialog"
msgstr "Einstellungsdialog für 3Dconnexion-Geräte ein-/ausblenden"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
-msgid "Show/Hide Legend"
-msgstr "Zeige/Verberge Legende"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
+msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled"
+msgstr "Dialogfeld Einstellungen für 3Dconnexion-Geräte anzeigen/verbergen, falls aktiviert"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:146
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+msgid "Show/Hide Legend & Estimated printing time"
+msgstr "Legende & geschätzte Druckzeit anzeigen/verbergen"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+msgid "Show/Hide Legend and Estimated printing time"
+msgstr "Legende und geschätzte Druckzeit anzeigen/verbergen"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:141
msgid "Show/Hide object/instance labels"
msgstr "Objekt-/Kopiebeschriftungen ein-/ausblenden"
-#: src/slic3r/GUI/GUI_App.cpp:813 src/slic3r/GUI/wxExtensions.cpp:753
+#: src/slic3r/GUI/GUI_App.cpp:1504 src/slic3r/GUI/wxExtensions.cpp:673
msgid "Simple"
msgstr "Einfach"
-#: src/slic3r/GUI/ConfigWizard.cpp:820
+#: src/slic3r/GUI/ConfigWizard.cpp:1179
msgid "Simple mode"
msgstr "Einfacher Modus"
-#: src/slic3r/GUI/GUI_App.cpp:813
+#: src/slic3r/GUI/GUI_App.cpp:1504
msgid "Simple View Mode"
msgstr "EInfacher Anzeigemodus"
-#: src/slic3r/GUI/Tab.cpp:2298 src/slic3r/GUI/Tab.cpp:2306
+#: src/slic3r/GUI/Tab.cpp:2467 src/slic3r/GUI/Tab.cpp:2475
msgid "Single extruder MM setup"
msgstr "Einzelextruder MM Setup"
-#: src/libslic3r/PrintConfig.cpp:1845
+#: src/libslic3r/PrintConfig.cpp:1987
msgid "Single Extruder Multi Material"
msgstr "Einzelextruder mit Multi-Material"
-#: src/slic3r/GUI/Tab.cpp:1867
-msgid ""
-"Single Extruder Multi Material is selected, \n"
-"and all extruders must have the same diameter.\n"
-"Do you want to change the diameter for all extruders to first extruder nozzle diameter value?"
-msgstr ""
-"Einzel-Extruder Multi-Material ist ausgewählt, \n"
-"und alle Extruder müssen den gleichen Durchmesser haben.\n"
-"Möchten Sie den Durchmesser für alle Extruder auf den Wert des ersten Extruderdüsendurchmessers ändern?"
+#: src/slic3r/GUI/Tab.cpp:2101
+msgid "Single Extruder Multi Material is selected, \nand all extruders must have the same diameter.\nDo you want to change the diameter for all extruders to first extruder nozzle diameter value?"
+msgstr "Einzel-Extruder Multi-Material ist ausgewählt, \nund alle Extruder müssen den gleichen Durchmesser haben.\nMöchten Sie den Durchmesser für alle Extruder auf den Wert des ersten Extruderdüsendurchmessers ändern?"
-#: src/slic3r/GUI/Tab.cpp:2307
+#: src/slic3r/GUI/Tab.cpp:2476
msgid "Single extruder multimaterial parameters"
msgstr "Einzelextruder Multimaterial Parameter"
-#: src/slic3r/GUI/BedShapeDialog.cpp:77
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:232 src/slic3r/GUI/Plater.cpp:160
-#: src/slic3r/GUI/Tab.cpp:2324
+#: src/slic3r/GUI/Preferences.cpp:120 src/libslic3r/PrintConfig.cpp:3689
+msgid "Single instance mode"
+msgstr "Einzelinstanz-Modus"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:93
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:240 src/slic3r/GUI/Plater.cpp:166
+#: src/slic3r/GUI/Tab.cpp:2493
msgid "Size"
msgstr "Größe"
-#: src/slic3r/GUI/Tab.cpp:1797 src/slic3r/GUI/Tab.cpp:2041
+#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:2241
msgid "Size and coordinates"
msgstr "Größe und Koordinaten"
-#: src/slic3r/GUI/BedShapeDialog.cpp:78
+#: src/slic3r/GUI/BedShapeDialog.cpp:110
msgid "Size in X and Y of the rectangular plate."
msgstr "Größe der rechteckigen Platte in X und Y."
-#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1111
-#: src/libslic3r/ExtrusionEntity.cpp:318
+#: src/slic3r/GUI/GUI_Preview.cpp:310 src/slic3r/GUI/Tab.cpp:1439
+#: src/libslic3r/ExtrusionEntity.cpp:323 src/libslic3r/ExtrusionEntity.cpp:354
msgid "Skirt"
msgstr "Schürze"
-#: src/slic3r/GUI/Tab.cpp:1110
+#: src/slic3r/GUI/Tab.cpp:1438
msgid "Skirt and brim"
msgstr "Schürze und Rand"
-#: src/libslic3r/PrintConfig.cpp:1687
+#: src/libslic3r/PrintConfig.cpp:1795
msgid "Skirt height"
msgstr "Schürzenhöhe"
-#: src/libslic3r/PrintConfig.cpp:1696
+#: src/libslic3r/PrintConfig.cpp:1811
msgid "Skirt Loops"
msgstr "Schleifen für die Schürze"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1334
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1181
msgid "SLA gizmo keyboard shortcuts"
msgstr "SLA Gizmo Tastaturkürzel"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1058
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:924
msgid "SLA gizmo turned off"
msgstr "SLA Gizmo ausgeschaltet"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1017
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897
msgid "SLA gizmo turned on"
msgstr "SLA Gizmo eingeschaltet"
-#: src/slic3r/GUI/Plater.cpp:818 src/slic3r/GUI/Preset.cpp:1524
+#: src/slic3r/GUI/Plater.cpp:693 src/libslic3r/Preset.cpp:1303
msgid "SLA material"
msgstr "SLA Material"
-#: src/slic3r/GUI/ConfigWizard.cpp:2015
+#: src/slic3r/GUI/ConfigWizard.cpp:2526
msgid "SLA Material Profiles Selection"
msgstr "SLA Material Profile Auswahl"
-#: src/libslic3r/PrintConfig.cpp:2470 src/libslic3r/PrintConfig.cpp:2471
+#: src/libslic3r/PrintConfig.cpp:2613 src/libslic3r/PrintConfig.cpp:2614
msgid "SLA material type"
msgstr "SLA Materialtyp"
-#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2015
+#: src/slic3r/GUI/ConfigWizard.cpp:1872 src/slic3r/GUI/ConfigWizard.cpp:2526
msgid "SLA Materials"
msgstr "SLA Materialien"
-#: src/slic3r/GUI/Preset.cpp:1523
+#: src/libslic3r/Preset.cpp:1302
msgid "SLA print"
msgstr "SLA Druck"
-#: src/libslic3r/PrintConfig.cpp:2578
+#: src/libslic3r/PrintConfig.cpp:2721
msgid "SLA print material notes"
msgstr "SLA Druckmaterial-Anmerkungen"
-#: src/slic3r/GUI/Plater.cpp:817
+#: src/slic3r/GUI/Plater.cpp:692
msgid "SLA print settings"
msgstr "SLA Druckeinstellungen"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:996
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869
msgid "SLA Support Points"
msgstr "SLA Stützpunkte"
-#: src/slic3r/GUI/GLCanvas3D.cpp:687
-msgid "SLA supports outside the print area were detected"
-msgstr "SLA Stützstrukturen außerhalb des Druckraums entdeckt"
+#: src/slic3r/GUI/GLCanvas3D.cpp:635
+msgid "SLA supports outside the print area were detected."
+msgstr "SLA-Stützen außerhalb des Druckbereichs wurden erkannt."
-#: src/slic3r/GUI/ConfigWizard.cpp:1530
+#: src/slic3r/GUI/ConfigWizard.cpp:1931
msgid "SLA Technology Printers"
msgstr "SLA Technologie Drucker"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1432
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
msgid "Slab"
msgstr "Slab"
-#: src/libslic3r/PrintConfig.cpp:1333
+#: src/libslic3r/PrintConfig.cpp:1441
msgid "Slic3r can upload G-code files to a printer host. This field must contain the kind of the host."
msgstr "PrusaSlicer kann G-Code Dateien auf einen Drucker-Host hochladen. Dieses Feld sollte den Typ des Hosts enthalten."
-#: src/libslic3r/PrintConfig.cpp:105
+#: src/libslic3r/PrintConfig.cpp:107
msgid "Slic3r can upload G-code files to a printer host. This field should contain the API Key or the password required for authentication."
msgstr "PrusaSlicer kann G-Code Dateien zu einem Druckerhost hochladen. Dieses Feld sollte den API-Schlüssel oder das Kennwort enthalten, die für die Authentifizierung erforderlich sind."
-#: src/libslic3r/PrintConfig.cpp:98
-msgid "Slic3r can upload G-code files to a printer host. This field should contain the hostname, IP address or URL of the printer host instance."
-msgstr "PrusaSlicer kann G-Code Dateien auf einen Drucker-Host hochladen. Dieses Feld sollte den Hostnamen, die IP-Adresse oder die URL der Drucker-Hostinstanz enthalten."
+#: src/libslic3r/PrintConfig.cpp:100
+msgid "Slic3r can upload G-code files to a printer host. This field should contain the hostname, IP address or URL of the printer host instance. Print host behind HAProxy with basic auth enabled can be accessed by putting the user name and password into the URL in the following format: https://username:password@your-octopi-address/"
+msgstr "PrusaSlicer kann G-Code-Dateien auf einen Drucker-Host hochladen. Dieses Feld sollte den Hostnamen, die IP-Adresse oder die URL der Drucker-Host-Instanz enthalten. Auf einen Drucker-Host hinter HAProxy mit aktivierter Basisauthentifizierung kann zugegriffen werden, indem der Benutzername und das Passwort im folgenden Format in die URL eingegeben werden: https://username:password@Ihre-octopi-addresse/"
-#: src/libslic3r/PrintConfig.cpp:1299
+#: src/libslic3r/PrintConfig.cpp:1407
msgid "Slic3r will not scale speed down below this speed."
msgstr "PrusaSlicer wird die Geschwindigkeit nicht unterhalb dieser Geschwindigkeit skalieren."
-#: src/libslic3r/PrintConfig.cpp:3359
+#: src/libslic3r/PrintConfig.cpp:3558
msgid "Slice"
msgstr "Slice"
-#: src/slic3r/GUI/MainFrame.cpp:512
+#: src/slic3r/GUI/MainFrame.cpp:1113
msgid "Slice a file into a G-code"
msgstr "Datei zu G-Code slicen"
-#: src/slic3r/GUI/MainFrame.cpp:518
+#: src/slic3r/GUI/MainFrame.cpp:1119
msgid "Slice a file into a G-code, save as"
msgstr "Datei zu G-Code slicen, speichern als"
-#: src/libslic3r/PrintConfig.cpp:87
+#: src/libslic3r/PrintConfig.cpp:89
msgid "Slice gap closing radius"
msgstr "Slice Lückenschlussradius"
-#: src/slic3r/GUI/Plater.cpp:892 src/slic3r/GUI/Plater.cpp:3121
-#: src/slic3r/GUI/Plater.cpp:5110
+#: src/slic3r/GUI/Plater.cpp:767 src/slic3r/GUI/Plater.cpp:2921
+#: src/slic3r/GUI/Plater.cpp:5237
msgid "Slice now"
msgstr "Jetzt slicen"
-#: src/libslic3r/PrintConfig.cpp:3333
+#: src/libslic3r/PrintConfig.cpp:3526
msgid "Slice the model and export SLA printing layers as PNG."
msgstr "Slice das Modell und Export von SLA-Druckschichten als PNG."
-#: src/libslic3r/PrintConfig.cpp:3354
+#: src/libslic3r/PrintConfig.cpp:3547
msgid "Slice the model and export toolpaths as G-code."
msgstr "Modell slicen und Werkzeugwege als G-Code exportieren."
-#: src/libslic3r/PrintConfig.cpp:3360
+#: src/libslic3r/PrintConfig.cpp:3559
msgid "Slice the model as FFF or SLA based on the printer_technology configuration value."
msgstr "Slice das Modell als FFF oder SLA basierend auf dem Konfigurationswert von printer_technology."
-#: src/slic3r/GUI/Plater.cpp:216
+#: src/slic3r/GUI/Plater.cpp:222
msgid "Sliced Info"
msgstr "Slice-Info"
-#: src/slic3r/GUI/MainFrame.cpp:847 src/slic3r/GUI/Plater.cpp:3121
-#: src/slic3r/GUI/Plater.cpp:5107 src/slic3r/GUI/Tab.cpp:1221
-#: src/slic3r/GUI/Tab.cpp:3662
+#: src/slic3r/GUI/MainFrame.cpp:1548 src/slic3r/GUI/Plater.cpp:2921
+#: src/slic3r/GUI/Plater.cpp:5234 src/slic3r/GUI/Tab.cpp:1551
+#: src/slic3r/GUI/Tab.cpp:4081
msgid "Slicing"
msgstr "Slice"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:134
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:184
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:170
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:219
msgid "Slicing complete"
msgstr "Slicing abgeschlossen"
-#: src/libslic3r/SLAPrint.cpp:760
+#: src/libslic3r/SLAPrint.cpp:780
msgid "Slicing done"
msgstr "Slicing abgeschlossen"
-#: src/slic3r/GUI/MainFrame.cpp:874
+#: src/slic3r/GUI/MainFrame.cpp:1575
msgid "Slicing Done!"
msgstr "Slicing abgeschlossen!"
-#: src/libslic3r/SLAPrintSteps.cpp:245
+#: src/slic3r/GUI/NotificationManager.cpp:751
+msgid "Slicing finished."
+msgstr "Slicing abgeschlossen."
+
+#: src/libslic3r/SLAPrintSteps.cpp:247
msgid "Slicing had to be stopped due to an internal error: Inconsistent slice index."
msgstr "Das Slicen wurde wegen eines internen Fehlers gestoppt: Defekter Sliceindex."
-#: src/libslic3r/SLAPrintSteps.cpp:45
+#: src/libslic3r/SLAPrintSteps.cpp:46
msgid "Slicing model"
msgstr "Slice das Modell"
-#: src/libslic3r/SLAPrintSteps.cpp:49
+#: src/libslic3r/SLAPrintSteps.cpp:50
msgid "Slicing supports"
-msgstr "Slice Stützstrukturen"
+msgstr "Slice Stützen"
-#: src/libslic3r/PrintConfig.cpp:2414
+#: src/libslic3r/PrintConfig.cpp:2557
msgid "Slow"
msgstr "Langsam"
-#: src/libslic3r/PrintConfig.cpp:1705
+#: src/libslic3r/PrintConfig.cpp:1820
msgid "Slow down if layer print time is below"
msgstr "Langsamer drucken wenn die Schichtdruckzeit geringer ist als"
-#: src/libslic3r/PrintConfig.cpp:2415
+#: src/libslic3r/PrintConfig.cpp:2558
msgid "Slow tilt"
msgstr "Langsames Kippen"
-#: src/libslic3r/PrintConfig.cpp:1715
+#: src/libslic3r/PrintConfig.cpp:1830
msgid "Small perimeters"
msgstr "Dünne Außenkonturen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:288
+#: src/libslic3r/PrintConfig.cpp:2801
+msgid "Small pillar diameter percent"
+msgstr "Kleiner Pfeilerdurchmesser in Prozent"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:274
msgid "Smooth"
msgstr "Glätten"
-#: src/slic3r/GUI/GLCanvas3D.cpp:258
+#: src/slic3r/GUI/GLCanvas3D.cpp:247
msgid "Smoothing"
msgstr "Glätten"
-#: src/slic3r/GUI/GUI_App.cpp:839
+#: src/slic3r/GUI/GUI_App.cpp:1540
msgid "Snapshot name"
msgstr "Name der Momentaufnahme"
-#: src/slic3r/GUI/MainFrame.cpp:686
+#: src/slic3r/GUI/MainFrame.cpp:911 src/slic3r/GUI/MainFrame.cpp:1310
msgid "Software &Releases"
msgstr "Software &Release"
-#: src/slic3r/GUI/PresetHints.cpp:184
+#: src/slic3r/GUI/PresetHints.cpp:183
msgid "solid infill"
msgstr "Massives Infill"
-#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:314
-#: src/libslic3r/PrintConfig.cpp:1756 src/libslic3r/PrintConfig.cpp:1767
+#: src/slic3r/GUI/GUI_Preview.cpp:305 src/libslic3r/ExtrusionEntity.cpp:318
+#: src/libslic3r/ExtrusionEntity.cpp:344 src/libslic3r/PrintConfig.cpp:1871
+#: src/libslic3r/PrintConfig.cpp:1882
msgid "Solid infill"
msgstr "Massives Infill"
-#: src/libslic3r/PrintConfig.cpp:1744
+#: src/libslic3r/PrintConfig.cpp:1859
msgid "Solid infill every"
msgstr "Massives Infill alle"
-#: src/libslic3r/PrintConfig.cpp:1736
+#: src/libslic3r/PrintConfig.cpp:1851
msgid "Solid infill extruder"
msgstr "Massives Infill Extruder"
-#: src/libslic3r/PrintConfig.cpp:1727
+#: src/libslic3r/PrintConfig.cpp:1842
msgid "Solid infill threshold area"
msgstr "Massives Infill Flächen Schwellwert"
-#: src/slic3r/GUI/Tab.cpp:1065 src/libslic3r/PrintConfig.cpp:1780
+#: src/slic3r/GUI/Tab.cpp:1387 src/libslic3r/PrintConfig.cpp:1895
msgid "Solid layers"
msgstr "Massive Schichten"
-#: src/libslic3r/PrintConfig.cpp:754
+#: src/libslic3r/PrintConfig.cpp:790
msgid "Soluble material"
msgstr "Lösliches Material"
-#: src/libslic3r/PrintConfig.cpp:755
+#: src/libslic3r/PrintConfig.cpp:791
msgid "Soluble material is most likely used for a soluble support."
-msgstr "Lösliches Material wird meistens für Stützstrukturen verwendet."
+msgstr "Lösliches Material wird meistens für lösliche Stützen verwendet."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:735
+msgid "Some fields are too long to fit. Right mouse click reveals the full text."
+msgstr "Einige Texte sind zu lang. Ein rechter Mausklick zeigt den vollständigen Text an."
-#: src/libslic3r/PrintConfig.cpp:937
+#: src/libslic3r/PrintConfig.cpp:981
msgid "Some G/M-code commands, including temperature control and others, are not universal. Set this option to your printer's firmware to get a compatible output. The \"No extrusion\" flavor prevents PrusaSlicer from exporting any extrusion value at all."
msgstr "Einige G/M-Code Befehle, einschließlich Temperaturregelung und andere, sind nicht universell einsetzbar. Stellen Sie diese Option auf die Firmware Ihres Druckers ein, um eine kompatible Ausgabe zu erhalten. Der Zusatz \"No Extrusion\" verhindert, dass PrusaSlicer überhaupt einen Extrusionswert exportiert."
-#: src/slic3r/GUI/GLCanvas3D.cpp:688
-msgid "Some objects are not visible"
-msgstr "Einige Objekte sind nicht sichtbar"
+#: src/slic3r/GUI/Plater.cpp:2309
+#, possible-c-format
+msgid "Some object(s) in file %s looks like saved in inches.\nShould I consider them as a saved in inches and convert them?"
+msgstr "Einige Objekte in der Datei %s sehen aus wie in Zoll gespeichert.\nAls in Zoll gespeicherte Objekte betrachten und konvertieren?"
-#: src/libslic3r/Print.cpp:1226
+#: src/slic3r/GUI/GLCanvas3D.cpp:636
+msgid "Some objects are not visible."
+msgstr "Einige Objekte sind nicht sichtbar."
+
+#: src/libslic3r/Print.cpp:1252
msgid "Some objects are too close; your extruder will collide with them."
msgstr "Einige Objekte sind zu nahe; Ihr Extruder wird mit ihnen zusammenstoßen."
-#: src/libslic3r/Print.cpp:1228
+#: src/libslic3r/Print.cpp:1254
msgid "Some objects are too tall and cannot be printed without extruder collisions."
msgstr "Einige Objekte sind zu hoch und können nicht ohne Zusammenstoss mit dem Extruder gedruckt werden."
-#: src/libslic3r/PrintConfig.cpp:2824
+#: src/libslic3r/PrintConfig.cpp:2988
msgid "Some objects can get along with a few smaller pads instead of a single big one. This parameter defines how far the center of two smaller pads should be. If theyare closer, they will get merged into one pad."
msgstr "Einige Objekte können mit ein paar kleineren Grundschichten auskommen, anstatt mit einer einzigen großen. Dieser Parameter definiert, wie weit die Mittelpunkte von zwei kleineren Grundschichten entfernt sein soll. Wenn sie näher sind, werden sie zu einem Block zusammengeführt."
-#: src/libslic3r/PrintConfig.cpp:2187
+#: src/libslic3r/PrintConfig.cpp:2330
msgid "Some printers or printer setups may have difficulties printing with a variable layer height. Enabled by default."
msgstr "Mit einigen Druckern oder Druckerkonfigurationen ist es schwierig, mit einer variablen Schichthöhe zu drucken. Standardmässig aktiviert."
-#: src/libslic3r/PrintConfig.cpp:1984
+#: src/slic3r/GUI/GLCanvas3D.cpp:3967
+msgid "Spacing"
+msgstr "Abstand"
+
+#: src/libslic3r/PrintConfig.cpp:2126
msgid "Spacing between interface lines. Set zero to get a solid interface."
msgstr "Abstand zwischen den Schnittstellenlinien. Auf null stellen, um ein massives Interface zu erhalten."
-#: src/libslic3r/PrintConfig.cpp:2018
+#: src/libslic3r/PrintConfig.cpp:1155
+msgid "Spacing between ironing passes"
+msgstr "Abstand zwischen Bügelwegen"
+
+#: src/libslic3r/PrintConfig.cpp:2160
msgid "Spacing between support material lines."
-msgstr "Abstand zwischen Stützstrukturlinien."
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:616
-#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/Tab.cpp:1145
-#: src/libslic3r/PrintConfig.cpp:235 src/libslic3r/PrintConfig.cpp:458
-#: src/libslic3r/PrintConfig.cpp:919 src/libslic3r/PrintConfig.cpp:1048
-#: src/libslic3r/PrintConfig.cpp:1431 src/libslic3r/PrintConfig.cpp:1668
-#: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1768
-#: src/libslic3r/PrintConfig.cpp:2118
+msgstr "Abstand zwischen Stützmateriallinien."
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:655
+#: src/slic3r/GUI/GUI_Preview.cpp:278 src/slic3r/GUI/Tab.cpp:1474
+#: src/libslic3r/PrintConfig.cpp:269 src/libslic3r/PrintConfig.cpp:494
+#: src/libslic3r/PrintConfig.cpp:963 src/libslic3r/PrintConfig.cpp:1092
+#: src/libslic3r/PrintConfig.cpp:1165 src/libslic3r/PrintConfig.cpp:1539
+#: src/libslic3r/PrintConfig.cpp:1776 src/libslic3r/PrintConfig.cpp:1831
+#: src/libslic3r/PrintConfig.cpp:1883 src/libslic3r/PrintConfig.cpp:2261
msgid "Speed"
msgstr "Geschwindigkeit"
-#: src/libslic3r/PrintConfig.cpp:1670
-msgid "Speed (baud) of USB/serial port for printer connection."
-msgstr "Geschwindigkeit (baud) des USB/seriellen Ports für den Drucker Anschluß."
-
-#: src/libslic3r/GCode/PreviewData.cpp:351
+#: src/slic3r/GUI/GCodeViewer.cpp:2238 src/libslic3r/GCode/PreviewData.cpp:356
msgid "Speed (mm/s)"
msgstr "Geschwindigkeit (mm/s)"
-#: src/libslic3r/PrintConfig.cpp:920
+#: src/libslic3r/PrintConfig.cpp:964
msgid "Speed for filling small gaps using short zigzag moves. Keep this reasonably low to avoid too much shaking and resonance issues. Set zero to disable gaps filling."
msgstr "Geschwindigkeit, mit der kleine Lücken mit kurzen Zickzackbewegungen gefüllt werden. Beschränken Sie diese auf einen mässigen Wert, um übermässiges Rütteln und Resonanzprobleme zu vermeiden. Auf null gesetzt, wird das Füllen kleiner Lücken deaktiviert."
-#: src/slic3r/GUI/Tab.cpp:1158
+#: src/slic3r/GUI/Tab.cpp:1488
msgid "Speed for non-print moves"
msgstr "Geschwindigkeit für Bewegungen zwischen den Druckvorgängen"
-#: src/libslic3r/PrintConfig.cpp:1432
+#: src/libslic3r/PrintConfig.cpp:1540
msgid "Speed for perimeters (contours, aka vertical shells). Set to zero for auto."
msgstr "Geschwindigkeit für Außenkonturen (Konturen, bzw. vertikale Hüllen). Für Automatik auf null setzen."
-#: src/slic3r/GUI/Tab.cpp:1146
+#: src/slic3r/GUI/Tab.cpp:1475
msgid "Speed for print moves"
msgstr "Geschwindigkeit für Druckbewegungen"
-#: src/libslic3r/PrintConfig.cpp:236
+#: src/libslic3r/PrintConfig.cpp:270
msgid "Speed for printing bridges."
msgstr "Brückendruckgeschwindigkeit."
-#: src/libslic3r/PrintConfig.cpp:1769
+#: src/libslic3r/PrintConfig.cpp:1884
msgid "Speed for printing solid regions (top/bottom/internal horizontal shells). This can be expressed as a percentage (for example: 80%) over the default infill speed above. Set to zero for auto."
msgstr "Druckgeschwindigkeit für massive Bereiche (obere/untere/innenliegende waagrechte Hüllen). Sie kann als Prozentwert (z.B. 80%) der oben eingegebenen standardmässigen Infill-Geschwindigkeit angegeben werden. Für Automatik auf null setzen."
-#: src/libslic3r/PrintConfig.cpp:1993
+#: src/libslic3r/PrintConfig.cpp:2135
msgid "Speed for printing support material interface layers. If expressed as percentage (for example 50%) it will be calculated over support material speed."
msgstr "Geschwindigkeit für den Druck von Trägermaterial-Schnittstellenschichten. Wenn es als Prozentsatz (z.B. 50%) ausgedrückt wird, wird es über die Geschwindigkeit des Trägermaterials berechnet."
-#: src/libslic3r/PrintConfig.cpp:2027
+#: src/libslic3r/PrintConfig.cpp:2169
msgid "Speed for printing support material."
-msgstr "Druckgeschwindigkeit der Stützstrukturen."
+msgstr "Druckgeschwindigkeit des Stützmaterials."
-#: src/libslic3r/PrintConfig.cpp:1049
+#: src/libslic3r/PrintConfig.cpp:1093
msgid "Speed for printing the internal fill. Set to zero for auto."
msgstr "Druckgeschwindigkeit für den Infill. Für Automatik auf null setzen."
-#: src/libslic3r/PrintConfig.cpp:2119
+#: src/libslic3r/PrintConfig.cpp:2262
msgid "Speed for printing top solid layers (it only applies to the uppermost external layers and not to their internal solid layers). You may want to slow down this to get a nicer surface finish. This can be expressed as a percentage (for example: 80%) over the solid infill speed above. Set to zero for auto."
msgstr "Druckgeschwindigkeit für die oberen massiven Schichten (betrifft nur die obersten Außenkonturen und nicht deren innenliegende massiven Schichten). Wir empfehlen, diesen Wert zu reduzieren, um eine schönere Oberfläche zu erhalten. Dies kann als Prozentwert (z.B. 80%) der oben eingegebenen Geschwindigkeit für massives Infill angegeben werden. Für Automatik auf null setzen."
-#: src/libslic3r/PrintConfig.cpp:2153
+#: src/libslic3r/PrintConfig.cpp:2296
msgid "Speed for travel moves (jumps between distant extrusion points)."
msgstr "Bewegungsgeschwindigkeit (zwischen weit entfernten Extrusionsorten)."
-#: src/libslic3r/PrintConfig.cpp:659
+#: src/libslic3r/PrintConfig.cpp:695
msgid "Speed of the first cooling move"
msgstr "Geschwindigkeit der ersten Kühlbewegung"
-#: src/libslic3r/PrintConfig.cpp:678
+#: src/libslic3r/PrintConfig.cpp:714
msgid "Speed of the last cooling move"
msgstr "Geschwindigkeit der letzten Kühlbewegung"
-#: src/libslic3r/PrintConfig.cpp:616
+#: src/libslic3r/PrintConfig.cpp:652
msgid "Speed used at the very beginning of loading phase."
msgstr "Geschwindigkeit, die zu Beginn der Ladephase verwendet wird."
-#: src/libslic3r/PrintConfig.cpp:608
+#: src/libslic3r/PrintConfig.cpp:644
msgid "Speed used for loading the filament on the wipe tower."
msgstr "Geschwindigkeit, mit der Filament auf dem Reinigungsturm geladen wird."
-#: src/libslic3r/PrintConfig.cpp:624
+#: src/libslic3r/PrintConfig.cpp:660
msgid "Speed used for unloading the filament on the wipe tower (does not affect initial part of unloading just after ramming)."
msgstr "Geschwindigkeit, mit der Filament auf dem Reinigungsturm entladen wird (betrifft nicht den ersten Teil des Entladens direkt nach dem Rammen)."
-#: src/libslic3r/PrintConfig.cpp:633
+#: src/libslic3r/PrintConfig.cpp:669
msgid "Speed used for unloading the tip of the filament immediately after ramming."
msgstr "Geschwindigkeit, mit der die Spitze des Filaments unmittelbar nach dem Rammen entladen wird."
-#: src/slic3r/GUI/Mouse3DController.cpp:296
+#: src/slic3r/GUI/Mouse3DController.cpp:279
msgid "Speed:"
msgstr "Geschwindigkeit:"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1432
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
msgid "Sphere"
msgstr "Kugel"
-#: src/libslic3r/PrintConfig.cpp:1794
+#: src/libslic3r/PrintConfig.cpp:1909
msgid "Spiral vase"
msgstr "Spiralvasenmodus"
-#: src/slic3r/GUI/ConfigManipulation.cpp:90
+#: src/slic3r/GUI/ConfigManipulation.cpp:89
msgid "Spiral Vase"
msgstr "Spiralvasenmodus"
-#: src/slic3r/GUI/Plater.cpp:4019 src/slic3r/GUI/Plater.cpp:4034
-#: src/slic3r/GUI/Plater.cpp:4048 src/libslic3r/PrintConfig.cpp:3471
+#: src/slic3r/GUI/Plater.cpp:3939 src/slic3r/GUI/Plater.cpp:3954
+#: src/slic3r/GUI/Plater.cpp:3972 src/libslic3r/PrintConfig.cpp:3670
msgid "Split"
msgstr "Trennen"
-#: src/slic3r/GUI/Plater.cpp:4019
+#: src/slic3r/GUI/Plater.cpp:3939
msgid "Split the selected object"
msgstr "Teile das gewählte Objekt"
-#: src/slic3r/GUI/Plater.cpp:4014 src/slic3r/GUI/Plater.cpp:4034
+#: src/slic3r/GUI/Plater.cpp:3934 src/slic3r/GUI/Plater.cpp:3954
msgid "Split the selected object into individual objects"
msgstr "Ausgewähltes Objekt in Einzelobjekte trennen"
-#: src/slic3r/GUI/Plater.cpp:4016 src/slic3r/GUI/Plater.cpp:4048
+#: src/slic3r/GUI/Plater.cpp:3936 src/slic3r/GUI/Plater.cpp:3972
msgid "Split the selected object into individual sub-parts"
msgstr "Ausgewähltes Objekt in einzelne Unterteile trennen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4550
+#: src/slic3r/GUI/GLCanvas3D.cpp:4916
msgid "Split to objects"
msgstr "In Objekte trennen"
-#: src/slic3r/GUI/Plater.cpp:2981
+#: src/slic3r/GUI/Plater.cpp:2774
msgid "Split to Objects"
msgstr "In Objekte trennen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4560 src/slic3r/GUI/GUI_ObjectList.cpp:1487
+#: src/slic3r/GUI/GLCanvas3D.cpp:4926 src/slic3r/GUI/GUI_ObjectList.cpp:1618
msgid "Split to parts"
msgstr "In Teile trennen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2274
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2440
msgid "Split to Parts"
msgstr "In Teile trennen"
-#: src/slic3r/GUI/ConfigWizard.cpp:289
+#: src/libslic3r/PrintConfig.cpp:812
+msgid "Spool weight"
+msgstr "Gewicht der Spule"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:307
msgid "Standard"
msgstr "Standard"
-#: src/libslic3r/PrintConfig.cpp:846
+#: src/libslic3r/PrintConfig.cpp:884
msgid "Stars"
msgstr "Sterne"
-#: src/slic3r/GUI/MainFrame.cpp:405
+#: src/slic3r/GUI/MainFrame.cpp:986
msgid "Start a new project"
msgstr "Ein neues Projekt beginnen"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29
msgid "Start at height"
msgstr "Starte auf Höhe"
-#: src/slic3r/GUI/Tab.cpp:1528 src/slic3r/GUI/Tab.cpp:1976
-#: src/libslic3r/PrintConfig.cpp:1813 src/libslic3r/PrintConfig.cpp:1828
+#: src/slic3r/GUI/Tab.cpp:1873 src/slic3r/GUI/Tab.cpp:2161
+#: src/libslic3r/PrintConfig.cpp:1928 src/libslic3r/PrintConfig.cpp:1943
msgid "Start G-code"
msgstr "Start G-Code"
-#: src/slic3r/GUI/MainFrame.cpp:532
+#: src/slic3r/GUI/MainFrame.cpp:1133
msgid "Start new slicing process"
msgstr "Neuen Slicing-Prozess starten"
@@ -7347,7 +8617,15 @@ msgstr "Neuen Slicing-Prozess starten"
msgid "Start printing after upload"
msgstr "Beginne den Druckjob nach dem Hochladen"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:151
+#: src/slic3r/GUI/GUI_App.cpp:396
+msgid "Start the application"
+msgstr "Anwendung starten"
+
+#: src/slic3r/GUI/GUI_App.cpp:386
+msgid "Starting with %1% 2.3, configuration directory on Linux has changed (according to XDG Base Directory Specification) to \n%2%.\n\nThis directory did not exist yet (maybe you run the new version for the first time).\nHowever, an old %1% configuration directory was detected in \n%3%.\n\nConsider moving the contents of the old directory to the new location in order to access your profiles, etc.\nNote that if you decide to downgrade %1% in future, it will use the old location again.\n\nWhat do you want to do now?"
+msgstr "Beginnend mit %1% 2.3 hat sich das Konfigurationsverzeichnis unter Linux (gemäß XDG Base Directory Specification) geändert in \n%2%.\n\nDieses Verzeichnis existierte noch nicht (vielleicht führen Sie die neue Version zum ersten Mal aus).\nEs wurde jedoch ein altes %1%-Konfigurationsverzeichnis entdeckt in \n%3%.\n\nZiehen Sie in Betracht, den Inhalt des alten Verzeichnisses an den neuen Ort zu verschieben, um auf Ihre Profile usw. zuzugreifen.\nBeachten Sie, dass bei einem zukünftigen Downgrade von %1% wieder der alte Speicherort verwendet wird.\n\nWas möchten Sie jetzt tun?"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:149
msgid "Status"
msgstr "Status"
@@ -7355,866 +8633,873 @@ msgstr "Status"
msgid "Status:"
msgstr "Status:"
-#: src/slic3r/GUI/Tab.cpp:2209
+#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2378
msgid "Stealth"
msgstr "Stealth"
-#: src/slic3r/GUI/Plater.cpp:1291
+#: src/slic3r/GUI/Plater.cpp:1187 src/slic3r/GUI/Plater.cpp:1235
msgid "stealth mode"
msgstr "Stealth Modus"
-#: src/slic3r/GUI/Plater.cpp:4985
-#, c-format
+#: src/slic3r/GUI/GCodeViewer.cpp:2557
+msgid "Stealth mode"
+msgstr "Stealth Modus"
+
+#: src/slic3r/GUI/Plater.cpp:5118
+#, possible-c-format
msgid "STL file exported to %s"
msgstr "Die STL-Datei wurde exportiert zu %s"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29
msgid "Stop at height"
msgstr "Stoppe auf Höhe"
-#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:1928
+#: src/slic3r/GUI/GUI_App.cpp:1781
+msgid "Stop them and continue anyway?"
+msgstr "Stoppen und trotzdem weitermachen?"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:295
msgid "Success!"
msgstr "Erfolg!"
-#: src/slic3r/GUI/PresetHints.cpp:203
+#: src/slic3r/GUI/Plater.cpp:2047
+#, possible-c-format
+msgid "Successfully unmounted. The device %s(%s) can now be safely removed from the computer."
+msgstr "Erfolgreich ausgeworfen. Das Gerät %s(%s) kann nun sicher vom Computer entfernt werden."
+
+#: src/slic3r/GUI/PresetHints.cpp:202
msgid "support"
msgstr "Stützen"
-#: src/libslic3r/PrintConfig.cpp:2692
+#: src/libslic3r/PrintConfig.cpp:2856
msgid "Support base diameter"
msgstr "Stützfuß Durchmesser"
-#: src/libslic3r/PrintConfig.cpp:2702
+#: src/libslic3r/PrintConfig.cpp:2866
msgid "Support base height"
msgstr "Stützfuß Höhe"
-#: src/libslic3r/PrintConfig.cpp:2711
+#: src/libslic3r/PrintConfig.cpp:2875
msgid "Support base safety distance"
msgstr "Sicherheitsabstand der Stützbasis"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
msgid "Support Blocker"
msgstr "Stützblocker"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3551
+#: src/libslic3r/PrintConfig.cpp:895
+msgid "Support Cubic"
+msgstr "Stütz-kubisch"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
msgid "Support Enforcer"
msgstr "Stützverstärker"
-#: src/slic3r/GUI/ConfigManipulation.cpp:163
+#: src/slic3r/GUI/ConfigManipulation.cpp:162
msgid "Support Generator"
msgstr "Stütz-Generator"
-#: src/slic3r/GUI/Tab.cpp:3608
+#: src/slic3r/GUI/Tab.cpp:4018
msgid "Support head"
msgstr "Stützkopf"
-#: src/libslic3r/PrintConfig.cpp:2620
-msgid "Support head front diameter"
-msgstr "Durchmesser des Stützkopfes vorne"
-
-#: src/libslic3r/PrintConfig.cpp:2629
-msgid "Support head penetration"
-msgstr "Eindringtiefe des Stützkopfes"
-
-#: src/libslic3r/PrintConfig.cpp:2638
-msgid "Support head width"
-msgstr "Stützkopfbreite"
-
-#: src/slic3r/GUI/PresetHints.cpp:213
+#: src/slic3r/GUI/PresetHints.cpp:212
msgid "support interface"
msgstr "Schnittstelle zu den Stützen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:97
-#: src/slic3r/GUI/GUI_ObjectList.cpp:615 src/slic3r/GUI/GUI_Preview.cpp:246
-#: src/slic3r/GUI/Tab.cpp:1120 src/slic3r/GUI/Tab.cpp:1121
-#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/PrintConfig.cpp:370
-#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1866
-#: src/libslic3r/PrintConfig.cpp:1872 src/libslic3r/PrintConfig.cpp:1880
-#: src/libslic3r/PrintConfig.cpp:1892 src/libslic3r/PrintConfig.cpp:1902
-#: src/libslic3r/PrintConfig.cpp:1910 src/libslic3r/PrintConfig.cpp:1925
-#: src/libslic3r/PrintConfig.cpp:1946 src/libslic3r/PrintConfig.cpp:1958
-#: src/libslic3r/PrintConfig.cpp:1974 src/libslic3r/PrintConfig.cpp:1983
-#: src/libslic3r/PrintConfig.cpp:1992 src/libslic3r/PrintConfig.cpp:2003
-#: src/libslic3r/PrintConfig.cpp:2017 src/libslic3r/PrintConfig.cpp:2025
-#: src/libslic3r/PrintConfig.cpp:2026 src/libslic3r/PrintConfig.cpp:2035
-#: src/libslic3r/PrintConfig.cpp:2043 src/libslic3r/PrintConfig.cpp:2057
+#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:95
+#: src/slic3r/GUI/GUI_ObjectList.cpp:654 src/slic3r/GUI/GUI_Preview.cpp:311
+#: src/slic3r/GUI/Tab.cpp:1449 src/slic3r/GUI/Tab.cpp:1450
+#: src/libslic3r/ExtrusionEntity.cpp:324 src/libslic3r/ExtrusionEntity.cpp:356
+#: src/libslic3r/PrintConfig.cpp:404 src/libslic3r/PrintConfig.cpp:1610
+#: src/libslic3r/PrintConfig.cpp:2008 src/libslic3r/PrintConfig.cpp:2014
+#: src/libslic3r/PrintConfig.cpp:2022 src/libslic3r/PrintConfig.cpp:2034
+#: src/libslic3r/PrintConfig.cpp:2044 src/libslic3r/PrintConfig.cpp:2052
+#: src/libslic3r/PrintConfig.cpp:2067 src/libslic3r/PrintConfig.cpp:2088
+#: src/libslic3r/PrintConfig.cpp:2100 src/libslic3r/PrintConfig.cpp:2116
+#: src/libslic3r/PrintConfig.cpp:2125 src/libslic3r/PrintConfig.cpp:2134
+#: src/libslic3r/PrintConfig.cpp:2145 src/libslic3r/PrintConfig.cpp:2159
+#: src/libslic3r/PrintConfig.cpp:2167 src/libslic3r/PrintConfig.cpp:2168
+#: src/libslic3r/PrintConfig.cpp:2177 src/libslic3r/PrintConfig.cpp:2185
+#: src/libslic3r/PrintConfig.cpp:2199
msgid "Support material"
-msgstr "Stützstrukturen"
+msgstr "Stützmaterial"
-#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:320
-#: src/libslic3r/PrintConfig.cpp:1991
+#: src/slic3r/GUI/GUI_Preview.cpp:312 src/libslic3r/ExtrusionEntity.cpp:325
+#: src/libslic3r/ExtrusionEntity.cpp:358 src/libslic3r/PrintConfig.cpp:2133
msgid "Support material interface"
-msgstr "Schnittstellenmaterial zu den Stützstrukturen"
+msgstr "Schnittstellenmaterial zum Stützmaterial"
-#: src/libslic3r/PrintConfig.cpp:2044
+#: src/libslic3r/PrintConfig.cpp:2186
msgid "Support material will not be generated for overhangs whose slope angle (90° = vertical) is above the given threshold. In other words, this value represent the most horizontal slope (measured from the horizontal plane) that you can print without support material. Set to zero for automatic detection (recommended)."
-msgstr "Für Überhänge, deren Neigungswinkel (90° = vertikal) oberhalb der vorgegebenen Schwelle liegt, wird keine Stützstruktur erzeugt. Mit anderen Worten, dieser Wert stellt die größte horizontale Steigung (gemessen von der horizontalen Ebene) dar, die Sie ohne Trägermaterial drucken können. Für die automatische Erkennung auf null setzen (empfohlen)."
+msgstr "Für Überhänge, deren Neigungswinkel (90° = vertikal) oberhalb der vorgegebenen Schwelle liegt, wird kein Stützmaterial erzeugt. Mit anderen Worten, dieser Wert stellt die größte horizontale Steigung (gemessen von der horizontalen Ebene) dar, die Sie ohne Stützmaterial drucken können. Für die automatische Erkennung auf null setzen (empfohlen)."
-#: src/libslic3r/PrintConfig.cpp:1964
+#: src/libslic3r/PrintConfig.cpp:2106
msgid "Support material/raft interface extruder"
-msgstr "Stützstrukturen/Raft Schnittstellen Extruder"
+msgstr "Stützmaterial/Raft Schnittstellen Extruder"
-#: src/libslic3r/PrintConfig.cpp:1937
+#: src/libslic3r/PrintConfig.cpp:2079
msgid "Support material/raft/skirt extruder"
-msgstr "Stützstrukturen/Raft/Schürzen Extruder"
+msgstr "Stützmaterial/Raft/Schürzen Extruder"
-#: src/slic3r/GUI/Plater.cpp:500 src/libslic3r/PrintConfig.cpp:1901
-#: src/libslic3r/PrintConfig.cpp:2674
+#: src/slic3r/GUI/Plater.cpp:366 src/libslic3r/PrintConfig.cpp:2043
+#: src/libslic3r/PrintConfig.cpp:2838
msgid "Support on build plate only"
-msgstr "Stützstrukturen nur auf dem Druckbrett"
+msgstr "Stützen nur auf dem Druckbett"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:888
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:762
msgid "Support parameter change"
msgstr "Stützparameter Änderung"
-#: src/slic3r/GUI/Tab.cpp:3613
+#: src/slic3r/GUI/Tab.cpp:4023
msgid "Support pillar"
msgstr "Stützpfeiler"
-#: src/libslic3r/PrintConfig.cpp:2658
-msgid "Support pillar connection mode"
-msgstr "Stützpfeiler Verbindungsmodus"
-
-#: src/libslic3r/PrintConfig.cpp:2648
-msgid "Support pillar diameter"
-msgstr "Durchmesser der Stützpfeiler"
-
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55
-#: src/libslic3r/PrintConfig.cpp:2764
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54
+#: src/libslic3r/PrintConfig.cpp:2928
msgid "Support points density"
msgstr "Stützpunktdichte"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1196
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1048
msgid "Support points edit"
msgstr "Stützpunkte editieren"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/GUI_ObjectList.cpp:624
-#: src/slic3r/GUI/Plater.cpp:495 src/slic3r/GUI/Tab.cpp:3604
-#: src/slic3r/GUI/Tab.cpp:3605 src/libslic3r/PrintConfig.cpp:2614
-#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2630
-#: src/libslic3r/PrintConfig.cpp:2639 src/libslic3r/PrintConfig.cpp:2649
-#: src/libslic3r/PrintConfig.cpp:2675 src/libslic3r/PrintConfig.cpp:2682
-#: src/libslic3r/PrintConfig.cpp:2693 src/libslic3r/PrintConfig.cpp:2703
-#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2725
-#: src/libslic3r/PrintConfig.cpp:2735 src/libslic3r/PrintConfig.cpp:2744
-#: src/libslic3r/PrintConfig.cpp:2754 src/libslic3r/PrintConfig.cpp:2765
-#: src/libslic3r/PrintConfig.cpp:2773
+#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:663
+#: src/slic3r/GUI/Plater.cpp:361 src/slic3r/GUI/Tab.cpp:4014
+#: src/slic3r/GUI/Tab.cpp:4015 src/libslic3r/PrintConfig.cpp:2757
+#: src/libslic3r/PrintConfig.cpp:2764 src/libslic3r/PrintConfig.cpp:2773
+#: src/libslic3r/PrintConfig.cpp:2782 src/libslic3r/PrintConfig.cpp:2792
+#: src/libslic3r/PrintConfig.cpp:2802 src/libslic3r/PrintConfig.cpp:2839
+#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2857
+#: src/libslic3r/PrintConfig.cpp:2867 src/libslic3r/PrintConfig.cpp:2876
+#: src/libslic3r/PrintConfig.cpp:2889 src/libslic3r/PrintConfig.cpp:2899
+#: src/libslic3r/PrintConfig.cpp:2908 src/libslic3r/PrintConfig.cpp:2918
+#: src/libslic3r/PrintConfig.cpp:2929 src/libslic3r/PrintConfig.cpp:2937
msgid "Supports"
msgstr "Stützen"
-#: src/slic3r/GUI/Plater.cpp:1194
+#: src/slic3r/GUI/Plater.cpp:1103
msgid "supports and pad"
msgstr "Stützen und Grundschicht"
-#: src/libslic3r/PrintConfig.cpp:1092
+#: src/libslic3r/PrintConfig.cpp:1185
msgid "Supports remaining times"
msgstr "Unterstützt Restzeit"
-#: src/libslic3r/PrintConfig.cpp:1101
+#: src/libslic3r/PrintConfig.cpp:1194
msgid "Supports stealth mode"
msgstr "Unterstützt Stealth Modus"
-#: src/slic3r/GUI/ConfigManipulation.cpp:159
-msgid ""
-"Supports work better, if the following feature is enabled:\n"
-"- Detect bridging perimeters"
-msgstr ""
-"Stützen funktionieren besser, wenn die folgende Funktion aktiviert ist:\n"
-"- Erkennen von Umfangbrücken"
+#: src/slic3r/GUI/ConfigManipulation.cpp:158
+msgid "Supports work better, if the following feature is enabled:\n- Detect bridging perimeters"
+msgstr "Stützen funktionieren besser, wenn die folgende Funktion aktiviert ist:\n- Erkennen von Umfangbrücken"
-#: src/slic3r/GUI/Preferences.cpp:87
+#: src/slic3r/GUI/Preferences.cpp:104
msgid "Suppress \" - default - \" presets"
msgstr "\"Standard\"-Einstellungen unterdrücken"
-#: src/slic3r/GUI/Preferences.cpp:89
+#: src/slic3r/GUI/Preferences.cpp:106
msgid "Suppress \" - default - \" presets in the Print / Filament / Printer selections once there are any other valid presets available."
msgstr "\"Standard\"-Einstellungen in den Auswahlen für Druck / Filament / Drucker unterdrücken, falls andere gültige Voreinstellungen vorhanden sind."
-#: src/slic3r/GUI/MainFrame.cpp:826
+#: src/slic3r/GUI/Preferences.cpp:276
+msgid "Suppress to open hyperlink in browser"
+msgstr "Öffnen des Hyperlinks im Browser unterdrücken"
+
+#: src/slic3r/GUI/MainFrame.cpp:1527
msgid "SVG"
msgstr "SVG"
-#: src/slic3r/GUI/DoubleSlider.cpp:1144
+#: src/slic3r/GUI/Mouse3DController.cpp:318
+msgid "Swap Y/Z axes"
+msgstr "Y/Z-Achsen vertauschen"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+msgid "Switch between Editor/Preview"
+msgstr "Umschalten zwischen Editor/Vorschau"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1273
msgid "Switch code to Change extruder"
msgstr "Code umschalten auf Extruder wechseln"
-#: src/slic3r/GUI/DoubleSlider.cpp:1179
+#: src/slic3r/GUI/DoubleSlider.cpp:1306
msgid "Switch code to Color change (%1%) for:"
msgstr "Umschalten des Codes auf Farbwechsel (%1%) für:"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:140
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:136
msgid "Switch to 3D"
msgstr "Zeige 3D"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1376
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223
msgid "Switch to editing mode"
msgstr "Zum Bearbeitungsmodus umschalten"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:141
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:137
msgid "Switch to Preview"
msgstr "Wechseln zur Vorschau"
-#: src/slic3r/GUI/wxExtensions.cpp:703
-#, c-format
+#: src/slic3r/GUI/GLCanvas3D.cpp:4302 src/slic3r/GUI/GLCanvas3D.cpp:4939
+msgid "Switch to Settings"
+msgstr "Zu Einstellungen wechseln"
+
+#: src/slic3r/GUI/wxExtensions.cpp:623
+#, possible-c-format
msgid "Switch to the %s mode"
msgstr "Wechseln zum %s Modus"
-#: src/slic3r/GUI/GUI_App.cpp:882
-msgid ""
-"Switching the language will trigger application restart.\n"
-"You will lose content of the plater."
-msgstr ""
-"Das Umschalten der Sprache löst einen Neustart der Anwendung aus.\n"
-"Sie verlieren den Inhalt der Druckplatte."
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:542
+msgid "Switching Presets: Unsaved Changes"
+msgstr "Voreinstellungen umschalten: Nicht gespeicherte Änderungen"
+
+#: src/slic3r/GUI/GUI_App.cpp:1608
+msgid "Switching the language will trigger application restart.\nYou will lose content of the plater."
+msgstr "Das Umschalten der Sprache löst einen Neustart der Anwendung aus.\nSie verlieren den Inhalt der Druckplatte."
#: src/slic3r/GUI/WipeTowerDialog.cpp:365
-msgid ""
-"Switching to simple settings will discard changes done in the advanced mode!\n"
-"\n"
-"Do you want to proceed?"
-msgstr ""
-"Das Umschalten auf einfache Einstellungen verwirft die im erweiterten Modus vorgenommenen Änderungen!\n"
-"\n"
-"Wollen Sie fortfahren?"
+msgid "Switching to simple settings will discard changes done in the advanced mode!\n\nDo you want to proceed?"
+msgstr "Das Umschalten auf einfache Einstellungen verwirft die im erweiterten Modus vorgenommenen Änderungen!\n\nWollen Sie fortfahren?"
-#: src/slic3r/GUI/Tab.cpp:1014
+#: src/slic3r/GUI/Tab.cpp:1332
msgid "symbolic profile name"
msgstr "symbolischer Profilname"
-#: src/libslic3r/PrintConfig.cpp:2036
+#: src/libslic3r/PrintConfig.cpp:2178
msgid "Synchronize support layers with the object print layers. This is useful with multi-material printers, where the extruder switch is expensive."
msgstr "Stützschichten mit den Druckschichten des Objekts synchronisieren. Dies ist nützlich bei Multi-Material-Druckern, bei denen der Wechsel des Extruders kostenaufwendig ist."
-#: src/libslic3r/PrintConfig.cpp:2034
+#: src/libslic3r/PrintConfig.cpp:2176
msgid "Synchronize with object layers"
msgstr "Mit Objektschichten synchronisieren"
-#: src/slic3r/GUI/MainFrame.cpp:699
+#: src/slic3r/GUI/MainFrame.cpp:924 src/slic3r/GUI/MainFrame.cpp:1323
msgid "System &Info"
msgstr "System&informationen"
-#: src/slic3r/GUI/SysInfoDialog.cpp:78
+#: src/slic3r/GUI/SysInfoDialog.cpp:90 src/slic3r/GUI/SysInfoDialog.cpp:92
msgid "System Information"
msgstr "Systeminformationen"
-#: src/slic3r/GUI/Preset.cpp:1109 src/slic3r/GUI/Preset.cpp:1164
-#: src/slic3r/GUI/Preset.cpp:1242 src/slic3r/GUI/Preset.cpp:1284
-#: src/slic3r/GUI/PresetBundle.cpp:1583 src/slic3r/GUI/PresetBundle.cpp:1672
+#: src/slic3r/GUI/PresetComboBoxes.cpp:188
+#: src/slic3r/GUI/PresetComboBoxes.cpp:226
+#: src/slic3r/GUI/PresetComboBoxes.cpp:724
+#: src/slic3r/GUI/PresetComboBoxes.cpp:774
+#: src/slic3r/GUI/PresetComboBoxes.cpp:886
+#: src/slic3r/GUI/PresetComboBoxes.cpp:930
msgid "System presets"
msgstr "Systemvoreinstellungen"
-#: src/slic3r/GUI/GUI_App.cpp:801
+#: src/slic3r/GUI/GUI_App.cpp:1481
msgid "Take Configuration &Snapshot"
msgstr "Erfa&ssen einer Konfigurations-Momentaufnahme"
-#: src/slic3r/GUI/GUI_App.cpp:839
+#: src/slic3r/GUI/GUI_App.cpp:1540
msgid "Taking configuration snapshot"
msgstr "Ich erfasse eine Momentaufnahme der Konfiguration"
-#: src/slic3r/GUI/Tab.cpp:1433 src/libslic3r/PrintConfig.cpp:2067
+#: src/slic3r/GUI/Tab.cpp:1779
msgid "Temperature"
msgstr "Temperatur"
-#: src/libslic3r/PrintConfig.cpp:1804
+#: src/libslic3r/PrintConfig.cpp:1919
msgid "Temperature difference to be applied when an extruder is not active. Enables a full-height \"sacrificial\" skirt on which the nozzles are periodically wiped."
msgstr "Der anzuwendende Temperaturunterschied, wenn kein Extruder aktiv ist. Dies aktiviert eine \"Wegwerf-\"Schürze über die ganze Druckhöhe, auf der die Düsen periodisch gereinigt werden."
-#: src/libslic3r/PrintConfig.cpp:1803
+#: src/libslic3r/PrintConfig.cpp:1918
msgid "Temperature variation"
msgstr "Temperaturen"
-#: src/slic3r/GUI/ConfigWizard.cpp:1017
+#: src/slic3r/GUI/ConfigWizard.cpp:1383
msgid "Temperatures"
msgstr "Temperaturen"
-#: src/slic3r/GUI/Tab.cpp:1677 src/slic3r/GUI/Tab.cpp:1915
+#: src/slic3r/GUI/Tab.cpp:2215
+msgid "Template Custom G-code"
+msgstr "Vorlage Benutzerdefinierter G-Code"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:284
msgid "Test"
msgstr "Test"
-#: src/slic3r/GUI/BedShapeDialog.cpp:172
+#: src/slic3r/GUI/BedShapeDialog.cpp:315
msgid "Texture"
msgstr "Textur"
-#: src/slic3r/GUI/ConfigManipulation.cpp:208
+#: src/slic3r/GUI/ConfigManipulation.cpp:207
msgid "The %1% infill pattern is not supposed to work at 100%% density."
msgstr "Das %1% Füllmuster ist nicht für die Arbeit mit 100%% Dichte vorgesehen."
#: src/slic3r/GUI/FirmwareDialog.cpp:548
-#, c-format
+#, possible-c-format
msgid "The %s device could not have been found"
msgstr "Das %s-Gerät konnte nicht gefunden werden"
#: src/slic3r/GUI/FirmwareDialog.cpp:436
-#, c-format
-msgid ""
-"The %s device was not found.\n"
-"If the device is connected, please press the Reset button next to the USB connector ..."
-msgstr ""
-"Das %s-Gerät wurde nicht gefunden.\n"
-"Wenn das Gerät angeschlossen ist, drücken Sie bitte die Reset-Taste neben dem USB-Anschluss...."
+#, possible-c-format
+msgid "The %s device was not found.\nIf the device is connected, please press the Reset button next to the USB connector ..."
+msgstr "Das %s-Gerät wurde nicht gefunden.\nWenn das Gerät angeschlossen ist, drücken Sie bitte die Reset-Taste neben dem USB-Anschluss...."
-#: src/slic3r/GUI/Tab.cpp:976
+#: src/slic3r/GUI/Tab.cpp:1238
msgid "The current custom preset will be detached from the parent system preset."
msgstr "Die aktuelle benutzerdefinierte Voreinstellung wird von der Voreinstellung des übergeordneten Systems gelöst."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875
-msgid ""
-"The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n"
-"Non-uniform scaling of tilted objects is only possible in the World coordinate system,\n"
-"once the rotation is embedded into the object coordinates."
-msgstr ""
-"Das aktuell manipulierte Objekt wird gekippt (Drehwinkel sind keine Vielfachen von 90°).\n"
-"Eine ungleiche Skalierung von geschwenkten Objekten ist nur im Weltkoordinatensystem möglich,\n"
-"sobald die Drehung in die Objektkoordinaten eingearbeitet wurde."
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:925
+msgid "The currently manipulated object is tilted (rotation angles are not multiples of 90°).\nNon-uniform scaling of tilted objects is only possible in the World coordinate system,\nonce the rotation is embedded into the object coordinates."
+msgstr "Das aktuell manipulierte Objekt wird gekippt (Drehwinkel sind keine Vielfachen von 90°).\nEine ungleiche Skalierung von geschwenkten Objekten ist nur im Weltkoordinatensystem möglich,\nsobald die Drehung in die Objektkoordinaten eingearbeitet wurde."
-#: src/libslic3r/PrintConfig.cpp:2726
+#: src/libslic3r/PrintConfig.cpp:2890
msgid "The default angle for connecting support sticks and junctions."
msgstr "Der Standardwinkel für die Verbindung von Stützstäben und Verbindungen."
-#: src/libslic3r/SLAPrint.cpp:631
+#: src/libslic3r/SLAPrint.cpp:645
msgid "The endings of the support pillars will be deployed on the gap between the object and the pad. 'Support base safety distance' has to be greater than the 'Pad object gap' parameter to avoid this."
msgstr "Die Enden der Stützpfeiler werden auf dem Spalt zwischen dem Objekt und der Grundschicht eingesetzt. Der \"Sicherheitsabstand der Stützbasis\" muss größer sein als der Parameter \"Objektabstand Grundschicht\", um dies zu vermeiden."
-#: src/libslic3r/PrintConfig.cpp:489
+#: src/libslic3r/PrintConfig.cpp:525
msgid "The extruder to use (unless more specific extruder settings are specified). This value overrides perimeter and infill extruders, but not the support extruders."
msgstr "Der Extruder, der verwendet werden soll, falls keine sonstigen Extrudereinstellungen angegeben wurden. Dies übersteuert die Angaben für die Außenkontur- und Infill-Extruder, aber nicht die Angabe des Extruders für die Stützen."
-#: src/libslic3r/PrintConfig.cpp:1003
+#: src/libslic3r/PrintConfig.cpp:1047
msgid "The extruder to use when printing infill."
msgstr "Extruder der beim Infill benutzt wird."
-#: src/libslic3r/PrintConfig.cpp:1410
+#: src/libslic3r/PrintConfig.cpp:1518
msgid "The extruder to use when printing perimeters and brim. First extruder is 1."
msgstr "Extruder der beim Umfang und Rand Drucken benutzt werden soll. Der erste Extruder ist 1."
-#: src/libslic3r/PrintConfig.cpp:1738
+#: src/libslic3r/PrintConfig.cpp:1853
msgid "The extruder to use when printing solid infill."
msgstr "Der Extruder der beim Drucken von massivem Infill benutzt werden soll."
-#: src/libslic3r/PrintConfig.cpp:1966
+#: src/libslic3r/PrintConfig.cpp:2108
msgid "The extruder to use when printing support material interface (1+, 0 to use the current extruder to minimize tool changes). This affects raft too."
-msgstr "Der Extruder, der für den Druck von Schnittstellen zu den Stützstrukturen verwendet wird (1+, oder null um den aktuellen Extruder für die Minimierung von Werkzeugwechseln zu verwenden). Dies betrifft auch den Raft."
+msgstr "Der Extruder, der für den Druck von Schnittstellen zum Stützmaterial verwendet wird (1+, oder null um den aktuellen Extruder für die Minimierung von Werkzeugwechseln zu verwenden). Dies betrifft auch den Raft."
-#: src/libslic3r/PrintConfig.cpp:1939
+#: src/libslic3r/PrintConfig.cpp:2081
msgid "The extruder to use when printing support material, raft and skirt (1+, 0 to use the current extruder to minimize tool changes)."
-msgstr "Der Extruder, der für den Druck von Stützstrukturen, Raft und Schürze verwendet wird (1+, oder null um den aktuellen Extruder für die Minimierung von Werkzeugwechseln zu verwenden)."
+msgstr "Der Extruder, der für den Druck von Stützmaterial, Raft und Schürze verwendet wird (1+, oder null um den aktuellen Extruder für die Minimierung von Werkzeugwechseln zu verwenden)."
-#: src/libslic3r/PrintConfig.cpp:727
+#: src/libslic3r/PrintConfig.cpp:763
msgid "The filament material type for use in custom G-codes."
msgstr "Die Materialart des Filaments zur Verwendung in benutzerdefinierten G-Codes."
-#: src/libslic3r/PrintConfig.cpp:3494
+#: src/libslic3r/PrintConfig.cpp:3693
msgid "The file where the output will be written (if not specified, it will be based on the input file)."
msgstr "Die Datei, in die die Ausgabe geschrieben wird (falls nicht angegeben, basiert sie auf der Eingabedatei)."
-#: src/libslic3r/PrintConfig.cpp:1102
+#: src/libslic3r/PrintConfig.cpp:1195
msgid "The firmware supports stealth mode"
msgstr "Die Firmware unterstützt den Stealth Modus"
-#: src/libslic3r/PrintConfig.cpp:120
+#: src/libslic3r/PrintConfig.cpp:122
msgid "The first layer will be shrunk in the XY plane by the configured value to compensate for the 1st layer squish aka an Elephant Foot effect."
msgstr "Die erste Schicht wird in der XY-Ebene um den vorgegebenen Wert verkleinert, um das Ausquetschen in der ersten Schicht (\"Elephant Foot\"-Effekt) zu kompensieren."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3820
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3927 src/slic3r/GUI/Tab.cpp:3457
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4283
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4410
+#: src/slic3r/GUI/SavePresetDialog.cpp:117
msgid "the following characters are not allowed:"
msgstr "die folgenden Zeichen sind nicht erlaubt:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1830
+#: src/slic3r/GUI/ConfigWizard.cpp:2257
msgid "The following FFF printer models have no filament selected:"
msgstr "Bei den folgenden FFF-Druckermodellen wurde kein Filament ausgewählt:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1848
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1004
+msgid "The following presets were modified:"
+msgstr "Die folgenden Voreinstellungen wurden geändert:"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:253
+msgid "The following shortcuts are applicable in G-code preview when the horizontal slider is active"
+msgstr "Die folgenden Tastenkombinationen sind in der G-Code-Vorschau anwendbar, wenn der horizontale Schieberegler aktiv ist"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:237
+msgid "The following shortcuts are applicable in G-code preview when the vertical slider is active"
+msgstr "Die folgenden Tastenkombinationen sind in der G-Code-Vorschau anwendbar, wenn der vertikale Schieberegler aktiv ist"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+msgid "The following shortcuts are applicable when the specified gizmo is active"
+msgstr "Die folgenden Tastenkombinationen sind anwendbar, wenn das angegebene Gizmo aktiv ist"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2275
msgid "The following SLA printer models have no materials selected:"
msgstr "Bei den folgenden SLA-Druckermodellen wurden keine Materialien ausgewählt:"
-#: src/slic3r/GUI/Tab.cpp:3461
+#: src/slic3r/GUI/SavePresetDialog.cpp:125
msgid "the following suffix is not allowed:"
msgstr "das folgenden Suffix ist nicht erlaubt:"
-#: src/libslic3r/PrintConfig.cpp:2871
+#: src/libslic3r/PrintConfig.cpp:3035
msgid "The gap between the object bottom and the generated pad in zero elevation mode."
msgstr "Der Abstand zwischen dem Objektboden und der erzeugten Grundschicht im Nullhöhenmodus."
-#: src/libslic3r/PrintConfig.cpp:2704
+#: src/libslic3r/PrintConfig.cpp:2868
msgid "The height of the pillar base cone"
msgstr "Die Höhe des Pfeilergrundkegels"
-#: src/slic3r/GUI/DoubleSlider.cpp:1922
+#: src/slic3r/GUI/DoubleSlider.cpp:2140
msgid "The last color change data was saved for a multi extruder printing with tool changes for whole print."
msgstr "Die letzten Farbwechsel-Daten wurden für einen Multi-Extruder-Druck mit Werkzeugwechsel für den gesamten Druck gespeichert."
-#: src/slic3r/GUI/DoubleSlider.cpp:1900 src/slic3r/GUI/DoubleSlider.cpp:1916
+#: src/slic3r/GUI/DoubleSlider.cpp:2119 src/slic3r/GUI/DoubleSlider.cpp:2134
msgid "The last color change data was saved for a multi extruder printing."
msgstr "Die letzten Farbwechsel-Daten wurden für einen Multi-Extruder-Druck gespeichert."
-#: src/slic3r/GUI/DoubleSlider.cpp:1899
+#: src/slic3r/GUI/DoubleSlider.cpp:2118
msgid "The last color change data was saved for a single extruder printing."
msgstr "Die letzten Farbwechsel-Daten wurden für einen Einzel-Extruder-Druck gespeichert."
-#: src/libslic3r/PrintConfig.cpp:2745
+#: src/libslic3r/PrintConfig.cpp:2909
msgid "The max distance of two pillars to get linked with each other. A zero value will prohibit pillar cascading."
msgstr "Der maximale Abstand zwischen 2 Pfeilern, die miteinander verbunden werden. Ein Wert von null verhindert die Kaskadierung von Pfeilern."
-#: src/libslic3r/PrintConfig.cpp:2736
+#: src/libslic3r/PrintConfig.cpp:2900
msgid "The max length of a bridge"
msgstr "Die maximale Länge einer Überbrückung"
-#: src/libslic3r/PrintConfig.cpp:2714
+#: src/libslic3r/PrintConfig.cpp:190
+msgid "The maximum detour length for avoid crossing perimeters. If the detour is longer than this value, avoid crossing perimeters is not applied for this travel path. Detour length could be specified either as an absolute value or as percentage (for example 50%) of a direct travel path."
+msgstr "Die maximale Umleitungslänge für kreuzen der Kontur vermeiden. Wenn die Umleitung länger als dieser Wert ist, wird die Umgehung von Konturen nicht für diesen Fahrweg angewendet. Die Umleitungslänge kann entweder als absoluter Wert oder als Prozentsatz (z. B. 50 %) eines direkten Verfahrwegs angegeben werden."
+
+#: src/libslic3r/PrintConfig.cpp:2878
msgid "The minimum distance of the pillar base from the model in mm. Makes sense in zero elevation mode where a gap according to this parameter is inserted between the model and the pad."
msgstr "Der Mindestabstand des Säulenfußes zum Modell in mm. Sinnvoll im Nullhöhenmodus, bei dem ein Spalt gemäß diesem Parameter zwischen Modell und Grundschicht eingefügt wird."
-#: src/libslic3r/PrintConfig.cpp:185
+#: src/slic3r/GUI/SavePresetDialog.cpp:142
+msgid "The name cannot be empty."
+msgstr "Name kann nicht leer sein."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:152
+msgid "The name cannot end with space character."
+msgstr "Der Name darf nicht mit einem Leerzeichen enden."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:147
+msgid "The name cannot start with space character."
+msgstr "Der Name darf nicht mit einem Leerzeichen beginnen."
+
+#: src/libslic3r/PrintConfig.cpp:219
msgid "The number of bottom solid layers is increased above bottom_solid_layers if necessary to satisfy minimum thickness of bottom shell."
msgstr "Die Anzahl der unteren Massivschichten wird über bottom_solid_layers erhöht, wenn es notwendig ist, um die Mindeststärke der Bodenschale zu erfüllen."
-#: src/libslic3r/PrintConfig.cpp:2143
+#: src/libslic3r/PrintConfig.cpp:2286
msgid "The number of top solid layers is increased above top_solid_layers if necessary to satisfy minimum thickness of top shell. This is useful to prevent pillowing effect when printing with variable layer height."
msgstr "Die Anzahl der obersten Massivschichten wird über top_solid_layers erhöht, wenn es notwendig ist, um die Mindeststärke der Oberschale zu erfüllen. Dies ist nützlich, um einen Kisseneffekt beim Drucken mit variabler Lagenhöhe zu verhindern."
-#: src/libslic3r/PrintConfig.cpp:2277
+#: src/slic3r/GUI/Plater.cpp:2326
+msgid "The object appears to be saved in inches"
+msgstr "Das Objekt scheint in Zoll gespeichert zu sein"
+
+#: src/libslic3r/PrintConfig.cpp:2420
msgid "The object will be grown/shrunk in the XY plane by the configured value (negative = inwards, positive = outwards). This might be useful for fine-tuning hole sizes."
msgstr "Das Objekt wird in der XY-Ebene um den konfigurierten Wert (negativ = einwärts, positiv = auswärts) vergrößert/verkleinert. Dies kann bei der Feinabstimmung von Lochgrößen hilfreich sein."
-#: src/libslic3r/PrintConfig.cpp:1503
+#: src/libslic3r/PrintConfig.cpp:1611
msgid "The object will be raised by this number of layers, and support material will be generated under it."
msgstr "Das Objekt wird um diese Anzahl von Schichten angehoben, und darunter wird Trägermaterial erzeugt."
-#: src/libslic3r/PrintConfig.cpp:2424
-msgid ""
-"The percentage of the bed area. \n"
-"If the print area exceeds the specified value, \n"
-"then a slow tilt will be used, otherwise - a fast tilt"
-msgstr ""
-"Der Prozentsatz der Druckbettfläche.\n"
-"Wenn der Druckbereich den angegebenen Wert überschreitet,\n"
-"wird eine langsame Verkippung verwendet, andernfalls - eine schnelle Verkippung"
+#: src/libslic3r/PrintConfig.cpp:2803
+msgid "The percentage of smaller pillars compared to the normal pillar diameter which are used in problematic areas where a normal pilla cannot fit."
+msgstr "Der Prozentsatz der im Vergleich zum normalen Pfeilerdurchmesser kleineren Pfeiler, die in problematischen Bereichen eingesetzt werden, in die ein normaler Pfeiler nicht passt."
+
+#: src/libslic3r/PrintConfig.cpp:2567
+msgid "The percentage of the bed area. \nIf the print area exceeds the specified value, \nthen a slow tilt will be used, otherwise - a fast tilt"
+msgstr "Der Prozentsatz der Druckbettfläche.\nWenn der Druckbereich den angegebenen Wert überschreitet,\nwird eine langsame Verkippung verwendet, andernfalls - eine schnelle Verkippung"
-#: src/slic3r/GUI/GUI_App.cpp:932
-msgid "The presets on the following tabs were modified"
-msgstr "Die Voreinstellungen auf den folgenden Reitern wurden geändert"
+#: src/slic3r/GUI/Tab.cpp:3430
+msgid "The physical printer(s) below is based on the preset, you are going to delete."
+msgstr "Der (die) untenstehende(n) physische(n) Drucker basiert (basieren) auf der Voreinstellung, die Sie löschen möchten."
-#: src/libslic3r/PrintConfig.cpp:1846
+#: src/slic3r/GUI/Tab.cpp:3438
+msgid "The physical printer(s) below is based only on the preset, you are going to delete."
+msgstr "Der (die) untenstehende(n) physische(n) Drucker basiert (basieren) nur auf der Voreinstellung, die Sie löschen möchten."
+
+#: src/slic3r/GUI/GUI_App.cpp:1676
+msgid "The preset(s) modifications are successfully saved"
+msgstr "Die Änderungen der Voreinstellung(en) wurden erfolgreich gespeichert"
+
+#: src/libslic3r/PrintConfig.cpp:1988
msgid "The printer multiplexes filaments into a single hot end."
msgstr "Der Drucker multiplext mehrere Filamente in einem Hotend."
-#: src/libslic3r/Format/3mf.cpp:1630
+#: src/libslic3r/Format/3mf.cpp:1667
msgid "The selected 3mf file has been saved with a newer version of %1% and is not compatible."
msgstr "Die ausgewählte 3mf-Datei wurde mit einer neueren Version von %1% gespeichert und ist nicht kompatibel."
-#: src/libslic3r/Format/AMF.cpp:934
+#: src/libslic3r/Format/AMF.cpp:955
msgid "The selected amf file has been saved with a newer version of %1% and is not compatible."
msgstr "Die ausgewählte amf-Datei wurde mit einer neueren Version von %1% gespeichert und ist nicht kompatibel."
-#: src/slic3r/GUI/BedShapeDialog.cpp:513
+#: src/slic3r/GUI/Plater.cpp:4751
+msgid "The selected file"
+msgstr "Die gewählte Datei"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:589
msgid "The selected file contains no geometry."
msgstr "Die ausgewählte Datei enthält keine Geometrie."
-#: src/slic3r/GUI/BedShapeDialog.cpp:517
+#: src/slic3r/GUI/BedShapeDialog.cpp:593
msgid "The selected file contains several disjoint areas. This is not supported."
msgstr "Die ausgewählte Datei enthält mehrere nicht zusammenhängende Bereiche. Dies wird nicht unterstützt."
-#: src/slic3r/GUI/Plater.cpp:2970
+#: src/slic3r/GUI/Plater.cpp:2763
msgid "The selected object can't be split because it contains more than one volume/material."
msgstr "Das ausgewählte Objekt konnte nicht getrennt werden, weil es aus mehr als einem Volumen/Material besteht."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2270 src/slic3r/GUI/Plater.cpp:2978
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2436 src/slic3r/GUI/Plater.cpp:2771
msgid "The selected object couldn't be split because it contains only one part."
msgstr "Das ausgewählte Objekt konnte nicht getrennt werden, da es nur aus einem Teil besteht."
-#: src/slic3r/GUI/MainFrame.cpp:461
-msgid ""
-"The selected project is no longer available.\n"
-"Do you want to remove it from the recent projects list?"
-msgstr ""
-"Das ausgewählte Projekt ist nicht mehr verfügbar.\n"
-"Wollen Sie es aus der Liste der letzten Projekte entfernen?"
+#: src/slic3r/GUI/MainFrame.cpp:1003
+msgid "The selected project is no longer available.\nDo you want to remove it from the recent projects list?"
+msgstr "Das ausgewählte Projekt ist nicht mehr verfügbar.\nWollen Sie es aus der Liste der letzten Projekte entfernen?"
-#: src/slic3r/GUI/DoubleSlider.cpp:998
-msgid ""
-"The sequential print is on.\n"
-"It's impossible to apply any custom G-code for objects printing sequentually.\n"
-"This code won't be processed during G-code generation."
-msgstr ""
-"Der sequentielle Druck ist eingeschaltet.\n"
-"Es ist unmöglich, einen benutzerdefinierten G-Code für Objekte anzuwenden, die sequentiell gedruckt werden.\n"
-"Dieser Code wird bei der G-Code-Generierung nicht verarbeitet."
+#: src/slic3r/GUI/DoubleSlider.cpp:1121
+msgid "The sequential print is on.\nIt's impossible to apply any custom G-code for objects printing sequentually.\nThis code won't be processed during G-code generation."
+msgstr "Der sequentielle Druck ist eingeschaltet.\nEs ist unmöglich, einen benutzerdefinierten G-Code für Objekte anzuwenden, die sequentiell gedruckt werden.\nDieser Code wird bei der G-Code-Generierung nicht verarbeitet."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1187
+msgid "The size of the object can be specified in inches"
+msgstr "Die Größe des Objekts kann in Zoll angegeben werden"
-#: src/libslic3r/PrintConfig.cpp:2846
+#: src/libslic3r/PrintConfig.cpp:3010
msgid "The slope of the pad wall relative to the bed plane. 90 degrees means straight walls."
msgstr "Die Neigung der Grundschichtwand in Bezug auf die Druckbettebene. 90 Grad bedeutet gerade Wände."
-#: src/libslic3r/PrintConfig.cpp:1614
+#: src/libslic3r/PrintConfig.cpp:1722
msgid "The speed for loading of a filament into extruder after retraction (it only applies to the extruder motor). If left to zero, the retraction speed is used."
msgstr "Die Geschwindigkeit, mit der ein Filament nach dem Einzug wieder in den Extruder vorgeschoben wird. Falls null, wird die Einzugsgeschwindigkeit verwendet."
-#: src/libslic3r/PrintConfig.cpp:1606
+#: src/libslic3r/PrintConfig.cpp:1714
msgid "The speed for retractions (it only applies to the extruder motor)."
msgstr "Die Einzugsgeschwindigkeit (sie betrifft nur den Extruderantrieb)."
-#: src/slic3r/GUI/ConfigManipulation.cpp:81
-#, no-c-format
-msgid ""
-"The Spiral Vase mode requires:\n"
-"- one perimeter\n"
-"- no top solid layers\n"
-"- 0% fill density\n"
-"- no support material\n"
-"- Ensure vertical shell thickness enabled\n"
-"- Detect thin walls disabled"
-msgstr ""
-"Der Spiralvasenmodus erfordert:\n"
-"- einen Perimeter\n"
-"- keine oberen massiven Schichten\n"
-"- 0% Fülldichte\n"
-"- kein Stützmaterial\n"
-"- Vertikale Schalenstärke sicherstellen aktiv\n"
-"- Dünne Wände erkennen nicht aktiv"
-
-#: src/libslic3r/Print.cpp:1237
-msgid "The Spiral Vase option can only be used when printing a single object."
-msgstr "Die Option Spiralvase kann nur beim Drucken eines einzelnen Objekts verwendet werden."
-
-#: src/libslic3r/Print.cpp:1244
+#: src/slic3r/GUI/ConfigManipulation.cpp:80
+#, possible-c-format
+msgid "The Spiral Vase mode requires:\n- one perimeter\n- no top solid layers\n- 0% fill density\n- no support material\n- Ensure vertical shell thickness enabled\n- Detect thin walls disabled"
+msgstr "Der Spiralvasenmodus erfordert:\n- einen Perimeter\n- keine oberen massiven Schichten\n- 0% Fülldichte\n- kein Stützmaterial\n- Vertikale Schalenstärke sicherstellen aktiv\n- Dünne Wände erkennen nicht aktiv"
+
+#: src/libslic3r/Print.cpp:1270
msgid "The Spiral Vase option can only be used when printing single material objects."
msgstr "Die Option Spiralvase kann nur beim Drucken von Objekten aus einem einzigen Material verwendet werden."
-#: src/slic3r/GUI/Tab.cpp:3068
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:464
msgid "The supplied name is empty. It can't be saved."
msgstr "Der angegebene Name ist leer. Die Speicherung kann nicht erfolgen."
-#: src/slic3r/GUI/Tab.cpp:3465
+#: src/slic3r/GUI/SavePresetDialog.cpp:131
msgid "The supplied name is not available."
msgstr "Der angegebene Name ist nicht verfügbar."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3819
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3926 src/slic3r/GUI/Tab.cpp:3456
-#: src/slic3r/GUI/Tab.cpp:3460
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4282
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4409
+#: src/slic3r/GUI/SavePresetDialog.cpp:116
+#: src/slic3r/GUI/SavePresetDialog.cpp:124
msgid "The supplied name is not valid;"
msgstr "Der angegebene Name ist ungültig;"
-#: src/libslic3r/Print.cpp:1222
+#: src/libslic3r/Print.cpp:1248
msgid "The supplied settings will cause an empty print."
msgstr "Die vorgenommenen Einstellungen führen zu einem leeren Druck."
-#: src/libslic3r/PrintConfig.cpp:2789
+#: src/libslic3r/PrintConfig.cpp:2953
msgid "The thickness of the pad and its optional cavity walls."
msgstr "Die Stärke der Grundschicht und seine optionalen Hohlraumwände."
-#: src/libslic3r/PrintConfig.cpp:1911
+#: src/slic3r/GUI/GUI_App.cpp:1781
+msgid "The uploads are still ongoing"
+msgstr "Die Uploads sind noch im Gange"
+
+#: src/libslic3r/PrintConfig.cpp:2053
msgid "The vertical distance between object and support material interface. Setting this to 0 will also prevent Slic3r from using bridge flow and speed for the first object layer."
msgstr "Der vertikale Abstand zwischen Objekt und Trägermaterialschnittstelle. Wenn Sie diesen Wert auf 0 setzen, wird PrusaSlicer auch verhindern, dass Bridge-Flow und -Geschwindigkeit für die erste Objektschicht verwendet werden."
-#: src/slic3r/GUI/Tab.cpp:2575
-msgid ""
-"The Wipe option is not available when using the Firmware Retraction mode.\n"
-"\n"
-"Shall I disable it in order to enable Firmware Retraction?"
-msgstr ""
-"Die Reinigungsoption ist nicht verfügbar, wenn der Firmware-Einzug verwendet wird.\n"
-"\n"
-"Soll ich sie ausschalten, um den Firmware-Einzug zu aktivieren?"
+#: src/slic3r/GUI/Tab.cpp:2731
+msgid "The Wipe option is not available when using the Firmware Retraction mode.\n\nShall I disable it in order to enable Firmware Retraction?"
+msgstr "Die Reinigungsoption ist nicht verfügbar, wenn der Firmware-Einzug verwendet wird.\n\nSoll ich sie ausschalten, um den Firmware-Einzug zu aktivieren?"
-#: src/libslic3r/Print.cpp:1268
+#: src/libslic3r/Print.cpp:1294
msgid "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)."
msgstr "Der Reinigungsturm unterstützt derzeit kein volumetrisches E (use_volumetric_e=0)."
-#: src/slic3r/GUI/ConfigManipulation.cpp:115
-msgid ""
-"The Wipe Tower currently supports the non-soluble supports only\n"
-"if they are printed with the current extruder without triggering a tool change.\n"
-"(both support_material_extruder and support_material_interface_extruder need to be set to 0)."
-msgstr ""
-"Der Reinigungsturm unterstützt derzeit nur die unlöslichen Stützen, wenn sie mit dem aktuellen Extruder gedruckt werden, ohne einen Werkzeugwechsel auszulösen.\n"
-"(sowohl der Stützstruktur-Extruder als auch der Stützstruktur-Schnittstellen-Extruder müssen auf 0 eingestellt sein)"
+#: src/slic3r/GUI/ConfigManipulation.cpp:114
+msgid "The Wipe Tower currently supports the non-soluble supports only\nif they are printed with the current extruder without triggering a tool change.\n(both support_material_extruder and support_material_interface_extruder need to be set to 0)."
+msgstr "Der Reinigungsturm unterstützt derzeit nur die unlöslichen Stützen, wenn sie mit dem aktuellen Extruder gedruckt werden, ohne einen Werkzeugwechsel auszulösen.\n(sowohl der Stützmaterial-Extruder als auch der Stützmaterial-Schnittstellen-Extruder müssen auf 0 eingestellt sein)"
-#: src/libslic3r/Print.cpp:1400
+#: src/libslic3r/Print.cpp:1426
msgid "The Wipe Tower currently supports the non-soluble supports only if they are printed with the current extruder without triggering a tool change. (both support_material_extruder and support_material_interface_extruder need to be set to 0)."
msgstr "Der Reinigungsturm unterstützt zur Zeit nichtlösliche Stützen nur, falls sie mit dem aktuellen Extruder ohne einen Werkzeugwechsel gedruckt werden (sowohl support_material_extruder wie auch support_material_interface_extruder müssen auf null gesetzt werden)."
-#: src/libslic3r/Print.cpp:1270
+#: src/libslic3r/Print.cpp:1296
msgid "The Wipe Tower is currently not supported for multimaterial sequential prints."
msgstr "Der Wischturm wird derzeit nicht für sequentielle Multimaterialdrucke unterstützt."
-#: src/libslic3r/Print.cpp:1262
-msgid "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter and Repetier G-code flavors."
-msgstr "Der Reinigungsturm wird derzeit nur für die Varianten Marlin und RepRap/Sprinter und Repetier G-Code unterstützt."
+#: src/libslic3r/Print.cpp:1290
+msgid "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, RepRapFirmware and Repetier G-code flavors."
+msgstr "Der Wischturm wird derzeit nur für die Varianten Marlin, RepRap/Sprinter, RepRapFirmware und Repetier-G-Code unterstützt."
-#: src/libslic3r/Print.cpp:1264
+#: src/libslic3r/Print.cpp:1290
msgid "The Wipe Tower is currently only supported with the relative extruder addressing (use_relative_e_distances=1)."
msgstr "Der Wischturm wird derzeit nur mit relativer Extruder-Adressierung unterstützt ((use_relative_e_distances=1)."
-#: src/libslic3r/Print.cpp:1293
+#: src/libslic3r/Print.cpp:1319
msgid "The Wipe Tower is only supported for multiple objects if they are printed over an equal number of raft layers"
msgstr "Der Wischturm wird nur für mehrere Objekte unterstützt, wenn diese mit der gleichen Anzahl von Raftschichten gedruckt werden"
-#: src/libslic3r/Print.cpp:1295
+#: src/libslic3r/Print.cpp:1321
msgid "The Wipe Tower is only supported for multiple objects if they are printed with the same support_material_contact_distance"
msgstr "Der Wischturm wird nur für mehrere Objekte unterstützt, wenn diese mit der gleichen support_material_contact_distance gedruckt werden"
-#: src/libslic3r/Print.cpp:1297
+#: src/libslic3r/Print.cpp:1323
msgid "The Wipe Tower is only supported for multiple objects if they are sliced equally."
msgstr "Der Wischturm wird nur für mehrere Objekte unterstützt, wenn diese gleich gesliced werden."
-#: src/libslic3r/Print.cpp:1291
+#: src/libslic3r/Print.cpp:1317
msgid "The Wipe Tower is only supported for multiple objects if they have equal layer heights"
msgstr "Der Wischturm wird nur für mehrere Objekte unterstützt, wenn diese die gleiche Schichthöhe haben"
-#: src/libslic3r/Print.cpp:1257
+#: src/libslic3r/Print.cpp:1283
msgid "The wipe tower is only supported if all extruders have the same nozzle diameter and use filaments of the same diameter."
msgstr "Der Wischturm wird nur unterstützt, wenn alle Extruder den gleichen Düsendurchmesser haben und Filamente mit dem gleichen Durchmesser verwenden."
-#: src/libslic3r/Print.cpp:1339
+#: src/libslic3r/Print.cpp:1365
msgid "The Wipe tower is only supported if all objects have the same variable layer height"
msgstr "Der Reinigungsturm wird nur unterstützt, wenn alle Objekte die gleiche variable Schichthöhe haben"
-#: src/libslic3r/SLAPrintSteps.cpp:621
+#: src/slic3r/GUI/Plater.cpp:3563
+msgid "There are active warnings concerning sliced models:"
+msgstr "Es gibt aktive Warnungen zu gesliceten Modellen:"
+
+#: src/libslic3r/SLAPrintSteps.cpp:619
msgid "There are unprintable objects. Try to adjust support settings to make the objects printable."
msgstr "Es gibt nicht druckbare Objekte. Versuchen Sie, die Stützeinstellungen anzupassen, um die Objekte druckbar zu machen."
-#: src/slic3r/GUI/DoubleSlider.cpp:1030
-msgid ""
-"There is a color change for extruder that has not been used before.\n"
-"Check your settings to avoid redundant color changes."
-msgstr ""
-"Es gibt einen Farbwechsel für den Extruder, der bisher noch nicht verwendet wurde.\n"
-"Überprüfen Sie Ihre Einstellungen, um überflüssige Farbwechsel zu vermeiden."
+#: src/slic3r/GUI/DoubleSlider.cpp:1155
+msgid "There is a color change for extruder that has not been used before.\nCheck your settings to avoid redundant color changes."
+msgstr "Es gibt einen Farbwechsel für den Extruder, der bisher noch nicht verwendet wurde.\nÜberprüfen Sie Ihre Einstellungen, um überflüssige Farbwechsel zu vermeiden."
-#: src/slic3r/GUI/DoubleSlider.cpp:1024
-msgid ""
-"There is a color change for extruder that won't be used till the end of print job.\n"
-"This code won't be processed during G-code generation."
-msgstr ""
-"Es gibt einen Farbwechsel für den Extruder, der nicht vor dem Ende des Druckauftrags verwendet wird.\n"
-"Dieser Code wird bei der G-Code-Generierung nicht verarbeitet."
+#: src/slic3r/GUI/DoubleSlider.cpp:1149
+msgid "There is a color change for extruder that won't be used till the end of print job.\nThis code won't be processed during G-code generation."
+msgstr "Es gibt einen Farbwechsel für den Extruder, der nicht vor dem Ende des Druckauftrags verwendet wird.\nDieser Code wird bei der G-Code-Generierung nicht verarbeitet."
-#: src/slic3r/GUI/DoubleSlider.cpp:1027
-msgid ""
-"There is an extruder change set to the same extruder.\n"
-"This code won't be processed during G-code generation."
-msgstr ""
-"Es gibt einen Extruderwechsel, der auf denselben Extruder eingestellt ist.\n"
-"Dieser Code wird während der G-Code-Generierung nicht verarbeitet."
+#: src/slic3r/GUI/DoubleSlider.cpp:1152
+msgid "There is an extruder change set to the same extruder.\nThis code won't be processed during G-code generation."
+msgstr "Es gibt einen Extruderwechsel, der auf denselben Extruder eingestellt ist.\nDieser Code wird während der G-Code-Generierung nicht verarbeitet."
+
+#: src/libslic3r/GCode.cpp:604
+msgid "There is an object with no extrusions on the first layer."
+msgstr "Es gibt ein Objekt ohne Extrusionen in der ersten Schicht."
#: src/slic3r/GUI/UpdateDialogs.cpp:225
-#, c-format
+#, possible-c-format
msgid "This %s version: %s"
msgstr "Diese %s Version: %s"
-#: src/slic3r/GUI/Tab.cpp:982
-msgid ""
-"This action is not revertable.\n"
-"Do you want to proceed?"
-msgstr ""
-"Diese Aktion ist nicht umkehrbar.\n"
-"Wollen Sie fortfahren?"
+#: src/slic3r/GUI/Tab.cpp:1244
+msgid "This action is not revertable.\nDo you want to proceed?"
+msgstr "Diese Aktion ist nicht umkehrbar.\nWollen Sie fortfahren?"
-#: src/libslic3r/PrintConfig.cpp:165
+#: src/libslic3r/PrintConfig.cpp:199
msgid "This code is inserted between objects when using sequential printing. By default extruder and bed temperature are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."
msgstr "Dieser Code wird beim sequentiellen Drucken zwischen Objekten eingefügt. Standardmäßig werden Extruder- und Betttemperatur mit dem Befehl, der nicht auf die Änderung wartet, zurückgesetzt. Wenn jedoch M104, M109, M140 oder M190 in diesem benutzerdefinierten Code erkannt werden, fügt Slic3r keine Temperaturbefehle hinzu. Beachten Sie, dass Sie Platzhaltervariablen für alle PrusaSlicer-Einstellungen verwenden können, so dass Sie einen \"M109 S[first_layer_temperature]\"-Befehl an beliebiger Stelle platzieren können."
-#: src/libslic3r/PrintConfig.cpp:1081
+#: src/libslic3r/PrintConfig.cpp:1174
msgid "This custom code is inserted at every layer change, right after the Z move and before the extruder moves to the first layer point. Note that you can use placeholder variables for all Slic3r settings as well as [layer_num] and [layer_z]."
msgstr "Dieser benutzerdefinierte Code wird bei jedem Schichtwechsel eingefügt, direkt nach der Z-Bewegung und bevor der Extruder zum ersten Lagenpunkt fährt. Beachten Sie, dass Sie Platzhaltervariablen für alle Slic3r-Einstellungen sowie [layer_num] und [layer_z] verwenden können."
-#: src/libslic3r/PrintConfig.cpp:154
+#: src/libslic3r/PrintConfig.cpp:188
msgid "This custom code is inserted at every layer change, right before the Z move. Note that you can use placeholder variables for all Slic3r settings as well as [layer_num] and [layer_z]."
msgstr "Dieser benutzerdefinierte Code wird bei jedem Lagenwechsel, unmittelbar vor der Z Bewegung, eingefügt. Beachten Sie, dass Sie Platzhaltervariablen für alle PrusaSlicer-Einstellungen sowie [layer_num] und [layer_z] verwenden können."
-#: src/libslic3r/PrintConfig.cpp:2094
+#: src/libslic3r/PrintConfig.cpp:2237
msgid "This custom code is inserted before every toolchange. Placeholder variables for all PrusaSlicer settings as well as {previous_extruder} and {next_extruder} can be used. When a tool-changing command which changes to the correct extruder is included (such as T{next_extruder}), PrusaSlicer will emit no other such command. It is therefore possible to script custom behaviour both before and after the toolchange."
msgstr "Dieser benutzerdefinierte Code wird vor jedem Werkzeugwechsel eingefügt. Platzhaltervariablen für alle PrusaSlicer-Einstellungen sowie {previous_extruder} und {next_extruder} können verwendet werden. Wenn ein Werkzeugwechselbefehl enthalten ist, der zum richtigen Extruder wechselt (z.B. T{next_extruder}), gibt PrusaSlicer keinen anderen solchen Befehl aus. Es ist daher möglich, benutzerdefiniertes Verhalten sowohl vor als auch nach dem Werkzeugwechsel zu skripten."
-#: src/libslic3r/PrintConfig.cpp:396
+#: src/libslic3r/PrintConfig.cpp:430
msgid "This end procedure is inserted at the end of the output file, before the printer end gcode (and before any toolchange from this filament in case of multimaterial printers). Note that you can use placeholder variables for all PrusaSlicer settings. If you have multiple extruders, the gcode is processed in extruder order."
msgstr "Dieser Endvorgang wird am Ende der Ausgabedatei, vor dem G-Code des Druckerendes (und vor jedem Werkzeugwechsel von diesem Filament bei Multimaterialdruckern) eingefügt. Beachten Sie, dass Sie Platzhaltervariablen für alle PrusaSlicer-Einstellungen verwenden können. Wenn Sie mehrere Extruder haben, wird der gcode in Extruderreihenfolge verarbeitet."
-#: src/libslic3r/PrintConfig.cpp:386
+#: src/libslic3r/PrintConfig.cpp:420
msgid "This end procedure is inserted at the end of the output file. Note that you can use placeholder variables for all PrusaSlicer settings."
msgstr "Diese Endprozedur wird am Ende der Ausgabedatei eingefügt. Beachten Sie, dass Sie Platzhaltervariablen für alle PrusaSlicer-Einstellungen verwenden können."
-#: src/libslic3r/PrintConfig.cpp:1258 src/libslic3r/PrintConfig.cpp:1269
+#: src/libslic3r/PrintConfig.cpp:1366 src/libslic3r/PrintConfig.cpp:1377
msgid "This experimental setting is used to limit the speed of change in extrusion rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds."
msgstr "Diese experimentelle Einstellung beschränkt die Änderungsgeschwindigkeit der Extrusionsmenge. Ein Wert von 1.8 mm³/s² gewährleistet, dass eine Änderung der Extrusionsmenge von 1.8 mm³/s (0.45mm Extrusionsbreite, 0.2mm Extrusionshöhe, Vorschub 20 mm/s) zu 5.4 mm³/s (Vorschub 60 mm/s) mindestens 2 Sekunden dauern wird."
-#: src/libslic3r/PrintConfig.cpp:1248
+#: src/libslic3r/PrintConfig.cpp:1356
msgid "This experimental setting is used to set the maximum volumetric speed your extruder supports."
msgstr "Diese experimentelle Einstellung gibt die maximale volumetrische Geschwindigkeit an, die von Ihrem Extruder unterstützt wird."
-#: src/libslic3r/PrintConfig.cpp:2162
+#: src/libslic3r/PrintConfig.cpp:2305
msgid "This experimental setting uses G10 and G11 commands to have the firmware handle the retraction. This is only supported in recent Marlin."
msgstr "Diese experimentelle Einstellung benutzt G10 und G11 Befehle, damit die Druckerfirmware den Einzug übernimmt. Dies wird nur von neueren Marlin-Versionen unterstützt."
-#: src/libslic3r/PrintConfig.cpp:2176
+#: src/libslic3r/PrintConfig.cpp:2319
msgid "This experimental setting uses outputs the E values in cubic millimeters instead of linear millimeters. If your firmware doesn't already know filament diameter(s), you can put commands like 'M200 D[filament_diameter_0] T0' in your start G-code in order to turn volumetric mode on and use the filament diameter associated to the filament selected in Slic3r. This is only supported in recent Marlin."
msgstr "Diese experimentelle Einstellung generiert E-Koordinaten in Kubikmillimetern stat in linearen Millimetern. Wenn die Firmware den Filamentdurchmesser noch nicht kennt, können Sie Befehle wie 'M200 D[filament_diameter_0] T0' in den Start-G-Code eingeben, um den volumetrischen Modus zu aktivieren und den in PrusaSlicer angegebenen Filamentdurchmesser zu benutzen. Dies wird nur von neueren Marlin-Versionen unterstützt."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3972
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4459
msgid "This extruder will be set for selected items"
msgstr "Dieser Extruder wird den gewählten Elementen zugeordnet"
-#: src/libslic3r/PrintConfig.cpp:224
+#: src/libslic3r/PrintConfig.cpp:258
msgid "This factor affects the amount of plastic for bridging. You can decrease it slightly to pull the extrudates and prevent sagging, although default settings are usually good and you should experiment with cooling (use a fan) before tweaking this."
msgstr "Diese Einstellung beeinflusst den Materialausstoss bei Brücken. Sie können den Wert leicht verringern, um die Extrusionsfäden zu strecken und ein Durchhängen zu vermeiden. Die Standardwerte sind aber normalerweise ausreichend und Sie sollten zuerst mit der Lüftergeschwindigkeit experimentieren, bevor Sie diesen Wert verändern."
-#: src/libslic3r/PrintConfig.cpp:546
+#: src/libslic3r/PrintConfig.cpp:582
msgid "This factor changes the amount of flow proportionally. You may need to tweak this setting to get nice surface finish and correct single wall widths. Usual values are between 0.9 and 1.1. If you think you need to change this more, check filament diameter and your firmware E steps."
msgstr "Dieser Faktor ändert die Extrusionsmenge proportional. Sie müssen diese Einstellung möglicherweise anpassen, um schöne Oberflächen und korrekte Hüllenstärken zu erhalten. Die üblichen Werte bewegen sich zwischen 0,9 und 1,1. Falls Sie größere Anpassungen eingeben müssen, kontrollieren Sie auch den Filamentdurchmesser und die E-Schritte in Ihrer Firmware."
-#: src/libslic3r/PrintConfig.cpp:214
+#: src/libslic3r/PrintConfig.cpp:248
msgid "This fan speed is enforced during all bridges and overhangs."
msgstr "Die Lüftergeschwindigkeit, die für Überbrückungen und Überhänge benutzt wird."
-#: src/libslic3r/PrintConfig.cpp:992
+#: src/libslic3r/PrintConfig.cpp:1036
msgid "This feature allows to combine infill and speed up your print by extruding thicker infill layers while preserving thin perimeters, thus accuracy."
msgstr "Diese Einstellung erlaubt es, Infill zu kombinieren und die Druckdauer zu verringern, indem stärkere Infill-Schichten gedruckt werden, während gleichzeitig dünne Außenkonturen und damit die Genauigkeit erhalten bleiben."
-#: src/libslic3r/PrintConfig.cpp:1746
+#: src/libslic3r/PrintConfig.cpp:1861
msgid "This feature allows to force a solid layer every given number of layers. Zero to disable. You can set this to any value (for example 9999); Slic3r will automatically choose the maximum possible number of layers to combine according to nozzle diameter and layer height."
msgstr "Diese Einstellung erzwingt eine massive Schicht nach einer vorgegebenen Anzahl von Schichten. Null deaktiviert diese Einstellung. Sie können jeden Wert eingeben (z.B. 9999); PrusaSlicer wird automatisch die größtmögliche Anzahl von Schichten wählen, die in Abhängigkeit von Düsendurchmesser und Schichthöhe kombiniert werden können."
-#: src/libslic3r/PrintConfig.cpp:1795
-msgid "This feature will raise Z gradually while printing a single-walled object in order to remove any visible seam. This option requires a single perimeter, no infill, no top solid layers and no support material. You can still set any number of bottom solid layers as well as skirt/brim loops. It won't work when printing more than an object."
-msgstr "Dieses Verfahren erhöht die Z-Position allmählich, während eine einfache Hülle gedruckt wird, um jeglichen sichtbaren Saum zu vermeiden. Diese Option setzt eine einzige Außenkontur, keinen Infill, keine massiven Deckenschichten und keine Stützen voraus. Sie können immer noch eine beliebige Anzahl von Bodenschichten sowie Schleifen für Schürzen und Rand einstellen. Die Methode funktioniert nicht, wenn mehr als ein Objekt gedruckt wird."
+#: src/libslic3r/PrintConfig.cpp:1995
+msgid "This feature will raise Z gradually while printing a single-walled object in order to remove any visible seam. This option requires a single perimeter, no infill, no top solid layers and no support material. You can still set any number of bottom solid layers as well as skirt/brim loops. It won't work when printing more than one single object."
+msgstr "Diese Funktion hebt Z allmählich an, während ein einwandiges Objekt gedruckt wird, um jede sichtbare Naht zu entfernen. Diese Option erfordert eine einzelne Umrandung, keine Füllung, keine oberen festen Schichten und kein Stützmaterial. Sie können trotzdem eine beliebige Anzahl von unteren massiven Schichten sowie Schürzen-/Randschlaufen einstellen. Sie funktioniert nicht, wenn mehr als ein einzelnes Objekt gedruckt wird."
-#: src/slic3r/GUI/Plater.cpp:2367
+#: src/slic3r/GUI/Plater.cpp:2329
msgid "This file cannot be loaded in a simple mode. Do you want to switch to an advanced mode?"
msgstr "Diese Datei kann nicht im einfachen Modus geladen werden. Möchten Sie in den fortgeschrittenen Modus wechseln?"
-#: src/slic3r/GUI/Plater.cpp:2357
-msgid ""
-"This file contains several objects positioned at multiple heights.\n"
-"Instead of considering them as multiple objects, should I consider\n"
-"this file as a single object having multiple parts?"
+#: src/slic3r/GUI/Plater.cpp:2319
+msgid "This file contains several objects positioned at multiple heights.\nInstead of considering them as multiple objects, should I consider\nthis file as a single object having multiple parts?"
msgstr "Diese Datei enthält mehrere Objekte, die in verschiedenen Höhen positioniert sind. Anstatt sie als mehrere Objekte zu betrachten, soll ich diese Datei als ein einzelnes Objekt mit mehreren Teilen betrachten?"
#: src/slic3r/GUI/FirmwareDialog.cpp:332
-#, c-format
-msgid ""
-"This firmware hex file does not match the printer model.\n"
-"The hex file is intended for: %s\n"
-"Printer reported: %s\n"
-"\n"
-"Do you want to continue and flash this hex file anyway?\n"
-"Please only continue if you are sure this is the right thing to do."
-msgstr ""
-"Diese Firmware-Hex-Datei stimmt nicht mit dem Druckermodell überein.\n"
-"Die Hex-Datei ist für: %s\n"
-"Drucker erkannt: %s\n"
-"\n"
-"Möchtest Sie fortfahren und diese Hex-Datei trotzdem flashen?\n"
-"Bitte fahren Sie nur fort, wenn Sie der festen Ãœberzeugung sind, dass dies das Richtige ist."
-
-#: src/libslic3r/PrintConfig.cpp:314
+#, possible-c-format
+msgid "This firmware hex file does not match the printer model.\nThe hex file is intended for: %s\nPrinter reported: %s\n\nDo you want to continue and flash this hex file anyway?\nPlease only continue if you are sure this is the right thing to do."
+msgstr "Diese Firmware-Hex-Datei stimmt nicht mit dem Druckermodell überein.\nDie Hex-Datei ist für: %s\nDrucker erkannt: %s\n\nMöchtest Sie fortfahren und diese Hex-Datei trotzdem flashen?\nBitte fahren Sie nur fort, wenn Sie der festen Überzeugung sind, dass dies das Richtige ist."
+
+#: src/libslic3r/PrintConfig.cpp:348
msgid "This flag enables the automatic cooling logic that adjusts print speed and fan speed according to layer printing time."
msgstr "Diese Einstellung aktiviert the Logik, die die Druckgeschwindigkeit und Lüftergeschwindigkeit automatisch gemäß der Schichtdruckdauer regelt."
-#: src/slic3r/GUI/Plater.cpp:536
+#: src/slic3r/GUI/Plater.cpp:402
msgid "This flag enables the brim that will be printed around each object on the first layer."
msgstr "Dieses Kontrollkästchen aktiviert den Rand (Brim), der um jedes Objekt auf der ersten Ebene gedruckt wird."
-#: src/libslic3r/PrintConfig.cpp:1538
+#: src/libslic3r/PrintConfig.cpp:1646
msgid "This flag enforces a retraction whenever a Z move is done."
msgstr "Diese Stellung erzwingt einen Einzug bei jeder Z-Bewegung."
-#: src/libslic3r/PrintConfig.cpp:2194
+#: src/libslic3r/PrintConfig.cpp:2337
msgid "This flag will move the nozzle while retracting to minimize the possible blob on leaky extruders."
msgstr "Diese Einstellung wird die Düse während dem Einzug bewegen, um mögliche Tropfen bei einem undichten Extruder zu minimieren."
-#: src/slic3r/GUI/Tab.cpp:953
+#: src/libslic3r/PrintConfig.cpp:1961
+msgid "This G-code will be used as a code for the color change"
+msgstr "Dieser G-Code wird als Code für den Farbwechsel verwendet"
+
+#: src/libslic3r/PrintConfig.cpp:1970
+msgid "This G-code will be used as a code for the pause print"
+msgstr "Dieser G-Code wird als Code für die Druckpause verwendet"
+
+#: src/libslic3r/PrintConfig.cpp:1979
+msgid "This G-code will be used as a custom code"
+msgstr "Dieser G-Code wird als benutzerdefinierter Code verwendet"
+
+#: src/slic3r/GUI/Tab.cpp:1272
msgid "This is a default preset."
msgstr "Dies ist eine Standard-Voreinstellung."
-#: src/libslic3r/PrintConfig.cpp:2766
+#: src/libslic3r/PrintConfig.cpp:2930
msgid "This is a relative measure of support points density."
msgstr "Dies ist ein relatives Maß für die Dichte der Stützpunkte."
-#: src/slic3r/GUI/Tab.cpp:2338
+#: src/slic3r/GUI/Tab.cpp:2507
msgid "This is a single extruder multimaterial printer, diameters of all extruders will be set to the new value. Do you want to proceed?"
msgstr "Dies ist ein Einzelextruder-Multimaterialdrucker, die Durchmesser aller Extruder werden auf den neuen Wert eingestellt. Möchten Sie fortfahren?"
-#: src/slic3r/GUI/Tab.cpp:955
+#: src/slic3r/GUI/Tab.cpp:1274
msgid "This is a system preset."
msgstr "Dies ist eine Systemvoreinstellung."
-#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:583
+#: src/libslic3r/PrintConfig.cpp:559 src/libslic3r/PrintConfig.cpp:619
msgid "This is only used in the Slic3r interface as a visual help."
msgstr "Dies wird nur als visuelles Hilfsmittel in der PrusaSlicer-Benutzeroberfläche verwendet."
-#: src/libslic3r/PrintConfig.cpp:336
+#: src/libslic3r/PrintConfig.cpp:370
msgid "This is the acceleration your printer will be reset to after the role-specific acceleration values are used (perimeter/infill). Set zero to prevent resetting acceleration at all."
msgstr "Dies ist der Beschleunigungswert, auf den Ihr Drucker zurückgesetzt wird, nachdem aufgabenspezifische Beschleunigungswerte (Außenkonturen/Infill) verwendet wurden. Setzen Sie dies auf null, um ein Zurückstellen der Beschleunigungswerte zu deaktivieren."
-#: src/libslic3r/PrintConfig.cpp:194
+#: src/libslic3r/PrintConfig.cpp:228
msgid "This is the acceleration your printer will use for bridges. Set zero to disable acceleration control for bridges."
msgstr "Die Beschleunigung, die Ihr Drucker für Brücken verwendet. Setzen Sie dies auf null, um die Beschleunigungskontrolle bei Brücken zu deaktivieren."
-#: src/libslic3r/PrintConfig.cpp:860
+#: src/libslic3r/PrintConfig.cpp:900
msgid "This is the acceleration your printer will use for first layer. Set zero to disable acceleration control for first layer."
msgstr "Die Beschleunigung, die Ihr Drucker für die erste Schicht verwendet. Setzen Sie dies auf null, um die Beschleunigungskontrolle bei der ersten Schicht zu deaktivieren."
-#: src/libslic3r/PrintConfig.cpp:982
+#: src/libslic3r/PrintConfig.cpp:1026
msgid "This is the acceleration your printer will use for infill. Set zero to disable acceleration control for infill."
msgstr "Diese Stellung bestimmt die Beschleunigung des Druckers für Infill. Setzen Sie dies auf null, um die Beschleunigungskontrolle für das Infill zu deaktivieren."
-#: src/libslic3r/PrintConfig.cpp:1400
-msgid "This is the acceleration your printer will use for perimeters. A high value like 9000 usually gives good results if your hardware is up to the job. Set zero to disable acceleration control for perimeters."
-msgstr "Dies ist die Beschleunigung, die der Drucker für Außenkonturen benutzen wird. Ein hoher Wert wie 9000 ergibt üblicherweise gute Resultate falls Ihre Hardware mithalten kann. Setzen Sie dies auf null, um die Beschleunigungskontrolle bei Außenkonturen zu deaktivieren."
+#: src/libslic3r/PrintConfig.cpp:1582
+msgid "This is the acceleration your printer will use for perimeters. Set zero to disable acceleration control for perimeters."
+msgstr "Dies ist die Beschleunigung, die Ihr Drucker für Perimeter verwendet. Setzen Sie Null, um die Beschleunigungssteuerung für Perimeter zu deaktivieren."
-#: src/libslic3r/PrintConfig.cpp:1327
+#: src/libslic3r/PrintConfig.cpp:1435
msgid "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)"
msgstr "Durchmesser der Extruderdüse (z.B.: 0.5, 0.35 usw.)"
-#: src/libslic3r/PrintConfig.cpp:1227
-#, no-c-format
+#: src/libslic3r/PrintConfig.cpp:1335
+#, possible-c-format
msgid "This is the highest printable layer height for this extruder, used to cap the variable layer height and support layer height. Maximum recommended layer height is 75% of the extrusion width to achieve reasonable inter-layer adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter."
msgstr "Dies ist die höchste druckbare Schichthöhe für diesen Extruder, mit der die variable Schichthöhe und Stützschichthöhe abgedeckt wird. Die maximale empfohlene Schichthöhe beträgt 75% der Extrusionsbreite, um eine angemessene Zwischenlagenhaftung zu erreichen. Bei Einstellung auf 0 ist die Lagenhöhe auf 75% des Düsendurchmessers begrenzt."
-#: src/libslic3r/PrintConfig.cpp:1290
+#: src/libslic3r/PrintConfig.cpp:1398
msgid "This is the lowest printable layer height for this extruder and limits the resolution for variable layer height. Typical values are between 0.05 mm and 0.1 mm."
msgstr "Dies ist die niedrigste druckbare Schichthöhe für diesen Extruder und begrenzt die Auflösung bei variabler Schichthöhe. Typische Werte liegen zwischen 0,05 mm und 0,1 mm."
-#: src/libslic3r/GCode.cpp:639
+#: src/libslic3r/GCode.cpp:624
msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed."
msgstr "Dies wird in der Regel durch vernachlässigbar kleine Extrusionen oder durch ein fehlerhaftes Modell verursacht. Versuchen Sie, das Modell zu reparieren oder seine Ausrichtung auf dem Druckbett zu ändern."
-#: src/libslic3r/PrintConfig.cpp:2215
+#: src/libslic3r/PrintConfig.cpp:2358
msgid "This matrix describes volumes (in cubic milimetres) required to purge the new filament on the wipe tower for any given pair of tools."
msgstr "Diese Matrix beschreibt die Volumina (in Kubikmillimetern), die benötigt werden, um das neue Filament auf dem Reinigungsturm für ein bestimmtes Werkzeugpaar zu reinigen."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:878
-msgid ""
-"This operation is irreversible.\n"
-"Do you want to proceed?"
-msgstr ""
-"Dieser Vorgang ist nicht mehr rückgängig zu machen.\n"
-"Möchten Sie fortfahren?"
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:928
+msgid "This operation is irreversible.\nDo you want to proceed?"
+msgstr "Dieser Vorgang ist nicht mehr rückgängig zu machen.\nMöchten Sie fortfahren?"
-#: src/libslic3r/PrintConfig.cpp:1442
+#: src/libslic3r/PrintConfig.cpp:1550
msgid "This option sets the number of perimeters to generate for each layer. Note that Slic3r may increase this number automatically when it detects sloping surfaces which benefit from a higher number of perimeters if the Extra Perimeters option is enabled."
msgstr "Diese Stellung bestimmt die Anzahl der Außenkonturen, die für jede Schicht erzeugt werden. PusaSlicer kann diese Zahl automatisch vergrößern, wenn es schräge Oberflächen erkennt, die sich mit einer höheren Zahl von Außenkonturen besser drucken lassen, wenn die \"Zusätzliche Außenkonturen falls notwendig\" Option aktiviert ist."
-#: src/libslic3r/PrintConfig.cpp:1356
+#: src/libslic3r/PrintConfig.cpp:1464
msgid "This option will drop the temperature of the inactive extruders to prevent oozing. It will enable a tall skirt automatically and move extruders outside such skirt when changing temperatures."
msgstr "Mit dieser Option wird die Temperatur der inaktiven Extruder gesenkt, um ein Materialnachsickern zu verhindern. Es aktiviert automatisch eine hohe Schürze und bewegt die Extruder bei Temperaturänderungen außerhalb dieser Schürze."
-#: src/libslic3r/PrintConfig.cpp:1029
+#: src/libslic3r/PrintConfig.cpp:1073
msgid "This option will limit infill to the areas actually needed for supporting ceilings (it will act as internal support material). If enabled, slows down the G-code generation due to the multiple checks involved."
-msgstr "Diese Einstellung beschränkt den Infill auf die Bereiche, die tatsächlich für das Stützen von Decken benötigt werden (der Infill dient hier als interne Stützstruktur). Falls aktiviert, kann dies die Erstellung des G-Codes wegen zusätzlichen Kontrollschritten verlangsamen."
+msgstr "Diese Einstellung beschränkt den Infill auf die Bereiche, die tatsächlich für das Stützen von Decken benötigt werden (der Infill dient hier als internes Stützmaterial). Falls aktiviert, kann dies die Erstellung des G-Codes wegen zusätzlichen Kontrollschritten verlangsamen."
-#: src/libslic3r/PrintConfig.cpp:1022
+#: src/libslic3r/PrintConfig.cpp:1066
msgid "This option will switch the print order of perimeters and infill, making the latter first."
msgstr "Diese Einstellungen kehrt die Druckreihenfolge von Außenkonturen und Infill um, sodass der Infill zuerst gedruckt wird."
-#: src/libslic3r/PrintConfig.cpp:459
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:85
+msgid "This printer will be shown in the presets list as"
+msgstr "Dieser Drucker wird in der Voreinstellungsliste angezeigt als"
+
+#: src/libslic3r/PrintConfig.cpp:495
msgid "This separate setting will affect the speed of external perimeters (the visible ones). If expressed as percentage (for example: 80%) it will be calculated on the perimeters speed setting above. Set to zero for auto."
msgstr "Diese separate Einstellung wirkt sich auf die Geschwindigkeit der äußeren (sichtbaren) Außenkonturen aus. Als Prozentwert eingegeben (z.B. 80%), wird sie ausgehend von der obigen Geschwindigkeitseinstellung für Außenkonturen berechnet. Für die automatische Berechnung auf null setzen."
-#: src/libslic3r/PrintConfig.cpp:1717
+#: src/libslic3r/PrintConfig.cpp:1832
msgid "This separate setting will affect the speed of perimeters having radius <= 6.5mm (usually holes). If expressed as percentage (for example: 80%) it will be calculated on the perimeters speed setting above. Set to zero for auto."
msgstr "Diese separate Einstellung wirkt sich auf die Geschwindigkeit von Außenkonturen mit einem Radius <= 6,5 mm (üblicherweise Bohrungen) aus. Als Prozentwert eingegeben (z.B. 80%), wird sie ausgehend von der obigen Geschwindigkeitseinstellung für Außenkonturen berechnet. Für eine automatische Berechnung setzen Sie dies auf null."
-#: src/libslic3r/PrintConfig.cpp:1038
+#: src/libslic3r/PrintConfig.cpp:1082
msgid "This setting applies an additional overlap between infill and perimeters for better bonding. Theoretically this shouldn't be needed, but backlash might cause gaps. If expressed as percentage (example: 15%) it is calculated over perimeter extrusion width."
msgstr "Diese Einstellung fügt eine zusätzliche Überlappung zwischen Außenkonturen und Infill ein, um die Haftung zu verbessern. Theoretisch sollte dies nicht notwendig sein, doch vorhandenes Getriebespiel könnte Lücken erzeugen. Als Prozentwert eingegeben (z.B. 15%) wird sie ausgehend von der Extrusionsbreite für die Außenkontur ausgerechnet."
@@ -8222,123 +9507,129 @@ msgstr "Diese Einstellung fügt eine zusätzliche Überlappung zwischen Außenko
msgid "This setting controls the height (and thus the total number) of the slices/layers. Thinner layers give better accuracy but take more time to print."
msgstr "Diese Einstellung bestimmt die Höhe (und damit die Gesamtanzahl) der Scheiben/Schichten. Dünnere Schichten ergeben eine bessere Genauigkeit, benötigen aber mehr Zeit zum Drucken."
-#: src/libslic3r/PrintConfig.cpp:1218
+#: src/libslic3r/PrintConfig.cpp:1326
msgid "This setting represents the maximum speed of your fan."
msgstr "Diese Einstellung bestimmt die maximale Geschwindigkeit Ihres Lüfters."
-#: src/libslic3r/PrintConfig.cpp:1281
+#: src/libslic3r/PrintConfig.cpp:1389
msgid "This setting represents the minimum PWM your fan needs to work."
msgstr "Diese Einstellung gibt den minimalen PWM-Wert an, den Ihr Lüfter für den Betrieb benötigt."
-#: src/libslic3r/PrintConfig.cpp:1829
+#: src/libslic3r/PrintConfig.cpp:1944
msgid "This start procedure is inserted at the beginning, after any printer start gcode (and after any toolchange to this filament in case of multi-material printers). This is used to override settings for a specific filament. If PrusaSlicer detects M104, M109, M140 or M190 in your custom codes, such commands will not be prepended automatically so you're free to customize the order of heating commands and other custom actions. Note that you can use placeholder variables for all PrusaSlicer settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want. If you have multiple extruders, the gcode is processed in extruder order."
msgstr "Dieser Startvorgang wird am Anfang, nach jedem Drucker-Startgcode (und nach jedem Werkzeugwechsel zu diesem Filament bei Multi-Material-Druckern) eingefügt. Dies wird verwendet, um die Einstellungen für einen bestimmten Filament zu überschreiben. Wenn PrusaSlicer M104, M109, M140 oder M190 in Ihren benutzerdefinierten Codes erkennt, werden solche Befehle nicht automatisch vorangestellt, so dass Sie die Reihenfolge der Heizbefehle und andere benutzerdefinierte Aktionen anpassen können. Beachten Sie, dass Sie Platzhaltervariablen für alle PrusaSlicer-Einstellungen verwenden können, so dass Sie einen Befehl \"M109 S[first_layer_temperature]\" beliebig platzieren können. Wenn Sie mehrere Extruder haben, wird der gcode in Extruderreihenfolge verarbeitet."
-#: src/libslic3r/PrintConfig.cpp:1814
+#: src/libslic3r/PrintConfig.cpp:1929
msgid "This start procedure is inserted at the beginning, after bed has reached the target temperature and extruder just started heating, and before extruder has finished heating. If PrusaSlicer detects M104 or M190 in your custom codes, such commands will not be prepended automatically so you're free to customize the order of heating commands and other custom actions. Note that you can use placeholder variables for all PrusaSlicer settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."
msgstr "Dieser Startvorgang wird am Anfang eingefügt, nachdem das Bett die Solltemperatur erreicht hat und der Extruder gerade mit dem Erwärmen begonnen hat, und bevor der Extruder das Erwärmen beendet hat. Wenn PrusaSlicer M104 oder M190 in Ihren benutzerdefinierten Codes erkennt, werden solche Befehle nicht automatisch vorangestellt, so dass Sie die Reihenfolge der Heizbefehle und andere benutzerdefinierte Aktionen anpassen können. Beachten Sie, dass Sie Platzhaltervariablen für alle PrusaSlicer-Einstellungen verwenden können, so dass Sie einen Befehl \"M109 S[first_layer_temperature]\" beliebig platzieren können."
-#: src/libslic3r/PrintConfig.cpp:695
+#: src/libslic3r/PrintConfig.cpp:731
msgid "This string is edited by RammingDialog and contains ramming specific parameters."
msgstr "Diese Zeichenfolge wird vom RammDialog angepasst und enthält für das Rammen spezifische Parameter."
-#: src/libslic3r/PrintConfig.cpp:2286
+#: src/libslic3r/PrintConfig.cpp:2429
msgid "This value will be added (or subtracted) from all the Z coordinates in the output G-code. It is used to compensate for bad Z endstop position: for example, if your endstop zero actually leaves the nozzle 0.3mm far from the print bed, set this to -0.3 (or fix your endstop)."
msgstr "Dieser Wert wird zu allen Z-Koordinaten im ausgegebenen G-Code hinzuaddiert oder davon abgezogen. Damit kann eine fehlerhafte Z-Endanschlagsposition kompensiert werden: wenn z.B. bei Ihrem Nullwert die Druckdüse sich beim Endanschlag 0.3mm über der Druckplatte befindet, setzen Sie diesen Wert auf -0.3 (oder stellen Sie Ihren Endanschlag neu ein)."
-#: src/libslic3r/PrintConfig.cpp:2208
+#: src/libslic3r/PrintConfig.cpp:2351
msgid "This vector saves required volumes to change from/to each tool used on the wipe tower. These values are used to simplify creation of the full purging volumes below."
msgstr "Dieser Vektor speichert die erforderlichen Volumina für den Wechsel von/zu jedem am Reinigungsturm verwendeten Werkzeug. Diese Werte werden verwendet, um die Erstellung des vollen Reinigungsvolumens zu vereinfachen."
#: src/slic3r/GUI/UpdateDialogs.cpp:216
-#, c-format
-msgid ""
-"This version of %s is not compatible with currently installed configuration bundles.\n"
-"This probably happened as a result of running an older %s after using a newer one.\n"
-"\n"
-"You may either exit %s and try again with a newer version, or you may re-run the initial configuration. Doing so will create a backup snapshot of the existing configuration before installing files compatible with this %s."
-msgstr ""
-"Diese Version von %s ist nicht kompatibel zu den aktuell installierten Konfigurationssammlungen.\n"
-"Dies wurde wahrscheinlich dadurch verursacht, dass Sie eine ältere %s Version benutzt haben, nachdem Sie eine neuere ausgeführt hatten.\n"
-"\n"
-"Sie können %s entweder beenden und es mit einer neueren Version nochmals versuchen, oder Sie können die erstmalige Startkonfiguration nochmals wiederholen. In diesem Fall wird eine Sicherungskopie der aktuellen Konfiguration erstellt, bevor die mit dieser %s-Version kompatiblen Dateien installiert werden."
+#, possible-c-format
+msgid "This version of %s is not compatible with currently installed configuration bundles.\nThis probably happened as a result of running an older %s after using a newer one.\n\nYou may either exit %s and try again with a newer version, or you may re-run the initial configuration. Doing so will create a backup snapshot of the existing configuration before installing files compatible with this %s."
+msgstr "Diese Version von %s ist nicht kompatibel zu den aktuell installierten Konfigurationssammlungen.\nDies wurde wahrscheinlich dadurch verursacht, dass Sie eine ältere %s Version benutzt haben, nachdem Sie eine neuere ausgeführt hatten.\n\nSie können %s entweder beenden und es mit einer neueren Version nochmals versuchen, oder Sie können die erstmalige Startkonfiguration nochmals wiederholen. In diesem Fall wird eine Sicherungskopie der aktuellen Konfiguration erstellt, bevor die mit dieser %s-Version kompatiblen Dateien installiert werden."
-#: src/libslic3r/PrintConfig.cpp:2458
+#: src/libslic3r/PrintConfig.cpp:2601
msgid "This will apply a gamma correction to the rasterized 2D polygons. A gamma value of zero means thresholding with the threshold in the middle. This behaviour eliminates antialiasing without losing holes in polygons."
msgstr "Dadurch wird eine Gammakorrektur auf die gerasterten 2D-Polygone angewendet. Ein Gamma-Wert von null bedeutet Schwellenwertbildung mit dem Schwellenwert in der Mitte. Dieses Verhalten eliminiert Antialiasing, ohne Löcher in Polygonen zu verlieren."
-#: src/libslic3r/PrintConfig.cpp:2081
+#: src/libslic3r/PrintConfig.cpp:2224
msgid "Threads"
msgstr "Threads"
-#: src/libslic3r/PrintConfig.cpp:2082
+#: src/libslic3r/PrintConfig.cpp:2225
msgid "Threads are used to parallelize long-running tasks. Optimal threads number is slightly above the number of available cores/processors."
msgstr "Threads werden benutzt, um mehrere zeitaufwendige Berechnungen gleichzeitig auszuführen. Die optimale Anzahl beträgt etwas mehr als die Anzahl der verfügbaren Kerne/Prozessoren."
-#: src/slic3r/GUI/Tab.cpp:2093
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:235
+msgid "Threshold:"
+msgstr "Schwellwert:"
+
+#: src/slic3r/GUI/Tab.cpp:2263
msgid "Tilt"
msgstr "Kippen"
-#: src/slic3r/GUI/Tab.cpp:2094
+#: src/slic3r/GUI/Tab.cpp:2264
msgid "Tilt time"
msgstr "Kippzeit"
+#: src/slic3r/GUI/GCodeViewer.cpp:2225 src/slic3r/GUI/GCodeViewer.cpp:2233
#: src/slic3r/GUI/RammingChart.cpp:76
msgid "Time"
msgstr "Zeit"
-#: src/libslic3r/PrintConfig.cpp:687
+#: src/libslic3r/PrintConfig.cpp:723
msgid "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new filament during a tool change (when executing the T code). This time is added to the total print time by the G-code time estimator."
msgstr "Zeit, in der die Druckerfirmware (oder die Multi-Material-Einheit 2.0) während eines Werkzeugwechsels (bei Ausführung des T-Codes) ein anderes Filament lädt. Diese Zeit wird vom G-Code Zeitschätzer zur Gesamtdruckzeit addiert."
-#: src/libslic3r/PrintConfig.cpp:702
+#: src/libslic3r/PrintConfig.cpp:738
msgid "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a filament during a tool change (when executing the T code). This time is added to the total print time by the G-code time estimator."
msgstr "Zeit, in der die Druckerfirmware (oder die Multi-Material-Einheit 2.0) während eines Werkzeugwechsels (bei Ausführung des T-Codes) ein Filament entlädt. Diese Zeit wird vom G-Code Zeitschätzer zur Gesamtdruckzeit addiert."
-#: src/libslic3r/PrintConfig.cpp:2407
+#: src/libslic3r/PrintConfig.cpp:2550
msgid "Time of the fast tilt"
msgstr "Dauer des schnellen Kippens"
-#: src/libslic3r/PrintConfig.cpp:2416
+#: src/libslic3r/PrintConfig.cpp:2559
msgid "Time of the slow tilt"
msgstr "Dauer des langsamen Kippens"
-#: src/libslic3r/PrintConfig.cpp:641
+#: src/libslic3r/PrintConfig.cpp:677
msgid "Time to wait after the filament is unloaded. May help to get reliable toolchanges with flexible materials that may need more time to shrink to original dimensions."
msgstr "Wartezeit, nachdem das Filament entladen wurde. Dies kann zu zuverlässigeren Werkzeugwechseln beitragen bei flexiblen Materialien, die mehr Zeit zum Schrumpfen auf ihre ursprüngliche Größe brauchen."
-#: src/slic3r/GUI/Tab.cpp:966
+#: src/slic3r/GUI/GCodeViewer.cpp:2197
+msgid "to"
+msgstr "bis"
+
+#: src/slic3r/GUI/Tab.cpp:1284
msgid "To do that please specify a new name for the preset."
msgstr "Zur Ausführung geben Sie bitte einen neuen Namen für die Voreinstellung ein."
-#: src/slic3r/GUI/Plater.cpp:4014
+#: src/slic3r/GUI/Plater.cpp:3934
msgid "To objects"
msgstr "Zu Objekten"
-#: src/slic3r/GUI/Plater.cpp:4016
+#: src/slic3r/GUI/Plater.cpp:3936
msgid "To parts"
msgstr "Zu Teilen"
-#: src/slic3r/GUI/Tab.cpp:1756
+#: src/slic3r/Utils/Http.cpp:82
+msgid "To specify the system certificate store manually, please set the %1% environment variable to the correct CA bundle and restart the application."
+msgstr "Um den System-Zertifikatspeicher manuell anzugeben, setzen Sie bitte die Umgebungsvariable %1% auf das richtige CA-Bundle und starten Sie die Anwendung neu."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:360
msgid "To use a custom CA file, please import your CA file into Certificate Store / Keychain."
msgstr "Um eine benutzerdefinierte CA-Datei zu verwenden, importieren Sie bitte Ihre CA-Datei in den Zertifikatsspeicher / Schlüsselbund."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263
-#, c-format
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:271
+#, possible-c-format
msgid "Toggle %c axis mirroring"
msgstr "Umschalten der Spiegelung der %c-Achse"
-#: src/libslic3r/Zipper.cpp:34
+#: src/libslic3r/miniz_extension.cpp:93
msgid "too many files"
msgstr "zu viele Dateien"
-#: src/libslic3r/SLAPrintSteps.cpp:190
-msgid "Too much overlapping holes."
+#: src/libslic3r/SLAPrintSteps.cpp:192
+msgid "Too many overlapping holes."
msgstr "Zu viele überlappende Löcher."
-#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/GUI_Preview.cpp:335
-#: src/slic3r/GUI/GUI_Preview.cpp:519 src/slic3r/GUI/GUI_Preview.cpp:574
-#: src/slic3r/GUI/GUI_Preview.cpp:835 src/libslic3r/GCode/PreviewData.cpp:357
+#: src/slic3r/GUI/GCodeViewer.cpp:2241 src/slic3r/GUI/GUI_Preview.cpp:281
+#: src/slic3r/GUI/GUI_Preview.cpp:453 src/slic3r/GUI/GUI_Preview.cpp:693
+#: src/slic3r/GUI/GUI_Preview.cpp:786 src/slic3r/GUI/GUI_Preview.cpp:1270
+#: src/libslic3r/GCode/PreviewData.cpp:362
msgid "Tool"
msgstr "Werkzeug"
@@ -8346,54 +9637,71 @@ msgstr "Werkzeug"
msgid "Tool #"
msgstr "Werkzeug #"
-#: src/slic3r/GUI/Tab.cpp:2000 src/libslic3r/PrintConfig.cpp:2093
+#: src/slic3r/GUI/Tab.cpp:2189 src/libslic3r/PrintConfig.cpp:2236
msgid "Tool change G-code"
msgstr "G-Code für Werkzeugwechsel"
-#: src/slic3r/GUI/Tab.cpp:1491
+#: src/slic3r/GUI/GCodeViewer.cpp:2530 src/slic3r/GUI/GUI_Preview.cpp:1474
+msgid "Tool changes"
+msgstr "Werkzeugwechsel"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:1479
+msgid "Tool marker"
+msgstr "Werkzeugposition"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:223
+msgid "Tool position"
+msgstr "Werkzeugposition"
+
+#: src/slic3r/GUI/Tab.cpp:1837
msgid "Toolchange parameters with single extruder MM printers"
msgstr "Werkzeugwechsel-Parameter für MM-Drucker mit einem Extruder"
#. TRN To be shown in the main menu View->Top
#. TRN To be shown in Print Settings "Top solid layers"
-#: src/slic3r/GUI/MainFrame.cpp:662 src/libslic3r/PrintConfig.cpp:2132
-#: src/libslic3r/PrintConfig.cpp:2141
+#: src/slic3r/GUI/MainFrame.cpp:959 src/slic3r/GUI/MainFrame.cpp:1279
+#: src/libslic3r/PrintConfig.cpp:2275 src/libslic3r/PrintConfig.cpp:2284
msgid "Top"
msgstr "Decke"
-#: src/slic3r/GUI/PresetHints.cpp:304
+#: src/slic3r/GUI/PresetHints.cpp:302
msgid "Top / bottom shell thickness hint: Not available due to invalid layer height."
msgstr "Hinweis zur Ober-/Bodenschalestärke: Nicht verfügbar wegen ungültiger Schichthöhe."
-#: src/libslic3r/PrintConfig.cpp:415
+#: src/libslic3r/PrintConfig.cpp:449
msgid "Top fill pattern"
msgstr "Deckenfüllmuster"
-#: src/slic3r/GUI/PresetHints.cpp:323
+#: src/slic3r/GUI/PresetHints.cpp:321
msgid "Top is open."
msgstr "Oben ist offen."
-#: src/slic3r/GUI/PresetHints.cpp:317
+#: src/slic3r/GUI/PresetHints.cpp:315
msgid "Top shell is %1% mm thick for layer height %2% mm."
msgstr "Die obere Schale ist %1% mm stark für eine Schichthöhe von %2% mm."
-#: src/slic3r/GUI/PresetHints.cpp:192
+#: src/slic3r/GUI/PresetHints.cpp:191
msgid "top solid infill"
msgstr "Oberes massives Infill"
-#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:315
-#: src/libslic3r/PrintConfig.cpp:2105 src/libslic3r/PrintConfig.cpp:2117
+#: src/slic3r/GUI/GUI_Preview.cpp:306 src/libslic3r/ExtrusionEntity.cpp:319
+#: src/libslic3r/ExtrusionEntity.cpp:346 src/libslic3r/PrintConfig.cpp:2248
+#: src/libslic3r/PrintConfig.cpp:2260
msgid "Top solid infill"
msgstr "Oberes massives Infill"
-#: src/libslic3r/PrintConfig.cpp:2135
+#: src/libslic3r/PrintConfig.cpp:2278
msgid "Top solid layers"
msgstr "Obere massive Schichten"
-#: src/slic3r/GUI/MainFrame.cpp:662
+#: src/slic3r/GUI/MainFrame.cpp:959 src/slic3r/GUI/MainFrame.cpp:1279
msgid "Top View"
msgstr "Ansicht von oben"
+#: src/libslic3r/PrintConfig.cpp:1211
+msgid "Topmost surface only"
+msgstr "Nur oberste Fläche"
+
#: src/slic3r/GUI/WipeTowerDialog.cpp:285
msgid "Total purging volume is calculated by summing two values below, depending on which tools are loaded/unloaded."
msgstr "Das gesamte Reinigungsvolumen wird durch die Addition folgender zwei Werte berechnet, je nachdem welche Werkzeuge geladen/entladen sind."
@@ -8406,172 +9714,180 @@ msgstr "Gesamtes Rammvolumen"
msgid "Total ramming time"
msgstr "Gesamte Rammdauer"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:640
+msgid "Transfer"
+msgstr "Transfer"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:745
+msgid "Transfer the selected options to the newly selected preset \"%1%\"."
+msgstr "Übertragen der ausgewählten Optionen auf die neu gewählte Voreinstellung \"%1%\"."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:740
+msgid "Transfer the selected settings to the newly selected preset."
+msgstr "Übertragen der gewählten Einstellungen auf die neu gewählte Voreinstellung."
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:561
msgid "Translate"
-msgstr "Ãœbersetzen"
+msgstr "Versetzen"
-#: src/slic3r/GUI/Mouse3DController.cpp:300
-#: src/slic3r/GUI/Mouse3DController.cpp:317
+#: src/slic3r/GUI/Mouse3DController.cpp:282
+#: src/slic3r/GUI/Mouse3DController.cpp:303
msgid "Translation"
-msgstr "Ãœbersetzung"
+msgstr "Position"
-#: src/slic3r/GUI/GUI_Preview.cpp:253 src/libslic3r/PrintConfig.cpp:2152
+#: src/slic3r/GUI/GCodeViewer.cpp:2489 src/slic3r/GUI/GUI_Preview.cpp:335
+#: src/slic3r/GUI/GUI_Preview.cpp:1471 src/libslic3r/PrintConfig.cpp:2295
msgid "Travel"
msgstr "Eilgang"
-#: src/libslic3r/PrintConfig.cpp:845
+#: src/libslic3r/PrintConfig.cpp:883
msgid "Triangles"
msgstr "Dreiecke"
-#: src/libslic3r/PrintConfig.cpp:3448
+#: src/libslic3r/PrintConfig.cpp:3647
msgid "Try to repair any non-manifold meshes (this option is implicitly added whenever we need to slice the model to perform the requested action)."
msgstr "Repariere alle ungeschlossenen Netze (diese Option wird implizit hinzugefügt, wenn wir das Modell slicen müssen, um die gewünschte Aktion ausführen zu können)."
-#: src/libslic3r/PrintConfig.cpp:1467
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:165
+msgid "Type here the name of your printer device"
+msgstr "Geben Sie hier den Namen Ihres Druckers ein"
+
+#: src/libslic3r/PrintConfig.cpp:1575
msgid "Type of the printer."
msgstr "Druckertyp."
-#: src/slic3r/GUI/ConfigWizard.cpp:2013 src/slic3r/GUI/GUI_ObjectList.cpp:3553
+#: src/slic3r/GUI/ConfigWizard.cpp:2524 src/slic3r/GUI/ConfigWizard.cpp:2526
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4016
msgid "Type:"
msgstr "Typ:"
-#: src/slic3r/GUI/Plater.cpp:3428
+#: src/slic3r/GUI/OpenGLManager.cpp:275
+#, possible-c-format
+msgid "Unable to load the following shaders:\n%s"
+msgstr "Die folgenden Shader konnten nicht geladen werden:\n%s"
+
+#: src/slic3r/GUI/Plater.cpp:3233
msgid "Unable to reload:"
msgstr "Kann nicht nachgeladen werden:"
-#: src/libslic3r/Zipper.cpp:32
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:137
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:146
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:845
+msgid "Undef"
+msgstr "Undef"
+
+#: src/libslic3r/miniz_extension.cpp:91
msgid "undefined error"
msgstr "unbekannter Fehler"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4624 src/slic3r/GUI/KBShortcutsDialog.cpp:130
-#: src/slic3r/GUI/MainFrame.cpp:581
+#: src/slic3r/GUI/GLCanvas3D.cpp:5028 src/slic3r/GUI/KBShortcutsDialog.cpp:125
+#: src/slic3r/GUI/MainFrame.cpp:1187
msgid "Undo"
msgstr "Undo"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4065
-#, c-format
+#: src/slic3r/GUI/GLCanvas3D.cpp:4382
+#, possible-c-format
msgid "Undo %1$d Action"
msgid_plural "Undo %1$d Actions"
msgstr[0] "Undo %1$d Aktion"
msgstr[1] "Undo %1$d Aktionen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4047
+#: src/slic3r/GUI/GLCanvas3D.cpp:4361
msgid "Undo History"
msgstr "Undo Verlauf"
-#: src/libslic3r/Zipper.cpp:56
+#: src/libslic3r/miniz_extension.cpp:115
msgid "unexpected decompressed size"
msgstr "unerwartete dekomprimierte Größe"
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:27
+#: src/slic3r/GUI/GUI_Preview.cpp:299 src/libslic3r/ExtrusionEntity.cpp:310
msgid "Unknown"
msgstr "Unbekannt"
-#: src/slic3r/Utils/Duet.cpp:82 src/slic3r/Utils/Duet.cpp:137
-#: src/slic3r/Utils/FlashAir.cpp:119 src/slic3r/Utils/FlashAir.cpp:140
-#: src/slic3r/Utils/FlashAir.cpp:156
+#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:139
+#: src/slic3r/Utils/FlashAir.cpp:122 src/slic3r/Utils/FlashAir.cpp:143
+#: src/slic3r/Utils/FlashAir.cpp:159
msgid "Unknown error occured"
msgstr "Unbekannter Fehler aufgetreten"
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:178
+msgid "Unknown error occured during exporting G-code."
+msgstr "Unbekannter Fehler trat beim Exportieren von G-Code auf."
+
#: src/slic3r/GUI/WipeTowerDialog.cpp:263
msgid "unloaded"
msgstr "entladen wird"
-#: src/libslic3r/PrintConfig.cpp:623
+#: src/libslic3r/PrintConfig.cpp:659
msgid "Unloading speed"
msgstr "Entladegeschwindigkeit"
-#: src/libslic3r/PrintConfig.cpp:632
+#: src/libslic3r/PrintConfig.cpp:668
msgid "Unloading speed at the start"
msgstr "Entladegeschwindigkeit zu Beginn"
-#: src/slic3r/GUI/Tab.cpp:3256
+#: src/slic3r/GUI/Tab.cpp:3693
msgid "UNLOCKED LOCK"
msgstr "OFFENES SCHLOSS"
-#: src/slic3r/GUI/Tab.cpp:3282
-msgid ""
-"UNLOCKED LOCK icon indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\n"
-"Click to reset all settings for current option group to the system (or default) values."
-msgstr ""
-"Das Symbol GEÖFFNETES SCHLOSS zeigt an, dass einige Einstellungen geändert wurden und nicht mehr mit den System- (oder Standard-) Werte für die aktuelle Optionsgruppe identisch sind.\n"
-"Klicken Sie, um alle Einstellungen für die aktuelle Optionsgruppe auf die System- (oder Standard-) Werte zurückzusetzen."
+#: src/slic3r/GUI/Tab.cpp:3719
+msgid "UNLOCKED LOCK icon indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\nClick to reset all settings for current option group to the system (or default) values."
+msgstr "Das Symbol GEÖFFNETES SCHLOSS zeigt an, dass einige Einstellungen geändert wurden und nicht mehr mit den System- (oder Standard-) Werte für die aktuelle Optionsgruppe identisch sind.\nKlicken Sie, um alle Einstellungen für die aktuelle Optionsgruppe auf die System- (oder Standard-) Werte zurückzusetzen."
-#: src/slic3r/GUI/Tab.cpp:3297
-msgid ""
-"UNLOCKED LOCK icon indicates that the value was changed and is not equal to the system (or default) value.\n"
-"Click to reset current value to the system (or default) value."
-msgstr ""
-"Das Symbol GEÖFFNETES SCHLOSS zeigt an, dass der Wert geändert wurde und nicht mit der System- (oder Standard-) Einstellung identisch ist.\n"
-"Klicken Sie, um den aktuellen Wert auf die System- (oder Standard-) Einstellung zurückzusetzen."
-
-#: src/slic3r/GUI/Plater.cpp:5203
-#, c-format
-msgid "Unmounting successful. The device %s(%s) can now be safely removed from the computer."
-msgstr "Aushängen erfolgreich. Das Gerät %s(%s) kann nun sicher vom Computer entfernt werden."
-
-#: src/slic3r/GUI/GUI_Preview.cpp:255
-msgid "Unretractions"
-msgstr "Wiedereinzüge"
+#: src/slic3r/GUI/Tab.cpp:3734
+msgid "UNLOCKED LOCK icon indicates that the value was changed and is not equal to the system (or default) value.\nClick to reset current value to the system (or default) value."
+msgstr "Das Symbol GEÖFFNETES SCHLOSS zeigt an, dass der Wert geändert wurde und nicht mit der System- (oder Standard-) Einstellung identisch ist.\nKlicken Sie, um den aktuellen Wert auf die System- (oder Standard-) Einstellung zurückzusetzen."
-#: src/slic3r/GUI/Tab.cpp:2947
-msgid "Unsaved Changes"
-msgstr "Nicht abgespeicherte Änderungen"
-
-#: src/slic3r/GUI/GUI_App.cpp:935
-msgid "Unsaved Presets"
-msgstr "Nicht abgespeicherte Voreinstellungen"
-
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:173
msgid "Unselect gizmo or clear selection"
msgstr "Gizmo abwählen oder Auswahl löschen"
-#: src/libslic3r/Zipper.cpp:60
+#: src/libslic3r/miniz_extension.cpp:119
msgid "unsupported central directory size"
msgstr "nicht unterstützte zentrale Verzeichnisgröße"
-#: src/libslic3r/Zipper.cpp:40
+#: src/libslic3r/miniz_extension.cpp:99
msgid "unsupported encryption"
msgstr "nicht unterstützte Verschlüsselung"
-#: src/libslic3r/Zipper.cpp:42
+#: src/libslic3r/miniz_extension.cpp:101
msgid "unsupported feature"
msgstr "nicht unterstützte Funktion"
-#: src/libslic3r/Zipper.cpp:38
+#: src/libslic3r/miniz_extension.cpp:97
msgid "unsupported method"
msgstr "nicht unterstützte Methode"
-#: src/libslic3r/Zipper.cpp:50
+#: src/libslic3r/miniz_extension.cpp:109
msgid "unsupported multidisk archive"
msgstr "nicht unterstütztes Multidisk-Archiv"
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:292
+#: src/slic3r/GUI/OpenGLManager.cpp:267
msgid "Unsupported OpenGL version"
msgstr "Nicht unterstützte OpenGL Version"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3420
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3883
msgid "Unsupported selection"
msgstr "Nicht unterstützte Auswahl"
-#: src/slic3r/GUI/GLCanvas3D.cpp:955
-#, c-format
-msgid "up to %.2f mm"
-msgstr "bis zu %.2f mm"
+#: src/slic3r/GUI/GCodeViewer.cpp:2183
+msgid "up to"
+msgstr "bis zu"
#: src/slic3r/GUI/UpdateDialogs.cpp:38
msgid "Update available"
msgstr "Ein Update ist verfügbar"
-#: src/slic3r/GUI/ConfigWizard.cpp:779 src/slic3r/GUI/Preferences.cpp:80
+#: src/slic3r/GUI/ConfigWizard.cpp:1138 src/slic3r/GUI/Preferences.cpp:97
msgid "Update built-in Presets automatically"
msgstr "Eingebaute Voreinstellungen automatisch aktualisieren"
-#: src/slic3r/GUI/ConfigWizard.cpp:761
+#: src/slic3r/GUI/ConfigWizard.cpp:1120
msgid "Updates"
msgstr "Updates"
-#: src/slic3r/GUI/ConfigWizard.cpp:786
+#: src/slic3r/GUI/ConfigWizard.cpp:1145
msgid "Updates are never applied without user's consent and never overwrite user's customized settings."
msgstr "Updates werden niemals ohne das Einverständnis des Benutzers ausgeführt, und werden niemals die vom Benutzer geänderten Einstellungen überschreiben."
@@ -8579,7 +9895,7 @@ msgstr "Updates werden niemals ohne das Einverständnis des Benutzers ausgeführ
msgid "Upgrade"
msgstr "Aktualisieren"
-#: src/slic3r/GUI/GUI_App.cpp:824
+#: src/slic3r/GUI/GUI_App.cpp:1522
msgid "Upload a firmware image into an Arduino based printer"
msgstr "Lade ein Firmware Image zu einem Arduino-basierten Drucker hoch"
@@ -8595,101 +9911,122 @@ msgstr "Transferiere zum Druckerhost mit dem Dateinamen:"
msgid "Uploading"
msgstr "Lade hoch"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:204
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:206
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
msgid "Upper Layer"
msgstr "Obere Schicht"
-#: src/slic3r/GUI/Tab.cpp:1900
-msgid "USB/Serial connection"
-msgstr "USB/Serielle Verbindung"
-
-#: src/libslic3r/PrintConfig.cpp:1662
-msgid "USB/serial port for printer connection."
-msgstr "USB-/serielle Schnittstelle für den Druckeranschluss."
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
+msgid "Upper layer"
+msgstr "Obere Schicht"
-#: src/slic3r/GUI/DoubleSlider.cpp:1147
+#: src/slic3r/GUI/DoubleSlider.cpp:1276
msgid "Use another extruder"
msgstr "Einen anderen Extruder verwenden"
-#: src/slic3r/GUI/Preferences.cpp:143
+#: src/slic3r/GUI/Preferences.cpp:220
msgid "Use custom size for toolbar icons"
msgstr "Benutzerdefinierte Größe für Symbolleistensymbole verwenden"
-#: src/libslic3r/PrintConfig.cpp:2161
+#: src/slic3r/GUI/Preferences.cpp:268
+msgid "Use environment map"
+msgstr "Environment Map verwenden"
+
+#: src/libslic3r/PrintConfig.cpp:2304
msgid "Use firmware retraction"
msgstr "Firmware-Einzug aktivieren"
+#: src/slic3r/GUI/ImGuiWrapper.cpp:800 src/slic3r/GUI/Search.cpp:464
+msgid "Use for search"
+msgstr "Zur Suche verwenden"
+
+#: src/libslic3r/PrintConfig.cpp:1218
+msgid "Use for time estimate"
+msgstr "Zur Zeitschätzung verwenden"
+
#: src/slic3r/GUI/PrintHostDialogs.cpp:42
msgid "Use forward slashes ( / ) as a directory separator if needed."
msgstr "Benutzen Sie den Schrägstrich (/) als Verzeichnistrenner falls nötig."
-#: src/slic3r/GUI/Preferences.cpp:126
+#: src/slic3r/GUI/Preferences.cpp:191
msgid "Use free camera"
msgstr "Benutze freie Kamera"
-#: src/libslic3r/PrintConfig.cpp:2780
+#: src/slic3r/GUI/ConfigWizard.cpp:1188
+msgid "Use inches"
+msgstr "Zoll verwenden"
+
+#: src/libslic3r/PrintConfig.cpp:2944
msgid "Use pad"
msgstr "Grundschicht benutzen"
-#: src/slic3r/GUI/Preferences.cpp:119
+#: src/slic3r/GUI/Preferences.cpp:184
msgid "Use perspective camera"
msgstr "Benutze perspektivische Kamera"
-#: src/libslic3r/PrintConfig.cpp:2168
+#: src/libslic3r/PrintConfig.cpp:2311
msgid "Use relative E distances"
msgstr "Relative Abstände für Extrusion benutzen"
-#: src/slic3r/GUI/Preferences.cpp:104
+#: src/slic3r/GUI/Preferences.cpp:135
msgid "Use Retina resolution for the 3D scene"
msgstr "Verwende Retina Auflösung für die 3D Anzeige"
-#: src/libslic3r/PrintConfig.cpp:540
+#: src/libslic3r/PrintConfig.cpp:576
msgid "Use this option to set the axis letter associated to your printer's extruder (usually E but some printers use A)."
msgstr "Verwenden Sie diese Einstellung, um den Buchstaben der Achse anzugeben, die mit Ihrem Extruder verknüpft ist (normalerweise E, aber bei manchen Druckern ist dies A)."
-#: src/libslic3r/PrintConfig.cpp:1893
+#: src/libslic3r/PrintConfig.cpp:2035
msgid "Use this setting to rotate the support material pattern on the horizontal plane."
-msgstr "Verwenden Sie diese Einstellung, um das Muster für die Stützstrukturen auf der horizontalen Ebene zu drehen."
+msgstr "Verwenden Sie diese Einstellung, um das Muster des Stützmaterials auf der horizontalen Ebene zu drehen."
-#: src/libslic3r/PrintConfig.cpp:2175
+#: src/libslic3r/PrintConfig.cpp:2318
msgid "Use volumetric E"
msgstr "Volumetrisches E benutzen"
-#: src/slic3r/GUI/DoubleSlider.cpp:1171
+#: src/slic3r/GUI/DoubleSlider.cpp:1298
msgid "used"
msgstr "genutzt"
-#: src/slic3r/GUI/Plater.cpp:237
+#: src/slic3r/GUI/Plater.cpp:243
msgid "Used Filament (g)"
msgstr "Filamentbedarf (g)"
-#: src/slic3r/GUI/Plater.cpp:235 src/slic3r/GUI/Plater.cpp:1229
+#: src/slic3r/GUI/Plater.cpp:1141
+msgid "Used Filament (in)"
+msgstr "Filamentbedarf (Zoll)"
+
+#: src/slic3r/GUI/Plater.cpp:1153
+msgid "Used Filament (in³)"
+msgstr "Filamentbedarf (Zoll³)"
+
+#: src/slic3r/GUI/Plater.cpp:241 src/slic3r/GUI/Plater.cpp:1141
msgid "Used Filament (m)"
msgstr "Filamentbedarf (Meter)"
-#: src/slic3r/GUI/Plater.cpp:236
+#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1153
msgid "Used Filament (mm³)"
msgstr "Filamentbedarf (mm³)"
-#: src/slic3r/GUI/Plater.cpp:1191
+#: src/slic3r/GUI/Plater.cpp:1100
msgid "Used Material (ml)"
msgstr "Benutztes Material (ml)"
-#: src/slic3r/GUI/Plater.cpp:238
+#: src/slic3r/GUI/Plater.cpp:244
msgid "Used Material (unit)"
msgstr "Benutztes Material (Einheit)"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 src/libslic3r/PrintConfig.cpp:132
msgid "User"
msgstr "Benutzer"
-#: src/slic3r/GUI/Preset.cpp:1168 src/slic3r/GUI/Preset.cpp:1288
-#: src/slic3r/GUI/PresetBundle.cpp:1677
+#: src/slic3r/GUI/PresetComboBoxes.cpp:230
+#: src/slic3r/GUI/PresetComboBoxes.cpp:778
+#: src/slic3r/GUI/PresetComboBoxes.cpp:934
msgid "User presets"
msgstr "Benutzerdefinierte Voreinstellungen"
-#: src/libslic3r/Zipper.cpp:90
+#: src/libslic3r/miniz_extension.cpp:149
msgid "validation failed"
msgstr "Überprüfung fehlgeschlagen"
@@ -8701,31 +10038,31 @@ msgstr "Der Wert ist gleich wie die Systemeinstellung"
msgid "Value was changed and is not equal to the system value or the last saved preset"
msgstr "Der Wert wurde geändert und ist nicht gleich wie die Systemeinstellung oder die letzte abgespeicherte Voreinstellung"
-#: src/slic3r/GUI/Tab.cpp:2202
+#: src/slic3r/GUI/Tab.cpp:2371
msgid "Values in this column are for Normal mode"
msgstr "Werte in dieser Spalte sind für den normalen Modus"
-#: src/slic3r/GUI/Tab.cpp:2208
+#: src/slic3r/GUI/Tab.cpp:2377
msgid "Values in this column are for Stealth mode"
msgstr "Werte in dieser Spalte sind für den Stealth Modus"
-#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/slic3r/GUI/GLCanvas3D.cpp:4573
+#: src/slic3r/GUI/GLCanvas3D.cpp:231 src/slic3r/GUI/GLCanvas3D.cpp:4978
msgid "Variable layer height"
msgstr "Variable Schichthöhe"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1709
+#: src/slic3r/GUI/GLCanvas3D.cpp:1786
msgid "Variable layer height - Adaptive"
msgstr "Variable Schichthöhe - Adaptiv"
-#: src/slic3r/GUI/GLCanvas3D.cpp:599
+#: src/slic3r/GUI/GLCanvas3D.cpp:565
msgid "Variable layer height - Manual edit"
msgstr "Variable Schichthöhe - Manuell bearbeiten"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1701
+#: src/slic3r/GUI/GLCanvas3D.cpp:1778
msgid "Variable layer height - Reset"
msgstr "Variable Schichthöhe - Zurücksetzen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1717
+#: src/slic3r/GUI/GLCanvas3D.cpp:1794
msgid "Variable layer height - Smooth all"
msgstr "Variable Schichthöhe - Alles glätten"
@@ -8733,19 +10070,20 @@ msgstr "Variable Schichthöhe - Alles glätten"
msgid "variants"
msgstr "Varianten"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:971
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:1289
msgid "vendor"
msgstr "Hersteller"
-#: src/slic3r/GUI/ConfigWizard.cpp:565
+#: src/slic3r/GUI/ConfigWizard.cpp:589
msgid "Vendor:"
msgstr "Hersteller:"
-#: src/libslic3r/PrintConfig.cpp:928
+#: src/libslic3r/PrintConfig.cpp:972
msgid "Verbose G-code"
msgstr "Ausführlicher G-Code"
-#: src/slic3r/GUI/AboutDialog.cpp:231 src/slic3r/GUI/MainFrame.cpp:64
+#: src/slic3r/GUI/AboutDialog.cpp:256 src/slic3r/GUI/GUI_App.cpp:239
+#: src/slic3r/GUI/MainFrame.cpp:164
msgid "Version"
msgstr "Version"
@@ -8753,24 +10091,48 @@ msgstr "Version"
msgid "version"
msgstr "Version"
-#: src/slic3r/GUI/Tab.cpp:1053
+#: src/slic3r/GUI/Tab.cpp:1375
msgid "Vertical shells"
msgstr "Vertikale Konturhüllen"
-#: src/slic3r/GUI/GUI_Preview.cpp:218
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:237
+msgid "Vertical Slider"
+msgstr "Vertikaler Schieberegler"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:212
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:231
+msgid "Vertical slider - Move active thumb Down"
+msgstr "Vertikaler Schieberegler - Aktiven Schieber nach unten bewegen"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:211
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:230
+msgid "Vertical slider - Move active thumb Up"
+msgstr "Vertikaler Schieberegler - Aktiven Schieber nach oben bewegen"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:265 src/slic3r/GUI/GUI_Preview.cpp:271
msgid "View"
msgstr "Ansicht"
-#: src/slic3r/GUI/ConfigWizard.cpp:813
+#: src/slic3r/GUI/ConfigWizard.cpp:1172
msgid "View mode"
msgstr "Anzeigemodus"
-#: src/libslic3r/SLAPrintSteps.cpp:413 src/libslic3r/SLAPrintSteps.cpp:422
-#: src/libslic3r/SLAPrintSteps.cpp:461
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:666
+msgid "Visit \"Preferences\" and check \"%1%\"\nto be asked about unsaved changes again."
+msgstr "Besuchen Sie \"Präferenzen\" und überprüfen Sie \"%1%\",\num über nicht gespeicherte Änderungen wieder gefragt zu werden."
+
+#: src/libslic3r/PrintConfig.cpp:3553
+msgid "Visualize an already sliced and saved G-code"
+msgstr "Visualisierung eines bereits gesliceten und gespeicherten G-Codes"
+
+#: src/libslic3r/SLAPrintSteps.cpp:411 src/libslic3r/SLAPrintSteps.cpp:420
+#: src/libslic3r/SLAPrintSteps.cpp:459
msgid "Visualizing supports"
-msgstr "Anzeigen der Stützstrukturen"
+msgstr "Anzeigen der Stützen"
-#: src/slic3r/GUI/Plater.cpp:161
+#: src/slic3r/GUI/Plater.cpp:167
msgid "Volume"
msgstr "Volumen"
@@ -8778,23 +10140,23 @@ msgstr "Volumen"
msgid "Volume to purge (mm³) when the filament is being"
msgstr "Volumen zum Reinigen (mm³) wenn das Filament ist"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1106
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1230
msgid "Volumes in Object reordered"
msgstr "Volumen in Objekt neu angeordnet"
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:218
msgid "Volumetric"
msgstr "Volumetrisch"
-#: src/slic3r/GUI/Tab.cpp:1591
+#: src/slic3r/GUI/Tab.cpp:1930
msgid "Volumetric flow hints not available"
msgstr "Hinweise zum Volumenstrom nicht verfügbar"
-#: src/slic3r/GUI/GUI_Preview.cpp:226
+#: src/slic3r/GUI/GUI_Preview.cpp:280
msgid "Volumetric flow rate"
msgstr "Volumetrische Flussrate"
-#: src/libslic3r/GCode/PreviewData.cpp:355
+#: src/slic3r/GUI/GCodeViewer.cpp:2240 src/libslic3r/GCode/PreviewData.cpp:360
msgid "Volumetric flow rate (mm³/s)"
msgstr "Volumetrische Flussrate (mm³/s)"
@@ -8802,151 +10164,167 @@ msgstr "Volumetrische Flussrate (mm³/s)"
msgid "Volumetric speed"
msgstr "Volumengeschwindigkeit"
-#: src/libslic3r/PrintConfig.cpp:2915
+#: src/libslic3r/PrintConfig.cpp:3079
msgid "Wall thickness"
msgstr "Wandstärke"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1270 src/slic3r/GUI/GUI.cpp:251
-#: src/slic3r/GUI/Tab.cpp:3084 src/slic3r/GUI/WipeTowerDialog.cpp:45
-#: src/slic3r/GUI/WipeTowerDialog.cpp:366
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1129 src/slic3r/GUI/GUI.cpp:256
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:478
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:502
+#: src/slic3r/GUI/WipeTowerDialog.cpp:45 src/slic3r/GUI/WipeTowerDialog.cpp:366
msgid "Warning"
msgstr "Warnung"
-#: src/slic3r/GUI/ConfigWizard.cpp:431
+#: src/slic3r/GUI/NotificationManager.cpp:672
+#: src/slic3r/GUI/NotificationManager.cpp:687
+#: src/slic3r/GUI/NotificationManager.cpp:702
+msgid "WARNING:"
+msgstr "WARNUNG:"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:449
msgid "Welcome"
msgstr "Willkommen"
-#: src/slic3r/GUI/ConfigWizard.cpp:427
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:445
+#, possible-c-format
msgid "Welcome to the %s Configuration Assistant"
msgstr "Willkommen zum %s Konfigurations-Assistent"
-#: src/slic3r/GUI/ConfigWizard.cpp:429
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:447
+#, possible-c-format
msgid "Welcome to the %s Configuration Wizard"
msgstr "Willkommen zum %s Konfigurations-Assistent"
-#: src/slic3r/GUI/Preferences.cpp:97
+#: src/slic3r/GUI/SavePresetDialog.cpp:310
+msgid "What would you like to do with \"%1%\" preset after saving?"
+msgstr "Was möchten Sie mit der Voreinstellung \"%1%\" nach dem Speichern machen?"
+
+#: src/slic3r/GUI/Preferences.cpp:114
msgid "When checked, the print and filament presets are shown in the preset editor even if they are marked as incompatible with the active printer"
msgstr "Falls angekreuzt, werden Voreinstellungen für Druck und Filament im Voreinstellungseditor auch dann angezeigt, wenn sie als inkompatibel zum aktiven Drucker gekennzeichnet wurden"
-#: src/slic3r/GUI/PresetHints.cpp:224
+#: src/slic3r/GUI/Preferences.cpp:122
+msgid "When checked, whenever dragging and dropping a project file on the application, shows a dialog asking to select the action to take on the file to load."
+msgstr "Wenn dieses Kontrollkästchen aktiviert ist, wird beim Ziehen und Ablegen einer Projektdatei auf die Anwendung ein Dialogfeld angezeigt, in dem Sie die Aktion auswählen können, die mit der zu ladenden Datei ausgeführt werden soll."
+
+#: src/slic3r/GUI/Preferences.cpp:156
+msgid "When closing the application, always ask for unsaved changes"
+msgstr "Wenn Sie die Anwendung schließen, immer nach nicht gespeicherten Änderungen fragen"
+
+#: src/slic3r/GUI/PresetHints.cpp:223
msgid "when printing"
msgstr "während dem Druck"
-#: src/libslic3r/PrintConfig.cpp:253
+#: src/libslic3r/PrintConfig.cpp:287
msgid "When printing multi-material objects, this settings will make Slic3r to clip the overlapping object parts one by the other (2nd part will be clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc)."
msgstr "Wenn Multi-Material-Objekte gedruckt werden, wird Slic3r mit diesen Einstellungen einen überlappenden Teil des Objekts durch den anderen einschränken (zweiter Teil wird durch den ersten Teil eingeschränkt, dritter Teil wird durch den ersten und zweiten eingeschränkt usw.)."
-#: src/libslic3r/PrintConfig.cpp:305
+#: src/libslic3r/PrintConfig.cpp:339
msgid "When printing multiple objects or copies, this feature will complete each object before moving onto next one (and starting it from its bottom layer). This feature is useful to avoid the risk of ruined prints. Slic3r should warn and prevent you from extruder collisions, but beware."
msgstr "Wenn mehrere Objekte oder Kopien gedruckt werden, wird bei dieser Einstellung jedes Objekt vollständig gedruckt, bevor das nächste (angefangen mit der Bodenschicht) begonnen wird. Diese Einstellung ist nützlich, um Fehldrucke zu vermeiden. PrusaSlicer sollte vor Extruderkollisionen warnen und diese verhindern, aber seien Sie trotzdem aufmerksam."
-#: src/libslic3r/PrintConfig.cpp:891
+#: src/libslic3r/PrintConfig.cpp:933
msgid "When printing with very low layer heights, you might still want to print a thicker bottom layer to improve adhesion and tolerance for non perfect build plates. This can be expressed as an absolute value or as a percentage (for example: 150%) over the default layer height."
msgstr "Wenn mit sehr kleinen Schichthöhen gedruckt wird, möchten Sie vielleicht trotzdem eine stärkere Bodenschicht drucken, um die Haftung sowie die Toleranz bei nicht perfekt ebenen Druckplatten zu verbessern. Dieser Wert kann als Absolutwert oder als Prozentwert (z.B. 150%) der Standardschichthöhe angegeben werden."
-#: src/libslic3r/PrintConfig.cpp:1553
+#: src/libslic3r/PrintConfig.cpp:1661
msgid "When retraction is triggered before changing tool, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder)."
msgstr "Wenn der Einzug vor dem Werkzeugwechsel ausgelöst wird, wird das Filament um diese Länge eingezogen. (Die Länge wird am unverarbeiteten Filament vor dem Extruder gemessen)."
-#: src/libslic3r/PrintConfig.cpp:1545
+#: src/libslic3r/PrintConfig.cpp:1653
msgid "When retraction is triggered, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder)."
msgstr "Wenn der Einzug ausgelöst wird, wird das Filament um diese Länge eingezogen. (Die Länge wird am unverarbeiteten Filament vor dem Extruder gemessen)."
-#: src/libslic3r/PrintConfig.cpp:1391
+#: src/libslic3r/PrintConfig.cpp:1499
msgid "When set to zero, the distance the filament is moved from parking position during load is exactly the same as it was moved back during unload. When positive, it is loaded further, if negative, the loading move is shorter than unloading."
msgstr "Wenn auf null gesetzt, ist der Weg, den das Filament während der Beladung aus der Parkposition zurücklegt, genau der gleiche wie beim Entladen. Im positiven Fall wird sie weiter geladen, im negativen Fall ist die Ladebewegung kürzer als die Entladung."
-#: src/libslic3r/PrintConfig.cpp:1238
+#: src/libslic3r/PrintConfig.cpp:1346
msgid "When setting other speed settings to 0 Slic3r will autocalculate the optimal speed in order to keep constant extruder pressure. This experimental setting is used to set the highest print speed you want to allow."
msgstr "Wenn andere Geschwindigkeitseinstellungen auf null gesetzt wurden, wird PrusaSlicer die optimale Geschwindigkeit automatisch berechnen, um den Extruderdruck konstant zu halten. Diese experimentelle Einstellung erlaubt Ihnen, die höchste zulässige Druckgeschwindigkeit anzugeben."
-#: src/libslic3r/PrintConfig.cpp:1597
+#: src/libslic3r/PrintConfig.cpp:1705
msgid "When the retraction is compensated after changing tool, the extruder will push this additional amount of filament."
msgstr "Wenn der Einzug nach dem Werkzeugwechsel kompensiert wurde, wird der Extruder diese zusätzliche Menge an Filament ausgeben."
-#: src/libslic3r/PrintConfig.cpp:1589
+#: src/libslic3r/PrintConfig.cpp:1697
msgid "When the retraction is compensated after the travel move, the extruder will push this additional amount of filament. This setting is rarely needed."
msgstr "Wenn der Einzug nach der Zwischenbewegung kompensiert wurde, wird der Extruder diese zusätzliche Menge an Filament ausgeben. Diese Einstellung wird selten benötigt."
-#: src/slic3r/GUI/Tab.cpp:3263
+#: src/slic3r/GUI/Tab.cpp:3700
msgid "WHITE BULLET"
msgstr "WEISSER PUNKT"
-#: src/slic3r/GUI/Tab.cpp:3285
+#: src/slic3r/GUI/Tab.cpp:3722
msgid "WHITE BULLET icon indicates a non system (or non default) preset."
msgstr "Das Symbol mit dem WEISSEN PUNKT zeigt eine Nicht-System- (oder nicht standardmäßige) Voreinstellung an."
-#: src/slic3r/GUI/Tab.cpp:3288
+#: src/slic3r/GUI/Tab.cpp:3725
msgid "WHITE BULLET icon indicates that the settings are the same as in the last saved preset for the current option group."
msgstr "Das Symbol WEISSER PUNKT zeigt an, dass die Einstellungen dieselben sind wie in der zuletzt gespeicherten Voreinstellung für die aktuelle Optionsgruppe."
-#: src/slic3r/GUI/Tab.cpp:3303
+#: src/slic3r/GUI/Tab.cpp:3740
msgid "WHITE BULLET icon indicates that the value is the same as in the last saved preset."
msgstr "Das Symbol WEISSER PUNKT zeigt an, dass der Wert identisch ist mit demjenigen in der zuletzt gespeicherten Voreinstellung."
-#: src/slic3r/GUI/GUI_Preview.cpp:223 src/libslic3r/PrintConfig.cpp:2238
+#: src/slic3r/GUI/GUI_Preview.cpp:277 src/libslic3r/PrintConfig.cpp:2381
msgid "Width"
msgstr "Breite"
-#: src/libslic3r/GCode/PreviewData.cpp:349
+#: src/slic3r/GUI/GCodeViewer.cpp:2237 src/libslic3r/GCode/PreviewData.cpp:354
msgid "Width (mm)"
msgstr "Breite (mm)"
-#: src/libslic3r/PrintConfig.cpp:2640
+#: src/libslic3r/PrintConfig.cpp:2783
msgid "Width from the back sphere center to the front sphere center"
msgstr "Abstand von der Mitte der hinteren Kugel bis zur Mitte der vorderen Kugel"
-#: src/libslic3r/PrintConfig.cpp:2239
+#: src/libslic3r/PrintConfig.cpp:2382
msgid "Width of a wipe tower"
msgstr "Breite des Reinigungsturms"
-#: src/libslic3r/PrintConfig.cpp:2891
+#: src/libslic3r/PrintConfig.cpp:3055
msgid "Width of the connector sticks which connect the object and the generated pad."
msgstr "Breite der Verbindungsstäbe, die das Objekt und die erzeugte Grundschicht verbinden."
-#: src/libslic3r/PrintConfig.cpp:2354
+#: src/libslic3r/PrintConfig.cpp:2497
msgid "Width of the display"
msgstr "Displaybreite"
-#: src/slic3r/GUI/PresetHints.cpp:48
-msgid "will always run at %1%%%"
-msgstr "wird immer mit %1%%% laufen"
-
-#: src/slic3r/GUI/PresetHints.cpp:55
-msgid "will be turned off."
-msgstr "wird abgeschaltet."
-
-#: src/libslic3r/PrintConfig.cpp:2441
+#: src/libslic3r/PrintConfig.cpp:2584
msgid "Will inflate or deflate the sliced 2D polygons according to the sign of the correction."
msgstr "Vergrößert oder verringert die geslicten 2D-Polygone entsprechend dem Vorzeichen der Korrektur."
-#: src/libslic3r/PrintConfig.cpp:2261
+#: src/slic3r/GUI/GCodeViewer.cpp:2660 src/slic3r/GUI/GCodeViewer.cpp:2663
+#: src/slic3r/GUI/GUI_Preview.cpp:978
+msgid "Wipe"
+msgstr "Reinigen"
+
+#: src/libslic3r/PrintConfig.cpp:2404
msgid "Wipe into this object"
msgstr "Dieses Objekt zum Reinigen verwenden"
-#: src/libslic3r/PrintConfig.cpp:2253
+#: src/libslic3r/PrintConfig.cpp:2396
msgid "Wipe into this object's infill"
msgstr "Das Infill dieses Objekts zum Reinigen verwenden"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:101
-#: src/slic3r/GUI/GUI_ObjectList.cpp:619 src/libslic3r/PrintConfig.cpp:2252
-#: src/libslic3r/PrintConfig.cpp:2260
+#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:99
+#: src/slic3r/GUI/GUI_ObjectList.cpp:658 src/libslic3r/PrintConfig.cpp:2395
+#: src/libslic3r/PrintConfig.cpp:2403
msgid "Wipe options"
msgstr "Wischoptionen"
-#: src/slic3r/GUI/GUI_Preview.cpp:248 src/slic3r/GUI/Tab.cpp:1191
-#: src/libslic3r/ExtrusionEntity.cpp:321
+#: src/slic3r/GUI/GUI_Preview.cpp:313 src/slic3r/GUI/Tab.cpp:1521
+#: src/libslic3r/ExtrusionEntity.cpp:326 src/libslic3r/ExtrusionEntity.cpp:360
msgid "Wipe tower"
msgstr "Reinigungsturm"
-#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245
+#: src/slic3r/GUI/Plater.cpp:1143 src/slic3r/GUI/Plater.cpp:1160
msgid "wipe tower"
msgstr "Reinigungsturm"
-#: src/slic3r/GUI/ConfigManipulation.cpp:120
-#: src/slic3r/GUI/ConfigManipulation.cpp:140
+#: src/slic3r/GUI/ConfigManipulation.cpp:119
+#: src/slic3r/GUI/ConfigManipulation.cpp:139
msgid "Wipe Tower"
msgstr "Reinigungsturm"
@@ -8954,131 +10332,141 @@ msgstr "Reinigungsturm"
msgid "Wipe tower - Purging volume adjustment"
msgstr "Reinigungsturm - Anpassung des Reinigungsvolumens"
-#: src/slic3r/GUI/Tab.cpp:1488
+#: src/slic3r/GUI/Tab.cpp:1834
msgid "Wipe tower parameters"
msgstr "Reinigungsturm Parameter"
-#: src/libslic3r/PrintConfig.cpp:2245
+#: src/libslic3r/PrintConfig.cpp:2388
msgid "Wipe tower rotation angle"
msgstr "Rotationswinkel des Reinigungsturms"
-#: src/libslic3r/PrintConfig.cpp:2246
+#: src/libslic3r/PrintConfig.cpp:2389
msgid "Wipe tower rotation angle with respect to x-axis."
msgstr "Rotationswinkel des Reinigungsturms bezogen auf die X-Achse."
-#: src/libslic3r/PrintConfig.cpp:2193
+#: src/libslic3r/PrintConfig.cpp:2336
msgid "Wipe while retracting"
msgstr "Während Einzug reinigen"
-#: src/slic3r/GUI/PresetHints.cpp:225
+#: src/slic3r/GUI/PresetHints.cpp:224
msgid "with a volumetric rate"
msgstr "mit einer Volumenrate von"
-#: src/libslic3r/PrintConfig.cpp:1530
+#: src/libslic3r/PrintConfig.cpp:1638
msgid "With bowden extruders, it may be wise to do some amount of quick retract before doing the wipe movement."
msgstr "Bei Bowden-Extrudern kann es ratsam sein, vor der Reinigungsbewegung einen kurzen Einzug auszuführen."
-#: src/libslic3r/PrintConfig.cpp:2056
+#: src/libslic3r/PrintConfig.cpp:2198
msgid "With sheath around the support"
msgstr "Mit Umhüllung der Stützen"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:68
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:111
msgid "World coordinates"
msgstr "Weltkoordinaten"
#: src/slic3r/GUI/UpdateDialogs.cpp:92
-msgid ""
-"Would you like to install it?\n"
-"\n"
-"Note that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n"
-"\n"
-"Updated configuration bundles:"
-msgstr ""
-"Möchten Sie dies installieren?\n"
-"\n"
-"Beachten Sie, dass zuerst eine Momentaufnahme der gesamten Konfiguration erstellt wird. Diese kann dann jederzeit wiederhergestellt werden, falls es ein Problem mit der neuen Version gibt.\n"
-"\n"
-"Aktualisierte Konfigurationssammlungen:"
+msgid "Would you like to install it?\n\nNote that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n\nUpdated configuration bundles:"
+msgstr "Möchten Sie dies installieren?\n\nBeachten Sie, dass zuerst eine Momentaufnahme der gesamten Konfiguration erstellt wird. Diese kann dann jederzeit wiederhergestellt werden, falls es ein Problem mit der neuen Version gibt.\n\nAktualisierte Konfigurationssammlungen:"
+
+#: src/slic3r/GUI/GUI_App.cpp:1802
+msgid "Would you like to stop uploads and close the program?"
+msgstr "Möchten Sie die Uploads stoppen und das Programm schließen?"
-#: src/libslic3r/Zipper.cpp:92
+#: src/libslic3r/miniz_extension.cpp:151
msgid "write calledback failed"
msgstr "Schreibabruf fehlgeschlagen"
-#: src/libslic3r/PrintConfig.cpp:3382
+#: src/libslic3r/PrintConfig.cpp:3581
msgid "Write information about the model to the console."
msgstr "Schreibt Informationen über das Modell auf die Konsole."
-#: src/slic3r/Utils/Duet.cpp:131
+#: src/slic3r/Utils/Duet.cpp:133
msgid "Wrong password"
msgstr "Ungültiges Kennwort"
-#: src/libslic3r/PrintConfig.cpp:2225
+#: src/libslic3r/PrintConfig.cpp:2368
msgid "X coordinate of the left front corner of a wipe tower"
msgstr "X-Koordinate der linken vorderen Ecke des Reinigungsturms"
-#: src/libslic3r/PrintConfig.cpp:1879
+#: src/libslic3r/PrintConfig.cpp:2021
msgid "XY separation between an object and its support"
msgstr "XY-Abstand zwischen einem Objekt und seinen Stützen"
-#: src/libslic3r/PrintConfig.cpp:1881
+#: src/libslic3r/PrintConfig.cpp:2023
msgid "XY separation between an object and its support. If expressed as percentage (for example 50%), it will be calculated over external perimeter width."
msgstr "XY-Abstand zwischen einem Objekt und seinen Stützen. Falls in Prozenten angegeben (z.B. 50%), wird der Abstand von der Breite der Außenkontur ausgehend berechnet."
-#: src/libslic3r/PrintConfig.cpp:2275
+#: src/libslic3r/PrintConfig.cpp:2418
msgid "XY Size Compensation"
msgstr "XY-Größenausgleich"
-#: src/libslic3r/PrintConfig.cpp:2232
+#: src/libslic3r/PrintConfig.cpp:2375
msgid "Y coordinate of the left front corner of a wipe tower"
msgstr "Y-Koordinate der linken vorderen Ecke des Reinigungsturms"
-#: src/slic3r/GUI/Plater.cpp:1170
+#: src/slic3r/GUI/Plater.cpp:1079
msgid "Yes"
msgstr "Ja"
-#: src/libslic3r/PrintConfig.cpp:1317
+#: src/slic3r/GUI/Plater.cpp:1405
+msgid "You can open only one .gcode file at a time."
+msgstr "Sie können immer nur eine .gcode-Datei gleichzeitig öffnen."
+
+#: src/libslic3r/PrintConfig.cpp:1425
msgid "You can put here your personal notes. This text will be added to the G-code header comments."
msgstr "Sie können hier Ihre persönlichen Notizen eingeben. Der Text wird dem Header vom G-Code hinzugefügt."
-#: src/libslic3r/PrintConfig.cpp:589
+#: src/libslic3r/PrintConfig.cpp:625
msgid "You can put your notes regarding the filament here."
msgstr "Sie können Ihre Notizen zum Filament hier eingeben."
-#: src/libslic3r/PrintConfig.cpp:1473
+#: src/libslic3r/PrintConfig.cpp:1581
msgid "You can put your notes regarding the printer here."
msgstr "Sie können Ihre Bemerkungen zum Drucker hier eingeben."
-#: src/libslic3r/PrintConfig.cpp:2579
+#: src/libslic3r/PrintConfig.cpp:2722
msgid "You can put your notes regarding the SLA print material here."
msgstr "Sie können Ihre Notizen zum SLA Druckmaterial hier eingeben."
-#: src/libslic3r/PrintConfig.cpp:360
+#: src/libslic3r/PrintConfig.cpp:394
msgid "You can set this to a positive value to disable fan at all during the first layers, so that it does not make adhesion worse."
msgstr "Sie können einen positiven Wert eingeben, um den Lüfter vollständig für die ersten Schichten auszuschalten, damit er die Haftung nicht beeinträchtigt."
-#: src/libslic3r/PrintConfig.cpp:1364
+#: src/libslic3r/PrintConfig.cpp:1472
msgid "You can use all configuration options as variables inside this template. For example: [layer_height], [fill_density] etc. You can also use [timestamp], [year], [month], [day], [hour], [minute], [second], [version], [input_filename], [input_filename_base]."
msgstr "Sie können alle Konfigurationsoptionen als Variablen in dieser Vorlage benutzen. Zum Beispiel: [layer_height], [fill_density] usw. Sie können auch [timestamp], [year], [month], [day], [hour], [minute], [second], [version], [input_filename], und [input_filename_base] benutzen."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3546
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4009
msgid "You can't change a type of the last solid part of the object."
msgstr "Sie können nicht die Art des letzten soliden Teils des Objektes ändern."
-#: src/slic3r/GUI/Plater.cpp:2390
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:2352
+#, possible-c-format
msgid "You can't to add the object(s) from %s because of one or some of them is(are) multi-part"
msgstr "Sie können die Objekte aus %s nicht hinzufügen, weil eines oder einige von ihnen mehrteilig ist (sind)"
-#: src/slic3r/GUI/Plater.cpp:2311
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:208 src/slic3r/GUI/Plater.cpp:2254
msgid "You cannot load SLA project with a multi-part object on the bed"
msgstr "Sie können kein SLA-Projekt mit einem mehrteiligen Objekt auf das Druckbett laden"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:625
msgid "You cannot use non-uniform scaling mode for multiple objects/parts selection"
msgstr "Sie können den nichtgleichmäßigen Skalierungsmodus nicht für mehrere Objekte/Teileauswahlen verwenden"
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:287
+#: src/slic3r/GUI/NotificationManager.hpp:459
+msgid "You have just added a G-code for color change, but its value is empty.\nTo export the G-code correctly, check the \"Color Change G-code\" in \"Printer Settings > Custom G-code\""
+msgstr "Sie haben gerade einen G-Code für Farbwechsel hinzugefügt, aber sein Wert ist leer.\nUm den G-Code korrekt zu exportieren, überprüfen Sie den \"Farbwechsel-G-Code\" unter \"Druckereinstellungen > Benutzerdefinierter G-Code\"."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:277
+msgid "You have selected physical printer \"%1%\" \nwith related printer preset \"%2%\""
+msgstr "Sie haben den physischen Drucker \"%1%\" ausgewählt \nmit der zugehörigen Druckervoreinstellung \"%2%\"."
+
+#: src/slic3r/GUI/GUI_App.cpp:1078
+msgid "You have the following presets with saved options for \"Print Host upload\""
+msgstr "Sie haben die folgenden Voreinstellungen mit gespeicherten Optionen für \"Hochladen zum Druckhost\""
+
+#: src/slic3r/GUI/OpenGLManager.cpp:262
msgid "You may need to update your graphics card driver."
msgstr "Möglicherweise müssen Sie Ihren Grafikkartentreiber aktualisieren."
@@ -9086,93 +10474,95 @@ msgstr "Möglicherweise müssen Sie Ihren Grafikkartentreiber aktualisieren."
msgid "You must install a configuration update."
msgstr "Ein Konfigurations-Update muss installiert werden."
-#: src/slic3r/GUI/Preferences.cpp:172
-#, c-format
+#: src/slic3r/GUI/Preferences.cpp:299
+#, possible-c-format
msgid "You need to restart %s to make the changes effective."
msgstr "Sie müssen %s neu starten, damit die Änderungen wirksam werden."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3421
-#, c-format
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:468
+msgid "You should change the name of your printer device."
+msgstr "Sie sollten den Namen Ihres Druckers ändern."
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3884
+#, possible-c-format
msgid "You started your selection with %s Item."
msgstr "Sie haben Ihre Auswahl mit %s Elementen begonnen."
-#: src/slic3r/GUI/DoubleSlider.cpp:1902
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:664
+msgid "You will not be asked about the unsaved changes the next time you close PrusaSlicer."
+msgstr "Wenn Sie PrusaSlicer das nächste Mal schließen, werden Sie nicht nach den ungespeicherten Änderungen gefragt."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:665
+msgid "You will not be asked about the unsaved changes the next time you switch a preset."
+msgstr "Wenn Sie das nächste Mal eine Voreinstellung wechseln, werden Sie nicht nach den ungespeicherten Änderungen gefragt."
+
+#: src/slic3r/GUI/DoubleSlider.cpp:2121
msgid "Your current changes will delete all saved color changes."
msgstr "Ihre aktuellen Änderungen löschen alle gespeicherten Farbwechsel."
-#: src/slic3r/GUI/DoubleSlider.cpp:1923
+#: src/slic3r/GUI/DoubleSlider.cpp:2141
msgid "Your current changes will delete all saved extruder (tool) changes."
msgstr "Ihre aktuellen Änderungen löschen alle gespeicherten Extruder-(Werkzeug-) Wechsel."
-#: src/slic3r/GUI/MainFrame.cpp:911
+#: src/slic3r/GUI/MainFrame.cpp:1612
msgid "Your file was repaired."
msgstr "Ihre Datei wurde repariert."
-#: src/slic3r/GUI/Plater.cpp:2528
+#: src/slic3r/GUI/Plater.cpp:2490
msgid "Your object appears to be too large, so it was automatically scaled down to fit your print bed."
msgstr "Ihr Objekt scheint zu groß zu sein. Es wurde deshalb automatisch verkleinert, um auf Ihre Druckplatte zu passen."
-#: src/libslic3r/PrintConfig.cpp:2285
+#: src/libslic3r/GCode.cpp:1261
+msgid "Your print is very close to the priming regions. Make sure there is no collision."
+msgstr "Ihr Druck ist sehr nahe an den Priming-Bereichen. Stellen Sie sicher, dass es keine Kollision gibt."
+
+#: src/libslic3r/PrintConfig.cpp:2428
msgid "Z offset"
msgstr "Z-Abstand"
-#: src/slic3r/GUI/ConfigManipulation.cpp:60
-msgid ""
-"Zero first layer height is not valid.\n"
-"\n"
-"The first layer height will be reset to 0.01."
-msgstr ""
-"Null Höhe der ersten Schicht ist nicht gültig.\n"
-"\n"
-"Die erste Schichthöhe wird auf 0,01 zurückgesetzt."
+#: src/slic3r/GUI/ConfigManipulation.cpp:59
+msgid "Zero first layer height is not valid.\n\nThe first layer height will be reset to 0.01."
+msgstr "Null Höhe der ersten Schicht ist nicht gültig.\n\nDie erste Schichthöhe wird auf 0,01 zurückgesetzt."
-#: src/slic3r/GUI/ConfigManipulation.cpp:48
-msgid ""
-"Zero layer height is not valid.\n"
-"\n"
-"The layer height will be reset to 0.01."
-msgstr ""
-"Eine Nullschichthöhe ist nicht gültig.\n"
-"\n"
-"Die Schichthöhe wird auf 0,01 zurückgesetzt."
+#: src/slic3r/GUI/ConfigManipulation.cpp:47
+msgid "Zero layer height is not valid.\n\nThe layer height will be reset to 0.01."
+msgstr "Eine Nullschichthöhe ist nicht gültig.\n\nDie Schichthöhe wird auf 0,01 zurückgesetzt."
-#: src/libslic3r/PrintConfig.cpp:2667
+#: src/libslic3r/PrintConfig.cpp:2831
msgid "Zig-Zag"
msgstr "Zickzack"
-#: src/slic3r/GUI/Mouse3DController.cpp:308
-#: src/slic3r/GUI/Mouse3DController.cpp:317
+#: src/slic3r/GUI/Mouse3DController.cpp:294
+#: src/slic3r/GUI/Mouse3DController.cpp:303
msgid "Zoom"
msgstr "Zoom"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:183
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:177
msgid "Zoom in"
msgstr "Heranzoomen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:184
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:178
msgid "Zoom out"
msgstr "Herauszoomen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:181
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
msgid "Zoom to Bed"
msgstr "Zoom aufs Druckbett"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:182
-msgid ""
-"Zoom to selected object\n"
-"or all objects in scene, if none selected"
-msgstr ""
-"Auf ausgewähltes Objekt zoomen\n"
-"oder alle Objekte in der Szene, wenn keines ausgewählt ist"
-
-#: src/libslic3r/PrintConfig.cpp:207 src/libslic3r/PrintConfig.cpp:780
-#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1650
-#: src/libslic3r/PrintConfig.cpp:1894 src/libslic3r/PrintConfig.cpp:2049
-#: src/libslic3r/PrintConfig.cpp:2247 src/libslic3r/PrintConfig.cpp:2727
-#: src/libslic3r/PrintConfig.cpp:2848
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:176
+msgid "Zoom to selected object\nor all objects in scene, if none selected"
+msgstr "Auf ausgewähltes Objekt zoomen\noder alle Objekte in der Szene, wenn keines ausgewählt ist"
+
+#: src/libslic3r/PrintConfig.cpp:241 src/libslic3r/PrintConfig.cpp:816
+#: src/libslic3r/PrintConfig.cpp:1748 src/libslic3r/PrintConfig.cpp:1758
+#: src/libslic3r/PrintConfig.cpp:2036 src/libslic3r/PrintConfig.cpp:2191
+#: src/libslic3r/PrintConfig.cpp:2390 src/libslic3r/PrintConfig.cpp:2891
+#: src/libslic3r/PrintConfig.cpp:3012
msgid "°"
msgstr "°"
-#: src/slic3r/GUI/ConfigWizard.cpp:1038 src/slic3r/GUI/ConfigWizard.cpp:1052
+#: src/slic3r/GUI/ConfigWizard.cpp:1404 src/slic3r/GUI/ConfigWizard.cpp:1418
+#: src/libslic3r/PrintConfig.cpp:180 src/libslic3r/PrintConfig.cpp:912
+#: src/libslic3r/PrintConfig.cpp:956 src/libslic3r/PrintConfig.cpp:2209
msgid "°C"
msgstr "°C"
diff --git a/resources/localization/es/PrusaSlicer.mo b/resources/localization/es/PrusaSlicer.mo
index 0da47d5b6..7d0bc7fc1 100644
--- a/resources/localization/es/PrusaSlicer.mo
+++ b/resources/localization/es/PrusaSlicer.mo
Binary files differ
diff --git a/resources/localization/es/PrusaSlicer_es.po b/resources/localization/es/PrusaSlicer_es.po
index 0e69f373c..964d8d6b1 100644
--- a/resources/localization/es/PrusaSlicer_es.po
+++ b/resources/localization/es/PrusaSlicer_es.po
@@ -5,376 +5,399 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 2.3\n"
-"Project-Id-Version: \n"
-"POT-Creation-Date: \n"
-"PO-Revision-Date: \n"
-"Last-Translator: \n"
-"Language-Team: \n"
-
-#: src/slic3r/GUI/MainFrame.cpp:66
-msgid " - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/releases"
-msgstr " - Recuerda comprobar las actualizaciones en http://github.com/prusa3d/PrusaSlicer/releases"
-
-#: src/slic3r/GUI/MainFrame.cpp:872
-msgid " was successfully sliced."
-msgstr " fue laminado con éxito."
-
-#: src/libslic3r/PrintConfig.cpp:215 src/libslic3r/PrintConfig.cpp:792
-#: src/libslic3r/PrintConfig.cpp:1219 src/libslic3r/PrintConfig.cpp:1282
-#: src/libslic3r/PrintConfig.cpp:1532 src/libslic3r/PrintConfig.cpp:2425
-#: src/libslic3r/PrintConfig.cpp:2767
+"X-Generator: PhraseApp (phraseapp.com)\n"
+
+#: src/slic3r/GUI/Tab.cpp:4124
+msgid "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\nTo enable \"%1%\", please switch off \"%2%\""
+msgstr "\"%1%\" está desactivado porque \"%2%\" está en la categoría \"%3%\".\nPara activar \"%1%\", por favor desactiva \"%2%\""
+
+#: src/libslic3r/PrintConfig.cpp:249 src/libslic3r/PrintConfig.cpp:828
+#: src/libslic3r/PrintConfig.cpp:1148 src/libslic3r/PrintConfig.cpp:1327
+#: src/libslic3r/PrintConfig.cpp:1390 src/libslic3r/PrintConfig.cpp:1640
+#: src/libslic3r/PrintConfig.cpp:2568 src/libslic3r/PrintConfig.cpp:2805
+#: src/libslic3r/PrintConfig.cpp:2931
msgid "%"
msgstr "%"
-#: src/slic3r/GUI/GLCanvas3D.cpp:963
-#, c-format
-msgid "%.2f - %.2f mm"
-msgstr "%.2f - %.2f mm"
-
#. TRN Remove/Delete
-#: src/slic3r/GUI/Tab.cpp:3126
+#: src/slic3r/GUI/Tab.cpp:3425
msgid "%1% Preset"
msgstr "%1% Preset"
-#: src/slic3r/GUI/Plater.cpp:4400
+#: src/slic3r/GUI/Plater.cpp:4423
msgid "%1% printer was active at the time the target Undo / Redo snapshot was taken. Switching to %1% printer requires reloading of %1% presets."
-msgstr "La impresora %1% esta activa mientras la captura del objetivo de Deshacer / Rehacer fue tomada. Cambiar a la impresora %1% requiere recargar los preajustes %1%."
+msgstr "La impresora %1% está activa mientras la captura del objetivo de Deshacer / Rehacer fue tomada. Cambiar a la impresora %1% requiere recargar los preajustes %1%."
-#: src/libslic3r/Print.cpp:1374
+#: src/slic3r/GUI/MainFrame.cpp:1585
+msgid "%1% was successfully sliced."
+msgstr "%1% fue laminado con éxito."
+
+#: src/libslic3r/Print.cpp:1400
msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm"
msgstr "%1%=%2% mm es demasiado bajo para ser impreso a una altura de capa de %3% mm"
-#: src/slic3r/GUI/PresetHints.cpp:229
-#, c-format
+#: src/slic3r/GUI/PresetHints.cpp:228
+#, possible-c-format
msgid "%3.2f mm³/s at filament speed %3.2f mm/s."
msgstr "%3.2f mm³/s a una velocidad de filamento de %3.2f mm/s."
-#: src/slic3r/GUI/Plater.cpp:1152
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:1061
+#, possible-c-format
msgid "%d (%d shells)"
msgstr "%d (%d pieles)"
-#: src/slic3r/GUI/Plater.cpp:1160
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:1069
+#, possible-c-format
msgid "%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d facets reversed, %d backwards edges"
-msgstr "%d facetas problemáticas, %d aristas corregidas, %d facetas eliminadas, %d facetas añadidas, %d facetas invertidas, %d aristas del revés"
+msgstr "%d facetas problemáticas, %d aristas corregidas, %d facetas eliminadas, %d facetas añadidas, %d facetas invertidas, %d aristas del revés"
-#: src/slic3r/GUI/PresetHints.cpp:270
-#, c-format
+#: src/slic3r/GUI/PresetHints.cpp:269
+#, possible-c-format
msgid "%d lines: %.2f mm"
msgstr "%d líneas: %.2f mm"
-#: src/slic3r/GUI/MainFrame.cpp:1027
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:1728
+#, possible-c-format
msgid "%d presets successfully imported."
msgstr "%d ajustes iniciales importados con éxito."
-#: src/slic3r/GUI/MainFrame.cpp:692
-#, c-format
+#: src/slic3r/GUI/GUI_App.cpp:718
+#, possible-c-format
+msgid "%s\nDo you want to continue?"
+msgstr "%s\n¿Quieres continuar?"
+
+#: src/slic3r/GUI/MainFrame.cpp:917 src/slic3r/GUI/MainFrame.cpp:1316
+#, possible-c-format
msgid "%s &Website"
msgstr "%s Sitio &Web"
+#: src/slic3r/GUI/GUI_App.cpp:394
+#, possible-c-format
+msgid "%s - BREAKING CHANGE"
+msgstr "%s - CAMBIO IMPORTANTE"
+
+#: src/slic3r/GUI/Plater.cpp:1410
+#, possible-c-format
+msgid "%s - Drop project file"
+msgstr "%s - Soltar archivo de proyecto"
+
#: src/slic3r/GUI/UpdateDialogs.cpp:211
-#, c-format
+#, possible-c-format
msgid "%s configuration is incompatible"
msgstr "%s la configuración es incompatible"
-#: src/slic3r/GUI/Field.cpp:175
-#, c-format
+#: src/slic3r/GUI/Field.cpp:223
+#, possible-c-format
msgid "%s doesn't support percentage"
msgstr "%s no permite porcentajes"
#: src/slic3r/GUI/MsgDialog.cpp:73
-#, c-format
+#, possible-c-format
msgid "%s error"
msgstr "%s error"
-#: src/slic3r/GUI/ConfigWizard.cpp:481
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:499
+#, possible-c-format
msgid "%s Family"
msgstr "%s Familia"
#: src/slic3r/GUI/MsgDialog.cpp:74
-#, c-format
+#, possible-c-format
msgid "%s has encountered an error"
msgstr "%s ha ocurrido un error"
-#: src/slic3r/GUI/GUI_App.cpp:138
-#, c-format
-msgid ""
-"%s has encountered an error. It was likely caused by running out of memory. If you are sure you have enough RAM on your system, this may also be a bug and we would be glad if you reported it.\n"
-"\n"
-"The application will now terminate."
-msgstr ""
-"%s ha encontrado un error. Probablemente fue causado por quedarse sin memoria. Si estás seguro de tener suficiente RAM en su sistema, esto también puede ser un error y nos complacería que lo informaras.\n"
-"\n"
-"La aplicación se cerrará."
+#: src/slic3r/GUI/GUI_App.cpp:528
+#, possible-c-format
+msgid "%s has encountered an error. It was likely caused by running out of memory. If you are sure you have enough RAM on your system, this may also be a bug and we would be glad if you reported it.\n\nThe application will now terminate."
+msgstr "%s ha encontrado un error. Probablemente fue causado por quedarse sin memoria. Si estás seguro de tener suficiente RAM en su sistema, esto también puede ser un error y nos complacería que lo informaras.\n\nLa aplicación se cerrará."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:222
-#, c-format
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:62
+#, possible-c-format
msgid "%s has encountered an error. It was likely caused by running out of memory. If you are sure you have enough RAM on your system, this may also be a bug and we would be glad if you reported it."
msgstr "%s ha encontrado un error. Probablemente fue causado por quedarse sin memoria. Si estás seguro de tener suficiente RAM en su sistema, esto también puede ser un error y nos complacería que lo informaras."
-#: src/slic3r/GUI/UpdateDialogs.cpp:308
-#, c-format
+#: src/slic3r/GUI/UpdateDialogs.cpp:309
+#, possible-c-format
msgid "%s has no configuration updates available."
msgstr "%s no tiene actualizaciones de configuración disponibles."
#: src/slic3r/GUI/UpdateDialogs.cpp:148 src/slic3r/GUI/UpdateDialogs.cpp:210
-#, c-format
+#, possible-c-format
msgid "%s incompatibility"
msgstr "%s incompatibilidad"
#: src/slic3r/GUI/UpdateDialogs.cpp:270
-#, c-format
-msgid ""
-"%s now uses an updated configuration structure.\n"
-"\n"
-"So called 'System presets' have been introduced, which hold the built-in default settings for various printers. These System presets cannot be modified, instead, users now may create their own presets inheriting settings from one of the System presets.\n"
-"An inheriting preset may either inherit a particular value from its parent or override it with a customized value.\n"
-"\n"
-"Please proceed with the %s that follows to set up the new presets and to choose whether to enable automatic preset updates."
-msgstr ""
-"Ahora %s usa una estructura actualizada para la configuración. \n"
-"\n"
-"Se han introducido los llamados 'Ajustes del sistema' , que tienen valores por defecto para varias impresoras. Estos ajustes del sistema no pueden modificarse, por el contrario, los usuarios pueden crear nuevos ajustes que se basan en alguno de ellos.\n"
-"Un ajuste nuevo puede heredar un valor de un ajuste existente o bien tener un nuevo valor personalizado.\n"
-"\n"
-"Por favof, continúa con el %s que sigue para establecer los nuevos ajustes y seleccionar si quieres que estos se actualicen automáticamente."
-
-#: src/slic3r/GUI/GUI_App.cpp:820
-#, c-format
+#, possible-c-format
+msgid "%s now uses an updated configuration structure.\n\nSo called 'System presets' have been introduced, which hold the built-in default settings for various printers. These System presets cannot be modified, instead, users now may create their own presets inheriting settings from one of the System presets.\nAn inheriting preset may either inherit a particular value from its parent or override it with a customized value.\n\nPlease proceed with the %s that follows to set up the new presets and to choose whether to enable automatic preset updates."
+msgstr "Ahora %s usa una estructura actualizada para la configuración. \n\nSe han introducido los llamados 'Ajustes del sistema', que tienen valores por defecto para varias impresoras. Estos ajustes del sistema no pueden modificarse, por el contrario, los usuarios pueden crear nuevos ajustes que se basan en alguno de ellos.\nUn ajuste nuevo puede heredar un valor de un ajuste existente o bien tener un nuevo valor personalizado.\n\nPor favof, continúa con el %s que sigue para establecer los nuevos ajustes y seleccionar si quieres que estos se actualicen automáticamente."
+
+#: src/slic3r/GUI/GUI_App.cpp:1512
+#, possible-c-format
msgid "%s View Mode"
msgstr "%s Tipo de vista"
#: src/slic3r/GUI/UpdateDialogs.cpp:151
-#, c-format
-msgid ""
-"%s will now start updates. Otherwise it won't be able to start.\n"
-"\n"
-"Note that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n"
-"\n"
-"Updated configuration bundles:"
-msgstr ""
-"%s comenzará las actualizaciones. De otro modo no podrá comenzar.\n"
-"\n"
-"Ten en cuenta que primero se creará una copia de seguridad. Puedes volver a ella si en algún momento hay problemas con la nueva versión.\n"
-"\n"
-"Configuraciones actualizadas:"
-
-#: src/slic3r/GUI/MainFrame.cpp:705
-#, c-format
+#, possible-c-format
+msgid "%s will now start updates. Otherwise it won't be able to start.\n\nNote that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n\nUpdated configuration bundles:"
+msgstr "%s comenzará las actualizaciones. De otro modo no podrá comenzar.\n\nTen en cuenta que primero se creará una copia de seguridad. Puedes volver a ella si en algún momento hay problemas con la nueva versión.\n\nConfiguraciones actualizadas:"
+
+#: src/slic3r/GUI/MainFrame.cpp:933 src/slic3r/GUI/MainFrame.cpp:937
+#: src/slic3r/GUI/MainFrame.cpp:1329
+#, possible-c-format
msgid "&About %s"
msgstr "&Acerca de %s"
-#: src/slic3r/GUI/GUI_App.cpp:908
+#: src/slic3r/GUI/MainFrame.cpp:1297
+msgid "&Collapse sidebar"
+msgstr "Barra lateral ocultable (&C)"
+
+#: src/slic3r/GUI/GUI_App.cpp:1645
msgid "&Configuration"
msgstr "&Configuración"
-#: src/slic3r/GUI/GUI_App.cpp:800
+#: src/slic3r/GUI/GUI_App.cpp:1480
msgid "&Configuration Snapshots"
msgstr "Instantáneas de la &Configuración"
-#: src/slic3r/GUI/MainFrame.cpp:588
+#: src/slic3r/GUI/MainFrame.cpp:1194
msgid "&Copy"
msgstr "&Copiar"
-#: src/slic3r/GUI/MainFrame.cpp:572
+#: src/slic3r/GUI/MainFrame.cpp:1178
msgid "&Delete selected"
msgstr "Eli&minar selección"
-#: src/slic3r/GUI/MainFrame.cpp:722
+#: src/slic3r/GUI/MainFrame.cpp:1348 src/slic3r/GUI/MainFrame.cpp:1358
msgid "&Edit"
msgstr "&Editar"
-#: src/slic3r/GUI/MainFrame.cpp:506
+#: src/slic3r/GUI/MainFrame.cpp:1103
msgid "&Export"
msgstr "&Exportar"
-#: src/slic3r/GUI/MainFrame.cpp:617 src/slic3r/GUI/MainFrame.cpp:752
+#: src/slic3r/GUI/MainFrame.cpp:1224 src/slic3r/GUI/MainFrame.cpp:1451
msgid "&Filament Settings Tab"
msgstr "Pestaña de Ajustes de &filamento"
-#: src/slic3r/GUI/MainFrame.cpp:721
+#: src/slic3r/GUI/MainFrame.cpp:1347 src/slic3r/GUI/MainFrame.cpp:1357
+#: src/slic3r/GUI/MainFrame.cpp:1417
msgid "&File"
msgstr "&Archivo"
-#: src/slic3r/GUI/ConfigWizard.cpp:1981
+#: src/slic3r/GUI/ConfigWizard.cpp:2492
msgid "&Finish"
msgstr "&Terminar"
-#: src/slic3r/GUI/MainFrame.cpp:727
+#: src/slic3r/GUI/MainFrame.cpp:1141
+msgid "&G-code preview"
+msgstr "Previsualización código G (&G)"
+
+#: src/slic3r/GUI/MainFrame.cpp:1353 src/slic3r/GUI/MainFrame.cpp:1363
+#: src/slic3r/GUI/MainFrame.cpp:1423
msgid "&Help"
msgstr "Ayu&da"
-#: src/slic3r/GUI/MainFrame.cpp:474
+#: src/slic3r/GUI/MainFrame.cpp:1065
msgid "&Import"
msgstr "&Importar"
-#: src/slic3r/GUI/GUI_App.cpp:822
+#: src/slic3r/GUI/GUI_App.cpp:1517
msgid "&Language"
msgstr "&Idioma"
-#: src/slic3r/GUI/MainFrame.cpp:405
+#: src/slic3r/GUI/MainFrame.cpp:986
msgid "&New Project"
msgstr "&Nuevo proyecto"
-#: src/slic3r/GUI/ConfigWizard.cpp:1980
+#: src/slic3r/GUI/ConfigWizard.cpp:2491
msgid "&Next >"
msgstr "&Siguiente >"
-#: src/slic3r/GUI/MainFrame.cpp:408
+#: src/slic3r/GUI/MainFrame.cpp:1391
+msgid "&Open G-code"
+msgstr "Abrir código G (&O)"
+
+#: src/slic3r/GUI/MainFrame.cpp:989
msgid "&Open Project"
msgstr "Abrir pr&oyecto"
-#: src/slic3r/GUI/MainFrame.cpp:591
+#: src/slic3r/GUI/MainFrame.cpp:1197
msgid "&Paste"
msgstr "&Pegar"
-#: src/slic3r/GUI/MainFrame.cpp:606
+#: src/slic3r/GUI/MainFrame.cpp:1216
msgid "&Plater Tab"
msgstr "&Pestaña Base de impresión"
-#: src/slic3r/GUI/GUI_App.cpp:804
+#: src/slic3r/GUI/GUI_App.cpp:1487
msgid "&Preferences"
msgstr "&Preferencias"
-#: src/slic3r/GUI/MainFrame.cpp:540
+#: src/slic3r/GUI/MainFrame.cpp:1144 src/slic3r/GUI/MainFrame.cpp:1402
msgid "&Quit"
msgstr "Sa&lir"
-#: src/slic3r/GUI/MainFrame.cpp:583
+#: src/slic3r/GUI/MainFrame.cpp:1189
msgid "&Redo"
msgstr "&Rehacer"
-#: src/slic3r/GUI/MainFrame.cpp:536
+#: src/slic3r/GUI/MainFrame.cpp:1137
msgid "&Repair STL file"
msgstr "&Reparar archivo STL"
-#: src/slic3r/GUI/MainFrame.cpp:446
+#: src/slic3r/GUI/MainFrame.cpp:1028
msgid "&Save Project"
msgstr "G&uardar proyecto"
-#: src/slic3r/GUI/MainFrame.cpp:565
+#: src/slic3r/GUI/MainFrame.cpp:1171
msgid "&Select all"
msgstr "&Seleccionar todo"
-#: src/slic3r/GUI/MainFrame.cpp:580
+#: src/slic3r/GUI/MainFrame.cpp:1186
msgid "&Undo"
msgstr "Des&hacer"
-#: src/slic3r/GUI/MainFrame.cpp:724
+#: src/slic3r/GUI/MainFrame.cpp:1350 src/slic3r/GUI/MainFrame.cpp:1360
+#: src/slic3r/GUI/MainFrame.cpp:1418
msgid "&View"
msgstr "Ve&r"
-#: src/slic3r/GUI/MainFrame.cpp:723
+#: src/slic3r/GUI/MainFrame.cpp:1349 src/slic3r/GUI/MainFrame.cpp:1359
msgid "&Window"
msgstr "&Ventana"
-#: src/slic3r/GUI/ConfigWizard.cpp:603 src/slic3r/GUI/ConfigWizard.cpp:631
+#: src/slic3r/GUI/ConfigWizard.cpp:662 src/slic3r/GUI/ConfigWizard.cpp:812
+#: src/slic3r/GUI/ConfigWizard.cpp:873 src/slic3r/GUI/ConfigWizard.cpp:1007
msgid "(All)"
msgstr "(Todo)"
-#: src/libslic3r/PrintConfig.cpp:1446
+#: src/slic3r/GUI/Plater.cpp:1195
+msgid "(including spool)"
+msgstr "(incluyendo la bobina)"
+
+#: src/libslic3r/PrintConfig.cpp:1554
msgid "(minimum)"
msgstr "(mínimo)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:116
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:109
msgid "(Re)slice"
msgstr "(Re)laminar"
-#: src/slic3r/GUI/MainFrame.cpp:532
+#: src/slic3r/GUI/MainFrame.cpp:1133
msgid "(Re)Slice No&w"
msgstr "(Re)Laminar A&hora"
-#: src/libslic3r/PrintConfig.cpp:771 src/libslic3r/PrintConfig.cpp:2587
+#: src/libslic3r/PrintConfig.cpp:807 src/libslic3r/PrintConfig.cpp:2730
msgid "(Unknown)"
msgstr "(Desconocido)"
-#: src/slic3r/GUI/MainFrame.cpp:790
+#: src/slic3r/GUI/MainFrame.cpp:1491
msgid ") not found."
msgstr ") no encontrado."
-#: src/libslic3r/PrintConfig.cpp:1918
+#: src/libslic3r/PrintConfig.cpp:1085
+msgid "0 (no open anchors)"
+msgstr "0 (sin anclajes abiertos)"
+
+#: src/libslic3r/PrintConfig.cpp:1107
+msgid "0 (not anchored)"
+msgstr "0 (sin anclar)"
+
+#: src/libslic3r/PrintConfig.cpp:2060
msgid "0 (soluble)"
msgstr "0 (soluble)"
-#: src/libslic3r/PrintConfig.cpp:1919
+#: src/libslic3r/PrintConfig.cpp:2061
msgid "0.2 (detachable)"
msgstr "0.2 (despegable)"
-#: src/slic3r/GUI/MainFrame.cpp:626
+#: src/libslic3r/PrintConfig.cpp:1090 src/libslic3r/PrintConfig.cpp:1112
+msgid "1000 (unlimited)"
+msgstr "1000 (ilimitado)"
+
+#: src/slic3r/GUI/MainFrame.cpp:1234
msgid "3&D"
msgstr "3&D"
-#: src/slic3r/GUI/Plater.cpp:4097
+#: src/slic3r/GUI/Plater.cpp:4044
msgid "3D editor view"
msgstr "Vista editor 3D"
-#: src/libslic3r/PrintConfig.cpp:851
+#: src/libslic3r/PrintConfig.cpp:889
msgid "3D Honeycomb"
msgstr "Panal de abeja 3D"
-#: src/slic3r/GUI/Mouse3DController.cpp:274
+#: src/slic3r/GUI/NotificationManager.hpp:318
+msgid "3D Mouse disconnected."
+msgstr "Ratón 3D desconectado."
+
+#: src/slic3r/GUI/Mouse3DController.cpp:263
msgid "3Dconnexion settings"
msgstr "Ajustes 3Dconnexion"
-#: src/slic3r/GUI/Plater.cpp:5038
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:5167
+#, possible-c-format
msgid "3MF file exported to %s"
msgstr "Archivo 3MF exportado a %s"
-#: src/slic3r/GUI/ConfigWizard.cpp:1979
+#: src/slic3r/GUI/ConfigWizard.cpp:2490
msgid "< &Back"
msgstr "< &Anterior"
-#: src/libslic3r/PrintConfig.cpp:287
+#: src/libslic3r/PrintConfig.cpp:321
msgid "A boolean expression using the configuration values of an active print profile. If this expression evaluates to true, this profile is considered compatible with the active print profile."
msgstr "Una expresión booleana que utiliza los valores de configuración de un perfil de impresión activo. Si esta expresión se evalúa como verdadera, este perfil se considera compatible con el perfil de impresión activo."
-#: src/libslic3r/PrintConfig.cpp:272
+#: src/libslic3r/PrintConfig.cpp:306
msgid "A boolean expression using the configuration values of an active printer profile. If this expression evaluates to true, this profile is considered compatible with the active printer profile."
msgstr "Una expresión booleana utilizando valores de configuración de un perfil existente. Si esta expresión es verdadera, el perfil será considerado compatible con el perfil de impresión activo."
-#: src/slic3r/GUI/Tab.cpp:975
+#: src/slic3r/GUI/Tab.cpp:1237
msgid "A copy of the current system preset will be created, which will be detached from the system preset."
msgstr "Se creará una copia del preajuste del sistema actual, que se separará del preajuste del sistema."
-#: src/slic3r/GUI/ConfigWizard.cpp:1034
+#: src/slic3r/GUI/ConfigWizard.cpp:1400
msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS."
msgstr "Una buena aproximación es de 160 a 230 °C para PLA y de 215 a 250 °C para ABS."
-#: src/slic3r/GUI/ConfigWizard.cpp:1048
+#: src/slic3r/GUI/ConfigWizard.cpp:1414
msgid "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have no heated bed."
-msgstr "Una buena aproximación son unos 60 °C para PLA y 110 °C para ABS. Deja el valor a cero si no tienes base calefactable."
+msgstr "Una buena aproximación son unos 60°C para PLA y 110°C para ABS. Deja el valor a cero si no tienes base calefactable."
-#: src/slic3r/GUI/GLCanvas3D.cpp:686
-msgid "A toolpath outside the print area was detected"
-msgstr "Se detectó una trayectoria fuera del área de impresión"
+#: src/slic3r/GUI/GLCanvas3D.cpp:634
+msgid "A toolpath outside the print area was detected."
+msgstr "Ha sido detectada una trayectoria fuera del área de impresión."
-#: src/slic3r/GUI/AboutDialog.cpp:199
-#, c-format
+#: src/slic3r/GUI/AboutDialog.cpp:212 src/slic3r/GUI/AboutDialog.cpp:215
+#, possible-c-format
msgid "About %s"
msgstr "Acerca de %s"
-#: src/slic3r/GUI/GLCanvas3D.cpp:959
-#, c-format
-msgid "above %.2f mm"
-msgstr "sobre %.2f mm"
+#: src/slic3r/GUI/GCodeViewer.cpp:2189
+msgid "above"
+msgstr "sobre"
-#: src/libslic3r/PrintConfig.cpp:1569
+#: src/libslic3r/PrintConfig.cpp:1677
msgid "Above Z"
msgstr "Encima de Z"
-#: src/slic3r/GUI/Tab.cpp:1164
+#: src/slic3r/GUI/Tab.cpp:1494
msgid "Acceleration control (advanced)"
msgstr "Control de aceleración (avanzado)"
-#: src/libslic3r/PrintConfig.cpp:2925
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:221
+#: src/libslic3r/PrintConfig.cpp:3089
msgid "Accuracy"
msgstr "Precisión"
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:59
+msgid "Accurate"
+msgstr "Preciso"
+
+#: src/slic3r/GUI/Plater.cpp:1423
+msgid "Action"
+msgstr "Acción"
+
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78
msgid "Activate"
msgstr "Activar"
@@ -383,98 +406,106 @@ msgstr "Activar"
msgid "Active"
msgstr "Activo"
-#: src/slic3r/GUI/DoubleSlider.cpp:1135 src/slic3r/GUI/GUI_ObjectList.cpp:1705
+#: src/slic3r/GUI/DoubleSlider.cpp:1264 src/slic3r/GUI/GUI_ObjectList.cpp:1833
msgid "active"
msgstr "activo"
-#: src/slic3r/GUI/GLCanvas3D.cpp:267
+#: src/slic3r/GUI/GLCanvas3D.cpp:254
msgid "Adaptive"
msgstr "Adaptativa"
-#: src/slic3r/GUI/Tab.cpp:241
-msgid "Add a new printer"
-msgstr "Añadir una impresora nueva"
+#: src/libslic3r/PrintConfig.cpp:894
+msgid "Adaptive Cubic"
+msgstr "Cúbico Adaptativo"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:314
+msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\""
+msgstr "Añade \"%1%\" como siguiente ajuste preestablecido para la impresora física \"%2%\""
-#: src/libslic3r/PrintConfig.cpp:2782
+#: src/libslic3r/PrintConfig.cpp:2946
msgid "Add a pad underneath the supported model"
msgstr "Añade un pad debajo del modelo compatible"
-#: src/libslic3r/PrintConfig.cpp:2058
+#: src/libslic3r/PrintConfig.cpp:2200
msgid "Add a sheath (a single perimeter line) around the base support. This makes the support more reliable, but also more difficult to remove."
msgstr "Añadir una funda (una sola línea de perímetro) alrededor de la base del soporte. Esto hace el soporte más fiable pero también más difícil de retirar."
-#: src/slic3r/GUI/DoubleSlider.cpp:991
+#: src/slic3r/GUI/DoubleSlider.cpp:1114
msgid "Add another code - Ctrl + Left click"
-msgstr "Añadir otro código - Ctrl + Click izquierdo"
+msgstr "Añadir otro código - Ctrl + Clic izquierdo"
-#: src/slic3r/GUI/DoubleSlider.cpp:992
+#: src/slic3r/GUI/DoubleSlider.cpp:1115
msgid "Add another code - Right click"
-msgstr "Añadir otro código - Click derecho"
+msgstr "Añadir otro código - Clic derecho"
-#: src/slic3r/GUI/DoubleSlider.cpp:1477
+#: src/slic3r/GUI/DoubleSlider.cpp:1665
msgid "Add color change"
msgstr "Añadir cambio de color"
-#: src/slic3r/GUI/DoubleSlider.cpp:1180
+#: src/slic3r/GUI/DoubleSlider.cpp:1307
msgid "Add color change (%1%) for:"
msgstr "Añadir cambio de color (%1%) para:"
-#: src/slic3r/GUI/DoubleSlider.cpp:988
+#: src/slic3r/GUI/DoubleSlider.cpp:1111
msgid "Add color change - Left click"
-msgstr "Añadir cambio de color - Click izquierdo"
+msgstr "Añadir cambio de color - Clic izquierdo"
-#: src/slic3r/GUI/DoubleSlider.cpp:986
+#: src/slic3r/GUI/DoubleSlider.cpp:1109
msgid "Add color change - Left click for predefined color or Shift + Left click for custom color selection"
-msgstr "Añadir cambio de color - Click izquierdo para color preddefinido o Mayus + Click izquierdo para selección de color personalizada"
+msgstr "Añadir cambio de color - Clic izquierdo para color preddefinido o Mayus + Clic izquierdo para selección de color personalizada"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
msgid "Add color change marker for current layer"
msgstr "Añadir marcador de cambio de color para la capa actual"
-#: src/slic3r/GUI/DoubleSlider.cpp:1490
+#: src/slic3r/GUI/DoubleSlider.cpp:1682
msgid "Add custom G-code"
msgstr "Añadir código G personalizado"
-#: src/slic3r/GUI/GLCanvas3D.cpp:240
+#: src/slic3r/GUI/DoubleSlider.cpp:1679
+msgid "Add custom template"
+msgstr "Añadir plantilla personalizada"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:235
msgid "Add detail"
msgstr "Añadir detalle"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:421
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:308
msgid "Add drainage hole"
msgstr "Añadir orificio de drenaje"
-#: src/slic3r/GUI/DoubleSlider.cpp:984
+#: src/slic3r/GUI/DoubleSlider.cpp:1107
msgid "Add extruder change - Left click"
-msgstr "Añadir cambio de extrusor - Click izquierdo"
+msgstr "Añadir cambio de extrusor - Clic izquierdo"
#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:192
msgid "Add extruder to sequence"
msgstr "Añadir extrusor a la secuencia"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1993
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2152
msgid "Add Generic Subobject"
msgstr "Añadir Subobjeto Genérico"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2896
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2925
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2943
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3297
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3325
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3345
msgid "Add Height Range"
msgstr "Añadir Rango de Alturas"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4526 src/slic3r/GUI/Plater.cpp:3788
-#: src/slic3r/GUI/Plater.cpp:3800 src/slic3r/GUI/Plater.cpp:3940
+#: src/slic3r/GUI/GLCanvas3D.cpp:4892 src/slic3r/GUI/Plater.cpp:3708
+#: src/slic3r/GUI/Plater.cpp:3720 src/slic3r/GUI/Plater.cpp:3858
msgid "Add instance"
msgstr "Añadir instancia"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:159
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:153
msgid "Add Instance of the selected object"
msgstr "Añadir instancia del objeto seleccionado"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:162
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:165
msgid "Add layer range"
msgstr "Añadir rango de capas"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2328
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2692
msgid "Add Layers"
msgstr "Añadir Capas"
@@ -482,12 +513,12 @@ msgstr "Añadir Capas"
msgid "Add modifier"
msgstr "Añadir modificador"
-#: src/libslic3r/PrintConfig.cpp:479
-#, no-c-format
+#: src/libslic3r/PrintConfig.cpp:515
+#, possible-c-format
msgid "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r keeps adding perimeters, until more than 70% of the loop immediately above is supported."
msgstr "Añadir más perímetros cuando se necesiten para evitar huecos en las paredes inclinadas. Slic3r sigue añadiendo perímetros hasta que más del 70% del perímetro superior sea soportado."
-#: src/slic3r/GUI/Plater.cpp:3940
+#: src/slic3r/GUI/Plater.cpp:3858
msgid "Add one more instance of the selected object"
msgstr "Añadir una instancia más del objeto seleccionado"
@@ -495,54 +526,63 @@ msgstr "Añadir una instancia más del objeto seleccionado"
msgid "Add part"
msgstr "Añadir pieza"
-#: src/slic3r/GUI/DoubleSlider.cpp:1487
+#: src/slic3r/GUI/DoubleSlider.cpp:1675
msgid "Add pause print"
msgstr "Añadir pausa de impresión"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363
+#: src/slic3r/GUI/PresetComboBoxes.cpp:627
+#: src/slic3r/GUI/PresetComboBoxes.cpp:674
+msgid "Add physical printer"
+msgstr "Añadir impresora física"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210
msgid "Add point"
msgstr "Añadir punto"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213
msgid "Add point to selection"
msgstr "Añadir punto a selección"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1509
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:180
+msgid "Add preset for this printer device"
+msgstr "Añadir ajuste preestablecido para este dispositivo de impresión"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1640
msgid "Add settings"
msgstr "Añadir ajustes"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1386
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1517
msgid "Add Settings Bundle for Height range"
msgstr "Añadir Conjunto de Ajustes para Rango de Alturas"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1388
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1519
msgid "Add Settings Bundle for Object"
msgstr "Añadir Conjunto de Ajustes para Objeto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1387
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1518
msgid "Add Settings Bundle for Sub-object"
msgstr "Añadir Conjunto de Ajustes para Sub-objeto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1314
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1445
msgid "Add Settings for Layers"
msgstr "Añadir Ajustes para Capas"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1316
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1447
msgid "Add Settings for Object"
msgstr "Agregar Ajustes para Objeto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1315
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1446
msgid "Add Settings for Sub-object"
msgstr "Agregar Ajustes para Sub-objeto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1793
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2051
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1953
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2210
msgid "Add Shape"
msgstr "Añadir forma"
-#: src/libslic3r/PrintConfig.cpp:409
+#: src/libslic3r/PrintConfig.cpp:443
msgid "Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top+bottom solid layers)."
-msgstr "Añade un relleno completo cerca de las superficies inclinadas para garantizar el ancho vertical solicitado(capas sólidas arriba+abajo)."
+msgstr "Añade un relleno completo cerca de las superficies inclinadas para garantizar el ancho vertical solicitado (capas sólidas arriba+abajo)."
#: src/slic3r/GUI/GUI_ObjectList.cpp:54
msgid "Add support blocker"
@@ -552,11 +592,19 @@ msgstr "Añadir bloqueo soportes"
msgid "Add support enforcer"
msgstr "Añadir refuerzo soportes"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:494
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:374
msgid "Add support point"
msgstr "Añadir punto de soporte"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4467
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:371
+msgid "Add supports"
+msgstr "Añadir soportes"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:293
+msgid "Add supports by angle"
+msgstr "Añadir soportes según ángulo"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4833
msgid "Add..."
msgstr "Añadir..."
@@ -564,23 +612,29 @@ msgstr "Añadir..."
msgid "Add/Remove filaments"
msgstr "Añadir/Retirar filamentos"
-#: src/slic3r/GUI/Preset.cpp:1201
+#: src/slic3r/GUI/PresetComboBoxes.cpp:813
msgid "Add/Remove materials"
msgstr "Añadir/Retirar materiales"
-#: src/slic3r/GUI/Preset.cpp:1203
+#: src/slic3r/GUI/PresetComboBoxes.cpp:622
+#: src/slic3r/GUI/PresetComboBoxes.cpp:669
+msgid "Add/Remove presets"
+msgstr "Añadir/Quitar ajustes preestablecidos"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:815
+#: src/slic3r/GUI/PresetComboBoxes.cpp:972
msgid "Add/Remove printers"
msgstr "Añade/Quita impresoras"
-#: src/slic3r/GUI/Tab.cpp:970
+#: src/slic3r/GUI/Tab.cpp:1288
msgid "Additional information:"
msgstr "Información adicional:"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:59
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:62
msgid "Additional Settings"
-msgstr "Ajustes adiccionales"
+msgstr "Ajustes adicionales"
-#: src/slic3r/GUI/ConfigWizard.cpp:791
+#: src/slic3r/GUI/ConfigWizard.cpp:1150
msgid "Additionally a backup snapshot of the whole configuration is created before an update is applied."
msgstr "Además se realizará una instantánea de toda la configuración antes de aplicar una actualización."
@@ -588,23 +642,22 @@ msgstr "Además se realizará una instantánea de toda la configuración antes d
msgid "Address"
msgstr "Dirección"
-#: src/slic3r/GUI/GUI_App.cpp:814 src/slic3r/GUI/GUI_ObjectList.cpp:104
-#: src/slic3r/GUI/GUI_ObjectList.cpp:622 src/slic3r/GUI/Tab.cpp:1087
-#: src/slic3r/GUI/Tab.cpp:1102 src/slic3r/GUI/Tab.cpp:1201
-#: src/slic3r/GUI/Tab.cpp:1204 src/slic3r/GUI/Tab.cpp:1470
-#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:3661
-#: src/slic3r/GUI/wxExtensions.cpp:754 src/libslic3r/PrintConfig.cpp:88
-#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:223
-#: src/libslic3r/PrintConfig.cpp:1037 src/libslic3r/PrintConfig.cpp:2276
-#: src/libslic3r/PrintConfig.cpp:2448
+#: src/slic3r/GUI/GUI_ObjectList.cpp:102 src/slic3r/GUI/GUI_ObjectList.cpp:661
+#: src/slic3r/GUI/Tab.cpp:1409 src/slic3r/GUI/Tab.cpp:1430
+#: src/slic3r/GUI/Tab.cpp:1531 src/slic3r/GUI/Tab.cpp:1534
+#: src/slic3r/GUI/Tab.cpp:1816 src/slic3r/GUI/Tab.cpp:2152
+#: src/slic3r/GUI/Tab.cpp:4080 src/libslic3r/PrintConfig.cpp:90
+#: src/libslic3r/PrintConfig.cpp:121 src/libslic3r/PrintConfig.cpp:257
+#: src/libslic3r/PrintConfig.cpp:1081 src/libslic3r/PrintConfig.cpp:2419
+#: src/libslic3r/PrintConfig.cpp:2591
msgid "Advanced"
msgstr "Avanzado"
-#: src/slic3r/GUI/ConfigWizard.cpp:821
+#: src/slic3r/GUI/ConfigWizard.cpp:1180
msgid "Advanced mode"
msgstr "Modo avanzado"
-#: src/slic3r/GUI/GUI_App.cpp:814
+#: src/slic3r/GUI/GUI_App.cpp:1506
msgid "Advanced View Mode"
msgstr "Modo vista avanzada"
@@ -612,227 +665,299 @@ msgstr "Modo vista avanzada"
msgid "Advanced: Output log"
msgstr "Avanzado: Registro de salida"
-#: src/libslic3r/PrintConfig.cpp:668
+#: src/libslic3r/PrintConfig.cpp:704
msgid "After a tool change, the exact position of the newly loaded filament inside the nozzle may not be known, and the filament pressure is likely not yet stable. Before purging the print head into an infill or a sacrificial object, Slic3r will always prime this amount of material into the wipe tower to produce successive infill or sacrificial object extrusions reliably."
msgstr "Después de un cambio de herramienta, la posición exacta del filamento recién cargado dentro de la boquilla puede no ser conocida, y es probable que la presión del filamento aún no sea estable. Antes de purgar el cabezal de impresión en un relleno o en un objeto de sacrificio, Slic3r siempre purgará esta cantidad de material en la torre de limpieza para producir de forma fiable sucesivas rellenos u objetos de sacrificio."
-#: src/slic3r/GUI/Tab.cpp:1994 src/libslic3r/PrintConfig.cpp:1080
+#: src/slic3r/GUI/Tab.cpp:2182 src/libslic3r/PrintConfig.cpp:1173
msgid "After layer change G-code"
-msgstr "Código G tras un cambio de capa"
+msgstr "Código G tras un cambio de capa"
-#: src/libslic3r/PrintConfig.cpp:3398
+#: src/libslic3r/PrintConfig.cpp:3597
msgid "Align the model to the given point."
msgstr "Alinear el modelo a un punto dado."
-#: src/libslic3r/PrintConfig.cpp:3397
+#: src/libslic3r/PrintConfig.cpp:3596
msgid "Align XY"
msgstr "Alinear XY"
-#: src/libslic3r/PrintConfig.cpp:1631
+#: src/libslic3r/PrintConfig.cpp:1739
msgid "Aligned"
msgstr "Alineado"
-#: src/slic3r/GUI/ConfigWizard.cpp:290 src/slic3r/GUI/ConfigWizard.cpp:573
-#: src/slic3r/GUI/Tab.cpp:3174
+#: src/libslic3r/PrintConfig.cpp:470 src/libslic3r/PrintConfig.cpp:902
+msgid "Aligned Rectilinear"
+msgstr "Rectilíneo Alineado"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:308 src/slic3r/GUI/ConfigWizard.cpp:598
+#: src/slic3r/GUI/Tab.cpp:3507 src/slic3r/GUI/UnsavedChangesDialog.cpp:921
msgid "All"
msgstr "Todo"
-#: src/libslic3r/Print.cpp:1219
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:197
+msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button"
+msgstr "Todos los movimientos: Rotar - botón izquierdo ratón; Girar- botón derecho ratón"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:694
+msgid "All installed printers are compatible with the selected filament."
+msgstr "Todas las impresoras instaladas son compatibles con el filamento seleccionado."
+
+#: src/libslic3r/Print.cpp:1245
msgid "All objects are outside of the print volume."
msgstr "Todos los objetos están fuera del volumen de impresión."
-#: src/slic3r/GUI/Plater.cpp:4669
+#: src/slic3r/GUI/Plater.cpp:4774
msgid "All objects will be removed, continue?"
msgstr "Todos los objetos serán eliminados, deseas continuar?"
-#: src/slic3r/GUI/ConfigWizard.cpp:289
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:737
+msgid "All settings changes will be discarded."
+msgstr "Todos los cambios de los ajustes serán descartados."
+
+#: src/libslic3r/PrintConfig.cpp:1212
+msgid "All solid surfaces"
+msgstr "Todas las superficies sólidas"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:307
msgid "All standard"
msgstr "Todo estandar"
-#: src/libslic3r/Zipper.cpp:62
+#: src/libslic3r/PrintConfig.cpp:1210
+msgid "All top surfaces"
+msgstr "Todas las superficies superiores"
+
+#: src/libslic3r/miniz_extension.cpp:121
msgid "allocation failed"
msgstr "asignación fallida"
-#: src/slic3r/GUI/Plater.cpp:3995
+#: src/slic3r/GUI/Preferences.cpp:161 src/slic3r/GUI/Preferences.cpp:165
+msgid "Allow just a single PrusaSlicer instance"
+msgstr "Permitir una sola instancia de PrusaSlicer"
+
+#: src/slic3r/GUI/Plater.cpp:3915
msgid "Along X axis"
msgstr "A lo largo del eje X"
-#: src/slic3r/GUI/Plater.cpp:3997
+#: src/slic3r/GUI/Plater.cpp:3917
msgid "Along Y axis"
msgstr "A lo largo del eje Y"
-#: src/slic3r/GUI/Plater.cpp:3999
+#: src/slic3r/GUI/Plater.cpp:3919
msgid "Along Z axis"
msgstr "A lo largo del eje Z"
-#: src/slic3r/GUI/ConfigWizard.cpp:222
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:160
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141
+msgid "Alt + Mouse wheel"
+msgstr "Alt + Rueda del ratón"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:240
msgid "Alternate nozzles:"
msgstr "Alternar nozzles:"
-#: src/slic3r/GUI/Plater.cpp:5002
-#, c-format
+#: src/slic3r/GUI/Preferences.cpp:163
+msgid "Always ask for unsaved changes when selecting new preset"
+msgstr "Preguntar siempre por los cambios no guardados al seleccionar un nuevo ajuste preestablecido"
+
+#: src/slic3r/GUI/Plater.cpp:5135
+#, possible-c-format
msgid "AMF file exported to %s"
msgstr "Archivo AMF exportado a %s"
-#: src/slic3r/GUI/GLCanvas3D.cpp:690
-msgid ""
-"An object outside the print area was detected\n"
-"Resolve the current problem to continue slicing"
-msgstr ""
-"Se ha detectado una pieza fuera del área de impresión\n"
-"Soluciona el problema actual para continuar el laminado"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:685
-msgid "An object outside the print area was detected"
-msgstr "Se ha detectado una pieza fuera del área de impresión"
+#: src/slic3r/GUI/GLCanvas3D.cpp:638
+msgid "An object outside the print area was detected.\nResolve the current problem to continue slicing."
+msgstr "Se detectó un objeto fuera del área de impresión.\nResuelve el problema actual para seguir laminando."
-#: src/slic3r/GUI/Tab.cpp:2943
-msgid "and it has the following unsaved changes:"
-msgstr "y tiene los siguientes cambios sin guardar:"
+#: src/slic3r/GUI/GLCanvas3D.cpp:633
+msgid "An object outside the print area was detected."
+msgstr "Se detectó un objeto fuera del área de impresión."
-#: src/slic3r/GUI/Plater.cpp:3170
+#: src/slic3r/GUI/Plater.cpp:2972
msgid "Another export job is currently running."
msgstr "Otro trabajo de exportación está aún en marcha."
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:162
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
msgid "Any arrow"
msgstr "Cualquier flecha"
-#: src/slic3r/GUI/Tab.cpp:965
+#: src/slic3r/GUI/Tab.cpp:1283
msgid "Any modifications should be saved as a new preset inherited from this one."
msgstr "Cualquier modificación debe guardarse como un nuevo preset heredado de este."
-#: src/libslic3r/PrintConfig.cpp:104
+#: src/libslic3r/PrintConfig.cpp:162
+msgid "API key"
+msgstr "Clave API"
+
+#: src/libslic3r/PrintConfig.cpp:106
msgid "API Key / Password"
msgstr "Clave API / Contraseña"
-#: src/slic3r/GUI/GUI_App.cpp:810
+#: src/slic3r/GUI/GUI_App.cpp:1493
msgid "Application preferences"
msgstr "Preferencias de la aplicación"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1374
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221
msgid "Apply changes"
msgstr "Aplicar cambios"
-#: src/libslic3r/PrintConfig.cpp:575 src/libslic3r/PrintConfig.cpp:1708
+#: src/libslic3r/PrintConfig.cpp:611 src/libslic3r/PrintConfig.cpp:1823
msgid "approximate seconds"
msgstr "segundos aproximadamente"
-#: src/libslic3r/PrintConfig.cpp:428 src/libslic3r/PrintConfig.cpp:854
+#: src/libslic3r/PrintConfig.cpp:464 src/libslic3r/PrintConfig.cpp:892
msgid "Archimedean Chords"
msgstr "Acordes de Arquímedes"
-#: src/libslic3r/Zipper.cpp:88
+#: src/libslic3r/miniz_extension.cpp:147
msgid "archive is too large"
msgstr "el archivo es demasiado grande"
-#. TRN remove/delete
-#: src/slic3r/GUI/Tab.cpp:3123
+#: src/slic3r/GUI/Tab.cpp:3420
msgid "Are you sure you want to %1% the selected preset?"
msgstr "¿Estás seguro de que deseas %1% el preset seleccionado?"
#: src/slic3r/GUI/FirmwareDialog.cpp:902
-msgid ""
-"Are you sure you want to cancel firmware flashing?\n"
-"This could leave your printer in an unusable state!"
-msgstr ""
-"¿Estas seguro de cancelar el flaseo del firmware?\n"
-"¡Esto podría dejar tu impresora en un estado inusable!"
+msgid "Are you sure you want to cancel firmware flashing?\nThis could leave your printer in an unusable state!"
+msgstr "¿Estás seguro de cancelar el flasheo del firmware?\n¡Esto podría dejar tu impresora en un estado inusable!"
-#: src/slic3r/GUI/DoubleSlider.cpp:1903 src/slic3r/GUI/DoubleSlider.cpp:1924
+#: src/slic3r/GUI/DoubleSlider.cpp:2122 src/slic3r/GUI/DoubleSlider.cpp:2142
msgid "Are you sure you want to continue?"
msgstr "¿Estás seguro de que quieres continuar?"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269
+#: src/slic3r/GUI/Tab.cpp:3392
+msgid "Are you sure you want to delete \"%1%\" preset from the physical printer \"%2%\"?"
+msgstr "¿Está seguro de que desea eliminar el ajuste preestablecido \"%1%\" de la impresora física \"%2%\"?"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:658
+msgid "Are you sure you want to delete \"%1%\" printer?"
+msgstr "¿Estás seguro de que quieres borrar la impresora \"%1%\"?"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1128
msgid "Are you sure you want to do it?"
msgstr "¿Estás seguro de que quieres hacerlo?"
-#: src/libslic3r/PrintConfig.cpp:2423
+#: src/libslic3r/PrintConfig.cpp:2566
msgid "Area fill"
msgstr "Ãrea de relleno"
-#: src/slic3r/GUI/Plater.cpp:641
+#: src/slic3r/GUI/Plater.cpp:507
msgid "Around object"
msgstr "Alrededor de objeto"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:157
-#: src/slic3r/GUI/Plater.cpp:2754
+#: src/slic3r/GUI/GLCanvas3D.cpp:4859 src/slic3r/GUI/KBShortcutsDialog.cpp:151
+#: src/slic3r/GUI/Plater.cpp:1549
msgid "Arrange"
msgstr "Organiza"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:158
+#: src/slic3r/GUI/GLCanvas3D.cpp:3889
+msgid "Arrange options"
+msgstr "Opciones de colocación"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4859 src/slic3r/GUI/KBShortcutsDialog.cpp:152
msgid "Arrange selection"
msgstr "Ordenar selección"
-#: src/libslic3r/PrintConfig.cpp:3443
+#: src/libslic3r/PrintConfig.cpp:3642
msgid "Arrange the supplied models in a plate and merge them in a single model in order to perform actions once."
-msgstr "Organizar los modelos suministrados en una base y combínarlos en un solo modelo para realizar acciones una vez."
+msgstr "Organizar los modelos suministrados en una base y combinarlos en un solo modelo para realizar acciones una vez."
-#: src/slic3r/GUI/Plater.cpp:2813
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:149
msgid "Arranging"
msgstr "Organizando"
-#: src/slic3r/GUI/Plater.cpp:2841
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:182
msgid "Arranging canceled."
msgstr "Ordenamiento cancelado."
-#: src/slic3r/GUI/Plater.cpp:2842
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:183
msgid "Arranging done."
msgstr "Organización terminada."
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:159
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:206
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
msgid "Arrow Down"
msgstr "Flecha hacia abajo"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:160
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:229
msgid "Arrow Left"
msgstr "Flecha hacia izquierda"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:161
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:230
msgid "Arrow Right"
msgstr "Flecha hacia derecha"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:204
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:214
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:158
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
msgid "Arrow Up"
msgstr "Flecha hacia arriba"
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:290
+#: src/slic3r/GUI/GUI_App.cpp:246
+msgid "Artwork model by Nora Al-Badri and Jan Nikolai Nelles"
+msgstr "Modelo artístico realizado por Nora Al-Badri y Jan Nikolai Nelles"
+
+#: src/slic3r/GUI/OpenGLManager.cpp:265
msgid "As a workaround, you may run PrusaSlicer with a software rendered 3D graphics by running prusa-slicer.exe with the --sw_renderer parameter."
msgstr "Como solución alternativa, puedes ejecutar PrusaSlicer con un software de gráficos en 3D ejecutando prusaslicer.exe con el parámetro --sw_renderer."
-#: src/slic3r/GUI/GUI_App.cpp:1086 src/slic3r/GUI/Plater.cpp:2313
-#: src/slic3r/GUI/Tab.cpp:2960
+#: src/slic3r/GUI/Preferences.cpp:154
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:659
+msgid "Ask for unsaved changes when closing application"
+msgstr "Preguntar por los cambios no guardados al cerrar la aplicación"
+
+#: src/slic3r/GUI/Preferences.cpp:161
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:660
+msgid "Ask for unsaved changes when selecting new preset"
+msgstr "Preguntar por los cambios no guardados al seleccionar un nuevo ajuste preestablecido"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1183 src/slic3r/GUI/Preferences.cpp:91
+msgid "Associate .3mf files to PrusaSlicer"
+msgstr "Asociar archivos .3mf a PrusaSlicer"
+
+#: src/slic3r/GUI/Preferences.cpp:177
+msgid "Associate .gcode files to PrusaSlicer G-code Viewer"
+msgstr "Asociar archivos .gcode al Visor de CódigoG de PrusaSlicer"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1184 src/slic3r/GUI/Preferences.cpp:98
+msgid "Associate .stl files to PrusaSlicer"
+msgstr "Asociar archivos .stl a PrusaSlicer"
+
+#: src/slic3r/GUI/GUI_App.cpp:1878 src/slic3r/GUI/Jobs/SLAImportJob.cpp:210
+#: src/slic3r/GUI/Plater.cpp:2256 src/slic3r/GUI/Tab.cpp:3189
msgid "Attention!"
msgstr "¡Atención!"
-#: src/libslic3r/PrintConfig.cpp:1871
+#: src/libslic3r/PrintConfig.cpp:150
+msgid "Authorization Type"
+msgstr "Tipo de Autorización"
+
+#: src/libslic3r/PrintConfig.cpp:2013
msgid "Auto generated supports"
msgstr "Soportes generados automáticamente"
-#: src/slic3r/GUI/Preferences.cpp:47
+#: src/slic3r/GUI/Preferences.cpp:64
msgid "Auto-center parts"
msgstr "Piezas auto-centradas"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1377
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224
msgid "Auto-generate points"
msgstr "Auto-generar puntos"
-#: src/slic3r/GUI/Plater.cpp:1157
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:1066
+#, possible-c-format
msgid "Auto-repaired (%d errors)"
msgstr "Reparados automáticamente (%d errores)"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:339
-#, c-format
+#: src/slic3r/GUI/GUI_ObjectList.cpp:386
+#, possible-c-format
msgid "Auto-repaired (%d errors):"
msgstr "Reparado automáticamente (%d errores):"
@@ -840,67 +965,75 @@ msgstr "Reparado automáticamente (%d errores):"
msgid "Autodetected"
msgstr "Detectado automáticamente"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1134
msgid "Autogenerate support points"
msgstr "Genera los puntos de apoyo automáticamente"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1127
msgid "Autogeneration will erase all manually edited points."
msgstr "La autogeneración borrará todos los puntos editados manualmente."
-#: src/slic3r/GUI/Tab.cpp:3632
+#: src/slic3r/GUI/Tab.cpp:4051
msgid "Automatic generation"
msgstr "Generación automática"
-#: src/slic3r/GUI/ConfigWizard.cpp:761
+#: src/slic3r/GUI/ConfigWizard.cpp:1120
msgid "Automatic updates"
msgstr "Actualizaciones automáticas"
-#: src/slic3r/GUI/MainFrame.cpp:536
+#: src/slic3r/GUI/MainFrame.cpp:1137
msgid "Automatically repair an STL file"
msgstr "Archivo STL reparado automáticamente"
-#: src/slic3r/GUI/Tab.cpp:1171
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:129
+msgid "Autoset by angle"
+msgstr "Establecer automáticamente según ángulo"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:233
+msgid "Autoset custom supports"
+msgstr "Soportes personalizados automáticos"
+
+#: src/slic3r/GUI/Tab.cpp:1501
msgid "Autospeed (advanced)"
msgstr "Velocidad automática (avanzado)"
-#: src/libslic3r/PrintConfig.cpp:136
+#: src/libslic3r/PrintConfig.cpp:169
msgid "Avoid crossing perimeters"
msgstr "Evita cruzar perímetros"
-#: src/slic3r/GUI/Tab.cpp:3268
+#: src/libslic3r/PrintConfig.cpp:188
+msgid "Avoid crossing perimeters - Max detour length"
+msgstr "Evitar cruzar perímetros - Longitud máxima del desvío"
+
+#: src/slic3r/GUI/Tab.cpp:3705
msgid "BACK ARROW"
msgstr "FLECHA HACIA ATRÃS"
-#: src/slic3r/GUI/Tab.cpp:3290
-msgid ""
-"BACK ARROW icon indicates that the settings were changed and are not equal to the last saved preset for the current option group.\n"
-"Click to reset all settings for the current option group to the last saved preset."
-msgstr ""
-"El símbolo de FLECHA ATRÃS indica que los ajustes cambiaron y que no son iguales a los que se guardaron para el grupo de opciones actual.\n"
-"Haz clic para devolver esos valores a los últimos guardados."
+#: src/slic3r/GUI/Tab.cpp:3727
+msgid "BACK ARROW icon indicates that the settings were changed and are not equal to the last saved preset for the current option group.\nClick to reset all settings for the current option group to the last saved preset."
+msgstr "El símbolo de FLECHA ATRÃS indica que los ajustes cambiaron y que no son iguales a los que se guardaron para el grupo de opciones actual.\nHaz clic para devolver esos valores a los últimos guardados."
-#: src/slic3r/GUI/Tab.cpp:3304
-msgid ""
-"BACK ARROW icon indicates that the value was changed and is not equal to the last saved preset.\n"
-"Click to reset current value to the last saved preset."
-msgstr ""
-"La FLECHA ATRÃS indica que el valor ha cambiado y ya no es el mismo que el guardado la última vez.\n"
-"Haz clic para restaurar el valor al último ajuste guardado."
+#: src/slic3r/GUI/Tab.cpp:3741
+msgid "BACK ARROW icon indicates that the value was changed and is not equal to the last saved preset.\nClick to reset current value to the last saved preset."
+msgstr "La FLECHA ATRÃS indica que el valor ha cambiado y ya no es el mismo que el guardado la última vez.\nHaz clic para restaurar el valor al último ajuste guardado."
-#: src/slic3r/GUI/Preferences.cpp:55
+#: src/slic3r/GUI/Preferences.cpp:72
msgid "Background processing"
msgstr "Procesamiento en segundo plano"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:351
+#: src/slic3r/GUI/GUI_ObjectList.cpp:398
msgid "backwards edges"
msgstr "bordes hacia atrás"
-#: src/slic3r/GUI/MainFrame.cpp:174
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60
+msgid "Balanced"
+msgstr "Balanceado"
+
+#: src/slic3r/GUI/MainFrame.cpp:535 src/slic3r/GUI/MainFrame.cpp:537
msgid "based on Slic3r"
msgstr "basado en Slic3r"
-#: src/slic3r/GUI/Tab.cpp:1439
+#: src/slic3r/GUI/Tab.cpp:1785
msgid "Bed"
msgstr "Base"
@@ -912,7 +1045,7 @@ msgstr "Modelo de base personalizado"
msgid "Bed custom texture"
msgstr "Textura personalizada de la base"
-#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:929
+#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1295
msgid "Bed Shape"
msgstr "Forma de la base de impresión"
@@ -920,23 +1053,23 @@ msgstr "Forma de la base de impresión"
msgid "Bed shape"
msgstr "Forma de la base de impresión"
-#: src/slic3r/GUI/ConfigWizard.cpp:929
+#: src/slic3r/GUI/ConfigWizard.cpp:1295
msgid "Bed Shape and Size"
msgstr "Tamaño y forma de la base"
-#: src/libslic3r/PrintConfig.cpp:147
+#: src/libslic3r/PrintConfig.cpp:181
msgid "Bed temperature"
msgstr "Temperatura de la base"
-#: src/libslic3r/PrintConfig.cpp:145
+#: src/libslic3r/PrintConfig.cpp:178
msgid "Bed temperature for layers after the first one. Set this to zero to disable bed temperature control commands in the output."
-msgstr "Temperatura de la base calefactable para las capas después de la primera. Ajuste esto a cero para deshabilitar los comandos de control de temperatura de la base calefactable en la salida."
+msgstr "Temperatura de la base calefactable para las capas después de la primera. Ajusta esto a cero para deshabilitar los comandos de control de temperatura de la base calefactable en la salida."
-#: src/slic3r/GUI/ConfigWizard.cpp:1051
+#: src/slic3r/GUI/ConfigWizard.cpp:1417
msgid "Bed Temperature:"
msgstr "Temperatura de la base:"
-#: src/slic3r/GUI/Tab.cpp:1988 src/libslic3r/PrintConfig.cpp:153
+#: src/slic3r/GUI/Tab.cpp:2175 src/libslic3r/PrintConfig.cpp:187
msgid "Before layer change G-code"
msgstr "Código G para antes del cambio de capa"
@@ -944,143 +1077,183 @@ msgstr "Código G para antes del cambio de capa"
msgid "Before roll back"
msgstr "Antes de volver atrás"
-#: src/slic3r/GUI/Plater.cpp:640
+#: src/slic3r/GUI/Plater.cpp:506
msgid "Below object"
msgstr "Por debajo del objeto"
-#: src/libslic3r/PrintConfig.cpp:1578
+#: src/libslic3r/PrintConfig.cpp:1686
msgid "Below Z"
msgstr "Por debajo de Z"
-#: src/libslic3r/PrintConfig.cpp:164
+#: src/libslic3r/PrintConfig.cpp:198
msgid "Between objects G-code"
msgstr "Código G para entre objetos"
-#: src/slic3r/GUI/Tab.cpp:2006
+#: src/slic3r/GUI/Tab.cpp:2196
msgid "Between objects G-code (for sequential printing)"
msgstr "Código G para entre objetos (para impresión secuencial)"
-#: src/libslic3r/PrintConfig.cpp:2489 src/libslic3r/PrintConfig.cpp:2490
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242
+msgid "Block"
+msgstr "Bloquear"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:383
+msgid "Block seam"
+msgstr "Bloquear costura"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:373
+msgid "Block supports"
+msgstr "Bloquear soportes"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:292
+msgid "Block supports by angle"
+msgstr "Bloquear soportes según ángulo"
+
+#: src/libslic3r/PrintConfig.cpp:2632 src/libslic3r/PrintConfig.cpp:2633
msgid "Bottle volume"
msgstr "Volumen de la botella"
-#: src/libslic3r/PrintConfig.cpp:2496 src/libslic3r/PrintConfig.cpp:2497
+#: src/libslic3r/PrintConfig.cpp:2639 src/libslic3r/PrintConfig.cpp:2640
msgid "Bottle weight"
msgstr "Peso botella"
#. TRN To be shown in the main menu View->Bottom
#. TRN To be shown in Print Settings "Bottom solid layers"
#. TRN To be shown in Print Settings "Top solid layers"
-#: src/slic3r/GUI/MainFrame.cpp:665 src/libslic3r/PrintConfig.cpp:174
-#: src/libslic3r/PrintConfig.cpp:183
+#: src/slic3r/GUI/MainFrame.cpp:962 src/slic3r/GUI/MainFrame.cpp:1282
+#: src/libslic3r/PrintConfig.cpp:208 src/libslic3r/PrintConfig.cpp:217
msgid "Bottom"
msgstr "Inferior"
-#: src/libslic3r/PrintConfig.cpp:435
+#: src/libslic3r/PrintConfig.cpp:471
msgid "Bottom fill pattern"
msgstr "Patrón de relleno inferior"
-#: src/slic3r/GUI/PresetHints.cpp:342
+#: src/slic3r/GUI/PresetHints.cpp:340
msgid "Bottom is open."
msgstr "La parte inferior está abierta."
-#: src/slic3r/GUI/PresetHints.cpp:336
+#: src/slic3r/GUI/PresetHints.cpp:334
msgid "Bottom shell is %1% mm thick for layer height %2% mm."
-msgstr "La carcasa inferior es %1% mm más grueso para la altura de capa de %2% mm."
+msgstr "La carcasa inferior es %1% mm más grueso para la altura de capa de %2% mm."
-#: src/libslic3r/PrintConfig.cpp:177
+#: src/libslic3r/PrintConfig.cpp:211
msgid "Bottom solid layers"
msgstr "Capas sólidas inferiores"
-#: src/slic3r/GUI/MainFrame.cpp:665
+#: src/slic3r/GUI/MainFrame.cpp:962 src/slic3r/GUI/MainFrame.cpp:1282
msgid "Bottom View"
msgstr "Vista inferior"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1432
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1464
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1468
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1595
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1599
msgid "Box"
msgstr "Caja"
-#: src/libslic3r/PrintConfig.cpp:193
+#: src/libslic3r/PrintConfig.cpp:227
msgid "Bridge"
msgstr "Puente"
-#: src/libslic3r/PrintConfig.cpp:222
+#: src/libslic3r/PrintConfig.cpp:256
msgid "Bridge flow ratio"
msgstr "Relación de flujo del puente"
-#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:316
+#: src/slic3r/GUI/GUI_Preview.cpp:308 src/libslic3r/ExtrusionEntity.cpp:321
+#: src/libslic3r/ExtrusionEntity.cpp:350
msgid "Bridge infill"
msgstr "Relleno de puente"
-#: src/libslic3r/PrintConfig.cpp:234
+#: src/libslic3r/PrintConfig.cpp:268
msgid "Bridges"
msgstr "Puentes"
-#: src/libslic3r/PrintConfig.cpp:213
+#: src/libslic3r/PrintConfig.cpp:247
msgid "Bridges fan speed"
msgstr "Velocidad del ventilador para puentes"
-#: src/libslic3r/PrintConfig.cpp:202
+#: src/libslic3r/PrintConfig.cpp:236
msgid "Bridging angle"
msgstr "Ãngulo de puente"
-#: src/libslic3r/PrintConfig.cpp:204
+#: src/libslic3r/PrintConfig.cpp:238
msgid "Bridging angle override. If left to zero, the bridging angle will be calculated automatically. Otherwise the provided angle will be used for all bridges. Use 180° for zero angle."
-msgstr "Anulación de ángulo de puente. Si se deja en cero, el ángulo de puente se calculará automáticamente. De lo contrario, el ángulo proporcionado se usará para todos los puentes. Use 180 ° para ángulo con cero grados."
+msgstr "Anulación de ángulo de puente. Si se deja en cero, el ángulo de puente se calculará automáticamente. De lo contrario, el ángulo proporcionado se usará para todos los puentes. Usa 180° para ángulo con cero grados."
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:218
msgid "Bridging volumetric"
msgstr "Puente volumétrico"
-#: src/slic3r/GUI/Plater.cpp:534 src/slic3r/GUI/Tab.cpp:1117
+#: src/slic3r/GUI/Plater.cpp:400 src/slic3r/GUI/Tab.cpp:1446
msgid "Brim"
msgstr "Balsa"
-#: src/libslic3r/PrintConfig.cpp:244
+#: src/libslic3r/PrintConfig.cpp:278
msgid "Brim width"
msgstr "Ancho de la balsa"
-#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1658
-#: src/slic3r/GUI/Tab.cpp:1721
+#: src/slic3r/GUI/FirmwareDialog.cpp:805
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:271
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327
msgid "Browse"
msgstr "Buscar"
-#: src/libslic3r/Zipper.cpp:82
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:28
+msgid "Brush shape"
+msgstr "Forma de pincel"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:27
+msgid "Brush size"
+msgstr "Tamaño del pincel"
+
+#: src/libslic3r/miniz_extension.cpp:141
msgid "buffer too small"
msgstr "buffer demasiado pequeño"
+#: src/slic3r/GUI/GUI_App.cpp:1152
+msgid "But since this version of PrusaSlicer we don't show this information in Printer Settings anymore.\nSettings will be available in physical printers settings."
+msgstr "Pero dado que a partir de esta versión de PrusaSlicer ya no mostramos esta información en los ajustes de impresora.\nLos ajustes se mostrarán en la configuración de impresora física."
+
#: src/slic3r/GUI/ButtonsDescription.cpp:16
msgid "Buttons And Text Colors Description"
msgstr "Descripción de los botones y de los colores del texto"
-#: src/slic3r/GUI/PresetHints.cpp:223
+#: src/slic3r/GUI/GUI_App.cpp:1084
+msgid "By default new Printer devices will be named as \"Printer N\" during its creation.\nNote: This name can be changed later from the physical printers settings"
+msgstr "Por defecto, los nuevos dispositivos de impresión se llamarán \"Impresora N\" durante su creación.\nNota: Este nombre se puede cambiar posteriormente en los ajustes de impresora física"
+
+#: src/slic3r/GUI/PresetHints.cpp:222
msgid "by the print profile maximum"
msgstr "por el máximo perfil de impresión"
-#: src/slic3r/GUI/Preferences.cpp:113
+#: src/slic3r/GUI/Preferences.cpp:178
msgid "Camera"
msgstr "Cámara"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:144
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:140
msgid "Camera view"
msgstr "Vista de cámara"
-#: src/slic3r/GUI/ConfigWizard.cpp:1982 src/slic3r/GUI/FirmwareDialog.cpp:151
+#: src/slic3r/GUI/ConfigWizard.cpp:2493 src/slic3r/GUI/FirmwareDialog.cpp:151
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:245
#: src/slic3r/GUI/ProgressStatusBar.cpp:26
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:644
msgid "Cancel"
msgstr "Cancelar"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:157
+#: src/slic3r/GUI/PrintHostDialogs.cpp:155
msgid "Cancel selected"
msgstr "Cancelar selección"
-#: src/slic3r/GUI/Plater.cpp:3669 src/slic3r/GUI/PrintHostDialogs.cpp:233
+#: src/slic3r/GUI/Plater.cpp:3589 src/slic3r/GUI/PrintHostDialogs.cpp:233
msgid "Cancelled"
msgstr "Cancelado"
-#: src/slic3r/GUI/Plater.cpp:3153 src/slic3r/GUI/PrintHostDialogs.cpp:232
+#: src/slic3r/GUI/Plater.cpp:2953 src/slic3r/GUI/PrintHostDialogs.cpp:232
msgid "Cancelling"
msgstr "Cancelando"
@@ -1092,108 +1265,100 @@ msgstr "Cancelando..."
msgid "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible."
msgstr "No se puede calcular el ancho de extrusión para %1%: Variable \"%2%\" no accesible."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3017
-msgid ""
-"Cannot insert a new layer range after the current layer range.\n"
-"Current layer range overlaps with the next layer range."
-msgstr ""
-"No se puede insertar un nuevo rango de capas después del rango de capa actual.\n"
-"El rango de capa actual se superpone con el siguiente rango de capa."
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3400
+msgid "Cannot insert a new layer range after the current layer range.\nCurrent layer range overlaps with the next layer range."
+msgstr "No se puede insertar un nuevo rango de capas después del rango de capa actual.\nEl rango de capa actual se superpone con el siguiente rango de capa."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3008
-msgid ""
-"Cannot insert a new layer range after the current layer range.\n"
-"The next layer range is too thin to be split to two\n"
-"without violating the minimum layer height."
-msgstr ""
-"No se puede insertar un nuevo rango de capas después del rango de capa actual.\n"
-"El siguiente rango de capa es demasiado delgado para dividirse en dos\n"
-"sin violar la altura mínima de la capa."
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3391
+msgid "Cannot insert a new layer range after the current layer range.\nThe next layer range is too thin to be split to two\nwithout violating the minimum layer height."
+msgstr "No se puede insertar un nuevo rango de capas después del rango de capa actual.\nEl siguiente rango de capa es demasiado delgado para dividirse en dos\nsin violar la altura mínima de la capa."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3012
-msgid ""
-"Cannot insert a new layer range between the current and the next layer range.\n"
-"The gap between the current layer range and the next layer range\n"
-"is thinner than the minimum layer height allowed."
-msgstr ""
-"No se puede insertar un nuevo rango de capas entre el rango de capa actual y el siguiente.\n"
-"La brecha entre el rango de capa actual y el siguiente rango de capa\n"
-"es más delgada que la altura mínima de capa permitida."
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3395
+msgid "Cannot insert a new layer range between the current and the next layer range.\nThe gap between the current layer range and the next layer range\nis thinner than the minimum layer height allowed."
+msgstr "No se puede insertar un nuevo rango de capas entre el rango de capa actual y el siguiente.\nLa brecha entre el rango de capa actual y el siguiente rango de capa\nes más delgada que la altura mínima de capa permitida."
-#: src/slic3r/GUI/Tab.cpp:3073
+#: src/slic3r/GUI/SavePresetDialog.cpp:137
msgid "Cannot overwrite a system profile."
msgstr "No se puede sobre-escribir un perfil del sistema."
-#: src/slic3r/GUI/Tab.cpp:3077
+#: src/slic3r/GUI/SavePresetDialog.cpp:142
msgid "Cannot overwrite an external profile."
msgstr "No puedo sobre-escribir un valor externo."
-#: src/libslic3r/SLAPrint.cpp:613
+#: src/libslic3r/SLAPrint.cpp:627
msgid "Cannot proceed without support points! Add support points or disable support generation."
msgstr "No se puede proceder sin puntos de soporte! Añade puntos de soporte o desactiva la generación de soportes."
-#: src/slic3r/GUI/Tab.cpp:1834
+#: src/slic3r/GUI/Tab.cpp:2068 src/slic3r/GUI/UnsavedChangesDialog.cpp:1066
msgid "Capabilities"
msgstr "Capacidades"
-#: src/slic3r/GUI/GUI_App.cpp:801
+#: src/slic3r/GUI/GUI_App.cpp:1481
msgid "Capture a configuration snapshot"
msgstr "Captura una instantánea de configuración"
-#: src/libslic3r/PrintConfig.cpp:3424
+#: src/slic3r/GUI/ImGuiWrapper.cpp:801 src/slic3r/GUI/Search.cpp:458
+msgid "Category"
+msgstr "Categoría"
+
+#: src/libslic3r/PrintConfig.cpp:3623
msgid "Center"
msgstr "Centro"
-#: src/libslic3r/PrintConfig.cpp:3425
+#: src/libslic3r/PrintConfig.cpp:3624
msgid "Center the print around the given center."
msgstr "Centrar la impresión alrededor del centro dado."
-#: src/slic3r/GUI/Tab.cpp:1728
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:329
msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*"
msgstr "Archivos de certificados (*.crt, *.pem)|*.crt;*.pem|Todos|*.*"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:180
+#: src/slic3r/GUI/SavePresetDialog.cpp:313
+msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\""
+msgstr "Cambia \"%1%\" a \"%2%\" para esta impresora física \"%3%\""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:174
msgid "Change camera type (perspective, orthographic)"
msgstr "Cambiar tipo de cámara (perspectiva, ortográfica)"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:885
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:693
msgid "Change drainage hole diameter"
msgstr "Cambiar diámetro orificio de drenaje"
-#: src/slic3r/GUI/DoubleSlider.cpp:1144 src/slic3r/GUI/GUI_ObjectList.cpp:1671
+#: src/slic3r/GUI/DoubleSlider.cpp:1273 src/slic3r/GUI/GUI_ObjectList.cpp:1800
msgid "Change extruder"
msgstr "Cambiar extrusor"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:536
+#: src/slic3r/GUI/GUI_ObjectList.cpp:574
msgid "Change Extruder"
msgstr "Cambiar Extrusor"
-#: src/slic3r/GUI/DoubleSlider.cpp:1145
+#: src/slic3r/GUI/DoubleSlider.cpp:1274
msgid "Change extruder (N/A)"
msgstr "Cambiar extrusor (N/A)"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3997
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4484
msgid "Change Extruders"
msgstr "Cambiar Extrusores"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:152
-#, c-format
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:157
+#, possible-c-format
msgid "Change Option %s"
msgstr "Cambiar opción %s"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3558
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4021
msgid "Change Part Type"
msgstr "Cambiar Tipo de Pieza"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:820
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:694
msgid "Change point head diameter"
msgstr "Cambiar diámetro de la cabeza de punta"
-#: src/slic3r/GUI/Plater.cpp:3944
+#: src/slic3r/GUI/Plater.cpp:3862
msgid "Change the number of instances of the selected object"
msgstr "Cambiar número de instancias al objeto seleccionado"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1589
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1718
msgid "Change type"
msgstr "Cambiar tipo"
@@ -1201,125 +1366,176 @@ msgstr "Cambiar tipo"
msgid "Changelog && Download"
msgstr "Registro de cambios && Descargar"
-#: src/slic3r/GUI/GUI_App.cpp:442
+#: src/slic3r/GUI/GUI_App.cpp:1245
msgid "Changing of an application language"
msgstr "Cambio de idioma de una aplicación"
-#: src/slic3r/GUI/ConfigWizard.cpp:769 src/slic3r/GUI/Preferences.cpp:64
+#: src/slic3r/GUI/ConfigWizard.cpp:1128 src/slic3r/GUI/Preferences.cpp:81
msgid "Check for application updates"
msgstr "Comprueba si hay actualizaciones de la aplicación"
-#: src/slic3r/GUI/GUI_App.cpp:802
+#: src/slic3r/GUI/GUI_App.cpp:1482
msgid "Check for configuration updates"
msgstr "Comprueba si hay actualizaciones de configuración"
-#: src/slic3r/GUI/GUI_App.cpp:802
+#: src/slic3r/GUI/GUI_App.cpp:1482
msgid "Check for updates"
msgstr "Comprueba si hay act&ualizaciones"
-#: src/slic3r/GUI/BedShapeDialog.cpp:532
+#: src/slic3r/Utils/PresetUpdater.cpp:412
+#: src/slic3r/Utils/PresetUpdater.cpp:420
+msgid "checking install indices"
+msgstr "comprobando índices de instalación"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:608
msgid "Choose a file to import bed texture from (PNG/SVG):"
msgstr "Escoge un archivo para importar la textura de la base de impresión (PNG/SVG):"
-#: src/slic3r/GUI/MainFrame.cpp:773
+#: src/slic3r/GUI/MainFrame.cpp:1474
msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):"
-msgstr "Elija un archivo para laminar (STL / OBJ / AMF / 3MF / PRUSA):"
+msgstr "Elije un archivo para laminar (STL/OBJ/AMF/3MF/PRUSA):"
-#: src/slic3r/GUI/BedShapeDialog.cpp:555
+#: src/slic3r/GUI/BedShapeDialog.cpp:631
msgid "Choose an STL file to import bed model from:"
msgstr "Escoge un archivo STL para importar el modelo de la base de impresión:"
-#: src/slic3r/GUI/BedShapeDialog.cpp:487
+#: src/slic3r/GUI/BedShapeDialog.cpp:563
msgid "Choose an STL file to import bed shape from:"
msgstr "Escoge un archivo STL para importar la forma de la base:"
-#: src/slic3r/GUI/GUI_App.cpp:555
+#: src/slic3r/GUI/GUI_App.cpp:1208
msgid "Choose one file (3MF/AMF):"
msgstr "Selecciona un archivo (3MF/AMF):"
-#: src/slic3r/GUI/GUI_App.cpp:567
+#: src/slic3r/GUI/GUI_App.cpp:1233
+msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):"
+msgstr "Elige un archivo (GCODE/.GCO/.G/.ngc/NGC):"
+
+#: src/slic3r/GUI/GUI_App.cpp:1220
msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):"
-msgstr "Escoja uno o mas archivos (STL/OBJ/AMF/3MF/PRUSA):"
+msgstr "Escoje uno o más archivos (STL/OBJ/AMF/3MF/PRUSA):"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:35
+msgid "Choose SLA archive:"
+msgstr "Elegir archivo SLA:"
-#: src/slic3r/GUI/ConfigWizard.cpp:895
+#: src/slic3r/GUI/ConfigWizard.cpp:1261
msgid "Choose the type of firmware used by your printer."
msgstr "Selecciona el tipo de firmware que usa tu impresora."
-#: src/slic3r/GUI/BedShapeDialog.cpp:89
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36
+msgid "Circle"
+msgstr "Círculo"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:142
msgid "Circular"
msgstr "Circular"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4624 src/slic3r/GUI/GLCanvas3D.cpp:4657
-msgid "Click right mouse button to open History"
-msgstr "Click con botón derecho para abrir Historial"
+#: src/slic3r/GUI/GLCanvas3D.cpp:5028 src/slic3r/GUI/GLCanvas3D.cpp:5067
+msgid "Click right mouse button to open/close History"
+msgstr "Clic con botón derecho del ratón para abrir/cerrar Historia"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4341
+msgid "Click right mouse button to show arrangement options"
+msgstr "Clic derecho del ratón para mostrar opciones de colocación"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:404
+#: src/slic3r/GUI/GUI_ObjectList.cpp:451
msgid "Click the icon to change the object printable property"
-msgstr "Click en el icono para cambiar las propiedades del objeto imprimible"
+msgstr "Clic en el icono para cambiar las propiedades del objeto imprimible"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:398
+#: src/slic3r/GUI/GUI_ObjectList.cpp:445
msgid "Click the icon to change the object settings"
-msgstr "Click en el icono para cambiar los ajustes del objeto"
+msgstr "Clic en el icono para cambiar los ajustes del objeto"
-#: src/slic3r/GUI/Plater.cpp:343
+#: src/slic3r/GUI/PresetComboBoxes.cpp:566
msgid "Click to edit preset"
msgstr "Clic para cambiar el ajuste inicial"
-#: src/libslic3r/PrintConfig.cpp:252
+#: src/slic3r/GUI/GCodeViewer.cpp:2071
+msgid "Click to hide"
+msgstr "Clic para ocultar"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2071
+msgid "Click to show"
+msgstr "Clic para mostrar"
+
+#: src/libslic3r/PrintConfig.cpp:286
msgid "Clip multi-part objects"
-msgstr "Enlazaar objetos de varias partes"
+msgstr "Enlazar objetos de varias partes"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:25
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57
msgid "Clipping of view"
msgstr "Recorte de la vista"
#: src/slic3r/GUI/FirmwareDialog.cpp:852
-#: src/slic3r/GUI/Mouse3DController.cpp:364
-#: src/slic3r/GUI/PrintHostDialogs.cpp:161
+#: src/slic3r/GUI/Mouse3DController.cpp:353
+#: src/slic3r/GUI/PrintHostDialogs.cpp:159
msgid "Close"
msgstr "Cerrar"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45
-#: src/libslic3r/PrintConfig.cpp:2934
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44
+#: src/libslic3r/PrintConfig.cpp:3098
msgid "Closing distance"
msgstr "Distancia de cierre"
-#: src/slic3r/GUI/Plater.cpp:1260 src/libslic3r/PrintConfig.cpp:582
+#: src/slic3r/GUI/MainFrame.cpp:1297 src/slic3r/GUI/Plater.cpp:2144
+msgid "Collapse sidebar"
+msgstr "Ocultar barra lateral"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:180
+msgid "Collapse/Expand the sidebar"
+msgstr "Ocultar/Expandir barra lateral"
+
+#: src/slic3r/GUI/Plater.cpp:1198 src/libslic3r/PrintConfig.cpp:618
msgid "Color"
msgstr "Color"
-#: src/slic3r/GUI/DoubleSlider.cpp:1005
+#: src/slic3r/GUI/GCodeViewer.cpp:2410 src/slic3r/GUI/GCodeViewer.cpp:2438
+msgid "Color change"
+msgstr "Cambio de color"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1130
msgid "Color change (\"%1%\")"
msgstr "Cambio de color (\"%1%\")"
-#: src/slic3r/GUI/DoubleSlider.cpp:1006
+#: src/slic3r/GUI/DoubleSlider.cpp:1131
msgid "Color change (\"%1%\") for Extruder %2%"
msgstr "Cambio de color (\"%1%\") para el Extrusor %2%"
-#: src/slic3r/GUI/GLCanvas3D.cpp:995
-#, c-format
-msgid "Color change for Extruder %d at %.2f mm"
-msgstr "Cambio de color para Extrusor %d en %.2f mm"
+#: src/slic3r/GUI/Tab.cpp:2203
+msgid "Color Change G-code"
+msgstr "Código G Cambio Color"
+
+#: src/libslic3r/PrintConfig.cpp:1960
+msgid "Color change G-code"
+msgstr "Código G Cambio color"
-#: src/slic3r/GUI/GUI_Preview.cpp:228 src/slic3r/GUI/GUI_Preview.cpp:572
-#: src/libslic3r/GCode/PreviewData.cpp:359
+#: src/slic3r/GUI/GCodeViewer.cpp:2531 src/slic3r/GUI/GUI_Preview.cpp:1475
+msgid "Color changes"
+msgstr "Cambios de color"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2242 src/slic3r/GUI/GUI_Preview.cpp:282
+#: src/slic3r/GUI/GUI_Preview.cpp:784 src/libslic3r/GCode/PreviewData.cpp:364
msgid "Color Print"
msgstr "Color Print"
-#: src/libslic3r/PrintConfig.cpp:260
+#: src/libslic3r/PrintConfig.cpp:294
msgid "Colorprint height"
msgstr "Altura de Colorprint"
-#: src/libslic3r/PrintConfig.cpp:990
+#: src/libslic3r/PrintConfig.cpp:1034
msgid "Combine infill every"
msgstr "Combinar el relleno cada"
-#: src/libslic3r/PrintConfig.cpp:995
+#: src/libslic3r/PrintConfig.cpp:1039
msgid "Combine infill every n layers"
msgstr "Combinar el relleno cada n capas"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:154
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:148
msgid "Commands"
msgstr "Comandos"
@@ -1327,23 +1543,23 @@ msgstr "Comandos"
msgid "Comment:"
msgstr "Comentario:"
-#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:280
+#: src/slic3r/GUI/Tab.cpp:107 src/libslic3r/PrintConfig.cpp:314
msgid "Compatible print profiles"
msgstr "Perfiles de impresión compatibles"
-#: src/libslic3r/PrintConfig.cpp:286
+#: src/libslic3r/PrintConfig.cpp:320
msgid "Compatible print profiles condition"
msgstr "Condición de perfiles de impresión compatibles"
-#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:265
+#: src/slic3r/GUI/Tab.cpp:101 src/libslic3r/PrintConfig.cpp:299
msgid "Compatible printers"
msgstr "Impresoras compatibles"
-#: src/libslic3r/PrintConfig.cpp:271
+#: src/libslic3r/PrintConfig.cpp:305
msgid "Compatible printers condition"
msgstr "Condición de impresoras compatibles"
-#: src/libslic3r/PrintConfig.cpp:304
+#: src/libslic3r/PrintConfig.cpp:338
msgid "Complete individual objects"
msgstr "Completar objetos individuales"
@@ -1351,27 +1567,27 @@ msgstr "Completar objetos individuales"
msgid "Completed"
msgstr "Completado"
-#: src/libslic3r/Zipper.cpp:54
+#: src/libslic3r/miniz_extension.cpp:113
msgid "compression failed"
msgstr "compresión fallida"
-#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:849
+#: src/libslic3r/PrintConfig.cpp:462 src/libslic3r/PrintConfig.cpp:887
msgid "Concentric"
-msgstr "Concentrico"
+msgstr "Concéntrico"
-#: src/slic3r/GUI/ConfigWizard.cpp:2110
+#: src/slic3r/GUI/ConfigWizard.cpp:2625
msgid "Configuration &Assistant"
msgstr "&Asistente de configuración"
-#: src/slic3r/GUI/ConfigWizard.cpp:2113
+#: src/slic3r/GUI/ConfigWizard.cpp:2628
msgid "Configuration &Wizard"
msgstr "Ayudante de co&nfiguración"
-#: src/slic3r/GUI/ConfigWizard.cpp:2109
+#: src/slic3r/GUI/ConfigWizard.cpp:2624
msgid "Configuration Assistant"
msgstr "Asistente de Configuración"
-#: src/libslic3r/PrintConfig.cpp:1316
+#: src/libslic3r/PrintConfig.cpp:1424
msgid "Configuration notes"
msgstr "Notas de configuración"
@@ -1387,11 +1603,15 @@ msgstr "Actualización de configuración"
msgid "Configuration update is available"
msgstr "Hay disponible una actualización de la Configuración"
-#: src/slic3r/GUI/UpdateDialogs.cpp:303
+#: src/slic3r/GUI/NotificationManager.hpp:321
+msgid "Configuration update is available."
+msgstr "Disponible la actualización de la configuración."
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:304
msgid "Configuration updates"
msgstr "Actualizaciones de la configuración"
-#: src/slic3r/GUI/ConfigWizard.cpp:2112
+#: src/slic3r/GUI/ConfigWizard.cpp:2627
msgid "Configuration Wizard"
msgstr "Asistente de configuración"
@@ -1399,15 +1619,19 @@ msgstr "Asistente de configuración"
msgid "Confirmation"
msgstr "Confirmación"
-#: src/slic3r/GUI/Tab.cpp:1931
-msgid "Connection failed."
-msgstr "Conexión fallida."
+#: src/libslic3r/PrintConfig.cpp:1070
+msgid "Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. PrusaSlicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max. Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
+msgstr "Conecta una línea de relleno a un perímetro interno con un segmento corto de un perímetro adicional. Si se expresa como porcentaje (por ejemplo: 15%), se calcula sobre el ancho de extrusión del relleno. PrusaSlicer intenta conectar dos líneas de relleno cercanas a un segmento de perímetro corto. Si no se encuentra tal segmento de perímetro más corto que infill_anchor_max, la línea de relleno se conecta a un segmento de perímetro en un solo lado y la longitud del segmento de perímetro tomado se limita a este parámetro, pero no más largo que anchor_length_max. Establezca este parámetro a cero para deshabilitar los perímetros de anclaje conectados a una sola línea de relleno."
+
+#: src/libslic3r/PrintConfig.cpp:1097
+msgid "Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. PrusaSlicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter. Set this parameter to zero to disable anchoring."
+msgstr "Conecta una línea de relleno a un perímetro interno con un segmento corto de un perímetro adicional. Si se expresa como porcentaje (por ejemplo: 15%), se calcula sobre el ancho de extrusión del relleno. PrusaSlicer intenta conectar dos líneas de relleno cercanas a un segmento de perímetro corto. Si no se encuentra un segmento de perímetro más corto que este parámetro, la línea de relleno se conecta a un segmento de perímetro en un solo lado y la longitud del segmento de perímetro tomado se limita a infill_anchor, pero no más largo que este parámetro. Establezca este parámetro a cero para deshabilitar el anclaje."
-#: src/slic3r/GUI/Tab.cpp:3627
+#: src/slic3r/GUI/Tab.cpp:4046
msgid "Connection of the support sticks and junctions"
msgstr "Conexión de las varillas de soporte y uniones"
-#: src/slic3r/Utils/AstroBox.cpp:83
+#: src/slic3r/Utils/AstroBox.cpp:84
msgid "Connection to AstroBox works correctly."
msgstr "La conexión a Astrobox funciona correctamente."
@@ -1423,124 +1647,148 @@ msgstr "La conexión a FlashAir funciona correctamente y la carga está habilita
msgid "Connection to OctoPrint works correctly."
msgstr "La conexión a OctoPrint funciona correctamente."
-#: src/slic3r/GUI/Tab.cpp:1928
-msgid "Connection to printer works correctly."
-msgstr "La conexión con la impresora funciona correctamente."
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:260
+msgid "Connection to printers connected via the print host failed."
+msgstr "Falló la conexión a las impresoras conectadas a través del host de impresión."
-#: src/slic3r/Utils/OctoPrint.cpp:176
+#: src/slic3r/Utils/OctoPrint.cpp:185
msgid "Connection to Prusa SL1 works correctly."
msgstr "La conexión con la Prusa SL1 funciona correctamente."
-#: src/libslic3r/PrintConfig.cpp:1909
+#: src/libslic3r/PrintConfig.cpp:2051
msgid "Contact Z distance"
msgstr "Distancia Z de contacto"
-#: src/slic3r/GUI/AboutDialog.cpp:261
+#: src/slic3r/GUI/AboutDialog.cpp:286
msgid "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and numerous others."
msgstr "Contribuciones de Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik y muchos otros."
-#: src/libslic3r/PrintConfig.cpp:2659
+#: src/slic3r/GUI/GUI_App.cpp:245
+msgid "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others."
+msgstr "Contribuciones de Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas Meszaros, Lukas Matena, Vojtech Kral, David Kocik y muchos otros."
+
+#: src/libslic3r/PrintConfig.cpp:2823
msgid "Controls the bridge type between two neighboring pillars. Can be zig-zag, cross (double zig-zag) or dynamic which will automatically switch between the first two depending on the distance of the two pillars."
-msgstr "Controla el tipo de puente entre dos pilares adyacentes. Puede ser zig-zag, cruzado(doble zig-zag) o dinámico que cambiará automáticamente entre los dos primeros dependiendo de la distancia de los dos pilares."
+msgstr "Controla el tipo de puente entre dos pilares adyacentes. Puede ser zig-zag, cruzado (doble zig-zag) o dinámico que cambiará automáticamente entre los dos primeros dependiendo de la distancia de los dos pilares."
-#: src/slic3r/GUI/Tab.cpp:1444
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1858 src/slic3r/GUI/Plater.cpp:4886
+msgid "Convert from imperial units"
+msgstr "Convertir de unidades imperiales"
+
+#: src/slic3r/GUI/Tab.cpp:1790
msgid "Cooling"
msgstr "Enfriamiento"
-#: src/libslic3r/PrintConfig.cpp:660
+#: src/libslic3r/PrintConfig.cpp:696
msgid "Cooling moves are gradually accelerating beginning at this speed."
msgstr "Los movimientos de enfriamiento se están acelerando gradualmente comenzando a esta velocidad."
-#: src/libslic3r/PrintConfig.cpp:679
+#: src/libslic3r/PrintConfig.cpp:715
msgid "Cooling moves are gradually accelerating towards this speed."
msgstr "Los movimientos de enfriamiento se están acelerando gradualmente hacia esta velocidad."
-#: src/slic3r/GUI/Tab.cpp:1465
+#: src/slic3r/GUI/Tab.cpp:1811
msgid "Cooling thresholds"
msgstr "Umbrales de enfriamiento"
-#: src/libslic3r/PrintConfig.cpp:327
+#: src/libslic3r/PrintConfig.cpp:361
msgid "Cooling tube length"
msgstr "Longitud del tubo de enfriamiento"
-#: src/libslic3r/PrintConfig.cpp:319
+#: src/libslic3r/PrintConfig.cpp:353
msgid "Cooling tube position"
msgstr "Posición del tubo de refrigeración"
-#: src/slic3r/GUI/Plater.cpp:4752
+#: src/slic3r/GUI/Plater.cpp:4856
msgid "Copies of the selected object"
msgstr "Copias del objeto seleccionado"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4505
+#: src/slic3r/GUI/GLCanvas3D.cpp:4871
msgid "Copy"
msgstr "Copiar"
-#: src/slic3r/GUI/MainFrame.cpp:589
+#: src/slic3r/GUI/MainFrame.cpp:1195
msgid "Copy selection to clipboard"
msgstr "Copiar selección al portapapeles"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:132
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:127
msgid "Copy to clipboard"
msgstr "Copiar al portapapeles"
-#: src/slic3r/GUI/SysInfoDialog.cpp:154
+#: src/slic3r/GUI/SysInfoDialog.cpp:177
msgid "Copy to Clipboard"
msgstr "Copiar al portapapeles"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:121
+#: src/slic3r/GUI/AboutDialog.cpp:304
+msgid "Copy Version Info"
+msgstr "Copiar Información de Versión"
+
+#: src/slic3r/Utils/PresetUpdater.cpp:84
+msgid "Copying of file %1% to %2% failed.\nError message : %3%\nCopying was triggered by function: %4%"
+msgstr "Copia del archivo %1% a %2% fallida.\nMensaje de error : %3%\nLa copia fue activada por la función: %4%"
+
+#: src/slic3r/Utils/PresetUpdater.cpp:91
+msgid "Copying of file %1% to %2% failed. Permissions fail at target file after copying.\nError message : %3%\nCopying was triggered by function: %4%"
+msgstr "Copia del archivo %1% a %2% fallida. Los permisos fallan en el archivo de destino después de copiar. \nMensaje de error : %3%\nLa copia fue activada por la función: %4%"
+
+#: src/slic3r/Utils/PresetUpdater.cpp:70
+msgid "Copying of file %1% to %2% failed. Permissions fail at target file before copying.\nError message : %3%\nThis error happend during %4% phase."
+msgstr "Copia del archivo %1% a %2% fallida. Los permisos fallan en el archivo de destino antes de copiar.\nMensaje de error : %3%\n Este error ocurrió durante la fase %4%."
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:156
msgid "Copying of the temporary G-code has finished but the exported code couldn't be opened during copy check. The output G-code is at %1%.tmp."
msgstr "La copia del código G temporal ha finalizado, pero el código exportado no se pudo abrir durante la verificación de la copia. El código G de salida está en %1%.tmp."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:118
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:153
msgid "Copying of the temporary G-code has finished but the original code at %1% couldn't be opened during copy check. The output G-code is at %2%.tmp."
-msgstr "La copia del código G temporal ha finalizado, pero el código original en %1% no se pudo abrir durante la verificación de copia. El código G de salida está en%2%.tmp."
+msgstr "La copia del código G temporal ha finalizado, pero el código original en %1% no se pudo abrir durante la verificación de copia. El código G de salida está en %2%.tmp."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:480
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:522
msgid "Copying of the temporary G-code to the output G-code failed"
msgstr "Error al copiar el código G temporal al código G de salida"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:109
-msgid "Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?"
-msgstr "La copia del código G tempolar al código G de salida falló. ¿Tal vez la tarjeta SD tiene la escritura bloqueada?"
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:163
+msgid "Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?\nError message: %1%"
+msgstr "Error al copiar el código G temporal en el código G de salida. ¿Quizás la tarjeta SD está bloqueada contra escritura?\nMensaje de error: %1%"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:112
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:147
msgid "Copying of the temporary G-code to the output G-code failed. There might be problem with target device, please try exporting again or using different device. The corrupted output G-code is at %1%.tmp."
msgstr "La copia del código G temporal al código G de salida ha fallado. Puede haber un problema con el dispositivo de destino, intenta exportar nuevamente o usa un dispositivo diferente. El código G de salida dañado está en %1%.tmp."
-#: src/slic3r/GUI/AboutDialog.cpp:127 src/slic3r/GUI/AboutDialog.cpp:256
+#: src/slic3r/GUI/AboutDialog.cpp:139 src/slic3r/GUI/AboutDialog.cpp:281
msgid "Copyright"
msgstr "Copyright"
-#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2572
+#: src/libslic3r/PrintConfig.cpp:2714 src/libslic3r/PrintConfig.cpp:2715
msgid "Correction for expansion"
msgstr "Corrección para la expansión"
-#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:3519
+#: src/slic3r/GUI/Tab.cpp:2270 src/slic3r/GUI/Tab.cpp:3935
msgid "Corrections"
msgstr "Correcciones"
-#: src/slic3r/GUI/Plater.cpp:1243 src/libslic3r/PrintConfig.cpp:760
-#: src/libslic3r/PrintConfig.cpp:2510 src/libslic3r/PrintConfig.cpp:2511
+#: src/slic3r/GUI/Plater.cpp:1158 src/libslic3r/PrintConfig.cpp:796
+#: src/libslic3r/PrintConfig.cpp:2653 src/libslic3r/PrintConfig.cpp:2654
msgid "Cost"
msgstr "Coste"
-#: src/slic3r/GUI/Plater.cpp:239
+#: src/slic3r/GUI/Plater.cpp:245
msgid "Cost (money)"
msgstr "Coste (dinero)"
-#: src/slic3r/GUI/Plater.cpp:2835
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:176
msgid "Could not arrange model objects! Some geometries may be invalid."
msgstr "¡No se pudieron organizar los objetos modelo! Algunas geometrías pueden ser inválidas."
-#: src/slic3r/Utils/AstroBox.cpp:89
+#: src/slic3r/Utils/AstroBox.cpp:90
msgid "Could not connect to AstroBox"
msgstr "No se pudo conectar con Astrobox"
-#: src/slic3r/Utils/Duet.cpp:54
+#: src/slic3r/Utils/Duet.cpp:55
msgid "Could not connect to Duet"
msgstr "No se pudo conectar con la Duet"
-#: src/slic3r/Utils/FlashAir.cpp:73
+#: src/slic3r/Utils/FlashAir.cpp:74
msgid "Could not connect to FlashAir"
msgstr "No puedo conectar con FlashAir"
@@ -1548,56 +1796,73 @@ msgstr "No puedo conectar con FlashAir"
msgid "Could not connect to OctoPrint"
msgstr "No puedo conectar con OctoPrint"
-#: src/slic3r/Utils/OctoPrint.cpp:181
+#: src/slic3r/Utils/OctoPrint.cpp:191
msgid "Could not connect to Prusa SLA"
msgstr "No se pudo conectar con la Prusa SLA"
-#: src/slic3r/GUI/Tab.cpp:1687
+#: src/slic3r/Utils/Http.cpp:73
+msgid "Could not detect system SSL certificate store. PrusaSlicer will be unable to establish secure network connections."
+msgstr "No se pudo detectar el almacén de certificados SSL del sistema. PrusaSlicer no podrá establecer conexiones de red seguras."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:289
msgid "Could not get a valid Printer Host reference"
msgstr "No pude conseguir una referencia válida de gestor de impresora"
-#: src/slic3r/Utils/Duet.cpp:134
+#: src/slic3r/Utils/Duet.cpp:136
msgid "Could not get resources to create a new connection"
msgstr "No se pudieron obtener recursos para crear una nueva conexión"
-#: src/libslic3r/PrintConfig.cpp:1959
+#: src/libslic3r/PrintConfig.cpp:2101
msgid "Cover the top contact layer of the supports with loops. Disabled by default."
msgstr "Cubrir la capa de contacto superior de los soportes con bucles. Desactivado por defecto."
-#: src/libslic3r/PrintConfig.cpp:89
+#: src/libslic3r/PrintConfig.cpp:91
msgid "Cracks smaller than 2x gap closing radius are being filled during the triangle mesh slicing. The gap closing operation may reduce the final print resolution, therefore it is advisable to keep the value reasonably low."
msgstr "Las ranuras de menos de dos veces el radio de cierre de huecos se rellenan durante el laminado de la malla triangular. La operación de cierre de huecos puede reducir la resolución de la impresión, por lo tanto es aconsejable mantener ese valor razonablemente bajo."
-#: src/libslic3r/Zipper.cpp:58
+#: src/libslic3r/miniz_extension.cpp:117
msgid "CRC-32 check failed"
msgstr "Comprobación con CRC-32 fallida"
-#: src/libslic3r/PrintConfig.cpp:2857
+#: src/libslic3r/PrintConfig.cpp:3021
msgid "Create pad around object and ignore the support elevation"
msgstr "Crear pad alrededor del objeto e ignorar la elevación del soporte"
-#: src/libslic3r/PrintConfig.cpp:2724
+#: src/libslic3r/PrintConfig.cpp:2888
msgid "Critical angle"
msgstr "Ãngulo crítico"
-#: src/libslic3r/PrintConfig.cpp:2668
+#: src/slic3r/GUI/GUI_App.cpp:589
+msgid "Critical error"
+msgstr "Error crítico"
+
+#: src/libslic3r/PrintConfig.cpp:2832
msgid "Cross"
msgstr "Cruzado"
-#: src/libslic3r/PrintConfig.cpp:847
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:203
+msgid "Ctrl + Mouse wheel"
+msgstr "Ctrl + Rueda del ratón"
+
+#: src/libslic3r/PrintConfig.cpp:885
msgid "Cubic"
msgstr "Cúbico"
-#: src/slic3r/GUI/wxExtensions.cpp:704
-#, c-format
+#: src/slic3r/Utils/Http.cpp:91
+msgid "CURL init has failed. PrusaSlicer will be unable to establish network connections. See logs for additional details."
+msgstr "CURL init ha fallado. PrusaSlicer no podrá establecer conexiones de red. Consulta los registros para obtener detalles adicionales."
+
+#: src/slic3r/GUI/wxExtensions.cpp:624
+#, possible-c-format
msgid "Current mode is %s"
msgstr "El modo actual es %s"
-#: src/slic3r/GUI/Tab.cpp:959
+#: src/slic3r/GUI/Tab.cpp:1278
msgid "Current preset is inherited from"
msgstr "El preajuste fue heredado de"
-#: src/slic3r/GUI/Tab.cpp:957
+#: src/slic3r/GUI/Tab.cpp:1276
msgid "Current preset is inherited from the default preset."
msgstr "El preajuste fue heredado del preajuste predeterminado."
@@ -1605,486 +1870,521 @@ msgstr "El preajuste fue heredado del preajuste predeterminado."
msgid "Current version:"
msgstr "Versión actual:"
-#: src/slic3r/GUI/BedShapeDialog.cpp:98 src/slic3r/GUI/GUI_Preview.cpp:249
-#: src/libslic3r/ExtrusionEntity.cpp:322
+#: src/slic3r/GUI/BedShapeDialog.cpp:143 src/slic3r/GUI/GUI_Preview.cpp:314
+#: src/libslic3r/ExtrusionEntity.cpp:327 src/libslic3r/ExtrusionEntity.cpp:362
msgid "Custom"
msgstr "Personalizado"
-#: src/libslic3r/PrintConfig.cpp:112
+#: src/libslic3r/PrintConfig.cpp:114
msgid "Custom CA certificate file can be specified for HTTPS OctoPrint connections, in crt/pem format. If left blank, the default OS CA certificate repository is used."
-msgstr "Un archivo de certificado CA personalizado puede ser especificado para conexiones HTTPS OctoPrint, en formato crt/pem. Si se deja en blanco, el repositorio de certificados OS CA será usado."
+msgstr "Un archivo de certificado CA personalizado puede ser especificado para conexiones HTTPS OctoPrint, en formato crt/pem. Si se deja en blanco, el repositorio de certificados OS CA será usado."
-#: src/slic3r/GUI/Tab.cpp:1527 src/slic3r/GUI/Tab.cpp:1975
+#: src/slic3r/GUI/Tab.cpp:1872 src/slic3r/GUI/Tab.cpp:2160
+#: src/libslic3r/PrintConfig.cpp:1978
msgid "Custom G-code"
msgstr "Código G personalizado"
-#: src/slic3r/GUI/DoubleSlider.cpp:1619
+#: src/slic3r/GUI/DoubleSlider.cpp:1815
msgid "Custom G-code on current layer (%1% mm)."
msgstr "Código G personalizado en la capa actual (%1% mm)."
-#: src/slic3r/GUI/ConfigWizard.cpp:732
+#: src/slic3r/GUI/GCodeViewer.cpp:2580 src/slic3r/GUI/GUI_Preview.cpp:1477
+msgid "Custom G-codes"
+msgstr "Códigos G personalizados"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1091
msgid "Custom Printer"
-msgstr "Impresora customizada"
+msgstr "Impresora personalizada"
-#: src/slic3r/GUI/ConfigWizard.cpp:732
+#: src/slic3r/GUI/ConfigWizard.cpp:1091
msgid "Custom Printer Setup"
msgstr "Configuración personalizada de impresora"
-#: src/slic3r/GUI/ConfigWizard.cpp:736
+#: src/slic3r/GUI/ConfigWizard.cpp:1095
msgid "Custom profile name:"
-msgstr "Nombre impresora customizada:"
+msgstr "Nombre impresora personalizada:"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:42
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3402
+#: src/slic3r/GUI/Plater.cpp:3397
+msgid "Custom supports and seams were removed after repairing the mesh."
+msgstr "Los soportes y las costuras personalizadas se quitaron después de reparar la malla."
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1135
+msgid "Custom template (\"%1%\")"
+msgstr "Plantilla personalizada (\"%1%\")"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:146 src/libslic3r/PrintConfig.cpp:3601
msgid "Cut"
msgstr "Cortar"
-#: src/slic3r/GUI/Plater.cpp:4786
+#: src/slic3r/GUI/Plater.cpp:4921
msgid "Cut by Plane"
msgstr "Cortar por el Plano"
-#: src/libslic3r/PrintConfig.cpp:3403
+#: src/libslic3r/PrintConfig.cpp:3602
msgid "Cut model at the given Z."
msgstr "Cortar modelo a una Z dada."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1432
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
msgid "Cylinder"
msgstr "Cilindro"
-#: src/slic3r/GUI/MainFrame.cpp:568
+#: src/slic3r/GUI/MainFrame.cpp:1174
msgid "D&eselect all"
msgstr "D&eseleccionar todo"
-#: src/libslic3r/PrintConfig.cpp:3504
+#: src/libslic3r/PrintConfig.cpp:3709
msgid "Data directory"
msgstr "Directorio de datos"
-#: src/slic3r/GUI/Mouse3DController.cpp:313
+#: src/slic3r/GUI/Mouse3DController.cpp:300
msgid "Deadzone:"
msgstr "Zona muerta:"
-#: src/libslic3r/Zipper.cpp:52
+#: src/libslic3r/miniz_extension.cpp:111
msgid "decompression failed or archive is corrupted"
msgstr "descompresión fallida o archivo está dañado"
-#: src/slic3r/GUI/Plater.cpp:4720
+#: src/slic3r/GUI/Plater.cpp:4824
msgid "Decrease Instances"
msgstr "Reducir Instancias"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1704 src/libslic3r/PrintConfig.cpp:335
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1832 src/libslic3r/PrintConfig.cpp:369
msgid "Default"
msgstr "Por defecto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:457 src/slic3r/GUI/GUI_ObjectList.cpp:469
-#: src/slic3r/GUI/GUI_ObjectList.cpp:917 src/slic3r/GUI/GUI_ObjectList.cpp:3967
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3977
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4012
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:200
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:257
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:282
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:490
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:1753
+#: src/slic3r/GUI/ExtraRenderers.cpp:297 src/slic3r/GUI/GUI_ObjectList.cpp:496
+#: src/slic3r/GUI/GUI_ObjectList.cpp:508 src/slic3r/GUI/GUI_ObjectList.cpp:1015
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4454
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4464
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4499
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:202
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:259
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:284
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:492
msgid "default"
msgstr "por defecto"
-#: src/libslic3r/PrintConfig.cpp:777
+#: src/libslic3r/PrintConfig.cpp:813
msgid "Default base angle for infill orientation. Cross-hatching will be applied to this. Bridges will be infilled using the best direction Slic3r can detect, so this setting does not affect them."
msgstr "Ãngulo base predeterminado para orientación de relleno. Se aplicará sombreado cruzado a esto. Los puentes se rellenarán utilizando la mejor dirección que Slic3r pueda detectar, por lo que esta configuración no los afecta."
-#: src/libslic3r/PrintConfig.cpp:554
+#: src/slic3r/GUI/GCodeViewer.cpp:2289
+msgid "Default color"
+msgstr "Color predeterminado"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2313
+msgid "default color"
+msgstr "color predeterminado"
+
+#: src/libslic3r/PrintConfig.cpp:590
msgid "Default extrusion width"
msgstr "Ancho de extrusión por defecto"
-#: src/slic3r/GUI/Tab.cpp:987
+#: src/slic3r/GUI/Tab.cpp:1305
msgid "default filament profile"
msgstr "perfil de filamento por defecto"
-#: src/libslic3r/PrintConfig.cpp:345
+#: src/libslic3r/PrintConfig.cpp:379
msgid "Default filament profile"
msgstr "Perfil de filamento por defecto"
-#: src/libslic3r/PrintConfig.cpp:346
+#: src/libslic3r/PrintConfig.cpp:380
msgid "Default filament profile associated with the current printer profile. On selection of the current printer profile, this filament profile will be activated."
msgstr "Perfil de filamento por defecto asociado con el perfil de impresora actual. Al seleccionar el perfil de impresora actual se activará este perfil de filamento."
-#: src/slic3r/GUI/Tab.cpp:2919
-#, c-format
-msgid "Default preset (%s)"
-msgstr "Ajustes por defecto (%s)"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:904 src/slic3r/GUI/GLCanvas3D.cpp:933
-msgid "Default print color"
-msgstr "Color de impresión predeterminado"
-
-#: src/slic3r/GUI/Tab.cpp:984
+#: src/slic3r/GUI/Tab.cpp:1302
msgid "default print profile"
msgstr "perfil de impresión por defecto"
-#: src/libslic3r/PrintConfig.cpp:352
+#: src/libslic3r/PrintConfig.cpp:386
msgid "Default print profile"
msgstr "Perfil de impresión por defecto"
-#: src/libslic3r/PrintConfig.cpp:353 src/libslic3r/PrintConfig.cpp:2592
-#: src/libslic3r/PrintConfig.cpp:2603
+#: src/libslic3r/PrintConfig.cpp:387 src/libslic3r/PrintConfig.cpp:2735
+#: src/libslic3r/PrintConfig.cpp:2746
msgid "Default print profile associated with the current printer profile. On selection of the current printer profile, this print profile will be activated."
msgstr "Perfil de impresión por defecto asociado con el perfil de impresora actual. Al seleccionar el perfil de impresora actual se activará este perfil de impresión."
-#: src/slic3r/GUI/Tab.cpp:1001
+#: src/slic3r/GUI/Tab.cpp:1319
msgid "default SLA material profile"
msgstr "perfil de material de SLA por defecto"
-#: src/libslic3r/PrintConfig.cpp:2591 src/libslic3r/PrintConfig.cpp:2602
+#: src/libslic3r/PrintConfig.cpp:2734 src/libslic3r/PrintConfig.cpp:2745
msgid "Default SLA material profile"
msgstr "Perfil de material de SLA predeterminado"
-#: src/slic3r/GUI/Tab.cpp:1005
+#: src/slic3r/GUI/Tab.cpp:1323
msgid "default SLA print profile"
msgstr "perfil de impresión de SLA por defecto"
-#: src/slic3r/GUI/Field.cpp:136
+#: src/slic3r/GUI/Field.cpp:184
msgid "default value"
msgstr "valor por defecto"
-#: src/slic3r/GUI/ConfigWizard.cpp:734
+#: src/slic3r/GUI/ConfigWizard.cpp:1093
msgid "Define a custom printer profile"
msgstr "Definir un perfil de impresora personalizado"
-#: src/libslic3r/PrintConfig.cpp:2798
+#: src/libslic3r/PrintConfig.cpp:2962
msgid "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful when enabling this feature, as some resins may produce an extreme suction effect inside the cavity, which makes peeling the print off the vat foil difficult."
-msgstr "Define la profundidad de la cavidad del pad. Establecerer a cero para deshabilitar la cavidad. Ten cuidado al habilitar esta función, ya que algunas resinas pueden producir un efecto de succión extremo dentro de la cavidad, lo que dificulta el despegado de la impresión de la lámina de la cuba."
+msgstr "Define la profundidad de la cavidad del pad. Establecer a cero para deshabilitar la cavidad. Ten cuidado al habilitar esta función, ya que algunas resinas pueden producir un efecto de succión extremo dentro de la cavidad, lo que dificulta el despegado de la impresión de la lámina de la cuba."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:346
+#: src/slic3r/GUI/GUI_ObjectList.cpp:393
msgid "degenerate facets"
msgstr "facetas degeneradas"
-#: src/libslic3r/PrintConfig.cpp:640
+#: src/libslic3r/PrintConfig.cpp:676
msgid "Delay after unloading"
msgstr "Retardo tras la descarga"
-#: src/slic3r/GUI/Tab.cpp:3121
+#: src/slic3r/GUI/Tab.cpp:3386
msgid "delete"
msgstr "borra"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4475 src/slic3r/GUI/GUI_ObjectList.cpp:1718
-#: src/slic3r/GUI/Plater.cpp:3931 src/slic3r/GUI/Plater.cpp:3953
-#: src/slic3r/GUI/Tab.cpp:3124
+#: src/slic3r/GUI/GLCanvas3D.cpp:4841 src/slic3r/GUI/GUI_ObjectList.cpp:1846
+#: src/slic3r/GUI/Plater.cpp:3849 src/slic3r/GUI/Plater.cpp:3871
+#: src/slic3r/GUI/Tab.cpp:3423
msgid "Delete"
msgstr "Borra"
-#: src/slic3r/GUI/MainFrame.cpp:575
+#: src/slic3r/GUI/MainFrame.cpp:1181
msgid "Delete &all"
msgstr "Borr&ar todo"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4484 src/slic3r/GUI/KBShortcutsDialog.cpp:129
-#: src/slic3r/GUI/Plater.cpp:4669
+#: src/slic3r/GUI/GLCanvas3D.cpp:4850 src/slic3r/GUI/KBShortcutsDialog.cpp:124
+#: src/slic3r/GUI/Plater.cpp:4774
msgid "Delete all"
msgstr "Eliminar todo"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2176
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2341
msgid "Delete All Instances from Object"
msgstr "Eliminar todas las instancias del Objeto"
-#: src/slic3r/GUI/DoubleSlider.cpp:1516
+#: src/slic3r/GUI/DoubleSlider.cpp:1708
msgid "Delete color change"
msgstr "Eliminar cambio de color"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:220
msgid "Delete color change marker for current layer"
msgstr "Eliminar marcador de cambio de color para la capa actual"
-#: src/slic3r/GUI/DoubleSlider.cpp:1519
+#: src/slic3r/GUI/DoubleSlider.cpp:1711
msgid "Delete custom G-code"
msgstr "Eliminar código G personalizado"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:539
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:424
msgid "Delete drainage hole"
msgstr "Eliminar orificio de drenaje"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2192
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2357
msgid "Delete Height Range"
msgstr "Eliminar Rango de Alturas"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2246
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2412
msgid "Delete Instance"
msgstr "Eliminar Instancia"
-#: src/slic3r/GUI/Plater.cpp:2712
+#: src/slic3r/GUI/Plater.cpp:2673
msgid "Delete Object"
msgstr "Eliminar Objeto"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:101
-#, c-format
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:104
+#, possible-c-format
msgid "Delete Option %s"
msgstr "Eliminar Opción %s"
-#: src/slic3r/GUI/DoubleSlider.cpp:1518
+#: src/slic3r/GUI/DoubleSlider.cpp:1710
msgid "Delete pause print"
msgstr "Eliminar pausa de impresión"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:128
+#: src/slic3r/GUI/PresetComboBoxes.cpp:652
+msgid "Delete physical printer"
+msgstr "Eliminar impresora física"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:659
+msgid "Delete Physical Printer"
+msgstr "Eliminar Impresora Física"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:123
msgid "Delete selected"
msgstr "Eliminar selección"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2830
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3221
msgid "Delete Selected"
msgstr "Eliminar Selección"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2693
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3083
msgid "Delete Selected Item"
msgstr "Eliminar Objeto Seleccionado"
-#: src/slic3r/GUI/Plater.cpp:4677
+#: src/slic3r/GUI/Plater.cpp:4782
msgid "Delete Selected Objects"
msgstr "Eliminar Objetos Seleccionados"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2152
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2319
msgid "Delete Settings"
msgstr "Eliminar Ajustes"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2227
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2393
msgid "Delete Subobject"
msgstr "Eliminar Subobjeto"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:631
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:514
msgid "Delete support point"
msgstr "Borra punto de apoyo"
-#: src/slic3r/GUI/Tab.cpp:134
+#: src/slic3r/GUI/Tab.cpp:204
msgid "Delete this preset"
msgstr "Borra este ajuste"
-#: src/slic3r/GUI/DoubleSlider.cpp:1035
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:55
+msgid "Delete this preset from this printer device"
+msgstr "Eliminar este ajuste preestablecido para este dispositivo de impresión"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1160
msgid "Delete tick mark - Left click or press \"-\" key"
-msgstr "Eliminar marca de verificación - Click izquierdo o presionar tecla \"-\""
+msgstr "Eliminar marca de verificación - Clic izquierdo o presionar tecla \"-\""
-#: src/slic3r/GUI/DoubleSlider.cpp:1517
+#: src/slic3r/GUI/DoubleSlider.cpp:1709
msgid "Delete tool change"
msgstr "Eliminar cambio de herramienta"
-#: src/slic3r/GUI/MainFrame.cpp:576
+#: src/slic3r/GUI/MainFrame.cpp:1182
msgid "Deletes all objects"
msgstr "Borra todos los objetos"
-#: src/slic3r/GUI/MainFrame.cpp:573
+#: src/slic3r/GUI/MainFrame.cpp:1179
msgid "Deletes the current selection"
msgstr "Borrar la selección actual"
-#: src/libslic3r/PrintConfig.cpp:717 src/libslic3r/PrintConfig.cpp:2503
-#: src/libslic3r/PrintConfig.cpp:2504
+#: src/libslic3r/PrintConfig.cpp:753 src/libslic3r/PrintConfig.cpp:2646
+#: src/libslic3r/PrintConfig.cpp:2647
msgid "Density"
msgstr "Densidad"
-#: src/libslic3r/PrintConfig.cpp:791
+#: src/libslic3r/PrintConfig.cpp:827
msgid "Density of internal infill, expressed in the range 0% - 100%."
msgstr "Densidad de relleno interior, expresado en el rango 0% - 100%."
-#: src/slic3r/GUI/Tab.cpp:1258 src/slic3r/GUI/Tab.cpp:1548
-#: src/slic3r/GUI/Tab.cpp:2019 src/slic3r/GUI/Tab.cpp:2135
-#: src/slic3r/GUI/Tab.cpp:3543 src/slic3r/GUI/Tab.cpp:3671
+#: src/slic3r/GUI/Tab.cpp:1588 src/slic3r/GUI/Tab.cpp:1895
+#: src/slic3r/GUI/Tab.cpp:2228 src/slic3r/GUI/Tab.cpp:2304
+#: src/slic3r/GUI/Tab.cpp:3959 src/slic3r/GUI/Tab.cpp:4090
msgid "Dependencies"
msgstr "Dependencias"
-#: src/libslic3r/PrintConfig.cpp:1612 src/libslic3r/PrintConfig.cpp:1613
+#: src/libslic3r/PrintConfig.cpp:1720 src/libslic3r/PrintConfig.cpp:1721
msgid "Deretraction Speed"
msgstr "Velocidad de deretracción"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:127
+#: src/slic3r/GUI/GCodeViewer.cpp:2529 src/slic3r/GUI/GUI_Preview.cpp:337
+#: src/slic3r/GUI/GUI_Preview.cpp:1473
+msgid "Deretractions"
+msgstr "Deretracciones"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:172
+msgid "Descriptive name for the printer"
+msgstr "Un nombre descriptivo para la impresora"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:122
msgid "Deselect all"
msgstr "Deseleccionar todo"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1369
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216
msgid "Deselect by rectangle"
msgstr "Deseleccionar mediante rectángulo"
-#: src/slic3r/GUI/MainFrame.cpp:569
+#: src/slic3r/GUI/MainFrame.cpp:1175
msgid "Deselects all objects"
msgstr "Deseleccionar todos los objetos"
-#: src/slic3r/GUI/Tab.cpp:963
+#: src/slic3r/GUI/Tab.cpp:1224
msgid "Detach from system preset"
msgstr "Separar del preajuste del sistema"
-#: src/slic3r/GUI/Tab.cpp:984
+#: src/slic3r/GUI/Tab.cpp:1246
msgid "Detach preset"
msgstr "Separar preajuste"
-#: src/slic3r/GUI/Tab.cpp:3029
+#: src/slic3r/GUI/Tab.cpp:3323
msgid "Detached"
msgstr "Separado"
-#: src/libslic3r/PrintConfig.cpp:1373
+#: src/libslic3r/PrintConfig.cpp:1481
msgid "Detect bridging perimeters"
msgstr "Detectar perímetros con puentes"
-#: src/libslic3r/PrintConfig.cpp:2075
+#: src/libslic3r/PrintConfig.cpp:2218
msgid "Detect single-width walls (parts where two extrusions don't fit and we need to collapse them into a single trace)."
msgstr "Detecta muros de ancho único (partes donde dos extrusiones no se ajustan y tenemos que colapsarlas en un solo rastro)."
-#: src/libslic3r/PrintConfig.cpp:2073
+#: src/libslic3r/PrintConfig.cpp:2216
msgid "Detect thin walls"
msgstr "Detecta paredes delgadas"
-#: src/libslic3r/PrintConfig.cpp:3472
+#: src/libslic3r/PrintConfig.cpp:3671
msgid "Detect unconnected parts in the given model(s) and split them into separate objects."
msgstr "Detectadas piezas desconectadas en el(los) modelo(s) dado(s) y divídido(s) en objetos separados."
-#: src/slic3r/GUI/Plater.cpp:2368
+#: src/slic3r/GUI/Plater.cpp:2330
msgid "Detected advanced data"
msgstr "Datos avanzados detectados"
-#: src/slic3r/GUI/Mouse3DController.cpp:289
+#: src/slic3r/GUI/Mouse3DController.cpp:274
msgid "Device:"
msgstr "Dispositivo:"
-#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/libslic3r/PrintConfig.cpp:709
+#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:745
msgid "Diameter"
msgstr "Diámetro"
-#: src/libslic3r/PrintConfig.cpp:2694
+#: src/libslic3r/PrintConfig.cpp:2858
msgid "Diameter in mm of the pillar base"
msgstr "Diámetro en mm del pilar de la base"
-#: src/libslic3r/PrintConfig.cpp:2650
+#: src/libslic3r/PrintConfig.cpp:2793
msgid "Diameter in mm of the support pillars"
msgstr "Diámetro en mm de los pilares de soporte"
-#: src/libslic3r/PrintConfig.cpp:2622
+#: src/libslic3r/PrintConfig.cpp:2765
msgid "Diameter of the pointing side of the head"
msgstr "Diámetro de la parte en punta de la cabeza"
-#: src/slic3r/GUI/BedShapeDialog.cpp:94
+#: src/slic3r/GUI/BedShapeDialog.cpp:131
msgid "Diameter of the print bed. It is assumed that origin (0,0) is located in the center."
msgstr "Diámetro de la base de impresión. Se supone que el origen (0,0) está ubicado en el centro."
-#: src/libslic3r/PrintConfig.cpp:1639
+#: src/libslic3r/PrintConfig.cpp:1747
msgid "Direction"
msgstr "Dirección"
-#: src/libslic3r/PrintConfig.cpp:359
+#: src/libslic3r/PrintConfig.cpp:393
msgid "Disable fan for the first"
msgstr "Desactivar ventilador para la primera"
-#: src/libslic3r/PrintConfig.cpp:1349
+#: src/libslic3r/PrintConfig.cpp:1457
msgid "Disables retraction when the travel path does not exceed the upper layer's perimeters (and thus any ooze will be probably invisible)."
msgstr "Desactiva la retracción cuando la trayectoria de desplazamiento no supera los perímetros de la capa superior (y, por lo tanto, cualquier goteo probablemente será invisible)."
-#: src/slic3r/GUI/DoubleSlider.cpp:952
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:641
+msgid "Discard"
+msgstr "Descartar"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1066
msgid "Discard all custom changes"
msgstr "Descartar todos los cambios personalizados"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1375
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222
msgid "Discard changes"
msgstr "Descartar los cambios"
-#: src/slic3r/GUI/GUI_App.cpp:932 src/slic3r/GUI/Tab.cpp:2946
-msgid "Discard changes and continue anyway?"
-msgstr "¿Descartar los cambios y continuar de todos modos?"
-
-#: src/slic3r/GUI/Tab.cpp:2078
+#: src/slic3r/GUI/Tab.cpp:2248
msgid "Display"
msgstr "Pantalla"
-#: src/libslic3r/PrintConfig.cpp:2359
+#: src/libslic3r/PrintConfig.cpp:2502
msgid "Display height"
msgstr "Altura de la pantalla"
-#: src/libslic3r/PrintConfig.cpp:2378
+#: src/libslic3r/PrintConfig.cpp:2521
msgid "Display horizontal mirroring"
msgstr "Espejo horizontal de la pantalla"
-#: src/libslic3r/PrintConfig.cpp:2392
+#: src/libslic3r/PrintConfig.cpp:2535
msgid "Display orientation"
msgstr "Orientación de la pantalla"
-#: src/slic3r/GUI/MainFrame.cpp:648
+#: src/slic3r/GUI/MainFrame.cpp:1258
msgid "Display the Print Host Upload Queue window"
msgstr "Mostrar la ventana de la cola de carga del host de impresión"
-#: src/libslic3r/PrintConfig.cpp:2385
+#: src/libslic3r/PrintConfig.cpp:2528
msgid "Display vertical mirroring"
msgstr "Espejo vertical de la pantalla"
-#: src/libslic3r/PrintConfig.cpp:2353
+#: src/libslic3r/PrintConfig.cpp:2496
msgid "Display width"
msgstr "Anchura de la pantalla"
-#: src/libslic3r/PrintConfig.cpp:377
+#: src/libslic3r/PrintConfig.cpp:411
msgid "Distance between copies"
msgstr "Distancia entre copias"
-#: src/libslic3r/PrintConfig.cpp:1680
+#: src/libslic3r/PrintConfig.cpp:1157
+msgid "Distance between ironing lines"
+msgstr "Distancia entre las líneas alisadas"
+
+#: src/libslic3r/PrintConfig.cpp:1788
msgid "Distance between skirt and object(s). Set this to zero to attach the skirt to the object(s) and get a brim for better adhesion."
msgstr "Distancia entre falda y objeto(s). Ajuste esto a cero para unir la falda a los objetos y obtener un borde para una mejor adhesión."
-#: src/libslic3r/PrintConfig.cpp:2882
+#: src/libslic3r/PrintConfig.cpp:3046
msgid "Distance between two connector sticks which connect the object and the generated pad."
msgstr "Distancia entre dos palitos de apoyo entre la pieza y la base generada."
-#: src/libslic3r/PrintConfig.cpp:1679
+#: src/libslic3r/PrintConfig.cpp:1787
msgid "Distance from object"
msgstr "Distancia del objeto"
-#: src/slic3r/GUI/BedShapeDialog.cpp:85
+#: src/slic3r/GUI/BedShapeDialog.cpp:121
msgid "Distance of the 0,0 G-code coordinate from the front left corner of the rectangle."
msgstr "Distancia de la coordenada del código G de 0,0 de la esquina frontal izquierda del rectángulo."
-#: src/libslic3r/PrintConfig.cpp:320
+#: src/libslic3r/PrintConfig.cpp:354
msgid "Distance of the center-point of the cooling tube from the extruder tip."
msgstr "Distancia desde el centro del tubo de enfriado a la punta del extrusor."
-#: src/libslic3r/PrintConfig.cpp:1382
+#: src/libslic3r/PrintConfig.cpp:1490
msgid "Distance of the extruder tip from the position where the filament is parked when unloaded. This should match the value in printer firmware."
msgstr "Distancia de la punta del extrusor desde la posición donde el filamento es colocado cuando se descarga. Esto debería coincidir con el valor en el firmware de la impresora."
-#: src/libslic3r/PrintConfig.cpp:378
+#: src/libslic3r/PrintConfig.cpp:412
msgid "Distance used for the auto-arrange feature of the plater."
msgstr "Distancia utilizada para la función de organización automática de la base."
-#: src/libslic3r/PrintConfig.cpp:3486
+#: src/libslic3r/PrintConfig.cpp:3685
msgid "Do not fail if a file supplied to --load does not exist."
msgstr "No fallar si el archivo suministrado para --load no existe."
-#: src/libslic3r/PrintConfig.cpp:3430
+#: src/libslic3r/PrintConfig.cpp:3629
msgid "Do not rearrange the given models before merging and keep their original XY coordinates."
msgstr "No reorganizar los modelos dados antes de fusionar y mantener sus coordenadas XY originales."
-#: src/slic3r/GUI/Field.cpp:240
-#, c-format
-msgid ""
-"Do you mean %s%% instead of %s %s?\n"
-"Select YES if you want to change this value to %s%%, \n"
-"or NO if you are sure that %s %s is a correct value."
-msgstr ""
-"¿Quieres decir %s%% en vez de %s %s?\n"
-"Escoge SI si deseas cambiar este valor a %s%%,\n"
-"o NO si estás seguro que %s %s es el valor correcto."
+#: src/slic3r/GUI/Field.cpp:288
+#, possible-c-format
+msgid "Do you mean %s%% instead of %s %s?\nSelect YES if you want to change this value to %s%%, \nor NO if you are sure that %s %s is a correct value."
+msgstr "¿Quieres decir %s%% en vez de %s %s?\nEscoge SI si deseas cambiar este valor a %s%%,\no NO si estás seguro que %s %s es el valor correcto."
-#: src/slic3r/GUI/DoubleSlider.cpp:1920
+#: src/slic3r/GUI/DoubleSlider.cpp:2138
msgid "Do you want to delete all saved tool changes?"
msgstr "¿Desea eliminar todos los cambios de herramienta guardados?"
-#: src/slic3r/GUI/GUI_App.cpp:884
+#: src/slic3r/GUI/GUI_App.cpp:1610
msgid "Do you want to proceed?"
msgstr "¿Deseas continuar?"
-#: src/slic3r/GUI/Plater.cpp:3321
+#: src/slic3r/GUI/Plater.cpp:3124
msgid "Do you want to retry"
msgstr "Quieres volver a intentarlo"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1045
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:911
msgid "Do you want to save your manually edited support points?"
msgstr "¿Deseas guardar tus puntos de soporte editados manualmente?"
-#: src/slic3r/GUI/ConfigWizard.cpp:1834
+#: src/slic3r/GUI/ConfigWizard.cpp:2261
msgid "Do you want to select default filaments for these FFF printer models?"
msgstr "¿Desea seleccionar filamentos predeterminados para estos modelos de impresoras FFF?"
-#: src/slic3r/GUI/ConfigWizard.cpp:1852
+#: src/slic3r/GUI/ConfigWizard.cpp:2279
msgid "Do you want to select default SLA materials for these printer models?"
msgstr "¿Desea seleccionar materiales SLA predeterminados para estos modelos de impresora?"
-#: src/libslic3r/PrintConfig.cpp:3429
+#: src/slic3r/GUI/Plater.cpp:4751
+msgid "does not contain valid gcode."
+msgstr "no contiene gcode válido."
+
+#: src/libslic3r/PrintConfig.cpp:3628
msgid "Don't arrange"
msgstr "No organizar"
@@ -2092,7 +2392,11 @@ msgstr "No organizar"
msgid "Don't notify about new releases any more"
msgstr "No quiero recibir avisos de nuevas versiones"
-#: src/libslic3r/PrintConfig.cpp:369
+#: src/slic3r/GUI/Plater.cpp:1431
+msgid "Don't show again"
+msgstr "No mostrar de nuevo"
+
+#: src/libslic3r/PrintConfig.cpp:403
msgid "Don't support bridges"
msgstr "No soportar puentes"
@@ -2100,262 +2404,348 @@ msgstr "No soportar puentes"
msgid "Downgrade"
msgstr "Volver a una versión anterior"
-#: src/libslic3r/PrintConfig.cpp:1695
+#: src/libslic3r/PrintConfig.cpp:1803
msgid "Draft shield"
msgstr "Escudo de protección"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1368
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1369
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216
msgid "Drag"
msgstr "Arrastra"
-#: src/libslic3r/SLAPrintSteps.cpp:44
+#: src/slic3r/GUI/Plater.cpp:1406
+msgid "Drag and drop G-code file"
+msgstr "Arrastra y suelta el archivo código G"
+
+#: src/libslic3r/SLAPrintSteps.cpp:45
msgid "Drilling holes into model."
msgstr "Taladrando agujeros en el modelo."
-#: src/libslic3r/SLAPrintSteps.cpp:199
+#: src/libslic3r/SLAPrintSteps.cpp:201
msgid "Drilling holes into the mesh failed. This is usually caused by broken model. Try to fix it first."
msgstr "Perforación de agujeros en la malla fallida. Esto generalmente es causado por un modelo roto. Intenta arreglarlo primero."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:337
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:349
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:345
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:357
msgid "Drop to bed"
msgstr "Colocar en la Cama"
-#: src/libslic3r/PrintConfig.cpp:3433
+#: src/libslic3r/PrintConfig.cpp:3632
msgid "Duplicate"
msgstr "Duplicar"
-#: src/libslic3r/PrintConfig.cpp:3438
+#: src/libslic3r/PrintConfig.cpp:3637
msgid "Duplicate by grid"
msgstr "Duplicar por cuadrícula"
-#: src/slic3r/GUI/PresetHints.cpp:40
-msgid "During the other layers, fan"
-msgstr "Durante las otras capas, el ventilador"
+#: src/slic3r/GUI/GCodeViewer.cpp:2445
+msgid "Duration"
+msgstr "Duración"
-#: src/libslic3r/PrintConfig.cpp:2669
+#: src/slic3r/GUI/PresetHints.cpp:51
+msgid "During the other layers, fan will always run at %1%%%"
+msgstr "Durante el resto de capas, el ventilador siempre funcionará al %1%%%"
+
+#: src/slic3r/GUI/PresetHints.cpp:58
+msgid "During the other layers, fan will be turned off."
+msgstr "Durante las otras capas, el ventilador se apagará."
+
+#: src/libslic3r/PrintConfig.cpp:2833
msgid "Dynamic"
msgstr "Dinámico"
-#: src/slic3r/GUI/MainFrame.cpp:749
+#: src/slic3r/GUI/MainFrame.cpp:1448
msgid "E&xport"
msgstr "E&xportar"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:347
+#: src/slic3r/GUI/GUI_ObjectList.cpp:394
msgid "edges fixed"
msgstr "esquimas reparadas"
-#: src/slic3r/GUI/DoubleSlider.cpp:1508
+#: src/slic3r/GUI/DoubleSlider.cpp:1700
msgid "Edit color"
msgstr "Editar color"
-#: src/slic3r/GUI/DoubleSlider.cpp:960
+#: src/slic3r/GUI/DoubleSlider.cpp:1083
msgid "Edit current color - Right click the colored slider segment"
msgstr "Editar color actual - Clic derecho en el segmento de color deslizante"
-#: src/slic3r/GUI/DoubleSlider.cpp:1510
+#: src/slic3r/GUI/DoubleSlider.cpp:1702
msgid "Edit custom G-code"
msgstr "Editar código G personalizado"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3003
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3459
msgid "Edit Height Range"
msgstr "Editar Rango de Alturas"
-#: src/slic3r/GUI/DoubleSlider.cpp:1509
+#: src/slic3r/GUI/DoubleSlider.cpp:1701
msgid "Edit pause print message"
msgstr "Editar mensaje de pausa de impresión"
-#: src/slic3r/GUI/DoubleSlider.cpp:1037
+#: src/slic3r/GUI/PresetComboBoxes.cpp:645
+msgid "Edit physical printer"
+msgstr "Editar impresora física"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:641
+msgid "Edit preset"
+msgstr "Editar ajuste preestablecido"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1162
msgid "Edit tick mark - Ctrl + Left click"
-msgstr "Editar la marca - Ctrl+ Click izquierdo"
+msgstr "Editar la marca - Ctrl+ Clic izquierdo"
-#: src/slic3r/GUI/DoubleSlider.cpp:1038
+#: src/slic3r/GUI/DoubleSlider.cpp:1163
msgid "Edit tick mark - Right click"
msgstr "Editar marca de verificación - Clic derecho"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:282 src/slic3r/GUI/GUI_ObjectList.cpp:394
+#: src/slic3r/GUI/GUI_ObjectList.cpp:300 src/slic3r/GUI/GUI_ObjectList.cpp:441
msgid "Editing"
msgstr "Edición"
-#: src/slic3r/GUI/MainFrame.cpp:547
+#: src/slic3r/GUI/MainFrame.cpp:1105
msgid "Ejec&t SD card / Flash drive"
msgstr "Expul&sa tarjeta SD / disco USB"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:126
+#: src/slic3r/GUI/NotificationManager.cpp:780
+msgid "Eject drive"
+msgstr "Expulsar la unidad"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:119
msgid "Eject SD card / Flash drive"
msgstr "Expulsa la tarjeta SD / disco USB"
-#: src/slic3r/GUI/MainFrame.cpp:547
+#: src/slic3r/GUI/MainFrame.cpp:1105
msgid "Eject SD card / Flash drive after the G-code was exported to it."
msgstr "Expulsa la tarjeta SD / disco USB después de que se haya exportado a él."
-#: src/slic3r/GUI/Plater.cpp:2202
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:2034
+#, possible-c-format
msgid "Ejecting of device %s(%s) has failed."
msgstr "La expulsión del dispositivo %s(%s) ha fallado."
-#: src/libslic3r/PrintConfig.cpp:118
+#: src/libslic3r/PrintConfig.cpp:120
msgid "Elephant foot compensation"
msgstr "Compensación del pie de elefante"
-#: src/libslic3r/PrintConfig.cpp:2447
+#: src/libslic3r/PrintConfig.cpp:2590
msgid "Elephant foot minimum width"
msgstr "Ancho mínimo del pie de elefante"
-#: src/libslic3r/SLAPrint.cpp:625
+#: src/libslic3r/SLAPrint.cpp:639
msgid "Elevation is too low for object. Use the \"Pad around object\" feature to print the object without elevation."
msgstr "Elevación demasiado baja para el objeto. Utiliza la característica \"Pad alrededor del objeto\" para imprimir el objeto sin elevación."
-#: src/libslic3r/PrintConfig.cpp:1093
+#: src/libslic3r/PrintConfig.cpp:1186
msgid "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute intervals into the G-code to let the firmware show accurate remaining time. As of now only the Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 firmware supports M73 Qxx Sxx for the silent mode."
msgstr "Emitir M73 P[porcentaje impreso] R[tiempo restante en minutos] en intervalos de 1 minuto en el código G para permitir que el firmware muestre el tiempo restante preciso. A partir de ahora solo el firmware Prusa i3 MK3 reconoce M73. También el firmware i3 MK3 es compatible con M73 Qxx Sxx para el modo silencioso."
-#: src/libslic3r/GCode.cpp:637
+#: src/libslic3r/PrintConfig.cpp:1217
+msgid "Emit to G-code"
+msgstr "Emitir a código G"
+
+#: src/libslic3r/GCode.cpp:622
msgid "Empty layers detected, the output would not be printable."
msgstr "Capas vacías detectadas, la salida no sería imprimible."
-#: src/slic3r/GUI/Tab.cpp:1445 src/libslic3r/PrintConfig.cpp:1355
-#: src/libslic3r/PrintConfig.cpp:2200
+#: src/slic3r/GUI/Tab.cpp:1791 src/libslic3r/PrintConfig.cpp:1463
+#: src/libslic3r/PrintConfig.cpp:2343
msgid "Enable"
msgstr "Habilitar"
-#: src/libslic3r/PrintConfig.cpp:313
+#: src/libslic3r/PrintConfig.cpp:347
msgid "Enable auto cooling"
msgstr "Habilitar el enfriamiento automático"
-#: src/libslic3r/PrintConfig.cpp:572
+#: src/libslic3r/PrintConfig.cpp:608
msgid "Enable fan if layer print time is below"
msgstr "Habilitar ventilador si el tiempo de impresión de la capa está por debajo"
-#: src/libslic3r/PrintConfig.cpp:2908
+#: src/libslic3r/PrintConfig.cpp:3072
msgid "Enable hollowing"
msgstr "Habilitar vaciado"
-#: src/libslic3r/PrintConfig.cpp:2380
+#: src/libslic3r/PrintConfig.cpp:2523
msgid "Enable horizontal mirroring of output images"
msgstr "Activar espejo horizontal de salida de imágenes"
-#: src/libslic3r/PrintConfig.cpp:1867
+#: src/libslic3r/PrintConfig.cpp:1124
+msgid "Enable ironing"
+msgstr "Activar alisado"
+
+#: src/libslic3r/PrintConfig.cpp:1125
+msgid "Enable ironing of the top layers with the hot print head for smooth surface"
+msgstr "Habilitar el alisado de las capas superiores con el cabezal de impresión caliente para obtener una superficie lisa"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3901
+msgid "Enable rotations (slow)"
+msgstr "Permitir rotaciones (lento)"
+
+#: src/slic3r/GUI/Preferences.cpp:207
+msgid "Enable support for legacy 3DConnexion devices"
+msgstr "Habilitar la compatibilidad con dispositivos 3DConnexion antiguos"
+
+#: src/libslic3r/PrintConfig.cpp:2009
msgid "Enable support material generation."
msgstr "Habilite la generación de material de soporte."
-#: src/libslic3r/PrintConfig.cpp:966
+#: src/libslic3r/PrintConfig.cpp:1010
msgid "Enable this to add comments into the G-Code labeling print moves with what object they belong to, which is useful for the Octoprint CancelObject plugin. This settings is NOT compatible with Single Extruder Multi Material setup and Wipe into Object / Wipe into Infill."
msgstr "Habilita esto para añadir los comentarios al código G, etiquetando movimientos de impresión con el objeto al que pertenecen, lo que es útil para el plugin Octoprint CancelObject. Esta configuración NO es compatible con la configuración de Single Extruder Multi Material y Limpiar en Objeto / Limpiar en Relleno."
-#: src/libslic3r/PrintConfig.cpp:929
+#: src/libslic3r/PrintConfig.cpp:973
msgid "Enable this to get a commented G-code file, with each line explained by a descriptive text. If you print from SD card, the additional weight of the file could make your firmware slow down."
msgstr "Habilítelo para obtener un archivo de código G comentado, con cada línea explicada por un texto descriptivo. Si imprime desde una tarjeta SD, el peso adicional del archivo podría ralentizar su firmware."
-#: src/libslic3r/PrintConfig.cpp:2186
+#: src/libslic3r/PrintConfig.cpp:2329
msgid "Enable variable layer height feature"
msgstr "Habilitar la función de altura de capa variable"
-#: src/libslic3r/PrintConfig.cpp:2387
+#: src/libslic3r/PrintConfig.cpp:2530
msgid "Enable vertical mirroring of output images"
msgstr "Activar espejo vertical de salida de imágenes"
-#: src/slic3r/GUI/Tab.cpp:1534 src/slic3r/GUI/Tab.cpp:1982
-#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:395
+#: src/slic3r/GUI/Tab.cpp:1880 src/slic3r/GUI/Tab.cpp:2168
+#: src/libslic3r/PrintConfig.cpp:419 src/libslic3r/PrintConfig.cpp:429
msgid "End G-code"
msgstr "Código G final"
-#: src/libslic3r/PrintConfig.cpp:1924
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:239
+msgid "Enforce"
+msgstr "Imponer"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:30
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:381
+msgid "Enforce seam"
+msgstr "Imponer costura"
+
+#: src/libslic3r/PrintConfig.cpp:2066
msgid "Enforce support for the first"
msgstr "Forzar soportes para la primera"
-#: src/libslic3r/PrintConfig.cpp:1931
+#: src/libslic3r/PrintConfig.cpp:2073
msgid "Enforce support for the first n layers"
msgstr "Aplicar soportes para las primeras n capas"
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47
+msgid "Enforce supports"
+msgstr "Imponer soportes"
+
#: src/slic3r/GUI/PrintHostDialogs.cpp:198
#: src/slic3r/GUI/PrintHostDialogs.cpp:229
msgid "Enqueued"
msgstr "En cola"
-#: src/libslic3r/PrintConfig.cpp:407
+#: src/libslic3r/PrintConfig.cpp:441
msgid "Ensure vertical shell thickness"
msgstr "Asegurar el espesor de la carcasa vertical"
-#: src/slic3r/GUI/DoubleSlider.cpp:1618
+#: src/slic3r/GUI/GLCanvas3D.cpp:4402 src/slic3r/GUI/GLCanvas3D.cpp:4410
+#: src/slic3r/GUI/Search.cpp:433
+msgid "Enter a search term"
+msgstr "Teclea un término de búsqueda"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1814
msgid "Enter custom G-code used on current layer"
msgstr "Ingresa el código G personalizado utilizado en la capa actual"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3803
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4266
msgid "Enter new name"
msgstr "Introduce un nuevo nombre"
-#: src/slic3r/GUI/DoubleSlider.cpp:1634
+#: src/slic3r/GUI/DoubleSlider.cpp:1830
msgid "Enter short message shown on Printer display when a print is paused"
msgstr "Introduce un mensaje corto a mostrar en la pantalla de la impresora cuando la impresión se ponga en pausa"
-#: src/slic3r/GUI/ConfigWizard.cpp:1047
+#: src/slic3r/GUI/ConfigWizard.cpp:1413
msgid "Enter the bed temperature needed for getting your filament to stick to your heated bed."
msgstr "Introduce la temperatura de la base necesaria para que adhiera el filamento a la base calefactable."
-#: src/slic3r/GUI/ConfigWizard.cpp:979
+#: src/slic3r/GUI/ConfigWizard.cpp:1345
msgid "Enter the diameter of your filament."
msgstr "Introduce el diámetro de tu filamento."
-#: src/slic3r/GUI/ConfigWizard.cpp:966
+#: src/slic3r/GUI/ConfigWizard.cpp:1332
msgid "Enter the diameter of your printer's hot end nozzle."
msgstr "Introduce el diámetro de la boquilla del fusor de tu impresora."
-#: src/slic3r/GUI/DoubleSlider.cpp:1650
+#: src/slic3r/GUI/DoubleSlider.cpp:1851 src/slic3r/GUI/DoubleSlider.cpp:1855
msgid "Enter the height you want to jump to"
msgstr "Introduce la altura a la que deseas saltar"
-#: src/slic3r/GUI/Plater.cpp:4751
+#: src/slic3r/GUI/DoubleSlider.cpp:1851
+msgid "Enter the move you want to jump to"
+msgstr "Introduce el movimiento al que desea saltar"
+
+#: src/slic3r/GUI/Plater.cpp:4855
msgid "Enter the number of copies:"
msgstr "Introduce el número de copias:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1033
+#: src/slic3r/GUI/ConfigWizard.cpp:1399
msgid "Enter the temperature needed for extruding your filament."
msgstr "Introduce la temperatura necesaria para extruir tu filamento."
-#: src/libslic3r/PrintConfig.cpp:761
+#: src/libslic3r/PrintConfig.cpp:813
+msgid "Enter weight of the empty filament spool. One may weigh a partially consumed filament spool before printing and one may compare the measured weight with the calculated weight of the filament with the spool to find out whether the amount of filament on the spool is sufficient to finish the print."
+msgstr "Introduce el peso de la bobina de filamento vacía. Se puede pesar una bobina de filamento parcialmente vacía antes de imprimir y se puede comparar el peso medido con el peso calculado del filamento con la bobina para averiguar si la cantidad de filamento en la bobina es suficiente para terminar la impresión."
+
+#: src/libslic3r/PrintConfig.cpp:797
msgid "Enter your filament cost per kg here. This is only for statistical information."
msgstr "Ingrese su coste del filamento por kg aquí. Esto es solo para información estadística."
-#: src/libslic3r/PrintConfig.cpp:718
+#: src/libslic3r/PrintConfig.cpp:754
msgid "Enter your filament density here. This is only for statistical information. A decent way is to weigh a known length of filament and compute the ratio of the length to volume. Better is to calculate the volume directly through displacement."
msgstr "Ingrese su densidad de filamento aquí. Esto es solo para información estadística. Una forma decente es pesar una longitud conocida de filamento y calcular la relación entre la longitud y el volumen. Lo mejor es calcular el volumen directamente a través del desplazamiento."
-#: src/libslic3r/PrintConfig.cpp:710
+#: src/libslic3r/PrintConfig.cpp:746
msgid "Enter your filament diameter here. Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average."
msgstr "Ingrese el diámetro de su fila aquí. Se requiere una buena precisión, por lo tanto, use un calibre y realice múltiples mediciones a lo largo del filamento, luego calcule el promedio."
-#: src/slic3r/GUI/MainFrame.cpp:422 src/slic3r/GUI/MainFrame.cpp:785
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:39
+msgid "Entering Paint-on supports"
+msgstr "Entrando al Pintado de soportes"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:40
+msgid "Entering Seam painting"
+msgstr "Entrando al Pintado de costuras"
+
+#: src/slic3r/GUI/MainFrame.cpp:1003 src/slic3r/GUI/MainFrame.cpp:1486
#: src/slic3r/GUI/PrintHostDialogs.cpp:231
msgid "Error"
msgstr "Error"
#: src/slic3r/GUI/FirmwareDialog.cpp:645
-#, c-format
+#, possible-c-format
msgid "Error accessing port at %s: %s"
msgstr "Error al acceder al puerto en %s: %s"
-#: src/slic3r/GUI/Plater.cpp:3433
+#: src/slic3r/GUI/Plater.cpp:3238
msgid "Error during reload"
msgstr "Error al recargar"
-#: src/slic3r/GUI/Plater.cpp:5043
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:5172
+#, possible-c-format
msgid "Error exporting 3MF file %s"
msgstr "Error al exportar archivo 3MF %s"
-#: src/slic3r/GUI/Plater.cpp:5005
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:5138
+#, possible-c-format
msgid "Error exporting AMF file %s"
msgstr "Error exportando archivo AMF %s"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:154
+#: src/slic3r/GUI/OpenGLManager.cpp:276
+msgid "Error loading shaders"
+msgstr "Error al cargar sombras"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:152
msgid "Error Message"
msgstr "Mensaje de Error"
-#: src/slic3r/GUI/AppConfig.cpp:114
+#: src/slic3r/GUI/GUI_App.cpp:661
+msgid "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to manually delete the file to recover from the error."
+msgstr "Error al analizar el archivo de configuración de PrusaGCodeViewer, probablemente esté dañado. Intenta eliminar manualmente el archivo para recuperarse del error."
+
+#: src/slic3r/GUI/GUI_App.cpp:655 src/slic3r/GUI/GUI_App.cpp:670
msgid "Error parsing PrusaSlicer config file, it is probably corrupted. Try to manually delete the file to recover from the error. Your user profiles will not be affected."
msgstr "Error al analizar el archivo de configuración de PrusaSlicer, probablemente está dañado. Intenta eliminar manualmente el archivo para recuperarse del error. Tus perfiles de usuario no se verán afectados."
@@ -2363,163 +2753,195 @@ msgstr "Error al analizar el archivo de configuración de PrusaSlicer, probablem
msgid "Error uploading to print host:"
msgstr "Error al cargar a la impresora:"
-#: src/libslic3r/Zipper.cpp:102
+#: src/slic3r/GUI/Plater.cpp:4752
+msgid "Error while loading .gcode file"
+msgstr "Error al cargar el archivo .gcode"
+
+#: src/libslic3r/Zipper.cpp:27
msgid "Error with zip archive"
msgstr "Error con el archivo ZIP"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1918
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2077
msgid "Error!"
msgstr "¡Error!"
-#: src/slic3r/GUI/BedShapeDialog.cpp:505
+#: src/slic3r/GUI/BedShapeDialog.cpp:581
msgid "Error! Invalid model"
msgstr "Error! Modelo inválido"
+#: src/slic3r/GUI/NotificationManager.cpp:667
+#: src/slic3r/GUI/NotificationManager.cpp:683
+#: src/slic3r/GUI/NotificationManager.cpp:694
+msgid "ERROR:"
+msgstr "ERROR:"
+
#: src/slic3r/GUI/FirmwareDialog.cpp:647
-#, c-format
+#, possible-c-format
msgid "Error: %s"
msgstr "Error: %s"
-#: src/slic3r/GUI/Job.hpp:123
+#: src/slic3r/GUI/Jobs/Job.cpp:74
msgid "ERROR: not enough resources to execute a new job."
msgstr "ERROR: no hay suficientes recursos para ejecutar el trabajo."
-#: src/slic3r/GUI/Plater.cpp:240 src/slic3r/GUI/Plater.cpp:1216
-#: src/slic3r/GUI/Plater.cpp:1258
+#: src/slic3r/GUI/Plater.cpp:3374
+msgid "ERROR: Please close all manipulators available from the left toolbar before fixing the mesh."
+msgstr "ERROR: Cierra todos los manipuladores disponibles en la barra de herramientas izquierda antes de arreglar la malla."
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2552 src/slic3r/GUI/GCodeViewer.cpp:2557
+#: src/slic3r/GUI/Plater.cpp:246 src/slic3r/GUI/Plater.cpp:1125
+#: src/slic3r/GUI/Plater.cpp:1175 src/slic3r/GUI/Plater.cpp:1196
msgid "Estimated printing time"
msgstr "Tiempo estimado de impresión"
-#: src/slic3r/GUI/Plater.cpp:502
+#: src/slic3r/GUI/GCodeViewer.cpp:2442 src/slic3r/GUI/GCodeViewer.cpp:2445
+msgid "Event"
+msgstr "Evento"
+
+#: src/slic3r/GUI/Plater.cpp:368
msgid "Everywhere"
msgstr "En todos los sitios"
-#: src/slic3r/GUI/PresetHints.cpp:51
+#: src/slic3r/GUI/PresetHints.cpp:50
msgid "except for the first %1% layers."
msgstr "a excepción de las %1% primeras capas."
-#: src/slic3r/GUI/PresetHints.cpp:53
+#: src/slic3r/GUI/PresetHints.cpp:52
msgid "except for the first layer."
msgstr "a excepción de la primera capa."
-#: src/libslic3r/Print.cpp:1377
+#: src/libslic3r/Print.cpp:1403
msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm"
msgstr "%1%=%2% mm excesivos para ser imprimible con un nozzle de diámetro de %3% mm"
#: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246
-#, c-format
+#, possible-c-format
msgid "Exit %s"
msgstr "Salir %s"
-#: src/libslic3r/PrintConfig.cpp:371
+#: src/slic3r/GUI/Plater.cpp:2143
+msgid "Expand sidebar"
+msgstr "Expandir barra lateral"
+
+#: src/libslic3r/PrintConfig.cpp:405
msgid "Experimental option for preventing support material from being generated under bridged areas."
msgstr "Opción experimental para evitar que se genere material de soporte debajo de las áreas con puente."
-#: src/libslic3r/PrintConfig.cpp:1375
+#: src/libslic3r/PrintConfig.cpp:1483
msgid "Experimental option to adjust flow for overhangs (bridge flow will be used), to apply bridge speed to them and enable fan."
msgstr "Opción experimental para ajustar el flujo para salientes (se usará el flujo del puente), para aplicar la velocidad del puente a ellos y habilitar el ventilador."
-#: src/slic3r/GUI/GUI_App.cpp:815 src/slic3r/GUI/wxExtensions.cpp:755
+#: src/slic3r/GUI/GUI_App.cpp:1507 src/slic3r/GUI/wxExtensions.cpp:676
msgid "Expert"
msgstr "Experto"
-#: src/slic3r/GUI/ConfigWizard.cpp:822
+#: src/slic3r/GUI/ConfigWizard.cpp:1181
msgid "Expert mode"
msgstr "Modo experto"
-#: src/slic3r/GUI/GUI_App.cpp:815
+#: src/slic3r/GUI/GUI_App.cpp:1507
msgid "Expert View Mode"
msgstr "Modo de visualización experto"
-#: src/slic3r/GUI/Plater.cpp:5521
+#: src/slic3r/GUI/Plater.cpp:5706
msgid "Export"
msgstr "Exportar"
-#: src/slic3r/GUI/MainFrame.cpp:500
+#: src/slic3r/GUI/MainFrame.cpp:1094
msgid "Export &Config"
msgstr "Exportar &Configuración"
-#: src/slic3r/GUI/MainFrame.cpp:477 src/slic3r/GUI/MainFrame.cpp:749
+#: src/slic3r/GUI/MainFrame.cpp:1068 src/slic3r/GUI/MainFrame.cpp:1448
msgid "Export &G-code"
msgstr "Exportar código &G"
-#: src/slic3r/GUI/MainFrame.cpp:496
+#: src/slic3r/GUI/MainFrame.cpp:1090 src/slic3r/GUI/MainFrame.cpp:1395
msgid "Export &toolpaths as OBJ"
msgstr "Exportar &trayectorias de herramientas como OBJ"
-#: src/libslic3r/PrintConfig.cpp:3338
+#: src/libslic3r/PrintConfig.cpp:3531
msgid "Export 3MF"
msgstr "Exportar 3MF"
-#: src/slic3r/GUI/MainFrame.cpp:503
+#: src/slic3r/GUI/MainFrame.cpp:1100
+msgid "Export all presets including physical printers to file"
+msgstr "Exportar todos los ajustes preestablecidos, incluidas las impresoras físicas, al archivo"
+
+#: src/slic3r/GUI/MainFrame.cpp:1097
msgid "Export all presets to file"
msgstr "Exportar todos los preajustes al archivo"
-#: src/libslic3r/PrintConfig.cpp:3343
+#: src/libslic3r/PrintConfig.cpp:3536
msgid "Export AMF"
msgstr "Exportar AMF"
-#: src/slic3r/GUI/Plater.cpp:2598
+#: src/slic3r/GUI/Plater.cpp:2560
msgid "Export AMF file:"
msgstr "Exportar archivo AMF:"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1657 src/slic3r/GUI/Plater.cpp:3966
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1786 src/slic3r/GUI/Plater.cpp:3884
msgid "Export as STL"
msgstr "Exportar como STL"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:124
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:117
msgid "Export config"
msgstr "Exportar configuración"
-#: src/slic3r/GUI/MainFrame.cpp:503
+#: src/slic3r/GUI/MainFrame.cpp:1097
msgid "Export Config &Bundle"
msgstr "Exportar Conjunto de A&justes"
-#: src/slic3r/GUI/MainFrame.cpp:500
+#: src/slic3r/GUI/MainFrame.cpp:1100
+msgid "Export Config Bundle With Physical Printers"
+msgstr "Exportar Paquete de Configuración Con Impresoras Físicas"
+
+#: src/slic3r/GUI/MainFrame.cpp:1094
msgid "Export current configuration to file"
msgstr "Exportar la configuración actual al archivo"
-#: src/slic3r/GUI/MainFrame.cpp:492
+#: src/slic3r/GUI/MainFrame.cpp:1086
msgid "Export current plate as AMF"
msgstr "Exportar plataforma actual como AMF"
-#: src/slic3r/GUI/MainFrame.cpp:477
+#: src/slic3r/GUI/MainFrame.cpp:1068
msgid "Export current plate as G-code"
msgstr "Exportar plataforma actual como código G"
-#: src/slic3r/GUI/MainFrame.cpp:521
+#: src/slic3r/GUI/MainFrame.cpp:1076
msgid "Export current plate as G-code to SD card / Flash drive"
msgstr "Exporta a G-code en la tarjeta SD / disco USB"
-#: src/slic3r/GUI/MainFrame.cpp:486
+#: src/slic3r/GUI/MainFrame.cpp:1080
msgid "Export current plate as STL"
msgstr "Exportar plataforma actual como STL"
-#: src/slic3r/GUI/MainFrame.cpp:489
+#: src/slic3r/GUI/MainFrame.cpp:1083
msgid "Export current plate as STL including supports"
msgstr "Exportar la plataforma actual como STL incluyendo soportes"
-#: src/slic3r/GUI/Plater.cpp:3664
-msgid "Export failed"
-msgstr "Error al exportar"
-
-#: src/slic3r/GUI/ConfigWizard.cpp:801
+#: src/slic3r/GUI/ConfigWizard.cpp:1160
msgid "Export full pathnames of models and parts sources into 3mf and amf files"
msgstr "Exportar nombres de ruta completos de las fuentes de los modelos y de piezas a archivos 3mf y amf"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 src/slic3r/GUI/Plater.cpp:891
-#: src/slic3r/GUI/Plater.cpp:5521 src/libslic3r/PrintConfig.cpp:3353
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/Plater.cpp:766
+#: src/slic3r/GUI/Plater.cpp:5706 src/libslic3r/PrintConfig.cpp:3546
msgid "Export G-code"
msgstr "Exportar código G"
-#: src/slic3r/GUI/MainFrame.cpp:521
+#: src/slic3r/GUI/MainFrame.cpp:1076
msgid "Export G-code to SD card / Flash drive"
msgstr "Exporta G-code a la tarjeta SD / disco USB"
-#: src/libslic3r/PrintConfig.cpp:3320
+#: src/slic3r/GUI/NotificationManager.cpp:631
+#: src/slic3r/GUI/NotificationManager.cpp:748
+msgid "Export G-Code."
+msgstr "Exportar Código G."
+
+#: src/libslic3r/PrintConfig.cpp:3513
msgid "Export OBJ"
msgstr "Exportar OBJ"
-#: src/slic3r/GUI/Plater.cpp:2610
+#: src/slic3r/GUI/Plater.cpp:2572
msgid "Export OBJ file:"
msgstr "Exportar archivo OBJ:"
@@ -2527,212 +2949,215 @@ msgstr "Exportar archivo OBJ:"
msgid "Export of a temporary 3mf file failed"
msgstr "La exportación de un archivo temporal de 3mf falló"
-#: src/slic3r/GUI/MainFrame.cpp:492
+#: src/slic3r/GUI/MainFrame.cpp:1086
msgid "Export plate as &AMF"
msgstr "Exportar plataforma como &AMF"
-#: src/slic3r/GUI/MainFrame.cpp:486
+#: src/slic3r/GUI/MainFrame.cpp:1080
msgid "Export plate as &STL"
msgstr "Exportar plataforma como &STL"
-#: src/slic3r/GUI/MainFrame.cpp:489
+#: src/slic3r/GUI/MainFrame.cpp:1083
msgid "Export plate as STL &including supports"
msgstr "Exportar plataforma como STL &incluyendo soportes"
-#: src/libslic3r/PrintConfig.cpp:3332
+#: src/libslic3r/PrintConfig.cpp:3525
msgid "Export SLA"
msgstr "Exportar SLA"
-#: src/slic3r/GUI/Preferences.cpp:72
+#: src/slic3r/GUI/Preferences.cpp:89
msgid "Export sources full pathnames to 3mf and amf"
msgstr "Exportar nombres de ruta completos de las fuentes a 3mf y amf"
-#: src/libslic3r/PrintConfig.cpp:3348
+#: src/libslic3r/PrintConfig.cpp:3541
msgid "Export STL"
msgstr "Exportar STL"
-#: src/slic3r/GUI/Plater.cpp:2591
+#: src/slic3r/GUI/Plater.cpp:2553
msgid "Export STL file:"
msgstr "Exportar archivo STL:"
-#: src/libslic3r/PrintConfig.cpp:3339
+#: src/libslic3r/PrintConfig.cpp:3532
msgid "Export the model(s) as 3MF."
msgstr "Exportar el(los) objeto(s) como 3MF."
-#: src/libslic3r/PrintConfig.cpp:3344
+#: src/libslic3r/PrintConfig.cpp:3537
msgid "Export the model(s) as AMF."
msgstr "Exportar el(los) objeto(s) como AMF."
-#: src/libslic3r/PrintConfig.cpp:3321
+#: src/libslic3r/PrintConfig.cpp:3514
msgid "Export the model(s) as OBJ."
msgstr "Exportar el(los) objeto(s) como OBJ."
-#: src/libslic3r/PrintConfig.cpp:3349
+#: src/libslic3r/PrintConfig.cpp:3542
msgid "Export the model(s) as STL."
msgstr "Exportar el(los) objeto(s) como STL."
-#: src/slic3r/GUI/Plater.cpp:3966
+#: src/slic3r/GUI/Plater.cpp:3884
msgid "Export the selected object as STL file"
msgstr "Exportar el objeto seleccionado como archivo STL"
-#: src/slic3r/GUI/Plater.cpp:880
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 src/slic3r/GUI/Plater.cpp:755
msgid "Export to SD card / Flash drive"
msgstr "Exportar a tarjeta SD / tarjeta Flash"
-#: src/slic3r/GUI/MainFrame.cpp:496
+#: src/slic3r/GUI/MainFrame.cpp:1090 src/slic3r/GUI/MainFrame.cpp:1395
msgid "Export toolpaths as OBJ"
msgstr "Exportar trayectorias de herramientas como OBJ"
-#: src/libslic3r/Print.cpp:1638
+#: src/slic3r/GUI/NotificationManager.hpp:317
+msgid "Exporting finished."
+msgstr "Exportación finalizada."
+
+#: src/libslic3r/Print.cpp:1676
msgid "Exporting G-code"
msgstr "Exportando código G"
#: src/slic3r/Utils/FixModelByWin10.cpp:341
-msgid "Exporting model..."
-msgstr "Exportando el modelo..."
+msgid "Exporting model"
+msgstr "Exportando modelo"
#: src/slic3r/Utils/FixModelByWin10.cpp:219
#: src/slic3r/Utils/FixModelByWin10.cpp:359
msgid "Exporting source model"
msgstr "Exportando el modelo original"
-#: src/libslic3r/SLAPrint.cpp:646
+#: src/libslic3r/SLAPrint.cpp:660
msgid "Exposition time is out of printer profile bounds."
msgstr "Tiempo de exposición inicial fuera de los límites del perfil de impresión."
-#: src/slic3r/GUI/Tab.cpp:2117 src/slic3r/GUI/Tab.cpp:3515
+#: src/slic3r/GUI/Tab.cpp:2287 src/slic3r/GUI/Tab.cpp:3931
msgid "Exposure"
msgstr "Exposición"
-#: src/libslic3r/PrintConfig.cpp:2541 src/libslic3r/PrintConfig.cpp:2542
+#: src/libslic3r/PrintConfig.cpp:2684 src/libslic3r/PrintConfig.cpp:2685
msgid "Exposure time"
msgstr "Tiempo de exposición"
-#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:311
+#: src/slic3r/GUI/GUI_Preview.cpp:302 src/libslic3r/ExtrusionEntity.cpp:315
+#: src/libslic3r/ExtrusionEntity.cpp:338
msgid "External perimeter"
msgstr "Perímetro externo"
-#: src/slic3r/GUI/PresetHints.cpp:156
+#: src/slic3r/GUI/PresetHints.cpp:155
msgid "external perimeters"
msgstr "perímetros externos"
-#: src/libslic3r/PrintConfig.cpp:446 src/libslic3r/PrintConfig.cpp:457
+#: src/libslic3r/PrintConfig.cpp:482 src/libslic3r/PrintConfig.cpp:493
msgid "External perimeters"
msgstr "Perímetros externos"
-#: src/libslic3r/PrintConfig.cpp:469
+#: src/libslic3r/PrintConfig.cpp:505
msgid "External perimeters first"
msgstr "Perímetros externos primero"
-#: src/libslic3r/PrintConfig.cpp:1588 src/libslic3r/PrintConfig.cpp:1596
+#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1704
msgid "Extra length on restart"
msgstr "Longitud adicional en el reinicio"
-#: src/libslic3r/PrintConfig.cpp:1390
+#: src/libslic3r/PrintConfig.cpp:1498
msgid "Extra loading distance"
msgstr "Distancia de carga adicional"
-#: src/libslic3r/PrintConfig.cpp:477
+#: src/libslic3r/PrintConfig.cpp:513
msgid "Extra perimeters if needed"
msgstr "Perímetros adicionales si es necesario"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:278 src/slic3r/GUI/Tab.cpp:1434
-#: src/slic3r/GUI/wxExtensions.cpp:598 src/libslic3r/PrintConfig.cpp:487
+#: src/slic3r/GUI/GCodeViewer.cpp:2277 src/slic3r/GUI/GCodeViewer.cpp:2313
+#: src/slic3r/GUI/GCodeViewer.cpp:2318 src/slic3r/GUI/GUI_ObjectList.cpp:296
+#: src/slic3r/GUI/Tab.cpp:1780 src/slic3r/GUI/wxExtensions.cpp:515
+#: src/libslic3r/PrintConfig.cpp:523
msgid "Extruder"
msgstr "Extrusor"
-#: src/slic3r/GUI/DoubleSlider.cpp:1134 src/slic3r/GUI/DoubleSlider.cpp:1170
-#: src/slic3r/GUI/GLCanvas3D.cpp:977 src/slic3r/GUI/GUI_ObjectList.cpp:1704
-#: src/slic3r/GUI/Tab.cpp:2320 src/libslic3r/GCode/PreviewData.cpp:445
-#, c-format
+#: src/slic3r/GUI/DoubleSlider.cpp:1263 src/slic3r/GUI/DoubleSlider.cpp:1297
+#: src/slic3r/GUI/GLCanvas3D.cpp:983 src/slic3r/GUI/GUI_ObjectList.cpp:1832
+#: src/slic3r/GUI/Tab.cpp:2489 src/libslic3r/GCode/PreviewData.cpp:450
+#, possible-c-format
msgid "Extruder %d"
msgstr "Extrusor %d"
-#: src/slic3r/GUI/DoubleSlider.cpp:1011
+#: src/slic3r/GUI/DoubleSlider.cpp:1137
msgid "Extruder (tool) is changed to Extruder \"%1%\""
msgstr "El Extrusor (herramienta) se cambia al Extrusor \"%1%\""
-#: src/slic3r/GUI/ConfigWizard.cpp:1017
-msgid "Extruder and Bed Temperatures"
-msgstr "Temperaturas del Extrusor y de la Base"
-
#: src/slic3r/GUI/WipeTowerDialog.cpp:255
msgid "Extruder changed to"
msgstr "El extrusor cambia a"
-#: src/slic3r/GUI/Tab.cpp:1233
-msgid "Extruder clearance (mm)"
-msgstr "Distancia libre del extrusor (mm)"
+#: src/slic3r/GUI/Tab.cpp:1589
+msgid "Extruder clearance"
+msgstr "Separación del extrusor"
-#: src/libslic3r/PrintConfig.cpp:522
+#: src/libslic3r/PrintConfig.cpp:558
msgid "Extruder Color"
msgstr "Color del extrusor"
-#: src/libslic3r/PrintConfig.cpp:529
+#: src/libslic3r/PrintConfig.cpp:565
msgid "Extruder offset"
msgstr "Offset del extrusor"
-#: src/libslic3r/PrintConfig.cpp:911
-msgid "Extruder temperature for first layer. If you want to control temperature manually during print, set this to zero to disable temperature control commands in the output file."
-msgstr "Temperatura del extrusor para la primera capa. Si desea controlar la temperatura manualmente durante la impresión, configúrela en cero para desactivar los comandos de control de temperatura en el archivo de salida."
-
-#: src/libslic3r/PrintConfig.cpp:2065
-msgid "Extruder temperature for layers after the first one. Set this to zero to disable temperature control commands in the output."
-msgstr "Temperatura del extrusor para capas después del primera. Ajuste esto a cero para desactivar los comandos de control de temperatura en la salida."
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:99 src/slic3r/GUI/GUI_ObjectList.cpp:617
-#: src/slic3r/GUI/Tab.cpp:1180 src/slic3r/GUI/Tab.cpp:1838
-#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:1002
-#: src/libslic3r/PrintConfig.cpp:1409 src/libslic3r/PrintConfig.cpp:1737
-#: src/libslic3r/PrintConfig.cpp:1938 src/libslic3r/PrintConfig.cpp:1965
+#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:656
+#: src/slic3r/GUI/Tab.cpp:1510 src/slic3r/GUI/Tab.cpp:2072
+#: src/libslic3r/PrintConfig.cpp:524 src/libslic3r/PrintConfig.cpp:1046
+#: src/libslic3r/PrintConfig.cpp:1517 src/libslic3r/PrintConfig.cpp:1852
+#: src/libslic3r/PrintConfig.cpp:2080 src/libslic3r/PrintConfig.cpp:2107
msgid "Extruders"
msgstr "Extrusores"
-#: src/libslic3r/PrintConfig.cpp:539
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1061
+msgid "Extruders count"
+msgstr "Contador de extrusores"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2493
+msgid "Extrusion"
+msgstr "Extrusión"
+
+#: src/libslic3r/PrintConfig.cpp:575
msgid "Extrusion axis"
msgstr "Eje de extrusión"
-#: src/libslic3r/PrintConfig.cpp:545
+#: src/libslic3r/PrintConfig.cpp:581
msgid "Extrusion multiplier"
msgstr "Multiplicador de extrusión"
-#: src/slic3r/GUI/ConfigWizard.cpp:1037
+#: src/slic3r/GUI/ConfigWizard.cpp:1403
msgid "Extrusion Temperature:"
msgstr "Temperatura de Extrusión:"
-#: src/slic3r/GUI/Tab.cpp:1205
+#: src/slic3r/GUI/Tab.cpp:1535
msgid "Extrusion width"
msgstr "Ancho de extrusión"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:100 src/slic3r/GUI/GUI_ObjectList.cpp:618
-#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:555
-#: src/libslic3r/PrintConfig.cpp:877 src/libslic3r/PrintConfig.cpp:1010
-#: src/libslic3r/PrintConfig.cpp:1418 src/libslic3r/PrintConfig.cpp:1757
-#: src/libslic3r/PrintConfig.cpp:1947 src/libslic3r/PrintConfig.cpp:2106
+#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:657
+#: src/libslic3r/PrintConfig.cpp:483 src/libslic3r/PrintConfig.cpp:591
+#: src/libslic3r/PrintConfig.cpp:919 src/libslic3r/PrintConfig.cpp:1054
+#: src/libslic3r/PrintConfig.cpp:1526 src/libslic3r/PrintConfig.cpp:1872
+#: src/libslic3r/PrintConfig.cpp:2089 src/libslic3r/PrintConfig.cpp:2249
msgid "Extrusion Width"
msgstr "Ancho de Extrusión"
-#: src/slic3r/GUI/Plater.cpp:162
+#: src/slic3r/GUI/Plater.cpp:168
msgid "Facets"
msgstr "Facetas"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:349
+#: src/slic3r/GUI/GUI_ObjectList.cpp:396
msgid "facets added"
msgstr "facetas añadidas"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:348
+#: src/slic3r/GUI/GUI_ObjectList.cpp:395
msgid "facets removed"
msgstr "facetas retiradas"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:350
+#: src/slic3r/GUI/GUI_ObjectList.cpp:397
msgid "facets reversed"
msgstr "facetas invertidas"
-#: src/libslic3r/PrintConfig.cpp:2517
+#: src/libslic3r/PrintConfig.cpp:2660
msgid "Faded layers"
msgstr "Capas descoloridas"
-#: src/libslic3r/Zipper.cpp:44
+#: src/libslic3r/miniz_extension.cpp:103
msgid "failed finding central directory"
msgstr "búsqueda de directorio central fallida"
@@ -2740,105 +3165,135 @@ msgstr "búsqueda de directorio central fallida"
msgid "Failed loading the input model."
msgstr "No se pudo cargar el modelo de entrada."
-#: src/libslic3r/PrintBase.cpp:71
+#: src/libslic3r/PrintBase.cpp:72
msgid "Failed processing of the output_filename_format template."
msgstr "Error al procesar la plantilla output_filename_format."
-#: src/slic3r/GUI/PresetHints.cpp:42
-msgid "Fan"
-msgstr "Ventilador"
+#: src/slic3r/GUI/GUI_App.cpp:1648
+msgid "Failed to activate configuration snapshot."
+msgstr "No se pudo activar la instantánea de configuración."
-#: src/slic3r/GUI/Tab.cpp:1456
+#: src/slic3r/GUI/Tab.cpp:1802
msgid "Fan settings"
msgstr "Configuración del ventilador"
-#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/Tab.cpp:1457
+#: src/slic3r/GUI/GUI_Preview.cpp:279 src/slic3r/GUI/Tab.cpp:1803
msgid "Fan speed"
msgstr "Velocidad del ventilador"
-#: src/libslic3r/GCode/PreviewData.cpp:353
+#: src/slic3r/GUI/GCodeViewer.cpp:2239 src/libslic3r/GCode/PreviewData.cpp:358
msgid "Fan Speed (%)"
msgstr "Velocidad Ventilador (%)"
-#: src/libslic3r/PrintConfig.cpp:2405
+#: src/slic3r/GUI/PresetHints.cpp:49
+msgid "Fan speed will be ramped from zero at layer %1% to %2%%% at layer %3%."
+msgstr "La velocidad del ventilador aumentará desde cero en la capa %1% a %2%%% en la capa %3%."
+
+#: src/libslic3r/PrintConfig.cpp:1001
+msgid "Fan speed will be ramped up linearly from zero at layer \"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower than \"disable_fan_first_layers\", in which case the fan will be running at maximum allowed speed at layer \"disable_fan_first_layers\" + 1."
+msgstr "La velocidad del ventilador aumentará linealmente desde cero en la capa \"disable_fan_first_layers\" al máximo en la capa \"full_fan_speed_layer\". \"full_fan_speed_layer\" será ignorada si es menor que \"disable_fan_first_layers\",en cuyo caso el ventilador funcionará a la velocidad máxima permitida en la capa \"disable_fan_first_layers\" + 1."
+
+#: src/slic3r/GUI/PresetHints.cpp:51
+msgid "Fan will always run at %1%%%"
+msgstr "El ventilador siempre funcionará al %1%%%"
+
+#: src/slic3r/GUI/PresetHints.cpp:58
+msgid "Fan will be turned off."
+msgstr "El ventilador se apagará."
+
+#: src/libslic3r/PrintConfig.cpp:2548
msgid "Fast"
msgstr "Rápida"
-#: src/libslic3r/PrintConfig.cpp:2406
+#: src/libslic3r/PrintConfig.cpp:2549
msgid "Fast tilt"
msgstr "Inclinación rápida"
-#: src/slic3r/GUI/GUI_App.cpp:141
+#: src/slic3r/GUI/GUI_App.cpp:531
msgid "Fatal error"
msgstr "Error fatal"
-#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/GUI_Preview.cpp:575
-#: src/libslic3r/GCode/PreviewData.cpp:345
+#: src/slic3r/GUI/GUI_Init.cpp:88
+msgid "Fatal error, exception catched: %1%"
+msgstr "Error fatal, excepción detectada: %1%"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2225 src/slic3r/GUI/GCodeViewer.cpp:2233
+#: src/slic3r/GUI/GUI_Preview.cpp:275 src/slic3r/GUI/GUI_Preview.cpp:787
+#: src/libslic3r/GCode/PreviewData.cpp:350
msgid "Feature type"
msgstr "Tipo de función"
-#: src/slic3r/GUI/GUI_Preview.cpp:234 src/slic3r/GUI/GUI_Preview.cpp:235
+#: src/slic3r/GUI/GUI_Preview.cpp:293 src/slic3r/GUI/GUI_Preview.cpp:295
+#: src/slic3r/GUI/GUI_Preview.cpp:316
msgid "Feature types"
msgstr "Tipos de funciones"
-#: src/slic3r/GUI/ConfigWizard.cpp:1525
+#: src/slic3r/GUI/ConfigWizard.cpp:1926
msgid "FFF Technology Printers"
msgstr "Impresoras de Tecnología FFF"
-#: src/slic3r/GUI/Plater.cpp:816 src/slic3r/GUI/Tab.cpp:1425
-#: src/slic3r/GUI/Tab.cpp:1426
+#: src/slic3r/GUI/Plater.cpp:691 src/slic3r/GUI/Tab.cpp:1770
+#: src/slic3r/GUI/Tab.cpp:1771
msgid "Filament"
msgstr "Filamento"
-#: src/slic3r/GUI/Preset.cpp:1522
+#: src/libslic3r/Preset.cpp:1301
msgid "filament"
msgstr "filamento"
-#: src/slic3r/GUI/ConfigWizard.cpp:952
+#: src/slic3r/GUI/ConfigWizard.cpp:1318
msgid "Filament and Nozzle Diameters"
msgstr "Filamento y diámetros de boquilla"
-#: src/slic3r/GUI/ConfigWizard.cpp:983
+#: src/slic3r/GUI/Plater.cpp:1189
+msgid "Filament at extruder %1%"
+msgstr "Filamento en extrusor %1%"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1349
msgid "Filament Diameter:"
msgstr "Diámetro del filamento:"
-#: src/libslic3r/PrintConfig.cpp:651
+#: src/libslic3r/PrintConfig.cpp:687
msgid "Filament is cooled by being moved back and forth in the cooling tubes. Specify desired number of these moves."
msgstr "El filamento se enfría al ser movido hacia adelante y hacia atrás en los tubos de enfriamiento. Especifica el número deseado de estos movimientos."
-#: src/libslic3r/PrintConfig.cpp:686
+#: src/libslic3r/PrintConfig.cpp:722
msgid "Filament load time"
msgstr "Tiempo de carga de filamento"
-#: src/libslic3r/PrintConfig.cpp:588
+#: src/libslic3r/PrintConfig.cpp:624
msgid "Filament notes"
msgstr "Notas del filamento"
-#: src/slic3r/GUI/Tab.cpp:1323 src/slic3r/GUI/Tab.cpp:1378
+#: src/slic3r/GUI/Tab.cpp:1669
msgid "Filament Overrides"
msgstr "Anulaciones de filamentos"
-#: src/libslic3r/PrintConfig.cpp:1381
+#: src/libslic3r/PrintConfig.cpp:1489
msgid "Filament parking position"
msgstr "Posición de aparcar el filamento"
-#: src/slic3r/GUI/ConfigWizard.cpp:2013
+#: src/slic3r/GUI/ConfigWizard.cpp:2524
msgid "Filament Profiles Selection"
msgstr "Selección Perfiles de Filamento"
-#: src/slic3r/GUI/Tab.cpp:1471
+#: src/slic3r/GUI/Tab.cpp:1817
msgid "Filament properties"
msgstr "Propiedades del filamento"
-#: src/slic3r/GUI/Tab.hpp:355
+#: src/slic3r/GUI/Tab.hpp:409
msgid "Filament Settings"
msgstr "Configuración del filamento"
-#: src/libslic3r/PrintConfig.cpp:726
+#: src/slic3r/GUI/GLCanvas3D.cpp:4304 src/slic3r/GUI/GLCanvas3D.cpp:4940
+msgid "Filament Settings Tab"
+msgstr "Pestaña Ajustes Filamento"
+
+#: src/libslic3r/PrintConfig.cpp:762
msgid "Filament type"
msgstr "Tipo de filamento"
-#: src/libslic3r/PrintConfig.cpp:701
+#: src/libslic3r/PrintConfig.cpp:737
msgid "Filament unload time"
msgstr "Tiempo de descarga del filamento"
@@ -2846,83 +3301,103 @@ msgstr "Tiempo de descarga del filamento"
msgid "filaments"
msgstr "filamentos"
-#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2013
+#: src/slic3r/GUI/ConfigWizard.cpp:1872 src/slic3r/GUI/ConfigWizard.cpp:2524
msgid "Filaments"
msgstr "Filamentos"
-#: src/libslic3r/Zipper.cpp:72
+#: src/slic3r/GUI/ConfigWizard.cpp:691
+msgid "Filaments marked with <b>*</b> are <b>not</b> compatible with some installed printers."
+msgstr "Los filamentos marcados con <b>*</b> y <b>no</b> son compatibles con algunas impresoras instaladas."
+
+#: src/libslic3r/miniz_extension.cpp:131
msgid "file close failed"
msgstr "cierre del archivo fallido"
-#: src/libslic3r/Zipper.cpp:66
+#: src/libslic3r/miniz_extension.cpp:125
msgid "file create failed"
msgstr "creación del archivo fallida"
-#: src/slic3r/GUI/MainFrame.cpp:791
+#: src/slic3r/GUI/MainFrame.cpp:1492
msgid "File Not Found"
msgstr "Archivo no encontrado"
-#: src/libslic3r/Zipper.cpp:86
+#: src/libslic3r/miniz_extension.cpp:145
msgid "file not found"
msgstr "archivo no encontrado"
-#: src/libslic3r/Zipper.cpp:64
+#: src/libslic3r/miniz_extension.cpp:123
msgid "file open failed"
msgstr "apertura de archivo fallida"
-#: src/libslic3r/Zipper.cpp:70
+#: src/libslic3r/miniz_extension.cpp:129
msgid "file read failed"
msgstr "lectura del archivo fallida"
-#: src/libslic3r/Zipper.cpp:74
+#: src/libslic3r/miniz_extension.cpp:133
msgid "file seek failed"
msgstr "búsqueda de archivo fallida"
-#: src/libslic3r/Zipper.cpp:76
+#: src/libslic3r/miniz_extension.cpp:135
msgid "file stat failed"
msgstr "estadística de archivos fallida"
-#: src/libslic3r/Zipper.cpp:36
+#: src/libslic3r/miniz_extension.cpp:95
msgid "file too large"
msgstr "archivo demasiado grande"
-#: src/libslic3r/Zipper.cpp:68
+#: src/libslic3r/miniz_extension.cpp:127
msgid "file write failed"
msgstr "escritura del archivo fallida"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:153
+#: src/slic3r/GUI/PrintHostDialogs.cpp:151
msgid "Filename"
msgstr "Nombre de archivo"
-#: src/libslic3r/PrintConfig.cpp:775
+#: src/slic3r/GUI/ConfigWizard.cpp:1181
+msgid "Files association"
+msgstr "Asociación de archivos"
+
+#: src/libslic3r/PrintConfig.cpp:811
msgid "Fill angle"
msgstr "Ãngulo de relleno"
-#: src/libslic3r/PrintConfig.cpp:789
+#: src/slic3r/GUI/Plater.cpp:1651
+msgid "Fill bed"
+msgstr "Rellenar la base"
+
+#: src/slic3r/GUI/Plater.cpp:3936
+msgid "Fill bed with instances"
+msgstr "Rellenar la base con copias"
+
+#: src/libslic3r/PrintConfig.cpp:825
msgid "Fill density"
msgstr "Densidad de relleno"
-#: src/libslic3r/PrintConfig.cpp:826
+#: src/libslic3r/PrintConfig.cpp:862
msgid "Fill pattern"
msgstr "Patrón de relleno"
-#: src/libslic3r/PrintConfig.cpp:437
+#: src/libslic3r/PrintConfig.cpp:473
msgid "Fill pattern for bottom infill. This only affects the bottom external visible layer, and not its adjacent solid shells."
msgstr "Patrón de relleno para la tapa inferior. Esto sólo afecta a la capa inferior externa visible, y no a las paredes adyacentes."
-#: src/libslic3r/PrintConfig.cpp:828
+#: src/libslic3r/PrintConfig.cpp:864
msgid "Fill pattern for general low-density infill."
msgstr "Patrón de relleno para el relleno general de baja densidad."
-#: src/libslic3r/PrintConfig.cpp:417
+#: src/libslic3r/PrintConfig.cpp:451
msgid "Fill pattern for top infill. This only affects the top visible layer, and not its adjacent solid shells."
msgstr "Patrón de relleno para el relleno superior. Esto solo afecta a la capa superior visible, y no a sus capas sólidas adyacentes."
+#: src/slic3r/GUI/Plater.cpp:3936
+msgid "Fill the remaining area of bed with instances of the selected object"
+msgstr "Rellenar el área restante de la base con copias del objeto seleccionado"
+
#: src/slic3r/GUI/BonjourDialog.cpp:225
msgid "Finished"
msgstr "Terminado"
-#: src/slic3r/GUI/ConfigWizard.cpp:891 src/slic3r/GUI/Tab.cpp:1947
+#: src/slic3r/GUI/ConfigWizard.cpp:1257 src/slic3r/GUI/Tab.cpp:2132
msgid "Firmware"
msgstr "Firmware"
@@ -2934,44 +3409,56 @@ msgstr "Flasheador de firmware"
msgid "Firmware image:"
msgstr "Imagen del firmware:"
-#: src/slic3r/GUI/Tab.cpp:2577
+#: src/slic3r/GUI/Tab.cpp:2733
msgid "Firmware Retraction"
msgstr "Retracción del firmware"
-#: src/slic3r/GUI/ConfigWizard.cpp:891
+#: src/slic3r/GUI/ConfigWizard.cpp:1257
msgid "Firmware Type"
msgstr "Tipo de Firmware"
-#: src/libslic3r/PrintConfig.cpp:859 src/libslic3r/PrintConfig.cpp:868
-#: src/libslic3r/PrintConfig.cpp:876 src/libslic3r/PrintConfig.cpp:910
+#: src/libslic3r/PrintConfig.cpp:899 src/libslic3r/PrintConfig.cpp:908
+#: src/libslic3r/PrintConfig.cpp:918 src/libslic3r/PrintConfig.cpp:952
msgid "First layer"
msgstr "Primera capa"
-#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:889
+#: src/libslic3r/PrintConfig.cpp:909
+msgid "First layer bed temperature"
+msgstr "Temperatura de la base calefable para la primera capa"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:60 src/libslic3r/PrintConfig.cpp:931
msgid "First layer height"
msgstr "Altura de la primera capa"
-#: src/libslic3r/Print.cpp:1422
+#: src/libslic3r/Print.cpp:1448
msgid "First layer height can't be greater than nozzle diameter"
msgstr "La altura de primera capa no puede ser mayor que el diametro de la boquilla"
-#: src/libslic3r/PrintConfig.cpp:900
+#: src/libslic3r/PrintConfig.cpp:960
+msgid "First layer nozzle temperature"
+msgstr "Temperatura de la boquilla para la primera capa"
+
+#: src/libslic3r/PrintConfig.cpp:942
msgid "First layer speed"
msgstr "Velocidad de la primera capa"
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:218
msgid "First layer volumetric"
msgstr "Primera capa volumétrica"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1647
+#: src/slic3r/GUI/Plater.cpp:3380
+msgid "Fix through NetFabb"
+msgstr "Reparar mediante NetFabb"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1776
msgid "Fix through the Netfabb"
msgstr "Reparar mediante Netfabb"
-#: src/slic3r/GUI/Plater.cpp:3473
+#: src/slic3r/GUI/Plater.cpp:3278
msgid "Fix Throught NetFabb"
msgstr "Reparar mediante NetFabb"
-#: src/slic3r/GUI/GUI_App.cpp:824
+#: src/slic3r/GUI/GUI_App.cpp:1522
msgid "Flash printer &firmware"
msgstr "Grabar &firmware en la impresora"
@@ -2999,52 +3486,52 @@ msgstr "Flasheo en curso. ¡Por favor no desconecte la impresora!"
msgid "Flashing succeeded!"
msgstr "¡Exito al flashear!"
-#: src/slic3r/GUI/Tab.cpp:1218
+#: src/slic3r/GUI/Tab.cpp:1548
msgid "Flow"
msgstr "Flujo"
-#: src/slic3r/GUI/PresetHints.cpp:220
+#: src/libslic3r/PrintConfig.cpp:1145
+msgid "Flow rate"
+msgstr "Tasa de flujo"
+
+#: src/slic3r/GUI/PresetHints.cpp:219
msgid "flow rate is maximized"
msgstr "se maximiza el flujo de material"
-#: src/slic3r/GUI/UpdateDialogs.cpp:286
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:555
+msgid "Following printer preset(s) is duplicated:%1%The above preset for printer \"%2%\" will be used just once."
+msgstr "Los siguientes ajustes preestablecidos de la impresora están duplicados:%1%El preajuste anterior para impresora \"%2%\" se utilizará solo una vez."
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:287
msgid "For more information please visit our wiki page:"
msgstr "Para más información visite por favor la página de nuestra wiki:"
-#: src/slic3r/GUI/Plater.cpp:501 src/slic3r/GUI/Plater.cpp:624
+#: src/slic3r/GUI/Plater.cpp:367 src/slic3r/GUI/Plater.cpp:490
msgid "For support enforcers only"
msgstr "Sólo para modificadores de soportes"
#. TRN Description for "WHITE BULLET"
-#: src/slic3r/GUI/Tab.cpp:3267
-msgid ""
-"for the left button: indicates a non-system (or non-default) preset,\n"
-"for the right button: indicates that the settings hasn't been modified."
-msgstr ""
-"para el botón izquierdo: indica un preajuste que no es del sistema (o no predeterminado),\n"
-"para el botón derecho: indica que la configuración no se ha modificado."
+#: src/slic3r/GUI/Tab.cpp:3702
+msgid "for the left button: indicates a non-system (or non-default) preset,\nfor the right button: indicates that the settings hasn't been modified."
+msgstr "para el botón izquierdo: indica un preajuste que no es del sistema (o no predeterminado),\npara el botón derecho: indica que la configuración no se ha modificado."
-#: src/slic3r/GUI/ConfigManipulation.cpp:136
-msgid ""
-"For the Wipe Tower to work with the soluble supports, the support layers\n"
-"need to be synchronized with the object layers."
-msgstr ""
-"Para que la Torre de Limpieza funcione con los soportes solubles, las capas de soporte\n"
-"deben sincronizarse con las capas de objetos."
+#: src/slic3r/GUI/ConfigManipulation.cpp:135
+msgid "For the Wipe Tower to work with the soluble supports, the support layers\nneed to be synchronized with the object layers."
+msgstr "Para que la Torre de Limpieza funcione con los soportes solubles, las capas de soporte\ndeben sincronizarse con las capas de objetos."
-#: src/libslic3r/Print.cpp:1396
+#: src/libslic3r/Print.cpp:1422
msgid "For the Wipe Tower to work with the soluble supports, the support layers need to be synchronized with the object layers."
msgstr "Para que la Torre de limpieza funcione con soportes solubles, las capas de soportes necesitan estar sincronizadas con las capas del objeto."
-#: src/libslic3r/PrintConfig.cpp:2864
+#: src/libslic3r/PrintConfig.cpp:3028
msgid "Force pad around object everywhere"
msgstr "Forzar el pad alrededor del objeto en todas partes"
-#: src/libslic3r/PrintConfig.cpp:1729
+#: src/libslic3r/PrintConfig.cpp:1844
msgid "Force solid infill for regions having a smaller area than the specified threshold."
msgstr "Forzar el relleno sólido para las regiones que tienen un área más pequeña que el umbral especificado."
-#: src/libslic3r/PrintConfig.cpp:1072
+#: src/libslic3r/PrintConfig.cpp:1116
msgid "Force the generation of solid shells between adjacent materials/volumes. Useful for multi-extruder prints with translucent materials or manual soluble support material."
msgstr "Forzar la generación de carcasas sólidas entre materiales / volúmenes adyacentes. Útil para impresiones de múltiples extrusoras con materiales translúcidos o material de soporte soluble manual."
@@ -3052,248 +3539,317 @@ msgstr "Forzar la generación de carcasas sólidas entre materiales / volúmenes
msgid "From"
msgstr "Desde"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2223
+#: src/slic3r/GUI/GCodeViewer.cpp:2197
+msgid "from"
+msgstr "desde"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2389
msgid "From Object List You can't delete the last solid part from object."
msgstr "Desde la Lista de Objetos no puedes eliminar la última parte sólida del objeto."
-#: src/slic3r/GUI/MainFrame.cpp:667
+#: src/slic3r/GUI/MainFrame.cpp:964 src/slic3r/GUI/MainFrame.cpp:1284
msgid "Front"
msgstr "Frontal"
-#: src/slic3r/GUI/MainFrame.cpp:667
+#: src/slic3r/GUI/MainFrame.cpp:964 src/slic3r/GUI/MainFrame.cpp:1284
msgid "Front View"
msgstr "Vista frontal"
-#: src/slic3r/GUI/Tab.cpp:1013
+#: src/libslic3r/PrintConfig.cpp:1000
+msgid "Full fan speed at layer"
+msgstr "Velocidad máxima del ventilador en la capa"
+
+#: src/slic3r/GUI/Tab.cpp:1331
msgid "full profile name"
msgstr "nombre completo perfil"
-#: src/slic3r/GUI/MainFrame.cpp:826
+#: src/libslic3r/PrintConfig.cpp:817
+msgid "g"
+msgstr "g"
+
+#: src/slic3r/GUI/MainFrame.cpp:1527
msgid "G-code"
msgstr "Código G"
-#: src/slic3r/GUI/DoubleSlider.cpp:1021
-msgid ""
-"G-code associated to this tick mark is in a conflict with print mode.\n"
-"Editing it will cause changes of Slider data."
-msgstr ""
-"El código G asociado a esta marca de verificación está en conflicto con el modo de impresión.\n"
-"Su edición provocará cambios en los datos del Slider."
+#: src/slic3r/GUI/DoubleSlider.cpp:1146
+msgid "G-code associated to this tick mark is in a conflict with print mode.\nEditing it will cause changes of Slider data."
+msgstr "El código G asociado a esta marca de verificación está en conflicto con el modo de impresión.\nSu edición provocará cambios en los datos del Slider."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:130
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:165
msgid "G-code file exported to %1%"
msgstr "Archivo de código G exportado a %1%"
-#: src/libslic3r/PrintConfig.cpp:936
+#: src/libslic3r/PrintConfig.cpp:980
msgid "G-code flavor"
msgstr "Tipo de código G"
-#: src/libslic3r/PrintConfig.cpp:721
+#: src/slic3r/GUI/MainFrame.cpp:66 src/slic3r/GUI/MainFrame.cpp:79
+msgid "G-code preview"
+msgstr "Previsualización código G"
+
+#: src/libslic3r/PrintConfig.cpp:66
+msgid "G-code thumbnails"
+msgstr "Miniaturas de código G"
+
+#: src/libslic3r/PrintConfig.cpp:3552
+msgid "G-code viewer"
+msgstr "Visor código G"
+
+#: src/libslic3r/PrintConfig.cpp:757
msgid "g/cm³"
msgstr "g/cm³"
-#: src/libslic3r/PrintConfig.cpp:2505
+#: src/libslic3r/PrintConfig.cpp:2648
msgid "g/ml"
msgstr "g/ml"
-#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:317
-#: src/libslic3r/PrintConfig.cpp:918
+#: src/slic3r/GUI/GUI_Preview.cpp:309 src/libslic3r/ExtrusionEntity.cpp:322
+#: src/libslic3r/ExtrusionEntity.cpp:352 src/libslic3r/PrintConfig.cpp:962
msgid "Gap fill"
-msgstr "Relleno"
+msgstr "Relleno del hueco"
-#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1796
-#: src/slic3r/GUI/Tab.cpp:2040
+#: src/slic3r/GUI/Preferences.cpp:24 src/slic3r/GUI/Tab.cpp:2058
+#: src/slic3r/GUI/Tab.cpp:2240 src/slic3r/GUI/Tab.cpp:2348
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1066
msgid "General"
msgstr "General"
-#: src/libslic3r/PrintConfig.cpp:1307
+#: src/libslic3r/PrintConfig.cpp:1415
msgid "Generate no less than the number of skirt loops required to consume the specified amount of filament on the bottom layer. For multi-extruder machines, this minimum applies to each extruder."
msgstr "Generar no menos que el número de bucles de falda requeridos para consumir la cantidad especificada de filamento en la capa inferior. Para máquinas multi-extrusoras, este mínimo se aplica a cada extrusora."
-#: src/libslic3r/PrintConfig.cpp:1865
+#: src/libslic3r/PrintConfig.cpp:2007
msgid "Generate support material"
msgstr "Generar material de soporte"
-#: src/libslic3r/PrintConfig.cpp:1926
+#: src/libslic3r/PrintConfig.cpp:2068
msgid "Generate support material for the specified number of layers counting from bottom, regardless of whether normal support material is enabled or not and regardless of any angle threshold. This is useful for getting more adhesion of objects having a very thin or poor footprint on the build plate."
msgstr "Generar material de soporte para la cantidad especificada de capas contando desde abajo, independientemente de si el material de soporte normal está habilitado o no e independientemente de cualquier umbral de ángulo. Es útil para obtener una mayor adhesión de los objetos que tienen una huella muy delgada o deficiente en la placa de construcción."
-#: src/libslic3r/PrintConfig.cpp:2613
+#: src/libslic3r/PrintConfig.cpp:2756
msgid "Generate supports"
msgstr "Generar soportes"
-#: src/libslic3r/PrintConfig.cpp:2615
+#: src/libslic3r/PrintConfig.cpp:2758
msgid "Generate supports for the models"
msgstr "Generar soportes para los modelos"
-#: src/libslic3r/Print.cpp:1614
+#: src/slic3r/GUI/Plater.cpp:3554
+msgid "generated warnings"
+msgstr "avisos generados"
+
+#: src/libslic3r/Print.cpp:1645
msgid "Generating brim"
msgstr "Generando balsa"
-#: src/libslic3r/Print.cpp:1642
+#: src/libslic3r/Print.cpp:1680
msgid "Generating G-code"
msgstr "Generando G-code"
-#: src/libslic3r/SLAPrintSteps.cpp:48
+#: src/slic3r/GUI/GCodeViewer.cpp:1392
+msgid "Generating index buffers"
+msgstr "Generando buffers de índice"
+
+#: src/libslic3r/SLAPrintSteps.cpp:49
msgid "Generating pad"
msgstr "Generando pad"
-#: src/libslic3r/PrintObject.cpp:152
+#: src/libslic3r/PrintObject.cpp:158
msgid "Generating perimeters"
msgstr "Generando perímetros"
-#: src/libslic3r/Print.cpp:1606
+#: src/libslic3r/Print.cpp:1636
msgid "Generating skirt"
msgstr "Generando falda"
-#: src/libslic3r/PrintObject.cpp:395
+#: src/libslic3r/PrintObject.cpp:422
msgid "Generating support material"
msgstr "Generando material de soporte"
-#: src/libslic3r/SLAPrintSteps.cpp:46 src/libslic3r/SLAPrintSteps.cpp:356
+#: src/libslic3r/SLAPrintSteps.cpp:47 src/libslic3r/SLAPrintSteps.cpp:359
msgid "Generating support points"
msgstr "Generando puntos de soporte"
-#: src/libslic3r/SLAPrintSteps.cpp:47
+#: src/libslic3r/SLAPrintSteps.cpp:48
msgid "Generating support tree"
msgstr "Generando soporte tipo árbol"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2022
+#: src/slic3r/GUI/GCodeViewer.cpp:933
+msgid "Generating toolpaths"
+msgstr "Generando trayectorias"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:1318
+msgid "Generating vertex buffer"
+msgstr "Generando buffer de vértice"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2181
msgid "Generic"
msgstr "Genérico"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
+#: src/slic3r/Utils/PresetUpdater.cpp:600
+msgid "getting config updates"
+msgstr "obteniendo actualizaciones de configuración"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
msgid "Gizmo cut"
msgstr "Corte Gizmo"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:172
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
msgid "Gizmo move"
msgstr "Movimiento Gizmo"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:176
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:198
+msgid "Gizmo move: Press to snap by 1mm"
+msgstr "Herramienta de mover: Pulsa para ajustar en pasos de 1 mm"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
msgid "Gizmo Place face on bed"
msgstr "Gizmo Colocar cara en la base"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:174
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
msgid "Gizmo rotate"
msgstr "Rotación Gizmo"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:173
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:203
+msgid "Gizmo rotate: Press to rotate selected objects around their own center"
+msgstr "Herramienta de rotación: Pulsa para girar la pieza sobre su propio centro"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
msgid "Gizmo scale"
msgstr "Escala Gizmo"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:177
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:201
+msgid "Gizmo scale: Press to activate one direction scaling"
+msgstr "Herramienta de escala: Pulsa para activar una dirección de escalado"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:202
+msgid "Gizmo scale: Press to scale selected objects around their own center"
+msgstr "Herramienta de escala: Pulsa para escalar la pieza seleccionada alrededor de su propio centro"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:199
+msgid "Gizmo scale: Press to snap by 5%"
+msgstr "Herramienta de Escala: pulsa para ajustar un 5%"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:200
+msgid "Gizmo scale: Scale selection to fit print volume"
+msgstr "Herramienta de escala: Escala las piezas seleccionadas para ajustarse al volumen de impresión"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
msgid "Gizmo SLA hollow"
msgstr "Gizmo SLA vaciado"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:178
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:172
msgid "Gizmo SLA support points"
msgstr "Puntos de soporte SLA Gizmo"
-#: src/slic3r/GUI/GLCanvas3D.cpp:2921
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562
+#: src/slic3r/GUI/GLCanvas3D.cpp:3165
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:520
msgid "Gizmo-Move"
msgstr "Gizmo-Mover"
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:489
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:639
msgid "Gizmo-Place on Face"
msgstr "Gizmo-Colocar en Cara"
-#: src/slic3r/GUI/GLCanvas3D.cpp:3001
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:564
+#: src/slic3r/GUI/GLCanvas3D.cpp:3249
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:522
msgid "Gizmo-Rotate"
msgstr "Gizmo-Rotar"
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:563
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:521
msgid "Gizmo-Scale"
msgstr "Gizmo-Escalar"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:201
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:199
msgid "Gizmos"
msgstr "Gizmos"
-#: src/slic3r/GUI/AboutDialog.cpp:259
+#: src/slic3r/GUI/AboutDialog.cpp:284 src/slic3r/GUI/GUI_App.cpp:244
msgid "GNU Affero General Public License, version 3"
msgstr "GNU Affero General Public License, versión 3"
-#: src/slic3r/GUI/ConfigWizard.cpp:980
+#: src/slic3r/GUI/ConfigWizard.cpp:1346
msgid "Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average."
msgstr "Se necesita buena precisión, así que usa un calibre y realiza varias medidas a lo largo del filamento, luego calcula la media."
-#: src/libslic3r/PrintConfig.cpp:844
+#: src/libslic3r/PrintConfig.cpp:882
msgid "Grid"
msgstr "Rejilla"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2454
+#: src/slic3r/GUI/PrintHostDialogs.cpp:57
+msgid "Group"
+msgstr "Agrupar"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2846
msgid "Group manipulation"
msgstr "Manipulación de grupos"
-#: src/slic3r/GUI/Preferences.cpp:133
+#: src/slic3r/GUI/Preferences.cpp:200
msgid "GUI"
msgstr "IU"
-#: src/libslic3r/PrintConfig.cpp:852
+#: src/libslic3r/PrintConfig.cpp:890
msgid "Gyroid"
msgstr "Giroide"
-#: src/slic3r/GUI/Tab.cpp:2937
-msgid "has the following unsaved changes:"
-msgstr "tiene los siguientes cambios no guardados:"
-
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47
msgid "Head diameter"
msgstr "Diámetro de la cabeza"
-#: src/slic3r/GUI/ConfigManipulation.cpp:317
+#: src/libslic3r/PrintConfig.cpp:2772
+msgid "Head penetration"
+msgstr "Penetración de la cabeza"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:322
msgid "Head penetration should not be greater than the head width."
msgstr "La penetración de la cabeza no debaría ser mayor que el ancho de la cabeza."
-#: src/libslic3r/PrintConfig.cpp:869
+#: src/libslic3r/PrintConfig.cpp:910
msgid "Heated build plate temperature for the first layer. Set this to zero to disable bed temperature control commands in the output."
-msgstr "Temperatura de base calefactable para la primera capa. Ajuste esto a cero para deshabilitar los comandos de control de temperatura de la cama en la salida."
+msgstr "Temperatura de base calefactable para la primera capa. Ajusta esto a cero para deshabilitar los comandos de control de temperatura de la cama en la salida."
-#: src/slic3r/GUI/GUI_Preview.cpp:222 src/libslic3r/PrintConfig.cpp:500
+#: src/slic3r/GUI/GUI_Preview.cpp:276 src/libslic3r/PrintConfig.cpp:536
msgid "Height"
msgstr "Altura"
-#: src/libslic3r/GCode/PreviewData.cpp:347
+#: src/slic3r/GUI/GCodeViewer.cpp:2236 src/libslic3r/GCode/PreviewData.cpp:352
msgid "Height (mm)"
msgstr "Altura (mm)"
-#: src/libslic3r/PrintConfig.cpp:1688
+#: src/libslic3r/PrintConfig.cpp:1796
msgid "Height of skirt expressed in layers. Set this to a tall value to use skirt as a shield against drafts."
msgstr "Altura de la falda expresada en capas. Establezca esto en un valor alto para usar la falda como escudo contra corrientes de aire."
-#: src/libslic3r/PrintConfig.cpp:2360
+#: src/libslic3r/PrintConfig.cpp:2503
msgid "Height of the display"
msgstr "Altura de la pantalla"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1500
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1631
msgid "Height range Modifier"
msgstr "Modificador Rango de Alturas"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2507
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2899
msgid "Height ranges"
msgstr "Rango de alturas"
-#: src/libslic3r/PrintConfig.cpp:261
+#: src/libslic3r/PrintConfig.cpp:295
msgid "Heights at which a filament change is to occur."
msgstr "Alturas en las que se producirá un cambio de filamento."
-#: src/slic3r/GUI/ConfigWizard.cpp:433
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:451
+#, possible-c-format
msgid "Hello, welcome to %s! This %s helps you with the initial configuration; just a few settings and you will be ready to print."
msgstr "Hola, bienvenido a %s! Este %s te ayuda con la configuración inicial; sólo unos pocos ajustes y estarás preparado para imprimir."
-#: src/libslic3r/PrintConfig.cpp:3365
+#: src/libslic3r/PrintConfig.cpp:3564
msgid "Help"
msgstr "Ayuda"
-#: src/libslic3r/PrintConfig.cpp:3371
+#: src/libslic3r/PrintConfig.cpp:3570
msgid "Help (FFF options)"
msgstr "Ayuda (opciones FFF)"
-#: src/libslic3r/PrintConfig.cpp:3376
+#: src/libslic3r/PrintConfig.cpp:3575
msgid "Help (SLA options)"
msgstr "Ayuda (opciones SLA)"
@@ -3301,96 +3857,100 @@ msgstr "Ayuda (opciones SLA)"
msgid "Here you can adjust required purging volume (mm³) for any given pair of tools."
msgstr "Aquí puedes ajustar el volumende purga requerida (mm³) para cualquier par de herramientas."
-#: src/libslic3r/PrintConfig.cpp:973
+#: src/slic3r/GUI/DoubleSlider.cpp:1849
+msgid "Hide ruler"
+msgstr "Ocultar regla"
+
+#: src/libslic3r/PrintConfig.cpp:1017
msgid "High extruder current on filament swap"
msgstr "Alta intensidad en el extrusor durante el cambio de filamento"
-#: src/slic3r/GUI/GLCanvas3D.cpp:277
+#: src/slic3r/GUI/GLCanvas3D.cpp:263
msgid "Higher print quality versus higher print speed."
msgstr "Mayor calidad de impresión contra mayor velocidad de impresión."
-#: src/libslic3r/PrintConfig.cpp:427 src/libslic3r/PrintConfig.cpp:853
+#: src/libslic3r/PrintConfig.cpp:463 src/libslic3r/PrintConfig.cpp:891
msgid "Hilbert Curve"
msgstr "Curva de Hilbert"
-#: src/slic3r/GUI/Plater.cpp:1042
+#: src/slic3r/GUI/Plater.cpp:916
msgid "Hold Shift to Slice & Export G-code"
msgstr "Mantén presionada la tecla Shift para laminar y exportar el código G"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46
msgid "Hole depth"
msgstr "Profundidad del orificio"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45
msgid "Hole diameter"
msgstr "Diámetro del orificio"
-#: src/slic3r/GUI/Plater.cpp:2760
-msgid "Hollow"
-msgstr "Vaciado"
-
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:977
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:785
msgid "Hollow and drill"
msgstr "Vaciado y taladrado"
-#: src/libslic3r/PrintConfig.cpp:2910
+#: src/libslic3r/PrintConfig.cpp:3074
msgid "Hollow out a model to have an empty interior"
msgstr "Vaciado de un modelo para tener un interior vacío"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40
msgid "Hollow this object"
msgstr "Vaciar este objeto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:108 src/slic3r/GUI/Tab.cpp:3654
-#: src/slic3r/GUI/Tab.cpp:3655 src/libslic3r/SLA/Hollowing.cpp:46
-#: src/libslic3r/SLA/Hollowing.cpp:58 src/libslic3r/SLA/Hollowing.cpp:67
-#: src/libslic3r/SLA/Hollowing.cpp:76 src/libslic3r/PrintConfig.cpp:2909
-#: src/libslic3r/PrintConfig.cpp:2916 src/libslic3r/PrintConfig.cpp:2926
-#: src/libslic3r/PrintConfig.cpp:2935
+#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:4073
+#: src/slic3r/GUI/Tab.cpp:4074 src/libslic3r/SLA/Hollowing.cpp:45
+#: src/libslic3r/SLA/Hollowing.cpp:57 src/libslic3r/SLA/Hollowing.cpp:66
+#: src/libslic3r/SLA/Hollowing.cpp:75 src/libslic3r/PrintConfig.cpp:3073
+#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090
+#: src/libslic3r/PrintConfig.cpp:3099
msgid "Hollowing"
msgstr "Vaciando el interior"
-#: src/slic3r/GUI/Plater.cpp:2926
-msgid "Hollowing cancelled."
-msgstr "Vaciado cancelado."
-
-#: src/slic3r/GUI/Plater.cpp:2927
-msgid "Hollowing done."
-msgstr "Vaciado acabado."
-
-#: src/slic3r/GUI/Plater.cpp:2929
-msgid "Hollowing failed."
-msgstr "Vaciado fallido."
-
-#: src/libslic3r/PrintConfig.cpp:2937
+#: src/libslic3r/PrintConfig.cpp:3101
msgid "Hollowing is done in two steps: first, an imaginary interior is calculated deeper (offset plus the closing distance) in the object and then it's inflated back to the specified offset. A greater closing distance makes the interior more rounded. At zero, the interior will resemble the exterior the most."
msgstr "El vaciado del interior se hace en dos pasos: primero, se calcula un interior imaginario (un desplazamiento más la distancia de cierre) en la pieza y luego, se hincha hasta alcanzar el desplazamiento especificado. Una distancia de cierre mayor hace que interior sea más redondeado. Si es cero, el interior se parecerá mucho al exterior."
-#: src/libslic3r/SLAPrintSteps.cpp:43
+#: src/libslic3r/SLAPrintSteps.cpp:44
msgid "Hollowing model"
msgstr "Vaciando modelo"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:813
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:624
msgid "Hollowing parameter change"
msgstr "Cambio del parámetro de vaciar el interior"
-#: src/libslic3r/PrintConfig.cpp:850 src/libslic3r/PrintConfig.cpp:2011
+#: src/libslic3r/PrintConfig.cpp:888 src/libslic3r/PrintConfig.cpp:2153
msgid "Honeycomb"
msgstr "Panal de abeja"
-#: src/slic3r/GUI/Tab.cpp:1064
+#: src/slic3r/GUI/Tab.cpp:1386
msgid "Horizontal shells"
msgstr "Carcasas horizontales"
-#: src/libslic3r/PrintConfig.cpp:245
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:253
+msgid "Horizontal Slider"
+msgstr "Control Deslizante Horizontal"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:209
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:213
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:238
+msgid "Horizontal slider - Move active thumb Left"
+msgstr "Control deslizante horizontal - Mover el pulgar activo hacia la Izquierda"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:210
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:214
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:239
+msgid "Horizontal slider - Move active thumb Right"
+msgstr "Control deslizante horizontal - Mover el pulgar activo hacia la Derecha"
+
+#: src/libslic3r/PrintConfig.cpp:279
msgid "Horizontal width of the brim that will be printed around each object on the first layer."
msgstr "Ancho horizontal del borde que se imprimirá alrededor de cada objeto en la primera capa."
-#: src/slic3r/GUI/PrintHostDialogs.cpp:152
+#: src/slic3r/GUI/PrintHostDialogs.cpp:150
msgid "Host"
msgstr "Equipo"
-#: src/libslic3r/PrintConfig.cpp:1332
+#: src/libslic3r/PrintConfig.cpp:1440
msgid "Host Type"
msgstr "Tipo de host"
@@ -3398,195 +3958,275 @@ msgstr "Tipo de host"
msgid "Hostname"
msgstr "Nombre del equipo"
-#: src/libslic3r/PrintConfig.cpp:97
+#: src/libslic3r/PrintConfig.cpp:99
msgid "Hostname, IP or URL"
msgstr "Nombre de equipo, IP o URL"
-#: src/slic3r/GUI/Tab.cpp:139
-msgid ""
-"Hover the cursor over buttons to find more information \n"
-"or click this button."
+#: src/slic3r/GUI/Tab.cpp:210
+msgid "Hover the cursor over buttons to find more information \nor click this button."
msgstr "Sitúa el cursos sobre los botones para más información o haz clic en este botón."
-#: src/libslic3r/PrintConfig.cpp:2812
+#: src/libslic3r/PrintConfig.cpp:2976
msgid "How far should the pad extend around the contained geometry"
msgstr "¿Hasta dónde debe extenderse el pad alrededor de la geometría contenida"
-#: src/libslic3r/PrintConfig.cpp:2901
+#: src/libslic3r/PrintConfig.cpp:3065
msgid "How much should the tiny connectors penetrate into the model body."
msgstr "Cuanto deberían penetrar los conectores pequeños en el modelo del cuerpo."
-#: src/libslic3r/PrintConfig.cpp:2631
+#: src/libslic3r/PrintConfig.cpp:2774
msgid "How much the pinhead has to penetrate the model surface"
msgstr "Cuánto tiene que penetrar la cabeza del pin en la superficie del modelo"
-#: src/libslic3r/PrintConfig.cpp:2755
+#: src/libslic3r/PrintConfig.cpp:2919
msgid "How much the supports should lift up the supported object. If \"Pad around object\" is enabled, this value is ignored."
msgstr "Cuanto deberían los soportes deberían levantar el objeto soportado. Si \"Pad alrededor del objeto\" está activado, este valor será ignorado."
-#: src/libslic3r/PrintConfig.cpp:111
+#: src/libslic3r/PrintConfig.cpp:1209
+msgid "How to apply limits"
+msgstr "Cómo aplicar límites"
+
+#: src/libslic3r/PrintConfig.cpp:1203
+msgid "How to apply the Machine Limits"
+msgstr "Cómo aplicar los Límites Máquina"
+
+#: src/libslic3r/PrintConfig.cpp:163
+msgid "HTTP digest"
+msgstr "HTTP digest"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:358
+#: src/libslic3r/PrintConfig.cpp:113
msgid "HTTPS CA File"
msgstr "Archivo HTTPS CA"
-#: src/slic3r/GUI/Tab.cpp:1713
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:319
msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate."
msgstr "El archivo HTTPS CA es opcional. Sólo se necesita si vas a usar HTTPS con un certificado auto-firmado."
-#: src/slic3r/GUI/Preferences.cpp:222
+#: src/slic3r/GUI/Preferences.cpp:376
msgid "Icon size in a respect to the default size"
msgstr "Tamaño del icono respecto al tamaño original"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:149
+#: src/slic3r/GUI/PrintHostDialogs.cpp:147
msgid "ID"
msgstr "ID"
-#: src/libslic3r/PrintConfig.cpp:1873
+#: src/libslic3r/PrintConfig.cpp:2015
msgid "If checked, supports will be generated automatically based on the overhang threshold value. If unchecked, supports will be generated inside the \"Support Enforcer\" volumes only."
msgstr "Si se marca, los soportes se generarán automáticamente según el valor del umbral de voladizo. Si no se selecciona, los apoyos se generarán solo dentro de los volúmenes \"Forzar soportes\"."
-#: src/slic3r/GUI/ConfigWizard.cpp:773
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:1132
+#, possible-c-format
msgid "If enabled, %s checks for new application versions online. When a new version becomes available, a notification is displayed at the next application startup (never during program usage). This is only a notification mechanisms, no automatic installation is done."
msgstr "Si está activado, %s comprueba si hay nuevas versiones de Slic3r PE en la red. Cuando hay disponible una nueva versión se muestra una notificación al iniciar la aplicación (nunca durante el uso del programa). Esto es sólo un mecanismo de notificación, sin que se realice una instalación automática."
-#: src/slic3r/GUI/ConfigWizard.cpp:783
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:1142
+#, possible-c-format
msgid "If enabled, %s downloads updates of built-in system presets in the background.These updates are downloaded into a separate temporary location.When a new preset version becomes available it is offered at application startup."
msgstr "Si está activado, %s descargará actualizaciones de los ajustes del sistema mientras lo usamos. Estas actualizaciones se descargan a una ubicación temporal. Cuando hay un nuevo ajuste disponible, este se podrá incorporar y usar cuando la aplicación se vuelva a iniciar."
-#: src/libslic3r/PrintConfig.cpp:1852
+#: src/libslic3r/PrintConfig.cpp:1994
msgid "If enabled, all printing extruders will be primed at the front edge of the print bed at the start of the print."
msgstr "Si está habilitado, todos los extrusores de impresión estarán cebados en el borde frontal de la cama de impresión al comienzo de la impresión."
-#: src/slic3r/GUI/ConfigWizard.cpp:805
-msgid ""
-"If enabled, allows the Reload from disk command to automatically find and load the files when invoked.\n"
-"If not enabled, the Reload from disk command will ask to select each file using an open file dialog."
-msgstr ""
-"Si está activado, permite que la orden de Recarga desde el disco encuentre y cargue los archivos al invocarla. \n"
-"Si no está activado, la orden de Recarga desde el disco te pedirá que selecciones cada archivo en un cuadro de abrir archivo."
+#: src/slic3r/GUI/ConfigWizard.cpp:1164
+msgid "If enabled, allows the Reload from disk command to automatically find and load the files when invoked.\nIf not enabled, the Reload from disk command will ask to select each file using an open file dialog."
+msgstr "Si está activado, permite que la orden de Recarga desde el disco encuentre y cargue los archivos al invocarla. \nSi no está activado, la orden de Recarga desde el disco te pedirá que selecciones cada archivo en un cuadro de abrir archivo."
-#: src/slic3r/GUI/Preferences.cpp:74
+#: src/slic3r/GUI/Preferences.cpp:91
msgid "If enabled, allows the Reload from disk command to automatically find and load the files when invoked."
msgstr "Si está activado, permite que la orden de Recarga desde el disco busque y cargue los ficheros cuando se invoque."
-#: src/slic3r/GUI/Preferences.cpp:66
+#: src/slic3r/GUI/Preferences.cpp:238
+msgid "If enabled, changes made using the sequential slider, in preview, apply only to gcode top layer. If disabled, changes made using the sequential slider, in preview, apply to the whole gcode."
+msgstr "Si está activado, los cambios realizados con el control deslizante secuencial, en la vista previa, se aplican solo a la capa superior del código G. Si está desactivado, los cambios realizados con el control deslizante secuencial, en la vista previa, se aplican a todo el código G."
+
+#: src/slic3r/GUI/Preferences.cpp:83
msgid "If enabled, PrusaSlicer will check for the new versions of itself online. When a new version becomes available a notification is displayed at the next application startup (never during program usage). This is only a notification mechanisms, no automatic installation is done."
msgstr "Si está habilitado, PrusaSlicer buscará las nuevas versiones de sí mismo en línea. Cuando una nueva versión esté disponible, se mostrará una notificación en el siguiente inicio de la aplicación (nunca durante el uso del programa). Esto es solo un mecanismo de notificación, no se realiza instalación automática."
-#: src/slic3r/GUI/Preferences.cpp:82
+#: src/slic3r/GUI/Preferences.cpp:270
+msgid "If enabled, renders object using the environment map."
+msgstr "Si está activado, visualiza el objeto usando el mapa del entorno."
+
+#: src/slic3r/GUI/Preferences.cpp:200
+msgid "If enabled, reverses the direction of zoom with mouse wheel"
+msgstr "Si está habilitado, invierte la dirección del zoom con la rueda del mouse"
+
+#: src/slic3r/GUI/Preferences.cpp:93
+msgid "If enabled, sets PrusaSlicer as default application to open .3mf files."
+msgstr "Si está habilitado, establece a PrusaSlicer como aplicación predeterminada para abrir archivos .3mf."
+
+#: src/slic3r/GUI/Preferences.cpp:100
+msgid "If enabled, sets PrusaSlicer as default application to open .stl files."
+msgstr "Si está habilitado, establece a PrusaSlicer como aplicación predeterminada para abrir archivos .stl."
+
+#: src/slic3r/GUI/Preferences.cpp:179
+msgid "If enabled, sets PrusaSlicer G-code Viewer as default application to open .gcode files."
+msgstr "Si está habilitado, establece el Visor de CódigoG de PrusaSlicer como aplicación predeterminada para abrir archivos .gcode."
+
+#: src/slic3r/GUI/Preferences.cpp:99
msgid "If enabled, Slic3r downloads updates of built-in system presets in the background. These updates are downloaded into a separate temporary location. When a new preset version becomes available it is offered at application startup."
msgstr "Si está activado, Slic3r descargará actualizaciones de los ajustes del sistema mientras lo usamos. Estas actualizaciones se descargan a una ubicación temporal. Cuando hay un nuevo ajuste disponible, este se podrá incorporar y usar cuando la aplicación se vuelva a iniciar."
-#: src/slic3r/GUI/Preferences.cpp:106
+#: src/slic3r/GUI/Preferences.cpp:137
msgid "If enabled, the 3D scene will be rendered in Retina resolution. If you are experiencing 3D performance problems, disabling this option may help."
msgstr "Si está activado, la escena 3D se mostrará en resolución Retina. Si tienes problemas de prestaciones 3D, desactivar esta opción te puede ayudar."
-#: src/libslic3r/PrintConfig.cpp:1696
+#: src/slic3r/GUI/Preferences.cpp:215
+msgid "If enabled, the button for the collapse sidebar will be appeared in top right corner of the 3D Scene"
+msgstr "Si está habilitado, el botón de la barra lateral ocultable aparecerá en la esquina superior derecha de la escena 3D"
+
+#: src/libslic3r/PrintConfig.cpp:3698
+msgid "If enabled, the command line arguments are sent to an existing instance of GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides the \"single_instance\" configuration value from application preferences."
+msgstr "Si está habilitado, los argumentos de la línea de comando se envían a una instancia existente de GUI PrusaSlicer, o se activa una ventana de PrusaSlicer existente. Anula el valor de configuración \"single_instance\" de las preferencias de la aplicación."
+
+#: src/slic3r/GUI/Preferences.cpp:294
+msgid "If enabled, the descriptions of configuration parameters in settings tabs wouldn't work as hyperlinks. If disabled, the descriptions of configuration parameters in settings tabs will work as hyperlinks."
+msgstr "Si está habilitado, las descripciones de los parámetros de configuración en las pestañas de configuración no funcionarán como hipervínculos. Si está deshabilitado, las descripciones de los parámetros de configuración en las pestañas de configuración funcionarán como hipervínculos."
+
+#: src/slic3r/GUI/Preferences.cpp:209
+msgid "If enabled, the legacy 3DConnexion devices settings dialog is available by pressing CTRL+M"
+msgstr "Si está habilitado, el cuadro de diálogo de configuración de dispositivos 3DConnexion antiguos está disponible presionando CTRL + M"
+
+#: src/libslic3r/PrintConfig.cpp:1804
msgid "If enabled, the skirt will be as tall as a highest printed object. This is useful to protect an ABS or ASA print from warping and detaching from print bed due to wind draft."
msgstr "Si está habilitado, la falda será tan alta como un objeto impreso más alto. Esto es útil para proteger una impresión ABS o ASA de la deformación y la separación de la cama de impresión debido al viento."
-#: src/libslic3r/PrintConfig.cpp:1858
+#: src/libslic3r/PrintConfig.cpp:2000
msgid "If enabled, the wipe tower will not be printed on layers with no toolchanges. On layers with a toolchange, extruder will travel downward to print the wipe tower. User is responsible for ensuring there is no collision with the print."
msgstr "Si está habilitado, laTorre de Limpieza no se imprimirá en capas sin cambios de herramientas. En capas con cambio de herramienta, el extrusor viajará hacia abajo para imprimir la torre de limpieza. El usuario es responsable de garantizar que no haya colisión con la impresión."
-#: src/slic3r/GUI/Preferences.cpp:128
+#: src/slic3r/GUI/Preferences.cpp:193
msgid "If enabled, use free camera. If not enabled, use constrained camera."
msgstr "Si está activado, usa la cámara libre. Si no está activado, usa la cámara restringida."
-#: src/slic3r/GUI/Preferences.cpp:121
+#: src/slic3r/GUI/Preferences.cpp:186
msgid "If enabled, use perspective camera. If not enabled, use orthographic camera."
msgstr "Si está activado, se usará una cámara en perspectiva. Si no está activo, se usará una cámara ortográfica."
-#: src/slic3r/GUI/Preferences.cpp:145
+#: src/slic3r/GUI/Preferences.cpp:222
msgid "If enabled, you can change size of toolbar icons manually."
msgstr "Si está activado, puedes cambiar el tamaño de la barra de herramientas manualmente."
-#: src/slic3r/GUI/PresetHints.cpp:29
+#: src/slic3r/GUI/PresetHints.cpp:28
msgid "If estimated layer time is below ~%1%s, fan will run at %2%%% and print speed will be reduced so that no less than %3%s are spent on that layer (however, speed will never be reduced below %4%mm/s)."
msgstr "Si el tiempo de capa estimado está por debajo de ~%1%s, el ventilador funcionará en %2%%% y la velocidad de impresión se reducirá de modo que no se gaste menos de %3%s en esa capa (sin embargo, la velocidad nunca se reducirá por debajo de %4%mm/s) ."
-#: src/slic3r/GUI/PresetHints.cpp:36
+#: src/slic3r/GUI/PresetHints.cpp:35
msgid "If estimated layer time is greater, but still below ~%1%s, fan will run at a proportionally decreasing speed between %2%%% and %3%%%."
msgstr "Si el tiempo estimado de la capa es mayor, pero todavía por debajo de ~%1%s, el ventilador funcionará a una velocidad proporcionalmente menor entre %2%%% y %3%%%."
-#: src/libslic3r/PrintConfig.cpp:901
+#: src/libslic3r/PrintConfig.cpp:943
msgid "If expressed as absolute value in mm/s, this speed will be applied to all the print moves of the first layer, regardless of their type. If expressed as a percentage (for example: 40%) it will scale the default speeds."
msgstr "Si se expresa como valor absoluto en mm / s, esta velocidad se aplicará a todos los movimientos de impresión de la primera capa, independientemente de su tipo. Si se expresa como un porcentaje (por ejemplo: 40%), escalará las velocidades predeterminadas."
-#: src/libslic3r/PrintConfig.cpp:573
+#: src/libslic3r/PrintConfig.cpp:609
msgid "If layer print time is estimated below this number of seconds, fan will be enabled and its speed will be calculated by interpolating the minimum and maximum speeds."
msgstr "Si el tiempo de impresión de capa se estima por debajo de este número de segundos, el ventilador se habilitará y su velocidad se calculará al interpolar las velocidades mínima y máxima."
-#: src/libslic3r/PrintConfig.cpp:1706
+#: src/libslic3r/PrintConfig.cpp:1821
msgid "If layer print time is estimated below this number of seconds, print moves speed will be scaled down to extend duration to this value."
msgstr "Si el tiempo de impresión de la capa se estima por debajo de este número de segundos, la velocidad de los movimientos de impresión se reducirá para extender la duración a este valor."
-#: src/libslic3r/PrintConfig.cpp:567
+#: src/libslic3r/PrintConfig.cpp:603
msgid "If this is enabled, fan will never be disabled and will be kept running at least at its minimum speed. Useful for PLA, harmful for ABS."
msgstr "Si esto está habilitado, el ventilador nunca se desactivará y se mantendrá funcionando al menos a su velocidad mínima. Útil para PLA, no recomendado para ABS."
-#: src/slic3r/GUI/Preferences.cpp:49
+#: src/slic3r/GUI/Preferences.cpp:66
msgid "If this is enabled, Slic3r will auto-center objects around the print bed center."
msgstr "Si esto está habilitado, Slic3r centrará automáticamente los objetos alrededor del centro de la base de impresión."
-#: src/slic3r/GUI/Preferences.cpp:57
+#: src/slic3r/GUI/Preferences.cpp:74
msgid "If this is enabled, Slic3r will pre-process objects as soon as they're loaded in order to save time when exporting G-code."
msgstr "Si esto está habilitado, Slic3r preprocesará objetos tan pronto como se carguen para ahorrar tiempo al exportar el código G."
-#: src/slic3r/GUI/Preferences.cpp:41
+#: src/slic3r/GUI/Preferences.cpp:54
msgid "If this is enabled, Slic3r will prompt the last output directory instead of the one containing the input files."
msgstr "Si esto está habilitado, Slic3r solicitará el último directorio de salida en lugar del que contiene los archivos de entrada."
-#: src/libslic3r/PrintConfig.cpp:1562
+#: src/slic3r/GUI/Preferences.cpp:125
+msgid "If this is enabled, when starting PrusaSlicer and another instance of the same PrusaSlicer is already running, that instance will be reactivated instead."
+msgstr "Si está habilitado, al iniciar PrusaSlicer y ya se está ejecutando otra instancia del mismo PrusaSlicer, esa instancia se reactivará en su lugar."
+
+#: src/libslic3r/PrintConfig.cpp:1670
msgid "If you set this to a positive value, Z is quickly raised every time a retraction is triggered. When using multiple extruders, only the setting for the first extruder will be considered."
msgstr "Si establece esto en un valor positivo, Z se levantará rápidamente cada vez que se active una retracción. Cuando se usan múltiples extrusores , solo se considerará la configuración del primer extrusor."
-#: src/libslic3r/PrintConfig.cpp:1571
+#: src/libslic3r/PrintConfig.cpp:1679
msgid "If you set this to a positive value, Z lift will only take place above the specified absolute Z. You can tune this setting for skipping lift on the first layers."
msgstr "Si establece esto en un valor positivo, la elevación de Z solo tendrá lugar por encima de la Z absoluta especificada. Puede ajustar esta configuración para omitir el levantamiento en las primeras capas."
-#: src/libslic3r/PrintConfig.cpp:1580
+#: src/libslic3r/PrintConfig.cpp:1688
msgid "If you set this to a positive value, Z lift will only take place below the specified absolute Z. You can tune this setting for limiting lift to the first layers."
msgstr "Si configura esto en un valor positivo, la elevación Z solo tendrá lugar por debajo de la Z absoluta especificada. Puede ajustar esta configuración para limitar la elevación a las primeras capas."
-#: src/libslic3r/PrintConfig.cpp:1454
+#: src/libslic3r/PrintConfig.cpp:1562
msgid "If you want to process the output G-code through custom scripts, just list their absolute paths here. Separate multiple scripts with a semicolon. Scripts will be passed the absolute path to the G-code file as the first argument, and they can access the Slic3r config settings by reading environment variables."
msgstr "Si desea procesar el código G de salida a través de scripts personalizados, simplemente haga una lista de sus rutas absolutas aquí. Separe los scripts múltiples con un punto y coma. Los scripts se pasarán por la ruta absoluta al archivo de código G como primer argumento, y pueden acceder a la configuración de configuración de Slic3r leyendo las variables de entorno."
-#: src/libslic3r/PrintConfig.cpp:530
+#: src/libslic3r/PrintConfig.cpp:566
msgid "If your firmware doesn't handle the extruder displacement you need the G-code to take it into account. This option lets you specify the displacement of each extruder with respect to the first one. It expects positive coordinates (they will be subtracted from the XY coordinate)."
msgstr "Si su firmware no maneja el desplazamiento del extrusor, necesita el código G para tenerlo en cuenta. Esta opción le permite especificar el desplazamiento de cada extrusora con respecto a la primera. Se esperan coordenadas positivas (se restarán de la coordenada XY)."
-#: src/libslic3r/PrintConfig.cpp:2169
+#: src/libslic3r/PrintConfig.cpp:2312
msgid "If your firmware requires relative E values, check this, otherwise leave it unchecked. Most firmwares use absolute values."
msgstr "Si su firmware requiere valores E relativos, verifique esto, de lo contrario, deje sin marcar. La mayoría de los firmwares usan valores absolutos."
-#: src/libslic3r/PrintConfig.cpp:3485
+#: src/libslic3r/PrintConfig.cpp:1219
+msgid "Ignore"
+msgstr "Ignorar"
+
+#: src/libslic3r/PrintConfig.cpp:3684
msgid "Ignore non-existent config files"
msgstr "Ignorar archivos de configuración inexistentes"
-#: src/slic3r/GUI/MainFrame.cpp:464
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:192
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:173
+msgid "Ignores facets facing away from the camera."
+msgstr "Ignora los lados que no están mirando hacia la cámara."
+
+#: src/slic3r/GUI/MainFrame.cpp:1055
msgid "Import &Config"
msgstr "Importar &Configuración"
-#: src/slic3r/GUI/MainFrame.cpp:471
+#: src/slic3r/GUI/MainFrame.cpp:1062
msgid "Import Config &Bundle"
msgstr "Importar &Conjunto de Ajustes"
-#: src/slic3r/GUI/MainFrame.cpp:467
+#: src/slic3r/GUI/MainFrame.cpp:1058
msgid "Import Config from &project"
msgstr "Importar configuración desde un &proyecto"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:119
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:112
msgid "Import Config from ini/amf/3mf/gcode"
msgstr "Importar Configuración desde ini/amf/3mf/gcode"
-#: src/slic3r/GUI/Plater.cpp:4603
+#: src/slic3r/GUI/Plater.cpp:1419
+msgid "Import config only"
+msgstr "Importar configuración solo"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:39
+msgid "Import file"
+msgstr "Importar archivo"
+
+#: src/slic3r/GUI/Plater.cpp:1418
+msgid "Import geometry only"
+msgstr "Importar geometría solo"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:46
+msgid "Import model and profile"
+msgstr "Importar modelo y perfil"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48
+msgid "Import model only"
+msgstr "Importar modelo únicamente"
+
+#: src/slic3r/GUI/Plater.cpp:4655
msgid "Import Object"
msgstr "Importar Objeto"
-#: src/slic3r/GUI/Plater.cpp:4607
+#: src/slic3r/GUI/Plater.cpp:4659
msgid "Import Objects"
msgstr "Importar Objetos"
@@ -3594,476 +4234,581 @@ msgstr "Importar Objetos"
msgid "Import of the repaired 3mf file failed"
msgstr "La importación del archivo 3mf reparado ha fallado"
-#: src/slic3r/GUI/MainFrame.cpp:460
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47
+msgid "Import profile only"
+msgstr "Importar perfil únicamente"
+
+#: src/slic3r/GUI/MainFrame.cpp:1050
+msgid "Import SL1 archive"
+msgstr "Importar archivo SL1"
+
+#: src/slic3r/GUI/Plater.cpp:1561
+msgid "Import SLA archive"
+msgstr "Importar archivo SLA"
+
+#: src/slic3r/GUI/MainFrame.cpp:1046
+msgid "Import STL (imperial units)"
+msgstr "Importar STL (unidades imperiales)"
+
+#: src/slic3r/GUI/MainFrame.cpp:1042
msgid "Import STL/OBJ/AM&F/3MF"
msgstr "Importar STL/OBJ/AM&F/3MF"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:118
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:111
msgid "Import STL/OBJ/AMF/3MF without config, keep plater"
msgstr "Importar STL/OBJ/AMF/3MF sin configuración, mantener la base"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3422
-#, c-format
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:159
+msgid "Importing canceled."
+msgstr "Importación cancelada."
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:160
+msgid "Importing done."
+msgstr "Importación finalizada."
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135
+msgid "Importing SLA archive"
+msgstr "Importando archivo SLA"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487
+msgid "in"
+msgstr "en"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3885
+#, possible-c-format
msgid "In this mode you can select only other %s Items%s"
msgstr "En este modo, solo puede seleccionar otros %s Items %s"
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:423
+msgid "Inches"
+msgstr "Pulgadas"
+
#: src/slic3r/GUI/UpdateDialogs.cpp:230
msgid "Incompatible bundles:"
msgstr "Grupos incompatibles:"
+#: src/slic3r/GUI/PresetComboBoxes.cpp:241
+msgid "Incompatible presets"
+msgstr "Ajustes preestablecidos imcompatibles"
+
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75
-#, c-format
+#, possible-c-format
msgid "Incompatible with this %s"
msgstr "Incompatible con este %s"
-#: src/slic3r/GUI/Plater.cpp:4685
+#: src/slic3r/GUI/Plater.cpp:4790
msgid "Increase Instances"
msgstr "Aumentar Instancias"
-#: src/slic3r/GUI/GLCanvas3D.cpp:264
+#: src/slic3r/GUI/GLCanvas3D.cpp:251
msgid "Increase/decrease edit area"
msgstr "Incrementar/reducir area edición"
-#: src/slic3r/GUI/Plater.cpp:2922
-msgid "Indexing hollowed object"
-msgstr "Indexando pieza vaciada"
-
#. TRN Description for "UNLOCKED LOCK"
-#: src/slic3r/GUI/Tab.cpp:3258
-msgid ""
-"indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\n"
-"Click the UNLOCKED LOCK icon to reset all settings for current option group to the system (or default) values."
-msgstr ""
-"indica que se modificaron algunas configuraciones y no son iguales a los valores del sistema (o predeterminados) para el grupo de opciones actual.\n"
-"Haz clic en el icono CANDADO DESBLOQUEADO para restablecer todos los ajustes del grupo de opciones actual a los valores del sistema (o predeterminados)."
+#: src/slic3r/GUI/Tab.cpp:3695
+msgid "indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\nClick the UNLOCKED LOCK icon to reset all settings for current option group to the system (or default) values."
+msgstr "indica que se modificaron algunas configuraciones y no son iguales a los valores del sistema (o predeterminados) para el grupo de opciones actual.\nHaz clic en el icono CANDADO DESBLOQUEADO para restablecer todos los ajustes del grupo de opciones actual a los valores del sistema (o predeterminados)."
#. TRN Description for "LOCKED LOCK"
-#: src/slic3r/GUI/Tab.cpp:3254
+#: src/slic3r/GUI/Tab.cpp:3691
msgid "indicates that the settings are the same as the system (or default) values for the current option group"
msgstr "indica que los ajustes son los mismos que los valores del sistema (o por defecto) para el grupo de opciones actual"
#. TRN Description for "BACK ARROW"
-#: src/slic3r/GUI/Tab.cpp:3270
-msgid ""
-"indicates that the settings were changed and are not equal to the last saved preset for the current option group.\n"
-"Click the BACK ARROW icon to reset all settings for the current option group to the last saved preset."
-msgstr ""
-"indica que los ajustes cambiaron y no son iguales que los ajustes grabados la última vez para el grupo de opciones actual.\n"
-"Haz clic en el símbolo de FLECHA ATRÃS para resetear todos los ajustes del grupo de opciones actual a los grabados la vez anterior."
-
-#: src/slic3r/GUI/ConfigManipulation.cpp:211
-#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:96
-#: src/slic3r/GUI/GUI_ObjectList.cpp:614 src/slic3r/GUI/Plater.cpp:527
-#: src/slic3r/GUI/Tab.cpp:1091 src/slic3r/GUI/Tab.cpp:1092
-#: src/libslic3r/PrintConfig.cpp:203 src/libslic3r/PrintConfig.cpp:416
-#: src/libslic3r/PrintConfig.cpp:436 src/libslic3r/PrintConfig.cpp:776
-#: src/libslic3r/PrintConfig.cpp:790 src/libslic3r/PrintConfig.cpp:827
-#: src/libslic3r/PrintConfig.cpp:981 src/libslic3r/PrintConfig.cpp:991
-#: src/libslic3r/PrintConfig.cpp:1009 src/libslic3r/PrintConfig.cpp:1028
-#: src/libslic3r/PrintConfig.cpp:1047 src/libslic3r/PrintConfig.cpp:1728
-#: src/libslic3r/PrintConfig.cpp:1745
+#: src/slic3r/GUI/Tab.cpp:3707
+msgid "indicates that the settings were changed and are not equal to the last saved preset for the current option group.\nClick the BACK ARROW icon to reset all settings for the current option group to the last saved preset."
+msgstr "indica que los ajustes cambiaron y no son iguales que los ajustes grabados la última vez para el grupo de opciones actual.\nHaz clic en el símbolo de FLECHA ATRÃS para resetear todos los ajustes del grupo de opciones actual a los grabados la vez anterior."
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:210
+#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:93
+#: src/slic3r/GUI/GUI_ObjectList.cpp:652 src/slic3r/GUI/Plater.cpp:393
+#: src/slic3r/GUI/Tab.cpp:1413 src/slic3r/GUI/Tab.cpp:1414
+#: src/libslic3r/PrintConfig.cpp:237 src/libslic3r/PrintConfig.cpp:450
+#: src/libslic3r/PrintConfig.cpp:472 src/libslic3r/PrintConfig.cpp:812
+#: src/libslic3r/PrintConfig.cpp:826 src/libslic3r/PrintConfig.cpp:863
+#: src/libslic3r/PrintConfig.cpp:1025 src/libslic3r/PrintConfig.cpp:1035
+#: src/libslic3r/PrintConfig.cpp:1053 src/libslic3r/PrintConfig.cpp:1072
+#: src/libslic3r/PrintConfig.cpp:1091 src/libslic3r/PrintConfig.cpp:1843
+#: src/libslic3r/PrintConfig.cpp:1860
msgid "Infill"
msgstr "Relleno"
-#: src/slic3r/GUI/PresetHints.cpp:174
+#: src/slic3r/GUI/PresetHints.cpp:173
msgid "infill"
msgstr "relleno"
-#: src/libslic3r/PrintConfig.cpp:1021
+#: src/libslic3r/PrintConfig.cpp:1065
msgid "Infill before perimeters"
msgstr "Rellenar antes que los perímetros"
-#: src/libslic3r/PrintConfig.cpp:1001
+#: src/libslic3r/PrintConfig.cpp:1045
msgid "Infill extruder"
msgstr "Extrusor para el relleno"
-#: src/libslic3r/PrintConfig.cpp:1036
+#: src/libslic3r/PrintConfig.cpp:1080
msgid "Infill/perimeters overlap"
msgstr "Superposición de relleno/perímetros"
-#: src/libslic3r/Print.cpp:1584
+#: src/libslic3r/Print.cpp:1610
msgid "Infilling layers"
msgstr "Rellenando capas"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3430
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3505 src/slic3r/GUI/Plater.cpp:141
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3893
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3968 src/slic3r/GUI/Plater.cpp:147
msgid "Info"
msgstr "Info"
-#: src/libslic3r/PrintConfig.cpp:1057
+#: src/slic3r/GUI/GUI_App.cpp:1087 src/slic3r/GUI/Tab.cpp:3435
+msgid "Information"
+msgstr "Información"
+
+#: src/libslic3r/PrintConfig.cpp:1101
msgid "Inherits profile"
msgstr "Hereda el perfil"
-#: src/libslic3r/SLAPrint.cpp:653
+#: src/libslic3r/SLAPrint.cpp:667
msgid "Initial exposition time is out of printer profile bounds."
msgstr "El tiempo de exposición inicial está fuera de los límites del perfil de impresión."
-#: src/libslic3r/PrintConfig.cpp:2564 src/libslic3r/PrintConfig.cpp:2565
+#: src/libslic3r/PrintConfig.cpp:2707 src/libslic3r/PrintConfig.cpp:2708
msgid "Initial exposure time"
msgstr "Tiempo de exposición inicial"
-#: src/libslic3r/PrintConfig.cpp:2482 src/libslic3r/PrintConfig.cpp:2483
+#: src/libslic3r/PrintConfig.cpp:2625 src/libslic3r/PrintConfig.cpp:2626
msgid "Initial layer height"
msgstr "Altura de la capa inicial"
-#: src/slic3r/GUI/Field.cpp:204
+#: src/slic3r/GUI/Field.cpp:269
+#, possible-c-format
+msgid "Input value is out of range\nAre you sure that %s is a correct value and that you want to continue?"
+msgstr "El valor introducido está fuera de rango\n¿Está seguro de que %s es un valor correcto y que deseas continuar?"
+
+#: src/slic3r/GUI/Field.cpp:252 src/slic3r/GUI/Field.cpp:1370
msgid "Input value is out of range"
msgstr "El valor introducido está fuera de rango"
-#: src/slic3r/GUI/GUI_App.cpp:800
+#: src/slic3r/GUI/GUI_App.cpp:1480
msgid "Inspect / activate configuration snapshots"
msgstr "Inspeccionar / activar instantáneas de configuración"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:60
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:216
-#, c-format
+#: src/slic3r/Utils/PresetUpdater.cpp:120
+msgid "install"
+msgstr "instalar"
+
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:62
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:218
+#, possible-c-format
msgid "Instance %d"
msgstr "Instancia %d"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2500
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2892
msgid "Instance manipulation"
msgstr "Manipulación de instancias"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:56
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:58
msgid "Instances"
msgstr "Instancias"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1091
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3781
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1215
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4244
msgid "Instances to Separated Objects"
msgstr "Instancias para Separar Objetos"
-#: src/libslic3r/PrintConfig.cpp:1973
+#: src/libslic3r/PrintConfig.cpp:2115
msgid "Interface layers"
msgstr "Capas de interfaz"
-#: src/libslic3r/PrintConfig.cpp:1957
+#: src/libslic3r/PrintConfig.cpp:2099
msgid "Interface loops"
msgstr "Bucles de interfaz"
-#: src/libslic3r/PrintConfig.cpp:1982
+#: src/libslic3r/PrintConfig.cpp:2124
msgid "Interface pattern spacing"
-msgstr "Espaciado de patrón de interfaz"
+msgstr "Separación de patrón de interfaz"
-#: src/libslic3r/PrintConfig.cpp:1071
+#: src/libslic3r/PrintConfig.cpp:1115
msgid "Interface shells"
msgstr "Carcasas de interfaz"
-#: src/libslic3r/Zipper.cpp:84
+#: src/libslic3r/miniz_extension.cpp:143
msgid "internal error"
msgstr "error interno"
-#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:313
+#: src/slic3r/GUI/GUI_Preview.cpp:304 src/libslic3r/ExtrusionEntity.cpp:317
+#: src/libslic3r/ExtrusionEntity.cpp:342
msgid "Internal infill"
msgstr "Relleno interno"
-#: src/slic3r/GUI/Plater.cpp:3106
+#: src/slic3r/GUI/BedShapeDialog.cpp:145
+msgid "Invalid"
+msgstr "Inválido"
+
+#: src/slic3r/GUI/Plater.cpp:2906 src/slic3r/GUI/Plater.cpp:3583
msgid "Invalid data"
msgstr "Datos inválidos"
-#: src/slic3r/GUI/BedShapeDialog.cpp:494 src/slic3r/GUI/BedShapeDialog.cpp:543
-#: src/slic3r/GUI/BedShapeDialog.cpp:566
+#: src/slic3r/GUI/BedShapeDialog.cpp:570 src/slic3r/GUI/BedShapeDialog.cpp:619
+#: src/slic3r/GUI/BedShapeDialog.cpp:642
msgid "Invalid file format."
msgstr "Formato inválido de archivo."
-#: src/libslic3r/Zipper.cpp:80
+#: src/libslic3r/miniz_extension.cpp:139
msgid "invalid filename"
msgstr "nombre de archivo inválido"
-#: src/slic3r/GUI/ConfigManipulation.cpp:319
+#: src/slic3r/GUI/ConfigManipulation.cpp:324
msgid "Invalid Head penetration"
msgstr "Penetración inválida de la cabeza"
-#: src/libslic3r/Zipper.cpp:48
+#: src/libslic3r/miniz_extension.cpp:107
msgid "invalid header or archive is corrupted"
msgstr "encabezado inválido o archivo está dañado"
-#: src/slic3r/GUI/Field.cpp:195 src/slic3r/GUI/Field.cpp:226
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:376
+#: src/slic3r/GUI/Field.cpp:375
+msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
+msgstr "Formato de entrada inválido. Vector esperado de dimensiones en el siguiente formato: \"%1%\""
+
+#: src/slic3r/GUI/Field.cpp:243 src/slic3r/GUI/Field.cpp:274
+#: src/slic3r/GUI/Field.cpp:1358 src/slic3r/GUI/GUI_ObjectLayers.cpp:413
msgid "Invalid numeric input."
msgstr "Entrada numérica no válida."
-#: src/libslic3r/Zipper.cpp:78
+#: src/libslic3r/miniz_extension.cpp:137
msgid "invalid parameter"
msgstr "parámetro inválido"
-#: src/slic3r/GUI/ConfigManipulation.cpp:332
+#: src/slic3r/GUI/ConfigManipulation.cpp:337
msgid "Invalid pinhead diameter"
msgstr "Diámetro de la cabeza del pin inválido"
+#: src/slic3r/GUI/GUI_ObjectList.cpp:94 src/slic3r/GUI/GUI_ObjectList.cpp:653
+#: src/slic3r/GUI/GUI_Preview.cpp:307 src/slic3r/GUI/Tab.cpp:1420
+#: src/libslic3r/ExtrusionEntity.cpp:320 src/libslic3r/ExtrusionEntity.cpp:348
+#: src/libslic3r/PrintConfig.cpp:1126 src/libslic3r/PrintConfig.cpp:1132
+#: src/libslic3r/PrintConfig.cpp:1146 src/libslic3r/PrintConfig.cpp:1156
+msgid "Ironing"
+msgstr "Alisado"
+
+#: src/libslic3r/PrintConfig.cpp:1131 src/libslic3r/PrintConfig.cpp:1133
+msgid "Ironing Type"
+msgstr "Tipo de alisado"
+
+#: src/slic3r/GUI/GUI_App.cpp:243
+msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community."
+msgstr "está basado en Slic3r de Alessandro Ranellucci y la comunidad RepRap."
+
#. TRN "Slic3r _is licensed under the_ License"
-#: src/slic3r/GUI/AboutDialog.cpp:258
+#: src/slic3r/GUI/AboutDialog.cpp:283 src/slic3r/GUI/GUI_App.cpp:244
msgid "is licensed under the"
msgstr "está licenciado bajo el/los"
-#: src/slic3r/GUI/Tab.cpp:2941
-msgid "is not compatible with print profile"
-msgstr "no es compatible con el perfil de impresión"
-
-#: src/slic3r/GUI/Tab.cpp:2940
-msgid "is not compatible with printer"
-msgstr "no es compatible con esta impresora"
-
-#: src/slic3r/GUI/MainFrame.cpp:658
+#: src/slic3r/GUI/MainFrame.cpp:955 src/slic3r/GUI/MainFrame.cpp:1275
msgid "Iso"
msgstr "Iso"
-#: src/slic3r/GUI/MainFrame.cpp:658
+#: src/slic3r/GUI/MainFrame.cpp:955 src/slic3r/GUI/MainFrame.cpp:1275
msgid "Iso View"
msgstr "Vista Iso"
-#: src/slic3r/GUI/Tab.cpp:964
+#: src/slic3r/GUI/Tab.cpp:1282
msgid "It can't be deleted or modified."
msgstr "No puede ser borrado o modificado."
-#: src/slic3r/GUI/Plater.cpp:3321
+#: src/slic3r/GUI/Plater.cpp:3124
msgid "It is not allowed to change the file to reload"
msgstr "No está permitido cambiar el archivo a recargar"
-#: src/libslic3r/PrintConfig.cpp:974
+#: src/libslic3r/PrintConfig.cpp:1018
msgid "It may be beneficial to increase the extruder motor current during the filament exchange sequence to allow for rapid ramming feed rates and to overcome resistance when loading a filament with an ugly shaped tip."
msgstr "Puede ser beneficioso aumentar la corriente del motor del extrusor durante la secuencia de intercambio de filamentos para permitir velocidades de alimentación de rampa rápidas y superar la resistencia cuando se carga un filamento con una punta de forma fea."
-#: src/slic3r/GUI/GUI_App.cpp:1084 src/slic3r/GUI/Tab.cpp:2958
+#: src/slic3r/GUI/Tab.cpp:3413
+msgid "It's a last preset for this physical printer."
+msgstr "Es un último valor predeterminado para esta impresora."
+
+#: src/slic3r/GUI/GUI_App.cpp:1876 src/slic3r/GUI/Tab.cpp:3187
msgid "It's impossible to print multi-part object(s) with SLA technology."
msgstr "Es imposible imprimir objetos de varias piezas con tecnología SLA."
-#: src/slic3r/GUI/Tab.cpp:2229
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:601
+msgid "It's not possible to delete the last related preset for the printer."
+msgstr "No es posible borrar el último ajuste preestablecido relacionado con la impresora."
+
+#: src/slic3r/GUI/Tab.cpp:2398
msgid "Jerk limits"
msgstr "Límites del jerk"
-#: src/libslic3r/PrintConfig.cpp:1649
+#: src/libslic3r/PrintConfig.cpp:1757
msgid "Jitter"
msgstr "Jitter"
-#: src/slic3r/GUI/DoubleSlider.cpp:957 src/slic3r/GUI/DoubleSlider.cpp:1529
-#: src/slic3r/GUI/DoubleSlider.cpp:1651
+#: src/slic3r/GUI/DoubleSlider.cpp:1077 src/slic3r/GUI/DoubleSlider.cpp:1721
+#: src/slic3r/GUI/DoubleSlider.cpp:1852 src/slic3r/GUI/DoubleSlider.cpp:1856
msgid "Jump to height"
msgstr "Salta a la altura"
-#: src/slic3r/GUI/DoubleSlider.cpp:955
-#, c-format
-msgid "Jump to height %s or Set extruder sequence for the entire print"
-msgstr "Salta a la altura %s o Fija la secuencia del extrusor para toda la impresión"
+#: src/slic3r/GUI/DoubleSlider.cpp:1223
+#, possible-c-format
+msgid "Jump to height %s\nor Set ruler mode"
+msgstr "Salta a la altura %s\no Fija el modo regla"
-#: src/libslic3r/PrintConfig.cpp:566
+#: src/slic3r/GUI/DoubleSlider.cpp:1220
+#, possible-c-format
+msgid "Jump to height %s\nSet ruler mode\nor Set extruder sequence for the entire print"
+msgstr "Salta a la altura %s\nFija el modo regla\no Fija la secuencia del extrusor para toda la impresión"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1071 src/slic3r/GUI/DoubleSlider.cpp:1852
+msgid "Jump to move"
+msgstr "Saltar al movimiento"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:315
+msgid "Just switch to \"%1%\" preset"
+msgstr "Simplemente cambiar al ajuste predeterminado \"%1%\""
+
+#: src/libslic3r/PrintConfig.cpp:602
msgid "Keep fan always on"
msgstr "Mantener el ventilador siempre encendido"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:169
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:171
msgid "Keep lower part"
msgstr "Mantener la parte inferior"
-#: src/slic3r/GUI/GLCanvas3D.cpp:304
+#: src/slic3r/GUI/GLCanvas3D.cpp:290
msgid "Keep min"
msgstr "Mantener mínimo"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:168
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170
msgid "Keep upper part"
msgstr "Mantener la parte superior"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:41 src/slic3r/GUI/MainFrame.cpp:708
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:37
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:39 src/slic3r/GUI/MainFrame.cpp:941
+#: src/slic3r/GUI/MainFrame.cpp:1332
msgid "Keyboard Shortcuts"
msgstr "Atajos de teclado"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:245
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:259
msgid "Keyboard shortcuts"
msgstr "Atajos de teclado"
-#: src/libslic3r/PrintConfig.cpp:2498
+#: src/libslic3r/PrintConfig.cpp:2641
msgid "kg"
msgstr "kg"
-#: src/libslic3r/PrintConfig.cpp:965
+#: src/libslic3r/PrintConfig.cpp:1009
msgid "Label objects"
msgstr "Etiquetar objetos"
-#: src/libslic3r/PrintConfig.cpp:2399
+#: src/libslic3r/PrintConfig.cpp:2542
msgid "Landscape"
msgstr "Paisaje"
-#: src/slic3r/GUI/GUI_App.cpp:629
+#: src/slic3r/GUI/GUI_App.cpp:1295
msgid "Language"
msgstr "Idioma"
-#: src/slic3r/GUI/GUI_App.cpp:885
+#: src/slic3r/GUI/GUI_App.cpp:1605 src/slic3r/GUI/GUI_App.cpp:1614
msgid "Language selection"
msgstr "Selección de idiomas"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2140
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2242
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2307
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2408
msgid "Last instance of an object cannot be deleted."
msgstr "La última instancia de un objeto no puede ser eliminada."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3418
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3881
msgid "Layer"
msgstr "Capa"
-#: src/slic3r/GUI/ConfigManipulation.cpp:49
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1049
+#: src/slic3r/GUI/ConfigManipulation.cpp:48
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1371
#: src/libslic3r/PrintConfig.cpp:71
msgid "Layer height"
msgstr "Altura de la capa"
-#: src/libslic3r/Print.cpp:1427
+#: src/libslic3r/Print.cpp:1453
msgid "Layer height can't be greater than nozzle diameter"
msgstr "La altura de la capa no puede ser mayor que diámetro de la boquilla"
-#: src/slic3r/GUI/Tab.cpp:2362
+#: src/slic3r/GUI/Tab.cpp:2531
msgid "Layer height limits"
msgstr "Límites de altura de la capa"
-#: src/slic3r/GUI/ConfigWizard.cpp:2015
-msgid "Layer height:"
-msgstr "Altura de la capa:"
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2488
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2880
msgid "Layer range Settings to modify"
msgstr "Ajustes del Rango de capas a modificar"
#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:52
-#: src/libslic3r/PrintConfig.cpp:362 src/libslic3r/PrintConfig.cpp:994
-#: src/libslic3r/PrintConfig.cpp:1505 src/libslic3r/PrintConfig.cpp:1690
-#: src/libslic3r/PrintConfig.cpp:1750 src/libslic3r/PrintConfig.cpp:1930
-#: src/libslic3r/PrintConfig.cpp:1976
+#: src/libslic3r/PrintConfig.cpp:396 src/libslic3r/PrintConfig.cpp:1038
+#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:1798
+#: src/libslic3r/PrintConfig.cpp:1865 src/libslic3r/PrintConfig.cpp:2072
+#: src/libslic3r/PrintConfig.cpp:2118
msgid "layers"
msgstr "capas"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3512
-#: src/slic3r/GUI/Tab.cpp:3600
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3928
+#: src/slic3r/GUI/Tab.cpp:4010
msgid "Layers"
msgstr "Capas"
-#: src/slic3r/GUI/Tab.cpp:1048 src/slic3r/GUI/Tab.cpp:3598
+#: src/slic3r/GUI/Tab.cpp:1370 src/slic3r/GUI/Tab.cpp:4008
msgid "Layers and perimeters"
msgstr "Capas y perímetros"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:95
-#: src/slic3r/GUI/GUI_ObjectList.cpp:613 src/libslic3r/PrintConfig.cpp:72
-#: src/libslic3r/PrintConfig.cpp:175 src/libslic3r/PrintConfig.cpp:184
-#: src/libslic3r/PrintConfig.cpp:408 src/libslic3r/PrintConfig.cpp:470
-#: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:890
-#: src/libslic3r/PrintConfig.cpp:1075 src/libslic3r/PrintConfig.cpp:1374
-#: src/libslic3r/PrintConfig.cpp:1441 src/libslic3r/PrintConfig.cpp:1622
-#: src/libslic3r/PrintConfig.cpp:2074 src/libslic3r/PrintConfig.cpp:2133
-#: src/libslic3r/PrintConfig.cpp:2142
+#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:92
+#: src/slic3r/GUI/GUI_ObjectList.cpp:651 src/libslic3r/PrintConfig.cpp:72
+#: src/libslic3r/PrintConfig.cpp:209 src/libslic3r/PrintConfig.cpp:218
+#: src/libslic3r/PrintConfig.cpp:442 src/libslic3r/PrintConfig.cpp:506
+#: src/libslic3r/PrintConfig.cpp:514 src/libslic3r/PrintConfig.cpp:932
+#: src/libslic3r/PrintConfig.cpp:1119 src/libslic3r/PrintConfig.cpp:1482
+#: src/libslic3r/PrintConfig.cpp:1549 src/libslic3r/PrintConfig.cpp:1730
+#: src/libslic3r/PrintConfig.cpp:2217 src/libslic3r/PrintConfig.cpp:2276
+#: src/libslic3r/PrintConfig.cpp:2285
msgid "Layers and Perimeters"
msgstr "Capas y Perímetros"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
-msgid "Layers Slider"
-msgstr "Deslizador de Capas"
-
-#: src/slic3r/GUI/OptionsGroup.cpp:258
+#: src/slic3r/GUI/OptionsGroup.cpp:293
msgctxt "Layers"
msgid "Bottom"
msgstr "Inferior"
-#: src/slic3r/GUI/OptionsGroup.cpp:258
+#: src/slic3r/GUI/OptionsGroup.cpp:293
msgctxt "Layers"
msgid "Top"
msgstr "Superior"
-#: src/slic3r/GUI/MainFrame.cpp:671
+#: src/slic3r/GUI/Preferences.cpp:440
+msgid "Layout Options"
+msgstr "Opciones de diseño"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:48
+msgid "Leaving Paint-on supports"
+msgstr "Saliendo del Pintado de soportes"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:47
+msgid "Leaving Seam painting"
+msgstr "Saliendo del Pintado de costuras"
+
+#: src/slic3r/GUI/MainFrame.cpp:968 src/slic3r/GUI/MainFrame.cpp:1288
msgid "Left"
msgstr "Izquierda"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214
msgid "Left click"
msgstr "Clic izquierdo"
-#: src/slic3r/GUI/GLCanvas3D.cpp:237
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:29
+msgid "Left mouse button"
+msgstr "Botón izquierdo del ratón"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:233
msgid "Left mouse button:"
msgstr "Botón izquierdo del ratón:"
-#: src/slic3r/GUI/MainFrame.cpp:671
+#: src/slic3r/GUI/MainFrame.cpp:968 src/slic3r/GUI/MainFrame.cpp:1288
msgid "Left View"
msgstr "Vista izquierda"
-#: src/slic3r/GUI/GUI_Preview.cpp:257
-msgid "Legend"
-msgstr "Leyenda"
+#: src/slic3r/GUI/GUI_Preview.cpp:1480
+msgid "Legend/Estimated printing time"
+msgstr "Leyenda/Tiempo de impresión estimado"
-#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1551
+#: src/libslic3r/PrintConfig.cpp:1651 src/libslic3r/PrintConfig.cpp:1659
msgid "Length"
msgstr "Largo"
-#: src/libslic3r/PrintConfig.cpp:328
+#: src/libslic3r/PrintConfig.cpp:362
msgid "Length of the cooling tube to limit space for cooling moves inside it."
msgstr "Longitud del tubo de enfriado para limitar el espacio para movimientos de enfriamiento dentro del mismo."
+#: src/libslic3r/PrintConfig.cpp:1068
+msgid "Length of the infill anchor"
+msgstr "Longitud del relleno del anclaje"
+
#. TRN "Slic3r _is licensed under the_ License"
-#: src/slic3r/GUI/AboutDialog.cpp:129
+#: src/slic3r/GUI/AboutDialog.cpp:141
msgid "License agreements of all following programs (libraries) are part of application license agreement"
msgstr "Los acuerdos de licencia de todos los programas (bibliotecas) siguientes forman parte del acuerdo de licencia de la aplicación"
-#: src/libslic3r/PrintConfig.cpp:1561
+#: src/libslic3r/PrintConfig.cpp:1669
msgid "Lift Z"
msgstr "Levantar Z"
-#: src/libslic3r/PrintConfig.cpp:848
+#: src/libslic3r/PrintConfig.cpp:886
msgid "Line"
msgstr "Lineal"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1427
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1558
msgid "Load"
msgstr "Cargar"
-#: src/slic3r/GUI/MainFrame.cpp:460
+#: src/slic3r/GUI/MainFrame.cpp:1042
msgid "Load a model"
msgstr "Cargar un modelo"
-#: src/libslic3r/PrintConfig.cpp:3505
+#: src/slic3r/GUI/MainFrame.cpp:1046
+msgid "Load an model saved with imperial units"
+msgstr "Cargar un modelo guardado con unidades imperiales"
+
+#: src/slic3r/GUI/MainFrame.cpp:1058
+msgid "Load an SL1 archive"
+msgstr "Cargar un archivo SL1"
+
+#: src/libslic3r/PrintConfig.cpp:3710
msgid "Load and store settings at the given directory. This is useful for maintaining different profiles or including configurations from a network storage."
msgstr "Cargar y almacenar configuraciones en el directorio dado. Esto es útil para mantener diferentes perfiles o incluir configuraciones desde un almacenamiento de red."
-#: src/libslic3r/PrintConfig.cpp:3489
+#: src/libslic3r/PrintConfig.cpp:3688
msgid "Load config file"
msgstr "Cargar archivo de configuración"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:120
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:113
msgid "Load Config from ini/amf/3mf/gcode and merge"
msgstr "Carga Configuración desde ini/amf/3mf/gcode y mezcla"
-#: src/slic3r/GUI/MainFrame.cpp:467
+#: src/slic3r/GUI/MainFrame.cpp:1058
msgid "Load configuration from project file"
msgstr "Cargar configuración desde archivo de proyecto"
-#: src/libslic3r/PrintConfig.cpp:3490
+#: src/libslic3r/PrintConfig.cpp:3689
msgid "Load configuration from the specified file. It can be used more than once to load options from multiple files."
msgstr "Cargar la configuración desde el archivo especificado. Se puede usar más de una vez para cargar opciones de varios archivos."
-#: src/slic3r/GUI/MainFrame.cpp:464
+#: src/slic3r/GUI/MainFrame.cpp:1055
msgid "Load exported configuration file"
msgstr "Cargar archivo de configuración exportado"
-#: src/slic3r/GUI/Plater.cpp:1395
+#: src/slic3r/GUI/Plater.cpp:1543 src/slic3r/GUI/Plater.cpp:4976
msgid "Load File"
msgstr "Cargar Archivo"
-#: src/slic3r/GUI/Plater.cpp:1399
+#: src/slic3r/GUI/Plater.cpp:1548 src/slic3r/GUI/Plater.cpp:4981
msgid "Load Files"
msgstr "Cargar Archivos"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1879
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2038
msgid "Load Part"
msgstr "Cargar pieza"
-#: src/slic3r/GUI/MainFrame.cpp:471
+#: src/slic3r/GUI/MainFrame.cpp:1062
msgid "Load presets from a bundle"
msgstr "Cargar preajustes de un paquete"
-#: src/slic3r/GUI/Plater.cpp:4575
+#: src/slic3r/GUI/Plater.cpp:4627
msgid "Load Project"
msgstr "Cargar Proyecto"
-#: src/slic3r/GUI/BedShapeDialog.cpp:102
+#: src/slic3r/GUI/BedShapeDialog.cpp:243
msgid "Load shape from STL..."
msgstr "Cargar forma desde STL..."
-#: src/slic3r/GUI/BedShapeDialog.cpp:182 src/slic3r/GUI/BedShapeDialog.cpp:261
+#: src/slic3r/GUI/BedShapeDialog.cpp:325 src/slic3r/GUI/BedShapeDialog.cpp:405
msgid "Load..."
msgstr "Cargar..."
@@ -4071,19 +4816,27 @@ msgstr "Cargar..."
msgid "loaded"
msgstr "cargado"
-#: src/slic3r/GUI/Plater.cpp:2426
+#: src/slic3r/GUI/Plater.cpp:2388
msgid "Loaded"
msgstr "Cargado"
-#: src/slic3r/GUI/Plater.cpp:2273
+#: src/slic3r/GUI/Plater.cpp:2216
msgid "Loading"
msgstr "Carga"
-#: src/slic3r/GUI/GUI_App.cpp:474
+#: src/slic3r/GUI/GUI_App.cpp:797
+msgid "Loading configuration"
+msgstr "Cargando configuración"
+
+#: src/slic3r/GUI/Plater.cpp:2226
+msgid "Loading file"
+msgstr "Cargando archivo"
+
+#: src/slic3r/GUI/GUI_App.cpp:1125
msgid "Loading of a mode view"
msgstr "Carga de modo de vista"
-#: src/slic3r/GUI/GUI_App.cpp:466
+#: src/slic3r/GUI/GUI_App.cpp:1120
msgid "Loading of current presets"
msgstr "Cargando los preajustes actuales"
@@ -4092,101 +4845,121 @@ msgstr "Cargando los preajustes actuales"
msgid "Loading repaired model"
msgstr "Cargando modelo reparado"
-#: src/libslic3r/PrintConfig.cpp:607
+#: src/libslic3r/PrintConfig.cpp:643
msgid "Loading speed"
msgstr "Velocidad de carga"
-#: src/libslic3r/PrintConfig.cpp:615
+#: src/libslic3r/PrintConfig.cpp:651
msgid "Loading speed at the start"
msgstr "Velocidad de carga al inicio"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:63
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:106
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:69
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:112
msgid "Local coordinates"
msgstr "Coordenadas locales"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48
msgid "Lock supports under new islands"
msgstr "Bloquear soportes bajo nuevas islas"
-#: src/slic3r/GUI/Tab.cpp:3252
+#: src/slic3r/GUI/Tab.cpp:3689
msgid "LOCKED LOCK"
msgstr "CANDADO CERRADO"
-#: src/slic3r/GUI/Tab.cpp:3280
+#: src/slic3r/GUI/Tab.cpp:3717
msgid "LOCKED LOCK icon indicates that the settings are the same as the system (or default) values for the current option group"
msgstr "El icono de CANDADO BLOQUEADO indica que los ajustes son los mismos que los valores del sistema (por defecto) para el grupo de opciones actual"
-#: src/slic3r/GUI/Tab.cpp:3296
+#: src/slic3r/GUI/Tab.cpp:3733
msgid "LOCKED LOCK icon indicates that the value is the same as the system (or default) value."
msgstr "El icono de CANDADO BLOQUEADO indica que el valor es el mismo que el del sistema (por defecto)"
-#: src/libslic3r/PrintConfig.cpp:3508
+#: src/libslic3r/PrintConfig.cpp:3713
msgid "Logging level"
msgstr "Nivel de registro"
-#: src/libslic3r/PrintConfig.cpp:1695
+#: src/libslic3r/PrintConfig.cpp:1810
msgid "Loops (minimum)"
msgstr "Bucles (mínimo)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:206
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
msgid "Lower Layer"
msgstr "Capa inferior"
-#: src/slic3r/GUI/Tab.cpp:2188 src/slic3r/GUI/Tab.cpp:2273
-#: src/libslic3r/PrintConfig.cpp:1129 src/libslic3r/PrintConfig.cpp:1146
-#: src/libslic3r/PrintConfig.cpp:1163 src/libslic3r/PrintConfig.cpp:1179
-#: src/libslic3r/PrintConfig.cpp:1189 src/libslic3r/PrintConfig.cpp:1199
-#: src/libslic3r/PrintConfig.cpp:1209
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+msgid "Lower layer"
+msgstr "Capa inferior"
+
+#: src/slic3r/GUI/Tab.cpp:2346 src/slic3r/GUI/Tab.cpp:2442
+#: src/libslic3r/PrintConfig.cpp:1202 src/libslic3r/PrintConfig.cpp:1237
+#: src/libslic3r/PrintConfig.cpp:1254 src/libslic3r/PrintConfig.cpp:1271
+#: src/libslic3r/PrintConfig.cpp:1287 src/libslic3r/PrintConfig.cpp:1297
+#: src/libslic3r/PrintConfig.cpp:1307 src/libslic3r/PrintConfig.cpp:1317
msgid "Machine limits"
msgstr "Límites de la máquina"
-#: src/slic3r/GUI/Plater.cpp:166
+#: src/slic3r/GUI/Tab.cpp:3667
+msgid "Machine limits are not set, therefore the print time estimate may not be accurate."
+msgstr "Los límites de la máquina no están establecidos, por lo tanto, el tiempo estimado de impresión puede no ser exacto."
+
+#: src/slic3r/GUI/Tab.cpp:3660
+msgid "Machine limits will be emitted to G-code and used to estimate print time."
+msgstr "Los límites de la máquina se emitirán al código G y se utilizarán para calcular el tiempo de impresión."
+
+#: src/slic3r/GUI/Tab.cpp:3663
+msgid "Machine limits will NOT be emitted to G-code, however they will be used to estimate print time, which may therefore not be accurate as the printer may apply a different set of machine limits."
+msgstr "Los límites máquina NO se emitirán al código G, sin embargo, se utilizarán para estimar el tiempo de impresión, que por lo tanto puede no ser exacto ya que la impresora puede aplicar un conjunto diferente de límites de la máquina."
+
+#: src/slic3r/GUI/Plater.cpp:172
msgid "Manifold"
msgstr "Manifold"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56
msgid "Manual editing"
msgstr "Edición manual"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:180
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:214
msgid "Masked SLA file exported to %1%"
msgstr "Archivo SLA enmascarado exportado a %1%"
-#: src/slic3r/GUI/MainFrame.cpp:752
+#: src/slic3r/GUI/MainFrame.cpp:1451
msgid "Mate&rial Settings Tab"
msgstr "Pestaña Ajustes de Mate&rial"
-#: src/slic3r/GUI/Tab.cpp:3478 src/slic3r/GUI/Tab.cpp:3480
+#: src/slic3r/GUI/Tab.cpp:3894 src/slic3r/GUI/Tab.cpp:3896
msgid "Material"
msgstr "Material"
-#: src/slic3r/GUI/Tab.hpp:416
+#: src/slic3r/GUI/Tab.hpp:486
msgid "Material Settings"
msgstr "Configuraciones del material"
-#: src/slic3r/GUI/Plater.cpp:163
+#: src/slic3r/GUI/GLCanvas3D.cpp:4304 src/slic3r/GUI/GLCanvas3D.cpp:4940
+msgid "Material Settings Tab"
+msgstr "Pestaña Ajustes de Material"
+
+#: src/slic3r/GUI/Plater.cpp:169
msgid "Materials"
msgstr "Materiales"
-#: src/libslic3r/PrintConfig.cpp:1217 src/libslic3r/PrintConfig.cpp:1226
+#: src/libslic3r/PrintConfig.cpp:1325 src/libslic3r/PrintConfig.cpp:1334
msgid "Max"
msgstr "Max"
-#: src/libslic3r/PrintConfig.cpp:2734
+#: src/libslic3r/PrintConfig.cpp:2898
msgid "Max bridge length"
msgstr "Distancia máxima de puentes"
-#: src/libslic3r/PrintConfig.cpp:2658
+#: src/libslic3r/PrintConfig.cpp:2812
msgid "Max bridges on a pillar"
msgstr "Puentes maximos en un pilar"
-#: src/libslic3r/PrintConfig.cpp:2822
+#: src/libslic3r/PrintConfig.cpp:2986
msgid "Max merge distance"
msgstr "Distancia máxima de combinación"
-#: src/libslic3r/PrintConfig.cpp:2743
+#: src/libslic3r/PrintConfig.cpp:2907
msgid "Max pillar linking distance"
msgstr "Distancia máxima de enlace del pilar"
@@ -4194,7 +4967,7 @@ msgstr "Distancia máxima de enlace del pilar"
msgid "Max print height"
msgstr "Máxima altura de impresión"
-#: src/libslic3r/PrintConfig.cpp:1237
+#: src/libslic3r/PrintConfig.cpp:1345
msgid "Max print speed"
msgstr "Velocidad máxima de impresión"
@@ -4202,171 +4975,193 @@ msgstr "Velocidad máxima de impresión"
msgid "max PrusaSlicer version"
msgstr "máxima versión PrusaSlicer"
-#: src/libslic3r/PrintConfig.cpp:1268
+#: src/libslic3r/PrintConfig.cpp:1376
msgid "Max volumetric slope negative"
msgstr "Máx. Pendiente volumétrica negativa"
-#: src/libslic3r/PrintConfig.cpp:1257
+#: src/libslic3r/PrintConfig.cpp:1365
msgid "Max volumetric slope positive"
msgstr "Máx. Pendiente volumétrica positiva"
-#: src/libslic3r/PrintConfig.cpp:597 src/libslic3r/PrintConfig.cpp:1247
+#: src/libslic3r/PrintConfig.cpp:633 src/libslic3r/PrintConfig.cpp:1355
msgid "Max volumetric speed"
msgstr "Velocidad volumétrica máxima"
-#: src/libslic3r/PrintConfig.cpp:2268
+#: src/libslic3r/PrintConfig.cpp:2411
msgid "Maximal bridging distance"
msgstr "Distancia máxima de puentes"
-#: src/libslic3r/PrintConfig.cpp:2269
+#: src/libslic3r/PrintConfig.cpp:2412
msgid "Maximal distance between supports on sparse infill sections."
msgstr "Distancia máxima entre soportes en las secciones con relleno ligero."
-#: src/libslic3r/PrintConfig.cpp:1145
+#: src/libslic3r/PrintConfig.cpp:1253
msgid "Maximum acceleration E"
msgstr "Máxima aceleración E"
-#: src/libslic3r/PrintConfig.cpp:1151
+#: src/libslic3r/PrintConfig.cpp:1259
msgid "Maximum acceleration of the E axis"
msgstr "Máxima aceleración en el eje E"
-#: src/libslic3r/PrintConfig.cpp:1148
+#: src/libslic3r/PrintConfig.cpp:1256
msgid "Maximum acceleration of the X axis"
msgstr "Máxima aceleración en el eje X"
-#: src/libslic3r/PrintConfig.cpp:1149
+#: src/libslic3r/PrintConfig.cpp:1257
msgid "Maximum acceleration of the Y axis"
msgstr "Máxima aceleración en el eje Y"
-#: src/libslic3r/PrintConfig.cpp:1150
+#: src/libslic3r/PrintConfig.cpp:1258
msgid "Maximum acceleration of the Z axis"
msgstr "Máxima aceleración en el eje Z"
-#: src/libslic3r/PrintConfig.cpp:1198
+#: src/libslic3r/PrintConfig.cpp:1306
msgid "Maximum acceleration when extruding"
msgstr "Aceleración máxima al extruir"
-#: src/libslic3r/PrintConfig.cpp:1200
+#: src/libslic3r/PrintConfig.cpp:1308
msgid "Maximum acceleration when extruding (M204 S)"
msgstr "Aceleración máxima con extrusión (M204 S)"
-#: src/libslic3r/PrintConfig.cpp:1208
+#: src/libslic3r/PrintConfig.cpp:1316
msgid "Maximum acceleration when retracting"
msgstr "Aceleración máxima al retraer"
-#: src/libslic3r/PrintConfig.cpp:1210
+#: src/libslic3r/PrintConfig.cpp:1318
msgid "Maximum acceleration when retracting (M204 T)"
msgstr "Aceleración máxima al retraer (M204 T)"
-#: src/libslic3r/PrintConfig.cpp:1142
+#: src/libslic3r/PrintConfig.cpp:1250
msgid "Maximum acceleration X"
msgstr "Máxima aceleración X"
-#: src/libslic3r/PrintConfig.cpp:1143
+#: src/libslic3r/PrintConfig.cpp:1251
msgid "Maximum acceleration Y"
msgstr "Máxima aceleración Y"
-#: src/libslic3r/PrintConfig.cpp:1144
+#: src/libslic3r/PrintConfig.cpp:1252
msgid "Maximum acceleration Z"
msgstr "Máxima aceleración Z"
-#: src/slic3r/GUI/Tab.cpp:2222
+#: src/slic3r/GUI/Tab.cpp:2391
msgid "Maximum accelerations"
msgstr "Aceleraciones máximas"
-#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2534
+#: src/libslic3r/PrintConfig.cpp:2676 src/libslic3r/PrintConfig.cpp:2677
msgid "Maximum exposure time"
msgstr "Tiempo de exposición máximo"
-#: src/libslic3r/PrintConfig.cpp:1128
+#: src/libslic3r/PrintConfig.cpp:1236
msgid "Maximum feedrate E"
msgstr "Máximo avance E"
-#: src/libslic3r/PrintConfig.cpp:1134
+#: src/libslic3r/PrintConfig.cpp:1242
msgid "Maximum feedrate of the E axis"
msgstr "Máximo avance del eje E"
-#: src/libslic3r/PrintConfig.cpp:1131
+#: src/libslic3r/PrintConfig.cpp:1239
msgid "Maximum feedrate of the X axis"
msgstr "Máximo avance en el eje X"
-#: src/libslic3r/PrintConfig.cpp:1132
+#: src/libslic3r/PrintConfig.cpp:1240
msgid "Maximum feedrate of the Y axis"
msgstr "Máximo avance del eje Y"
-#: src/libslic3r/PrintConfig.cpp:1133
+#: src/libslic3r/PrintConfig.cpp:1241
msgid "Maximum feedrate of the Z axis"
msgstr "Máximo avance del eje Z"
-#: src/libslic3r/PrintConfig.cpp:1125
+#: src/libslic3r/PrintConfig.cpp:1233
msgid "Maximum feedrate X"
msgstr "Máxima velocidad en X"
-#: src/libslic3r/PrintConfig.cpp:1126
+#: src/libslic3r/PrintConfig.cpp:1234
msgid "Maximum feedrate Y"
msgstr "Máxima velocidad en Y"
-#: src/libslic3r/PrintConfig.cpp:1127
+#: src/libslic3r/PrintConfig.cpp:1235
msgid "Maximum feedrate Z"
msgstr "Máximo avance en Z"
-#: src/slic3r/GUI/Tab.cpp:2217
+#: src/slic3r/GUI/Tab.cpp:2386
msgid "Maximum feedrates"
msgstr "Avance máximo"
-#: src/libslic3r/PrintConfig.cpp:2556 src/libslic3r/PrintConfig.cpp:2557
+#: src/libslic3r/PrintConfig.cpp:2699 src/libslic3r/PrintConfig.cpp:2700
msgid "Maximum initial exposure time"
msgstr "Tiempo de exposición inicial máximo"
-#: src/libslic3r/PrintConfig.cpp:1162
+#: src/libslic3r/PrintConfig.cpp:1270
msgid "Maximum jerk E"
msgstr "Máximo jerk E"
-#: src/libslic3r/PrintConfig.cpp:1168
+#: src/libslic3r/PrintConfig.cpp:1276
msgid "Maximum jerk of the E axis"
msgstr "Maximo jerk del eje E"
-#: src/libslic3r/PrintConfig.cpp:1165
+#: src/libslic3r/PrintConfig.cpp:1273
msgid "Maximum jerk of the X axis"
msgstr "Maximo jerk del eje Y"
-#: src/libslic3r/PrintConfig.cpp:1166
+#: src/libslic3r/PrintConfig.cpp:1274
msgid "Maximum jerk of the Y axis"
msgstr "Maximo jerk del eje Y"
-#: src/libslic3r/PrintConfig.cpp:1167
+#: src/libslic3r/PrintConfig.cpp:1275
msgid "Maximum jerk of the Z axis"
msgstr "Maximo jerk del eje Z"
-#: src/libslic3r/PrintConfig.cpp:1159
+#: src/libslic3r/PrintConfig.cpp:1267
msgid "Maximum jerk X"
msgstr "Máximo jerk X"
-#: src/libslic3r/PrintConfig.cpp:1160
+#: src/libslic3r/PrintConfig.cpp:1268
msgid "Maximum jerk Y"
msgstr "Máximo jerk Y"
-#: src/libslic3r/PrintConfig.cpp:1161
+#: src/libslic3r/PrintConfig.cpp:1269
msgid "Maximum jerk Z"
msgstr "Máximo jerk Z"
-#: src/libslic3r/PrintConfig.cpp:2660
+#: src/libslic3r/PrintConfig.cpp:1095
+msgid "Maximum length of the infill anchor"
+msgstr "Máxima longitud del relleno del anclaje"
+
+#: src/libslic3r/PrintConfig.cpp:2814
msgid "Maximum number of bridges that can be placed on a pillar. Bridges hold support point pinheads and connect to pillars as small branches."
msgstr "Número máximo de puentes que se pueden colocar en un pilar. Los puentes sostienen cabezas de alfiler de puntos de apoyo y se conectan a los pilares como pequeñas ramas."
-#: src/libslic3r/PrintConfig.cpp:598
+#: src/libslic3r/PrintConfig.cpp:634
msgid "Maximum volumetric speed allowed for this filament. Limits the maximum volumetric speed of a print to the minimum of print and filament volumetric speed. Set to zero for no limit."
msgstr "Velocidad volumétrica máxima permitida para este filamento. Limita la velocidad volumétrica máxima de una impresión al mínimo de velocidad volumétrica de impresión y filamento. Establecer en cero para usar sin límite."
-#: src/libslic3r/PrintConfig.cpp:3442
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1868
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1876
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2569 src/libslic3r/PrintConfig.cpp:3641
msgid "Merge"
msgstr "Combinar"
-#: src/libslic3r/PrintConfig.cpp:2683
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2660
+msgid "Merge all parts to the one single object"
+msgstr "Juntar todas las piezas en un único objeto"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1868
+msgid "Merge objects to the one multipart object"
+msgstr "Juntar objeto en un objeto multipieza"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1876
+msgid "Merge objects to the one single object"
+msgstr "Juntar objetos en uno solo objeto"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2576
+msgid "Merged"
+msgstr "Juntar"
+
+#: src/libslic3r/PrintConfig.cpp:2847
msgid "Merging bridges or pillars into another pillars can increase the radius. Zero means no increase, one means full increase."
msgstr "La fusión de puentes o pilares en otros pilares puede aumentar el radio. Cero significa que no hay aumento, uno significa aumento total."
-#: src/libslic3r/SLAPrintSteps.cpp:64
+#: src/libslic3r/SLAPrintSteps.cpp:65
msgid "Merging slices and calculating statistics"
msgstr "Mezclando rebanadas y calculando estadísticas"
@@ -4374,15 +5169,15 @@ msgstr "Mezclando rebanadas y calculando estadísticas"
msgid "Mesh repair failed."
msgstr "Reparación de la malla fallida."
-#: src/slic3r/GUI/DoubleSlider.cpp:1635
+#: src/slic3r/GUI/DoubleSlider.cpp:1831
msgid "Message for pause print on current layer (%1% mm)."
msgstr "Mensaje para pausa de impresión en la capa actual (%1% mm)."
-#: src/libslic3r/PrintConfig.cpp:1280 src/libslic3r/PrintConfig.cpp:1289
+#: src/libslic3r/PrintConfig.cpp:1388 src/libslic3r/PrintConfig.cpp:1397
msgid "Min"
msgstr "Min"
-#: src/libslic3r/PrintConfig.cpp:1298
+#: src/libslic3r/PrintConfig.cpp:1406
msgid "Min print speed"
msgstr "Velocidad de impresión mínima"
@@ -4390,232 +5185,241 @@ msgstr "Velocidad de impresión mínima"
msgid "min PrusaSlicer version"
msgstr "mínima versión PrusaSlicer"
-#: src/libslic3r/PrintConfig.cpp:2772
+#: src/libslic3r/PrintConfig.cpp:2936
msgid "Minimal distance of the support points"
msgstr "Distancia mínima de los puntos de apoyo"
-#: src/libslic3r/PrintConfig.cpp:1306
+#: src/libslic3r/PrintConfig.cpp:1414
msgid "Minimal filament extrusion length"
msgstr "Longitud mínima de filamento extruido"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53
msgid "Minimal points distance"
msgstr "Distancia mínima de puntos"
-#: src/libslic3r/PrintConfig.cpp:667
+#: src/libslic3r/PrintConfig.cpp:703
msgid "Minimal purge on wipe tower"
msgstr "Purga mínima en la torre de limpieza"
-#: src/libslic3r/PrintConfig.cpp:187
+#: src/libslic3r/PrintConfig.cpp:221
msgid "Minimum bottom shell thickness"
msgstr "Espesor mínimo de la tapa inferior"
-#: src/slic3r/GUI/PresetHints.cpp:339
+#: src/slic3r/GUI/PresetHints.cpp:337
msgid "Minimum bottom shell thickness is %1% mm."
msgstr "El espesor mínimo de la carcasa inferior es %1% mm."
-#: src/libslic3r/PrintConfig.cpp:1512
+#: src/libslic3r/PrintConfig.cpp:1620
msgid "Minimum detail resolution, used to simplify the input file for speeding up the slicing job and reducing memory usage. High-resolution models often carry more detail than printers can render. Set to zero to disable any simplification and use full resolution from input."
msgstr "Resolución mínima de detalles, utilizada para simplificar el archivo de entrada para acelerar el trabajo de laminado y reducir el uso de memoria. Los modelos de alta resolución suelen llevar más detalles de los que las impresoras pueden ofrecer. Establézcalo en cero para desactivar cualquier simplificación y usar la resolución completa de la entrada."
-#: src/libslic3r/PrintConfig.cpp:2525 src/libslic3r/PrintConfig.cpp:2526
+#: src/libslic3r/PrintConfig.cpp:2668 src/libslic3r/PrintConfig.cpp:2669
msgid "Minimum exposure time"
msgstr "Tiempo de exposición mínimo"
-#: src/libslic3r/PrintConfig.cpp:1178
+#: src/libslic3r/PrintConfig.cpp:1286
msgid "Minimum feedrate when extruding"
msgstr "Avance mínimo al extruir"
-#: src/libslic3r/PrintConfig.cpp:1180
+#: src/libslic3r/PrintConfig.cpp:1288
msgid "Minimum feedrate when extruding (M205 S)"
msgstr "Avance mínimo al extruir (M205 S)"
-#: src/slic3r/GUI/Tab.cpp:2234
+#: src/slic3r/GUI/Tab.cpp:2403
msgid "Minimum feedrates"
msgstr "Avances míninos"
-#: src/libslic3r/PrintConfig.cpp:2548 src/libslic3r/PrintConfig.cpp:2549
+#: src/libslic3r/PrintConfig.cpp:2691 src/libslic3r/PrintConfig.cpp:2692
msgid "Minimum initial exposure time"
msgstr "Tiempo de exposición inicial mínimo"
-#: src/slic3r/GUI/Tab.cpp:1069
+#: src/slic3r/GUI/Tab.cpp:1391
msgid "Minimum shell thickness"
msgstr "Espesor mínimo de pared"
-#: src/libslic3r/PrintConfig.cpp:1787 src/libslic3r/PrintConfig.cpp:1788
+#: src/libslic3r/PrintConfig.cpp:1902 src/libslic3r/PrintConfig.cpp:1903
msgid "Minimum thickness of a top / bottom shell"
msgstr "Espesor mínimo de una carcasa superior / inferior"
-#: src/libslic3r/PrintConfig.cpp:2146
+#: src/libslic3r/PrintConfig.cpp:2289
msgid "Minimum top shell thickness"
msgstr "Espesor mínimo de la carcasa superior"
-#: src/slic3r/GUI/PresetHints.cpp:320
+#: src/slic3r/GUI/PresetHints.cpp:318
msgid "Minimum top shell thickness is %1% mm."
msgstr "El espesor mínimo de la carcasa superior es %1% mm."
-#: src/libslic3r/PrintConfig.cpp:1522
+#: src/libslic3r/PrintConfig.cpp:1630
msgid "Minimum travel after retraction"
msgstr "Distancia mínima después de la retracción"
-#: src/libslic3r/PrintConfig.cpp:1188
+#: src/libslic3r/PrintConfig.cpp:1296
msgid "Minimum travel feedrate"
msgstr "Avance mínimo de movimiento"
-#: src/libslic3r/PrintConfig.cpp:1190
+#: src/libslic3r/PrintConfig.cpp:1298
msgid "Minimum travel feedrate (M205 T)"
msgstr "Velocidad mínima sin extrusión (M205 T)"
-#: src/libslic3r/PrintConfig.cpp:2917
+#: src/libslic3r/PrintConfig.cpp:3081
msgid "Minimum wall thickness of a hollowed model."
msgstr "Mínimo de espesor de la pared de un modelo vaciado."
-#: src/libslic3r/PrintConfig.cpp:2449
+#: src/libslic3r/PrintConfig.cpp:2592
msgid "Minimum width of features to maintain when doing elephant foot compensation."
msgstr "Ancho mínimo característico para mantener al realizar la compensación de pie de elefante."
-#: src/slic3r/GUI/Plater.cpp:4002
+#: src/slic3r/GUI/Plater.cpp:3922
msgid "Mirror"
msgstr "Reflejar"
-#: src/libslic3r/PrintConfig.cpp:2379
+#: src/libslic3r/PrintConfig.cpp:2522
msgid "Mirror horizontally"
msgstr "Reflejar horizontalmente"
-#: src/slic3r/GUI/GLCanvas3D.cpp:2053
+#: src/slic3r/GUI/GLCanvas3D.cpp:2226
msgid "Mirror Object"
msgstr "Reflejar objeto"
-#: src/slic3r/GUI/Plater.cpp:4002
+#: src/slic3r/GUI/Plater.cpp:3922
msgid "Mirror the selected object"
msgstr "Duplicar el objeto seleccionado"
-#: src/slic3r/GUI/Plater.cpp:3995
+#: src/slic3r/GUI/Plater.cpp:3915
msgid "Mirror the selected object along the X axis"
msgstr "Duplicar el objeto seleccionado a lo largo del eje X"
-#: src/slic3r/GUI/Plater.cpp:3997
+#: src/slic3r/GUI/Plater.cpp:3917
msgid "Mirror the selected object along the Y axis"
msgstr "Duplicar el objeto seleccionado a lo largo del eje Y"
-#: src/slic3r/GUI/Plater.cpp:3999
+#: src/slic3r/GUI/Plater.cpp:3919
msgid "Mirror the selected object along the Z axis"
msgstr "Duplicar el objeto seleccionado a lo largo del eje Z"
-#: src/libslic3r/PrintConfig.cpp:2386
+#: src/libslic3r/PrintConfig.cpp:2529
msgid "Mirror vertically"
msgstr "Reflejar verticalmente"
-#: src/slic3r/Utils/AstroBox.cpp:68 src/slic3r/Utils/OctoPrint.cpp:68
-#, c-format
+#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:68
+#, possible-c-format
msgid "Mismatched type of print host: %s"
msgstr "Tipo de host de impresión no coincidente: %s"
-#: src/libslic3r/ExtrusionEntity.cpp:323
+#: src/libslic3r/ExtrusionEntity.cpp:328 src/libslic3r/ExtrusionEntity.cpp:364
msgid "Mixed"
msgstr "Mezclado"
-#: src/libslic3r/PrintConfig.cpp:2491
+#: src/libslic3r/PrintConfig.cpp:2634
msgid "ml"
msgstr "ml"
-#: src/slic3r/GUI/BedShapeDialog.cpp:92 src/slic3r/GUI/ConfigWizard.cpp:218
-#: src/slic3r/GUI/ConfigWizard.cpp:970 src/slic3r/GUI/ConfigWizard.cpp:984
+#: src/slic3r/GUI/BedShapeDialog.cpp:129 src/slic3r/GUI/ConfigWizard.cpp:236
+#: src/slic3r/GUI/ConfigWizard.cpp:1336 src/slic3r/GUI/ConfigWizard.cpp:1350
#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:87
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:135
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:333
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:94
+#: src/slic3r/GUI/GCodeViewer.cpp:2183 src/slic3r/GUI/GCodeViewer.cpp:2189
+#: src/slic3r/GUI/GCodeViewer.cpp:2197 src/slic3r/GUI/GUI_ObjectLayers.cpp:145
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:96
#: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:75
-#: src/libslic3r/PrintConfig.cpp:82 src/libslic3r/PrintConfig.cpp:91
-#: src/libslic3r/PrintConfig.cpp:122 src/libslic3r/PrintConfig.cpp:188
-#: src/libslic3r/PrintConfig.cpp:246 src/libslic3r/PrintConfig.cpp:321
-#: src/libslic3r/PrintConfig.cpp:329 src/libslic3r/PrintConfig.cpp:379
-#: src/libslic3r/PrintConfig.cpp:505 src/libslic3r/PrintConfig.cpp:516
-#: src/libslic3r/PrintConfig.cpp:534 src/libslic3r/PrintConfig.cpp:712
-#: src/libslic3r/PrintConfig.cpp:1231 src/libslic3r/PrintConfig.cpp:1292
-#: src/libslic3r/PrintConfig.cpp:1310 src/libslic3r/PrintConfig.cpp:1328
-#: src/libslic3r/PrintConfig.cpp:1384 src/libslic3r/PrintConfig.cpp:1394
-#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1524
-#: src/libslic3r/PrintConfig.cpp:1565 src/libslic3r/PrintConfig.cpp:1573
-#: src/libslic3r/PrintConfig.cpp:1583 src/libslic3r/PrintConfig.cpp:1591
-#: src/libslic3r/PrintConfig.cpp:1599 src/libslic3r/PrintConfig.cpp:1682
-#: src/libslic3r/PrintConfig.cpp:1914 src/libslic3r/PrintConfig.cpp:1985
-#: src/libslic3r/PrintConfig.cpp:2019 src/libslic3r/PrintConfig.cpp:2147
-#: src/libslic3r/PrintConfig.cpp:2226 src/libslic3r/PrintConfig.cpp:2233
-#: src/libslic3r/PrintConfig.cpp:2240 src/libslic3r/PrintConfig.cpp:2270
-#: src/libslic3r/PrintConfig.cpp:2280 src/libslic3r/PrintConfig.cpp:2290
-#: src/libslic3r/PrintConfig.cpp:2450 src/libslic3r/PrintConfig.cpp:2484
-#: src/libslic3r/PrintConfig.cpp:2623 src/libslic3r/PrintConfig.cpp:2632
-#: src/libslic3r/PrintConfig.cpp:2641 src/libslic3r/PrintConfig.cpp:2651
-#: src/libslic3r/PrintConfig.cpp:2695 src/libslic3r/PrintConfig.cpp:2705
-#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2737
-#: src/libslic3r/PrintConfig.cpp:2747 src/libslic3r/PrintConfig.cpp:2757
-#: src/libslic3r/PrintConfig.cpp:2775 src/libslic3r/PrintConfig.cpp:2790
-#: src/libslic3r/PrintConfig.cpp:2804 src/libslic3r/PrintConfig.cpp:2815
-#: src/libslic3r/PrintConfig.cpp:2828 src/libslic3r/PrintConfig.cpp:2873
-#: src/libslic3r/PrintConfig.cpp:2883 src/libslic3r/PrintConfig.cpp:2892
-#: src/libslic3r/PrintConfig.cpp:2902 src/libslic3r/PrintConfig.cpp:2918
-#: src/libslic3r/PrintConfig.cpp:2942
+#: src/libslic3r/PrintConfig.cpp:82 src/libslic3r/PrintConfig.cpp:93
+#: src/libslic3r/PrintConfig.cpp:124 src/libslic3r/PrintConfig.cpp:222
+#: src/libslic3r/PrintConfig.cpp:280 src/libslic3r/PrintConfig.cpp:355
+#: src/libslic3r/PrintConfig.cpp:363 src/libslic3r/PrintConfig.cpp:413
+#: src/libslic3r/PrintConfig.cpp:541 src/libslic3r/PrintConfig.cpp:552
+#: src/libslic3r/PrintConfig.cpp:570 src/libslic3r/PrintConfig.cpp:748
+#: src/libslic3r/PrintConfig.cpp:1158 src/libslic3r/PrintConfig.cpp:1339
+#: src/libslic3r/PrintConfig.cpp:1400 src/libslic3r/PrintConfig.cpp:1418
+#: src/libslic3r/PrintConfig.cpp:1436 src/libslic3r/PrintConfig.cpp:1492
+#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1624
+#: src/libslic3r/PrintConfig.cpp:1632 src/libslic3r/PrintConfig.cpp:1673
+#: src/libslic3r/PrintConfig.cpp:1681 src/libslic3r/PrintConfig.cpp:1691
+#: src/libslic3r/PrintConfig.cpp:1699 src/libslic3r/PrintConfig.cpp:1707
+#: src/libslic3r/PrintConfig.cpp:1790 src/libslic3r/PrintConfig.cpp:2056
+#: src/libslic3r/PrintConfig.cpp:2127 src/libslic3r/PrintConfig.cpp:2161
+#: src/libslic3r/PrintConfig.cpp:2290 src/libslic3r/PrintConfig.cpp:2369
+#: src/libslic3r/PrintConfig.cpp:2376 src/libslic3r/PrintConfig.cpp:2383
+#: src/libslic3r/PrintConfig.cpp:2413 src/libslic3r/PrintConfig.cpp:2423
+#: src/libslic3r/PrintConfig.cpp:2433 src/libslic3r/PrintConfig.cpp:2593
+#: src/libslic3r/PrintConfig.cpp:2627 src/libslic3r/PrintConfig.cpp:2766
+#: src/libslic3r/PrintConfig.cpp:2775 src/libslic3r/PrintConfig.cpp:2784
+#: src/libslic3r/PrintConfig.cpp:2794 src/libslic3r/PrintConfig.cpp:2859
+#: src/libslic3r/PrintConfig.cpp:2869 src/libslic3r/PrintConfig.cpp:2881
+#: src/libslic3r/PrintConfig.cpp:2901 src/libslic3r/PrintConfig.cpp:2911
+#: src/libslic3r/PrintConfig.cpp:2921 src/libslic3r/PrintConfig.cpp:2939
+#: src/libslic3r/PrintConfig.cpp:2954 src/libslic3r/PrintConfig.cpp:2968
+#: src/libslic3r/PrintConfig.cpp:2979 src/libslic3r/PrintConfig.cpp:2992
+#: src/libslic3r/PrintConfig.cpp:3037 src/libslic3r/PrintConfig.cpp:3047
+#: src/libslic3r/PrintConfig.cpp:3056 src/libslic3r/PrintConfig.cpp:3066
+#: src/libslic3r/PrintConfig.cpp:3082 src/libslic3r/PrintConfig.cpp:3106
msgid "mm"
msgstr "mm"
-#: src/libslic3r/PrintConfig.cpp:1547 src/libslic3r/PrintConfig.cpp:1556
+#: src/libslic3r/PrintConfig.cpp:1655 src/libslic3r/PrintConfig.cpp:1664
msgid "mm (zero to disable)"
msgstr "mm (cero para deshabilitar)"
-#: src/libslic3r/PrintConfig.cpp:451 src/libslic3r/PrintConfig.cpp:560
-#: src/libslic3r/PrintConfig.cpp:882 src/libslic3r/PrintConfig.cpp:895
-#: src/libslic3r/PrintConfig.cpp:1015 src/libslic3r/PrintConfig.cpp:1041
-#: src/libslic3r/PrintConfig.cpp:1423 src/libslic3r/PrintConfig.cpp:1761
-#: src/libslic3r/PrintConfig.cpp:1883 src/libslic3r/PrintConfig.cpp:1951
-#: src/libslic3r/PrintConfig.cpp:2111
+#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:596
+#: src/libslic3r/PrintConfig.cpp:924 src/libslic3r/PrintConfig.cpp:937
+#: src/libslic3r/PrintConfig.cpp:1059 src/libslic3r/PrintConfig.cpp:1085
+#: src/libslic3r/PrintConfig.cpp:1531 src/libslic3r/PrintConfig.cpp:1876
+#: src/libslic3r/PrintConfig.cpp:2025 src/libslic3r/PrintConfig.cpp:2093
+#: src/libslic3r/PrintConfig.cpp:2254
msgid "mm or %"
msgstr "mm o %"
-#: src/libslic3r/PrintConfig.cpp:237 src/libslic3r/PrintConfig.cpp:609
-#: src/libslic3r/PrintConfig.cpp:617 src/libslic3r/PrintConfig.cpp:626
-#: src/libslic3r/PrintConfig.cpp:634 src/libslic3r/PrintConfig.cpp:661
-#: src/libslic3r/PrintConfig.cpp:680 src/libslic3r/PrintConfig.cpp:922
-#: src/libslic3r/PrintConfig.cpp:1050 src/libslic3r/PrintConfig.cpp:1135
-#: src/libslic3r/PrintConfig.cpp:1169 src/libslic3r/PrintConfig.cpp:1181
-#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:1241
-#: src/libslic3r/PrintConfig.cpp:1300 src/libslic3r/PrintConfig.cpp:1433
-#: src/libslic3r/PrintConfig.cpp:1607 src/libslic3r/PrintConfig.cpp:1616
-#: src/libslic3r/PrintConfig.cpp:2028 src/libslic3r/PrintConfig.cpp:2154
+#: src/libslic3r/PrintConfig.cpp:193
+msgid "mm or % (zero to disable)"
+msgstr "mm or % (cero para deshabilitar)"
+
+#: src/libslic3r/PrintConfig.cpp:271 src/libslic3r/PrintConfig.cpp:645
+#: src/libslic3r/PrintConfig.cpp:653 src/libslic3r/PrintConfig.cpp:662
+#: src/libslic3r/PrintConfig.cpp:670 src/libslic3r/PrintConfig.cpp:697
+#: src/libslic3r/PrintConfig.cpp:716 src/libslic3r/PrintConfig.cpp:966
+#: src/libslic3r/PrintConfig.cpp:1094 src/libslic3r/PrintConfig.cpp:1167
+#: src/libslic3r/PrintConfig.cpp:1243 src/libslic3r/PrintConfig.cpp:1277
+#: src/libslic3r/PrintConfig.cpp:1289 src/libslic3r/PrintConfig.cpp:1299
+#: src/libslic3r/PrintConfig.cpp:1349 src/libslic3r/PrintConfig.cpp:1408
+#: src/libslic3r/PrintConfig.cpp:1541 src/libslic3r/PrintConfig.cpp:1715
+#: src/libslic3r/PrintConfig.cpp:1724 src/libslic3r/PrintConfig.cpp:2170
+#: src/libslic3r/PrintConfig.cpp:2297
msgid "mm/s"
msgstr "mm/s"
-#: src/libslic3r/PrintConfig.cpp:462 src/libslic3r/PrintConfig.cpp:904
-#: src/libslic3r/PrintConfig.cpp:1720 src/libslic3r/PrintConfig.cpp:1772
-#: src/libslic3r/PrintConfig.cpp:1995 src/libslic3r/PrintConfig.cpp:2124
+#: src/libslic3r/PrintConfig.cpp:498 src/libslic3r/PrintConfig.cpp:946
+#: src/libslic3r/PrintConfig.cpp:1835 src/libslic3r/PrintConfig.cpp:1887
+#: src/libslic3r/PrintConfig.cpp:2137 src/libslic3r/PrintConfig.cpp:2267
msgid "mm/s or %"
msgstr "mm/s o %"
-#: src/libslic3r/PrintConfig.cpp:196 src/libslic3r/PrintConfig.cpp:339
-#: src/libslic3r/PrintConfig.cpp:862 src/libslic3r/PrintConfig.cpp:984
-#: src/libslic3r/PrintConfig.cpp:1152 src/libslic3r/PrintConfig.cpp:1201
-#: src/libslic3r/PrintConfig.cpp:1211 src/libslic3r/PrintConfig.cpp:1403
+#: src/libslic3r/PrintConfig.cpp:230 src/libslic3r/PrintConfig.cpp:373
+#: src/libslic3r/PrintConfig.cpp:902 src/libslic3r/PrintConfig.cpp:1028
+#: src/libslic3r/PrintConfig.cpp:1260 src/libslic3r/PrintConfig.cpp:1309
+#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1511
msgid "mm/s²"
msgstr "mm/s²"
-#: src/libslic3r/PrintConfig.cpp:1730
+#: src/libslic3r/PrintConfig.cpp:1845
msgid "mm²"
msgstr "mm²"
-#: src/libslic3r/PrintConfig.cpp:672
+#: src/libslic3r/PrintConfig.cpp:708
msgid "mm³"
msgstr "mm³"
-#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:601
-#: src/libslic3r/PrintConfig.cpp:1250
+#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:637
+#: src/libslic3r/PrintConfig.cpp:1358
msgid "mm³/s"
msgstr "mm³/s"
-#: src/libslic3r/PrintConfig.cpp:1262 src/libslic3r/PrintConfig.cpp:1273
+#: src/libslic3r/PrintConfig.cpp:1370 src/libslic3r/PrintConfig.cpp:1381
msgid "mm³/s²"
msgstr "mm³/s²"
-#: src/slic3r/GUI/GUI_App.cpp:820
+#: src/slic3r/GUI/GUI_App.cpp:1512
msgid "Mode"
msgstr "&Modo"
@@ -4623,7 +5427,7 @@ msgstr "&Modo"
msgid "model"
msgstr "modelo"
-#: src/slic3r/GUI/BedShapeDialog.cpp:251
+#: src/slic3r/GUI/BedShapeDialog.cpp:395
msgid "Model"
msgstr "Modelo"
@@ -4652,151 +5456,192 @@ msgstr "Reparación del modelo terminada"
msgid "Model repaired successfully"
msgstr "Modelo reparado exitosamente"
-#: src/slic3r/GUI/Tab.cpp:979
+#: src/slic3r/GUI/GUI_App.cpp:1506 src/slic3r/GUI/wxExtensions.cpp:675
+msgctxt "Mode"
+msgid "Advanced"
+msgstr "Advanzado"
+
+#: src/slic3r/GUI/Tab.cpp:1241
msgid "Modifications to the current profile will be saved."
msgstr "Se guardarán las modificaciones al perfil actual."
-#: src/slic3r/GUI/Preset.cpp:247
+#: src/slic3r/GUI/GUI_App.cpp:1425
msgid "modified"
msgstr "modificado"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
msgid "Modifier"
msgstr "Modificador"
-#: src/slic3r/GUI/Tab.cpp:1161
+#: src/slic3r/GUI/Tab.cpp:1491
msgid "Modifiers"
msgstr "Modificadores"
-#: src/libslic3r/PrintConfig.cpp:2512
+#: src/libslic3r/PrintConfig.cpp:2655
msgid "money/bottle"
msgstr "dinero/botella"
-#: src/libslic3r/PrintConfig.cpp:762
+#: src/libslic3r/PrintConfig.cpp:798
msgid "money/kg"
msgstr "dinero/kg"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372
+#: src/libslic3r/PrintConfig.cpp:461
+msgid "Monotonic"
+msgstr "Monotónico"
+
+#: src/slic3r/GUI/NotificationManager.cpp:305
+#: src/slic3r/GUI/NotificationManager.cpp:315
+msgid "More"
+msgstr "Más"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219
msgid "Mouse wheel"
msgstr "Rueda del ratón"
-#: src/slic3r/GUI/GLCanvas3D.cpp:261
+#: src/slic3r/GUI/GLCanvas3D.cpp:249
msgid "Mouse wheel:"
msgstr "Rueda del ratón:"
-#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:64
msgid "Move"
msgstr "Mover"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:255
+msgid "Move active slider thumb Left"
+msgstr "Mover el control deslizante activo hacia la Izquierda"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:256
+msgid "Move active slider thumb Right"
+msgstr "Mover el control deslizante activo hacia la Derecha"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:220
+msgid "Move active thumb Down"
+msgstr "Mover el pulgar activo hacia Abajo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:241
+msgid "Move active thumb Left"
+msgstr "Mover el pulgar activo hacia la Izquierda"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:242
+msgid "Move active thumb Right"
+msgstr "Mover el pulgar activo hacia la Derecha"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+msgid "Move active thumb Up"
+msgstr "Mover el pulgar activo hacia Arriba"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219
msgid "Move clipping plane"
msgstr "Mover plano de recorte"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
msgid "Move current slider thumb Down"
-msgstr "Mover el control deslizante actual hacia abajo"
+msgstr "Mover el control deslizante actual hacia Abajo"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:214
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
msgid "Move current slider thumb Up"
-msgstr "Mover el control deslizante actual hacia arriba"
+msgstr "Mover el control deslizante actual hacia Arriba"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1059
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:835
msgid "Move drainage hole"
msgstr "Mover orificio de drenaje"
-#: src/slic3r/GUI/GLCanvas3D.cpp:3505
+#: src/slic3r/GUI/GLCanvas3D.cpp:3810
msgid "Move Object"
msgstr "Mover Objeto"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212
msgid "Move point"
msgstr "Mover punto"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:160
msgid "Move selection 10 mm in negative X direction"
msgstr "Mover la selección 10 mm en dirección X negativa"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:159
msgid "Move selection 10 mm in negative Y direction"
msgstr "Mover la selección 10 mm en dirección Y negativa"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:161
msgid "Move selection 10 mm in positive X direction"
msgstr "Mover la selección 10 mm en dirección X positiva"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:158
msgid "Move selection 10 mm in positive Y direction"
msgstr "Mover la selección 10 mm en dirección Y positiva"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1097
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:955
msgid "Move support point"
msgstr "Mover punto de soporte"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
+#: src/slic3r/GUI/GCodeViewer.cpp:2492
+msgid "Movement"
+msgstr "Movimiento"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
msgid "Movement in camera space"
msgstr "Movimiento en el espacio de la cámara"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:162
msgid "Movement step set to 1 mm"
msgstr "Paso de movimiento configurado a 1 mm"
-#: src/libslic3r/PrintConfig.cpp:2201
+#: src/libslic3r/PrintConfig.cpp:2344
msgid "Multi material printers may need to prime or purge extruders on tool changes. Extrude the excess material into the wipe tower."
msgstr "Las impresoras de varios materiales pueden necesitar cebar o purgar extrusoras en los cambios de herramientas. Extruya el exceso de material en la torre de limpieza."
-#: src/slic3r/GUI/Plater.cpp:2360 src/slic3r/GUI/Plater.cpp:2413
+#: src/slic3r/GUI/Plater.cpp:2322 src/slic3r/GUI/Plater.cpp:2375
msgid "Multi-part object detected"
msgstr "Objeto de piezas múltiples detectado"
#: src/slic3r/GUI/FirmwareDialog.cpp:419 src/slic3r/GUI/FirmwareDialog.cpp:454
-#, c-format
+#, possible-c-format
msgid "Multiple %s devices found. Please only connect one at a time for flashing."
msgstr "Se encontraron múltiples dispositivos %s. Por favor, conecta solo uno a la vez para flashear."
-#: src/slic3r/GUI/Tab.cpp:1179
+#: src/slic3r/GUI/Tab.cpp:1509
msgid "Multiple Extruders"
msgstr "Múltiples Extrusores"
-#: src/slic3r/GUI/Plater.cpp:2410
-msgid ""
-"Multiple objects were loaded for a multi-material printer.\n"
-"Instead of considering them as multiple objects, should I consider\n"
-"these files to represent a single object having multiple parts?"
-msgstr ""
-"Se cargaron varios objetos para una impresora de varios materiales.\n"
-"En lugar de considerarlos como objetos múltiples, ¿debería considerar\n"
-"estos archivos para formar un solo objeto que tiene varias partes?"
+#: src/slic3r/GUI/Plater.cpp:2372
+msgid "Multiple objects were loaded for a multi-material printer.\nInstead of considering them as multiple objects, should I consider\nthese files to represent a single object having multiple parts?"
+msgstr "Se cargaron varios objetos para una impresora de varios materiales.\nEn lugar de considerarlos como objetos múltiples, ¿debería considerar\nestos archivos para formar un solo objeto que tiene varias partes?"
-#: src/libslic3r/PrintConfig.cpp:3439
+#: src/libslic3r/PrintConfig.cpp:3638
msgid "Multiply copies by creating a grid."
msgstr "Multiplicar copias creando una rejilla."
-#: src/libslic3r/PrintConfig.cpp:3434
+#: src/libslic3r/PrintConfig.cpp:3633
msgid "Multiply copies by this factor."
msgstr "Multiplicar las copias por este factor."
-#: src/slic3r/GUI/Field.cpp:150 src/slic3r/GUI/OptionsGroup.cpp:580
+#: src/slic3r/GUI/Field.cpp:198 src/slic3r/GUI/OptionsGroup.cpp:715
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:874
msgid "N/A"
msgstr "N/A"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:270
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153
+#: src/slic3r/GUI/GUI_ObjectList.cpp:284
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:161
msgid "Name"
msgstr "Nombre"
-#: src/libslic3r/PrintConfig.cpp:1488
+#: src/libslic3r/PrintConfig.cpp:114
+msgid "Name of the printer"
+msgstr "Nombre de la impresora"
+
+#: src/libslic3r/PrintConfig.cpp:1596
msgid "Name of the printer variant. For example, the printer variants may be differentiated by a nozzle diameter."
msgstr "Nombre de la variante de impresora. Por ejemplo, las variantes pueden distinguir diferentes diámetros de boquilla."
-#: src/libslic3r/PrintConfig.cpp:1482
+#: src/libslic3r/PrintConfig.cpp:1590
msgid "Name of the printer vendor."
msgstr "Nombre del fabricante de la impresora."
-#: src/libslic3r/PrintConfig.cpp:1058
+#: src/libslic3r/PrintConfig.cpp:1102
msgid "Name of the profile, from which this profile inherits."
msgstr "Nombre del perfil desde que éste hereda."
-#: src/libslic3r/PrintConfig.cpp:1630
+#: src/libslic3r/PrintConfig.cpp:1738
msgid "Nearest"
msgstr "Más cercano"
@@ -4804,16 +5649,32 @@ msgstr "Más cercano"
msgid "Network lookup"
msgstr "Búsqueda en la red"
-#: src/slic3r/GUI/Plater.cpp:2151
+#: src/slic3r/GUI/Preferences.cpp:430
+msgid "New layout, access via settings button in the top menu"
+msgstr "Nuevo diseño, acceso a través del botón de configuración en el menú superior"
+
+#: src/slic3r/GUI/Plater.cpp:2056
msgid "New Project"
msgstr "Nuevo proyecto"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:112
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:105
msgid "New project, clear plater"
msgstr "Nuevo proyecto, limpiar plataforma"
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:609
+msgid "New Value"
+msgstr "Nuevo Valor"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1178
+msgid "New value"
+msgstr "Nuevo valor"
+
+#: src/slic3r/GUI/NotificationManager.hpp:322
+msgid "New version is available."
+msgstr "Una nueva versión está disponible."
+
#: src/slic3r/GUI/UpdateDialogs.cpp:38
-#, c-format
+#, possible-c-format
msgid "New version of %s is available"
msgstr "Nueva versión de %s disponible"
@@ -4821,23 +5682,23 @@ msgstr "Nueva versión de %s disponible"
msgid "New version:"
msgstr "Nueva versión:"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4673
+#: src/slic3r/GUI/GLCanvas3D.cpp:5089
msgid "Next Redo action: %1%"
msgstr "Siguiente acción de Rehacer: %1%"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4641
+#: src/slic3r/GUI/GLCanvas3D.cpp:5051
msgid "Next Undo action: %1%"
msgstr "Siguiente acción de Deshacer: %1%"
-#: src/libslic3r/PrintConfig.cpp:960
+#: src/libslic3r/PrintConfig.cpp:1004
msgid "No extrusion"
msgstr "Sin extrusión"
-#: src/libslic3r/SLAPrintSteps.cpp:453
+#: src/libslic3r/SLAPrintSteps.cpp:451
msgid "No pad can be generated for this model with the current configuration"
msgstr "No se puede generar el pad para este modelo con la configuración actual"
-#: src/slic3r/GUI/MainFrame.cpp:784
+#: src/slic3r/GUI/MainFrame.cpp:1485
msgid "No previously sliced file."
msgstr "Ningún archivo previamente laminado."
@@ -4845,175 +5706,215 @@ msgstr "Ningún archivo previamente laminado."
msgid "NO RAMMING AT ALL"
msgstr "NO EMPUJAR EN ABSOLUTO"
-#: src/libslic3r/PrintConfig.cpp:1857
+#: src/libslic3r/PrintConfig.cpp:1999
msgid "No sparse layers (EXPERIMENTAL)"
msgstr "Sin capas dispersas (EXPERIMENTAL)"
-#: src/libslic3r/PrintConfig.cpp:2774
+#: src/libslic3r/PrintConfig.cpp:2938
msgid "No support points will be placed closer than this threshold."
msgstr "Ningún punto de soporte se colocará más cerca de este umbral."
-#: src/slic3r/GUI/UpdateDialogs.cpp:303
+#: src/slic3r/GUI/UpdateDialogs.cpp:304
msgid "No updates available"
msgstr "No hay actualizaciones disponibles"
-#: src/slic3r/GUI/ConfigWizard.cpp:291 src/slic3r/GUI/ConfigWizard.cpp:574
-#: src/slic3r/GUI/Plater.cpp:499 src/slic3r/GUI/Plater.cpp:639
-#: src/libslic3r/ExtrusionEntity.cpp:309
+#: src/slic3r/GUI/ConfigWizard.cpp:309 src/slic3r/GUI/ConfigWizard.cpp:599
+#: src/slic3r/GUI/Plater.cpp:365 src/slic3r/GUI/Plater.cpp:505
+#: src/libslic3r/ExtrusionEntity.cpp:312
msgid "None"
msgstr "Ninguno"
-#: src/slic3r/GUI/Tab.cpp:2203
+#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2372
msgid "Normal"
msgstr "Normal"
-#: src/slic3r/GUI/Plater.cpp:1286
+#: src/slic3r/GUI/Plater.cpp:1177 src/slic3r/GUI/Plater.cpp:1224
msgid "normal mode"
msgstr "modo normal"
-#: src/libslic3r/Zipper.cpp:46
+#: src/slic3r/GUI/GCodeViewer.cpp:2552
+msgid "Normal mode"
+msgstr "Modo normal"
+
+#: src/libslic3r/miniz_extension.cpp:105
msgid "not a ZIP archive"
msgstr "no es un archivo ZIP"
-#: src/slic3r/GUI/BedShapeDialog.cpp:223 src/slic3r/GUI/BedShapeDialog.cpp:302
+#: src/slic3r/GUI/BedShapeDialog.cpp:366 src/slic3r/GUI/BedShapeDialog.cpp:446
msgid "Not found:"
msgstr "No encontrado:"
-#: src/slic3r/GUI/DoubleSlider.cpp:1019
+#: src/slic3r/GUI/DoubleSlider.cpp:1144
msgid "Note"
msgstr "Nota"
-#: src/slic3r/Utils/AstroBox.cpp:89
+#: src/slic3r/GUI/Tab.cpp:3408
+msgid "Note, that selected preset will be deleted from this/those printer(s) too."
+msgstr "Tenga en cuenta que ese ajuste preestablecido seleccionado también se eliminará de esta/esas impresoras."
+
+#: src/slic3r/GUI/Tab.cpp:3416
+msgid "Note, that this/those printer(s) will be deleted after deleting of the selected preset."
+msgstr "Tenga en cuenta que esta(s) impresora(s) se eliminarán después de eliminar el ajuste preestablecido seleccionado."
+
+#: src/slic3r/GUI/Tab.cpp:2039
+msgid "Note: All parameters from this group are moved to the Physical Printer settings (see changelog).\n\nA new Physical Printer profile is created by clicking on the \"cog\" icon right of the Printer profiles combo box, by selecting the \"Add physical printer\" item in the Printer combo box. The Physical Printer profile editor opens also when clicking on the \"cog\" icon in the Printer settings tab. The Physical Printer profiles are being stored into PrusaSlicer/physical_printer directory."
+msgstr "Nota: Todos los parámetros de este grupo se han desplazado a la configuración de Impresora física (consulte el registro de cambios).\n\nSe crea un nuevo perfil de impresora física haciendo clic en el icono de \"engranaje\" a la derecha del cuadro combinado de perfiles de impresora, seleccionando el elemento \"Agregar impresora física\" en el cuadro combinado de impresora. El editor de perfil de Impresora física también se abre al hacer clic en el icono \"engranaje\" en la pestaña Configuración de impresora. Los perfiles de la impresora física se almacenan en el directorio PrusaSlicer/physical_printer."
+
+#: src/slic3r/Utils/AstroBox.cpp:92
msgid "Note: AstroBox version at least 1.1.0 is required."
msgstr "Aviso: Se necesita la versión 1.1.0 o superior de AstroBox."
-#: src/slic3r/Utils/FlashAir.cpp:73
+#: src/slic3r/Utils/FlashAir.cpp:76
msgid "Note: FlashAir with firmware 2.00.02 or newer and activated upload function is required."
msgstr "Nota: Requiere FlashAir con firmware 2.00.02 o posterior y la función de carga activada."
-#: src/slic3r/Utils/OctoPrint.cpp:89
+#: src/slic3r/Utils/OctoPrint.cpp:91
msgid "Note: OctoPrint version at least 1.1.0 is required."
msgstr "Nota: Se necesita al menos la versión 1.1.0 de OctoPrint."
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1345
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1192
msgid "Note: some shortcuts work in (non)editing mode only."
msgstr "Nota: algunos accesos directos funcionan solo en modo de (no)edición."
-#: src/slic3r/GUI/Tab.cpp:1251 src/slic3r/GUI/Tab.cpp:1252
-#: src/slic3r/GUI/Tab.cpp:1540 src/slic3r/GUI/Tab.cpp:1541
-#: src/slic3r/GUI/Tab.cpp:2012 src/slic3r/GUI/Tab.cpp:2013
-#: src/slic3r/GUI/Tab.cpp:2128 src/slic3r/GUI/Tab.cpp:2129
-#: src/slic3r/GUI/Tab.cpp:3535 src/slic3r/GUI/Tab.cpp:3536
+#: src/slic3r/GUI/SavePresetDialog.cpp:151
+msgid "Note: This preset will be replaced after saving"
+msgstr "Nota: Este ajuste se reemplazará tras guardar"
+
+#: src/slic3r/GUI/Tab.cpp:1581 src/slic3r/GUI/Tab.cpp:1582
+#: src/slic3r/GUI/Tab.cpp:1887 src/slic3r/GUI/Tab.cpp:1888
+#: src/slic3r/GUI/Tab.cpp:2221 src/slic3r/GUI/Tab.cpp:2222
+#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/Tab.cpp:2298
+#: src/slic3r/GUI/Tab.cpp:3951 src/slic3r/GUI/Tab.cpp:3952
msgid "Notes"
msgstr "Notas"
-#: src/slic3r/GUI/ConfigWizard.cpp:1751 src/slic3r/GUI/DoubleSlider.cpp:1905
-#: src/slic3r/GUI/DoubleSlider.cpp:1926 src/slic3r/GUI/GUI.cpp:245
+#: src/slic3r/GUI/ConfigWizard.cpp:2237 src/slic3r/GUI/DoubleSlider.cpp:2124
+#: src/slic3r/GUI/DoubleSlider.cpp:2144 src/slic3r/GUI/GUI.cpp:244
msgid "Notice"
msgstr "Date cuenta"
-#: src/slic3r/GUI/ConfigWizard.cpp:218
+#: src/slic3r/GUI/ConfigWizard.cpp:236
msgid "nozzle"
msgstr "boquilla"
-#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2340
-#: src/libslic3r/PrintConfig.cpp:1326
+#: src/slic3r/GUI/Tab.cpp:1790
+msgid "Nozzle"
+msgstr "Boquilla"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1392
+msgid "Nozzle and Bed Temperatures"
+msgstr "Temperaturas de la Base y la Boquilla"
+
+#: src/slic3r/GUI/Tab.cpp:2104 src/slic3r/GUI/Tab.cpp:2509
+#: src/libslic3r/PrintConfig.cpp:1434
msgid "Nozzle diameter"
msgstr "Diámetro de la boquilla"
-#: src/slic3r/GUI/ConfigWizard.cpp:969
+#: src/slic3r/GUI/ConfigWizard.cpp:1335
msgid "Nozzle Diameter:"
msgstr "Diámetro de la boquilla:"
-#: src/libslic3r/PrintConfig.cpp:650
+#: src/libslic3r/PrintConfig.cpp:2201
+msgid "Nozzle temperature"
+msgstr "Temperatura de la boquilla"
+
+#: src/libslic3r/PrintConfig.cpp:2198
+msgid "Nozzle temperature for layers after the first one. Set this to zero to disable temperature control commands in the output G-code."
+msgstr "Temperatura de la boquilla para las capas después de la primera. Ajusta esto a cero para deshabilitar los comandos de control de temperatura en el código G de salida."
+
+#: src/libslic3r/PrintConfig.cpp:961
+msgid "Nozzle temperature for the first layer. If you want to control temperature manually during print, set this to zero to disable temperature control commands in the output G-code."
+msgstr "Temperatura de la boquilla para la primera capa. Si deseas controlar la temperatura manualmente durante la impresión, configúralo a cero para deshabilitar las órdenes de control de temperatura en el código G de salida."
+
+#: src/libslic3r/PrintConfig.cpp:686
msgid "Number of cooling moves"
msgstr "Número de movimientos de enfriamiento"
-#: src/slic3r/GUI/Tab.cpp:1839
+#: src/slic3r/GUI/Tab.cpp:2073
msgid "Number of extruders of the printer."
msgstr "Número de extrusores de la impresora."
-#: src/libslic3r/PrintConfig.cpp:1975
+#: src/libslic3r/PrintConfig.cpp:2117
msgid "Number of interface layers to insert between the object(s) and support material."
msgstr "Número de capas de interfaz para insertar entre el (los) objeto(s) y el material de soporte."
-#: src/libslic3r/PrintConfig.cpp:1697
+#: src/libslic3r/PrintConfig.cpp:1812
msgid "Number of loops for the skirt. If the Minimum Extrusion Length option is set, the number of loops might be greater than the one configured here. Set this to zero to disable skirt completely."
msgstr "Número de vueltas para la falda Si se establece la opción Longitud Mínima de Extrusión, el número de bucles puede ser mayor que el configurado aquí. Ajuste esto a cero para deshabilitar la falda por completo."
-#: src/libslic3r/PrintConfig.cpp:2365
+#: src/libslic3r/PrintConfig.cpp:2508
msgid "Number of pixels in"
msgstr "Número de píxeles en"
-#: src/libslic3r/PrintConfig.cpp:2367
+#: src/libslic3r/PrintConfig.cpp:2510
msgid "Number of pixels in X"
msgstr "Número de píxeles en X"
-#: src/libslic3r/PrintConfig.cpp:2373
+#: src/libslic3r/PrintConfig.cpp:2516
msgid "Number of pixels in Y"
msgstr "Número de píxeles en Y"
-#: src/libslic3r/PrintConfig.cpp:176
+#: src/libslic3r/PrintConfig.cpp:210
msgid "Number of solid layers to generate on bottom surfaces."
msgstr "Número de capas sólidas para generar en las superficies inferiores."
-#: src/libslic3r/PrintConfig.cpp:1781
+#: src/libslic3r/PrintConfig.cpp:1896
msgid "Number of solid layers to generate on top and bottom surfaces."
msgstr "Número de capas sólidas para generar en las superficies superior e inferior."
-#: src/libslic3r/PrintConfig.cpp:2134
+#: src/libslic3r/PrintConfig.cpp:2277
msgid "Number of solid layers to generate on top surfaces."
msgstr "Número de capas sólidas para generar en las superficies superiores."
-#: src/libslic3r/PrintConfig.cpp:2518
+#: src/libslic3r/PrintConfig.cpp:2661
msgid "Number of the layers needed for the exposure time fade from initial exposure time to the exposure time"
msgstr "El número de capas necesarias para el tiempo de exposición cambie desde el tiempo de exposición inicial hasta el tiempo de exposición"
-#: src/slic3r/GUI/Plater.cpp:241
+#: src/slic3r/GUI/Plater.cpp:247
msgid "Number of tool changes"
msgstr "Número de cambios de herramienta"
-#: src/libslic3r/PrintConfig.cpp:2753
+#: src/slic3r/GUI/Tab.cpp:4127 src/libslic3r/PrintConfig.cpp:2917
msgid "Object elevation"
msgstr "Elevación del objeto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2466
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2858
msgid "Object manipulation"
msgstr "Manipulación de objetos"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:638
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:163 src/libslic3r/GCode.cpp:623
msgid "Object name"
msgstr "Nombre del objeto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3417
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3880
msgid "Object or Instance"
msgstr "Objeto o instancia"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1106
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1230
msgid "Object reordered"
msgstr "Objetos reordenados"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2479
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2871
msgid "Object Settings to modify"
msgstr "Configuraciones de objetos para modificar"
-#: src/slic3r/GUI/Plater.cpp:2529
+#: src/slic3r/GUI/Plater.cpp:2491
msgid "Object too large?"
msgstr "Objeto demasiado grande?"
-#: src/libslic3r/PrintConfig.cpp:2262
+#: src/libslic3r/PrintConfig.cpp:2405
msgid "Object will be used to purge the nozzle after a toolchange to save material that would otherwise end up in the wipe tower and decrease print time. Colours of the objects will be mixed as a result."
msgstr "El objeto se utilizará para purgar el nozzle después de un cambio de herramienta para guardar el material que de lo contrario terminaría en la torre de limpieza y disminuir el tiempo de impresión. Los colores de los objetos se mezclarán como resultado."
-#: src/slic3r/GUI/Plater.cpp:1194
+#: src/slic3r/GUI/Plater.cpp:1103
msgid "object(s)"
msgstr "objeto(s)"
-#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245
+#: src/slic3r/GUI/Plater.cpp:1143 src/slic3r/GUI/Plater.cpp:1160
msgid "objects"
msgstr "objetos"
-#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:855
+#: src/libslic3r/PrintConfig.cpp:465 src/libslic3r/PrintConfig.cpp:893
msgid "Octagram Spiral"
msgstr "Octagram Spiral"
@@ -5021,64 +5922,113 @@ msgstr "Octagram Spiral"
msgid "OctoPrint version"
msgstr "Versión de OctoPrint"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3425
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3888
msgid "of a current Object"
msgstr "del Objeto actual"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42
msgid "Offset"
msgstr "Desplazamiento"
-#: src/slic3r/GUI/Tab.cpp:1755
-#, c-format
+#: src/slic3r/GUI/Preferences.cpp:422
+msgid "Old regular layout with the tab bar"
+msgstr "Diseño regular antiguo con la barra de pestañas"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:608
+msgid "Old Value"
+msgstr "Valor Antiguo"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1177
+msgid "Old value"
+msgstr "Valor antiguo"
+
+#: src/slic3r/GUI/Preferences.cpp:123
+msgid "On OSX there is always only one instance of app running by default. However it is allowed to run multiple instances of same app from the command line. In such case this settings will allow only one instance."
+msgstr "En OSX, siempre hay una sola instancia de aplicación que se ejecuta de forma predeterminada. Sin embargo, está permitido ejecutar varias instancias de la misma aplicación desde la línea de comandos. En tal caso, esta configuración permitirá solo una instancia."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:359
+#, possible-c-format
msgid "On this system, %s uses HTTPS certificates from the system Certificate Store or Keychain."
msgstr "En este sistema,%s usa certificados HTTPS del almacén de certificados o llavero."
-#: src/slic3r/GUI/DoubleSlider.cpp:950
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
+msgid "On/Off one layer mode of the vertical slider"
+msgstr "Activar/Desactivar el modo de una capa del control deslizante vertical"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1064
msgid "One layer mode"
msgstr "Modo de capa única"
-#: src/libslic3r/Print.cpp:1365
+#: src/libslic3r/Print.cpp:1391
msgid "One or more object were assigned an extruder that the printer does not have."
msgstr "Uno o más objetos fueron asignados a un extrusor no existente."
-#: src/libslic3r/PrintConfig.cpp:1903 src/libslic3r/PrintConfig.cpp:2676
+#: src/slic3r/GUI/GUI_App.cpp:1784
+msgid "Ongoing uploads"
+msgstr "Cargas en curso"
+
+#: src/libslic3r/Print.cpp:1269
+msgid "Only a single object may be printed at a time in Spiral Vase mode. Either remove all but the last object, or enable sequential mode by \"complete_objects\"."
+msgstr "Solo se puede imprimir un objeto a la vez en el modo Vaso en espiral. Elimina todos menos el último objeto o habilita el modo secuencial en \"complete_objects\"."
+
+#: src/libslic3r/PrintConfig.cpp:2045 src/libslic3r/PrintConfig.cpp:2840
msgid "Only create support if it lies on a build plate. Don't create support on a print."
msgstr "Solo crear soportes si está en contacto con la plataforma. No crea soporte en la impresión."
-#: src/libslic3r/PrintConfig.cpp:1027
+#: src/libslic3r/PrintConfig.cpp:1071
msgid "Only infill where needed"
msgstr "Solo rellenar cuando sea necesario"
-#: src/slic3r/GUI/Tab.cpp:2373
+#: src/slic3r/GUI/Tab.cpp:2542
msgid "Only lift Z"
msgstr "Solo levantar Z"
-#: src/libslic3r/PrintConfig.cpp:1570
+#: src/libslic3r/PrintConfig.cpp:1678
msgid "Only lift Z above"
msgstr "Solo levantar Z mayor que"
-#: src/libslic3r/PrintConfig.cpp:1579
+#: src/libslic3r/PrintConfig.cpp:1687
msgid "Only lift Z below"
msgstr "Solo levantar Z menor que"
-#: src/libslic3r/PrintConfig.cpp:1348
+#: src/libslic3r/PrintConfig.cpp:1456
msgid "Only retract when crossing perimeters"
msgstr "Solo retraer al cruzar perímetros"
-#: src/slic3r/GUI/Tab.cpp:1187
+#: src/slic3r/GUI/ConfigWizard.cpp:714
+msgid "Only the following installed printers are compatible with the selected filament:"
+msgstr "Solo las siguientes impresoras instaladas son compatibles con el filamento seleccionado:"
+
+#: src/slic3r/GUI/Tab.cpp:1517
msgid "Ooze prevention"
msgstr "Prevención de goteo"
-#: src/libslic3r/Print.cpp:1266
+#: src/libslic3r/Print.cpp:1292
msgid "Ooze prevention is currently not supported with the wipe tower enabled."
msgstr "La prevención de goteo actualmente no es compatible con la torre de limpieza activa."
-#: src/slic3r/GUI/MainFrame.cpp:408
+#: src/slic3r/GUI/MainFrame.cpp:1398
+msgid "Open &PrusaSlicer"
+msgstr "Abrir &PrusaSlicer"
+
+#: src/slic3r/GUI/MainFrame.cpp:1391
+msgid "Open a G-code file"
+msgstr "Abrir un archivo código G"
+
+#: src/slic3r/GUI/MainFrame.cpp:63 src/slic3r/GUI/MainFrame.cpp:77
+#: src/slic3r/GUI/MainFrame.cpp:1262
+msgid "Open a new PrusaSlicer instance"
+msgstr "Abrir instancia nueva de PrusaSlicer"
+
+#: src/slic3r/GUI/MainFrame.cpp:989
msgid "Open a project file"
msgstr "Abrir un archivo de proyecto"
-#: src/slic3r/GUI/Tab.cpp:1729
+#: src/slic3r/GUI/Plater.cpp:1417
+msgid "Open as project"
+msgstr "Abrir como proyecto"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:330
msgid "Open CA certificate file"
msgstr "Abrir archivo de certificado CA"
@@ -5091,116 +6041,150 @@ msgstr "Abrir la página del registro de cambios"
msgid "Open download page"
msgstr "Abrir página de descarga"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:113
+#: src/slic3r/GUI/NotificationManager.cpp:742
+msgid "Open Folder."
+msgstr "Abrir carpeta."
+
+#: src/slic3r/Utils/Process.cpp:151
+msgid "Open G-code file:"
+msgstr "Abrir archivo código G:"
+
+#: src/slic3r/GUI/MainFrame.cpp:66 src/slic3r/GUI/MainFrame.cpp:1141
+msgid "Open G-code viewer"
+msgstr "Abrir visor código G"
+
+#: src/slic3r/GUI/MainFrame.cpp:79
+msgid "Open new G-code viewer"
+msgstr "Abrir visor código G nuevo"
+
+#: src/slic3r/GUI/MainFrame.cpp:63 src/slic3r/GUI/MainFrame.cpp:1262
+msgid "Open new instance"
+msgstr "Abrir instancia nueva"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:106
msgid "Open project STL/OBJ/AMF/3MF with config, clear plater"
msgstr "Abrir proyecto STL/OBJ/AMF/3MF con configuración, limpiar plataforma"
-#: src/slic3r/GUI/MainFrame.cpp:693
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:77 src/slic3r/GUI/MainFrame.cpp:1398
+msgid "Open PrusaSlicer"
+msgstr "Abrir PrusaSlicer"
+
+#: src/slic3r/GUI/MainFrame.cpp:918 src/slic3r/GUI/MainFrame.cpp:1317
+#, possible-c-format
msgid "Open the %s website in your browser"
msgstr "Abrir el sitio web de %s en su navegador"
-#: src/slic3r/GUI/MainFrame.cpp:684
+#: src/slic3r/GUI/MainFrame.cpp:909 src/slic3r/GUI/MainFrame.cpp:1308
msgid "Open the Prusa3D drivers download page in your browser"
msgstr "Abrir la página de descarga de los controladores Prusa3D en su navegador"
-#: src/slic3r/GUI/MainFrame.cpp:686
+#: src/slic3r/GUI/MainFrame.cpp:911 src/slic3r/GUI/MainFrame.cpp:1310
msgid "Open the software releases page in your browser"
msgstr "Abre la página de lanzamientos de software en tu navegador"
-#: src/slic3r/GUI/Plater.cpp:4040
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:220 src/slic3r/GUI/Plater.cpp:3961
msgid "Optimize orientation"
msgstr "Optimizar la orientación"
-#: src/slic3r/GUI/Plater.cpp:2767
+#: src/slic3r/GUI/Plater.cpp:1555
msgid "Optimize Rotation"
msgstr "Optimizar Rotación"
-#: src/slic3r/GUI/Plater.cpp:4040
+#: src/slic3r/GUI/Plater.cpp:3962
msgid "Optimize the rotation of the object for better print results."
msgstr "Optimizar la rotación del objeto para obtener mejores resultados de impresión."
-#: src/libslic3r/PrintConfig.cpp:137
+#: src/libslic3r/PrintConfig.cpp:170
msgid "Optimize travel moves in order to minimize the crossing of perimeters. This is mostly useful with Bowden extruders which suffer from oozing. This feature slows down both the print and the G-code generation."
msgstr "Optimiza los movimientos de desplazamiento para minimizar el cruce de perímetros. Esto es principalmente útil con extrusores Bowden que sufren goteo. Esta característica ralentiza tanto la impresión como la generación de código G."
-#: src/slic3r/GUI/Tab.cpp:1131
+#: src/slic3r/GUI/GCodeViewer.cpp:2525 src/slic3r/GUI/GUI_Preview.cpp:320
+#: src/slic3r/GUI/GUI_Preview.cpp:333
+msgid "Options"
+msgstr "Opciones"
+
+#: src/slic3r/GUI/Tab.cpp:1460
msgid "Options for support material and raft"
msgstr "Opciones de material de soporte y balsa"
-#: src/slic3r/GUI/DoubleSlider.cpp:989
+#: src/slic3r/GUI/Mouse3DController.cpp:315
+msgid "Options:"
+msgstr "Opciones:"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1112
msgid "or press \"+\" key"
msgstr "o presiona la tecla \"+\""
-#: src/slic3r/GUI/Plater.cpp:2892
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:74
msgid "Orientation found."
msgstr "Orientación encontrada."
-#: src/slic3r/GUI/Plater.cpp:2891
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:73
msgid "Orientation search canceled."
msgstr "Búsqueda de orientación cancelada."
-#: src/slic3r/GUI/BedShapeDialog.cpp:84
+#: src/slic3r/GUI/BedShapeDialog.cpp:94
msgid "Origin"
msgstr "Origen"
-#: src/slic3r/GUI/Tab.cpp:1227
+#: src/slic3r/GUI/Tab.cpp:1557
msgid "Other"
msgstr "Otro"
-#: src/libslic3r/PrintConfig.cpp:144 src/libslic3r/PrintConfig.cpp:2064
+#: src/libslic3r/PrintConfig.cpp:177 src/libslic3r/PrintConfig.cpp:2206
msgid "Other layers"
msgstr "Otras capas"
-#: src/slic3r/GUI/ConfigWizard.cpp:856
+#: src/slic3r/GUI/ConfigWizard.cpp:1222
msgid "Other Vendors"
msgstr "Otras Marcas"
-#: src/slic3r/GUI/Tab.cpp:1238 src/slic3r/GUI/Tab.cpp:3666
+#: src/slic3r/GUI/Tab.cpp:1568 src/slic3r/GUI/Tab.cpp:4085
msgid "Output file"
msgstr "Archivo de salida"
-#: src/libslic3r/PrintConfig.cpp:3493
+#: src/libslic3r/PrintConfig.cpp:3692
msgid "Output File"
msgstr "Archivo de salida"
-#: src/libslic3r/PrintConfig.cpp:1363
+#: src/libslic3r/PrintConfig.cpp:1471
msgid "Output filename format"
msgstr "Formato de nombre de salida"
-#: src/libslic3r/PrintConfig.cpp:3381
+#: src/libslic3r/PrintConfig.cpp:3580
msgid "Output Model Info"
msgstr "Información del modelo de salida"
-#: src/slic3r/GUI/Tab.cpp:1230 src/slic3r/GUI/Tab.cpp:3665
+#: src/slic3r/GUI/Tab.cpp:1560 src/slic3r/GUI/Tab.cpp:4084
msgid "Output options"
msgstr "Opciones de salida"
-#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:312
+#: src/slic3r/GUI/GUI_Preview.cpp:303 src/libslic3r/ExtrusionEntity.cpp:316
+#: src/libslic3r/ExtrusionEntity.cpp:340
msgid "Overhang perimeter"
msgstr "Perímetro de voladizos"
-#: src/libslic3r/PrintConfig.cpp:2042
+#: src/libslic3r/PrintConfig.cpp:2184
msgid "Overhang threshold"
msgstr "Umbral de voladizos"
-#: src/slic3r/GUI/Tab.cpp:1215
+#: src/slic3r/GUI/Tab.cpp:1545
msgid "Overlap"
msgstr "Superposición"
-#: src/slic3r/GUI/MainFrame.cpp:614
+#: src/slic3r/GUI/MainFrame.cpp:1221
msgid "P&rint Settings Tab"
msgstr "Configu&ración de Impresión"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:107 src/slic3r/GUI/GUI_ObjectList.cpp:625
-#: src/slic3r/GUI/Plater.cpp:635 src/slic3r/GUI/Tab.cpp:3636
-#: src/slic3r/GUI/Tab.cpp:3637 src/libslic3r/PrintConfig.cpp:2781
-#: src/libslic3r/PrintConfig.cpp:2788 src/libslic3r/PrintConfig.cpp:2802
-#: src/libslic3r/PrintConfig.cpp:2813 src/libslic3r/PrintConfig.cpp:2823
-#: src/libslic3r/PrintConfig.cpp:2845 src/libslic3r/PrintConfig.cpp:2856
-#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:2870
-#: src/libslic3r/PrintConfig.cpp:2881 src/libslic3r/PrintConfig.cpp:2890
-#: src/libslic3r/PrintConfig.cpp:2899
+#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:664
+#: src/slic3r/GUI/Plater.cpp:501 src/slic3r/GUI/Tab.cpp:4055
+#: src/slic3r/GUI/Tab.cpp:4056 src/slic3r/GUI/Tab.cpp:4127
+#: src/libslic3r/PrintConfig.cpp:2945 src/libslic3r/PrintConfig.cpp:2952
+#: src/libslic3r/PrintConfig.cpp:2966 src/libslic3r/PrintConfig.cpp:2977
+#: src/libslic3r/PrintConfig.cpp:2987 src/libslic3r/PrintConfig.cpp:3009
+#: src/libslic3r/PrintConfig.cpp:3020 src/libslic3r/PrintConfig.cpp:3027
+#: src/libslic3r/PrintConfig.cpp:3034 src/libslic3r/PrintConfig.cpp:3045
+#: src/libslic3r/PrintConfig.cpp:3054 src/libslic3r/PrintConfig.cpp:3063
msgid "Pad"
msgstr "Pad"
@@ -5208,443 +6192,517 @@ msgstr "Pad"
msgid "Pad and Support"
msgstr "Pad y soportes"
-#: src/libslic3r/PrintConfig.cpp:2855
+#: src/slic3r/GUI/Tab.cpp:4127 src/libslic3r/PrintConfig.cpp:3019
msgid "Pad around object"
msgstr "Pad alrededor del objeto"
-#: src/libslic3r/PrintConfig.cpp:2862
+#: src/libslic3r/PrintConfig.cpp:3026
msgid "Pad around object everywhere"
msgstr "Pad alrededor del objeto en todos lados"
-#: src/libslic3r/PrintConfig.cpp:2811
+#: src/libslic3r/PrintConfig.cpp:2975
msgid "Pad brim size"
msgstr "Tamaño del borde del pad"
-#: src/libslic3r/SLA/Pad.cpp:691
+#: src/libslic3r/SLA/Pad.cpp:532
msgid "Pad brim size is too small for the current configuration."
msgstr "El tamaño del borde del pad es demasiado pequeño para la configuración actual."
-#: src/libslic3r/PrintConfig.cpp:2898
+#: src/libslic3r/PrintConfig.cpp:3062
msgid "Pad object connector penetration"
msgstr "Penetración del conector del objeto al Pad"
-#: src/libslic3r/PrintConfig.cpp:2880
+#: src/libslic3r/PrintConfig.cpp:3044
msgid "Pad object connector stride"
msgstr "Paso del conector del objeto al Pad"
-#: src/libslic3r/PrintConfig.cpp:2889
+#: src/libslic3r/PrintConfig.cpp:3053
msgid "Pad object connector width"
msgstr "Anchura del conector del pad al objeto"
-#: src/libslic3r/PrintConfig.cpp:2869
+#: src/libslic3r/PrintConfig.cpp:3033
msgid "Pad object gap"
msgstr "Espacio del pad con el objeto"
-#: src/libslic3r/PrintConfig.cpp:2797
+#: src/libslic3r/PrintConfig.cpp:2961
msgid "Pad wall height"
msgstr "Altura de la pared del pad"
-#: src/libslic3r/PrintConfig.cpp:2844
+#: src/libslic3r/PrintConfig.cpp:3008
msgid "Pad wall slope"
msgstr "Pendiente de la pared del pad"
-#: src/libslic3r/PrintConfig.cpp:2787
+#: src/libslic3r/PrintConfig.cpp:2951
msgid "Pad wall thickness"
msgstr "Espesor de la pared del pad"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
msgid "Page Down"
msgstr "Page Down"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
msgid "Page Up"
msgstr "Page Up"
-#: src/slic3r/GUI/Field.cpp:139
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33
+msgid "Paint-on supports"
+msgstr "Soportes que se pintan"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:178
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:159
+msgid "Paints all facets inside, regardless of their orientation."
+msgstr "Pinta todas las caras del interior, independientemente de su orientación."
+
+#: src/slic3r/GUI/Field.cpp:187
msgid "parameter name"
msgstr "nombre del parámetro"
-#: src/slic3r/GUI/Field.cpp:243
+#: src/slic3r/GUI/Field.cpp:291
msgid "Parameter validation"
msgstr "Validación de parámetros"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3418
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3881
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
msgid "Part"
msgstr "Pieza"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2494
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2886
msgid "Part manipulation"
msgstr "Manipulación de piezas"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2483
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2875
msgid "Part Settings to modify"
msgstr "Configuraciones de piezas para modificar"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4514
+#: src/libslic3r/PrintConfig.cpp:138
+msgid "Password"
+msgstr "Contraseña"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4880
msgid "Paste"
msgstr "Pegar"
-#: src/slic3r/GUI/MainFrame.cpp:592
+#: src/slic3r/GUI/MainFrame.cpp:1198
msgid "Paste clipboard"
msgstr "Pegar portapapeles"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:133
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:128
msgid "Paste from clipboard"
msgstr "Pegar desde el portapapeles"
-#: src/slic3r/GUI/Plater.cpp:5606
+#: src/slic3r/GUI/Plater.cpp:5803
msgid "Paste From Clipboard"
msgstr "Pegar Desde Portapapeles"
-#: src/libslic3r/PrintConfig.cpp:2002
+#: src/libslic3r/PrintConfig.cpp:2144
msgid "Pattern"
msgstr "Patrón"
-#: src/libslic3r/PrintConfig.cpp:1891
+#: src/libslic3r/PrintConfig.cpp:2033
msgid "Pattern angle"
msgstr "Ãngulo del patrón"
-#: src/libslic3r/PrintConfig.cpp:2016
+#: src/libslic3r/PrintConfig.cpp:2158
msgid "Pattern spacing"
-msgstr "Espaciado entre patrones"
+msgstr "Separación entre patrones"
-#: src/libslic3r/PrintConfig.cpp:2004
+#: src/libslic3r/PrintConfig.cpp:2146
msgid "Pattern used to generate support material."
msgstr "Patrón utilizado para generar material de soporte."
-#: src/slic3r/GUI/Plater.cpp:1261
+#: src/slic3r/GUI/GCodeViewer.cpp:2437 src/slic3r/GUI/GCodeViewer.cpp:2460
+#: src/slic3r/GUI/Plater.cpp:1199
msgid "Pause"
msgstr "Pausa"
-#: src/slic3r/GUI/DoubleSlider.cpp:1009
+#: src/slic3r/GUI/DoubleSlider.cpp:1133
msgid "Pause print (\"%1%\")"
msgstr "Pausar impresión (\"%1%\")"
-#: src/slic3r/GUI/GLCanvas3D.cpp:934 src/slic3r/GUI/GLCanvas3D.cpp:943
-#: src/slic3r/GUI/GLCanvas3D.cpp:982
-msgid "Pause print or custom G-code"
-msgstr "Pausar impresión o código G personalizado"
+#: src/slic3r/GUI/Tab.cpp:2209 src/libslic3r/PrintConfig.cpp:1969
+msgid "Pause Print G-code"
+msgstr "Pausar Código G de Impresión"
+
+#: src/libslic3r/PrintConfig.cpp:1147
+msgid "Percent of a flow rate relative to object's normal layer height."
+msgstr "Porcentaje de caudal relativo a la altura normal de la capa del objeto."
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2233
+msgid "Percentage"
+msgstr "Porcentaje"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:175
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:177
msgid "Perform cut"
msgstr "Realizar corte"
-#: src/libslic3r/PrintConfig.cpp:2927
+#: src/libslic3r/PrintConfig.cpp:3091
msgid "Performance vs accuracy of calculation. Lower values may produce unwanted artifacts."
msgstr "Rendimiento vs precisión de cálculo. Los valores más bajos pueden producir artefactos no deseados."
-#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:310
+#: src/slic3r/GUI/GUI_Preview.cpp:301 src/libslic3r/ExtrusionEntity.cpp:314
+#: src/libslic3r/ExtrusionEntity.cpp:336
msgid "Perimeter"
msgstr "Perímetro"
-#: src/libslic3r/PrintConfig.cpp:1408
+#: src/libslic3r/PrintConfig.cpp:1516
msgid "Perimeter extruder"
msgstr "Extrusor para perímetros"
-#: src/slic3r/GUI/PresetHints.cpp:165
+#: src/slic3r/GUI/PresetHints.cpp:164
msgid "perimeters"
msgstr "perímetros"
-#: src/libslic3r/PrintConfig.cpp:1399 src/libslic3r/PrintConfig.cpp:1417
-#: src/libslic3r/PrintConfig.cpp:1430 src/libslic3r/PrintConfig.cpp:1440
+#: src/libslic3r/PrintConfig.cpp:1507 src/libslic3r/PrintConfig.cpp:1525
+#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1548
msgid "Perimeters"
msgstr "Perímetros"
-#: src/slic3r/GUI/ConfigWizard.cpp:860
-#, c-format
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:159
+msgid "Physical Printer"
+msgstr "Impresora Física"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:789
+#: src/slic3r/GUI/PresetComboBoxes.cpp:948
+msgid "Physical printers"
+msgstr "Impresoras físicas"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1226
+#, possible-c-format
msgid "Pick another vendor supported by %s"
msgstr "Elije otro proveedor compatible con% s"
-#: src/libslic3r/PrintConfig.cpp:66
-msgid "Picture sizes to be stored into a .gcode and .sl1 files"
-msgstr "Tamaños de imagen para almacenar en un archivo .gcode y .sl1"
+#: src/libslic3r/PrintConfig.cpp:67
+msgid "Picture sizes to be stored into a .gcode and .sl1 files, in the following format: \"XxY, XxY, ...\""
+msgstr "Tamaños de imagen para almacenar en archivos .gcode y .sl1, en el siguiente formato: \"XxY, XxY, ...\""
+
+#: src/libslic3r/PrintConfig.cpp:2822
+msgid "Pillar connection mode"
+msgstr "Modo de conexión del pilar"
+
+#: src/libslic3r/PrintConfig.cpp:2791
+msgid "Pillar diameter"
+msgstr "Diámetro del pilar"
-#: src/libslic3r/PrintConfig.cpp:2681
+#: src/libslic3r/PrintConfig.cpp:2845
msgid "Pillar widening factor"
msgstr "Factor de ensanchamiento del pilar"
-#: src/slic3r/GUI/ConfigManipulation.cpp:330
+#: src/slic3r/GUI/ConfigManipulation.cpp:335
msgid "Pinhead diameter should be smaller than the pillar diameter."
msgstr "El diámetro de la cabeza del pin debe ser menor que el diámetro del pilar."
-#: src/slic3r/GUI/DoubleSlider.cpp:79
+#: src/libslic3r/PrintConfig.cpp:2763
+msgid "Pinhead front diameter"
+msgstr "Diámetro frontal de la cabeza"
+
+#: src/libslic3r/PrintConfig.cpp:2781
+msgid "Pinhead width"
+msgstr "Ancho de la cabeza"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:110
msgid "Place bearings in slots and resume printing"
msgstr "Coloca los rodamientos en las ranuras y sigue imprimiendo"
-#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:45
+#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:41
msgid "Place on face"
msgstr "Colocar en la cara"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 src/slic3r/GUI/MainFrame.cpp:204
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 src/slic3r/GUI/MainFrame.cpp:340
+#: src/slic3r/GUI/MainFrame.cpp:352
msgid "Plater"
msgstr "Plataforma"
-#: src/slic3r/GUI/GUI_App.cpp:1085
+#: src/slic3r/GUI/GUI_App.cpp:1877
msgid "Please check and fix your object list."
msgstr "Por favor comprueba y soluciona tu lista de objetos."
-#: src/slic3r/GUI/Plater.cpp:2312 src/slic3r/GUI/Tab.cpp:2959
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:209 src/slic3r/GUI/Plater.cpp:2255
+#: src/slic3r/GUI/Tab.cpp:3188
msgid "Please check your object list before preset changing."
msgstr "Por favor comprueba tu lista de objetos antes de cambiar los ajustes iniciales."
-#: src/slic3r/GUI/Plater.cpp:3286
+#: src/slic3r/GUI/Plater.cpp:3089
msgid "Please select the file to reload"
msgstr "Por favor selecciona el archivo a volver a cargar"
-#: src/slic3r/GUI/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:291
+#: src/slic3r/GUI/AboutDialog.cpp:43 src/slic3r/GUI/AboutDialog.cpp:48
+#: src/slic3r/GUI/AboutDialog.cpp:317
msgid "Portions copyright"
msgstr "Porciones del copyright"
-#: src/libslic3r/PrintConfig.cpp:2400
+#: src/libslic3r/PrintConfig.cpp:2543
msgid "Portrait"
msgstr "Retrato"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:215
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:457
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:223
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:505
msgid "Position"
msgstr "Posición"
-#: src/slic3r/GUI/Tab.cpp:2367
+#: src/slic3r/GUI/Tab.cpp:2536
msgid "Position (for multi-extruder printers)"
msgstr "Posición (para impresoras con múltiples extrusores )"
-#: src/libslic3r/PrintConfig.cpp:1623
+#: src/libslic3r/PrintConfig.cpp:1731
msgid "Position of perimeters starting points."
msgstr "Posición de los puntos de inicio del perímetro."
-#: src/libslic3r/PrintConfig.cpp:2224
+#: src/libslic3r/PrintConfig.cpp:2367
msgid "Position X"
msgstr "Posición X"
-#: src/libslic3r/PrintConfig.cpp:2231
+#: src/libslic3r/PrintConfig.cpp:2374
msgid "Position Y"
msgstr "Posición Y"
-#: src/slic3r/GUI/Tab.cpp:1245 src/libslic3r/PrintConfig.cpp:1453
+#: src/slic3r/GUI/Tab.cpp:1575 src/libslic3r/PrintConfig.cpp:1561
msgid "Post-processing scripts"
msgstr "Scripts de postprocesamiento"
-#: src/slic3r/GUI/MainFrame.cpp:629
+#: src/slic3r/GUI/MainFrame.cpp:1237
msgid "Pre&view"
msgstr "Pre&visualizar"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 src/slic3r/GUI/Preferences.cpp:10
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 src/slic3r/GUI/Preferences.cpp:12
msgid "Preferences"
msgstr "Preferencias"
-#: src/libslic3r/PrintConfig.cpp:1641
+#: src/libslic3r/PrintConfig.cpp:1749
msgid "Preferred direction of the seam"
msgstr "Dirección preferida de la costura"
-#: src/libslic3r/PrintConfig.cpp:1652
+#: src/libslic3r/PrintConfig.cpp:1760
msgid "Preferred direction of the seam - jitter"
msgstr "Dirección preferida de la unión - jitter"
-#: src/libslic3r/PrintObject.cpp:255
+#: src/libslic3r/PrintObject.cpp:261
msgid "Preparing infill"
msgstr "Preparando relleno"
-#: src/slic3r/GUI/Tab.cpp:2920
-#, c-format
-msgid "Preset (%s)"
-msgstr "Ajuste inicial (%s)"
+#: src/slic3r/GUI/GUI_App.cpp:855
+msgid "Preparing settings tabs"
+msgstr "Preparando pestañas de configuración"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1009
+msgid "Preset \"%1%\" has the following unsaved changes:"
+msgstr "El ajuste preestablecido \"%1%\" tiene los siguientes cambios sin guardar:"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1014
+msgid "Preset \"%1%\" is not compatible with the new print profile and it has the following unsaved changes:"
+msgstr "El ajuste preestablecido \"%1%\" no es compatible con el nuevo perfil de impresión y tiene los siguientes cambios sin guardar:"
-#: src/slic3r/GUI/Tab.cpp:3082
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1013
+msgid "Preset \"%1%\" is not compatible with the new printer profile and it has the following unsaved changes:"
+msgstr "El ajuste preestablecido \"%1%\" no es compatible con el nuevo perfil de impresora y tiene los siguientes cambios sin guardar:"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:136
+msgid "Preset with name \"%1%\" already exists and is incompatible with selected printer."
+msgstr "El ajuste predeterminado con el nombre \"%1%\" ya existe y es incompatible con la impresora seleccionada."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:148
msgid "Preset with name \"%1%\" already exists."
-msgstr "Ya existe un preset con el nombre \"% 1%\"."
+msgstr "Ya existe un preset con el nombre \"%1%\"."
-#: src/slic3r/GUI/Tab.cpp:3029
+#: src/slic3r/GUI/SavePresetDialog.cpp:219
msgctxt "PresetName"
msgid "Copy"
msgstr "Copiar"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
+#: src/slic3r/GUI/GLCanvas3D.cpp:3990
+msgid "Press %1%left mouse button to enter the exact value"
+msgstr "Presiona %1% botón izquierdo del ratón para introducir el valor exacto"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:157
msgid "Press to activate deselection rectangle"
msgstr "Presionar para activar el rectángulo de deselección"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:197
-msgid "Press to activate one direction scaling in Gizmo scale"
-msgstr "Presiona para activar la escala de una dirección en la escala Gizmo"
-
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:162
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:156
msgid "Press to activate selection rectangle"
msgstr "Presionar para activar el rectángulo de selección"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:198
-msgid ""
-"Press to scale (in Gizmo scale) or rotate (in Gizmo rotate)\n"
-"selected objects around their own center"
-msgstr ""
-"Presionar para escalar (en escalar Gizmo) o rotar(en rotar Gizmo)\n"
-"objetos seleccionados alrededor de su propio centro"
-
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:161
-msgid ""
-"Press to select multiple objects\n"
-"or move multiple objects with mouse"
-msgstr ""
-"Presiona para seleccionar objetos múltiples\n"
-"o mover objetos múltiples con el ratón"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:155
+msgid "Press to select multiple objects\nor move multiple objects with mouse"
+msgstr "Presiona para seleccionar objetos múltiples\no mover objetos múltiples con el ratón"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:195
-#, no-c-format
-msgid ""
-"Press to snap by 5% in Gizmo scale\n"
-"or to snap by 1mm in Gizmo move"
-msgstr ""
-"Presiona para ajustar un 5% en escala Gizmo\n"
-"o para ajustar cada 1mm en mover Gizmo"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:221
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:231
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:232
+msgid "Press to speed up 5 times while moving thumb\nwith arrow keys or mouse wheel"
+msgstr "Presiona para acelerar 5 veces mientras mueves el pulgar\ncon teclas de flecha o rueda del ratón"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/Plater.cpp:4105
-#: src/slic3r/GUI/Tab.cpp:2390
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:212 src/slic3r/GUI/Plater.cpp:4052
+#: src/slic3r/GUI/Tab.cpp:2559
msgid "Preview"
msgstr "Previsualización"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41
msgid "Preview hollowed and drilled model"
msgstr "Vista preliminar del modelo con su interior vaciado y taladrado"
-#: src/slic3r/GUI/MainFrame.cpp:790
+#: src/slic3r/GUI/MainFrame.cpp:1491
msgid "Previously sliced file ("
msgstr "Archivo anterior laminado ("
-#: src/libslic3r/PrintConfig.cpp:1851
+#: src/libslic3r/PrintConfig.cpp:1993
msgid "Prime all printing extruders"
msgstr "Cebar todos los extrusores de impresión"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1521
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/libslic3r/Preset.cpp:1300
msgid "print"
msgstr "imprimir"
-#: src/slic3r/GUI/MainFrame.cpp:648
+#: src/slic3r/GUI/GCodeViewer.cpp:2436 src/slic3r/GUI/GCodeViewer.cpp:2451
+msgid "Print"
+msgstr "Imprimir"
+
+#: src/slic3r/GUI/MainFrame.cpp:1258
msgid "Print &Host Upload Queue"
msgstr "Cola de subida al &host de impresión"
-#: src/libslic3r/PrintConfig.cpp:471
+#: src/libslic3r/PrintConfig.cpp:507
msgid "Print contour perimeters from the outermost one to the innermost one instead of the default inverse order."
msgstr "Imprimir perímetros de contorno desde el más externo hasta el más interno en lugar del orden inverso predeterminado."
-#: src/slic3r/GUI/ConfigWizard.cpp:952
+#: src/slic3r/GUI/ConfigWizard.cpp:1318
msgid "Print Diameters"
msgstr "Diámetros de impresión"
-#: src/slic3r/GUI/Tab.cpp:1944 src/slic3r/GUI/Tab.cpp:2123
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:209 src/slic3r/GUI/Tab.cpp:2024
msgid "Print Host upload"
msgstr "Subida al host de impresión"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:142
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:138
#: src/slic3r/GUI/PrintHostDialogs.cpp:136
msgid "Print host upload queue"
msgstr "Cola de subida al host de impresión"
-#: src/slic3r/GUI/DoubleSlider.cpp:970
+#: src/slic3r/GUI/DoubleSlider.cpp:1093
msgid "Print mode"
msgstr "Modo de impresión"
-#: src/slic3r/GUI/Tab.hpp:328 src/slic3r/GUI/Tab.hpp:431
+#: src/slic3r/GUI/GCodeViewer.cpp:2579 src/slic3r/GUI/GUI_Preview.cpp:1476
+msgid "Print pauses"
+msgstr "Pausas de impresión"
+
+#: src/slic3r/GUI/Tab.hpp:378 src/slic3r/GUI/Tab.hpp:502
msgid "Print Settings"
msgstr "Configuración de Impresión"
-#: src/slic3r/GUI/Plater.cpp:815
+#: src/slic3r/GUI/Plater.cpp:690
msgid "Print settings"
msgstr "Configuración de impresión"
-#: src/slic3r/GUI/Tab.cpp:1478
+#: src/slic3r/GUI/GLCanvas3D.cpp:4303 src/slic3r/GUI/GLCanvas3D.cpp:4939
+msgid "Print Settings Tab"
+msgstr "Pestaña Ajustes Impresión"
+
+#: src/slic3r/GUI/Tab.cpp:1824
msgid "Print speed override"
msgstr "Anular la velocidad de impresión"
-#: src/libslic3r/GCode.cpp:638
+#: src/libslic3r/GCode.cpp:623
msgid "Print z"
msgstr "Imprimir z"
-#: src/slic3r/GUI/MainFrame.cpp:621
+#: src/slic3r/GUI/MainFrame.cpp:1228
msgid "Print&er Settings Tab"
msgstr "Configuración de Impr&esión"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1621
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1750
msgid "Printable"
msgstr "Imprimible"
-#: src/slic3r/GUI/Plater.cpp:819
+#: src/slic3r/GUI/Plater.cpp:694
msgid "Printer"
msgstr "Impresora"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1525
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/libslic3r/Preset.cpp:1304
msgid "printer"
msgstr "impresora"
-#: src/libslic3r/PrintConfig.cpp:2439 src/libslic3r/PrintConfig.cpp:2440
+#: src/libslic3r/PrintConfig.cpp:2582 src/libslic3r/PrintConfig.cpp:2583
msgid "Printer absolute correction"
msgstr "Corrección absoluta de la impresora"
-#: src/libslic3r/PrintConfig.cpp:2456 src/libslic3r/PrintConfig.cpp:2457
+#: src/libslic3r/PrintConfig.cpp:2599 src/libslic3r/PrintConfig.cpp:2600
msgid "Printer gamma correction"
msgstr "Corrección gamma de la impresora"
-#: src/slic3r/GUI/Tab.cpp:976
+#: src/slic3r/GUI/Tab.cpp:1294
msgid "printer model"
msgstr "modelo de impresora"
-#: src/libslic3r/PrintConfig.cpp:1472
+#: src/libslic3r/PrintConfig.cpp:1580
msgid "Printer notes"
msgstr "Notas de la impresora"
-#: src/libslic3r/PrintConfig.cpp:2431 src/libslic3r/PrintConfig.cpp:2432
-#: src/libslic3r/PrintConfig.cpp:2433
+#: src/libslic3r/PrintConfig.cpp:144
+msgid "Printer preset name"
+msgstr "Nombre predeterminado de la impresora"
+
+#: src/libslic3r/PrintConfig.cpp:2574 src/libslic3r/PrintConfig.cpp:2575
+#: src/libslic3r/PrintConfig.cpp:2576
msgid "Printer scaling correction"
msgstr "Corrección de escala de la impresora"
-#: src/slic3r/GUI/Tab.hpp:391
+#: src/slic3r/GUI/Tab.hpp:453
msgid "Printer Settings"
msgstr "Configuración de la Impresora"
+#: src/slic3r/GUI/GLCanvas3D.cpp:4305 src/slic3r/GUI/GLCanvas3D.cpp:4941
+msgid "Printer Settings Tab"
+msgstr "Pestaña Ajustes Impresora"
+
#: src/libslic3r/PrintConfig.cpp:43 src/libslic3r/PrintConfig.cpp:44
msgid "Printer technology"
msgstr "Tecnología de la impresora"
-#: src/libslic3r/PrintConfig.cpp:1466
+#: src/libslic3r/PrintConfig.cpp:1574
msgid "Printer type"
msgstr "Tipo de impresora"
-#: src/libslic3r/PrintConfig.cpp:1487
+#: src/libslic3r/PrintConfig.cpp:1595
msgid "Printer variant"
msgstr "Modelo de impresora"
-#: src/libslic3r/PrintConfig.cpp:1481
+#: src/libslic3r/PrintConfig.cpp:1589
msgid "Printer vendor"
msgstr "Fabricante de la impresora"
-#: src/libslic3r/Print.cpp:1388
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:476
+msgid "Printer with name \"%1%\" already exists."
+msgstr "La impresora con nombre \"%1%\" ya existe."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:587
+msgid "Printer:"
+msgstr "Impresora:"
+
+#: src/libslic3r/Print.cpp:1414
msgid "Printing with multiple extruders of differing nozzle diameters. If support is to be printed with the current extruder (support_material_extruder == 0 or support_material_interface_extruder == 0), all nozzles have to be of the same diameter."
msgstr "Imprimir con múltiples extrusoras de diferentes diámetros de boquilla. Si el soporte debe imprimirse con la extrusora actual (support_material_extruder == 0 o support_material_interface_extruder == 0), todas las boquillas deben ser del mismo diámetro."
#. TRN "Processing input_file_basename"
-#: src/slic3r/GUI/MainFrame.cpp:849
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:1550
+#, possible-c-format
msgid "Processing %s"
msgstr "Procesando %s"
-#: src/slic3r/GUI/Plater.cpp:2283
-#, c-format
-msgid "Processing input file %s"
-msgstr "Procesando el archivo de entrada %s"
-
-#: src/libslic3r/PrintObject.cpp:108
+#: src/libslic3r/PrintObject.cpp:114
msgid "Processing triangulated mesh"
msgstr "Procesando malla triangulada"
-#: src/slic3r/GUI/Tab.cpp:1259 src/slic3r/GUI/Tab.cpp:1549
-#: src/slic3r/GUI/Tab.cpp:2020 src/slic3r/GUI/Tab.cpp:2136
-#: src/slic3r/GUI/Tab.cpp:3544 src/slic3r/GUI/Tab.cpp:3672
+#: src/slic3r/GUI/Tab.cpp:1589 src/slic3r/GUI/Tab.cpp:1896
+#: src/slic3r/GUI/Tab.cpp:2229 src/slic3r/GUI/Tab.cpp:2305
+#: src/slic3r/GUI/Tab.cpp:3960 src/slic3r/GUI/Tab.cpp:4091
msgid "Profile dependencies"
msgstr "Dependencias de perfil"
-#: src/slic3r/GUI/ConfigWizard.cpp:566
+#: src/slic3r/GUI/ConfigWizard.cpp:590
msgid "Profile:"
msgstr "Perfil:"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:150
+#: src/slic3r/GUI/PrintHostDialogs.cpp:148
msgid "Progress"
msgstr "Progreso"
@@ -5652,103 +6710,129 @@ msgstr "Progreso"
msgid "Progress:"
msgstr "Progreso:"
-#: src/slic3r/GUI/MainFrame.cpp:684
+#: src/slic3r/GUI/MainFrame.cpp:909 src/slic3r/GUI/MainFrame.cpp:1308
msgid "Prusa 3D &Drivers"
msgstr "Controladores de Prusa 3&D"
-#: src/slic3r/GUI/ConfigWizard.cpp:1995
+#: src/slic3r/GUI/ConfigWizard.cpp:2506
msgid "Prusa FFF Technology Printers"
msgstr "Impresoras Prusa de tecnología FFF"
-#: src/slic3r/GUI/ConfigWizard.cpp:1998
+#: src/slic3r/GUI/ConfigWizard.cpp:2509
msgid "Prusa MSLA Technology Printers"
msgstr "Impresoras Prusa de tecnología MSLA"
-#: src/slic3r/GUI/AboutDialog.cpp:260
+#: src/slic3r/Utils/Http.cpp:78
+msgid "PrusaSlicer detected system SSL certificate store in: %1%"
+msgstr "PrusaSlicer detectó el almacenamiento de certificados SSL del sistema en: %1%"
+
+#: src/slic3r/GUI/GUI_Init.cpp:85 src/slic3r/GUI/GUI_Init.cpp:88
+msgid "PrusaSlicer GUI initialization failed"
+msgstr "Hubo un error al abrir el GUI de PrusaSlicer"
+
+#: src/slic3r/GUI/GUI_App.cpp:586
+msgid "PrusaSlicer has encountered a localization error. Please report to PrusaSlicer team, what language was active and in which scenario this issue happened. Thank you.\n\nThe application will now terminate."
+msgstr "PrusaSlicer ha encontrado un error de localización. Por favor, informa al equipo de PrusaSlicer qué idioma estaba activo y en qué escenario ocurrió este problema. Gracias.\n\nLa aplicación terminará ahora."
+
+#: src/slic3r/GUI/AboutDialog.cpp:285
msgid "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap community."
msgstr "PrusaSlicer está basado en Slic3r de Alessandro Ranellucci y la comunidad RepRap."
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:284
-#, c-format
-msgid ""
-"PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n"
-"while OpenGL version %s, render %s, vendor %s was detected."
-msgstr ""
-"PrusaSlicer requiere el controlador de gráficos OpenGL 2.0 para que funcione correctamente, \n"
-"mientras que la versión %s OpenGL, renderizado %s, vendedor %s fue detectada."
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:525
+msgid "PrusaSlicer is closing: Unsaved Changes"
+msgstr "PrusaSlicer se está cerrando: Cambios no guardados"
+
+#: src/slic3r/GUI/OpenGLManager.cpp:259
+#, possible-c-format
+msgid "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \nwhile OpenGL version %s, render %s, vendor %s was detected."
+msgstr "PrusaSlicer requiere el controlador de gráficos OpenGL 2.0 para que funcione correctamente, \nmientras que la versión %s OpenGL, renderizado %s, vendedor %s fue detectada."
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:50
msgid "PrusaSlicer version"
msgstr "Versión PrusaSlicer"
-#: src/slic3r/GUI/ConfigWizard.cpp:815
-msgid ""
-"PrusaSlicer's user interfaces comes in three variants:\n"
-"Simple, Advanced, and Expert.\n"
-"The Simple mode shows only the most frequently used settings relevant for regular 3D printing. The other two offer progressively more sophisticated fine-tuning, they are suitable for advanced and expert users, respectively."
-msgstr ""
-"Las interfaces de usuario de PrusaSlicer tiene tres variantes:\n"
-"Simple, avanzado y experto.\n"
-"El modo Simple muestra solo las configuraciones usadas con más frecuencia relevantes para la impresión 3D normal. Los otros dos ofrecen ajustes progresivamente más sofisticados, son adecuados para usuarios avanzados y expertos, respectivamente."
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:662
+msgid "PrusaSlicer will remember your action."
+msgstr "PrusaSlicer recordará tu acción."
-#: src/libslic3r/PrintConfig.cpp:2254
+#: src/slic3r/GUI/ConfigWizard.cpp:1174
+msgid "PrusaSlicer's user interfaces comes in three variants:\nSimple, Advanced, and Expert.\nThe Simple mode shows only the most frequently used settings relevant for regular 3D printing. The other two offer progressively more sophisticated fine-tuning, they are suitable for advanced and expert users, respectively."
+msgstr "Las interfaces de usuario de PrusaSlicer tiene tres variantes:\nSimple, avanzado y experto.\nEl modo Simple muestra solo las configuraciones usadas con más frecuencia relevantes para la impresión 3D normal. Los otros dos ofrecen ajustes progresivamente más sofisticados, son adecuados para usuarios avanzados y expertos, respectivamente."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:668
+msgid "PrusaSlicer: Don't ask me again"
+msgstr "PrusaSlicer: No me vuelvas a preguntar"
+
+#: src/libslic3r/PrintConfig.cpp:2397
msgid "Purging after toolchange will done inside this object's infills. This lowers the amount of waste but may result in longer print time due to additional travel moves."
msgstr "La purga después del cambio de herramientas se realizará dentro de los rellenos de este objeto. Esto reduce la cantidad de desperdicio, pero puede resultar en un tiempo de impresión más largo debido a movimientos de viaje adicionales."
-#: src/slic3r/GUI/Plater.cpp:544
+#: src/slic3r/GUI/Plater.cpp:410
msgid "Purging volumes"
msgstr "Volúmenes de purga"
-#: src/libslic3r/PrintConfig.cpp:2207
+#: src/libslic3r/PrintConfig.cpp:2350
msgid "Purging volumes - load/unload volumes"
msgstr "Volumen de purga - volumen de carga/descarga"
-#: src/libslic3r/PrintConfig.cpp:2214
+#: src/libslic3r/PrintConfig.cpp:2357
msgid "Purging volumes - matrix"
msgstr "Volúmenes de purga - matriz"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44
+#: src/libslic3r/PrintConfig.cpp:1201
+msgid "Purpose of Machine Limits"
+msgstr "Propósito de los Límites Máquina"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43
msgid "Quality"
msgstr "Calidad"
-#: src/slic3r/GUI/Tab.cpp:1080
+#: src/slic3r/GUI/Tab.cpp:1402
msgid "Quality (slower slicing)"
msgstr "Calidad (laminado más lento)"
-#: src/slic3r/GUI/GLCanvas3D.cpp:273
+#: src/slic3r/GUI/GLCanvas3D.cpp:260
msgid "Quality / Speed"
msgstr "Calidad / Velocidad"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1182
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1530
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1536
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1849
-#, c-format
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61
+msgid "Quick"
+msgstr "Rápido"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1306
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1661
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1667
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2008
+#, possible-c-format
msgid "Quick Add Settings (%s)"
msgstr "Añadir ajustes rápidos (%s)"
-#: src/slic3r/GUI/MainFrame.cpp:512
+#: src/slic3r/GUI/MainFrame.cpp:1113
msgid "Quick Slice"
msgstr "Laminado rápido"
-#: src/slic3r/GUI/MainFrame.cpp:518
+#: src/slic3r/GUI/MainFrame.cpp:1119
msgid "Quick Slice and Save As"
msgstr "Laminado rápido y Guardar como"
-#: src/slic3r/GUI/MainFrame.cpp:540
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:1144 src/slic3r/GUI/MainFrame.cpp:1402
+#, possible-c-format
msgid "Quit %s"
msgstr "Cerrar %s"
-#: src/slic3r/GUI/GLCanvas3D.cpp:294 src/libslic3r/PrintConfig.cpp:511
+#: src/slic3r/GUI/GUI_App.cpp:396
+msgid "Quit, I will move my data now"
+msgstr "Termino, moveré mis datos ahora"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:280 src/libslic3r/PrintConfig.cpp:547
msgid "Radius"
msgstr "Radio"
-#: src/slic3r/GUI/Tab.cpp:1127
+#: src/slic3r/GUI/Tab.cpp:1456
msgid "Raft"
msgstr "Balsa"
-#: src/libslic3r/PrintConfig.cpp:1501
+#: src/libslic3r/PrintConfig.cpp:1609
msgid "Raft layers"
msgstr "Capas de balsa"
@@ -5757,44 +6841,38 @@ msgid "Ramming customization"
msgstr "Configuración de empuje"
#: src/slic3r/GUI/WipeTowerDialog.cpp:41
-msgid ""
-"Ramming denotes the rapid extrusion just before a tool change in a single-extruder MM printer. Its purpose is to properly shape the end of the unloaded filament so it does not prevent insertion of the new filament and can itself be reinserted later. This phase is important and different materials can require different extrusion speeds to get the good shape. For this reason, the extrusion rates during ramming are adjustable.\n"
-"\n"
-"This is an expert-level setting, incorrect adjustment will likely lead to jams, extruder wheel grinding into filament etc."
-msgstr ""
-"El empuje señala la extrusión rápida justo antes de un cambio de filamento en una impresora MM de un sólo extrusor. Su propósito es asegurar una forma adecuada para el extremo de filamento que se va a descargar, para que no haya problemas al insertar uno nuevo y para que se pueda volver a insertar este más tarde. Esta fase es importante y diferentes materiales puede precisar diferentes velocidades para obtener la forma correcta. Por este motivo, las velocidades extrusión durante el empuje son ajustables.\n"
-"\n"
-"Este es un ajuste para expertos, ajustarlo incorrectamente podrá producir atascos, que la rueda del extrusor arañe el filamento, etc."
+msgid "Ramming denotes the rapid extrusion just before a tool change in a single-extruder MM printer. Its purpose is to properly shape the end of the unloaded filament so it does not prevent insertion of the new filament and can itself be reinserted later. This phase is important and different materials can require different extrusion speeds to get the good shape. For this reason, the extrusion rates during ramming are adjustable.\n\nThis is an expert-level setting, incorrect adjustment will likely lead to jams, extruder wheel grinding into filament etc."
+msgstr "El empuje señala la extrusión rápida justo antes de un cambio de filamento en una impresora MM de un sólo extrusor. Su propósito es asegurar una forma adecuada para el extremo de filamento que se va a descargar, para que no haya problemas al insertar uno nuevo y para que se pueda volver a insertar este más tarde. Esta fase es importante y diferentes materiales puede precisar diferentes velocidades para obtener la forma correcta. Por este motivo, las velocidades extrusión durante el empuje son ajustables.\n\nEste es un ajuste para expertos, ajustarlo incorrectamente podrá producir atascos, que la rueda del extrusor arañe el filamento, etc."
#: src/slic3r/GUI/WipeTowerDialog.cpp:91
msgid "Ramming line spacing"
-msgstr "Espaciado de la linea de empuje"
+msgstr "Separación de la linea de empuje"
#: src/slic3r/GUI/WipeTowerDialog.cpp:89
msgid "Ramming line width"
msgstr "Ancho de la linea de empuje"
-#: src/libslic3r/PrintConfig.cpp:694
+#: src/libslic3r/PrintConfig.cpp:730
msgid "Ramming parameters"
msgstr "Parámetros de empuje"
-#: src/slic3r/GUI/Tab.cpp:1505
+#: src/slic3r/GUI/Tab.cpp:1850
msgid "Ramming settings"
msgstr "Ajustes de empuje"
-#: src/libslic3r/PrintConfig.cpp:1629
+#: src/libslic3r/PrintConfig.cpp:1737
msgid "Random"
msgstr "Aleatorio"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:94
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:96
msgid "Range"
msgstr "Rango"
-#: src/libslic3r/SLAPrintSteps.cpp:65
+#: src/libslic3r/SLAPrintSteps.cpp:66
msgid "Rasterizing layers"
msgstr "Rastrerizando capas"
-#: src/slic3r/GUI/MainFrame.cpp:596
+#: src/slic3r/GUI/MainFrame.cpp:1202
msgid "Re&load from disk"
msgstr "Recargar desde e&l disco"
@@ -5806,210 +6884,243 @@ msgstr "Reconfigurar"
msgid "Ready"
msgstr "Listo"
-#: src/slic3r/GUI/Plater.cpp:3115
+#: src/slic3r/GUI/Plater.cpp:2915
msgid "Ready to slice"
msgstr "Preparado para laminar"
-#: src/slic3r/GUI/MainFrame.cpp:669 src/libslic3r/PrintConfig.cpp:1632
+#: src/slic3r/GUI/MainFrame.cpp:966 src/slic3r/GUI/MainFrame.cpp:1286
+#: src/libslic3r/PrintConfig.cpp:1740
msgid "Rear"
msgstr "Trasera"
-#: src/slic3r/GUI/MainFrame.cpp:669
+#: src/slic3r/GUI/MainFrame.cpp:966 src/slic3r/GUI/MainFrame.cpp:1286
msgid "Rear View"
msgstr "Vista trasera"
-#: src/slic3r/GUI/MainFrame.cpp:413
+#: src/slic3r/GUI/MainFrame.cpp:994
msgid "Recent projects"
msgstr "Proy&ectos recientes"
-#: src/slic3r/GUI/PresetHints.cpp:263
-#, c-format
+#: src/slic3r/GUI/PresetHints.cpp:262
+#, possible-c-format
msgid "Recommended object thin wall thickness for layer height %.2f and"
msgstr "Espesor de pared delgada del objeto recomendado para una altura de capa %.2f y"
-#: src/slic3r/GUI/PresetHints.cpp:274
+#: src/slic3r/GUI/PresetHints.cpp:273
msgid "Recommended object thin wall thickness: Not available due to excessively small extrusion width."
msgstr "Espesor de pared delgada del objeto recomendada: No disponible debido al ancho de extrusión excesivamente pequeño."
-#: src/slic3r/GUI/PresetHints.cpp:247
+#: src/slic3r/GUI/PresetHints.cpp:246
msgid "Recommended object thin wall thickness: Not available due to invalid layer height."
msgstr "Grosor recomendado de la pared del objeto recomendado: no disponible debido a la altura de capa no válida."
-#: src/slic3r/GUI/GUI_App.cpp:450 src/slic3r/GUI/GUI_App.cpp:459
+#: src/slic3r/GUI/GUI_App.cpp:1102 src/slic3r/GUI/GUI_App.cpp:1115
msgid "Recreating"
msgstr "Recreando"
-#: src/slic3r/GUI/BedShapeDialog.cpp:73
+#: src/slic3r/GUI/BedShapeDialog.cpp:141
msgid "Rectangular"
msgstr "Rectangular"
-#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:843
-#: src/libslic3r/PrintConfig.cpp:2009
+#: src/libslic3r/PrintConfig.cpp:460 src/libslic3r/PrintConfig.cpp:881
+#: src/libslic3r/PrintConfig.cpp:2151
msgid "Rectilinear"
msgstr "Rectilíneo"
-#: src/libslic3r/PrintConfig.cpp:2010
+#: src/libslic3r/PrintConfig.cpp:2152
msgid "Rectilinear grid"
msgstr "Rejilla rectilínea"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4657 src/slic3r/GUI/KBShortcutsDialog.cpp:131
-#: src/slic3r/GUI/MainFrame.cpp:584
+#: src/slic3r/GUI/GLCanvas3D.cpp:5067 src/slic3r/GUI/KBShortcutsDialog.cpp:126
+#: src/slic3r/GUI/MainFrame.cpp:1190
msgid "Redo"
msgstr "Rehacer"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4065
-#, c-format
+#: src/slic3r/GUI/GLCanvas3D.cpp:4382
+#, possible-c-format
msgid "Redo %1$d Action"
msgid_plural "Redo %1$d Actions"
msgstr[0] "Rehacer %1$d Acción"
msgstr[1] "Rehacer %1$d Acciones"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4047
+#: src/slic3r/GUI/GLCanvas3D.cpp:4361
msgid "Redo History"
msgstr "Rehacer Historia"
-#: src/slic3r/GUI/Tab.cpp:1098
+#: src/slic3r/GUI/Tab.cpp:1426
msgid "Reducing printing time"
msgstr "Reduciendo el tiempo de impresión"
-#: src/slic3r/GUI/Plater.cpp:3452
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327
+msgid "Refresh Printers"
+msgstr "Actualizar lista de impresoras"
+
+#: src/libslic3r/PrintConfig.cpp:145
+msgid "Related printer preset name"
+msgstr "Nombre predeterminado de la impresora relacionada"
+
+#: src/slic3r/GUI/Plater.cpp:3257
msgid "Reload all from disk"
msgstr "Recargar todo desde el disco"
-#: src/slic3r/GUI/ConfigWizard.cpp:798 src/slic3r/GUI/GUI_ObjectList.cpp:1664
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3956 src/slic3r/GUI/Plater.cpp:3225
-#: src/slic3r/GUI/Plater.cpp:3934 src/slic3r/GUI/Plater.cpp:3963
+#: src/slic3r/GUI/ConfigWizard.cpp:1157 src/slic3r/GUI/GUI_ObjectList.cpp:1793
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4439 src/slic3r/GUI/Plater.cpp:3028
+#: src/slic3r/GUI/Plater.cpp:3852 src/slic3r/GUI/Plater.cpp:3881
msgid "Reload from disk"
msgstr "Recargar desde el disco"
-#: src/slic3r/GUI/Plater.cpp:3339
+#: src/slic3r/GUI/Plater.cpp:3142
msgid "Reload from:"
msgstr "Recargar desde:"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:134
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:129
msgid "Reload plater from disk"
msgstr "Recargar la base desde el disco"
-#: src/slic3r/GUI/MainFrame.cpp:597
+#: src/slic3r/GUI/MainFrame.cpp:1203
msgid "Reload the plater from disk"
msgstr "Cargar la base del disco"
-#: src/slic3r/GUI/Plater.cpp:3963
+#: src/slic3r/GUI/Plater.cpp:3881
msgid "Reload the selected object from disk"
msgstr "Recargar el objeto seleccionado del disco"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1664
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3956 src/slic3r/GUI/Plater.cpp:3934
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1793
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4439 src/slic3r/GUI/Plater.cpp:3852
msgid "Reload the selected volumes from disk"
msgstr "Vuelve a cargar los volúmenes seleccionados desde el disco"
-#: src/slic3r/GUI/Preferences.cpp:39
+#: src/slic3r/GUI/GCodeViewer.cpp:2442 src/slic3r/GUI/GCodeViewer.cpp:2445
+msgid "Remaining time"
+msgstr "Tiempo restante"
+
+#: src/slic3r/GUI/GUI_App.cpp:720 src/slic3r/GUI/UnsavedChangesDialog.cpp:653
+msgid "Remember my choice"
+msgstr "Recordar mi elección"
+
+#: src/slic3r/GUI/Preferences.cpp:52
msgid "Remember output directory"
msgstr "Recordar el directorio de salida"
-#: src/slic3r/GUI/Tab.cpp:3121
+#: src/slic3r/GUI/MainFrame.cpp:166
+msgid "Remember to check for updates at https://github.com/prusa3d/PrusaSlicer/releases"
+msgstr "Recuerda buscar actualizaciones en https://github.com/prusa3d/PrusaSlicer/releases"
+
+#: src/slic3r/GUI/Tab.cpp:3386
msgid "remove"
msgstr "eliminar"
-#: src/slic3r/GUI/BedShapeDialog.cpp:190 src/slic3r/GUI/BedShapeDialog.cpp:269
-#: src/slic3r/GUI/Tab.cpp:3124
+#: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/BedShapeDialog.cpp:413
+#: src/slic3r/GUI/Tab.cpp:3423
msgid "Remove"
msgstr "Eliminar"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48
msgid "Remove all holes"
msgstr "Elimina todos los huecos"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50
msgid "Remove all points"
msgstr "Eliminar todos los puntos"
-#: src/slic3r/GUI/GLCanvas3D.cpp:246
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35
+msgid "Remove all selection"
+msgstr "Eliminar toda la selección"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:239
msgid "Remove detail"
msgstr "Retirar detalle"
-#: src/slic3r/GUI/Plater.cpp:879
-msgid "Remove device"
-msgstr "Eliminar dispositivo"
-
#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:182
msgid "Remove extruder from sequence"
msgstr "Retirar extrusor de la secuencia"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4537 src/slic3r/GUI/Plater.cpp:3942
+#: src/slic3r/GUI/GLCanvas3D.cpp:4903 src/slic3r/GUI/Plater.cpp:3860
msgid "Remove instance"
msgstr "Retirar una copia"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:160
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:154
msgid "Remove Instance of the selected object"
msgstr "Retirar instancia del objeto seleccionado"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:153
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:161
msgid "Remove layer range"
msgstr "Retirar rango de capas"
-#: src/slic3r/GUI/Plater.cpp:3942
+#: src/slic3r/GUI/Plater.cpp:3860
msgid "Remove one instance of the selected object"
msgstr "Eliminar una instancia del objeto seleccionado"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:95
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:98
msgid "Remove parameter"
msgstr "Eliminar parámetro"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211
msgid "Remove point"
msgstr "Retirar punto"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214
msgid "Remove point from selection"
msgstr "Retirar punto de selección"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47
msgid "Remove selected holes"
msgstr "Elimina huecos seleccionados"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1371
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218
msgid "Remove selected points"
msgstr "Eliminar puntos seleccionados"
-#: src/slic3r/GUI/Plater.cpp:3931 src/slic3r/GUI/Plater.cpp:3953
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:368
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:378
+msgid "Remove selection"
+msgstr "Eliminar selección"
+
+#: src/slic3r/GUI/Plater.cpp:3849 src/slic3r/GUI/Plater.cpp:3871
msgid "Remove the selected object"
msgstr "Eliminar el objeto seleccionado"
-#: src/slic3r/GUI/ConfigWizard.cpp:453
+#: src/slic3r/GUI/ConfigWizard.cpp:456
msgid "Remove user profiles (a snapshot will be taken beforehand)"
msgstr "Eliminar perfiles de usuario (se tomará una instantánea de antemano)"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1636
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1765
msgid "Rename"
msgstr "Renombrar"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:589
msgid "Rename Object"
msgstr "Renombrar Objeto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:589
msgid "Rename Sub-object"
msgstr "Renombrar Sub-Objeto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3803
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4266
msgid "Renaming"
msgstr "Renombrar"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:115
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:150
msgid "Renaming of the G-code after copying to the selected destination folder has failed. Current path is %1%.tmp. Please try exporting again."
msgstr "El cambio de nombre del código G después de copiar en la carpeta de destino seleccionada ha fallado. La ruta actual es %1%.tmp. Intenta exportar de nuevo."
-#: src/libslic3r/PrintConfig.cpp:3515
+#: src/slic3r/GUI/Preferences.cpp:255
+msgid "Render"
+msgstr "Renderizar"
+
+#: src/libslic3r/PrintConfig.cpp:3720
msgid "Render with a software renderer"
msgstr "Renderizar con un software renderizador"
-#: src/libslic3r/PrintConfig.cpp:3516
+#: src/libslic3r/PrintConfig.cpp:3721
msgid "Render with a software renderer. The bundled MESA software renderer is loaded instead of the default OpenGL driver."
msgstr "Render con un software de renderizado. El procesador de software MESA incluido se carga en lugar del controlador OpenGL predeterminado."
-#: src/slic3r/GUI/MainFrame.cpp:911 src/libslic3r/PrintConfig.cpp:3447
+#: src/slic3r/GUI/MainFrame.cpp:1612 src/libslic3r/PrintConfig.cpp:3646
msgid "Repair"
msgstr "Reparar"
@@ -6033,39 +7144,39 @@ msgstr "El archivo 3MF reparado no contiene ningún volumen"
msgid "Repairing model by the Netfabb service"
msgstr "Reparar el modelo mediante el servicio de Netfabb"
-#: src/slic3r/GUI/MainFrame.cpp:524
+#: src/slic3r/GUI/MainFrame.cpp:1125
msgid "Repeat last quick slice"
msgstr "Repetir el último laminado rápido"
-#: src/slic3r/GUI/MainFrame.cpp:524
+#: src/slic3r/GUI/MainFrame.cpp:1125
msgid "Repeat Last Quick Slice"
msgstr "Repetir el último laminado rápido"
-#: src/slic3r/GUI/Tab.cpp:3083
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:477
msgid "Replace?"
msgstr "¿Reemplazar?"
-#: src/slic3r/GUI/MainFrame.cpp:703
+#: src/slic3r/GUI/MainFrame.cpp:928 src/slic3r/GUI/MainFrame.cpp:1327
msgid "Report an I&ssue"
msgstr "Informar de un &problema"
-#: src/slic3r/GUI/MainFrame.cpp:703
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:928 src/slic3r/GUI/MainFrame.cpp:1327
+#, possible-c-format
msgid "Report an issue on %s"
msgstr "Reportar un problema a %s"
-#: src/slic3r/Utils/PresetUpdater.cpp:713
-#, c-format
+#: src/slic3r/Utils/PresetUpdater.cpp:733
+#, possible-c-format
msgid "requires max. %s"
msgstr "requiere max. %s"
-#: src/slic3r/Utils/PresetUpdater.cpp:710
-#, c-format
+#: src/slic3r/Utils/PresetUpdater.cpp:730
+#, possible-c-format
msgid "requires min. %s"
msgstr "requiere min. %s"
-#: src/slic3r/Utils/PresetUpdater.cpp:705
-#, c-format
+#: src/slic3r/Utils/PresetUpdater.cpp:726
+#, possible-c-format
msgid "requires min. %s and max. %s"
msgstr "requiere un min. %s y un max. %s"
@@ -6073,270 +7184,304 @@ msgstr "requiere un min. %s y un max. %s"
msgid "Rescan"
msgstr "Rescanear"
-#: src/slic3r/GUI/Tab.cpp:1906
-msgid "Rescan serial ports"
-msgstr "Vuelver a examinar los puertos serie"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:313
+#: src/slic3r/GUI/GLCanvas3D.cpp:299
msgid "Reset"
msgstr "Reset"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1373
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220
msgid "Reset clipping plane"
msgstr "Restablecer plano de recorte"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:59
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:26
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58
msgid "Reset direction"
msgstr "Restablecer dirección"
-#: src/slic3r/GUI/Plater.cpp:2723
+#: src/slic3r/GUI/Plater.cpp:2684
msgid "Reset Project"
msgstr "Reiniciar Proyecto"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:372
msgid "Reset rotation"
msgstr "Reiniciar rotación"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:394
msgid "Reset Rotation"
msgstr "Reiniciar rotación"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:397
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:407
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409
msgid "Reset scale"
msgstr "Reiniciar escala"
-#: src/slic3r/GUI/GLCanvas3D.cpp:252
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:136
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:118
+msgid "Reset selection"
+msgstr "Reiniciar selección"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:243
msgid "Reset to base"
msgstr "Reiniciar a la base"
-#: src/slic3r/GUI/Tab.cpp:2394
+#: src/slic3r/GUI/Tab.cpp:2564
msgid "Reset to Filament Color"
msgstr "Reiniciar Filament Color"
-#: src/libslic3r/PrintConfig.cpp:1511
+#: src/libslic3r/PrintConfig.cpp:1619
msgid "Resolution"
msgstr "Resolución"
-#: src/libslic3r/PrintConfig.cpp:1529
+#: src/libslic3r/PrintConfig.cpp:1637
msgid "Retract amount before wipe"
msgstr "Retracta cantidad antes de limpiar"
-#: src/libslic3r/PrintConfig.cpp:1537
+#: src/libslic3r/PrintConfig.cpp:1645
msgid "Retract on layer change"
msgstr "Retraer en el cambio de capa"
-#: src/slic3r/GUI/Tab.cpp:1324 src/slic3r/GUI/Tab.cpp:1383
-#: src/slic3r/GUI/Tab.cpp:2370
+#: src/slic3r/GUI/GCodeViewer.cpp:2494 src/slic3r/GUI/Tab.cpp:1670
+#: src/slic3r/GUI/Tab.cpp:2539
msgid "Retraction"
msgstr "Retracción"
-#: src/libslic3r/PrintConfig.cpp:1523
+#: src/libslic3r/PrintConfig.cpp:1631
msgid "Retraction is not triggered when travel moves are shorter than this length."
msgstr "La retracción no se activa cuando los movimientos de desplazamiento son más cortos que esta longitud."
-#: src/libslic3r/PrintConfig.cpp:1544
+#: src/libslic3r/PrintConfig.cpp:1652
msgid "Retraction Length"
msgstr "Longitud de retracción"
-#: src/libslic3r/PrintConfig.cpp:1552
+#: src/libslic3r/PrintConfig.cpp:1660
msgid "Retraction Length (Toolchange)"
msgstr "Longitud de retracción (cambio de herramienta)"
-#: src/libslic3r/PrintConfig.cpp:1604 src/libslic3r/PrintConfig.cpp:1605
+#: src/libslic3r/PrintConfig.cpp:1712 src/libslic3r/PrintConfig.cpp:1713
msgid "Retraction Speed"
msgstr "Velocidad de retracción"
-#: src/slic3r/GUI/Tab.cpp:2386
+#: src/slic3r/GUI/Tab.cpp:2555
msgid "Retraction when tool is disabled (advanced settings for multi-extruder setups)"
msgstr "Retracción cuando la herramienta está desactivada (configuraciones avanzadas para configuraciones de extrusores múltiples )"
-#: src/slic3r/GUI/GUI_Preview.cpp:254
+#: src/slic3r/GUI/GCodeViewer.cpp:2528 src/slic3r/GUI/GUI_Preview.cpp:336
+#: src/slic3r/GUI/GUI_Preview.cpp:1472
msgid "Retractions"
msgstr "Retracciones"
-#: src/slic3r/GUI/MainFrame.cpp:673
+#: src/slic3r/GUI/Preferences.cpp:198
+msgid "Reverse direction of zoom with mouse wheel"
+msgstr "Revertir zoom con la rueda del ratón"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1861 src/slic3r/GUI/Plater.cpp:4886
+msgid "Revert conversion from imperial units"
+msgstr "Revertir la conversión de unidades imperiales"
+
+#: src/slic3r/GUI/MainFrame.cpp:970 src/slic3r/GUI/MainFrame.cpp:1290
msgid "Right"
msgstr "Derecha"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:402
+#: src/slic3r/GUI/GUI_ObjectList.cpp:449
msgid "Right button click the icon to change the object printable property"
msgstr "Clic con el botón derecho en el icono para cambiar la propiedad imprimible del objeto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:396
+#: src/slic3r/GUI/GUI_ObjectList.cpp:443
msgid "Right button click the icon to change the object settings"
msgstr "Clic del botón derecho en el ícono para cambiar los ajustes del objeto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:359
+#: src/slic3r/GUI/GUI_ObjectList.cpp:406
msgid "Right button click the icon to fix STL through Netfabb"
msgstr "Clic del botón derecho en el ícono para arreglar el STL a través de Netfabb"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211
msgid "Right click"
-msgstr "Click derecho"
+msgstr "Clic derecho"
-#: src/slic3r/GUI/GLCanvas3D.cpp:243
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31
+msgid "Right mouse button"
+msgstr "Botón derecho del ratón"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:237
msgid "Right mouse button:"
msgstr "Botón derecho del ratón:"
-#: src/slic3r/GUI/MainFrame.cpp:673
+#: src/slic3r/GUI/MainFrame.cpp:970 src/slic3r/GUI/MainFrame.cpp:1290
msgid "Right View"
msgstr "Vista derecha"
-#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:449
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:480
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:499
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:517
-#: src/libslic3r/PrintConfig.cpp:3451
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:513
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:527
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562
+#: src/libslic3r/PrintConfig.cpp:3650
msgid "Rotate"
msgstr "Girar"
-#: src/libslic3r/PrintConfig.cpp:3456
+#: src/libslic3r/PrintConfig.cpp:3655
msgid "Rotate around X"
msgstr "Rotar alrededor del eje X"
-#: src/libslic3r/PrintConfig.cpp:3461
+#: src/libslic3r/PrintConfig.cpp:3660
msgid "Rotate around Y"
msgstr "Rotar alrededor del eje Y"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:172
msgid "Rotate lower part upwards"
msgstr "Poner patas arriba"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
msgid "Rotate selection 45 degrees CCW"
msgstr "Gira la selección 45 grados en sentido antihorario"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
msgid "Rotate selection 45 degrees CW"
msgstr "Gira la selección 45 grados en sentido horario"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:458
-#: src/slic3r/GUI/Mouse3DController.cpp:304
-#: src/slic3r/GUI/Mouse3DController.cpp:321
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:210
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:224
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:506
+#: src/slic3r/GUI/Mouse3DController.cpp:288
+#: src/slic3r/GUI/Mouse3DController.cpp:309
msgid "Rotation"
msgstr "Rotación"
-#: src/libslic3r/PrintConfig.cpp:3457
+#: src/libslic3r/PrintConfig.cpp:3656
msgid "Rotation angle around the X axis in degrees."
msgstr "Ãngulo de rotación alrededor del eje X en grados."
-#: src/libslic3r/PrintConfig.cpp:3462
+#: src/libslic3r/PrintConfig.cpp:3661
msgid "Rotation angle around the Y axis in degrees."
msgstr "Ãngulo de rotación alrededor del eje Y en grados."
-#: src/libslic3r/PrintConfig.cpp:3452
+#: src/libslic3r/PrintConfig.cpp:3651
msgid "Rotation angle around the Z axis in degrees."
msgstr "Ãngulo de rotación alrededor del eje Z en grados."
-#: src/slic3r/GUI/GUI_App.cpp:797
-#, c-format
+#: src/slic3r/GUI/DoubleSlider.cpp:1836
+msgid "Ruler mode"
+msgstr "Modo regla"
+
+#: src/slic3r/GUI/GUI_App.cpp:1474
+#, possible-c-format
msgid "Run %s"
msgstr "Ejecutar %s"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:128
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:478
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:163
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:520
msgid "Running post-processing scripts"
msgstr "Ejecutando scripts de post-procesamiento"
#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83
-#: src/libslic3r/PrintConfig.cpp:644 src/libslic3r/PrintConfig.cpp:688
-#: src/libslic3r/PrintConfig.cpp:703 src/libslic3r/PrintConfig.cpp:2408
-#: src/libslic3r/PrintConfig.cpp:2417 src/libslic3r/PrintConfig.cpp:2527
-#: src/libslic3r/PrintConfig.cpp:2535 src/libslic3r/PrintConfig.cpp:2543
-#: src/libslic3r/PrintConfig.cpp:2550 src/libslic3r/PrintConfig.cpp:2558
-#: src/libslic3r/PrintConfig.cpp:2566
+#: src/libslic3r/PrintConfig.cpp:680 src/libslic3r/PrintConfig.cpp:724
+#: src/libslic3r/PrintConfig.cpp:739 src/libslic3r/PrintConfig.cpp:2551
+#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2670
+#: src/libslic3r/PrintConfig.cpp:2678 src/libslic3r/PrintConfig.cpp:2686
+#: src/libslic3r/PrintConfig.cpp:2693 src/libslic3r/PrintConfig.cpp:2701
+#: src/libslic3r/PrintConfig.cpp:2709
msgid "s"
msgstr "$"
-#: src/slic3r/GUI/MainFrame.cpp:481 src/slic3r/GUI/MainFrame.cpp:750
+#: src/slic3r/GUI/MainFrame.cpp:1072 src/slic3r/GUI/MainFrame.cpp:1449
msgid "S&end G-code"
msgstr "&Enviar código G"
-#: src/slic3r/GUI/MainFrame.cpp:750
+#: src/slic3r/GUI/MainFrame.cpp:1449
msgid "S&end to print"
msgstr "E&nviar para imprimir"
-#. TRN Preset
-#: src/slic3r/GUI/Tab.cpp:3417
-#, c-format
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:642
+msgid "Save"
+msgstr "Guardar"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:72
+#, possible-c-format
msgid "Save %s as:"
msgstr "Guardar %s como:"
-#: src/slic3r/GUI/MainFrame.cpp:826
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:1527
+#, possible-c-format
msgid "Save %s file as:"
msgstr "Guardar archivo %s como:"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1046
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912
msgid "Save changes?"
msgstr "¿Guardar cambios?"
-#: src/libslic3r/PrintConfig.cpp:3386
+#: src/libslic3r/PrintConfig.cpp:3585
msgid "Save config file"
msgstr "Guardar archivo de configuración"
-#: src/slic3r/GUI/MainFrame.cpp:925
+#: src/slic3r/GUI/MainFrame.cpp:1626
msgid "Save configuration as:"
msgstr "Guardar la configuración como:"
-#: src/libslic3r/PrintConfig.cpp:3387
+#: src/libslic3r/PrintConfig.cpp:3586
msgid "Save configuration to the specified file."
msgstr "Guarda la configuración al archivo especificado."
#. TRN "Save current Settings"
-#: src/slic3r/GUI/Tab.cpp:133
-#, c-format
+#: src/slic3r/GUI/Tab.cpp:203
+#, possible-c-format
msgid "Save current %s"
msgstr "Guardar lo actual %s"
-#: src/slic3r/GUI/MainFrame.cpp:446
+#: src/slic3r/GUI/MainFrame.cpp:1028
msgid "Save current project file"
msgstr "Guardar el proyecto actual como"
-#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452
+#: src/slic3r/GUI/MainFrame.cpp:1032 src/slic3r/GUI/MainFrame.cpp:1034
msgid "Save current project file as"
msgstr "Guardar archivo de proyecto actual como"
-#: src/slic3r/GUI/Plater.cpp:2604
+#: src/slic3r/GUI/Plater.cpp:2566
msgid "Save file as:"
msgstr "Guardar archivo como:"
-#: src/slic3r/GUI/Plater.cpp:4839
+#: src/slic3r/GUI/Plater.cpp:4975
msgid "Save G-code file as:"
msgstr "Guardar archivo Código G como:"
-#: src/slic3r/GUI/MainFrame.cpp:899
+#: src/slic3r/GUI/MainFrame.cpp:1600
msgid "Save OBJ file (less prone to coordinate errors than STL) as:"
msgstr "Guardar archivo OBJ (menos propenso a errores de coordinación que STL) como:"
-#: src/slic3r/GUI/Tab.hpp:443
+#: src/slic3r/GUI/SavePresetDialog.cpp:190
+#: src/slic3r/GUI/SavePresetDialog.cpp:196
msgid "Save preset"
msgstr "Guardar ajuste inicial"
-#: src/slic3r/GUI/MainFrame.cpp:980
+#: src/slic3r/GUI/MainFrame.cpp:1681
msgid "Save presets bundle as:"
msgstr "Guarde el conjunto de ajustes iniciales como:"
-#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452
+#: src/slic3r/GUI/MainFrame.cpp:1032 src/slic3r/GUI/MainFrame.cpp:1034
msgid "Save Project &as"
msgstr "Gu&ardar proyecto como"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:114
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:107
msgid "Save project (3mf)"
msgstr "Guardar proyecto (3mf)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:115
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:108
msgid "Save project as (3mf)"
msgstr "Guarda el proyecto como (3mf)"
-#: src/slic3r/GUI/Plater.cpp:4839
+#: src/slic3r/GUI/Plater.cpp:4975
msgid "Save SL1 file as:"
msgstr "Guardar archivo SL1 como:"
-#: src/slic3r/GUI/MainFrame.cpp:838
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:744
+msgid "Save the selected options to preset \"%1%\"."
+msgstr "Guardar las opciones seleccionadas al ajuste \"%1%\"."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:740
+msgid "Save the selected options."
+msgstr "Guardar las opciones seleccionadas."
+
+#: src/slic3r/GUI/MainFrame.cpp:1539
msgid "Save zip file as:"
msgstr "Guardar archivo zip como:"
@@ -6346,221 +7491,244 @@ msgstr "Guardar archivo zip como:"
msgid "Saving mesh into the 3MF container failed."
msgstr "Error al guardar la malla en el contenedor 3MF."
-#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:47
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:230
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:500
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:518
-#: src/libslic3r/PrintConfig.cpp:3466
+#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:78
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:238
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:547
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563
+#: src/libslic3r/PrintConfig.cpp:3665
msgid "Scale"
msgstr "Escalar"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:459
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:507
msgid "Scale factors"
msgstr "Factores de escala"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:196
-msgid ""
-"Scale selection to fit print volume\n"
-"in Gizmo scale"
-msgstr ""
-"Redimensiona para ajustar el volumen de impresión\n"
-"en escala Gizmo"
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1724
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1852
msgid "Scale the selected object to fit the print volume"
msgstr "Escala los objetos seleccionados para ajustarse al volumen de impresión"
-#: src/libslic3r/PrintConfig.cpp:3475
+#: src/libslic3r/PrintConfig.cpp:3674
msgid "Scale to Fit"
msgstr "Escalar para Adaptarse"
-#: src/slic3r/GUI/Selection.cpp:939
+#: src/slic3r/GUI/Selection.cpp:988
msgid "Scale To Fit"
msgstr "Escalar para Adaptarse"
-#: src/libslic3r/PrintConfig.cpp:3476
+#: src/libslic3r/PrintConfig.cpp:3675
msgid "Scale to fit the given volume."
msgstr "Escalar para ajustarse al volumen dado."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1724
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1852
msgid "Scale to print volume"
msgstr "Escalar al volumen de impresión"
-#: src/libslic3r/PrintConfig.cpp:3467
+#: src/libslic3r/PrintConfig.cpp:3666
msgid "Scaling factor or percentage."
msgstr "Factor de escalado o porcentaje."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:505
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:545
msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue"
msgstr "Subida planificada a `%1%`. Mira Ventana -> Sube a la cola del gestor de impresión"
-#: src/libslic3r/PrintConfig.cpp:1621
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:46
+msgid "Seam painting"
+msgstr "Pintado de la costura"
+
+#: src/libslic3r/PrintConfig.cpp:1729
msgid "Seam position"
msgstr "Posición de la costura"
-#: src/libslic3r/PrintConfig.cpp:1642
+#: src/libslic3r/PrintConfig.cpp:1750
msgid "Seam preferred direction"
msgstr "Dirección de la costura"
-#: src/libslic3r/PrintConfig.cpp:1651
+#: src/libslic3r/PrintConfig.cpp:1759
msgid "Seam preferred direction jitter"
msgstr "Dirección preferida de unión jitter"
+#: src/slic3r/GUI/MainFrame.cpp:1207
+msgid "Searc&h"
+msgstr "Busca&r"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4402 src/slic3r/GUI/GLCanvas3D.cpp:4957
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 src/slic3r/GUI/Search.cpp:426
+msgid "Search"
+msgstr "Buscar"
+
+#: src/slic3r/GUI/ImGuiWrapper.cpp:803 src/slic3r/GUI/Search.cpp:460
+msgid "Search in English"
+msgstr "Buscar en Inglés"
+
+#: src/slic3r/GUI/MainFrame.cpp:1216
+msgid "Search in settings"
+msgstr "Buscar en los ajustes"
+
+#: src/slic3r/GUI/Tab.cpp:222
+msgid "Search in settings [%1%]"
+msgstr "Buscar en ajustes [%1%]"
+
#: src/slic3r/GUI/BonjourDialog.cpp:218
msgid "Searching for devices"
msgstr "Buscando dispositivos"
-#: src/slic3r/GUI/Plater.cpp:2858
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:41
msgid "Searching for optimal orientation"
msgstr "Buscando la orientación óptima"
-#: src/slic3r/GUI/GUI_App.cpp:1103
+#: src/slic3r/GUI/NotificationManager.hpp:321
+msgid "See more."
+msgstr "Ver más."
+
+#: src/slic3r/GUI/NotificationManager.hpp:322
+msgid "See Releases page."
+msgstr "Consultar página de lanzamientos."
+
+#: src/slic3r/GUI/GUI_App.cpp:1895
msgid "Select a gcode file:"
msgstr "Seleccione un archivo gcode:"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:126
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:121
msgid "Select all objects"
msgstr "Seleccionar todos los objetos"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1370
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217
msgid "Select all points"
msgstr "Seleccionar todos los puntos"
-#: src/slic3r/GUI/ConfigWizard.cpp:1976
+#: src/slic3r/GUI/ConfigWizard.cpp:2487
msgid "Select all standard printers"
msgstr "Selecciona todas las impresoras estándar"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1368
+#: src/slic3r/GUI/Plater.cpp:1422
+msgid "Select an action to apply to the file"
+msgstr "Selecciona una acción para aplicar al archivo"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215
msgid "Select by rectangle"
msgstr "Seleccionar mediante rectángulo"
-#: src/slic3r/GUI/MainFrame.cpp:944 src/slic3r/GUI/MainFrame.cpp:1006
+#: src/slic3r/GUI/MainFrame.cpp:1645 src/slic3r/GUI/MainFrame.cpp:1707
msgid "Select configuration to load:"
msgstr "Seleccione la configuración para cargar:"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:82
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:88
msgid "Select coordinate space, in which the transformation will be performed."
msgstr "Escoge el espacio de coordenadas en el que se realizará la transformación."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3971
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4458
msgid "Select extruder number:"
msgstr "Selecciona el número de extrusores:"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:138
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:134
msgid "Select Filament Settings Tab"
msgstr "Seleccionar pestaña de configuración de filamento"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:136
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:132
msgid "Select Plater Tab"
msgstr "Seleccionar pestaña de la Base de impresión"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:137
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:133
msgid "Select Print Settings Tab"
msgstr "Seleccione la pestaña Configuración de impresión"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:139
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:135
msgid "Select Printer Settings Tab"
msgstr "Selecciona pestaña de ajustes de impresora"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1265
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1396
msgid "Select showing settings"
msgstr "Seleccionar los ajustes mostrados"
-#: src/slic3r/GUI/GUI_App.cpp:629
+#: src/slic3r/GUI/GUI_App.cpp:1295
msgid "Select the language"
msgstr "Seleccione el idioma"
-#: src/slic3r/GUI/Tab.cpp:57
+#: src/slic3r/GUI/Tab.cpp:108
msgid "Select the print profiles this profile is compatible with."
msgstr "Seleccione los perfiles de impresión con las que este perfil es compatible."
-#: src/slic3r/GUI/Tab.cpp:51
+#: src/slic3r/GUI/Tab.cpp:102
msgid "Select the printers this profile is compatible with."
msgstr "Seleccione las impresoras con las que este perfil es compatible."
-#: src/slic3r/GUI/MainFrame.cpp:889
+#: src/slic3r/GUI/MainFrame.cpp:1590
msgid "Select the STL file to repair:"
msgstr "Seleccione el archivo STL para reparar:"
-#: src/slic3r/GUI/Preferences.cpp:237
+#: src/slic3r/GUI/Preferences.cpp:391
msgid "Select toolbar icon size in respect to the default one."
msgstr "Selecciona el tamaño del icono de la barra de herramientas con respecto al predeterminado."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3553
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4016
msgid "Select type of part"
msgstr "Selecciona el tipo de pieza"
-#: src/slic3r/GUI/Plater.cpp:638
+#: src/slic3r/GUI/Plater.cpp:504
msgid "Select what kind of pad do you need"
msgstr "Selecciona que tipo de pad necesitas"
-#: src/slic3r/GUI/Plater.cpp:498
+#: src/slic3r/GUI/Plater.cpp:364
msgid "Select what kind of support do you need"
msgstr "Selecciona qué clase de soporte necesitas"
-#: src/slic3r/GUI/DoubleSlider.cpp:1917
-msgid ""
-"Select YES if you want to delete all saved tool changes, \n"
-"NO if you want all tool changes switch to color changes, \n"
-"or CANCEL to leave it unchanged."
-msgstr ""
-"Escoge SI si deseas borrar todos los cambios de herramienta,\n"
-"NO si deseas que los cambios de herramienta sean cambios de color,\n"
-"o CANCELAR para no hacer cambios."
+#: src/slic3r/GUI/DoubleSlider.cpp:2135
+msgid "Select YES if you want to delete all saved tool changes, \nNO if you want all tool changes switch to color changes, \nor CANCEL to leave it unchanged."
+msgstr "Escoge SI si deseas borrar todos los cambios de herramienta,\nNO si deseas que los cambios de herramienta sean cambios de color,\no CANCELAR para no hacer cambios."
-#: src/slic3r/GUI/Selection.cpp:146
+#: src/slic3r/GUI/Selection.cpp:191
msgid "Selection-Add"
msgstr "Selección-Añadir"
-#: src/slic3r/GUI/Selection.cpp:376
+#: src/slic3r/GUI/Selection.cpp:421
msgid "Selection-Add All"
msgstr "Selección-Añadir todos"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3299
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3762
msgid "Selection-Add from list"
msgstr "Selección-Añadir de la lista"
-#: src/slic3r/GUI/GLCanvas3D.cpp:6598
+#: src/slic3r/GUI/GLCanvas3D.cpp:7193
msgid "Selection-Add from rectangle"
msgstr "Selección-Añadir del rectángulo"
-#: src/slic3r/GUI/Selection.cpp:256
+#: src/slic3r/GUI/Selection.cpp:301
msgid "Selection-Add Instance"
msgstr "Selección-Añadir Instancia"
-#: src/slic3r/GUI/Selection.cpp:219
+#: src/slic3r/GUI/Selection.cpp:264
msgid "Selection-Add Object"
msgstr "Selección-Añadir Objeto"
-#: src/slic3r/GUI/Selection.cpp:187
+#: src/slic3r/GUI/Selection.cpp:232
msgid "Selection-Remove"
msgstr "Selección-Retirar"
-#: src/slic3r/GUI/Selection.cpp:402
+#: src/slic3r/GUI/Selection.cpp:447
msgid "Selection-Remove All"
msgstr "Selección-Retirar todo"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3291
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3754
msgid "Selection-Remove from list"
msgstr "Selección-Retirar de la lista"
-#: src/slic3r/GUI/GLCanvas3D.cpp:6617
+#: src/slic3r/GUI/GLCanvas3D.cpp:7212
msgid "Selection-Remove from rectangle"
msgstr "Selección-Retirar del rectángulo"
-#: src/slic3r/GUI/Selection.cpp:275
+#: src/slic3r/GUI/Selection.cpp:320
msgid "Selection-Remove Instance"
msgstr "Selección-Retirar Instancia"
-#: src/slic3r/GUI/Selection.cpp:238
+#: src/slic3r/GUI/Selection.cpp:283
msgid "Selection-Remove Object"
msgstr "Selección-Retirar Objeto"
-#: src/slic3r/GUI/MainFrame.cpp:566
+#: src/slic3r/GUI/MainFrame.cpp:1172
msgid "Selects all objects"
msgstr "Seleccionar todos los objetos"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Plater.cpp:5522
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 src/slic3r/GUI/Plater.cpp:5707
msgid "Send G-code"
msgstr "Enviar código G"
@@ -6568,29 +7736,25 @@ msgstr "Enviar código G"
msgid "Send G-Code to printer host"
msgstr "Enviar el código G al host de impresión"
-#: src/slic3r/GUI/MainFrame.cpp:481
+#: src/slic3r/GUI/MainFrame.cpp:1072
msgid "Send to print current plate as G-code"
msgstr "Enviar para imprimir la plataforma actual como código G"
-#: src/slic3r/GUI/Plater.cpp:878 src/slic3r/GUI/Plater.cpp:5522
+#: src/slic3r/GUI/Plater.cpp:753 src/slic3r/GUI/Plater.cpp:5707
msgid "Send to printer"
msgstr "Enviar a la impresora"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1305
+#: src/slic3r/GUI/GLCanvas3D.cpp:1312
msgid "Seq."
msgstr "Sec."
-#: src/slic3r/GUI/Tab.cpp:1231
+#: src/slic3r/GUI/Tab.cpp:1561
msgid "Sequential printing"
msgstr "Impresión secuencial"
-#: src/slic3r/GUI/Tab.cpp:1901 src/libslic3r/PrintConfig.cpp:1661
-msgid "Serial port"
-msgstr "Puerto serial"
-
-#: src/libslic3r/PrintConfig.cpp:1669
-msgid "Serial port speed"
-msgstr "Velocidad del puerto serial"
+#: src/slic3r/GUI/Preferences.cpp:230
+msgid "Sequential slider applied only to top layer"
+msgstr "Deslizador secuencial aplicado solo a la capa superior"
#: src/slic3r/GUI/FirmwareDialog.cpp:807
msgid "Serial port:"
@@ -6600,17 +7764,16 @@ msgstr "Puerto serie:"
msgid "Service name"
msgstr "Nombre del servicio"
-#: src/slic3r/GUI/Tab.cpp:1802 src/slic3r/GUI/Tab.cpp:2046
-#: src/slic3r/GUI/Tab.cpp:3176
+#: src/slic3r/GUI/Tab.cpp:3509 src/slic3r/GUI/Tab.cpp:3588
msgid "Set"
msgstr "Ajuste"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1599
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1611
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1728
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1740
msgid "Set as a Separated Object"
msgstr "Establecer como Objeto Separado"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1611
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1740
msgid "Set as a Separated Objects"
msgstr "Establecer como Objetos Separados"
@@ -6618,7 +7781,7 @@ msgstr "Establecer como Objetos Separados"
msgid "Set extruder change for every"
msgstr "Establecer cambio de extrusor para cada"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1671
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1800
msgid "Set extruder for selected items"
msgstr "Establecer el extrusor para elementos seleccionados"
@@ -6626,7 +7789,7 @@ msgstr "Establecer el extrusor para elementos seleccionados"
msgid "Set extruder sequence"
msgstr "Establecer secuencia extrusor"
-#: src/slic3r/GUI/DoubleSlider.cpp:1532
+#: src/slic3r/GUI/DoubleSlider.cpp:1728
msgid "Set extruder sequence for the entire print"
msgstr "Fija la secuencia del extrusor para toda la impresión"
@@ -6634,84 +7797,100 @@ msgstr "Fija la secuencia del extrusor para toda la impresión"
msgid "Set extruder(tool) sequence"
msgstr "Establecer secuencia extrusor(herramienta)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:243
+msgid "Set left thumb as active"
+msgstr "Establecer el pulgar izquierdo como activo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
+msgid "Set lower thumb as active"
+msgstr "Establecer el pulgar inferior como activo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
msgid "Set lower thumb to current slider thumb"
msgstr "Coloca el pulgar inferior en el control deslizante actual"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:297
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:305
msgid "Set Mirror"
msgstr "Establecer Reflejo"
-#: src/slic3r/GUI/Plater.cpp:3944
+#: src/slic3r/GUI/Plater.cpp:3862
msgid "Set number of instances"
msgstr "Establecer número de instancias"
-#: src/slic3r/GUI/Plater.cpp:4756
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:4860
+#, possible-c-format
msgid "Set numbers of copies to %d"
msgstr "Establecer el número de copias a %d"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:781
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:828
msgid "Set Orientation"
msgstr "Establecer Orientación"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:750
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:797
msgid "Set Position"
msgstr "Establecer Posición"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4581 src/slic3r/GUI/Selection.cpp:1513
msgid "Set Printable"
msgstr "Establecer Imprimible"
-#: src/slic3r/GUI/Selection.cpp:1475
+#: src/slic3r/GUI/Selection.cpp:1515
msgid "Set Printable Instance"
msgstr "Establecer Instancia imprimible"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:846
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:244
+msgid "Set right thumb as active"
+msgstr "Establecer el pulgar derecho como activo"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1836
+msgid "Set ruler mode"
+msgstr "Establecer modo de regla"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:893
msgid "Set Scale"
msgstr "Establecer Escala"
-#: src/libslic3r/PrintConfig.cpp:2393
+#: src/libslic3r/PrintConfig.cpp:2536
msgid "Set the actual LCD display orientation inside the SLA printer. Portrait mode will flip the meaning of display width and height parameters and the output images will be rotated by 90 degrees."
msgstr "Establece la orientación real de la pantalla LCD dentro de la impresora SLA. El modo retrato cambiará el significado de los parámetros de ancho y alto de la pantalla y las imágenes de salida girarán 90 grados."
-#: src/slic3r/GUI/ConfigWizard.cpp:932
+#: src/slic3r/GUI/ConfigWizard.cpp:1298
msgid "Set the shape of your printer's bed."
msgstr "Define la forma de la base de impresión de tu impresora."
-#: src/libslic3r/PrintConfig.cpp:556
+#: src/libslic3r/PrintConfig.cpp:592
msgid "Set this to a non-zero value to allow a manual extrusion width. If left to zero, Slic3r derives extrusion widths from the nozzle diameter (see the tooltips for perimeter extrusion width, infill extrusion width etc). If expressed as percentage (for example: 230%), it will be computed over layer height."
msgstr "Ajuste este valor distinto de cero para permitir un ancho de extrusión manual. Si se deja a cero, Slic3r obtiene anchuras de extrusión del diámetro de la boquilla (consulte la información sobre herramientas para conocer el ancho de extrusión, el ancho de extrusión de relleno, etc.). Si se expresa como porcentaje (por ejemplo: 230%), se computará sobre la altura de la capa."
-#: src/libslic3r/PrintConfig.cpp:448
+#: src/libslic3r/PrintConfig.cpp:484
msgid "Set this to a non-zero value to set a manual extrusion width for external perimeters. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 200%), it will be computed over layer height."
msgstr "Ajuste este valor distinto de cero para establecer un ancho de extrusión manual para perímetros externos. Si se deja en cero, se usará el ancho de extrusión por defecto si se establece, de lo contrario se usará 1.125 x diámetro de la boquilla. Si se expresa como porcentaje (por ejemplo, 200%), se computará sobre la altura de la capa."
-#: src/libslic3r/PrintConfig.cpp:878
+#: src/libslic3r/PrintConfig.cpp:920
msgid "Set this to a non-zero value to set a manual extrusion width for first layer. You can use this to force fatter extrudates for better adhesion. If expressed as percentage (for example 120%) it will be computed over first layer height. If set to zero, it will use the default extrusion width."
msgstr "Ajuste este valor distinto de cero para establecer un ancho de extrusión manual para la primera capa. Puede usar esto para forzar extrusiones más gordas para una mejor adhesión. Si se expresa como porcentaje (por ejemplo, 120%), se calculará sobre la altura de la primera capa. Si se establece en cero, usará el ancho de extrusión predeterminado."
-#: src/libslic3r/PrintConfig.cpp:1758
+#: src/libslic3r/PrintConfig.cpp:1873
msgid "Set this to a non-zero value to set a manual extrusion width for infill for solid surfaces. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 90%) it will be computed over layer height."
msgstr "Ajuste este valor distinto de cero para establecer un ancho de extrusión manual para el relleno de superficies sólidas. Si se deja en cero, se usará el ancho de extrusión por defecto si se establece, de lo contrario se usará 1.125 x diámetro de la boquilla. Si se expresa como porcentaje (por ejemplo, 90%), se calculará sobre la altura de la capa."
-#: src/libslic3r/PrintConfig.cpp:2107
+#: src/libslic3r/PrintConfig.cpp:2250
msgid "Set this to a non-zero value to set a manual extrusion width for infill for top surfaces. You may want to use thinner extrudates to fill all narrow regions and get a smoother finish. If left zero, default extrusion width will be used if set, otherwise nozzle diameter will be used. If expressed as percentage (for example 90%) it will be computed over layer height."
msgstr "Ajuste este valor distinto de cero para establecer un ancho de extrusión manual para el relleno de las superficies superiores. Es posible que desee utilizar extrusiones más delgadas para llenar todas las regiones estrechas y obtener un acabado más suave. Si se deja en cero, se usará el ancho de extrusión por defecto si se establece, de lo contrario se usará el diámetro de la boquilla. Si se expresa como porcentaje (por ejemplo, 90%), se calculará sobre la altura de la capa."
-#: src/libslic3r/PrintConfig.cpp:1011
+#: src/libslic3r/PrintConfig.cpp:1055
msgid "Set this to a non-zero value to set a manual extrusion width for infill. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. You may want to use fatter extrudates to speed up the infill and make your parts stronger. If expressed as percentage (for example 90%) it will be computed over layer height."
msgstr "Ajuste este valor distinto de cero para establecer un ancho de extrusión manual para relleno. Si se deja en cero, se usará el ancho de extrusión por defecto si se establece, de lo contrario se usará 1.125 x diámetro de la boquilla. Es posible que desee extrusiones más gordas para acelerar el relleno y fortalecer sus partes. Si se expresa como porcentaje (por ejemplo, 90%), se calculará sobre la altura de la capa."
-#: src/libslic3r/PrintConfig.cpp:1419
+#: src/libslic3r/PrintConfig.cpp:1527
msgid "Set this to a non-zero value to set a manual extrusion width for perimeters. You may want to use thinner extrudates to get more accurate surfaces. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 200%) it will be computed over layer height."
msgstr "Ajuste este valor distinto de cero para establecer un ancho de extrusión manual para los perímetros. Es posible que desee utilizar extrusiones más delgadas para obtener superficies más precisas. Si se deja en cero, se usará el ancho de extrusión por defecto si se establece, de lo contrario se usará 1.125 x diámetro de la boquilla. Si se expresa como porcentaje (por ejemplo, 200%), se calculará sobre la altura de la capa."
-#: src/libslic3r/PrintConfig.cpp:1948
+#: src/libslic3r/PrintConfig.cpp:2090
msgid "Set this to a non-zero value to set a manual extrusion width for support material. If left zero, default extrusion width will be used if set, otherwise nozzle diameter will be used. If expressed as percentage (for example 90%) it will be computed over layer height."
msgstr "Ajuste este valor distinto de cero para establecer un ancho de extrusión manual para el material de soporte. Si se deja en cero, se usará el ancho de extrusión por defecto si se establece, de lo contrario se usará el diámetro de la boquilla. Si se expresa como porcentaje (por ejemplo, 90%), se calculará sobre la altura de la capa."
-#: src/libslic3r/PrintConfig.cpp:512
+#: src/libslic3r/PrintConfig.cpp:548
msgid "Set this to the clearance radius around your extruder. If the extruder is not centered, choose the largest value for safety. This setting is used to check for collisions and to display the graphical preview in the plater."
msgstr "Ajuste este parámetro según el radio de espacio libre alrededor de su extrusor. Si el extrusor no está centrado, elija el valor más grande para seguridad. Esta configuración se utiliza para verificar colisiones y mostrar la vista previa gráfica en la bandeja."
@@ -6719,87 +7898,98 @@ msgstr "Ajuste este parámetro según el radio de espacio libre alrededor de su
msgid "Set this to the maximum height that can be reached by your extruder while printing."
msgstr "Ajusta este valor a la altura máxima que puede alcanzar el extrusor mientras imprime."
-#: src/libslic3r/PrintConfig.cpp:501
+#: src/libslic3r/PrintConfig.cpp:537
msgid "Set this to the vertical distance between your nozzle tip and (usually) the X carriage rods. In other words, this is the height of the clearance cylinder around your extruder, and it represents the maximum depth the extruder can peek before colliding with other printed objects."
msgstr "Ajuste este valor según la distancia vertical entre la punta de la boquilla y (generalmente) las barras X del carro. En otras palabras, esta es la altura del cilindro de holgura alrededor de su extrusor, y representa la profundidad máxima que el extrusor puede asomar antes de colisionar con otros objetos impresos."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4581 src/slic3r/GUI/Selection.cpp:1513
msgid "Set Unprintable"
msgstr "Establecer No imprimible"
-#: src/slic3r/GUI/Selection.cpp:1475
+#: src/slic3r/GUI/Selection.cpp:1515
msgid "Set Unprintable Instance"
msgstr "Establecer Instancia No Imprimible"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:221
+msgid "Set upper thumb as active"
+msgstr "Establecer el pulgar superior como activo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
msgid "Set upper thumb to current slider thumb"
msgstr "Coloca el pulgar superior en el control deslizante actual"
-#: src/libslic3r/PrintConfig.cpp:3509
-msgid ""
-"Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:trace\n"
-"For example. loglevel=2 logs fatal, error and warning level messages."
-msgstr ""
-"Ajusta el nivel de avisos: 0:fallo, 1:error, 2:peligro, 3:info, 4:depuración, 5:traza\n"
-"Por ejemplo. loglevel=2 registrará mensajes de fallo, error y peligro."
+#: src/libslic3r/PrintConfig.cpp:3714
+msgid "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:trace\nFor example. loglevel=2 logs fatal, error and warning level messages."
+msgstr "Ajusta el nivel de avisos: 0:fallo, 1:error, 2:peligro, 3:info, 4:depuración, 5:traza\nPor ejemplo. loglevel=2 registrará mensajes de fallo, error y peligro."
-#: src/slic3r/GUI/BedShapeDialog.cpp:155
+#: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/MainFrame.cpp:1969
msgid "Settings"
msgstr "Ajustes"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2507
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2899
msgid "Settings for height range"
msgstr "Ajustes para rango de alturas"
-#: src/slic3r/GUI/ConfigManipulation.cpp:162
+#: src/slic3r/GUI/Preferences.cpp:431
+msgid "Settings in non-modal window"
+msgstr "Configuración en ventana no modal"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:161
msgid "Shall I adjust those settings for supports?"
msgstr "¿Debo ajustar esa configuración para los soportes?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:89
+#: src/slic3r/GUI/ConfigManipulation.cpp:88
msgid "Shall I adjust those settings in order to enable Spiral Vase?"
msgstr "¿Debo ajustar esa configuración para habilitar el modo Vaso Espiral?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:119
+#: src/slic3r/GUI/ConfigManipulation.cpp:118
msgid "Shall I adjust those settings in order to enable the Wipe Tower?"
msgstr "¿Debo ajustar esa configuración para habilitar la Torre de Limpieza?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:210
+#: src/slic3r/GUI/ConfigManipulation.cpp:209
msgid "Shall I switch to rectilinear fill pattern?"
msgstr "¿Debo cambiar al patrón de relleno rectilíneo?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:139
+#: src/slic3r/GUI/ConfigManipulation.cpp:138
msgid "Shall I synchronize support layers in order to enable the Wipe Tower?"
msgstr "¿Debo sincronizar las capas de soporte para habilitar la Torre de Limpieza?"
-#: src/slic3r/GUI/BedShapeDialog.cpp:66 src/slic3r/GUI/GUI_ObjectList.cpp:2059
+#: src/slic3r/GUI/BedShapeDialog.cpp:156 src/slic3r/GUI/BedShapeDialog.cpp:222
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2215
msgid "Shape"
msgstr "Aspecto"
-#: src/slic3r/GUI/GUI_Preview.cpp:256
+#: src/slic3r/GUI/GUI_Preview.cpp:338 src/slic3r/GUI/GUI_Preview.cpp:1478
msgid "Shells"
msgstr "Carcasas"
-#: src/slic3r/GUI/GLCanvas3D.cpp:249
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33
+msgid "Shift + Left mouse button"
+msgstr "Mayús + botón izquierdo del ratón"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:241
msgid "Shift + Left mouse button:"
msgstr "Mayús + botón izquierdo del ratón:"
-#: src/slic3r/GUI/GLCanvas3D.cpp:255
+#: src/slic3r/GUI/GLCanvas3D.cpp:245
msgid "Shift + Right mouse button:"
msgstr "Mayús + botón derecho del ratón:"
-#: src/slic3r/GUI/GUI_Preview.cpp:231
+#: src/slic3r/GUI/GUI_Preview.cpp:286 src/slic3r/GUI/GUI_Preview.cpp:288
msgid "Show"
msgstr "Mostrar"
-#: src/slic3r/GUI/MainFrame.cpp:701
+#: src/slic3r/GUI/MainFrame.cpp:926 src/slic3r/GUI/MainFrame.cpp:1325
msgid "Show &Configuration Folder"
msgstr "Mostrar carpeta &Configuración"
-#: src/slic3r/GUI/MainFrame.cpp:676
+#: src/slic3r/GUI/MainFrame.cpp:1294
msgid "Show &labels"
msgstr "Muestra &etiquetas"
-#: src/slic3r/GUI/MainFrame.cpp:705
+#: src/slic3r/GUI/MainFrame.cpp:933 src/slic3r/GUI/MainFrame.cpp:937
+#: src/slic3r/GUI/MainFrame.cpp:1329
msgid "Show about dialog"
msgstr "Mostrar Acerca de"
@@ -6807,549 +7997,619 @@ msgstr "Mostrar Acerca de"
msgid "Show advanced settings"
msgstr "Mostrar ajustes avanzados"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:159
+#: src/slic3r/GUI/Preferences.cpp:120
+msgid "Show drop project dialog"
+msgstr "Mostrar cuadro de diálogo al soltar proyecto"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:157
msgid "Show error message"
msgstr "Muestra mensaje de error"
-#: src/slic3r/GUI/Preferences.cpp:95
+#: src/slic3r/GUI/DoubleSlider.cpp:1832
+msgid "Show estimated print time"
+msgstr "Mostrar tiempo estimado de impresión"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1832
+msgid "Show estimated print time on the ruler"
+msgstr "Mostrar tiempo estimado de impresión en la regla"
+
+#: src/slic3r/GUI/Preferences.cpp:112
msgid "Show incompatible print and filament presets"
msgstr "Mostrar impresiones incompatibles y ajustes iniciales de filamentos"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:151
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:145
msgid "Show keyboard shortcuts list"
msgstr "Muestra lista de atajos de teclado"
-#: src/slic3r/GUI/MainFrame.cpp:676
+#: src/slic3r/GUI/GCodeViewer.cpp:2591
+msgid "Show normal mode"
+msgstr "Mostrar modo normal"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1828
+msgid "Show object height"
+msgstr "Mostrar altura del objeto"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1828
+msgid "Show object height on the ruler"
+msgstr "Mostrar altura del objeto en la regla"
+
+#: src/slic3r/GUI/MainFrame.cpp:1294
msgid "Show object/instance labels in 3D scene"
msgstr "Muestra etiquetas de pieza/repetición en vista 3D"
+#: src/slic3r/GUI/Preferences.cpp:213
+msgid "Show sidebar collapse/expand button"
+msgstr "Mostrar botón ocultar/expandir barra lateral"
+
#: src/slic3r/GUI/WipeTowerDialog.cpp:377
msgid "Show simplified settings"
msgstr "Muestra los ajustes simplificados"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:52
+#: src/slic3r/GUI/Preferences.cpp:169 src/slic3r/GUI/Preferences.cpp:171
+msgid "Show splash screen"
+msgstr "Mostrar pantalla splash"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2586
+msgid "Show stealth mode"
+msgstr "Mostrar modo silencioso"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51
msgid "Show supports"
msgstr "Muestra soportes"
-#: src/slic3r/GUI/MainFrame.cpp:699
+#: src/slic3r/GUI/MainFrame.cpp:924 src/slic3r/GUI/MainFrame.cpp:1323
msgid "Show system information"
msgstr "Mostrar la información del sistema"
-#: src/slic3r/GUI/MainFrame.cpp:626
+#: src/slic3r/GUI/MainFrame.cpp:1234
msgid "Show the 3D editing view"
msgstr "Muestra la vista de edición 3D"
-#: src/slic3r/GUI/MainFrame.cpp:629
+#: src/slic3r/GUI/MainFrame.cpp:1237
msgid "Show the 3D slices preview"
msgstr "Muestra la vista 3D preliminar de las rebanadas"
-#: src/slic3r/GUI/MainFrame.cpp:617
+#: src/slic3r/GUI/MainFrame.cpp:1224
msgid "Show the filament settings"
msgstr "Mostrar los ajustes de filamento"
-#: src/libslic3r/PrintConfig.cpp:3372
+#: src/libslic3r/PrintConfig.cpp:3571
msgid "Show the full list of print/G-code configuration options."
msgstr "Muestra la lista completa de opciones de configuración de impresión/G-code."
-#: src/libslic3r/PrintConfig.cpp:3377
+#: src/libslic3r/PrintConfig.cpp:3576
msgid "Show the full list of SLA print configuration options."
msgstr "Muestra la lista completa de opciones de configuración de impresión SLA."
-#: src/slic3r/GUI/MainFrame.cpp:708
+#: src/slic3r/GUI/MainFrame.cpp:941 src/slic3r/GUI/MainFrame.cpp:1332
msgid "Show the list of the keyboard shortcuts"
msgstr "Mostrar la lista de los atajos de teclado"
-#: src/slic3r/GUI/MainFrame.cpp:606
+#: src/slic3r/GUI/MainFrame.cpp:1216
msgid "Show the plater"
msgstr "Mostrar la base"
-#: src/slic3r/GUI/MainFrame.cpp:614
+#: src/slic3r/GUI/MainFrame.cpp:1221
msgid "Show the print settings"
msgstr "Mostrar los ajustes de impresión"
-#: src/slic3r/GUI/MainFrame.cpp:621
+#: src/slic3r/GUI/MainFrame.cpp:1228
msgid "Show the printer settings"
msgstr "Mostrar la configuración de la impresora"
-#: src/libslic3r/PrintConfig.cpp:3366
+#: src/libslic3r/PrintConfig.cpp:3565
msgid "Show this help."
msgstr "Mostrar esta ayuda."
-#: src/slic3r/GUI/MainFrame.cpp:701
+#: src/slic3r/GUI/MainFrame.cpp:926 src/slic3r/GUI/MainFrame.cpp:1325
msgid "Show user configuration folder (datadir)"
msgstr "Mostrar carpeta de configuración de usuario (datadir)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:185
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:182
msgid "Show/Hide 3Dconnexion devices settings dialog"
msgstr "Mostrar/Ocultar cuadro de ajustes dispositivos 3Dconnexion"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
-msgid "Show/Hide Legend"
-msgstr "Muestra/Oculta Leyenda"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
+msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled"
+msgstr "Mostrar/Ocultar el cuadro de diálogo de configuración de dispositivos 3Dconnexion, si está habilitado"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:146
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+msgid "Show/Hide Legend & Estimated printing time"
+msgstr "Mostrar/Ocultar Leyenda y Tiempo de impresión estimado"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+msgid "Show/Hide Legend and Estimated printing time"
+msgstr "Mostrar/Ocultar Leyenda y Tiempo de impresión estimado"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:141
msgid "Show/Hide object/instance labels"
msgstr "Muestra/Oculta etiquetas de pieza/repetición"
-#: src/slic3r/GUI/GUI_App.cpp:813 src/slic3r/GUI/wxExtensions.cpp:753
+#: src/slic3r/GUI/GUI_App.cpp:1504 src/slic3r/GUI/wxExtensions.cpp:673
msgid "Simple"
msgstr "Sencillo"
-#: src/slic3r/GUI/ConfigWizard.cpp:820
+#: src/slic3r/GUI/ConfigWizard.cpp:1179
msgid "Simple mode"
msgstr "Modo Simple"
-#: src/slic3r/GUI/GUI_App.cpp:813
+#: src/slic3r/GUI/GUI_App.cpp:1504
msgid "Simple View Mode"
msgstr "Modo de visualización sencillo"
-#: src/slic3r/GUI/Tab.cpp:2298 src/slic3r/GUI/Tab.cpp:2306
+#: src/slic3r/GUI/Tab.cpp:2467 src/slic3r/GUI/Tab.cpp:2475
msgid "Single extruder MM setup"
msgstr "Ajuste para MM con un solo extrusor"
-#: src/libslic3r/PrintConfig.cpp:1845
+#: src/libslic3r/PrintConfig.cpp:1987
msgid "Single Extruder Multi Material"
msgstr "Extrusor único de múltiples materiales"
-#: src/slic3r/GUI/Tab.cpp:1867
-msgid ""
-"Single Extruder Multi Material is selected, \n"
-"and all extruders must have the same diameter.\n"
-"Do you want to change the diameter for all extruders to first extruder nozzle diameter value?"
-msgstr ""
-"Multi Material en extrusor único seleccionado,\n"
-"y todos los extrusores deben tener el mismo diámetro.\n"
-"¿Deseas cambiar el diámetro de todos los extrusores al valor del diámetro del nozzle del primer extrusor?"
+#: src/slic3r/GUI/Tab.cpp:2101
+msgid "Single Extruder Multi Material is selected, \nand all extruders must have the same diameter.\nDo you want to change the diameter for all extruders to first extruder nozzle diameter value?"
+msgstr "Multi Material en extrusor único seleccionado,\ny todos los extrusores deben tener el mismo diámetro.\n¿Deseas cambiar el diámetro de todos los extrusores al valor del diámetro del nozzle del primer extrusor?"
-#: src/slic3r/GUI/Tab.cpp:2307
+#: src/slic3r/GUI/Tab.cpp:2476
msgid "Single extruder multimaterial parameters"
msgstr "Parámetros multimaterial para un sólo extrusor"
-#: src/slic3r/GUI/BedShapeDialog.cpp:77
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:232 src/slic3r/GUI/Plater.cpp:160
-#: src/slic3r/GUI/Tab.cpp:2324
+#: src/slic3r/GUI/Preferences.cpp:120 src/libslic3r/PrintConfig.cpp:3689
+msgid "Single instance mode"
+msgstr "Modo de instancia única"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:93
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:240 src/slic3r/GUI/Plater.cpp:166
+#: src/slic3r/GUI/Tab.cpp:2493
msgid "Size"
msgstr "Tamaño"
-#: src/slic3r/GUI/Tab.cpp:1797 src/slic3r/GUI/Tab.cpp:2041
+#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:2241
msgid "Size and coordinates"
msgstr "Tamaño y coordenadas"
-#: src/slic3r/GUI/BedShapeDialog.cpp:78
+#: src/slic3r/GUI/BedShapeDialog.cpp:110
msgid "Size in X and Y of the rectangular plate."
msgstr "Tamaño en X e Y de la placa rectangular."
-#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1111
-#: src/libslic3r/ExtrusionEntity.cpp:318
+#: src/slic3r/GUI/GUI_Preview.cpp:310 src/slic3r/GUI/Tab.cpp:1439
+#: src/libslic3r/ExtrusionEntity.cpp:323 src/libslic3r/ExtrusionEntity.cpp:354
msgid "Skirt"
msgstr "Falda"
-#: src/slic3r/GUI/Tab.cpp:1110
+#: src/slic3r/GUI/Tab.cpp:1438
msgid "Skirt and brim"
msgstr "Falda y balsa"
-#: src/libslic3r/PrintConfig.cpp:1687
+#: src/libslic3r/PrintConfig.cpp:1795
msgid "Skirt height"
msgstr "Altura de la falda"
-#: src/libslic3r/PrintConfig.cpp:1696
+#: src/libslic3r/PrintConfig.cpp:1811
msgid "Skirt Loops"
msgstr "Vueltas de la falda"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1334
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1181
msgid "SLA gizmo keyboard shortcuts"
msgstr "SLA gizmo atajos de teclado"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1058
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:924
msgid "SLA gizmo turned off"
msgstr "Gizmo SLA apagado"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1017
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897
msgid "SLA gizmo turned on"
msgstr "Gizmo SLA encendido"
-#: src/slic3r/GUI/Plater.cpp:818 src/slic3r/GUI/Preset.cpp:1524
+#: src/slic3r/GUI/Plater.cpp:693 src/libslic3r/Preset.cpp:1303
msgid "SLA material"
msgstr "Material SLA"
-#: src/slic3r/GUI/ConfigWizard.cpp:2015
+#: src/slic3r/GUI/ConfigWizard.cpp:2526
msgid "SLA Material Profiles Selection"
msgstr "Selección Perfiles de Material SLA"
-#: src/libslic3r/PrintConfig.cpp:2470 src/libslic3r/PrintConfig.cpp:2471
+#: src/libslic3r/PrintConfig.cpp:2613 src/libslic3r/PrintConfig.cpp:2614
msgid "SLA material type"
msgstr "Tipo Material SLA"
-#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2015
+#: src/slic3r/GUI/ConfigWizard.cpp:1872 src/slic3r/GUI/ConfigWizard.cpp:2526
msgid "SLA Materials"
msgstr "Materiales SLA"
-#: src/slic3r/GUI/Preset.cpp:1523
+#: src/libslic3r/Preset.cpp:1302
msgid "SLA print"
msgstr "Impresión SLA"
-#: src/libslic3r/PrintConfig.cpp:2578
+#: src/libslic3r/PrintConfig.cpp:2721
msgid "SLA print material notes"
msgstr "Notas del material de impresión de SLA"
-#: src/slic3r/GUI/Plater.cpp:817
+#: src/slic3r/GUI/Plater.cpp:692
msgid "SLA print settings"
msgstr "Ajustes de impresión SLA"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:996
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869
msgid "SLA Support Points"
msgstr "Puntos de soporte SLA"
-#: src/slic3r/GUI/GLCanvas3D.cpp:687
-msgid "SLA supports outside the print area were detected"
-msgstr "Se detectaron soportes SLA fuera del área de impresión"
+#: src/slic3r/GUI/GLCanvas3D.cpp:635
+msgid "SLA supports outside the print area were detected."
+msgstr "Se detectaron soportes SLA fuera del área de impresión."
-#: src/slic3r/GUI/ConfigWizard.cpp:1530
+#: src/slic3r/GUI/ConfigWizard.cpp:1931
msgid "SLA Technology Printers"
msgstr "Impresoras de tecnología SLA"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1432
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
msgid "Slab"
msgstr "Rebanada"
-#: src/libslic3r/PrintConfig.cpp:1333
+#: src/libslic3r/PrintConfig.cpp:1441
msgid "Slic3r can upload G-code files to a printer host. This field must contain the kind of the host."
msgstr "Slic3r puede subir archivos de código G a un host de impresión. Este campo debe contener el tipo de host."
-#: src/libslic3r/PrintConfig.cpp:105
+#: src/libslic3r/PrintConfig.cpp:107
msgid "Slic3r can upload G-code files to a printer host. This field should contain the API Key or the password required for authentication."
msgstr "Slic3r puede subir archivos de código G a un host de impresión. Este campo debe contener la clave API o la contraseña requerida para la autenticación."
-#: src/libslic3r/PrintConfig.cpp:98
-msgid "Slic3r can upload G-code files to a printer host. This field should contain the hostname, IP address or URL of the printer host instance."
-msgstr "Slic3r puede subir archivos G-code a un host de impresión. Este campo debería contener el nombre de equipo, dirección IP o el URL de la instancia del host."
+#: src/libslic3r/PrintConfig.cpp:100
+msgid "Slic3r can upload G-code files to a printer host. This field should contain the hostname, IP address or URL of the printer host instance. Print host behind HAProxy with basic auth enabled can be accessed by putting the user name and password into the URL in the following format: https://username:password@your-octopi-address/"
+msgstr "Slic3r puede cargar archivos de código G a un host de impresión. Este campo debe contener el nombre de host, la dirección IP o la URL de la instancia de host de la impresora. Se puede acceder al host de impresión mediante un HAProxy con la autenticación básica habilitada ingresando el nombre de usuario y la contraseña en la URL en el siguiente formato: https://nombredeusuario:contraseña@su-dirección-de-octopi /"
-#: src/libslic3r/PrintConfig.cpp:1299
+#: src/libslic3r/PrintConfig.cpp:1407
msgid "Slic3r will not scale speed down below this speed."
msgstr "Slic3r no escalará la velocidad por debajo de esta velocidad."
-#: src/libslic3r/PrintConfig.cpp:3359
+#: src/libslic3r/PrintConfig.cpp:3558
msgid "Slice"
msgstr "Laminar"
-#: src/slic3r/GUI/MainFrame.cpp:512
+#: src/slic3r/GUI/MainFrame.cpp:1113
msgid "Slice a file into a G-code"
msgstr "Laminar un archivo en un código G"
-#: src/slic3r/GUI/MainFrame.cpp:518
+#: src/slic3r/GUI/MainFrame.cpp:1119
msgid "Slice a file into a G-code, save as"
msgstr "Laminar un archivo en un código G, guárdar como"
-#: src/libslic3r/PrintConfig.cpp:87
+#: src/libslic3r/PrintConfig.cpp:89
msgid "Slice gap closing radius"
msgstr "Radio de cierre de los huecos al laminar"
-#: src/slic3r/GUI/Plater.cpp:892 src/slic3r/GUI/Plater.cpp:3121
-#: src/slic3r/GUI/Plater.cpp:5110
+#: src/slic3r/GUI/Plater.cpp:767 src/slic3r/GUI/Plater.cpp:2921
+#: src/slic3r/GUI/Plater.cpp:5237
msgid "Slice now"
msgstr "Laminar ahora"
-#: src/libslic3r/PrintConfig.cpp:3333
+#: src/libslic3r/PrintConfig.cpp:3526
msgid "Slice the model and export SLA printing layers as PNG."
msgstr "Laminar el modelo y exportar las capas de impresión de SLA como PNG."
-#: src/libslic3r/PrintConfig.cpp:3354
+#: src/libslic3r/PrintConfig.cpp:3547
msgid "Slice the model and export toolpaths as G-code."
msgstr "Laminar el modelo y exportar las trayectorias como código G."
-#: src/libslic3r/PrintConfig.cpp:3360
+#: src/libslic3r/PrintConfig.cpp:3559
msgid "Slice the model as FFF or SLA based on the printer_technology configuration value."
msgstr "Laminar el modelo como FFF o SLA basado en el valor de configuración de printer_technology."
-#: src/slic3r/GUI/Plater.cpp:216
+#: src/slic3r/GUI/Plater.cpp:222
msgid "Sliced Info"
msgstr "Información del laminado"
-#: src/slic3r/GUI/MainFrame.cpp:847 src/slic3r/GUI/Plater.cpp:3121
-#: src/slic3r/GUI/Plater.cpp:5107 src/slic3r/GUI/Tab.cpp:1221
-#: src/slic3r/GUI/Tab.cpp:3662
+#: src/slic3r/GUI/MainFrame.cpp:1548 src/slic3r/GUI/Plater.cpp:2921
+#: src/slic3r/GUI/Plater.cpp:5234 src/slic3r/GUI/Tab.cpp:1551
+#: src/slic3r/GUI/Tab.cpp:4081
msgid "Slicing"
msgstr "Rebanando"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:134
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:184
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:170
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:219
msgid "Slicing complete"
msgstr "Laminado terminado"
-#: src/libslic3r/SLAPrint.cpp:760
+#: src/libslic3r/SLAPrint.cpp:780
msgid "Slicing done"
msgstr "Laminado terminado"
-#: src/slic3r/GUI/MainFrame.cpp:874
+#: src/slic3r/GUI/MainFrame.cpp:1575
msgid "Slicing Done!"
msgstr "¡Laminado realizado!"
-#: src/libslic3r/SLAPrintSteps.cpp:245
+#: src/slic3r/GUI/NotificationManager.cpp:751
+msgid "Slicing finished."
+msgstr "Laminado finalizado."
+
+#: src/libslic3r/SLAPrintSteps.cpp:247
msgid "Slicing had to be stopped due to an internal error: Inconsistent slice index."
msgstr "El laminado se ha tenido que parar debido a un error interno: Ãndice de laminado inconsistente."
-#: src/libslic3r/SLAPrintSteps.cpp:45
+#: src/libslic3r/SLAPrintSteps.cpp:46
msgid "Slicing model"
msgstr "Rebanando modelo"
-#: src/libslic3r/SLAPrintSteps.cpp:49
+#: src/libslic3r/SLAPrintSteps.cpp:50
msgid "Slicing supports"
msgstr "Soportes para el laminado"
-#: src/libslic3r/PrintConfig.cpp:2414
+#: src/libslic3r/PrintConfig.cpp:2557
msgid "Slow"
msgstr "Lenta"
-#: src/libslic3r/PrintConfig.cpp:1705
+#: src/libslic3r/PrintConfig.cpp:1820
msgid "Slow down if layer print time is below"
msgstr "Disminuya la velocidad si el tiempo de impresión de la capa está por debajo"
-#: src/libslic3r/PrintConfig.cpp:2415
+#: src/libslic3r/PrintConfig.cpp:2558
msgid "Slow tilt"
msgstr "Inclinación lenta"
-#: src/libslic3r/PrintConfig.cpp:1715
+#: src/libslic3r/PrintConfig.cpp:1830
msgid "Small perimeters"
msgstr "Perímetros pequeños"
-#: src/slic3r/GUI/GLCanvas3D.cpp:288
+#: src/libslic3r/PrintConfig.cpp:2801
+msgid "Small pillar diameter percent"
+msgstr "Porcentaje de diámetro de pilar pequeño"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:274
msgid "Smooth"
msgstr "Suave"
-#: src/slic3r/GUI/GLCanvas3D.cpp:258
+#: src/slic3r/GUI/GLCanvas3D.cpp:247
msgid "Smoothing"
msgstr "Suavizado"
-#: src/slic3r/GUI/GUI_App.cpp:839
+#: src/slic3r/GUI/GUI_App.cpp:1540
msgid "Snapshot name"
msgstr "Nombre de la instantánea"
-#: src/slic3r/GUI/MainFrame.cpp:686
+#: src/slic3r/GUI/MainFrame.cpp:911 src/slic3r/GUI/MainFrame.cpp:1310
msgid "Software &Releases"
msgstr "Lanzamientos de Softwa&re"
-#: src/slic3r/GUI/PresetHints.cpp:184
+#: src/slic3r/GUI/PresetHints.cpp:183
msgid "solid infill"
msgstr "relleno sólido"
-#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:314
-#: src/libslic3r/PrintConfig.cpp:1756 src/libslic3r/PrintConfig.cpp:1767
+#: src/slic3r/GUI/GUI_Preview.cpp:305 src/libslic3r/ExtrusionEntity.cpp:318
+#: src/libslic3r/ExtrusionEntity.cpp:344 src/libslic3r/PrintConfig.cpp:1871
+#: src/libslic3r/PrintConfig.cpp:1882
msgid "Solid infill"
msgstr "Relleno sólido"
-#: src/libslic3r/PrintConfig.cpp:1744
+#: src/libslic3r/PrintConfig.cpp:1859
msgid "Solid infill every"
msgstr "Relleno sólido cada"
-#: src/libslic3r/PrintConfig.cpp:1736
+#: src/libslic3r/PrintConfig.cpp:1851
msgid "Solid infill extruder"
msgstr "Extrusor para el relleno sólido"
-#: src/libslic3r/PrintConfig.cpp:1727
+#: src/libslic3r/PrintConfig.cpp:1842
msgid "Solid infill threshold area"
msgstr "Ãrea del umbral de relleno sólido"
-#: src/slic3r/GUI/Tab.cpp:1065 src/libslic3r/PrintConfig.cpp:1780
+#: src/slic3r/GUI/Tab.cpp:1387 src/libslic3r/PrintConfig.cpp:1895
msgid "Solid layers"
msgstr "Capas sólidas"
-#: src/libslic3r/PrintConfig.cpp:754
+#: src/libslic3r/PrintConfig.cpp:790
msgid "Soluble material"
msgstr "Material soluble"
-#: src/libslic3r/PrintConfig.cpp:755
+#: src/libslic3r/PrintConfig.cpp:791
msgid "Soluble material is most likely used for a soluble support."
msgstr "El material soluble se usa muy probablemente para un soporte soluble."
-#: src/libslic3r/PrintConfig.cpp:937
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:735
+msgid "Some fields are too long to fit. Right mouse click reveals the full text."
+msgstr "Algunos campos son demasiado largos para caber. El clic derecho del mouse muestra el texto completo."
+
+#: src/libslic3r/PrintConfig.cpp:981
msgid "Some G/M-code commands, including temperature control and others, are not universal. Set this option to your printer's firmware to get a compatible output. The \"No extrusion\" flavor prevents PrusaSlicer from exporting any extrusion value at all."
msgstr "Algunos comandos de códigos G/M, incluidos el control de temperatura y otros, no son universales. Configura esta opción en el firmware de tu impresora para obtener una salida compatible. El tipo \"Sin extrusión\" evita que PrusaSlicer exporte ningún valor de extrusión."
-#: src/slic3r/GUI/GLCanvas3D.cpp:688
-msgid "Some objects are not visible"
-msgstr "Algunas piezas no son visibles"
+#: src/slic3r/GUI/Plater.cpp:2309
+#, possible-c-format
+msgid "Some object(s) in file %s looks like saved in inches.\nShould I consider them as a saved in inches and convert them?"
+msgstr "Alguno(s) objetos del archivo %s parecen estar guardados en pulgadas.\n¿Debería considerarlos como guardados en pulgadas y convertirlos?"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:636
+msgid "Some objects are not visible."
+msgstr "Algunos objetos no son visibles."
-#: src/libslic3r/Print.cpp:1226
+#: src/libslic3r/Print.cpp:1252
msgid "Some objects are too close; your extruder will collide with them."
msgstr "Algunos objetos están demasiado cerca; el extrusor colisionará con ellos."
-#: src/libslic3r/Print.cpp:1228
+#: src/libslic3r/Print.cpp:1254
msgid "Some objects are too tall and cannot be printed without extruder collisions."
msgstr "Algunos objetos son demasiado altos y no se pueden imprimir sin que colisione el extrusor."
-#: src/libslic3r/PrintConfig.cpp:2824
+#: src/libslic3r/PrintConfig.cpp:2988
msgid "Some objects can get along with a few smaller pads instead of a single big one. This parameter defines how far the center of two smaller pads should be. If theyare closer, they will get merged into one pad."
msgstr "Algunos objetos pueden llevarse bien con unas pocas pads más pequeñas en lugar de una sola grande. Este parámetro define a qué distancia debe estar el centro de dos pads más pequeñas. Si están más cerca, se fusionarán en una sola pad."
-#: src/libslic3r/PrintConfig.cpp:2187
+#: src/libslic3r/PrintConfig.cpp:2330
msgid "Some printers or printer setups may have difficulties printing with a variable layer height. Enabled by default."
msgstr "Algunas impresoras o configuraciones de impresora pueden tener dificultades para imprimir con una altura de capa variable. Habilitado por defecto."
-#: src/libslic3r/PrintConfig.cpp:1984
+#: src/slic3r/GUI/GLCanvas3D.cpp:3967
+msgid "Spacing"
+msgstr "Separación"
+
+#: src/libslic3r/PrintConfig.cpp:2126
msgid "Spacing between interface lines. Set zero to get a solid interface."
-msgstr "Espaciado entre líneas de interfaz. Establezca cero para obtener una interfaz sólida."
+msgstr "Separación entre líneas de interfaz. Establezca cero para obtener una interfaz sólida."
+
+#: src/libslic3r/PrintConfig.cpp:1155
+msgid "Spacing between ironing passes"
+msgstr "Separación entre pasadas de alisado"
-#: src/libslic3r/PrintConfig.cpp:2018
+#: src/libslic3r/PrintConfig.cpp:2160
msgid "Spacing between support material lines."
-msgstr "Espaciado entre las líneas de material de soporte."
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:616
-#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/Tab.cpp:1145
-#: src/libslic3r/PrintConfig.cpp:235 src/libslic3r/PrintConfig.cpp:458
-#: src/libslic3r/PrintConfig.cpp:919 src/libslic3r/PrintConfig.cpp:1048
-#: src/libslic3r/PrintConfig.cpp:1431 src/libslic3r/PrintConfig.cpp:1668
-#: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1768
-#: src/libslic3r/PrintConfig.cpp:2118
+msgstr "Separación entre las líneas de material de soporte."
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:655
+#: src/slic3r/GUI/GUI_Preview.cpp:278 src/slic3r/GUI/Tab.cpp:1474
+#: src/libslic3r/PrintConfig.cpp:269 src/libslic3r/PrintConfig.cpp:494
+#: src/libslic3r/PrintConfig.cpp:963 src/libslic3r/PrintConfig.cpp:1092
+#: src/libslic3r/PrintConfig.cpp:1165 src/libslic3r/PrintConfig.cpp:1539
+#: src/libslic3r/PrintConfig.cpp:1776 src/libslic3r/PrintConfig.cpp:1831
+#: src/libslic3r/PrintConfig.cpp:1883 src/libslic3r/PrintConfig.cpp:2261
msgid "Speed"
msgstr "Velocidad"
-#: src/libslic3r/PrintConfig.cpp:1670
-msgid "Speed (baud) of USB/serial port for printer connection."
-msgstr "Velocidad (baudios) del puerto USB / serie para la conexión de la impresora."
-
-#: src/libslic3r/GCode/PreviewData.cpp:351
+#: src/slic3r/GUI/GCodeViewer.cpp:2238 src/libslic3r/GCode/PreviewData.cpp:356
msgid "Speed (mm/s)"
msgstr "Velocidad (mm/s)"
-#: src/libslic3r/PrintConfig.cpp:920
+#: src/libslic3r/PrintConfig.cpp:964
msgid "Speed for filling small gaps using short zigzag moves. Keep this reasonably low to avoid too much shaking and resonance issues. Set zero to disable gaps filling."
msgstr "Velocidad para llenar pequeños espacios usando movimientos cortos de zigzag. Mantenga esto razonablemente bajo para evitar demasiados problemas de vibración y sacudidas. Establezca cero para desactivar el llenado de huecos."
-#: src/slic3r/GUI/Tab.cpp:1158
+#: src/slic3r/GUI/Tab.cpp:1488
msgid "Speed for non-print moves"
msgstr "Velocidad para movimientos sin impresión"
-#: src/libslic3r/PrintConfig.cpp:1432
+#: src/libslic3r/PrintConfig.cpp:1540
msgid "Speed for perimeters (contours, aka vertical shells). Set to zero for auto."
msgstr "Velocidad para perímetros (contornos, también conocidos como conchas verticales). Establecer a cero para auto."
-#: src/slic3r/GUI/Tab.cpp:1146
+#: src/slic3r/GUI/Tab.cpp:1475
msgid "Speed for print moves"
msgstr "Velocidad para movimientos de impresión"
-#: src/libslic3r/PrintConfig.cpp:236
+#: src/libslic3r/PrintConfig.cpp:270
msgid "Speed for printing bridges."
msgstr "Velocidad para imprimir puentes."
-#: src/libslic3r/PrintConfig.cpp:1769
+#: src/libslic3r/PrintConfig.cpp:1884
msgid "Speed for printing solid regions (top/bottom/internal horizontal shells). This can be expressed as a percentage (for example: 80%) over the default infill speed above. Set to zero for auto."
msgstr "Velocidad para imprimir regiones sólidas (superior / inferior / conchas horizontales internas). Esto se puede expresar como un porcentaje (por ejemplo: 80%) sobre la velocidad de relleno predeterminada anterior. Establecer a cero para auto."
-#: src/libslic3r/PrintConfig.cpp:1993
+#: src/libslic3r/PrintConfig.cpp:2135
msgid "Speed for printing support material interface layers. If expressed as percentage (for example 50%) it will be calculated over support material speed."
msgstr "Velocidad para imprimir capas de interfaz de material de soporte. Si se expresa como porcentaje (por ejemplo, 50%), se calculará sobre la velocidad del material de soporte."
-#: src/libslic3r/PrintConfig.cpp:2027
+#: src/libslic3r/PrintConfig.cpp:2169
msgid "Speed for printing support material."
msgstr "Velocidad para imprimir material de soporte."
-#: src/libslic3r/PrintConfig.cpp:1049
+#: src/libslic3r/PrintConfig.cpp:1093
msgid "Speed for printing the internal fill. Set to zero for auto."
msgstr "Velocidad para imprimir el relleno interno. Establecer a cero para auto."
-#: src/libslic3r/PrintConfig.cpp:2119
+#: src/libslic3r/PrintConfig.cpp:2262
msgid "Speed for printing top solid layers (it only applies to the uppermost external layers and not to their internal solid layers). You may want to slow down this to get a nicer surface finish. This can be expressed as a percentage (for example: 80%) over the solid infill speed above. Set to zero for auto."
msgstr "Velocidad para imprimir capas sólidas superiores (solo se aplica a las capas externas superiores y no a sus capas sólidas internas). Es posible que desee reducir la velocidad para obtener un acabado de superficie más agradable. Esto se puede expresar como un porcentaje (por ejemplo: 80%) sobre la velocidad de relleno sólido anterior. Establecer a cero para auto."
-#: src/libslic3r/PrintConfig.cpp:2153
+#: src/libslic3r/PrintConfig.cpp:2296
msgid "Speed for travel moves (jumps between distant extrusion points)."
msgstr "Velocidad para movimientos (saltos entre puntos de extrusión distantes)."
-#: src/libslic3r/PrintConfig.cpp:659
+#: src/libslic3r/PrintConfig.cpp:695
msgid "Speed of the first cooling move"
msgstr "Velocidad del primer movimiento de enfriamiento"
-#: src/libslic3r/PrintConfig.cpp:678
+#: src/libslic3r/PrintConfig.cpp:714
msgid "Speed of the last cooling move"
msgstr "Velocidad del último movimiento de enfriamiento"
-#: src/libslic3r/PrintConfig.cpp:616
+#: src/libslic3r/PrintConfig.cpp:652
msgid "Speed used at the very beginning of loading phase."
msgstr "Velocidad utilizada al inicio de la fase de carga."
-#: src/libslic3r/PrintConfig.cpp:608
+#: src/libslic3r/PrintConfig.cpp:644
msgid "Speed used for loading the filament on the wipe tower."
msgstr "Velocidad empleada para cargar el filamento en la torre de limpieza."
-#: src/libslic3r/PrintConfig.cpp:624
+#: src/libslic3r/PrintConfig.cpp:660
msgid "Speed used for unloading the filament on the wipe tower (does not affect initial part of unloading just after ramming)."
msgstr "Velocidad empleada para descargar el filamento en la torre de limpieza (no afecta a la fase inicial de la descarga, sólo después de empujar)."
-#: src/libslic3r/PrintConfig.cpp:633
+#: src/libslic3r/PrintConfig.cpp:669
msgid "Speed used for unloading the tip of the filament immediately after ramming."
msgstr "Velocidad utilizada para descargar la punta del filamento inmediatamente después del ramming."
-#: src/slic3r/GUI/Mouse3DController.cpp:296
+#: src/slic3r/GUI/Mouse3DController.cpp:279
msgid "Speed:"
msgstr "Velocidad:"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1432
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
msgid "Sphere"
msgstr "Esfera"
-#: src/libslic3r/PrintConfig.cpp:1794
+#: src/libslic3r/PrintConfig.cpp:1909
msgid "Spiral vase"
msgstr "Modo vaso"
-#: src/slic3r/GUI/ConfigManipulation.cpp:90
+#: src/slic3r/GUI/ConfigManipulation.cpp:89
msgid "Spiral Vase"
msgstr "Modo Vaso Espiral"
-#: src/slic3r/GUI/Plater.cpp:4019 src/slic3r/GUI/Plater.cpp:4034
-#: src/slic3r/GUI/Plater.cpp:4048 src/libslic3r/PrintConfig.cpp:3471
+#: src/slic3r/GUI/Plater.cpp:3939 src/slic3r/GUI/Plater.cpp:3954
+#: src/slic3r/GUI/Plater.cpp:3972 src/libslic3r/PrintConfig.cpp:3670
msgid "Split"
msgstr "Dividir"
-#: src/slic3r/GUI/Plater.cpp:4019
+#: src/slic3r/GUI/Plater.cpp:3939
msgid "Split the selected object"
msgstr "Dividir el objeto seleccionado"
-#: src/slic3r/GUI/Plater.cpp:4014 src/slic3r/GUI/Plater.cpp:4034
+#: src/slic3r/GUI/Plater.cpp:3934 src/slic3r/GUI/Plater.cpp:3954
msgid "Split the selected object into individual objects"
msgstr "Dividir el objeto seleccionado en objetos individuales"
-#: src/slic3r/GUI/Plater.cpp:4016 src/slic3r/GUI/Plater.cpp:4048
+#: src/slic3r/GUI/Plater.cpp:3936 src/slic3r/GUI/Plater.cpp:3972
msgid "Split the selected object into individual sub-parts"
msgstr "Dividir el objeto seleccionado en subpartes individuales"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4550
+#: src/slic3r/GUI/GLCanvas3D.cpp:4916
msgid "Split to objects"
msgstr "Partir en varias piezas"
-#: src/slic3r/GUI/Plater.cpp:2981
+#: src/slic3r/GUI/Plater.cpp:2774
msgid "Split to Objects"
msgstr "Partir en Varias Piezas"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4560 src/slic3r/GUI/GUI_ObjectList.cpp:1487
+#: src/slic3r/GUI/GLCanvas3D.cpp:4926 src/slic3r/GUI/GUI_ObjectList.cpp:1618
msgid "Split to parts"
msgstr "Separar en piezas"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2274
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2440
msgid "Split to Parts"
msgstr "Separar en Piezas"
-#: src/slic3r/GUI/ConfigWizard.cpp:289
+#: src/libslic3r/PrintConfig.cpp:812
+msgid "Spool weight"
+msgstr "Peso de la bobina"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:307
msgid "Standard"
msgstr "Estándar"
-#: src/libslic3r/PrintConfig.cpp:846
+#: src/libslic3r/PrintConfig.cpp:884
msgid "Stars"
msgstr "Estrellas"
-#: src/slic3r/GUI/MainFrame.cpp:405
+#: src/slic3r/GUI/MainFrame.cpp:986
msgid "Start a new project"
msgstr "Empezar un nuevo proyecto"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29
msgid "Start at height"
msgstr "Comenzar en altura"
-#: src/slic3r/GUI/Tab.cpp:1528 src/slic3r/GUI/Tab.cpp:1976
-#: src/libslic3r/PrintConfig.cpp:1813 src/libslic3r/PrintConfig.cpp:1828
+#: src/slic3r/GUI/Tab.cpp:1873 src/slic3r/GUI/Tab.cpp:2161
+#: src/libslic3r/PrintConfig.cpp:1928 src/libslic3r/PrintConfig.cpp:1943
msgid "Start G-code"
-msgstr "Comenzar el código G"
+msgstr "Código G inicial"
-#: src/slic3r/GUI/MainFrame.cpp:532
+#: src/slic3r/GUI/MainFrame.cpp:1133
msgid "Start new slicing process"
msgstr "Comenzar un nuevo proceso de laminado"
@@ -7357,7 +8617,15 @@ msgstr "Comenzar un nuevo proceso de laminado"
msgid "Start printing after upload"
msgstr "Empezar a imprimir después de subir"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:151
+#: src/slic3r/GUI/GUI_App.cpp:396
+msgid "Start the application"
+msgstr "Inicia el programa"
+
+#: src/slic3r/GUI/GUI_App.cpp:386
+msgid "Starting with %1% 2.3, configuration directory on Linux has changed (according to XDG Base Directory Specification) to \n%2%.\n\nThis directory did not exist yet (maybe you run the new version for the first time).\nHowever, an old %1% configuration directory was detected in \n%3%.\n\nConsider moving the contents of the old directory to the new location in order to access your profiles, etc.\nNote that if you decide to downgrade %1% in future, it will use the old location again.\n\nWhat do you want to do now?"
+msgstr "Comenzando con %1% 2.3, el directorio de configuración en Linux ha cambiado (de acuerdo con la Especificación de directorio base de XDG) a\n%2%.\n\nEste directorio aún no existía (tal vez ejecutes la nueva versión por primera vez).\nSin embargo, se detectó un directorio de configuración antiguo %1% en\n%3%.\n\nPuedes mover el contenido del directorio antiguo a la nueva ubicación para acceder a tus perfiles, etc.\nTen en cuenta que si decides retroceder de versión %1% en el futuro, volverás a utilizar la ubicación anterior.\n\n¿Qué quieres hacer ahora?"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:149
msgid "Status"
msgstr "Estado"
@@ -7365,859 +8633,873 @@ msgstr "Estado"
msgid "Status:"
msgstr "Estado:"
-#: src/slic3r/GUI/Tab.cpp:2209
+#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2378
msgid "Stealth"
msgstr "Silencio"
-#: src/slic3r/GUI/Plater.cpp:1291
+#: src/slic3r/GUI/Plater.cpp:1187 src/slic3r/GUI/Plater.cpp:1235
msgid "stealth mode"
msgstr "modo silencioso"
-#: src/slic3r/GUI/Plater.cpp:4985
-#, c-format
+#: src/slic3r/GUI/GCodeViewer.cpp:2557
+msgid "Stealth mode"
+msgstr "Modo silencioso"
+
+#: src/slic3r/GUI/Plater.cpp:5118
+#, possible-c-format
msgid "STL file exported to %s"
msgstr "Archivo STL exportado a %s"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29
msgid "Stop at height"
msgstr "Parar en altura"
-#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:1928
+#: src/slic3r/GUI/GUI_App.cpp:1781
+msgid "Stop them and continue anyway?"
+msgstr "¿Detenerlos y continuar de todos modos?"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:295
msgid "Success!"
msgstr "¡Éxito!"
-#: src/slic3r/GUI/PresetHints.cpp:203
+#: src/slic3r/GUI/Plater.cpp:2047
+#, possible-c-format
+msgid "Successfully unmounted. The device %s(%s) can now be safely removed from the computer."
+msgstr "Desmontado con éxito. El dispositivo %s (%s) ahora se puede retirar de forma segura del ordenador."
+
+#: src/slic3r/GUI/PresetHints.cpp:202
msgid "support"
msgstr "soporte"
-#: src/libslic3r/PrintConfig.cpp:2692
+#: src/libslic3r/PrintConfig.cpp:2856
msgid "Support base diameter"
msgstr "Diámetro de la base del soporte"
-#: src/libslic3r/PrintConfig.cpp:2702
+#: src/libslic3r/PrintConfig.cpp:2866
msgid "Support base height"
msgstr "Altura de la base del soporte"
-#: src/libslic3r/PrintConfig.cpp:2711
+#: src/libslic3r/PrintConfig.cpp:2875
msgid "Support base safety distance"
msgstr "Distancia de seguridad de la base de soportes"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
msgid "Support Blocker"
msgstr "Bloqueo de soporte"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3551
+#: src/libslic3r/PrintConfig.cpp:895
+msgid "Support Cubic"
+msgstr "Soporte Cúbico"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
msgid "Support Enforcer"
msgstr "Refuerzo de soporte"
-#: src/slic3r/GUI/ConfigManipulation.cpp:163
+#: src/slic3r/GUI/ConfigManipulation.cpp:162
msgid "Support Generator"
msgstr "Generador de Soportes"
-#: src/slic3r/GUI/Tab.cpp:3608
+#: src/slic3r/GUI/Tab.cpp:4018
msgid "Support head"
msgstr "Cabeza del soporte"
-#: src/libslic3r/PrintConfig.cpp:2620
-msgid "Support head front diameter"
-msgstr "Diámetro del frontal de la cabeza del soporte"
-
-#: src/libslic3r/PrintConfig.cpp:2629
-msgid "Support head penetration"
-msgstr "Penetración de la cabeza del soporte"
-
-#: src/libslic3r/PrintConfig.cpp:2638
-msgid "Support head width"
-msgstr "Ancho de la cabeza del soporte"
-
-#: src/slic3r/GUI/PresetHints.cpp:213
+#: src/slic3r/GUI/PresetHints.cpp:212
msgid "support interface"
msgstr "interfaz de soporte"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:97
-#: src/slic3r/GUI/GUI_ObjectList.cpp:615 src/slic3r/GUI/GUI_Preview.cpp:246
-#: src/slic3r/GUI/Tab.cpp:1120 src/slic3r/GUI/Tab.cpp:1121
-#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/PrintConfig.cpp:370
-#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1866
-#: src/libslic3r/PrintConfig.cpp:1872 src/libslic3r/PrintConfig.cpp:1880
-#: src/libslic3r/PrintConfig.cpp:1892 src/libslic3r/PrintConfig.cpp:1902
-#: src/libslic3r/PrintConfig.cpp:1910 src/libslic3r/PrintConfig.cpp:1925
-#: src/libslic3r/PrintConfig.cpp:1946 src/libslic3r/PrintConfig.cpp:1958
-#: src/libslic3r/PrintConfig.cpp:1974 src/libslic3r/PrintConfig.cpp:1983
-#: src/libslic3r/PrintConfig.cpp:1992 src/libslic3r/PrintConfig.cpp:2003
-#: src/libslic3r/PrintConfig.cpp:2017 src/libslic3r/PrintConfig.cpp:2025
-#: src/libslic3r/PrintConfig.cpp:2026 src/libslic3r/PrintConfig.cpp:2035
-#: src/libslic3r/PrintConfig.cpp:2043 src/libslic3r/PrintConfig.cpp:2057
+#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:95
+#: src/slic3r/GUI/GUI_ObjectList.cpp:654 src/slic3r/GUI/GUI_Preview.cpp:311
+#: src/slic3r/GUI/Tab.cpp:1449 src/slic3r/GUI/Tab.cpp:1450
+#: src/libslic3r/ExtrusionEntity.cpp:324 src/libslic3r/ExtrusionEntity.cpp:356
+#: src/libslic3r/PrintConfig.cpp:404 src/libslic3r/PrintConfig.cpp:1610
+#: src/libslic3r/PrintConfig.cpp:2008 src/libslic3r/PrintConfig.cpp:2014
+#: src/libslic3r/PrintConfig.cpp:2022 src/libslic3r/PrintConfig.cpp:2034
+#: src/libslic3r/PrintConfig.cpp:2044 src/libslic3r/PrintConfig.cpp:2052
+#: src/libslic3r/PrintConfig.cpp:2067 src/libslic3r/PrintConfig.cpp:2088
+#: src/libslic3r/PrintConfig.cpp:2100 src/libslic3r/PrintConfig.cpp:2116
+#: src/libslic3r/PrintConfig.cpp:2125 src/libslic3r/PrintConfig.cpp:2134
+#: src/libslic3r/PrintConfig.cpp:2145 src/libslic3r/PrintConfig.cpp:2159
+#: src/libslic3r/PrintConfig.cpp:2167 src/libslic3r/PrintConfig.cpp:2168
+#: src/libslic3r/PrintConfig.cpp:2177 src/libslic3r/PrintConfig.cpp:2185
+#: src/libslic3r/PrintConfig.cpp:2199
msgid "Support material"
msgstr "Material de soporte"
-#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:320
-#: src/libslic3r/PrintConfig.cpp:1991
+#: src/slic3r/GUI/GUI_Preview.cpp:312 src/libslic3r/ExtrusionEntity.cpp:325
+#: src/libslic3r/ExtrusionEntity.cpp:358 src/libslic3r/PrintConfig.cpp:2133
msgid "Support material interface"
msgstr "Interfaz del material de soporte"
-#: src/libslic3r/PrintConfig.cpp:2044
+#: src/libslic3r/PrintConfig.cpp:2186
msgid "Support material will not be generated for overhangs whose slope angle (90° = vertical) is above the given threshold. In other words, this value represent the most horizontal slope (measured from the horizontal plane) that you can print without support material. Set to zero for automatic detection (recommended)."
msgstr "El material de soporte no se generará para voladizos cuyo ángulo de inclinación (90 ° = vertical) esté por encima del umbral dado. En otras palabras, este valor representa la pendiente más horizontal (medida desde el plano horizontal) que puede imprimir sin material de soporte. Ajuste a cero para la detección automática (recomendado)."
-#: src/libslic3r/PrintConfig.cpp:1964
+#: src/libslic3r/PrintConfig.cpp:2106
msgid "Support material/raft interface extruder"
msgstr "Extrusor para el material de soporte o balsa"
-#: src/libslic3r/PrintConfig.cpp:1937
+#: src/libslic3r/PrintConfig.cpp:2079
msgid "Support material/raft/skirt extruder"
msgstr "Extrusor para el material de soporte/falda/balsa"
-#: src/slic3r/GUI/Plater.cpp:500 src/libslic3r/PrintConfig.cpp:1901
-#: src/libslic3r/PrintConfig.cpp:2674
+#: src/slic3r/GUI/Plater.cpp:366 src/libslic3r/PrintConfig.cpp:2043
+#: src/libslic3r/PrintConfig.cpp:2838
msgid "Support on build plate only"
msgstr "Soporte en la base solamente"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:888
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:762
msgid "Support parameter change"
msgstr "Cambio de parámetros de soporte"
-#: src/slic3r/GUI/Tab.cpp:3613
+#: src/slic3r/GUI/Tab.cpp:4023
msgid "Support pillar"
msgstr "Pilares de soporte"
-#: src/libslic3r/PrintConfig.cpp:2658
-msgid "Support pillar connection mode"
-msgstr "Modo de conexión de los pilares de soporte"
-
-#: src/libslic3r/PrintConfig.cpp:2648
-msgid "Support pillar diameter"
-msgstr "Diámetro de los puntos de soporte"
-
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55
-#: src/libslic3r/PrintConfig.cpp:2764
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54
+#: src/libslic3r/PrintConfig.cpp:2928
msgid "Support points density"
msgstr "Densidad de los puntos de soporte"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1196
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1048
msgid "Support points edit"
msgstr "Edición de puntos de soporte"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/GUI_ObjectList.cpp:624
-#: src/slic3r/GUI/Plater.cpp:495 src/slic3r/GUI/Tab.cpp:3604
-#: src/slic3r/GUI/Tab.cpp:3605 src/libslic3r/PrintConfig.cpp:2614
-#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2630
-#: src/libslic3r/PrintConfig.cpp:2639 src/libslic3r/PrintConfig.cpp:2649
-#: src/libslic3r/PrintConfig.cpp:2675 src/libslic3r/PrintConfig.cpp:2682
-#: src/libslic3r/PrintConfig.cpp:2693 src/libslic3r/PrintConfig.cpp:2703
-#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2725
-#: src/libslic3r/PrintConfig.cpp:2735 src/libslic3r/PrintConfig.cpp:2744
-#: src/libslic3r/PrintConfig.cpp:2754 src/libslic3r/PrintConfig.cpp:2765
-#: src/libslic3r/PrintConfig.cpp:2773
+#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:663
+#: src/slic3r/GUI/Plater.cpp:361 src/slic3r/GUI/Tab.cpp:4014
+#: src/slic3r/GUI/Tab.cpp:4015 src/libslic3r/PrintConfig.cpp:2757
+#: src/libslic3r/PrintConfig.cpp:2764 src/libslic3r/PrintConfig.cpp:2773
+#: src/libslic3r/PrintConfig.cpp:2782 src/libslic3r/PrintConfig.cpp:2792
+#: src/libslic3r/PrintConfig.cpp:2802 src/libslic3r/PrintConfig.cpp:2839
+#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2857
+#: src/libslic3r/PrintConfig.cpp:2867 src/libslic3r/PrintConfig.cpp:2876
+#: src/libslic3r/PrintConfig.cpp:2889 src/libslic3r/PrintConfig.cpp:2899
+#: src/libslic3r/PrintConfig.cpp:2908 src/libslic3r/PrintConfig.cpp:2918
+#: src/libslic3r/PrintConfig.cpp:2929 src/libslic3r/PrintConfig.cpp:2937
msgid "Supports"
msgstr "Soportes"
-#: src/slic3r/GUI/Plater.cpp:1194
+#: src/slic3r/GUI/Plater.cpp:1103
msgid "supports and pad"
msgstr "soportes y pad"
-#: src/libslic3r/PrintConfig.cpp:1092
+#: src/libslic3r/PrintConfig.cpp:1185
msgid "Supports remaining times"
msgstr "Compatible con tiempos restantes"
-#: src/libslic3r/PrintConfig.cpp:1101
+#: src/libslic3r/PrintConfig.cpp:1194
msgid "Supports stealth mode"
msgstr "Soporta modo silencioso"
-#: src/slic3r/GUI/ConfigManipulation.cpp:159
-msgid ""
-"Supports work better, if the following feature is enabled:\n"
-"- Detect bridging perimeters"
-msgstr ""
-"Los soportes funcionan mejor si la siguiente característica está habilitada:\n"
-"- Detectar perímetros con puentes"
+#: src/slic3r/GUI/ConfigManipulation.cpp:158
+msgid "Supports work better, if the following feature is enabled:\n- Detect bridging perimeters"
+msgstr "Los soportes funcionan mejor si la siguiente característica está habilitada:\n- Detectar perímetros con puentes"
-#: src/slic3r/GUI/Preferences.cpp:87
+#: src/slic3r/GUI/Preferences.cpp:104
msgid "Suppress \" - default - \" presets"
msgstr "Suprima los ajustes iniciales \"- predeterminado -\""
-#: src/slic3r/GUI/Preferences.cpp:89
+#: src/slic3r/GUI/Preferences.cpp:106
msgid "Suppress \" - default - \" presets in the Print / Filament / Printer selections once there are any other valid presets available."
msgstr "Suprima los ajustes iniciales \"- predeterminado -\" en las selecciones Imprimir / Filamento / Impresora una vez que haya otros ajustes preestablecidos disponibles."
-#: src/slic3r/GUI/MainFrame.cpp:826
+#: src/slic3r/GUI/Preferences.cpp:276
+msgid "Suppress to open hyperlink in browser"
+msgstr "Suprimir para abrir hipervínculo en el navegador"
+
+#: src/slic3r/GUI/MainFrame.cpp:1527
msgid "SVG"
msgstr "SVG"
-#: src/slic3r/GUI/DoubleSlider.cpp:1144
+#: src/slic3r/GUI/Mouse3DController.cpp:318
+msgid "Swap Y/Z axes"
+msgstr "Alternar ejes Y/Z"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+msgid "Switch between Editor/Preview"
+msgstr "Cambiar entre Editor/Previsualización"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1273
msgid "Switch code to Change extruder"
msgstr "Cambiar código para cambiar extrusor"
-#: src/slic3r/GUI/DoubleSlider.cpp:1179
+#: src/slic3r/GUI/DoubleSlider.cpp:1306
msgid "Switch code to Color change (%1%) for:"
msgstr "Código para cambiar de color (%1%) para:"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:140
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:136
msgid "Switch to 3D"
msgstr "Cambiar a 3D"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1376
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223
msgid "Switch to editing mode"
msgstr "Cambiar al modo edición"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:141
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:137
msgid "Switch to Preview"
msgstr "Cambiar a Previsualización"
-#: src/slic3r/GUI/wxExtensions.cpp:703
-#, c-format
+#: src/slic3r/GUI/GLCanvas3D.cpp:4302 src/slic3r/GUI/GLCanvas3D.cpp:4939
+msgid "Switch to Settings"
+msgstr "Cambiar a Ajustes"
+
+#: src/slic3r/GUI/wxExtensions.cpp:623
+#, possible-c-format
msgid "Switch to the %s mode"
msgstr "Cambiar al modo %s"
-#: src/slic3r/GUI/GUI_App.cpp:882
-msgid ""
-"Switching the language will trigger application restart.\n"
-"You will lose content of the plater."
-msgstr ""
-"Cambiar el idioma necesita reiniciar la aplicación.\n"
-"Perderás todo el contenido situado en la base."
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:542
+msgid "Switching Presets: Unsaved Changes"
+msgstr "Cambio de ajustes preestablecidos: Cambios No guardados"
+
+#: src/slic3r/GUI/GUI_App.cpp:1608
+msgid "Switching the language will trigger application restart.\nYou will lose content of the plater."
+msgstr "Cambiar el idioma necesita reiniciar la aplicación.\nPerderás todo el contenido situado en la base."
#: src/slic3r/GUI/WipeTowerDialog.cpp:365
-msgid ""
-"Switching to simple settings will discard changes done in the advanced mode!\n"
-"\n"
-"Do you want to proceed?"
-msgstr ""
-"¡Cambiar a los ajustes sencillos descartará los cambios realizados en el modo avanzado!\n"
-"\n"
-"¿Quiere continuar?"
+msgid "Switching to simple settings will discard changes done in the advanced mode!\n\nDo you want to proceed?"
+msgstr "¡Cambiar a los ajustes sencillos descartará los cambios realizados en el modo avanzado!\n\n¿Quiere continuar?"
-#: src/slic3r/GUI/Tab.cpp:1014
+#: src/slic3r/GUI/Tab.cpp:1332
msgid "symbolic profile name"
msgstr "nombre perfil simbólico"
-#: src/libslic3r/PrintConfig.cpp:2036
+#: src/libslic3r/PrintConfig.cpp:2178
msgid "Synchronize support layers with the object print layers. This is useful with multi-material printers, where the extruder switch is expensive."
msgstr "Sincronizar las capas de soporte con las capas de impresión del objeto. Esto es útil con impresoras de múltiples materiales, donde el cambio de el extrusor es costoso."
-#: src/libslic3r/PrintConfig.cpp:2034
+#: src/libslic3r/PrintConfig.cpp:2176
msgid "Synchronize with object layers"
-msgstr "Sincronizar con capas las del objeto"
+msgstr "Sincronizar con las capas del objeto"
-#: src/slic3r/GUI/MainFrame.cpp:699
+#: src/slic3r/GUI/MainFrame.cpp:924 src/slic3r/GUI/MainFrame.cpp:1323
msgid "System &Info"
msgstr "&Información del Sistema"
-#: src/slic3r/GUI/SysInfoDialog.cpp:78
+#: src/slic3r/GUI/SysInfoDialog.cpp:90 src/slic3r/GUI/SysInfoDialog.cpp:92
msgid "System Information"
msgstr "Información del sistema"
-#: src/slic3r/GUI/Preset.cpp:1109 src/slic3r/GUI/Preset.cpp:1164
-#: src/slic3r/GUI/Preset.cpp:1242 src/slic3r/GUI/Preset.cpp:1284
-#: src/slic3r/GUI/PresetBundle.cpp:1583 src/slic3r/GUI/PresetBundle.cpp:1672
+#: src/slic3r/GUI/PresetComboBoxes.cpp:188
+#: src/slic3r/GUI/PresetComboBoxes.cpp:226
+#: src/slic3r/GUI/PresetComboBoxes.cpp:724
+#: src/slic3r/GUI/PresetComboBoxes.cpp:774
+#: src/slic3r/GUI/PresetComboBoxes.cpp:886
+#: src/slic3r/GUI/PresetComboBoxes.cpp:930
msgid "System presets"
msgstr "Ajustes del sistema"
-#: src/slic3r/GUI/GUI_App.cpp:801
+#: src/slic3r/GUI/GUI_App.cpp:1481
msgid "Take Configuration &Snapshot"
msgstr "&Tomar una Captura de la configuración"
-#: src/slic3r/GUI/GUI_App.cpp:839
+#: src/slic3r/GUI/GUI_App.cpp:1540
msgid "Taking configuration snapshot"
msgstr "Haciendo una instantánea de la configuración"
-#: src/slic3r/GUI/Tab.cpp:1433 src/libslic3r/PrintConfig.cpp:2067
+#: src/slic3r/GUI/Tab.cpp:1779
msgid "Temperature"
msgstr "Temperatura"
-#: src/libslic3r/PrintConfig.cpp:1804
+#: src/libslic3r/PrintConfig.cpp:1919
msgid "Temperature difference to be applied when an extruder is not active. Enables a full-height \"sacrificial\" skirt on which the nozzles are periodically wiped."
msgstr "Diferencia de temperatura que se aplicará cuando un extrusor no esté activo. ACtiva una falda \"de sacrificio\" de altura completa en la que las boquillas se limpian periódicamente."
-#: src/libslic3r/PrintConfig.cpp:1803
+#: src/libslic3r/PrintConfig.cpp:1918
msgid "Temperature variation"
msgstr "Variación de temperatura"
-#: src/slic3r/GUI/ConfigWizard.cpp:1017
+#: src/slic3r/GUI/ConfigWizard.cpp:1383
msgid "Temperatures"
msgstr "Temperaturas"
-#: src/slic3r/GUI/Tab.cpp:1677 src/slic3r/GUI/Tab.cpp:1915
+#: src/slic3r/GUI/Tab.cpp:2215
+msgid "Template Custom G-code"
+msgstr "Plantilla Código G Personalizado"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:284
msgid "Test"
msgstr "Test"
-#: src/slic3r/GUI/BedShapeDialog.cpp:172
+#: src/slic3r/GUI/BedShapeDialog.cpp:315
msgid "Texture"
msgstr "Textura"
-#: src/slic3r/GUI/ConfigManipulation.cpp:208
+#: src/slic3r/GUI/ConfigManipulation.cpp:207
msgid "The %1% infill pattern is not supposed to work at 100%% density."
msgstr "Se supone que el patrón de relleno %1% no funciona a una densidad del 100%%."
#: src/slic3r/GUI/FirmwareDialog.cpp:548
-#, c-format
+#, possible-c-format
msgid "The %s device could not have been found"
msgstr "El dispositivo %s no se pudo encontrar"
#: src/slic3r/GUI/FirmwareDialog.cpp:436
-#, c-format
-msgid ""
-"The %s device was not found.\n"
-"If the device is connected, please press the Reset button next to the USB connector ..."
-msgstr ""
-"No se encontró el dispositivo %s. \n"
-"Si el dispositivo está conectado, presione el botón Reset al lado del conector USB ..."
+#, possible-c-format
+msgid "The %s device was not found.\nIf the device is connected, please press the Reset button next to the USB connector ..."
+msgstr "No se encontró el dispositivo %s. \nSi el dispositivo está conectado, presione el botón Reset al lado del conector USB ..."
-#: src/slic3r/GUI/Tab.cpp:976
+#: src/slic3r/GUI/Tab.cpp:1238
msgid "The current custom preset will be detached from the parent system preset."
msgstr "El preajuste personalizado actual se separará del preajuste del sistema principal."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875
-msgid ""
-"The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n"
-"Non-uniform scaling of tilted objects is only possible in the World coordinate system,\n"
-"once the rotation is embedded into the object coordinates."
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:925
+msgid "The currently manipulated object is tilted (rotation angles are not multiples of 90°).\nNon-uniform scaling of tilted objects is only possible in the World coordinate system,\nonce the rotation is embedded into the object coordinates."
msgstr "El objeto que está manipulando está inclinado (los ángulos de rotación no son múltiplos de 90º). El escalado no uniforme de objetos inclinados sólo es posible en sistema de coordenadas Mundo, una vez que la rotación se ha aplicado a las coordenadas del objeto."
-#: src/libslic3r/PrintConfig.cpp:2726
+#: src/libslic3r/PrintConfig.cpp:2890
msgid "The default angle for connecting support sticks and junctions."
msgstr "El ángulo por defecto para la conexión de sticks y uniones de soporte."
-#: src/libslic3r/SLAPrint.cpp:631
+#: src/libslic3r/SLAPrint.cpp:645
msgid "The endings of the support pillars will be deployed on the gap between the object and the pad. 'Support base safety distance' has to be greater than the 'Pad object gap' parameter to avoid this."
msgstr "Las terminaciones de los pilares de soporte se desplegarán en el espacio entre el objeto y el pad. La 'distancia de seguridad de la base de soporte' debe ser mayor que el parámetro 'Distancia entre objetos de relleno' para evitar esto."
-#: src/libslic3r/PrintConfig.cpp:489
+#: src/libslic3r/PrintConfig.cpp:525
msgid "The extruder to use (unless more specific extruder settings are specified). This value overrides perimeter and infill extruders, but not the support extruders."
msgstr "La extrusora que se usa (a menos que se especifiquen configuraciones de extrusión más específicas). Este valor anula los extrusores de perímetro y relleno, pero no los extrusores de soporte."
-#: src/libslic3r/PrintConfig.cpp:1003
+#: src/libslic3r/PrintConfig.cpp:1047
msgid "The extruder to use when printing infill."
msgstr "El extrusor que se usa cuando se imprime relleno."
-#: src/libslic3r/PrintConfig.cpp:1410
+#: src/libslic3r/PrintConfig.cpp:1518
msgid "The extruder to use when printing perimeters and brim. First extruder is 1."
msgstr "El extrusor que se usa al imprimir perímetros y borde. El primer extrusor es 1."
-#: src/libslic3r/PrintConfig.cpp:1738
+#: src/libslic3r/PrintConfig.cpp:1853
msgid "The extruder to use when printing solid infill."
msgstr "El extrusor que se usa al imprimir relleno sólido."
-#: src/libslic3r/PrintConfig.cpp:1966
+#: src/libslic3r/PrintConfig.cpp:2108
msgid "The extruder to use when printing support material interface (1+, 0 to use the current extruder to minimize tool changes). This affects raft too."
msgstr "La extrusora que se usa al imprimir la interfaz de material de soporte (1+, 0 para usar la extrusora actual para minimizar los cambios de herramientas). Esto también afecta a la balsa."
-#: src/libslic3r/PrintConfig.cpp:1939
+#: src/libslic3r/PrintConfig.cpp:2081
msgid "The extruder to use when printing support material, raft and skirt (1+, 0 to use the current extruder to minimize tool changes)."
msgstr "El extrusor que se usa al imprimir material de soporte, balsa y falda (1+, 0 para usar la extrusora actual para minimizar los cambios de herramientas)."
-#: src/libslic3r/PrintConfig.cpp:727
+#: src/libslic3r/PrintConfig.cpp:763
msgid "The filament material type for use in custom G-codes."
msgstr "El tipo de material de filamento para uso en códigos G personalizados."
-#: src/libslic3r/PrintConfig.cpp:3494
+#: src/libslic3r/PrintConfig.cpp:3693
msgid "The file where the output will be written (if not specified, it will be based on the input file)."
msgstr "El archivo donde se escribirá el resultado (si no se especifica, se basará en en archivo de entrada)."
-#: src/libslic3r/PrintConfig.cpp:1102
+#: src/libslic3r/PrintConfig.cpp:1195
msgid "The firmware supports stealth mode"
msgstr "El firmware soporta el modo silencioso"
-#: src/libslic3r/PrintConfig.cpp:120
+#: src/libslic3r/PrintConfig.cpp:122
msgid "The first layer will be shrunk in the XY plane by the configured value to compensate for the 1st layer squish aka an Elephant Foot effect."
msgstr "La primera capa se contraerá en el plano XY por el valor configurado para compensar el aplatamiento de la 1ª capa, también conocido como efecto Pie de Elefante."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3820
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3927 src/slic3r/GUI/Tab.cpp:3457
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4283
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4410
+#: src/slic3r/GUI/SavePresetDialog.cpp:117
msgid "the following characters are not allowed:"
msgstr "los siguientes caracteres no están permitidos:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1830
+#: src/slic3r/GUI/ConfigWizard.cpp:2257
msgid "The following FFF printer models have no filament selected:"
msgstr "Los siguientes modelos de impresoras FFF no tienen filamento seleccionado:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1848
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1004
+msgid "The following presets were modified:"
+msgstr "Los siguientes ajustes fueron modificados:"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:253
+msgid "The following shortcuts are applicable in G-code preview when the horizontal slider is active"
+msgstr "Los siguientes atajos son aplicables en la vista previa del código G cuando el control deslizante horizontal está activo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:237
+msgid "The following shortcuts are applicable in G-code preview when the vertical slider is active"
+msgstr "Los siguientes atajos son aplicables en la vista previa del código G cuando el control deslizante vertical está activo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+msgid "The following shortcuts are applicable when the specified gizmo is active"
+msgstr "Los siguientes atajos son aplicables cuando el gizmo especificado está activo"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2275
msgid "The following SLA printer models have no materials selected:"
msgstr "Los siguientes modelos de impresoras SLA no tienen filamento seleccionado:"
-#: src/slic3r/GUI/Tab.cpp:3461
+#: src/slic3r/GUI/SavePresetDialog.cpp:125
msgid "the following suffix is not allowed:"
msgstr "el siguiente sufijo no está permitido:"
-#: src/libslic3r/PrintConfig.cpp:2871
+#: src/libslic3r/PrintConfig.cpp:3035
msgid "The gap between the object bottom and the generated pad in zero elevation mode."
msgstr "El espacio entre la parte de debajo del objeto y el pad generado en el modo de cero elevación."
-#: src/libslic3r/PrintConfig.cpp:2704
+#: src/libslic3r/PrintConfig.cpp:2868
msgid "The height of the pillar base cone"
msgstr "La altura del cono de la base de un pilar"
-#: src/slic3r/GUI/DoubleSlider.cpp:1922
+#: src/slic3r/GUI/DoubleSlider.cpp:2140
msgid "The last color change data was saved for a multi extruder printing with tool changes for whole print."
msgstr "La información del último cambio de color se guardó para impresión con múltiples extrusores mediante cambios de herramienta para toda la impresión."
-#: src/slic3r/GUI/DoubleSlider.cpp:1900 src/slic3r/GUI/DoubleSlider.cpp:1916
+#: src/slic3r/GUI/DoubleSlider.cpp:2119 src/slic3r/GUI/DoubleSlider.cpp:2134
msgid "The last color change data was saved for a multi extruder printing."
msgstr "La información del último cambio de color se guardó para la impresión multi-extrusor."
-#: src/slic3r/GUI/DoubleSlider.cpp:1899
+#: src/slic3r/GUI/DoubleSlider.cpp:2118
msgid "The last color change data was saved for a single extruder printing."
msgstr "La información del último cambio de color se ha guardado para impresión con un solo extrusor."
-#: src/libslic3r/PrintConfig.cpp:2745
+#: src/libslic3r/PrintConfig.cpp:2909
msgid "The max distance of two pillars to get linked with each other. A zero value will prohibit pillar cascading."
msgstr "La distancia máxima entre dos pilares par que se unan entre si. Un valor cero prohibirá el encadenamiento de pilares."
-#: src/libslic3r/PrintConfig.cpp:2736
+#: src/libslic3r/PrintConfig.cpp:2900
msgid "The max length of a bridge"
msgstr "La longitud máxima de un puente"
-#: src/libslic3r/PrintConfig.cpp:2714
+#: src/libslic3r/PrintConfig.cpp:190
+msgid "The maximum detour length for avoid crossing perimeters. If the detour is longer than this value, avoid crossing perimeters is not applied for this travel path. Detour length could be specified either as an absolute value or as percentage (for example 50%) of a direct travel path."
+msgstr "La longitud máxima del desvío para evitar cruzar perímetros. Si el desvío es más largo que este valor, el evitar cruzar perímetros no se aplica para esta ruta de viaje. La longitud del desvío se puede especificar como valor absoluto o como porcentaje (por ejemplo, 50%) de un desplazamiento directo."
+
+#: src/libslic3r/PrintConfig.cpp:2878
msgid "The minimum distance of the pillar base from the model in mm. Makes sense in zero elevation mode where a gap according to this parameter is inserted between the model and the pad."
msgstr "La distancia mínima del modelo a la base de pilares en mm. Tiene sentido en el modo de cero elevación donde hay un hueco de acuerdo a cuando este parámetro se introduce entre el modelo y el pad."
-#: src/libslic3r/PrintConfig.cpp:185
+#: src/slic3r/GUI/SavePresetDialog.cpp:142
+msgid "The name cannot be empty."
+msgstr "El nombre no puede estar vacío."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:152
+msgid "The name cannot end with space character."
+msgstr "El nombre no puede terminar con un carácter de espacio."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:147
+msgid "The name cannot start with space character."
+msgstr "El nombre no puede empezar con un carácter de espacio."
+
+#: src/libslic3r/PrintConfig.cpp:219
msgid "The number of bottom solid layers is increased above bottom_solid_layers if necessary to satisfy minimum thickness of bottom shell."
msgstr "El número de capas sólidas en la base se incrementa por encima de bottom_solid_layers si es necesario para asegurar un espesor mínimo en la pared de inferior."
-#: src/libslic3r/PrintConfig.cpp:2143
+#: src/libslic3r/PrintConfig.cpp:2286
msgid "The number of top solid layers is increased above top_solid_layers if necessary to satisfy minimum thickness of top shell. This is useful to prevent pillowing effect when printing with variable layer height."
msgstr "El número de capas sólidas en la parte superior se incrementa sobre top_solid_layers si es necesario para satisfacer la altura mínima de la tapa superior. Esto es útil para prevenir el efecto de achatado cuando se imprime con altura de capa variable."
-#: src/libslic3r/PrintConfig.cpp:2277
+#: src/slic3r/GUI/Plater.cpp:2326
+msgid "The object appears to be saved in inches"
+msgstr "La pieza parece que se guardó en pulgadas"
+
+#: src/libslic3r/PrintConfig.cpp:2420
msgid "The object will be grown/shrunk in the XY plane by the configured value (negative = inwards, positive = outwards). This might be useful for fine-tuning hole sizes."
msgstr "El objeto se crecerá / reducirá en el plano XY por el valor configurado (negativo = hacia adentro, positivo = hacia afuera). Esto podría ser útil para ajustar el tamaño de los orificios."
-#: src/libslic3r/PrintConfig.cpp:1503
+#: src/libslic3r/PrintConfig.cpp:1611
msgid "The object will be raised by this number of layers, and support material will be generated under it."
msgstr "El objeto será elevado por este número de capas y se generará material de soporte debajo de él."
-#: src/libslic3r/PrintConfig.cpp:2424
-msgid ""
-"The percentage of the bed area. \n"
-"If the print area exceeds the specified value, \n"
-"then a slow tilt will be used, otherwise - a fast tilt"
-msgstr ""
-"El porcentaje del área de la cama. \n"
-"Si el área de impresión excede el valor especificado, \n"
-"entonces se utilizará una inclinación lenta, de lo contrario - una inclinación rápida"
+#: src/libslic3r/PrintConfig.cpp:2803
+msgid "The percentage of smaller pillars compared to the normal pillar diameter which are used in problematic areas where a normal pilla cannot fit."
+msgstr "El porcentaje de pilares más pequeños en comparación con el diámetro de pilar normal que se utilizan en áreas problemáticas donde no cabe un pilar normal."
+
+#: src/libslic3r/PrintConfig.cpp:2567
+msgid "The percentage of the bed area. \nIf the print area exceeds the specified value, \nthen a slow tilt will be used, otherwise - a fast tilt"
+msgstr "El porcentaje del área de la cama. \nSi el área de impresión excede el valor especificado, \nentonces se utilizará una inclinación lenta, de lo contrario - una inclinación rápida"
+
+#: src/slic3r/GUI/Tab.cpp:3430
+msgid "The physical printer(s) below is based on the preset, you are going to delete."
+msgstr "Las siguientes impresoras físicas se basan en el ajuste preestablecido que va a eliminar."
-#: src/slic3r/GUI/GUI_App.cpp:932
-msgid "The presets on the following tabs were modified"
-msgstr "Los presets en las siguientes pestañas fueron modificados"
+#: src/slic3r/GUI/Tab.cpp:3438
+msgid "The physical printer(s) below is based only on the preset, you are going to delete."
+msgstr "Las siguientes impresoras están basadas en el mismo ajuste que vas a borrar."
-#: src/libslic3r/PrintConfig.cpp:1846
+#: src/slic3r/GUI/GUI_App.cpp:1676
+msgid "The preset(s) modifications are successfully saved"
+msgstr "Las modificaciones de los ajustes preestablecidos se guardaron correctamente"
+
+#: src/libslic3r/PrintConfig.cpp:1988
msgid "The printer multiplexes filaments into a single hot end."
msgstr "La impresora multiplexa los filamentos en un solo fusor."
-#: src/libslic3r/Format/3mf.cpp:1630
+#: src/libslic3r/Format/3mf.cpp:1667
msgid "The selected 3mf file has been saved with a newer version of %1% and is not compatible."
msgstr "El archivo 3mf seleccionado se ha guardado con una versión más reciente de %1% y no es compatible."
-#: src/libslic3r/Format/AMF.cpp:934
+#: src/libslic3r/Format/AMF.cpp:955
msgid "The selected amf file has been saved with a newer version of %1% and is not compatible."
msgstr "El archivo amf seleccionado se ha guardado con una versión más reciente de %1% y no es compatible."
-#: src/slic3r/GUI/BedShapeDialog.cpp:513
+#: src/slic3r/GUI/Plater.cpp:4751
+msgid "The selected file"
+msgstr "El archivo seleccionado"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:589
msgid "The selected file contains no geometry."
msgstr "El archivo seleccionado no contiene geometría."
-#: src/slic3r/GUI/BedShapeDialog.cpp:517
+#: src/slic3r/GUI/BedShapeDialog.cpp:593
msgid "The selected file contains several disjoint areas. This is not supported."
msgstr "El archivo seleccionado contiene varias áreas disjuntas. Esto no es compatible."
-#: src/slic3r/GUI/Plater.cpp:2970
+#: src/slic3r/GUI/Plater.cpp:2763
msgid "The selected object can't be split because it contains more than one volume/material."
msgstr "El objeto seleccionado no se puede dividir porque contiene más de un volumen / material."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2270 src/slic3r/GUI/Plater.cpp:2978
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2436 src/slic3r/GUI/Plater.cpp:2771
msgid "The selected object couldn't be split because it contains only one part."
msgstr "El objeto seleccionado no se pudo dividir porque contiene solo una parte."
-#: src/slic3r/GUI/MainFrame.cpp:461
-msgid ""
-"The selected project is no longer available.\n"
-"Do you want to remove it from the recent projects list?"
-msgstr ""
-"El proyecto seleccionado no está disponible.\n"
-"¿Desea eliminarlo de la lista de proyectos recientes?"
+#: src/slic3r/GUI/MainFrame.cpp:1003
+msgid "The selected project is no longer available.\nDo you want to remove it from the recent projects list?"
+msgstr "El proyecto seleccionado no está disponible.\n¿Desea eliminarlo de la lista de proyectos recientes?"
-#: src/slic3r/GUI/DoubleSlider.cpp:998
-msgid ""
-"The sequential print is on.\n"
-"It's impossible to apply any custom G-code for objects printing sequentually.\n"
-"This code won't be processed during G-code generation."
-msgstr ""
-"La impresión secuencial está activada.\n"
-"Es imposible incluir G-code personalizado para piezas que se imprimen secuencialmente.\n"
-"Este código no se procesará durante la generación del G-code."
+#: src/slic3r/GUI/DoubleSlider.cpp:1121
+msgid "The sequential print is on.\nIt's impossible to apply any custom G-code for objects printing sequentually.\nThis code won't be processed during G-code generation."
+msgstr "La impresión secuencial está activada.\nEs imposible incluir G-code personalizado para piezas que se imprimen secuencialmente.\nEste código no se procesará durante la generación del G-code."
-#: src/libslic3r/PrintConfig.cpp:2846
+#: src/slic3r/GUI/ConfigWizard.cpp:1187
+msgid "The size of the object can be specified in inches"
+msgstr "El tamaño del objeto puede ser especificado en pulgadas"
+
+#: src/libslic3r/PrintConfig.cpp:3010
msgid "The slope of the pad wall relative to the bed plane. 90 degrees means straight walls."
msgstr "La pendiente de la pared del pad en relación con el plano de la cama. 90 grados significa paredes rectas."
-#: src/libslic3r/PrintConfig.cpp:1614
+#: src/libslic3r/PrintConfig.cpp:1722
msgid "The speed for loading of a filament into extruder after retraction (it only applies to the extruder motor). If left to zero, the retraction speed is used."
msgstr "La velocidad de carga de un filamento en la extrusora después de la retracción (solo se aplica al motor del extrusor). Si se deja a cero, se usa la velocidad de retracción."
-#: src/libslic3r/PrintConfig.cpp:1606
+#: src/libslic3r/PrintConfig.cpp:1714
msgid "The speed for retractions (it only applies to the extruder motor)."
msgstr "La velocidad para las retracciones (solo se aplica al motor del extrusor)."
-#: src/slic3r/GUI/ConfigManipulation.cpp:81
-#, no-c-format
-msgid ""
-"The Spiral Vase mode requires:\n"
-"- one perimeter\n"
-"- no top solid layers\n"
-"- 0% fill density\n"
-"- no support material\n"
-"- Ensure vertical shell thickness enabled\n"
-"- Detect thin walls disabled"
-msgstr ""
-"El modo Vaso Espiral necesita:\n"
-"-un perímetro\n"
-"-cero capas de tapa superior\n"
-"-0% densidad de relleno\n"
-"-sin soportes\n"
-"-Comprueba que está activado el espesor de pared vertical\n"
-"-Desactiva la detección de paredes finas"
-
-#: src/libslic3r/Print.cpp:1237
-msgid "The Spiral Vase option can only be used when printing a single object."
-msgstr "La opción Vaso en espiral solo puede ser usada cuando se imprime un solo objeto."
-
-#: src/libslic3r/Print.cpp:1244
+#: src/slic3r/GUI/ConfigManipulation.cpp:80
+#, possible-c-format
+msgid "The Spiral Vase mode requires:\n- one perimeter\n- no top solid layers\n- 0% fill density\n- no support material\n- Ensure vertical shell thickness enabled\n- Detect thin walls disabled"
+msgstr "El modo Vaso Espiral necesita:\n-un perímetro\n-cero capas de tapa superior\n-0% densidad de relleno\n-sin soportes\n-Comprueba que está activado el espesor de pared vertical\n-Desactiva la detección de paredes finas"
+
+#: src/libslic3r/Print.cpp:1270
msgid "The Spiral Vase option can only be used when printing single material objects."
msgstr "La opción Vaso en espiral solo puede ser usada al imprimir objetos de un solo material."
-#: src/slic3r/GUI/Tab.cpp:3068
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:464
msgid "The supplied name is empty. It can't be saved."
msgstr "El nombre proporcionado está vacío. No se puede guardar."
-#: src/slic3r/GUI/Tab.cpp:3465
+#: src/slic3r/GUI/SavePresetDialog.cpp:131
msgid "The supplied name is not available."
msgstr "El nombre proporcionado no está disponible."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3819
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3926 src/slic3r/GUI/Tab.cpp:3456
-#: src/slic3r/GUI/Tab.cpp:3460
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4282
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4409
+#: src/slic3r/GUI/SavePresetDialog.cpp:116
+#: src/slic3r/GUI/SavePresetDialog.cpp:124
msgid "The supplied name is not valid;"
msgstr "El nombre proporcionado no es válido;"
-#: src/libslic3r/Print.cpp:1222
+#: src/libslic3r/Print.cpp:1248
msgid "The supplied settings will cause an empty print."
msgstr "Los ajustes proporcionados causarán una impresión vacía."
-#: src/libslic3r/PrintConfig.cpp:2789
+#: src/libslic3r/PrintConfig.cpp:2953
msgid "The thickness of the pad and its optional cavity walls."
msgstr "El grosor de las pads y sus paredes de cavidad opcionales."
-#: src/libslic3r/PrintConfig.cpp:1911
+#: src/slic3r/GUI/GUI_App.cpp:1781
+msgid "The uploads are still ongoing"
+msgstr "Las subidas aún están en curso"
+
+#: src/libslic3r/PrintConfig.cpp:2053
msgid "The vertical distance between object and support material interface. Setting this to 0 will also prevent Slic3r from using bridge flow and speed for the first object layer."
msgstr "La distancia vertical entre el objeto y la interfaz del material de soporte. Establecer esto en 0 también evitará que Slic3r use el flujo y la velocidad del puente para la primera capa de los objetos."
-#: src/slic3r/GUI/Tab.cpp:2575
-msgid ""
-"The Wipe option is not available when using the Firmware Retraction mode.\n"
-"\n"
-"Shall I disable it in order to enable Firmware Retraction?"
+#: src/slic3r/GUI/Tab.cpp:2731
+msgid "The Wipe option is not available when using the Firmware Retraction mode.\n\nShall I disable it in order to enable Firmware Retraction?"
msgstr "La opción Limpiar no está disponible cuando se usa el modo Retracción de firmware. ¿Lo inhabilito para habilitar la Retracción de firmware?"
-#: src/libslic3r/Print.cpp:1268
+#: src/libslic3r/Print.cpp:1294
msgid "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)."
msgstr "La Torre de Limpieza actualmente no es compatible con E volumétrico (use_volumetric_e=0)."
-#: src/slic3r/GUI/ConfigManipulation.cpp:115
-msgid ""
-"The Wipe Tower currently supports the non-soluble supports only\n"
-"if they are printed with the current extruder without triggering a tool change.\n"
-"(both support_material_extruder and support_material_interface_extruder need to be set to 0)."
-msgstr ""
-"La Torre de Limpieza actualmente admite los soportes no solubles solo si están impresos con el extrusor actual sin activar un cambio de herramienta. \n"
-"(tanto support_material_extruder como support_material_interface_extruder deben configurarse en 0)."
+#: src/slic3r/GUI/ConfigManipulation.cpp:114
+msgid "The Wipe Tower currently supports the non-soluble supports only\nif they are printed with the current extruder without triggering a tool change.\n(both support_material_extruder and support_material_interface_extruder need to be set to 0)."
+msgstr "La Torre de Limpieza actualmente admite los soportes no solubles solo si están impresos con el extrusor actual sin activar un cambio de herramienta. \n(tanto support_material_extruder como support_material_interface_extruder deben configurarse en 0)."
-#: src/libslic3r/Print.cpp:1400
+#: src/libslic3r/Print.cpp:1426
msgid "The Wipe Tower currently supports the non-soluble supports only if they are printed with the current extruder without triggering a tool change. (both support_material_extruder and support_material_interface_extruder need to be set to 0)."
msgstr "La Torre de Limpieza actualmente admite los soportes no solubles solo si están impresos con el extrusor actual sin activar un cambio de herramienta. (Tanto support_material_extruder como support_material_interface_extruder deben configurarse en 0)."
-#: src/libslic3r/Print.cpp:1270
+#: src/libslic3r/Print.cpp:1296
msgid "The Wipe Tower is currently not supported for multimaterial sequential prints."
msgstr "La Torre de Limpieza no se permite ahora para impresiones secuenciales multimaterial."
-#: src/libslic3r/Print.cpp:1262
-msgid "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter and Repetier G-code flavors."
-msgstr "Actualmente, La Torre de Limpieza solo es compatible con los tipos de código G de Marlin, RepRap/Sprinter y Repetier."
+#: src/libslic3r/Print.cpp:1290
+msgid "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, RepRapFirmware and Repetier G-code flavors."
+msgstr "La Torre de Limpieza solo es compatible con las variantes de código G usadas por Marlin, RepRap/Sprinter, RepRapFirmware y Repetier."
-#: src/libslic3r/Print.cpp:1264
+#: src/libslic3r/Print.cpp:1290
msgid "The Wipe Tower is currently only supported with the relative extruder addressing (use_relative_e_distances=1)."
msgstr "En la actualidad, Wipe Tower solo es compatible con el direccionamiento relativo del extrusor (use_relative_e_distances=1)."
-#: src/libslic3r/Print.cpp:1293
+#: src/libslic3r/Print.cpp:1319
msgid "The Wipe Tower is only supported for multiple objects if they are printed over an equal number of raft layers"
msgstr "La torre de limpieza sólo se permite para varios objetos si se imprimen sobre un número igual de capas de balsa"
-#: src/libslic3r/Print.cpp:1295
+#: src/libslic3r/Print.cpp:1321
msgid "The Wipe Tower is only supported for multiple objects if they are printed with the same support_material_contact_distance"
msgstr "La torre de limpieza sólo es compatible con varios objetos si se imprimen con la misma support_material_contact_distance"
-#: src/libslic3r/Print.cpp:1297
+#: src/libslic3r/Print.cpp:1323
msgid "The Wipe Tower is only supported for multiple objects if they are sliced equally."
msgstr "La torre de limpieza sólo es compatible con varios objetos si se cortan por igual."
-#: src/libslic3r/Print.cpp:1291
+#: src/libslic3r/Print.cpp:1317
msgid "The Wipe Tower is only supported for multiple objects if they have equal layer heights"
msgstr "La torre de limpieza sólo es compatible con varios objetos si tienen alturas de capas iguales"
-#: src/libslic3r/Print.cpp:1257
+#: src/libslic3r/Print.cpp:1283
msgid "The wipe tower is only supported if all extruders have the same nozzle diameter and use filaments of the same diameter."
msgstr "La torre de limpieza solo es compatible si todos los extrusores tienen el mismo diámetro del nozzle y usan filamento del mismo diámetro."
-#: src/libslic3r/Print.cpp:1339
+#: src/libslic3r/Print.cpp:1365
msgid "The Wipe tower is only supported if all objects have the same variable layer height"
msgstr "La Torre de Limpieza solo es compatible si todos los objetos tienen la misma altura de capa variable"
-#: src/libslic3r/SLAPrintSteps.cpp:621
+#: src/slic3r/GUI/Plater.cpp:3563
+msgid "There are active warnings concerning sliced models:"
+msgstr "Hay avisos activos respecto a los modelos laminados:"
+
+#: src/libslic3r/SLAPrintSteps.cpp:619
msgid "There are unprintable objects. Try to adjust support settings to make the objects printable."
msgstr "Hay objetos no imprimibles. Intenta ajustar la configuración de soportes para que los objetos se puedan imprimir."
-#: src/slic3r/GUI/DoubleSlider.cpp:1030
-msgid ""
-"There is a color change for extruder that has not been used before.\n"
-"Check your settings to avoid redundant color changes."
-msgstr ""
-"Hay un cambio de color para el extrusor que no se ha usado antes. \n"
-"Comprueba tus ajustes para evitar cambios de color innecesarios."
+#: src/slic3r/GUI/DoubleSlider.cpp:1155
+msgid "There is a color change for extruder that has not been used before.\nCheck your settings to avoid redundant color changes."
+msgstr "Hay un cambio de color para el extrusor que no se ha usado antes. \nComprueba tus ajustes para evitar cambios de color innecesarios."
-#: src/slic3r/GUI/DoubleSlider.cpp:1024
-msgid ""
-"There is a color change for extruder that won't be used till the end of print job.\n"
-"This code won't be processed during G-code generation."
+#: src/slic3r/GUI/DoubleSlider.cpp:1149
+msgid "There is a color change for extruder that won't be used till the end of print job.\nThis code won't be processed during G-code generation."
msgstr "Hay un cambio de color para el extrusor que no será usado hasta el final del trabajo de impresión. Este código no será procesado durante la generación del G-code."
-#: src/slic3r/GUI/DoubleSlider.cpp:1027
-msgid ""
-"There is an extruder change set to the same extruder.\n"
-"This code won't be processed during G-code generation."
-msgstr ""
-"Hay un cambio de extrusor establecido en el mismo extrusor.\n"
-"Este código no se procesará durante la generación del código G."
+#: src/slic3r/GUI/DoubleSlider.cpp:1152
+msgid "There is an extruder change set to the same extruder.\nThis code won't be processed during G-code generation."
+msgstr "Hay un cambio de extrusor establecido en el mismo extrusor.\nEste código no se procesará durante la generación del código G."
+
+#: src/libslic3r/GCode.cpp:604
+msgid "There is an object with no extrusions on the first layer."
+msgstr "Hay un objeto sin extrusiones en la primera capa."
#: src/slic3r/GUI/UpdateDialogs.cpp:225
-#, c-format
+#, possible-c-format
msgid "This %s version: %s"
msgstr "Esta %s versión: %s"
-#: src/slic3r/GUI/Tab.cpp:982
-msgid ""
-"This action is not revertable.\n"
-"Do you want to proceed?"
-msgstr ""
-"Esta acción no es reversible.\n"
-"¿Deseas continuar?"
+#: src/slic3r/GUI/Tab.cpp:1244
+msgid "This action is not revertable.\nDo you want to proceed?"
+msgstr "Esta acción no es reversible.\n¿Deseas continuar?"
-#: src/libslic3r/PrintConfig.cpp:165
+#: src/libslic3r/PrintConfig.cpp:199
msgid "This code is inserted between objects when using sequential printing. By default extruder and bed temperature are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."
msgstr "Este código se inserta entre los objetos cuando se utiliza la impresión secuencial. Por defecto, el extrusor y la temperatura de la cama se reinician utilizando un comando de no espera; sin embargo, si se detectan M104, M109, M140 o M190 en este código personalizado, Slic3r no agregará comandos de temperatura. Tenga en cuenta que puede usar variables de marcador de posición para todas las configuraciones de Slic3r, por lo que puede poner un comando \"M109 S [first_layer_temperature]\" donde lo desee."
-#: src/libslic3r/PrintConfig.cpp:1081
+#: src/libslic3r/PrintConfig.cpp:1174
msgid "This custom code is inserted at every layer change, right after the Z move and before the extruder moves to the first layer point. Note that you can use placeholder variables for all Slic3r settings as well as [layer_num] and [layer_z]."
msgstr "Este código personalizado se inserta en cada cambio de capa, justo después del movimiento Z y antes de que el extrusor se mueva al primer punto de capa. Tenga en cuenta que puede usar variables de marcador de posición para todos los ajustes de Slic3r, así como [layer_num] y [layer_z]."
-#: src/libslic3r/PrintConfig.cpp:154
+#: src/libslic3r/PrintConfig.cpp:188
msgid "This custom code is inserted at every layer change, right before the Z move. Note that you can use placeholder variables for all Slic3r settings as well as [layer_num] and [layer_z]."
msgstr "Este código personalizado se inserta en cada cambio de capa, justo antes del movimiento Z. Tenga en cuenta que puede usar variables de marcador de posición para todos los ajustes de Slic3r, así como [layer_num] y [layer_z]."
-#: src/libslic3r/PrintConfig.cpp:2094
+#: src/libslic3r/PrintConfig.cpp:2237
msgid "This custom code is inserted before every toolchange. Placeholder variables for all PrusaSlicer settings as well as {previous_extruder} and {next_extruder} can be used. When a tool-changing command which changes to the correct extruder is included (such as T{next_extruder}), PrusaSlicer will emit no other such command. It is therefore possible to script custom behaviour both before and after the toolchange."
msgstr "Este código personalizado se inserta antes de cada cambio de herramienta. Se pueden utilizar variables de marcador de posición para todas las configuraciones de PrusaSlicer, así como {previous_extruder} y {next_extruder}. Cuando se incluye un comando de cambio de herramienta que cambia al extrusor correcto (como T{next_extruder}), PrusaSlicer no emitirá ningún otro comando. Por lo tanto, es posible escribir un comportamiento personalizado antes y después del cambio de herramienta."
-#: src/libslic3r/PrintConfig.cpp:396
+#: src/libslic3r/PrintConfig.cpp:430
msgid "This end procedure is inserted at the end of the output file, before the printer end gcode (and before any toolchange from this filament in case of multimaterial printers). Note that you can use placeholder variables for all PrusaSlicer settings. If you have multiple extruders, the gcode is processed in extruder order."
msgstr "Este procedimiento final se inserta al final del archivo de salida, antes del código G final de la impresora (y antes de cualquier cambio de herramienta desde este filamento en el caso de impresoras multimateriales). Ten en cuenta que puede usar variables de marcador de posición para todas las configuraciones de PrusaSlicer. Si tienes varios extrusores, el código G se procesa en orden de extrusor."
-#: src/libslic3r/PrintConfig.cpp:386
+#: src/libslic3r/PrintConfig.cpp:420
msgid "This end procedure is inserted at the end of the output file. Note that you can use placeholder variables for all PrusaSlicer settings."
msgstr "Este procedimiento final se inserta al final del archivo de salida. Ten en cuenta que puedes usar variables de marcador de posición para todas las configuraciones de PrusaSlicer."
-#: src/libslic3r/PrintConfig.cpp:1258 src/libslic3r/PrintConfig.cpp:1269
+#: src/libslic3r/PrintConfig.cpp:1366 src/libslic3r/PrintConfig.cpp:1377
msgid "This experimental setting is used to limit the speed of change in extrusion rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds."
msgstr "Esta configuración experimental se usa para limitar la velocidad de cambio en la velocidad de extrusión. Un valor de 1,8 mm³ / s² asegura que se cambia la velocidad de extrusión de 1,8 mm³ / s (ancho de extrusión de 0,45 mm, altura de extrusión de 0,2 mm, avance de 20 mm / s) a 5,4 mm³ / s (avance de 60 mm / s) durará al menos 2 segundos."
-#: src/libslic3r/PrintConfig.cpp:1248
+#: src/libslic3r/PrintConfig.cpp:1356
msgid "This experimental setting is used to set the maximum volumetric speed your extruder supports."
msgstr "Esta configuración experimental se usa para establecer la velocidad volumétrica máxima que admite el extrusor."
-#: src/libslic3r/PrintConfig.cpp:2162
+#: src/libslic3r/PrintConfig.cpp:2305
msgid "This experimental setting uses G10 and G11 commands to have the firmware handle the retraction. This is only supported in recent Marlin."
msgstr "Esta configuración experimental utiliza comandos G10 y G11 para que el firmware maneje la retracción. Esto solo se admite en Marlin reciente."
-#: src/libslic3r/PrintConfig.cpp:2176
+#: src/libslic3r/PrintConfig.cpp:2319
msgid "This experimental setting uses outputs the E values in cubic millimeters instead of linear millimeters. If your firmware doesn't already know filament diameter(s), you can put commands like 'M200 D[filament_diameter_0] T0' in your start G-code in order to turn volumetric mode on and use the filament diameter associated to the filament selected in Slic3r. This is only supported in recent Marlin."
msgstr "Este ajuste experimental utiliza como salida del E valores en milímetros cúbicos en lugar de milímetros lineales. Si su firmware aún no conoce el (los) diámetro (s) del filamento, puede poner comandos como 'M200 D [filament_diameter_0] T0' en su código G inicial para activar el modo volumétrico y usar el diámetro del filamento asociado al filamento seleccionado. en Slic3r. Esto solo se admite en Marlin reciente."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3972
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4459
msgid "This extruder will be set for selected items"
msgstr "Este extrusor se aplicará a los objetos seleccionados"
-#: src/libslic3r/PrintConfig.cpp:224
+#: src/libslic3r/PrintConfig.cpp:258
msgid "This factor affects the amount of plastic for bridging. You can decrease it slightly to pull the extrudates and prevent sagging, although default settings are usually good and you should experiment with cooling (use a fan) before tweaking this."
msgstr "Este factor afecta la cantidad de plástico para formar puentes. Puede disminuirlo ligeramente para extraer los extruidos y evitar el combado, aunque la configuración predeterminada suele ser buena y debe experimentar con la refrigeración (usar un ventilador) antes de ajustar esto."
-#: src/libslic3r/PrintConfig.cpp:546
+#: src/libslic3r/PrintConfig.cpp:582
msgid "This factor changes the amount of flow proportionally. You may need to tweak this setting to get nice surface finish and correct single wall widths. Usual values are between 0.9 and 1.1. If you think you need to change this more, check filament diameter and your firmware E steps."
msgstr "Este factor cambia la cantidad de flujo proporcionalmente. Es posible que necesite ajustar esta configuración para obtener un buen acabado superficial y corregir el ancho de una sola pared. Los valores usuales están entre 0.9 y 1.1. Si cree que necesita cambiar esto más, verifique el diámetro del filamento y los pasos del E en el firmware."
-#: src/libslic3r/PrintConfig.cpp:214
+#: src/libslic3r/PrintConfig.cpp:248
msgid "This fan speed is enforced during all bridges and overhangs."
msgstr "La velocidad de este ventilador se aplica durante todos los puentes y voladizos."
-#: src/libslic3r/PrintConfig.cpp:992
+#: src/libslic3r/PrintConfig.cpp:1036
msgid "This feature allows to combine infill and speed up your print by extruding thicker infill layers while preserving thin perimeters, thus accuracy."
msgstr "Esta característica permite combinar el relleno y acelerar la impresión mediante la extrusión de capas de relleno más gruesas a la vez que se preservan los finos perímetros y, por lo tanto, la precisión."
-#: src/libslic3r/PrintConfig.cpp:1746
+#: src/libslic3r/PrintConfig.cpp:1861
msgid "This feature allows to force a solid layer every given number of layers. Zero to disable. You can set this to any value (for example 9999); Slic3r will automatically choose the maximum possible number of layers to combine according to nozzle diameter and layer height."
msgstr "Esta característica permite forzar una capa sólida en cada número de capas. Cero para deshabilitar. Puede establecer esto en cualquier valor (por ejemplo, 9999); Slic3r seleccionará automáticamente la cantidad máxima posible de capas para combinar según el diámetro de la boquilla y la altura de la capa."
-#: src/libslic3r/PrintConfig.cpp:1795
-msgid "This feature will raise Z gradually while printing a single-walled object in order to remove any visible seam. This option requires a single perimeter, no infill, no top solid layers and no support material. You can still set any number of bottom solid layers as well as skirt/brim loops. It won't work when printing more than an object."
-msgstr "Esta función aumentará Z gradualmente mientras imprime un objeto de pared simple para eliminar cualquier costura visible. Esta opción requiere un perímetro único, sin relleno, sin capas sólidas superiores y sin material de soporte. Todavía puede establecer cualquier cantidad de capas sólidas inferiores, así como bucles de falda / balsa. No funcionará al imprimir más de un objeto."
+#: src/libslic3r/PrintConfig.cpp:1995
+msgid "This feature will raise Z gradually while printing a single-walled object in order to remove any visible seam. This option requires a single perimeter, no infill, no top solid layers and no support material. You can still set any number of bottom solid layers as well as skirt/brim loops. It won't work when printing more than one single object."
+msgstr "Esta función aumentará Z gradualmente mientras imprimes un objeto de pared simple para eliminar cualquier costura visible. Esta opción requiere un perímetro único, sin relleno, sin capas sólidas superiores y sin material de soporte. Puedes establecer cualquier cantidad de capas sólidas inferiores, así como los bucles de falda/balsa. No funcionará al imprimir más de un objeto."
-#: src/slic3r/GUI/Plater.cpp:2367
+#: src/slic3r/GUI/Plater.cpp:2329
msgid "This file cannot be loaded in a simple mode. Do you want to switch to an advanced mode?"
msgstr "Este archivo no puede ser cargado en un modo sencillo. ¿Quieres cambiar al modo experto?"
-#: src/slic3r/GUI/Plater.cpp:2357
-msgid ""
-"This file contains several objects positioned at multiple heights.\n"
-"Instead of considering them as multiple objects, should I consider\n"
-"this file as a single object having multiple parts?"
-msgstr ""
-"Este archivo contiene varios objetos posicionados en múltiples alturas. En lugar de considerarlos como objetos múltiples, ¿debería considerar\n"
-" este archivo como un único objeto que tiene varias partes?"
+#: src/slic3r/GUI/Plater.cpp:2319
+msgid "This file contains several objects positioned at multiple heights.\nInstead of considering them as multiple objects, should I consider\nthis file as a single object having multiple parts?"
+msgstr "Este archivo contiene varios objetos posicionados en múltiples alturas. En lugar de considerarlos como objetos múltiples, ¿debería considerar\n este archivo como un único objeto que tiene varias partes?"
#: src/slic3r/GUI/FirmwareDialog.cpp:332
-#, c-format
-msgid ""
-"This firmware hex file does not match the printer model.\n"
-"The hex file is intended for: %s\n"
-"Printer reported: %s\n"
-"\n"
-"Do you want to continue and flash this hex file anyway?\n"
-"Please only continue if you are sure this is the right thing to do."
-msgstr ""
-"Este archivo hex del firmware no se corresponde con el modelo de impresora. El archivo hex está preparado para: %s\n"
-"Esta Impresora: %s\n"
-"\n"
-"¿Quieres continuar y grabar este archivo hex de todos modos?\n"
-"Por favor continúa solo si estás seguro de que es lo correcto."
+#, possible-c-format
+msgid "This firmware hex file does not match the printer model.\nThe hex file is intended for: %s\nPrinter reported: %s\n\nDo you want to continue and flash this hex file anyway?\nPlease only continue if you are sure this is the right thing to do."
+msgstr "Este archivo hex del firmware no se corresponde con el modelo de impresora. El archivo hex está preparado para: %s\nEsta Impresora: %s\n\n¿Quieres continuar y grabar este archivo hex de todos modos?\nPor favor continúa solo si estás seguro de que es lo correcto."
-#: src/libslic3r/PrintConfig.cpp:314
+#: src/libslic3r/PrintConfig.cpp:348
msgid "This flag enables the automatic cooling logic that adjusts print speed and fan speed according to layer printing time."
msgstr "Este indicador habilita la lógica de enfriamiento automático que ajusta la velocidad de impresión y la velocidad del ventilador según el tiempo de impresión de la capa."
-#: src/slic3r/GUI/Plater.cpp:536
+#: src/slic3r/GUI/Plater.cpp:402
msgid "This flag enables the brim that will be printed around each object on the first layer."
msgstr "Esta opción activa la balsa que se imprimirá alrededor del objeto en la primera capa."
-#: src/libslic3r/PrintConfig.cpp:1538
+#: src/libslic3r/PrintConfig.cpp:1646
msgid "This flag enforces a retraction whenever a Z move is done."
msgstr "Esta bandera impone una retractación cada vez que se realiza un movimiento Z."
-#: src/libslic3r/PrintConfig.cpp:2194
+#: src/libslic3r/PrintConfig.cpp:2337
msgid "This flag will move the nozzle while retracting to minimize the possible blob on leaky extruders."
msgstr "Esta bandera moverá la boquilla mientras se retrae para minimizar la posible mancha en los extrusores con fugas."
-#: src/slic3r/GUI/Tab.cpp:953
+#: src/libslic3r/PrintConfig.cpp:1961
+msgid "This G-code will be used as a code for the color change"
+msgstr "Este código G se utilizará como código para el cambio de color"
+
+#: src/libslic3r/PrintConfig.cpp:1970
+msgid "This G-code will be used as a code for the pause print"
+msgstr "Este código G se utilizará como código para la pausa de impresión"
+
+#: src/libslic3r/PrintConfig.cpp:1979
+msgid "This G-code will be used as a custom code"
+msgstr "Este código G se utilizará como código personalizado"
+
+#: src/slic3r/GUI/Tab.cpp:1272
msgid "This is a default preset."
msgstr "Este es un preajuste preestablecido."
-#: src/libslic3r/PrintConfig.cpp:2766
+#: src/libslic3r/PrintConfig.cpp:2930
msgid "This is a relative measure of support points density."
msgstr "Esta es una medida relativa de la densidad de los puntos de soporte."
-#: src/slic3r/GUI/Tab.cpp:2338
+#: src/slic3r/GUI/Tab.cpp:2507
msgid "This is a single extruder multimaterial printer, diameters of all extruders will be set to the new value. Do you want to proceed?"
msgstr "Esta es una impresora multimaterial de extrusor único, los diámetros de todas los extrusores se establecerán según el nuevo valor. ¿Quieres proceder?"
-#: src/slic3r/GUI/Tab.cpp:955
+#: src/slic3r/GUI/Tab.cpp:1274
msgid "This is a system preset."
msgstr "Este es un preajuste del sistema."
-#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:583
+#: src/libslic3r/PrintConfig.cpp:559 src/libslic3r/PrintConfig.cpp:619
msgid "This is only used in the Slic3r interface as a visual help."
msgstr "Esto solo se usa en la interfaz de Slic3r como ayuda visual."
-#: src/libslic3r/PrintConfig.cpp:336
+#: src/libslic3r/PrintConfig.cpp:370
msgid "This is the acceleration your printer will be reset to after the role-specific acceleration values are used (perimeter/infill). Set zero to prevent resetting acceleration at all."
msgstr "Esta es la aceleración después de que se usen los valores de aceleración específicos de cada función (perímetro / relleno). Establezca cero para evitar restablecer la aceleración."
-#: src/libslic3r/PrintConfig.cpp:194
+#: src/libslic3r/PrintConfig.cpp:228
msgid "This is the acceleration your printer will use for bridges. Set zero to disable acceleration control for bridges."
-msgstr "Esta es la aceleración que su impresora usará para los puentes. Establezca cero para deshabilitar el control de aceleración para puentes."
+msgstr "Esta es la aceleración que su impresora usará para los puentes. Establezca con el valor cero para deshabilitar el control de aceleración para puentes."
-#: src/libslic3r/PrintConfig.cpp:860
+#: src/libslic3r/PrintConfig.cpp:900
msgid "This is the acceleration your printer will use for first layer. Set zero to disable acceleration control for first layer."
-msgstr "Esta es la aceleración que su impresora usará para la primera capa. Establezca cero para deshabilitar el control de aceleración para la primera capa."
+msgstr "Esta es la aceleración que su impresora usará para la primera capa. Establezca con el valor cero para deshabilitar el control de aceleración para la primera capa."
-#: src/libslic3r/PrintConfig.cpp:982
+#: src/libslic3r/PrintConfig.cpp:1026
msgid "This is the acceleration your printer will use for infill. Set zero to disable acceleration control for infill."
-msgstr "Esta es la aceleración que su impresora usará para el relleno. Establezca cero para deshabilitar el control de aceleración para el relleno."
+msgstr "Esta es la aceleración que su impresora usará para el relleno. Establezca con el valor cero para deshabilitar el control de aceleración para el relleno."
-#: src/libslic3r/PrintConfig.cpp:1400
-msgid "This is the acceleration your printer will use for perimeters. A high value like 9000 usually gives good results if your hardware is up to the job. Set zero to disable acceleration control for perimeters."
-msgstr "Esta es la aceleración que su impresora usará para los perímetros. Un valor alto como 9000 generalmente da buenos resultados si su hardware está a la altura del trabajo. Establezca cero para deshabilitar el control de aceleración para los perímetros."
+#: src/libslic3r/PrintConfig.cpp:1582
+msgid "This is the acceleration your printer will use for perimeters. Set zero to disable acceleration control for perimeters."
+msgstr "Esta es la aceleración que usará su impresora para los perímetros. Establezca con el valor cero para deshabilitar el control de aceleración de los perímetros."
-#: src/libslic3r/PrintConfig.cpp:1327
+#: src/libslic3r/PrintConfig.cpp:1435
msgid "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)"
msgstr "Este es el diámetro de la boquilla de su extrusor (por ejemplo: 0.5, 0.35, etc.)"
-#: src/libslic3r/PrintConfig.cpp:1227
-#, no-c-format
+#: src/libslic3r/PrintConfig.cpp:1335
+#, possible-c-format
msgid "This is the highest printable layer height for this extruder, used to cap the variable layer height and support layer height. Maximum recommended layer height is 75% of the extrusion width to achieve reasonable inter-layer adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter."
msgstr "Esta es la altura más alta imprimible de capa para este extrusor, que se utiliza para cubrir la altura de la capa variable y la altura de la capa de soporte. La altura máxima recomendada de la capa es del 75% del ancho de extrusión para lograr una adhesión razonable entre capas. Si se establece en 0, la altura de la capa se limita al 75% del diámetro de la boquilla."
-#: src/libslic3r/PrintConfig.cpp:1290
+#: src/libslic3r/PrintConfig.cpp:1398
msgid "This is the lowest printable layer height for this extruder and limits the resolution for variable layer height. Typical values are between 0.05 mm and 0.1 mm."
msgstr "Esta es la altura más baja de la capa imprimible para este extrusor y limita la resolución para la altura de la capa variable. Los valores típicos están entre 0.05 mm y 0.1 mm."
-#: src/libslic3r/GCode.cpp:639
+#: src/libslic3r/GCode.cpp:624
msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed."
msgstr "Esto generalmente es causado por extrusiones insignificantemente pequeñas o por un modelo defectuoso. Intenta reparar el modelo o cambia su orientación en la cama."
-#: src/libslic3r/PrintConfig.cpp:2215
+#: src/libslic3r/PrintConfig.cpp:2358
msgid "This matrix describes volumes (in cubic milimetres) required to purge the new filament on the wipe tower for any given pair of tools."
msgstr "Esta matriz detalla los volúmenes (en milímetros cúbicos) necesarios para purgar el nuevo filamento en la torre de limpieza para cualquier par de filamentos."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:878
-msgid ""
-"This operation is irreversible.\n"
-"Do you want to proceed?"
-msgstr ""
-"Esta operación es irreversible. \n"
-"¿Deseas continuar?"
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:928
+msgid "This operation is irreversible.\nDo you want to proceed?"
+msgstr "Esta operación es irreversible. \n¿Deseas continuar?"
-#: src/libslic3r/PrintConfig.cpp:1442
+#: src/libslic3r/PrintConfig.cpp:1550
msgid "This option sets the number of perimeters to generate for each layer. Note that Slic3r may increase this number automatically when it detects sloping surfaces which benefit from a higher number of perimeters if the Extra Perimeters option is enabled."
msgstr "Esta opción establece la cantidad de perímetros que se generarán para cada capa. Tenga en cuenta que Slic3r puede aumentar este número automáticamente cuando detecta superficies inclinadas que se benefician de un mayor número de perímetros si la opción Perímetros adicionales está habilitada."
-#: src/libslic3r/PrintConfig.cpp:1356
+#: src/libslic3r/PrintConfig.cpp:1464
msgid "This option will drop the temperature of the inactive extruders to prevent oozing. It will enable a tall skirt automatically and move extruders outside such skirt when changing temperatures."
msgstr "Esta opción reducirá la temperatura de las extrusoras inactivas para evitar el goteo. Permitirá una falda alta automáticamente y moverá los extrusores fuera de dicha falda cuando cambie la temperatura."
-#: src/libslic3r/PrintConfig.cpp:1029
+#: src/libslic3r/PrintConfig.cpp:1073
msgid "This option will limit infill to the areas actually needed for supporting ceilings (it will act as internal support material). If enabled, slows down the G-code generation due to the multiple checks involved."
msgstr "Esta opción limitará el relleno a las áreas realmente necesarias para soportar techos (actuará como material de soporte interno). Si está habilitado, ralentiza la generación del código G debido a las múltiples comprobaciones involucradas."
-#: src/libslic3r/PrintConfig.cpp:1022
+#: src/libslic3r/PrintConfig.cpp:1066
msgid "This option will switch the print order of perimeters and infill, making the latter first."
msgstr "Esta opción cambiará el orden de impresión de los perímetros y el relleno, haciendo que el último sea el primero."
-#: src/libslic3r/PrintConfig.cpp:459
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:85
+msgid "This printer will be shown in the presets list as"
+msgstr "Esta impresora se mostrará en la lista de ajustes preestablecidos como"
+
+#: src/libslic3r/PrintConfig.cpp:495
msgid "This separate setting will affect the speed of external perimeters (the visible ones). If expressed as percentage (for example: 80%) it will be calculated on the perimeters speed setting above. Set to zero for auto."
msgstr "Esta configuración independiente afectará la velocidad de los perímetros externos (los visibles). Si se expresa como porcentaje (por ejemplo: 80%), se calculará en la configuración de velocidad de perímetros anterior. Establecer a cero para auto."
-#: src/libslic3r/PrintConfig.cpp:1717
+#: src/libslic3r/PrintConfig.cpp:1832
msgid "This separate setting will affect the speed of perimeters having radius <= 6.5mm (usually holes). If expressed as percentage (for example: 80%) it will be calculated on the perimeters speed setting above. Set to zero for auto."
msgstr "Esta configuración por separado afectará la velocidad de los perímetros con un radio <= 6,5 mm (generalmente agujeros). Si se expresa como porcentaje (por ejemplo: 80%), se calculará en la configuración de velocidad de perímetros anterior. Establecer a cero para auto."
-#: src/libslic3r/PrintConfig.cpp:1038
+#: src/libslic3r/PrintConfig.cpp:1082
msgid "This setting applies an additional overlap between infill and perimeters for better bonding. Theoretically this shouldn't be needed, but backlash might cause gaps. If expressed as percentage (example: 15%) it is calculated over perimeter extrusion width."
msgstr "Esta configuración aplica una superposición adicional entre relleno y perímetros para una mejor unión. Teóricamente, esto no debería ser necesario, pero la reacción puede causar huecos. Si se expresa como porcentaje (ejemplo: 15%), se calcula sobre el ancho de extrusión del perímetro."
@@ -8225,122 +9507,129 @@ msgstr "Esta configuración aplica una superposición adicional entre relleno y
msgid "This setting controls the height (and thus the total number) of the slices/layers. Thinner layers give better accuracy but take more time to print."
msgstr "Esta configuración controla la altura (y, por tanto, el número total) de las láminas / capas. Las capas más delgadas brindan una mayor precisión pero requieren más tiempo para imprimir."
-#: src/libslic3r/PrintConfig.cpp:1218
+#: src/libslic3r/PrintConfig.cpp:1326
msgid "This setting represents the maximum speed of your fan."
msgstr "Esta configuración representa la velocidad máxima de su ventilador."
-#: src/libslic3r/PrintConfig.cpp:1281
+#: src/libslic3r/PrintConfig.cpp:1389
msgid "This setting represents the minimum PWM your fan needs to work."
msgstr "Este ajuste representa el PWM mínimo que el ventilador necesita para funcionar."
-#: src/libslic3r/PrintConfig.cpp:1829
+#: src/libslic3r/PrintConfig.cpp:1944
msgid "This start procedure is inserted at the beginning, after any printer start gcode (and after any toolchange to this filament in case of multi-material printers). This is used to override settings for a specific filament. If PrusaSlicer detects M104, M109, M140 or M190 in your custom codes, such commands will not be prepended automatically so you're free to customize the order of heating commands and other custom actions. Note that you can use placeholder variables for all PrusaSlicer settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want. If you have multiple extruders, the gcode is processed in extruder order."
msgstr "Este procedimiento de inicio se inserta al principio, después de que cualquier impresora inicie un código G(y después de cualquier cambio de herramienta a este filamento en el caso de impresoras de materiales múltiples). Esto se utiliza para anular la configuración de un filamento específico. Si PrusaSlicer detecta un M104, M109, M140 o M190 en tus códigos personalizados, dichos comandos no se agregarán automáticamente, por lo que puede personalizar el orden de los comandos de calentamiento y otras acciones personalizadas. Ten en cuenta que puedes usar variables de marcador de posición para todas las configuraciones de PrusaSlicer, por lo que puedes colocar un comando \"M109 S [first_layer_temperature]\" donde lo desees. Si tienes varias extrusorrs, el código G se procesa en el orden del extrusor."
-#: src/libslic3r/PrintConfig.cpp:1814
+#: src/libslic3r/PrintConfig.cpp:1929
msgid "This start procedure is inserted at the beginning, after bed has reached the target temperature and extruder just started heating, and before extruder has finished heating. If PrusaSlicer detects M104 or M190 in your custom codes, such commands will not be prepended automatically so you're free to customize the order of heating commands and other custom actions. Note that you can use placeholder variables for all PrusaSlicer settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."
-msgstr "Este procedimiento de inicio se inserta al principio, después de que la bse ha alcanzado la temperatura objetivo y el extrusor acaba de comenzar a calentar, y antes de que el extrusor haya terminado de calentar. Si PrusaSlicer detecta un M104 o M190 en tus códigos personalizados, dichos comandos no se agregarán automáticamente, por lo que se puede personalizar el orden de los comandos de calentamiento y otras acciones personalizadas. Ten en cuenta que puedes usar variables de marcador de posición para todas las configuraciones de PrusaSlicer, por lo que puedes colocar un comando \"M109 S [first_layer_temperature]\" donde lo desees."
+msgstr "Este procedimiento de inicio se inserta al principio, después de que la base ha alcanzado la temperatura objetivo y el extrusor acaba de comenzar a calentar, y antes de que el extrusor haya terminado de calentar. Si PrusaSlicer detecta un M104 o M190 en tus códigos personalizados, dichos comandos no se agregarán automáticamente, por lo que se puede personalizar el orden de los comandos de calentamiento y otras acciones personalizadas. Ten en cuenta que puedes usar variables de marcador de posición para todas las configuraciones de PrusaSlicer, por lo que puedes colocar un comando \"M109 S [first_layer_temperature]\" donde lo desees."
-#: src/libslic3r/PrintConfig.cpp:695
+#: src/libslic3r/PrintConfig.cpp:731
msgid "This string is edited by RammingDialog and contains ramming specific parameters."
msgstr "Esta cadena se modifica con el Diálogo de Empuje y contiene parámetros específicos de empuje."
-#: src/libslic3r/PrintConfig.cpp:2286
+#: src/libslic3r/PrintConfig.cpp:2429
msgid "This value will be added (or subtracted) from all the Z coordinates in the output G-code. It is used to compensate for bad Z endstop position: for example, if your endstop zero actually leaves the nozzle 0.3mm far from the print bed, set this to -0.3 (or fix your endstop)."
msgstr "Este valor será añadido (o eliminado) de todas las coordenadas Z en el G-code de salida. Se usa para compensar una mala posición del final de carrera Z: por ejemplo, si tu interruptor deja la boquilla a 0.3mm de la base de impresión, ajustalo a -0.3 (o arregla tu interruptor)."
-#: src/libslic3r/PrintConfig.cpp:2208
+#: src/libslic3r/PrintConfig.cpp:2351
msgid "This vector saves required volumes to change from/to each tool used on the wipe tower. These values are used to simplify creation of the full purging volumes below."
msgstr "Este vector guarda los volúmenes necesarios para cambiar desde/hasta cada herramienta usada en la torre de limpieza. Estos valores se emplean para simplificar la creación de los volúmenes totales de purga más abajo."
#: src/slic3r/GUI/UpdateDialogs.cpp:216
-#, c-format
-msgid ""
-"This version of %s is not compatible with currently installed configuration bundles.\n"
-"This probably happened as a result of running an older %s after using a newer one.\n"
-"\n"
-"You may either exit %s and try again with a newer version, or you may re-run the initial configuration. Doing so will create a backup snapshot of the existing configuration before installing files compatible with this %s."
-msgstr ""
-"Esta versión de %s no es compatible con los grupos de configuraciones instaladas. Esto sucede probablemente por ejecutar una versión de %s después de haber usado una más reciente.\n"
-"\n"
-"Puedes salir de %s e intentarlo de nuevo con una versión más reciente, o puedes volver a ejecutar la configuración inicial. Al hacerlo se creará una copia de respaldo de la configuración existente antes de instalar la nueva compatible con esta versión de %s."
+#, possible-c-format
+msgid "This version of %s is not compatible with currently installed configuration bundles.\nThis probably happened as a result of running an older %s after using a newer one.\n\nYou may either exit %s and try again with a newer version, or you may re-run the initial configuration. Doing so will create a backup snapshot of the existing configuration before installing files compatible with this %s."
+msgstr "Esta versión de %s no es compatible con los grupos de configuraciones instaladas. Esto sucede probablemente por ejecutar una versión de %s después de haber usado una más reciente.\n\nPuedes salir de %s e intentarlo de nuevo con una versión más reciente, o puedes volver a ejecutar la configuración inicial. Al hacerlo se creará una copia de respaldo de la configuración existente antes de instalar la nueva compatible con esta versión de %s."
-#: src/libslic3r/PrintConfig.cpp:2458
+#: src/libslic3r/PrintConfig.cpp:2601
msgid "This will apply a gamma correction to the rasterized 2D polygons. A gamma value of zero means thresholding with the threshold in the middle. This behaviour eliminates antialiasing without losing holes in polygons."
msgstr "Esto aplicará una corrección gamma a los polígonos 2D rasterizados. Un valor gamma de cero significa que el umbral se encuentra en el medio. Este comportamiento elimina el antialiasing sin perder agujeros en los polígonos."
-#: src/libslic3r/PrintConfig.cpp:2081
+#: src/libslic3r/PrintConfig.cpp:2224
msgid "Threads"
msgstr "Núcleos"
-#: src/libslic3r/PrintConfig.cpp:2082
+#: src/libslic3r/PrintConfig.cpp:2225
msgid "Threads are used to parallelize long-running tasks. Optimal threads number is slightly above the number of available cores/processors."
msgstr "Núcleos usados para tareas multi-recurso. Número óptimo de núcleos es ligeramente sobre el numero de núcleos/procesadores disponibles."
-#: src/slic3r/GUI/Tab.cpp:2093
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:235
+msgid "Threshold:"
+msgstr "Umbral:"
+
+#: src/slic3r/GUI/Tab.cpp:2263
msgid "Tilt"
msgstr "Inclinación"
-#: src/slic3r/GUI/Tab.cpp:2094
+#: src/slic3r/GUI/Tab.cpp:2264
msgid "Tilt time"
msgstr "Tiempo de inclinación"
+#: src/slic3r/GUI/GCodeViewer.cpp:2225 src/slic3r/GUI/GCodeViewer.cpp:2233
#: src/slic3r/GUI/RammingChart.cpp:76
msgid "Time"
msgstr "Tiempo"
-#: src/libslic3r/PrintConfig.cpp:687
+#: src/libslic3r/PrintConfig.cpp:723
msgid "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new filament during a tool change (when executing the T code). This time is added to the total print time by the G-code time estimator."
msgstr "Tiempo para que el firmware de la impresora (o la Unidad Multi Material 2.0) cargue un filamento durante un cambio de herramienta (al ejecutar el código T). Este tiempo se añade al tiempo total de impresión mediante el estimador de tiempo del código G."
-#: src/libslic3r/PrintConfig.cpp:702
+#: src/libslic3r/PrintConfig.cpp:738
msgid "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a filament during a tool change (when executing the T code). This time is added to the total print time by the G-code time estimator."
msgstr "Tiempo para que el firmware de la impresora (o la Unidad Multi Material 2.0) descargue un filamento durante un cambio de herramienta (al ejecutar el código T). Este tiempo se añade al tiempo total de impresión mediante el estimador de tiempo del código G."
-#: src/libslic3r/PrintConfig.cpp:2407
+#: src/libslic3r/PrintConfig.cpp:2550
msgid "Time of the fast tilt"
msgstr "Tiempo de la inclinación rápida"
-#: src/libslic3r/PrintConfig.cpp:2416
+#: src/libslic3r/PrintConfig.cpp:2559
msgid "Time of the slow tilt"
msgstr "Tiempo de la inclinación lenta"
-#: src/libslic3r/PrintConfig.cpp:641
+#: src/libslic3r/PrintConfig.cpp:677
msgid "Time to wait after the filament is unloaded. May help to get reliable toolchanges with flexible materials that may need more time to shrink to original dimensions."
msgstr "Tiempo de espera después de que se ha descargado el filamento. Puede ayudar para conseguir cambios de herramienta fiables con materiales flexibles que pueden necesitar más tiempo para encogerse a su tamaño original."
-#: src/slic3r/GUI/Tab.cpp:966
+#: src/slic3r/GUI/GCodeViewer.cpp:2197
+msgid "to"
+msgstr "a"
+
+#: src/slic3r/GUI/Tab.cpp:1284
msgid "To do that please specify a new name for the preset."
msgstr "Para hacerlo por favor especifique un nuevo nombre para esos ajustes."
-#: src/slic3r/GUI/Plater.cpp:4014
+#: src/slic3r/GUI/Plater.cpp:3934
msgid "To objects"
msgstr "A los objetos"
-#: src/slic3r/GUI/Plater.cpp:4016
+#: src/slic3r/GUI/Plater.cpp:3936
msgid "To parts"
msgstr "A las piezas"
-#: src/slic3r/GUI/Tab.cpp:1756
+#: src/slic3r/Utils/Http.cpp:82
+msgid "To specify the system certificate store manually, please set the %1% environment variable to the correct CA bundle and restart the application."
+msgstr "Para especificar el almacén de certificados del sistema manualmente, configure la variable de entorno %1% en el paquete CA correcto y reinicia la aplicación."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:360
msgid "To use a custom CA file, please import your CA file into Certificate Store / Keychain."
msgstr "Para usar un archivo CA personalizado, importa tu archivo CA al Almacén de Certificados/Llavero."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263
-#, c-format
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:271
+#, possible-c-format
msgid "Toggle %c axis mirroring"
msgstr "Activar reflejo del eje %c"
-#: src/libslic3r/Zipper.cpp:34
+#: src/libslic3r/miniz_extension.cpp:93
msgid "too many files"
msgstr "demasiados archivos"
-#: src/libslic3r/SLAPrintSteps.cpp:190
-msgid "Too much overlapping holes."
+#: src/libslic3r/SLAPrintSteps.cpp:192
+msgid "Too many overlapping holes."
msgstr "Demasiados agujeros superpuestos."
-#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/GUI_Preview.cpp:335
-#: src/slic3r/GUI/GUI_Preview.cpp:519 src/slic3r/GUI/GUI_Preview.cpp:574
-#: src/slic3r/GUI/GUI_Preview.cpp:835 src/libslic3r/GCode/PreviewData.cpp:357
+#: src/slic3r/GUI/GCodeViewer.cpp:2241 src/slic3r/GUI/GUI_Preview.cpp:281
+#: src/slic3r/GUI/GUI_Preview.cpp:453 src/slic3r/GUI/GUI_Preview.cpp:693
+#: src/slic3r/GUI/GUI_Preview.cpp:786 src/slic3r/GUI/GUI_Preview.cpp:1270
+#: src/libslic3r/GCode/PreviewData.cpp:362
msgid "Tool"
msgstr "Herramienta"
@@ -8348,54 +9637,71 @@ msgstr "Herramienta"
msgid "Tool #"
msgstr "Herramienta nº"
-#: src/slic3r/GUI/Tab.cpp:2000 src/libslic3r/PrintConfig.cpp:2093
+#: src/slic3r/GUI/Tab.cpp:2189 src/libslic3r/PrintConfig.cpp:2236
msgid "Tool change G-code"
msgstr "Código G de cambio de herramienta"
-#: src/slic3r/GUI/Tab.cpp:1491
+#: src/slic3r/GUI/GCodeViewer.cpp:2530 src/slic3r/GUI/GUI_Preview.cpp:1474
+msgid "Tool changes"
+msgstr "Cambios de herramienta"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:1479
+msgid "Tool marker"
+msgstr "Marcador de herramienta"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:223
+msgid "Tool position"
+msgstr "Posición de herramienta"
+
+#: src/slic3r/GUI/Tab.cpp:1837
msgid "Toolchange parameters with single extruder MM printers"
msgstr "Parámetros del cambio de herramienta para impresoras de un único extrusor MM"
#. TRN To be shown in the main menu View->Top
#. TRN To be shown in Print Settings "Top solid layers"
-#: src/slic3r/GUI/MainFrame.cpp:662 src/libslic3r/PrintConfig.cpp:2132
-#: src/libslic3r/PrintConfig.cpp:2141
+#: src/slic3r/GUI/MainFrame.cpp:959 src/slic3r/GUI/MainFrame.cpp:1279
+#: src/libslic3r/PrintConfig.cpp:2275 src/libslic3r/PrintConfig.cpp:2284
msgid "Top"
msgstr "Superior"
-#: src/slic3r/GUI/PresetHints.cpp:304
+#: src/slic3r/GUI/PresetHints.cpp:302
msgid "Top / bottom shell thickness hint: Not available due to invalid layer height."
msgstr "Sugerencia de grosor de la carcasa superior / inferior: no disponible debido a una altura de capa inválida."
-#: src/libslic3r/PrintConfig.cpp:415
+#: src/libslic3r/PrintConfig.cpp:449
msgid "Top fill pattern"
msgstr "Patrón de relleno superior"
-#: src/slic3r/GUI/PresetHints.cpp:323
+#: src/slic3r/GUI/PresetHints.cpp:321
msgid "Top is open."
msgstr "La parte superior está abierta."
-#: src/slic3r/GUI/PresetHints.cpp:317
+#: src/slic3r/GUI/PresetHints.cpp:315
msgid "Top shell is %1% mm thick for layer height %2% mm."
msgstr "La tapa superior es de %1% mm de espesor con una altura de capa de %2% mm."
-#: src/slic3r/GUI/PresetHints.cpp:192
+#: src/slic3r/GUI/PresetHints.cpp:191
msgid "top solid infill"
msgstr "relleno sólido superior"
-#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:315
-#: src/libslic3r/PrintConfig.cpp:2105 src/libslic3r/PrintConfig.cpp:2117
+#: src/slic3r/GUI/GUI_Preview.cpp:306 src/libslic3r/ExtrusionEntity.cpp:319
+#: src/libslic3r/ExtrusionEntity.cpp:346 src/libslic3r/PrintConfig.cpp:2248
+#: src/libslic3r/PrintConfig.cpp:2260
msgid "Top solid infill"
msgstr "Relleno sólido superior"
-#: src/libslic3r/PrintConfig.cpp:2135
+#: src/libslic3r/PrintConfig.cpp:2278
msgid "Top solid layers"
msgstr "Capas solidas superiores"
-#: src/slic3r/GUI/MainFrame.cpp:662
+#: src/slic3r/GUI/MainFrame.cpp:959 src/slic3r/GUI/MainFrame.cpp:1279
msgid "Top View"
msgstr "Vista superior"
+#: src/libslic3r/PrintConfig.cpp:1211
+msgid "Topmost surface only"
+msgstr "Solo en la superficie superior"
+
#: src/slic3r/GUI/WipeTowerDialog.cpp:285
msgid "Total purging volume is calculated by summing two values below, depending on which tools are loaded/unloaded."
msgstr "El volumen total de purga se calcula sumando dos valors más abajo, dependiendo de qué filamentos se carguen/descarguen."
@@ -8408,172 +9714,180 @@ msgstr "Volumen total empujado"
msgid "Total ramming time"
msgstr "Tiempo de empuje total"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:640
+msgid "Transfer"
+msgstr "Transferir"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:745
+msgid "Transfer the selected options to the newly selected preset \"%1%\"."
+msgstr "Transferir las opciones seleccionadas al nuevo ajuste seleccionado \"%1%\"."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:740
+msgid "Transfer the selected settings to the newly selected preset."
+msgstr "Transfiera los ajustes seleccionados al preajuste recién seleccionado."
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:561
msgid "Translate"
msgstr "Traducir"
-#: src/slic3r/GUI/Mouse3DController.cpp:300
-#: src/slic3r/GUI/Mouse3DController.cpp:317
+#: src/slic3r/GUI/Mouse3DController.cpp:282
+#: src/slic3r/GUI/Mouse3DController.cpp:303
msgid "Translation"
msgstr "Translación"
-#: src/slic3r/GUI/GUI_Preview.cpp:253 src/libslic3r/PrintConfig.cpp:2152
+#: src/slic3r/GUI/GCodeViewer.cpp:2489 src/slic3r/GUI/GUI_Preview.cpp:335
+#: src/slic3r/GUI/GUI_Preview.cpp:1471 src/libslic3r/PrintConfig.cpp:2295
msgid "Travel"
msgstr "Recorrido"
-#: src/libslic3r/PrintConfig.cpp:845
+#: src/libslic3r/PrintConfig.cpp:883
msgid "Triangles"
msgstr "Triángulos"
-#: src/libslic3r/PrintConfig.cpp:3448
+#: src/libslic3r/PrintConfig.cpp:3647
msgid "Try to repair any non-manifold meshes (this option is implicitly added whenever we need to slice the model to perform the requested action)."
msgstr "Intenta reparar cualquier malla no múltiple (esta opción se agrega implícitamente cada vez que necesitamos laminar el modelo para realizar la acción solicitada)."
-#: src/libslic3r/PrintConfig.cpp:1467
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:165
+msgid "Type here the name of your printer device"
+msgstr "Escribe aquí el nombre de tu dispositivo de impresión"
+
+#: src/libslic3r/PrintConfig.cpp:1575
msgid "Type of the printer."
msgstr "Tipo de impresora."
-#: src/slic3r/GUI/ConfigWizard.cpp:2013 src/slic3r/GUI/GUI_ObjectList.cpp:3553
+#: src/slic3r/GUI/ConfigWizard.cpp:2524 src/slic3r/GUI/ConfigWizard.cpp:2526
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4016
msgid "Type:"
msgstr "Tipo:"
-#: src/slic3r/GUI/Plater.cpp:3428
+#: src/slic3r/GUI/OpenGLManager.cpp:275
+#, possible-c-format
+msgid "Unable to load the following shaders:\n%s"
+msgstr "No se pueden cargar las siguientes sombras:\n%s"
+
+#: src/slic3r/GUI/Plater.cpp:3233
msgid "Unable to reload:"
msgstr "Incapaz de recargar:"
-#: src/libslic3r/Zipper.cpp:32
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:137
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:146
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:845
+msgid "Undef"
+msgstr "Undef"
+
+#: src/libslic3r/miniz_extension.cpp:91
msgid "undefined error"
msgstr "error no definido"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4624 src/slic3r/GUI/KBShortcutsDialog.cpp:130
-#: src/slic3r/GUI/MainFrame.cpp:581
+#: src/slic3r/GUI/GLCanvas3D.cpp:5028 src/slic3r/GUI/KBShortcutsDialog.cpp:125
+#: src/slic3r/GUI/MainFrame.cpp:1187
msgid "Undo"
msgstr "Deshacer"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4065
-#, c-format
+#: src/slic3r/GUI/GLCanvas3D.cpp:4382
+#, possible-c-format
msgid "Undo %1$d Action"
msgid_plural "Undo %1$d Actions"
msgstr[0] "Deshacer %1$d Acción"
msgstr[1] "Deshacer %1$d Acciones"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4047
+#: src/slic3r/GUI/GLCanvas3D.cpp:4361
msgid "Undo History"
msgstr "Deshacer Historia"
-#: src/libslic3r/Zipper.cpp:56
+#: src/libslic3r/miniz_extension.cpp:115
msgid "unexpected decompressed size"
msgstr "tamaño de descompresión inesperado"
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:27
+#: src/slic3r/GUI/GUI_Preview.cpp:299 src/libslic3r/ExtrusionEntity.cpp:310
msgid "Unknown"
msgstr "Desconocido"
-#: src/slic3r/Utils/Duet.cpp:82 src/slic3r/Utils/Duet.cpp:137
-#: src/slic3r/Utils/FlashAir.cpp:119 src/slic3r/Utils/FlashAir.cpp:140
-#: src/slic3r/Utils/FlashAir.cpp:156
+#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:139
+#: src/slic3r/Utils/FlashAir.cpp:122 src/slic3r/Utils/FlashAir.cpp:143
+#: src/slic3r/Utils/FlashAir.cpp:159
msgid "Unknown error occured"
msgstr "Ha ocurrido un error desconocido"
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:178
+msgid "Unknown error occured during exporting G-code."
+msgstr "Se produjo un error desconocido durante la exportación del código G."
+
#: src/slic3r/GUI/WipeTowerDialog.cpp:263
msgid "unloaded"
msgstr "descargado"
-#: src/libslic3r/PrintConfig.cpp:623
+#: src/libslic3r/PrintConfig.cpp:659
msgid "Unloading speed"
msgstr "Velocidad de descarga"
-#: src/libslic3r/PrintConfig.cpp:632
+#: src/libslic3r/PrintConfig.cpp:668
msgid "Unloading speed at the start"
msgstr "Velocidad de descarga al inicio"
-#: src/slic3r/GUI/Tab.cpp:3256
+#: src/slic3r/GUI/Tab.cpp:3693
msgid "UNLOCKED LOCK"
msgstr "CANDADO ABIERTO"
-#: src/slic3r/GUI/Tab.cpp:3282
-msgid ""
-"UNLOCKED LOCK icon indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\n"
-"Click to reset all settings for current option group to the system (or default) values."
-msgstr ""
-"El icono de CANDADO DESBLOQUEADO indica que se cambiaron algunas configuraciones y no son iguales a los valores del sistema (o predeterminados) para el grupo de opciones actual.\n"
-"Haz clic para restablecer todas las configuraciones para el grupo de opciones actual a los valores del sistema (o predeterminados)."
+#: src/slic3r/GUI/Tab.cpp:3719
+msgid "UNLOCKED LOCK icon indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\nClick to reset all settings for current option group to the system (or default) values."
+msgstr "El icono de CANDADO DESBLOQUEADO indica que se cambiaron algunas configuraciones y no son iguales a los valores del sistema (o predeterminados) para el grupo de opciones actual.\nHaz clic para restablecer todas las configuraciones para el grupo de opciones actual a los valores del sistema (o predeterminados)."
-#: src/slic3r/GUI/Tab.cpp:3297
-msgid ""
-"UNLOCKED LOCK icon indicates that the value was changed and is not equal to the system (or default) value.\n"
-"Click to reset current value to the system (or default) value."
-msgstr ""
-"El icono de CANDADO DESBLOQUEADO indica que se cambiaron algunas configuraciones y no son iguales a los valores del sistema (o predeterminados).\n"
-"Haz clic para reiniciar el valor actual a los del sistema (o predeterminados)"
-
-#: src/slic3r/GUI/Plater.cpp:5203
-#, c-format
-msgid "Unmounting successful. The device %s(%s) can now be safely removed from the computer."
-msgstr "Expulsión exitosa. El dispositivo %s (%s) puede desconectarse del ordenador de forma segura."
-
-#: src/slic3r/GUI/GUI_Preview.cpp:255
-msgid "Unretractions"
-msgstr "Desretracciones"
+#: src/slic3r/GUI/Tab.cpp:3734
+msgid "UNLOCKED LOCK icon indicates that the value was changed and is not equal to the system (or default) value.\nClick to reset current value to the system (or default) value."
+msgstr "El icono de CANDADO DESBLOQUEADO indica que se cambiaron algunas configuraciones y no son iguales a los valores del sistema (o predeterminados).\nHaz clic para reiniciar el valor actual a los del sistema (o predeterminados)"
-#: src/slic3r/GUI/Tab.cpp:2947
-msgid "Unsaved Changes"
-msgstr "Cambios no guardados"
-
-#: src/slic3r/GUI/GUI_App.cpp:935
-msgid "Unsaved Presets"
-msgstr "Ajustes iniciales no guardados"
-
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:173
msgid "Unselect gizmo or clear selection"
msgstr "Deseleccionar gizmo o borrar selección"
-#: src/libslic3r/Zipper.cpp:60
+#: src/libslic3r/miniz_extension.cpp:119
msgid "unsupported central directory size"
msgstr "tamaño del directorio central no compatible"
-#: src/libslic3r/Zipper.cpp:40
+#: src/libslic3r/miniz_extension.cpp:99
msgid "unsupported encryption"
msgstr "encriptación no compatible"
-#: src/libslic3r/Zipper.cpp:42
+#: src/libslic3r/miniz_extension.cpp:101
msgid "unsupported feature"
msgstr "característica no compatible"
-#: src/libslic3r/Zipper.cpp:38
+#: src/libslic3r/miniz_extension.cpp:97
msgid "unsupported method"
msgstr "método no compatible"
-#: src/libslic3r/Zipper.cpp:50
+#: src/libslic3r/miniz_extension.cpp:109
msgid "unsupported multidisk archive"
msgstr "archivo multidisk no compatible"
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:292
+#: src/slic3r/GUI/OpenGLManager.cpp:267
msgid "Unsupported OpenGL version"
msgstr "Versión de OpenGL no soportada"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3420
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3883
msgid "Unsupported selection"
msgstr "Selección no soportada"
-#: src/slic3r/GUI/GLCanvas3D.cpp:955
-#, c-format
-msgid "up to %.2f mm"
-msgstr "hasta %.2f mm"
+#: src/slic3r/GUI/GCodeViewer.cpp:2183
+msgid "up to"
+msgstr "hasta"
#: src/slic3r/GUI/UpdateDialogs.cpp:38
msgid "Update available"
msgstr "Actualización disponible"
-#: src/slic3r/GUI/ConfigWizard.cpp:779 src/slic3r/GUI/Preferences.cpp:80
+#: src/slic3r/GUI/ConfigWizard.cpp:1138 src/slic3r/GUI/Preferences.cpp:97
msgid "Update built-in Presets automatically"
msgstr "Actualiza los ajustes de fábrica automáticamente"
-#: src/slic3r/GUI/ConfigWizard.cpp:761
+#: src/slic3r/GUI/ConfigWizard.cpp:1120
msgid "Updates"
msgstr "Actualizaciones"
-#: src/slic3r/GUI/ConfigWizard.cpp:786
+#: src/slic3r/GUI/ConfigWizard.cpp:1145
msgid "Updates are never applied without user's consent and never overwrite user's customized settings."
msgstr "Las actualizaciones nunca se realizan sin el consentimiento del usuario y nunca sobre-escriben ajustes personalizados del usuario."
@@ -8581,7 +9895,7 @@ msgstr "Las actualizaciones nunca se realizan sin el consentimiento del usuario
msgid "Upgrade"
msgstr "Actualización"
-#: src/slic3r/GUI/GUI_App.cpp:824
+#: src/slic3r/GUI/GUI_App.cpp:1522
msgid "Upload a firmware image into an Arduino based printer"
msgstr "Cargar una imagen de firmware a una impresora basada en Arduino"
@@ -8597,101 +9911,122 @@ msgstr "Cargar el host de impresión con el siguiente nombre de archivo:"
msgid "Uploading"
msgstr "Subiendo"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:204
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:206
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
msgid "Upper Layer"
msgstr "Capa superior"
-#: src/slic3r/GUI/Tab.cpp:1900
-msgid "USB/Serial connection"
-msgstr "Conexión USB/Serial"
-
-#: src/libslic3r/PrintConfig.cpp:1662
-msgid "USB/serial port for printer connection."
-msgstr "Puerto USB/serial para la conexión con la impresora."
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
+msgid "Upper layer"
+msgstr "Capa superior"
-#: src/slic3r/GUI/DoubleSlider.cpp:1147
+#: src/slic3r/GUI/DoubleSlider.cpp:1276
msgid "Use another extruder"
msgstr "Usar otro extrusor"
-#: src/slic3r/GUI/Preferences.cpp:143
+#: src/slic3r/GUI/Preferences.cpp:220
msgid "Use custom size for toolbar icons"
msgstr "Usar tamaño personalizado para los iconos de la barra de herramientas"
-#: src/libslic3r/PrintConfig.cpp:2161
+#: src/slic3r/GUI/Preferences.cpp:268
+msgid "Use environment map"
+msgstr "Usar mapa ambiental"
+
+#: src/libslic3r/PrintConfig.cpp:2304
msgid "Use firmware retraction"
msgstr "Usar la retracción del firmware"
+#: src/slic3r/GUI/ImGuiWrapper.cpp:800 src/slic3r/GUI/Search.cpp:464
+msgid "Use for search"
+msgstr "Usar para buscar"
+
+#: src/libslic3r/PrintConfig.cpp:1218
+msgid "Use for time estimate"
+msgstr "Usar para la estimación de tiempo"
+
#: src/slic3r/GUI/PrintHostDialogs.cpp:42
msgid "Use forward slashes ( / ) as a directory separator if needed."
msgstr "Use barras diagonales ( / ) como separadores de directorios si fuese necesario."
-#: src/slic3r/GUI/Preferences.cpp:126
+#: src/slic3r/GUI/Preferences.cpp:191
msgid "Use free camera"
msgstr "Usar la cámara libre"
-#: src/libslic3r/PrintConfig.cpp:2780
+#: src/slic3r/GUI/ConfigWizard.cpp:1188
+msgid "Use inches"
+msgstr "Usar pulgadas"
+
+#: src/libslic3r/PrintConfig.cpp:2944
msgid "Use pad"
msgstr "Usar pad"
-#: src/slic3r/GUI/Preferences.cpp:119
+#: src/slic3r/GUI/Preferences.cpp:184
msgid "Use perspective camera"
msgstr "Usar cámara en perspectiva"
-#: src/libslic3r/PrintConfig.cpp:2168
+#: src/libslic3r/PrintConfig.cpp:2311
msgid "Use relative E distances"
msgstr "Usar las distancias relativas en E"
-#: src/slic3r/GUI/Preferences.cpp:104
+#: src/slic3r/GUI/Preferences.cpp:135
msgid "Use Retina resolution for the 3D scene"
msgstr "Usa la resolución de Retina para la escena 3D"
-#: src/libslic3r/PrintConfig.cpp:540
+#: src/libslic3r/PrintConfig.cpp:576
msgid "Use this option to set the axis letter associated to your printer's extruder (usually E but some printers use A)."
msgstr "Utiliza esta opción para ajustar la letra asociada al extrusor de tu impresora (normalmente se usa E pero otras usan A)."
-#: src/libslic3r/PrintConfig.cpp:1893
+#: src/libslic3r/PrintConfig.cpp:2035
msgid "Use this setting to rotate the support material pattern on the horizontal plane."
msgstr "Use esta configuración para rotar el patrón de material de soporte en el plano horizontal."
-#: src/libslic3r/PrintConfig.cpp:2175
+#: src/libslic3r/PrintConfig.cpp:2318
msgid "Use volumetric E"
msgstr "Usar E volumétrico"
-#: src/slic3r/GUI/DoubleSlider.cpp:1171
+#: src/slic3r/GUI/DoubleSlider.cpp:1298
msgid "used"
msgstr "usado"
-#: src/slic3r/GUI/Plater.cpp:237
+#: src/slic3r/GUI/Plater.cpp:243
msgid "Used Filament (g)"
-msgstr "Filamento usado (g)"
+msgstr "Filamento Usado (g)"
+
+#: src/slic3r/GUI/Plater.cpp:1141
+msgid "Used Filament (in)"
+msgstr "Filamento Usado (in)"
-#: src/slic3r/GUI/Plater.cpp:235 src/slic3r/GUI/Plater.cpp:1229
+#: src/slic3r/GUI/Plater.cpp:1153
+msgid "Used Filament (in³)"
+msgstr "Filamento Usado (in³)"
+
+#: src/slic3r/GUI/Plater.cpp:241 src/slic3r/GUI/Plater.cpp:1141
msgid "Used Filament (m)"
-msgstr "Filamento usado (m)"
+msgstr "Filamento Usado (m)"
-#: src/slic3r/GUI/Plater.cpp:236
+#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1153
msgid "Used Filament (mm³)"
-msgstr "Filamento usado (mm³)"
+msgstr "Filamento Usado (mm³)"
-#: src/slic3r/GUI/Plater.cpp:1191
+#: src/slic3r/GUI/Plater.cpp:1100
msgid "Used Material (ml)"
msgstr "Material usado (ml)"
-#: src/slic3r/GUI/Plater.cpp:238
+#: src/slic3r/GUI/Plater.cpp:244
msgid "Used Material (unit)"
msgstr "Material usado (unidades)"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 src/libslic3r/PrintConfig.cpp:132
msgid "User"
msgstr "Usuario"
-#: src/slic3r/GUI/Preset.cpp:1168 src/slic3r/GUI/Preset.cpp:1288
-#: src/slic3r/GUI/PresetBundle.cpp:1677
+#: src/slic3r/GUI/PresetComboBoxes.cpp:230
+#: src/slic3r/GUI/PresetComboBoxes.cpp:778
+#: src/slic3r/GUI/PresetComboBoxes.cpp:934
msgid "User presets"
msgstr "Ajustes de usuario"
-#: src/libslic3r/Zipper.cpp:90
+#: src/libslic3r/miniz_extension.cpp:149
msgid "validation failed"
msgstr "validación fallida"
@@ -8703,31 +10038,31 @@ msgstr "El valor es el mismo que el del sistema"
msgid "Value was changed and is not equal to the system value or the last saved preset"
msgstr "El valor ha cambiado y ya no es igual al valor del sistema o al último valor guardado"
-#: src/slic3r/GUI/Tab.cpp:2202
+#: src/slic3r/GUI/Tab.cpp:2371
msgid "Values in this column are for Normal mode"
msgstr "Los valores en esta columna son para el modo Normal"
-#: src/slic3r/GUI/Tab.cpp:2208
+#: src/slic3r/GUI/Tab.cpp:2377
msgid "Values in this column are for Stealth mode"
msgstr "Los valores en esta columna son para el modo Silencioso"
-#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/slic3r/GUI/GLCanvas3D.cpp:4573
+#: src/slic3r/GUI/GLCanvas3D.cpp:231 src/slic3r/GUI/GLCanvas3D.cpp:4978
msgid "Variable layer height"
msgstr "Altura de capa variable"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1709
+#: src/slic3r/GUI/GLCanvas3D.cpp:1786
msgid "Variable layer height - Adaptive"
msgstr "Altura de capa variable - Adaptativa"
-#: src/slic3r/GUI/GLCanvas3D.cpp:599
+#: src/slic3r/GUI/GLCanvas3D.cpp:565
msgid "Variable layer height - Manual edit"
msgstr "Altura de capa variable - Edicción manual"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1701
+#: src/slic3r/GUI/GLCanvas3D.cpp:1778
msgid "Variable layer height - Reset"
msgstr "Altura de capa variable - Reiniciar"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1717
+#: src/slic3r/GUI/GLCanvas3D.cpp:1794
msgid "Variable layer height - Smooth all"
msgstr "Altura de capa variable - Suavizar todo"
@@ -8735,19 +10070,20 @@ msgstr "Altura de capa variable - Suavizar todo"
msgid "variants"
msgstr "variantes"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:971
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:1289
msgid "vendor"
msgstr "fabricante"
-#: src/slic3r/GUI/ConfigWizard.cpp:565
+#: src/slic3r/GUI/ConfigWizard.cpp:589
msgid "Vendor:"
msgstr "Vendedor:"
-#: src/libslic3r/PrintConfig.cpp:928
+#: src/libslic3r/PrintConfig.cpp:972
msgid "Verbose G-code"
msgstr "Código G detallado"
-#: src/slic3r/GUI/AboutDialog.cpp:231 src/slic3r/GUI/MainFrame.cpp:64
+#: src/slic3r/GUI/AboutDialog.cpp:256 src/slic3r/GUI/GUI_App.cpp:239
+#: src/slic3r/GUI/MainFrame.cpp:164
msgid "Version"
msgstr "Versión"
@@ -8755,24 +10091,48 @@ msgstr "Versión"
msgid "version"
msgstr "versión"
-#: src/slic3r/GUI/Tab.cpp:1053
+#: src/slic3r/GUI/Tab.cpp:1375
msgid "Vertical shells"
msgstr "Carcasas verticales"
-#: src/slic3r/GUI/GUI_Preview.cpp:218
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:237
+msgid "Vertical Slider"
+msgstr "Control Deslizante Vertical"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:212
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:231
+msgid "Vertical slider - Move active thumb Down"
+msgstr "Control deslizante vertical - Mover el pulgar activo hacia Abajo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:211
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:230
+msgid "Vertical slider - Move active thumb Up"
+msgstr "Control deslizante vertical - Mover el pulgar activo hacia Arriba"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:265 src/slic3r/GUI/GUI_Preview.cpp:271
msgid "View"
msgstr "Vista"
-#: src/slic3r/GUI/ConfigWizard.cpp:813
+#: src/slic3r/GUI/ConfigWizard.cpp:1172
msgid "View mode"
msgstr "Modo de vista"
-#: src/libslic3r/SLAPrintSteps.cpp:413 src/libslic3r/SLAPrintSteps.cpp:422
-#: src/libslic3r/SLAPrintSteps.cpp:461
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:666
+msgid "Visit \"Preferences\" and check \"%1%\"\nto be asked about unsaved changes again."
+msgstr "Visita \"Preferencias\" y marca\"%1%\"\npara que se le pregunte sobre los cambios no guardados nuevamente."
+
+#: src/libslic3r/PrintConfig.cpp:3553
+msgid "Visualize an already sliced and saved G-code"
+msgstr "Visualizar un código G ya laminado y guardado"
+
+#: src/libslic3r/SLAPrintSteps.cpp:411 src/libslic3r/SLAPrintSteps.cpp:420
+#: src/libslic3r/SLAPrintSteps.cpp:459
msgid "Visualizing supports"
msgstr "Visualizar soportes"
-#: src/slic3r/GUI/Plater.cpp:161
+#: src/slic3r/GUI/Plater.cpp:167
msgid "Volume"
msgstr "Volumen"
@@ -8780,23 +10140,23 @@ msgstr "Volumen"
msgid "Volume to purge (mm³) when the filament is being"
msgstr "Volumen a purgar (mm³) cuando el filamento está siendo"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1106
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1230
msgid "Volumes in Object reordered"
msgstr "Volúmenes en Objetos reordenados"
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:218
msgid "Volumetric"
msgstr "Volumétrico"
-#: src/slic3r/GUI/Tab.cpp:1591
+#: src/slic3r/GUI/Tab.cpp:1930
msgid "Volumetric flow hints not available"
msgstr "Sugerencias de flujo volumétrico no disponibles"
-#: src/slic3r/GUI/GUI_Preview.cpp:226
+#: src/slic3r/GUI/GUI_Preview.cpp:280
msgid "Volumetric flow rate"
msgstr "Tasa de caudal volumétrico"
-#: src/libslic3r/GCode/PreviewData.cpp:355
+#: src/slic3r/GUI/GCodeViewer.cpp:2240 src/libslic3r/GCode/PreviewData.cpp:360
msgid "Volumetric flow rate (mm³/s)"
msgstr "Tasa de flujo volumétrico (mm³/seg)"
@@ -8804,151 +10164,167 @@ msgstr "Tasa de flujo volumétrico (mm³/seg)"
msgid "Volumetric speed"
msgstr "Velocidad volumétrica"
-#: src/libslic3r/PrintConfig.cpp:2915
+#: src/libslic3r/PrintConfig.cpp:3079
msgid "Wall thickness"
msgstr "Espesor de pared"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1270 src/slic3r/GUI/GUI.cpp:251
-#: src/slic3r/GUI/Tab.cpp:3084 src/slic3r/GUI/WipeTowerDialog.cpp:45
-#: src/slic3r/GUI/WipeTowerDialog.cpp:366
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1129 src/slic3r/GUI/GUI.cpp:256
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:478
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:502
+#: src/slic3r/GUI/WipeTowerDialog.cpp:45 src/slic3r/GUI/WipeTowerDialog.cpp:366
msgid "Warning"
msgstr "Peligro"
-#: src/slic3r/GUI/ConfigWizard.cpp:431
+#: src/slic3r/GUI/NotificationManager.cpp:672
+#: src/slic3r/GUI/NotificationManager.cpp:687
+#: src/slic3r/GUI/NotificationManager.cpp:702
+msgid "WARNING:"
+msgstr "AVISO:"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:449
msgid "Welcome"
msgstr "Bienvenido"
-#: src/slic3r/GUI/ConfigWizard.cpp:427
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:445
+#, possible-c-format
msgid "Welcome to the %s Configuration Assistant"
msgstr "Bienvenido al %s Asistente de Configuración"
-#: src/slic3r/GUI/ConfigWizard.cpp:429
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:447
+#, possible-c-format
msgid "Welcome to the %s Configuration Wizard"
msgstr "Bienvenido al %s Ayudante de Configuración"
-#: src/slic3r/GUI/Preferences.cpp:97
+#: src/slic3r/GUI/SavePresetDialog.cpp:310
+msgid "What would you like to do with \"%1%\" preset after saving?"
+msgstr "¿Qué te gustaría hacer con el ajuste preestablecido \"%1%\" después de guardar?"
+
+#: src/slic3r/GUI/Preferences.cpp:114
msgid "When checked, the print and filament presets are shown in the preset editor even if they are marked as incompatible with the active printer"
msgstr "Cuando está marcada, los ajustes preestablecidos de impresión y filamento se muestran en el editor de ajustes preestablecidos, incluso si están marcados como incompatibles con la impresora activa"
-#: src/slic3r/GUI/PresetHints.cpp:224
+#: src/slic3r/GUI/Preferences.cpp:122
+msgid "When checked, whenever dragging and dropping a project file on the application, shows a dialog asking to select the action to take on the file to load."
+msgstr "Cuando está marcada, cada vez que se arrastra y suelta un archivo de proyecto en la aplicación, muestra un cuadro de diálogo que solicita seleccionar la acción a realizar en el archivo a cargar."
+
+#: src/slic3r/GUI/Preferences.cpp:156
+msgid "When closing the application, always ask for unsaved changes"
+msgstr "Al cerrar la aplicación, siempre preguntar por los cambios no guardados"
+
+#: src/slic3r/GUI/PresetHints.cpp:223
msgid "when printing"
msgstr "al imprimir"
-#: src/libslic3r/PrintConfig.cpp:253
+#: src/libslic3r/PrintConfig.cpp:287
msgid "When printing multi-material objects, this settings will make Slic3r to clip the overlapping object parts one by the other (2nd part will be clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc)."
msgstr "Al imprimir objetos multi-material, esta configuración hará que slic3r recorte las partes del objeto superpuestas una por la otra (la 2da parte será recortada por la 1ra, la 3ra parte será recortada por la 1ra y 2da, etc.)."
-#: src/libslic3r/PrintConfig.cpp:305
+#: src/libslic3r/PrintConfig.cpp:339
msgid "When printing multiple objects or copies, this feature will complete each object before moving onto next one (and starting it from its bottom layer). This feature is useful to avoid the risk of ruined prints. Slic3r should warn and prevent you from extruder collisions, but beware."
msgstr "Al imprimir múltiples objetos o copias, esta característica completará cada objeto antes de pasar al siguiente (y comenzará desde la capa inferior). Esta función es útil para evitar el riesgo de impresiones arruinadas. Slic3r debería advertirte y evitar las colisiones del extrusor, pero ten cuidado."
-#: src/libslic3r/PrintConfig.cpp:891
+#: src/libslic3r/PrintConfig.cpp:933
msgid "When printing with very low layer heights, you might still want to print a thicker bottom layer to improve adhesion and tolerance for non perfect build plates. This can be expressed as an absolute value or as a percentage (for example: 150%) over the default layer height."
msgstr "Al imprimir con alturas de capa muy bajas, es posible que desee imprimir una capa inferior más gruesa para mejorar la adhesión y la tolerancia de las placas de construcción no perfectas. Esto se puede expresar como un valor absoluto o como un porcentaje (por ejemplo: 150%) sobre la altura de capa predeterminada."
-#: src/libslic3r/PrintConfig.cpp:1553
+#: src/libslic3r/PrintConfig.cpp:1661
msgid "When retraction is triggered before changing tool, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder)."
msgstr "Cuando se desencadena la retracción antes de cambiar la herramienta, el filamento se retira en la cantidad especificada (la longitud se mide en el filamento sin procesar, antes de que entre en el extrusor)."
-#: src/libslic3r/PrintConfig.cpp:1545
+#: src/libslic3r/PrintConfig.cpp:1653
msgid "When retraction is triggered, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder)."
msgstr "Cuando se activa la retracción, el filamento se retira en la cantidad especificada (la longitud se mide en el filamento sin procesar, antes de que entre en el extrusor)."
-#: src/libslic3r/PrintConfig.cpp:1391
+#: src/libslic3r/PrintConfig.cpp:1499
msgid "When set to zero, the distance the filament is moved from parking position during load is exactly the same as it was moved back during unload. When positive, it is loaded further, if negative, the loading move is shorter than unloading."
msgstr "Cuando se establece en cero, la distancia que el filamento se mueve desde la posición de estacionamiento durante la carga es exactamente la misma que se usó durante la descarga. Cuando es positivo, se carga más lejos, si es negativo, el movimiento de carga es más corto que el de descarga."
-#: src/libslic3r/PrintConfig.cpp:1238
+#: src/libslic3r/PrintConfig.cpp:1346
msgid "When setting other speed settings to 0 Slic3r will autocalculate the optimal speed in order to keep constant extruder pressure. This experimental setting is used to set the highest print speed you want to allow."
msgstr "Al establecer otras configuraciones de velocidad en 0, Slic3r calculará automáticamente la velocidad óptima para mantener constante la presión en el extrusor. Esta configuración experimental se utiliza para establecer la velocidad de impresión más alta que desea permitir."
-#: src/libslic3r/PrintConfig.cpp:1597
+#: src/libslic3r/PrintConfig.cpp:1705
msgid "When the retraction is compensated after changing tool, the extruder will push this additional amount of filament."
msgstr "Cuando la retracción se compensa después de cambiar la herramienta, el extrusor empujará esta cantidad adicional de filamento."
-#: src/libslic3r/PrintConfig.cpp:1589
+#: src/libslic3r/PrintConfig.cpp:1697
msgid "When the retraction is compensated after the travel move, the extruder will push this additional amount of filament. This setting is rarely needed."
msgstr "Cuando la retracción se compensa después de un movimiento, el extrusor necesitará introducir más filamento. Este ajuste raramente se necesita."
-#: src/slic3r/GUI/Tab.cpp:3263
+#: src/slic3r/GUI/Tab.cpp:3700
msgid "WHITE BULLET"
msgstr "VIÑETA BLANCA"
-#: src/slic3r/GUI/Tab.cpp:3285
+#: src/slic3r/GUI/Tab.cpp:3722
msgid "WHITE BULLET icon indicates a non system (or non default) preset."
msgstr "El icono de VIÑETA BLANCA un ajuste no del sistema (o no por defecto)"
-#: src/slic3r/GUI/Tab.cpp:3288
+#: src/slic3r/GUI/Tab.cpp:3725
msgid "WHITE BULLET icon indicates that the settings are the same as in the last saved preset for the current option group."
msgstr "El símbolo de VIÑETA BLANCA indica que los ajustes son los mismos que los de la última vez que salvaste los ajustes para el grupo de opciones actual."
-#: src/slic3r/GUI/Tab.cpp:3303
+#: src/slic3r/GUI/Tab.cpp:3740
msgid "WHITE BULLET icon indicates that the value is the same as in the last saved preset."
msgstr "El símbolo de VIÑETA BLANCA indica que los valores son los mismos que los de los ajustes guardados la última vez."
-#: src/slic3r/GUI/GUI_Preview.cpp:223 src/libslic3r/PrintConfig.cpp:2238
+#: src/slic3r/GUI/GUI_Preview.cpp:277 src/libslic3r/PrintConfig.cpp:2381
msgid "Width"
msgstr "Ancho"
-#: src/libslic3r/GCode/PreviewData.cpp:349
+#: src/slic3r/GUI/GCodeViewer.cpp:2237 src/libslic3r/GCode/PreviewData.cpp:354
msgid "Width (mm)"
msgstr "Ancho (mm)"
-#: src/libslic3r/PrintConfig.cpp:2640
+#: src/libslic3r/PrintConfig.cpp:2783
msgid "Width from the back sphere center to the front sphere center"
msgstr "Ancho desde el centro de la esfera trasera al centro de la esfera delantera"
-#: src/libslic3r/PrintConfig.cpp:2239
+#: src/libslic3r/PrintConfig.cpp:2382
msgid "Width of a wipe tower"
msgstr "Ancho de la torre de limpieza"
-#: src/libslic3r/PrintConfig.cpp:2891
+#: src/libslic3r/PrintConfig.cpp:3055
msgid "Width of the connector sticks which connect the object and the generated pad."
msgstr "Ancho de los palitos de apoyo que conectan la pieza y la base generada."
-#: src/libslic3r/PrintConfig.cpp:2354
+#: src/libslic3r/PrintConfig.cpp:2497
msgid "Width of the display"
msgstr "Ancho de la pantalla"
-#: src/slic3r/GUI/PresetHints.cpp:48
-msgid "will always run at %1%%%"
-msgstr "siempre funcionará al %1%%%"
-
-#: src/slic3r/GUI/PresetHints.cpp:55
-msgid "will be turned off."
-msgstr "será apagada."
-
-#: src/libslic3r/PrintConfig.cpp:2441
+#: src/libslic3r/PrintConfig.cpp:2584
msgid "Will inflate or deflate the sliced 2D polygons according to the sign of the correction."
msgstr "Aumentará o reducirá los polígonos 2D laminados de acuerdo con el signo de la corrección."
-#: src/libslic3r/PrintConfig.cpp:2261
+#: src/slic3r/GUI/GCodeViewer.cpp:2660 src/slic3r/GUI/GCodeViewer.cpp:2663
+#: src/slic3r/GUI/GUI_Preview.cpp:978
+msgid "Wipe"
+msgstr "Limpiar"
+
+#: src/libslic3r/PrintConfig.cpp:2404
msgid "Wipe into this object"
msgstr "Limpiar en el objeto"
-#: src/libslic3r/PrintConfig.cpp:2253
+#: src/libslic3r/PrintConfig.cpp:2396
msgid "Wipe into this object's infill"
msgstr "Limpiar en el relleno del objeto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:101
-#: src/slic3r/GUI/GUI_ObjectList.cpp:619 src/libslic3r/PrintConfig.cpp:2252
-#: src/libslic3r/PrintConfig.cpp:2260
+#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:99
+#: src/slic3r/GUI/GUI_ObjectList.cpp:658 src/libslic3r/PrintConfig.cpp:2395
+#: src/libslic3r/PrintConfig.cpp:2403
msgid "Wipe options"
msgstr "Opciones de limpieza"
-#: src/slic3r/GUI/GUI_Preview.cpp:248 src/slic3r/GUI/Tab.cpp:1191
-#: src/libslic3r/ExtrusionEntity.cpp:321
+#: src/slic3r/GUI/GUI_Preview.cpp:313 src/slic3r/GUI/Tab.cpp:1521
+#: src/libslic3r/ExtrusionEntity.cpp:326 src/libslic3r/ExtrusionEntity.cpp:360
msgid "Wipe tower"
msgstr "Torre de limpieza"
-#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245
+#: src/slic3r/GUI/Plater.cpp:1143 src/slic3r/GUI/Plater.cpp:1160
msgid "wipe tower"
msgstr "torre de limpieza"
-#: src/slic3r/GUI/ConfigManipulation.cpp:120
-#: src/slic3r/GUI/ConfigManipulation.cpp:140
+#: src/slic3r/GUI/ConfigManipulation.cpp:119
+#: src/slic3r/GUI/ConfigManipulation.cpp:139
msgid "Wipe Tower"
msgstr "Torre de limpieza"
@@ -8956,130 +10332,141 @@ msgstr "Torre de limpieza"
msgid "Wipe tower - Purging volume adjustment"
msgstr "Torre de limpieza - Ajuste del volumen de purga"
-#: src/slic3r/GUI/Tab.cpp:1488
+#: src/slic3r/GUI/Tab.cpp:1834
msgid "Wipe tower parameters"
msgstr "Parámetros de la torre de limpieza"
-#: src/libslic3r/PrintConfig.cpp:2245
+#: src/libslic3r/PrintConfig.cpp:2388
msgid "Wipe tower rotation angle"
msgstr "Ãngulo de rotación de la torre de limpieza"
-#: src/libslic3r/PrintConfig.cpp:2246
+#: src/libslic3r/PrintConfig.cpp:2389
msgid "Wipe tower rotation angle with respect to x-axis."
msgstr "Ãngulo de rotación de la torre de limpieza con respecto al eje X."
-#: src/libslic3r/PrintConfig.cpp:2193
+#: src/libslic3r/PrintConfig.cpp:2336
msgid "Wipe while retracting"
msgstr "Limpiar mientras se retrae"
-#: src/slic3r/GUI/PresetHints.cpp:225
+#: src/slic3r/GUI/PresetHints.cpp:224
msgid "with a volumetric rate"
msgstr "con una tasa volumétrica"
-#: src/libslic3r/PrintConfig.cpp:1530
+#: src/libslic3r/PrintConfig.cpp:1638
msgid "With bowden extruders, it may be wise to do some amount of quick retract before doing the wipe movement."
msgstr "Con extrusores bowden, puede ser recomendable realizar una retracción rápida antes de realizar el movimiento de limpiar."
-#: src/libslic3r/PrintConfig.cpp:2056
+#: src/libslic3r/PrintConfig.cpp:2198
msgid "With sheath around the support"
msgstr "Con protección alrededor del soporte"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:68
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:111
msgid "World coordinates"
msgstr "Coordenadas mundiales"
#: src/slic3r/GUI/UpdateDialogs.cpp:92
-msgid ""
-"Would you like to install it?\n"
-"\n"
-"Note that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n"
-"\n"
-"Updated configuration bundles:"
-msgstr ""
-"¿Te gustaría instalarlo?\n"
-"\n"
-"Ten en cuenta que primero se creará una instantánea de la configuración. Así que se puede recuperar en cualquier momento en caso de que hubiera algún problema con la nueva versión.\n"
-"Updated configuration bundles:"
+msgid "Would you like to install it?\n\nNote that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n\nUpdated configuration bundles:"
+msgstr "¿Te gustaría instalarlo?\n\nTen en cuenta que primero se creará una instantánea de la configuración. Así que se puede recuperar en cualquier momento en caso de que hubiera algún problema con la nueva versión.\nUpdated configuration bundles:"
+
+#: src/slic3r/GUI/GUI_App.cpp:1802
+msgid "Would you like to stop uploads and close the program?"
+msgstr "¿Te gustaría detener las subidas y cerrar el programa?"
-#: src/libslic3r/Zipper.cpp:92
+#: src/libslic3r/miniz_extension.cpp:151
msgid "write calledback failed"
msgstr "fallo write calledback"
-#: src/libslic3r/PrintConfig.cpp:3382
+#: src/libslic3r/PrintConfig.cpp:3581
msgid "Write information about the model to the console."
msgstr "Escribir información sobre el modelo en la consola."
-#: src/slic3r/Utils/Duet.cpp:131
+#: src/slic3r/Utils/Duet.cpp:133
msgid "Wrong password"
msgstr "Contraseña incorrecta"
-#: src/libslic3r/PrintConfig.cpp:2225
+#: src/libslic3r/PrintConfig.cpp:2368
msgid "X coordinate of the left front corner of a wipe tower"
msgstr "Coordenada X de la esquina frontal izquierda de la torre de limpieza"
-#: src/libslic3r/PrintConfig.cpp:1879
+#: src/libslic3r/PrintConfig.cpp:2021
msgid "XY separation between an object and its support"
msgstr "Separación XY entre un objeto y su soporte"
-#: src/libslic3r/PrintConfig.cpp:1881
+#: src/libslic3r/PrintConfig.cpp:2023
msgid "XY separation between an object and its support. If expressed as percentage (for example 50%), it will be calculated over external perimeter width."
msgstr "Separación XY entre un objeto y su soporte. Si se expresa como porcentaje (por ejemplo 50%), se calculará sobre el ancho del perímetro externo."
-#: src/libslic3r/PrintConfig.cpp:2275
+#: src/libslic3r/PrintConfig.cpp:2418
msgid "XY Size Compensation"
msgstr "Compensación de tamaño XY"
-#: src/libslic3r/PrintConfig.cpp:2232
+#: src/libslic3r/PrintConfig.cpp:2375
msgid "Y coordinate of the left front corner of a wipe tower"
msgstr "Coordenada Y de la esquina delantera izquierda de la torre de limpieza"
-#: src/slic3r/GUI/Plater.cpp:1170
+#: src/slic3r/GUI/Plater.cpp:1079
msgid "Yes"
msgstr "Sí"
-#: src/libslic3r/PrintConfig.cpp:1317
+#: src/slic3r/GUI/Plater.cpp:1405
+msgid "You can open only one .gcode file at a time."
+msgstr "Solo puedes abrir un archivo .gcode a la vez."
+
+#: src/libslic3r/PrintConfig.cpp:1425
msgid "You can put here your personal notes. This text will be added to the G-code header comments."
msgstr "Puede poner sus notas personales aquí. Este texto se añadirá al código G como comentarios."
-#: src/libslic3r/PrintConfig.cpp:589
+#: src/libslic3r/PrintConfig.cpp:625
msgid "You can put your notes regarding the filament here."
msgstr "Puede poner sus notas con respecto al filamento aquí."
-#: src/libslic3r/PrintConfig.cpp:1473
+#: src/libslic3r/PrintConfig.cpp:1581
msgid "You can put your notes regarding the printer here."
msgstr "Puede poner sus notas con respecto a la impresora aquí."
-#: src/libslic3r/PrintConfig.cpp:2579
+#: src/libslic3r/PrintConfig.cpp:2722
msgid "You can put your notes regarding the SLA print material here."
msgstr "Puede poner tus notas sobre el material de impresión de SLA aquí."
-#: src/libslic3r/PrintConfig.cpp:360
+#: src/libslic3r/PrintConfig.cpp:394
msgid "You can set this to a positive value to disable fan at all during the first layers, so that it does not make adhesion worse."
msgstr "Puedes configurarlo como un valor positivo para desactivar el ventilador durante todas las capas iniciales, de manera que no empeora la adhesión."
-#: src/libslic3r/PrintConfig.cpp:1364
+#: src/libslic3r/PrintConfig.cpp:1472
msgid "You can use all configuration options as variables inside this template. For example: [layer_height], [fill_density] etc. You can also use [timestamp], [year], [month], [day], [hour], [minute], [second], [version], [input_filename], [input_filename_base]."
msgstr "Puedes usar todas las opciones de configuración como las variables dentro de esta muestra. Por ejemplo [layer_height], [fill_density] etc.También puedes usar [timestamp], [year], [month], [day], [hour], [minute], [second], [version], [input_filename], [input_filename_base]."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3546
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4009
msgid "You can't change a type of the last solid part of the object."
msgstr "No puede cambiar un tipo de la última parte sólida del objeto."
-#: src/slic3r/GUI/Plater.cpp:2390
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:2352
+#, possible-c-format
msgid "You can't to add the object(s) from %s because of one or some of them is(are) multi-part"
msgstr "No puede agregar el(los) objeto(s) desde % s porque uno o algunos de ellos son de varias piezas"
-#: src/slic3r/GUI/Plater.cpp:2311
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:208 src/slic3r/GUI/Plater.cpp:2254
msgid "You cannot load SLA project with a multi-part object on the bed"
msgstr "No puedes cargar un proyecto SLA con varias piezas en la base"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:625
msgid "You cannot use non-uniform scaling mode for multiple objects/parts selection"
msgstr "No puedes usar el modo de escala no uniforme para la selección de múltiples objetos/partes"
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:287
+#: src/slic3r/GUI/NotificationManager.hpp:459
+msgid "You have just added a G-code for color change, but its value is empty.\nTo export the G-code correctly, check the \"Color Change G-code\" in \"Printer Settings > Custom G-code\""
+msgstr "Acabas de añadir un código G para el cambio de color, pero su valor está vacío.\nPara exportar el código G correctamente, marca \"Código G Cambio de Color\" in \"Configuración de la Impresora > Código G Personalizado\""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:277
+msgid "You have selected physical printer \"%1%\" \nwith related printer preset \"%2%\""
+msgstr "Ha seleccionado una impresora física \"%1%\" \ncon preajuste de impresora relacionado \"%2%\""
+
+#: src/slic3r/GUI/GUI_App.cpp:1078
+msgid "You have the following presets with saved options for \"Print Host upload\""
+msgstr "Tiene los siguientes ajustes preestablecidos con opciones guardadas para \"Subida del host de impresión\""
+
+#: src/slic3r/GUI/OpenGLManager.cpp:262
msgid "You may need to update your graphics card driver."
msgstr "Puede que necesites actualizar tu tarjeta de gráficos."
@@ -9087,93 +10474,95 @@ msgstr "Puede que necesites actualizar tu tarjeta de gráficos."
msgid "You must install a configuration update."
msgstr "Es necesario instalar una actualización de la configuración."
-#: src/slic3r/GUI/Preferences.cpp:172
-#, c-format
+#: src/slic3r/GUI/Preferences.cpp:299
+#, possible-c-format
msgid "You need to restart %s to make the changes effective."
msgstr "Es necesario reiniciar %s para hacer los cambios efectivos."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3421
-#, c-format
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:468
+msgid "You should change the name of your printer device."
+msgstr "Debería cambiar el nombre de su dispositivo de impresión."
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3884
+#, possible-c-format
msgid "You started your selection with %s Item."
msgstr "Has empezado la selección con %s Items."
-#: src/slic3r/GUI/DoubleSlider.cpp:1902
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:664
+msgid "You will not be asked about the unsaved changes the next time you close PrusaSlicer."
+msgstr "No se le preguntará acerca de los cambios no guardados la próxima vez que cierre PrusaSlicer."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:665
+msgid "You will not be asked about the unsaved changes the next time you switch a preset."
+msgstr "No se le preguntará acerca de los cambios no guardados la próxima vez que cambie un ajuste preestablecido."
+
+#: src/slic3r/GUI/DoubleSlider.cpp:2121
msgid "Your current changes will delete all saved color changes."
msgstr "Tus nuevos cambios borrarán todos los cambios de color."
-#: src/slic3r/GUI/DoubleSlider.cpp:1923
+#: src/slic3r/GUI/DoubleSlider.cpp:2141
msgid "Your current changes will delete all saved extruder (tool) changes."
msgstr "Tus cambios actuales eliminarán todos los cambios guardados del extrusor (herramienta)."
-#: src/slic3r/GUI/MainFrame.cpp:911
+#: src/slic3r/GUI/MainFrame.cpp:1612
msgid "Your file was repaired."
msgstr "Tu fichero fue reparado."
-#: src/slic3r/GUI/Plater.cpp:2528
+#: src/slic3r/GUI/Plater.cpp:2490
msgid "Your object appears to be too large, so it was automatically scaled down to fit your print bed."
msgstr "Tu pieza parece demasiado grande, así que se ha escalado automáticamente para que pueda caber en la base de impresión."
-#: src/libslic3r/PrintConfig.cpp:2285
+#: src/libslic3r/GCode.cpp:1261
+msgid "Your print is very close to the priming regions. Make sure there is no collision."
+msgstr "Tu impresión está muy cerca de las regiones de purga. Asegúrate de que no hay colisiones."
+
+#: src/libslic3r/PrintConfig.cpp:2428
msgid "Z offset"
msgstr "Ajuste en altura Z"
-#: src/slic3r/GUI/ConfigManipulation.cpp:60
-msgid ""
-"Zero first layer height is not valid.\n"
-"\n"
-"The first layer height will be reset to 0.01."
-msgstr ""
-"Cero como la altura de la primera capa no es válido.\n"
-"\n"
-"La altura de la primera capa se restablecerá a 0.01."
+#: src/slic3r/GUI/ConfigManipulation.cpp:59
+msgid "Zero first layer height is not valid.\n\nThe first layer height will be reset to 0.01."
+msgstr "Cero como la altura de la primera capa no es válido.\n\nLa altura de la primera capa se restablecerá a 0.01."
-#: src/slic3r/GUI/ConfigManipulation.cpp:48
-msgid ""
-"Zero layer height is not valid.\n"
-"\n"
-"The layer height will be reset to 0.01."
-msgstr ""
-"Cero como la altura de capa no es válido.\n"
-"\n"
-"La altura de capa se restablecerá a 0.01."
+#: src/slic3r/GUI/ConfigManipulation.cpp:47
+msgid "Zero layer height is not valid.\n\nThe layer height will be reset to 0.01."
+msgstr "Cero como la altura de capa no es válido.\n\nLa altura de capa se restablecerá a 0.01."
-#: src/libslic3r/PrintConfig.cpp:2667
+#: src/libslic3r/PrintConfig.cpp:2831
msgid "Zig-Zag"
msgstr "Zig-Zag"
-#: src/slic3r/GUI/Mouse3DController.cpp:308
-#: src/slic3r/GUI/Mouse3DController.cpp:317
+#: src/slic3r/GUI/Mouse3DController.cpp:294
+#: src/slic3r/GUI/Mouse3DController.cpp:303
msgid "Zoom"
msgstr "Zoom"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:183
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:177
msgid "Zoom in"
msgstr "Aumentar zoom"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:184
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:178
msgid "Zoom out"
msgstr "Reducir zoom"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:181
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
msgid "Zoom to Bed"
msgstr "Zoom a la Cama"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:182
-msgid ""
-"Zoom to selected object\n"
-"or all objects in scene, if none selected"
-msgstr ""
-"Zoom a objetos seleccionados\n"
-"o a todos los objetos en escena, si no se seleccionó ninguno"
-
-#: src/libslic3r/PrintConfig.cpp:207 src/libslic3r/PrintConfig.cpp:780
-#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1650
-#: src/libslic3r/PrintConfig.cpp:1894 src/libslic3r/PrintConfig.cpp:2049
-#: src/libslic3r/PrintConfig.cpp:2247 src/libslic3r/PrintConfig.cpp:2727
-#: src/libslic3r/PrintConfig.cpp:2848
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:176
+msgid "Zoom to selected object\nor all objects in scene, if none selected"
+msgstr "Zoom a objetos seleccionados\no a todos los objetos en escena, si no se seleccionó ninguno"
+
+#: src/libslic3r/PrintConfig.cpp:241 src/libslic3r/PrintConfig.cpp:816
+#: src/libslic3r/PrintConfig.cpp:1748 src/libslic3r/PrintConfig.cpp:1758
+#: src/libslic3r/PrintConfig.cpp:2036 src/libslic3r/PrintConfig.cpp:2191
+#: src/libslic3r/PrintConfig.cpp:2390 src/libslic3r/PrintConfig.cpp:2891
+#: src/libslic3r/PrintConfig.cpp:3012
msgid "°"
msgstr "°"
-#: src/slic3r/GUI/ConfigWizard.cpp:1038 src/slic3r/GUI/ConfigWizard.cpp:1052
+#: src/slic3r/GUI/ConfigWizard.cpp:1404 src/slic3r/GUI/ConfigWizard.cpp:1418
+#: src/libslic3r/PrintConfig.cpp:180 src/libslic3r/PrintConfig.cpp:912
+#: src/libslic3r/PrintConfig.cpp:956 src/libslic3r/PrintConfig.cpp:2209
msgid "°C"
msgstr "°C"
diff --git a/resources/localization/fr/PrusaSlicer.mo b/resources/localization/fr/PrusaSlicer.mo
index b01197c78..cf3b66bab 100644
--- a/resources/localization/fr/PrusaSlicer.mo
+++ b/resources/localization/fr/PrusaSlicer.mo
Binary files differ
diff --git a/resources/localization/fr/PrusaSlicer_fr.po b/resources/localization/fr/PrusaSlicer_fr.po
index 4bed90017..f06ec488f 100644
--- a/resources/localization/fr/PrusaSlicer_fr.po
+++ b/resources/localization/fr/PrusaSlicer_fr.po
@@ -5,376 +5,399 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-Generator: Poedit 2.3\n"
-"Project-Id-Version: \n"
-"POT-Creation-Date: \n"
-"PO-Revision-Date: \n"
-"Last-Translator: \n"
-"Language-Team: \n"
-
-#: src/slic3r/GUI/MainFrame.cpp:66
-msgid " - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/releases"
-msgstr " - Pensez à vérifier les mises à jour sur http://github.com/prusa3d/PrusaSlicer/releases"
-
-#: src/slic3r/GUI/MainFrame.cpp:872
-msgid " was successfully sliced."
-msgstr " a été découpé avec succès."
-
-#: src/libslic3r/PrintConfig.cpp:215 src/libslic3r/PrintConfig.cpp:792
-#: src/libslic3r/PrintConfig.cpp:1219 src/libslic3r/PrintConfig.cpp:1282
-#: src/libslic3r/PrintConfig.cpp:1532 src/libslic3r/PrintConfig.cpp:2425
-#: src/libslic3r/PrintConfig.cpp:2767
+"X-Generator: PhraseApp (phraseapp.com)\n"
+
+#: src/slic3r/GUI/Tab.cpp:4124
+msgid "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\nTo enable \"%1%\", please switch off \"%2%\""
+msgstr "\"%1%\" est désactivé car \"%2%\" est activé dans la catégorie \"%3%\".\nPour activer \"%1%\", veuillez désactiver \"%2%\""
+
+#: src/libslic3r/PrintConfig.cpp:249 src/libslic3r/PrintConfig.cpp:828
+#: src/libslic3r/PrintConfig.cpp:1148 src/libslic3r/PrintConfig.cpp:1327
+#: src/libslic3r/PrintConfig.cpp:1390 src/libslic3r/PrintConfig.cpp:1640
+#: src/libslic3r/PrintConfig.cpp:2568 src/libslic3r/PrintConfig.cpp:2805
+#: src/libslic3r/PrintConfig.cpp:2931
msgid "%"
msgstr "%"
-#: src/slic3r/GUI/GLCanvas3D.cpp:963
-#, c-format
-msgid "%.2f - %.2f mm"
-msgstr "%.2f - %.2f mm"
-
#. TRN Remove/Delete
-#: src/slic3r/GUI/Tab.cpp:3126
+#: src/slic3r/GUI/Tab.cpp:3425
msgid "%1% Preset"
msgstr "%1% Préréglage"
-#: src/slic3r/GUI/Plater.cpp:4400
+#: src/slic3r/GUI/Plater.cpp:4423
msgid "%1% printer was active at the time the target Undo / Redo snapshot was taken. Switching to %1% printer requires reloading of %1% presets."
msgstr "L'imprimante %1% était active au moment où l'instantané cible Annuler / Refaire a été pris. Basculer vers l'imprimante %1% requiert de recharger les préréglages de %1%."
-#: src/libslic3r/Print.cpp:1374
+#: src/slic3r/GUI/MainFrame.cpp:1585
+msgid "%1% was successfully sliced."
+msgstr "%1% a été découpé avec succès."
+
+#: src/libslic3r/Print.cpp:1400
msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm"
msgstr "%1%=%2% mm est trop bas pour être imprimable avec une hauteur de couche de %3% mm"
-#: src/slic3r/GUI/PresetHints.cpp:229
-#, c-format
+#: src/slic3r/GUI/PresetHints.cpp:228
+#, possible-c-format
msgid "%3.2f mm³/s at filament speed %3.2f mm/s."
msgstr "%3.2f mm³/s à une vitesse de filament de %3.2f mm/s."
-#: src/slic3r/GUI/Plater.cpp:1152
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:1061
+#, possible-c-format
msgid "%d (%d shells)"
msgstr "%d (%d coques)"
-#: src/slic3r/GUI/Plater.cpp:1160
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:1069
+#, possible-c-format
msgid "%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d facets reversed, %d backwards edges"
msgstr "%d faces invalides, %d arrêtes corrigées, %d faces retirées, %d faces ajoutées, %d faces inversées, %d arrêtes à l'envers"
-#: src/slic3r/GUI/PresetHints.cpp:270
-#, c-format
+#: src/slic3r/GUI/PresetHints.cpp:269
+#, possible-c-format
msgid "%d lines: %.2f mm"
msgstr "%d lignes : %.2f mm"
-#: src/slic3r/GUI/MainFrame.cpp:1027
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:1728
+#, possible-c-format
msgid "%d presets successfully imported."
msgstr "%d préréglages importés avec succès."
-#: src/slic3r/GUI/MainFrame.cpp:692
-#, c-format
+#: src/slic3r/GUI/GUI_App.cpp:718
+#, possible-c-format
+msgid "%s\nDo you want to continue?"
+msgstr "%s\nVoulez-vous continuer ?"
+
+#: src/slic3r/GUI/MainFrame.cpp:917 src/slic3r/GUI/MainFrame.cpp:1316
+#, possible-c-format
msgid "%s &Website"
msgstr "Site &Web de %s"
+#: src/slic3r/GUI/GUI_App.cpp:394
+#, possible-c-format
+msgid "%s - BREAKING CHANGE"
+msgstr "%s - MODIFICATION IMPACTANTE"
+
+#: src/slic3r/GUI/Plater.cpp:1410
+#, possible-c-format
+msgid "%s - Drop project file"
+msgstr "%s - Déposer le fichier de projet"
+
#: src/slic3r/GUI/UpdateDialogs.cpp:211
-#, c-format
+#, possible-c-format
msgid "%s configuration is incompatible"
msgstr "La configuration de %s n'est pas compatible"
-#: src/slic3r/GUI/Field.cpp:175
-#, c-format
+#: src/slic3r/GUI/Field.cpp:223
+#, possible-c-format
msgid "%s doesn't support percentage"
msgstr "%s ne supporte pas un pourcentage"
#: src/slic3r/GUI/MsgDialog.cpp:73
-#, c-format
+#, possible-c-format
msgid "%s error"
msgstr "Erreur %s"
-#: src/slic3r/GUI/ConfigWizard.cpp:481
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:499
+#, possible-c-format
msgid "%s Family"
-msgstr "%s Famille"
+msgstr "Famille %s"
#: src/slic3r/GUI/MsgDialog.cpp:74
-#, c-format
+#, possible-c-format
msgid "%s has encountered an error"
msgstr "%s a rencontré une erreur"
-#: src/slic3r/GUI/GUI_App.cpp:138
-#, c-format
-msgid ""
-"%s has encountered an error. It was likely caused by running out of memory. If you are sure you have enough RAM on your system, this may also be a bug and we would be glad if you reported it.\n"
-"\n"
-"The application will now terminate."
-msgstr ""
-"%s a rencontré une erreur. Elle a apparemment été provoquée par un manque de mémoire. Si vous êtes certain d'avoir assez de RAM sur votre système, cela peut également être un bug et nous aimerions que vous le signaliez.\n"
-"\n"
-"L'application va maintenant fermer."
+#: src/slic3r/GUI/GUI_App.cpp:528
+#, possible-c-format
+msgid "%s has encountered an error. It was likely caused by running out of memory. If you are sure you have enough RAM on your system, this may also be a bug and we would be glad if you reported it.\n\nThe application will now terminate."
+msgstr "%s a rencontré une erreur. Elle a apparemment été provoquée par un manque de mémoire. Si vous êtes certain d'avoir assez de RAM sur votre système, cela peut également être un bug et nous aimerions que vous le signaliez.\n\nL'application va maintenant fermer."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:222
-#, c-format
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:62
+#, possible-c-format
msgid "%s has encountered an error. It was likely caused by running out of memory. If you are sure you have enough RAM on your system, this may also be a bug and we would be glad if you reported it."
msgstr "%s a rencontré une erreur. Elle a apparemment été provoquée par un manque de mémoire. Si vous êtes certain d'avoir assez de RAM sur votre système, cela peut également être un bug et nous aimerions que vous le signaliez."
-#: src/slic3r/GUI/UpdateDialogs.cpp:308
-#, c-format
+#: src/slic3r/GUI/UpdateDialogs.cpp:309
+#, possible-c-format
msgid "%s has no configuration updates available."
msgstr "%s n'a aucunes mises à jour de configuration disponibles."
#: src/slic3r/GUI/UpdateDialogs.cpp:148 src/slic3r/GUI/UpdateDialogs.cpp:210
-#, c-format
+#, possible-c-format
msgid "%s incompatibility"
msgstr "Incompatibilité de %s"
#: src/slic3r/GUI/UpdateDialogs.cpp:270
-#, c-format
-msgid ""
-"%s now uses an updated configuration structure.\n"
-"\n"
-"So called 'System presets' have been introduced, which hold the built-in default settings for various printers. These System presets cannot be modified, instead, users now may create their own presets inheriting settings from one of the System presets.\n"
-"An inheriting preset may either inherit a particular value from its parent or override it with a customized value.\n"
-"\n"
-"Please proceed with the %s that follows to set up the new presets and to choose whether to enable automatic preset updates."
-msgstr ""
-"%s utilise à présent une structure de configuration mise à jour.\n"
-"\n"
-"Il existe à présent des \"préréglages Système\", qui intègrent les réglages par défaut pour les différentes imprimantes. Ces préréglages Système ne peuvent pas être modifiés, mais les utilisateurs peuvent désormais créer leurs propres préréglages héritant des paramètres de l'un des préréglages Système.\n"
-"Un tel préréglage peut ainsi hériter d'une valeur particulière de son parent ou la remplacer par une valeur personnalisée.\n"
-"\n"
-"Veuillez utiliser les %s qui suivent pour paramétrer les nouveaux réglages et éventuellement accepter les mises à jour de réglage automatiques."
-
-#: src/slic3r/GUI/GUI_App.cpp:820
-#, c-format
+#, possible-c-format
+msgid "%s now uses an updated configuration structure.\n\nSo called 'System presets' have been introduced, which hold the built-in default settings for various printers. These System presets cannot be modified, instead, users now may create their own presets inheriting settings from one of the System presets.\nAn inheriting preset may either inherit a particular value from its parent or override it with a customized value.\n\nPlease proceed with the %s that follows to set up the new presets and to choose whether to enable automatic preset updates."
+msgstr "%s utilise à présent une structure de configuration mise à jour.\n\nIl existe à présent des \"préréglages Système\", qui intègrent les réglages par défaut pour les différentes imprimantes. Ces préréglages Système ne peuvent pas être modifiés, mais les utilisateurs peuvent désormais créer leurs propres préréglages héritant des paramètres de l'un des préréglages Système.\nUn tel préréglage peut ainsi hériter d'une valeur particulière de son parent ou la remplacer par une valeur personnalisée.\n\nVeuillez utiliser les %s qui suivent pour paramétrer les nouveaux réglages et éventuellement accepter les mises à jour de réglage automatiques."
+
+#: src/slic3r/GUI/GUI_App.cpp:1512
+#, possible-c-format
msgid "%s View Mode"
msgstr "Mode de Vue de %s"
#: src/slic3r/GUI/UpdateDialogs.cpp:151
-#, c-format
-msgid ""
-"%s will now start updates. Otherwise it won't be able to start.\n"
-"\n"
-"Note that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n"
-"\n"
-"Updated configuration bundles:"
-msgstr ""
-"%s va maintenant démarrer les mises à jour. Sinon, il ne pourra pas démarrer.\n"
-"\n"
-"Notez qu'un instantané complet de la configuration sera créé en premier. Il peut ensuite être restauré à tout moment en cas de problème avec la nouvelle version.\n"
-"\n"
-"Lots de configuration mis à jour :"
-
-#: src/slic3r/GUI/MainFrame.cpp:705
-#, c-format
+#, possible-c-format
+msgid "%s will now start updates. Otherwise it won't be able to start.\n\nNote that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n\nUpdated configuration bundles:"
+msgstr "%s va maintenant démarrer les mises à jour. Sinon, il ne pourra pas démarrer.\n\nNotez qu'un instantané complet de la configuration sera créé en premier. Il peut ensuite être restauré à tout moment en cas de problème avec la nouvelle version.\n\nLots de configuration mis à jour :"
+
+#: src/slic3r/GUI/MainFrame.cpp:933 src/slic3r/GUI/MainFrame.cpp:937
+#: src/slic3r/GUI/MainFrame.cpp:1329
+#, possible-c-format
msgid "&About %s"
msgstr "&Au sujet de %s"
-#: src/slic3r/GUI/GUI_App.cpp:908
+#: src/slic3r/GUI/MainFrame.cpp:1297
+msgid "&Collapse sidebar"
+msgstr "&Réduire la barre latérale"
+
+#: src/slic3r/GUI/GUI_App.cpp:1645
msgid "&Configuration"
msgstr "&Configuration"
-#: src/slic3r/GUI/GUI_App.cpp:800
+#: src/slic3r/GUI/GUI_App.cpp:1480
msgid "&Configuration Snapshots"
msgstr "Instantanés de &Configuration"
-#: src/slic3r/GUI/MainFrame.cpp:588
+#: src/slic3r/GUI/MainFrame.cpp:1194
msgid "&Copy"
msgstr "&Copier"
-#: src/slic3r/GUI/MainFrame.cpp:572
+#: src/slic3r/GUI/MainFrame.cpp:1178
msgid "&Delete selected"
msgstr "Suppri&mer la sélection"
-#: src/slic3r/GUI/MainFrame.cpp:722
+#: src/slic3r/GUI/MainFrame.cpp:1348 src/slic3r/GUI/MainFrame.cpp:1358
msgid "&Edit"
msgstr "&Editer"
-#: src/slic3r/GUI/MainFrame.cpp:506
+#: src/slic3r/GUI/MainFrame.cpp:1103
msgid "&Export"
msgstr "&Exporter"
-#: src/slic3r/GUI/MainFrame.cpp:617 src/slic3r/GUI/MainFrame.cpp:752
+#: src/slic3r/GUI/MainFrame.cpp:1224 src/slic3r/GUI/MainFrame.cpp:1451
msgid "&Filament Settings Tab"
msgstr "Onglet des Réglages du &Filament"
-#: src/slic3r/GUI/MainFrame.cpp:721
+#: src/slic3r/GUI/MainFrame.cpp:1347 src/slic3r/GUI/MainFrame.cpp:1357
+#: src/slic3r/GUI/MainFrame.cpp:1417
msgid "&File"
msgstr "&Fichier"
-#: src/slic3r/GUI/ConfigWizard.cpp:1981
+#: src/slic3r/GUI/ConfigWizard.cpp:2492
msgid "&Finish"
msgstr "&Fin"
-#: src/slic3r/GUI/MainFrame.cpp:727
+#: src/slic3r/GUI/MainFrame.cpp:1141
+msgid "&G-code preview"
+msgstr "&Aperçu du G-code"
+
+#: src/slic3r/GUI/MainFrame.cpp:1353 src/slic3r/GUI/MainFrame.cpp:1363
+#: src/slic3r/GUI/MainFrame.cpp:1423
msgid "&Help"
msgstr "&Aide"
-#: src/slic3r/GUI/MainFrame.cpp:474
+#: src/slic3r/GUI/MainFrame.cpp:1065
msgid "&Import"
msgstr "&Importer"
-#: src/slic3r/GUI/GUI_App.cpp:822
+#: src/slic3r/GUI/GUI_App.cpp:1517
msgid "&Language"
msgstr "&Langue"
-#: src/slic3r/GUI/MainFrame.cpp:405
+#: src/slic3r/GUI/MainFrame.cpp:986
msgid "&New Project"
msgstr "&Nouveau Projet"
-#: src/slic3r/GUI/ConfigWizard.cpp:1980
+#: src/slic3r/GUI/ConfigWizard.cpp:2491
msgid "&Next >"
msgstr "&Suivant >"
-#: src/slic3r/GUI/MainFrame.cpp:408
+#: src/slic3r/GUI/MainFrame.cpp:1391
+msgid "&Open G-code"
+msgstr "&Ouvrir le G-code"
+
+#: src/slic3r/GUI/MainFrame.cpp:989
msgid "&Open Project"
msgstr "&Ouvrir Projet"
-#: src/slic3r/GUI/MainFrame.cpp:591
+#: src/slic3r/GUI/MainFrame.cpp:1197
msgid "&Paste"
msgstr "C&oller"
-#: src/slic3r/GUI/MainFrame.cpp:606
+#: src/slic3r/GUI/MainFrame.cpp:1216
msgid "&Plater Tab"
msgstr "Onglet du &Plateau"
-#: src/slic3r/GUI/GUI_App.cpp:804
+#: src/slic3r/GUI/GUI_App.cpp:1487
msgid "&Preferences"
msgstr "&Préférences"
-#: src/slic3r/GUI/MainFrame.cpp:540
+#: src/slic3r/GUI/MainFrame.cpp:1144 src/slic3r/GUI/MainFrame.cpp:1402
msgid "&Quit"
msgstr "&Quitter"
-#: src/slic3r/GUI/MainFrame.cpp:583
+#: src/slic3r/GUI/MainFrame.cpp:1189
msgid "&Redo"
msgstr "&Refaire"
-#: src/slic3r/GUI/MainFrame.cpp:536
+#: src/slic3r/GUI/MainFrame.cpp:1137
msgid "&Repair STL file"
msgstr "&Réparer le fichier STL"
-#: src/slic3r/GUI/MainFrame.cpp:446
+#: src/slic3r/GUI/MainFrame.cpp:1028
msgid "&Save Project"
msgstr "&Sauvegarder Projet"
-#: src/slic3r/GUI/MainFrame.cpp:565
+#: src/slic3r/GUI/MainFrame.cpp:1171
msgid "&Select all"
msgstr "Tout &Sélectionner"
-#: src/slic3r/GUI/MainFrame.cpp:580
+#: src/slic3r/GUI/MainFrame.cpp:1186
msgid "&Undo"
msgstr "Ann&uler"
-#: src/slic3r/GUI/MainFrame.cpp:724
+#: src/slic3r/GUI/MainFrame.cpp:1350 src/slic3r/GUI/MainFrame.cpp:1360
+#: src/slic3r/GUI/MainFrame.cpp:1418
msgid "&View"
msgstr "&Vue"
-#: src/slic3r/GUI/MainFrame.cpp:723
+#: src/slic3r/GUI/MainFrame.cpp:1349 src/slic3r/GUI/MainFrame.cpp:1359
msgid "&Window"
msgstr "Fenê&tre"
-#: src/slic3r/GUI/ConfigWizard.cpp:603 src/slic3r/GUI/ConfigWizard.cpp:631
+#: src/slic3r/GUI/ConfigWizard.cpp:662 src/slic3r/GUI/ConfigWizard.cpp:812
+#: src/slic3r/GUI/ConfigWizard.cpp:873 src/slic3r/GUI/ConfigWizard.cpp:1007
msgid "(All)"
msgstr "(Tout)"
-#: src/libslic3r/PrintConfig.cpp:1446
+#: src/slic3r/GUI/Plater.cpp:1195
+msgid "(including spool)"
+msgstr "(bobine incluse)"
+
+#: src/libslic3r/PrintConfig.cpp:1554
msgid "(minimum)"
msgstr "(minimum)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:116
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:109
msgid "(Re)slice"
msgstr "(Re)découper"
-#: src/slic3r/GUI/MainFrame.cpp:532
+#: src/slic3r/GUI/MainFrame.cpp:1133
msgid "(Re)Slice No&w"
msgstr "(Re)Découper Main&tenant"
-#: src/libslic3r/PrintConfig.cpp:771 src/libslic3r/PrintConfig.cpp:2587
+#: src/libslic3r/PrintConfig.cpp:807 src/libslic3r/PrintConfig.cpp:2730
msgid "(Unknown)"
msgstr "(Inconnu)"
-#: src/slic3r/GUI/MainFrame.cpp:790
+#: src/slic3r/GUI/MainFrame.cpp:1491
msgid ") not found."
msgstr ") non trouvé."
-#: src/libslic3r/PrintConfig.cpp:1918
+#: src/libslic3r/PrintConfig.cpp:1085
+msgid "0 (no open anchors)"
+msgstr "0 (aucune ancre ouverte)"
+
+#: src/libslic3r/PrintConfig.cpp:1107
+msgid "0 (not anchored)"
+msgstr "0 (non ancré)"
+
+#: src/libslic3r/PrintConfig.cpp:2060
msgid "0 (soluble)"
msgstr "0 (soluble)"
-#: src/libslic3r/PrintConfig.cpp:1919
+#: src/libslic3r/PrintConfig.cpp:2061
msgid "0.2 (detachable)"
msgstr "0.2 (détachable)"
-#: src/slic3r/GUI/MainFrame.cpp:626
+#: src/libslic3r/PrintConfig.cpp:1090 src/libslic3r/PrintConfig.cpp:1112
+msgid "1000 (unlimited)"
+msgstr "1000 (illimité)"
+
+#: src/slic3r/GUI/MainFrame.cpp:1234
msgid "3&D"
msgstr "3&D"
-#: src/slic3r/GUI/Plater.cpp:4097
+#: src/slic3r/GUI/Plater.cpp:4044
msgid "3D editor view"
msgstr "Vue d'éditeur 3D"
-#: src/libslic3r/PrintConfig.cpp:851
+#: src/libslic3r/PrintConfig.cpp:889
msgid "3D Honeycomb"
msgstr "Nid d'abeille 3D"
-#: src/slic3r/GUI/Mouse3DController.cpp:274
+#: src/slic3r/GUI/NotificationManager.hpp:318
+msgid "3D Mouse disconnected."
+msgstr "Souris 3D déconnectée."
+
+#: src/slic3r/GUI/Mouse3DController.cpp:263
msgid "3Dconnexion settings"
msgstr "Paramètres 3Dconnexion"
-#: src/slic3r/GUI/Plater.cpp:5038
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:5167
+#, possible-c-format
msgid "3MF file exported to %s"
msgstr "Fichier 3MF exporté vers %s"
-#: src/slic3r/GUI/ConfigWizard.cpp:1979
+#: src/slic3r/GUI/ConfigWizard.cpp:2490
msgid "< &Back"
msgstr "< &Précédent"
-#: src/libslic3r/PrintConfig.cpp:287
+#: src/libslic3r/PrintConfig.cpp:321
msgid "A boolean expression using the configuration values of an active print profile. If this expression evaluates to true, this profile is considered compatible with the active print profile."
msgstr "Une expression booléenne utilisant les valeurs de configuration d'un profil d'imprimante actif. Si cette expression est évaluée comme vraie, ce profil est considéré comme compatible avec le profil d'imprimante actif."
-#: src/libslic3r/PrintConfig.cpp:272
+#: src/libslic3r/PrintConfig.cpp:306
msgid "A boolean expression using the configuration values of an active printer profile. If this expression evaluates to true, this profile is considered compatible with the active printer profile."
msgstr "Une expression booléenne utilisant les valeurs de configuration d'un profil d'imprimante actif. Si cette expression est évaluée comme vraie, ce profil est considéré comme compatible avec le profil d'imprimante actif."
-#: src/slic3r/GUI/Tab.cpp:975
+#: src/slic3r/GUI/Tab.cpp:1237
msgid "A copy of the current system preset will be created, which will be detached from the system preset."
msgstr "Une copie du préréglage système actuel sera créé, et il sera détaché du préréglage système."
-#: src/slic3r/GUI/ConfigWizard.cpp:1034
+#: src/slic3r/GUI/ConfigWizard.cpp:1400
msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS."
msgstr "La règle générale est 160 à 230 °C pour le PLA et 215 à 250 °C pour l'ABS."
-#: src/slic3r/GUI/ConfigWizard.cpp:1048
+#: src/slic3r/GUI/ConfigWizard.cpp:1414
msgid "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have no heated bed."
msgstr "La règle générale est 60 °C pour le PLA et 110 °C pour l'ABS. Laissez à zéro si vous n'avez pas de lit chauffant."
-#: src/slic3r/GUI/GLCanvas3D.cpp:686
-msgid "A toolpath outside the print area was detected"
-msgstr "Parcours détecté en dehors de la zone d'impression"
+#: src/slic3r/GUI/GLCanvas3D.cpp:634
+msgid "A toolpath outside the print area was detected."
+msgstr "Un parcours d'outil en dehors de la zone d'impression a été détecté."
-#: src/slic3r/GUI/AboutDialog.cpp:199
-#, c-format
+#: src/slic3r/GUI/AboutDialog.cpp:212 src/slic3r/GUI/AboutDialog.cpp:215
+#, possible-c-format
msgid "About %s"
msgstr "Au sujet de %s"
-#: src/slic3r/GUI/GLCanvas3D.cpp:959
-#, c-format
-msgid "above %.2f mm"
-msgstr "au dessus de %.2f mm"
+#: src/slic3r/GUI/GCodeViewer.cpp:2189
+msgid "above"
+msgstr "au-dessus"
-#: src/libslic3r/PrintConfig.cpp:1569
+#: src/libslic3r/PrintConfig.cpp:1677
msgid "Above Z"
msgstr "Au-delà de Z"
-#: src/slic3r/GUI/Tab.cpp:1164
+#: src/slic3r/GUI/Tab.cpp:1494
msgid "Acceleration control (advanced)"
msgstr "Contrôle de l'accélération (avancé)"
-#: src/libslic3r/PrintConfig.cpp:2925
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:221
+#: src/libslic3r/PrintConfig.cpp:3089
msgid "Accuracy"
msgstr "Précision"
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:59
+msgid "Accurate"
+msgstr "Précis"
+
+#: src/slic3r/GUI/Plater.cpp:1423
+msgid "Action"
+msgstr "Action"
+
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78
msgid "Activate"
msgstr "Activer"
@@ -383,67 +406,75 @@ msgstr "Activer"
msgid "Active"
msgstr "Actif"
-#: src/slic3r/GUI/DoubleSlider.cpp:1135 src/slic3r/GUI/GUI_ObjectList.cpp:1705
+#: src/slic3r/GUI/DoubleSlider.cpp:1264 src/slic3r/GUI/GUI_ObjectList.cpp:1833
msgid "active"
msgstr "actif"
-#: src/slic3r/GUI/GLCanvas3D.cpp:267
+#: src/slic3r/GUI/GLCanvas3D.cpp:254
msgid "Adaptive"
msgstr "Adaptatif"
-#: src/slic3r/GUI/Tab.cpp:241
-msgid "Add a new printer"
-msgstr "Ajouter une nouvelle imprimante"
+#: src/libslic3r/PrintConfig.cpp:894
+msgid "Adaptive Cubic"
+msgstr "Cubique adaptatif"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:314
+msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\""
+msgstr "Ajouter \"%1%\" comme préréglage suivant pour l'imprimante physique \"%2%\""
-#: src/libslic3r/PrintConfig.cpp:2782
+#: src/libslic3r/PrintConfig.cpp:2946
msgid "Add a pad underneath the supported model"
msgstr "Ajouter une base sous le modèle supporté"
-#: src/libslic3r/PrintConfig.cpp:2058
+#: src/libslic3r/PrintConfig.cpp:2200
msgid "Add a sheath (a single perimeter line) around the base support. This makes the support more reliable, but also more difficult to remove."
msgstr "Ajouter une enveloppe (une ligne unique de périmètre) autour de la base du support. Ceci rend le support plus fiable, mais aussi plus difficile à retirer."
-#: src/slic3r/GUI/DoubleSlider.cpp:991
+#: src/slic3r/GUI/DoubleSlider.cpp:1114
msgid "Add another code - Ctrl + Left click"
msgstr "Ajouter un autre code - Ctr + Clic gauche"
-#: src/slic3r/GUI/DoubleSlider.cpp:992
+#: src/slic3r/GUI/DoubleSlider.cpp:1115
msgid "Add another code - Right click"
msgstr "Ajouter un autre code - Clic droit"
-#: src/slic3r/GUI/DoubleSlider.cpp:1477
+#: src/slic3r/GUI/DoubleSlider.cpp:1665
msgid "Add color change"
msgstr "Ajouter un changement de couleur"
-#: src/slic3r/GUI/DoubleSlider.cpp:1180
+#: src/slic3r/GUI/DoubleSlider.cpp:1307
msgid "Add color change (%1%) for:"
msgstr "Ajouter le changement de couleur (%1%) pour :"
-#: src/slic3r/GUI/DoubleSlider.cpp:988
+#: src/slic3r/GUI/DoubleSlider.cpp:1111
msgid "Add color change - Left click"
msgstr "Ajouter un changement de couleur - Clic gauche"
-#: src/slic3r/GUI/DoubleSlider.cpp:986
+#: src/slic3r/GUI/DoubleSlider.cpp:1109
msgid "Add color change - Left click for predefined color or Shift + Left click for custom color selection"
msgstr "Ajouter un changement de couleur - Clic gauche pour la couleur prédéfinie ou Maj + Clic gauche pour la sélection d'une couleur personnalisée"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
msgid "Add color change marker for current layer"
msgstr "Ajouter un repère de changement de couleur pour la couche en cours"
-#: src/slic3r/GUI/DoubleSlider.cpp:1490
+#: src/slic3r/GUI/DoubleSlider.cpp:1682
msgid "Add custom G-code"
msgstr "Ajouter un G-code personnalisé"
-#: src/slic3r/GUI/GLCanvas3D.cpp:240
+#: src/slic3r/GUI/DoubleSlider.cpp:1679
+msgid "Add custom template"
+msgstr "Ajouter un modèle personnalisé"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:235
msgid "Add detail"
msgstr "Ajouter des détails"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:421
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:308
msgid "Add drainage hole"
msgstr "Ajouter un trou de drainage"
-#: src/slic3r/GUI/DoubleSlider.cpp:984
+#: src/slic3r/GUI/DoubleSlider.cpp:1107
msgid "Add extruder change - Left click"
msgstr "Ajouter un changement d'extrudeur - Clic gauche"
@@ -451,30 +482,30 @@ msgstr "Ajouter un changement d'extrudeur - Clic gauche"
msgid "Add extruder to sequence"
msgstr "Ajouter l'extrudeur à la séquence"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1993
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2152
msgid "Add Generic Subobject"
msgstr "Ajouter un Sous-objet Générique"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2896
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2925
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2943
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3297
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3325
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3345
msgid "Add Height Range"
msgstr "Ajouter une Zone de Hauteur"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4526 src/slic3r/GUI/Plater.cpp:3788
-#: src/slic3r/GUI/Plater.cpp:3800 src/slic3r/GUI/Plater.cpp:3940
+#: src/slic3r/GUI/GLCanvas3D.cpp:4892 src/slic3r/GUI/Plater.cpp:3708
+#: src/slic3r/GUI/Plater.cpp:3720 src/slic3r/GUI/Plater.cpp:3858
msgid "Add instance"
msgstr "Ajouter l'instance"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:159
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:153
msgid "Add Instance of the selected object"
msgstr "Ajouter une Instance à l'objet sélectionné"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:162
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:165
msgid "Add layer range"
msgstr "Ajouter une zone de couche"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2328
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2692
msgid "Add Layers"
msgstr "Ajouter des couches"
@@ -482,12 +513,12 @@ msgstr "Ajouter des couches"
msgid "Add modifier"
msgstr "Ajouter un modificateur"
-#: src/libslic3r/PrintConfig.cpp:479
-#, no-c-format
+#: src/libslic3r/PrintConfig.cpp:515
+#, possible-c-format
msgid "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r keeps adding perimeters, until more than 70% of the loop immediately above is supported."
msgstr "Ajouter plus de périmètres si nécessaire pour éviter des trous dans les parois inclinées. Slic3r ajoute des périmètres, jusqu'à ce que plus de 70% de la boucle immédiatement au-dessus soit supportée."
-#: src/slic3r/GUI/Plater.cpp:3940
+#: src/slic3r/GUI/Plater.cpp:3858
msgid "Add one more instance of the selected object"
msgstr "Ajouter une instance supplémentaire de l'objet sélectionné"
@@ -495,52 +526,61 @@ msgstr "Ajouter une instance supplémentaire de l'objet sélectionné"
msgid "Add part"
msgstr "Ajouter une pièce"
-#: src/slic3r/GUI/DoubleSlider.cpp:1487
+#: src/slic3r/GUI/DoubleSlider.cpp:1675
msgid "Add pause print"
msgstr "Ajouter une pause d'impression"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363
+#: src/slic3r/GUI/PresetComboBoxes.cpp:627
+#: src/slic3r/GUI/PresetComboBoxes.cpp:674
+msgid "Add physical printer"
+msgstr "Ajouter une imprimante physique"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210
msgid "Add point"
msgstr "Ajouter un point"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213
msgid "Add point to selection"
msgstr "Ajouter un point à la sélection"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1509
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:180
+msgid "Add preset for this printer device"
+msgstr "Ajouter un préréglage pour cette imprimante"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1640
msgid "Add settings"
msgstr "Ajouter des réglages"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1386
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1517
msgid "Add Settings Bundle for Height range"
msgstr "Ajouter une Combinaison de Réglages pour la zone de Hauteur"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1388
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1519
msgid "Add Settings Bundle for Object"
msgstr "Ajouter une Combinaison de Réglages pour l'Objet"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1387
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1518
msgid "Add Settings Bundle for Sub-object"
msgstr "Ajouter une Combinaison de Réglages pour le Sous-objet"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1314
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1445
msgid "Add Settings for Layers"
msgstr "Ajouter des Réglages pour les Couches"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1316
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1447
msgid "Add Settings for Object"
msgstr "Ajouter des Réglages pour un Objet"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1315
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1446
msgid "Add Settings for Sub-object"
msgstr "Ajouter des Réglages pour un Sous-objet"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1793
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2051
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1953
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2210
msgid "Add Shape"
msgstr "Ajouter une Forme"
-#: src/libslic3r/PrintConfig.cpp:409
+#: src/libslic3r/PrintConfig.cpp:443
msgid "Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top+bottom solid layers)."
msgstr "Ajouter un remplissage plein à proximité des surfaces inclinées pour garantir une épaisseur de coque verticale (couches solides supérieures+inférieures)."
@@ -552,11 +592,19 @@ msgstr "Ajouter un bloqueur de support"
msgid "Add support enforcer"
msgstr "Ajouter un générateur de supports"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:494
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:374
msgid "Add support point"
msgstr "Ajouter un point de support"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4467
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:371
+msgid "Add supports"
+msgstr "Ajouter des supports"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:293
+msgid "Add supports by angle"
+msgstr "Ajouter des supports par angle"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4833
msgid "Add..."
msgstr "Ajouter..."
@@ -564,23 +612,29 @@ msgstr "Ajouter..."
msgid "Add/Remove filaments"
msgstr "Ajouter/Enlever des filaments"
-#: src/slic3r/GUI/Preset.cpp:1201
+#: src/slic3r/GUI/PresetComboBoxes.cpp:813
msgid "Add/Remove materials"
msgstr "Ajouter/Enlever des matériaux"
-#: src/slic3r/GUI/Preset.cpp:1203
+#: src/slic3r/GUI/PresetComboBoxes.cpp:622
+#: src/slic3r/GUI/PresetComboBoxes.cpp:669
+msgid "Add/Remove presets"
+msgstr "Ajouter/Supprimer des préréglages"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:815
+#: src/slic3r/GUI/PresetComboBoxes.cpp:972
msgid "Add/Remove printers"
msgstr "Ajouter/Supprimer des imprimantes"
-#: src/slic3r/GUI/Tab.cpp:970
+#: src/slic3r/GUI/Tab.cpp:1288
msgid "Additional information:"
msgstr "Informations complémentaires :"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:59
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:62
msgid "Additional Settings"
msgstr "Réglages Additionnels"
-#: src/slic3r/GUI/ConfigWizard.cpp:791
+#: src/slic3r/GUI/ConfigWizard.cpp:1150
msgid "Additionally a backup snapshot of the whole configuration is created before an update is applied."
msgstr "De plus, un instantané de sauvegarde de l'ensemble de la configuration est créé avant qu'une mise à jour ne soit appliquée."
@@ -588,23 +642,22 @@ msgstr "De plus, un instantané de sauvegarde de l'ensemble de la configuration
msgid "Address"
msgstr "Adresse"
-#: src/slic3r/GUI/GUI_App.cpp:814 src/slic3r/GUI/GUI_ObjectList.cpp:104
-#: src/slic3r/GUI/GUI_ObjectList.cpp:622 src/slic3r/GUI/Tab.cpp:1087
-#: src/slic3r/GUI/Tab.cpp:1102 src/slic3r/GUI/Tab.cpp:1201
-#: src/slic3r/GUI/Tab.cpp:1204 src/slic3r/GUI/Tab.cpp:1470
-#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:3661
-#: src/slic3r/GUI/wxExtensions.cpp:754 src/libslic3r/PrintConfig.cpp:88
-#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:223
-#: src/libslic3r/PrintConfig.cpp:1037 src/libslic3r/PrintConfig.cpp:2276
-#: src/libslic3r/PrintConfig.cpp:2448
+#: src/slic3r/GUI/GUI_ObjectList.cpp:102 src/slic3r/GUI/GUI_ObjectList.cpp:661
+#: src/slic3r/GUI/Tab.cpp:1409 src/slic3r/GUI/Tab.cpp:1430
+#: src/slic3r/GUI/Tab.cpp:1531 src/slic3r/GUI/Tab.cpp:1534
+#: src/slic3r/GUI/Tab.cpp:1816 src/slic3r/GUI/Tab.cpp:2152
+#: src/slic3r/GUI/Tab.cpp:4080 src/libslic3r/PrintConfig.cpp:90
+#: src/libslic3r/PrintConfig.cpp:121 src/libslic3r/PrintConfig.cpp:257
+#: src/libslic3r/PrintConfig.cpp:1081 src/libslic3r/PrintConfig.cpp:2419
+#: src/libslic3r/PrintConfig.cpp:2591
msgid "Advanced"
msgstr "Avancé"
-#: src/slic3r/GUI/ConfigWizard.cpp:821
+#: src/slic3r/GUI/ConfigWizard.cpp:1180
msgid "Advanced mode"
msgstr "Mode avancé"
-#: src/slic3r/GUI/GUI_App.cpp:814
+#: src/slic3r/GUI/GUI_App.cpp:1506
msgid "Advanced View Mode"
msgstr "Vue en Mode Avancé"
@@ -612,227 +665,299 @@ msgstr "Vue en Mode Avancé"
msgid "Advanced: Output log"
msgstr "Avancé : journal de Sortie"
-#: src/libslic3r/PrintConfig.cpp:668
+#: src/libslic3r/PrintConfig.cpp:704
msgid "After a tool change, the exact position of the newly loaded filament inside the nozzle may not be known, and the filament pressure is likely not yet stable. Before purging the print head into an infill or a sacrificial object, Slic3r will always prime this amount of material into the wipe tower to produce successive infill or sacrificial object extrusions reliably."
msgstr "Après un changement d'outil, la position exacte dans la buse du filament qui vient d'être chargé peut ne pas être connue, et la pression du filament n'est probablement pas encore stable. Avant de purger la tête d'impression dans un remplissage ou un objet sacrificiel, Slic3r va toujours utiliser cette quantité de matériau dans la tour de nettoyage pour produire un remplissage successif ou des extrusions d'objet sacrificiel de façon fiable."
-#: src/slic3r/GUI/Tab.cpp:1994 src/libslic3r/PrintConfig.cpp:1080
+#: src/slic3r/GUI/Tab.cpp:2182 src/libslic3r/PrintConfig.cpp:1173
msgid "After layer change G-code"
msgstr "G-Code après changement de couche"
-#: src/libslic3r/PrintConfig.cpp:3398
+#: src/libslic3r/PrintConfig.cpp:3597
msgid "Align the model to the given point."
msgstr "Aligner le modèle sur le point défini."
-#: src/libslic3r/PrintConfig.cpp:3397
+#: src/libslic3r/PrintConfig.cpp:3596
msgid "Align XY"
msgstr "Aligner XY"
-#: src/libslic3r/PrintConfig.cpp:1631
+#: src/libslic3r/PrintConfig.cpp:1739
msgid "Aligned"
msgstr "Aligné"
-#: src/slic3r/GUI/ConfigWizard.cpp:290 src/slic3r/GUI/ConfigWizard.cpp:573
-#: src/slic3r/GUI/Tab.cpp:3174
+#: src/libslic3r/PrintConfig.cpp:470 src/libslic3r/PrintConfig.cpp:902
+msgid "Aligned Rectilinear"
+msgstr "Rectiligne Aligné"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:308 src/slic3r/GUI/ConfigWizard.cpp:598
+#: src/slic3r/GUI/Tab.cpp:3507 src/slic3r/GUI/UnsavedChangesDialog.cpp:921
msgid "All"
msgstr "Tous"
-#: src/libslic3r/Print.cpp:1219
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:197
+msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button"
+msgstr "Tous les gizmos : Rotation - bouton gauche de la souris ; Panoramique - bouton droit de la souris"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:694
+msgid "All installed printers are compatible with the selected filament."
+msgstr "Toutes les imprimantes installées sont compatibles avec le filament sélectionné."
+
+#: src/libslic3r/Print.cpp:1245
msgid "All objects are outside of the print volume."
msgstr "Tous les objets sont en dehors du volume d'impression."
-#: src/slic3r/GUI/Plater.cpp:4669
+#: src/slic3r/GUI/Plater.cpp:4774
msgid "All objects will be removed, continue?"
msgstr "Tous les objets seront supprimés, continuer ?"
-#: src/slic3r/GUI/ConfigWizard.cpp:289
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:737
+msgid "All settings changes will be discarded."
+msgstr "Tous les changements de réglages seront perdus."
+
+#: src/libslic3r/PrintConfig.cpp:1212
+msgid "All solid surfaces"
+msgstr "Toutes les surfaces solides"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:307
msgid "All standard"
msgstr "Tout en standard"
-#: src/libslic3r/Zipper.cpp:62
+#: src/libslic3r/PrintConfig.cpp:1210
+msgid "All top surfaces"
+msgstr "Toutes les surfaces supérieures"
+
+#: src/libslic3r/miniz_extension.cpp:121
msgid "allocation failed"
msgstr "échec de l'allocation"
-#: src/slic3r/GUI/Plater.cpp:3995
+#: src/slic3r/GUI/Preferences.cpp:161 src/slic3r/GUI/Preferences.cpp:165
+msgid "Allow just a single PrusaSlicer instance"
+msgstr "N'autoriser qu'une seule instance de PrusaSlicer"
+
+#: src/slic3r/GUI/Plater.cpp:3915
msgid "Along X axis"
msgstr "Le long de l'axe X"
-#: src/slic3r/GUI/Plater.cpp:3997
+#: src/slic3r/GUI/Plater.cpp:3917
msgid "Along Y axis"
msgstr "Le long de l'axe Y"
-#: src/slic3r/GUI/Plater.cpp:3999
+#: src/slic3r/GUI/Plater.cpp:3919
msgid "Along Z axis"
msgstr "Le long de l'axe Z"
-#: src/slic3r/GUI/ConfigWizard.cpp:222
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:160
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141
+msgid "Alt + Mouse wheel"
+msgstr "Alt + molette de la souris"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:240
msgid "Alternate nozzles:"
msgstr "Buses alternatives :"
-#: src/slic3r/GUI/Plater.cpp:5002
-#, c-format
+#: src/slic3r/GUI/Preferences.cpp:163
+msgid "Always ask for unsaved changes when selecting new preset"
+msgstr "Toujours demander pour les modifications non enregistrées lors de la sélection d'un nouveau préréglage"
+
+#: src/slic3r/GUI/Plater.cpp:5135
+#, possible-c-format
msgid "AMF file exported to %s"
msgstr "Fichier AMF exporté vers %s"
-#: src/slic3r/GUI/GLCanvas3D.cpp:690
-msgid ""
-"An object outside the print area was detected\n"
-"Resolve the current problem to continue slicing"
-msgstr ""
-"Objet détecté en dehors de la zone d'impression\n"
-"Résolvez ce problème pour poursuivre le processus de découpage"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:685
-msgid "An object outside the print area was detected"
-msgstr "Objet détecté en dehors de la zone d'impression"
+#: src/slic3r/GUI/GLCanvas3D.cpp:638
+msgid "An object outside the print area was detected.\nResolve the current problem to continue slicing."
+msgstr "Un objet en dehors de la zone d'impression a été détecté.\nRésolvez le problème actuel pour continuer le découpage."
-#: src/slic3r/GUI/Tab.cpp:2943
-msgid "and it has the following unsaved changes:"
-msgstr "et il y a les changements non sauvegardés suivants :"
+#: src/slic3r/GUI/GLCanvas3D.cpp:633
+msgid "An object outside the print area was detected."
+msgstr "Un objet en dehors de la zone d'impression a été détecté."
-#: src/slic3r/GUI/Plater.cpp:3170
+#: src/slic3r/GUI/Plater.cpp:2972
msgid "Another export job is currently running."
msgstr "Une autre tâche d'export est actuellement en cours."
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:162
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
msgid "Any arrow"
msgstr "N'importe quelle flèche"
-#: src/slic3r/GUI/Tab.cpp:965
+#: src/slic3r/GUI/Tab.cpp:1283
msgid "Any modifications should be saved as a new preset inherited from this one."
msgstr "Toute modification doit être enregistrée comme un nouveau préréglage hérité de celui-ci."
-#: src/libslic3r/PrintConfig.cpp:104
+#: src/libslic3r/PrintConfig.cpp:162
+msgid "API key"
+msgstr "Clé API"
+
+#: src/libslic3r/PrintConfig.cpp:106
msgid "API Key / Password"
msgstr "Clé API / Mot de Passe"
-#: src/slic3r/GUI/GUI_App.cpp:810
+#: src/slic3r/GUI/GUI_App.cpp:1493
msgid "Application preferences"
msgstr "Préférences de l'application"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1374
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221
msgid "Apply changes"
msgstr "Appliquer les modifications"
-#: src/libslic3r/PrintConfig.cpp:575 src/libslic3r/PrintConfig.cpp:1708
+#: src/libslic3r/PrintConfig.cpp:611 src/libslic3r/PrintConfig.cpp:1823
msgid "approximate seconds"
msgstr "secondes approximatives"
-#: src/libslic3r/PrintConfig.cpp:428 src/libslic3r/PrintConfig.cpp:854
+#: src/libslic3r/PrintConfig.cpp:464 src/libslic3r/PrintConfig.cpp:892
msgid "Archimedean Chords"
msgstr "Accords archimédiens"
-#: src/libslic3r/Zipper.cpp:88
+#: src/libslic3r/miniz_extension.cpp:147
msgid "archive is too large"
msgstr "l'archive est trop volumineuse"
-#. TRN remove/delete
-#: src/slic3r/GUI/Tab.cpp:3123
+#: src/slic3r/GUI/Tab.cpp:3420
msgid "Are you sure you want to %1% the selected preset?"
msgstr "Êtes-vous sûr de vouloir %1% le préréglage sélectionné ?"
#: src/slic3r/GUI/FirmwareDialog.cpp:902
-msgid ""
-"Are you sure you want to cancel firmware flashing?\n"
-"This could leave your printer in an unusable state!"
-msgstr ""
-"Êtes-vous certain de vouloir annuler le processus de flash du firmware ?\n"
-"Cela pourrait rendre votre imprimante inutilisable !"
+msgid "Are you sure you want to cancel firmware flashing?\nThis could leave your printer in an unusable state!"
+msgstr "Êtes-vous certain de vouloir annuler le processus de flash du firmware ?\nCela pourrait rendre votre imprimante inutilisable !"
-#: src/slic3r/GUI/DoubleSlider.cpp:1903 src/slic3r/GUI/DoubleSlider.cpp:1924
+#: src/slic3r/GUI/DoubleSlider.cpp:2122 src/slic3r/GUI/DoubleSlider.cpp:2142
msgid "Are you sure you want to continue?"
msgstr "Êtes-vous sûr de vouloir continuer ?"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269
+#: src/slic3r/GUI/Tab.cpp:3392
+msgid "Are you sure you want to delete \"%1%\" preset from the physical printer \"%2%\"?"
+msgstr "Voulez-vous vraiment supprimer le préréglage \"%1%\" de l'imprimante physique \"%2%\" ?"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:658
+msgid "Are you sure you want to delete \"%1%\" printer?"
+msgstr "Voulez-vous vraiment supprimer l'imprimante \"%1%\" ?"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1128
msgid "Are you sure you want to do it?"
msgstr "Êtes-vous certain de vouloir le faire ?"
-#: src/libslic3r/PrintConfig.cpp:2423
+#: src/libslic3r/PrintConfig.cpp:2566
msgid "Area fill"
msgstr "Remplissage de zone"
-#: src/slic3r/GUI/Plater.cpp:641
+#: src/slic3r/GUI/Plater.cpp:507
msgid "Around object"
msgstr "Autour de l'objet"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:157
-#: src/slic3r/GUI/Plater.cpp:2754
+#: src/slic3r/GUI/GLCanvas3D.cpp:4859 src/slic3r/GUI/KBShortcutsDialog.cpp:151
+#: src/slic3r/GUI/Plater.cpp:1549
msgid "Arrange"
msgstr "Agencer"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:158
+#: src/slic3r/GUI/GLCanvas3D.cpp:3889
+msgid "Arrange options"
+msgstr "Options d'agencement"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4859 src/slic3r/GUI/KBShortcutsDialog.cpp:152
msgid "Arrange selection"
msgstr "Agencer la sélection"
-#: src/libslic3r/PrintConfig.cpp:3443
+#: src/libslic3r/PrintConfig.cpp:3642
msgid "Arrange the supplied models in a plate and merge them in a single model in order to perform actions once."
msgstr "Agencer les modèles fournis sur un plateau et les fusionner en un seul modèle afin de ne réaliser les actions qu'une seule fois."
-#: src/slic3r/GUI/Plater.cpp:2813
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:149
msgid "Arranging"
msgstr "Agencement en cours"
-#: src/slic3r/GUI/Plater.cpp:2841
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:182
msgid "Arranging canceled."
msgstr "Agencement annulé."
-#: src/slic3r/GUI/Plater.cpp:2842
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:183
msgid "Arranging done."
msgstr "Agencement terminé."
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:159
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:206
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
msgid "Arrow Down"
msgstr "Flèche Bas"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:160
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:229
msgid "Arrow Left"
msgstr "Flèche Gauche"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:161
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:230
msgid "Arrow Right"
msgstr "Flèche Droite"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:204
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:214
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:158
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
msgid "Arrow Up"
msgstr "Flèche Haut"
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:290
+#: src/slic3r/GUI/GUI_App.cpp:246
+msgid "Artwork model by Nora Al-Badri and Jan Nikolai Nelles"
+msgstr "Modèle d'illustration par Nora Al-Badri et Jan Nikolai Nelles"
+
+#: src/slic3r/GUI/OpenGLManager.cpp:265
msgid "As a workaround, you may run PrusaSlicer with a software rendered 3D graphics by running prusa-slicer.exe with the --sw_renderer parameter."
msgstr "Une solution consiste à lancer PrusaSlicer avec des graphismes 3D rendus par un logiciel en lançant prusa-slicer.exe avec le paramètre --sw_renderer."
-#: src/slic3r/GUI/GUI_App.cpp:1086 src/slic3r/GUI/Plater.cpp:2313
-#: src/slic3r/GUI/Tab.cpp:2960
+#: src/slic3r/GUI/Preferences.cpp:154
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:659
+msgid "Ask for unsaved changes when closing application"
+msgstr "Demander pour les modifications non enregistrées lors de la fermeture de l'application"
+
+#: src/slic3r/GUI/Preferences.cpp:161
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:660
+msgid "Ask for unsaved changes when selecting new preset"
+msgstr "Demander pour les modifications non enregistrées lors de la sélection d'un nouveau préréglage"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1183 src/slic3r/GUI/Preferences.cpp:91
+msgid "Associate .3mf files to PrusaSlicer"
+msgstr "Associer les fichiers .3mf à PrusaSlicer"
+
+#: src/slic3r/GUI/Preferences.cpp:177
+msgid "Associate .gcode files to PrusaSlicer G-code Viewer"
+msgstr "Associer les fichiers .gcode à à la prévisualisation de G-code de PrusaSlicer"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1184 src/slic3r/GUI/Preferences.cpp:98
+msgid "Associate .stl files to PrusaSlicer"
+msgstr "Associer les fichiers .stl à PrusaSlicer"
+
+#: src/slic3r/GUI/GUI_App.cpp:1878 src/slic3r/GUI/Jobs/SLAImportJob.cpp:210
+#: src/slic3r/GUI/Plater.cpp:2256 src/slic3r/GUI/Tab.cpp:3189
msgid "Attention!"
msgstr "Attention !"
-#: src/libslic3r/PrintConfig.cpp:1871
+#: src/libslic3r/PrintConfig.cpp:150
+msgid "Authorization Type"
+msgstr "Type d'autorisation"
+
+#: src/libslic3r/PrintConfig.cpp:2013
msgid "Auto generated supports"
msgstr "Supports générés automatiquement"
-#: src/slic3r/GUI/Preferences.cpp:47
+#: src/slic3r/GUI/Preferences.cpp:64
msgid "Auto-center parts"
msgstr "Centrer automatiquement les pièces"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1377
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224
msgid "Auto-generate points"
msgstr "Générer automatiquement les points"
-#: src/slic3r/GUI/Plater.cpp:1157
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:1066
+#, possible-c-format
msgid "Auto-repaired (%d errors)"
msgstr "Réparé automatiquement (%d erreurs)"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:339
-#, c-format
+#: src/slic3r/GUI/GUI_ObjectList.cpp:386
+#, possible-c-format
msgid "Auto-repaired (%d errors):"
msgstr "Réparé automatiquement (%d erreurs):"
@@ -840,67 +965,75 @@ msgstr "Réparé automatiquement (%d erreurs):"
msgid "Autodetected"
msgstr "Autodétecté"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1134
msgid "Autogenerate support points"
msgstr "Autogénérer les points de support"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1127
msgid "Autogeneration will erase all manually edited points."
msgstr "L'autogénération va effacer tous les points édités manuellement."
-#: src/slic3r/GUI/Tab.cpp:3632
+#: src/slic3r/GUI/Tab.cpp:4051
msgid "Automatic generation"
msgstr "Génération automatique"
-#: src/slic3r/GUI/ConfigWizard.cpp:761
+#: src/slic3r/GUI/ConfigWizard.cpp:1120
msgid "Automatic updates"
msgstr "Mises à jour automatiques"
-#: src/slic3r/GUI/MainFrame.cpp:536
+#: src/slic3r/GUI/MainFrame.cpp:1137
msgid "Automatically repair an STL file"
msgstr "Réparer automatiquement un fichier STL"
-#: src/slic3r/GUI/Tab.cpp:1171
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:129
+msgid "Autoset by angle"
+msgstr "Autoset par angle"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:233
+msgid "Autoset custom supports"
+msgstr "Supports personnalisés Autoset"
+
+#: src/slic3r/GUI/Tab.cpp:1501
msgid "Autospeed (advanced)"
msgstr "Vitesse automatique (avancé)"
-#: src/libslic3r/PrintConfig.cpp:136
+#: src/libslic3r/PrintConfig.cpp:169
msgid "Avoid crossing perimeters"
msgstr "Éviter de traverser les périmètres"
-#: src/slic3r/GUI/Tab.cpp:3268
+#: src/libslic3r/PrintConfig.cpp:188
+msgid "Avoid crossing perimeters - Max detour length"
+msgstr "Éviter de croiser les périmètres - Longueur de détour maximum"
+
+#: src/slic3r/GUI/Tab.cpp:3705
msgid "BACK ARROW"
msgstr "FLÈCHE ARRIÈRE"
-#: src/slic3r/GUI/Tab.cpp:3290
-msgid ""
-"BACK ARROW icon indicates that the settings were changed and are not equal to the last saved preset for the current option group.\n"
-"Click to reset all settings for the current option group to the last saved preset."
-msgstr ""
-"L'icône FLÈCHE ARRIÈRE indique que les paramètres ont été changés et qu'ils ne sont pas identiques au dernier préréglage enregistré du groupe d'options en cours.\n"
-"Cliquez pour restaurer tous les paramètres du groupe d'options en cours avec les valeurs du dernier préréglage enregistré."
+#: src/slic3r/GUI/Tab.cpp:3727
+msgid "BACK ARROW icon indicates that the settings were changed and are not equal to the last saved preset for the current option group.\nClick to reset all settings for the current option group to the last saved preset."
+msgstr "L'icône FLÈCHE ARRIÈRE indique que les paramètres ont été changés et qu'ils ne sont pas identiques au dernier préréglage enregistré du groupe d'options en cours.\nCliquez pour restaurer tous les paramètres du groupe d'options en cours avec les valeurs du dernier préréglage enregistré."
-#: src/slic3r/GUI/Tab.cpp:3304
-msgid ""
-"BACK ARROW icon indicates that the value was changed and is not equal to the last saved preset.\n"
-"Click to reset current value to the last saved preset."
-msgstr ""
-"L'icône FLÈCHE ARRIÈRE indique que la valeur a été changée et qu'elle n'est pas identique au dernier préréglage enregistré.\n"
-"Cliquez pour restaurer la valeur à celle du dernier préréglage enregistré."
+#: src/slic3r/GUI/Tab.cpp:3741
+msgid "BACK ARROW icon indicates that the value was changed and is not equal to the last saved preset.\nClick to reset current value to the last saved preset."
+msgstr "L'icône FLÈCHE ARRIÈRE indique que la valeur a été changée et qu'elle n'est pas identique au dernier préréglage enregistré.\nCliquez pour restaurer la valeur à celle du dernier préréglage enregistré."
-#: src/slic3r/GUI/Preferences.cpp:55
+#: src/slic3r/GUI/Preferences.cpp:72
msgid "Background processing"
msgstr "Tâche en arrière plan"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:351
+#: src/slic3r/GUI/GUI_ObjectList.cpp:398
msgid "backwards edges"
msgstr "arrêtes à l'envers"
-#: src/slic3r/GUI/MainFrame.cpp:174
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60
+msgid "Balanced"
+msgstr "Équilibré"
+
+#: src/slic3r/GUI/MainFrame.cpp:535 src/slic3r/GUI/MainFrame.cpp:537
msgid "based on Slic3r"
msgstr "basé sur Slic3r"
-#: src/slic3r/GUI/Tab.cpp:1439
+#: src/slic3r/GUI/Tab.cpp:1785
msgid "Bed"
msgstr "Plateau"
@@ -912,7 +1045,7 @@ msgstr "Modèle personnalisé de lit"
msgid "Bed custom texture"
msgstr "Texture du plateau personnalisée"
-#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:929
+#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1295
msgid "Bed Shape"
msgstr "Forme du plateau"
@@ -920,23 +1053,23 @@ msgstr "Forme du plateau"
msgid "Bed shape"
msgstr "Forme du plateau"
-#: src/slic3r/GUI/ConfigWizard.cpp:929
+#: src/slic3r/GUI/ConfigWizard.cpp:1295
msgid "Bed Shape and Size"
msgstr "Forme du Plateau et Taille"
-#: src/libslic3r/PrintConfig.cpp:147
+#: src/libslic3r/PrintConfig.cpp:181
msgid "Bed temperature"
msgstr "Température du plateau"
-#: src/libslic3r/PrintConfig.cpp:145
+#: src/libslic3r/PrintConfig.cpp:178
msgid "Bed temperature for layers after the first one. Set this to zero to disable bed temperature control commands in the output."
msgstr "Température du plateau pour les couches après la première. Mettez ceci à zéro pour désactiver les commandes de contrôle de température du plateau dans la sortie."
-#: src/slic3r/GUI/ConfigWizard.cpp:1051
+#: src/slic3r/GUI/ConfigWizard.cpp:1417
msgid "Bed Temperature:"
msgstr "Température du Plateau :"
-#: src/slic3r/GUI/Tab.cpp:1988 src/libslic3r/PrintConfig.cpp:153
+#: src/slic3r/GUI/Tab.cpp:2175 src/libslic3r/PrintConfig.cpp:187
msgid "Before layer change G-code"
msgstr "G-Code avant changement de couche"
@@ -944,143 +1077,183 @@ msgstr "G-Code avant changement de couche"
msgid "Before roll back"
msgstr "Avant le retour en arrière"
-#: src/slic3r/GUI/Plater.cpp:640
+#: src/slic3r/GUI/Plater.cpp:506
msgid "Below object"
msgstr "Sous l'objet"
-#: src/libslic3r/PrintConfig.cpp:1578
+#: src/libslic3r/PrintConfig.cpp:1686
msgid "Below Z"
msgstr "En-deçà de Z"
-#: src/libslic3r/PrintConfig.cpp:164
+#: src/libslic3r/PrintConfig.cpp:198
msgid "Between objects G-code"
msgstr "Entre le G-code des objets"
-#: src/slic3r/GUI/Tab.cpp:2006
+#: src/slic3r/GUI/Tab.cpp:2196
msgid "Between objects G-code (for sequential printing)"
msgstr "Entre le G-code des objets (pour une impression séquentielle)"
-#: src/libslic3r/PrintConfig.cpp:2489 src/libslic3r/PrintConfig.cpp:2490
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242
+msgid "Block"
+msgstr "Bloquer"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:383
+msgid "Block seam"
+msgstr "Bloquer la jointure"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:373
+msgid "Block supports"
+msgstr "Bloquer les supports"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:292
+msgid "Block supports by angle"
+msgstr "Bloquer les supports par angle"
+
+#: src/libslic3r/PrintConfig.cpp:2632 src/libslic3r/PrintConfig.cpp:2633
msgid "Bottle volume"
msgstr "Volume de la bouteille"
-#: src/libslic3r/PrintConfig.cpp:2496 src/libslic3r/PrintConfig.cpp:2497
+#: src/libslic3r/PrintConfig.cpp:2639 src/libslic3r/PrintConfig.cpp:2640
msgid "Bottle weight"
msgstr "Poids de la bouteille"
#. TRN To be shown in the main menu View->Bottom
#. TRN To be shown in Print Settings "Bottom solid layers"
#. TRN To be shown in Print Settings "Top solid layers"
-#: src/slic3r/GUI/MainFrame.cpp:665 src/libslic3r/PrintConfig.cpp:174
-#: src/libslic3r/PrintConfig.cpp:183
+#: src/slic3r/GUI/MainFrame.cpp:962 src/slic3r/GUI/MainFrame.cpp:1282
+#: src/libslic3r/PrintConfig.cpp:208 src/libslic3r/PrintConfig.cpp:217
msgid "Bottom"
msgstr "Dessous"
-#: src/libslic3r/PrintConfig.cpp:435
+#: src/libslic3r/PrintConfig.cpp:471
msgid "Bottom fill pattern"
msgstr "Motif de remplissage du dessous"
-#: src/slic3r/GUI/PresetHints.cpp:342
+#: src/slic3r/GUI/PresetHints.cpp:340
msgid "Bottom is open."
msgstr "Le fond est ouvert."
-#: src/slic3r/GUI/PresetHints.cpp:336
+#: src/slic3r/GUI/PresetHints.cpp:334
msgid "Bottom shell is %1% mm thick for layer height %2% mm."
msgstr "La coque inférieure a une épaisseur de %1% mm pour une hauteur de couche %2% mm."
-#: src/libslic3r/PrintConfig.cpp:177
+#: src/libslic3r/PrintConfig.cpp:211
msgid "Bottom solid layers"
msgstr "Couches solides inférieures"
-#: src/slic3r/GUI/MainFrame.cpp:665
+#: src/slic3r/GUI/MainFrame.cpp:962 src/slic3r/GUI/MainFrame.cpp:1282
msgid "Bottom View"
msgstr "Vue du Dessous"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1432
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1464
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1468
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1595
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1599
msgid "Box"
msgstr "Case"
-#: src/libslic3r/PrintConfig.cpp:193
+#: src/libslic3r/PrintConfig.cpp:227
msgid "Bridge"
msgstr "Pont"
-#: src/libslic3r/PrintConfig.cpp:222
+#: src/libslic3r/PrintConfig.cpp:256
msgid "Bridge flow ratio"
msgstr "Ratio de flux pour les ponts"
-#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:316
+#: src/slic3r/GUI/GUI_Preview.cpp:308 src/libslic3r/ExtrusionEntity.cpp:321
+#: src/libslic3r/ExtrusionEntity.cpp:350
msgid "Bridge infill"
msgstr "Remplissage du pont"
-#: src/libslic3r/PrintConfig.cpp:234
+#: src/libslic3r/PrintConfig.cpp:268
msgid "Bridges"
msgstr "Ponts"
-#: src/libslic3r/PrintConfig.cpp:213
+#: src/libslic3r/PrintConfig.cpp:247
msgid "Bridges fan speed"
msgstr "Vitesse du ventilateur pour les ponts"
-#: src/libslic3r/PrintConfig.cpp:202
+#: src/libslic3r/PrintConfig.cpp:236
msgid "Bridging angle"
msgstr "Angle du pont"
-#: src/libslic3r/PrintConfig.cpp:204
+#: src/libslic3r/PrintConfig.cpp:238
msgid "Bridging angle override. If left to zero, the bridging angle will be calculated automatically. Otherwise the provided angle will be used for all bridges. Use 180° for zero angle."
msgstr "Contournement de l'angle du pont. Si laissé à zéro, l'angle du pont sera calculé automatiquement. Sinon, l'angle fourni sera utilisé pour tous les ponts. Utilisez 180° pour un angle nul."
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:218
msgid "Bridging volumetric"
msgstr "Volumétrie des ponts"
-#: src/slic3r/GUI/Plater.cpp:534 src/slic3r/GUI/Tab.cpp:1117
+#: src/slic3r/GUI/Plater.cpp:400 src/slic3r/GUI/Tab.cpp:1446
msgid "Brim"
msgstr "Bordure"
-#: src/libslic3r/PrintConfig.cpp:244
+#: src/libslic3r/PrintConfig.cpp:278
msgid "Brim width"
msgstr "Largeur de la bordure"
-#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1658
-#: src/slic3r/GUI/Tab.cpp:1721
+#: src/slic3r/GUI/FirmwareDialog.cpp:805
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:271
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327
msgid "Browse"
msgstr "Parcourir"
-#: src/libslic3r/Zipper.cpp:82
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:28
+msgid "Brush shape"
+msgstr "Forme du pinceau"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:27
+msgid "Brush size"
+msgstr "Taille du pinceau"
+
+#: src/libslic3r/miniz_extension.cpp:141
msgid "buffer too small"
msgstr "buffer trop petit"
+#: src/slic3r/GUI/GUI_App.cpp:1152
+msgid "But since this version of PrusaSlicer we don't show this information in Printer Settings anymore.\nSettings will be available in physical printers settings."
+msgstr "Mais depuis cette version de PrusaSlicer, nous ne montrons plus ces informations dans les Réglages de l'imprimante.\nLes réglages seront disponibles dans les réglages des imprimantes physiques."
+
#: src/slic3r/GUI/ButtonsDescription.cpp:16
msgid "Buttons And Text Colors Description"
msgstr "Description des Boutons et des Couleurs de Texte"
-#: src/slic3r/GUI/PresetHints.cpp:223
+#: src/slic3r/GUI/GUI_App.cpp:1084
+msgid "By default new Printer devices will be named as \"Printer N\" during its creation.\nNote: This name can be changed later from the physical printers settings"
+msgstr "Par défaut, les nouvelles imprimantes seront nommées \"Imprimante N\" lors de leur création.\nRemarque : ce nom peut être modifié ultérieurement dans les réglages des imprimantes physiques"
+
+#: src/slic3r/GUI/PresetHints.cpp:222
msgid "by the print profile maximum"
msgstr "par le maximum du profil de l'imprimante"
-#: src/slic3r/GUI/Preferences.cpp:113
+#: src/slic3r/GUI/Preferences.cpp:178
msgid "Camera"
msgstr "Caméra"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:144
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:140
msgid "Camera view"
msgstr "Vue caméra"
-#: src/slic3r/GUI/ConfigWizard.cpp:1982 src/slic3r/GUI/FirmwareDialog.cpp:151
+#: src/slic3r/GUI/ConfigWizard.cpp:2493 src/slic3r/GUI/FirmwareDialog.cpp:151
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:245
#: src/slic3r/GUI/ProgressStatusBar.cpp:26
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:644
msgid "Cancel"
msgstr "Annuler"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:157
+#: src/slic3r/GUI/PrintHostDialogs.cpp:155
msgid "Cancel selected"
msgstr "Annuler la sélection"
-#: src/slic3r/GUI/Plater.cpp:3669 src/slic3r/GUI/PrintHostDialogs.cpp:233
+#: src/slic3r/GUI/Plater.cpp:3589 src/slic3r/GUI/PrintHostDialogs.cpp:233
msgid "Cancelled"
msgstr "Annulé"
-#: src/slic3r/GUI/Plater.cpp:3153 src/slic3r/GUI/PrintHostDialogs.cpp:232
+#: src/slic3r/GUI/Plater.cpp:2953 src/slic3r/GUI/PrintHostDialogs.cpp:232
msgid "Cancelling"
msgstr "Annulation"
@@ -1092,106 +1265,100 @@ msgstr "Annulation..."
msgid "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible."
msgstr "Impossible de calculer la largeur d'extrusion pour %1% : la variable \"%2%\" n'est pas accessible."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3017
-msgid ""
-"Cannot insert a new layer range after the current layer range.\n"
-"Current layer range overlaps with the next layer range."
-msgstr ""
-"Impossible d'insérer une nouvelle zone de couche après la zone de couche actuelle.\n"
-"La zone de couche actuelle chevauche la prochaine zone de couche."
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3400
+msgid "Cannot insert a new layer range after the current layer range.\nCurrent layer range overlaps with the next layer range."
+msgstr "Impossible d'insérer une nouvelle zone de couche après la zone de couche actuelle.\nLa zone de couche actuelle chevauche la prochaine zone de couche."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3008
-msgid ""
-"Cannot insert a new layer range after the current layer range.\n"
-"The next layer range is too thin to be split to two\n"
-"without violating the minimum layer height."
-msgstr ""
-"Impossible d'insérer une nouvelle zone de couche après la zone de couche actuelle.\n"
-"La zone de couche suivante est trop fine pour être séparée en deux sans enfreindre la hauteur de couche minimum."
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3391
+msgid "Cannot insert a new layer range after the current layer range.\nThe next layer range is too thin to be split to two\nwithout violating the minimum layer height."
+msgstr "Impossible d'insérer une nouvelle zone de couche après la zone de couche actuelle.\nLa zone de couche suivante est trop fine pour être séparée en deux sans enfreindre la hauteur de couche minimum."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3012
-msgid ""
-"Cannot insert a new layer range between the current and the next layer range.\n"
-"The gap between the current layer range and the next layer range\n"
-"is thinner than the minimum layer height allowed."
-msgstr ""
-"Impossible d'insérer une nouvelle zone de couche entre l'actuelle et la prochaine.\n"
-"L'espace entre la zone de couche actuelle et la prochaine est inférieur à la hauteur de couche minimum autorisée."
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3395
+msgid "Cannot insert a new layer range between the current and the next layer range.\nThe gap between the current layer range and the next layer range\nis thinner than the minimum layer height allowed."
+msgstr "Impossible d'insérer une nouvelle zone de couche entre l'actuelle et la prochaine.\nL'espace entre la zone de couche actuelle et la prochaine est inférieur à la hauteur de couche minimum autorisée."
-#: src/slic3r/GUI/Tab.cpp:3073
+#: src/slic3r/GUI/SavePresetDialog.cpp:137
msgid "Cannot overwrite a system profile."
msgstr "Impossible d'écraser un profil système."
-#: src/slic3r/GUI/Tab.cpp:3077
+#: src/slic3r/GUI/SavePresetDialog.cpp:142
msgid "Cannot overwrite an external profile."
msgstr "Impossible d'écraser un profil externe."
-#: src/libslic3r/SLAPrint.cpp:613
+#: src/libslic3r/SLAPrint.cpp:627
msgid "Cannot proceed without support points! Add support points or disable support generation."
msgstr "Il n'est pas possible de continuer sans ajouter des points de support ! Ajoutez des points de support ou désactivez la génération de support."
-#: src/slic3r/GUI/Tab.cpp:1834
+#: src/slic3r/GUI/Tab.cpp:2068 src/slic3r/GUI/UnsavedChangesDialog.cpp:1066
msgid "Capabilities"
msgstr "Fonctionnalités"
-#: src/slic3r/GUI/GUI_App.cpp:801
+#: src/slic3r/GUI/GUI_App.cpp:1481
msgid "Capture a configuration snapshot"
msgstr "Capturer un instantané de la configuration"
-#: src/libslic3r/PrintConfig.cpp:3424
+#: src/slic3r/GUI/ImGuiWrapper.cpp:801 src/slic3r/GUI/Search.cpp:458
+msgid "Category"
+msgstr "Catégorie"
+
+#: src/libslic3r/PrintConfig.cpp:3623
msgid "Center"
msgstr "Centrer"
-#: src/libslic3r/PrintConfig.cpp:3425
+#: src/libslic3r/PrintConfig.cpp:3624
msgid "Center the print around the given center."
msgstr "Centrer l'impression autour d'un point donné."
-#: src/slic3r/GUI/Tab.cpp:1728
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:329
msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*"
msgstr "Fichiers de certificat (*.crt, *.pem)|*.crt;*.pem|Tous les fichiers|*.*"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:180
+#: src/slic3r/GUI/SavePresetDialog.cpp:313
+msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\""
+msgstr "Changer \"%1%\" par \"%2%\" pour cette imprimante physique \"%3%\""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:174
msgid "Change camera type (perspective, orthographic)"
msgstr "Changer le type d'appareil photo (perspective, orthographique)"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:885
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:693
msgid "Change drainage hole diameter"
msgstr "Changer le diamètre du trou de drainage"
-#: src/slic3r/GUI/DoubleSlider.cpp:1144 src/slic3r/GUI/GUI_ObjectList.cpp:1671
+#: src/slic3r/GUI/DoubleSlider.cpp:1273 src/slic3r/GUI/GUI_ObjectList.cpp:1800
msgid "Change extruder"
msgstr "Changer l'extrudeur"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:536
+#: src/slic3r/GUI/GUI_ObjectList.cpp:574
msgid "Change Extruder"
msgstr "Changer d'Extrudeur"
-#: src/slic3r/GUI/DoubleSlider.cpp:1145
+#: src/slic3r/GUI/DoubleSlider.cpp:1274
msgid "Change extruder (N/A)"
msgstr "Changer l'extrudeur (N/A)"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3997
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4484
msgid "Change Extruders"
msgstr "Changer les Extrudeurs"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:152
-#, c-format
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:157
+#, possible-c-format
msgid "Change Option %s"
msgstr "Modifier l'Option %s"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3558
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4021
msgid "Change Part Type"
msgstr "Changer le Type de Partie"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:820
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:694
msgid "Change point head diameter"
msgstr "Changer le diamètre de la tête de la pointe"
-#: src/slic3r/GUI/Plater.cpp:3944
+#: src/slic3r/GUI/Plater.cpp:3862
msgid "Change the number of instances of the selected object"
msgstr "Modifie le nombre d'instances de l'objet sélectionné"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1589
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1718
msgid "Change type"
msgstr "Changer le type"
@@ -1199,125 +1366,176 @@ msgstr "Changer le type"
msgid "Changelog && Download"
msgstr "Téléchargement du Journal des Modifications"
-#: src/slic3r/GUI/GUI_App.cpp:442
+#: src/slic3r/GUI/GUI_App.cpp:1245
msgid "Changing of an application language"
msgstr "Changer la langue d'une application"
-#: src/slic3r/GUI/ConfigWizard.cpp:769 src/slic3r/GUI/Preferences.cpp:64
+#: src/slic3r/GUI/ConfigWizard.cpp:1128 src/slic3r/GUI/Preferences.cpp:81
msgid "Check for application updates"
msgstr "Vérifier les mises à jour de l'application"
-#: src/slic3r/GUI/GUI_App.cpp:802
+#: src/slic3r/GUI/GUI_App.cpp:1482
msgid "Check for configuration updates"
msgstr "Vérifier les mises à jour de configuration"
-#: src/slic3r/GUI/GUI_App.cpp:802
+#: src/slic3r/GUI/GUI_App.cpp:1482
msgid "Check for updates"
msgstr "Vérifier les mises à jo&ur"
-#: src/slic3r/GUI/BedShapeDialog.cpp:532
+#: src/slic3r/Utils/PresetUpdater.cpp:412
+#: src/slic3r/Utils/PresetUpdater.cpp:420
+msgid "checking install indices"
+msgstr "vérification des indices d'installation"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:608
msgid "Choose a file to import bed texture from (PNG/SVG):"
msgstr "Choisir un fichier à partir duquel importer la texture du plateau (PNG/SVG) :"
-#: src/slic3r/GUI/MainFrame.cpp:773
+#: src/slic3r/GUI/MainFrame.cpp:1474
msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):"
msgstr "Choisir un fichier à découper (STL/OBJ/AMF/3MF/PRUSA) :"
-#: src/slic3r/GUI/BedShapeDialog.cpp:555
+#: src/slic3r/GUI/BedShapeDialog.cpp:631
msgid "Choose an STL file to import bed model from:"
msgstr "Choisissez un fichier STL à partir duquel importer le modèle de lit :"
-#: src/slic3r/GUI/BedShapeDialog.cpp:487
+#: src/slic3r/GUI/BedShapeDialog.cpp:563
msgid "Choose an STL file to import bed shape from:"
msgstr "Choisissez un fichier STL à partir duquel importer la forme du plateau :"
-#: src/slic3r/GUI/GUI_App.cpp:555
+#: src/slic3r/GUI/GUI_App.cpp:1208
msgid "Choose one file (3MF/AMF):"
msgstr "Choisir un fichier (3MF/AMF) :"
-#: src/slic3r/GUI/GUI_App.cpp:567
+#: src/slic3r/GUI/GUI_App.cpp:1233
+msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):"
+msgstr "Choisir un fichier (GCODE/.GCO/.G/.ngc/NGC) :"
+
+#: src/slic3r/GUI/GUI_App.cpp:1220
msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):"
msgstr "Choisir un ou plusieurs fichiers (STL/OBJ/AMF/3MF/PRUSA) :"
-#: src/slic3r/GUI/ConfigWizard.cpp:895
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:35
+msgid "Choose SLA archive:"
+msgstr "Choisir l'archive SLA :"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1261
msgid "Choose the type of firmware used by your printer."
msgstr "Choisissez le type de firmware utilisé par votre imprimante."
-#: src/slic3r/GUI/BedShapeDialog.cpp:89
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36
+msgid "Circle"
+msgstr "Cercle"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:142
msgid "Circular"
msgstr "Circulaire"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4624 src/slic3r/GUI/GLCanvas3D.cpp:4657
-msgid "Click right mouse button to open History"
-msgstr "Faites un clic droit sur la souris pour ouvrir l'Historique"
+#: src/slic3r/GUI/GLCanvas3D.cpp:5028 src/slic3r/GUI/GLCanvas3D.cpp:5067
+msgid "Click right mouse button to open/close History"
+msgstr "Cliquez avec le bouton droit de la souris pour ouvrir/fermer l'historique"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4341
+msgid "Click right mouse button to show arrangement options"
+msgstr "Faites un clic droit pour afficher les options d'agencement"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:404
+#: src/slic3r/GUI/GUI_ObjectList.cpp:451
msgid "Click the icon to change the object printable property"
msgstr "Cliquez sur l'icône pour changer les propriétés imprimables de l'objet"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:398
+#: src/slic3r/GUI/GUI_ObjectList.cpp:445
msgid "Click the icon to change the object settings"
msgstr "Cliquez sur l'icône pour modifier les réglages de l'objet"
-#: src/slic3r/GUI/Plater.cpp:343
+#: src/slic3r/GUI/PresetComboBoxes.cpp:566
msgid "Click to edit preset"
msgstr "Cliquez pour éditer le préréglage"
-#: src/libslic3r/PrintConfig.cpp:252
+#: src/slic3r/GUI/GCodeViewer.cpp:2071
+msgid "Click to hide"
+msgstr "Cliquez pour cacher"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2071
+msgid "Click to show"
+msgstr "Cliquez pour afficher"
+
+#: src/libslic3r/PrintConfig.cpp:286
msgid "Clip multi-part objects"
msgstr "Dissocier les objets multi-pièces"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:25
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57
msgid "Clipping of view"
msgstr "Le plan de découpage"
#: src/slic3r/GUI/FirmwareDialog.cpp:852
-#: src/slic3r/GUI/Mouse3DController.cpp:364
-#: src/slic3r/GUI/PrintHostDialogs.cpp:161
+#: src/slic3r/GUI/Mouse3DController.cpp:353
+#: src/slic3r/GUI/PrintHostDialogs.cpp:159
msgid "Close"
msgstr "Fermer"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45
-#: src/libslic3r/PrintConfig.cpp:2934
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44
+#: src/libslic3r/PrintConfig.cpp:3098
msgid "Closing distance"
-msgstr "Distance de fermeture"
+msgstr "Intervalle d'espacement"
-#: src/slic3r/GUI/Plater.cpp:1260 src/libslic3r/PrintConfig.cpp:582
+#: src/slic3r/GUI/MainFrame.cpp:1297 src/slic3r/GUI/Plater.cpp:2144
+msgid "Collapse sidebar"
+msgstr "Réduire la barre latérale"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:180
+msgid "Collapse/Expand the sidebar"
+msgstr "Réduire/développer la barre latérale"
+
+#: src/slic3r/GUI/Plater.cpp:1198 src/libslic3r/PrintConfig.cpp:618
msgid "Color"
msgstr "Couleur"
-#: src/slic3r/GUI/DoubleSlider.cpp:1005
+#: src/slic3r/GUI/GCodeViewer.cpp:2410 src/slic3r/GUI/GCodeViewer.cpp:2438
+msgid "Color change"
+msgstr "Changement de couleur"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1130
msgid "Color change (\"%1%\")"
msgstr "Changement de couleur (\"%1%\")"
-#: src/slic3r/GUI/DoubleSlider.cpp:1006
+#: src/slic3r/GUI/DoubleSlider.cpp:1131
msgid "Color change (\"%1%\") for Extruder %2%"
msgstr "Changement de couleur (\"%1%\") pour l'extrudeur %2%"
-#: src/slic3r/GUI/GLCanvas3D.cpp:995
-#, c-format
-msgid "Color change for Extruder %d at %.2f mm"
-msgstr "Changement de couleur pour l'Extrudeur %d à %.2f mm"
+#: src/slic3r/GUI/Tab.cpp:2203
+msgid "Color Change G-code"
+msgstr "G-code de changement de couleur"
+
+#: src/libslic3r/PrintConfig.cpp:1960
+msgid "Color change G-code"
+msgstr "G-code de changement de couleur"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2531 src/slic3r/GUI/GUI_Preview.cpp:1475
+msgid "Color changes"
+msgstr "Changements de couleur"
-#: src/slic3r/GUI/GUI_Preview.cpp:228 src/slic3r/GUI/GUI_Preview.cpp:572
-#: src/libslic3r/GCode/PreviewData.cpp:359
+#: src/slic3r/GUI/GCodeViewer.cpp:2242 src/slic3r/GUI/GUI_Preview.cpp:282
+#: src/slic3r/GUI/GUI_Preview.cpp:784 src/libslic3r/GCode/PreviewData.cpp:364
msgid "Color Print"
msgstr "Couleur d'Impression"
-#: src/libslic3r/PrintConfig.cpp:260
+#: src/libslic3r/PrintConfig.cpp:294
msgid "Colorprint height"
msgstr "Hauteur du Colorprint"
-#: src/libslic3r/PrintConfig.cpp:990
+#: src/libslic3r/PrintConfig.cpp:1034
msgid "Combine infill every"
msgstr "Combiner le remplissage toutes les"
-#: src/libslic3r/PrintConfig.cpp:995
+#: src/libslic3r/PrintConfig.cpp:1039
msgid "Combine infill every n layers"
msgstr "Combiner le remplissage toutes les n couches"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:154
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:148
msgid "Commands"
msgstr "Commandes"
@@ -1325,23 +1543,23 @@ msgstr "Commandes"
msgid "Comment:"
msgstr "Commentaire :"
-#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:280
+#: src/slic3r/GUI/Tab.cpp:107 src/libslic3r/PrintConfig.cpp:314
msgid "Compatible print profiles"
msgstr "Profils d'impression compatibles"
-#: src/libslic3r/PrintConfig.cpp:286
+#: src/libslic3r/PrintConfig.cpp:320
msgid "Compatible print profiles condition"
msgstr "Condition des profils d'impression compatibles"
-#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:265
+#: src/slic3r/GUI/Tab.cpp:101 src/libslic3r/PrintConfig.cpp:299
msgid "Compatible printers"
msgstr "Imprimantes compatibles"
-#: src/libslic3r/PrintConfig.cpp:271
+#: src/libslic3r/PrintConfig.cpp:305
msgid "Compatible printers condition"
msgstr "Condition de compatibilité des imprimantes"
-#: src/libslic3r/PrintConfig.cpp:304
+#: src/libslic3r/PrintConfig.cpp:338
msgid "Complete individual objects"
msgstr "Compléter les objets individuels"
@@ -1349,27 +1567,27 @@ msgstr "Compléter les objets individuels"
msgid "Completed"
msgstr "Terminé"
-#: src/libslic3r/Zipper.cpp:54
+#: src/libslic3r/miniz_extension.cpp:113
msgid "compression failed"
msgstr "échec de la compression"
-#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:849
+#: src/libslic3r/PrintConfig.cpp:462 src/libslic3r/PrintConfig.cpp:887
msgid "Concentric"
msgstr "Concentrique"
-#: src/slic3r/GUI/ConfigWizard.cpp:2110
+#: src/slic3r/GUI/ConfigWizard.cpp:2625
msgid "Configuration &Assistant"
msgstr "&Assistant de Configuration"
-#: src/slic3r/GUI/ConfigWizard.cpp:2113
+#: src/slic3r/GUI/ConfigWizard.cpp:2628
msgid "Configuration &Wizard"
msgstr "Assistant de Co&nfiguration"
-#: src/slic3r/GUI/ConfigWizard.cpp:2109
+#: src/slic3r/GUI/ConfigWizard.cpp:2624
msgid "Configuration Assistant"
msgstr "Assistant de Configuration"
-#: src/libslic3r/PrintConfig.cpp:1316
+#: src/libslic3r/PrintConfig.cpp:1424
msgid "Configuration notes"
msgstr "Notes de configuration"
@@ -1385,11 +1603,15 @@ msgstr "Mise à jour de la configuration"
msgid "Configuration update is available"
msgstr "Une mise à jour de la configuration est disponible"
-#: src/slic3r/GUI/UpdateDialogs.cpp:303
+#: src/slic3r/GUI/NotificationManager.hpp:321
+msgid "Configuration update is available."
+msgstr "Une mise à jour de la configuration est disponible."
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:304
msgid "Configuration updates"
msgstr "Mises à jour de la configuration"
-#: src/slic3r/GUI/ConfigWizard.cpp:2112
+#: src/slic3r/GUI/ConfigWizard.cpp:2627
msgid "Configuration Wizard"
msgstr "Assistant de Configuration"
@@ -1397,15 +1619,19 @@ msgstr "Assistant de Configuration"
msgid "Confirmation"
msgstr "Confirmation"
-#: src/slic3r/GUI/Tab.cpp:1931
-msgid "Connection failed."
-msgstr "La connexion a échoué."
+#: src/libslic3r/PrintConfig.cpp:1070
+msgid "Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. PrusaSlicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max. Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
+msgstr "Connecte une ligne de remplissage à un périmètre interne avec un segment court de périmètre additionnel. Si exprimé en pourcentage (exemple : 15%), est calculé sur la largeur d'extrusion de remplissage. PrusaSlicer essaie de connecter deux lignes de remplissage proches à un court segment de périmètre. Si aucun segment de périmètre plus court que infill_anchor_max ne peut être trouvé, la ligne de remplissage est connectée à un segment de périmètre seulement d'un côté et la longueur du segment de périmètre considéré est limitée à ce paramètre, mais pas plus longue que anchor_length_max. Réglez ce paramètre sur zéro pour désactiver l'ancrage de périmètres connectés à une seule ligne de remplissage."
-#: src/slic3r/GUI/Tab.cpp:3627
+#: src/libslic3r/PrintConfig.cpp:1097
+msgid "Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. PrusaSlicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter. Set this parameter to zero to disable anchoring."
+msgstr "Connecte une ligne de remplissage à un périmètre interne avec un segment court de périmètre additionnel. Si exprimé en pourcentage (exemple : 15%), est calculé sur la largeur d'extrusion de remplissage. PrusaSlicer essaie de connecter deux lignes de remplissage proches à un court segment de périmètre. Si aucun segment de périmètre plus court que ce paramètre ne peut être trouvé, la ligne de remplissage est connectée à un segment de périmètre seulement d'un côté et la longueur du segment de périmètre considéré est limitée à infill_anchor, mais pas plus longue que ce paramètre. Réglez ce paramètre sur zéro pour désactiver l'ancrage."
+
+#: src/slic3r/GUI/Tab.cpp:4046
msgid "Connection of the support sticks and junctions"
msgstr "Connexion des tiges de support et jonctions"
-#: src/slic3r/Utils/AstroBox.cpp:83
+#: src/slic3r/Utils/AstroBox.cpp:84
msgid "Connection to AstroBox works correctly."
msgstr "La connexion à AstroBox fonctionne correctement."
@@ -1421,124 +1647,148 @@ msgstr "La connexion à FlashAir fonctionne correctement et le téléchargement
msgid "Connection to OctoPrint works correctly."
msgstr "La connexion avec OctoPrint fonctionne correctement."
-#: src/slic3r/GUI/Tab.cpp:1928
-msgid "Connection to printer works correctly."
-msgstr "La connexion avec l'imprimante fonctionne correctement."
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:260
+msgid "Connection to printers connected via the print host failed."
+msgstr "La connexion aux imprimantes connectées via l'hôte d'impression a échoué."
-#: src/slic3r/Utils/OctoPrint.cpp:176
+#: src/slic3r/Utils/OctoPrint.cpp:185
msgid "Connection to Prusa SL1 works correctly."
msgstr "La connexion avec Prusa SL1 fonctionne correctement."
-#: src/libslic3r/PrintConfig.cpp:1909
+#: src/libslic3r/PrintConfig.cpp:2051
msgid "Contact Z distance"
msgstr "Distance de contact Z"
-#: src/slic3r/GUI/AboutDialog.cpp:261
+#: src/slic3r/GUI/AboutDialog.cpp:286
msgid "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and numerous others."
msgstr "Contributions par Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik et de nombreux autres personnes."
-#: src/libslic3r/PrintConfig.cpp:2659
+#: src/slic3r/GUI/GUI_App.cpp:245
+msgid "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others."
+msgstr "Contributions de Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas Meszaros, Lukas Matena, Vojtech Kral, David Kocik et bien d'autres."
+
+#: src/libslic3r/PrintConfig.cpp:2823
msgid "Controls the bridge type between two neighboring pillars. Can be zig-zag, cross (double zig-zag) or dynamic which will automatically switch between the first two depending on the distance of the two pillars."
msgstr "Contrôle le type de pont entre deux piliers voisins. Peut-être en zig-zag, en croisement (double zig-zag) ou dynamique auquel cas il alternera automatiquement entre les deux premiers en fonction de la distance entre les deux piliers."
-#: src/slic3r/GUI/Tab.cpp:1444
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1858 src/slic3r/GUI/Plater.cpp:4886
+msgid "Convert from imperial units"
+msgstr "Convertir à partir des unités impériales"
+
+#: src/slic3r/GUI/Tab.cpp:1790
msgid "Cooling"
msgstr "Refroidissement"
-#: src/libslic3r/PrintConfig.cpp:660
+#: src/libslic3r/PrintConfig.cpp:696
msgid "Cooling moves are gradually accelerating beginning at this speed."
msgstr "Les mouvements de refroidissement accélèrent progressivement à partir de cette vitesse."
-#: src/libslic3r/PrintConfig.cpp:679
+#: src/libslic3r/PrintConfig.cpp:715
msgid "Cooling moves are gradually accelerating towards this speed."
msgstr "Les mouvements de refroidissement accélèrent progressivement jusqu'à cette vitesse."
-#: src/slic3r/GUI/Tab.cpp:1465
+#: src/slic3r/GUI/Tab.cpp:1811
msgid "Cooling thresholds"
msgstr "Seuils de refroidissement"
-#: src/libslic3r/PrintConfig.cpp:327
+#: src/libslic3r/PrintConfig.cpp:361
msgid "Cooling tube length"
msgstr "Longueur du tube de refroidissement"
-#: src/libslic3r/PrintConfig.cpp:319
+#: src/libslic3r/PrintConfig.cpp:353
msgid "Cooling tube position"
msgstr "Position du tube de refroidissement"
-#: src/slic3r/GUI/Plater.cpp:4752
+#: src/slic3r/GUI/Plater.cpp:4856
msgid "Copies of the selected object"
msgstr "Copies de l'objet sélectionné"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4505
+#: src/slic3r/GUI/GLCanvas3D.cpp:4871
msgid "Copy"
msgstr "Copier"
-#: src/slic3r/GUI/MainFrame.cpp:589
+#: src/slic3r/GUI/MainFrame.cpp:1195
msgid "Copy selection to clipboard"
msgstr "Copier la sélection dans le presse-papier"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:132
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:127
msgid "Copy to clipboard"
msgstr "Copier dans le presse-papier"
-#: src/slic3r/GUI/SysInfoDialog.cpp:154
+#: src/slic3r/GUI/SysInfoDialog.cpp:177
msgid "Copy to Clipboard"
msgstr "Copier dans le Presse-Papier"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:121
+#: src/slic3r/GUI/AboutDialog.cpp:304
+msgid "Copy Version Info"
+msgstr "Copier les Infos de Version"
+
+#: src/slic3r/Utils/PresetUpdater.cpp:84
+msgid "Copying of file %1% to %2% failed.\nError message : %3%\nCopying was triggered by function: %4%"
+msgstr "La copie du fichier %1% vers %2% a échoué.\nMessage d'erreur : %3%\n La copie a été déclenchée par la fonction : %4%"
+
+#: src/slic3r/Utils/PresetUpdater.cpp:91
+msgid "Copying of file %1% to %2% failed. Permissions fail at target file after copying.\nError message : %3%\nCopying was triggered by function: %4%"
+msgstr "La copie du fichier %1% vers %2% a échoué. Échec d'autorisation sur le fichier cible après copie.\nMessage d'erreur : %3%\n Cette erreur s'est produite au cours de la phase de %4%. "
+
+#: src/slic3r/Utils/PresetUpdater.cpp:70
+msgid "Copying of file %1% to %2% failed. Permissions fail at target file before copying.\nError message : %3%\nThis error happend during %4% phase."
+msgstr "La copie du fichier %1% vers %2% a échoué. Échec d'autorisation sur le fichier cible avant copie.\nMessage d'erreur : %3%\nCette erreur s'est produite au cours de la phase de %4%. "
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:156
msgid "Copying of the temporary G-code has finished but the exported code couldn't be opened during copy check. The output G-code is at %1%.tmp."
msgstr "La copie du G-code temporaire est terminée mais le code exporté n'a pas pu être ouvert au cours de la vérification de copie. Le G-code de sortie se trouve en %1%.tmp."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:118
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:153
msgid "Copying of the temporary G-code has finished but the original code at %1% couldn't be opened during copy check. The output G-code is at %2%.tmp."
msgstr "La copie du G-code temporaire est terminée mais le code localisé en %1% n'a pas pu être ouvert au cours de la vérification de copie. Le G-code de sortie se trouve en %2%.tmp."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:480
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:522
msgid "Copying of the temporary G-code to the output G-code failed"
msgstr "La copie du G-code provisoire dans le G-code final a échoué"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:109
-msgid "Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?"
-msgstr "La copie du G-code provisoire dans le G-code final a échoué. Peut-être que la carte SD est protégée en écriture ?"
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:163
+msgid "Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?\nError message: %1%"
+msgstr "La copie du G-code temporaire vers le G-code de sortie a échoué. Peut-être que la carte SD est verrouillée en écriture ?\nMessage d'erreur : %1%"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:112
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:147
msgid "Copying of the temporary G-code to the output G-code failed. There might be problem with target device, please try exporting again or using different device. The corrupted output G-code is at %1%.tmp."
msgstr "La copie du G-code temporaire vers le G-code de sortie a échoué. Il est possible qu'il y ait un problème avec le matériel cible, veuillez tenter à nouveau l'export ou utilisez un matériel différent. Le G-code de sortie corrompu se trouve en %1%.tmp."
-#: src/slic3r/GUI/AboutDialog.cpp:127 src/slic3r/GUI/AboutDialog.cpp:256
+#: src/slic3r/GUI/AboutDialog.cpp:139 src/slic3r/GUI/AboutDialog.cpp:281
msgid "Copyright"
msgstr "Droits d'auteur"
-#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2572
+#: src/libslic3r/PrintConfig.cpp:2714 src/libslic3r/PrintConfig.cpp:2715
msgid "Correction for expansion"
msgstr "Correction avant expansion"
-#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:3519
+#: src/slic3r/GUI/Tab.cpp:2270 src/slic3r/GUI/Tab.cpp:3935
msgid "Corrections"
msgstr "Corrections"
-#: src/slic3r/GUI/Plater.cpp:1243 src/libslic3r/PrintConfig.cpp:760
-#: src/libslic3r/PrintConfig.cpp:2510 src/libslic3r/PrintConfig.cpp:2511
+#: src/slic3r/GUI/Plater.cpp:1158 src/libslic3r/PrintConfig.cpp:796
+#: src/libslic3r/PrintConfig.cpp:2653 src/libslic3r/PrintConfig.cpp:2654
msgid "Cost"
msgstr "Coût"
-#: src/slic3r/GUI/Plater.cpp:239
+#: src/slic3r/GUI/Plater.cpp:245
msgid "Cost (money)"
msgstr "Coût (argent)"
-#: src/slic3r/GUI/Plater.cpp:2835
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:176
msgid "Could not arrange model objects! Some geometries may be invalid."
msgstr "Impossible d'agencer les objets du modèle ! Certaines géométries sont peut-être non-valides."
-#: src/slic3r/Utils/AstroBox.cpp:89
+#: src/slic3r/Utils/AstroBox.cpp:90
msgid "Could not connect to AstroBox"
msgstr "Impossible de se connecter à AstroBox"
-#: src/slic3r/Utils/Duet.cpp:54
+#: src/slic3r/Utils/Duet.cpp:55
msgid "Could not connect to Duet"
msgstr "Impossible de se connecter à Duet"
-#: src/slic3r/Utils/FlashAir.cpp:73
+#: src/slic3r/Utils/FlashAir.cpp:74
msgid "Could not connect to FlashAir"
msgstr "Impossible de se connecter à FlashAir"
@@ -1546,56 +1796,73 @@ msgstr "Impossible de se connecter à FlashAir"
msgid "Could not connect to OctoPrint"
msgstr "Impossible de se connecter à OctoPrint"
-#: src/slic3r/Utils/OctoPrint.cpp:181
+#: src/slic3r/Utils/OctoPrint.cpp:191
msgid "Could not connect to Prusa SLA"
msgstr "Impossible de se connecter à Prusa SLA"
-#: src/slic3r/GUI/Tab.cpp:1687
+#: src/slic3r/Utils/Http.cpp:73
+msgid "Could not detect system SSL certificate store. PrusaSlicer will be unable to establish secure network connections."
+msgstr "Impossible de détecter le stockage de certificats SSL du système. PrusaSlicer ne pourra pas établir de connexions réseau sécurisées."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:289
msgid "Could not get a valid Printer Host reference"
msgstr "Impossible d'obtenir une référence d'Hôte d'Imprimante valide"
-#: src/slic3r/Utils/Duet.cpp:134
+#: src/slic3r/Utils/Duet.cpp:136
msgid "Could not get resources to create a new connection"
msgstr "Impossible d'obtenir les ressources pour créer une nouvelle connexion"
-#: src/libslic3r/PrintConfig.cpp:1959
+#: src/libslic3r/PrintConfig.cpp:2101
msgid "Cover the top contact layer of the supports with loops. Disabled by default."
msgstr "Recouvrir la couche de contact supérieure des supports avec des boucles. Désactivé par défaut."
-#: src/libslic3r/PrintConfig.cpp:89
+#: src/libslic3r/PrintConfig.cpp:91
msgid "Cracks smaller than 2x gap closing radius are being filled during the triangle mesh slicing. The gap closing operation may reduce the final print resolution, therefore it is advisable to keep the value reasonably low."
-msgstr "Les fentes d'une taille inférieure à 2x le rayon de fermeture de l'espacement sont remplies au cours du tranchage par maillage triangulaire. L'opération de fermeture de l'espacement peut réduire la résolution de l'impression finale, aussi est-il conseillé de conserver une valeur relativement basse."
+msgstr "Les fentes d'une taille inférieure à 2x le rayon de l'espacement sont remplies au cours du tranchage par maillage triangulaire. L'opération de fermeture de l'espacement peut réduire la résolution de l'impression finale, aussi est-il conseillé de conserver une valeur relativement basse."
-#: src/libslic3r/Zipper.cpp:58
+#: src/libslic3r/miniz_extension.cpp:117
msgid "CRC-32 check failed"
msgstr "Échec du test CRC-32"
-#: src/libslic3r/PrintConfig.cpp:2857
+#: src/libslic3r/PrintConfig.cpp:3021
msgid "Create pad around object and ignore the support elevation"
msgstr "Créer un socle autour de l'objet et ignorer l'élévation du support"
-#: src/libslic3r/PrintConfig.cpp:2724
+#: src/libslic3r/PrintConfig.cpp:2888
msgid "Critical angle"
msgstr "Angle critique"
-#: src/libslic3r/PrintConfig.cpp:2668
+#: src/slic3r/GUI/GUI_App.cpp:589
+msgid "Critical error"
+msgstr "Erreur critique"
+
+#: src/libslic3r/PrintConfig.cpp:2832
msgid "Cross"
msgstr "Croiser"
-#: src/libslic3r/PrintConfig.cpp:847
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:203
+msgid "Ctrl + Mouse wheel"
+msgstr "Ctrl + molette de la souris"
+
+#: src/libslic3r/PrintConfig.cpp:885
msgid "Cubic"
msgstr "Cubique"
-#: src/slic3r/GUI/wxExtensions.cpp:704
-#, c-format
+#: src/slic3r/Utils/Http.cpp:91
+msgid "CURL init has failed. PrusaSlicer will be unable to establish network connections. See logs for additional details."
+msgstr "L'initialisation de CURL a échoué. PrusaSlicer ne pourra pas établir de connexions réseau. Voir les journaux pour plus de détails."
+
+#: src/slic3r/GUI/wxExtensions.cpp:624
+#, possible-c-format
msgid "Current mode is %s"
msgstr "Le mode actuel est %s"
-#: src/slic3r/GUI/Tab.cpp:959
+#: src/slic3r/GUI/Tab.cpp:1278
msgid "Current preset is inherited from"
msgstr "Le préréglage actuel est hérité de"
-#: src/slic3r/GUI/Tab.cpp:957
+#: src/slic3r/GUI/Tab.cpp:1276
msgid "Current preset is inherited from the default preset."
msgstr "Le préréglage actuel est hérité du préréglage par défaut."
@@ -1603,486 +1870,521 @@ msgstr "Le préréglage actuel est hérité du préréglage par défaut."
msgid "Current version:"
msgstr "Version actuelle :"
-#: src/slic3r/GUI/BedShapeDialog.cpp:98 src/slic3r/GUI/GUI_Preview.cpp:249
-#: src/libslic3r/ExtrusionEntity.cpp:322
+#: src/slic3r/GUI/BedShapeDialog.cpp:143 src/slic3r/GUI/GUI_Preview.cpp:314
+#: src/libslic3r/ExtrusionEntity.cpp:327 src/libslic3r/ExtrusionEntity.cpp:362
msgid "Custom"
msgstr "Personnalisé"
-#: src/libslic3r/PrintConfig.cpp:112
+#: src/libslic3r/PrintConfig.cpp:114
msgid "Custom CA certificate file can be specified for HTTPS OctoPrint connections, in crt/pem format. If left blank, the default OS CA certificate repository is used."
msgstr "Un fichier de certificat CA personnalisé peut être spécifié pour les connexions HTTPS OctoPrint, au format crt / pem. Si ce champ est vide, le certificat par défaut OS CA certificate repository est utilisé."
-#: src/slic3r/GUI/Tab.cpp:1527 src/slic3r/GUI/Tab.cpp:1975
+#: src/slic3r/GUI/Tab.cpp:1872 src/slic3r/GUI/Tab.cpp:2160
+#: src/libslic3r/PrintConfig.cpp:1978
msgid "Custom G-code"
msgstr "G-code personnalisé"
-#: src/slic3r/GUI/DoubleSlider.cpp:1619
+#: src/slic3r/GUI/DoubleSlider.cpp:1815
msgid "Custom G-code on current layer (%1% mm)."
msgstr "G-code personnalisé sur la couche actuelle actuel (%1% mm)."
-#: src/slic3r/GUI/ConfigWizard.cpp:732
+#: src/slic3r/GUI/GCodeViewer.cpp:2580 src/slic3r/GUI/GUI_Preview.cpp:1477
+msgid "Custom G-codes"
+msgstr "G-codes personnalisés"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1091
msgid "Custom Printer"
msgstr "Imprimante Personnalisée"
-#: src/slic3r/GUI/ConfigWizard.cpp:732
+#: src/slic3r/GUI/ConfigWizard.cpp:1091
msgid "Custom Printer Setup"
msgstr "Configuration d'une Imprimante Personnalisée"
-#: src/slic3r/GUI/ConfigWizard.cpp:736
+#: src/slic3r/GUI/ConfigWizard.cpp:1095
msgid "Custom profile name:"
msgstr "Nom de profil personnalisé :"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:42
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3402
+#: src/slic3r/GUI/Plater.cpp:3397
+msgid "Custom supports and seams were removed after repairing the mesh."
+msgstr "Les supports personnalisés et les jointures ont été supprimés après la réparation du maillage."
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1135
+msgid "Custom template (\"%1%\")"
+msgstr "Modèle personnalisé (\"%1%\")"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:146 src/libslic3r/PrintConfig.cpp:3601
msgid "Cut"
msgstr "Couper"
-#: src/slic3r/GUI/Plater.cpp:4786
+#: src/slic3r/GUI/Plater.cpp:4921
msgid "Cut by Plane"
msgstr "Couper selon un Plan"
-#: src/libslic3r/PrintConfig.cpp:3403
+#: src/libslic3r/PrintConfig.cpp:3602
msgid "Cut model at the given Z."
msgstr "Couper le modèle au Z donné."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1432
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
msgid "Cylinder"
msgstr "Cylindre"
-#: src/slic3r/GUI/MainFrame.cpp:568
+#: src/slic3r/GUI/MainFrame.cpp:1174
msgid "D&eselect all"
msgstr "Tout désél&ectionner"
-#: src/libslic3r/PrintConfig.cpp:3504
+#: src/libslic3r/PrintConfig.cpp:3709
msgid "Data directory"
msgstr "Répertoire de données"
-#: src/slic3r/GUI/Mouse3DController.cpp:313
+#: src/slic3r/GUI/Mouse3DController.cpp:300
msgid "Deadzone:"
msgstr "Zone morte :"
-#: src/libslic3r/Zipper.cpp:52
+#: src/libslic3r/miniz_extension.cpp:111
msgid "decompression failed or archive is corrupted"
msgstr "la décompression a échoué ou l'archive est corrompue"
-#: src/slic3r/GUI/Plater.cpp:4720
+#: src/slic3r/GUI/Plater.cpp:4824
msgid "Decrease Instances"
msgstr "Diminuer les Instances"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1704 src/libslic3r/PrintConfig.cpp:335
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1832 src/libslic3r/PrintConfig.cpp:369
msgid "Default"
msgstr "Défaut"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:457 src/slic3r/GUI/GUI_ObjectList.cpp:469
-#: src/slic3r/GUI/GUI_ObjectList.cpp:917 src/slic3r/GUI/GUI_ObjectList.cpp:3967
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3977
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4012
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:200
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:257
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:282
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:490
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:1753
+#: src/slic3r/GUI/ExtraRenderers.cpp:297 src/slic3r/GUI/GUI_ObjectList.cpp:496
+#: src/slic3r/GUI/GUI_ObjectList.cpp:508 src/slic3r/GUI/GUI_ObjectList.cpp:1015
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4454
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4464
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4499
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:202
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:259
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:284
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:492
msgid "default"
msgstr "défaut"
-#: src/libslic3r/PrintConfig.cpp:777
+#: src/libslic3r/PrintConfig.cpp:813
msgid "Default base angle for infill orientation. Cross-hatching will be applied to this. Bridges will be infilled using the best direction Slic3r can detect, so this setting does not affect them."
-msgstr "Angle de base par défaut pour l'orientation du remplissage. Des croisements seront appliqués à cette valeur. Les ponts seront remplis avec la meilleure direction que Slic3r peut détecter, ce réglage ne les affecteront donc pas."
+msgstr "Angle de base par défaut pour l'orientation du remplissage. Des croisements seront appliqués à cette valeur. Les ponts seront remplis avec la meilleure direction que Slic3r peut détecter,ce réglage de les affectera donc pas."
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2289
+msgid "Default color"
+msgstr "Couleur par défaut"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2313
+msgid "default color"
+msgstr "couleur par défaut"
-#: src/libslic3r/PrintConfig.cpp:554
+#: src/libslic3r/PrintConfig.cpp:590
msgid "Default extrusion width"
msgstr "Largeur d'extrusion par défaut"
-#: src/slic3r/GUI/Tab.cpp:987
+#: src/slic3r/GUI/Tab.cpp:1305
msgid "default filament profile"
msgstr "profil du filament par défaut"
-#: src/libslic3r/PrintConfig.cpp:345
+#: src/libslic3r/PrintConfig.cpp:379
msgid "Default filament profile"
msgstr "Profil de filament par défaut"
-#: src/libslic3r/PrintConfig.cpp:346
+#: src/libslic3r/PrintConfig.cpp:380
msgid "Default filament profile associated with the current printer profile. On selection of the current printer profile, this filament profile will be activated."
msgstr "Profil de filament par défaut associé au profil d'imprimante courant. En sélectionnant le profil d'imprimante courant, ce profil de filament sera activé."
-#: src/slic3r/GUI/Tab.cpp:2919
-#, c-format
-msgid "Default preset (%s)"
-msgstr "Préréglage par défaut (%s)"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:904 src/slic3r/GUI/GLCanvas3D.cpp:933
-msgid "Default print color"
-msgstr "Couleur d'impression par défaut"
-
-#: src/slic3r/GUI/Tab.cpp:984
+#: src/slic3r/GUI/Tab.cpp:1302
msgid "default print profile"
msgstr "profil d'impression par défaut"
-#: src/libslic3r/PrintConfig.cpp:352
+#: src/libslic3r/PrintConfig.cpp:386
msgid "Default print profile"
msgstr "Profil de filament par défaut"
-#: src/libslic3r/PrintConfig.cpp:353 src/libslic3r/PrintConfig.cpp:2592
-#: src/libslic3r/PrintConfig.cpp:2603
+#: src/libslic3r/PrintConfig.cpp:387 src/libslic3r/PrintConfig.cpp:2735
+#: src/libslic3r/PrintConfig.cpp:2746
msgid "Default print profile associated with the current printer profile. On selection of the current printer profile, this print profile will be activated."
msgstr "Profil de filament par défaut associé au profil d'imprimante courant. En sélectionnant le profil d'imprimante courant, ce profil de filament sera activé."
-#: src/slic3r/GUI/Tab.cpp:1001
+#: src/slic3r/GUI/Tab.cpp:1319
msgid "default SLA material profile"
msgstr "profil par défaut du matériau SLA"
-#: src/libslic3r/PrintConfig.cpp:2591 src/libslic3r/PrintConfig.cpp:2602
+#: src/libslic3r/PrintConfig.cpp:2734 src/libslic3r/PrintConfig.cpp:2745
msgid "Default SLA material profile"
msgstr "Profil par défaut du matériau SLA"
-#: src/slic3r/GUI/Tab.cpp:1005
+#: src/slic3r/GUI/Tab.cpp:1323
msgid "default SLA print profile"
msgstr "profil d'impression SLA par défaut"
-#: src/slic3r/GUI/Field.cpp:136
+#: src/slic3r/GUI/Field.cpp:184
msgid "default value"
msgstr "valeur par défaut"
-#: src/slic3r/GUI/ConfigWizard.cpp:734
+#: src/slic3r/GUI/ConfigWizard.cpp:1093
msgid "Define a custom printer profile"
msgstr "Définissez un profil d'imprimante personnalisée"
-#: src/libslic3r/PrintConfig.cpp:2798
+#: src/libslic3r/PrintConfig.cpp:2962
msgid "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful when enabling this feature, as some resins may produce an extreme suction effect inside the cavity, which makes peeling the print off the vat foil difficult."
msgstr "Définit la profondeur de la cavité du socle. Réglez sur zéro pour désactiver la cavité. Faites bien attention lorsque vous activez cette fonctionnalité, car certaines résines génèrent un effet de succion extrême dans la cavité, et il est alors difficile de retirer l'impression de la feuille de la cuve."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:346
+#: src/slic3r/GUI/GUI_ObjectList.cpp:393
msgid "degenerate facets"
msgstr "faces défectueuses"
-#: src/libslic3r/PrintConfig.cpp:640
+#: src/libslic3r/PrintConfig.cpp:676
msgid "Delay after unloading"
msgstr "Délai après le déchargement"
-#: src/slic3r/GUI/Tab.cpp:3121
+#: src/slic3r/GUI/Tab.cpp:3386
msgid "delete"
msgstr "supprimer"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4475 src/slic3r/GUI/GUI_ObjectList.cpp:1718
-#: src/slic3r/GUI/Plater.cpp:3931 src/slic3r/GUI/Plater.cpp:3953
-#: src/slic3r/GUI/Tab.cpp:3124
+#: src/slic3r/GUI/GLCanvas3D.cpp:4841 src/slic3r/GUI/GUI_ObjectList.cpp:1846
+#: src/slic3r/GUI/Plater.cpp:3849 src/slic3r/GUI/Plater.cpp:3871
+#: src/slic3r/GUI/Tab.cpp:3423
msgid "Delete"
msgstr "Supprimer"
-#: src/slic3r/GUI/MainFrame.cpp:575
+#: src/slic3r/GUI/MainFrame.cpp:1181
msgid "Delete &all"
msgstr "Tout eff&acer"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4484 src/slic3r/GUI/KBShortcutsDialog.cpp:129
-#: src/slic3r/GUI/Plater.cpp:4669
+#: src/slic3r/GUI/GLCanvas3D.cpp:4850 src/slic3r/GUI/KBShortcutsDialog.cpp:124
+#: src/slic3r/GUI/Plater.cpp:4774
msgid "Delete all"
msgstr "Tout Supprimer"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2176
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2341
msgid "Delete All Instances from Object"
msgstr "Supprimer Toutes les Instances depuis l'Objet"
-#: src/slic3r/GUI/DoubleSlider.cpp:1516
+#: src/slic3r/GUI/DoubleSlider.cpp:1708
msgid "Delete color change"
msgstr "Supprimer le changement de couleur"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:220
msgid "Delete color change marker for current layer"
msgstr "Retirer le repère de changement de couleur pour la couche en cours"
-#: src/slic3r/GUI/DoubleSlider.cpp:1519
+#: src/slic3r/GUI/DoubleSlider.cpp:1711
msgid "Delete custom G-code"
msgstr "Supprimer le G-code personnalisé"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:539
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:424
msgid "Delete drainage hole"
msgstr "Supprimer le trou de drainage"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2192
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2357
msgid "Delete Height Range"
msgstr "Supprimer la Zone de Hauteur"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2246
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2412
msgid "Delete Instance"
msgstr "Supprimer l'Instance"
-#: src/slic3r/GUI/Plater.cpp:2712
+#: src/slic3r/GUI/Plater.cpp:2673
msgid "Delete Object"
msgstr "Supprimer l'Objet"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:101
-#, c-format
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:104
+#, possible-c-format
msgid "Delete Option %s"
msgstr "Supprimer l'Option %s"
-#: src/slic3r/GUI/DoubleSlider.cpp:1518
+#: src/slic3r/GUI/DoubleSlider.cpp:1710
msgid "Delete pause print"
msgstr "Supprimer la pause d'impression"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:128
+#: src/slic3r/GUI/PresetComboBoxes.cpp:652
+msgid "Delete physical printer"
+msgstr "Supprimer l'imprimante physique"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:659
+msgid "Delete Physical Printer"
+msgstr "Supprimer l'imprimante physique"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:123
msgid "Delete selected"
msgstr "Supprimer la sélection"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2830
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3221
msgid "Delete Selected"
msgstr "Supprimer la Sélection"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2693
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3083
msgid "Delete Selected Item"
msgstr "Supprimer l'Item Sélectionné"
-#: src/slic3r/GUI/Plater.cpp:4677
+#: src/slic3r/GUI/Plater.cpp:4782
msgid "Delete Selected Objects"
msgstr "Supprimer les Objets Sélectionnés"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2152
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2319
msgid "Delete Settings"
msgstr "Supprimer les Réglages"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2227
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2393
msgid "Delete Subobject"
msgstr "Supprimer le sous-objet"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:631
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:514
msgid "Delete support point"
msgstr "Supprimer un point de support"
-#: src/slic3r/GUI/Tab.cpp:134
+#: src/slic3r/GUI/Tab.cpp:204
msgid "Delete this preset"
msgstr "Supprimer ce préréglage"
-#: src/slic3r/GUI/DoubleSlider.cpp:1035
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:55
+msgid "Delete this preset from this printer device"
+msgstr "Supprimer ce préréglage de cette imprimante"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1160
msgid "Delete tick mark - Left click or press \"-\" key"
msgstr "Supprimer la coche - Faites un clic gauche ou appuyez sur la touche \"-\""
-#: src/slic3r/GUI/DoubleSlider.cpp:1517
+#: src/slic3r/GUI/DoubleSlider.cpp:1709
msgid "Delete tool change"
msgstr "Supprimer le changement d'outil"
-#: src/slic3r/GUI/MainFrame.cpp:576
+#: src/slic3r/GUI/MainFrame.cpp:1182
msgid "Deletes all objects"
msgstr "Supprimer tous les objets"
-#: src/slic3r/GUI/MainFrame.cpp:573
+#: src/slic3r/GUI/MainFrame.cpp:1179
msgid "Deletes the current selection"
msgstr "Supprime la sélection en cours"
-#: src/libslic3r/PrintConfig.cpp:717 src/libslic3r/PrintConfig.cpp:2503
-#: src/libslic3r/PrintConfig.cpp:2504
+#: src/libslic3r/PrintConfig.cpp:753 src/libslic3r/PrintConfig.cpp:2646
+#: src/libslic3r/PrintConfig.cpp:2647
msgid "Density"
msgstr "Densité"
-#: src/libslic3r/PrintConfig.cpp:791
+#: src/libslic3r/PrintConfig.cpp:827
msgid "Density of internal infill, expressed in the range 0% - 100%."
msgstr "Densité du remplissage interne, exprimée en pourcentage de 0% à 100%."
-#: src/slic3r/GUI/Tab.cpp:1258 src/slic3r/GUI/Tab.cpp:1548
-#: src/slic3r/GUI/Tab.cpp:2019 src/slic3r/GUI/Tab.cpp:2135
-#: src/slic3r/GUI/Tab.cpp:3543 src/slic3r/GUI/Tab.cpp:3671
+#: src/slic3r/GUI/Tab.cpp:1588 src/slic3r/GUI/Tab.cpp:1895
+#: src/slic3r/GUI/Tab.cpp:2228 src/slic3r/GUI/Tab.cpp:2304
+#: src/slic3r/GUI/Tab.cpp:3959 src/slic3r/GUI/Tab.cpp:4090
msgid "Dependencies"
msgstr "Dépendances"
-#: src/libslic3r/PrintConfig.cpp:1612 src/libslic3r/PrintConfig.cpp:1613
+#: src/libslic3r/PrintConfig.cpp:1720 src/libslic3r/PrintConfig.cpp:1721
msgid "Deretraction Speed"
msgstr "Vitesse de réinsertion"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:127
+#: src/slic3r/GUI/GCodeViewer.cpp:2529 src/slic3r/GUI/GUI_Preview.cpp:337
+#: src/slic3r/GUI/GUI_Preview.cpp:1473
+msgid "Deretractions"
+msgstr "Réinsertions"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:172
+msgid "Descriptive name for the printer"
+msgstr "Nom descriptif de l'imprimante"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:122
msgid "Deselect all"
msgstr "Désélectionner tout"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1369
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216
msgid "Deselect by rectangle"
msgstr "Désélectionner par rectangle"
-#: src/slic3r/GUI/MainFrame.cpp:569
+#: src/slic3r/GUI/MainFrame.cpp:1175
msgid "Deselects all objects"
msgstr "Désélectionner tous les objets"
-#: src/slic3r/GUI/Tab.cpp:963
+#: src/slic3r/GUI/Tab.cpp:1224
msgid "Detach from system preset"
msgstr "Détacher du préréglage système"
-#: src/slic3r/GUI/Tab.cpp:984
+#: src/slic3r/GUI/Tab.cpp:1246
msgid "Detach preset"
msgstr "Détacher le préréglage"
-#: src/slic3r/GUI/Tab.cpp:3029
+#: src/slic3r/GUI/Tab.cpp:3323
msgid "Detached"
msgstr "Détaché"
-#: src/libslic3r/PrintConfig.cpp:1373
+#: src/libslic3r/PrintConfig.cpp:1481
msgid "Detect bridging perimeters"
msgstr "Détecter les périmètres faisant des ponts"
-#: src/libslic3r/PrintConfig.cpp:2075
+#: src/libslic3r/PrintConfig.cpp:2218
msgid "Detect single-width walls (parts where two extrusions don't fit and we need to collapse them into a single trace)."
msgstr "Détecter les parois de largeur unique (où deux extrusions côte à côte ne rentrent pas et doivent êtres fusionnées en un seul trait)."
-#: src/libslic3r/PrintConfig.cpp:2073
+#: src/libslic3r/PrintConfig.cpp:2216
msgid "Detect thin walls"
msgstr "Détecter les parois fines"
-#: src/libslic3r/PrintConfig.cpp:3472
+#: src/libslic3r/PrintConfig.cpp:3671
msgid "Detect unconnected parts in the given model(s) and split them into separate objects."
-msgstr "Détecter les parties non-connectées sur un modèle donné (ou plusieurs) et les scinder en objets séparés."
+msgstr "Détecter les pièces non-connectées sur un modèle donné (ou plusieurs) et les scinder en objets séparés."
-#: src/slic3r/GUI/Plater.cpp:2368
+#: src/slic3r/GUI/Plater.cpp:2330
msgid "Detected advanced data"
msgstr "Données avancées détectées"
-#: src/slic3r/GUI/Mouse3DController.cpp:289
+#: src/slic3r/GUI/Mouse3DController.cpp:274
msgid "Device:"
msgstr "Appareil :"
-#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/libslic3r/PrintConfig.cpp:709
+#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:745
msgid "Diameter"
msgstr "Diamètre"
-#: src/libslic3r/PrintConfig.cpp:2694
+#: src/libslic3r/PrintConfig.cpp:2858
msgid "Diameter in mm of the pillar base"
msgstr "Diamètre en mm de la base du pilier"
-#: src/libslic3r/PrintConfig.cpp:2650
+#: src/libslic3r/PrintConfig.cpp:2793
msgid "Diameter in mm of the support pillars"
msgstr "Diamètre en mm des piliers de support"
-#: src/libslic3r/PrintConfig.cpp:2622
+#: src/libslic3r/PrintConfig.cpp:2765
msgid "Diameter of the pointing side of the head"
msgstr "Diamètre du côté de pointage de la tête"
-#: src/slic3r/GUI/BedShapeDialog.cpp:94
+#: src/slic3r/GUI/BedShapeDialog.cpp:131
msgid "Diameter of the print bed. It is assumed that origin (0,0) is located in the center."
msgstr "Diamètre du plateau d'impression. Il est supposé que l'origine (0,0) est située au centre."
-#: src/libslic3r/PrintConfig.cpp:1639
+#: src/libslic3r/PrintConfig.cpp:1747
msgid "Direction"
msgstr "Direction"
-#: src/libslic3r/PrintConfig.cpp:359
+#: src/libslic3r/PrintConfig.cpp:393
msgid "Disable fan for the first"
msgstr "Désactiver le ventilateur pour le(s) première(s)"
-#: src/libslic3r/PrintConfig.cpp:1349
+#: src/libslic3r/PrintConfig.cpp:1457
msgid "Disables retraction when the travel path does not exceed the upper layer's perimeters (and thus any ooze will be probably invisible)."
msgstr "Désactiver la rétraction lorsque le chemin de déplacement ne franchit pas les périmètres des couches supérieures (et donc les coulures seront probablement invisibles)."
-#: src/slic3r/GUI/DoubleSlider.cpp:952
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:641
+msgid "Discard"
+msgstr "Ignorer"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1066
msgid "Discard all custom changes"
msgstr "Éliminer toutes les modifications personnalisées"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1375
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222
msgid "Discard changes"
msgstr "Annuler les modifications"
-#: src/slic3r/GUI/GUI_App.cpp:932 src/slic3r/GUI/Tab.cpp:2946
-msgid "Discard changes and continue anyway?"
-msgstr "Annuler les changements et continuer malgré tout ?"
-
-#: src/slic3r/GUI/Tab.cpp:2078
+#: src/slic3r/GUI/Tab.cpp:2248
msgid "Display"
msgstr "Afficher"
-#: src/libslic3r/PrintConfig.cpp:2359
+#: src/libslic3r/PrintConfig.cpp:2502
msgid "Display height"
msgstr "Hauteur de l'affichage"
-#: src/libslic3r/PrintConfig.cpp:2378
+#: src/libslic3r/PrintConfig.cpp:2521
msgid "Display horizontal mirroring"
msgstr "Afficher la symétrie horizontale"
-#: src/libslic3r/PrintConfig.cpp:2392
+#: src/libslic3r/PrintConfig.cpp:2535
msgid "Display orientation"
msgstr "Orientation de l'affichage"
-#: src/slic3r/GUI/MainFrame.cpp:648
+#: src/slic3r/GUI/MainFrame.cpp:1258
msgid "Display the Print Host Upload Queue window"
msgstr "Afficher la fenêtre de la File d'Attente de Téléchargement de l'Hôte d'Impression"
-#: src/libslic3r/PrintConfig.cpp:2385
+#: src/libslic3r/PrintConfig.cpp:2528
msgid "Display vertical mirroring"
msgstr "Afficher la symétrie verticale"
-#: src/libslic3r/PrintConfig.cpp:2353
+#: src/libslic3r/PrintConfig.cpp:2496
msgid "Display width"
msgstr "Largeur de l'affichage"
-#: src/libslic3r/PrintConfig.cpp:377
+#: src/libslic3r/PrintConfig.cpp:411
msgid "Distance between copies"
msgstr "Distance entre les copies"
-#: src/libslic3r/PrintConfig.cpp:1680
+#: src/libslic3r/PrintConfig.cpp:1157
+msgid "Distance between ironing lines"
+msgstr "Distance entre les lignes de lissage"
+
+#: src/libslic3r/PrintConfig.cpp:1788
msgid "Distance between skirt and object(s). Set this to zero to attach the skirt to the object(s) and get a brim for better adhesion."
msgstr "Distance entre le ou les objet(s) et la jupe. Mettez zéro pour attacher la jupe a(ux) objet(s) et obtenir une bordure pour une meilleure adhésion."
-#: src/libslic3r/PrintConfig.cpp:2882
+#: src/libslic3r/PrintConfig.cpp:3046
msgid "Distance between two connector sticks which connect the object and the generated pad."
msgstr "La distance entre deux bâtonnets de connexion qui connectent l'objet et le socle généré."
-#: src/libslic3r/PrintConfig.cpp:1679
+#: src/libslic3r/PrintConfig.cpp:1787
msgid "Distance from object"
msgstr "Distance de l'objet"
-#: src/slic3r/GUI/BedShapeDialog.cpp:85
+#: src/slic3r/GUI/BedShapeDialog.cpp:121
msgid "Distance of the 0,0 G-code coordinate from the front left corner of the rectangle."
msgstr "Distance des coordonnées 0,0 du G-code depuis le coin avant gauche du rectangle."
-#: src/libslic3r/PrintConfig.cpp:320
+#: src/libslic3r/PrintConfig.cpp:354
msgid "Distance of the center-point of the cooling tube from the extruder tip."
msgstr "Distance entre le point central du tube de refroidissement et la pointe de l'extrudeur."
-#: src/libslic3r/PrintConfig.cpp:1382
+#: src/libslic3r/PrintConfig.cpp:1490
msgid "Distance of the extruder tip from the position where the filament is parked when unloaded. This should match the value in printer firmware."
msgstr "Distance entre la pointe de l'extrudeur et la position où le filament est positionné en attente lorsqu'il est déchargé. Cela doit correspondre à la valeur dans le firmware de l'imprimante."
-#: src/libslic3r/PrintConfig.cpp:378
+#: src/libslic3r/PrintConfig.cpp:412
msgid "Distance used for the auto-arrange feature of the plater."
msgstr "Distance utilisée par la fonction d'agencement automatique du plateau."
-#: src/libslic3r/PrintConfig.cpp:3486
+#: src/libslic3r/PrintConfig.cpp:3685
msgid "Do not fail if a file supplied to --load does not exist."
msgstr "Ne pas obtenir d'échec si un fichier fourni pour --télécharger n'existe pas."
-#: src/libslic3r/PrintConfig.cpp:3430
+#: src/libslic3r/PrintConfig.cpp:3629
msgid "Do not rearrange the given models before merging and keep their original XY coordinates."
msgstr "Ne pas ré-agencer les modèles donnés avant la fusion et conserver leurs coordonnées XY originales."
-#: src/slic3r/GUI/Field.cpp:240
-#, c-format
-msgid ""
-"Do you mean %s%% instead of %s %s?\n"
-"Select YES if you want to change this value to %s%%, \n"
-"or NO if you are sure that %s %s is a correct value."
-msgstr ""
-"Voulez vous dire %s%% au lieu de %s%s ?\n"
-"Sélectionnez OUI si vous voulez changer cette valeur pour %s%%,\n"
-"ou NON si vous êtes certain que %s%s est une valeur correcte."
+#: src/slic3r/GUI/Field.cpp:288
+#, possible-c-format
+msgid "Do you mean %s%% instead of %s %s?\nSelect YES if you want to change this value to %s%%, \nor NO if you are sure that %s %s is a correct value."
+msgstr "Voulez vous dire %s%% au lieu de %s%s ?\nSélectionnez OUI si vous voulez changer cette valeur pour %s%%,\nou NON si vous êtes certain que %s%s est une valeur correcte."
-#: src/slic3r/GUI/DoubleSlider.cpp:1920
+#: src/slic3r/GUI/DoubleSlider.cpp:2138
msgid "Do you want to delete all saved tool changes?"
msgstr "Voulez-vous supprimer tous les changements d'outils enregistrés ?"
-#: src/slic3r/GUI/GUI_App.cpp:884
+#: src/slic3r/GUI/GUI_App.cpp:1610
msgid "Do you want to proceed?"
msgstr "Voulez-vous poursuivre?"
-#: src/slic3r/GUI/Plater.cpp:3321
+#: src/slic3r/GUI/Plater.cpp:3124
msgid "Do you want to retry"
msgstr "Voulez-vous réessayer"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1045
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:911
msgid "Do you want to save your manually edited support points?"
msgstr "Voulez-vous sauvegarder vos points de support édités manuellement ?"
-#: src/slic3r/GUI/ConfigWizard.cpp:1834
+#: src/slic3r/GUI/ConfigWizard.cpp:2261
msgid "Do you want to select default filaments for these FFF printer models?"
msgstr "Voulez-vous sélectionner les filaments par défaut pour ces modèles d'imprimantes FFF ?"
-#: src/slic3r/GUI/ConfigWizard.cpp:1852
+#: src/slic3r/GUI/ConfigWizard.cpp:2279
msgid "Do you want to select default SLA materials for these printer models?"
msgstr "Voulez-vous sélectionner les matériaux SLA par défaut pour ces modèles d'imprimantes ?"
-#: src/libslic3r/PrintConfig.cpp:3429
+#: src/slic3r/GUI/Plater.cpp:4751
+msgid "does not contain valid gcode."
+msgstr "ne contient pas de gcode valide."
+
+#: src/libslic3r/PrintConfig.cpp:3628
msgid "Don't arrange"
msgstr "Ne pas agencer"
@@ -2090,7 +2392,11 @@ msgstr "Ne pas agencer"
msgid "Don't notify about new releases any more"
msgstr "Ne plus me notifier au sujet des nouvelles publications"
-#: src/libslic3r/PrintConfig.cpp:369
+#: src/slic3r/GUI/Plater.cpp:1431
+msgid "Don't show again"
+msgstr "Ne plus afficher"
+
+#: src/libslic3r/PrintConfig.cpp:403
msgid "Don't support bridges"
msgstr "Ne pas supporter les ponts"
@@ -2098,262 +2404,348 @@ msgstr "Ne pas supporter les ponts"
msgid "Downgrade"
msgstr "Rétrograder"
-#: src/libslic3r/PrintConfig.cpp:1695
+#: src/libslic3r/PrintConfig.cpp:1803
msgid "Draft shield"
msgstr "Bouclier contre les flux d'air"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1368
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1369
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216
msgid "Drag"
msgstr "Faites glisser"
-#: src/libslic3r/SLAPrintSteps.cpp:44
+#: src/slic3r/GUI/Plater.cpp:1406
+msgid "Drag and drop G-code file"
+msgstr "Glisser et déposer un fichier G-code"
+
+#: src/libslic3r/SLAPrintSteps.cpp:45
msgid "Drilling holes into model."
msgstr "Perçage de trous dans le modèle."
-#: src/libslic3r/SLAPrintSteps.cpp:199
+#: src/libslic3r/SLAPrintSteps.cpp:201
msgid "Drilling holes into the mesh failed. This is usually caused by broken model. Try to fix it first."
msgstr "Le perçage des trous dans le maillage a échoué. Cela est généralement dû à un modèle cassé. Essayez de le réparer en premier."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:337
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:349
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:345
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:357
msgid "Drop to bed"
msgstr "Déposer sur le lit"
-#: src/libslic3r/PrintConfig.cpp:3433
+#: src/libslic3r/PrintConfig.cpp:3632
msgid "Duplicate"
msgstr "Dupliquer"
-#: src/libslic3r/PrintConfig.cpp:3438
+#: src/libslic3r/PrintConfig.cpp:3637
msgid "Duplicate by grid"
msgstr "Dupliquer par grille"
-#: src/slic3r/GUI/PresetHints.cpp:40
-msgid "During the other layers, fan"
-msgstr "Pendant les autres couches, le ventilateur"
+#: src/slic3r/GUI/GCodeViewer.cpp:2445
+msgid "Duration"
+msgstr "Durée"
+
+#: src/slic3r/GUI/PresetHints.cpp:51
+msgid "During the other layers, fan will always run at %1%%%"
+msgstr "Pour toutes les autres couches, le ventilateur fonctionnera toujours à %1%%%"
+
+#: src/slic3r/GUI/PresetHints.cpp:58
+msgid "During the other layers, fan will be turned off."
+msgstr "Pour les autres couches, le ventilateur sera désactivé."
-#: src/libslic3r/PrintConfig.cpp:2669
+#: src/libslic3r/PrintConfig.cpp:2833
msgid "Dynamic"
msgstr "Dynamique"
-#: src/slic3r/GUI/MainFrame.cpp:749
+#: src/slic3r/GUI/MainFrame.cpp:1448
msgid "E&xport"
msgstr "E&xporter"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:347
+#: src/slic3r/GUI/GUI_ObjectList.cpp:394
msgid "edges fixed"
msgstr "arrêtes corrigées"
-#: src/slic3r/GUI/DoubleSlider.cpp:1508
+#: src/slic3r/GUI/DoubleSlider.cpp:1700
msgid "Edit color"
msgstr "Éditer la couleur"
-#: src/slic3r/GUI/DoubleSlider.cpp:960
+#: src/slic3r/GUI/DoubleSlider.cpp:1083
msgid "Edit current color - Right click the colored slider segment"
-msgstr "Modifier la couleur actuelle - Cliquez avec le bouton droit sur le segment de curseur de couleur"
+msgstr "Modifier la couleur actuelle - Cliquez avec le bouton droit sur le segment coloré de la barre de défilement"
-#: src/slic3r/GUI/DoubleSlider.cpp:1510
+#: src/slic3r/GUI/DoubleSlider.cpp:1702
msgid "Edit custom G-code"
msgstr "Éditer un G-code personnalisé"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3003
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3459
msgid "Edit Height Range"
msgstr "Éditer la Zone de Hauteur"
-#: src/slic3r/GUI/DoubleSlider.cpp:1509
+#: src/slic3r/GUI/DoubleSlider.cpp:1701
msgid "Edit pause print message"
msgstr "Modifier le message de pause d'impression"
-#: src/slic3r/GUI/DoubleSlider.cpp:1037
+#: src/slic3r/GUI/PresetComboBoxes.cpp:645
+msgid "Edit physical printer"
+msgstr "Modifier l'imprimante physique"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:641
+msgid "Edit preset"
+msgstr "Modifier le préréglage"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1162
msgid "Edit tick mark - Ctrl + Left click"
msgstr "Modifier la coche - Ctrl + Clic gauche"
-#: src/slic3r/GUI/DoubleSlider.cpp:1038
+#: src/slic3r/GUI/DoubleSlider.cpp:1163
msgid "Edit tick mark - Right click"
msgstr "Modifier la coche - Clic droit"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:282 src/slic3r/GUI/GUI_ObjectList.cpp:394
+#: src/slic3r/GUI/GUI_ObjectList.cpp:300 src/slic3r/GUI/GUI_ObjectList.cpp:441
msgid "Editing"
msgstr "Édition"
-#: src/slic3r/GUI/MainFrame.cpp:547
+#: src/slic3r/GUI/MainFrame.cpp:1105
msgid "Ejec&t SD card / Flash drive"
msgstr "Éjec&ter la carte SD / la clef USB"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:126
+#: src/slic3r/GUI/NotificationManager.cpp:780
+msgid "Eject drive"
+msgstr "Éjecter le lecteur"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:119
msgid "Eject SD card / Flash drive"
msgstr "Éjecter la carte SD / la clef USB"
-#: src/slic3r/GUI/MainFrame.cpp:547
+#: src/slic3r/GUI/MainFrame.cpp:1105
msgid "Eject SD card / Flash drive after the G-code was exported to it."
msgstr "Éjecter la carte SD / la clef USB une fois que la G-code y a été exporté."
-#: src/slic3r/GUI/Plater.cpp:2202
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:2034
+#, possible-c-format
msgid "Ejecting of device %s(%s) has failed."
msgstr "L'éjection de l'appareil %s(%s) a échoué."
-#: src/libslic3r/PrintConfig.cpp:118
+#: src/libslic3r/PrintConfig.cpp:120
msgid "Elephant foot compensation"
msgstr "Compensation de l'effet patte d'éléphant"
-#: src/libslic3r/PrintConfig.cpp:2447
+#: src/libslic3r/PrintConfig.cpp:2590
msgid "Elephant foot minimum width"
msgstr "Largeur minimum du pied d'éléphant"
-#: src/libslic3r/SLAPrint.cpp:625
+#: src/libslic3r/SLAPrint.cpp:639
msgid "Elevation is too low for object. Use the \"Pad around object\" feature to print the object without elevation."
msgstr "L'Élévation est trop basse pour cet objet. utilisez la fonction \"Socle autour de l'objet\" pour imprimer l'objet sans élévation."
-#: src/libslic3r/PrintConfig.cpp:1093
+#: src/libslic3r/PrintConfig.cpp:1186
msgid "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute intervals into the G-code to let the firmware show accurate remaining time. As of now only the Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 firmware supports M73 Qxx Sxx for the silent mode."
msgstr "Émet M73 P[pourcentage imprimé] R[temps restant en minutes] à 1 minute d'intervalle dans le G-code afin que le firmware puisse indiquer précisément le temps restant. Jusqu'à présent seul le firmware Prusa i3 MK3 reconnait M73. Par ailleurs le firmware i3 MK3 supporte M73 Qxx Sxx pour le mode silencieux."
-#: src/libslic3r/GCode.cpp:637
+#: src/libslic3r/PrintConfig.cpp:1217
+msgid "Emit to G-code"
+msgstr "Émettre en G-code"
+
+#: src/libslic3r/GCode.cpp:622
msgid "Empty layers detected, the output would not be printable."
msgstr "Couches vides détectées, la sortie ne serait pas imprimable."
-#: src/slic3r/GUI/Tab.cpp:1445 src/libslic3r/PrintConfig.cpp:1355
-#: src/libslic3r/PrintConfig.cpp:2200
+#: src/slic3r/GUI/Tab.cpp:1791 src/libslic3r/PrintConfig.cpp:1463
+#: src/libslic3r/PrintConfig.cpp:2343
msgid "Enable"
msgstr "Activer"
-#: src/libslic3r/PrintConfig.cpp:313
+#: src/libslic3r/PrintConfig.cpp:347
msgid "Enable auto cooling"
msgstr "Activer le refroidissement automatique"
-#: src/libslic3r/PrintConfig.cpp:572
+#: src/libslic3r/PrintConfig.cpp:608
msgid "Enable fan if layer print time is below"
msgstr "Activer le ventilateur si le temps d'impression de la couche est inférieur à"
-#: src/libslic3r/PrintConfig.cpp:2908
+#: src/libslic3r/PrintConfig.cpp:3072
msgid "Enable hollowing"
msgstr "Activer l'évidement"
-#: src/libslic3r/PrintConfig.cpp:2380
+#: src/libslic3r/PrintConfig.cpp:2523
msgid "Enable horizontal mirroring of output images"
msgstr "Active la symétrie horizontale des images de sortie"
-#: src/libslic3r/PrintConfig.cpp:1867
+#: src/libslic3r/PrintConfig.cpp:1124
+msgid "Enable ironing"
+msgstr "Activer le lissage"
+
+#: src/libslic3r/PrintConfig.cpp:1125
+msgid "Enable ironing of the top layers with the hot print head for smooth surface"
+msgstr "Activer le lissage des couches supérieures avec la tête d'impression chaude pour une surface lisse"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3901
+msgid "Enable rotations (slow)"
+msgstr "Activer les rotations (lentes)"
+
+#: src/slic3r/GUI/Preferences.cpp:207
+msgid "Enable support for legacy 3DConnexion devices"
+msgstr "Active la prise en charge des dispositifs 3DConnexion"
+
+#: src/libslic3r/PrintConfig.cpp:2009
msgid "Enable support material generation."
msgstr "Activer la génération des supports."
-#: src/libslic3r/PrintConfig.cpp:966
+#: src/libslic3r/PrintConfig.cpp:1010
msgid "Enable this to add comments into the G-Code labeling print moves with what object they belong to, which is useful for the Octoprint CancelObject plugin. This settings is NOT compatible with Single Extruder Multi Material setup and Wipe into Object / Wipe into Infill."
msgstr "Activez cette option pour ajouter des commentaires dans le G-code afin d'identifier les mouvements d'impression avec l'objet concerné. Cela est utile pour le plugin Octoprint CancelObject. Ce paramètre n'est PAS compatible avec la configuration mono-extrudeur multi-matériaux ni avec la configuration Nettoyer dans l'objet ou Nettoyer dans le remplissage."
-#: src/libslic3r/PrintConfig.cpp:929
+#: src/libslic3r/PrintConfig.cpp:973
msgid "Enable this to get a commented G-code file, with each line explained by a descriptive text. If you print from SD card, the additional weight of the file could make your firmware slow down."
msgstr "Activez ceci pour obtenir un fichier G-code commenté, avec chaque ligne expliquée par un texte descriptif. Si vous imprimez depuis une carte SD, le poids supplémentaire du fichier pourrait ralentir le firmware de votre imprimante."
-#: src/libslic3r/PrintConfig.cpp:2186
+#: src/libslic3r/PrintConfig.cpp:2329
msgid "Enable variable layer height feature"
msgstr "Activer la fonction de hauteur de couche variable"
-#: src/libslic3r/PrintConfig.cpp:2387
+#: src/libslic3r/PrintConfig.cpp:2530
msgid "Enable vertical mirroring of output images"
msgstr "Activer la symétrie verticale des images de sortie"
-#: src/slic3r/GUI/Tab.cpp:1534 src/slic3r/GUI/Tab.cpp:1982
-#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:395
+#: src/slic3r/GUI/Tab.cpp:1880 src/slic3r/GUI/Tab.cpp:2168
+#: src/libslic3r/PrintConfig.cpp:419 src/libslic3r/PrintConfig.cpp:429
msgid "End G-code"
msgstr "G-code de fin"
-#: src/libslic3r/PrintConfig.cpp:1924
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:239
+msgid "Enforce"
+msgstr "Forcer"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:30
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:381
+msgid "Enforce seam"
+msgstr "Forcer la jointure"
+
+#: src/libslic3r/PrintConfig.cpp:2066
msgid "Enforce support for the first"
msgstr "Générer des supports sur le(s) première(s)"
-#: src/libslic3r/PrintConfig.cpp:1931
+#: src/libslic3r/PrintConfig.cpp:2073
msgid "Enforce support for the first n layers"
msgstr "Générer des supports sur les n premières couches"
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47
+msgid "Enforce supports"
+msgstr "Forcer les supports"
+
#: src/slic3r/GUI/PrintHostDialogs.cpp:198
#: src/slic3r/GUI/PrintHostDialogs.cpp:229
msgid "Enqueued"
msgstr "Placé dans la file d'attente"
-#: src/libslic3r/PrintConfig.cpp:407
+#: src/libslic3r/PrintConfig.cpp:441
msgid "Ensure vertical shell thickness"
msgstr "S'assurer de l'épaisseur de la coque verticale"
-#: src/slic3r/GUI/DoubleSlider.cpp:1618
+#: src/slic3r/GUI/GLCanvas3D.cpp:4402 src/slic3r/GUI/GLCanvas3D.cpp:4410
+#: src/slic3r/GUI/Search.cpp:433
+msgid "Enter a search term"
+msgstr "Entrer un terme de recherche"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1814
msgid "Enter custom G-code used on current layer"
msgstr "Entrez le G-code personnalisé utilisé sur la couche actuelle"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3803
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4266
msgid "Enter new name"
msgstr "Entrer de nouveaux noms"
-#: src/slic3r/GUI/DoubleSlider.cpp:1634
+#: src/slic3r/GUI/DoubleSlider.cpp:1830
msgid "Enter short message shown on Printer display when a print is paused"
msgstr "Entrez un court message affiché sur l'écran de l'imprimante lorsqu'une impression est mise en pause"
-#: src/slic3r/GUI/ConfigWizard.cpp:1047
+#: src/slic3r/GUI/ConfigWizard.cpp:1413
msgid "Enter the bed temperature needed for getting your filament to stick to your heated bed."
msgstr "Entrez la température du lit nécessaire pour que votre filament colle à votre lit chauffant."
-#: src/slic3r/GUI/ConfigWizard.cpp:979
+#: src/slic3r/GUI/ConfigWizard.cpp:1345
msgid "Enter the diameter of your filament."
msgstr "Entrez le diamètre de votre filament."
-#: src/slic3r/GUI/ConfigWizard.cpp:966
+#: src/slic3r/GUI/ConfigWizard.cpp:1332
msgid "Enter the diameter of your printer's hot end nozzle."
msgstr "Entrez le diamètre de la buse de la tête d'impression de votre imprimante."
-#: src/slic3r/GUI/DoubleSlider.cpp:1650
+#: src/slic3r/GUI/DoubleSlider.cpp:1851 src/slic3r/GUI/DoubleSlider.cpp:1855
msgid "Enter the height you want to jump to"
msgstr "Entrez la hauteur à laquelle vous souhaitez sauter"
-#: src/slic3r/GUI/Plater.cpp:4751
+#: src/slic3r/GUI/DoubleSlider.cpp:1851
+msgid "Enter the move you want to jump to"
+msgstr "Entrez le mouvement auquel vous souhaitez accéder"
+
+#: src/slic3r/GUI/Plater.cpp:4855
msgid "Enter the number of copies:"
msgstr "Saisissez le nombre de copies :"
-#: src/slic3r/GUI/ConfigWizard.cpp:1033
+#: src/slic3r/GUI/ConfigWizard.cpp:1399
msgid "Enter the temperature needed for extruding your filament."
msgstr "Entrez la température nécessaire pour extruder votre filament."
-#: src/libslic3r/PrintConfig.cpp:761
+#: src/libslic3r/PrintConfig.cpp:813
+msgid "Enter weight of the empty filament spool. One may weigh a partially consumed filament spool before printing and one may compare the measured weight with the calculated weight of the filament with the spool to find out whether the amount of filament on the spool is sufficient to finish the print."
+msgstr "Entrez le poids d'une bobine de filament vide. De cette manière pouvez peser une bobine de filament partiellement utilisée avant l'impression et ainsi comparer le poids que vous avez mesuré avec le poids du filament calculé avec la bobine pour savoir si la quantité de filament est suffisante pour terminer l'impression."
+
+#: src/libslic3r/PrintConfig.cpp:797
msgid "Enter your filament cost per kg here. This is only for statistical information."
msgstr "Entrez le coût par Kg de votre filament. Ceci est uniquement pour l'information statistique."
-#: src/libslic3r/PrintConfig.cpp:718
+#: src/libslic3r/PrintConfig.cpp:754
msgid "Enter your filament density here. This is only for statistical information. A decent way is to weigh a known length of filament and compute the ratio of the length to volume. Better is to calculate the volume directly through displacement."
msgstr "Entrez ici la densité de votre filament. Ceci est uniquement pour des informations statistiques. Un bon moyen d'obtenir cette valeur est de peser un morceau de filament d'une longueur connue et de calculer le rapport de sa longueur par son poids. Le mieux est de calculer le volume directement par déplacement."
-#: src/libslic3r/PrintConfig.cpp:710
+#: src/libslic3r/PrintConfig.cpp:746
msgid "Enter your filament diameter here. Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average."
msgstr "Entrez le diamètre de votre filament ici. Une bonne précision est requise, utilisez un pied à coulisse et calculez la moyenne de plusieurs mesures le long du filament."
-#: src/slic3r/GUI/MainFrame.cpp:422 src/slic3r/GUI/MainFrame.cpp:785
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:39
+msgid "Entering Paint-on supports"
+msgstr "Accès aux Supports peints"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:40
+msgid "Entering Seam painting"
+msgstr "Accès à la peinture de jointure"
+
+#: src/slic3r/GUI/MainFrame.cpp:1003 src/slic3r/GUI/MainFrame.cpp:1486
#: src/slic3r/GUI/PrintHostDialogs.cpp:231
msgid "Error"
msgstr "Erreur"
#: src/slic3r/GUI/FirmwareDialog.cpp:645
-#, c-format
+#, possible-c-format
msgid "Error accessing port at %s: %s"
msgstr "Erreur d'accès au port sur %s : %s"
-#: src/slic3r/GUI/Plater.cpp:3433
+#: src/slic3r/GUI/Plater.cpp:3238
msgid "Error during reload"
msgstr "Erreur lors du rechargement"
-#: src/slic3r/GUI/Plater.cpp:5043
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:5172
+#, possible-c-format
msgid "Error exporting 3MF file %s"
msgstr "Erreur d'export du fichier 3MF %s"
-#: src/slic3r/GUI/Plater.cpp:5005
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:5138
+#, possible-c-format
msgid "Error exporting AMF file %s"
msgstr "Erreur d'export du fichier AMF %s"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:154
+#: src/slic3r/GUI/OpenGLManager.cpp:276
+msgid "Error loading shaders"
+msgstr "Erreur lors du chargement des shaders"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:152
msgid "Error Message"
msgstr "Message d'erreur"
-#: src/slic3r/GUI/AppConfig.cpp:114
+#: src/slic3r/GUI/GUI_App.cpp:661
+msgid "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to manually delete the file to recover from the error."
+msgstr "Erreur lors de l'analyse du fichier de configuration de PrusaGCodeViewer, il est probablement corrompu. Essayez de supprimer manuellement le fichier pour corriger l'erreur."
+
+#: src/slic3r/GUI/GUI_App.cpp:655 src/slic3r/GUI/GUI_App.cpp:670
msgid "Error parsing PrusaSlicer config file, it is probably corrupted. Try to manually delete the file to recover from the error. Your user profiles will not be affected."
msgstr "Erreur d'analyse du fichier config PrusaSlicer, il est probablement corrompu. Essayez de supprimer manuellement le fichier pour récupérer après cette erreur. Vos profils d'utilisateurs ne seront pas affectés."
@@ -2361,163 +2753,195 @@ msgstr "Erreur d'analyse du fichier config PrusaSlicer, il est probablement corr
msgid "Error uploading to print host:"
msgstr "Erreur lors du téléchargement vers l'hôte d'impression :"
-#: src/libslic3r/Zipper.cpp:102
+#: src/slic3r/GUI/Plater.cpp:4752
+msgid "Error while loading .gcode file"
+msgstr "Erreur lors du chargement du fichier .gcode"
+
+#: src/libslic3r/Zipper.cpp:27
msgid "Error with zip archive"
msgstr "Erreur liée à l'archive zip"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1918
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2077
msgid "Error!"
msgstr "Erreur!"
-#: src/slic3r/GUI/BedShapeDialog.cpp:505
+#: src/slic3r/GUI/BedShapeDialog.cpp:581
msgid "Error! Invalid model"
msgstr "Erreur ! Modèle invalide"
+#: src/slic3r/GUI/NotificationManager.cpp:667
+#: src/slic3r/GUI/NotificationManager.cpp:683
+#: src/slic3r/GUI/NotificationManager.cpp:694
+msgid "ERROR:"
+msgstr "ERREUR :"
+
#: src/slic3r/GUI/FirmwareDialog.cpp:647
-#, c-format
+#, possible-c-format
msgid "Error: %s"
msgstr "Erreur : %s"
-#: src/slic3r/GUI/Job.hpp:123
+#: src/slic3r/GUI/Jobs/Job.cpp:74
msgid "ERROR: not enough resources to execute a new job."
msgstr "ERREUR : il n'y a pas assez de ressources pour exécuter une nouvelle tâche."
-#: src/slic3r/GUI/Plater.cpp:240 src/slic3r/GUI/Plater.cpp:1216
-#: src/slic3r/GUI/Plater.cpp:1258
+#: src/slic3r/GUI/Plater.cpp:3374
+msgid "ERROR: Please close all manipulators available from the left toolbar before fixing the mesh."
+msgstr "ERREUR : Veuillez fermer tous les manipulateurs disponibles dans la barre d'outils de gauche avant de réparer le maillage."
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2552 src/slic3r/GUI/GCodeViewer.cpp:2557
+#: src/slic3r/GUI/Plater.cpp:246 src/slic3r/GUI/Plater.cpp:1125
+#: src/slic3r/GUI/Plater.cpp:1175 src/slic3r/GUI/Plater.cpp:1196
msgid "Estimated printing time"
msgstr "Temps d'impression estimé"
-#: src/slic3r/GUI/Plater.cpp:502
+#: src/slic3r/GUI/GCodeViewer.cpp:2442 src/slic3r/GUI/GCodeViewer.cpp:2445
+msgid "Event"
+msgstr "Événement"
+
+#: src/slic3r/GUI/Plater.cpp:368
msgid "Everywhere"
msgstr "Partout"
-#: src/slic3r/GUI/PresetHints.cpp:51
+#: src/slic3r/GUI/PresetHints.cpp:50
msgid "except for the first %1% layers."
msgstr "sauf pour les %1% première couches."
-#: src/slic3r/GUI/PresetHints.cpp:53
+#: src/slic3r/GUI/PresetHints.cpp:52
msgid "except for the first layer."
msgstr "sauf pour la première couche."
-#: src/libslic3r/Print.cpp:1377
+#: src/libslic3r/Print.cpp:1403
msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm"
msgstr "Dépasse de %1%=%2% mm pour être imprimable avec une buse de diamètre %3% mm"
#: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246
-#, c-format
+#, possible-c-format
msgid "Exit %s"
msgstr "Sortir de %s"
-#: src/libslic3r/PrintConfig.cpp:371
+#: src/slic3r/GUI/Plater.cpp:2143
+msgid "Expand sidebar"
+msgstr "Développer la barre latérale"
+
+#: src/libslic3r/PrintConfig.cpp:405
msgid "Experimental option for preventing support material from being generated under bridged areas."
msgstr "Option expérimentale pour empêcher la génération de support sous les ponts."
-#: src/libslic3r/PrintConfig.cpp:1375
+#: src/libslic3r/PrintConfig.cpp:1483
msgid "Experimental option to adjust flow for overhangs (bridge flow will be used), to apply bridge speed to them and enable fan."
msgstr "Option expérimentale qui ajuste le flux pour les surplombs (le flux pour les ponts sera utilisé), leur applique la vitesse pour les ponts et active le ventilateur."
-#: src/slic3r/GUI/GUI_App.cpp:815 src/slic3r/GUI/wxExtensions.cpp:755
+#: src/slic3r/GUI/GUI_App.cpp:1507 src/slic3r/GUI/wxExtensions.cpp:676
msgid "Expert"
msgstr "Expert"
-#: src/slic3r/GUI/ConfigWizard.cpp:822
+#: src/slic3r/GUI/ConfigWizard.cpp:1181
msgid "Expert mode"
msgstr "Mode expert"
-#: src/slic3r/GUI/GUI_App.cpp:815
+#: src/slic3r/GUI/GUI_App.cpp:1507
msgid "Expert View Mode"
msgstr "Mode de Vue Expert"
-#: src/slic3r/GUI/Plater.cpp:5521
+#: src/slic3r/GUI/Plater.cpp:5706
msgid "Export"
msgstr "Exporter"
-#: src/slic3r/GUI/MainFrame.cpp:500
+#: src/slic3r/GUI/MainFrame.cpp:1094
msgid "Export &Config"
msgstr "Exporter la &Configuration"
-#: src/slic3r/GUI/MainFrame.cpp:477 src/slic3r/GUI/MainFrame.cpp:749
+#: src/slic3r/GUI/MainFrame.cpp:1068 src/slic3r/GUI/MainFrame.cpp:1448
msgid "Export &G-code"
msgstr "Exporter le &G-code"
-#: src/slic3r/GUI/MainFrame.cpp:496
+#: src/slic3r/GUI/MainFrame.cpp:1090 src/slic3r/GUI/MainFrame.cpp:1395
msgid "Export &toolpaths as OBJ"
msgstr "Exporter les parcours en &tant que OBJ"
-#: src/libslic3r/PrintConfig.cpp:3338
+#: src/libslic3r/PrintConfig.cpp:3531
msgid "Export 3MF"
msgstr "Exporter 3MF"
-#: src/slic3r/GUI/MainFrame.cpp:503
+#: src/slic3r/GUI/MainFrame.cpp:1100
+msgid "Export all presets including physical printers to file"
+msgstr "Exporter tous les préréglage y compris les imprimantes physiques vers un fichier"
+
+#: src/slic3r/GUI/MainFrame.cpp:1097
msgid "Export all presets to file"
msgstr "Exporter tous les préréglage vers un fichier"
-#: src/libslic3r/PrintConfig.cpp:3343
+#: src/libslic3r/PrintConfig.cpp:3536
msgid "Export AMF"
msgstr "Exporter AMF"
-#: src/slic3r/GUI/Plater.cpp:2598
+#: src/slic3r/GUI/Plater.cpp:2560
msgid "Export AMF file:"
msgstr "Exporter le fichier AMF :"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1657 src/slic3r/GUI/Plater.cpp:3966
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1786 src/slic3r/GUI/Plater.cpp:3884
msgid "Export as STL"
msgstr "Exporter en tant que STL"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:124
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:117
msgid "Export config"
msgstr "Exporter la configuration"
-#: src/slic3r/GUI/MainFrame.cpp:503
+#: src/slic3r/GUI/MainFrame.cpp:1097
msgid "Export Config &Bundle"
msgstr "Exporter le &Lot de Configuration"
-#: src/slic3r/GUI/MainFrame.cpp:500
+#: src/slic3r/GUI/MainFrame.cpp:1100
+msgid "Export Config Bundle With Physical Printers"
+msgstr "Exporter le Lot de Configurations Avec les Imprimantes Physiques"
+
+#: src/slic3r/GUI/MainFrame.cpp:1094
msgid "Export current configuration to file"
msgstr "Exporter la configuration actuelle vers un fichier"
-#: src/slic3r/GUI/MainFrame.cpp:492
+#: src/slic3r/GUI/MainFrame.cpp:1086
msgid "Export current plate as AMF"
msgstr "Exporter le plateau courant en AMF"
-#: src/slic3r/GUI/MainFrame.cpp:477
+#: src/slic3r/GUI/MainFrame.cpp:1068
msgid "Export current plate as G-code"
msgstr "Exporter le plateau courant en G-code"
-#: src/slic3r/GUI/MainFrame.cpp:521
+#: src/slic3r/GUI/MainFrame.cpp:1076
msgid "Export current plate as G-code to SD card / Flash drive"
msgstr "Exporter le plateau actuel en tant que G-code vers la carte SD / la clef USB"
-#: src/slic3r/GUI/MainFrame.cpp:486
+#: src/slic3r/GUI/MainFrame.cpp:1080
msgid "Export current plate as STL"
msgstr "Exporter le plateau courant en STL"
-#: src/slic3r/GUI/MainFrame.cpp:489
+#: src/slic3r/GUI/MainFrame.cpp:1083
msgid "Export current plate as STL including supports"
msgstr "Exporter le contenu du plateau en STL, supports inclus"
-#: src/slic3r/GUI/Plater.cpp:3664
-msgid "Export failed"
-msgstr "L'export a échoué"
-
-#: src/slic3r/GUI/ConfigWizard.cpp:801
+#: src/slic3r/GUI/ConfigWizard.cpp:1160
msgid "Export full pathnames of models and parts sources into 3mf and amf files"
msgstr "Exportez les chemins d'accès complets des modèles et des sources de pièces dans des fichiers 3mf et amf"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 src/slic3r/GUI/Plater.cpp:891
-#: src/slic3r/GUI/Plater.cpp:5521 src/libslic3r/PrintConfig.cpp:3353
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/Plater.cpp:766
+#: src/slic3r/GUI/Plater.cpp:5706 src/libslic3r/PrintConfig.cpp:3546
msgid "Export G-code"
msgstr "Exporter le G-code"
-#: src/slic3r/GUI/MainFrame.cpp:521
+#: src/slic3r/GUI/MainFrame.cpp:1076
msgid "Export G-code to SD card / Flash drive"
msgstr "Exporter le G-code vers la carte SD / la clef USB"
-#: src/libslic3r/PrintConfig.cpp:3320
+#: src/slic3r/GUI/NotificationManager.cpp:631
+#: src/slic3r/GUI/NotificationManager.cpp:748
+msgid "Export G-Code."
+msgstr "Exporter le G-code."
+
+#: src/libslic3r/PrintConfig.cpp:3513
msgid "Export OBJ"
msgstr "Exporter OBJ"
-#: src/slic3r/GUI/Plater.cpp:2610
+#: src/slic3r/GUI/Plater.cpp:2572
msgid "Export OBJ file:"
msgstr "Exporter le fichier OBJ :"
@@ -2525,212 +2949,215 @@ msgstr "Exporter le fichier OBJ :"
msgid "Export of a temporary 3mf file failed"
msgstr "Exporter un fichier temporaire 3mf qui a échoué"
-#: src/slic3r/GUI/MainFrame.cpp:492
+#: src/slic3r/GUI/MainFrame.cpp:1086
msgid "Export plate as &AMF"
msgstr "Exporter le plateau en tant que &AMF"
-#: src/slic3r/GUI/MainFrame.cpp:486
+#: src/slic3r/GUI/MainFrame.cpp:1080
msgid "Export plate as &STL"
-msgstr "Exporter le plateau en tant que &STL"
+msgstr "Exporter le plateau au format &STL"
-#: src/slic3r/GUI/MainFrame.cpp:489
+#: src/slic3r/GUI/MainFrame.cpp:1083
msgid "Export plate as STL &including supports"
msgstr "Exporter le plateau en STL en &incluant les supports"
-#: src/libslic3r/PrintConfig.cpp:3332
+#: src/libslic3r/PrintConfig.cpp:3525
msgid "Export SLA"
msgstr "Exporter SLA"
-#: src/slic3r/GUI/Preferences.cpp:72
+#: src/slic3r/GUI/Preferences.cpp:89
msgid "Export sources full pathnames to 3mf and amf"
msgstr "Exporter les noms de chemins complets des sources vers 3mf et amf"
-#: src/libslic3r/PrintConfig.cpp:3348
+#: src/libslic3r/PrintConfig.cpp:3541
msgid "Export STL"
msgstr "Exporter STL"
-#: src/slic3r/GUI/Plater.cpp:2591
+#: src/slic3r/GUI/Plater.cpp:2553
msgid "Export STL file:"
msgstr "Exporter le fichier STL :"
-#: src/libslic3r/PrintConfig.cpp:3339
+#: src/libslic3r/PrintConfig.cpp:3532
msgid "Export the model(s) as 3MF."
msgstr "Exporter le(s) modèle(s) en tant que 3MF."
-#: src/libslic3r/PrintConfig.cpp:3344
+#: src/libslic3r/PrintConfig.cpp:3537
msgid "Export the model(s) as AMF."
msgstr "Exporter le(s) modèle(s) en tant que AMF."
-#: src/libslic3r/PrintConfig.cpp:3321
+#: src/libslic3r/PrintConfig.cpp:3514
msgid "Export the model(s) as OBJ."
msgstr "Exporter le(s) modèle(s) en tant que OBJ."
-#: src/libslic3r/PrintConfig.cpp:3349
+#: src/libslic3r/PrintConfig.cpp:3542
msgid "Export the model(s) as STL."
msgstr "Exporter le(s) modèle(s) en tant que STL."
-#: src/slic3r/GUI/Plater.cpp:3966
+#: src/slic3r/GUI/Plater.cpp:3884
msgid "Export the selected object as STL file"
msgstr "Exporter l'objet sélectionné en tant que fichier STL"
-#: src/slic3r/GUI/Plater.cpp:880
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 src/slic3r/GUI/Plater.cpp:755
msgid "Export to SD card / Flash drive"
msgstr "Exporter vers une carte SD / une clé USB"
-#: src/slic3r/GUI/MainFrame.cpp:496
+#: src/slic3r/GUI/MainFrame.cpp:1090 src/slic3r/GUI/MainFrame.cpp:1395
msgid "Export toolpaths as OBJ"
msgstr "Exporter le parcours en tant que OBJ"
-#: src/libslic3r/Print.cpp:1638
+#: src/slic3r/GUI/NotificationManager.hpp:317
+msgid "Exporting finished."
+msgstr "Exportation terminée."
+
+#: src/libslic3r/Print.cpp:1676
msgid "Exporting G-code"
msgstr "Exportation du G-code"
#: src/slic3r/Utils/FixModelByWin10.cpp:341
-msgid "Exporting model..."
-msgstr "Exportation du modèle ..."
+msgid "Exporting model"
+msgstr "Exportation du modèle"
#: src/slic3r/Utils/FixModelByWin10.cpp:219
#: src/slic3r/Utils/FixModelByWin10.cpp:359
msgid "Exporting source model"
msgstr "Exportation du modèle source"
-#: src/libslic3r/SLAPrint.cpp:646
+#: src/libslic3r/SLAPrint.cpp:660
msgid "Exposition time is out of printer profile bounds."
msgstr "Le temps d'exposition dépasse les limites du profil d'imprimante."
-#: src/slic3r/GUI/Tab.cpp:2117 src/slic3r/GUI/Tab.cpp:3515
+#: src/slic3r/GUI/Tab.cpp:2287 src/slic3r/GUI/Tab.cpp:3931
msgid "Exposure"
msgstr "Exposition"
-#: src/libslic3r/PrintConfig.cpp:2541 src/libslic3r/PrintConfig.cpp:2542
+#: src/libslic3r/PrintConfig.cpp:2684 src/libslic3r/PrintConfig.cpp:2685
msgid "Exposure time"
msgstr "Temps d'exposition"
-#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:311
+#: src/slic3r/GUI/GUI_Preview.cpp:302 src/libslic3r/ExtrusionEntity.cpp:315
+#: src/libslic3r/ExtrusionEntity.cpp:338
msgid "External perimeter"
msgstr "Périmètre externe"
-#: src/slic3r/GUI/PresetHints.cpp:156
+#: src/slic3r/GUI/PresetHints.cpp:155
msgid "external perimeters"
msgstr "périmètres externes"
-#: src/libslic3r/PrintConfig.cpp:446 src/libslic3r/PrintConfig.cpp:457
+#: src/libslic3r/PrintConfig.cpp:482 src/libslic3r/PrintConfig.cpp:493
msgid "External perimeters"
msgstr "Périmètres externes"
-#: src/libslic3r/PrintConfig.cpp:469
+#: src/libslic3r/PrintConfig.cpp:505
msgid "External perimeters first"
msgstr "Périmètres externes en premier"
-#: src/libslic3r/PrintConfig.cpp:1588 src/libslic3r/PrintConfig.cpp:1596
+#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1704
msgid "Extra length on restart"
msgstr "Longueur supplémentaire à la reprise"
-#: src/libslic3r/PrintConfig.cpp:1390
+#: src/libslic3r/PrintConfig.cpp:1498
msgid "Extra loading distance"
msgstr "Distance de chargement supplémentaire"
-#: src/libslic3r/PrintConfig.cpp:477
+#: src/libslic3r/PrintConfig.cpp:513
msgid "Extra perimeters if needed"
msgstr "Périmètres supplémentaires si nécessaire"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:278 src/slic3r/GUI/Tab.cpp:1434
-#: src/slic3r/GUI/wxExtensions.cpp:598 src/libslic3r/PrintConfig.cpp:487
+#: src/slic3r/GUI/GCodeViewer.cpp:2277 src/slic3r/GUI/GCodeViewer.cpp:2313
+#: src/slic3r/GUI/GCodeViewer.cpp:2318 src/slic3r/GUI/GUI_ObjectList.cpp:296
+#: src/slic3r/GUI/Tab.cpp:1780 src/slic3r/GUI/wxExtensions.cpp:515
+#: src/libslic3r/PrintConfig.cpp:523
msgid "Extruder"
msgstr "Extrudeur"
-#: src/slic3r/GUI/DoubleSlider.cpp:1134 src/slic3r/GUI/DoubleSlider.cpp:1170
-#: src/slic3r/GUI/GLCanvas3D.cpp:977 src/slic3r/GUI/GUI_ObjectList.cpp:1704
-#: src/slic3r/GUI/Tab.cpp:2320 src/libslic3r/GCode/PreviewData.cpp:445
-#, c-format
+#: src/slic3r/GUI/DoubleSlider.cpp:1263 src/slic3r/GUI/DoubleSlider.cpp:1297
+#: src/slic3r/GUI/GLCanvas3D.cpp:983 src/slic3r/GUI/GUI_ObjectList.cpp:1832
+#: src/slic3r/GUI/Tab.cpp:2489 src/libslic3r/GCode/PreviewData.cpp:450
+#, possible-c-format
msgid "Extruder %d"
msgstr "Extrudeur %d"
-#: src/slic3r/GUI/DoubleSlider.cpp:1011
+#: src/slic3r/GUI/DoubleSlider.cpp:1137
msgid "Extruder (tool) is changed to Extruder \"%1%\""
msgstr "L'extrudeur (outil) est remplacée par l'extrudeur \"%1%\""
-#: src/slic3r/GUI/ConfigWizard.cpp:1017
-msgid "Extruder and Bed Temperatures"
-msgstr "Températures de l'Extrudeur et du Lit"
-
#: src/slic3r/GUI/WipeTowerDialog.cpp:255
msgid "Extruder changed to"
msgstr "Extrudeur changé à"
-#: src/slic3r/GUI/Tab.cpp:1233
-msgid "Extruder clearance (mm)"
-msgstr "Dégagement de l'extrudeur (mm)"
+#: src/slic3r/GUI/Tab.cpp:1589
+msgid "Extruder clearance"
+msgstr "Dégagement de l'extrudeur"
-#: src/libslic3r/PrintConfig.cpp:522
+#: src/libslic3r/PrintConfig.cpp:558
msgid "Extruder Color"
msgstr "Couleur de l'extrudeur"
-#: src/libslic3r/PrintConfig.cpp:529
+#: src/libslic3r/PrintConfig.cpp:565
msgid "Extruder offset"
msgstr "Décalage de l'extrudeur"
-#: src/libslic3r/PrintConfig.cpp:911
-msgid "Extruder temperature for first layer. If you want to control temperature manually during print, set this to zero to disable temperature control commands in the output file."
-msgstr "Température de l’extrudeur pour la première couche. Si vous voulez contrôler manuellement la température au cours de l’impression, mettez à zéro pour désactiver les commandes de contrôle de température dans le fichier de sortie."
-
-#: src/libslic3r/PrintConfig.cpp:2065
-msgid "Extruder temperature for layers after the first one. Set this to zero to disable temperature control commands in the output."
-msgstr "Température de l'extrudeur pour les couches après la première. Mettez zéro pour désactiver les commandes de contrôle de la température dans le fichier de sortie."
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:99 src/slic3r/GUI/GUI_ObjectList.cpp:617
-#: src/slic3r/GUI/Tab.cpp:1180 src/slic3r/GUI/Tab.cpp:1838
-#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:1002
-#: src/libslic3r/PrintConfig.cpp:1409 src/libslic3r/PrintConfig.cpp:1737
-#: src/libslic3r/PrintConfig.cpp:1938 src/libslic3r/PrintConfig.cpp:1965
+#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:656
+#: src/slic3r/GUI/Tab.cpp:1510 src/slic3r/GUI/Tab.cpp:2072
+#: src/libslic3r/PrintConfig.cpp:524 src/libslic3r/PrintConfig.cpp:1046
+#: src/libslic3r/PrintConfig.cpp:1517 src/libslic3r/PrintConfig.cpp:1852
+#: src/libslic3r/PrintConfig.cpp:2080 src/libslic3r/PrintConfig.cpp:2107
msgid "Extruders"
msgstr "Extrudeurs"
-#: src/libslic3r/PrintConfig.cpp:539
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1061
+msgid "Extruders count"
+msgstr "Nombre d'extrudeurs"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2493
+msgid "Extrusion"
+msgstr "Extrusion"
+
+#: src/libslic3r/PrintConfig.cpp:575
msgid "Extrusion axis"
msgstr "Axe d'extrusion"
-#: src/libslic3r/PrintConfig.cpp:545
+#: src/libslic3r/PrintConfig.cpp:581
msgid "Extrusion multiplier"
msgstr "Multiplicateur d'extrusion"
-#: src/slic3r/GUI/ConfigWizard.cpp:1037
+#: src/slic3r/GUI/ConfigWizard.cpp:1403
msgid "Extrusion Temperature:"
msgstr "Température d'Extrusion :"
-#: src/slic3r/GUI/Tab.cpp:1205
+#: src/slic3r/GUI/Tab.cpp:1535
msgid "Extrusion width"
msgstr "Largeur d'extrusion"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:100 src/slic3r/GUI/GUI_ObjectList.cpp:618
-#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:555
-#: src/libslic3r/PrintConfig.cpp:877 src/libslic3r/PrintConfig.cpp:1010
-#: src/libslic3r/PrintConfig.cpp:1418 src/libslic3r/PrintConfig.cpp:1757
-#: src/libslic3r/PrintConfig.cpp:1947 src/libslic3r/PrintConfig.cpp:2106
+#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:657
+#: src/libslic3r/PrintConfig.cpp:483 src/libslic3r/PrintConfig.cpp:591
+#: src/libslic3r/PrintConfig.cpp:919 src/libslic3r/PrintConfig.cpp:1054
+#: src/libslic3r/PrintConfig.cpp:1526 src/libslic3r/PrintConfig.cpp:1872
+#: src/libslic3r/PrintConfig.cpp:2089 src/libslic3r/PrintConfig.cpp:2249
msgid "Extrusion Width"
msgstr "Largeur d'Extrusion"
-#: src/slic3r/GUI/Plater.cpp:162
+#: src/slic3r/GUI/Plater.cpp:168
msgid "Facets"
msgstr "Faces"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:349
+#: src/slic3r/GUI/GUI_ObjectList.cpp:396
msgid "facets added"
msgstr "faces ajoutées"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:348
+#: src/slic3r/GUI/GUI_ObjectList.cpp:395
msgid "facets removed"
msgstr "faces supprimées"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:350
+#: src/slic3r/GUI/GUI_ObjectList.cpp:397
msgid "facets reversed"
msgstr "faces inversées"
-#: src/libslic3r/PrintConfig.cpp:2517
+#: src/libslic3r/PrintConfig.cpp:2660
msgid "Faded layers"
msgstr "Couches estompées"
-#: src/libslic3r/Zipper.cpp:44
+#: src/libslic3r/miniz_extension.cpp:103
msgid "failed finding central directory"
msgstr "impossible de trouver le répertoire central"
@@ -2738,105 +3165,135 @@ msgstr "impossible de trouver le répertoire central"
msgid "Failed loading the input model."
msgstr "Échec du chargement du modèle d'entrée."
-#: src/libslic3r/PrintBase.cpp:71
+#: src/libslic3r/PrintBase.cpp:72
msgid "Failed processing of the output_filename_format template."
msgstr "Échec du traitement du modèle output_filename_format."
-#: src/slic3r/GUI/PresetHints.cpp:42
-msgid "Fan"
-msgstr "Ventilateur"
+#: src/slic3r/GUI/GUI_App.cpp:1648
+msgid "Failed to activate configuration snapshot."
+msgstr "L'activation de l'instantané de configuration a échoué."
-#: src/slic3r/GUI/Tab.cpp:1456
+#: src/slic3r/GUI/Tab.cpp:1802
msgid "Fan settings"
msgstr "Réglages du ventilateur"
-#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/Tab.cpp:1457
+#: src/slic3r/GUI/GUI_Preview.cpp:279 src/slic3r/GUI/Tab.cpp:1803
msgid "Fan speed"
msgstr "Vitesse du ventilateur"
-#: src/libslic3r/GCode/PreviewData.cpp:353
+#: src/slic3r/GUI/GCodeViewer.cpp:2239 src/libslic3r/GCode/PreviewData.cpp:358
msgid "Fan Speed (%)"
msgstr "Vitesse du ventilateur (%)"
-#: src/libslic3r/PrintConfig.cpp:2405
+#: src/slic3r/GUI/PresetHints.cpp:49
+msgid "Fan speed will be ramped from zero at layer %1% to %2%%% at layer %3%."
+msgstr "La vitesse du ventilateur va augmenter depuis zéro pour la couche %1% jusqu'à %2%%% pour la couche %3%."
+
+#: src/libslic3r/PrintConfig.cpp:1001
+msgid "Fan speed will be ramped up linearly from zero at layer \"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower than \"disable_fan_first_layers\", in which case the fan will be running at maximum allowed speed at layer \"disable_fan_first_layers\" + 1."
+msgstr "La vitesse du ventilateur va augmenter de façon linéaire en partant de zéro pour la couche \"disable_fan_first_layers\" jusqu'au maximum pour la couche \"full_fan_speed_layer\". \"full_fan_speed_layer\" sera ignorée si inférieure à \"disable_fan_first_layers\", auquel cas le ventilateur fonctionnera à la vitesse maximum autorisée pour la couche \"disable_fan_first_layers\" +1. "
+
+#: src/slic3r/GUI/PresetHints.cpp:51
+msgid "Fan will always run at %1%%%"
+msgstr "Le ventilateur fonctionnera toujours à %1%%%"
+
+#: src/slic3r/GUI/PresetHints.cpp:58
+msgid "Fan will be turned off."
+msgstr "Le ventilateur sera désactivé."
+
+#: src/libslic3r/PrintConfig.cpp:2548
msgid "Fast"
msgstr "Rapide"
-#: src/libslic3r/PrintConfig.cpp:2406
+#: src/libslic3r/PrintConfig.cpp:2549
msgid "Fast tilt"
msgstr "Inclinaison rapide"
-#: src/slic3r/GUI/GUI_App.cpp:141
+#: src/slic3r/GUI/GUI_App.cpp:531
msgid "Fatal error"
msgstr "Erreur fatale"
-#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/GUI_Preview.cpp:575
-#: src/libslic3r/GCode/PreviewData.cpp:345
+#: src/slic3r/GUI/GUI_Init.cpp:88
+msgid "Fatal error, exception catched: %1%"
+msgstr "Erreur fatale, exception interceptée : %1%"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2225 src/slic3r/GUI/GCodeViewer.cpp:2233
+#: src/slic3r/GUI/GUI_Preview.cpp:275 src/slic3r/GUI/GUI_Preview.cpp:787
+#: src/libslic3r/GCode/PreviewData.cpp:350
msgid "Feature type"
msgstr "Type de fonctionnalité"
-#: src/slic3r/GUI/GUI_Preview.cpp:234 src/slic3r/GUI/GUI_Preview.cpp:235
+#: src/slic3r/GUI/GUI_Preview.cpp:293 src/slic3r/GUI/GUI_Preview.cpp:295
+#: src/slic3r/GUI/GUI_Preview.cpp:316
msgid "Feature types"
msgstr "Types de fonctionnalité"
-#: src/slic3r/GUI/ConfigWizard.cpp:1525
+#: src/slic3r/GUI/ConfigWizard.cpp:1926
msgid "FFF Technology Printers"
msgstr "Imprimantes Technologie FFF"
-#: src/slic3r/GUI/Plater.cpp:816 src/slic3r/GUI/Tab.cpp:1425
-#: src/slic3r/GUI/Tab.cpp:1426
+#: src/slic3r/GUI/Plater.cpp:691 src/slic3r/GUI/Tab.cpp:1770
+#: src/slic3r/GUI/Tab.cpp:1771
msgid "Filament"
msgstr "Filament"
-#: src/slic3r/GUI/Preset.cpp:1522
+#: src/libslic3r/Preset.cpp:1301
msgid "filament"
msgstr "filament"
-#: src/slic3r/GUI/ConfigWizard.cpp:952
+#: src/slic3r/GUI/ConfigWizard.cpp:1318
msgid "Filament and Nozzle Diameters"
msgstr "Diamètres du Filament et de la Buse"
-#: src/slic3r/GUI/ConfigWizard.cpp:983
+#: src/slic3r/GUI/Plater.cpp:1189
+msgid "Filament at extruder %1%"
+msgstr "Filament de l'extrudeur %1%"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1349
msgid "Filament Diameter:"
msgstr "Diamètre du Filament :"
-#: src/libslic3r/PrintConfig.cpp:651
+#: src/libslic3r/PrintConfig.cpp:687
msgid "Filament is cooled by being moved back and forth in the cooling tubes. Specify desired number of these moves."
msgstr "Le filament est refroidi en étant déplacé d'avant en arrière dans les tubes de refroidissement. Spécifiez le nombre souhaité de ces mouvements."
-#: src/libslic3r/PrintConfig.cpp:686
+#: src/libslic3r/PrintConfig.cpp:722
msgid "Filament load time"
msgstr "Temps de chargement du filament"
-#: src/libslic3r/PrintConfig.cpp:588
+#: src/libslic3r/PrintConfig.cpp:624
msgid "Filament notes"
msgstr "Notes du filament"
-#: src/slic3r/GUI/Tab.cpp:1323 src/slic3r/GUI/Tab.cpp:1378
+#: src/slic3r/GUI/Tab.cpp:1669
msgid "Filament Overrides"
msgstr "Annulations de Filament"
-#: src/libslic3r/PrintConfig.cpp:1381
+#: src/libslic3r/PrintConfig.cpp:1489
msgid "Filament parking position"
msgstr "Position d'attente du filament"
-#: src/slic3r/GUI/ConfigWizard.cpp:2013
+#: src/slic3r/GUI/ConfigWizard.cpp:2524
msgid "Filament Profiles Selection"
msgstr "Sélection des Profils de Filament"
-#: src/slic3r/GUI/Tab.cpp:1471
+#: src/slic3r/GUI/Tab.cpp:1817
msgid "Filament properties"
msgstr "Propriétés du filament"
-#: src/slic3r/GUI/Tab.hpp:355
+#: src/slic3r/GUI/Tab.hpp:409
msgid "Filament Settings"
msgstr "Réglages du filament"
-#: src/libslic3r/PrintConfig.cpp:726
+#: src/slic3r/GUI/GLCanvas3D.cpp:4304 src/slic3r/GUI/GLCanvas3D.cpp:4940
+msgid "Filament Settings Tab"
+msgstr "Onglet de réglages du filament"
+
+#: src/libslic3r/PrintConfig.cpp:762
msgid "Filament type"
msgstr "Type de filament"
-#: src/libslic3r/PrintConfig.cpp:701
+#: src/libslic3r/PrintConfig.cpp:737
msgid "Filament unload time"
msgstr "Temps de déchargement du filament"
@@ -2844,83 +3301,103 @@ msgstr "Temps de déchargement du filament"
msgid "filaments"
msgstr "filaments"
-#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2013
+#: src/slic3r/GUI/ConfigWizard.cpp:1872 src/slic3r/GUI/ConfigWizard.cpp:2524
msgid "Filaments"
msgstr "Filaments"
-#: src/libslic3r/Zipper.cpp:72
+#: src/slic3r/GUI/ConfigWizard.cpp:691
+msgid "Filaments marked with <b>*</b> are <b>not</b> compatible with some installed printers."
+msgstr "Les filaments marqués d'une <b>*</b> <b>ne</b> sont <b>pas</b> compatibles avec certaines imprimantes installées."
+
+#: src/libslic3r/miniz_extension.cpp:131
msgid "file close failed"
msgstr "échec de la fermeture du fichier"
-#: src/libslic3r/Zipper.cpp:66
+#: src/libslic3r/miniz_extension.cpp:125
msgid "file create failed"
msgstr "échec de création du fichier"
-#: src/slic3r/GUI/MainFrame.cpp:791
+#: src/slic3r/GUI/MainFrame.cpp:1492
msgid "File Not Found"
msgstr "Fichier non trouvé"
-#: src/libslic3r/Zipper.cpp:86
+#: src/libslic3r/miniz_extension.cpp:145
msgid "file not found"
msgstr "fichier non trouvé"
-#: src/libslic3r/Zipper.cpp:64
+#: src/libslic3r/miniz_extension.cpp:123
msgid "file open failed"
msgstr "échec de l'ouverture du fichier"
-#: src/libslic3r/Zipper.cpp:70
+#: src/libslic3r/miniz_extension.cpp:129
msgid "file read failed"
msgstr "échec de lecture du fichier"
-#: src/libslic3r/Zipper.cpp:74
+#: src/libslic3r/miniz_extension.cpp:133
msgid "file seek failed"
msgstr "impossible de trouver le fichier"
-#: src/libslic3r/Zipper.cpp:76
+#: src/libslic3r/miniz_extension.cpp:135
msgid "file stat failed"
msgstr "impossible d'établir des statistiques pour ce fichier"
-#: src/libslic3r/Zipper.cpp:36
+#: src/libslic3r/miniz_extension.cpp:95
msgid "file too large"
msgstr "fichier trop volumineux"
-#: src/libslic3r/Zipper.cpp:68
+#: src/libslic3r/miniz_extension.cpp:127
msgid "file write failed"
msgstr "échec d'écriture du fichier"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:153
+#: src/slic3r/GUI/PrintHostDialogs.cpp:151
msgid "Filename"
msgstr "Nom de fichier"
-#: src/libslic3r/PrintConfig.cpp:775
+#: src/slic3r/GUI/ConfigWizard.cpp:1181
+msgid "Files association"
+msgstr "Association de fichiers"
+
+#: src/libslic3r/PrintConfig.cpp:811
msgid "Fill angle"
msgstr "Angle du remplissage"
-#: src/libslic3r/PrintConfig.cpp:789
+#: src/slic3r/GUI/Plater.cpp:1651
+msgid "Fill bed"
+msgstr "Remplir le plateau"
+
+#: src/slic3r/GUI/Plater.cpp:3936
+msgid "Fill bed with instances"
+msgstr "Remplir le plateau avec des copies"
+
+#: src/libslic3r/PrintConfig.cpp:825
msgid "Fill density"
msgstr "Densité de remplissage"
-#: src/libslic3r/PrintConfig.cpp:826
+#: src/libslic3r/PrintConfig.cpp:862
msgid "Fill pattern"
msgstr "Motif de remplissage"
-#: src/libslic3r/PrintConfig.cpp:437
+#: src/libslic3r/PrintConfig.cpp:473
msgid "Fill pattern for bottom infill. This only affects the bottom external visible layer, and not its adjacent solid shells."
msgstr "Motif pour les remplissages pour le remplissage du bas. Ceci affecte seulement la couche externe visible en bas, et non les coques solides adjacentes."
-#: src/libslic3r/PrintConfig.cpp:828
+#: src/libslic3r/PrintConfig.cpp:864
msgid "Fill pattern for general low-density infill."
msgstr "Motif pour les remplissages de faible densité."
-#: src/libslic3r/PrintConfig.cpp:417
+#: src/libslic3r/PrintConfig.cpp:451
msgid "Fill pattern for top infill. This only affects the top visible layer, and not its adjacent solid shells."
msgstr "Motif pour les remplissages pour le remplissage du haut. Ceci affecte seulement la couche externe visible en haut, et non les coques solides adjacentes."
+#: src/slic3r/GUI/Plater.cpp:3936
+msgid "Fill the remaining area of bed with instances of the selected object"
+msgstr "Remplir l'espace restant du plateau avec des copies de l'objet sélectionné"
+
#: src/slic3r/GUI/BonjourDialog.cpp:225
msgid "Finished"
msgstr "Terminé"
-#: src/slic3r/GUI/ConfigWizard.cpp:891 src/slic3r/GUI/Tab.cpp:1947
+#: src/slic3r/GUI/ConfigWizard.cpp:1257 src/slic3r/GUI/Tab.cpp:2132
msgid "Firmware"
msgstr "Firmware"
@@ -2932,50 +3409,62 @@ msgstr "Outil de flash du firmware"
msgid "Firmware image:"
msgstr "Image du firmware :"
-#: src/slic3r/GUI/Tab.cpp:2577
+#: src/slic3r/GUI/Tab.cpp:2733
msgid "Firmware Retraction"
msgstr "Rétraction du Firmware"
-#: src/slic3r/GUI/ConfigWizard.cpp:891
+#: src/slic3r/GUI/ConfigWizard.cpp:1257
msgid "Firmware Type"
msgstr "Type de Firmware"
-#: src/libslic3r/PrintConfig.cpp:859 src/libslic3r/PrintConfig.cpp:868
-#: src/libslic3r/PrintConfig.cpp:876 src/libslic3r/PrintConfig.cpp:910
+#: src/libslic3r/PrintConfig.cpp:899 src/libslic3r/PrintConfig.cpp:908
+#: src/libslic3r/PrintConfig.cpp:918 src/libslic3r/PrintConfig.cpp:952
msgid "First layer"
msgstr "Première couche"
-#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:889
+#: src/libslic3r/PrintConfig.cpp:909
+msgid "First layer bed temperature"
+msgstr "Température du plateau de la première couche"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:60 src/libslic3r/PrintConfig.cpp:931
msgid "First layer height"
msgstr "Hauteur de la première couche"
-#: src/libslic3r/Print.cpp:1422
+#: src/libslic3r/Print.cpp:1448
msgid "First layer height can't be greater than nozzle diameter"
msgstr "La hauteur de la première couche ne peut pas être supérieure au diamètre de la buse"
-#: src/libslic3r/PrintConfig.cpp:900
+#: src/libslic3r/PrintConfig.cpp:960
+msgid "First layer nozzle temperature"
+msgstr "Température de la buse de la première couche"
+
+#: src/libslic3r/PrintConfig.cpp:942
msgid "First layer speed"
msgstr "Vitesse de la première couche"
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:218
msgid "First layer volumetric"
msgstr "Volume de la première couche"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1647
+#: src/slic3r/GUI/Plater.cpp:3380
+msgid "Fix through NetFabb"
+msgstr "Réparer avec NetFabb"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1776
msgid "Fix through the Netfabb"
msgstr "Corriger avec Netfabb"
-#: src/slic3r/GUI/Plater.cpp:3473
+#: src/slic3r/GUI/Plater.cpp:3278
msgid "Fix Throught NetFabb"
msgstr "Corriger Avec NetFabb"
-#: src/slic3r/GUI/GUI_App.cpp:824
+#: src/slic3r/GUI/GUI_App.cpp:1522
msgid "Flash printer &firmware"
msgstr "Flasher le &firmware de l'imprimante"
#: src/slic3r/GUI/FirmwareDialog.cpp:150
msgid "Flash!"
-msgstr "Flash !"
+msgstr "Flasher !"
#: src/slic3r/GUI/FirmwareDialog.cpp:284
msgid "Flashing cancelled."
@@ -2997,54 +3486,52 @@ msgstr "Processus de flash en cours. Veuillez ne pas déconnecter l'imprimante !
msgid "Flashing succeeded!"
msgstr "Flash effectué avec succès !"
-#: src/slic3r/GUI/Tab.cpp:1218
+#: src/slic3r/GUI/Tab.cpp:1548
msgid "Flow"
msgstr "Flux"
-#: src/slic3r/GUI/PresetHints.cpp:220
+#: src/libslic3r/PrintConfig.cpp:1145
+msgid "Flow rate"
+msgstr "Débit"
+
+#: src/slic3r/GUI/PresetHints.cpp:219
msgid "flow rate is maximized"
msgstr "le débit est maximisé"
-#: src/slic3r/GUI/UpdateDialogs.cpp:286
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:555
+msgid "Following printer preset(s) is duplicated:%1%The above preset for printer \"%2%\" will be used just once."
+msgstr "Le ou les préréglages d'imprimante suivants sont dupliqués :%1% Le préréglage ci-dessus pour l'imprimante \"%2%\" sera utilisé une seule fois."
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:287
msgid "For more information please visit our wiki page:"
msgstr "Pour plus d'informations, merci de visiter notre page wiki :"
-#: src/slic3r/GUI/Plater.cpp:501 src/slic3r/GUI/Plater.cpp:624
+#: src/slic3r/GUI/Plater.cpp:367 src/slic3r/GUI/Plater.cpp:490
msgid "For support enforcers only"
msgstr "Seulement pour les générateur de supports"
#. TRN Description for "WHITE BULLET"
-#: src/slic3r/GUI/Tab.cpp:3267
-msgid ""
-"for the left button: indicates a non-system (or non-default) preset,\n"
-"for the right button: indicates that the settings hasn't been modified."
-msgstr ""
-"pour le bouton gauche : indique un préréglage non-système (ou non par défaut),\n"
-"pour le bouton droit : indique que le réglage n'a pas été modifié."
+#: src/slic3r/GUI/Tab.cpp:3702
+msgid "for the left button: indicates a non-system (or non-default) preset,\nfor the right button: indicates that the settings hasn't been modified."
+msgstr "pour le bouton gauche : indique un préréglage non-système (ou non par défaut),\npour le bouton droit : indique que le réglage n'a pas été modifié."
-#: src/slic3r/GUI/ConfigManipulation.cpp:136
-msgid ""
-"For the Wipe Tower to work with the soluble supports, the support layers\n"
-"need to be synchronized with the object layers."
-msgstr ""
-"Pour que la tour de nettoyage fonctionne avec les supports solubles, les couches du support\n"
-"doivent être synchronisées avec les couches d'objets."
+#: src/slic3r/GUI/ConfigManipulation.cpp:135
+msgid "For the Wipe Tower to work with the soluble supports, the support layers\nneed to be synchronized with the object layers."
+msgstr "Pour que la tour de nettoyage fonctionne avec les supports solubles, les couches du support\ndoivent être synchronisées avec les couches d'objets."
-#: src/libslic3r/Print.cpp:1396
+#: src/libslic3r/Print.cpp:1422
msgid "For the Wipe Tower to work with the soluble supports, the support layers need to be synchronized with the object layers."
-msgstr ""
-"Pour que la Tour de Nettoyage fonctionne avec des supports solubles, les couches de support\n"
-"doivent être synchronisées avec les couches de l'objet."
+msgstr "Pour que la Tour de Nettoyage fonctionne avec des supports solubles, les couches de support\ndoivent être synchronisées avec les couches de l'objet."
-#: src/libslic3r/PrintConfig.cpp:2864
+#: src/libslic3r/PrintConfig.cpp:3028
msgid "Force pad around object everywhere"
msgstr "Forcer le socle partout autour de l'objet"
-#: src/libslic3r/PrintConfig.cpp:1729
+#: src/libslic3r/PrintConfig.cpp:1844
msgid "Force solid infill for regions having a smaller area than the specified threshold."
msgstr "Forcer un remplissage solide pour les zones ayant une surface plus petite que la valeur indiquée."
-#: src/libslic3r/PrintConfig.cpp:1072
+#: src/libslic3r/PrintConfig.cpp:1116
msgid "Force the generation of solid shells between adjacent materials/volumes. Useful for multi-extruder prints with translucent materials or manual soluble support material."
msgstr "Force la génération de coques solides entre des volumes/matériaux adjacents. Utile pour des impressions multi-extrudeurs avec des matériaux translucides ou avec un support manuel soluble."
@@ -3052,248 +3539,317 @@ msgstr "Force la génération de coques solides entre des volumes/matériaux adj
msgid "From"
msgstr "De"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2223
+#: src/slic3r/GUI/GCodeViewer.cpp:2197
+msgid "from"
+msgstr "de"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2389
msgid "From Object List You can't delete the last solid part from object."
msgstr "Depuis la Liste d'Objet Vous ne pouvez pas supprimer la dernière partie solide de l'objet."
-#: src/slic3r/GUI/MainFrame.cpp:667
+#: src/slic3r/GUI/MainFrame.cpp:964 src/slic3r/GUI/MainFrame.cpp:1284
msgid "Front"
msgstr "Avant"
-#: src/slic3r/GUI/MainFrame.cpp:667
+#: src/slic3r/GUI/MainFrame.cpp:964 src/slic3r/GUI/MainFrame.cpp:1284
msgid "Front View"
msgstr "Vue Avant"
-#: src/slic3r/GUI/Tab.cpp:1013
+#: src/libslic3r/PrintConfig.cpp:1000
+msgid "Full fan speed at layer"
+msgstr "Ventilateur à pleine vitesse pour la couche"
+
+#: src/slic3r/GUI/Tab.cpp:1331
msgid "full profile name"
msgstr "nom de profil complet"
-#: src/slic3r/GUI/MainFrame.cpp:826
+#: src/libslic3r/PrintConfig.cpp:817
+msgid "g"
+msgstr "g"
+
+#: src/slic3r/GUI/MainFrame.cpp:1527
msgid "G-code"
msgstr "G-code"
-#: src/slic3r/GUI/DoubleSlider.cpp:1021
-msgid ""
-"G-code associated to this tick mark is in a conflict with print mode.\n"
-"Editing it will cause changes of Slider data."
-msgstr ""
-"Le G-code associé à cette coche est en conflit avec le mode d'impression.\n"
-"Le modifier entraînera des modifications des données du curseur."
+#: src/slic3r/GUI/DoubleSlider.cpp:1146
+msgid "G-code associated to this tick mark is in a conflict with print mode.\nEditing it will cause changes of Slider data."
+msgstr "Le G-code associé à cette coche est en conflit avec le mode d'impression.\nLe modifier entraînera des modifications des données de la Barre de défilement."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:130
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:165
msgid "G-code file exported to %1%"
msgstr "Fichier G-code exporté vers %1%"
-#: src/libslic3r/PrintConfig.cpp:936
+#: src/libslic3r/PrintConfig.cpp:980
msgid "G-code flavor"
msgstr "Version du G-code"
-#: src/libslic3r/PrintConfig.cpp:721
+#: src/slic3r/GUI/MainFrame.cpp:66 src/slic3r/GUI/MainFrame.cpp:79
+msgid "G-code preview"
+msgstr "Aperçu du G-code"
+
+#: src/libslic3r/PrintConfig.cpp:66
+msgid "G-code thumbnails"
+msgstr "Vignettes G-code"
+
+#: src/libslic3r/PrintConfig.cpp:3552
+msgid "G-code viewer"
+msgstr "Visionneuse de G-code"
+
+#: src/libslic3r/PrintConfig.cpp:757
msgid "g/cm³"
msgstr "g/cm³"
-#: src/libslic3r/PrintConfig.cpp:2505
+#: src/libslic3r/PrintConfig.cpp:2648
msgid "g/ml"
msgstr "g/ml"
-#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:317
-#: src/libslic3r/PrintConfig.cpp:918
+#: src/slic3r/GUI/GUI_Preview.cpp:309 src/libslic3r/ExtrusionEntity.cpp:322
+#: src/libslic3r/ExtrusionEntity.cpp:352 src/libslic3r/PrintConfig.cpp:962
msgid "Gap fill"
msgstr "Remplissage des trous"
-#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1796
-#: src/slic3r/GUI/Tab.cpp:2040
+#: src/slic3r/GUI/Preferences.cpp:24 src/slic3r/GUI/Tab.cpp:2058
+#: src/slic3r/GUI/Tab.cpp:2240 src/slic3r/GUI/Tab.cpp:2348
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1066
msgid "General"
msgstr "Général"
-#: src/libslic3r/PrintConfig.cpp:1307
+#: src/libslic3r/PrintConfig.cpp:1415
msgid "Generate no less than the number of skirt loops required to consume the specified amount of filament on the bottom layer. For multi-extruder machines, this minimum applies to each extruder."
msgstr "Nombre minimum de contours à générer afin de consommer la quantité de filament spécifiée sur la couche inférieure. Pour les machines multi-extrudeurs, ce minimum s'applique à chaque extrudeur."
-#: src/libslic3r/PrintConfig.cpp:1865
+#: src/libslic3r/PrintConfig.cpp:2007
msgid "Generate support material"
msgstr "Générer des supports"
-#: src/libslic3r/PrintConfig.cpp:1926
+#: src/libslic3r/PrintConfig.cpp:2068
msgid "Generate support material for the specified number of layers counting from bottom, regardless of whether normal support material is enabled or not and regardless of any angle threshold. This is useful for getting more adhesion of objects having a very thin or poor footprint on the build plate."
msgstr "Générer des supports pour le nombre de couches spécifié à partir du bas, que les supports normaux soient activés ou non et sans tenir compte des seuils d'inclinaison. Ceci est utile pour obtenir une meilleure adhérence pour des objets ayant une surface de contact très fine ou limitée sur le plateau."
-#: src/libslic3r/PrintConfig.cpp:2613
+#: src/libslic3r/PrintConfig.cpp:2756
msgid "Generate supports"
msgstr "Générer des supports"
-#: src/libslic3r/PrintConfig.cpp:2615
+#: src/libslic3r/PrintConfig.cpp:2758
msgid "Generate supports for the models"
msgstr "Générer des supports pour les modèles"
-#: src/libslic3r/Print.cpp:1614
+#: src/slic3r/GUI/Plater.cpp:3554
+msgid "generated warnings"
+msgstr "avertissements générés"
+
+#: src/libslic3r/Print.cpp:1645
msgid "Generating brim"
msgstr "Génération de la bordure"
-#: src/libslic3r/Print.cpp:1642
+#: src/libslic3r/Print.cpp:1680
msgid "Generating G-code"
msgstr "Génération du G-code"
-#: src/libslic3r/SLAPrintSteps.cpp:48
+#: src/slic3r/GUI/GCodeViewer.cpp:1392
+msgid "Generating index buffers"
+msgstr "Génération des tampons d'index"
+
+#: src/libslic3r/SLAPrintSteps.cpp:49
msgid "Generating pad"
msgstr "Génération du socle"
-#: src/libslic3r/PrintObject.cpp:152
+#: src/libslic3r/PrintObject.cpp:158
msgid "Generating perimeters"
msgstr "Génération des périmètres"
-#: src/libslic3r/Print.cpp:1606
+#: src/libslic3r/Print.cpp:1636
msgid "Generating skirt"
msgstr "Génération de la jupe"
-#: src/libslic3r/PrintObject.cpp:395
+#: src/libslic3r/PrintObject.cpp:422
msgid "Generating support material"
msgstr "Génération des supports"
-#: src/libslic3r/SLAPrintSteps.cpp:46 src/libslic3r/SLAPrintSteps.cpp:356
+#: src/libslic3r/SLAPrintSteps.cpp:47 src/libslic3r/SLAPrintSteps.cpp:359
msgid "Generating support points"
msgstr "Génération des points de support"
-#: src/libslic3r/SLAPrintSteps.cpp:47
+#: src/libslic3r/SLAPrintSteps.cpp:48
msgid "Generating support tree"
msgstr "Génération de l'arbre de support"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2022
+#: src/slic3r/GUI/GCodeViewer.cpp:933
+msgid "Generating toolpaths"
+msgstr "Génération des parcours d'outils"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:1318
+msgid "Generating vertex buffer"
+msgstr "Génération du tampon de vertex"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2181
msgid "Generic"
msgstr "Générique"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
+#: src/slic3r/Utils/PresetUpdater.cpp:600
+msgid "getting config updates"
+msgstr "obtention des mises à jour de configuration"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
msgid "Gizmo cut"
msgstr "Couper le Gizmo"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:172
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
msgid "Gizmo move"
msgstr "Déplacer le Gizmo"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:176
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:198
+msgid "Gizmo move: Press to snap by 1mm"
+msgstr "Déplacement du gizmo : appuyez pour des pas de 1 mm"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
msgid "Gizmo Place face on bed"
msgstr "Emplacement du Gizmo face au lit"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:174
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
msgid "Gizmo rotate"
msgstr "Pivoter le Gizmo"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:173
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:203
+msgid "Gizmo rotate: Press to rotate selected objects around their own center"
+msgstr "Rotation du gizmo : appuyez pour faire pivoter les objets sélectionnés autour de leur propre centre"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
msgid "Gizmo scale"
msgstr "Échelle du Gizmo"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:177
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:201
+msgid "Gizmo scale: Press to activate one direction scaling"
+msgstr "Redimensionnement du gizmo : appuyez pour activer le redimensionnement dans une direction"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:202
+msgid "Gizmo scale: Press to scale selected objects around their own center"
+msgstr "Redimensionnement du gizmo : appuyez pour mettre redimensionner les objets sélectionnés autour de leur propre centre"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:199
+msgid "Gizmo scale: Press to snap by 5%"
+msgstr "Redimensionnement du gizmo : appuyez pour des pas de 5%"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:200
+msgid "Gizmo scale: Scale selection to fit print volume"
+msgstr "Redimensionnement du gizmo : redimensionner la sélection pour remplir le volume d'impression"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
msgid "Gizmo SLA hollow"
msgstr "Gizmo SLA évidé"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:178
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:172
msgid "Gizmo SLA support points"
msgstr "Points de support SLA du Gizmo"
-#: src/slic3r/GUI/GLCanvas3D.cpp:2921
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562
+#: src/slic3r/GUI/GLCanvas3D.cpp:3165
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:520
msgid "Gizmo-Move"
msgstr "Gizmo-Déplacement"
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:489
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:639
msgid "Gizmo-Place on Face"
msgstr "Gizmo-Positionner sur la surface"
-#: src/slic3r/GUI/GLCanvas3D.cpp:3001
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:564
+#: src/slic3r/GUI/GLCanvas3D.cpp:3249
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:522
msgid "Gizmo-Rotate"
msgstr "Gizmo-Rotation"
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:563
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:521
msgid "Gizmo-Scale"
msgstr "Gizmo-Échelle"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:201
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:199
msgid "Gizmos"
msgstr "Gizmos"
-#: src/slic3r/GUI/AboutDialog.cpp:259
+#: src/slic3r/GUI/AboutDialog.cpp:284 src/slic3r/GUI/GUI_App.cpp:244
msgid "GNU Affero General Public License, version 3"
msgstr "GNU Affero Licence Publique Générale, version 3"
-#: src/slic3r/GUI/ConfigWizard.cpp:980
+#: src/slic3r/GUI/ConfigWizard.cpp:1346
msgid "Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average."
msgstr "Une bonne précision est requise, utilisez un pied à coulisse et calculez la moyenne de plusieurs mesures le long du filament."
-#: src/libslic3r/PrintConfig.cpp:844
+#: src/libslic3r/PrintConfig.cpp:882
msgid "Grid"
msgstr "Grille"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2454
+#: src/slic3r/GUI/PrintHostDialogs.cpp:57
+msgid "Group"
+msgstr "Grouper"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2846
msgid "Group manipulation"
msgstr "Manipulation d'un groupe"
-#: src/slic3r/GUI/Preferences.cpp:133
+#: src/slic3r/GUI/Preferences.cpp:200
msgid "GUI"
msgstr "GUI"
-#: src/libslic3r/PrintConfig.cpp:852
+#: src/libslic3r/PrintConfig.cpp:890
msgid "Gyroid"
msgstr "Gyroïde"
-#: src/slic3r/GUI/Tab.cpp:2937
-msgid "has the following unsaved changes:"
-msgstr "a les changements suivants non-enregistrés :"
-
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47
msgid "Head diameter"
msgstr "Diamètre de la tête"
-#: src/slic3r/GUI/ConfigManipulation.cpp:317
+#: src/libslic3r/PrintConfig.cpp:2772
+msgid "Head penetration"
+msgstr "Pénétration de la tête"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:322
msgid "Head penetration should not be greater than the head width."
msgstr "La pénétration de la tête ne doit pas être supérieure à la largeur de la tête."
-#: src/libslic3r/PrintConfig.cpp:869
+#: src/libslic3r/PrintConfig.cpp:910
msgid "Heated build plate temperature for the first layer. Set this to zero to disable bed temperature control commands in the output."
msgstr "Température du plateau chauffant pour la première couche. Mettez ceci à zéro pour désactiver les commandes de contrôle de température du plateau dans la sortie."
-#: src/slic3r/GUI/GUI_Preview.cpp:222 src/libslic3r/PrintConfig.cpp:500
+#: src/slic3r/GUI/GUI_Preview.cpp:276 src/libslic3r/PrintConfig.cpp:536
msgid "Height"
msgstr "Hauteur"
-#: src/libslic3r/GCode/PreviewData.cpp:347
+#: src/slic3r/GUI/GCodeViewer.cpp:2236 src/libslic3r/GCode/PreviewData.cpp:352
msgid "Height (mm)"
msgstr "Hauteur (mm)"
-#: src/libslic3r/PrintConfig.cpp:1688
+#: src/libslic3r/PrintConfig.cpp:1796
msgid "Height of skirt expressed in layers. Set this to a tall value to use skirt as a shield against drafts."
msgstr "Hauteur de la jupe exprimée en couches. Mettez une valeur élevée pour utiliser la jupe comme un bouclier contre les flux d'airs."
-#: src/libslic3r/PrintConfig.cpp:2360
+#: src/libslic3r/PrintConfig.cpp:2503
msgid "Height of the display"
msgstr "Hauteur de l'affichage"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1500
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1631
msgid "Height range Modifier"
-msgstr "Modificateur de la zone de hauteur"
+msgstr "Modificateur de plage de hauteur"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2507
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2899
msgid "Height ranges"
-msgstr "Zones de hauteur"
+msgstr "Plages de hauteur"
-#: src/libslic3r/PrintConfig.cpp:261
+#: src/libslic3r/PrintConfig.cpp:295
msgid "Heights at which a filament change is to occur."
msgstr "Hauteurs auxquelles le changement de filament doit se produire."
-#: src/slic3r/GUI/ConfigWizard.cpp:433
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:451
+#, possible-c-format
msgid "Hello, welcome to %s! This %s helps you with the initial configuration; just a few settings and you will be ready to print."
-msgstr "Bonjour, bienvenu dans %s ! Ce %s vous aide à la configuration initiale ; juste quelques paramètres et vous serez prêt à imprimer."
+msgstr "Bonjour, bienvenue dans %s ! Cet %s est là pour vous aider à effectuer la configuration initiale ; juste quelques paramètres et vous serez prêt à imprimer."
-#: src/libslic3r/PrintConfig.cpp:3365
+#: src/libslic3r/PrintConfig.cpp:3564
msgid "Help"
msgstr "Aide"
-#: src/libslic3r/PrintConfig.cpp:3371
+#: src/libslic3r/PrintConfig.cpp:3570
msgid "Help (FFF options)"
msgstr "Aide (options FFF)"
-#: src/libslic3r/PrintConfig.cpp:3376
+#: src/libslic3r/PrintConfig.cpp:3575
msgid "Help (SLA options)"
msgstr "Aide (options SLA)"
@@ -3301,96 +3857,100 @@ msgstr "Aide (options SLA)"
msgid "Here you can adjust required purging volume (mm³) for any given pair of tools."
msgstr "Ici vous pouvez ajuster le volume de purge nécessaire (mm³) pour une paire d'outils donnée."
-#: src/libslic3r/PrintConfig.cpp:973
+#: src/slic3r/GUI/DoubleSlider.cpp:1849
+msgid "Hide ruler"
+msgstr "Cacher la règle"
+
+#: src/libslic3r/PrintConfig.cpp:1017
msgid "High extruder current on filament swap"
msgstr "Courant de l'extrudeur élevé lors du changement de filament"
-#: src/slic3r/GUI/GLCanvas3D.cpp:277
+#: src/slic3r/GUI/GLCanvas3D.cpp:263
msgid "Higher print quality versus higher print speed."
msgstr "Meilleure qualité d'impression par rapport à une vitesse d'impression plus élevée."
-#: src/libslic3r/PrintConfig.cpp:427 src/libslic3r/PrintConfig.cpp:853
+#: src/libslic3r/PrintConfig.cpp:463 src/libslic3r/PrintConfig.cpp:891
msgid "Hilbert Curve"
msgstr "Courbe de Hilbert"
-#: src/slic3r/GUI/Plater.cpp:1042
+#: src/slic3r/GUI/Plater.cpp:916
msgid "Hold Shift to Slice & Export G-code"
msgstr "Maintenez la touche Majuscule pour Trancher et Exporter le G-code"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46
msgid "Hole depth"
msgstr "Profondeur du trou"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45
msgid "Hole diameter"
msgstr "Diamètre du trou"
-#: src/slic3r/GUI/Plater.cpp:2760
-msgid "Hollow"
-msgstr "Évider"
-
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:977
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:785
msgid "Hollow and drill"
msgstr "Évider et percer"
-#: src/libslic3r/PrintConfig.cpp:2910
+#: src/libslic3r/PrintConfig.cpp:3074
msgid "Hollow out a model to have an empty interior"
msgstr "Évider un modèle pour avoir un intérieur vide"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40
msgid "Hollow this object"
msgstr "Évider cet objet"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:108 src/slic3r/GUI/Tab.cpp:3654
-#: src/slic3r/GUI/Tab.cpp:3655 src/libslic3r/SLA/Hollowing.cpp:46
-#: src/libslic3r/SLA/Hollowing.cpp:58 src/libslic3r/SLA/Hollowing.cpp:67
-#: src/libslic3r/SLA/Hollowing.cpp:76 src/libslic3r/PrintConfig.cpp:2909
-#: src/libslic3r/PrintConfig.cpp:2916 src/libslic3r/PrintConfig.cpp:2926
-#: src/libslic3r/PrintConfig.cpp:2935
+#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:4073
+#: src/slic3r/GUI/Tab.cpp:4074 src/libslic3r/SLA/Hollowing.cpp:45
+#: src/libslic3r/SLA/Hollowing.cpp:57 src/libslic3r/SLA/Hollowing.cpp:66
+#: src/libslic3r/SLA/Hollowing.cpp:75 src/libslic3r/PrintConfig.cpp:3073
+#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090
+#: src/libslic3r/PrintConfig.cpp:3099
msgid "Hollowing"
msgstr "Évidement"
-#: src/slic3r/GUI/Plater.cpp:2926
-msgid "Hollowing cancelled."
-msgstr "Évidement annulé."
-
-#: src/slic3r/GUI/Plater.cpp:2927
-msgid "Hollowing done."
-msgstr "Évidement terminé."
-
-#: src/slic3r/GUI/Plater.cpp:2929
-msgid "Hollowing failed."
-msgstr "L'évidement a échoué."
-
-#: src/libslic3r/PrintConfig.cpp:2937
+#: src/libslic3r/PrintConfig.cpp:3101
msgid "Hollowing is done in two steps: first, an imaginary interior is calculated deeper (offset plus the closing distance) in the object and then it's inflated back to the specified offset. A greater closing distance makes the interior more rounded. At zero, the interior will resemble the exterior the most."
-msgstr "L'Évidement se fait en deux temps : tout d'abord, un intérieur fictif est calculé plus profondément (décalage plus distance de fermeture) dans l'objet puis il est ré-augmenté jusqu'au décalage spécifié. Une distance de fermeture plus importante rend l'intérieur plus rond. À zéro, l'intérieur sera très semblable à l'extérieur."
+msgstr "L'Évidement se fait en deux temps : tout d'abord, un intérieur fictif est calculé plus profondément (décalage plus intervalle d'espacement) dans l'objet puis il est ré-augmenté jusqu'au décalage spécifié. Une distance de fermeture plus importante rend l'intérieur plus rond. À zéro, l'intérieur sera très semblable à l'extérieur."
-#: src/libslic3r/SLAPrintSteps.cpp:43
+#: src/libslic3r/SLAPrintSteps.cpp:44
msgid "Hollowing model"
msgstr "Évidement du modèle"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:813
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:624
msgid "Hollowing parameter change"
msgstr "Modification des paramètres d'évidement"
-#: src/libslic3r/PrintConfig.cpp:850 src/libslic3r/PrintConfig.cpp:2011
+#: src/libslic3r/PrintConfig.cpp:888 src/libslic3r/PrintConfig.cpp:2153
msgid "Honeycomb"
msgstr "Nid d'abeille"
-#: src/slic3r/GUI/Tab.cpp:1064
+#: src/slic3r/GUI/Tab.cpp:1386
msgid "Horizontal shells"
msgstr "Coques horizontales"
-#: src/libslic3r/PrintConfig.cpp:245
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:253
+msgid "Horizontal Slider"
+msgstr "Barre de Défilement Horizontale"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:209
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:213
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:238
+msgid "Horizontal slider - Move active thumb Left"
+msgstr "Barre de défilement horizontale - Déplacer le curseur actif vers la Gauche"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:210
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:214
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:239
+msgid "Horizontal slider - Move active thumb Right"
+msgstr "Barre de défilement horizontale - Déplacer le curseur actif vers la Droite"
+
+#: src/libslic3r/PrintConfig.cpp:279
msgid "Horizontal width of the brim that will be printed around each object on the first layer."
msgstr "Largeur horizontale de la bordure qui sera imprimée autour de chaque objet sur la première couche."
-#: src/slic3r/GUI/PrintHostDialogs.cpp:152
+#: src/slic3r/GUI/PrintHostDialogs.cpp:150
msgid "Host"
msgstr "L'Hôte"
-#: src/libslic3r/PrintConfig.cpp:1332
+#: src/libslic3r/PrintConfig.cpp:1440
msgid "Host Type"
msgstr "Type d'hôte"
@@ -3398,197 +3958,275 @@ msgstr "Type d'hôte"
msgid "Hostname"
msgstr "Nom d'hôte"
-#: src/libslic3r/PrintConfig.cpp:97
+#: src/libslic3r/PrintConfig.cpp:99
msgid "Hostname, IP or URL"
msgstr "Nom d'hôte, IP ou URL"
-#: src/slic3r/GUI/Tab.cpp:139
-msgid ""
-"Hover the cursor over buttons to find more information \n"
-"or click this button."
-msgstr ""
-"Passez le curseur au dessus des boutons pour obtenir plus d'informations\n"
-"ou cliquez sur ce bouton."
+#: src/slic3r/GUI/Tab.cpp:210
+msgid "Hover the cursor over buttons to find more information \nor click this button."
+msgstr "Passez le curseur au dessus des boutons pour obtenir plus d'informations\nou cliquez sur ce bouton."
-#: src/libslic3r/PrintConfig.cpp:2812
+#: src/libslic3r/PrintConfig.cpp:2976
msgid "How far should the pad extend around the contained geometry"
msgstr "Jusqu'où le socle doit-il s'étendre autour de la géométrie contenue"
-#: src/libslic3r/PrintConfig.cpp:2901
+#: src/libslic3r/PrintConfig.cpp:3065
msgid "How much should the tiny connectors penetrate into the model body."
msgstr "À quelle profondeur les petits connecteurs doivent-ils pénétrer dans le corps du modèle."
-#: src/libslic3r/PrintConfig.cpp:2631
+#: src/libslic3r/PrintConfig.cpp:2774
msgid "How much the pinhead has to penetrate the model surface"
msgstr "Niveau de pénétration de l'épingle dans la surface du modèle"
-#: src/libslic3r/PrintConfig.cpp:2755
+#: src/libslic3r/PrintConfig.cpp:2919
msgid "How much the supports should lift up the supported object. If \"Pad around object\" is enabled, this value is ignored."
msgstr "A quel point les supports devraient soutenir l'objet supporté. Si la fonction \"Socle autour de l'objet\" est activée, cette valeur est ignorée."
-#: src/libslic3r/PrintConfig.cpp:111
+#: src/libslic3r/PrintConfig.cpp:1209
+msgid "How to apply limits"
+msgstr "Comment appliquer des limites"
+
+#: src/libslic3r/PrintConfig.cpp:1203
+msgid "How to apply the Machine Limits"
+msgstr "Comment appliquer les limites de la machine"
+
+#: src/libslic3r/PrintConfig.cpp:163
+msgid "HTTP digest"
+msgstr "HTTP digest"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:358
+#: src/libslic3r/PrintConfig.cpp:113
msgid "HTTPS CA File"
msgstr "HTTPS CA Fichier"
-#: src/slic3r/GUI/Tab.cpp:1713
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:319
msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate."
msgstr "Le fichier HTTPS CA est optionnel. Il est uniquement requis si vous utilisez le HTTPS avec un certificat auto-signé."
-#: src/slic3r/GUI/Preferences.cpp:222
+#: src/slic3r/GUI/Preferences.cpp:376
msgid "Icon size in a respect to the default size"
msgstr "Taille de l'icône par rapport à la taille par défaut"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:149
+#: src/slic3r/GUI/PrintHostDialogs.cpp:147
msgid "ID"
msgstr "ID"
-#: src/libslic3r/PrintConfig.cpp:1873
+#: src/libslic3r/PrintConfig.cpp:2015
msgid "If checked, supports will be generated automatically based on the overhang threshold value. If unchecked, supports will be generated inside the \"Support Enforcer\" volumes only."
msgstr "Si cette case est cochée, les supports seront générés automatiquement en fonction de la valeur seuil de surplomb. Si cette case n'est pas cochée, les supports seront générés uniquement dans les volumes \"Générateur de supports\"."
-#: src/slic3r/GUI/ConfigWizard.cpp:773
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:1132
+#, possible-c-format
msgid "If enabled, %s checks for new application versions online. When a new version becomes available, a notification is displayed at the next application startup (never during program usage). This is only a notification mechanisms, no automatic installation is done."
msgstr "Si activé, %s vérifie en ligne l'existence de nouvelles versions de Slic3r PE. Lorsqu'une nouvelle version est disponible, une notification est affichée au démarrage suivant de l'application (jamais pendant l'utilisation du programme). Ceci est uniquement un mécanisme de notification, aucune installation automatique n'est faite."
-#: src/slic3r/GUI/ConfigWizard.cpp:783
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:1142
+#, possible-c-format
msgid "If enabled, %s downloads updates of built-in system presets in the background.These updates are downloaded into a separate temporary location.When a new preset version becomes available it is offered at application startup."
msgstr "Si activé, %s télécharge les mises à jours des préréglages système intégrés en arrière-plan. Ces mises à jour sont téléchargées dans un répertoire temporaire séparé. Lorsqu'une nouvelle version de préréglages est disponible, elle est proposée au démarrage de l'application."
-#: src/libslic3r/PrintConfig.cpp:1852
+#: src/libslic3r/PrintConfig.cpp:1994
msgid "If enabled, all printing extruders will be primed at the front edge of the print bed at the start of the print."
msgstr "Si ceci est activé, tous les extrudeurs qui impriment seront positionnés sur la bordure avant du lit d'impression au début de l'impression."
-#: src/slic3r/GUI/ConfigWizard.cpp:805
-msgid ""
-"If enabled, allows the Reload from disk command to automatically find and load the files when invoked.\n"
-"If not enabled, the Reload from disk command will ask to select each file using an open file dialog."
-msgstr ""
-"Si activé, permet à la commande Recharger à partir du disque de rechercher et de charger automatiquement les fichiers lorsqu'elle est invoquée.\n"
-"Si non activée, la commande Recharger à partir du disque demandera de sélectionner chaque fichier à l'aide d'une boîte de dialogue d'ouverture de fichier."
+#: src/slic3r/GUI/ConfigWizard.cpp:1164
+msgid "If enabled, allows the Reload from disk command to automatically find and load the files when invoked.\nIf not enabled, the Reload from disk command will ask to select each file using an open file dialog."
+msgstr "Si activé, permet à la commande Recharger à partir du disque de rechercher et de charger automatiquement les fichiers lorsqu'elle est invoquée.\nSi non activée, la commande Recharger à partir du disque demandera de sélectionner chaque fichier à l'aide d'une boîte de dialogue d'ouverture de fichier."
-#: src/slic3r/GUI/Preferences.cpp:74
+#: src/slic3r/GUI/Preferences.cpp:91
msgid "If enabled, allows the Reload from disk command to automatically find and load the files when invoked."
msgstr "Si activé, permet à la commande Recharger à partir du disque de rechercher et de charger automatiquement les fichiers lorsqu'elle est invoquée."
-#: src/slic3r/GUI/Preferences.cpp:66
+#: src/slic3r/GUI/Preferences.cpp:238
+msgid "If enabled, changes made using the sequential slider, in preview, apply only to gcode top layer. If disabled, changes made using the sequential slider, in preview, apply to the whole gcode."
+msgstr "Si activé, les modifications apportées à l'aide de la barre de défilement séquentielle, dans l'aperçu, s'appliquent uniquement à la couche supérieure du gcode. Si désactivé, les modifications effectuées à l'aide de la barre de défilement séquentielle, dans l'aperçu, s'appliquent à l'ensemble du gcode."
+
+#: src/slic3r/GUI/Preferences.cpp:83
msgid "If enabled, PrusaSlicer will check for the new versions of itself online. When a new version becomes available a notification is displayed at the next application startup (never during program usage). This is only a notification mechanisms, no automatic installation is done."
msgstr "Si activé, PrusaSlicer vérifie l'existence de ses nouvelles versions en ligne . Lorsqu'une nouvelle version est disponible, une notification est affichée au prochain démarrage de l'application (jamais pendant l'utilisation du programme). Ceci est uniquement un mécanisme de notification, aucune installation automatique n'est faite."
-#: src/slic3r/GUI/Preferences.cpp:82
+#: src/slic3r/GUI/Preferences.cpp:270
+msgid "If enabled, renders object using the environment map."
+msgstr "Si activé, rend l'objet à l'aide de la carte d'environnement."
+
+#: src/slic3r/GUI/Preferences.cpp:200
+msgid "If enabled, reverses the direction of zoom with mouse wheel"
+msgstr "Si activé, inverse la direction du zoom avec la molette de la souris"
+
+#: src/slic3r/GUI/Preferences.cpp:93
+msgid "If enabled, sets PrusaSlicer as default application to open .3mf files."
+msgstr "Si activé, définit PrusaSlicer comme application par défaut pour ouvrir les fichiers .3mf."
+
+#: src/slic3r/GUI/Preferences.cpp:100
+msgid "If enabled, sets PrusaSlicer as default application to open .stl files."
+msgstr "Si activé, définit PrusaSlicer comme l'application par défaut pour ouvrir les fichiers .stl."
+
+#: src/slic3r/GUI/Preferences.cpp:179
+msgid "If enabled, sets PrusaSlicer G-code Viewer as default application to open .gcode files."
+msgstr "Si activé, définit la Visualisation de G-code de PrusaSlicer comme application par défaut pour ouvrir les fichiers .gcode."
+
+#: src/slic3r/GUI/Preferences.cpp:99
msgid "If enabled, Slic3r downloads updates of built-in system presets in the background. These updates are downloaded into a separate temporary location. When a new preset version becomes available it is offered at application startup."
msgstr "Si activé, Slic3r télécharge les mises à jours des préréglages système intégrés en arrière-plan. Ces mises à jour sont téléchargées dans un répertoire temporaire séparé. Lorsqu'une nouvelle version de préréglages est disponible, elle est proposée au démarrage de l'application."
-#: src/slic3r/GUI/Preferences.cpp:106
+#: src/slic3r/GUI/Preferences.cpp:137
msgid "If enabled, the 3D scene will be rendered in Retina resolution. If you are experiencing 3D performance problems, disabling this option may help."
msgstr "Si ceci est activé, la scène 3D sera affichée avec la résolution Retina. Si vous rencontrez des problèmes de performance 3D, le fait de désactiver cette option vous aidera peut-être."
-#: src/libslic3r/PrintConfig.cpp:1696
+#: src/slic3r/GUI/Preferences.cpp:215
+msgid "If enabled, the button for the collapse sidebar will be appeared in top right corner of the 3D Scene"
+msgstr "Si activé, le bouton de réduction de la barre latérale apparaîtra dans le coin supérieur droit de la scène 3D"
+
+#: src/libslic3r/PrintConfig.cpp:3698
+msgid "If enabled, the command line arguments are sent to an existing instance of GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides the \"single_instance\" configuration value from application preferences."
+msgstr "Si activé, les arguments de ligne de commande sont envoyés à une instance existante de la GUI de PrusaSlicer, ou une fenêtre existante de PrusaSlicer est activée. Remplace la valeur de configuration \"single_instance\" des préférences de l'application."
+
+#: src/slic3r/GUI/Preferences.cpp:294
+msgid "If enabled, the descriptions of configuration parameters in settings tabs wouldn't work as hyperlinks. If disabled, the descriptions of configuration parameters in settings tabs will work as hyperlinks."
+msgstr "Si activé, les descriptions des paramètres de configuration dans les onglets de réglage ne fonctionneront pas comme hyperliens. Si désactivé, les descriptions des paramètres de configuration dans les onglets de réglage fonctionneront comme hyperliens."
+
+#: src/slic3r/GUI/Preferences.cpp:209
+msgid "If enabled, the legacy 3DConnexion devices settings dialog is available by pressing CTRL+M"
+msgstr "Si activé, la boite de dialogue pour configurer les dispositifs 3DConnexion devient accessible en appuyant sur CTRL+M"
+
+#: src/libslic3r/PrintConfig.cpp:1804
msgid "If enabled, the skirt will be as tall as a highest printed object. This is useful to protect an ABS or ASA print from warping and detaching from print bed due to wind draft."
msgstr "Si elle est activée, la jupe sera aussi haute que l'objet imprimé le plus haut. Cela sert à protéger les impressions ABS ou ASA des phénomènes de déformation ou de décollement du plateau d'impression liés au flux d'air."
-#: src/libslic3r/PrintConfig.cpp:1858
+#: src/libslic3r/PrintConfig.cpp:2000
msgid "If enabled, the wipe tower will not be printed on layers with no toolchanges. On layers with a toolchange, extruder will travel downward to print the wipe tower. User is responsible for ensuring there is no collision with the print."
msgstr "Si elle est activée, la tour de nettoyage ne sera pas imprimée sur des couches sans changement d'outil. Sur les couches avec un changement d'outil, l'extrudeur se déplacera vers le bas pour imprimer la tour de nettoyage. C'est à l'utilisateur de s'assurer qu'il n'y a pas de collision avec l'impression."
-#: src/slic3r/GUI/Preferences.cpp:128
+#: src/slic3r/GUI/Preferences.cpp:193
msgid "If enabled, use free camera. If not enabled, use constrained camera."
msgstr "Si activé, utilise la caméra libre. Si non activé, utilise la caméra contrainte."
-#: src/slic3r/GUI/Preferences.cpp:121
+#: src/slic3r/GUI/Preferences.cpp:186
msgid "If enabled, use perspective camera. If not enabled, use orthographic camera."
msgstr "Si activé, utilise la l'appareil photo en perspective. Si n'est pas activé, utilise l'appareil photo en vue orthographique."
-#: src/slic3r/GUI/Preferences.cpp:145
+#: src/slic3r/GUI/Preferences.cpp:222
msgid "If enabled, you can change size of toolbar icons manually."
msgstr "Si activé, vous pouvez changer la taille des icônes de la barre d'outils manuellement."
-#: src/slic3r/GUI/PresetHints.cpp:29
+#: src/slic3r/GUI/PresetHints.cpp:28
msgid "If estimated layer time is below ~%1%s, fan will run at %2%%% and print speed will be reduced so that no less than %3%s are spent on that layer (however, speed will never be reduced below %4%mm/s)."
msgstr "Si le temps de couche estimé est inférieur à ~%1%s, le ventilateur tournera à %2%%% et la vitesse d'impression sera réduite pour qu'au moins %3%s soient passées sur cette couche (cependant, la vitesse ne sera jamais réduite en-dessous de %4%mm/s)."
-#: src/slic3r/GUI/PresetHints.cpp:36
+#: src/slic3r/GUI/PresetHints.cpp:35
msgid "If estimated layer time is greater, but still below ~%1%s, fan will run at a proportionally decreasing speed between %2%%% and %3%%%."
msgstr "Si le temps estimé pour la couche est supérieur, mais cependant inférieur à ~%1%s, le ventilateur tournera à une vitesse proportionnellement décroissante entre %2%%% et %3%%%."
-#: src/libslic3r/PrintConfig.cpp:901
+#: src/libslic3r/PrintConfig.cpp:943
msgid "If expressed as absolute value in mm/s, this speed will be applied to all the print moves of the first layer, regardless of their type. If expressed as a percentage (for example: 40%) it will scale the default speeds."
msgstr "Si exprimée avec une valeur absolue en mm/s, cette vitesse sera appliquée à tous les déplacements d'impression de la première couche, quel que soit leur type. Si exprimée comme un pourcentage (par exemple 40%), cela modulera la vitesse par défaut."
-#: src/libslic3r/PrintConfig.cpp:573
+#: src/libslic3r/PrintConfig.cpp:609
msgid "If layer print time is estimated below this number of seconds, fan will be enabled and its speed will be calculated by interpolating the minimum and maximum speeds."
msgstr "Si le temps d'impression estimé de la couche est inférieur à ce nombre de secondes, le ventilateur sera activé et sa vitesse calculée par interpolation des vitesses minimum et maximum."
-#: src/libslic3r/PrintConfig.cpp:1706
+#: src/libslic3r/PrintConfig.cpp:1821
msgid "If layer print time is estimated below this number of seconds, print moves speed will be scaled down to extend duration to this value."
msgstr "Si le temps d'impression estimé de la couche est inférieur à ce nombre de secondes, la vitesse des déplacements d'impression sera réduite afin d'atteindre cette valeur."
-#: src/libslic3r/PrintConfig.cpp:567
+#: src/libslic3r/PrintConfig.cpp:603
msgid "If this is enabled, fan will never be disabled and will be kept running at least at its minimum speed. Useful for PLA, harmful for ABS."
msgstr "Si ceci est activé, le ventilateur ne sera jamais désactivé et sera maintenu au moins à sa vitesse minimum. Utile pour le PLA, mais risqué pour l'ABS."
-#: src/slic3r/GUI/Preferences.cpp:49
+#: src/slic3r/GUI/Preferences.cpp:66
msgid "If this is enabled, Slic3r will auto-center objects around the print bed center."
msgstr "Si ceci est activé, Slic3r centrera automatique les objets autour du centre du plateau d'impression."
-#: src/slic3r/GUI/Preferences.cpp:57
+#: src/slic3r/GUI/Preferences.cpp:74
msgid "If this is enabled, Slic3r will pre-process objects as soon as they're loaded in order to save time when exporting G-code."
msgstr "Si ceci est activé, Slic3r va pré-calculer les objets dès qu'ils sont chargés pour gagner du temps lors de l'export du G-code."
-#: src/slic3r/GUI/Preferences.cpp:41
+#: src/slic3r/GUI/Preferences.cpp:54
msgid "If this is enabled, Slic3r will prompt the last output directory instead of the one containing the input files."
msgstr "Si ceci est activé, Slic3r affichera le dernier répertoire de sortie au lieu de celui contenant les fichiers d'entrée."
-#: src/libslic3r/PrintConfig.cpp:1562
+#: src/slic3r/GUI/Preferences.cpp:125
+msgid "If this is enabled, when starting PrusaSlicer and another instance of the same PrusaSlicer is already running, that instance will be reactivated instead."
+msgstr "Si cela est activé, lors du démarrage de PrusaSlicer et si une autre instance du même PrusaSlicer est déjà en cours d'exécution, cette instance sera réactivée à la place."
+
+#: src/libslic3r/PrintConfig.cpp:1670
msgid "If you set this to a positive value, Z is quickly raised every time a retraction is triggered. When using multiple extruders, only the setting for the first extruder will be considered."
msgstr "Si vous indiquez une valeur positive, l'axe Z est rapidement élevé à chaque rétraction. Lorsque vous utilisez plusieurs extrudeurs, seul le réglage du premier extrudeur sera pris en compte."
-#: src/libslic3r/PrintConfig.cpp:1571
+#: src/libslic3r/PrintConfig.cpp:1679
msgid "If you set this to a positive value, Z lift will only take place above the specified absolute Z. You can tune this setting for skipping lift on the first layers."
msgstr "Si vous indiquez une valeur positive, le levage de l'axe Z ne sera déclenché qu'à partir de la valeur absolue indiquée pour l'axe Z. Vous pouvez modifier ce réglage pour éviter le levage de l'axe Z sur les premières couches."
-#: src/libslic3r/PrintConfig.cpp:1580
+#: src/libslic3r/PrintConfig.cpp:1688
msgid "If you set this to a positive value, Z lift will only take place below the specified absolute Z. You can tune this setting for limiting lift to the first layers."
msgstr "Si vous indiquez une valeur positive, le levage de l'axe Z ne sera déclenché que jusqu'à la valeur absolue indiquée pour l'axe Z. Vous pouvez modifier ce réglage pour limiter le levage de l'axe Z aux premières couches."
-#: src/libslic3r/PrintConfig.cpp:1454
+#: src/libslic3r/PrintConfig.cpp:1562
msgid "If you want to process the output G-code through custom scripts, just list their absolute paths here. Separate multiple scripts with a semicolon. Scripts will be passed the absolute path to the G-code file as the first argument, and they can access the Slic3r config settings by reading environment variables."
msgstr "Si vous voulez traiter le G-code de sortie à l'aide de scripts personnalisés, listez simplement leurs chemins absolus ici. Séparez les divers scripts avec un point virgule. Les scripts vont recevoir en premier argument le chemin absolu du fichier G-code, et ils peuvent accéder aux réglages de configuration de Slic3r en lisant des variables d'environnement."
-#: src/libslic3r/PrintConfig.cpp:530
+#: src/libslic3r/PrintConfig.cpp:566
msgid "If your firmware doesn't handle the extruder displacement you need the G-code to take it into account. This option lets you specify the displacement of each extruder with respect to the first one. It expects positive coordinates (they will be subtracted from the XY coordinate)."
msgstr "Si le firmware de votre imprimante ne gère pas le décalage de l'extrudeur, c'est au G-code d'en tenir compte. Cette option vous permet de spécifier le décalage de chaque extrudeur par rapport au premier. Des valeurs positives sont attendues (elles seront soustraites des coordonnées XY)."
-#: src/libslic3r/PrintConfig.cpp:2169
+#: src/libslic3r/PrintConfig.cpp:2312
msgid "If your firmware requires relative E values, check this, otherwise leave it unchecked. Most firmwares use absolute values."
msgstr "Si votre firmware requiert des valeurs relatives pour E, cochez cette case, sinon laissez-la décochée. La plupart des firmwares utilisent des valeurs absolues."
-#: src/libslic3r/PrintConfig.cpp:3485
+#: src/libslic3r/PrintConfig.cpp:1219
+msgid "Ignore"
+msgstr "Ignorer"
+
+#: src/libslic3r/PrintConfig.cpp:3684
msgid "Ignore non-existent config files"
msgstr "Ignorer les fichiers de configuration non-existants"
-#: src/slic3r/GUI/MainFrame.cpp:464
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:192
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:173
+msgid "Ignores facets facing away from the camera."
+msgstr "Ignore les facettes opposées à la caméra."
+
+#: src/slic3r/GUI/MainFrame.cpp:1055
msgid "Import &Config"
msgstr "Importer la &Configuration"
-#: src/slic3r/GUI/MainFrame.cpp:471
+#: src/slic3r/GUI/MainFrame.cpp:1062
msgid "Import Config &Bundle"
msgstr "Importer le &Lot de Configuration"
-#: src/slic3r/GUI/MainFrame.cpp:467
+#: src/slic3r/GUI/MainFrame.cpp:1058
msgid "Import Config from &project"
msgstr "Importer la Configuration depuis le &projet"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:119
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:112
msgid "Import Config from ini/amf/3mf/gcode"
msgstr "Importer une Configuration depuis ini/amf/3mf/gcode"
-#: src/slic3r/GUI/Plater.cpp:4603
+#: src/slic3r/GUI/Plater.cpp:1419
+msgid "Import config only"
+msgstr "Importer la configuration uniquement"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:39
+msgid "Import file"
+msgstr "Importer le fichier"
+
+#: src/slic3r/GUI/Plater.cpp:1418
+msgid "Import geometry only"
+msgstr "Importer la géométrie uniquement"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:46
+msgid "Import model and profile"
+msgstr "Importer le modèle et le profil"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48
+msgid "Import model only"
+msgstr "Importer le modèle uniquement"
+
+#: src/slic3r/GUI/Plater.cpp:4655
msgid "Import Object"
msgstr "Importer l'Objet"
-#: src/slic3r/GUI/Plater.cpp:4607
+#: src/slic3r/GUI/Plater.cpp:4659
msgid "Import Objects"
msgstr "Importer les Objets"
@@ -3596,476 +4234,581 @@ msgstr "Importer les Objets"
msgid "Import of the repaired 3mf file failed"
msgstr "Échec de l'import du fichier 3mf réparé"
-#: src/slic3r/GUI/MainFrame.cpp:460
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47
+msgid "Import profile only"
+msgstr "Importer le profil uniquement"
+
+#: src/slic3r/GUI/MainFrame.cpp:1050
+msgid "Import SL1 archive"
+msgstr "Importer l'archive SL1"
+
+#: src/slic3r/GUI/Plater.cpp:1561
+msgid "Import SLA archive"
+msgstr "Importer l'archive SLA"
+
+#: src/slic3r/GUI/MainFrame.cpp:1046
+msgid "Import STL (imperial units)"
+msgstr "Importer le STL (unités impériales)"
+
+#: src/slic3r/GUI/MainFrame.cpp:1042
msgid "Import STL/OBJ/AM&F/3MF"
msgstr "Importer STL/OBJ/AM&F/3MF"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:118
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:111
msgid "Import STL/OBJ/AMF/3MF without config, keep plater"
msgstr "Importer un STL/OBJ/AMF/3MF sans configuration, conserver le plateau"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3422
-#, c-format
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:159
+msgid "Importing canceled."
+msgstr "Importation annulée."
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:160
+msgid "Importing done."
+msgstr "Importation terminée."
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135
+msgid "Importing SLA archive"
+msgstr "Importation de l'archive SLA"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487
+msgid "in"
+msgstr "in"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3885
+#, possible-c-format
msgid "In this mode you can select only other %s Items%s"
msgstr "Dans ce mode vous ne pouvez sélectionner que d'autres %s Items %s"
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:423
+msgid "Inches"
+msgstr "Pouces"
+
#: src/slic3r/GUI/UpdateDialogs.cpp:230
msgid "Incompatible bundles:"
msgstr "Lots incompatibles :"
+#: src/slic3r/GUI/PresetComboBoxes.cpp:241
+msgid "Incompatible presets"
+msgstr "Préréglages incompatibles"
+
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75
-#, c-format
+#, possible-c-format
msgid "Incompatible with this %s"
msgstr "Incompatible avec ce %s"
-#: src/slic3r/GUI/Plater.cpp:4685
+#: src/slic3r/GUI/Plater.cpp:4790
msgid "Increase Instances"
msgstr "Augmenter les Instances"
-#: src/slic3r/GUI/GLCanvas3D.cpp:264
+#: src/slic3r/GUI/GLCanvas3D.cpp:251
msgid "Increase/decrease edit area"
msgstr "Augmenter/diminuer la zone d'édition"
-#: src/slic3r/GUI/Plater.cpp:2922
-msgid "Indexing hollowed object"
-msgstr "Indexation de l'objet évidé"
-
#. TRN Description for "UNLOCKED LOCK"
-#: src/slic3r/GUI/Tab.cpp:3258
-msgid ""
-"indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\n"
-"Click the UNLOCKED LOCK icon to reset all settings for current option group to the system (or default) values."
-msgstr ""
-"indique que certains paramètres ont été modifiés et ne sont pas égaux aux valeurs du système (ou par défaut) pour le groupe d'options actuel.\n"
-"Cliquez sur l'icône CADENAS OUVERT pour régler tous les paramètres pour le groupe d'options actuel sur les valeurs du système (ou par défaut)."
+#: src/slic3r/GUI/Tab.cpp:3695
+msgid "indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\nClick the UNLOCKED LOCK icon to reset all settings for current option group to the system (or default) values."
+msgstr "indique que certains paramètres ont été modifiés et ne sont pas égaux aux valeurs du système (ou par défaut) pour le groupe d'options actuel.\nCliquez sur l'icône CADENAS OUVERT pour régler tous les paramètres pour le groupe d'options actuel sur les valeurs du système (ou par défaut)."
#. TRN Description for "LOCKED LOCK"
-#: src/slic3r/GUI/Tab.cpp:3254
+#: src/slic3r/GUI/Tab.cpp:3691
msgid "indicates that the settings are the same as the system (or default) values for the current option group"
msgstr "indique que les paramètres sont les mêmes que les valeurs système (ou par défaut) pour le groupe d'options en cours"
#. TRN Description for "BACK ARROW"
-#: src/slic3r/GUI/Tab.cpp:3270
-msgid ""
-"indicates that the settings were changed and are not equal to the last saved preset for the current option group.\n"
-"Click the BACK ARROW icon to reset all settings for the current option group to the last saved preset."
-msgstr ""
-"indique que les paramètres ont été changés et qu'ils ne sont pas identiques au dernier préréglage enregistré du groupe d'options en cours.\n"
-"Cliquez sur l'icône FLÈCHE ARRIÈRE pour restaurer tous les paramètres du groupe d'options en cours avec les valeurs du dernier préréglage enregistré."
-
-#: src/slic3r/GUI/ConfigManipulation.cpp:211
-#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:96
-#: src/slic3r/GUI/GUI_ObjectList.cpp:614 src/slic3r/GUI/Plater.cpp:527
-#: src/slic3r/GUI/Tab.cpp:1091 src/slic3r/GUI/Tab.cpp:1092
-#: src/libslic3r/PrintConfig.cpp:203 src/libslic3r/PrintConfig.cpp:416
-#: src/libslic3r/PrintConfig.cpp:436 src/libslic3r/PrintConfig.cpp:776
-#: src/libslic3r/PrintConfig.cpp:790 src/libslic3r/PrintConfig.cpp:827
-#: src/libslic3r/PrintConfig.cpp:981 src/libslic3r/PrintConfig.cpp:991
-#: src/libslic3r/PrintConfig.cpp:1009 src/libslic3r/PrintConfig.cpp:1028
-#: src/libslic3r/PrintConfig.cpp:1047 src/libslic3r/PrintConfig.cpp:1728
-#: src/libslic3r/PrintConfig.cpp:1745
+#: src/slic3r/GUI/Tab.cpp:3707
+msgid "indicates that the settings were changed and are not equal to the last saved preset for the current option group.\nClick the BACK ARROW icon to reset all settings for the current option group to the last saved preset."
+msgstr "indique que les paramètres ont été changés et qu'ils ne sont pas identiques au dernier préréglage enregistré du groupe d'options en cours.\nCliquez sur l'icône FLÈCHE ARRIÈRE pour restaurer tous les paramètres du groupe d'options en cours avec les valeurs du dernier préréglage enregistré."
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:210
+#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:93
+#: src/slic3r/GUI/GUI_ObjectList.cpp:652 src/slic3r/GUI/Plater.cpp:393
+#: src/slic3r/GUI/Tab.cpp:1413 src/slic3r/GUI/Tab.cpp:1414
+#: src/libslic3r/PrintConfig.cpp:237 src/libslic3r/PrintConfig.cpp:450
+#: src/libslic3r/PrintConfig.cpp:472 src/libslic3r/PrintConfig.cpp:812
+#: src/libslic3r/PrintConfig.cpp:826 src/libslic3r/PrintConfig.cpp:863
+#: src/libslic3r/PrintConfig.cpp:1025 src/libslic3r/PrintConfig.cpp:1035
+#: src/libslic3r/PrintConfig.cpp:1053 src/libslic3r/PrintConfig.cpp:1072
+#: src/libslic3r/PrintConfig.cpp:1091 src/libslic3r/PrintConfig.cpp:1843
+#: src/libslic3r/PrintConfig.cpp:1860
msgid "Infill"
msgstr "Remplissage"
-#: src/slic3r/GUI/PresetHints.cpp:174
+#: src/slic3r/GUI/PresetHints.cpp:173
msgid "infill"
msgstr "remplissage"
-#: src/libslic3r/PrintConfig.cpp:1021
+#: src/libslic3r/PrintConfig.cpp:1065
msgid "Infill before perimeters"
msgstr "Remplissage avant les périmètres"
-#: src/libslic3r/PrintConfig.cpp:1001
+#: src/libslic3r/PrintConfig.cpp:1045
msgid "Infill extruder"
msgstr "Extrudeur pour le remplissage"
-#: src/libslic3r/PrintConfig.cpp:1036
+#: src/libslic3r/PrintConfig.cpp:1080
msgid "Infill/perimeters overlap"
msgstr "Chevauchement remplissage/périmètres"
-#: src/libslic3r/Print.cpp:1584
+#: src/libslic3r/Print.cpp:1610
msgid "Infilling layers"
msgstr "Remplissage des couches"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3430
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3505 src/slic3r/GUI/Plater.cpp:141
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3893
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3968 src/slic3r/GUI/Plater.cpp:147
msgid "Info"
msgstr "Info"
-#: src/libslic3r/PrintConfig.cpp:1057
+#: src/slic3r/GUI/GUI_App.cpp:1087 src/slic3r/GUI/Tab.cpp:3435
+msgid "Information"
+msgstr "Information"
+
+#: src/libslic3r/PrintConfig.cpp:1101
msgid "Inherits profile"
msgstr "Hérite du profil"
-#: src/libslic3r/SLAPrint.cpp:653
+#: src/libslic3r/SLAPrint.cpp:667
msgid "Initial exposition time is out of printer profile bounds."
msgstr "Le temps d'exposition initial est en dehors des limites du profil d'imprimante."
-#: src/libslic3r/PrintConfig.cpp:2564 src/libslic3r/PrintConfig.cpp:2565
+#: src/libslic3r/PrintConfig.cpp:2707 src/libslic3r/PrintConfig.cpp:2708
msgid "Initial exposure time"
msgstr "Temps d'exposition initial"
-#: src/libslic3r/PrintConfig.cpp:2482 src/libslic3r/PrintConfig.cpp:2483
+#: src/libslic3r/PrintConfig.cpp:2625 src/libslic3r/PrintConfig.cpp:2626
msgid "Initial layer height"
msgstr "Hauteur de couche initiale"
-#: src/slic3r/GUI/Field.cpp:204
+#: src/slic3r/GUI/Field.cpp:269
+#, possible-c-format
+msgid "Input value is out of range\nAre you sure that %s is a correct value and that you want to continue?"
+msgstr "La valeur d'entrée est hors limites\nÊtes-vous certain que %s est une valeur correcte et que vous voulez continuer ?"
+
+#: src/slic3r/GUI/Field.cpp:252 src/slic3r/GUI/Field.cpp:1370
msgid "Input value is out of range"
msgstr "La valeur entrée est hors plage"
-#: src/slic3r/GUI/GUI_App.cpp:800
+#: src/slic3r/GUI/GUI_App.cpp:1480
msgid "Inspect / activate configuration snapshots"
msgstr "Inspecter / activer les instantanés de configuration"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:60
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:216
-#, c-format
+#: src/slic3r/Utils/PresetUpdater.cpp:120
+msgid "install"
+msgstr "installer"
+
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:62
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:218
+#, possible-c-format
msgid "Instance %d"
msgstr "Instance %d"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2500
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2892
msgid "Instance manipulation"
msgstr "Manipulation d'instance"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:56
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:58
msgid "Instances"
msgstr "Instances"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1091
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3781
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1215
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4244
msgid "Instances to Separated Objects"
msgstr "Instances vers les Objets Séparés"
-#: src/libslic3r/PrintConfig.cpp:1973
+#: src/libslic3r/PrintConfig.cpp:2115
msgid "Interface layers"
msgstr "Couches d'interface"
-#: src/libslic3r/PrintConfig.cpp:1957
+#: src/libslic3r/PrintConfig.cpp:2099
msgid "Interface loops"
msgstr "Boucles d'interface"
-#: src/libslic3r/PrintConfig.cpp:1982
+#: src/libslic3r/PrintConfig.cpp:2124
msgid "Interface pattern spacing"
msgstr "Espacement du motif d'interface"
-#: src/libslic3r/PrintConfig.cpp:1071
+#: src/libslic3r/PrintConfig.cpp:1115
msgid "Interface shells"
msgstr "Coques d'interface"
-#: src/libslic3r/Zipper.cpp:84
+#: src/libslic3r/miniz_extension.cpp:143
msgid "internal error"
msgstr "erreur interne"
-#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:313
+#: src/slic3r/GUI/GUI_Preview.cpp:304 src/libslic3r/ExtrusionEntity.cpp:317
+#: src/libslic3r/ExtrusionEntity.cpp:342
msgid "Internal infill"
msgstr "Remplissage interne"
-#: src/slic3r/GUI/Plater.cpp:3106
+#: src/slic3r/GUI/BedShapeDialog.cpp:145
+msgid "Invalid"
+msgstr "Invalide"
+
+#: src/slic3r/GUI/Plater.cpp:2906 src/slic3r/GUI/Plater.cpp:3583
msgid "Invalid data"
msgstr "Donnée non valide"
-#: src/slic3r/GUI/BedShapeDialog.cpp:494 src/slic3r/GUI/BedShapeDialog.cpp:543
-#: src/slic3r/GUI/BedShapeDialog.cpp:566
+#: src/slic3r/GUI/BedShapeDialog.cpp:570 src/slic3r/GUI/BedShapeDialog.cpp:619
+#: src/slic3r/GUI/BedShapeDialog.cpp:642
msgid "Invalid file format."
msgstr "Format de fichier non valide."
-#: src/libslic3r/Zipper.cpp:80
+#: src/libslic3r/miniz_extension.cpp:139
msgid "invalid filename"
msgstr "nom de fichier non valide"
-#: src/slic3r/GUI/ConfigManipulation.cpp:319
+#: src/slic3r/GUI/ConfigManipulation.cpp:324
msgid "Invalid Head penetration"
msgstr "Pénétration de Tête invalide"
-#: src/libslic3r/Zipper.cpp:48
+#: src/libslic3r/miniz_extension.cpp:107
msgid "invalid header or archive is corrupted"
msgstr "entête non valide ou archive corrompue"
-#: src/slic3r/GUI/Field.cpp:195 src/slic3r/GUI/Field.cpp:226
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:376
+#: src/slic3r/GUI/Field.cpp:375
+msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
+msgstr "Format d'entrée non valide. Vecteur de dimensions attendu dans le format suivant : \"%1%\""
+
+#: src/slic3r/GUI/Field.cpp:243 src/slic3r/GUI/Field.cpp:274
+#: src/slic3r/GUI/Field.cpp:1358 src/slic3r/GUI/GUI_ObjectLayers.cpp:413
msgid "Invalid numeric input."
msgstr "Entrée numérique non valide."
-#: src/libslic3r/Zipper.cpp:78
+#: src/libslic3r/miniz_extension.cpp:137
msgid "invalid parameter"
msgstr "paramètre non valide"
-#: src/slic3r/GUI/ConfigManipulation.cpp:332
+#: src/slic3r/GUI/ConfigManipulation.cpp:337
msgid "Invalid pinhead diameter"
msgstr "Diamètre de tête d'épingle non valide"
+#: src/slic3r/GUI/GUI_ObjectList.cpp:94 src/slic3r/GUI/GUI_ObjectList.cpp:653
+#: src/slic3r/GUI/GUI_Preview.cpp:307 src/slic3r/GUI/Tab.cpp:1420
+#: src/libslic3r/ExtrusionEntity.cpp:320 src/libslic3r/ExtrusionEntity.cpp:348
+#: src/libslic3r/PrintConfig.cpp:1126 src/libslic3r/PrintConfig.cpp:1132
+#: src/libslic3r/PrintConfig.cpp:1146 src/libslic3r/PrintConfig.cpp:1156
+msgid "Ironing"
+msgstr "Lissage"
+
+#: src/libslic3r/PrintConfig.cpp:1131 src/libslic3r/PrintConfig.cpp:1133
+msgid "Ironing Type"
+msgstr "Type de lissage"
+
+#: src/slic3r/GUI/GUI_App.cpp:243
+msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community."
+msgstr "est basé sur Slic3r par Alessandro Ranellucci et la communauté RepRap."
+
#. TRN "Slic3r _is licensed under the_ License"
-#: src/slic3r/GUI/AboutDialog.cpp:258
+#: src/slic3r/GUI/AboutDialog.cpp:283 src/slic3r/GUI/GUI_App.cpp:244
msgid "is licensed under the"
msgstr "est sous licence"
-#: src/slic3r/GUI/Tab.cpp:2941
-msgid "is not compatible with print profile"
-msgstr "n'est pas compatible avec le profil d'impression"
-
-#: src/slic3r/GUI/Tab.cpp:2940
-msgid "is not compatible with printer"
-msgstr "n'est pas compatible avec l'imprimante"
-
-#: src/slic3r/GUI/MainFrame.cpp:658
+#: src/slic3r/GUI/MainFrame.cpp:955 src/slic3r/GUI/MainFrame.cpp:1275
msgid "Iso"
msgstr "Isométrique"
-#: src/slic3r/GUI/MainFrame.cpp:658
+#: src/slic3r/GUI/MainFrame.cpp:955 src/slic3r/GUI/MainFrame.cpp:1275
msgid "Iso View"
msgstr "Vue Isométrique"
-#: src/slic3r/GUI/Tab.cpp:964
+#: src/slic3r/GUI/Tab.cpp:1282
msgid "It can't be deleted or modified."
msgstr "Il ne peut être supprimé ou modifié."
-#: src/slic3r/GUI/Plater.cpp:3321
+#: src/slic3r/GUI/Plater.cpp:3124
msgid "It is not allowed to change the file to reload"
msgstr "Il n'est pas autorisé de modifier le fichier à recharger"
-#: src/libslic3r/PrintConfig.cpp:974
+#: src/libslic3r/PrintConfig.cpp:1018
msgid "It may be beneficial to increase the extruder motor current during the filament exchange sequence to allow for rapid ramming feed rates and to overcome resistance when loading a filament with an ugly shaped tip."
msgstr "Il peut être intéressant d'augmenter le courant du moteur de l'extrudeur pendant la séquence d'échange de filament pour permettre un débit d'expulsion rapide et pour compenser la résistance lors du chargement d'un filament avec une pointe mal taillée."
-#: src/slic3r/GUI/GUI_App.cpp:1084 src/slic3r/GUI/Tab.cpp:2958
+#: src/slic3r/GUI/Tab.cpp:3413
+msgid "It's a last preset for this physical printer."
+msgstr "C'est le dernier préréglage pour cette imprimante physique."
+
+#: src/slic3r/GUI/GUI_App.cpp:1876 src/slic3r/GUI/Tab.cpp:3187
msgid "It's impossible to print multi-part object(s) with SLA technology."
msgstr "Il est impossible d'imprimer un (des) objet(s) en plusieurs parties avec la technologie SLA."
-#: src/slic3r/GUI/Tab.cpp:2229
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:601
+msgid "It's not possible to delete the last related preset for the printer."
+msgstr "Il n'est pas possible de supprimer le dernier préréglage associé pour l'imprimante."
+
+#: src/slic3r/GUI/Tab.cpp:2398
msgid "Jerk limits"
msgstr "Limites de mouvements brusques"
-#: src/libslic3r/PrintConfig.cpp:1649
+#: src/libslic3r/PrintConfig.cpp:1757
msgid "Jitter"
msgstr "Gigue"
-#: src/slic3r/GUI/DoubleSlider.cpp:957 src/slic3r/GUI/DoubleSlider.cpp:1529
-#: src/slic3r/GUI/DoubleSlider.cpp:1651
+#: src/slic3r/GUI/DoubleSlider.cpp:1077 src/slic3r/GUI/DoubleSlider.cpp:1721
+#: src/slic3r/GUI/DoubleSlider.cpp:1852 src/slic3r/GUI/DoubleSlider.cpp:1856
msgid "Jump to height"
msgstr "Sauter à la hauteur"
-#: src/slic3r/GUI/DoubleSlider.cpp:955
-#, c-format
-msgid "Jump to height %s or Set extruder sequence for the entire print"
-msgstr "Sauter à la hauteur %s ou Définir la séquence d'extrusion pour toute l'impression"
+#: src/slic3r/GUI/DoubleSlider.cpp:1223
+#, possible-c-format
+msgid "Jump to height %s\nor Set ruler mode"
+msgstr "Sauter à la hauteur %s\nou Définir le mode règle"
-#: src/libslic3r/PrintConfig.cpp:566
+#: src/slic3r/GUI/DoubleSlider.cpp:1220
+#, possible-c-format
+msgid "Jump to height %s\nSet ruler mode\nor Set extruder sequence for the entire print"
+msgstr "Sauter à la hauteur %s\nDéfinir le mode règle\nou Définir la séquence d'extrusion pour toute l'impression"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1071 src/slic3r/GUI/DoubleSlider.cpp:1852
+msgid "Jump to move"
+msgstr "Sauter pour bouger"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:315
+msgid "Just switch to \"%1%\" preset"
+msgstr "Passez simplement au préréglage \"%1%\""
+
+#: src/libslic3r/PrintConfig.cpp:602
msgid "Keep fan always on"
msgstr "Garder le ventilateur toujours actif"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:169
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:171
msgid "Keep lower part"
msgstr "Garder la partie du bas"
-#: src/slic3r/GUI/GLCanvas3D.cpp:304
+#: src/slic3r/GUI/GLCanvas3D.cpp:290
msgid "Keep min"
-msgstr "Garder au minimum"
+msgstr "Conserver min"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:168
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170
msgid "Keep upper part"
msgstr "Garder la partie du haut"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:41 src/slic3r/GUI/MainFrame.cpp:708
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:37
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:39 src/slic3r/GUI/MainFrame.cpp:941
+#: src/slic3r/GUI/MainFrame.cpp:1332
msgid "Keyboard Shortcuts"
msgstr "Raccourcis Clavier"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:245
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:259
msgid "Keyboard shortcuts"
msgstr "Raccourcis clavier"
-#: src/libslic3r/PrintConfig.cpp:2498
+#: src/libslic3r/PrintConfig.cpp:2641
msgid "kg"
msgstr "kg"
-#: src/libslic3r/PrintConfig.cpp:965
+#: src/libslic3r/PrintConfig.cpp:1009
msgid "Label objects"
msgstr "Marquer les objets"
-#: src/libslic3r/PrintConfig.cpp:2399
+#: src/libslic3r/PrintConfig.cpp:2542
msgid "Landscape"
msgstr "Paysage"
-#: src/slic3r/GUI/GUI_App.cpp:629
+#: src/slic3r/GUI/GUI_App.cpp:1295
msgid "Language"
msgstr "Langue"
-#: src/slic3r/GUI/GUI_App.cpp:885
+#: src/slic3r/GUI/GUI_App.cpp:1605 src/slic3r/GUI/GUI_App.cpp:1614
msgid "Language selection"
msgstr "Sélection de la langue"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2140
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2242
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2307
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2408
msgid "Last instance of an object cannot be deleted."
msgstr "La dernière instance d'un objet ne peut être supprimée."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3418
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3881
msgid "Layer"
msgstr "Couche"
-#: src/slic3r/GUI/ConfigManipulation.cpp:49
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1049
+#: src/slic3r/GUI/ConfigManipulation.cpp:48
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1371
#: src/libslic3r/PrintConfig.cpp:71
msgid "Layer height"
msgstr "Hauteur de couche"
-#: src/libslic3r/Print.cpp:1427
+#: src/libslic3r/Print.cpp:1453
msgid "Layer height can't be greater than nozzle diameter"
msgstr "La hauteur de couche ne peut pas être supérieure au diamètre de la buse"
-#: src/slic3r/GUI/Tab.cpp:2362
+#: src/slic3r/GUI/Tab.cpp:2531
msgid "Layer height limits"
msgstr "Limites de hauteur de couche"
-#: src/slic3r/GUI/ConfigWizard.cpp:2015
-msgid "Layer height:"
-msgstr "Hauteur de couche :"
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2488
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2880
msgid "Layer range Settings to modify"
msgstr "Réglages de zone de Couche à modifier"
#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:52
-#: src/libslic3r/PrintConfig.cpp:362 src/libslic3r/PrintConfig.cpp:994
-#: src/libslic3r/PrintConfig.cpp:1505 src/libslic3r/PrintConfig.cpp:1690
-#: src/libslic3r/PrintConfig.cpp:1750 src/libslic3r/PrintConfig.cpp:1930
-#: src/libslic3r/PrintConfig.cpp:1976
+#: src/libslic3r/PrintConfig.cpp:396 src/libslic3r/PrintConfig.cpp:1038
+#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:1798
+#: src/libslic3r/PrintConfig.cpp:1865 src/libslic3r/PrintConfig.cpp:2072
+#: src/libslic3r/PrintConfig.cpp:2118
msgid "layers"
msgstr "couches"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3512
-#: src/slic3r/GUI/Tab.cpp:3600
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3928
+#: src/slic3r/GUI/Tab.cpp:4010
msgid "Layers"
msgstr "Couches"
-#: src/slic3r/GUI/Tab.cpp:1048 src/slic3r/GUI/Tab.cpp:3598
+#: src/slic3r/GUI/Tab.cpp:1370 src/slic3r/GUI/Tab.cpp:4008
msgid "Layers and perimeters"
msgstr "Couches et périmètres"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:95
-#: src/slic3r/GUI/GUI_ObjectList.cpp:613 src/libslic3r/PrintConfig.cpp:72
-#: src/libslic3r/PrintConfig.cpp:175 src/libslic3r/PrintConfig.cpp:184
-#: src/libslic3r/PrintConfig.cpp:408 src/libslic3r/PrintConfig.cpp:470
-#: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:890
-#: src/libslic3r/PrintConfig.cpp:1075 src/libslic3r/PrintConfig.cpp:1374
-#: src/libslic3r/PrintConfig.cpp:1441 src/libslic3r/PrintConfig.cpp:1622
-#: src/libslic3r/PrintConfig.cpp:2074 src/libslic3r/PrintConfig.cpp:2133
-#: src/libslic3r/PrintConfig.cpp:2142
+#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:92
+#: src/slic3r/GUI/GUI_ObjectList.cpp:651 src/libslic3r/PrintConfig.cpp:72
+#: src/libslic3r/PrintConfig.cpp:209 src/libslic3r/PrintConfig.cpp:218
+#: src/libslic3r/PrintConfig.cpp:442 src/libslic3r/PrintConfig.cpp:506
+#: src/libslic3r/PrintConfig.cpp:514 src/libslic3r/PrintConfig.cpp:932
+#: src/libslic3r/PrintConfig.cpp:1119 src/libslic3r/PrintConfig.cpp:1482
+#: src/libslic3r/PrintConfig.cpp:1549 src/libslic3r/PrintConfig.cpp:1730
+#: src/libslic3r/PrintConfig.cpp:2217 src/libslic3r/PrintConfig.cpp:2276
+#: src/libslic3r/PrintConfig.cpp:2285
msgid "Layers and Perimeters"
msgstr "Couches et Périmètres"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
-msgid "Layers Slider"
-msgstr "Barre de défilement des couches"
-
-#: src/slic3r/GUI/OptionsGroup.cpp:258
+#: src/slic3r/GUI/OptionsGroup.cpp:293
msgctxt "Layers"
msgid "Bottom"
msgstr "Du bas"
-#: src/slic3r/GUI/OptionsGroup.cpp:258
+#: src/slic3r/GUI/OptionsGroup.cpp:293
msgctxt "Layers"
msgid "Top"
msgstr "Du haut"
-#: src/slic3r/GUI/MainFrame.cpp:671
+#: src/slic3r/GUI/Preferences.cpp:440
+msgid "Layout Options"
+msgstr "Options de disposition"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:48
+msgid "Leaving Paint-on supports"
+msgstr "Laisser les Supports peints"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:47
+msgid "Leaving Seam painting"
+msgstr "Laisser la Peinture de jointure"
+
+#: src/slic3r/GUI/MainFrame.cpp:968 src/slic3r/GUI/MainFrame.cpp:1288
msgid "Left"
msgstr "Gauche"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214
msgid "Left click"
msgstr "Clic gauche"
-#: src/slic3r/GUI/GLCanvas3D.cpp:237
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:29
+msgid "Left mouse button"
+msgstr "Bouton gauche de la souris"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:233
msgid "Left mouse button:"
msgstr "Bouton gauche de souris :"
-#: src/slic3r/GUI/MainFrame.cpp:671
+#: src/slic3r/GUI/MainFrame.cpp:968 src/slic3r/GUI/MainFrame.cpp:1288
msgid "Left View"
msgstr "Vue Gauche"
-#: src/slic3r/GUI/GUI_Preview.cpp:257
-msgid "Legend"
-msgstr "Légende"
+#: src/slic3r/GUI/GUI_Preview.cpp:1480
+msgid "Legend/Estimated printing time"
+msgstr "Légende/Temps d'impression estimé"
-#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1551
+#: src/libslic3r/PrintConfig.cpp:1651 src/libslic3r/PrintConfig.cpp:1659
msgid "Length"
msgstr "Longueur"
-#: src/libslic3r/PrintConfig.cpp:328
+#: src/libslic3r/PrintConfig.cpp:362
msgid "Length of the cooling tube to limit space for cooling moves inside it."
msgstr "Longueur du tube de refroidissement pour limiter l'espace pour les déplacements de refroidissement à l'intérieur de celui-ci."
+#: src/libslic3r/PrintConfig.cpp:1068
+msgid "Length of the infill anchor"
+msgstr "Longueur de l'ancre de remplissage"
+
#. TRN "Slic3r _is licensed under the_ License"
-#: src/slic3r/GUI/AboutDialog.cpp:129
+#: src/slic3r/GUI/AboutDialog.cpp:141
msgid "License agreements of all following programs (libraries) are part of application license agreement"
msgstr "Les contrats de licence de tous les programmes suivants (bibliothèques) font partie de la mise en oeuvre du contrat de licence"
-#: src/libslic3r/PrintConfig.cpp:1561
+#: src/libslic3r/PrintConfig.cpp:1669
msgid "Lift Z"
msgstr "Levage de l'axe Z"
-#: src/libslic3r/PrintConfig.cpp:848
+#: src/libslic3r/PrintConfig.cpp:886
msgid "Line"
msgstr "Ligne"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1427
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1558
msgid "Load"
msgstr "Charger"
-#: src/slic3r/GUI/MainFrame.cpp:460
+#: src/slic3r/GUI/MainFrame.cpp:1042
msgid "Load a model"
msgstr "Charger un modèle"
-#: src/libslic3r/PrintConfig.cpp:3505
+#: src/slic3r/GUI/MainFrame.cpp:1046
+msgid "Load an model saved with imperial units"
+msgstr "Charger un modèle enregistré avec des unités impériales"
+
+#: src/slic3r/GUI/MainFrame.cpp:1058
+msgid "Load an SL1 archive"
+msgstr "Charger une archive SL1"
+
+#: src/libslic3r/PrintConfig.cpp:3710
msgid "Load and store settings at the given directory. This is useful for maintaining different profiles or including configurations from a network storage."
msgstr "Charger et stocker les réglages dans le répertoire donné. Ceci est utile pour conserver différents profils ou inclure des configurations depuis un stockage réseau."
-#: src/libslic3r/PrintConfig.cpp:3489
+#: src/libslic3r/PrintConfig.cpp:3688
msgid "Load config file"
msgstr "Charger le fichier de configuration"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:120
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:113
msgid "Load Config from ini/amf/3mf/gcode and merge"
msgstr "Charger une configuration à partir d'un ini/amf/3mf/gcode et fusionner"
-#: src/slic3r/GUI/MainFrame.cpp:467
+#: src/slic3r/GUI/MainFrame.cpp:1058
msgid "Load configuration from project file"
msgstr "Charger la configuration depuis le fichier du projet"
-#: src/libslic3r/PrintConfig.cpp:3490
+#: src/libslic3r/PrintConfig.cpp:3689
msgid "Load configuration from the specified file. It can be used more than once to load options from multiple files."
msgstr "Charger la configuration depuis le fichier spécifié. Ceci peut être utilisé plusieurs fois afin de charger des options depuis plusieurs fichiers."
-#: src/slic3r/GUI/MainFrame.cpp:464
+#: src/slic3r/GUI/MainFrame.cpp:1055
msgid "Load exported configuration file"
msgstr "Charger le fichier de configuration exporté"
-#: src/slic3r/GUI/Plater.cpp:1395
+#: src/slic3r/GUI/Plater.cpp:1543 src/slic3r/GUI/Plater.cpp:4976
msgid "Load File"
msgstr "Charger le Fichier"
-#: src/slic3r/GUI/Plater.cpp:1399
+#: src/slic3r/GUI/Plater.cpp:1548 src/slic3r/GUI/Plater.cpp:4981
msgid "Load Files"
msgstr "Charger les Fichiers"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1879
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2038
msgid "Load Part"
msgstr "Charger une Partie"
-#: src/slic3r/GUI/MainFrame.cpp:471
+#: src/slic3r/GUI/MainFrame.cpp:1062
msgid "Load presets from a bundle"
msgstr "Charger les préréglages à partir d'un lot"
-#: src/slic3r/GUI/Plater.cpp:4575
+#: src/slic3r/GUI/Plater.cpp:4627
msgid "Load Project"
msgstr "Charger le Projet"
-#: src/slic3r/GUI/BedShapeDialog.cpp:102
+#: src/slic3r/GUI/BedShapeDialog.cpp:243
msgid "Load shape from STL..."
msgstr "Charger une forme depuis un STL..."
-#: src/slic3r/GUI/BedShapeDialog.cpp:182 src/slic3r/GUI/BedShapeDialog.cpp:261
+#: src/slic3r/GUI/BedShapeDialog.cpp:325 src/slic3r/GUI/BedShapeDialog.cpp:405
msgid "Load..."
msgstr "Charger..."
@@ -4073,19 +4816,27 @@ msgstr "Charger..."
msgid "loaded"
msgstr "chargé"
-#: src/slic3r/GUI/Plater.cpp:2426
+#: src/slic3r/GUI/Plater.cpp:2388
msgid "Loaded"
msgstr "Chargé"
-#: src/slic3r/GUI/Plater.cpp:2273
+#: src/slic3r/GUI/Plater.cpp:2216
msgid "Loading"
msgstr "Chargement"
-#: src/slic3r/GUI/GUI_App.cpp:474
+#: src/slic3r/GUI/GUI_App.cpp:797
+msgid "Loading configuration"
+msgstr "Chargement de la configuration"
+
+#: src/slic3r/GUI/Plater.cpp:2226
+msgid "Loading file"
+msgstr "Chargement du fichier"
+
+#: src/slic3r/GUI/GUI_App.cpp:1125
msgid "Loading of a mode view"
msgstr "Chargement d'un mode de vue"
-#: src/slic3r/GUI/GUI_App.cpp:466
+#: src/slic3r/GUI/GUI_App.cpp:1120
msgid "Loading of current presets"
msgstr "Chargement de préréglages actuels"
@@ -4094,101 +4845,121 @@ msgstr "Chargement de préréglages actuels"
msgid "Loading repaired model"
msgstr "Chargement du modèle réparé"
-#: src/libslic3r/PrintConfig.cpp:607
+#: src/libslic3r/PrintConfig.cpp:643
msgid "Loading speed"
msgstr "Vitesse de chargement"
-#: src/libslic3r/PrintConfig.cpp:615
+#: src/libslic3r/PrintConfig.cpp:651
msgid "Loading speed at the start"
msgstr "Vitesse de chargement au départ"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:63
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:106
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:69
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:112
msgid "Local coordinates"
msgstr "Coordonnées locaux"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48
msgid "Lock supports under new islands"
msgstr "Verrouiller les supports sous de nouveaux îlots"
-#: src/slic3r/GUI/Tab.cpp:3252
+#: src/slic3r/GUI/Tab.cpp:3689
msgid "LOCKED LOCK"
msgstr "CADENAS FERMÉ"
-#: src/slic3r/GUI/Tab.cpp:3280
+#: src/slic3r/GUI/Tab.cpp:3717
msgid "LOCKED LOCK icon indicates that the settings are the same as the system (or default) values for the current option group"
msgstr "L'icône CADENAS FERMÉ indique que les réglages sont les mêmes que les valeurs système (ou par défaut) pour le groupe d'options actuel"
-#: src/slic3r/GUI/Tab.cpp:3296
+#: src/slic3r/GUI/Tab.cpp:3733
msgid "LOCKED LOCK icon indicates that the value is the same as the system (or default) value."
msgstr "L'icône CADENAS FERMÉ indique que la valeur est la même que la valeur système (ou par défaut)."
-#: src/libslic3r/PrintConfig.cpp:3508
+#: src/libslic3r/PrintConfig.cpp:3713
msgid "Logging level"
msgstr "Niveau d'enregistrement"
-#: src/libslic3r/PrintConfig.cpp:1695
+#: src/libslic3r/PrintConfig.cpp:1810
msgid "Loops (minimum)"
msgstr "Boucles (minimum)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:206
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
msgid "Lower Layer"
msgstr "Couche Inférieure"
-#: src/slic3r/GUI/Tab.cpp:2188 src/slic3r/GUI/Tab.cpp:2273
-#: src/libslic3r/PrintConfig.cpp:1129 src/libslic3r/PrintConfig.cpp:1146
-#: src/libslic3r/PrintConfig.cpp:1163 src/libslic3r/PrintConfig.cpp:1179
-#: src/libslic3r/PrintConfig.cpp:1189 src/libslic3r/PrintConfig.cpp:1199
-#: src/libslic3r/PrintConfig.cpp:1209
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+msgid "Lower layer"
+msgstr "Couche Inférieure"
+
+#: src/slic3r/GUI/Tab.cpp:2346 src/slic3r/GUI/Tab.cpp:2442
+#: src/libslic3r/PrintConfig.cpp:1202 src/libslic3r/PrintConfig.cpp:1237
+#: src/libslic3r/PrintConfig.cpp:1254 src/libslic3r/PrintConfig.cpp:1271
+#: src/libslic3r/PrintConfig.cpp:1287 src/libslic3r/PrintConfig.cpp:1297
+#: src/libslic3r/PrintConfig.cpp:1307 src/libslic3r/PrintConfig.cpp:1317
msgid "Machine limits"
msgstr "Limites de la machine"
-#: src/slic3r/GUI/Plater.cpp:166
+#: src/slic3r/GUI/Tab.cpp:3667
+msgid "Machine limits are not set, therefore the print time estimate may not be accurate."
+msgstr "Les limites de la machine ne sont pas définies, par conséquent l'estimation du temps d'impression peut ne pas être précise."
+
+#: src/slic3r/GUI/Tab.cpp:3660
+msgid "Machine limits will be emitted to G-code and used to estimate print time."
+msgstr "Les limites de la machine seront émises dans le G-code et utilisées pour estimer le temps d'impression."
+
+#: src/slic3r/GUI/Tab.cpp:3663
+msgid "Machine limits will NOT be emitted to G-code, however they will be used to estimate print time, which may therefore not be accurate as the printer may apply a different set of machine limits."
+msgstr "Les limites de la machine NE seront PAS émises dans le G-code, mais elles seront utilisées pour estimer le temps d'impression, ce qui peut donc ne pas être précis car l'imprimante peut appliquer un ensemble différent de limites de la machine."
+
+#: src/slic3r/GUI/Plater.cpp:172
msgid "Manifold"
msgstr "Variété"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56
msgid "Manual editing"
msgstr "Édition manuelle"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:180
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:214
msgid "Masked SLA file exported to %1%"
msgstr "Fichier SLA masqué exporté vers %1%"
-#: src/slic3r/GUI/MainFrame.cpp:752
+#: src/slic3r/GUI/MainFrame.cpp:1451
msgid "Mate&rial Settings Tab"
msgstr "Onglet Réglage&s Matériau"
-#: src/slic3r/GUI/Tab.cpp:3478 src/slic3r/GUI/Tab.cpp:3480
+#: src/slic3r/GUI/Tab.cpp:3894 src/slic3r/GUI/Tab.cpp:3896
msgid "Material"
msgstr "Matériau"
-#: src/slic3r/GUI/Tab.hpp:416
+#: src/slic3r/GUI/Tab.hpp:486
msgid "Material Settings"
msgstr "Réglages Matériau"
-#: src/slic3r/GUI/Plater.cpp:163
+#: src/slic3r/GUI/GLCanvas3D.cpp:4304 src/slic3r/GUI/GLCanvas3D.cpp:4940
+msgid "Material Settings Tab"
+msgstr "Onglet de réglages du matériau"
+
+#: src/slic3r/GUI/Plater.cpp:169
msgid "Materials"
msgstr "Matériaux"
-#: src/libslic3r/PrintConfig.cpp:1217 src/libslic3r/PrintConfig.cpp:1226
+#: src/libslic3r/PrintConfig.cpp:1325 src/libslic3r/PrintConfig.cpp:1334
msgid "Max"
msgstr "Maximum"
-#: src/libslic3r/PrintConfig.cpp:2734
+#: src/libslic3r/PrintConfig.cpp:2898
msgid "Max bridge length"
msgstr "Longueur maximum de pont"
-#: src/libslic3r/PrintConfig.cpp:2658
+#: src/libslic3r/PrintConfig.cpp:2812
msgid "Max bridges on a pillar"
msgstr "Nombre de ponts maximum par pilier"
-#: src/libslic3r/PrintConfig.cpp:2822
+#: src/libslic3r/PrintConfig.cpp:2986
msgid "Max merge distance"
msgstr "Distance maximum de fusion"
-#: src/libslic3r/PrintConfig.cpp:2743
+#: src/libslic3r/PrintConfig.cpp:2907
msgid "Max pillar linking distance"
msgstr "Distance maximum de jonction de pilier"
@@ -4196,7 +4967,7 @@ msgstr "Distance maximum de jonction de pilier"
msgid "Max print height"
msgstr "Hauteur maximale d'impression"
-#: src/libslic3r/PrintConfig.cpp:1237
+#: src/libslic3r/PrintConfig.cpp:1345
msgid "Max print speed"
msgstr "Vitesse d'impression maximale"
@@ -4204,171 +4975,193 @@ msgstr "Vitesse d'impression maximale"
msgid "max PrusaSlicer version"
msgstr "Version maximum de PrusaSlicer"
-#: src/libslic3r/PrintConfig.cpp:1268
+#: src/libslic3r/PrintConfig.cpp:1376
msgid "Max volumetric slope negative"
msgstr "Pente volumétrique négative maximum"
-#: src/libslic3r/PrintConfig.cpp:1257
+#: src/libslic3r/PrintConfig.cpp:1365
msgid "Max volumetric slope positive"
msgstr "Pente volumétrique positive maximum"
-#: src/libslic3r/PrintConfig.cpp:597 src/libslic3r/PrintConfig.cpp:1247
+#: src/libslic3r/PrintConfig.cpp:633 src/libslic3r/PrintConfig.cpp:1355
msgid "Max volumetric speed"
msgstr "Vitesse volumétrique maximale"
-#: src/libslic3r/PrintConfig.cpp:2268
+#: src/libslic3r/PrintConfig.cpp:2411
msgid "Maximal bridging distance"
msgstr "Distance maximale de pont"
-#: src/libslic3r/PrintConfig.cpp:2269
+#: src/libslic3r/PrintConfig.cpp:2412
msgid "Maximal distance between supports on sparse infill sections."
msgstr "Distance maximale entre les supports sur les sections de remplissage épars."
-#: src/libslic3r/PrintConfig.cpp:1145
+#: src/libslic3r/PrintConfig.cpp:1253
msgid "Maximum acceleration E"
msgstr "Accélérations maximum E"
-#: src/libslic3r/PrintConfig.cpp:1151
+#: src/libslic3r/PrintConfig.cpp:1259
msgid "Maximum acceleration of the E axis"
msgstr "Accélération maximum de l'axe E"
-#: src/libslic3r/PrintConfig.cpp:1148
+#: src/libslic3r/PrintConfig.cpp:1256
msgid "Maximum acceleration of the X axis"
msgstr "Accélération maximum de l'axe X"
-#: src/libslic3r/PrintConfig.cpp:1149
+#: src/libslic3r/PrintConfig.cpp:1257
msgid "Maximum acceleration of the Y axis"
msgstr "Accélération maximum de l'axe Y"
-#: src/libslic3r/PrintConfig.cpp:1150
+#: src/libslic3r/PrintConfig.cpp:1258
msgid "Maximum acceleration of the Z axis"
msgstr "Accélération maximum de l'axe Z"
-#: src/libslic3r/PrintConfig.cpp:1198
+#: src/libslic3r/PrintConfig.cpp:1306
msgid "Maximum acceleration when extruding"
msgstr "Accélération maximum lors de l'extrusion"
-#: src/libslic3r/PrintConfig.cpp:1200
+#: src/libslic3r/PrintConfig.cpp:1308
msgid "Maximum acceleration when extruding (M204 S)"
msgstr "Accélération maximum lors de l'extrusion (M204 S)"
-#: src/libslic3r/PrintConfig.cpp:1208
+#: src/libslic3r/PrintConfig.cpp:1316
msgid "Maximum acceleration when retracting"
msgstr "Accélération maximum lors de la rétraction"
-#: src/libslic3r/PrintConfig.cpp:1210
+#: src/libslic3r/PrintConfig.cpp:1318
msgid "Maximum acceleration when retracting (M204 T)"
msgstr "Accélération maximum lors de la rétraction (M204 T)"
-#: src/libslic3r/PrintConfig.cpp:1142
+#: src/libslic3r/PrintConfig.cpp:1250
msgid "Maximum acceleration X"
msgstr "Accélérations maximum X"
-#: src/libslic3r/PrintConfig.cpp:1143
+#: src/libslic3r/PrintConfig.cpp:1251
msgid "Maximum acceleration Y"
msgstr "Accélérations maximum Y"
-#: src/libslic3r/PrintConfig.cpp:1144
+#: src/libslic3r/PrintConfig.cpp:1252
msgid "Maximum acceleration Z"
msgstr "Accélérations maximum Z"
-#: src/slic3r/GUI/Tab.cpp:2222
+#: src/slic3r/GUI/Tab.cpp:2391
msgid "Maximum accelerations"
msgstr "Accélérations maximum"
-#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2534
+#: src/libslic3r/PrintConfig.cpp:2676 src/libslic3r/PrintConfig.cpp:2677
msgid "Maximum exposure time"
msgstr "Temps d'exposition maximum"
-#: src/libslic3r/PrintConfig.cpp:1128
+#: src/libslic3r/PrintConfig.cpp:1236
msgid "Maximum feedrate E"
msgstr "Vitesse d'avance maximum en E"
-#: src/libslic3r/PrintConfig.cpp:1134
+#: src/libslic3r/PrintConfig.cpp:1242
msgid "Maximum feedrate of the E axis"
msgstr "Vitesse d'avance maximum de l'axe E"
-#: src/libslic3r/PrintConfig.cpp:1131
+#: src/libslic3r/PrintConfig.cpp:1239
msgid "Maximum feedrate of the X axis"
msgstr "Vitesse d'avance maximum de l'axe X"
-#: src/libslic3r/PrintConfig.cpp:1132
+#: src/libslic3r/PrintConfig.cpp:1240
msgid "Maximum feedrate of the Y axis"
msgstr "Vitesse d'avance maximum de l'axe Y"
-#: src/libslic3r/PrintConfig.cpp:1133
+#: src/libslic3r/PrintConfig.cpp:1241
msgid "Maximum feedrate of the Z axis"
msgstr "Vitesse d'avance maximum de l'axe Z"
-#: src/libslic3r/PrintConfig.cpp:1125
+#: src/libslic3r/PrintConfig.cpp:1233
msgid "Maximum feedrate X"
msgstr "Vitesse d'avance maximum en X"
-#: src/libslic3r/PrintConfig.cpp:1126
+#: src/libslic3r/PrintConfig.cpp:1234
msgid "Maximum feedrate Y"
msgstr "Vitesse d'avance maximum en Y"
-#: src/libslic3r/PrintConfig.cpp:1127
+#: src/libslic3r/PrintConfig.cpp:1235
msgid "Maximum feedrate Z"
msgstr "Vitesse d'avance maximum en Z"
-#: src/slic3r/GUI/Tab.cpp:2217
+#: src/slic3r/GUI/Tab.cpp:2386
msgid "Maximum feedrates"
msgstr "Vitesses d'avance maximum"
-#: src/libslic3r/PrintConfig.cpp:2556 src/libslic3r/PrintConfig.cpp:2557
+#: src/libslic3r/PrintConfig.cpp:2699 src/libslic3r/PrintConfig.cpp:2700
msgid "Maximum initial exposure time"
msgstr "Temps d'exposition initiale Maximum"
-#: src/libslic3r/PrintConfig.cpp:1162
+#: src/libslic3r/PrintConfig.cpp:1270
msgid "Maximum jerk E"
msgstr "Mouvement brusque maximum E"
-#: src/libslic3r/PrintConfig.cpp:1168
+#: src/libslic3r/PrintConfig.cpp:1276
msgid "Maximum jerk of the E axis"
msgstr "Mouvement brusque maximum de l'axe E"
-#: src/libslic3r/PrintConfig.cpp:1165
+#: src/libslic3r/PrintConfig.cpp:1273
msgid "Maximum jerk of the X axis"
msgstr "Mouvement brusque maximum de l'axe X"
-#: src/libslic3r/PrintConfig.cpp:1166
+#: src/libslic3r/PrintConfig.cpp:1274
msgid "Maximum jerk of the Y axis"
msgstr "Mouvement brusque maximum de l'axe Y"
-#: src/libslic3r/PrintConfig.cpp:1167
+#: src/libslic3r/PrintConfig.cpp:1275
msgid "Maximum jerk of the Z axis"
msgstr "Mouvement brusque maximum de l'axe Z"
-#: src/libslic3r/PrintConfig.cpp:1159
+#: src/libslic3r/PrintConfig.cpp:1267
msgid "Maximum jerk X"
msgstr "Mouvement brusque maximum X"
-#: src/libslic3r/PrintConfig.cpp:1160
+#: src/libslic3r/PrintConfig.cpp:1268
msgid "Maximum jerk Y"
msgstr "Mouvement brusque maximum Y"
-#: src/libslic3r/PrintConfig.cpp:1161
+#: src/libslic3r/PrintConfig.cpp:1269
msgid "Maximum jerk Z"
msgstr "Mouvement brusque maximum Z"
-#: src/libslic3r/PrintConfig.cpp:2660
+#: src/libslic3r/PrintConfig.cpp:1095
+msgid "Maximum length of the infill anchor"
+msgstr "Longueur maximum de l'ancre de remplissage"
+
+#: src/libslic3r/PrintConfig.cpp:2814
msgid "Maximum number of bridges that can be placed on a pillar. Bridges hold support point pinheads and connect to pillars as small branches."
msgstr "Le nombre de ponts maximum pouvant être placés sur un pilier. Les ponts soutiennent les têtes des points de support et sont connectés aux piliers comme de petites branches."
-#: src/libslic3r/PrintConfig.cpp:598
+#: src/libslic3r/PrintConfig.cpp:634
msgid "Maximum volumetric speed allowed for this filament. Limits the maximum volumetric speed of a print to the minimum of print and filament volumetric speed. Set to zero for no limit."
msgstr "Vitesse volumétrique maximale autorisée pour ce filament. Limite la vitesse volumétrique d'une impression au minimum des vitesses volumétriques d'impression et de filament. Mettez à zéro pour enlever la limite."
-#: src/libslic3r/PrintConfig.cpp:3442
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1868
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1876
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2569 src/libslic3r/PrintConfig.cpp:3641
msgid "Merge"
msgstr "Fusionner"
-#: src/libslic3r/PrintConfig.cpp:2683
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2660
+msgid "Merge all parts to the one single object"
+msgstr "Fusionner toutes les pièces en un seul objet"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1868
+msgid "Merge objects to the one multipart object"
+msgstr "Fusionner des objets en un seul objet multi-pièces"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1876
+msgid "Merge objects to the one single object"
+msgstr "Fusionner des objets en un seul objet"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2576
+msgid "Merged"
+msgstr "Fusionné"
+
+#: src/libslic3r/PrintConfig.cpp:2847
msgid "Merging bridges or pillars into another pillars can increase the radius. Zero means no increase, one means full increase."
msgstr "Le fait de fusionner des ponts ou des piliers avec d'autres piliers peut augmenter le rayon. Zéro signifie aucune augmentation, un signifie augmentation totale."
-#: src/libslic3r/SLAPrintSteps.cpp:64
+#: src/libslic3r/SLAPrintSteps.cpp:65
msgid "Merging slices and calculating statistics"
msgstr "Fusion des tranches et calcul des statistiques"
@@ -4376,15 +5169,15 @@ msgstr "Fusion des tranches et calcul des statistiques"
msgid "Mesh repair failed."
msgstr "Échec de la réparation du maillage."
-#: src/slic3r/GUI/DoubleSlider.cpp:1635
+#: src/slic3r/GUI/DoubleSlider.cpp:1831
msgid "Message for pause print on current layer (%1% mm)."
msgstr "Message pour mettre en pause l'impression sur la couche en cours (%1% mm)."
-#: src/libslic3r/PrintConfig.cpp:1280 src/libslic3r/PrintConfig.cpp:1289
+#: src/libslic3r/PrintConfig.cpp:1388 src/libslic3r/PrintConfig.cpp:1397
msgid "Min"
msgstr "Minimum"
-#: src/libslic3r/PrintConfig.cpp:1298
+#: src/libslic3r/PrintConfig.cpp:1406
msgid "Min print speed"
msgstr "Vitesse d'impression minimale"
@@ -4392,232 +5185,241 @@ msgstr "Vitesse d'impression minimale"
msgid "min PrusaSlicer version"
msgstr "Version minimum de PrusaSlicer"
-#: src/libslic3r/PrintConfig.cpp:2772
+#: src/libslic3r/PrintConfig.cpp:2936
msgid "Minimal distance of the support points"
msgstr "Distance minimale des points de support"
-#: src/libslic3r/PrintConfig.cpp:1306
+#: src/libslic3r/PrintConfig.cpp:1414
msgid "Minimal filament extrusion length"
msgstr "Longueur minimale d'extrusion de filament"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53
msgid "Minimal points distance"
msgstr "Distance minimale des points"
-#: src/libslic3r/PrintConfig.cpp:667
+#: src/libslic3r/PrintConfig.cpp:703
msgid "Minimal purge on wipe tower"
msgstr "Purge minimale sur la tour de nettoyage"
-#: src/libslic3r/PrintConfig.cpp:187
+#: src/libslic3r/PrintConfig.cpp:221
msgid "Minimum bottom shell thickness"
msgstr "Épaisseur minimale de la coque inférieure"
-#: src/slic3r/GUI/PresetHints.cpp:339
+#: src/slic3r/GUI/PresetHints.cpp:337
msgid "Minimum bottom shell thickness is %1% mm."
msgstr "L'épaisseur minimale de la coque inférieure est de %1% mm."
-#: src/libslic3r/PrintConfig.cpp:1512
+#: src/libslic3r/PrintConfig.cpp:1620
msgid "Minimum detail resolution, used to simplify the input file for speeding up the slicing job and reducing memory usage. High-resolution models often carry more detail than printers can render. Set to zero to disable any simplification and use full resolution from input."
msgstr "Résolution minimale pour les détails, utilisée pour simplifier le fichier d'entrée afin d'accélérer le découpage et de réduire l'utilisation de la mémoire. Les modèles haute-résolution possèdent souvent plus de détails que ce que les imprimantes peuvent produire. Mettez à zéro pour désactiver toute simplification et utiliser la résolution complète de l'entrée."
-#: src/libslic3r/PrintConfig.cpp:2525 src/libslic3r/PrintConfig.cpp:2526
+#: src/libslic3r/PrintConfig.cpp:2668 src/libslic3r/PrintConfig.cpp:2669
msgid "Minimum exposure time"
msgstr "Temps d'exposition minimum"
-#: src/libslic3r/PrintConfig.cpp:1178
+#: src/libslic3r/PrintConfig.cpp:1286
msgid "Minimum feedrate when extruding"
msgstr "Vitesse d'avance minimum lors de l'extrusion"
-#: src/libslic3r/PrintConfig.cpp:1180
+#: src/libslic3r/PrintConfig.cpp:1288
msgid "Minimum feedrate when extruding (M205 S)"
msgstr "Vitesse d'avance minimum lors de l'extrusion (M205 S)"
-#: src/slic3r/GUI/Tab.cpp:2234
+#: src/slic3r/GUI/Tab.cpp:2403
msgid "Minimum feedrates"
msgstr "Vitesses d'avance minimum"
-#: src/libslic3r/PrintConfig.cpp:2548 src/libslic3r/PrintConfig.cpp:2549
+#: src/libslic3r/PrintConfig.cpp:2691 src/libslic3r/PrintConfig.cpp:2692
msgid "Minimum initial exposure time"
msgstr "Temps d'exposition initiale minimum"
-#: src/slic3r/GUI/Tab.cpp:1069
+#: src/slic3r/GUI/Tab.cpp:1391
msgid "Minimum shell thickness"
msgstr "Épaisseur de coque minimale"
-#: src/libslic3r/PrintConfig.cpp:1787 src/libslic3r/PrintConfig.cpp:1788
+#: src/libslic3r/PrintConfig.cpp:1902 src/libslic3r/PrintConfig.cpp:1903
msgid "Minimum thickness of a top / bottom shell"
msgstr "Épaisseur minimale d'une coque supérieure/inférieure"
-#: src/libslic3r/PrintConfig.cpp:2146
+#: src/libslic3r/PrintConfig.cpp:2289
msgid "Minimum top shell thickness"
msgstr "Épaisseur minimale de la coque supérieure"
-#: src/slic3r/GUI/PresetHints.cpp:320
+#: src/slic3r/GUI/PresetHints.cpp:318
msgid "Minimum top shell thickness is %1% mm."
msgstr "L'épaisseur minimale de la coque supérieure est de %1% mm."
-#: src/libslic3r/PrintConfig.cpp:1522
+#: src/libslic3r/PrintConfig.cpp:1630
msgid "Minimum travel after retraction"
msgstr "Trajet minimal après une rétraction"
-#: src/libslic3r/PrintConfig.cpp:1188
+#: src/libslic3r/PrintConfig.cpp:1296
msgid "Minimum travel feedrate"
msgstr "Vitesse d'avance minimum en déplacement"
-#: src/libslic3r/PrintConfig.cpp:1190
+#: src/libslic3r/PrintConfig.cpp:1298
msgid "Minimum travel feedrate (M205 T)"
msgstr "Vitesse d'avance minimum en déplacement (M205 T)"
-#: src/libslic3r/PrintConfig.cpp:2917
+#: src/libslic3r/PrintConfig.cpp:3081
msgid "Minimum wall thickness of a hollowed model."
msgstr "Épaisseur de paroi minimale d'un modèle évidé."
-#: src/libslic3r/PrintConfig.cpp:2449
+#: src/libslic3r/PrintConfig.cpp:2592
msgid "Minimum width of features to maintain when doing elephant foot compensation."
msgstr "Largeur minimum des caractéristiques à maintenir lorsque vous pratiquez une compensation de pied d'éléphant."
-#: src/slic3r/GUI/Plater.cpp:4002
+#: src/slic3r/GUI/Plater.cpp:3922
msgid "Mirror"
msgstr "Symétrie"
-#: src/libslic3r/PrintConfig.cpp:2379
+#: src/libslic3r/PrintConfig.cpp:2522
msgid "Mirror horizontally"
msgstr "Symétriser horizontalement"
-#: src/slic3r/GUI/GLCanvas3D.cpp:2053
+#: src/slic3r/GUI/GLCanvas3D.cpp:2226
msgid "Mirror Object"
msgstr "Symétriser l'Objet"
-#: src/slic3r/GUI/Plater.cpp:4002
+#: src/slic3r/GUI/Plater.cpp:3922
msgid "Mirror the selected object"
msgstr "Symétriser l'objet sélectionné"
-#: src/slic3r/GUI/Plater.cpp:3995
+#: src/slic3r/GUI/Plater.cpp:3915
msgid "Mirror the selected object along the X axis"
msgstr "Symétriser l'objet sélectionné selon l'axe X"
-#: src/slic3r/GUI/Plater.cpp:3997
+#: src/slic3r/GUI/Plater.cpp:3917
msgid "Mirror the selected object along the Y axis"
msgstr "Symétriser l'objet sélectionné selon l'axe Y"
-#: src/slic3r/GUI/Plater.cpp:3999
+#: src/slic3r/GUI/Plater.cpp:3919
msgid "Mirror the selected object along the Z axis"
msgstr "Symétriser l'objet sélectionné selon l'axe Z"
-#: src/libslic3r/PrintConfig.cpp:2386
+#: src/libslic3r/PrintConfig.cpp:2529
msgid "Mirror vertically"
msgstr "Symétriser verticalement"
-#: src/slic3r/Utils/AstroBox.cpp:68 src/slic3r/Utils/OctoPrint.cpp:68
-#, c-format
+#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:68
+#, possible-c-format
msgid "Mismatched type of print host: %s"
msgstr "Mauvais appariement de l'hôte d'impression : %s"
-#: src/libslic3r/ExtrusionEntity.cpp:323
+#: src/libslic3r/ExtrusionEntity.cpp:328 src/libslic3r/ExtrusionEntity.cpp:364
msgid "Mixed"
msgstr "Mélangé"
-#: src/libslic3r/PrintConfig.cpp:2491
+#: src/libslic3r/PrintConfig.cpp:2634
msgid "ml"
msgstr "ml"
-#: src/slic3r/GUI/BedShapeDialog.cpp:92 src/slic3r/GUI/ConfigWizard.cpp:218
-#: src/slic3r/GUI/ConfigWizard.cpp:970 src/slic3r/GUI/ConfigWizard.cpp:984
+#: src/slic3r/GUI/BedShapeDialog.cpp:129 src/slic3r/GUI/ConfigWizard.cpp:236
+#: src/slic3r/GUI/ConfigWizard.cpp:1336 src/slic3r/GUI/ConfigWizard.cpp:1350
#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:87
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:135
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:333
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:94
+#: src/slic3r/GUI/GCodeViewer.cpp:2183 src/slic3r/GUI/GCodeViewer.cpp:2189
+#: src/slic3r/GUI/GCodeViewer.cpp:2197 src/slic3r/GUI/GUI_ObjectLayers.cpp:145
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:96
#: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:75
-#: src/libslic3r/PrintConfig.cpp:82 src/libslic3r/PrintConfig.cpp:91
-#: src/libslic3r/PrintConfig.cpp:122 src/libslic3r/PrintConfig.cpp:188
-#: src/libslic3r/PrintConfig.cpp:246 src/libslic3r/PrintConfig.cpp:321
-#: src/libslic3r/PrintConfig.cpp:329 src/libslic3r/PrintConfig.cpp:379
-#: src/libslic3r/PrintConfig.cpp:505 src/libslic3r/PrintConfig.cpp:516
-#: src/libslic3r/PrintConfig.cpp:534 src/libslic3r/PrintConfig.cpp:712
-#: src/libslic3r/PrintConfig.cpp:1231 src/libslic3r/PrintConfig.cpp:1292
-#: src/libslic3r/PrintConfig.cpp:1310 src/libslic3r/PrintConfig.cpp:1328
-#: src/libslic3r/PrintConfig.cpp:1384 src/libslic3r/PrintConfig.cpp:1394
-#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1524
-#: src/libslic3r/PrintConfig.cpp:1565 src/libslic3r/PrintConfig.cpp:1573
-#: src/libslic3r/PrintConfig.cpp:1583 src/libslic3r/PrintConfig.cpp:1591
-#: src/libslic3r/PrintConfig.cpp:1599 src/libslic3r/PrintConfig.cpp:1682
-#: src/libslic3r/PrintConfig.cpp:1914 src/libslic3r/PrintConfig.cpp:1985
-#: src/libslic3r/PrintConfig.cpp:2019 src/libslic3r/PrintConfig.cpp:2147
-#: src/libslic3r/PrintConfig.cpp:2226 src/libslic3r/PrintConfig.cpp:2233
-#: src/libslic3r/PrintConfig.cpp:2240 src/libslic3r/PrintConfig.cpp:2270
-#: src/libslic3r/PrintConfig.cpp:2280 src/libslic3r/PrintConfig.cpp:2290
-#: src/libslic3r/PrintConfig.cpp:2450 src/libslic3r/PrintConfig.cpp:2484
-#: src/libslic3r/PrintConfig.cpp:2623 src/libslic3r/PrintConfig.cpp:2632
-#: src/libslic3r/PrintConfig.cpp:2641 src/libslic3r/PrintConfig.cpp:2651
-#: src/libslic3r/PrintConfig.cpp:2695 src/libslic3r/PrintConfig.cpp:2705
-#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2737
-#: src/libslic3r/PrintConfig.cpp:2747 src/libslic3r/PrintConfig.cpp:2757
-#: src/libslic3r/PrintConfig.cpp:2775 src/libslic3r/PrintConfig.cpp:2790
-#: src/libslic3r/PrintConfig.cpp:2804 src/libslic3r/PrintConfig.cpp:2815
-#: src/libslic3r/PrintConfig.cpp:2828 src/libslic3r/PrintConfig.cpp:2873
-#: src/libslic3r/PrintConfig.cpp:2883 src/libslic3r/PrintConfig.cpp:2892
-#: src/libslic3r/PrintConfig.cpp:2902 src/libslic3r/PrintConfig.cpp:2918
-#: src/libslic3r/PrintConfig.cpp:2942
+#: src/libslic3r/PrintConfig.cpp:82 src/libslic3r/PrintConfig.cpp:93
+#: src/libslic3r/PrintConfig.cpp:124 src/libslic3r/PrintConfig.cpp:222
+#: src/libslic3r/PrintConfig.cpp:280 src/libslic3r/PrintConfig.cpp:355
+#: src/libslic3r/PrintConfig.cpp:363 src/libslic3r/PrintConfig.cpp:413
+#: src/libslic3r/PrintConfig.cpp:541 src/libslic3r/PrintConfig.cpp:552
+#: src/libslic3r/PrintConfig.cpp:570 src/libslic3r/PrintConfig.cpp:748
+#: src/libslic3r/PrintConfig.cpp:1158 src/libslic3r/PrintConfig.cpp:1339
+#: src/libslic3r/PrintConfig.cpp:1400 src/libslic3r/PrintConfig.cpp:1418
+#: src/libslic3r/PrintConfig.cpp:1436 src/libslic3r/PrintConfig.cpp:1492
+#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1624
+#: src/libslic3r/PrintConfig.cpp:1632 src/libslic3r/PrintConfig.cpp:1673
+#: src/libslic3r/PrintConfig.cpp:1681 src/libslic3r/PrintConfig.cpp:1691
+#: src/libslic3r/PrintConfig.cpp:1699 src/libslic3r/PrintConfig.cpp:1707
+#: src/libslic3r/PrintConfig.cpp:1790 src/libslic3r/PrintConfig.cpp:2056
+#: src/libslic3r/PrintConfig.cpp:2127 src/libslic3r/PrintConfig.cpp:2161
+#: src/libslic3r/PrintConfig.cpp:2290 src/libslic3r/PrintConfig.cpp:2369
+#: src/libslic3r/PrintConfig.cpp:2376 src/libslic3r/PrintConfig.cpp:2383
+#: src/libslic3r/PrintConfig.cpp:2413 src/libslic3r/PrintConfig.cpp:2423
+#: src/libslic3r/PrintConfig.cpp:2433 src/libslic3r/PrintConfig.cpp:2593
+#: src/libslic3r/PrintConfig.cpp:2627 src/libslic3r/PrintConfig.cpp:2766
+#: src/libslic3r/PrintConfig.cpp:2775 src/libslic3r/PrintConfig.cpp:2784
+#: src/libslic3r/PrintConfig.cpp:2794 src/libslic3r/PrintConfig.cpp:2859
+#: src/libslic3r/PrintConfig.cpp:2869 src/libslic3r/PrintConfig.cpp:2881
+#: src/libslic3r/PrintConfig.cpp:2901 src/libslic3r/PrintConfig.cpp:2911
+#: src/libslic3r/PrintConfig.cpp:2921 src/libslic3r/PrintConfig.cpp:2939
+#: src/libslic3r/PrintConfig.cpp:2954 src/libslic3r/PrintConfig.cpp:2968
+#: src/libslic3r/PrintConfig.cpp:2979 src/libslic3r/PrintConfig.cpp:2992
+#: src/libslic3r/PrintConfig.cpp:3037 src/libslic3r/PrintConfig.cpp:3047
+#: src/libslic3r/PrintConfig.cpp:3056 src/libslic3r/PrintConfig.cpp:3066
+#: src/libslic3r/PrintConfig.cpp:3082 src/libslic3r/PrintConfig.cpp:3106
msgid "mm"
msgstr "mm"
-#: src/libslic3r/PrintConfig.cpp:1547 src/libslic3r/PrintConfig.cpp:1556
+#: src/libslic3r/PrintConfig.cpp:1655 src/libslic3r/PrintConfig.cpp:1664
msgid "mm (zero to disable)"
msgstr "mm (zéro pour désactiver)"
-#: src/libslic3r/PrintConfig.cpp:451 src/libslic3r/PrintConfig.cpp:560
-#: src/libslic3r/PrintConfig.cpp:882 src/libslic3r/PrintConfig.cpp:895
-#: src/libslic3r/PrintConfig.cpp:1015 src/libslic3r/PrintConfig.cpp:1041
-#: src/libslic3r/PrintConfig.cpp:1423 src/libslic3r/PrintConfig.cpp:1761
-#: src/libslic3r/PrintConfig.cpp:1883 src/libslic3r/PrintConfig.cpp:1951
-#: src/libslic3r/PrintConfig.cpp:2111
+#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:596
+#: src/libslic3r/PrintConfig.cpp:924 src/libslic3r/PrintConfig.cpp:937
+#: src/libslic3r/PrintConfig.cpp:1059 src/libslic3r/PrintConfig.cpp:1085
+#: src/libslic3r/PrintConfig.cpp:1531 src/libslic3r/PrintConfig.cpp:1876
+#: src/libslic3r/PrintConfig.cpp:2025 src/libslic3r/PrintConfig.cpp:2093
+#: src/libslic3r/PrintConfig.cpp:2254
msgid "mm or %"
msgstr "mm ou %"
-#: src/libslic3r/PrintConfig.cpp:237 src/libslic3r/PrintConfig.cpp:609
-#: src/libslic3r/PrintConfig.cpp:617 src/libslic3r/PrintConfig.cpp:626
-#: src/libslic3r/PrintConfig.cpp:634 src/libslic3r/PrintConfig.cpp:661
-#: src/libslic3r/PrintConfig.cpp:680 src/libslic3r/PrintConfig.cpp:922
-#: src/libslic3r/PrintConfig.cpp:1050 src/libslic3r/PrintConfig.cpp:1135
-#: src/libslic3r/PrintConfig.cpp:1169 src/libslic3r/PrintConfig.cpp:1181
-#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:1241
-#: src/libslic3r/PrintConfig.cpp:1300 src/libslic3r/PrintConfig.cpp:1433
-#: src/libslic3r/PrintConfig.cpp:1607 src/libslic3r/PrintConfig.cpp:1616
-#: src/libslic3r/PrintConfig.cpp:2028 src/libslic3r/PrintConfig.cpp:2154
+#: src/libslic3r/PrintConfig.cpp:193
+msgid "mm or % (zero to disable)"
+msgstr "mm ou % (zéro pour désactiver)"
+
+#: src/libslic3r/PrintConfig.cpp:271 src/libslic3r/PrintConfig.cpp:645
+#: src/libslic3r/PrintConfig.cpp:653 src/libslic3r/PrintConfig.cpp:662
+#: src/libslic3r/PrintConfig.cpp:670 src/libslic3r/PrintConfig.cpp:697
+#: src/libslic3r/PrintConfig.cpp:716 src/libslic3r/PrintConfig.cpp:966
+#: src/libslic3r/PrintConfig.cpp:1094 src/libslic3r/PrintConfig.cpp:1167
+#: src/libslic3r/PrintConfig.cpp:1243 src/libslic3r/PrintConfig.cpp:1277
+#: src/libslic3r/PrintConfig.cpp:1289 src/libslic3r/PrintConfig.cpp:1299
+#: src/libslic3r/PrintConfig.cpp:1349 src/libslic3r/PrintConfig.cpp:1408
+#: src/libslic3r/PrintConfig.cpp:1541 src/libslic3r/PrintConfig.cpp:1715
+#: src/libslic3r/PrintConfig.cpp:1724 src/libslic3r/PrintConfig.cpp:2170
+#: src/libslic3r/PrintConfig.cpp:2297
msgid "mm/s"
msgstr "mm/s"
-#: src/libslic3r/PrintConfig.cpp:462 src/libslic3r/PrintConfig.cpp:904
-#: src/libslic3r/PrintConfig.cpp:1720 src/libslic3r/PrintConfig.cpp:1772
-#: src/libslic3r/PrintConfig.cpp:1995 src/libslic3r/PrintConfig.cpp:2124
+#: src/libslic3r/PrintConfig.cpp:498 src/libslic3r/PrintConfig.cpp:946
+#: src/libslic3r/PrintConfig.cpp:1835 src/libslic3r/PrintConfig.cpp:1887
+#: src/libslic3r/PrintConfig.cpp:2137 src/libslic3r/PrintConfig.cpp:2267
msgid "mm/s or %"
msgstr "mm/s ou %"
-#: src/libslic3r/PrintConfig.cpp:196 src/libslic3r/PrintConfig.cpp:339
-#: src/libslic3r/PrintConfig.cpp:862 src/libslic3r/PrintConfig.cpp:984
-#: src/libslic3r/PrintConfig.cpp:1152 src/libslic3r/PrintConfig.cpp:1201
-#: src/libslic3r/PrintConfig.cpp:1211 src/libslic3r/PrintConfig.cpp:1403
+#: src/libslic3r/PrintConfig.cpp:230 src/libslic3r/PrintConfig.cpp:373
+#: src/libslic3r/PrintConfig.cpp:902 src/libslic3r/PrintConfig.cpp:1028
+#: src/libslic3r/PrintConfig.cpp:1260 src/libslic3r/PrintConfig.cpp:1309
+#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1511
msgid "mm/s²"
msgstr "mm/s²"
-#: src/libslic3r/PrintConfig.cpp:1730
+#: src/libslic3r/PrintConfig.cpp:1845
msgid "mm²"
msgstr "mm²"
-#: src/libslic3r/PrintConfig.cpp:672
+#: src/libslic3r/PrintConfig.cpp:708
msgid "mm³"
msgstr "mm³"
-#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:601
-#: src/libslic3r/PrintConfig.cpp:1250
+#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:637
+#: src/libslic3r/PrintConfig.cpp:1358
msgid "mm³/s"
msgstr "mm³/s"
-#: src/libslic3r/PrintConfig.cpp:1262 src/libslic3r/PrintConfig.cpp:1273
+#: src/libslic3r/PrintConfig.cpp:1370 src/libslic3r/PrintConfig.cpp:1381
msgid "mm³/s²"
msgstr "mm³/s²"
-#: src/slic3r/GUI/GUI_App.cpp:820
+#: src/slic3r/GUI/GUI_App.cpp:1512
msgid "Mode"
msgstr "&Mode"
@@ -4625,7 +5427,7 @@ msgstr "&Mode"
msgid "model"
msgstr "modèle"
-#: src/slic3r/GUI/BedShapeDialog.cpp:251
+#: src/slic3r/GUI/BedShapeDialog.cpp:395
msgid "Model"
msgstr "Modèle"
@@ -4654,151 +5456,192 @@ msgstr "Réparation du modèle terminée"
msgid "Model repaired successfully"
msgstr "Réparation du modèle réussie"
-#: src/slic3r/GUI/Tab.cpp:979
+#: src/slic3r/GUI/GUI_App.cpp:1506 src/slic3r/GUI/wxExtensions.cpp:675
+msgctxt "Mode"
+msgid "Advanced"
+msgstr "Avancé"
+
+#: src/slic3r/GUI/Tab.cpp:1241
msgid "Modifications to the current profile will be saved."
msgstr "Les modifications du profil actuel vont être sauvegardées."
-#: src/slic3r/GUI/Preset.cpp:247
+#: src/slic3r/GUI/GUI_App.cpp:1425
msgid "modified"
msgstr "modifié"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
msgid "Modifier"
msgstr "Modificateur"
-#: src/slic3r/GUI/Tab.cpp:1161
+#: src/slic3r/GUI/Tab.cpp:1491
msgid "Modifiers"
msgstr "Modificateurs"
-#: src/libslic3r/PrintConfig.cpp:2512
+#: src/libslic3r/PrintConfig.cpp:2655
msgid "money/bottle"
msgstr "prix/bouteille"
-#: src/libslic3r/PrintConfig.cpp:762
+#: src/libslic3r/PrintConfig.cpp:798
msgid "money/kg"
msgstr "€/kg"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372
+#: src/libslic3r/PrintConfig.cpp:461
+msgid "Monotonic"
+msgstr "Monotone"
+
+#: src/slic3r/GUI/NotificationManager.cpp:305
+#: src/slic3r/GUI/NotificationManager.cpp:315
+msgid "More"
+msgstr "Plus"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219
msgid "Mouse wheel"
msgstr "Roulette de la souris"
-#: src/slic3r/GUI/GLCanvas3D.cpp:261
+#: src/slic3r/GUI/GLCanvas3D.cpp:249
msgid "Mouse wheel:"
msgstr "Roulette de la souris:"
-#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:64
msgid "Move"
msgstr "Déplacer"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:255
+msgid "Move active slider thumb Left"
+msgstr "Déplacer la barre de défilement active vers la Gauche"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:256
+msgid "Move active slider thumb Right"
+msgstr "Déplacer la barre de défilement active vers la Droite"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:220
+msgid "Move active thumb Down"
+msgstr "Déplacer le curseur actif vers le Bas"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:241
+msgid "Move active thumb Left"
+msgstr "Déplacer le curseur actif vers la Gauche"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:242
+msgid "Move active thumb Right"
+msgstr "Déplacer le curseur actif vers la Droite"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+msgid "Move active thumb Up"
+msgstr "Déplacer le curseur actif vers le Haut"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219
msgid "Move clipping plane"
msgstr "Déplacer le plan de coupe"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
msgid "Move current slider thumb Down"
-msgstr "Déplacer le curseur actuel vers le bas"
+msgstr "Déplacer la barre de défilement actuelle vers le Bas"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:214
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
msgid "Move current slider thumb Up"
-msgstr "Déplacer le curseur actuel vers le haut"
+msgstr "Déplacer la barre de défilement actuelle vers le Haut"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1059
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:835
msgid "Move drainage hole"
msgstr "Déplacer le trou de drainage"
-#: src/slic3r/GUI/GLCanvas3D.cpp:3505
+#: src/slic3r/GUI/GLCanvas3D.cpp:3810
msgid "Move Object"
msgstr "Déplacer l'Objet"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212
msgid "Move point"
msgstr "Déplacer le point"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:160
msgid "Move selection 10 mm in negative X direction"
msgstr "Déplacer la sélection de 10 mm dans la direction négative X"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:159
msgid "Move selection 10 mm in negative Y direction"
msgstr "Déplacer la sélection de 10 mm dans la direction négative Y"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:161
msgid "Move selection 10 mm in positive X direction"
msgstr "Déplacer la sélection de 10 mm dans la direction positive X"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:158
msgid "Move selection 10 mm in positive Y direction"
msgstr "Déplacer la sélection de 10 mm dans la direction positive Y"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1097
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:955
msgid "Move support point"
msgstr "Déplacer un point de support"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
+#: src/slic3r/GUI/GCodeViewer.cpp:2492
+msgid "Movement"
+msgstr "Mouvement"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
msgid "Movement in camera space"
msgstr "Mouvement dans l'espace de la caméra"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:162
msgid "Movement step set to 1 mm"
msgstr "Pas du mouvement réglé sur 1 mm"
-#: src/libslic3r/PrintConfig.cpp:2201
+#: src/libslic3r/PrintConfig.cpp:2344
msgid "Multi material printers may need to prime or purge extruders on tool changes. Extrude the excess material into the wipe tower."
msgstr "Les imprimantes multi-matériaux peuvent avoir besoin de préparer ou de purger leurs extrudeurs lors d'un changement d'outil. Extruder le matériau en excès dans la tour de nettoyage."
-#: src/slic3r/GUI/Plater.cpp:2360 src/slic3r/GUI/Plater.cpp:2413
+#: src/slic3r/GUI/Plater.cpp:2322 src/slic3r/GUI/Plater.cpp:2375
msgid "Multi-part object detected"
msgstr "Objet multi-pièces détecté"
#: src/slic3r/GUI/FirmwareDialog.cpp:419 src/slic3r/GUI/FirmwareDialog.cpp:454
-#, c-format
+#, possible-c-format
msgid "Multiple %s devices found. Please only connect one at a time for flashing."
msgstr "Plusieurs %s équipements ont été détectés. Veuillez n'en connecter qu'un seul à la fois pour le processus de flash."
-#: src/slic3r/GUI/Tab.cpp:1179
+#: src/slic3r/GUI/Tab.cpp:1509
msgid "Multiple Extruders"
msgstr "Extrudeurs Multiples"
-#: src/slic3r/GUI/Plater.cpp:2410
-msgid ""
-"Multiple objects were loaded for a multi-material printer.\n"
-"Instead of considering them as multiple objects, should I consider\n"
-"these files to represent a single object having multiple parts?"
-msgstr ""
-"Plusieurs fichiers ont été chargés pour une impression multi-matériaux.\n"
-"Au lieu de les considérer en tant que plusieurs objets, dois-je considérer\n"
-"ces fichiers en tant que un seul objet ayant plusieurs pièces ?"
+#: src/slic3r/GUI/Plater.cpp:2372
+msgid "Multiple objects were loaded for a multi-material printer.\nInstead of considering them as multiple objects, should I consider\nthese files to represent a single object having multiple parts?"
+msgstr "Plusieurs fichiers ont été chargés pour une impression multi-matériaux.\nAu lieu de les considérer en tant que plusieurs objets, dois-je considérer\nces fichiers en tant que un seul objet ayant plusieurs pièces ?"
-#: src/libslic3r/PrintConfig.cpp:3439
+#: src/libslic3r/PrintConfig.cpp:3638
msgid "Multiply copies by creating a grid."
msgstr "Multiplier les copies en créant une grille."
-#: src/libslic3r/PrintConfig.cpp:3434
+#: src/libslic3r/PrintConfig.cpp:3633
msgid "Multiply copies by this factor."
msgstr "Multiplier les copies par ce facteur."
-#: src/slic3r/GUI/Field.cpp:150 src/slic3r/GUI/OptionsGroup.cpp:580
+#: src/slic3r/GUI/Field.cpp:198 src/slic3r/GUI/OptionsGroup.cpp:715
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:874
msgid "N/A"
msgstr "N/A"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:270
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153
+#: src/slic3r/GUI/GUI_ObjectList.cpp:284
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:161
msgid "Name"
msgstr "Nom"
-#: src/libslic3r/PrintConfig.cpp:1488
+#: src/libslic3r/PrintConfig.cpp:114
+msgid "Name of the printer"
+msgstr "Nom de l'imprimante"
+
+#: src/libslic3r/PrintConfig.cpp:1596
msgid "Name of the printer variant. For example, the printer variants may be differentiated by a nozzle diameter."
msgstr "Nom de la variante d'imprimante. Par exemple, la variante d'imprimante peut être différenciée par un diamètre de buse."
-#: src/libslic3r/PrintConfig.cpp:1482
+#: src/libslic3r/PrintConfig.cpp:1590
msgid "Name of the printer vendor."
msgstr "Nom du fabriquant de l'imprimante."
-#: src/libslic3r/PrintConfig.cpp:1058
+#: src/libslic3r/PrintConfig.cpp:1102
msgid "Name of the profile, from which this profile inherits."
msgstr "Nom du profil, duquel hérite ce profil."
-#: src/libslic3r/PrintConfig.cpp:1630
+#: src/libslic3r/PrintConfig.cpp:1738
msgid "Nearest"
msgstr "Le plus proche"
@@ -4806,16 +5649,32 @@ msgstr "Le plus proche"
msgid "Network lookup"
msgstr "Recherche réseau"
-#: src/slic3r/GUI/Plater.cpp:2151
+#: src/slic3r/GUI/Preferences.cpp:430
+msgid "New layout, access via settings button in the top menu"
+msgstr "Nouvelle disposition, accès via le bouton des réglages dans le menu supérieur"
+
+#: src/slic3r/GUI/Plater.cpp:2056
msgid "New Project"
msgstr "Nouveau Projet"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:112
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:105
msgid "New project, clear plater"
msgstr "Nouveau projet, libérer le plateau"
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:609
+msgid "New Value"
+msgstr "Nouvelle Valeur"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1178
+msgid "New value"
+msgstr "Nouvelle valeur"
+
+#: src/slic3r/GUI/NotificationManager.hpp:322
+msgid "New version is available."
+msgstr "Une nouvelle version est disponible."
+
#: src/slic3r/GUI/UpdateDialogs.cpp:38
-#, c-format
+#, possible-c-format
msgid "New version of %s is available"
msgstr "Une nouvelle version de %s est disponible"
@@ -4823,23 +5682,23 @@ msgstr "Une nouvelle version de %s est disponible"
msgid "New version:"
msgstr "Nouvelle version :"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4673
+#: src/slic3r/GUI/GLCanvas3D.cpp:5089
msgid "Next Redo action: %1%"
msgstr "Prochaine action Répéter : %1%"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4641
+#: src/slic3r/GUI/GLCanvas3D.cpp:5051
msgid "Next Undo action: %1%"
msgstr "Prochaine action Annuler : %1%"
-#: src/libslic3r/PrintConfig.cpp:960
+#: src/libslic3r/PrintConfig.cpp:1004
msgid "No extrusion"
msgstr "Aucune extrusion"
-#: src/libslic3r/SLAPrintSteps.cpp:453
+#: src/libslic3r/SLAPrintSteps.cpp:451
msgid "No pad can be generated for this model with the current configuration"
msgstr "Aucun socle ne peut être généré pour ce modèle avec la configuration actuelle"
-#: src/slic3r/GUI/MainFrame.cpp:784
+#: src/slic3r/GUI/MainFrame.cpp:1485
msgid "No previously sliced file."
msgstr "Aucun fichier précédemment découpé."
@@ -4847,175 +5706,215 @@ msgstr "Aucun fichier précédemment découpé."
msgid "NO RAMMING AT ALL"
msgstr "PAS D'EXPULSION DU TOUT"
-#: src/libslic3r/PrintConfig.cpp:1857
+#: src/libslic3r/PrintConfig.cpp:1999
msgid "No sparse layers (EXPERIMENTAL)"
msgstr "Sans couches dispersées (EXPERIMENTAL)"
-#: src/libslic3r/PrintConfig.cpp:2774
+#: src/libslic3r/PrintConfig.cpp:2938
msgid "No support points will be placed closer than this threshold."
msgstr "Aucun point de support ne sera positionné plus près que ce seuil."
-#: src/slic3r/GUI/UpdateDialogs.cpp:303
+#: src/slic3r/GUI/UpdateDialogs.cpp:304
msgid "No updates available"
msgstr "Aucune mise à jour disponible"
-#: src/slic3r/GUI/ConfigWizard.cpp:291 src/slic3r/GUI/ConfigWizard.cpp:574
-#: src/slic3r/GUI/Plater.cpp:499 src/slic3r/GUI/Plater.cpp:639
-#: src/libslic3r/ExtrusionEntity.cpp:309
+#: src/slic3r/GUI/ConfigWizard.cpp:309 src/slic3r/GUI/ConfigWizard.cpp:599
+#: src/slic3r/GUI/Plater.cpp:365 src/slic3r/GUI/Plater.cpp:505
+#: src/libslic3r/ExtrusionEntity.cpp:312
msgid "None"
msgstr "Aucun"
-#: src/slic3r/GUI/Tab.cpp:2203
+#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2372
msgid "Normal"
msgstr "Normal"
-#: src/slic3r/GUI/Plater.cpp:1286
+#: src/slic3r/GUI/Plater.cpp:1177 src/slic3r/GUI/Plater.cpp:1224
msgid "normal mode"
msgstr "mode normal"
-#: src/libslic3r/Zipper.cpp:46
+#: src/slic3r/GUI/GCodeViewer.cpp:2552
+msgid "Normal mode"
+msgstr "Mode normal"
+
+#: src/libslic3r/miniz_extension.cpp:105
msgid "not a ZIP archive"
msgstr "n'est pas une archive ZIP"
-#: src/slic3r/GUI/BedShapeDialog.cpp:223 src/slic3r/GUI/BedShapeDialog.cpp:302
+#: src/slic3r/GUI/BedShapeDialog.cpp:366 src/slic3r/GUI/BedShapeDialog.cpp:446
msgid "Not found:"
msgstr "Introuvable:"
-#: src/slic3r/GUI/DoubleSlider.cpp:1019
+#: src/slic3r/GUI/DoubleSlider.cpp:1144
msgid "Note"
msgstr "Remarque"
-#: src/slic3r/Utils/AstroBox.cpp:89
+#: src/slic3r/GUI/Tab.cpp:3408
+msgid "Note, that selected preset will be deleted from this/those printer(s) too."
+msgstr "Notez que ce préréglage sélectionné sera également supprimé pour cette/ces imprimante(s)."
+
+#: src/slic3r/GUI/Tab.cpp:3416
+msgid "Note, that this/those printer(s) will be deleted after deleting of the selected preset."
+msgstr "Notez que cette/ces imprimante(s) seront supprimées après la suppression du préréglage sélectionné."
+
+#: src/slic3r/GUI/Tab.cpp:2039
+msgid "Note: All parameters from this group are moved to the Physical Printer settings (see changelog).\n\nA new Physical Printer profile is created by clicking on the \"cog\" icon right of the Printer profiles combo box, by selecting the \"Add physical printer\" item in the Printer combo box. The Physical Printer profile editor opens also when clicking on the \"cog\" icon in the Printer settings tab. The Physical Printer profiles are being stored into PrusaSlicer/physical_printer directory."
+msgstr "Remarque : Tous les paramètres de ce groupe sont déplacés vers les paramètres de l'imprimante physique (voir le journal des modifications).\n\nUn nouveau profil d'imprimante physique est créé en cliquant sur l'icône \"rouage\" à droite de la zone de liste déroulante de Profils d'imprimante, en sélectionnant l'élément \"Ajouter une imprimante physique\" dans la zone de liste déroulante Imprimante. L'éditeur de profil d'imprimante physique s'ouvre également en cliquant sur l'icône \"rouage\" dans l'onglet Réglages de l'imprimante. Les profils d'imprimante physique sont stockés dans le répertoire PrusaSlicer/physical_printer."
+
+#: src/slic3r/Utils/AstroBox.cpp:92
msgid "Note: AstroBox version at least 1.1.0 is required."
msgstr "Remarque : AstroBox en version 1.1.0 minimum est requis."
-#: src/slic3r/Utils/FlashAir.cpp:73
+#: src/slic3r/Utils/FlashAir.cpp:76
msgid "Note: FlashAir with firmware 2.00.02 or newer and activated upload function is required."
msgstr "Remarque : FlashAir avec firmware 2.00.02 ou plus récent avec une fonction de téléchargement activée est nécessaire."
-#: src/slic3r/Utils/OctoPrint.cpp:89
+#: src/slic3r/Utils/OctoPrint.cpp:91
msgid "Note: OctoPrint version at least 1.1.0 is required."
msgstr "Note : une version d'Octoprint supérieure ou égale à 1.1.0 est requise."
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1345
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1192
msgid "Note: some shortcuts work in (non)editing mode only."
msgstr "Remarque: certains raccourcis ne fonctionnent qu'en mode de (non-)édition."
-#: src/slic3r/GUI/Tab.cpp:1251 src/slic3r/GUI/Tab.cpp:1252
-#: src/slic3r/GUI/Tab.cpp:1540 src/slic3r/GUI/Tab.cpp:1541
-#: src/slic3r/GUI/Tab.cpp:2012 src/slic3r/GUI/Tab.cpp:2013
-#: src/slic3r/GUI/Tab.cpp:2128 src/slic3r/GUI/Tab.cpp:2129
-#: src/slic3r/GUI/Tab.cpp:3535 src/slic3r/GUI/Tab.cpp:3536
+#: src/slic3r/GUI/SavePresetDialog.cpp:151
+msgid "Note: This preset will be replaced after saving"
+msgstr "Remarque : ce préréglage sera remplacé après l'enregistrement"
+
+#: src/slic3r/GUI/Tab.cpp:1581 src/slic3r/GUI/Tab.cpp:1582
+#: src/slic3r/GUI/Tab.cpp:1887 src/slic3r/GUI/Tab.cpp:1888
+#: src/slic3r/GUI/Tab.cpp:2221 src/slic3r/GUI/Tab.cpp:2222
+#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/Tab.cpp:2298
+#: src/slic3r/GUI/Tab.cpp:3951 src/slic3r/GUI/Tab.cpp:3952
msgid "Notes"
msgstr "Notes"
-#: src/slic3r/GUI/ConfigWizard.cpp:1751 src/slic3r/GUI/DoubleSlider.cpp:1905
-#: src/slic3r/GUI/DoubleSlider.cpp:1926 src/slic3r/GUI/GUI.cpp:245
+#: src/slic3r/GUI/ConfigWizard.cpp:2237 src/slic3r/GUI/DoubleSlider.cpp:2124
+#: src/slic3r/GUI/DoubleSlider.cpp:2144 src/slic3r/GUI/GUI.cpp:244
msgid "Notice"
msgstr "Remarque"
-#: src/slic3r/GUI/ConfigWizard.cpp:218
+#: src/slic3r/GUI/ConfigWizard.cpp:236
msgid "nozzle"
msgstr "buse"
-#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2340
-#: src/libslic3r/PrintConfig.cpp:1326
+#: src/slic3r/GUI/Tab.cpp:1790
+msgid "Nozzle"
+msgstr "Buse"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1392
+msgid "Nozzle and Bed Temperatures"
+msgstr "Températures de la buse et du plateau"
+
+#: src/slic3r/GUI/Tab.cpp:2104 src/slic3r/GUI/Tab.cpp:2509
+#: src/libslic3r/PrintConfig.cpp:1434
msgid "Nozzle diameter"
msgstr "Diamètre de la buse"
-#: src/slic3r/GUI/ConfigWizard.cpp:969
+#: src/slic3r/GUI/ConfigWizard.cpp:1335
msgid "Nozzle Diameter:"
msgstr "Diamètre de la Buse :"
-#: src/libslic3r/PrintConfig.cpp:650
+#: src/libslic3r/PrintConfig.cpp:2201
+msgid "Nozzle temperature"
+msgstr "Température de la buse"
+
+#: src/libslic3r/PrintConfig.cpp:2198
+msgid "Nozzle temperature for layers after the first one. Set this to zero to disable temperature control commands in the output G-code."
+msgstr "Température de la buse pour les couches après la première. Réglez ceci sur zéro pour désactiver les commandes de contrôle de température dans le G-code de sortie."
+
+#: src/libslic3r/PrintConfig.cpp:961
+msgid "Nozzle temperature for the first layer. If you want to control temperature manually during print, set this to zero to disable temperature control commands in the output G-code."
+msgstr "Température de la buse pour la première couche. Si vous souhaitez contrôler la température manuellement pendant l'impression, réglez ce paramètre sur zéro pour désactiver les commandes de contrôle de la température dans le G-code de sortie."
+
+#: src/libslic3r/PrintConfig.cpp:686
msgid "Number of cooling moves"
msgstr "Nombres de mouvements de refroidissement"
-#: src/slic3r/GUI/Tab.cpp:1839
+#: src/slic3r/GUI/Tab.cpp:2073
msgid "Number of extruders of the printer."
msgstr "Nombre d'extrudeurs de l'imprimante."
-#: src/libslic3r/PrintConfig.cpp:1975
+#: src/libslic3r/PrintConfig.cpp:2117
msgid "Number of interface layers to insert between the object(s) and support material."
msgstr "Nombre de couches d'interface à insérer entre le(s) objet(s) et les supports."
-#: src/libslic3r/PrintConfig.cpp:1697
+#: src/libslic3r/PrintConfig.cpp:1812
msgid "Number of loops for the skirt. If the Minimum Extrusion Length option is set, the number of loops might be greater than the one configured here. Set this to zero to disable skirt completely."
msgstr "Nombre de boucles pour la jupe. Si la Longueur Minimale d'Extrusion est paramétrée, le nombre de boucles minimal sera plus grand que celui configuré ici. Mettez à zéro pour désactiver complètement la jupe."
-#: src/libslic3r/PrintConfig.cpp:2365
+#: src/libslic3r/PrintConfig.cpp:2508
msgid "Number of pixels in"
msgstr "Nombre de pixels présents"
-#: src/libslic3r/PrintConfig.cpp:2367
+#: src/libslic3r/PrintConfig.cpp:2510
msgid "Number of pixels in X"
msgstr "Nombre de pixels présents dans X"
-#: src/libslic3r/PrintConfig.cpp:2373
+#: src/libslic3r/PrintConfig.cpp:2516
msgid "Number of pixels in Y"
msgstr "Nombre de pixels présents dans Y"
-#: src/libslic3r/PrintConfig.cpp:176
+#: src/libslic3r/PrintConfig.cpp:210
msgid "Number of solid layers to generate on bottom surfaces."
msgstr "Nombre de couches solides à générer sur les surfaces inférieures."
-#: src/libslic3r/PrintConfig.cpp:1781
+#: src/libslic3r/PrintConfig.cpp:1896
msgid "Number of solid layers to generate on top and bottom surfaces."
msgstr "Nombre de couches solides à générer sur les surfaces supérieures et inférieures."
-#: src/libslic3r/PrintConfig.cpp:2134
+#: src/libslic3r/PrintConfig.cpp:2277
msgid "Number of solid layers to generate on top surfaces."
msgstr "Nombre de couches solides à générer sur les surfaces supérieures."
-#: src/libslic3r/PrintConfig.cpp:2518
+#: src/libslic3r/PrintConfig.cpp:2661
msgid "Number of the layers needed for the exposure time fade from initial exposure time to the exposure time"
msgstr "Nombre de couches nécessaires pour que le temps d'exposition passe du temps d'exposition initial au temps d'exposition normal"
-#: src/slic3r/GUI/Plater.cpp:241
+#: src/slic3r/GUI/Plater.cpp:247
msgid "Number of tool changes"
msgstr "Nombre de changements d'outil"
-#: src/libslic3r/PrintConfig.cpp:2753
+#: src/slic3r/GUI/Tab.cpp:4127 src/libslic3r/PrintConfig.cpp:2917
msgid "Object elevation"
msgstr "Élévation de l'objet"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2466
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2858
msgid "Object manipulation"
msgstr "Manipulation de l'Objet"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:638
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:163 src/libslic3r/GCode.cpp:623
msgid "Object name"
msgstr "Nom de l'objet"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3417
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3880
msgid "Object or Instance"
msgstr "Objet ou Instance"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1106
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1230
msgid "Object reordered"
msgstr "Objet réorganisé"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2479
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2871
msgid "Object Settings to modify"
msgstr "Réglages de l'Objet à modifier"
-#: src/slic3r/GUI/Plater.cpp:2529
+#: src/slic3r/GUI/Plater.cpp:2491
msgid "Object too large?"
msgstr "Objet trop grand ?"
-#: src/libslic3r/PrintConfig.cpp:2262
+#: src/libslic3r/PrintConfig.cpp:2405
msgid "Object will be used to purge the nozzle after a toolchange to save material that would otherwise end up in the wipe tower and decrease print time. Colours of the objects will be mixed as a result."
msgstr "L'objet sera utilisé pour purger la buse après un changement d'outil pour économiser du matériau qui finirait normalement dans la tour de nettoyage et raccourcirait le temps d'impression. Par conséquent, les couleurs de l'objet seront mélangées."
-#: src/slic3r/GUI/Plater.cpp:1194
+#: src/slic3r/GUI/Plater.cpp:1103
msgid "object(s)"
msgstr "objet(s)"
-#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245
+#: src/slic3r/GUI/Plater.cpp:1143 src/slic3r/GUI/Plater.cpp:1160
msgid "objects"
msgstr "objets"
-#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:855
+#: src/libslic3r/PrintConfig.cpp:465 src/libslic3r/PrintConfig.cpp:893
msgid "Octagram Spiral"
msgstr "Spirale Octagramme"
@@ -5023,64 +5922,113 @@ msgstr "Spirale Octagramme"
msgid "OctoPrint version"
msgstr "Version d'OctoPrint"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3425
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3888
msgid "of a current Object"
msgstr "d'un Objet en cours"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42
msgid "Offset"
msgstr "Décalage"
-#: src/slic3r/GUI/Tab.cpp:1755
-#, c-format
+#: src/slic3r/GUI/Preferences.cpp:422
+msgid "Old regular layout with the tab bar"
+msgstr "Ancienne disposition avec la barre d'onglets"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:608
+msgid "Old Value"
+msgstr "Ancienne valeur"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1177
+msgid "Old value"
+msgstr "Ancienne valeur"
+
+#: src/slic3r/GUI/Preferences.cpp:123
+msgid "On OSX there is always only one instance of app running by default. However it is allowed to run multiple instances of same app from the command line. In such case this settings will allow only one instance."
+msgstr "Sur OSX, il n'y a toujours qu'une seule instance d'application en cours d'exécution par défaut. Cependant, il est permis d'exécuter plusieurs instances de la même application à partir de la ligne de commande. Dans ce cas, ces paramètres n'autoriseront qu'une seule instance."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:359
+#, possible-c-format
msgid "On this system, %s uses HTTPS certificates from the system Certificate Store or Keychain."
msgstr "Dans ce système, %s utilise des certificats HTTPS issus du système Magasin de Certificats ou Trousseau."
-#: src/slic3r/GUI/DoubleSlider.cpp:950
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
+msgid "On/Off one layer mode of the vertical slider"
+msgstr "On/Off mode couche unique de la barre de défilement verticale"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1064
msgid "One layer mode"
msgstr "Mode couche unique"
-#: src/libslic3r/Print.cpp:1365
+#: src/libslic3r/Print.cpp:1391
msgid "One or more object were assigned an extruder that the printer does not have."
msgstr "Un ou plusieurs objets ont été affectés à un extrudeur que l'imprimante ne possède pas."
-#: src/libslic3r/PrintConfig.cpp:1903 src/libslic3r/PrintConfig.cpp:2676
+#: src/slic3r/GUI/GUI_App.cpp:1784
+msgid "Ongoing uploads"
+msgstr "Téléchargements en cours"
+
+#: src/libslic3r/Print.cpp:1269
+msgid "Only a single object may be printed at a time in Spiral Vase mode. Either remove all but the last object, or enable sequential mode by \"complete_objects\"."
+msgstr "Vous ne pouvez imprimer qu'un seul objet à la fois en mode Vase Spirale. Vous devez soit retirer tous les objets sauf le dernier, soit activer le mode séquentiel avec \"complete_objects\"."
+
+#: src/libslic3r/PrintConfig.cpp:2045 src/libslic3r/PrintConfig.cpp:2840
msgid "Only create support if it lies on a build plate. Don't create support on a print."
msgstr "Créer uniquement des supports reposant sur le plateau. Ne pas créer pas de supports sur une impression."
-#: src/libslic3r/PrintConfig.cpp:1027
+#: src/libslic3r/PrintConfig.cpp:1071
msgid "Only infill where needed"
msgstr "Faire remplissage seulement où cela est nécessaire"
-#: src/slic3r/GUI/Tab.cpp:2373
+#: src/slic3r/GUI/Tab.cpp:2542
msgid "Only lift Z"
msgstr "Lever Z seulement"
-#: src/libslic3r/PrintConfig.cpp:1570
+#: src/libslic3r/PrintConfig.cpp:1678
msgid "Only lift Z above"
msgstr "Lever Z seulement au-dessus de"
-#: src/libslic3r/PrintConfig.cpp:1579
+#: src/libslic3r/PrintConfig.cpp:1687
msgid "Only lift Z below"
msgstr "Lever Z seulement en-dessous de"
-#: src/libslic3r/PrintConfig.cpp:1348
+#: src/libslic3r/PrintConfig.cpp:1456
msgid "Only retract when crossing perimeters"
msgstr "Rétracter uniquement lors du franchissement de périmètres"
-#: src/slic3r/GUI/Tab.cpp:1187
+#: src/slic3r/GUI/ConfigWizard.cpp:714
+msgid "Only the following installed printers are compatible with the selected filament:"
+msgstr "Seules les imprimantes installées qui suivent sont compatibles avec le filament sélectionné :"
+
+#: src/slic3r/GUI/Tab.cpp:1517
msgid "Ooze prevention"
msgstr "Prévention des coulures"
-#: src/libslic3r/Print.cpp:1266
+#: src/libslic3r/Print.cpp:1292
msgid "Ooze prevention is currently not supported with the wipe tower enabled."
msgstr "La prévention des écoulements n'est actuellement pas supportée lorsque la tour de nettoyage est activée."
-#: src/slic3r/GUI/MainFrame.cpp:408
+#: src/slic3r/GUI/MainFrame.cpp:1398
+msgid "Open &PrusaSlicer"
+msgstr "Ouvrir &PrusaSlicer"
+
+#: src/slic3r/GUI/MainFrame.cpp:1391
+msgid "Open a G-code file"
+msgstr "Ouvrir un fichier G-code"
+
+#: src/slic3r/GUI/MainFrame.cpp:63 src/slic3r/GUI/MainFrame.cpp:77
+#: src/slic3r/GUI/MainFrame.cpp:1262
+msgid "Open a new PrusaSlicer instance"
+msgstr "Ouvrir une nouvelle instance de PrusaSlicer"
+
+#: src/slic3r/GUI/MainFrame.cpp:989
msgid "Open a project file"
msgstr "Ouvrir un fichier de projet"
-#: src/slic3r/GUI/Tab.cpp:1729
+#: src/slic3r/GUI/Plater.cpp:1417
+msgid "Open as project"
+msgstr "Ouvrir en tant que projet"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:330
msgid "Open CA certificate file"
msgstr "Ouvrir le fichier de certificat CA"
@@ -5093,116 +6041,150 @@ msgstr "Ouvrir la page du journal des modifications"
msgid "Open download page"
msgstr "Ouvrir la page de téléchargement"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:113
+#: src/slic3r/GUI/NotificationManager.cpp:742
+msgid "Open Folder."
+msgstr "Ouvrir un répertoire."
+
+#: src/slic3r/Utils/Process.cpp:151
+msgid "Open G-code file:"
+msgstr "Ouvrir un fichier G-code :"
+
+#: src/slic3r/GUI/MainFrame.cpp:66 src/slic3r/GUI/MainFrame.cpp:1141
+msgid "Open G-code viewer"
+msgstr "Ouvrir la visionneuse de G-code"
+
+#: src/slic3r/GUI/MainFrame.cpp:79
+msgid "Open new G-code viewer"
+msgstr "Ouvrir une nouvelle visionneuse de G-code"
+
+#: src/slic3r/GUI/MainFrame.cpp:63 src/slic3r/GUI/MainFrame.cpp:1262
+msgid "Open new instance"
+msgstr "Ouvrir une nouvelle instance"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:106
msgid "Open project STL/OBJ/AMF/3MF with config, clear plater"
msgstr "Ouvrir un projet STL/OBJ/AMF/3MF avec configuration, libérer le plateau"
-#: src/slic3r/GUI/MainFrame.cpp:693
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:77 src/slic3r/GUI/MainFrame.cpp:1398
+msgid "Open PrusaSlicer"
+msgstr "Ouvrir PrusaSlicer"
+
+#: src/slic3r/GUI/MainFrame.cpp:918 src/slic3r/GUI/MainFrame.cpp:1317
+#, possible-c-format
msgid "Open the %s website in your browser"
msgstr "Ouvrir le site web de %s dans votre navigateur"
-#: src/slic3r/GUI/MainFrame.cpp:684
+#: src/slic3r/GUI/MainFrame.cpp:909 src/slic3r/GUI/MainFrame.cpp:1308
msgid "Open the Prusa3D drivers download page in your browser"
msgstr "Ouvrir la page de téléchargement des drivers Prusa3D dans votre navigateur"
-#: src/slic3r/GUI/MainFrame.cpp:686
+#: src/slic3r/GUI/MainFrame.cpp:911 src/slic3r/GUI/MainFrame.cpp:1310
msgid "Open the software releases page in your browser"
msgstr "Ouvrir la page des publications du logiciel dans votre navigateur"
-#: src/slic3r/GUI/Plater.cpp:4040
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:220 src/slic3r/GUI/Plater.cpp:3961
msgid "Optimize orientation"
msgstr "Optimiser l'orientation"
-#: src/slic3r/GUI/Plater.cpp:2767
+#: src/slic3r/GUI/Plater.cpp:1555
msgid "Optimize Rotation"
msgstr "Optimiser la Rotation"
-#: src/slic3r/GUI/Plater.cpp:4040
+#: src/slic3r/GUI/Plater.cpp:3962
msgid "Optimize the rotation of the object for better print results."
msgstr "Optimiser la rotation de l'objet pour un meilleur résultat d'impression."
-#: src/libslic3r/PrintConfig.cpp:137
+#: src/libslic3r/PrintConfig.cpp:170
msgid "Optimize travel moves in order to minimize the crossing of perimeters. This is mostly useful with Bowden extruders which suffer from oozing. This feature slows down both the print and the G-code generation."
msgstr "Optimiser les déplacements afin de minimiser le franchissement de périmètres. Ceci est surtout utile avec les extruder Bowden qui sont sujets aux coulures. Cette fonctionnalité ralentit l'impression et la génération du G-code."
-#: src/slic3r/GUI/Tab.cpp:1131
+#: src/slic3r/GUI/GCodeViewer.cpp:2525 src/slic3r/GUI/GUI_Preview.cpp:320
+#: src/slic3r/GUI/GUI_Preview.cpp:333
+msgid "Options"
+msgstr "Options"
+
+#: src/slic3r/GUI/Tab.cpp:1460
msgid "Options for support material and raft"
msgstr "Options pour le matériau de support et le radeau"
-#: src/slic3r/GUI/DoubleSlider.cpp:989
+#: src/slic3r/GUI/Mouse3DController.cpp:315
+msgid "Options:"
+msgstr "Options :"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1112
msgid "or press \"+\" key"
msgstr "ou appuyez sur la touche \"+\""
-#: src/slic3r/GUI/Plater.cpp:2892
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:74
msgid "Orientation found."
msgstr "Orientation trouvée."
-#: src/slic3r/GUI/Plater.cpp:2891
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:73
msgid "Orientation search canceled."
msgstr "Recherche de l'orientation annulée."
-#: src/slic3r/GUI/BedShapeDialog.cpp:84
+#: src/slic3r/GUI/BedShapeDialog.cpp:94
msgid "Origin"
msgstr "Origine"
-#: src/slic3r/GUI/Tab.cpp:1227
+#: src/slic3r/GUI/Tab.cpp:1557
msgid "Other"
msgstr "Autre"
-#: src/libslic3r/PrintConfig.cpp:144 src/libslic3r/PrintConfig.cpp:2064
+#: src/libslic3r/PrintConfig.cpp:177 src/libslic3r/PrintConfig.cpp:2206
msgid "Other layers"
msgstr "Autres couches"
-#: src/slic3r/GUI/ConfigWizard.cpp:856
+#: src/slic3r/GUI/ConfigWizard.cpp:1222
msgid "Other Vendors"
msgstr "Autres Fabriquants"
-#: src/slic3r/GUI/Tab.cpp:1238 src/slic3r/GUI/Tab.cpp:3666
+#: src/slic3r/GUI/Tab.cpp:1568 src/slic3r/GUI/Tab.cpp:4085
msgid "Output file"
msgstr "Fichier de sortie"
-#: src/libslic3r/PrintConfig.cpp:3493
+#: src/libslic3r/PrintConfig.cpp:3692
msgid "Output File"
msgstr "Fichier de Sortie"
-#: src/libslic3r/PrintConfig.cpp:1363
+#: src/libslic3r/PrintConfig.cpp:1471
msgid "Output filename format"
msgstr "Format du nom de fichier de sortie"
-#: src/libslic3r/PrintConfig.cpp:3381
+#: src/libslic3r/PrintConfig.cpp:3580
msgid "Output Model Info"
msgstr "Information du Modèle de Sortie"
-#: src/slic3r/GUI/Tab.cpp:1230 src/slic3r/GUI/Tab.cpp:3665
+#: src/slic3r/GUI/Tab.cpp:1560 src/slic3r/GUI/Tab.cpp:4084
msgid "Output options"
msgstr "Options de sortie"
-#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:312
+#: src/slic3r/GUI/GUI_Preview.cpp:303 src/libslic3r/ExtrusionEntity.cpp:316
+#: src/libslic3r/ExtrusionEntity.cpp:340
msgid "Overhang perimeter"
msgstr "Périmètre en surplomb"
-#: src/libslic3r/PrintConfig.cpp:2042
+#: src/libslic3r/PrintConfig.cpp:2184
msgid "Overhang threshold"
msgstr "Seuil de surplomb"
-#: src/slic3r/GUI/Tab.cpp:1215
+#: src/slic3r/GUI/Tab.cpp:1545
msgid "Overlap"
msgstr "Chevauchement"
-#: src/slic3r/GUI/MainFrame.cpp:614
+#: src/slic3r/GUI/MainFrame.cpp:1221
msgid "P&rint Settings Tab"
msgstr "Onglet des &Réglages d'Impression"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:107 src/slic3r/GUI/GUI_ObjectList.cpp:625
-#: src/slic3r/GUI/Plater.cpp:635 src/slic3r/GUI/Tab.cpp:3636
-#: src/slic3r/GUI/Tab.cpp:3637 src/libslic3r/PrintConfig.cpp:2781
-#: src/libslic3r/PrintConfig.cpp:2788 src/libslic3r/PrintConfig.cpp:2802
-#: src/libslic3r/PrintConfig.cpp:2813 src/libslic3r/PrintConfig.cpp:2823
-#: src/libslic3r/PrintConfig.cpp:2845 src/libslic3r/PrintConfig.cpp:2856
-#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:2870
-#: src/libslic3r/PrintConfig.cpp:2881 src/libslic3r/PrintConfig.cpp:2890
-#: src/libslic3r/PrintConfig.cpp:2899
+#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:664
+#: src/slic3r/GUI/Plater.cpp:501 src/slic3r/GUI/Tab.cpp:4055
+#: src/slic3r/GUI/Tab.cpp:4056 src/slic3r/GUI/Tab.cpp:4127
+#: src/libslic3r/PrintConfig.cpp:2945 src/libslic3r/PrintConfig.cpp:2952
+#: src/libslic3r/PrintConfig.cpp:2966 src/libslic3r/PrintConfig.cpp:2977
+#: src/libslic3r/PrintConfig.cpp:2987 src/libslic3r/PrintConfig.cpp:3009
+#: src/libslic3r/PrintConfig.cpp:3020 src/libslic3r/PrintConfig.cpp:3027
+#: src/libslic3r/PrintConfig.cpp:3034 src/libslic3r/PrintConfig.cpp:3045
+#: src/libslic3r/PrintConfig.cpp:3054 src/libslic3r/PrintConfig.cpp:3063
msgid "Pad"
msgstr "Socle"
@@ -5210,445 +6192,517 @@ msgstr "Socle"
msgid "Pad and Support"
msgstr "Socle et Support"
-#: src/libslic3r/PrintConfig.cpp:2855
+#: src/slic3r/GUI/Tab.cpp:4127 src/libslic3r/PrintConfig.cpp:3019
msgid "Pad around object"
msgstr "Socle autour de l'objet"
-#: src/libslic3r/PrintConfig.cpp:2862
+#: src/libslic3r/PrintConfig.cpp:3026
msgid "Pad around object everywhere"
msgstr "Socle partout autour de l'objet"
-#: src/libslic3r/PrintConfig.cpp:2811
+#: src/libslic3r/PrintConfig.cpp:2975
msgid "Pad brim size"
msgstr "Taille du bord de socle"
-#: src/libslic3r/SLA/Pad.cpp:691
+#: src/libslic3r/SLA/Pad.cpp:532
msgid "Pad brim size is too small for the current configuration."
msgstr "La taille du bord de socle est trop petite pour la configuration actuelle."
-#: src/libslic3r/PrintConfig.cpp:2898
+#: src/libslic3r/PrintConfig.cpp:3062
msgid "Pad object connector penetration"
msgstr "Pénétration du connecteur de l'objet socle"
-#: src/libslic3r/PrintConfig.cpp:2880
+#: src/libslic3r/PrintConfig.cpp:3044
msgid "Pad object connector stride"
msgstr "Pas du connecteur de l'objet socle"
-#: src/libslic3r/PrintConfig.cpp:2889
+#: src/libslic3r/PrintConfig.cpp:3053
msgid "Pad object connector width"
msgstr "Largeur du connecteur de l'objet socle"
-#: src/libslic3r/PrintConfig.cpp:2869
+#: src/libslic3r/PrintConfig.cpp:3033
msgid "Pad object gap"
msgstr "Espace entre l'objet et le socle"
-#: src/libslic3r/PrintConfig.cpp:2797
+#: src/libslic3r/PrintConfig.cpp:2961
msgid "Pad wall height"
msgstr "Hauteur de la paroi du socle"
-#: src/libslic3r/PrintConfig.cpp:2844
+#: src/libslic3r/PrintConfig.cpp:3008
msgid "Pad wall slope"
msgstr "Inclinaison de la paroi du socle"
-#: src/libslic3r/PrintConfig.cpp:2787
+#: src/libslic3r/PrintConfig.cpp:2951
msgid "Pad wall thickness"
msgstr "Épaisseur de la paroi du socle"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
msgid "Page Down"
msgstr "Page Down"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
msgid "Page Up"
msgstr "Page Up"
-#: src/slic3r/GUI/Field.cpp:139
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33
+msgid "Paint-on supports"
+msgstr "Supports peints"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:178
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:159
+msgid "Paints all facets inside, regardless of their orientation."
+msgstr "Peint toutes les facettes à l'intérieur, quelle que soit leur orientation."
+
+#: src/slic3r/GUI/Field.cpp:187
msgid "parameter name"
msgstr "nom du paramètre"
-#: src/slic3r/GUI/Field.cpp:243
+#: src/slic3r/GUI/Field.cpp:291
msgid "Parameter validation"
msgstr "Validation du paramètre"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3418
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3881
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
msgid "Part"
msgstr "Pièce"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2494
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2886
msgid "Part manipulation"
msgstr "Manipulation d'une pièce"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2483
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2875
msgid "Part Settings to modify"
msgstr "Réglages de la pièce à modifier"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4514
+#: src/libslic3r/PrintConfig.cpp:138
+msgid "Password"
+msgstr "Mot de passe"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4880
msgid "Paste"
msgstr "Coller"
-#: src/slic3r/GUI/MainFrame.cpp:592
+#: src/slic3r/GUI/MainFrame.cpp:1198
msgid "Paste clipboard"
msgstr "Coller le presse-papier"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:133
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:128
msgid "Paste from clipboard"
msgstr "Coller depuis le presse-papier"
-#: src/slic3r/GUI/Plater.cpp:5606
+#: src/slic3r/GUI/Plater.cpp:5803
msgid "Paste From Clipboard"
msgstr "Coller Depuis le Presse-Papier"
-#: src/libslic3r/PrintConfig.cpp:2002
+#: src/libslic3r/PrintConfig.cpp:2144
msgid "Pattern"
msgstr "Motif"
-#: src/libslic3r/PrintConfig.cpp:1891
+#: src/libslic3r/PrintConfig.cpp:2033
msgid "Pattern angle"
msgstr "Angle du motif"
-#: src/libslic3r/PrintConfig.cpp:2016
+#: src/libslic3r/PrintConfig.cpp:2158
msgid "Pattern spacing"
msgstr "Espacement du motif"
-#: src/libslic3r/PrintConfig.cpp:2004
+#: src/libslic3r/PrintConfig.cpp:2146
msgid "Pattern used to generate support material."
msgstr "Motif utilisé pour générer les supports."
-#: src/slic3r/GUI/Plater.cpp:1261
+#: src/slic3r/GUI/GCodeViewer.cpp:2437 src/slic3r/GUI/GCodeViewer.cpp:2460
+#: src/slic3r/GUI/Plater.cpp:1199
msgid "Pause"
msgstr "Pause"
-#: src/slic3r/GUI/DoubleSlider.cpp:1009
+#: src/slic3r/GUI/DoubleSlider.cpp:1133
msgid "Pause print (\"%1%\")"
msgstr "Mettre en pause l'impression (\"%1%\")"
-#: src/slic3r/GUI/GLCanvas3D.cpp:934 src/slic3r/GUI/GLCanvas3D.cpp:943
-#: src/slic3r/GUI/GLCanvas3D.cpp:982
-msgid "Pause print or custom G-code"
-msgstr "Pause d'impression ou G-code personnalisé"
+#: src/slic3r/GUI/Tab.cpp:2209 src/libslic3r/PrintConfig.cpp:1969
+msgid "Pause Print G-code"
+msgstr "G-code de pause de l'impression"
+
+#: src/libslic3r/PrintConfig.cpp:1147
+msgid "Percent of a flow rate relative to object's normal layer height."
+msgstr "Pourcentage d'un débit par rapport à la hauteur de couche normale de l'objet."
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2233
+msgid "Percentage"
+msgstr "Pourcentage"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:175
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:177
msgid "Perform cut"
msgstr "Effectuer la coupe"
-#: src/libslic3r/PrintConfig.cpp:2927
+#: src/libslic3r/PrintConfig.cpp:3091
msgid "Performance vs accuracy of calculation. Lower values may produce unwanted artifacts."
msgstr "Performance vs précision du calcul. Des valeurs plus faibles peuvent produire des artefacts indésirables."
-#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:310
+#: src/slic3r/GUI/GUI_Preview.cpp:301 src/libslic3r/ExtrusionEntity.cpp:314
+#: src/libslic3r/ExtrusionEntity.cpp:336
msgid "Perimeter"
msgstr "Périmètre"
-#: src/libslic3r/PrintConfig.cpp:1408
+#: src/libslic3r/PrintConfig.cpp:1516
msgid "Perimeter extruder"
msgstr "Extrudeur pour les périmètres"
-#: src/slic3r/GUI/PresetHints.cpp:165
+#: src/slic3r/GUI/PresetHints.cpp:164
msgid "perimeters"
msgstr "périmètres"
-#: src/libslic3r/PrintConfig.cpp:1399 src/libslic3r/PrintConfig.cpp:1417
-#: src/libslic3r/PrintConfig.cpp:1430 src/libslic3r/PrintConfig.cpp:1440
+#: src/libslic3r/PrintConfig.cpp:1507 src/libslic3r/PrintConfig.cpp:1525
+#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1548
msgid "Perimeters"
msgstr "Périmètres"
-#: src/slic3r/GUI/ConfigWizard.cpp:860
-#, c-format
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:159
+msgid "Physical Printer"
+msgstr "Imprimante physique"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:789
+#: src/slic3r/GUI/PresetComboBoxes.cpp:948
+msgid "Physical printers"
+msgstr "Imprimantes physiques"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1226
+#, possible-c-format
msgid "Pick another vendor supported by %s"
msgstr "Choisissez un autre fournisseur pris en charge par %s"
-#: src/libslic3r/PrintConfig.cpp:66
-msgid "Picture sizes to be stored into a .gcode and .sl1 files"
-msgstr "Tailles d'image devant être stockées dans des fichiers .gcode et .sl1"
+#: src/libslic3r/PrintConfig.cpp:67
+msgid "Picture sizes to be stored into a .gcode and .sl1 files, in the following format: \"XxY, XxY, ...\""
+msgstr "Tailles de photo à stocker dans un fichier .gcode et .sl1, au format suivant : \"XxY, XxY, ...\""
+
+#: src/libslic3r/PrintConfig.cpp:2822
+msgid "Pillar connection mode"
+msgstr "Mode de connexion par pilier"
+
+#: src/libslic3r/PrintConfig.cpp:2791
+msgid "Pillar diameter"
+msgstr "Diamètre du pilier"
-#: src/libslic3r/PrintConfig.cpp:2681
+#: src/libslic3r/PrintConfig.cpp:2845
msgid "Pillar widening factor"
msgstr "Facteur d'élargissement du pilier"
-#: src/slic3r/GUI/ConfigManipulation.cpp:330
+#: src/slic3r/GUI/ConfigManipulation.cpp:335
msgid "Pinhead diameter should be smaller than the pillar diameter."
msgstr "Le diamètre de la tête d'épingle doit être plus petit que le diamètre du pilier."
-#: src/slic3r/GUI/DoubleSlider.cpp:79
+#: src/libslic3r/PrintConfig.cpp:2763
+msgid "Pinhead front diameter"
+msgstr "Diamètre avant de la tête d'épingle"
+
+#: src/libslic3r/PrintConfig.cpp:2781
+msgid "Pinhead width"
+msgstr "Largeur de la tête d'épingle"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:110
msgid "Place bearings in slots and resume printing"
msgstr "Placer les roulements dans les fentes et reprendre l'impression"
-#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:45
+#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:41
msgid "Place on face"
msgstr "Positionner sur la surface"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 src/slic3r/GUI/MainFrame.cpp:204
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 src/slic3r/GUI/MainFrame.cpp:340
+#: src/slic3r/GUI/MainFrame.cpp:352
msgid "Plater"
msgstr "Plateau"
-#: src/slic3r/GUI/GUI_App.cpp:1085
+#: src/slic3r/GUI/GUI_App.cpp:1877
msgid "Please check and fix your object list."
msgstr "Veuillez vérifier et réparer votre liste d'objet."
-#: src/slic3r/GUI/Plater.cpp:2312 src/slic3r/GUI/Tab.cpp:2959
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:209 src/slic3r/GUI/Plater.cpp:2255
+#: src/slic3r/GUI/Tab.cpp:3188
msgid "Please check your object list before preset changing."
msgstr "Veuillez vérifier votre liste d'objet avant le changement de préréglage."
-#: src/slic3r/GUI/Plater.cpp:3286
+#: src/slic3r/GUI/Plater.cpp:3089
msgid "Please select the file to reload"
msgstr "Veuillez sélectionner le fichier à recharger"
-#: src/slic3r/GUI/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:291
+#: src/slic3r/GUI/AboutDialog.cpp:43 src/slic3r/GUI/AboutDialog.cpp:48
+#: src/slic3r/GUI/AboutDialog.cpp:317
msgid "Portions copyright"
msgstr "Copyright des sections"
-#: src/libslic3r/PrintConfig.cpp:2400
+#: src/libslic3r/PrintConfig.cpp:2543
msgid "Portrait"
msgstr "Portrait"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:215
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:457
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:223
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:505
msgid "Position"
msgstr "Position"
-#: src/slic3r/GUI/Tab.cpp:2367
+#: src/slic3r/GUI/Tab.cpp:2536
msgid "Position (for multi-extruder printers)"
msgstr "Position (pour les imprimantes multi-extrudeurs)"
-#: src/libslic3r/PrintConfig.cpp:1623
+#: src/libslic3r/PrintConfig.cpp:1731
msgid "Position of perimeters starting points."
msgstr "Position des points de départ des périmètres."
-#: src/libslic3r/PrintConfig.cpp:2224
+#: src/libslic3r/PrintConfig.cpp:2367
msgid "Position X"
msgstr "Position X"
-#: src/libslic3r/PrintConfig.cpp:2231
+#: src/libslic3r/PrintConfig.cpp:2374
msgid "Position Y"
msgstr "Position Y"
-#: src/slic3r/GUI/Tab.cpp:1245 src/libslic3r/PrintConfig.cpp:1453
+#: src/slic3r/GUI/Tab.cpp:1575 src/libslic3r/PrintConfig.cpp:1561
msgid "Post-processing scripts"
msgstr "Scripts de post-traitement"
-#: src/slic3r/GUI/MainFrame.cpp:629
+#: src/slic3r/GUI/MainFrame.cpp:1237
msgid "Pre&view"
msgstr "Pré&visualisation"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 src/slic3r/GUI/Preferences.cpp:10
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 src/slic3r/GUI/Preferences.cpp:12
msgid "Preferences"
msgstr "Préférences"
-#: src/libslic3r/PrintConfig.cpp:1641
+#: src/libslic3r/PrintConfig.cpp:1749
msgid "Preferred direction of the seam"
msgstr "Direction préférée de la jointure"
-#: src/libslic3r/PrintConfig.cpp:1652
+#: src/libslic3r/PrintConfig.cpp:1760
msgid "Preferred direction of the seam - jitter"
msgstr "Direction préférée de la jointure - gigue"
-#: src/libslic3r/PrintObject.cpp:255
+#: src/libslic3r/PrintObject.cpp:261
msgid "Preparing infill"
msgstr "Préparation du remplissage"
-#: src/slic3r/GUI/Tab.cpp:2920
-#, c-format
-msgid "Preset (%s)"
-msgstr "Préréglage (%s)"
+#: src/slic3r/GUI/GUI_App.cpp:855
+msgid "Preparing settings tabs"
+msgstr "Préparation des onglets de réglage"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1009
+msgid "Preset \"%1%\" has the following unsaved changes:"
+msgstr "Le préréglage \"%1%\" comporte les modifications non enregistrées suivantes :"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1014
+msgid "Preset \"%1%\" is not compatible with the new print profile and it has the following unsaved changes:"
+msgstr "Le préréglage \"%1%\" n’est pas compatible avec le nouveau profil d’impression et comporte les modifications non enregistrées suivantes :"
-#: src/slic3r/GUI/Tab.cpp:3082
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1013
+msgid "Preset \"%1%\" is not compatible with the new printer profile and it has the following unsaved changes:"
+msgstr "Le préréglage \"%1%\" n’est pas compatible avec le nouveau profil d’imprimante et comporte les modifications non enregistrées suivantes :"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:136
+msgid "Preset with name \"%1%\" already exists and is incompatible with selected printer."
+msgstr "Un préréglage nommé \"%1%\" existe déjà et il est incompatible avec l'imprimante sélectionnée."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:148
msgid "Preset with name \"%1%\" already exists."
msgstr "Un préréglage avec le nom \"%1%\" existe déjà."
-#: src/slic3r/GUI/Tab.cpp:3029
+#: src/slic3r/GUI/SavePresetDialog.cpp:219
msgctxt "PresetName"
msgid "Copy"
msgstr "Copie"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
+#: src/slic3r/GUI/GLCanvas3D.cpp:3990
+msgid "Press %1%left mouse button to enter the exact value"
+msgstr "Appuyez sur %1% clic gauche sur la souris pour saisir la valeur exacte "
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:157
msgid "Press to activate deselection rectangle"
msgstr "Appuyer pour activer le rectangle de déselection"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:197
-msgid "Press to activate one direction scaling in Gizmo scale"
-msgstr ""
-"Appuyez pour activer le redimensionnement\n"
-"dans une direction pour le Gizmo"
-
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:162
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:156
msgid "Press to activate selection rectangle"
msgstr "Appuyer pour activer le rectangle de sélection"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:198
-msgid ""
-"Press to scale (in Gizmo scale) or rotate (in Gizmo rotate)\n"
-"selected objects around their own center"
-msgstr ""
-"Appuyer pour redimensionner (à l'échelle du Gizmo) ou faire pivoter (rotation du Gizmo)\n"
-"les objets sélectionnés autour de leur propre centre"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:155
+msgid "Press to select multiple objects\nor move multiple objects with mouse"
+msgstr "Clicquez pour sélectionner plusieurs objets\nou pour déplacer plusieurs objets avec la souris"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:161
-msgid ""
-"Press to select multiple objects\n"
-"or move multiple objects with mouse"
-msgstr ""
-"Clicquez pour sélectionner plusieurs objets\n"
-"ou pour déplacer plusieurs objets avec la souris"
-
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:195
-#, no-c-format
-msgid ""
-"Press to snap by 5% in Gizmo scale\n"
-"or to snap by 1mm in Gizmo move"
-msgstr ""
-"Appuyer pour modifier de 5% à l'échelle du Gizmo\n"
-"ou pour modifier d'1 mm le mouvement du Gizmo"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:221
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:231
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:232
+msgid "Press to speed up 5 times while moving thumb\nwith arrow keys or mouse wheel"
+msgstr "Appuyez pour accélérer 5 fois tout en déplaçant le pouce\navec les touches fléchées ou la molette de la souris"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/Plater.cpp:4105
-#: src/slic3r/GUI/Tab.cpp:2390
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:212 src/slic3r/GUI/Plater.cpp:4052
+#: src/slic3r/GUI/Tab.cpp:2559
msgid "Preview"
msgstr "Aperçu"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41
msgid "Preview hollowed and drilled model"
msgstr "Aperçu du modèle évidé et percé"
-#: src/slic3r/GUI/MainFrame.cpp:790
+#: src/slic3r/GUI/MainFrame.cpp:1491
msgid "Previously sliced file ("
msgstr "Fichier précédemment découpé ("
-#: src/libslic3r/PrintConfig.cpp:1851
+#: src/libslic3r/PrintConfig.cpp:1993
msgid "Prime all printing extruders"
msgstr "Préparer tous les extrudeurs d'impression"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1521
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/libslic3r/Preset.cpp:1300
msgid "print"
msgstr "imprimer"
-#: src/slic3r/GUI/MainFrame.cpp:648
+#: src/slic3r/GUI/GCodeViewer.cpp:2436 src/slic3r/GUI/GCodeViewer.cpp:2451
+msgid "Print"
+msgstr "Imprimer"
+
+#: src/slic3r/GUI/MainFrame.cpp:1258
msgid "Print &Host Upload Queue"
msgstr "File d'Attente de Téléchargement de l'&Hôte d'Impression"
-#: src/libslic3r/PrintConfig.cpp:471
+#: src/libslic3r/PrintConfig.cpp:507
msgid "Print contour perimeters from the outermost one to the innermost one instead of the default inverse order."
msgstr "Imprimer les périmètres de l'extérieur vers l'intérieur au lieu de l'ordre par défaut qui est inversé."
-#: src/slic3r/GUI/ConfigWizard.cpp:952
+#: src/slic3r/GUI/ConfigWizard.cpp:1318
msgid "Print Diameters"
msgstr "Diamètres d'Impression"
-#: src/slic3r/GUI/Tab.cpp:1944 src/slic3r/GUI/Tab.cpp:2123
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:209 src/slic3r/GUI/Tab.cpp:2024
msgid "Print Host upload"
msgstr "Téléchargement de l'Hôte d'Impression"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:142
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:138
#: src/slic3r/GUI/PrintHostDialogs.cpp:136
msgid "Print host upload queue"
msgstr "File d'Attente de téléchargement de l'hôte d'impression"
-#: src/slic3r/GUI/DoubleSlider.cpp:970
+#: src/slic3r/GUI/DoubleSlider.cpp:1093
msgid "Print mode"
msgstr "Mode d'impression"
-#: src/slic3r/GUI/Tab.hpp:328 src/slic3r/GUI/Tab.hpp:431
+#: src/slic3r/GUI/GCodeViewer.cpp:2579 src/slic3r/GUI/GUI_Preview.cpp:1476
+msgid "Print pauses"
+msgstr "Pauses d'impression"
+
+#: src/slic3r/GUI/Tab.hpp:378 src/slic3r/GUI/Tab.hpp:502
msgid "Print Settings"
msgstr "Réglages d'Impression"
-#: src/slic3r/GUI/Plater.cpp:815
+#: src/slic3r/GUI/Plater.cpp:690
msgid "Print settings"
msgstr "Réglages d'impression"
-#: src/slic3r/GUI/Tab.cpp:1478
+#: src/slic3r/GUI/GLCanvas3D.cpp:4303 src/slic3r/GUI/GLCanvas3D.cpp:4939
+msgid "Print Settings Tab"
+msgstr "Onglet Réglages d'impression"
+
+#: src/slic3r/GUI/Tab.cpp:1824
msgid "Print speed override"
msgstr "Contournement de la vitesse d'impression"
-#: src/libslic3r/GCode.cpp:638
+#: src/libslic3r/GCode.cpp:623
msgid "Print z"
msgstr "Imprimer z"
-#: src/slic3r/GUI/MainFrame.cpp:621
+#: src/slic3r/GUI/MainFrame.cpp:1228
msgid "Print&er Settings Tab"
msgstr "Onglet des Réglages de l'Imprimant&e"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1621
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1750
msgid "Printable"
msgstr "Imprimable"
-#: src/slic3r/GUI/Plater.cpp:819
+#: src/slic3r/GUI/Plater.cpp:694
msgid "Printer"
msgstr "Imprimante"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1525
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/libslic3r/Preset.cpp:1304
msgid "printer"
msgstr "imprimer"
-#: src/libslic3r/PrintConfig.cpp:2439 src/libslic3r/PrintConfig.cpp:2440
+#: src/libslic3r/PrintConfig.cpp:2582 src/libslic3r/PrintConfig.cpp:2583
msgid "Printer absolute correction"
msgstr "Correction absolue de l'imprimante"
-#: src/libslic3r/PrintConfig.cpp:2456 src/libslic3r/PrintConfig.cpp:2457
+#: src/libslic3r/PrintConfig.cpp:2599 src/libslic3r/PrintConfig.cpp:2600
msgid "Printer gamma correction"
msgstr "Correction gamma de l'imprimante"
-#: src/slic3r/GUI/Tab.cpp:976
+#: src/slic3r/GUI/Tab.cpp:1294
msgid "printer model"
msgstr "modèle de l'imprimante"
-#: src/libslic3r/PrintConfig.cpp:1472
+#: src/libslic3r/PrintConfig.cpp:1580
msgid "Printer notes"
msgstr "Notes de l'imprimante"
-#: src/libslic3r/PrintConfig.cpp:2431 src/libslic3r/PrintConfig.cpp:2432
-#: src/libslic3r/PrintConfig.cpp:2433
+#: src/libslic3r/PrintConfig.cpp:144
+msgid "Printer preset name"
+msgstr "Nom du préréglage de l'imprimante"
+
+#: src/libslic3r/PrintConfig.cpp:2574 src/libslic3r/PrintConfig.cpp:2575
+#: src/libslic3r/PrintConfig.cpp:2576
msgid "Printer scaling correction"
msgstr "Correction de redimensionnement de l'imprimante"
-#: src/slic3r/GUI/Tab.hpp:391
+#: src/slic3r/GUI/Tab.hpp:453
msgid "Printer Settings"
msgstr "Réglages de l'Imprimante"
+#: src/slic3r/GUI/GLCanvas3D.cpp:4305 src/slic3r/GUI/GLCanvas3D.cpp:4941
+msgid "Printer Settings Tab"
+msgstr "Onglet Réglages de l'imprimante"
+
#: src/libslic3r/PrintConfig.cpp:43 src/libslic3r/PrintConfig.cpp:44
msgid "Printer technology"
msgstr "Technologie de l'imprimante"
-#: src/libslic3r/PrintConfig.cpp:1466
+#: src/libslic3r/PrintConfig.cpp:1574
msgid "Printer type"
msgstr "Type d'imprimante"
-#: src/libslic3r/PrintConfig.cpp:1487
+#: src/libslic3r/PrintConfig.cpp:1595
msgid "Printer variant"
msgstr "Variante d'imprimante"
-#: src/libslic3r/PrintConfig.cpp:1481
+#: src/libslic3r/PrintConfig.cpp:1589
msgid "Printer vendor"
msgstr "Fabriquant de l'imprimante"
-#: src/libslic3r/Print.cpp:1388
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:476
+msgid "Printer with name \"%1%\" already exists."
+msgstr "L'imprimante avec le nom \"%1%\" existe déjà."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:587
+msgid "Printer:"
+msgstr "Imprimante :"
+
+#: src/libslic3r/Print.cpp:1414
msgid "Printing with multiple extruders of differing nozzle diameters. If support is to be printed with the current extruder (support_material_extruder == 0 or support_material_interface_extruder == 0), all nozzles have to be of the same diameter."
msgstr "Impression avec plusieurs extrudeurs de différents diamètres de buse. Si le support doit être imprimé avec l'extrudeur courant (support_material_extruder == 0 ou support_material_interface_extruder == 0), toutes les buses doivent avoir le même diamètre."
#. TRN "Processing input_file_basename"
-#: src/slic3r/GUI/MainFrame.cpp:849
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:1550
+#, possible-c-format
msgid "Processing %s"
msgstr "Traitement %s"
-#: src/slic3r/GUI/Plater.cpp:2283
-#, c-format
-msgid "Processing input file %s"
-msgstr "Traitement du fichier d'entrée %s"
-
-#: src/libslic3r/PrintObject.cpp:108
+#: src/libslic3r/PrintObject.cpp:114
msgid "Processing triangulated mesh"
msgstr "Traitement de maillage triangulé"
-#: src/slic3r/GUI/Tab.cpp:1259 src/slic3r/GUI/Tab.cpp:1549
-#: src/slic3r/GUI/Tab.cpp:2020 src/slic3r/GUI/Tab.cpp:2136
-#: src/slic3r/GUI/Tab.cpp:3544 src/slic3r/GUI/Tab.cpp:3672
+#: src/slic3r/GUI/Tab.cpp:1589 src/slic3r/GUI/Tab.cpp:1896
+#: src/slic3r/GUI/Tab.cpp:2229 src/slic3r/GUI/Tab.cpp:2305
+#: src/slic3r/GUI/Tab.cpp:3960 src/slic3r/GUI/Tab.cpp:4091
msgid "Profile dependencies"
msgstr "Dépendances du profil"
-#: src/slic3r/GUI/ConfigWizard.cpp:566
+#: src/slic3r/GUI/ConfigWizard.cpp:590
msgid "Profile:"
msgstr "Profil :"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:150
+#: src/slic3r/GUI/PrintHostDialogs.cpp:148
msgid "Progress"
msgstr "Progression"
@@ -5656,103 +6710,129 @@ msgstr "Progression"
msgid "Progress:"
msgstr "Progression :"
-#: src/slic3r/GUI/MainFrame.cpp:684
+#: src/slic3r/GUI/MainFrame.cpp:909 src/slic3r/GUI/MainFrame.cpp:1308
msgid "Prusa 3D &Drivers"
msgstr "&Drivers Prusa 3D"
-#: src/slic3r/GUI/ConfigWizard.cpp:1995
+#: src/slic3r/GUI/ConfigWizard.cpp:2506
msgid "Prusa FFF Technology Printers"
msgstr "Imprimantes à Technologie FFF Prusa"
-#: src/slic3r/GUI/ConfigWizard.cpp:1998
+#: src/slic3r/GUI/ConfigWizard.cpp:2509
msgid "Prusa MSLA Technology Printers"
msgstr "Imprimantes à Technologie MSLA Prusa"
-#: src/slic3r/GUI/AboutDialog.cpp:260
+#: src/slic3r/Utils/Http.cpp:78
+msgid "PrusaSlicer detected system SSL certificate store in: %1%"
+msgstr "PrusaSlicer a détecté un stockage de certificats SSL système dans : %1%"
+
+#: src/slic3r/GUI/GUI_Init.cpp:85 src/slic3r/GUI/GUI_Init.cpp:88
+msgid "PrusaSlicer GUI initialization failed"
+msgstr "L'initialisation de la GUI de PrusaSlicer a échoué"
+
+#: src/slic3r/GUI/GUI_App.cpp:586
+msgid "PrusaSlicer has encountered a localization error. Please report to PrusaSlicer team, what language was active and in which scenario this issue happened. Thank you.\n\nThe application will now terminate."
+msgstr "PrusaSlicer a rencontré une erreur de localisation. Veuillez signaler à l'équipe PrusaSlicer quelle langue était active et dans quel scénario cette erreur s'est produite. Merci.\n\nL'application va maintenant fermer."
+
+#: src/slic3r/GUI/AboutDialog.cpp:285
msgid "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap community."
msgstr "PrusaSlicer est basé sur Slic3r par Alessandro Ranellucci et la communauté RepRap."
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:284
-#, c-format
-msgid ""
-"PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n"
-"while OpenGL version %s, render %s, vendor %s was detected."
-msgstr ""
-"PrusaSlicer a besoin de pilotes graphiques opérationnels OpenGL 2.0 pour fonctionner correctement,\n"
-"alors que OpenGL version %s, rendu %s, fournisseur %s a été détecté."
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:525
+msgid "PrusaSlicer is closing: Unsaved Changes"
+msgstr "PrusaSlicer se ferme : modifications non enregistrées"
+
+#: src/slic3r/GUI/OpenGLManager.cpp:259
+#, possible-c-format
+msgid "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \nwhile OpenGL version %s, render %s, vendor %s was detected."
+msgstr "PrusaSlicer a besoin de pilotes graphiques opérationnels OpenGL 2.0 pour fonctionner correctement,\nalors que OpenGL version %s, rendu %s, fournisseur %s a été détecté."
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:50
msgid "PrusaSlicer version"
msgstr "Version de PrusaSlicer"
-#: src/slic3r/GUI/ConfigWizard.cpp:815
-msgid ""
-"PrusaSlicer's user interfaces comes in three variants:\n"
-"Simple, Advanced, and Expert.\n"
-"The Simple mode shows only the most frequently used settings relevant for regular 3D printing. The other two offer progressively more sophisticated fine-tuning, they are suitable for advanced and expert users, respectively."
-msgstr ""
-"Les interfaces utilisateur de PrusaSlicer se déclinent en trois variantes :\n"
-"Simple, Avancé et Expert.\n"
-"Le mode Simple affiche uniquement les paramètres les plus fréquemment utilisés pertinents pour l'impression 3D régulière. Les deux autres offrent des réglages fins de plus en plus sophistiqués, ils conviennent respectivement aux utilisateurs avancés et experts."
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:662
+msgid "PrusaSlicer will remember your action."
+msgstr "PrusaSlicer se souviendra de votre action."
-#: src/libslic3r/PrintConfig.cpp:2254
+#: src/slic3r/GUI/ConfigWizard.cpp:1174
+msgid "PrusaSlicer's user interfaces comes in three variants:\nSimple, Advanced, and Expert.\nThe Simple mode shows only the most frequently used settings relevant for regular 3D printing. The other two offer progressively more sophisticated fine-tuning, they are suitable for advanced and expert users, respectively."
+msgstr "Les interfaces utilisateur de PrusaSlicer se déclinent en trois variantes :\nSimple, Avancé et Expert.\nLe mode Simple affiche uniquement les paramètres les plus fréquemment utilisés pertinents pour l'impression 3D régulière. Les deux autres offrent des réglages fins de plus en plus sophistiqués, ils conviennent respectivement aux utilisateurs avancés et experts."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:668
+msgid "PrusaSlicer: Don't ask me again"
+msgstr "PrusaSlicer : Ne me demandez plus"
+
+#: src/libslic3r/PrintConfig.cpp:2397
msgid "Purging after toolchange will done inside this object's infills. This lowers the amount of waste but may result in longer print time due to additional travel moves."
msgstr "La purge après le changement d'outil sera faite dans le remplissage de l'objet. Cela diminue le gaspillage mais peut rallonger le temps d'impression à cause des mouvements supplémentaires."
-#: src/slic3r/GUI/Plater.cpp:544
+#: src/slic3r/GUI/Plater.cpp:410
msgid "Purging volumes"
msgstr "Volumes de purge"
-#: src/libslic3r/PrintConfig.cpp:2207
+#: src/libslic3r/PrintConfig.cpp:2350
msgid "Purging volumes - load/unload volumes"
msgstr "Volumes de purge - volumes de chargement/déchargement"
-#: src/libslic3r/PrintConfig.cpp:2214
+#: src/libslic3r/PrintConfig.cpp:2357
msgid "Purging volumes - matrix"
msgstr "Volumes de purge - matrice"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44
+#: src/libslic3r/PrintConfig.cpp:1201
+msgid "Purpose of Machine Limits"
+msgstr "Objectif des limites de la machine"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43
msgid "Quality"
msgstr "Qualité"
-#: src/slic3r/GUI/Tab.cpp:1080
+#: src/slic3r/GUI/Tab.cpp:1402
msgid "Quality (slower slicing)"
msgstr "Qualité (découpage plus lent)"
-#: src/slic3r/GUI/GLCanvas3D.cpp:273
+#: src/slic3r/GUI/GLCanvas3D.cpp:260
msgid "Quality / Speed"
msgstr "Qualité / Vitesse"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1182
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1530
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1536
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1849
-#, c-format
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61
+msgid "Quick"
+msgstr "Rapide"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1306
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1661
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1667
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2008
+#, possible-c-format
msgid "Quick Add Settings (%s)"
msgstr "Ajout de Réglages Rapide (%s)"
-#: src/slic3r/GUI/MainFrame.cpp:512
+#: src/slic3r/GUI/MainFrame.cpp:1113
msgid "Quick Slice"
msgstr "Découpage Rapide"
-#: src/slic3r/GUI/MainFrame.cpp:518
+#: src/slic3r/GUI/MainFrame.cpp:1119
msgid "Quick Slice and Save As"
msgstr "Découpage Rapide et Enregistrer Sous"
-#: src/slic3r/GUI/MainFrame.cpp:540
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:1144 src/slic3r/GUI/MainFrame.cpp:1402
+#, possible-c-format
msgid "Quit %s"
msgstr "Quitter %s"
-#: src/slic3r/GUI/GLCanvas3D.cpp:294 src/libslic3r/PrintConfig.cpp:511
+#: src/slic3r/GUI/GUI_App.cpp:396
+msgid "Quit, I will move my data now"
+msgstr "Quitter, je vais déplacer mes données maintenant"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:280 src/libslic3r/PrintConfig.cpp:547
msgid "Radius"
msgstr "Rayon"
-#: src/slic3r/GUI/Tab.cpp:1127
+#: src/slic3r/GUI/Tab.cpp:1456
msgid "Raft"
msgstr "Radeau"
-#: src/libslic3r/PrintConfig.cpp:1501
+#: src/libslic3r/PrintConfig.cpp:1609
msgid "Raft layers"
msgstr "Couches du radeau"
@@ -5761,14 +6841,8 @@ msgid "Ramming customization"
msgstr "Personnalisation de l'expulsion"
#: src/slic3r/GUI/WipeTowerDialog.cpp:41
-msgid ""
-"Ramming denotes the rapid extrusion just before a tool change in a single-extruder MM printer. Its purpose is to properly shape the end of the unloaded filament so it does not prevent insertion of the new filament and can itself be reinserted later. This phase is important and different materials can require different extrusion speeds to get the good shape. For this reason, the extrusion rates during ramming are adjustable.\n"
-"\n"
-"This is an expert-level setting, incorrect adjustment will likely lead to jams, extruder wheel grinding into filament etc."
-msgstr ""
-"L'Expulsion décrit l'extrusion rapide qui a lieu juste avant un changement d'outil sur une imprimante MM à extrudeur unique. Le but est de donner une forme correcte au filament déchargé afin qu'il n'empêche pas l'insertion du nouveau filament et puisse être réinséré lui-même plus tard. Cette phase est importante et des matériaux différents peuvent nécessiter des vitesses d'extrusion différentes pour obtenir la bonne forme. De ce fait, les débits d'extrusion pendant l'expulsion sont ajustables.\n"
-"\n"
-"Ceci est un paramétrage de niveau expert, et un mauvais ajustement provoquera probablement des blocages, des accrochages de la roue de l'extrudeur sur le filament , etc ..."
+msgid "Ramming denotes the rapid extrusion just before a tool change in a single-extruder MM printer. Its purpose is to properly shape the end of the unloaded filament so it does not prevent insertion of the new filament and can itself be reinserted later. This phase is important and different materials can require different extrusion speeds to get the good shape. For this reason, the extrusion rates during ramming are adjustable.\n\nThis is an expert-level setting, incorrect adjustment will likely lead to jams, extruder wheel grinding into filament etc."
+msgstr "L'Expulsion décrit l'extrusion rapide qui a lieu juste avant un changement d'outil sur une imprimante MM à extrudeur unique. Le but est de donner une forme correcte au filament déchargé afin qu'il n'empêche pas l'insertion du nouveau filament et puisse être réinséré lui-même plus tard. Cette phase est importante et des matériaux différents peuvent nécessiter des vitesses d'extrusion différentes pour obtenir la bonne forme. De ce fait, les débits d'extrusion pendant l'expulsion sont ajustables.\n\nCeci est un paramétrage de niveau expert, et un mauvais ajustement provoquera probablement des blocages, des accrochages de la roue de l'extrudeur sur le filament , etc ..."
#: src/slic3r/GUI/WipeTowerDialog.cpp:91
msgid "Ramming line spacing"
@@ -5778,27 +6852,27 @@ msgstr "Espacement de la ligne de ramming"
msgid "Ramming line width"
msgstr "Largeur de la ligne d'expulsion"
-#: src/libslic3r/PrintConfig.cpp:694
+#: src/libslic3r/PrintConfig.cpp:730
msgid "Ramming parameters"
msgstr "Paramètres de l'expulsion"
-#: src/slic3r/GUI/Tab.cpp:1505
+#: src/slic3r/GUI/Tab.cpp:1850
msgid "Ramming settings"
msgstr "Réglages de l'expulsion"
-#: src/libslic3r/PrintConfig.cpp:1629
+#: src/libslic3r/PrintConfig.cpp:1737
msgid "Random"
msgstr "Aléatoire"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:94
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:96
msgid "Range"
msgstr "Zone"
-#: src/libslic3r/SLAPrintSteps.cpp:65
+#: src/libslic3r/SLAPrintSteps.cpp:66
msgid "Rasterizing layers"
msgstr "Tramage des couches"
-#: src/slic3r/GUI/MainFrame.cpp:596
+#: src/slic3r/GUI/MainFrame.cpp:1202
msgid "Re&load from disk"
msgstr "Recharger à partir du dis&que"
@@ -5810,210 +6884,243 @@ msgstr "Reconfigurer"
msgid "Ready"
msgstr "Prêt"
-#: src/slic3r/GUI/Plater.cpp:3115
+#: src/slic3r/GUI/Plater.cpp:2915
msgid "Ready to slice"
msgstr "Prêt à découper"
-#: src/slic3r/GUI/MainFrame.cpp:669 src/libslic3r/PrintConfig.cpp:1632
+#: src/slic3r/GUI/MainFrame.cpp:966 src/slic3r/GUI/MainFrame.cpp:1286
+#: src/libslic3r/PrintConfig.cpp:1740
msgid "Rear"
msgstr "Arrière"
-#: src/slic3r/GUI/MainFrame.cpp:669
+#: src/slic3r/GUI/MainFrame.cpp:966 src/slic3r/GUI/MainFrame.cpp:1286
msgid "Rear View"
msgstr "Vue Arrière"
-#: src/slic3r/GUI/MainFrame.cpp:413
+#: src/slic3r/GUI/MainFrame.cpp:994
msgid "Recent projects"
msgstr "Proj&ets récents"
-#: src/slic3r/GUI/PresetHints.cpp:263
-#, c-format
+#: src/slic3r/GUI/PresetHints.cpp:262
+#, possible-c-format
msgid "Recommended object thin wall thickness for layer height %.2f and"
msgstr "Épaisseur des parois fines de l'objet recommandée pour la hauteur de couche %.2f et"
-#: src/slic3r/GUI/PresetHints.cpp:274
+#: src/slic3r/GUI/PresetHints.cpp:273
msgid "Recommended object thin wall thickness: Not available due to excessively small extrusion width."
msgstr "Épaisseur recommandée pour la paroi mince de l'objet : Non disponible en raison de la largeur d'extrusion excessivement petite."
-#: src/slic3r/GUI/PresetHints.cpp:247
+#: src/slic3r/GUI/PresetHints.cpp:246
msgid "Recommended object thin wall thickness: Not available due to invalid layer height."
msgstr "Épaisseur des parois fines de l'objet recommandée : Non disponible car la hauteur de couche est invalide."
-#: src/slic3r/GUI/GUI_App.cpp:450 src/slic3r/GUI/GUI_App.cpp:459
+#: src/slic3r/GUI/GUI_App.cpp:1102 src/slic3r/GUI/GUI_App.cpp:1115
msgid "Recreating"
msgstr "Re-création"
-#: src/slic3r/GUI/BedShapeDialog.cpp:73
+#: src/slic3r/GUI/BedShapeDialog.cpp:141
msgid "Rectangular"
msgstr "Rectangle"
-#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:843
-#: src/libslic3r/PrintConfig.cpp:2009
+#: src/libslic3r/PrintConfig.cpp:460 src/libslic3r/PrintConfig.cpp:881
+#: src/libslic3r/PrintConfig.cpp:2151
msgid "Rectilinear"
msgstr "Rectiligne"
-#: src/libslic3r/PrintConfig.cpp:2010
+#: src/libslic3r/PrintConfig.cpp:2152
msgid "Rectilinear grid"
msgstr "Grille rectiligne"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4657 src/slic3r/GUI/KBShortcutsDialog.cpp:131
-#: src/slic3r/GUI/MainFrame.cpp:584
+#: src/slic3r/GUI/GLCanvas3D.cpp:5067 src/slic3r/GUI/KBShortcutsDialog.cpp:126
+#: src/slic3r/GUI/MainFrame.cpp:1190
msgid "Redo"
msgstr "Recommencer"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4065
-#, c-format
+#: src/slic3r/GUI/GLCanvas3D.cpp:4382
+#, possible-c-format
msgid "Redo %1$d Action"
msgid_plural "Redo %1$d Actions"
msgstr[0] "Répéter %1$d Action"
msgstr[1] "Répéter %1$d Actions"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4047
+#: src/slic3r/GUI/GLCanvas3D.cpp:4361
msgid "Redo History"
msgstr "Répéter Historique"
-#: src/slic3r/GUI/Tab.cpp:1098
+#: src/slic3r/GUI/Tab.cpp:1426
msgid "Reducing printing time"
msgstr "Réduction du temps d'impression"
-#: src/slic3r/GUI/Plater.cpp:3452
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327
+msgid "Refresh Printers"
+msgstr "Actualiser les imprimantes"
+
+#: src/libslic3r/PrintConfig.cpp:145
+msgid "Related printer preset name"
+msgstr "Nom du préréglage d'imprimante associé"
+
+#: src/slic3r/GUI/Plater.cpp:3257
msgid "Reload all from disk"
msgstr "Tout recharger à partir du disque"
-#: src/slic3r/GUI/ConfigWizard.cpp:798 src/slic3r/GUI/GUI_ObjectList.cpp:1664
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3956 src/slic3r/GUI/Plater.cpp:3225
-#: src/slic3r/GUI/Plater.cpp:3934 src/slic3r/GUI/Plater.cpp:3963
+#: src/slic3r/GUI/ConfigWizard.cpp:1157 src/slic3r/GUI/GUI_ObjectList.cpp:1793
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4439 src/slic3r/GUI/Plater.cpp:3028
+#: src/slic3r/GUI/Plater.cpp:3852 src/slic3r/GUI/Plater.cpp:3881
msgid "Reload from disk"
msgstr "Recharger à partir du disque"
-#: src/slic3r/GUI/Plater.cpp:3339
+#: src/slic3r/GUI/Plater.cpp:3142
msgid "Reload from:"
msgstr "Recharger depuis :"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:134
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:129
msgid "Reload plater from disk"
msgstr "Recharger le plateau depuis le disque"
-#: src/slic3r/GUI/MainFrame.cpp:597
+#: src/slic3r/GUI/MainFrame.cpp:1203
msgid "Reload the plater from disk"
msgstr "Recharger le plateau à partir du disque"
-#: src/slic3r/GUI/Plater.cpp:3963
+#: src/slic3r/GUI/Plater.cpp:3881
msgid "Reload the selected object from disk"
msgstr "Recharger l'objet sélectionné à partir du disque"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1664
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3956 src/slic3r/GUI/Plater.cpp:3934
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1793
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4439 src/slic3r/GUI/Plater.cpp:3852
msgid "Reload the selected volumes from disk"
msgstr "Recharger les volumes sélectionnés à partir du disque"
-#: src/slic3r/GUI/Preferences.cpp:39
+#: src/slic3r/GUI/GCodeViewer.cpp:2442 src/slic3r/GUI/GCodeViewer.cpp:2445
+msgid "Remaining time"
+msgstr "Temps restant"
+
+#: src/slic3r/GUI/GUI_App.cpp:720 src/slic3r/GUI/UnsavedChangesDialog.cpp:653
+msgid "Remember my choice"
+msgstr "Se souvenir de mon choix"
+
+#: src/slic3r/GUI/Preferences.cpp:52
msgid "Remember output directory"
msgstr "Se souvenir du répertoire de sortie"
-#: src/slic3r/GUI/Tab.cpp:3121
+#: src/slic3r/GUI/MainFrame.cpp:166
+msgid "Remember to check for updates at https://github.com/prusa3d/PrusaSlicer/releases"
+msgstr "Pensez à vérifier les mises à jours sur https://github.com/prusa3d/PrusaSlicer/releases"
+
+#: src/slic3r/GUI/Tab.cpp:3386
msgid "remove"
msgstr "retirer"
-#: src/slic3r/GUI/BedShapeDialog.cpp:190 src/slic3r/GUI/BedShapeDialog.cpp:269
-#: src/slic3r/GUI/Tab.cpp:3124
+#: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/BedShapeDialog.cpp:413
+#: src/slic3r/GUI/Tab.cpp:3423
msgid "Remove"
msgstr "Retirer"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48
msgid "Remove all holes"
msgstr "Supprimer tous les trous"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50
msgid "Remove all points"
msgstr "Retirer tous les points"
-#: src/slic3r/GUI/GLCanvas3D.cpp:246
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35
+msgid "Remove all selection"
+msgstr "Supprimer toute la sélection"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:239
msgid "Remove detail"
msgstr "Supprimer les détails"
-#: src/slic3r/GUI/Plater.cpp:879
-msgid "Remove device"
-msgstr "Supprimer l'appareil"
-
#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:182
msgid "Remove extruder from sequence"
msgstr "Supprimer l'extrudeur de la séquence"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4537 src/slic3r/GUI/Plater.cpp:3942
+#: src/slic3r/GUI/GLCanvas3D.cpp:4903 src/slic3r/GUI/Plater.cpp:3860
msgid "Remove instance"
msgstr "Supprimer l'instance"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:160
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:154
msgid "Remove Instance of the selected object"
msgstr "Supprimer l'instance de l'objet sélectionné"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:153
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:161
msgid "Remove layer range"
msgstr "Supprimer la zone de couche"
-#: src/slic3r/GUI/Plater.cpp:3942
+#: src/slic3r/GUI/Plater.cpp:3860
msgid "Remove one instance of the selected object"
msgstr "Supprime une instance de l'objet sélectionné"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:95
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:98
msgid "Remove parameter"
msgstr "Supprimer le paramètre"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211
msgid "Remove point"
msgstr "Supprimer le point"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214
msgid "Remove point from selection"
msgstr "Supprimer le point de la sélection"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47
msgid "Remove selected holes"
msgstr "Supprimer les trous sélectionnés"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1371
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218
msgid "Remove selected points"
msgstr "Retirer les points sélectionnés"
-#: src/slic3r/GUI/Plater.cpp:3931 src/slic3r/GUI/Plater.cpp:3953
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:368
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:378
+msgid "Remove selection"
+msgstr "Supprimer la sélection"
+
+#: src/slic3r/GUI/Plater.cpp:3849 src/slic3r/GUI/Plater.cpp:3871
msgid "Remove the selected object"
msgstr "Retirer l'objet sélectionné"
-#: src/slic3r/GUI/ConfigWizard.cpp:453
+#: src/slic3r/GUI/ConfigWizard.cpp:456
msgid "Remove user profiles (a snapshot will be taken beforehand)"
msgstr "Supprimer les profils utilisateurs (un instantané sera pris au préalable)"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1636
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1765
msgid "Rename"
msgstr "Renommer"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:589
msgid "Rename Object"
msgstr "Renommer l'Objet"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:589
msgid "Rename Sub-object"
msgstr "Renommer le Sous-objet"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3803
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4266
msgid "Renaming"
msgstr "Renommage"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:115
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:150
msgid "Renaming of the G-code after copying to the selected destination folder has failed. Current path is %1%.tmp. Please try exporting again."
msgstr "La tentative pour renommer le G-code après l'avoir copié dans le dossier sélectionné a échoué. Le chemin actuel est %1%.tmp. Veuillez tenter à nouveau l'export."
-#: src/libslic3r/PrintConfig.cpp:3515
+#: src/slic3r/GUI/Preferences.cpp:255
+msgid "Render"
+msgstr "Rendre"
+
+#: src/libslic3r/PrintConfig.cpp:3720
msgid "Render with a software renderer"
msgstr "Rendu avec avec un logiciel de rendu"
-#: src/libslic3r/PrintConfig.cpp:3516
+#: src/libslic3r/PrintConfig.cpp:3721
msgid "Render with a software renderer. The bundled MESA software renderer is loaded instead of the default OpenGL driver."
msgstr "Appliquer un rendu avec un logiciel de rendu. Le logiciel de rendu MESA qui est fourni est chargé à la place du pilote OpenGL présent par défaut."
-#: src/slic3r/GUI/MainFrame.cpp:911 src/libslic3r/PrintConfig.cpp:3447
+#: src/slic3r/GUI/MainFrame.cpp:1612 src/libslic3r/PrintConfig.cpp:3646
msgid "Repair"
msgstr "Réparer"
@@ -6037,39 +7144,39 @@ msgstr "Le fichier 3MF réparé ne contient aucun volume"
msgid "Repairing model by the Netfabb service"
msgstr "Réparation d'un modèle par le service Netfabb"
-#: src/slic3r/GUI/MainFrame.cpp:524
+#: src/slic3r/GUI/MainFrame.cpp:1125
msgid "Repeat last quick slice"
msgstr "Répéter le dernier découpage rapide"
-#: src/slic3r/GUI/MainFrame.cpp:524
+#: src/slic3r/GUI/MainFrame.cpp:1125
msgid "Repeat Last Quick Slice"
msgstr "Répéter le Dernier Découpage Rapide"
-#: src/slic3r/GUI/Tab.cpp:3083
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:477
msgid "Replace?"
msgstr "Remplacer ?"
-#: src/slic3r/GUI/MainFrame.cpp:703
+#: src/slic3r/GUI/MainFrame.cpp:928 src/slic3r/GUI/MainFrame.cpp:1327
msgid "Report an I&ssue"
msgstr "S&ignaler un Problème"
-#: src/slic3r/GUI/MainFrame.cpp:703
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:928 src/slic3r/GUI/MainFrame.cpp:1327
+#, possible-c-format
msgid "Report an issue on %s"
msgstr "Signaler un problème sur %s"
-#: src/slic3r/Utils/PresetUpdater.cpp:713
-#, c-format
+#: src/slic3r/Utils/PresetUpdater.cpp:733
+#, possible-c-format
msgid "requires max. %s"
msgstr "nécessite max. %s"
-#: src/slic3r/Utils/PresetUpdater.cpp:710
-#, c-format
+#: src/slic3r/Utils/PresetUpdater.cpp:730
+#, possible-c-format
msgid "requires min. %s"
msgstr "nécessite min. %s"
-#: src/slic3r/Utils/PresetUpdater.cpp:705
-#, c-format
+#: src/slic3r/Utils/PresetUpdater.cpp:726
+#, possible-c-format
msgid "requires min. %s and max. %s"
msgstr "nécessite min. %s et max. %s"
@@ -6077,270 +7184,304 @@ msgstr "nécessite min. %s et max. %s"
msgid "Rescan"
msgstr "Scanner à nouveau"
-#: src/slic3r/GUI/Tab.cpp:1906
-msgid "Rescan serial ports"
-msgstr "Rescanner les ports série"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:313
+#: src/slic3r/GUI/GLCanvas3D.cpp:299
msgid "Reset"
msgstr "Réinitialiser"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1373
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220
msgid "Reset clipping plane"
msgstr "Réinitialiser le plan de coupe"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:59
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:26
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58
msgid "Reset direction"
msgstr "Réinitialiser la direction"
-#: src/slic3r/GUI/Plater.cpp:2723
+#: src/slic3r/GUI/Plater.cpp:2684
msgid "Reset Project"
msgstr "Réinitialiser le Projet"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:372
msgid "Reset rotation"
msgstr "Réinitialiser la rotation"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:394
msgid "Reset Rotation"
msgstr "Réinitialiser la Rotation"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:397
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:407
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409
msgid "Reset scale"
msgstr "Réinitialiser l'échelle"
-#: src/slic3r/GUI/GLCanvas3D.cpp:252
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:136
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:118
+msgid "Reset selection"
+msgstr "Réinitialiser la sélection"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:243
msgid "Reset to base"
msgstr "Réinitialiser à la base"
-#: src/slic3r/GUI/Tab.cpp:2394
+#: src/slic3r/GUI/Tab.cpp:2564
msgid "Reset to Filament Color"
msgstr "Réinitialiser la Couleur du Filament"
-#: src/libslic3r/PrintConfig.cpp:1511
+#: src/libslic3r/PrintConfig.cpp:1619
msgid "Resolution"
msgstr "Résolution"
-#: src/libslic3r/PrintConfig.cpp:1529
+#: src/libslic3r/PrintConfig.cpp:1637
msgid "Retract amount before wipe"
msgstr "Quantité de rétractation avant essuyage"
-#: src/libslic3r/PrintConfig.cpp:1537
+#: src/libslic3r/PrintConfig.cpp:1645
msgid "Retract on layer change"
msgstr "Rétracter lors des changements de couche"
-#: src/slic3r/GUI/Tab.cpp:1324 src/slic3r/GUI/Tab.cpp:1383
-#: src/slic3r/GUI/Tab.cpp:2370
+#: src/slic3r/GUI/GCodeViewer.cpp:2494 src/slic3r/GUI/Tab.cpp:1670
+#: src/slic3r/GUI/Tab.cpp:2539
msgid "Retraction"
msgstr "Rétraction"
-#: src/libslic3r/PrintConfig.cpp:1523
+#: src/libslic3r/PrintConfig.cpp:1631
msgid "Retraction is not triggered when travel moves are shorter than this length."
msgstr "La rétraction n'est pas déclenchée lorsque les déplacements sont plus courts que cette distance."
-#: src/libslic3r/PrintConfig.cpp:1544
+#: src/libslic3r/PrintConfig.cpp:1652
msgid "Retraction Length"
msgstr "Longueur de Rétractation"
-#: src/libslic3r/PrintConfig.cpp:1552
+#: src/libslic3r/PrintConfig.cpp:1660
msgid "Retraction Length (Toolchange)"
msgstr "Longueur de Rétractation (changement d'outil)"
-#: src/libslic3r/PrintConfig.cpp:1604 src/libslic3r/PrintConfig.cpp:1605
+#: src/libslic3r/PrintConfig.cpp:1712 src/libslic3r/PrintConfig.cpp:1713
msgid "Retraction Speed"
msgstr "Vitesse de Rétractation"
-#: src/slic3r/GUI/Tab.cpp:2386
+#: src/slic3r/GUI/Tab.cpp:2555
msgid "Retraction when tool is disabled (advanced settings for multi-extruder setups)"
msgstr "Rétractation lorsque l'outil est désactivé (réglages avancés pour les configurations multi-extrudeurs)"
-#: src/slic3r/GUI/GUI_Preview.cpp:254
+#: src/slic3r/GUI/GCodeViewer.cpp:2528 src/slic3r/GUI/GUI_Preview.cpp:336
+#: src/slic3r/GUI/GUI_Preview.cpp:1472
msgid "Retractions"
msgstr "Rétractions"
-#: src/slic3r/GUI/MainFrame.cpp:673
+#: src/slic3r/GUI/Preferences.cpp:198
+msgid "Reverse direction of zoom with mouse wheel"
+msgstr "Inverser la direction du zoom avec la molette de la souris"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1861 src/slic3r/GUI/Plater.cpp:4886
+msgid "Revert conversion from imperial units"
+msgstr "Annuler la conversion des unités impériales"
+
+#: src/slic3r/GUI/MainFrame.cpp:970 src/slic3r/GUI/MainFrame.cpp:1290
msgid "Right"
msgstr "Droite"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:402
+#: src/slic3r/GUI/GUI_ObjectList.cpp:449
msgid "Right button click the icon to change the object printable property"
msgstr "Clic droit sur l'icône pour changer les propriétés imprimables de l'objet"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:396
+#: src/slic3r/GUI/GUI_ObjectList.cpp:443
msgid "Right button click the icon to change the object settings"
msgstr "Clic droit sur l'icône pour changer les réglages de l'objet"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:359
+#: src/slic3r/GUI/GUI_ObjectList.cpp:406
msgid "Right button click the icon to fix STL through Netfabb"
msgstr "Clic droit sur l'icône pour réparer le STL avec Netfabb"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211
msgid "Right click"
msgstr "Clic droit"
-#: src/slic3r/GUI/GLCanvas3D.cpp:243
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31
+msgid "Right mouse button"
+msgstr "Bouton droit de la souris"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:237
msgid "Right mouse button:"
msgstr "Clic droit souris :"
-#: src/slic3r/GUI/MainFrame.cpp:673
+#: src/slic3r/GUI/MainFrame.cpp:970 src/slic3r/GUI/MainFrame.cpp:1290
msgid "Right View"
msgstr "Vue Droite"
-#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:449
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:480
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:499
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:517
-#: src/libslic3r/PrintConfig.cpp:3451
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:513
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:527
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562
+#: src/libslic3r/PrintConfig.cpp:3650
msgid "Rotate"
msgstr "Pivoter"
-#: src/libslic3r/PrintConfig.cpp:3456
+#: src/libslic3r/PrintConfig.cpp:3655
msgid "Rotate around X"
msgstr "Pivoter autour de X"
-#: src/libslic3r/PrintConfig.cpp:3461
+#: src/libslic3r/PrintConfig.cpp:3660
msgid "Rotate around Y"
msgstr "Pivoter autour de Y"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:172
msgid "Rotate lower part upwards"
msgstr "Pivoter la partie basse vers le haut"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
msgid "Rotate selection 45 degrees CCW"
msgstr "Faire pivoter la sélection de 45 degrés dans le sens inverse des aiguilles d'une montre"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
msgid "Rotate selection 45 degrees CW"
msgstr "Faire pivoter la sélection de 45 degrés dans le sens des aiguilles d'une montre"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:458
-#: src/slic3r/GUI/Mouse3DController.cpp:304
-#: src/slic3r/GUI/Mouse3DController.cpp:321
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:210
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:224
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:506
+#: src/slic3r/GUI/Mouse3DController.cpp:288
+#: src/slic3r/GUI/Mouse3DController.cpp:309
msgid "Rotation"
msgstr "Rotation"
-#: src/libslic3r/PrintConfig.cpp:3457
+#: src/libslic3r/PrintConfig.cpp:3656
msgid "Rotation angle around the X axis in degrees."
msgstr "Angle de rotation autour de l'axe X en degrés."
-#: src/libslic3r/PrintConfig.cpp:3462
+#: src/libslic3r/PrintConfig.cpp:3661
msgid "Rotation angle around the Y axis in degrees."
msgstr "Angle de rotation autour de l'axe Y en degrés."
-#: src/libslic3r/PrintConfig.cpp:3452
+#: src/libslic3r/PrintConfig.cpp:3651
msgid "Rotation angle around the Z axis in degrees."
msgstr "Angle de rotation autour de l'axe Z en degrés."
-#: src/slic3r/GUI/GUI_App.cpp:797
-#, c-format
+#: src/slic3r/GUI/DoubleSlider.cpp:1836
+msgid "Ruler mode"
+msgstr "Mode règle"
+
+#: src/slic3r/GUI/GUI_App.cpp:1474
+#, possible-c-format
msgid "Run %s"
msgstr "Run %s"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:128
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:478
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:163
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:520
msgid "Running post-processing scripts"
msgstr "Exécuter des scripts de post-traitement"
#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83
-#: src/libslic3r/PrintConfig.cpp:644 src/libslic3r/PrintConfig.cpp:688
-#: src/libslic3r/PrintConfig.cpp:703 src/libslic3r/PrintConfig.cpp:2408
-#: src/libslic3r/PrintConfig.cpp:2417 src/libslic3r/PrintConfig.cpp:2527
-#: src/libslic3r/PrintConfig.cpp:2535 src/libslic3r/PrintConfig.cpp:2543
-#: src/libslic3r/PrintConfig.cpp:2550 src/libslic3r/PrintConfig.cpp:2558
-#: src/libslic3r/PrintConfig.cpp:2566
+#: src/libslic3r/PrintConfig.cpp:680 src/libslic3r/PrintConfig.cpp:724
+#: src/libslic3r/PrintConfig.cpp:739 src/libslic3r/PrintConfig.cpp:2551
+#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2670
+#: src/libslic3r/PrintConfig.cpp:2678 src/libslic3r/PrintConfig.cpp:2686
+#: src/libslic3r/PrintConfig.cpp:2693 src/libslic3r/PrintConfig.cpp:2701
+#: src/libslic3r/PrintConfig.cpp:2709
msgid "s"
msgstr "s"
-#: src/slic3r/GUI/MainFrame.cpp:481 src/slic3r/GUI/MainFrame.cpp:750
+#: src/slic3r/GUI/MainFrame.cpp:1072 src/slic3r/GUI/MainFrame.cpp:1449
msgid "S&end G-code"
msgstr "&Envoyer le G-code"
-#: src/slic3r/GUI/MainFrame.cpp:750
+#: src/slic3r/GUI/MainFrame.cpp:1449
msgid "S&end to print"
msgstr "Envoyer pour imprimer"
-#. TRN Preset
-#: src/slic3r/GUI/Tab.cpp:3417
-#, c-format
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:642
+msgid "Save"
+msgstr "Enregistrer"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:72
+#, possible-c-format
msgid "Save %s as:"
msgstr "Enregistrer %s sous :"
-#: src/slic3r/GUI/MainFrame.cpp:826
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:1527
+#, possible-c-format
msgid "Save %s file as:"
msgstr "Enregistrer le fichier %s sous :"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1046
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912
msgid "Save changes?"
msgstr "Enregistrer les modifications ?"
-#: src/libslic3r/PrintConfig.cpp:3386
+#: src/libslic3r/PrintConfig.cpp:3585
msgid "Save config file"
msgstr "Sauvegarder le fichier de configuration"
-#: src/slic3r/GUI/MainFrame.cpp:925
+#: src/slic3r/GUI/MainFrame.cpp:1626
msgid "Save configuration as:"
msgstr "Enregistrer la configuration sous :"
-#: src/libslic3r/PrintConfig.cpp:3387
+#: src/libslic3r/PrintConfig.cpp:3586
msgid "Save configuration to the specified file."
msgstr "Enregistrer la configuration dans le fichier spécifié."
#. TRN "Save current Settings"
-#: src/slic3r/GUI/Tab.cpp:133
-#, c-format
+#: src/slic3r/GUI/Tab.cpp:203
+#, possible-c-format
msgid "Save current %s"
msgstr "Enregistrer l'état actuel %s"
-#: src/slic3r/GUI/MainFrame.cpp:446
+#: src/slic3r/GUI/MainFrame.cpp:1028
msgid "Save current project file"
msgstr "Sauvegarder le fichier du projet en cours"
-#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452
+#: src/slic3r/GUI/MainFrame.cpp:1032 src/slic3r/GUI/MainFrame.cpp:1034
msgid "Save current project file as"
msgstr "Sauvegarder le fichier du projet en cours sous"
-#: src/slic3r/GUI/Plater.cpp:2604
+#: src/slic3r/GUI/Plater.cpp:2566
msgid "Save file as:"
msgstr "Enregistrer le fichier sous :"
-#: src/slic3r/GUI/Plater.cpp:4839
+#: src/slic3r/GUI/Plater.cpp:4975
msgid "Save G-code file as:"
msgstr "Sauvegarder le fichier G-code en tant que :"
-#: src/slic3r/GUI/MainFrame.cpp:899
+#: src/slic3r/GUI/MainFrame.cpp:1600
msgid "Save OBJ file (less prone to coordinate errors than STL) as:"
msgstr "Enregistrer le fichier OBJ (moins enclin aux erreurs de coordonnées que le STL) sous :"
-#: src/slic3r/GUI/Tab.hpp:443
+#: src/slic3r/GUI/SavePresetDialog.cpp:190
+#: src/slic3r/GUI/SavePresetDialog.cpp:196
msgid "Save preset"
msgstr "Enregistrer le préréglage"
-#: src/slic3r/GUI/MainFrame.cpp:980
+#: src/slic3r/GUI/MainFrame.cpp:1681
msgid "Save presets bundle as:"
msgstr "Enregistrer le lot de préréglages sous :"
-#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452
+#: src/slic3r/GUI/MainFrame.cpp:1032 src/slic3r/GUI/MainFrame.cpp:1034
msgid "Save Project &as"
msgstr "Sauveg&arder le Projet &sous"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:114
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:107
msgid "Save project (3mf)"
msgstr "Sauvegarder le projet (3mf)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:115
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:108
msgid "Save project as (3mf)"
msgstr "Sauvegarder le projet en tant que (3mf)"
-#: src/slic3r/GUI/Plater.cpp:4839
+#: src/slic3r/GUI/Plater.cpp:4975
msgid "Save SL1 file as:"
msgstr "Sauvegarder le fichier SL1 sous :"
-#: src/slic3r/GUI/MainFrame.cpp:838
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:744
+msgid "Save the selected options to preset \"%1%\"."
+msgstr "Enregistrer les options sélectionnées dans le préréglage \"%1%\"."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:740
+msgid "Save the selected options."
+msgstr "Enregistrer les options sélectionnées."
+
+#: src/slic3r/GUI/MainFrame.cpp:1539
msgid "Save zip file as:"
msgstr "Sauvegarder le fichier zip sous :"
@@ -6350,221 +7491,244 @@ msgstr "Sauvegarder le fichier zip sous :"
msgid "Saving mesh into the 3MF container failed."
msgstr "Échec de la sauvegarde du maillage dans le contenant 3MF."
-#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:47
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:230
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:500
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:518
-#: src/libslic3r/PrintConfig.cpp:3466
+#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:78
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:238
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:547
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563
+#: src/libslic3r/PrintConfig.cpp:3665
msgid "Scale"
msgstr "Redimensionner"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:459
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:507
msgid "Scale factors"
-msgstr "Facteurs de redimensionnement"
-
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:196
-msgid ""
-"Scale selection to fit print volume\n"
-"in Gizmo scale"
-msgstr ""
-"Redimensionner la sélection pour l'adapter au volume d'impression\n"
-"à l'échelle du Gizmo"
+msgstr "Échelle"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1724
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1852
msgid "Scale the selected object to fit the print volume"
msgstr "Redimensionner l'objet sélectionné pour qu'il s'ajuste au volume d'impression"
-#: src/libslic3r/PrintConfig.cpp:3475
+#: src/libslic3r/PrintConfig.cpp:3674
msgid "Scale to Fit"
msgstr "Redimensionner pour Ajuster"
-#: src/slic3r/GUI/Selection.cpp:939
+#: src/slic3r/GUI/Selection.cpp:988
msgid "Scale To Fit"
msgstr "Redimensionner pour Ajuster"
-#: src/libslic3r/PrintConfig.cpp:3476
+#: src/libslic3r/PrintConfig.cpp:3675
msgid "Scale to fit the given volume."
msgstr "Redimensionner pour ajuster à un volume donné."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1724
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1852
msgid "Scale to print volume"
msgstr "Redimensionner pour ajuster au volume d'impression"
-#: src/libslic3r/PrintConfig.cpp:3467
+#: src/libslic3r/PrintConfig.cpp:3666
msgid "Scaling factor or percentage."
msgstr "Facteur ou pourcentage de redimensionnement."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:505
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:545
msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue"
msgstr "Planification du téléchargement dans `%1%`. Voir : Imprimer la file d'attente de téléchargement de l'hôte"
-#: src/libslic3r/PrintConfig.cpp:1621
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:46
+msgid "Seam painting"
+msgstr "Peinture de jointure"
+
+#: src/libslic3r/PrintConfig.cpp:1729
msgid "Seam position"
msgstr "Position de la jointure"
-#: src/libslic3r/PrintConfig.cpp:1642
+#: src/libslic3r/PrintConfig.cpp:1750
msgid "Seam preferred direction"
msgstr "Direction préférée de la jointure"
-#: src/libslic3r/PrintConfig.cpp:1651
+#: src/libslic3r/PrintConfig.cpp:1759
msgid "Seam preferred direction jitter"
msgstr "Gigue de la direction préférée de la jointure"
+#: src/slic3r/GUI/MainFrame.cpp:1207
+msgid "Searc&h"
+msgstr "Recherc&her"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4402 src/slic3r/GUI/GLCanvas3D.cpp:4957
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 src/slic3r/GUI/Search.cpp:426
+msgid "Search"
+msgstr "Rechercher"
+
+#: src/slic3r/GUI/ImGuiWrapper.cpp:803 src/slic3r/GUI/Search.cpp:460
+msgid "Search in English"
+msgstr "Rechercher en anglais"
+
+#: src/slic3r/GUI/MainFrame.cpp:1216
+msgid "Search in settings"
+msgstr "Rechercher dans les réglages"
+
+#: src/slic3r/GUI/Tab.cpp:222
+msgid "Search in settings [%1%]"
+msgstr "Rechercher dans les réglages [%1%]"
+
#: src/slic3r/GUI/BonjourDialog.cpp:218
msgid "Searching for devices"
msgstr "Recherche des dispositifs"
-#: src/slic3r/GUI/Plater.cpp:2858
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:41
msgid "Searching for optimal orientation"
msgstr "Recherche de l'orientation optimale"
-#: src/slic3r/GUI/GUI_App.cpp:1103
+#: src/slic3r/GUI/NotificationManager.hpp:321
+msgid "See more."
+msgstr "Voir plus."
+
+#: src/slic3r/GUI/NotificationManager.hpp:322
+msgid "See Releases page."
+msgstr "Voir la page des versions."
+
+#: src/slic3r/GUI/GUI_App.cpp:1895
msgid "Select a gcode file:"
msgstr "Sélectionnez un fichier gcode :"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:126
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:121
msgid "Select all objects"
msgstr "Sélectionner tous les objets"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1370
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217
msgid "Select all points"
msgstr "Sélectionner tous les points"
-#: src/slic3r/GUI/ConfigWizard.cpp:1976
+#: src/slic3r/GUI/ConfigWizard.cpp:2487
msgid "Select all standard printers"
msgstr "Sélectionner toutes les imprimantes standard"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1368
+#: src/slic3r/GUI/Plater.cpp:1422
+msgid "Select an action to apply to the file"
+msgstr "Sélectionnez une action à appliquer au fichier"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215
msgid "Select by rectangle"
msgstr "Sélectionner par rectangle"
-#: src/slic3r/GUI/MainFrame.cpp:944 src/slic3r/GUI/MainFrame.cpp:1006
+#: src/slic3r/GUI/MainFrame.cpp:1645 src/slic3r/GUI/MainFrame.cpp:1707
msgid "Select configuration to load:"
msgstr "Sélectionner la configuration à charger :"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:82
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:88
msgid "Select coordinate space, in which the transformation will be performed."
msgstr "Sélectionnez un espace de coordonnées dans lequel la transformation sera effectuée."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3971
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4458
msgid "Select extruder number:"
msgstr "Sélectionner le numéro de l'extrudeur :"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:138
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:134
msgid "Select Filament Settings Tab"
msgstr "Sélectionner l'Onglet des Réglages du Filament"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:136
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:132
msgid "Select Plater Tab"
msgstr "Sélectionner l'Onglet du Plateau"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:137
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:133
msgid "Select Print Settings Tab"
msgstr "Sélectionner l'Onglet des Réglages d'Impression"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:139
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:135
msgid "Select Printer Settings Tab"
msgstr "Sélectionner l'Onglet des Réglages de l'Imprimante"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1265
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1396
msgid "Select showing settings"
msgstr "Sélectionner les réglages d'affichage"
-#: src/slic3r/GUI/GUI_App.cpp:629
+#: src/slic3r/GUI/GUI_App.cpp:1295
msgid "Select the language"
msgstr "Sélectionner la langue"
-#: src/slic3r/GUI/Tab.cpp:57
+#: src/slic3r/GUI/Tab.cpp:108
msgid "Select the print profiles this profile is compatible with."
msgstr "Sélectionner les profils d'impression avec lesquels ce profil est compatible."
-#: src/slic3r/GUI/Tab.cpp:51
+#: src/slic3r/GUI/Tab.cpp:102
msgid "Select the printers this profile is compatible with."
msgstr "Sélectionner les imprimantes avec lesquelles ce profil est compatible."
-#: src/slic3r/GUI/MainFrame.cpp:889
+#: src/slic3r/GUI/MainFrame.cpp:1590
msgid "Select the STL file to repair:"
msgstr "Sélectionner le fichier STL à réparer :"
-#: src/slic3r/GUI/Preferences.cpp:237
+#: src/slic3r/GUI/Preferences.cpp:391
msgid "Select toolbar icon size in respect to the default one."
msgstr "Sélectionner la taille de l'icône de la barre d'outil par rapport à la taille par défaut."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3553
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4016
msgid "Select type of part"
msgstr "Sélectionner le type de pièce"
-#: src/slic3r/GUI/Plater.cpp:638
+#: src/slic3r/GUI/Plater.cpp:504
msgid "Select what kind of pad do you need"
msgstr "Choisissez le type de socle dont vous avez besoin"
-#: src/slic3r/GUI/Plater.cpp:498
+#: src/slic3r/GUI/Plater.cpp:364
msgid "Select what kind of support do you need"
msgstr "Choisissez le type de support dont vous avez besoin"
-#: src/slic3r/GUI/DoubleSlider.cpp:1917
-msgid ""
-"Select YES if you want to delete all saved tool changes, \n"
-"NO if you want all tool changes switch to color changes, \n"
-"or CANCEL to leave it unchanged."
-msgstr ""
-"Sélectionnez OUI si vous souhaitez supprimer tous les changements d'outil enregistrées, \n"
-"NON si vous souhaitez que tous les changements d'outil soient remplacés par des modifications de couleur, \n"
-"ou ANNULER pour ne pas les modifier."
+#: src/slic3r/GUI/DoubleSlider.cpp:2135
+msgid "Select YES if you want to delete all saved tool changes, \nNO if you want all tool changes switch to color changes, \nor CANCEL to leave it unchanged."
+msgstr "Sélectionnez OUI si vous souhaitez supprimer tous les changements d'outil enregistrées, \nNON si vous souhaitez que tous les changements d'outil soient remplacés par des modifications de couleur, \nou ANNULER pour ne pas les modifier."
-#: src/slic3r/GUI/Selection.cpp:146
+#: src/slic3r/GUI/Selection.cpp:191
msgid "Selection-Add"
msgstr "Sélection-Ajouter"
-#: src/slic3r/GUI/Selection.cpp:376
+#: src/slic3r/GUI/Selection.cpp:421
msgid "Selection-Add All"
msgstr "Sélection-Ajouter Tout"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3299
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3762
msgid "Selection-Add from list"
msgstr "Sélection-Ajouter depuis la liste"
-#: src/slic3r/GUI/GLCanvas3D.cpp:6598
+#: src/slic3r/GUI/GLCanvas3D.cpp:7193
msgid "Selection-Add from rectangle"
msgstr "Sélection-Ajouter depuis le rectangle"
-#: src/slic3r/GUI/Selection.cpp:256
+#: src/slic3r/GUI/Selection.cpp:301
msgid "Selection-Add Instance"
msgstr "Sélection-Ajouter Instance"
-#: src/slic3r/GUI/Selection.cpp:219
+#: src/slic3r/GUI/Selection.cpp:264
msgid "Selection-Add Object"
msgstr "Sélection-Ajouter Objet"
-#: src/slic3r/GUI/Selection.cpp:187
+#: src/slic3r/GUI/Selection.cpp:232
msgid "Selection-Remove"
msgstr "Sélection-Retirer"
-#: src/slic3r/GUI/Selection.cpp:402
+#: src/slic3r/GUI/Selection.cpp:447
msgid "Selection-Remove All"
msgstr "Sélection-Retirer Tout"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3291
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3754
msgid "Selection-Remove from list"
msgstr "Sélection-Retirer de la liste"
-#: src/slic3r/GUI/GLCanvas3D.cpp:6617
+#: src/slic3r/GUI/GLCanvas3D.cpp:7212
msgid "Selection-Remove from rectangle"
msgstr "Sélection-Retirer du rectangle"
-#: src/slic3r/GUI/Selection.cpp:275
+#: src/slic3r/GUI/Selection.cpp:320
msgid "Selection-Remove Instance"
msgstr "Sélection-Supprimer l'Instance"
-#: src/slic3r/GUI/Selection.cpp:238
+#: src/slic3r/GUI/Selection.cpp:283
msgid "Selection-Remove Object"
msgstr "Sélection-Supprimer l'Objet"
-#: src/slic3r/GUI/MainFrame.cpp:566
+#: src/slic3r/GUI/MainFrame.cpp:1172
msgid "Selects all objects"
msgstr "Sélectionner tous les objets"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Plater.cpp:5522
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 src/slic3r/GUI/Plater.cpp:5707
msgid "Send G-code"
msgstr "Envoyer le G-code"
@@ -6572,29 +7736,25 @@ msgstr "Envoyer le G-code"
msgid "Send G-Code to printer host"
msgstr "Envoyer le G-Code à l'hôte d'imprimante"
-#: src/slic3r/GUI/MainFrame.cpp:481
+#: src/slic3r/GUI/MainFrame.cpp:1072
msgid "Send to print current plate as G-code"
msgstr "Envoyer pour imprimer le plateau actuel en tant que G-code"
-#: src/slic3r/GUI/Plater.cpp:878 src/slic3r/GUI/Plater.cpp:5522
+#: src/slic3r/GUI/Plater.cpp:753 src/slic3r/GUI/Plater.cpp:5707
msgid "Send to printer"
msgstr "Envoyer à l'imprimante"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1305
+#: src/slic3r/GUI/GLCanvas3D.cpp:1312
msgid "Seq."
msgstr "Seq."
-#: src/slic3r/GUI/Tab.cpp:1231
+#: src/slic3r/GUI/Tab.cpp:1561
msgid "Sequential printing"
msgstr "Impression séquentielle"
-#: src/slic3r/GUI/Tab.cpp:1901 src/libslic3r/PrintConfig.cpp:1661
-msgid "Serial port"
-msgstr "Port série"
-
-#: src/libslic3r/PrintConfig.cpp:1669
-msgid "Serial port speed"
-msgstr "Vitesse du port série"
+#: src/slic3r/GUI/Preferences.cpp:230
+msgid "Sequential slider applied only to top layer"
+msgstr "Barre de défilement séquentielle appliquée uniquement à la couche supérieure"
#: src/slic3r/GUI/FirmwareDialog.cpp:807
msgid "Serial port:"
@@ -6604,17 +7764,16 @@ msgstr "Port série :"
msgid "Service name"
msgstr "Nom du service"
-#: src/slic3r/GUI/Tab.cpp:1802 src/slic3r/GUI/Tab.cpp:2046
-#: src/slic3r/GUI/Tab.cpp:3176
+#: src/slic3r/GUI/Tab.cpp:3509 src/slic3r/GUI/Tab.cpp:3588
msgid "Set"
msgstr "Appliquer"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1599
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1611
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1728
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1740
msgid "Set as a Separated Object"
msgstr "Définir comme Objet Séparé"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1611
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1740
msgid "Set as a Separated Objects"
msgstr "Définir comme Objets Séparés"
@@ -6622,7 +7781,7 @@ msgstr "Définir comme Objets Séparés"
msgid "Set extruder change for every"
msgstr "Définir le changement d'extrudeur pour chaque"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1671
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1800
msgid "Set extruder for selected items"
msgstr "Définir l'extrudeur pour les items sélectionnés"
@@ -6630,7 +7789,7 @@ msgstr "Définir l'extrudeur pour les items sélectionnés"
msgid "Set extruder sequence"
msgstr "Définir la séquence d'extrudeur"
-#: src/slic3r/GUI/DoubleSlider.cpp:1532
+#: src/slic3r/GUI/DoubleSlider.cpp:1728
msgid "Set extruder sequence for the entire print"
msgstr "Définir la séquence d'extrusion pour l'ensemble de l'impression"
@@ -6638,84 +7797,100 @@ msgstr "Définir la séquence d'extrusion pour l'ensemble de l'impression"
msgid "Set extruder(tool) sequence"
msgstr "Définir la séquence d'extrudeur (outil)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:243
+msgid "Set left thumb as active"
+msgstr "Définir le curseur de gauche comme actif"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
+msgid "Set lower thumb as active"
+msgstr "Définir le curseur du bas comme actif"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
msgid "Set lower thumb to current slider thumb"
-msgstr "Définir le curseur inférieur sur le curseur actuel"
+msgstr "Définir le curseur inférieur sur la position actuelle de la barre de défilement"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:297
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:305
msgid "Set Mirror"
msgstr "Appliquer la Symétrie"
-#: src/slic3r/GUI/Plater.cpp:3944
+#: src/slic3r/GUI/Plater.cpp:3862
msgid "Set number of instances"
msgstr "Définir le nombre d'instances"
-#: src/slic3r/GUI/Plater.cpp:4756
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:4860
+#, possible-c-format
msgid "Set numbers of copies to %d"
msgstr "Régler le nombre de copies sur %d"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:781
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:828
msgid "Set Orientation"
msgstr "Définir l'Orientation"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:750
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:797
msgid "Set Position"
msgstr "Définir la Position"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4581 src/slic3r/GUI/Selection.cpp:1513
msgid "Set Printable"
msgstr "Définir Imprimable"
-#: src/slic3r/GUI/Selection.cpp:1475
+#: src/slic3r/GUI/Selection.cpp:1515
msgid "Set Printable Instance"
msgstr "Définir une Instance Imprimable"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:846
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:244
+msgid "Set right thumb as active"
+msgstr "Définir le curseur de droite comme actif"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1836
+msgid "Set ruler mode"
+msgstr "Définir le mode règle"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:893
msgid "Set Scale"
msgstr "Définir l'Échelle"
-#: src/libslic3r/PrintConfig.cpp:2393
+#: src/libslic3r/PrintConfig.cpp:2536
msgid "Set the actual LCD display orientation inside the SLA printer. Portrait mode will flip the meaning of display width and height parameters and the output images will be rotated by 90 degrees."
msgstr "Définit l'orientation de l'affichage LCD dans l'imprimante SLA. Le mode portrait échangera la signification des paramètres de hauteurs et de largeur et les images de sortie seront pivotées de 90 degrés."
-#: src/slic3r/GUI/ConfigWizard.cpp:932
+#: src/slic3r/GUI/ConfigWizard.cpp:1298
msgid "Set the shape of your printer's bed."
msgstr "Réglez la forme du plateau de votre imprimante."
-#: src/libslic3r/PrintConfig.cpp:556
+#: src/libslic3r/PrintConfig.cpp:592
msgid "Set this to a non-zero value to allow a manual extrusion width. If left to zero, Slic3r derives extrusion widths from the nozzle diameter (see the tooltips for perimeter extrusion width, infill extrusion width etc). If expressed as percentage (for example: 230%), it will be computed over layer height."
msgstr "Réglez ce paramètre sur une valeur non-nulle pour définir manuellement la largeur d’extrusion. Si la valeur reste sur zéro, Slic3r calcule la largeur d’extrusion en se basant sur le diamètre de la buse (voir l’info-bulle concernant la largeur d’extrusion du périmètre, la largeur d’extrusion du remplissage, etc…). Si la valeur est exprimée en pourcentage (par exemple : 230%), elle sera calculée par rapport à la hauteur de couche."
-#: src/libslic3r/PrintConfig.cpp:448
+#: src/libslic3r/PrintConfig.cpp:484
msgid "Set this to a non-zero value to set a manual extrusion width for external perimeters. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 200%), it will be computed over layer height."
msgstr "Réglez ce paramètre sur une valeur non-nulle pour définir manuellement la largeur d’extrusion pour les périmètres extérieurs. Si la valeur reste sur zéro, la largeur d’extrusion par défaut sera utilisée si définie, sinon la valeur 1.125 x diamètre de la buse sera utilisée. Si la valeur est exprimée en pourcentage (par exemple : 200%), elle sera calculée par rapport à la hauteur de couche."
-#: src/libslic3r/PrintConfig.cpp:878
+#: src/libslic3r/PrintConfig.cpp:920
msgid "Set this to a non-zero value to set a manual extrusion width for first layer. You can use this to force fatter extrudates for better adhesion. If expressed as percentage (for example 120%) it will be computed over first layer height. If set to zero, it will use the default extrusion width."
msgstr "Réglez ce paramètre sur une valeur non-nulle pour définir manuellement la largeur d’extrusion pour la première couche. Vous pouvez procéder ainsi pour obtenir des extrudats plus épais afin d’avoir une meilleure adhérence. Si la valeur est exprimée en pourcentage (par exemple : 120%), elle sera calculée par rapport à la hauteur de la première couche. Si elle est réglée sur zéro, elle utilisera la largeur d’extrusion par défaut."
-#: src/libslic3r/PrintConfig.cpp:1758
+#: src/libslic3r/PrintConfig.cpp:1873
msgid "Set this to a non-zero value to set a manual extrusion width for infill for solid surfaces. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 90%) it will be computed over layer height."
msgstr "Réglez ce paramètre sur une valeur non-nulle pour définir manuellement la largeur d’extrusion pour le remplissage ou les surfaces solides. Si la valeur reste sur zéro, la largeur d’extrusion par défaut sera utilisée si définie, sinon la valeur 1.125 x diamètre de la buse sera utilisée. Si la valeur est exprimée en pourcentage (par exemple : 90%), elle sera calculée par rapport à la hauteur de couche."
-#: src/libslic3r/PrintConfig.cpp:2107
+#: src/libslic3r/PrintConfig.cpp:2250
msgid "Set this to a non-zero value to set a manual extrusion width for infill for top surfaces. You may want to use thinner extrudates to fill all narrow regions and get a smoother finish. If left zero, default extrusion width will be used if set, otherwise nozzle diameter will be used. If expressed as percentage (for example 90%) it will be computed over layer height."
msgstr "Réglez ce paramètre sur une valeur non-nulle pour définir manuellement la largeur d’extrusion pour le remplissage ou les surfaces supérieures. Vous voudrez peut-être utiliser des extrudats plus fins pour remplir les zones les plus étroites et obtenir des finitions plus lisses. Si la valeur reste sur zéro, la largeur d’extrusion par défaut sera utilisée si définie, sinon le diamètre de la buse sera utilisé. Si la valeur est exprimée en pourcentage (par exemple : 90%), elle sera calculée par rapport à la hauteur de couche."
-#: src/libslic3r/PrintConfig.cpp:1011
+#: src/libslic3r/PrintConfig.cpp:1055
msgid "Set this to a non-zero value to set a manual extrusion width for infill. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. You may want to use fatter extrudates to speed up the infill and make your parts stronger. If expressed as percentage (for example 90%) it will be computed over layer height."
msgstr "Réglez ce paramètre sur une valeur non-nulle pour définir manuellement la largeur d’extrusion pour le remplissage. Si la valeur reste sur zéro, la largeur d’extrusion par défaut sera utilisée si définie, sinon la valeur 1.125 x diamètre de la buse sera utilisée. Vous voudrez peut-être utiliser des extrudats plus épais pour accélérer le remplissage et rendre vos pièces plus solides. Si la valeur est exprimée en pourcentage (par exemple : 90%), elle sera calculée par rapport à la hauteur de couche."
-#: src/libslic3r/PrintConfig.cpp:1419
+#: src/libslic3r/PrintConfig.cpp:1527
msgid "Set this to a non-zero value to set a manual extrusion width for perimeters. You may want to use thinner extrudates to get more accurate surfaces. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 200%) it will be computed over layer height."
msgstr "Réglez ce paramètre sur une valeur non-nulle pour définir manuellement une largeur d’extrusion pour les périmètres. Vous voudrez peut-être utiliser des extrudats plus fin pour obtenir des surfaces plus nettes. Si la valeur reste sur zéro, la largeur d’extrusion par défaut sera utilisée si définie, sinon la valeur 1.125 x diamètre de la buse sera utilisée. Si la valeur est exprimée en pourcentage (par exemple : 200%), elle sera calculée par rapport à la hauteur de couche."
-#: src/libslic3r/PrintConfig.cpp:1948
+#: src/libslic3r/PrintConfig.cpp:2090
msgid "Set this to a non-zero value to set a manual extrusion width for support material. If left zero, default extrusion width will be used if set, otherwise nozzle diameter will be used. If expressed as percentage (for example 90%) it will be computed over layer height."
msgstr "Réglez ce paramètre sur une valeur non-nulle pour définir manuellement la largeur d’extrusion pour les supports. Si la valeur reste sur zéro, la largeur d’extrusion par défaut sera utilisée si définie, sinon le diamètre de la buse sera utilisée. Si la valeur est exprimée en pourcentage (par exemple : 90%), elle sera calculée par rapport à la hauteur de couche."
-#: src/libslic3r/PrintConfig.cpp:512
+#: src/libslic3r/PrintConfig.cpp:548
msgid "Set this to the clearance radius around your extruder. If the extruder is not centered, choose the largest value for safety. This setting is used to check for collisions and to display the graphical preview in the plater."
msgstr "Paramétrez ceci avec le rayon de dégagement autour de l'extrudeur. Si l'extrudeur n'est pas centré, choisissez la plus grande valeur par sécurité. Ce réglage est utilisé pour vérifier les collisions et afficher l'aperçu graphique sur le plateau."
@@ -6723,87 +7898,98 @@ msgstr "Paramétrez ceci avec le rayon de dégagement autour de l'extrudeur. Si
msgid "Set this to the maximum height that can be reached by your extruder while printing."
msgstr "Réglez cette valeur sur la hauteur maximum que peut atteindre votre extrudeur au cours de l'impression."
-#: src/libslic3r/PrintConfig.cpp:501
+#: src/libslic3r/PrintConfig.cpp:537
msgid "Set this to the vertical distance between your nozzle tip and (usually) the X carriage rods. In other words, this is the height of the clearance cylinder around your extruder, and it represents the maximum depth the extruder can peek before colliding with other printed objects."
msgstr "Paramétrez ceci avec la distance verticale entre la pointe de la buse et (habituellement) les tiges du chariot de l'axe X. En d'autres termes, il s'agit de la hauteur du cylindre de dégagement autour de l'extrudeur, et elle représente la profondeur maximum à laquelle peut descendre l'extrudeur avant d'entrer en collision avec d'autres objets imprimés."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4581 src/slic3r/GUI/Selection.cpp:1513
msgid "Set Unprintable"
msgstr "Définir non-Imprimable"
-#: src/slic3r/GUI/Selection.cpp:1475
+#: src/slic3r/GUI/Selection.cpp:1515
msgid "Set Unprintable Instance"
msgstr "Définir une Instance non-Imprimable"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:221
+msgid "Set upper thumb as active"
+msgstr "Définir le curseur du haut comme actif"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
msgid "Set upper thumb to current slider thumb"
-msgstr "Définir le curseur supérieur sur le curseur actuel"
+msgstr "Régler le curseur supérieur sur la position actuelle de la barre de défilement"
-#: src/libslic3r/PrintConfig.cpp:3509
-msgid ""
-"Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:trace\n"
-"For example. loglevel=2 logs fatal, error and warning level messages."
-msgstr ""
-"Définit la sensibilité de journalisation. 0 : fatal, 1: erreur, 2 : avertissement, 3 : info, 4 : débogage, 5 : trace\n"
-"Par exemple. loglevel = 2 enregistre les messages d'erreur et d'avertissement de niveau fatal."
+#: src/libslic3r/PrintConfig.cpp:3714
+msgid "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:trace\nFor example. loglevel=2 logs fatal, error and warning level messages."
+msgstr "Définit la sensibilité de journalisation. 0 : fatal, 1: erreur, 2 : avertissement, 3 : info, 4 : débogage, 5 : trace\nPar exemple. loglevel = 2 enregistre les messages d'erreur et d'avertissement de niveau fatal."
-#: src/slic3r/GUI/BedShapeDialog.cpp:155
+#: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/MainFrame.cpp:1969
msgid "Settings"
msgstr "Réglages"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2507
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2899
msgid "Settings for height range"
msgstr "Réglages pour la zone de hauteur"
-#: src/slic3r/GUI/ConfigManipulation.cpp:162
+#: src/slic3r/GUI/Preferences.cpp:431
+msgid "Settings in non-modal window"
+msgstr "Réglages dans une fenêtre non modale"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:161
msgid "Shall I adjust those settings for supports?"
msgstr "Dois-je ajuster ces paramètres pour les supports ?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:89
+#: src/slic3r/GUI/ConfigManipulation.cpp:88
msgid "Shall I adjust those settings in order to enable Spiral Vase?"
msgstr "Dois-je ajuster ces réglages afin d'activer le Vase Spirale ?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:119
+#: src/slic3r/GUI/ConfigManipulation.cpp:118
msgid "Shall I adjust those settings in order to enable the Wipe Tower?"
msgstr "Dois-je ajuster ces réglages afin d'activer la tour de Nettoyage ?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:210
+#: src/slic3r/GUI/ConfigManipulation.cpp:209
msgid "Shall I switch to rectilinear fill pattern?"
msgstr "Dois-je passer au motif de remplissage rectiligne?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:139
+#: src/slic3r/GUI/ConfigManipulation.cpp:138
msgid "Shall I synchronize support layers in order to enable the Wipe Tower?"
msgstr "Dois-je synchroniser les couches de support afin d'activer la Tour de Nettoyage ?"
-#: src/slic3r/GUI/BedShapeDialog.cpp:66 src/slic3r/GUI/GUI_ObjectList.cpp:2059
+#: src/slic3r/GUI/BedShapeDialog.cpp:156 src/slic3r/GUI/BedShapeDialog.cpp:222
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2215
msgid "Shape"
msgstr "Forme"
-#: src/slic3r/GUI/GUI_Preview.cpp:256
+#: src/slic3r/GUI/GUI_Preview.cpp:338 src/slic3r/GUI/GUI_Preview.cpp:1478
msgid "Shells"
msgstr "Coques"
-#: src/slic3r/GUI/GLCanvas3D.cpp:249
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33
+msgid "Shift + Left mouse button"
+msgstr "Maj + bouton gauche de la souris"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:241
msgid "Shift + Left mouse button:"
msgstr "Maj + Clic gauche souris :"
-#: src/slic3r/GUI/GLCanvas3D.cpp:255
+#: src/slic3r/GUI/GLCanvas3D.cpp:245
msgid "Shift + Right mouse button:"
msgstr "Maj + Clic droit souris :"
-#: src/slic3r/GUI/GUI_Preview.cpp:231
+#: src/slic3r/GUI/GUI_Preview.cpp:286 src/slic3r/GUI/GUI_Preview.cpp:288
msgid "Show"
msgstr "Afficher"
-#: src/slic3r/GUI/MainFrame.cpp:701
+#: src/slic3r/GUI/MainFrame.cpp:926 src/slic3r/GUI/MainFrame.cpp:1325
msgid "Show &Configuration Folder"
msgstr "Afficher le Répertoire de &Configuration"
-#: src/slic3r/GUI/MainFrame.cpp:676
+#: src/slic3r/GUI/MainFrame.cpp:1294
msgid "Show &labels"
msgstr "Afficher les &labels"
-#: src/slic3r/GUI/MainFrame.cpp:705
+#: src/slic3r/GUI/MainFrame.cpp:933 src/slic3r/GUI/MainFrame.cpp:937
+#: src/slic3r/GUI/MainFrame.cpp:1329
msgid "Show about dialog"
msgstr "Afficher la boîte de dialogue à propos"
@@ -6811,550 +7997,619 @@ msgstr "Afficher la boîte de dialogue à propos"
msgid "Show advanced settings"
msgstr "Afficher les réglages avancés"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:159
+#: src/slic3r/GUI/Preferences.cpp:120
+msgid "Show drop project dialog"
+msgstr "Afficher la boite de dialogue pour déposer un projet"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:157
msgid "Show error message"
msgstr "Afficher le message d'erreur"
-#: src/slic3r/GUI/Preferences.cpp:95
+#: src/slic3r/GUI/DoubleSlider.cpp:1832
+msgid "Show estimated print time"
+msgstr "Afficher le temps d'impression estimé"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1832
+msgid "Show estimated print time on the ruler"
+msgstr "Afficher sur la règle le temps d'impression estimé"
+
+#: src/slic3r/GUI/Preferences.cpp:112
msgid "Show incompatible print and filament presets"
msgstr "Afficher les préréglages d'impression et de filament incompatibles"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:151
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:145
msgid "Show keyboard shortcuts list"
msgstr "Afficher la liste des raccourcis clavier"
-#: src/slic3r/GUI/MainFrame.cpp:676
+#: src/slic3r/GUI/GCodeViewer.cpp:2591
+msgid "Show normal mode"
+msgstr "Afficher le mode normal"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1828
+msgid "Show object height"
+msgstr "Afficher la hauteur de l'objet"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1828
+msgid "Show object height on the ruler"
+msgstr "Afficher la hauteur de l'objet sur la règle"
+
+#: src/slic3r/GUI/MainFrame.cpp:1294
msgid "Show object/instance labels in 3D scene"
msgstr "Afficher les labels de l'objet /instance dans la scène 3D"
+#: src/slic3r/GUI/Preferences.cpp:213
+msgid "Show sidebar collapse/expand button"
+msgstr "Afficher le bouton Réduire/Développer de la barre latérale"
+
#: src/slic3r/GUI/WipeTowerDialog.cpp:377
msgid "Show simplified settings"
msgstr "Afficher les réglages simplifiés"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:52
+#: src/slic3r/GUI/Preferences.cpp:169 src/slic3r/GUI/Preferences.cpp:171
+msgid "Show splash screen"
+msgstr "Afficher l'écran de démarrage"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2586
+msgid "Show stealth mode"
+msgstr "Afficher le mode furtif"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51
msgid "Show supports"
msgstr "Afficher les supports"
-#: src/slic3r/GUI/MainFrame.cpp:699
+#: src/slic3r/GUI/MainFrame.cpp:924 src/slic3r/GUI/MainFrame.cpp:1323
msgid "Show system information"
msgstr "Afficher les informations système"
-#: src/slic3r/GUI/MainFrame.cpp:626
+#: src/slic3r/GUI/MainFrame.cpp:1234
msgid "Show the 3D editing view"
msgstr "Afficher la vue d'édition 3D"
-#: src/slic3r/GUI/MainFrame.cpp:629
+#: src/slic3r/GUI/MainFrame.cpp:1237
msgid "Show the 3D slices preview"
msgstr "Afficher la prévisualisation des tranches 3D"
-#: src/slic3r/GUI/MainFrame.cpp:617
+#: src/slic3r/GUI/MainFrame.cpp:1224
msgid "Show the filament settings"
msgstr "Afficher les réglages de filament"
-#: src/libslic3r/PrintConfig.cpp:3372
+#: src/libslic3r/PrintConfig.cpp:3571
msgid "Show the full list of print/G-code configuration options."
msgstr "Afficher la liste complète des options de configuration d'impression/G-code."
-#: src/libslic3r/PrintConfig.cpp:3377
+#: src/libslic3r/PrintConfig.cpp:3576
msgid "Show the full list of SLA print configuration options."
msgstr "Afficher la liste complète des options de configuration d'impression SLA."
-#: src/slic3r/GUI/MainFrame.cpp:708
+#: src/slic3r/GUI/MainFrame.cpp:941 src/slic3r/GUI/MainFrame.cpp:1332
msgid "Show the list of the keyboard shortcuts"
msgstr "Afficher la liste des raccourcis clavier"
-#: src/slic3r/GUI/MainFrame.cpp:606
+#: src/slic3r/GUI/MainFrame.cpp:1216
msgid "Show the plater"
msgstr "Afficher le plateau"
-#: src/slic3r/GUI/MainFrame.cpp:614
+#: src/slic3r/GUI/MainFrame.cpp:1221
msgid "Show the print settings"
msgstr "Afficher les réglages d'impression"
-#: src/slic3r/GUI/MainFrame.cpp:621
+#: src/slic3r/GUI/MainFrame.cpp:1228
msgid "Show the printer settings"
msgstr "Afficher les réglages de l'imprimante"
-#: src/libslic3r/PrintConfig.cpp:3366
+#: src/libslic3r/PrintConfig.cpp:3565
msgid "Show this help."
msgstr "Afficher cette aide."
-#: src/slic3r/GUI/MainFrame.cpp:701
+#: src/slic3r/GUI/MainFrame.cpp:926 src/slic3r/GUI/MainFrame.cpp:1325
msgid "Show user configuration folder (datadir)"
msgstr "Afficher le répertoire de configuration utilisateur (datadir)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:185
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:182
msgid "Show/Hide 3Dconnexion devices settings dialog"
msgstr "Afficher/Masquer le dialogue des paramètres des périphériques 3Dconnexion"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
-msgid "Show/Hide Legend"
-msgstr "Afficher/Cacher la Légende"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
+msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled"
+msgstr "Afficher/Cacher la boite de dialogue des réglages des appareils 3Dconnexion, si activé"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+msgid "Show/Hide Legend & Estimated printing time"
+msgstr "Afficher/Masquer la légende et le temps d'impression estimé"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+msgid "Show/Hide Legend and Estimated printing time"
+msgstr "Afficher/Cacher la Légende et le Temps d'impression estimé"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:146
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:141
msgid "Show/Hide object/instance labels"
msgstr "Afficher/Masquer les labels de l'objet/instance"
-#: src/slic3r/GUI/GUI_App.cpp:813 src/slic3r/GUI/wxExtensions.cpp:753
+#: src/slic3r/GUI/GUI_App.cpp:1504 src/slic3r/GUI/wxExtensions.cpp:673
msgid "Simple"
msgstr "Simple"
-#: src/slic3r/GUI/ConfigWizard.cpp:820
+#: src/slic3r/GUI/ConfigWizard.cpp:1179
msgid "Simple mode"
msgstr "Mode simple"
-#: src/slic3r/GUI/GUI_App.cpp:813
+#: src/slic3r/GUI/GUI_App.cpp:1504
msgid "Simple View Mode"
msgstr "Mode de Vue Simple"
-#: src/slic3r/GUI/Tab.cpp:2298 src/slic3r/GUI/Tab.cpp:2306
+#: src/slic3r/GUI/Tab.cpp:2467 src/slic3r/GUI/Tab.cpp:2475
msgid "Single extruder MM setup"
msgstr "Réglage MM pour extrudeur unique"
-#: src/libslic3r/PrintConfig.cpp:1845
+#: src/libslic3r/PrintConfig.cpp:1987
msgid "Single Extruder Multi Material"
msgstr "Multi Material à extrudeur unique"
-#: src/slic3r/GUI/Tab.cpp:1867
-msgid ""
-"Single Extruder Multi Material is selected, \n"
-"and all extruders must have the same diameter.\n"
-"Do you want to change the diameter for all extruders to first extruder nozzle diameter value?"
-msgstr ""
-"Le Multi-Matériaux Extrudeur Unique est sélectionné,\n"
-"et tous les extrudeurs doivent avoir le même diamètre.\n"
-"Voulez-vous modifier le diamètre pour tous les extrudeurs\n"
-"en utilisant la valeur du diamètre de la buse du premier extrudeur ?"
+#: src/slic3r/GUI/Tab.cpp:2101
+msgid "Single Extruder Multi Material is selected, \nand all extruders must have the same diameter.\nDo you want to change the diameter for all extruders to first extruder nozzle diameter value?"
+msgstr "Le Multi-Matériaux Extrudeur Unique est sélectionné,\net tous les extrudeurs doivent avoir le même diamètre.\nVoulez-vous modifier le diamètre pour tous les extrudeurs\nen utilisant la valeur du diamètre de la buse du premier extrudeur ?"
-#: src/slic3r/GUI/Tab.cpp:2307
+#: src/slic3r/GUI/Tab.cpp:2476
msgid "Single extruder multimaterial parameters"
msgstr "Paramètres multimatériaux pour extrudeur unique"
-#: src/slic3r/GUI/BedShapeDialog.cpp:77
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:232 src/slic3r/GUI/Plater.cpp:160
-#: src/slic3r/GUI/Tab.cpp:2324
+#: src/slic3r/GUI/Preferences.cpp:120 src/libslic3r/PrintConfig.cpp:3689
+msgid "Single instance mode"
+msgstr "Mode d'instance unique"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:93
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:240 src/slic3r/GUI/Plater.cpp:166
+#: src/slic3r/GUI/Tab.cpp:2493
msgid "Size"
msgstr "Taille"
-#: src/slic3r/GUI/Tab.cpp:1797 src/slic3r/GUI/Tab.cpp:2041
+#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:2241
msgid "Size and coordinates"
msgstr "Taille et coordonnées"
-#: src/slic3r/GUI/BedShapeDialog.cpp:78
+#: src/slic3r/GUI/BedShapeDialog.cpp:110
msgid "Size in X and Y of the rectangular plate."
msgstr "Taille en X et Y du plateau rectangulaire."
-#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1111
-#: src/libslic3r/ExtrusionEntity.cpp:318
+#: src/slic3r/GUI/GUI_Preview.cpp:310 src/slic3r/GUI/Tab.cpp:1439
+#: src/libslic3r/ExtrusionEntity.cpp:323 src/libslic3r/ExtrusionEntity.cpp:354
msgid "Skirt"
msgstr "Jupe"
-#: src/slic3r/GUI/Tab.cpp:1110
+#: src/slic3r/GUI/Tab.cpp:1438
msgid "Skirt and brim"
msgstr "Jupe et bordure"
-#: src/libslic3r/PrintConfig.cpp:1687
+#: src/libslic3r/PrintConfig.cpp:1795
msgid "Skirt height"
msgstr "Hauteur de la jupe"
-#: src/libslic3r/PrintConfig.cpp:1696
+#: src/libslic3r/PrintConfig.cpp:1811
msgid "Skirt Loops"
msgstr "Boucles de la Jupe"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1334
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1181
msgid "SLA gizmo keyboard shortcuts"
msgstr "Raccourcis clavier pour le gizmo SLA"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1058
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:924
msgid "SLA gizmo turned off"
msgstr "Gizmo SLA désactivé"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1017
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897
msgid "SLA gizmo turned on"
msgstr "Gizmo SLA activé"
-#: src/slic3r/GUI/Plater.cpp:818 src/slic3r/GUI/Preset.cpp:1524
+#: src/slic3r/GUI/Plater.cpp:693 src/libslic3r/Preset.cpp:1303
msgid "SLA material"
msgstr "Matériau SLA"
-#: src/slic3r/GUI/ConfigWizard.cpp:2015
+#: src/slic3r/GUI/ConfigWizard.cpp:2526
msgid "SLA Material Profiles Selection"
msgstr "Sélection des Profils Matériaux SLA"
-#: src/libslic3r/PrintConfig.cpp:2470 src/libslic3r/PrintConfig.cpp:2471
+#: src/libslic3r/PrintConfig.cpp:2613 src/libslic3r/PrintConfig.cpp:2614
msgid "SLA material type"
msgstr "Type de matériau SLA"
-#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2015
+#: src/slic3r/GUI/ConfigWizard.cpp:1872 src/slic3r/GUI/ConfigWizard.cpp:2526
msgid "SLA Materials"
msgstr "Matériaux SLA"
-#: src/slic3r/GUI/Preset.cpp:1523
+#: src/libslic3r/Preset.cpp:1302
msgid "SLA print"
msgstr "Impression SLA"
-#: src/libslic3r/PrintConfig.cpp:2578
+#: src/libslic3r/PrintConfig.cpp:2721
msgid "SLA print material notes"
msgstr "Notes concernant le matériau d'impression SLA"
-#: src/slic3r/GUI/Plater.cpp:817
+#: src/slic3r/GUI/Plater.cpp:692
msgid "SLA print settings"
msgstr "Réglages d'impression SLA"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:996
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869
msgid "SLA Support Points"
msgstr "Points de Support SLA"
-#: src/slic3r/GUI/GLCanvas3D.cpp:687
-msgid "SLA supports outside the print area were detected"
-msgstr "SLA supports détectés en dehors de la zone d'impression"
+#: src/slic3r/GUI/GLCanvas3D.cpp:635
+msgid "SLA supports outside the print area were detected."
+msgstr "Des supports SLA en dehors de la zone d'impression ont été détectés."
-#: src/slic3r/GUI/ConfigWizard.cpp:1530
+#: src/slic3r/GUI/ConfigWizard.cpp:1931
msgid "SLA Technology Printers"
msgstr "Imprimantes Technologie SLA"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1432
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
msgid "Slab"
-msgstr "Slab"
+msgstr "Pavé"
-#: src/libslic3r/PrintConfig.cpp:1333
+#: src/libslic3r/PrintConfig.cpp:1441
msgid "Slic3r can upload G-code files to a printer host. This field must contain the kind of the host."
msgstr "Slic3r peut envoyer des fichiers G-codes vers un hôte d'imprimante. Ce champ doit contenir le type d'hôte."
-#: src/libslic3r/PrintConfig.cpp:105
+#: src/libslic3r/PrintConfig.cpp:107
msgid "Slic3r can upload G-code files to a printer host. This field should contain the API Key or the password required for authentication."
msgstr "Slic3r peut envoyer des fichiers G-code à un hôte d'impression. Ce champ doit contenir la clé d'API ou le mot de passe requis pour l'authentification."
-#: src/libslic3r/PrintConfig.cpp:98
-msgid "Slic3r can upload G-code files to a printer host. This field should contain the hostname, IP address or URL of the printer host instance."
-msgstr "Slic3r peut télécharger des fichiers G-code vers un hôte d'impression. Ce champ doit contenir le nom d'hôte, l'adresse IP ou l'URL de l'instance hôte d'impression."
+#: src/libslic3r/PrintConfig.cpp:100
+msgid "Slic3r can upload G-code files to a printer host. This field should contain the hostname, IP address or URL of the printer host instance. Print host behind HAProxy with basic auth enabled can be accessed by putting the user name and password into the URL in the following format: https://username:password@your-octopi-address/"
+msgstr "Slic3r peut télécharger des fichiers G-code vers un hôte d'impression. Ce champ doit contenir le nom de l'hôte, l'adresse IP ou l'URL d'instance de l'hôte d'impression. Vous pouvez accéder à un hôte d'impression se trouvant derrière HAProxy avec basic auth activé en mettant le nom d'utilisateur et le mot de passe dans l'URL en respectant le format suivant : https://username:password@your-octopi-address/"
-#: src/libslic3r/PrintConfig.cpp:1299
+#: src/libslic3r/PrintConfig.cpp:1407
msgid "Slic3r will not scale speed down below this speed."
msgstr "Slic3r ne descendra pas en-dessous de cette vitesse."
-#: src/libslic3r/PrintConfig.cpp:3359
+#: src/libslic3r/PrintConfig.cpp:3558
msgid "Slice"
msgstr "Découper"
-#: src/slic3r/GUI/MainFrame.cpp:512
+#: src/slic3r/GUI/MainFrame.cpp:1113
msgid "Slice a file into a G-code"
msgstr "Découper un fichier en G-code"
-#: src/slic3r/GUI/MainFrame.cpp:518
+#: src/slic3r/GUI/MainFrame.cpp:1119
msgid "Slice a file into a G-code, save as"
msgstr "Découper un fichier en G-code, enregistrer sous"
-#: src/libslic3r/PrintConfig.cpp:87
+#: src/libslic3r/PrintConfig.cpp:89
msgid "Slice gap closing radius"
msgstr "Découper le rayon de fermeture de l'espacement"
-#: src/slic3r/GUI/Plater.cpp:892 src/slic3r/GUI/Plater.cpp:3121
-#: src/slic3r/GUI/Plater.cpp:5110
+#: src/slic3r/GUI/Plater.cpp:767 src/slic3r/GUI/Plater.cpp:2921
+#: src/slic3r/GUI/Plater.cpp:5237
msgid "Slice now"
msgstr "Découper maintenant"
-#: src/libslic3r/PrintConfig.cpp:3333
+#: src/libslic3r/PrintConfig.cpp:3526
msgid "Slice the model and export SLA printing layers as PNG."
msgstr "Découper le modèle et exporter les couches d'impression SLA en tant que PNG."
-#: src/libslic3r/PrintConfig.cpp:3354
+#: src/libslic3r/PrintConfig.cpp:3547
msgid "Slice the model and export toolpaths as G-code."
msgstr "Découper le modèle et exporter les parcours en tant que G-code."
-#: src/libslic3r/PrintConfig.cpp:3360
+#: src/libslic3r/PrintConfig.cpp:3559
msgid "Slice the model as FFF or SLA based on the printer_technology configuration value."
msgstr "Découper le modèle en tant que FFF ou SLA en fonction de la valeur de configuration de la printer_technology."
-#: src/slic3r/GUI/Plater.cpp:216
+#: src/slic3r/GUI/Plater.cpp:222
msgid "Sliced Info"
msgstr "Informations de découpage"
-#: src/slic3r/GUI/MainFrame.cpp:847 src/slic3r/GUI/Plater.cpp:3121
-#: src/slic3r/GUI/Plater.cpp:5107 src/slic3r/GUI/Tab.cpp:1221
-#: src/slic3r/GUI/Tab.cpp:3662
+#: src/slic3r/GUI/MainFrame.cpp:1548 src/slic3r/GUI/Plater.cpp:2921
+#: src/slic3r/GUI/Plater.cpp:5234 src/slic3r/GUI/Tab.cpp:1551
+#: src/slic3r/GUI/Tab.cpp:4081
msgid "Slicing"
msgstr "Découpe"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:134
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:184
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:170
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:219
msgid "Slicing complete"
-msgstr "Découpe annulée"
+msgstr "Découpe terminée"
-#: src/libslic3r/SLAPrint.cpp:760
+#: src/libslic3r/SLAPrint.cpp:780
msgid "Slicing done"
msgstr "Découpe effectuée"
-#: src/slic3r/GUI/MainFrame.cpp:874
+#: src/slic3r/GUI/MainFrame.cpp:1575
msgid "Slicing Done!"
msgstr "Découpe Effectuée !"
-#: src/libslic3r/SLAPrintSteps.cpp:245
+#: src/slic3r/GUI/NotificationManager.cpp:751
+msgid "Slicing finished."
+msgstr "Découpage terminé."
+
+#: src/libslic3r/SLAPrintSteps.cpp:247
msgid "Slicing had to be stopped due to an internal error: Inconsistent slice index."
msgstr "La découpe a du être interrompue du fait d'une erreur interne : index de découpage inconsistant."
-#: src/libslic3r/SLAPrintSteps.cpp:45
+#: src/libslic3r/SLAPrintSteps.cpp:46
msgid "Slicing model"
msgstr "Découpe du modèle"
-#: src/libslic3r/SLAPrintSteps.cpp:49
+#: src/libslic3r/SLAPrintSteps.cpp:50
msgid "Slicing supports"
msgstr "Découpe des supports"
-#: src/libslic3r/PrintConfig.cpp:2414
+#: src/libslic3r/PrintConfig.cpp:2557
msgid "Slow"
msgstr "Lent"
-#: src/libslic3r/PrintConfig.cpp:1705
+#: src/libslic3r/PrintConfig.cpp:1820
msgid "Slow down if layer print time is below"
msgstr "Ralentir si le temps d'impression de la couche est inférieur à"
-#: src/libslic3r/PrintConfig.cpp:2415
+#: src/libslic3r/PrintConfig.cpp:2558
msgid "Slow tilt"
msgstr "Inclinaison lente"
-#: src/libslic3r/PrintConfig.cpp:1715
+#: src/libslic3r/PrintConfig.cpp:1830
msgid "Small perimeters"
msgstr "Périmètres courts"
-#: src/slic3r/GUI/GLCanvas3D.cpp:288
+#: src/libslic3r/PrintConfig.cpp:2801
+msgid "Small pillar diameter percent"
+msgstr "Pourcentage de pilier petit diamètre"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:274
msgid "Smooth"
msgstr "Lisse"
-#: src/slic3r/GUI/GLCanvas3D.cpp:258
+#: src/slic3r/GUI/GLCanvas3D.cpp:247
msgid "Smoothing"
msgstr "Lissage"
-#: src/slic3r/GUI/GUI_App.cpp:839
+#: src/slic3r/GUI/GUI_App.cpp:1540
msgid "Snapshot name"
msgstr "Nom de l'instantané"
-#: src/slic3r/GUI/MainFrame.cpp:686
+#: src/slic3r/GUI/MainFrame.cpp:911 src/slic3r/GUI/MainFrame.cpp:1310
msgid "Software &Releases"
-msgstr "Softwa&re Publications"
+msgstr "Publications du Softwa&re "
-#: src/slic3r/GUI/PresetHints.cpp:184
+#: src/slic3r/GUI/PresetHints.cpp:183
msgid "solid infill"
msgstr "remplissage solide"
-#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:314
-#: src/libslic3r/PrintConfig.cpp:1756 src/libslic3r/PrintConfig.cpp:1767
+#: src/slic3r/GUI/GUI_Preview.cpp:305 src/libslic3r/ExtrusionEntity.cpp:318
+#: src/libslic3r/ExtrusionEntity.cpp:344 src/libslic3r/PrintConfig.cpp:1871
+#: src/libslic3r/PrintConfig.cpp:1882
msgid "Solid infill"
msgstr "Remplissage solide"
-#: src/libslic3r/PrintConfig.cpp:1744
+#: src/libslic3r/PrintConfig.cpp:1859
msgid "Solid infill every"
msgstr "Remplissage solide toutes les"
-#: src/libslic3r/PrintConfig.cpp:1736
+#: src/libslic3r/PrintConfig.cpp:1851
msgid "Solid infill extruder"
msgstr "Extrudeur pour le remplissage solide"
-#: src/libslic3r/PrintConfig.cpp:1727
+#: src/libslic3r/PrintConfig.cpp:1842
msgid "Solid infill threshold area"
msgstr "Surface de seuil pour le remplissage solide"
-#: src/slic3r/GUI/Tab.cpp:1065 src/libslic3r/PrintConfig.cpp:1780
+#: src/slic3r/GUI/Tab.cpp:1387 src/libslic3r/PrintConfig.cpp:1895
msgid "Solid layers"
msgstr "Couches solides"
-#: src/libslic3r/PrintConfig.cpp:754
+#: src/libslic3r/PrintConfig.cpp:790
msgid "Soluble material"
msgstr "Matériau soluble"
-#: src/libslic3r/PrintConfig.cpp:755
+#: src/libslic3r/PrintConfig.cpp:791
msgid "Soluble material is most likely used for a soluble support."
msgstr "Il est probable qu'un matériau soluble soit utilisé pour un support soluble."
-#: src/libslic3r/PrintConfig.cpp:937
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:735
+msgid "Some fields are too long to fit. Right mouse click reveals the full text."
+msgstr "Certains champs sont trop longs pour s'afficher. Un clic droit de la souris révèle le texte intégral."
+
+#: src/libslic3r/PrintConfig.cpp:981
msgid "Some G/M-code commands, including temperature control and others, are not universal. Set this option to your printer's firmware to get a compatible output. The \"No extrusion\" flavor prevents PrusaSlicer from exporting any extrusion value at all."
msgstr "Certaines commandes G/M-code, y compris le contrôle de la température ainsi que d'autres, ne sont pas universelles. Paramétrez cette option dans le firmware de votre imprimante pour obtenir une sortie compatible. L'option \"Pas d'extrusion\" empêche complètement PrusaSlicer d'exporter toute valeur d'extrusion."
-#: src/slic3r/GUI/GLCanvas3D.cpp:688
-msgid "Some objects are not visible"
-msgstr "Certains objets ne sont pas visibles"
+#: src/slic3r/GUI/Plater.cpp:2309
+#, possible-c-format
+msgid "Some object(s) in file %s looks like saved in inches.\nShould I consider them as a saved in inches and convert them?"
+msgstr "Certains objets du fichier %s semblent être enregistrés en pouces.\nDois-je les considérer comme enregistrés en pouces et les convertir ?"
-#: src/libslic3r/Print.cpp:1226
+#: src/slic3r/GUI/GLCanvas3D.cpp:636
+msgid "Some objects are not visible."
+msgstr "Certains objets ne sont pas visibles."
+
+#: src/libslic3r/Print.cpp:1252
msgid "Some objects are too close; your extruder will collide with them."
msgstr "Certains objets sont trop proches ; votre extrudeur va entrer en collision avec eux."
-#: src/libslic3r/Print.cpp:1228
+#: src/libslic3r/Print.cpp:1254
msgid "Some objects are too tall and cannot be printed without extruder collisions."
msgstr "Certains objets sont trop grands et ne peuvent pas être imprimés sans collision avec l'extrudeur."
-#: src/libslic3r/PrintConfig.cpp:2824
+#: src/libslic3r/PrintConfig.cpp:2988
msgid "Some objects can get along with a few smaller pads instead of a single big one. This parameter defines how far the center of two smaller pads should be. If theyare closer, they will get merged into one pad."
msgstr "Certains objets peuvent s'accommoder de quelques petits socles au lieu d'un seul grand. Ce paramètre définit à quelle distance le centre de deux petits socles devrait se trouver. S'ils sont proches, ils seront fusionnés en un seul socle."
-#: src/libslic3r/PrintConfig.cpp:2187
+#: src/libslic3r/PrintConfig.cpp:2330
msgid "Some printers or printer setups may have difficulties printing with a variable layer height. Enabled by default."
msgstr "Certaines imprimantes ou certains réglages d'imprimante peuvent rencontrer des difficultés pour imprimer avec une hauteur de couche variable. Activé par défaut."
-#: src/libslic3r/PrintConfig.cpp:1984
+#: src/slic3r/GUI/GLCanvas3D.cpp:3967
+msgid "Spacing"
+msgstr "Espacement"
+
+#: src/libslic3r/PrintConfig.cpp:2126
msgid "Spacing between interface lines. Set zero to get a solid interface."
msgstr "Espacement entre les lignes d'interface. Mettez à zéro pour obtenir une interface solide."
-#: src/libslic3r/PrintConfig.cpp:2018
+#: src/libslic3r/PrintConfig.cpp:1155
+msgid "Spacing between ironing passes"
+msgstr "Espacement entre les passes de lissage"
+
+#: src/libslic3r/PrintConfig.cpp:2160
msgid "Spacing between support material lines."
msgstr "Espacement entre les lignes des supports."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:616
-#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/Tab.cpp:1145
-#: src/libslic3r/PrintConfig.cpp:235 src/libslic3r/PrintConfig.cpp:458
-#: src/libslic3r/PrintConfig.cpp:919 src/libslic3r/PrintConfig.cpp:1048
-#: src/libslic3r/PrintConfig.cpp:1431 src/libslic3r/PrintConfig.cpp:1668
-#: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1768
-#: src/libslic3r/PrintConfig.cpp:2118
+#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:655
+#: src/slic3r/GUI/GUI_Preview.cpp:278 src/slic3r/GUI/Tab.cpp:1474
+#: src/libslic3r/PrintConfig.cpp:269 src/libslic3r/PrintConfig.cpp:494
+#: src/libslic3r/PrintConfig.cpp:963 src/libslic3r/PrintConfig.cpp:1092
+#: src/libslic3r/PrintConfig.cpp:1165 src/libslic3r/PrintConfig.cpp:1539
+#: src/libslic3r/PrintConfig.cpp:1776 src/libslic3r/PrintConfig.cpp:1831
+#: src/libslic3r/PrintConfig.cpp:1883 src/libslic3r/PrintConfig.cpp:2261
msgid "Speed"
msgstr "Vitesse"
-#: src/libslic3r/PrintConfig.cpp:1670
-msgid "Speed (baud) of USB/serial port for printer connection."
-msgstr "Vitesse (baud) du port USB/série pour la connexion à l'imprimante."
-
-#: src/libslic3r/GCode/PreviewData.cpp:351
+#: src/slic3r/GUI/GCodeViewer.cpp:2238 src/libslic3r/GCode/PreviewData.cpp:356
msgid "Speed (mm/s)"
msgstr "Vitesse (mm/s)"
-#: src/libslic3r/PrintConfig.cpp:920
+#: src/libslic3r/PrintConfig.cpp:964
msgid "Speed for filling small gaps using short zigzag moves. Keep this reasonably low to avoid too much shaking and resonance issues. Set zero to disable gaps filling."
msgstr "Vitesse pour combler de petits interstices avec de courts mouvements en zigzag. Gardez un réglage relativement lent afin d'éviter les problèmes de vibration et de résonance. Réglez sur zéro pour désactiver le remplissage d'interstices."
-#: src/slic3r/GUI/Tab.cpp:1158
+#: src/slic3r/GUI/Tab.cpp:1488
msgid "Speed for non-print moves"
msgstr "Vitesse pour les déplacements sans impression"
-#: src/libslic3r/PrintConfig.cpp:1432
+#: src/libslic3r/PrintConfig.cpp:1540
msgid "Speed for perimeters (contours, aka vertical shells). Set to zero for auto."
msgstr "Vitesse pour les périmètres (contours, parois verticales). Réglez sur zéro pour un ajustement automatique."
-#: src/slic3r/GUI/Tab.cpp:1146
+#: src/slic3r/GUI/Tab.cpp:1475
msgid "Speed for print moves"
msgstr "Vitesse pour les déplacements d'impression"
-#: src/libslic3r/PrintConfig.cpp:236
+#: src/libslic3r/PrintConfig.cpp:270
msgid "Speed for printing bridges."
msgstr "Vitesse d'impression des ponts."
-#: src/libslic3r/PrintConfig.cpp:1769
+#: src/libslic3r/PrintConfig.cpp:1884
msgid "Speed for printing solid regions (top/bottom/internal horizontal shells). This can be expressed as a percentage (for example: 80%) over the default infill speed above. Set to zero for auto."
msgstr "Vitesse pour imprimer des zones solides (supérieures/inférieures/parois horizontales internes). Peut être exprimée en pourcentage (par exemple: 80%) de la vitesse de remplissage par défaut susmentionnée. Réglez sur zéro pour un ajustement automatique."
-#: src/libslic3r/PrintConfig.cpp:1993
+#: src/libslic3r/PrintConfig.cpp:2135
msgid "Speed for printing support material interface layers. If expressed as percentage (for example 50%) it will be calculated over support material speed."
msgstr "Vitesse d'impression des couches d'interface des supports. Si exprimée en pourcentage (par exemple 50%), elle sera calculée à partir de la vitesse d'impression des supports."
-#: src/libslic3r/PrintConfig.cpp:2027
+#: src/libslic3r/PrintConfig.cpp:2169
msgid "Speed for printing support material."
msgstr "Vitesse d'impression du support."
-#: src/libslic3r/PrintConfig.cpp:1049
+#: src/libslic3r/PrintConfig.cpp:1093
msgid "Speed for printing the internal fill. Set to zero for auto."
msgstr "Vitesse pour imprimer le remplissage interne. Réglez sur zéro pour un ajustement automatique."
-#: src/libslic3r/PrintConfig.cpp:2119
+#: src/libslic3r/PrintConfig.cpp:2262
msgid "Speed for printing top solid layers (it only applies to the uppermost external layers and not to their internal solid layers). You may want to slow down this to get a nicer surface finish. This can be expressed as a percentage (for example: 80%) over the solid infill speed above. Set to zero for auto."
msgstr "Vitesse pour imprimer les couches solides supérieures (ne s'applique qu'aux couches externes les plus hautes et pas aux couches internes solides). Vous voudrez peut-être abaisser cette vitesse afin d'avoir une finition de surface plus nette. Peut être exprimé en pourcentage (par exemple: 80%) de la vitesse de remplissage solide susmentionnée. Réglez sur zéro pour un ajustement automatique."
-#: src/libslic3r/PrintConfig.cpp:2153
+#: src/libslic3r/PrintConfig.cpp:2296
msgid "Speed for travel moves (jumps between distant extrusion points)."
msgstr "Vitesse pour les déplacements (trajet entre deux points d'extrusion distants)."
-#: src/libslic3r/PrintConfig.cpp:659
+#: src/libslic3r/PrintConfig.cpp:695
msgid "Speed of the first cooling move"
msgstr "Vitesse du premier mouvement de refroidissement"
-#: src/libslic3r/PrintConfig.cpp:678
+#: src/libslic3r/PrintConfig.cpp:714
msgid "Speed of the last cooling move"
msgstr "Vitesse du dernier mouvement de refroidissement"
-#: src/libslic3r/PrintConfig.cpp:616
+#: src/libslic3r/PrintConfig.cpp:652
msgid "Speed used at the very beginning of loading phase."
msgstr "Vitesse utilisée au tout début de la phase de chargement."
-#: src/libslic3r/PrintConfig.cpp:608
+#: src/libslic3r/PrintConfig.cpp:644
msgid "Speed used for loading the filament on the wipe tower."
msgstr "Vitesse utilisée pour charger le filament sur la tour de nettoyage."
-#: src/libslic3r/PrintConfig.cpp:624
+#: src/libslic3r/PrintConfig.cpp:660
msgid "Speed used for unloading the filament on the wipe tower (does not affect initial part of unloading just after ramming)."
msgstr "Vitesse utilisée pour décharger le filament sur la tour de nettoyage (n'affecte pas l'étape initiale de déchargement juste après l'expulsion)."
-#: src/libslic3r/PrintConfig.cpp:633
+#: src/libslic3r/PrintConfig.cpp:669
msgid "Speed used for unloading the tip of the filament immediately after ramming."
msgstr "Vitesse utilisée pour décharger l'extrémité du filament juste après l'expulsion."
-#: src/slic3r/GUI/Mouse3DController.cpp:296
+#: src/slic3r/GUI/Mouse3DController.cpp:279
msgid "Speed:"
msgstr "Vitesse:"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1432
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
msgid "Sphere"
msgstr "Sphère"
-#: src/libslic3r/PrintConfig.cpp:1794
+#: src/libslic3r/PrintConfig.cpp:1909
msgid "Spiral vase"
msgstr "Mode de vase spirale"
-#: src/slic3r/GUI/ConfigManipulation.cpp:90
+#: src/slic3r/GUI/ConfigManipulation.cpp:89
msgid "Spiral Vase"
msgstr "Vase Spirale"
-#: src/slic3r/GUI/Plater.cpp:4019 src/slic3r/GUI/Plater.cpp:4034
-#: src/slic3r/GUI/Plater.cpp:4048 src/libslic3r/PrintConfig.cpp:3471
+#: src/slic3r/GUI/Plater.cpp:3939 src/slic3r/GUI/Plater.cpp:3954
+#: src/slic3r/GUI/Plater.cpp:3972 src/libslic3r/PrintConfig.cpp:3670
msgid "Split"
msgstr "Scinder"
-#: src/slic3r/GUI/Plater.cpp:4019
+#: src/slic3r/GUI/Plater.cpp:3939
msgid "Split the selected object"
msgstr "Scinder l'objet sélectionné"
-#: src/slic3r/GUI/Plater.cpp:4014 src/slic3r/GUI/Plater.cpp:4034
+#: src/slic3r/GUI/Plater.cpp:3934 src/slic3r/GUI/Plater.cpp:3954
msgid "Split the selected object into individual objects"
msgstr "Scinder l'objet sélectionné en objets individuels"
-#: src/slic3r/GUI/Plater.cpp:4016 src/slic3r/GUI/Plater.cpp:4048
+#: src/slic3r/GUI/Plater.cpp:3936 src/slic3r/GUI/Plater.cpp:3972
msgid "Split the selected object into individual sub-parts"
-msgstr "Scinder l'objet sélectionné en sous-parties individuelles"
+msgstr "Scinder l'objet sélectionné en sous-pièces individuelles"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4550
+#: src/slic3r/GUI/GLCanvas3D.cpp:4916
msgid "Split to objects"
msgstr "Diviser en objets individuels"
-#: src/slic3r/GUI/Plater.cpp:2981
+#: src/slic3r/GUI/Plater.cpp:2774
msgid "Split to Objects"
msgstr "Diviser en Objets"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4560 src/slic3r/GUI/GUI_ObjectList.cpp:1487
+#: src/slic3r/GUI/GLCanvas3D.cpp:4926 src/slic3r/GUI/GUI_ObjectList.cpp:1618
msgid "Split to parts"
-msgstr "Scinder en parties"
+msgstr "Scinder en pièces"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2274
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2440
msgid "Split to Parts"
-msgstr "Scinder en Parties"
+msgstr "Scinder en Pièces"
-#: src/slic3r/GUI/ConfigWizard.cpp:289
+#: src/libslic3r/PrintConfig.cpp:812
+msgid "Spool weight"
+msgstr "Poids de la bobine"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:307
msgid "Standard"
msgstr "Standard"
-#: src/libslic3r/PrintConfig.cpp:846
+#: src/libslic3r/PrintConfig.cpp:884
msgid "Stars"
msgstr "Étoiles"
-#: src/slic3r/GUI/MainFrame.cpp:405
+#: src/slic3r/GUI/MainFrame.cpp:986
msgid "Start a new project"
msgstr "Démarrer un nouveau projet"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29
msgid "Start at height"
msgstr "Hauteur de début"
-#: src/slic3r/GUI/Tab.cpp:1528 src/slic3r/GUI/Tab.cpp:1976
-#: src/libslic3r/PrintConfig.cpp:1813 src/libslic3r/PrintConfig.cpp:1828
+#: src/slic3r/GUI/Tab.cpp:1873 src/slic3r/GUI/Tab.cpp:2161
+#: src/libslic3r/PrintConfig.cpp:1928 src/libslic3r/PrintConfig.cpp:1943
msgid "Start G-code"
msgstr "G-code de début"
-#: src/slic3r/GUI/MainFrame.cpp:532
+#: src/slic3r/GUI/MainFrame.cpp:1133
msgid "Start new slicing process"
msgstr "Démarrer un nouveau processus de découpe"
@@ -7362,7 +8617,15 @@ msgstr "Démarrer un nouveau processus de découpe"
msgid "Start printing after upload"
msgstr "Lancer l'impression après le téléchargement"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:151
+#: src/slic3r/GUI/GUI_App.cpp:396
+msgid "Start the application"
+msgstr "Démarrer l'application"
+
+#: src/slic3r/GUI/GUI_App.cpp:386
+msgid "Starting with %1% 2.3, configuration directory on Linux has changed (according to XDG Base Directory Specification) to \n%2%.\n\nThis directory did not exist yet (maybe you run the new version for the first time).\nHowever, an old %1% configuration directory was detected in \n%3%.\n\nConsider moving the contents of the old directory to the new location in order to access your profiles, etc.\nNote that if you decide to downgrade %1% in future, it will use the old location again.\n\nWhat do you want to do now?"
+msgstr "À partir de %1% 2.3, le répertoire de configuration sous Linux a été modifié (selon la XDG Base Directory Specification) en %2%.\n\nCe répertoire n'existait pas encore (peut-être que vous exécutez la nouvelle version pour la première fois).\nCependant, un ancien répertoire de configuration %1% a été détecté dans %3%.\n\nEnvisagez de déplacer le contenu de l'ancien répertoire vers le nouvel emplacement afin d'accéder à vos profils, etc.\nNotez que si vous décidez de rétrograder %1% à l'avenir, il utilisera à nouveau l'ancien emplacement.\n\nQue voulez-vous faire maintenant ?"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:149
msgid "Status"
msgstr "État"
@@ -7370,864 +8633,873 @@ msgstr "État"
msgid "Status:"
msgstr "État :"
-#: src/slic3r/GUI/Tab.cpp:2209
+#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2378
msgid "Stealth"
msgstr "Mode silencieux"
-#: src/slic3r/GUI/Plater.cpp:1291
+#: src/slic3r/GUI/Plater.cpp:1187 src/slic3r/GUI/Plater.cpp:1235
msgid "stealth mode"
msgstr "mode silencieux"
-#: src/slic3r/GUI/Plater.cpp:4985
-#, c-format
+#: src/slic3r/GUI/GCodeViewer.cpp:2557
+msgid "Stealth mode"
+msgstr "Mode furtif"
+
+#: src/slic3r/GUI/Plater.cpp:5118
+#, possible-c-format
msgid "STL file exported to %s"
msgstr "Fichier STL exporté vers %s"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29
msgid "Stop at height"
msgstr "Hauteur d'arrêt"
-#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:1928
+#: src/slic3r/GUI/GUI_App.cpp:1781
+msgid "Stop them and continue anyway?"
+msgstr "Les arrêter et continuer malgré tout ?"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:295
msgid "Success!"
msgstr "Réussi !"
-#: src/slic3r/GUI/PresetHints.cpp:203
+#: src/slic3r/GUI/Plater.cpp:2047
+#, possible-c-format
+msgid "Successfully unmounted. The device %s(%s) can now be safely removed from the computer."
+msgstr "Démonté avec succès. Le périphérique %s(% s) peut maintenant être retiré en toute sécurité de l'ordinateur."
+
+#: src/slic3r/GUI/PresetHints.cpp:202
msgid "support"
msgstr "support"
-#: src/libslic3r/PrintConfig.cpp:2692
+#: src/libslic3r/PrintConfig.cpp:2856
msgid "Support base diameter"
msgstr "Diamètre de la base du support"
-#: src/libslic3r/PrintConfig.cpp:2702
+#: src/libslic3r/PrintConfig.cpp:2866
msgid "Support base height"
msgstr "Hauteur de la base du support"
-#: src/libslic3r/PrintConfig.cpp:2711
+#: src/libslic3r/PrintConfig.cpp:2875
msgid "Support base safety distance"
msgstr "Distance de sécurité de la base du support"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
msgid "Support Blocker"
msgstr "Bloqueur de Support"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3551
+#: src/libslic3r/PrintConfig.cpp:895
+msgid "Support Cubic"
+msgstr "Support Cubique"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
msgid "Support Enforcer"
msgstr "Générateur de Support"
-#: src/slic3r/GUI/ConfigManipulation.cpp:163
+#: src/slic3r/GUI/ConfigManipulation.cpp:162
msgid "Support Generator"
msgstr "Générateur de support"
-#: src/slic3r/GUI/Tab.cpp:3608
+#: src/slic3r/GUI/Tab.cpp:4018
msgid "Support head"
msgstr "Tête du support"
-#: src/libslic3r/PrintConfig.cpp:2620
-msgid "Support head front diameter"
-msgstr "Diamètre avant de la tête du support"
-
-#: src/libslic3r/PrintConfig.cpp:2629
-msgid "Support head penetration"
-msgstr "Pénétration de la tête du support"
-
-#: src/libslic3r/PrintConfig.cpp:2638
-msgid "Support head width"
-msgstr "Largeur de la tête du support"
-
-#: src/slic3r/GUI/PresetHints.cpp:213
+#: src/slic3r/GUI/PresetHints.cpp:212
msgid "support interface"
msgstr "interface du support"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:97
-#: src/slic3r/GUI/GUI_ObjectList.cpp:615 src/slic3r/GUI/GUI_Preview.cpp:246
-#: src/slic3r/GUI/Tab.cpp:1120 src/slic3r/GUI/Tab.cpp:1121
-#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/PrintConfig.cpp:370
-#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1866
-#: src/libslic3r/PrintConfig.cpp:1872 src/libslic3r/PrintConfig.cpp:1880
-#: src/libslic3r/PrintConfig.cpp:1892 src/libslic3r/PrintConfig.cpp:1902
-#: src/libslic3r/PrintConfig.cpp:1910 src/libslic3r/PrintConfig.cpp:1925
-#: src/libslic3r/PrintConfig.cpp:1946 src/libslic3r/PrintConfig.cpp:1958
-#: src/libslic3r/PrintConfig.cpp:1974 src/libslic3r/PrintConfig.cpp:1983
-#: src/libslic3r/PrintConfig.cpp:1992 src/libslic3r/PrintConfig.cpp:2003
-#: src/libslic3r/PrintConfig.cpp:2017 src/libslic3r/PrintConfig.cpp:2025
-#: src/libslic3r/PrintConfig.cpp:2026 src/libslic3r/PrintConfig.cpp:2035
-#: src/libslic3r/PrintConfig.cpp:2043 src/libslic3r/PrintConfig.cpp:2057
+#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:95
+#: src/slic3r/GUI/GUI_ObjectList.cpp:654 src/slic3r/GUI/GUI_Preview.cpp:311
+#: src/slic3r/GUI/Tab.cpp:1449 src/slic3r/GUI/Tab.cpp:1450
+#: src/libslic3r/ExtrusionEntity.cpp:324 src/libslic3r/ExtrusionEntity.cpp:356
+#: src/libslic3r/PrintConfig.cpp:404 src/libslic3r/PrintConfig.cpp:1610
+#: src/libslic3r/PrintConfig.cpp:2008 src/libslic3r/PrintConfig.cpp:2014
+#: src/libslic3r/PrintConfig.cpp:2022 src/libslic3r/PrintConfig.cpp:2034
+#: src/libslic3r/PrintConfig.cpp:2044 src/libslic3r/PrintConfig.cpp:2052
+#: src/libslic3r/PrintConfig.cpp:2067 src/libslic3r/PrintConfig.cpp:2088
+#: src/libslic3r/PrintConfig.cpp:2100 src/libslic3r/PrintConfig.cpp:2116
+#: src/libslic3r/PrintConfig.cpp:2125 src/libslic3r/PrintConfig.cpp:2134
+#: src/libslic3r/PrintConfig.cpp:2145 src/libslic3r/PrintConfig.cpp:2159
+#: src/libslic3r/PrintConfig.cpp:2167 src/libslic3r/PrintConfig.cpp:2168
+#: src/libslic3r/PrintConfig.cpp:2177 src/libslic3r/PrintConfig.cpp:2185
+#: src/libslic3r/PrintConfig.cpp:2199
msgid "Support material"
msgstr "Supports"
-#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:320
-#: src/libslic3r/PrintConfig.cpp:1991
+#: src/slic3r/GUI/GUI_Preview.cpp:312 src/libslic3r/ExtrusionEntity.cpp:325
+#: src/libslic3r/ExtrusionEntity.cpp:358 src/libslic3r/PrintConfig.cpp:2133
msgid "Support material interface"
msgstr "Interface des supports"
-#: src/libslic3r/PrintConfig.cpp:2044
+#: src/libslic3r/PrintConfig.cpp:2186
msgid "Support material will not be generated for overhangs whose slope angle (90° = vertical) is above the given threshold. In other words, this value represent the most horizontal slope (measured from the horizontal plane) that you can print without support material. Set to zero for automatic detection (recommended)."
msgstr "Le support ne sera pas généré pour les surplombs dont l'inclinaison (90° = vertical) dépasse le seuil défini. Autrement dit, cette valeur représente l'inclinaison horizontale maximum (mesurée à partir du plan horizontal) que vous pouvez imprimer sans support. Réglez sur zéro pour une détection automatique (recommandé)."
-#: src/libslic3r/PrintConfig.cpp:1964
+#: src/libslic3r/PrintConfig.cpp:2106
msgid "Support material/raft interface extruder"
msgstr "Extrudeur pour l'interface des supports/du radeau"
-#: src/libslic3r/PrintConfig.cpp:1937
+#: src/libslic3r/PrintConfig.cpp:2079
msgid "Support material/raft/skirt extruder"
msgstr "Extrudeur pour support/raft/jupe"
-#: src/slic3r/GUI/Plater.cpp:500 src/libslic3r/PrintConfig.cpp:1901
-#: src/libslic3r/PrintConfig.cpp:2674
+#: src/slic3r/GUI/Plater.cpp:366 src/libslic3r/PrintConfig.cpp:2043
+#: src/libslic3r/PrintConfig.cpp:2838
msgid "Support on build plate only"
msgstr "Support sur le plateau uniquement"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:888
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:762
msgid "Support parameter change"
msgstr "Changement des paramètres de support"
-#: src/slic3r/GUI/Tab.cpp:3613
+#: src/slic3r/GUI/Tab.cpp:4023
msgid "Support pillar"
msgstr "Pilier de support"
-#: src/libslic3r/PrintConfig.cpp:2658
-msgid "Support pillar connection mode"
-msgstr "Mode de connexion du pilier de support"
-
-#: src/libslic3r/PrintConfig.cpp:2648
-msgid "Support pillar diameter"
-msgstr "Diamètre du pilier de support"
-
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55
-#: src/libslic3r/PrintConfig.cpp:2764
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54
+#: src/libslic3r/PrintConfig.cpp:2928
msgid "Support points density"
msgstr "Densité des points de support"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1196
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1048
msgid "Support points edit"
msgstr "Éditer les points de support"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/GUI_ObjectList.cpp:624
-#: src/slic3r/GUI/Plater.cpp:495 src/slic3r/GUI/Tab.cpp:3604
-#: src/slic3r/GUI/Tab.cpp:3605 src/libslic3r/PrintConfig.cpp:2614
-#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2630
-#: src/libslic3r/PrintConfig.cpp:2639 src/libslic3r/PrintConfig.cpp:2649
-#: src/libslic3r/PrintConfig.cpp:2675 src/libslic3r/PrintConfig.cpp:2682
-#: src/libslic3r/PrintConfig.cpp:2693 src/libslic3r/PrintConfig.cpp:2703
-#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2725
-#: src/libslic3r/PrintConfig.cpp:2735 src/libslic3r/PrintConfig.cpp:2744
-#: src/libslic3r/PrintConfig.cpp:2754 src/libslic3r/PrintConfig.cpp:2765
-#: src/libslic3r/PrintConfig.cpp:2773
+#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:663
+#: src/slic3r/GUI/Plater.cpp:361 src/slic3r/GUI/Tab.cpp:4014
+#: src/slic3r/GUI/Tab.cpp:4015 src/libslic3r/PrintConfig.cpp:2757
+#: src/libslic3r/PrintConfig.cpp:2764 src/libslic3r/PrintConfig.cpp:2773
+#: src/libslic3r/PrintConfig.cpp:2782 src/libslic3r/PrintConfig.cpp:2792
+#: src/libslic3r/PrintConfig.cpp:2802 src/libslic3r/PrintConfig.cpp:2839
+#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2857
+#: src/libslic3r/PrintConfig.cpp:2867 src/libslic3r/PrintConfig.cpp:2876
+#: src/libslic3r/PrintConfig.cpp:2889 src/libslic3r/PrintConfig.cpp:2899
+#: src/libslic3r/PrintConfig.cpp:2908 src/libslic3r/PrintConfig.cpp:2918
+#: src/libslic3r/PrintConfig.cpp:2929 src/libslic3r/PrintConfig.cpp:2937
msgid "Supports"
msgstr "Supports"
-#: src/slic3r/GUI/Plater.cpp:1194
+#: src/slic3r/GUI/Plater.cpp:1103
msgid "supports and pad"
msgstr "supports et socle"
-#: src/libslic3r/PrintConfig.cpp:1092
+#: src/libslic3r/PrintConfig.cpp:1185
msgid "Supports remaining times"
msgstr "Temps de support restant"
-#: src/libslic3r/PrintConfig.cpp:1101
+#: src/libslic3r/PrintConfig.cpp:1194
msgid "Supports stealth mode"
msgstr "Supporte le mode silencieux"
-#: src/slic3r/GUI/ConfigManipulation.cpp:159
-msgid ""
-"Supports work better, if the following feature is enabled:\n"
-"- Detect bridging perimeters"
-msgstr ""
-"Les supports fonctionnent mieux, si la fonctionnalité suivante est activée :\n"
-"- Détecter les périmètres de pontage"
+#: src/slic3r/GUI/ConfigManipulation.cpp:158
+msgid "Supports work better, if the following feature is enabled:\n- Detect bridging perimeters"
+msgstr "Les supports fonctionnent mieux, si la fonctionnalité suivante est activée :\n- Détecter les périmètres de pontage"
-#: src/slic3r/GUI/Preferences.cpp:87
+#: src/slic3r/GUI/Preferences.cpp:104
msgid "Suppress \" - default - \" presets"
msgstr "Supprimer les préréglages \" - par défaut - \""
-#: src/slic3r/GUI/Preferences.cpp:89
+#: src/slic3r/GUI/Preferences.cpp:106
msgid "Suppress \" - default - \" presets in the Print / Filament / Printer selections once there are any other valid presets available."
msgstr "Supprimer les préréglages \" - par défaut - \" dans les choix Impression / Filament / Imprimante une fois qu'il y a d'autres préréglages valides disponibles."
-#: src/slic3r/GUI/MainFrame.cpp:826
+#: src/slic3r/GUI/Preferences.cpp:276
+msgid "Suppress to open hyperlink in browser"
+msgstr "Supprimer pour ouvrir l'hyperlien dans le navigateur"
+
+#: src/slic3r/GUI/MainFrame.cpp:1527
msgid "SVG"
msgstr "SVG"
-#: src/slic3r/GUI/DoubleSlider.cpp:1144
+#: src/slic3r/GUI/Mouse3DController.cpp:318
+msgid "Swap Y/Z axes"
+msgstr "Permuter les axes Y/Z"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+msgid "Switch between Editor/Preview"
+msgstr "Basculer entre l'éditeur/l'aperçu"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1273
msgid "Switch code to Change extruder"
msgstr "Code de changement pour Changer l'extrudeur"
-#: src/slic3r/GUI/DoubleSlider.cpp:1179
+#: src/slic3r/GUI/DoubleSlider.cpp:1306
msgid "Switch code to Color change (%1%) for:"
msgstr "Code de changement pour Changer de couleur (%1%) pour :"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:140
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:136
msgid "Switch to 3D"
msgstr "Basculer vers la 3D"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1376
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223
msgid "Switch to editing mode"
msgstr "Basculer vers le mode édition"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:141
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:137
msgid "Switch to Preview"
msgstr "Basculer vers la Prévisualisation"
-#: src/slic3r/GUI/wxExtensions.cpp:703
-#, c-format
+#: src/slic3r/GUI/GLCanvas3D.cpp:4302 src/slic3r/GUI/GLCanvas3D.cpp:4939
+msgid "Switch to Settings"
+msgstr "Basculer dans le Réglages"
+
+#: src/slic3r/GUI/wxExtensions.cpp:623
+#, possible-c-format
msgid "Switch to the %s mode"
msgstr "Basculer vers le mode %s"
-#: src/slic3r/GUI/GUI_App.cpp:882
-msgid ""
-"Switching the language will trigger application restart.\n"
-"You will lose content of the plater."
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:542
+msgid "Switching Presets: Unsaved Changes"
+msgstr "Changement de préréglages : modifications non enregistrées"
+
+#: src/slic3r/GUI/GUI_App.cpp:1608
+msgid "Switching the language will trigger application restart.\nYou will lose content of the plater."
msgstr "Le changement de langue déclenchera le redémarrage de l’application. L'objet et tous les paramètres non enregistrés seront perdus."
#: src/slic3r/GUI/WipeTowerDialog.cpp:365
-msgid ""
-"Switching to simple settings will discard changes done in the advanced mode!\n"
-"\n"
-"Do you want to proceed?"
-msgstr ""
-"Basculer vers les réglages simples annulera les changements effectués en mode avancé !\n"
-"\n"
-"Voulez-vous continuer ?"
+msgid "Switching to simple settings will discard changes done in the advanced mode!\n\nDo you want to proceed?"
+msgstr "Basculer vers les réglages simples annulera les changements effectués en mode avancé !\n\nVoulez-vous continuer ?"
-#: src/slic3r/GUI/Tab.cpp:1014
+#: src/slic3r/GUI/Tab.cpp:1332
msgid "symbolic profile name"
msgstr "nom de profil symbolique"
-#: src/libslic3r/PrintConfig.cpp:2036
+#: src/libslic3r/PrintConfig.cpp:2178
msgid "Synchronize support layers with the object print layers. This is useful with multi-material printers, where the extruder switch is expensive."
msgstr "Synchroniser les couches du support avec les couches d'impression de l'objet. Cela est utile pour les imprimantes multi-matériaux, pour lesquelles le changement d'extrudeur est onéreux."
-#: src/libslic3r/PrintConfig.cpp:2034
+#: src/libslic3r/PrintConfig.cpp:2176
msgid "Synchronize with object layers"
msgstr "Synchroniser avec les couches de l'objet"
-#: src/slic3r/GUI/MainFrame.cpp:699
+#: src/slic3r/GUI/MainFrame.cpp:924 src/slic3r/GUI/MainFrame.cpp:1323
msgid "System &Info"
msgstr "&Informations sur le Système"
-#: src/slic3r/GUI/SysInfoDialog.cpp:78
+#: src/slic3r/GUI/SysInfoDialog.cpp:90 src/slic3r/GUI/SysInfoDialog.cpp:92
msgid "System Information"
msgstr "Informations sur le Système"
-#: src/slic3r/GUI/Preset.cpp:1109 src/slic3r/GUI/Preset.cpp:1164
-#: src/slic3r/GUI/Preset.cpp:1242 src/slic3r/GUI/Preset.cpp:1284
-#: src/slic3r/GUI/PresetBundle.cpp:1583 src/slic3r/GUI/PresetBundle.cpp:1672
+#: src/slic3r/GUI/PresetComboBoxes.cpp:188
+#: src/slic3r/GUI/PresetComboBoxes.cpp:226
+#: src/slic3r/GUI/PresetComboBoxes.cpp:724
+#: src/slic3r/GUI/PresetComboBoxes.cpp:774
+#: src/slic3r/GUI/PresetComboBoxes.cpp:886
+#: src/slic3r/GUI/PresetComboBoxes.cpp:930
msgid "System presets"
msgstr "Préréglages système"
-#: src/slic3r/GUI/GUI_App.cpp:801
+#: src/slic3r/GUI/GUI_App.cpp:1481
msgid "Take Configuration &Snapshot"
msgstr "Capturer un in&stantané de la configuration"
-#: src/slic3r/GUI/GUI_App.cpp:839
+#: src/slic3r/GUI/GUI_App.cpp:1540
msgid "Taking configuration snapshot"
msgstr "Instantané de la configuration en cours"
-#: src/slic3r/GUI/Tab.cpp:1433 src/libslic3r/PrintConfig.cpp:2067
+#: src/slic3r/GUI/Tab.cpp:1779
msgid "Temperature"
msgstr "Température"
-#: src/libslic3r/PrintConfig.cpp:1804
+#: src/libslic3r/PrintConfig.cpp:1919
msgid "Temperature difference to be applied when an extruder is not active. Enables a full-height \"sacrificial\" skirt on which the nozzles are periodically wiped."
msgstr "Différence de température devant être appliquée quand un extrudeur n'est pas actif. Permet la génération d'un contour complet \"sacrificiel\" sur lequel les buses sont nettoyées régulièrement."
-#: src/libslic3r/PrintConfig.cpp:1803
+#: src/libslic3r/PrintConfig.cpp:1918
msgid "Temperature variation"
msgstr "Variation de température"
-#: src/slic3r/GUI/ConfigWizard.cpp:1017
+#: src/slic3r/GUI/ConfigWizard.cpp:1383
msgid "Temperatures"
msgstr "Températures"
-#: src/slic3r/GUI/Tab.cpp:1677 src/slic3r/GUI/Tab.cpp:1915
+#: src/slic3r/GUI/Tab.cpp:2215
+msgid "Template Custom G-code"
+msgstr "G-code de modèle personnalisé"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:284
msgid "Test"
msgstr "Test"
-#: src/slic3r/GUI/BedShapeDialog.cpp:172
+#: src/slic3r/GUI/BedShapeDialog.cpp:315
msgid "Texture"
msgstr "Texture"
-#: src/slic3r/GUI/ConfigManipulation.cpp:208
+#: src/slic3r/GUI/ConfigManipulation.cpp:207
msgid "The %1% infill pattern is not supposed to work at 100%% density."
msgstr "Le modèle de remplissage %1% n'est pas censé fonctionner avec une densité de 100%%."
#: src/slic3r/GUI/FirmwareDialog.cpp:548
-#, c-format
+#, possible-c-format
msgid "The %s device could not have been found"
msgstr "L'équipement %s n'a pas pu être trouvé"
#: src/slic3r/GUI/FirmwareDialog.cpp:436
-#, c-format
-msgid ""
-"The %s device was not found.\n"
-"If the device is connected, please press the Reset button next to the USB connector ..."
-msgstr ""
-"L'équipement %s n'a pas été trouvé.\n"
-"Si l'équipement est connecté, veuillez appuyer sur le bouton Reset à côté du connecteur USB ..."
+#, possible-c-format
+msgid "The %s device was not found.\nIf the device is connected, please press the Reset button next to the USB connector ..."
+msgstr "L'équipement %s n'a pas été trouvé.\nSi l'équipement est connecté, veuillez appuyer sur le bouton Reset à côté du connecteur USB ..."
-#: src/slic3r/GUI/Tab.cpp:976
+#: src/slic3r/GUI/Tab.cpp:1238
msgid "The current custom preset will be detached from the parent system preset."
msgstr "Le préréglage personnalisé actuel sera détaché du préréglage système parent."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875
-msgid ""
-"The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n"
-"Non-uniform scaling of tilted objects is only possible in the World coordinate system,\n"
-"once the rotation is embedded into the object coordinates."
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:925
+msgid "The currently manipulated object is tilted (rotation angles are not multiples of 90°).\nNon-uniform scaling of tilted objects is only possible in the World coordinate system,\nonce the rotation is embedded into the object coordinates."
msgstr "L'objet actuel est incliné (les angles de rotation ne sont pas des multiples de 90 °). La mise à l'échelle non uniforme des objets inclinés est possible dans le système de coordonnées seulement quand la rotation est incorporée aux coordonnées de l'objet."
-#: src/libslic3r/PrintConfig.cpp:2726
+#: src/libslic3r/PrintConfig.cpp:2890
msgid "The default angle for connecting support sticks and junctions."
msgstr "L'angle par défaut pour connecter les tiges de support et les jonctions."
-#: src/libslic3r/SLAPrint.cpp:631
+#: src/libslic3r/SLAPrint.cpp:645
msgid "The endings of the support pillars will be deployed on the gap between the object and the pad. 'Support base safety distance' has to be greater than the 'Pad object gap' parameter to avoid this."
msgstr "Les extrémités des piliers de support seront déployées dans l'espace entre l'objet et le socle. La 'Distance de sécurité de base du support' doit être plus grande que le paramètre 'Espace de l'objet socle' pour éviter cela."
-#: src/libslic3r/PrintConfig.cpp:489
+#: src/libslic3r/PrintConfig.cpp:525
msgid "The extruder to use (unless more specific extruder settings are specified). This value overrides perimeter and infill extruders, but not the support extruders."
msgstr "L'extrudeur à utiliser (à moins que d'autres réglages d'extrudeur plus spécifiques soient spécifiés). Cette valeur se substitue aux extrudeurs de périmètre et de remplissage, mais pas aux extrudeurs de support."
-#: src/libslic3r/PrintConfig.cpp:1003
+#: src/libslic3r/PrintConfig.cpp:1047
msgid "The extruder to use when printing infill."
msgstr "L'extrudeur à utiliser pour imprimer le remplissage."
-#: src/libslic3r/PrintConfig.cpp:1410
+#: src/libslic3r/PrintConfig.cpp:1518
msgid "The extruder to use when printing perimeters and brim. First extruder is 1."
msgstr "L'extrudeur à utiliser pour imprimer les périmètres et la bordure. Le premier extrudeur a le numéro 1."
-#: src/libslic3r/PrintConfig.cpp:1738
+#: src/libslic3r/PrintConfig.cpp:1853
msgid "The extruder to use when printing solid infill."
msgstr "L'extrudeur à utiliser pour imprimer les remplissages solides."
-#: src/libslic3r/PrintConfig.cpp:1966
+#: src/libslic3r/PrintConfig.cpp:2108
msgid "The extruder to use when printing support material interface (1+, 0 to use the current extruder to minimize tool changes). This affects raft too."
msgstr "L'extrudeur à utiliser pour imprimer les intercalaires du support (1+,0 pour utiliser l'extrudeur actuel et limiter les changements d'outil). Cela affecte également le raft."
-#: src/libslic3r/PrintConfig.cpp:1939
+#: src/libslic3r/PrintConfig.cpp:2081
msgid "The extruder to use when printing support material, raft and skirt (1+, 0 to use the current extruder to minimize tool changes)."
msgstr "L'extrudeur à utiliser pour imprimer des supports, du raft ou des contours (1+,0 pour utiliser l'extrudeur actuel et limiter les changements d'outil)."
-#: src/libslic3r/PrintConfig.cpp:727
+#: src/libslic3r/PrintConfig.cpp:763
msgid "The filament material type for use in custom G-codes."
msgstr "Le type de matériau de filament à utiliser dans les G-codes personnalisés."
-#: src/libslic3r/PrintConfig.cpp:3494
+#: src/libslic3r/PrintConfig.cpp:3693
msgid "The file where the output will be written (if not specified, it will be based on the input file)."
msgstr "Le fichier dans lequel la sortie sera écrite (si rien n'est spécifié, il sera basé sur le fichier d'entrée)"
-#: src/libslic3r/PrintConfig.cpp:1102
+#: src/libslic3r/PrintConfig.cpp:1195
msgid "The firmware supports stealth mode"
msgstr "Le firmware est compatible avec le mode silencieux"
-#: src/libslic3r/PrintConfig.cpp:120
+#: src/libslic3r/PrintConfig.cpp:122
msgid "The first layer will be shrunk in the XY plane by the configured value to compensate for the 1st layer squish aka an Elephant Foot effect."
msgstr "La première couche sera réduite sur le plan XY selon la valeur configurée afin de compenser l'écrasement de la première couche également connu sous le nom d'effet Pied d'Éléphant."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3820
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3927 src/slic3r/GUI/Tab.cpp:3457
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4283
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4410
+#: src/slic3r/GUI/SavePresetDialog.cpp:117
msgid "the following characters are not allowed:"
msgstr "les caractères suivant ne sont pas autorisés :"
-#: src/slic3r/GUI/ConfigWizard.cpp:1830
+#: src/slic3r/GUI/ConfigWizard.cpp:2257
msgid "The following FFF printer models have no filament selected:"
msgstr "Les modèles d'imprimantes FFF suivants n'ont aucun filament sélectionné :"
-#: src/slic3r/GUI/ConfigWizard.cpp:1848
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1004
+msgid "The following presets were modified:"
+msgstr "Les préréglages suivants ont été modifiés :"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:253
+msgid "The following shortcuts are applicable in G-code preview when the horizontal slider is active"
+msgstr "Les raccourcis suivants s'appliquent dans la prévisualisation G-code lorsque la barre de défilement horizontale est active"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:237
+msgid "The following shortcuts are applicable in G-code preview when the vertical slider is active"
+msgstr "Les raccourcis suivants s'appliquent dans la prévisualisation G-code lorsque la barre de défilement verticale est active"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+msgid "The following shortcuts are applicable when the specified gizmo is active"
+msgstr "Les raccourcis suivants s'appliquent lorsque le gizmo spécifié est actif"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2275
msgid "The following SLA printer models have no materials selected:"
msgstr "Les modèles d'imprimantes SLA suivants n'ont aucun matériau sélectionné :"
-#: src/slic3r/GUI/Tab.cpp:3461
+#: src/slic3r/GUI/SavePresetDialog.cpp:125
msgid "the following suffix is not allowed:"
msgstr "le suffixe suivant n'est pas autorisé :"
-#: src/libslic3r/PrintConfig.cpp:2871
+#: src/libslic3r/PrintConfig.cpp:3035
msgid "The gap between the object bottom and the generated pad in zero elevation mode."
msgstr "Espace entre le bas de l'objet et le socle généré en mode élévation zéro."
-#: src/libslic3r/PrintConfig.cpp:2704
+#: src/libslic3r/PrintConfig.cpp:2868
msgid "The height of the pillar base cone"
msgstr "La hauteur du cône de la base du pilier"
-#: src/slic3r/GUI/DoubleSlider.cpp:1922
+#: src/slic3r/GUI/DoubleSlider.cpp:2140
msgid "The last color change data was saved for a multi extruder printing with tool changes for whole print."
msgstr "Les dernières données de changement de couleur ont été enregistrées pour une impression multi-extrudeur avec des changements d'outils pour l'impression entière."
-#: src/slic3r/GUI/DoubleSlider.cpp:1900 src/slic3r/GUI/DoubleSlider.cpp:1916
+#: src/slic3r/GUI/DoubleSlider.cpp:2119 src/slic3r/GUI/DoubleSlider.cpp:2134
msgid "The last color change data was saved for a multi extruder printing."
msgstr "Les dernières données de changement de couleur ont été enregistrées pour une impression multi-extrudeur."
-#: src/slic3r/GUI/DoubleSlider.cpp:1899
+#: src/slic3r/GUI/DoubleSlider.cpp:2118
msgid "The last color change data was saved for a single extruder printing."
msgstr "Les dernières données de changement de couleur ont été sauvegardées une vue d'une impression avec extrudeur simple."
-#: src/libslic3r/PrintConfig.cpp:2745
+#: src/libslic3r/PrintConfig.cpp:2909
msgid "The max distance of two pillars to get linked with each other. A zero value will prohibit pillar cascading."
msgstr "La distance maximum entre deux piliers pour qu'ils soient reliés. Une valeur de zéro empêchera les piliers en cascade."
-#: src/libslic3r/PrintConfig.cpp:2736
+#: src/libslic3r/PrintConfig.cpp:2900
msgid "The max length of a bridge"
msgstr "La longueur maximum d'un pont"
-#: src/libslic3r/PrintConfig.cpp:2714
+#: src/libslic3r/PrintConfig.cpp:190
+msgid "The maximum detour length for avoid crossing perimeters. If the detour is longer than this value, avoid crossing perimeters is not applied for this travel path. Detour length could be specified either as an absolute value or as percentage (for example 50%) of a direct travel path."
+msgstr "La longueur de détour maximum pour éviter de croiser les périmètres. Si le détour est plus long que cette valeur, l'option éviter les périmètres croisés ne s'applique pas pour ce chemin de déplacement. La longueur de détour peut être spécifiée soit comme une valeur absolue soit comme le pourcentage (par exemple 50%) d'un chemin de déplacement direct."
+
+#: src/libslic3r/PrintConfig.cpp:2878
msgid "The minimum distance of the pillar base from the model in mm. Makes sense in zero elevation mode where a gap according to this parameter is inserted between the model and the pad."
msgstr "Distance minimum entre la base du pilier et le modèle en mm. Utile en mode élévation zéro où un espace correspondant à ce paramètre est inséré entre le modèle et le socle."
-#: src/libslic3r/PrintConfig.cpp:185
+#: src/slic3r/GUI/SavePresetDialog.cpp:142
+msgid "The name cannot be empty."
+msgstr "Le nom ne peut pas être vide."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:152
+msgid "The name cannot end with space character."
+msgstr "Le nom ne peut pas se terminer par le caractère espace."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:147
+msgid "The name cannot start with space character."
+msgstr "Le nom ne peut pas commencer par un caractère espace."
+
+#: src/libslic3r/PrintConfig.cpp:219
msgid "The number of bottom solid layers is increased above bottom_solid_layers if necessary to satisfy minimum thickness of bottom shell."
msgstr "Le nombre de couches solides inférieures est augmenté au-dessus de bottom_solid_layers si nécessaire pour satisfaire l'épaisseur minimale de la coque inférieure."
-#: src/libslic3r/PrintConfig.cpp:2143
+#: src/libslic3r/PrintConfig.cpp:2286
msgid "The number of top solid layers is increased above top_solid_layers if necessary to satisfy minimum thickness of top shell. This is useful to prevent pillowing effect when printing with variable layer height."
msgstr "Le nombre de couches solides supérieures est augmenté au-dessus de top_solid_layers si nécessaire pour satisfaire l'épaisseur minimale de la coque supérieure. Ceci est utile pour éviter l'effet de capitonnage lors de l'impression avec une hauteur de couche variable."
-#: src/libslic3r/PrintConfig.cpp:2277
+#: src/slic3r/GUI/Plater.cpp:2326
+msgid "The object appears to be saved in inches"
+msgstr "L'objet semble être enregistré en pouces"
+
+#: src/libslic3r/PrintConfig.cpp:2420
msgid "The object will be grown/shrunk in the XY plane by the configured value (negative = inwards, positive = outwards). This might be useful for fine-tuning hole sizes."
msgstr "L'objet sera agrandi/réduit sur les plans XY selon la valeur indiquée (négatif = réduit, positif = agrandi). Ce réglage peut être utile pour un réglage fin des tailles de trous."
-#: src/libslic3r/PrintConfig.cpp:1503
+#: src/libslic3r/PrintConfig.cpp:1611
msgid "The object will be raised by this number of layers, and support material will be generated under it."
msgstr "L'objet sera surélevé de ce nombre de couches, et du support sera généré en dessous."
-#: src/libslic3r/PrintConfig.cpp:2424
-msgid ""
-"The percentage of the bed area. \n"
-"If the print area exceeds the specified value, \n"
-"then a slow tilt will be used, otherwise - a fast tilt"
-msgstr ""
-"Pourcentage de la zone du lit.\n"
-"Si la zone d'impression excède la valeur spécifiée,\n"
-"alors une inclinaison lente sera appliquée, sinon - une inclinaison rapide"
+#: src/libslic3r/PrintConfig.cpp:2803
+msgid "The percentage of smaller pillars compared to the normal pillar diameter which are used in problematic areas where a normal pilla cannot fit."
+msgstr "Le pourcentage de piliers plus petits par rapport au diamètre de pilier normal qui sont utilisés dans les zones problématiques où un pilier normal ne peut pas rentrer."
-#: src/slic3r/GUI/GUI_App.cpp:932
-msgid "The presets on the following tabs were modified"
-msgstr "Les préréglages des onglets suivants ont été modifiés"
+#: src/libslic3r/PrintConfig.cpp:2567
+msgid "The percentage of the bed area. \nIf the print area exceeds the specified value, \nthen a slow tilt will be used, otherwise - a fast tilt"
+msgstr "Pourcentage de la zone du lit.\nSi la zone d'impression excède la valeur spécifiée,\nalors une inclinaison lente sera appliquée, sinon - une inclinaison rapide"
-#: src/libslic3r/PrintConfig.cpp:1846
+#: src/slic3r/GUI/Tab.cpp:3430
+msgid "The physical printer(s) below is based on the preset, you are going to delete."
+msgstr "La/les imprimante(s) physique(s) ci-dessous sont basées sur le préréglage que vous allez supprimer."
+
+#: src/slic3r/GUI/Tab.cpp:3438
+msgid "The physical printer(s) below is based only on the preset, you are going to delete."
+msgstr "Les imprimantes physiques ci-dessous sont basées uniquement sur le préréglage que vous allez supprimer."
+
+#: src/slic3r/GUI/GUI_App.cpp:1676
+msgid "The preset(s) modifications are successfully saved"
+msgstr "Les modifications des préréglages sont enregistrées avec succès"
+
+#: src/libslic3r/PrintConfig.cpp:1988
msgid "The printer multiplexes filaments into a single hot end."
msgstr "L'imprimante multiplexe les filaments vers une seule tête d'extrusion."
-#: src/libslic3r/Format/3mf.cpp:1630
+#: src/libslic3r/Format/3mf.cpp:1667
msgid "The selected 3mf file has been saved with a newer version of %1% and is not compatible."
msgstr "Le fichier 3mf sélectionné a été enregistré avec une version plus récente de %1% et n'est pas compatible."
-#: src/libslic3r/Format/AMF.cpp:934
+#: src/libslic3r/Format/AMF.cpp:955
msgid "The selected amf file has been saved with a newer version of %1% and is not compatible."
msgstr "Le fichier amf sélectionné a été enregistré avec une version plus récente de %1% et n'est pas compatible."
-#: src/slic3r/GUI/BedShapeDialog.cpp:513
+#: src/slic3r/GUI/Plater.cpp:4751
+msgid "The selected file"
+msgstr "Le fichier sélectionné"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:589
msgid "The selected file contains no geometry."
msgstr "Le fichier sélectionné ne contient aucune géométrie."
-#: src/slic3r/GUI/BedShapeDialog.cpp:517
+#: src/slic3r/GUI/BedShapeDialog.cpp:593
msgid "The selected file contains several disjoint areas. This is not supported."
msgstr "Le fichier sélectionné contient plusieurs zones disjointes. Cela n'est pas utilisable."
-#: src/slic3r/GUI/Plater.cpp:2970
+#: src/slic3r/GUI/Plater.cpp:2763
msgid "The selected object can't be split because it contains more than one volume/material."
msgstr "L'objet sélectionné ne peut être scindé car il contient plus d'un volume/matériau."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2270 src/slic3r/GUI/Plater.cpp:2978
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2436 src/slic3r/GUI/Plater.cpp:2771
msgid "The selected object couldn't be split because it contains only one part."
msgstr "L'objet sélectionné n'a pu être scindé car il ne contient qu'une seule pièce."
-#: src/slic3r/GUI/MainFrame.cpp:461
-msgid ""
-"The selected project is no longer available.\n"
-"Do you want to remove it from the recent projects list?"
-msgstr ""
-"Le projet sélectionné n'est plus disponible.\n"
-"Voulez-vous le retirer de la liste des projets récents?"
+#: src/slic3r/GUI/MainFrame.cpp:1003
+msgid "The selected project is no longer available.\nDo you want to remove it from the recent projects list?"
+msgstr "Le projet sélectionné n'est plus disponible.\nVoulez-vous le retirer de la liste des projets récents?"
-#: src/slic3r/GUI/DoubleSlider.cpp:998
-msgid ""
-"The sequential print is on.\n"
-"It's impossible to apply any custom G-code for objects printing sequentually.\n"
-"This code won't be processed during G-code generation."
-msgstr ""
-"L'impression séquentielle est activée.\n"
-"Il est impossible d'appliquer un G-code personnalisé pour des objets en impression séquentielle.\n"
-"Ce code ne sera pas traité au cours de la génération du G-code."
+#: src/slic3r/GUI/DoubleSlider.cpp:1121
+msgid "The sequential print is on.\nIt's impossible to apply any custom G-code for objects printing sequentually.\nThis code won't be processed during G-code generation."
+msgstr "L'impression séquentielle est activée.\nIl est impossible d'appliquer un G-code personnalisé pour des objets en impression séquentielle.\nCe code ne sera pas traité au cours de la génération du G-code."
-#: src/libslic3r/PrintConfig.cpp:2846
+#: src/slic3r/GUI/ConfigWizard.cpp:1187
+msgid "The size of the object can be specified in inches"
+msgstr "La taille de l'objet peut être spécifiée en pouces"
+
+#: src/libslic3r/PrintConfig.cpp:3010
msgid "The slope of the pad wall relative to the bed plane. 90 degrees means straight walls."
msgstr "La pente de la paroi du socle par rapport au plan du lit. 90 degrés donne des murs droits."
-#: src/libslic3r/PrintConfig.cpp:1614
+#: src/libslic3r/PrintConfig.cpp:1722
msgid "The speed for loading of a filament into extruder after retraction (it only applies to the extruder motor). If left to zero, the retraction speed is used."
msgstr "La vitesse de chargement d'un filament dans l'extrudeur après une rétractation (ne s'applique qu'au moteur de l'extrudeur). Si cette valeur reste sur zéro, la vitesse de rétraction est utilisée."
-#: src/libslic3r/PrintConfig.cpp:1606
+#: src/libslic3r/PrintConfig.cpp:1714
msgid "The speed for retractions (it only applies to the extruder motor)."
msgstr "La vitesse des rétractations (ne s'applique qu'au moteur de l'extrudeur)."
-#: src/slic3r/GUI/ConfigManipulation.cpp:81
-#, no-c-format
-msgid ""
-"The Spiral Vase mode requires:\n"
-"- one perimeter\n"
-"- no top solid layers\n"
-"- 0% fill density\n"
-"- no support material\n"
-"- Ensure vertical shell thickness enabled\n"
-"- Detect thin walls disabled"
-msgstr ""
-"Les prérequis du mode Vase Spiral sont :\n"
-"-Un seul périmètre\n"
-"-Aucunes couches solides supérieures\n"
-"-Une densité de remplissage de 0%\n"
-"-Pas de support\n"
-"-Vérifier que l'épaisseur de coque verticale est activée\n"
-"-La détection de parois fines doit être désactivée"
-
-#: src/libslic3r/Print.cpp:1237
-msgid "The Spiral Vase option can only be used when printing a single object."
-msgstr "L'option Vase Spirale ne peut être utilisé que lors de l'impression d'un seul objet."
-
-#: src/libslic3r/Print.cpp:1244
+#: src/slic3r/GUI/ConfigManipulation.cpp:80
+#, possible-c-format
+msgid "The Spiral Vase mode requires:\n- one perimeter\n- no top solid layers\n- 0% fill density\n- no support material\n- Ensure vertical shell thickness enabled\n- Detect thin walls disabled"
+msgstr "Les prérequis du mode Vase Spiral sont :\n-Un seul périmètre\n-Aucunes couches solides supérieures\n-Une densité de remplissage de 0%\n-Pas de support\n-Vérifier que l'épaisseur de coque verticale est activée\n-La détection de parois fines doit être désactivée"
+
+#: src/libslic3r/Print.cpp:1270
msgid "The Spiral Vase option can only be used when printing single material objects."
msgstr "L'option Vase Spirale ne peut être utilisé que lors de l'impression d'objets mono-matériau."
-#: src/slic3r/GUI/Tab.cpp:3068
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:464
msgid "The supplied name is empty. It can't be saved."
msgstr "Le nom proposé est vide. Sauvegarde impossible."
-#: src/slic3r/GUI/Tab.cpp:3465
+#: src/slic3r/GUI/SavePresetDialog.cpp:131
msgid "The supplied name is not available."
msgstr "Le nom proposé n'est pas disponible."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3819
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3926 src/slic3r/GUI/Tab.cpp:3456
-#: src/slic3r/GUI/Tab.cpp:3460
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4282
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4409
+#: src/slic3r/GUI/SavePresetDialog.cpp:116
+#: src/slic3r/GUI/SavePresetDialog.cpp:124
msgid "The supplied name is not valid;"
msgstr "Le nom fourni n'est pas valide ;"
-#: src/libslic3r/Print.cpp:1222
+#: src/libslic3r/Print.cpp:1248
msgid "The supplied settings will cause an empty print."
msgstr "Les réglages fournis vont entraîner une impression vide."
-#: src/libslic3r/PrintConfig.cpp:2789
+#: src/libslic3r/PrintConfig.cpp:2953
msgid "The thickness of the pad and its optional cavity walls."
msgstr "L'épaisseur du socle et de ses parois de cavité optionnelles."
-#: src/libslic3r/PrintConfig.cpp:1911
+#: src/slic3r/GUI/GUI_App.cpp:1781
+msgid "The uploads are still ongoing"
+msgstr "Les téléchargements sont toujours en cours"
+
+#: src/libslic3r/PrintConfig.cpp:2053
msgid "The vertical distance between object and support material interface. Setting this to 0 will also prevent Slic3r from using bridge flow and speed for the first object layer."
msgstr "Distance verticale entre l'objet et l'intercalaire du support. Régler cette valeur sur zéro empêchera Slic3r d'utiliser la vitesse et le débit des ponts pour la première couche de l'objet."
-#: src/slic3r/GUI/Tab.cpp:2575
-msgid ""
-"The Wipe option is not available when using the Firmware Retraction mode.\n"
-"\n"
-"Shall I disable it in order to enable Firmware Retraction?"
-msgstr ""
-"L'option Nettoyage n'est pas disponible lorsque vous utilisez le mode Rétractation du Firmware.\n"
-"\n"
-"Voulez-vous que je la désactive pour permettre la Rétractation du Firmware ?"
+#: src/slic3r/GUI/Tab.cpp:2731
+msgid "The Wipe option is not available when using the Firmware Retraction mode.\n\nShall I disable it in order to enable Firmware Retraction?"
+msgstr "L'option Nettoyage n'est pas disponible lorsque vous utilisez le mode Rétractation du Firmware.\n\nVoulez-vous que je la désactive pour permettre la Rétractation du Firmware ?"
-#: src/libslic3r/Print.cpp:1268
+#: src/libslic3r/Print.cpp:1294
msgid "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)."
msgstr "À l'heure actuelle, la Tour de Nettoyage ne prend pas en charge l'E volumétrique (use_volumetric_e-0)."
-#: src/slic3r/GUI/ConfigManipulation.cpp:115
-msgid ""
-"The Wipe Tower currently supports the non-soluble supports only\n"
-"if they are printed with the current extruder without triggering a tool change.\n"
-"(both support_material_extruder and support_material_interface_extruder need to be set to 0)."
-msgstr ""
-"La tour de nettoyage prend actuellement en charge les supports non solubles seulement\n"
-"si ils sont imprimés avec l'extrudeur actuel sans déclencher un changement d'outil.\n"
-"(support_material_extruder et support_material_interface_extruder doivent être réglés sur 0)."
+#: src/slic3r/GUI/ConfigManipulation.cpp:114
+msgid "The Wipe Tower currently supports the non-soluble supports only\nif they are printed with the current extruder without triggering a tool change.\n(both support_material_extruder and support_material_interface_extruder need to be set to 0)."
+msgstr "La tour de nettoyage prend actuellement en charge les supports non solubles seulement\nsi ils sont imprimés avec l'extrudeur actuel sans déclencher un changement d'outil.\n(support_material_extruder et support_material_interface_extruder doivent être réglés sur 0)."
-#: src/libslic3r/Print.cpp:1400
+#: src/libslic3r/Print.cpp:1426
msgid "The Wipe Tower currently supports the non-soluble supports only if they are printed with the current extruder without triggering a tool change. (both support_material_extruder and support_material_interface_extruder need to be set to 0)."
msgstr "A l'heure actuelle la Tour de Nettoyage ne tolère les supports non-solubles que s'ils sont imprimés avec l'extrudeur en cours d'utilisation sans déclencher un changement d'outil. (support_material_extruder de même que support_material_interface_extruder doivent être réglés sur 0)."
-#: src/libslic3r/Print.cpp:1270
+#: src/libslic3r/Print.cpp:1296
msgid "The Wipe Tower is currently not supported for multimaterial sequential prints."
msgstr "La tour de nettoyage n'est actuellement pas prise en charge pour les impressions séquentielles multimatériaux."
-#: src/libslic3r/Print.cpp:1262
-msgid "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter and Repetier G-code flavors."
-msgstr "La tour de nettoyage est actuellement supportée uniquement pour les versions de G-Code de Marlin, RepRap/Sprinter et Repetier."
+#: src/libslic3r/Print.cpp:1290
+msgid "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, RepRapFirmware and Repetier G-code flavors."
+msgstr "La tour de nettoyage n'est actuellement prise en charge que pour les versions du G-code Marlin, RepRap / Sprinter, RepRapFirmware et Repetier."
-#: src/libslic3r/Print.cpp:1264
+#: src/libslic3r/Print.cpp:1290
msgid "The Wipe Tower is currently only supported with the relative extruder addressing (use_relative_e_distances=1)."
msgstr "La tour de nettoyage est actuellement supportée uniquement avec l'adressage relatif de l'extrudeur (use_relative_e_distances=1)."
-#: src/libslic3r/Print.cpp:1293
+#: src/libslic3r/Print.cpp:1319
msgid "The Wipe Tower is only supported for multiple objects if they are printed over an equal number of raft layers"
msgstr "La tour de nettoyage est uniquement supportées pour plusieurs objets s'ils sont imprimés avec un nombre égal de couche de radeau"
-#: src/libslic3r/Print.cpp:1295
+#: src/libslic3r/Print.cpp:1321
msgid "The Wipe Tower is only supported for multiple objects if they are printed with the same support_material_contact_distance"
msgstr "La tour de nettoyage est uniquement supportée pour plusieurs objets s'ils sont imprimés avec la même support_material_contact_distance"
-#: src/libslic3r/Print.cpp:1297
+#: src/libslic3r/Print.cpp:1323
msgid "The Wipe Tower is only supported for multiple objects if they are sliced equally."
msgstr "La tour de nettoyage est uniquement supportée pour plusieurs objets s'ils découpés de la même façon."
-#: src/libslic3r/Print.cpp:1291
+#: src/libslic3r/Print.cpp:1317
msgid "The Wipe Tower is only supported for multiple objects if they have equal layer heights"
msgstr "La tour de nettoyage est uniquement supportée pour plusieurs objets s'ils ont une même hauteur de couche"
-#: src/libslic3r/Print.cpp:1257
+#: src/libslic3r/Print.cpp:1283
msgid "The wipe tower is only supported if all extruders have the same nozzle diameter and use filaments of the same diameter."
msgstr "La tour de nettoyage n'est supportée que si tous les extrudeurs ont le même diamètre de buse et utilisent un filament de même diamètre."
-#: src/libslic3r/Print.cpp:1339
+#: src/libslic3r/Print.cpp:1365
msgid "The Wipe tower is only supported if all objects have the same variable layer height"
msgstr "La tour de Nettoyage n'est prise en charge que si tous les objets ont la même hauteur de couche variable"
-#: src/libslic3r/SLAPrintSteps.cpp:621
+#: src/slic3r/GUI/Plater.cpp:3563
+msgid "There are active warnings concerning sliced models:"
+msgstr "Il existe des avertissements actifs concernant les modèles découpés :"
+
+#: src/libslic3r/SLAPrintSteps.cpp:619
msgid "There are unprintable objects. Try to adjust support settings to make the objects printable."
msgstr "Il y a des objets non imprimables. Essayez d'ajuster les paramètres de support pour rendre les objets imprimables."
-#: src/slic3r/GUI/DoubleSlider.cpp:1030
-msgid ""
-"There is a color change for extruder that has not been used before.\n"
-"Check your settings to avoid redundant color changes."
-msgstr ""
-"Il y a un changement de couleur pour un extrudeur qui n'a pas été utilisé auparavant.\n"
-"Vérifiez vos paramètres pour éviter les changements de couleur redondants."
+#: src/slic3r/GUI/DoubleSlider.cpp:1155
+msgid "There is a color change for extruder that has not been used before.\nCheck your settings to avoid redundant color changes."
+msgstr "Il y a un changement de couleur pour un extrudeur qui n'a pas été utilisé auparavant.\nVérifiez vos paramètres pour éviter les changements de couleur redondants."
-#: src/slic3r/GUI/DoubleSlider.cpp:1024
-msgid ""
-"There is a color change for extruder that won't be used till the end of print job.\n"
-"This code won't be processed during G-code generation."
-msgstr ""
-"Il y a un changement de couleur pour un extrudeur qui ne sera pas utilisé avant la fin du travail d'impression.\n"
-"Ce code ne sera pas traité lors de la génération du G-code."
+#: src/slic3r/GUI/DoubleSlider.cpp:1149
+msgid "There is a color change for extruder that won't be used till the end of print job.\nThis code won't be processed during G-code generation."
+msgstr "Il y a un changement de couleur pour un extrudeur qui ne sera pas utilisé avant la fin du travail d'impression.\nCe code ne sera pas traité lors de la génération du G-code."
-#: src/slic3r/GUI/DoubleSlider.cpp:1027
-msgid ""
-"There is an extruder change set to the same extruder.\n"
-"This code won't be processed during G-code generation."
-msgstr ""
-"Une modification d'extrudeur est défini sur le même extrudeur.\n"
-"Ce code ne sera pas traité lors de la génération du G-code."
+#: src/slic3r/GUI/DoubleSlider.cpp:1152
+msgid "There is an extruder change set to the same extruder.\nThis code won't be processed during G-code generation."
+msgstr "Une modification d'extrudeur est défini sur le même extrudeur.\nCe code ne sera pas traité lors de la génération du G-code."
+
+#: src/libslic3r/GCode.cpp:604
+msgid "There is an object with no extrusions on the first layer."
+msgstr "Il y a un objet sans extrusion sur la première couche."
#: src/slic3r/GUI/UpdateDialogs.cpp:225
-#, c-format
+#, possible-c-format
msgid "This %s version: %s"
msgstr "Version de ce %s : %s"
-#: src/slic3r/GUI/Tab.cpp:982
-msgid ""
-"This action is not revertable.\n"
-"Do you want to proceed?"
-msgstr ""
-"Cette action n'est pas réversible.\n"
-"Voulez-vous continuer ?"
+#: src/slic3r/GUI/Tab.cpp:1244
+msgid "This action is not revertable.\nDo you want to proceed?"
+msgstr "Cette action n'est pas réversible.\nVoulez-vous continuer ?"
-#: src/libslic3r/PrintConfig.cpp:165
+#: src/libslic3r/PrintConfig.cpp:199
msgid "This code is inserted between objects when using sequential printing. By default extruder and bed temperature are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."
msgstr "Ce code est inséré entre des objets lorsque vous utilisez l'impression séquentielle. Par défaut la température de l'extrudeur et du plateau est réinitialisée et utilise la commande sans-attente ; toutefois si des commandes M104, M109, M140 ou M190 sont détectées dans ce code personnalisé, Slic3r n'ajoutera pas de commandes de température. Notez que vous pouvez utiliser des variables génériques pour tous les réglages de Slic3r, donc vous pouvez entrer une commande \"M109S[first_layer_temperature]\" où vous le souhaitez."
-#: src/libslic3r/PrintConfig.cpp:1081
+#: src/libslic3r/PrintConfig.cpp:1174
msgid "This custom code is inserted at every layer change, right after the Z move and before the extruder moves to the first layer point. Note that you can use placeholder variables for all Slic3r settings as well as [layer_num] and [layer_z]."
msgstr "Ce code personnalisé est inséré à chaque changement de couche, juste après le mouvement Z et avant le déplacement de l'extrudeur au point de départ de la couche suivante. Notez que vous pouvez utiliser des variables génériques pour tous les réglages de Slic3r de même que [layer_num] et [layer_z]."
-#: src/libslic3r/PrintConfig.cpp:154
+#: src/libslic3r/PrintConfig.cpp:188
msgid "This custom code is inserted at every layer change, right before the Z move. Note that you can use placeholder variables for all Slic3r settings as well as [layer_num] and [layer_z]."
msgstr "Ce code personnalisé est inséré à chaque changement de couche, juste avant le mouvement en Z. Notez que vous pouvez utiliser des variables génériques pour tous les réglages de Slic3r de même que [layer_num] et [layer_z]."
-#: src/libslic3r/PrintConfig.cpp:2094
+#: src/libslic3r/PrintConfig.cpp:2237
msgid "This custom code is inserted before every toolchange. Placeholder variables for all PrusaSlicer settings as well as {previous_extruder} and {next_extruder} can be used. When a tool-changing command which changes to the correct extruder is included (such as T{next_extruder}), PrusaSlicer will emit no other such command. It is therefore possible to script custom behaviour both before and after the toolchange."
msgstr "Ce code personnalisé est inséré avant chaque changement d'outil. Des variables génériques pour n'importe quels réglages PrusaSlicer ainsi que {previous_extruder} et {next_extruder} peuvent être utilisées. Lorsqu'une commande de changement d'outil qui occasionne un changement concernant le bon extrudeur est incluse (comme T{next_extruder}), PrusaSlicer n'émettra pas d'autres commandes de ce type. Il est donc possible de rédiger le script d'un comportement personnalisé à la fois avant et après le changement d'outil."
-#: src/libslic3r/PrintConfig.cpp:396
+#: src/libslic3r/PrintConfig.cpp:430
msgid "This end procedure is inserted at the end of the output file, before the printer end gcode (and before any toolchange from this filament in case of multimaterial printers). Note that you can use placeholder variables for all PrusaSlicer settings. If you have multiple extruders, the gcode is processed in extruder order."
msgstr "Cette procédure de fin est insérée à la fin d'un fichier de sortie, avant le gcode de fin de l'imprimante (et avant tout changement d'outil de ce filament dans le cas des imprimantes multimatériaux). Notez que vous pouvez utiliser des variables génériques pour tous les réglages PrusaSlicer. Si vous avez des extrudeurs multiples, le gcode est traité dans l'ordre des extrudeurs."
-#: src/libslic3r/PrintConfig.cpp:386
+#: src/libslic3r/PrintConfig.cpp:420
msgid "This end procedure is inserted at the end of the output file. Note that you can use placeholder variables for all PrusaSlicer settings."
msgstr "Cette procédure de fin est insérée à la fin d'un fichier de sortie. Notez que vous pouvez utiliser des variables génériques pour tous les paramètres PrusaSlicer."
-#: src/libslic3r/PrintConfig.cpp:1258 src/libslic3r/PrintConfig.cpp:1269
+#: src/libslic3r/PrintConfig.cpp:1366 src/libslic3r/PrintConfig.cpp:1377
msgid "This experimental setting is used to limit the speed of change in extrusion rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds."
msgstr "Ce réglage expérimental sert à limiter la vitesse de changement dans le flux d'extrusion. Une valeur de 1.8 mm³/s² garantit qu'un changement de flux d'extrusion de 1.8 mm³/s (largeur d'extrusion 0.45mm, hauteur d'extrusion 0.2mm, vitesse d'avance de 20 mm/s) à 5.4 mm³/s (vitesse d'avance de 60 mm/s) prendra au moins 2 secondes."
-#: src/libslic3r/PrintConfig.cpp:1248
+#: src/libslic3r/PrintConfig.cpp:1356
msgid "This experimental setting is used to set the maximum volumetric speed your extruder supports."
msgstr "Ce réglage expérimental est utilisé pour paramétrer la vitesse volumétrique maximum tolérée par votre extrudeur."
-#: src/libslic3r/PrintConfig.cpp:2162
+#: src/libslic3r/PrintConfig.cpp:2305
msgid "This experimental setting uses G10 and G11 commands to have the firmware handle the retraction. This is only supported in recent Marlin."
msgstr "Ce réglage expérimental utilise les commandes G10 et G11 pour laisser le firmware gérer la rétractation. Utilisable seulement par les versions récentes de Marlin."
-#: src/libslic3r/PrintConfig.cpp:2176
+#: src/libslic3r/PrintConfig.cpp:2319
msgid "This experimental setting uses outputs the E values in cubic millimeters instead of linear millimeters. If your firmware doesn't already know filament diameter(s), you can put commands like 'M200 D[filament_diameter_0] T0' in your start G-code in order to turn volumetric mode on and use the filament diameter associated to the filament selected in Slic3r. This is only supported in recent Marlin."
msgstr "Cette fonction expérimentale génère des valeurs de E en millimètres cubiques au lieu de millimètres linéaires. Si votre firmware ne connait pas déjà le diamètre du filament, vous pouvez saisir une commande comme 'M200 D[filament_diameter_0] T0' dans votre G-Code de début pour activer le mode volumétrique, et utiliser le diamètre de filament associé au filament choisi dans Slic3r. Cette fonction n'est utilisable que dans les versions récentes de Marlin."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3972
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4459
msgid "This extruder will be set for selected items"
msgstr "Cet extrudeur sera défini pour les items sélectionnés"
-#: src/libslic3r/PrintConfig.cpp:224
+#: src/libslic3r/PrintConfig.cpp:258
msgid "This factor affects the amount of plastic for bridging. You can decrease it slightly to pull the extrudates and prevent sagging, although default settings are usually good and you should experiment with cooling (use a fan) before tweaking this."
msgstr "Ce facteur affecte la quantité de plastique utilisée pour les ponts. Vous pouvez le diminuer légèrement pour éviter l'affaissement. La valeur par défaut est généralement suffisante et vous devriez expérimenter le refroidissement (utiliser un ventilateur) avant de modifier ceci."
-#: src/libslic3r/PrintConfig.cpp:546
+#: src/libslic3r/PrintConfig.cpp:582
msgid "This factor changes the amount of flow proportionally. You may need to tweak this setting to get nice surface finish and correct single wall widths. Usual values are between 0.9 and 1.1. If you think you need to change this more, check filament diameter and your firmware E steps."
msgstr "Ce facteur modifie proportionnellement le flux d'extrusion. Vous pouvez avoir besoin de modifier ceci afin d'obtenir un rendu de surface net et une largeur correcte pour les murs uniques. Les valeurs habituelles vont de 0.9 à 1.1. Si vous pensez devoir changer davantage cette valeur, vérifiez le diamètre de votre filament et les E Steps dans le firmware."
-#: src/libslic3r/PrintConfig.cpp:214
+#: src/libslic3r/PrintConfig.cpp:248
msgid "This fan speed is enforced during all bridges and overhangs."
msgstr "Cette vitesse de ventilateur sera utilisée pour les ponts et les surplombs."
-#: src/libslic3r/PrintConfig.cpp:992
+#: src/libslic3r/PrintConfig.cpp:1036
msgid "This feature allows to combine infill and speed up your print by extruding thicker infill layers while preserving thin perimeters, thus accuracy."
msgstr "Cette fonction permet de combiner le remplissage afin d'accélérer l'impression en extrudant des couches de remplissage plus épaisses tout en conservant des périmètres fins, avec plus de précision."
-#: src/libslic3r/PrintConfig.cpp:1746
+#: src/libslic3r/PrintConfig.cpp:1861
msgid "This feature allows to force a solid layer every given number of layers. Zero to disable. You can set this to any value (for example 9999); Slic3r will automatically choose the maximum possible number of layers to combine according to nozzle diameter and layer height."
msgstr "Cette fonction permet de forcer l'impression d'une couche solide après le nombre de couches indiqué. Réglez sur zéro pour la désactiver. Vous pouvez indiquer n'importe quelle valeur (par exemple 9999); Slic3r choisira automatiquement le nombre maximum de couches a combiner en fonction du diamètre de la buse et de l'épaisseur des couches."
-#: src/libslic3r/PrintConfig.cpp:1795
-msgid "This feature will raise Z gradually while printing a single-walled object in order to remove any visible seam. This option requires a single perimeter, no infill, no top solid layers and no support material. You can still set any number of bottom solid layers as well as skirt/brim loops. It won't work when printing more than an object."
-msgstr "Cette fonction élèvera le Z graduellement en cas d'impression d'un objet à paroi unique, afin de rendre invisibles les jointures. Cette option nécessite de n'avoir qu'un seul périmètre, de ne pas avoir de remplissage, ni de surface solide supérieure, ni de support. Vous pouvez toujours choisir le nombre de surface solides inférieures de même que les boucles des jupes et des bordures. Cela ne fonctionnera pas si vous imprimez plus d'un objet."
+#: src/libslic3r/PrintConfig.cpp:1995
+msgid "This feature will raise Z gradually while printing a single-walled object in order to remove any visible seam. This option requires a single perimeter, no infill, no top solid layers and no support material. You can still set any number of bottom solid layers as well as skirt/brim loops. It won't work when printing more than one single object."
+msgstr "Cette fonction va élever Z progressivement au cours de l'impression d'un objet à paroi unique afin de supprimer toute jonction visible. Cette option requiert un périmètre unique, aucun remplissage, aucune couche supérieure solide et aucun matériau de support. Vous pouvez toujours paramétrer le nombre de couches inférieures que vous souhaitez de même que des boucles de jupe/bordure. Cela ne fonctionnera pas si vous imprimez plus d'un objet unique."
-#: src/slic3r/GUI/Plater.cpp:2367
+#: src/slic3r/GUI/Plater.cpp:2329
msgid "This file cannot be loaded in a simple mode. Do you want to switch to an advanced mode?"
msgstr "Ce fichier ne peut être chargé en mode simple. Voulez-vous basculer en mode avancé ?"
-#: src/slic3r/GUI/Plater.cpp:2357
-msgid ""
-"This file contains several objects positioned at multiple heights.\n"
-"Instead of considering them as multiple objects, should I consider\n"
-"this file as a single object having multiple parts?"
-msgstr ""
-"Ce fichier contient plusieurs objets positionnés à différentes hauteurs. Au lieu de les considérer comme des objets distincts, voulez-vous que je considère\n"
-"ce fichier comme un seul objet en plusieurs parties?"
+#: src/slic3r/GUI/Plater.cpp:2319
+msgid "This file contains several objects positioned at multiple heights.\nInstead of considering them as multiple objects, should I consider\nthis file as a single object having multiple parts?"
+msgstr "Ce fichier contient plusieurs objets positionnés à différentes hauteurs. Au lieu de les considérer comme des objets distincts, voulez-vous que je considère\nce fichier comme un seul objet en plusieurs parties?"
#: src/slic3r/GUI/FirmwareDialog.cpp:332
-#, c-format
-msgid ""
-"This firmware hex file does not match the printer model.\n"
-"The hex file is intended for: %s\n"
-"Printer reported: %s\n"
-"\n"
-"Do you want to continue and flash this hex file anyway?\n"
-"Please only continue if you are sure this is the right thing to do."
-msgstr ""
-"Le fichier hex de ce firmware ne correspond pas au modèle d'imprimante.\n"
-"Le fichier hex est prévu pour : %s\n"
-"Imprimante détectée : %s\n"
-"\n"
-"Voulez-vous continuer et flasher ce fichier hex quand même ?\n"
-"S'il vous plait, ne continuez que si vous êtes certain de faire le bon choix."
-
-#: src/libslic3r/PrintConfig.cpp:314
+#, possible-c-format
+msgid "This firmware hex file does not match the printer model.\nThe hex file is intended for: %s\nPrinter reported: %s\n\nDo you want to continue and flash this hex file anyway?\nPlease only continue if you are sure this is the right thing to do."
+msgstr "Le fichier hex de ce firmware ne correspond pas au modèle d'imprimante.\nLe fichier hex est prévu pour : %s\nImprimante détectée : %s\n\nVoulez-vous continuer et flasher ce fichier hex quand même ?\nS'il vous plait, ne continuez que si vous êtes certain de faire le bon choix."
+
+#: src/libslic3r/PrintConfig.cpp:348
msgid "This flag enables the automatic cooling logic that adjusts print speed and fan speed according to layer printing time."
msgstr "Cette option active la logique de refroidissement automatique, qui ajuste la vitesse d'impression et celle du ventilateur en fonction du temps d'impression de la couche."
-#: src/slic3r/GUI/Plater.cpp:536
+#: src/slic3r/GUI/Plater.cpp:402
msgid "This flag enables the brim that will be printed around each object on the first layer."
msgstr "Cette option permet l'impression de la bordure qui entoure chaque objet lors de la première couche."
-#: src/libslic3r/PrintConfig.cpp:1538
+#: src/libslic3r/PrintConfig.cpp:1646
msgid "This flag enforces a retraction whenever a Z move is done."
msgstr "Cette option active la rétractation lors d'un déplacement sur l'axe Z."
-#: src/libslic3r/PrintConfig.cpp:2194
+#: src/libslic3r/PrintConfig.cpp:2337
msgid "This flag will move the nozzle while retracting to minimize the possible blob on leaky extruders."
msgstr "Cette option déplace la buse lors des rétractations, limitant ainsi l'apparition d'amas sur les extrudeurs ayant tendance à couler."
-#: src/slic3r/GUI/Tab.cpp:953
+#: src/libslic3r/PrintConfig.cpp:1961
+msgid "This G-code will be used as a code for the color change"
+msgstr "Ce G-code sera utilisé comme code pour le changement de couleur"
+
+#: src/libslic3r/PrintConfig.cpp:1970
+msgid "This G-code will be used as a code for the pause print"
+msgstr "Ce G-code sera utilisé comme code pour la pause de l'impression"
+
+#: src/libslic3r/PrintConfig.cpp:1979
+msgid "This G-code will be used as a custom code"
+msgstr "Ce G-code sera utilisé comme code personnalisé"
+
+#: src/slic3r/GUI/Tab.cpp:1272
msgid "This is a default preset."
msgstr "Ceci est un préréglage par défaut."
-#: src/libslic3r/PrintConfig.cpp:2766
+#: src/libslic3r/PrintConfig.cpp:2930
msgid "This is a relative measure of support points density."
msgstr "Ceci est une mesure relative de la densité des points de support."
-#: src/slic3r/GUI/Tab.cpp:2338
+#: src/slic3r/GUI/Tab.cpp:2507
msgid "This is a single extruder multimaterial printer, diameters of all extruders will be set to the new value. Do you want to proceed?"
msgstr "Ceci est une imprimante multimatériaux à extrudeur unique, les diamètres de tous les extrudeurs seront réglés sur la nouvelle valeur. Voulez-vous continuer ?"
-#: src/slic3r/GUI/Tab.cpp:955
+#: src/slic3r/GUI/Tab.cpp:1274
msgid "This is a system preset."
msgstr "Ceci est un préréglage système."
-#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:583
+#: src/libslic3r/PrintConfig.cpp:559 src/libslic3r/PrintConfig.cpp:619
msgid "This is only used in the Slic3r interface as a visual help."
msgstr "Ceci est utilisé dans l'interface de Slic3r uniquement en tant que indication visuelle."
-#: src/libslic3r/PrintConfig.cpp:336
+#: src/libslic3r/PrintConfig.cpp:370
msgid "This is the acceleration your printer will be reset to after the role-specific acceleration values are used (perimeter/infill). Set zero to prevent resetting acceleration at all."
msgstr "Accélération à laquelle votre imprimante sera réinitialisée suite à une modification de l'accélération des fonctions spécifiques (périmètre/remplissage). Régler sur zéro pour ne pas réinitialiser l'accélération."
-#: src/libslic3r/PrintConfig.cpp:194
+#: src/libslic3r/PrintConfig.cpp:228
msgid "This is the acceleration your printer will use for bridges. Set zero to disable acceleration control for bridges."
msgstr "L'accélération qui sera utilisée par votre imprimante pour les ponts. Régler sur zéro pour désactiver l'accélération pour les ponts."
-#: src/libslic3r/PrintConfig.cpp:860
+#: src/libslic3r/PrintConfig.cpp:900
msgid "This is the acceleration your printer will use for first layer. Set zero to disable acceleration control for first layer."
msgstr "L'accélération que l'imprimante utilisera pour la première couche. Régler sur zéro afin de désactiver le contrôle de l'accélération pour la première couche."
-#: src/libslic3r/PrintConfig.cpp:982
+#: src/libslic3r/PrintConfig.cpp:1026
msgid "This is the acceleration your printer will use for infill. Set zero to disable acceleration control for infill."
msgstr "Il s'agit de l'accélération que votre imprimante utilisera pour le remplissage. Régler sur zéro afin de désactiver le contrôle de l'accélération pour le remplissage."
-#: src/libslic3r/PrintConfig.cpp:1400
-msgid "This is the acceleration your printer will use for perimeters. A high value like 9000 usually gives good results if your hardware is up to the job. Set zero to disable acceleration control for perimeters."
-msgstr "L'accélération que votre imprimante utilisera pour les périmètres. Une valeur élevée comme 9000 donne généralement de bons résultats si votre matériel le permet. Régler sur zéro afin de désactiver le contrôle de l'accélération pour les périmètres."
+#: src/libslic3r/PrintConfig.cpp:1582
+msgid "This is the acceleration your printer will use for perimeters. Set zero to disable acceleration control for perimeters."
+msgstr "L'accélération qui sera utilisée par votre imprimante pour les périmètres. Régler sur zéro pour désactiver l'accélération pour les périmètres."
-#: src/libslic3r/PrintConfig.cpp:1327
+#: src/libslic3r/PrintConfig.cpp:1435
msgid "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)"
msgstr "Il s'agit du diamètre de la buse de votre extrudeur (par exemple: 0.5, 0.35, etc.)"
-#: src/libslic3r/PrintConfig.cpp:1227
-#, no-c-format
+#: src/libslic3r/PrintConfig.cpp:1335
+#, possible-c-format
msgid "This is the highest printable layer height for this extruder, used to cap the variable layer height and support layer height. Maximum recommended layer height is 75% of the extrusion width to achieve reasonable inter-layer adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter."
msgstr "Ceci est la hauteur de couche imprimable maximum pour cet extrudeur, utilisée pour plafonner la hauteur de couche variable et la hauteur de couche des supports. La hauteur de couche maximum recommandée est 75% de la largeur d'extrusion afin d'obtenir une adhésion inter-couches correcte. Si réglée sur 0, la hauteur de couche est limitée à 75% du diamètre de la buse."
-#: src/libslic3r/PrintConfig.cpp:1290
+#: src/libslic3r/PrintConfig.cpp:1398
msgid "This is the lowest printable layer height for this extruder and limits the resolution for variable layer height. Typical values are between 0.05 mm and 0.1 mm."
msgstr "Cette valeur est la hauteur de couche imprimable minimum pour cet extrudeur et elle limite la résolution pour la hauteur de couche variable. Les valeurs type se situent entre 0.05 mm et 0.1 mm."
-#: src/libslic3r/GCode.cpp:639
+#: src/libslic3r/GCode.cpp:624
msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed."
msgstr "Ceci est généralement provoqué par de petites extrusions négligeables ou par un modèle défectueux. Essayez de réparer le modèle ou de changer son orientation sur le lit."
-#: src/libslic3r/PrintConfig.cpp:2215
+#: src/libslic3r/PrintConfig.cpp:2358
msgid "This matrix describes volumes (in cubic milimetres) required to purge the new filament on the wipe tower for any given pair of tools."
msgstr "Cette matrice décrit les volumes (en millimètres cube) nécessaires pour purger le nouveau filament dans la tour de nettoyage pour une paire d'outils donnée."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:878
-msgid ""
-"This operation is irreversible.\n"
-"Do you want to proceed?"
-msgstr ""
-"Cette opération est irréversible.\n"
-"Voulez-vous continuer?"
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:928
+msgid "This operation is irreversible.\nDo you want to proceed?"
+msgstr "Cette opération est irréversible.\nVoulez-vous continuer?"
-#: src/libslic3r/PrintConfig.cpp:1442
+#: src/libslic3r/PrintConfig.cpp:1550
msgid "This option sets the number of perimeters to generate for each layer. Note that Slic3r may increase this number automatically when it detects sloping surfaces which benefit from a higher number of perimeters if the Extra Perimeters option is enabled."
msgstr "Cette option définit le nombre de périmètres à générer pour chaque couche. Notez que Slic3r peut augmenter cette valeur automatiquement si il détecte une surface inclinée qui nécessite un plus grand nombre de périmètres, si l'option \"Périmètres supplémentaires\" est sélectionnée."
-#: src/libslic3r/PrintConfig.cpp:1356
+#: src/libslic3r/PrintConfig.cpp:1464
msgid "This option will drop the temperature of the inactive extruders to prevent oozing. It will enable a tall skirt automatically and move extruders outside such skirt when changing temperatures."
msgstr "Cette option abaissera la température des extrudeurs inutilisés pour prévenir le oozing (suintement). Cela active automatiquement la génération d'une grande jupe et le déplacement des extrudeurs hors de cette jupe lors des changements de température."
-#: src/libslic3r/PrintConfig.cpp:1029
+#: src/libslic3r/PrintConfig.cpp:1073
msgid "This option will limit infill to the areas actually needed for supporting ceilings (it will act as internal support material). If enabled, slows down the G-code generation due to the multiple checks involved."
msgstr "Cette option limitera le remplissage aux zones nécessaires pour soutenir les couches supérieures (cela agira comme un support interne). Si activé, la génération du G-Code prendra plus de temps à cause des calculs supplémentaires requis."
-#: src/libslic3r/PrintConfig.cpp:1022
+#: src/libslic3r/PrintConfig.cpp:1066
msgid "This option will switch the print order of perimeters and infill, making the latter first."
msgstr "Cette option inverse l'ordre d'impression des périmètres et du remplissage, ce dernier étant alors imprimé en premier."
-#: src/libslic3r/PrintConfig.cpp:459
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:85
+msgid "This printer will be shown in the presets list as"
+msgstr "Cette imprimante sera affichée dans la liste des préréglages comme"
+
+#: src/libslic3r/PrintConfig.cpp:495
msgid "This separate setting will affect the speed of external perimeters (the visible ones). If expressed as percentage (for example: 80%) it will be calculated on the perimeters speed setting above. Set to zero for auto."
msgstr "Ce réglage distinct affectera la vitesse des périmètres extérieurs (ceux qui sont visibles). Si cette valeur est exprimée en pourcentage (par exemple: 80%) elle sera calculée d'après le réglage de la vitesse de périmètre susmentionnée. Réglez sur zéro pour un ajustement automatique."
-#: src/libslic3r/PrintConfig.cpp:1717
+#: src/libslic3r/PrintConfig.cpp:1832
msgid "This separate setting will affect the speed of perimeters having radius <= 6.5mm (usually holes). If expressed as percentage (for example: 80%) it will be calculated on the perimeters speed setting above. Set to zero for auto."
msgstr "Ce réglage distinct affectera la vitesse des périmètre ayant un rayon <= 6.5mm (les trous habituellement). Si cette valeur est exprimée en pourcentage (par exemple: 80%) elle sera calculée d'après le réglage de la vitesse de périmètre susmentionnée. Réglez sur zéro pour un ajustement automatique."
-#: src/libslic3r/PrintConfig.cpp:1038
+#: src/libslic3r/PrintConfig.cpp:1082
msgid "This setting applies an additional overlap between infill and perimeters for better bonding. Theoretically this shouldn't be needed, but backlash might cause gaps. If expressed as percentage (example: 15%) it is calculated over perimeter extrusion width."
msgstr "Cette option applique un chevauchement supplémentaire entre les périmètres et le remplissage pour une meilleur fusion. En théorie, cela ne devrait pas être nécessaire, mais le jeu mécanique peut générer des espacements. Si exprimé en pourcentage (par exemple 15%), la valeur sera calculée en fonction de la largeur d'extrusion du périmètre."
@@ -8235,123 +9507,129 @@ msgstr "Cette option applique un chevauchement supplémentaire entre les périmÃ
msgid "This setting controls the height (and thus the total number) of the slices/layers. Thinner layers give better accuracy but take more time to print."
msgstr "Cette option contrôle l'épaisseur (et donc le nombre total) des couches. Des couches plus fines donneront une meilleure précision mais l'impression sera plus longue."
-#: src/libslic3r/PrintConfig.cpp:1218
+#: src/libslic3r/PrintConfig.cpp:1326
msgid "This setting represents the maximum speed of your fan."
msgstr "Cette option représente la vitesse maximum du ventilateur."
-#: src/libslic3r/PrintConfig.cpp:1281
+#: src/libslic3r/PrintConfig.cpp:1389
msgid "This setting represents the minimum PWM your fan needs to work."
msgstr "Cette option représente le PWM minimum dont votre ventilateur a besoin pour tourner."
-#: src/libslic3r/PrintConfig.cpp:1829
+#: src/libslic3r/PrintConfig.cpp:1944
msgid "This start procedure is inserted at the beginning, after any printer start gcode (and after any toolchange to this filament in case of multi-material printers). This is used to override settings for a specific filament. If PrusaSlicer detects M104, M109, M140 or M190 in your custom codes, such commands will not be prepended automatically so you're free to customize the order of heating commands and other custom actions. Note that you can use placeholder variables for all PrusaSlicer settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want. If you have multiple extruders, the gcode is processed in extruder order."
msgstr "Cette procédure de départ est insérée au début, après n'importe quel gcode de départ de l'imprimante (et après n'importe quel changement d'outil pour ce filament dans le cas des imprimantes multi-matériaux). Ceci est utilisé pour supplanter les réglages d'un filament spécifique. Si PrusaSlicer détecte M104, M109, M140 ou M190 dans vos codes personnalisés, de telles commandes ne seront pas ajoutées automatiquement de sorte que vous restez libre de personnaliser l'ordre des commandes de chauffe et autres actions personnalisées. Notez que vous pouvez utiliser des variables génériques pour les tous les paramètres PrusaSlicer, donc vous pouvez utiliser une commande \"M109 S[first_layer_temperature]\" où vous voulez."
-#: src/libslic3r/PrintConfig.cpp:1814
+#: src/libslic3r/PrintConfig.cpp:1929
msgid "This start procedure is inserted at the beginning, after bed has reached the target temperature and extruder just started heating, and before extruder has finished heating. If PrusaSlicer detects M104 or M190 in your custom codes, such commands will not be prepended automatically so you're free to customize the order of heating commands and other custom actions. Note that you can use placeholder variables for all PrusaSlicer settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."
msgstr "Cette procédure de départ est insérée au début, après que le lit a atteint la température ciblée et que l'extrudeur vient de commencer à chauffer, et avant que l'extrudeur ait terminé de chauffer. Si PrusaSlicer détecte M104 ou M190 dans votre code personnalisé, de telles commandes ne seront pas ajoutées automatiquement de sorte que vous restez libre de personnaliser l'ordre des commandes de chauffe et autres actions personnalisées. Notez que vous pouvez utiliser des variables génériques pour les tous les paramètres PrusaSlicer, donc vous pouvez utiliser une commande \"M109 S[first_layer_temperature]\" où vous voulez."
-#: src/libslic3r/PrintConfig.cpp:695
+#: src/libslic3r/PrintConfig.cpp:731
msgid "This string is edited by RammingDialog and contains ramming specific parameters."
msgstr "Cette chaine est éditée par RammingDialog et contient les paramètres spécifiques d'expulsion."
-#: src/libslic3r/PrintConfig.cpp:2286
+#: src/libslic3r/PrintConfig.cpp:2429
msgid "This value will be added (or subtracted) from all the Z coordinates in the output G-code. It is used to compensate for bad Z endstop position: for example, if your endstop zero actually leaves the nozzle 0.3mm far from the print bed, set this to -0.3 (or fix your endstop)."
msgstr "Cette valeur sera ajoutée (ou soustraite) de toutes les coordonnées Z dans le G-Code de sortie. Elle est utilisée pour compenser une mauvaise position de fin de course Z: par exemple si votre fin de course place votre buse à 0.3mm au dessus du plateau, réglez cette valeur sur -0.3 (ou corrigez votre fin de course)."
-#: src/libslic3r/PrintConfig.cpp:2208
+#: src/libslic3r/PrintConfig.cpp:2351
msgid "This vector saves required volumes to change from/to each tool used on the wipe tower. These values are used to simplify creation of the full purging volumes below."
msgstr "Ce vecteur enregistre les volumes requis pour changer l'outil utilisé pour la tour de nettoyage. Ces valeurs sont utilisées pour simplifier la création des volumes de purge complets ci-dessous."
#: src/slic3r/GUI/UpdateDialogs.cpp:216
-#, c-format
-msgid ""
-"This version of %s is not compatible with currently installed configuration bundles.\n"
-"This probably happened as a result of running an older %s after using a newer one.\n"
-"\n"
-"You may either exit %s and try again with a newer version, or you may re-run the initial configuration. Doing so will create a backup snapshot of the existing configuration before installing files compatible with this %s."
-msgstr ""
-"Cette version de %s n'est pas compatible avec les ensembles de configuration actuellement installés.\n"
-"Cela survient probablement du fait d'avoir lancé une ancienne version de %s après en avoir utilisé une nouvelle.\n"
-"\n"
-"Vous pouvez soit quitter %s et essayer à nouveau avec une version plus récente, ou vous pouvez relancer la configuration initiale. Procéder ainsi permettra de créer une sauvegarde de la configuration existante avant d'installer les fichiers compatibles avec ce %s."
+#, possible-c-format
+msgid "This version of %s is not compatible with currently installed configuration bundles.\nThis probably happened as a result of running an older %s after using a newer one.\n\nYou may either exit %s and try again with a newer version, or you may re-run the initial configuration. Doing so will create a backup snapshot of the existing configuration before installing files compatible with this %s."
+msgstr "Cette version de %s n'est pas compatible avec les ensembles de configuration actuellement installés.\nCela survient probablement du fait d'avoir lancé une ancienne version de %s après en avoir utilisé une nouvelle.\n\nVous pouvez soit quitter %s et essayer à nouveau avec une version plus récente, ou vous pouvez relancer la configuration initiale. Procéder ainsi permettra de créer une sauvegarde de la configuration existante avant d'installer les fichiers compatibles avec ce %s."
-#: src/libslic3r/PrintConfig.cpp:2458
+#: src/libslic3r/PrintConfig.cpp:2601
msgid "This will apply a gamma correction to the rasterized 2D polygons. A gamma value of zero means thresholding with the threshold in the middle. This behaviour eliminates antialiasing without losing holes in polygons."
msgstr "Cela appliquera une correction gamma aux polygones 2D tramés. Une valeur gamma de zéro signifie un seuillage avec le seuil au milieu. Ce comportement élimine l'anti-alias sans perdre de trous dans le polygone."
-#: src/libslic3r/PrintConfig.cpp:2081
+#: src/libslic3r/PrintConfig.cpp:2224
msgid "Threads"
msgstr "Threads"
-#: src/libslic3r/PrintConfig.cpp:2082
+#: src/libslic3r/PrintConfig.cpp:2225
msgid "Threads are used to parallelize long-running tasks. Optimal threads number is slightly above the number of available cores/processors."
msgstr "Les threads sont utilisés pour paralléliser les calculs longs. Le nombre optimal de threads est légèrement supérieur au nombre de coeurs/processeurs disponibles."
-#: src/slic3r/GUI/Tab.cpp:2093
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:235
+msgid "Threshold:"
+msgstr "Seuil :"
+
+#: src/slic3r/GUI/Tab.cpp:2263
msgid "Tilt"
msgstr "Incliner"
-#: src/slic3r/GUI/Tab.cpp:2094
+#: src/slic3r/GUI/Tab.cpp:2264
msgid "Tilt time"
msgstr "Durée de l'inclinaison"
+#: src/slic3r/GUI/GCodeViewer.cpp:2225 src/slic3r/GUI/GCodeViewer.cpp:2233
#: src/slic3r/GUI/RammingChart.cpp:76
msgid "Time"
msgstr "Durée"
-#: src/libslic3r/PrintConfig.cpp:687
+#: src/libslic3r/PrintConfig.cpp:723
msgid "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new filament during a tool change (when executing the T code). This time is added to the total print time by the G-code time estimator."
msgstr "Temps nécessaire pour que le Firmware de l'imprimante (ou la Multi Material Unit 2.0) charge un filament au cours d'un changement d'outils (lorsqu'il exécute le T code). Ce temps est ajouté au temps total d'impression par l'estimateur de temps du G-code."
-#: src/libslic3r/PrintConfig.cpp:702
+#: src/libslic3r/PrintConfig.cpp:738
msgid "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a filament during a tool change (when executing the T code). This time is added to the total print time by the G-code time estimator."
msgstr "Temps nécessaire pour que le Firmware de l'imprimante (ou la Multi Material Unit 2.0) décharge un filament au cours d'un changement d'outils (lorsqu'il exécute le T code). Ce temps est ajouté au temps total d'impression par l'estimateur de temps du G-code."
-#: src/libslic3r/PrintConfig.cpp:2407
+#: src/libslic3r/PrintConfig.cpp:2550
msgid "Time of the fast tilt"
msgstr "Durée de l'inclinaison rapide"
-#: src/libslic3r/PrintConfig.cpp:2416
+#: src/libslic3r/PrintConfig.cpp:2559
msgid "Time of the slow tilt"
msgstr "Durée de l'inclinaison lente"
-#: src/libslic3r/PrintConfig.cpp:641
+#: src/libslic3r/PrintConfig.cpp:677
msgid "Time to wait after the filament is unloaded. May help to get reliable toolchanges with flexible materials that may need more time to shrink to original dimensions."
msgstr "Temps d'attente nécessaire après que le filament ait été déchargé. Peut aider à obtenir des changements d'outils fiables avec des matériaux flexible qui ont besoin de plus de temps pour revenir à leurs dimensions originales."
-#: src/slic3r/GUI/Tab.cpp:966
+#: src/slic3r/GUI/GCodeViewer.cpp:2197
+msgid "to"
+msgstr "à"
+
+#: src/slic3r/GUI/Tab.cpp:1284
msgid "To do that please specify a new name for the preset."
msgstr "Pour faire cela veuillez spécifier un nouveau nom pour le préréglage."
-#: src/slic3r/GUI/Plater.cpp:4014
+#: src/slic3r/GUI/Plater.cpp:3934
msgid "To objects"
msgstr "Vers les objets"
-#: src/slic3r/GUI/Plater.cpp:4016
+#: src/slic3r/GUI/Plater.cpp:3936
msgid "To parts"
msgstr "Vers les parties"
-#: src/slic3r/GUI/Tab.cpp:1756
+#: src/slic3r/Utils/Http.cpp:82
+msgid "To specify the system certificate store manually, please set the %1% environment variable to the correct CA bundle and restart the application."
+msgstr "Pour spécifier manuellement le stockage de certificats système, définissez la variable d'environnement %1% sur le bon groupe d'autorité de certification et redémarrez l'application."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:360
msgid "To use a custom CA file, please import your CA file into Certificate Store / Keychain."
msgstr "Pour utiliser un fichier CA personnalisé, veuillez importer votre fichier CA dans le Magasin de Certificats / Trousseau."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263
-#, c-format
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:271
+#, possible-c-format
msgid "Toggle %c axis mirroring"
msgstr "Activer la symétrie sur l'axe %c"
-#: src/libslic3r/Zipper.cpp:34
+#: src/libslic3r/miniz_extension.cpp:93
msgid "too many files"
msgstr "trop de fichiers"
-#: src/libslic3r/SLAPrintSteps.cpp:190
-msgid "Too much overlapping holes."
+#: src/libslic3r/SLAPrintSteps.cpp:192
+msgid "Too many overlapping holes."
msgstr "Trop de trous qui se chevauchent."
-#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/GUI_Preview.cpp:335
-#: src/slic3r/GUI/GUI_Preview.cpp:519 src/slic3r/GUI/GUI_Preview.cpp:574
-#: src/slic3r/GUI/GUI_Preview.cpp:835 src/libslic3r/GCode/PreviewData.cpp:357
+#: src/slic3r/GUI/GCodeViewer.cpp:2241 src/slic3r/GUI/GUI_Preview.cpp:281
+#: src/slic3r/GUI/GUI_Preview.cpp:453 src/slic3r/GUI/GUI_Preview.cpp:693
+#: src/slic3r/GUI/GUI_Preview.cpp:786 src/slic3r/GUI/GUI_Preview.cpp:1270
+#: src/libslic3r/GCode/PreviewData.cpp:362
msgid "Tool"
msgstr "Outil"
@@ -8359,54 +9637,71 @@ msgstr "Outil"
msgid "Tool #"
msgstr "Outil #"
-#: src/slic3r/GUI/Tab.cpp:2000 src/libslic3r/PrintConfig.cpp:2093
+#: src/slic3r/GUI/Tab.cpp:2189 src/libslic3r/PrintConfig.cpp:2236
msgid "Tool change G-code"
msgstr "G-code de changement d'outil"
-#: src/slic3r/GUI/Tab.cpp:1491
+#: src/slic3r/GUI/GCodeViewer.cpp:2530 src/slic3r/GUI/GUI_Preview.cpp:1474
+msgid "Tool changes"
+msgstr "Changements d'outils"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:1479
+msgid "Tool marker"
+msgstr "Marqueur d'outil"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:223
+msgid "Tool position"
+msgstr "Position de l'outil"
+
+#: src/slic3r/GUI/Tab.cpp:1837
msgid "Toolchange parameters with single extruder MM printers"
msgstr "Paramètres de changement d'outil pour les imprimantes multi-matériaux mono-extrudeur"
#. TRN To be shown in the main menu View->Top
#. TRN To be shown in Print Settings "Top solid layers"
-#: src/slic3r/GUI/MainFrame.cpp:662 src/libslic3r/PrintConfig.cpp:2132
-#: src/libslic3r/PrintConfig.cpp:2141
+#: src/slic3r/GUI/MainFrame.cpp:959 src/slic3r/GUI/MainFrame.cpp:1279
+#: src/libslic3r/PrintConfig.cpp:2275 src/libslic3r/PrintConfig.cpp:2284
msgid "Top"
msgstr "Haut"
-#: src/slic3r/GUI/PresetHints.cpp:304
+#: src/slic3r/GUI/PresetHints.cpp:302
msgid "Top / bottom shell thickness hint: Not available due to invalid layer height."
msgstr "Indice d'épaisseur de coque supérieure / inférieure : non disponible en raison de la hauteur de couche non valide."
-#: src/libslic3r/PrintConfig.cpp:415
+#: src/libslic3r/PrintConfig.cpp:449
msgid "Top fill pattern"
msgstr "Motif de remplissage du dessus"
-#: src/slic3r/GUI/PresetHints.cpp:323
+#: src/slic3r/GUI/PresetHints.cpp:321
msgid "Top is open."
msgstr "Le haut est ouvert."
-#: src/slic3r/GUI/PresetHints.cpp:317
+#: src/slic3r/GUI/PresetHints.cpp:315
msgid "Top shell is %1% mm thick for layer height %2% mm."
msgstr "La coque supérieure a une épaisseur de %1% mm pour une hauteur de couche %2% mm."
-#: src/slic3r/GUI/PresetHints.cpp:192
+#: src/slic3r/GUI/PresetHints.cpp:191
msgid "top solid infill"
msgstr "remplissage solide supérieur"
-#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:315
-#: src/libslic3r/PrintConfig.cpp:2105 src/libslic3r/PrintConfig.cpp:2117
+#: src/slic3r/GUI/GUI_Preview.cpp:306 src/libslic3r/ExtrusionEntity.cpp:319
+#: src/libslic3r/ExtrusionEntity.cpp:346 src/libslic3r/PrintConfig.cpp:2248
+#: src/libslic3r/PrintConfig.cpp:2260
msgid "Top solid infill"
msgstr "Remplissage solide supérieur"
-#: src/libslic3r/PrintConfig.cpp:2135
+#: src/libslic3r/PrintConfig.cpp:2278
msgid "Top solid layers"
msgstr "Couches supérieures solides"
-#: src/slic3r/GUI/MainFrame.cpp:662
+#: src/slic3r/GUI/MainFrame.cpp:959 src/slic3r/GUI/MainFrame.cpp:1279
msgid "Top View"
msgstr "Vue du Dessus"
+#: src/libslic3r/PrintConfig.cpp:1211
+msgid "Topmost surface only"
+msgstr "Uniquement la partie supérieure de la surface"
+
#: src/slic3r/GUI/WipeTowerDialog.cpp:285
msgid "Total purging volume is calculated by summing two values below, depending on which tools are loaded/unloaded."
msgstr "Le volume de purge total est calculé en additionnant les deux valeurs ci-dessous, en fonction des outils qui sont chargés/déchargés."
@@ -8419,172 +9714,180 @@ msgstr "Volume total expulsé"
msgid "Total ramming time"
msgstr "Durée totale de l'expulsion"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:640
+msgid "Transfer"
+msgstr "Transférer"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:745
+msgid "Transfer the selected options to the newly selected preset \"%1%\"."
+msgstr "Transférer les options sélectionnées vers le nouveau préréglage \"%1%\"."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:740
+msgid "Transfer the selected settings to the newly selected preset."
+msgstr "Transférez les réglages sélectionnés vers le nouveau préréglage sélectionné."
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:561
msgid "Translate"
msgstr "Traduire"
-#: src/slic3r/GUI/Mouse3DController.cpp:300
-#: src/slic3r/GUI/Mouse3DController.cpp:317
+#: src/slic3r/GUI/Mouse3DController.cpp:282
+#: src/slic3r/GUI/Mouse3DController.cpp:303
msgid "Translation"
msgstr "Translation"
-#: src/slic3r/GUI/GUI_Preview.cpp:253 src/libslic3r/PrintConfig.cpp:2152
+#: src/slic3r/GUI/GCodeViewer.cpp:2489 src/slic3r/GUI/GUI_Preview.cpp:335
+#: src/slic3r/GUI/GUI_Preview.cpp:1471 src/libslic3r/PrintConfig.cpp:2295
msgid "Travel"
msgstr "Déplacement"
-#: src/libslic3r/PrintConfig.cpp:845
+#: src/libslic3r/PrintConfig.cpp:883
msgid "Triangles"
msgstr "Triangles"
-#: src/libslic3r/PrintConfig.cpp:3448
+#: src/libslic3r/PrintConfig.cpp:3647
msgid "Try to repair any non-manifold meshes (this option is implicitly added whenever we need to slice the model to perform the requested action)."
msgstr "Essayer de réparer tout maillage non-multiple (cette option est ajoutée implicitement dès que nous devons découper le modèle pour accomplir l'action demandée)."
-#: src/libslic3r/PrintConfig.cpp:1467
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:165
+msgid "Type here the name of your printer device"
+msgstr "Tapez ici le nom de votre imprimante"
+
+#: src/libslic3r/PrintConfig.cpp:1575
msgid "Type of the printer."
msgstr "Type d'imprimante."
-#: src/slic3r/GUI/ConfigWizard.cpp:2013 src/slic3r/GUI/GUI_ObjectList.cpp:3553
+#: src/slic3r/GUI/ConfigWizard.cpp:2524 src/slic3r/GUI/ConfigWizard.cpp:2526
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4016
msgid "Type:"
msgstr "Type :"
-#: src/slic3r/GUI/Plater.cpp:3428
+#: src/slic3r/GUI/OpenGLManager.cpp:275
+#, possible-c-format
+msgid "Unable to load the following shaders:\n%s"
+msgstr "Impossible de charger les shaders suivants :\n%s"
+
+#: src/slic3r/GUI/Plater.cpp:3233
msgid "Unable to reload:"
msgstr "Impossible de recharger :"
-#: src/libslic3r/Zipper.cpp:32
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:137
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:146
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:845
+msgid "Undef"
+msgstr "Undef"
+
+#: src/libslic3r/miniz_extension.cpp:91
msgid "undefined error"
msgstr "erreur non définie"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4624 src/slic3r/GUI/KBShortcutsDialog.cpp:130
-#: src/slic3r/GUI/MainFrame.cpp:581
+#: src/slic3r/GUI/GLCanvas3D.cpp:5028 src/slic3r/GUI/KBShortcutsDialog.cpp:125
+#: src/slic3r/GUI/MainFrame.cpp:1187
msgid "Undo"
msgstr "Annuler"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4065
-#, c-format
+#: src/slic3r/GUI/GLCanvas3D.cpp:4382
+#, possible-c-format
msgid "Undo %1$d Action"
msgid_plural "Undo %1$d Actions"
msgstr[0] "Annuler %1$d Action"
msgstr[1] "Annuler %1$d Actions"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4047
+#: src/slic3r/GUI/GLCanvas3D.cpp:4361
msgid "Undo History"
msgstr "Annuler Historique"
-#: src/libslic3r/Zipper.cpp:56
+#: src/libslic3r/miniz_extension.cpp:115
msgid "unexpected decompressed size"
msgstr "volume de décompression inattendu"
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:27
+#: src/slic3r/GUI/GUI_Preview.cpp:299 src/libslic3r/ExtrusionEntity.cpp:310
msgid "Unknown"
msgstr "Inconnu"
-#: src/slic3r/Utils/Duet.cpp:82 src/slic3r/Utils/Duet.cpp:137
-#: src/slic3r/Utils/FlashAir.cpp:119 src/slic3r/Utils/FlashAir.cpp:140
-#: src/slic3r/Utils/FlashAir.cpp:156
+#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:139
+#: src/slic3r/Utils/FlashAir.cpp:122 src/slic3r/Utils/FlashAir.cpp:143
+#: src/slic3r/Utils/FlashAir.cpp:159
msgid "Unknown error occured"
msgstr "Une erreur inconnue s'est produite"
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:178
+msgid "Unknown error occured during exporting G-code."
+msgstr "Une erreur inconnue s'est produite lors de l'exportation du G-code."
+
#: src/slic3r/GUI/WipeTowerDialog.cpp:263
msgid "unloaded"
msgstr "déchargé"
-#: src/libslic3r/PrintConfig.cpp:623
+#: src/libslic3r/PrintConfig.cpp:659
msgid "Unloading speed"
msgstr "Vitesse de déchargement"
-#: src/libslic3r/PrintConfig.cpp:632
+#: src/libslic3r/PrintConfig.cpp:668
msgid "Unloading speed at the start"
msgstr "Vitesse de déchargement au démarrage"
-#: src/slic3r/GUI/Tab.cpp:3256
+#: src/slic3r/GUI/Tab.cpp:3693
msgid "UNLOCKED LOCK"
msgstr "CADENAS OUVERT"
-#: src/slic3r/GUI/Tab.cpp:3282
-msgid ""
-"UNLOCKED LOCK icon indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\n"
-"Click to reset all settings for current option group to the system (or default) values."
-msgstr ""
-"L'icône CADENAS OUVERT indique que certains paramètres ont été modifiés et ne sont pas égaux aux valeurs du système (ou par défaut) pour le groupe d'options actuel.\n"
-"Cliquez pour régler tous les paramètres pour le groupe d'options actuel sur les valeurs du système (ou par défaut)."
-
-#: src/slic3r/GUI/Tab.cpp:3297
-msgid ""
-"UNLOCKED LOCK icon indicates that the value was changed and is not equal to the system (or default) value.\n"
-"Click to reset current value to the system (or default) value."
-msgstr ""
-"L'icône CADENAS OUVERT indique que la valeur a été changée et n'est pas égale à la valeur du système (ou par défaut).\n"
-"Cliquez pour réinitialiser la valeur actuelle sur les valeurs du système (ou par défaut)."
+#: src/slic3r/GUI/Tab.cpp:3719
+msgid "UNLOCKED LOCK icon indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\nClick to reset all settings for current option group to the system (or default) values."
+msgstr "L'icône CADENAS OUVERT indique que certains paramètres ont été modifiés et ne sont pas égaux aux valeurs du système (ou par défaut) pour le groupe d'options actuel.\nCliquez pour régler tous les paramètres pour le groupe d'options actuel sur les valeurs du système (ou par défaut)."
-#: src/slic3r/GUI/Plater.cpp:5203
-#, c-format
-msgid "Unmounting successful. The device %s(%s) can now be safely removed from the computer."
-msgstr "Démontage réussi. Le matériel %s(%s) peut maintenant être déconnecté de l'ordinateur en toute sécurité."
+#: src/slic3r/GUI/Tab.cpp:3734
+msgid "UNLOCKED LOCK icon indicates that the value was changed and is not equal to the system (or default) value.\nClick to reset current value to the system (or default) value."
+msgstr "L'icône CADENAS OUVERT indique que la valeur a été changée et n'est pas égale à la valeur du système (ou par défaut).\nCliquez pour réinitialiser la valeur actuelle sur les valeurs du système (ou par défaut)."
-#: src/slic3r/GUI/GUI_Preview.cpp:255
-msgid "Unretractions"
-msgstr "Dérétractation"
-
-#: src/slic3r/GUI/Tab.cpp:2947
-msgid "Unsaved Changes"
-msgstr "Modifications Non Sauvegardés"
-
-#: src/slic3r/GUI/GUI_App.cpp:935
-msgid "Unsaved Presets"
-msgstr "Préréglages Non Sauvegardés"
-
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:173
msgid "Unselect gizmo or clear selection"
msgstr "Désélectionner le Gizmo ou supprimer la sélection"
-#: src/libslic3r/Zipper.cpp:60
+#: src/libslic3r/miniz_extension.cpp:119
msgid "unsupported central directory size"
msgstr "volume du répertoire central non supporté"
-#: src/libslic3r/Zipper.cpp:40
+#: src/libslic3r/miniz_extension.cpp:99
msgid "unsupported encryption"
msgstr "cryptage non supporté"
-#: src/libslic3r/Zipper.cpp:42
+#: src/libslic3r/miniz_extension.cpp:101
msgid "unsupported feature"
msgstr "fonction non supportée"
-#: src/libslic3r/Zipper.cpp:38
+#: src/libslic3r/miniz_extension.cpp:97
msgid "unsupported method"
msgstr "méthode non supportée"
-#: src/libslic3r/Zipper.cpp:50
+#: src/libslic3r/miniz_extension.cpp:109
msgid "unsupported multidisk archive"
msgstr "archive multidisque non supportée"
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:292
+#: src/slic3r/GUI/OpenGLManager.cpp:267
msgid "Unsupported OpenGL version"
msgstr "Version d'OpenGL non supportée"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3420
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3883
msgid "Unsupported selection"
msgstr "Sélection non supportée"
-#: src/slic3r/GUI/GLCanvas3D.cpp:955
-#, c-format
-msgid "up to %.2f mm"
-msgstr "jusqu'à %.2f mm"
+#: src/slic3r/GUI/GCodeViewer.cpp:2183
+msgid "up to"
+msgstr "jusqu'à"
#: src/slic3r/GUI/UpdateDialogs.cpp:38
msgid "Update available"
msgstr "Mise à jour disponible"
-#: src/slic3r/GUI/ConfigWizard.cpp:779 src/slic3r/GUI/Preferences.cpp:80
+#: src/slic3r/GUI/ConfigWizard.cpp:1138 src/slic3r/GUI/Preferences.cpp:97
msgid "Update built-in Presets automatically"
msgstr "Mettre à jour automatiquement les Préréglages intégrés"
-#: src/slic3r/GUI/ConfigWizard.cpp:761
+#: src/slic3r/GUI/ConfigWizard.cpp:1120
msgid "Updates"
msgstr "Mises à jour"
-#: src/slic3r/GUI/ConfigWizard.cpp:786
+#: src/slic3r/GUI/ConfigWizard.cpp:1145
msgid "Updates are never applied without user's consent and never overwrite user's customized settings."
msgstr "Les mises à jour ne sont jamais appliquées sans l'accord de l'utilisateur et n'annulent jamais les réglages personnalisés de l'utilisateur."
@@ -8592,7 +9895,7 @@ msgstr "Les mises à jour ne sont jamais appliquées sans l'accord de l'utilisat
msgid "Upgrade"
msgstr "Mise à jour"
-#: src/slic3r/GUI/GUI_App.cpp:824
+#: src/slic3r/GUI/GUI_App.cpp:1522
msgid "Upload a firmware image into an Arduino based printer"
msgstr "Charger un firmware dans une imprimante basée sur un Arduino"
@@ -8608,101 +9911,122 @@ msgstr "Envoyer vers l'Hôte d'Imprimante avec le nom de fichier suivant :"
msgid "Uploading"
msgstr "Téléchargement"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:204
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:206
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
msgid "Upper Layer"
msgstr "Couche du Haut"
-#: src/slic3r/GUI/Tab.cpp:1900
-msgid "USB/Serial connection"
-msgstr "Connexion USB/Série"
-
-#: src/libslic3r/PrintConfig.cpp:1662
-msgid "USB/serial port for printer connection."
-msgstr "Port USB/Série pour la connexion de l'imprimante."
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
+msgid "Upper layer"
+msgstr "Couche supérieure"
-#: src/slic3r/GUI/DoubleSlider.cpp:1147
+#: src/slic3r/GUI/DoubleSlider.cpp:1276
msgid "Use another extruder"
msgstr "Utiliser un autre extrudeur"
-#: src/slic3r/GUI/Preferences.cpp:143
+#: src/slic3r/GUI/Preferences.cpp:220
msgid "Use custom size for toolbar icons"
msgstr "Utiliser une taille personnalisée pour les icônes de la barre d'outils"
-#: src/libslic3r/PrintConfig.cpp:2161
+#: src/slic3r/GUI/Preferences.cpp:268
+msgid "Use environment map"
+msgstr "Utiliser la carte d'environnement"
+
+#: src/libslic3r/PrintConfig.cpp:2304
msgid "Use firmware retraction"
msgstr "Utiliser la rétraction du firmware"
+#: src/slic3r/GUI/ImGuiWrapper.cpp:800 src/slic3r/GUI/Search.cpp:464
+msgid "Use for search"
+msgstr "Utiliser pour la recherche"
+
+#: src/libslic3r/PrintConfig.cpp:1218
+msgid "Use for time estimate"
+msgstr "Utiliser pour l'estimation du temps"
+
#: src/slic3r/GUI/PrintHostDialogs.cpp:42
msgid "Use forward slashes ( / ) as a directory separator if needed."
msgstr "Utilisez des barres obliques (/) comme séparateur de répertoire si nécessaire."
-#: src/slic3r/GUI/Preferences.cpp:126
+#: src/slic3r/GUI/Preferences.cpp:191
msgid "Use free camera"
msgstr "Utiliser la caméra libre"
-#: src/libslic3r/PrintConfig.cpp:2780
+#: src/slic3r/GUI/ConfigWizard.cpp:1188
+msgid "Use inches"
+msgstr "Utiliser les pouces"
+
+#: src/libslic3r/PrintConfig.cpp:2944
msgid "Use pad"
msgstr "Utiliser un socle"
-#: src/slic3r/GUI/Preferences.cpp:119
+#: src/slic3r/GUI/Preferences.cpp:184
msgid "Use perspective camera"
msgstr "Utiliser l'appareil photo en perspective"
-#: src/libslic3r/PrintConfig.cpp:2168
+#: src/libslic3r/PrintConfig.cpp:2311
msgid "Use relative E distances"
msgstr "Utiliser des valeurs E relatives"
-#: src/slic3r/GUI/Preferences.cpp:104
+#: src/slic3r/GUI/Preferences.cpp:135
msgid "Use Retina resolution for the 3D scene"
msgstr "Utiliser la résolution Retina pour la scène 3D"
-#: src/libslic3r/PrintConfig.cpp:540
+#: src/libslic3r/PrintConfig.cpp:576
msgid "Use this option to set the axis letter associated to your printer's extruder (usually E but some printers use A)."
msgstr "Utiliser cette option pour indiquer la lettre utilisée par l'extrudeur de votre imprimante (habituellement E, mais certaines imprimantes utilisent A)."
-#: src/libslic3r/PrintConfig.cpp:1893
+#: src/libslic3r/PrintConfig.cpp:2035
msgid "Use this setting to rotate the support material pattern on the horizontal plane."
msgstr "Utiliser ce réglage pour orienter le motif du support sur le plan horizontal."
-#: src/libslic3r/PrintConfig.cpp:2175
+#: src/libslic3r/PrintConfig.cpp:2318
msgid "Use volumetric E"
msgstr "E Volumétrique"
-#: src/slic3r/GUI/DoubleSlider.cpp:1171
+#: src/slic3r/GUI/DoubleSlider.cpp:1298
msgid "used"
msgstr "utilisé"
-#: src/slic3r/GUI/Plater.cpp:237
+#: src/slic3r/GUI/Plater.cpp:243
msgid "Used Filament (g)"
msgstr "Filament Utilisé (g)"
-#: src/slic3r/GUI/Plater.cpp:235 src/slic3r/GUI/Plater.cpp:1229
+#: src/slic3r/GUI/Plater.cpp:1141
+msgid "Used Filament (in)"
+msgstr "Filament utilisé (in)"
+
+#: src/slic3r/GUI/Plater.cpp:1153
+msgid "Used Filament (in³)"
+msgstr "Filament utilisé (in³)"
+
+#: src/slic3r/GUI/Plater.cpp:241 src/slic3r/GUI/Plater.cpp:1141
msgid "Used Filament (m)"
msgstr "Filament Utilisé (m)"
-#: src/slic3r/GUI/Plater.cpp:236
+#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1153
msgid "Used Filament (mm³)"
msgstr "Filament Utilisé (mm³)"
-#: src/slic3r/GUI/Plater.cpp:1191
+#: src/slic3r/GUI/Plater.cpp:1100
msgid "Used Material (ml)"
msgstr "Matériau Utilisé (ml)"
-#: src/slic3r/GUI/Plater.cpp:238
+#: src/slic3r/GUI/Plater.cpp:244
msgid "Used Material (unit)"
msgstr "Matériau Utilisé (unité)"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 src/libslic3r/PrintConfig.cpp:132
msgid "User"
msgstr "Utilisateur"
-#: src/slic3r/GUI/Preset.cpp:1168 src/slic3r/GUI/Preset.cpp:1288
-#: src/slic3r/GUI/PresetBundle.cpp:1677
+#: src/slic3r/GUI/PresetComboBoxes.cpp:230
+#: src/slic3r/GUI/PresetComboBoxes.cpp:778
+#: src/slic3r/GUI/PresetComboBoxes.cpp:934
msgid "User presets"
msgstr "Préréglages utilisateur"
-#: src/libslic3r/Zipper.cpp:90
+#: src/libslic3r/miniz_extension.cpp:149
msgid "validation failed"
msgstr "échec de la validation"
@@ -8714,31 +10038,31 @@ msgstr "La valeur est identique à la valeur du système"
msgid "Value was changed and is not equal to the system value or the last saved preset"
msgstr "La valeur a été changée et n'est pas égale à la valeur du système ou au dernier préréglage sauvegardé"
-#: src/slic3r/GUI/Tab.cpp:2202
+#: src/slic3r/GUI/Tab.cpp:2371
msgid "Values in this column are for Normal mode"
msgstr "Les valeurs de cette colonne sont pour le mode Normal"
-#: src/slic3r/GUI/Tab.cpp:2208
+#: src/slic3r/GUI/Tab.cpp:2377
msgid "Values in this column are for Stealth mode"
msgstr "Les valeurs de cette colonne sont pour le mode Silencieux"
-#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/slic3r/GUI/GLCanvas3D.cpp:4573
+#: src/slic3r/GUI/GLCanvas3D.cpp:231 src/slic3r/GUI/GLCanvas3D.cpp:4978
msgid "Variable layer height"
msgstr "Hauteur de couche variable"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1709
+#: src/slic3r/GUI/GLCanvas3D.cpp:1786
msgid "Variable layer height - Adaptive"
msgstr "Hauteur de couche variable - Adaptatif"
-#: src/slic3r/GUI/GLCanvas3D.cpp:599
+#: src/slic3r/GUI/GLCanvas3D.cpp:565
msgid "Variable layer height - Manual edit"
msgstr "Hauteur de couche variable - Modification manuelle"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1701
+#: src/slic3r/GUI/GLCanvas3D.cpp:1778
msgid "Variable layer height - Reset"
msgstr "Hauteur de couche variable - Réinitialisation"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1717
+#: src/slic3r/GUI/GLCanvas3D.cpp:1794
msgid "Variable layer height - Smooth all"
msgstr "Hauteur de couche variable - Tout lisser"
@@ -8746,19 +10070,20 @@ msgstr "Hauteur de couche variable - Tout lisser"
msgid "variants"
msgstr "variantes"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:971
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:1289
msgid "vendor"
msgstr "fabriquant"
-#: src/slic3r/GUI/ConfigWizard.cpp:565
+#: src/slic3r/GUI/ConfigWizard.cpp:589
msgid "Vendor:"
msgstr "Fournisseur :"
-#: src/libslic3r/PrintConfig.cpp:928
+#: src/libslic3r/PrintConfig.cpp:972
msgid "Verbose G-code"
msgstr "G-code commenté"
-#: src/slic3r/GUI/AboutDialog.cpp:231 src/slic3r/GUI/MainFrame.cpp:64
+#: src/slic3r/GUI/AboutDialog.cpp:256 src/slic3r/GUI/GUI_App.cpp:239
+#: src/slic3r/GUI/MainFrame.cpp:164
msgid "Version"
msgstr "Version"
@@ -8766,24 +10091,48 @@ msgstr "Version"
msgid "version"
msgstr "version"
-#: src/slic3r/GUI/Tab.cpp:1053
+#: src/slic3r/GUI/Tab.cpp:1375
msgid "Vertical shells"
msgstr "Parois verticales"
-#: src/slic3r/GUI/GUI_Preview.cpp:218
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:237
+msgid "Vertical Slider"
+msgstr "Barre de Défilement Verticale"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:212
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:231
+msgid "Vertical slider - Move active thumb Down"
+msgstr "Barre de défilement verticale - Déplacer le curseur actif vers le Bas"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:211
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:230
+msgid "Vertical slider - Move active thumb Up"
+msgstr "Barre de défilement verticale - Déplacer le curseur actif vers le Haut"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:265 src/slic3r/GUI/GUI_Preview.cpp:271
msgid "View"
msgstr "Vue"
-#: src/slic3r/GUI/ConfigWizard.cpp:813
+#: src/slic3r/GUI/ConfigWizard.cpp:1172
msgid "View mode"
msgstr "Mode de vue"
-#: src/libslic3r/SLAPrintSteps.cpp:413 src/libslic3r/SLAPrintSteps.cpp:422
-#: src/libslic3r/SLAPrintSteps.cpp:461
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:666
+msgid "Visit \"Preferences\" and check \"%1%\"\nto be asked about unsaved changes again."
+msgstr "Accédez aux \"Préférences\" et cochez \"%1%\"\npour être à nouveau interrogé sur les modifications non enregistrées."
+
+#: src/libslic3r/PrintConfig.cpp:3553
+msgid "Visualize an already sliced and saved G-code"
+msgstr "Visualisez un G-code déjà découpé et enregistré"
+
+#: src/libslic3r/SLAPrintSteps.cpp:411 src/libslic3r/SLAPrintSteps.cpp:420
+#: src/libslic3r/SLAPrintSteps.cpp:459
msgid "Visualizing supports"
msgstr "Visualisation des supports"
-#: src/slic3r/GUI/Plater.cpp:161
+#: src/slic3r/GUI/Plater.cpp:167
msgid "Volume"
msgstr "Volume"
@@ -8791,23 +10140,23 @@ msgstr "Volume"
msgid "Volume to purge (mm³) when the filament is being"
msgstr "Volume à purger (mm³) lorsque le filament est"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1106
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1230
msgid "Volumes in Object reordered"
msgstr "Volumes dans l'Objet réorganisés"
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:218
msgid "Volumetric"
msgstr "Volumétrique"
-#: src/slic3r/GUI/Tab.cpp:1591
+#: src/slic3r/GUI/Tab.cpp:1930
msgid "Volumetric flow hints not available"
msgstr "Indications du débit volumétrique non disponible"
-#: src/slic3r/GUI/GUI_Preview.cpp:226
+#: src/slic3r/GUI/GUI_Preview.cpp:280
msgid "Volumetric flow rate"
msgstr "Débit volumétrique"
-#: src/libslic3r/GCode/PreviewData.cpp:355
+#: src/slic3r/GUI/GCodeViewer.cpp:2240 src/libslic3r/GCode/PreviewData.cpp:360
msgid "Volumetric flow rate (mm³/s)"
msgstr "Débit volumétrique (mm³/s)"
@@ -8815,151 +10164,167 @@ msgstr "Débit volumétrique (mm³/s)"
msgid "Volumetric speed"
msgstr "Vitesse volumétrique"
-#: src/libslic3r/PrintConfig.cpp:2915
+#: src/libslic3r/PrintConfig.cpp:3079
msgid "Wall thickness"
msgstr "Épaisseur de la paroi"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1270 src/slic3r/GUI/GUI.cpp:251
-#: src/slic3r/GUI/Tab.cpp:3084 src/slic3r/GUI/WipeTowerDialog.cpp:45
-#: src/slic3r/GUI/WipeTowerDialog.cpp:366
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1129 src/slic3r/GUI/GUI.cpp:256
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:478
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:502
+#: src/slic3r/GUI/WipeTowerDialog.cpp:45 src/slic3r/GUI/WipeTowerDialog.cpp:366
msgid "Warning"
msgstr "Alerte"
-#: src/slic3r/GUI/ConfigWizard.cpp:431
+#: src/slic3r/GUI/NotificationManager.cpp:672
+#: src/slic3r/GUI/NotificationManager.cpp:687
+#: src/slic3r/GUI/NotificationManager.cpp:702
+msgid "WARNING:"
+msgstr "ATTENTION :"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:449
msgid "Welcome"
msgstr "Bienvenue"
-#: src/slic3r/GUI/ConfigWizard.cpp:427
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:445
+#, possible-c-format
msgid "Welcome to the %s Configuration Assistant"
msgstr "Bienvenue dans l'Assistant de Configuration de %s"
-#: src/slic3r/GUI/ConfigWizard.cpp:429
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:447
+#, possible-c-format
msgid "Welcome to the %s Configuration Wizard"
msgstr "Bienvenue dans l'Assistant de Configuration de %s"
-#: src/slic3r/GUI/Preferences.cpp:97
+#: src/slic3r/GUI/SavePresetDialog.cpp:310
+msgid "What would you like to do with \"%1%\" preset after saving?"
+msgstr "Que souhaitez-vous faire avec le préréglage de \"%1%\" après l'enregistrement ?"
+
+#: src/slic3r/GUI/Preferences.cpp:114
msgid "When checked, the print and filament presets are shown in the preset editor even if they are marked as incompatible with the active printer"
msgstr "Lorsqu'ils sont sélectionnés, les préréglages de l'imprimante et du filament sont visibles dans l'éditeur de préréglage même s'ils sont désignés comme incompatibles avec l'imprimante en cours d'utilisation"
-#: src/slic3r/GUI/PresetHints.cpp:224
+#: src/slic3r/GUI/Preferences.cpp:122
+msgid "When checked, whenever dragging and dropping a project file on the application, shows a dialog asking to select the action to take on the file to load."
+msgstr "Quand cette case est cochée, lorsque vous faites glisser et déposez un projet de fichier sur l'application, une boite de dialogue apparait pour vous demander de sélectionner l'action à accomplir sur le fichier à charger."
+
+#: src/slic3r/GUI/Preferences.cpp:156
+msgid "When closing the application, always ask for unsaved changes"
+msgstr "Lors de la fermeture de l'application, toujours demander pour les modifications non enregistrées"
+
+#: src/slic3r/GUI/PresetHints.cpp:223
msgid "when printing"
msgstr "pendant l'impression des"
-#: src/libslic3r/PrintConfig.cpp:253
+#: src/libslic3r/PrintConfig.cpp:287
msgid "When printing multi-material objects, this settings will make Slic3r to clip the overlapping object parts one by the other (2nd part will be clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc)."
msgstr "Lorsque vous imprimez des objets multi-matériaux, ce réglage fera en sorte que Slic3r rattache ensemble les parties de l'objet qui se superposent (la 2e partie sera rattachée à la 1ere, la 3e partie sera rattachée à la 1ere et la 2e, etc...)."
-#: src/libslic3r/PrintConfig.cpp:305
+#: src/libslic3r/PrintConfig.cpp:339
msgid "When printing multiple objects or copies, this feature will complete each object before moving onto next one (and starting it from its bottom layer). This feature is useful to avoid the risk of ruined prints. Slic3r should warn and prevent you from extruder collisions, but beware."
msgstr "Lorsque vous imprimez plusieurs objets ou copies, ce réglage permet de terminer un objet avant de passer au suivant (en repartant de sa première couche). Cette fonction est utile pour éviter les risques d'impressions gâchées. Slic3r doit vous avertir et éviter les collisions entre les objets et l'extrudeur, mais soyez vigilant."
-#: src/libslic3r/PrintConfig.cpp:891
+#: src/libslic3r/PrintConfig.cpp:933
msgid "When printing with very low layer heights, you might still want to print a thicker bottom layer to improve adhesion and tolerance for non perfect build plates. This can be expressed as an absolute value or as a percentage (for example: 150%) over the default layer height."
msgstr "Lors d'une impression avec de très faibles épaisseurs de couche, vous pouvez choisir d'imprimer une première couche plus épaisse pour améliorer l'adhérence et la tolérance aux plateaux imparfaits. Ce réglage peut être exprimé comme une valeur absolue ou un pourcentage (par exemple 150%) par rapport à l'épaisseur de couche par défaut."
-#: src/libslic3r/PrintConfig.cpp:1553
+#: src/libslic3r/PrintConfig.cpp:1661
msgid "When retraction is triggered before changing tool, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder)."
msgstr "Lorsque la rétractation est déclenchée avant un changement d'outil, le filament est retiré de la longueur indiquée (la longueur est mesurée sur le filament brut, avant qu'il entre dans l'extrudeur)."
-#: src/libslic3r/PrintConfig.cpp:1545
+#: src/libslic3r/PrintConfig.cpp:1653
msgid "When retraction is triggered, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder)."
msgstr "Lorsque la rétractation est déclenchée, le filament est tiré en arrière de la longueur indiquée (la longueur est mesurée sur le filament brut, avant qu'il entre dans l'extrudeur)."
-#: src/libslic3r/PrintConfig.cpp:1391
+#: src/libslic3r/PrintConfig.cpp:1499
msgid "When set to zero, the distance the filament is moved from parking position during load is exactly the same as it was moved back during unload. When positive, it is loaded further, if negative, the loading move is shorter than unloading."
msgstr "Lorsqu'elle est réglée sur zéro, la distance de laquelle le filament est déplacé depuis la position d'attente pendant le chargement est exactement la même que lors de son déchargement. Lorsqu'elle est positive, il est chargé davantage, si elle est négative, le déplacement de chargement est plus court que le déchargement."
-#: src/libslic3r/PrintConfig.cpp:1238
+#: src/libslic3r/PrintConfig.cpp:1346
msgid "When setting other speed settings to 0 Slic3r will autocalculate the optimal speed in order to keep constant extruder pressure. This experimental setting is used to set the highest print speed you want to allow."
msgstr "Lorsque vous réglez les autres vitesses à 0, Slic3r calculera automatiquement la vitesse optimale de façon à garder une pression constante dans l'extrudeur. Cette fonction expérimentale est utilisée pour régler la plus haute vitesse que vous souhaitez autoriser."
-#: src/libslic3r/PrintConfig.cpp:1597
+#: src/libslic3r/PrintConfig.cpp:1705
msgid "When the retraction is compensated after changing tool, the extruder will push this additional amount of filament."
msgstr "Lorsque la rétractation est compensée après un changement d'outil, l'extrudeur exprimera cette quantité de filament en plus."
-#: src/libslic3r/PrintConfig.cpp:1589
+#: src/libslic3r/PrintConfig.cpp:1697
msgid "When the retraction is compensated after the travel move, the extruder will push this additional amount of filament. This setting is rarely needed."
msgstr "Lorsque la rétractation est compensée après un déplacement, l'extruder exprimera cette quantité de filament en plus. Ce réglage est rarement nécessaire."
-#: src/slic3r/GUI/Tab.cpp:3263
+#: src/slic3r/GUI/Tab.cpp:3700
msgid "WHITE BULLET"
msgstr "PUCE BLANCHE"
-#: src/slic3r/GUI/Tab.cpp:3285
+#: src/slic3r/GUI/Tab.cpp:3722
msgid "WHITE BULLET icon indicates a non system (or non default) preset."
msgstr "L'icône en forme de PUCE BLANCHE indique un préréglage non-système (ou non par défaut)."
-#: src/slic3r/GUI/Tab.cpp:3288
+#: src/slic3r/GUI/Tab.cpp:3725
msgid "WHITE BULLET icon indicates that the settings are the same as in the last saved preset for the current option group."
msgstr "L'icône en forme de PUCE BLANCHE indique que les réglages sont identiques au dernier préréglage sauvegardé pour le groupe d'options actuel."
-#: src/slic3r/GUI/Tab.cpp:3303
+#: src/slic3r/GUI/Tab.cpp:3740
msgid "WHITE BULLET icon indicates that the value is the same as in the last saved preset."
msgstr "L'icône PUCE BLANCHE indique que la valeur est la même que pour le dernier préréglage sauvegardé."
-#: src/slic3r/GUI/GUI_Preview.cpp:223 src/libslic3r/PrintConfig.cpp:2238
+#: src/slic3r/GUI/GUI_Preview.cpp:277 src/libslic3r/PrintConfig.cpp:2381
msgid "Width"
msgstr "Largeur"
-#: src/libslic3r/GCode/PreviewData.cpp:349
+#: src/slic3r/GUI/GCodeViewer.cpp:2237 src/libslic3r/GCode/PreviewData.cpp:354
msgid "Width (mm)"
msgstr "Largeur (mm)"
-#: src/libslic3r/PrintConfig.cpp:2640
+#: src/libslic3r/PrintConfig.cpp:2783
msgid "Width from the back sphere center to the front sphere center"
msgstr "Largeur depuis le centre arrière de la sphère jusqu'au centre avant de la sphère"
-#: src/libslic3r/PrintConfig.cpp:2239
+#: src/libslic3r/PrintConfig.cpp:2382
msgid "Width of a wipe tower"
msgstr "Largeur d'une tour de nettoyage"
-#: src/libslic3r/PrintConfig.cpp:2891
+#: src/libslic3r/PrintConfig.cpp:3055
msgid "Width of the connector sticks which connect the object and the generated pad."
msgstr "Largeur des bâtonnets de connexion qui connectent l'objet et le socle généré."
-#: src/libslic3r/PrintConfig.cpp:2354
+#: src/libslic3r/PrintConfig.cpp:2497
msgid "Width of the display"
msgstr "Largeur de l'affichage"
-#: src/slic3r/GUI/PresetHints.cpp:48
-msgid "will always run at %1%%%"
-msgstr "fonctionnera toujours à %1%%%"
-
-#: src/slic3r/GUI/PresetHints.cpp:55
-msgid "will be turned off."
-msgstr "sera désactivé."
-
-#: src/libslic3r/PrintConfig.cpp:2441
+#: src/libslic3r/PrintConfig.cpp:2584
msgid "Will inflate or deflate the sliced 2D polygons according to the sign of the correction."
msgstr "Va augmenter ou diminuer les polygones 2D découpés en fonction du signe de la correction."
-#: src/libslic3r/PrintConfig.cpp:2261
+#: src/slic3r/GUI/GCodeViewer.cpp:2660 src/slic3r/GUI/GCodeViewer.cpp:2663
+#: src/slic3r/GUI/GUI_Preview.cpp:978
+msgid "Wipe"
+msgstr "Nettoyer"
+
+#: src/libslic3r/PrintConfig.cpp:2404
msgid "Wipe into this object"
msgstr "Nettoyer dans cet objet"
-#: src/libslic3r/PrintConfig.cpp:2253
+#: src/libslic3r/PrintConfig.cpp:2396
msgid "Wipe into this object's infill"
msgstr "Nettoyer dans le remplissage de cet objet"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:101
-#: src/slic3r/GUI/GUI_ObjectList.cpp:619 src/libslic3r/PrintConfig.cpp:2252
-#: src/libslic3r/PrintConfig.cpp:2260
+#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:99
+#: src/slic3r/GUI/GUI_ObjectList.cpp:658 src/libslic3r/PrintConfig.cpp:2395
+#: src/libslic3r/PrintConfig.cpp:2403
msgid "Wipe options"
msgstr "Options de nettoyage"
-#: src/slic3r/GUI/GUI_Preview.cpp:248 src/slic3r/GUI/Tab.cpp:1191
-#: src/libslic3r/ExtrusionEntity.cpp:321
+#: src/slic3r/GUI/GUI_Preview.cpp:313 src/slic3r/GUI/Tab.cpp:1521
+#: src/libslic3r/ExtrusionEntity.cpp:326 src/libslic3r/ExtrusionEntity.cpp:360
msgid "Wipe tower"
msgstr "Tour de nettoyage"
-#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245
+#: src/slic3r/GUI/Plater.cpp:1143 src/slic3r/GUI/Plater.cpp:1160
msgid "wipe tower"
msgstr "tour de nettoyage"
-#: src/slic3r/GUI/ConfigManipulation.cpp:120
-#: src/slic3r/GUI/ConfigManipulation.cpp:140
+#: src/slic3r/GUI/ConfigManipulation.cpp:119
+#: src/slic3r/GUI/ConfigManipulation.cpp:139
msgid "Wipe Tower"
msgstr "Tour de Nettoyage"
@@ -8967,131 +10332,141 @@ msgstr "Tour de Nettoyage"
msgid "Wipe tower - Purging volume adjustment"
msgstr "Tour de nettoyage - Ajustement du volume de purge"
-#: src/slic3r/GUI/Tab.cpp:1488
+#: src/slic3r/GUI/Tab.cpp:1834
msgid "Wipe tower parameters"
msgstr "Paramètres de la tour de nettoyage"
-#: src/libslic3r/PrintConfig.cpp:2245
+#: src/libslic3r/PrintConfig.cpp:2388
msgid "Wipe tower rotation angle"
msgstr "Angle de rotation de la tour de nettoyage"
-#: src/libslic3r/PrintConfig.cpp:2246
+#: src/libslic3r/PrintConfig.cpp:2389
msgid "Wipe tower rotation angle with respect to x-axis."
msgstr "Angle de rotation de la tour de nettoyage par rapport à l'axe X."
-#: src/libslic3r/PrintConfig.cpp:2193
+#: src/libslic3r/PrintConfig.cpp:2336
msgid "Wipe while retracting"
msgstr "Nettoyer lors des rétractions"
-#: src/slic3r/GUI/PresetHints.cpp:225
+#: src/slic3r/GUI/PresetHints.cpp:224
msgid "with a volumetric rate"
msgstr "avec un débit volumétrique"
-#: src/libslic3r/PrintConfig.cpp:1530
+#: src/libslic3r/PrintConfig.cpp:1638
msgid "With bowden extruders, it may be wise to do some amount of quick retract before doing the wipe movement."
msgstr "Avec les extrudeurs bowden, il est conseillé d'effectuer une rétractation rapide avant de réaliser le mouvement de nettoyage."
-#: src/libslic3r/PrintConfig.cpp:2056
+#: src/libslic3r/PrintConfig.cpp:2198
msgid "With sheath around the support"
msgstr "Avec une enveloppe autour du support"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:68
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:111
msgid "World coordinates"
msgstr "Les coordonnées mondiales"
#: src/slic3r/GUI/UpdateDialogs.cpp:92
-msgid ""
-"Would you like to install it?\n"
-"\n"
-"Note that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n"
-"\n"
-"Updated configuration bundles:"
-msgstr ""
-"Voulez-vous l'installer ?\n"
-"\n"
-"Notez qu'un instantané complet de la configuration sera sauvegardé d'abord. Elle peut être restaurée à tout moment si vous rencontrez un problème avec la nouvelle version.\n"
-"\n"
-"Ensembles de configuration mis à jour :"
+msgid "Would you like to install it?\n\nNote that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n\nUpdated configuration bundles:"
+msgstr "Voulez-vous l'installer ?\n\nNotez qu'un instantané complet de la configuration sera sauvegardé d'abord. Elle peut être restaurée à tout moment si vous rencontrez un problème avec la nouvelle version.\n\nEnsembles de configuration mis à jour :"
+
+#: src/slic3r/GUI/GUI_App.cpp:1802
+msgid "Would you like to stop uploads and close the program?"
+msgstr "Souhaitez-vous arrêter les téléchargements et fermer le programme ?"
-#: src/libslic3r/Zipper.cpp:92
+#: src/libslic3r/miniz_extension.cpp:151
msgid "write calledback failed"
msgstr "échec de l'écriture du rappel"
-#: src/libslic3r/PrintConfig.cpp:3382
+#: src/libslic3r/PrintConfig.cpp:3581
msgid "Write information about the model to the console."
msgstr "Rédiger des informations au sujet du modèle en direction de la console."
-#: src/slic3r/Utils/Duet.cpp:131
+#: src/slic3r/Utils/Duet.cpp:133
msgid "Wrong password"
msgstr "Mauvais mot de passe"
-#: src/libslic3r/PrintConfig.cpp:2225
+#: src/libslic3r/PrintConfig.cpp:2368
msgid "X coordinate of the left front corner of a wipe tower"
msgstr "Coordonnée X du coin avant gauche d'une tour de nettoyage"
-#: src/libslic3r/PrintConfig.cpp:1879
+#: src/libslic3r/PrintConfig.cpp:2021
msgid "XY separation between an object and its support"
msgstr "Séparation XY entre un objet et ses supports"
-#: src/libslic3r/PrintConfig.cpp:1881
+#: src/libslic3r/PrintConfig.cpp:2023
msgid "XY separation between an object and its support. If expressed as percentage (for example 50%), it will be calculated over external perimeter width."
msgstr "Séparation XY entre un objet et ses supports. Si la valeur est exprimée en pourcentage (par exemple 50%), elle sera calculée à partir de la largeur du périmètre extérieur."
-#: src/libslic3r/PrintConfig.cpp:2275
+#: src/libslic3r/PrintConfig.cpp:2418
msgid "XY Size Compensation"
msgstr "Compensation de Taille XY"
-#: src/libslic3r/PrintConfig.cpp:2232
+#: src/libslic3r/PrintConfig.cpp:2375
msgid "Y coordinate of the left front corner of a wipe tower"
msgstr "Coordonnée Y du coin avant gauche d'une tour de nettoyage"
-#: src/slic3r/GUI/Plater.cpp:1170
+#: src/slic3r/GUI/Plater.cpp:1079
msgid "Yes"
msgstr "Oui"
-#: src/libslic3r/PrintConfig.cpp:1317
+#: src/slic3r/GUI/Plater.cpp:1405
+msgid "You can open only one .gcode file at a time."
+msgstr "Vous ne pouvez ouvrir qu'un seul fichier .gcode à la fois."
+
+#: src/libslic3r/PrintConfig.cpp:1425
msgid "You can put here your personal notes. This text will be added to the G-code header comments."
msgstr "Vous pouvez inscrire ici vos commentaires personnels. Ce texte sera ajouté au commentaire en entête du G-Code."
-#: src/libslic3r/PrintConfig.cpp:589
+#: src/libslic3r/PrintConfig.cpp:625
msgid "You can put your notes regarding the filament here."
msgstr "Vous pouvez saisir vos remarques concernant le filament ici."
-#: src/libslic3r/PrintConfig.cpp:1473
+#: src/libslic3r/PrintConfig.cpp:1581
msgid "You can put your notes regarding the printer here."
msgstr "Vous pouvez saisir ici vos observations concernant l'imprimante."
-#: src/libslic3r/PrintConfig.cpp:2579
+#: src/libslic3r/PrintConfig.cpp:2722
msgid "You can put your notes regarding the SLA print material here."
msgstr "Vous pouvez mettre ici vos annotations concernant le matériau d'impression SLA."
-#: src/libslic3r/PrintConfig.cpp:360
+#: src/libslic3r/PrintConfig.cpp:394
msgid "You can set this to a positive value to disable fan at all during the first layers, so that it does not make adhesion worse."
msgstr "Vous pouvez régler ce paramètre sur une valeur positive pour désactiver complètement le ventilateur pendant les premières couches, afin de ne pas rendre l'adhérence plus difficile."
-#: src/libslic3r/PrintConfig.cpp:1364
+#: src/libslic3r/PrintConfig.cpp:1472
msgid "You can use all configuration options as variables inside this template. For example: [layer_height], [fill_density] etc. You can also use [timestamp], [year], [month], [day], [hour], [minute], [second], [version], [input_filename], [input_filename_base]."
msgstr "Vous pouvez utiliser toutes les options de configuration comme variables dans ce modèle. Par exemple : [layer_height], [fill_density] etc. Vous pouvez aussi utiliser [timestamp], [year], [month], [day], [hour], [minute], [second], [version], [input_filename], [input_filename_base]."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3546
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4009
msgid "You can't change a type of the last solid part of the object."
msgstr "Vous ne pouvez pas changer un type de la dernière partie solide de l'objet."
-#: src/slic3r/GUI/Plater.cpp:2390
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:2352
+#, possible-c-format
msgid "You can't to add the object(s) from %s because of one or some of them is(are) multi-part"
msgstr "Vous ne pouvez pas ajouter l'objet (les objets) depuis %s car l'un d'entre eux est en plusieurs parties"
-#: src/slic3r/GUI/Plater.cpp:2311
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:208 src/slic3r/GUI/Plater.cpp:2254
msgid "You cannot load SLA project with a multi-part object on the bed"
msgstr "Vous ne pouvez pas charger un projet SLA avec un objet en plusieurs parties sur le plateau"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:625
msgid "You cannot use non-uniform scaling mode for multiple objects/parts selection"
msgstr "Vous ne pouvez pas utiliser un mode de redimensionnement non-uniforme pour une sélection d'objets/de parties multiples"
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:287
+#: src/slic3r/GUI/NotificationManager.hpp:459
+msgid "You have just added a G-code for color change, but its value is empty.\nTo export the G-code correctly, check the \"Color Change G-code\" in \"Printer Settings > Custom G-code\""
+msgstr "Vous venez d'ajouter un G-code de changement de couleur, mais sa valeur est vide.\nPour exporter le G-code correctement, référez-vous à \"G-code de Changement de Couleur\" dans \"Réglages de l'Imprimante > G-code Personnalisé\""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:277
+msgid "You have selected physical printer \"%1%\" \nwith related printer preset \"%2%\""
+msgstr "Vous avez sélectionné l'imprimante physique \"%1%\"\navec le préréglage d'imprimante associé \"%2%\""
+
+#: src/slic3r/GUI/GUI_App.cpp:1078
+msgid "You have the following presets with saved options for \"Print Host upload\""
+msgstr "Vous disposez des préréglages suivants avec des options enregistrées pour le \"Téléchargement vers l'hôte d'impression\""
+
+#: src/slic3r/GUI/OpenGLManager.cpp:262
msgid "You may need to update your graphics card driver."
msgstr "Vous avez peut-être besoin de mettre à jour le pilote de votre carte graphique."
@@ -9099,93 +10474,95 @@ msgstr "Vous avez peut-être besoin de mettre à jour le pilote de votre carte g
msgid "You must install a configuration update."
msgstr "Il est nécessaire d'installer une mise à niveau de configuration."
-#: src/slic3r/GUI/Preferences.cpp:172
-#, c-format
+#: src/slic3r/GUI/Preferences.cpp:299
+#, possible-c-format
msgid "You need to restart %s to make the changes effective."
msgstr "Vous devez redémarrer %s afin que les modifications soient appliquées."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3421
-#, c-format
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:468
+msgid "You should change the name of your printer device."
+msgstr "Vous devez changer le nom de votre imprimante."
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3884
+#, possible-c-format
msgid "You started your selection with %s Item."
msgstr "Vous avez commencé votre sélection avec l'item %s."
-#: src/slic3r/GUI/DoubleSlider.cpp:1902
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:664
+msgid "You will not be asked about the unsaved changes the next time you close PrusaSlicer."
+msgstr "Vous ne serez pas interrogé sur les modifications non enregistrées la prochaine fois que vous fermerez PrusaSlicer."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:665
+msgid "You will not be asked about the unsaved changes the next time you switch a preset."
+msgstr "Vous ne serez pas interrogé sur les modifications non enregistrées la prochaine fois que vous changerez de préréglage."
+
+#: src/slic3r/GUI/DoubleSlider.cpp:2121
msgid "Your current changes will delete all saved color changes."
msgstr "Vos changements actuels supprimeront toutes les changements de couleur enregistrés."
-#: src/slic3r/GUI/DoubleSlider.cpp:1923
+#: src/slic3r/GUI/DoubleSlider.cpp:2141
msgid "Your current changes will delete all saved extruder (tool) changes."
msgstr "Vos changements actuels supprimeront toutes les changement enregistrés de l'extrudeur (outil)."
-#: src/slic3r/GUI/MainFrame.cpp:911
+#: src/slic3r/GUI/MainFrame.cpp:1612
msgid "Your file was repaired."
msgstr "Votre fichier a été réparé."
-#: src/slic3r/GUI/Plater.cpp:2528
+#: src/slic3r/GUI/Plater.cpp:2490
msgid "Your object appears to be too large, so it was automatically scaled down to fit your print bed."
msgstr "Votre objet semble être trop grand, il a donc été automatiquement réduit afin de l'adapter à votre plateau d'impression."
-#: src/libslic3r/PrintConfig.cpp:2285
+#: src/libslic3r/GCode.cpp:1261
+msgid "Your print is very close to the priming regions. Make sure there is no collision."
+msgstr "Votre impression est très proche des zones de purge. Assurez-vous qu'il n'y a pas de collision."
+
+#: src/libslic3r/PrintConfig.cpp:2428
msgid "Z offset"
msgstr "Décalage Z"
-#: src/slic3r/GUI/ConfigManipulation.cpp:60
-msgid ""
-"Zero first layer height is not valid.\n"
-"\n"
-"The first layer height will be reset to 0.01."
-msgstr ""
-"Une hauteur de première couche de zéro n'est pas valide.\n"
-"\n"
-"La hauteur de la première couche sera réinitialisée à 0,01."
+#: src/slic3r/GUI/ConfigManipulation.cpp:59
+msgid "Zero first layer height is not valid.\n\nThe first layer height will be reset to 0.01."
+msgstr "Une hauteur de première couche de zéro n'est pas valide.\n\nLa hauteur de la première couche sera réinitialisée à 0,01."
-#: src/slic3r/GUI/ConfigManipulation.cpp:48
-msgid ""
-"Zero layer height is not valid.\n"
-"\n"
-"The layer height will be reset to 0.01."
-msgstr ""
-"Une hauteur de couche de zéro n'est pas valide.\n"
-"\n"
-"La hauteur de la couche sera réinitialisée à 0,01."
+#: src/slic3r/GUI/ConfigManipulation.cpp:47
+msgid "Zero layer height is not valid.\n\nThe layer height will be reset to 0.01."
+msgstr "Une hauteur de couche de zéro n'est pas valide.\n\nLa hauteur de la couche sera réinitialisée à 0,01."
-#: src/libslic3r/PrintConfig.cpp:2667
+#: src/libslic3r/PrintConfig.cpp:2831
msgid "Zig-Zag"
msgstr "Zig-Zag"
-#: src/slic3r/GUI/Mouse3DController.cpp:308
-#: src/slic3r/GUI/Mouse3DController.cpp:317
+#: src/slic3r/GUI/Mouse3DController.cpp:294
+#: src/slic3r/GUI/Mouse3DController.cpp:303
msgid "Zoom"
msgstr "Zoom"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:183
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:177
msgid "Zoom in"
msgstr "Zoom avant"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:184
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:178
msgid "Zoom out"
msgstr "Zoom arrière"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:181
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
msgid "Zoom to Bed"
msgstr "Zoomer sur le Lit"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:182
-msgid ""
-"Zoom to selected object\n"
-"or all objects in scene, if none selected"
-msgstr ""
-"Zoomer sur l'objet sélectionné\n"
-"ou sur tous les objets sur la scène, si aucun n'est sélectionné"
-
-#: src/libslic3r/PrintConfig.cpp:207 src/libslic3r/PrintConfig.cpp:780
-#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1650
-#: src/libslic3r/PrintConfig.cpp:1894 src/libslic3r/PrintConfig.cpp:2049
-#: src/libslic3r/PrintConfig.cpp:2247 src/libslic3r/PrintConfig.cpp:2727
-#: src/libslic3r/PrintConfig.cpp:2848
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:176
+msgid "Zoom to selected object\nor all objects in scene, if none selected"
+msgstr "Zoomer sur l'objet sélectionné\nou sur tous les objets sur la scène, si aucun n'est sélectionné"
+
+#: src/libslic3r/PrintConfig.cpp:241 src/libslic3r/PrintConfig.cpp:816
+#: src/libslic3r/PrintConfig.cpp:1748 src/libslic3r/PrintConfig.cpp:1758
+#: src/libslic3r/PrintConfig.cpp:2036 src/libslic3r/PrintConfig.cpp:2191
+#: src/libslic3r/PrintConfig.cpp:2390 src/libslic3r/PrintConfig.cpp:2891
+#: src/libslic3r/PrintConfig.cpp:3012
msgid "°"
msgstr "°"
-#: src/slic3r/GUI/ConfigWizard.cpp:1038 src/slic3r/GUI/ConfigWizard.cpp:1052
+#: src/slic3r/GUI/ConfigWizard.cpp:1404 src/slic3r/GUI/ConfigWizard.cpp:1418
+#: src/libslic3r/PrintConfig.cpp:180 src/libslic3r/PrintConfig.cpp:912
+#: src/libslic3r/PrintConfig.cpp:956 src/libslic3r/PrintConfig.cpp:2209
msgid "°C"
msgstr "°C"
diff --git a/resources/localization/it/PrusaSlicer.mo b/resources/localization/it/PrusaSlicer.mo
index cb07f0949..7e669c910 100644
--- a/resources/localization/it/PrusaSlicer.mo
+++ b/resources/localization/it/PrusaSlicer.mo
Binary files differ
diff --git a/resources/localization/it/PrusaSlicer_it.po b/resources/localization/it/PrusaSlicer_it.po
index 9cb5960b9..8ece653ea 100644
--- a/resources/localization/it/PrusaSlicer_it.po
+++ b/resources/localization/it/PrusaSlicer_it.po
@@ -7,75 +7,86 @@ msgstr ""
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"X-Generator: PhraseApp (phraseapp.com)\n"
-#: src/slic3r/GUI/MainFrame.cpp:66
-msgid " - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/releases"
-msgstr " - Ricordati di controllare gli aggiornamenti su http://github.com/prusa3d/PrusaSlicer/releases"
-
-#: src/slic3r/GUI/MainFrame.cpp:872
-msgid " was successfully sliced."
-msgstr " generato con successo."
-
-#: src/libslic3r/PrintConfig.cpp:215 src/libslic3r/PrintConfig.cpp:792
-#: src/libslic3r/PrintConfig.cpp:1219 src/libslic3r/PrintConfig.cpp:1282
-#: src/libslic3r/PrintConfig.cpp:1532 src/libslic3r/PrintConfig.cpp:2425
-#: src/libslic3r/PrintConfig.cpp:2767
+#: src/slic3r/GUI/Tab.cpp:4124
+msgid "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\nTo enable \"%1%\", please switch off \"%2%\""
+msgstr "\"%1%\" è disattivato perchè \"%2%\" è nella categoria \"%3%\".\nPer attivare \"%1%\", si prega di spegnere \"%2%\""
+
+#: src/libslic3r/PrintConfig.cpp:249 src/libslic3r/PrintConfig.cpp:828
+#: src/libslic3r/PrintConfig.cpp:1148 src/libslic3r/PrintConfig.cpp:1327
+#: src/libslic3r/PrintConfig.cpp:1390 src/libslic3r/PrintConfig.cpp:1640
+#: src/libslic3r/PrintConfig.cpp:2568 src/libslic3r/PrintConfig.cpp:2805
+#: src/libslic3r/PrintConfig.cpp:2931
msgid "%"
msgstr "%"
-#: src/slic3r/GUI/GLCanvas3D.cpp:963
-#, possible-c-format
-msgid "%.2f - %.2f mm"
-msgstr "%.2f - %.2f mm"
-
#. TRN Remove/Delete
-#: src/slic3r/GUI/Tab.cpp:3126
+#: src/slic3r/GUI/Tab.cpp:3425
msgid "%1% Preset"
msgstr "%1% Preset"
-#: src/slic3r/GUI/Plater.cpp:4400
+#: src/slic3r/GUI/Plater.cpp:4423
msgid "%1% printer was active at the time the target Undo / Redo snapshot was taken. Switching to %1% printer requires reloading of %1% presets."
msgstr "La stampante %1% era attiva nel momento in cui è stata creata l'istantanea di Annulla / Ripeti dell'oggetto. Passare alla stampante %1% richiede il ricaricamento dei preset %1%."
-#: src/libslic3r/Print.cpp:1374
+#: src/slic3r/GUI/MainFrame.cpp:1585
+msgid "%1% was successfully sliced."
+msgstr "%1% generato con successo."
+
+#: src/libslic3r/Print.cpp:1400
msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm"
msgstr "%1%=%2% mm è troppo basso per essere un altezza layer stampabile %3% mm"
-#: src/slic3r/GUI/PresetHints.cpp:229
+#: src/slic3r/GUI/PresetHints.cpp:228
#, possible-c-format
msgid "%3.2f mm³/s at filament speed %3.2f mm/s."
msgstr "%3.2f mm³/s alla velocità del filamento di %3.2f mm/s."
-#: src/slic3r/GUI/Plater.cpp:1152
+#: src/slic3r/GUI/Plater.cpp:1061
#, possible-c-format
msgid "%d (%d shells)"
msgstr "%d (%d di perimetri)"
-#: src/slic3r/GUI/Plater.cpp:1160
+#: src/slic3r/GUI/Plater.cpp:1069
#, possible-c-format
msgid "%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d facets reversed, %d backwards edges"
msgstr "%d facce degenerate, %d spigoli riparati, %d facce rimosse, %d faccee aggiunte, %d facce invertite, %d spigoli inversi"
-#: src/slic3r/GUI/PresetHints.cpp:270
+#: src/slic3r/GUI/PresetHints.cpp:269
#, possible-c-format
msgid "%d lines: %.2f mm"
msgstr "%d linee: %.2f mm"
-#: src/slic3r/GUI/MainFrame.cpp:1027
+#: src/slic3r/GUI/MainFrame.cpp:1728
#, possible-c-format
msgid "%d presets successfully imported."
msgstr "%d preset importati correttamente."
-#: src/slic3r/GUI/MainFrame.cpp:692
+#: src/slic3r/GUI/GUI_App.cpp:718
+#, possible-c-format
+msgid "%s\nDo you want to continue?"
+msgstr "%s\nVuoi continuare?"
+
+#: src/slic3r/GUI/MainFrame.cpp:917 src/slic3r/GUI/MainFrame.cpp:1316
#, possible-c-format
msgid "%s &Website"
-msgstr "%s Sito &Web"
+msgstr "Sito &Web %s"
+
+#: src/slic3r/GUI/GUI_App.cpp:394
+#, possible-c-format
+msgid "%s - BREAKING CHANGE"
+msgstr "%s - BREAKING CHANGE"
+
+#: src/slic3r/GUI/Plater.cpp:1410
+#, possible-c-format
+msgid "%s - Drop project file"
+msgstr "%s - Rilascia file progetto"
#: src/slic3r/GUI/UpdateDialogs.cpp:211
#, possible-c-format
msgid "%s configuration is incompatible"
msgstr "configurazione %s non compatibile"
-#: src/slic3r/GUI/Field.cpp:175
+#: src/slic3r/GUI/Field.cpp:223
#, possible-c-format
msgid "%s doesn't support percentage"
msgstr "%s non supporta la percentuale"
@@ -85,7 +96,7 @@ msgstr "%s non supporta la percentuale"
msgid "%s error"
msgstr "errore %s"
-#: src/slic3r/GUI/ConfigWizard.cpp:481
+#: src/slic3r/GUI/ConfigWizard.cpp:499
#, possible-c-format
msgid "%s Family"
msgstr "Famiglia %s"
@@ -95,17 +106,17 @@ msgstr "Famiglia %s"
msgid "%s has encountered an error"
msgstr "%s ha riscontrato un errore"
-#: src/slic3r/GUI/GUI_App.cpp:138
+#: src/slic3r/GUI/GUI_App.cpp:528
#, possible-c-format
msgid "%s has encountered an error. It was likely caused by running out of memory. If you are sure you have enough RAM on your system, this may also be a bug and we would be glad if you reported it.\n\nThe application will now terminate."
msgstr "%s ha riscontrato un errore. Probabilmente è stato causato dalla memoria piena. Se sei sicuro di avere abbastanza RAM nel sistema, questo potrebbe essere un bug e te ne saremmo grati se potessi informarci.\n\nL'applicazione verrà chiusa."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:222
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:62
#, possible-c-format
msgid "%s has encountered an error. It was likely caused by running out of memory. If you are sure you have enough RAM on your system, this may also be a bug and we would be glad if you reported it."
msgstr "%s ha riscontrato un errore. Probabilmente è stato causato dalla memoria piena. Se sei sicuro di avere abbastanza RAM nel sistema, questo potrebbe essere un bug e te ne saremmo grati se potessi informarci."
-#: src/slic3r/GUI/UpdateDialogs.cpp:308
+#: src/slic3r/GUI/UpdateDialogs.cpp:309
#, possible-c-format
msgid "%s has no configuration updates available."
msgstr "Non sono disponibili aggiornamenti di configurazione per %s."
@@ -120,7 +131,7 @@ msgstr "incompatibilità %s"
msgid "%s now uses an updated configuration structure.\n\nSo called 'System presets' have been introduced, which hold the built-in default settings for various printers. These System presets cannot be modified, instead, users now may create their own presets inheriting settings from one of the System presets.\nAn inheriting preset may either inherit a particular value from its parent or override it with a customized value.\n\nPlease proceed with the %s that follows to set up the new presets and to choose whether to enable automatic preset updates."
msgstr "%s adesso utilizza uno schema aggiornato di configurazioni.\n\nSono stati introdotti i così detti 'Preset di sistema', che contengono i settaggi integrati predefiniti per varie stampanti. Questi preset di sistema non possono essere modificati, però l'utente può creare i propri preset ereditando le impostazioni da quelli di sistema.\nUn preset ereditato può sia ereditare un valore particolare dal genitore, o sovrascriverlo con un valore personalizzato.\n\nSi prega di procedere con il %s che segue per impostare i nuovi preset e scegliere se abilitare gli aggiornamenti automatici del preset."
-#: src/slic3r/GUI/GUI_App.cpp:820
+#: src/slic3r/GUI/GUI_App.cpp:1512
#, possible-c-format
msgid "%s View Mode"
msgstr "%s Modalità Visualizzazione"
@@ -130,218 +141,263 @@ msgstr "%s Modalità Visualizzazione"
msgid "%s will now start updates. Otherwise it won't be able to start.\n\nNote that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n\nUpdated configuration bundles:"
msgstr "%s avvierà gli aggiornamenti. In caso contrario non sarà in grado di avviarsi.\n\nSi fa noto che prima verrà creata un'istantanea della configurazione completa. Questa potrà essere ripristinata in qualunque momento se dovesse esserci un problema con la nuova versione.\n\nPacchetti di configurazione aggiornati:"
-#: src/slic3r/GUI/MainFrame.cpp:705
+#: src/slic3r/GUI/MainFrame.cpp:933 src/slic3r/GUI/MainFrame.cpp:937
+#: src/slic3r/GUI/MainFrame.cpp:1329
#, possible-c-format
msgid "&About %s"
msgstr "Inform&azioni su %s"
-#: src/slic3r/GUI/GUI_App.cpp:908
+#: src/slic3r/GUI/MainFrame.cpp:1297
+msgid "&Collapse sidebar"
+msgstr "Ridu&ci barra laterale"
+
+#: src/slic3r/GUI/GUI_App.cpp:1645
msgid "&Configuration"
msgstr "&Configurazione"
-#: src/slic3r/GUI/GUI_App.cpp:800
+#: src/slic3r/GUI/GUI_App.cpp:1480
msgid "&Configuration Snapshots"
msgstr "Istantanee di &Configurazione"
-#: src/slic3r/GUI/MainFrame.cpp:588
+#: src/slic3r/GUI/MainFrame.cpp:1194
msgid "&Copy"
msgstr "&Copia"
-#: src/slic3r/GUI/MainFrame.cpp:572
+#: src/slic3r/GUI/MainFrame.cpp:1178
msgid "&Delete selected"
msgstr "Eli&mina selezionati"
-#: src/slic3r/GUI/MainFrame.cpp:722
+#: src/slic3r/GUI/MainFrame.cpp:1348 src/slic3r/GUI/MainFrame.cpp:1358
msgid "&Edit"
msgstr "&Modifiche"
-#: src/slic3r/GUI/MainFrame.cpp:506
+#: src/slic3r/GUI/MainFrame.cpp:1103
msgid "&Export"
msgstr "&Esporta"
-#: src/slic3r/GUI/MainFrame.cpp:617 src/slic3r/GUI/MainFrame.cpp:752
+#: src/slic3r/GUI/MainFrame.cpp:1224 src/slic3r/GUI/MainFrame.cpp:1451
msgid "&Filament Settings Tab"
msgstr "Impostazioni &Filamento"
-#: src/slic3r/GUI/MainFrame.cpp:721
+#: src/slic3r/GUI/MainFrame.cpp:1347 src/slic3r/GUI/MainFrame.cpp:1357
+#: src/slic3r/GUI/MainFrame.cpp:1417
msgid "&File"
msgstr "&File"
-#: src/slic3r/GUI/ConfigWizard.cpp:1981
+#: src/slic3r/GUI/ConfigWizard.cpp:2492
msgid "&Finish"
msgstr "&Completa"
-#: src/slic3r/GUI/MainFrame.cpp:727
+#: src/slic3r/GUI/MainFrame.cpp:1141
+msgid "&G-code preview"
+msgstr "Anteprima &G-code"
+
+#: src/slic3r/GUI/MainFrame.cpp:1353 src/slic3r/GUI/MainFrame.cpp:1363
+#: src/slic3r/GUI/MainFrame.cpp:1423
msgid "&Help"
msgstr "&Aiuto"
-#: src/slic3r/GUI/MainFrame.cpp:474
+#: src/slic3r/GUI/MainFrame.cpp:1065
msgid "&Import"
msgstr "&Importa"
-#: src/slic3r/GUI/GUI_App.cpp:822
+#: src/slic3r/GUI/GUI_App.cpp:1517
msgid "&Language"
msgstr "&Lingua"
-#: src/slic3r/GUI/MainFrame.cpp:405
+#: src/slic3r/GUI/MainFrame.cpp:986
msgid "&New Project"
msgstr "&Nuovo progetto"
-#: src/slic3r/GUI/ConfigWizard.cpp:1980
+#: src/slic3r/GUI/ConfigWizard.cpp:2491
msgid "&Next >"
msgstr "&Successivo>"
-#: src/slic3r/GUI/MainFrame.cpp:408
+#: src/slic3r/GUI/MainFrame.cpp:1391
+msgid "&Open G-code"
+msgstr "Apri G-code"
+
+#: src/slic3r/GUI/MainFrame.cpp:989
msgid "&Open Project"
msgstr "Apri Pr&ogetto"
-#: src/slic3r/GUI/MainFrame.cpp:591
+#: src/slic3r/GUI/MainFrame.cpp:1197
msgid "&Paste"
msgstr "I&ncolla"
-#: src/slic3r/GUI/MainFrame.cpp:606
+#: src/slic3r/GUI/MainFrame.cpp:1216
msgid "&Plater Tab"
msgstr "&Piano"
-#: src/slic3r/GUI/GUI_App.cpp:804
+#: src/slic3r/GUI/GUI_App.cpp:1487
msgid "&Preferences"
msgstr "&Preferenze"
-#: src/slic3r/GUI/MainFrame.cpp:540
+#: src/slic3r/GUI/MainFrame.cpp:1144 src/slic3r/GUI/MainFrame.cpp:1402
msgid "&Quit"
msgstr "Es&ci"
-#: src/slic3r/GUI/MainFrame.cpp:583
+#: src/slic3r/GUI/MainFrame.cpp:1189
msgid "&Redo"
msgstr "&Ripeti"
-#: src/slic3r/GUI/MainFrame.cpp:536
+#: src/slic3r/GUI/MainFrame.cpp:1137
msgid "&Repair STL file"
msgstr "&Ripara file STL"
-#: src/slic3r/GUI/MainFrame.cpp:446
+#: src/slic3r/GUI/MainFrame.cpp:1028
msgid "&Save Project"
msgstr "&Salva Progetto"
-#: src/slic3r/GUI/MainFrame.cpp:565
+#: src/slic3r/GUI/MainFrame.cpp:1171
msgid "&Select all"
msgstr "&Seleziona tutto"
-#: src/slic3r/GUI/MainFrame.cpp:580
+#: src/slic3r/GUI/MainFrame.cpp:1186
msgid "&Undo"
msgstr "Ann&ulla"
-#: src/slic3r/GUI/MainFrame.cpp:724
+#: src/slic3r/GUI/MainFrame.cpp:1350 src/slic3r/GUI/MainFrame.cpp:1360
+#: src/slic3r/GUI/MainFrame.cpp:1418
msgid "&View"
msgstr "&Vista"
-#: src/slic3r/GUI/MainFrame.cpp:723
+#: src/slic3r/GUI/MainFrame.cpp:1349 src/slic3r/GUI/MainFrame.cpp:1359
msgid "&Window"
msgstr "Fines&tra"
-#: src/slic3r/GUI/ConfigWizard.cpp:603 src/slic3r/GUI/ConfigWizard.cpp:631
+#: src/slic3r/GUI/ConfigWizard.cpp:662 src/slic3r/GUI/ConfigWizard.cpp:812
+#: src/slic3r/GUI/ConfigWizard.cpp:873 src/slic3r/GUI/ConfigWizard.cpp:1007
msgid "(All)"
msgstr "(Tutto)"
-#: src/libslic3r/PrintConfig.cpp:1446
+#: src/slic3r/GUI/Plater.cpp:1195
+msgid "(including spool)"
+msgstr "(bobina inclusa)"
+
+#: src/libslic3r/PrintConfig.cpp:1554
msgid "(minimum)"
msgstr "(minimo)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:116
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:109
msgid "(Re)slice"
msgstr "(Ri)processa"
-#: src/slic3r/GUI/MainFrame.cpp:532
+#: src/slic3r/GUI/MainFrame.cpp:1133
msgid "(Re)Slice No&w"
msgstr "(Re)Sli&ce Ora"
-#: src/libslic3r/PrintConfig.cpp:771 src/libslic3r/PrintConfig.cpp:2587
+#: src/libslic3r/PrintConfig.cpp:807 src/libslic3r/PrintConfig.cpp:2730
msgid "(Unknown)"
msgstr "(Sconosciuto)"
-#: src/slic3r/GUI/MainFrame.cpp:790
+#: src/slic3r/GUI/MainFrame.cpp:1491
msgid ") not found."
msgstr ") non trovato."
-#: src/libslic3r/PrintConfig.cpp:1918
+#: src/libslic3r/PrintConfig.cpp:1085
+msgid "0 (no open anchors)"
+msgstr "0 (nessun ancoraggio aperto)"
+
+#: src/libslic3r/PrintConfig.cpp:1107
+msgid "0 (not anchored)"
+msgstr "0 (non ancorato)"
+
+#: src/libslic3r/PrintConfig.cpp:2060
msgid "0 (soluble)"
msgstr "0 (solubile)"
-#: src/libslic3r/PrintConfig.cpp:1919
+#: src/libslic3r/PrintConfig.cpp:2061
msgid "0.2 (detachable)"
msgstr "0.2 (rimovibile)"
-#: src/slic3r/GUI/MainFrame.cpp:626
+#: src/libslic3r/PrintConfig.cpp:1090 src/libslic3r/PrintConfig.cpp:1112
+msgid "1000 (unlimited)"
+msgstr "1000 (illimitato)"
+
+#: src/slic3r/GUI/MainFrame.cpp:1234
msgid "3&D"
msgstr "3&D"
-#: src/slic3r/GUI/Plater.cpp:4097
+#: src/slic3r/GUI/Plater.cpp:4044
msgid "3D editor view"
msgstr "Vista modifica 3D"
-#: src/libslic3r/PrintConfig.cpp:851
+#: src/libslic3r/PrintConfig.cpp:889
msgid "3D Honeycomb"
msgstr "Nido d'ape 3D"
-#: src/slic3r/GUI/Mouse3DController.cpp:274
+#: src/slic3r/GUI/NotificationManager.hpp:318
+msgid "3D Mouse disconnected."
+msgstr "Mouse 3D disconnesso."
+
+#: src/slic3r/GUI/Mouse3DController.cpp:263
msgid "3Dconnexion settings"
msgstr "Impostazioni 3Dconnexion"
-#: src/slic3r/GUI/Plater.cpp:5038
+#: src/slic3r/GUI/Plater.cpp:5167
#, possible-c-format
msgid "3MF file exported to %s"
msgstr "File 3MF esportato in %s"
-#: src/slic3r/GUI/ConfigWizard.cpp:1979
+#: src/slic3r/GUI/ConfigWizard.cpp:2490
msgid "< &Back"
msgstr "< &Precedente"
-#: src/libslic3r/PrintConfig.cpp:287
+#: src/libslic3r/PrintConfig.cpp:321
msgid "A boolean expression using the configuration values of an active print profile. If this expression evaluates to true, this profile is considered compatible with the active print profile."
msgstr "Un'espressione booleana che usa i valori di configurazione di un profilo di stampa attivo. Se questa espressione produce un risultato vero, questo profilo si considera compatibile con il profilo stampante attivo."
-#: src/libslic3r/PrintConfig.cpp:272
+#: src/libslic3r/PrintConfig.cpp:306
msgid "A boolean expression using the configuration values of an active printer profile. If this expression evaluates to true, this profile is considered compatible with the active printer profile."
msgstr "Un'espressione booleana che usa i valori di configurazione di un profilo stampante attivo. Se questa espressione produce un risultato vero, questo profilo si considera compatibile con il profilo stampante attivo."
-#: src/slic3r/GUI/Tab.cpp:975
+#: src/slic3r/GUI/Tab.cpp:1237
msgid "A copy of the current system preset will be created, which will be detached from the system preset."
msgstr "Verrà creata una copia del preset di sistema corrente, e verrà distaccata dal preset di sistema."
-#: src/slic3r/GUI/ConfigWizard.cpp:1034
+#: src/slic3r/GUI/ConfigWizard.cpp:1400
msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS."
msgstr "Una regola generale è da 160 a 230°C per il PLA, e da 215 a 250°C per l'ABS."
-#: src/slic3r/GUI/ConfigWizard.cpp:1048
+#: src/slic3r/GUI/ConfigWizard.cpp:1414
msgid "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have no heated bed."
msgstr "Una regola generale è 60°C per il PLA e 110°C per l'ABS. Lascia a zero se non hai un piano riscaldato."
-#: src/slic3r/GUI/GLCanvas3D.cpp:686
-msgid "A toolpath outside the print area was detected"
-msgstr "È stato rilevato un percorso al di fuori dell'area di stampa"
+#: src/slic3r/GUI/GLCanvas3D.cpp:634
+msgid "A toolpath outside the print area was detected."
+msgstr "È stato rilevato un percorso fuori dall'area di stampa."
-#: src/slic3r/GUI/AboutDialog.cpp:199
+#: src/slic3r/GUI/AboutDialog.cpp:212 src/slic3r/GUI/AboutDialog.cpp:215
#, possible-c-format
msgid "About %s"
msgstr "Informazioni su %s"
-#: src/slic3r/GUI/GLCanvas3D.cpp:959
-#, possible-c-format
-msgid "above %.2f mm"
-msgstr "sopra %.2f mm"
+#: src/slic3r/GUI/GCodeViewer.cpp:2189
+msgid "above"
+msgstr "sopra"
-#: src/libslic3r/PrintConfig.cpp:1569
+#: src/libslic3r/PrintConfig.cpp:1677
msgid "Above Z"
msgstr "Z Sopra"
-#: src/slic3r/GUI/Tab.cpp:1164
+#: src/slic3r/GUI/Tab.cpp:1494
msgid "Acceleration control (advanced)"
msgstr "Controllo Accelerazione (avanzato)"
-#: src/libslic3r/PrintConfig.cpp:2925
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:221
+#: src/libslic3r/PrintConfig.cpp:3089
msgid "Accuracy"
msgstr "Precisione"
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:59
+msgid "Accurate"
+msgstr "Precisa"
+
+#: src/slic3r/GUI/Plater.cpp:1423
+msgid "Action"
+msgstr "Azione"
+
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78
msgid "Activate"
msgstr "Attiva"
@@ -350,67 +406,75 @@ msgstr "Attiva"
msgid "Active"
msgstr "Attivo"
-#: src/slic3r/GUI/DoubleSlider.cpp:1135 src/slic3r/GUI/GUI_ObjectList.cpp:1705
+#: src/slic3r/GUI/DoubleSlider.cpp:1264 src/slic3r/GUI/GUI_ObjectList.cpp:1833
msgid "active"
msgstr "attivo"
-#: src/slic3r/GUI/GLCanvas3D.cpp:267
+#: src/slic3r/GUI/GLCanvas3D.cpp:254
msgid "Adaptive"
msgstr "Adattivo"
-#: src/slic3r/GUI/Tab.cpp:241
-msgid "Add a new printer"
-msgstr "Aggiungi una nuova stampante"
+#: src/libslic3r/PrintConfig.cpp:894
+msgid "Adaptive Cubic"
+msgstr "Adattivo Cubico"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:314
+msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\""
+msgstr "Aggiunge \"%1%\" come prossimo preset per la stampante fisica \"%2%\""
-#: src/libslic3r/PrintConfig.cpp:2782
+#: src/libslic3r/PrintConfig.cpp:2946
msgid "Add a pad underneath the supported model"
msgstr "Aggiungi un pad sotto il modello supportato"
-#: src/libslic3r/PrintConfig.cpp:2058
+#: src/libslic3r/PrintConfig.cpp:2200
msgid "Add a sheath (a single perimeter line) around the base support. This makes the support more reliable, but also more difficult to remove."
msgstr "Aggiunge un contorno (una singola linea di perimetro) attorno alla base del supporto. Questo rende il supporto più affidabile, ma anche più difficile da rimuovere."
-#: src/slic3r/GUI/DoubleSlider.cpp:991
+#: src/slic3r/GUI/DoubleSlider.cpp:1114
msgid "Add another code - Ctrl + Left click"
msgstr "Aggiungi altro codice - Ctrl + Clic sinistro"
-#: src/slic3r/GUI/DoubleSlider.cpp:992
+#: src/slic3r/GUI/DoubleSlider.cpp:1115
msgid "Add another code - Right click"
msgstr "Aggiungi un altro codice - Clic destro"
-#: src/slic3r/GUI/DoubleSlider.cpp:1477
+#: src/slic3r/GUI/DoubleSlider.cpp:1665
msgid "Add color change"
msgstr "Aggiungi cambio colore"
-#: src/slic3r/GUI/DoubleSlider.cpp:1180
+#: src/slic3r/GUI/DoubleSlider.cpp:1307
msgid "Add color change (%1%) for:"
msgstr "Aggiungi cambio colore (%1%) per:"
-#: src/slic3r/GUI/DoubleSlider.cpp:988
+#: src/slic3r/GUI/DoubleSlider.cpp:1111
msgid "Add color change - Left click"
msgstr "Aggiungi cambio colore - Clic sinistro"
-#: src/slic3r/GUI/DoubleSlider.cpp:986
+#: src/slic3r/GUI/DoubleSlider.cpp:1109
msgid "Add color change - Left click for predefined color or Shift + Left click for custom color selection"
msgstr "Aggiungi cambio colore - Clic sinistro per colore predefinito o Maiusc + Clic sinistro per selezione personalizzata del colore"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
msgid "Add color change marker for current layer"
msgstr "Aggiungi un segnale di cambio colore al layer corrente"
-#: src/slic3r/GUI/DoubleSlider.cpp:1490
+#: src/slic3r/GUI/DoubleSlider.cpp:1682
msgid "Add custom G-code"
msgstr "Aggiungi un G-code personalizzato"
-#: src/slic3r/GUI/GLCanvas3D.cpp:240
+#: src/slic3r/GUI/DoubleSlider.cpp:1679
+msgid "Add custom template"
+msgstr "Aggiungi un modello personalizzato"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:235
msgid "Add detail"
msgstr "Aggiungi dettagli"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:421
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:308
msgid "Add drainage hole"
msgstr "Aggiungi foro di drenaggio"
-#: src/slic3r/GUI/DoubleSlider.cpp:984
+#: src/slic3r/GUI/DoubleSlider.cpp:1107
msgid "Add extruder change - Left click"
msgstr "Aggiungi cambio estrusore - Clic sinistro"
@@ -418,30 +482,30 @@ msgstr "Aggiungi cambio estrusore - Clic sinistro"
msgid "Add extruder to sequence"
msgstr "Aggiungi estrusore alla sequenza"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1993
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2152
msgid "Add Generic Subobject"
msgstr "Aggiungi sotto-oggetto generico"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2896
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2925
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2943
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3297
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3325
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3345
msgid "Add Height Range"
msgstr "Aggiungi Intervallo Altezza"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4526 src/slic3r/GUI/Plater.cpp:3788
-#: src/slic3r/GUI/Plater.cpp:3800 src/slic3r/GUI/Plater.cpp:3940
+#: src/slic3r/GUI/GLCanvas3D.cpp:4892 src/slic3r/GUI/Plater.cpp:3708
+#: src/slic3r/GUI/Plater.cpp:3720 src/slic3r/GUI/Plater.cpp:3858
msgid "Add instance"
msgstr "Aggiungi istanza"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:159
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:153
msgid "Add Instance of the selected object"
msgstr "Aggiungi istanza all'oggetto selezionato"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:162
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:165
msgid "Add layer range"
msgstr "Aggiungi intervallo layer"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2328
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2692
msgid "Add Layers"
msgstr "Aggiungi layer"
@@ -449,12 +513,12 @@ msgstr "Aggiungi layer"
msgid "Add modifier"
msgstr "Aggiungi modificatore"
-#: src/libslic3r/PrintConfig.cpp:479
-#, no-c-format
+#: src/libslic3r/PrintConfig.cpp:515
+#, possible-c-format
msgid "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r keeps adding perimeters, until more than 70% of the loop immediately above is supported."
msgstr "Aggiunge più perimetri quando necessario per evitare spazi tra i perimetri inclinati. Slic3r continua ad aggiungere perimetri fino a quando almeno il 70% del giro immediatamente sopra sarà supportato."
-#: src/slic3r/GUI/Plater.cpp:3940
+#: src/slic3r/GUI/Plater.cpp:3858
msgid "Add one more instance of the selected object"
msgstr "Aggiungi un'altra istanza dell'oggetto selezionato"
@@ -462,52 +526,61 @@ msgstr "Aggiungi un'altra istanza dell'oggetto selezionato"
msgid "Add part"
msgstr "Aggiungi parte"
-#: src/slic3r/GUI/DoubleSlider.cpp:1487
+#: src/slic3r/GUI/DoubleSlider.cpp:1675
msgid "Add pause print"
msgstr "Aggiungi pausa di stampa"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363
+#: src/slic3r/GUI/PresetComboBoxes.cpp:627
+#: src/slic3r/GUI/PresetComboBoxes.cpp:674
+msgid "Add physical printer"
+msgstr "Aggiungi stampante fisica"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210
msgid "Add point"
msgstr "Aggiungi punto"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213
msgid "Add point to selection"
msgstr "Aggiungi punto alla selezione"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1509
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:180
+msgid "Add preset for this printer device"
+msgstr "Aggiungi preset per questa stampante"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1640
msgid "Add settings"
msgstr "Aggiungi impostazioni"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1386
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1517
msgid "Add Settings Bundle for Height range"
msgstr "Aggiungi Gruppo impostazioni per intervallo Altezza"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1388
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1519
msgid "Add Settings Bundle for Object"
msgstr "Aggiungi gruppo di impostazioni per l'oggetto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1387
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1518
msgid "Add Settings Bundle for Sub-object"
msgstr "Aggiungi Gruppi di Impostazioni per il sotto-progetto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1314
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1445
msgid "Add Settings for Layers"
msgstr "Aggiungi impostazioni per i layer"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1316
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1447
msgid "Add Settings for Object"
msgstr "Aggiungi impostazioni per l'oggetto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1315
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1446
msgid "Add Settings for Sub-object"
msgstr "Aggiungi impostazioni per il sotto-oggetto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1793
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2051
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1953
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2210
msgid "Add Shape"
msgstr "Aggiungi Forma"
-#: src/libslic3r/PrintConfig.cpp:409
+#: src/libslic3r/PrintConfig.cpp:443
msgid "Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top+bottom solid layers)."
msgstr "Aggiunge un riempimento solido vicino le superfici inclinate per garantire lo spessore verticale (layer solidi superiore + inferiore)"
@@ -519,11 +592,19 @@ msgstr "Aggiungi blocco supporto"
msgid "Add support enforcer"
msgstr "Aggiungi rinforzo supporto"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:494
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:374
msgid "Add support point"
msgstr "Aggiungi punto di supporto"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4467
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:371
+msgid "Add supports"
+msgstr "Aggiungi supporti"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:293
+msgid "Add supports by angle"
+msgstr "Aggiungi supporti all'angolo"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4833
msgid "Add..."
msgstr "Aggiungi..."
@@ -531,23 +612,29 @@ msgstr "Aggiungi..."
msgid "Add/Remove filaments"
msgstr "Aggiungi/Rimuovi filamenti"
-#: src/slic3r/GUI/Preset.cpp:1201
+#: src/slic3r/GUI/PresetComboBoxes.cpp:813
msgid "Add/Remove materials"
msgstr "Aggiungi/Rimuovi materiali"
-#: src/slic3r/GUI/Preset.cpp:1203
+#: src/slic3r/GUI/PresetComboBoxes.cpp:622
+#: src/slic3r/GUI/PresetComboBoxes.cpp:669
+msgid "Add/Remove presets"
+msgstr "Aggiungi/Rimuovi preset"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:815
+#: src/slic3r/GUI/PresetComboBoxes.cpp:972
msgid "Add/Remove printers"
msgstr "Aggiungi/Rimuovi stampanti"
-#: src/slic3r/GUI/Tab.cpp:970
+#: src/slic3r/GUI/Tab.cpp:1288
msgid "Additional information:"
msgstr "Informazioni aggiuntive:"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:59
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:62
msgid "Additional Settings"
msgstr "Impostazioni Aggiuntive"
-#: src/slic3r/GUI/ConfigWizard.cpp:791
+#: src/slic3r/GUI/ConfigWizard.cpp:1150
msgid "Additionally a backup snapshot of the whole configuration is created before an update is applied."
msgstr "Inoltre viene generata una copia di backup dei preset prima di applicare un aggiornamento."
@@ -555,23 +642,22 @@ msgstr "Inoltre viene generata una copia di backup dei preset prima di applicare
msgid "Address"
msgstr "Indirizzo"
-#: src/slic3r/GUI/GUI_App.cpp:814 src/slic3r/GUI/GUI_ObjectList.cpp:104
-#: src/slic3r/GUI/GUI_ObjectList.cpp:622 src/slic3r/GUI/Tab.cpp:1087
-#: src/slic3r/GUI/Tab.cpp:1102 src/slic3r/GUI/Tab.cpp:1201
-#: src/slic3r/GUI/Tab.cpp:1204 src/slic3r/GUI/Tab.cpp:1470
-#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:3661
-#: src/slic3r/GUI/wxExtensions.cpp:754 src/libslic3r/PrintConfig.cpp:88
-#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:223
-#: src/libslic3r/PrintConfig.cpp:1037 src/libslic3r/PrintConfig.cpp:2276
-#: src/libslic3r/PrintConfig.cpp:2448
+#: src/slic3r/GUI/GUI_ObjectList.cpp:102 src/slic3r/GUI/GUI_ObjectList.cpp:661
+#: src/slic3r/GUI/Tab.cpp:1409 src/slic3r/GUI/Tab.cpp:1430
+#: src/slic3r/GUI/Tab.cpp:1531 src/slic3r/GUI/Tab.cpp:1534
+#: src/slic3r/GUI/Tab.cpp:1816 src/slic3r/GUI/Tab.cpp:2152
+#: src/slic3r/GUI/Tab.cpp:4080 src/libslic3r/PrintConfig.cpp:90
+#: src/libslic3r/PrintConfig.cpp:121 src/libslic3r/PrintConfig.cpp:257
+#: src/libslic3r/PrintConfig.cpp:1081 src/libslic3r/PrintConfig.cpp:2419
+#: src/libslic3r/PrintConfig.cpp:2591
msgid "Advanced"
msgstr "Avanzate"
-#: src/slic3r/GUI/ConfigWizard.cpp:821
+#: src/slic3r/GUI/ConfigWizard.cpp:1180
msgid "Advanced mode"
msgstr "Modalità Avanzata"
-#: src/slic3r/GUI/GUI_App.cpp:814
+#: src/slic3r/GUI/GUI_App.cpp:1506
msgid "Advanced View Mode"
msgstr "Modalità Visualizzazione Avanzata"
@@ -579,120 +665,156 @@ msgstr "Modalità Visualizzazione Avanzata"
msgid "Advanced: Output log"
msgstr "Avanzato: Log di output"
-#: src/libslic3r/PrintConfig.cpp:668
+#: src/libslic3r/PrintConfig.cpp:704
msgid "After a tool change, the exact position of the newly loaded filament inside the nozzle may not be known, and the filament pressure is likely not yet stable. Before purging the print head into an infill or a sacrificial object, Slic3r will always prime this amount of material into the wipe tower to produce successive infill or sacrificial object extrusions reliably."
msgstr "Dopo un cambio di attrezzo, l'esatta posizione del filamento appena caricato dentro l'ugello potrebbe essere sconosciuta, e la pressione del filamento probabilmente non è ancora stabile. Prima di spurgare la testina di stampa nel riempimento o in un oggetto sacrificale, Slic3r posizionerà questo materiale in una torre di spurgo al fine di ottenere una successiva estrusione affidabile su oggetto sacrificale o riempimento."
-#: src/slic3r/GUI/Tab.cpp:1994 src/libslic3r/PrintConfig.cpp:1080
+#: src/slic3r/GUI/Tab.cpp:2182 src/libslic3r/PrintConfig.cpp:1173
msgid "After layer change G-code"
msgstr "G-code dopo il cambio layer"
-#: src/libslic3r/PrintConfig.cpp:3398
+#: src/libslic3r/PrintConfig.cpp:3597
msgid "Align the model to the given point."
msgstr "Allinea il modello al punto dato."
-#: src/libslic3r/PrintConfig.cpp:3397
+#: src/libslic3r/PrintConfig.cpp:3596
msgid "Align XY"
msgstr "Allinea XY"
-#: src/libslic3r/PrintConfig.cpp:1631
+#: src/libslic3r/PrintConfig.cpp:1739
msgid "Aligned"
msgstr "Allineato"
-#: src/slic3r/GUI/ConfigWizard.cpp:290 src/slic3r/GUI/ConfigWizard.cpp:573
-#: src/slic3r/GUI/Tab.cpp:3174
+#: src/libslic3r/PrintConfig.cpp:470 src/libslic3r/PrintConfig.cpp:902
+msgid "Aligned Rectilinear"
+msgstr "Allineato Rettilineo "
+
+#: src/slic3r/GUI/ConfigWizard.cpp:308 src/slic3r/GUI/ConfigWizard.cpp:598
+#: src/slic3r/GUI/Tab.cpp:3507 src/slic3r/GUI/UnsavedChangesDialog.cpp:921
msgid "All"
msgstr "Tutto"
-#: src/libslic3r/Print.cpp:1219
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:197
+msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button"
+msgstr "Tutti i gizmos: Ruota - tasto destro del mouse; Panoramica - tasto destro del mouse"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:694
+msgid "All installed printers are compatible with the selected filament."
+msgstr "Tutte le stampanti installate sono compatibili con il filamento selezionato."
+
+#: src/libslic3r/Print.cpp:1245
msgid "All objects are outside of the print volume."
msgstr "Tutti gli oggetti sono fuori dal volume di stampa."
-#: src/slic3r/GUI/Plater.cpp:4669
+#: src/slic3r/GUI/Plater.cpp:4774
msgid "All objects will be removed, continue?"
msgstr "Saranno rimossi tutti gli oggetti, continuare?"
-#: src/slic3r/GUI/ConfigWizard.cpp:289
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:737
+msgid "All settings changes will be discarded."
+msgstr "Tutte le modifiche alle impostazioni verranno eliminate."
+
+#: src/libslic3r/PrintConfig.cpp:1212
+msgid "All solid surfaces"
+msgstr "Tutte le superfici solide"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:307
msgid "All standard"
msgstr "Tutto standard"
-#: src/libslic3r/Zipper.cpp:62
+#: src/libslic3r/PrintConfig.cpp:1210
+msgid "All top surfaces"
+msgstr "Tutte le superfici superiori"
+
+#: src/libslic3r/miniz_extension.cpp:121
msgid "allocation failed"
msgstr "allocazione fallita"
-#: src/slic3r/GUI/Plater.cpp:3995
+#: src/slic3r/GUI/Preferences.cpp:161 src/slic3r/GUI/Preferences.cpp:165
+msgid "Allow just a single PrusaSlicer instance"
+msgstr "Permetti una singola istanza di PrusaSlicer"
+
+#: src/slic3r/GUI/Plater.cpp:3915
msgid "Along X axis"
msgstr "Lungo asse X"
-#: src/slic3r/GUI/Plater.cpp:3997
+#: src/slic3r/GUI/Plater.cpp:3917
msgid "Along Y axis"
msgstr "Lungo asse Y"
-#: src/slic3r/GUI/Plater.cpp:3999
+#: src/slic3r/GUI/Plater.cpp:3919
msgid "Along Z axis"
msgstr "Lungo l'asse Z"
-#: src/slic3r/GUI/ConfigWizard.cpp:222
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:160
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141
+msgid "Alt + Mouse wheel"
+msgstr "Alt + Rotella del mouse"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:240
msgid "Alternate nozzles:"
msgstr "Ugelli alternativi:"
-#: src/slic3r/GUI/Plater.cpp:5002
+#: src/slic3r/GUI/Preferences.cpp:163
+msgid "Always ask for unsaved changes when selecting new preset"
+msgstr "Chiedere sempre riguardo le modifiche non salvate quando si seleziona un nuovo preset"
+
+#: src/slic3r/GUI/Plater.cpp:5135
#, possible-c-format
msgid "AMF file exported to %s"
msgstr "File AMF esportato in %s"
-#: src/slic3r/GUI/GLCanvas3D.cpp:690
-msgid "An object outside the print area was detected\nResolve the current problem to continue slicing"
-msgstr "È stato rilevato un oggetto al di fuori dell'area di stampa\nRisolvere il problema per continuare lo slicing"
+#: src/slic3r/GUI/GLCanvas3D.cpp:638
+msgid "An object outside the print area was detected.\nResolve the current problem to continue slicing."
+msgstr "È stato rilevato un oggetto al di fuori dell'area di stampa.\nRisolvere il problema per continuare lo slicing."
-#: src/slic3r/GUI/GLCanvas3D.cpp:685
-msgid "An object outside the print area was detected"
-msgstr "È stato rilevato un oggetto al di fuori dell'area di stampa"
+#: src/slic3r/GUI/GLCanvas3D.cpp:633
+msgid "An object outside the print area was detected."
+msgstr "È stato rilevato un oggetto al di fuori dell'area di stampa."
-#: src/slic3r/GUI/Tab.cpp:2943
-msgid "and it has the following unsaved changes:"
-msgstr "e ha i seguenti cambiamenti non salvati:"
-
-#: src/slic3r/GUI/Plater.cpp:3170
+#: src/slic3r/GUI/Plater.cpp:2972
msgid "Another export job is currently running."
msgstr "Un altro processo di esportazione è in corso."
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:162
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
msgid "Any arrow"
msgstr "Qualunque freccia"
-#: src/slic3r/GUI/Tab.cpp:965
+#: src/slic3r/GUI/Tab.cpp:1283
msgid "Any modifications should be saved as a new preset inherited from this one."
msgstr "Qualunque modifica deve essere salvata come un nuovo preset ereditato da questo."
-#: src/libslic3r/PrintConfig.cpp:104
+#: src/libslic3r/PrintConfig.cpp:162
+msgid "API key"
+msgstr "Chiave API"
+
+#: src/libslic3r/PrintConfig.cpp:106
msgid "API Key / Password"
msgstr "Chiave API / Password"
-#: src/slic3r/GUI/GUI_App.cpp:810
+#: src/slic3r/GUI/GUI_App.cpp:1493
msgid "Application preferences"
msgstr "Preferenze applicazione"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1374
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221
msgid "Apply changes"
msgstr "Applica cambiamenti"
-#: src/libslic3r/PrintConfig.cpp:575 src/libslic3r/PrintConfig.cpp:1708
+#: src/libslic3r/PrintConfig.cpp:611 src/libslic3r/PrintConfig.cpp:1823
msgid "approximate seconds"
msgstr "secondi approssimativi"
-#: src/libslic3r/PrintConfig.cpp:428 src/libslic3r/PrintConfig.cpp:854
+#: src/libslic3r/PrintConfig.cpp:464 src/libslic3r/PrintConfig.cpp:892
msgid "Archimedean Chords"
msgstr "Corde di Archimede"
-#: src/libslic3r/Zipper.cpp:88
+#: src/libslic3r/miniz_extension.cpp:147
msgid "archive is too large"
msgstr "l'archivio è troppo grande"
-#. TRN remove/delete
-#: src/slic3r/GUI/Tab.cpp:3123
+#: src/slic3r/GUI/Tab.cpp:3420
msgid "Are you sure you want to %1% the selected preset?"
msgstr "Sei sicuro di voler %1% il preset selezionato?"
@@ -700,97 +822,141 @@ msgstr "Sei sicuro di voler %1% il preset selezionato?"
msgid "Are you sure you want to cancel firmware flashing?\nThis could leave your printer in an unusable state!"
msgstr "Sei sicuro di voler annullare il flash del firmware?\nQuesto potrebbe lasciare la tua stampante in una condizione inutilizzabile!"
-#: src/slic3r/GUI/DoubleSlider.cpp:1903 src/slic3r/GUI/DoubleSlider.cpp:1924
+#: src/slic3r/GUI/DoubleSlider.cpp:2122 src/slic3r/GUI/DoubleSlider.cpp:2142
msgid "Are you sure you want to continue?"
msgstr "Sei sicuro di voler continuare?"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269
+#: src/slic3r/GUI/Tab.cpp:3392
+msgid "Are you sure you want to delete \"%1%\" preset from the physical printer \"%2%\"?"
+msgstr "Sei sicuro di voler eliminare il preset \"%1%\" dalla stampante fisica \"%2%\"?"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:658
+msgid "Are you sure you want to delete \"%1%\" printer?"
+msgstr "Sicuro di voler eliminare la stampante \"%1%\"?"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1128
msgid "Are you sure you want to do it?"
msgstr "Sei sicuro di voler procedere?"
-#: src/libslic3r/PrintConfig.cpp:2423
+#: src/libslic3r/PrintConfig.cpp:2566
msgid "Area fill"
msgstr "Riempimento area"
-#: src/slic3r/GUI/Plater.cpp:641
+#: src/slic3r/GUI/Plater.cpp:507
msgid "Around object"
msgstr "Intorno all'oggetto"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:157
-#: src/slic3r/GUI/Plater.cpp:2754
+#: src/slic3r/GUI/GLCanvas3D.cpp:4859 src/slic3r/GUI/KBShortcutsDialog.cpp:151
+#: src/slic3r/GUI/Plater.cpp:1549
msgid "Arrange"
msgstr "Disponi"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:158
+#: src/slic3r/GUI/GLCanvas3D.cpp:3889
+msgid "Arrange options"
+msgstr "Opzioni di disposizione"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4859 src/slic3r/GUI/KBShortcutsDialog.cpp:152
msgid "Arrange selection"
msgstr "Disponi selezione"
-#: src/libslic3r/PrintConfig.cpp:3443
+#: src/libslic3r/PrintConfig.cpp:3642
msgid "Arrange the supplied models in a plate and merge them in a single model in order to perform actions once."
msgstr "Disponi i modelli su un piano e uniscili in un singolo modello al fine di effettuare le operazioni una singola volta."
-#: src/slic3r/GUI/Plater.cpp:2813
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:149
msgid "Arranging"
msgstr "Disponendo"
-#: src/slic3r/GUI/Plater.cpp:2841
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:182
msgid "Arranging canceled."
msgstr "Disposizione annullata."
-#: src/slic3r/GUI/Plater.cpp:2842
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:183
msgid "Arranging done."
msgstr "Disposizione completata."
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:159
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:206
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
msgid "Arrow Down"
msgstr "Freccia giù"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:160
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:229
msgid "Arrow Left"
msgstr "Freccia sinistra"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:161
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:230
msgid "Arrow Right"
msgstr "Freccia Destra"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:204
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:214
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:158
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
msgid "Arrow Up"
msgstr "Freccia Su"
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:290
+#: src/slic3r/GUI/GUI_App.cpp:246
+msgid "Artwork model by Nora Al-Badri and Jan Nikolai Nelles"
+msgstr "Modello grafico di Nora Al-Badri e Jan Nikolai Nelles"
+
+#: src/slic3r/GUI/OpenGLManager.cpp:265
msgid "As a workaround, you may run PrusaSlicer with a software rendered 3D graphics by running prusa-slicer.exe with the --sw_renderer parameter."
msgstr "Come soluzione alternativa, è possibile eseguire PrusaSlicer con una grafica 3D di rendering software eseguendo prusa-slicer.exe con il parametro --sw_renderer."
-#: src/slic3r/GUI/GUI_App.cpp:1086 src/slic3r/GUI/Plater.cpp:2313
-#: src/slic3r/GUI/Tab.cpp:2960
+#: src/slic3r/GUI/Preferences.cpp:154
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:659
+msgid "Ask for unsaved changes when closing application"
+msgstr "Chiedere riguardo le modifiche non salvate alla chiusura del programma"
+
+#: src/slic3r/GUI/Preferences.cpp:161
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:660
+msgid "Ask for unsaved changes when selecting new preset"
+msgstr "Chiedere riguardo le modifiche non salvate quando si seleziona un nuovo preset"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1183 src/slic3r/GUI/Preferences.cpp:91
+msgid "Associate .3mf files to PrusaSlicer"
+msgstr "Associa i file .3mf a PrusaSlicer"
+
+#: src/slic3r/GUI/Preferences.cpp:177
+msgid "Associate .gcode files to PrusaSlicer G-code Viewer"
+msgstr "Associa i file .gcode al Visualizzatore G-code di PrusaSlicer"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1184 src/slic3r/GUI/Preferences.cpp:98
+msgid "Associate .stl files to PrusaSlicer"
+msgstr "Associa i file .stl a PrusaSlicer"
+
+#: src/slic3r/GUI/GUI_App.cpp:1878 src/slic3r/GUI/Jobs/SLAImportJob.cpp:210
+#: src/slic3r/GUI/Plater.cpp:2256 src/slic3r/GUI/Tab.cpp:3189
msgid "Attention!"
msgstr "Attenzione!"
-#: src/libslic3r/PrintConfig.cpp:1871
+#: src/libslic3r/PrintConfig.cpp:150
+msgid "Authorization Type"
+msgstr "Tipo di autorizzazione"
+
+#: src/libslic3r/PrintConfig.cpp:2013
msgid "Auto generated supports"
msgstr "Supporti generati automaticamente"
-#: src/slic3r/GUI/Preferences.cpp:47
+#: src/slic3r/GUI/Preferences.cpp:64
msgid "Auto-center parts"
msgstr "Centra automaticamente le parti"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1377
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224
msgid "Auto-generate points"
msgstr "Genera punti automaticamente"
-#: src/slic3r/GUI/Plater.cpp:1157
+#: src/slic3r/GUI/Plater.cpp:1066
#, possible-c-format
msgid "Auto-repaired (%d errors)"
msgstr "Auto-riparati (%d errori)"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:339
+#: src/slic3r/GUI/GUI_ObjectList.cpp:386
#, possible-c-format
msgid "Auto-repaired (%d errors):"
msgstr "Auto-riparati (%d errori):"
@@ -799,59 +965,75 @@ msgstr "Auto-riparati (%d errori):"
msgid "Autodetected"
msgstr "Autorilevato"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1134
msgid "Autogenerate support points"
msgstr "Genera automaticamente punti di supporto"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1127
msgid "Autogeneration will erase all manually edited points."
msgstr "La generazione automatica cancellerà tutti i punti editati manualmente."
-#: src/slic3r/GUI/Tab.cpp:3632
+#: src/slic3r/GUI/Tab.cpp:4051
msgid "Automatic generation"
msgstr "Generazione automatica"
-#: src/slic3r/GUI/ConfigWizard.cpp:761
+#: src/slic3r/GUI/ConfigWizard.cpp:1120
msgid "Automatic updates"
msgstr "Aggiornamenti automatici"
-#: src/slic3r/GUI/MainFrame.cpp:536
+#: src/slic3r/GUI/MainFrame.cpp:1137
msgid "Automatically repair an STL file"
msgstr "Ripara automaticamente un file STL"
-#: src/slic3r/GUI/Tab.cpp:1171
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:129
+msgid "Autoset by angle"
+msgstr "Autoset ad angolo"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:233
+msgid "Autoset custom supports"
+msgstr "Autoset supporti personalizzati"
+
+#: src/slic3r/GUI/Tab.cpp:1501
msgid "Autospeed (advanced)"
msgstr "Autovelocità (avanzato)"
-#: src/libslic3r/PrintConfig.cpp:136
+#: src/libslic3r/PrintConfig.cpp:169
msgid "Avoid crossing perimeters"
msgstr "Evita incrocio perimetri"
-#: src/slic3r/GUI/Tab.cpp:3268
+#: src/libslic3r/PrintConfig.cpp:188
+msgid "Avoid crossing perimeters - Max detour length"
+msgstr "Evita incrocio perimetri - Lunghezza massima della deviazione"
+
+#: src/slic3r/GUI/Tab.cpp:3705
msgid "BACK ARROW"
msgstr "FRECCIA INDIETRO"
-#: src/slic3r/GUI/Tab.cpp:3290
+#: src/slic3r/GUI/Tab.cpp:3727
msgid "BACK ARROW icon indicates that the settings were changed and are not equal to the last saved preset for the current option group.\nClick to reset all settings for the current option group to the last saved preset."
msgstr "L'icona FRECCIA INDIETRO indica che le impostazioni sono state cambiate e non corrispondono all'ultimo preset salvato per il seguente gruppo di opzioni.\nClicca per reimpostare all'ultimo preset salvato tutte le impostazioni per il seguente gruppo di opzioni."
-#: src/slic3r/GUI/Tab.cpp:3304
+#: src/slic3r/GUI/Tab.cpp:3741
msgid "BACK ARROW icon indicates that the value was changed and is not equal to the last saved preset.\nClick to reset current value to the last saved preset."
msgstr "L'icona FRECCIA ALL'INDIETRO indica che il valore è stato cambiato e non corrisponde all'ultimo preset salvato.\nCliccare per reimpostare il valore corrente all'ultimo preset salvato."
-#: src/slic3r/GUI/Preferences.cpp:55
+#: src/slic3r/GUI/Preferences.cpp:72
msgid "Background processing"
msgstr "Elaborazione in background"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:351
+#: src/slic3r/GUI/GUI_ObjectList.cpp:398
msgid "backwards edges"
msgstr "spigoli invertiti"
-#: src/slic3r/GUI/MainFrame.cpp:174
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60
+msgid "Balanced"
+msgstr "Bilanciato"
+
+#: src/slic3r/GUI/MainFrame.cpp:535 src/slic3r/GUI/MainFrame.cpp:537
msgid "based on Slic3r"
msgstr "basato su Slic3r"
-#: src/slic3r/GUI/Tab.cpp:1439
+#: src/slic3r/GUI/Tab.cpp:1785
msgid "Bed"
msgstr "Piano"
@@ -863,7 +1045,7 @@ msgstr "Modello piano personalizzato"
msgid "Bed custom texture"
msgstr "Forma piano personalizzata"
-#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:929
+#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1295
msgid "Bed Shape"
msgstr "Forma Piano"
@@ -871,23 +1053,23 @@ msgstr "Forma Piano"
msgid "Bed shape"
msgstr "Forma piano"
-#: src/slic3r/GUI/ConfigWizard.cpp:929
+#: src/slic3r/GUI/ConfigWizard.cpp:1295
msgid "Bed Shape and Size"
msgstr "Forma e dimensioni del piano di stampa"
-#: src/libslic3r/PrintConfig.cpp:147
+#: src/libslic3r/PrintConfig.cpp:181
msgid "Bed temperature"
msgstr "Temperatura piano"
-#: src/libslic3r/PrintConfig.cpp:145
+#: src/libslic3r/PrintConfig.cpp:178
msgid "Bed temperature for layers after the first one. Set this to zero to disable bed temperature control commands in the output."
msgstr "Temperatura per i layer dopo il primo. Imposta a zero per disattivare i comandi di controllo della temperatura del piano di stampa in output."
-#: src/slic3r/GUI/ConfigWizard.cpp:1051
+#: src/slic3r/GUI/ConfigWizard.cpp:1417
msgid "Bed Temperature:"
msgstr "Temperatura piano di stampa:"
-#: src/slic3r/GUI/Tab.cpp:1988 src/libslic3r/PrintConfig.cpp:153
+#: src/slic3r/GUI/Tab.cpp:2175 src/libslic3r/PrintConfig.cpp:187
msgid "Before layer change G-code"
msgstr "G-code prima del cambio layer"
@@ -895,143 +1077,183 @@ msgstr "G-code prima del cambio layer"
msgid "Before roll back"
msgstr "Prima di tornare indietro"
-#: src/slic3r/GUI/Plater.cpp:640
+#: src/slic3r/GUI/Plater.cpp:506
msgid "Below object"
msgstr "Sotto l'oggetto"
-#: src/libslic3r/PrintConfig.cpp:1578
+#: src/libslic3r/PrintConfig.cpp:1686
msgid "Below Z"
msgstr "Z Sotto"
-#: src/libslic3r/PrintConfig.cpp:164
+#: src/libslic3r/PrintConfig.cpp:198
msgid "Between objects G-code"
msgstr "G-code tra gli oggetti"
-#: src/slic3r/GUI/Tab.cpp:2006
+#: src/slic3r/GUI/Tab.cpp:2196
msgid "Between objects G-code (for sequential printing)"
msgstr "G-code tra gli oggetti (per stampa sequenziale)"
-#: src/libslic3r/PrintConfig.cpp:2489 src/libslic3r/PrintConfig.cpp:2490
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242
+msgid "Block"
+msgstr "Blocco"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:383
+msgid "Block seam"
+msgstr "Blocca giunzione"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:373
+msgid "Block supports"
+msgstr "Blocca supporti"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:292
+msgid "Block supports by angle"
+msgstr "Blocca supporti all'angolo"
+
+#: src/libslic3r/PrintConfig.cpp:2632 src/libslic3r/PrintConfig.cpp:2633
msgid "Bottle volume"
msgstr "Volume bottiglia"
-#: src/libslic3r/PrintConfig.cpp:2496 src/libslic3r/PrintConfig.cpp:2497
+#: src/libslic3r/PrintConfig.cpp:2639 src/libslic3r/PrintConfig.cpp:2640
msgid "Bottle weight"
msgstr "Peso bottiglia"
#. TRN To be shown in the main menu View->Bottom
#. TRN To be shown in Print Settings "Bottom solid layers"
#. TRN To be shown in Print Settings "Top solid layers"
-#: src/slic3r/GUI/MainFrame.cpp:665 src/libslic3r/PrintConfig.cpp:174
-#: src/libslic3r/PrintConfig.cpp:183
+#: src/slic3r/GUI/MainFrame.cpp:962 src/slic3r/GUI/MainFrame.cpp:1282
+#: src/libslic3r/PrintConfig.cpp:208 src/libslic3r/PrintConfig.cpp:217
msgid "Bottom"
msgstr "Inferiore"
-#: src/libslic3r/PrintConfig.cpp:435
+#: src/libslic3r/PrintConfig.cpp:471
msgid "Bottom fill pattern"
msgstr "Trama riempimento inferiore"
-#: src/slic3r/GUI/PresetHints.cpp:342
+#: src/slic3r/GUI/PresetHints.cpp:340
msgid "Bottom is open."
msgstr "La parte inferiore è aperta."
-#: src/slic3r/GUI/PresetHints.cpp:336
+#: src/slic3r/GUI/PresetHints.cpp:334
msgid "Bottom shell is %1% mm thick for layer height %2% mm."
msgstr "Il guscio inferiore è spesso %1% mm per l'altezza layer %2% mm."
-#: src/libslic3r/PrintConfig.cpp:177
+#: src/libslic3r/PrintConfig.cpp:211
msgid "Bottom solid layers"
msgstr "Layer solidi sul fondo"
-#: src/slic3r/GUI/MainFrame.cpp:665
+#: src/slic3r/GUI/MainFrame.cpp:962 src/slic3r/GUI/MainFrame.cpp:1282
msgid "Bottom View"
msgstr "Vista inferiore"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1432
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1464
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1468
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1595
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1599
msgid "Box"
msgstr "Cubo"
-#: src/libslic3r/PrintConfig.cpp:193
+#: src/libslic3r/PrintConfig.cpp:227
msgid "Bridge"
msgstr "Bridge"
-#: src/libslic3r/PrintConfig.cpp:222
+#: src/libslic3r/PrintConfig.cpp:256
msgid "Bridge flow ratio"
msgstr "Rapporto flusso Bridge"
-#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:316
+#: src/slic3r/GUI/GUI_Preview.cpp:308 src/libslic3r/ExtrusionEntity.cpp:321
+#: src/libslic3r/ExtrusionEntity.cpp:350
msgid "Bridge infill"
msgstr "Riempimento Bridge"
-#: src/libslic3r/PrintConfig.cpp:234
+#: src/libslic3r/PrintConfig.cpp:268
msgid "Bridges"
msgstr "Bridge"
-#: src/libslic3r/PrintConfig.cpp:213
+#: src/libslic3r/PrintConfig.cpp:247
msgid "Bridges fan speed"
msgstr "Velocità ventola Bridge"
-#: src/libslic3r/PrintConfig.cpp:202
+#: src/libslic3r/PrintConfig.cpp:236
msgid "Bridging angle"
msgstr "Angolo Bridge"
-#: src/libslic3r/PrintConfig.cpp:204
+#: src/libslic3r/PrintConfig.cpp:238
msgid "Bridging angle override. If left to zero, the bridging angle will be calculated automatically. Otherwise the provided angle will be used for all bridges. Use 180° for zero angle."
msgstr "Ignora angolo Bridging. Se lasciato a zero, l'angolo di bridging verrà calcolato automaticamente. Altrimenti l'angolo fornito sarà utilizzato per tutti i bridge. Usa 180° per l'angolo zero."
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:218
msgid "Bridging volumetric"
msgstr "Bridging volumetrico"
-#: src/slic3r/GUI/Plater.cpp:534 src/slic3r/GUI/Tab.cpp:1117
+#: src/slic3r/GUI/Plater.cpp:400 src/slic3r/GUI/Tab.cpp:1446
msgid "Brim"
msgstr "Brim"
-#: src/libslic3r/PrintConfig.cpp:244
+#: src/libslic3r/PrintConfig.cpp:278
msgid "Brim width"
msgstr "Larghezza brim"
-#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1658
-#: src/slic3r/GUI/Tab.cpp:1721
+#: src/slic3r/GUI/FirmwareDialog.cpp:805
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:271
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327
msgid "Browse"
msgstr "Naviga"
-#: src/libslic3r/Zipper.cpp:82
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:28
+msgid "Brush shape"
+msgstr "Forma Pennello"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:27
+msgid "Brush size"
+msgstr "Dimensione Pennello"
+
+#: src/libslic3r/miniz_extension.cpp:141
msgid "buffer too small"
msgstr "buffer troppo piccolo"
+#: src/slic3r/GUI/GUI_App.cpp:1152
+msgid "But since this version of PrusaSlicer we don't show this information in Printer Settings anymore.\nSettings will be available in physical printers settings."
+msgstr "Ma da questa versione di PrusaSlicer non mostriamo più queste informazioni nelle impostazioni della stampante.\nLe impostazioni saranno disponibili nelle impostazioni delle stampanti fisiche."
+
#: src/slic3r/GUI/ButtonsDescription.cpp:16
msgid "Buttons And Text Colors Description"
msgstr "Descrizione colori testo e pulsanti"
-#: src/slic3r/GUI/PresetHints.cpp:223
+#: src/slic3r/GUI/GUI_App.cpp:1084
+msgid "By default new Printer devices will be named as \"Printer N\" during its creation.\nNote: This name can be changed later from the physical printers settings"
+msgstr "Per impostazione predefinita le nuove stampanti saranno denominate \"Printer N\" durante la loro creazione.\nNota: Questo nome può essere cambiato in seguito dalle impostazioni delle stampanti fisiche"
+
+#: src/slic3r/GUI/PresetHints.cpp:222
msgid "by the print profile maximum"
msgstr "secondo il massimo del profilo di stampa"
-#: src/slic3r/GUI/Preferences.cpp:113
+#: src/slic3r/GUI/Preferences.cpp:178
msgid "Camera"
msgstr "Camera"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:144
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:140
msgid "Camera view"
msgstr "Vista camera"
-#: src/slic3r/GUI/ConfigWizard.cpp:1982 src/slic3r/GUI/FirmwareDialog.cpp:151
+#: src/slic3r/GUI/ConfigWizard.cpp:2493 src/slic3r/GUI/FirmwareDialog.cpp:151
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:245
#: src/slic3r/GUI/ProgressStatusBar.cpp:26
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:644
msgid "Cancel"
msgstr "Annulla"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:157
+#: src/slic3r/GUI/PrintHostDialogs.cpp:155
msgid "Cancel selected"
msgstr "Cancella selezione"
-#: src/slic3r/GUI/Plater.cpp:3669 src/slic3r/GUI/PrintHostDialogs.cpp:233
+#: src/slic3r/GUI/Plater.cpp:3589 src/slic3r/GUI/PrintHostDialogs.cpp:233
msgid "Cancelled"
msgstr "Annullato"
-#: src/slic3r/GUI/Plater.cpp:3153 src/slic3r/GUI/PrintHostDialogs.cpp:232
+#: src/slic3r/GUI/Plater.cpp:2953 src/slic3r/GUI/PrintHostDialogs.cpp:232
msgid "Cancelling"
msgstr "Annullamento"
@@ -1043,92 +1265,100 @@ msgstr "Annullo in corso..."
msgid "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible."
msgstr "Non è possibile calcolare la larghezza di estrusione per %1%: Variabile \"%2%\" non accessibile."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3017
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3400
msgid "Cannot insert a new layer range after the current layer range.\nCurrent layer range overlaps with the next layer range."
msgstr "Non è possibile inserire un nuovo intervallo layer dopo quello attuale.\nL'intervallo layer attuale si sovrappone alla quello successivo."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3008
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3391
msgid "Cannot insert a new layer range after the current layer range.\nThe next layer range is too thin to be split to two\nwithout violating the minimum layer height."
msgstr "Non è possibile inserire un nuovo intervallo layer dopo quello attuale.\nL'intervallo layer successivo è troppo sottile per essere diviso in due\nsenza violare l'altezza layer minima."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3012
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3395
msgid "Cannot insert a new layer range between the current and the next layer range.\nThe gap between the current layer range and the next layer range\nis thinner than the minimum layer height allowed."
msgstr "Non è possibile inserire un nuovo intervallo layer tra quello attuale e quello successivo.\nLo spazio tra l'intervallo layer corrente e quello successivo\nè più sottile dell'altezza layer minima consentita."
-#: src/slic3r/GUI/Tab.cpp:3073
+#: src/slic3r/GUI/SavePresetDialog.cpp:137
msgid "Cannot overwrite a system profile."
msgstr "Impossibile sovrascrivere un profilo di sistema."
-#: src/slic3r/GUI/Tab.cpp:3077
+#: src/slic3r/GUI/SavePresetDialog.cpp:142
msgid "Cannot overwrite an external profile."
msgstr "Impossibile sovrascrivere un profilo esterno."
-#: src/libslic3r/SLAPrint.cpp:613
+#: src/libslic3r/SLAPrint.cpp:627
msgid "Cannot proceed without support points! Add support points or disable support generation."
msgstr "Impossibile procedere senza punti di supporto! Aggiungi i punti di supporto o disattiva la generazione supporti."
-#: src/slic3r/GUI/Tab.cpp:1834
+#: src/slic3r/GUI/Tab.cpp:2068 src/slic3r/GUI/UnsavedChangesDialog.cpp:1066
msgid "Capabilities"
msgstr "Caratteristiche"
-#: src/slic3r/GUI/GUI_App.cpp:801
+#: src/slic3r/GUI/GUI_App.cpp:1481
msgid "Capture a configuration snapshot"
msgstr "Cattura un'istantanea della configurazione"
-#: src/libslic3r/PrintConfig.cpp:3424
+#: src/slic3r/GUI/ImGuiWrapper.cpp:801 src/slic3r/GUI/Search.cpp:458
+msgid "Category"
+msgstr "Categoria"
+
+#: src/libslic3r/PrintConfig.cpp:3623
msgid "Center"
msgstr "Centro"
-#: src/libslic3r/PrintConfig.cpp:3425
+#: src/libslic3r/PrintConfig.cpp:3624
msgid "Center the print around the given center."
msgstr "Centra la stampa sul centro dato."
-#: src/slic3r/GUI/Tab.cpp:1728
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:329
msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*"
msgstr "File di certificato (*.crt, *.pem)|*.crt;*.pem|All files|*.*"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:180
+#: src/slic3r/GUI/SavePresetDialog.cpp:313
+msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\""
+msgstr "Cambia \"%1%\" a \"%2%\" per questa stampante fisica \"%3%\""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:174
msgid "Change camera type (perspective, orthographic)"
msgstr "Cambia tipo di visuale (prospettica, ortografica)"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:885
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:693
msgid "Change drainage hole diameter"
msgstr "Modifica il diametro dei fori di drenaggio"
-#: src/slic3r/GUI/DoubleSlider.cpp:1144 src/slic3r/GUI/GUI_ObjectList.cpp:1671
+#: src/slic3r/GUI/DoubleSlider.cpp:1273 src/slic3r/GUI/GUI_ObjectList.cpp:1800
msgid "Change extruder"
msgstr "Cambia estrusore"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:536
+#: src/slic3r/GUI/GUI_ObjectList.cpp:574
msgid "Change Extruder"
msgstr "Cambio estrusore"
-#: src/slic3r/GUI/DoubleSlider.cpp:1145
+#: src/slic3r/GUI/DoubleSlider.cpp:1274
msgid "Change extruder (N/A)"
msgstr "Cambio estrusore (N/A)"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3997
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4484
msgid "Change Extruders"
msgstr "Cambio Estrusori"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:152
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:157
#, possible-c-format
msgid "Change Option %s"
msgstr "Modifica Opzione %s"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3558
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4021
msgid "Change Part Type"
msgstr "Modifica il tipo di Parte"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:820
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:694
msgid "Change point head diameter"
msgstr "Modifica diametro punta della testa"
-#: src/slic3r/GUI/Plater.cpp:3944
+#: src/slic3r/GUI/Plater.cpp:3862
msgid "Change the number of instances of the selected object"
msgstr "Cambia il numero di istanze dell'oggetto selezionato"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1589
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1718
msgid "Change type"
msgstr "Cambia tipo"
@@ -1136,125 +1366,176 @@ msgstr "Cambia tipo"
msgid "Changelog && Download"
msgstr "Changelog && Download"
-#: src/slic3r/GUI/GUI_App.cpp:442
+#: src/slic3r/GUI/GUI_App.cpp:1245
msgid "Changing of an application language"
msgstr "Cambio lingua applicazione"
-#: src/slic3r/GUI/ConfigWizard.cpp:769 src/slic3r/GUI/Preferences.cpp:64
+#: src/slic3r/GUI/ConfigWizard.cpp:1128 src/slic3r/GUI/Preferences.cpp:81
msgid "Check for application updates"
msgstr "Verifica la presenza di aggiornamenti"
-#: src/slic3r/GUI/GUI_App.cpp:802
+#: src/slic3r/GUI/GUI_App.cpp:1482
msgid "Check for configuration updates"
msgstr "Controlla aggiornamenti di configurazione"
-#: src/slic3r/GUI/GUI_App.cpp:802
+#: src/slic3r/GUI/GUI_App.cpp:1482
msgid "Check for updates"
msgstr "Cerca aggiorna&menti"
-#: src/slic3r/GUI/BedShapeDialog.cpp:532
+#: src/slic3r/Utils/PresetUpdater.cpp:412
+#: src/slic3r/Utils/PresetUpdater.cpp:420
+msgid "checking install indices"
+msgstr "controllo degli indici di installazione"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:608
msgid "Choose a file to import bed texture from (PNG/SVG):"
msgstr "Seleziona un file da cui importare la forma del piano di stampa (PNG/SVG):"
-#: src/slic3r/GUI/MainFrame.cpp:773
+#: src/slic3r/GUI/MainFrame.cpp:1474
msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):"
msgstr "Scegli un file da processare (STL/OBJ/AMF/3MF/PRUSA):"
-#: src/slic3r/GUI/BedShapeDialog.cpp:555
+#: src/slic3r/GUI/BedShapeDialog.cpp:631
msgid "Choose an STL file to import bed model from:"
msgstr "Scegli un file STL da cui importare il modello del piano:"
-#: src/slic3r/GUI/BedShapeDialog.cpp:487
+#: src/slic3r/GUI/BedShapeDialog.cpp:563
msgid "Choose an STL file to import bed shape from:"
msgstr "Scegli un file STL da cui importare la forma del piano:"
-#: src/slic3r/GUI/GUI_App.cpp:555
+#: src/slic3r/GUI/GUI_App.cpp:1208
msgid "Choose one file (3MF/AMF):"
msgstr "Seleziona un file (3MF/AMF):"
-#: src/slic3r/GUI/GUI_App.cpp:567
+#: src/slic3r/GUI/GUI_App.cpp:1233
+msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):"
+msgstr "Scegliere un file (GCODE/.GCO/.G/.ngc/NGC):"
+
+#: src/slic3r/GUI/GUI_App.cpp:1220
msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):"
msgstr "Seleziona uno o più file (STL/OBJ/AMF/3MF/PRUSA):"
-#: src/slic3r/GUI/ConfigWizard.cpp:895
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:35
+msgid "Choose SLA archive:"
+msgstr "Scegliere l'archivio SLA:"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1261
msgid "Choose the type of firmware used by your printer."
msgstr "Indica il firmware usato dalla tua stampante."
-#: src/slic3r/GUI/BedShapeDialog.cpp:89
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36
+msgid "Circle"
+msgstr "Cerchio"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:142
msgid "Circular"
msgstr "Circolare"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4624 src/slic3r/GUI/GLCanvas3D.cpp:4657
-msgid "Click right mouse button to open History"
-msgstr "Fai click destro per aprire la Storia"
+#: src/slic3r/GUI/GLCanvas3D.cpp:5028 src/slic3r/GUI/GLCanvas3D.cpp:5067
+msgid "Click right mouse button to open/close History"
+msgstr "Cliccare con il tasto destro del mouse per aprire/chiudere la Cronologia"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4341
+msgid "Click right mouse button to show arrangement options"
+msgstr "Cliccare con il tasto destro del mouse per visualizzare le opzioni di disposizione"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:404
+#: src/slic3r/GUI/GUI_ObjectList.cpp:451
msgid "Click the icon to change the object printable property"
msgstr "Clicca l'icona per cambiare le proprietà di stampa dell'oggetto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:398
+#: src/slic3r/GUI/GUI_ObjectList.cpp:445
msgid "Click the icon to change the object settings"
msgstr "Fare clic sull'icona per modificare le impostazioni dell'oggetto"
-#: src/slic3r/GUI/Plater.cpp:343
+#: src/slic3r/GUI/PresetComboBoxes.cpp:566
msgid "Click to edit preset"
msgstr "Clicca per modificare il preset"
-#: src/libslic3r/PrintConfig.cpp:252
+#: src/slic3r/GUI/GCodeViewer.cpp:2071
+msgid "Click to hide"
+msgstr "Fare clic per nascondere"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2071
+msgid "Click to show"
+msgstr "Clic per mostrare"
+
+#: src/libslic3r/PrintConfig.cpp:286
msgid "Clip multi-part objects"
msgstr "Collega oggetti multi-part"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:25
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57
msgid "Clipping of view"
-msgstr "Ritaglio della vista"
+msgstr "Vista in sezione"
#: src/slic3r/GUI/FirmwareDialog.cpp:852
-#: src/slic3r/GUI/Mouse3DController.cpp:364
-#: src/slic3r/GUI/PrintHostDialogs.cpp:161
+#: src/slic3r/GUI/Mouse3DController.cpp:353
+#: src/slic3r/GUI/PrintHostDialogs.cpp:159
msgid "Close"
msgstr "Chiudi"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45
-#: src/libslic3r/PrintConfig.cpp:2934
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44
+#: src/libslic3r/PrintConfig.cpp:3098
msgid "Closing distance"
msgstr "Distanza di chiusura"
-#: src/slic3r/GUI/Plater.cpp:1260 src/libslic3r/PrintConfig.cpp:582
+#: src/slic3r/GUI/MainFrame.cpp:1297 src/slic3r/GUI/Plater.cpp:2144
+msgid "Collapse sidebar"
+msgstr "Riduci barra laterale"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:180
+msgid "Collapse/Expand the sidebar"
+msgstr "Riduci/Espandi barra laterale"
+
+#: src/slic3r/GUI/Plater.cpp:1198 src/libslic3r/PrintConfig.cpp:618
msgid "Color"
msgstr "Colore"
-#: src/slic3r/GUI/DoubleSlider.cpp:1005
+#: src/slic3r/GUI/GCodeViewer.cpp:2410 src/slic3r/GUI/GCodeViewer.cpp:2438
+msgid "Color change"
+msgstr "Cambio colore"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1130
msgid "Color change (\"%1%\")"
msgstr "Cambio colore (\"%1%\")"
-#: src/slic3r/GUI/DoubleSlider.cpp:1006
+#: src/slic3r/GUI/DoubleSlider.cpp:1131
msgid "Color change (\"%1%\") for Extruder %2%"
msgstr "Cambio colore (\"%1%\") per Estrusore %2%"
-#: src/slic3r/GUI/GLCanvas3D.cpp:995
-#, possible-c-format
-msgid "Color change for Extruder %d at %.2f mm"
-msgstr "Cambio colore per Estrusore %d a %.2f mm"
+#: src/slic3r/GUI/Tab.cpp:2203
+msgid "Color Change G-code"
+msgstr "G-code cambio colore"
-#: src/slic3r/GUI/GUI_Preview.cpp:228 src/slic3r/GUI/GUI_Preview.cpp:572
-#: src/libslic3r/GCode/PreviewData.cpp:359
+#: src/libslic3r/PrintConfig.cpp:1960
+msgid "Color change G-code"
+msgstr "G-code cambio colore"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2531 src/slic3r/GUI/GUI_Preview.cpp:1475
+msgid "Color changes"
+msgstr "Cambi colore"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2242 src/slic3r/GUI/GUI_Preview.cpp:282
+#: src/slic3r/GUI/GUI_Preview.cpp:784 src/libslic3r/GCode/PreviewData.cpp:364
msgid "Color Print"
msgstr "Color Print (Stampa a Colori)"
-#: src/libslic3r/PrintConfig.cpp:260
+#: src/libslic3r/PrintConfig.cpp:294
msgid "Colorprint height"
msgstr "Altezza Colorprint"
-#: src/libslic3r/PrintConfig.cpp:990
+#: src/libslic3r/PrintConfig.cpp:1034
msgid "Combine infill every"
msgstr "Combina riempimento ogni"
-#: src/libslic3r/PrintConfig.cpp:995
+#: src/libslic3r/PrintConfig.cpp:1039
msgid "Combine infill every n layers"
msgstr "Combina riempimento ogni n layer"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:154
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:148
msgid "Commands"
msgstr "Comandi"
@@ -1262,23 +1543,23 @@ msgstr "Comandi"
msgid "Comment:"
msgstr "Commento:"
-#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:280
+#: src/slic3r/GUI/Tab.cpp:107 src/libslic3r/PrintConfig.cpp:314
msgid "Compatible print profiles"
msgstr "Profili di stampa compatibili"
-#: src/libslic3r/PrintConfig.cpp:286
+#: src/libslic3r/PrintConfig.cpp:320
msgid "Compatible print profiles condition"
msgstr "Condizioni profili di stampa compatibili"
-#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:265
+#: src/slic3r/GUI/Tab.cpp:101 src/libslic3r/PrintConfig.cpp:299
msgid "Compatible printers"
msgstr "Stampanti compatibili"
-#: src/libslic3r/PrintConfig.cpp:271
+#: src/libslic3r/PrintConfig.cpp:305
msgid "Compatible printers condition"
msgstr "Condizioni di stampante compatibile"
-#: src/libslic3r/PrintConfig.cpp:304
+#: src/libslic3r/PrintConfig.cpp:338
msgid "Complete individual objects"
msgstr "Completa singoli oggetti"
@@ -1286,27 +1567,27 @@ msgstr "Completa singoli oggetti"
msgid "Completed"
msgstr "Completato"
-#: src/libslic3r/Zipper.cpp:54
+#: src/libslic3r/miniz_extension.cpp:113
msgid "compression failed"
msgstr "compressione fallita"
-#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:849
+#: src/libslic3r/PrintConfig.cpp:462 src/libslic3r/PrintConfig.cpp:887
msgid "Concentric"
msgstr "Concentrico"
-#: src/slic3r/GUI/ConfigWizard.cpp:2110
+#: src/slic3r/GUI/ConfigWizard.cpp:2625
msgid "Configuration &Assistant"
msgstr "&Assistente Configurazione"
-#: src/slic3r/GUI/ConfigWizard.cpp:2113
+#: src/slic3r/GUI/ConfigWizard.cpp:2628
msgid "Configuration &Wizard"
msgstr "Co&nfigurazione guidata"
-#: src/slic3r/GUI/ConfigWizard.cpp:2109
+#: src/slic3r/GUI/ConfigWizard.cpp:2624
msgid "Configuration Assistant"
msgstr "Assistente configurazione"
-#: src/libslic3r/PrintConfig.cpp:1316
+#: src/libslic3r/PrintConfig.cpp:1424
msgid "Configuration notes"
msgstr "Note di configurazione"
@@ -1322,11 +1603,15 @@ msgstr "Aggiornamento di configurazione"
msgid "Configuration update is available"
msgstr "Aggiornamento di configurazione disponibile"
-#: src/slic3r/GUI/UpdateDialogs.cpp:303
+#: src/slic3r/GUI/NotificationManager.hpp:321
+msgid "Configuration update is available."
+msgstr "Aggiornamento di configurazione disponibile."
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:304
msgid "Configuration updates"
msgstr "Aggiornamenti di configurazione"
-#: src/slic3r/GUI/ConfigWizard.cpp:2112
+#: src/slic3r/GUI/ConfigWizard.cpp:2627
msgid "Configuration Wizard"
msgstr "Configurazione Guidata"
@@ -1334,15 +1619,19 @@ msgstr "Configurazione Guidata"
msgid "Confirmation"
msgstr "Conferma"
-#: src/slic3r/GUI/Tab.cpp:1931
-msgid "Connection failed."
-msgstr "Connessione fallita."
+#: src/libslic3r/PrintConfig.cpp:1070
+msgid "Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. PrusaSlicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max. Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
+msgstr "Collega una linea di riempimento ad un perimetro interno con un breve segmento di un perimetro aggiuntivo. Se espresso in percentuale (esempio: 15%) viene calcolato sulla larghezza di estrusione di riempimento. PrusaSlicer cerca di collegare due linee di riempimento vicine ad un breve segmento di perimetro. Se non viene rilevato alcun segmento perimetrale più corto di infill_anchor_max, la linea di riempimento viene collegata ad un segmento perimetrale su un solo lato e la lunghezza del segmento perimetrale considerato è limitata a questo parametro, ma non più lunga di anchor_length_max. Impostare questo parametro a zero per disabilitare i perimetri di ancoraggio collegati ad una singola linea di riempimento."
-#: src/slic3r/GUI/Tab.cpp:3627
+#: src/libslic3r/PrintConfig.cpp:1097
+msgid "Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. PrusaSlicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter. Set this parameter to zero to disable anchoring."
+msgstr "Collegare una linea di riempimento ad un perimetro interno con un breve segmento di un perimetro aggiuntivo. Se espresso in percentuale (esempio: 15%) viene calcolato sulla larghezza di estrusione del riempimento. PrusaSlicer prova a collegare due linee di riempimento vicine ad un segmento di perimetro corto. Se non viene trovato un segmento perimetrale più corto di questo parametro, la linea di riempimento viene collegata ad un segmento perimetrale su un solo lato e la lunghezza del segmento perimetrale considerato è limitata a infill_anchor, ma non più lunga di questo parametro. Impostare questo parametro a zero per disabilitare l'ancoraggio."
+
+#: src/slic3r/GUI/Tab.cpp:4046
msgid "Connection of the support sticks and junctions"
msgstr "Connessione delle barre di supporto e giunzioni"
-#: src/slic3r/Utils/AstroBox.cpp:83
+#: src/slic3r/Utils/AstroBox.cpp:84
msgid "Connection to AstroBox works correctly."
msgstr "La connessione ad AstroBox funziona correttamente."
@@ -1358,124 +1647,148 @@ msgstr "Connessione a FlashAir correttamente funzionante e caricamento abilitato
msgid "Connection to OctoPrint works correctly."
msgstr "Connessione con OctoPrint funzionante."
-#: src/slic3r/GUI/Tab.cpp:1928
-msgid "Connection to printer works correctly."
-msgstr "Connessione con la stampante funzionante."
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:260
+msgid "Connection to printers connected via the print host failed."
+msgstr "Collegamento alle stampanti collegate tramite l'host di stampa fallito."
-#: src/slic3r/Utils/OctoPrint.cpp:176
+#: src/slic3r/Utils/OctoPrint.cpp:185
msgid "Connection to Prusa SL1 works correctly."
msgstr "La connessione a Prusa SL1 funziona correttamente."
-#: src/libslic3r/PrintConfig.cpp:1909
+#: src/libslic3r/PrintConfig.cpp:2051
msgid "Contact Z distance"
msgstr "Distanza di contatto Z"
-#: src/slic3r/GUI/AboutDialog.cpp:261
+#: src/slic3r/GUI/AboutDialog.cpp:286
msgid "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and numerous others."
msgstr "Con il contributo di Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik e molti altri."
-#: src/libslic3r/PrintConfig.cpp:2659
+#: src/slic3r/GUI/GUI_App.cpp:245
+msgid "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others."
+msgstr "Contributi di Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas Meszaros, Lukas Matena, Vojtech Kral, David Kocik e molti altri."
+
+#: src/libslic3r/PrintConfig.cpp:2823
msgid "Controls the bridge type between two neighboring pillars. Can be zig-zag, cross (double zig-zag) or dynamic which will automatically switch between the first two depending on the distance of the two pillars."
msgstr "Controlla il tipo di bridge tra due pilastri adiacenti. Può essere zig-zag, croce (doppio zig-zag) o dinamico, che passerà automaticamente tra i due a seconda della distanza tra i due pilastri."
-#: src/slic3r/GUI/Tab.cpp:1444
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1858 src/slic3r/GUI/Plater.cpp:4886
+msgid "Convert from imperial units"
+msgstr "Convertire da unità imperiali"
+
+#: src/slic3r/GUI/Tab.cpp:1790
msgid "Cooling"
msgstr "Raffreddamento"
-#: src/libslic3r/PrintConfig.cpp:660
+#: src/libslic3r/PrintConfig.cpp:696
msgid "Cooling moves are gradually accelerating beginning at this speed."
msgstr "I movimenti di raffreddamento accelerano gradualmente partendo da questa velocità."
-#: src/libslic3r/PrintConfig.cpp:679
+#: src/libslic3r/PrintConfig.cpp:715
msgid "Cooling moves are gradually accelerating towards this speed."
msgstr "I movimenti di raffreddamento accelerano gradualmente verso questa velocità."
-#: src/slic3r/GUI/Tab.cpp:1465
+#: src/slic3r/GUI/Tab.cpp:1811
msgid "Cooling thresholds"
msgstr "Soglie di raffreddamento"
-#: src/libslic3r/PrintConfig.cpp:327
+#: src/libslic3r/PrintConfig.cpp:361
msgid "Cooling tube length"
msgstr "Lunghezza del tubo di raffreddamento"
-#: src/libslic3r/PrintConfig.cpp:319
+#: src/libslic3r/PrintConfig.cpp:353
msgid "Cooling tube position"
msgstr "Posizione tubo di raffreddamento"
-#: src/slic3r/GUI/Plater.cpp:4752
+#: src/slic3r/GUI/Plater.cpp:4856
msgid "Copies of the selected object"
msgstr "Copie dell'oggetto selezionato"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4505
+#: src/slic3r/GUI/GLCanvas3D.cpp:4871
msgid "Copy"
msgstr "Copia"
-#: src/slic3r/GUI/MainFrame.cpp:589
+#: src/slic3r/GUI/MainFrame.cpp:1195
msgid "Copy selection to clipboard"
msgstr "Copia selezione negli appunti"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:132
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:127
msgid "Copy to clipboard"
msgstr "Copia negli appunti"
-#: src/slic3r/GUI/SysInfoDialog.cpp:154
+#: src/slic3r/GUI/SysInfoDialog.cpp:177
msgid "Copy to Clipboard"
msgstr "Copia negli appunti"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:121
+#: src/slic3r/GUI/AboutDialog.cpp:304
+msgid "Copy Version Info"
+msgstr "Copia info versione"
+
+#: src/slic3r/Utils/PresetUpdater.cpp:84
+msgid "Copying of file %1% to %2% failed.\nError message : %3%\nCopying was triggered by function: %4%"
+msgstr "Copia del file %1% a %2% non riuscita.\nMessaggio errore : %3%\nL'errore è stato causata dalla funzione: %4%"
+
+#: src/slic3r/Utils/PresetUpdater.cpp:91
+msgid "Copying of file %1% to %2% failed. Permissions fail at target file after copying.\nError message : %3%\nCopying was triggered by function: %4%"
+msgstr "Copia del file %1% su %2% non riuscita. Permessi non validi nel file di destinazione dopo la copia.\nMessaggio errore : %3%\n Questo errore è causato dalla funzione: %4%."
+
+#: src/slic3r/Utils/PresetUpdater.cpp:70
+msgid "Copying of file %1% to %2% failed. Permissions fail at target file before copying.\nError message : %3%\nThis error happend during %4% phase."
+msgstr "Copia del file %1% su %2% non riuscita. Permessi non validi nel file di destinazione prima della copia.\nMessaggio errore : %3%\n Questo errore si è verificato durante la fase %4%."
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:156
msgid "Copying of the temporary G-code has finished but the exported code couldn't be opened during copy check. The output G-code is at %1%.tmp."
msgstr "Copia del G-code temporaneo completata ma non è stato possibile aprire il codice esportato durante il controllo copia. Il G-code di output è su %1%.tmp."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:118
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:153
msgid "Copying of the temporary G-code has finished but the original code at %1% couldn't be opened during copy check. The output G-code is at %2%.tmp."
msgstr "Copia del G-code temporaneo completata ma non è stato possibile aprire il codice originale su %1% durante il controllo copia. Il G-code di output è su %2%.tmp."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:480
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:522
msgid "Copying of the temporary G-code to the output G-code failed"
msgstr "Copia del G-code temporaneo nel G-code di output non riuscita"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:109
-msgid "Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?"
-msgstr "Copia del G-code temporaneo nel G-code di output non riuscita. Forse la scheda SD ha la sicura per la scrittura?"
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:163
+msgid "Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?\nError message: %1%"
+msgstr "Copia del G-code temporaneo sul G-code di uscita non riuscita. Forse la scheda SD è bloccata in scrittura?\nMessaggio di errore: %1%"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:112
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:147
msgid "Copying of the temporary G-code to the output G-code failed. There might be problem with target device, please try exporting again or using different device. The corrupted output G-code is at %1%.tmp."
msgstr "Copia del G-code temporaneo nel G-code di output non riuscita. Potrebbe esserci un problema nel dispositivo di destinazione, prova una nuova esportazione con un dispositivo diverso. Il file G-code corrotto è su %1%.tmp."
-#: src/slic3r/GUI/AboutDialog.cpp:127 src/slic3r/GUI/AboutDialog.cpp:256
+#: src/slic3r/GUI/AboutDialog.cpp:139 src/slic3r/GUI/AboutDialog.cpp:281
msgid "Copyright"
msgstr "Copyright"
-#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2572
+#: src/libslic3r/PrintConfig.cpp:2714 src/libslic3r/PrintConfig.cpp:2715
msgid "Correction for expansion"
msgstr "Correzione dell'espansione"
-#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:3519
+#: src/slic3r/GUI/Tab.cpp:2270 src/slic3r/GUI/Tab.cpp:3935
msgid "Corrections"
msgstr "Correzioni"
-#: src/slic3r/GUI/Plater.cpp:1243 src/libslic3r/PrintConfig.cpp:760
-#: src/libslic3r/PrintConfig.cpp:2510 src/libslic3r/PrintConfig.cpp:2511
+#: src/slic3r/GUI/Plater.cpp:1158 src/libslic3r/PrintConfig.cpp:796
+#: src/libslic3r/PrintConfig.cpp:2653 src/libslic3r/PrintConfig.cpp:2654
msgid "Cost"
msgstr "Costo"
-#: src/slic3r/GUI/Plater.cpp:239
+#: src/slic3r/GUI/Plater.cpp:245
msgid "Cost (money)"
msgstr "Costo (soldi)"
-#: src/slic3r/GUI/Plater.cpp:2835
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:176
msgid "Could not arrange model objects! Some geometries may be invalid."
msgstr "Non è stato possibile disporre gli oggetti! Alcune geometrie potrebbero essere non valide."
-#: src/slic3r/Utils/AstroBox.cpp:89
+#: src/slic3r/Utils/AstroBox.cpp:90
msgid "Could not connect to AstroBox"
msgstr "Impossibile connettere ad AstroBox"
-#: src/slic3r/Utils/Duet.cpp:54
+#: src/slic3r/Utils/Duet.cpp:55
msgid "Could not connect to Duet"
msgstr "Connessione a Duet fallita"
-#: src/slic3r/Utils/FlashAir.cpp:73
+#: src/slic3r/Utils/FlashAir.cpp:74
msgid "Could not connect to FlashAir"
msgstr "Impossibile connettersi a FlashAir"
@@ -1483,56 +1796,73 @@ msgstr "Impossibile connettersi a FlashAir"
msgid "Could not connect to OctoPrint"
msgstr "Impossibile connettersi ad OctoPrint"
-#: src/slic3r/Utils/OctoPrint.cpp:181
+#: src/slic3r/Utils/OctoPrint.cpp:191
msgid "Could not connect to Prusa SLA"
msgstr "Connessione a Prusa SLA fallita"
-#: src/slic3r/GUI/Tab.cpp:1687
+#: src/slic3r/Utils/Http.cpp:73
+msgid "Could not detect system SSL certificate store. PrusaSlicer will be unable to establish secure network connections."
+msgstr "Impossibile rilevare archivio di certificati SSL di sistema. PrusaSlicer non sarà in grado di stabilire connessioni di rete sicure."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:289
msgid "Could not get a valid Printer Host reference"
msgstr "Impossibile ottenere un riferimento Host Stampante valido"
-#: src/slic3r/Utils/Duet.cpp:134
+#: src/slic3r/Utils/Duet.cpp:136
msgid "Could not get resources to create a new connection"
msgstr "Non sono state trovate le risorse per stabilire una nuova connessione"
-#: src/libslic3r/PrintConfig.cpp:1959
+#: src/libslic3r/PrintConfig.cpp:2101
msgid "Cover the top contact layer of the supports with loops. Disabled by default."
msgstr "Copre con anelli il layer superiore del supporto a contatto. Disattivato per impostazione predefinita."
-#: src/libslic3r/PrintConfig.cpp:89
+#: src/libslic3r/PrintConfig.cpp:91
msgid "Cracks smaller than 2x gap closing radius are being filled during the triangle mesh slicing. The gap closing operation may reduce the final print resolution, therefore it is advisable to keep the value reasonably low."
msgstr "Le fratture più piccole di 2 volte il gap closing radius vengono riempite durante lo slicing del mesh triangolare. L'operazione potrebbe ridurre la risoluzione finale di stampa, dunque è preferibile settare il valore ragionevolmente basso."
-#: src/libslic3r/Zipper.cpp:58
+#: src/libslic3r/miniz_extension.cpp:117
msgid "CRC-32 check failed"
msgstr "verifica CRC-32 fallita"
-#: src/libslic3r/PrintConfig.cpp:2857
+#: src/libslic3r/PrintConfig.cpp:3021
msgid "Create pad around object and ignore the support elevation"
msgstr "Genera Pad intorno all'oggetto ed ignora l'elevazione del supporto"
-#: src/libslic3r/PrintConfig.cpp:2724
+#: src/libslic3r/PrintConfig.cpp:2888
msgid "Critical angle"
msgstr "Angolo critico"
-#: src/libslic3r/PrintConfig.cpp:2668
+#: src/slic3r/GUI/GUI_App.cpp:589
+msgid "Critical error"
+msgstr "Errore critico"
+
+#: src/libslic3r/PrintConfig.cpp:2832
msgid "Cross"
msgstr "Croce"
-#: src/libslic3r/PrintConfig.cpp:847
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:203
+msgid "Ctrl + Mouse wheel"
+msgstr "Ctrl + Rotella del mouse"
+
+#: src/libslic3r/PrintConfig.cpp:885
msgid "Cubic"
msgstr "Cubico"
-#: src/slic3r/GUI/wxExtensions.cpp:704
+#: src/slic3r/Utils/Http.cpp:91
+msgid "CURL init has failed. PrusaSlicer will be unable to establish network connections. See logs for additional details."
+msgstr "CURL init non riuscito. PrusaSlicer non sarà in grado di stabilire connessioni di rete. Vedere i log per ulteriori dettagli."
+
+#: src/slic3r/GUI/wxExtensions.cpp:624
#, possible-c-format
msgid "Current mode is %s"
msgstr "La modalità corrente è %s"
-#: src/slic3r/GUI/Tab.cpp:959
+#: src/slic3r/GUI/Tab.cpp:1278
msgid "Current preset is inherited from"
msgstr "Il preset corrente è ereditato da"
-#: src/slic3r/GUI/Tab.cpp:957
+#: src/slic3r/GUI/Tab.cpp:1276
msgid "Current preset is inherited from the default preset."
msgstr "Il preset attuale è stato ereditato dal preset predefinito."
@@ -1540,480 +1870,521 @@ msgstr "Il preset attuale è stato ereditato dal preset predefinito."
msgid "Current version:"
msgstr "Versione corrente:"
-#: src/slic3r/GUI/BedShapeDialog.cpp:98 src/slic3r/GUI/GUI_Preview.cpp:249
-#: src/libslic3r/ExtrusionEntity.cpp:322
+#: src/slic3r/GUI/BedShapeDialog.cpp:143 src/slic3r/GUI/GUI_Preview.cpp:314
+#: src/libslic3r/ExtrusionEntity.cpp:327 src/libslic3r/ExtrusionEntity.cpp:362
msgid "Custom"
msgstr "Personalizzato"
-#: src/libslic3r/PrintConfig.cpp:112
+#: src/libslic3r/PrintConfig.cpp:114
msgid "Custom CA certificate file can be specified for HTTPS OctoPrint connections, in crt/pem format. If left blank, the default OS CA certificate repository is used."
msgstr "Può essere specificato il file del certificato CA personalizzato per le connessioni OctoPrint HTTPS, in formato crt/pem. Se lasciato in bianco, verrà utilizzato lo OS CA certificate repository predefinito."
-#: src/slic3r/GUI/Tab.cpp:1527 src/slic3r/GUI/Tab.cpp:1975
+#: src/slic3r/GUI/Tab.cpp:1872 src/slic3r/GUI/Tab.cpp:2160
+#: src/libslic3r/PrintConfig.cpp:1978
msgid "Custom G-code"
msgstr "G-code personalizzato"
-#: src/slic3r/GUI/DoubleSlider.cpp:1619
+#: src/slic3r/GUI/DoubleSlider.cpp:1815
msgid "Custom G-code on current layer (%1% mm)."
msgstr "G-code personalizzato al layer attuale (%1% mm)."
-#: src/slic3r/GUI/ConfigWizard.cpp:732
+#: src/slic3r/GUI/GCodeViewer.cpp:2580 src/slic3r/GUI/GUI_Preview.cpp:1477
+msgid "Custom G-codes"
+msgstr "G-code personalizzati"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1091
msgid "Custom Printer"
msgstr "Stampante Personalizzata"
-#: src/slic3r/GUI/ConfigWizard.cpp:732
+#: src/slic3r/GUI/ConfigWizard.cpp:1091
msgid "Custom Printer Setup"
msgstr "Setup Stampante Personalizzata"
-#: src/slic3r/GUI/ConfigWizard.cpp:736
+#: src/slic3r/GUI/ConfigWizard.cpp:1095
msgid "Custom profile name:"
msgstr "Nome profilo personalizzato:"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:42
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3402
+#: src/slic3r/GUI/Plater.cpp:3397
+msgid "Custom supports and seams were removed after repairing the mesh."
+msgstr "I supporti e le cuciture personalizzate sono stati rimossi dopo la riparazione della mesh."
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1135
+msgid "Custom template (\"%1%\")"
+msgstr "Modello personalizzato (\"%1%\")"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:146 src/libslic3r/PrintConfig.cpp:3601
msgid "Cut"
msgstr "Taglia"
-#: src/slic3r/GUI/Plater.cpp:4786
+#: src/slic3r/GUI/Plater.cpp:4921
msgid "Cut by Plane"
msgstr "Taglia sul Piano"
-#: src/libslic3r/PrintConfig.cpp:3403
+#: src/libslic3r/PrintConfig.cpp:3602
msgid "Cut model at the given Z."
msgstr "Taglia il modello al dato Z."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1432
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
msgid "Cylinder"
msgstr "Cilindro"
-#: src/slic3r/GUI/MainFrame.cpp:568
+#: src/slic3r/GUI/MainFrame.cpp:1174
msgid "D&eselect all"
msgstr "D&eseleziona tutto"
-#: src/libslic3r/PrintConfig.cpp:3504
+#: src/libslic3r/PrintConfig.cpp:3709
msgid "Data directory"
msgstr "Directory dati"
-#: src/slic3r/GUI/Mouse3DController.cpp:313
+#: src/slic3r/GUI/Mouse3DController.cpp:300
msgid "Deadzone:"
msgstr "Zona morta:"
-#: src/libslic3r/Zipper.cpp:52
+#: src/libslic3r/miniz_extension.cpp:111
msgid "decompression failed or archive is corrupted"
msgstr "decompressione non riuscita o archivio corrotto"
-#: src/slic3r/GUI/Plater.cpp:4720
+#: src/slic3r/GUI/Plater.cpp:4824
msgid "Decrease Instances"
msgstr "Diminuisci Istanze"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1704 src/libslic3r/PrintConfig.cpp:335
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1832 src/libslic3r/PrintConfig.cpp:369
msgid "Default"
msgstr "Predefinito"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:457 src/slic3r/GUI/GUI_ObjectList.cpp:469
-#: src/slic3r/GUI/GUI_ObjectList.cpp:917 src/slic3r/GUI/GUI_ObjectList.cpp:3967
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3977
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4012
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:200
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:257
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:282
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:490
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:1753
+#: src/slic3r/GUI/ExtraRenderers.cpp:297 src/slic3r/GUI/GUI_ObjectList.cpp:496
+#: src/slic3r/GUI/GUI_ObjectList.cpp:508 src/slic3r/GUI/GUI_ObjectList.cpp:1015
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4454
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4464
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4499
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:202
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:259
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:284
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:492
msgid "default"
msgstr "predefinito"
-#: src/libslic3r/PrintConfig.cpp:777
+#: src/libslic3r/PrintConfig.cpp:813
msgid "Default base angle for infill orientation. Cross-hatching will be applied to this. Bridges will be infilled using the best direction Slic3r can detect, so this setting does not affect them."
msgstr "Angolo base predefinito per l'orientamento del riempimento. Su questo verrà applicato il tratteggio. I bridge saranno riempiti utilizzando la migliore direzione che Slic3r riesce a determinare, quindi questa impostazione non influisce sui bridge."
-#: src/libslic3r/PrintConfig.cpp:554
+#: src/slic3r/GUI/GCodeViewer.cpp:2289
+msgid "Default color"
+msgstr "Colore predefinito"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2313
+msgid "default color"
+msgstr "colore predefinito"
+
+#: src/libslic3r/PrintConfig.cpp:590
msgid "Default extrusion width"
msgstr "Larghezza estrusione predefinita"
-#: src/slic3r/GUI/Tab.cpp:987
+#: src/slic3r/GUI/Tab.cpp:1305
msgid "default filament profile"
msgstr "profilo filamento predefinito"
-#: src/libslic3r/PrintConfig.cpp:345
+#: src/libslic3r/PrintConfig.cpp:379
msgid "Default filament profile"
msgstr "Profilo filamento predefinito"
-#: src/libslic3r/PrintConfig.cpp:346
+#: src/libslic3r/PrintConfig.cpp:380
msgid "Default filament profile associated with the current printer profile. On selection of the current printer profile, this filament profile will be activated."
msgstr "Profilo filamento predefinito associato al profilo stampante corrente. Quando si seleziona il profilo stampante corrente, questo profilo filamento verrà attivato."
-#: src/slic3r/GUI/Tab.cpp:2919
-#, possible-c-format
-msgid "Default preset (%s)"
-msgstr "Preset predefinito (%s)"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:904 src/slic3r/GUI/GLCanvas3D.cpp:933
-msgid "Default print color"
-msgstr "Colore di stampa predefinito"
-
-#: src/slic3r/GUI/Tab.cpp:984
+#: src/slic3r/GUI/Tab.cpp:1302
msgid "default print profile"
msgstr "profilo di stampa predefinito"
-#: src/libslic3r/PrintConfig.cpp:352
+#: src/libslic3r/PrintConfig.cpp:386
msgid "Default print profile"
msgstr "Profilo di stampa predefinito"
-#: src/libslic3r/PrintConfig.cpp:353 src/libslic3r/PrintConfig.cpp:2592
-#: src/libslic3r/PrintConfig.cpp:2603
+#: src/libslic3r/PrintConfig.cpp:387 src/libslic3r/PrintConfig.cpp:2735
+#: src/libslic3r/PrintConfig.cpp:2746
msgid "Default print profile associated with the current printer profile. On selection of the current printer profile, this print profile will be activated."
msgstr "Profilo di stampa predefinito associato al profilo stampante corrente. Alla selezione del profilo stampante corrente, questo profilo di stampa verrà attivato."
-#: src/slic3r/GUI/Tab.cpp:1001
+#: src/slic3r/GUI/Tab.cpp:1319
msgid "default SLA material profile"
msgstr "profilo materiale SLA predefinito"
-#: src/libslic3r/PrintConfig.cpp:2591 src/libslic3r/PrintConfig.cpp:2602
+#: src/libslic3r/PrintConfig.cpp:2734 src/libslic3r/PrintConfig.cpp:2745
msgid "Default SLA material profile"
msgstr "Profilo materiale SLA predefinito"
-#: src/slic3r/GUI/Tab.cpp:1005
+#: src/slic3r/GUI/Tab.cpp:1323
msgid "default SLA print profile"
msgstr "profilo di stampa SLA predefinito"
-#: src/slic3r/GUI/Field.cpp:136
+#: src/slic3r/GUI/Field.cpp:184
msgid "default value"
msgstr "valore predefinito"
-#: src/slic3r/GUI/ConfigWizard.cpp:734
+#: src/slic3r/GUI/ConfigWizard.cpp:1093
msgid "Define a custom printer profile"
msgstr "Inserisci un profilo stampante personalizzato"
-#: src/libslic3r/PrintConfig.cpp:2798
+#: src/libslic3r/PrintConfig.cpp:2962
msgid "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful when enabling this feature, as some resins may produce an extreme suction effect inside the cavity, which makes peeling the print off the vat foil difficult."
msgstr "Definisce la profondità della cavità nel pad. Imposta a zero per disattivare la cavità. Fai attenzione ad attivare questa funzione in quanto alcune resine possono causare un effetto ventosa dentro la cavità il che renderà difficile il distacco della stampa dal foglio del vat."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:346
+#: src/slic3r/GUI/GUI_ObjectList.cpp:393
msgid "degenerate facets"
msgstr "facce degenerate"
-#: src/libslic3r/PrintConfig.cpp:640
+#: src/libslic3r/PrintConfig.cpp:676
msgid "Delay after unloading"
msgstr "Ritardo dopo lo scarico"
-#: src/slic3r/GUI/Tab.cpp:3121
+#: src/slic3r/GUI/Tab.cpp:3386
msgid "delete"
msgstr "elimina"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4475 src/slic3r/GUI/GUI_ObjectList.cpp:1718
-#: src/slic3r/GUI/Plater.cpp:3931 src/slic3r/GUI/Plater.cpp:3953
-#: src/slic3r/GUI/Tab.cpp:3124
+#: src/slic3r/GUI/GLCanvas3D.cpp:4841 src/slic3r/GUI/GUI_ObjectList.cpp:1846
+#: src/slic3r/GUI/Plater.cpp:3849 src/slic3r/GUI/Plater.cpp:3871
+#: src/slic3r/GUI/Tab.cpp:3423
msgid "Delete"
msgstr "Elimina"
-#: src/slic3r/GUI/MainFrame.cpp:575
+#: src/slic3r/GUI/MainFrame.cpp:1181
msgid "Delete &all"
msgstr "Elimin&a tutto"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4484 src/slic3r/GUI/KBShortcutsDialog.cpp:129
-#: src/slic3r/GUI/Plater.cpp:4669
+#: src/slic3r/GUI/GLCanvas3D.cpp:4850 src/slic3r/GUI/KBShortcutsDialog.cpp:124
+#: src/slic3r/GUI/Plater.cpp:4774
msgid "Delete all"
msgstr "Elimina tutto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2176
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2341
msgid "Delete All Instances from Object"
msgstr "Elimina Tutte le Istanze dall'Oggetto"
-#: src/slic3r/GUI/DoubleSlider.cpp:1516
+#: src/slic3r/GUI/DoubleSlider.cpp:1708
msgid "Delete color change"
msgstr "Elimina il cambio colore"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:220
msgid "Delete color change marker for current layer"
msgstr "Elimina il segnale di cambio colore per il layer corrente"
-#: src/slic3r/GUI/DoubleSlider.cpp:1519
+#: src/slic3r/GUI/DoubleSlider.cpp:1711
msgid "Delete custom G-code"
msgstr "Elimina G-code personalizzato"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:539
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:424
msgid "Delete drainage hole"
msgstr "Elimina foro di drenaggio"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2192
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2357
msgid "Delete Height Range"
msgstr "Elimina Intervallo Altezza"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2246
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2412
msgid "Delete Instance"
msgstr "Elimina Istanza"
-#: src/slic3r/GUI/Plater.cpp:2712
+#: src/slic3r/GUI/Plater.cpp:2673
msgid "Delete Object"
msgstr "Elimina Oggetto"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:101
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:104
#, possible-c-format
msgid "Delete Option %s"
msgstr "Elimina Opzione %s"
-#: src/slic3r/GUI/DoubleSlider.cpp:1518
+#: src/slic3r/GUI/DoubleSlider.cpp:1710
msgid "Delete pause print"
msgstr "Elimina pausa stampa"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:128
+#: src/slic3r/GUI/PresetComboBoxes.cpp:652
+msgid "Delete physical printer"
+msgstr "Elimina stampante fisica"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:659
+msgid "Delete Physical Printer"
+msgstr "Elimina stampante fisica"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:123
msgid "Delete selected"
msgstr "Elimina selezionato"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2830
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3221
msgid "Delete Selected"
msgstr "Elimina Selezionati"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2693
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3083
msgid "Delete Selected Item"
msgstr "Elimina l'elemento selezionato"
-#: src/slic3r/GUI/Plater.cpp:4677
+#: src/slic3r/GUI/Plater.cpp:4782
msgid "Delete Selected Objects"
msgstr "Elimina Oggetti Selezionati"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2152
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2319
msgid "Delete Settings"
msgstr "Elimina Impostazioni"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2227
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2393
msgid "Delete Subobject"
msgstr "Elimina Sotto-oggetto"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:631
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:514
msgid "Delete support point"
msgstr "Elimina punto di supporto"
-#: src/slic3r/GUI/Tab.cpp:134
+#: src/slic3r/GUI/Tab.cpp:204
msgid "Delete this preset"
msgstr "Elimina questo preset"
-#: src/slic3r/GUI/DoubleSlider.cpp:1035
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:55
+msgid "Delete this preset from this printer device"
+msgstr "Elimina questo preset da questa stampante"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1160
msgid "Delete tick mark - Left click or press \"-\" key"
msgstr "Elimina il segno di spunta - Clic sinistro o premi il tasto \"-\""
-#: src/slic3r/GUI/DoubleSlider.cpp:1517
+#: src/slic3r/GUI/DoubleSlider.cpp:1709
msgid "Delete tool change"
msgstr "Elimina cambio attrezzo"
-#: src/slic3r/GUI/MainFrame.cpp:576
+#: src/slic3r/GUI/MainFrame.cpp:1182
msgid "Deletes all objects"
msgstr "Elimina tutti gli oggetti"
-#: src/slic3r/GUI/MainFrame.cpp:573
+#: src/slic3r/GUI/MainFrame.cpp:1179
msgid "Deletes the current selection"
msgstr "Elimina la selezione corrente"
-#: src/libslic3r/PrintConfig.cpp:717 src/libslic3r/PrintConfig.cpp:2503
-#: src/libslic3r/PrintConfig.cpp:2504
+#: src/libslic3r/PrintConfig.cpp:753 src/libslic3r/PrintConfig.cpp:2646
+#: src/libslic3r/PrintConfig.cpp:2647
msgid "Density"
msgstr "Densità"
-#: src/libslic3r/PrintConfig.cpp:791
+#: src/libslic3r/PrintConfig.cpp:827
msgid "Density of internal infill, expressed in the range 0% - 100%."
msgstr "Densità del riempimento interno, espresso nell'intervallo 0% - 100%."
-#: src/slic3r/GUI/Tab.cpp:1258 src/slic3r/GUI/Tab.cpp:1548
-#: src/slic3r/GUI/Tab.cpp:2019 src/slic3r/GUI/Tab.cpp:2135
-#: src/slic3r/GUI/Tab.cpp:3543 src/slic3r/GUI/Tab.cpp:3671
+#: src/slic3r/GUI/Tab.cpp:1588 src/slic3r/GUI/Tab.cpp:1895
+#: src/slic3r/GUI/Tab.cpp:2228 src/slic3r/GUI/Tab.cpp:2304
+#: src/slic3r/GUI/Tab.cpp:3959 src/slic3r/GUI/Tab.cpp:4090
msgid "Dependencies"
msgstr "Dipendenze"
-#: src/libslic3r/PrintConfig.cpp:1612 src/libslic3r/PrintConfig.cpp:1613
+#: src/libslic3r/PrintConfig.cpp:1720 src/libslic3r/PrintConfig.cpp:1721
msgid "Deretraction Speed"
msgstr "Velocità di deretrazione"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:127
+#: src/slic3r/GUI/GCodeViewer.cpp:2529 src/slic3r/GUI/GUI_Preview.cpp:337
+#: src/slic3r/GUI/GUI_Preview.cpp:1473
+msgid "Deretractions"
+msgstr "De-retrazioni"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:172
+msgid "Descriptive name for the printer"
+msgstr "Nome descrittivo della stampante"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:122
msgid "Deselect all"
msgstr "Deseleziona tutto"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1369
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216
msgid "Deselect by rectangle"
msgstr "Deseleziona con rettangolo"
-#: src/slic3r/GUI/MainFrame.cpp:569
+#: src/slic3r/GUI/MainFrame.cpp:1175
msgid "Deselects all objects"
msgstr "Deseleziona tutti gli oggetti"
-#: src/slic3r/GUI/Tab.cpp:963
+#: src/slic3r/GUI/Tab.cpp:1224
msgid "Detach from system preset"
msgstr "Distacco dal preset di sistema"
-#: src/slic3r/GUI/Tab.cpp:984
+#: src/slic3r/GUI/Tab.cpp:1246
msgid "Detach preset"
msgstr "Preset distacco"
-#: src/slic3r/GUI/Tab.cpp:3029
+#: src/slic3r/GUI/Tab.cpp:3323
msgid "Detached"
msgstr "Distaccato"
-#: src/libslic3r/PrintConfig.cpp:1373
+#: src/libslic3r/PrintConfig.cpp:1481
msgid "Detect bridging perimeters"
msgstr "Rileva perimetri ponte (bridge)"
-#: src/libslic3r/PrintConfig.cpp:2075
+#: src/libslic3r/PrintConfig.cpp:2218
msgid "Detect single-width walls (parts where two extrusions don't fit and we need to collapse them into a single trace)."
msgstr "Rileva pareti a spessore singolo (parti in cui non entrano due estrusioni ed è necessario comprimerle in una singola traccia)."
-#: src/libslic3r/PrintConfig.cpp:2073
+#: src/libslic3r/PrintConfig.cpp:2216
msgid "Detect thin walls"
msgstr "Rileva perimetri sottili"
-#: src/libslic3r/PrintConfig.cpp:3472
+#: src/libslic3r/PrintConfig.cpp:3671
msgid "Detect unconnected parts in the given model(s) and split them into separate objects."
msgstr "Rileva parti non connesse nel modello(i) dato e le divide in oggetti separati."
-#: src/slic3r/GUI/Plater.cpp:2368
+#: src/slic3r/GUI/Plater.cpp:2330
msgid "Detected advanced data"
msgstr "Rilevati dati avanzati"
-#: src/slic3r/GUI/Mouse3DController.cpp:289
+#: src/slic3r/GUI/Mouse3DController.cpp:274
msgid "Device:"
msgstr "Dispositivo:"
-#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/libslic3r/PrintConfig.cpp:709
+#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:745
msgid "Diameter"
msgstr "Diametro"
-#: src/libslic3r/PrintConfig.cpp:2694
+#: src/libslic3r/PrintConfig.cpp:2858
msgid "Diameter in mm of the pillar base"
msgstr "Diametro in mm della base del pilastro"
-#: src/libslic3r/PrintConfig.cpp:2650
+#: src/libslic3r/PrintConfig.cpp:2793
msgid "Diameter in mm of the support pillars"
msgstr "Diametro in mm dei pilastri di supporto"
-#: src/libslic3r/PrintConfig.cpp:2622
+#: src/libslic3r/PrintConfig.cpp:2765
msgid "Diameter of the pointing side of the head"
msgstr "Diametro del lato di puntamento della testa"
-#: src/slic3r/GUI/BedShapeDialog.cpp:94
+#: src/slic3r/GUI/BedShapeDialog.cpp:131
msgid "Diameter of the print bed. It is assumed that origin (0,0) is located in the center."
msgstr "Diametro del piano di stampa. Si presume che l'origine (0,0) si trovi al centro."
-#: src/libslic3r/PrintConfig.cpp:1639
+#: src/libslic3r/PrintConfig.cpp:1747
msgid "Direction"
msgstr "Direzione"
-#: src/libslic3r/PrintConfig.cpp:359
+#: src/libslic3r/PrintConfig.cpp:393
msgid "Disable fan for the first"
msgstr "Disattiva ventola per i primi"
-#: src/libslic3r/PrintConfig.cpp:1349
+#: src/libslic3r/PrintConfig.cpp:1457
msgid "Disables retraction when the travel path does not exceed the upper layer's perimeters (and thus any ooze will be probably invisible)."
msgstr "Disabilita la retrazione quando la traiettoria del movimento non oltrepassa i perimetri del layer superiore (pertanto qualunque scolatura sarà probabilmente invisibile)."
-#: src/slic3r/GUI/DoubleSlider.cpp:952
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:641
+msgid "Discard"
+msgstr "Cancella"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1066
msgid "Discard all custom changes"
msgstr "Elimina tutte le modifiche personalizzate"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1375
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222
msgid "Discard changes"
msgstr "Annulla modifiche"
-#: src/slic3r/GUI/GUI_App.cpp:932 src/slic3r/GUI/Tab.cpp:2946
-msgid "Discard changes and continue anyway?"
-msgstr "Eliminare le modifiche e continuare comunque?"
-
-#: src/slic3r/GUI/Tab.cpp:2078
+#: src/slic3r/GUI/Tab.cpp:2248
msgid "Display"
msgstr "Display"
-#: src/libslic3r/PrintConfig.cpp:2359
+#: src/libslic3r/PrintConfig.cpp:2502
msgid "Display height"
msgstr "Altezza display"
-#: src/libslic3r/PrintConfig.cpp:2378
+#: src/libslic3r/PrintConfig.cpp:2521
msgid "Display horizontal mirroring"
msgstr "Mostra mirroring orizzontale"
-#: src/libslic3r/PrintConfig.cpp:2392
+#: src/libslic3r/PrintConfig.cpp:2535
msgid "Display orientation"
msgstr "Orientamento display"
-#: src/slic3r/GUI/MainFrame.cpp:648
+#: src/slic3r/GUI/MainFrame.cpp:1258
msgid "Display the Print Host Upload Queue window"
msgstr "Mostra la finestra della fila di caricamento all'host di stampa"
-#: src/libslic3r/PrintConfig.cpp:2385
+#: src/libslic3r/PrintConfig.cpp:2528
msgid "Display vertical mirroring"
msgstr "Mostra mirroring verticale"
-#: src/libslic3r/PrintConfig.cpp:2353
+#: src/libslic3r/PrintConfig.cpp:2496
msgid "Display width"
msgstr "Larghezza display"
-#: src/libslic3r/PrintConfig.cpp:377
+#: src/libslic3r/PrintConfig.cpp:411
msgid "Distance between copies"
msgstr "Distanza tra le copie"
-#: src/libslic3r/PrintConfig.cpp:1680
+#: src/libslic3r/PrintConfig.cpp:1157
+msgid "Distance between ironing lines"
+msgstr "Distanza tra le linee di stiratura"
+
+#: src/libslic3r/PrintConfig.cpp:1788
msgid "Distance between skirt and object(s). Set this to zero to attach the skirt to the object(s) and get a brim for better adhesion."
msgstr "La distanza tra skirt e oggetto(i). Imposta questo valore a zero per unire lo skirt all'oggetto(i) e ottenere un brim per una migliore adesione."
-#: src/libslic3r/PrintConfig.cpp:2882
+#: src/libslic3r/PrintConfig.cpp:3046
msgid "Distance between two connector sticks which connect the object and the generated pad."
msgstr "Distanza tra due barre di connessione che collegano l'oggetto e il pad generato."
-#: src/libslic3r/PrintConfig.cpp:1679
+#: src/libslic3r/PrintConfig.cpp:1787
msgid "Distance from object"
msgstr "Distanza dall'oggetto"
-#: src/slic3r/GUI/BedShapeDialog.cpp:85
+#: src/slic3r/GUI/BedShapeDialog.cpp:121
msgid "Distance of the 0,0 G-code coordinate from the front left corner of the rectangle."
msgstr "Distanza della coordinata 0,0 del G-code dall'angolo frontale sinistro del rettangolo."
-#: src/libslic3r/PrintConfig.cpp:320
+#: src/libslic3r/PrintConfig.cpp:354
msgid "Distance of the center-point of the cooling tube from the extruder tip."
msgstr "Distanza del centro del tubo di raffreddamento dalla punta dell'estrusore."
-#: src/libslic3r/PrintConfig.cpp:1382
+#: src/libslic3r/PrintConfig.cpp:1490
msgid "Distance of the extruder tip from the position where the filament is parked when unloaded. This should match the value in printer firmware."
msgstr "Distanza della punta dell'estrusore dalla posizione dove il filamento viene posto mentre viene scaricato. Dovrebbe essere uguale al valore nel firmware della stampante."
-#: src/libslic3r/PrintConfig.cpp:378
+#: src/libslic3r/PrintConfig.cpp:412
msgid "Distance used for the auto-arrange feature of the plater."
msgstr "Distanza usata per la funzione disposizione automatica del piano."
-#: src/libslic3r/PrintConfig.cpp:3486
+#: src/libslic3r/PrintConfig.cpp:3685
msgid "Do not fail if a file supplied to --load does not exist."
msgstr "Non fallire se un file fornito a --load non esiste."
-#: src/libslic3r/PrintConfig.cpp:3430
+#: src/libslic3r/PrintConfig.cpp:3629
msgid "Do not rearrange the given models before merging and keep their original XY coordinates."
msgstr "Non disporre i modelli prima dell’unione e mantieni le coordinate XY originali."
-#: src/slic3r/GUI/Field.cpp:240
+#: src/slic3r/GUI/Field.cpp:288
#, possible-c-format
msgid "Do you mean %s%% instead of %s %s?\nSelect YES if you want to change this value to %s%%, \nor NO if you are sure that %s %s is a correct value."
msgstr "Intendevi %s invece di %s %s?\nSeleziona SI se vuoi cambiare il valore a %s %%,\no NO se sei sicuro che %s %s è il valore corretto."
-#: src/slic3r/GUI/DoubleSlider.cpp:1920
+#: src/slic3r/GUI/DoubleSlider.cpp:2138
msgid "Do you want to delete all saved tool changes?"
msgstr "Vuoi cancellare tutti i cambi attrezzo salvati?"
-#: src/slic3r/GUI/GUI_App.cpp:884
+#: src/slic3r/GUI/GUI_App.cpp:1610
msgid "Do you want to proceed?"
msgstr "Vuoi continuare?"
-#: src/slic3r/GUI/Plater.cpp:3321
+#: src/slic3r/GUI/Plater.cpp:3124
msgid "Do you want to retry"
msgstr "Vuoi riprovare"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1045
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:911
msgid "Do you want to save your manually edited support points?"
msgstr "Vuoi salvare i punti di supporto modificati manualmente?"
-#: src/slic3r/GUI/ConfigWizard.cpp:1834
+#: src/slic3r/GUI/ConfigWizard.cpp:2261
msgid "Do you want to select default filaments for these FFF printer models?"
msgstr "Vuoi selezionare i filamenti predefiniti per questi modelli di stampante FFF?"
-#: src/slic3r/GUI/ConfigWizard.cpp:1852
+#: src/slic3r/GUI/ConfigWizard.cpp:2279
msgid "Do you want to select default SLA materials for these printer models?"
msgstr "Vuoi selezionare i materiali SLA predefiniti per questi modelli di stampante?"
-#: src/libslic3r/PrintConfig.cpp:3429
+#: src/slic3r/GUI/Plater.cpp:4751
+msgid "does not contain valid gcode."
+msgstr "non contiene un g-code valido."
+
+#: src/libslic3r/PrintConfig.cpp:3628
msgid "Don't arrange"
msgstr "Non disporre"
@@ -2021,7 +2392,11 @@ msgstr "Non disporre"
msgid "Don't notify about new releases any more"
msgstr "Non notificare più i nuovi rilasci"
-#: src/libslic3r/PrintConfig.cpp:369
+#: src/slic3r/GUI/Plater.cpp:1431
+msgid "Don't show again"
+msgstr "Non mostrare più"
+
+#: src/libslic3r/PrintConfig.cpp:403
msgid "Don't support bridges"
msgstr "Non supportare i bridge"
@@ -2029,234 +2404,312 @@ msgstr "Non supportare i bridge"
msgid "Downgrade"
msgstr "Downgrade"
-#: src/libslic3r/PrintConfig.cpp:1695
+#: src/libslic3r/PrintConfig.cpp:1803
msgid "Draft shield"
msgstr "Scudo di protezione"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1368
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1369
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216
msgid "Drag"
msgstr "Trascina"
-#: src/libslic3r/SLAPrintSteps.cpp:44
+#: src/slic3r/GUI/Plater.cpp:1406
+msgid "Drag and drop G-code file"
+msgstr "Trascina e rilascia un file G-code"
+
+#: src/libslic3r/SLAPrintSteps.cpp:45
msgid "Drilling holes into model."
-msgstr "Praticare fori nel modello."
+msgstr "Eseguendo i fori nel modello."
-#: src/libslic3r/SLAPrintSteps.cpp:199
+#: src/libslic3r/SLAPrintSteps.cpp:201
msgid "Drilling holes into the mesh failed. This is usually caused by broken model. Try to fix it first."
msgstr "Applicazione dei fori nella mesh non riuscita. Questo solitamente è causato da un modello corrotto. Prova prima a sistemarlo."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:337
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:349
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:345
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:357
msgid "Drop to bed"
msgstr "Poggia sul piano"
-#: src/libslic3r/PrintConfig.cpp:3433
+#: src/libslic3r/PrintConfig.cpp:3632
msgid "Duplicate"
msgstr "Duplica"
-#: src/libslic3r/PrintConfig.cpp:3438
+#: src/libslic3r/PrintConfig.cpp:3637
msgid "Duplicate by grid"
msgstr "Duplica per griglia"
-#: src/slic3r/GUI/PresetHints.cpp:40
-msgid "During the other layers, fan"
-msgstr "Durante gli altri layer, la ventola"
+#: src/slic3r/GUI/GCodeViewer.cpp:2445
+msgid "Duration"
+msgstr "Durata"
+
+#: src/slic3r/GUI/PresetHints.cpp:51
+msgid "During the other layers, fan will always run at %1%%%"
+msgstr "Durante gli altri layer, la ventola lavorerà sempre a %1%%%"
+
+#: src/slic3r/GUI/PresetHints.cpp:58
+msgid "During the other layers, fan will be turned off."
+msgstr "Durante gli altri layer, la ventola sarà spenta."
-#: src/libslic3r/PrintConfig.cpp:2669
+#: src/libslic3r/PrintConfig.cpp:2833
msgid "Dynamic"
msgstr "Dinamico"
-#: src/slic3r/GUI/MainFrame.cpp:749
+#: src/slic3r/GUI/MainFrame.cpp:1448
msgid "E&xport"
msgstr "Esporta"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:347
+#: src/slic3r/GUI/GUI_ObjectList.cpp:394
msgid "edges fixed"
msgstr "spigoli riparati"
-#: src/slic3r/GUI/DoubleSlider.cpp:1508
+#: src/slic3r/GUI/DoubleSlider.cpp:1700
msgid "Edit color"
msgstr "Modifica colore"
-#: src/slic3r/GUI/DoubleSlider.cpp:960
+#: src/slic3r/GUI/DoubleSlider.cpp:1083
msgid "Edit current color - Right click the colored slider segment"
msgstr "Modifica colore attuale - Clic destro sul segmento colorato della barra di scorrimento"
-#: src/slic3r/GUI/DoubleSlider.cpp:1510
+#: src/slic3r/GUI/DoubleSlider.cpp:1702
msgid "Edit custom G-code"
msgstr "Modifica G-code personalizzato"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3003
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3459
msgid "Edit Height Range"
msgstr "Modifica Intervallo Altezza"
-#: src/slic3r/GUI/DoubleSlider.cpp:1509
+#: src/slic3r/GUI/DoubleSlider.cpp:1701
msgid "Edit pause print message"
msgstr "Modifica messaggio pausa di stampa"
-#: src/slic3r/GUI/DoubleSlider.cpp:1037
+#: src/slic3r/GUI/PresetComboBoxes.cpp:645
+msgid "Edit physical printer"
+msgstr "Modifica stampante fisica"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:641
+msgid "Edit preset"
+msgstr "Modifica preset"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1162
msgid "Edit tick mark - Ctrl + Left click"
msgstr "Modifica segno di spunta - Ctrl + Clic Sinistro"
-#: src/slic3r/GUI/DoubleSlider.cpp:1038
+#: src/slic3r/GUI/DoubleSlider.cpp:1163
msgid "Edit tick mark - Right click"
msgstr "Modifica segno di spunta - Clic destro"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:282 src/slic3r/GUI/GUI_ObjectList.cpp:394
+#: src/slic3r/GUI/GUI_ObjectList.cpp:300 src/slic3r/GUI/GUI_ObjectList.cpp:441
msgid "Editing"
msgstr "Modifica"
-#: src/slic3r/GUI/MainFrame.cpp:547
+#: src/slic3r/GUI/MainFrame.cpp:1105
msgid "Ejec&t SD card / Flash drive"
msgstr "Espelli Scheda SD / Memoria flash &t"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:126
+#: src/slic3r/GUI/NotificationManager.cpp:780
+msgid "Eject drive"
+msgstr "Espelli dispositivo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:119
msgid "Eject SD card / Flash drive"
msgstr "Espelli scheda SD / Memoria flash"
-#: src/slic3r/GUI/MainFrame.cpp:547
+#: src/slic3r/GUI/MainFrame.cpp:1105
msgid "Eject SD card / Flash drive after the G-code was exported to it."
msgstr "Espelli scheda SD / Memoria flash dopo l'esportazione del G-code in essa."
-#: src/slic3r/GUI/Plater.cpp:2202
+#: src/slic3r/GUI/Plater.cpp:2034
#, possible-c-format
msgid "Ejecting of device %s(%s) has failed."
msgstr "Espulsione del dispositivo %s(%s) non riuscita."
-#: src/libslic3r/PrintConfig.cpp:118
+#: src/libslic3r/PrintConfig.cpp:120
msgid "Elephant foot compensation"
msgstr "Compensazione zampa d'elefante"
-#: src/libslic3r/PrintConfig.cpp:2447
+#: src/libslic3r/PrintConfig.cpp:2590
msgid "Elephant foot minimum width"
msgstr "Larghezza minima zampa d'elefante"
-#: src/libslic3r/SLAPrint.cpp:625
+#: src/libslic3r/SLAPrint.cpp:639
msgid "Elevation is too low for object. Use the \"Pad around object\" feature to print the object without elevation."
msgstr "L'elevazione è troppo bassa per l'oggetto. Utilizza la funzione \"Pad intorno all'oggetto\" per stampare l'oggetto senza elevazione."
-#: src/libslic3r/PrintConfig.cpp:1093
+#: src/libslic3r/PrintConfig.cpp:1186
msgid "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute intervals into the G-code to let the firmware show accurate remaining time. As of now only the Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 firmware supports M73 Qxx Sxx for the silent mode."
msgstr "Inserisce M73 P[percent printed] R[remaining time in minutes] ad intervalli di un minuto nel G-code per permettere al firmware di mostrare un tempo residuo accurato. Al momento solo il firmware della Prusa i3 MK3 riconosce M73. Il firmware della i3 MK3 supporta il codice M73 Qxx Sxx anche per la modalità silenziosa."
-#: src/libslic3r/GCode.cpp:637
+#: src/libslic3r/PrintConfig.cpp:1217
+msgid "Emit to G-code"
+msgstr "Invia a G-code"
+
+#: src/libslic3r/GCode.cpp:622
msgid "Empty layers detected, the output would not be printable."
msgstr "Rilevati layer vuoti, il file non sarà stampabile."
-#: src/slic3r/GUI/Tab.cpp:1445 src/libslic3r/PrintConfig.cpp:1355
-#: src/libslic3r/PrintConfig.cpp:2200
+#: src/slic3r/GUI/Tab.cpp:1791 src/libslic3r/PrintConfig.cpp:1463
+#: src/libslic3r/PrintConfig.cpp:2343
msgid "Enable"
msgstr "Abilita"
-#: src/libslic3r/PrintConfig.cpp:313
+#: src/libslic3r/PrintConfig.cpp:347
msgid "Enable auto cooling"
msgstr "Abilita raffreddamento automatico"
-#: src/libslic3r/PrintConfig.cpp:572
+#: src/libslic3r/PrintConfig.cpp:608
msgid "Enable fan if layer print time is below"
-msgstr "Attiva ventola se la stampa del layer impiega meno di"
+msgstr "Attiva ventola se il tempo di stampa del layer è inferiore a"
-#: src/libslic3r/PrintConfig.cpp:2908
+#: src/libslic3r/PrintConfig.cpp:3072
msgid "Enable hollowing"
msgstr "Attiva svuotamento"
-#: src/libslic3r/PrintConfig.cpp:2380
+#: src/libslic3r/PrintConfig.cpp:2523
msgid "Enable horizontal mirroring of output images"
msgstr "Attiva il mirroring orizzontale per le immagini di output"
-#: src/libslic3r/PrintConfig.cpp:1867
+#: src/libslic3r/PrintConfig.cpp:1124
+msgid "Enable ironing"
+msgstr "Attiva stiratura"
+
+#: src/libslic3r/PrintConfig.cpp:1125
+msgid "Enable ironing of the top layers with the hot print head for smooth surface"
+msgstr "Abilitare la stiratura degli strati superiori con la testina di stampa a caldo per una superficie liscia"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3901
+msgid "Enable rotations (slow)"
+msgstr "Attiva rotazioni (lento)"
+
+#: src/slic3r/GUI/Preferences.cpp:207
+msgid "Enable support for legacy 3DConnexion devices"
+msgstr "Abilitare il supporto per i dispositivi 3DConnexion"
+
+#: src/libslic3r/PrintConfig.cpp:2009
msgid "Enable support material generation."
msgstr "Abilita la generazione di materiale di supporto."
-#: src/libslic3r/PrintConfig.cpp:966
+#: src/libslic3r/PrintConfig.cpp:1010
msgid "Enable this to add comments into the G-Code labeling print moves with what object they belong to, which is useful for the Octoprint CancelObject plugin. This settings is NOT compatible with Single Extruder Multi Material setup and Wipe into Object / Wipe into Infill."
msgstr "Attivalo per aggiungere commenti nel G-Code etichettando i movimenti di stampa secondo l'appartenenza, utile per il plugin Octoprint CancelObject. Questa impostazione NON è compatibile con una configurazione Multi Material ad estrusore singolo e con Spurgo nell'oggetto / Spurgo nel riempimento."
-#: src/libslic3r/PrintConfig.cpp:929
+#: src/libslic3r/PrintConfig.cpp:973
msgid "Enable this to get a commented G-code file, with each line explained by a descriptive text. If you print from SD card, the additional weight of the file could make your firmware slow down."
msgstr "Abilita per ottenere un file G-code commentato, con un testo descrittivo per ciascuna linea. Se stampi da memoria SD, il peso aggiuntivo del file potrebbe rallentare il firmware."
-#: src/libslic3r/PrintConfig.cpp:2186
+#: src/libslic3r/PrintConfig.cpp:2329
msgid "Enable variable layer height feature"
msgstr "Abilita layer ad altezza variabile"
-#: src/libslic3r/PrintConfig.cpp:2387
+#: src/libslic3r/PrintConfig.cpp:2530
msgid "Enable vertical mirroring of output images"
msgstr "Attiva mirroring verticale per le immagini di output"
-#: src/slic3r/GUI/Tab.cpp:1534 src/slic3r/GUI/Tab.cpp:1982
-#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:395
+#: src/slic3r/GUI/Tab.cpp:1880 src/slic3r/GUI/Tab.cpp:2168
+#: src/libslic3r/PrintConfig.cpp:419 src/libslic3r/PrintConfig.cpp:429
msgid "End G-code"
msgstr "G-code finale"
-#: src/libslic3r/PrintConfig.cpp:1924
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:239
+msgid "Enforce"
+msgstr "Rinforzo"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:30
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:381
+msgid "Enforce seam"
+msgstr "Rinforzo giunzione"
+
+#: src/libslic3r/PrintConfig.cpp:2066
msgid "Enforce support for the first"
-msgstr "Applica il supporto per i primi"
+msgstr "Rinforza il supporto per i primi"
-#: src/libslic3r/PrintConfig.cpp:1931
+#: src/libslic3r/PrintConfig.cpp:2073
msgid "Enforce support for the first n layers"
msgstr "Applica il supporto per i primi n layer"
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47
+msgid "Enforce supports"
+msgstr "Rinforzi supporti"
+
#: src/slic3r/GUI/PrintHostDialogs.cpp:198
#: src/slic3r/GUI/PrintHostDialogs.cpp:229
msgid "Enqueued"
msgstr "Messo in coda"
-#: src/libslic3r/PrintConfig.cpp:407
+#: src/libslic3r/PrintConfig.cpp:441
msgid "Ensure vertical shell thickness"
msgstr "Mantieni spessore guscio verticale"
-#: src/slic3r/GUI/DoubleSlider.cpp:1618
+#: src/slic3r/GUI/GLCanvas3D.cpp:4402 src/slic3r/GUI/GLCanvas3D.cpp:4410
+#: src/slic3r/GUI/Search.cpp:433
+msgid "Enter a search term"
+msgstr "Inserire un termine di ricerca"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1814
msgid "Enter custom G-code used on current layer"
msgstr "Inserisci il G-code personalizzato da usare al layer corrente"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3803
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4266
msgid "Enter new name"
msgstr "Inserisci un nuovo nome"
-#: src/slic3r/GUI/DoubleSlider.cpp:1634
+#: src/slic3r/GUI/DoubleSlider.cpp:1830
msgid "Enter short message shown on Printer display when a print is paused"
msgstr "Inserisci un breve messaggio da mostrare sul display della stampante quando una stampa è in pausa"
-#: src/slic3r/GUI/ConfigWizard.cpp:1047
+#: src/slic3r/GUI/ConfigWizard.cpp:1413
msgid "Enter the bed temperature needed for getting your filament to stick to your heated bed."
msgstr "Inserisci la temperatura del piano necessaria per l'adesione del filamento al piano riscaldato."
-#: src/slic3r/GUI/ConfigWizard.cpp:979
+#: src/slic3r/GUI/ConfigWizard.cpp:1345
msgid "Enter the diameter of your filament."
msgstr "Inserisci il diametro del filamento."
-#: src/slic3r/GUI/ConfigWizard.cpp:966
+#: src/slic3r/GUI/ConfigWizard.cpp:1332
msgid "Enter the diameter of your printer's hot end nozzle."
msgstr "Inserisci il diametro dell'ugello dell'estrusore della stampante."
-#: src/slic3r/GUI/DoubleSlider.cpp:1650
+#: src/slic3r/GUI/DoubleSlider.cpp:1851 src/slic3r/GUI/DoubleSlider.cpp:1855
msgid "Enter the height you want to jump to"
msgstr "Inserisci l'altezza a cui si vuole saltare"
-#: src/slic3r/GUI/Plater.cpp:4751
+#: src/slic3r/GUI/DoubleSlider.cpp:1851
+msgid "Enter the move you want to jump to"
+msgstr "Inserisci lo spostamento a cui vuoi saltare"
+
+#: src/slic3r/GUI/Plater.cpp:4855
msgid "Enter the number of copies:"
msgstr "Inserisci il numero di copie:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1033
+#: src/slic3r/GUI/ConfigWizard.cpp:1399
msgid "Enter the temperature needed for extruding your filament."
msgstr "Inserisci la temperatura necessaria per estrudere il filamento."
-#: src/libslic3r/PrintConfig.cpp:761
+#: src/libslic3r/PrintConfig.cpp:813
+msgid "Enter weight of the empty filament spool. One may weigh a partially consumed filament spool before printing and one may compare the measured weight with the calculated weight of the filament with the spool to find out whether the amount of filament on the spool is sufficient to finish the print."
+msgstr "Inserire il peso della bobina del filamento vuota. È possibile pesare una bobina di filamento parzialmente consumata prima della stampa e confrontare il peso misurato con il peso calcolato del filamento con la bobina per scoprire se la quantità di filamento sulla bobina è sufficiente a terminare la stampa."
+
+#: src/libslic3r/PrintConfig.cpp:797
msgid "Enter your filament cost per kg here. This is only for statistical information."
msgstr "Inserisci qui il costo del filamento per kg. È solo un'informazione statistica."
-#: src/libslic3r/PrintConfig.cpp:718
+#: src/libslic3r/PrintConfig.cpp:754
msgid "Enter your filament density here. This is only for statistical information. A decent way is to weigh a known length of filament and compute the ratio of the length to volume. Better is to calculate the volume directly through displacement."
msgstr "Inserisci qui la densità del filamento. È solo un'informazione statistica. Un metodo di calcolo approssimativo consiste nel pesare un pezzo di filamento di lunghezza nota, e calcolare il rapporto tra lunghezza e volume. È meglio calcolare il volume direttamente attraverso il dislocamento."
-#: src/libslic3r/PrintConfig.cpp:710
+#: src/libslic3r/PrintConfig.cpp:746
msgid "Enter your filament diameter here. Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average."
msgstr "Inserisci qui il diametro del filamento. È richiesta una buona precisione, pertanto usa un calibro ed esegui misurazioni multiple lungo il filamento, per poi ricavare una media."
-#: src/slic3r/GUI/MainFrame.cpp:422 src/slic3r/GUI/MainFrame.cpp:785
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:39
+msgid "Entering Paint-on supports"
+msgstr "Inserimento supporti Paint-on"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:40
+msgid "Entering Seam painting"
+msgstr "Inserimento Pittura giunzione"
+
+#: src/slic3r/GUI/MainFrame.cpp:1003 src/slic3r/GUI/MainFrame.cpp:1486
#: src/slic3r/GUI/PrintHostDialogs.cpp:231
msgid "Error"
msgstr "Errore"
@@ -2266,25 +2719,33 @@ msgstr "Errore"
msgid "Error accessing port at %s: %s"
msgstr "Errore nell'accedere alla porta a%s: %s"
-#: src/slic3r/GUI/Plater.cpp:3433
+#: src/slic3r/GUI/Plater.cpp:3238
msgid "Error during reload"
msgstr "Errore durante il ri-caricamento"
-#: src/slic3r/GUI/Plater.cpp:5043
+#: src/slic3r/GUI/Plater.cpp:5172
#, possible-c-format
msgid "Error exporting 3MF file %s"
msgstr "Errore nell'esportazione del file 3MF %s"
-#: src/slic3r/GUI/Plater.cpp:5005
+#: src/slic3r/GUI/Plater.cpp:5138
#, possible-c-format
msgid "Error exporting AMF file %s"
msgstr "Errore nell'esportazione del file AMF %s"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:154
+#: src/slic3r/GUI/OpenGLManager.cpp:276
+msgid "Error loading shaders"
+msgstr "Errore caricamento shader"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:152
msgid "Error Message"
msgstr "Messaggio d'errore"
-#: src/slic3r/GUI/AppConfig.cpp:114
+#: src/slic3r/GUI/GUI_App.cpp:661
+msgid "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to manually delete the file to recover from the error."
+msgstr "Errore nell'analisi del file di configurazione di PrusaGCodeViewer, probabilmente è corrotto. Provare a cancellare manualmente il file per risolvere l'errore."
+
+#: src/slic3r/GUI/GUI_App.cpp:655 src/slic3r/GUI/GUI_App.cpp:670
msgid "Error parsing PrusaSlicer config file, it is probably corrupted. Try to manually delete the file to recover from the error. Your user profiles will not be affected."
msgstr "Errore nell'analisi del file config di PrusaSlicer, probabilmente è corrotto. Per risolvere questo problema prova ad eliminare manualmente il file. Il tuoi profili utente non verranno toccati."
@@ -2292,45 +2753,64 @@ msgstr "Errore nell'analisi del file config di PrusaSlicer, probabilmente è cor
msgid "Error uploading to print host:"
msgstr "Errore durante il caricamento dell'host di stampa:"
-#: src/libslic3r/Zipper.cpp:102
+#: src/slic3r/GUI/Plater.cpp:4752
+msgid "Error while loading .gcode file"
+msgstr "Errore durante il caricamento del file .gcode"
+
+#: src/libslic3r/Zipper.cpp:27
msgid "Error with zip archive"
msgstr "Errore con archivio zip"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1918
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2077
msgid "Error!"
msgstr "Errore!"
-#: src/slic3r/GUI/BedShapeDialog.cpp:505
+#: src/slic3r/GUI/BedShapeDialog.cpp:581
msgid "Error! Invalid model"
msgstr "Errore! Modello non valido"
+#: src/slic3r/GUI/NotificationManager.cpp:667
+#: src/slic3r/GUI/NotificationManager.cpp:683
+#: src/slic3r/GUI/NotificationManager.cpp:694
+msgid "ERROR:"
+msgstr "ERRORE:"
+
#: src/slic3r/GUI/FirmwareDialog.cpp:647
#, possible-c-format
msgid "Error: %s"
msgstr "Errore: %s"
-#: src/slic3r/GUI/Job.hpp:123
+#: src/slic3r/GUI/Jobs/Job.cpp:74
msgid "ERROR: not enough resources to execute a new job."
msgstr "ERRORE: risorse non sufficienti per eseguire un nuovo lavoro."
-#: src/slic3r/GUI/Plater.cpp:240 src/slic3r/GUI/Plater.cpp:1216
-#: src/slic3r/GUI/Plater.cpp:1258
+#: src/slic3r/GUI/Plater.cpp:3374
+msgid "ERROR: Please close all manipulators available from the left toolbar before fixing the mesh."
+msgstr "ERRORE: Chiudi tutti i manipolatori disponibili sulla barra degli strumenti di sinistra prima di riparare la mesh."
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2552 src/slic3r/GUI/GCodeViewer.cpp:2557
+#: src/slic3r/GUI/Plater.cpp:246 src/slic3r/GUI/Plater.cpp:1125
+#: src/slic3r/GUI/Plater.cpp:1175 src/slic3r/GUI/Plater.cpp:1196
msgid "Estimated printing time"
msgstr "Tempo di stampa stimato"
-#: src/slic3r/GUI/Plater.cpp:502
+#: src/slic3r/GUI/GCodeViewer.cpp:2442 src/slic3r/GUI/GCodeViewer.cpp:2445
+msgid "Event"
+msgstr "Evento"
+
+#: src/slic3r/GUI/Plater.cpp:368
msgid "Everywhere"
msgstr "Ovunque"
-#: src/slic3r/GUI/PresetHints.cpp:51
+#: src/slic3r/GUI/PresetHints.cpp:50
msgid "except for the first %1% layers."
msgstr "ad eccezione dei primi %1% layer."
-#: src/slic3r/GUI/PresetHints.cpp:53
+#: src/slic3r/GUI/PresetHints.cpp:52
msgid "except for the first layer."
msgstr "ad eccezione del primo layer."
-#: src/libslic3r/Print.cpp:1377
+#: src/libslic3r/Print.cpp:1403
msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm"
msgstr "%1% %2% mm eccessivi per essere stampabili con un diametro ugello di %3% mm"
@@ -2339,116 +2819,129 @@ msgstr "%1% %2% mm eccessivi per essere stampabili con un diametro ugello di %3%
msgid "Exit %s"
msgstr "Chiudi %s"
-#: src/libslic3r/PrintConfig.cpp:371
+#: src/slic3r/GUI/Plater.cpp:2143
+msgid "Expand sidebar"
+msgstr "Espandi barra laterale"
+
+#: src/libslic3r/PrintConfig.cpp:405
msgid "Experimental option for preventing support material from being generated under bridged areas."
msgstr "Opzione sperimentale per prevenire la formazione di supporti sotto i bridge."
-#: src/libslic3r/PrintConfig.cpp:1375
+#: src/libslic3r/PrintConfig.cpp:1483
msgid "Experimental option to adjust flow for overhangs (bridge flow will be used), to apply bridge speed to them and enable fan."
msgstr "Opzione sperimentale per regolare il flusso delle sporgenze (sarà utilizzato il flusso dei bridge), applicare la velocità del bridge e attivare la ventola."
-#: src/slic3r/GUI/GUI_App.cpp:815 src/slic3r/GUI/wxExtensions.cpp:755
+#: src/slic3r/GUI/GUI_App.cpp:1507 src/slic3r/GUI/wxExtensions.cpp:676
msgid "Expert"
msgstr "Esperto"
-#: src/slic3r/GUI/ConfigWizard.cpp:822
+#: src/slic3r/GUI/ConfigWizard.cpp:1181
msgid "Expert mode"
msgstr "Modalità Esperto"
-#: src/slic3r/GUI/GUI_App.cpp:815
+#: src/slic3r/GUI/GUI_App.cpp:1507
msgid "Expert View Mode"
msgstr "Modalità Visualizzazione Esperto"
-#: src/slic3r/GUI/Plater.cpp:5521
+#: src/slic3r/GUI/Plater.cpp:5706
msgid "Export"
msgstr "Esporta"
-#: src/slic3r/GUI/MainFrame.cpp:500
+#: src/slic3r/GUI/MainFrame.cpp:1094
msgid "Export &Config"
msgstr "Esporta &Configurazione"
-#: src/slic3r/GUI/MainFrame.cpp:477 src/slic3r/GUI/MainFrame.cpp:749
+#: src/slic3r/GUI/MainFrame.cpp:1068 src/slic3r/GUI/MainFrame.cpp:1448
msgid "Export &G-code"
msgstr "Esporta &G-code"
-#: src/slic3r/GUI/MainFrame.cpp:496
+#: src/slic3r/GUI/MainFrame.cpp:1090 src/slic3r/GUI/MainFrame.cpp:1395
msgid "Export &toolpaths as OBJ"
msgstr "Esporta percorso a&ttrezzo come OBJ"
-#: src/libslic3r/PrintConfig.cpp:3338
+#: src/libslic3r/PrintConfig.cpp:3531
msgid "Export 3MF"
msgstr "Esporta 3MF"
-#: src/slic3r/GUI/MainFrame.cpp:503
+#: src/slic3r/GUI/MainFrame.cpp:1100
+msgid "Export all presets including physical printers to file"
+msgstr "Esportazione di tutti i preset, incluse le stampanti fisiche, su file"
+
+#: src/slic3r/GUI/MainFrame.cpp:1097
msgid "Export all presets to file"
msgstr "Esporta tutti i preset su file"
-#: src/libslic3r/PrintConfig.cpp:3343
+#: src/libslic3r/PrintConfig.cpp:3536
msgid "Export AMF"
msgstr "Esporta AMF"
-#: src/slic3r/GUI/Plater.cpp:2598
+#: src/slic3r/GUI/Plater.cpp:2560
msgid "Export AMF file:"
msgstr "Esporta file AMF:"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1657 src/slic3r/GUI/Plater.cpp:3966
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1786 src/slic3r/GUI/Plater.cpp:3884
msgid "Export as STL"
msgstr "Esporta come STL"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:124
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:117
msgid "Export config"
msgstr "Esporta config"
-#: src/slic3r/GUI/MainFrame.cpp:503
+#: src/slic3r/GUI/MainFrame.cpp:1097
msgid "Export Config &Bundle"
-msgstr "Esporta Configurazione da &Bundle"
+msgstr "Esporta Configurazione in &Bundle"
-#: src/slic3r/GUI/MainFrame.cpp:500
+#: src/slic3r/GUI/MainFrame.cpp:1100
+msgid "Export Config Bundle With Physical Printers"
+msgstr "Esportazione Config Bundle con stampanti fisiche"
+
+#: src/slic3r/GUI/MainFrame.cpp:1094
msgid "Export current configuration to file"
msgstr "Esporta la configurazione corrente su file"
-#: src/slic3r/GUI/MainFrame.cpp:492
+#: src/slic3r/GUI/MainFrame.cpp:1086
msgid "Export current plate as AMF"
msgstr "Esporta il piano corrente come AMF"
-#: src/slic3r/GUI/MainFrame.cpp:477
+#: src/slic3r/GUI/MainFrame.cpp:1068
msgid "Export current plate as G-code"
msgstr "Esporta il piano corrente come G-code"
-#: src/slic3r/GUI/MainFrame.cpp:521
+#: src/slic3r/GUI/MainFrame.cpp:1076
msgid "Export current plate as G-code to SD card / Flash drive"
msgstr "Esporta il piano corrente come G-code su scheda SD / Memoria flash"
-#: src/slic3r/GUI/MainFrame.cpp:486
+#: src/slic3r/GUI/MainFrame.cpp:1080
msgid "Export current plate as STL"
msgstr "Esporta il piano corrente come STL"
-#: src/slic3r/GUI/MainFrame.cpp:489
+#: src/slic3r/GUI/MainFrame.cpp:1083
msgid "Export current plate as STL including supports"
msgstr "Esporta piano corrente come STL includendo i supporti"
-#: src/slic3r/GUI/Plater.cpp:3664
-msgid "Export failed"
-msgstr "Esportazione fallita"
-
-#: src/slic3r/GUI/ConfigWizard.cpp:801
+#: src/slic3r/GUI/ConfigWizard.cpp:1160
msgid "Export full pathnames of models and parts sources into 3mf and amf files"
msgstr "Esporta il percorso completo dei modelli e fonti delle parti nei file 3mf e amf"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 src/slic3r/GUI/Plater.cpp:891
-#: src/slic3r/GUI/Plater.cpp:5521 src/libslic3r/PrintConfig.cpp:3353
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/Plater.cpp:766
+#: src/slic3r/GUI/Plater.cpp:5706 src/libslic3r/PrintConfig.cpp:3546
msgid "Export G-code"
msgstr "Esporta G-code"
-#: src/slic3r/GUI/MainFrame.cpp:521
+#: src/slic3r/GUI/MainFrame.cpp:1076
msgid "Export G-code to SD card / Flash drive"
msgstr "Esporta G-code su Scheda SD / Memoria flash"
-#: src/libslic3r/PrintConfig.cpp:3320
+#: src/slic3r/GUI/NotificationManager.cpp:631
+#: src/slic3r/GUI/NotificationManager.cpp:748
+msgid "Export G-Code."
+msgstr "Esporta G-code."
+
+#: src/libslic3r/PrintConfig.cpp:3513
msgid "Export OBJ"
msgstr "Esporta OBJ"
-#: src/slic3r/GUI/Plater.cpp:2610
+#: src/slic3r/GUI/Plater.cpp:2572
msgid "Export OBJ file:"
msgstr "Esporta file OBJ:"
@@ -2456,212 +2949,215 @@ msgstr "Esporta file OBJ:"
msgid "Export of a temporary 3mf file failed"
msgstr "L'esportazione di un file 3mf non è riuscita"
-#: src/slic3r/GUI/MainFrame.cpp:492
+#: src/slic3r/GUI/MainFrame.cpp:1086
msgid "Export plate as &AMF"
msgstr "Esporta piano come &AMF"
-#: src/slic3r/GUI/MainFrame.cpp:486
+#: src/slic3r/GUI/MainFrame.cpp:1080
msgid "Export plate as &STL"
msgstr "Esporta piano come &STL"
-#: src/slic3r/GUI/MainFrame.cpp:489
+#: src/slic3r/GUI/MainFrame.cpp:1083
msgid "Export plate as STL &including supports"
msgstr "Esporta piano come STL &includendo i supporti"
-#: src/libslic3r/PrintConfig.cpp:3332
+#: src/libslic3r/PrintConfig.cpp:3525
msgid "Export SLA"
msgstr "Esporta SLA"
-#: src/slic3r/GUI/Preferences.cpp:72
+#: src/slic3r/GUI/Preferences.cpp:89
msgid "Export sources full pathnames to 3mf and amf"
msgstr "Esporta il percorso completo delle fonti su 3mf e amf"
-#: src/libslic3r/PrintConfig.cpp:3348
+#: src/libslic3r/PrintConfig.cpp:3541
msgid "Export STL"
msgstr "Esporta STL"
-#: src/slic3r/GUI/Plater.cpp:2591
+#: src/slic3r/GUI/Plater.cpp:2553
msgid "Export STL file:"
msgstr "Esporta file STL:"
-#: src/libslic3r/PrintConfig.cpp:3339
+#: src/libslic3r/PrintConfig.cpp:3532
msgid "Export the model(s) as 3MF."
msgstr "Esporta modello/i come 3MF."
-#: src/libslic3r/PrintConfig.cpp:3344
+#: src/libslic3r/PrintConfig.cpp:3537
msgid "Export the model(s) as AMF."
msgstr "Esporta il modello(i) come AMF."
-#: src/libslic3r/PrintConfig.cpp:3321
+#: src/libslic3r/PrintConfig.cpp:3514
msgid "Export the model(s) as OBJ."
msgstr "Esporta il modello(i) come OBJ."
-#: src/libslic3r/PrintConfig.cpp:3349
+#: src/libslic3r/PrintConfig.cpp:3542
msgid "Export the model(s) as STL."
msgstr "Esporta il modello(i) come STL."
-#: src/slic3r/GUI/Plater.cpp:3966
+#: src/slic3r/GUI/Plater.cpp:3884
msgid "Export the selected object as STL file"
msgstr "Esporta l'oggetto selezionato come file STL"
-#: src/slic3r/GUI/Plater.cpp:880
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 src/slic3r/GUI/Plater.cpp:755
msgid "Export to SD card / Flash drive"
msgstr "Esporta su scheda SD / memoria Flash"
-#: src/slic3r/GUI/MainFrame.cpp:496
+#: src/slic3r/GUI/MainFrame.cpp:1090 src/slic3r/GUI/MainFrame.cpp:1395
msgid "Export toolpaths as OBJ"
msgstr "Esporta percorso attrezzo come OBJ"
-#: src/libslic3r/Print.cpp:1638
+#: src/slic3r/GUI/NotificationManager.hpp:317
+msgid "Exporting finished."
+msgstr "Esportazione completata."
+
+#: src/libslic3r/Print.cpp:1676
msgid "Exporting G-code"
msgstr "Esportando il G-code"
#: src/slic3r/Utils/FixModelByWin10.cpp:341
-msgid "Exporting model..."
-msgstr "Esportazione modello..."
+msgid "Exporting model"
+msgstr "Esportazione modello"
#: src/slic3r/Utils/FixModelByWin10.cpp:219
#: src/slic3r/Utils/FixModelByWin10.cpp:359
msgid "Exporting source model"
msgstr "Esportazione modello sorgente"
-#: src/libslic3r/SLAPrint.cpp:646
+#: src/libslic3r/SLAPrint.cpp:660
msgid "Exposition time is out of printer profile bounds."
msgstr "Il tempo di esposizione è fuori dai limiti del profilo stampante."
-#: src/slic3r/GUI/Tab.cpp:2117 src/slic3r/GUI/Tab.cpp:3515
+#: src/slic3r/GUI/Tab.cpp:2287 src/slic3r/GUI/Tab.cpp:3931
msgid "Exposure"
msgstr "Esposizione"
-#: src/libslic3r/PrintConfig.cpp:2541 src/libslic3r/PrintConfig.cpp:2542
+#: src/libslic3r/PrintConfig.cpp:2684 src/libslic3r/PrintConfig.cpp:2685
msgid "Exposure time"
msgstr "Tempo di esposizione"
-#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:311
+#: src/slic3r/GUI/GUI_Preview.cpp:302 src/libslic3r/ExtrusionEntity.cpp:315
+#: src/libslic3r/ExtrusionEntity.cpp:338
msgid "External perimeter"
msgstr "Perimetro esterno"
-#: src/slic3r/GUI/PresetHints.cpp:156
+#: src/slic3r/GUI/PresetHints.cpp:155
msgid "external perimeters"
msgstr "perimetri esterni"
-#: src/libslic3r/PrintConfig.cpp:446 src/libslic3r/PrintConfig.cpp:457
+#: src/libslic3r/PrintConfig.cpp:482 src/libslic3r/PrintConfig.cpp:493
msgid "External perimeters"
msgstr "Perimetri esterni"
-#: src/libslic3r/PrintConfig.cpp:469
+#: src/libslic3r/PrintConfig.cpp:505
msgid "External perimeters first"
msgstr "Perimetri esterni per primi"
-#: src/libslic3r/PrintConfig.cpp:1588 src/libslic3r/PrintConfig.cpp:1596
+#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1704
msgid "Extra length on restart"
msgstr "Lunghezza extra in ripresa"
-#: src/libslic3r/PrintConfig.cpp:1390
+#: src/libslic3r/PrintConfig.cpp:1498
msgid "Extra loading distance"
msgstr "Distanza di caricamento aggiuntiva"
-#: src/libslic3r/PrintConfig.cpp:477
+#: src/libslic3r/PrintConfig.cpp:513
msgid "Extra perimeters if needed"
msgstr "Perimetro aggiuntivo se necessario"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:278 src/slic3r/GUI/Tab.cpp:1434
-#: src/slic3r/GUI/wxExtensions.cpp:598 src/libslic3r/PrintConfig.cpp:487
+#: src/slic3r/GUI/GCodeViewer.cpp:2277 src/slic3r/GUI/GCodeViewer.cpp:2313
+#: src/slic3r/GUI/GCodeViewer.cpp:2318 src/slic3r/GUI/GUI_ObjectList.cpp:296
+#: src/slic3r/GUI/Tab.cpp:1780 src/slic3r/GUI/wxExtensions.cpp:515
+#: src/libslic3r/PrintConfig.cpp:523
msgid "Extruder"
msgstr "Estrusore"
-#: src/slic3r/GUI/DoubleSlider.cpp:1134 src/slic3r/GUI/DoubleSlider.cpp:1170
-#: src/slic3r/GUI/GLCanvas3D.cpp:977 src/slic3r/GUI/GUI_ObjectList.cpp:1704
-#: src/slic3r/GUI/Tab.cpp:2320 src/libslic3r/GCode/PreviewData.cpp:445
+#: src/slic3r/GUI/DoubleSlider.cpp:1263 src/slic3r/GUI/DoubleSlider.cpp:1297
+#: src/slic3r/GUI/GLCanvas3D.cpp:983 src/slic3r/GUI/GUI_ObjectList.cpp:1832
+#: src/slic3r/GUI/Tab.cpp:2489 src/libslic3r/GCode/PreviewData.cpp:450
#, possible-c-format
msgid "Extruder %d"
msgstr "Estrusore %d"
-#: src/slic3r/GUI/DoubleSlider.cpp:1011
+#: src/slic3r/GUI/DoubleSlider.cpp:1137
msgid "Extruder (tool) is changed to Extruder \"%1%\""
msgstr "Estrusore (attrezzo) viene cambiato a Estrusore \"%1%\""
-#: src/slic3r/GUI/ConfigWizard.cpp:1017
-msgid "Extruder and Bed Temperatures"
-msgstr "Temperature dell'estrusore e del piano"
-
#: src/slic3r/GUI/WipeTowerDialog.cpp:255
msgid "Extruder changed to"
msgstr "Cambia estrusore a"
-#: src/slic3r/GUI/Tab.cpp:1233
-msgid "Extruder clearance (mm)"
-msgstr "Spazio libero per l'estrusore (mm)"
+#: src/slic3r/GUI/Tab.cpp:1589
+msgid "Extruder clearance"
+msgstr "Margine estrusore"
-#: src/libslic3r/PrintConfig.cpp:522
+#: src/libslic3r/PrintConfig.cpp:558
msgid "Extruder Color"
msgstr "Colore estrusore"
-#: src/libslic3r/PrintConfig.cpp:529
+#: src/libslic3r/PrintConfig.cpp:565
msgid "Extruder offset"
msgstr "Offset estrusore"
-#: src/libslic3r/PrintConfig.cpp:911
-msgid "Extruder temperature for first layer. If you want to control temperature manually during print, set this to zero to disable temperature control commands in the output file."
-msgstr "Temperatura estrusore per il primo layer. Se vuoi controllare manualmente la temperatura durante la stampa, imposta questo a zero per disattivare i comandi di controllo temperatura nel file di output."
-
-#: src/libslic3r/PrintConfig.cpp:2065
-msgid "Extruder temperature for layers after the first one. Set this to zero to disable temperature control commands in the output."
-msgstr "Temperatura estrusore per i layer successivi al primo. Imposta questo a zero per disattivare i comandi di controllo temperatura nell'output."
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:99 src/slic3r/GUI/GUI_ObjectList.cpp:617
-#: src/slic3r/GUI/Tab.cpp:1180 src/slic3r/GUI/Tab.cpp:1838
-#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:1002
-#: src/libslic3r/PrintConfig.cpp:1409 src/libslic3r/PrintConfig.cpp:1737
-#: src/libslic3r/PrintConfig.cpp:1938 src/libslic3r/PrintConfig.cpp:1965
+#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:656
+#: src/slic3r/GUI/Tab.cpp:1510 src/slic3r/GUI/Tab.cpp:2072
+#: src/libslic3r/PrintConfig.cpp:524 src/libslic3r/PrintConfig.cpp:1046
+#: src/libslic3r/PrintConfig.cpp:1517 src/libslic3r/PrintConfig.cpp:1852
+#: src/libslic3r/PrintConfig.cpp:2080 src/libslic3r/PrintConfig.cpp:2107
msgid "Extruders"
msgstr "Estrusori"
-#: src/libslic3r/PrintConfig.cpp:539
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1061
+msgid "Extruders count"
+msgstr "Conteggio estrusori"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2493
+msgid "Extrusion"
+msgstr "Estrusione"
+
+#: src/libslic3r/PrintConfig.cpp:575
msgid "Extrusion axis"
msgstr "Asse estrusore"
-#: src/libslic3r/PrintConfig.cpp:545
+#: src/libslic3r/PrintConfig.cpp:581
msgid "Extrusion multiplier"
msgstr "Moltiplicatore estrusione"
-#: src/slic3r/GUI/ConfigWizard.cpp:1037
+#: src/slic3r/GUI/ConfigWizard.cpp:1403
msgid "Extrusion Temperature:"
msgstr "Temperatura di estrusione:"
-#: src/slic3r/GUI/Tab.cpp:1205
+#: src/slic3r/GUI/Tab.cpp:1535
msgid "Extrusion width"
msgstr "Larghezza estrusione"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:100 src/slic3r/GUI/GUI_ObjectList.cpp:618
-#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:555
-#: src/libslic3r/PrintConfig.cpp:877 src/libslic3r/PrintConfig.cpp:1010
-#: src/libslic3r/PrintConfig.cpp:1418 src/libslic3r/PrintConfig.cpp:1757
-#: src/libslic3r/PrintConfig.cpp:1947 src/libslic3r/PrintConfig.cpp:2106
+#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:657
+#: src/libslic3r/PrintConfig.cpp:483 src/libslic3r/PrintConfig.cpp:591
+#: src/libslic3r/PrintConfig.cpp:919 src/libslic3r/PrintConfig.cpp:1054
+#: src/libslic3r/PrintConfig.cpp:1526 src/libslic3r/PrintConfig.cpp:1872
+#: src/libslic3r/PrintConfig.cpp:2089 src/libslic3r/PrintConfig.cpp:2249
msgid "Extrusion Width"
msgstr "Larghezza Estrusione"
-#: src/slic3r/GUI/Plater.cpp:162
+#: src/slic3r/GUI/Plater.cpp:168
msgid "Facets"
msgstr "Facce"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:349
+#: src/slic3r/GUI/GUI_ObjectList.cpp:396
msgid "facets added"
msgstr "aggiunte facce"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:348
+#: src/slic3r/GUI/GUI_ObjectList.cpp:395
msgid "facets removed"
msgstr "rimosse facce"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:350
+#: src/slic3r/GUI/GUI_ObjectList.cpp:397
msgid "facets reversed"
msgstr "facce invertite"
-#: src/libslic3r/PrintConfig.cpp:2517
+#: src/libslic3r/PrintConfig.cpp:2660
msgid "Faded layers"
msgstr "Layer sfumati"
-#: src/libslic3r/Zipper.cpp:44
+#: src/libslic3r/miniz_extension.cpp:103
msgid "failed finding central directory"
msgstr "directory centrale non trovata"
@@ -2669,105 +3165,135 @@ msgstr "directory centrale non trovata"
msgid "Failed loading the input model."
msgstr "Caricamento modello input fallito."
-#: src/libslic3r/PrintBase.cpp:71
+#: src/libslic3r/PrintBase.cpp:72
msgid "Failed processing of the output_filename_format template."
msgstr "Elaborazione fallita del modello output_filename_format."
-#: src/slic3r/GUI/PresetHints.cpp:42
-msgid "Fan"
-msgstr "Ventola"
+#: src/slic3r/GUI/GUI_App.cpp:1648
+msgid "Failed to activate configuration snapshot."
+msgstr "Impossibile attivare l'istantanea di configurazione."
-#: src/slic3r/GUI/Tab.cpp:1456
+#: src/slic3r/GUI/Tab.cpp:1802
msgid "Fan settings"
msgstr "Impostazioni ventola"
-#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/Tab.cpp:1457
+#: src/slic3r/GUI/GUI_Preview.cpp:279 src/slic3r/GUI/Tab.cpp:1803
msgid "Fan speed"
msgstr "Velocità ventola"
-#: src/libslic3r/GCode/PreviewData.cpp:353
+#: src/slic3r/GUI/GCodeViewer.cpp:2239 src/libslic3r/GCode/PreviewData.cpp:358
msgid "Fan Speed (%)"
msgstr "Velocità ventola (%)"
-#: src/libslic3r/PrintConfig.cpp:2405
+#: src/slic3r/GUI/PresetHints.cpp:49
+msgid "Fan speed will be ramped from zero at layer %1% to %2%%% at layer %3%."
+msgstr "La velocità della ventola sarà incrementata da zero al layer %1% a %2%%% al layer %3%."
+
+#: src/libslic3r/PrintConfig.cpp:1001
+msgid "Fan speed will be ramped up linearly from zero at layer \"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower than \"disable_fan_first_layers\", in which case the fan will be running at maximum allowed speed at layer \"disable_fan_first_layers\" + 1."
+msgstr "La velocità della ventola sarà incrementata linearmente da zero al layer \"disable_fan_fan_first_layers\" fino al massimo al layer \"full_fan_speed_layer\". \"full_fan_speed_layer\" sarà ignorato se inferiore a \"disable_fan_first_layers\", nel qual caso la ventola funzionerà alla massima velocità consentita al layer \"disable_fan_first_layers\" + 1."
+
+#: src/slic3r/GUI/PresetHints.cpp:51
+msgid "Fan will always run at %1%%%"
+msgstr "La ventola lavorerà sempre a %1%%%"
+
+#: src/slic3r/GUI/PresetHints.cpp:58
+msgid "Fan will be turned off."
+msgstr "La ventola verrà spenta."
+
+#: src/libslic3r/PrintConfig.cpp:2548
msgid "Fast"
msgstr "Veloce"
-#: src/libslic3r/PrintConfig.cpp:2406
+#: src/libslic3r/PrintConfig.cpp:2549
msgid "Fast tilt"
msgstr "Tilt veloce"
-#: src/slic3r/GUI/GUI_App.cpp:141
+#: src/slic3r/GUI/GUI_App.cpp:531
msgid "Fatal error"
msgstr "Errore irreversibile"
-#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/GUI_Preview.cpp:575
-#: src/libslic3r/GCode/PreviewData.cpp:345
+#: src/slic3r/GUI/GUI_Init.cpp:88
+msgid "Fatal error, exception catched: %1%"
+msgstr "Fatal error, eccezione registrata: %1%"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2225 src/slic3r/GUI/GCodeViewer.cpp:2233
+#: src/slic3r/GUI/GUI_Preview.cpp:275 src/slic3r/GUI/GUI_Preview.cpp:787
+#: src/libslic3r/GCode/PreviewData.cpp:350
msgid "Feature type"
msgstr "Tipo di caratteristica"
-#: src/slic3r/GUI/GUI_Preview.cpp:234 src/slic3r/GUI/GUI_Preview.cpp:235
+#: src/slic3r/GUI/GUI_Preview.cpp:293 src/slic3r/GUI/GUI_Preview.cpp:295
+#: src/slic3r/GUI/GUI_Preview.cpp:316
msgid "Feature types"
msgstr "Tipi di caratteristica"
-#: src/slic3r/GUI/ConfigWizard.cpp:1525
+#: src/slic3r/GUI/ConfigWizard.cpp:1926
msgid "FFF Technology Printers"
msgstr "Stampanti con tecnologia FFF"
-#: src/slic3r/GUI/Plater.cpp:816 src/slic3r/GUI/Tab.cpp:1425
-#: src/slic3r/GUI/Tab.cpp:1426
+#: src/slic3r/GUI/Plater.cpp:691 src/slic3r/GUI/Tab.cpp:1770
+#: src/slic3r/GUI/Tab.cpp:1771
msgid "Filament"
msgstr "Filamento"
-#: src/slic3r/GUI/Preset.cpp:1522
+#: src/libslic3r/Preset.cpp:1301
msgid "filament"
msgstr "filamento"
-#: src/slic3r/GUI/ConfigWizard.cpp:952
+#: src/slic3r/GUI/ConfigWizard.cpp:1318
msgid "Filament and Nozzle Diameters"
msgstr "Diametro filamento e ugello"
-#: src/slic3r/GUI/ConfigWizard.cpp:983
+#: src/slic3r/GUI/Plater.cpp:1189
+msgid "Filament at extruder %1%"
+msgstr "Filamento all'estrusore %1%"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1349
msgid "Filament Diameter:"
msgstr "Diametro del filamento:"
-#: src/libslic3r/PrintConfig.cpp:651
+#: src/libslic3r/PrintConfig.cpp:687
msgid "Filament is cooled by being moved back and forth in the cooling tubes. Specify desired number of these moves."
msgstr "Il filamento è raffreddato venendo spostato avanti e indietro nei tubi di raffreddamento. Specificare il numero desiderato di questi movimenti."
-#: src/libslic3r/PrintConfig.cpp:686
+#: src/libslic3r/PrintConfig.cpp:722
msgid "Filament load time"
msgstr "Durata caricamento filamento"
-#: src/libslic3r/PrintConfig.cpp:588
+#: src/libslic3r/PrintConfig.cpp:624
msgid "Filament notes"
msgstr "Note filamento"
-#: src/slic3r/GUI/Tab.cpp:1323 src/slic3r/GUI/Tab.cpp:1378
+#: src/slic3r/GUI/Tab.cpp:1669
msgid "Filament Overrides"
msgstr "Sovrascrittura filamento"
-#: src/libslic3r/PrintConfig.cpp:1381
+#: src/libslic3r/PrintConfig.cpp:1489
msgid "Filament parking position"
msgstr "Posizione di parcheggio del filamento"
-#: src/slic3r/GUI/ConfigWizard.cpp:2013
+#: src/slic3r/GUI/ConfigWizard.cpp:2524
msgid "Filament Profiles Selection"
msgstr "Selezione Profili Filamento"
-#: src/slic3r/GUI/Tab.cpp:1471
+#: src/slic3r/GUI/Tab.cpp:1817
msgid "Filament properties"
msgstr "Proprietà filamento"
-#: src/slic3r/GUI/Tab.hpp:355
+#: src/slic3r/GUI/Tab.hpp:409
msgid "Filament Settings"
msgstr "Impostazioni Filamento"
-#: src/libslic3r/PrintConfig.cpp:726
+#: src/slic3r/GUI/GLCanvas3D.cpp:4304 src/slic3r/GUI/GLCanvas3D.cpp:4940
+msgid "Filament Settings Tab"
+msgstr "Scheda Impostazioni Filamento"
+
+#: src/libslic3r/PrintConfig.cpp:762
msgid "Filament type"
msgstr "Tipo filamento"
-#: src/libslic3r/PrintConfig.cpp:701
+#: src/libslic3r/PrintConfig.cpp:737
msgid "Filament unload time"
msgstr "Durata scaricamento filamento"
@@ -2775,83 +3301,103 @@ msgstr "Durata scaricamento filamento"
msgid "filaments"
msgstr "filamenti"
-#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2013
+#: src/slic3r/GUI/ConfigWizard.cpp:1872 src/slic3r/GUI/ConfigWizard.cpp:2524
msgid "Filaments"
msgstr "Filamenti"
-#: src/libslic3r/Zipper.cpp:72
+#: src/slic3r/GUI/ConfigWizard.cpp:691
+msgid "Filaments marked with <b>*</b> are <b>not</b> compatible with some installed printers."
+msgstr "I filamenti segnati con <b>*</b> non <b>sono</b> compatibili con alcune stampanti installate."
+
+#: src/libslic3r/miniz_extension.cpp:131
msgid "file close failed"
msgstr "chiusura del file fallita"
-#: src/libslic3r/Zipper.cpp:66
+#: src/libslic3r/miniz_extension.cpp:125
msgid "file create failed"
msgstr "generazione del file non riuscita"
-#: src/slic3r/GUI/MainFrame.cpp:791
+#: src/slic3r/GUI/MainFrame.cpp:1492
msgid "File Not Found"
msgstr "file non trovato"
-#: src/libslic3r/Zipper.cpp:86
+#: src/libslic3r/miniz_extension.cpp:145
msgid "file not found"
msgstr "file non trovato"
-#: src/libslic3r/Zipper.cpp:64
+#: src/libslic3r/miniz_extension.cpp:123
msgid "file open failed"
msgstr "apertura file non riuscita"
-#: src/libslic3r/Zipper.cpp:70
+#: src/libslic3r/miniz_extension.cpp:129
msgid "file read failed"
msgstr "lettura del file non riuscita"
-#: src/libslic3r/Zipper.cpp:74
+#: src/libslic3r/miniz_extension.cpp:133
msgid "file seek failed"
msgstr "ricerca file fallita"
-#: src/libslic3r/Zipper.cpp:76
+#: src/libslic3r/miniz_extension.cpp:135
msgid "file stat failed"
msgstr "statistica file non riuscita"
-#: src/libslic3r/Zipper.cpp:36
+#: src/libslic3r/miniz_extension.cpp:95
msgid "file too large"
msgstr "file troppo grande"
-#: src/libslic3r/Zipper.cpp:68
+#: src/libslic3r/miniz_extension.cpp:127
msgid "file write failed"
msgstr "scrittura file fallita"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:153
+#: src/slic3r/GUI/PrintHostDialogs.cpp:151
msgid "Filename"
msgstr "Nome file"
-#: src/libslic3r/PrintConfig.cpp:775
+#: src/slic3r/GUI/ConfigWizard.cpp:1181
+msgid "Files association"
+msgstr "Associazione file"
+
+#: src/libslic3r/PrintConfig.cpp:811
msgid "Fill angle"
msgstr "Angolo riempimento"
-#: src/libslic3r/PrintConfig.cpp:789
+#: src/slic3r/GUI/Plater.cpp:1651
+msgid "Fill bed"
+msgstr "Riempi piano"
+
+#: src/slic3r/GUI/Plater.cpp:3936
+msgid "Fill bed with instances"
+msgstr "Riempi piano con istanze"
+
+#: src/libslic3r/PrintConfig.cpp:825
msgid "Fill density"
msgstr "Densità riempimento"
-#: src/libslic3r/PrintConfig.cpp:826
+#: src/libslic3r/PrintConfig.cpp:862
msgid "Fill pattern"
msgstr "Trama riempimento"
-#: src/libslic3r/PrintConfig.cpp:437
+#: src/libslic3r/PrintConfig.cpp:473
msgid "Fill pattern for bottom infill. This only affects the bottom external visible layer, and not its adjacent solid shells."
msgstr "Trama per riempimento inferiore. Questo influenza solamente il layer inferiore esterno visibile, e non i gusci solidi adiacenti."
-#: src/libslic3r/PrintConfig.cpp:828
+#: src/libslic3r/PrintConfig.cpp:864
msgid "Fill pattern for general low-density infill."
msgstr "Trama riempimento generale a bassa densità."
-#: src/libslic3r/PrintConfig.cpp:417
+#: src/libslic3r/PrintConfig.cpp:451
msgid "Fill pattern for top infill. This only affects the top visible layer, and not its adjacent solid shells."
msgstr "Trama per riempimento superiore. Questo influenza solamente il layer superiore esterno visibile, e non i gusci solidi adiacenti."
+#: src/slic3r/GUI/Plater.cpp:3936
+msgid "Fill the remaining area of bed with instances of the selected object"
+msgstr "Riempire l'area rimanente del piano con le istanze dell'oggetto selezionato"
+
#: src/slic3r/GUI/BonjourDialog.cpp:225
msgid "Finished"
msgstr "Finito"
-#: src/slic3r/GUI/ConfigWizard.cpp:891 src/slic3r/GUI/Tab.cpp:1947
+#: src/slic3r/GUI/ConfigWizard.cpp:1257 src/slic3r/GUI/Tab.cpp:2132
msgid "Firmware"
msgstr "Firmware"
@@ -2863,44 +3409,56 @@ msgstr "Firmware flasher"
msgid "Firmware image:"
msgstr "Immagine firmware:"
-#: src/slic3r/GUI/Tab.cpp:2577
+#: src/slic3r/GUI/Tab.cpp:2733
msgid "Firmware Retraction"
msgstr "Retrazione Firmware"
-#: src/slic3r/GUI/ConfigWizard.cpp:891
+#: src/slic3r/GUI/ConfigWizard.cpp:1257
msgid "Firmware Type"
msgstr "Tipo Firmware"
-#: src/libslic3r/PrintConfig.cpp:859 src/libslic3r/PrintConfig.cpp:868
-#: src/libslic3r/PrintConfig.cpp:876 src/libslic3r/PrintConfig.cpp:910
+#: src/libslic3r/PrintConfig.cpp:899 src/libslic3r/PrintConfig.cpp:908
+#: src/libslic3r/PrintConfig.cpp:918 src/libslic3r/PrintConfig.cpp:952
msgid "First layer"
msgstr "Primo layer"
-#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:889
+#: src/libslic3r/PrintConfig.cpp:909
+msgid "First layer bed temperature"
+msgstr "Temperatura del piano del primo layer"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:60 src/libslic3r/PrintConfig.cpp:931
msgid "First layer height"
msgstr "Altezza del primo layer"
-#: src/libslic3r/Print.cpp:1422
+#: src/libslic3r/Print.cpp:1448
msgid "First layer height can't be greater than nozzle diameter"
msgstr "L'altezza del primo layer non può essere più grande del diametro dell'ugello"
-#: src/libslic3r/PrintConfig.cpp:900
+#: src/libslic3r/PrintConfig.cpp:960
+msgid "First layer nozzle temperature"
+msgstr "Temperatura dell'ugello del primo layer"
+
+#: src/libslic3r/PrintConfig.cpp:942
msgid "First layer speed"
msgstr "Velocità del primo layer"
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:218
msgid "First layer volumetric"
msgstr "Volumetrica primo layer"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1647
+#: src/slic3r/GUI/Plater.cpp:3380
+msgid "Fix through NetFabb"
+msgstr "Ripara tramite NetFabb"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1776
msgid "Fix through the Netfabb"
msgstr "Ripara tramite Netfabb"
-#: src/slic3r/GUI/Plater.cpp:3473
+#: src/slic3r/GUI/Plater.cpp:3278
msgid "Fix Throught NetFabb"
msgstr "Ripara tramite NetFabb"
-#: src/slic3r/GUI/GUI_App.cpp:824
+#: src/slic3r/GUI/GUI_App.cpp:1522
msgid "Flash printer &firmware"
msgstr "Installa &firmware stampante"
@@ -2928,44 +3486,52 @@ msgstr "Flash in corso. Non disconnettere la stampante!"
msgid "Flashing succeeded!"
msgstr "Flash completato con successo!"
-#: src/slic3r/GUI/Tab.cpp:1218
+#: src/slic3r/GUI/Tab.cpp:1548
msgid "Flow"
msgstr "Flusso"
-#: src/slic3r/GUI/PresetHints.cpp:220
+#: src/libslic3r/PrintConfig.cpp:1145
+msgid "Flow rate"
+msgstr "Flusso"
+
+#: src/slic3r/GUI/PresetHints.cpp:219
msgid "flow rate is maximized"
msgstr "il flusso viene massimizzato"
-#: src/slic3r/GUI/UpdateDialogs.cpp:286
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:555
+msgid "Following printer preset(s) is duplicated:%1%The above preset for printer \"%2%\" will be used just once."
+msgstr "Il seguente(i) preset della stampante è duplicato:%1% Il preset sopra per la stampante \"%2%\" verrà usato solo una volta."
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:287
msgid "For more information please visit our wiki page:"
msgstr "Per maggiori informazioni visita la nostra pagina wiki:"
-#: src/slic3r/GUI/Plater.cpp:501 src/slic3r/GUI/Plater.cpp:624
+#: src/slic3r/GUI/Plater.cpp:367 src/slic3r/GUI/Plater.cpp:490
msgid "For support enforcers only"
msgstr "Solo per rinforzi supporto"
#. TRN Description for "WHITE BULLET"
-#: src/slic3r/GUI/Tab.cpp:3267
+#: src/slic3r/GUI/Tab.cpp:3702
msgid "for the left button: indicates a non-system (or non-default) preset,\nfor the right button: indicates that the settings hasn't been modified."
msgstr "per il tasto sinistro: indica un preset non di sistema (o non-predefinito),\nper il tasto destro: indica che le impostazioni non sono state modificate."
-#: src/slic3r/GUI/ConfigManipulation.cpp:136
+#: src/slic3r/GUI/ConfigManipulation.cpp:135
msgid "For the Wipe Tower to work with the soluble supports, the support layers\nneed to be synchronized with the object layers."
msgstr "Per far sì che la torre di spurgo funzioni con i supporti solubili, i layer dei supporti devono essere sincronizzati con quelli del modello."
-#: src/libslic3r/Print.cpp:1396
+#: src/libslic3r/Print.cpp:1422
msgid "For the Wipe Tower to work with the soluble supports, the support layers need to be synchronized with the object layers."
msgstr "Per far sì che la torre di spurgo funzioni con i supporti solubili, i layer dei supporti devono essere sincronizzati con quelli del modello."
-#: src/libslic3r/PrintConfig.cpp:2864
+#: src/libslic3r/PrintConfig.cpp:3028
msgid "Force pad around object everywhere"
msgstr "Forza il Pad ovunque intorno all'oggetto"
-#: src/libslic3r/PrintConfig.cpp:1729
+#: src/libslic3r/PrintConfig.cpp:1844
msgid "Force solid infill for regions having a smaller area than the specified threshold."
msgstr "Forza riempimento solido per le regioni con un'area inferiore al limite specificato."
-#: src/libslic3r/PrintConfig.cpp:1072
+#: src/libslic3r/PrintConfig.cpp:1116
msgid "Force the generation of solid shells between adjacent materials/volumes. Useful for multi-extruder prints with translucent materials or manual soluble support material."
msgstr "Forza la generazione di perimetri solidi tra volumi o materiali adiacenti. Utile per stampe multi estrusore con materiali traslucidi o supporti solubili manuali."
@@ -2973,244 +3539,317 @@ msgstr "Forza la generazione di perimetri solidi tra volumi o materiali adiacent
msgid "From"
msgstr "Da"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2223
+#: src/slic3r/GUI/GCodeViewer.cpp:2197
+msgid "from"
+msgstr "da"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2389
msgid "From Object List You can't delete the last solid part from object."
msgstr "Non è possibile eliminare l'ultima parte solida dall'oggetto nell'elenco Oggetti."
-#: src/slic3r/GUI/MainFrame.cpp:667
+#: src/slic3r/GUI/MainFrame.cpp:964 src/slic3r/GUI/MainFrame.cpp:1284
msgid "Front"
msgstr "Frontale"
-#: src/slic3r/GUI/MainFrame.cpp:667
+#: src/slic3r/GUI/MainFrame.cpp:964 src/slic3r/GUI/MainFrame.cpp:1284
msgid "Front View"
msgstr "Vista anteriore"
-#: src/slic3r/GUI/Tab.cpp:1013
+#: src/libslic3r/PrintConfig.cpp:1000
+msgid "Full fan speed at layer"
+msgstr "Massima velocità della ventola al layer"
+
+#: src/slic3r/GUI/Tab.cpp:1331
msgid "full profile name"
msgstr "nome completo profilo"
-#: src/slic3r/GUI/MainFrame.cpp:826
+#: src/libslic3r/PrintConfig.cpp:817
+msgid "g"
+msgstr "g"
+
+#: src/slic3r/GUI/MainFrame.cpp:1527
msgid "G-code"
msgstr "G-code"
-#: src/slic3r/GUI/DoubleSlider.cpp:1021
+#: src/slic3r/GUI/DoubleSlider.cpp:1146
msgid "G-code associated to this tick mark is in a conflict with print mode.\nEditing it will cause changes of Slider data."
msgstr "Il G-code associato a questo segno di spunta è in conflitto con la modalità di stampa.\nLa modifica causerà cambiamenti nei dati della barra di scorrimento."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:130
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:165
msgid "G-code file exported to %1%"
msgstr "G-code esportato in %1%"
-#: src/libslic3r/PrintConfig.cpp:936
+#: src/libslic3r/PrintConfig.cpp:980
msgid "G-code flavor"
msgstr "Formato G-code"
-#: src/libslic3r/PrintConfig.cpp:721
+#: src/slic3r/GUI/MainFrame.cpp:66 src/slic3r/GUI/MainFrame.cpp:79
+msgid "G-code preview"
+msgstr "Anteprima G-code"
+
+#: src/libslic3r/PrintConfig.cpp:66
+msgid "G-code thumbnails"
+msgstr "Miniature G-code"
+
+#: src/libslic3r/PrintConfig.cpp:3552
+msgid "G-code viewer"
+msgstr "Visualizzatore G-code"
+
+#: src/libslic3r/PrintConfig.cpp:757
msgid "g/cm³"
msgstr "g/cm³"
-#: src/libslic3r/PrintConfig.cpp:2505
+#: src/libslic3r/PrintConfig.cpp:2648
msgid "g/ml"
msgstr "g/ml"
-#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:317
-#: src/libslic3r/PrintConfig.cpp:918
+#: src/slic3r/GUI/GUI_Preview.cpp:309 src/libslic3r/ExtrusionEntity.cpp:322
+#: src/libslic3r/ExtrusionEntity.cpp:352 src/libslic3r/PrintConfig.cpp:962
msgid "Gap fill"
msgstr "Riempimento spazi"
-#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1796
-#: src/slic3r/GUI/Tab.cpp:2040
+#: src/slic3r/GUI/Preferences.cpp:24 src/slic3r/GUI/Tab.cpp:2058
+#: src/slic3r/GUI/Tab.cpp:2240 src/slic3r/GUI/Tab.cpp:2348
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1066
msgid "General"
msgstr "Generale"
-#: src/libslic3r/PrintConfig.cpp:1307
+#: src/libslic3r/PrintConfig.cpp:1415
msgid "Generate no less than the number of skirt loops required to consume the specified amount of filament on the bottom layer. For multi-extruder machines, this minimum applies to each extruder."
msgstr "Genera almeno il numero di skirt necessari per consumare la quantità di filamento specificata per il primo layer. Per le macchine multi estrusore, questo minimo riguarda ciascun estrusore."
-#: src/libslic3r/PrintConfig.cpp:1865
+#: src/libslic3r/PrintConfig.cpp:2007
msgid "Generate support material"
msgstr "Genera materiale di supporto"
-#: src/libslic3r/PrintConfig.cpp:1926
+#: src/libslic3r/PrintConfig.cpp:2068
msgid "Generate support material for the specified number of layers counting from bottom, regardless of whether normal support material is enabled or not and regardless of any angle threshold. This is useful for getting more adhesion of objects having a very thin or poor footprint on the build plate."
msgstr "Genera materiale di supporto per il numero di layer specificati partendo dal basso, a prescindere che sia abilitato il materiale di supporto normale o meno, e indipendentemente dall'angolo limite. Questo è utile per ottenere più adesione negli oggetti con un appoggio sul piano molto sottile o fragile."
-#: src/libslic3r/PrintConfig.cpp:2613
+#: src/libslic3r/PrintConfig.cpp:2756
msgid "Generate supports"
msgstr "Genera supporti"
-#: src/libslic3r/PrintConfig.cpp:2615
+#: src/libslic3r/PrintConfig.cpp:2758
msgid "Generate supports for the models"
msgstr "Genera supporti per i modelli"
-#: src/libslic3r/Print.cpp:1614
+#: src/slic3r/GUI/Plater.cpp:3554
+msgid "generated warnings"
+msgstr "ha generato avvisi"
+
+#: src/libslic3r/Print.cpp:1645
msgid "Generating brim"
msgstr "Generazione brim"
-#: src/libslic3r/Print.cpp:1642
+#: src/libslic3r/Print.cpp:1680
msgid "Generating G-code"
msgstr "Generazione G-code"
-#: src/libslic3r/SLAPrintSteps.cpp:48
+#: src/slic3r/GUI/GCodeViewer.cpp:1392
+msgid "Generating index buffers"
+msgstr "Generazione indici buffer"
+
+#: src/libslic3r/SLAPrintSteps.cpp:49
msgid "Generating pad"
msgstr "Generazione pad"
-#: src/libslic3r/PrintObject.cpp:152
+#: src/libslic3r/PrintObject.cpp:158
msgid "Generating perimeters"
msgstr "Generazione perimetri"
-#: src/libslic3r/Print.cpp:1606
+#: src/libslic3r/Print.cpp:1636
msgid "Generating skirt"
msgstr "Generando skirt"
-#: src/libslic3r/PrintObject.cpp:395
+#: src/libslic3r/PrintObject.cpp:422
msgid "Generating support material"
msgstr "Generazione materiale di supporto"
-#: src/libslic3r/SLAPrintSteps.cpp:46 src/libslic3r/SLAPrintSteps.cpp:356
+#: src/libslic3r/SLAPrintSteps.cpp:47 src/libslic3r/SLAPrintSteps.cpp:359
msgid "Generating support points"
msgstr "Generazione punti di supporto"
-#: src/libslic3r/SLAPrintSteps.cpp:47
+#: src/libslic3r/SLAPrintSteps.cpp:48
msgid "Generating support tree"
msgstr "Generazione albero di supporto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2022
+#: src/slic3r/GUI/GCodeViewer.cpp:933
+msgid "Generating toolpaths"
+msgstr "Generazione percorsi"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:1318
+msgid "Generating vertex buffer"
+msgstr "Generazione buffer vertici"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2181
msgid "Generic"
msgstr "Generico"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
+#: src/slic3r/Utils/PresetUpdater.cpp:600
+msgid "getting config updates"
+msgstr "recupero aggiornamenti di configurazione"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
msgid "Gizmo cut"
msgstr "Gizmo Taglia"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:172
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
msgid "Gizmo move"
msgstr "Gizmo Sposta"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:176
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:198
+msgid "Gizmo move: Press to snap by 1mm"
+msgstr "Gizmo Sposta: Premere per scatti di 1mm"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
msgid "Gizmo Place face on bed"
msgstr "Gizmo Posiziona faccia sul piano"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:174
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
msgid "Gizmo rotate"
msgstr "Gizmo Ruota"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:173
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:203
+msgid "Gizmo rotate: Press to rotate selected objects around their own center"
+msgstr "Gizmo ruota: Premi per ruotare gli oggetti attorno al loro centro"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
msgid "Gizmo scale"
msgstr "Gizmo Ridimensiona"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:177
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:201
+msgid "Gizmo scale: Press to activate one direction scaling"
+msgstr "Gizmo ridimensiona: Premi per attivare il ridimensionamento su una direzione"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:202
+msgid "Gizmo scale: Press to scale selected objects around their own center"
+msgstr "Gizmo ridimensiona: Premi per ridimensionare gli oggetti attorno al loro centro"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:199
+msgid "Gizmo scale: Press to snap by 5%"
+msgstr "Gizmo Ridimensiona: Premere per salti del 5%"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:200
+msgid "Gizmo scale: Scale selection to fit print volume"
+msgstr "Gizmo ridimensiona: Ridimensiona la selezione per riempire il volume di stampa"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
msgid "Gizmo SLA hollow"
msgstr "Gizmo SLA Svuota"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:178
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:172
msgid "Gizmo SLA support points"
msgstr "Gizmo Punti supporto SLA"
-#: src/slic3r/GUI/GLCanvas3D.cpp:2921
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562
+#: src/slic3r/GUI/GLCanvas3D.cpp:3165
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:520
msgid "Gizmo-Move"
msgstr "Gizmo-Sposta"
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:489
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:639
msgid "Gizmo-Place on Face"
msgstr "Gizmo-Posiziona su faccia"
-#: src/slic3r/GUI/GLCanvas3D.cpp:3001
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:564
+#: src/slic3r/GUI/GLCanvas3D.cpp:3249
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:522
msgid "Gizmo-Rotate"
msgstr "Gizmo-Ruota"
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:563
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:521
msgid "Gizmo-Scale"
msgstr "Gizmo-Ridimensiona"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:201
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:199
msgid "Gizmos"
msgstr "Gizmo"
-#: src/slic3r/GUI/AboutDialog.cpp:259
+#: src/slic3r/GUI/AboutDialog.cpp:284 src/slic3r/GUI/GUI_App.cpp:244
msgid "GNU Affero General Public License, version 3"
msgstr "GNU Affero General Public License, versione 3"
-#: src/slic3r/GUI/ConfigWizard.cpp:980
+#: src/slic3r/GUI/ConfigWizard.cpp:1346
msgid "Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average."
msgstr "È necessaria una buona precisione, quindi utilizza un calibro ed effettua diverse misurazioni lungo il filamento, quindi calcola la media."
-#: src/libslic3r/PrintConfig.cpp:844
+#: src/libslic3r/PrintConfig.cpp:882
msgid "Grid"
msgstr "Griglia"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2454
+#: src/slic3r/GUI/PrintHostDialogs.cpp:57
+msgid "Group"
+msgstr "Gruppo"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2846
msgid "Group manipulation"
msgstr "Manipolazione gruppo"
-#: src/slic3r/GUI/Preferences.cpp:133
+#: src/slic3r/GUI/Preferences.cpp:200
msgid "GUI"
msgstr "GUI"
-#: src/libslic3r/PrintConfig.cpp:852
+#: src/libslic3r/PrintConfig.cpp:890
msgid "Gyroid"
msgstr "Giroide"
-#: src/slic3r/GUI/Tab.cpp:2937
-msgid "has the following unsaved changes:"
-msgstr "ha le seguenti modifiche non salvate:"
-
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47
msgid "Head diameter"
msgstr "Diametro testa"
-#: src/slic3r/GUI/ConfigManipulation.cpp:317
+#: src/libslic3r/PrintConfig.cpp:2772
+msgid "Head penetration"
+msgstr "Penetrazione testa"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:322
msgid "Head penetration should not be greater than the head width."
-msgstr "L'inserimento della capocchia non deve essere più grande della sua larghezza."
+msgstr "L'inserimento della testa non deve essere più grande della sua larghezza."
-#: src/libslic3r/PrintConfig.cpp:869
+#: src/libslic3r/PrintConfig.cpp:910
msgid "Heated build plate temperature for the first layer. Set this to zero to disable bed temperature control commands in the output."
msgstr "Temperatura piano riscaldato per il primo layer. Imposta a zero per disattivare i comandi di controllo temperatura nell'output."
-#: src/slic3r/GUI/GUI_Preview.cpp:222 src/libslic3r/PrintConfig.cpp:500
+#: src/slic3r/GUI/GUI_Preview.cpp:276 src/libslic3r/PrintConfig.cpp:536
msgid "Height"
msgstr "Altezza"
-#: src/libslic3r/GCode/PreviewData.cpp:347
+#: src/slic3r/GUI/GCodeViewer.cpp:2236 src/libslic3r/GCode/PreviewData.cpp:352
msgid "Height (mm)"
msgstr "Altezza (mm)"
-#: src/libslic3r/PrintConfig.cpp:1688
+#: src/libslic3r/PrintConfig.cpp:1796
msgid "Height of skirt expressed in layers. Set this to a tall value to use skirt as a shield against drafts."
msgstr "Altezza dello skirt espresso in layer. Imposta un valore alto per utilizzare lo skirt come scudo contro le scolature."
-#: src/libslic3r/PrintConfig.cpp:2360
+#: src/libslic3r/PrintConfig.cpp:2503
msgid "Height of the display"
msgstr "Altezza del display"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1500
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1631
msgid "Height range Modifier"
-msgstr "Modificatore intervallo Altezza"
+msgstr "Modificatore intervallo altezza"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2507
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2899
msgid "Height ranges"
msgstr "Intervalli Altezza"
-#: src/libslic3r/PrintConfig.cpp:261
+#: src/libslic3r/PrintConfig.cpp:295
msgid "Heights at which a filament change is to occur."
msgstr "Altezze alle quali i cambi di filamento devono avvenire."
-#: src/slic3r/GUI/ConfigWizard.cpp:433
+#: src/slic3r/GUI/ConfigWizard.cpp:451
#, possible-c-format
msgid "Hello, welcome to %s! This %s helps you with the initial configuration; just a few settings and you will be ready to print."
msgstr "Ciao, benvenuto su %s! La %s ti aiuterà con la configurazione iniziale; giusto qualche impostazione e sarai pronto a stampare."
-#: src/libslic3r/PrintConfig.cpp:3365
+#: src/libslic3r/PrintConfig.cpp:3564
msgid "Help"
msgstr "Aiuto"
-#: src/libslic3r/PrintConfig.cpp:3371
+#: src/libslic3r/PrintConfig.cpp:3570
msgid "Help (FFF options)"
msgstr "Aiuto (opzioni FFF)"
-#: src/libslic3r/PrintConfig.cpp:3376
+#: src/libslic3r/PrintConfig.cpp:3575
msgid "Help (SLA options)"
msgstr "Aiuto (opzioni SLA)"
@@ -3218,96 +3857,100 @@ msgstr "Aiuto (opzioni SLA)"
msgid "Here you can adjust required purging volume (mm³) for any given pair of tools."
msgstr "Qui è possibile regolare il volume di spurgo necessario (mm³) per ogni coppia di attrezzi."
-#: src/libslic3r/PrintConfig.cpp:973
+#: src/slic3r/GUI/DoubleSlider.cpp:1849
+msgid "Hide ruler"
+msgstr "Nascondi righello"
+
+#: src/libslic3r/PrintConfig.cpp:1017
msgid "High extruder current on filament swap"
msgstr "Alta corrente estrusore al cambio filamento"
-#: src/slic3r/GUI/GLCanvas3D.cpp:277
+#: src/slic3r/GUI/GLCanvas3D.cpp:263
msgid "Higher print quality versus higher print speed."
msgstr "Qualità di stampa più alta contro velocità di stampa più alta."
-#: src/libslic3r/PrintConfig.cpp:427 src/libslic3r/PrintConfig.cpp:853
+#: src/libslic3r/PrintConfig.cpp:463 src/libslic3r/PrintConfig.cpp:891
msgid "Hilbert Curve"
msgstr "Curva di Hilbert"
-#: src/slic3r/GUI/Plater.cpp:1042
+#: src/slic3r/GUI/Plater.cpp:916
msgid "Hold Shift to Slice & Export G-code"
msgstr "Tieni premuto Shift per fare lo Slice & Esportare il G-code"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46
msgid "Hole depth"
msgstr "Profondità foro"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45
msgid "Hole diameter"
msgstr "Diametro foro"
-#: src/slic3r/GUI/Plater.cpp:2760
-msgid "Hollow"
-msgstr "Svuota"
-
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:977
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:785
msgid "Hollow and drill"
msgstr "Svuota e perfora"
-#: src/libslic3r/PrintConfig.cpp:2910
+#: src/libslic3r/PrintConfig.cpp:3074
msgid "Hollow out a model to have an empty interior"
msgstr "Svuota un modello per avere l'interno vuoto"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40
msgid "Hollow this object"
msgstr "Svuota questo oggetto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:108 src/slic3r/GUI/Tab.cpp:3654
-#: src/slic3r/GUI/Tab.cpp:3655 src/libslic3r/SLA/Hollowing.cpp:46
-#: src/libslic3r/SLA/Hollowing.cpp:58 src/libslic3r/SLA/Hollowing.cpp:67
-#: src/libslic3r/SLA/Hollowing.cpp:76 src/libslic3r/PrintConfig.cpp:2909
-#: src/libslic3r/PrintConfig.cpp:2916 src/libslic3r/PrintConfig.cpp:2926
-#: src/libslic3r/PrintConfig.cpp:2935
+#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:4073
+#: src/slic3r/GUI/Tab.cpp:4074 src/libslic3r/SLA/Hollowing.cpp:45
+#: src/libslic3r/SLA/Hollowing.cpp:57 src/libslic3r/SLA/Hollowing.cpp:66
+#: src/libslic3r/SLA/Hollowing.cpp:75 src/libslic3r/PrintConfig.cpp:3073
+#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090
+#: src/libslic3r/PrintConfig.cpp:3099
msgid "Hollowing"
msgstr "Svuotamento"
-#: src/slic3r/GUI/Plater.cpp:2926
-msgid "Hollowing cancelled."
-msgstr "Svuotamento annullato."
-
-#: src/slic3r/GUI/Plater.cpp:2927
-msgid "Hollowing done."
-msgstr "Svuotamento completato."
-
-#: src/slic3r/GUI/Plater.cpp:2929
-msgid "Hollowing failed."
-msgstr "Svuotamento non riuscito."
-
-#: src/libslic3r/PrintConfig.cpp:2937
+#: src/libslic3r/PrintConfig.cpp:3101
msgid "Hollowing is done in two steps: first, an imaginary interior is calculated deeper (offset plus the closing distance) in the object and then it's inflated back to the specified offset. A greater closing distance makes the interior more rounded. At zero, the interior will resemble the exterior the most."
msgstr "Lo svuotamento avviene in due passaggi: prima, viene calcolato un interno immaginario (offset più la distanza di chiusura) nell'oggetto e viene quindi riportato all'offset specificato. Una distanza di chiusura più grande rende l'interno più arrotondato. A zero, l'interno sarà più somigliante all'esterno."
-#: src/libslic3r/SLAPrintSteps.cpp:43
+#: src/libslic3r/SLAPrintSteps.cpp:44
msgid "Hollowing model"
msgstr "Svuotamento modello"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:813
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:624
msgid "Hollowing parameter change"
msgstr "Cambio parametro svuotamento"
-#: src/libslic3r/PrintConfig.cpp:850 src/libslic3r/PrintConfig.cpp:2011
+#: src/libslic3r/PrintConfig.cpp:888 src/libslic3r/PrintConfig.cpp:2153
msgid "Honeycomb"
msgstr "Nido d'ape"
-#: src/slic3r/GUI/Tab.cpp:1064
+#: src/slic3r/GUI/Tab.cpp:1386
msgid "Horizontal shells"
msgstr "Gusci orizzontali"
-#: src/libslic3r/PrintConfig.cpp:245
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:253
+msgid "Horizontal Slider"
+msgstr "Cursore di scorrimento orizzontale "
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:209
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:213
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:238
+msgid "Horizontal slider - Move active thumb Left"
+msgstr "Cursore di scorrimento orizzontale - Sposta a sinistra il cursore attivo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:210
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:214
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:239
+msgid "Horizontal slider - Move active thumb Right"
+msgstr "Cursore di scorrimento orizzontale - Sposta a destra il cursore attivo"
+
+#: src/libslic3r/PrintConfig.cpp:279
msgid "Horizontal width of the brim that will be printed around each object on the first layer."
msgstr "Larghezza orizzontale del brim che sarà stampata attorno ad ogni oggetto nel primo layer."
-#: src/slic3r/GUI/PrintHostDialogs.cpp:152
+#: src/slic3r/GUI/PrintHostDialogs.cpp:150
msgid "Host"
msgstr "Host"
-#: src/libslic3r/PrintConfig.cpp:1332
+#: src/libslic3r/PrintConfig.cpp:1440
msgid "Host Type"
msgstr "Tipo di Host"
@@ -3315,189 +3958,275 @@ msgstr "Tipo di Host"
msgid "Hostname"
msgstr "Nome Host"
-#: src/libslic3r/PrintConfig.cpp:97
+#: src/libslic3r/PrintConfig.cpp:99
msgid "Hostname, IP or URL"
msgstr "Nome Host, IP o URL"
-#: src/slic3r/GUI/Tab.cpp:139
+#: src/slic3r/GUI/Tab.cpp:210
msgid "Hover the cursor over buttons to find more information \nor click this button."
msgstr "Scorri il cursore sui bottoni per ottenere maggiori informazioni o clicca su questo bottone."
-#: src/libslic3r/PrintConfig.cpp:2812
+#: src/libslic3r/PrintConfig.cpp:2976
msgid "How far should the pad extend around the contained geometry"
msgstr "Quanto deve estendersi il Pad attorno la geometria contenuta"
-#: src/libslic3r/PrintConfig.cpp:2901
+#: src/libslic3r/PrintConfig.cpp:3065
msgid "How much should the tiny connectors penetrate into the model body."
msgstr "Quanto devono penetrare i piccoli connettori nel corpo del modello."
-#: src/libslic3r/PrintConfig.cpp:2631
+#: src/libslic3r/PrintConfig.cpp:2774
msgid "How much the pinhead has to penetrate the model surface"
msgstr "Quanto deve penetrare l'apice nella superficie del modello"
-#: src/libslic3r/PrintConfig.cpp:2755
+#: src/libslic3r/PrintConfig.cpp:2919
msgid "How much the supports should lift up the supported object. If \"Pad around object\" is enabled, this value is ignored."
msgstr "Quanto deve sollevarsi il supporto fino all'oggetto supportato. Se \"Pad intorno all'oggetto\" è attivo, questo valore è ignorato."
-#: src/libslic3r/PrintConfig.cpp:111
+#: src/libslic3r/PrintConfig.cpp:1209
+msgid "How to apply limits"
+msgstr "Come applicare i limiti"
+
+#: src/libslic3r/PrintConfig.cpp:1203
+msgid "How to apply the Machine Limits"
+msgstr "Come applicare i Limiti Macchina"
+
+#: src/libslic3r/PrintConfig.cpp:163
+msgid "HTTP digest"
+msgstr "HTTP digest"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:358
+#: src/libslic3r/PrintConfig.cpp:113
msgid "HTTPS CA File"
msgstr "File HTTPS CA"
-#: src/slic3r/GUI/Tab.cpp:1713
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:319
msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate."
msgstr "File HTTPS CA opzionale. È necessario solo se si intende usare un HTTPS con certificato autofirmato."
-#: src/slic3r/GUI/Preferences.cpp:222
+#: src/slic3r/GUI/Preferences.cpp:376
msgid "Icon size in a respect to the default size"
msgstr "Dimensioni icona rispetto alla dimensione predefinita"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:149
+#: src/slic3r/GUI/PrintHostDialogs.cpp:147
msgid "ID"
msgstr "ID"
-#: src/libslic3r/PrintConfig.cpp:1873
+#: src/libslic3r/PrintConfig.cpp:2015
msgid "If checked, supports will be generated automatically based on the overhang threshold value. If unchecked, supports will be generated inside the \"Support Enforcer\" volumes only."
msgstr "Se attivo, verranno automaticamente generati i supporti in base al valore soglia di sporgenza. Se disattivato, i supporti verranno generati solamente all'interno dei volumi di \"Rinforzo Supporto\"."
-#: src/slic3r/GUI/ConfigWizard.cpp:773
+#: src/slic3r/GUI/ConfigWizard.cpp:1132
#, possible-c-format
msgid "If enabled, %s checks for new application versions online. When a new version becomes available, a notification is displayed at the next application startup (never during program usage). This is only a notification mechanisms, no automatic installation is done."
msgstr "Se attivato, %s verifica la presenza di nuove versioni online. Quando è disponibile una nuova versione, viene mostrata una notifica al successivo avvio dell'applicazione (mai durante l'uso del programma). È solo un meccanismo di notifica, non viene effettuato nessun aggiornamento automatico."
-#: src/slic3r/GUI/ConfigWizard.cpp:783
+#: src/slic3r/GUI/ConfigWizard.cpp:1142
#, possible-c-format
msgid "If enabled, %s downloads updates of built-in system presets in the background.These updates are downloaded into a separate temporary location.When a new preset version becomes available it is offered at application startup."
msgstr "Se attivo, %s scarica in background gli aggiornamenti dei preset integrati nel sistema. Questi aggiornamenti vengono scaricati in una cartella temporanea separata. Quando è disponibile una nuova versione del preset, questa viene proposta all'avvio."
-#: src/libslic3r/PrintConfig.cpp:1852
+#: src/libslic3r/PrintConfig.cpp:1994
msgid "If enabled, all printing extruders will be primed at the front edge of the print bed at the start of the print."
msgstr "Se attivata, tutti gli estrusori di stampa verranno preparati nel bordo frontale del piano di stampa all'inizio della stampa."
-#: src/slic3r/GUI/ConfigWizard.cpp:805
+#: src/slic3r/GUI/ConfigWizard.cpp:1164
msgid "If enabled, allows the Reload from disk command to automatically find and load the files when invoked.\nIf not enabled, the Reload from disk command will ask to select each file using an open file dialog."
msgstr "Se attivo, permette al comando di Ricarica da disco di trovare e caricare automaticamente i file quando richiesti.\nSe non attivo, il comando Ricarica da disco chiederà di selezionare ciascun file tramite finestra di apertura file."
-#: src/slic3r/GUI/Preferences.cpp:74
+#: src/slic3r/GUI/Preferences.cpp:91
msgid "If enabled, allows the Reload from disk command to automatically find and load the files when invoked."
msgstr "Se attivo, permette il comando Ricarica da disco per trovare e caricare automaticamente i file quando richiesto."
-#: src/slic3r/GUI/Preferences.cpp:66
+#: src/slic3r/GUI/Preferences.cpp:238
+msgid "If enabled, changes made using the sequential slider, in preview, apply only to gcode top layer. If disabled, changes made using the sequential slider, in preview, apply to the whole gcode."
+msgstr "Se abilitato, le modifiche effettuate utilizzando il cursore sequenziale, in anteprima, si applicano solo al livello superiore del gcode. Se disabilitato, le modifiche effettuate utilizzando il cursore sequenziale, in anteprima, si applicano all'intero gcode."
+
+#: src/slic3r/GUI/Preferences.cpp:83
msgid "If enabled, PrusaSlicer will check for the new versions of itself online. When a new version becomes available a notification is displayed at the next application startup (never during program usage). This is only a notification mechanisms, no automatic installation is done."
msgstr "Se attivato, PrusaSlicer verifica la presenza di nuove versioni online. Quando una nuova versione è disponibile, viene mostrata una notifica al successivo avvio dell'applicazione (mai durante l'uso del programma). Questo è solo un meccanismo di notifica, non viene effettuato nessun aggiornamento automatico."
-#: src/slic3r/GUI/Preferences.cpp:82
+#: src/slic3r/GUI/Preferences.cpp:270
+msgid "If enabled, renders object using the environment map."
+msgstr "Se abilitato, renderizza l'oggetto utilizzando la mappa ambientale."
+
+#: src/slic3r/GUI/Preferences.cpp:200
+msgid "If enabled, reverses the direction of zoom with mouse wheel"
+msgstr "Se abilitato, inverte la direzione dello zoom con la rotella del mouse"
+
+#: src/slic3r/GUI/Preferences.cpp:93
+msgid "If enabled, sets PrusaSlicer as default application to open .3mf files."
+msgstr "Se abilitato, imposta PrusaSlicer come applicazione predefinita per aprire i file .3mf."
+
+#: src/slic3r/GUI/Preferences.cpp:100
+msgid "If enabled, sets PrusaSlicer as default application to open .stl files."
+msgstr "Se abilitato, imposta PrusaSlicer come applicazione predefinita per aprire i file .stl."
+
+#: src/slic3r/GUI/Preferences.cpp:179
+msgid "If enabled, sets PrusaSlicer G-code Viewer as default application to open .gcode files."
+msgstr "Se abilitato, imposta il visualizzatore G-code di PrusaSlicer come applicazione predefinita per aprire i file .gcode."
+
+#: src/slic3r/GUI/Preferences.cpp:99
msgid "If enabled, Slic3r downloads updates of built-in system presets in the background. These updates are downloaded into a separate temporary location. When a new preset version becomes available it is offered at application startup."
msgstr "Se abilitato, Slic3r scarica gli aggiornamenti dei preset inclusi in background. Questi aggiornamenti sono scaricati in una posizione temporanea. Quando una nuova versione dei preset diventa disponibile, viene offerta all'avvio."
-#: src/slic3r/GUI/Preferences.cpp:106
+#: src/slic3r/GUI/Preferences.cpp:137
msgid "If enabled, the 3D scene will be rendered in Retina resolution. If you are experiencing 3D performance problems, disabling this option may help."
msgstr "Se attivo, la scena 3D verrà renderizzata con la risoluzione Retina. Se si riscontrano problemi di prestazioni 3D, disattivare questa opzione potrebbe essere d'aiuto."
-#: src/libslic3r/PrintConfig.cpp:1696
+#: src/slic3r/GUI/Preferences.cpp:215
+msgid "If enabled, the button for the collapse sidebar will be appeared in top right corner of the 3D Scene"
+msgstr "Se abilitato, il pulsante per ridurre la barra di scorrimento laterale apparirà nell'angolo in alto a destra della scena 3D"
+
+#: src/libslic3r/PrintConfig.cpp:3698
+msgid "If enabled, the command line arguments are sent to an existing instance of GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides the \"single_instance\" configuration value from application preferences."
+msgstr "Se abilitato, gli argomenti della riga di comando vengono inviati ad un'istanza GUI esistente di PrusaSlicer, oppure viene attivata una finestra PrusaSlicer esistente. Sovrascrive il valore di configurazione \"single_instance\" dalle preferenze dell'applicazione."
+
+#: src/slic3r/GUI/Preferences.cpp:294
+msgid "If enabled, the descriptions of configuration parameters in settings tabs wouldn't work as hyperlinks. If disabled, the descriptions of configuration parameters in settings tabs will work as hyperlinks."
+msgstr "Se abilitata, le descrizioni dei parametri di configurazione nelle schede delle impostazioni non funzionano come collegamenti ipertestuali. Se disabilitata, le descrizioni dei parametri di configurazione nelle schede delle impostazioni funzioneranno come collegamenti ipertestuali."
+
+#: src/slic3r/GUI/Preferences.cpp:209
+msgid "If enabled, the legacy 3DConnexion devices settings dialog is available by pressing CTRL+M"
+msgstr "Se abilitata, la finestra di dialogo delle impostazioni dei dispositivi 3DConnexion è disponibile premendo CTRL+M"
+
+#: src/libslic3r/PrintConfig.cpp:1804
msgid "If enabled, the skirt will be as tall as a highest printed object. This is useful to protect an ABS or ASA print from warping and detaching from print bed due to wind draft."
msgstr "Se abilitata, lo skirt sarà alto quanto l'oggetto stampato più alto. Questo è utile per evitare che una stampa ABS o ASA si deformi e si stacchi dal piano di stampa a causa di correnti d'aria."
-#: src/libslic3r/PrintConfig.cpp:1858
+#: src/libslic3r/PrintConfig.cpp:2000
msgid "If enabled, the wipe tower will not be printed on layers with no toolchanges. On layers with a toolchange, extruder will travel downward to print the wipe tower. User is responsible for ensuring there is no collision with the print."
msgstr "Se attiva, la torre di spurgo non verrà stampata sui layer con cambio attrezzo. Sui layer con un cambio attrezzo, l'estrusore si sposterà verso il basso per stampare la torre di spurgo. L'utente è responsabile nell'accertarsi che non avvengano collisioni durante la stampa."
-#: src/slic3r/GUI/Preferences.cpp:128
+#: src/slic3r/GUI/Preferences.cpp:193
msgid "If enabled, use free camera. If not enabled, use constrained camera."
msgstr "Se attivo, usa la visuale libera. Se non attivo, usa la visuale vincolata."
-#: src/slic3r/GUI/Preferences.cpp:121
+#: src/slic3r/GUI/Preferences.cpp:186
msgid "If enabled, use perspective camera. If not enabled, use orthographic camera."
msgstr "Se attivo, usa la visuale in prospettiva. Se non attivo, usa la visuale ortografica."
-#: src/slic3r/GUI/Preferences.cpp:145
+#: src/slic3r/GUI/Preferences.cpp:222
msgid "If enabled, you can change size of toolbar icons manually."
msgstr "Se attivo, è possibile modificare manualmente la dimensione delle icone degli strumenti."
-#: src/slic3r/GUI/PresetHints.cpp:29
+#: src/slic3r/GUI/PresetHints.cpp:28
msgid "If estimated layer time is below ~%1%s, fan will run at %2%%% and print speed will be reduced so that no less than %3%s are spent on that layer (however, speed will never be reduced below %4%mm/s)."
msgstr "Se il tempo previsto per il layer è inferiore a ~%1%s, la ventola girerà al %2%%% e la velocità di stampa sarà ridotta così da impiegare non meno di %3%s su quel layer (in ogni caso, la velocità non sarà mai ridotta sotto %4%mm/s)."
-#: src/slic3r/GUI/PresetHints.cpp:36
+#: src/slic3r/GUI/PresetHints.cpp:35
msgid "If estimated layer time is greater, but still below ~%1%s, fan will run at a proportionally decreasing speed between %2%%% and %3%%%."
msgstr "Se la durata di stampa prevista per il layer è più lunga, ma comunque inferiore a ~%1%s, la ventola girerà ad una velocità proporzionalmente decrescente compresa tra %2%%% e %3%%%."
-#: src/libslic3r/PrintConfig.cpp:901
+#: src/libslic3r/PrintConfig.cpp:943
msgid "If expressed as absolute value in mm/s, this speed will be applied to all the print moves of the first layer, regardless of their type. If expressed as a percentage (for example: 40%) it will scale the default speeds."
msgstr "Se espresso in valore assoluto in mm/s, questa velocità sarà applicata a tutti i movimenti di stampa del primo layer, a prescindere dal tipo di movimento. Se espresso in percentuale (per esempio: 40%) verranno scalate le velocità predefinite."
-#: src/libslic3r/PrintConfig.cpp:573
+#: src/libslic3r/PrintConfig.cpp:609
msgid "If layer print time is estimated below this number of seconds, fan will be enabled and its speed will be calculated by interpolating the minimum and maximum speeds."
msgstr "Se il tempo stimato di stampa del layer è al di sotto di questo numero di secondi, la ventola sarà attivata e la sua velocità sarà calcolata interpolando la velocità minima e massima."
-#: src/libslic3r/PrintConfig.cpp:1706
+#: src/libslic3r/PrintConfig.cpp:1821
msgid "If layer print time is estimated below this number of seconds, print moves speed will be scaled down to extend duration to this value."
msgstr "Se il tempo stimato di stampa del layer è al di sotto di questo numero di secondi, la velocità dei movimenti di stampa sarà ridotta per estendere la durata di questo valore."
-#: src/libslic3r/PrintConfig.cpp:567
+#: src/libslic3r/PrintConfig.cpp:603
msgid "If this is enabled, fan will never be disabled and will be kept running at least at its minimum speed. Useful for PLA, harmful for ABS."
msgstr "Se questo è attivo, la ventola non verrà mai disattiva e verrà mantenuta attiva almeno alla velocità minima. Utile per il PLA, dannosa per l'ABS."
-#: src/slic3r/GUI/Preferences.cpp:49
+#: src/slic3r/GUI/Preferences.cpp:66
msgid "If this is enabled, Slic3r will auto-center objects around the print bed center."
msgstr "Se attivo, Slic3r posizionerà automaticamente gli oggetti al centro del piano di stampa."
-#: src/slic3r/GUI/Preferences.cpp:57
+#: src/slic3r/GUI/Preferences.cpp:74
msgid "If this is enabled, Slic3r will pre-process objects as soon as they're loaded in order to save time when exporting G-code."
msgstr "Se attivo, Slic3r processerà in anticipo gli oggetti non appena saranno caricati, così da risparmiare tempo durante l'esportazione del G-code."
-#: src/slic3r/GUI/Preferences.cpp:41
+#: src/slic3r/GUI/Preferences.cpp:54
msgid "If this is enabled, Slic3r will prompt the last output directory instead of the one containing the input files."
msgstr "Se attivo, Slic3r suggerirà l'ultima cartella di destinazione invece della cartella contenente il file di ricezione."
-#: src/libslic3r/PrintConfig.cpp:1562
+#: src/slic3r/GUI/Preferences.cpp:125
+msgid "If this is enabled, when starting PrusaSlicer and another instance of the same PrusaSlicer is already running, that instance will be reactivated instead."
+msgstr "Se questo è abilitato, quando si avvia PrusaSlicer e un'altra istanza della stessa PrusaSlicer è già in esecuzione, quell'istanza verrà invece riattivata."
+
+#: src/libslic3r/PrintConfig.cpp:1670
msgid "If you set this to a positive value, Z is quickly raised every time a retraction is triggered. When using multiple extruders, only the setting for the first extruder will be considered."
msgstr "Se inserisci un valore positivo, Z verrà alzato velocemente ogni volta che si innesca una retrazione. Quando si utilizzano diversi estrusori, verrà considerato solamente l'impostazione del primo estrusore."
-#: src/libslic3r/PrintConfig.cpp:1571
+#: src/libslic3r/PrintConfig.cpp:1679
msgid "If you set this to a positive value, Z lift will only take place above the specified absolute Z. You can tune this setting for skipping lift on the first layers."
msgstr "Se inserisci un valore positivo, il sollevamento Z avverrà solamente sopra un certo specifico valore assoluto Z. Puoi regolare questa impostazione per evitare il sollevamento nei primi layer."
-#: src/libslic3r/PrintConfig.cpp:1580
+#: src/libslic3r/PrintConfig.cpp:1688
msgid "If you set this to a positive value, Z lift will only take place below the specified absolute Z. You can tune this setting for limiting lift to the first layers."
msgstr "Se inserisci un valore positivo, il sollevamento Z avverrà solamente sotto un certo specifico valore assoluto Z. Puoi regolare questa impostazione per limitare il sollevamento ai primi layer."
-#: src/libslic3r/PrintConfig.cpp:1454
+#: src/libslic3r/PrintConfig.cpp:1562
msgid "If you want to process the output G-code through custom scripts, just list their absolute paths here. Separate multiple scripts with a semicolon. Scripts will be passed the absolute path to the G-code file as the first argument, and they can access the Slic3r config settings by reading environment variables."
msgstr "Se vuoi processare il G-code in uscita con script personalizzati, basta elencare qui il loro percorso assoluto. Separa i diversi script con un punto e virgola. Gli script passeranno il percorso assoluto nel G-code come primo argomento, e potranno accedere alle impostazioni di configurazione di Slic3r leggendo le variabili di ambiente."
-#: src/libslic3r/PrintConfig.cpp:530
+#: src/libslic3r/PrintConfig.cpp:566
msgid "If your firmware doesn't handle the extruder displacement you need the G-code to take it into account. This option lets you specify the displacement of each extruder with respect to the first one. It expects positive coordinates (they will be subtracted from the XY coordinate)."
msgstr "Se il firmware non gestisce lo spostamento dell'estrusore, è necessario che il G-code ne tenga conto. Questa opzione permette di specificare lo spostamento di ciascun estrusore rispetto al primo. Si aspetta delle coordinate positive (che saranno sottratte dalle coordinate XY)."
-#: src/libslic3r/PrintConfig.cpp:2169
+#: src/libslic3r/PrintConfig.cpp:2312
msgid "If your firmware requires relative E values, check this, otherwise leave it unchecked. Most firmwares use absolute values."
msgstr "Se il firmware richiede valori E relativi, selezionalo, altrimenti mantienilo deselezionato. Molti firmware utilizzano valori assoluti."
-#: src/libslic3r/PrintConfig.cpp:3485
+#: src/libslic3r/PrintConfig.cpp:1219
+msgid "Ignore"
+msgstr "Ignora"
+
+#: src/libslic3r/PrintConfig.cpp:3684
msgid "Ignore non-existent config files"
msgstr "Ignora file di configurazione non esistenti"
-#: src/slic3r/GUI/MainFrame.cpp:464
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:192
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:173
+msgid "Ignores facets facing away from the camera."
+msgstr "Ignora le faccette rivolte verso l'esterno."
+
+#: src/slic3r/GUI/MainFrame.cpp:1055
msgid "Import &Config"
msgstr "Importa &Configurazione"
-#: src/slic3r/GUI/MainFrame.cpp:471
+#: src/slic3r/GUI/MainFrame.cpp:1062
msgid "Import Config &Bundle"
-msgstr "Importa Configurazione da &Bundle"
+msgstr "Importa Configurazione in &Bundle"
-#: src/slic3r/GUI/MainFrame.cpp:467
+#: src/slic3r/GUI/MainFrame.cpp:1058
msgid "Import Config from &project"
msgstr "Importa Configurazione da &progetto"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:119
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:112
msgid "Import Config from ini/amf/3mf/gcode"
msgstr "Importa Config da ini/amf/3mf/gcode"
-#: src/slic3r/GUI/Plater.cpp:4603
+#: src/slic3r/GUI/Plater.cpp:1419
+msgid "Import config only"
+msgstr "Importa solo configurazione"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:39
+msgid "Import file"
+msgstr "Importa file"
+
+#: src/slic3r/GUI/Plater.cpp:1418
+msgid "Import geometry only"
+msgstr "Importa solo la geometria"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:46
+msgid "Import model and profile"
+msgstr "Importa modello e profilo"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48
+msgid "Import model only"
+msgstr "Importa solo il modello"
+
+#: src/slic3r/GUI/Plater.cpp:4655
msgid "Import Object"
msgstr "Importa Oggetto"
-#: src/slic3r/GUI/Plater.cpp:4607
+#: src/slic3r/GUI/Plater.cpp:4659
msgid "Import Objects"
msgstr "Importa Oggetti"
@@ -3505,468 +4234,581 @@ msgstr "Importa Oggetti"
msgid "Import of the repaired 3mf file failed"
msgstr "Importazione del file 3mf riparato non riuscita"
-#: src/slic3r/GUI/MainFrame.cpp:460
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47
+msgid "Import profile only"
+msgstr "Solo profilo di importazione"
+
+#: src/slic3r/GUI/MainFrame.cpp:1050
+msgid "Import SL1 archive"
+msgstr "Importa archivio SL1"
+
+#: src/slic3r/GUI/Plater.cpp:1561
+msgid "Import SLA archive"
+msgstr "Importa archivio SLA"
+
+#: src/slic3r/GUI/MainFrame.cpp:1046
+msgid "Import STL (imperial units)"
+msgstr "Importa STL (unità imperiali)"
+
+#: src/slic3r/GUI/MainFrame.cpp:1042
msgid "Import STL/OBJ/AM&F/3MF"
msgstr "Importa STL/OBJ/AM&F/3MF"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:118
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:111
msgid "Import STL/OBJ/AMF/3MF without config, keep plater"
msgstr "Importa STL/OBJ/AMF/3MF senza configurazione, mantieni piano"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3422
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:159
+msgid "Importing canceled."
+msgstr "Importazione annullata."
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:160
+msgid "Importing done."
+msgstr "Importazione completata."
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135
+msgid "Importing SLA archive"
+msgstr "Importazione archivio SLA"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487
+msgid "in"
+msgstr "in"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3885
#, possible-c-format
msgid "In this mode you can select only other %s Items%s"
msgstr "In questa modalità puoi selezionare solo altri %s oggetti %s"
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:423
+msgid "Inches"
+msgstr "Pollici"
+
#: src/slic3r/GUI/UpdateDialogs.cpp:230
msgid "Incompatible bundles:"
msgstr "Gruppi incompatibili:"
+#: src/slic3r/GUI/PresetComboBoxes.cpp:241
+msgid "Incompatible presets"
+msgstr "Preset incompatibili"
+
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75
#, possible-c-format
msgid "Incompatible with this %s"
msgstr "Incompatibile con questo %s"
-#: src/slic3r/GUI/Plater.cpp:4685
+#: src/slic3r/GUI/Plater.cpp:4790
msgid "Increase Instances"
msgstr "Aumenta Istanze"
-#: src/slic3r/GUI/GLCanvas3D.cpp:264
+#: src/slic3r/GUI/GLCanvas3D.cpp:251
msgid "Increase/decrease edit area"
msgstr "Aumenta/diminuisci l'area di modifica"
-#: src/slic3r/GUI/Plater.cpp:2922
-msgid "Indexing hollowed object"
-msgstr "Indicizzazione di un oggetto svuotato"
-
#. TRN Description for "UNLOCKED LOCK"
-#: src/slic3r/GUI/Tab.cpp:3258
+#: src/slic3r/GUI/Tab.cpp:3695
msgid "indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\nClick the UNLOCKED LOCK icon to reset all settings for current option group to the system (or default) values."
msgstr "indica che è stata modificata qualche impostazione e non è uguale ai valori di sistema (o predefiniti) del corrente gruppo di opzioni.\nClicca l'icona LUCCHETTO APERTO per reimpostare tutte le impostazioni del corrente gruppo di opzioni ai valori di sistema (o predefiniti)."
#. TRN Description for "LOCKED LOCK"
-#: src/slic3r/GUI/Tab.cpp:3254
+#: src/slic3r/GUI/Tab.cpp:3691
msgid "indicates that the settings are the same as the system (or default) values for the current option group"
msgstr "indica che le impostazioni sono uguali ai valori di sistema (o predefiniti) per l'attuale gruppo di opzioni"
#. TRN Description for "BACK ARROW"
-#: src/slic3r/GUI/Tab.cpp:3270
+#: src/slic3r/GUI/Tab.cpp:3707
msgid "indicates that the settings were changed and are not equal to the last saved preset for the current option group.\nClick the BACK ARROW icon to reset all settings for the current option group to the last saved preset."
msgstr "indica che le impostazioni sono state modificate e non corrispondono all'ultimo preset salvato per l'attuale gruppo opzioni.\nClicca l'icona FRECCIA INDIETRO per reimpostare all'ultimo preset salvato tutte le impostazioni per il seguente gruppo di opzioni."
-#: src/slic3r/GUI/ConfigManipulation.cpp:211
-#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:96
-#: src/slic3r/GUI/GUI_ObjectList.cpp:614 src/slic3r/GUI/Plater.cpp:527
-#: src/slic3r/GUI/Tab.cpp:1091 src/slic3r/GUI/Tab.cpp:1092
-#: src/libslic3r/PrintConfig.cpp:203 src/libslic3r/PrintConfig.cpp:416
-#: src/libslic3r/PrintConfig.cpp:436 src/libslic3r/PrintConfig.cpp:776
-#: src/libslic3r/PrintConfig.cpp:790 src/libslic3r/PrintConfig.cpp:827
-#: src/libslic3r/PrintConfig.cpp:981 src/libslic3r/PrintConfig.cpp:991
-#: src/libslic3r/PrintConfig.cpp:1009 src/libslic3r/PrintConfig.cpp:1028
-#: src/libslic3r/PrintConfig.cpp:1047 src/libslic3r/PrintConfig.cpp:1728
-#: src/libslic3r/PrintConfig.cpp:1745
+#: src/slic3r/GUI/ConfigManipulation.cpp:210
+#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:93
+#: src/slic3r/GUI/GUI_ObjectList.cpp:652 src/slic3r/GUI/Plater.cpp:393
+#: src/slic3r/GUI/Tab.cpp:1413 src/slic3r/GUI/Tab.cpp:1414
+#: src/libslic3r/PrintConfig.cpp:237 src/libslic3r/PrintConfig.cpp:450
+#: src/libslic3r/PrintConfig.cpp:472 src/libslic3r/PrintConfig.cpp:812
+#: src/libslic3r/PrintConfig.cpp:826 src/libslic3r/PrintConfig.cpp:863
+#: src/libslic3r/PrintConfig.cpp:1025 src/libslic3r/PrintConfig.cpp:1035
+#: src/libslic3r/PrintConfig.cpp:1053 src/libslic3r/PrintConfig.cpp:1072
+#: src/libslic3r/PrintConfig.cpp:1091 src/libslic3r/PrintConfig.cpp:1843
+#: src/libslic3r/PrintConfig.cpp:1860
msgid "Infill"
msgstr "Riempimento"
-#: src/slic3r/GUI/PresetHints.cpp:174
+#: src/slic3r/GUI/PresetHints.cpp:173
msgid "infill"
msgstr "riempimento"
-#: src/libslic3r/PrintConfig.cpp:1021
+#: src/libslic3r/PrintConfig.cpp:1065
msgid "Infill before perimeters"
msgstr "Riempimento prima dei perimetri"
-#: src/libslic3r/PrintConfig.cpp:1001
+#: src/libslic3r/PrintConfig.cpp:1045
msgid "Infill extruder"
msgstr "Estrusore riempimento"
-#: src/libslic3r/PrintConfig.cpp:1036
+#: src/libslic3r/PrintConfig.cpp:1080
msgid "Infill/perimeters overlap"
msgstr "Sovrapposizione riempimento/perimetri"
-#: src/libslic3r/Print.cpp:1584
+#: src/libslic3r/Print.cpp:1610
msgid "Infilling layers"
msgstr "Layer di riempimento"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3430
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3505 src/slic3r/GUI/Plater.cpp:141
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3893
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3968 src/slic3r/GUI/Plater.cpp:147
msgid "Info"
msgstr "Info"
-#: src/libslic3r/PrintConfig.cpp:1057
+#: src/slic3r/GUI/GUI_App.cpp:1087 src/slic3r/GUI/Tab.cpp:3435
+msgid "Information"
+msgstr "Informazioni"
+
+#: src/libslic3r/PrintConfig.cpp:1101
msgid "Inherits profile"
msgstr "Eredita profilo"
-#: src/libslic3r/SLAPrint.cpp:653
+#: src/libslic3r/SLAPrint.cpp:667
msgid "Initial exposition time is out of printer profile bounds."
msgstr "Il tempo di esposizione iniziale è fuori dai limiti del profilo stampante."
-#: src/libslic3r/PrintConfig.cpp:2564 src/libslic3r/PrintConfig.cpp:2565
+#: src/libslic3r/PrintConfig.cpp:2707 src/libslic3r/PrintConfig.cpp:2708
msgid "Initial exposure time"
msgstr "Tempo di esposizione iniziale"
-#: src/libslic3r/PrintConfig.cpp:2482 src/libslic3r/PrintConfig.cpp:2483
+#: src/libslic3r/PrintConfig.cpp:2625 src/libslic3r/PrintConfig.cpp:2626
msgid "Initial layer height"
msgstr "Altezza layer iniziale"
-#: src/slic3r/GUI/Field.cpp:204
+#: src/slic3r/GUI/Field.cpp:269
+#, possible-c-format
+msgid "Input value is out of range\nAre you sure that %s is a correct value and that you want to continue?"
+msgstr "Il valore di input è fuori portata\nSei sicuro che %s sia un valore corretto e di voler continuare?"
+
+#: src/slic3r/GUI/Field.cpp:252 src/slic3r/GUI/Field.cpp:1370
msgid "Input value is out of range"
msgstr "Valore input fuori portata"
-#: src/slic3r/GUI/GUI_App.cpp:800
+#: src/slic3r/GUI/GUI_App.cpp:1480
msgid "Inspect / activate configuration snapshots"
msgstr "Ispeziona / attiva istantanee di configurazione"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:60
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:216
+#: src/slic3r/Utils/PresetUpdater.cpp:120
+msgid "install"
+msgstr "installa"
+
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:62
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:218
#, possible-c-format
msgid "Instance %d"
msgstr "Istanza %d"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2500
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2892
msgid "Instance manipulation"
msgstr "Manipolazione istanza"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:56
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:58
msgid "Instances"
msgstr "Istanze"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1091
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3781
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1215
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4244
msgid "Instances to Separated Objects"
msgstr "Istanze in Oggetti Separati"
-#: src/libslic3r/PrintConfig.cpp:1973
+#: src/libslic3r/PrintConfig.cpp:2115
msgid "Interface layers"
msgstr "Layer interfaccia"
-#: src/libslic3r/PrintConfig.cpp:1957
+#: src/libslic3r/PrintConfig.cpp:2099
msgid "Interface loops"
msgstr "Giri interfaccia"
-#: src/libslic3r/PrintConfig.cpp:1982
+#: src/libslic3r/PrintConfig.cpp:2124
msgid "Interface pattern spacing"
msgstr "Spaziatura trama interfaccia"
-#: src/libslic3r/PrintConfig.cpp:1071
+#: src/libslic3r/PrintConfig.cpp:1115
msgid "Interface shells"
msgstr "Gusci interfaccia"
-#: src/libslic3r/Zipper.cpp:84
+#: src/libslic3r/miniz_extension.cpp:143
msgid "internal error"
msgstr "errore interno"
-#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:313
+#: src/slic3r/GUI/GUI_Preview.cpp:304 src/libslic3r/ExtrusionEntity.cpp:317
+#: src/libslic3r/ExtrusionEntity.cpp:342
msgid "Internal infill"
msgstr "Riempimento interno"
-#: src/slic3r/GUI/Plater.cpp:3106
+#: src/slic3r/GUI/BedShapeDialog.cpp:145
+msgid "Invalid"
+msgstr "Non valido"
+
+#: src/slic3r/GUI/Plater.cpp:2906 src/slic3r/GUI/Plater.cpp:3583
msgid "Invalid data"
msgstr "Dati non validi"
-#: src/slic3r/GUI/BedShapeDialog.cpp:494 src/slic3r/GUI/BedShapeDialog.cpp:543
-#: src/slic3r/GUI/BedShapeDialog.cpp:566
+#: src/slic3r/GUI/BedShapeDialog.cpp:570 src/slic3r/GUI/BedShapeDialog.cpp:619
+#: src/slic3r/GUI/BedShapeDialog.cpp:642
msgid "Invalid file format."
msgstr "Formato file non valido."
-#: src/libslic3r/Zipper.cpp:80
+#: src/libslic3r/miniz_extension.cpp:139
msgid "invalid filename"
msgstr "nome file non valido"
-#: src/slic3r/GUI/ConfigManipulation.cpp:319
+#: src/slic3r/GUI/ConfigManipulation.cpp:324
msgid "Invalid Head penetration"
-msgstr "Inserimento Capocchia non valido"
+msgstr "Penetrazione della testa non valida"
-#: src/libslic3r/Zipper.cpp:48
+#: src/libslic3r/miniz_extension.cpp:107
msgid "invalid header or archive is corrupted"
msgstr "titolo non valido o archivio corrotto"
-#: src/slic3r/GUI/Field.cpp:195 src/slic3r/GUI/Field.cpp:226
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:376
+#: src/slic3r/GUI/Field.cpp:375
+msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
+msgstr "Formato di input non valido. Vettore di dimensioni previsto nel seguente formato: \"%1%\""
+
+#: src/slic3r/GUI/Field.cpp:243 src/slic3r/GUI/Field.cpp:274
+#: src/slic3r/GUI/Field.cpp:1358 src/slic3r/GUI/GUI_ObjectLayers.cpp:413
msgid "Invalid numeric input."
msgstr "Input numerico non valido."
-#: src/libslic3r/Zipper.cpp:78
+#: src/libslic3r/miniz_extension.cpp:137
msgid "invalid parameter"
msgstr "parametro non valido"
-#: src/slic3r/GUI/ConfigManipulation.cpp:332
+#: src/slic3r/GUI/ConfigManipulation.cpp:337
msgid "Invalid pinhead diameter"
msgstr "Diametro apice non valido"
+#: src/slic3r/GUI/GUI_ObjectList.cpp:94 src/slic3r/GUI/GUI_ObjectList.cpp:653
+#: src/slic3r/GUI/GUI_Preview.cpp:307 src/slic3r/GUI/Tab.cpp:1420
+#: src/libslic3r/ExtrusionEntity.cpp:320 src/libslic3r/ExtrusionEntity.cpp:348
+#: src/libslic3r/PrintConfig.cpp:1126 src/libslic3r/PrintConfig.cpp:1132
+#: src/libslic3r/PrintConfig.cpp:1146 src/libslic3r/PrintConfig.cpp:1156
+msgid "Ironing"
+msgstr "Stiratura"
+
+#: src/libslic3r/PrintConfig.cpp:1131 src/libslic3r/PrintConfig.cpp:1133
+msgid "Ironing Type"
+msgstr "Tipo di stiratura"
+
+#: src/slic3r/GUI/GUI_App.cpp:243
+msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community."
+msgstr "è basato su Slic3r di Alessandro Ranellucci e la comunità RepRap."
+
#. TRN "Slic3r _is licensed under the_ License"
-#: src/slic3r/GUI/AboutDialog.cpp:258
+#: src/slic3r/GUI/AboutDialog.cpp:283 src/slic3r/GUI/GUI_App.cpp:244
msgid "is licensed under the"
msgstr "è concesso in licenza ai sensi"
-#: src/slic3r/GUI/Tab.cpp:2941
-msgid "is not compatible with print profile"
-msgstr "non è compatibile con il profilo di stampa"
-
-#: src/slic3r/GUI/Tab.cpp:2940
-msgid "is not compatible with printer"
-msgstr "non è compatibile con la stampante"
-
-#: src/slic3r/GUI/MainFrame.cpp:658
+#: src/slic3r/GUI/MainFrame.cpp:955 src/slic3r/GUI/MainFrame.cpp:1275
msgid "Iso"
msgstr "Iso"
-#: src/slic3r/GUI/MainFrame.cpp:658
+#: src/slic3r/GUI/MainFrame.cpp:955 src/slic3r/GUI/MainFrame.cpp:1275
msgid "Iso View"
msgstr "Vista isometrica"
-#: src/slic3r/GUI/Tab.cpp:964
+#: src/slic3r/GUI/Tab.cpp:1282
msgid "It can't be deleted or modified."
msgstr "Non può essere eliminato o modificato."
-#: src/slic3r/GUI/Plater.cpp:3321
+#: src/slic3r/GUI/Plater.cpp:3124
msgid "It is not allowed to change the file to reload"
msgstr "Non è permesso modificare il file da ricaricare"
-#: src/libslic3r/PrintConfig.cpp:974
+#: src/libslic3r/PrintConfig.cpp:1018
msgid "It may be beneficial to increase the extruder motor current during the filament exchange sequence to allow for rapid ramming feed rates and to overcome resistance when loading a filament with an ugly shaped tip."
msgstr "Potrebbe essere utile aumentare la corrente del motore estrusore durante la sequenza di cambio filamento per permettere un avanzamento rapido del ramming e per superare la resistenza durante il caricamento di un filamento con una punta deformata."
-#: src/slic3r/GUI/GUI_App.cpp:1084 src/slic3r/GUI/Tab.cpp:2958
+#: src/slic3r/GUI/Tab.cpp:3413
+msgid "It's a last preset for this physical printer."
+msgstr "È l'ultimo preset per questa stampante fisica."
+
+#: src/slic3r/GUI/GUI_App.cpp:1876 src/slic3r/GUI/Tab.cpp:3187
msgid "It's impossible to print multi-part object(s) with SLA technology."
msgstr "Non è possibile stampare oggetti multi-parte con tecnologia SLA."
-#: src/slic3r/GUI/Tab.cpp:2229
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:601
+msgid "It's not possible to delete the last related preset for the printer."
+msgstr "Non è possibile cancellare l'ultimo preset relativo alla stampante."
+
+#: src/slic3r/GUI/Tab.cpp:2398
msgid "Jerk limits"
msgstr "Limiti Jerk"
-#: src/libslic3r/PrintConfig.cpp:1649
+#: src/libslic3r/PrintConfig.cpp:1757
msgid "Jitter"
msgstr "Jitter"
-#: src/slic3r/GUI/DoubleSlider.cpp:957 src/slic3r/GUI/DoubleSlider.cpp:1529
-#: src/slic3r/GUI/DoubleSlider.cpp:1651
+#: src/slic3r/GUI/DoubleSlider.cpp:1077 src/slic3r/GUI/DoubleSlider.cpp:1721
+#: src/slic3r/GUI/DoubleSlider.cpp:1852 src/slic3r/GUI/DoubleSlider.cpp:1856
msgid "Jump to height"
msgstr "Salta all'altezza"
-#: src/slic3r/GUI/DoubleSlider.cpp:955
+#: src/slic3r/GUI/DoubleSlider.cpp:1223
#, possible-c-format
-msgid "Jump to height %s or Set extruder sequence for the entire print"
-msgstr "Salta all'altezza %s o Imposta sequenza estrusore per l'intera stampa"
+msgid "Jump to height %s\nor Set ruler mode"
+msgstr "Vai all'altezza %s \no Imposta la modalità righello"
-#: src/libslic3r/PrintConfig.cpp:566
+#: src/slic3r/GUI/DoubleSlider.cpp:1220
+#, possible-c-format
+msgid "Jump to height %s\nSet ruler mode\nor Set extruder sequence for the entire print"
+msgstr "Vai all'altezza %s\nImposta la modalità del righello\no Imposta la sequenza dell'estrusore per l'intera stampa"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1071 src/slic3r/GUI/DoubleSlider.cpp:1852
+msgid "Jump to move"
+msgstr "Salta per spostare"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:315
+msgid "Just switch to \"%1%\" preset"
+msgstr "Passa solo al preset \"%1%\""
+
+#: src/libslic3r/PrintConfig.cpp:602
msgid "Keep fan always on"
msgstr "Mantieni la ventola sempre accesa"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:169
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:171
msgid "Keep lower part"
msgstr "Mantieni parte inferiore"
-#: src/slic3r/GUI/GLCanvas3D.cpp:304
+#: src/slic3r/GUI/GLCanvas3D.cpp:290
msgid "Keep min"
msgstr "Mantieni min"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:168
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170
msgid "Keep upper part"
msgstr "Mantieni parte superiore"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:41 src/slic3r/GUI/MainFrame.cpp:708
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:37
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:39 src/slic3r/GUI/MainFrame.cpp:941
+#: src/slic3r/GUI/MainFrame.cpp:1332
msgid "Keyboard Shortcuts"
msgstr "Scorciatoie Tastiera"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:245
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:259
msgid "Keyboard shortcuts"
msgstr "Scorciatoie tastiera"
-#: src/libslic3r/PrintConfig.cpp:2498
+#: src/libslic3r/PrintConfig.cpp:2641
msgid "kg"
msgstr "kg"
-#: src/libslic3r/PrintConfig.cpp:965
+#: src/libslic3r/PrintConfig.cpp:1009
msgid "Label objects"
msgstr "Etichetta oggetti"
-#: src/libslic3r/PrintConfig.cpp:2399
+#: src/libslic3r/PrintConfig.cpp:2542
msgid "Landscape"
msgstr "Landscape"
-#: src/slic3r/GUI/GUI_App.cpp:629
+#: src/slic3r/GUI/GUI_App.cpp:1295
msgid "Language"
msgstr "Lingua"
-#: src/slic3r/GUI/GUI_App.cpp:885
+#: src/slic3r/GUI/GUI_App.cpp:1605 src/slic3r/GUI/GUI_App.cpp:1614
msgid "Language selection"
msgstr "Selezione lingua"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2140
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2242
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2307
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2408
msgid "Last instance of an object cannot be deleted."
msgstr "Non è possibile eliminare l'ultima istanza di un oggetto."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3418
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3881
msgid "Layer"
msgstr "Layer"
-#: src/slic3r/GUI/ConfigManipulation.cpp:49
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1049
+#: src/slic3r/GUI/ConfigManipulation.cpp:48
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1371
#: src/libslic3r/PrintConfig.cpp:71
msgid "Layer height"
msgstr "Altezza layer"
-#: src/libslic3r/Print.cpp:1427
+#: src/libslic3r/Print.cpp:1453
msgid "Layer height can't be greater than nozzle diameter"
msgstr "L'altezza layer non può essere più grande del diametro dell'ugello"
-#: src/slic3r/GUI/Tab.cpp:2362
+#: src/slic3r/GUI/Tab.cpp:2531
msgid "Layer height limits"
msgstr "Limiti altezza layer"
-#: src/slic3r/GUI/ConfigWizard.cpp:2015
-msgid "Layer height:"
-msgstr "Altezza layer:"
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2488
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2880
msgid "Layer range Settings to modify"
msgstr "Impostazioni da modificare in Intervallo Layer"
#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:52
-#: src/libslic3r/PrintConfig.cpp:362 src/libslic3r/PrintConfig.cpp:994
-#: src/libslic3r/PrintConfig.cpp:1505 src/libslic3r/PrintConfig.cpp:1690
-#: src/libslic3r/PrintConfig.cpp:1750 src/libslic3r/PrintConfig.cpp:1930
-#: src/libslic3r/PrintConfig.cpp:1976
+#: src/libslic3r/PrintConfig.cpp:396 src/libslic3r/PrintConfig.cpp:1038
+#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:1798
+#: src/libslic3r/PrintConfig.cpp:1865 src/libslic3r/PrintConfig.cpp:2072
+#: src/libslic3r/PrintConfig.cpp:2118
msgid "layers"
msgstr "layer"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3512
-#: src/slic3r/GUI/Tab.cpp:3600
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3928
+#: src/slic3r/GUI/Tab.cpp:4010
msgid "Layers"
msgstr "Layer"
-#: src/slic3r/GUI/Tab.cpp:1048 src/slic3r/GUI/Tab.cpp:3598
+#: src/slic3r/GUI/Tab.cpp:1370 src/slic3r/GUI/Tab.cpp:4008
msgid "Layers and perimeters"
msgstr "Layer e perimetri"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:95
-#: src/slic3r/GUI/GUI_ObjectList.cpp:613 src/libslic3r/PrintConfig.cpp:72
-#: src/libslic3r/PrintConfig.cpp:175 src/libslic3r/PrintConfig.cpp:184
-#: src/libslic3r/PrintConfig.cpp:408 src/libslic3r/PrintConfig.cpp:470
-#: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:890
-#: src/libslic3r/PrintConfig.cpp:1075 src/libslic3r/PrintConfig.cpp:1374
-#: src/libslic3r/PrintConfig.cpp:1441 src/libslic3r/PrintConfig.cpp:1622
-#: src/libslic3r/PrintConfig.cpp:2074 src/libslic3r/PrintConfig.cpp:2133
-#: src/libslic3r/PrintConfig.cpp:2142
+#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:92
+#: src/slic3r/GUI/GUI_ObjectList.cpp:651 src/libslic3r/PrintConfig.cpp:72
+#: src/libslic3r/PrintConfig.cpp:209 src/libslic3r/PrintConfig.cpp:218
+#: src/libslic3r/PrintConfig.cpp:442 src/libslic3r/PrintConfig.cpp:506
+#: src/libslic3r/PrintConfig.cpp:514 src/libslic3r/PrintConfig.cpp:932
+#: src/libslic3r/PrintConfig.cpp:1119 src/libslic3r/PrintConfig.cpp:1482
+#: src/libslic3r/PrintConfig.cpp:1549 src/libslic3r/PrintConfig.cpp:1730
+#: src/libslic3r/PrintConfig.cpp:2217 src/libslic3r/PrintConfig.cpp:2276
+#: src/libslic3r/PrintConfig.cpp:2285
msgid "Layers and Perimeters"
msgstr "Layer e Perimetri"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
-msgid "Layers Slider"
-msgstr "Barra di scorrimento Layer"
-
-#: src/slic3r/GUI/OptionsGroup.cpp:258
+#: src/slic3r/GUI/OptionsGroup.cpp:293
msgctxt "Layers"
msgid "Bottom"
msgstr "Inferiore"
-#: src/slic3r/GUI/OptionsGroup.cpp:258
+#: src/slic3r/GUI/OptionsGroup.cpp:293
msgctxt "Layers"
msgid "Top"
msgstr "Superiore"
-#: src/slic3r/GUI/MainFrame.cpp:671
+#: src/slic3r/GUI/Preferences.cpp:440
+msgid "Layout Options"
+msgstr "Opzioni di layout"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:48
+msgid "Leaving Paint-on supports"
+msgstr "Chiusura supporti Paint-on"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:47
+msgid "Leaving Seam painting"
+msgstr "Lasciare Pittura Giunzione"
+
+#: src/slic3r/GUI/MainFrame.cpp:968 src/slic3r/GUI/MainFrame.cpp:1288
msgid "Left"
msgstr "Sinistra"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214
msgid "Left click"
msgstr "Click sinistro"
-#: src/slic3r/GUI/GLCanvas3D.cpp:237
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:29
+msgid "Left mouse button"
+msgstr "Tasto sinistro mouse"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:233
msgid "Left mouse button:"
msgstr "Tasto sinistro mouse:"
-#: src/slic3r/GUI/MainFrame.cpp:671
+#: src/slic3r/GUI/MainFrame.cpp:968 src/slic3r/GUI/MainFrame.cpp:1288
msgid "Left View"
msgstr "Vista sinistra"
-#: src/slic3r/GUI/GUI_Preview.cpp:257
-msgid "Legend"
-msgstr "Legenda"
+#: src/slic3r/GUI/GUI_Preview.cpp:1480
+msgid "Legend/Estimated printing time"
+msgstr "Legenda/Stima del tempo di stampa"
-#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1551
+#: src/libslic3r/PrintConfig.cpp:1651 src/libslic3r/PrintConfig.cpp:1659
msgid "Length"
msgstr "Lunghezza"
-#: src/libslic3r/PrintConfig.cpp:328
+#: src/libslic3r/PrintConfig.cpp:362
msgid "Length of the cooling tube to limit space for cooling moves inside it."
msgstr "Lunghezza del tubo di raffreddamento per limitare lo spazio delle mosse di raffreddamento al suo interno."
+#: src/libslic3r/PrintConfig.cpp:1068
+msgid "Length of the infill anchor"
+msgstr "Lunghezza dell'ancoraggio del riempimento"
+
#. TRN "Slic3r _is licensed under the_ License"
-#: src/slic3r/GUI/AboutDialog.cpp:129
+#: src/slic3r/GUI/AboutDialog.cpp:141
msgid "License agreements of all following programs (libraries) are part of application license agreement"
msgstr "Gli accordi di licenza di tutti i programmi seguenti (librerie) fanno parte del contratto di licenza dell'applicazione"
-#: src/libslic3r/PrintConfig.cpp:1561
+#: src/libslic3r/PrintConfig.cpp:1669
msgid "Lift Z"
msgstr "Solleva Z"
-#: src/libslic3r/PrintConfig.cpp:848
+#: src/libslic3r/PrintConfig.cpp:886
msgid "Line"
msgstr "Linea"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1427
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1558
msgid "Load"
msgstr "Carica"
-#: src/slic3r/GUI/MainFrame.cpp:460
+#: src/slic3r/GUI/MainFrame.cpp:1042
msgid "Load a model"
msgstr "Carica modello"
-#: src/libslic3r/PrintConfig.cpp:3505
+#: src/slic3r/GUI/MainFrame.cpp:1046
+msgid "Load an model saved with imperial units"
+msgstr "Carica un modello salvato con unità imperiali"
+
+#: src/slic3r/GUI/MainFrame.cpp:1058
+msgid "Load an SL1 archive"
+msgstr "Carica un archivio SL1"
+
+#: src/libslic3r/PrintConfig.cpp:3710
msgid "Load and store settings at the given directory. This is useful for maintaining different profiles or including configurations from a network storage."
msgstr "Carica e archivia le impostazione in una data cartella. Questo è utile per mantenere diversi profili o aggiungere configurazioni da un archivio di rete."
-#: src/libslic3r/PrintConfig.cpp:3489
+#: src/libslic3r/PrintConfig.cpp:3688
msgid "Load config file"
msgstr "Carica file di configurazione"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:120
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:113
msgid "Load Config from ini/amf/3mf/gcode and merge"
msgstr "Carica Config da ini/amf/3mf/gcode e unisci"
-#: src/slic3r/GUI/MainFrame.cpp:467
+#: src/slic3r/GUI/MainFrame.cpp:1058
msgid "Load configuration from project file"
msgstr "Carica configurazione dal file di progetto"
-#: src/libslic3r/PrintConfig.cpp:3490
+#: src/libslic3r/PrintConfig.cpp:3689
msgid "Load configuration from the specified file. It can be used more than once to load options from multiple files."
msgstr "Carica configurazione dal file specificato. Può essere usato più di una volta per caricare opzioni da vari file."
-#: src/slic3r/GUI/MainFrame.cpp:464
+#: src/slic3r/GUI/MainFrame.cpp:1055
msgid "Load exported configuration file"
msgstr "Carica un file di configurazione esportato"
-#: src/slic3r/GUI/Plater.cpp:1395
+#: src/slic3r/GUI/Plater.cpp:1543 src/slic3r/GUI/Plater.cpp:4976
msgid "Load File"
msgstr "Carica file"
-#: src/slic3r/GUI/Plater.cpp:1399
+#: src/slic3r/GUI/Plater.cpp:1548 src/slic3r/GUI/Plater.cpp:4981
msgid "Load Files"
msgstr "Carica file"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1879
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2038
msgid "Load Part"
msgstr "Carica Parte"
-#: src/slic3r/GUI/MainFrame.cpp:471
+#: src/slic3r/GUI/MainFrame.cpp:1062
msgid "Load presets from a bundle"
msgstr "Carica i preset da un gruppo"
-#: src/slic3r/GUI/Plater.cpp:4575
+#: src/slic3r/GUI/Plater.cpp:4627
msgid "Load Project"
msgstr "Carica Progetto"
-#: src/slic3r/GUI/BedShapeDialog.cpp:102
+#: src/slic3r/GUI/BedShapeDialog.cpp:243
msgid "Load shape from STL..."
msgstr "Carica forma da STL..."
-#: src/slic3r/GUI/BedShapeDialog.cpp:182 src/slic3r/GUI/BedShapeDialog.cpp:261
+#: src/slic3r/GUI/BedShapeDialog.cpp:325 src/slic3r/GUI/BedShapeDialog.cpp:405
msgid "Load..."
msgstr "Caricamento..."
@@ -3974,19 +4816,27 @@ msgstr "Caricamento..."
msgid "loaded"
msgstr "caricato"
-#: src/slic3r/GUI/Plater.cpp:2426
+#: src/slic3r/GUI/Plater.cpp:2388
msgid "Loaded"
msgstr "Caricato"
-#: src/slic3r/GUI/Plater.cpp:2273
+#: src/slic3r/GUI/Plater.cpp:2216
msgid "Loading"
msgstr "Caricamento"
-#: src/slic3r/GUI/GUI_App.cpp:474
+#: src/slic3r/GUI/GUI_App.cpp:797
+msgid "Loading configuration"
+msgstr "Caricamento configurazione"
+
+#: src/slic3r/GUI/Plater.cpp:2226
+msgid "Loading file"
+msgstr "Caricamento file"
+
+#: src/slic3r/GUI/GUI_App.cpp:1125
msgid "Loading of a mode view"
msgstr "Caricamento di una modalità di vista"
-#: src/slic3r/GUI/GUI_App.cpp:466
+#: src/slic3r/GUI/GUI_App.cpp:1120
msgid "Loading of current presets"
msgstr "Caricamento dei preset correnti"
@@ -3995,101 +4845,121 @@ msgstr "Caricamento dei preset correnti"
msgid "Loading repaired model"
msgstr "Caricamento modello riparato"
-#: src/libslic3r/PrintConfig.cpp:607
+#: src/libslic3r/PrintConfig.cpp:643
msgid "Loading speed"
msgstr "Velocità di caricamento"
-#: src/libslic3r/PrintConfig.cpp:615
+#: src/libslic3r/PrintConfig.cpp:651
msgid "Loading speed at the start"
msgstr "Velocità iniziale di caricamento"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:63
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:106
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:69
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:112
msgid "Local coordinates"
msgstr "Coordinate locali"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48
msgid "Lock supports under new islands"
msgstr "Fissa i supporti sotto le nuove isole"
-#: src/slic3r/GUI/Tab.cpp:3252
+#: src/slic3r/GUI/Tab.cpp:3689
msgid "LOCKED LOCK"
msgstr "LUCCHETTO CHIUSO"
-#: src/slic3r/GUI/Tab.cpp:3280
+#: src/slic3r/GUI/Tab.cpp:3717
msgid "LOCKED LOCK icon indicates that the settings are the same as the system (or default) values for the current option group"
msgstr "L'icona LUCCHETTO CHIUSO indica che le impostazioni corrispondono ai valori di sistema (o predefiniti) per il seguente gruppo di opzioni"
-#: src/slic3r/GUI/Tab.cpp:3296
+#: src/slic3r/GUI/Tab.cpp:3733
msgid "LOCKED LOCK icon indicates that the value is the same as the system (or default) value."
msgstr "L'icona LUCCHETTO CHIUSO indica che il valore è uguale a quello di sistema (o predefinito)."
-#: src/libslic3r/PrintConfig.cpp:3508
+#: src/libslic3r/PrintConfig.cpp:3713
msgid "Logging level"
msgstr "Livello di logging"
-#: src/libslic3r/PrintConfig.cpp:1695
+#: src/libslic3r/PrintConfig.cpp:1810
msgid "Loops (minimum)"
msgstr "Giri (minimo)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:206
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
msgid "Lower Layer"
msgstr "Layer Inferiore"
-#: src/slic3r/GUI/Tab.cpp:2188 src/slic3r/GUI/Tab.cpp:2273
-#: src/libslic3r/PrintConfig.cpp:1129 src/libslic3r/PrintConfig.cpp:1146
-#: src/libslic3r/PrintConfig.cpp:1163 src/libslic3r/PrintConfig.cpp:1179
-#: src/libslic3r/PrintConfig.cpp:1189 src/libslic3r/PrintConfig.cpp:1199
-#: src/libslic3r/PrintConfig.cpp:1209
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+msgid "Lower layer"
+msgstr "Layer inferiore"
+
+#: src/slic3r/GUI/Tab.cpp:2346 src/slic3r/GUI/Tab.cpp:2442
+#: src/libslic3r/PrintConfig.cpp:1202 src/libslic3r/PrintConfig.cpp:1237
+#: src/libslic3r/PrintConfig.cpp:1254 src/libslic3r/PrintConfig.cpp:1271
+#: src/libslic3r/PrintConfig.cpp:1287 src/libslic3r/PrintConfig.cpp:1297
+#: src/libslic3r/PrintConfig.cpp:1307 src/libslic3r/PrintConfig.cpp:1317
msgid "Machine limits"
msgstr "Limiti macchina"
-#: src/slic3r/GUI/Plater.cpp:166
+#: src/slic3r/GUI/Tab.cpp:3667
+msgid "Machine limits are not set, therefore the print time estimate may not be accurate."
+msgstr "I limiti della macchina non sono impostati, quindi la stima del tempo di stampa potrebbe non essere accurata."
+
+#: src/slic3r/GUI/Tab.cpp:3660
+msgid "Machine limits will be emitted to G-code and used to estimate print time."
+msgstr "I limiti della macchina verranno emessi in G-code e utilizzati per stimare il tempo di stampa."
+
+#: src/slic3r/GUI/Tab.cpp:3663
+msgid "Machine limits will NOT be emitted to G-code, however they will be used to estimate print time, which may therefore not be accurate as the printer may apply a different set of machine limits."
+msgstr "I limiti della macchina NON saranno emessi nel G-code, tuttavia saranno utilizzati per stimare il tempo di stampa, che potrebbe quindi non essere accurato in quanto la stampante potrebbe applicare un diverso set di limiti della macchina."
+
+#: src/slic3r/GUI/Plater.cpp:172
msgid "Manifold"
msgstr "Manifold"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56
msgid "Manual editing"
msgstr "Modifica manuale"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:180
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:214
msgid "Masked SLA file exported to %1%"
msgstr "File SLA mascherato esportato su %1%"
-#: src/slic3r/GUI/MainFrame.cpp:752
+#: src/slic3r/GUI/MainFrame.cpp:1451
msgid "Mate&rial Settings Tab"
msgstr "Scheda Impostazioni Mate&riale"
-#: src/slic3r/GUI/Tab.cpp:3478 src/slic3r/GUI/Tab.cpp:3480
+#: src/slic3r/GUI/Tab.cpp:3894 src/slic3r/GUI/Tab.cpp:3896
msgid "Material"
msgstr "Materiale"
-#: src/slic3r/GUI/Tab.hpp:416
+#: src/slic3r/GUI/Tab.hpp:486
msgid "Material Settings"
msgstr "Impostazioni Materiali"
-#: src/slic3r/GUI/Plater.cpp:163
+#: src/slic3r/GUI/GLCanvas3D.cpp:4304 src/slic3r/GUI/GLCanvas3D.cpp:4940
+msgid "Material Settings Tab"
+msgstr "Scheda Impostazioni Materiali"
+
+#: src/slic3r/GUI/Plater.cpp:169
msgid "Materials"
msgstr "Materiali"
-#: src/libslic3r/PrintConfig.cpp:1217 src/libslic3r/PrintConfig.cpp:1226
+#: src/libslic3r/PrintConfig.cpp:1325 src/libslic3r/PrintConfig.cpp:1334
msgid "Max"
msgstr "Massimo"
-#: src/libslic3r/PrintConfig.cpp:2734
+#: src/libslic3r/PrintConfig.cpp:2898
msgid "Max bridge length"
msgstr "Lunghezza massima Bridge"
-#: src/libslic3r/PrintConfig.cpp:2658
+#: src/libslic3r/PrintConfig.cpp:2812
msgid "Max bridges on a pillar"
msgstr "Ponteggi massimi su un pilastro"
-#: src/libslic3r/PrintConfig.cpp:2822
+#: src/libslic3r/PrintConfig.cpp:2986
msgid "Max merge distance"
msgstr "Massima distanza di unione"
-#: src/libslic3r/PrintConfig.cpp:2743
+#: src/libslic3r/PrintConfig.cpp:2907
msgid "Max pillar linking distance"
msgstr "Distanza massima collegamento pilastri"
@@ -4097,7 +4967,7 @@ msgstr "Distanza massima collegamento pilastri"
msgid "Max print height"
msgstr "Altezza massima di stampa"
-#: src/libslic3r/PrintConfig.cpp:1237
+#: src/libslic3r/PrintConfig.cpp:1345
msgid "Max print speed"
msgstr "Massima velocità di stampa"
@@ -4105,171 +4975,193 @@ msgstr "Massima velocità di stampa"
msgid "max PrusaSlicer version"
msgstr "versione PrusaSlicer massima"
-#: src/libslic3r/PrintConfig.cpp:1268
+#: src/libslic3r/PrintConfig.cpp:1376
msgid "Max volumetric slope negative"
msgstr "Massima pendenza volumetrica negativa"
-#: src/libslic3r/PrintConfig.cpp:1257
+#: src/libslic3r/PrintConfig.cpp:1365
msgid "Max volumetric slope positive"
msgstr "Massima pendenza volumetrica positiva"
-#: src/libslic3r/PrintConfig.cpp:597 src/libslic3r/PrintConfig.cpp:1247
+#: src/libslic3r/PrintConfig.cpp:633 src/libslic3r/PrintConfig.cpp:1355
msgid "Max volumetric speed"
msgstr "Massima velocità volumetrica"
-#: src/libslic3r/PrintConfig.cpp:2268
+#: src/libslic3r/PrintConfig.cpp:2411
msgid "Maximal bridging distance"
msgstr "Distanza massima bridging"
-#: src/libslic3r/PrintConfig.cpp:2269
+#: src/libslic3r/PrintConfig.cpp:2412
msgid "Maximal distance between supports on sparse infill sections."
msgstr "Distanza massima tra supporti in sezioni a riempimento sparso."
-#: src/libslic3r/PrintConfig.cpp:1145
+#: src/libslic3r/PrintConfig.cpp:1253
msgid "Maximum acceleration E"
msgstr "Accelerazione massima E"
-#: src/libslic3r/PrintConfig.cpp:1151
+#: src/libslic3r/PrintConfig.cpp:1259
msgid "Maximum acceleration of the E axis"
msgstr "Accelerazione massima dell'asse E"
-#: src/libslic3r/PrintConfig.cpp:1148
+#: src/libslic3r/PrintConfig.cpp:1256
msgid "Maximum acceleration of the X axis"
msgstr "Accelerazione massima dell'asse X"
-#: src/libslic3r/PrintConfig.cpp:1149
+#: src/libslic3r/PrintConfig.cpp:1257
msgid "Maximum acceleration of the Y axis"
msgstr "Accelerazione massima dell'asse Y"
-#: src/libslic3r/PrintConfig.cpp:1150
+#: src/libslic3r/PrintConfig.cpp:1258
msgid "Maximum acceleration of the Z axis"
msgstr "Accelerazione massima dell'asse Z"
-#: src/libslic3r/PrintConfig.cpp:1198
+#: src/libslic3r/PrintConfig.cpp:1306
msgid "Maximum acceleration when extruding"
msgstr "Accelerazione massima durante l'estrusione"
-#: src/libslic3r/PrintConfig.cpp:1200
+#: src/libslic3r/PrintConfig.cpp:1308
msgid "Maximum acceleration when extruding (M204 S)"
msgstr "Accelerazione massima durante l'estrusione (M204 S)"
-#: src/libslic3r/PrintConfig.cpp:1208
+#: src/libslic3r/PrintConfig.cpp:1316
msgid "Maximum acceleration when retracting"
msgstr "Accelerazione massima durante la retrazione"
-#: src/libslic3r/PrintConfig.cpp:1210
+#: src/libslic3r/PrintConfig.cpp:1318
msgid "Maximum acceleration when retracting (M204 T)"
msgstr "Accelerazione massima durante la retrazione (M204 T)"
-#: src/libslic3r/PrintConfig.cpp:1142
+#: src/libslic3r/PrintConfig.cpp:1250
msgid "Maximum acceleration X"
msgstr "Accelerazione massima X"
-#: src/libslic3r/PrintConfig.cpp:1143
+#: src/libslic3r/PrintConfig.cpp:1251
msgid "Maximum acceleration Y"
msgstr "Accelerazione massima Y"
-#: src/libslic3r/PrintConfig.cpp:1144
+#: src/libslic3r/PrintConfig.cpp:1252
msgid "Maximum acceleration Z"
msgstr "Accelerazione massima Z"
-#: src/slic3r/GUI/Tab.cpp:2222
+#: src/slic3r/GUI/Tab.cpp:2391
msgid "Maximum accelerations"
msgstr "Accelerazioni massime"
-#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2534
+#: src/libslic3r/PrintConfig.cpp:2676 src/libslic3r/PrintConfig.cpp:2677
msgid "Maximum exposure time"
msgstr "Tempo massimo di esposizione"
-#: src/libslic3r/PrintConfig.cpp:1128
+#: src/libslic3r/PrintConfig.cpp:1236
msgid "Maximum feedrate E"
msgstr "Avanzamento massimo E"
-#: src/libslic3r/PrintConfig.cpp:1134
+#: src/libslic3r/PrintConfig.cpp:1242
msgid "Maximum feedrate of the E axis"
msgstr "Avanzamento massimo dell'asse E"
-#: src/libslic3r/PrintConfig.cpp:1131
+#: src/libslic3r/PrintConfig.cpp:1239
msgid "Maximum feedrate of the X axis"
msgstr "Avanzamento massimo dell'asse X"
-#: src/libslic3r/PrintConfig.cpp:1132
+#: src/libslic3r/PrintConfig.cpp:1240
msgid "Maximum feedrate of the Y axis"
msgstr "Avanzamento massimo dell'asse Y"
-#: src/libslic3r/PrintConfig.cpp:1133
+#: src/libslic3r/PrintConfig.cpp:1241
msgid "Maximum feedrate of the Z axis"
msgstr "Avanzamento massimo dell'asse Z"
-#: src/libslic3r/PrintConfig.cpp:1125
+#: src/libslic3r/PrintConfig.cpp:1233
msgid "Maximum feedrate X"
msgstr "Avanzamento massimo X"
-#: src/libslic3r/PrintConfig.cpp:1126
+#: src/libslic3r/PrintConfig.cpp:1234
msgid "Maximum feedrate Y"
msgstr "Avanzamento massimo Y"
-#: src/libslic3r/PrintConfig.cpp:1127
+#: src/libslic3r/PrintConfig.cpp:1235
msgid "Maximum feedrate Z"
msgstr "Avanzamento massimo Z"
-#: src/slic3r/GUI/Tab.cpp:2217
+#: src/slic3r/GUI/Tab.cpp:2386
msgid "Maximum feedrates"
msgstr "Avanzamenti massimi"
-#: src/libslic3r/PrintConfig.cpp:2556 src/libslic3r/PrintConfig.cpp:2557
+#: src/libslic3r/PrintConfig.cpp:2699 src/libslic3r/PrintConfig.cpp:2700
msgid "Maximum initial exposure time"
msgstr "Tempo massimo di esposizione iniziale"
-#: src/libslic3r/PrintConfig.cpp:1162
+#: src/libslic3r/PrintConfig.cpp:1270
msgid "Maximum jerk E"
msgstr "Jerk massimo E"
-#: src/libslic3r/PrintConfig.cpp:1168
+#: src/libslic3r/PrintConfig.cpp:1276
msgid "Maximum jerk of the E axis"
msgstr "Jerk massimo dell'asse E"
-#: src/libslic3r/PrintConfig.cpp:1165
+#: src/libslic3r/PrintConfig.cpp:1273
msgid "Maximum jerk of the X axis"
msgstr "Jerk massimo dell'asse X"
-#: src/libslic3r/PrintConfig.cpp:1166
+#: src/libslic3r/PrintConfig.cpp:1274
msgid "Maximum jerk of the Y axis"
msgstr "Jerk massimo dell'asse Y"
-#: src/libslic3r/PrintConfig.cpp:1167
+#: src/libslic3r/PrintConfig.cpp:1275
msgid "Maximum jerk of the Z axis"
msgstr "Jerk massimo dell'asse Z"
-#: src/libslic3r/PrintConfig.cpp:1159
+#: src/libslic3r/PrintConfig.cpp:1267
msgid "Maximum jerk X"
msgstr "Jerk massimo X"
-#: src/libslic3r/PrintConfig.cpp:1160
+#: src/libslic3r/PrintConfig.cpp:1268
msgid "Maximum jerk Y"
msgstr "Jerk massimo Y"
-#: src/libslic3r/PrintConfig.cpp:1161
+#: src/libslic3r/PrintConfig.cpp:1269
msgid "Maximum jerk Z"
msgstr "Jerk massimo Z"
-#: src/libslic3r/PrintConfig.cpp:2660
+#: src/libslic3r/PrintConfig.cpp:1095
+msgid "Maximum length of the infill anchor"
+msgstr "Lunghezza massima dell'ancoraggio del riempimento"
+
+#: src/libslic3r/PrintConfig.cpp:2814
msgid "Maximum number of bridges that can be placed on a pillar. Bridges hold support point pinheads and connect to pillars as small branches."
msgstr "Numero massimo di ponteggi che può essere posizionato su un pilastro. I ponteggi mantengono le capocchie dei punti di supporto e si collegano ai pilastri come piccoli rami."
-#: src/libslic3r/PrintConfig.cpp:598
+#: src/libslic3r/PrintConfig.cpp:634
msgid "Maximum volumetric speed allowed for this filament. Limits the maximum volumetric speed of a print to the minimum of print and filament volumetric speed. Set to zero for no limit."
msgstr "Massima velocità volumetrica consentita per questo filamento. Limita la velocità volumetrica massima di una stampa alla velocità volumetrica minima del filamento e di stampa. Imposta a zero per non avere limite."
-#: src/libslic3r/PrintConfig.cpp:3442
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1868
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1876
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2569 src/libslic3r/PrintConfig.cpp:3641
msgid "Merge"
msgstr "Unisci"
-#: src/libslic3r/PrintConfig.cpp:2683
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2660
+msgid "Merge all parts to the one single object"
+msgstr "Unisci tutte le parti in un unico oggetto"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1868
+msgid "Merge objects to the one multipart object"
+msgstr "Unisci oggetti in un unico oggetto multiparte"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1876
+msgid "Merge objects to the one single object"
+msgstr "Unisci oggetti in un singolo oggetto"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2576
+msgid "Merged"
+msgstr "Unito"
+
+#: src/libslic3r/PrintConfig.cpp:2847
msgid "Merging bridges or pillars into another pillars can increase the radius. Zero means no increase, one means full increase."
msgstr "L'unione di bridge o pilastri con altri pilastri può aumentarne il raggio. Zero significa nessun incremento, uno significa incremento pieno."
-#: src/libslic3r/SLAPrintSteps.cpp:64
+#: src/libslic3r/SLAPrintSteps.cpp:65
msgid "Merging slices and calculating statistics"
msgstr "Unendo gli slice e calcolando le statistiche"
@@ -4277,15 +5169,15 @@ msgstr "Unendo gli slice e calcolando le statistiche"
msgid "Mesh repair failed."
msgstr "Riparazione mesh fallita."
-#: src/slic3r/GUI/DoubleSlider.cpp:1635
+#: src/slic3r/GUI/DoubleSlider.cpp:1831
msgid "Message for pause print on current layer (%1% mm)."
msgstr "Messaggio per pausa stampa al corrente layer (%1% mm)."
-#: src/libslic3r/PrintConfig.cpp:1280 src/libslic3r/PrintConfig.cpp:1289
+#: src/libslic3r/PrintConfig.cpp:1388 src/libslic3r/PrintConfig.cpp:1397
msgid "Min"
msgstr "Minimo"
-#: src/libslic3r/PrintConfig.cpp:1298
+#: src/libslic3r/PrintConfig.cpp:1406
msgid "Min print speed"
msgstr "Velocità minima di stampa"
@@ -4293,232 +5185,241 @@ msgstr "Velocità minima di stampa"
msgid "min PrusaSlicer version"
msgstr "versione PrusaSlicer minima"
-#: src/libslic3r/PrintConfig.cpp:2772
+#: src/libslic3r/PrintConfig.cpp:2936
msgid "Minimal distance of the support points"
msgstr "Distanza minima dei punti di supporto"
-#: src/libslic3r/PrintConfig.cpp:1306
+#: src/libslic3r/PrintConfig.cpp:1414
msgid "Minimal filament extrusion length"
msgstr "Lunghezza di estrusione minima del filamento"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53
msgid "Minimal points distance"
msgstr "Distanza minima punti"
-#: src/libslic3r/PrintConfig.cpp:667
+#: src/libslic3r/PrintConfig.cpp:703
msgid "Minimal purge on wipe tower"
msgstr "Spurgo minimo sulla torre di spurgo"
-#: src/libslic3r/PrintConfig.cpp:187
+#: src/libslic3r/PrintConfig.cpp:221
msgid "Minimum bottom shell thickness"
msgstr "Spessore minimo guscio inferiore"
-#: src/slic3r/GUI/PresetHints.cpp:339
+#: src/slic3r/GUI/PresetHints.cpp:337
msgid "Minimum bottom shell thickness is %1% mm."
msgstr "Spessore minimo guscio inferiore è %1% mm."
-#: src/libslic3r/PrintConfig.cpp:1512
+#: src/libslic3r/PrintConfig.cpp:1620
msgid "Minimum detail resolution, used to simplify the input file for speeding up the slicing job and reducing memory usage. High-resolution models often carry more detail than printers can render. Set to zero to disable any simplification and use full resolution from input."
msgstr "Risoluzione minima dettaglio, utilizzato per semplificare il file input accelerando lo slicing e riducendo l'utilizzo di memoria. I file ad alta risoluzione spesso hanno più dettaglio di quanto la stampante possa generare. Impostate a zero per disabilitare la semplificazione e utilizzare la risoluzione completa."
-#: src/libslic3r/PrintConfig.cpp:2525 src/libslic3r/PrintConfig.cpp:2526
+#: src/libslic3r/PrintConfig.cpp:2668 src/libslic3r/PrintConfig.cpp:2669
msgid "Minimum exposure time"
msgstr "Tempo minimo di esposizione"
-#: src/libslic3r/PrintConfig.cpp:1178
+#: src/libslic3r/PrintConfig.cpp:1286
msgid "Minimum feedrate when extruding"
msgstr "Avanzamento minimo durante estrusione"
-#: src/libslic3r/PrintConfig.cpp:1180
+#: src/libslic3r/PrintConfig.cpp:1288
msgid "Minimum feedrate when extruding (M205 S)"
msgstr "Avanzamento minimo durante estrusione (M205 S)"
-#: src/slic3r/GUI/Tab.cpp:2234
+#: src/slic3r/GUI/Tab.cpp:2403
msgid "Minimum feedrates"
msgstr "Avanzamento minimo"
-#: src/libslic3r/PrintConfig.cpp:2548 src/libslic3r/PrintConfig.cpp:2549
+#: src/libslic3r/PrintConfig.cpp:2691 src/libslic3r/PrintConfig.cpp:2692
msgid "Minimum initial exposure time"
msgstr "Tempo minimo di esposizione iniziale"
-#: src/slic3r/GUI/Tab.cpp:1069
+#: src/slic3r/GUI/Tab.cpp:1391
msgid "Minimum shell thickness"
msgstr "Spessore minimo guscio"
-#: src/libslic3r/PrintConfig.cpp:1787 src/libslic3r/PrintConfig.cpp:1788
+#: src/libslic3r/PrintConfig.cpp:1902 src/libslic3r/PrintConfig.cpp:1903
msgid "Minimum thickness of a top / bottom shell"
msgstr "Spessore minimo guscio superiore / inferiore"
-#: src/libslic3r/PrintConfig.cpp:2146
+#: src/libslic3r/PrintConfig.cpp:2289
msgid "Minimum top shell thickness"
msgstr "Spessore minimo guscio superiore"
-#: src/slic3r/GUI/PresetHints.cpp:320
+#: src/slic3r/GUI/PresetHints.cpp:318
msgid "Minimum top shell thickness is %1% mm."
msgstr "Spessore minimo guscio superiore è %1% mm."
-#: src/libslic3r/PrintConfig.cpp:1522
+#: src/libslic3r/PrintConfig.cpp:1630
msgid "Minimum travel after retraction"
msgstr "Spostamento minimo dopo una retrazione"
-#: src/libslic3r/PrintConfig.cpp:1188
+#: src/libslic3r/PrintConfig.cpp:1296
msgid "Minimum travel feedrate"
msgstr "Avanzamento minimo di spostamento"
-#: src/libslic3r/PrintConfig.cpp:1190
+#: src/libslic3r/PrintConfig.cpp:1298
msgid "Minimum travel feedrate (M205 T)"
msgstr "Avanzamento minimo di spostamento (M205 T)"
-#: src/libslic3r/PrintConfig.cpp:2917
+#: src/libslic3r/PrintConfig.cpp:3081
msgid "Minimum wall thickness of a hollowed model."
msgstr "Spessore minimo parete di un modello svuotato."
-#: src/libslic3r/PrintConfig.cpp:2449
+#: src/libslic3r/PrintConfig.cpp:2592
msgid "Minimum width of features to maintain when doing elephant foot compensation."
msgstr "Larghezza minima della funzione da mantenere durante la compensazione della zampa d'elefante."
-#: src/slic3r/GUI/Plater.cpp:4002
+#: src/slic3r/GUI/Plater.cpp:3922
msgid "Mirror"
msgstr "Specchia"
-#: src/libslic3r/PrintConfig.cpp:2379
+#: src/libslic3r/PrintConfig.cpp:2522
msgid "Mirror horizontally"
msgstr "Specchia orizzontalmente"
-#: src/slic3r/GUI/GLCanvas3D.cpp:2053
+#: src/slic3r/GUI/GLCanvas3D.cpp:2226
msgid "Mirror Object"
msgstr "Specchia Oggetto"
-#: src/slic3r/GUI/Plater.cpp:4002
+#: src/slic3r/GUI/Plater.cpp:3922
msgid "Mirror the selected object"
msgstr "Specchia l'oggetto selezionato"
-#: src/slic3r/GUI/Plater.cpp:3995
+#: src/slic3r/GUI/Plater.cpp:3915
msgid "Mirror the selected object along the X axis"
msgstr "Specchia l'oggetto selezionato sull'asse X"
-#: src/slic3r/GUI/Plater.cpp:3997
+#: src/slic3r/GUI/Plater.cpp:3917
msgid "Mirror the selected object along the Y axis"
msgstr "Specchia l'oggetto selezionato sull'asse y"
-#: src/slic3r/GUI/Plater.cpp:3999
+#: src/slic3r/GUI/Plater.cpp:3919
msgid "Mirror the selected object along the Z axis"
msgstr "Specchia l'oggetto selezionato sull'asse Z"
-#: src/libslic3r/PrintConfig.cpp:2386
+#: src/libslic3r/PrintConfig.cpp:2529
msgid "Mirror vertically"
msgstr "Specchia verticalmente"
-#: src/slic3r/Utils/AstroBox.cpp:68 src/slic3r/Utils/OctoPrint.cpp:68
+#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:68
#, possible-c-format
msgid "Mismatched type of print host: %s"
msgstr "Tipo di Host di stampa non corrispondente: %s"
-#: src/libslic3r/ExtrusionEntity.cpp:323
+#: src/libslic3r/ExtrusionEntity.cpp:328 src/libslic3r/ExtrusionEntity.cpp:364
msgid "Mixed"
msgstr "Mischiate"
-#: src/libslic3r/PrintConfig.cpp:2491
+#: src/libslic3r/PrintConfig.cpp:2634
msgid "ml"
msgstr "ml"
-#: src/slic3r/GUI/BedShapeDialog.cpp:92 src/slic3r/GUI/ConfigWizard.cpp:218
-#: src/slic3r/GUI/ConfigWizard.cpp:970 src/slic3r/GUI/ConfigWizard.cpp:984
+#: src/slic3r/GUI/BedShapeDialog.cpp:129 src/slic3r/GUI/ConfigWizard.cpp:236
+#: src/slic3r/GUI/ConfigWizard.cpp:1336 src/slic3r/GUI/ConfigWizard.cpp:1350
#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:87
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:135
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:333
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:94
+#: src/slic3r/GUI/GCodeViewer.cpp:2183 src/slic3r/GUI/GCodeViewer.cpp:2189
+#: src/slic3r/GUI/GCodeViewer.cpp:2197 src/slic3r/GUI/GUI_ObjectLayers.cpp:145
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:96
#: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:75
-#: src/libslic3r/PrintConfig.cpp:82 src/libslic3r/PrintConfig.cpp:91
-#: src/libslic3r/PrintConfig.cpp:122 src/libslic3r/PrintConfig.cpp:188
-#: src/libslic3r/PrintConfig.cpp:246 src/libslic3r/PrintConfig.cpp:321
-#: src/libslic3r/PrintConfig.cpp:329 src/libslic3r/PrintConfig.cpp:379
-#: src/libslic3r/PrintConfig.cpp:505 src/libslic3r/PrintConfig.cpp:516
-#: src/libslic3r/PrintConfig.cpp:534 src/libslic3r/PrintConfig.cpp:712
-#: src/libslic3r/PrintConfig.cpp:1231 src/libslic3r/PrintConfig.cpp:1292
-#: src/libslic3r/PrintConfig.cpp:1310 src/libslic3r/PrintConfig.cpp:1328
-#: src/libslic3r/PrintConfig.cpp:1384 src/libslic3r/PrintConfig.cpp:1394
-#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1524
-#: src/libslic3r/PrintConfig.cpp:1565 src/libslic3r/PrintConfig.cpp:1573
-#: src/libslic3r/PrintConfig.cpp:1583 src/libslic3r/PrintConfig.cpp:1591
-#: src/libslic3r/PrintConfig.cpp:1599 src/libslic3r/PrintConfig.cpp:1682
-#: src/libslic3r/PrintConfig.cpp:1914 src/libslic3r/PrintConfig.cpp:1985
-#: src/libslic3r/PrintConfig.cpp:2019 src/libslic3r/PrintConfig.cpp:2147
-#: src/libslic3r/PrintConfig.cpp:2226 src/libslic3r/PrintConfig.cpp:2233
-#: src/libslic3r/PrintConfig.cpp:2240 src/libslic3r/PrintConfig.cpp:2270
-#: src/libslic3r/PrintConfig.cpp:2280 src/libslic3r/PrintConfig.cpp:2290
-#: src/libslic3r/PrintConfig.cpp:2450 src/libslic3r/PrintConfig.cpp:2484
-#: src/libslic3r/PrintConfig.cpp:2623 src/libslic3r/PrintConfig.cpp:2632
-#: src/libslic3r/PrintConfig.cpp:2641 src/libslic3r/PrintConfig.cpp:2651
-#: src/libslic3r/PrintConfig.cpp:2695 src/libslic3r/PrintConfig.cpp:2705
-#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2737
-#: src/libslic3r/PrintConfig.cpp:2747 src/libslic3r/PrintConfig.cpp:2757
-#: src/libslic3r/PrintConfig.cpp:2775 src/libslic3r/PrintConfig.cpp:2790
-#: src/libslic3r/PrintConfig.cpp:2804 src/libslic3r/PrintConfig.cpp:2815
-#: src/libslic3r/PrintConfig.cpp:2828 src/libslic3r/PrintConfig.cpp:2873
-#: src/libslic3r/PrintConfig.cpp:2883 src/libslic3r/PrintConfig.cpp:2892
-#: src/libslic3r/PrintConfig.cpp:2902 src/libslic3r/PrintConfig.cpp:2918
-#: src/libslic3r/PrintConfig.cpp:2942
+#: src/libslic3r/PrintConfig.cpp:82 src/libslic3r/PrintConfig.cpp:93
+#: src/libslic3r/PrintConfig.cpp:124 src/libslic3r/PrintConfig.cpp:222
+#: src/libslic3r/PrintConfig.cpp:280 src/libslic3r/PrintConfig.cpp:355
+#: src/libslic3r/PrintConfig.cpp:363 src/libslic3r/PrintConfig.cpp:413
+#: src/libslic3r/PrintConfig.cpp:541 src/libslic3r/PrintConfig.cpp:552
+#: src/libslic3r/PrintConfig.cpp:570 src/libslic3r/PrintConfig.cpp:748
+#: src/libslic3r/PrintConfig.cpp:1158 src/libslic3r/PrintConfig.cpp:1339
+#: src/libslic3r/PrintConfig.cpp:1400 src/libslic3r/PrintConfig.cpp:1418
+#: src/libslic3r/PrintConfig.cpp:1436 src/libslic3r/PrintConfig.cpp:1492
+#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1624
+#: src/libslic3r/PrintConfig.cpp:1632 src/libslic3r/PrintConfig.cpp:1673
+#: src/libslic3r/PrintConfig.cpp:1681 src/libslic3r/PrintConfig.cpp:1691
+#: src/libslic3r/PrintConfig.cpp:1699 src/libslic3r/PrintConfig.cpp:1707
+#: src/libslic3r/PrintConfig.cpp:1790 src/libslic3r/PrintConfig.cpp:2056
+#: src/libslic3r/PrintConfig.cpp:2127 src/libslic3r/PrintConfig.cpp:2161
+#: src/libslic3r/PrintConfig.cpp:2290 src/libslic3r/PrintConfig.cpp:2369
+#: src/libslic3r/PrintConfig.cpp:2376 src/libslic3r/PrintConfig.cpp:2383
+#: src/libslic3r/PrintConfig.cpp:2413 src/libslic3r/PrintConfig.cpp:2423
+#: src/libslic3r/PrintConfig.cpp:2433 src/libslic3r/PrintConfig.cpp:2593
+#: src/libslic3r/PrintConfig.cpp:2627 src/libslic3r/PrintConfig.cpp:2766
+#: src/libslic3r/PrintConfig.cpp:2775 src/libslic3r/PrintConfig.cpp:2784
+#: src/libslic3r/PrintConfig.cpp:2794 src/libslic3r/PrintConfig.cpp:2859
+#: src/libslic3r/PrintConfig.cpp:2869 src/libslic3r/PrintConfig.cpp:2881
+#: src/libslic3r/PrintConfig.cpp:2901 src/libslic3r/PrintConfig.cpp:2911
+#: src/libslic3r/PrintConfig.cpp:2921 src/libslic3r/PrintConfig.cpp:2939
+#: src/libslic3r/PrintConfig.cpp:2954 src/libslic3r/PrintConfig.cpp:2968
+#: src/libslic3r/PrintConfig.cpp:2979 src/libslic3r/PrintConfig.cpp:2992
+#: src/libslic3r/PrintConfig.cpp:3037 src/libslic3r/PrintConfig.cpp:3047
+#: src/libslic3r/PrintConfig.cpp:3056 src/libslic3r/PrintConfig.cpp:3066
+#: src/libslic3r/PrintConfig.cpp:3082 src/libslic3r/PrintConfig.cpp:3106
msgid "mm"
msgstr "mm"
-#: src/libslic3r/PrintConfig.cpp:1547 src/libslic3r/PrintConfig.cpp:1556
+#: src/libslic3r/PrintConfig.cpp:1655 src/libslic3r/PrintConfig.cpp:1664
msgid "mm (zero to disable)"
msgstr "mm (imposta a zero per disabilitare)"
-#: src/libslic3r/PrintConfig.cpp:451 src/libslic3r/PrintConfig.cpp:560
-#: src/libslic3r/PrintConfig.cpp:882 src/libslic3r/PrintConfig.cpp:895
-#: src/libslic3r/PrintConfig.cpp:1015 src/libslic3r/PrintConfig.cpp:1041
-#: src/libslic3r/PrintConfig.cpp:1423 src/libslic3r/PrintConfig.cpp:1761
-#: src/libslic3r/PrintConfig.cpp:1883 src/libslic3r/PrintConfig.cpp:1951
-#: src/libslic3r/PrintConfig.cpp:2111
+#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:596
+#: src/libslic3r/PrintConfig.cpp:924 src/libslic3r/PrintConfig.cpp:937
+#: src/libslic3r/PrintConfig.cpp:1059 src/libslic3r/PrintConfig.cpp:1085
+#: src/libslic3r/PrintConfig.cpp:1531 src/libslic3r/PrintConfig.cpp:1876
+#: src/libslic3r/PrintConfig.cpp:2025 src/libslic3r/PrintConfig.cpp:2093
+#: src/libslic3r/PrintConfig.cpp:2254
msgid "mm or %"
msgstr "mm o %"
-#: src/libslic3r/PrintConfig.cpp:237 src/libslic3r/PrintConfig.cpp:609
-#: src/libslic3r/PrintConfig.cpp:617 src/libslic3r/PrintConfig.cpp:626
-#: src/libslic3r/PrintConfig.cpp:634 src/libslic3r/PrintConfig.cpp:661
-#: src/libslic3r/PrintConfig.cpp:680 src/libslic3r/PrintConfig.cpp:922
-#: src/libslic3r/PrintConfig.cpp:1050 src/libslic3r/PrintConfig.cpp:1135
-#: src/libslic3r/PrintConfig.cpp:1169 src/libslic3r/PrintConfig.cpp:1181
-#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:1241
-#: src/libslic3r/PrintConfig.cpp:1300 src/libslic3r/PrintConfig.cpp:1433
-#: src/libslic3r/PrintConfig.cpp:1607 src/libslic3r/PrintConfig.cpp:1616
-#: src/libslic3r/PrintConfig.cpp:2028 src/libslic3r/PrintConfig.cpp:2154
+#: src/libslic3r/PrintConfig.cpp:193
+msgid "mm or % (zero to disable)"
+msgstr "mm o % (zero per disattivare)"
+
+#: src/libslic3r/PrintConfig.cpp:271 src/libslic3r/PrintConfig.cpp:645
+#: src/libslic3r/PrintConfig.cpp:653 src/libslic3r/PrintConfig.cpp:662
+#: src/libslic3r/PrintConfig.cpp:670 src/libslic3r/PrintConfig.cpp:697
+#: src/libslic3r/PrintConfig.cpp:716 src/libslic3r/PrintConfig.cpp:966
+#: src/libslic3r/PrintConfig.cpp:1094 src/libslic3r/PrintConfig.cpp:1167
+#: src/libslic3r/PrintConfig.cpp:1243 src/libslic3r/PrintConfig.cpp:1277
+#: src/libslic3r/PrintConfig.cpp:1289 src/libslic3r/PrintConfig.cpp:1299
+#: src/libslic3r/PrintConfig.cpp:1349 src/libslic3r/PrintConfig.cpp:1408
+#: src/libslic3r/PrintConfig.cpp:1541 src/libslic3r/PrintConfig.cpp:1715
+#: src/libslic3r/PrintConfig.cpp:1724 src/libslic3r/PrintConfig.cpp:2170
+#: src/libslic3r/PrintConfig.cpp:2297
msgid "mm/s"
msgstr "mm/s"
-#: src/libslic3r/PrintConfig.cpp:462 src/libslic3r/PrintConfig.cpp:904
-#: src/libslic3r/PrintConfig.cpp:1720 src/libslic3r/PrintConfig.cpp:1772
-#: src/libslic3r/PrintConfig.cpp:1995 src/libslic3r/PrintConfig.cpp:2124
+#: src/libslic3r/PrintConfig.cpp:498 src/libslic3r/PrintConfig.cpp:946
+#: src/libslic3r/PrintConfig.cpp:1835 src/libslic3r/PrintConfig.cpp:1887
+#: src/libslic3r/PrintConfig.cpp:2137 src/libslic3r/PrintConfig.cpp:2267
msgid "mm/s or %"
msgstr "mm/s o %"
-#: src/libslic3r/PrintConfig.cpp:196 src/libslic3r/PrintConfig.cpp:339
-#: src/libslic3r/PrintConfig.cpp:862 src/libslic3r/PrintConfig.cpp:984
-#: src/libslic3r/PrintConfig.cpp:1152 src/libslic3r/PrintConfig.cpp:1201
-#: src/libslic3r/PrintConfig.cpp:1211 src/libslic3r/PrintConfig.cpp:1403
+#: src/libslic3r/PrintConfig.cpp:230 src/libslic3r/PrintConfig.cpp:373
+#: src/libslic3r/PrintConfig.cpp:902 src/libslic3r/PrintConfig.cpp:1028
+#: src/libslic3r/PrintConfig.cpp:1260 src/libslic3r/PrintConfig.cpp:1309
+#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1511
msgid "mm/s²"
msgstr "mm/s²"
-#: src/libslic3r/PrintConfig.cpp:1730
+#: src/libslic3r/PrintConfig.cpp:1845
msgid "mm²"
msgstr "mm²"
-#: src/libslic3r/PrintConfig.cpp:672
+#: src/libslic3r/PrintConfig.cpp:708
msgid "mm³"
msgstr "mm³"
-#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:601
-#: src/libslic3r/PrintConfig.cpp:1250
+#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:637
+#: src/libslic3r/PrintConfig.cpp:1358
msgid "mm³/s"
msgstr "mm³/s"
-#: src/libslic3r/PrintConfig.cpp:1262 src/libslic3r/PrintConfig.cpp:1273
+#: src/libslic3r/PrintConfig.cpp:1370 src/libslic3r/PrintConfig.cpp:1381
msgid "mm³/s²"
msgstr "mm³/s²"
-#: src/slic3r/GUI/GUI_App.cpp:820
+#: src/slic3r/GUI/GUI_App.cpp:1512
msgid "Mode"
msgstr "&Modalità"
@@ -4526,7 +5427,7 @@ msgstr "&Modalità"
msgid "model"
msgstr "modello"
-#: src/slic3r/GUI/BedShapeDialog.cpp:251
+#: src/slic3r/GUI/BedShapeDialog.cpp:395
msgid "Model"
msgstr "Modello"
@@ -4555,99 +5456,141 @@ msgstr "Riparazione modello terminata"
msgid "Model repaired successfully"
msgstr "Modello riparato con successo"
-#: src/slic3r/GUI/Tab.cpp:979
+#: src/slic3r/GUI/GUI_App.cpp:1506 src/slic3r/GUI/wxExtensions.cpp:675
+msgctxt "Mode"
+msgid "Advanced"
+msgstr "Avanzata"
+
+#: src/slic3r/GUI/Tab.cpp:1241
msgid "Modifications to the current profile will be saved."
msgstr "Verranno salvate le modifiche al profilo attuale."
-#: src/slic3r/GUI/Preset.cpp:247
+#: src/slic3r/GUI/GUI_App.cpp:1425
msgid "modified"
msgstr "modificato"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
msgid "Modifier"
msgstr "Modificatore"
-#: src/slic3r/GUI/Tab.cpp:1161
+#: src/slic3r/GUI/Tab.cpp:1491
msgid "Modifiers"
msgstr "Modificatori"
-#: src/libslic3r/PrintConfig.cpp:2512
+#: src/libslic3r/PrintConfig.cpp:2655
msgid "money/bottle"
msgstr "soldi/bottiglia"
-#: src/libslic3r/PrintConfig.cpp:762
+#: src/libslic3r/PrintConfig.cpp:798
msgid "money/kg"
msgstr "soldi/kg"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372
+#: src/libslic3r/PrintConfig.cpp:461
+msgid "Monotonic"
+msgstr "Monotonico"
+
+#: src/slic3r/GUI/NotificationManager.cpp:305
+#: src/slic3r/GUI/NotificationManager.cpp:315
+msgid "More"
+msgstr "Altro"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219
msgid "Mouse wheel"
msgstr "Rotella del mouse"
-#: src/slic3r/GUI/GLCanvas3D.cpp:261
+#: src/slic3r/GUI/GLCanvas3D.cpp:249
msgid "Mouse wheel:"
msgstr "Rotella del mouse:"
-#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:64
msgid "Move"
msgstr "Sposta"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:255
+msgid "Move active slider thumb Left"
+msgstr "Sposta il cursore di scorrimento attivo sinistro"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:256
+msgid "Move active slider thumb Right"
+msgstr "Sposta cursore di scorrimento attivo destro"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:220
+msgid "Move active thumb Down"
+msgstr "Abbassa cursore attivo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:241
+msgid "Move active thumb Left"
+msgstr "Sposta a sinistra il cursore attivo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:242
+msgid "Move active thumb Right"
+msgstr "Sposta a destra il cursore attivo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+msgid "Move active thumb Up"
+msgstr "Solleva cursore attivo"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219
msgid "Move clipping plane"
-msgstr "Sposta piano di ritaglio"
+msgstr "Sposta piano sezione"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
msgid "Move current slider thumb Down"
msgstr "Abbassa la barra di scorrimento attuale"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:214
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
msgid "Move current slider thumb Up"
msgstr "Solleva la barra di scorrimento attuale"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1059
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:835
msgid "Move drainage hole"
msgstr "Sposta foro di drenaggio"
-#: src/slic3r/GUI/GLCanvas3D.cpp:3505
+#: src/slic3r/GUI/GLCanvas3D.cpp:3810
msgid "Move Object"
msgstr "Sposta oggetto"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212
msgid "Move point"
msgstr "Sposta punto"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:160
msgid "Move selection 10 mm in negative X direction"
msgstr "Sposta selezione 10 mm in direzione X negativa"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:159
msgid "Move selection 10 mm in negative Y direction"
msgstr "Sposta selezione 10 mm in direzione Y negativa"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:161
msgid "Move selection 10 mm in positive X direction"
msgstr "Sposta selezione 10 mm in direzione X positiva"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:158
msgid "Move selection 10 mm in positive Y direction"
msgstr "Sposta selezione 10 mm in direzione Y positiva"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1097
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:955
msgid "Move support point"
msgstr "Sposta punto di supporto"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
+#: src/slic3r/GUI/GCodeViewer.cpp:2492
+msgid "Movement"
+msgstr "Movimento"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
msgid "Movement in camera space"
msgstr "Movimento nello spazio della camera"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:162
msgid "Movement step set to 1 mm"
msgstr "Passo del movimento impostato a 1 mm"
-#: src/libslic3r/PrintConfig.cpp:2201
+#: src/libslic3r/PrintConfig.cpp:2344
msgid "Multi material printers may need to prime or purge extruders on tool changes. Extrude the excess material into the wipe tower."
msgstr "Le stampanti multi-material potrebbero necessitare di caricare o spurgare l'estrusore al cambio di attrezzo. Estrude il materiale in eccesso in una torre di spurgo."
-#: src/slic3r/GUI/Plater.cpp:2360 src/slic3r/GUI/Plater.cpp:2413
+#: src/slic3r/GUI/Plater.cpp:2322 src/slic3r/GUI/Plater.cpp:2375
msgid "Multi-part object detected"
msgstr "Rilevato oggetto in parti multiple"
@@ -4656,44 +5599,49 @@ msgstr "Rilevato oggetto in parti multiple"
msgid "Multiple %s devices found. Please only connect one at a time for flashing."
msgstr "Trovati molteplici %s dispositivi. Per favore connettine uno alla volta per il flashing."
-#: src/slic3r/GUI/Tab.cpp:1179
+#: src/slic3r/GUI/Tab.cpp:1509
msgid "Multiple Extruders"
msgstr "Estrusori multipli"
-#: src/slic3r/GUI/Plater.cpp:2410
+#: src/slic3r/GUI/Plater.cpp:2372
msgid "Multiple objects were loaded for a multi-material printer.\nInstead of considering them as multiple objects, should I consider\nthese files to represent a single object having multiple parts?"
msgstr "Sono stati caricati oggetti multipli per stampante multi-material.\nInvece di considerarli come oggetti multipli, devo considerarli come parte di un singolo oggetto avente parti multiple?"
-#: src/libslic3r/PrintConfig.cpp:3439
+#: src/libslic3r/PrintConfig.cpp:3638
msgid "Multiply copies by creating a grid."
msgstr "Moltiplica le copie creando una griglia."
-#: src/libslic3r/PrintConfig.cpp:3434
+#: src/libslic3r/PrintConfig.cpp:3633
msgid "Multiply copies by this factor."
msgstr "Moltiplica le copie per questo valore."
-#: src/slic3r/GUI/Field.cpp:150 src/slic3r/GUI/OptionsGroup.cpp:580
+#: src/slic3r/GUI/Field.cpp:198 src/slic3r/GUI/OptionsGroup.cpp:715
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:874
msgid "N/A"
msgstr "N/A"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:270
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153
+#: src/slic3r/GUI/GUI_ObjectList.cpp:284
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:161
msgid "Name"
msgstr "Nome"
-#: src/libslic3r/PrintConfig.cpp:1488
+#: src/libslic3r/PrintConfig.cpp:114
+msgid "Name of the printer"
+msgstr "Nome della stampante"
+
+#: src/libslic3r/PrintConfig.cpp:1596
msgid "Name of the printer variant. For example, the printer variants may be differentiated by a nozzle diameter."
msgstr "Nome della variante di stampante. Per esempio le varianti di una stampante potrebbero differire per diametro dell'ugello."
-#: src/libslic3r/PrintConfig.cpp:1482
+#: src/libslic3r/PrintConfig.cpp:1590
msgid "Name of the printer vendor."
msgstr "Nome del venditore della stampante."
-#: src/libslic3r/PrintConfig.cpp:1058
+#: src/libslic3r/PrintConfig.cpp:1102
msgid "Name of the profile, from which this profile inherits."
msgstr "Nome del profilo da cui questo profilo eredita."
-#: src/libslic3r/PrintConfig.cpp:1630
+#: src/libslic3r/PrintConfig.cpp:1738
msgid "Nearest"
msgstr "Più vicino"
@@ -4701,14 +5649,30 @@ msgstr "Più vicino"
msgid "Network lookup"
msgstr "Ricerca network"
-#: src/slic3r/GUI/Plater.cpp:2151
+#: src/slic3r/GUI/Preferences.cpp:430
+msgid "New layout, access via settings button in the top menu"
+msgstr "Nuovo layout, accesso tramite pulsante impostazioni dal menù superiore"
+
+#: src/slic3r/GUI/Plater.cpp:2056
msgid "New Project"
msgstr "Nuovo progetto"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:112
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:105
msgid "New project, clear plater"
msgstr "Nuovo progetto, pulisci piano"
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:609
+msgid "New Value"
+msgstr "Nuovo valore"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1178
+msgid "New value"
+msgstr "Nuovo valore"
+
+#: src/slic3r/GUI/NotificationManager.hpp:322
+msgid "New version is available."
+msgstr "È disponibile una nuova versione."
+
#: src/slic3r/GUI/UpdateDialogs.cpp:38
#, possible-c-format
msgid "New version of %s is available"
@@ -4718,23 +5682,23 @@ msgstr "È disponibile una nuova versione di %s"
msgid "New version:"
msgstr "Nuova versione:"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4673
+#: src/slic3r/GUI/GLCanvas3D.cpp:5089
msgid "Next Redo action: %1%"
msgstr "Ripeti Prossima azione: %1%"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4641
+#: src/slic3r/GUI/GLCanvas3D.cpp:5051
msgid "Next Undo action: %1%"
msgstr "Annulla Prossima azione: %1%"
-#: src/libslic3r/PrintConfig.cpp:960
+#: src/libslic3r/PrintConfig.cpp:1004
msgid "No extrusion"
msgstr "No estrusione"
-#: src/libslic3r/SLAPrintSteps.cpp:453
+#: src/libslic3r/SLAPrintSteps.cpp:451
msgid "No pad can be generated for this model with the current configuration"
msgstr "Non può essere generato nessun Pad per questo modello con la configurazione corrente"
-#: src/slic3r/GUI/MainFrame.cpp:784
+#: src/slic3r/GUI/MainFrame.cpp:1485
msgid "No previously sliced file."
msgstr "File non processato precedentemente."
@@ -4742,175 +5706,215 @@ msgstr "File non processato precedentemente."
msgid "NO RAMMING AT ALL"
msgstr "NESSUN RAMMING"
-#: src/libslic3r/PrintConfig.cpp:1857
+#: src/libslic3r/PrintConfig.cpp:1999
msgid "No sparse layers (EXPERIMENTAL)"
msgstr "Nessun layer sparso (SPERIMENTALE)"
-#: src/libslic3r/PrintConfig.cpp:2774
+#: src/libslic3r/PrintConfig.cpp:2938
msgid "No support points will be placed closer than this threshold."
msgstr "Non verranno posizionati punti di supporto più vicini di questa soglia."
-#: src/slic3r/GUI/UpdateDialogs.cpp:303
+#: src/slic3r/GUI/UpdateDialogs.cpp:304
msgid "No updates available"
msgstr "Nessun aggiornamento disponibile"
-#: src/slic3r/GUI/ConfigWizard.cpp:291 src/slic3r/GUI/ConfigWizard.cpp:574
-#: src/slic3r/GUI/Plater.cpp:499 src/slic3r/GUI/Plater.cpp:639
-#: src/libslic3r/ExtrusionEntity.cpp:309
+#: src/slic3r/GUI/ConfigWizard.cpp:309 src/slic3r/GUI/ConfigWizard.cpp:599
+#: src/slic3r/GUI/Plater.cpp:365 src/slic3r/GUI/Plater.cpp:505
+#: src/libslic3r/ExtrusionEntity.cpp:312
msgid "None"
msgstr "Nessuno"
-#: src/slic3r/GUI/Tab.cpp:2203
+#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2372
msgid "Normal"
msgstr "Normale"
-#: src/slic3r/GUI/Plater.cpp:1286
+#: src/slic3r/GUI/Plater.cpp:1177 src/slic3r/GUI/Plater.cpp:1224
msgid "normal mode"
msgstr "modalità normale"
-#: src/libslic3r/Zipper.cpp:46
+#: src/slic3r/GUI/GCodeViewer.cpp:2552
+msgid "Normal mode"
+msgstr "Modalità normale"
+
+#: src/libslic3r/miniz_extension.cpp:105
msgid "not a ZIP archive"
msgstr "non un archivio ZIP"
-#: src/slic3r/GUI/BedShapeDialog.cpp:223 src/slic3r/GUI/BedShapeDialog.cpp:302
+#: src/slic3r/GUI/BedShapeDialog.cpp:366 src/slic3r/GUI/BedShapeDialog.cpp:446
msgid "Not found:"
msgstr "Non trovato:"
-#: src/slic3r/GUI/DoubleSlider.cpp:1019
+#: src/slic3r/GUI/DoubleSlider.cpp:1144
msgid "Note"
msgstr "Nota"
-#: src/slic3r/Utils/AstroBox.cpp:89
+#: src/slic3r/GUI/Tab.cpp:3408
+msgid "Note, that selected preset will be deleted from this/those printer(s) too."
+msgstr "Nota: il preset selezionato verrà eliminato anche da questa/e stampante/i."
+
+#: src/slic3r/GUI/Tab.cpp:3416
+msgid "Note, that this/those printer(s) will be deleted after deleting of the selected preset."
+msgstr "Nota: questa/e stampante/i saranno cancellate dopo aver cancellato il preset selezionato."
+
+#: src/slic3r/GUI/Tab.cpp:2039
+msgid "Note: All parameters from this group are moved to the Physical Printer settings (see changelog).\n\nA new Physical Printer profile is created by clicking on the \"cog\" icon right of the Printer profiles combo box, by selecting the \"Add physical printer\" item in the Printer combo box. The Physical Printer profile editor opens also when clicking on the \"cog\" icon in the Printer settings tab. The Physical Printer profiles are being stored into PrusaSlicer/physical_printer directory."
+msgstr "Nota: Tutti i parametri di questo gruppo vengono spostati nelle impostazioni della stampante fisica (vedi changelog).\n\nUn nuovo profilo di stampante fisica viene creato cliccando sull'icona \"ingranaggio\" a destra della casella combinata dei profili della stampante, selezionando la voce \"Aggiungi stampante fisica\" nella casella combinata della stampante. L'editor dei profili della stampante fisica si apre anche cliccando sull'icona \"ingranaggio\" nella scheda Impostazioni della stampante. I profili della stampante fisica vengono memorizzati nella directory PrusaSlicer/physical_printer."
+
+#: src/slic3r/Utils/AstroBox.cpp:92
msgid "Note: AstroBox version at least 1.1.0 is required."
msgstr "Nota: è richiesta una versione di AstroBox 1.1.0 o successiva."
-#: src/slic3r/Utils/FlashAir.cpp:73
+#: src/slic3r/Utils/FlashAir.cpp:76
msgid "Note: FlashAir with firmware 2.00.02 or newer and activated upload function is required."
msgstr "Nota: è necessaria FlashAir con firmware 2.00.02 o successivo e funzione di caricamento attiva."
-#: src/slic3r/Utils/OctoPrint.cpp:89
+#: src/slic3r/Utils/OctoPrint.cpp:91
msgid "Note: OctoPrint version at least 1.1.0 is required."
msgstr "Nota: è richiesta una versione di OctoPrint 1.1.0 o successiva."
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1345
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1192
msgid "Note: some shortcuts work in (non)editing mode only."
msgstr "Nota: alcune scorciatoie funzionano solo in modalità (non)modifica."
-#: src/slic3r/GUI/Tab.cpp:1251 src/slic3r/GUI/Tab.cpp:1252
-#: src/slic3r/GUI/Tab.cpp:1540 src/slic3r/GUI/Tab.cpp:1541
-#: src/slic3r/GUI/Tab.cpp:2012 src/slic3r/GUI/Tab.cpp:2013
-#: src/slic3r/GUI/Tab.cpp:2128 src/slic3r/GUI/Tab.cpp:2129
-#: src/slic3r/GUI/Tab.cpp:3535 src/slic3r/GUI/Tab.cpp:3536
+#: src/slic3r/GUI/SavePresetDialog.cpp:151
+msgid "Note: This preset will be replaced after saving"
+msgstr "Nota: Questo preset sarà sostituito dopo il salvataggio"
+
+#: src/slic3r/GUI/Tab.cpp:1581 src/slic3r/GUI/Tab.cpp:1582
+#: src/slic3r/GUI/Tab.cpp:1887 src/slic3r/GUI/Tab.cpp:1888
+#: src/slic3r/GUI/Tab.cpp:2221 src/slic3r/GUI/Tab.cpp:2222
+#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/Tab.cpp:2298
+#: src/slic3r/GUI/Tab.cpp:3951 src/slic3r/GUI/Tab.cpp:3952
msgid "Notes"
msgstr "Note"
-#: src/slic3r/GUI/ConfigWizard.cpp:1751 src/slic3r/GUI/DoubleSlider.cpp:1905
-#: src/slic3r/GUI/DoubleSlider.cpp:1926 src/slic3r/GUI/GUI.cpp:245
+#: src/slic3r/GUI/ConfigWizard.cpp:2237 src/slic3r/GUI/DoubleSlider.cpp:2124
+#: src/slic3r/GUI/DoubleSlider.cpp:2144 src/slic3r/GUI/GUI.cpp:244
msgid "Notice"
msgstr "Avvertenza"
-#: src/slic3r/GUI/ConfigWizard.cpp:218
+#: src/slic3r/GUI/ConfigWizard.cpp:236
msgid "nozzle"
msgstr "ugello"
-#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2340
-#: src/libslic3r/PrintConfig.cpp:1326
+#: src/slic3r/GUI/Tab.cpp:1790
+msgid "Nozzle"
+msgstr "Ugello"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1392
+msgid "Nozzle and Bed Temperatures"
+msgstr "Temperatura ugello e piano"
+
+#: src/slic3r/GUI/Tab.cpp:2104 src/slic3r/GUI/Tab.cpp:2509
+#: src/libslic3r/PrintConfig.cpp:1434
msgid "Nozzle diameter"
msgstr "Diametro ugello"
-#: src/slic3r/GUI/ConfigWizard.cpp:969
+#: src/slic3r/GUI/ConfigWizard.cpp:1335
msgid "Nozzle Diameter:"
msgstr "Diametro ugello:"
-#: src/libslic3r/PrintConfig.cpp:650
+#: src/libslic3r/PrintConfig.cpp:2201
+msgid "Nozzle temperature"
+msgstr "Temperatura ugello"
+
+#: src/libslic3r/PrintConfig.cpp:2198
+msgid "Nozzle temperature for layers after the first one. Set this to zero to disable temperature control commands in the output G-code."
+msgstr "Temperatura dell'ugello per i layer dopo il primo. Impostarlo a zero per disabilitare i comandi di controllo della temperatura nel G-code di uscita."
+
+#: src/libslic3r/PrintConfig.cpp:961
+msgid "Nozzle temperature for the first layer. If you want to control temperature manually during print, set this to zero to disable temperature control commands in the output G-code."
+msgstr "Temperatura dell'ugello per il primo strato. Se si desidera controllare la temperatura manualmente durante la stampa, impostarla a zero per disabilitare i comandi di controllo della temperatura nel G-code di uscita."
+
+#: src/libslic3r/PrintConfig.cpp:686
msgid "Number of cooling moves"
msgstr "Numero di movimenti di raffreddamento"
-#: src/slic3r/GUI/Tab.cpp:1839
+#: src/slic3r/GUI/Tab.cpp:2073
msgid "Number of extruders of the printer."
msgstr "Numero estrusori della stampante."
-#: src/libslic3r/PrintConfig.cpp:1975
+#: src/libslic3r/PrintConfig.cpp:2117
msgid "Number of interface layers to insert between the object(s) and support material."
msgstr "Numero di layer interfaccia da inserire tra l'oggetto(i) e il materiale di supporto."
-#: src/libslic3r/PrintConfig.cpp:1697
+#: src/libslic3r/PrintConfig.cpp:1812
msgid "Number of loops for the skirt. If the Minimum Extrusion Length option is set, the number of loops might be greater than the one configured here. Set this to zero to disable skirt completely."
msgstr "Numero di giri per lo skirt. Se è impostata l'opzione per la lunghezza minima di estrusione, il numero dei giri potrebbe essere più grande di quello configurato qui. Imposta questo valore a zero per disattivare completamente lo skirt."
-#: src/libslic3r/PrintConfig.cpp:2365
+#: src/libslic3r/PrintConfig.cpp:2508
msgid "Number of pixels in"
msgstr "Numero di pixel su"
-#: src/libslic3r/PrintConfig.cpp:2367
+#: src/libslic3r/PrintConfig.cpp:2510
msgid "Number of pixels in X"
msgstr "Numero di pixel su X"
-#: src/libslic3r/PrintConfig.cpp:2373
+#: src/libslic3r/PrintConfig.cpp:2516
msgid "Number of pixels in Y"
msgstr "Numero di pixel su Y"
-#: src/libslic3r/PrintConfig.cpp:176
+#: src/libslic3r/PrintConfig.cpp:210
msgid "Number of solid layers to generate on bottom surfaces."
msgstr "Numero di layer solidi da generare sulle superfici inferiori."
-#: src/libslic3r/PrintConfig.cpp:1781
+#: src/libslic3r/PrintConfig.cpp:1896
msgid "Number of solid layers to generate on top and bottom surfaces."
msgstr "Numero di layer solidi da generare sulle superfici superiori e inferiori."
-#: src/libslic3r/PrintConfig.cpp:2134
+#: src/libslic3r/PrintConfig.cpp:2277
msgid "Number of solid layers to generate on top surfaces."
msgstr "Numero di layer solidi da generare sulle superfici superiori."
-#: src/libslic3r/PrintConfig.cpp:2518
+#: src/libslic3r/PrintConfig.cpp:2661
msgid "Number of the layers needed for the exposure time fade from initial exposure time to the exposure time"
msgstr "Numero di layer necessari per la sfumatura del tempo di esposizione dal tempo di esposizione iniziale al tempo di esposizione"
-#: src/slic3r/GUI/Plater.cpp:241
+#: src/slic3r/GUI/Plater.cpp:247
msgid "Number of tool changes"
msgstr "Numero di cambi attrezzo"
-#: src/libslic3r/PrintConfig.cpp:2753
+#: src/slic3r/GUI/Tab.cpp:4127 src/libslic3r/PrintConfig.cpp:2917
msgid "Object elevation"
msgstr "Elevazione oggetto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2466
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2858
msgid "Object manipulation"
msgstr "Manipolazione oggetto"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:638
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:163 src/libslic3r/GCode.cpp:623
msgid "Object name"
msgstr "Nome oggetto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3417
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3880
msgid "Object or Instance"
msgstr "Oggetto o Istanza"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1106
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1230
msgid "Object reordered"
msgstr "Oggetto riordinato"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2479
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2871
msgid "Object Settings to modify"
msgstr "Impostazioni Oggetto da modificare"
-#: src/slic3r/GUI/Plater.cpp:2529
+#: src/slic3r/GUI/Plater.cpp:2491
msgid "Object too large?"
msgstr "Oggetto troppo grande?"
-#: src/libslic3r/PrintConfig.cpp:2262
+#: src/libslic3r/PrintConfig.cpp:2405
msgid "Object will be used to purge the nozzle after a toolchange to save material that would otherwise end up in the wipe tower and decrease print time. Colours of the objects will be mixed as a result."
msgstr "L'oggetto sarà utilizzato per spurgare l'ugello dopo un cambio di attrezzo per ridurre il tempo di stampa e risparmiare materiale che finirebbe altrimenti nella torre di spurgo. Come risultato, i colori dell'oggetto saranno mischiati."
-#: src/slic3r/GUI/Plater.cpp:1194
+#: src/slic3r/GUI/Plater.cpp:1103
msgid "object(s)"
msgstr "oggetto(i)"
-#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245
+#: src/slic3r/GUI/Plater.cpp:1143 src/slic3r/GUI/Plater.cpp:1160
msgid "objects"
msgstr "oggetti"
-#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:855
+#: src/libslic3r/PrintConfig.cpp:465 src/libslic3r/PrintConfig.cpp:893
msgid "Octagram Spiral"
msgstr "Spirale a Ottagramma"
@@ -4918,64 +5922,113 @@ msgstr "Spirale a Ottagramma"
msgid "OctoPrint version"
msgstr "Versione OctoPrint"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3425
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3888
msgid "of a current Object"
msgstr "di un Oggetto corrente"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42
msgid "Offset"
msgstr "Offset"
-#: src/slic3r/GUI/Tab.cpp:1755
+#: src/slic3r/GUI/Preferences.cpp:422
+msgid "Old regular layout with the tab bar"
+msgstr "Precedente layout normale con la barra delle schede"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:608
+msgid "Old Value"
+msgstr "Valore precedente"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1177
+msgid "Old value"
+msgstr "Vecchio valore"
+
+#: src/slic3r/GUI/Preferences.cpp:123
+msgid "On OSX there is always only one instance of app running by default. However it is allowed to run multiple instances of same app from the command line. In such case this settings will allow only one instance."
+msgstr "Su OSX per impostazione predefinita c'è sempre una sola istanza di applicazione in esecuzione. Tuttavia è possibile eseguire più istanze della stessa app dalla riga di comando. In tal caso questa impostazione consentirà una sola istanza."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:359
#, possible-c-format
msgid "On this system, %s uses HTTPS certificates from the system Certificate Store or Keychain."
msgstr "Su questo sistema, %s utilizza certificati HTTPS provenienti dal sistema Certificate Store o da Keychain."
-#: src/slic3r/GUI/DoubleSlider.cpp:950
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
+msgid "On/Off one layer mode of the vertical slider"
+msgstr "On/Off modalità un layer del cursore di scorrimento verticale"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1064
msgid "One layer mode"
msgstr "Modalità Un Layer"
-#: src/libslic3r/Print.cpp:1365
+#: src/libslic3r/Print.cpp:1391
msgid "One or more object were assigned an extruder that the printer does not have."
msgstr "Uno o più oggetti sono assegnati ad un estrusore non presente sulla stampante."
-#: src/libslic3r/PrintConfig.cpp:1903 src/libslic3r/PrintConfig.cpp:2676
+#: src/slic3r/GUI/GUI_App.cpp:1784
+msgid "Ongoing uploads"
+msgstr "Caricamenti in corso"
+
+#: src/libslic3r/Print.cpp:1269
+msgid "Only a single object may be printed at a time in Spiral Vase mode. Either remove all but the last object, or enable sequential mode by \"complete_objects\"."
+msgstr "In modalità Vaso a spirale è possibile stampare un solo oggetto alla volta. Rimuovere tutti gli oggetti tranne l'ultimo, oppure abilitare la modalità sequenziale con \"complete_objects\"."
+
+#: src/libslic3r/PrintConfig.cpp:2045 src/libslic3r/PrintConfig.cpp:2840
msgid "Only create support if it lies on a build plate. Don't create support on a print."
msgstr "Genera supporti solo se questi poggiano sulla superficie di stampa. Non genera supporti sulla stampa."
-#: src/libslic3r/PrintConfig.cpp:1027
+#: src/libslic3r/PrintConfig.cpp:1071
msgid "Only infill where needed"
msgstr "Riempimento solo quando necessario"
-#: src/slic3r/GUI/Tab.cpp:2373
+#: src/slic3r/GUI/Tab.cpp:2542
msgid "Only lift Z"
msgstr "Solleva Z solamente"
-#: src/libslic3r/PrintConfig.cpp:1570
+#: src/libslic3r/PrintConfig.cpp:1678
msgid "Only lift Z above"
msgstr "Solleva Z solo al di sopra"
-#: src/libslic3r/PrintConfig.cpp:1579
+#: src/libslic3r/PrintConfig.cpp:1687
msgid "Only lift Z below"
msgstr "Solleva Z solo al di sotto"
-#: src/libslic3r/PrintConfig.cpp:1348
+#: src/libslic3r/PrintConfig.cpp:1456
msgid "Only retract when crossing perimeters"
msgstr "Retrai solo se si attraversa un perimetro"
-#: src/slic3r/GUI/Tab.cpp:1187
+#: src/slic3r/GUI/ConfigWizard.cpp:714
+msgid "Only the following installed printers are compatible with the selected filament:"
+msgstr "Il filamento selezionato è compatibile solo con le seguenti stampanti installate:"
+
+#: src/slic3r/GUI/Tab.cpp:1517
msgid "Ooze prevention"
msgstr "Prevenzione delle fuoriuscite"
-#: src/libslic3r/Print.cpp:1266
+#: src/libslic3r/Print.cpp:1292
msgid "Ooze prevention is currently not supported with the wipe tower enabled."
msgstr "Prevenzione sgocciolamento non è al momento supportata con la torre di spurgo attiva."
-#: src/slic3r/GUI/MainFrame.cpp:408
+#: src/slic3r/GUI/MainFrame.cpp:1398
+msgid "Open &PrusaSlicer"
+msgstr "Apri &PrusaSlicer"
+
+#: src/slic3r/GUI/MainFrame.cpp:1391
+msgid "Open a G-code file"
+msgstr "Apri un file G-code"
+
+#: src/slic3r/GUI/MainFrame.cpp:63 src/slic3r/GUI/MainFrame.cpp:77
+#: src/slic3r/GUI/MainFrame.cpp:1262
+msgid "Open a new PrusaSlicer instance"
+msgstr "Apri una nuova istanza PrusaSlicer"
+
+#: src/slic3r/GUI/MainFrame.cpp:989
msgid "Open a project file"
msgstr "Apri un file progetto"
-#: src/slic3r/GUI/Tab.cpp:1729
+#: src/slic3r/GUI/Plater.cpp:1417
+msgid "Open as project"
+msgstr "Apri come progetto"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:330
msgid "Open CA certificate file"
msgstr "Apri file di certificato CA"
@@ -4988,116 +6041,150 @@ msgstr "Apri la pagina del registro delle modifiche"
msgid "Open download page"
msgstr "Apri la pagina di Download"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:113
+#: src/slic3r/GUI/NotificationManager.cpp:742
+msgid "Open Folder."
+msgstr "Apri Cartella."
+
+#: src/slic3r/Utils/Process.cpp:151
+msgid "Open G-code file:"
+msgstr "Apri un file G-code:"
+
+#: src/slic3r/GUI/MainFrame.cpp:66 src/slic3r/GUI/MainFrame.cpp:1141
+msgid "Open G-code viewer"
+msgstr "Apri visualizzatore G-code"
+
+#: src/slic3r/GUI/MainFrame.cpp:79
+msgid "Open new G-code viewer"
+msgstr "Apri nuovo visualizzatore G-code"
+
+#: src/slic3r/GUI/MainFrame.cpp:63 src/slic3r/GUI/MainFrame.cpp:1262
+msgid "Open new instance"
+msgstr "Apri una nuova istanza"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:106
msgid "Open project STL/OBJ/AMF/3MF with config, clear plater"
msgstr "Apri progetto STL/OBJ/AMF/3MF con configurazione, pulisci piano"
-#: src/slic3r/GUI/MainFrame.cpp:693
+#: src/slic3r/GUI/MainFrame.cpp:77 src/slic3r/GUI/MainFrame.cpp:1398
+msgid "Open PrusaSlicer"
+msgstr "Apri PrusaSlicer"
+
+#: src/slic3r/GUI/MainFrame.cpp:918 src/slic3r/GUI/MainFrame.cpp:1317
#, possible-c-format
msgid "Open the %s website in your browser"
msgstr "Apri il sito web di %s nel browser"
-#: src/slic3r/GUI/MainFrame.cpp:684
+#: src/slic3r/GUI/MainFrame.cpp:909 src/slic3r/GUI/MainFrame.cpp:1308
msgid "Open the Prusa3D drivers download page in your browser"
msgstr "Apri la pagina di download dei driver Prusa3D sul browser"
-#: src/slic3r/GUI/MainFrame.cpp:686
+#: src/slic3r/GUI/MainFrame.cpp:911 src/slic3r/GUI/MainFrame.cpp:1310
msgid "Open the software releases page in your browser"
msgstr "Apri la pagina delle versioni software sul browser"
-#: src/slic3r/GUI/Plater.cpp:4040
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:220 src/slic3r/GUI/Plater.cpp:3961
msgid "Optimize orientation"
msgstr "Ottimizza orientamento"
-#: src/slic3r/GUI/Plater.cpp:2767
+#: src/slic3r/GUI/Plater.cpp:1555
msgid "Optimize Rotation"
msgstr "Ottimizza Rotazione"
-#: src/slic3r/GUI/Plater.cpp:4040
+#: src/slic3r/GUI/Plater.cpp:3962
msgid "Optimize the rotation of the object for better print results."
msgstr "Ottimizza la rotazione dell'oggetto per risultati di stampa migliori."
-#: src/libslic3r/PrintConfig.cpp:137
+#: src/libslic3r/PrintConfig.cpp:170
msgid "Optimize travel moves in order to minimize the crossing of perimeters. This is mostly useful with Bowden extruders which suffer from oozing. This feature slows down both the print and the G-code generation."
msgstr "Ottimizza il movimenti di spostamento per minimizzare l'incrocio di perimetri. È comunemente usato con estrusori Bowden che soffrono di oozing (trasudazione). Questa caratteristica rallenta sia la stampa che la generazione del G-code."
-#: src/slic3r/GUI/Tab.cpp:1131
+#: src/slic3r/GUI/GCodeViewer.cpp:2525 src/slic3r/GUI/GUI_Preview.cpp:320
+#: src/slic3r/GUI/GUI_Preview.cpp:333
+msgid "Options"
+msgstr "Opzioni"
+
+#: src/slic3r/GUI/Tab.cpp:1460
msgid "Options for support material and raft"
msgstr "Opzioni per materiale di supporto e raft"
-#: src/slic3r/GUI/DoubleSlider.cpp:989
+#: src/slic3r/GUI/Mouse3DController.cpp:315
+msgid "Options:"
+msgstr "Opzioni:"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1112
msgid "or press \"+\" key"
msgstr "o premi il tasto \"+\""
-#: src/slic3r/GUI/Plater.cpp:2892
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:74
msgid "Orientation found."
msgstr "Trovato orientamento."
-#: src/slic3r/GUI/Plater.cpp:2891
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:73
msgid "Orientation search canceled."
msgstr "Ricerca orientamento annullata."
-#: src/slic3r/GUI/BedShapeDialog.cpp:84
+#: src/slic3r/GUI/BedShapeDialog.cpp:94
msgid "Origin"
msgstr "Origine"
-#: src/slic3r/GUI/Tab.cpp:1227
+#: src/slic3r/GUI/Tab.cpp:1557
msgid "Other"
msgstr "Altro"
-#: src/libslic3r/PrintConfig.cpp:144 src/libslic3r/PrintConfig.cpp:2064
+#: src/libslic3r/PrintConfig.cpp:177 src/libslic3r/PrintConfig.cpp:2206
msgid "Other layers"
msgstr "Altri layer"
-#: src/slic3r/GUI/ConfigWizard.cpp:856
+#: src/slic3r/GUI/ConfigWizard.cpp:1222
msgid "Other Vendors"
msgstr "Altri Fornitori"
-#: src/slic3r/GUI/Tab.cpp:1238 src/slic3r/GUI/Tab.cpp:3666
+#: src/slic3r/GUI/Tab.cpp:1568 src/slic3r/GUI/Tab.cpp:4085
msgid "Output file"
msgstr "File di output"
-#: src/libslic3r/PrintConfig.cpp:3493
+#: src/libslic3r/PrintConfig.cpp:3692
msgid "Output File"
msgstr "File di output"
-#: src/libslic3r/PrintConfig.cpp:1363
+#: src/libslic3r/PrintConfig.cpp:1471
msgid "Output filename format"
msgstr "Formato del file di output"
-#: src/libslic3r/PrintConfig.cpp:3381
+#: src/libslic3r/PrintConfig.cpp:3580
msgid "Output Model Info"
msgstr "Info Modello di output"
-#: src/slic3r/GUI/Tab.cpp:1230 src/slic3r/GUI/Tab.cpp:3665
+#: src/slic3r/GUI/Tab.cpp:1560 src/slic3r/GUI/Tab.cpp:4084
msgid "Output options"
msgstr "Opzioni output"
-#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:312
+#: src/slic3r/GUI/GUI_Preview.cpp:303 src/libslic3r/ExtrusionEntity.cpp:316
+#: src/libslic3r/ExtrusionEntity.cpp:340
msgid "Overhang perimeter"
msgstr "Perimetro sporgente"
-#: src/libslic3r/PrintConfig.cpp:2042
+#: src/libslic3r/PrintConfig.cpp:2184
msgid "Overhang threshold"
msgstr "Soglia sporgenza"
-#: src/slic3r/GUI/Tab.cpp:1215
+#: src/slic3r/GUI/Tab.cpp:1545
msgid "Overlap"
msgstr "Sovrapposizione"
-#: src/slic3r/GUI/MainFrame.cpp:614
+#: src/slic3r/GUI/MainFrame.cpp:1221
msgid "P&rint Settings Tab"
msgstr "Impos&tazioni Stampa"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:107 src/slic3r/GUI/GUI_ObjectList.cpp:625
-#: src/slic3r/GUI/Plater.cpp:635 src/slic3r/GUI/Tab.cpp:3636
-#: src/slic3r/GUI/Tab.cpp:3637 src/libslic3r/PrintConfig.cpp:2781
-#: src/libslic3r/PrintConfig.cpp:2788 src/libslic3r/PrintConfig.cpp:2802
-#: src/libslic3r/PrintConfig.cpp:2813 src/libslic3r/PrintConfig.cpp:2823
-#: src/libslic3r/PrintConfig.cpp:2845 src/libslic3r/PrintConfig.cpp:2856
-#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:2870
-#: src/libslic3r/PrintConfig.cpp:2881 src/libslic3r/PrintConfig.cpp:2890
-#: src/libslic3r/PrintConfig.cpp:2899
+#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:664
+#: src/slic3r/GUI/Plater.cpp:501 src/slic3r/GUI/Tab.cpp:4055
+#: src/slic3r/GUI/Tab.cpp:4056 src/slic3r/GUI/Tab.cpp:4127
+#: src/libslic3r/PrintConfig.cpp:2945 src/libslic3r/PrintConfig.cpp:2952
+#: src/libslic3r/PrintConfig.cpp:2966 src/libslic3r/PrintConfig.cpp:2977
+#: src/libslic3r/PrintConfig.cpp:2987 src/libslic3r/PrintConfig.cpp:3009
+#: src/libslic3r/PrintConfig.cpp:3020 src/libslic3r/PrintConfig.cpp:3027
+#: src/libslic3r/PrintConfig.cpp:3034 src/libslic3r/PrintConfig.cpp:3045
+#: src/libslic3r/PrintConfig.cpp:3054 src/libslic3r/PrintConfig.cpp:3063
msgid "Pad"
msgstr "Pad"
@@ -5105,431 +6192,517 @@ msgstr "Pad"
msgid "Pad and Support"
msgstr "Pad e Supporto"
-#: src/libslic3r/PrintConfig.cpp:2855
+#: src/slic3r/GUI/Tab.cpp:4127 src/libslic3r/PrintConfig.cpp:3019
msgid "Pad around object"
msgstr "Pad Intorno all'oggetto"
-#: src/libslic3r/PrintConfig.cpp:2862
+#: src/libslic3r/PrintConfig.cpp:3026
msgid "Pad around object everywhere"
msgstr "Pad ovunque intorno all'oggetto"
-#: src/libslic3r/PrintConfig.cpp:2811
+#: src/libslic3r/PrintConfig.cpp:2975
msgid "Pad brim size"
msgstr "Dimensioni brim del Pad"
-#: src/libslic3r/SLA/Pad.cpp:691
+#: src/libslic3r/SLA/Pad.cpp:532
msgid "Pad brim size is too small for the current configuration."
msgstr "La dimensione del brim del Pad è troppo piccola per la configurazione attuale."
-#: src/libslic3r/PrintConfig.cpp:2898
+#: src/libslic3r/PrintConfig.cpp:3062
msgid "Pad object connector penetration"
msgstr "Inserimento connettore Pad dell'oggetto"
-#: src/libslic3r/PrintConfig.cpp:2880
+#: src/libslic3r/PrintConfig.cpp:3044
msgid "Pad object connector stride"
msgstr "Passo del connettore del pad dell'oggetto"
-#: src/libslic3r/PrintConfig.cpp:2889
+#: src/libslic3r/PrintConfig.cpp:3053
msgid "Pad object connector width"
msgstr "Lunghezza connettore Pad dell'oggetto"
-#: src/libslic3r/PrintConfig.cpp:2869
+#: src/libslic3r/PrintConfig.cpp:3033
msgid "Pad object gap"
msgstr "Spazio Pad oggetto"
-#: src/libslic3r/PrintConfig.cpp:2797
+#: src/libslic3r/PrintConfig.cpp:2961
msgid "Pad wall height"
msgstr "Altezza parete Pad"
-#: src/libslic3r/PrintConfig.cpp:2844
+#: src/libslic3r/PrintConfig.cpp:3008
msgid "Pad wall slope"
msgstr "Inclinazione della parete del pad"
-#: src/libslic3r/PrintConfig.cpp:2787
+#: src/libslic3r/PrintConfig.cpp:2951
msgid "Pad wall thickness"
msgstr "Spessore parete Pad"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
msgid "Page Down"
msgstr "Page Down"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
msgid "Page Up"
msgstr "Page Up"
-#: src/slic3r/GUI/Field.cpp:139
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33
+msgid "Paint-on supports"
+msgstr "Supporti Paint-on"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:178
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:159
+msgid "Paints all facets inside, regardless of their orientation."
+msgstr "Dipinge tutte le faccette all'interno, indipendentemente dal loro orientamento."
+
+#: src/slic3r/GUI/Field.cpp:187
msgid "parameter name"
msgstr "nome parametro"
-#: src/slic3r/GUI/Field.cpp:243
+#: src/slic3r/GUI/Field.cpp:291
msgid "Parameter validation"
msgstr "Validazione parametri"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3418
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3881
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
msgid "Part"
msgstr "Parte"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2494
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2886
msgid "Part manipulation"
msgstr "Manipolazione parti"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2483
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2875
msgid "Part Settings to modify"
msgstr "Impostazioni parte da modificare"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4514
+#: src/libslic3r/PrintConfig.cpp:138
+msgid "Password"
+msgstr "Password"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4880
msgid "Paste"
msgstr "Incolla"
-#: src/slic3r/GUI/MainFrame.cpp:592
+#: src/slic3r/GUI/MainFrame.cpp:1198
msgid "Paste clipboard"
msgstr "Incolla appunti"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:133
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:128
msgid "Paste from clipboard"
msgstr "Incolla dagli appunti"
-#: src/slic3r/GUI/Plater.cpp:5606
+#: src/slic3r/GUI/Plater.cpp:5803
msgid "Paste From Clipboard"
msgstr "Incolla dagli appunti"
-#: src/libslic3r/PrintConfig.cpp:2002
+#: src/libslic3r/PrintConfig.cpp:2144
msgid "Pattern"
msgstr "Trama"
-#: src/libslic3r/PrintConfig.cpp:1891
+#: src/libslic3r/PrintConfig.cpp:2033
msgid "Pattern angle"
msgstr "Angolo trama"
-#: src/libslic3r/PrintConfig.cpp:2016
+#: src/libslic3r/PrintConfig.cpp:2158
msgid "Pattern spacing"
msgstr "Spaziatura trama"
-#: src/libslic3r/PrintConfig.cpp:2004
+#: src/libslic3r/PrintConfig.cpp:2146
msgid "Pattern used to generate support material."
msgstr "Trama usata per generare il materiale di supporto."
-#: src/slic3r/GUI/Plater.cpp:1261
+#: src/slic3r/GUI/GCodeViewer.cpp:2437 src/slic3r/GUI/GCodeViewer.cpp:2460
+#: src/slic3r/GUI/Plater.cpp:1199
msgid "Pause"
msgstr "Pausa"
-#: src/slic3r/GUI/DoubleSlider.cpp:1009
+#: src/slic3r/GUI/DoubleSlider.cpp:1133
msgid "Pause print (\"%1%\")"
msgstr "Metti in pausa (\"%1%\")"
-#: src/slic3r/GUI/GLCanvas3D.cpp:934 src/slic3r/GUI/GLCanvas3D.cpp:943
-#: src/slic3r/GUI/GLCanvas3D.cpp:982
-msgid "Pause print or custom G-code"
-msgstr "Pausa stampa o G-code personalizzato"
+#: src/slic3r/GUI/Tab.cpp:2209 src/libslic3r/PrintConfig.cpp:1969
+msgid "Pause Print G-code"
+msgstr "G-code Pausa Stampa"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:175
+#: src/libslic3r/PrintConfig.cpp:1147
+msgid "Percent of a flow rate relative to object's normal layer height."
+msgstr "Percentuale di una portata rispetto all'altezza normale dello strato dell'oggetto."
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2233
+msgid "Percentage"
+msgstr "Percentuale"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:177
msgid "Perform cut"
msgstr "Effettua taglio"
-#: src/libslic3r/PrintConfig.cpp:2927
+#: src/libslic3r/PrintConfig.cpp:3091
msgid "Performance vs accuracy of calculation. Lower values may produce unwanted artifacts."
msgstr "Prestazioni vs Precisione di calcolo. Valori più bassi possono produrre artefatti non voluti."
-#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:310
+#: src/slic3r/GUI/GUI_Preview.cpp:301 src/libslic3r/ExtrusionEntity.cpp:314
+#: src/libslic3r/ExtrusionEntity.cpp:336
msgid "Perimeter"
msgstr "Perimetro"
-#: src/libslic3r/PrintConfig.cpp:1408
+#: src/libslic3r/PrintConfig.cpp:1516
msgid "Perimeter extruder"
msgstr "Estrusore perimetro"
-#: src/slic3r/GUI/PresetHints.cpp:165
+#: src/slic3r/GUI/PresetHints.cpp:164
msgid "perimeters"
msgstr "perimetri"
-#: src/libslic3r/PrintConfig.cpp:1399 src/libslic3r/PrintConfig.cpp:1417
-#: src/libslic3r/PrintConfig.cpp:1430 src/libslic3r/PrintConfig.cpp:1440
+#: src/libslic3r/PrintConfig.cpp:1507 src/libslic3r/PrintConfig.cpp:1525
+#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1548
msgid "Perimeters"
msgstr "Perimetri"
-#: src/slic3r/GUI/ConfigWizard.cpp:860
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:159
+msgid "Physical Printer"
+msgstr "Stampante Fisica"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:789
+#: src/slic3r/GUI/PresetComboBoxes.cpp:948
+msgid "Physical printers"
+msgstr "Stampanti fisiche"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1226
#, possible-c-format
msgid "Pick another vendor supported by %s"
-msgstr "Scegli un altro distributore supportato da %s"
+msgstr "Scegli un altro produttore supportato da %s"
-#: src/libslic3r/PrintConfig.cpp:66
-msgid "Picture sizes to be stored into a .gcode and .sl1 files"
-msgstr "Dimensioni immagine per essere memorizzate nei file .gcode e .sl1"
+#: src/libslic3r/PrintConfig.cpp:67
+msgid "Picture sizes to be stored into a .gcode and .sl1 files, in the following format: \"XxY, XxY, ...\""
+msgstr "Dimensioni delle immagini da memorizzare in un file .gcode e .sl1, nel seguente formato: \"XxY, XxY, ...\""
+
+#: src/libslic3r/PrintConfig.cpp:2822
+msgid "Pillar connection mode"
+msgstr "Modo di collegamento al pilastro"
+
+#: src/libslic3r/PrintConfig.cpp:2791
+msgid "Pillar diameter"
+msgstr "Diametro pilastro"
-#: src/libslic3r/PrintConfig.cpp:2681
+#: src/libslic3r/PrintConfig.cpp:2845
msgid "Pillar widening factor"
msgstr "Fattore di espansione pilastro"
-#: src/slic3r/GUI/ConfigManipulation.cpp:330
+#: src/slic3r/GUI/ConfigManipulation.cpp:335
msgid "Pinhead diameter should be smaller than the pillar diameter."
msgstr "Il diametro dell'apice dovrebbe essere più piccolo rispetto al diametro del pilastro."
-#: src/slic3r/GUI/DoubleSlider.cpp:79
+#: src/libslic3r/PrintConfig.cpp:2763
+msgid "Pinhead front diameter"
+msgstr "Diametro anteriore apice"
+
+#: src/libslic3r/PrintConfig.cpp:2781
+msgid "Pinhead width"
+msgstr "Larghezza apice"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:110
msgid "Place bearings in slots and resume printing"
msgstr "Posiziona i cuscinetti negli alloggi e riprendi a stampare"
-#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:45
+#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:41
msgid "Place on face"
msgstr "Posiziona su faccia"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 src/slic3r/GUI/MainFrame.cpp:204
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 src/slic3r/GUI/MainFrame.cpp:340
+#: src/slic3r/GUI/MainFrame.cpp:352
msgid "Plater"
msgstr "Piano"
-#: src/slic3r/GUI/GUI_App.cpp:1085
+#: src/slic3r/GUI/GUI_App.cpp:1877
msgid "Please check and fix your object list."
msgstr "Per favore controlla e correggi la tua lista oggetti."
-#: src/slic3r/GUI/Plater.cpp:2312 src/slic3r/GUI/Tab.cpp:2959
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:209 src/slic3r/GUI/Plater.cpp:2255
+#: src/slic3r/GUI/Tab.cpp:3188
msgid "Please check your object list before preset changing."
msgstr "Per favore verifica la tua lista di oggetti prima di cambiare i preset."
-#: src/slic3r/GUI/Plater.cpp:3286
+#: src/slic3r/GUI/Plater.cpp:3089
msgid "Please select the file to reload"
msgstr "Seleziona il file da ricaricare"
-#: src/slic3r/GUI/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:291
+#: src/slic3r/GUI/AboutDialog.cpp:43 src/slic3r/GUI/AboutDialog.cpp:48
+#: src/slic3r/GUI/AboutDialog.cpp:317
msgid "Portions copyright"
-msgstr "Parti di copyright"
+msgstr "Porzioni di copyright"
-#: src/libslic3r/PrintConfig.cpp:2400
+#: src/libslic3r/PrintConfig.cpp:2543
msgid "Portrait"
msgstr "Ritratto"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:215
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:457
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:223
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:505
msgid "Position"
msgstr "Posizione"
-#: src/slic3r/GUI/Tab.cpp:2367
+#: src/slic3r/GUI/Tab.cpp:2536
msgid "Position (for multi-extruder printers)"
msgstr "Posizione (per stampanti multi-estrusore)"
-#: src/libslic3r/PrintConfig.cpp:1623
+#: src/libslic3r/PrintConfig.cpp:1731
msgid "Position of perimeters starting points."
msgstr "Posizione dei punti iniziali dei perimetri."
-#: src/libslic3r/PrintConfig.cpp:2224
+#: src/libslic3r/PrintConfig.cpp:2367
msgid "Position X"
msgstr "Posizione X"
-#: src/libslic3r/PrintConfig.cpp:2231
+#: src/libslic3r/PrintConfig.cpp:2374
msgid "Position Y"
msgstr "Posizione Y"
-#: src/slic3r/GUI/Tab.cpp:1245 src/libslic3r/PrintConfig.cpp:1453
+#: src/slic3r/GUI/Tab.cpp:1575 src/libslic3r/PrintConfig.cpp:1561
msgid "Post-processing scripts"
msgstr "Script di post produzione"
-#: src/slic3r/GUI/MainFrame.cpp:629
+#: src/slic3r/GUI/MainFrame.cpp:1237
msgid "Pre&view"
msgstr "&Visualizza anteprima"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 src/slic3r/GUI/Preferences.cpp:10
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 src/slic3r/GUI/Preferences.cpp:12
msgid "Preferences"
msgstr "Preferenze"
-#: src/libslic3r/PrintConfig.cpp:1641
+#: src/libslic3r/PrintConfig.cpp:1749
msgid "Preferred direction of the seam"
msgstr "Direzione preferita della giunzione"
-#: src/libslic3r/PrintConfig.cpp:1652
+#: src/libslic3r/PrintConfig.cpp:1760
msgid "Preferred direction of the seam - jitter"
msgstr "Direzione preferita della giunzione - jitter"
-#: src/libslic3r/PrintObject.cpp:255
+#: src/libslic3r/PrintObject.cpp:261
msgid "Preparing infill"
msgstr "Preparazione infill"
-#: src/slic3r/GUI/Tab.cpp:2920
-#, possible-c-format
-msgid "Preset (%s)"
-msgstr "Preset (%s)"
+#: src/slic3r/GUI/GUI_App.cpp:855
+msgid "Preparing settings tabs"
+msgstr "Preparazione schede impostazioni"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1009
+msgid "Preset \"%1%\" has the following unsaved changes:"
+msgstr "Il preset \"%1%\" ha le seguenti modifiche non salvate:"
-#: src/slic3r/GUI/Tab.cpp:3082
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1014
+msgid "Preset \"%1%\" is not compatible with the new print profile and it has the following unsaved changes:"
+msgstr "Il preset \"%1%\" non è compatibile con il nuovo profilo di stampa e possiede le seguenti modifiche non salvate:"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1013
+msgid "Preset \"%1%\" is not compatible with the new printer profile and it has the following unsaved changes:"
+msgstr "Il preset \"%1%\" non è compatibile con il nuovo profilo stampante e possiede le seguenti modifiche non salvate:"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:136
+msgid "Preset with name \"%1%\" already exists and is incompatible with selected printer."
+msgstr "Il preset con il nome \"%1%\" è già esistente ed è incompatibile con la stampante selezionata."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:148
msgid "Preset with name \"%1%\" already exists."
msgstr "Preset con il nome \"%1%\" già esistente."
-#: src/slic3r/GUI/Tab.cpp:3029
+#: src/slic3r/GUI/SavePresetDialog.cpp:219
msgctxt "PresetName"
msgid "Copy"
msgstr "Copia"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
+#: src/slic3r/GUI/GLCanvas3D.cpp:3990
+msgid "Press %1%left mouse button to enter the exact value"
+msgstr "Premi il tasto sinistro del mouse %1% per inserire il valore esatto"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:157
msgid "Press to activate deselection rectangle"
msgstr "Premi per attivare il rettangolo di deselezione"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:197
-msgid "Press to activate one direction scaling in Gizmo scale"
-msgstr "Premere per attivare una direzione di ridimensionamento nel Gizmo ridimensiona"
-
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:162
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:156
msgid "Press to activate selection rectangle"
msgstr "Premi per attivare il rettangolo di selezione"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:198
-msgid "Press to scale (in Gizmo scale) or rotate (in Gizmo rotate)\nselected objects around their own center"
-msgstr "Premi per ridimensionare (nel Gizmo ridimensiona) o ruotare (nel Gizmo ruota)\nl'oggetto selezionato attorno al proprio centro"
-
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:161
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:155
msgid "Press to select multiple objects\nor move multiple objects with mouse"
msgstr "Premi per selezionare o spostare\noggetti multipli con il mouse"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:195
-#, no-c-format
-msgid "Press to snap by 5% in Gizmo scale\nor to snap by 1mm in Gizmo move"
-msgstr "Premi per scatti del 5% nel Gizmo ridimensiona\no per scatti di 1mm nel Gizmo sposta"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:221
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:231
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:232
+msgid "Press to speed up 5 times while moving thumb\nwith arrow keys or mouse wheel"
+msgstr "Premere per accelerare di 5 volte durante il movimento del cursore\ncon i tasti freccia o la rotella del mouse"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/Plater.cpp:4105
-#: src/slic3r/GUI/Tab.cpp:2390
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:212 src/slic3r/GUI/Plater.cpp:4052
+#: src/slic3r/GUI/Tab.cpp:2559
msgid "Preview"
msgstr "Anteprima"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41
msgid "Preview hollowed and drilled model"
msgstr "Anteprima del modello svuotato e forato"
-#: src/slic3r/GUI/MainFrame.cpp:790
+#: src/slic3r/GUI/MainFrame.cpp:1491
msgid "Previously sliced file ("
msgstr "File precedentemente processato ("
-#: src/libslic3r/PrintConfig.cpp:1851
+#: src/libslic3r/PrintConfig.cpp:1993
msgid "Prime all printing extruders"
msgstr "Prepara tutti gli estrusori di stampa"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1521
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/libslic3r/Preset.cpp:1300
msgid "print"
msgstr "stampa"
-#: src/slic3r/GUI/MainFrame.cpp:648
+#: src/slic3r/GUI/GCodeViewer.cpp:2436 src/slic3r/GUI/GCodeViewer.cpp:2451
+msgid "Print"
+msgstr "Stampa"
+
+#: src/slic3r/GUI/MainFrame.cpp:1258
msgid "Print &Host Upload Queue"
msgstr "Coda di caricamento &Host di stampa"
-#: src/libslic3r/PrintConfig.cpp:471
+#: src/libslic3r/PrintConfig.cpp:507
msgid "Print contour perimeters from the outermost one to the innermost one instead of the default inverse order."
msgstr "Stampa i perimetri di contorno dal più esterno al più interno invece dell'ordine predefinito inverso."
-#: src/slic3r/GUI/ConfigWizard.cpp:952
+#: src/slic3r/GUI/ConfigWizard.cpp:1318
msgid "Print Diameters"
msgstr "Diametro di stampa"
-#: src/slic3r/GUI/Tab.cpp:1944 src/slic3r/GUI/Tab.cpp:2123
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:209 src/slic3r/GUI/Tab.cpp:2024
msgid "Print Host upload"
msgstr "Caricamento Host di stampa"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:142
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:138
#: src/slic3r/GUI/PrintHostDialogs.cpp:136
msgid "Print host upload queue"
msgstr "Coda di caricamento Host di stampa"
-#: src/slic3r/GUI/DoubleSlider.cpp:970
+#: src/slic3r/GUI/DoubleSlider.cpp:1093
msgid "Print mode"
msgstr "Modalità di stampa"
-#: src/slic3r/GUI/Tab.hpp:328 src/slic3r/GUI/Tab.hpp:431
+#: src/slic3r/GUI/GCodeViewer.cpp:2579 src/slic3r/GUI/GUI_Preview.cpp:1476
+msgid "Print pauses"
+msgstr "Pause di stampa"
+
+#: src/slic3r/GUI/Tab.hpp:378 src/slic3r/GUI/Tab.hpp:502
msgid "Print Settings"
msgstr "Impostazioni Stampa"
-#: src/slic3r/GUI/Plater.cpp:815
+#: src/slic3r/GUI/Plater.cpp:690
msgid "Print settings"
msgstr "Impostazioni di stampa"
-#: src/slic3r/GUI/Tab.cpp:1478
+#: src/slic3r/GUI/GLCanvas3D.cpp:4303 src/slic3r/GUI/GLCanvas3D.cpp:4939
+msgid "Print Settings Tab"
+msgstr "Scheda Impostazioni Stampa"
+
+#: src/slic3r/GUI/Tab.cpp:1824
msgid "Print speed override"
msgstr "Scavalca velocità di stampa"
-#: src/libslic3r/GCode.cpp:638
+#: src/libslic3r/GCode.cpp:623
msgid "Print z"
msgstr "Stampa z"
-#: src/slic3r/GUI/MainFrame.cpp:621
+#: src/slic3r/GUI/MainFrame.cpp:1228
msgid "Print&er Settings Tab"
msgstr "Impostazioni Stampant&e"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1621
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1750
msgid "Printable"
msgstr "Stampabile"
-#: src/slic3r/GUI/Plater.cpp:819
+#: src/slic3r/GUI/Plater.cpp:694
msgid "Printer"
msgstr "Stampante"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1525
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/libslic3r/Preset.cpp:1304
msgid "printer"
msgstr "stampante"
-#: src/libslic3r/PrintConfig.cpp:2439 src/libslic3r/PrintConfig.cpp:2440
+#: src/libslic3r/PrintConfig.cpp:2582 src/libslic3r/PrintConfig.cpp:2583
msgid "Printer absolute correction"
msgstr "Correzione assoluta stampante"
-#: src/libslic3r/PrintConfig.cpp:2456 src/libslic3r/PrintConfig.cpp:2457
+#: src/libslic3r/PrintConfig.cpp:2599 src/libslic3r/PrintConfig.cpp:2600
msgid "Printer gamma correction"
msgstr "Correzione gamma della stampante"
-#: src/slic3r/GUI/Tab.cpp:976
+#: src/slic3r/GUI/Tab.cpp:1294
msgid "printer model"
msgstr "modello stampante"
-#: src/libslic3r/PrintConfig.cpp:1472
+#: src/libslic3r/PrintConfig.cpp:1580
msgid "Printer notes"
msgstr "Note stampante"
-#: src/libslic3r/PrintConfig.cpp:2431 src/libslic3r/PrintConfig.cpp:2432
-#: src/libslic3r/PrintConfig.cpp:2433
+#: src/libslic3r/PrintConfig.cpp:144
+msgid "Printer preset name"
+msgstr "Nome del preset della stampante"
+
+#: src/libslic3r/PrintConfig.cpp:2574 src/libslic3r/PrintConfig.cpp:2575
+#: src/libslic3r/PrintConfig.cpp:2576
msgid "Printer scaling correction"
msgstr "Correzione di scala stampante"
-#: src/slic3r/GUI/Tab.hpp:391
+#: src/slic3r/GUI/Tab.hpp:453
msgid "Printer Settings"
msgstr "Impostazioni stampante"
+#: src/slic3r/GUI/GLCanvas3D.cpp:4305 src/slic3r/GUI/GLCanvas3D.cpp:4941
+msgid "Printer Settings Tab"
+msgstr "Scheda Impostazioni Stampante"
+
#: src/libslic3r/PrintConfig.cpp:43 src/libslic3r/PrintConfig.cpp:44
msgid "Printer technology"
msgstr "Tecnologia stampante"
-#: src/libslic3r/PrintConfig.cpp:1466
+#: src/libslic3r/PrintConfig.cpp:1574
msgid "Printer type"
msgstr "Tipo stampante"
-#: src/libslic3r/PrintConfig.cpp:1487
+#: src/libslic3r/PrintConfig.cpp:1595
msgid "Printer variant"
msgstr "Variante della stampante"
-#: src/libslic3r/PrintConfig.cpp:1481
+#: src/libslic3r/PrintConfig.cpp:1589
msgid "Printer vendor"
msgstr "Venditore della stampante"
-#: src/libslic3r/Print.cpp:1388
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:476
+msgid "Printer with name \"%1%\" already exists."
+msgstr "Stampante con nome \"%1%\" già esistente."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:587
+msgid "Printer:"
+msgstr "Stampante:"
+
+#: src/libslic3r/Print.cpp:1414
msgid "Printing with multiple extruders of differing nozzle diameters. If support is to be printed with the current extruder (support_material_extruder == 0 or support_material_interface_extruder == 0), all nozzles have to be of the same diameter."
msgstr "Stampa con più estrusori con ugelli di di diametro diverso. Se il supporto deve essere stampato con l'estrusore corrente (support_material_extruder = = 0 o support_material_interface_extruder = = 0), tutti gli ugelli devono avere lo stesso diametro."
#. TRN "Processing input_file_basename"
-#: src/slic3r/GUI/MainFrame.cpp:849
+#: src/slic3r/GUI/MainFrame.cpp:1550
#, possible-c-format
msgid "Processing %s"
msgstr "Elaborando %s"
-#: src/slic3r/GUI/Plater.cpp:2283
-#, possible-c-format
-msgid "Processing input file %s"
-msgstr "Processando il file di input %s"
-
-#: src/libslic3r/PrintObject.cpp:108
+#: src/libslic3r/PrintObject.cpp:114
msgid "Processing triangulated mesh"
msgstr "Elaborando la mesh triangolata"
-#: src/slic3r/GUI/Tab.cpp:1259 src/slic3r/GUI/Tab.cpp:1549
-#: src/slic3r/GUI/Tab.cpp:2020 src/slic3r/GUI/Tab.cpp:2136
-#: src/slic3r/GUI/Tab.cpp:3544 src/slic3r/GUI/Tab.cpp:3672
+#: src/slic3r/GUI/Tab.cpp:1589 src/slic3r/GUI/Tab.cpp:1896
+#: src/slic3r/GUI/Tab.cpp:2229 src/slic3r/GUI/Tab.cpp:2305
+#: src/slic3r/GUI/Tab.cpp:3960 src/slic3r/GUI/Tab.cpp:4091
msgid "Profile dependencies"
msgstr "Dipendenze profilo"
-#: src/slic3r/GUI/ConfigWizard.cpp:566
+#: src/slic3r/GUI/ConfigWizard.cpp:590
msgid "Profile:"
msgstr "Profilo:"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:150
+#: src/slic3r/GUI/PrintHostDialogs.cpp:148
msgid "Progress"
msgstr "Progresso"
@@ -5537,23 +6710,39 @@ msgstr "Progresso"
msgid "Progress:"
msgstr "Progresso:"
-#: src/slic3r/GUI/MainFrame.cpp:684
+#: src/slic3r/GUI/MainFrame.cpp:909 src/slic3r/GUI/MainFrame.cpp:1308
msgid "Prusa 3D &Drivers"
msgstr "Prusa 3D &Drivers"
-#: src/slic3r/GUI/ConfigWizard.cpp:1995
+#: src/slic3r/GUI/ConfigWizard.cpp:2506
msgid "Prusa FFF Technology Printers"
msgstr "Stampanti Prusa con tecnologia FFF"
-#: src/slic3r/GUI/ConfigWizard.cpp:1998
+#: src/slic3r/GUI/ConfigWizard.cpp:2509
msgid "Prusa MSLA Technology Printers"
msgstr "Stampanti Prusa con tecnologia MSLA"
-#: src/slic3r/GUI/AboutDialog.cpp:260
+#: src/slic3r/Utils/Http.cpp:78
+msgid "PrusaSlicer detected system SSL certificate store in: %1%"
+msgstr "PrusaSlicer ha rilevato l'archivio dei certificati SSL di sistema: %1%"
+
+#: src/slic3r/GUI/GUI_Init.cpp:85 src/slic3r/GUI/GUI_Init.cpp:88
+msgid "PrusaSlicer GUI initialization failed"
+msgstr "Inizializzazione GUI PrusaSlicer non riuscita"
+
+#: src/slic3r/GUI/GUI_App.cpp:586
+msgid "PrusaSlicer has encountered a localization error. Please report to PrusaSlicer team, what language was active and in which scenario this issue happened. Thank you.\n\nThe application will now terminate."
+msgstr "PrusaSlicer ha riscontrato un errore di localizzazione. Si prega di riferire al team di PrusaSlicer, quale lingua era attiva e in quale scenario si è verificato questo problema. Grazie.\n\nL'applicazione terminerà ora."
+
+#: src/slic3r/GUI/AboutDialog.cpp:285
msgid "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap community."
msgstr "PrusaSlicer è basato su Slic3r di Alessandro Ranellucci e la comunità RepRap."
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:284
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:525
+msgid "PrusaSlicer is closing: Unsaved Changes"
+msgstr "Chiusura PrusaSlicer: Modifiche non salvate"
+
+#: src/slic3r/GUI/OpenGLManager.cpp:259
#, possible-c-format
msgid "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \nwhile OpenGL version %s, render %s, vendor %s was detected."
msgstr "PrusaSlicer richiede un driver video con supporto OpenGL 2.0 per funzionare correttamente, mentre è stata rilevata la versione %s OpenGL, render %s, distributore %s."
@@ -5562,68 +6751,88 @@ msgstr "PrusaSlicer richiede un driver video con supporto OpenGL 2.0 per funzion
msgid "PrusaSlicer version"
msgstr "versione PrusaSlicer"
-#: src/slic3r/GUI/ConfigWizard.cpp:815
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:662
+msgid "PrusaSlicer will remember your action."
+msgstr "PrusaSlicer ricorderà la tua azione."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1174
msgid "PrusaSlicer's user interfaces comes in three variants:\nSimple, Advanced, and Expert.\nThe Simple mode shows only the most frequently used settings relevant for regular 3D printing. The other two offer progressively more sophisticated fine-tuning, they are suitable for advanced and expert users, respectively."
msgstr "L'interfaccia utente di PrusaSlicer è disponibile in tre varianti:\nSemplice, Avanzata ed Esperto.\nLa modalità Semplice mostra solo le impostazioni rilevanti utilizzate più spesso per una semplice stampa 3D. Le altre due offrono progressivamente ottimizzazioni più sofisticate, sono adatte ad utenti avanzati ed esperti, rispettivamente."
-#: src/libslic3r/PrintConfig.cpp:2254
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:668
+msgid "PrusaSlicer: Don't ask me again"
+msgstr "PrusaSlicer: Non chiedermelo più"
+
+#: src/libslic3r/PrintConfig.cpp:2397
msgid "Purging after toolchange will done inside this object's infills. This lowers the amount of waste but may result in longer print time due to additional travel moves."
msgstr "Lo spurgo dopo un cambio di attrezzo verrà effettuato dentro il riempimento di questo oggetto. Questo diminuisce la quantità di scarto ma potrebbe prolungare il tempo di stampa a causa di spostamenti aggiuntivi."
-#: src/slic3r/GUI/Plater.cpp:544
+#: src/slic3r/GUI/Plater.cpp:410
msgid "Purging volumes"
msgstr "Volumi di spurgo"
-#: src/libslic3r/PrintConfig.cpp:2207
+#: src/libslic3r/PrintConfig.cpp:2350
msgid "Purging volumes - load/unload volumes"
msgstr "Volumi di spurgo - volumi di carico/scarico"
-#: src/libslic3r/PrintConfig.cpp:2214
+#: src/libslic3r/PrintConfig.cpp:2357
msgid "Purging volumes - matrix"
msgstr "Volumi di spurgo - matrice"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44
+#: src/libslic3r/PrintConfig.cpp:1201
+msgid "Purpose of Machine Limits"
+msgstr "Scopo dei limiti della macchina"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43
msgid "Quality"
msgstr "Qualità"
-#: src/slic3r/GUI/Tab.cpp:1080
+#: src/slic3r/GUI/Tab.cpp:1402
msgid "Quality (slower slicing)"
msgstr "Qualità (slicing più lento)"
-#: src/slic3r/GUI/GLCanvas3D.cpp:273
+#: src/slic3r/GUI/GLCanvas3D.cpp:260
msgid "Quality / Speed"
msgstr "Qualità / Velocità"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1182
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1530
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1536
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1849
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61
+msgid "Quick"
+msgstr "Veloce"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1306
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1661
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1667
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2008
#, possible-c-format
msgid "Quick Add Settings (%s)"
msgstr "Aggiungere Impostazioni Rapide (%s)"
-#: src/slic3r/GUI/MainFrame.cpp:512
+#: src/slic3r/GUI/MainFrame.cpp:1113
msgid "Quick Slice"
msgstr "Slice veloce"
-#: src/slic3r/GUI/MainFrame.cpp:518
+#: src/slic3r/GUI/MainFrame.cpp:1119
msgid "Quick Slice and Save As"
msgstr "Slice veloce e Salva Come"
-#: src/slic3r/GUI/MainFrame.cpp:540
+#: src/slic3r/GUI/MainFrame.cpp:1144 src/slic3r/GUI/MainFrame.cpp:1402
#, possible-c-format
msgid "Quit %s"
msgstr "Chiudi %s"
-#: src/slic3r/GUI/GLCanvas3D.cpp:294 src/libslic3r/PrintConfig.cpp:511
+#: src/slic3r/GUI/GUI_App.cpp:396
+msgid "Quit, I will move my data now"
+msgstr "Chiudi, sposterò i miei dati adesso"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:280 src/libslic3r/PrintConfig.cpp:547
msgid "Radius"
msgstr "Raggio"
-#: src/slic3r/GUI/Tab.cpp:1127
+#: src/slic3r/GUI/Tab.cpp:1456
msgid "Raft"
msgstr "Raft"
-#: src/libslic3r/PrintConfig.cpp:1501
+#: src/libslic3r/PrintConfig.cpp:1609
msgid "Raft layers"
msgstr "Layer raft"
@@ -5643,27 +6852,27 @@ msgstr "Spaziatura tra linee di ramming"
msgid "Ramming line width"
msgstr "Larghezza della linea di Ramming"
-#: src/libslic3r/PrintConfig.cpp:694
+#: src/libslic3r/PrintConfig.cpp:730
msgid "Ramming parameters"
msgstr "Parametri del ramming"
-#: src/slic3r/GUI/Tab.cpp:1505
+#: src/slic3r/GUI/Tab.cpp:1850
msgid "Ramming settings"
msgstr "Impostazioni del ramming"
-#: src/libslic3r/PrintConfig.cpp:1629
+#: src/libslic3r/PrintConfig.cpp:1737
msgid "Random"
msgstr "Casuale"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:94
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:96
msgid "Range"
msgstr "Intervallo"
-#: src/libslic3r/SLAPrintSteps.cpp:65
+#: src/libslic3r/SLAPrintSteps.cpp:66
msgid "Rasterizing layers"
msgstr "Rasterizzazione dei layer"
-#: src/slic3r/GUI/MainFrame.cpp:596
+#: src/slic3r/GUI/MainFrame.cpp:1202
msgid "Re&load from disk"
msgstr "R&icarica da disco"
@@ -5675,210 +6884,243 @@ msgstr "Ri-configura"
msgid "Ready"
msgstr "Pronto"
-#: src/slic3r/GUI/Plater.cpp:3115
+#: src/slic3r/GUI/Plater.cpp:2915
msgid "Ready to slice"
msgstr "Pronto a processare"
-#: src/slic3r/GUI/MainFrame.cpp:669 src/libslic3r/PrintConfig.cpp:1632
+#: src/slic3r/GUI/MainFrame.cpp:966 src/slic3r/GUI/MainFrame.cpp:1286
+#: src/libslic3r/PrintConfig.cpp:1740
msgid "Rear"
msgstr "Posteriore"
-#: src/slic3r/GUI/MainFrame.cpp:669
+#: src/slic3r/GUI/MainFrame.cpp:966 src/slic3r/GUI/MainFrame.cpp:1286
msgid "Rear View"
msgstr "Vista posteriore"
-#: src/slic3r/GUI/MainFrame.cpp:413
+#: src/slic3r/GUI/MainFrame.cpp:994
msgid "Recent projects"
msgstr "Prog&etti recenti"
-#: src/slic3r/GUI/PresetHints.cpp:263
+#: src/slic3r/GUI/PresetHints.cpp:262
#, possible-c-format
msgid "Recommended object thin wall thickness for layer height %.2f and"
msgstr "Spessore raccomandato per oggetto con parete sottile per altezza layer %.2f e"
-#: src/slic3r/GUI/PresetHints.cpp:274
+#: src/slic3r/GUI/PresetHints.cpp:273
msgid "Recommended object thin wall thickness: Not available due to excessively small extrusion width."
msgstr "Spessore raccomandato per oggetto con parete sottile: Non disponibile a causa di una larghezza di estrusione eccessivamente piccola."
-#: src/slic3r/GUI/PresetHints.cpp:247
+#: src/slic3r/GUI/PresetHints.cpp:246
msgid "Recommended object thin wall thickness: Not available due to invalid layer height."
msgstr "Spessore raccomandato per oggetto con parete sottile: Non disponibile a causa di un'altezza layer non valida."
-#: src/slic3r/GUI/GUI_App.cpp:450 src/slic3r/GUI/GUI_App.cpp:459
+#: src/slic3r/GUI/GUI_App.cpp:1102 src/slic3r/GUI/GUI_App.cpp:1115
msgid "Recreating"
msgstr "Rigenerando"
-#: src/slic3r/GUI/BedShapeDialog.cpp:73
+#: src/slic3r/GUI/BedShapeDialog.cpp:141
msgid "Rectangular"
msgstr "Rettangolare"
-#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:843
-#: src/libslic3r/PrintConfig.cpp:2009
+#: src/libslic3r/PrintConfig.cpp:460 src/libslic3r/PrintConfig.cpp:881
+#: src/libslic3r/PrintConfig.cpp:2151
msgid "Rectilinear"
msgstr "Rettilineo"
-#: src/libslic3r/PrintConfig.cpp:2010
+#: src/libslic3r/PrintConfig.cpp:2152
msgid "Rectilinear grid"
msgstr "Griglia rettilinea"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4657 src/slic3r/GUI/KBShortcutsDialog.cpp:131
-#: src/slic3r/GUI/MainFrame.cpp:584
+#: src/slic3r/GUI/GLCanvas3D.cpp:5067 src/slic3r/GUI/KBShortcutsDialog.cpp:126
+#: src/slic3r/GUI/MainFrame.cpp:1190
msgid "Redo"
msgstr "Ripeti"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4065
+#: src/slic3r/GUI/GLCanvas3D.cpp:4382
#, possible-c-format
msgid "Redo %1$d Action"
msgid_plural "Redo %1$d Actions"
msgstr[0] "Ripeti %1$d Azione"
msgstr[1] "Ripeti %1$d Azioni"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4047
+#: src/slic3r/GUI/GLCanvas3D.cpp:4361
msgid "Redo History"
-msgstr "Storia Ripeti"
+msgstr "Cronologia Ripeti"
-#: src/slic3r/GUI/Tab.cpp:1098
+#: src/slic3r/GUI/Tab.cpp:1426
msgid "Reducing printing time"
msgstr "Riduzione tempo di stampa"
-#: src/slic3r/GUI/Plater.cpp:3452
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327
+msgid "Refresh Printers"
+msgstr "Aggiorna Stampanti"
+
+#: src/libslic3r/PrintConfig.cpp:145
+msgid "Related printer preset name"
+msgstr "Nome del preset della stampante correlato"
+
+#: src/slic3r/GUI/Plater.cpp:3257
msgid "Reload all from disk"
msgstr "Ricarica tutto da disco"
-#: src/slic3r/GUI/ConfigWizard.cpp:798 src/slic3r/GUI/GUI_ObjectList.cpp:1664
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3956 src/slic3r/GUI/Plater.cpp:3225
-#: src/slic3r/GUI/Plater.cpp:3934 src/slic3r/GUI/Plater.cpp:3963
+#: src/slic3r/GUI/ConfigWizard.cpp:1157 src/slic3r/GUI/GUI_ObjectList.cpp:1793
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4439 src/slic3r/GUI/Plater.cpp:3028
+#: src/slic3r/GUI/Plater.cpp:3852 src/slic3r/GUI/Plater.cpp:3881
msgid "Reload from disk"
msgstr "Ricarica da Disco"
-#: src/slic3r/GUI/Plater.cpp:3339
+#: src/slic3r/GUI/Plater.cpp:3142
msgid "Reload from:"
msgstr "Ricarica da:"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:134
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:129
msgid "Reload plater from disk"
msgstr "Ricarica piano da disco"
-#: src/slic3r/GUI/MainFrame.cpp:597
+#: src/slic3r/GUI/MainFrame.cpp:1203
msgid "Reload the plater from disk"
msgstr "Ricarica piano da disco"
-#: src/slic3r/GUI/Plater.cpp:3963
+#: src/slic3r/GUI/Plater.cpp:3881
msgid "Reload the selected object from disk"
msgstr "Ricarica l'oggetto selezionato dal disco"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1664
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3956 src/slic3r/GUI/Plater.cpp:3934
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1793
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4439 src/slic3r/GUI/Plater.cpp:3852
msgid "Reload the selected volumes from disk"
msgstr "Ricarica i volumi selezionati dal disco"
-#: src/slic3r/GUI/Preferences.cpp:39
+#: src/slic3r/GUI/GCodeViewer.cpp:2442 src/slic3r/GUI/GCodeViewer.cpp:2445
+msgid "Remaining time"
+msgstr "Tempo rimanente"
+
+#: src/slic3r/GUI/GUI_App.cpp:720 src/slic3r/GUI/UnsavedChangesDialog.cpp:653
+msgid "Remember my choice"
+msgstr "Ricorda la mia scelta"
+
+#: src/slic3r/GUI/Preferences.cpp:52
msgid "Remember output directory"
msgstr "Ricorda la directory di output"
-#: src/slic3r/GUI/Tab.cpp:3121
+#: src/slic3r/GUI/MainFrame.cpp:166
+msgid "Remember to check for updates at https://github.com/prusa3d/PrusaSlicer/releases"
+msgstr "Ricorda di controllare la presenza di aggiornamenti su https://github.com/prusa3d/PrusaSlicer/releases"
+
+#: src/slic3r/GUI/Tab.cpp:3386
msgid "remove"
msgstr "rimuovi"
-#: src/slic3r/GUI/BedShapeDialog.cpp:190 src/slic3r/GUI/BedShapeDialog.cpp:269
-#: src/slic3r/GUI/Tab.cpp:3124
+#: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/BedShapeDialog.cpp:413
+#: src/slic3r/GUI/Tab.cpp:3423
msgid "Remove"
msgstr "Rimuovi"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48
msgid "Remove all holes"
msgstr "Rimuovi tutti i fori"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50
msgid "Remove all points"
msgstr "Rimuovi tutti i punti"
-#: src/slic3r/GUI/GLCanvas3D.cpp:246
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35
+msgid "Remove all selection"
+msgstr "Elimina tutte le selezioni"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:239
msgid "Remove detail"
msgstr "Rimuovi dettagli"
-#: src/slic3r/GUI/Plater.cpp:879
-msgid "Remove device"
-msgstr "Rimuovi dispositivo"
-
#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:182
msgid "Remove extruder from sequence"
msgstr "Rimuovi estrusore dalla sequenza"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4537 src/slic3r/GUI/Plater.cpp:3942
+#: src/slic3r/GUI/GLCanvas3D.cpp:4903 src/slic3r/GUI/Plater.cpp:3860
msgid "Remove instance"
msgstr "Rimuovi istanza"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:160
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:154
msgid "Remove Instance of the selected object"
msgstr "Rimuovi Istanza dell'oggetto selezionato"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:153
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:161
msgid "Remove layer range"
msgstr "Rimuovi intervallo layer"
-#: src/slic3r/GUI/Plater.cpp:3942
+#: src/slic3r/GUI/Plater.cpp:3860
msgid "Remove one instance of the selected object"
msgstr "Rimuovi una istanza dell'oggetto selezionato"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:95
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:98
msgid "Remove parameter"
msgstr "Rimuovi parametro"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211
msgid "Remove point"
msgstr "Rimuovi punto"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214
msgid "Remove point from selection"
msgstr "Rimuovi punto dalla selezione"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47
msgid "Remove selected holes"
msgstr "Rimuovi i fori selezionati"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1371
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218
msgid "Remove selected points"
msgstr "Rimuovi punti selezionati"
-#: src/slic3r/GUI/Plater.cpp:3931 src/slic3r/GUI/Plater.cpp:3953
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:368
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:378
+msgid "Remove selection"
+msgstr "Elimina selezione"
+
+#: src/slic3r/GUI/Plater.cpp:3849 src/slic3r/GUI/Plater.cpp:3871
msgid "Remove the selected object"
msgstr "Rimuovi l'oggetto selezionato"
-#: src/slic3r/GUI/ConfigWizard.cpp:453
+#: src/slic3r/GUI/ConfigWizard.cpp:456
msgid "Remove user profiles (a snapshot will be taken beforehand)"
msgstr "Rimuovere i profili utente (verrà effettuata un'istantanea prima di procedere)"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1636
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1765
msgid "Rename"
msgstr "Rinomina"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:589
msgid "Rename Object"
msgstr "Rinomina oggetto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:589
msgid "Rename Sub-object"
msgstr "Rinomina sotto-oggetto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3803
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4266
msgid "Renaming"
msgstr "Rinomina"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:115
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:150
msgid "Renaming of the G-code after copying to the selected destination folder has failed. Current path is %1%.tmp. Please try exporting again."
msgstr "Non è stato possibile rinominare il G-code dopo la copia nella cartella di destinazione selezionata. Il percorso corrente è %1%.tmp. Prova a esportare di nuovo."
-#: src/libslic3r/PrintConfig.cpp:3515
+#: src/slic3r/GUI/Preferences.cpp:255
+msgid "Render"
+msgstr "Render"
+
+#: src/libslic3r/PrintConfig.cpp:3720
msgid "Render with a software renderer"
msgstr "Eseguire il rendering con un software redender"
-#: src/libslic3r/PrintConfig.cpp:3516
+#: src/libslic3r/PrintConfig.cpp:3721
msgid "Render with a software renderer. The bundled MESA software renderer is loaded instead of the default OpenGL driver."
msgstr "Eseguire il rendering con un software redender. Viene caricato il software di rendering MESA integrato al posto del driver OpenGL predefinito ."
-#: src/slic3r/GUI/MainFrame.cpp:911 src/libslic3r/PrintConfig.cpp:3447
+#: src/slic3r/GUI/MainFrame.cpp:1612 src/libslic3r/PrintConfig.cpp:3646
msgid "Repair"
msgstr "Ripara"
@@ -5902,38 +7144,38 @@ msgstr "Il file 3MF non contiene alcun volume"
msgid "Repairing model by the Netfabb service"
msgstr "Riparare modello tramite servizio Netfabb"
-#: src/slic3r/GUI/MainFrame.cpp:524
+#: src/slic3r/GUI/MainFrame.cpp:1125
msgid "Repeat last quick slice"
msgstr "Ripeti l'ultimo slice veloce"
-#: src/slic3r/GUI/MainFrame.cpp:524
+#: src/slic3r/GUI/MainFrame.cpp:1125
msgid "Repeat Last Quick Slice"
msgstr "Ripeti l'ultimo slice veloce"
-#: src/slic3r/GUI/Tab.cpp:3083
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:477
msgid "Replace?"
msgstr "Sostituire?"
-#: src/slic3r/GUI/MainFrame.cpp:703
+#: src/slic3r/GUI/MainFrame.cpp:928 src/slic3r/GUI/MainFrame.cpp:1327
msgid "Report an I&ssue"
msgstr "&Segnala un problema"
-#: src/slic3r/GUI/MainFrame.cpp:703
+#: src/slic3r/GUI/MainFrame.cpp:928 src/slic3r/GUI/MainFrame.cpp:1327
#, possible-c-format
msgid "Report an issue on %s"
msgstr "Segnala un problema su %s"
-#: src/slic3r/Utils/PresetUpdater.cpp:713
+#: src/slic3r/Utils/PresetUpdater.cpp:733
#, possible-c-format
msgid "requires max. %s"
msgstr "richiede max. %s"
-#: src/slic3r/Utils/PresetUpdater.cpp:710
+#: src/slic3r/Utils/PresetUpdater.cpp:730
#, possible-c-format
msgid "requires min. %s"
msgstr "richiede min. %s"
-#: src/slic3r/Utils/PresetUpdater.cpp:705
+#: src/slic3r/Utils/PresetUpdater.cpp:726
#, possible-c-format
msgid "requires min. %s and max. %s"
msgstr "richiede min. %s e max. %s"
@@ -5942,270 +7184,304 @@ msgstr "richiede min. %s e max. %s"
msgid "Rescan"
msgstr "Ri-scansiona"
-#: src/slic3r/GUI/Tab.cpp:1906
-msgid "Rescan serial ports"
-msgstr "Scansiona nuovamente porte seriali"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:313
+#: src/slic3r/GUI/GLCanvas3D.cpp:299
msgid "Reset"
msgstr "Reimposta"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1373
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220
msgid "Reset clipping plane"
-msgstr "Ripristina piano di ritaglio"
+msgstr "Ripristina piano sezione"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:59
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:26
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58
msgid "Reset direction"
msgstr "Reset direzione"
-#: src/slic3r/GUI/Plater.cpp:2723
+#: src/slic3r/GUI/Plater.cpp:2684
msgid "Reset Project"
msgstr "Reimposta Progetto"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:372
msgid "Reset rotation"
msgstr "Reimposta rotazione"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:394
msgid "Reset Rotation"
msgstr "Reimposta rotazione"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:397
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:407
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409
msgid "Reset scale"
msgstr "Reimposta scala"
-#: src/slic3r/GUI/GLCanvas3D.cpp:252
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:136
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:118
+msgid "Reset selection"
+msgstr "Reset selezione"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:243
msgid "Reset to base"
msgstr "Ripristina alla base"
-#: src/slic3r/GUI/Tab.cpp:2394
+#: src/slic3r/GUI/Tab.cpp:2564
msgid "Reset to Filament Color"
msgstr "Ripristina colore Filamento"
-#: src/libslic3r/PrintConfig.cpp:1511
+#: src/libslic3r/PrintConfig.cpp:1619
msgid "Resolution"
msgstr "Risoluzione"
-#: src/libslic3r/PrintConfig.cpp:1529
+#: src/libslic3r/PrintConfig.cpp:1637
msgid "Retract amount before wipe"
msgstr "Retrai la quantità prima di pulire"
-#: src/libslic3r/PrintConfig.cpp:1537
+#: src/libslic3r/PrintConfig.cpp:1645
msgid "Retract on layer change"
msgstr "Retrai al cambio layer"
-#: src/slic3r/GUI/Tab.cpp:1324 src/slic3r/GUI/Tab.cpp:1383
-#: src/slic3r/GUI/Tab.cpp:2370
+#: src/slic3r/GUI/GCodeViewer.cpp:2494 src/slic3r/GUI/Tab.cpp:1670
+#: src/slic3r/GUI/Tab.cpp:2539
msgid "Retraction"
msgstr "Retrazione"
-#: src/libslic3r/PrintConfig.cpp:1523
+#: src/libslic3r/PrintConfig.cpp:1631
msgid "Retraction is not triggered when travel moves are shorter than this length."
msgstr "La retrazione non è attivata quando i movimenti di spostamento sono più brevi di questa lunghezza."
-#: src/libslic3r/PrintConfig.cpp:1544
+#: src/libslic3r/PrintConfig.cpp:1652
msgid "Retraction Length"
msgstr "Lunghezza Retrazione"
-#: src/libslic3r/PrintConfig.cpp:1552
+#: src/libslic3r/PrintConfig.cpp:1660
msgid "Retraction Length (Toolchange)"
msgstr "Lunghezza Retrazione (cambio attrezzo)"
-#: src/libslic3r/PrintConfig.cpp:1604 src/libslic3r/PrintConfig.cpp:1605
+#: src/libslic3r/PrintConfig.cpp:1712 src/libslic3r/PrintConfig.cpp:1713
msgid "Retraction Speed"
msgstr "Velocità di retrazione"
-#: src/slic3r/GUI/Tab.cpp:2386
+#: src/slic3r/GUI/Tab.cpp:2555
msgid "Retraction when tool is disabled (advanced settings for multi-extruder setups)"
msgstr "Retrazione quando l'attrezzo è disabilitato (impostazioni avanzate per setup multi-estrusore)"
-#: src/slic3r/GUI/GUI_Preview.cpp:254
+#: src/slic3r/GUI/GCodeViewer.cpp:2528 src/slic3r/GUI/GUI_Preview.cpp:336
+#: src/slic3r/GUI/GUI_Preview.cpp:1472
msgid "Retractions"
msgstr "Retrazioni"
-#: src/slic3r/GUI/MainFrame.cpp:673
+#: src/slic3r/GUI/Preferences.cpp:198
+msgid "Reverse direction of zoom with mouse wheel"
+msgstr "Inversione della direzione dello zoom con la rotella del mouse"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1861 src/slic3r/GUI/Plater.cpp:4886
+msgid "Revert conversion from imperial units"
+msgstr "Invertire la conversione dalle unità imperiali"
+
+#: src/slic3r/GUI/MainFrame.cpp:970 src/slic3r/GUI/MainFrame.cpp:1290
msgid "Right"
msgstr "Destra"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:402
+#: src/slic3r/GUI/GUI_ObjectList.cpp:449
msgid "Right button click the icon to change the object printable property"
msgstr "Fare clic con il pulsante destro del mouse sull'icona per modificare le proprietà dell'oggetto stampabile"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:396
+#: src/slic3r/GUI/GUI_ObjectList.cpp:443
msgid "Right button click the icon to change the object settings"
msgstr "Click destro sull'icona per cambiare le impostazioni dell'oggetto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:359
+#: src/slic3r/GUI/GUI_ObjectList.cpp:406
msgid "Right button click the icon to fix STL through Netfabb"
msgstr "Click destro sull'icona per riparare il file STL tramite Netfabb"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211
msgid "Right click"
msgstr "Click destro"
-#: src/slic3r/GUI/GLCanvas3D.cpp:243
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31
+msgid "Right mouse button"
+msgstr "Tasto destro mouse"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:237
msgid "Right mouse button:"
msgstr "Tasto destro mouse:"
-#: src/slic3r/GUI/MainFrame.cpp:673
+#: src/slic3r/GUI/MainFrame.cpp:970 src/slic3r/GUI/MainFrame.cpp:1290
msgid "Right View"
msgstr "Vista destra"
-#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:449
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:480
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:499
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:517
-#: src/libslic3r/PrintConfig.cpp:3451
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:513
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:527
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562
+#: src/libslic3r/PrintConfig.cpp:3650
msgid "Rotate"
msgstr "Ruota"
-#: src/libslic3r/PrintConfig.cpp:3456
+#: src/libslic3r/PrintConfig.cpp:3655
msgid "Rotate around X"
msgstr "Ruota attorno ad X"
-#: src/libslic3r/PrintConfig.cpp:3461
+#: src/libslic3r/PrintConfig.cpp:3660
msgid "Rotate around Y"
msgstr "Ruota attorno ad Y"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:172
msgid "Rotate lower part upwards"
msgstr "Capovolgi la parte inferiore"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
msgid "Rotate selection 45 degrees CCW"
msgstr "Ruota la selezione di 45° in senso antiorario"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
msgid "Rotate selection 45 degrees CW"
msgstr "Ruota la selezione di 45° in senso orario"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:458
-#: src/slic3r/GUI/Mouse3DController.cpp:304
-#: src/slic3r/GUI/Mouse3DController.cpp:321
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:210
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:224
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:506
+#: src/slic3r/GUI/Mouse3DController.cpp:288
+#: src/slic3r/GUI/Mouse3DController.cpp:309
msgid "Rotation"
msgstr "Rotazione"
-#: src/libslic3r/PrintConfig.cpp:3457
+#: src/libslic3r/PrintConfig.cpp:3656
msgid "Rotation angle around the X axis in degrees."
msgstr "Angolo di rotazione attorno all'asse X in gradi."
-#: src/libslic3r/PrintConfig.cpp:3462
+#: src/libslic3r/PrintConfig.cpp:3661
msgid "Rotation angle around the Y axis in degrees."
msgstr "Angolo di rotazione sull'asse Y in gradi."
-#: src/libslic3r/PrintConfig.cpp:3452
+#: src/libslic3r/PrintConfig.cpp:3651
msgid "Rotation angle around the Z axis in degrees."
msgstr "Angolo di rotazione attorno all'asse Z in gradi."
-#: src/slic3r/GUI/GUI_App.cpp:797
+#: src/slic3r/GUI/DoubleSlider.cpp:1836
+msgid "Ruler mode"
+msgstr "Modalità righello"
+
+#: src/slic3r/GUI/GUI_App.cpp:1474
#, possible-c-format
msgid "Run %s"
msgstr "Run %s"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:128
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:478
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:163
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:520
msgid "Running post-processing scripts"
msgstr "Esecuzione script di post produzione"
#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83
-#: src/libslic3r/PrintConfig.cpp:644 src/libslic3r/PrintConfig.cpp:688
-#: src/libslic3r/PrintConfig.cpp:703 src/libslic3r/PrintConfig.cpp:2408
-#: src/libslic3r/PrintConfig.cpp:2417 src/libslic3r/PrintConfig.cpp:2527
-#: src/libslic3r/PrintConfig.cpp:2535 src/libslic3r/PrintConfig.cpp:2543
-#: src/libslic3r/PrintConfig.cpp:2550 src/libslic3r/PrintConfig.cpp:2558
-#: src/libslic3r/PrintConfig.cpp:2566
+#: src/libslic3r/PrintConfig.cpp:680 src/libslic3r/PrintConfig.cpp:724
+#: src/libslic3r/PrintConfig.cpp:739 src/libslic3r/PrintConfig.cpp:2551
+#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2670
+#: src/libslic3r/PrintConfig.cpp:2678 src/libslic3r/PrintConfig.cpp:2686
+#: src/libslic3r/PrintConfig.cpp:2693 src/libslic3r/PrintConfig.cpp:2701
+#: src/libslic3r/PrintConfig.cpp:2709
msgid "s"
msgstr "s"
-#: src/slic3r/GUI/MainFrame.cpp:481 src/slic3r/GUI/MainFrame.cpp:750
+#: src/slic3r/GUI/MainFrame.cpp:1072 src/slic3r/GUI/MainFrame.cpp:1449
msgid "S&end G-code"
msgstr "Invia G-cod&e"
-#: src/slic3r/GUI/MainFrame.cpp:750
+#: src/slic3r/GUI/MainFrame.cpp:1449
msgid "S&end to print"
msgstr "Manda in stampa"
-#. TRN Preset
-#: src/slic3r/GUI/Tab.cpp:3417
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:642
+msgid "Save"
+msgstr "Salva"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:72
#, possible-c-format
msgid "Save %s as:"
msgstr "Salva %s come:"
-#: src/slic3r/GUI/MainFrame.cpp:826
+#: src/slic3r/GUI/MainFrame.cpp:1527
#, possible-c-format
msgid "Save %s file as:"
msgstr "Salva file %s come:"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1046
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912
msgid "Save changes?"
msgstr "Salvare modifiche?"
-#: src/libslic3r/PrintConfig.cpp:3386
+#: src/libslic3r/PrintConfig.cpp:3585
msgid "Save config file"
msgstr "Salva file config"
-#: src/slic3r/GUI/MainFrame.cpp:925
+#: src/slic3r/GUI/MainFrame.cpp:1626
msgid "Save configuration as:"
msgstr "Salva configurazione come:"
-#: src/libslic3r/PrintConfig.cpp:3387
+#: src/libslic3r/PrintConfig.cpp:3586
msgid "Save configuration to the specified file."
msgstr "Salva configurazione nel file specificato."
#. TRN "Save current Settings"
-#: src/slic3r/GUI/Tab.cpp:133
+#: src/slic3r/GUI/Tab.cpp:203
#, possible-c-format
msgid "Save current %s"
msgstr "Salva le %s attuali"
-#: src/slic3r/GUI/MainFrame.cpp:446
+#: src/slic3r/GUI/MainFrame.cpp:1028
msgid "Save current project file"
msgstr "Salva progetto corrente"
-#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452
+#: src/slic3r/GUI/MainFrame.cpp:1032 src/slic3r/GUI/MainFrame.cpp:1034
msgid "Save current project file as"
msgstr "Salvare il file del progetto corrente come"
-#: src/slic3r/GUI/Plater.cpp:2604
+#: src/slic3r/GUI/Plater.cpp:2566
msgid "Save file as:"
msgstr "Salva come:"
-#: src/slic3r/GUI/Plater.cpp:4839
+#: src/slic3r/GUI/Plater.cpp:4975
msgid "Save G-code file as:"
msgstr "Salva il file G-code come:"
-#: src/slic3r/GUI/MainFrame.cpp:899
+#: src/slic3r/GUI/MainFrame.cpp:1600
msgid "Save OBJ file (less prone to coordinate errors than STL) as:"
msgstr "Salva il file OBJ (meno soggetto a errori di coordinate dell'STL) come:"
-#: src/slic3r/GUI/Tab.hpp:443
+#: src/slic3r/GUI/SavePresetDialog.cpp:190
+#: src/slic3r/GUI/SavePresetDialog.cpp:196
msgid "Save preset"
msgstr "Salva preset"
-#: src/slic3r/GUI/MainFrame.cpp:980
+#: src/slic3r/GUI/MainFrame.cpp:1681
msgid "Save presets bundle as:"
msgstr "Salva il gruppo di preset come:"
-#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452
+#: src/slic3r/GUI/MainFrame.cpp:1032 src/slic3r/GUI/MainFrame.cpp:1034
msgid "Save Project &as"
msgstr "Salv&a Progetto come"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:114
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:107
msgid "Save project (3mf)"
msgstr "Salva progetto (3mf)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:115
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:108
msgid "Save project as (3mf)"
msgstr "Salva progetto come (3mf)"
-#: src/slic3r/GUI/Plater.cpp:4839
+#: src/slic3r/GUI/Plater.cpp:4975
msgid "Save SL1 file as:"
msgstr "Salva file SL1 come:"
-#: src/slic3r/GUI/MainFrame.cpp:838
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:744
+msgid "Save the selected options to preset \"%1%\"."
+msgstr "Salva le opzioni selezionate nel preset \"%1%\"."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:740
+msgid "Save the selected options."
+msgstr "Salvare le opzioni selezionate."
+
+#: src/slic3r/GUI/MainFrame.cpp:1539
msgid "Save zip file as:"
msgstr "Salva file zip come:"
@@ -6215,211 +7491,244 @@ msgstr "Salva file zip come:"
msgid "Saving mesh into the 3MF container failed."
msgstr "Il salvataggio della rete nel contenitore 3MF non è riuscito."
-#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:47
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:230
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:500
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:518
-#: src/libslic3r/PrintConfig.cpp:3466
+#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:78
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:238
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:547
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563
+#: src/libslic3r/PrintConfig.cpp:3665
msgid "Scale"
msgstr "Ridimensiona"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:459
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:507
msgid "Scale factors"
msgstr "Fattore di scala"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:196
-msgid "Scale selection to fit print volume\nin Gizmo scale"
-msgstr "Ridimensiona la selezione per riempire il volume di stampa\nnel Gizmo Ridimensiona"
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1724
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1852
msgid "Scale the selected object to fit the print volume"
msgstr "Ridimensiona l'oggetto selezionato per entrare nel volume di stampa"
-#: src/libslic3r/PrintConfig.cpp:3475
+#: src/libslic3r/PrintConfig.cpp:3674
msgid "Scale to Fit"
msgstr "Ridimensiona per riempire"
-#: src/slic3r/GUI/Selection.cpp:939
+#: src/slic3r/GUI/Selection.cpp:988
msgid "Scale To Fit"
msgstr "Ridimensiona per adattare"
-#: src/libslic3r/PrintConfig.cpp:3476
+#: src/libslic3r/PrintConfig.cpp:3675
msgid "Scale to fit the given volume."
msgstr "Ridimensiona per adattare al volume dato."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1724
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1852
msgid "Scale to print volume"
msgstr "Ridimensiona a volume di stampa"
-#: src/libslic3r/PrintConfig.cpp:3467
+#: src/libslic3r/PrintConfig.cpp:3666
msgid "Scaling factor or percentage."
msgstr "Fattore di scala o percentuale."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:505
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:545
msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue"
msgstr "Programmazione del caricamento su `%1%`. Vedere finestra -> Coda di caricamento Host di Stampa"
-#: src/libslic3r/PrintConfig.cpp:1621
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:46
+msgid "Seam painting"
+msgstr "Pittura giunzione"
+
+#: src/libslic3r/PrintConfig.cpp:1729
msgid "Seam position"
-msgstr "Posizione giunzioni"
+msgstr "Posizione giunzione"
-#: src/libslic3r/PrintConfig.cpp:1642
+#: src/libslic3r/PrintConfig.cpp:1750
msgid "Seam preferred direction"
msgstr "Direzione preferita giunzione"
-#: src/libslic3r/PrintConfig.cpp:1651
+#: src/libslic3r/PrintConfig.cpp:1759
msgid "Seam preferred direction jitter"
msgstr "Direzione preferita giunzione jitter"
+#: src/slic3r/GUI/MainFrame.cpp:1207
+msgid "Searc&h"
+msgstr "Cerca"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4402 src/slic3r/GUI/GLCanvas3D.cpp:4957
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 src/slic3r/GUI/Search.cpp:426
+msgid "Search"
+msgstr "Cerca"
+
+#: src/slic3r/GUI/ImGuiWrapper.cpp:803 src/slic3r/GUI/Search.cpp:460
+msgid "Search in English"
+msgstr "Cerca in inglese"
+
+#: src/slic3r/GUI/MainFrame.cpp:1216
+msgid "Search in settings"
+msgstr "Cerca nelle impostazioni"
+
+#: src/slic3r/GUI/Tab.cpp:222
+msgid "Search in settings [%1%]"
+msgstr "Cerca nelle impostazioni [%1%]"
+
#: src/slic3r/GUI/BonjourDialog.cpp:218
msgid "Searching for devices"
msgstr "Ricerca dispositivi"
-#: src/slic3r/GUI/Plater.cpp:2858
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:41
msgid "Searching for optimal orientation"
msgstr "Ricerca orientamento ottimale"
-#: src/slic3r/GUI/GUI_App.cpp:1103
+#: src/slic3r/GUI/NotificationManager.hpp:321
+msgid "See more."
+msgstr "Vedi altro."
+
+#: src/slic3r/GUI/NotificationManager.hpp:322
+msgid "See Releases page."
+msgstr "Vedi la pagina dei rilasci."
+
+#: src/slic3r/GUI/GUI_App.cpp:1895
msgid "Select a gcode file:"
msgstr "Seleziona un file gcode:"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:126
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:121
msgid "Select all objects"
msgstr "Seleziona tutti gli oggetti"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1370
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217
msgid "Select all points"
msgstr "Seleziona tutti i punti"
-#: src/slic3r/GUI/ConfigWizard.cpp:1976
+#: src/slic3r/GUI/ConfigWizard.cpp:2487
msgid "Select all standard printers"
msgstr "Seleziona tutte le stampanti standard"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1368
+#: src/slic3r/GUI/Plater.cpp:1422
+msgid "Select an action to apply to the file"
+msgstr "Seleziona un'azione da applicare al file"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215
msgid "Select by rectangle"
msgstr "Seleziona con rettangolo"
-#: src/slic3r/GUI/MainFrame.cpp:944 src/slic3r/GUI/MainFrame.cpp:1006
+#: src/slic3r/GUI/MainFrame.cpp:1645 src/slic3r/GUI/MainFrame.cpp:1707
msgid "Select configuration to load:"
msgstr "Seleziona configurazione da caricare:"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:82
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:88
msgid "Select coordinate space, in which the transformation will be performed."
msgstr "Seleziona le coordinate spaziali in cui verrà eseguita la trasformazione."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3971
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4458
msgid "Select extruder number:"
msgstr "Seleziona l'estrusore numero:"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:138
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:134
msgid "Select Filament Settings Tab"
msgstr "Attiva Scheda impostazioni di Filamento"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:136
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:132
msgid "Select Plater Tab"
msgstr "Seleziona scheda piano"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:137
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:133
msgid "Select Print Settings Tab"
msgstr "Attiva Scheda Impostazioni di Stampa"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:139
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:135
msgid "Select Printer Settings Tab"
msgstr "Attiva Scheda Impostazioni Stampante"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1265
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1396
msgid "Select showing settings"
msgstr "Seleziona le impostazioni mostrate"
-#: src/slic3r/GUI/GUI_App.cpp:629
+#: src/slic3r/GUI/GUI_App.cpp:1295
msgid "Select the language"
msgstr "Seleziona la lingua"
-#: src/slic3r/GUI/Tab.cpp:57
+#: src/slic3r/GUI/Tab.cpp:108
msgid "Select the print profiles this profile is compatible with."
msgstr "Seleziona i profili di stampa compatibili con questo profilo."
-#: src/slic3r/GUI/Tab.cpp:51
+#: src/slic3r/GUI/Tab.cpp:102
msgid "Select the printers this profile is compatible with."
msgstr "Seleziona le stampanti compatibili con questo profilo."
-#: src/slic3r/GUI/MainFrame.cpp:889
+#: src/slic3r/GUI/MainFrame.cpp:1590
msgid "Select the STL file to repair:"
msgstr "Seleziona il file STL da riparare:"
-#: src/slic3r/GUI/Preferences.cpp:237
+#: src/slic3r/GUI/Preferences.cpp:391
msgid "Select toolbar icon size in respect to the default one."
msgstr "Seleziona la dimensione delle icone della barra degli strumenti rispetto a quella predefinita."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3553
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4016
msgid "Select type of part"
msgstr "Seleziona il tipo di parte"
-#: src/slic3r/GUI/Plater.cpp:638
+#: src/slic3r/GUI/Plater.cpp:504
msgid "Select what kind of pad do you need"
msgstr "Seleziona il tipo di Pad richiesto"
-#: src/slic3r/GUI/Plater.cpp:498
+#: src/slic3r/GUI/Plater.cpp:364
msgid "Select what kind of support do you need"
msgstr "Seleziona il tipo di supporto richiesto"
-#: src/slic3r/GUI/DoubleSlider.cpp:1917
+#: src/slic3r/GUI/DoubleSlider.cpp:2135
msgid "Select YES if you want to delete all saved tool changes, \nNO if you want all tool changes switch to color changes, \nor CANCEL to leave it unchanged."
msgstr "Seleziona SI se vuoi cancellare tutti i cambi attrezzo salvati,\nNO se vuoi che tutti i cambi attrezzo passino a cambi colore,\no ANNULLA per lasciarlo invariato."
-#: src/slic3r/GUI/Selection.cpp:146
+#: src/slic3r/GUI/Selection.cpp:191
msgid "Selection-Add"
msgstr "Selezione-Aggiungi"
-#: src/slic3r/GUI/Selection.cpp:376
+#: src/slic3r/GUI/Selection.cpp:421
msgid "Selection-Add All"
msgstr "Selezione-Aggiungi tutti"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3299
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3762
msgid "Selection-Add from list"
msgstr "Aggiungi selezione da elenco"
-#: src/slic3r/GUI/GLCanvas3D.cpp:6598
+#: src/slic3r/GUI/GLCanvas3D.cpp:7193
msgid "Selection-Add from rectangle"
msgstr "Aggiungi Selezione da rettangolo"
-#: src/slic3r/GUI/Selection.cpp:256
+#: src/slic3r/GUI/Selection.cpp:301
msgid "Selection-Add Instance"
msgstr "Selezione-Aggiungi istanza"
-#: src/slic3r/GUI/Selection.cpp:219
+#: src/slic3r/GUI/Selection.cpp:264
msgid "Selection-Add Object"
msgstr "Selezione-Aggiungi Oggetto"
-#: src/slic3r/GUI/Selection.cpp:187
+#: src/slic3r/GUI/Selection.cpp:232
msgid "Selection-Remove"
msgstr "Selezione-Rimuovi"
-#: src/slic3r/GUI/Selection.cpp:402
+#: src/slic3r/GUI/Selection.cpp:447
msgid "Selection-Remove All"
msgstr "Selezione-Rimuovi tutti"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3291
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3754
msgid "Selection-Remove from list"
msgstr "Rimozione Selezione dall'elenco"
-#: src/slic3r/GUI/GLCanvas3D.cpp:6617
+#: src/slic3r/GUI/GLCanvas3D.cpp:7212
msgid "Selection-Remove from rectangle"
msgstr "Rimuovi selezione da rettangolo"
-#: src/slic3r/GUI/Selection.cpp:275
+#: src/slic3r/GUI/Selection.cpp:320
msgid "Selection-Remove Instance"
msgstr "Selezione-Rimuovi istanza"
-#: src/slic3r/GUI/Selection.cpp:238
+#: src/slic3r/GUI/Selection.cpp:283
msgid "Selection-Remove Object"
msgstr "Selezione-Rimuovi oggetto"
-#: src/slic3r/GUI/MainFrame.cpp:566
+#: src/slic3r/GUI/MainFrame.cpp:1172
msgid "Selects all objects"
msgstr "Seleziona tutti gli oggetti"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Plater.cpp:5522
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 src/slic3r/GUI/Plater.cpp:5707
msgid "Send G-code"
msgstr "Invia G-code"
@@ -6427,29 +7736,25 @@ msgstr "Invia G-code"
msgid "Send G-Code to printer host"
msgstr "Invia G-code all’host stampante"
-#: src/slic3r/GUI/MainFrame.cpp:481
+#: src/slic3r/GUI/MainFrame.cpp:1072
msgid "Send to print current plate as G-code"
msgstr "Manda alla stampante il piano corrente come G-Code"
-#: src/slic3r/GUI/Plater.cpp:878 src/slic3r/GUI/Plater.cpp:5522
+#: src/slic3r/GUI/Plater.cpp:753 src/slic3r/GUI/Plater.cpp:5707
msgid "Send to printer"
msgstr "Manda alla stampante"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1305
+#: src/slic3r/GUI/GLCanvas3D.cpp:1312
msgid "Seq."
msgstr "Seq."
-#: src/slic3r/GUI/Tab.cpp:1231
+#: src/slic3r/GUI/Tab.cpp:1561
msgid "Sequential printing"
msgstr "Stampa sequenziale"
-#: src/slic3r/GUI/Tab.cpp:1901 src/libslic3r/PrintConfig.cpp:1661
-msgid "Serial port"
-msgstr "Porta seriale"
-
-#: src/libslic3r/PrintConfig.cpp:1669
-msgid "Serial port speed"
-msgstr "Velocità porta seriale"
+#: src/slic3r/GUI/Preferences.cpp:230
+msgid "Sequential slider applied only to top layer"
+msgstr "Cursore sequenziale applicato solo sullo strato superiore"
#: src/slic3r/GUI/FirmwareDialog.cpp:807
msgid "Serial port:"
@@ -6459,17 +7764,16 @@ msgstr "Porta seriale:"
msgid "Service name"
msgstr "Nome servizio"
-#: src/slic3r/GUI/Tab.cpp:1802 src/slic3r/GUI/Tab.cpp:2046
-#: src/slic3r/GUI/Tab.cpp:3176
+#: src/slic3r/GUI/Tab.cpp:3509 src/slic3r/GUI/Tab.cpp:3588
msgid "Set"
msgstr "Imposta"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1599
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1611
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1728
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1740
msgid "Set as a Separated Object"
msgstr "Imposta come Oggetto Separato"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1611
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1740
msgid "Set as a Separated Objects"
msgstr "Imposta come Oggetti Separati"
@@ -6477,7 +7781,7 @@ msgstr "Imposta come Oggetti Separati"
msgid "Set extruder change for every"
msgstr "Imposta il cambio estrusore per ogni"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1671
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1800
msgid "Set extruder for selected items"
msgstr "Imposta estrusore per gli elementi selezionati"
@@ -6485,7 +7789,7 @@ msgstr "Imposta estrusore per gli elementi selezionati"
msgid "Set extruder sequence"
msgstr "Imposta sequenza estrusore"
-#: src/slic3r/GUI/DoubleSlider.cpp:1532
+#: src/slic3r/GUI/DoubleSlider.cpp:1728
msgid "Set extruder sequence for the entire print"
msgstr "Imposta sequenza estrusore per l'intera stampa"
@@ -6493,84 +7797,100 @@ msgstr "Imposta sequenza estrusore per l'intera stampa"
msgid "Set extruder(tool) sequence"
msgstr "Imposta sequenza estrusore(attrezzo)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:243
+msgid "Set left thumb as active"
+msgstr "Imposta cursore sinistro come attivo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
+msgid "Set lower thumb as active"
+msgstr "Imposta cursore inferiore come attivo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
msgid "Set lower thumb to current slider thumb"
msgstr "Imposta il cursore inferiore alla barra di scorrimento attuale"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:297
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:305
msgid "Set Mirror"
msgstr "Imposta specchio"
-#: src/slic3r/GUI/Plater.cpp:3944
+#: src/slic3r/GUI/Plater.cpp:3862
msgid "Set number of instances"
msgstr "Imposta numero di istanze"
-#: src/slic3r/GUI/Plater.cpp:4756
+#: src/slic3r/GUI/Plater.cpp:4860
#, possible-c-format
msgid "Set numbers of copies to %d"
msgstr "Imposta il numero di copie a %d"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:781
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:828
msgid "Set Orientation"
msgstr "Imposta orientamento"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:750
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:797
msgid "Set Position"
msgstr "Imposta posizione"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4581 src/slic3r/GUI/Selection.cpp:1513
msgid "Set Printable"
msgstr "Imposta stampabile"
-#: src/slic3r/GUI/Selection.cpp:1475
+#: src/slic3r/GUI/Selection.cpp:1515
msgid "Set Printable Instance"
msgstr "Imposta Istanza Stampabile"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:846
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:244
+msgid "Set right thumb as active"
+msgstr "Imposta cursore destro come attivo"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1836
+msgid "Set ruler mode"
+msgstr "Imposta la modalità righello"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:893
msgid "Set Scale"
msgstr "Imposta scala"
-#: src/libslic3r/PrintConfig.cpp:2393
+#: src/libslic3r/PrintConfig.cpp:2536
msgid "Set the actual LCD display orientation inside the SLA printer. Portrait mode will flip the meaning of display width and height parameters and the output images will be rotated by 90 degrees."
msgstr "Imposta l'orientamento effettivo del display LCD nella stampante SLA. La modalità Ritratto invertirà i valori di altezza e larghezza del display, e le immagini di output saranno ruotate di 90 gradi."
-#: src/slic3r/GUI/ConfigWizard.cpp:932
+#: src/slic3r/GUI/ConfigWizard.cpp:1298
msgid "Set the shape of your printer's bed."
msgstr "Imposta la dimensione del piano della stampante."
-#: src/libslic3r/PrintConfig.cpp:556
+#: src/libslic3r/PrintConfig.cpp:592
msgid "Set this to a non-zero value to allow a manual extrusion width. If left to zero, Slic3r derives extrusion widths from the nozzle diameter (see the tooltips for perimeter extrusion width, infill extrusion width etc). If expressed as percentage (for example: 230%), it will be computed over layer height."
msgstr "Imposta questo valore diverso da zero per permettere la larghezza estrusione manuale. Se lasciato a zero, Slic3r ricava la larghezza d'estrusione dal diametro dell'ugello (vedi il suggerimento per la larghezza di estrusione perimetro,larghezza estrusione riempimento ecc.). Se espresso in percentuale (ad esempio 230%), sarà calcolato sull'altezza del layer."
-#: src/libslic3r/PrintConfig.cpp:448
+#: src/libslic3r/PrintConfig.cpp:484
msgid "Set this to a non-zero value to set a manual extrusion width for external perimeters. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 200%), it will be computed over layer height."
msgstr "Imposta questo valore diverso da zero per impostare una larghezza d'estrusione manuale per i perimetri esterni. Se lasciato a zero, verrà utilizzata la larghezza predefinita se impostata; diversamente verrà utilizzato il valore 1.125 x il diametro dell'ugello. Se espresso in percentuale (per esempio 200%), sarà calcolato sull'altezza del layer."
-#: src/libslic3r/PrintConfig.cpp:878
+#: src/libslic3r/PrintConfig.cpp:920
msgid "Set this to a non-zero value to set a manual extrusion width for first layer. You can use this to force fatter extrudates for better adhesion. If expressed as percentage (for example 120%) it will be computed over first layer height. If set to zero, it will use the default extrusion width."
msgstr "Imposta questo valore diverso da zero per impostare la larghezza di estrusione manuale per il primo layer. Puoi usarlo per forzare un'estrusione più grossa per avere un'adesione migliore. Se espresso in percentuale (per esempio 120%) sarà calcolato sull'altezza del primo layer. Se impostato a zero, sarà utilizzata la larghezza di estrusione predefinita."
-#: src/libslic3r/PrintConfig.cpp:1758
+#: src/libslic3r/PrintConfig.cpp:1873
msgid "Set this to a non-zero value to set a manual extrusion width for infill for solid surfaces. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 90%) it will be computed over layer height."
msgstr "Imposta questo valore diverso da zero per impostare una larghezza d'estrusione manuale per il riempimento delle superfici solide. Se lasciato a zero, verrà usata la larghezza d'estrusione predefinita, altrimenti verrà utilizzato il valore 1.125 x il diametro dell'ugello. Se espresso in percentuale (per esempio 90%) verrà calcolato sull'altezza del layer."
-#: src/libslic3r/PrintConfig.cpp:2107
+#: src/libslic3r/PrintConfig.cpp:2250
msgid "Set this to a non-zero value to set a manual extrusion width for infill for top surfaces. You may want to use thinner extrudates to fill all narrow regions and get a smoother finish. If left zero, default extrusion width will be used if set, otherwise nozzle diameter will be used. If expressed as percentage (for example 90%) it will be computed over layer height."
msgstr "Imposta questo valore diverso da zero per impostare una larghezza d'estrusione manuale per il riempimento delle superfici superiori. Dovresti scegliere un'estrusione più sottile per riempire gli spazi stretti ed ottenere una finitura più liscia. Se lasciato a zero, verrà usata la larghezza d'estrusione predefinita, altrimenti verrà utilizzato il valore 1.125 x il diametro dell'ugello. Se espresso in percentuale (per esempio 90%) verrà calcolato sull'altezza del layer."
-#: src/libslic3r/PrintConfig.cpp:1011
+#: src/libslic3r/PrintConfig.cpp:1055
msgid "Set this to a non-zero value to set a manual extrusion width for infill. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. You may want to use fatter extrudates to speed up the infill and make your parts stronger. If expressed as percentage (for example 90%) it will be computed over layer height."
msgstr "Imposta questo valore diverso da zero per impostare una larghezza d'estrusione manuale per il riempimento. Se lasciato a zero, verrà usata la larghezza d'estrusione predefinita, altrimenti verrà utilizzato il valore 1.125 x il diametro dell'ugello. Dovresti usare un estrusione più grossa per velocizzare la stampa del riempimento e rendere le tue parti più robuste. Se espresso in percentuale (per esempio 90%) verrà calcolato sull'altezza del layer."
-#: src/libslic3r/PrintConfig.cpp:1419
+#: src/libslic3r/PrintConfig.cpp:1527
msgid "Set this to a non-zero value to set a manual extrusion width for perimeters. You may want to use thinner extrudates to get more accurate surfaces. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 200%) it will be computed over layer height."
msgstr "Imposta questo valore diverso da zero per impostare una larghezza d'estrusione manuale per i perimetri. Dovresti scegliere un'estrusione più sottile per ottenere superfici più precise. Se lasciato a zero, verrà usata la larghezza d'estrusione predefinita, altrimenti verrà utilizzato il valore 1.125 x il diametro dell'ugello. Se espresso in percentuale (per esempio 200%) verrà calcolato sull'altezza del layer."
-#: src/libslic3r/PrintConfig.cpp:1948
+#: src/libslic3r/PrintConfig.cpp:2090
msgid "Set this to a non-zero value to set a manual extrusion width for support material. If left zero, default extrusion width will be used if set, otherwise nozzle diameter will be used. If expressed as percentage (for example 90%) it will be computed over layer height."
msgstr "Imposta questo valore diverso da zero per impostare una larghezza d'estrusione manuale per il supporto. Se lasciato a zero, verrà usata la larghezza d'estrusione predefinita., altrimenti verrà utilizzato il valore del diametro dell'ugello. Se espresso in percentuale (per esempio 90%) verrà calcolato sull'altezza del layer."
-#: src/libslic3r/PrintConfig.cpp:512
+#: src/libslic3r/PrintConfig.cpp:548
msgid "Set this to the clearance radius around your extruder. If the extruder is not centered, choose the largest value for safety. This setting is used to check for collisions and to display the graphical preview in the plater."
msgstr "Imposta il raggio di spazio attorno all'estrusore. Se l'estrusore non è centrato, scegli il valore più grande per sicurezza. Questa impostazione è usata per controllare le collisioni e per mostrare l'anteprima grafica nel piano."
@@ -6578,83 +7898,98 @@ msgstr "Imposta il raggio di spazio attorno all'estrusore. Se l'estrusore non è
msgid "Set this to the maximum height that can be reached by your extruder while printing."
msgstr "Impostate alla massima altezza che può essere raggiunta dal vostro estrusore durante la stampa."
-#: src/libslic3r/PrintConfig.cpp:501
+#: src/libslic3r/PrintConfig.cpp:537
msgid "Set this to the vertical distance between your nozzle tip and (usually) the X carriage rods. In other words, this is the height of the clearance cylinder around your extruder, and it represents the maximum depth the extruder can peek before colliding with other printed objects."
msgstr "Imposta la distanza verticale tra la punta dell'ugello e (solitamente) le barre del carrello X. In altre parole, questa è l'altezza dello spazio cilindrico attorno l'estrusore, e indica la profondità massima che l'estrusore può affacciarsi prima di sbattere con altri oggetti stampati."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4581 src/slic3r/GUI/Selection.cpp:1513
msgid "Set Unprintable"
msgstr "Imposta non stampabile"
-#: src/slic3r/GUI/Selection.cpp:1475
+#: src/slic3r/GUI/Selection.cpp:1515
msgid "Set Unprintable Instance"
msgstr "Imposta Istanza non stampabile"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:221
+msgid "Set upper thumb as active"
+msgstr "Imposta cursore superiore come attivo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
msgid "Set upper thumb to current slider thumb"
msgstr "Imposta il cursore superiore alla barra di scorrimento attuale"
-#: src/libslic3r/PrintConfig.cpp:3509
+#: src/libslic3r/PrintConfig.cpp:3714
msgid "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:trace\nFor example. loglevel=2 logs fatal, error and warning level messages."
msgstr "Imposta la sensibilità di log. 0:fatale, 1:errore, 2:avviso, 3:informazioni, 4:debug, 5:traccia\nPer esempio. loglevel=2 registra messaggi fatali, di errore e di avviso."
-#: src/slic3r/GUI/BedShapeDialog.cpp:155
+#: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/MainFrame.cpp:1969
msgid "Settings"
msgstr "Impostazioni"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2507
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2899
msgid "Settings for height range"
msgstr "Impostazioni per intervallo altezza"
-#: src/slic3r/GUI/ConfigManipulation.cpp:162
+#: src/slic3r/GUI/Preferences.cpp:431
+msgid "Settings in non-modal window"
+msgstr "Impostazioni nella finestra non modale"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:161
msgid "Shall I adjust those settings for supports?"
msgstr "Vuoi che regoli queste impostazioni per i supporti?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:89
+#: src/slic3r/GUI/ConfigManipulation.cpp:88
msgid "Shall I adjust those settings in order to enable Spiral Vase?"
msgstr "Vuoi che modifichi queste impostazioni per poter attivare il Vaso a Spirale?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:119
+#: src/slic3r/GUI/ConfigManipulation.cpp:118
msgid "Shall I adjust those settings in order to enable the Wipe Tower?"
msgstr "Vuoi che modifichi queste impostazioni per poter attivare la Torre di Spurgo?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:210
+#: src/slic3r/GUI/ConfigManipulation.cpp:209
msgid "Shall I switch to rectilinear fill pattern?"
msgstr "Devo passare alla trama di riempimento rettilinea?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:139
+#: src/slic3r/GUI/ConfigManipulation.cpp:138
msgid "Shall I synchronize support layers in order to enable the Wipe Tower?"
msgstr "Devo sincronizzare i supporti layer in modo da poter attivare la Torre di Spurgo?"
-#: src/slic3r/GUI/BedShapeDialog.cpp:66 src/slic3r/GUI/GUI_ObjectList.cpp:2059
+#: src/slic3r/GUI/BedShapeDialog.cpp:156 src/slic3r/GUI/BedShapeDialog.cpp:222
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2215
msgid "Shape"
msgstr "Forma"
-#: src/slic3r/GUI/GUI_Preview.cpp:256
+#: src/slic3r/GUI/GUI_Preview.cpp:338 src/slic3r/GUI/GUI_Preview.cpp:1478
msgid "Shells"
msgstr "Gusci"
-#: src/slic3r/GUI/GLCanvas3D.cpp:249
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33
+msgid "Shift + Left mouse button"
+msgstr "Shift + Tasto sinistro mouse"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:241
msgid "Shift + Left mouse button:"
msgstr "Shift + Tasto sinistro mouse:"
-#: src/slic3r/GUI/GLCanvas3D.cpp:255
+#: src/slic3r/GUI/GLCanvas3D.cpp:245
msgid "Shift + Right mouse button:"
msgstr "Shift + Tasto destro mouse:"
-#: src/slic3r/GUI/GUI_Preview.cpp:231
+#: src/slic3r/GUI/GUI_Preview.cpp:286 src/slic3r/GUI/GUI_Preview.cpp:288
msgid "Show"
msgstr "Mostra"
-#: src/slic3r/GUI/MainFrame.cpp:701
+#: src/slic3r/GUI/MainFrame.cpp:926 src/slic3r/GUI/MainFrame.cpp:1325
msgid "Show &Configuration Folder"
msgstr "Mostra Cartella &Configurazione"
-#: src/slic3r/GUI/MainFrame.cpp:676
+#: src/slic3r/GUI/MainFrame.cpp:1294
msgid "Show &labels"
msgstr "Mostra &etichette"
-#: src/slic3r/GUI/MainFrame.cpp:705
+#: src/slic3r/GUI/MainFrame.cpp:933 src/slic3r/GUI/MainFrame.cpp:937
+#: src/slic3r/GUI/MainFrame.cpp:1329
msgid "Show about dialog"
msgstr "Mostra la finestra di informazioni"
@@ -6662,543 +7997,619 @@ msgstr "Mostra la finestra di informazioni"
msgid "Show advanced settings"
msgstr "Mostra impostazioni avanzate"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:159
+#: src/slic3r/GUI/Preferences.cpp:120
+msgid "Show drop project dialog"
+msgstr "Mostra la finestra di rilascio del progetto"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:157
msgid "Show error message"
msgstr "Mostra messaggio d'errore"
-#: src/slic3r/GUI/Preferences.cpp:95
+#: src/slic3r/GUI/DoubleSlider.cpp:1832
+msgid "Show estimated print time"
+msgstr "Mostra il tempo di stampa stimato"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1832
+msgid "Show estimated print time on the ruler"
+msgstr "Mostra il tempo di stampa stimato sul righello"
+
+#: src/slic3r/GUI/Preferences.cpp:112
msgid "Show incompatible print and filament presets"
msgstr "Mostra preset di stampa e di filamento incompatibili"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:151
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:145
msgid "Show keyboard shortcuts list"
msgstr "Mostra elenco scorciatoie di tastiera"
-#: src/slic3r/GUI/MainFrame.cpp:676
+#: src/slic3r/GUI/GCodeViewer.cpp:2591
+msgid "Show normal mode"
+msgstr "Mostra modalità normale"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1828
+msgid "Show object height"
+msgstr "Mostra l'altezza dell'oggetto"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1828
+msgid "Show object height on the ruler"
+msgstr "Mostra l'altezza dell'oggetto sul righello"
+
+#: src/slic3r/GUI/MainFrame.cpp:1294
msgid "Show object/instance labels in 3D scene"
msgstr "Mostra nella scena 3D le etichette dell'oggetto/istanza"
+#: src/slic3r/GUI/Preferences.cpp:213
+msgid "Show sidebar collapse/expand button"
+msgstr "Mostra il pulsante di riduci/espandi barra laterale"
+
#: src/slic3r/GUI/WipeTowerDialog.cpp:377
msgid "Show simplified settings"
msgstr "Mostra impostazioni semplificate"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:52
+#: src/slic3r/GUI/Preferences.cpp:169 src/slic3r/GUI/Preferences.cpp:171
+msgid "Show splash screen"
+msgstr "Mostra splash screen"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2586
+msgid "Show stealth mode"
+msgstr "Mostra modalità silenziosa"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51
msgid "Show supports"
msgstr "Mostra supporti"
-#: src/slic3r/GUI/MainFrame.cpp:699
+#: src/slic3r/GUI/MainFrame.cpp:924 src/slic3r/GUI/MainFrame.cpp:1323
msgid "Show system information"
msgstr "Mostra informazioni di sistema"
-#: src/slic3r/GUI/MainFrame.cpp:626
+#: src/slic3r/GUI/MainFrame.cpp:1234
msgid "Show the 3D editing view"
msgstr "Mostra la Vista modifica 3D"
-#: src/slic3r/GUI/MainFrame.cpp:629
+#: src/slic3r/GUI/MainFrame.cpp:1237
msgid "Show the 3D slices preview"
msgstr "Mostra anteprima slice 3D"
-#: src/slic3r/GUI/MainFrame.cpp:617
+#: src/slic3r/GUI/MainFrame.cpp:1224
msgid "Show the filament settings"
msgstr "Mostra impostazioni filamento"
-#: src/libslic3r/PrintConfig.cpp:3372
+#: src/libslic3r/PrintConfig.cpp:3571
msgid "Show the full list of print/G-code configuration options."
msgstr "Mostra l'elenco completo delle opzioni di configurazione stampa/G-code."
-#: src/libslic3r/PrintConfig.cpp:3377
+#: src/libslic3r/PrintConfig.cpp:3576
msgid "Show the full list of SLA print configuration options."
msgstr "Mostra la lista completa delle opzioni di configurazione di stampa SLA."
-#: src/slic3r/GUI/MainFrame.cpp:708
+#: src/slic3r/GUI/MainFrame.cpp:941 src/slic3r/GUI/MainFrame.cpp:1332
msgid "Show the list of the keyboard shortcuts"
msgstr "Mostra l'elenco delle scorciatoie di tastiera"
-#: src/slic3r/GUI/MainFrame.cpp:606
+#: src/slic3r/GUI/MainFrame.cpp:1216
msgid "Show the plater"
msgstr "Mostra il piano"
-#: src/slic3r/GUI/MainFrame.cpp:614
+#: src/slic3r/GUI/MainFrame.cpp:1221
msgid "Show the print settings"
msgstr "Mostra impostazioni di stampa"
-#: src/slic3r/GUI/MainFrame.cpp:621
+#: src/slic3r/GUI/MainFrame.cpp:1228
msgid "Show the printer settings"
msgstr "Mostra impostazioni della stampante"
-#: src/libslic3r/PrintConfig.cpp:3366
+#: src/libslic3r/PrintConfig.cpp:3565
msgid "Show this help."
msgstr "Mostra questo aiuto."
-#: src/slic3r/GUI/MainFrame.cpp:701
+#: src/slic3r/GUI/MainFrame.cpp:926 src/slic3r/GUI/MainFrame.cpp:1325
msgid "Show user configuration folder (datadir)"
msgstr "Mostra cartella configurazione utente (datadir)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:185
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:182
msgid "Show/Hide 3Dconnexion devices settings dialog"
msgstr "Mostra/Nascondi finestra delle impostazioni dei dispositivi 3Dconnexion"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
-msgid "Show/Hide Legend"
-msgstr "Mostra/Nascondi Legenda"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
+msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled"
+msgstr "Mostra/Nascondi finestra impostazioni dei dispositivi 3Dconnexion, se abilitata"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+msgid "Show/Hide Legend & Estimated printing time"
+msgstr "Mostra/Nascondi Legenda & Stima del tempo di stampa"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+msgid "Show/Hide Legend and Estimated printing time"
+msgstr "Mostra/Nascondi Legenda e Stima del tempo di stampa"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:146
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:141
msgid "Show/Hide object/instance labels"
msgstr "Mostra/Nascondi etichette dell'oggetto/istanza"
-#: src/slic3r/GUI/GUI_App.cpp:813 src/slic3r/GUI/wxExtensions.cpp:753
+#: src/slic3r/GUI/GUI_App.cpp:1504 src/slic3r/GUI/wxExtensions.cpp:673
msgid "Simple"
msgstr "Semplice"
-#: src/slic3r/GUI/ConfigWizard.cpp:820
+#: src/slic3r/GUI/ConfigWizard.cpp:1179
msgid "Simple mode"
msgstr "Modalità Semplice"
-#: src/slic3r/GUI/GUI_App.cpp:813
+#: src/slic3r/GUI/GUI_App.cpp:1504
msgid "Simple View Mode"
msgstr "Modalità di visualizzazione semplice"
-#: src/slic3r/GUI/Tab.cpp:2298 src/slic3r/GUI/Tab.cpp:2306
+#: src/slic3r/GUI/Tab.cpp:2467 src/slic3r/GUI/Tab.cpp:2475
msgid "Single extruder MM setup"
msgstr "Setup Estrusore singolo MM"
-#: src/libslic3r/PrintConfig.cpp:1845
+#: src/libslic3r/PrintConfig.cpp:1987
msgid "Single Extruder Multi Material"
msgstr "Estrusore singolo Multi Material"
-#: src/slic3r/GUI/Tab.cpp:1867
+#: src/slic3r/GUI/Tab.cpp:2101
msgid "Single Extruder Multi Material is selected, \nand all extruders must have the same diameter.\nDo you want to change the diameter for all extruders to first extruder nozzle diameter value?"
msgstr "Materiale multiplo a singolo estrusore selezionato,\ntutti gli estrusori devono avere lo stesso diametro.\nVuoi modificare il diametro di tutti gli estrusori al valore del diametro dell'ugello del primo estrusore?"
-#: src/slic3r/GUI/Tab.cpp:2307
+#: src/slic3r/GUI/Tab.cpp:2476
msgid "Single extruder multimaterial parameters"
msgstr "Parametri estrusore singolo materiale multiplo"
-#: src/slic3r/GUI/BedShapeDialog.cpp:77
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:232 src/slic3r/GUI/Plater.cpp:160
-#: src/slic3r/GUI/Tab.cpp:2324
+#: src/slic3r/GUI/Preferences.cpp:120 src/libslic3r/PrintConfig.cpp:3689
+msgid "Single instance mode"
+msgstr "Modalità a istanza singola"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:93
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:240 src/slic3r/GUI/Plater.cpp:166
+#: src/slic3r/GUI/Tab.cpp:2493
msgid "Size"
msgstr "Dimensioni"
-#: src/slic3r/GUI/Tab.cpp:1797 src/slic3r/GUI/Tab.cpp:2041
+#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:2241
msgid "Size and coordinates"
msgstr "Dimensione e coordinate"
-#: src/slic3r/GUI/BedShapeDialog.cpp:78
+#: src/slic3r/GUI/BedShapeDialog.cpp:110
msgid "Size in X and Y of the rectangular plate."
msgstr "Dimensioni X e Y del piano rettangolare."
-#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1111
-#: src/libslic3r/ExtrusionEntity.cpp:318
+#: src/slic3r/GUI/GUI_Preview.cpp:310 src/slic3r/GUI/Tab.cpp:1439
+#: src/libslic3r/ExtrusionEntity.cpp:323 src/libslic3r/ExtrusionEntity.cpp:354
msgid "Skirt"
msgstr "Skirt"
-#: src/slic3r/GUI/Tab.cpp:1110
+#: src/slic3r/GUI/Tab.cpp:1438
msgid "Skirt and brim"
msgstr "Skirt e brim"
-#: src/libslic3r/PrintConfig.cpp:1687
+#: src/libslic3r/PrintConfig.cpp:1795
msgid "Skirt height"
msgstr "Altezza skirt"
-#: src/libslic3r/PrintConfig.cpp:1696
+#: src/libslic3r/PrintConfig.cpp:1811
msgid "Skirt Loops"
msgstr "Giri skirt"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1334
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1181
msgid "SLA gizmo keyboard shortcuts"
msgstr "Scorciatoie di tastiera gizmo SLA"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1058
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:924
msgid "SLA gizmo turned off"
msgstr "Gizmo SLA disattivato"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1017
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897
msgid "SLA gizmo turned on"
msgstr "Gizmo SLA attivato"
-#: src/slic3r/GUI/Plater.cpp:818 src/slic3r/GUI/Preset.cpp:1524
+#: src/slic3r/GUI/Plater.cpp:693 src/libslic3r/Preset.cpp:1303
msgid "SLA material"
msgstr "Materiale SLA"
-#: src/slic3r/GUI/ConfigWizard.cpp:2015
+#: src/slic3r/GUI/ConfigWizard.cpp:2526
msgid "SLA Material Profiles Selection"
msgstr "Selezione Profili Materiale SLA"
-#: src/libslic3r/PrintConfig.cpp:2470 src/libslic3r/PrintConfig.cpp:2471
+#: src/libslic3r/PrintConfig.cpp:2613 src/libslic3r/PrintConfig.cpp:2614
msgid "SLA material type"
msgstr "Tipo materiale SLA"
-#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2015
+#: src/slic3r/GUI/ConfigWizard.cpp:1872 src/slic3r/GUI/ConfigWizard.cpp:2526
msgid "SLA Materials"
msgstr "Materiali SLA"
-#: src/slic3r/GUI/Preset.cpp:1523
+#: src/libslic3r/Preset.cpp:1302
msgid "SLA print"
msgstr "Stampa SLA"
-#: src/libslic3r/PrintConfig.cpp:2578
+#: src/libslic3r/PrintConfig.cpp:2721
msgid "SLA print material notes"
msgstr "Note sul materiale di stampa SLA"
-#: src/slic3r/GUI/Plater.cpp:817
+#: src/slic3r/GUI/Plater.cpp:692
msgid "SLA print settings"
msgstr "Impostazioni di stampa SLA"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:996
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869
msgid "SLA Support Points"
msgstr "Punti di Supporto SLA"
-#: src/slic3r/GUI/GLCanvas3D.cpp:687
-msgid "SLA supports outside the print area were detected"
-msgstr "Sono stati rilevati supporti SLA al di fuori dell'area di stampa"
+#: src/slic3r/GUI/GLCanvas3D.cpp:635
+msgid "SLA supports outside the print area were detected."
+msgstr "Sono stati rilevati supporti SLA al di fuori dell'area di stampa ."
-#: src/slic3r/GUI/ConfigWizard.cpp:1530
+#: src/slic3r/GUI/ConfigWizard.cpp:1931
msgid "SLA Technology Printers"
msgstr "Stampanti con tecnologia SLA"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1432
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
msgid "Slab"
msgstr "Lastra"
-#: src/libslic3r/PrintConfig.cpp:1333
+#: src/libslic3r/PrintConfig.cpp:1441
msgid "Slic3r can upload G-code files to a printer host. This field must contain the kind of the host."
msgstr "Slic3r può caricare il file G-code ad un host stampante. Questo campo deve contenere il tipo di host."
-#: src/libslic3r/PrintConfig.cpp:105
+#: src/libslic3r/PrintConfig.cpp:107
msgid "Slic3r can upload G-code files to a printer host. This field should contain the API Key or the password required for authentication."
msgstr "Slic3r può caricare i file G-code su un host di stampa. Questo campo deve contenere la chiave API o la password richiesta per l'autenticazione."
-#: src/libslic3r/PrintConfig.cpp:98
-msgid "Slic3r can upload G-code files to a printer host. This field should contain the hostname, IP address or URL of the printer host instance."
-msgstr "Slic3r può caricare i file G-code su un host della stampante. Questo campo dovrebbe contenere il nome host, l'indirizzo IP o URL dell'istanza dell'host della stampante."
+#: src/libslic3r/PrintConfig.cpp:100
+msgid "Slic3r can upload G-code files to a printer host. This field should contain the hostname, IP address or URL of the printer host instance. Print host behind HAProxy with basic auth enabled can be accessed by putting the user name and password into the URL in the following format: https://username:password@your-octopi-address/"
+msgstr "Slic3r può caricare i file G-code su una stampante host. Questo campo deve contenere il nome host, l'indirizzo IP o l'URL dell'istanza host della stampante. L'host di stampa dietro HAProxy con l'autenticazione di base abilitata è accessibile inserendo il nome utente e la password nell'URL nel seguente formato: https://username:password@il tuo indirizzo di octopi/"
-#: src/libslic3r/PrintConfig.cpp:1299
+#: src/libslic3r/PrintConfig.cpp:1407
msgid "Slic3r will not scale speed down below this speed."
msgstr "Slic3r non rallenterà la velocità al di sotto di questa."
-#: src/libslic3r/PrintConfig.cpp:3359
+#: src/libslic3r/PrintConfig.cpp:3558
msgid "Slice"
msgstr "Processa"
-#: src/slic3r/GUI/MainFrame.cpp:512
+#: src/slic3r/GUI/MainFrame.cpp:1113
msgid "Slice a file into a G-code"
msgstr "Processa un file in G-code"
-#: src/slic3r/GUI/MainFrame.cpp:518
+#: src/slic3r/GUI/MainFrame.cpp:1119
msgid "Slice a file into a G-code, save as"
msgstr "Processa un file in G-code, salva come"
-#: src/libslic3r/PrintConfig.cpp:87
+#: src/libslic3r/PrintConfig.cpp:89
msgid "Slice gap closing radius"
msgstr "Gap closing radius per slicing"
-#: src/slic3r/GUI/Plater.cpp:892 src/slic3r/GUI/Plater.cpp:3121
-#: src/slic3r/GUI/Plater.cpp:5110
+#: src/slic3r/GUI/Plater.cpp:767 src/slic3r/GUI/Plater.cpp:2921
+#: src/slic3r/GUI/Plater.cpp:5237
msgid "Slice now"
msgstr "Processa ora"
-#: src/libslic3r/PrintConfig.cpp:3333
+#: src/libslic3r/PrintConfig.cpp:3526
msgid "Slice the model and export SLA printing layers as PNG."
msgstr "Effettua lo slice del modello ed esporta i layer di stampa SLA come PNG."
-#: src/libslic3r/PrintConfig.cpp:3354
+#: src/libslic3r/PrintConfig.cpp:3547
msgid "Slice the model and export toolpaths as G-code."
msgstr "Effettua slice del modello ed esporta il percorso come G-code."
-#: src/libslic3r/PrintConfig.cpp:3360
+#: src/libslic3r/PrintConfig.cpp:3559
msgid "Slice the model as FFF or SLA based on the printer_technology configuration value."
msgstr "Effettua lo slice del modello come FFF o SLA in base al valore di configurazione di printer_technology."
-#: src/slic3r/GUI/Plater.cpp:216
+#: src/slic3r/GUI/Plater.cpp:222
msgid "Sliced Info"
msgstr "Informazioni processo"
-#: src/slic3r/GUI/MainFrame.cpp:847 src/slic3r/GUI/Plater.cpp:3121
-#: src/slic3r/GUI/Plater.cpp:5107 src/slic3r/GUI/Tab.cpp:1221
-#: src/slic3r/GUI/Tab.cpp:3662
+#: src/slic3r/GUI/MainFrame.cpp:1548 src/slic3r/GUI/Plater.cpp:2921
+#: src/slic3r/GUI/Plater.cpp:5234 src/slic3r/GUI/Tab.cpp:1551
+#: src/slic3r/GUI/Tab.cpp:4081
msgid "Slicing"
msgstr "Slicing"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:134
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:184
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:170
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:219
msgid "Slicing complete"
msgstr "Slicing completato"
-#: src/libslic3r/SLAPrint.cpp:760
+#: src/libslic3r/SLAPrint.cpp:780
msgid "Slicing done"
msgstr "Slicing completato"
-#: src/slic3r/GUI/MainFrame.cpp:874
+#: src/slic3r/GUI/MainFrame.cpp:1575
msgid "Slicing Done!"
msgstr "Slicing Completato!"
-#: src/libslic3r/SLAPrintSteps.cpp:245
+#: src/slic3r/GUI/NotificationManager.cpp:751
+msgid "Slicing finished."
+msgstr "Slicing completato."
+
+#: src/libslic3r/SLAPrintSteps.cpp:247
msgid "Slicing had to be stopped due to an internal error: Inconsistent slice index."
msgstr "Lo slicing è stato interrotto a causa di un errore interno: Indice di slice inconsistente."
-#: src/libslic3r/SLAPrintSteps.cpp:45
+#: src/libslic3r/SLAPrintSteps.cpp:46
msgid "Slicing model"
-msgstr "Slice modello"
+msgstr "Slicing del modello"
-#: src/libslic3r/SLAPrintSteps.cpp:49
+#: src/libslic3r/SLAPrintSteps.cpp:50
msgid "Slicing supports"
msgstr "Supporti di Slicing"
-#: src/libslic3r/PrintConfig.cpp:2414
+#: src/libslic3r/PrintConfig.cpp:2557
msgid "Slow"
msgstr "Lento"
-#: src/libslic3r/PrintConfig.cpp:1705
+#: src/libslic3r/PrintConfig.cpp:1820
msgid "Slow down if layer print time is below"
-msgstr "Rallenta se il tempo di stampa del layer è inferiore"
+msgstr "Rallenta se il tempo di stampa del layer è inferiore a"
-#: src/libslic3r/PrintConfig.cpp:2415
+#: src/libslic3r/PrintConfig.cpp:2558
msgid "Slow tilt"
msgstr "Inclinazione lenta"
-#: src/libslic3r/PrintConfig.cpp:1715
+#: src/libslic3r/PrintConfig.cpp:1830
msgid "Small perimeters"
msgstr "Perimetri piccoli"
-#: src/slic3r/GUI/GLCanvas3D.cpp:288
+#: src/libslic3r/PrintConfig.cpp:2801
+msgid "Small pillar diameter percent"
+msgstr "Percentuale di diametro del pilastro piccolo"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:274
msgid "Smooth"
msgstr "Leviga"
-#: src/slic3r/GUI/GLCanvas3D.cpp:258
+#: src/slic3r/GUI/GLCanvas3D.cpp:247
msgid "Smoothing"
msgstr "Levigatura"
-#: src/slic3r/GUI/GUI_App.cpp:839
+#: src/slic3r/GUI/GUI_App.cpp:1540
msgid "Snapshot name"
msgstr "Nome istantanea"
-#: src/slic3r/GUI/MainFrame.cpp:686
+#: src/slic3r/GUI/MainFrame.cpp:911 src/slic3r/GUI/MainFrame.cpp:1310
msgid "Software &Releases"
msgstr "Ve&rsioni Software"
-#: src/slic3r/GUI/PresetHints.cpp:184
+#: src/slic3r/GUI/PresetHints.cpp:183
msgid "solid infill"
msgstr "riempimento solido"
-#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:314
-#: src/libslic3r/PrintConfig.cpp:1756 src/libslic3r/PrintConfig.cpp:1767
+#: src/slic3r/GUI/GUI_Preview.cpp:305 src/libslic3r/ExtrusionEntity.cpp:318
+#: src/libslic3r/ExtrusionEntity.cpp:344 src/libslic3r/PrintConfig.cpp:1871
+#: src/libslic3r/PrintConfig.cpp:1882
msgid "Solid infill"
msgstr "Riempimento solido"
-#: src/libslic3r/PrintConfig.cpp:1744
+#: src/libslic3r/PrintConfig.cpp:1859
msgid "Solid infill every"
msgstr "Riempimento solido ogni"
-#: src/libslic3r/PrintConfig.cpp:1736
+#: src/libslic3r/PrintConfig.cpp:1851
msgid "Solid infill extruder"
msgstr "Estrusore riempimento solido"
-#: src/libslic3r/PrintConfig.cpp:1727
+#: src/libslic3r/PrintConfig.cpp:1842
msgid "Solid infill threshold area"
msgstr "Area soglia riempimento solido"
-#: src/slic3r/GUI/Tab.cpp:1065 src/libslic3r/PrintConfig.cpp:1780
+#: src/slic3r/GUI/Tab.cpp:1387 src/libslic3r/PrintConfig.cpp:1895
msgid "Solid layers"
msgstr "Layer solidi"
-#: src/libslic3r/PrintConfig.cpp:754
+#: src/libslic3r/PrintConfig.cpp:790
msgid "Soluble material"
msgstr "Materiale solubile"
-#: src/libslic3r/PrintConfig.cpp:755
+#: src/libslic3r/PrintConfig.cpp:791
msgid "Soluble material is most likely used for a soluble support."
msgstr "Il materiale solubile è comunemente usato per un supporto solubile."
-#: src/libslic3r/PrintConfig.cpp:937
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:735
+msgid "Some fields are too long to fit. Right mouse click reveals the full text."
+msgstr "Alcuni campi sono troppo lunghi per adattarsi. Cliccando con il tasto destro del mouse si visualizza il testo completo."
+
+#: src/libslic3r/PrintConfig.cpp:981
msgid "Some G/M-code commands, including temperature control and others, are not universal. Set this option to your printer's firmware to get a compatible output. The \"No extrusion\" flavor prevents PrusaSlicer from exporting any extrusion value at all."
msgstr "Alcuni comandi G/M-code, incluso il controllo di temperatura e altri, non sono universali. Imposta questa opzione nel firmware della tua stampante per ottenere un output compatibile. La versione \"No extrusion\" evita che PrusaSlicer non esporti alcun valore."
-#: src/slic3r/GUI/GLCanvas3D.cpp:688
-msgid "Some objects are not visible"
-msgstr "Alcuni oggetti non sono visibili"
+#: src/slic3r/GUI/Plater.cpp:2309
+#, possible-c-format
+msgid "Some object(s) in file %s looks like saved in inches.\nShould I consider them as a saved in inches and convert them?"
+msgstr "Alcuni oggetti nel file %s sembrano salvati in pollici.\nDevo considerarli come salvati in pollici e convertirli?"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:636
+msgid "Some objects are not visible."
+msgstr "Alcuni oggetti non sono visibili."
-#: src/libslic3r/Print.cpp:1226
+#: src/libslic3r/Print.cpp:1252
msgid "Some objects are too close; your extruder will collide with them."
msgstr "Alcuni oggetti sono troppo vicini; l'estrusore li colpirà."
-#: src/libslic3r/Print.cpp:1228
+#: src/libslic3r/Print.cpp:1254
msgid "Some objects are too tall and cannot be printed without extruder collisions."
msgstr "Alcuni oggetti sono troppo alti e non possono essere stampati senza essere colpiti dall'estrusore."
-#: src/libslic3r/PrintConfig.cpp:2824
+#: src/libslic3r/PrintConfig.cpp:2988
msgid "Some objects can get along with a few smaller pads instead of a single big one. This parameter defines how far the center of two smaller pads should be. If theyare closer, they will get merged into one pad."
msgstr "Per alcuni oggetti possono bastare pochi piccoli pad invece che un singolo pad grande. Questo parametro definisce quanto può essere lontano il centro di due pad. Se questi sono più vicini, si fonderanno in un unico pad."
-#: src/libslic3r/PrintConfig.cpp:2187
+#: src/libslic3r/PrintConfig.cpp:2330
msgid "Some printers or printer setups may have difficulties printing with a variable layer height. Enabled by default."
msgstr "Alcune stampanti o setup di stampanti possono riscontrare difficoltà a stampare con l'altezza layer variabile. Attivato come predefinito."
-#: src/libslic3r/PrintConfig.cpp:1984
+#: src/slic3r/GUI/GLCanvas3D.cpp:3967
+msgid "Spacing"
+msgstr "Spaziatura "
+
+#: src/libslic3r/PrintConfig.cpp:2126
msgid "Spacing between interface lines. Set zero to get a solid interface."
msgstr "Spaziatura tra le linee di interfaccia. Imposta a zero per ottenere un'interfaccia solida."
-#: src/libslic3r/PrintConfig.cpp:2018
+#: src/libslic3r/PrintConfig.cpp:1155
+msgid "Spacing between ironing passes"
+msgstr "Spaziatura tra i passaggi di stiratura"
+
+#: src/libslic3r/PrintConfig.cpp:2160
msgid "Spacing between support material lines."
msgstr "Spaziatura tra le linee del materiale di supporto."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:616
-#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/Tab.cpp:1145
-#: src/libslic3r/PrintConfig.cpp:235 src/libslic3r/PrintConfig.cpp:458
-#: src/libslic3r/PrintConfig.cpp:919 src/libslic3r/PrintConfig.cpp:1048
-#: src/libslic3r/PrintConfig.cpp:1431 src/libslic3r/PrintConfig.cpp:1668
-#: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1768
-#: src/libslic3r/PrintConfig.cpp:2118
+#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:655
+#: src/slic3r/GUI/GUI_Preview.cpp:278 src/slic3r/GUI/Tab.cpp:1474
+#: src/libslic3r/PrintConfig.cpp:269 src/libslic3r/PrintConfig.cpp:494
+#: src/libslic3r/PrintConfig.cpp:963 src/libslic3r/PrintConfig.cpp:1092
+#: src/libslic3r/PrintConfig.cpp:1165 src/libslic3r/PrintConfig.cpp:1539
+#: src/libslic3r/PrintConfig.cpp:1776 src/libslic3r/PrintConfig.cpp:1831
+#: src/libslic3r/PrintConfig.cpp:1883 src/libslic3r/PrintConfig.cpp:2261
msgid "Speed"
msgstr "Velocità"
-#: src/libslic3r/PrintConfig.cpp:1670
-msgid "Speed (baud) of USB/serial port for printer connection."
-msgstr "Velocità (baud) USB/Seriale per la connessione stampante."
-
-#: src/libslic3r/GCode/PreviewData.cpp:351
+#: src/slic3r/GUI/GCodeViewer.cpp:2238 src/libslic3r/GCode/PreviewData.cpp:356
msgid "Speed (mm/s)"
msgstr "Velocità (mm/s)"
-#: src/libslic3r/PrintConfig.cpp:920
+#: src/libslic3r/PrintConfig.cpp:964
msgid "Speed for filling small gaps using short zigzag moves. Keep this reasonably low to avoid too much shaking and resonance issues. Set zero to disable gaps filling."
msgstr "Velocità per il riempimento degli spazi stretti utilizzando brevi movimenti a zig-zag. Mantieni questa velocità ragionevolmente bassa per evitare problemi di oscillazione e risonanza. Imposta a zero per disabilitare il riempimento degli spazi."
-#: src/slic3r/GUI/Tab.cpp:1158
+#: src/slic3r/GUI/Tab.cpp:1488
msgid "Speed for non-print moves"
msgstr "Velocità per i movimenti non di stampa"
-#: src/libslic3r/PrintConfig.cpp:1432
+#: src/libslic3r/PrintConfig.cpp:1540
msgid "Speed for perimeters (contours, aka vertical shells). Set to zero for auto."
msgstr "Velocità per i perimetri (contorni, conosciuti anche come gusci verticali). Imposta a zero per automatizzare."
-#: src/slic3r/GUI/Tab.cpp:1146
+#: src/slic3r/GUI/Tab.cpp:1475
msgid "Speed for print moves"
msgstr "Velocità per i movimenti di stampa"
-#: src/libslic3r/PrintConfig.cpp:236
+#: src/libslic3r/PrintConfig.cpp:270
msgid "Speed for printing bridges."
msgstr "Velocità di stampa Bridge."
-#: src/libslic3r/PrintConfig.cpp:1769
+#: src/libslic3r/PrintConfig.cpp:1884
msgid "Speed for printing solid regions (top/bottom/internal horizontal shells). This can be expressed as a percentage (for example: 80%) over the default infill speed above. Set to zero for auto."
msgstr "La velocità per le regioni di stampa solide (superiore/inferiore/gusci interni orizzontali). Questo valore può essere espresso in percentuale (per esempio: 80%) sulla velocità del riempimento predefinita qui sopra. Imposta a zero per automatizzare."
-#: src/libslic3r/PrintConfig.cpp:1993
+#: src/libslic3r/PrintConfig.cpp:2135
msgid "Speed for printing support material interface layers. If expressed as percentage (for example 50%) it will be calculated over support material speed."
msgstr "Velocità per la stampa dei layer di interfaccia del materiale di supporto. Se espresso in percentuale (per esempio 50%) sarà calcolato sulla velocità del materiale di supporto."
-#: src/libslic3r/PrintConfig.cpp:2027
+#: src/libslic3r/PrintConfig.cpp:2169
msgid "Speed for printing support material."
msgstr "Velocità per la stampa del materiale di supporto."
-#: src/libslic3r/PrintConfig.cpp:1049
+#: src/libslic3r/PrintConfig.cpp:1093
msgid "Speed for printing the internal fill. Set to zero for auto."
msgstr "Velocità per la stampa del riempimento interno. Imposta a zero per auto."
-#: src/libslic3r/PrintConfig.cpp:2119
+#: src/libslic3r/PrintConfig.cpp:2262
msgid "Speed for printing top solid layers (it only applies to the uppermost external layers and not to their internal solid layers). You may want to slow down this to get a nicer surface finish. This can be expressed as a percentage (for example: 80%) over the solid infill speed above. Set to zero for auto."
msgstr "Velocità di stampa dei layer solidi superiori (si applica solamente al layer solido esterno più in alto e non ai layer solidi interni). Rallenta questa impostazione per ottenere una superficie più rifinita. Questo valore può essere espresso in percentuale (per esempio: 80%) della velocità del riempimento solido qui sopra. Imposta a zero per auto."
-#: src/libslic3r/PrintConfig.cpp:2153
+#: src/libslic3r/PrintConfig.cpp:2296
msgid "Speed for travel moves (jumps between distant extrusion points)."
msgstr "Velocità per movimenti di spostamento (salti tra punti di estrusione distanti)."
-#: src/libslic3r/PrintConfig.cpp:659
+#: src/libslic3r/PrintConfig.cpp:695
msgid "Speed of the first cooling move"
msgstr "Velocità del primo movimento di raffreddamento"
-#: src/libslic3r/PrintConfig.cpp:678
+#: src/libslic3r/PrintConfig.cpp:714
msgid "Speed of the last cooling move"
msgstr "Velocità dell'ultimo movimento di raffreddamento"
-#: src/libslic3r/PrintConfig.cpp:616
+#: src/libslic3r/PrintConfig.cpp:652
msgid "Speed used at the very beginning of loading phase."
msgstr "Velocità utilizzata all'inizio della fase di caricamento."
-#: src/libslic3r/PrintConfig.cpp:608
+#: src/libslic3r/PrintConfig.cpp:644
msgid "Speed used for loading the filament on the wipe tower."
msgstr "Velocità utilizzata per caricare il filamento sulla torre di spurgo."
-#: src/libslic3r/PrintConfig.cpp:624
+#: src/libslic3r/PrintConfig.cpp:660
msgid "Speed used for unloading the filament on the wipe tower (does not affect initial part of unloading just after ramming)."
msgstr "Velocità usata per scaricare il filamento sulla wipe tower (non influisce sulla parte iniziale dello scaricamento dopo il ramming)."
-#: src/libslic3r/PrintConfig.cpp:633
+#: src/libslic3r/PrintConfig.cpp:669
msgid "Speed used for unloading the tip of the filament immediately after ramming."
msgstr "Velocità utilizzata per scaricare la punta del filamento immediatamente dopo il ramming."
-#: src/slic3r/GUI/Mouse3DController.cpp:296
+#: src/slic3r/GUI/Mouse3DController.cpp:279
msgid "Speed:"
msgstr "Velocità:"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1432
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
msgid "Sphere"
msgstr "Sfera"
-#: src/libslic3r/PrintConfig.cpp:1794
+#: src/libslic3r/PrintConfig.cpp:1909
msgid "Spiral vase"
msgstr "Vaso a spirale"
-#: src/slic3r/GUI/ConfigManipulation.cpp:90
+#: src/slic3r/GUI/ConfigManipulation.cpp:89
msgid "Spiral Vase"
msgstr "Vaso a spirale"
-#: src/slic3r/GUI/Plater.cpp:4019 src/slic3r/GUI/Plater.cpp:4034
-#: src/slic3r/GUI/Plater.cpp:4048 src/libslic3r/PrintConfig.cpp:3471
+#: src/slic3r/GUI/Plater.cpp:3939 src/slic3r/GUI/Plater.cpp:3954
+#: src/slic3r/GUI/Plater.cpp:3972 src/libslic3r/PrintConfig.cpp:3670
msgid "Split"
msgstr "Dividi"
-#: src/slic3r/GUI/Plater.cpp:4019
+#: src/slic3r/GUI/Plater.cpp:3939
msgid "Split the selected object"
msgstr "Dividi l'oggetto selezionato"
-#: src/slic3r/GUI/Plater.cpp:4014 src/slic3r/GUI/Plater.cpp:4034
+#: src/slic3r/GUI/Plater.cpp:3934 src/slic3r/GUI/Plater.cpp:3954
msgid "Split the selected object into individual objects"
msgstr "Dividi l'oggetto selezionato in singoli oggetti"
-#: src/slic3r/GUI/Plater.cpp:4016 src/slic3r/GUI/Plater.cpp:4048
+#: src/slic3r/GUI/Plater.cpp:3936 src/slic3r/GUI/Plater.cpp:3972
msgid "Split the selected object into individual sub-parts"
msgstr "Dividi l'oggetto selezionato in singole sotto parti"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4550
+#: src/slic3r/GUI/GLCanvas3D.cpp:4916
msgid "Split to objects"
-msgstr "Separa in oggetti"
+msgstr "Dividi in oggetti"
-#: src/slic3r/GUI/Plater.cpp:2981
+#: src/slic3r/GUI/Plater.cpp:2774
msgid "Split to Objects"
-msgstr "Separa in oggetti"
+msgstr "Dividi in oggetti"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4560 src/slic3r/GUI/GUI_ObjectList.cpp:1487
+#: src/slic3r/GUI/GLCanvas3D.cpp:4926 src/slic3r/GUI/GUI_ObjectList.cpp:1618
msgid "Split to parts"
msgstr "Dividi in parti"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2274
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2440
msgid "Split to Parts"
msgstr "Dividi in parti"
-#: src/slic3r/GUI/ConfigWizard.cpp:289
+#: src/libslic3r/PrintConfig.cpp:812
+msgid "Spool weight"
+msgstr "Peso bobina"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:307
msgid "Standard"
msgstr "Standard"
-#: src/libslic3r/PrintConfig.cpp:846
+#: src/libslic3r/PrintConfig.cpp:884
msgid "Stars"
msgstr "Stelle"
-#: src/slic3r/GUI/MainFrame.cpp:405
+#: src/slic3r/GUI/MainFrame.cpp:986
msgid "Start a new project"
msgstr "Inizia un nuovo progetto"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29
msgid "Start at height"
msgstr "Inizia all'altezza"
-#: src/slic3r/GUI/Tab.cpp:1528 src/slic3r/GUI/Tab.cpp:1976
-#: src/libslic3r/PrintConfig.cpp:1813 src/libslic3r/PrintConfig.cpp:1828
+#: src/slic3r/GUI/Tab.cpp:1873 src/slic3r/GUI/Tab.cpp:2161
+#: src/libslic3r/PrintConfig.cpp:1928 src/libslic3r/PrintConfig.cpp:1943
msgid "Start G-code"
msgstr "G-code iniziale"
-#: src/slic3r/GUI/MainFrame.cpp:532
+#: src/slic3r/GUI/MainFrame.cpp:1133
msgid "Start new slicing process"
msgstr "Avvia un nuovo processo di slicing"
@@ -7206,7 +8617,15 @@ msgstr "Avvia un nuovo processo di slicing"
msgid "Start printing after upload"
msgstr "Avvia la stampa dopo il caricamento"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:151
+#: src/slic3r/GUI/GUI_App.cpp:396
+msgid "Start the application"
+msgstr "Avvia l'applicazione"
+
+#: src/slic3r/GUI/GUI_App.cpp:386
+msgid "Starting with %1% 2.3, configuration directory on Linux has changed (according to XDG Base Directory Specification) to \n%2%.\n\nThis directory did not exist yet (maybe you run the new version for the first time).\nHowever, an old %1% configuration directory was detected in \n%3%.\n\nConsider moving the contents of the old directory to the new location in order to access your profiles, etc.\nNote that if you decide to downgrade %1% in future, it will use the old location again.\n\nWhat do you want to do now?"
+msgstr "A partire da %1% 2.3, la directory di configurazione su Linux è cambiata (secondo la XDG Base Directory Specification) in \n%2%.\n\nQuesta directory non esiste ancora (forse stai usando la nuova versione per la prima volta).\nTuttavia, è stata rilevata una vecchia directory di configurazione %1% in \n%3%.\n\nPrendere in considerazione la possibilità di spostare il contenuto della vecchia directory nella nuova posizione per accedere ai propri profili, ecc.\nNotare che se si decide di fare un downgrade di %1% in futuro, si utilizzerà di nuovo la vecchia posizione.\n\nCosa vuoi fare adesso?"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:149
msgid "Status"
msgstr "Stato"
@@ -7214,207 +8633,225 @@ msgstr "Stato"
msgid "Status:"
msgstr "Stato:"
-#: src/slic3r/GUI/Tab.cpp:2209
+#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2378
msgid "Stealth"
msgstr "Silenzioso"
-#: src/slic3r/GUI/Plater.cpp:1291
+#: src/slic3r/GUI/Plater.cpp:1187 src/slic3r/GUI/Plater.cpp:1235
msgid "stealth mode"
msgstr "modalità silenziosa"
-#: src/slic3r/GUI/Plater.cpp:4985
+#: src/slic3r/GUI/GCodeViewer.cpp:2557
+msgid "Stealth mode"
+msgstr "Modalità silenziosa"
+
+#: src/slic3r/GUI/Plater.cpp:5118
#, possible-c-format
msgid "STL file exported to %s"
msgstr "File STL esportato in %s"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29
msgid "Stop at height"
msgstr "Ferma all'altezza"
-#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:1928
+#: src/slic3r/GUI/GUI_App.cpp:1781
+msgid "Stop them and continue anyway?"
+msgstr "Interromperli e continuare comunque?"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:295
msgid "Success!"
msgstr "Successo!"
-#: src/slic3r/GUI/PresetHints.cpp:203
+#: src/slic3r/GUI/Plater.cpp:2047
+#, possible-c-format
+msgid "Successfully unmounted. The device %s(%s) can now be safely removed from the computer."
+msgstr "Smontato correttamente. Il dispositivo %s(%s) può ora essere rimosso dal computer in sicurezza."
+
+#: src/slic3r/GUI/PresetHints.cpp:202
msgid "support"
msgstr "supporto"
-#: src/libslic3r/PrintConfig.cpp:2692
+#: src/libslic3r/PrintConfig.cpp:2856
msgid "Support base diameter"
msgstr "Diametro della base del supporto"
-#: src/libslic3r/PrintConfig.cpp:2702
+#: src/libslic3r/PrintConfig.cpp:2866
msgid "Support base height"
msgstr "Altezza della base del supporto"
-#: src/libslic3r/PrintConfig.cpp:2711
+#: src/libslic3r/PrintConfig.cpp:2875
msgid "Support base safety distance"
msgstr "Distanza di sicurezza base supporto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
msgid "Support Blocker"
msgstr "Blocco Supporto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3551
+#: src/libslic3r/PrintConfig.cpp:895
+msgid "Support Cubic"
+msgstr "Supporto Cubico"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
msgid "Support Enforcer"
msgstr "Rinforzo Supporto"
-#: src/slic3r/GUI/ConfigManipulation.cpp:163
+#: src/slic3r/GUI/ConfigManipulation.cpp:162
msgid "Support Generator"
msgstr "Generatore Supporti"
-#: src/slic3r/GUI/Tab.cpp:3608
+#: src/slic3r/GUI/Tab.cpp:4018
msgid "Support head"
msgstr "Testa supporto"
-#: src/libslic3r/PrintConfig.cpp:2620
-msgid "Support head front diameter"
-msgstr "Diametro anteriore della testa del supporto"
-
-#: src/libslic3r/PrintConfig.cpp:2629
-msgid "Support head penetration"
-msgstr "Inserimento testa del supporto"
-
-#: src/libslic3r/PrintConfig.cpp:2638
-msgid "Support head width"
-msgstr "Larghezza testa del supporto"
-
-#: src/slic3r/GUI/PresetHints.cpp:213
+#: src/slic3r/GUI/PresetHints.cpp:212
msgid "support interface"
msgstr "interfaccia supporto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:97
-#: src/slic3r/GUI/GUI_ObjectList.cpp:615 src/slic3r/GUI/GUI_Preview.cpp:246
-#: src/slic3r/GUI/Tab.cpp:1120 src/slic3r/GUI/Tab.cpp:1121
-#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/PrintConfig.cpp:370
-#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1866
-#: src/libslic3r/PrintConfig.cpp:1872 src/libslic3r/PrintConfig.cpp:1880
-#: src/libslic3r/PrintConfig.cpp:1892 src/libslic3r/PrintConfig.cpp:1902
-#: src/libslic3r/PrintConfig.cpp:1910 src/libslic3r/PrintConfig.cpp:1925
-#: src/libslic3r/PrintConfig.cpp:1946 src/libslic3r/PrintConfig.cpp:1958
-#: src/libslic3r/PrintConfig.cpp:1974 src/libslic3r/PrintConfig.cpp:1983
-#: src/libslic3r/PrintConfig.cpp:1992 src/libslic3r/PrintConfig.cpp:2003
-#: src/libslic3r/PrintConfig.cpp:2017 src/libslic3r/PrintConfig.cpp:2025
-#: src/libslic3r/PrintConfig.cpp:2026 src/libslic3r/PrintConfig.cpp:2035
-#: src/libslic3r/PrintConfig.cpp:2043 src/libslic3r/PrintConfig.cpp:2057
+#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:95
+#: src/slic3r/GUI/GUI_ObjectList.cpp:654 src/slic3r/GUI/GUI_Preview.cpp:311
+#: src/slic3r/GUI/Tab.cpp:1449 src/slic3r/GUI/Tab.cpp:1450
+#: src/libslic3r/ExtrusionEntity.cpp:324 src/libslic3r/ExtrusionEntity.cpp:356
+#: src/libslic3r/PrintConfig.cpp:404 src/libslic3r/PrintConfig.cpp:1610
+#: src/libslic3r/PrintConfig.cpp:2008 src/libslic3r/PrintConfig.cpp:2014
+#: src/libslic3r/PrintConfig.cpp:2022 src/libslic3r/PrintConfig.cpp:2034
+#: src/libslic3r/PrintConfig.cpp:2044 src/libslic3r/PrintConfig.cpp:2052
+#: src/libslic3r/PrintConfig.cpp:2067 src/libslic3r/PrintConfig.cpp:2088
+#: src/libslic3r/PrintConfig.cpp:2100 src/libslic3r/PrintConfig.cpp:2116
+#: src/libslic3r/PrintConfig.cpp:2125 src/libslic3r/PrintConfig.cpp:2134
+#: src/libslic3r/PrintConfig.cpp:2145 src/libslic3r/PrintConfig.cpp:2159
+#: src/libslic3r/PrintConfig.cpp:2167 src/libslic3r/PrintConfig.cpp:2168
+#: src/libslic3r/PrintConfig.cpp:2177 src/libslic3r/PrintConfig.cpp:2185
+#: src/libslic3r/PrintConfig.cpp:2199
msgid "Support material"
msgstr "Materiale di supporto"
-#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:320
-#: src/libslic3r/PrintConfig.cpp:1991
+#: src/slic3r/GUI/GUI_Preview.cpp:312 src/libslic3r/ExtrusionEntity.cpp:325
+#: src/libslic3r/ExtrusionEntity.cpp:358 src/libslic3r/PrintConfig.cpp:2133
msgid "Support material interface"
msgstr "Interfaccia materiale di supporto"
-#: src/libslic3r/PrintConfig.cpp:2044
+#: src/libslic3r/PrintConfig.cpp:2186
msgid "Support material will not be generated for overhangs whose slope angle (90° = vertical) is above the given threshold. In other words, this value represent the most horizontal slope (measured from the horizontal plane) that you can print without support material. Set to zero for automatic detection (recommended)."
msgstr "Il materiale di supporto non sarà generato per sporgenze con angolo di inclinazione (90°=verticale) superiore al limite impostato. In altre parole, questo valore rappresenta l'inclinazione orizzontale massima (misurata dal piano orizzontale) che puoi stampare senza materiale di supporto. Imposta a zero per un rilevamento automatico (raccomandato)."
-#: src/libslic3r/PrintConfig.cpp:1964
+#: src/libslic3r/PrintConfig.cpp:2106
msgid "Support material/raft interface extruder"
msgstr "Estrusore materiale di supporto/intefaccia raft"
-#: src/libslic3r/PrintConfig.cpp:1937
+#: src/libslic3r/PrintConfig.cpp:2079
msgid "Support material/raft/skirt extruder"
msgstr "Estrusore materiale di supporto/raft/skirt"
-#: src/slic3r/GUI/Plater.cpp:500 src/libslic3r/PrintConfig.cpp:1901
-#: src/libslic3r/PrintConfig.cpp:2674
+#: src/slic3r/GUI/Plater.cpp:366 src/libslic3r/PrintConfig.cpp:2043
+#: src/libslic3r/PrintConfig.cpp:2838
msgid "Support on build plate only"
msgstr "Supporti solo dal piano di stampa"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:888
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:762
msgid "Support parameter change"
msgstr "Modifica parametro del Supporto"
-#: src/slic3r/GUI/Tab.cpp:3613
+#: src/slic3r/GUI/Tab.cpp:4023
msgid "Support pillar"
msgstr "Pilastro di supporto"
-#: src/libslic3r/PrintConfig.cpp:2658
-msgid "Support pillar connection mode"
-msgstr "Modalità di connessione dei pilastri di supporto"
-
-#: src/libslic3r/PrintConfig.cpp:2648
-msgid "Support pillar diameter"
-msgstr "Diametro pilastro di supporto"
-
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55
-#: src/libslic3r/PrintConfig.cpp:2764
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54
+#: src/libslic3r/PrintConfig.cpp:2928
msgid "Support points density"
msgstr "Densità punti di supporto"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1196
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1048
msgid "Support points edit"
msgstr "Edita punti di supporto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/GUI_ObjectList.cpp:624
-#: src/slic3r/GUI/Plater.cpp:495 src/slic3r/GUI/Tab.cpp:3604
-#: src/slic3r/GUI/Tab.cpp:3605 src/libslic3r/PrintConfig.cpp:2614
-#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2630
-#: src/libslic3r/PrintConfig.cpp:2639 src/libslic3r/PrintConfig.cpp:2649
-#: src/libslic3r/PrintConfig.cpp:2675 src/libslic3r/PrintConfig.cpp:2682
-#: src/libslic3r/PrintConfig.cpp:2693 src/libslic3r/PrintConfig.cpp:2703
-#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2725
-#: src/libslic3r/PrintConfig.cpp:2735 src/libslic3r/PrintConfig.cpp:2744
-#: src/libslic3r/PrintConfig.cpp:2754 src/libslic3r/PrintConfig.cpp:2765
-#: src/libslic3r/PrintConfig.cpp:2773
+#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:663
+#: src/slic3r/GUI/Plater.cpp:361 src/slic3r/GUI/Tab.cpp:4014
+#: src/slic3r/GUI/Tab.cpp:4015 src/libslic3r/PrintConfig.cpp:2757
+#: src/libslic3r/PrintConfig.cpp:2764 src/libslic3r/PrintConfig.cpp:2773
+#: src/libslic3r/PrintConfig.cpp:2782 src/libslic3r/PrintConfig.cpp:2792
+#: src/libslic3r/PrintConfig.cpp:2802 src/libslic3r/PrintConfig.cpp:2839
+#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2857
+#: src/libslic3r/PrintConfig.cpp:2867 src/libslic3r/PrintConfig.cpp:2876
+#: src/libslic3r/PrintConfig.cpp:2889 src/libslic3r/PrintConfig.cpp:2899
+#: src/libslic3r/PrintConfig.cpp:2908 src/libslic3r/PrintConfig.cpp:2918
+#: src/libslic3r/PrintConfig.cpp:2929 src/libslic3r/PrintConfig.cpp:2937
msgid "Supports"
msgstr "Supporti"
-#: src/slic3r/GUI/Plater.cpp:1194
+#: src/slic3r/GUI/Plater.cpp:1103
msgid "supports and pad"
msgstr "supporti e pad"
-#: src/libslic3r/PrintConfig.cpp:1092
+#: src/libslic3r/PrintConfig.cpp:1185
msgid "Supports remaining times"
msgstr "Supporto Tempo residuo"
-#: src/libslic3r/PrintConfig.cpp:1101
+#: src/libslic3r/PrintConfig.cpp:1194
msgid "Supports stealth mode"
msgstr "Supporto modalità silenziosa"
-#: src/slic3r/GUI/ConfigManipulation.cpp:159
+#: src/slic3r/GUI/ConfigManipulation.cpp:158
msgid "Supports work better, if the following feature is enabled:\n- Detect bridging perimeters"
msgstr "I supporti funzionano meglio se le la seguente funzione è attivata:\n- Rileva perimetri ponte"
-#: src/slic3r/GUI/Preferences.cpp:87
+#: src/slic3r/GUI/Preferences.cpp:104
msgid "Suppress \" - default - \" presets"
msgstr "Nascondi i preset \" - default - \""
-#: src/slic3r/GUI/Preferences.cpp:89
+#: src/slic3r/GUI/Preferences.cpp:106
msgid "Suppress \" - default - \" presets in the Print / Filament / Printer selections once there are any other valid presets available."
msgstr "Nascondi i preset \" - default - \" nelle selezioni Stampa / Filamento / Stampante non appena sono disponibili altri preset validi."
-#: src/slic3r/GUI/MainFrame.cpp:826
+#: src/slic3r/GUI/Preferences.cpp:276
+msgid "Suppress to open hyperlink in browser"
+msgstr "Elimina per aprire il collegamento nel browser"
+
+#: src/slic3r/GUI/MainFrame.cpp:1527
msgid "SVG"
msgstr "SVG"
-#: src/slic3r/GUI/DoubleSlider.cpp:1144
+#: src/slic3r/GUI/Mouse3DController.cpp:318
+msgid "Swap Y/Z axes"
+msgstr "Inverti assi Y/Z"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+msgid "Switch between Editor/Preview"
+msgstr "Passare da Editor/Anteprima"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1273
msgid "Switch code to Change extruder"
msgstr "Passa il codice a Cambio estrusore"
-#: src/slic3r/GUI/DoubleSlider.cpp:1179
+#: src/slic3r/GUI/DoubleSlider.cpp:1306
msgid "Switch code to Color change (%1%) for:"
msgstr "Passa il codice a Cambio colore (%1%) per:"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:140
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:136
msgid "Switch to 3D"
msgstr "Passa a 3D"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1376
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223
msgid "Switch to editing mode"
msgstr "Passa alla modalità modifica"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:141
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:137
msgid "Switch to Preview"
msgstr "Passa ad Anteprima"
-#: src/slic3r/GUI/wxExtensions.cpp:703
+#: src/slic3r/GUI/GLCanvas3D.cpp:4302 src/slic3r/GUI/GLCanvas3D.cpp:4939
+msgid "Switch to Settings"
+msgstr "Passa a Impostazioni"
+
+#: src/slic3r/GUI/wxExtensions.cpp:623
#, possible-c-format
msgid "Switch to the %s mode"
msgstr "Passa alla modalità %s"
-#: src/slic3r/GUI/GUI_App.cpp:882
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:542
+msgid "Switching Presets: Unsaved Changes"
+msgstr "Cambio di preset: Modifiche non salvate"
+
+#: src/slic3r/GUI/GUI_App.cpp:1608
msgid "Switching the language will trigger application restart.\nYou will lose content of the plater."
msgstr "Il cambio della lingua necessita il riavvio dell'applicazione.\nVerrà cancellato il contenuto del piano."
@@ -7422,65 +8859,72 @@ msgstr "Il cambio della lingua necessita il riavvio dell'applicazione.\nVerrà c
msgid "Switching to simple settings will discard changes done in the advanced mode!\n\nDo you want to proceed?"
msgstr "Cambiare alle impostazioni semplici eliminerà tutte le modifiche fatte alle impostazioni complesse!\n\nProcedere?"
-#: src/slic3r/GUI/Tab.cpp:1014
+#: src/slic3r/GUI/Tab.cpp:1332
msgid "symbolic profile name"
msgstr "nome simbolico profilo"
-#: src/libslic3r/PrintConfig.cpp:2036
+#: src/libslic3r/PrintConfig.cpp:2178
msgid "Synchronize support layers with the object print layers. This is useful with multi-material printers, where the extruder switch is expensive."
msgstr "Sincronizza i layer di supporto con i layer dell'oggetto stampato. È utile con le stampanti multi-material, dove il cambio estrusore è costoso."
-#: src/libslic3r/PrintConfig.cpp:2034
+#: src/libslic3r/PrintConfig.cpp:2176
msgid "Synchronize with object layers"
msgstr "Sincronizza con i layer dell'oggetto"
-#: src/slic3r/GUI/MainFrame.cpp:699
+#: src/slic3r/GUI/MainFrame.cpp:924 src/slic3r/GUI/MainFrame.cpp:1323
msgid "System &Info"
msgstr "&Info di Sistema"
-#: src/slic3r/GUI/SysInfoDialog.cpp:78
+#: src/slic3r/GUI/SysInfoDialog.cpp:90 src/slic3r/GUI/SysInfoDialog.cpp:92
msgid "System Information"
msgstr "Informazioni di sistema"
-#: src/slic3r/GUI/Preset.cpp:1109 src/slic3r/GUI/Preset.cpp:1164
-#: src/slic3r/GUI/Preset.cpp:1242 src/slic3r/GUI/Preset.cpp:1284
-#: src/slic3r/GUI/PresetBundle.cpp:1583 src/slic3r/GUI/PresetBundle.cpp:1672
+#: src/slic3r/GUI/PresetComboBoxes.cpp:188
+#: src/slic3r/GUI/PresetComboBoxes.cpp:226
+#: src/slic3r/GUI/PresetComboBoxes.cpp:724
+#: src/slic3r/GUI/PresetComboBoxes.cpp:774
+#: src/slic3r/GUI/PresetComboBoxes.cpp:886
+#: src/slic3r/GUI/PresetComboBoxes.cpp:930
msgid "System presets"
msgstr "Preset di sistema"
-#: src/slic3r/GUI/GUI_App.cpp:801
+#: src/slic3r/GUI/GUI_App.cpp:1481
msgid "Take Configuration &Snapshot"
msgstr "Cattura I&stantanea di Configurazione"
-#: src/slic3r/GUI/GUI_App.cpp:839
+#: src/slic3r/GUI/GUI_App.cpp:1540
msgid "Taking configuration snapshot"
msgstr "Cattura istantanea della configurazione"
-#: src/slic3r/GUI/Tab.cpp:1433 src/libslic3r/PrintConfig.cpp:2067
+#: src/slic3r/GUI/Tab.cpp:1779
msgid "Temperature"
msgstr "Temperatura"
-#: src/libslic3r/PrintConfig.cpp:1804
+#: src/libslic3r/PrintConfig.cpp:1919
msgid "Temperature difference to be applied when an extruder is not active. Enables a full-height \"sacrificial\" skirt on which the nozzles are periodically wiped."
msgstr "La differenza di temperatura da applicare quando un estrusore non è attivo. Abilita uno skirt \"sacrificale\" a piena altezza su cui l'ugello verrà pulito periodicamente."
-#: src/libslic3r/PrintConfig.cpp:1803
+#: src/libslic3r/PrintConfig.cpp:1918
msgid "Temperature variation"
msgstr "Variazione di temperatura"
-#: src/slic3r/GUI/ConfigWizard.cpp:1017
+#: src/slic3r/GUI/ConfigWizard.cpp:1383
msgid "Temperatures"
msgstr "Temperature"
-#: src/slic3r/GUI/Tab.cpp:1677 src/slic3r/GUI/Tab.cpp:1915
+#: src/slic3r/GUI/Tab.cpp:2215
+msgid "Template Custom G-code"
+msgstr "Template G-code personalizzato"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:284
msgid "Test"
msgstr "Test"
-#: src/slic3r/GUI/BedShapeDialog.cpp:172
+#: src/slic3r/GUI/BedShapeDialog.cpp:315
msgid "Texture"
msgstr "Texture"
-#: src/slic3r/GUI/ConfigManipulation.cpp:208
+#: src/slic3r/GUI/ConfigManipulation.cpp:207
msgid "The %1% infill pattern is not supposed to work at 100%% density."
msgstr "La trama di riempimento %1% non è fatta per lavorare con densità al 100%%."
@@ -7494,372 +8938,438 @@ msgstr "Il dispositivo %s non è stato trovato"
msgid "The %s device was not found.\nIf the device is connected, please press the Reset button next to the USB connector ..."
msgstr "Il dispositivo %s non è stato trovato.\nSe il dispositivo è connesso, premi il pulsante Reset vicino al connettore USB ..."
-#: src/slic3r/GUI/Tab.cpp:976
+#: src/slic3r/GUI/Tab.cpp:1238
msgid "The current custom preset will be detached from the parent system preset."
msgstr "Il preset personalizzato corrente sarà staccato dal preset del sistema padre."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:925
msgid "The currently manipulated object is tilted (rotation angles are not multiples of 90°).\nNon-uniform scaling of tilted objects is only possible in the World coordinate system,\nonce the rotation is embedded into the object coordinates."
msgstr "L'oggetto modificato corrente è inclinato (angoli di rotazione non multipli di 90°).\nUn ridimensionamento non uniforme di un oggetto inclinato è possibile solamente su un sistema di coordinate reali, non appena la rotazione è inclusa nelle coordinate dell'oggetto."
-#: src/libslic3r/PrintConfig.cpp:2726
+#: src/libslic3r/PrintConfig.cpp:2890
msgid "The default angle for connecting support sticks and junctions."
msgstr "Angolo predefinito per la connessione delle barre di supporto e le giunzioni."
-#: src/libslic3r/SLAPrint.cpp:631
+#: src/libslic3r/SLAPrint.cpp:645
msgid "The endings of the support pillars will be deployed on the gap between the object and the pad. 'Support base safety distance' has to be greater than the 'Pad object gap' parameter to avoid this."
msgstr "La fine del pilastro di supporto si svilupperà nello spazio tra l'oggetto e il pad. La 'Distanza di sicurezza base di supporto' deve essere più grande del parametro 'Distanza Pad oggetto' per evitare questo."
-#: src/libslic3r/PrintConfig.cpp:489
+#: src/libslic3r/PrintConfig.cpp:525
msgid "The extruder to use (unless more specific extruder settings are specified). This value overrides perimeter and infill extruders, but not the support extruders."
msgstr "Estrusore da utilizzare (a meno che non siano specificate impostazioni d'estrusore più specifiche). Questo valore scavalca l'estrusore dei perimetri e di riempimento, ma non l'estrusore dei supporti."
-#: src/libslic3r/PrintConfig.cpp:1003
+#: src/libslic3r/PrintConfig.cpp:1047
msgid "The extruder to use when printing infill."
msgstr "L'estrusore da utilizzare per la stampa del riempimento."
-#: src/libslic3r/PrintConfig.cpp:1410
+#: src/libslic3r/PrintConfig.cpp:1518
msgid "The extruder to use when printing perimeters and brim. First extruder is 1."
msgstr "L'estrusore da utilizzare per la stampa dei perimetri e del brim. Il primo estrusore è 1."
-#: src/libslic3r/PrintConfig.cpp:1738
+#: src/libslic3r/PrintConfig.cpp:1853
msgid "The extruder to use when printing solid infill."
msgstr "L'estrusore da utilizzare per la stampa del riempimento solido."
-#: src/libslic3r/PrintConfig.cpp:1966
+#: src/libslic3r/PrintConfig.cpp:2108
msgid "The extruder to use when printing support material interface (1+, 0 to use the current extruder to minimize tool changes). This affects raft too."
msgstr "L'estrusore da utilizzare per la stampa dell'interfaccia del materiale di supporto (1+, 0 per usare l'estrusore attuale per minimizzare il cambio di attrezzo). Questo influenza anche il raft."
-#: src/libslic3r/PrintConfig.cpp:1939
+#: src/libslic3r/PrintConfig.cpp:2081
msgid "The extruder to use when printing support material, raft and skirt (1+, 0 to use the current extruder to minimize tool changes)."
msgstr "L'estrusore da utilizzare per la stampa del materiale di supporto, raft e skirt (1+, 0 per utilizzare l'estrusore attuale per minimizzare i cambi di attrezzo)."
-#: src/libslic3r/PrintConfig.cpp:727
+#: src/libslic3r/PrintConfig.cpp:763
msgid "The filament material type for use in custom G-codes."
msgstr "Tipo di materiale da usare nei G-code personalizzati."
-#: src/libslic3r/PrintConfig.cpp:3494
+#: src/libslic3r/PrintConfig.cpp:3693
msgid "The file where the output will be written (if not specified, it will be based on the input file)."
msgstr "Il file dove verrà scritto l'output (se non specificato, sarà basato sul file di input)."
-#: src/libslic3r/PrintConfig.cpp:1102
+#: src/libslic3r/PrintConfig.cpp:1195
msgid "The firmware supports stealth mode"
msgstr "Il firmware supporta la modalità silenziosa"
-#: src/libslic3r/PrintConfig.cpp:120
+#: src/libslic3r/PrintConfig.cpp:122
msgid "The first layer will be shrunk in the XY plane by the configured value to compensate for the 1st layer squish aka an Elephant Foot effect."
msgstr "Il primo layer verrà ristretto sul piano XY dal valore configurato, così da compensare per lo schiacciamento del 1° layer, anche noto come effetto Zampa d'elefante."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3820
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3927 src/slic3r/GUI/Tab.cpp:3457
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4283
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4410
+#: src/slic3r/GUI/SavePresetDialog.cpp:117
msgid "the following characters are not allowed:"
msgstr "non sono permessi i seguenti caratteri:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1830
+#: src/slic3r/GUI/ConfigWizard.cpp:2257
msgid "The following FFF printer models have no filament selected:"
msgstr "I seguenti modelli di stampante FFF non hanno nessun filamento selezionato:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1848
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1004
+msgid "The following presets were modified:"
+msgstr "I preset seguenti sono stati modificati:"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:253
+msgid "The following shortcuts are applicable in G-code preview when the horizontal slider is active"
+msgstr "Le seguenti scorciatoie sono applicabili nell'anteprima del G-code quando il cursore orizzontale è attivo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:237
+msgid "The following shortcuts are applicable in G-code preview when the vertical slider is active"
+msgstr "Le seguenti scorciatoie sono applicabili nell'anteprima del G-code quando il cursore verticale è attivo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+msgid "The following shortcuts are applicable when the specified gizmo is active"
+msgstr "Le seguenti scorciatoie sono applicabili quando il gizmo specificato è attivo"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2275
msgid "The following SLA printer models have no materials selected:"
msgstr "I seguenti modelli di stampante SLA non hanno nessun filamento selezionato:"
-#: src/slic3r/GUI/Tab.cpp:3461
+#: src/slic3r/GUI/SavePresetDialog.cpp:125
msgid "the following suffix is not allowed:"
msgstr "il seguente suffisso non è permesso:"
-#: src/libslic3r/PrintConfig.cpp:2871
+#: src/libslic3r/PrintConfig.cpp:3035
msgid "The gap between the object bottom and the generated pad in zero elevation mode."
msgstr "Lo spazio tra la parte inferiore dell'oggetto e il pad generato nella modalità ad elevazione zero."
-#: src/libslic3r/PrintConfig.cpp:2704
+#: src/libslic3r/PrintConfig.cpp:2868
msgid "The height of the pillar base cone"
msgstr "Altezza del cono alla base del pilastro"
-#: src/slic3r/GUI/DoubleSlider.cpp:1922
+#: src/slic3r/GUI/DoubleSlider.cpp:2140
msgid "The last color change data was saved for a multi extruder printing with tool changes for whole print."
msgstr "Gli ultimi dati del cambio colore sono stati salvati per una stampa a estrusore multiplo con cambi di attrezzo per l'intera stampa."
-#: src/slic3r/GUI/DoubleSlider.cpp:1900 src/slic3r/GUI/DoubleSlider.cpp:1916
+#: src/slic3r/GUI/DoubleSlider.cpp:2119 src/slic3r/GUI/DoubleSlider.cpp:2134
msgid "The last color change data was saved for a multi extruder printing."
msgstr "Gli ultimi dati del cambio colore sono stati salvati per una stampa a estrusore multiplo."
-#: src/slic3r/GUI/DoubleSlider.cpp:1899
+#: src/slic3r/GUI/DoubleSlider.cpp:2118
msgid "The last color change data was saved for a single extruder printing."
msgstr "I dati dell'ultimo cambio colore sono stati salvati per la stampa ad estrusore singolo."
-#: src/libslic3r/PrintConfig.cpp:2745
+#: src/libslic3r/PrintConfig.cpp:2909
msgid "The max distance of two pillars to get linked with each other. A zero value will prohibit pillar cascading."
msgstr "La distanza massima tra due pilastri per collegarsi gli uni agli altri. Un valore di zero impedisce i pilastri a cascata."
-#: src/libslic3r/PrintConfig.cpp:2736
+#: src/libslic3r/PrintConfig.cpp:2900
msgid "The max length of a bridge"
msgstr "La lunghezza massima di un bridge"
-#: src/libslic3r/PrintConfig.cpp:2714
+#: src/libslic3r/PrintConfig.cpp:190
+msgid "The maximum detour length for avoid crossing perimeters. If the detour is longer than this value, avoid crossing perimeters is not applied for this travel path. Detour length could be specified either as an absolute value or as percentage (for example 50%) of a direct travel path."
+msgstr "La lunghezza massima di deviazione per evitare di incrociare i perimetri. Se la deviazione è più lunga di questo valore, la funzione evita incrocio perimetri non viene applicata per questo percorso di spostamento. La lunghezza della deviazione può essere specificata sia come valore assoluto che come percentuale (ad esempio 50%) di un percorso di spostamento diretto."
+
+#: src/libslic3r/PrintConfig.cpp:2878
msgid "The minimum distance of the pillar base from the model in mm. Makes sense in zero elevation mode where a gap according to this parameter is inserted between the model and the pad."
msgstr "Distanza minima della base del pilastro dal modello in mm. Ha senso con modalità ad elevazione zero in cui viene inserito uno spazio tra modello e pad a seconda di questo parametro."
-#: src/libslic3r/PrintConfig.cpp:185
+#: src/slic3r/GUI/SavePresetDialog.cpp:142
+msgid "The name cannot be empty."
+msgstr "Il nome non può essere vuoto."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:152
+msgid "The name cannot end with space character."
+msgstr "Il nome non può terminare con il carattere spazio."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:147
+msgid "The name cannot start with space character."
+msgstr "Il nome non può iniziare con il carattere spazio."
+
+#: src/libslic3r/PrintConfig.cpp:219
msgid "The number of bottom solid layers is increased above bottom_solid_layers if necessary to satisfy minimum thickness of bottom shell."
msgstr "Il numero di layer solidi inferiori è aumentato al di sopra di bottom_solid_layers se necessario per soddisfare lo spessore minimo del guscio inferiore."
-#: src/libslic3r/PrintConfig.cpp:2143
+#: src/libslic3r/PrintConfig.cpp:2286
msgid "The number of top solid layers is increased above top_solid_layers if necessary to satisfy minimum thickness of top shell. This is useful to prevent pillowing effect when printing with variable layer height."
msgstr "Il numero di layer solidi superiori è aumentato al di sopra di top_solid_layers se necessario per soddisfare lo spessore minimo del guscio superiore. Questo è utile a prevenire l'effetto cuscinetto con la stampa ad altezza layer variabile."
-#: src/libslic3r/PrintConfig.cpp:2277
+#: src/slic3r/GUI/Plater.cpp:2326
+msgid "The object appears to be saved in inches"
+msgstr "L'oggetto sembra essere stato salvato in pollici"
+
+#: src/libslic3r/PrintConfig.cpp:2420
msgid "The object will be grown/shrunk in the XY plane by the configured value (negative = inwards, positive = outwards). This might be useful for fine-tuning hole sizes."
msgstr "L'oggetto verrà allargato/ristretto sul piano XY dal valore configurato (negativo = verso l'interno, positivo = verso l'esterno). Questo può essere utile per regolare la grandezza dei fori."
-#: src/libslic3r/PrintConfig.cpp:1503
+#: src/libslic3r/PrintConfig.cpp:1611
msgid "The object will be raised by this number of layers, and support material will be generated under it."
msgstr "L'oggetto verrà sollevato per questo numero di layer e verrà generato il materiale di supporto al di sotto di esso."
-#: src/libslic3r/PrintConfig.cpp:2424
+#: src/libslic3r/PrintConfig.cpp:2803
+msgid "The percentage of smaller pillars compared to the normal pillar diameter which are used in problematic areas where a normal pilla cannot fit."
+msgstr "La percentuale di pilastri più piccoli rispetto al diametro normale dei pilastri che vengono utilizzati in aree problematiche in cui un normale pilastro non può adattarsi."
+
+#: src/libslic3r/PrintConfig.cpp:2567
msgid "The percentage of the bed area. \nIf the print area exceeds the specified value, \nthen a slow tilt will be used, otherwise - a fast tilt"
msgstr "La percentuale dell'area del piano.\nSe l'area di stampa supera un determinato valore,\nverrà utilizzata l'inclinazione lenta, in caso contrario - l'inclinazione veloce"
-#: src/slic3r/GUI/GUI_App.cpp:932
-msgid "The presets on the following tabs were modified"
-msgstr "Sono stati modificati i preset nelle seguenti schede"
+#: src/slic3r/GUI/Tab.cpp:3430
+msgid "The physical printer(s) below is based on the preset, you are going to delete."
+msgstr "La(e) stampante(e) fisica(e) sottostante(i) si basa(no) solo sul preset che si intende cancellare."
+
+#: src/slic3r/GUI/Tab.cpp:3438
+msgid "The physical printer(s) below is based only on the preset, you are going to delete."
+msgstr "La(e) stampante(e) fisica(e) sottostante(i) si basa(no) solo sul preset che si intende cancellare."
-#: src/libslic3r/PrintConfig.cpp:1846
+#: src/slic3r/GUI/GUI_App.cpp:1676
+msgid "The preset(s) modifications are successfully saved"
+msgstr "Le modifiche dei preset sono state salvate correttamente"
+
+#: src/libslic3r/PrintConfig.cpp:1988
msgid "The printer multiplexes filaments into a single hot end."
msgstr "La stampante processa diversi filamenti in un singolo hotend."
-#: src/libslic3r/Format/3mf.cpp:1630
+#: src/libslic3r/Format/3mf.cpp:1667
msgid "The selected 3mf file has been saved with a newer version of %1% and is not compatible."
msgstr "Il file 3mf selezionato è stato salvato con una versione più recente di %1% e non è compatibile."
-#: src/libslic3r/Format/AMF.cpp:934
+#: src/libslic3r/Format/AMF.cpp:955
msgid "The selected amf file has been saved with a newer version of %1% and is not compatible."
msgstr "Il file amf selezionato è stato salvato con una versione più recente di %1% e non è compatibile."
-#: src/slic3r/GUI/BedShapeDialog.cpp:513
+#: src/slic3r/GUI/Plater.cpp:4751
+msgid "The selected file"
+msgstr "Il file selezionato"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:589
msgid "The selected file contains no geometry."
msgstr "Il file selezionato non contiene geometrie."
-#: src/slic3r/GUI/BedShapeDialog.cpp:517
+#: src/slic3r/GUI/BedShapeDialog.cpp:593
msgid "The selected file contains several disjoint areas. This is not supported."
msgstr "Il file selezionato contiene molteplici aree disgiunte. Non è supportato."
-#: src/slic3r/GUI/Plater.cpp:2970
+#: src/slic3r/GUI/Plater.cpp:2763
msgid "The selected object can't be split because it contains more than one volume/material."
msgstr "L'oggetto selezionato non può essere diviso perché contiene più di un volume/materiale."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2270 src/slic3r/GUI/Plater.cpp:2978
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2436 src/slic3r/GUI/Plater.cpp:2771
msgid "The selected object couldn't be split because it contains only one part."
msgstr "L'oggetto selezionato non può essere diviso perché contiene solo una parte."
-#: src/slic3r/GUI/MainFrame.cpp:461
+#: src/slic3r/GUI/MainFrame.cpp:1003
msgid "The selected project is no longer available.\nDo you want to remove it from the recent projects list?"
msgstr "Il progetto selezionato non è più disponibile.\nVuoi rimuoverlo dall'elenco dei progetti recenti?"
-#: src/slic3r/GUI/DoubleSlider.cpp:998
+#: src/slic3r/GUI/DoubleSlider.cpp:1121
msgid "The sequential print is on.\nIt's impossible to apply any custom G-code for objects printing sequentually.\nThis code won't be processed during G-code generation."
msgstr "La stampa sequenziale è attiva.\nNon è possibile applicare alcun G-code personalizzato per oggetti con stampa sequenziale.\nQuesto codice non sarà processato durante la generazione del G-code."
-#: src/libslic3r/PrintConfig.cpp:2846
+#: src/slic3r/GUI/ConfigWizard.cpp:1187
+msgid "The size of the object can be specified in inches"
+msgstr "La dimensione dell'oggetto può essere specificata in pollici"
+
+#: src/libslic3r/PrintConfig.cpp:3010
msgid "The slope of the pad wall relative to the bed plane. 90 degrees means straight walls."
msgstr "Inclinazione della parete del pad relativa al piano. 90 gradi equivale a pareti dritte."
-#: src/libslic3r/PrintConfig.cpp:1614
+#: src/libslic3r/PrintConfig.cpp:1722
msgid "The speed for loading of a filament into extruder after retraction (it only applies to the extruder motor). If left to zero, the retraction speed is used."
msgstr "La velocità di caricamento di un filamento nell'estrusore dopo la retrazione (si applica solamente al motore dell'estrusore). Se lasciato a zero, verrà utilizzata la velocità di retrazione."
-#: src/libslic3r/PrintConfig.cpp:1606
+#: src/libslic3r/PrintConfig.cpp:1714
msgid "The speed for retractions (it only applies to the extruder motor)."
msgstr "Velocità delle retrazioni (si applica solamente al motore dell'estrusore)."
-#: src/slic3r/GUI/ConfigManipulation.cpp:81
-#, no-c-format
+#: src/slic3r/GUI/ConfigManipulation.cpp:80
+#, possible-c-format
msgid "The Spiral Vase mode requires:\n- one perimeter\n- no top solid layers\n- 0% fill density\n- no support material\n- Ensure vertical shell thickness enabled\n- Detect thin walls disabled"
msgstr "La modalità Vaso a spirale necessita:\n-un solo perimetro\n-nessun layer solido superiore\n-densità riempimento 0%\n-nessun materiale di supporto\n-Mantieni spessore guscio verticale attivo\n-Rileva perimetri sottili disattivo"
-#: src/libslic3r/Print.cpp:1237
-msgid "The Spiral Vase option can only be used when printing a single object."
-msgstr "L'opzione Vaso a Spirale può essere utilizzata soltanto durante la stampa di un oggetto singolo."
-
-#: src/libslic3r/Print.cpp:1244
+#: src/libslic3r/Print.cpp:1270
msgid "The Spiral Vase option can only be used when printing single material objects."
msgstr "L'opzione Vaso a Spirale può essere usata solo durante la stampa di oggetti in materiale singolo."
-#: src/slic3r/GUI/Tab.cpp:3068
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:464
msgid "The supplied name is empty. It can't be saved."
msgstr "Il nome fornito è vuoto. Non può essere salvato."
-#: src/slic3r/GUI/Tab.cpp:3465
+#: src/slic3r/GUI/SavePresetDialog.cpp:131
msgid "The supplied name is not available."
msgstr "Il nome fornito non è disponibile."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3819
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3926 src/slic3r/GUI/Tab.cpp:3456
-#: src/slic3r/GUI/Tab.cpp:3460
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4282
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4409
+#: src/slic3r/GUI/SavePresetDialog.cpp:116
+#: src/slic3r/GUI/SavePresetDialog.cpp:124
msgid "The supplied name is not valid;"
msgstr "Il nome fornito non è valido;"
-#: src/libslic3r/Print.cpp:1222
+#: src/libslic3r/Print.cpp:1248
msgid "The supplied settings will cause an empty print."
msgstr "Le configurazioni fornite causeranno una stampa vuota."
-#: src/libslic3r/PrintConfig.cpp:2789
+#: src/libslic3r/PrintConfig.cpp:2953
msgid "The thickness of the pad and its optional cavity walls."
msgstr "Lo spessore del pad e delle intercapedini opzionali."
-#: src/libslic3r/PrintConfig.cpp:1911
+#: src/slic3r/GUI/GUI_App.cpp:1781
+msgid "The uploads are still ongoing"
+msgstr "I caricamenti sono ancora in corso"
+
+#: src/libslic3r/PrintConfig.cpp:2053
msgid "The vertical distance between object and support material interface. Setting this to 0 will also prevent Slic3r from using bridge flow and speed for the first object layer."
msgstr "Distanza verticale tra oggetto e interfaccia del materiale di supporto. Impostando questo valore a 0 eviterà che Slic3r utilizzi il flusso e velocità bridge per il primo layer dell'oggetto."
-#: src/slic3r/GUI/Tab.cpp:2575
+#: src/slic3r/GUI/Tab.cpp:2731
msgid "The Wipe option is not available when using the Firmware Retraction mode.\n\nShall I disable it in order to enable Firmware Retraction?"
msgstr "La funzione Wipe non è disponibile quando si usa la modalità Retrazione Firmware.\n\nDevo disattivarla per poter abilitare la Retrazione Firmware?"
-#: src/libslic3r/Print.cpp:1268
+#: src/libslic3r/Print.cpp:1294
msgid "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)."
msgstr "La Torre di Spurgo attualmente non supporta la volumetrica E (use_volumetric_e=0)."
-#: src/slic3r/GUI/ConfigManipulation.cpp:115
+#: src/slic3r/GUI/ConfigManipulation.cpp:114
msgid "The Wipe Tower currently supports the non-soluble supports only\nif they are printed with the current extruder without triggering a tool change.\n(both support_material_extruder and support_material_interface_extruder need to be set to 0)."
msgstr "La Torre di Spurgo attualmente è compatibile con i supporti non solubili solamente se questi sono stampati con l'attuale estrusore senza l'innesco di un cambio attrezzo. (entrambi support_material_extruder e support_material_interface_extruder devono essere impostati a 0)."
-#: src/libslic3r/Print.cpp:1400
+#: src/libslic3r/Print.cpp:1426
msgid "The Wipe Tower currently supports the non-soluble supports only if they are printed with the current extruder without triggering a tool change. (both support_material_extruder and support_material_interface_extruder need to be set to 0)."
msgstr "La Torre di Spurgo attualmente è compatibile con i supporti non solubili solamente se questi sono stampati con l'attuale estrusore senza l'innesco di un cambio attrezzo. (entrambi support_material_extruder e support_material_interface_extruder devono essere impostati a 0)."
-#: src/libslic3r/Print.cpp:1270
+#: src/libslic3r/Print.cpp:1296
msgid "The Wipe Tower is currently not supported for multimaterial sequential prints."
msgstr "La Torre di spurgo non è al momento supportata per stampe multi-material sequenziali."
-#: src/libslic3r/Print.cpp:1262
-msgid "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter and Repetier G-code flavors."
-msgstr "La torre di spurgo al momento è supportata solo nelle versioni G-code per Marlin, RepRap/Sprinter e Repetier."
+#: src/libslic3r/Print.cpp:1290
+msgid "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, RepRapFirmware and Repetier G-code flavors."
+msgstr "La Torre di spurgo è al momento supportata solo da varianti G-code Marlin, RepRap/Sprinter, RepRapFirmware e Repetier."
-#: src/libslic3r/Print.cpp:1264
+#: src/libslic3r/Print.cpp:1290
msgid "The Wipe Tower is currently only supported with the relative extruder addressing (use_relative_e_distances=1)."
msgstr "Attualmente la Torre di spurgo è supportata solo con l'indirizzamento relativo dell'estrusore (use_relative_e_distances = 1)."
-#: src/libslic3r/Print.cpp:1293
+#: src/libslic3r/Print.cpp:1319
msgid "The Wipe Tower is only supported for multiple objects if they are printed over an equal number of raft layers"
msgstr "La Torre di spurgo è supportata con oggetti multipli solo se questi vengono stampati sullo stesso numero di layer di raft"
-#: src/libslic3r/Print.cpp:1295
+#: src/libslic3r/Print.cpp:1321
msgid "The Wipe Tower is only supported for multiple objects if they are printed with the same support_material_contact_distance"
msgstr "La Torre di spurgo è supportata con oggetti multipli solo se questi vengono stampati sullo stesso support_material_contact_distance"
-#: src/libslic3r/Print.cpp:1297
+#: src/libslic3r/Print.cpp:1323
msgid "The Wipe Tower is only supported for multiple objects if they are sliced equally."
msgstr "La Torre di spurgo è supportata con oggetti multipli solo se questi sono processati allo stesso modo."
-#: src/libslic3r/Print.cpp:1291
+#: src/libslic3r/Print.cpp:1317
msgid "The Wipe Tower is only supported for multiple objects if they have equal layer heights"
msgstr "La Torre di spurgo è supportata con oggetti multipli solo se questi hanno la stessa altezza layer"
-#: src/libslic3r/Print.cpp:1257
+#: src/libslic3r/Print.cpp:1283
msgid "The wipe tower is only supported if all extruders have the same nozzle diameter and use filaments of the same diameter."
msgstr "La torre di spurgo è supportata solo se tutti gli estrusori hanno l'ugello con lo stesso diametro ed utilizzano filamenti con lo stesso diametro."
-#: src/libslic3r/Print.cpp:1339
+#: src/libslic3r/Print.cpp:1365
msgid "The Wipe tower is only supported if all objects have the same variable layer height"
msgstr "La Torre di spurgo è supportata solo se tutti gli oggetti hanno la stessa altezza layer variabile"
-#: src/libslic3r/SLAPrintSteps.cpp:621
+#: src/slic3r/GUI/Plater.cpp:3563
+msgid "There are active warnings concerning sliced models:"
+msgstr "Sono presenti avvisi attivi relativi ai modelli processati:"
+
+#: src/libslic3r/SLAPrintSteps.cpp:619
msgid "There are unprintable objects. Try to adjust support settings to make the objects printable."
msgstr "Sono presenti oggetti non stampabili. Prova a regolare le impostazioni dei supporti per rendere gli oggetti stampabili."
-#: src/slic3r/GUI/DoubleSlider.cpp:1030
+#: src/slic3r/GUI/DoubleSlider.cpp:1155
msgid "There is a color change for extruder that has not been used before.\nCheck your settings to avoid redundant color changes."
msgstr "È presente un cambio colore per l'estrusore che non è stato usato prima.\nControlla le impostazioni per evitare cambi colore ridondanti."
-#: src/slic3r/GUI/DoubleSlider.cpp:1024
+#: src/slic3r/GUI/DoubleSlider.cpp:1149
msgid "There is a color change for extruder that won't be used till the end of print job.\nThis code won't be processed during G-code generation."
msgstr "È presente un cambio colore per l'estrusore che non sarà utilizzato fino alla fine del lavoro di stampa.\nQuesto codice non sarà processato durante la generazione del G-code."
-#: src/slic3r/GUI/DoubleSlider.cpp:1027
+#: src/slic3r/GUI/DoubleSlider.cpp:1152
msgid "There is an extruder change set to the same extruder.\nThis code won't be processed during G-code generation."
msgstr "È presente un cambio estrusore impostato nello stesso estrusore.\nQuesto codice non verrà processato durante la generazione del G-code."
+#: src/libslic3r/GCode.cpp:604
+msgid "There is an object with no extrusions on the first layer."
+msgstr "C'è un oggetto senza estrusioni sul primo layer."
+
#: src/slic3r/GUI/UpdateDialogs.cpp:225
#, possible-c-format
msgid "This %s version: %s"
msgstr "%s versione: %s"
-#: src/slic3r/GUI/Tab.cpp:982
+#: src/slic3r/GUI/Tab.cpp:1244
msgid "This action is not revertable.\nDo you want to proceed?"
msgstr "Questa azione non è reversibile.\nVuoi continuare?"
-#: src/libslic3r/PrintConfig.cpp:165
+#: src/libslic3r/PrintConfig.cpp:199
msgid "This code is inserted between objects when using sequential printing. By default extruder and bed temperature are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."
msgstr "Questo codice è inserito tra gli oggetti quando si utilizza una stampa sequenziale. Come predefinito, la temperatura di estrusione e del piano sono resettate con il comando non-attesa; in ogni caso se nel codice personalizzato vengono rilevati i comandi M104,M109,M140 o M190, Slic3r non aggiungerà i comandi di temperatura. Si fa presente che puoi usare variabili sostitutive per tutte le impostazioni di Slic3r, quindi puoi inserire un comando \"M109 S[first_layer_temperature]\" quando preferisci."
-#: src/libslic3r/PrintConfig.cpp:1081
+#: src/libslic3r/PrintConfig.cpp:1174
msgid "This custom code is inserted at every layer change, right after the Z move and before the extruder moves to the first layer point. Note that you can use placeholder variables for all Slic3r settings as well as [layer_num] and [layer_z]."
msgstr "Questo codice personalizzato è inserito ad ogni cambio layer, subito dopo il movimento Z e prima che l'estrusore si sposti al punto del primo layer. Si fa presente che puoi usare variabili sostitutive per tutte le impostazioni di Slic3r sia per [layer_num] che per [layer_z]."
-#: src/libslic3r/PrintConfig.cpp:154
+#: src/libslic3r/PrintConfig.cpp:188
msgid "This custom code is inserted at every layer change, right before the Z move. Note that you can use placeholder variables for all Slic3r settings as well as [layer_num] and [layer_z]."
msgstr "Questo codice personalizzato è inserito ad ogni cambio layer, subito prima del movimento Z. Si fa presente che puoi usare variabili sostitutive per tutte le impostazioni di Slic3r sia per [layer_num] che per [layer_z]."
-#: src/libslic3r/PrintConfig.cpp:2094
+#: src/libslic3r/PrintConfig.cpp:2237
msgid "This custom code is inserted before every toolchange. Placeholder variables for all PrusaSlicer settings as well as {previous_extruder} and {next_extruder} can be used. When a tool-changing command which changes to the correct extruder is included (such as T{next_extruder}), PrusaSlicer will emit no other such command. It is therefore possible to script custom behaviour both before and after the toolchange."
msgstr "Questo codice personalizzato è inserito prima di ogni cambio attrezzo. Possono essere usate delle variabili segnaposto per tutte le impostazioni di PrusaSlicer come {previous_extruder} e {next_extruder}. Quando viene incluso un comando di cambio attrezzo che cambia all'estrusore corretto (come T{next_extruder}), PrusaSlicer non emetterà altri comandi simili. È per tanto possibile elaborare un comportamento personalizzato sia prima che dopo il cambio attrezzo."
-#: src/libslic3r/PrintConfig.cpp:396
+#: src/libslic3r/PrintConfig.cpp:430
msgid "This end procedure is inserted at the end of the output file, before the printer end gcode (and before any toolchange from this filament in case of multimaterial printers). Note that you can use placeholder variables for all PrusaSlicer settings. If you have multiple extruders, the gcode is processed in extruder order."
msgstr "Questa procedura finale è inserita alla fine del file di output, prima che la stampante completi il gcode (e prima di qualunque cambio attrezzo da questo filamento in caso di stampanti multi-material). Da notare che è possibile inserire variabili segnaposto per tutte le impostazioni di PrusaSlicer. Se hai estrusori multipli, il gcode è processato nell'ordine degli estrusori."
-#: src/libslic3r/PrintConfig.cpp:386
+#: src/libslic3r/PrintConfig.cpp:420
msgid "This end procedure is inserted at the end of the output file. Note that you can use placeholder variables for all PrusaSlicer settings."
msgstr "Questa procedura finale è inserita alla fine del file di output. Da notare che è possibile usare variabili segnaposto per tutte le impostazioni di PrusaSlicer."
-#: src/libslic3r/PrintConfig.cpp:1258 src/libslic3r/PrintConfig.cpp:1269
+#: src/libslic3r/PrintConfig.cpp:1366 src/libslic3r/PrintConfig.cpp:1377
msgid "This experimental setting is used to limit the speed of change in extrusion rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds."
msgstr "Questa impostazione sperimentale è utilizzata per limitare la velocità del cambio nel fattore di estrusione. Un valore di 1.8 mm³/s² assicura che un cambio dal fattore di estrusione di 1.8 mm³/s (larghezza estrusione 0.45mm, altezza estrusione di 0.2mm, avanzamento 20 mm/s) a 5.4 mm³/s (avanzamento a 60 mm/s) impiegherà almeno 2 secondi."
-#: src/libslic3r/PrintConfig.cpp:1248
+#: src/libslic3r/PrintConfig.cpp:1356
msgid "This experimental setting is used to set the maximum volumetric speed your extruder supports."
msgstr "Questa impostazione sperimentale è utilizzata per impostare la massima velocità volumetrica supportata dal tuo estrusore."
-#: src/libslic3r/PrintConfig.cpp:2162
+#: src/libslic3r/PrintConfig.cpp:2305
msgid "This experimental setting uses G10 and G11 commands to have the firmware handle the retraction. This is only supported in recent Marlin."
msgstr "Questa funziona sperimentale utilizza i comandi G10 e G11 per permettere al firmware la gestione della retrazione. È supportata solo nel Marlin recente."
-#: src/libslic3r/PrintConfig.cpp:2176
+#: src/libslic3r/PrintConfig.cpp:2319
msgid "This experimental setting uses outputs the E values in cubic millimeters instead of linear millimeters. If your firmware doesn't already know filament diameter(s), you can put commands like 'M200 D[filament_diameter_0] T0' in your start G-code in order to turn volumetric mode on and use the filament diameter associated to the filament selected in Slic3r. This is only supported in recent Marlin."
msgstr "Questa impostazione sperimentale produce un valore in uscita di E in millimetri cubici anziché in millimetri lineari. Se il tuo firmware non sa ancora qual'è il diametro del filamento, puoi inserire un comando tipo 'M200 D[filament_diameter_0] T0' nel tuo G-code iniziale in modo da attivare la funzione volumetrica e usare il diametro associato al filamento selezionato su Slic3r. Questa funziona è supportata solo nel Marlin più recente."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3972
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4459
msgid "This extruder will be set for selected items"
msgstr "L'estrusore sarà impostato per gli elementi selezionati"
-#: src/libslic3r/PrintConfig.cpp:224
+#: src/libslic3r/PrintConfig.cpp:258
msgid "This factor affects the amount of plastic for bridging. You can decrease it slightly to pull the extrudates and prevent sagging, although default settings are usually good and you should experiment with cooling (use a fan) before tweaking this."
msgstr "Questo valore influenza la quantità di plastica per il bridging. Puoi diminuirlo leggermente per tendere il materiale estruso ed evitare che si afflosci, sebbene le impostazioni predefinite sono generalmente buone ed è consigliabile sperimentare con il raffreddamento (usare la ventola) prima di modificare questo valore."
-#: src/libslic3r/PrintConfig.cpp:546
+#: src/libslic3r/PrintConfig.cpp:582
msgid "This factor changes the amount of flow proportionally. You may need to tweak this setting to get nice surface finish and correct single wall widths. Usual values are between 0.9 and 1.1. If you think you need to change this more, check filament diameter and your firmware E steps."
msgstr "Questo valore modifica proporzionalmente il valore del flusso. Dovrai modificare questa impostazione per ottenere una buona finitura superficiale e correggere la larghezza delle pareti singole. Normalmente i valori sono tra 0.9 e 1.1. Se ritieni di dover modificare questo valore ulteriormente, controlla il diametro del filamento e i passi E del tuo firmware."
-#: src/libslic3r/PrintConfig.cpp:214
+#: src/libslic3r/PrintConfig.cpp:248
msgid "This fan speed is enforced during all bridges and overhangs."
msgstr "Questa velocità della ventola verrà forzata durante tutti i bridge e overhang."
-#: src/libslic3r/PrintConfig.cpp:992
+#: src/libslic3r/PrintConfig.cpp:1036
msgid "This feature allows to combine infill and speed up your print by extruding thicker infill layers while preserving thin perimeters, thus accuracy."
msgstr "Questa funzione permette di combinare il riempimento e velocizza il tempo di stampa estrudendo layer di infill più spessi conservando tuttavia i perimetri sottili, e quindi l'accuratezza."
-#: src/libslic3r/PrintConfig.cpp:1746
+#: src/libslic3r/PrintConfig.cpp:1861
msgid "This feature allows to force a solid layer every given number of layers. Zero to disable. You can set this to any value (for example 9999); Slic3r will automatically choose the maximum possible number of layers to combine according to nozzle diameter and layer height."
msgstr "Questa funzione permette di forzare un layer solido ogni tot layer. Zero per disabilitare. È possibile impostare qualunque valore (per esempio 9999); Slic3r sceglierà automaticamente il maggior numero possibile di layer da combinare secondo il diametro dell'ugello e l'altezza layer."
-#: src/libslic3r/PrintConfig.cpp:1795
-msgid "This feature will raise Z gradually while printing a single-walled object in order to remove any visible seam. This option requires a single perimeter, no infill, no top solid layers and no support material. You can still set any number of bottom solid layers as well as skirt/brim loops. It won't work when printing more than an object."
-msgstr "Questa funzione solleverà Z gradualmente durante la stampa di un oggetto a parete singola allo scopo di rimuovere qualunque giunzione. Questa opzione richiede un singolo perimetro, nessun riempimento, nessun layer solido superiore e nessun materiale di supporto. È possibile comunque impostare qualunque numero di layer solidi inferiori così come per i giri di skirt/brim. Non funzionerà stampando più di un oggetto."
+#: src/libslic3r/PrintConfig.cpp:1995
+msgid "This feature will raise Z gradually while printing a single-walled object in order to remove any visible seam. This option requires a single perimeter, no infill, no top solid layers and no support material. You can still set any number of bottom solid layers as well as skirt/brim loops. It won't work when printing more than one single object."
+msgstr "Questa funzione solleverà Z gradualmente durante la stampa di un oggetto a parete singola allo scopo di rimuovere qualunque giunzione. Questa opzione richiede un singolo perimetro, nessun riempimento, nessun layer solido superiore e nessun materiale di supporto. È possibile comunque impostare qualunque numero di layer solidi inferiori così come per i giri di skirt/brim. Non funzionerà stampando più di un oggetto singolo."
-#: src/slic3r/GUI/Plater.cpp:2367
+#: src/slic3r/GUI/Plater.cpp:2329
msgid "This file cannot be loaded in a simple mode. Do you want to switch to an advanced mode?"
msgstr "Non è possibile caricare questo file in modalità semplice. Si desidera passare alla modalità avanzata?"
-#: src/slic3r/GUI/Plater.cpp:2357
+#: src/slic3r/GUI/Plater.cpp:2319
msgid "This file contains several objects positioned at multiple heights.\nInstead of considering them as multiple objects, should I consider\nthis file as a single object having multiple parts?"
msgstr "Questo file contiene numerosi oggetti posizionati ad altezze multiple. Invece di considerarli come oggetti multipli, devo considerare \nquesto file come un oggetto singolo con parti multiple?"
@@ -7868,112 +9378,128 @@ msgstr "Questo file contiene numerosi oggetti posizionati ad altezze multiple. I
msgid "This firmware hex file does not match the printer model.\nThe hex file is intended for: %s\nPrinter reported: %s\n\nDo you want to continue and flash this hex file anyway?\nPlease only continue if you are sure this is the right thing to do."
msgstr "Questo file hex di firmware non è corretto per il modello della stampante. \nIl file hex è per: %s\nLa stampante è: %s\n\nVuoi continuare ed installare il firmware comunque?\nContinua solo se sei certo che sia la cosa giusta da fare."
-#: src/libslic3r/PrintConfig.cpp:314
+#: src/libslic3r/PrintConfig.cpp:348
msgid "This flag enables the automatic cooling logic that adjusts print speed and fan speed according to layer printing time."
msgstr "Questa funzione abilita il raffreddamento automatico che regola la velocità di stampa e la velocità della ventola in base al tempo di stampa del layer."
-#: src/slic3r/GUI/Plater.cpp:536
+#: src/slic3r/GUI/Plater.cpp:402
msgid "This flag enables the brim that will be printed around each object on the first layer."
msgstr "La spunta su questa opzione abilita il brim che verrà stampato attorno ad ogni oggetto nel primo layer."
-#: src/libslic3r/PrintConfig.cpp:1538
+#: src/libslic3r/PrintConfig.cpp:1646
msgid "This flag enforces a retraction whenever a Z move is done."
msgstr "Questo contrassegno forza una retrazione ogni volta che viene effettuato un movimento di Z."
-#: src/libslic3r/PrintConfig.cpp:2194
+#: src/libslic3r/PrintConfig.cpp:2337
msgid "This flag will move the nozzle while retracting to minimize the possible blob on leaky extruders."
msgstr "Questo contrassegno farà spostare l'ugello durante la retrazione in modo da minimizzare il possibile grumo con estrusori che trasudano."
-#: src/slic3r/GUI/Tab.cpp:953
+#: src/libslic3r/PrintConfig.cpp:1961
+msgid "This G-code will be used as a code for the color change"
+msgstr "Questo G-code verrà utilizzato come codice per il cambio colore"
+
+#: src/libslic3r/PrintConfig.cpp:1970
+msgid "This G-code will be used as a code for the pause print"
+msgstr "Questo G-code sarà usato come codice per la pausa di stampa"
+
+#: src/libslic3r/PrintConfig.cpp:1979
+msgid "This G-code will be used as a custom code"
+msgstr "Questo G-code verrà utilizzato come codice personalizzato"
+
+#: src/slic3r/GUI/Tab.cpp:1272
msgid "This is a default preset."
msgstr "Questo è un preset predefinito."
-#: src/libslic3r/PrintConfig.cpp:2766
+#: src/libslic3r/PrintConfig.cpp:2930
msgid "This is a relative measure of support points density."
msgstr "Questa è una misura relativa della densità dei punti di supporto."
-#: src/slic3r/GUI/Tab.cpp:2338
+#: src/slic3r/GUI/Tab.cpp:2507
msgid "This is a single extruder multimaterial printer, diameters of all extruders will be set to the new value. Do you want to proceed?"
msgstr "Questa è una stampante multi-material ad estrusore singolo, i diametri di tutti gli estrusori verranno impostati al nuovo valore. Vuoi continuare?"
-#: src/slic3r/GUI/Tab.cpp:955
+#: src/slic3r/GUI/Tab.cpp:1274
msgid "This is a system preset."
msgstr "Questo è un preset di sistema."
-#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:583
+#: src/libslic3r/PrintConfig.cpp:559 src/libslic3r/PrintConfig.cpp:619
msgid "This is only used in the Slic3r interface as a visual help."
msgstr "Utilizzato solo nell'interfaccia di Slic3r come aiuto visivo."
-#: src/libslic3r/PrintConfig.cpp:336
+#: src/libslic3r/PrintConfig.cpp:370
msgid "This is the acceleration your printer will be reset to after the role-specific acceleration values are used (perimeter/infill). Set zero to prevent resetting acceleration at all."
msgstr "Questa è l'accelerazione a cui la stampante sarà reimpostata dopo aver utilizzato un valore di accelerazione per un ruolo specifico (perimetro/riempimento). Imposta a zero per evitare del tutto la reimpostazione dell'accelerazione."
-#: src/libslic3r/PrintConfig.cpp:194
+#: src/libslic3r/PrintConfig.cpp:228
msgid "This is the acceleration your printer will use for bridges. Set zero to disable acceleration control for bridges."
msgstr "Questa è l'accelerazione che la tua stampante utilizzerà per i bridge. Impostala a zero per disattivare il controllo dell'accelerazione per i bridge."
-#: src/libslic3r/PrintConfig.cpp:860
+#: src/libslic3r/PrintConfig.cpp:900
msgid "This is the acceleration your printer will use for first layer. Set zero to disable acceleration control for first layer."
msgstr "Questa è l'accelerazione che la stampante utilizzerà per il primo layer. Imposta a zero per disattivare il controllo dell'accelerazione per il primo layer."
-#: src/libslic3r/PrintConfig.cpp:982
+#: src/libslic3r/PrintConfig.cpp:1026
msgid "This is the acceleration your printer will use for infill. Set zero to disable acceleration control for infill."
msgstr "Questa è l'accelerazione che la stampante utilizzerà per il riempimento. Imposta a zero per disattivare il controllo dell'accelerazione per il riempimento."
-#: src/libslic3r/PrintConfig.cpp:1400
-msgid "This is the acceleration your printer will use for perimeters. A high value like 9000 usually gives good results if your hardware is up to the job. Set zero to disable acceleration control for perimeters."
-msgstr "Questa è l'accelerazione che la stampante utilizzerà per i perimetri. Un valore alto come 9000 solitamente produce dei buoni risultati se l'hardware è all'altezza. Imposta a zero per disattivare il controllo dell'accelerazione per i perimetri."
+#: src/libslic3r/PrintConfig.cpp:1582
+msgid "This is the acceleration your printer will use for perimeters. Set zero to disable acceleration control for perimeters."
+msgstr "Questa è l'accelerazione che la stampante utilizzerà per i perimetri. Impostare zero per disabilitare il controllo dell'accelerazione per i perimetri."
-#: src/libslic3r/PrintConfig.cpp:1327
+#: src/libslic3r/PrintConfig.cpp:1435
msgid "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)"
msgstr "Questo è il diametro dell'ugello dell'estrusore (per esempio: 0.5, 0.35 ecc.)"
-#: src/libslic3r/PrintConfig.cpp:1227
-#, no-c-format
+#: src/libslic3r/PrintConfig.cpp:1335
+#, possible-c-format
msgid "This is the highest printable layer height for this extruder, used to cap the variable layer height and support layer height. Maximum recommended layer height is 75% of the extrusion width to achieve reasonable inter-layer adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter."
msgstr "Questa è la massima altezza layer stampabile per questo estrusore, usata come limite per l'altezza variabile dei layer e l'altezza dei layer di supporto. L'altezza layer massima raccomandata è il 75% della larghezza di estrusione, in modo da ottenere una buona adesione tra i layer. Se impostato a 0, l'altezza layer è limitata al 75% del diametro dell'ugello."
-#: src/libslic3r/PrintConfig.cpp:1290
+#: src/libslic3r/PrintConfig.cpp:1398
msgid "This is the lowest printable layer height for this extruder and limits the resolution for variable layer height. Typical values are between 0.05 mm and 0.1 mm."
msgstr "Questa è l'altezza minima stampabile per questo estrusore e limita la risoluzione per l'altezza variabile dei layer. Valori tipici sono compresi tra 0.05 mm e 0.1 mm."
-#: src/libslic3r/GCode.cpp:639
+#: src/libslic3r/GCode.cpp:624
msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed."
msgstr "Questo solitamente è causato da estrusioni molto piccole o da un modello difettoso. Provare a riparare il modello o cambiare il suo orientamento sul piano."
-#: src/libslic3r/PrintConfig.cpp:2215
+#: src/libslic3r/PrintConfig.cpp:2358
msgid "This matrix describes volumes (in cubic milimetres) required to purge the new filament on the wipe tower for any given pair of tools."
msgstr "Questa matrice descrive il volume (in millimetri cubici) necessario per spurgare il filamento nella torre di spurgo per una qualunque coppia di attrezzi."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:878
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:928
msgid "This operation is irreversible.\nDo you want to proceed?"
msgstr "Questa operazione è irreversibile.\nVuoi continuare?"
-#: src/libslic3r/PrintConfig.cpp:1442
+#: src/libslic3r/PrintConfig.cpp:1550
msgid "This option sets the number of perimeters to generate for each layer. Note that Slic3r may increase this number automatically when it detects sloping surfaces which benefit from a higher number of perimeters if the Extra Perimeters option is enabled."
msgstr "Questa opzione imposta il numero di perimetri da generare per ogni layer. Da notare che Slic3r aumenta questo numero automaticamente quando rileva superfici inclinate che potrebbero beneficiare di un aumento del numero dei perimetri se l'opzione Perimetri aggiuntivi è attiva."
-#: src/libslic3r/PrintConfig.cpp:1356
+#: src/libslic3r/PrintConfig.cpp:1464
msgid "This option will drop the temperature of the inactive extruders to prevent oozing. It will enable a tall skirt automatically and move extruders outside such skirt when changing temperatures."
msgstr "Questa opzione abbasserà la temperatura degli estrusori inattivi per prevenire oozing (trasudazione). Attiverà automaticamente uno skirt alto e muoverà l'estrusore al di fuori di questo skirt al cambiamento di temperature."
-#: src/libslic3r/PrintConfig.cpp:1029
+#: src/libslic3r/PrintConfig.cpp:1073
msgid "This option will limit infill to the areas actually needed for supporting ceilings (it will act as internal support material). If enabled, slows down the G-code generation due to the multiple checks involved."
msgstr "Questa opzione limiterà il riempimento alle aree che effettivamente hanno bisogno di un supporto per i soffitti (si comporterà come un materiale di supporto interno). Se attivato, rallenterà la generazione del G-code a causa dei molteplici controlli necessari."
-#: src/libslic3r/PrintConfig.cpp:1022
+#: src/libslic3r/PrintConfig.cpp:1066
msgid "This option will switch the print order of perimeters and infill, making the latter first."
msgstr "Questa opzione sostituirà l'ordine di stampa dei perimetri e del riempimento, realizzando per primo il secondo."
-#: src/libslic3r/PrintConfig.cpp:459
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:85
+msgid "This printer will be shown in the presets list as"
+msgstr "La stampante verrà mostrata nell'elenco dei preset come"
+
+#: src/libslic3r/PrintConfig.cpp:495
msgid "This separate setting will affect the speed of external perimeters (the visible ones). If expressed as percentage (for example: 80%) it will be calculated on the perimeters speed setting above. Set to zero for auto."
msgstr "Questa impostazione separata avrà effetto sulla velocità dei perimetri esterni (quelli visibili). Se espresso in percentuale (per esempio: 80%) verrà calcolato sull'impostazione della velocità dei perimetri qui sopra. Imposta a zero per automatico."
-#: src/libslic3r/PrintConfig.cpp:1717
+#: src/libslic3r/PrintConfig.cpp:1832
msgid "This separate setting will affect the speed of perimeters having radius <= 6.5mm (usually holes). If expressed as percentage (for example: 80%) it will be calculated on the perimeters speed setting above. Set to zero for auto."
msgstr "Questa impostazione separata influenzerà la velocità dei perimetri con raggio <=6.5mm (solitamente i buchi). Se espresso in percentuale (per esempio: 80%) sarà calcolato sulla velocità dei perimetri qui sopra. Imposta a zero per automatico."
-#: src/libslic3r/PrintConfig.cpp:1038
+#: src/libslic3r/PrintConfig.cpp:1082
msgid "This setting applies an additional overlap between infill and perimeters for better bonding. Theoretically this shouldn't be needed, but backlash might cause gaps. If expressed as percentage (example: 15%) it is calculated over perimeter extrusion width."
msgstr "Questa impostazione applica una sovrapposizione aggiuntiva tra perimetri e riempimento per una migliore unione. Teoricamente non sarebbe necessario, ma i contraccolpi possono causare spazi vuoi. Se espresso in percentuale (per esempio: 15%) viene calcolato sulla larghezza d'estrusione del perimetro."
@@ -7981,31 +9507,31 @@ msgstr "Questa impostazione applica una sovrapposizione aggiuntiva tra perimetri
msgid "This setting controls the height (and thus the total number) of the slices/layers. Thinner layers give better accuracy but take more time to print."
msgstr "Questa impostazione controlla l'altezza (e quindi il numero totale) degli strati/layer. Un layer più sottile sarà più preciso ma sarà necessario più tempo per stampare."
-#: src/libslic3r/PrintConfig.cpp:1218
+#: src/libslic3r/PrintConfig.cpp:1326
msgid "This setting represents the maximum speed of your fan."
msgstr "Questa impostazione rappresenta la velocità massima della ventola."
-#: src/libslic3r/PrintConfig.cpp:1281
+#: src/libslic3r/PrintConfig.cpp:1389
msgid "This setting represents the minimum PWM your fan needs to work."
msgstr "Questa impostazione rappresenta la PWM minima (modulazione di larghezza di impulso) che la ventola necessita per lavorare."
-#: src/libslic3r/PrintConfig.cpp:1829
+#: src/libslic3r/PrintConfig.cpp:1944
msgid "This start procedure is inserted at the beginning, after any printer start gcode (and after any toolchange to this filament in case of multi-material printers). This is used to override settings for a specific filament. If PrusaSlicer detects M104, M109, M140 or M190 in your custom codes, such commands will not be prepended automatically so you're free to customize the order of heating commands and other custom actions. Note that you can use placeholder variables for all PrusaSlicer settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want. If you have multiple extruders, the gcode is processed in extruder order."
msgstr "Questa procedura di inizio è inserita all'inizio, dopo un qualsiasi gcode iniziale (e dopo un qualunque cambio attrezzo per questo filamento nel caso di stampanti multi-material). Viene utilizzato per scavalcare le impostazioni per un filamento specifico. Se PrusaSlicer rileva M104, M109, M140 o M190 nei codici personalizzati, questi comandi non vengono anteposti automaticamente così si è liberi di personalizzare liberamente l'ordine dei comandi di riscaldamento e altre azioni personalizzate. Da notare che è possibile utilizzare delle variabili segnaposto per tutte le impostazioni di PrusaSlicer, così è possibile inserire un comando \"M109 S[first_layer_temperature]\" ovunque lo si desideri. Se hai estrusori multipli, il gcode è processato nell'ordine degli estrusori."
-#: src/libslic3r/PrintConfig.cpp:1814
+#: src/libslic3r/PrintConfig.cpp:1929
msgid "This start procedure is inserted at the beginning, after bed has reached the target temperature and extruder just started heating, and before extruder has finished heating. If PrusaSlicer detects M104 or M190 in your custom codes, such commands will not be prepended automatically so you're free to customize the order of heating commands and other custom actions. Note that you can use placeholder variables for all PrusaSlicer settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."
msgstr "Questa procedura di inizio è inserita all'inizio, dopo che il piano ha raggiunto la temperatura impostata e appena l'estrusore inizia il riscaldamento, e prima che l'estrusore completi il riscaldamento. Se PrusaSlicer rileva M104 o M190 nel tuo codice personalizzato, questi comandi non vengono anteposti automaticamente così si è liberi di personalizzare l'ordine dei comandi di riscaldamento e altre azioni personalizzate. Da notare che è possibile utilizzare delle variabili segnaposto per tutte le impostazioni di PrusaSlicer, così è possibile inserire un comando \"M109 S[first_layer_temperature]\" ovunque si desideri."
-#: src/libslic3r/PrintConfig.cpp:695
+#: src/libslic3r/PrintConfig.cpp:731
msgid "This string is edited by RammingDialog and contains ramming specific parameters."
msgstr "Questa stringa viene controllata da RammingDialog e contiene parametri specifici del ramming."
-#: src/libslic3r/PrintConfig.cpp:2286
+#: src/libslic3r/PrintConfig.cpp:2429
msgid "This value will be added (or subtracted) from all the Z coordinates in the output G-code. It is used to compensate for bad Z endstop position: for example, if your endstop zero actually leaves the nozzle 0.3mm far from the print bed, set this to -0.3 (or fix your endstop)."
msgstr "Questo valore sarà aggiunto (o sottratto) da tutte le coordinate Z nel G-code di output. Viene utilizzato per compensare una posizione di finecorsa Z errata: per esempio, se la posizione minima del finecorsa rimane in realtà 0.3mm lontano dal piano, imposta questo valore a -0.3 (o sistema il finecorsa)."
-#: src/libslic3r/PrintConfig.cpp:2208
+#: src/libslic3r/PrintConfig.cpp:2351
msgid "This vector saves required volumes to change from/to each tool used on the wipe tower. These values are used to simplify creation of the full purging volumes below."
msgstr "Questo vettore salva il volume necessario per cambiare da/a ogni attrezzo usato per la torre di spurgo. Questi valori vengono usati per semplificare la creazione dei volumi di spurgo completi."
@@ -8014,137 +9540,168 @@ msgstr "Questo vettore salva il volume necessario per cambiare da/a ogni attrezz
msgid "This version of %s is not compatible with currently installed configuration bundles.\nThis probably happened as a result of running an older %s after using a newer one.\n\nYou may either exit %s and try again with a newer version, or you may re-run the initial configuration. Doing so will create a backup snapshot of the existing configuration before installing files compatible with this %s."
msgstr "Questa versione di %s non è compatibile con gli attuali gruppi di configurazioni installati.\nProbabilmente è causato dall'esecuzione di una vecchia versione di %s dopo averne utilizzata una più recente.\n\nProva a chiudere %s e riprovare con una versione più recente, o prova ad effettuare nuovamente la configurazione iniziale. Così facendo creerai un'istantanea di backup della configurazione esistente prima di istallare i file compatibili con questo %s."
-#: src/libslic3r/PrintConfig.cpp:2458
+#: src/libslic3r/PrintConfig.cpp:2601
msgid "This will apply a gamma correction to the rasterized 2D polygons. A gamma value of zero means thresholding with the threshold in the middle. This behaviour eliminates antialiasing without losing holes in polygons."
msgstr "Questo applicherà una correzione gamma ai poligoni 2D rasterizzati. Un valore gamma di zero comporta una calcolo della soglia nel mezzo. Questo comportamento elimina l'antialiasing senza perdere i fori nei poligoni."
-#: src/libslic3r/PrintConfig.cpp:2081
+#: src/libslic3r/PrintConfig.cpp:2224
msgid "Threads"
msgstr "Thread"
-#: src/libslic3r/PrintConfig.cpp:2082
+#: src/libslic3r/PrintConfig.cpp:2225
msgid "Threads are used to parallelize long-running tasks. Optimal threads number is slightly above the number of available cores/processors."
msgstr "I thread sono utilizzati per parallelizzare operazioni di lunga durata. Il numero di thread ottimali è leggermente superiore al numero di core / processori disponibili."
-#: src/slic3r/GUI/Tab.cpp:2093
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:235
+msgid "Threshold:"
+msgstr "Soglia:"
+
+#: src/slic3r/GUI/Tab.cpp:2263
msgid "Tilt"
msgstr "Inclina"
-#: src/slic3r/GUI/Tab.cpp:2094
+#: src/slic3r/GUI/Tab.cpp:2264
msgid "Tilt time"
msgstr "Tempo di tilt"
+#: src/slic3r/GUI/GCodeViewer.cpp:2225 src/slic3r/GUI/GCodeViewer.cpp:2233
#: src/slic3r/GUI/RammingChart.cpp:76
msgid "Time"
msgstr "Tempo"
-#: src/libslic3r/PrintConfig.cpp:687
+#: src/libslic3r/PrintConfig.cpp:723
msgid "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new filament during a tool change (when executing the T code). This time is added to the total print time by the G-code time estimator."
msgstr "Tempo per il firmware della stampante (o per l'unità Multi Material 2.0) per il caricamento del nuovo filamento durante il cambio attrezzo (quando viene eseguito il T code). Questa durata viene aggiunta alla stima del tempo totale di stampa del G-code."
-#: src/libslic3r/PrintConfig.cpp:702
+#: src/libslic3r/PrintConfig.cpp:738
msgid "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a filament during a tool change (when executing the T code). This time is added to the total print time by the G-code time estimator."
msgstr "Tempo per il firmware della stampante (o per l'unità Multi Material 2.0) per lo scaricamento del nuovo filamento durante il cambio attrezzo (quando viene eseguito il T code). Questa durata viene aggiunta alla stima del tempo totale di stampa del G-code."
-#: src/libslic3r/PrintConfig.cpp:2407
+#: src/libslic3r/PrintConfig.cpp:2550
msgid "Time of the fast tilt"
msgstr "Tempo di inclinazione veloce"
-#: src/libslic3r/PrintConfig.cpp:2416
+#: src/libslic3r/PrintConfig.cpp:2559
msgid "Time of the slow tilt"
msgstr "Tempo di inclinazione lenta"
-#: src/libslic3r/PrintConfig.cpp:641
+#: src/libslic3r/PrintConfig.cpp:677
msgid "Time to wait after the filament is unloaded. May help to get reliable toolchanges with flexible materials that may need more time to shrink to original dimensions."
msgstr "Tempo di attesa dopo lo scarico del filamento. Può aiutare ad ottenere cambi affidabili con materiali flessibili che potrebbero richiedere più tempo per tornare alle dimensioni originali."
-#: src/slic3r/GUI/Tab.cpp:966
+#: src/slic3r/GUI/GCodeViewer.cpp:2197
+msgid "to"
+msgstr "a"
+
+#: src/slic3r/GUI/Tab.cpp:1284
msgid "To do that please specify a new name for the preset."
msgstr "Per favore specifica un nuovo nome per il preset per effettuare l'operazione."
-#: src/slic3r/GUI/Plater.cpp:4014
+#: src/slic3r/GUI/Plater.cpp:3934
msgid "To objects"
msgstr "In oggetti"
-#: src/slic3r/GUI/Plater.cpp:4016
+#: src/slic3r/GUI/Plater.cpp:3936
msgid "To parts"
msgstr "In parti"
-#: src/slic3r/GUI/Tab.cpp:1756
+#: src/slic3r/Utils/Http.cpp:82
+msgid "To specify the system certificate store manually, please set the %1% environment variable to the correct CA bundle and restart the application."
+msgstr "Per specificare manualmente l'archivio dei certificati di sistema, impostare la variabile di ambiente %1% sul pacchetto CA corretto e riavviare l'applicazione."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:360
msgid "To use a custom CA file, please import your CA file into Certificate Store / Keychain."
msgstr "Per utilizzare un file CA personalizzato, importa il tuo file CA sul Certificate Store / Keychain."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:271
#, possible-c-format
msgid "Toggle %c axis mirroring"
msgstr "Attiva / disattiva il mirroring dell'asse %c"
-#: src/libslic3r/Zipper.cpp:34
+#: src/libslic3r/miniz_extension.cpp:93
msgid "too many files"
msgstr "troppi file"
-#: src/libslic3r/SLAPrintSteps.cpp:190
-msgid "Too much overlapping holes."
+#: src/libslic3r/SLAPrintSteps.cpp:192
+msgid "Too many overlapping holes."
msgstr "Troppi fori sovrapposti."
-#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/GUI_Preview.cpp:335
-#: src/slic3r/GUI/GUI_Preview.cpp:519 src/slic3r/GUI/GUI_Preview.cpp:574
-#: src/slic3r/GUI/GUI_Preview.cpp:835 src/libslic3r/GCode/PreviewData.cpp:357
+#: src/slic3r/GUI/GCodeViewer.cpp:2241 src/slic3r/GUI/GUI_Preview.cpp:281
+#: src/slic3r/GUI/GUI_Preview.cpp:453 src/slic3r/GUI/GUI_Preview.cpp:693
+#: src/slic3r/GUI/GUI_Preview.cpp:786 src/slic3r/GUI/GUI_Preview.cpp:1270
+#: src/libslic3r/GCode/PreviewData.cpp:362
msgid "Tool"
msgstr "Attrezzo"
#: src/slic3r/GUI/WipeTowerDialog.cpp:276
msgid "Tool #"
-msgstr "Utensile #"
+msgstr "Attrezzo #"
-#: src/slic3r/GUI/Tab.cpp:2000 src/libslic3r/PrintConfig.cpp:2093
+#: src/slic3r/GUI/Tab.cpp:2189 src/libslic3r/PrintConfig.cpp:2236
msgid "Tool change G-code"
msgstr "G-code cambio attrezzo"
-#: src/slic3r/GUI/Tab.cpp:1491
+#: src/slic3r/GUI/GCodeViewer.cpp:2530 src/slic3r/GUI/GUI_Preview.cpp:1474
+msgid "Tool changes"
+msgstr "Cambi attrezzo"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:1479
+msgid "Tool marker"
+msgstr "Indicatore attrezzo"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:223
+msgid "Tool position"
+msgstr "Posizione attrezzo"
+
+#: src/slic3r/GUI/Tab.cpp:1837
msgid "Toolchange parameters with single extruder MM printers"
msgstr "Parametri di cambio attrezzo per stampanti MM con estrusore singolo"
#. TRN To be shown in the main menu View->Top
#. TRN To be shown in Print Settings "Top solid layers"
-#: src/slic3r/GUI/MainFrame.cpp:662 src/libslic3r/PrintConfig.cpp:2132
-#: src/libslic3r/PrintConfig.cpp:2141
+#: src/slic3r/GUI/MainFrame.cpp:959 src/slic3r/GUI/MainFrame.cpp:1279
+#: src/libslic3r/PrintConfig.cpp:2275 src/libslic3r/PrintConfig.cpp:2284
msgid "Top"
msgstr "Superiore"
-#: src/slic3r/GUI/PresetHints.cpp:304
+#: src/slic3r/GUI/PresetHints.cpp:302
msgid "Top / bottom shell thickness hint: Not available due to invalid layer height."
msgstr "Suggerimento per lo spessore del guscio Superiore / Inferiore: non disponibile a causa di un'altezza dello strato non valida."
-#: src/libslic3r/PrintConfig.cpp:415
+#: src/libslic3r/PrintConfig.cpp:449
msgid "Top fill pattern"
msgstr "Trama riempimento superiore"
-#: src/slic3r/GUI/PresetHints.cpp:323
+#: src/slic3r/GUI/PresetHints.cpp:321
msgid "Top is open."
msgstr "La parte superiore è aperta."
-#: src/slic3r/GUI/PresetHints.cpp:317
+#: src/slic3r/GUI/PresetHints.cpp:315
msgid "Top shell is %1% mm thick for layer height %2% mm."
msgstr "Il guscio superiore è spesso %1% mm per l'altezza layer %2% mm."
-#: src/slic3r/GUI/PresetHints.cpp:192
+#: src/slic3r/GUI/PresetHints.cpp:191
msgid "top solid infill"
msgstr "riempimento solido superiore"
-#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:315
-#: src/libslic3r/PrintConfig.cpp:2105 src/libslic3r/PrintConfig.cpp:2117
+#: src/slic3r/GUI/GUI_Preview.cpp:306 src/libslic3r/ExtrusionEntity.cpp:319
+#: src/libslic3r/ExtrusionEntity.cpp:346 src/libslic3r/PrintConfig.cpp:2248
+#: src/libslic3r/PrintConfig.cpp:2260
msgid "Top solid infill"
msgstr "Riempimento solido superiore"
-#: src/libslic3r/PrintConfig.cpp:2135
+#: src/libslic3r/PrintConfig.cpp:2278
msgid "Top solid layers"
msgstr "Layer solidi superiori"
-#: src/slic3r/GUI/MainFrame.cpp:662
+#: src/slic3r/GUI/MainFrame.cpp:959 src/slic3r/GUI/MainFrame.cpp:1279
msgid "Top View"
msgstr "Vista superiore"
+#: src/libslic3r/PrintConfig.cpp:1211
+msgid "Topmost surface only"
+msgstr "Solo superficie superiore più alta"
+
#: src/slic3r/GUI/WipeTowerDialog.cpp:285
msgid "Total purging volume is calculated by summing two values below, depending on which tools are loaded/unloaded."
msgstr "Il volume totale di spurgo viene calcolato sommando i due valori sotto, a seconda di quali attrezzi vengono scaricati/caricati."
@@ -8157,164 +9714,180 @@ msgstr "Volume totale di ramming"
msgid "Total ramming time"
msgstr "Durata totale di ramming"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:640
+msgid "Transfer"
+msgstr "Trasferisci"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:745
+msgid "Transfer the selected options to the newly selected preset \"%1%\"."
+msgstr "Trasferire le opzioni selezionate nel nuovo preset selezionato \"%1%\"."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:740
+msgid "Transfer the selected settings to the newly selected preset."
+msgstr "Trasferisci le impostazioni selezionate nel nuovo preset selezionato."
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:561
msgid "Translate"
msgstr "Traduci"
-#: src/slic3r/GUI/Mouse3DController.cpp:300
-#: src/slic3r/GUI/Mouse3DController.cpp:317
+#: src/slic3r/GUI/Mouse3DController.cpp:282
+#: src/slic3r/GUI/Mouse3DController.cpp:303
msgid "Translation"
msgstr "Traduzione"
-#: src/slic3r/GUI/GUI_Preview.cpp:253 src/libslic3r/PrintConfig.cpp:2152
+#: src/slic3r/GUI/GCodeViewer.cpp:2489 src/slic3r/GUI/GUI_Preview.cpp:335
+#: src/slic3r/GUI/GUI_Preview.cpp:1471 src/libslic3r/PrintConfig.cpp:2295
msgid "Travel"
msgstr "Spostamento"
-#: src/libslic3r/PrintConfig.cpp:845
+#: src/libslic3r/PrintConfig.cpp:883
msgid "Triangles"
msgstr "Triangoli"
-#: src/libslic3r/PrintConfig.cpp:3448
+#: src/libslic3r/PrintConfig.cpp:3647
msgid "Try to repair any non-manifold meshes (this option is implicitly added whenever we need to slice the model to perform the requested action)."
msgstr "Prova a riparare mesh non-manifold (questa opzione viene aggiunta implicitamente ogni volta che effettuiamo uno slice sul modello per effettuare l'azione richiesta)."
-#: src/libslic3r/PrintConfig.cpp:1467
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:165
+msgid "Type here the name of your printer device"
+msgstr "Inserisci qui il nome della tua stampante"
+
+#: src/libslic3r/PrintConfig.cpp:1575
msgid "Type of the printer."
msgstr "Tipologia stampante."
-#: src/slic3r/GUI/ConfigWizard.cpp:2013 src/slic3r/GUI/GUI_ObjectList.cpp:3553
+#: src/slic3r/GUI/ConfigWizard.cpp:2524 src/slic3r/GUI/ConfigWizard.cpp:2526
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4016
msgid "Type:"
msgstr "Tipo:"
-#: src/slic3r/GUI/Plater.cpp:3428
+#: src/slic3r/GUI/OpenGLManager.cpp:275
+#, possible-c-format
+msgid "Unable to load the following shaders:\n%s"
+msgstr "Impossibile caricare i seguenti shader:\n%s"
+
+#: src/slic3r/GUI/Plater.cpp:3233
msgid "Unable to reload:"
msgstr "Impossibile ricaricare:"
-#: src/libslic3r/Zipper.cpp:32
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:137
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:146
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:845
+msgid "Undef"
+msgstr "Undef"
+
+#: src/libslic3r/miniz_extension.cpp:91
msgid "undefined error"
msgstr "errore non definito"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4624 src/slic3r/GUI/KBShortcutsDialog.cpp:130
-#: src/slic3r/GUI/MainFrame.cpp:581
+#: src/slic3r/GUI/GLCanvas3D.cpp:5028 src/slic3r/GUI/KBShortcutsDialog.cpp:125
+#: src/slic3r/GUI/MainFrame.cpp:1187
msgid "Undo"
msgstr "Annulla"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4065
+#: src/slic3r/GUI/GLCanvas3D.cpp:4382
#, possible-c-format
msgid "Undo %1$d Action"
msgid_plural "Undo %1$d Actions"
msgstr[0] "Annulla %1$d Azione"
msgstr[1] "Annulla %1$d Azioni"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4047
+#: src/slic3r/GUI/GLCanvas3D.cpp:4361
msgid "Undo History"
-msgstr "Storia Annulla"
+msgstr "Cronologia Annulla"
-#: src/libslic3r/Zipper.cpp:56
+#: src/libslic3r/miniz_extension.cpp:115
msgid "unexpected decompressed size"
msgstr "dimensione decompressa imprevista"
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:27
+#: src/slic3r/GUI/GUI_Preview.cpp:299 src/libslic3r/ExtrusionEntity.cpp:310
msgid "Unknown"
msgstr "Sconosciuto"
-#: src/slic3r/Utils/Duet.cpp:82 src/slic3r/Utils/Duet.cpp:137
-#: src/slic3r/Utils/FlashAir.cpp:119 src/slic3r/Utils/FlashAir.cpp:140
-#: src/slic3r/Utils/FlashAir.cpp:156
+#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:139
+#: src/slic3r/Utils/FlashAir.cpp:122 src/slic3r/Utils/FlashAir.cpp:143
+#: src/slic3r/Utils/FlashAir.cpp:159
msgid "Unknown error occured"
msgstr "Si è verificato un errore sconosciuto"
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:178
+msgid "Unknown error occured during exporting G-code."
+msgstr "Si è verificato un errore sconosciuto durante l'esportazione del G-code."
+
#: src/slic3r/GUI/WipeTowerDialog.cpp:263
msgid "unloaded"
msgstr "scaricato"
-#: src/libslic3r/PrintConfig.cpp:623
+#: src/libslic3r/PrintConfig.cpp:659
msgid "Unloading speed"
msgstr "Velocità di scaricamento"
-#: src/libslic3r/PrintConfig.cpp:632
+#: src/libslic3r/PrintConfig.cpp:668
msgid "Unloading speed at the start"
msgstr "Velocità iniziale di scaricamento"
-#: src/slic3r/GUI/Tab.cpp:3256
+#: src/slic3r/GUI/Tab.cpp:3693
msgid "UNLOCKED LOCK"
msgstr "LUCCHETTO APERTO"
-#: src/slic3r/GUI/Tab.cpp:3282
+#: src/slic3r/GUI/Tab.cpp:3719
msgid "UNLOCKED LOCK icon indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\nClick to reset all settings for current option group to the system (or default) values."
msgstr "L'icona del LUCCHETTO APERTO indica che alcune impostazioni sono state modificate e non sono uguali ai valori di sistema (o predefinite) per il gruppo di opzioni corrente.\nClicca qui per reimpostare tutte le impostazioni del gruppo corrente ai valori di sistema (o predefiniti)."
-#: src/slic3r/GUI/Tab.cpp:3297
+#: src/slic3r/GUI/Tab.cpp:3734
msgid "UNLOCKED LOCK icon indicates that the value was changed and is not equal to the system (or default) value.\nClick to reset current value to the system (or default) value."
msgstr "L'icona del LUCCHETTO APERTO indica che il valore è stato cambiato e non è uguale al valore di sistema (o predefinito). Clicca per reimpostare il valore corrente al valore di sistema (o predefinito)."
-#: src/slic3r/GUI/Plater.cpp:5203
-#, possible-c-format
-msgid "Unmounting successful. The device %s(%s) can now be safely removed from the computer."
-msgstr "Espulsione riuscita. Il dispositivo %s(%s) adesso può essere rimosso in sicurezza dal computer."
-
-#: src/slic3r/GUI/GUI_Preview.cpp:255
-msgid "Unretractions"
-msgstr "De-retrazioni"
-
-#: src/slic3r/GUI/Tab.cpp:2947
-msgid "Unsaved Changes"
-msgstr "Modifiche non salvate"
-
-#: src/slic3r/GUI/GUI_App.cpp:935
-msgid "Unsaved Presets"
-msgstr "Preset non salvati"
-
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:173
msgid "Unselect gizmo or clear selection"
msgstr "Deseleziona gizmo o pulisci selezione"
-#: src/libslic3r/Zipper.cpp:60
+#: src/libslic3r/miniz_extension.cpp:119
msgid "unsupported central directory size"
msgstr "dimensione della directory centrale non supportata"
-#: src/libslic3r/Zipper.cpp:40
+#: src/libslic3r/miniz_extension.cpp:99
msgid "unsupported encryption"
msgstr "criptaggio non supportato"
-#: src/libslic3r/Zipper.cpp:42
+#: src/libslic3r/miniz_extension.cpp:101
msgid "unsupported feature"
msgstr "caratteristica non supportata"
-#: src/libslic3r/Zipper.cpp:38
+#: src/libslic3r/miniz_extension.cpp:97
msgid "unsupported method"
msgstr "metodo non supportato"
-#: src/libslic3r/Zipper.cpp:50
+#: src/libslic3r/miniz_extension.cpp:109
msgid "unsupported multidisk archive"
msgstr "archivio multidisk non supportato"
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:292
+#: src/slic3r/GUI/OpenGLManager.cpp:267
msgid "Unsupported OpenGL version"
msgstr "Versione OpenGL non supportata"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3420
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3883
msgid "Unsupported selection"
msgstr "Selezione non supportata"
-#: src/slic3r/GUI/GLCanvas3D.cpp:955
-#, possible-c-format
-msgid "up to %.2f mm"
-msgstr "fino a %.2f mm"
+#: src/slic3r/GUI/GCodeViewer.cpp:2183
+msgid "up to"
+msgstr "fino a"
#: src/slic3r/GUI/UpdateDialogs.cpp:38
msgid "Update available"
msgstr "Aggiornamento disponibile"
-#: src/slic3r/GUI/ConfigWizard.cpp:779 src/slic3r/GUI/Preferences.cpp:80
+#: src/slic3r/GUI/ConfigWizard.cpp:1138 src/slic3r/GUI/Preferences.cpp:97
msgid "Update built-in Presets automatically"
msgstr "Aggiorna automaticamente i Preset integrati"
-#: src/slic3r/GUI/ConfigWizard.cpp:761
+#: src/slic3r/GUI/ConfigWizard.cpp:1120
msgid "Updates"
msgstr "Aggiornamenti"
-#: src/slic3r/GUI/ConfigWizard.cpp:786
+#: src/slic3r/GUI/ConfigWizard.cpp:1145
msgid "Updates are never applied without user's consent and never overwrite user's customized settings."
msgstr "Gli aggiornamenti non vengono mai applicati senza il consenso dell'utente e non sovrascrivono mai i settaggi personalizzati dell'utente."
@@ -8322,7 +9895,7 @@ msgstr "Gli aggiornamenti non vengono mai applicati senza il consenso dell'utent
msgid "Upgrade"
msgstr "Aggiorna"
-#: src/slic3r/GUI/GUI_App.cpp:824
+#: src/slic3r/GUI/GUI_App.cpp:1522
msgid "Upload a firmware image into an Arduino based printer"
msgstr "Carica un'immagine del firmware su una stampante basata su Arduino"
@@ -8338,101 +9911,122 @@ msgstr "Carica all'Host di stampa con il seguente nome file:"
msgid "Uploading"
msgstr "Caricamento"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:204
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:206
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
msgid "Upper Layer"
msgstr "Layer superiore"
-#: src/slic3r/GUI/Tab.cpp:1900
-msgid "USB/Serial connection"
-msgstr "Connessione USB/Seriale"
-
-#: src/libslic3r/PrintConfig.cpp:1662
-msgid "USB/serial port for printer connection."
-msgstr "Porta USB/Seriale per connessione stampante."
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
+msgid "Upper layer"
+msgstr "Layer superiore"
-#: src/slic3r/GUI/DoubleSlider.cpp:1147
+#: src/slic3r/GUI/DoubleSlider.cpp:1276
msgid "Use another extruder"
msgstr "Usa un altro estrusore"
-#: src/slic3r/GUI/Preferences.cpp:143
+#: src/slic3r/GUI/Preferences.cpp:220
msgid "Use custom size for toolbar icons"
msgstr "Utilizza dimensione personalizzata per le icone degli strumenti"
-#: src/libslic3r/PrintConfig.cpp:2161
+#: src/slic3r/GUI/Preferences.cpp:268
+msgid "Use environment map"
+msgstr "Utilizza mappa ambientale"
+
+#: src/libslic3r/PrintConfig.cpp:2304
msgid "Use firmware retraction"
msgstr "Usa retrazione firmware"
+#: src/slic3r/GUI/ImGuiWrapper.cpp:800 src/slic3r/GUI/Search.cpp:464
+msgid "Use for search"
+msgstr "Usa per cercare"
+
+#: src/libslic3r/PrintConfig.cpp:1218
+msgid "Use for time estimate"
+msgstr "Utilizza per la stima del tempo"
+
#: src/slic3r/GUI/PrintHostDialogs.cpp:42
msgid "Use forward slashes ( / ) as a directory separator if needed."
msgstr "Usa la barra ( / ) come separatore di cartella se necessario."
-#: src/slic3r/GUI/Preferences.cpp:126
+#: src/slic3r/GUI/Preferences.cpp:191
msgid "Use free camera"
msgstr "Usa l'inquadratura libera"
-#: src/libslic3r/PrintConfig.cpp:2780
+#: src/slic3r/GUI/ConfigWizard.cpp:1188
+msgid "Use inches"
+msgstr "Usa pollici"
+
+#: src/libslic3r/PrintConfig.cpp:2944
msgid "Use pad"
msgstr "Utilizza pad"
-#: src/slic3r/GUI/Preferences.cpp:119
+#: src/slic3r/GUI/Preferences.cpp:184
msgid "Use perspective camera"
msgstr "Usa la visuale prospettica"
-#: src/libslic3r/PrintConfig.cpp:2168
+#: src/libslic3r/PrintConfig.cpp:2311
msgid "Use relative E distances"
msgstr "Usa distanze E relative"
-#: src/slic3r/GUI/Preferences.cpp:104
+#: src/slic3r/GUI/Preferences.cpp:135
msgid "Use Retina resolution for the 3D scene"
msgstr "Usa risoluzione Retina per la scena 3D"
-#: src/libslic3r/PrintConfig.cpp:540
+#: src/libslic3r/PrintConfig.cpp:576
msgid "Use this option to set the axis letter associated to your printer's extruder (usually E but some printers use A)."
msgstr "Usa questa opzione per impostare la lettera dell'asse associato all'estrusore della tua stampante (solitamente E, ma alcune stampanti utilizzano A)."
-#: src/libslic3r/PrintConfig.cpp:1893
+#: src/libslic3r/PrintConfig.cpp:2035
msgid "Use this setting to rotate the support material pattern on the horizontal plane."
msgstr "Usa questa impostazione per ruotare la trama del materiale di supporto sul piano orizzontale."
-#: src/libslic3r/PrintConfig.cpp:2175
+#: src/libslic3r/PrintConfig.cpp:2318
msgid "Use volumetric E"
msgstr "Utilizza E volumetrico"
-#: src/slic3r/GUI/DoubleSlider.cpp:1171
+#: src/slic3r/GUI/DoubleSlider.cpp:1298
msgid "used"
msgstr "usato"
-#: src/slic3r/GUI/Plater.cpp:237
+#: src/slic3r/GUI/Plater.cpp:243
msgid "Used Filament (g)"
msgstr "Filamento usato (g)"
-#: src/slic3r/GUI/Plater.cpp:235 src/slic3r/GUI/Plater.cpp:1229
+#: src/slic3r/GUI/Plater.cpp:1141
+msgid "Used Filament (in)"
+msgstr "Filamento usato (in)"
+
+#: src/slic3r/GUI/Plater.cpp:1153
+msgid "Used Filament (in³)"
+msgstr "Filamento usato (in³)"
+
+#: src/slic3r/GUI/Plater.cpp:241 src/slic3r/GUI/Plater.cpp:1141
msgid "Used Filament (m)"
msgstr "Filamento usato (m)"
-#: src/slic3r/GUI/Plater.cpp:236
+#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1153
msgid "Used Filament (mm³)"
msgstr "Filamento usato (mm³)"
-#: src/slic3r/GUI/Plater.cpp:1191
+#: src/slic3r/GUI/Plater.cpp:1100
msgid "Used Material (ml)"
msgstr "Materiale Usato (ml)"
-#: src/slic3r/GUI/Plater.cpp:238
+#: src/slic3r/GUI/Plater.cpp:244
msgid "Used Material (unit)"
msgstr "Materiale usato (unità)"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 src/libslic3r/PrintConfig.cpp:132
msgid "User"
msgstr "Utente"
-#: src/slic3r/GUI/Preset.cpp:1168 src/slic3r/GUI/Preset.cpp:1288
-#: src/slic3r/GUI/PresetBundle.cpp:1677
+#: src/slic3r/GUI/PresetComboBoxes.cpp:230
+#: src/slic3r/GUI/PresetComboBoxes.cpp:778
+#: src/slic3r/GUI/PresetComboBoxes.cpp:934
msgid "User presets"
msgstr "Preset utente"
-#: src/libslic3r/Zipper.cpp:90
+#: src/libslic3r/miniz_extension.cpp:149
msgid "validation failed"
msgstr "convalida non riuscita"
@@ -8444,31 +10038,31 @@ msgstr "Valore uguale a quello di sistema"
msgid "Value was changed and is not equal to the system value or the last saved preset"
msgstr "Il valore è stato modificato e non è uguale al valore di sistema o all'ultimo preset salvato"
-#: src/slic3r/GUI/Tab.cpp:2202
+#: src/slic3r/GUI/Tab.cpp:2371
msgid "Values in this column are for Normal mode"
msgstr "I valori in questa colonna sono per la modalità Normale"
-#: src/slic3r/GUI/Tab.cpp:2208
+#: src/slic3r/GUI/Tab.cpp:2377
msgid "Values in this column are for Stealth mode"
msgstr "I valori in questa colonna sono per la modalità Silenziosa"
-#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/slic3r/GUI/GLCanvas3D.cpp:4573
+#: src/slic3r/GUI/GLCanvas3D.cpp:231 src/slic3r/GUI/GLCanvas3D.cpp:4978
msgid "Variable layer height"
msgstr "Altezza layer variabile"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1709
+#: src/slic3r/GUI/GLCanvas3D.cpp:1786
msgid "Variable layer height - Adaptive"
msgstr "Altezza layer variabile - Adattivo"
-#: src/slic3r/GUI/GLCanvas3D.cpp:599
+#: src/slic3r/GUI/GLCanvas3D.cpp:565
msgid "Variable layer height - Manual edit"
msgstr "Altezza layer variabile - Modifica manuale"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1701
+#: src/slic3r/GUI/GLCanvas3D.cpp:1778
msgid "Variable layer height - Reset"
msgstr "Altezza layer variabile - Ripristina"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1717
+#: src/slic3r/GUI/GLCanvas3D.cpp:1794
msgid "Variable layer height - Smooth all"
msgstr "Altezza layer variabile - Leviga tutto"
@@ -8476,19 +10070,20 @@ msgstr "Altezza layer variabile - Leviga tutto"
msgid "variants"
msgstr "varianti"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:971
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:1289
msgid "vendor"
msgstr "produttore"
-#: src/slic3r/GUI/ConfigWizard.cpp:565
+#: src/slic3r/GUI/ConfigWizard.cpp:589
msgid "Vendor:"
msgstr "Fornitore:"
-#: src/libslic3r/PrintConfig.cpp:928
+#: src/libslic3r/PrintConfig.cpp:972
msgid "Verbose G-code"
msgstr "G-code verboso"
-#: src/slic3r/GUI/AboutDialog.cpp:231 src/slic3r/GUI/MainFrame.cpp:64
+#: src/slic3r/GUI/AboutDialog.cpp:256 src/slic3r/GUI/GUI_App.cpp:239
+#: src/slic3r/GUI/MainFrame.cpp:164
msgid "Version"
msgstr "Versione"
@@ -8496,24 +10091,48 @@ msgstr "Versione"
msgid "version"
msgstr "versione"
-#: src/slic3r/GUI/Tab.cpp:1053
+#: src/slic3r/GUI/Tab.cpp:1375
msgid "Vertical shells"
msgstr "Gusci verticali"
-#: src/slic3r/GUI/GUI_Preview.cpp:218
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:237
+msgid "Vertical Slider"
+msgstr "Cursore di scorrimento verticale"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:212
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:231
+msgid "Vertical slider - Move active thumb Down"
+msgstr "Cursore di scorrimento verticale - Abbassa cursore attivo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:211
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:230
+msgid "Vertical slider - Move active thumb Up"
+msgstr "Cursore di scorrimento verticale - Solleva cursore attivo"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:265 src/slic3r/GUI/GUI_Preview.cpp:271
msgid "View"
msgstr "Vista"
-#: src/slic3r/GUI/ConfigWizard.cpp:813
+#: src/slic3r/GUI/ConfigWizard.cpp:1172
msgid "View mode"
msgstr "Modalità Visualizzazione"
-#: src/libslic3r/SLAPrintSteps.cpp:413 src/libslic3r/SLAPrintSteps.cpp:422
-#: src/libslic3r/SLAPrintSteps.cpp:461
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:666
+msgid "Visit \"Preferences\" and check \"%1%\"\nto be asked about unsaved changes again."
+msgstr "Visita \"Prefereze\" e controlla \"%1%\"\nper ricevere nuovamente informazioni sui cambiamenti non salvati."
+
+#: src/libslic3r/PrintConfig.cpp:3553
+msgid "Visualize an already sliced and saved G-code"
+msgstr "Visualizza un G-code già processato e salvato"
+
+#: src/libslic3r/SLAPrintSteps.cpp:411 src/libslic3r/SLAPrintSteps.cpp:420
+#: src/libslic3r/SLAPrintSteps.cpp:459
msgid "Visualizing supports"
msgstr "Visualizzazione supporti"
-#: src/slic3r/GUI/Plater.cpp:161
+#: src/slic3r/GUI/Plater.cpp:167
msgid "Volume"
msgstr "Volume"
@@ -8521,23 +10140,23 @@ msgstr "Volume"
msgid "Volume to purge (mm³) when the filament is being"
msgstr "Il volume di spurgo (mm³) quando il filamento viene"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1106
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1230
msgid "Volumes in Object reordered"
msgstr "Volumi in Oggetto riordinati"
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:218
msgid "Volumetric"
msgstr "Volumetrico"
-#: src/slic3r/GUI/Tab.cpp:1591
+#: src/slic3r/GUI/Tab.cpp:1930
msgid "Volumetric flow hints not available"
msgstr "Suggerimenti sul flusso volumetrico non disponibili"
-#: src/slic3r/GUI/GUI_Preview.cpp:226
+#: src/slic3r/GUI/GUI_Preview.cpp:280
msgid "Volumetric flow rate"
msgstr "Flusso volumetrico"
-#: src/libslic3r/GCode/PreviewData.cpp:355
+#: src/slic3r/GUI/GCodeViewer.cpp:2240 src/libslic3r/GCode/PreviewData.cpp:360
msgid "Volumetric flow rate (mm³/s)"
msgstr "Flusso volumetrico (mm³/s)"
@@ -8545,151 +10164,167 @@ msgstr "Flusso volumetrico (mm³/s)"
msgid "Volumetric speed"
msgstr "Velocità volumetrica"
-#: src/libslic3r/PrintConfig.cpp:2915
+#: src/libslic3r/PrintConfig.cpp:3079
msgid "Wall thickness"
msgstr "Spessore parete"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1270 src/slic3r/GUI/GUI.cpp:251
-#: src/slic3r/GUI/Tab.cpp:3084 src/slic3r/GUI/WipeTowerDialog.cpp:45
-#: src/slic3r/GUI/WipeTowerDialog.cpp:366
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1129 src/slic3r/GUI/GUI.cpp:256
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:478
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:502
+#: src/slic3r/GUI/WipeTowerDialog.cpp:45 src/slic3r/GUI/WipeTowerDialog.cpp:366
msgid "Warning"
msgstr "Attenzione"
-#: src/slic3r/GUI/ConfigWizard.cpp:431
+#: src/slic3r/GUI/NotificationManager.cpp:672
+#: src/slic3r/GUI/NotificationManager.cpp:687
+#: src/slic3r/GUI/NotificationManager.cpp:702
+msgid "WARNING:"
+msgstr "ATTENZIONE:"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:449
msgid "Welcome"
msgstr "Benvenuto"
-#: src/slic3r/GUI/ConfigWizard.cpp:427
+#: src/slic3r/GUI/ConfigWizard.cpp:445
#, possible-c-format
msgid "Welcome to the %s Configuration Assistant"
msgstr "Benvenuto nell'Assistente di Configurazione di %s"
-#: src/slic3r/GUI/ConfigWizard.cpp:429
+#: src/slic3r/GUI/ConfigWizard.cpp:447
#, possible-c-format
msgid "Welcome to the %s Configuration Wizard"
msgstr "Benvenuto nella Configurazione Guidata di %s"
-#: src/slic3r/GUI/Preferences.cpp:97
+#: src/slic3r/GUI/SavePresetDialog.cpp:310
+msgid "What would you like to do with \"%1%\" preset after saving?"
+msgstr "Cosa desideri fare con il preset \"%1%\" dopo il salvataggio?"
+
+#: src/slic3r/GUI/Preferences.cpp:114
msgid "When checked, the print and filament presets are shown in the preset editor even if they are marked as incompatible with the active printer"
msgstr "Quando attivato, i preset di stampa e di filamento vengono mostrati nell'editor dei preset anche se sono segnati come incompatibili con la stampante attiva"
-#: src/slic3r/GUI/PresetHints.cpp:224
+#: src/slic3r/GUI/Preferences.cpp:122
+msgid "When checked, whenever dragging and dropping a project file on the application, shows a dialog asking to select the action to take on the file to load."
+msgstr "Quando selezionato, ogni volta che si trascina e si rilascia un file progetto sull'applicazione, viene mostrata una finestra di dialogo che chiede quale azione eseguire sul file da caricare."
+
+#: src/slic3r/GUI/Preferences.cpp:156
+msgid "When closing the application, always ask for unsaved changes"
+msgstr "Alla chiusura dell'applicazione, chiedere sempre riguardo le modifiche non salvate"
+
+#: src/slic3r/GUI/PresetHints.cpp:223
msgid "when printing"
msgstr "durante la stampa"
-#: src/libslic3r/PrintConfig.cpp:253
+#: src/libslic3r/PrintConfig.cpp:287
msgid "When printing multi-material objects, this settings will make Slic3r to clip the overlapping object parts one by the other (2nd part will be clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc)."
msgstr "Durante la stampa di oggetti multi-materiali, questa impostazione farà si che Slic3r unisca le parti sovrapposte dell'oggetto (la seconda sarà collegata con la prima, la terza parte sarà collegata con la prima e la seconda ecc..)."
-#: src/libslic3r/PrintConfig.cpp:305
+#: src/libslic3r/PrintConfig.cpp:339
msgid "When printing multiple objects or copies, this feature will complete each object before moving onto next one (and starting it from its bottom layer). This feature is useful to avoid the risk of ruined prints. Slic3r should warn and prevent you from extruder collisions, but beware."
msgstr "Durante la stampa di oggetti multipli o copie, questa funzione completerà ciascun oggetto prima di spostarsi al prossimo (e iniziando la stampa dal primo layer). Questa funzione è utile per evitare il rischio di stampe rovinate. Slic3r dovrebbe avvisarti e prevenire collisioni con l'estrusore, ma fai attenzione."
-#: src/libslic3r/PrintConfig.cpp:891
+#: src/libslic3r/PrintConfig.cpp:933
msgid "When printing with very low layer heights, you might still want to print a thicker bottom layer to improve adhesion and tolerance for non perfect build plates. This can be expressed as an absolute value or as a percentage (for example: 150%) over the default layer height."
msgstr "Durante la stampa di layer molto bassi, potresti comunque aver bisogno di stampare layer inferiori più spessi per migliorare l'adesione e la tolleranza per piani di stampa non perfetti. Questo può essere espresso in valore assoluto o in percentuale (per esempio: 150%) sull'altezza layer predefinita."
-#: src/libslic3r/PrintConfig.cpp:1553
+#: src/libslic3r/PrintConfig.cpp:1661
msgid "When retraction is triggered before changing tool, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder)."
msgstr "Quando viene attivata la retrazione prima del cambio attrezzo, il filamento è ritirato per la quantità specificata (la lunghezza è misurata sul filamento grezzo, prima che questo entri dentro l'estrusore)."
-#: src/libslic3r/PrintConfig.cpp:1545
+#: src/libslic3r/PrintConfig.cpp:1653
msgid "When retraction is triggered, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder)."
msgstr "Quando viene attivata la retrazione, il filamento viene ritirato per la quantità specificata (la lunghezza è misurata sul filamento grezzo, prima che questo entri dentro l'estrusore)."
-#: src/libslic3r/PrintConfig.cpp:1391
+#: src/libslic3r/PrintConfig.cpp:1499
msgid "When set to zero, the distance the filament is moved from parking position during load is exactly the same as it was moved back during unload. When positive, it is loaded further, if negative, the loading move is shorter than unloading."
msgstr "Quando impostato a zero, la distanza percorsa dal filamento in posizione di parcheggio durante il caricamento è esattamente uguale a quella contraria durante lo scaricamento. Quando il valore è positivo, viene caricato maggiormente, se il valore è negativo il movimento di caricamento è più corto dello scaricamento."
-#: src/libslic3r/PrintConfig.cpp:1238
+#: src/libslic3r/PrintConfig.cpp:1346
msgid "When setting other speed settings to 0 Slic3r will autocalculate the optimal speed in order to keep constant extruder pressure. This experimental setting is used to set the highest print speed you want to allow."
msgstr "Quando le altre velocità sono impostate a 0, Slic3r calcolerà automaticamente la velocità ottimale in modo da mantenere costante la pressione dell'estrusore. Questa impostazione sperimentale è utilizzata per impostare la velocità massima di stampa che vuoi permettere."
-#: src/libslic3r/PrintConfig.cpp:1597
+#: src/libslic3r/PrintConfig.cpp:1705
msgid "When the retraction is compensated after changing tool, the extruder will push this additional amount of filament."
msgstr "Quando la retrazione è compensata dopo un cambio di attrezzo, l'estrusore spingerà questa quantità addizionale di filamento."
-#: src/libslic3r/PrintConfig.cpp:1589
+#: src/libslic3r/PrintConfig.cpp:1697
msgid "When the retraction is compensated after the travel move, the extruder will push this additional amount of filament. This setting is rarely needed."
msgstr "Quando la retrazione è compensata dopo un movimento di spostamento, l'estrusore spingerà questa quantità addizionale di filamento. Questa impostazione è raramente necessaria."
-#: src/slic3r/GUI/Tab.cpp:3263
+#: src/slic3r/GUI/Tab.cpp:3700
msgid "WHITE BULLET"
msgstr "PALLINO BIANCO"
-#: src/slic3r/GUI/Tab.cpp:3285
+#: src/slic3r/GUI/Tab.cpp:3722
msgid "WHITE BULLET icon indicates a non system (or non default) preset."
msgstr "L'icona a forma di PALLINO BIANCO indica un preset non di sistema (o non predefinito)."
-#: src/slic3r/GUI/Tab.cpp:3288
+#: src/slic3r/GUI/Tab.cpp:3725
msgid "WHITE BULLET icon indicates that the settings are the same as in the last saved preset for the current option group."
msgstr "L'icona a forma di PALLINO BIANCO indica che le impostazioni corrispondono agli ultimi preset salvati per il gruppo di opzioni corrente."
-#: src/slic3r/GUI/Tab.cpp:3303
+#: src/slic3r/GUI/Tab.cpp:3740
msgid "WHITE BULLET icon indicates that the value is the same as in the last saved preset."
msgstr "L'icona a forma di PALLINO BIANCO indica che il valore è lo stesso dell'ultimo preset salvato."
-#: src/slic3r/GUI/GUI_Preview.cpp:223 src/libslic3r/PrintConfig.cpp:2238
+#: src/slic3r/GUI/GUI_Preview.cpp:277 src/libslic3r/PrintConfig.cpp:2381
msgid "Width"
msgstr "Larghezza"
-#: src/libslic3r/GCode/PreviewData.cpp:349
+#: src/slic3r/GUI/GCodeViewer.cpp:2237 src/libslic3r/GCode/PreviewData.cpp:354
msgid "Width (mm)"
msgstr "Larghezza (mm)"
-#: src/libslic3r/PrintConfig.cpp:2640
+#: src/libslic3r/PrintConfig.cpp:2783
msgid "Width from the back sphere center to the front sphere center"
msgstr "Spessore dal centro della sfera posteriore al centro della sfera anteriore"
-#: src/libslic3r/PrintConfig.cpp:2239
+#: src/libslic3r/PrintConfig.cpp:2382
msgid "Width of a wipe tower"
msgstr "Larghezza della torre di spurgo"
-#: src/libslic3r/PrintConfig.cpp:2891
+#: src/libslic3r/PrintConfig.cpp:3055
msgid "Width of the connector sticks which connect the object and the generated pad."
msgstr "Larghezza delle barre di connessione che collegano l'oggetto e il pad generato."
-#: src/libslic3r/PrintConfig.cpp:2354
+#: src/libslic3r/PrintConfig.cpp:2497
msgid "Width of the display"
msgstr "Larghezza del display"
-#: src/slic3r/GUI/PresetHints.cpp:48
-msgid "will always run at %1%%%"
-msgstr "lavorerà sempre a %1%%%"
-
-#: src/slic3r/GUI/PresetHints.cpp:55
-msgid "will be turned off."
-msgstr "rimarrà spenta."
-
-#: src/libslic3r/PrintConfig.cpp:2441
+#: src/libslic3r/PrintConfig.cpp:2584
msgid "Will inflate or deflate the sliced 2D polygons according to the sign of the correction."
msgstr "Gonfierà o sgonfierà i poligoni 2D processati in base al segno della correzione."
-#: src/libslic3r/PrintConfig.cpp:2261
+#: src/slic3r/GUI/GCodeViewer.cpp:2660 src/slic3r/GUI/GCodeViewer.cpp:2663
+#: src/slic3r/GUI/GUI_Preview.cpp:978
+msgid "Wipe"
+msgstr "Spurgo"
+
+#: src/libslic3r/PrintConfig.cpp:2404
msgid "Wipe into this object"
msgstr "Spurgo in questo oggetto"
-#: src/libslic3r/PrintConfig.cpp:2253
+#: src/libslic3r/PrintConfig.cpp:2396
msgid "Wipe into this object's infill"
msgstr "Spurgo nel riempimento di questo oggetto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:101
-#: src/slic3r/GUI/GUI_ObjectList.cpp:619 src/libslic3r/PrintConfig.cpp:2252
-#: src/libslic3r/PrintConfig.cpp:2260
+#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:99
+#: src/slic3r/GUI/GUI_ObjectList.cpp:658 src/libslic3r/PrintConfig.cpp:2395
+#: src/libslic3r/PrintConfig.cpp:2403
msgid "Wipe options"
msgstr "Opzioni pulizia"
-#: src/slic3r/GUI/GUI_Preview.cpp:248 src/slic3r/GUI/Tab.cpp:1191
-#: src/libslic3r/ExtrusionEntity.cpp:321
+#: src/slic3r/GUI/GUI_Preview.cpp:313 src/slic3r/GUI/Tab.cpp:1521
+#: src/libslic3r/ExtrusionEntity.cpp:326 src/libslic3r/ExtrusionEntity.cpp:360
msgid "Wipe tower"
msgstr "Torre di spurgo"
-#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245
+#: src/slic3r/GUI/Plater.cpp:1143 src/slic3r/GUI/Plater.cpp:1160
msgid "wipe tower"
msgstr "torre di spurgo"
-#: src/slic3r/GUI/ConfigManipulation.cpp:120
-#: src/slic3r/GUI/ConfigManipulation.cpp:140
+#: src/slic3r/GUI/ConfigManipulation.cpp:119
+#: src/slic3r/GUI/ConfigManipulation.cpp:139
msgid "Wipe Tower"
msgstr "Torre di spurgo"
@@ -8697,36 +10332,36 @@ msgstr "Torre di spurgo"
msgid "Wipe tower - Purging volume adjustment"
msgstr "Torre di spurgo - Regolazione volume di spurgo"
-#: src/slic3r/GUI/Tab.cpp:1488
+#: src/slic3r/GUI/Tab.cpp:1834
msgid "Wipe tower parameters"
msgstr "Parametri torre di spurgo"
-#: src/libslic3r/PrintConfig.cpp:2245
+#: src/libslic3r/PrintConfig.cpp:2388
msgid "Wipe tower rotation angle"
msgstr "Angolo di rotazione della torre di spurgo"
-#: src/libslic3r/PrintConfig.cpp:2246
+#: src/libslic3r/PrintConfig.cpp:2389
msgid "Wipe tower rotation angle with respect to x-axis."
msgstr "Angolo di rotazione della torre di spurgo rispetto all'asse X."
-#: src/libslic3r/PrintConfig.cpp:2193
+#: src/libslic3r/PrintConfig.cpp:2336
msgid "Wipe while retracting"
msgstr "Pulisci durante la retrazione"
-#: src/slic3r/GUI/PresetHints.cpp:225
+#: src/slic3r/GUI/PresetHints.cpp:224
msgid "with a volumetric rate"
msgstr "con una portata volumetrica"
-#: src/libslic3r/PrintConfig.cpp:1530
+#: src/libslic3r/PrintConfig.cpp:1638
msgid "With bowden extruders, it may be wise to do some amount of quick retract before doing the wipe movement."
msgstr "Con estrusori bowden, potrebbe essere conveniente effettuare una certa retrazione veloce prima di effettuare un movimento di pulizia."
-#: src/libslic3r/PrintConfig.cpp:2056
+#: src/libslic3r/PrintConfig.cpp:2198
msgid "With sheath around the support"
msgstr "Con guaina attorno al supporto"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:68
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:111
msgid "World coordinates"
msgstr "Coordinate reali"
@@ -8734,84 +10369,104 @@ msgstr "Coordinate reali"
msgid "Would you like to install it?\n\nNote that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n\nUpdated configuration bundles:"
msgstr "Vuoi installarlo?\n\nNota: verrà prima creata un'istantanea della configurazione completa. Potrà essere ripristinata in qualunque momento se dovessero presentarsi problemi con la nuova versione.\n\nGruppo di configurazioni aggiornate:"
-#: src/libslic3r/Zipper.cpp:92
+#: src/slic3r/GUI/GUI_App.cpp:1802
+msgid "Would you like to stop uploads and close the program?"
+msgstr "Desideri interrompere il caricamento e chiudere il programma?"
+
+#: src/libslic3r/miniz_extension.cpp:151
msgid "write calledback failed"
msgstr "scrittura richiamo non riuscita"
-#: src/libslic3r/PrintConfig.cpp:3382
+#: src/libslic3r/PrintConfig.cpp:3581
msgid "Write information about the model to the console."
msgstr "Scrivi informazioni sul modello alla console."
-#: src/slic3r/Utils/Duet.cpp:131
+#: src/slic3r/Utils/Duet.cpp:133
msgid "Wrong password"
msgstr "Password errata"
-#: src/libslic3r/PrintConfig.cpp:2225
+#: src/libslic3r/PrintConfig.cpp:2368
msgid "X coordinate of the left front corner of a wipe tower"
msgstr "Coordinata X dell'angolo frontale sinistro di una torre di spurgo"
-#: src/libslic3r/PrintConfig.cpp:1879
+#: src/libslic3r/PrintConfig.cpp:2021
msgid "XY separation between an object and its support"
msgstr "Separazione XY tra un oggetto e il suo supporto"
-#: src/libslic3r/PrintConfig.cpp:1881
+#: src/libslic3r/PrintConfig.cpp:2023
msgid "XY separation between an object and its support. If expressed as percentage (for example 50%), it will be calculated over external perimeter width."
msgstr "La separazione XY tra l'oggetto e il suo supporto. Se espresso in percentuale (ad esempio 50%), verrà calcolato sulla larghezza del perimetro esterno."
-#: src/libslic3r/PrintConfig.cpp:2275
+#: src/libslic3r/PrintConfig.cpp:2418
msgid "XY Size Compensation"
msgstr "Compensazione dimensione XY"
-#: src/libslic3r/PrintConfig.cpp:2232
+#: src/libslic3r/PrintConfig.cpp:2375
msgid "Y coordinate of the left front corner of a wipe tower"
msgstr "Coordinata Y dell'angolo frontale sinistro di una torre di spurgo"
-#: src/slic3r/GUI/Plater.cpp:1170
+#: src/slic3r/GUI/Plater.cpp:1079
msgid "Yes"
msgstr "Si"
-#: src/libslic3r/PrintConfig.cpp:1317
+#: src/slic3r/GUI/Plater.cpp:1405
+msgid "You can open only one .gcode file at a time."
+msgstr "È possibile aprire un solo file .gcode alla volta."
+
+#: src/libslic3r/PrintConfig.cpp:1425
msgid "You can put here your personal notes. This text will be added to the G-code header comments."
msgstr "È possibile inserire qui le note personali. Questo testo verrà aggiunto nei commenti iniziali del G-code."
-#: src/libslic3r/PrintConfig.cpp:589
+#: src/libslic3r/PrintConfig.cpp:625
msgid "You can put your notes regarding the filament here."
msgstr "È possibile inserire qui le note riguardanti il filamento."
-#: src/libslic3r/PrintConfig.cpp:1473
+#: src/libslic3r/PrintConfig.cpp:1581
msgid "You can put your notes regarding the printer here."
msgstr "È possibile inserire qui le note riguardanti la stampante."
-#: src/libslic3r/PrintConfig.cpp:2579
+#: src/libslic3r/PrintConfig.cpp:2722
msgid "You can put your notes regarding the SLA print material here."
msgstr "È possibile inserire qui le proprie note riguardo il materiale di stampa SLA."
-#: src/libslic3r/PrintConfig.cpp:360
+#: src/libslic3r/PrintConfig.cpp:394
msgid "You can set this to a positive value to disable fan at all during the first layers, so that it does not make adhesion worse."
msgstr "È possibile impostare un valore positivo per disattivare completamente la ventola durante i primi layer, così da non peggiorare l'adesione."
-#: src/libslic3r/PrintConfig.cpp:1364
+#: src/libslic3r/PrintConfig.cpp:1472
msgid "You can use all configuration options as variables inside this template. For example: [layer_height], [fill_density] etc. You can also use [timestamp], [year], [month], [day], [hour], [minute], [second], [version], [input_filename], [input_filename_base]."
msgstr "È possibile utilizzare tutte le opzioni di configurazione come variabili all'interno di questo modello. Ad esempio: [layer_height], [fill_density] ecc. Puoi anche usare [timestamp], [year], [month], [day], [hour], [minute], [second], [version], [input_filename ], [nome_filename_input]."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3546
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4009
msgid "You can't change a type of the last solid part of the object."
msgstr "Non è possibile modificare il tipo dell'ultima parte solida dell'oggetto."
-#: src/slic3r/GUI/Plater.cpp:2390
+#: src/slic3r/GUI/Plater.cpp:2352
#, possible-c-format
msgid "You can't to add the object(s) from %s because of one or some of them is(are) multi-part"
msgstr "Non è possibile aggiungere oggetti da %s perché uno o più sono multi-parte"
-#: src/slic3r/GUI/Plater.cpp:2311
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:208 src/slic3r/GUI/Plater.cpp:2254
msgid "You cannot load SLA project with a multi-part object on the bed"
msgstr "Non è possibile caricare un progetto SLA con un oggetto multi-parte sul piano"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:625
msgid "You cannot use non-uniform scaling mode for multiple objects/parts selection"
msgstr "Non è possibile utilizzare la modalità di ridimensionamento non uniforme per una selezione di più oggetti/parti"
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:287
+#: src/slic3r/GUI/NotificationManager.hpp:459
+msgid "You have just added a G-code for color change, but its value is empty.\nTo export the G-code correctly, check the \"Color Change G-code\" in \"Printer Settings > Custom G-code\""
+msgstr "Hai aggiunto un G-code per il cambio colore, ma il suo valore è vuoto.\nPer esportare correttamente il G-code, controlla \"Color Change G-code\" su \"Impostazioni stampante > G-code personalizzato\""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:277
+msgid "You have selected physical printer \"%1%\" \nwith related printer preset \"%2%\""
+msgstr "Hai selezionato la stampante fisica \"%1%\" \ncon il relativo preset stampante \"%2%\""
+
+#: src/slic3r/GUI/GUI_App.cpp:1078
+msgid "You have the following presets with saved options for \"Print Host upload\""
+msgstr "Sono disponibili i seguenti preset con le opzioni salvate per \"Caricamento Host di stampa\""
+
+#: src/slic3r/GUI/OpenGLManager.cpp:262
msgid "You may need to update your graphics card driver."
msgstr "Dovresti aggiornare i driver della scheda video."
@@ -8819,77 +10474,95 @@ msgstr "Dovresti aggiornare i driver della scheda video."
msgid "You must install a configuration update."
msgstr "È necessario installare un aggiornamento della configurazione."
-#: src/slic3r/GUI/Preferences.cpp:172
+#: src/slic3r/GUI/Preferences.cpp:299
#, possible-c-format
msgid "You need to restart %s to make the changes effective."
msgstr "È necessario riavviare %s per rendere effettive le modifiche."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3421
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:468
+msgid "You should change the name of your printer device."
+msgstr "Devi cambiare il nome del dispositivo di stampa."
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3884
#, possible-c-format
msgid "You started your selection with %s Item."
msgstr "Hai iniziato la selezione con %s elementi."
-#: src/slic3r/GUI/DoubleSlider.cpp:1902
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:664
+msgid "You will not be asked about the unsaved changes the next time you close PrusaSlicer."
+msgstr "La prossima volta che chiuderai PrusaSlicer non ti verrà chiesto nulla sulle modifiche non salvate."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:665
+msgid "You will not be asked about the unsaved changes the next time you switch a preset."
+msgstr "La prossima volta che si passa ad un preset non verrà chiesto nulla sulle modifiche non salvate."
+
+#: src/slic3r/GUI/DoubleSlider.cpp:2121
msgid "Your current changes will delete all saved color changes."
msgstr "Le modifiche attuali cancelleranno tutti i cambi colore salvati."
-#: src/slic3r/GUI/DoubleSlider.cpp:1923
+#: src/slic3r/GUI/DoubleSlider.cpp:2141
msgid "Your current changes will delete all saved extruder (tool) changes."
msgstr "Le modifiche attuali cancelleranno tutti i cambi estrusore (attrezzo) salvati."
-#: src/slic3r/GUI/MainFrame.cpp:911
+#: src/slic3r/GUI/MainFrame.cpp:1612
msgid "Your file was repaired."
msgstr "Il file è stato riparato."
-#: src/slic3r/GUI/Plater.cpp:2528
+#: src/slic3r/GUI/Plater.cpp:2490
msgid "Your object appears to be too large, so it was automatically scaled down to fit your print bed."
msgstr "L'oggetto sembra essere troppo grande, è stato quindi ridimensionato automaticamente per entrare nel piano di stampa."
-#: src/libslic3r/PrintConfig.cpp:2285
+#: src/libslic3r/GCode.cpp:1261
+msgid "Your print is very close to the priming regions. Make sure there is no collision."
+msgstr "La stampa è molto vicina alle aree di preparazione. Assicurati che non vi siano collisioni. "
+
+#: src/libslic3r/PrintConfig.cpp:2428
msgid "Z offset"
msgstr "Offset Z"
-#: src/slic3r/GUI/ConfigManipulation.cpp:60
+#: src/slic3r/GUI/ConfigManipulation.cpp:59
msgid "Zero first layer height is not valid.\n\nThe first layer height will be reset to 0.01."
msgstr "Altezza primo layer a zero non è valida.\n\nL'altezza del primo layer verrà reimpostata a 0.01."
-#: src/slic3r/GUI/ConfigManipulation.cpp:48
+#: src/slic3r/GUI/ConfigManipulation.cpp:47
msgid "Zero layer height is not valid.\n\nThe layer height will be reset to 0.01."
msgstr "Altezza layer zero non valida.\n\nL'altezza layer verrà reimpostata a 0.01."
-#: src/libslic3r/PrintConfig.cpp:2667
+#: src/libslic3r/PrintConfig.cpp:2831
msgid "Zig-Zag"
msgstr "Zig-Zag"
-#: src/slic3r/GUI/Mouse3DController.cpp:308
-#: src/slic3r/GUI/Mouse3DController.cpp:317
+#: src/slic3r/GUI/Mouse3DController.cpp:294
+#: src/slic3r/GUI/Mouse3DController.cpp:303
msgid "Zoom"
msgstr "Zoom"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:183
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:177
msgid "Zoom in"
msgstr "Zoom in"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:184
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:178
msgid "Zoom out"
msgstr "Zoom out"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:181
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
msgid "Zoom to Bed"
msgstr "Zoom sul piano"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:182
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:176
msgid "Zoom to selected object\nor all objects in scene, if none selected"
msgstr "Zoom sull'oggetto selezionato\no tutti gli oggetti in scena, se nessuno è selezionato"
-#: src/libslic3r/PrintConfig.cpp:207 src/libslic3r/PrintConfig.cpp:780
-#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1650
-#: src/libslic3r/PrintConfig.cpp:1894 src/libslic3r/PrintConfig.cpp:2049
-#: src/libslic3r/PrintConfig.cpp:2247 src/libslic3r/PrintConfig.cpp:2727
-#: src/libslic3r/PrintConfig.cpp:2848
+#: src/libslic3r/PrintConfig.cpp:241 src/libslic3r/PrintConfig.cpp:816
+#: src/libslic3r/PrintConfig.cpp:1748 src/libslic3r/PrintConfig.cpp:1758
+#: src/libslic3r/PrintConfig.cpp:2036 src/libslic3r/PrintConfig.cpp:2191
+#: src/libslic3r/PrintConfig.cpp:2390 src/libslic3r/PrintConfig.cpp:2891
+#: src/libslic3r/PrintConfig.cpp:3012
msgid "°"
msgstr "°"
-#: src/slic3r/GUI/ConfigWizard.cpp:1038 src/slic3r/GUI/ConfigWizard.cpp:1052
+#: src/slic3r/GUI/ConfigWizard.cpp:1404 src/slic3r/GUI/ConfigWizard.cpp:1418
+#: src/libslic3r/PrintConfig.cpp:180 src/libslic3r/PrintConfig.cpp:912
+#: src/libslic3r/PrintConfig.cpp:956 src/libslic3r/PrintConfig.cpp:2209
msgid "°C"
msgstr "°C"
diff --git a/resources/localization/ko/PrusaSlicer.mo b/resources/localization/ko/PrusaSlicer.mo
index a1e06abab..fa7a62e6e 100644
--- a/resources/localization/ko/PrusaSlicer.mo
+++ b/resources/localization/ko/PrusaSlicer.mo
Binary files differ
diff --git a/resources/localization/ko/PrusaSlicer_ko_KR.po b/resources/localization/ko/PrusaSlicer_ko_KR.po
index db96beba5..804e21141 100644
--- a/resources/localization/ko/PrusaSlicer_ko_KR.po
+++ b/resources/localization/ko/PrusaSlicer_ko_KR.po
@@ -429,7 +429,7 @@ msgstr "ì„œí¬íŠ¸ ìƒì„±"
#: src/slic3r/GUI/ConfigManipulation.cpp:200
msgid "The %1% infill pattern is not supposed to work at 100%% density."
-msgstr "%1% 채우기 íŒ¨í„´ì€ 100% ë°€ë„ë¡œ ìž‘ë™í•˜ë„ë¡ ë˜ì–´ 있지 않습니다."
+msgstr "%1% 채우기 íŒ¨í„´ì€ 100%% ë°€ë„ë¡œ ìž‘ë™í•˜ë„ë¡ ë˜ì–´ 있지 않습니다."
#: src/slic3r/GUI/ConfigManipulation.cpp:202
msgid "Shall I switch to rectilinear fill pattern?"
diff --git a/resources/localization/list.txt b/resources/localization/list.txt
index 3c2a95638..64d50591a 100644
--- a/resources/localization/list.txt
+++ b/resources/localization/list.txt
@@ -1,5 +1,4 @@
src/slic3r/GUI/AboutDialog.cpp
-src/slic3r/GUI/AppConfig.cpp
src/slic3r/GUI/BackgroundSlicingProcess.cpp
src/slic3r/GUI/BedShapeDialog.cpp
src/slic3r/GUI/BedShapeDialog.hpp
@@ -9,45 +8,60 @@ src/slic3r/GUI/ConfigManipulation.cpp
src/slic3r/GUI/ConfigSnapshotDialog.cpp
src/slic3r/GUI/ConfigWizard.cpp
src/slic3r/GUI/DoubleSlider.cpp
+src/slic3r/GUI/ExtraRenderers.cpp
src/slic3r/GUI/ExtruderSequenceDialog.cpp
src/slic3r/GUI/Field.cpp
src/slic3r/GUI/FirmwareDialog.cpp
+src/slic3r/GUI/GCodeViewer.cpp
src/slic3r/GUI/GLCanvas3D.cpp
-src/slic3r/GUI/GLCanvas3DManager.cpp
src/slic3r/GUI/Gizmos/GLGizmoCut.cpp
+src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp
src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp
src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
src/slic3r/GUI/Gizmos/GLGizmoMove.cpp
src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp
src/slic3r/GUI/Gizmos/GLGizmoScale.cpp
+src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp
src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
src/slic3r/GUI/Gizmos/GLGizmosManager.cpp
+src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp
src/slic3r/GUI/GUI.cpp
src/slic3r/GUI/GUI_App.cpp
+src/slic3r/GUI/GUI_Init.cpp
src/slic3r/GUI/GUI_ObjectLayers.cpp
src/slic3r/GUI/GUI_ObjectList.cpp
src/slic3r/GUI/GUI_ObjectManipulation.cpp
src/slic3r/GUI/GUI_ObjectSettings.cpp
src/slic3r/GUI/GUI_Preview.cpp
-src/slic3r/GUI/Job.hpp
+src/slic3r/GUI/ImGuiWrapper.cpp
+src/slic3r/GUI/Jobs/ArrangeJob.cpp
+src/slic3r/GUI/Jobs/Job.cpp
+src/slic3r/GUI/Jobs/RotoptimizeJob.cpp
+src/slic3r/GUI/Jobs/SLAImportJob.cpp
src/slic3r/GUI/KBShortcutsDialog.cpp
src/slic3r/GUI/MainFrame.cpp
src/slic3r/GUI/Mouse3DController.cpp
src/slic3r/GUI/MsgDialog.cpp
+src/slic3r/GUI/NotificationManager.hpp
+src/slic3r/GUI/NotificationManager.cpp
src/slic3r/GUI/ObjectDataViewModel.cpp
+src/slic3r/GUI/OpenGLManager.cpp
src/slic3r/GUI/OptionsGroup.cpp
+src/slic3r/GUI/PhysicalPrinterDialog.cpp
src/slic3r/GUI/Plater.cpp
src/slic3r/GUI/Preferences.cpp
-src/slic3r/GUI/Preset.cpp
-src/slic3r/GUI/PresetBundle.cpp
+src/slic3r/GUI/PresetComboBoxes.cpp
src/slic3r/GUI/PresetHints.cpp
src/slic3r/GUI/PrintHostDialogs.cpp
src/slic3r/GUI/ProgressStatusBar.cpp
src/slic3r/GUI/RammingChart.cpp
+src/slic3r/GUI/SavePresetDialog.cpp
+src/slic3r/GUI/Search.cpp
src/slic3r/GUI/Selection.cpp
src/slic3r/GUI/SysInfoDialog.cpp
src/slic3r/GUI/Tab.cpp
src/slic3r/GUI/Tab.hpp
+src/slic3r/GUI/UnsavedChangesDialog.cpp
src/slic3r/GUI/UpdateDialogs.cpp
src/slic3r/GUI/WipeTowerDialog.cpp
src/slic3r/GUI/wxExtensions.cpp
@@ -57,18 +71,21 @@ src/slic3r/Utils/FixModelByWin10.cpp
src/slic3r/Utils/FlashAir.cpp
src/slic3r/Utils/OctoPrint.cpp
src/slic3r/Utils/PresetUpdater.cpp
-src/libslic3r/SLA/Pad.cpp
-src/libslic3r/SLA/Hollowing.cpp
-src/libslic3r/Zipper.cpp
+src/slic3r/Utils/Http.cpp
+src/slic3r/Utils/Process.cpp
src/libslic3r/GCode.cpp
src/libslic3r/ExtrusionEntity.cpp
src/libslic3r/Flow.cpp
src/libslic3r/Format/3mf.cpp
src/libslic3r/Format/AMF.cpp
+src/libslic3r/miniz_extension.cpp
+src/libslic3r/Preset.cpp
src/libslic3r/Print.cpp
+src/libslic3r/SLA/Pad.cpp
+src/libslic3r/SLA/Hollowing.cpp
src/libslic3r/SLAPrint.cpp
src/libslic3r/SLAPrintSteps.cpp
src/libslic3r/PrintBase.cpp
src/libslic3r/PrintConfig.cpp
+src/libslic3r/Zipper.cpp
src/libslic3r/PrintObject.cpp
-src/libslic3r/GCode/PreviewData.cpp
diff --git a/resources/localization/nl/PrusaSlicer.mo b/resources/localization/nl/PrusaSlicer.mo
index 6c68f3922..70155e722 100644
--- a/resources/localization/nl/PrusaSlicer.mo
+++ b/resources/localization/nl/PrusaSlicer.mo
Binary files differ
diff --git a/resources/localization/nl/PrusaSlicer_nl.po b/resources/localization/nl/PrusaSlicer_nl.po
index d0f065e52..cb64b61ee 100644
--- a/resources/localization/nl/PrusaSlicer_nl.po
+++ b/resources/localization/nl/PrusaSlicer_nl.po
@@ -7,61 +7,62 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-03-11 15:15+0100\n"
-"PO-Revision-Date: 2020-03-13 10:54+0100\n"
+"POT-Creation-Date: 2020-12-16 16:54+0100\n"
+"PO-Revision-Date: 2020-12-17 22:05+0100\n"
"Language-Team: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 2.3\n"
-"Last-Translator: Simon Tillema <simontillema@gmail.com>\n"
+"X-Generator: Poedit 2.4.2\n"
+"Last-Translator: \n"
"Language: nl\n"
-#: src/slic3r/GUI/AboutDialog.cpp:41 src/slic3r/GUI/AboutDialog.cpp:294
+#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:299
msgid "Portions copyright"
msgstr "Gedeeltelijk auteursrecht"
-#: src/slic3r/GUI/AboutDialog.cpp:129 src/slic3r/GUI/AboutDialog.cpp:258
+#: src/slic3r/GUI/AboutDialog.cpp:135 src/slic3r/GUI/AboutDialog.cpp:263
msgid "Copyright"
msgstr "Auteursrecht"
#. TRN "Slic3r _is licensed under the_ License"
-#: src/slic3r/GUI/AboutDialog.cpp:131
+#: src/slic3r/GUI/AboutDialog.cpp:137
msgid ""
"License agreements of all following programs (libraries) are part of "
"application license agreement"
msgstr ""
-"Licentieovereenkomsten van alle programma's (en onderdelen) zijn deel van de "
-"applicatielicentieovereenkomst"
+"Licentieovereenkomst van alle volgende programma's maken deel uit van de "
+"software-licentieovereenkomst"
-#: src/slic3r/GUI/AboutDialog.cpp:201
+#: src/slic3r/GUI/AboutDialog.cpp:206
#, c-format
msgid "About %s"
msgstr "Over %s"
-#: src/slic3r/GUI/AboutDialog.cpp:233 src/slic3r/GUI/MainFrame.cpp:65
+#: src/slic3r/GUI/AboutDialog.cpp:238 src/slic3r/GUI/AboutDialog.cpp:361
+#: src/slic3r/GUI/GUI_App.cpp:234 src/slic3r/GUI/MainFrame.cpp:151
msgid "Version"
msgstr "Versie"
#. TRN "Slic3r _is licensed under the_ License"
-#: src/slic3r/GUI/AboutDialog.cpp:260
+#: src/slic3r/GUI/AboutDialog.cpp:265 src/slic3r/GUI/GUI_App.cpp:239
msgid "is licensed under the"
msgstr "is gelicenseerd onder de"
-#: src/slic3r/GUI/AboutDialog.cpp:261
+#: src/slic3r/GUI/AboutDialog.cpp:266 src/slic3r/GUI/GUI_App.cpp:239
msgid "GNU Affero General Public License, version 3"
-msgstr "GNU Affero General Public License, versie 3"
+msgstr "GNU Affero Algemene Publieke Licentie, versie 3"
-#: src/slic3r/GUI/AboutDialog.cpp:262
+#: src/slic3r/GUI/AboutDialog.cpp:267
msgid ""
"PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap "
"community."
msgstr ""
-"PrusaSlicer is gebaseerd op 'Slic3r' van Alessandro Ranellucci en de RepRap "
+"PrusaSlicer is gebaseerd op Slic3r van Alessandro Ranellucci en de RepRap-"
"community."
-#: src/slic3r/GUI/AboutDialog.cpp:263
+#: src/slic3r/GUI/AboutDialog.cpp:268
msgid ""
"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, "
"Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and "
@@ -71,175 +72,168 @@ msgstr ""
"Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik, Simon "
"Tillema en vele anderen."
-#: src/slic3r/GUI/AppConfig.cpp:114
+#: src/slic3r/GUI/AboutDialog.cpp:304
+msgid "Copy Version Info"
+msgstr "Kopieer versie-info"
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:78
+#, c-format
msgid ""
-"Error parsing PrusaSlicer config file, it is probably corrupted. Try to "
-"manually delete the file to recover from the error. Your user profiles will "
-"not be affected."
+"%s has encountered an error. It was likely caused by running out of memory. "
+"If you are sure you have enough RAM on your system, this may also be a bug "
+"and we would be glad if you reported it."
msgstr ""
-"Fout in het configuratiebestand. Het is waarschijnlijk beschadigd. Probeer "
-"de fout handmatig te verwijderen om het te herstellen. Dit heeft geen effect "
-"op uw gebruikersprofielen."
+"Fout in %s. Mogelijk komt dit door een tekort aan RAM geheugen. Als je er "
+"zeker van bent genoeg RAM geheugen te hebben, kan dit een andere oorzaak "
+"hebben. We waarderen het als je dit meldt."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:109
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:163
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183
+msgid "Unknown error occured during exporting G-code."
+msgstr "Onbekende error opgetreden tijdens exporteren van de G-code."
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:168
msgid ""
"Copying of the temporary G-code to the output G-code failed. Maybe the SD "
-"card is write locked?"
+"card is write locked?\n"
+"Error message: %1%"
msgstr ""
-"Kopiëren van de tijdelijke G-code naar de output is mislukt. Is de SD-kaart "
-"geblokkeerd?"
+"Fout bij het exporteren naar output-G-code. Is de SD-kaart geblokkeerd tegen "
+"schrijven?\n"
+"Foutbericht: %1%"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:112
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:171
msgid ""
"Copying of the temporary G-code to the output G-code failed. There might be "
"problem with target device, please try exporting again or using different "
"device. The corrupted output G-code is at %1%.tmp."
msgstr ""
-"Kopiëren van de tijdelijke G-code naar de output mislukt. Er is mogelijk een "
-"probleem met het doelapparaat. Probeer opnieuw te exporteren of gebruik een "
-"ander apparaat. De beschadigde output-G-code is in %1%.tmp."
+"Fout bij het exporteren naar output-G-code. Het probleem ligt mogelijk bij "
+"het doelapparaat. Probeer het opnieuw te exporteren of gebruik een ander "
+"apparat. De beschadigde G-code is opgeslagen als %1%.tmp."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:115
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:174
msgid ""
"Renaming of the G-code after copying to the selected destination folder has "
"failed. Current path is %1%.tmp. Please try exporting again."
msgstr ""
-"Hernoemen van de G-code na het kopiëren naar de geselecteerde map is "
-"mislukt. Het huidige pad is %1%.tmp. Probeer opnieuw te exporteren."
+"Fout bij het exporteren naar output-G-code. Hernoemen van het bestand "
+"mislukt. Huidige locatie is %1%.tmp. Probeer opnieuw te exporteren."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:118
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:177
msgid ""
"Copying of the temporary G-code has finished but the original code at %1% "
"couldn't be opened during copy check. The output G-code is at %2%.tmp."
msgstr ""
-"Kopiëren van de tijdelijke G-code is afgerond, maar de originele code in %1% "
-"kon niet geopend worden tijdens het controleren. De output is in %1%.tmp."
+"Fout bij het exporteren naar output-G-code. Exporteren gelukt, maar kan het "
+"bestand %1% niet openen om te controleren. De output is %1%.tmp."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:121
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:180
msgid ""
"Copying of the temporary G-code has finished but the exported code couldn't "
"be opened during copy check. The output G-code is at %1%.tmp."
msgstr ""
-"Kopiëren van de tijdelijke G-code is afgerond, maar de geëxporteerde code "
-"kon niet geopend worden voor controle. De output is in %1%.tmp."
+"Fout bij het exporteren naar output-G-code. Exporteren gelukt, maar kan het "
+"bestand niet openen om te controleren. De output is %1%.tmp."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:128
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:478
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:187
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:536
msgid "Running post-processing scripts"
msgstr "Uitvoeren van nabewerkingsscripts"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:130
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:189
msgid "G-code file exported to %1%"
-msgstr "gcode-bestand geëxporteerd naar %1%"
+msgstr "G-code-bestand geëxporteerd naar %1%"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:134
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:184
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:194
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:243
msgid "Slicing complete"
-msgstr "Slicen compleet"
+msgstr "Slicen gelukt"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:180
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:238
msgid "Masked SLA file exported to %1%"
-msgstr "Verborgen SLA-bestand geëxporteerd naar %1%"
+msgstr "Gemaskeerd SLA bestand geëxporteerd naar %1%"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:222
-#, c-format
-msgid ""
-"%s has encountered an error. It was likely caused by running out of memory. "
-"If you are sure you have enough RAM on your system, this may also be a bug "
-"and we would be glad if you reported it."
-msgstr ""
-"%s veroorzaakte een fout. Dit komt mogelijk door een geheugentekort. Als u "
-"zeker weet dat u genoeg RAM heeft, kan dit ook een andere systeemfout zijn. "
-"We waarderen het als u dit meldt."
-
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:480
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:539
msgid "Copying of the temporary G-code to the output G-code failed"
-msgstr "Kopiëren van de tijdelijke G-code naar de output is mislukt"
+msgstr "Fout bij het exporteren naar de output-G-code"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:505
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:562
msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue"
msgstr ""
-"Plannen van de upload naar '%1%'. Zie Venster -> Printhost uploadwachtrij"
-
-#: src/slic3r/GUI/BedShapeDialog.cpp:66 src/slic3r/GUI/GUI_ObjectList.cpp:2075
-msgid "Shape"
-msgstr "Vorm"
-
-#: src/slic3r/GUI/BedShapeDialog.cpp:73
-msgid "Rectangular"
-msgstr "Rechthoekig"
+"Plannen van de upload naar '%1%'. Zie Venster -> printhost-uploadwachtrij"
-#: src/slic3r/GUI/BedShapeDialog.cpp:77
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:232 src/slic3r/GUI/Plater.cpp:160
-#: src/slic3r/GUI/Tab.cpp:2308
+#: src/slic3r/GUI/BedShapeDialog.cpp:93
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:240 src/slic3r/GUI/Plater.cpp:162
+#: src/slic3r/GUI/Tab.cpp:2536
msgid "Size"
msgstr "Grootte"
-#: src/slic3r/GUI/BedShapeDialog.cpp:78
-msgid "Size in X and Y of the rectangular plate."
-msgstr "Breedte en diepte van rechthoekig bed."
-
-#: src/slic3r/GUI/BedShapeDialog.cpp:84
+#: src/slic3r/GUI/BedShapeDialog.cpp:94
msgid "Origin"
msgstr "Nulpunt"
-#: src/slic3r/GUI/BedShapeDialog.cpp:85
+#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:771
+msgid "Diameter"
+msgstr "Diameter"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:110
+msgid "Size in X and Y of the rectangular plate."
+msgstr "Afmeting in X en Y van het rechthoekig platform."
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:121
msgid ""
"Distance of the 0,0 G-code coordinate from the front left corner of the "
"rectangle."
msgstr ""
-"Afstand vanaf het nulpunt in de G-code tot de linkervoorhoek van de "
-"rechthoek."
-
-#: src/slic3r/GUI/BedShapeDialog.cpp:89
-msgid "Circular"
-msgstr "Rond"
-
-#: src/slic3r/GUI/BedShapeDialog.cpp:92 src/slic3r/GUI/ConfigWizard.cpp:233
-#: src/slic3r/GUI/ConfigWizard.cpp:985 src/slic3r/GUI/ConfigWizard.cpp:999
-#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:87
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:142
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:333
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:94
-#: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:75
-#: src/libslic3r/PrintConfig.cpp:82 src/libslic3r/PrintConfig.cpp:91
-#: src/libslic3r/PrintConfig.cpp:122 src/libslic3r/PrintConfig.cpp:188
-#: src/libslic3r/PrintConfig.cpp:246 src/libslic3r/PrintConfig.cpp:321
-#: src/libslic3r/PrintConfig.cpp:329 src/libslic3r/PrintConfig.cpp:379
-#: src/libslic3r/PrintConfig.cpp:505 src/libslic3r/PrintConfig.cpp:516
-#: src/libslic3r/PrintConfig.cpp:534 src/libslic3r/PrintConfig.cpp:712
-#: src/libslic3r/PrintConfig.cpp:1231 src/libslic3r/PrintConfig.cpp:1292
-#: src/libslic3r/PrintConfig.cpp:1310 src/libslic3r/PrintConfig.cpp:1328
-#: src/libslic3r/PrintConfig.cpp:1384 src/libslic3r/PrintConfig.cpp:1394
-#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1524
-#: src/libslic3r/PrintConfig.cpp:1565 src/libslic3r/PrintConfig.cpp:1573
-#: src/libslic3r/PrintConfig.cpp:1583 src/libslic3r/PrintConfig.cpp:1591
-#: src/libslic3r/PrintConfig.cpp:1599 src/libslic3r/PrintConfig.cpp:1682
-#: src/libslic3r/PrintConfig.cpp:1914 src/libslic3r/PrintConfig.cpp:1985
-#: src/libslic3r/PrintConfig.cpp:2019 src/libslic3r/PrintConfig.cpp:2147
-#: src/libslic3r/PrintConfig.cpp:2226 src/libslic3r/PrintConfig.cpp:2233
-#: src/libslic3r/PrintConfig.cpp:2240 src/libslic3r/PrintConfig.cpp:2270
-#: src/libslic3r/PrintConfig.cpp:2280 src/libslic3r/PrintConfig.cpp:2290
-#: src/libslic3r/PrintConfig.cpp:2450 src/libslic3r/PrintConfig.cpp:2484
-#: src/libslic3r/PrintConfig.cpp:2623 src/libslic3r/PrintConfig.cpp:2632
-#: src/libslic3r/PrintConfig.cpp:2641 src/libslic3r/PrintConfig.cpp:2651
-#: src/libslic3r/PrintConfig.cpp:2705 src/libslic3r/PrintConfig.cpp:2715
-#: src/libslic3r/PrintConfig.cpp:2727 src/libslic3r/PrintConfig.cpp:2747
-#: src/libslic3r/PrintConfig.cpp:2757 src/libslic3r/PrintConfig.cpp:2767
-#: src/libslic3r/PrintConfig.cpp:2785 src/libslic3r/PrintConfig.cpp:2800
-#: src/libslic3r/PrintConfig.cpp:2814 src/libslic3r/PrintConfig.cpp:2825
-#: src/libslic3r/PrintConfig.cpp:2838 src/libslic3r/PrintConfig.cpp:2883
-#: src/libslic3r/PrintConfig.cpp:2893 src/libslic3r/PrintConfig.cpp:2902
-#: src/libslic3r/PrintConfig.cpp:2912 src/libslic3r/PrintConfig.cpp:2928
-#: src/libslic3r/PrintConfig.cpp:2952
+"Afstand van het nulpunt in de G-code naar de linkervoorhoek van het printbed."
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:129 src/slic3r/GUI/ConfigWizard.cpp:237
+#: src/slic3r/GUI/ConfigWizard.cpp:1359 src/slic3r/GUI/ConfigWizard.cpp:1373
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:88
+#: src/slic3r/GUI/GCodeViewer.cpp:2331 src/slic3r/GUI/GCodeViewer.cpp:2337
+#: src/slic3r/GUI/GCodeViewer.cpp:2345 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:179
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:145
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:96
+#: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:77
+#: src/libslic3r/PrintConfig.cpp:84 src/libslic3r/PrintConfig.cpp:95
+#: src/libslic3r/PrintConfig.cpp:135 src/libslic3r/PrintConfig.cpp:244
+#: src/libslic3r/PrintConfig.cpp:302 src/libslic3r/PrintConfig.cpp:377
+#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:435
+#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:576
+#: src/libslic3r/PrintConfig.cpp:594 src/libslic3r/PrintConfig.cpp:774
+#: src/libslic3r/PrintConfig.cpp:1258 src/libslic3r/PrintConfig.cpp:1439
+#: src/libslic3r/PrintConfig.cpp:1500 src/libslic3r/PrintConfig.cpp:1518
+#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1594
+#: src/libslic3r/PrintConfig.cpp:1604 src/libslic3r/PrintConfig.cpp:1729
+#: src/libslic3r/PrintConfig.cpp:1737 src/libslic3r/PrintConfig.cpp:1778
+#: src/libslic3r/PrintConfig.cpp:1786 src/libslic3r/PrintConfig.cpp:1796
+#: src/libslic3r/PrintConfig.cpp:1804 src/libslic3r/PrintConfig.cpp:1812
+#: src/libslic3r/PrintConfig.cpp:1875 src/libslic3r/PrintConfig.cpp:2141
+#: src/libslic3r/PrintConfig.cpp:2212 src/libslic3r/PrintConfig.cpp:2246
+#: src/libslic3r/PrintConfig.cpp:2375 src/libslic3r/PrintConfig.cpp:2454
+#: src/libslic3r/PrintConfig.cpp:2461 src/libslic3r/PrintConfig.cpp:2468
+#: src/libslic3r/PrintConfig.cpp:2498 src/libslic3r/PrintConfig.cpp:2508
+#: src/libslic3r/PrintConfig.cpp:2518 src/libslic3r/PrintConfig.cpp:2678
+#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2851
+#: src/libslic3r/PrintConfig.cpp:2860 src/libslic3r/PrintConfig.cpp:2869
+#: src/libslic3r/PrintConfig.cpp:2879 src/libslic3r/PrintConfig.cpp:2944
+#: src/libslic3r/PrintConfig.cpp:2954 src/libslic3r/PrintConfig.cpp:2966
+#: src/libslic3r/PrintConfig.cpp:2986 src/libslic3r/PrintConfig.cpp:2996
+#: src/libslic3r/PrintConfig.cpp:3006 src/libslic3r/PrintConfig.cpp:3024
+#: src/libslic3r/PrintConfig.cpp:3039 src/libslic3r/PrintConfig.cpp:3053
+#: src/libslic3r/PrintConfig.cpp:3064 src/libslic3r/PrintConfig.cpp:3077
+#: src/libslic3r/PrintConfig.cpp:3122 src/libslic3r/PrintConfig.cpp:3132
+#: src/libslic3r/PrintConfig.cpp:3141 src/libslic3r/PrintConfig.cpp:3151
+#: src/libslic3r/PrintConfig.cpp:3167 src/libslic3r/PrintConfig.cpp:3191
msgid "mm"
msgstr "mm"
-#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/libslic3r/PrintConfig.cpp:709
-msgid "Diameter"
-msgstr "Diameter"
-
-#: src/slic3r/GUI/BedShapeDialog.cpp:94
+#: src/slic3r/GUI/BedShapeDialog.cpp:131
msgid ""
"Diameter of the print bed. It is assumed that origin (0,0) is located in the "
"center."
@@ -247,79 +241,96 @@ msgstr ""
"Diameter van het printbed. Aangenomen wordt dat het nulpunt in het midden "
"ligt."
-#: src/slic3r/GUI/BedShapeDialog.cpp:98 src/slic3r/GUI/GUI_Preview.cpp:249
-#: src/libslic3r/ExtrusionEntity.cpp:322
+#: src/slic3r/GUI/BedShapeDialog.cpp:141
+msgid "Rectangular"
+msgstr "Rechthoekig"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:142
+msgid "Circular"
+msgstr "Rond"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:143 src/slic3r/GUI/GUI_Preview.cpp:243
+#: src/libslic3r/ExtrusionEntity.cpp:323 src/libslic3r/ExtrusionEntity.cpp:358
msgid "Custom"
-msgstr "Custom"
+msgstr "Aangepast"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:145
+msgid "Invalid"
+msgstr "Ongeldig"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:156 src/slic3r/GUI/BedShapeDialog.cpp:222
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2288
+msgid "Shape"
+msgstr "Vorm"
-#: src/slic3r/GUI/BedShapeDialog.cpp:102
+#: src/slic3r/GUI/BedShapeDialog.cpp:243
msgid "Load shape from STL..."
-msgstr "Laad vorm van STL-bestand..."
+msgstr "Laad vorm van STL..."
-#: src/slic3r/GUI/BedShapeDialog.cpp:155
+#: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/MainFrame.cpp:1826
msgid "Settings"
msgstr "Instellingen"
-#: src/slic3r/GUI/BedShapeDialog.cpp:172
+#: src/slic3r/GUI/BedShapeDialog.cpp:315
msgid "Texture"
msgstr "Textuur"
-#: src/slic3r/GUI/BedShapeDialog.cpp:182 src/slic3r/GUI/BedShapeDialog.cpp:261
+#: src/slic3r/GUI/BedShapeDialog.cpp:325 src/slic3r/GUI/BedShapeDialog.cpp:405
msgid "Load..."
msgstr "Laad..."
-#: src/slic3r/GUI/BedShapeDialog.cpp:190 src/slic3r/GUI/BedShapeDialog.cpp:269
-#: src/slic3r/GUI/Tab.cpp:3144
+#: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/BedShapeDialog.cpp:413
+#: src/slic3r/GUI/Tab.cpp:3484
msgid "Remove"
msgstr "Verwijder"
-#: src/slic3r/GUI/BedShapeDialog.cpp:223 src/slic3r/GUI/BedShapeDialog.cpp:302
+#: src/slic3r/GUI/BedShapeDialog.cpp:366 src/slic3r/GUI/BedShapeDialog.cpp:446
msgid "Not found:"
msgstr "Niet gevonden:"
-#: src/slic3r/GUI/BedShapeDialog.cpp:251
+#: src/slic3r/GUI/BedShapeDialog.cpp:395
msgid "Model"
msgstr "Model"
-#: src/slic3r/GUI/BedShapeDialog.cpp:487
+#: src/slic3r/GUI/BedShapeDialog.cpp:563
msgid "Choose an STL file to import bed shape from:"
-msgstr "Kies een STL-bestand om te importeren als vorm van het bed:"
+msgstr "Kies een STL-bestand om te importeren als bedvorm:"
-#: src/slic3r/GUI/BedShapeDialog.cpp:494 src/slic3r/GUI/BedShapeDialog.cpp:543
-#: src/slic3r/GUI/BedShapeDialog.cpp:566
+#: src/slic3r/GUI/BedShapeDialog.cpp:570 src/slic3r/GUI/BedShapeDialog.cpp:619
+#: src/slic3r/GUI/BedShapeDialog.cpp:642
msgid "Invalid file format."
msgstr "Ongeldig bestandsformaat."
-#: src/slic3r/GUI/BedShapeDialog.cpp:505
+#: src/slic3r/GUI/BedShapeDialog.cpp:581
msgid "Error! Invalid model"
msgstr "Fout! Ongeldig model"
-#: src/slic3r/GUI/BedShapeDialog.cpp:513
+#: src/slic3r/GUI/BedShapeDialog.cpp:589
msgid "The selected file contains no geometry."
msgstr "Het geselecteerde bestand bevat geen geometrie."
-#: src/slic3r/GUI/BedShapeDialog.cpp:517
+#: src/slic3r/GUI/BedShapeDialog.cpp:593
msgid ""
"The selected file contains several disjoint areas. This is not supported."
msgstr ""
-"Het geselecteerde bestand bevat niet-verbonden delen. Dit wordt niet "
+"Het geselecteerde model bevat meerdere losse delen. Dit wordt niet "
"ondersteund."
-#: src/slic3r/GUI/BedShapeDialog.cpp:532
+#: src/slic3r/GUI/BedShapeDialog.cpp:608
msgid "Choose a file to import bed texture from (PNG/SVG):"
-msgstr "Kies een PNG- of SVG-bestand als textuur voor het bed:"
+msgstr "Kies een bestand om te importeren als bedtextuur (PNG/SVG):"
-#: src/slic3r/GUI/BedShapeDialog.cpp:555
+#: src/slic3r/GUI/BedShapeDialog.cpp:631
msgid "Choose an STL file to import bed model from:"
-msgstr "Kies een STL-bestand als vorm voor het bed:"
+msgstr "Kies een STL-bestand om te importeren als bedvorm:"
-#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:944
+#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1318
msgid "Bed Shape"
-msgstr "Vorm van het bed"
+msgstr "Bedvorm"
#: src/slic3r/GUI/BonjourDialog.cpp:55
msgid "Network lookup"
-msgstr "Zoeken naar netwerk"
+msgstr "Netwerk zoeken"
#: src/slic3r/GUI/BonjourDialog.cpp:72
msgid "Address"
@@ -343,7 +354,7 @@ msgstr "Zoeken naar apparaten"
#: src/slic3r/GUI/BonjourDialog.cpp:225
msgid "Finished"
-msgstr "Voltooid"
+msgstr "Klaar"
#: src/slic3r/GUI/ButtonsDescription.cpp:16
msgid "Buttons And Text Colors Description"
@@ -351,15 +362,15 @@ msgstr "Knoppen- en tekstkleurbeschrijving"
#: src/slic3r/GUI/ButtonsDescription.cpp:36
msgid "Value is the same as the system value"
-msgstr "Waarde is gelijk aan standaardwaarde"
+msgstr "Waarde is niet gelijk aan systeemwaarde"
#: src/slic3r/GUI/ButtonsDescription.cpp:53
msgid ""
"Value was changed and is not equal to the system value or the last saved "
"preset"
msgstr ""
-"Waarde is veranderd en is niet gelijk aan standaardwaarde of laatst "
-"opgeslagen waarde"
+"Waarde is veranderd en niet gelijk aan systeemwaarde of laatst opgeslagen "
+"voorinstelling"
#: src/slic3r/GUI/ConfigManipulation.cpp:48
msgid ""
@@ -367,13 +378,13 @@ msgid ""
"\n"
"The layer height will be reset to 0.01."
msgstr ""
-"Een laagdikte van 0 is niet mogelijk.\n"
+"Laagdikte van 0 is niet toegestaan.\n"
"\n"
"De laagdikte wordt ingesteld op 0.01."
#: src/slic3r/GUI/ConfigManipulation.cpp:49
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1109
-#: src/libslic3r/PrintConfig.cpp:71
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1387
+#: src/libslic3r/PrintConfig.cpp:73
msgid "Layer height"
msgstr "Laagdikte"
@@ -383,16 +394,16 @@ msgid ""
"\n"
"The first layer height will be reset to 0.01."
msgstr ""
-"Een laagdikte voor de eerste laag van 0 is niet mogelijk.\n"
+"Laagdikte van 0 op eerste laag is niet toegestaan.\n"
"\n"
-"De laagdikte voor de eerste laag wordt ingesteld op 0,01."
+"De laagdikte wordt ingesteld op 0.01."
-#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:889
+#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:969
msgid "First layer height"
msgstr "Laagdikte eerste laag"
#: src/slic3r/GUI/ConfigManipulation.cpp:81
-#, no-c-format
+#, c-format
msgid ""
"The Spiral Vase mode requires:\n"
"- one perimeter\n"
@@ -406,7 +417,7 @@ msgstr ""
"- één perimeter\n"
"- geen dichte toplagen\n"
"- vullingsdichtheid van 0%\n"
-"- geen supportmateriaal\n"
+"- geen supports\n"
"- 'Garandeer verticale shelldikte' aan\n"
"- 'Detecteer dunne wanden' uit"
@@ -427,11 +438,10 @@ msgid ""
"(both support_material_extruder and support_material_interface_extruder need "
"to be set to 0)."
msgstr ""
-"Het afveegblok ondersteunt momenteel alleen niet-oplosbare materialen\n"
-"als deze met de huidige extruder geprint worden zonder dat er een toolwissel "
-"plaatsvindt\n"
-"(zowel 'support_material_extruder' als 'support_material_interface_extruder' "
-"moeten op 0 gezet worden)."
+"Het afveegblok ondersteunt voorlopig alleen onoplosbaar support\n"
+"als ze met de huidige extruder worden geprint zonder toolwisseling.\n"
+"(zowel support_material_extruder als support_material_interface_extruder "
+"moet op 0 staan)."
#: src/slic3r/GUI/ConfigManipulation.cpp:119
msgid "Shall I adjust those settings in order to enable the Wipe Tower?"
@@ -448,250 +458,282 @@ msgid ""
"For the Wipe Tower to work with the soluble supports, the support layers\n"
"need to be synchronized with the object layers."
msgstr ""
-"De supportlagen voor het afveegblok moeten gesynchroniseerd zijn met de\n"
-"objectlagen om met oplosbaar support te werken."
+"De supportlagen moeten gesynchroniseerd worden om oplosbaar support\n"
+"met het afveegblok te laten werken."
#: src/slic3r/GUI/ConfigManipulation.cpp:139
msgid "Shall I synchronize support layers in order to enable the Wipe Tower?"
msgstr ""
-"Moeten de supportlagen gesynchroniseerd worden om het afveegblok te "
-"activeren?"
+"Moeten de supportlagen gesynchroniseerd worden met de overage lagen om het "
+"afveegblok te activeren?"
#: src/slic3r/GUI/ConfigManipulation.cpp:159
msgid ""
"Supports work better, if the following feature is enabled:\n"
"- Detect bridging perimeters"
msgstr ""
-"Support werkt beter als de volgende instellingen aan staan:\n"
-"- Detecteer brugperimeters"
+"Support werkt beter als de volgende instellingen zijn geactiveerd:\n"
+"- \"Detecteer brugperimeters\""
#: src/slic3r/GUI/ConfigManipulation.cpp:162
msgid "Shall I adjust those settings for supports?"
-msgstr "Moeten deze instellingen aangepast worden voor het support?"
+msgstr "Moeten deze instellingen aangepast worden om supports te activeren?"
#: src/slic3r/GUI/ConfigManipulation.cpp:163
msgid "Support Generator"
msgstr "Supportgenerator"
-#: src/slic3r/GUI/ConfigManipulation.cpp:208
+#: src/slic3r/GUI/ConfigManipulation.cpp:198
msgid "The %1% infill pattern is not supposed to work at 100%% density."
-msgstr "Het %1% vullingspatroon werkt niet bij een dichtheid van 100%%."
+msgstr "Het %1% vullingspatroon wordt niet ondersteunt bij 100%% dichtheid."
-#: src/slic3r/GUI/ConfigManipulation.cpp:210
+#: src/slic3r/GUI/ConfigManipulation.cpp:201
msgid "Shall I switch to rectilinear fill pattern?"
-msgstr "Moet omgeschakeld worden naar een rechtlijnig vulpatroon?"
-
-#: src/slic3r/GUI/ConfigManipulation.cpp:211
-#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:96
-#: src/slic3r/GUI/GUI_ObjectList.cpp:620 src/slic3r/GUI/Plater.cpp:532
-#: src/slic3r/GUI/Tab.cpp:1151 src/slic3r/GUI/Tab.cpp:1152
-#: src/libslic3r/PrintConfig.cpp:203 src/libslic3r/PrintConfig.cpp:416
-#: src/libslic3r/PrintConfig.cpp:436 src/libslic3r/PrintConfig.cpp:776
-#: src/libslic3r/PrintConfig.cpp:790 src/libslic3r/PrintConfig.cpp:827
-#: src/libslic3r/PrintConfig.cpp:981 src/libslic3r/PrintConfig.cpp:991
-#: src/libslic3r/PrintConfig.cpp:1009 src/libslic3r/PrintConfig.cpp:1028
-#: src/libslic3r/PrintConfig.cpp:1047 src/libslic3r/PrintConfig.cpp:1728
-#: src/libslic3r/PrintConfig.cpp:1745
+msgstr "Moet dit aangepast worden naar het rechtlijnig patroon?"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:202
+#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:93
+#: src/slic3r/GUI/GUI_ObjectList.cpp:668 src/slic3r/GUI/Plater.cpp:389
+#: src/slic3r/GUI/Tab.cpp:1432 src/slic3r/GUI/Tab.cpp:1434
+#: src/libslic3r/PrintConfig.cpp:259 src/libslic3r/PrintConfig.cpp:472
+#: src/libslic3r/PrintConfig.cpp:496 src/libslic3r/PrintConfig.cpp:848
+#: src/libslic3r/PrintConfig.cpp:862 src/libslic3r/PrintConfig.cpp:899
+#: src/libslic3r/PrintConfig.cpp:1076 src/libslic3r/PrintConfig.cpp:1086
+#: src/libslic3r/PrintConfig.cpp:1153 src/libslic3r/PrintConfig.cpp:1172
+#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:1928
+#: src/libslic3r/PrintConfig.cpp:1945
msgid "Infill"
msgstr "Vulling"
-#: src/slic3r/GUI/ConfigManipulation.cpp:317
+#: src/slic3r/GUI/ConfigManipulation.cpp:320
msgid "Head penetration should not be greater than the head width."
-msgstr "De kopinsteek mag niet groter zijn dan de kopbreedte."
+msgstr "Koppenetratie mag niet groter zijn dan de kopbreedte."
-#: src/slic3r/GUI/ConfigManipulation.cpp:319
+#: src/slic3r/GUI/ConfigManipulation.cpp:322
msgid "Invalid Head penetration"
-msgstr "Ongeldige kopinsteek"
+msgstr "Ongeldige koppenetratie"
-#: src/slic3r/GUI/ConfigManipulation.cpp:330
+#: src/slic3r/GUI/ConfigManipulation.cpp:333
msgid "Pinhead diameter should be smaller than the pillar diameter."
-msgstr "De pinkopdiameter moet kleiner zijn dan de pijlerdiameter."
+msgstr "Pinkopdiameter moet kleiner zijn dan de pijlerdiameter."
-#: src/slic3r/GUI/ConfigManipulation.cpp:332
+#: src/slic3r/GUI/ConfigManipulation.cpp:335
msgid "Invalid pinhead diameter"
msgstr "Ongeldige pinkopdiameter"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:18
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19
msgid "Upgrade"
msgstr "Upgrade"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:20
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21
msgid "Downgrade"
msgstr "Downgrade"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23
msgid "Before roll back"
-msgstr "Voor het teruggaan"
+msgstr "Voor terugrollen"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:143
msgid "User"
msgstr "Gebruiker"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:27
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28
+#: src/slic3r/GUI/GUI_Preview.cpp:229 src/libslic3r/ExtrusionEntity.cpp:309
msgid "Unknown"
msgstr "Onbekend"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:43
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:44
msgid "Active"
msgstr "Actief"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:50
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51
msgid "PrusaSlicer version"
-msgstr "PrusaSlicer-versie"
+msgstr "PrusaSlicer versie"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1551
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 src/libslic3r/Preset.cpp:1298
msgid "print"
msgstr "print"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:56
msgid "filaments"
msgstr "filamenten"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1555
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 src/libslic3r/Preset.cpp:1300
+msgid "SLA print"
+msgstr "SLA-print"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 src/slic3r/GUI/Plater.cpp:696
+#: src/libslic3r/Preset.cpp:1301
+msgid "SLA material"
+msgstr "SLA-materiaal"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:62 src/libslic3r/Preset.cpp:1302
msgid "printer"
msgstr "printer"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:1027
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:66 src/slic3r/GUI/Tab.cpp:1304
msgid "vendor"
msgstr "leverancier"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:66
msgid "version"
msgstr "versie"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:67
msgid "min PrusaSlicer version"
-msgstr "minimale PrusaSlicer-versie"
+msgstr "min. PrusaSlicer-versie"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69
msgid "max PrusaSlicer version"
-msgstr "maximale PrusaSlicer-versie"
+msgstr "max. PrusaSlicer versie"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:72
msgid "model"
msgstr "model"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:72
msgid "variants"
msgstr "varianten"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:84
#, c-format
msgid "Incompatible with this %s"
-msgstr "Incompatibel met deze %s"
+msgstr "Ongeschikt voor deze %s"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:87
msgid "Activate"
msgstr "Activeer"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:104
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:113
msgid "Configuration Snapshots"
msgstr "Configuratiesnapshots"
-#: src/slic3r/GUI/ConfigWizard.cpp:233
+#: src/slic3r/GUI/ConfigWizard.cpp:237
msgid "nozzle"
msgstr "nozzle"
-#: src/slic3r/GUI/ConfigWizard.cpp:237
+#: src/slic3r/GUI/ConfigWizard.cpp:241
msgid "Alternate nozzles:"
-msgstr "Alternatieve nozzles:"
+msgstr "Overige nozzles:"
-#: src/slic3r/GUI/ConfigWizard.cpp:304
+#: src/slic3r/GUI/ConfigWizard.cpp:305
msgid "All standard"
msgstr "Alle standaard"
-#: src/slic3r/GUI/ConfigWizard.cpp:304
+#: src/slic3r/GUI/ConfigWizard.cpp:305
msgid "Standard"
msgstr "Standaard"
-#: src/slic3r/GUI/ConfigWizard.cpp:305 src/slic3r/GUI/ConfigWizard.cpp:588
-#: src/slic3r/GUI/Tab.cpp:3203
+#: src/slic3r/GUI/ConfigWizard.cpp:306 src/slic3r/GUI/ConfigWizard.cpp:596
+#: src/slic3r/GUI/Tab.cpp:3565 src/slic3r/GUI/UnsavedChangesDialog.cpp:933
msgid "All"
-msgstr "Alle"
+msgstr "Alles"
-#: src/slic3r/GUI/ConfigWizard.cpp:306 src/slic3r/GUI/ConfigWizard.cpp:589
-#: src/slic3r/GUI/Plater.cpp:504 src/slic3r/GUI/Plater.cpp:644
-#: src/libslic3r/ExtrusionEntity.cpp:309
+#: src/slic3r/GUI/ConfigWizard.cpp:307 src/slic3r/GUI/ConfigWizard.cpp:597
+#: src/slic3r/GUI/DoubleSlider.cpp:1859 src/slic3r/GUI/Plater.cpp:361
+#: src/slic3r/GUI/Plater.cpp:504
msgid "None"
msgstr "Geen"
-#: src/slic3r/GUI/ConfigWizard.cpp:442
+#: src/slic3r/GUI/ConfigWizard.cpp:443
#, c-format
msgid "Welcome to the %s Configuration Assistant"
msgstr "Welkom bij de %s configuratie-assistent"
-#: src/slic3r/GUI/ConfigWizard.cpp:444
+#: src/slic3r/GUI/ConfigWizard.cpp:445
#, c-format
msgid "Welcome to the %s Configuration Wizard"
-msgstr "Welkom bij de %s configuratiewizard"
+msgstr "Welkom bij de %s configuratie-assistent"
-#: src/slic3r/GUI/ConfigWizard.cpp:446
+#: src/slic3r/GUI/ConfigWizard.cpp:447
msgid "Welcome"
msgstr "Welkom"
-#: src/slic3r/GUI/ConfigWizard.cpp:448
+#: src/slic3r/GUI/ConfigWizard.cpp:449
#, c-format
msgid ""
"Hello, welcome to %s! This %s helps you with the initial configuration; just "
"a few settings and you will be ready to print."
msgstr ""
-"Hallo, welkom bij %s! Deze '%s' helpt met de eerste setup; nog een paar "
-"instellingen en de printer kan gebruikt worden."
+"Hallo, welkom bij %s! Deze %s helpt je bij de eerste configuratie; nog een "
+"paar stappen te gaan en je bent klaar om te printen."
-#: src/slic3r/GUI/ConfigWizard.cpp:453
-msgid ""
-"Remove user profiles - install from scratch (a snapshot will be taken "
-"beforehand)"
-msgstr ""
-"Verwijder alle gebruiksprofielen; installeer vanaf scratch (vooraf wordt een "
-"snapshot genomen)"
+#: src/slic3r/GUI/ConfigWizard.cpp:454
+msgid "Remove user profiles (a snapshot will be taken beforehand)"
+msgstr "Verwijder gebruikersprofielen (vooraf wordt een opname gemaakt)"
-#: src/slic3r/GUI/ConfigWizard.cpp:496
+#: src/slic3r/GUI/ConfigWizard.cpp:497
#, c-format
msgid "%s Family"
msgstr "%s serie"
-#: src/slic3r/GUI/ConfigWizard.cpp:580
+#: src/slic3r/GUI/ConfigWizard.cpp:585
+msgid "Printer:"
+msgstr "Printer:"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:587
msgid "Vendor:"
msgstr "Leverancier:"
-#: src/slic3r/GUI/ConfigWizard.cpp:581
+#: src/slic3r/GUI/ConfigWizard.cpp:588
msgid "Profile:"
msgstr "Profiel:"
-#: src/slic3r/GUI/ConfigWizard.cpp:618 src/slic3r/GUI/ConfigWizard.cpp:646
+#: src/slic3r/GUI/ConfigWizard.cpp:660 src/slic3r/GUI/ConfigWizard.cpp:810
+#: src/slic3r/GUI/ConfigWizard.cpp:871 src/slic3r/GUI/ConfigWizard.cpp:1008
msgid "(All)"
-msgstr "(Alle)"
+msgstr "(Alles)"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:689
+msgid ""
+"Filaments marked with <b>*</b> are <b>not</b> compatible with some installed "
+"printers."
+msgstr ""
+"Filamenten die gemarkeerd zijn met <b>*<b> zijn <b>niet<b> geschikt voor "
+"sommige geïnstalleerde printers."
-#: src/slic3r/GUI/ConfigWizard.cpp:747
+#: src/slic3r/GUI/ConfigWizard.cpp:692
+msgid "All installed printers are compatible with the selected filament."
+msgstr ""
+"Alle geïnstalleerde printers zijn geschikt voor het geselecteerde filament."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:712
+msgid ""
+"Only the following installed printers are compatible with the selected "
+"filament:"
+msgstr ""
+"Alleen de volgende geïnstalleerde printers zijn geschikt voor het "
+"geselecteerde filament:"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1098
msgid "Custom Printer Setup"
msgstr "Custom printersetup"
-#: src/slic3r/GUI/ConfigWizard.cpp:747
+#: src/slic3r/GUI/ConfigWizard.cpp:1098
msgid "Custom Printer"
msgstr "Custom printer"
-#: src/slic3r/GUI/ConfigWizard.cpp:749
+#: src/slic3r/GUI/ConfigWizard.cpp:1100
msgid "Define a custom printer profile"
-msgstr "Definieer een custom-printerprofiel"
+msgstr "Definieer een custom printerprofiel"
-#: src/slic3r/GUI/ConfigWizard.cpp:751
+#: src/slic3r/GUI/ConfigWizard.cpp:1102
msgid "Custom profile name:"
-msgstr "Custom-profielnaam:"
+msgstr "Custom profielnaam:"
-#: src/slic3r/GUI/ConfigWizard.cpp:776
+#: src/slic3r/GUI/ConfigWizard.cpp:1127
msgid "Automatic updates"
msgstr "Automatische updates"
-#: src/slic3r/GUI/ConfigWizard.cpp:776
+#: src/slic3r/GUI/ConfigWizard.cpp:1127
msgid "Updates"
msgstr "Updates"
-#: src/slic3r/GUI/ConfigWizard.cpp:784 src/slic3r/GUI/Preferences.cpp:64
+#: src/slic3r/GUI/ConfigWizard.cpp:1135 src/slic3r/GUI/Preferences.cpp:94
msgid "Check for application updates"
msgstr "Controleer op programma-updates"
-#: src/slic3r/GUI/ConfigWizard.cpp:788
+#: src/slic3r/GUI/ConfigWizard.cpp:1139
#, c-format
msgid ""
"If enabled, %s checks for new application versions online. When a new "
@@ -699,16 +741,15 @@ msgid ""
"application startup (never during program usage). This is only a "
"notification mechanisms, no automatic installation is done."
msgstr ""
-"Als dit aan staat zal %s online checken op nieuwe programmaversies. Als er "
-"een nieuwe versie beschikbaar komt, zal een melding getoond worden bij de "
-"volgende keer opstarten (nooit tijdens gebruik van het programma). Dit is "
-"slechts een melding; er zal geen automatische installatie plaatsvinden."
+"%s controleert op nieuwe versie online als dit is geactiveerd. Als een "
+"nieuwe versie beschikbaar komt, wordt bij de volgende keer opstarten een "
+"melding getoond (nooit tijdens gebruik). Dit is slechts een melding."
-#: src/slic3r/GUI/ConfigWizard.cpp:794 src/slic3r/GUI/Preferences.cpp:80
+#: src/slic3r/GUI/ConfigWizard.cpp:1145 src/slic3r/GUI/Preferences.cpp:129
msgid "Update built-in Presets automatically"
-msgstr "Update ingebouwde presets automatisch"
+msgstr "Update ingebouwde voorinstellingen automatisch"
-#: src/slic3r/GUI/ConfigWizard.cpp:798
+#: src/slic3r/GUI/ConfigWizard.cpp:1149
#, c-format
msgid ""
"If enabled, %s downloads updates of built-in system presets in the "
@@ -716,56 +757,68 @@ msgid ""
"When a new preset version becomes available it is offered at application "
"startup."
msgstr ""
-"Als dit aan staat zal %s updates of ingebouwde systeem-presets op de "
-"achtergrond downloaden. Deze updates worden gedownload naar een tijdelijke "
-"locatie. Wanneer een nieuwe versie beschikbaar komt zal deze getoond worden "
-"bij het opstarten."
+"%s download updates op ingebouwde voorinstellingen in de achtergrond als dit "
+"is geactiveerd. De updates worden in een tijdelijke locatie opgeslagen. "
+"Wanneer een nieuwe voorinstelling beschikbaar komt, wordt een melding "
+"getoond tijdens het opstarten."
-#: src/slic3r/GUI/ConfigWizard.cpp:801
+#: src/slic3r/GUI/ConfigWizard.cpp:1152
msgid ""
"Updates are never applied without user's consent and never overwrite user's "
"customized settings."
msgstr ""
-"Updates worden nooit geïnstalleerd en overschreven zonder toestemming van de "
-"gebruiker."
+"Updates worden nooit toegepast zonder toestemming van de gebruiker en zullen "
+"nooit aangepaste instellingen overschrijven."
-#: src/slic3r/GUI/ConfigWizard.cpp:806
+#: src/slic3r/GUI/ConfigWizard.cpp:1157
msgid ""
"Additionally a backup snapshot of the whole configuration is created before "
"an update is applied."
msgstr ""
-"Voor een update wordt geïnstalleerd wordt daarnaast een backup-snapshot van "
-"de hele configuratie gemaakt."
+"Daarnaast wordt een backup-snapshot van de hele configuratie gemaakt voor "
+"een update wordt toegepast."
-#: src/slic3r/GUI/ConfigWizard.cpp:813 src/slic3r/GUI/GUI_ObjectList.cpp:1680
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3984 src/slic3r/GUI/Plater.cpp:3282
-#: src/slic3r/GUI/Plater.cpp:3986 src/slic3r/GUI/Plater.cpp:4015
+#: src/slic3r/GUI/ConfigWizard.cpp:1164 src/slic3r/GUI/GUI_ObjectList.cpp:1825
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4567 src/slic3r/GUI/Plater.cpp:3112
+#: src/slic3r/GUI/Plater.cpp:3953 src/slic3r/GUI/Plater.cpp:3984
msgid "Reload from disk"
-msgstr "Herlaad vanaf schijf"
+msgstr "Herlaad van schijf"
-#: src/slic3r/GUI/ConfigWizard.cpp:816
+#: src/slic3r/GUI/ConfigWizard.cpp:1167
msgid ""
"Export full pathnames of models and parts sources into 3mf and amf files"
msgstr ""
-"Exporteer hele padnamen van modellen en onderdelen in .3MF- en .AMF-bestanden"
+"Exporteer volledige padnaam van modellen en bronnen in 3MF en AMF bestanden"
-#: src/slic3r/GUI/ConfigWizard.cpp:820
+#: src/slic3r/GUI/ConfigWizard.cpp:1171
msgid ""
"If enabled, allows the Reload from disk command to automatically find and "
"load the files when invoked.\n"
"If not enabled, the Reload from disk command will ask to select each file "
"using an open file dialog."
msgstr ""
-"Als dit is ingeschakeld kan het 'Herladen van schijf'-commando automatisch "
-"bestanden vinden en laden wanneer deze worden opgevraagd.\n"
-"Als dit niet is ingeschakeld zal het commando vragen elk bestand te "
-"selecteren door een bestandsvenster te openen."
+"Sta toe om bestanden automatisch te vinden bij het herladen van de schijf "
+"als dit is geactiveerd.\n"
+"Als dit niet is geactiveerd vraagt het programma elke bestand apart te "
+"selecteren."
-#: src/slic3r/GUI/ConfigWizard.cpp:828
+#: src/slic3r/GUI/ConfigWizard.cpp:1181
+msgid "Files association"
+msgstr "Bestandsassociatie"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1183 src/slic3r/GUI/Preferences.cpp:112
+msgid "Associate .3mf files to PrusaSlicer"
+msgstr "Open .3mf-bestanden met PrusaSlicer"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1184 src/slic3r/GUI/Preferences.cpp:119
+msgid "Associate .stl files to PrusaSlicer"
+msgstr "Open .stl-bestanden met PrusaSlicer"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1195
msgid "View mode"
-msgstr "Weergavemodus"
+msgstr "Toon modus"
-#: src/slic3r/GUI/ConfigWizard.cpp:830
+#: src/slic3r/GUI/ConfigWizard.cpp:1197
msgid ""
"PrusaSlicer's user interfaces comes in three variants:\n"
"Simple, Advanced, and Expert.\n"
@@ -773,286 +826,309 @@ msgid ""
"regular 3D printing. The other two offer progressively more sophisticated "
"fine-tuning, they are suitable for advanced and expert users, respectively."
msgstr ""
-"De gebruikersinterface van PrusaSlicer kent drie varianten:\n"
+"De interface van PrusaSlicer kent drie varianten:\n"
"Eenvoudig, Geavanceerd en Expert.\n"
-"De eenvoudige modus laat alleen de meest gebruikte instellingen zien. De "
-"andere twee bieden meer geavanceerde finetuning. Ze zijn geschikt voor "
-"respectievelijk gevorderde en deskundige gebruikers."
+"De eenvoudige modus toont alleen de meest frequent gebruikte instellingen. "
+"De andere twee tonen meer geavanceerdere instellingen voor het fine-tunen. "
+"Ze zijn van toepassing voor respectievelijk experts en gevorderden."
-#: src/slic3r/GUI/ConfigWizard.cpp:835
+#: src/slic3r/GUI/ConfigWizard.cpp:1202
msgid "Simple mode"
msgstr "Eenvoudige modus"
-#: src/slic3r/GUI/ConfigWizard.cpp:836
+#: src/slic3r/GUI/ConfigWizard.cpp:1203
msgid "Advanced mode"
msgstr "Geavanceerde modus"
-#: src/slic3r/GUI/ConfigWizard.cpp:837
+#: src/slic3r/GUI/ConfigWizard.cpp:1204
msgid "Expert mode"
msgstr "Expertmodus"
-#: src/slic3r/GUI/ConfigWizard.cpp:871
+#: src/slic3r/GUI/ConfigWizard.cpp:1210
+msgid "The size of the object can be specified in inches"
+msgstr "De maten van het object kunnen worden ingesteld op inches"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1211
+msgid "Use inches"
+msgstr "Gebruik inches"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1245
msgid "Other Vendors"
msgstr "Overige leveranciers"
-#: src/slic3r/GUI/ConfigWizard.cpp:875
+#: src/slic3r/GUI/ConfigWizard.cpp:1249
#, c-format
msgid "Pick another vendor supported by %s"
msgstr "Kies een andere leverancier die ondersteund wordt door %s"
-#: src/slic3r/GUI/ConfigWizard.cpp:906
+#: src/slic3r/GUI/ConfigWizard.cpp:1280
msgid "Firmware Type"
msgstr "Firmwaretype"
-#: src/slic3r/GUI/ConfigWizard.cpp:906 src/slic3r/GUI/Tab.cpp:1969
+#: src/slic3r/GUI/ConfigWizard.cpp:1280 src/slic3r/GUI/Tab.cpp:2172
msgid "Firmware"
msgstr "Firmware"
-#: src/slic3r/GUI/ConfigWizard.cpp:910
+#: src/slic3r/GUI/ConfigWizard.cpp:1284
msgid "Choose the type of firmware used by your printer."
-msgstr "Kies het firmwaretype dat de printer gebruikt."
+msgstr "Kies het firmwaretype van de printer."
-#: src/slic3r/GUI/ConfigWizard.cpp:944
+#: src/slic3r/GUI/ConfigWizard.cpp:1318
msgid "Bed Shape and Size"
-msgstr "Grootte en vorm van het bed"
+msgstr "Bedvorm en -grootte"
-#: src/slic3r/GUI/ConfigWizard.cpp:947
+#: src/slic3r/GUI/ConfigWizard.cpp:1321
msgid "Set the shape of your printer's bed."
msgstr "Stel de vorm van het printbed in."
-#: src/slic3r/GUI/ConfigWizard.cpp:967
+#: src/slic3r/GUI/ConfigWizard.cpp:1341
msgid "Filament and Nozzle Diameters"
-msgstr "Filament- en nozzlediameters"
+msgstr "Filament en nozzle diameters"
-#: src/slic3r/GUI/ConfigWizard.cpp:967
+#: src/slic3r/GUI/ConfigWizard.cpp:1341
msgid "Print Diameters"
-msgstr "Printdiameters"
+msgstr "Printdiameter"
-#: src/slic3r/GUI/ConfigWizard.cpp:981
+#: src/slic3r/GUI/ConfigWizard.cpp:1355
msgid "Enter the diameter of your printer's hot end nozzle."
-msgstr "Voer de nozzlediameter in."
+msgstr "Voer de diameter van de nozzle in."
-#: src/slic3r/GUI/ConfigWizard.cpp:984
+#: src/slic3r/GUI/ConfigWizard.cpp:1358
msgid "Nozzle Diameter:"
msgstr "Nozzlediameter:"
-#: src/slic3r/GUI/ConfigWizard.cpp:994
+#: src/slic3r/GUI/ConfigWizard.cpp:1368
msgid "Enter the diameter of your filament."
-msgstr "Voer de filamentdiameter in."
+msgstr "Voer de diameter van het filament in."
-#: src/slic3r/GUI/ConfigWizard.cpp:995
+#: src/slic3r/GUI/ConfigWizard.cpp:1369
msgid ""
"Good precision is required, so use a caliper and do multiple measurements "
"along the filament, then compute the average."
msgstr ""
-"Nauwkeurigheid is belangrijk. Gebruik een schuifmaat en meet de diameter op "
-"meerdere plekken over de gehele rol. Bereken daarna het gemiddelde."
+"Goede nauwkeurigheid is van belang. Gebruik een schuifmaat en doe "
+"verschillende metingen op het filament. Bereken daarna het gemiddelde."
-#: src/slic3r/GUI/ConfigWizard.cpp:998
+#: src/slic3r/GUI/ConfigWizard.cpp:1372
msgid "Filament Diameter:"
msgstr "Filamentdiameter:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1032
-msgid "Extruder and Bed Temperatures"
-msgstr "Extruder- en bedtemperaturen"
+#: src/slic3r/GUI/ConfigWizard.cpp:1406
+msgid "Nozzle and Bed Temperatures"
+msgstr "Nozzle- en bedtemperaturen"
-#: src/slic3r/GUI/ConfigWizard.cpp:1032
+#: src/slic3r/GUI/ConfigWizard.cpp:1406
msgid "Temperatures"
msgstr "Temperaturen"
-#: src/slic3r/GUI/ConfigWizard.cpp:1048
+#: src/slic3r/GUI/ConfigWizard.cpp:1422
msgid "Enter the temperature needed for extruding your filament."
-msgstr "Voer de benodigde temperatuur in om het filament te extruderen."
+msgstr "Voer de temperatuur in die nodig is om filament te extruderen."
-#: src/slic3r/GUI/ConfigWizard.cpp:1049
+#: src/slic3r/GUI/ConfigWizard.cpp:1423
msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS."
-msgstr "Een vuistregel is 180 - 230 °C voor PLA en 220 - 260 °C voor ABS."
+msgstr "Een vuistregel is 180 tot 230 °C voor PLA en 230 tot 260 °C voor ABS."
-#: src/slic3r/GUI/ConfigWizard.cpp:1052
+#: src/slic3r/GUI/ConfigWizard.cpp:1426
msgid "Extrusion Temperature:"
msgstr "Extrusietemperatuur:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1053 src/slic3r/GUI/ConfigWizard.cpp:1067
+#: src/slic3r/GUI/ConfigWizard.cpp:1427 src/slic3r/GUI/ConfigWizard.cpp:1441
+#: src/libslic3r/PrintConfig.cpp:202 src/libslic3r/PrintConfig.cpp:950
+#: src/libslic3r/PrintConfig.cpp:994 src/libslic3r/PrintConfig.cpp:2294
msgid "°C"
msgstr "°C"
-#: src/slic3r/GUI/ConfigWizard.cpp:1062
+#: src/slic3r/GUI/ConfigWizard.cpp:1436
msgid ""
"Enter the bed temperature needed for getting your filament to stick to your "
"heated bed."
msgstr ""
-"Voer de temperatuur van het bed in om het filament goed te laten hechten aan "
-"het bed."
+"Voer de bedtemperatuur in die nodig is om filament aan het bed te laten "
+"hechten."
-#: src/slic3r/GUI/ConfigWizard.cpp:1063
+#: src/slic3r/GUI/ConfigWizard.cpp:1437
msgid ""
"A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have "
"no heated bed."
msgstr ""
-"Een vuistregel is 60 °C voor PLA en 110 °C voor ABS. Stel in op 0 als de "
-"printer geen verwarmd bed heeft."
+"Een vuistregel is 60 °C voor PLA en 110 °C voor ABS. Laat op 0 staan als er "
+"geen verwarmd bed is."
-#: src/slic3r/GUI/ConfigWizard.cpp:1066
+#: src/slic3r/GUI/ConfigWizard.cpp:1440
msgid "Bed Temperature:"
msgstr "Bedtemperatuur:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1486 src/slic3r/GUI/ConfigWizard.cpp:2028
+#: src/slic3r/GUI/ConfigWizard.cpp:1900 src/slic3r/GUI/ConfigWizard.cpp:2573
msgid "Filaments"
msgstr "Filamenten"
-#: src/slic3r/GUI/ConfigWizard.cpp:1486 src/slic3r/GUI/ConfigWizard.cpp:2030
+#: src/slic3r/GUI/ConfigWizard.cpp:1900 src/slic3r/GUI/ConfigWizard.cpp:2575
msgid "SLA Materials"
-msgstr "SLA-materialen"
+msgstr "SLA materialen"
-#: src/slic3r/GUI/ConfigWizard.cpp:1540
+#: src/slic3r/GUI/ConfigWizard.cpp:1954
msgid "FFF Technology Printers"
-msgstr "FFF-technologie printers"
+msgstr "FFF-printers"
-#: src/slic3r/GUI/ConfigWizard.cpp:1545
+#: src/slic3r/GUI/ConfigWizard.cpp:1959
msgid "SLA Technology Printers"
-msgstr "SLA-technologie printers"
+msgstr "SLA-printers"
-#: src/slic3r/GUI/ConfigWizard.cpp:1766 src/slic3r/GUI/DoubleSlider.cpp:1905
-#: src/slic3r/GUI/DoubleSlider.cpp:1926 src/slic3r/GUI/GUI.cpp:246
+#: src/slic3r/GUI/ConfigWizard.cpp:2265 src/slic3r/GUI/DoubleSlider.cpp:2245
+#: src/slic3r/GUI/DoubleSlider.cpp:2265 src/slic3r/GUI/GUI.cpp:244
msgid "Notice"
msgstr "Let op"
-#: src/slic3r/GUI/ConfigWizard.cpp:1775
-msgid "You have to select at least one filament for selected printers"
-msgstr "Selecteer tenminste één filament voor de geselecteerde printer(s)"
+#: src/slic3r/GUI/ConfigWizard.cpp:2286
+msgid "The following FFF printer models have no filament selected:"
+msgstr "Er is geen filament geselecteerd voor de volgende FFF-printers:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1776
-msgid "Do you want to automatic select default filaments?"
-msgstr "Wilt u automatisch de standaard filamenten selecteren?"
+#: src/slic3r/GUI/ConfigWizard.cpp:2290
+msgid "Do you want to select default filaments for these FFF printer models?"
+msgstr "Wil je standaardfilamenten selecteren voor deze FFF-printers?"
-#: src/slic3r/GUI/ConfigWizard.cpp:1786
-msgid "You have to select at least one material for selected printers"
-msgstr "Selecteer tenminste één materiaal voor de geselecteerde printer(s)"
+#: src/slic3r/GUI/ConfigWizard.cpp:2304
+msgid "The following SLA printer models have no materials selected:"
+msgstr "Er is geen materiaal geselecteerd voor de volgende SLA-printers:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1787
-msgid "Do you want to automatic select default materials?"
-msgstr "Wilt u automatisch de standaard materialen selecteren?"
+#: src/slic3r/GUI/ConfigWizard.cpp:2308
+msgid "Do you want to select default SLA materials for these printer models?"
+msgstr "Wil je standard SLA-materialen selecteren voor deze printers?"
-#: src/slic3r/GUI/ConfigWizard.cpp:1991
+#: src/slic3r/GUI/ConfigWizard.cpp:2536
msgid "Select all standard printers"
-msgstr "Selecteer alle standaard printers"
+msgstr "Select alle standaardprinters"
-#: src/slic3r/GUI/ConfigWizard.cpp:1994
+#: src/slic3r/GUI/ConfigWizard.cpp:2539
msgid "< &Back"
-msgstr "< Terug"
+msgstr "< &Terug"
-#: src/slic3r/GUI/ConfigWizard.cpp:1995
+#: src/slic3r/GUI/ConfigWizard.cpp:2540
msgid "&Next >"
-msgstr "Volgende >"
+msgstr "&Volgende >"
-#: src/slic3r/GUI/ConfigWizard.cpp:1996
+#: src/slic3r/GUI/ConfigWizard.cpp:2541
msgid "&Finish"
-msgstr "Voltooien"
+msgstr "&Voltooi"
-#: src/slic3r/GUI/ConfigWizard.cpp:1997 src/slic3r/GUI/FirmwareDialog.cpp:151
+#: src/slic3r/GUI/ConfigWizard.cpp:2542 src/slic3r/GUI/FirmwareDialog.cpp:151
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:248
#: src/slic3r/GUI/ProgressStatusBar.cpp:26
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:656
msgid "Cancel"
msgstr "Annuleren"
-#: src/slic3r/GUI/ConfigWizard.cpp:2010
+#: src/slic3r/GUI/ConfigWizard.cpp:2555
msgid "Prusa FFF Technology Printers"
-msgstr "Prusa FFF-technologie printers"
+msgstr "Prusa FFF-printers"
-#: src/slic3r/GUI/ConfigWizard.cpp:2013
+#: src/slic3r/GUI/ConfigWizard.cpp:2558
msgid "Prusa MSLA Technology Printers"
-msgstr "Prusa MSLA-technologie printers"
+msgstr "Prusa MSLA-printers"
-#: src/slic3r/GUI/ConfigWizard.cpp:2028
+#: src/slic3r/GUI/ConfigWizard.cpp:2573
msgid "Filament Profiles Selection"
-msgstr "Profielselectie voor filament"
+msgstr "Filament profielselectie"
-#: src/slic3r/GUI/ConfigWizard.cpp:2028 src/slic3r/GUI/GUI_ObjectList.cpp:3581
+#: src/slic3r/GUI/ConfigWizard.cpp:2573 src/slic3r/GUI/ConfigWizard.cpp:2575
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4144
msgid "Type:"
msgstr "Type:"
-#: src/slic3r/GUI/ConfigWizard.cpp:2030
+#: src/slic3r/GUI/ConfigWizard.cpp:2575
msgid "SLA Material Profiles Selection"
-msgstr "Profielselectie voor SLA materialen"
-
-#: src/slic3r/GUI/ConfigWizard.cpp:2030
-msgid "Layer height:"
-msgstr "Laagdikte:"
+msgstr "SLA-materiaal profielselectie"
-#: src/slic3r/GUI/ConfigWizard.cpp:2124
+#: src/slic3r/GUI/ConfigWizard.cpp:2678
msgid "Configuration Assistant"
msgstr "Configuratie-assistent"
-#: src/slic3r/GUI/ConfigWizard.cpp:2125
+#: src/slic3r/GUI/ConfigWizard.cpp:2679
msgid "Configuration &Assistant"
-msgstr "Configuratie-assistent"
+msgstr "Configuratie-&assistent"
-#: src/slic3r/GUI/ConfigWizard.cpp:2127
+#: src/slic3r/GUI/ConfigWizard.cpp:2681
msgid "Configuration Wizard"
-msgstr "Configuratiewizard"
+msgstr "Configuratie-assistent"
-#: src/slic3r/GUI/ConfigWizard.cpp:2128
+#: src/slic3r/GUI/ConfigWizard.cpp:2682
msgid "Configuration &Wizard"
-msgstr "Configuratiewizard"
+msgstr "Configuratie-&assistent"
-#: src/slic3r/GUI/DoubleSlider.cpp:79
+#: src/slic3r/GUI/DoubleSlider.cpp:97
msgid "Place bearings in slots and resume printing"
-msgstr "Plaats inserts in gaten en ga door met printen"
+msgstr "Plaats lagers in gleuven en ga door met printen"
-#: src/slic3r/GUI/DoubleSlider.cpp:950
+#: src/slic3r/GUI/DoubleSlider.cpp:1224
msgid "One layer mode"
-msgstr "Een-laagsmodus"
+msgstr "Enkele-laagsmodus"
-#: src/slic3r/GUI/DoubleSlider.cpp:952
+#: src/slic3r/GUI/DoubleSlider.cpp:1226
msgid "Discard all custom changes"
-msgstr "Alle aangepaste wijzigingen afwijzen"
+msgstr "Verwijder alle wijzigingen"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1230 src/slic3r/GUI/DoubleSlider.cpp:1995
+msgid "Jump to move"
+msgstr "Ga naar beweging"
-#: src/slic3r/GUI/DoubleSlider.cpp:955
+#: src/slic3r/GUI/DoubleSlider.cpp:1233
#, c-format
-msgid "Jump to height %s or Set extruder sequence for the entire print"
-msgstr "Ga naar hoogte %s of stel extrudervolgorde voor de hele print in"
+msgid ""
+"Jump to height %s\n"
+"Set ruler mode\n"
+"or Set extruder sequence for the entire print"
+msgstr ""
+"Ga naar hoogte %s\n"
+"Stel meetlintmodus in\n"
+"of stel extrudervolgorde in voor de gehele print"
-#: src/slic3r/GUI/DoubleSlider.cpp:957 src/slic3r/GUI/DoubleSlider.cpp:1529
-#: src/slic3r/GUI/DoubleSlider.cpp:1651
-msgid "Jump to height"
-msgstr "Ga naar hoogte"
+#: src/slic3r/GUI/DoubleSlider.cpp:1236
+#, c-format
+msgid ""
+"Jump to height %s\n"
+"or Set ruler mode"
+msgstr ""
+"Ga naar hoogte %s\n"
+"of stel meetlintmodus in"
-#: src/slic3r/GUI/DoubleSlider.cpp:960
+#: src/slic3r/GUI/DoubleSlider.cpp:1241
msgid "Edit current color - Right click the colored slider segment"
-msgstr "Wijzig huidige kleur; klik op het gekleurde segment"
+msgstr "Bewerk huidige kleur - rechtermuisklik op het gekleurde schuifsegment"
-#: src/slic3r/GUI/DoubleSlider.cpp:970
+#: src/slic3r/GUI/DoubleSlider.cpp:1251
msgid "Print mode"
msgstr "Printmodus"
-#: src/slic3r/GUI/DoubleSlider.cpp:984
+#: src/slic3r/GUI/DoubleSlider.cpp:1265
msgid "Add extruder change - Left click"
-msgstr "Voeg extruderwissel toe; linkermuisknop"
+msgstr "Voeg extruderwissel toe - linkermuisklik"
-#: src/slic3r/GUI/DoubleSlider.cpp:986
+#: src/slic3r/GUI/DoubleSlider.cpp:1267
msgid ""
"Add color change - Left click for predefined color or Shift + Left click for "
"custom color selection"
msgstr ""
-"Voeg kleurwissel toe; linkermuisknop voor ingestelde kleur of SHIFT + "
-"linkermuisknop voor custom kleurselectie"
+"Kleurwissel toevoegen: linkermuisklik voor ingestelde kleur, of shift + "
+"linkermuisklik voor custom kleurselectie"
-#: src/slic3r/GUI/DoubleSlider.cpp:988
+#: src/slic3r/GUI/DoubleSlider.cpp:1269
msgid "Add color change - Left click"
-msgstr "Voeg kleurwissel toe; linkermuisknop"
+msgstr "Kleurwissel toevoegen: linkermuisklik"
-#: src/slic3r/GUI/DoubleSlider.cpp:989
+#: src/slic3r/GUI/DoubleSlider.cpp:1270
msgid "or press \"+\" key"
-msgstr "of druk op de '+'-toets"
+msgstr "of druk op de \"+\"-toets"
-#: src/slic3r/GUI/DoubleSlider.cpp:991
+#: src/slic3r/GUI/DoubleSlider.cpp:1272
msgid "Add another code - Ctrl + Left click"
-msgstr "Voeg nog een code toe; CTRL + linkermuisknop"
+msgstr "Voeg nog een code toe: Ctrl + linkermuisklik"
-#: src/slic3r/GUI/DoubleSlider.cpp:992
+#: src/slic3r/GUI/DoubleSlider.cpp:1273
msgid "Add another code - Right click"
-msgstr "Voeg nog een code toe; rechtermuisknop"
+msgstr "Voeg nog een code toe: rechtermuisklik"
-#: src/slic3r/GUI/DoubleSlider.cpp:998
+#: src/slic3r/GUI/DoubleSlider.cpp:1279
msgid ""
"The sequential print is on.\n"
"It's impossible to apply any custom G-code for objects printing "
@@ -1064,36 +1140,40 @@ msgstr ""
"achtereenvolgens printen.\n"
"Deze code wordt niet uitgevoerd bij de generatie van de G-code."
-#: src/slic3r/GUI/DoubleSlider.cpp:1005
+#: src/slic3r/GUI/DoubleSlider.cpp:1288
msgid "Color change (\"%1%\")"
msgstr "Kleurwissel (%1%)"
-#: src/slic3r/GUI/DoubleSlider.cpp:1006
+#: src/slic3r/GUI/DoubleSlider.cpp:1289
msgid "Color change (\"%1%\") for Extruder %2%"
msgstr "Kleurwissel (%1%) voor extruder %2%"
-#: src/slic3r/GUI/DoubleSlider.cpp:1009
+#: src/slic3r/GUI/DoubleSlider.cpp:1291
msgid "Pause print (\"%1%\")"
msgstr "Pauzeer print (%1%)"
-#: src/slic3r/GUI/DoubleSlider.cpp:1011
+#: src/slic3r/GUI/DoubleSlider.cpp:1293
+msgid "Custom template (\"%1%\")"
+msgstr "Custom template (\"%1%\")"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1295
msgid "Extruder (tool) is changed to Extruder \"%1%\""
msgstr "Extruder (tool) is veranderd naar extruder %1%"
-#: src/slic3r/GUI/DoubleSlider.cpp:1019
+#: src/slic3r/GUI/DoubleSlider.cpp:1302
msgid "Note"
msgstr "Let op"
-#: src/slic3r/GUI/DoubleSlider.cpp:1021
+#: src/slic3r/GUI/DoubleSlider.cpp:1304
msgid ""
"G-code associated to this tick mark is in a conflict with print mode.\n"
"Editing it will cause changes of Slider data."
msgstr ""
"De G-code die is gekoppeld aan deze markering is in strijd met de "
"printmodus.\n"
-"Dit aanpassen zal de gegevens van de schuif ook aanpassen."
+"Dit aanpassen zal de gegevens van de schuif ook wijzigen."
-#: src/slic3r/GUI/DoubleSlider.cpp:1024
+#: src/slic3r/GUI/DoubleSlider.cpp:1307
msgid ""
"There is a color change for extruder that won't be used till the end of "
"print job.\n"
@@ -1103,7 +1183,7 @@ msgstr ""
"van de print.\n"
"Deze code wordt niet toegevoegd bij de generatie van de G-code."
-#: src/slic3r/GUI/DoubleSlider.cpp:1027
+#: src/slic3r/GUI/DoubleSlider.cpp:1310
msgid ""
"There is an extruder change set to the same extruder.\n"
"This code won't be processed during G-code generation."
@@ -1111,7 +1191,7 @@ msgstr ""
"Er is een extruderwissel naar dezelfde extruder ingesteld.\n"
"Deze code wordt niet toegevoegd bij de generatie van de G-code."
-#: src/slic3r/GUI/DoubleSlider.cpp:1030
+#: src/slic3r/GUI/DoubleSlider.cpp:1313
msgid ""
"There is a color change for extruder that has not been used before.\n"
"Check your settings to avoid redundant color changes."
@@ -1119,157 +1199,196 @@ msgstr ""
"Er is een kleurwissel voor een extruder die niet eerder gebruikt is.\n"
"Controleer de instellingen om overbodige kleurwisselingen te voorkomen."
-#: src/slic3r/GUI/DoubleSlider.cpp:1035
+#: src/slic3r/GUI/DoubleSlider.cpp:1318
msgid "Delete tick mark - Left click or press \"-\" key"
msgstr "Verwijder markering; linkermuisknop of druk op de '-'-knop"
-#: src/slic3r/GUI/DoubleSlider.cpp:1037
+#: src/slic3r/GUI/DoubleSlider.cpp:1320
msgid "Edit tick mark - Ctrl + Left click"
msgstr "Bewerk markering; CTRL + linkermuisknop"
-#: src/slic3r/GUI/DoubleSlider.cpp:1038
+#: src/slic3r/GUI/DoubleSlider.cpp:1321
msgid "Edit tick mark - Right click"
msgstr "Bewerk markering; rechtermuisknop"
-#: src/slic3r/GUI/DoubleSlider.cpp:1134 src/slic3r/GUI/DoubleSlider.cpp:1170
-#: src/slic3r/GUI/GLCanvas3D.cpp:977 src/slic3r/GUI/GUI_ObjectList.cpp:1720
-#: src/slic3r/GUI/Tab.cpp:2304 src/libslic3r/GCode/PreviewData.cpp:445
+#: src/slic3r/GUI/DoubleSlider.cpp:1417 src/slic3r/GUI/DoubleSlider.cpp:1451
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1864
#, c-format
msgid "Extruder %d"
msgstr "Extruder %d"
-#: src/slic3r/GUI/DoubleSlider.cpp:1135 src/slic3r/GUI/GUI_ObjectList.cpp:1721
+#: src/slic3r/GUI/DoubleSlider.cpp:1418 src/slic3r/GUI/GUI_ObjectList.cpp:1865
msgid "active"
msgstr "actief"
-#: src/slic3r/GUI/DoubleSlider.cpp:1144
+#: src/slic3r/GUI/DoubleSlider.cpp:1427
msgid "Switch code to Change extruder"
msgstr "Code om van extruder te wisselen"
-#: src/slic3r/GUI/DoubleSlider.cpp:1144 src/slic3r/GUI/GUI_ObjectList.cpp:1687
+#: src/slic3r/GUI/DoubleSlider.cpp:1427 src/slic3r/GUI/GUI_ObjectList.cpp:1832
msgid "Change extruder"
msgstr "Wissel extruder"
-#: src/slic3r/GUI/DoubleSlider.cpp:1145
+#: src/slic3r/GUI/DoubleSlider.cpp:1428
msgid "Change extruder (N/A)"
msgstr "Wissel extruder (n.v.t.)"
-#: src/slic3r/GUI/DoubleSlider.cpp:1147
+#: src/slic3r/GUI/DoubleSlider.cpp:1430
msgid "Use another extruder"
msgstr "Gebruik een andere extruder"
-#: src/slic3r/GUI/DoubleSlider.cpp:1171
+#: src/slic3r/GUI/DoubleSlider.cpp:1452
msgid "used"
msgstr "gebruikt"
-#: src/slic3r/GUI/DoubleSlider.cpp:1179
+#: src/slic3r/GUI/DoubleSlider.cpp:1460
msgid "Switch code to Color change (%1%) for:"
msgstr "Code om naar kleur %1% te wisselen voor:"
-#: src/slic3r/GUI/DoubleSlider.cpp:1180
+#: src/slic3r/GUI/DoubleSlider.cpp:1461
msgid "Add color change (%1%) for:"
-msgstr "Voeg kleurwissel (%1%) toe voor:"
+msgstr "Kleurwissel (%1%) toevoegen voor:"
-#: src/slic3r/GUI/DoubleSlider.cpp:1477
+#: src/slic3r/GUI/DoubleSlider.cpp:1797
msgid "Add color change"
-msgstr "Voeg kleurwissel toe"
+msgstr "Kleurwissel toevoegen"
-#: src/slic3r/GUI/DoubleSlider.cpp:1487
+#: src/slic3r/GUI/DoubleSlider.cpp:1808
msgid "Add pause print"
msgstr "Voeg printpauze toe"
-#: src/slic3r/GUI/DoubleSlider.cpp:1490
+#: src/slic3r/GUI/DoubleSlider.cpp:1812
+msgid "Add custom template"
+msgstr "Voeg aangepaste template toe"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1815
msgid "Add custom G-code"
-msgstr "Voeg custom G-code toe"
+msgstr "Custom G-code toevoegen"
-#: src/slic3r/GUI/DoubleSlider.cpp:1508
+#: src/slic3r/GUI/DoubleSlider.cpp:1833
msgid "Edit color"
msgstr "Bewerk kleur"
-#: src/slic3r/GUI/DoubleSlider.cpp:1509
+#: src/slic3r/GUI/DoubleSlider.cpp:1834
msgid "Edit pause print message"
msgstr "Bewerk printpauze-bericht"
-#: src/slic3r/GUI/DoubleSlider.cpp:1510
+#: src/slic3r/GUI/DoubleSlider.cpp:1835
msgid "Edit custom G-code"
msgstr "Bewerk custom G-code"
-#: src/slic3r/GUI/DoubleSlider.cpp:1516
+#: src/slic3r/GUI/DoubleSlider.cpp:1841
msgid "Delete color change"
msgstr "Verwijder kleurwissel"
-#: src/slic3r/GUI/DoubleSlider.cpp:1517
+#: src/slic3r/GUI/DoubleSlider.cpp:1842
msgid "Delete tool change"
msgstr "Verwijder toolwissel"
-#: src/slic3r/GUI/DoubleSlider.cpp:1518
+#: src/slic3r/GUI/DoubleSlider.cpp:1843
msgid "Delete pause print"
msgstr "Verwijder printpauze"
-#: src/slic3r/GUI/DoubleSlider.cpp:1519
+#: src/slic3r/GUI/DoubleSlider.cpp:1844
msgid "Delete custom G-code"
msgstr "Verwijder custom G-code"
-#: src/slic3r/GUI/DoubleSlider.cpp:1532
+#: src/slic3r/GUI/DoubleSlider.cpp:1854 src/slic3r/GUI/DoubleSlider.cpp:1995
+msgid "Jump to height"
+msgstr "Ga naar hoogte"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1859
+msgid "Hide ruler"
+msgstr "Verberg meetlint"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1863
+msgid "Show object height"
+msgstr "Toon objecthoogte"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1863
+msgid "Show object height on the ruler"
+msgstr "Toon objecthoogte op het meetlint"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1867
+msgid "Show estimated print time"
+msgstr "Toon geschatte printtijd"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1867
+msgid "Show estimated print time on the ruler"
+msgstr "Toon geschatte printtijd op het meetlint"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1871
+msgid "Ruler mode"
+msgstr "Meetlintmodus"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1871
+msgid "Set ruler mode"
+msgstr "Stel meetlintmodus in"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1876
msgid "Set extruder sequence for the entire print"
msgstr "Stel extrudervolgorde in voor de hele print"
-#: src/slic3r/GUI/DoubleSlider.cpp:1618
+#: src/slic3r/GUI/DoubleSlider.cpp:1962
msgid "Enter custom G-code used on current layer"
msgstr "Voer custom G-code in voor de huidige laag"
-#: src/slic3r/GUI/DoubleSlider.cpp:1619
+#: src/slic3r/GUI/DoubleSlider.cpp:1963
msgid "Custom G-code on current layer (%1% mm)."
msgstr "Custom G-code voor huidige laag (%1% mm)."
-#: src/slic3r/GUI/DoubleSlider.cpp:1634
+#: src/slic3r/GUI/DoubleSlider.cpp:1978
msgid "Enter short message shown on Printer display when a print is paused"
msgstr ""
"Voer een kort bericht in om te tonen op het printscherm tijdens een pauze"
-#: src/slic3r/GUI/DoubleSlider.cpp:1635
+#: src/slic3r/GUI/DoubleSlider.cpp:1979
msgid "Message for pause print on current layer (%1% mm)."
msgstr "Kort bericht voor printpauze bij huidige laag (%1% mm)."
-#: src/slic3r/GUI/DoubleSlider.cpp:1650
+#: src/slic3r/GUI/DoubleSlider.cpp:1994
+msgid "Enter the move you want to jump to"
+msgstr "Voer de beweging in waar je naartoe wil"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1994
msgid "Enter the height you want to jump to"
-msgstr "Voer de hoogte in waar u naartoe wilt"
+msgstr "Voer de hoogte in waar je naartoe wil"
-#: src/slic3r/GUI/DoubleSlider.cpp:1899
+#: src/slic3r/GUI/DoubleSlider.cpp:2239
msgid "The last color change data was saved for a single extruder printing."
msgstr ""
"De laatste gegevens van de kleurwissel zijn opgeslagen voor enkel-"
"extruderprinters."
-#: src/slic3r/GUI/DoubleSlider.cpp:1900 src/slic3r/GUI/DoubleSlider.cpp:1916
+#: src/slic3r/GUI/DoubleSlider.cpp:2240 src/slic3r/GUI/DoubleSlider.cpp:2255
msgid "The last color change data was saved for a multi extruder printing."
msgstr ""
"De laatste gegevens van de kleurwissel zijn opgeslagen voor een multi-"
"extruderprinter."
-#: src/slic3r/GUI/DoubleSlider.cpp:1902
+#: src/slic3r/GUI/DoubleSlider.cpp:2242
msgid "Your current changes will delete all saved color changes."
msgstr "De huidige wijzigingen zullen alle kleurwisselingen verwijderen."
-#: src/slic3r/GUI/DoubleSlider.cpp:1903 src/slic3r/GUI/DoubleSlider.cpp:1924
+#: src/slic3r/GUI/DoubleSlider.cpp:2243 src/slic3r/GUI/DoubleSlider.cpp:2263
msgid "Are you sure you want to continue?"
-msgstr "Weet u zeker dat u wilt doorgaan?"
+msgstr "Weet je zeker dat je wil doorgaan?"
-#: src/slic3r/GUI/DoubleSlider.cpp:1917
+#: src/slic3r/GUI/DoubleSlider.cpp:2256
msgid ""
"Select YES if you want to delete all saved tool changes, \n"
"NO if you want all tool changes switch to color changes, \n"
"or CANCEL to leave it unchanged."
msgstr ""
-"Selecteer JA als u alle toolwisselingen wil opslaan,\n"
-"of NEE als u alle toolwisselingen wilt veranderen in kleurwisselingen\n"
+"Selecteer JA als je alle toolwisselingen wil opslaan,\n"
+"of NEE als je alle toolwisselingen wil veranderen in kleurwisselingen\n"
"of klik op annuleren om wijzingen ongedaan te maken."
-#: src/slic3r/GUI/DoubleSlider.cpp:1920
+#: src/slic3r/GUI/DoubleSlider.cpp:2259
msgid "Do you want to delete all saved tool changes?"
-msgstr "Wilt u alle opgeslagen toolwisselingen verwijderen?"
+msgstr "Wil je alle opgeslagen toolwisselingen verwijderen?"
-#: src/slic3r/GUI/DoubleSlider.cpp:1922
+#: src/slic3r/GUI/DoubleSlider.cpp:2261
msgid ""
"The last color change data was saved for a multi extruder printing with tool "
"changes for whole print."
@@ -1277,67 +1396,94 @@ msgstr ""
"De laatste gegevens van de kleurwisseling zijn opgeslagen voor een multi-"
"extruderprinter met toolwisselingen voor de hele print."
-#: src/slic3r/GUI/DoubleSlider.cpp:1923
+#: src/slic3r/GUI/DoubleSlider.cpp:2262
msgid "Your current changes will delete all saved extruder (tool) changes."
msgstr ""
"De huidige wijzigingen worden verwijderd voor alle extruder "
"(tool)wisselingen."
-#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:23
+#: src/slic3r/GUI/ExtraRenderers.cpp:297 src/slic3r/GUI/GUI_ObjectList.cpp:512
+#: src/slic3r/GUI/GUI_ObjectList.cpp:524 src/slic3r/GUI/GUI_ObjectList.cpp:1033
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4582
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4592
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4627
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:209
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:266
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:291
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:499 src/libslic3r/PrintConfig.cpp:552
+msgid "default"
+msgstr "standaard"
+
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:24
msgid "Set extruder sequence"
msgstr "Stel extrudervolgorde in"
-#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:39
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:40
msgid "Set extruder change for every"
msgstr "Stel toolwissel in voor elke"
-#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:52
-#: src/libslic3r/PrintConfig.cpp:362 src/libslic3r/PrintConfig.cpp:994
-#: src/libslic3r/PrintConfig.cpp:1505 src/libslic3r/PrintConfig.cpp:1690
-#: src/libslic3r/PrintConfig.cpp:1750 src/libslic3r/PrintConfig.cpp:1930
-#: src/libslic3r/PrintConfig.cpp:1976
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:53
+#: src/libslic3r/PrintConfig.cpp:418 src/libslic3r/PrintConfig.cpp:1089
+#: src/libslic3r/PrintConfig.cpp:1718 src/libslic3r/PrintConfig.cpp:1883
+#: src/libslic3r/PrintConfig.cpp:1950 src/libslic3r/PrintConfig.cpp:2157
+#: src/libslic3r/PrintConfig.cpp:2203
msgid "layers"
msgstr "lagen"
-#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:136
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:137
msgid "Set extruder(tool) sequence"
msgstr "Stel toolvolgorde in"
-#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:182
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:183
msgid "Remove extruder from sequence"
msgstr "Verwijder extruder uit de reeks"
-#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:192
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:193
msgid "Add extruder to sequence"
msgstr "Voeg extruder toe aan de reeks"
-#: src/slic3r/GUI/Field.cpp:136
+#: src/slic3r/GUI/Field.cpp:197
msgid "default value"
msgstr "standaardwaarde"
-#: src/slic3r/GUI/Field.cpp:139
+#: src/slic3r/GUI/Field.cpp:200
msgid "parameter name"
msgstr "parameternaam"
-#: src/slic3r/GUI/Field.cpp:150 src/slic3r/GUI/OptionsGroup.cpp:598
+#: src/slic3r/GUI/Field.cpp:211 src/slic3r/GUI/OptionsGroup.cpp:781
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:886
msgid "N/A"
msgstr "n.v.t."
-#: src/slic3r/GUI/Field.cpp:175
+#: src/slic3r/GUI/Field.cpp:233
#, c-format
msgid "%s doesn't support percentage"
msgstr "%s ondersteunt geen percentage"
-#: src/slic3r/GUI/Field.cpp:195 src/slic3r/GUI/Field.cpp:226
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:380
+#: src/slic3r/GUI/Field.cpp:253 src/slic3r/GUI/Field.cpp:303
+#: src/slic3r/GUI/Field.cpp:1510 src/slic3r/GUI/GUI_ObjectLayers.cpp:413
msgid "Invalid numeric input."
msgstr "Ongeldige numerieke invoer."
-#: src/slic3r/GUI/Field.cpp:204
+#: src/slic3r/GUI/Field.cpp:269
+#, c-format
+msgid ""
+"Input value is out of range\n"
+"Are you sure that %s is a correct value and that you want to continue?"
+msgstr ""
+"Invoerwaarde is buiten bereik\n"
+"Weet je zeker dat %s is een correcte waarde en dat je hiermee door wil gaan?"
+
+#: src/slic3r/GUI/Field.cpp:271 src/slic3r/GUI/Field.cpp:322
+msgid "Parameter validation"
+msgstr "Parametervalidatie"
+
+#: src/slic3r/GUI/Field.cpp:277 src/slic3r/GUI/Field.cpp:369
+#: src/slic3r/GUI/Field.cpp:1522
msgid "Input value is out of range"
msgstr "Ingevoerde waarde valt buiten het bereik"
-#: src/slic3r/GUI/Field.cpp:240
+#: src/slic3r/GUI/Field.cpp:319
#, c-format
msgid ""
"Do you mean %s%% instead of %s %s?\n"
@@ -1348,9 +1494,13 @@ msgstr ""
"Selecteer JA als de waarden aangepast moeten worden naar %s%%\n"
"of NEE als %s %s is de juiste waarde."
-#: src/slic3r/GUI/Field.cpp:243
-msgid "Parameter validation"
-msgstr "Parametervalidatie"
+#: src/slic3r/GUI/Field.cpp:377
+msgid ""
+"Invalid input format. Expected vector of dimensions in the following format: "
+"\"%1%\""
+msgstr ""
+"Ongeldige invoer. De verwachte invoer van afmetingen moet volgens het "
+"volgende formaat: \"%1%\""
#: src/slic3r/GUI/FirmwareDialog.cpp:150
msgid "Flash!"
@@ -1390,8 +1540,8 @@ msgstr ""
"Het HEX-bestand is bedoeld voor: %s\n"
"Geïdentificeerde printer: %s\n"
"\n"
-"Weet u zeker dat u door wilt gaan met dit HEX-bestand?\n"
-"Ga alleen door als u zeker weet dat dit juist is."
+"Weet je zeker dat je door wil gaan met dit HEX-bestand?\n"
+"Ga alleen door als je zeker weet dat dit juist is."
#: src/slic3r/GUI/FirmwareDialog.cpp:419 src/slic3r/GUI/FirmwareDialog.cpp:454
#, c-format
@@ -1434,8 +1584,9 @@ msgstr "Firmwareflasher"
msgid "Firmware image:"
msgstr "Firmwarebestand:"
-#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1705
-#: src/slic3r/GUI/Tab.cpp:1767
+#: src/slic3r/GUI/FirmwareDialog.cpp:805
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:289
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364
msgid "Browse"
msgstr "Zoek"
@@ -1468,8 +1619,8 @@ msgid "Advanced: Output log"
msgstr "Geavanceerd: Output logboek"
#: src/slic3r/GUI/FirmwareDialog.cpp:852
-#: src/slic3r/GUI/Mouse3DController.cpp:336
-#: src/slic3r/GUI/PrintHostDialogs.cpp:161
+#: src/slic3r/GUI/Mouse3DController.cpp:551
+#: src/slic3r/GUI/PrintHostDialogs.cpp:189
msgid "Close"
msgstr "Sluit"
@@ -1478,7 +1629,7 @@ msgid ""
"Are you sure you want to cancel firmware flashing?\n"
"This could leave your printer in an unusable state!"
msgstr ""
-"Weet u zeker dat u het firmware flashen wilt stoppen?\n"
+"Weet je zeker dat je het firmware flashen wil stoppen?\n"
"Dit kan er voor zorgen dat de printer onbruikbaar wordt!"
#: src/slic3r/GUI/FirmwareDialog.cpp:903
@@ -1489,11 +1640,226 @@ msgstr "Bevestiging"
msgid "Cancelling..."
msgstr "Annuleren..."
-#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/slic3r/GUI/GLCanvas3D.cpp:4572
+#: src/slic3r/GUI/GCodeViewer.cpp:239
+msgid "Tool position"
+msgstr "Toolpositie"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:1010
+msgid "Generating toolpaths"
+msgstr "Toolpaden genereren"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:1399
+msgid "Generating vertex buffer"
+msgstr "Vertex buffer genereren"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:1490
+msgid "Generating index buffers"
+msgstr "Index buffers genereren"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2219
+msgid "Click to hide"
+msgstr "Klik om te verbergen"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2219
+msgid "Click to show"
+msgstr "Klik om te tonen"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2331
+msgid "up to"
+msgstr "tot op"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2337
+msgid "above"
+msgstr "boven"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2345
+msgid "from"
+msgstr "vanaf"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2345
+msgid "to"
+msgstr "naar"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2373 src/slic3r/GUI/GCodeViewer.cpp:2381
+#: src/slic3r/GUI/GUI_Preview.cpp:214 src/slic3r/GUI/GUI_Preview.cpp:533
+#: src/slic3r/GUI/GUI_Preview.cpp:942
+msgid "Feature type"
+msgstr "Type optie"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2373 src/slic3r/GUI/GCodeViewer.cpp:2381
+#: src/slic3r/GUI/RammingChart.cpp:76
+msgid "Time"
+msgstr "Tijd"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2381
+msgid "Percentage"
+msgstr "Percentage"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2384
+msgid "Height (mm)"
+msgstr "Hoogte (mm)"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2385
+msgid "Width (mm)"
+msgstr "Breedte (mm)"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2386
+msgid "Speed (mm/s)"
+msgstr "Snelheid (mm/s)"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2387
+msgid "Fan Speed (%)"
+msgstr "Ventilatorsnelheid (%)"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2388
+msgid "Volumetric flow rate (mm³/s)"
+msgstr "Volumetrisch debiet (mm³/s)"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2389 src/slic3r/GUI/GUI_Preview.cpp:220
+#: src/slic3r/GUI/GUI_Preview.cpp:326 src/slic3r/GUI/GUI_Preview.cpp:471
+#: src/slic3r/GUI/GUI_Preview.cpp:532 src/slic3r/GUI/GUI_Preview.cpp:878
+#: src/slic3r/GUI/GUI_Preview.cpp:942
+msgid "Tool"
+msgstr "Tool"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2390 src/slic3r/GUI/GUI_Preview.cpp:221
+#: src/slic3r/GUI/GUI_Preview.cpp:530 src/slic3r/GUI/GUI_Preview.cpp:941
+msgid "Color Print"
+msgstr "Kleurenprint"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2426 src/slic3r/GUI/GCodeViewer.cpp:2461
+#: src/slic3r/GUI/GCodeViewer.cpp:2466 src/slic3r/GUI/GUI_ObjectList.cpp:312
+#: src/slic3r/GUI/wxExtensions.cpp:519 src/libslic3r/PrintConfig.cpp:547
+msgid "Extruder"
+msgstr "Extruder"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2437
+msgid "Default color"
+msgstr "Basiskleur"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2461
+msgid "default color"
+msgstr "basiskleur"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2556 src/slic3r/GUI/GCodeViewer.cpp:2602
+msgid "Color change"
+msgstr "Kleurwissel"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2575 src/slic3r/GUI/GCodeViewer.cpp:2600
+msgid "Print"
+msgstr "Print"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2601 src/slic3r/GUI/GCodeViewer.cpp:2618
+msgid "Pause"
+msgstr "Pauzeer"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2606 src/slic3r/GUI/GCodeViewer.cpp:2609
+msgid "Event"
+msgstr "Gebeurtenis"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2606 src/slic3r/GUI/GCodeViewer.cpp:2609
+msgid "Remaining time"
+msgstr "Resterende tijd"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2609
+msgid "Duration"
+msgstr "Duur"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2644 src/slic3r/GUI/GUI_Preview.cpp:1023
+#: src/libslic3r/PrintConfig.cpp:2380
+msgid "Travel"
+msgstr "Beweging"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2647
+msgid "Movement"
+msgstr "Beweging"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2648
+msgid "Extrusion"
+msgstr "Extrusie"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2649 src/slic3r/GUI/Tab.cpp:1694
+#: src/slic3r/GUI/Tab.cpp:2582
+msgid "Retraction"
+msgstr "Retractie"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2666 src/slic3r/GUI/GCodeViewer.cpp:2669
+#: src/slic3r/GUI/GUI_Preview.cpp:1024
+msgid "Wipe"
+msgstr "Afvegen"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2700 src/slic3r/GUI/GUI_Preview.cpp:248
+#: src/slic3r/GUI/GUI_Preview.cpp:262
+msgid "Options"
+msgstr "Opties"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2703 src/slic3r/GUI/GUI_Preview.cpp:1025
+msgid "Retractions"
+msgstr "Retracties"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2704 src/slic3r/GUI/GUI_Preview.cpp:1026
+msgid "Deretractions"
+msgstr "Deretracties"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2705 src/slic3r/GUI/GUI_Preview.cpp:1027
+msgid "Tool changes"
+msgstr "Toolwisselingen"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2706 src/slic3r/GUI/GUI_Preview.cpp:1028
+msgid "Color changes"
+msgstr "Kleurwissels"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2707 src/slic3r/GUI/GUI_Preview.cpp:1029
+msgid "Print pauses"
+msgstr "Printpauzes"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2708 src/slic3r/GUI/GUI_Preview.cpp:1030
+msgid "Custom G-codes"
+msgstr "Custom G-code"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2719 src/slic3r/GUI/GCodeViewer.cpp:2743
+#: src/slic3r/GUI/Plater.cpp:697 src/libslic3r/PrintConfig.cpp:117
+msgid "Printer"
+msgstr "Printer"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2721 src/slic3r/GUI/GCodeViewer.cpp:2748
+#: src/slic3r/GUI/Plater.cpp:693
+msgid "Print settings"
+msgstr "Printinstellingen"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2724 src/slic3r/GUI/GCodeViewer.cpp:2754
+#: src/slic3r/GUI/Plater.cpp:694 src/slic3r/GUI/Tab.cpp:1794
+#: src/slic3r/GUI/Tab.cpp:1795
+msgid "Filament"
+msgstr "Filament"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2779 src/slic3r/GUI/GCodeViewer.cpp:2784
+#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1135
+#: src/slic3r/GUI/Plater.cpp:1220
+msgid "Estimated printing time"
+msgstr "Geschatte printtijd"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2779
+msgid "Normal mode"
+msgstr "Normale modus"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2784
+msgid "Stealth mode"
+msgstr "Stille modus"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2811
+msgid "Show stealth mode"
+msgstr "Toon stille modus"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2815
+msgid "Show normal mode"
+msgstr "Toon normale modus"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:236 src/slic3r/GUI/GLCanvas3D.cpp:4567
msgid "Variable layer height"
msgstr "Variabele laagdikte"
-#: src/slic3r/GUI/GLCanvas3D.cpp:237
+#: src/slic3r/GUI/GLCanvas3D.cpp:238
msgid "Left mouse button:"
msgstr "Linkermuisknop:"
@@ -1501,306 +1867,437 @@ msgstr "Linkermuisknop:"
msgid "Add detail"
msgstr "Voeg detail toe"
-#: src/slic3r/GUI/GLCanvas3D.cpp:243
+#: src/slic3r/GUI/GLCanvas3D.cpp:242
msgid "Right mouse button:"
msgstr "Rechtermuisknop:"
-#: src/slic3r/GUI/GLCanvas3D.cpp:246
+#: src/slic3r/GUI/GLCanvas3D.cpp:244
msgid "Remove detail"
msgstr "Verwijder detail"
-#: src/slic3r/GUI/GLCanvas3D.cpp:249
+#: src/slic3r/GUI/GLCanvas3D.cpp:246
msgid "Shift + Left mouse button:"
msgstr "Shift + linkermuisknop:"
-#: src/slic3r/GUI/GLCanvas3D.cpp:252
+#: src/slic3r/GUI/GLCanvas3D.cpp:248
msgid "Reset to base"
msgstr "Reset"
-#: src/slic3r/GUI/GLCanvas3D.cpp:255
+#: src/slic3r/GUI/GLCanvas3D.cpp:250
msgid "Shift + Right mouse button:"
msgstr "Shift + rechtermuisknop:"
-#: src/slic3r/GUI/GLCanvas3D.cpp:258
+#: src/slic3r/GUI/GLCanvas3D.cpp:252
msgid "Smoothing"
msgstr "Egaliseren"
-#: src/slic3r/GUI/GLCanvas3D.cpp:261
+#: src/slic3r/GUI/GLCanvas3D.cpp:254
msgid "Mouse wheel:"
msgstr "Scrollwieltje:"
-#: src/slic3r/GUI/GLCanvas3D.cpp:264
+#: src/slic3r/GUI/GLCanvas3D.cpp:256
msgid "Increase/decrease edit area"
msgstr "Vergroot/verklein bewerkgebied"
-#: src/slic3r/GUI/GLCanvas3D.cpp:267
+#: src/slic3r/GUI/GLCanvas3D.cpp:259
msgid "Adaptive"
msgstr "Adaptief"
-#: src/slic3r/GUI/GLCanvas3D.cpp:273
+#: src/slic3r/GUI/GLCanvas3D.cpp:265
msgid "Quality / Speed"
msgstr "Kwaliteit / Snelheid"
-#: src/slic3r/GUI/GLCanvas3D.cpp:277
+#: src/slic3r/GUI/GLCanvas3D.cpp:268
msgid "Higher print quality versus higher print speed."
msgstr "Hogere printkwaliteit tegenover een hogere printsnelheid."
-#: src/slic3r/GUI/GLCanvas3D.cpp:288
+#: src/slic3r/GUI/GLCanvas3D.cpp:279
msgid "Smooth"
msgstr "Egaliseer"
-#: src/slic3r/GUI/GLCanvas3D.cpp:294 src/libslic3r/PrintConfig.cpp:511
+#: src/slic3r/GUI/GLCanvas3D.cpp:285 src/libslic3r/PrintConfig.cpp:571
msgid "Radius"
msgstr "Radius"
-#: src/slic3r/GUI/GLCanvas3D.cpp:304
+#: src/slic3r/GUI/GLCanvas3D.cpp:295
msgid "Keep min"
msgstr "Behoud min"
-#: src/slic3r/GUI/GLCanvas3D.cpp:313
+#: src/slic3r/GUI/GLCanvas3D.cpp:304 src/slic3r/GUI/GLCanvas3D.cpp:4007
msgid "Reset"
msgstr "Reset"
-#: src/slic3r/GUI/GLCanvas3D.cpp:599
+#: src/slic3r/GUI/GLCanvas3D.cpp:566
msgid "Variable layer height - Manual edit"
msgstr "Variabele laagdikte - handmatig bewerken"
-#: src/slic3r/GUI/GLCanvas3D.cpp:685
-msgid "An object outside the print area was detected"
-msgstr "Er is een object buiten het printbereik gedetecteerd"
+#: src/slic3r/GUI/GLCanvas3D.cpp:634
+msgid "An object outside the print area was detected."
+msgstr "Er is een object buiten het printbereik gedetecteerd."
-#: src/slic3r/GUI/GLCanvas3D.cpp:686
-msgid "A toolpath outside the print area was detected"
-msgstr "Er is een printbeweging buiten het printbereik gedetecteerd"
+#: src/slic3r/GUI/GLCanvas3D.cpp:635
+msgid "A toolpath outside the print area was detected."
+msgstr "Er is een toolpad buiten het printbereik gedetecteerd."
-#: src/slic3r/GUI/GLCanvas3D.cpp:687
-msgid "SLA supports outside the print area were detected"
-msgstr "Er is SLA-support buiten het printbereik gedetecteerd"
+#: src/slic3r/GUI/GLCanvas3D.cpp:636
+msgid "SLA supports outside the print area were detected."
+msgstr "Er zijn SLA-supports buiten het printbereik gedetecteerd."
-#: src/slic3r/GUI/GLCanvas3D.cpp:688
-msgid "Some objects are not visible"
-msgstr "Sommige objecten zijn niet zichtbaar"
+#: src/slic3r/GUI/GLCanvas3D.cpp:637
+msgid "Some objects are not visible."
+msgstr "Sommige objecten zijn niet zichtbaar."
-#: src/slic3r/GUI/GLCanvas3D.cpp:690
+#: src/slic3r/GUI/GLCanvas3D.cpp:639
msgid ""
-"An object outside the print area was detected\n"
-"Resolve the current problem to continue slicing"
+"An object outside the print area was detected.\n"
+"Resolve the current problem to continue slicing."
msgstr ""
-"Er is een object buiten het printbereik gedetecteerd\n"
-"Los dit probleem op om door te gaan met slicen"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:904 src/slic3r/GUI/GLCanvas3D.cpp:933
-msgid "Default print color"
-msgstr "Standaard printkleur"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:934 src/slic3r/GUI/GLCanvas3D.cpp:943
-#: src/slic3r/GUI/GLCanvas3D.cpp:982
-msgid "Pause print or custom G-code"
-msgstr "Pauzeer de print of voer custom G-code in"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:955
-#, c-format
-msgid "up to %.2f mm"
-msgstr "tot %.2f mm"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:959
-#, c-format
-msgid "above %.2f mm"
-msgstr "boven %.2f mm"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:963
-#, c-format
-msgid "%.2f - %.2f mm"
-msgstr "%.2f - %.2f mm"
+"Er is een object buiten het printbereik gedetecteerd.\n"
+"Los het probleem op om door te gaan met slicen."
-#: src/slic3r/GUI/GLCanvas3D.cpp:995
-#, c-format
-msgid "Color change for Extruder %d at %.2f mm"
-msgstr "Kleurwissel voor extruder %d op %.2f mm"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:1305
+#: src/slic3r/GUI/GLCanvas3D.cpp:949
msgid "Seq."
-msgstr "Volgorde"
+msgstr "Volg."
-#: src/slic3r/GUI/GLCanvas3D.cpp:1701
+#: src/slic3r/GUI/GLCanvas3D.cpp:1453
msgid "Variable layer height - Reset"
msgstr "Variabele laagdikte - reset"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1709
+#: src/slic3r/GUI/GLCanvas3D.cpp:1461
msgid "Variable layer height - Adaptive"
msgstr "Variabele laagdikte - adaptief"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1717
+#: src/slic3r/GUI/GLCanvas3D.cpp:1469
msgid "Variable layer height - Smooth all"
msgstr "Variable laagdikte - egaliseer alles"
-#: src/slic3r/GUI/GLCanvas3D.cpp:2053
+#: src/slic3r/GUI/GLCanvas3D.cpp:1871
msgid "Mirror Object"
msgstr "Spiegel object"
-#: src/slic3r/GUI/GLCanvas3D.cpp:2921
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:570
+#: src/slic3r/GUI/GLCanvas3D.cpp:2736
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:520
msgid "Gizmo-Move"
msgstr "Verplaatsen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:3001
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:572
+#: src/slic3r/GUI/GLCanvas3D.cpp:2822
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:522
msgid "Gizmo-Rotate"
msgstr "Roteren"
-#: src/slic3r/GUI/GLCanvas3D.cpp:3505
+#: src/slic3r/GUI/GLCanvas3D.cpp:3345
msgid "Move Object"
msgstr "Verplaats object"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4046
+#: src/slic3r/GUI/GLCanvas3D.cpp:3815 src/slic3r/GUI/GLCanvas3D.cpp:4528
+msgid "Switch to Settings"
+msgstr "Schakel over naar instellingen"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3816 src/slic3r/GUI/GLCanvas3D.cpp:4528
+msgid "Print Settings Tab"
+msgstr "Printinstellingentab"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3817 src/slic3r/GUI/GLCanvas3D.cpp:4529
+msgid "Filament Settings Tab"
+msgstr "Filamentinstellingentab"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3817 src/slic3r/GUI/GLCanvas3D.cpp:4529
+msgid "Material Settings Tab"
+msgstr "Materiaalinstellingentab"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3818 src/slic3r/GUI/GLCanvas3D.cpp:4530
+msgid "Printer Settings Tab"
+msgstr "Printerinstellingentab"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3866
msgid "Undo History"
msgstr "Geschiedenis ongedaan maken"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4046
+#: src/slic3r/GUI/GLCanvas3D.cpp:3866
msgid "Redo History"
msgstr "Geschiedenis opnieuw doen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4064
+#: src/slic3r/GUI/GLCanvas3D.cpp:3887
#, c-format
msgid "Undo %1$d Action"
msgid_plural "Undo %1$d Actions"
msgstr[0] "Maak %1$d actie ongedaan"
msgstr[1] "Maak %1$d acties ongedaan"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4064
+#: src/slic3r/GUI/GLCanvas3D.cpp:3887
#, c-format
msgid "Redo %1$d Action"
msgid_plural "Redo %1$d Actions"
msgstr[0] "Doe %1$d actie opnieuw"
msgstr[1] "Doe %1$d acties opnieuw"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4466
+#: src/slic3r/GUI/GLCanvas3D.cpp:3907 src/slic3r/GUI/GLCanvas3D.cpp:4546
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 src/slic3r/GUI/Search.cpp:351
+msgid "Search"
+msgstr "Zoek"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3921 src/slic3r/GUI/GLCanvas3D.cpp:3929
+#: src/slic3r/GUI/Search.cpp:358
+msgid "Enter a search term"
+msgstr "Voer een zoekterm in"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3960
+msgid "Arrange options"
+msgstr "Schikopties"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3990
+msgid "Press %1%left mouse button to enter the exact value"
+msgstr "Druk op %1% linkermuisknop om de exacte waarde in te voeren"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3992
+msgid "Spacing"
+msgstr "Tussenruimte"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3999
+msgid "Enable rotations (slow)"
+msgstr "Sta draaien toe (vertraagd het slicen)"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4017 src/slic3r/GUI/GLCanvas3D.cpp:4438
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 src/slic3r/GUI/Plater.cpp:1648
+msgid "Arrange"
+msgstr "Schikken"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4412
msgid "Add..."
msgstr "Voeg toe..."
-#: src/slic3r/GUI/GLCanvas3D.cpp:4474 src/slic3r/GUI/GUI_ObjectList.cpp:1734
-#: src/slic3r/GUI/Plater.cpp:3983 src/slic3r/GUI/Plater.cpp:4005
-#: src/slic3r/GUI/Tab.cpp:3144
+#: src/slic3r/GUI/GLCanvas3D.cpp:4420 src/slic3r/GUI/GUI_ObjectList.cpp:1878
+#: src/slic3r/GUI/Plater.cpp:3950 src/slic3r/GUI/Plater.cpp:3974
+#: src/slic3r/GUI/Tab.cpp:3484
msgid "Delete"
msgstr "Verwijder"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4483 src/slic3r/GUI/KBShortcutsDialog.cpp:131
-#: src/slic3r/GUI/Plater.cpp:4725
+#: src/slic3r/GUI/GLCanvas3D.cpp:4429 src/slic3r/GUI/KBShortcutsDialog.cpp:88
+#: src/slic3r/GUI/Plater.cpp:5060
msgid "Delete all"
msgstr "Verwijder alles"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4492 src/slic3r/GUI/KBShortcutsDialog.cpp:159
-#: src/slic3r/GUI/Plater.cpp:2806
-msgid "Arrange"
-msgstr "Schikken"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:4492 src/slic3r/GUI/KBShortcutsDialog.cpp:160
+#: src/slic3r/GUI/GLCanvas3D.cpp:4438 src/slic3r/GUI/KBShortcutsDialog.cpp:121
msgid "Arrange selection"
msgstr "Schik selectie"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4504
+#: src/slic3r/GUI/GLCanvas3D.cpp:4438
+msgid "Click right mouse button to show arrangement options"
+msgstr "Rechtermuisklik om schikopties te tonen"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4460
msgid "Copy"
msgstr "Kopieer"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4513
+#: src/slic3r/GUI/GLCanvas3D.cpp:4469
msgid "Paste"
msgstr "Plak"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4525 src/slic3r/GUI/Plater.cpp:3840
-#: src/slic3r/GUI/Plater.cpp:3852 src/slic3r/GUI/Plater.cpp:3992
+#: src/slic3r/GUI/GLCanvas3D.cpp:4481 src/slic3r/GUI/Plater.cpp:3809
+#: src/slic3r/GUI/Plater.cpp:3821 src/slic3r/GUI/Plater.cpp:3959
msgid "Add instance"
msgstr "Voeg instantie toe"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4536 src/slic3r/GUI/Plater.cpp:3994
+#: src/slic3r/GUI/GLCanvas3D.cpp:4492 src/slic3r/GUI/Plater.cpp:3961
msgid "Remove instance"
msgstr "Verwijder instantie"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4549
+#: src/slic3r/GUI/GLCanvas3D.cpp:4505
msgid "Split to objects"
msgstr "Verdeel in objecten"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4559 src/slic3r/GUI/GUI_ObjectList.cpp:1503
+#: src/slic3r/GUI/GLCanvas3D.cpp:4515 src/slic3r/GUI/GUI_ObjectList.cpp:1650
msgid "Split to parts"
msgstr "Verdeel in onderdelen"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4623 src/slic3r/GUI/KBShortcutsDialog.cpp:132
-#: src/slic3r/GUI/MainFrame.cpp:628
+#: src/slic3r/GUI/GLCanvas3D.cpp:4617 src/slic3r/GUI/KBShortcutsDialog.cpp:89
+#: src/slic3r/GUI/MainFrame.cpp:1125
msgid "Undo"
msgstr "Maak ongedaan"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4623 src/slic3r/GUI/GLCanvas3D.cpp:4656
-msgid "Click right mouse button to open History"
-msgstr "Open de geschiedenis met de rechtermuisknop"
+#: src/slic3r/GUI/GLCanvas3D.cpp:4617 src/slic3r/GUI/GLCanvas3D.cpp:4656
+msgid "Click right mouse button to open/close History"
+msgstr "Rechtermuisklik om geschiedenis te openen/sluiten"
#: src/slic3r/GUI/GLCanvas3D.cpp:4640
msgid "Next Undo action: %1%"
msgstr "Volgende ongedaan maken: %1%"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4656 src/slic3r/GUI/KBShortcutsDialog.cpp:133
-#: src/slic3r/GUI/MainFrame.cpp:631
+#: src/slic3r/GUI/GLCanvas3D.cpp:4656 src/slic3r/GUI/KBShortcutsDialog.cpp:90
+#: src/slic3r/GUI/MainFrame.cpp:1128
msgid "Redo"
msgstr "Doe opnieuw"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4672
+#: src/slic3r/GUI/GLCanvas3D.cpp:4678
msgid "Next Redo action: %1%"
msgstr "Volgende opnieuw doen: %1%"
-#: src/slic3r/GUI/GLCanvas3D.cpp:6586
+#: src/slic3r/GUI/GLCanvas3D.cpp:6300
msgid "Selection-Add from rectangle"
msgstr "Selectie - Voeg toe van boxselectie"
-#: src/slic3r/GUI/GLCanvas3D.cpp:6605
+#: src/slic3r/GUI/GLCanvas3D.cpp:6319
msgid "Selection-Remove from rectangle"
msgstr "Selectie - Verwijder van boxselectie"
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:306
-#, c-format
-msgid ""
-"PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n"
-"while OpenGL version %s, render %s, vendor %s was detected."
-msgstr ""
-"PrusaSlicer vereist een grafische driver die OpenGL 2.0 kan draaien,\n"
-"terwijl OpenGL-versie %s, render %s, leverancier %s is gedetecteerd."
-
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:309
-msgid "You may need to update your graphics card driver."
-msgstr "U moet mogelijk uw grafische kaart updaten."
-
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:312
-msgid ""
-"As a workaround, you may run PrusaSlicer with a software rendered 3D "
-"graphics by running prusa-slicer.exe with the --sw_renderer parameter."
-msgstr ""
-"Als oplossing kunt u PrusaSlicer draaien met een softwarematig 3D-"
-"renderprogramma door prusa-slicer.exe uit te voeren met de --sw_renderer "
-"parameter."
-
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:314
-msgid "Unsupported OpenGL version"
-msgstr "Niet-ondersteunde OpenGL-versie"
-
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:42
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3412
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:54
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:151 src/libslic3r/PrintConfig.cpp:3690
msgid "Cut"
msgstr "Snij door"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:168
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:179
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487
+msgid "in"
+msgstr "in"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:185
msgid "Keep upper part"
msgstr "Behoud bovenste deel"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:169
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:186
msgid "Keep lower part"
msgstr "Behoud onderste deel"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:187
msgid "Rotate lower part upwards"
msgstr "Roteer onderste deel naar boven"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:175
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:192
msgid "Perform cut"
-msgstr "Toepassen"
+msgstr "Uitsnede toepassen"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33
+msgid "Paint-on supports"
+msgstr "Inkleur-supports"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:25
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57
+msgid "Clipping of view"
+msgstr "Doorsnede weergeven"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:26
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58
+msgid "Reset direction"
+msgstr "Reset-richting"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:27
+msgid "Brush size"
+msgstr "Penseelgrootte"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:28
+msgid "Brush shape"
+msgstr "Penseelvorm"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:29
+msgid "Left mouse button"
+msgstr "Linkermuisknop"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47
+msgid "Enforce supports"
+msgstr "Forceer supports"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31
+msgid "Right mouse button"
+msgstr "Rechtermuisknop"
-#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:45
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:373
+msgid "Block supports"
+msgstr "Blokkeer supports"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33
+msgid "Shift + Left mouse button"
+msgstr "Shift + linkermuisknop"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:368
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:378
+msgid "Remove selection"
+msgstr "Verwijder selectie"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35
+msgid "Remove all selection"
+msgstr "Verwijder alle selecties"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36
+msgid "Circle"
+msgstr "Cirkel"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1595
+msgid "Sphere"
+msgstr "Bol"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:129
+msgid "Autoset by angle"
+msgstr "Stel in op basis van hoek"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:136
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:118
+msgid "Reset selection"
+msgstr "Reset selectie"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:160
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141
+msgid "Alt + Mouse wheel"
+msgstr "Alt + scrollwieltje"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:178
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:159
+msgid "Paints all facets inside, regardless of their orientation."
+msgstr "Kleurt alle binnenfacetten, onafhankelijk van hun oriëntatie."
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:192
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:173
+msgid "Ignores facets facing away from the camera."
+msgstr "Negeer facetten die niet in beeld zijn."
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:203
+msgid "Ctrl + Mouse wheel"
+msgstr "Ctrl + scrollwieltje"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:233
+msgid "Autoset custom supports"
+msgstr "Custom support automatisch instellen"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:235
+msgid "Threshold:"
+msgstr "Drempelwaarde:"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242
+msgid "Enforce"
+msgstr "Forceer"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:245
+msgid "Block"
+msgstr "Blokkeer"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:295
+msgid "Block supports by angle"
+msgstr "Blokkeer supports op basis van hoek"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:296
+msgid "Add supports by angle"
+msgstr "Voeg supports toe op basis van hoek"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:40
msgid "Place on face"
msgstr "Plaats op vlak"
@@ -1817,11 +2314,12 @@ msgid "Offset"
msgstr "Shelldikte"
#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:56
msgid "Quality"
msgstr "Kwaliteit"
#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44
-#: src/libslic3r/PrintConfig.cpp:2944
+#: src/libslic3r/PrintConfig.cpp:3183
msgid "Closing distance"
msgstr "Sluitafstand"
@@ -1841,64 +2339,68 @@ msgstr "Verwijder geselecteerde gaten"
msgid "Remove all holes"
msgstr "Verwijder alle gaten"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57
-msgid "Clipping of view"
-msgstr "Weergave samenvoegen"
-
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58
-msgid "Reset direction"
-msgstr "Reset-richting"
-
#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51
msgid "Show supports"
msgstr "Toon support"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:423
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:308
msgid "Add drainage hole"
msgstr "Voeg afvoergat toe"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:541
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:424
msgid "Delete drainage hole"
msgstr "Verwijder afvoergat"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:815
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:624
msgid "Hollowing parameter change"
-msgstr "Verandering van uitholparameter"
+msgstr "Wijziging van uitholparameter"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:887
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:693
msgid "Change drainage hole diameter"
msgstr "Verander afvoergatdiameter"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:979
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:785
msgid "Hollow and drill"
msgstr "Uithollen en gat toevoegen"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1061
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:835
msgid "Move drainage hole"
msgstr "Verplaats afvoergat"
-#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:64
msgid "Move"
msgstr "Verplaats"
-#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:449
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:480
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:499
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:517
-#: src/libslic3r/PrintConfig.cpp:3461
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:461
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:527
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562
+#: src/libslic3r/PrintConfig.cpp:3739
msgid "Rotate"
msgstr "Roteer"
-#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:47
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:230
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:500
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:518
-#: src/libslic3r/PrintConfig.cpp:3476
+#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:78
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:238
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:547
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563
+#: src/libslic3r/PrintConfig.cpp:3754
msgid "Scale"
msgstr "Verschaal"
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:30
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:381
+msgid "Enforce seam"
+msgstr "Forceer naad"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:383
+msgid "Block seam"
+msgstr "Blokkeer naad"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:46
+msgid "Seam painting"
+msgstr "Naad kleuren"
+
#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47
msgid "Head diameter"
msgstr "Kopdiameter"
@@ -1908,21 +2410,21 @@ msgid "Lock supports under new islands"
msgstr "Vergrendel support onder nieuwe eilanden"
#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1361
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218
msgid "Remove selected points"
msgstr "Verwijder geselecteerde punten"
#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50
msgid "Remove all points"
-msgstr "Verwijdere alle punten"
+msgstr "Verwijder alle punten"
#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221
msgid "Apply changes"
msgstr "Wijzigingen toepassen"
#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222
msgid "Discard changes"
msgstr "Wijzigingen afwijzen"
@@ -1931,12 +2433,12 @@ msgid "Minimal points distance"
msgstr "Minimale puntafstand"
#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54
-#: src/libslic3r/PrintConfig.cpp:2774
+#: src/libslic3r/PrintConfig.cpp:3013
msgid "Support points density"
msgstr "Dichtheid van supportpunten"
#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224
msgid "Auto-generate points"
msgstr "Genereer automatisch punten"
@@ -1944,150 +2446,236 @@ msgstr "Genereer automatisch punten"
msgid "Manual editing"
msgstr "Handmatig bewerken"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:484
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:374
msgid "Add support point"
msgstr "Voeg supportpunt toe"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:621
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:514
msgid "Delete support point"
msgstr "Verwijder supportpunt"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:810
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:694
msgid "Change point head diameter"
-msgstr "Wijzig puntkopdiameter"
+msgstr "Wijzig pinkopdiameter"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:878
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:762
msgid "Support parameter change"
msgstr "Wijzig supportparameter"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:986
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869
msgid "SLA Support Points"
msgstr "SLA-supportpunten"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1007
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897
msgid "SLA gizmo turned on"
msgstr "SLA-bewerker aangezet"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1035
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:911
msgid "Do you want to save your manually edited support points?"
-msgstr "Wilt u handmatig aangepaste supportpunten opslaan?"
+msgstr "Wil je handmatig aangepaste supportpunten opslaan?"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1036
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912
msgid "Save changes?"
msgstr "Wijzigingen opslaan?"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1048
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:924
msgid "SLA gizmo turned off"
msgstr "SLA-bewerker uitgezet"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1087
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:955
msgid "Move support point"
msgstr "Verplaats supportpunt"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1186
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1048
msgid "Support points edit"
msgstr "Bewerk supportpunten"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1258
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1127
msgid "Autogeneration will erase all manually edited points."
msgstr ""
"Automatisch genereren zal alle handmatig aangepaste punten verwijderen."
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1259
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1128
msgid "Are you sure you want to do it?"
-msgstr "Weet u zeker dat u dit wilt doen?"
+msgstr "Weet je zeker dat je dit wil doen?"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 src/slic3r/GUI/GUI.cpp:258
-#: src/slic3r/GUI/Tab.cpp:3074 src/slic3r/GUI/WipeTowerDialog.cpp:45
-#: src/slic3r/GUI/WipeTowerDialog.cpp:366
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1129 src/slic3r/GUI/GUI.cpp:256
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:557
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:581
+#: src/slic3r/GUI/WipeTowerDialog.cpp:45 src/slic3r/GUI/WipeTowerDialog.cpp:366
msgid "Warning"
msgstr "Waarschuwing"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1134
msgid "Autogenerate support points"
msgstr "Automatisch gegenereerde supportpunten"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1324
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1181
msgid "SLA gizmo keyboard shortcuts"
msgstr "SLA sneltoetsen"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1335
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1192
msgid "Note: some shortcuts work in (non)editing mode only."
-msgstr "Let op: sommige sneltoetsen werken alleen in bewerkmodus."
+msgstr "Let op: sommige sneltoetsen werken alleen in bewerkingsmodus."
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1353
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1356
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1357
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214
msgid "Left click"
msgstr "Linkermuisknop"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1353
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210
msgid "Add point"
msgstr "Voeg punt toe"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1354
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211
msgid "Right click"
msgstr "Rechtermuisknop"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1354
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211
msgid "Remove point"
msgstr "Verwijder punt"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1355
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1358
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1359
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216
msgid "Drag"
msgstr "Versleep"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1355
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212
msgid "Move point"
msgstr "Verplaats punt"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1356
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213
msgid "Add point to selection"
msgstr "Voeg punt toe aan selectie"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1357
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214
msgid "Remove point from selection"
msgstr "Verwijder punt uit selectie"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1358
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215
msgid "Select by rectangle"
msgstr "Selecteer met boxselectie"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1359
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216
msgid "Deselect by rectangle"
msgstr "Deselecteer met boxselectie"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1360
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217
msgid "Select all points"
msgstr "Selecteer alle punten"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1362
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219
msgid "Mouse wheel"
msgstr "Scrollwieltje"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1362
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219
msgid "Move clipping plane"
msgstr "Verplaats snijvlak"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220
msgid "Reset clipping plane"
msgstr "Reset snijvlak"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223
msgid "Switch to editing mode"
-msgstr "Schakel over naar bewerkmodus"
+msgstr "Schakel over naar bewerkingsmodus"
+
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:521
+msgid "Gizmo-Scale"
+msgstr "Verschalen"
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:497
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:630
msgid "Gizmo-Place on Face"
msgstr "Plaats op vlak"
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:571
-msgid "Gizmo-Scale"
-msgstr "Verschalen"
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:39
+msgid "Entering Paint-on supports"
+msgstr "Inkleur-supports toepassen"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:40
+msgid "Entering Seam painting"
+msgstr "Inkleur-naad toepassen"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:47
+msgid "Leaving Seam painting"
+msgstr "Naad-inkleuren verlaten"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:48
+msgid "Leaving Paint-on supports"
+msgstr "Supports-inkleuren verlaten"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:371
+msgid "Add supports"
+msgstr "Voeg support toe"
+
+#: src/slic3r/GUI/GUI_App.cpp:238
+msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community."
+msgstr ""
+"is gebaseerd op Slic3R van Allessandro Ranellucci en de RepRap-community."
+
+#: src/slic3r/GUI/GUI_App.cpp:240
+msgid ""
+"Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas "
+"Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others."
+msgstr ""
+"Bijdragen van Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas "
+"Meszaros, Lukas Matena, Vojtech Kral, David Kocik, Simon Tillema en vele "
+"anderen."
+
+#: src/slic3r/GUI/GUI_App.cpp:241
+msgid "Artwork model by Nora Al-Badri and Jan Nikolai Nelles"
+msgstr "Coverfoto door Nora Al-Badri en Jan Nikolai Nelles"
+
+#: src/slic3r/GUI/GUI_App.cpp:381
+msgid ""
+"Starting with %1% 2.3, configuration directory on Linux has changed "
+"(according to XDG Base Directory Specification) to \n"
+"%2%.\n"
+"\n"
+"This directory did not exist yet (maybe you run the new version for the "
+"first time).\n"
+"However, an old %1% configuration directory was detected in \n"
+"%3%.\n"
+"\n"
+"Consider moving the contents of the old directory to the new location in "
+"order to access your profiles, etc.\n"
+"Note that if you decide to downgrade %1% in future, it will use the old "
+"location again.\n"
+"\n"
+"What do you want to do now?"
+msgstr ""
+"Beginnend bij %1% 2.3, de configuratie-locatie op Linux is veranderd "
+"(volgens de XDG Base Directory Specification) naar\n"
+"%2%.\n"
+"\n"
+"Deze locatie bestaat nog niet (misschien omdat je een nieuwere versie voor "
+"het eerst draait).\n"
+"Desondanks is een oude %1%-configuratie-locatie gedetecteerd in\n"
+"%3%.\n"
+"\n"
+"Overweeg om de inhoud uit de oude locatie naar de nieuwe te verplaatsen om "
+"toegang te krijgen tot je profielen, etc.\n"
+"Let op dat je besluit %1% in de toekomst te downgraden als je de vorige "
+"locatie weer wil gebruiken.\n"
+"\n"
+"Wat wil je nu doen?"
-#: src/slic3r/GUI/GUI_App.cpp:138
+#: src/slic3r/GUI/GUI_App.cpp:389
+#, c-format
+msgid "%s - BREAKING CHANGE"
+msgstr "%s - ingrijpende wijziging"
+
+#: src/slic3r/GUI/GUI_App.cpp:391
+msgid "Quit, I will move my data now"
+msgstr "Afsluiten, ik zal mijn data nu verplaatsen"
+
+#: src/slic3r/GUI/GUI_App.cpp:391
+msgid "Start the application"
+msgstr "Start het programma"
+
+#: src/slic3r/GUI/GUI_App.cpp:579
#, c-format
msgid ""
"%s has encountered an error. It was likely caused by running out of memory. "
@@ -2096,147 +2684,244 @@ msgid ""
"\n"
"The application will now terminate."
msgstr ""
-"%s veroorzaakte een fout. Dit komt mogelijk door een geheugentekort. Als u "
-"zeker weet dat u genoeg RAM-geheugen heeft, kan dit ook een andere fout "
-"zijn. We waarderen het als u dit meldt.\n"
+"%s veroorzaakte een fout. Dit komt mogelijk door een geheugentekort. Als je "
+"zeker weet dat je genoeg RAM-geheugen heeft, kan dit ook een andere fout "
+"zijn. We waarderen het als je dit meldt.\n"
"\n"
"Het programma zal nu afsluiten."
-#: src/slic3r/GUI/GUI_App.cpp:141
+#: src/slic3r/GUI/GUI_App.cpp:582
msgid "Fatal error"
msgstr "Fatale fout"
-#: src/slic3r/GUI/GUI_App.cpp:438
-msgid "Changing of an application language"
-msgstr "Veranderen van de taal van het programma"
+#: src/slic3r/GUI/GUI_App.cpp:586
+msgid ""
+"PrusaSlicer has encountered a localization error. Please report to "
+"PrusaSlicer team, what language was active and in which scenario this issue "
+"happened. Thank you.\n"
+"\n"
+"The application will now terminate."
+msgstr ""
+"PrusaSlicer heeft een fout gedetecteerd in het vertaalbestand. Rapporteer "
+"deze alstublieft aan het PrusaSlicer-team; welke taal is geactiveerd en door "
+"welke functie dit probleem ontstond. Hartelijk dank!\n"
+"\n"
+"De applicatie wordt nu afgesloten."
+
+#: src/slic3r/GUI/GUI_App.cpp:589
+msgid "Critical error"
+msgstr "Kritieke fout"
-#: src/slic3r/GUI/GUI_App.cpp:441 src/slic3r/GUI/GUI_App.cpp:449
+#: src/slic3r/GUI/GUI_App.cpp:710
+msgid ""
+"Error parsing PrusaSlicer config file, it is probably corrupted. Try to "
+"manually delete the file to recover from the error. Your user profiles will "
+"not be affected."
+msgstr ""
+"Fout in het PrusaSlicer-configuratiebestand. Het is mogelijk beschadigd. "
+"Probeer het bestand handmatig te verwijderen om de fout te herstellen. Uw "
+"gebruikersprofielen worden niet beïnvloed."
+
+#: src/slic3r/GUI/GUI_App.cpp:716
+msgid ""
+"Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to "
+"manually delete the file to recover from the error."
+msgstr ""
+"Fout tijdens het lezen van PrusaGCodeViewer-configuratiebestand. Het is "
+"mogelijk beschadigd. Probeer het handmatig te verwijderen."
+
+#: src/slic3r/GUI/GUI_App.cpp:770
+#, c-format
+msgid ""
+"%s\n"
+"Do you want to continue?"
+msgstr ""
+"%s\n"
+"Wil je doorgaan?"
+
+#: src/slic3r/GUI/GUI_App.cpp:772 src/slic3r/GUI/UnsavedChangesDialog.cpp:665
+msgid "Remember my choice"
+msgstr "Onthoud mijn keuze"
+
+#: src/slic3r/GUI/GUI_App.cpp:807
+msgid "Loading configuration"
+msgstr "Configuratie aan het laden"
+
+#: src/slic3r/GUI/GUI_App.cpp:875
+msgid "Preparing settings tabs"
+msgstr "Instellingentab voorbereiden"
+
+#: src/slic3r/GUI/GUI_App.cpp:1114
+msgid ""
+"You have the following presets with saved options for \"Print Host upload\""
+msgstr ""
+"Je hebt de volgende voorinstellingen opgeslagen voor de "
+"printhostuploadwachtrij"
+
+#: src/slic3r/GUI/GUI_App.cpp:1118
+msgid ""
+"But since this version of PrusaSlicer we don't show this information in "
+"Printer Settings anymore.\n"
+"Settings will be available in physical printers settings."
+msgstr ""
+"Maar sinds deze versie van PrusaSlicer, wordt de informatie niet meer "
+"getoond in de printerinstellingen.\n"
+"Instellingen zijn beschikbaar in de fysieke printerinstellingen."
+
+#: src/slic3r/GUI/GUI_App.cpp:1120
+msgid ""
+"By default new Printer devices will be named as \"Printer N\" during its "
+"creation.\n"
+"Note: This name can be changed later from the physical printers settings"
+msgstr ""
+"Nieuwe printers worden automatisch \"Printer N\" genoemd bij het aanmaken.\n"
+"Let op: deze naam kan later worden aangepast in de fysieke-"
+"printerinstellingen"
+
+#: src/slic3r/GUI/GUI_App.cpp:1123 src/slic3r/GUI/PhysicalPrinterDialog.cpp:626
+msgid "Information"
+msgstr "Informatie"
+
+#: src/slic3r/GUI/GUI_App.cpp:1136 src/slic3r/GUI/GUI_App.cpp:1147
msgid "Recreating"
msgstr "Opnieuw aanmaken"
-#: src/slic3r/GUI/GUI_App.cpp:454
+#: src/slic3r/GUI/GUI_App.cpp:1152
msgid "Loading of current presets"
-msgstr "Laden van huidige presets"
+msgstr "Laden van huidige voorinstellingen"
-#: src/slic3r/GUI/GUI_App.cpp:459
+#: src/slic3r/GUI/GUI_App.cpp:1157
msgid "Loading of a mode view"
msgstr "Laden van de weergavemodus"
-#: src/slic3r/GUI/GUI_App.cpp:538
+#: src/slic3r/GUI/GUI_App.cpp:1233
msgid "Choose one file (3MF/AMF):"
msgstr "Kies een 3MF- of AMF-bestand:"
-#: src/slic3r/GUI/GUI_App.cpp:550
+#: src/slic3r/GUI/GUI_App.cpp:1245
msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):"
-msgstr "Kies één of meer STL-, OBJ-, AMF-, 3MF-, of PRUSA-bestanden:"
+msgstr "Kies STL-, OBJ-, AMF-, 3MF-, en/of PRUSA-bestanden:"
-#: src/slic3r/GUI/GUI_App.cpp:611
+#: src/slic3r/GUI/GUI_App.cpp:1257
+msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):"
+msgstr "Kies een bestand (gcode/.GCO/.G/.ngc/NGC):"
+
+#: src/slic3r/GUI/GUI_App.cpp:1268
+msgid "Changing of an application language"
+msgstr "Veranderen van de taal van het programma"
+
+#: src/slic3r/GUI/GUI_App.cpp:1371
msgid "Select the language"
msgstr "Taalselectie"
-#: src/slic3r/GUI/GUI_App.cpp:611
+#: src/slic3r/GUI/GUI_App.cpp:1371
msgid "Language"
msgstr "Taal"
-#: src/slic3r/GUI/GUI_App.cpp:779
+#: src/slic3r/GUI/GUI_App.cpp:1520
+msgid "modified"
+msgstr "aangepast"
+
+#: src/slic3r/GUI/GUI_App.cpp:1569
#, c-format
msgid "Run %s"
msgstr "Voer %s uit"
-#: src/slic3r/GUI/GUI_App.cpp:782
+#: src/slic3r/GUI/GUI_App.cpp:1573
msgid "&Configuration Snapshots"
msgstr "Configuratiesnapshots"
-#: src/slic3r/GUI/GUI_App.cpp:782
+#: src/slic3r/GUI/GUI_App.cpp:1573
msgid "Inspect / activate configuration snapshots"
msgstr "Inspecteer/activeer configuratiesnapshots"
-#: src/slic3r/GUI/GUI_App.cpp:783
+#: src/slic3r/GUI/GUI_App.cpp:1574
msgid "Take Configuration &Snapshot"
msgstr "Neem configuratiesnapshot"
-#: src/slic3r/GUI/GUI_App.cpp:783
+#: src/slic3r/GUI/GUI_App.cpp:1574
msgid "Capture a configuration snapshot"
-msgstr "Neem een configuratiesnapshot op"
+msgstr "Maak een configuratiesnapshot"
-#: src/slic3r/GUI/GUI_App.cpp:784
+#: src/slic3r/GUI/GUI_App.cpp:1575
msgid "Check for updates"
msgstr "Controleer op updates"
-#: src/slic3r/GUI/GUI_App.cpp:784
+#: src/slic3r/GUI/GUI_App.cpp:1575
msgid "Check for configuration updates"
msgstr "Controleer op configuratie-updates"
-#: src/slic3r/GUI/GUI_App.cpp:786
+#: src/slic3r/GUI/GUI_App.cpp:1578
msgid "&Preferences"
msgstr "Voorkeuren"
-#: src/slic3r/GUI/GUI_App.cpp:792
+#: src/slic3r/GUI/GUI_App.cpp:1584
msgid "Application preferences"
msgstr "Programmavoorkeuren"
-#: src/slic3r/GUI/GUI_App.cpp:795 src/slic3r/GUI/wxExtensions.cpp:756
+#: src/slic3r/GUI/GUI_App.cpp:1589 src/slic3r/GUI/wxExtensions.cpp:683
msgid "Simple"
msgstr "Eenvoudig"
-#: src/slic3r/GUI/GUI_App.cpp:795
+#: src/slic3r/GUI/GUI_App.cpp:1589
msgid "Simple View Mode"
-msgstr "Eenvoudige weergave"
-
-#: src/slic3r/GUI/GUI_App.cpp:796 src/slic3r/GUI/GUI_ObjectList.cpp:104
-#: src/slic3r/GUI/GUI_ObjectList.cpp:628 src/slic3r/GUI/Tab.cpp:1147
-#: src/slic3r/GUI/Tab.cpp:1162 src/slic3r/GUI/Tab.cpp:1261
-#: src/slic3r/GUI/Tab.cpp:1264 src/slic3r/GUI/Tab.cpp:1525
-#: src/slic3r/GUI/Tab.cpp:1989 src/slic3r/GUI/Tab.cpp:3719
-#: src/slic3r/GUI/wxExtensions.cpp:757 src/libslic3r/PrintConfig.cpp:88
-#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:223
-#: src/libslic3r/PrintConfig.cpp:1037 src/libslic3r/PrintConfig.cpp:2276
-#: src/libslic3r/PrintConfig.cpp:2448
+msgstr "Eenvoudige weergavemodus"
+
+#: src/slic3r/GUI/GUI_App.cpp:1591 src/slic3r/GUI/wxExtensions.cpp:685
+msgctxt "Mode"
msgid "Advanced"
msgstr "Geavanceerd"
-#: src/slic3r/GUI/GUI_App.cpp:796
+#: src/slic3r/GUI/GUI_App.cpp:1591
msgid "Advanced View Mode"
-msgstr "Geavanceerde weergave"
+msgstr "Geavanceerde weergavemodus"
-#: src/slic3r/GUI/GUI_App.cpp:797 src/slic3r/GUI/wxExtensions.cpp:758
+#: src/slic3r/GUI/GUI_App.cpp:1592 src/slic3r/GUI/wxExtensions.cpp:686
msgid "Expert"
msgstr "Expert"
-#: src/slic3r/GUI/GUI_App.cpp:797
+#: src/slic3r/GUI/GUI_App.cpp:1592
msgid "Expert View Mode"
-msgstr "Expertweergave"
+msgstr "Expertweergavemodus"
-#: src/slic3r/GUI/GUI_App.cpp:802
+#: src/slic3r/GUI/GUI_App.cpp:1597
msgid "Mode"
msgstr "Modus"
-#: src/slic3r/GUI/GUI_App.cpp:802
+#: src/slic3r/GUI/GUI_App.cpp:1597
#, c-format
msgid "%s View Mode"
msgstr "%s-weergavemodus"
-#: src/slic3r/GUI/GUI_App.cpp:804
+#: src/slic3r/GUI/GUI_App.cpp:1600
msgid "&Language"
-msgstr "Taal"
+msgstr "Taa&l"
-#: src/slic3r/GUI/GUI_App.cpp:806
+#: src/slic3r/GUI/GUI_App.cpp:1603
msgid "Flash printer &firmware"
-msgstr "Flash printerfirmware"
+msgstr "Flash firmware"
-#: src/slic3r/GUI/GUI_App.cpp:806
+#: src/slic3r/GUI/GUI_App.cpp:1603
msgid "Upload a firmware image into an Arduino based printer"
msgstr "Upload een firmwarebestand op een Arduino-gebaseerde printer"
-#: src/slic3r/GUI/GUI_App.cpp:821
+#: src/slic3r/GUI/GUI_App.cpp:1619
msgid "Taking configuration snapshot"
msgstr "Neem configuratiesnapshot"
-#: src/slic3r/GUI/GUI_App.cpp:821
+#: src/slic3r/GUI/GUI_App.cpp:1619
msgid "Snapshot name"
msgstr "Snapshotnaam"
-#: src/slic3r/GUI/GUI_App.cpp:868
+#: src/slic3r/GUI/GUI_App.cpp:1648
+msgid "Failed to activate configuration snapshot."
+msgstr "Activeren van configuratie-opname mislukt."
+
+#: src/slic3r/GUI/GUI_App.cpp:1698
+msgid "Language selection"
+msgstr "Taalselectie"
+
+#: src/slic3r/GUI/GUI_App.cpp:1700
msgid ""
"Switching the language will trigger application restart.\n"
"You will lose content of the plater."
@@ -2244,98 +2929,107 @@ msgstr ""
"Het veranderen van de taal zorgt dat het programma opnieuw opstart.\n"
"U verliest de geladen inhoud zoals getoond in de 3D-weergave."
-#: src/slic3r/GUI/GUI_App.cpp:870
+#: src/slic3r/GUI/GUI_App.cpp:1702
msgid "Do you want to proceed?"
msgstr ""
-"Weet u zeker dat u door wilt gaan?\n"
+"Weet je zeker dat je door wil gaan?\n"
"Do you want to proceed?"
-#: src/slic3r/GUI/GUI_App.cpp:871
-msgid "Language selection"
-msgstr "Taalselectie"
-
-#: src/slic3r/GUI/GUI_App.cpp:895
+#: src/slic3r/GUI/GUI_App.cpp:1729
msgid "&Configuration"
-msgstr "Configuratie"
+msgstr "&Configuratie"
-#: src/slic3r/GUI/GUI_App.cpp:919
-msgid "The presets on the following tabs were modified"
-msgstr "De instellingen in de volgende tabs zijn aangepast"
+#: src/slic3r/GUI/GUI_App.cpp:1760
+msgid "The preset(s) modifications are successfully saved"
+msgstr "De wijzigingen in de voorinstellingen zijn succesvol opgeslagen"
-#: src/slic3r/GUI/GUI_App.cpp:919 src/slic3r/GUI/Tab.cpp:2934
-msgid "Discard changes and continue anyway?"
-msgstr "Wijzigingen afwijzen en doorgaan?"
+#: src/slic3r/GUI/GUI_App.cpp:1781
+msgid "The uploads are still ongoing"
+msgstr "De uploads zijn nog lopende"
-#: src/slic3r/GUI/GUI_App.cpp:922
-msgid "Unsaved Presets"
-msgstr "Niet-opgeslagen presets"
+#: src/slic3r/GUI/GUI_App.cpp:1781
+msgid "Stop them and continue anyway?"
+msgstr "Stop ze en ga desondanks door?"
-#: src/slic3r/GUI/GUI_App.cpp:1071 src/slic3r/GUI/Tab.cpp:2946
+#: src/slic3r/GUI/GUI_App.cpp:1784
+msgid "Ongoing uploads"
+msgstr "Lopende uploads"
+
+#: src/slic3r/GUI/GUI_App.cpp:1998 src/slic3r/GUI/Tab.cpp:3242
msgid "It's impossible to print multi-part object(s) with SLA technology."
msgstr ""
"Het is niet mogelijk meerdelige objecten te printen met de SLA-technologie."
-#: src/slic3r/GUI/GUI_App.cpp:1072
+#: src/slic3r/GUI/GUI_App.cpp:1999
msgid "Please check and fix your object list."
msgstr "Controleer en repareer de objectenlijst."
-#: src/slic3r/GUI/GUI_App.cpp:1073 src/slic3r/GUI/Plater.cpp:2365
-#: src/slic3r/GUI/Tab.cpp:2948
+#: src/slic3r/GUI/GUI_App.cpp:2000 src/slic3r/GUI/Jobs/SLAImportJob.cpp:210
+#: src/slic3r/GUI/Plater.cpp:2355 src/slic3r/GUI/Tab.cpp:3244
msgid "Attention!"
-msgstr "Attentie!"
+msgstr "Let op!"
-#: src/slic3r/GUI/GUI_App.cpp:1090
+#: src/slic3r/GUI/GUI_App.cpp:2017
msgid "Select a gcode file:"
msgstr "Selecteer een gcode-bestand:"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27
+#: src/slic3r/GUI/GUI_Init.cpp:73 src/slic3r/GUI/GUI_Init.cpp:76
+msgid "PrusaSlicer GUI initialization failed"
+msgstr "Initialisatie van PrusaSlicer GUI mislukt"
+
+#: src/slic3r/GUI/GUI_Init.cpp:76
+msgid "Fatal error, exception catched: %1%"
+msgstr "Fatale fout, uitzondering gevonden: %1%"
+
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29
msgid "Start at height"
msgstr "Start op hoogte"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29
msgid "Stop at height"
msgstr "Stop op hoogte"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:158
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:161
msgid "Remove layer range"
msgstr "Verwijder laagbereik"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:160
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:165
msgid "Add layer range"
msgstr "Voeg laagbereik toe"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:95
-#: src/slic3r/GUI/GUI_ObjectList.cpp:619 src/libslic3r/PrintConfig.cpp:72
-#: src/libslic3r/PrintConfig.cpp:175 src/libslic3r/PrintConfig.cpp:184
-#: src/libslic3r/PrintConfig.cpp:408 src/libslic3r/PrintConfig.cpp:470
-#: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:890
-#: src/libslic3r/PrintConfig.cpp:1075 src/libslic3r/PrintConfig.cpp:1374
-#: src/libslic3r/PrintConfig.cpp:1441 src/libslic3r/PrintConfig.cpp:1622
-#: src/libslic3r/PrintConfig.cpp:2074 src/libslic3r/PrintConfig.cpp:2133
-#: src/libslic3r/PrintConfig.cpp:2142
+#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:92
+#: src/slic3r/GUI/GUI_ObjectList.cpp:667 src/libslic3r/PrintConfig.cpp:74
+#: src/libslic3r/PrintConfig.cpp:189 src/libslic3r/PrintConfig.cpp:231
+#: src/libslic3r/PrintConfig.cpp:240 src/libslic3r/PrintConfig.cpp:464
+#: src/libslic3r/PrintConfig.cpp:530 src/libslic3r/PrintConfig.cpp:538
+#: src/libslic3r/PrintConfig.cpp:970 src/libslic3r/PrintConfig.cpp:1219
+#: src/libslic3r/PrintConfig.cpp:1584 src/libslic3r/PrintConfig.cpp:1650
+#: src/libslic3r/PrintConfig.cpp:1835 src/libslic3r/PrintConfig.cpp:2302
+#: src/libslic3r/PrintConfig.cpp:2361 src/libslic3r/PrintConfig.cpp:2370
msgid "Layers and Perimeters"
msgstr "Lagen en perimeters"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:97
-#: src/slic3r/GUI/GUI_ObjectList.cpp:621 src/slic3r/GUI/GUI_Preview.cpp:246
-#: src/slic3r/GUI/Tab.cpp:1180 src/slic3r/GUI/Tab.cpp:1181
-#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/PrintConfig.cpp:370
-#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1866
-#: src/libslic3r/PrintConfig.cpp:1872 src/libslic3r/PrintConfig.cpp:1880
-#: src/libslic3r/PrintConfig.cpp:1892 src/libslic3r/PrintConfig.cpp:1902
-#: src/libslic3r/PrintConfig.cpp:1910 src/libslic3r/PrintConfig.cpp:1925
-#: src/libslic3r/PrintConfig.cpp:1946 src/libslic3r/PrintConfig.cpp:1958
-#: src/libslic3r/PrintConfig.cpp:1974 src/libslic3r/PrintConfig.cpp:1983
-#: src/libslic3r/PrintConfig.cpp:1992 src/libslic3r/PrintConfig.cpp:2003
-#: src/libslic3r/PrintConfig.cpp:2017 src/libslic3r/PrintConfig.cpp:2025
-#: src/libslic3r/PrintConfig.cpp:2026 src/libslic3r/PrintConfig.cpp:2035
-#: src/libslic3r/PrintConfig.cpp:2043 src/libslic3r/PrintConfig.cpp:2057
+#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:95
+#: src/slic3r/GUI/GUI_ObjectList.cpp:670 src/slic3r/GUI/GUI_Preview.cpp:240
+#: src/slic3r/GUI/Tab.cpp:1472 src/slic3r/GUI/Tab.cpp:1474
+#: src/libslic3r/ExtrusionEntity.cpp:320 src/libslic3r/ExtrusionEntity.cpp:352
+#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:1715
+#: src/libslic3r/PrintConfig.cpp:2093 src/libslic3r/PrintConfig.cpp:2099
+#: src/libslic3r/PrintConfig.cpp:2107 src/libslic3r/PrintConfig.cpp:2119
+#: src/libslic3r/PrintConfig.cpp:2129 src/libslic3r/PrintConfig.cpp:2137
+#: src/libslic3r/PrintConfig.cpp:2152 src/libslic3r/PrintConfig.cpp:2173
+#: src/libslic3r/PrintConfig.cpp:2185 src/libslic3r/PrintConfig.cpp:2201
+#: src/libslic3r/PrintConfig.cpp:2210 src/libslic3r/PrintConfig.cpp:2219
+#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2244
+#: src/libslic3r/PrintConfig.cpp:2252 src/libslic3r/PrintConfig.cpp:2253
+#: src/libslic3r/PrintConfig.cpp:2262 src/libslic3r/PrintConfig.cpp:2270
+#: src/libslic3r/PrintConfig.cpp:2284
msgid "Support material"
msgstr "Support"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:101
-#: src/slic3r/GUI/GUI_ObjectList.cpp:625 src/libslic3r/PrintConfig.cpp:2252
-#: src/libslic3r/PrintConfig.cpp:2260
+#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:99
+#: src/slic3r/GUI/GUI_ObjectList.cpp:674 src/libslic3r/PrintConfig.cpp:2480
+#: src/libslic3r/PrintConfig.cpp:2488
msgid "Wipe options"
msgstr "Afveegopties"
@@ -2359,597 +3053,656 @@ msgstr "Voeg supportforcering toe"
msgid "Add support blocker"
msgstr "Voeg supportblokkering toe"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:622
-#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/Tab.cpp:1205
-#: src/libslic3r/PrintConfig.cpp:235 src/libslic3r/PrintConfig.cpp:458
-#: src/libslic3r/PrintConfig.cpp:919 src/libslic3r/PrintConfig.cpp:1048
-#: src/libslic3r/PrintConfig.cpp:1431 src/libslic3r/PrintConfig.cpp:1668
-#: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1768
-#: src/libslic3r/PrintConfig.cpp:2118
+#: src/slic3r/GUI/GUI_ObjectList.cpp:94 src/slic3r/GUI/GUI_ObjectList.cpp:669
+#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/Tab.cpp:1442
+#: src/libslic3r/ExtrusionEntity.cpp:316 src/libslic3r/ExtrusionEntity.cpp:344
+#: src/libslic3r/PrintConfig.cpp:1226 src/libslic3r/PrintConfig.cpp:1232
+#: src/libslic3r/PrintConfig.cpp:1246 src/libslic3r/PrintConfig.cpp:1256
+#: src/libslic3r/PrintConfig.cpp:1264 src/libslic3r/PrintConfig.cpp:1266
+msgid "Ironing"
+msgstr "Strijken"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:671
+#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/Tab.cpp:1498
+#: src/libslic3r/PrintConfig.cpp:291 src/libslic3r/PrintConfig.cpp:518
+#: src/libslic3r/PrintConfig.cpp:1012 src/libslic3r/PrintConfig.cpp:1192
+#: src/libslic3r/PrintConfig.cpp:1265 src/libslic3r/PrintConfig.cpp:1640
+#: src/libslic3r/PrintConfig.cpp:1916 src/libslic3r/PrintConfig.cpp:1968
+#: src/libslic3r/PrintConfig.cpp:2346
msgid "Speed"
msgstr "Snelheid"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:99 src/slic3r/GUI/GUI_ObjectList.cpp:623
-#: src/slic3r/GUI/Tab.cpp:1240 src/slic3r/GUI/Tab.cpp:1860
-#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:1002
-#: src/libslic3r/PrintConfig.cpp:1409 src/libslic3r/PrintConfig.cpp:1737
-#: src/libslic3r/PrintConfig.cpp:1938 src/libslic3r/PrintConfig.cpp:1965
+#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:672
+#: src/slic3r/GUI/Tab.cpp:1534 src/slic3r/GUI/Tab.cpp:2112
+#: src/libslic3r/PrintConfig.cpp:548 src/libslic3r/PrintConfig.cpp:1146
+#: src/libslic3r/PrintConfig.cpp:1618 src/libslic3r/PrintConfig.cpp:1937
+#: src/libslic3r/PrintConfig.cpp:2165 src/libslic3r/PrintConfig.cpp:2192
msgid "Extruders"
msgstr "Extruders"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:100 src/slic3r/GUI/GUI_ObjectList.cpp:624
-#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:555
-#: src/libslic3r/PrintConfig.cpp:877 src/libslic3r/PrintConfig.cpp:1010
-#: src/libslic3r/PrintConfig.cpp:1418 src/libslic3r/PrintConfig.cpp:1757
-#: src/libslic3r/PrintConfig.cpp:1947 src/libslic3r/PrintConfig.cpp:2106
+#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:673
+#: src/libslic3r/PrintConfig.cpp:507 src/libslic3r/PrintConfig.cpp:616
+#: src/libslic3r/PrintConfig.cpp:957 src/libslic3r/PrintConfig.cpp:1154
+#: src/libslic3r/PrintConfig.cpp:1627 src/libslic3r/PrintConfig.cpp:1957
+#: src/libslic3r/PrintConfig.cpp:2174 src/libslic3r/PrintConfig.cpp:2334
msgid "Extrusion Width"
msgstr "Extrusiebreedte"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/GUI_ObjectList.cpp:630
-#: src/slic3r/GUI/Plater.cpp:500 src/slic3r/GUI/Tab.cpp:3660
-#: src/slic3r/GUI/Tab.cpp:3661 src/libslic3r/PrintConfig.cpp:2614
-#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2630
-#: src/libslic3r/PrintConfig.cpp:2639 src/libslic3r/PrintConfig.cpp:2649
-#: src/libslic3r/PrintConfig.cpp:2685 src/libslic3r/PrintConfig.cpp:2692
-#: src/libslic3r/PrintConfig.cpp:2703 src/libslic3r/PrintConfig.cpp:2713
-#: src/libslic3r/PrintConfig.cpp:2722 src/libslic3r/PrintConfig.cpp:2735
-#: src/libslic3r/PrintConfig.cpp:2745 src/libslic3r/PrintConfig.cpp:2754
-#: src/libslic3r/PrintConfig.cpp:2764 src/libslic3r/PrintConfig.cpp:2775
-#: src/libslic3r/PrintConfig.cpp:2783
+#: src/slic3r/GUI/GUI_ObjectList.cpp:102 src/slic3r/GUI/GUI_ObjectList.cpp:677
+#: src/slic3r/GUI/Tab.cpp:1428 src/slic3r/GUI/Tab.cpp:1452
+#: src/slic3r/GUI/Tab.cpp:1555 src/slic3r/GUI/Tab.cpp:1558
+#: src/slic3r/GUI/Tab.cpp:1855 src/slic3r/GUI/Tab.cpp:2197
+#: src/slic3r/GUI/Tab.cpp:4114 src/libslic3r/PrintConfig.cpp:92
+#: src/libslic3r/PrintConfig.cpp:132 src/libslic3r/PrintConfig.cpp:279
+#: src/libslic3r/PrintConfig.cpp:1097 src/libslic3r/PrintConfig.cpp:1181
+#: src/libslic3r/PrintConfig.cpp:2504 src/libslic3r/PrintConfig.cpp:2676
+msgid "Advanced"
+msgstr "Geavanceerd"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:679
+#: src/slic3r/GUI/Plater.cpp:357 src/slic3r/GUI/Tab.cpp:4048
+#: src/slic3r/GUI/Tab.cpp:4049 src/libslic3r/PrintConfig.cpp:2842
+#: src/libslic3r/PrintConfig.cpp:2849 src/libslic3r/PrintConfig.cpp:2858
+#: src/libslic3r/PrintConfig.cpp:2867 src/libslic3r/PrintConfig.cpp:2877
+#: src/libslic3r/PrintConfig.cpp:2887 src/libslic3r/PrintConfig.cpp:2924
+#: src/libslic3r/PrintConfig.cpp:2931 src/libslic3r/PrintConfig.cpp:2942
+#: src/libslic3r/PrintConfig.cpp:2952 src/libslic3r/PrintConfig.cpp:2961
+#: src/libslic3r/PrintConfig.cpp:2974 src/libslic3r/PrintConfig.cpp:2984
+#: src/libslic3r/PrintConfig.cpp:2993 src/libslic3r/PrintConfig.cpp:3003
+#: src/libslic3r/PrintConfig.cpp:3014 src/libslic3r/PrintConfig.cpp:3022
msgid "Supports"
msgstr "Support"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:107 src/slic3r/GUI/GUI_ObjectList.cpp:631
-#: src/slic3r/GUI/Plater.cpp:640 src/slic3r/GUI/Tab.cpp:3694
-#: src/slic3r/GUI/Tab.cpp:3695 src/libslic3r/PrintConfig.cpp:2791
-#: src/libslic3r/PrintConfig.cpp:2798 src/libslic3r/PrintConfig.cpp:2812
-#: src/libslic3r/PrintConfig.cpp:2823 src/libslic3r/PrintConfig.cpp:2833
-#: src/libslic3r/PrintConfig.cpp:2855 src/libslic3r/PrintConfig.cpp:2866
-#: src/libslic3r/PrintConfig.cpp:2873 src/libslic3r/PrintConfig.cpp:2880
-#: src/libslic3r/PrintConfig.cpp:2891 src/libslic3r/PrintConfig.cpp:2900
-#: src/libslic3r/PrintConfig.cpp:2909
+#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:680
+#: src/slic3r/GUI/Plater.cpp:500 src/slic3r/GUI/Tab.cpp:4089
+#: src/slic3r/GUI/Tab.cpp:4090 src/slic3r/GUI/Tab.cpp:4161
+#: src/libslic3r/PrintConfig.cpp:3030 src/libslic3r/PrintConfig.cpp:3037
+#: src/libslic3r/PrintConfig.cpp:3051 src/libslic3r/PrintConfig.cpp:3062
+#: src/libslic3r/PrintConfig.cpp:3072 src/libslic3r/PrintConfig.cpp:3094
+#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3112
+#: src/libslic3r/PrintConfig.cpp:3119 src/libslic3r/PrintConfig.cpp:3130
+#: src/libslic3r/PrintConfig.cpp:3139 src/libslic3r/PrintConfig.cpp:3148
msgid "Pad"
msgstr "Basisplaat"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:108 src/slic3r/GUI/Tab.cpp:3712
-#: src/slic3r/GUI/Tab.cpp:3713 src/libslic3r/SLA/Hollowing.cpp:46
-#: src/libslic3r/SLA/Hollowing.cpp:58 src/libslic3r/SLA/Hollowing.cpp:67
-#: src/libslic3r/SLA/Hollowing.cpp:76 src/libslic3r/PrintConfig.cpp:2919
-#: src/libslic3r/PrintConfig.cpp:2926 src/libslic3r/PrintConfig.cpp:2936
-#: src/libslic3r/PrintConfig.cpp:2945
+#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:4107
+#: src/slic3r/GUI/Tab.cpp:4108 src/libslic3r/SLA/Hollowing.cpp:45
+#: src/libslic3r/SLA/Hollowing.cpp:57 src/libslic3r/SLA/Hollowing.cpp:66
+#: src/libslic3r/SLA/Hollowing.cpp:75 src/libslic3r/PrintConfig.cpp:3158
+#: src/libslic3r/PrintConfig.cpp:3165 src/libslic3r/PrintConfig.cpp:3175
+#: src/libslic3r/PrintConfig.cpp:3184
msgid "Hollowing"
msgstr "Uithollen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:275
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153
+#: src/slic3r/GUI/GUI_ObjectList.cpp:300
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:161
msgid "Name"
msgstr "Naam"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:283 src/slic3r/GUI/Tab.cpp:1489
-#: src/slic3r/GUI/wxExtensions.cpp:598 src/libslic3r/PrintConfig.cpp:487
-msgid "Extruder"
-msgstr "Extruder"
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:287 src/slic3r/GUI/GUI_ObjectList.cpp:400
+#: src/slic3r/GUI/GUI_ObjectList.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:457
msgid "Editing"
msgstr "Bewerken"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:345
+#: src/slic3r/GUI/GUI_ObjectList.cpp:402
#, c-format
msgid "Auto-repaired (%d errors):"
msgstr "Automatisch gerepareerd (%d fouten):"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:352
+#: src/slic3r/GUI/GUI_ObjectList.cpp:409
msgid "degenerate facets"
msgstr "vlakken gedegenereerd"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:353
+#: src/slic3r/GUI/GUI_ObjectList.cpp:410
msgid "edges fixed"
msgstr "randen vastgezet"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:354
+#: src/slic3r/GUI/GUI_ObjectList.cpp:411
msgid "facets removed"
msgstr "vlakken verwijderd"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:355
+#: src/slic3r/GUI/GUI_ObjectList.cpp:412
msgid "facets added"
msgstr "vlakken toegevoegd"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:356
+#: src/slic3r/GUI/GUI_ObjectList.cpp:413
msgid "facets reversed"
msgstr "vlakken omgekeerd"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:357
+#: src/slic3r/GUI/GUI_ObjectList.cpp:414
msgid "backwards edges"
msgstr "omgekeerde lijnen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:365
+#: src/slic3r/GUI/GUI_ObjectList.cpp:422
msgid "Right button click the icon to fix STL through Netfabb"
msgstr ""
-"Rechtermuisklik op het pictogram om het STL-bestand met NetFabb te repareren"
+"Rechtermuisklik op het pictogram om het STL-bestand met Netfabb te repareren"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:402
+#: src/slic3r/GUI/GUI_ObjectList.cpp:459
msgid "Right button click the icon to change the object settings"
msgstr "Rechtermuisklik op het icoontje om de objectinstellingen te wijzigen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:404
+#: src/slic3r/GUI/GUI_ObjectList.cpp:461
msgid "Click the icon to change the object settings"
msgstr "Klik op het pictogram om de objectinstellingen te wijzigen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:408
+#: src/slic3r/GUI/GUI_ObjectList.cpp:465
msgid "Right button click the icon to change the object printable property"
msgstr "Rechtermuisklik op het pictogram om de printinstellingen te wijzigen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:410
+#: src/slic3r/GUI/GUI_ObjectList.cpp:467
msgid "Click the icon to change the object printable property"
msgstr "Klik op het pictogram om de printinstellingen te wijzigen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:463 src/slic3r/GUI/GUI_ObjectList.cpp:475
-#: src/slic3r/GUI/GUI_ObjectList.cpp:933 src/slic3r/GUI/GUI_ObjectList.cpp:3995
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4005
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4040
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:200
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:257
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:282
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:490
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:1753
-msgid "default"
-msgstr "standaard"
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:542
+#: src/slic3r/GUI/GUI_ObjectList.cpp:590
msgid "Change Extruder"
msgstr "Wijzig extruder"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:557
+#: src/slic3r/GUI/GUI_ObjectList.cpp:605
msgid "Rename Object"
msgstr "Hernoem object"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:557
+#: src/slic3r/GUI/GUI_ObjectList.cpp:605
msgid "Rename Sub-object"
msgstr "Hernoem subobject"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1107
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3809
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1247
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4372
msgid "Instances to Separated Objects"
msgstr "Zet instanties om in objecten"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1122
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1262
msgid "Volumes in Object reordered"
msgstr "Volumes in object opnieuw geordend"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1122
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1262
msgid "Object reordered"
msgstr "Object opnieuw geordend"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1198
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1546
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1552
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1865
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1338
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1693
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1699
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2081
#, c-format
msgid "Quick Add Settings (%s)"
msgstr "Snel instellingen toevoegen (%s)"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1281
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1428
msgid "Select showing settings"
msgstr "Selecteer getoonde instellingen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1330
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1477
msgid "Add Settings for Layers"
msgstr "Voeg laaginstellingen toe"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1331
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1478
msgid "Add Settings for Sub-object"
msgstr "Voeg instellingen voor subobject toe"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1332
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1479
msgid "Add Settings for Object"
msgstr "Voeg instellingen voor object toe"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1402
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1549
msgid "Add Settings Bundle for Height range"
msgstr "Voeg instellingen voor hoogtebereik toe"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1403
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1550
msgid "Add Settings Bundle for Sub-object"
msgstr "Voeg instellingen voor subobject toe"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1404
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1551
msgid "Add Settings Bundle for Object"
msgstr "Voeg instellingen voor een object toe"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1443
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1590
msgid "Load"
msgstr "Laad"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1448
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1480
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1484
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1595
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1627
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1631
msgid "Box"
msgstr "Blok"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1448
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1595
msgid "Cylinder"
msgstr "Cilinder"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1448
-msgid "Sphere"
-msgstr "Bol"
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1448
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1595
msgid "Slab"
msgstr "Plaat"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1516
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1663
msgid "Height range Modifier"
msgstr "Modificator voor hoogtebereik"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1525
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1672
msgid "Add settings"
msgstr "Voeg instellingen toe"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1605
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1750
msgid "Change type"
msgstr "Wijzig type"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1615
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1627
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1760
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1772
msgid "Set as a Separated Object"
msgstr "Stel in als apart object"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1627
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1772
msgid "Set as a Separated Objects"
msgstr "Stel in als aparte objecten"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1637
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1782
msgid "Printable"
msgstr "Printbaar"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1652
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1797
msgid "Rename"
msgstr "Hernoem"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1663
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1808
msgid "Fix through the Netfabb"
-msgstr "Repareer met NetFabb"
+msgstr "Repareer met Netfabb"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1673 src/slic3r/GUI/Plater.cpp:4018
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1818 src/slic3r/GUI/Plater.cpp:3987
msgid "Export as STL"
msgstr "Exporteer als STL-bestand"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1680
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3984 src/slic3r/GUI/Plater.cpp:3986
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1825
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4567 src/slic3r/GUI/Plater.cpp:3953
msgid "Reload the selected volumes from disk"
msgstr "Herlaad de geselecteerde volumes vanaf schijf"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1687
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1832
msgid "Set extruder for selected items"
msgstr "Stel extruder in voor de geselecteerde items"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1720 src/libslic3r/PrintConfig.cpp:335
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1864 src/libslic3r/PrintConfig.cpp:391
msgid "Default"
msgstr "Standaard"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1740
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1884
msgid "Scale to print volume"
msgstr "Verschaal tot printvolume"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1740
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1884
msgid "Scale the selected object to fit the print volume"
msgstr "Verschaal het geselecteerde object tot deze in het printvolume past"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1809
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2067
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1913 src/slic3r/GUI/Plater.cpp:5177
+msgid "Convert from imperial units"
+msgstr "Converteer naar Engelse eenheden"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1915 src/slic3r/GUI/Plater.cpp:5177
+msgid "Revert conversion from imperial units"
+msgstr "Conversie van Engelse eenheden ongedaan maken"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1944
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1952
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2630 src/libslic3r/PrintConfig.cpp:3730
+msgid "Merge"
+msgstr "Samenvoegen"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1944
+msgid "Merge objects to the one multipart object"
+msgstr "Voeg objecten samen tot één meerdelig object"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1952
+msgid "Merge objects to the one single object"
+msgstr "Voeg objecten samen tot een enkeldelig object"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2026
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2283
msgid "Add Shape"
msgstr "Voeg vorm toe"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1895
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2111
msgid "Load Part"
msgstr "Laad onderdeel"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1934
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2150
msgid "Error!"
msgstr "Fout!"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2009
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2225
msgid "Add Generic Subobject"
msgstr "Voeg algemene subobjecten toe"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2038
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2254
msgid "Generic"
msgstr "Algemeen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2156
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2258
-msgid "Last instance of an object cannot be deleted."
-msgstr "Laatste instantie van een object kan niet verwijderd worden."
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2168
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2380
msgid "Delete Settings"
msgstr "Verwijder instellingen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2192
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2402
msgid "Delete All Instances from Object"
msgstr "Verwijder alle instanties van het object"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2208
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2418
msgid "Delete Height Range"
msgstr "Verwijder hoogtebereik"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2239
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2450
msgid "From Object List You can't delete the last solid part from object."
msgstr "Het laatste onderdeel van de objectenlijst kan niet verwijderd worden."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2243
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2454
msgid "Delete Subobject"
msgstr "Verwijder subobject"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2262
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2469
+msgid "Last instance of an object cannot be deleted."
+msgstr "Laatste instantie van een object kan niet verwijderd worden."
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2473
msgid "Delete Instance"
msgstr "Verwijder instantie"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2286 src/slic3r/GUI/Plater.cpp:3035
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2497 src/slic3r/GUI/Plater.cpp:2861
msgid ""
"The selected object couldn't be split because it contains only one part."
msgstr ""
"Het geselecteerde object kan niet opgedeeld worden omdat het maar één "
"geometrie bevat."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2290
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2501
msgid "Split to Parts"
msgstr "Splits naar onderdelen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2344
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2637
+msgid "Merged"
+msgstr "Samengevoegd"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2721
+msgid "Merge all parts to the one single object"
+msgstr "Voeg alle delen samen tot een enkel object"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2753
msgid "Add Layers"
msgstr "Voeg lagen toe"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2470
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2907
msgid "Group manipulation"
msgstr "Groep bewerken"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2482
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2919
msgid "Object manipulation"
msgstr "Object bewerken"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2495
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2932
msgid "Object Settings to modify"
msgstr "Objectinstellingen om te bewerken"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2499
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2936
msgid "Part Settings to modify"
msgstr "Onderdeelinstellingen om te bewerken"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2504
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2941
msgid "Layer range Settings to modify"
msgstr "Laagbereikinstellingen om te bewerken"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2510
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2947
msgid "Part manipulation"
msgstr "Onderdeel bewerken"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2516
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2953
msgid "Instance manipulation"
msgstr "Instantie bewerken"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2523
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2960
msgid "Height ranges"
msgstr "Hoogtebereik"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2523
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2960
msgid "Settings for height range"
msgstr "Instellingen voor hoogtebereik"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2709
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3144
msgid "Delete Selected Item"
msgstr "Verwijder geselecteerd item"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2846
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3332
msgid "Delete Selected"
msgstr "Verwijder selectie"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2920
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2942
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2962
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3408
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3436
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3456
msgid "Add Height Range"
msgstr "Voeg hoogtebereik toe"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3027
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3502
+msgid ""
+"Cannot insert a new layer range after the current layer range.\n"
+"The next layer range is too thin to be split to two\n"
+"without violating the minimum layer height."
+msgstr ""
+"Kan geen laagbereik toevoegen na het huidige laagbereik.\n"
+"Het volgende laagbereik is te dun om in tweeën te splitsen\n"
+"zonder over de minimale laagdikte heen te gaan."
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3506
+msgid ""
+"Cannot insert a new layer range between the current and the next layer "
+"range.\n"
+"The gap between the current layer range and the next layer range\n"
+"is thinner than the minimum layer height allowed."
+msgstr ""
+"Kan geen laagbereik toevoegen tussen het huidige en het volgende "
+"laagbereik.\n"
+"Het gat tussen het huidige en volgende laagbereik is kleiner dan\n"
+"de minimum toegestane laagdikte."
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3511
+msgid ""
+"Cannot insert a new layer range after the current layer range.\n"
+"Current layer range overlaps with the next layer range."
+msgstr ""
+"Kan geen nieuw laagbereik toevoegen na het huidige laagbereik.\n"
+"Het huidige laagbereik overlapt met het volgende laagbereik."
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3570
msgid "Edit Height Range"
msgstr "Bewerk hoogtebereik"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3319
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3865
msgid "Selection-Remove from list"
msgstr "Selectie - Verwijder van lijst"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3327
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3873
msgid "Selection-Add from list"
msgstr "Selectie - Voeg toe aan lijst"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3445
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4008
msgid "Object or Instance"
msgstr "Object of instantie"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3446
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3579
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4009
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4142
msgid "Part"
msgstr "Onderdeel"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3446
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4009
msgid "Layer"
msgstr "Laag"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3448
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4011
msgid "Unsupported selection"
msgstr "Niet-ondersteunde selectie"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3449
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4012
#, c-format
msgid "You started your selection with %s Item."
msgstr "De selectie is gestart met item %s."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3450
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4013
#, c-format
msgid "In this mode you can select only other %s Items%s"
-msgstr "In deze modus kunt u alleen andere %s items %s selecteren"
+msgstr "In deze modus kunt je alleen andere %s items %s selecteren"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3453
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4016
msgid "of a current Object"
msgstr "van het huidige object"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3458
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3533 src/slic3r/GUI/Plater.cpp:141
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4021
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4096 src/slic3r/GUI/Plater.cpp:143
msgid "Info"
msgstr "Info"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3574
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4137
msgid "You can't change a type of the last solid part of the object."
msgstr ""
"U kunt het type van het laatste onderdeel van een object niet wijzigen."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3579
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4142
msgid "Modifier"
msgstr "Modificator"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3579
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4142
msgid "Support Enforcer"
msgstr "Supportforcering"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3579
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4142
msgid "Support Blocker"
msgstr "Supportblokkering"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3581
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4144
msgid "Select type of part"
msgstr "Selecteer onderdeeltype"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3586
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4149
msgid "Change Part Type"
msgstr "Wijzig onderdeeltype"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3831
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4394
msgid "Enter new name"
msgstr "Voer nieuwe naam in"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3831
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4394
msgid "Renaming"
msgstr "Hernoemen"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3847
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3954 src/slic3r/GUI/Tab.cpp:3518
-#: src/slic3r/GUI/Tab.cpp:3522
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4410
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4537
+#: src/slic3r/GUI/SavePresetDialog.cpp:101
+#: src/slic3r/GUI/SavePresetDialog.cpp:109
msgid "The supplied name is not valid;"
msgstr "De ingevoerde naam is niet geldig;"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3848
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3955 src/slic3r/GUI/Tab.cpp:3519
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4411
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4538
+#: src/slic3r/GUI/SavePresetDialog.cpp:102
msgid "the following characters are not allowed:"
msgstr "de volgende karakters zijn niet toegestaan:"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3999
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4586
msgid "Select extruder number:"
msgstr "Selecteer extrudernummer:"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4000
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4587
msgid "This extruder will be set for selected items"
msgstr "Deze extruder wordt ingesteld voor de geselecteerde items"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4025
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4612
msgid "Change Extruders"
msgstr "Wijzig extruders"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4122 src/slic3r/GUI/Selection.cpp:1475
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4709 src/slic3r/GUI/Selection.cpp:1485
msgid "Set Printable"
msgstr "Stel in op printbaar"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4122 src/slic3r/GUI/Selection.cpp:1475
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4709 src/slic3r/GUI/Selection.cpp:1485
msgid "Set Unprintable"
msgstr "Stel in op niet-printbaar"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:68
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:111
msgid "World coordinates"
msgstr "Wereldcoördinaten"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:63
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:106
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:69
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:112
msgid "Local coordinates"
msgstr "Lokale coördinaten"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:82
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:88
msgid "Select coordinate space, in which the transformation will be performed."
-msgstr ""
-"Stel een coördinatenstelsel in. Hierin wordt de verandering uitgevoerd."
+msgstr "Stel een coördinatenstelsel in. Hierin wordt de wijziging uitgevoerd."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:641
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:163 src/libslic3r/GCode.cpp:540
msgid "Object name"
msgstr "Objectnaam"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:215
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:457
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:223
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:505
msgid "Position"
msgstr "Positie"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:458
-#: src/slic3r/GUI/Mouse3DController.cpp:271
-#: src/slic3r/GUI/Mouse3DController.cpp:294
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:224
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:506
+#: src/slic3r/GUI/Mouse3DController.cpp:486
+#: src/slic3r/GUI/Mouse3DController.cpp:507
msgid "Rotation"
msgstr "Rotatie"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:271
#, c-format
msgid "Toggle %c axis mirroring"
msgstr "Zet %c-asspiegeling aan"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:297
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:305
msgid "Set Mirror"
msgstr "Stel spiegeling in"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:337
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:349
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:345
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:357
msgid "Drop to bed"
msgstr "Plaats op het bed"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:372
msgid "Reset rotation"
msgstr "Reset rotatie"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:394
msgid "Reset Rotation"
msgstr "Reset rotatie"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:397
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:407
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409
msgid "Reset scale"
msgstr "Reset verschaling"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:459
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:507
msgid "Scale factors"
msgstr "Verschalingsfactoren"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:561
msgid "Translate"
msgstr "Verplaats"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:625
msgid ""
"You cannot use non-uniform scaling mode for multiple objects/parts selection"
msgstr ""
"Niet-gelijke verschaling kan niet gebruikt worden voor meerdere objecten of "
"onderdelen"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:750
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:797
msgid "Set Position"
msgstr "Stel positie in"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:781
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:828
msgid "Set Orientation"
msgstr "Stel oriëntatie in"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:846
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:893
msgid "Set Scale"
msgstr "Stel verschaling in"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:925
msgid ""
"The currently manipulated object is tilted (rotation angles are not "
"multiples of 90°).\n"
@@ -2963,294 +3716,378 @@ msgstr ""
"wereldcoördinatensysteem\n"
"als de rotatie is ingebouwd in de objectcoördinaten."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:878
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:928
msgid ""
"This operation is irreversible.\n"
"Do you want to proceed?"
msgstr ""
"Deze bewerking werkt onomkeerbaar.\n"
-"Weet u zeker dat u wilt doorgaan?"
+"Weet je zeker dat je door wil gaan?"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:59
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:62
msgid "Additional Settings"
-msgstr "Extra instellingen"
+msgstr "Aanvullende instellingen"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:95
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:98
msgid "Remove parameter"
msgstr "Verwijder parameter"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:101
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:104
#, c-format
msgid "Delete Option %s"
msgstr "Verwijder optie %s"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:152
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:157
#, c-format
msgid "Change Option %s"
msgstr "Wijzig optie %s"
-#: src/slic3r/GUI/GUI_Preview.cpp:218
+#: src/slic3r/GUI/GUI_Preview.cpp:212
msgid "View"
msgstr "Weergave"
-#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/GUI_Preview.cpp:575
-#: src/libslic3r/GCode/PreviewData.cpp:345
-msgid "Feature type"
-msgstr "Objecttype"
-
-#: src/slic3r/GUI/GUI_Preview.cpp:222 src/libslic3r/PrintConfig.cpp:500
+#: src/slic3r/GUI/GUI_Preview.cpp:215 src/libslic3r/PrintConfig.cpp:560
msgid "Height"
msgstr "Hoogte"
-#: src/slic3r/GUI/GUI_Preview.cpp:223 src/libslic3r/PrintConfig.cpp:2238
+#: src/slic3r/GUI/GUI_Preview.cpp:216 src/libslic3r/PrintConfig.cpp:2466
msgid "Width"
msgstr "Breedte"
-#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/Tab.cpp:1512
+#: src/slic3r/GUI/GUI_Preview.cpp:218 src/slic3r/GUI/Tab.cpp:1840
msgid "Fan speed"
msgstr "Ventilatorsnelheid"
-#: src/slic3r/GUI/GUI_Preview.cpp:226
+#: src/slic3r/GUI/GUI_Preview.cpp:219
msgid "Volumetric flow rate"
msgstr "Volumetrisch debiet"
-#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/GUI_Preview.cpp:335
-#: src/slic3r/GUI/GUI_Preview.cpp:519 src/slic3r/GUI/GUI_Preview.cpp:574
-#: src/slic3r/GUI/GUI_Preview.cpp:835 src/libslic3r/GCode/PreviewData.cpp:357
-msgid "Tool"
-msgstr "Tool"
-
-#: src/slic3r/GUI/GUI_Preview.cpp:228 src/slic3r/GUI/GUI_Preview.cpp:572
-#: src/libslic3r/GCode/PreviewData.cpp:359
-msgid "Color Print"
-msgstr "Kleurenprint"
-
-#: src/slic3r/GUI/GUI_Preview.cpp:231
+#: src/slic3r/GUI/GUI_Preview.cpp:224
msgid "Show"
msgstr "Toon"
-#: src/slic3r/GUI/GUI_Preview.cpp:234 src/slic3r/GUI/GUI_Preview.cpp:235
+#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/GUI_Preview.cpp:245
msgid "Feature types"
-msgstr "Featuretypes"
+msgstr "Type opties"
-#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:310
+#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/ExtrusionEntity.cpp:310
+#: src/libslic3r/ExtrusionEntity.cpp:332
msgid "Perimeter"
msgstr "Perimeter"
-#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:311
+#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/ExtrusionEntity.cpp:311
+#: src/libslic3r/ExtrusionEntity.cpp:334
msgid "External perimeter"
msgstr "Buitenste perimeter"
-#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:312
+#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/ExtrusionEntity.cpp:312
+#: src/libslic3r/ExtrusionEntity.cpp:336
msgid "Overhang perimeter"
msgstr "Overhangende perimeter"
-#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:313
+#: src/slic3r/GUI/GUI_Preview.cpp:233 src/libslic3r/ExtrusionEntity.cpp:313
+#: src/libslic3r/ExtrusionEntity.cpp:338
msgid "Internal infill"
msgstr "Inwendige vulling"
-#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:314
-#: src/libslic3r/PrintConfig.cpp:1756 src/libslic3r/PrintConfig.cpp:1767
+#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/ExtrusionEntity.cpp:314
+#: src/libslic3r/ExtrusionEntity.cpp:340 src/libslic3r/PrintConfig.cpp:1956
+#: src/libslic3r/PrintConfig.cpp:1967
msgid "Solid infill"
msgstr "Dichte vulling"
-#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:315
-#: src/libslic3r/PrintConfig.cpp:2105 src/libslic3r/PrintConfig.cpp:2117
+#: src/slic3r/GUI/GUI_Preview.cpp:235 src/libslic3r/ExtrusionEntity.cpp:315
+#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/PrintConfig.cpp:2333
+#: src/libslic3r/PrintConfig.cpp:2345
msgid "Top solid infill"
msgstr "Bovenste dichte vulling"
-#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:316
+#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:317
+#: src/libslic3r/ExtrusionEntity.cpp:346
msgid "Bridge infill"
msgstr "Brugvulling"
-#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:317
-#: src/libslic3r/PrintConfig.cpp:918
+#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:318
+#: src/libslic3r/ExtrusionEntity.cpp:348 src/libslic3r/PrintConfig.cpp:1011
msgid "Gap fill"
msgstr "Gatenvulling"
-#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1171
-#: src/libslic3r/ExtrusionEntity.cpp:318
+#: src/slic3r/GUI/GUI_Preview.cpp:239 src/slic3r/GUI/Tab.cpp:1462
+#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/ExtrusionEntity.cpp:350
msgid "Skirt"
msgstr "Skirt"
-#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:320
-#: src/libslic3r/PrintConfig.cpp:1991
+#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:321
+#: src/libslic3r/ExtrusionEntity.cpp:354 src/libslic3r/PrintConfig.cpp:2218
msgid "Support material interface"
msgstr "Supportinterface"
-#: src/slic3r/GUI/GUI_Preview.cpp:248 src/slic3r/GUI/Tab.cpp:1251
-#: src/libslic3r/ExtrusionEntity.cpp:321
+#: src/slic3r/GUI/GUI_Preview.cpp:242 src/slic3r/GUI/Tab.cpp:1545
+#: src/libslic3r/ExtrusionEntity.cpp:322 src/libslic3r/ExtrusionEntity.cpp:356
msgid "Wipe tower"
msgstr "Afveegblok"
-#: src/slic3r/GUI/GUI_Preview.cpp:253 src/libslic3r/PrintConfig.cpp:2152
-msgid "Travel"
-msgstr "Beweging"
+#: src/slic3r/GUI/GUI_Preview.cpp:1031
+msgid "Shells"
+msgstr "Shells"
-#: src/slic3r/GUI/GUI_Preview.cpp:254
-msgid "Retractions"
-msgstr "Retracties"
+#: src/slic3r/GUI/GUI_Preview.cpp:1032
+msgid "Tool marker"
+msgstr "Toolmarkering"
-#: src/slic3r/GUI/GUI_Preview.cpp:255
-msgid "Unretractions"
-msgstr "Deretracties"
+#: src/slic3r/GUI/GUI_Preview.cpp:1033
+msgid "Legend/Estimated printing time"
+msgstr "Legenda / Geschatte printtijd"
-#: src/slic3r/GUI/GUI_Preview.cpp:256
-msgid "Shells"
-msgstr "Shells"
+#: src/slic3r/GUI/ImGuiWrapper.cpp:804 src/slic3r/GUI/Search.cpp:389
+msgid "Use for search"
+msgstr "Gebruik om te zoeken"
-#: src/slic3r/GUI/GUI_Preview.cpp:257
-msgid "Legend"
-msgstr "Legenda"
+#: src/slic3r/GUI/ImGuiWrapper.cpp:805 src/slic3r/GUI/Search.cpp:383
+msgid "Category"
+msgstr "Categorie"
-#: src/slic3r/GUI/Job.hpp:123
+#: src/slic3r/GUI/ImGuiWrapper.cpp:807 src/slic3r/GUI/Search.cpp:385
+msgid "Search in English"
+msgstr "Zoek in het Engels"
+
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:145
+msgid "Arranging"
+msgstr "Schikken"
+
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:175
+msgid "Could not arrange model objects! Some geometries may be invalid."
+msgstr "Kan modellen niet rangschikken. Sommige vormen kunnen ongeldig zijn."
+
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:181
+msgid "Arranging canceled."
+msgstr "Schikken geannuleerd."
+
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:182
+msgid "Arranging done."
+msgstr "Schikken voltooid."
+
+#: src/slic3r/GUI/Jobs/Job.cpp:75
msgid "ERROR: not enough resources to execute a new job."
msgstr "Fout: niet genoeg middelen om nieuwe job te starten."
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:41 src/slic3r/GUI/MainFrame.cpp:755
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:41
+msgid "Searching for optimal orientation"
+msgstr "Zoeken naar optimale oriëntatie"
+
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:73
+msgid "Orientation search canceled."
+msgstr "Oriëntatie zoeken geannuleerd."
+
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:74
+msgid "Orientation found."
+msgstr "Oriëntatie gevonden."
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:35
+msgid "Choose SLA archive:"
+msgstr "Kies SLA-archief:"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:39
+msgid "Import file"
+msgstr "Importeer bestand"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:46
+msgid "Import model and profile"
+msgstr "Importeerd model en profiel"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47
+msgid "Import profile only"
+msgstr "Importeer alleen profiel"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48
+msgid "Import model only"
+msgstr "Importeer alleen model"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:59
+msgid "Accurate"
+msgstr "Nauwkeurig"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60
+msgid "Balanced"
+msgstr "Gebalanceerd"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61
+msgid "Quick"
+msgstr "Snel"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135
+msgid "Importing SLA archive"
+msgstr "Importeer SLA-archief"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:159
+msgid "Importing canceled."
+msgstr "Importeren geannuleerd."
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:160
+msgid "Importing done."
+msgstr "Succesvol geïmporteerd."
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:208 src/slic3r/GUI/Plater.cpp:2353
+msgid "You cannot load SLA project with a multi-part object on the bed"
+msgstr "U kunt geen SLA-project laden met een meerdelig object op het bed"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:209 src/slic3r/GUI/Plater.cpp:2354
+#: src/slic3r/GUI/Tab.cpp:3243
+msgid "Please check your object list before preset changing."
+msgstr "Controleer de objectenlijst voor het wijzigen van de voorinstelling."
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:17 src/slic3r/GUI/MainFrame.cpp:894
msgid "Keyboard Shortcuts"
msgstr "Sneltoetsen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:112
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:69
msgid "New project, clear plater"
msgstr "Start nieuw project, verwijder modellen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:113
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:70
msgid "Open project STL/OBJ/AMF/3MF with config, clear plater"
msgstr ""
"Open STL-, OBJ-, AMF- of 3MF-project met configuratie, verwijder huidige "
"modellen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:114
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:71
msgid "Save project (3mf)"
msgstr "3MF-project opslaan"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:115
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:72
msgid "Save project as (3mf)"
msgstr "3MF-project opslaan als"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:116
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:73
msgid "(Re)slice"
msgstr "(Her)slice"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:118
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:75
msgid "Import STL/OBJ/AMF/3MF without config, keep plater"
msgstr ""
"Importeer STL-, OBJ-, AMF- of 3MF-bestanden zonder configuratie en behoud "
"modellen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:119
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:76
msgid "Import Config from ini/amf/3mf/gcode"
msgstr "Importeer configuratie van INI-, AMF-, 3MF- of gcode-bestand"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:120
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:77
msgid "Load Config from ini/amf/3mf/gcode and merge"
msgstr ""
"Laad configuratie van INI-, AMF-, 3MF- of gcode-bestanden en voeg samen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 src/slic3r/GUI/Plater.cpp:896
-#: src/slic3r/GUI/Plater.cpp:5546 src/libslic3r/PrintConfig.cpp:3363
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 src/slic3r/GUI/Plater.cpp:770
+#: src/slic3r/GUI/Plater.cpp:6007 src/libslic3r/PrintConfig.cpp:3635
msgid "Export G-code"
msgstr "Exporteer gcode-bestand"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Plater.cpp:5547
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 src/slic3r/GUI/Plater.cpp:6008
msgid "Send G-code"
msgstr "Stuur G-code"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:124
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:81
msgid "Export config"
msgstr "Exporteer configuratie"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:125 src/slic3r/GUI/Plater.cpp:885
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:82 src/slic3r/GUI/Plater.cpp:758
msgid "Export to SD card / Flash drive"
msgstr "Exporteer naar SD-kaart / USB-stick"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:126
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:83
msgid "Eject SD card / Flash drive"
msgstr "SD-kaart/USB-stick uitwerpen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:128
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:85
msgid "Select all objects"
msgstr "Selecteer alle objecten"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:129
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:86
msgid "Deselect all"
msgstr "Deselecteer alles"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:130
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:87
msgid "Delete selected"
msgstr "Deselecteer selectie"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:134
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:91
msgid "Copy to clipboard"
msgstr "Kopieer naar klembord"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:135
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:92
msgid "Paste from clipboard"
msgstr "Plak van klembord"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:136
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:94
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:96
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:187
msgid "Reload plater from disk"
msgstr "Herlaad modellen van schijf"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:138
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:100
msgid "Select Plater Tab"
msgstr "Selecteer 3D-weergave"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:139
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:101
msgid "Select Print Settings Tab"
msgstr "Selecteer printinstellingentab"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:140
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:102
msgid "Select Filament Settings Tab"
msgstr "Selecteer filamentinstellingentab"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:141
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:103
msgid "Select Printer Settings Tab"
msgstr "Selecteer printerinstellingentab"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:142
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:104
msgid "Switch to 3D"
msgstr "Schakel over naar 3D"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:143
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:105
msgid "Switch to Preview"
msgstr "Schakel over naar voorbeeldweergave"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:144
-#: src/slic3r/GUI/PrintHostDialogs.cpp:136
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:106
+#: src/slic3r/GUI/PrintHostDialogs.cpp:165
msgid "Print host upload queue"
msgstr "Printhost uploadwachtrij"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:146
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 src/slic3r/GUI/MainFrame.cpp:65
+#: src/slic3r/GUI/MainFrame.cpp:1191
+msgid "Open new instance"
+msgstr "Open nieuw venster"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:109
msgid "Camera view"
msgstr "Weergave"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:148
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:110
msgid "Show/Hide object/instance labels"
msgstr "Toon/verberg objecten- of instantielabels"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:151 src/slic3r/GUI/Preferences.cpp:10
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 src/slic3r/GUI/Preferences.cpp:13
msgid "Preferences"
msgstr "Voorkeuren"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:153
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:114
msgid "Show keyboard shortcuts list"
msgstr "Toon lijst met sneltoetsen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:156
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:117
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:191
msgid "Commands"
-msgstr "Commando's"
+msgstr "Opdrachten"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:161
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:122
msgid "Add Instance of the selected object"
msgstr "Voeg instantie van het geselecteerde object toe"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:162
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:123
msgid "Remove Instance of the selected object"
msgstr "Verwijder instanties van het geselecteerde object"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:124
msgid ""
"Press to select multiple objects\n"
"or move multiple objects with mouse"
@@ -3258,122 +4095,136 @@ msgstr ""
"Druk om meerdere objecten te selecteren\n"
"of beweeg meerdere objecten met de muis"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:125
msgid "Press to activate selection rectangle"
msgstr "Druk om selectiebox te activeren"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:126
msgid "Press to activate deselection rectangle"
msgstr "Druk om deselectiebox te activeren"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:206
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:127
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:196
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:226
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:243
msgid "Arrow Up"
msgstr "Pijltje naar boven"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:127
msgid "Move selection 10 mm in positive Y direction"
msgstr "Verplaats selectie +10 mm in Y-richting"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:128
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:197
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:220
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:227
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:244
msgid "Arrow Down"
msgstr "Pijltje naar beneden"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:128
msgid "Move selection 10 mm in negative Y direction"
msgstr "Verplaats selectie -10 mm in Y-richting"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:129
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:198
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:221
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:228
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:241
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:246
msgid "Arrow Left"
msgstr "Pijltje naar links"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:129
msgid "Move selection 10 mm in negative X direction"
msgstr "Verplaats selectie -10 mm in X-richting"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:130
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:199
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:229
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:242
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:247
msgid "Arrow Right"
msgstr "Pijltje naar rechts"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:130
msgid "Move selection 10 mm in positive X direction"
msgstr "Verplaats selectie +10 mm in X-richting"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:131
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:132
msgid "Any arrow"
msgstr "Elke pijl"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:131
msgid "Movement step set to 1 mm"
msgstr "Verplaatsingsstap instellen op 1 mm"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:132
msgid "Movement in camera space"
msgstr "Verplaatsing in cameraruimte"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:172
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:133
msgid "Page Up"
msgstr "Page Up"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:172
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:133
msgid "Rotate selection 45 degrees CCW"
msgstr "Roteer selectie 45° tegen de klok in"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:173
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:134
msgid "Page Down"
msgstr "Page Down"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:173
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:134
msgid "Rotate selection 45 degrees CW"
msgstr "Roteer selectie 45° met de klok mee"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:174
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:135
msgid "Gizmo move"
msgstr "Verplaats"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:136
msgid "Gizmo scale"
msgstr "Verschaal"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:176
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:137
msgid "Gizmo rotate"
msgstr "Roteer"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:177
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:138
msgid "Gizmo cut"
msgstr "Snijden"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:178
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:139
msgid "Gizmo Place face on bed"
msgstr "Plaats vlak op bed"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:140
msgid "Gizmo SLA hollow"
msgstr "SLA uithollen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:180
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:141
msgid "Gizmo SLA support points"
msgstr "SLA-supportpunten"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:181
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:142
msgid "Unselect gizmo or clear selection"
msgstr "Deselecteer bewerker of selectie"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:182
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:143
msgid "Change camera type (perspective, orthographic)"
msgstr "Wijzig weergavetype (perspectief of orthografisch)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:183
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:144
msgid "Zoom to Bed"
msgstr "Zoom in op bed"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:184
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:145
msgid ""
"Zoom to selected object\n"
"or all objects in scene, if none selected"
@@ -3381,1015 +4232,1504 @@ msgstr ""
"Zoom in op geselecteerde objecten\n"
"of alle objecten in de 3D-weergave als niets is geselecteerd"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:185
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:146
msgid "Zoom in"
msgstr "Zoom in"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:186
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:147
msgid "Zoom out"
msgstr "Zoom uit"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:187
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:148
+msgid "Switch between Editor/Preview"
+msgstr "Schakel tussen bewerken / voorbeeldweergave"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:149
+msgid "Collapse/Expand the sidebar"
+msgstr "Klap de zijbalk in/uit"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:152
+msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled"
+msgstr ""
+"Toon/verberg 3DConnexion-apparaten-instellingenvenster als dit aanstaat"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:154
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:158
msgid "Show/Hide 3Dconnexion devices settings dialog"
msgstr "Toon/verberg het dialoogvenster van 3Dconnexion-apparaatinstellingen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:194 src/slic3r/GUI/MainFrame.cpp:222
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 src/slic3r/GUI/MainFrame.cpp:331
+#: src/slic3r/GUI/MainFrame.cpp:343
msgid "Plater"
msgstr "3D-weergave"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:197
-#, no-c-format
-msgid ""
-"Press to snap by 5% in Gizmo scale\n"
-"or to snap by 1mm in Gizmo move"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
+msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button"
+msgstr "Alle bewerkingen: roteer - linkermuisknop, beweeg - rechtermuisknop"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
+msgid "Gizmo move: Press to snap by 1mm"
+msgstr "Bewerken: Druk om te snappen per 1mm"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:172
+msgid "Gizmo scale: Press to snap by 5%"
+msgstr "Verschalen: Druk om te snappen per 5%"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:173
+msgid "Gizmo scale: Scale selection to fit print volume"
+msgstr "Verschalen: Verschaal selectie tot het past in het printvolume"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:174
+msgid "Gizmo scale: Press to activate one direction scaling"
+msgstr "Verschalen: Druk om in een enkele richting te verschalen"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
+msgid "Gizmo scale: Press to scale selected objects around their own center"
msgstr ""
-"Druk om stapsgewijs per 5% te verschalen\n"
-"of om per 1 mm te verplaatsen"
+"Verschalen: Druk om geselecteerde modellen rond hun eigen middelpunt te "
+"verschalen"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:198
-msgid ""
-"Scale selection to fit print volume\n"
-"in Gizmo scale"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:176
+msgid "Gizmo rotate: Press to rotate selected objects around their own center"
msgstr ""
-"Zorg dat selectie past in het printvolume\n"
-"door deze te verschalen"
+"Roteren: Druk om geselecteerde modellen rond hun eigen middelpunt te draaien"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:199
-msgid "Press to activate one direction scaling in Gizmo scale"
-msgstr "Druk in om verschaling toepassen in één richting te activeren"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+msgid "Gizmos"
+msgstr "Bewerkers"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:200
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
msgid ""
-"Press to scale (in Gizmo scale) or rotate (in Gizmo rotate)\n"
-"selected objects around their own center"
+"The following shortcuts are applicable when the specified gizmo is active"
msgstr ""
-"Druk om de selectie te verschalen of roteren\n"
-"om hun eigen middelpunt"
+"De volgende sneltoetsen zijn van toepassing als de specifieke bewerking "
+"actief is"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 src/slic3r/GUI/MainFrame.cpp:1244
+msgid "Open a G-code file"
+msgstr "Open een G-code-bestand"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 src/slic3r/GUI/MainFrame.cpp:1142
+#: src/slic3r/GUI/MainFrame.cpp:1146 src/slic3r/GUI/MainFrame.cpp:1249
+#: src/slic3r/GUI/MainFrame.cpp:1253
+msgid "Reload the plater from disk"
+msgstr "Herlaad modellen van schijf"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:196
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:200
+msgid "Vertical slider - Move active thumb Up"
+msgstr "Verticale schuif - verplaats actieve schuif naar boven"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:197
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:201
+msgid "Vertical slider - Move active thumb Down"
+msgstr "Verticale schuif - verplaats actieve schuif naar beneden"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:198
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:202
+msgid "Horizontal slider - Move active thumb Left"
+msgstr "Horizontale schuif - verplaats actieve schuif naar links"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:199
#: src/slic3r/GUI/KBShortcutsDialog.cpp:203
-msgid "Gizmos"
-msgstr "Bewerkers"
+msgid "Horizontal slider - Move active thumb Right"
+msgstr "Horizontale schuif - verplaats actieve schuif naar rechts"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:204
+msgid "On/Off one layer mode of the vertical slider"
+msgstr "Zet eenlaagsmodus aan/uit van de verticale schuif"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
+msgid "Show/Hide Legend and Estimated printing time"
+msgstr "Toon/verberg legenda en geschatte printtijd"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
+msgid "Upper layer"
+msgstr "Bovenste laag"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:206
#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
+msgid "Lower layer"
+msgstr "Verklein laag"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:209
msgid "Upper Layer"
msgstr "Bovenste laag"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:209
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:210
msgid "Lower Layer"
msgstr "Onderste laag"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:210
-msgid "Show/Hide Legend"
-msgstr "Toon/verberg legenda"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:211
+msgid "Show/Hide Legend & Estimated printing time"
+msgstr "Toon/verberg legenda & geschatte printtijd"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 src/slic3r/GUI/Plater.cpp:4157
-#: src/slic3r/GUI/Tab.cpp:2374
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 src/slic3r/GUI/Plater.cpp:4152
+#: src/slic3r/GUI/Tab.cpp:2602
msgid "Preview"
msgstr "Voorbeeldweergave"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+msgid "Move active thumb Up"
+msgstr "Verplaats actieve schuif naar boven"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:220
+msgid "Move active thumb Down"
+msgstr "Verplaats actieve schuif naar beneden"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:221
+msgid "Set upper thumb as active"
+msgstr "Activeer bovenste schuif"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
+msgid "Set lower thumb as active"
+msgstr "Activeer onderste schuif"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:223
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:230
+msgid "Add color change marker for current layer"
+msgstr "Kleurwisselmarkering voor de huidige laag toevoegen"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:224
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:231
+msgid "Delete color change marker for current layer"
+msgstr "Verwijder kleurwisselmarkering voor de huidige laag"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:226
msgid "Move current slider thumb Up"
msgstr "Verplaats huidige schuif naar boven"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:227
msgid "Move current slider thumb Down"
msgstr "Verplaats huidige schuif naar beneden"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:228
msgid "Set upper thumb to current slider thumb"
msgstr "Stel de bovenste schuif in op het huidige punt"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:229
msgid "Set lower thumb to current slider thumb"
msgstr "Stel de onderste schuif in op het huidige punt"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:220
-msgid "Add color change marker for current layer"
-msgstr "Voeg kleurwisseling toe voor de huidige laag"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:233
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:234
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:249
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:250
+msgid ""
+"Press to speed up 5 times while moving thumb\n"
+"with arrow keys or mouse wheel"
+msgstr ""
+"Druk om 5x zo snel te gaan bij het verplaatsen van de schuif\n"
+"met pijltjestoetsen of het scrollwieltje"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:221
-msgid "Delete color change marker for current layer"
-msgstr "Verwijder kleurwisseling voor de huidige laag"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:237
+msgid "Vertical Slider"
+msgstr "Verticale schuif"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:224
-msgid "Layers Slider"
-msgstr "Schuif voor lagen"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:237
+msgid ""
+"The following shortcuts are applicable in G-code preview when the vertical "
+"slider is active"
+msgstr ""
+"De volgende sneltoetsen zijn van toepassing in de G-code preview als de "
+"verticale schuif actief is"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:241
+msgid "Move active thumb Left"
+msgstr "Verplaats actieve schuif naar links"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:242
+msgid "Move active thumb Right"
+msgstr "Verplaats actieve schuif naar rechts"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:243
+msgid "Set left thumb as active"
+msgstr "Activeer linker schuif"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:244
+msgid "Set right thumb as active"
+msgstr "Activeer rechter schuif"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:246
+msgid "Move active slider thumb Left"
+msgstr "Verplaats actieve schuif naar links"
#: src/slic3r/GUI/KBShortcutsDialog.cpp:247
+msgid "Move active slider thumb Right"
+msgstr "Verplaats actieve schuif naar rechts"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:253
+msgid "Horizontal Slider"
+msgstr "Horizontale schuif"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:253
+msgid ""
+"The following shortcuts are applicable in G-code preview when the horizontal "
+"slider is active"
+msgstr ""
+"De volgende sneltoetsen zijn van toepassing in de G-code preview als de "
+"horizontale schuif actief is"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:276
msgid "Keyboard shortcuts"
msgstr "Sneltoetsen"
-#: src/slic3r/GUI/MainFrame.cpp:67
+#: src/slic3r/GUI/MainFrame.cpp:65 src/slic3r/GUI/MainFrame.cpp:79
+#: src/slic3r/GUI/MainFrame.cpp:1191
+msgid "Open a new PrusaSlicer instance"
+msgstr "Open een PrusaSlicer venster"
+
+#: src/slic3r/GUI/MainFrame.cpp:68 src/slic3r/GUI/MainFrame.cpp:81
+msgid "G-code preview"
+msgstr "G-code preview"
+
+#: src/slic3r/GUI/MainFrame.cpp:68 src/slic3r/GUI/MainFrame.cpp:1091
+msgid "Open G-code viewer"
+msgstr "Open de G-code weergave"
+
+#: src/slic3r/GUI/MainFrame.cpp:79 src/slic3r/GUI/MainFrame.cpp:1260
+msgid "Open PrusaSlicer"
+msgstr "Open PrusaSlicer"
+
+#: src/slic3r/GUI/MainFrame.cpp:81
+msgid "Open new G-code viewer"
+msgstr "Open G-code weergave"
+
+#: src/slic3r/GUI/MainFrame.cpp:153
msgid ""
-" - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/"
+"Remember to check for updates at https://github.com/prusa3d/PrusaSlicer/"
"releases"
msgstr ""
-" - Vergeet niet op updates te checken op http://github.com/prusa3d/"
+"Vergeet niet op updates te controleren op https://github.com/prusa3d/"
"PrusaSlicer/releases"
-#: src/slic3r/GUI/MainFrame.cpp:192
+#: src/slic3r/GUI/MainFrame.cpp:510
msgid "based on Slic3r"
msgstr "gebaseerd op Slic3r"
-#: src/slic3r/GUI/MainFrame.cpp:444
+#: src/slic3r/GUI/MainFrame.cpp:866
+msgid "Prusa 3D &Drivers"
+msgstr "Prusa 3D-stuurprogramma"
+
+#: src/slic3r/GUI/MainFrame.cpp:866
+msgid "Open the Prusa3D drivers download page in your browser"
+msgstr "Open de Prusa3D drivers-downloadpagina in uw browser"
+
+#: src/slic3r/GUI/MainFrame.cpp:868
+msgid "Software &Releases"
+msgstr "Laatste versie downloaden"
+
+#: src/slic3r/GUI/MainFrame.cpp:868
+msgid "Open the software releases page in your browser"
+msgstr "Download de laatste softwareversie vanuit uw browser"
+
+#: src/slic3r/GUI/MainFrame.cpp:874
+#, c-format
+msgid "%s &Website"
+msgstr "%s-&website"
+
+#: src/slic3r/GUI/MainFrame.cpp:875
+#, c-format
+msgid "Open the %s website in your browser"
+msgstr "Open de %s website in uw browser"
+
+#: src/slic3r/GUI/MainFrame.cpp:881
+msgid "System &Info"
+msgstr "Systeeminfo"
+
+#: src/slic3r/GUI/MainFrame.cpp:881
+msgid "Show system information"
+msgstr "Toon systeeminformatie"
+
+#: src/slic3r/GUI/MainFrame.cpp:883
+msgid "Show &Configuration Folder"
+msgstr "Toon configuratiemap"
+
+#: src/slic3r/GUI/MainFrame.cpp:883
+msgid "Show user configuration folder (datadir)"
+msgstr "Toon gebruikersconfiguratiemap (datadir)"
+
+#: src/slic3r/GUI/MainFrame.cpp:885
+msgid "Report an I&ssue"
+msgstr "Rapporteer een fout"
+
+#: src/slic3r/GUI/MainFrame.cpp:885
+#, c-format
+msgid "Report an issue on %s"
+msgstr "Rapporteer een fout op %s"
+
+#: src/slic3r/GUI/MainFrame.cpp:888 src/slic3r/GUI/MainFrame.cpp:891
+#, c-format
+msgid "&About %s"
+msgstr "&Over %s"
+
+#: src/slic3r/GUI/MainFrame.cpp:888 src/slic3r/GUI/MainFrame.cpp:891
+msgid "Show about dialog"
+msgstr "Toon Over-dialoogvenster"
+
+#: src/slic3r/GUI/MainFrame.cpp:894
+msgid "Show the list of the keyboard shortcuts"
+msgstr "Toon de lijst met sneltoetsen"
+
+#: src/slic3r/GUI/MainFrame.cpp:908
+msgid "Iso"
+msgstr "Isometrisch"
+
+#: src/slic3r/GUI/MainFrame.cpp:908
+msgid "Iso View"
+msgstr "Isometrisch aanzicht"
+
+#. TRN To be shown in the main menu View->Top
+#. TRN To be shown in Print Settings "Top solid layers"
+#: src/slic3r/GUI/MainFrame.cpp:912 src/libslic3r/PrintConfig.cpp:2360
+#: src/libslic3r/PrintConfig.cpp:2369
+msgid "Top"
+msgstr "Bovenkant"
+
+#: src/slic3r/GUI/MainFrame.cpp:912
+msgid "Top View"
+msgstr "Bovenaanzicht"
+
+#. TRN To be shown in the main menu View->Bottom
+#. TRN To be shown in Print Settings "Bottom solid layers"
+#. TRN To be shown in Print Settings "Top solid layers"
+#: src/slic3r/GUI/MainFrame.cpp:915 src/libslic3r/PrintConfig.cpp:230
+#: src/libslic3r/PrintConfig.cpp:239
+msgid "Bottom"
+msgstr "Onderkant"
+
+#: src/slic3r/GUI/MainFrame.cpp:915
+msgid "Bottom View"
+msgstr "Onderaanzicht"
+
+#: src/slic3r/GUI/MainFrame.cpp:917
+msgid "Front"
+msgstr "Voorkant"
+
+#: src/slic3r/GUI/MainFrame.cpp:917
+msgid "Front View"
+msgstr "Vooraanzicht"
+
+#: src/slic3r/GUI/MainFrame.cpp:919 src/libslic3r/PrintConfig.cpp:1845
+msgid "Rear"
+msgstr "Achterzijde"
+
+#: src/slic3r/GUI/MainFrame.cpp:919
+msgid "Rear View"
+msgstr "Achteraanzicht"
+
+#: src/slic3r/GUI/MainFrame.cpp:921
+msgid "Left"
+msgstr "Links"
+
+#: src/slic3r/GUI/MainFrame.cpp:921
+msgid "Left View"
+msgstr "Linkerzijaanzicht"
+
+#: src/slic3r/GUI/MainFrame.cpp:923
+msgid "Right"
+msgstr "Rechts"
+
+#: src/slic3r/GUI/MainFrame.cpp:923
+msgid "Right View"
+msgstr "Rechterzijaanzicht"
+
+#: src/slic3r/GUI/MainFrame.cpp:936
msgid "&New Project"
msgstr "Nieuw project"
-#: src/slic3r/GUI/MainFrame.cpp:444
+#: src/slic3r/GUI/MainFrame.cpp:936
msgid "Start a new project"
msgstr "Start nieuw project"
-#: src/slic3r/GUI/MainFrame.cpp:447
+#: src/slic3r/GUI/MainFrame.cpp:939
msgid "&Open Project"
msgstr "Open project"
-#: src/slic3r/GUI/MainFrame.cpp:447
+#: src/slic3r/GUI/MainFrame.cpp:939
msgid "Open a project file"
msgstr "Open een projectbestand"
-#: src/slic3r/GUI/MainFrame.cpp:452
+#: src/slic3r/GUI/MainFrame.cpp:944
msgid "Recent projects"
msgstr "Huidige projecten"
-#: src/slic3r/GUI/MainFrame.cpp:461
+#: src/slic3r/GUI/MainFrame.cpp:953
msgid ""
"The selected project is no longer available.\n"
"Do you want to remove it from the recent projects list?"
msgstr ""
"Het geselecteerde project is niet langer beschikbaar.\n"
-"Wilt u het verwijderen uit de lijst met recente projecten?"
+"Wil je het verwijderen uit de lijst met recente projecten?"
-#: src/slic3r/GUI/MainFrame.cpp:461 src/slic3r/GUI/MainFrame.cpp:832
-#: src/slic3r/GUI/PrintHostDialogs.cpp:231
+#: src/slic3r/GUI/MainFrame.cpp:953 src/slic3r/GUI/MainFrame.cpp:1343
+#: src/slic3r/GUI/PrintHostDialogs.cpp:263
msgid "Error"
msgstr "Fout"
-#: src/slic3r/GUI/MainFrame.cpp:486
+#: src/slic3r/GUI/MainFrame.cpp:978
msgid "&Save Project"
msgstr "Project opslaan"
-#: src/slic3r/GUI/MainFrame.cpp:486
+#: src/slic3r/GUI/MainFrame.cpp:978
msgid "Save current project file"
msgstr "Projectbestand opslaan"
-#: src/slic3r/GUI/MainFrame.cpp:490 src/slic3r/GUI/MainFrame.cpp:492
+#: src/slic3r/GUI/MainFrame.cpp:982 src/slic3r/GUI/MainFrame.cpp:984
msgid "Save Project &as"
msgstr "Project opslaan als"
-#: src/slic3r/GUI/MainFrame.cpp:490 src/slic3r/GUI/MainFrame.cpp:492
+#: src/slic3r/GUI/MainFrame.cpp:982 src/slic3r/GUI/MainFrame.cpp:984
msgid "Save current project file as"
msgstr "Projectbestand opslaan als"
-#: src/slic3r/GUI/MainFrame.cpp:500
+#: src/slic3r/GUI/MainFrame.cpp:992
msgid "Import STL/OBJ/AM&F/3MF"
msgstr "Importeer STL-, OBJ-, AMF- of 3MF-bestanden"
-#: src/slic3r/GUI/MainFrame.cpp:500
+#: src/slic3r/GUI/MainFrame.cpp:992
msgid "Load a model"
msgstr "Laad een model"
-#: src/slic3r/GUI/MainFrame.cpp:504
+#: src/slic3r/GUI/MainFrame.cpp:996
+msgid "Import STL (imperial units)"
+msgstr "Importeer STL (Engelse eenheden)"
+
+#: src/slic3r/GUI/MainFrame.cpp:996
+msgid "Load an model saved with imperial units"
+msgstr "Laad een model dat is opgeslagen met Engelse eenheden"
+
+#: src/slic3r/GUI/MainFrame.cpp:1000
+msgid "Import SL1 archive"
+msgstr "Importeer SL1-archief"
+
+#: src/slic3r/GUI/MainFrame.cpp:1000
+msgid "Load an SL1 archive"
+msgstr "Laad een SL1-archief"
+
+#: src/slic3r/GUI/MainFrame.cpp:1005
msgid "Import &Config"
msgstr "Importeer configuratiebestand"
-#: src/slic3r/GUI/MainFrame.cpp:504
+#: src/slic3r/GUI/MainFrame.cpp:1005
msgid "Load exported configuration file"
msgstr "Laad geëxporteerd configuratiebestand"
-#: src/slic3r/GUI/MainFrame.cpp:507
+#: src/slic3r/GUI/MainFrame.cpp:1008
msgid "Import Config from &project"
msgstr "Importeer configuratie van projectbestand"
-#: src/slic3r/GUI/MainFrame.cpp:507
+#: src/slic3r/GUI/MainFrame.cpp:1008
msgid "Load configuration from project file"
msgstr "Laad configuratie van projectbestand"
-#: src/slic3r/GUI/MainFrame.cpp:511
+#: src/slic3r/GUI/MainFrame.cpp:1012
msgid "Import Config &Bundle"
msgstr "Importeer configuratiebundel"
-#: src/slic3r/GUI/MainFrame.cpp:511
+#: src/slic3r/GUI/MainFrame.cpp:1012
msgid "Load presets from a bundle"
-msgstr "Laad presets van een bundel"
+msgstr "Laad voorinstellingen van een bundel"
-#: src/slic3r/GUI/MainFrame.cpp:514
+#: src/slic3r/GUI/MainFrame.cpp:1015
msgid "&Import"
msgstr "Importeer"
-#: src/slic3r/GUI/MainFrame.cpp:517 src/slic3r/GUI/MainFrame.cpp:796
+#: src/slic3r/GUI/MainFrame.cpp:1018 src/slic3r/GUI/MainFrame.cpp:1305
msgid "Export &G-code"
msgstr "Exporteer G-code"
-#: src/slic3r/GUI/MainFrame.cpp:517
+#: src/slic3r/GUI/MainFrame.cpp:1018
msgid "Export current plate as G-code"
msgstr "Exporteer modellen als gcode-bestand"
-#: src/slic3r/GUI/MainFrame.cpp:521 src/slic3r/GUI/MainFrame.cpp:797
+#: src/slic3r/GUI/MainFrame.cpp:1022 src/slic3r/GUI/MainFrame.cpp:1306
msgid "S&end G-code"
msgstr "Stuur G-code"
-#: src/slic3r/GUI/MainFrame.cpp:521
+#: src/slic3r/GUI/MainFrame.cpp:1022
msgid "Send to print current plate as G-code"
msgstr "Stuur huidige weergave als G-code"
-#: src/slic3r/GUI/MainFrame.cpp:525
+#: src/slic3r/GUI/MainFrame.cpp:1026
msgid "Export G-code to SD card / Flash drive"
msgstr "Exporteer G-code naar SD-kaart/USB-stick"
-#: src/slic3r/GUI/MainFrame.cpp:525
+#: src/slic3r/GUI/MainFrame.cpp:1026
msgid "Export current plate as G-code to SD card / Flash drive"
msgstr "Exporteer huidige weergave als G-code naar SD-kaart/USB-stick"
-#: src/slic3r/GUI/MainFrame.cpp:529
+#: src/slic3r/GUI/MainFrame.cpp:1030
msgid "Export plate as &STL"
msgstr "Exporteer modellen als STL-bestand"
-#: src/slic3r/GUI/MainFrame.cpp:529
+#: src/slic3r/GUI/MainFrame.cpp:1030
msgid "Export current plate as STL"
msgstr "Exporteer modellen als STL-bestand"
-#: src/slic3r/GUI/MainFrame.cpp:532
+#: src/slic3r/GUI/MainFrame.cpp:1033
msgid "Export plate as STL &including supports"
msgstr "Exporteer modellen met support als STL-bestand"
-#: src/slic3r/GUI/MainFrame.cpp:532
+#: src/slic3r/GUI/MainFrame.cpp:1033
msgid "Export current plate as STL including supports"
msgstr "Exporteer modellen met support als STL-bestand"
-#: src/slic3r/GUI/MainFrame.cpp:535
+#: src/slic3r/GUI/MainFrame.cpp:1036
msgid "Export plate as &AMF"
msgstr "Exporteer modellen als AMF-bestand"
-#: src/slic3r/GUI/MainFrame.cpp:535
+#: src/slic3r/GUI/MainFrame.cpp:1036
msgid "Export current plate as AMF"
msgstr "Exporteer modellen als AMF-bestand"
-#: src/slic3r/GUI/MainFrame.cpp:539
+#: src/slic3r/GUI/MainFrame.cpp:1040 src/slic3r/GUI/MainFrame.cpp:1257
msgid "Export &toolpaths as OBJ"
-msgstr "Exporteer paden als OBJ-bestand"
+msgstr "Exporteer &toolpaden als OBJ-bestand"
-#: src/slic3r/GUI/MainFrame.cpp:539
+#: src/slic3r/GUI/MainFrame.cpp:1040 src/slic3r/GUI/MainFrame.cpp:1257
msgid "Export toolpaths as OBJ"
msgstr "Exporteer toolpaden als OBJ-bestand"
-#: src/slic3r/GUI/MainFrame.cpp:543
+#: src/slic3r/GUI/MainFrame.cpp:1044
msgid "Export &Config"
msgstr "Exporteer configuratie"
-#: src/slic3r/GUI/MainFrame.cpp:543
+#: src/slic3r/GUI/MainFrame.cpp:1044
msgid "Export current configuration to file"
msgstr "Exporteer huidige configuratie naar bestand"
-#: src/slic3r/GUI/MainFrame.cpp:546
+#: src/slic3r/GUI/MainFrame.cpp:1047
msgid "Export Config &Bundle"
msgstr "Exporteer configuratiebundel"
-#: src/slic3r/GUI/MainFrame.cpp:546
+#: src/slic3r/GUI/MainFrame.cpp:1047
msgid "Export all presets to file"
-msgstr "Exporteer alle presets naar bestand"
+msgstr "Exporteer alle voorinstellingen"
+
+#: src/slic3r/GUI/MainFrame.cpp:1050
+msgid "Export Config Bundle With Physical Printers"
+msgstr "Exporteer configuratiebundel met fysieke printers"
+
+#: src/slic3r/GUI/MainFrame.cpp:1050
+msgid "Export all presets including physical printers to file"
+msgstr ""
+"Exporteer alle voorinstellingen, inclusief fysieke printers naar bestand"
-#: src/slic3r/GUI/MainFrame.cpp:549
+#: src/slic3r/GUI/MainFrame.cpp:1053
msgid "&Export"
msgstr "Exporteer"
-#: src/slic3r/GUI/MainFrame.cpp:551
+#: src/slic3r/GUI/MainFrame.cpp:1055
msgid "Ejec&t SD card / Flash drive"
msgstr "SD-kaart/USB-stick uitwerpen"
-#: src/slic3r/GUI/MainFrame.cpp:551
+#: src/slic3r/GUI/MainFrame.cpp:1055
msgid "Eject SD card / Flash drive after the G-code was exported to it."
msgstr "SD-kaart/USB-stick uitwerpen nadat de G-code geëxporteerd is."
-#: src/slic3r/GUI/MainFrame.cpp:559
+#: src/slic3r/GUI/MainFrame.cpp:1063
msgid "Quick Slice"
msgstr "Snel slicen"
-#: src/slic3r/GUI/MainFrame.cpp:559
+#: src/slic3r/GUI/MainFrame.cpp:1063
msgid "Slice a file into a G-code"
msgstr "Slice naar een gcode-bestand"
-#: src/slic3r/GUI/MainFrame.cpp:565
+#: src/slic3r/GUI/MainFrame.cpp:1069
msgid "Quick Slice and Save As"
msgstr "Snel slicen en opslaan als"
-#: src/slic3r/GUI/MainFrame.cpp:565
+#: src/slic3r/GUI/MainFrame.cpp:1069
msgid "Slice a file into a G-code, save as"
msgstr "Slice naar gcode-bestand, opslaan als"
-#: src/slic3r/GUI/MainFrame.cpp:571
+#: src/slic3r/GUI/MainFrame.cpp:1075
msgid "Repeat Last Quick Slice"
msgstr "Herhaal laatste snelle slice"
-#: src/slic3r/GUI/MainFrame.cpp:571
+#: src/slic3r/GUI/MainFrame.cpp:1075
msgid "Repeat last quick slice"
msgstr "Herhaal laatste snelle slice"
-#: src/slic3r/GUI/MainFrame.cpp:579
+#: src/slic3r/GUI/MainFrame.cpp:1083
msgid "(Re)Slice No&w"
-msgstr "(Her)slice nu"
+msgstr "(&Her)slice nu"
-#: src/slic3r/GUI/MainFrame.cpp:579
+#: src/slic3r/GUI/MainFrame.cpp:1083
msgid "Start new slicing process"
msgstr "Start nieuw sliceproces"
-#: src/slic3r/GUI/MainFrame.cpp:583
+#: src/slic3r/GUI/MainFrame.cpp:1087
msgid "&Repair STL file"
-msgstr "Repareer STL-bestand"
+msgstr "&Repareer STL-bestand"
-#: src/slic3r/GUI/MainFrame.cpp:583
+#: src/slic3r/GUI/MainFrame.cpp:1087
msgid "Automatically repair an STL file"
msgstr "Automatisch een STL-bestand repareren"
-#: src/slic3r/GUI/MainFrame.cpp:587
+#: src/slic3r/GUI/MainFrame.cpp:1091
+msgid "&G-code preview"
+msgstr "&G-code preview"
+
+#: src/slic3r/GUI/MainFrame.cpp:1094 src/slic3r/GUI/MainFrame.cpp:1264
msgid "&Quit"
msgstr "Afsluiten"
-#: src/slic3r/GUI/MainFrame.cpp:587
+#: src/slic3r/GUI/MainFrame.cpp:1094 src/slic3r/GUI/MainFrame.cpp:1264
#, c-format
msgid "Quit %s"
msgstr "%s afsluiten"
-#: src/slic3r/GUI/MainFrame.cpp:612
+#: src/slic3r/GUI/MainFrame.cpp:1109
msgid "&Select all"
msgstr "Selecteer alles"
-#: src/slic3r/GUI/MainFrame.cpp:613
+#: src/slic3r/GUI/MainFrame.cpp:1110
msgid "Selects all objects"
msgstr "Selecteer alle objecten"
-#: src/slic3r/GUI/MainFrame.cpp:615
+#: src/slic3r/GUI/MainFrame.cpp:1112
msgid "D&eselect all"
msgstr "Deselecteer alles"
-#: src/slic3r/GUI/MainFrame.cpp:616
+#: src/slic3r/GUI/MainFrame.cpp:1113
msgid "Deselects all objects"
msgstr "Deselecteer alle objecten"
-#: src/slic3r/GUI/MainFrame.cpp:619
+#: src/slic3r/GUI/MainFrame.cpp:1116
msgid "&Delete selected"
msgstr "Deselecteer selectie"
-#: src/slic3r/GUI/MainFrame.cpp:620
+#: src/slic3r/GUI/MainFrame.cpp:1117
msgid "Deletes the current selection"
msgstr "Verwijdert huidige selectie"
-#: src/slic3r/GUI/MainFrame.cpp:622
+#: src/slic3r/GUI/MainFrame.cpp:1119
msgid "Delete &all"
msgstr "Verwijder alles"
-#: src/slic3r/GUI/MainFrame.cpp:623
+#: src/slic3r/GUI/MainFrame.cpp:1120
msgid "Deletes all objects"
msgstr "Verwijdert alle objecten"
-#: src/slic3r/GUI/MainFrame.cpp:627
+#: src/slic3r/GUI/MainFrame.cpp:1124
msgid "&Undo"
msgstr "Ongedaan maken"
-#: src/slic3r/GUI/MainFrame.cpp:630
+#: src/slic3r/GUI/MainFrame.cpp:1127
msgid "&Redo"
-msgstr "Opnieuw doen"
+msgstr "Doe opnieuw"
-#: src/slic3r/GUI/MainFrame.cpp:635
+#: src/slic3r/GUI/MainFrame.cpp:1132
msgid "&Copy"
msgstr "Kopieer"
-#: src/slic3r/GUI/MainFrame.cpp:636
+#: src/slic3r/GUI/MainFrame.cpp:1133
msgid "Copy selection to clipboard"
msgstr "Kopieer selectie naar klembord"
-#: src/slic3r/GUI/MainFrame.cpp:638
+#: src/slic3r/GUI/MainFrame.cpp:1135
msgid "&Paste"
msgstr "Plak"
-#: src/slic3r/GUI/MainFrame.cpp:639
+#: src/slic3r/GUI/MainFrame.cpp:1136
msgid "Paste clipboard"
msgstr "Plak van klembord"
-#: src/slic3r/GUI/MainFrame.cpp:643
+#: src/slic3r/GUI/MainFrame.cpp:1141 src/slic3r/GUI/MainFrame.cpp:1145
+#: src/slic3r/GUI/MainFrame.cpp:1248 src/slic3r/GUI/MainFrame.cpp:1252
msgid "Re&load from disk"
msgstr "Herlaad van schijf"
-#: src/slic3r/GUI/MainFrame.cpp:644
-msgid "Reload the plater from disk"
-msgstr "Herlaad modellen van schijf"
+#: src/slic3r/GUI/MainFrame.cpp:1151
+msgid "Searc&h"
+msgstr "Zoek"
+
+#: src/slic3r/GUI/MainFrame.cpp:1152
+msgid "Search in settings"
+msgstr "Zoek in instellingen"
-#: src/slic3r/GUI/MainFrame.cpp:653
+#: src/slic3r/GUI/MainFrame.cpp:1160
msgid "&Plater Tab"
msgstr "Tabblad 3D-weergave"
-#: src/slic3r/GUI/MainFrame.cpp:653
+#: src/slic3r/GUI/MainFrame.cpp:1160
msgid "Show the plater"
msgstr "Toon de 3D-weergave"
-#: src/slic3r/GUI/MainFrame.cpp:661
+#: src/slic3r/GUI/MainFrame.cpp:1165
msgid "P&rint Settings Tab"
-msgstr "Tabblad printinstellingen"
+msgstr "Printinstellingentab"
-#: src/slic3r/GUI/MainFrame.cpp:661
+#: src/slic3r/GUI/MainFrame.cpp:1165
msgid "Show the print settings"
msgstr "Toon de printinstellingen"
-#: src/slic3r/GUI/MainFrame.cpp:664 src/slic3r/GUI/MainFrame.cpp:799
+#: src/slic3r/GUI/MainFrame.cpp:1168 src/slic3r/GUI/MainFrame.cpp:1308
msgid "&Filament Settings Tab"
msgstr "Tabblad filamentinstellingen"
-#: src/slic3r/GUI/MainFrame.cpp:664
+#: src/slic3r/GUI/MainFrame.cpp:1168
msgid "Show the filament settings"
msgstr "Toon de filamentinstellingen"
-#: src/slic3r/GUI/MainFrame.cpp:668
+#: src/slic3r/GUI/MainFrame.cpp:1172
msgid "Print&er Settings Tab"
msgstr "Tabblad printerinstellingen"
-#: src/slic3r/GUI/MainFrame.cpp:668
+#: src/slic3r/GUI/MainFrame.cpp:1172
msgid "Show the printer settings"
msgstr "Toon de printerinstellingen"
-#: src/slic3r/GUI/MainFrame.cpp:673
+#: src/slic3r/GUI/MainFrame.cpp:1178
msgid "3&D"
msgstr "3D-bewerkingsweergave"
-#: src/slic3r/GUI/MainFrame.cpp:673
+#: src/slic3r/GUI/MainFrame.cpp:1178
msgid "Show the 3D editing view"
msgstr "Toon de 3D-bewerkingsweergave"
-#: src/slic3r/GUI/MainFrame.cpp:676
+#: src/slic3r/GUI/MainFrame.cpp:1181
msgid "Pre&view"
msgstr "Voorbeeldweergave"
-#: src/slic3r/GUI/MainFrame.cpp:676
+#: src/slic3r/GUI/MainFrame.cpp:1181
msgid "Show the 3D slices preview"
msgstr "Toon de 3D-weergave van de slice"
-#: src/slic3r/GUI/MainFrame.cpp:695
+#: src/slic3r/GUI/MainFrame.cpp:1187
msgid "Print &Host Upload Queue"
msgstr "Printhost uploadwachtrij"
-#: src/slic3r/GUI/MainFrame.cpp:695
+#: src/slic3r/GUI/MainFrame.cpp:1187
msgid "Display the Print Host Upload Queue window"
msgstr "Toon het venster van de printhost uploadwachtrij"
-#: src/slic3r/GUI/MainFrame.cpp:705
-msgid "Iso"
-msgstr "Isometrisch"
-
-#: src/slic3r/GUI/MainFrame.cpp:705
-msgid "Iso View"
-msgstr "Isometrisch aanzicht"
-
-#. TRN To be shown in the main menu View->Top
-#. TRN To be shown in Print Settings "Top solid layers"
-#: src/slic3r/GUI/MainFrame.cpp:709 src/libslic3r/PrintConfig.cpp:2132
-#: src/libslic3r/PrintConfig.cpp:2141
-msgid "Top"
-msgstr "Bovenkant"
-
-#: src/slic3r/GUI/MainFrame.cpp:709
-msgid "Top View"
-msgstr "Bovenaanzicht"
-
-#. TRN To be shown in the main menu View->Bottom
-#. TRN To be shown in Print Settings "Bottom solid layers"
-#. TRN To be shown in Print Settings "Top solid layers"
-#: src/slic3r/GUI/MainFrame.cpp:712 src/libslic3r/PrintConfig.cpp:174
-#: src/libslic3r/PrintConfig.cpp:183
-msgid "Bottom"
-msgstr "Onderkant"
-
-#: src/slic3r/GUI/MainFrame.cpp:712
-msgid "Bottom View"
-msgstr "Onderaanzicht"
-
-#: src/slic3r/GUI/MainFrame.cpp:714
-msgid "Front"
-msgstr "Voorkant"
-
-#: src/slic3r/GUI/MainFrame.cpp:714
-msgid "Front View"
-msgstr "Vooraanzicht"
-
-#: src/slic3r/GUI/MainFrame.cpp:716 src/libslic3r/PrintConfig.cpp:1632
-msgid "Rear"
-msgstr "Achterzijde"
-
-#: src/slic3r/GUI/MainFrame.cpp:716
-msgid "Rear View"
-msgstr "Achteraanzicht"
-
-#: src/slic3r/GUI/MainFrame.cpp:718
-msgid "Left"
-msgstr "Links"
-
-#: src/slic3r/GUI/MainFrame.cpp:718
-msgid "Left View"
-msgstr "Linkerzijaanzicht"
-
-#: src/slic3r/GUI/MainFrame.cpp:720
-msgid "Right"
-msgstr "Rechts"
-
-#: src/slic3r/GUI/MainFrame.cpp:720
-msgid "Right View"
-msgstr "Rechterzijaanzicht"
-
-#: src/slic3r/GUI/MainFrame.cpp:723
+#: src/slic3r/GUI/MainFrame.cpp:1201
msgid "Show &labels"
msgstr "Toon labels"
-#: src/slic3r/GUI/MainFrame.cpp:723
+#: src/slic3r/GUI/MainFrame.cpp:1201
msgid "Show object/instance labels in 3D scene"
msgstr "Toon object-/instantielabels in de 3D weergave"
-#: src/slic3r/GUI/MainFrame.cpp:731
-msgid "Prusa 3D &Drivers"
-msgstr "Prusa 3D-stuurprogramma"
-
-#: src/slic3r/GUI/MainFrame.cpp:731
-msgid "Open the Prusa3D drivers download page in your browser"
-msgstr "Open de Prusa3D drivers-downloadpagina in uw browser"
+#: src/slic3r/GUI/MainFrame.cpp:1204
+msgid "&Collapse sidebar"
+msgstr "Zijbalk inklappen"
-#: src/slic3r/GUI/MainFrame.cpp:733
-msgid "Software &Releases"
-msgstr "Laatste versie downloaden"
-
-#: src/slic3r/GUI/MainFrame.cpp:733
-msgid "Open the software releases page in your browser"
-msgstr "Download de laatste softwareversie vanuit uw browser"
+#: src/slic3r/GUI/MainFrame.cpp:1204 src/slic3r/GUI/Plater.cpp:2243
+msgid "Collapse sidebar"
+msgstr "Klap zijbalk in"
-#: src/slic3r/GUI/MainFrame.cpp:739
-#, c-format
-msgid "%s &Website"
-msgstr "%s-website"
-
-#: src/slic3r/GUI/MainFrame.cpp:740
-#, c-format
-msgid "Open the %s website in your browser"
-msgstr "Open de %s website in uw browser"
-
-#: src/slic3r/GUI/MainFrame.cpp:746
-msgid "System &Info"
-msgstr "Systeeminfo"
-
-#: src/slic3r/GUI/MainFrame.cpp:746
-msgid "Show system information"
-msgstr "Toon systeeminformatie"
-
-#: src/slic3r/GUI/MainFrame.cpp:748
-msgid "Show &Configuration Folder"
-msgstr "Toon configuratiemap"
-
-#: src/slic3r/GUI/MainFrame.cpp:748
-msgid "Show user configuration folder (datadir)"
-msgstr "Toon gebruikersconfiguratiemap (datadir)"
-
-#: src/slic3r/GUI/MainFrame.cpp:750
-msgid "Report an I&ssue"
-msgstr "Rapporteer een fout"
-
-#: src/slic3r/GUI/MainFrame.cpp:750
-#, c-format
-msgid "Report an issue on %s"
-msgstr "Rapporteer een fout op %s"
-
-#: src/slic3r/GUI/MainFrame.cpp:752
-#, c-format
-msgid "&About %s"
-msgstr "Over %s"
-
-#: src/slic3r/GUI/MainFrame.cpp:752
-msgid "Show about dialog"
-msgstr "Toon Over-dialoogvenster"
-
-#: src/slic3r/GUI/MainFrame.cpp:755
-msgid "Show the list of the keyboard shortcuts"
-msgstr "Toon de lijst met sneltoetsen"
-
-#: src/slic3r/GUI/MainFrame.cpp:768
+#: src/slic3r/GUI/MainFrame.cpp:1216 src/slic3r/GUI/MainFrame.cpp:1279
msgid "&File"
msgstr "Bestand"
-#: src/slic3r/GUI/MainFrame.cpp:769
+#: src/slic3r/GUI/MainFrame.cpp:1217
msgid "&Edit"
msgstr "Bewerk"
-#: src/slic3r/GUI/MainFrame.cpp:770
+#: src/slic3r/GUI/MainFrame.cpp:1218
msgid "&Window"
msgstr "Venster"
-#: src/slic3r/GUI/MainFrame.cpp:771
+#: src/slic3r/GUI/MainFrame.cpp:1219 src/slic3r/GUI/MainFrame.cpp:1280
msgid "&View"
msgstr "Toon"
-#: src/slic3r/GUI/MainFrame.cpp:774
+#: src/slic3r/GUI/MainFrame.cpp:1222 src/slic3r/GUI/MainFrame.cpp:1283
msgid "&Help"
-msgstr "Help"
+msgstr "&Help"
+
+#: src/slic3r/GUI/MainFrame.cpp:1244
+msgid "&Open G-code"
+msgstr "&Open G-code"
+
+#: src/slic3r/GUI/MainFrame.cpp:1260
+msgid "Open &PrusaSlicer"
+msgstr "Open &PrusaSlicer"
-#: src/slic3r/GUI/MainFrame.cpp:796
+#: src/slic3r/GUI/MainFrame.cpp:1305
msgid "E&xport"
msgstr "Exporteer"
-#: src/slic3r/GUI/MainFrame.cpp:797
+#: src/slic3r/GUI/MainFrame.cpp:1306
msgid "S&end to print"
msgstr "Stuur om te printen"
-#: src/slic3r/GUI/MainFrame.cpp:799
+#: src/slic3r/GUI/MainFrame.cpp:1308
msgid "Mate&rial Settings Tab"
msgstr "Materiaalinstellingentab"
-#: src/slic3r/GUI/MainFrame.cpp:820
+#: src/slic3r/GUI/MainFrame.cpp:1331
msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):"
msgstr "Kies een STL-, OBJ-, AMF-, 3MF- of PRUSA-bestand om te slicen:"
-#: src/slic3r/GUI/MainFrame.cpp:831
+#: src/slic3r/GUI/MainFrame.cpp:1342
msgid "No previously sliced file."
msgstr "Niet eerder gesliced bestand."
-#: src/slic3r/GUI/MainFrame.cpp:837
+#: src/slic3r/GUI/MainFrame.cpp:1348
msgid "Previously sliced file ("
msgstr "Eerder gesliced bestand ("
-#: src/slic3r/GUI/MainFrame.cpp:837
+#: src/slic3r/GUI/MainFrame.cpp:1348
msgid ") not found."
msgstr ") niet gevonden."
-#: src/slic3r/GUI/MainFrame.cpp:838
+#: src/slic3r/GUI/MainFrame.cpp:1349
msgid "File Not Found"
msgstr "Bestand niet gevonden"
-#: src/slic3r/GUI/MainFrame.cpp:873
+#: src/slic3r/GUI/MainFrame.cpp:1384
#, c-format
msgid "Save %s file as:"
msgstr "%s-bestand opslaan als:"
-#: src/slic3r/GUI/MainFrame.cpp:873
+#: src/slic3r/GUI/MainFrame.cpp:1384
msgid "SVG"
msgstr "SVG"
-#: src/slic3r/GUI/MainFrame.cpp:873
+#: src/slic3r/GUI/MainFrame.cpp:1384
msgid "G-code"
msgstr "G-code"
-#: src/slic3r/GUI/MainFrame.cpp:885
+#: src/slic3r/GUI/MainFrame.cpp:1396
msgid "Save zip file as:"
msgstr "ZIP-bestand opslaan als:"
-#: src/slic3r/GUI/MainFrame.cpp:894 src/slic3r/GUI/Plater.cpp:3178
-#: src/slic3r/GUI/Plater.cpp:5150 src/slic3r/GUI/Tab.cpp:1281
-#: src/slic3r/GUI/Tab.cpp:3720
+#: src/slic3r/GUI/MainFrame.cpp:1405 src/slic3r/GUI/Plater.cpp:3005
+#: src/slic3r/GUI/Plater.cpp:5534 src/slic3r/GUI/Tab.cpp:1575
+#: src/slic3r/GUI/Tab.cpp:4115
msgid "Slicing"
msgstr "Slicen"
#. TRN "Processing input_file_basename"
-#: src/slic3r/GUI/MainFrame.cpp:896
+#: src/slic3r/GUI/MainFrame.cpp:1407
#, c-format
msgid "Processing %s"
msgstr "%s verwerken"
-#: src/slic3r/GUI/MainFrame.cpp:919
-msgid " was successfully sliced."
-msgstr " succesvol gesliced."
+#: src/slic3r/GUI/MainFrame.cpp:1430
+msgid "%1% was successfully sliced."
+msgstr "%1% is succesvol gesliced."
-#: src/slic3r/GUI/MainFrame.cpp:921
+#: src/slic3r/GUI/MainFrame.cpp:1432
msgid "Slicing Done!"
msgstr "Slicen klaar!"
-#: src/slic3r/GUI/MainFrame.cpp:936
+#: src/slic3r/GUI/MainFrame.cpp:1447
msgid "Select the STL file to repair:"
msgstr "Selecteer het STL-bestand om te repareren:"
-#: src/slic3r/GUI/MainFrame.cpp:946
+#: src/slic3r/GUI/MainFrame.cpp:1457
msgid "Save OBJ file (less prone to coordinate errors than STL) as:"
msgstr "OBJ-bestand opslaan als:"
-#: src/slic3r/GUI/MainFrame.cpp:958
+#: src/slic3r/GUI/MainFrame.cpp:1469
msgid "Your file was repaired."
msgstr "Het bestand is gerepareerd."
-#: src/slic3r/GUI/MainFrame.cpp:958 src/libslic3r/PrintConfig.cpp:3457
+#: src/slic3r/GUI/MainFrame.cpp:1469 src/libslic3r/PrintConfig.cpp:3735
msgid "Repair"
msgstr "Repareer"
-#: src/slic3r/GUI/MainFrame.cpp:972
+#: src/slic3r/GUI/MainFrame.cpp:1483
msgid "Save configuration as:"
msgstr "Configuratie opslaan als:"
-#: src/slic3r/GUI/MainFrame.cpp:991 src/slic3r/GUI/MainFrame.cpp:1053
+#: src/slic3r/GUI/MainFrame.cpp:1502 src/slic3r/GUI/MainFrame.cpp:1564
msgid "Select configuration to load:"
msgstr "Selecteer configuratie om te laden:"
-#: src/slic3r/GUI/MainFrame.cpp:1027
+#: src/slic3r/GUI/MainFrame.cpp:1538
msgid "Save presets bundle as:"
-msgstr "Presetbundel opslaan als:"
+msgstr "Voorinstellingenbundel opslaan als:"
-#: src/slic3r/GUI/MainFrame.cpp:1074
+#: src/slic3r/GUI/MainFrame.cpp:1585
#, c-format
msgid "%d presets successfully imported."
-msgstr "%d presets succesvol geïmporteerd."
+msgstr "%d voorinstellingen succesvol geïmporteerd."
-#: src/slic3r/GUI/Mouse3DController.cpp:239
+#: src/slic3r/GUI/Mouse3DController.cpp:461
msgid "3Dconnexion settings"
msgstr "3Dconnexion-instellingen"
-#: src/slic3r/GUI/Mouse3DController.cpp:254
+#: src/slic3r/GUI/Mouse3DController.cpp:472
msgid "Device:"
msgstr "Apparaat:"
-#: src/slic3r/GUI/Mouse3DController.cpp:261
+#: src/slic3r/GUI/Mouse3DController.cpp:477
msgid "Speed:"
msgstr "Snelheid:"
-#: src/slic3r/GUI/Mouse3DController.cpp:265
-#: src/slic3r/GUI/Mouse3DController.cpp:288
+#: src/slic3r/GUI/Mouse3DController.cpp:480
+#: src/slic3r/GUI/Mouse3DController.cpp:501
msgid "Translation"
msgstr "Verplaatsing"
-#: src/slic3r/GUI/Mouse3DController.cpp:277
-#: src/slic3r/GUI/Mouse3DController.cpp:288
+#: src/slic3r/GUI/Mouse3DController.cpp:492
+#: src/slic3r/GUI/Mouse3DController.cpp:501
msgid "Zoom"
msgstr "Zoom"
-#: src/slic3r/GUI/Mouse3DController.cpp:284
+#: src/slic3r/GUI/Mouse3DController.cpp:498
msgid "Deadzone:"
-msgstr "Deadzone:"
+msgstr "Dode zone:"
+
+#: src/slic3r/GUI/Mouse3DController.cpp:513
+msgid "Options:"
+msgstr "Opties:"
-#: src/slic3r/GUI/MsgDialog.cpp:73
+#: src/slic3r/GUI/Mouse3DController.cpp:516
+msgid "Swap Y/Z axes"
+msgstr "Wissel Y/Z-assen"
+
+#: src/slic3r/GUI/MsgDialog.cpp:70
#, c-format
msgid "%s error"
msgstr "%s fout"
-#: src/slic3r/GUI/MsgDialog.cpp:74
+#: src/slic3r/GUI/MsgDialog.cpp:71
#, c-format
msgid "%s has encountered an error"
msgstr "%s heeft een fout veroorzaakt"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:56
+#: src/slic3r/GUI/NotificationManager.hpp:451
+msgid "3D Mouse disconnected."
+msgstr "3D-muis ontkoppeld."
+
+#: src/slic3r/GUI/NotificationManager.hpp:454
+msgid "Configuration update is available."
+msgstr "Configuratie-update is beschikbaar."
+
+#: src/slic3r/GUI/NotificationManager.hpp:454
+msgid "See more."
+msgstr "Zie meer."
+
+#: src/slic3r/GUI/NotificationManager.hpp:456
+msgid "New version is available."
+msgstr "Nieuwe versie beschikbaar."
+
+#: src/slic3r/GUI/NotificationManager.hpp:456
+msgid "See Releases page."
+msgstr "Zie Release-pagina."
+
+#: src/slic3r/GUI/NotificationManager.hpp:459
+msgid ""
+"You have just added a G-code for color change, but its value is empty.\n"
+"To export the G-code correctly, check the \"Color Change G-code\" in "
+"\"Printer Settings > Custom G-code\""
+msgstr ""
+"Je hebt zojuist een G-code voor een kleurwissel toegevoegd, maar de waarde "
+"is leeg.\n"
+"Om de G-code juist te exporteren moet de kleurwissel-G-code in "
+"Printerinstellingen -> Custom G-code\" juist ingesteld staan."
+
+#: src/slic3r/GUI/NotificationManager.cpp:483
+#: src/slic3r/GUI/NotificationManager.cpp:493
+msgid "More"
+msgstr "Meer"
+
+#: src/slic3r/GUI/NotificationManager.cpp:840
+#: src/slic3r/GUI/NotificationManager.cpp:1111
+msgid "Export G-Code."
+msgstr "Exporteer G-code."
+
+#: src/slic3r/GUI/NotificationManager.cpp:884
+msgid "Open Folder."
+msgstr "Open map."
+
+#: src/slic3r/GUI/NotificationManager.cpp:922
+msgid "Eject drive"
+msgstr "Schijf uitwerpen"
+
+#: src/slic3r/GUI/NotificationManager.cpp:1030
+#: src/slic3r/GUI/NotificationManager.cpp:1046
+#: src/slic3r/GUI/NotificationManager.cpp:1057
+msgid "ERROR:"
+msgstr "Fout:"
+
+#: src/slic3r/GUI/NotificationManager.cpp:1035
+#: src/slic3r/GUI/NotificationManager.cpp:1050
+#: src/slic3r/GUI/NotificationManager.cpp:1065
+msgid "WARNING:"
+msgstr "Waarschuwing:"
+
+#: src/slic3r/GUI/NotificationManager.cpp:1114
+msgid "Slicing finished."
+msgstr "Slicen gelukt."
+
+#: src/slic3r/GUI/NotificationManager.cpp:1156
+msgid "Exporting finished."
+msgstr "Exporteren gelukt."
+
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:58
msgid "Instances"
msgstr "Instanties"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:60
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:216
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:62
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:225
#, c-format
msgid "Instance %d"
msgstr "Instantie %d"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3574
-#: src/slic3r/GUI/Tab.cpp:3656
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3962
+#: src/slic3r/GUI/Tab.cpp:4044
msgid "Layers"
msgstr "Lagen"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:94
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:96
msgid "Range"
msgstr "Bereik"
-#: src/slic3r/GUI/OptionsGroup.cpp:274
+#: src/slic3r/GUI/OpenGLManager.cpp:259
+#, c-format
+msgid ""
+"PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n"
+"while OpenGL version %s, render %s, vendor %s was detected."
+msgstr ""
+"PrusaSlicer vereist een grafische driver die OpenGL 2.0 kan draaien,\n"
+"terwijl OpenGL-versie %s, render %s, leverancier %s is gedetecteerd."
+
+#: src/slic3r/GUI/OpenGLManager.cpp:262
+msgid "You may need to update your graphics card driver."
+msgstr "U moet mogelijk uw grafische kaart updaten."
+
+#: src/slic3r/GUI/OpenGLManager.cpp:265
+msgid ""
+"As a workaround, you may run PrusaSlicer with a software rendered 3D "
+"graphics by running prusa-slicer.exe with the --sw_renderer parameter."
+msgstr ""
+"Als oplossing kun je PrusaSlicer draaien met een softwarematig 3D-"
+"renderprogramma door prusa-slicer.exe uit te voeren met de --sw_renderer "
+"parameter."
+
+#: src/slic3r/GUI/OpenGLManager.cpp:267
+msgid "Unsupported OpenGL version"
+msgstr "Niet-ondersteunde OpenGL-versie"
+
+#: src/slic3r/GUI/OpenGLManager.cpp:275
+#, c-format
+msgid ""
+"Unable to load the following shaders:\n"
+"%s"
+msgstr ""
+"Kan de volgende sjablonen niet laden:\n"
+"%s"
+
+#: src/slic3r/GUI/OpenGLManager.cpp:276
+msgid "Error loading shaders"
+msgstr "Fout bij het laden van de sjablonen"
+
+#: src/slic3r/GUI/OptionsGroup.cpp:335
msgctxt "Layers"
msgid "Top"
msgstr "Bovenkant"
-#: src/slic3r/GUI/OptionsGroup.cpp:274
+#: src/slic3r/GUI/OptionsGroup.cpp:335
msgctxt "Layers"
msgid "Bottom"
msgstr "Onderkant"
-#: src/slic3r/GUI/Plater.cpp:161
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:51
+msgid "Delete this preset from this printer device"
+msgstr "Verwijderen van de voorinstelling van deze printer"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:81
+msgid "This printer will be shown in the presets list as"
+msgstr "De printer wordt getoond in de voorinstellingenlijst als"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:155
+msgid "Physical Printer"
+msgstr "Fysieke printer"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:161
+msgid "Type here the name of your printer device"
+msgstr "Type hier de naam van je printer"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:172
+msgid "Descriptive name for the printer"
+msgstr "Beschrijvende printernaam"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:176
+msgid "Add preset for this printer device"
+msgstr "Voeg voorinstelling toe aan deze printer"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:205 src/slic3r/GUI/Tab.cpp:2064
+msgid "Print Host upload"
+msgstr "Printhost upload"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:260
+msgid "Connection to printers connected via the print host failed."
+msgstr "Verbinding met printers die via printhost verbonden zijn niet gelukt."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:302
+msgid "Test"
+msgstr "Test"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:307
+msgid "Could not get a valid Printer Host reference"
+msgstr "Kan geen geldige printerhostreferentie krijgen"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:319
+msgid "Success!"
+msgstr "Gelukt!"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:329
+msgid "Refresh Printers"
+msgstr "Ververs printers"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:356
+msgid ""
+"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-"
+"signed certificate."
+msgstr ""
+"HTTPS-CA-bestand is optioneel. Het is alleen nodig als je werkt met een zelf "
+"ondertekend certificaat."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:366
+msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*"
+msgstr "Certificaatbestanden (*.crt, *.pem)|*.crt;*.pem|Alle betanden|*.*"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:367
+msgid "Open CA certificate file"
+msgstr "Open een CA-certificaatbestand"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:395
+#: src/libslic3r/PrintConfig.cpp:124
+msgid "HTTPS CA File"
+msgstr "HTTPS-CA-bestand"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:396
+#, c-format
+msgid ""
+"On this system, %s uses HTTPS certificates from the system Certificate Store "
+"or Keychain."
+msgstr ""
+"Op dit systeem gebruikt %s HTTPS-certificaten van de Certificate Store of "
+"Keychain."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:397
+msgid ""
+"To use a custom CA file, please import your CA file into Certificate Store / "
+"Keychain."
+msgstr ""
+"Importeer een CA-bestand in de Certificate Store of Keychain om deze te "
+"gebruiken."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:543
+msgid "The supplied name is empty. It can't be saved."
+msgstr "De ingevoerde naam is leeg. Kan niet opgeslagen worden."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:547
+msgid "You should change the name of your printer device."
+msgstr "Je moet de naam van de printer aanpassen."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:555
+msgid "Printer with name \"%1%\" already exists."
+msgstr "Printer met naam \"%1%\" bestaat al."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:556
+msgid "Replace?"
+msgstr "Vervangen?"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:579
+msgid ""
+"Following printer preset(s) is duplicated:%1%The above preset for printer "
+"\"%2%\" will be used just once."
+msgstr ""
+"De volgende voorinstellingen zijn overgenomen: %1% De bovenstaande "
+"voorinstelling voor printer \"%2%\" wordt eenmalig gebruikt."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:625
+msgid "It's not possible to delete the last related preset for the printer."
+msgstr ""
+"Het is niet mogelijk om de laatst gerelateerde voorinstelling voor de "
+"printer te verwijderen."
+
+#: src/slic3r/GUI/Plater.cpp:163
msgid "Volume"
msgstr "Volume"
-#: src/slic3r/GUI/Plater.cpp:162
+#: src/slic3r/GUI/Plater.cpp:164
msgid "Facets"
msgstr "Vlakken"
-#: src/slic3r/GUI/Plater.cpp:163
+#: src/slic3r/GUI/Plater.cpp:165
msgid "Materials"
msgstr "Materialen"
-#: src/slic3r/GUI/Plater.cpp:166
+#: src/slic3r/GUI/Plater.cpp:168
msgid "Manifold"
msgstr "Gesloten model"
-#: src/slic3r/GUI/Plater.cpp:216
+#: src/slic3r/GUI/Plater.cpp:218
msgid "Sliced Info"
msgstr "Slice info"
-#: src/slic3r/GUI/Plater.cpp:235 src/slic3r/GUI/Plater.cpp:1234
+#: src/slic3r/GUI/Plater.cpp:237 src/slic3r/GUI/Plater.cpp:1151
msgid "Used Filament (m)"
msgstr "Filamentverbruik (m)"
-#: src/slic3r/GUI/Plater.cpp:236
+#: src/slic3r/GUI/Plater.cpp:238 src/slic3r/GUI/Plater.cpp:1163
msgid "Used Filament (mm³)"
msgstr "Filamentverbruik (mm³)"
-#: src/slic3r/GUI/Plater.cpp:237
+#: src/slic3r/GUI/Plater.cpp:239 src/slic3r/GUI/Plater.cpp:1170
msgid "Used Filament (g)"
msgstr "Filamentverbruik (g)"
-#: src/slic3r/GUI/Plater.cpp:238
+#: src/slic3r/GUI/Plater.cpp:240
msgid "Used Material (unit)"
msgstr "Materiaalverbruik (eenheid)"
-#: src/slic3r/GUI/Plater.cpp:239
+#: src/slic3r/GUI/Plater.cpp:241
msgid "Cost (money)"
msgstr "Kosten (€)"
-#: src/slic3r/GUI/Plater.cpp:240 src/slic3r/GUI/Plater.cpp:1221
-#: src/slic3r/GUI/Plater.cpp:1263
-msgid "Estimated printing time"
-msgstr "Geschatte printtijd"
-
-#: src/slic3r/GUI/Plater.cpp:241
+#: src/slic3r/GUI/Plater.cpp:243
msgid "Number of tool changes"
msgstr "Aantal toolwisselingen"
-#: src/slic3r/GUI/Plater.cpp:348
-msgid "Click to edit preset"
-msgstr "Klik om de preset te wijzigen"
-
-#: src/slic3r/GUI/Plater.cpp:503
+#: src/slic3r/GUI/Plater.cpp:360
msgid "Select what kind of support do you need"
msgstr "Selecteer welk type support nodig is"
-#: src/slic3r/GUI/Plater.cpp:505 src/libslic3r/PrintConfig.cpp:1901
-#: src/libslic3r/PrintConfig.cpp:2684
+#: src/slic3r/GUI/Plater.cpp:362 src/libslic3r/PrintConfig.cpp:2128
+#: src/libslic3r/PrintConfig.cpp:2923
msgid "Support on build plate only"
msgstr "Support alleen op het bed"
-#: src/slic3r/GUI/Plater.cpp:506 src/slic3r/GUI/Plater.cpp:629
+#: src/slic3r/GUI/Plater.cpp:363 src/slic3r/GUI/Plater.cpp:489
msgid "For support enforcers only"
msgstr "Alleen voor supportforceringen"
-#: src/slic3r/GUI/Plater.cpp:507
+#: src/slic3r/GUI/Plater.cpp:364
msgid "Everywhere"
msgstr "Overal"
-#: src/slic3r/GUI/Plater.cpp:539 src/slic3r/GUI/Tab.cpp:1177
+#: src/slic3r/GUI/Plater.cpp:396 src/slic3r/GUI/Tab.cpp:1469
msgid "Brim"
msgstr "Brim"
-#: src/slic3r/GUI/Plater.cpp:541
+#: src/slic3r/GUI/Plater.cpp:398
msgid ""
"This flag enables the brim that will be printed around each object on the "
"first layer."
msgstr "Door dit aan te vinken zal een brim rond elke object geprint worden."
-#: src/slic3r/GUI/Plater.cpp:549
+#: src/slic3r/GUI/Plater.cpp:406
msgid "Purging volumes"
msgstr "Afveegvolume"
-#: src/slic3r/GUI/Plater.cpp:643
+#: src/slic3r/GUI/Plater.cpp:503
msgid "Select what kind of pad do you need"
msgstr "Selecteer welk soort basisplaat nodig is"
-#: src/slic3r/GUI/Plater.cpp:645
+#: src/slic3r/GUI/Plater.cpp:505
msgid "Below object"
msgstr "Onder het object"
-#: src/slic3r/GUI/Plater.cpp:646
+#: src/slic3r/GUI/Plater.cpp:506
msgid "Around object"
msgstr "Rondom het object"
-#: src/slic3r/GUI/Plater.cpp:820
-msgid "Print settings"
-msgstr "Printinstellingen"
-
-#: src/slic3r/GUI/Plater.cpp:821 src/slic3r/GUI/Tab.cpp:1480
-#: src/slic3r/GUI/Tab.cpp:1481
-msgid "Filament"
-msgstr "Filament"
-
-#: src/slic3r/GUI/Plater.cpp:822
+#: src/slic3r/GUI/Plater.cpp:695
msgid "SLA print settings"
msgstr "SLA-printinstellingen"
-#: src/slic3r/GUI/Plater.cpp:823 src/slic3r/GUI/Preset.cpp:1554
-msgid "SLA material"
-msgstr "SLA-materiaal"
-
-#: src/slic3r/GUI/Plater.cpp:824
-msgid "Printer"
-msgstr "Printer"
-
-#: src/slic3r/GUI/Plater.cpp:883 src/slic3r/GUI/Plater.cpp:5547
+#: src/slic3r/GUI/Plater.cpp:756 src/slic3r/GUI/Plater.cpp:6008
msgid "Send to printer"
msgstr "Stuur naar printer"
-#: src/slic3r/GUI/Plater.cpp:884
-msgid "Remove device"
-msgstr "Verwijder schijf"
-
-#: src/slic3r/GUI/Plater.cpp:897 src/slic3r/GUI/Plater.cpp:3178
-#: src/slic3r/GUI/Plater.cpp:5153
+#: src/slic3r/GUI/Plater.cpp:771 src/slic3r/GUI/Plater.cpp:3005
+#: src/slic3r/GUI/Plater.cpp:5537
msgid "Slice now"
msgstr "Slice nu"
-#: src/slic3r/GUI/Plater.cpp:1047
+#: src/slic3r/GUI/Plater.cpp:926
msgid "Hold Shift to Slice & Export G-code"
msgstr "Houdt shift ingedrukt om te slicen en de G-code te exporteren"
-#: src/slic3r/GUI/Plater.cpp:1157
+#: src/slic3r/GUI/Plater.cpp:1071
#, c-format
msgid "%d (%d shells)"
msgstr "%d (%d shells)"
-#: src/slic3r/GUI/Plater.cpp:1162
+#: src/slic3r/GUI/Plater.cpp:1076
#, c-format
msgid "Auto-repaired (%d errors)"
msgstr "Automatisch gerepareerd (%d fouten)"
-#: src/slic3r/GUI/Plater.cpp:1165
+#: src/slic3r/GUI/Plater.cpp:1079
#, c-format
msgid ""
"%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d "
"facets reversed, %d backwards edges"
msgstr ""
-"%d degenereer vlakken, %d randen vastgezet, %d vlakken verwijderd, %d "
+"%d degenereer facetten, %d randen vastgezet, %d vlakken verwijderd, %d "
"vlakken toegevoegd, %d vlakken omgekeerd, %d randen omgekeerd"
-#: src/slic3r/GUI/Plater.cpp:1175
+#: src/slic3r/GUI/Plater.cpp:1089
msgid "Yes"
msgstr "JA"
-#: src/slic3r/GUI/Plater.cpp:1196
+#: src/slic3r/GUI/Plater.cpp:1110
msgid "Used Material (ml)"
msgstr "Materiaalgebruik (ml)"
-#: src/slic3r/GUI/Plater.cpp:1199
+#: src/slic3r/GUI/Plater.cpp:1113
msgid "object(s)"
msgstr "object(en)"
-#: src/slic3r/GUI/Plater.cpp:1199
+#: src/slic3r/GUI/Plater.cpp:1113
msgid "supports and pad"
msgstr "support en basisplaat"
-#: src/slic3r/GUI/Plater.cpp:1236 src/slic3r/GUI/Plater.cpp:1250
+#: src/slic3r/GUI/Plater.cpp:1151
+msgid "Used Filament (in)"
+msgstr "Gebruikt filament (in)"
+
+#: src/slic3r/GUI/Plater.cpp:1153 src/slic3r/GUI/Plater.cpp:1206
msgid "objects"
msgstr "objecten"
-#: src/slic3r/GUI/Plater.cpp:1236 src/slic3r/GUI/Plater.cpp:1250
+#: src/slic3r/GUI/Plater.cpp:1153 src/slic3r/GUI/Plater.cpp:1206
msgid "wipe tower"
msgstr "afveegblok"
-#: src/slic3r/GUI/Plater.cpp:1248 src/libslic3r/PrintConfig.cpp:760
-#: src/libslic3r/PrintConfig.cpp:2510 src/libslic3r/PrintConfig.cpp:2511
-msgid "Cost"
-msgstr "Kosten"
+#: src/slic3r/GUI/Plater.cpp:1163
+msgid "Used Filament (in³)"
+msgstr "Gebruikt filament (in³)"
-#: src/slic3r/GUI/Plater.cpp:1265 src/libslic3r/PrintConfig.cpp:582
-msgid "Color"
-msgstr "Kleur"
+#: src/slic3r/GUI/Plater.cpp:1189
+msgid "Filament at extruder %1%"
+msgstr "Filament in extruder %1%"
-#: src/slic3r/GUI/Plater.cpp:1266
-msgid "Pause"
-msgstr "Pauzeer"
+#: src/slic3r/GUI/Plater.cpp:1195
+msgid "(including spool)"
+msgstr "(inclusief spoel)"
-#: src/slic3r/GUI/Plater.cpp:1291
+#: src/slic3r/GUI/Plater.cpp:1204 src/libslic3r/PrintConfig.cpp:822
+#: src/libslic3r/PrintConfig.cpp:2738 src/libslic3r/PrintConfig.cpp:2739
+msgid "Cost"
+msgstr "Kosten"
+
+#: src/slic3r/GUI/Plater.cpp:1222
msgid "normal mode"
msgstr "normale modus"
-#: src/slic3r/GUI/Plater.cpp:1296
+#: src/slic3r/GUI/Plater.cpp:1232
msgid "stealth mode"
msgstr "stille modus"
-#: src/slic3r/GUI/Plater.cpp:1400
+#: src/slic3r/GUI/Plater.cpp:1403 src/slic3r/GUI/Plater.cpp:4876
+#, c-format
+msgid "%s - Drop project file"
+msgstr "%s - Plaats projectbestand"
+
+#: src/slic3r/GUI/Plater.cpp:1410 src/slic3r/GUI/Plater.cpp:4883
+msgid "Open as project"
+msgstr "Open als project"
+
+#: src/slic3r/GUI/Plater.cpp:1411 src/slic3r/GUI/Plater.cpp:4884
+msgid "Import geometry only"
+msgstr "Importeer alleen het model"
+
+#: src/slic3r/GUI/Plater.cpp:1412 src/slic3r/GUI/Plater.cpp:4885
+msgid "Import config only"
+msgstr "Importeer alleen de configuratie"
+
+#: src/slic3r/GUI/Plater.cpp:1415 src/slic3r/GUI/Plater.cpp:4888
+msgid "Select an action to apply to the file"
+msgstr "Selecteer een actie om toe te passen op het bestand"
+
+#: src/slic3r/GUI/Plater.cpp:1416 src/slic3r/GUI/Plater.cpp:4889
+msgid "Action"
+msgstr "Commando"
+
+#: src/slic3r/GUI/Plater.cpp:1424 src/slic3r/GUI/Plater.cpp:4897
+msgid "Don't show again"
+msgstr "Laat niet meer zien"
+
+#: src/slic3r/GUI/Plater.cpp:1469 src/slic3r/GUI/Plater.cpp:4934
+msgid "You can open only one .gcode file at a time."
+msgstr "Je kunt maar één gcode-bestand tegelijk openen."
+
+#: src/slic3r/GUI/Plater.cpp:1470 src/slic3r/GUI/Plater.cpp:4935
+msgid "Drag and drop G-code file"
+msgstr "Versleep en plaats gcode-bestand"
+
+#: src/slic3r/GUI/Plater.cpp:1524 src/slic3r/GUI/Plater.cpp:4748
+#: src/slic3r/GUI/Plater.cpp:4989
+msgid "Import Object"
+msgstr "Importeer object"
+
+#: src/slic3r/GUI/Plater.cpp:1546 src/slic3r/GUI/Plater.cpp:5011
msgid "Load File"
msgstr "Laad bestand"
-#: src/slic3r/GUI/Plater.cpp:1404
+#: src/slic3r/GUI/Plater.cpp:1551 src/slic3r/GUI/Plater.cpp:5016
msgid "Load Files"
msgstr "Laad bestanden"
-#: src/slic3r/GUI/Plater.cpp:2196
+#: src/slic3r/GUI/Plater.cpp:1654
+msgid "Fill bed"
+msgstr "Vul het bed"
+
+#: src/slic3r/GUI/Plater.cpp:1660
+msgid "Optimize Rotation"
+msgstr "Optimaliseer rotatie"
+
+#: src/slic3r/GUI/Plater.cpp:1666
+msgid "Import SLA archive"
+msgstr "Importeer SLA-archief"
+
+#: src/slic3r/GUI/Plater.cpp:2127
#, c-format
msgid ""
-"Unmounting successful. The device %s(%s) can now be safely removed from the "
+"Successfully unmounted. The device %s(%s) can now be safely removed from the "
"computer."
msgstr ""
-"Ontkoppelen succesvol. Het apparaat %s(%s) kan nu veilig uit de computer "
-"gehaald worden."
+"Succesvol ontkoppeld. Het apparat %s(%s) kan nu veilig worden verwijderd uit "
+"de computer."
+
+#: src/slic3r/GUI/Plater.cpp:2130
+#, c-format
+msgid "Ejecting of device %s(%s) has failed."
+msgstr "Uitwerpen van apparat %s(%s) mislukt."
-#: src/slic3r/GUI/Plater.cpp:2204
+#: src/slic3r/GUI/Plater.cpp:2149
msgid "New Project"
msgstr "Nieuw project"
-#: src/slic3r/GUI/Plater.cpp:2325
+#: src/slic3r/GUI/Plater.cpp:2242
+msgid "Expand sidebar"
+msgstr "Zijbalk uitklappen"
+
+#: src/slic3r/GUI/Plater.cpp:2315
msgid "Loading"
msgstr "Aan het laden"
-#: src/slic3r/GUI/Plater.cpp:2335
-#, c-format
-msgid "Processing input file %s"
-msgstr "Verwerken van inputbestand %s"
+#: src/slic3r/GUI/Plater.cpp:2325
+msgid "Loading file"
+msgstr "Bestand laden"
-#: src/slic3r/GUI/Plater.cpp:2363
-msgid "You cannot load SLA project with a multi-part object on the bed"
-msgstr "U kunt geen SLA-project laden met een meerdelig object op het bed"
+#: src/slic3r/GUI/Plater.cpp:2411
+#, c-format
+msgid ""
+"Some object(s) in file %s looks like saved in inches.\n"
+"Should I consider them as a saved in inches and convert them?"
+msgstr ""
+"Sommige objecten in bestand %s lijken te zijn opgeslagen in inches.\n"
+"Moeten deze zodanig beschouwd en omgezet worden?"
-#: src/slic3r/GUI/Plater.cpp:2364 src/slic3r/GUI/Tab.cpp:2947
-msgid "Please check your object list before preset changing."
-msgstr "Controleer de objectenlijst voor het wijzigen van de preset."
+#: src/slic3r/GUI/Plater.cpp:2413
+msgid "The object appears to be saved in inches"
+msgstr "Het object lijkt te zijn opgeslagen in inches"
-#: src/slic3r/GUI/Plater.cpp:2409
+#: src/slic3r/GUI/Plater.cpp:2421
msgid ""
"This file contains several objects positioned at multiple heights.\n"
"Instead of considering them as multiple objects, should I consider\n"
@@ -4401,23 +5741,23 @@ msgstr ""
"onderdelen\n"
"in plaats van als meerdere objecten?"
-#: src/slic3r/GUI/Plater.cpp:2412 src/slic3r/GUI/Plater.cpp:2465
+#: src/slic3r/GUI/Plater.cpp:2424 src/slic3r/GUI/Plater.cpp:2477
msgid "Multi-part object detected"
msgstr "Meerdelig object gedetecteerd"
-#: src/slic3r/GUI/Plater.cpp:2419
+#: src/slic3r/GUI/Plater.cpp:2431
msgid ""
"This file cannot be loaded in a simple mode. Do you want to switch to an "
"advanced mode?"
msgstr ""
-"Dit bestand kan niet geladen worden in eenvoudige modus. Wilt u overstappen "
+"Dit bestand kan niet geladen worden in eenvoudige modus. Wil je overstappen "
"op geavanceerde modus?"
-#: src/slic3r/GUI/Plater.cpp:2420
+#: src/slic3r/GUI/Plater.cpp:2432
msgid "Detected advanced data"
msgstr "Geavanceerde data gedetecteerd"
-#: src/slic3r/GUI/Plater.cpp:2442
+#: src/slic3r/GUI/Plater.cpp:2454
#, c-format
msgid ""
"You can't to add the object(s) from %s because of one or some of them "
@@ -4426,7 +5766,7 @@ msgstr ""
"U kan geen objecten toevoegen van %s, omdat sommige daarvan meerdelig kunnen "
"zijn"
-#: src/slic3r/GUI/Plater.cpp:2462
+#: src/slic3r/GUI/Plater.cpp:2474
msgid ""
"Multiple objects were loaded for a multi-material printer.\n"
"Instead of considering them as multiple objects, should I consider\n"
@@ -4436,11 +5776,11 @@ msgstr ""
"Moeten deze objecten beschouwd worden als één object\n"
"met meerdere onderdelen, of als meerdere objecten?"
-#: src/slic3r/GUI/Plater.cpp:2478
+#: src/slic3r/GUI/Plater.cpp:2490
msgid "Loaded"
msgstr "Geladen"
-#: src/slic3r/GUI/Plater.cpp:2580
+#: src/slic3r/GUI/Plater.cpp:2592
msgid ""
"Your object appears to be too large, so it was automatically scaled down to "
"fit your print bed."
@@ -4448,87 +5788,35 @@ msgstr ""
"Het object is te groot. Daarom is het automatisch verschaald tot de grootte "
"van het printbed."
-#: src/slic3r/GUI/Plater.cpp:2581
+#: src/slic3r/GUI/Plater.cpp:2593
msgid "Object too large?"
msgstr "Object te groot?"
-#: src/slic3r/GUI/Plater.cpp:2643
+#: src/slic3r/GUI/Plater.cpp:2655
msgid "Export STL file:"
msgstr "Exporteer STL-bestand:"
-#: src/slic3r/GUI/Plater.cpp:2650
+#: src/slic3r/GUI/Plater.cpp:2662
msgid "Export AMF file:"
msgstr "Exporteer AMF-bestand:"
-#: src/slic3r/GUI/Plater.cpp:2656
+#: src/slic3r/GUI/Plater.cpp:2668
msgid "Save file as:"
msgstr "Bestand opslaan als:"
-#: src/slic3r/GUI/Plater.cpp:2662
+#: src/slic3r/GUI/Plater.cpp:2674
msgid "Export OBJ file:"
msgstr "Exporteer OBJ-bestand:"
-#: src/slic3r/GUI/Plater.cpp:2764
+#: src/slic3r/GUI/Plater.cpp:2770
msgid "Delete Object"
msgstr "Verwijder object"
-#: src/slic3r/GUI/Plater.cpp:2775
+#: src/slic3r/GUI/Plater.cpp:2781
msgid "Reset Project"
msgstr "Reset project"
-#: src/slic3r/GUI/Plater.cpp:2812
-msgid "Hollow"
-msgstr "Uithollen"
-
-#: src/slic3r/GUI/Plater.cpp:2819
-msgid "Optimize Rotation"
-msgstr "Optimaliseer rotatie"
-
-#: src/slic3r/GUI/Plater.cpp:2865
-msgid "Arranging"
-msgstr "Schikken"
-
-#: src/slic3r/GUI/Plater.cpp:2892
-msgid "Could not arrange model objects! Some geometries may be invalid."
-msgstr "Kan modellen niet schikken. Sommige vormen kunnen ongeldig zijn."
-
-#: src/slic3r/GUI/Plater.cpp:2898
-msgid "Arranging canceled."
-msgstr "Schikken geannuleerd."
-
-#: src/slic3r/GUI/Plater.cpp:2899
-msgid "Arranging done."
-msgstr "Schikken voltooid."
-
-#: src/slic3r/GUI/Plater.cpp:2915
-msgid "Searching for optimal orientation"
-msgstr "Zoeken naar optimale oriëntatie"
-
-#: src/slic3r/GUI/Plater.cpp:2948
-msgid "Orientation search canceled."
-msgstr "Oriëntatie zoeken geannuleerd."
-
-#: src/slic3r/GUI/Plater.cpp:2949
-msgid "Orientation found."
-msgstr "Oriëntatie gevonden."
-
-#: src/slic3r/GUI/Plater.cpp:2979
-msgid "Indexing hollowed object"
-msgstr "Uitgehold object indexeren"
-
-#: src/slic3r/GUI/Plater.cpp:2983
-msgid "Hollowing cancelled."
-msgstr "Uithollen geannuleerd."
-
-#: src/slic3r/GUI/Plater.cpp:2984
-msgid "Hollowing done."
-msgstr "Uithollen voltooid."
-
-#: src/slic3r/GUI/Plater.cpp:2986
-msgid "Hollowing failed."
-msgstr "Uithollen mislukt."
-
-#: src/slic3r/GUI/Plater.cpp:3027
+#: src/slic3r/GUI/Plater.cpp:2853
msgid ""
"The selected object can't be split because it contains more than one volume/"
"material."
@@ -4536,268 +5824,290 @@ msgstr ""
"Het geselecteerde object kan niet opgedeeld worden omdat het meer dan één "
"volume bevat."
-#: src/slic3r/GUI/Plater.cpp:3038
+#: src/slic3r/GUI/Plater.cpp:2864
msgid "Split to Objects"
msgstr "Splits op naar objecten"
-#: src/slic3r/GUI/Plater.cpp:3163
+#: src/slic3r/GUI/Plater.cpp:2989 src/slic3r/GUI/Plater.cpp:3675
msgid "Invalid data"
msgstr "Ongeldige data"
-#: src/slic3r/GUI/Plater.cpp:3172
+#: src/slic3r/GUI/Plater.cpp:2999
msgid "Ready to slice"
msgstr "Klaar om te slicen"
-#: src/slic3r/GUI/Plater.cpp:3210 src/slic3r/GUI/PrintHostDialogs.cpp:232
+#: src/slic3r/GUI/Plater.cpp:3037 src/slic3r/GUI/PrintHostDialogs.cpp:264
msgid "Cancelling"
msgstr "Annuleren"
-#: src/slic3r/GUI/Plater.cpp:3227
+#: src/slic3r/GUI/Plater.cpp:3056
msgid "Another export job is currently running."
msgstr "Een andere export loopt op dit moment."
-#: src/slic3r/GUI/Plater.cpp:3343
+#: src/slic3r/GUI/Plater.cpp:3173
msgid "Please select the file to reload"
msgstr "Selecteer het bestand om te herladen"
-#: src/slic3r/GUI/Plater.cpp:3378
+#: src/slic3r/GUI/Plater.cpp:3208
msgid "It is not allowed to change the file to reload"
msgstr "Het is niet toegestaan om het te laden bestand te wijzigen"
-#: src/slic3r/GUI/Plater.cpp:3378
+#: src/slic3r/GUI/Plater.cpp:3208
msgid "Do you want to retry"
-msgstr "Wilt u dit opnieuw proberen"
+msgstr "Wil je dit opnieuw proberen"
-#: src/slic3r/GUI/Plater.cpp:3396
+#: src/slic3r/GUI/Plater.cpp:3226
msgid "Reload from:"
msgstr "Herladen van:"
-#: src/slic3r/GUI/Plater.cpp:3485
+#: src/slic3r/GUI/Plater.cpp:3319
msgid "Unable to reload:"
msgstr "Niet in staat om te herladen:"
-#: src/slic3r/GUI/Plater.cpp:3490
+#: src/slic3r/GUI/Plater.cpp:3324
msgid "Error during reload"
msgstr "Fout tijdens herladen"
-#: src/slic3r/GUI/Plater.cpp:3509
+#: src/slic3r/GUI/Plater.cpp:3343
msgid "Reload all from disk"
msgstr "Herlaad alles van schijf"
-#: src/slic3r/GUI/Plater.cpp:3530
+#: src/slic3r/GUI/Plater.cpp:3364
msgid "Fix Throught NetFabb"
-msgstr "Repareer met NetFabb"
+msgstr "Repareer met Netfabb"
+
+#: src/slic3r/GUI/Plater.cpp:3632
+msgid "There are active warnings concerning sliced models:"
+msgstr "Er zijn actieve waarschuwingen wat betreft de slice:"
-#: src/slic3r/GUI/Plater.cpp:3721
-msgid "Export failed"
-msgstr "Exporteren mislukt"
+#: src/slic3r/GUI/Plater.cpp:3643
+msgid "generated warnings"
+msgstr "gegeven waarschuwingen"
-#: src/slic3r/GUI/Plater.cpp:3726 src/slic3r/GUI/PrintHostDialogs.cpp:233
+#: src/slic3r/GUI/Plater.cpp:3683 src/slic3r/GUI/PrintHostDialogs.cpp:265
msgid "Cancelled"
msgstr "Geannuleerd"
-#: src/slic3r/GUI/Plater.cpp:3983 src/slic3r/GUI/Plater.cpp:4005
+#: src/slic3r/GUI/Plater.cpp:3950 src/slic3r/GUI/Plater.cpp:3974
msgid "Remove the selected object"
msgstr "Verwijder het geselecteerde object"
-#: src/slic3r/GUI/Plater.cpp:3992
+#: src/slic3r/GUI/Plater.cpp:3959
msgid "Add one more instance of the selected object"
msgstr "Voeg een instantie van het geselecteerde object toe"
-#: src/slic3r/GUI/Plater.cpp:3994
+#: src/slic3r/GUI/Plater.cpp:3961
msgid "Remove one instance of the selected object"
msgstr "Verwijder een instantie van het geselecteerde object"
-#: src/slic3r/GUI/Plater.cpp:3996
+#: src/slic3r/GUI/Plater.cpp:3963
msgid "Set number of instances"
msgstr "Stel aantal instanties in"
-#: src/slic3r/GUI/Plater.cpp:3996
+#: src/slic3r/GUI/Plater.cpp:3963
msgid "Change the number of instances of the selected object"
msgstr "Wijzig het aantal instanties van het geselecteerde object"
-#: src/slic3r/GUI/Plater.cpp:4015
+#: src/slic3r/GUI/Plater.cpp:3965
+msgid "Fill bed with instances"
+msgstr "Vul het bed met instanties"
+
+#: src/slic3r/GUI/Plater.cpp:3965
+msgid "Fill the remaining area of bed with instances of the selected object"
+msgstr ""
+"Vul het overige deel van het bed met instanties van het geselecteerde object"
+
+#: src/slic3r/GUI/Plater.cpp:3984
msgid "Reload the selected object from disk"
msgstr "Herlaad het geselecteerde object van de schijf"
-#: src/slic3r/GUI/Plater.cpp:4018
+#: src/slic3r/GUI/Plater.cpp:3987
msgid "Export the selected object as STL file"
msgstr "Exporteer de geselecteerde objecten als STL-bestand"
-#: src/slic3r/GUI/Plater.cpp:4047
+#: src/slic3r/GUI/Plater.cpp:4017
msgid "Along X axis"
-msgstr "Over de X-as"
+msgstr "Op de X-as"
-#: src/slic3r/GUI/Plater.cpp:4047
+#: src/slic3r/GUI/Plater.cpp:4017
msgid "Mirror the selected object along the X axis"
msgstr "Spiegel het geselecteerde object over de X-as"
-#: src/slic3r/GUI/Plater.cpp:4049
+#: src/slic3r/GUI/Plater.cpp:4019
msgid "Along Y axis"
-msgstr "Over de Y-as"
+msgstr "Op de Y-as"
-#: src/slic3r/GUI/Plater.cpp:4049
+#: src/slic3r/GUI/Plater.cpp:4019
msgid "Mirror the selected object along the Y axis"
msgstr "Spiegel het geselecteerde object over de Y-as"
-#: src/slic3r/GUI/Plater.cpp:4051
+#: src/slic3r/GUI/Plater.cpp:4021
msgid "Along Z axis"
-msgstr "Over de Z-as"
+msgstr "Op de Z-as"
-#: src/slic3r/GUI/Plater.cpp:4051
+#: src/slic3r/GUI/Plater.cpp:4021
msgid "Mirror the selected object along the Z axis"
msgstr "Spiegel het geselecteerde object over de Z-as"
-#: src/slic3r/GUI/Plater.cpp:4054
+#: src/slic3r/GUI/Plater.cpp:4024
msgid "Mirror"
msgstr "Spiegelen"
-#: src/slic3r/GUI/Plater.cpp:4054
+#: src/slic3r/GUI/Plater.cpp:4024
msgid "Mirror the selected object"
msgstr "Spiegel het geselecteerde object"
-#: src/slic3r/GUI/Plater.cpp:4066
+#: src/slic3r/GUI/Plater.cpp:4036
msgid "To objects"
msgstr "Aan objecten"
-#: src/slic3r/GUI/Plater.cpp:4066 src/slic3r/GUI/Plater.cpp:4086
+#: src/slic3r/GUI/Plater.cpp:4036 src/slic3r/GUI/Plater.cpp:4056
msgid "Split the selected object into individual objects"
msgstr "Verdeel het geselecteerde object in individuele objecten"
-#: src/slic3r/GUI/Plater.cpp:4068
+#: src/slic3r/GUI/Plater.cpp:4038
msgid "To parts"
msgstr "Aan onderdelen"
-#: src/slic3r/GUI/Plater.cpp:4068 src/slic3r/GUI/Plater.cpp:4100
+#: src/slic3r/GUI/Plater.cpp:4038 src/slic3r/GUI/Plater.cpp:4074
msgid "Split the selected object into individual sub-parts"
msgstr "Deel het geselecteerde object op in meerdere subonderdelen"
-#: src/slic3r/GUI/Plater.cpp:4071 src/slic3r/GUI/Plater.cpp:4086
-#: src/slic3r/GUI/Plater.cpp:4100 src/libslic3r/PrintConfig.cpp:3481
+#: src/slic3r/GUI/Plater.cpp:4041 src/slic3r/GUI/Plater.cpp:4056
+#: src/slic3r/GUI/Plater.cpp:4074 src/libslic3r/PrintConfig.cpp:3759
msgid "Split"
-msgstr "Verdeel"
+msgstr "Splits"
-#: src/slic3r/GUI/Plater.cpp:4071
+#: src/slic3r/GUI/Plater.cpp:4041
msgid "Split the selected object"
msgstr "Verdeel het geselecteerde object"
-#: src/slic3r/GUI/Plater.cpp:4092
+#: src/slic3r/GUI/Plater.cpp:4063
msgid "Optimize orientation"
msgstr "Optimaliseer oriëntatie"
-#: src/slic3r/GUI/Plater.cpp:4092
+#: src/slic3r/GUI/Plater.cpp:4064
msgid "Optimize the rotation of the object for better print results."
msgstr "Optimaliseer de rotatie van het object voor betere printresultaten."
-#: src/slic3r/GUI/Plater.cpp:4149
+#: src/slic3r/GUI/Plater.cpp:4144
msgid "3D editor view"
-msgstr "3D bewerkingsweergave"
+msgstr "3&D-bewerkingsweergave"
-#: src/slic3r/GUI/Plater.cpp:4456
+#: src/slic3r/GUI/Plater.cpp:4516
msgid ""
"%1% printer was active at the time the target Undo / Redo snapshot was "
"taken. Switching to %1% printer requires reloading of %1% presets."
msgstr ""
"%1% de printer was actief op het moment een 'ongedaan maken'- of 'opnieuw "
"doen'-snapshot werd genomen. Schakelen naar %1% printer vereist herladen van "
-"%1% presets."
+"voorinstelling %1%."
-#: src/slic3r/GUI/Plater.cpp:4631
+#: src/slic3r/GUI/Plater.cpp:4720
msgid "Load Project"
msgstr "Laad project"
-#: src/slic3r/GUI/Plater.cpp:4659
-msgid "Import Object"
-msgstr "Importeer object"
-
-#: src/slic3r/GUI/Plater.cpp:4663
+#: src/slic3r/GUI/Plater.cpp:4752
msgid "Import Objects"
msgstr "Importeer objecten"
-#: src/slic3r/GUI/Plater.cpp:4725
+#: src/slic3r/GUI/Plater.cpp:4821
+msgid "The selected file"
+msgstr "Het geselecteerde bestand"
+
+#: src/slic3r/GUI/Plater.cpp:4821
+msgid "does not contain valid gcode."
+msgstr "bevat geen geldige G-code."
+
+#: src/slic3r/GUI/Plater.cpp:4822
+msgid "Error while loading .gcode file"
+msgstr "Probleem bij het laden van het gcode-bestand"
+
+#: src/slic3r/GUI/Plater.cpp:5060
msgid "All objects will be removed, continue?"
msgstr "Alle objecten worden verwijderd. Doorgaan?"
-#: src/slic3r/GUI/Plater.cpp:4733
+#: src/slic3r/GUI/Plater.cpp:5068
msgid "Delete Selected Objects"
msgstr "Verwijder geselecteerde objecten"
-#: src/slic3r/GUI/Plater.cpp:4741
+#: src/slic3r/GUI/Plater.cpp:5076
msgid "Increase Instances"
msgstr "Verhoog aantal instanties"
-#: src/slic3r/GUI/Plater.cpp:4776
+#: src/slic3r/GUI/Plater.cpp:5110
msgid "Decrease Instances"
msgstr "Verlaag aantal instanties"
-#: src/slic3r/GUI/Plater.cpp:4807
+#: src/slic3r/GUI/Plater.cpp:5141
msgid "Enter the number of copies:"
msgstr "Voer het aantal kopieën in:"
-#: src/slic3r/GUI/Plater.cpp:4808
+#: src/slic3r/GUI/Plater.cpp:5142
msgid "Copies of the selected object"
msgstr "Kopieën van het geselecteerde object"
-#: src/slic3r/GUI/Plater.cpp:4812
+#: src/slic3r/GUI/Plater.cpp:5146
#, c-format
msgid "Set numbers of copies to %d"
msgstr "Stel aantal kopieën in voor %d"
-#: src/slic3r/GUI/Plater.cpp:4842
+#: src/slic3r/GUI/Plater.cpp:5212
msgid "Cut by Plane"
-msgstr "Snij met behulp van vlak"
+msgstr "Snij door met vlak"
-#: src/slic3r/GUI/Plater.cpp:4893
+#: src/slic3r/GUI/Plater.cpp:5269
msgid "Save G-code file as:"
-msgstr "gcode-bestand opslaan als:"
+msgstr "G-code-bestand opslaan als:"
-#: src/slic3r/GUI/Plater.cpp:4893
+#: src/slic3r/GUI/Plater.cpp:5269
msgid "Save SL1 file as:"
msgstr "SL1-bestand opslaan als:"
-#: src/slic3r/GUI/Plater.cpp:5028
+#: src/slic3r/GUI/Plater.cpp:5416
#, c-format
msgid "STL file exported to %s"
msgstr "STL-bestand geëxporteerd naar %s"
-#: src/slic3r/GUI/Plater.cpp:5045
+#: src/slic3r/GUI/Plater.cpp:5433
#, c-format
msgid "AMF file exported to %s"
msgstr "AMF-bestand geëxporteerd naar %s"
-#: src/slic3r/GUI/Plater.cpp:5048
+#: src/slic3r/GUI/Plater.cpp:5436
#, c-format
msgid "Error exporting AMF file %s"
msgstr "Fout bij het exporteren van AMF-bestand %s"
-#: src/slic3r/GUI/Plater.cpp:5081
+#: src/slic3r/GUI/Plater.cpp:5465
#, c-format
msgid "3MF file exported to %s"
msgstr "3MF-bestand geëxporteerd naar %s"
-#: src/slic3r/GUI/Plater.cpp:5086
+#: src/slic3r/GUI/Plater.cpp:5470
#, c-format
msgid "Error exporting 3MF file %s"
msgstr "Fout bij het exporteren van 3MF-bestand %s"
-#: src/slic3r/GUI/Plater.cpp:5546
+#: src/slic3r/GUI/Plater.cpp:6007
msgid "Export"
msgstr "Exporteer"
-#: src/slic3r/GUI/Plater.cpp:5632
+#: src/slic3r/GUI/Plater.cpp:6102
msgid "Paste From Clipboard"
msgstr "Plak van klembord"
-#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1846
-#: src/slic3r/GUI/Tab.cpp:2058
+#: src/slic3r/GUI/Preferences.cpp:56 src/slic3r/GUI/Tab.cpp:2098
+#: src/slic3r/GUI/Tab.cpp:2285 src/slic3r/GUI/Tab.cpp:2393
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1080
msgid "General"
msgstr "Algemeen"
-#: src/slic3r/GUI/Preferences.cpp:39
+#: src/slic3r/GUI/Preferences.cpp:69
msgid "Remember output directory"
msgstr "Onthoud de opslaglocatie"
-#: src/slic3r/GUI/Preferences.cpp:41
+#: src/slic3r/GUI/Preferences.cpp:71
msgid ""
"If this is enabled, Slic3r will prompt the last output directory instead of "
"the one containing the input files."
@@ -4805,11 +6115,11 @@ msgstr ""
"Als dit aan staat zal PrusaSlicer de opslaglocatie gebruiken in plaats van "
"de originele locatie."
-#: src/slic3r/GUI/Preferences.cpp:47
+#: src/slic3r/GUI/Preferences.cpp:77
msgid "Auto-center parts"
msgstr "Centreer onderdelen automatisch"
-#: src/slic3r/GUI/Preferences.cpp:49
+#: src/slic3r/GUI/Preferences.cpp:79
msgid ""
"If this is enabled, Slic3r will auto-center objects around the print bed "
"center."
@@ -4817,11 +6127,11 @@ msgstr ""
"Als dit aan staat zal PrusaSlicer objecten automatisch centreren rond het "
"midden."
-#: src/slic3r/GUI/Preferences.cpp:55
+#: src/slic3r/GUI/Preferences.cpp:85
msgid "Background processing"
msgstr "Slicen op de achtergrond"
-#: src/slic3r/GUI/Preferences.cpp:57
+#: src/slic3r/GUI/Preferences.cpp:87
msgid ""
"If this is enabled, Slic3r will pre-process objects as soon as they're "
"loaded in order to save time when exporting G-code."
@@ -4829,7 +6139,7 @@ msgstr ""
"Als dit aanstaat zal PrusaSlicer objecten op de achtergrond slicen om tijd "
"te besparen bij het exporteren van de G-code."
-#: src/slic3r/GUI/Preferences.cpp:66
+#: src/slic3r/GUI/Preferences.cpp:96
msgid ""
"If enabled, PrusaSlicer will check for the new versions of itself online. "
"When a new version becomes available a notification is displayed at the next "
@@ -4841,11 +6151,11 @@ msgstr ""
"keer opstarten. Dit is slechts een melding; er wordt niets automatisch "
"geïnstalleerd."
-#: src/slic3r/GUI/Preferences.cpp:72
+#: src/slic3r/GUI/Preferences.cpp:102
msgid "Export sources full pathnames to 3mf and amf"
msgstr "Exporteer de volledige padnamen naar 3MF- en AMF-bestanden"
-#: src/slic3r/GUI/Preferences.cpp:74
+#: src/slic3r/GUI/Preferences.cpp:104
msgid ""
"If enabled, allows the Reload from disk command to automatically find and "
"load the files when invoked."
@@ -4853,142 +6163,359 @@ msgstr ""
"Als dit is ingeschakeld is het 'herladen van de schijf'-commando toegestaan "
"om automatisch bestanden te vinden en laden als deze worden aangeroepen."
-#: src/slic3r/GUI/Preferences.cpp:82
+#: src/slic3r/GUI/Preferences.cpp:114
+msgid "If enabled, sets PrusaSlicer as default application to open .3mf files."
+msgstr ""
+"Als dit aanstaat wordt PrusaSlicer als standaardprogramma ingesteld om .3mf-"
+"bestanden te openen."
+
+#: src/slic3r/GUI/Preferences.cpp:121
+msgid "If enabled, sets PrusaSlicer as default application to open .stl files."
+msgstr ""
+"Als dit aanstaat wordt PrusaSlicer als standaardprogramma ingesteld om .stl-"
+"bestanden te openen."
+
+#: src/slic3r/GUI/Preferences.cpp:131
msgid ""
"If enabled, Slic3r downloads updates of built-in system presets in the "
"background. These updates are downloaded into a separate temporary location. "
"When a new preset version becomes available it is offered at application "
"startup."
msgstr ""
-"Als dit is ingeschakeld zal PrusaSlicer updates of ingebouwde presets op de "
+"Als dit is ingeschakeld zal PrusaSlicer updates of systeeminstellingen op de "
"achtergrond downloaden. Deze updates worden gedownload naar een tijdelijke "
-"locatie. Als een nieuwe preset beschikbaar komt, zal dit gemeld worden bij "
-"de eerstvolgende keer opstarten."
+"locatie. Als een nieuwe systeeminstelling beschikbaar komt, zal dit gemeld "
+"worden bij de volgende keer opstarten."
-#: src/slic3r/GUI/Preferences.cpp:87
+#: src/slic3r/GUI/Preferences.cpp:136
msgid "Suppress \" - default - \" presets"
-msgstr "Verberg standaardpresets"
+msgstr "Verberg systeeminstellingen"
-#: src/slic3r/GUI/Preferences.cpp:89
+#: src/slic3r/GUI/Preferences.cpp:138
msgid ""
"Suppress \" - default - \" presets in the Print / Filament / Printer "
"selections once there are any other valid presets available."
msgstr ""
-"Verberg standaardpresets bij de print-, filament- en printerpresets als er "
-"andere geldige presets beschikbaar zijn."
+"Verberg systeeminstellingen bij de print-, filament- en printerselecties als "
+"er andere geldige voorinstellingen beschikbaar zijn."
-#: src/slic3r/GUI/Preferences.cpp:95
+#: src/slic3r/GUI/Preferences.cpp:144
msgid "Show incompatible print and filament presets"
-msgstr "Toon incompatibele print- en filamentpresets"
+msgstr "Toon ongeschikte print- en filament-voorinstellingen"
-#: src/slic3r/GUI/Preferences.cpp:97
+#: src/slic3r/GUI/Preferences.cpp:146
msgid ""
"When checked, the print and filament presets are shown in the preset editor "
"even if they are marked as incompatible with the active printer"
msgstr ""
-"Als dit aan staat worden de print- en filamentpresets getoond in de presets-"
-"editor, zelfs als ze als incompatibel met de actieve printer zijn gemarkeerd"
+"Als dit aan staat worden de print- en filament-voorinstellingen getoond in "
+"de voorinstellingen-editor, zelfs als ze als ongeschikt voor de actieve "
+"printer zijn gemarkeerd"
-#: src/slic3r/GUI/Preferences.cpp:104
+#: src/slic3r/GUI/Preferences.cpp:152
+msgid "Show drop project dialog"
+msgstr "Toon plaats project venster"
+
+#: src/slic3r/GUI/Preferences.cpp:154
+msgid ""
+"When checked, whenever dragging and dropping a project file on the "
+"application, shows a dialog asking to select the action to take on the file "
+"to load."
+msgstr ""
+"Als dit aan staat wordt bij het slepen en plaatsen van een projectbestand "
+"een venster getond met de vraag wat gedaan moet worden met het te laden "
+"bestand."
+
+#: src/slic3r/GUI/Preferences.cpp:161 src/slic3r/GUI/Preferences.cpp:165
+msgid "Allow just a single PrusaSlicer instance"
+msgstr "Sta één enkele instantie van PrusaSlicer toe"
+
+#: src/slic3r/GUI/Preferences.cpp:163
+msgid ""
+"On OSX there is always only one instance of app running by default. However "
+"it is allowed to run multiple instances of same app from the command line. "
+"In such case this settings will allow only one instance."
+msgstr ""
+"Op OSX draait er altijd slechts één instantie van het programma. Het is "
+"mogelijk om meerdere instanties van hetzelfde programma te draaien via het "
+"opdrachtenprompt. In zulke gevallen geldt deze instelling slechts voor één "
+"instantie."
+
+#: src/slic3r/GUI/Preferences.cpp:167
+msgid ""
+"If this is enabled, when starting PrusaSlicer and another instance of the "
+"same PrusaSlicer is already running, that instance will be reactivated "
+"instead."
+msgstr ""
+"Als dit is ingeschakeld zal PrusaSlicer een andere instantie van PrusaSlicer "
+"openen als die wordt gestart."
+
+#: src/slic3r/GUI/Preferences.cpp:173
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:671
+msgid "Ask for unsaved changes when closing application"
+msgstr "Vraag naar niet-opgeslagen wijzigingen bij het afsluiten"
+
+#: src/slic3r/GUI/Preferences.cpp:175
+msgid "When closing the application, always ask for unsaved changes"
+msgstr ""
+"Vraag altijd naar niet-opgeslagen wijzigingen als het programma wordt "
+"afgesloten"
+
+#: src/slic3r/GUI/Preferences.cpp:180
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:672
+msgid "Ask for unsaved changes when selecting new preset"
+msgstr ""
+"Vraag naar niet-opgeslagen wijzigingen bij het selecteren van een nieuwe "
+"voorinstelling"
+
+#: src/slic3r/GUI/Preferences.cpp:182
+msgid "Always ask for unsaved changes when selecting new preset"
+msgstr ""
+"Vraag altijd om niet-opgeslagen wijzigingen bij het selecteren van een "
+"nieuwe voorinstelling"
+
+#: src/slic3r/GUI/Preferences.cpp:190
+msgid "Associate .gcode files to PrusaSlicer G-code Viewer"
+msgstr "Open .gcode-bestanden met de PrusaSlicer G-code weergave"
+
+#: src/slic3r/GUI/Preferences.cpp:192
+msgid ""
+"If enabled, sets PrusaSlicer G-code Viewer as default application to open ."
+"gcode files."
+msgstr ""
+"Als dit aanstaat wordt PrusaSlicer G-code Viewer als standaardprogramma "
+"ingesteld om .gcode-bestanden te openen."
+
+#: src/slic3r/GUI/Preferences.cpp:201
msgid "Use Retina resolution for the 3D scene"
msgstr "Gebruik hoge resolutie voor de 3D-scène"
-#: src/slic3r/GUI/Preferences.cpp:106
+#: src/slic3r/GUI/Preferences.cpp:203
msgid ""
"If enabled, the 3D scene will be rendered in Retina resolution. If you are "
"experiencing 3D performance problems, disabling this option may help."
msgstr ""
"Als dit is ingeschakeld zal de 3D-scène worden gerenderd in hoge resolutie. "
-"Als u problemen ondervindt met de prestaties kan het uitschakelen van deze "
+"Als je problemen ondervindt met de prestaties kan het uitschakelen van deze "
"optie mogelijk helpen."
-#: src/slic3r/GUI/Preferences.cpp:113
+#: src/slic3r/GUI/Preferences.cpp:211 src/slic3r/GUI/Preferences.cpp:213
+msgid "Show splash screen"
+msgstr "Toon projectiescherm"
+
+#: src/slic3r/GUI/Preferences.cpp:220
+msgid "Enable support for legacy 3DConnexion devices"
+msgstr "Sta support voor oudere 3DConnexion-apparaten toe"
+
+#: src/slic3r/GUI/Preferences.cpp:222
+msgid ""
+"If enabled, the legacy 3DConnexion devices settings dialog is available by "
+"pressing CTRL+M"
+msgstr ""
+"Als dit aanstaat is de oudere 3DConnexion-apparaten-instellingenvenster "
+"beschikbaar door te drukken op CTRL+M"
+
+#: src/slic3r/GUI/Preferences.cpp:232
msgid "Camera"
msgstr "Camera"
-#: src/slic3r/GUI/Preferences.cpp:119
+#: src/slic3r/GUI/Preferences.cpp:237
msgid "Use perspective camera"
msgstr "Gebruik perspectiefweergave"
-#: src/slic3r/GUI/Preferences.cpp:121
+#: src/slic3r/GUI/Preferences.cpp:239
msgid ""
"If enabled, use perspective camera. If not enabled, use orthographic camera."
msgstr ""
"Als dit is ingeschakeld zal de weergave op perspectief worden gezet. Anders "
"wordt een orthografische weergave gebruikt."
-#: src/slic3r/GUI/Preferences.cpp:126
+#: src/slic3r/GUI/Preferences.cpp:244
msgid "Use free camera"
msgstr "Gebruik vrij beweegbare camera"
-#: src/slic3r/GUI/Preferences.cpp:128
+#: src/slic3r/GUI/Preferences.cpp:246
msgid "If enabled, use free camera. If not enabled, use constrained camera."
msgstr ""
"Als dit is ingeschakeld wordt de vrij beweegbare camera gebruikt, anders een "
"vaste camera."
-#: src/slic3r/GUI/Preferences.cpp:133
+#: src/slic3r/GUI/Preferences.cpp:251
+msgid "Reverse direction of zoom with mouse wheel"
+msgstr "Zoomrichting van scrollwieltje omkeren"
+
+#: src/slic3r/GUI/Preferences.cpp:253
+msgid "If enabled, reverses the direction of zoom with mouse wheel"
+msgstr "Als dit aanstaat wordt de scrollrichting de andere kant op ingesteld"
+
+#: src/slic3r/GUI/Preferences.cpp:261
msgid "GUI"
msgstr "GUI"
-#: src/slic3r/GUI/Preferences.cpp:143
+#: src/slic3r/GUI/Preferences.cpp:276
+msgid "Sequential slider applied only to top layer"
+msgstr "Opeenvolgende schuif alleen toegepast op toplaag"
+
+#: src/slic3r/GUI/Preferences.cpp:278
+msgid ""
+"If enabled, changes made using the sequential slider, in preview, apply only "
+"to gcode top layer. If disabled, changes made using the sequential slider, "
+"in preview, apply to the whole gcode."
+msgstr ""
+"Sta toe om wijzigingen van de opeenvolgende schuif in de voorbeeldweergave "
+"alleen toe te passen op de toplaag. Als dit uitstaat worden wijzigingen "
+"toegepast op de hele G-code."
+
+#: src/slic3r/GUI/Preferences.cpp:285
+msgid "Show sidebar collapse/expand button"
+msgstr "Toon zijbalk in-/uitklappen-knop"
+
+#: src/slic3r/GUI/Preferences.cpp:287
+msgid ""
+"If enabled, the button for the collapse sidebar will be appeared in top "
+"right corner of the 3D Scene"
+msgstr ""
+"Als dit is ingeschakeld zal de knop om de zijbalk in te klappen getoond "
+"worden in de rechterbovenhoek van de 3D-bewerkingsweergave"
+
+#: src/slic3r/GUI/Preferences.cpp:292
+msgid "Suppress to open hyperlink in browser"
+msgstr "Hyperlinks openen in browser uitzetten"
+
+#: src/slic3r/GUI/Preferences.cpp:294
+msgid ""
+"If enabled, the descriptions of configuration parameters in settings tabs "
+"wouldn't work as hyperlinks. If disabled, the descriptions of configuration "
+"parameters in settings tabs will work as hyperlinks."
+msgstr ""
+"Als dit is ingeschakeld werken de beschrijvingen van configuratieparameters "
+"in de instellingentab niet als hyperlinks. Als dit uitstaat werken ze wel "
+"als hyperlinks."
+
+#: src/slic3r/GUI/Preferences.cpp:300
msgid "Use custom size for toolbar icons"
msgstr "Aangepaste pictogramgrootte in de 3D-weergave"
-#: src/slic3r/GUI/Preferences.cpp:145
+#: src/slic3r/GUI/Preferences.cpp:302
msgid "If enabled, you can change size of toolbar icons manually."
msgstr ""
"Hiermee kan de grootte van werkbalkpictogrammen handmatig ingesteld worden."
-#: src/slic3r/GUI/Preferences.cpp:172
+#: src/slic3r/GUI/Preferences.cpp:320
+msgid "Render"
+msgstr "Render"
+
+#: src/slic3r/GUI/Preferences.cpp:325
+msgid "Use environment map"
+msgstr "Gebruik omgevingskaart"
+
+#: src/slic3r/GUI/Preferences.cpp:327
+msgid "If enabled, renders object using the environment map."
+msgstr "Als dit aanstaat worden objecten gerenderd met de omgevingskaart."
+
+#: src/slic3r/GUI/Preferences.cpp:352
#, c-format
msgid "You need to restart %s to make the changes effective."
msgstr "U moet %s opnieuw opstarten om wijzigingen door te voeren."
-#: src/slic3r/GUI/Preferences.cpp:222
+#: src/slic3r/GUI/Preferences.cpp:427
msgid "Icon size in a respect to the default size"
msgstr "Pictogramgrootte vergeleken met de originele grootte"
-#: src/slic3r/GUI/Preferences.cpp:237
+#: src/slic3r/GUI/Preferences.cpp:442
msgid "Select toolbar icon size in respect to the default one."
msgstr "Selecteer werkbalk-pictogramgrootte in verhouding tot de originele."
-#: src/slic3r/GUI/Preset.cpp:247
-msgid "modified"
-msgstr "aangepast"
+#: src/slic3r/GUI/Preferences.cpp:473
+msgid "Old regular layout with the tab bar"
+msgstr "Oude standaardlayout met de tabbladen"
+
+#: src/slic3r/GUI/Preferences.cpp:474
+msgid "New layout, access via settings button in the top menu"
+msgstr ""
+"Nieuwe layout, krijg toegang tot de instellingen via de instellingenknop in "
+"het topmenu"
+
+#: src/slic3r/GUI/Preferences.cpp:475
+msgid "Settings in non-modal window"
+msgstr "Instelling voor niet-modaal venster"
-#: src/slic3r/GUI/Preset.cpp:1139 src/slic3r/GUI/Preset.cpp:1194
-#: src/slic3r/GUI/Preset.cpp:1272 src/slic3r/GUI/Preset.cpp:1314
-#: src/slic3r/GUI/PresetBundle.cpp:1591 src/slic3r/GUI/PresetBundle.cpp:1689
+#: src/slic3r/GUI/Preferences.cpp:484
+msgid "Layout Options"
+msgstr "Layout-opties"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:197
+#: src/slic3r/GUI/PresetComboBoxes.cpp:235
+#: src/slic3r/GUI/PresetComboBoxes.cpp:761
+#: src/slic3r/GUI/PresetComboBoxes.cpp:811
+#: src/slic3r/GUI/PresetComboBoxes.cpp:925
+#: src/slic3r/GUI/PresetComboBoxes.cpp:969
msgid "System presets"
-msgstr "Systeempresets"
+msgstr "Systeeminstellingen"
-#: src/slic3r/GUI/Preset.cpp:1198 src/slic3r/GUI/Preset.cpp:1318
-#: src/slic3r/GUI/PresetBundle.cpp:1694
+#: src/slic3r/GUI/PresetComboBoxes.cpp:239
+#: src/slic3r/GUI/PresetComboBoxes.cpp:815
+#: src/slic3r/GUI/PresetComboBoxes.cpp:973
msgid "User presets"
-msgstr "Presets van de gebruiker"
+msgstr "Voorinstellingen van de gebruiker"
-#: src/slic3r/GUI/Preset.cpp:1231
-msgid "Add/Remove materials"
-msgstr "Verwijder of voeg materialen toe"
+#: src/slic3r/GUI/PresetComboBoxes.cpp:250
+msgid "Incompatible presets"
+msgstr "Ongeschikte voorinstellingen"
-#: src/slic3r/GUI/Preset.cpp:1233
-msgid "Add/Remove printers"
-msgstr "Voeg toe/verwijder printers"
+#: src/slic3r/GUI/PresetComboBoxes.cpp:285
+msgid "Are you sure you want to delete \"%1%\" printer?"
+msgstr "Weet je zeker dat je \"%1%\"-printer wilt verwijderen?"
-#: src/slic3r/GUI/Preset.cpp:1552
-msgid "filament"
-msgstr "filament"
+#: src/slic3r/GUI/PresetComboBoxes.cpp:287
+msgid "Delete Physical Printer"
+msgstr "Verwijder fysieke printer"
-#: src/slic3r/GUI/Preset.cpp:1553
-msgid "SLA print"
-msgstr "SLA-print"
+#: src/slic3r/GUI/PresetComboBoxes.cpp:624
+msgid "Click to edit preset"
+msgstr "Klik om de voorinstelling te wijzigen"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:680
+#: src/slic3r/GUI/PresetComboBoxes.cpp:710
+msgid "Add/Remove presets"
+msgstr "Toevoegen/verwijderen van voorinstellingen"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:685
+#: src/slic3r/GUI/PresetComboBoxes.cpp:715 src/slic3r/GUI/Tab.cpp:2990
+msgid "Add physical printer"
+msgstr "Voeg fysieke printer toe"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:699
+msgid "Edit preset"
+msgstr "Bewerk voorinstelling"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:703 src/slic3r/GUI/Tab.cpp:2990
+msgid "Edit physical printer"
+msgstr "Bewerk fysieke printer"
-#: src/slic3r/GUI/PresetBundle.cpp:1721
+#: src/slic3r/GUI/PresetComboBoxes.cpp:706
+msgid "Delete physical printer"
+msgstr "Verwijder fysieke printer"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:826
+#: src/slic3r/GUI/PresetComboBoxes.cpp:987
+msgid "Physical printers"
+msgstr "Fysieke printers"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:850
msgid "Add/Remove filaments"
msgstr "Verwijder of voeg filamenten toe"
-#: src/slic3r/GUI/PresetHints.cpp:29
+#: src/slic3r/GUI/PresetComboBoxes.cpp:852
+msgid "Add/Remove materials"
+msgstr "Verwijder of voeg materialen toe"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:854
+#: src/slic3r/GUI/PresetComboBoxes.cpp:1011
+msgid "Add/Remove printers"
+msgstr "Voeg toe/verwijder printers"
+
+#: src/slic3r/GUI/PresetHints.cpp:32
msgid ""
"If estimated layer time is below ~%1%s, fan will run at %2%%% and print "
"speed will be reduced so that no less than %3%s are spent on that layer "
@@ -4998,7 +6525,7 @@ msgstr ""
"%2%%% en de printsnelheid wordt zover gereduceerd dat niet meer dan %3%s "
"worden gebruikt voor die laag (echter nooit langzamer dan %4%mm/s)."
-#: src/slic3r/GUI/PresetHints.cpp:36
+#: src/slic3r/GUI/PresetHints.cpp:39
msgid ""
"If estimated layer time is greater, but still below ~%1%s, fan will run at a "
"proportionally decreasing speed between %2%%% and %3%%%."
@@ -5007,92 +6534,98 @@ msgstr ""
"ventilator draaien op een proportioneel verlagende snelheid tussen %2%%% en "
"%3%%%."
-#: src/slic3r/GUI/PresetHints.cpp:40
-msgid "During the other layers, fan"
-msgstr "Tijdens de overige lagen zal de ventilator"
-
-#: src/slic3r/GUI/PresetHints.cpp:42
-msgid "Fan"
-msgstr "De ventilator zal"
+#: src/slic3r/GUI/PresetHints.cpp:49
+msgid "Fan speed will be ramped from zero at layer %1% to %2%%% at layer %3%."
+msgstr ""
+"Ventilatorsnelheid wordt geleidelijk opgevoerd van 0 op laag %1% naar %2%%% "
+"op laag %3%."
-#: src/slic3r/GUI/PresetHints.cpp:48
-msgid "will always run at %1%%%"
-msgstr "altijd draaien op %1%%%"
+#: src/slic3r/GUI/PresetHints.cpp:51
+msgid "During the other layers, fan will always run at %1%%%"
+msgstr "De ventilator draait altijd op %1%%% tijdens de andere lagen"
#: src/slic3r/GUI/PresetHints.cpp:51
+msgid "Fan will always run at %1%%%"
+msgstr "Ventilator draait altijd op %1%%%"
+
+#: src/slic3r/GUI/PresetHints.cpp:53
msgid "except for the first %1% layers."
msgstr "behalve voor de eerste %1% lagen."
-#: src/slic3r/GUI/PresetHints.cpp:53
+#: src/slic3r/GUI/PresetHints.cpp:55
msgid "except for the first layer."
msgstr "behalve voor de eerste laag."
-#: src/slic3r/GUI/PresetHints.cpp:55
-msgid "will be turned off."
-msgstr "wordt uitgeschakeld."
+#: src/slic3r/GUI/PresetHints.cpp:58
+msgid "During the other layers, fan will be turned off."
+msgstr "De ventilator staat uit tijdens de andere lagen."
-#: src/slic3r/GUI/PresetHints.cpp:156
+#: src/slic3r/GUI/PresetHints.cpp:58
+msgid "Fan will be turned off."
+msgstr "Ventilator staat uit."
+
+#: src/slic3r/GUI/PresetHints.cpp:159
msgid "external perimeters"
msgstr "buitenperimeters"
-#: src/slic3r/GUI/PresetHints.cpp:165
+#: src/slic3r/GUI/PresetHints.cpp:168
msgid "perimeters"
msgstr "perimeters"
-#: src/slic3r/GUI/PresetHints.cpp:174
+#: src/slic3r/GUI/PresetHints.cpp:177
msgid "infill"
msgstr "vulling"
-#: src/slic3r/GUI/PresetHints.cpp:184
+#: src/slic3r/GUI/PresetHints.cpp:187
msgid "solid infill"
msgstr "dichte vulling"
-#: src/slic3r/GUI/PresetHints.cpp:192
+#: src/slic3r/GUI/PresetHints.cpp:195
msgid "top solid infill"
msgstr "bovenste dichte vulling"
-#: src/slic3r/GUI/PresetHints.cpp:203
+#: src/slic3r/GUI/PresetHints.cpp:206
msgid "support"
msgstr "support"
-#: src/slic3r/GUI/PresetHints.cpp:213
+#: src/slic3r/GUI/PresetHints.cpp:216
msgid "support interface"
msgstr "supportinterface"
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:222
msgid "First layer volumetric"
msgstr "Eerste laag volumetrisch"
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:222
msgid "Bridging volumetric"
msgstr "Volumetrische bruggen"
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:222
msgid "Volumetric"
msgstr "Volumetrisch"
-#: src/slic3r/GUI/PresetHints.cpp:220
+#: src/slic3r/GUI/PresetHints.cpp:223
msgid "flow rate is maximized"
msgstr "debiet is gemaximaliseerd"
-#: src/slic3r/GUI/PresetHints.cpp:223
+#: src/slic3r/GUI/PresetHints.cpp:226
msgid "by the print profile maximum"
msgstr "door het printprofiel maximaal"
-#: src/slic3r/GUI/PresetHints.cpp:224
+#: src/slic3r/GUI/PresetHints.cpp:227
msgid "when printing"
msgstr "tijdens het printen"
-#: src/slic3r/GUI/PresetHints.cpp:225
+#: src/slic3r/GUI/PresetHints.cpp:228
msgid "with a volumetric rate"
msgstr "met een volumetrische ratio"
-#: src/slic3r/GUI/PresetHints.cpp:229
+#: src/slic3r/GUI/PresetHints.cpp:232
#, c-format
msgid "%3.2f mm³/s at filament speed %3.2f mm/s."
msgstr "%3.2f mm³/s met een filamentsnelheid van %3.2f mm/s."
-#: src/slic3r/GUI/PresetHints.cpp:247
+#: src/slic3r/GUI/PresetHints.cpp:250
msgid ""
"Recommended object thin wall thickness: Not available due to invalid layer "
"height."
@@ -5100,116 +6633,120 @@ msgstr ""
"Aanbevolen minimale wanddikte. Niet beschikbaar in verband met ongeldige "
"laagdikte."
-#: src/slic3r/GUI/PresetHints.cpp:263
+#: src/slic3r/GUI/PresetHints.cpp:266
#, c-format
msgid "Recommended object thin wall thickness for layer height %.2f and"
msgstr "Aanbevolen objecten met dunne wanden voor laagdikte %.2fmm en"
-#: src/slic3r/GUI/PresetHints.cpp:270
+#: src/slic3r/GUI/PresetHints.cpp:273
#, c-format
msgid "%d lines: %.2f mm"
msgstr "%d lijnen: %.2fmm"
-#: src/slic3r/GUI/PresetHints.cpp:274
+#: src/slic3r/GUI/PresetHints.cpp:277
msgid ""
"Recommended object thin wall thickness: Not available due to excessively "
"small extrusion width."
msgstr ""
"Aanbevolen dunne wanden: not beschikbaar door extreem smalle extrusiebreedte."
-#: src/slic3r/GUI/PresetHints.cpp:304
+#: src/slic3r/GUI/PresetHints.cpp:306
msgid ""
"Top / bottom shell thickness hint: Not available due to invalid layer height."
msgstr ""
"Top/bodem-shelldikte hint: niet beschikbaar door een ongeldige laagdikte."
-#: src/slic3r/GUI/PresetHints.cpp:317
+#: src/slic3r/GUI/PresetHints.cpp:319
msgid "Top shell is %1% mm thick for layer height %2% mm."
-msgstr "Topzijde is %1% mm dik bij een laagdikte van %2% mm."
+msgstr "Bovenzijde is %1% mm dik bij een laagdikte van %2% mm."
-#: src/slic3r/GUI/PresetHints.cpp:320
+#: src/slic3r/GUI/PresetHints.cpp:322
msgid "Minimum top shell thickness is %1% mm."
msgstr "Minimale dikte van de bovenzijde is %1% mm."
-#: src/slic3r/GUI/PresetHints.cpp:323
+#: src/slic3r/GUI/PresetHints.cpp:325
msgid "Top is open."
msgstr "Bovenzijde is open."
-#: src/slic3r/GUI/PresetHints.cpp:336
+#: src/slic3r/GUI/PresetHints.cpp:338
msgid "Bottom shell is %1% mm thick for layer height %2% mm."
-msgstr "Bodemzijde is %1% mm dik bij een laagdikte van %2% mm."
+msgstr "Onderzijde is %1% mm dik bij een laagdikte van %2% mm."
-#: src/slic3r/GUI/PresetHints.cpp:339
+#: src/slic3r/GUI/PresetHints.cpp:341
msgid "Minimum bottom shell thickness is %1% mm."
msgstr "Minimale dikte van onderzijde is %1% mm."
-#: src/slic3r/GUI/PresetHints.cpp:342
+#: src/slic3r/GUI/PresetHints.cpp:344
msgid "Bottom is open."
msgstr "Onderzijde is open."
-#: src/slic3r/GUI/PrintHostDialogs.cpp:33
+#: src/slic3r/GUI/PrintHostDialogs.cpp:35
msgid "Send G-Code to printer host"
msgstr "Stuur G-code naar printerhost"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:33
+#: src/slic3r/GUI/PrintHostDialogs.cpp:35
msgid "Upload to Printer Host with the following filename:"
msgstr "Upload naar printerhost met de volgende bestandsnaam:"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:35
+#: src/slic3r/GUI/PrintHostDialogs.cpp:37
msgid "Start printing after upload"
msgstr "Print starten na het uploaden"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:42
+#: src/slic3r/GUI/PrintHostDialogs.cpp:45
msgid "Use forward slashes ( / ) as a directory separator if needed."
msgstr ""
"Gebruik schuine streepjes ( / ) als mapscheidingstekens als dat nodig is."
-#: src/slic3r/GUI/PrintHostDialogs.cpp:149
+#: src/slic3r/GUI/PrintHostDialogs.cpp:58
+msgid "Group"
+msgstr "Groep"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:176
msgid "ID"
msgstr "ID"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:150
+#: src/slic3r/GUI/PrintHostDialogs.cpp:177
msgid "Progress"
msgstr "Voortgang"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:151
+#: src/slic3r/GUI/PrintHostDialogs.cpp:178
msgid "Status"
msgstr "Status"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:152
+#: src/slic3r/GUI/PrintHostDialogs.cpp:179
msgid "Host"
msgstr "Host"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:153
+#: src/slic3r/GUI/PrintHostDialogs.cpp:180
msgid "Filename"
msgstr "Bestandsnaam"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:154
+#: src/slic3r/GUI/PrintHostDialogs.cpp:181
msgid "Error Message"
msgstr "Foutbericht"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:157
+#: src/slic3r/GUI/PrintHostDialogs.cpp:184
msgid "Cancel selected"
msgstr "Annuleren geselecteerd"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:159
+#: src/slic3r/GUI/PrintHostDialogs.cpp:186
msgid "Show error message"
msgstr "Toon foutbericht"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:198
-#: src/slic3r/GUI/PrintHostDialogs.cpp:229
+#: src/slic3r/GUI/PrintHostDialogs.cpp:228
+#: src/slic3r/GUI/PrintHostDialogs.cpp:261
msgid "Enqueued"
msgstr "In de wachtrij geplaatst"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:230
+#: src/slic3r/GUI/PrintHostDialogs.cpp:262
msgid "Uploading"
msgstr "Uploaden"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:234
+#: src/slic3r/GUI/PrintHostDialogs.cpp:266
msgid "Completed"
msgstr "Voltooid"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:272
+#: src/slic3r/GUI/PrintHostDialogs.cpp:304
msgid "Error uploading to print host:"
msgstr "Fout bij het uploaden naar de printhost:"
@@ -5217,17 +6754,13 @@ msgstr "Fout bij het uploaden naar de printhost:"
msgid "NO RAMMING AT ALL"
msgstr "Fout: geen ramming"
-#: src/slic3r/GUI/RammingChart.cpp:76
-msgid "Time"
-msgstr "Tijd"
-
#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83
-#: src/libslic3r/PrintConfig.cpp:644 src/libslic3r/PrintConfig.cpp:688
-#: src/libslic3r/PrintConfig.cpp:703 src/libslic3r/PrintConfig.cpp:2408
-#: src/libslic3r/PrintConfig.cpp:2417 src/libslic3r/PrintConfig.cpp:2527
-#: src/libslic3r/PrintConfig.cpp:2535 src/libslic3r/PrintConfig.cpp:2543
-#: src/libslic3r/PrintConfig.cpp:2550 src/libslic3r/PrintConfig.cpp:2558
-#: src/libslic3r/PrintConfig.cpp:2566
+#: src/libslic3r/PrintConfig.cpp:706 src/libslic3r/PrintConfig.cpp:750
+#: src/libslic3r/PrintConfig.cpp:765 src/libslic3r/PrintConfig.cpp:2636
+#: src/libslic3r/PrintConfig.cpp:2645 src/libslic3r/PrintConfig.cpp:2755
+#: src/libslic3r/PrintConfig.cpp:2763 src/libslic3r/PrintConfig.cpp:2771
+#: src/libslic3r/PrintConfig.cpp:2778 src/libslic3r/PrintConfig.cpp:2786
+#: src/libslic3r/PrintConfig.cpp:2794
msgid "s"
msgstr "s"
@@ -5235,90 +6768,182 @@ msgstr "s"
msgid "Volumetric speed"
msgstr "Volumetrische snelheid"
-#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:601
-#: src/libslic3r/PrintConfig.cpp:1250
+#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:663
+#: src/libslic3r/PrintConfig.cpp:1458
msgid "mm³/s"
msgstr "mm³/s"
-#: src/slic3r/GUI/Selection.cpp:147
+#: src/slic3r/GUI/SavePresetDialog.cpp:57
+#, c-format
+msgid "Save %s as:"
+msgstr "%s opslaan als:"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:110
+msgid "the following suffix is not allowed:"
+msgstr "het volgende achtervoegsel is niet toegestaan:"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:116
+msgid "The supplied name is not available."
+msgstr "De ingevoerde naam is niet beschikbaar."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:122
+msgid "Cannot overwrite a system profile."
+msgstr "Een systeemprofiel kan niet overschreven worden."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:127
+msgid "Cannot overwrite an external profile."
+msgstr "Een extern profiel kan niet overschreven worden."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:134
+msgid "Preset with name \"%1%\" already exists."
+msgstr "Voorinstelling met de naam '%1%' bestaat al."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:136
+msgid ""
+"Preset with name \"%1%\" already exists and is incompatible with selected "
+"printer."
+msgstr ""
+"Voorinstelling met de naam \"%1%\" bestaat al en is ongeschikt voor de "
+"geselecteerde printer."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:137
+msgid "Note: This preset will be replaced after saving"
+msgstr "Let op: deze voorinstelling wordt vervangen na het opslaan"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:142
+msgid "The name cannot be empty."
+msgstr "De naam is ongeldig."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:147
+msgid "The name cannot start with space character."
+msgstr "De naam kan niet starten met een spatie."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:152
+msgid "The name cannot end with space character."
+msgstr "De naam kan niet eindigen met een spatie."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:186
+#: src/slic3r/GUI/SavePresetDialog.cpp:192
+msgid "Save preset"
+msgstr "Voorinstelling opslaan"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:215
+msgctxt "PresetName"
+msgid "Copy"
+msgstr "Kopie"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:273
+msgid ""
+"You have selected physical printer \"%1%\" \n"
+"with related printer preset \"%2%\""
+msgstr ""
+"Je heb de fysieke printer \"%1%\" geselecteerd\n"
+"met gerelateerde printer-voorinstelling \"%2%\""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:306
+msgid "What would you like to do with \"%1%\" preset after saving?"
+msgstr "Wat wil je doen met de voorinstelling \"%1%\" na het opslaan?"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:309
+msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\""
+msgstr "Verander \"%1%\" naar \"%2%\" voor deze fysieke printer \"%3%\""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:310
+msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\""
+msgstr ""
+"Voeg \"%1%\" als volgende voorinstelling toe aan de fysieke printer \"%2%\""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:311
+msgid "Just switch to \"%1%\" preset"
+msgstr "Schakel naar de \"%1%\"-voorinstelling"
+
+#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2421
+msgid "Stealth"
+msgstr "Stille modus"
+
+#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2415
+msgid "Normal"
+msgstr "Normaal"
+
+#: src/slic3r/GUI/Selection.cpp:172
msgid "Selection-Add"
msgstr "Selectie - Voeg toe"
-#: src/slic3r/GUI/Selection.cpp:188
+#: src/slic3r/GUI/Selection.cpp:213
msgid "Selection-Remove"
msgstr "Selectie - Verwijder"
-#: src/slic3r/GUI/Selection.cpp:220
+#: src/slic3r/GUI/Selection.cpp:245
msgid "Selection-Add Object"
msgstr "Selectie - Voeg object toe"
-#: src/slic3r/GUI/Selection.cpp:239
+#: src/slic3r/GUI/Selection.cpp:264
msgid "Selection-Remove Object"
msgstr "Selectie - Verwijder object"
-#: src/slic3r/GUI/Selection.cpp:257
+#: src/slic3r/GUI/Selection.cpp:282
msgid "Selection-Add Instance"
msgstr "Selectie - Voeg instantie toe"
-#: src/slic3r/GUI/Selection.cpp:276
+#: src/slic3r/GUI/Selection.cpp:301
msgid "Selection-Remove Instance"
msgstr "Selectie - Verwijder instantie"
-#: src/slic3r/GUI/Selection.cpp:377
+#: src/slic3r/GUI/Selection.cpp:402
msgid "Selection-Add All"
msgstr "Selectie - Voeg alle toe"
-#: src/slic3r/GUI/Selection.cpp:403
+#: src/slic3r/GUI/Selection.cpp:428
msgid "Selection-Remove All"
msgstr "Selectie - Verwijder alle"
-#: src/slic3r/GUI/Selection.cpp:940
+#: src/slic3r/GUI/Selection.cpp:960
msgid "Scale To Fit"
msgstr "Verschaal tot het past"
-#: src/slic3r/GUI/Selection.cpp:1477
+#: src/slic3r/GUI/Selection.cpp:1487
msgid "Set Printable Instance"
msgstr "Stel printbare instanties in"
-#: src/slic3r/GUI/Selection.cpp:1477
+#: src/slic3r/GUI/Selection.cpp:1487
msgid "Set Unprintable Instance"
msgstr "Stel instantie in op niet-printbaar"
-#: src/slic3r/GUI/SysInfoDialog.cpp:78
+#: src/slic3r/GUI/SysInfoDialog.cpp:82
msgid "System Information"
msgstr "Systeeminformatie"
-#: src/slic3r/GUI/SysInfoDialog.cpp:154
+#: src/slic3r/GUI/SysInfoDialog.cpp:158
msgid "Copy to Clipboard"
msgstr "Kopieer van klembord"
-#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:265
+#: src/slic3r/GUI/Tab.cpp:109 src/libslic3r/PrintConfig.cpp:321
msgid "Compatible printers"
-msgstr "Compatibele printers"
+msgstr "Geschikte printers"
-#: src/slic3r/GUI/Tab.cpp:51
+#: src/slic3r/GUI/Tab.cpp:110
msgid "Select the printers this profile is compatible with."
-msgstr "Selecteer de printers die compatibel met dit profiel zijn."
+msgstr "Selecteer de printers die geschikt voor dit profiel zijn."
-#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:280
+#: src/slic3r/GUI/Tab.cpp:115 src/libslic3r/PrintConfig.cpp:336
msgid "Compatible print profiles"
-msgstr "Compatibele printprofielen"
+msgstr "Geschikte printprofielen"
-#: src/slic3r/GUI/Tab.cpp:57
+#: src/slic3r/GUI/Tab.cpp:116
msgid "Select the print profiles this profile is compatible with."
-msgstr "Selecteer de printprofielen die compatibel met dit profiel zijn."
+msgstr "Selecteer de printprofielen die geschikt voor dit profiel zijn."
#. TRN "Save current Settings"
-#: src/slic3r/GUI/Tab.cpp:133
+#: src/slic3r/GUI/Tab.cpp:211
#, c-format
msgid "Save current %s"
msgstr "Huidige %s opslaan"
-#: src/slic3r/GUI/Tab.cpp:134
+#: src/slic3r/GUI/Tab.cpp:212
msgid "Delete this preset"
-msgstr "Verwijder preset"
+msgstr "Verwijder voorinstelling"
-#: src/slic3r/GUI/Tab.cpp:139
+#: src/slic3r/GUI/Tab.cpp:216
msgid ""
"Hover the cursor over buttons to find more information \n"
"or click this button."
@@ -5326,364 +6951,338 @@ msgstr ""
"Beweeg de cursor over de knoppen voor meer informatie\n"
"of klik op deze knop."
-#: src/slic3r/GUI/Tab.cpp:241
-msgid "Add a new printer"
-msgstr "Voeg een nieuwe printer toe"
+#: src/slic3r/GUI/Tab.cpp:220
+msgid "Search in settings [%1%]"
+msgstr "Zoek in instellingen [%1%]"
-#: src/slic3r/GUI/Tab.cpp:963
+#: src/slic3r/GUI/Tab.cpp:1237
msgid "Detach from system preset"
-msgstr "Ontkoppel van systeempreset"
+msgstr "Ontkoppel van systeeminstelling"
-#: src/slic3r/GUI/Tab.cpp:975
+#: src/slic3r/GUI/Tab.cpp:1250
msgid ""
"A copy of the current system preset will be created, which will be detached "
"from the system preset."
msgstr ""
-"Een kopie van de huidige systeempreset wordt aangemaakt. Deze wordt "
+"Een kopie van de huidige voorinstellingen wordt aangemaakt. Deze wordt "
"ontkoppeld van het origineel."
-#: src/slic3r/GUI/Tab.cpp:976
+#: src/slic3r/GUI/Tab.cpp:1251
msgid ""
"The current custom preset will be detached from the parent system preset."
-msgstr "De huidige custom preset wordt ontkoppeld van de originele preset."
+msgstr ""
+"De huidige voorinstelling wordt ontkoppeld van de originele voorinstelling."
-#: src/slic3r/GUI/Tab.cpp:979
+#: src/slic3r/GUI/Tab.cpp:1254
msgid "Modifications to the current profile will be saved."
msgstr "Aanpassingen aan het huidige profiel worden opgeslagen."
-#: src/slic3r/GUI/Tab.cpp:982
+#: src/slic3r/GUI/Tab.cpp:1257
msgid ""
"This action is not revertable.\n"
"Do you want to proceed?"
msgstr ""
"Deze actie kan niet ongedaan gemaakt worden.\n"
-"Weet u zeker dat u wilt doorgaan?"
+"Weet je zeker dat je door wil gaan?"
-#: src/slic3r/GUI/Tab.cpp:984
+#: src/slic3r/GUI/Tab.cpp:1259
msgid "Detach preset"
-msgstr "Ontkoppel preset"
+msgstr "Ontkoppel voorinstelling"
-#: src/slic3r/GUI/Tab.cpp:1010
+#: src/slic3r/GUI/Tab.cpp:1285
msgid "This is a default preset."
-msgstr "Dit is een standaard preset."
+msgstr "Dit is een systeeminstelling."
-#: src/slic3r/GUI/Tab.cpp:1012
+#: src/slic3r/GUI/Tab.cpp:1287
msgid "This is a system preset."
-msgstr "Dit is een systeempreset."
+msgstr "Dit is een systeeminstelling."
-#: src/slic3r/GUI/Tab.cpp:1014
+#: src/slic3r/GUI/Tab.cpp:1289
msgid "Current preset is inherited from the default preset."
-msgstr "Huidige preset is gebaseerd op de standaard preset."
+msgstr "Huidige voorinstelling is gebaseerd op de standaard systeeminstelling."
-#: src/slic3r/GUI/Tab.cpp:1016
+#: src/slic3r/GUI/Tab.cpp:1293
msgid "Current preset is inherited from"
-msgstr "Huidige preset is afgeleid van"
+msgstr "Huidige voorinstelling is afgeleid van"
-#: src/slic3r/GUI/Tab.cpp:1020
+#: src/slic3r/GUI/Tab.cpp:1297
msgid "It can't be deleted or modified."
msgstr "Kan niet verwijderd of aangepast worden."
-#: src/slic3r/GUI/Tab.cpp:1021
+#: src/slic3r/GUI/Tab.cpp:1298
msgid ""
"Any modifications should be saved as a new preset inherited from this one."
msgstr ""
-"Eventuele wijzigingen moet worden opgeslagen als een nieuwe preset die is "
-"gebaseerd op de huidige."
+"Eventuele wijzigingen moet worden opgeslagen als een nieuwe voorinstelling "
+"die gebaseerd is op de huidige."
-#: src/slic3r/GUI/Tab.cpp:1022
+#: src/slic3r/GUI/Tab.cpp:1299
msgid "To do that please specify a new name for the preset."
-msgstr "Geef daarvoor een nieuwe naam aan de preset."
+msgstr "Geef daarvoor een nieuwe naam aan de voorinstelling."
-#: src/slic3r/GUI/Tab.cpp:1026
+#: src/slic3r/GUI/Tab.cpp:1303
msgid "Additional information:"
-msgstr "Additionele informatie:"
+msgstr "Aanvullende informatie:"
-#: src/slic3r/GUI/Tab.cpp:1032
+#: src/slic3r/GUI/Tab.cpp:1309
msgid "printer model"
msgstr "printermodel"
-#: src/slic3r/GUI/Tab.cpp:1040
+#: src/slic3r/GUI/Tab.cpp:1317
msgid "default print profile"
msgstr "standaard printprofiel"
-#: src/slic3r/GUI/Tab.cpp:1043
+#: src/slic3r/GUI/Tab.cpp:1320
msgid "default filament profile"
msgstr "standaard filamentprofiel"
-#: src/slic3r/GUI/Tab.cpp:1057
+#: src/slic3r/GUI/Tab.cpp:1334
msgid "default SLA material profile"
msgstr "standaard SLA-materiaalprofiel"
-#: src/slic3r/GUI/Tab.cpp:1061
+#: src/slic3r/GUI/Tab.cpp:1338
msgid "default SLA print profile"
msgstr "standaard SLA-printprofiel"
-#: src/slic3r/GUI/Tab.cpp:1069
+#: src/slic3r/GUI/Tab.cpp:1346
msgid "full profile name"
msgstr "volledige profielnaam"
-#: src/slic3r/GUI/Tab.cpp:1070
+#: src/slic3r/GUI/Tab.cpp:1347
msgid "symbolic profile name"
msgstr "symbolische profielnaam"
-#: src/slic3r/GUI/Tab.cpp:1108 src/slic3r/GUI/Tab.cpp:3654
+#: src/slic3r/GUI/Tab.cpp:1385 src/slic3r/GUI/Tab.cpp:4042
msgid "Layers and perimeters"
msgstr "Lagen en perimeters"
-#: src/slic3r/GUI/Tab.cpp:1113
+#: src/slic3r/GUI/Tab.cpp:1391
msgid "Vertical shells"
msgstr "Verticale shells"
-#: src/slic3r/GUI/Tab.cpp:1124
+#: src/slic3r/GUI/Tab.cpp:1403
msgid "Horizontal shells"
msgstr "Horizontale shells"
-#: src/slic3r/GUI/Tab.cpp:1125 src/libslic3r/PrintConfig.cpp:1780
+#: src/slic3r/GUI/Tab.cpp:1404 src/libslic3r/PrintConfig.cpp:1980
msgid "Solid layers"
msgstr "Dichte lagen"
-#: src/slic3r/GUI/Tab.cpp:1129
+#: src/slic3r/GUI/Tab.cpp:1409
msgid "Minimum shell thickness"
msgstr "Minimale shelldikte"
-#: src/slic3r/GUI/Tab.cpp:1140
+#: src/slic3r/GUI/Tab.cpp:1420
msgid "Quality (slower slicing)"
msgstr "Kwaliteit (slicen kan langer duren)"
-#: src/slic3r/GUI/Tab.cpp:1158
+#: src/slic3r/GUI/Tab.cpp:1448
msgid "Reducing printing time"
msgstr "Printtijd verkorten"
-#: src/slic3r/GUI/Tab.cpp:1170
+#: src/slic3r/GUI/Tab.cpp:1460
msgid "Skirt and brim"
msgstr "Skirt en brim"
-#: src/slic3r/GUI/Tab.cpp:1187
+#: src/slic3r/GUI/Tab.cpp:1480
msgid "Raft"
msgstr "Raft"
-#: src/slic3r/GUI/Tab.cpp:1191
+#: src/slic3r/GUI/Tab.cpp:1484
msgid "Options for support material and raft"
msgstr "Opties voor support en raft"
-#: src/slic3r/GUI/Tab.cpp:1206
+#: src/slic3r/GUI/Tab.cpp:1499
msgid "Speed for print moves"
msgstr "Snelheid voor printbewegingen"
-#: src/slic3r/GUI/Tab.cpp:1218
+#: src/slic3r/GUI/Tab.cpp:1512
msgid "Speed for non-print moves"
msgstr "Snelheid voor niet-print bewegingen"
-#: src/slic3r/GUI/Tab.cpp:1221
+#: src/slic3r/GUI/Tab.cpp:1515
msgid "Modifiers"
msgstr "Modificators"
-#: src/slic3r/GUI/Tab.cpp:1224
+#: src/slic3r/GUI/Tab.cpp:1518
msgid "Acceleration control (advanced)"
-msgstr "Acceleraties (geavanceerd)"
+msgstr "Acceleratie-opties (geavanceerd)"
-#: src/slic3r/GUI/Tab.cpp:1231
+#: src/slic3r/GUI/Tab.cpp:1525
msgid "Autospeed (advanced)"
msgstr "Automatische snelheid (geavanceerd)"
-#: src/slic3r/GUI/Tab.cpp:1239
+#: src/slic3r/GUI/Tab.cpp:1533
msgid "Multiple Extruders"
msgstr "Meerdere extruders"
-#: src/slic3r/GUI/Tab.cpp:1247
+#: src/slic3r/GUI/Tab.cpp:1541
msgid "Ooze prevention"
msgstr "Druippreventie"
-#: src/slic3r/GUI/Tab.cpp:1265
+#: src/slic3r/GUI/Tab.cpp:1559
msgid "Extrusion width"
msgstr "Extrusiebreedte"
-#: src/slic3r/GUI/Tab.cpp:1275
+#: src/slic3r/GUI/Tab.cpp:1569
msgid "Overlap"
msgstr "Overlapping"
-#: src/slic3r/GUI/Tab.cpp:1278
+#: src/slic3r/GUI/Tab.cpp:1572
msgid "Flow"
msgstr "Stroom"
-#: src/slic3r/GUI/Tab.cpp:1287
+#: src/slic3r/GUI/Tab.cpp:1581
msgid "Other"
msgstr "Overige"
-#: src/slic3r/GUI/Tab.cpp:1290 src/slic3r/GUI/Tab.cpp:3723
+#: src/slic3r/GUI/Tab.cpp:1584 src/slic3r/GUI/Tab.cpp:4118
msgid "Output options"
msgstr "Output-opties"
-#: src/slic3r/GUI/Tab.cpp:1291
+#: src/slic3r/GUI/Tab.cpp:1585
msgid "Sequential printing"
msgstr "Achtereenvolgens printen"
-#: src/slic3r/GUI/Tab.cpp:1293
-msgid "Extruder clearance (mm)"
-msgstr "Extruderruimte (mm)"
+#: src/slic3r/GUI/Tab.cpp:1587
+msgid "Extruder clearance"
+msgstr "Extruderruimte"
-#: src/slic3r/GUI/Tab.cpp:1298 src/slic3r/GUI/Tab.cpp:3724
+#: src/slic3r/GUI/Tab.cpp:1592 src/slic3r/GUI/Tab.cpp:4119
msgid "Output file"
msgstr "Outputbestand"
-#: src/slic3r/GUI/Tab.cpp:1305 src/libslic3r/PrintConfig.cpp:1453
+#: src/slic3r/GUI/Tab.cpp:1599 src/libslic3r/PrintConfig.cpp:1662
msgid "Post-processing scripts"
msgstr "Scripts voor nabewerking"
-#: src/slic3r/GUI/Tab.cpp:1311 src/slic3r/GUI/Tab.cpp:1312
-#: src/slic3r/GUI/Tab.cpp:1595 src/slic3r/GUI/Tab.cpp:1596
-#: src/slic3r/GUI/Tab.cpp:2034 src/slic3r/GUI/Tab.cpp:2035
-#: src/slic3r/GUI/Tab.cpp:2116 src/slic3r/GUI/Tab.cpp:2117
-#: src/slic3r/GUI/Tab.cpp:3597 src/slic3r/GUI/Tab.cpp:3598
+#: src/slic3r/GUI/Tab.cpp:1605 src/slic3r/GUI/Tab.cpp:1606
+#: src/slic3r/GUI/Tab.cpp:1927 src/slic3r/GUI/Tab.cpp:1928
+#: src/slic3r/GUI/Tab.cpp:2266 src/slic3r/GUI/Tab.cpp:2267
+#: src/slic3r/GUI/Tab.cpp:2342 src/slic3r/GUI/Tab.cpp:2343
+#: src/slic3r/GUI/Tab.cpp:3985 src/slic3r/GUI/Tab.cpp:3986
msgid "Notes"
msgstr "Opmerkingen"
-#: src/slic3r/GUI/Tab.cpp:1318 src/slic3r/GUI/Tab.cpp:1603
-#: src/slic3r/GUI/Tab.cpp:2041 src/slic3r/GUI/Tab.cpp:2123
-#: src/slic3r/GUI/Tab.cpp:3605 src/slic3r/GUI/Tab.cpp:3729
+#: src/slic3r/GUI/Tab.cpp:1612 src/slic3r/GUI/Tab.cpp:1935
+#: src/slic3r/GUI/Tab.cpp:2273 src/slic3r/GUI/Tab.cpp:2349
+#: src/slic3r/GUI/Tab.cpp:3993 src/slic3r/GUI/Tab.cpp:4124
msgid "Dependencies"
msgstr "Afhankelijkheden"
-#: src/slic3r/GUI/Tab.cpp:1319 src/slic3r/GUI/Tab.cpp:1604
-#: src/slic3r/GUI/Tab.cpp:2042 src/slic3r/GUI/Tab.cpp:2124
-#: src/slic3r/GUI/Tab.cpp:3606 src/slic3r/GUI/Tab.cpp:3730
+#: src/slic3r/GUI/Tab.cpp:1613 src/slic3r/GUI/Tab.cpp:1936
+#: src/slic3r/GUI/Tab.cpp:2274 src/slic3r/GUI/Tab.cpp:2350
+#: src/slic3r/GUI/Tab.cpp:3994 src/slic3r/GUI/Tab.cpp:4125
msgid "Profile dependencies"
msgstr "Profielafhankelijkheden"
-#: src/slic3r/GUI/Tab.cpp:1378 src/slic3r/GUI/Tab.cpp:1433
+#: src/slic3r/GUI/Tab.cpp:1693
msgid "Filament Overrides"
msgstr "Overschrijven door filament"
-#: src/slic3r/GUI/Tab.cpp:1379 src/slic3r/GUI/Tab.cpp:1438
-#: src/slic3r/GUI/Tab.cpp:2354
-msgid "Retraction"
-msgstr "Retractie"
-
-#: src/slic3r/GUI/Tab.cpp:1488 src/libslic3r/PrintConfig.cpp:2067
+#: src/slic3r/GUI/Tab.cpp:1815
msgid "Temperature"
msgstr "Temperatuur"
-#: src/slic3r/GUI/Tab.cpp:1494
+#: src/slic3r/GUI/Tab.cpp:1816
+msgid "Nozzle"
+msgstr "Nozzle"
+
+#: src/slic3r/GUI/Tab.cpp:1821
msgid "Bed"
msgstr "Bed"
-#: src/slic3r/GUI/Tab.cpp:1499
+#: src/slic3r/GUI/Tab.cpp:1826
msgid "Cooling"
msgstr "Koeling"
-#: src/slic3r/GUI/Tab.cpp:1500 src/libslic3r/PrintConfig.cpp:1355
-#: src/libslic3r/PrintConfig.cpp:2200
+#: src/slic3r/GUI/Tab.cpp:1828 src/libslic3r/PrintConfig.cpp:1565
+#: src/libslic3r/PrintConfig.cpp:2428
msgid "Enable"
msgstr "Toestaan"
-#: src/slic3r/GUI/Tab.cpp:1511
+#: src/slic3r/GUI/Tab.cpp:1839
msgid "Fan settings"
msgstr "Ventilatorinstellingen"
-#: src/slic3r/GUI/Tab.cpp:1520
+#: src/slic3r/GUI/Tab.cpp:1850
msgid "Cooling thresholds"
msgstr "Koeldrempels"
-#: src/slic3r/GUI/Tab.cpp:1526
+#: src/slic3r/GUI/Tab.cpp:1856
msgid "Filament properties"
msgstr "Filamenteigenschappen"
-#: src/slic3r/GUI/Tab.cpp:1533
+#: src/slic3r/GUI/Tab.cpp:1863
msgid "Print speed override"
msgstr "Printsnelheid overschrijven"
-#: src/slic3r/GUI/Tab.cpp:1543
+#: src/slic3r/GUI/Tab.cpp:1873
msgid "Wipe tower parameters"
msgstr "Afveegblokparameters"
-#: src/slic3r/GUI/Tab.cpp:1546
+#: src/slic3r/GUI/Tab.cpp:1876
msgid "Toolchange parameters with single extruder MM printers"
msgstr "Toolwisselparameter voor multi-materialprinters met één extruder"
-#: src/slic3r/GUI/Tab.cpp:1560
+#: src/slic3r/GUI/Tab.cpp:1889
msgid "Ramming settings"
-msgstr "Ramming-instellingen"
+msgstr "Ramminginstellingen"
-#: src/slic3r/GUI/Tab.cpp:1582 src/slic3r/GUI/Tab.cpp:1997
+#: src/slic3r/GUI/Tab.cpp:1912 src/slic3r/GUI/Tab.cpp:2205
+#: src/libslic3r/PrintConfig.cpp:2063
msgid "Custom G-code"
msgstr "Custom G-code"
-#: src/slic3r/GUI/Tab.cpp:1583 src/slic3r/GUI/Tab.cpp:1998
-#: src/libslic3r/PrintConfig.cpp:1813 src/libslic3r/PrintConfig.cpp:1828
+#: src/slic3r/GUI/Tab.cpp:1913 src/slic3r/GUI/Tab.cpp:2206
+#: src/libslic3r/PrintConfig.cpp:2013 src/libslic3r/PrintConfig.cpp:2028
msgid "Start G-code"
msgstr "Start G-code"
-#: src/slic3r/GUI/Tab.cpp:1589 src/slic3r/GUI/Tab.cpp:2004
-#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:395
+#: src/slic3r/GUI/Tab.cpp:1920 src/slic3r/GUI/Tab.cpp:2213
+#: src/libslic3r/PrintConfig.cpp:441 src/libslic3r/PrintConfig.cpp:451
msgid "End G-code"
-msgstr "Eind G-code"
+msgstr "Eind-G-code"
-#: src/slic3r/GUI/Tab.cpp:1638
+#: src/slic3r/GUI/Tab.cpp:1970
msgid "Volumetric flow hints not available"
msgstr "Volumetrische stroom - opmerkingen niet beschikbaar"
-#: src/slic3r/GUI/Tab.cpp:1724 src/slic3r/GUI/Tab.cpp:1937
-msgid "Test"
-msgstr "Test"
-
-#: src/slic3r/GUI/Tab.cpp:1733
-msgid "Could not get a valid Printer Host reference"
-msgstr "Kan geen geldige printerhost-referentie krijgen"
-
-#: src/slic3r/GUI/Tab.cpp:1739 src/slic3r/GUI/Tab.cpp:1950
-msgid "Success!"
-msgstr "Gelukt!"
-
-#: src/slic3r/GUI/Tab.cpp:1759
-msgid ""
-"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-"
-"signed certificate."
-msgstr ""
-"HTTPS-CA-bestand is optioneel. Het is alleen nodig als u werkt met een zelf "
-"ondertekend certificaat."
-
-#: src/slic3r/GUI/Tab.cpp:1774
-msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*"
-msgstr "Certificaatbestanden (*.crt, *.pem)|*.crt;*.pem|Alle betanden|*.*"
-
-#: src/slic3r/GUI/Tab.cpp:1775
-msgid "Open CA certificate file"
-msgstr "Open een CA-certificaatbestand"
-
-#: src/slic3r/GUI/Tab.cpp:1802 src/libslic3r/PrintConfig.cpp:111
-msgid "HTTPS CA File"
-msgstr "HTTPS-CA-bestand"
-
-#: src/slic3r/GUI/Tab.cpp:1803
-#, c-format
-msgid ""
-"On this system, %s uses HTTPS certificates from the system Certificate Store "
-"or Keychain."
-msgstr ""
-"Op dit systeem gebruikt %s HTTPS-certificaten van de Certificate Store of "
-"Keychain."
-
-#: src/slic3r/GUI/Tab.cpp:1804
+#: src/slic3r/GUI/Tab.cpp:2066
msgid ""
-"To use a custom CA file, please import your CA file into Certificate Store / "
-"Keychain."
-msgstr ""
-"Importeer een CA-bestand in de Certificate Store of Keychain om deze te "
-"gebruiken."
-
-#: src/slic3r/GUI/Tab.cpp:1847 src/slic3r/GUI/Tab.cpp:2059
+"Note: All parameters from this group are moved to the Physical Printer "
+"settings (see changelog).\n"
+"\n"
+"A new Physical Printer profile is created by clicking on the \"cog\" icon "
+"right of the Printer profiles combo box, by selecting the \"Add physical "
+"printer\" item in the Printer combo box. The Physical Printer profile editor "
+"opens also when clicking on the \"cog\" icon in the Printer settings tab. "
+"The Physical Printer profiles are being stored into PrusaSlicer/"
+"physical_printer directory."
+msgstr ""
+"Let op dat alle parameters van deze groep zijn verplaatst naar de fysieke "
+"printerinstellingen (zie wijzigingslogboek).\n"
+"\n"
+"Een nieuw fysieke printerprofiel wordt aangemaakt door te klikken op het "
+"tandwiel-icoon, rechts van het printerprofiel-selectievak, en \"Fysieke "
+"printer toevoegen\" te selecteren. Het fysieke printerprofiel bewerker opent "
+"ook als slechts geklikt wordt op het tandwiel-icoon in de "
+"printerinstellingentab. Het fysieke printerprofiel is opgeslagen in de "
+"locatie PrusaSlicer/physical_printer."
+
+#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2286
msgid "Size and coordinates"
msgstr "Grootte en coördinaten"
-#: src/slic3r/GUI/Tab.cpp:1856
+#: src/slic3r/GUI/Tab.cpp:2108 src/slic3r/GUI/UnsavedChangesDialog.cpp:1080
msgid "Capabilities"
msgstr "Mogelijkheden"
-#: src/slic3r/GUI/Tab.cpp:1861
+#: src/slic3r/GUI/Tab.cpp:2113
msgid "Number of extruders of the printer."
msgstr "Aantal extruders van de printer."
-#: src/slic3r/GUI/Tab.cpp:1889
+#: src/slic3r/GUI/Tab.cpp:2141
msgid ""
"Single Extruder Multi Material is selected, \n"
"and all extruders must have the same diameter.\n"
@@ -5692,144 +7291,124 @@ msgid ""
msgstr ""
"Multi-material met één extruder is geselecteerd.\n"
"Alle extruders moeten daarvoor dezelfde diameter hebben.\n"
-"Wilt u de diameters voor alle extruders aanpassen gelijk aan die van de "
+"Wil je de diameters voor alle extruders aanpassen gelijk aan die van de "
"eerste extruder?"
-#: src/slic3r/GUI/Tab.cpp:1892 src/slic3r/GUI/Tab.cpp:2324
-#: src/libslic3r/PrintConfig.cpp:1326
+#: src/slic3r/GUI/Tab.cpp:2144 src/slic3r/GUI/Tab.cpp:2552
+#: src/libslic3r/PrintConfig.cpp:1534
msgid "Nozzle diameter"
msgstr "Nozzlediameter"
-#: src/slic3r/GUI/Tab.cpp:1922
-msgid "USB/Serial connection"
-msgstr "USB/seriële verbinding"
-
-#: src/slic3r/GUI/Tab.cpp:1923 src/libslic3r/PrintConfig.cpp:1661
-msgid "Serial port"
-msgstr "Seriële poort"
-
-#: src/slic3r/GUI/Tab.cpp:1928
-msgid "Rescan serial ports"
-msgstr "Seriële poorten opnieuw scannen"
-
-#: src/slic3r/GUI/Tab.cpp:1950
-msgid "Connection to printer works correctly."
-msgstr "Verbinding met de printer werkt naar behoren."
-
-#: src/slic3r/GUI/Tab.cpp:1953
-msgid "Connection failed."
-msgstr "Verbinding mislukt."
-
-#: src/slic3r/GUI/Tab.cpp:1966 src/slic3r/GUI/Tab.cpp:2111
-msgid "Print Host upload"
-msgstr "Printhost upload"
-
-#: src/slic3r/GUI/Tab.cpp:2010 src/libslic3r/PrintConfig.cpp:153
+#: src/slic3r/GUI/Tab.cpp:2220 src/libslic3r/PrintConfig.cpp:209
msgid "Before layer change G-code"
msgstr "G-code die komt vóór de laagwisseling"
-#: src/slic3r/GUI/Tab.cpp:2016 src/libslic3r/PrintConfig.cpp:1080
+#: src/slic3r/GUI/Tab.cpp:2227 src/libslic3r/PrintConfig.cpp:1273
msgid "After layer change G-code"
msgstr "G-code die komt na de laagwisseling"
-#: src/slic3r/GUI/Tab.cpp:2022 src/libslic3r/PrintConfig.cpp:2093
+#: src/slic3r/GUI/Tab.cpp:2234 src/libslic3r/PrintConfig.cpp:2321
msgid "Tool change G-code"
msgstr "Toolwisseling G-code"
-#: src/slic3r/GUI/Tab.cpp:2028
+#: src/slic3r/GUI/Tab.cpp:2241
msgid "Between objects G-code (for sequential printing)"
msgstr "G-code die komt tussen objecten (bij achtereenvolgens printen)"
-#: src/slic3r/GUI/Tab.cpp:2066
+#: src/slic3r/GUI/Tab.cpp:2248
+msgid "Color Change G-code"
+msgstr "Kleurwissel G-code"
+
+#: src/slic3r/GUI/Tab.cpp:2254 src/libslic3r/PrintConfig.cpp:2054
+msgid "Pause Print G-code"
+msgstr "Pauzeer print G-code"
+
+#: src/slic3r/GUI/Tab.cpp:2260
+msgid "Template Custom G-code"
+msgstr "Template custom G-code"
+
+#: src/slic3r/GUI/Tab.cpp:2293
msgid "Display"
msgstr "Scherm"
-#: src/slic3r/GUI/Tab.cpp:2081
+#: src/slic3r/GUI/Tab.cpp:2308
msgid "Tilt"
-msgstr "Kanteling"
+msgstr "Draaiing"
-#: src/slic3r/GUI/Tab.cpp:2082
+#: src/slic3r/GUI/Tab.cpp:2309
msgid "Tilt time"
-msgstr "Kanteltijd"
+msgstr "Draaitijd"
-#: src/slic3r/GUI/Tab.cpp:2088 src/slic3r/GUI/Tab.cpp:3581
+#: src/slic3r/GUI/Tab.cpp:2315 src/slic3r/GUI/Tab.cpp:3969
msgid "Corrections"
msgstr "Correcties"
-#: src/slic3r/GUI/Tab.cpp:2105 src/slic3r/GUI/Tab.cpp:3577
+#: src/slic3r/GUI/Tab.cpp:2332 src/slic3r/GUI/Tab.cpp:3965
msgid "Exposure"
msgstr "Belichtingstijd"
-#: src/slic3r/GUI/Tab.cpp:2172 src/slic3r/GUI/Tab.cpp:2257
-#: src/libslic3r/PrintConfig.cpp:1129 src/libslic3r/PrintConfig.cpp:1146
-#: src/libslic3r/PrintConfig.cpp:1163 src/libslic3r/PrintConfig.cpp:1179
-#: src/libslic3r/PrintConfig.cpp:1189 src/libslic3r/PrintConfig.cpp:1199
-#: src/libslic3r/PrintConfig.cpp:1209
+#: src/slic3r/GUI/Tab.cpp:2391 src/slic3r/GUI/Tab.cpp:2485
+#: src/libslic3r/PrintConfig.cpp:1302 src/libslic3r/PrintConfig.cpp:1337
+#: src/libslic3r/PrintConfig.cpp:1354 src/libslic3r/PrintConfig.cpp:1371
+#: src/libslic3r/PrintConfig.cpp:1387 src/libslic3r/PrintConfig.cpp:1397
+#: src/libslic3r/PrintConfig.cpp:1407 src/libslic3r/PrintConfig.cpp:1417
msgid "Machine limits"
msgstr "Machinelimieten"
-#: src/slic3r/GUI/Tab.cpp:2186
+#: src/slic3r/GUI/Tab.cpp:2414
msgid "Values in this column are for Normal mode"
msgstr "Waarden in deze kolom zijn voor de normale modus"
-#: src/slic3r/GUI/Tab.cpp:2187
-msgid "Normal"
-msgstr "Normaal"
-
-#: src/slic3r/GUI/Tab.cpp:2192
+#: src/slic3r/GUI/Tab.cpp:2420
msgid "Values in this column are for Stealth mode"
msgstr "Waarden in deze kolom zijn voor de stille modus"
-#: src/slic3r/GUI/Tab.cpp:2193
-msgid "Stealth"
-msgstr "Stille modus"
-
-#: src/slic3r/GUI/Tab.cpp:2201
+#: src/slic3r/GUI/Tab.cpp:2429
msgid "Maximum feedrates"
msgstr "Maximale voedingssnelheden"
-#: src/slic3r/GUI/Tab.cpp:2206
+#: src/slic3r/GUI/Tab.cpp:2434
msgid "Maximum accelerations"
msgstr "Maximale acceleraties"
-#: src/slic3r/GUI/Tab.cpp:2213
+#: src/slic3r/GUI/Tab.cpp:2441
msgid "Jerk limits"
msgstr "Ruklimieten"
-#: src/slic3r/GUI/Tab.cpp:2218
+#: src/slic3r/GUI/Tab.cpp:2446
msgid "Minimum feedrates"
msgstr "Minimale voedingssnelheden"
-#: src/slic3r/GUI/Tab.cpp:2282 src/slic3r/GUI/Tab.cpp:2290
+#: src/slic3r/GUI/Tab.cpp:2510 src/slic3r/GUI/Tab.cpp:2518
msgid "Single extruder MM setup"
msgstr "Multi-materialsetup met één extruder"
-#: src/slic3r/GUI/Tab.cpp:2291
+#: src/slic3r/GUI/Tab.cpp:2519
msgid "Single extruder multimaterial parameters"
msgstr "Parameter voor multi-material met één extruder"
-#: src/slic3r/GUI/Tab.cpp:2322
+#: src/slic3r/GUI/Tab.cpp:2550
msgid ""
"This is a single extruder multimaterial printer, diameters of all extruders "
"will be set to the new value. Do you want to proceed?"
msgstr ""
"Dit is een multi-materialprinter met één extruder. De diameters van alle "
-"extruders worden ingesteld op de nieuwe waarde. Weet u zeker dat u wilt "
-"doorgaan?"
+"extruders worden ingesteld op de nieuwe waarde. Weet je zeker dat je door "
+"wil gaan?"
-#: src/slic3r/GUI/Tab.cpp:2346
+#: src/slic3r/GUI/Tab.cpp:2574
msgid "Layer height limits"
msgstr "Laagdiktelimieten"
-#: src/slic3r/GUI/Tab.cpp:2351
+#: src/slic3r/GUI/Tab.cpp:2579
msgid "Position (for multi-extruder printers)"
msgstr "Positie (voor multi-extruderprinters)"
-#: src/slic3r/GUI/Tab.cpp:2357
+#: src/slic3r/GUI/Tab.cpp:2585
msgid "Only lift Z"
msgstr "Beweeg alleen Z omhoog"
-#: src/slic3r/GUI/Tab.cpp:2370
+#: src/slic3r/GUI/Tab.cpp:2598
msgid ""
"Retraction when tool is disabled (advanced settings for multi-extruder "
"setups)"
@@ -5837,11 +7416,11 @@ msgstr ""
"Retractie als de tool uit staat (geavanceerde instelling voor multi-"
"extrudersetups)"
-#: src/slic3r/GUI/Tab.cpp:2378
+#: src/slic3r/GUI/Tab.cpp:2605
msgid "Reset to Filament Color"
msgstr "Reset naar filamentkleur"
-#: src/slic3r/GUI/Tab.cpp:2559
+#: src/slic3r/GUI/Tab.cpp:2783
msgid ""
"The Wipe option is not available when using the Firmware Retraction mode.\n"
"\n"
@@ -5851,97 +7430,109 @@ msgstr ""
"\n"
"Moet deze uitgezet worden om firmwareretractie te gebruiken?"
-#: src/slic3r/GUI/Tab.cpp:2561
+#: src/slic3r/GUI/Tab.cpp:2785
msgid "Firmware Retraction"
msgstr "Firmwareretractie"
-#: src/slic3r/GUI/Tab.cpp:2907
-#, c-format
-msgid "Default preset (%s)"
-msgstr "Standaard preset (%s)"
-
-#: src/slic3r/GUI/Tab.cpp:2908
-#, c-format
-msgid "Preset (%s)"
-msgstr "Preset (%s)"
-
-#: src/slic3r/GUI/Tab.cpp:2925
-msgid "has the following unsaved changes:"
-msgstr "heeft de volgende niet-opgeslagen wijzigingen:"
-
-#: src/slic3r/GUI/Tab.cpp:2928
-msgid "is not compatible with printer"
-msgstr "is niet compatibel met printer"
-
-#: src/slic3r/GUI/Tab.cpp:2929
-msgid "is not compatible with print profile"
-msgstr "is niet compatibel met printprofiel"
-
-#: src/slic3r/GUI/Tab.cpp:2931
-msgid "and it has the following unsaved changes:"
-msgstr "en het heeft de volgende niet-opgeslagen wijzigingen:"
-
-#: src/slic3r/GUI/Tab.cpp:2935
-msgid "Unsaved Changes"
-msgstr "Niet-opgeslagen wijzigingen"
-
-#: src/slic3r/GUI/Tab.cpp:3029
+#: src/slic3r/GUI/Tab.cpp:3376
msgid "Detached"
msgstr "Ontkoppeld"
-#: src/slic3r/GUI/Tab.cpp:3029
-msgctxt "PresetName"
-msgid "Copy"
-msgstr "Kopieer"
+#: src/slic3r/GUI/Tab.cpp:3439
+msgid "remove"
+msgstr "verwijder"
-#: src/slic3r/GUI/Tab.cpp:3058
-msgid "The supplied name is empty. It can't be saved."
-msgstr "De ingevoerde naam is leeg. Kan niet opgeslagen worden."
+#: src/slic3r/GUI/Tab.cpp:3439
+msgid "delete"
+msgstr "verwijder"
-#: src/slic3r/GUI/Tab.cpp:3063
-msgid "Cannot overwrite a system profile."
-msgstr "Een systeemprofiel kan niet overschreven worden."
+#: src/slic3r/GUI/Tab.cpp:3448
+msgid "It's a last preset for this physical printer."
+msgstr "Het betreft een laatste voorinstelling voor deze fysieke printer."
-#: src/slic3r/GUI/Tab.cpp:3067
-msgid "Cannot overwrite an external profile."
-msgstr "Een extern profiel kan niet overschreven worden."
+#: src/slic3r/GUI/Tab.cpp:3453
+msgid ""
+"Are you sure you want to delete \"%1%\" preset from the physical printer "
+"\"%2%\"?"
+msgstr ""
+"Weet je zeker dat je \"%1%\" voorinstelling wilt verwijderen van de fysieke "
+"printer \"%1%\"?"
-#: src/slic3r/GUI/Tab.cpp:3072
-msgid "Preset with name \"%1%\" already exists."
-msgstr "Preset met de naam '%1%' bestaat al."
+#: src/slic3r/GUI/Tab.cpp:3465
+msgid ""
+"The physical printer(s) below is based on the preset, you are going to "
+"delete."
+msgstr ""
+"De onderstaande fysieke printer(s) zijn gebaseerd op de voorinstelling die "
+"je gaat verwijderen."
-#: src/slic3r/GUI/Tab.cpp:3073
-msgid "Replace?"
-msgstr "Vervangen?"
+#: src/slic3r/GUI/Tab.cpp:3469
+msgid ""
+"Note, that selected preset will be deleted from this/those printer(s) too."
+msgstr ""
+"Let op dat de geselecteerde voorinstelling automatisch wordt verwijderd van "
+"deze printer(s)."
-#: src/slic3r/GUI/Tab.cpp:3141
-msgid "remove"
-msgstr "verwijderen"
+#: src/slic3r/GUI/Tab.cpp:3473
+msgid ""
+"The physical printer(s) below is based only on the preset, you are going to "
+"delete."
+msgstr ""
+"De onderstaande fysieke printer(s) zijn alleen gebaseerd op de "
+"voorinstelling die je gaat verwijderen."
-#: src/slic3r/GUI/Tab.cpp:3141
-msgid "delete"
-msgstr "verwijderen"
+#: src/slic3r/GUI/Tab.cpp:3477
+msgid ""
+"Note, that this/those printer(s) will be deleted after deleting of the "
+"selected preset."
+msgstr ""
+"Let op dat deze printer(s) wordt verwijderd na het verwijderen van de "
+"geselecteerde voorinstelling."
-#. TRN remove/delete
-#: src/slic3r/GUI/Tab.cpp:3143
+#: src/slic3r/GUI/Tab.cpp:3481
msgid "Are you sure you want to %1% the selected preset?"
-msgstr "Weet u zeker dat u de geselecteerde preset %1% wilt?"
+msgstr "Weet je zeker dat je de geselecteerde voorinstelling %1% wil?"
#. TRN Remove/Delete
-#: src/slic3r/GUI/Tab.cpp:3146
+#: src/slic3r/GUI/Tab.cpp:3486
msgid "%1% Preset"
-msgstr "Preset %1%"
+msgstr "Voorinstelling %1%"
-#: src/slic3r/GUI/Tab.cpp:3205 src/slic3r/GUI/Tab.cpp:3275
+#: src/slic3r/GUI/Tab.cpp:3567 src/slic3r/GUI/Tab.cpp:3639
msgid "Set"
msgstr "Stel in"
-#: src/slic3r/GUI/Tab.cpp:3314
+#: src/slic3r/GUI/Tab.cpp:3703
+msgid ""
+"Machine limits will be emitted to G-code and used to estimate print time."
+msgstr ""
+"Machinelimieten worden opgenomen in de G-code en gebruikt voor de geschatte "
+"printtijd."
+
+#: src/slic3r/GUI/Tab.cpp:3706
+msgid ""
+"Machine limits will NOT be emitted to G-code, however they will be used to "
+"estimate print time, which may therefore not be accurate as the printer may "
+"apply a different set of machine limits."
+msgstr ""
+"Machinelimieten worden NIET opgenomen in de G-code, hoewel ze worden "
+"gebruikt om de printtijd te schatten, waardoor ze niet nauwkeurig kunnen "
+"zijn bij een printer met andere machinelimieten."
+
+#: src/slic3r/GUI/Tab.cpp:3710
+msgid ""
+"Machine limits are not set, therefore the print time estimate may not be "
+"accurate."
+msgstr ""
+"Machinelimieten zijn niet ingesteld, waardoor de geschatte printtijd niet "
+"nauwkeurig is."
+
+#: src/slic3r/GUI/Tab.cpp:3732
msgid "LOCKED LOCK"
msgstr "Vergrendeld"
#. TRN Description for "LOCKED LOCK"
-#: src/slic3r/GUI/Tab.cpp:3316
+#: src/slic3r/GUI/Tab.cpp:3734
msgid ""
"indicates that the settings are the same as the system (or default) values "
"for the current option group"
@@ -5949,12 +7540,12 @@ msgstr ""
"geeft aan dat de instellingen gelijk zijn aan de systeemwaarden voor de "
"huidige optiegroep"
-#: src/slic3r/GUI/Tab.cpp:3318
+#: src/slic3r/GUI/Tab.cpp:3736
msgid "UNLOCKED LOCK"
msgstr "Ontgrendeld"
#. TRN Description for "UNLOCKED LOCK"
-#: src/slic3r/GUI/Tab.cpp:3320
+#: src/slic3r/GUI/Tab.cpp:3738
msgid ""
"indicates that some settings were changed and are not equal to the system "
"(or default) values for the current option group.\n"
@@ -5966,25 +7557,25 @@ msgstr ""
"Klik op het ontgrendeld-pictogram om de instelling te resetten naar de "
"systeemwaarden voor de huidige optiegroep."
-#: src/slic3r/GUI/Tab.cpp:3325
+#: src/slic3r/GUI/Tab.cpp:3743
msgid "WHITE BULLET"
msgstr "Wit bolletje"
#. TRN Description for "WHITE BULLET"
-#: src/slic3r/GUI/Tab.cpp:3327
+#: src/slic3r/GUI/Tab.cpp:3745
msgid ""
"for the left button: indicates a non-system (or non-default) preset,\n"
"for the right button: indicates that the settings hasn't been modified."
msgstr ""
-"de linkerknop geeft aan dat het niet een systeempreset is,\n"
+"de linkerknop geeft aan dat het niet een systeeminstelling is,\n"
"de rechterknop geeft aan of de instelling is gewijzigd."
-#: src/slic3r/GUI/Tab.cpp:3330
+#: src/slic3r/GUI/Tab.cpp:3748
msgid "BACK ARROW"
msgstr "Pijltje terug"
#. TRN Description for "BACK ARROW"
-#: src/slic3r/GUI/Tab.cpp:3332
+#: src/slic3r/GUI/Tab.cpp:3750
msgid ""
"indicates that the settings were changed and are not equal to the last saved "
"preset for the current option group.\n"
@@ -5992,11 +7583,11 @@ msgid ""
"to the last saved preset."
msgstr ""
"geeft aan dat de instellingen zijn veranderd en niet gelijk zijn aan de "
-"laatst opgeslagen preset voor de huidige optiegroep.\n"
+"laatst opgeslagen voorinstelling voor de huidige optiegroep.\n"
"Klik op het pijltje-terug-pictogram om alle instellingen te resetten naar de "
-"laatst opgeslagen preset voor de huidige optiegroep."
+"laatst opgeslagen voorinstelling voor de huidige optiegroep."
-#: src/slic3r/GUI/Tab.cpp:3342
+#: src/slic3r/GUI/Tab.cpp:3760
msgid ""
"LOCKED LOCK icon indicates that the settings are the same as the system (or "
"default) values for the current option group"
@@ -6004,7 +7595,7 @@ msgstr ""
"Vergrendeld-pictogram geeft aan dat de instellingen gelijk zijn aan de "
"systeemwaarde van de huidige optiegroep"
-#: src/slic3r/GUI/Tab.cpp:3344
+#: src/slic3r/GUI/Tab.cpp:3762
msgid ""
"UNLOCKED LOCK icon indicates that some settings were changed and are not "
"equal to the system (or default) values for the current option group.\n"
@@ -6016,19 +7607,19 @@ msgstr ""
"Klik om alle instellingen voor de huidige optiegroep te resetten naar "
"systeemwaarden."
-#: src/slic3r/GUI/Tab.cpp:3347
+#: src/slic3r/GUI/Tab.cpp:3765
msgid "WHITE BULLET icon indicates a non system (or non default) preset."
-msgstr "Het witte bolletje geeft aan dat het geen systeempreset betreft."
+msgstr "Het witte bolletje geeft aan dat het geen systeeminstelling betreft."
-#: src/slic3r/GUI/Tab.cpp:3350
+#: src/slic3r/GUI/Tab.cpp:3768
msgid ""
"WHITE BULLET icon indicates that the settings are the same as in the last "
"saved preset for the current option group."
msgstr ""
"Het witte bolletje geeft aan dat de instelling gelijk is aan de laatst "
-"opgeslagen preset voor de huidige optiegroep."
+"opgeslagen voorinstelling voor de huidige optiegroep."
-#: src/slic3r/GUI/Tab.cpp:3352
+#: src/slic3r/GUI/Tab.cpp:3770
msgid ""
"BACK ARROW icon indicates that the settings were changed and are not equal "
"to the last saved preset for the current option group.\n"
@@ -6036,19 +7627,19 @@ msgid ""
"preset."
msgstr ""
"Het pijltje-terug-pictogram geeft aan dat de instellingen zijn gewijzigd en "
-"niet gelijk zijn aan de laatst opgeslagen preset voor de huidige "
+"niet gelijk zijn aan de laatst opgeslagen voorinstelling voor de huidige "
"optiegroep.\n"
"Klik om alle instellingen terug te zetten voor de huidige optiegroep naar de "
-"laatst opgeslagen preset."
+"laatst opgeslagen voorinstelling."
-#: src/slic3r/GUI/Tab.cpp:3358
+#: src/slic3r/GUI/Tab.cpp:3776
msgid ""
"LOCKED LOCK icon indicates that the value is the same as the system (or "
"default) value."
msgstr ""
"Vergrendeld-pictogram geeft aan dat de waarde gelijk is aan de systeemwaarde."
-#: src/slic3r/GUI/Tab.cpp:3359
+#: src/slic3r/GUI/Tab.cpp:3777
msgid ""
"UNLOCKED LOCK icon indicates that the value was changed and is not equal to "
"the system (or default) value.\n"
@@ -6058,77 +7649,207 @@ msgstr ""
"aan de systeemwaarde.\n"
"Klik om de huidige waarde te resetten naar de systeemwaarde."
-#: src/slic3r/GUI/Tab.cpp:3365
+#: src/slic3r/GUI/Tab.cpp:3783
msgid ""
"WHITE BULLET icon indicates that the value is the same as in the last saved "
"preset."
msgstr ""
"Het witte bolletje geeft aan dat de waarde gelijk is aan de laatst "
-"opgeslagen preset."
+"opgeslagen voorinstelling."
-#: src/slic3r/GUI/Tab.cpp:3366
+#: src/slic3r/GUI/Tab.cpp:3784
msgid ""
"BACK ARROW icon indicates that the value was changed and is not equal to the "
"last saved preset.\n"
"Click to reset current value to the last saved preset."
msgstr ""
"Het pijltje-terug-pictogram geeft aan dat de waarde is veranderd en niet "
-"gelijk is aan de laatst opgeslagen preset.\n"
-"Klik om de waarde te resetten naar de laatst opgeslagen preset."
-
-#. TRN Preset
-#: src/slic3r/GUI/Tab.cpp:3479
-#, c-format
-msgid "Save %s as:"
-msgstr "%s opslaan als:"
-
-#: src/slic3r/GUI/Tab.cpp:3523
-msgid "the following suffix is not allowed:"
-msgstr "het volgende achtervoegsel is niet toegestaan:"
-
-#: src/slic3r/GUI/Tab.cpp:3527
-msgid "The supplied name is not available."
-msgstr "De ingevoerde naam is niet beschikbaar."
+"gelijk is aan de laatst opgeslagen voorinstelling.\n"
+"Klik om de waarde te resetten naar de laatst opgeslagen voorinstelling."
-#: src/slic3r/GUI/Tab.cpp:3540 src/slic3r/GUI/Tab.cpp:3542
+#: src/slic3r/GUI/Tab.cpp:3928 src/slic3r/GUI/Tab.cpp:3930
msgid "Material"
msgstr "Materiaal"
-#: src/slic3r/GUI/Tab.cpp:3664
+#: src/slic3r/GUI/Tab.cpp:4052
msgid "Support head"
msgstr "Supportkop"
-#: src/slic3r/GUI/Tab.cpp:3669
+#: src/slic3r/GUI/Tab.cpp:4057
msgid "Support pillar"
msgstr "Supportpijler"
-#: src/slic3r/GUI/Tab.cpp:3685
+#: src/slic3r/GUI/Tab.cpp:4080
msgid "Connection of the support sticks and junctions"
msgstr "Verbindingen van de supporttakken en kruisingen"
-#: src/slic3r/GUI/Tab.cpp:3690
+#: src/slic3r/GUI/Tab.cpp:4085
msgid "Automatic generation"
msgstr "Automatisch genereren"
-#: src/slic3r/GUI/Tab.hpp:336 src/slic3r/GUI/Tab.hpp:441
+#: src/slic3r/GUI/Tab.cpp:4159
+msgid ""
+"\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n"
+"To enable \"%1%\", please switch off \"%2%\""
+msgstr ""
+"\"%1%\" is uitgeschakeld omdat \"%2%\" aanstaat in \"%3%\"-categorie.\n"
+"Om \"%1%\" aan te zetten moet \"%2%\" uit staan"
+
+#: src/slic3r/GUI/Tab.cpp:4161 src/libslic3r/PrintConfig.cpp:3002
+msgid "Object elevation"
+msgstr "Objectverhoging"
+
+#: src/slic3r/GUI/Tab.cpp:4161 src/libslic3r/PrintConfig.cpp:3104
+msgid "Pad around object"
+msgstr "Basisplaat rondom object"
+
+#: src/slic3r/GUI/Tab.hpp:370 src/slic3r/GUI/Tab.hpp:492
msgid "Print Settings"
msgstr "Printinstellingen"
-#: src/slic3r/GUI/Tab.hpp:363
+#: src/slic3r/GUI/Tab.hpp:401
msgid "Filament Settings"
msgstr "Filamentinstellingen"
-#: src/slic3r/GUI/Tab.hpp:399
+#: src/slic3r/GUI/Tab.hpp:442
msgid "Printer Settings"
msgstr "Printerinstellingen"
-#: src/slic3r/GUI/Tab.hpp:426
+#: src/slic3r/GUI/Tab.hpp:476
msgid "Material Settings"
msgstr "Materiaalinstellingen"
-#: src/slic3r/GUI/Tab.hpp:453
-msgid "Save preset"
-msgstr "Preset opslaan"
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:149
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:158
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:857
+msgid "Undef"
+msgstr "Ongedefinieerd"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:537
+msgid "PrusaSlicer is closing: Unsaved Changes"
+msgstr "PrusaSlicer sluit af: niet-opgeslagen wijzigingen"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:554
+msgid "Switching Presets: Unsaved Changes"
+msgstr "Wisselen van voorinstellingen: niet-opgeslagen wijzigingen"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:620
+msgid "Old Value"
+msgstr "Oude waarde"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:621
+msgid "New Value"
+msgstr "Nieuwe waarde"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:652
+msgid "Transfer"
+msgstr "Omzetten"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:653
+msgid "Discard"
+msgstr "Afwijzen"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:654
+msgid "Save"
+msgstr "Opslaan"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:674
+msgid "PrusaSlicer will remember your action."
+msgstr "PrusaSlicer onthoudt je keuze."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:676
+msgid ""
+"You will not be asked about the unsaved changes the next time you close "
+"PrusaSlicer."
+msgstr ""
+"Je wordt niet gevraagd over niet-opgeslagen wijzigingen de volgende keer als "
+"PrusaSlicer afsluit."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:677
+msgid ""
+"You will not be asked about the unsaved changes the next time you switch a "
+"preset."
+msgstr ""
+"Je wordt niet gevraagd over niet-opgeslagen wijzigingen de volgende keer als "
+"je wisselt van voorinstelling."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:678
+msgid ""
+"Visit \"Preferences\" and check \"%1%\"\n"
+"to be asked about unsaved changes again."
+msgstr ""
+"Kijk naar \"Voorkeuren\" en check \"%1%\"\n"
+"om weer te vragen over niet-opgeslagen wijzigingen."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:680
+msgid "PrusaSlicer: Don't ask me again"
+msgstr "PrusaSlicer: vraag het niet nogmaals"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:747
+msgid ""
+"Some fields are too long to fit. Right mouse click reveals the full text."
+msgstr ""
+"Sommige velden zijn te lang om te passen. Rechtermuisklik toont de volledige "
+"tekst."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:749
+msgid "All settings changes will be discarded."
+msgstr "Alle gewijzigde instellingen worden afgewezen."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:752
+msgid "Save the selected options."
+msgstr "Geselecteerde opties opslaan."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:752
+msgid "Transfer the selected settings to the newly selected preset."
+msgstr ""
+"Ze de geselecteerde instelling om in de nieuw geselecteerde voorinstelling."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:756
+msgid "Save the selected options to preset \"%1%\"."
+msgstr "Geselecteerde opties voor voorinstelling \"%1%\" opslaan."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:757
+msgid "Transfer the selected options to the newly selected preset \"%1%\"."
+msgstr ""
+"Zet de geselecteerde optie om in de nieuw geselecteerde voorinstelling \"%1%"
+"\"."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1019
+msgid "The following presets were modified:"
+msgstr "De volgende voorinstellingen zijn aangepast:"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1024
+msgid "Preset \"%1%\" has the following unsaved changes:"
+msgstr "Voorinstelling \"%1%\" heeft de volgende niet-opgeslagen wijzigingen:"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1028
+msgid ""
+"Preset \"%1%\" is not compatible with the new printer profile and it has the "
+"following unsaved changes:"
+msgstr ""
+"Voorinstelling \"%1%\" is ongeschikt voor het nieuwe printerprofiel en heeft "
+"de volgende niet-opgeslagen wijzigingen:"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1029
+msgid ""
+"Preset \"%1%\" is not compatible with the new print profile and it has the "
+"following unsaved changes:"
+msgstr ""
+"Voorinstelling \"%1%\" is ongeschikt voor het nieuwe printprofiel en heeft "
+"de volgende niet-opgeslagen wijzigingen:"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1075
+msgid "Extruders count"
+msgstr "Aantal extruders"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1197
+msgid "Old value"
+msgstr "Oude waarde"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1198
+msgid "New value"
+msgstr "Nieuwe waarde"
#: src/slic3r/GUI/UpdateDialogs.cpp:38
msgid "Update available"
@@ -6181,7 +7902,7 @@ msgid ""
"\n"
"Updated configuration bundles:"
msgstr ""
-"Wilt u het installeren?\n"
+"Wil je het installeren?\n"
"\n"
"Er wordt eerst een configuratiesnapshot gemaakt. Deze kan op elk moment "
"hersteld worden en zal geen probleem geven bij nieuwere versies.\n"
@@ -6195,7 +7916,7 @@ msgstr "Opmerking:"
#: src/slic3r/GUI/UpdateDialogs.cpp:148 src/slic3r/GUI/UpdateDialogs.cpp:210
#, c-format
msgid "%s incompatibility"
-msgstr "%s incompatibiliteit"
+msgstr "%s ongeschiktheid"
#: src/slic3r/GUI/UpdateDialogs.cpp:148
msgid "You must install a configuration update."
@@ -6227,7 +7948,7 @@ msgstr "%s afsluiten"
#: src/slic3r/GUI/UpdateDialogs.cpp:211
#, c-format
msgid "%s configuration is incompatible"
-msgstr "%s configuratie is niet compatibel"
+msgstr "%s configuratie is ongeschikt"
#: src/slic3r/GUI/UpdateDialogs.cpp:216
#, c-format
@@ -6241,7 +7962,7 @@ msgid ""
"the initial configuration. Doing so will create a backup snapshot of the "
"existing configuration before installing files compatible with this %s."
msgstr ""
-"Deze versie van %s is niet compatibel met de huidig geïnstalleerde "
+"Deze versie van %s is ongeschikt voor de huidig geïnstalleerde "
"configuratiebundels.\n"
"Dit kan mogelijk ontstaan als resultaat van het draaien van een ouder %s na "
"het gebruik van een nieuwere.\n"
@@ -6249,7 +7970,7 @@ msgstr ""
"U kunt kiezen om %s af te sluiten en opnieuw te proberen met een nieuwere "
"versie of de startconfiguratie opnieuw te draaien. In geval van dat laatste "
"wordt een backup-snapshot gemaakt van de bestaande configuratie voor het "
-"installeren van bestanden die compatibel zijn met deze %s."
+"installeren van bestanden die geschikt zijn voor deze %s."
#: src/slic3r/GUI/UpdateDialogs.cpp:225
#, c-format
@@ -6258,7 +7979,7 @@ msgstr "Deze %s versie: %s"
#: src/slic3r/GUI/UpdateDialogs.cpp:230
msgid "Incompatible bundles:"
-msgstr "Incompatibele bundels:"
+msgstr "Ongeschikte bundels:"
#: src/slic3r/GUI/UpdateDialogs.cpp:249
msgid "Re-configure"
@@ -6281,19 +8002,20 @@ msgid ""
msgstr ""
"%s gebruikt nu een geüpdatete configuratiestructuur.\n"
"\n"
-"Presets van het systeem zijn geïntroduceerd. Deze bevatten ingebouwde "
-"standaardinstellingen voor meerdere printers. Deze systemen kunnen niet "
-"aangepast worden. In plaats daarvan kunt u nu uw eigen presets creëren op "
-"basis van een van de preset.\n"
-"Een overgenomen preset kan een bepaalde waarde van bovenliggende "
+"Zogenoemde systeeminstellingen zijn geïntroduceerd. Deze bevatten ingebouwde "
+"standaardinstellingen voor meerdere printers. Deze systeeminstellingen "
+"kunnen niet aangepast worden. In plaats daarvan kun je nu je eigen "
+"voorinstellingen creëren op basis van één van de systeeminstellingen.\n"
+"Een overgenomen instelling kan een bepaalde waarde van bovenliggende "
"instellingen meekrijgen, maar ook overschrijven met een aangepaste waarde.\n"
"\n"
-"Ga verdere met de %s die volgt om de nieuwe presets in te stellen en om te "
-"kiezen of automatische presets moeten worden ingeschakeld."
+"Ga verdere met de %s die volgt om de nieuwe systeeminstellingen in te "
+"stellen en om te kiezen of automatische voorinstellingen moeten worden "
+"ingeschakeld."
#: src/slic3r/GUI/UpdateDialogs.cpp:287
msgid "For more information please visit our wiki page:"
-msgstr "Voor meer informatie kunt u naar onze wiki-pagina gaan:"
+msgstr "Voor meer informatie kun je naar onze wiki-pagina gaan:"
#: src/slic3r/GUI/UpdateDialogs.cpp:304
msgid "Configuration updates"
@@ -6360,7 +8082,7 @@ msgid ""
"Here you can adjust required purging volume (mm³) for any given pair of "
"tools."
msgstr ""
-"Hier kunt u het benodigde afveegvolume (mm³) voor elk soort tool aanpassen."
+"Hier kun je het benodigde afveegvolume (mm³) voor elk soort tool aanpassen."
#: src/slic3r/GUI/WipeTowerDialog.cpp:255
msgid "Extruder changed to"
@@ -6392,7 +8114,7 @@ msgstr "Afveegvolume (mm³) als het filament wordt gebruikt"
#: src/slic3r/GUI/WipeTowerDialog.cpp:300
msgid "From"
-msgstr "Van"
+msgstr "Vanaf"
#: src/slic3r/GUI/WipeTowerDialog.cpp:365
msgid ""
@@ -6404,7 +8126,7 @@ msgstr ""
"Overschakelen naar eenvoudige modus zorgt dat de gewijzigde instellingen uit "
"de geavanceerde modus vervallen!\n"
"\n"
-"Weet u zeker dat u wilt doorgaan?"
+"Weet je zeker dat je wil doorgaan?"
#: src/slic3r/GUI/WipeTowerDialog.cpp:377
msgid "Show simplified settings"
@@ -6414,17 +8136,17 @@ msgstr "Toon eenvoudige instellingen"
msgid "Show advanced settings"
msgstr "Toon geavanceerde instellingen"
-#: src/slic3r/GUI/wxExtensions.cpp:706
+#: src/slic3r/GUI/wxExtensions.cpp:627
#, c-format
msgid "Switch to the %s mode"
msgstr "Schakel over naar de %s modus"
-#: src/slic3r/GUI/wxExtensions.cpp:707
+#: src/slic3r/GUI/wxExtensions.cpp:628
#, c-format
msgid "Current mode is %s"
msgstr "Huidige modus is: %s"
-#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:69
+#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:68
#, c-format
msgid "Mismatched type of print host: %s"
msgstr "Onjuist type printhost: %s"
@@ -6441,25 +8163,25 @@ msgstr "Kan niet verbinden met AstroBox"
msgid "Note: AstroBox version at least 1.1.0 is required."
msgstr "Let op: AstroBox-versie 1.1.0 is tenminste vereist."
-#: src/slic3r/Utils/Duet.cpp:49
+#: src/slic3r/Utils/Duet.cpp:47
msgid "Connection to Duet works correctly."
msgstr "Verbinding met Duet werkt naar behoren."
-#: src/slic3r/Utils/Duet.cpp:55
+#: src/slic3r/Utils/Duet.cpp:53
msgid "Could not connect to Duet"
msgstr "Kan niet verbinden met Duet"
-#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:139
+#: src/slic3r/Utils/Duet.cpp:88 src/slic3r/Utils/Duet.cpp:151
#: src/slic3r/Utils/FlashAir.cpp:122 src/slic3r/Utils/FlashAir.cpp:143
#: src/slic3r/Utils/FlashAir.cpp:159
msgid "Unknown error occured"
msgstr "Onbekende fout opgetreden"
-#: src/slic3r/Utils/Duet.cpp:133
+#: src/slic3r/Utils/Duet.cpp:145
msgid "Wrong password"
msgstr "Verkeerd wachtwoord"
-#: src/slic3r/Utils/Duet.cpp:136
+#: src/slic3r/Utils/Duet.cpp:148
msgid "Could not get resources to create a new connection"
msgstr "Kan geen middelen krijgen om nieuwe verbinding te maken"
@@ -6474,7 +8196,7 @@ msgstr "Laden van het model mislukt."
#: src/slic3r/Utils/FixModelByWin10.cpp:242
msgid "Repairing model by the Netfabb service"
-msgstr "Repareer model met de NetFabb-service"
+msgstr "Repareer model met de Netfabb-service"
#: src/slic3r/Utils/FixModelByWin10.cpp:248
msgid "Mesh repair failed."
@@ -6496,8 +8218,8 @@ msgid "Model fixing"
msgstr "Model repareren"
#: src/slic3r/Utils/FixModelByWin10.cpp:341
-msgid "Exporting model..."
-msgstr "Model exporteren..."
+msgid "Exporting model"
+msgstr "Model exporteren"
#: src/slic3r/Utils/FixModelByWin10.cpp:368
msgid "Export of a temporary 3mf file failed"
@@ -6513,7 +8235,7 @@ msgstr "Gerepareerd 3MF-bestand bevat geen object"
#: src/slic3r/Utils/FixModelByWin10.cpp:387
msgid "Repaired 3MF file contains more than one object"
-msgstr "Gerepareerd 3MF-bestand bevat meer dan 1 object"
+msgstr "Gerepareerd 3MF-bestand bevat meer dan één object"
#: src/slic3r/Utils/FixModelByWin10.cpp:389
msgid "Repaired 3MF file does not contain any volume"
@@ -6521,7 +8243,7 @@ msgstr "Gerepareerd 3MF-bestand bevat geen volume"
#: src/slic3r/Utils/FixModelByWin10.cpp:391
msgid "Repaired 3MF file contains more than one volume"
-msgstr "Gerepareerd 3MF-bestand bevat meer dan 1 volume"
+msgstr "Gerepareerd 3MF-bestand bevat meer dan één volume"
#: src/slic3r/Utils/FixModelByWin10.cpp:400
msgid "Model repair finished"
@@ -6538,7 +8260,7 @@ msgstr "Model repareren was succesvol"
#: src/slic3r/Utils/FixModelByWin10.cpp:423
#: src/slic3r/Utils/FixModelByWin10.cpp:426
msgid "Model Repair by the Netfabb service"
-msgstr "Model repareren met de NetFabb-service"
+msgstr "Model repareren met de Netfabb-service"
#: src/slic3r/Utils/FixModelByWin10.cpp:426
msgid "Model repair failed:"
@@ -6564,250 +8286,336 @@ msgstr ""
"Let op: FlashAir met firmware 2.00.02 (of nieuwer) en een geactiveerde "
"upload zijn vereist."
-#: src/slic3r/Utils/OctoPrint.cpp:84
+#: src/slic3r/Utils/OctoPrint.cpp:83
msgid "Connection to OctoPrint works correctly."
msgstr "Verbinding met OctoPrint werkt naar behoren."
-#: src/slic3r/Utils/OctoPrint.cpp:90
+#: src/slic3r/Utils/OctoPrint.cpp:89
msgid "Could not connect to OctoPrint"
msgstr "Kan niet verbinden met OctoPrint"
-#: src/slic3r/Utils/OctoPrint.cpp:92
+#: src/slic3r/Utils/OctoPrint.cpp:91
msgid "Note: OctoPrint version at least 1.1.0 is required."
msgstr "Let op: de minimaal vereiste versie van OctoPrint is 1.1.0."
-#: src/slic3r/Utils/OctoPrint.cpp:179
+#: src/slic3r/Utils/OctoPrint.cpp:185
msgid "Connection to Prusa SL1 works correctly."
msgstr "Verbinding met Prusa SL1 werkt naar behoren."
-#: src/slic3r/Utils/OctoPrint.cpp:185
+#: src/slic3r/Utils/OctoPrint.cpp:191
msgid "Could not connect to Prusa SLA"
msgstr "Kan niet verbinden met Prusa SLA"
-#: src/slic3r/Utils/PresetUpdater.cpp:705
+#: src/slic3r/Utils/PresetUpdater.cpp:70
+msgid ""
+"Copying of file %1% to %2% failed. Permissions fail at target file before "
+"copying.\n"
+"Error message : %3%\n"
+"This error happend during %4% phase."
+msgstr ""
+"Kopiëren van bestand %1% naar %2% mislukt. Toestemmingsfout op targetbestand "
+"voor het kopiëren.\n"
+"Foutbericht: %3%\n"
+"Deze fout ontstond tijdens de %4% fase."
+
+#: src/slic3r/Utils/PresetUpdater.cpp:85
+msgid ""
+"Copying of file %1% to %2% failed.\n"
+"Error message : %3%\n"
+"Copying was triggered by function: %4%"
+msgstr ""
+"Kopiëren van bestand %1% naar %2% mislukt.\n"
+"Foutbericht: %3%\n"
+"Kopiëren is getriggerd door functie: %4%"
+
+#: src/slic3r/Utils/PresetUpdater.cpp:92
+msgid ""
+"Copying of file %1% to %2% failed. Permissions fail at target file after "
+"copying.\n"
+"Error message : %3%\n"
+"Copying was triggered by function: %4%"
+msgstr ""
+"Kopiëren van bestand %1% naar %2% mislukt. Toestemmingsfout op targetbestand "
+"na het kopiëren.\n"
+"Foutbericht: %3%\n"
+"Kopiëren is getriggerd door functie: %4%"
+
+#: src/slic3r/Utils/PresetUpdater.cpp:121
+msgid "install"
+msgstr "installeer"
+
+#: src/slic3r/Utils/PresetUpdater.cpp:413
+#: src/slic3r/Utils/PresetUpdater.cpp:421
+msgid "checking install indices"
+msgstr "controleren op installatie-indices"
+
+#: src/slic3r/Utils/PresetUpdater.cpp:601
+msgid "getting config updates"
+msgstr "haal configuratie-updates op"
+
+#: src/slic3r/Utils/PresetUpdater.cpp:755
#, c-format
msgid "requires min. %s and max. %s"
msgstr "vereist minimaal %s en maximaal %s"
-#: src/slic3r/Utils/PresetUpdater.cpp:710
+#: src/slic3r/Utils/PresetUpdater.cpp:759
#, c-format
msgid "requires min. %s"
msgstr "vereist minimaal %s"
-#: src/slic3r/Utils/PresetUpdater.cpp:713
+#: src/slic3r/Utils/PresetUpdater.cpp:762
#, c-format
msgid "requires max. %s"
msgstr "vereist maximaal %s"
-#: src/libslic3r/SLA/Pad.cpp:691
-msgid "Pad brim size is too small for the current configuration."
-msgstr "Brimgrootte is te klein voor de huidige configuratie."
+#: src/slic3r/Utils/Http.cpp:73
+msgid ""
+"Could not detect system SSL certificate store. PrusaSlicer will be unable to "
+"establish secure network connections."
+msgstr ""
+"Kan geen systeem SSL certicate store detecteren. PrusaSlicer is niet in "
+"staat om een veilige netwerkverbinding in te stellen."
+
+#: src/slic3r/Utils/Http.cpp:78
+msgid "PrusaSlicer detected system SSL certificate store in: %1%"
+msgstr ""
+"PrusaSlicer heeft een system SSL certificate store gedetecteerd in: %1%"
-#: src/libslic3r/Zipper.cpp:32
+#: src/slic3r/Utils/Http.cpp:82
+msgid ""
+"To specify the system certificate store manually, please set the %1% "
+"environment variable to the correct CA bundle and restart the application."
+msgstr ""
+"Om het systeemcertificaat handmatig op te slaan, stel je de %1% "
+"omgevingsvariabele in op de juiste CA bundel en start je het programma "
+"opnieuw."
+
+#: src/slic3r/Utils/Http.cpp:91
+msgid ""
+"CURL init has failed. PrusaSlicer will be unable to establish network "
+"connections. See logs for additional details."
+msgstr ""
+"Curl-initialisatie mislukt. PrusaSlicer kan geen netwerkverbinding "
+"instellen. Zie het wijzigingslogboek voor verdere details."
+
+#: src/slic3r/Utils/Process.cpp:151
+msgid "Open G-code file:"
+msgstr "Open G-code bestand:"
+
+#: src/libslic3r/GCode.cpp:521
+msgid "There is an object with no extrusions on the first layer."
+msgstr "Er is een object zonder extrusie op de eerste laag."
+
+#: src/libslic3r/GCode.cpp:539
+msgid "Empty layers detected, the output would not be printable."
+msgstr "Lege lagen gedetecteerd. De output is mogelijk niet-printbaar."
+
+#: src/libslic3r/GCode.cpp:540
+msgid "Print z"
+msgstr "Print Z"
+
+#: src/libslic3r/GCode.cpp:541
+msgid ""
+"This is usually caused by negligibly small extrusions or by a faulty model. "
+"Try to repair the model or change its orientation on the bed."
+msgstr ""
+"Dit wordt normaal gesproken veroorzaakt door verwaarloosbaar smalle lijnen "
+"of door een defect model. Probeer het model te repareren of verander de "
+"oriëntatie op het bed."
+
+#: src/libslic3r/ExtrusionEntity.cpp:324 src/libslic3r/ExtrusionEntity.cpp:360
+msgid "Mixed"
+msgstr "Gemengd"
+
+#: src/libslic3r/Flow.cpp:61
+msgid ""
+"Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible."
+msgstr ""
+"Kan de extrusiebreedte niet berekenen voor %1%: Variabele '%2%' niet "
+"beschikbaar."
+
+#: src/libslic3r/Format/3mf.cpp:1668
+msgid ""
+"The selected 3mf file has been saved with a newer version of %1% and is not "
+"compatible."
+msgstr ""
+"Het geselecteerde 3MF-bestand is opgeslagen in een nieuwere versie van %1% "
+"en is ongeschikt."
+
+#: src/libslic3r/Format/AMF.cpp:958
+msgid ""
+"The selected amf file has been saved with a newer version of %1% and is not "
+"compatible."
+msgstr ""
+"Het geselecteerde AMF-bestand is opgeslagen in een nieuwere versie van %1% "
+"en is ongeschikt."
+
+#: src/libslic3r/miniz_extension.cpp:91
msgid "undefined error"
msgstr "onbekende fout"
-#: src/libslic3r/Zipper.cpp:34
+#: src/libslic3r/miniz_extension.cpp:93
msgid "too many files"
msgstr "te veel bestanden"
-#: src/libslic3r/Zipper.cpp:36
+#: src/libslic3r/miniz_extension.cpp:95
msgid "file too large"
msgstr "bestand te groot"
-#: src/libslic3r/Zipper.cpp:38
+#: src/libslic3r/miniz_extension.cpp:97
msgid "unsupported method"
msgstr "niet-ondersteunde methode"
-#: src/libslic3r/Zipper.cpp:40
+#: src/libslic3r/miniz_extension.cpp:99
msgid "unsupported encryption"
msgstr "niet-ondersteunde encryptie"
-#: src/libslic3r/Zipper.cpp:42
+#: src/libslic3r/miniz_extension.cpp:101
msgid "unsupported feature"
msgstr "niet-ondersteunde optie"
-#: src/libslic3r/Zipper.cpp:44
+#: src/libslic3r/miniz_extension.cpp:103
msgid "failed finding central directory"
msgstr "centrale map niet gevonden"
-#: src/libslic3r/Zipper.cpp:46
+#: src/libslic3r/miniz_extension.cpp:105
msgid "not a ZIP archive"
msgstr "geen ZIP-archief"
-#: src/libslic3r/Zipper.cpp:48
+#: src/libslic3r/miniz_extension.cpp:107
msgid "invalid header or archive is corrupted"
msgstr "ongeldige koptekst of het archief is beschadigd"
-#: src/libslic3r/Zipper.cpp:50
+#: src/libslic3r/miniz_extension.cpp:109
msgid "unsupported multidisk archive"
msgstr "niet-ondersteund multi-disk archief"
-#: src/libslic3r/Zipper.cpp:52
+#: src/libslic3r/miniz_extension.cpp:111
msgid "decompression failed or archive is corrupted"
msgstr "decompressie mislukt of archief is beschadigd"
-#: src/libslic3r/Zipper.cpp:54
+#: src/libslic3r/miniz_extension.cpp:113
msgid "compression failed"
msgstr "compressie mislukt"
-#: src/libslic3r/Zipper.cpp:56
+#: src/libslic3r/miniz_extension.cpp:115
msgid "unexpected decompressed size"
msgstr "onverwachte gedecomprimeerde grootte"
-#: src/libslic3r/Zipper.cpp:58
+#: src/libslic3r/miniz_extension.cpp:117
msgid "CRC-32 check failed"
-msgstr "CRC-32 check mislukt"
+msgstr "CRC-32-check mislukt"
-#: src/libslic3r/Zipper.cpp:60
+#: src/libslic3r/miniz_extension.cpp:119
msgid "unsupported central directory size"
msgstr "niet-ondersteunde centrale mapgrootte"
-#: src/libslic3r/Zipper.cpp:62
+#: src/libslic3r/miniz_extension.cpp:121
msgid "allocation failed"
msgstr "toewijzing mislukt"
-#: src/libslic3r/Zipper.cpp:64
+#: src/libslic3r/miniz_extension.cpp:123
msgid "file open failed"
msgstr "bestand openen mislukt"
-#: src/libslic3r/Zipper.cpp:66
+#: src/libslic3r/miniz_extension.cpp:125
msgid "file create failed"
msgstr "bestand creëren mislukt"
-#: src/libslic3r/Zipper.cpp:68
+#: src/libslic3r/miniz_extension.cpp:127
msgid "file write failed"
msgstr "bestand schrijven mislukt"
-#: src/libslic3r/Zipper.cpp:70
+#: src/libslic3r/miniz_extension.cpp:129
msgid "file read failed"
msgstr "bestand lezen mislukt"
-#: src/libslic3r/Zipper.cpp:72
+#: src/libslic3r/miniz_extension.cpp:131
msgid "file close failed"
msgstr "bestand sluiten mislukt"
-#: src/libslic3r/Zipper.cpp:74
+#: src/libslic3r/miniz_extension.cpp:133
msgid "file seek failed"
msgstr "bestand zoeken mislukt"
-#: src/libslic3r/Zipper.cpp:76
+#: src/libslic3r/miniz_extension.cpp:135
msgid "file stat failed"
msgstr "bestandsstatus mislukt"
-#: src/libslic3r/Zipper.cpp:78
+#: src/libslic3r/miniz_extension.cpp:137
msgid "invalid parameter"
msgstr "ongeldige parameter"
-#: src/libslic3r/Zipper.cpp:80
+#: src/libslic3r/miniz_extension.cpp:139
msgid "invalid filename"
msgstr "ongeldige bestandsnaam"
-#: src/libslic3r/Zipper.cpp:82
+#: src/libslic3r/miniz_extension.cpp:141
msgid "buffer too small"
msgstr "buffer te klein"
-#: src/libslic3r/Zipper.cpp:84
+#: src/libslic3r/miniz_extension.cpp:143
msgid "internal error"
msgstr "interne fout"
-#: src/libslic3r/Zipper.cpp:86
+#: src/libslic3r/miniz_extension.cpp:145
msgid "file not found"
msgstr "bestand niet gevonden"
-#: src/libslic3r/Zipper.cpp:88
+#: src/libslic3r/miniz_extension.cpp:147
msgid "archive is too large"
msgstr "archief te groot"
-#: src/libslic3r/Zipper.cpp:90
+#: src/libslic3r/miniz_extension.cpp:149
msgid "validation failed"
msgstr "validatie mislukt"
-#: src/libslic3r/Zipper.cpp:92
+#: src/libslic3r/miniz_extension.cpp:151
msgid "write calledback failed"
msgstr "terugschrijven mislukt"
-#: src/libslic3r/Zipper.cpp:102
-msgid "Error with zip archive"
-msgstr "Fout bij ZIP-archief"
-
-#: src/libslic3r/GCode.cpp:640
-msgid "Empty layers detected, the output would not be printable."
-msgstr "Lege lagen gedetecteerd. De output is mogelijk niet-printbaar."
-
-#: src/libslic3r/GCode.cpp:641
-msgid "Print z"
-msgstr "Print Z"
-
-#: src/libslic3r/GCode.cpp:642
-msgid ""
-"This is usually caused by negligibly small extrusions or by a faulty model. "
-"Try to repair the model or change its orientation on the bed."
-msgstr ""
-"Dit wordt normaal gesproken veroorzaakt door verwaarloosbaar smalle lijnen "
-"of door een defect model. Probeer het model te repareren of verander de "
-"oriëntatie op het bed."
-
-#: src/libslic3r/ExtrusionEntity.cpp:323
-msgid "Mixed"
-msgstr "Gemengd"
-
-#: src/libslic3r/Flow.cpp:61
-msgid ""
-"Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible."
-msgstr ""
-"Kan de extrusiebreedte niet berekenen voor %1%: Variabele '%2%' niet "
-"beschikbaar."
-
-#: src/libslic3r/Format/3mf.cpp:1630
-msgid ""
-"The selected 3mf file has been saved with a newer version of %1% and is not "
-"compatible."
-msgstr ""
-"Het geselecteerde 3MF-bestand is opgeslagen in een nieuwere versie van %1% "
-"en is niet compatibel."
-
-#: src/libslic3r/Format/AMF.cpp:934
-msgid ""
-"The selected amf file has been saved with a newer version of %1% and is not "
-"compatible."
-msgstr ""
-"Het geselecteerde AMF-bestand is opgeslagen in een nieuwere versie van %1% "
-"en is niet compatibel."
+#: src/libslic3r/Preset.cpp:1299
+msgid "filament"
+msgstr "filament"
-#: src/libslic3r/Print.cpp:1219
+#: src/libslic3r/Print.cpp:1251
msgid "All objects are outside of the print volume."
msgstr "Alle objecten bevinden zich buiten het printvolume."
-#: src/libslic3r/Print.cpp:1222
+#: src/libslic3r/Print.cpp:1254
msgid "The supplied settings will cause an empty print."
msgstr "De ingevoerde instellingen resulteren in een lege print."
-#: src/libslic3r/Print.cpp:1226
+#: src/libslic3r/Print.cpp:1258
msgid "Some objects are too close; your extruder will collide with them."
msgstr ""
"Sommige objecten staan te dicht op elkaar. De extruder zal er tegenaan "
"botsen."
-#: src/libslic3r/Print.cpp:1228
+#: src/libslic3r/Print.cpp:1260
msgid ""
"Some objects are too tall and cannot be printed without extruder collisions."
msgstr ""
"Sommige objecten zijn te groot en kunnen niet geprint worden zonder "
"botsingen."
-#: src/libslic3r/Print.cpp:1237
-msgid "The Spiral Vase option can only be used when printing a single object."
-msgstr "De spiraalmodus kan alleen gebruikt worden voor enkeldelige objecten."
+#: src/libslic3r/Print.cpp:1269
+msgid ""
+"Only a single object may be printed at a time in Spiral Vase mode. Either "
+"remove all but the last object, or enable sequential mode by "
+"\"complete_objects\"."
+msgstr ""
+"Alleen een enkeldelig object kan geprint worden in spiraalmodus. Verwijder "
+"alles behalve één object of sta achtereenvolgens printen toe."
-#: src/libslic3r/Print.cpp:1244
+#: src/libslic3r/Print.cpp:1277
msgid ""
"The Spiral Vase option can only be used when printing single material "
"objects."
msgstr ""
"De spiraalmodus kan alleen gebruikt worden met enkel-materiaal objecten."
-#: src/libslic3r/Print.cpp:1257
+#: src/libslic3r/Print.cpp:1290
msgid ""
"The wipe tower is only supported if all extruders have the same nozzle "
"diameter and use filaments of the same diameter."
@@ -6815,15 +8623,15 @@ msgstr ""
"Het afveegblok wordt alleen ondersteunt als alle extruders dezelfde nozzle- "
"en filamentdiameter hebben."
-#: src/libslic3r/Print.cpp:1262
+#: src/libslic3r/Print.cpp:1296
msgid ""
-"The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter "
-"and Repetier G-code flavors."
+"The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, "
+"RepRapFirmware and Repetier G-code flavors."
msgstr ""
-"Het afveegblok wordt alleen ondersteunt in Marlin, RepRap/Sprinter en "
-"Repetier G-code-soorten."
+"Het afveegblok wordt alleen ondersteunt voor Marlin, RepRap/Sprinter, "
+"RepRapFirmware en Repetier firmwaretypes."
-#: src/libslic3r/Print.cpp:1264
+#: src/libslic3r/Print.cpp:1298
msgid ""
"The Wipe Tower is currently only supported with the relative extruder "
"addressing (use_relative_e_distances=1)."
@@ -6831,19 +8639,19 @@ msgstr ""
"Het afveegblok wordt alleen ondersteunt met de relatieve extruderinstelling "
"('use_relative_e_distances' = 1)."
-#: src/libslic3r/Print.cpp:1266
+#: src/libslic3r/Print.cpp:1300
msgid "Ooze prevention is currently not supported with the wipe tower enabled."
msgstr ""
"Druippreventie wordt niet ondersteund als het afveegblok is geactiveerd."
-#: src/libslic3r/Print.cpp:1268
+#: src/libslic3r/Print.cpp:1302
msgid ""
"The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)."
msgstr ""
"Het afveegblok niet ondersteunt bij volumetrische extrusiewaarden "
"('use_volumetric_e' = 0)."
-#: src/libslic3r/Print.cpp:1270
+#: src/libslic3r/Print.cpp:1304
msgid ""
"The Wipe Tower is currently not supported for multimaterial sequential "
"prints."
@@ -6851,7 +8659,7 @@ msgstr ""
"Het afveegblok wordt momenteel niet ondersteund voor multi-materiaal "
"achtereenvolgens printen."
-#: src/libslic3r/Print.cpp:1291
+#: src/libslic3r/Print.cpp:1325
msgid ""
"The Wipe Tower is only supported for multiple objects if they have equal "
"layer heights"
@@ -6859,7 +8667,7 @@ msgstr ""
"Het afveegblok wordt alleen ondersteunt voor meerdere objecten als deze een "
"gelijke laagdikte hebben"
-#: src/libslic3r/Print.cpp:1293
+#: src/libslic3r/Print.cpp:1327
msgid ""
"The Wipe Tower is only supported for multiple objects if they are printed "
"over an equal number of raft layers"
@@ -6867,7 +8675,7 @@ msgstr ""
"Het afveegblok wordt alleen ondersteunt voor meerdere objecten als deze op "
"een gelijk aantal raftlagen zijn geplaatst"
-#: src/libslic3r/Print.cpp:1295
+#: src/libslic3r/Print.cpp:1329
msgid ""
"The Wipe Tower is only supported for multiple objects if they are printed "
"with the same support_material_contact_distance"
@@ -6875,7 +8683,7 @@ msgstr ""
"Het afveegblok wordt alleen ondersteunt voor meerdere objecten als de "
"instelling 'support_material_contact_distance' gelijk staat"
-#: src/libslic3r/Print.cpp:1297
+#: src/libslic3r/Print.cpp:1331
msgid ""
"The Wipe Tower is only supported for multiple objects if they are sliced "
"equally."
@@ -6883,7 +8691,7 @@ msgstr ""
"Het afveegblok wordt alleen ondersteunt voor meerdere objecten als ze "
"tegelijk gesliced worden."
-#: src/libslic3r/Print.cpp:1339
+#: src/libslic3r/Print.cpp:1373
msgid ""
"The Wipe tower is only supported if all objects have the same variable layer "
"height"
@@ -6891,22 +8699,22 @@ msgstr ""
"Het afveegblok wordt alleen ondersteunt als alle objecten dezelfde variabele "
"laagdikte hebben"
-#: src/libslic3r/Print.cpp:1365
+#: src/libslic3r/Print.cpp:1399
msgid ""
"One or more object were assigned an extruder that the printer does not have."
msgstr ""
"Een of meer objecten staan ingesteld op een extruder die de printer niet "
"heeft."
-#: src/libslic3r/Print.cpp:1374
+#: src/libslic3r/Print.cpp:1408
msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm"
msgstr "%1%=%2% mm is te weinig om te printen bij een laagdikte van %3% mm"
-#: src/libslic3r/Print.cpp:1377
+#: src/libslic3r/Print.cpp:1411
msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm"
msgstr "Te veel %1%=%2% mm om te printen met een nozzlediameter van %3% mm"
-#: src/libslic3r/Print.cpp:1388
+#: src/libslic3r/Print.cpp:1422
msgid ""
"Printing with multiple extruders of differing nozzle diameters. If support "
"is to be printed with the current extruder (support_material_extruder == 0 "
@@ -6918,7 +8726,7 @@ msgstr ""
"dezelfde diameter hebben ('support_material_extruder' = 0 of "
"'support_material_interface_extruder' = 0)."
-#: src/libslic3r/Print.cpp:1396
+#: src/libslic3r/Print.cpp:1430
msgid ""
"For the Wipe Tower to work with the soluble supports, the support layers "
"need to be synchronized with the object layers."
@@ -6926,7 +8734,7 @@ msgstr ""
"Om het afveegblok te laten samenwerken met oplosbare support, moeten de "
"supportlagen gesynchroniseerd worden met de objectlagen."
-#: src/libslic3r/Print.cpp:1400
+#: src/libslic3r/Print.cpp:1434
msgid ""
"The Wipe Tower currently supports the non-soluble supports only if they are "
"printed with the current extruder without triggering a tool change. (both "
@@ -6937,36 +8745,40 @@ msgstr ""
"worden met de huidige extruder zonder toolwissel (Zet zowel "
"'support_material_extruder' en 'support_material_interface_extruder' op 0)."
-#: src/libslic3r/Print.cpp:1422
+#: src/libslic3r/Print.cpp:1456
msgid "First layer height can't be greater than nozzle diameter"
msgstr ""
"Laagdikte van de eerste laag kan niet groter zijn dan de nozzlediameter"
-#: src/libslic3r/Print.cpp:1427
+#: src/libslic3r/Print.cpp:1461
msgid "Layer height can't be greater than nozzle diameter"
msgstr "Laagdikte kan niet groter zijn dan de nozzlediameter"
-#: src/libslic3r/Print.cpp:1584
+#: src/libslic3r/Print.cpp:1620
msgid "Infilling layers"
msgstr "Vullingslagen"
-#: src/libslic3r/Print.cpp:1606
+#: src/libslic3r/Print.cpp:1646
msgid "Generating skirt"
msgstr "Skirt genereren"
-#: src/libslic3r/Print.cpp:1614
+#: src/libslic3r/Print.cpp:1655
msgid "Generating brim"
msgstr "Brim genereren"
-#: src/libslic3r/Print.cpp:1638
+#: src/libslic3r/Print.cpp:1678
msgid "Exporting G-code"
msgstr "G-code exporteren"
-#: src/libslic3r/Print.cpp:1642
+#: src/libslic3r/Print.cpp:1682
msgid "Generating G-code"
msgstr "G-code genereren"
-#: src/libslic3r/SLAPrint.cpp:615
+#: src/libslic3r/SLA/Pad.cpp:532
+msgid "Pad brim size is too small for the current configuration."
+msgstr "Brimgrootte is te klein voor de huidige configuratie."
+
+#: src/libslic3r/SLAPrint.cpp:630
msgid ""
"Cannot proceed without support points! Add support points or disable support "
"generation."
@@ -6974,7 +8786,7 @@ msgstr ""
"Kan niet doorgaan zonder supportpunten! Voeg supportpunten toe of schakel "
"supportgeneratie uit."
-#: src/libslic3r/SLAPrint.cpp:627
+#: src/libslic3r/SLAPrint.cpp:642
msgid ""
"Elevation is too low for object. Use the \"Pad around object\" feature to "
"print the object without elevation."
@@ -6982,7 +8794,7 @@ msgstr ""
"Verhoging is te klein voor het object. Gebruik de 'Basisplaat rondom object'-"
"optie om het object zonder verhoging te printen."
-#: src/libslic3r/SLAPrint.cpp:633
+#: src/libslic3r/SLAPrint.cpp:648
msgid ""
"The endings of the support pillars will be deployed on the gap between the "
"object and the pad. 'Support base safety distance' has to be greater than "
@@ -6992,59 +8804,59 @@ msgstr ""
"de basisplaat. De instelling 'Veilige afstand voor supportbasis' moet groter "
"zijn dan de 'Basisplaat-objectgat'-parameter hiervoor."
-#: src/libslic3r/SLAPrint.cpp:648
+#: src/libslic3r/SLAPrint.cpp:663
msgid "Exposition time is out of printer profile bounds."
msgstr "De belichtingstijd valt buiten de grenzen van het printerprofiel."
-#: src/libslic3r/SLAPrint.cpp:655
+#: src/libslic3r/SLAPrint.cpp:670
msgid "Initial exposition time is out of printer profile bounds."
msgstr "Initiële belichtingstijd valt buiten de printerprofielgrenzen."
-#: src/libslic3r/SLAPrint.cpp:762
+#: src/libslic3r/SLAPrint.cpp:786
msgid "Slicing done"
msgstr "Slicen voltooid"
-#: src/libslic3r/SLAPrintSteps.cpp:43
+#: src/libslic3r/SLAPrintSteps.cpp:44
msgid "Hollowing model"
msgstr "Model uithollen"
-#: src/libslic3r/SLAPrintSteps.cpp:44
+#: src/libslic3r/SLAPrintSteps.cpp:45
msgid "Drilling holes into model."
msgstr "Afvoergaten toevoegen."
-#: src/libslic3r/SLAPrintSteps.cpp:45
+#: src/libslic3r/SLAPrintSteps.cpp:46
msgid "Slicing model"
msgstr "Model slicen"
-#: src/libslic3r/SLAPrintSteps.cpp:46 src/libslic3r/SLAPrintSteps.cpp:356
+#: src/libslic3r/SLAPrintSteps.cpp:47 src/libslic3r/SLAPrintSteps.cpp:359
msgid "Generating support points"
msgstr "Supportpunten genereren"
-#: src/libslic3r/SLAPrintSteps.cpp:47
+#: src/libslic3r/SLAPrintSteps.cpp:48
msgid "Generating support tree"
msgstr "Supportboom genereren"
-#: src/libslic3r/SLAPrintSteps.cpp:48
+#: src/libslic3r/SLAPrintSteps.cpp:49
msgid "Generating pad"
msgstr "Basisplaat genereren"
-#: src/libslic3r/SLAPrintSteps.cpp:49
+#: src/libslic3r/SLAPrintSteps.cpp:50
msgid "Slicing supports"
msgstr "Support slicen"
-#: src/libslic3r/SLAPrintSteps.cpp:64
+#: src/libslic3r/SLAPrintSteps.cpp:65
msgid "Merging slices and calculating statistics"
msgstr "Slices samenvoegen en statistieken berekenen"
-#: src/libslic3r/SLAPrintSteps.cpp:65
+#: src/libslic3r/SLAPrintSteps.cpp:66
msgid "Rasterizing layers"
msgstr "Lagen roosteren"
-#: src/libslic3r/SLAPrintSteps.cpp:190
-msgid "Too much overlapping holes."
+#: src/libslic3r/SLAPrintSteps.cpp:192
+msgid "Too many overlapping holes."
msgstr "Te veel overlappende gaten."
-#: src/libslic3r/SLAPrintSteps.cpp:199
+#: src/libslic3r/SLAPrintSteps.cpp:201
msgid ""
"Drilling holes into the mesh failed. This is usually caused by broken model. "
"Try to fix it first."
@@ -7052,24 +8864,24 @@ msgstr ""
"Afvoergaten toevoegen mislukt. Dit komt meestal door een incorrect model. "
"Probeer die eerst te repareren."
-#: src/libslic3r/SLAPrintSteps.cpp:245
+#: src/libslic3r/SLAPrintSteps.cpp:247
msgid ""
"Slicing had to be stopped due to an internal error: Inconsistent slice index."
msgstr ""
"Slicen moest gestopt worden door een interne fout: inconsistente slice-index."
-#: src/libslic3r/SLAPrintSteps.cpp:413 src/libslic3r/SLAPrintSteps.cpp:422
-#: src/libslic3r/SLAPrintSteps.cpp:461
+#: src/libslic3r/SLAPrintSteps.cpp:411 src/libslic3r/SLAPrintSteps.cpp:420
+#: src/libslic3r/SLAPrintSteps.cpp:459
msgid "Visualizing supports"
msgstr "Visualiseer support"
-#: src/libslic3r/SLAPrintSteps.cpp:453
+#: src/libslic3r/SLAPrintSteps.cpp:451
msgid "No pad can be generated for this model with the current configuration"
msgstr ""
"Met de huidige configuratie kan voor dit model geen basisplaat gegenereerd "
"worden"
-#: src/libslic3r/SLAPrintSteps.cpp:621
+#: src/libslic3r/SLAPrintSteps.cpp:619
msgid ""
"There are unprintable objects. Try to adjust support settings to make the "
"objects printable."
@@ -7077,7 +8889,7 @@ msgstr ""
"Er zijn niet-printbare objecten. Probeer de supportinstellingen te "
"veranderen om het object printbaar te maken."
-#: src/libslic3r/PrintBase.cpp:71
+#: src/libslic3r/PrintBase.cpp:72
msgid "Failed processing of the output_filename_format template."
msgstr "Verwerken van de 'output_filename_format'-template mislukt."
@@ -7098,10 +8910,18 @@ msgid "Bed custom model"
msgstr "Custom bedmodel"
#: src/libslic3r/PrintConfig.cpp:66
-msgid "Picture sizes to be stored into a .gcode and .sl1 files"
-msgstr "Afbeeldingsgrootte om op te slaan in gcode- en SL1-bestanden"
+msgid "G-code thumbnails"
+msgstr "G-code miniaturen"
-#: src/libslic3r/PrintConfig.cpp:73
+#: src/libslic3r/PrintConfig.cpp:67
+msgid ""
+"Picture sizes to be stored into a .gcode and .sl1 files, in the following "
+"format: \"XxY, XxY, ...\""
+msgstr ""
+"Afbeeldingsgroottes worden opgeslagen in .gcode- en .sl1-bestand, in het "
+"formaat: \"XxY, XxY, …\""
+
+#: src/libslic3r/PrintConfig.cpp:75
msgid ""
"This setting controls the height (and thus the total number) of the slices/"
"layers. Thinner layers give better accuracy but take more time to print."
@@ -7109,22 +8929,22 @@ msgstr ""
"Deze instelling is voor de laagdikte (en dus het totaal aantal lagen). "
"Dunnere lagen geven een betere nauwkeurigheid, maar het printen duurt langer."
-#: src/libslic3r/PrintConfig.cpp:80
+#: src/libslic3r/PrintConfig.cpp:82
msgid "Max print height"
msgstr "Maximale printhoogte"
-#: src/libslic3r/PrintConfig.cpp:81
+#: src/libslic3r/PrintConfig.cpp:83
msgid ""
"Set this to the maximum height that can be reached by your extruder while "
"printing."
msgstr ""
"Stel dit in als maximale hoogte die bereikt kan worden door de printer."
-#: src/libslic3r/PrintConfig.cpp:87
+#: src/libslic3r/PrintConfig.cpp:91
msgid "Slice gap closing radius"
msgstr "Gatvulradius"
-#: src/libslic3r/PrintConfig.cpp:89
+#: src/libslic3r/PrintConfig.cpp:93
msgid ""
"Cracks smaller than 2x gap closing radius are being filled during the "
"triangle mesh slicing. The gap closing operation may reduce the final print "
@@ -7134,23 +8954,29 @@ msgstr ""
"het slicen. Het vullen kan zorgen dat de printresolutie minder wordt. Daarom "
"wordt geadviseerd de waarde laag te houden."
-#: src/libslic3r/PrintConfig.cpp:97
+#: src/libslic3r/PrintConfig.cpp:101
msgid "Hostname, IP or URL"
msgstr "Hostnaam, IP of URL"
-#: src/libslic3r/PrintConfig.cpp:98
+#: src/libslic3r/PrintConfig.cpp:102
msgid ""
"Slic3r can upload G-code files to a printer host. This field should contain "
-"the hostname, IP address or URL of the printer host instance."
-msgstr ""
-"PrusaSlicer kan gcode-bestanden naar een printerhost uploaden. Dit veld moet "
-"de hostnaam, IP-adres of URL van de printerhostomgeving bevatten."
-
-#: src/libslic3r/PrintConfig.cpp:104
+"the hostname, IP address or URL of the printer host instance. Print host "
+"behind HAProxy with basic auth enabled can be accessed by putting the user "
+"name and password into the URL in the following format: https://username:"
+"password@your-octopi-address/"
+msgstr ""
+"PrusaSlicer kan G-code-bestanden uploaden naar een printerhost. Dit tekstvak "
+"bevat de hostnaam, IP-adres of URL van de printerhostinstantie. Als de "
+"printerhost achter HAProxy met basis-authorisatie aan staat, kan toegang "
+"worden verkregen door gebruikersnaam en wachtwoord in te voeren in bij de "
+"URL in de vorm: https://gebruikersnaam:wachtwoord@je-octopi-adres/"
+
+#: src/libslic3r/PrintConfig.cpp:110
msgid "API Key / Password"
msgstr "API-key / wachtwoord"
-#: src/libslic3r/PrintConfig.cpp:105
+#: src/libslic3r/PrintConfig.cpp:111
msgid ""
"Slic3r can upload G-code files to a printer host. This field should contain "
"the API Key or the password required for authentication."
@@ -7158,7 +8984,11 @@ msgstr ""
"PrusaSlicer kan gcode-bestanden naar een printerhost uploaden. Dit veld moet "
"de API-key of het wachtwoord voor authenticatie bevatten."
-#: src/libslic3r/PrintConfig.cpp:112
+#: src/libslic3r/PrintConfig.cpp:118
+msgid "Name of the printer"
+msgstr "Naam van de printer"
+
+#: src/libslic3r/PrintConfig.cpp:125
msgid ""
"Custom CA certificate file can be specified for HTTPS OctoPrint connections, "
"in crt/pem format. If left blank, the default OS CA certificate repository "
@@ -7168,11 +8998,11 @@ msgstr ""
"OctoPrint verbindingen in CRT/PEM-formaat. Als er niets wordt ingevuld, "
"wordt de standaard OS-CA-certificaatopslaglocatie gebruikt."
-#: src/libslic3r/PrintConfig.cpp:118
+#: src/libslic3r/PrintConfig.cpp:131
msgid "Elephant foot compensation"
-msgstr "Squishcompensatie"
+msgstr "Squish-compensatie"
-#: src/libslic3r/PrintConfig.cpp:120
+#: src/libslic3r/PrintConfig.cpp:133
msgid ""
"The first layer will be shrunk in the XY plane by the configured value to "
"compensate for the 1st layer squish aka an Elephant Foot effect."
@@ -7180,11 +9010,35 @@ msgstr ""
"De eerste laag wordt verkleind in horizontale richting met de ingestelde "
"waarde ter compensatie van het platdrukken."
-#: src/libslic3r/PrintConfig.cpp:136
+#: src/libslic3r/PrintConfig.cpp:149
+msgid "Password"
+msgstr "Wachtwoord"
+
+#: src/libslic3r/PrintConfig.cpp:155
+msgid "Printer preset name"
+msgstr "Naam voor de printer-voorinstelling"
+
+#: src/libslic3r/PrintConfig.cpp:156
+msgid "Related printer preset name"
+msgstr "Gerelateerde naam voor printer-voorinstelling"
+
+#: src/libslic3r/PrintConfig.cpp:161
+msgid "Authorization Type"
+msgstr "Authorisatietype"
+
+#: src/libslic3r/PrintConfig.cpp:166
+msgid "API key"
+msgstr "API-sleutel"
+
+#: src/libslic3r/PrintConfig.cpp:167
+msgid "HTTP digest"
+msgstr "HTTP authenticatie"
+
+#: src/libslic3r/PrintConfig.cpp:180
msgid "Avoid crossing perimeters"
msgstr "Vermijd kruisende perimeters"
-#: src/libslic3r/PrintConfig.cpp:137
+#: src/libslic3r/PrintConfig.cpp:181
msgid ""
"Optimize travel moves in order to minimize the crossing of perimeters. This "
"is mostly useful with Bowden extruders which suffer from oozing. This "
@@ -7194,37 +9048,57 @@ msgstr ""
"handig bij Bowden-extruders die gevoelig zijn voor druipen. Deze aanpassing "
"vertraagd zowel de print als de G-code-generatie."
-#: src/libslic3r/PrintConfig.cpp:144 src/libslic3r/PrintConfig.cpp:2064
+#: src/libslic3r/PrintConfig.cpp:188
+msgid "Avoid crossing perimeters - Max detour length"
+msgstr "Vermijd kruisende perimeters - maximale omweglengte"
+
+#: src/libslic3r/PrintConfig.cpp:190
+msgid ""
+"The maximum detour length for avoid crossing perimeters. If the detour is "
+"longer than this value, avoid crossing perimeters is not applied for this "
+"travel path. Detour length could be specified either as an absolute value or "
+"as percentage (for example 50%) of a direct travel path."
+msgstr ""
+"De maximale omweglengte om kruisende perimeters te voorkomen. Kruisende "
+"perimeters worden niet toegepast als de omweglengte langer is dan deze "
+"lengte. De omweglengte kan gespecificeerd worden als absolute waarde of als "
+"percentage (bijvoorbeeld 50%) van direct bewegen."
+
+#: src/libslic3r/PrintConfig.cpp:193
+msgid "mm or % (zero to disable)"
+msgstr "mm of % (stel in op 0 om uit te schakelen)"
+
+#: src/libslic3r/PrintConfig.cpp:199 src/libslic3r/PrintConfig.cpp:2291
msgid "Other layers"
msgstr "Overige lagen"
-#: src/libslic3r/PrintConfig.cpp:145
+#: src/libslic3r/PrintConfig.cpp:200
msgid ""
"Bed temperature for layers after the first one. Set this to zero to disable "
"bed temperature control commands in the output."
msgstr ""
"Bedtemperatuur voor lagen na de eerste laag. Als dit ingesteld is op 0, "
-"worden bedverwarmingscommando's uitgezet."
+"worden bedtemperatuurregeling uitgezet."
-#: src/libslic3r/PrintConfig.cpp:147
+#: src/libslic3r/PrintConfig.cpp:203
msgid "Bed temperature"
msgstr "Bedtemperatuur"
-#: src/libslic3r/PrintConfig.cpp:154
+#: src/libslic3r/PrintConfig.cpp:210
msgid ""
"This custom code is inserted at every layer change, right before the Z move. "
"Note that you can use placeholder variables for all Slic3r settings as well "
"as [layer_num] and [layer_z]."
msgstr ""
"Deze custom code wordt toegevoegd bij elke laagwisseling, vlak voor de Z-"
-"beweging. U kunt hier variabelen gebruiken voor alle instellingen zoals "
+"beweging. Je kan hier variabelen gebruiken voor alle instellingen zoals "
"'layer_num' en 'layer_z'."
-#: src/libslic3r/PrintConfig.cpp:164
+#: src/libslic3r/PrintConfig.cpp:220
msgid "Between objects G-code"
msgstr "G-code die komt tussen objecten"
-#: src/libslic3r/PrintConfig.cpp:165
+#: src/libslic3r/PrintConfig.cpp:221
msgid ""
"This code is inserted between objects when using sequential printing. By "
"default extruder and bed temperature are reset using non-wait command; "
@@ -7234,20 +9108,20 @@ msgid ""
"S[first_layer_temperature]\" command wherever you want."
msgstr ""
"Deze code wordt ingevoegd tussen objecten bij het achtereenvolgens printen. "
-"Standaard worden de extruder- en bedtemperatuur gereset met een wacht-niet-"
-"commando, hoewel, als M104, M109, M140 of M190 in de custom code worden "
-"gedetecteerd zal PrusaSlicer deze commando's niet meenemen. Merk op dat "
+"Standaard worden de extruder- en bedtemperatuur gereset met een niet-"
+"wachtencommando, hoewel, als M104, M109, M140 of M190 in de custom code "
+"worden gedetecteerd zal PrusaSlicer deze codes niet meenemen. Merk op dat "
"variabelen voor alle instellingen gebruikt kunnen worden."
-#: src/libslic3r/PrintConfig.cpp:176
+#: src/libslic3r/PrintConfig.cpp:232
msgid "Number of solid layers to generate on bottom surfaces."
msgstr "Aantal te genereren dichte lagen voor ondervlakken."
-#: src/libslic3r/PrintConfig.cpp:177
+#: src/libslic3r/PrintConfig.cpp:233
msgid "Bottom solid layers"
msgstr "Dichte bodemlagen"
-#: src/libslic3r/PrintConfig.cpp:185
+#: src/libslic3r/PrintConfig.cpp:241
msgid ""
"The number of bottom solid layers is increased above bottom_solid_layers if "
"necessary to satisfy minimum thickness of bottom shell."
@@ -7255,15 +9129,15 @@ msgstr ""
"Het aantal dichte bodemlagen wordt verhoogd als blijkt dat het nodig is om "
"de minimale bodemshelldikte te garanderen."
-#: src/libslic3r/PrintConfig.cpp:187
+#: src/libslic3r/PrintConfig.cpp:243
msgid "Minimum bottom shell thickness"
msgstr "Minimale shelldikte aan de onderzijde"
-#: src/libslic3r/PrintConfig.cpp:193
+#: src/libslic3r/PrintConfig.cpp:249
msgid "Bridge"
msgstr "Brug"
-#: src/libslic3r/PrintConfig.cpp:194
+#: src/libslic3r/PrintConfig.cpp:250
msgid ""
"This is the acceleration your printer will use for bridges. Set zero to "
"disable acceleration control for bridges."
@@ -7271,18 +9145,18 @@ msgstr ""
"Deze acceleratie zal uw printer gebruiken voor bruggen. Als dit ingesteld is "
"op 0, wordt de acceleratie-instelling voor bruggen uitgezet."
-#: src/libslic3r/PrintConfig.cpp:196 src/libslic3r/PrintConfig.cpp:339
-#: src/libslic3r/PrintConfig.cpp:862 src/libslic3r/PrintConfig.cpp:984
-#: src/libslic3r/PrintConfig.cpp:1152 src/libslic3r/PrintConfig.cpp:1201
-#: src/libslic3r/PrintConfig.cpp:1211 src/libslic3r/PrintConfig.cpp:1403
+#: src/libslic3r/PrintConfig.cpp:252 src/libslic3r/PrintConfig.cpp:395
+#: src/libslic3r/PrintConfig.cpp:940 src/libslic3r/PrintConfig.cpp:1079
+#: src/libslic3r/PrintConfig.cpp:1360 src/libslic3r/PrintConfig.cpp:1409
+#: src/libslic3r/PrintConfig.cpp:1419 src/libslic3r/PrintConfig.cpp:1612
msgid "mm/s²"
msgstr "mm/s²"
-#: src/libslic3r/PrintConfig.cpp:202
+#: src/libslic3r/PrintConfig.cpp:258
msgid "Bridging angle"
msgstr "Brughoek"
-#: src/libslic3r/PrintConfig.cpp:204
+#: src/libslic3r/PrintConfig.cpp:260
msgid ""
"Bridging angle override. If left to zero, the bridging angle will be "
"calculated automatically. Otherwise the provided angle will be used for all "
@@ -7292,34 +9166,35 @@ msgstr ""
"automatisch berekend, anders wordt de opgegeven hoek voor alle bruggen "
"gebruikt. 180° staat gelijk aan 0°."
-#: src/libslic3r/PrintConfig.cpp:207 src/libslic3r/PrintConfig.cpp:780
-#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1650
-#: src/libslic3r/PrintConfig.cpp:1894 src/libslic3r/PrintConfig.cpp:2049
-#: src/libslic3r/PrintConfig.cpp:2247 src/libslic3r/PrintConfig.cpp:2737
-#: src/libslic3r/PrintConfig.cpp:2858
+#: src/libslic3r/PrintConfig.cpp:263 src/libslic3r/PrintConfig.cpp:852
+#: src/libslic3r/PrintConfig.cpp:1853 src/libslic3r/PrintConfig.cpp:1863
+#: src/libslic3r/PrintConfig.cpp:2121 src/libslic3r/PrintConfig.cpp:2276
+#: src/libslic3r/PrintConfig.cpp:2475 src/libslic3r/PrintConfig.cpp:2976
+#: src/libslic3r/PrintConfig.cpp:3097
msgid "°"
msgstr "°"
-#: src/libslic3r/PrintConfig.cpp:213
+#: src/libslic3r/PrintConfig.cpp:269
msgid "Bridges fan speed"
msgstr "Ventilatorsnelheid voor bruggen"
-#: src/libslic3r/PrintConfig.cpp:214
+#: src/libslic3r/PrintConfig.cpp:270
msgid "This fan speed is enforced during all bridges and overhangs."
msgstr "Deze ventilatorsnelheid wordt aangehouden bij bruggen en overhanging."
-#: src/libslic3r/PrintConfig.cpp:215 src/libslic3r/PrintConfig.cpp:792
-#: src/libslic3r/PrintConfig.cpp:1219 src/libslic3r/PrintConfig.cpp:1282
-#: src/libslic3r/PrintConfig.cpp:1532 src/libslic3r/PrintConfig.cpp:2425
-#: src/libslic3r/PrintConfig.cpp:2777
+#: src/libslic3r/PrintConfig.cpp:271 src/libslic3r/PrintConfig.cpp:864
+#: src/libslic3r/PrintConfig.cpp:1248 src/libslic3r/PrintConfig.cpp:1427
+#: src/libslic3r/PrintConfig.cpp:1490 src/libslic3r/PrintConfig.cpp:1745
+#: src/libslic3r/PrintConfig.cpp:2653 src/libslic3r/PrintConfig.cpp:2890
+#: src/libslic3r/PrintConfig.cpp:3016
msgid "%"
msgstr "%"
-#: src/libslic3r/PrintConfig.cpp:222
+#: src/libslic3r/PrintConfig.cpp:278
msgid "Bridge flow ratio"
msgstr "Brugextrusieverhouding"
-#: src/libslic3r/PrintConfig.cpp:224
+#: src/libslic3r/PrintConfig.cpp:280
msgid ""
"This factor affects the amount of plastic for bridging. You can decrease it "
"slightly to pull the extrudates and prevent sagging, although default "
@@ -7331,32 +9206,33 @@ msgstr ""
"voorkomen. Hoewel de systeemwaarden goed zijn, kan geëxperimenteerd worden "
"met de koeling voor dit aangepast wordt."
-#: src/libslic3r/PrintConfig.cpp:234
+#: src/libslic3r/PrintConfig.cpp:290
msgid "Bridges"
msgstr "Bruggen"
-#: src/libslic3r/PrintConfig.cpp:236
+#: src/libslic3r/PrintConfig.cpp:292
msgid "Speed for printing bridges."
msgstr "Printsnelheid voor bruggen."
-#: src/libslic3r/PrintConfig.cpp:237 src/libslic3r/PrintConfig.cpp:609
-#: src/libslic3r/PrintConfig.cpp:617 src/libslic3r/PrintConfig.cpp:626
-#: src/libslic3r/PrintConfig.cpp:634 src/libslic3r/PrintConfig.cpp:661
-#: src/libslic3r/PrintConfig.cpp:680 src/libslic3r/PrintConfig.cpp:922
-#: src/libslic3r/PrintConfig.cpp:1050 src/libslic3r/PrintConfig.cpp:1135
-#: src/libslic3r/PrintConfig.cpp:1169 src/libslic3r/PrintConfig.cpp:1181
-#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:1241
-#: src/libslic3r/PrintConfig.cpp:1300 src/libslic3r/PrintConfig.cpp:1433
-#: src/libslic3r/PrintConfig.cpp:1607 src/libslic3r/PrintConfig.cpp:1616
-#: src/libslic3r/PrintConfig.cpp:2028 src/libslic3r/PrintConfig.cpp:2154
+#: src/libslic3r/PrintConfig.cpp:293 src/libslic3r/PrintConfig.cpp:671
+#: src/libslic3r/PrintConfig.cpp:679 src/libslic3r/PrintConfig.cpp:688
+#: src/libslic3r/PrintConfig.cpp:696 src/libslic3r/PrintConfig.cpp:723
+#: src/libslic3r/PrintConfig.cpp:742 src/libslic3r/PrintConfig.cpp:1015
+#: src/libslic3r/PrintConfig.cpp:1194 src/libslic3r/PrintConfig.cpp:1267
+#: src/libslic3r/PrintConfig.cpp:1343 src/libslic3r/PrintConfig.cpp:1377
+#: src/libslic3r/PrintConfig.cpp:1389 src/libslic3r/PrintConfig.cpp:1399
+#: src/libslic3r/PrintConfig.cpp:1449 src/libslic3r/PrintConfig.cpp:1508
+#: src/libslic3r/PrintConfig.cpp:1642 src/libslic3r/PrintConfig.cpp:1820
+#: src/libslic3r/PrintConfig.cpp:1829 src/libslic3r/PrintConfig.cpp:2255
+#: src/libslic3r/PrintConfig.cpp:2382
msgid "mm/s"
msgstr "mm/s"
-#: src/libslic3r/PrintConfig.cpp:244
+#: src/libslic3r/PrintConfig.cpp:300
msgid "Brim width"
msgstr "Breedte van de brim"
-#: src/libslic3r/PrintConfig.cpp:245
+#: src/libslic3r/PrintConfig.cpp:301
msgid ""
"Horizontal width of the brim that will be printed around each object on the "
"first layer."
@@ -7364,11 +9240,11 @@ msgstr ""
"Horizontale breedte van de brim die rond elk object op de eerste laag wordt "
"geprint."
-#: src/libslic3r/PrintConfig.cpp:252
+#: src/libslic3r/PrintConfig.cpp:308
msgid "Clip multi-part objects"
msgstr "Meerdelige objecten samenvoegen"
-#: src/libslic3r/PrintConfig.cpp:253
+#: src/libslic3r/PrintConfig.cpp:309
msgid ""
"When printing multi-material objects, this settings will make Slic3r to clip "
"the overlapping object parts one by the other (2nd part will be clipped by "
@@ -7378,19 +9254,19 @@ msgstr ""
"dat PrusaSlicer de overlappende delen met de vorige in de reeks combineert "
"(2e deel wordt gecombineerd met het 1e, 3e deel met het 1e en 2e, etc)."
-#: src/libslic3r/PrintConfig.cpp:260
+#: src/libslic3r/PrintConfig.cpp:316
msgid "Colorprint height"
msgstr "Kleurenprinthoogte"
-#: src/libslic3r/PrintConfig.cpp:261
+#: src/libslic3r/PrintConfig.cpp:317
msgid "Heights at which a filament change is to occur."
msgstr "Hoogte waarbij de filamentwissel plaatsvindt."
-#: src/libslic3r/PrintConfig.cpp:271
+#: src/libslic3r/PrintConfig.cpp:327
msgid "Compatible printers condition"
-msgstr "Voorwaarden compatibele printers"
+msgstr "Voorwaarden voor geschikte printers"
-#: src/libslic3r/PrintConfig.cpp:272
+#: src/libslic3r/PrintConfig.cpp:328
msgid ""
"A boolean expression using the configuration values of an active printer "
"profile. If this expression evaluates to true, this profile is considered "
@@ -7398,13 +9274,13 @@ msgid ""
msgstr ""
"Een waar/niet waar aanduiding die gebruik maakt van configuratiewaarden van "
"een actief printerprofiel. Als deze aanduiding op waar staat, wordt dit "
-"profiel beschouwd als compatibel met het actieve printerprofiel."
+"profiel beschouwd als geschikt voor het actieve printerprofiel."
-#: src/libslic3r/PrintConfig.cpp:286
+#: src/libslic3r/PrintConfig.cpp:342
msgid "Compatible print profiles condition"
-msgstr "Voorwaarden compatibele printprofielen"
+msgstr "Voorwaarden voor geschikte printprofielen"
-#: src/libslic3r/PrintConfig.cpp:287
+#: src/libslic3r/PrintConfig.cpp:343
msgid ""
"A boolean expression using the configuration values of an active print "
"profile. If this expression evaluates to true, this profile is considered "
@@ -7412,13 +9288,13 @@ msgid ""
msgstr ""
"Een waar/niet waar aanduiding die gebruik maakt van configuratiewaarden van "
"een actief printprofiel. Als deze aanduiding op waar staat, wordt dit "
-"profiel beschouwd als compatibel met het actieve printprofiel."
+"profiel beschouwd als geschikt voor het actieve printprofiel."
-#: src/libslic3r/PrintConfig.cpp:304
+#: src/libslic3r/PrintConfig.cpp:360
msgid "Complete individual objects"
msgstr "Voltooi individuele objecten"
-#: src/libslic3r/PrintConfig.cpp:305
+#: src/libslic3r/PrintConfig.cpp:361
msgid ""
"When printing multiple objects or copies, this feature will complete each "
"object before moving onto next one (and starting it from its bottom layer). "
@@ -7428,13 +9304,13 @@ msgstr ""
"Als meerdere objecten geprint worden, zorgt deze optie dat de objecten "
"afzonderlijk voltooid worden voordat bewogen wordt naar de volgende. "
"PrusaSlicer voorkomt botsingen van de extruder tegen eerder geprinte "
-"objecten en zal u daar ook voor waarschuwen, maar blijf wel alert."
+"objecten en zal je daar ook voor waarschuwen, maar blijf wel alert."
-#: src/libslic3r/PrintConfig.cpp:313
+#: src/libslic3r/PrintConfig.cpp:369
msgid "Enable auto cooling"
msgstr "Automatisch koelen toestaan"
-#: src/libslic3r/PrintConfig.cpp:314
+#: src/libslic3r/PrintConfig.cpp:370
msgid ""
"This flag enables the automatic cooling logic that adjusts print speed and "
"fan speed according to layer printing time."
@@ -7442,24 +9318,24 @@ msgstr ""
"Dit vinkje zorgt dat automatisch gekoeld wordt; de print- en "
"ventilatorsnelheid worden aangepast op basis van de laagprinttijd."
-#: src/libslic3r/PrintConfig.cpp:319
+#: src/libslic3r/PrintConfig.cpp:375
msgid "Cooling tube position"
msgstr "Koelbuispositie"
-#: src/libslic3r/PrintConfig.cpp:320
+#: src/libslic3r/PrintConfig.cpp:376
msgid "Distance of the center-point of the cooling tube from the extruder tip."
msgstr "Afstand vanaf de nozzle tot het middelpunt van de koelbuis."
-#: src/libslic3r/PrintConfig.cpp:327
+#: src/libslic3r/PrintConfig.cpp:383
msgid "Cooling tube length"
msgstr "Koelbuislengte"
-#: src/libslic3r/PrintConfig.cpp:328
+#: src/libslic3r/PrintConfig.cpp:384
msgid "Length of the cooling tube to limit space for cooling moves inside it."
msgstr ""
"Lengte van de koelbuis om de ruimte voor koelbewegingen daarin te beperken."
-#: src/libslic3r/PrintConfig.cpp:336
+#: src/libslic3r/PrintConfig.cpp:392
msgid ""
"This is the acceleration your printer will be reset to after the role-"
"specific acceleration values are used (perimeter/infill). Set zero to "
@@ -7469,11 +9345,11 @@ msgstr ""
"acceleratiewaarde (perimeters/vulling). Als dit ingesteld is op 0, worden "
"geen acceleratiewaarden opnieuw ingesteld."
-#: src/libslic3r/PrintConfig.cpp:345
+#: src/libslic3r/PrintConfig.cpp:401
msgid "Default filament profile"
msgstr "Standaard filamentprofiel"
-#: src/libslic3r/PrintConfig.cpp:346
+#: src/libslic3r/PrintConfig.cpp:402
msgid ""
"Default filament profile associated with the current printer profile. On "
"selection of the current printer profile, this filament profile will be "
@@ -7483,12 +9359,12 @@ msgstr ""
"Bij selectie van het huidige printerprofiel wordt dit filamentprofiel "
"geactiveerd."
-#: src/libslic3r/PrintConfig.cpp:352
+#: src/libslic3r/PrintConfig.cpp:408
msgid "Default print profile"
msgstr "Standaard printprofiel"
-#: src/libslic3r/PrintConfig.cpp:353 src/libslic3r/PrintConfig.cpp:2592
-#: src/libslic3r/PrintConfig.cpp:2603
+#: src/libslic3r/PrintConfig.cpp:409 src/libslic3r/PrintConfig.cpp:2820
+#: src/libslic3r/PrintConfig.cpp:2831
msgid ""
"Default print profile associated with the current printer profile. On "
"selection of the current printer profile, this print profile will be "
@@ -7497,11 +9373,11 @@ msgstr ""
"Standaard printprofiel dat geassocieerd wordt met huidig printerprofiel. Bij "
"selectie van het huidige printerprofiel wordt dit printprofiel geactiveerd."
-#: src/libslic3r/PrintConfig.cpp:359
+#: src/libslic3r/PrintConfig.cpp:415
msgid "Disable fan for the first"
msgstr "Zet ventilator uit voor de eerste"
-#: src/libslic3r/PrintConfig.cpp:360
+#: src/libslic3r/PrintConfig.cpp:416
msgid ""
"You can set this to a positive value to disable fan at all during the first "
"layers, so that it does not make adhesion worse."
@@ -7509,26 +9385,26 @@ msgstr ""
"U kunt dit instellen op een positieve waarde om de ventilator uit te "
"schakelen tijdens het printen van de eerste lagen voor een betere adhesie."
-#: src/libslic3r/PrintConfig.cpp:369
+#: src/libslic3r/PrintConfig.cpp:425
msgid "Don't support bridges"
msgstr "Geen support voor bruggen"
-#: src/libslic3r/PrintConfig.cpp:371
+#: src/libslic3r/PrintConfig.cpp:427
msgid ""
"Experimental option for preventing support material from being generated "
"under bridged areas."
msgstr "Experimentele optie om support onder brugvlakken te vermijden."
-#: src/libslic3r/PrintConfig.cpp:377
+#: src/libslic3r/PrintConfig.cpp:433
msgid "Distance between copies"
msgstr "Ruimte tussen kopieën"
-#: src/libslic3r/PrintConfig.cpp:378
+#: src/libslic3r/PrintConfig.cpp:434
msgid "Distance used for the auto-arrange feature of the plater."
msgstr ""
-"Afstand die gebruikt wordt tussen objecten bij automatisch rangschikken."
+"Gebruikte afstand tussen objecten bij automatisch schikken in de 3D-weergave."
-#: src/libslic3r/PrintConfig.cpp:386
+#: src/libslic3r/PrintConfig.cpp:442
msgid ""
"This end procedure is inserted at the end of the output file. Note that you "
"can use placeholder variables for all PrusaSlicer settings."
@@ -7536,7 +9412,7 @@ msgstr ""
"Deze eindprocedure wordt aan het eind van het outputbestand ingevoegd. Merk "
"op dat variabelen voor alle instellingen gebruikt kunnen worden."
-#: src/libslic3r/PrintConfig.cpp:396
+#: src/libslic3r/PrintConfig.cpp:452
msgid ""
"This end procedure is inserted at the end of the output file, before the "
"printer end gcode (and before any toolchange from this filament in case of "
@@ -7549,23 +9425,23 @@ msgstr ""
"alle instellingen gebruikt kunnen worden. Als de printer meerdere extruders "
"heeft, wordt deze G-code in de extrudervolgorde uitgevoerd."
-#: src/libslic3r/PrintConfig.cpp:407
+#: src/libslic3r/PrintConfig.cpp:463
msgid "Ensure vertical shell thickness"
msgstr "Garandeer verticale shelldikte"
-#: src/libslic3r/PrintConfig.cpp:409
+#: src/libslic3r/PrintConfig.cpp:465
msgid ""
"Add solid infill near sloping surfaces to guarantee the vertical shell "
"thickness (top+bottom solid layers)."
msgstr ""
-"Voeg dichte vulling toe bij hellende vlakken om de verticale shelldikte te "
+"Voeg dichte vulling bij hellende vlakken toe om de verticale shelldikte te "
"garanderen."
-#: src/libslic3r/PrintConfig.cpp:415
+#: src/libslic3r/PrintConfig.cpp:471
msgid "Top fill pattern"
msgstr "Vulpatroon voor bovenzijde"
-#: src/libslic3r/PrintConfig.cpp:417
+#: src/libslic3r/PrintConfig.cpp:473
msgid ""
"Fill pattern for top infill. This only affects the top visible layer, and "
"not its adjacent solid shells."
@@ -7573,32 +9449,40 @@ msgstr ""
"Vullingspatroon voor bovenste lagen. Dit heeft alleen invloed op de bovenste "
"zichtbare laag en niet de aangrenzende horizontale dichte shells."
-#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:843
-#: src/libslic3r/PrintConfig.cpp:2009
+#: src/libslic3r/PrintConfig.cpp:483 src/libslic3r/PrintConfig.cpp:918
+#: src/libslic3r/PrintConfig.cpp:2236
msgid "Rectilinear"
msgstr "Rechtlijnig"
-#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:849
+#: src/libslic3r/PrintConfig.cpp:484
+msgid "Monotonic"
+msgstr "Monotoon"
+
+#: src/libslic3r/PrintConfig.cpp:485 src/libslic3r/PrintConfig.cpp:919
+msgid "Aligned Rectilinear"
+msgstr "Parallel rechtlijnig"
+
+#: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:925
msgid "Concentric"
msgstr "Concentrisch"
-#: src/libslic3r/PrintConfig.cpp:427 src/libslic3r/PrintConfig.cpp:853
+#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:929
msgid "Hilbert Curve"
msgstr "Hilbert-kromme"
-#: src/libslic3r/PrintConfig.cpp:428 src/libslic3r/PrintConfig.cpp:854
+#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:930
msgid "Archimedean Chords"
msgstr "Archimedes-spiraal"
-#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:855
+#: src/libslic3r/PrintConfig.cpp:489 src/libslic3r/PrintConfig.cpp:931
msgid "Octagram Spiral"
msgstr "Octagramspiraal"
-#: src/libslic3r/PrintConfig.cpp:435
+#: src/libslic3r/PrintConfig.cpp:495
msgid "Bottom fill pattern"
msgstr "Vulpatroon voor onderzijde"
-#: src/libslic3r/PrintConfig.cpp:437
+#: src/libslic3r/PrintConfig.cpp:497
msgid ""
"Fill pattern for bottom infill. This only affects the bottom external "
"visible layer, and not its adjacent solid shells."
@@ -7606,11 +9490,11 @@ msgstr ""
"Vulpatroon voor de bodemlaag. Dit heeft alleen invloed op de onderste "
"zichtbare laag en niet de aangrenzende horizontale dichte shells."
-#: src/libslic3r/PrintConfig.cpp:446 src/libslic3r/PrintConfig.cpp:457
+#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:517
msgid "External perimeters"
msgstr "Buitenste perimeters"
-#: src/libslic3r/PrintConfig.cpp:448
+#: src/libslic3r/PrintConfig.cpp:508
msgid ""
"Set this to a non-zero value to set a manual extrusion width for external "
"perimeters. If left zero, default extrusion width will be used if set, "
@@ -7622,16 +9506,16 @@ msgstr ""
"breedte instellen op 1,125x de nozzlediameter. Als dit is uitgedrukt als "
"percentage, wordt dit berekend over de laagdikte."
-#: src/libslic3r/PrintConfig.cpp:451 src/libslic3r/PrintConfig.cpp:560
-#: src/libslic3r/PrintConfig.cpp:882 src/libslic3r/PrintConfig.cpp:895
-#: src/libslic3r/PrintConfig.cpp:1015 src/libslic3r/PrintConfig.cpp:1041
-#: src/libslic3r/PrintConfig.cpp:1423 src/libslic3r/PrintConfig.cpp:1761
-#: src/libslic3r/PrintConfig.cpp:1883 src/libslic3r/PrintConfig.cpp:1951
-#: src/libslic3r/PrintConfig.cpp:2111
+#: src/libslic3r/PrintConfig.cpp:511 src/libslic3r/PrintConfig.cpp:621
+#: src/libslic3r/PrintConfig.cpp:962 src/libslic3r/PrintConfig.cpp:975
+#: src/libslic3r/PrintConfig.cpp:1104 src/libslic3r/PrintConfig.cpp:1159
+#: src/libslic3r/PrintConfig.cpp:1185 src/libslic3r/PrintConfig.cpp:1632
+#: src/libslic3r/PrintConfig.cpp:1961 src/libslic3r/PrintConfig.cpp:2110
+#: src/libslic3r/PrintConfig.cpp:2178 src/libslic3r/PrintConfig.cpp:2339
msgid "mm or %"
msgstr "mm of %"
-#: src/libslic3r/PrintConfig.cpp:459
+#: src/libslic3r/PrintConfig.cpp:519
msgid ""
"This separate setting will affect the speed of external perimeters (the "
"visible ones). If expressed as percentage (for example: 80%) it will be "
@@ -7642,29 +9526,29 @@ msgstr ""
"perimeters. Als dit ingesteld is op 0, wordt een automatische snelheid "
"genomen."
-#: src/libslic3r/PrintConfig.cpp:462 src/libslic3r/PrintConfig.cpp:904
-#: src/libslic3r/PrintConfig.cpp:1720 src/libslic3r/PrintConfig.cpp:1772
-#: src/libslic3r/PrintConfig.cpp:1995 src/libslic3r/PrintConfig.cpp:2124
+#: src/libslic3r/PrintConfig.cpp:522 src/libslic3r/PrintConfig.cpp:984
+#: src/libslic3r/PrintConfig.cpp:1920 src/libslic3r/PrintConfig.cpp:1972
+#: src/libslic3r/PrintConfig.cpp:2222 src/libslic3r/PrintConfig.cpp:2352
msgid "mm/s or %"
msgstr "mm/s of %"
-#: src/libslic3r/PrintConfig.cpp:469
+#: src/libslic3r/PrintConfig.cpp:529
msgid "External perimeters first"
msgstr "Buitenste perimeters eerst"
-#: src/libslic3r/PrintConfig.cpp:471
+#: src/libslic3r/PrintConfig.cpp:531
msgid ""
"Print contour perimeters from the outermost one to the innermost one instead "
"of the default inverse order."
msgstr ""
"Print de buitenste perimeters eerder dan de binnenste in plaats van andersom."
-#: src/libslic3r/PrintConfig.cpp:477
+#: src/libslic3r/PrintConfig.cpp:537
msgid "Extra perimeters if needed"
msgstr "Extra perimeters indien nodig"
-#: src/libslic3r/PrintConfig.cpp:479
-#, no-c-format
+#: src/libslic3r/PrintConfig.cpp:539
+#, c-format
msgid ""
"Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r "
"keeps adding perimeters, until more than 70% of the loop immediately above "
@@ -7674,7 +9558,7 @@ msgstr ""
"hellende wanden. PrusaSlicer blijft perimeters toevoegen tot meer dan 70% "
"van de perimeters daarboven direct is ondersteund."
-#: src/libslic3r/PrintConfig.cpp:489
+#: src/libslic3r/PrintConfig.cpp:549
msgid ""
"The extruder to use (unless more specific extruder settings are specified). "
"This value overrides perimeter and infill extruders, but not the support "
@@ -7684,7 +9568,7 @@ msgstr ""
"extruderinstellingen zijn aangegeven). Deze waarde overschrijft de "
"perimeter- en vullingsextruder, maar niet de supportextruders."
-#: src/libslic3r/PrintConfig.cpp:501
+#: src/libslic3r/PrintConfig.cpp:561
msgid ""
"Set this to the vertical distance between your nozzle tip and (usually) the "
"X carriage rods. In other words, this is the height of the clearance "
@@ -7696,7 +9580,7 @@ msgstr ""
"rond de extruder en geeft de maximale diepte weer die de extruder kan halen "
"zonder te botsen met eerder geprinte objecten."
-#: src/libslic3r/PrintConfig.cpp:512
+#: src/libslic3r/PrintConfig.cpp:572
msgid ""
"Set this to the clearance radius around your extruder. If the extruder is "
"not centered, choose the largest value for safety. This setting is used to "
@@ -7707,21 +9591,21 @@ msgstr ""
"wordt gebruikt om te controleren op botsingen en om te tonen in de 3D-"
"weergave."
-#: src/libslic3r/PrintConfig.cpp:522
+#: src/libslic3r/PrintConfig.cpp:582
msgid "Extruder Color"
msgstr "Extruderkleur"
-#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:583
+#: src/libslic3r/PrintConfig.cpp:583 src/libslic3r/PrintConfig.cpp:645
msgid "This is only used in the Slic3r interface as a visual help."
msgstr ""
"Dit wordt alleen gebruikt in de PrusaSlicer-interface als een visueel "
"hulpmiddel."
-#: src/libslic3r/PrintConfig.cpp:529
+#: src/libslic3r/PrintConfig.cpp:589
msgid "Extruder offset"
msgstr "Extruder-offset"
-#: src/libslic3r/PrintConfig.cpp:530
+#: src/libslic3r/PrintConfig.cpp:590
msgid ""
"If your firmware doesn't handle the extruder displacement you need the G-"
"code to take it into account. This option lets you specify the displacement "
@@ -7729,16 +9613,16 @@ msgid ""
"coordinates (they will be subtracted from the XY coordinate)."
msgstr ""
"Als uw firmware extrudercompensatie niet toestaat, kan daar rekening mee "
-"gehouden worden in de G-code. Met deze optie kunt u de compensatie per "
+"gehouden worden in de G-code. Met deze optie kun je de compensatie per "
"extruder specificeren op basis van de eerste extruder. Hiervoor zijn "
"positieve coördinaten nodig (die worden van de X- en Y-coördinaten "
"afgetrokken)."
-#: src/libslic3r/PrintConfig.cpp:539
+#: src/libslic3r/PrintConfig.cpp:599
msgid "Extrusion axis"
msgstr "Extrusie-as"
-#: src/libslic3r/PrintConfig.cpp:540
+#: src/libslic3r/PrintConfig.cpp:600
msgid ""
"Use this option to set the axis letter associated to your printer's extruder "
"(usually E but some printers use A)."
@@ -7746,27 +9630,27 @@ msgstr ""
"Gebruik deze optie om de naam van de as van de extruder in te stellen "
"(normaal gesproken E, maar soms A)."
-#: src/libslic3r/PrintConfig.cpp:545
+#: src/libslic3r/PrintConfig.cpp:605
msgid "Extrusion multiplier"
msgstr "Extrusie vermenigvuldigingsfactor"
-#: src/libslic3r/PrintConfig.cpp:546
+#: src/libslic3r/PrintConfig.cpp:606
msgid ""
"This factor changes the amount of flow proportionally. You may need to tweak "
"this setting to get nice surface finish and correct single wall widths. "
"Usual values are between 0.9 and 1.1. If you think you need to change this "
"more, check filament diameter and your firmware E steps."
msgstr ""
-"Deze factor verandert het debiet proportioneel. U kunt deze fijnstellen om "
+"Deze factor verandert het debiet proportioneel. Je kunt deze fijnstellen om "
"een mooi oppervlak en dunne wanden te krijgen. Waarden liggen normaal tussen "
"0.9 en 1.1. Check eventueel de filamentdiameter en de extruderstappen (uit "
-"de firmware) als u denkt dat dit aangepast moet worden."
+"de firmware) als je denkt dat dit aangepast moet worden."
-#: src/libslic3r/PrintConfig.cpp:554
+#: src/libslic3r/PrintConfig.cpp:615
msgid "Default extrusion width"
msgstr "Standaard extrusiebreedte"
-#: src/libslic3r/PrintConfig.cpp:556
+#: src/libslic3r/PrintConfig.cpp:617
msgid ""
"Set this to a non-zero value to allow a manual extrusion width. If left to "
"zero, Slic3r derives extrusion widths from the nozzle diameter (see the "
@@ -7779,11 +9663,11 @@ msgstr ""
"van de nozzlediameter. Als dit is uitgedrukt als percentage, wordt dit "
"berekend over de laagdikte."
-#: src/libslic3r/PrintConfig.cpp:566
+#: src/libslic3r/PrintConfig.cpp:628
msgid "Keep fan always on"
msgstr "Laat ventilator altijd aan"
-#: src/libslic3r/PrintConfig.cpp:567
+#: src/libslic3r/PrintConfig.cpp:629
msgid ""
"If this is enabled, fan will never be disabled and will be kept running at "
"least at its minimum speed. Useful for PLA, harmful for ABS."
@@ -7791,11 +9675,11 @@ msgstr ""
"Als dit is ingeschakeld zal de ventilator nooit uitgezet worden, maar "
"tenminste de ingestelde minimale snelheid aanhouden."
-#: src/libslic3r/PrintConfig.cpp:572
+#: src/libslic3r/PrintConfig.cpp:634
msgid "Enable fan if layer print time is below"
msgstr "Schakel de ventilator in bij een printtijd korter dan"
-#: src/libslic3r/PrintConfig.cpp:573
+#: src/libslic3r/PrintConfig.cpp:635
msgid ""
"If layer print time is estimated below this number of seconds, fan will be "
"enabled and its speed will be calculated by interpolating the minimum and "
@@ -7805,23 +9689,27 @@ msgstr ""
"ventilator aangezet worden en wordt de snelheid berekend door te "
"interpoleren tussen de minimale en maximale snelheid."
-#: src/libslic3r/PrintConfig.cpp:575 src/libslic3r/PrintConfig.cpp:1708
+#: src/libslic3r/PrintConfig.cpp:637 src/libslic3r/PrintConfig.cpp:1908
msgid "approximate seconds"
msgstr "geschat aantal seconden"
-#: src/libslic3r/PrintConfig.cpp:588
+#: src/libslic3r/PrintConfig.cpp:644
+msgid "Color"
+msgstr "Kleur"
+
+#: src/libslic3r/PrintConfig.cpp:650
msgid "Filament notes"
msgstr "Filamentopmerkingen"
-#: src/libslic3r/PrintConfig.cpp:589
+#: src/libslic3r/PrintConfig.cpp:651
msgid "You can put your notes regarding the filament here."
-msgstr "Hier kunt u opmerkingen over het filament plaatsen."
+msgstr "Hier kun je jouw opmerkingen over het filament plaatsen."
-#: src/libslic3r/PrintConfig.cpp:597 src/libslic3r/PrintConfig.cpp:1247
+#: src/libslic3r/PrintConfig.cpp:659 src/libslic3r/PrintConfig.cpp:1455
msgid "Max volumetric speed"
msgstr "Maximale volumetrische snelheid"
-#: src/libslic3r/PrintConfig.cpp:598
+#: src/libslic3r/PrintConfig.cpp:660
msgid ""
"Maximum volumetric speed allowed for this filament. Limits the maximum "
"volumetric speed of a print to the minimum of print and filament volumetric "
@@ -7832,27 +9720,27 @@ msgstr ""
"maximale volumetrische snelheid van de print en het filament. Als dit "
"ingesteld is op 0, geldt er geen limiet."
-#: src/libslic3r/PrintConfig.cpp:607
+#: src/libslic3r/PrintConfig.cpp:669
msgid "Loading speed"
msgstr "Laadsnelheid"
-#: src/libslic3r/PrintConfig.cpp:608
+#: src/libslic3r/PrintConfig.cpp:670
msgid "Speed used for loading the filament on the wipe tower."
msgstr "Snelheid die gebruikt wordt voor het afveegblok."
-#: src/libslic3r/PrintConfig.cpp:615
+#: src/libslic3r/PrintConfig.cpp:677
msgid "Loading speed at the start"
msgstr "Laadsnelheid aan het begin"
-#: src/libslic3r/PrintConfig.cpp:616
+#: src/libslic3r/PrintConfig.cpp:678
msgid "Speed used at the very beginning of loading phase."
msgstr "Snelheid die gebruikt wordt aan het begin van de laadfase."
-#: src/libslic3r/PrintConfig.cpp:623
+#: src/libslic3r/PrintConfig.cpp:685
msgid "Unloading speed"
msgstr "Ontlaadsnelheid"
-#: src/libslic3r/PrintConfig.cpp:624
+#: src/libslic3r/PrintConfig.cpp:686
msgid ""
"Speed used for unloading the filament on the wipe tower (does not affect "
"initial part of unloading just after ramming)."
@@ -7860,22 +9748,22 @@ msgstr ""
"Snelheid die gebruikt wordt voor het ontladen van het afveegblok (heeft geen "
"effect op het initiële onderdeel van het ontladen direct na de ramming)."
-#: src/libslic3r/PrintConfig.cpp:632
+#: src/libslic3r/PrintConfig.cpp:694
msgid "Unloading speed at the start"
msgstr "Ontlaadsnelheid in het begin"
-#: src/libslic3r/PrintConfig.cpp:633
+#: src/libslic3r/PrintConfig.cpp:695
msgid ""
"Speed used for unloading the tip of the filament immediately after ramming."
msgstr ""
"Snelheid die gebruikt wordt voor het ontladen van het filament direct na de "
"ramming."
-#: src/libslic3r/PrintConfig.cpp:640
+#: src/libslic3r/PrintConfig.cpp:702
msgid "Delay after unloading"
msgstr "Vertraging na het ontladen"
-#: src/libslic3r/PrintConfig.cpp:641
+#: src/libslic3r/PrintConfig.cpp:703
msgid ""
"Time to wait after the filament is unloaded. May help to get reliable "
"toolchanges with flexible materials that may need more time to shrink to "
@@ -7885,11 +9773,11 @@ msgstr ""
"toolwisselingen te krijgen met flexibele materialen die meer tijd nodig "
"hebben om te krimpen naar de originele afmetingen."
-#: src/libslic3r/PrintConfig.cpp:650
+#: src/libslic3r/PrintConfig.cpp:712
msgid "Number of cooling moves"
msgstr "Aantal koelbewegingen"
-#: src/libslic3r/PrintConfig.cpp:651
+#: src/libslic3r/PrintConfig.cpp:713
msgid ""
"Filament is cooled by being moved back and forth in the cooling tubes. "
"Specify desired number of these moves."
@@ -7897,20 +9785,20 @@ msgstr ""
"Het filament wordt gekoeld tijdens het terug en voorwaarts bewegen in de "
"koelbuis. Specificeer het benodigd aantal bewegingen."
-#: src/libslic3r/PrintConfig.cpp:659
+#: src/libslic3r/PrintConfig.cpp:721
msgid "Speed of the first cooling move"
msgstr "Snelheid voor de eerste koelbeweging"
-#: src/libslic3r/PrintConfig.cpp:660
+#: src/libslic3r/PrintConfig.cpp:722
msgid "Cooling moves are gradually accelerating beginning at this speed."
msgstr ""
"Koelbewegingen worden gelijkmatig versneld, beginnend vanaf deze snelheid."
-#: src/libslic3r/PrintConfig.cpp:667
+#: src/libslic3r/PrintConfig.cpp:729
msgid "Minimal purge on wipe tower"
msgstr "Minimale afstand op afveegblok"
-#: src/libslic3r/PrintConfig.cpp:668
+#: src/libslic3r/PrintConfig.cpp:730
msgid ""
"After a tool change, the exact position of the newly loaded filament inside "
"the nozzle may not be known, and the filament pressure is likely not yet "
@@ -7924,23 +9812,23 @@ msgstr ""
"afvegen aan het afveegblok om vervolgens de vulling of overige objecten goed "
"te kunnen printen."
-#: src/libslic3r/PrintConfig.cpp:672
+#: src/libslic3r/PrintConfig.cpp:734
msgid "mm³"
msgstr "mm³"
-#: src/libslic3r/PrintConfig.cpp:678
+#: src/libslic3r/PrintConfig.cpp:740
msgid "Speed of the last cooling move"
msgstr "Snelheid voor de laatste koelbeweging"
-#: src/libslic3r/PrintConfig.cpp:679
+#: src/libslic3r/PrintConfig.cpp:741
msgid "Cooling moves are gradually accelerating towards this speed."
msgstr "Koelbewegingen versnellen gelijkmatig tot aan deze snelheid."
-#: src/libslic3r/PrintConfig.cpp:686
+#: src/libslic3r/PrintConfig.cpp:748
msgid "Filament load time"
msgstr "Laadtijd van het filament"
-#: src/libslic3r/PrintConfig.cpp:687
+#: src/libslic3r/PrintConfig.cpp:749
msgid ""
"Time for the printer firmware (or the Multi Material Unit 2.0) to load a new "
"filament during a tool change (when executing the T code). This time is "
@@ -7950,11 +9838,11 @@ msgstr ""
"tijdens een toolwissel (tijdens het uitvoeren van de T-code). Deze tijd "
"wordt toegevoegd aan de totale printtijd in de tijdsschatting."
-#: src/libslic3r/PrintConfig.cpp:694
+#: src/libslic3r/PrintConfig.cpp:756
msgid "Ramming parameters"
msgstr "Rammingparameters"
-#: src/libslic3r/PrintConfig.cpp:695
+#: src/libslic3r/PrintConfig.cpp:757
msgid ""
"This string is edited by RammingDialog and contains ramming specific "
"parameters."
@@ -7962,11 +9850,11 @@ msgstr ""
"Deze frase is bewerkt door het Rammingdialoog en bevat parameters voor de "
"ramming."
-#: src/libslic3r/PrintConfig.cpp:701
+#: src/libslic3r/PrintConfig.cpp:763
msgid "Filament unload time"
msgstr "Ontlaadtijd voor filament"
-#: src/libslic3r/PrintConfig.cpp:702
+#: src/libslic3r/PrintConfig.cpp:764
msgid ""
"Time for the printer firmware (or the Multi Material Unit 2.0) to unload a "
"filament during a tool change (when executing the T code). This time is "
@@ -7976,7 +9864,7 @@ msgstr ""
"een toolwissel (tijdens het uitvoeren van de T-code). Deze tijd wordt "
"toegevoegd aan de totale printtijd in de tijdsschatting."
-#: src/libslic3r/PrintConfig.cpp:710
+#: src/libslic3r/PrintConfig.cpp:772
msgid ""
"Enter your filament diameter here. Good precision is required, so use a "
"caliper and do multiple measurements along the filament, then compute the "
@@ -7986,12 +9874,12 @@ msgstr ""
"daarom een schuifmaat en doe meerdere metingen over het hele filament. "
"Bereken vervolgens het gemiddelde."
-#: src/libslic3r/PrintConfig.cpp:717 src/libslic3r/PrintConfig.cpp:2503
-#: src/libslic3r/PrintConfig.cpp:2504
+#: src/libslic3r/PrintConfig.cpp:779 src/libslic3r/PrintConfig.cpp:2731
+#: src/libslic3r/PrintConfig.cpp:2732
msgid "Density"
msgstr "Dichtheid"
-#: src/libslic3r/PrintConfig.cpp:718
+#: src/libslic3r/PrintConfig.cpp:780
msgid ""
"Enter your filament density here. This is only for statistical information. "
"A decent way is to weigh a known length of filament and compute the ratio of "
@@ -8003,27 +9891,27 @@ msgstr ""
"volume[cm³]. Formule voor volume: volume[cm³] = 1000 * (diameter[mm])² * π / "
"4 * lengte[mm]. Bepaal het gewicht door te wegen en het volume door te meten."
-#: src/libslic3r/PrintConfig.cpp:721
+#: src/libslic3r/PrintConfig.cpp:783
msgid "g/cm³"
msgstr "g/cm³"
-#: src/libslic3r/PrintConfig.cpp:726
+#: src/libslic3r/PrintConfig.cpp:788
msgid "Filament type"
msgstr "Filamenttype"
-#: src/libslic3r/PrintConfig.cpp:727
+#: src/libslic3r/PrintConfig.cpp:789
msgid "The filament material type for use in custom G-codes."
msgstr "Het filamenttype voor het gebruik van de custom G-codes."
-#: src/libslic3r/PrintConfig.cpp:754
+#: src/libslic3r/PrintConfig.cpp:816
msgid "Soluble material"
msgstr "Oplosbaar materiaal"
-#: src/libslic3r/PrintConfig.cpp:755
+#: src/libslic3r/PrintConfig.cpp:817
msgid "Soluble material is most likely used for a soluble support."
msgstr "Oplosbaar materiaal wordt vaak gebruikt voor oplosbaar support."
-#: src/libslic3r/PrintConfig.cpp:761
+#: src/libslic3r/PrintConfig.cpp:823
msgid ""
"Enter your filament cost per kg here. This is only for statistical "
"information."
@@ -8031,19 +9919,39 @@ msgstr ""
"Voer hier de filamentkosten per kilogram in. Dit is alleen voor statistische "
"informatie."
-#: src/libslic3r/PrintConfig.cpp:762
+#: src/libslic3r/PrintConfig.cpp:824
msgid "money/kg"
msgstr "€/kg"
-#: src/libslic3r/PrintConfig.cpp:771 src/libslic3r/PrintConfig.cpp:2587
+#: src/libslic3r/PrintConfig.cpp:829
+msgid "Spool weight"
+msgstr "Spoelgewicht"
+
+#: src/libslic3r/PrintConfig.cpp:830
+msgid ""
+"Enter weight of the empty filament spool. One may weigh a partially consumed "
+"filament spool before printing and one may compare the measured weight with "
+"the calculated weight of the filament with the spool to find out whether the "
+"amount of filament on the spool is sufficient to finish the print."
+msgstr ""
+"Voer het gewicht van een lege filamentspoel in. Je kunt een halfvolle "
+"filamentspoel wegen voor het printen en gemeten gewicht vergelijken met het "
+"berekende gewicht van de filamentspoel om te weten te komen of de "
+"hoeveelheid filament op de spoel voldoende is om de print te voltooien."
+
+#: src/libslic3r/PrintConfig.cpp:834
+msgid "g"
+msgstr "g"
+
+#: src/libslic3r/PrintConfig.cpp:843 src/libslic3r/PrintConfig.cpp:2815
msgid "(Unknown)"
msgstr "(Onbekend)"
-#: src/libslic3r/PrintConfig.cpp:775
+#: src/libslic3r/PrintConfig.cpp:847
msgid "Fill angle"
msgstr "Vullingshoek"
-#: src/libslic3r/PrintConfig.cpp:777
+#: src/libslic3r/PrintConfig.cpp:849
msgid ""
"Default base angle for infill orientation. Cross-hatching will be applied to "
"this. Bridges will be infilled using the best direction Slic3r can detect, "
@@ -8053,61 +9961,69 @@ msgstr ""
"geprint. Bruggen worden geprint met de optimale richting. Deze instelling "
"zal die richting niet beïnvloeden."
-#: src/libslic3r/PrintConfig.cpp:789
+#: src/libslic3r/PrintConfig.cpp:861
msgid "Fill density"
msgstr "Vullingsdichtheid"
-#: src/libslic3r/PrintConfig.cpp:791
+#: src/libslic3r/PrintConfig.cpp:863
msgid "Density of internal infill, expressed in the range 0% - 100%."
msgstr ""
"Dichtheid van inwendige vulling, uitgedrukt in een percentage (0 - 100%)"
-#: src/libslic3r/PrintConfig.cpp:826
+#: src/libslic3r/PrintConfig.cpp:898
msgid "Fill pattern"
msgstr "Vullingspatroon"
-#: src/libslic3r/PrintConfig.cpp:828
+#: src/libslic3r/PrintConfig.cpp:900
msgid "Fill pattern for general low-density infill."
msgstr "Vulpatroon voor algemene lagere-dichtheidsvulling."
-#: src/libslic3r/PrintConfig.cpp:844
+#: src/libslic3r/PrintConfig.cpp:920
msgid "Grid"
msgstr "Raster"
-#: src/libslic3r/PrintConfig.cpp:845
+#: src/libslic3r/PrintConfig.cpp:921
msgid "Triangles"
msgstr "Driehoeken"
-#: src/libslic3r/PrintConfig.cpp:846
+#: src/libslic3r/PrintConfig.cpp:922
msgid "Stars"
msgstr "Sterren"
-#: src/libslic3r/PrintConfig.cpp:847
+#: src/libslic3r/PrintConfig.cpp:923
msgid "Cubic"
msgstr "Kubisch"
-#: src/libslic3r/PrintConfig.cpp:848
+#: src/libslic3r/PrintConfig.cpp:924
msgid "Line"
-msgstr "Lijnen"
+msgstr "Lijn"
-#: src/libslic3r/PrintConfig.cpp:850 src/libslic3r/PrintConfig.cpp:2011
+#: src/libslic3r/PrintConfig.cpp:926 src/libslic3r/PrintConfig.cpp:2238
msgid "Honeycomb"
msgstr "Honingraat"
-#: src/libslic3r/PrintConfig.cpp:851
+#: src/libslic3r/PrintConfig.cpp:927
msgid "3D Honeycomb"
msgstr "3D-honingraat"
-#: src/libslic3r/PrintConfig.cpp:852
+#: src/libslic3r/PrintConfig.cpp:928
msgid "Gyroid"
msgstr "Gyroïde"
-#: src/libslic3r/PrintConfig.cpp:859 src/libslic3r/PrintConfig.cpp:868
-#: src/libslic3r/PrintConfig.cpp:876 src/libslic3r/PrintConfig.cpp:910
+#: src/libslic3r/PrintConfig.cpp:932
+msgid "Adaptive Cubic"
+msgstr "Adaptief kubisch"
+
+#: src/libslic3r/PrintConfig.cpp:933
+msgid "Support Cubic"
+msgstr "Ondersteunend kubisch"
+
+#: src/libslic3r/PrintConfig.cpp:937 src/libslic3r/PrintConfig.cpp:946
+#: src/libslic3r/PrintConfig.cpp:956 src/libslic3r/PrintConfig.cpp:990
msgid "First layer"
msgstr "Eerste laag"
-#: src/libslic3r/PrintConfig.cpp:860
+#: src/libslic3r/PrintConfig.cpp:938
msgid ""
"This is the acceleration your printer will use for first layer. Set zero to "
"disable acceleration control for first layer."
@@ -8115,15 +10031,19 @@ msgstr ""
"Deze acceleratie zal uw printer gebruiken voor de eerste laag. Als dit "
"ingesteld is op 0, wordt de standaard acceleratie gebruikt."
-#: src/libslic3r/PrintConfig.cpp:869
+#: src/libslic3r/PrintConfig.cpp:947
+msgid "First layer bed temperature"
+msgstr "Bedtemperatuur eerste laag"
+
+#: src/libslic3r/PrintConfig.cpp:948
msgid ""
"Heated build plate temperature for the first layer. Set this to zero to "
"disable bed temperature control commands in the output."
msgstr ""
-"Temperatuur van het verwarmd bed voor de eerste laag. Als dit ingesteld is "
-"op 0, worden bedtemperatuur-commando's weggelaten in de output."
+"Bedtemperatuur voor de eerste laag. Als dit ingesteld is op 0, worden "
+"bedtemperatuurregeling weggelaten in de output."
-#: src/libslic3r/PrintConfig.cpp:878
+#: src/libslic3r/PrintConfig.cpp:958
msgid ""
"Set this to a non-zero value to set a manual extrusion width for first "
"layer. You can use this to force fatter extrudates for better adhesion. If "
@@ -8136,7 +10056,7 @@ msgstr ""
"wordt dit berekend over de laagdikte van de eerste laag. Als dit is "
"ingesteld op 0, wordt de standaard extrusiebreedte gebruikt."
-#: src/libslic3r/PrintConfig.cpp:891
+#: src/libslic3r/PrintConfig.cpp:971
msgid ""
"When printing with very low layer heights, you might still want to print a "
"thicker bottom layer to improve adhesion and tolerance for non perfect build "
@@ -8148,11 +10068,11 @@ msgstr ""
"imperfecte printplatformen. Dit kan uitgedrukt worden als een absolute "
"waarde of als percentage (bijvoorbeeld 150%) over de standaard laagdikte."
-#: src/libslic3r/PrintConfig.cpp:900
+#: src/libslic3r/PrintConfig.cpp:980
msgid "First layer speed"
msgstr "Snelheid eerste laag"
-#: src/libslic3r/PrintConfig.cpp:901
+#: src/libslic3r/PrintConfig.cpp:981
msgid ""
"If expressed as absolute value in mm/s, this speed will be applied to all "
"the print moves of the first layer, regardless of their type. If expressed "
@@ -8163,16 +10083,39 @@ msgstr ""
"van het type. Als dit is uitgedrukt als percentage, wordt dit berekend over "
"de standaardsnelheid."
-#: src/libslic3r/PrintConfig.cpp:911
+#: src/libslic3r/PrintConfig.cpp:991
+msgid "First layer nozzle temperature"
+msgstr "Nozzletemperatuur eerste laag"
+
+#: src/libslic3r/PrintConfig.cpp:992
msgid ""
-"Extruder temperature for first layer. If you want to control temperature "
+"Nozzle temperature for the first layer. If you want to control temperature "
"manually during print, set this to zero to disable temperature control "
-"commands in the output file."
+"commands in the output G-code."
msgstr ""
-"Printtemperatuur voor de eerste laag. Als dit ingesteld is op 0, worden "
-"extrudertemperatuur-commando's weggelaten in de output."
+"Nozzletemperatuur voor de eerste laag. Als je handmatig de temperatuur wilt "
+"wijzigen in de print, stel dit dan in op 0 om temperatuurregeling uit te "
+"zetten in de G-code."
-#: src/libslic3r/PrintConfig.cpp:920
+#: src/libslic3r/PrintConfig.cpp:1000
+msgid "Full fan speed at layer"
+msgstr "Volledige ventilatorsnelheid op laag"
+
+#: src/libslic3r/PrintConfig.cpp:1001
+msgid ""
+"Fan speed will be ramped up linearly from zero at layer "
+"\"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". "
+"\"full_fan_speed_layer\" will be ignored if lower than "
+"\"disable_fan_first_layers\", in which case the fan will be running at "
+"maximum allowed speed at layer \"disable_fan_first_layers\" + 1."
+msgstr ""
+"Ventilatorsnelheid wordt geleidelijk opgevoerd van 0 op laag "
+"\"disable_fan_first_layers\" naar het maximum op laag \"full_fan_speed_layer"
+"\". \"full_fan_speed_layer\" wordt genegeerd als dit lager is dan "
+"\"disable_fan_first_layers\", in geval de ventilator draait op de maximaal "
+"toegestane snelheid op laag \"disable_fan_first_layers\" + 1."
+
+#: src/libslic3r/PrintConfig.cpp:1013
msgid ""
"Speed for filling small gaps using short zigzag moves. Keep this reasonably "
"low to avoid too much shaking and resonance issues. Set zero to disable gaps "
@@ -8182,44 +10125,44 @@ msgstr ""
"Houd dit laag om schudden te voorkomen (wat resulteert in "
"resonantieproblemen). Als dit is ingesteld op 0, worden gaten niet gevuld."
-#: src/libslic3r/PrintConfig.cpp:928
+#: src/libslic3r/PrintConfig.cpp:1021
msgid "Verbose G-code"
msgstr "Opmerkingen in G-code"
-#: src/libslic3r/PrintConfig.cpp:929
+#: src/libslic3r/PrintConfig.cpp:1022
msgid ""
"Enable this to get a commented G-code file, with each line explained by a "
"descriptive text. If you print from SD card, the additional weight of the "
"file could make your firmware slow down."
msgstr ""
"Sta dit toe om een G-code met opmerkingen te genereren. Bij elke lijn wordt "
-"een opmerking geplaatst. Als u print vanaf een SD-kaart, kan de extra "
+"een opmerking geplaatst. Als je print vanaf een SD-kaart, kan de extra "
"grootte van het bestand de firmware vertragen."
-#: src/libslic3r/PrintConfig.cpp:936
+#: src/libslic3r/PrintConfig.cpp:1029
msgid "G-code flavor"
msgstr "G-code-variant"
-#: src/libslic3r/PrintConfig.cpp:937
+#: src/libslic3r/PrintConfig.cpp:1030
msgid ""
"Some G/M-code commands, including temperature control and others, are not "
"universal. Set this option to your printer's firmware to get a compatible "
"output. The \"No extrusion\" flavor prevents PrusaSlicer from exporting any "
"extrusion value at all."
msgstr ""
-"Sommige G- en M-commando's zijn niet universeel. Stel deze optie in om een "
-"compatibele uitvoer te krijgen voor uw printer. De 'Geen extrusie'-"
-"instelling kan gebruikt worden om te printen zonder materiaal te extruderen."
+"Sommige G- en M-codes zijn niet universeel. Stel deze optie in om een "
+"geschikte uitvoer te krijgen voor uw printer. De 'geen extrusie'-instelling "
+"kan gebruikt worden om te printen zonder materiaal te extruderen."
-#: src/libslic3r/PrintConfig.cpp:960
+#: src/libslic3r/PrintConfig.cpp:1055
msgid "No extrusion"
msgstr "Geen extrusie"
-#: src/libslic3r/PrintConfig.cpp:965
+#: src/libslic3r/PrintConfig.cpp:1060
msgid "Label objects"
msgstr "Label objecten"
-#: src/libslic3r/PrintConfig.cpp:966
+#: src/libslic3r/PrintConfig.cpp:1061
msgid ""
"Enable this to add comments into the G-Code labeling print moves with what "
"object they belong to, which is useful for the Octoprint CancelObject "
@@ -8228,14 +10171,14 @@ msgid ""
msgstr ""
"Schakel dit in om opmerkingen in de G-code toe te voegen voor bewegingen die "
"behoren tot een object. Dit is handig voor de OctoPrint CancelObject-plugin. "
-"Deze instelling is NIET compatibel met een multi-materialsetup met één "
+"Deze instelling is NIET geschikt voor een multi-materialsetup met één "
"extruder en 'Afvegen in object' en 'Afvegen in vulling'."
-#: src/libslic3r/PrintConfig.cpp:973
+#: src/libslic3r/PrintConfig.cpp:1068
msgid "High extruder current on filament swap"
msgstr "Hoge stroomsterkte bij extruder voor filamentwissel"
-#: src/libslic3r/PrintConfig.cpp:974
+#: src/libslic3r/PrintConfig.cpp:1069
msgid ""
"It may be beneficial to increase the extruder motor current during the "
"filament exchange sequence to allow for rapid ramming feed rates and to "
@@ -8246,7 +10189,7 @@ msgstr ""
"maken en om weerstand te overwinnen tijdens het laden van filament met een "
"misvormde kop."
-#: src/libslic3r/PrintConfig.cpp:982
+#: src/libslic3r/PrintConfig.cpp:1077
msgid ""
"This is the acceleration your printer will use for infill. Set zero to "
"disable acceleration control for infill."
@@ -8254,11 +10197,11 @@ msgstr ""
"Deze acceleratie zal uw printer gebruiken voor de vulling. Als dit is "
"ingesteld op 0, wordt de acceleratiecontrole uitgeschakeld."
-#: src/libslic3r/PrintConfig.cpp:990
+#: src/libslic3r/PrintConfig.cpp:1085
msgid "Combine infill every"
msgstr "Combineer vulling elke"
-#: src/libslic3r/PrintConfig.cpp:992
+#: src/libslic3r/PrintConfig.cpp:1087
msgid ""
"This feature allows to combine infill and speed up your print by extruding "
"thicker infill layers while preserving thin perimeters, thus accuracy."
@@ -8267,19 +10210,82 @@ msgstr ""
"de vullingslagen stapsgewijs dikker te maken, terwijl de laagdikte van "
"perimeters behouden wordt."
-#: src/libslic3r/PrintConfig.cpp:995
+#: src/libslic3r/PrintConfig.cpp:1090
msgid "Combine infill every n layers"
msgstr "Combineer vulling elke n lagen"
-#: src/libslic3r/PrintConfig.cpp:1001
+#: src/libslic3r/PrintConfig.cpp:1096
+msgid "Length of the infill anchor"
+msgstr "Lengte van de vullingsbevestiging"
+
+#: src/libslic3r/PrintConfig.cpp:1098
+msgid ""
+"Connect an infill line to an internal perimeter with a short segment of an "
+"additional perimeter. If expressed as percentage (example: 15%) it is "
+"calculated over infill extrusion width. PrusaSlicer tries to connect two "
+"close infill lines to a short perimeter segment. If no such perimeter "
+"segment shorter than infill_anchor_max is found, the infill line is "
+"connected to a perimeter segment at just one side and the length of the "
+"perimeter segment taken is limited to this parameter, but no longer than "
+"anchor_length_max. Set this parameter to zero to disable anchoring "
+"perimeters connected to a single infill line."
+msgstr ""
+"Verbind een vullingslijn met een interne perimeter met een kort segment van "
+"een extra perimeter. Als dit wordt uitgedrukt als percentage (bijvoorbeeld: "
+"15%), wordt dit genomen over de extrusiebreedte van de vulling. PrusaSlicer "
+"probeert twee korte vullingslijnen te verbinden met een kort "
+"perimetersegment. Als zo een perimetersegment niet korter is dan deze "
+"parameter, dan wordt de vullingslijn aan slechts één zijde verbonden met een "
+"perimetersegment en de lengte van het perimetersegment wordt gelimiteerd tot "
+"deze parameter, maar niet langer dan \"anchor_length_max\". Stel in op 0 om "
+"uit te zetten."
+
+#: src/libslic3r/PrintConfig.cpp:1113
+msgid "0 (no open anchors)"
+msgstr "0 (geen losse bevestiging)"
+
+#: src/libslic3r/PrintConfig.cpp:1118 src/libslic3r/PrintConfig.cpp:1140
+msgid "1000 (unlimited)"
+msgstr "1000 (oneindig)"
+
+#: src/libslic3r/PrintConfig.cpp:1123
+msgid "Maximum length of the infill anchor"
+msgstr "Maximale lengte van de vullingsbevestiging"
+
+#: src/libslic3r/PrintConfig.cpp:1125
+msgid ""
+"Connect an infill line to an internal perimeter with a short segment of an "
+"additional perimeter. If expressed as percentage (example: 15%) it is "
+"calculated over infill extrusion width. PrusaSlicer tries to connect two "
+"close infill lines to a short perimeter segment. If no such perimeter "
+"segment shorter than this parameter is found, the infill line is connected "
+"to a perimeter segment at just one side and the length of the perimeter "
+"segment taken is limited to infill_anchor, but no longer than this "
+"parameter. Set this parameter to zero to disable anchoring."
+msgstr ""
+"Verbind een vullingslijn met een interne perimeter met een kort segment van "
+"een extra perimeter. Als dit wordt uitgedrukt als percentage (bijvoorbeeld: "
+"15%), wordt dit genomen over de extrusiebreedte van de vulling. PrusaSlicer "
+"probeert twee korte vullingslijnen te verbinden met een kort "
+"perimetersegment. Als zo een perimetersegment niet korter is dan "
+"\"infill_anchor_max\"-instelling, dan wordt de vullingslijn aan slechts één "
+"zijde verbonden met een perimetersegment en de lengte van het "
+"perimetersegment wordt gelimiteerd tot \"infill_anchor\", maar niet langer "
+"dan deze parameter. Stel in op 0 om uit te zetten."
+
+#: src/libslic3r/PrintConfig.cpp:1135
+msgid "0 (not anchored)"
+msgstr "0 (niet bevestigd)"
+
+#: src/libslic3r/PrintConfig.cpp:1145
msgid "Infill extruder"
msgstr "Vullingsextruder"
-#: src/libslic3r/PrintConfig.cpp:1003
+#: src/libslic3r/PrintConfig.cpp:1147
msgid "The extruder to use when printing infill."
msgstr "De extruder die gebruikt wordt voor het printen van de vulling."
-#: src/libslic3r/PrintConfig.cpp:1011
+#: src/libslic3r/PrintConfig.cpp:1155
msgid ""
"Set this to a non-zero value to set a manual extrusion width for infill. If "
"left zero, default extrusion width will be used if set, otherwise 1.125 x "
@@ -8289,15 +10295,15 @@ msgid ""
msgstr ""
"Stel dit in op een niet-nulwaarde om handmatige extrusiebreedte in te "
"stellen. Als die op 0 blijft staan, zal PrusaSlicer de breedte instellen op "
-"1,125x de nozzlediameter. Mogelijk wilt u de vulling wat sneller laten "
+"1,125x de nozzlediameter. Mogelijk wil je de vulling wat sneller laten "
"printen en het onderdeel sterker maken met deze optie. Als dit is uitgedrukt "
"als percentage, wordt dit berekend over de laagdikte."
-#: src/libslic3r/PrintConfig.cpp:1021
+#: src/libslic3r/PrintConfig.cpp:1165
msgid "Infill before perimeters"
msgstr "Vulling vóór perimeters"
-#: src/libslic3r/PrintConfig.cpp:1022
+#: src/libslic3r/PrintConfig.cpp:1166
msgid ""
"This option will switch the print order of perimeters and infill, making the "
"latter first."
@@ -8305,11 +10311,11 @@ msgstr ""
"Deze optie verandert de printvolgorde van perimeters en vulling; de "
"laatstgenoemde eerst."
-#: src/libslic3r/PrintConfig.cpp:1027
+#: src/libslic3r/PrintConfig.cpp:1171
msgid "Only infill where needed"
msgstr "Alleen vulling waar nodig"
-#: src/libslic3r/PrintConfig.cpp:1029
+#: src/libslic3r/PrintConfig.cpp:1173
msgid ""
"This option will limit infill to the areas actually needed for supporting "
"ceilings (it will act as internal support material). If enabled, slows down "
@@ -8319,11 +10325,11 @@ msgstr ""
"ondersteuning van bovenvlakken (het fungeert als inwendig support). Let op: "
"deze optie vertraagt de G-code-generatie."
-#: src/libslic3r/PrintConfig.cpp:1036
+#: src/libslic3r/PrintConfig.cpp:1180
msgid "Infill/perimeters overlap"
msgstr "Overlapping van vulling/perimeters"
-#: src/libslic3r/PrintConfig.cpp:1038
+#: src/libslic3r/PrintConfig.cpp:1182
msgid ""
"This setting applies an additional overlap between infill and perimeters for "
"better bonding. Theoretically this shouldn't be needed, but backlash might "
@@ -8335,25 +10341,25 @@ msgstr ""
"maar terugslag kan zorgen voor gaten. Als dit is uitgedrukt als percentage, "
"wordt dit berekend over de extrusiebreedte van de perimeters."
-#: src/libslic3r/PrintConfig.cpp:1049
+#: src/libslic3r/PrintConfig.cpp:1193
msgid "Speed for printing the internal fill. Set to zero for auto."
msgstr ""
"Printsnelheid voor vulling. Als dit ingesteld is op 0, wordt de snelheid "
"automatisch berekend."
-#: src/libslic3r/PrintConfig.cpp:1057
+#: src/libslic3r/PrintConfig.cpp:1201
msgid "Inherits profile"
msgstr "Afgeleid profiel"
-#: src/libslic3r/PrintConfig.cpp:1058
+#: src/libslic3r/PrintConfig.cpp:1202
msgid "Name of the profile, from which this profile inherits."
msgstr "Profielnaam waar profiel op is gebaseerd."
-#: src/libslic3r/PrintConfig.cpp:1071
+#: src/libslic3r/PrintConfig.cpp:1215
msgid "Interface shells"
msgstr "Interfaceshells"
-#: src/libslic3r/PrintConfig.cpp:1072
+#: src/libslic3r/PrintConfig.cpp:1216
msgid ""
"Force the generation of solid shells between adjacent materials/volumes. "
"Useful for multi-extruder prints with translucent materials or manual "
@@ -8363,7 +10369,52 @@ msgstr ""
"volumes. Dit is handig voor multi-extruderprints met transparante materialen "
"of handmatig oplosbaar support."
-#: src/libslic3r/PrintConfig.cpp:1081
+#: src/libslic3r/PrintConfig.cpp:1224
+msgid "Enable ironing"
+msgstr "Sta strijken toe"
+
+#: src/libslic3r/PrintConfig.cpp:1225
+msgid ""
+"Enable ironing of the top layers with the hot print head for smooth surface"
+msgstr ""
+"Sta strijken van de toplagen toe met het hete hotend voor een gladder "
+"oppervlak"
+
+#: src/libslic3r/PrintConfig.cpp:1231 src/libslic3r/PrintConfig.cpp:1233
+msgid "Ironing Type"
+msgstr "Strijktype"
+
+#: src/libslic3r/PrintConfig.cpp:1238
+msgid "All top surfaces"
+msgstr "Alle bovenvlakken"
+
+#: src/libslic3r/PrintConfig.cpp:1239
+msgid "Topmost surface only"
+msgstr "Alleen bovenste vlak"
+
+#: src/libslic3r/PrintConfig.cpp:1240
+msgid "All solid surfaces"
+msgstr "Alle dichte vlakken"
+
+#: src/libslic3r/PrintConfig.cpp:1245
+msgid "Flow rate"
+msgstr "Debiet"
+
+#: src/libslic3r/PrintConfig.cpp:1247
+msgid "Percent of a flow rate relative to object's normal layer height."
+msgstr ""
+"Percentage van het debiet, relatief ten opzichte van de standaard laagdikte "
+"van het model."
+
+#: src/libslic3r/PrintConfig.cpp:1255
+msgid "Spacing between ironing passes"
+msgstr "Ruimte tussen strijkpassages"
+
+#: src/libslic3r/PrintConfig.cpp:1257
+msgid "Distance between ironing lines"
+msgstr "Afstand tussen strijkpaden"
+
+#: src/libslic3r/PrintConfig.cpp:1274
msgid ""
"This custom code is inserted at every layer change, right after the Z move "
"and before the extruder moves to the first layer point. Note that you can "
@@ -8371,14 +10422,14 @@ msgid ""
"[layer_z]."
msgstr ""
"Deze custom code wordt ingevoegd bij elke laagwisseling, direct na de Z-"
-"beweging en voor de extruder naar het volgende punt beweegt. Hier kunt u "
+"beweging en voor de extruder naar het volgende punt beweegt. Hier kun je "
"variabelen gebruiken voor alle instellingen zoals 'layer_num' en 'layer_z'."
-#: src/libslic3r/PrintConfig.cpp:1092
+#: src/libslic3r/PrintConfig.cpp:1285
msgid "Supports remaining times"
msgstr "Ondersteunt resterende tijd"
-#: src/libslic3r/PrintConfig.cpp:1093
+#: src/libslic3r/PrintConfig.cpp:1286
msgid ""
"Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute "
"intervals into the G-code to let the firmware show accurate remaining time. "
@@ -8387,155 +10438,179 @@ msgid ""
msgstr ""
"Zet M73 P[geprint percentage] R[resterende tijd in minuten] na elke minuut "
"in de G-code om de firmware de exacte resterende tijd te laten weten. Vanaf "
-"nu herkent de Prusa i3 MK3 de M73-commando's. Ook ondersteunt de i3 MK3 "
-"firmware M73 Qxx Sxx voor de stille modus."
+"nu herkent de Prusa i3 MK3 de M73-codes. Ook ondersteunt de i3 MK3 firmware "
+"M73 Qxx Sxx voor de stille modus."
-#: src/libslic3r/PrintConfig.cpp:1101
+#: src/libslic3r/PrintConfig.cpp:1294
msgid "Supports stealth mode"
msgstr "Ondersteunt stille modus"
-#: src/libslic3r/PrintConfig.cpp:1102
+#: src/libslic3r/PrintConfig.cpp:1295
msgid "The firmware supports stealth mode"
msgstr "De firmware ondersteunt stille modus"
-#: src/libslic3r/PrintConfig.cpp:1125
+#: src/libslic3r/PrintConfig.cpp:1300
+msgid "How to apply limits"
+msgstr "Hoe limieten toe te voegen"
+
+#: src/libslic3r/PrintConfig.cpp:1301
+msgid "Purpose of Machine Limits"
+msgstr "Doel van de machinelimieten"
+
+#: src/libslic3r/PrintConfig.cpp:1303
+msgid "How to apply the Machine Limits"
+msgstr "Hoe machinelimieten toe te voegen"
+
+#: src/libslic3r/PrintConfig.cpp:1308
+msgid "Emit to G-code"
+msgstr "Opnemen in de G-code"
+
+#: src/libslic3r/PrintConfig.cpp:1309
+msgid "Use for time estimate"
+msgstr "Gebruik om tijd te schatten"
+
+#: src/libslic3r/PrintConfig.cpp:1310
+msgid "Ignore"
+msgstr "Negeer"
+
+#: src/libslic3r/PrintConfig.cpp:1333
msgid "Maximum feedrate X"
msgstr "Maximale voedingssnelheid van de X-as"
-#: src/libslic3r/PrintConfig.cpp:1126
+#: src/libslic3r/PrintConfig.cpp:1334
msgid "Maximum feedrate Y"
msgstr "Maximale voedingssnelheid van de Y-as"
-#: src/libslic3r/PrintConfig.cpp:1127
+#: src/libslic3r/PrintConfig.cpp:1335
msgid "Maximum feedrate Z"
msgstr "Maximale voedingssnelheid van de Z-as"
-#: src/libslic3r/PrintConfig.cpp:1128
+#: src/libslic3r/PrintConfig.cpp:1336
msgid "Maximum feedrate E"
msgstr "Maximale extrusievoedingssnelheid"
-#: src/libslic3r/PrintConfig.cpp:1131
+#: src/libslic3r/PrintConfig.cpp:1339
msgid "Maximum feedrate of the X axis"
msgstr "Maximale voedingssnelheid van de X-as"
-#: src/libslic3r/PrintConfig.cpp:1132
+#: src/libslic3r/PrintConfig.cpp:1340
msgid "Maximum feedrate of the Y axis"
msgstr "Maximale voedingssnelheid van de Y-as"
-#: src/libslic3r/PrintConfig.cpp:1133
+#: src/libslic3r/PrintConfig.cpp:1341
msgid "Maximum feedrate of the Z axis"
msgstr "Maximale voedingssnelheid van de Z-as"
-#: src/libslic3r/PrintConfig.cpp:1134
+#: src/libslic3r/PrintConfig.cpp:1342
msgid "Maximum feedrate of the E axis"
msgstr "Maximale extrusievoedingssnelheid"
-#: src/libslic3r/PrintConfig.cpp:1142
+#: src/libslic3r/PrintConfig.cpp:1350
msgid "Maximum acceleration X"
msgstr "Maximale acceleratie X"
-#: src/libslic3r/PrintConfig.cpp:1143
+#: src/libslic3r/PrintConfig.cpp:1351
msgid "Maximum acceleration Y"
msgstr "Maximale acceleratie Y"
-#: src/libslic3r/PrintConfig.cpp:1144
+#: src/libslic3r/PrintConfig.cpp:1352
msgid "Maximum acceleration Z"
msgstr "Maximale acceleratie Z"
-#: src/libslic3r/PrintConfig.cpp:1145
+#: src/libslic3r/PrintConfig.cpp:1353
msgid "Maximum acceleration E"
msgstr "Maximale acceleratie E"
-#: src/libslic3r/PrintConfig.cpp:1148
+#: src/libslic3r/PrintConfig.cpp:1356
msgid "Maximum acceleration of the X axis"
msgstr "Maximale acceleratie van de X-as"
-#: src/libslic3r/PrintConfig.cpp:1149
+#: src/libslic3r/PrintConfig.cpp:1357
msgid "Maximum acceleration of the Y axis"
msgstr "Maximale acceleratie van de Y-as"
-#: src/libslic3r/PrintConfig.cpp:1150
+#: src/libslic3r/PrintConfig.cpp:1358
msgid "Maximum acceleration of the Z axis"
msgstr "Maximale acceleratie van de Z-as"
-#: src/libslic3r/PrintConfig.cpp:1151
+#: src/libslic3r/PrintConfig.cpp:1359
msgid "Maximum acceleration of the E axis"
msgstr "Maximale extrusie-acceleratie"
-#: src/libslic3r/PrintConfig.cpp:1159
+#: src/libslic3r/PrintConfig.cpp:1367
msgid "Maximum jerk X"
msgstr "Maximale ruk X"
-#: src/libslic3r/PrintConfig.cpp:1160
+#: src/libslic3r/PrintConfig.cpp:1368
msgid "Maximum jerk Y"
msgstr "Maximale ruk Y"
-#: src/libslic3r/PrintConfig.cpp:1161
+#: src/libslic3r/PrintConfig.cpp:1369
msgid "Maximum jerk Z"
msgstr "Maximale ruk Z"
-#: src/libslic3r/PrintConfig.cpp:1162
+#: src/libslic3r/PrintConfig.cpp:1370
msgid "Maximum jerk E"
msgstr "Maximale ruk E"
-#: src/libslic3r/PrintConfig.cpp:1165
+#: src/libslic3r/PrintConfig.cpp:1373
msgid "Maximum jerk of the X axis"
msgstr "Maximale ruk van de X-as"
-#: src/libslic3r/PrintConfig.cpp:1166
+#: src/libslic3r/PrintConfig.cpp:1374
msgid "Maximum jerk of the Y axis"
msgstr "Maximale ruk van de Y-as"
-#: src/libslic3r/PrintConfig.cpp:1167
+#: src/libslic3r/PrintConfig.cpp:1375
msgid "Maximum jerk of the Z axis"
msgstr "Maximale ruk van de Z-as"
-#: src/libslic3r/PrintConfig.cpp:1168
+#: src/libslic3r/PrintConfig.cpp:1376
msgid "Maximum jerk of the E axis"
msgstr "Maximale extrusie-ruk"
-#: src/libslic3r/PrintConfig.cpp:1178
+#: src/libslic3r/PrintConfig.cpp:1386
msgid "Minimum feedrate when extruding"
msgstr "Minimale voedingssnelheid tijdens extruderen"
-#: src/libslic3r/PrintConfig.cpp:1180
+#: src/libslic3r/PrintConfig.cpp:1388
msgid "Minimum feedrate when extruding (M205 S)"
msgstr "Minimale voedingssnelheid tijdens extruderen (M205 S)"
-#: src/libslic3r/PrintConfig.cpp:1188
+#: src/libslic3r/PrintConfig.cpp:1396
msgid "Minimum travel feedrate"
msgstr "Minimale voedingssnelheid voor bewegingen"
-#: src/libslic3r/PrintConfig.cpp:1190
+#: src/libslic3r/PrintConfig.cpp:1398
msgid "Minimum travel feedrate (M205 T)"
msgstr "Minimale voedingssnelheid voor bewegingen (M205 T)"
-#: src/libslic3r/PrintConfig.cpp:1198
+#: src/libslic3r/PrintConfig.cpp:1406
msgid "Maximum acceleration when extruding"
msgstr "Maximale acceleratie tijdens extruderen"
-#: src/libslic3r/PrintConfig.cpp:1200
+#: src/libslic3r/PrintConfig.cpp:1408
msgid "Maximum acceleration when extruding (M204 S)"
msgstr "Maximale acceleratie tijdens extruderen (M204 S)"
-#: src/libslic3r/PrintConfig.cpp:1208
+#: src/libslic3r/PrintConfig.cpp:1416
msgid "Maximum acceleration when retracting"
msgstr "Maximale acceleratie tijdens retracten"
-#: src/libslic3r/PrintConfig.cpp:1210
+#: src/libslic3r/PrintConfig.cpp:1418
msgid "Maximum acceleration when retracting (M204 T)"
msgstr "Maximale acceleratie tijdens retracten (M204 T)"
-#: src/libslic3r/PrintConfig.cpp:1217 src/libslic3r/PrintConfig.cpp:1226
+#: src/libslic3r/PrintConfig.cpp:1425 src/libslic3r/PrintConfig.cpp:1434
msgid "Max"
msgstr "Max"
-#: src/libslic3r/PrintConfig.cpp:1218
+#: src/libslic3r/PrintConfig.cpp:1426
msgid "This setting represents the maximum speed of your fan."
msgstr "Deze instelling gaat over de maximale snelheid van uw ventilator."
-#: src/libslic3r/PrintConfig.cpp:1227
-#, no-c-format
+#: src/libslic3r/PrintConfig.cpp:1435
+#, c-format
msgid ""
"This is the highest printable layer height for this extruder, used to cap "
"the variable layer height and support layer height. Maximum recommended "
@@ -8548,11 +10623,11 @@ msgstr ""
"krijgen. Als dit ingesteld is op 0, wordt de waarde op 75% van de "
"nozzlediameter genomen."
-#: src/libslic3r/PrintConfig.cpp:1237
+#: src/libslic3r/PrintConfig.cpp:1445
msgid "Max print speed"
msgstr "Maximale printsnelheid"
-#: src/libslic3r/PrintConfig.cpp:1238
+#: src/libslic3r/PrintConfig.cpp:1446
msgid ""
"When setting other speed settings to 0 Slic3r will autocalculate the optimal "
"speed in order to keep constant extruder pressure. This experimental setting "
@@ -8560,10 +10635,10 @@ msgid ""
msgstr ""
"Als de alle snelheidsinstellingen op 0 staan, berekent PrusaSlicer "
"automatisch de optimale snelheid voor een constante extrusiedruk. Deze "
-"experimentele instelling wordt gebruikt voor de hoogste printsnelheid die u "
+"experimentele instelling wordt gebruikt voor de hoogste printsnelheid die je "
"toestaat."
-#: src/libslic3r/PrintConfig.cpp:1248
+#: src/libslic3r/PrintConfig.cpp:1456
msgid ""
"This experimental setting is used to set the maximum volumetric speed your "
"extruder supports."
@@ -8571,11 +10646,11 @@ msgstr ""
"Deze experimentele instelling wordt gebruikt voor de maximale volumetrische "
"snelheid van de extruder."
-#: src/libslic3r/PrintConfig.cpp:1257
+#: src/libslic3r/PrintConfig.cpp:1465
msgid "Max volumetric slope positive"
msgstr "Maximale volumetrische stijging"
-#: src/libslic3r/PrintConfig.cpp:1258 src/libslic3r/PrintConfig.cpp:1269
+#: src/libslic3r/PrintConfig.cpp:1466 src/libslic3r/PrintConfig.cpp:1477
msgid ""
"This experimental setting is used to limit the speed of change in extrusion "
"rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate "
@@ -8587,25 +10662,25 @@ msgstr ""
"s (0,45mm extrusiebreedte, 0,2mm laagdikte, 20mm/s voedingssnelheid) tot "
"5.4mm³/s (60mm/s voedingssnelheid). Dit duurt ten minste 2sec."
-#: src/libslic3r/PrintConfig.cpp:1262 src/libslic3r/PrintConfig.cpp:1273
+#: src/libslic3r/PrintConfig.cpp:1470 src/libslic3r/PrintConfig.cpp:1481
msgid "mm³/s²"
msgstr "mm³/s²"
-#: src/libslic3r/PrintConfig.cpp:1268
+#: src/libslic3r/PrintConfig.cpp:1476
msgid "Max volumetric slope negative"
msgstr "Maximale volumetrische daling"
-#: src/libslic3r/PrintConfig.cpp:1280 src/libslic3r/PrintConfig.cpp:1289
+#: src/libslic3r/PrintConfig.cpp:1488 src/libslic3r/PrintConfig.cpp:1497
msgid "Min"
msgstr "Min"
-#: src/libslic3r/PrintConfig.cpp:1281
+#: src/libslic3r/PrintConfig.cpp:1489
msgid "This setting represents the minimum PWM your fan needs to work."
msgstr ""
"Deze instelling geeft de minimale snelheid van uw ventilator aan waarbij de "
"ventilator draait."
-#: src/libslic3r/PrintConfig.cpp:1290
+#: src/libslic3r/PrintConfig.cpp:1498
msgid ""
"This is the lowest printable layer height for this extruder and limits the "
"resolution for variable layer height. Typical values are between 0.05 mm and "
@@ -8615,20 +10690,20 @@ msgstr ""
"resolutie voor variabele laagdikte. Typische waarden zijn tussen 0,05 en 0,1 "
"mm."
-#: src/libslic3r/PrintConfig.cpp:1298
+#: src/libslic3r/PrintConfig.cpp:1506
msgid "Min print speed"
msgstr "Minimale printsnelheid"
-#: src/libslic3r/PrintConfig.cpp:1299
+#: src/libslic3r/PrintConfig.cpp:1507
msgid "Slic3r will not scale speed down below this speed."
msgstr ""
"PrusaSlicer zal de printsnelheid niet verlagen tot onder deze snelheid."
-#: src/libslic3r/PrintConfig.cpp:1306
+#: src/libslic3r/PrintConfig.cpp:1514
msgid "Minimal filament extrusion length"
msgstr "Minimale extrusielengte"
-#: src/libslic3r/PrintConfig.cpp:1307
+#: src/libslic3r/PrintConfig.cpp:1515
msgid ""
"Generate no less than the number of skirt loops required to consume the "
"specified amount of filament on the bottom layer. For multi-extruder "
@@ -8638,28 +10713,28 @@ msgstr ""
"hoeveelheid filament op de eerste laag te verbruiken. Voor multi-"
"extruderprinters is dit het minimum voor elke extruder."
-#: src/libslic3r/PrintConfig.cpp:1316
+#: src/libslic3r/PrintConfig.cpp:1524
msgid "Configuration notes"
msgstr "Configuratie-opmerkingen"
-#: src/libslic3r/PrintConfig.cpp:1317
+#: src/libslic3r/PrintConfig.cpp:1525
msgid ""
"You can put here your personal notes. This text will be added to the G-code "
"header comments."
msgstr ""
-"Hier kunt u eigen opmerkingen plaatsen. Deze tekst wordt bovenin de G-code "
-"toegevoegd."
+"Hier kun je jouw eigen opmerkingen plaatsen. Deze tekst wordt bovenin de G-"
+"code toegevoegd."
-#: src/libslic3r/PrintConfig.cpp:1327
+#: src/libslic3r/PrintConfig.cpp:1535
msgid ""
"This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)"
msgstr "Dit is de diameter van uw extruder-nozzle (bijvoorbeeld 0.4)"
-#: src/libslic3r/PrintConfig.cpp:1332
+#: src/libslic3r/PrintConfig.cpp:1540
msgid "Host Type"
msgstr "Hosttype"
-#: src/libslic3r/PrintConfig.cpp:1333
+#: src/libslic3r/PrintConfig.cpp:1541
msgid ""
"Slic3r can upload G-code files to a printer host. This field must contain "
"the kind of the host."
@@ -8667,19 +10742,19 @@ msgstr ""
"PrusaSlicer kan gcode-bestanden uploaden naar een printerhost. Dit veld moet "
"het type host bevatten."
-#: src/libslic3r/PrintConfig.cpp:1348
+#: src/libslic3r/PrintConfig.cpp:1558
msgid "Only retract when crossing perimeters"
msgstr "Alleen retracten bij kruisende perimeters"
-#: src/libslic3r/PrintConfig.cpp:1349
+#: src/libslic3r/PrintConfig.cpp:1559
msgid ""
"Disables retraction when the travel path does not exceed the upper layer's "
"perimeters (and thus any ooze will be probably invisible)."
msgstr ""
-"Schakelt retracten uit als de bewegingsroute de perimeters van de bovenste "
+"Schakelt retracten uit als de bewegingspaden de perimeters van de bovenste "
"laag niet overschrijdt (en maakt eventueel druipen dus onzichtbaar)."
-#: src/libslic3r/PrintConfig.cpp:1356
+#: src/libslic3r/PrintConfig.cpp:1566
msgid ""
"This option will drop the temperature of the inactive extruders to prevent "
"oozing. It will enable a tall skirt automatically and move extruders outside "
@@ -8689,27 +10764,27 @@ msgstr ""
"voorkomen. Het staat een smalle skirt automatisch toe en beweegt extruders "
"buiten zo'n skirt als de temperatuur verandert."
-#: src/libslic3r/PrintConfig.cpp:1363
+#: src/libslic3r/PrintConfig.cpp:1573
msgid "Output filename format"
msgstr "Formaat van bestandsnaam"
-#: src/libslic3r/PrintConfig.cpp:1364
+#: src/libslic3r/PrintConfig.cpp:1574
msgid ""
"You can use all configuration options as variables inside this template. For "
"example: [layer_height], [fill_density] etc. You can also use [timestamp], "
"[year], [month], [day], [hour], [minute], [second], [version], "
"[input_filename], [input_filename_base]."
msgstr ""
-"U kunt alle instellingen gebruiken in deze template. U kunt hier ook andere "
+"U kunt alle instellingen gebruiken in deze template. Je kunt hier ook andere "
"variabelen gebruiken, zoals 'layer_height', 'fill_density', 'timestamp', "
"'year', 'month', 'day', 'hour', 'minute', 'second', 'version', "
"'input_filename', 'input_filename_base', etc."
-#: src/libslic3r/PrintConfig.cpp:1373
+#: src/libslic3r/PrintConfig.cpp:1583
msgid "Detect bridging perimeters"
msgstr "Detecteer brugperimeters"
-#: src/libslic3r/PrintConfig.cpp:1375
+#: src/libslic3r/PrintConfig.cpp:1585
msgid ""
"Experimental option to adjust flow for overhangs (bridge flow will be used), "
"to apply bridge speed to them and enable fan."
@@ -8717,11 +10792,11 @@ msgstr ""
"Experimentele optie om het debiet voor overhanging aan te passen. Het debiet "
"voor bruggen wordt aangehouden, evenals de printsnelheid en de koeling."
-#: src/libslic3r/PrintConfig.cpp:1381
+#: src/libslic3r/PrintConfig.cpp:1591
msgid "Filament parking position"
msgstr "Filament parkeerpositie"
-#: src/libslic3r/PrintConfig.cpp:1382
+#: src/libslic3r/PrintConfig.cpp:1592
msgid ""
"Distance of the extruder tip from the position where the filament is parked "
"when unloaded. This should match the value in printer firmware."
@@ -8730,11 +10805,11 @@ msgstr ""
"wanneer dat niet geladen is. Deze moet overeenkomen met de waarde in de "
"firmware."
-#: src/libslic3r/PrintConfig.cpp:1390
+#: src/libslic3r/PrintConfig.cpp:1600
msgid "Extra loading distance"
msgstr "Extra laadafstand"
-#: src/libslic3r/PrintConfig.cpp:1391
+#: src/libslic3r/PrintConfig.cpp:1601
msgid ""
"When set to zero, the distance the filament is moved from parking position "
"during load is exactly the same as it was moved back during unload. When "
@@ -8746,31 +10821,30 @@ msgstr ""
"teruggetrokken wordt. Als de waarde positief is, zal het verder geladen "
"worden. Als het negatief is, is de laadafstand dus korter."
-#: src/libslic3r/PrintConfig.cpp:1399 src/libslic3r/PrintConfig.cpp:1417
-#: src/libslic3r/PrintConfig.cpp:1430 src/libslic3r/PrintConfig.cpp:1440
+#: src/libslic3r/PrintConfig.cpp:1609 src/libslic3r/PrintConfig.cpp:1626
+#: src/libslic3r/PrintConfig.cpp:1639 src/libslic3r/PrintConfig.cpp:1649
msgid "Perimeters"
msgstr "Perimeters"
-#: src/libslic3r/PrintConfig.cpp:1400
+#: src/libslic3r/PrintConfig.cpp:1610
msgid ""
-"This is the acceleration your printer will use for perimeters. A high value "
-"like 9000 usually gives good results if your hardware is up to the job. Set "
-"zero to disable acceleration control for perimeters."
+"This is the acceleration your printer will use for perimeters. Set zero to "
+"disable acceleration control for perimeters."
msgstr ""
-"Deze acceleratie zal uw printer gebruiken voor perimeters. Als dit ingesteld "
-"is op 0, worden acceleratie-instellingen voor perimeters uitgezet."
+"Deze acceleratie zal uw printer gebruiken voor de perimeters. Als dit is "
+"ingesteld op 0, wordt de acceleratiecontrole uitgeschakeld."
-#: src/libslic3r/PrintConfig.cpp:1408
+#: src/libslic3r/PrintConfig.cpp:1617
msgid "Perimeter extruder"
msgstr "Perimeterextruder"
-#: src/libslic3r/PrintConfig.cpp:1410
+#: src/libslic3r/PrintConfig.cpp:1619
msgid ""
"The extruder to use when printing perimeters and brim. First extruder is 1."
msgstr ""
"De extruder die gebruikt wordt voor het printen van perimeters en de brim."
-#: src/libslic3r/PrintConfig.cpp:1419
+#: src/libslic3r/PrintConfig.cpp:1628
msgid ""
"Set this to a non-zero value to set a manual extrusion width for perimeters. "
"You may want to use thinner extrudates to get more accurate surfaces. If "
@@ -8784,14 +10858,14 @@ msgstr ""
"nozzlediameter. Als dit is uitgedrukt als percentage, wordt dit berekend "
"over de laagdikte."
-#: src/libslic3r/PrintConfig.cpp:1432
+#: src/libslic3r/PrintConfig.cpp:1641
msgid ""
"Speed for perimeters (contours, aka vertical shells). Set to zero for auto."
msgstr ""
"Printnelheid voor de perimeters (contouren, ook wel bekend als verticale "
"shells). Als dit ingesteld is op 0, wordt een automatische snelheid genomen."
-#: src/libslic3r/PrintConfig.cpp:1442
+#: src/libslic3r/PrintConfig.cpp:1651
msgid ""
"This option sets the number of perimeters to generate for each layer. Note "
"that Slic3r may increase this number automatically when it detects sloping "
@@ -8803,11 +10877,11 @@ msgstr ""
"een hoger aantal perimeters als de optie voor extra perimeters is "
"ingeschakeld."
-#: src/libslic3r/PrintConfig.cpp:1446
+#: src/libslic3r/PrintConfig.cpp:1655
msgid "(minimum)"
msgstr "(minimum)"
-#: src/libslic3r/PrintConfig.cpp:1454
+#: src/libslic3r/PrintConfig.cpp:1663
msgid ""
"If you want to process the output G-code through custom scripts, just list "
"their absolute paths here. Separate multiple scripts with a semicolon. "
@@ -8815,40 +10889,40 @@ msgid ""
"argument, and they can access the Slic3r config settings by reading "
"environment variables."
msgstr ""
-"Als u de output-G-code via custom scripts wilt verwerken, hoeft u alleen de "
+"Als je de output-G-code via custom scripts wil verwerken, hoef je alleen de "
"paden hier te plaatsen. Scheid meerdere scripts met een puntkomma. Scripts "
"krijgen als eerste argument het pad naar het gcode-bestand. Ze hebben ook "
"toegang tot de configuratie-instellingen door het lezen van variabelen."
-#: src/libslic3r/PrintConfig.cpp:1466
+#: src/libslic3r/PrintConfig.cpp:1675
msgid "Printer type"
msgstr "Printertype"
-#: src/libslic3r/PrintConfig.cpp:1467
+#: src/libslic3r/PrintConfig.cpp:1676
msgid "Type of the printer."
msgstr "Type van de printer."
-#: src/libslic3r/PrintConfig.cpp:1472
+#: src/libslic3r/PrintConfig.cpp:1681
msgid "Printer notes"
msgstr "Printeropmerkingen"
-#: src/libslic3r/PrintConfig.cpp:1473
+#: src/libslic3r/PrintConfig.cpp:1682
msgid "You can put your notes regarding the printer here."
msgstr "Hier kunnen opmerkingen over de printer geplaatst worden."
-#: src/libslic3r/PrintConfig.cpp:1481
+#: src/libslic3r/PrintConfig.cpp:1690
msgid "Printer vendor"
msgstr "Printerleverancier"
-#: src/libslic3r/PrintConfig.cpp:1482
+#: src/libslic3r/PrintConfig.cpp:1691
msgid "Name of the printer vendor."
msgstr "Naam van de printerleverancier."
-#: src/libslic3r/PrintConfig.cpp:1487
+#: src/libslic3r/PrintConfig.cpp:1696
msgid "Printer variant"
msgstr "Printervariant"
-#: src/libslic3r/PrintConfig.cpp:1488
+#: src/libslic3r/PrintConfig.cpp:1697
msgid ""
"Name of the printer variant. For example, the printer variants may be "
"differentiated by a nozzle diameter."
@@ -8856,11 +10930,11 @@ msgstr ""
"Naam van de printervariant. De nozzlediameter kan bijvoorbeeld afwijken voor "
"verschillende varianten."
-#: src/libslic3r/PrintConfig.cpp:1501
+#: src/libslic3r/PrintConfig.cpp:1714
msgid "Raft layers"
msgstr "Raftlagen"
-#: src/libslic3r/PrintConfig.cpp:1503
+#: src/libslic3r/PrintConfig.cpp:1716
msgid ""
"The object will be raised by this number of layers, and support material "
"will be generated under it."
@@ -8868,11 +10942,11 @@ msgstr ""
"Het object wordt verhoogd met dit aantal lagen. Support wordt onder het "
"object gegenereerd."
-#: src/libslic3r/PrintConfig.cpp:1511
+#: src/libslic3r/PrintConfig.cpp:1724
msgid "Resolution"
msgstr "Resolutie"
-#: src/libslic3r/PrintConfig.cpp:1512
+#: src/libslic3r/PrintConfig.cpp:1725
msgid ""
"Minimum detail resolution, used to simplify the input file for speeding up "
"the slicing job and reducing memory usage. High-resolution models often "
@@ -8884,22 +10958,22 @@ msgstr ""
"een hoge resolutie vragen meer van een printer dan mogelijk. Als dit "
"ingesteld is op 0, wordt simplificatie uitgeschakeld."
-#: src/libslic3r/PrintConfig.cpp:1522
+#: src/libslic3r/PrintConfig.cpp:1735
msgid "Minimum travel after retraction"
msgstr "Minimale beweging na retracten"
-#: src/libslic3r/PrintConfig.cpp:1523
+#: src/libslic3r/PrintConfig.cpp:1736
msgid ""
"Retraction is not triggered when travel moves are shorter than this length."
msgstr ""
"Retracten is niet geactiveerd als bewegingen korter zijn dan de hier "
"ingevoerde lengte."
-#: src/libslic3r/PrintConfig.cpp:1529
+#: src/libslic3r/PrintConfig.cpp:1742
msgid "Retract amount before wipe"
msgstr "Retracthoeveelheid voor het afvegen"
-#: src/libslic3r/PrintConfig.cpp:1530
+#: src/libslic3r/PrintConfig.cpp:1743
msgid ""
"With bowden extruders, it may be wise to do some amount of quick retract "
"before doing the wipe movement."
@@ -8907,23 +10981,23 @@ msgstr ""
"Met Bowden-extruders is het verstandig om een aantal maal snel te retracten "
"voor het afvegen."
-#: src/libslic3r/PrintConfig.cpp:1537
+#: src/libslic3r/PrintConfig.cpp:1750
msgid "Retract on layer change"
msgstr "Retracten bij laagwisselingen"
-#: src/libslic3r/PrintConfig.cpp:1538
+#: src/libslic3r/PrintConfig.cpp:1751
msgid "This flag enforces a retraction whenever a Z move is done."
msgstr "Dit vinkje geeft aan of wordt teruggetrokken bij een Z-beweging."
-#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1551
+#: src/libslic3r/PrintConfig.cpp:1756 src/libslic3r/PrintConfig.cpp:1764
msgid "Length"
msgstr "Lengte"
-#: src/libslic3r/PrintConfig.cpp:1544
+#: src/libslic3r/PrintConfig.cpp:1757
msgid "Retraction Length"
msgstr "Retractielengte"
-#: src/libslic3r/PrintConfig.cpp:1545
+#: src/libslic3r/PrintConfig.cpp:1758
msgid ""
"When retraction is triggered, filament is pulled back by the specified "
"amount (the length is measured on raw filament, before it enters the "
@@ -8932,15 +11006,15 @@ msgstr ""
"Als retracten is geactiveerd, wordt filament teruggetrokken op de ingestelde "
"waarde (filamentlengte voor het de extruder in gaat)."
-#: src/libslic3r/PrintConfig.cpp:1547 src/libslic3r/PrintConfig.cpp:1556
+#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1769
msgid "mm (zero to disable)"
msgstr "mm (stel in op 0 om uit te schakelen)"
-#: src/libslic3r/PrintConfig.cpp:1552
+#: src/libslic3r/PrintConfig.cpp:1765
msgid "Retraction Length (Toolchange)"
msgstr "Retractielengte (toolwissel)"
-#: src/libslic3r/PrintConfig.cpp:1553
+#: src/libslic3r/PrintConfig.cpp:1766
msgid ""
"When retraction is triggered before changing tool, filament is pulled back "
"by the specified amount (the length is measured on raw filament, before it "
@@ -8950,29 +11024,29 @@ msgstr ""
"teruggetrokken op de ingestelde waarde (filamentlengte voor het de extruder "
"in gaat)."
-#: src/libslic3r/PrintConfig.cpp:1561
+#: src/libslic3r/PrintConfig.cpp:1774
msgid "Lift Z"
msgstr "Beweeg Z omhoog"
-#: src/libslic3r/PrintConfig.cpp:1562
+#: src/libslic3r/PrintConfig.cpp:1775
msgid ""
"If you set this to a positive value, Z is quickly raised every time a "
"retraction is triggered. When using multiple extruders, only the setting for "
"the first extruder will be considered."
msgstr ""
-"Als u dit instelt op een positieve waarde, beweegt de nozzle telkens "
+"Als je dit instelt op een positieve waarde, beweegt de nozzle telkens "
"enigszins omhoog bij het retracten. Als meerdere extruders worden gebruikt, "
"wordt alleen de instelling van de eerste extruder aangehouden."
-#: src/libslic3r/PrintConfig.cpp:1569
+#: src/libslic3r/PrintConfig.cpp:1782
msgid "Above Z"
msgstr "Boven Z"
-#: src/libslic3r/PrintConfig.cpp:1570
+#: src/libslic3r/PrintConfig.cpp:1783
msgid "Only lift Z above"
msgstr "Beweeg Z alleen omhoog boven"
-#: src/libslic3r/PrintConfig.cpp:1571
+#: src/libslic3r/PrintConfig.cpp:1784
msgid ""
"If you set this to a positive value, Z lift will only take place above the "
"specified absolute Z. You can tune this setting for skipping lift on the "
@@ -8982,15 +11056,15 @@ msgstr ""
"ingestelde waarde omhoog bewegen voor het retracten. Deze kan aangepast "
"worden om warping te voorkomen bij de eerste lagen."
-#: src/libslic3r/PrintConfig.cpp:1578
+#: src/libslic3r/PrintConfig.cpp:1791
msgid "Below Z"
msgstr "Onder Z"
-#: src/libslic3r/PrintConfig.cpp:1579
+#: src/libslic3r/PrintConfig.cpp:1792
msgid "Only lift Z below"
msgstr "Beweeg Z alleen omhoog onder"
-#: src/libslic3r/PrintConfig.cpp:1580
+#: src/libslic3r/PrintConfig.cpp:1793
msgid ""
"If you set this to a positive value, Z lift will only take place below the "
"specified absolute Z. You can tune this setting for limiting lift to the "
@@ -8999,11 +11073,11 @@ msgstr ""
"Als dit ingesteld is op een positieve waarde, zal de nozzle alleen onder de "
"ingestelde waarde omhoog bewegen bij het retracten."
-#: src/libslic3r/PrintConfig.cpp:1588 src/libslic3r/PrintConfig.cpp:1596
+#: src/libslic3r/PrintConfig.cpp:1801 src/libslic3r/PrintConfig.cpp:1809
msgid "Extra length on restart"
msgstr "Extra lengte bij een herstart"
-#: src/libslic3r/PrintConfig.cpp:1589
+#: src/libslic3r/PrintConfig.cpp:1802
msgid ""
"When the retraction is compensated after the travel move, the extruder will "
"push this additional amount of filament. This setting is rarely needed."
@@ -9011,7 +11085,7 @@ msgstr ""
"Als retracten wordt gecompenseerd na een beweging, wordt deze extra "
"hoeveelheid filament geëxtrudeerd. Deze instelling is zelden van toepassing."
-#: src/libslic3r/PrintConfig.cpp:1597
+#: src/libslic3r/PrintConfig.cpp:1810
msgid ""
"When the retraction is compensated after changing tool, the extruder will "
"push this additional amount of filament."
@@ -9019,19 +11093,19 @@ msgstr ""
"Als retracten wordt gecompenseerd na een toolwisseling, wordt deze extra "
"hoeveelheid filament geëxtrudeerd."
-#: src/libslic3r/PrintConfig.cpp:1604 src/libslic3r/PrintConfig.cpp:1605
+#: src/libslic3r/PrintConfig.cpp:1817 src/libslic3r/PrintConfig.cpp:1818
msgid "Retraction Speed"
msgstr "Retractiesnelheid"
-#: src/libslic3r/PrintConfig.cpp:1606
+#: src/libslic3r/PrintConfig.cpp:1819
msgid "The speed for retractions (it only applies to the extruder motor)."
msgstr "De snelheid voor retracties (geldt alleen voor de extrudermotor)."
-#: src/libslic3r/PrintConfig.cpp:1612 src/libslic3r/PrintConfig.cpp:1613
+#: src/libslic3r/PrintConfig.cpp:1825 src/libslic3r/PrintConfig.cpp:1826
msgid "Deretraction Speed"
msgstr "Deretractiesnelheid"
-#: src/libslic3r/PrintConfig.cpp:1614
+#: src/libslic3r/PrintConfig.cpp:1827
msgid ""
"The speed for loading of a filament into extruder after retraction (it only "
"applies to the extruder motor). If left to zero, the retraction speed is "
@@ -9041,68 +11115,55 @@ msgstr ""
"voor de extrudermotor). Als dit ingesteld is op 0, wordt de "
"retractiesnelheid gebruikt."
-#: src/libslic3r/PrintConfig.cpp:1621
+#: src/libslic3r/PrintConfig.cpp:1834
msgid "Seam position"
msgstr "Naadpositie"
-#: src/libslic3r/PrintConfig.cpp:1623
+#: src/libslic3r/PrintConfig.cpp:1836
msgid "Position of perimeters starting points."
msgstr "Startpuntpositie van perimeters."
-#: src/libslic3r/PrintConfig.cpp:1629
+#: src/libslic3r/PrintConfig.cpp:1842
msgid "Random"
msgstr "Willekeurig"
-#: src/libslic3r/PrintConfig.cpp:1630
+#: src/libslic3r/PrintConfig.cpp:1843
msgid "Nearest"
-msgstr "Dichstbijzijnd"
+msgstr "Dichtstbijzijnd"
-#: src/libslic3r/PrintConfig.cpp:1631
+#: src/libslic3r/PrintConfig.cpp:1844
msgid "Aligned"
msgstr "Uitgelijnd"
-#: src/libslic3r/PrintConfig.cpp:1639
+#: src/libslic3r/PrintConfig.cpp:1852
msgid "Direction"
msgstr "Richting"
-#: src/libslic3r/PrintConfig.cpp:1641
+#: src/libslic3r/PrintConfig.cpp:1854
msgid "Preferred direction of the seam"
msgstr "Richtingsvoorkeur voor de naad"
-#: src/libslic3r/PrintConfig.cpp:1642
+#: src/libslic3r/PrintConfig.cpp:1855
msgid "Seam preferred direction"
msgstr "Richtingsvoorkeur voor de naad"
-#: src/libslic3r/PrintConfig.cpp:1649
+#: src/libslic3r/PrintConfig.cpp:1862
msgid "Jitter"
msgstr "Jitter"
-#: src/libslic3r/PrintConfig.cpp:1651
+#: src/libslic3r/PrintConfig.cpp:1864
msgid "Seam preferred direction jitter"
msgstr "Voorkeursrichting voor de naad - jitter"
-#: src/libslic3r/PrintConfig.cpp:1652
+#: src/libslic3r/PrintConfig.cpp:1865
msgid "Preferred direction of the seam - jitter"
msgstr "Voorkeursrichting voor de naad - jitter"
-#: src/libslic3r/PrintConfig.cpp:1662
-msgid "USB/serial port for printer connection."
-msgstr "USB/seriële poort voor verbinding met de printer."
-
-#: src/libslic3r/PrintConfig.cpp:1669
-msgid "Serial port speed"
-msgstr "Snelheid van de seriële poort"
-
-#: src/libslic3r/PrintConfig.cpp:1670
-msgid "Speed (baud) of USB/serial port for printer connection."
-msgstr ""
-"Snelheid (baud) van de USB/seriële poort voor de verbinding met de printer."
-
-#: src/libslic3r/PrintConfig.cpp:1679
+#: src/libslic3r/PrintConfig.cpp:1872
msgid "Distance from object"
msgstr "Afstand vanaf het object"
-#: src/libslic3r/PrintConfig.cpp:1680
+#: src/libslic3r/PrintConfig.cpp:1873
msgid ""
"Distance between skirt and object(s). Set this to zero to attach the skirt "
"to the object(s) and get a brim for better adhesion."
@@ -9110,11 +11171,11 @@ msgstr ""
"Afstand tussen skirt en object. Als dit ingesteld is op 0, wordt de skirt "
"aan het object vastgemaakt; het fungeert dan als brim."
-#: src/libslic3r/PrintConfig.cpp:1687
+#: src/libslic3r/PrintConfig.cpp:1880
msgid "Skirt height"
msgstr "Skirthoogte"
-#: src/libslic3r/PrintConfig.cpp:1688
+#: src/libslic3r/PrintConfig.cpp:1881
msgid ""
"Height of skirt expressed in layers. Set this to a tall value to use skirt "
"as a shield against drafts."
@@ -9122,15 +11183,28 @@ msgstr ""
"Hoogte van de skirt uitgedrukt in het aantal lagen. Stel in op een hoge "
"waarde om te gebruiken als afscherming tegen tocht."
-#: src/libslic3r/PrintConfig.cpp:1695
+#: src/libslic3r/PrintConfig.cpp:1888
+msgid "Draft shield"
+msgstr "Tochtscherm"
+
+#: src/libslic3r/PrintConfig.cpp:1889
+msgid ""
+"If enabled, the skirt will be as tall as a highest printed object. This is "
+"useful to protect an ABS or ASA print from warping and detaching from print "
+"bed due to wind draft."
+msgstr ""
+"Als dit is ingeschakeld zal de skirt zo hoog zijn als het hoogte object. Dit "
+"is handig om warping door tocht bij ABS of ASA te voorkomen."
+
+#: src/libslic3r/PrintConfig.cpp:1895
msgid "Loops (minimum)"
msgstr "Rondgangen (minimaal)"
-#: src/libslic3r/PrintConfig.cpp:1696
+#: src/libslic3r/PrintConfig.cpp:1896
msgid "Skirt Loops"
msgstr "Rondgangen voor de skirt"
-#: src/libslic3r/PrintConfig.cpp:1697
+#: src/libslic3r/PrintConfig.cpp:1897
msgid ""
"Number of loops for the skirt. If the Minimum Extrusion Length option is "
"set, the number of loops might be greater than the one configured here. Set "
@@ -9140,11 +11214,11 @@ msgstr ""
"ingesteld kan dit aantal rondgangen groter zijn dan hier is ingesteld. Als "
"dit ingesteld is op 0, wordt de skirt uitgeschakeld."
-#: src/libslic3r/PrintConfig.cpp:1705
+#: src/libslic3r/PrintConfig.cpp:1905
msgid "Slow down if layer print time is below"
msgstr "Vertraag bij een kortere laagprinttijd dan"
-#: src/libslic3r/PrintConfig.cpp:1706
+#: src/libslic3r/PrintConfig.cpp:1906
msgid ""
"If layer print time is estimated below this number of seconds, print moves "
"speed will be scaled down to extend duration to this value."
@@ -9152,11 +11226,11 @@ msgstr ""
"Als de laagprinttijd wordt berekend onder dit aantal seconden, wordt de "
"printsnelheid verlaagd om de laagprinttijd te verlengen."
-#: src/libslic3r/PrintConfig.cpp:1715
+#: src/libslic3r/PrintConfig.cpp:1915
msgid "Small perimeters"
msgstr "Smalle perimeters"
-#: src/libslic3r/PrintConfig.cpp:1717
+#: src/libslic3r/PrintConfig.cpp:1917
msgid ""
"This separate setting will affect the speed of perimeters having radius <= "
"6.5mm (usually holes). If expressed as percentage (for example: 80%) it will "
@@ -9167,11 +11241,11 @@ msgstr ""
"wordt deze genomen over de snelheid van de perimeters. Als dit ingesteld is "
"op 0, wordt een automatische snelheid genomen."
-#: src/libslic3r/PrintConfig.cpp:1727
+#: src/libslic3r/PrintConfig.cpp:1927
msgid "Solid infill threshold area"
msgstr "Dichte vulling bij oppervlak"
-#: src/libslic3r/PrintConfig.cpp:1729
+#: src/libslic3r/PrintConfig.cpp:1929
msgid ""
"Force solid infill for regions having a smaller area than the specified "
"threshold."
@@ -9179,23 +11253,23 @@ msgstr ""
"Forceer dichte vulling voor delen met een kleiner doorsnee-oppervlak dan de "
"hier ingestelde waarde."
-#: src/libslic3r/PrintConfig.cpp:1730
+#: src/libslic3r/PrintConfig.cpp:1930
msgid "mm²"
msgstr "mm²"
-#: src/libslic3r/PrintConfig.cpp:1736
+#: src/libslic3r/PrintConfig.cpp:1936
msgid "Solid infill extruder"
msgstr "Extruder voor dichte vulling"
-#: src/libslic3r/PrintConfig.cpp:1738
+#: src/libslic3r/PrintConfig.cpp:1938
msgid "The extruder to use when printing solid infill."
msgstr "De extruder die gebruikt wordt voor het printen van dichte vullingen."
-#: src/libslic3r/PrintConfig.cpp:1744
+#: src/libslic3r/PrintConfig.cpp:1944
msgid "Solid infill every"
msgstr "Dichte vulling elke"
-#: src/libslic3r/PrintConfig.cpp:1746
+#: src/libslic3r/PrintConfig.cpp:1946
msgid ""
"This feature allows to force a solid layer every given number of layers. "
"Zero to disable. You can set this to any value (for example 9999); Slic3r "
@@ -9207,7 +11281,7 @@ msgstr ""
"waarde; PrusaSlicer zal dan automatisch het maximaal aantal lagen kiezen om "
"te combineren op basis van de nozzlediameter en de laagdikte."
-#: src/libslic3r/PrintConfig.cpp:1758
+#: src/libslic3r/PrintConfig.cpp:1958
msgid ""
"Set this to a non-zero value to set a manual extrusion width for infill for "
"solid surfaces. If left zero, default extrusion width will be used if set, "
@@ -9219,7 +11293,7 @@ msgstr ""
"breedte instellen op 1,125x de nozzlediameter. Als dit is uitgedrukt als "
"percentage, wordt dit berekend over de laagdikte."
-#: src/libslic3r/PrintConfig.cpp:1769
+#: src/libslic3r/PrintConfig.cpp:1969
msgid ""
"Speed for printing solid regions (top/bottom/internal horizontal shells). "
"This can be expressed as a percentage (for example: 80%) over the default "
@@ -9229,37 +11303,37 @@ msgstr ""
"dit berekend over de standaard vullingssnelheid. Als dit ingesteld is op 0, "
"worden automatische waarden genomen."
-#: src/libslic3r/PrintConfig.cpp:1781
+#: src/libslic3r/PrintConfig.cpp:1981
msgid "Number of solid layers to generate on top and bottom surfaces."
msgstr "Aantal te genereren dichte lagen voor boven- en ondervlakken."
-#: src/libslic3r/PrintConfig.cpp:1787 src/libslic3r/PrintConfig.cpp:1788
+#: src/libslic3r/PrintConfig.cpp:1987 src/libslic3r/PrintConfig.cpp:1988
msgid "Minimum thickness of a top / bottom shell"
msgstr "Minimale dikte van top-/bodemshell"
-#: src/libslic3r/PrintConfig.cpp:1794
+#: src/libslic3r/PrintConfig.cpp:1994
msgid "Spiral vase"
msgstr "Spiraalmodus"
-#: src/libslic3r/PrintConfig.cpp:1795
+#: src/libslic3r/PrintConfig.cpp:1995
msgid ""
"This feature will raise Z gradually while printing a single-walled object in "
"order to remove any visible seam. This option requires a single perimeter, "
"no infill, no top solid layers and no support material. You can still set "
"any number of bottom solid layers as well as skirt/brim loops. It won't work "
-"when printing more than an object."
+"when printing more than one single object."
msgstr ""
-"Deze optie zorgt dat de Z-as geleidelijk omhoog gaat als een object met een "
-"enkele perimeter geprint wordt om een naadlijn te voorkomen. Voor deze optie "
-"is een enkele perimeter nodig; vulling, bovenlagen en support zijn niet "
-"mogelijk. Bodemlagen zijn wel mogelijk, evenals een skirt en brim. Dit werkt "
-"niet bij het printen van meerdere objecten tegelijk."
+"Deze optie staat het geleidelijk verhogen in Z-richting toe als geprint "
+"wordt met een enkelwandig object om zichtbare naden te voorkomen. Deze optie "
+"vereist een enkele perimeter, geen vulling, geen bovenste dichte lagen en "
+"geen support. Bodemlagen kunnen nog steed ingesteld worden, evenals een "
+"skirt/brim. Het werkt niet bij meerdere modellen."
-#: src/libslic3r/PrintConfig.cpp:1803
+#: src/libslic3r/PrintConfig.cpp:2003
msgid "Temperature variation"
msgstr "Temperatuurverschil"
-#: src/libslic3r/PrintConfig.cpp:1804
+#: src/libslic3r/PrintConfig.cpp:2004
msgid ""
"Temperature difference to be applied when an extruder is not active. Enables "
"a full-height \"sacrificial\" skirt on which the nozzles are periodically "
@@ -9268,7 +11342,7 @@ msgstr ""
"Temperatuurverschil dat wordt toegepast als een extruder niet actief is. Dit "
"genereert een afveegblok waarop de nozzle wordt schoongeveegd."
-#: src/libslic3r/PrintConfig.cpp:1814
+#: src/libslic3r/PrintConfig.cpp:2014
msgid ""
"This start procedure is inserted at the beginning, after bed has reached the "
"target temperature and extruder just started heating, and before extruder "
@@ -9282,11 +11356,11 @@ msgstr ""
"temperatuur heeft bereikt, de extruder is begonnen met verwarmen en de "
"extruder klaar is met verwarmen. Als PrusaSlicer M104 of M190 detecteert in "
"uw custom codes, zullen dergelijke commando's niet automatisch worden "
-"voorbereid, zodat u vrij bent om de volgorde van de verwarmingscommando's en "
-"andere aangepaste acties aan te passen. Merk op dat u voor alle PrusaSlicer-"
-"instellingen variabelen kunt gebruiken."
+"voorbereid, zodat je vrij bent om de volgorde van de verwarmingscommando's "
+"en andere aangepaste acties aan te passen. Merk op dat je voor alle "
+"PrusaSlicer-instellingen variabelen kunt gebruiken."
-#: src/libslic3r/PrintConfig.cpp:1829
+#: src/libslic3r/PrintConfig.cpp:2029
msgid ""
"This start procedure is inserted at the beginning, after any printer start "
"gcode (and after any toolchange to this filament in case of multi-material "
@@ -9302,26 +11376,41 @@ msgstr ""
"printerstart G-code (en na een eventuele toolwissel op dit filament in het "
"geval van multi-materialprinters). Dit wordt gebruikt om de instellingen "
"voor een specifieke filament te overschrijven. Als PrusaSlicer M104, M109, "
-"M140 of M190 detecteert in de custom codes, zullen dergelijke commando's "
-"niet automatisch worden voorgeprogrammeerd, zodat u vrij bent om de volgorde "
-"van de verwarmingscommando's en andere aangepaste acties aan te passen. Merk "
-"op dat u variabelen kunt gebruiken voor alle PrusaSlicer-instellingen. Als u "
-"meerdere extruders hebt, wordt de G-code in de volgorde van de extruders "
-"verwerkt."
-
-#: src/libslic3r/PrintConfig.cpp:1845
+"M140 of M190 detecteert in de custom codes, zullen dergelijke codes niet "
+"automatisch worden voorgeprogrammeerd, zodat je vrij bent om de volgorde van "
+"de temperatuurregeling en andere aangepaste acties aan te passen. Je kan "
+"variabelen gebruiken voor alle PrusaSlicer-instellingen. Als je meerdere "
+"extruders hebt, wordt de G-code in de volgorde van de extruders verwerkt."
+
+#: src/libslic3r/PrintConfig.cpp:2045
+msgid "Color change G-code"
+msgstr "Kleurwissel-G-code"
+
+#: src/libslic3r/PrintConfig.cpp:2046
+msgid "This G-code will be used as a code for the color change"
+msgstr "Deze G-code wordt gebruikt voor een kleurwisseling"
+
+#: src/libslic3r/PrintConfig.cpp:2055
+msgid "This G-code will be used as a code for the pause print"
+msgstr "Deze G-code wordt gebruikt bij het pauzeren van de print"
+
+#: src/libslic3r/PrintConfig.cpp:2064
+msgid "This G-code will be used as a custom code"
+msgstr "Deze G-code wordt gebruikt als custom G-code"
+
+#: src/libslic3r/PrintConfig.cpp:2072
msgid "Single Extruder Multi Material"
msgstr "Multi-material met één extruder"
-#: src/libslic3r/PrintConfig.cpp:1846
+#: src/libslic3r/PrintConfig.cpp:2073
msgid "The printer multiplexes filaments into a single hot end."
msgstr "De printer mengt filament in een enkele extruder."
-#: src/libslic3r/PrintConfig.cpp:1851
+#: src/libslic3r/PrintConfig.cpp:2078
msgid "Prime all printing extruders"
msgstr "Veeg alle printextruders af"
-#: src/libslic3r/PrintConfig.cpp:1852
+#: src/libslic3r/PrintConfig.cpp:2079
msgid ""
"If enabled, all printing extruders will be primed at the front edge of the "
"print bed at the start of the print."
@@ -9329,11 +11418,11 @@ msgstr ""
"Alle extruders worden afgeveegd aan de voorzijde van het printbed aan het "
"begin van de print als dit aanstaat."
-#: src/libslic3r/PrintConfig.cpp:1857
+#: src/libslic3r/PrintConfig.cpp:2084
msgid "No sparse layers (EXPERIMENTAL)"
msgstr "Geen smalle lagen (experimenteel)"
-#: src/libslic3r/PrintConfig.cpp:1858
+#: src/libslic3r/PrintConfig.cpp:2085
msgid ""
"If enabled, the wipe tower will not be printed on layers with no "
"toolchanges. On layers with a toolchange, extruder will travel downward to "
@@ -9345,19 +11434,19 @@ msgstr ""
"bewegen naar het afveegblok. De gebruiker is verantwoordelijk voor eventuele "
"botsingen met de print."
-#: src/libslic3r/PrintConfig.cpp:1865
+#: src/libslic3r/PrintConfig.cpp:2092
msgid "Generate support material"
msgstr "Genereer support"
-#: src/libslic3r/PrintConfig.cpp:1867
+#: src/libslic3r/PrintConfig.cpp:2094
msgid "Enable support material generation."
msgstr "Sta de generatie van support toe."
-#: src/libslic3r/PrintConfig.cpp:1871
+#: src/libslic3r/PrintConfig.cpp:2098
msgid "Auto generated supports"
msgstr "Automatisch gegenereerd support"
-#: src/libslic3r/PrintConfig.cpp:1873
+#: src/libslic3r/PrintConfig.cpp:2100
msgid ""
"If checked, supports will be generated automatically based on the overhang "
"threshold value. If unchecked, supports will be generated inside the "
@@ -9366,11 +11455,11 @@ msgstr ""
"Support wordt automatisch gegenereerd als dit aan staat. Als dit niet "
"aanstaat zal support alleen bij supportforceringen gegenereerd worden."
-#: src/libslic3r/PrintConfig.cpp:1879
+#: src/libslic3r/PrintConfig.cpp:2106
msgid "XY separation between an object and its support"
msgstr "Horizontale ruimte tussen het object en het support"
-#: src/libslic3r/PrintConfig.cpp:1881
+#: src/libslic3r/PrintConfig.cpp:2108
msgid ""
"XY separation between an object and its support. If expressed as percentage "
"(for example 50%), it will be calculated over external perimeter width."
@@ -9378,17 +11467,17 @@ msgstr ""
"Horizontale ruimte tussen object en support. Als dit is uitgedrukt als "
"percentage, wordt deze berekend over de breedte van de buitenste perimeter."
-#: src/libslic3r/PrintConfig.cpp:1891
+#: src/libslic3r/PrintConfig.cpp:2118
msgid "Pattern angle"
msgstr "Patroonhoek"
-#: src/libslic3r/PrintConfig.cpp:1893
+#: src/libslic3r/PrintConfig.cpp:2120
msgid ""
"Use this setting to rotate the support material pattern on the horizontal "
"plane."
msgstr "Gebruik deze instelling om het patroon van het support te draaien."
-#: src/libslic3r/PrintConfig.cpp:1903 src/libslic3r/PrintConfig.cpp:2686
+#: src/libslic3r/PrintConfig.cpp:2130 src/libslic3r/PrintConfig.cpp:2925
msgid ""
"Only create support if it lies on a build plate. Don't create support on a "
"print."
@@ -9396,11 +11485,11 @@ msgstr ""
"Genereer alleen support als dit op het bed geplaatst wordt, dus niet op de "
"print zelf."
-#: src/libslic3r/PrintConfig.cpp:1909
+#: src/libslic3r/PrintConfig.cpp:2136
msgid "Contact Z distance"
msgstr "Contact Z-afstand"
-#: src/libslic3r/PrintConfig.cpp:1911
+#: src/libslic3r/PrintConfig.cpp:2138
msgid ""
"The vertical distance between object and support material interface. Setting "
"this to 0 will also prevent Slic3r from using bridge flow and speed for the "
@@ -9410,19 +11499,19 @@ msgstr ""
"PrusaSlicer bruginstellingen gebruikt voor de eerste laag boven het "
"supportdak."
-#: src/libslic3r/PrintConfig.cpp:1918
+#: src/libslic3r/PrintConfig.cpp:2145
msgid "0 (soluble)"
msgstr "0 (oplosbaar)"
-#: src/libslic3r/PrintConfig.cpp:1919
+#: src/libslic3r/PrintConfig.cpp:2146
msgid "0.2 (detachable)"
msgstr "0.2 (losbreekbaar)"
-#: src/libslic3r/PrintConfig.cpp:1924
+#: src/libslic3r/PrintConfig.cpp:2151
msgid "Enforce support for the first"
msgstr "Forceer support voor de eerste"
-#: src/libslic3r/PrintConfig.cpp:1926
+#: src/libslic3r/PrintConfig.cpp:2153
msgid ""
"Generate support material for the specified number of layers counting from "
"bottom, regardless of whether normal support material is enabled or not and "
@@ -9434,15 +11523,15 @@ msgstr ""
"waarbij de ingesteld hoek wordt aangehouden. Dit is handig om meer hechting "
"op het bed te verkrijgen bij objecten met een klein contactoppervlak."
-#: src/libslic3r/PrintConfig.cpp:1931
+#: src/libslic3r/PrintConfig.cpp:2158
msgid "Enforce support for the first n layers"
msgstr "Forceer support voor de eerste n lagen"
-#: src/libslic3r/PrintConfig.cpp:1937
+#: src/libslic3r/PrintConfig.cpp:2164
msgid "Support material/raft/skirt extruder"
msgstr "Extruder voor support/raft/skirt"
-#: src/libslic3r/PrintConfig.cpp:1939
+#: src/libslic3r/PrintConfig.cpp:2166
msgid ""
"The extruder to use when printing support material, raft and skirt (1+, 0 to "
"use the current extruder to minimize tool changes)."
@@ -9450,7 +11539,7 @@ msgstr ""
"De extruder die gebruikt wordt voor support, raft en skirt (stel in op 1 of "
"op 0 om de huidige extruder te gebruiken)."
-#: src/libslic3r/PrintConfig.cpp:1948
+#: src/libslic3r/PrintConfig.cpp:2175
msgid ""
"Set this to a non-zero value to set a manual extrusion width for support "
"material. If left zero, default extrusion width will be used if set, "
@@ -9462,22 +11551,22 @@ msgstr ""
"zelf bepalen op basis van de nozzlediameter. Als dit is uitgedrukt als "
"percentage, wordt dit berekend over de laagdikte."
-#: src/libslic3r/PrintConfig.cpp:1957
+#: src/libslic3r/PrintConfig.cpp:2184
msgid "Interface loops"
msgstr "Interface rondgangen"
-#: src/libslic3r/PrintConfig.cpp:1959
+#: src/libslic3r/PrintConfig.cpp:2186
msgid ""
"Cover the top contact layer of the supports with loops. Disabled by default."
msgstr ""
"Bedek de bovenste interfacelagen van het support met rondgangen. Dit staat "
"standaard uit."
-#: src/libslic3r/PrintConfig.cpp:1964
+#: src/libslic3r/PrintConfig.cpp:2191
msgid "Support material/raft interface extruder"
msgstr "Extruder voor supportdak en de bovenlaag van de raft"
-#: src/libslic3r/PrintConfig.cpp:1966
+#: src/libslic3r/PrintConfig.cpp:2193
msgid ""
"The extruder to use when printing support material interface (1+, 0 to use "
"the current extruder to minimize tool changes). This affects raft too."
@@ -9486,27 +11575,27 @@ msgstr ""
"dan 1 of op 0 om de huidige extruder te gebruiken voor minder "
"toolwisselingen). Dit heeft ook effect op de raft."
-#: src/libslic3r/PrintConfig.cpp:1973
+#: src/libslic3r/PrintConfig.cpp:2200
msgid "Interface layers"
msgstr "Supportinterface-lagen"
-#: src/libslic3r/PrintConfig.cpp:1975
+#: src/libslic3r/PrintConfig.cpp:2202
msgid ""
"Number of interface layers to insert between the object(s) and support "
"material."
msgstr "Aantal interface-lagen tussen het support en het object."
-#: src/libslic3r/PrintConfig.cpp:1982
+#: src/libslic3r/PrintConfig.cpp:2209
msgid "Interface pattern spacing"
msgstr "Tussenafstand voor interface"
-#: src/libslic3r/PrintConfig.cpp:1984
+#: src/libslic3r/PrintConfig.cpp:2211
msgid "Spacing between interface lines. Set zero to get a solid interface."
msgstr ""
"Ruimte tussen lijnen van supportinterface. Als dit ingesteld is op 0, wordt "
"een dichte supportinterface gegenereerd."
-#: src/libslic3r/PrintConfig.cpp:1993
+#: src/libslic3r/PrintConfig.cpp:2220
msgid ""
"Speed for printing support material interface layers. If expressed as "
"percentage (for example 50%) it will be calculated over support material "
@@ -9515,35 +11604,35 @@ msgstr ""
"Printsnelheid van supportinterface-lagen. Als dit is uitgedrukt als "
"percentage, wordt dit berekend over de snelheid van het support."
-#: src/libslic3r/PrintConfig.cpp:2002
+#: src/libslic3r/PrintConfig.cpp:2229
msgid "Pattern"
msgstr "Patroon"
-#: src/libslic3r/PrintConfig.cpp:2004
+#: src/libslic3r/PrintConfig.cpp:2231
msgid "Pattern used to generate support material."
msgstr "Patroon dat gebruikt wordt voor het support."
-#: src/libslic3r/PrintConfig.cpp:2010
+#: src/libslic3r/PrintConfig.cpp:2237
msgid "Rectilinear grid"
msgstr "Rechtlijnig raster"
-#: src/libslic3r/PrintConfig.cpp:2016
+#: src/libslic3r/PrintConfig.cpp:2243
msgid "Pattern spacing"
msgstr "Tussenafstand van het patroon"
-#: src/libslic3r/PrintConfig.cpp:2018
+#: src/libslic3r/PrintConfig.cpp:2245
msgid "Spacing between support material lines."
msgstr "Afstand tussen supportlijnen."
-#: src/libslic3r/PrintConfig.cpp:2027
+#: src/libslic3r/PrintConfig.cpp:2254
msgid "Speed for printing support material."
msgstr "Printsnelheid voor support."
-#: src/libslic3r/PrintConfig.cpp:2034
+#: src/libslic3r/PrintConfig.cpp:2261
msgid "Synchronize with object layers"
msgstr "Synchroniseer met objectlagen"
-#: src/libslic3r/PrintConfig.cpp:2036
+#: src/libslic3r/PrintConfig.cpp:2263
msgid ""
"Synchronize support layers with the object print layers. This is useful with "
"multi-material printers, where the extruder switch is expensive."
@@ -9551,11 +11640,11 @@ msgstr ""
"Synchroniseer de supportlagen met de objectlagen. Dit is handig voor multi-"
"materialprinters waar een toolwissel duur is."
-#: src/libslic3r/PrintConfig.cpp:2042
+#: src/libslic3r/PrintConfig.cpp:2269
msgid "Overhang threshold"
msgstr "Maximale overhanghoek"
-#: src/libslic3r/PrintConfig.cpp:2044
+#: src/libslic3r/PrintConfig.cpp:2271
msgid ""
"Support material will not be generated for overhangs whose slope angle (90° "
"= vertical) is above the given threshold. In other words, this value "
@@ -9568,11 +11657,11 @@ msgstr ""
"geprint moet worden met support. Als dit ingesteld is op 0, wordt dit "
"automatisch gedetecteerd (aanbevolen)."
-#: src/libslic3r/PrintConfig.cpp:2056
+#: src/libslic3r/PrintConfig.cpp:2283
msgid "With sheath around the support"
msgstr "Met schild rond het support"
-#: src/libslic3r/PrintConfig.cpp:2058
+#: src/libslic3r/PrintConfig.cpp:2285
msgid ""
"Add a sheath (a single perimeter line) around the base support. This makes "
"the support more reliable, but also more difficult to remove."
@@ -9580,19 +11669,23 @@ msgstr ""
"Voeg een schild (één perimeterlijn) rondom het support toe. Dit maakt het "
"support betrouwbaarder maar ook moeilijker te verwijderen."
-#: src/libslic3r/PrintConfig.cpp:2065
+#: src/libslic3r/PrintConfig.cpp:2292
msgid ""
-"Extruder temperature for layers after the first one. Set this to zero to "
-"disable temperature control commands in the output."
+"Nozzle temperature for layers after the first one. Set this to zero to "
+"disable temperature control commands in the output G-code."
msgstr ""
-"Extrudertemperatuur voor lager direct na de eerste laag. Als dit ingesteld "
-"is op 0, voorkomt dit een verschil in de output."
+"Nozzletemperatuur voor lagen na de eerste laag. Stel in op 0 om "
+"temperatuurregeling uit te zetten in de G-code."
-#: src/libslic3r/PrintConfig.cpp:2073
+#: src/libslic3r/PrintConfig.cpp:2295
+msgid "Nozzle temperature"
+msgstr "Nozzletemperatuur"
+
+#: src/libslic3r/PrintConfig.cpp:2301
msgid "Detect thin walls"
msgstr "Detecteer dunne wanden"
-#: src/libslic3r/PrintConfig.cpp:2075
+#: src/libslic3r/PrintConfig.cpp:2303
msgid ""
"Detect single-width walls (parts where two extrusions don't fit and we need "
"to collapse them into a single trace)."
@@ -9600,11 +11693,11 @@ msgstr ""
"Detecteer éénlijnige wanden (delen waar 2 extrusielijnen niet passen en dit "
"geprint moet worden met 1 lijn)."
-#: src/libslic3r/PrintConfig.cpp:2081
+#: src/libslic3r/PrintConfig.cpp:2309
msgid "Threads"
msgstr "Meerdere processen"
-#: src/libslic3r/PrintConfig.cpp:2082
+#: src/libslic3r/PrintConfig.cpp:2310
msgid ""
"Threads are used to parallelize long-running tasks. Optimal threads number "
"is slightly above the number of available cores/processors."
@@ -9613,7 +11706,7 @@ msgstr ""
"draaien. Het optimaal aantal processen is vlak boven het aanwezige aantal "
"kernen/processoren."
-#: src/libslic3r/PrintConfig.cpp:2094
+#: src/libslic3r/PrintConfig.cpp:2322
msgid ""
"This custom code is inserted before every toolchange. Placeholder variables "
"for all PrusaSlicer settings as well as {previous_extruder} and "
@@ -9624,12 +11717,12 @@ msgid ""
msgstr ""
"Deze custom code wordt ingevoegd voor elke toolwissel. Zowel variabelen van "
"alle PrusaSlicer-instellingen als 'previous_extruder' en 'next_extruder' "
-"kunnen gebruikt worden. Als een toolwissel-commando (bijvoorbeeld "
-"'T[next_extruder]') is ingevoegd, zal PrusaSlicer niet nog een dergelijk "
-"commando invoegen. Het is daarom mogelijk om voor én na de toolwissel een "
-"custom script te draaien."
+"kunnen gebruikt worden. Als een toolwissel-code (bijvoorbeeld "
+"'T[next_extruder]') is ingevoegd, zal PrusaSlicer niet nog een dergelijke "
+"code invoegen. Het is daarom mogelijk om voor én na de toolwissel een custom "
+"script te draaien."
-#: src/libslic3r/PrintConfig.cpp:2107
+#: src/libslic3r/PrintConfig.cpp:2335
msgid ""
"Set this to a non-zero value to set a manual extrusion width for infill for "
"top surfaces. You may want to use thinner extrudates to fill all narrow "
@@ -9642,7 +11735,7 @@ msgstr ""
"extrudaat in smalle gebieden voor een gladdere afwerking. Als dit is "
"uitgedrukt als percentage, wordt dit berekend over de laagdikte."
-#: src/libslic3r/PrintConfig.cpp:2119
+#: src/libslic3r/PrintConfig.cpp:2347
msgid ""
"Speed for printing top solid layers (it only applies to the uppermost "
"external layers and not to their internal solid layers). You may want to "
@@ -9656,15 +11749,15 @@ msgstr ""
"vullingssnelheid. Als dit ingesteld is op 0, wordt een automatische snelheid "
"genomen."
-#: src/libslic3r/PrintConfig.cpp:2134
+#: src/libslic3r/PrintConfig.cpp:2362
msgid "Number of solid layers to generate on top surfaces."
msgstr "Aantal te genereren dichte lagen voor bovenvlakken."
-#: src/libslic3r/PrintConfig.cpp:2135
+#: src/libslic3r/PrintConfig.cpp:2363
msgid "Top solid layers"
msgstr "Bovenste dichte vulling"
-#: src/libslic3r/PrintConfig.cpp:2143
+#: src/libslic3r/PrintConfig.cpp:2371
msgid ""
"The number of top solid layers is increased above top_solid_layers if "
"necessary to satisfy minimum thickness of top shell. This is useful to "
@@ -9674,32 +11767,31 @@ msgstr ""
"de minimale shelldikte te garanderen. Dit is handig om kussenvorming te "
"voorkomen bij het printen met variabele laagdikte."
-#: src/libslic3r/PrintConfig.cpp:2146
+#: src/libslic3r/PrintConfig.cpp:2374
msgid "Minimum top shell thickness"
msgstr "Minimale shelldikte aan de bovenzijde"
-#: src/libslic3r/PrintConfig.cpp:2153
+#: src/libslic3r/PrintConfig.cpp:2381
msgid "Speed for travel moves (jumps between distant extrusion points)."
msgstr "Bewegingssnelheid als niet geëxtrudeerd wordt."
-#: src/libslic3r/PrintConfig.cpp:2161
+#: src/libslic3r/PrintConfig.cpp:2389
msgid "Use firmware retraction"
msgstr "Gebruik de firmware-retractie"
-#: src/libslic3r/PrintConfig.cpp:2162
+#: src/libslic3r/PrintConfig.cpp:2390
msgid ""
"This experimental setting uses G10 and G11 commands to have the firmware "
"handle the retraction. This is only supported in recent Marlin."
msgstr ""
-"Deze experimentele instelling gebruikt G10 en G11 commando's voor het "
-"retracten in de firmware. Dit wordt alleen ondersteunt bij de recente Marlin-"
-"variant."
+"Deze experimentele instelling gebruikt G10- en G11-codes voor het retracten "
+"in de firmware. Dit wordt alleen ondersteunt bij de recente Marlin-variant."
-#: src/libslic3r/PrintConfig.cpp:2168
+#: src/libslic3r/PrintConfig.cpp:2396
msgid "Use relative E distances"
msgstr "Gebruik relatieve E-waarden"
-#: src/libslic3r/PrintConfig.cpp:2169
+#: src/libslic3r/PrintConfig.cpp:2397
msgid ""
"If your firmware requires relative E values, check this, otherwise leave it "
"unchecked. Most firmwares use absolute values."
@@ -9707,11 +11799,11 @@ msgstr ""
"Als uw firmware relatieve extrusiewaarden nodig heeft, vink dit dan aan. "
"Laat het ander uit staan. De meeste firmware gebruiken absolute waarden."
-#: src/libslic3r/PrintConfig.cpp:2175
+#: src/libslic3r/PrintConfig.cpp:2403
msgid "Use volumetric E"
msgstr "Gebruik volumetrische E-waarden"
-#: src/libslic3r/PrintConfig.cpp:2176
+#: src/libslic3r/PrintConfig.cpp:2404
msgid ""
"This experimental setting uses outputs the E values in cubic millimeters "
"instead of linear millimeters. If your firmware doesn't already know "
@@ -9721,18 +11813,18 @@ msgid ""
"only supported in recent Marlin."
msgstr ""
"Deze experimentele instelling gebruikt E-waarden in kubieke millimeters in "
-"plaats van lineaire millimeters. Als uw firmware nog niet weet wat de "
-"filamentdiameter is, kunt u een commando zoals 'M200 D[filament_diameter_0] "
-"T0' in de start G-code invoegen om de volumetrische modus te gebruiken. Deze "
+"plaats van lineaire millimeters. Als je firmware nog niet weet wat de "
+"filamentdiameter is, kan je een code zoals 'M200 D[filament_diameter_0] T0' "
+"in de start G-code invoegen om de volumetrische modus te gebruiken. Deze "
"variabele gebruikt de filamentdiameter zoals ingevoerd bij de "
"filamentinstellingen. Dit wordt alleen ondersteund in de recente Marlin-"
"variant."
-#: src/libslic3r/PrintConfig.cpp:2186
+#: src/libslic3r/PrintConfig.cpp:2414
msgid "Enable variable layer height feature"
-msgstr "Sta variabele laagdikte toe"
+msgstr "Variabele laagdikte toestaan"
-#: src/libslic3r/PrintConfig.cpp:2187
+#: src/libslic3r/PrintConfig.cpp:2415
msgid ""
"Some printers or printer setups may have difficulties printing with a "
"variable layer height. Enabled by default."
@@ -9740,19 +11832,19 @@ msgstr ""
"Sommige printers of printersetups kunnen niet printen met een variabele "
"laagdikte. Staat standaard aan."
-#: src/libslic3r/PrintConfig.cpp:2193
+#: src/libslic3r/PrintConfig.cpp:2421
msgid "Wipe while retracting"
msgstr "Veeg af bij het retracten"
-#: src/libslic3r/PrintConfig.cpp:2194
+#: src/libslic3r/PrintConfig.cpp:2422
msgid ""
"This flag will move the nozzle while retracting to minimize the possible "
"blob on leaky extruders."
msgstr ""
-"Als u dit aanvinkt beweegt de nozzle tijdens het retracten om een blob of "
+"Als je dit aanvinkt beweegt de nozzle tijdens het retracten om een blob of "
"lekkende extruders tegen te gaan."
-#: src/libslic3r/PrintConfig.cpp:2201
+#: src/libslic3r/PrintConfig.cpp:2429
msgid ""
"Multi material printers may need to prime or purge extruders on tool "
"changes. Extrude the excess material into the wipe tower."
@@ -9760,11 +11852,11 @@ msgstr ""
"Multi-materialprinters moeten afvegen bij toolwisselingen. Extrudeer het "
"overtollige materiaal op het afveegblok."
-#: src/libslic3r/PrintConfig.cpp:2207
+#: src/libslic3r/PrintConfig.cpp:2435
msgid "Purging volumes - load/unload volumes"
msgstr "Afveegvolume - laad/ontlaad volumes"
-#: src/libslic3r/PrintConfig.cpp:2208
+#: src/libslic3r/PrintConfig.cpp:2436
msgid ""
"This vector saves required volumes to change from/to each tool used on the "
"wipe tower. These values are used to simplify creation of the full purging "
@@ -9775,11 +11867,11 @@ msgstr ""
"het creëren van de onderstaande volledige reinigingsvolumes te "
"vereenvoudigen."
-#: src/libslic3r/PrintConfig.cpp:2214
+#: src/libslic3r/PrintConfig.cpp:2442
msgid "Purging volumes - matrix"
msgstr "Afveegvolume - matrix"
-#: src/libslic3r/PrintConfig.cpp:2215
+#: src/libslic3r/PrintConfig.cpp:2443
msgid ""
"This matrix describes volumes (in cubic milimetres) required to purge the "
"new filament on the wipe tower for any given pair of tools."
@@ -9787,39 +11879,39 @@ msgstr ""
"Deze matrix beschrijft volume (in mm³) dat is vereist om nieuw filament af "
"te vegen aan het afveegblok voor elk paar van extruders."
-#: src/libslic3r/PrintConfig.cpp:2224
+#: src/libslic3r/PrintConfig.cpp:2452
msgid "Position X"
msgstr "X-positie"
-#: src/libslic3r/PrintConfig.cpp:2225
+#: src/libslic3r/PrintConfig.cpp:2453
msgid "X coordinate of the left front corner of a wipe tower"
msgstr "X-coördinaat van de linkervoorhoek van het afveegblok"
-#: src/libslic3r/PrintConfig.cpp:2231
+#: src/libslic3r/PrintConfig.cpp:2459
msgid "Position Y"
msgstr "Y-positie"
-#: src/libslic3r/PrintConfig.cpp:2232
+#: src/libslic3r/PrintConfig.cpp:2460
msgid "Y coordinate of the left front corner of a wipe tower"
msgstr "Y-coördinaat van de linkervoorhoek van het afveegblok"
-#: src/libslic3r/PrintConfig.cpp:2239
+#: src/libslic3r/PrintConfig.cpp:2467
msgid "Width of a wipe tower"
msgstr "Breedte van het afveegblok"
-#: src/libslic3r/PrintConfig.cpp:2245
+#: src/libslic3r/PrintConfig.cpp:2473
msgid "Wipe tower rotation angle"
msgstr "Rotatie van het afveegblok"
-#: src/libslic3r/PrintConfig.cpp:2246
+#: src/libslic3r/PrintConfig.cpp:2474
msgid "Wipe tower rotation angle with respect to x-axis."
msgstr "Rotatie van het afveegblok ten opzichte van de X-as."
-#: src/libslic3r/PrintConfig.cpp:2253
+#: src/libslic3r/PrintConfig.cpp:2481
msgid "Wipe into this object's infill"
msgstr "Afvegen in de vulling van het object"
-#: src/libslic3r/PrintConfig.cpp:2254
+#: src/libslic3r/PrintConfig.cpp:2482
msgid ""
"Purging after toolchange will done inside this object's infills. This lowers "
"the amount of waste but may result in longer print time due to additional "
@@ -9828,11 +11920,11 @@ msgstr ""
"Het afvegen na de toolwissel wordt gedaan in de vulling van het object. Dit "
"reduceert de hoeveelheid afval, maar kan leiden tot een langere printtijd."
-#: src/libslic3r/PrintConfig.cpp:2261
+#: src/libslic3r/PrintConfig.cpp:2489
msgid "Wipe into this object"
msgstr "Afvegen in dit object"
-#: src/libslic3r/PrintConfig.cpp:2262
+#: src/libslic3r/PrintConfig.cpp:2490
msgid ""
"Object will be used to purge the nozzle after a toolchange to save material "
"that would otherwise end up in the wipe tower and decrease print time. "
@@ -9842,19 +11934,19 @@ msgstr ""
"materiaal dat anders in het afveegblok gebruikt wordt te besparen. Kleuren "
"kunnen dan gemengd worden."
-#: src/libslic3r/PrintConfig.cpp:2268
+#: src/libslic3r/PrintConfig.cpp:2496
msgid "Maximal bridging distance"
msgstr "Maximale brugafstand"
-#: src/libslic3r/PrintConfig.cpp:2269
+#: src/libslic3r/PrintConfig.cpp:2497
msgid "Maximal distance between supports on sparse infill sections."
msgstr "Maximale afstand tussen support op dunne vullingsdelen."
-#: src/libslic3r/PrintConfig.cpp:2275
+#: src/libslic3r/PrintConfig.cpp:2503
msgid "XY Size Compensation"
msgstr "Compensatie voor X- en Y-grootte"
-#: src/libslic3r/PrintConfig.cpp:2277
+#: src/libslic3r/PrintConfig.cpp:2505
msgid ""
"The object will be grown/shrunk in the XY plane by the configured value "
"(negative = inwards, positive = outwards). This might be useful for fine-"
@@ -9864,11 +11956,11 @@ msgstr ""
"waarde (negatief = naar binnen, positief = naar buiten). Dit kan handig zijn "
"voor het verfijnen van gaten."
-#: src/libslic3r/PrintConfig.cpp:2285
+#: src/libslic3r/PrintConfig.cpp:2513
msgid "Z offset"
msgstr "Z-hoogte"
-#: src/libslic3r/PrintConfig.cpp:2286
+#: src/libslic3r/PrintConfig.cpp:2514
msgid ""
"This value will be added (or subtracted) from all the Z coordinates in the "
"output G-code. It is used to compensate for bad Z endstop position: for "
@@ -9880,63 +11972,63 @@ msgstr ""
"eindstop bijvoorbeeld een waarde gebruikt die 0.3mm van het printbed is, kan "
"dit ingesteld worden op -0.3mm."
-#: src/libslic3r/PrintConfig.cpp:2353
+#: src/libslic3r/PrintConfig.cpp:2581
msgid "Display width"
msgstr "Schermbreedte"
-#: src/libslic3r/PrintConfig.cpp:2354
+#: src/libslic3r/PrintConfig.cpp:2582
msgid "Width of the display"
msgstr "Breedte van het scherm"
-#: src/libslic3r/PrintConfig.cpp:2359
+#: src/libslic3r/PrintConfig.cpp:2587
msgid "Display height"
msgstr "Schermhoogte"
-#: src/libslic3r/PrintConfig.cpp:2360
+#: src/libslic3r/PrintConfig.cpp:2588
msgid "Height of the display"
msgstr "Hoogte van het scherm"
-#: src/libslic3r/PrintConfig.cpp:2365
+#: src/libslic3r/PrintConfig.cpp:2593
msgid "Number of pixels in"
msgstr "Aantal pixels"
-#: src/libslic3r/PrintConfig.cpp:2367
+#: src/libslic3r/PrintConfig.cpp:2595
msgid "Number of pixels in X"
msgstr "Aantal pixels in de breedte"
-#: src/libslic3r/PrintConfig.cpp:2373
+#: src/libslic3r/PrintConfig.cpp:2601
msgid "Number of pixels in Y"
msgstr "Aantal pixels in de hoogte"
-#: src/libslic3r/PrintConfig.cpp:2378
+#: src/libslic3r/PrintConfig.cpp:2606
msgid "Display horizontal mirroring"
msgstr "Scherm horizontaal spiegelen"
-#: src/libslic3r/PrintConfig.cpp:2379
+#: src/libslic3r/PrintConfig.cpp:2607
msgid "Mirror horizontally"
msgstr "Spiegel horizontaal"
-#: src/libslic3r/PrintConfig.cpp:2380
+#: src/libslic3r/PrintConfig.cpp:2608
msgid "Enable horizontal mirroring of output images"
msgstr "Horizontaal spiegelen"
-#: src/libslic3r/PrintConfig.cpp:2385
+#: src/libslic3r/PrintConfig.cpp:2613
msgid "Display vertical mirroring"
msgstr "Scherm verticaal spiegelen"
-#: src/libslic3r/PrintConfig.cpp:2386
+#: src/libslic3r/PrintConfig.cpp:2614
msgid "Mirror vertically"
msgstr "Verticaal spiegelen"
-#: src/libslic3r/PrintConfig.cpp:2387
+#: src/libslic3r/PrintConfig.cpp:2615
msgid "Enable vertical mirroring of output images"
msgstr "Verticaal spiegelen"
-#: src/libslic3r/PrintConfig.cpp:2392
+#: src/libslic3r/PrintConfig.cpp:2620
msgid "Display orientation"
msgstr "Schermoriëntatie"
-#: src/libslic3r/PrintConfig.cpp:2393
+#: src/libslic3r/PrintConfig.cpp:2621
msgid ""
"Set the actual LCD display orientation inside the SLA printer. Portrait mode "
"will flip the meaning of display width and height parameters and the output "
@@ -9946,43 +12038,43 @@ msgstr ""
"Staande modus zal de breedte- en hoogteparameters omwisselen en de output "
"wordt 90 graden gedraaid."
-#: src/libslic3r/PrintConfig.cpp:2399
+#: src/libslic3r/PrintConfig.cpp:2627
msgid "Landscape"
msgstr "Liggend"
-#: src/libslic3r/PrintConfig.cpp:2400
+#: src/libslic3r/PrintConfig.cpp:2628
msgid "Portrait"
msgstr "Staand"
-#: src/libslic3r/PrintConfig.cpp:2405
+#: src/libslic3r/PrintConfig.cpp:2633
msgid "Fast"
msgstr "Snel"
-#: src/libslic3r/PrintConfig.cpp:2406
+#: src/libslic3r/PrintConfig.cpp:2634
msgid "Fast tilt"
-msgstr "Snelle kanteling"
+msgstr "Snelle draaiing"
-#: src/libslic3r/PrintConfig.cpp:2407
+#: src/libslic3r/PrintConfig.cpp:2635
msgid "Time of the fast tilt"
-msgstr "Tijd van de snelle kanteling"
+msgstr "Tijd van de snelle draaiing"
-#: src/libslic3r/PrintConfig.cpp:2414
+#: src/libslic3r/PrintConfig.cpp:2642
msgid "Slow"
msgstr "Langzaam"
-#: src/libslic3r/PrintConfig.cpp:2415
+#: src/libslic3r/PrintConfig.cpp:2643
msgid "Slow tilt"
-msgstr "Langzaam kantelen"
+msgstr "Langzaam draaien"
-#: src/libslic3r/PrintConfig.cpp:2416
+#: src/libslic3r/PrintConfig.cpp:2644
msgid "Time of the slow tilt"
-msgstr "Tijd van de langzame kanteling"
+msgstr "Tijd van de langzame draaiing"
-#: src/libslic3r/PrintConfig.cpp:2423
+#: src/libslic3r/PrintConfig.cpp:2651
msgid "Area fill"
msgstr "Vulgebied"
-#: src/libslic3r/PrintConfig.cpp:2424
+#: src/libslic3r/PrintConfig.cpp:2652
msgid ""
"The percentage of the bed area. \n"
"If the print area exceeds the specified value, \n"
@@ -9990,18 +12082,18 @@ msgid ""
msgstr ""
"Percentage van het printbed. \n"
"Als het printgebied buiten een specifieke waarde valt \n"
-"wordt een korte kanteling gebruikt, anders een snelle kanteling"
+"wordt een korte draaiing gebruikt, anders een snelle"
-#: src/libslic3r/PrintConfig.cpp:2431 src/libslic3r/PrintConfig.cpp:2432
-#: src/libslic3r/PrintConfig.cpp:2433
+#: src/libslic3r/PrintConfig.cpp:2659 src/libslic3r/PrintConfig.cpp:2660
+#: src/libslic3r/PrintConfig.cpp:2661
msgid "Printer scaling correction"
msgstr "Verschalingscorrectie voor printer"
-#: src/libslic3r/PrintConfig.cpp:2439 src/libslic3r/PrintConfig.cpp:2440
+#: src/libslic3r/PrintConfig.cpp:2667 src/libslic3r/PrintConfig.cpp:2668
msgid "Printer absolute correction"
msgstr "Absolute correctie voor printer"
-#: src/libslic3r/PrintConfig.cpp:2441
+#: src/libslic3r/PrintConfig.cpp:2669
msgid ""
"Will inflate or deflate the sliced 2D polygons according to the sign of the "
"correction."
@@ -10009,20 +12101,20 @@ msgstr ""
"Zal de geslicede veelhoeken uitrekken of laten krimpen, afhankelijk van de "
"correctiewaarde."
-#: src/libslic3r/PrintConfig.cpp:2447
+#: src/libslic3r/PrintConfig.cpp:2675
msgid "Elephant foot minimum width"
-msgstr "Squishcompensatiebreedte"
+msgstr "Minimale squish-compensatiebreedte"
-#: src/libslic3r/PrintConfig.cpp:2449
+#: src/libslic3r/PrintConfig.cpp:2677
msgid ""
"Minimum width of features to maintain when doing elephant foot compensation."
-msgstr "Minimale breedte van delen waarop squishcompensatie wordt toegepast."
+msgstr "Minimale breedte van delen waarop squish-compensatie wordt toegepast."
-#: src/libslic3r/PrintConfig.cpp:2456 src/libslic3r/PrintConfig.cpp:2457
+#: src/libslic3r/PrintConfig.cpp:2684 src/libslic3r/PrintConfig.cpp:2685
msgid "Printer gamma correction"
msgstr "Gammacorrectie voor printer"
-#: src/libslic3r/PrintConfig.cpp:2458
+#: src/libslic3r/PrintConfig.cpp:2686
msgid ""
"This will apply a gamma correction to the rasterized 2D polygons. A gamma "
"value of zero means thresholding with the threshold in the middle. This "
@@ -10032,43 +12124,43 @@ msgstr ""
"betekent een waarde die in het midden ligt. Dit gedrag elimineert anti-"
"aliasing zonder dat gaten in de veelhoeken verloren gaan."
-#: src/libslic3r/PrintConfig.cpp:2470 src/libslic3r/PrintConfig.cpp:2471
+#: src/libslic3r/PrintConfig.cpp:2698 src/libslic3r/PrintConfig.cpp:2699
msgid "SLA material type"
msgstr "SLA-materiaaltype"
-#: src/libslic3r/PrintConfig.cpp:2482 src/libslic3r/PrintConfig.cpp:2483
+#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2711
msgid "Initial layer height"
msgstr "Laagdikte eerste laag"
-#: src/libslic3r/PrintConfig.cpp:2489 src/libslic3r/PrintConfig.cpp:2490
+#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2718
msgid "Bottle volume"
msgstr "Flesinhoud (volume)"
-#: src/libslic3r/PrintConfig.cpp:2491
+#: src/libslic3r/PrintConfig.cpp:2719
msgid "ml"
msgstr "ml"
-#: src/libslic3r/PrintConfig.cpp:2496 src/libslic3r/PrintConfig.cpp:2497
+#: src/libslic3r/PrintConfig.cpp:2724 src/libslic3r/PrintConfig.cpp:2725
msgid "Bottle weight"
msgstr "Flesinhoud (gewicht)"
-#: src/libslic3r/PrintConfig.cpp:2498
+#: src/libslic3r/PrintConfig.cpp:2726
msgid "kg"
msgstr "kg"
-#: src/libslic3r/PrintConfig.cpp:2505
+#: src/libslic3r/PrintConfig.cpp:2733
msgid "g/ml"
msgstr "g/ml"
-#: src/libslic3r/PrintConfig.cpp:2512
+#: src/libslic3r/PrintConfig.cpp:2740
msgid "money/bottle"
msgstr "€/fles"
-#: src/libslic3r/PrintConfig.cpp:2517
+#: src/libslic3r/PrintConfig.cpp:2745
msgid "Faded layers"
msgstr "Transitielagen"
-#: src/libslic3r/PrintConfig.cpp:2518
+#: src/libslic3r/PrintConfig.cpp:2746
msgid ""
"Number of the layers needed for the exposure time fade from initial exposure "
"time to the exposure time"
@@ -10076,91 +12168,103 @@ msgstr ""
"Aantal lagen waarin de initiële belichtingstijd stapsgewijs wordt "
"teruggebracht naar de standaard belichtingstijd"
-#: src/libslic3r/PrintConfig.cpp:2525 src/libslic3r/PrintConfig.cpp:2526
+#: src/libslic3r/PrintConfig.cpp:2753 src/libslic3r/PrintConfig.cpp:2754
msgid "Minimum exposure time"
msgstr "Minimale belichtingstijd"
-#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2534
+#: src/libslic3r/PrintConfig.cpp:2761 src/libslic3r/PrintConfig.cpp:2762
msgid "Maximum exposure time"
msgstr "Maximale belichtingstijd"
-#: src/libslic3r/PrintConfig.cpp:2541 src/libslic3r/PrintConfig.cpp:2542
+#: src/libslic3r/PrintConfig.cpp:2769 src/libslic3r/PrintConfig.cpp:2770
msgid "Exposure time"
msgstr "Belichtingstijd"
-#: src/libslic3r/PrintConfig.cpp:2548 src/libslic3r/PrintConfig.cpp:2549
+#: src/libslic3r/PrintConfig.cpp:2776 src/libslic3r/PrintConfig.cpp:2777
msgid "Minimum initial exposure time"
msgstr "Minimale initiële belichtingstijd"
-#: src/libslic3r/PrintConfig.cpp:2556 src/libslic3r/PrintConfig.cpp:2557
+#: src/libslic3r/PrintConfig.cpp:2784 src/libslic3r/PrintConfig.cpp:2785
msgid "Maximum initial exposure time"
msgstr "Maximale initiële belichtingstijd"
-#: src/libslic3r/PrintConfig.cpp:2564 src/libslic3r/PrintConfig.cpp:2565
+#: src/libslic3r/PrintConfig.cpp:2792 src/libslic3r/PrintConfig.cpp:2793
msgid "Initial exposure time"
msgstr "Initiële belichtingstijd"
-#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2572
+#: src/libslic3r/PrintConfig.cpp:2799 src/libslic3r/PrintConfig.cpp:2800
msgid "Correction for expansion"
msgstr "Vergrotingscorrectie"
-#: src/libslic3r/PrintConfig.cpp:2578
+#: src/libslic3r/PrintConfig.cpp:2806
msgid "SLA print material notes"
msgstr "SLA-printmateriaal opmerkingen"
-#: src/libslic3r/PrintConfig.cpp:2579
+#: src/libslic3r/PrintConfig.cpp:2807
msgid "You can put your notes regarding the SLA print material here."
msgstr "U kunt hier opmerkingen plaatsen wat betreft het SLA-materiaal."
-#: src/libslic3r/PrintConfig.cpp:2591 src/libslic3r/PrintConfig.cpp:2602
+#: src/libslic3r/PrintConfig.cpp:2819 src/libslic3r/PrintConfig.cpp:2830
msgid "Default SLA material profile"
msgstr "Standaard SLA-materiaalprofiel"
-#: src/libslic3r/PrintConfig.cpp:2613
+#: src/libslic3r/PrintConfig.cpp:2841
msgid "Generate supports"
msgstr "Genereer support"
-#: src/libslic3r/PrintConfig.cpp:2615
+#: src/libslic3r/PrintConfig.cpp:2843
msgid "Generate supports for the models"
msgstr "Genereer support voor de modellen"
-#: src/libslic3r/PrintConfig.cpp:2620
-msgid "Support head front diameter"
-msgstr "Supportkopdiameter"
+#: src/libslic3r/PrintConfig.cpp:2848
+msgid "Pinhead front diameter"
+msgstr "Diameter voorzijde pinkop"
-#: src/libslic3r/PrintConfig.cpp:2622
+#: src/libslic3r/PrintConfig.cpp:2850
msgid "Diameter of the pointing side of the head"
msgstr "Diameter van de puntige zijde van de kop"
-#: src/libslic3r/PrintConfig.cpp:2629
-msgid "Support head penetration"
-msgstr "Supportkopinsteek"
+#: src/libslic3r/PrintConfig.cpp:2857
+msgid "Head penetration"
+msgstr "Koppenetratie"
-#: src/libslic3r/PrintConfig.cpp:2631
+#: src/libslic3r/PrintConfig.cpp:2859
msgid "How much the pinhead has to penetrate the model surface"
msgstr "Hoe ver de supportkop in het model moet steken"
-#: src/libslic3r/PrintConfig.cpp:2638
-msgid "Support head width"
-msgstr "Supportkopbreedte"
+#: src/libslic3r/PrintConfig.cpp:2866
+msgid "Pinhead width"
+msgstr "Pinkopbreedte"
-#: src/libslic3r/PrintConfig.cpp:2640
+#: src/libslic3r/PrintConfig.cpp:2868
msgid "Width from the back sphere center to the front sphere center"
msgstr "Centerafstand van de achterste tot de voorste bol"
-#: src/libslic3r/PrintConfig.cpp:2648
-msgid "Support pillar diameter"
-msgstr "Supportpijler - diameter"
+#: src/libslic3r/PrintConfig.cpp:2876
+msgid "Pillar diameter"
+msgstr "Pijlerdiameter"
-#: src/libslic3r/PrintConfig.cpp:2650
+#: src/libslic3r/PrintConfig.cpp:2878
msgid "Diameter in mm of the support pillars"
msgstr "Diameter van de supportpijlers (in mm)"
-#: src/libslic3r/PrintConfig.cpp:2658
+#: src/libslic3r/PrintConfig.cpp:2886
+msgid "Small pillar diameter percent"
+msgstr "Percentage van smalle pijlerdiameter"
+
+#: src/libslic3r/PrintConfig.cpp:2888
+msgid ""
+"The percentage of smaller pillars compared to the normal pillar diameter "
+"which are used in problematic areas where a normal pilla cannot fit."
+msgstr ""
+"Het percentage van smallere pijlers vergeleken met normale pijlerdiameters "
+"die worden gebruikt in moeilijk te bereiken plekken."
+
+#: src/libslic3r/PrintConfig.cpp:2897
msgid "Max bridges on a pillar"
msgstr "Maximaal aantal bruggen op een pijler"
-#: src/libslic3r/PrintConfig.cpp:2660
+#: src/libslic3r/PrintConfig.cpp:2899
msgid ""
"Maximum number of bridges that can be placed on a pillar. Bridges hold "
"support point pinheads and connect to pillars as small branches."
@@ -10168,11 +12272,11 @@ msgstr ""
"Maximaal aantal bruggen dat op een pijler geplaatst kan worden. Bruggen "
"houden supportpuntkop bij elkaar en verbinden pijlers as smalle takken."
-#: src/libslic3r/PrintConfig.cpp:2668
-msgid "Support pillar connection mode"
-msgstr "Supportpijler - verbindingsmodus"
+#: src/libslic3r/PrintConfig.cpp:2907
+msgid "Pillar connection mode"
+msgstr "Pijlerverbindingsmodus"
-#: src/libslic3r/PrintConfig.cpp:2669
+#: src/libslic3r/PrintConfig.cpp:2908
msgid ""
"Controls the bridge type between two neighboring pillars. Can be zig-zag, "
"cross (double zig-zag) or dynamic which will automatically switch between "
@@ -10182,23 +12286,23 @@ msgstr ""
"kruisend (dubbele zigzag) of dynamisch zijn. Dynamisch houdt in dat wordt "
"geschakeld tussen de eerste twee, afhankelijk van de pijlerafstand."
-#: src/libslic3r/PrintConfig.cpp:2677
+#: src/libslic3r/PrintConfig.cpp:2916
msgid "Zig-Zag"
msgstr "Zigzag"
-#: src/libslic3r/PrintConfig.cpp:2678
+#: src/libslic3r/PrintConfig.cpp:2917
msgid "Cross"
msgstr "Kruisend"
-#: src/libslic3r/PrintConfig.cpp:2679
+#: src/libslic3r/PrintConfig.cpp:2918
msgid "Dynamic"
msgstr "Dynamisch"
-#: src/libslic3r/PrintConfig.cpp:2691
+#: src/libslic3r/PrintConfig.cpp:2930
msgid "Pillar widening factor"
msgstr "Pijlervergrotingsfactor"
-#: src/libslic3r/PrintConfig.cpp:2693
+#: src/libslic3r/PrintConfig.cpp:2932
msgid ""
"Merging bridges or pillars into another pillars can increase the radius. "
"Zero means no increase, one means full increase."
@@ -10206,27 +12310,27 @@ msgstr ""
"Bruggen of pijlers samenvoegen met andere pijlers kan de radius vergroten. 0 "
"betekent geen vergroting, 1 betekent volle vergroting."
-#: src/libslic3r/PrintConfig.cpp:2702
+#: src/libslic3r/PrintConfig.cpp:2941
msgid "Support base diameter"
msgstr "Supportbasis - diameter"
-#: src/libslic3r/PrintConfig.cpp:2704
+#: src/libslic3r/PrintConfig.cpp:2943
msgid "Diameter in mm of the pillar base"
msgstr "Diameter van de pijlerbasis (in mm)"
-#: src/libslic3r/PrintConfig.cpp:2712
+#: src/libslic3r/PrintConfig.cpp:2951
msgid "Support base height"
msgstr "Supportbasis - hoogte"
-#: src/libslic3r/PrintConfig.cpp:2714
+#: src/libslic3r/PrintConfig.cpp:2953
msgid "The height of the pillar base cone"
msgstr "Hoogte van de pijlerbasiskegel"
-#: src/libslic3r/PrintConfig.cpp:2721
+#: src/libslic3r/PrintConfig.cpp:2960
msgid "Support base safety distance"
msgstr "Supportbasis - veilige afstand"
-#: src/libslic3r/PrintConfig.cpp:2724
+#: src/libslic3r/PrintConfig.cpp:2963
msgid ""
"The minimum distance of the pillar base from the model in mm. Makes sense in "
"zero elevation mode where a gap according to this parameter is inserted "
@@ -10236,27 +12340,27 @@ msgstr ""
"modus zonder verhoging waar een gat volgens deze parameter wordt ingevoegd "
"tussen het model en de basisplaat."
-#: src/libslic3r/PrintConfig.cpp:2734
+#: src/libslic3r/PrintConfig.cpp:2973
msgid "Critical angle"
msgstr "Kritische hoek"
-#: src/libslic3r/PrintConfig.cpp:2736
+#: src/libslic3r/PrintConfig.cpp:2975
msgid "The default angle for connecting support sticks and junctions."
msgstr "De standaardhoek voor de verbinding van supporttakken en kruisingen."
-#: src/libslic3r/PrintConfig.cpp:2744
+#: src/libslic3r/PrintConfig.cpp:2983
msgid "Max bridge length"
msgstr "Maximale bruglengte"
-#: src/libslic3r/PrintConfig.cpp:2746
+#: src/libslic3r/PrintConfig.cpp:2985
msgid "The max length of a bridge"
msgstr "Maximale bruglengte"
-#: src/libslic3r/PrintConfig.cpp:2753
+#: src/libslic3r/PrintConfig.cpp:2992
msgid "Max pillar linking distance"
msgstr "Maximale pijler-verbindafstand"
-#: src/libslic3r/PrintConfig.cpp:2755
+#: src/libslic3r/PrintConfig.cpp:2994
msgid ""
"The max distance of two pillars to get linked with each other. A zero value "
"will prohibit pillar cascading."
@@ -10264,11 +12368,7 @@ msgstr ""
"Maximale verbindingsafstand van twee pijlers. Een waarde van 0 schakelt aan "
"elkaar verbonden pijlers uit."
-#: src/libslic3r/PrintConfig.cpp:2763
-msgid "Object elevation"
-msgstr "Objectverhoging"
-
-#: src/libslic3r/PrintConfig.cpp:2765
+#: src/libslic3r/PrintConfig.cpp:3004
msgid ""
"How much the supports should lift up the supported object. If \"Pad around "
"object\" is enabled, this value is ignored."
@@ -10276,39 +12376,39 @@ msgstr ""
"Hoe veel het support omhoog moet bewegen op het ondersteunde object. Als "
"'Basisplaat rondom object' is ingeschakeld wordt deze waarde genegeerd."
-#: src/libslic3r/PrintConfig.cpp:2776
+#: src/libslic3r/PrintConfig.cpp:3015
msgid "This is a relative measure of support points density."
msgstr "Relatieve waarde van de dichtheid van supportpunten."
-#: src/libslic3r/PrintConfig.cpp:2782
+#: src/libslic3r/PrintConfig.cpp:3021
msgid "Minimal distance of the support points"
msgstr "Minimale supportpuntafstand"
-#: src/libslic3r/PrintConfig.cpp:2784
+#: src/libslic3r/PrintConfig.cpp:3023
msgid "No support points will be placed closer than this threshold."
msgstr "Minimale afstand tussen supportpunten."
-#: src/libslic3r/PrintConfig.cpp:2790
+#: src/libslic3r/PrintConfig.cpp:3029
msgid "Use pad"
msgstr "Gebruik basisplaat"
-#: src/libslic3r/PrintConfig.cpp:2792
+#: src/libslic3r/PrintConfig.cpp:3031
msgid "Add a pad underneath the supported model"
msgstr "Voeg een basisplaat toe onder het model met support"
-#: src/libslic3r/PrintConfig.cpp:2797
+#: src/libslic3r/PrintConfig.cpp:3036
msgid "Pad wall thickness"
msgstr "Basisplaat - wanddikte"
-#: src/libslic3r/PrintConfig.cpp:2799
+#: src/libslic3r/PrintConfig.cpp:3038
msgid "The thickness of the pad and its optional cavity walls."
msgstr "Dikte van de basisplaat en optionele wanden."
-#: src/libslic3r/PrintConfig.cpp:2807
+#: src/libslic3r/PrintConfig.cpp:3046
msgid "Pad wall height"
msgstr "Basisplaat - wandhoogte"
-#: src/libslic3r/PrintConfig.cpp:2808
+#: src/libslic3r/PrintConfig.cpp:3047
msgid ""
"Defines the pad cavity depth. Set to zero to disable the cavity. Be careful "
"when enabling this feature, as some resins may produce an extreme suction "
@@ -10320,19 +12420,19 @@ msgstr ""
"sommige resins een sterk zuigeffect in de holte produceren, wat het afpellen "
"van de print van het folie lastig kan maken."
-#: src/libslic3r/PrintConfig.cpp:2821
+#: src/libslic3r/PrintConfig.cpp:3060
msgid "Pad brim size"
msgstr "Basisplaat - expansie"
-#: src/libslic3r/PrintConfig.cpp:2822
+#: src/libslic3r/PrintConfig.cpp:3061
msgid "How far should the pad extend around the contained geometry"
msgstr "Hoe ver de basisplaat moet uitsteken buiten de geometrie"
-#: src/libslic3r/PrintConfig.cpp:2832
+#: src/libslic3r/PrintConfig.cpp:3071
msgid "Max merge distance"
msgstr "Maximale combineerafstand"
-#: src/libslic3r/PrintConfig.cpp:2834
+#: src/libslic3r/PrintConfig.cpp:3073
msgid ""
"Some objects can get along with a few smaller pads instead of a single big "
"one. This parameter defines how far the center of two smaller pads should "
@@ -10342,11 +12442,11 @@ msgstr ""
"van één grote. Deze parameter bepaalt hoe ver de tussenafstand van de "
"kleinere basisplaten mogen zijn."
-#: src/libslic3r/PrintConfig.cpp:2854
+#: src/libslic3r/PrintConfig.cpp:3093
msgid "Pad wall slope"
msgstr "Basisplaat - zijhoek"
-#: src/libslic3r/PrintConfig.cpp:2856
+#: src/libslic3r/PrintConfig.cpp:3095
msgid ""
"The slope of the pad wall relative to the bed plane. 90 degrees means "
"straight walls."
@@ -10354,27 +12454,23 @@ msgstr ""
"Hoek van de basisplaatzijde ten opzichte van het bed. 90 graden betekent een "
"rechte zijkant."
-#: src/libslic3r/PrintConfig.cpp:2865
-msgid "Pad around object"
-msgstr "Basisplaat rondom object"
-
-#: src/libslic3r/PrintConfig.cpp:2867
+#: src/libslic3r/PrintConfig.cpp:3106
msgid "Create pad around object and ignore the support elevation"
msgstr "Genereer basisplaat rondom object en schakel objectverhoging uit"
-#: src/libslic3r/PrintConfig.cpp:2872
+#: src/libslic3r/PrintConfig.cpp:3111
msgid "Pad around object everywhere"
msgstr "Overal basisplaat rondom object"
-#: src/libslic3r/PrintConfig.cpp:2874
+#: src/libslic3r/PrintConfig.cpp:3113
msgid "Force pad around object everywhere"
msgstr "Forceer basisplaat overal rondom het object"
-#: src/libslic3r/PrintConfig.cpp:2879
+#: src/libslic3r/PrintConfig.cpp:3118
msgid "Pad object gap"
msgstr "Basisplaat - gat"
-#: src/libslic3r/PrintConfig.cpp:2881
+#: src/libslic3r/PrintConfig.cpp:3120
msgid ""
"The gap between the object bottom and the generated pad in zero elevation "
"mode."
@@ -10382,11 +12478,11 @@ msgstr ""
"Het gat tussen de onderkant van het object en de gegenereerde basisplaat in "
"de modus zonder verhoging."
-#: src/libslic3r/PrintConfig.cpp:2890
+#: src/libslic3r/PrintConfig.cpp:3129
msgid "Pad object connector stride"
msgstr "Basisplaat - verbindingstakafstand"
-#: src/libslic3r/PrintConfig.cpp:2892
+#: src/libslic3r/PrintConfig.cpp:3131
msgid ""
"Distance between two connector sticks which connect the object and the "
"generated pad."
@@ -10394,46 +12490,46 @@ msgstr ""
"Afstand tussen twee verbindingstakken die het object verbinden aan de "
"basisplaat."
-#: src/libslic3r/PrintConfig.cpp:2899
+#: src/libslic3r/PrintConfig.cpp:3138
msgid "Pad object connector width"
msgstr "Basisplaat - verbindingstakbreedte"
-#: src/libslic3r/PrintConfig.cpp:2901
+#: src/libslic3r/PrintConfig.cpp:3140
msgid ""
"Width of the connector sticks which connect the object and the generated pad."
msgstr ""
"Breedte van de verbindingstakken die het object en de basisplaat met elkaar "
"verbinden."
-#: src/libslic3r/PrintConfig.cpp:2908
+#: src/libslic3r/PrintConfig.cpp:3147
msgid "Pad object connector penetration"
msgstr "Basisplaat - Verbindingstakinsteek"
-#: src/libslic3r/PrintConfig.cpp:2911
+#: src/libslic3r/PrintConfig.cpp:3150
msgid "How much should the tiny connectors penetrate into the model body."
msgstr "Hoe ver de verbindingstakken in het model steken."
-#: src/libslic3r/PrintConfig.cpp:2918
+#: src/libslic3r/PrintConfig.cpp:3157
msgid "Enable hollowing"
msgstr "Uithollen toestaan"
-#: src/libslic3r/PrintConfig.cpp:2920
+#: src/libslic3r/PrintConfig.cpp:3159
msgid "Hollow out a model to have an empty interior"
msgstr "Hol een model uit voor een leeg binnenste"
-#: src/libslic3r/PrintConfig.cpp:2925
+#: src/libslic3r/PrintConfig.cpp:3164
msgid "Wall thickness"
msgstr "Wanddikte"
-#: src/libslic3r/PrintConfig.cpp:2927
+#: src/libslic3r/PrintConfig.cpp:3166
msgid "Minimum wall thickness of a hollowed model."
msgstr "Minimale wanddikte van een uitgehold model."
-#: src/libslic3r/PrintConfig.cpp:2935
+#: src/libslic3r/PrintConfig.cpp:3174
msgid "Accuracy"
msgstr "Nauwkeurigheid"
-#: src/libslic3r/PrintConfig.cpp:2937
+#: src/libslic3r/PrintConfig.cpp:3176
msgid ""
"Performance vs accuracy of calculation. Lower values may produce unwanted "
"artifacts."
@@ -10441,7 +12537,7 @@ msgstr ""
"Prestatie tegenover nauwkeurigheid van berekenen. Lagere waarde kunnen "
"ongewenste artefacten produceren."
-#: src/libslic3r/PrintConfig.cpp:2947
+#: src/libslic3r/PrintConfig.cpp:3186
msgid ""
"Hollowing is done in two steps: first, an imaginary interior is calculated "
"deeper (offset plus the closing distance) in the object and then it's "
@@ -10455,55 +12551,63 @@ msgstr ""
"binnenste ronder. Bij een waarde van 0 is het binnenste vrijwel gelijk aan "
"de buitenzijde."
-#: src/libslic3r/PrintConfig.cpp:3330
+#: src/libslic3r/PrintConfig.cpp:3602
msgid "Export OBJ"
msgstr "Exporteer OBJ"
-#: src/libslic3r/PrintConfig.cpp:3331
+#: src/libslic3r/PrintConfig.cpp:3603
msgid "Export the model(s) as OBJ."
msgstr "Exporteer de modellen als OBJ-bestand."
-#: src/libslic3r/PrintConfig.cpp:3342
+#: src/libslic3r/PrintConfig.cpp:3614
msgid "Export SLA"
msgstr "Exporteer SLA"
-#: src/libslic3r/PrintConfig.cpp:3343
+#: src/libslic3r/PrintConfig.cpp:3615
msgid "Slice the model and export SLA printing layers as PNG."
msgstr "Slice het model en exporteer SLA-printlagen als PNG-bestanden."
-#: src/libslic3r/PrintConfig.cpp:3348
+#: src/libslic3r/PrintConfig.cpp:3620
msgid "Export 3MF"
msgstr "Exporteer 3MF"
-#: src/libslic3r/PrintConfig.cpp:3349
+#: src/libslic3r/PrintConfig.cpp:3621
msgid "Export the model(s) as 3MF."
msgstr "Exporteer de modellen als 3MF-bestanden."
-#: src/libslic3r/PrintConfig.cpp:3353
+#: src/libslic3r/PrintConfig.cpp:3625
msgid "Export AMF"
msgstr "Exporteer AMF"
-#: src/libslic3r/PrintConfig.cpp:3354
+#: src/libslic3r/PrintConfig.cpp:3626
msgid "Export the model(s) as AMF."
msgstr "Exporteer de modellen als AMF-bestanden."
-#: src/libslic3r/PrintConfig.cpp:3358
+#: src/libslic3r/PrintConfig.cpp:3630
msgid "Export STL"
msgstr "Exporteer STL"
-#: src/libslic3r/PrintConfig.cpp:3359
+#: src/libslic3r/PrintConfig.cpp:3631
msgid "Export the model(s) as STL."
msgstr "Exporteer de modellen als STL-bestand."
-#: src/libslic3r/PrintConfig.cpp:3364
+#: src/libslic3r/PrintConfig.cpp:3636
msgid "Slice the model and export toolpaths as G-code."
-msgstr "Slice het model en exporteer de bewegingen als gcode-bestand."
+msgstr "Slice het model en exporteer de paden als G-code-bestand."
+
+#: src/libslic3r/PrintConfig.cpp:3641
+msgid "G-code viewer"
+msgstr "G-code weergave"
-#: src/libslic3r/PrintConfig.cpp:3369
+#: src/libslic3r/PrintConfig.cpp:3642
+msgid "Visualize an already sliced and saved G-code"
+msgstr "Visualiseer een reeds opgeslagen G-code"
+
+#: src/libslic3r/PrintConfig.cpp:3647
msgid "Slice"
msgstr "Slice"
-#: src/libslic3r/PrintConfig.cpp:3370
+#: src/libslic3r/PrintConfig.cpp:3648
msgid ""
"Slice the model as FFF or SLA based on the printer_technology configuration "
"value."
@@ -10511,71 +12615,71 @@ msgstr ""
"Slice het model als FFF of SLA, gebaseerd op de 'printer_technology'-"
"configuratiewaarde."
-#: src/libslic3r/PrintConfig.cpp:3375
+#: src/libslic3r/PrintConfig.cpp:3653
msgid "Help"
msgstr "Help"
-#: src/libslic3r/PrintConfig.cpp:3376
+#: src/libslic3r/PrintConfig.cpp:3654
msgid "Show this help."
msgstr "Toon deze hulp zien."
-#: src/libslic3r/PrintConfig.cpp:3381
+#: src/libslic3r/PrintConfig.cpp:3659
msgid "Help (FFF options)"
msgstr "Help (FFF-opties)"
-#: src/libslic3r/PrintConfig.cpp:3382
+#: src/libslic3r/PrintConfig.cpp:3660
msgid "Show the full list of print/G-code configuration options."
msgstr "Toon de volledige lijst van print- of G-code-configuratie-opties."
-#: src/libslic3r/PrintConfig.cpp:3386
+#: src/libslic3r/PrintConfig.cpp:3664
msgid "Help (SLA options)"
msgstr "Help (SLA opties)"
-#: src/libslic3r/PrintConfig.cpp:3387
+#: src/libslic3r/PrintConfig.cpp:3665
msgid "Show the full list of SLA print configuration options."
msgstr "Toon de volledige lijst van SLA-printconfiguratie-opties."
-#: src/libslic3r/PrintConfig.cpp:3391
+#: src/libslic3r/PrintConfig.cpp:3669
msgid "Output Model Info"
msgstr "Output model-info"
-#: src/libslic3r/PrintConfig.cpp:3392
+#: src/libslic3r/PrintConfig.cpp:3670
msgid "Write information about the model to the console."
msgstr "Schrijf informatie over het model naar de console."
-#: src/libslic3r/PrintConfig.cpp:3396
+#: src/libslic3r/PrintConfig.cpp:3674
msgid "Save config file"
msgstr "Sla configuratiebestand op"
-#: src/libslic3r/PrintConfig.cpp:3397
+#: src/libslic3r/PrintConfig.cpp:3675
msgid "Save configuration to the specified file."
msgstr "Sla configuratie op in aangegeven bestand."
-#: src/libslic3r/PrintConfig.cpp:3407
+#: src/libslic3r/PrintConfig.cpp:3685
msgid "Align XY"
msgstr "XY uitlijnen"
-#: src/libslic3r/PrintConfig.cpp:3408
+#: src/libslic3r/PrintConfig.cpp:3686
msgid "Align the model to the given point."
msgstr "Lijn de modellen uit op het gegeven punt."
-#: src/libslic3r/PrintConfig.cpp:3413
+#: src/libslic3r/PrintConfig.cpp:3691
msgid "Cut model at the given Z."
-msgstr "Snijdt model op de ingestelde hoogte."
+msgstr "Snij model door op de ingestelde hoogte."
-#: src/libslic3r/PrintConfig.cpp:3434
+#: src/libslic3r/PrintConfig.cpp:3712
msgid "Center"
msgstr "Centreer"
-#: src/libslic3r/PrintConfig.cpp:3435
+#: src/libslic3r/PrintConfig.cpp:3713
msgid "Center the print around the given center."
msgstr "Centreer de print op het middelpunt."
-#: src/libslic3r/PrintConfig.cpp:3439
+#: src/libslic3r/PrintConfig.cpp:3717
msgid "Don't arrange"
msgstr "Niet schikken"
-#: src/libslic3r/PrintConfig.cpp:3440
+#: src/libslic3r/PrintConfig.cpp:3718
msgid ""
"Do not rearrange the given models before merging and keep their original XY "
"coordinates."
@@ -10583,27 +12687,23 @@ msgstr ""
"Herschik de modellen niet voor het samenvoegen en behoudt de originele X- en "
"Y-coördinaten."
-#: src/libslic3r/PrintConfig.cpp:3443
+#: src/libslic3r/PrintConfig.cpp:3721
msgid "Duplicate"
msgstr "Dupliceer"
-#: src/libslic3r/PrintConfig.cpp:3444
+#: src/libslic3r/PrintConfig.cpp:3722
msgid "Multiply copies by this factor."
msgstr "Meerdere kopieën van dit aantal."
-#: src/libslic3r/PrintConfig.cpp:3448
+#: src/libslic3r/PrintConfig.cpp:3726
msgid "Duplicate by grid"
msgstr "Dupliceer in raster"
-#: src/libslic3r/PrintConfig.cpp:3449
+#: src/libslic3r/PrintConfig.cpp:3727
msgid "Multiply copies by creating a grid."
msgstr "Meerdere kopieën in raster."
-#: src/libslic3r/PrintConfig.cpp:3452
-msgid "Merge"
-msgstr "Samenvoegen"
-
-#: src/libslic3r/PrintConfig.cpp:3453
+#: src/libslic3r/PrintConfig.cpp:3731
msgid ""
"Arrange the supplied models in a plate and merge them in a single model in "
"order to perform actions once."
@@ -10611,7 +12711,7 @@ msgstr ""
"Schik de toegevoegde modellen en combineer ze tot één model om eenmalig "
"acties uit te voeren."
-#: src/libslic3r/PrintConfig.cpp:3458
+#: src/libslic3r/PrintConfig.cpp:3736
msgid ""
"Try to repair any non-manifold meshes (this option is implicitly added "
"whenever we need to slice the model to perform the requested action)."
@@ -10619,31 +12719,31 @@ msgstr ""
"Probeer alle niet-gesloten meshes te repareren (deze optie is impliciet "
"toegevoegd om, wanneer dat nodig is, onmogelijke modellen toch te slicen)."
-#: src/libslic3r/PrintConfig.cpp:3462
+#: src/libslic3r/PrintConfig.cpp:3740
msgid "Rotation angle around the Z axis in degrees."
msgstr "Rotatiehoek rond de Z-as in graden."
-#: src/libslic3r/PrintConfig.cpp:3466
+#: src/libslic3r/PrintConfig.cpp:3744
msgid "Rotate around X"
msgstr "Draai over de X-as"
-#: src/libslic3r/PrintConfig.cpp:3467
+#: src/libslic3r/PrintConfig.cpp:3745
msgid "Rotation angle around the X axis in degrees."
msgstr "Rotatiehoek rond de X-as in graden."
-#: src/libslic3r/PrintConfig.cpp:3471
+#: src/libslic3r/PrintConfig.cpp:3749
msgid "Rotate around Y"
msgstr "Draai over de Y-as"
-#: src/libslic3r/PrintConfig.cpp:3472
+#: src/libslic3r/PrintConfig.cpp:3750
msgid "Rotation angle around the Y axis in degrees."
msgstr "Rotatiehoek rond de Y-as in graden."
-#: src/libslic3r/PrintConfig.cpp:3477
+#: src/libslic3r/PrintConfig.cpp:3755
msgid "Scaling factor or percentage."
msgstr "Schalingsfactor of percentage."
-#: src/libslic3r/PrintConfig.cpp:3482
+#: src/libslic3r/PrintConfig.cpp:3760
msgid ""
"Detect unconnected parts in the given model(s) and split them into separate "
"objects."
@@ -10651,27 +12751,27 @@ msgstr ""
"Detecteer niet-verbonden onderdelen in het model en deel ze op in "
"verschillende objecten."
-#: src/libslic3r/PrintConfig.cpp:3485
+#: src/libslic3r/PrintConfig.cpp:3763
msgid "Scale to Fit"
msgstr "Verschaal naar passing"
-#: src/libslic3r/PrintConfig.cpp:3486
+#: src/libslic3r/PrintConfig.cpp:3764
msgid "Scale to fit the given volume."
msgstr "Verschaal naar passing in het gegeven volume."
-#: src/libslic3r/PrintConfig.cpp:3495
+#: src/libslic3r/PrintConfig.cpp:3773
msgid "Ignore non-existent config files"
msgstr "Negeer niet-bestaande configuratiebestanden"
-#: src/libslic3r/PrintConfig.cpp:3496
+#: src/libslic3r/PrintConfig.cpp:3774
msgid "Do not fail if a file supplied to --load does not exist."
msgstr "Geef geen fout als een bestand om te laden niet bestaat."
-#: src/libslic3r/PrintConfig.cpp:3499
+#: src/libslic3r/PrintConfig.cpp:3777
msgid "Load config file"
msgstr "Laad configuratiebestand"
-#: src/libslic3r/PrintConfig.cpp:3500
+#: src/libslic3r/PrintConfig.cpp:3778
msgid ""
"Load configuration from the specified file. It can be used more than once to "
"load options from multiple files."
@@ -10679,11 +12779,11 @@ msgstr ""
"Laad configuratie uit een specifiek bestand. Dit kan meerdere keren gebruikt "
"worden om instellingen uit meerdere bestanden te laden."
-#: src/libslic3r/PrintConfig.cpp:3503
+#: src/libslic3r/PrintConfig.cpp:3781
msgid "Output File"
msgstr "Outputbestand"
-#: src/libslic3r/PrintConfig.cpp:3504
+#: src/libslic3r/PrintConfig.cpp:3782
msgid ""
"The file where the output will be written (if not specified, it will be "
"based on the input file)."
@@ -10691,11 +12791,26 @@ msgstr ""
"Het bestand waaroverheen wordt geschreven (als dit niet aangegeven is, wort "
"dit gebaseerd op het inputbestand)."
-#: src/libslic3r/PrintConfig.cpp:3514
+#: src/libslic3r/PrintConfig.cpp:3786
+msgid "Single instance mode"
+msgstr "Enkele instantiemodus"
+
+#: src/libslic3r/PrintConfig.cpp:3787
+msgid ""
+"If enabled, the command line arguments are sent to an existing instance of "
+"GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides "
+"the \"single_instance\" configuration value from application preferences."
+msgstr ""
+"Als dit is ingeschakeld worden de commando-argumenten naar een bestaande "
+"instantie van de PrusaSlicer GUI of een geopend PrusaSlicer venster "
+"gestuurd. Dit overschrijft de \"enkele instantie\"-configuratiewaarde van de "
+"programmavoorkeuren."
+
+#: src/libslic3r/PrintConfig.cpp:3798
msgid "Data directory"
msgstr "Bestandslocatie voor de data"
-#: src/libslic3r/PrintConfig.cpp:3515
+#: src/libslic3r/PrintConfig.cpp:3799
msgid ""
"Load and store settings at the given directory. This is useful for "
"maintaining different profiles or including configurations from a network "
@@ -10705,11 +12820,11 @@ msgstr ""
"verschillende profielen of het opnemen van configuraties van een "
"netwerkopslag."
-#: src/libslic3r/PrintConfig.cpp:3518
+#: src/libslic3r/PrintConfig.cpp:3802
msgid "Logging level"
msgstr "Logboekniveau"
-#: src/libslic3r/PrintConfig.cpp:3519
+#: src/libslic3r/PrintConfig.cpp:3803
msgid ""
"Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:"
"trace\n"
@@ -10719,11 +12834,11 @@ msgstr ""
"debug, 5: traceer\n"
"Voorbeeld: loglevel = 2 geeft fataal-, fout- en waarschuwingslevelberichten."
-#: src/libslic3r/PrintConfig.cpp:3525
+#: src/libslic3r/PrintConfig.cpp:3809
msgid "Render with a software renderer"
msgstr "Render met software-renderer"
-#: src/libslic3r/PrintConfig.cpp:3526
+#: src/libslic3r/PrintConfig.cpp:3810
msgid ""
"Render with a software renderer. The bundled MESA software renderer is "
"loaded instead of the default OpenGL driver."
@@ -10731,38 +12846,22 @@ msgstr ""
"Render met software-renderer. De meegeleverde MESA-software-renderer is "
"geladen in plaats van het standaard OpenGL stuurprogramma."
-#: src/libslic3r/PrintObject.cpp:108
+#: src/libslic3r/Zipper.cpp:27
+msgid "Error with zip archive"
+msgstr "Fout bij ZIP-archief"
+
+#: src/libslic3r/PrintObject.cpp:112
msgid "Processing triangulated mesh"
msgstr "Mesh aan het verwerken"
-#: src/libslic3r/PrintObject.cpp:152
+#: src/libslic3r/PrintObject.cpp:157
msgid "Generating perimeters"
msgstr "Perimeters genereren"
-#: src/libslic3r/PrintObject.cpp:255
+#: src/libslic3r/PrintObject.cpp:260
msgid "Preparing infill"
msgstr "Vulling voorbereiden"
-#: src/libslic3r/PrintObject.cpp:395
+#: src/libslic3r/PrintObject.cpp:421
msgid "Generating support material"
msgstr "Support genereren"
-
-#: src/libslic3r/GCode/PreviewData.cpp:347
-msgid "Height (mm)"
-msgstr "Hoogte (mm)"
-
-#: src/libslic3r/GCode/PreviewData.cpp:349
-msgid "Width (mm)"
-msgstr "Breedte (mm)"
-
-#: src/libslic3r/GCode/PreviewData.cpp:351
-msgid "Speed (mm/s)"
-msgstr "Snelheid (mm/s)"
-
-#: src/libslic3r/GCode/PreviewData.cpp:353
-msgid "Fan Speed (%)"
-msgstr "Ventilatorsnelheid (%)"
-
-#: src/libslic3r/GCode/PreviewData.cpp:355
-msgid "Volumetric flow rate (mm³/s)"
-msgstr "Volumetrisch debiet (mm³/s)"
diff --git a/resources/localization/pl/PrusaSlicer.mo b/resources/localization/pl/PrusaSlicer.mo
index b81f880a1..213a7eb0b 100644
--- a/resources/localization/pl/PrusaSlicer.mo
+++ b/resources/localization/pl/PrusaSlicer.mo
Binary files differ
diff --git a/resources/localization/pl/PrusaSlicer_pl.po b/resources/localization/pl/PrusaSlicer_pl.po
index d360128fc..93f13a77f 100644
--- a/resources/localization/pl/PrusaSlicer_pl.po
+++ b/resources/localization/pl/PrusaSlicer_pl.po
@@ -5,376 +5,399 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n%10 >= 2 && n%10 <=4 && (n%100 < 12 || n%100 > 14)) ? 1 : ((n%10 == 0 || n%10 == 1 || (n%10 >= 5 && n%10 <=9)) || (n%100 >= 12 && n%100 <= 14)) ? 2 : 3);\n"
-"X-Generator: Poedit 2.3\n"
-"Project-Id-Version: \n"
-"POT-Creation-Date: \n"
-"PO-Revision-Date: \n"
-"Last-Translator: \n"
-"Language-Team: \n"
-
-#: src/slic3r/GUI/MainFrame.cpp:66
-msgid " - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/releases"
-msgstr " - Pamiętaj, aby sprawdzać aktualizacje na http://github.com/prusa3d/PrusaSlicer/releases"
-
-#: src/slic3r/GUI/MainFrame.cpp:872
-msgid " was successfully sliced."
-msgstr " został pomyślnie pocięty."
-
-#: src/libslic3r/PrintConfig.cpp:215 src/libslic3r/PrintConfig.cpp:792
-#: src/libslic3r/PrintConfig.cpp:1219 src/libslic3r/PrintConfig.cpp:1282
-#: src/libslic3r/PrintConfig.cpp:1532 src/libslic3r/PrintConfig.cpp:2425
-#: src/libslic3r/PrintConfig.cpp:2767
+"X-Generator: PhraseApp (phraseapp.com)\n"
+
+#: src/slic3r/GUI/Tab.cpp:4124
+msgid "\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\nTo enable \"%1%\", please switch off \"%2%\""
+msgstr "\"%1%\" jest wyłączony ponieważ \"%2%\" znajduje się w kategorii \"%3%\".\nAby włączyć \"%1%\", wyłącz \"%2%\"."
+
+#: src/libslic3r/PrintConfig.cpp:249 src/libslic3r/PrintConfig.cpp:828
+#: src/libslic3r/PrintConfig.cpp:1148 src/libslic3r/PrintConfig.cpp:1327
+#: src/libslic3r/PrintConfig.cpp:1390 src/libslic3r/PrintConfig.cpp:1640
+#: src/libslic3r/PrintConfig.cpp:2568 src/libslic3r/PrintConfig.cpp:2805
+#: src/libslic3r/PrintConfig.cpp:2931
msgid "%"
msgstr "%"
-#: src/slic3r/GUI/GLCanvas3D.cpp:963
-#, c-format
-msgid "%.2f - %.2f mm"
-msgstr "%.2f - %.2f mm"
-
#. TRN Remove/Delete
-#: src/slic3r/GUI/Tab.cpp:3126
+#: src/slic3r/GUI/Tab.cpp:3425
msgid "%1% Preset"
msgstr "%1% Zestaw ustawień"
-#: src/slic3r/GUI/Plater.cpp:4400
+#: src/slic3r/GUI/Plater.cpp:4423
msgid "%1% printer was active at the time the target Undo / Redo snapshot was taken. Switching to %1% printer requires reloading of %1% presets."
msgstr "Drukarka %1% była aktywna podczas Cofnięcia / Powtórzenia zrzutu. Zmiana drukarki na %1% wymaga załadowania zestawów ustawień %1%."
-#: src/libslic3r/Print.cpp:1374
+#: src/slic3r/GUI/MainFrame.cpp:1585
+msgid "%1% was successfully sliced."
+msgstr "%1% został pomyślnie pocięty."
+
+#: src/libslic3r/Print.cpp:1400
msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm"
msgstr "%1%=%2% mm to zbyt mała wartość, żeby była możliwa do wydrukowania na wysokości warstwy %3% mm"
-#: src/slic3r/GUI/PresetHints.cpp:229
-#, c-format
+#: src/slic3r/GUI/PresetHints.cpp:228
+#, possible-c-format
msgid "%3.2f mm³/s at filament speed %3.2f mm/s."
msgstr "%3.2f mm³/s z prędkością filamentu %3.2f mm/s."
-#: src/slic3r/GUI/Plater.cpp:1152
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:1061
+#, possible-c-format
msgid "%d (%d shells)"
msgstr "%d (%d obrysów)"
-#: src/slic3r/GUI/Plater.cpp:1160
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:1069
+#, possible-c-format
msgid "%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d facets reversed, %d backwards edges"
msgstr "%d nieprawidłowych powierzchni, %d naprawionych krawędzi, %d powierzchni usunięto, %d powierzchni dodano, %d powierzchni odwrócono, %d odwróconych krawędzi"
-#: src/slic3r/GUI/PresetHints.cpp:270
-#, c-format
+#: src/slic3r/GUI/PresetHints.cpp:269
+#, possible-c-format
msgid "%d lines: %.2f mm"
msgstr "%d linii: %.2f mm"
-#: src/slic3r/GUI/MainFrame.cpp:1027
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:1728
+#, possible-c-format
msgid "%d presets successfully imported."
msgstr "pomyślnie zaimportowano %d zestawów ustawień."
-#: src/slic3r/GUI/MainFrame.cpp:692
-#, c-format
+#: src/slic3r/GUI/GUI_App.cpp:718
+#, possible-c-format
+msgid "%s\nDo you want to continue?"
+msgstr "%s\nKontynuować?"
+
+#: src/slic3r/GUI/MainFrame.cpp:917 src/slic3r/GUI/MainFrame.cpp:1316
+#, possible-c-format
msgid "%s &Website"
msgstr "Strona &WWW %s"
+#: src/slic3r/GUI/GUI_App.cpp:394
+#, possible-c-format
+msgid "%s - BREAKING CHANGE"
+msgstr "%s - BREAKING CHANGE"
+
+#: src/slic3r/GUI/Plater.cpp:1410
+#, possible-c-format
+msgid "%s - Drop project file"
+msgstr "%s - Upuść plik projektu"
+
#: src/slic3r/GUI/UpdateDialogs.cpp:211
-#, c-format
+#, possible-c-format
msgid "%s configuration is incompatible"
msgstr "Konfiguracja niekompatybilna: %s"
-#: src/slic3r/GUI/Field.cpp:175
-#, c-format
+#: src/slic3r/GUI/Field.cpp:223
+#, possible-c-format
msgid "%s doesn't support percentage"
msgstr "%s nie może być wartością procentową"
#: src/slic3r/GUI/MsgDialog.cpp:73
-#, c-format
+#, possible-c-format
msgid "%s error"
msgstr "błąd %s"
-#: src/slic3r/GUI/ConfigWizard.cpp:481
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:499
+#, possible-c-format
msgid "%s Family"
msgstr "Rodzina %s"
#: src/slic3r/GUI/MsgDialog.cpp:74
-#, c-format
+#, possible-c-format
msgid "%s has encountered an error"
msgstr "%s napotkał błąd"
-#: src/slic3r/GUI/GUI_App.cpp:138
-#, c-format
-msgid ""
-"%s has encountered an error. It was likely caused by running out of memory. If you are sure you have enough RAM on your system, this may also be a bug and we would be glad if you reported it.\n"
-"\n"
-"The application will now terminate."
-msgstr ""
-"Błąd %s . Prawdopodobnie wystąpił przez brak pamięci. Jeśli masz pewność, że ilość RAMu jest wystarczająca, to może to być bug, a którego zgłoszenie będziemy wdzięczni.\n"
-"\n"
-"Aplikacja zostanie zamknięta."
+#: src/slic3r/GUI/GUI_App.cpp:528
+#, possible-c-format
+msgid "%s has encountered an error. It was likely caused by running out of memory. If you are sure you have enough RAM on your system, this may also be a bug and we would be glad if you reported it.\n\nThe application will now terminate."
+msgstr "Błąd %s . Prawdopodobnie wystąpił przez brak pamięci. Jeśli masz pewność, że ilość RAMu jest wystarczająca, to może to być bug, a którego zgłoszenie będziemy wdzięczni.\n\nAplikacja zostanie zamknięta."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:222
-#, c-format
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:62
+#, possible-c-format
msgid "%s has encountered an error. It was likely caused by running out of memory. If you are sure you have enough RAM on your system, this may also be a bug and we would be glad if you reported it."
msgstr "Błąd %s . Prawdopodobnie wystąpił przez brak pamięci. Jeśli masz pewność, że ilość RAMu jest wystarczająca, to może to być bug, a którego zgłoszenie będziemy wdzięczni."
-#: src/slic3r/GUI/UpdateDialogs.cpp:308
-#, c-format
+#: src/slic3r/GUI/UpdateDialogs.cpp:309
+#, possible-c-format
msgid "%s has no configuration updates available."
msgstr "%s nie ma dostępnych aktualizacji konfiguracji."
#: src/slic3r/GUI/UpdateDialogs.cpp:148 src/slic3r/GUI/UpdateDialogs.cpp:210
-#, c-format
+#, possible-c-format
msgid "%s incompatibility"
msgstr "niekompatybilność: %s"
#: src/slic3r/GUI/UpdateDialogs.cpp:270
-#, c-format
-msgid ""
-"%s now uses an updated configuration structure.\n"
-"\n"
-"So called 'System presets' have been introduced, which hold the built-in default settings for various printers. These System presets cannot be modified, instead, users now may create their own presets inheriting settings from one of the System presets.\n"
-"An inheriting preset may either inherit a particular value from its parent or override it with a customized value.\n"
-"\n"
-"Please proceed with the %s that follows to set up the new presets and to choose whether to enable automatic preset updates."
-msgstr ""
-"%s używa teraz zaktualizowanej struktury konfiguracji.\n"
-"\n"
-"Zostały wprowadzone tzw. \"Ustawienia systemowe\", w których zachowane są domyślne ustawienia dla wielu drukarek. Te ustawienia nie mogą być modyfikowane, ale użytkownicy mogą tworzyć własne profile, bazujące na Ustawieniach systemowych.\n"
-"Zestaw ustawień może dziedziczyć wartości ustawień z profilu źródłowego lub nadpisać je własnymi.\n"
-"\n"
-"Kontynuuj do %s , które pozwoli ustawić nowe Zestawy i wybrać automatyczną aktualizację wbudowanych Zestawów."
-
-#: src/slic3r/GUI/GUI_App.cpp:820
-#, c-format
+#, possible-c-format
+msgid "%s now uses an updated configuration structure.\n\nSo called 'System presets' have been introduced, which hold the built-in default settings for various printers. These System presets cannot be modified, instead, users now may create their own presets inheriting settings from one of the System presets.\nAn inheriting preset may either inherit a particular value from its parent or override it with a customized value.\n\nPlease proceed with the %s that follows to set up the new presets and to choose whether to enable automatic preset updates."
+msgstr "%s używa teraz zaktualizowanej struktury konfiguracji.\n\nZostały wprowadzone tzw. \"Ustawienia systemowe\", w których zachowane są domyślne ustawienia dla wielu drukarek. Te ustawienia nie mogą być modyfikowane, ale użytkownicy mogą tworzyć własne profile, bazujące na Ustawieniach systemowych.\nZestaw ustawień może dziedziczyć wartości ustawień z profilu źródłowego lub nadpisać je własnymi.\n\nKontynuuj do %s , które pozwoli ustawić nowe Zestawy i wybrać automatyczną aktualizację wbudowanych Zestawów."
+
+#: src/slic3r/GUI/GUI_App.cpp:1512
+#, possible-c-format
msgid "%s View Mode"
msgstr "Tryb %s"
#: src/slic3r/GUI/UpdateDialogs.cpp:151
-#, c-format
-msgid ""
-"%s will now start updates. Otherwise it won't be able to start.\n"
-"\n"
-"Note that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n"
-"\n"
-"Updated configuration bundles:"
-msgstr ""
-"%s rozpocznie aktualizację. W innym przypadku nie będzie możliwe uruchomienie.\n"
-"\n"
-"Weź pod uwagę, że najpierw zostanie wykonany całkowity zrzut konfiguracji. Może być wczytany w dowolnym momencie, jeśli okazałoby się, że nowa wersja powoduje problemy.\n"
-"\n"
-"Zaktualizowane zestawy ustawień:"
-
-#: src/slic3r/GUI/MainFrame.cpp:705
-#, c-format
+#, possible-c-format
+msgid "%s will now start updates. Otherwise it won't be able to start.\n\nNote that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n\nUpdated configuration bundles:"
+msgstr "%s rozpocznie aktualizację. W innym przypadku nie będzie możliwe uruchomienie.\n\nWeź pod uwagę, że najpierw zostanie wykonany całkowity zrzut konfiguracji. Może być wczytany w dowolnym momencie, jeśli okazałoby się, że nowa wersja powoduje problemy.\n\nZaktualizowane zestawy ustawień:"
+
+#: src/slic3r/GUI/MainFrame.cpp:933 src/slic3r/GUI/MainFrame.cpp:937
+#: src/slic3r/GUI/MainFrame.cpp:1329
+#, possible-c-format
msgid "&About %s"
msgstr "&O %s"
-#: src/slic3r/GUI/GUI_App.cpp:908
+#: src/slic3r/GUI/MainFrame.cpp:1297
+msgid "&Collapse sidebar"
+msgstr "S&chowaj pasek narzędzi"
+
+#: src/slic3r/GUI/GUI_App.cpp:1645
msgid "&Configuration"
msgstr "&Konfiguracja"
-#: src/slic3r/GUI/GUI_App.cpp:800
+#: src/slic3r/GUI/GUI_App.cpp:1480
msgid "&Configuration Snapshots"
msgstr "Zrzuty Konfigura&cji"
-#: src/slic3r/GUI/MainFrame.cpp:588
+#: src/slic3r/GUI/MainFrame.cpp:1194
msgid "&Copy"
msgstr "&Kopiuj"
-#: src/slic3r/GUI/MainFrame.cpp:572
+#: src/slic3r/GUI/MainFrame.cpp:1178
msgid "&Delete selected"
msgstr "Usuń &zaznaczone"
-#: src/slic3r/GUI/MainFrame.cpp:722
+#: src/slic3r/GUI/MainFrame.cpp:1348 src/slic3r/GUI/MainFrame.cpp:1358
msgid "&Edit"
msgstr "&Edytuj"
-#: src/slic3r/GUI/MainFrame.cpp:506
+#: src/slic3r/GUI/MainFrame.cpp:1103
msgid "&Export"
msgstr "&Eksport"
-#: src/slic3r/GUI/MainFrame.cpp:617 src/slic3r/GUI/MainFrame.cpp:752
+#: src/slic3r/GUI/MainFrame.cpp:1224 src/slic3r/GUI/MainFrame.cpp:1451
msgid "&Filament Settings Tab"
-msgstr "Ustawienia &Filamentu"
+msgstr "Ustawienia &filamentu"
-#: src/slic3r/GUI/MainFrame.cpp:721
+#: src/slic3r/GUI/MainFrame.cpp:1347 src/slic3r/GUI/MainFrame.cpp:1357
+#: src/slic3r/GUI/MainFrame.cpp:1417
msgid "&File"
msgstr "&Plik"
-#: src/slic3r/GUI/ConfigWizard.cpp:1981
+#: src/slic3r/GUI/ConfigWizard.cpp:2492
msgid "&Finish"
msgstr "&Zakończ"
-#: src/slic3r/GUI/MainFrame.cpp:727
+#: src/slic3r/GUI/MainFrame.cpp:1141
+msgid "&G-code preview"
+msgstr "PodglÄ…d &G-code"
+
+#: src/slic3r/GUI/MainFrame.cpp:1353 src/slic3r/GUI/MainFrame.cpp:1363
+#: src/slic3r/GUI/MainFrame.cpp:1423
msgid "&Help"
msgstr "Pomo&c"
-#: src/slic3r/GUI/MainFrame.cpp:474
+#: src/slic3r/GUI/MainFrame.cpp:1065
msgid "&Import"
msgstr "&Import"
-#: src/slic3r/GUI/GUI_App.cpp:822
+#: src/slic3r/GUI/GUI_App.cpp:1517
msgid "&Language"
msgstr "Język ap&likacji"
-#: src/slic3r/GUI/MainFrame.cpp:405
+#: src/slic3r/GUI/MainFrame.cpp:986
msgid "&New Project"
msgstr "&Nowy Projekt"
-#: src/slic3r/GUI/ConfigWizard.cpp:1980
+#: src/slic3r/GUI/ConfigWizard.cpp:2491
msgid "&Next >"
msgstr "&Dalej>"
-#: src/slic3r/GUI/MainFrame.cpp:408
+#: src/slic3r/GUI/MainFrame.cpp:1391
+msgid "&Open G-code"
+msgstr "&Otwórz G-code"
+
+#: src/slic3r/GUI/MainFrame.cpp:989
msgid "&Open Project"
msgstr "&Otwórz Projekt"
-#: src/slic3r/GUI/MainFrame.cpp:591
+#: src/slic3r/GUI/MainFrame.cpp:1197
msgid "&Paste"
msgstr "Wkle&j"
-#: src/slic3r/GUI/MainFrame.cpp:606
+#: src/slic3r/GUI/MainFrame.cpp:1216
msgid "&Plater Tab"
msgstr "&Podgląd Stołu"
-#: src/slic3r/GUI/GUI_App.cpp:804
+#: src/slic3r/GUI/GUI_App.cpp:1487
msgid "&Preferences"
msgstr "&Preferencje"
-#: src/slic3r/GUI/MainFrame.cpp:540
+#: src/slic3r/GUI/MainFrame.cpp:1144 src/slic3r/GUI/MainFrame.cpp:1402
msgid "&Quit"
msgstr "WyjÅ›&cie"
-#: src/slic3r/GUI/MainFrame.cpp:583
+#: src/slic3r/GUI/MainFrame.cpp:1189
msgid "&Redo"
msgstr "Powtó&rz"
-#: src/slic3r/GUI/MainFrame.cpp:536
+#: src/slic3r/GUI/MainFrame.cpp:1137
msgid "&Repair STL file"
msgstr "Nap&rawa pliku STL"
-#: src/slic3r/GUI/MainFrame.cpp:446
+#: src/slic3r/GUI/MainFrame.cpp:1028
msgid "&Save Project"
msgstr "Zapi&sz Projekt"
-#: src/slic3r/GUI/MainFrame.cpp:565
+#: src/slic3r/GUI/MainFrame.cpp:1171
msgid "&Select all"
msgstr "Zaznacz w&szystko"
-#: src/slic3r/GUI/MainFrame.cpp:580
+#: src/slic3r/GUI/MainFrame.cpp:1186
msgid "&Undo"
msgstr "Co&fnij"
-#: src/slic3r/GUI/MainFrame.cpp:724
+#: src/slic3r/GUI/MainFrame.cpp:1350 src/slic3r/GUI/MainFrame.cpp:1360
+#: src/slic3r/GUI/MainFrame.cpp:1418
msgid "&View"
msgstr "&Widok"
-#: src/slic3r/GUI/MainFrame.cpp:723
+#: src/slic3r/GUI/MainFrame.cpp:1349 src/slic3r/GUI/MainFrame.cpp:1359
msgid "&Window"
msgstr "&Okno"
-#: src/slic3r/GUI/ConfigWizard.cpp:603 src/slic3r/GUI/ConfigWizard.cpp:631
+#: src/slic3r/GUI/ConfigWizard.cpp:662 src/slic3r/GUI/ConfigWizard.cpp:812
+#: src/slic3r/GUI/ConfigWizard.cpp:873 src/slic3r/GUI/ConfigWizard.cpp:1007
msgid "(All)"
msgstr "(Wszystko)"
-#: src/libslic3r/PrintConfig.cpp:1446
+#: src/slic3r/GUI/Plater.cpp:1195
+msgid "(including spool)"
+msgstr "(wliczajÄ…c szpulÄ™)"
+
+#: src/libslic3r/PrintConfig.cpp:1554
msgid "(minimum)"
msgstr "(minimum)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:116
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:109
msgid "(Re)slice"
msgstr "(Ponowne) Cięcie"
-#: src/slic3r/GUI/MainFrame.cpp:532
+#: src/slic3r/GUI/MainFrame.cpp:1133
msgid "(Re)Slice No&w"
msgstr "(Pono&wne) Cięcie"
-#: src/libslic3r/PrintConfig.cpp:771 src/libslic3r/PrintConfig.cpp:2587
+#: src/libslic3r/PrintConfig.cpp:807 src/libslic3r/PrintConfig.cpp:2730
msgid "(Unknown)"
msgstr "(Nieznane)"
-#: src/slic3r/GUI/MainFrame.cpp:790
+#: src/slic3r/GUI/MainFrame.cpp:1491
msgid ") not found."
msgstr ") nie znaleziono."
-#: src/libslic3r/PrintConfig.cpp:1918
+#: src/libslic3r/PrintConfig.cpp:1085
+msgid "0 (no open anchors)"
+msgstr "0 (brak otwartych kotw)"
+
+#: src/libslic3r/PrintConfig.cpp:1107
+msgid "0 (not anchored)"
+msgstr "0 (nie zakotwiczone)"
+
+#: src/libslic3r/PrintConfig.cpp:2060
msgid "0 (soluble)"
msgstr "0 (rozpuszczalne)"
-#: src/libslic3r/PrintConfig.cpp:1919
+#: src/libslic3r/PrintConfig.cpp:2061
msgid "0.2 (detachable)"
msgstr "0.2 (odłączane)"
-#: src/slic3r/GUI/MainFrame.cpp:626
+#: src/libslic3r/PrintConfig.cpp:1090 src/libslic3r/PrintConfig.cpp:1112
+msgid "1000 (unlimited)"
+msgstr "1000 (bez ograniczeń)"
+
+#: src/slic3r/GUI/MainFrame.cpp:1234
msgid "3&D"
msgstr "3&D"
-#: src/slic3r/GUI/Plater.cpp:4097
+#: src/slic3r/GUI/Plater.cpp:4044
msgid "3D editor view"
msgstr "Edytowanie 3D"
-#: src/libslic3r/PrintConfig.cpp:851
+#: src/libslic3r/PrintConfig.cpp:889
msgid "3D Honeycomb"
msgstr "Plaster miodu 3D"
-#: src/slic3r/GUI/Mouse3DController.cpp:274
+#: src/slic3r/GUI/NotificationManager.hpp:318
+msgid "3D Mouse disconnected."
+msgstr "Odłączono 3D Mouse."
+
+#: src/slic3r/GUI/Mouse3DController.cpp:263
msgid "3Dconnexion settings"
msgstr "Ustawienia 3Dconnexion"
-#: src/slic3r/GUI/Plater.cpp:5038
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:5167
+#, possible-c-format
msgid "3MF file exported to %s"
msgstr "Plik 3MF wyeksportowany do %s"
-#: src/slic3r/GUI/ConfigWizard.cpp:1979
+#: src/slic3r/GUI/ConfigWizard.cpp:2490
msgid "< &Back"
msgstr "<&Wstecz"
-#: src/libslic3r/PrintConfig.cpp:287
+#: src/libslic3r/PrintConfig.cpp:321
msgid "A boolean expression using the configuration values of an active print profile. If this expression evaluates to true, this profile is considered compatible with the active print profile."
msgstr "Wyrażenie logiczne (Boole'owskie) używające wartości konfiguracji aktywnego profilu druku. Jeśli to wyrażenie jest prawdziwe to znaczy, że aktywny profil jest kompatybilny z aktywnym profilem druku."
-#: src/libslic3r/PrintConfig.cpp:272
+#: src/libslic3r/PrintConfig.cpp:306
msgid "A boolean expression using the configuration values of an active printer profile. If this expression evaluates to true, this profile is considered compatible with the active printer profile."
msgstr "Wyrażenie logiczne (Boole'owskie) używające wartości konfiguracji aktywnego profilu drukarki. Jeśli to wyrażenie jest prawdziwe to znaczy, że aktywny profil jest kompatybilny z drukarką."
-#: src/slic3r/GUI/Tab.cpp:975
+#: src/slic3r/GUI/Tab.cpp:1237
msgid "A copy of the current system preset will be created, which will be detached from the system preset."
msgstr "Zostanie utworzona kopia obecnego zestawu ustawień i odłączona od ustawień systemowych."
-#: src/slic3r/GUI/ConfigWizard.cpp:1034
+#: src/slic3r/GUI/ConfigWizard.cpp:1400
msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS."
msgstr "Generalną zasadą jest 160 do 230 °C dla PLA i 215 do 250 °C dla ABS."
-#: src/slic3r/GUI/ConfigWizard.cpp:1048
+#: src/slic3r/GUI/ConfigWizard.cpp:1414
msgid "A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have no heated bed."
-msgstr "Generalną zasadą jest 60 °C dla PLA i 110 °C dla ABS. Ustaw zero jeśli nie masz podgrzewanego stołu."
+msgstr "Generalną zasadą jest 60 °C dla PLA i 110 °C dla ABS. Ustaw zero, jeśli nie masz podgrzewanego stołu."
-#: src/slic3r/GUI/GLCanvas3D.cpp:686
-msgid "A toolpath outside the print area was detected"
-msgstr "Wykryto ścieżkę narzędzia poza obszarem roboczym"
+#: src/slic3r/GUI/GLCanvas3D.cpp:634
+msgid "A toolpath outside the print area was detected."
+msgstr "Wykryto ścieżkę narzędzia poza obszarem roboczym."
-#: src/slic3r/GUI/AboutDialog.cpp:199
-#, c-format
+#: src/slic3r/GUI/AboutDialog.cpp:212 src/slic3r/GUI/AboutDialog.cpp:215
+#, possible-c-format
msgid "About %s"
msgstr "O %s"
-#: src/slic3r/GUI/GLCanvas3D.cpp:959
-#, c-format
-msgid "above %.2f mm"
-msgstr "powyżej %.2f mm"
+#: src/slic3r/GUI/GCodeViewer.cpp:2189
+msgid "above"
+msgstr "ponad"
-#: src/libslic3r/PrintConfig.cpp:1569
+#: src/libslic3r/PrintConfig.cpp:1677
msgid "Above Z"
msgstr "Powyżej Z"
-#: src/slic3r/GUI/Tab.cpp:1164
+#: src/slic3r/GUI/Tab.cpp:1494
msgid "Acceleration control (advanced)"
msgstr "Ustawienia przyspieszeń (zaawansowane)"
-#: src/libslic3r/PrintConfig.cpp:2925
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:221
+#: src/libslic3r/PrintConfig.cpp:3089
msgid "Accuracy"
msgstr "Dokładność"
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:59
+msgid "Accurate"
+msgstr "Dokładna"
+
+#: src/slic3r/GUI/Plater.cpp:1423
+msgid "Action"
+msgstr "Akcja"
+
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78
msgid "Activate"
msgstr "Aktywacja"
@@ -383,67 +406,75 @@ msgstr "Aktywacja"
msgid "Active"
msgstr "Aktywny"
-#: src/slic3r/GUI/DoubleSlider.cpp:1135 src/slic3r/GUI/GUI_ObjectList.cpp:1705
+#: src/slic3r/GUI/DoubleSlider.cpp:1264 src/slic3r/GUI/GUI_ObjectList.cpp:1833
msgid "active"
msgstr "aktywny"
-#: src/slic3r/GUI/GLCanvas3D.cpp:267
+#: src/slic3r/GUI/GLCanvas3D.cpp:254
msgid "Adaptive"
msgstr "Adaptacyjny"
-#: src/slic3r/GUI/Tab.cpp:241
-msgid "Add a new printer"
-msgstr "Dodaj nowÄ… drukarkÄ™"
+#: src/libslic3r/PrintConfig.cpp:894
+msgid "Adaptive Cubic"
+msgstr "Sześcienny adaptacyjny"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:314
+msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\""
+msgstr "Dodaj \"%1%\" jako kolejny zestaw ustawień dla fizycznej drukarki \"%2%\""
-#: src/libslic3r/PrintConfig.cpp:2782
+#: src/libslic3r/PrintConfig.cpp:2946
msgid "Add a pad underneath the supported model"
msgstr "Dodaj podkładkę pod podporami modelu"
-#: src/libslic3r/PrintConfig.cpp:2058
+#: src/libslic3r/PrintConfig.cpp:2200
msgid "Add a sheath (a single perimeter line) around the base support. This makes the support more reliable, but also more difficult to remove."
msgstr "Dodaj osłonę (pojedynczą linię) wokół podpory bazowej. Sprawi to, że podpory będą stabilniejsze, ale też trudniejsze do usunięcia."
-#: src/slic3r/GUI/DoubleSlider.cpp:991
+#: src/slic3r/GUI/DoubleSlider.cpp:1114
msgid "Add another code - Ctrl + Left click"
msgstr "Dodaj kolejny kod - Ctrl + kliknij lewym przyciskiem"
-#: src/slic3r/GUI/DoubleSlider.cpp:992
+#: src/slic3r/GUI/DoubleSlider.cpp:1115
msgid "Add another code - Right click"
msgstr "Dodaj kolejny kod - kliknij prawym przyciskiem"
-#: src/slic3r/GUI/DoubleSlider.cpp:1477
+#: src/slic3r/GUI/DoubleSlider.cpp:1665
msgid "Add color change"
msgstr "Dodaj zmianÄ™ koloru"
-#: src/slic3r/GUI/DoubleSlider.cpp:1180
+#: src/slic3r/GUI/DoubleSlider.cpp:1307
msgid "Add color change (%1%) for:"
msgstr "Dodaj zmianÄ™ koloru (%1%) dla:"
-#: src/slic3r/GUI/DoubleSlider.cpp:988
+#: src/slic3r/GUI/DoubleSlider.cpp:1111
msgid "Add color change - Left click"
msgstr "Dodaj zmianÄ™ koloru - kliknij lewym przyciskiem"
-#: src/slic3r/GUI/DoubleSlider.cpp:986
+#: src/slic3r/GUI/DoubleSlider.cpp:1109
msgid "Add color change - Left click for predefined color or Shift + Left click for custom color selection"
msgstr "Dodaj zmianę koloru - kliknij lewym przyciskiem dla predefiniowanego koloru lub wciśnij Shift + lewy przycisk dla wyboru własnego koloru"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
msgid "Add color change marker for current layer"
msgstr "Dodaj punkt zmiany filamentu na obecnej warstwie"
-#: src/slic3r/GUI/DoubleSlider.cpp:1490
+#: src/slic3r/GUI/DoubleSlider.cpp:1682
msgid "Add custom G-code"
msgstr "Dodaj własny G-code"
-#: src/slic3r/GUI/GLCanvas3D.cpp:240
+#: src/slic3r/GUI/DoubleSlider.cpp:1679
+msgid "Add custom template"
+msgstr "Dodaj własny szablon"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:235
msgid "Add detail"
msgstr "Wyższa szczegółowość"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:421
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:308
msgid "Add drainage hole"
msgstr "Dodaj otwór odpływowy"
-#: src/slic3r/GUI/DoubleSlider.cpp:984
+#: src/slic3r/GUI/DoubleSlider.cpp:1107
msgid "Add extruder change - Left click"
msgstr "Dodaj zmianÄ™ ekstrudera - kliknij lewym przyciskiem"
@@ -451,30 +482,30 @@ msgstr "Dodaj zmianÄ™ ekstrudera - kliknij lewym przyciskiem"
msgid "Add extruder to sequence"
msgstr "Dodaj ekstruder do sekwencji"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1993
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2152
msgid "Add Generic Subobject"
msgstr "Dodaj Standardowy Model Podrzędny"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2896
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2925
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2943
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3297
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3325
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3345
msgid "Add Height Range"
msgstr "Dodaj zakres wysokości"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4526 src/slic3r/GUI/Plater.cpp:3788
-#: src/slic3r/GUI/Plater.cpp:3800 src/slic3r/GUI/Plater.cpp:3940
+#: src/slic3r/GUI/GLCanvas3D.cpp:4892 src/slic3r/GUI/Plater.cpp:3708
+#: src/slic3r/GUI/Plater.cpp:3720 src/slic3r/GUI/Plater.cpp:3858
msgid "Add instance"
msgstr "Dodaj instancjÄ™"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:159
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:153
msgid "Add Instance of the selected object"
msgstr "Dodaj instancjÄ™ wybranego modelu"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:162
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:165
msgid "Add layer range"
msgstr "Dodaj zakres warstw"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2328
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2692
msgid "Add Layers"
msgstr "Dodaj Warstwy"
@@ -482,12 +513,12 @@ msgstr "Dodaj Warstwy"
msgid "Add modifier"
msgstr "Dodaj modyfikator"
-#: src/libslic3r/PrintConfig.cpp:479
-#, no-c-format
+#: src/libslic3r/PrintConfig.cpp:515
+#, possible-c-format
msgid "Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r keeps adding perimeters, until more than 70% of the loop immediately above is supported."
-msgstr "Dodaj więcej obrysów, aby uniknąć przerw przy pochyłych ścianach. Slic3r będzie dodawał tyle obrysów, ile jest potrzebne aby podeprzeć co najmniej 70% grubości ściany kolejnej warstwy."
+msgstr "Dodaj więcej obrysów, aby uniknąć przerw przy pochyłych ścianach. PrusaSlicer będzie dodawał tyle obrysów, ile jest potrzebne aby podeprzeć co najmniej 70% grubości ściany kolejnej warstwy."
-#: src/slic3r/GUI/Plater.cpp:3940
+#: src/slic3r/GUI/Plater.cpp:3858
msgid "Add one more instance of the selected object"
msgstr "Dodaj kolejnÄ… instancjÄ™ wybranego modelu"
@@ -495,54 +526,63 @@ msgstr "Dodaj kolejnÄ… instancjÄ™ wybranego modelu"
msgid "Add part"
msgstr "Dodaj część"
-#: src/slic3r/GUI/DoubleSlider.cpp:1487
+#: src/slic3r/GUI/DoubleSlider.cpp:1675
msgid "Add pause print"
-msgstr "Dodaj pauzÄ™ podczas druku"
+msgstr "Dodaj pauzÄ™"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:627
+#: src/slic3r/GUI/PresetComboBoxes.cpp:674
+msgid "Add physical printer"
+msgstr "Dodaj fizycznÄ… drukarkÄ™"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210
msgid "Add point"
msgstr "Dodaj punkt"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213
msgid "Add point to selection"
msgstr "Dodaj punkt do zaznaczenia"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1509
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:180
+msgid "Add preset for this printer device"
+msgstr "Dodaj zestaw ustawień do tej drukarki"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1640
msgid "Add settings"
msgstr "Dodaj ustawienia"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1386
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1517
msgid "Add Settings Bundle for Height range"
-msgstr "Dodaj Paczkę Ustawień dla Zakresu Wysokości"
+msgstr "Dodaj paczkę ustawień dla zakresu wysokości"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1388
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1519
msgid "Add Settings Bundle for Object"
-msgstr "Dodaj Paczkę Ustawień dla Modelu"
+msgstr "Dodaj paczkę ustawień dla modelu"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1387
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1518
msgid "Add Settings Bundle for Sub-object"
-msgstr "Dodaj Paczkę Ustawień dla Modelu Podrzędnego"
+msgstr "Dodaj paczkę ustawień dla modelu podrzędnego"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1314
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1445
msgid "Add Settings for Layers"
-msgstr "Dodaj Ustawienia dla Warstw"
+msgstr "Dodaj ustawienia dla warstw"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1316
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1447
msgid "Add Settings for Object"
-msgstr "Dodaj Ustawienia dla Modelu"
+msgstr "Dodaj ustawienia dla modelu"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1315
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1446
msgid "Add Settings for Sub-object"
-msgstr "Dodaj Ustawienia dla Modelu Podrzędnego"
+msgstr "Dodaj ustawienia dla modelu podrzędnego"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1793
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2051
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1953
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2210
msgid "Add Shape"
msgstr "Dodaj kształt"
-#: src/libslic3r/PrintConfig.cpp:409
+#: src/libslic3r/PrintConfig.cpp:443
msgid "Add solid infill near sloping surfaces to guarantee the vertical shell thickness (top+bottom solid layers)."
-msgstr "Dodaj zwarte wypełnienie przy pochyłych powierzchniach aby zagwarantować odpowiednią grubość warstwy (suma górnych i dolnych zwartych warstw)."
+msgstr "Dodaj zwarte wypełnienie przy pochyłych powierzchniach, aby zagwarantować odpowiednią grubość powłoki (suma górnych i dolnych zwartych warstw)."
#: src/slic3r/GUI/GUI_ObjectList.cpp:54
msgid "Add support blocker"
@@ -552,11 +592,19 @@ msgstr "Dodaj blokadę podpór"
msgid "Add support enforcer"
msgstr "Dodaj wymuszenie podpór"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:494
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:374
msgid "Add support point"
msgstr "Dodaj punkt podpory"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4467
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:371
+msgid "Add supports"
+msgstr "Dodaj podpory"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:293
+msgid "Add supports by angle"
+msgstr "Dodaj podpory wg kÄ…ta"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4833
msgid "Add..."
msgstr "Dodaj..."
@@ -564,23 +612,29 @@ msgstr "Dodaj..."
msgid "Add/Remove filaments"
msgstr "Dodaj/usuń filamenty"
-#: src/slic3r/GUI/Preset.cpp:1201
+#: src/slic3r/GUI/PresetComboBoxes.cpp:813
msgid "Add/Remove materials"
msgstr "Dodaj/usuń materiały"
-#: src/slic3r/GUI/Preset.cpp:1203
+#: src/slic3r/GUI/PresetComboBoxes.cpp:622
+#: src/slic3r/GUI/PresetComboBoxes.cpp:669
+msgid "Add/Remove presets"
+msgstr "Dodaj/usuń zestawy ustawień"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:815
+#: src/slic3r/GUI/PresetComboBoxes.cpp:972
msgid "Add/Remove printers"
msgstr "Dodaj/usuń drukarki"
-#: src/slic3r/GUI/Tab.cpp:970
+#: src/slic3r/GUI/Tab.cpp:1288
msgid "Additional information:"
msgstr "Dodatkowe informacje:"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:59
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:62
msgid "Additional Settings"
-msgstr "Ustawienia Dodatkowe"
+msgstr "Ustawienia dodatkowe"
-#: src/slic3r/GUI/ConfigWizard.cpp:791
+#: src/slic3r/GUI/ConfigWizard.cpp:1150
msgid "Additionally a backup snapshot of the whole configuration is created before an update is applied."
msgstr "Dodatkowa kopia zrzutu całej konfiguracji jest tworzona przed zainstalowaniem aktualizacji."
@@ -588,23 +642,22 @@ msgstr "Dodatkowa kopia zrzutu całej konfiguracji jest tworzona przed zainstalo
msgid "Address"
msgstr "Adres"
-#: src/slic3r/GUI/GUI_App.cpp:814 src/slic3r/GUI/GUI_ObjectList.cpp:104
-#: src/slic3r/GUI/GUI_ObjectList.cpp:622 src/slic3r/GUI/Tab.cpp:1087
-#: src/slic3r/GUI/Tab.cpp:1102 src/slic3r/GUI/Tab.cpp:1201
-#: src/slic3r/GUI/Tab.cpp:1204 src/slic3r/GUI/Tab.cpp:1470
-#: src/slic3r/GUI/Tab.cpp:1967 src/slic3r/GUI/Tab.cpp:3661
-#: src/slic3r/GUI/wxExtensions.cpp:754 src/libslic3r/PrintConfig.cpp:88
-#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:223
-#: src/libslic3r/PrintConfig.cpp:1037 src/libslic3r/PrintConfig.cpp:2276
-#: src/libslic3r/PrintConfig.cpp:2448
+#: src/slic3r/GUI/GUI_ObjectList.cpp:102 src/slic3r/GUI/GUI_ObjectList.cpp:661
+#: src/slic3r/GUI/Tab.cpp:1409 src/slic3r/GUI/Tab.cpp:1430
+#: src/slic3r/GUI/Tab.cpp:1531 src/slic3r/GUI/Tab.cpp:1534
+#: src/slic3r/GUI/Tab.cpp:1816 src/slic3r/GUI/Tab.cpp:2152
+#: src/slic3r/GUI/Tab.cpp:4080 src/libslic3r/PrintConfig.cpp:90
+#: src/libslic3r/PrintConfig.cpp:121 src/libslic3r/PrintConfig.cpp:257
+#: src/libslic3r/PrintConfig.cpp:1081 src/libslic3r/PrintConfig.cpp:2419
+#: src/libslic3r/PrintConfig.cpp:2591
msgid "Advanced"
-msgstr "Zaawansowany"
+msgstr "Zaawansowane"
-#: src/slic3r/GUI/ConfigWizard.cpp:821
+#: src/slic3r/GUI/ConfigWizard.cpp:1180
msgid "Advanced mode"
msgstr "Tryb Zaawansowany"
-#: src/slic3r/GUI/GUI_App.cpp:814
+#: src/slic3r/GUI/GUI_App.cpp:1506
msgid "Advanced View Mode"
msgstr "Widok Zaawansowany"
@@ -612,227 +665,299 @@ msgstr "Widok Zaawansowany"
msgid "Advanced: Output log"
msgstr "Zaawansowane: log wyjściowy"
-#: src/libslic3r/PrintConfig.cpp:668
+#: src/libslic3r/PrintConfig.cpp:704
msgid "After a tool change, the exact position of the newly loaded filament inside the nozzle may not be known, and the filament pressure is likely not yet stable. Before purging the print head into an infill or a sacrificial object, Slic3r will always prime this amount of material into the wipe tower to produce successive infill or sacrificial object extrusions reliably."
-msgstr "Po zmianie narzędzia (filamentu), dokładna pozycja końcówki nowo załadowanego filamentu nie jest znana i najprawdopodobniej ciśnienie w ekstruderze nie jest jeszcze ustabilizowane. Przed czyszczeniem dyszy na wypełnieniu lub zbędnym modelu, Slic3r spowoduje wytłoczenie tej ilości filamentu na wieży czyszczącej, aby wydrukować dobre wypełnienie lub zbędny model."
+msgstr "Po zmianie narzędzia (filamentu), dokładna pozycja końcówki nowo załadowanego filamentu nie jest znana i najprawdopodobniej ciśnienie w ekstruderze nie jest jeszcze ustabilizowane. Przed czyszczeniem dyszy na wypełnieniu lub zbędnym modelu, PrusaSlicer spowoduje wytłoczenie tej ilości filamentu na wieży czyszczącej, aby wydrukować dobre wypełnienie lub zbędny model."
-#: src/slic3r/GUI/Tab.cpp:1994 src/libslic3r/PrintConfig.cpp:1080
+#: src/slic3r/GUI/Tab.cpp:2182 src/libslic3r/PrintConfig.cpp:1173
msgid "After layer change G-code"
msgstr "G-code wykonywany po zmianie warstwy"
-#: src/libslic3r/PrintConfig.cpp:3398
+#: src/libslic3r/PrintConfig.cpp:3597
msgid "Align the model to the given point."
msgstr "Wyrównaj model z danym punktem."
-#: src/libslic3r/PrintConfig.cpp:3397
+#: src/libslic3r/PrintConfig.cpp:3596
msgid "Align XY"
msgstr "Wyrównaj XY"
-#: src/libslic3r/PrintConfig.cpp:1631
+#: src/libslic3r/PrintConfig.cpp:1739
msgid "Aligned"
msgstr "Wyrównany"
-#: src/slic3r/GUI/ConfigWizard.cpp:290 src/slic3r/GUI/ConfigWizard.cpp:573
-#: src/slic3r/GUI/Tab.cpp:3174
+#: src/libslic3r/PrintConfig.cpp:470 src/libslic3r/PrintConfig.cpp:902
+msgid "Aligned Rectilinear"
+msgstr "Jednokierunkowe linie równoległe"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:308 src/slic3r/GUI/ConfigWizard.cpp:598
+#: src/slic3r/GUI/Tab.cpp:3507 src/slic3r/GUI/UnsavedChangesDialog.cpp:921
msgid "All"
msgstr "Wszystko"
-#: src/libslic3r/Print.cpp:1219
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:197
+msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button"
+msgstr "Wszystkie uchwyty: obróć - lewy przycisk, przesuń - prawy przycisk"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:694
+msgid "All installed printers are compatible with the selected filament."
+msgstr "Wszystkie zainstalowane drukarki sÄ… kompatybilne z wybranym filamentem."
+
+#: src/libslic3r/Print.cpp:1245
msgid "All objects are outside of the print volume."
msgstr "Wszystkie modele znajdujÄ… siÄ™ poza obszarem roboczym."
-#: src/slic3r/GUI/Plater.cpp:4669
+#: src/slic3r/GUI/Plater.cpp:4774
msgid "All objects will be removed, continue?"
msgstr "Wszystkie modele zostaną usunięte. Kontynuować?"
-#: src/slic3r/GUI/ConfigWizard.cpp:289
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:737
+msgid "All settings changes will be discarded."
+msgstr "Wszystkie zmiany ustawień zostaną odrzucone."
+
+#: src/libslic3r/PrintConfig.cpp:1212
+msgid "All solid surfaces"
+msgstr "Wszystkie zwarte powierzchnie"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:307
msgid "All standard"
msgstr "Wszystkie podstawowe"
-#: src/libslic3r/Zipper.cpp:62
+#: src/libslic3r/PrintConfig.cpp:1210
+msgid "All top surfaces"
+msgstr "Wszystkie powierzchnie górne"
+
+#: src/libslic3r/miniz_extension.cpp:121
msgid "allocation failed"
msgstr "niepowodzenie alokacji"
-#: src/slic3r/GUI/Plater.cpp:3995
+#: src/slic3r/GUI/Preferences.cpp:161 src/slic3r/GUI/Preferences.cpp:165
+msgid "Allow just a single PrusaSlicer instance"
+msgstr "Zezwalaj tylko na pojedynczÄ… instancjÄ™ PrusaSlicer"
+
+#: src/slic3r/GUI/Plater.cpp:3915
msgid "Along X axis"
msgstr "Wzdłuż osi X"
-#: src/slic3r/GUI/Plater.cpp:3997
+#: src/slic3r/GUI/Plater.cpp:3917
msgid "Along Y axis"
msgstr "Wzdłuż osi Y"
-#: src/slic3r/GUI/Plater.cpp:3999
+#: src/slic3r/GUI/Plater.cpp:3919
msgid "Along Z axis"
msgstr "Wzdłuż osi Z"
-#: src/slic3r/GUI/ConfigWizard.cpp:222
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:160
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141
+msgid "Alt + Mouse wheel"
+msgstr "Alt + kółko myszy"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:240
msgid "Alternate nozzles:"
msgstr "Inne rozmiary dysz:"
-#: src/slic3r/GUI/Plater.cpp:5002
-#, c-format
+#: src/slic3r/GUI/Preferences.cpp:163
+msgid "Always ask for unsaved changes when selecting new preset"
+msgstr "Zawsze pytaj o niezapisane zmiany przy wyborze nowego zestawu ustawień"
+
+#: src/slic3r/GUI/Plater.cpp:5135
+#, possible-c-format
msgid "AMF file exported to %s"
msgstr "Plik AMF wyeksportowany do %s"
-#: src/slic3r/GUI/GLCanvas3D.cpp:690
-msgid ""
-"An object outside the print area was detected\n"
-"Resolve the current problem to continue slicing"
-msgstr ""
-"Wykryto model poza obszarem roboczym\n"
-"Usuń problem, aby kontynuować cięcie"
+#: src/slic3r/GUI/GLCanvas3D.cpp:638
+msgid "An object outside the print area was detected.\nResolve the current problem to continue slicing."
+msgstr "Wykryto model poza obszarem roboczym.\nRozwiąż problem, aby kontynuować cięcie."
-#: src/slic3r/GUI/GLCanvas3D.cpp:685
-msgid "An object outside the print area was detected"
-msgstr "Wykryto model poza obszarem roboczym"
+#: src/slic3r/GUI/GLCanvas3D.cpp:633
+msgid "An object outside the print area was detected."
+msgstr "Wykryto model poza obszarem roboczym."
-#: src/slic3r/GUI/Tab.cpp:2943
-msgid "and it has the following unsaved changes:"
-msgstr "i ma następujące niezapisane zmiany:"
-
-#: src/slic3r/GUI/Plater.cpp:3170
+#: src/slic3r/GUI/Plater.cpp:2972
msgid "Another export job is currently running."
msgstr "W tej chwili trwa inny proces eksportu."
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:162
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
msgid "Any arrow"
msgstr "Jakakolwiek strzałka"
-#: src/slic3r/GUI/Tab.cpp:965
+#: src/slic3r/GUI/Tab.cpp:1283
msgid "Any modifications should be saved as a new preset inherited from this one."
msgstr "Każda modyfikacja powinna zostać zapisana jako nowy zestaw ustawień dziedziczony z obecnego."
-#: src/libslic3r/PrintConfig.cpp:104
+#: src/libslic3r/PrintConfig.cpp:162
+msgid "API key"
+msgstr "Klucz API"
+
+#: src/libslic3r/PrintConfig.cpp:106
msgid "API Key / Password"
msgstr "Klucz API / hasło"
-#: src/slic3r/GUI/GUI_App.cpp:810
+#: src/slic3r/GUI/GUI_App.cpp:1493
msgid "Application preferences"
msgstr "Preferencje aplikacji"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1374
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221
msgid "Apply changes"
msgstr "Zastosuj zmiany"
-#: src/libslic3r/PrintConfig.cpp:575 src/libslic3r/PrintConfig.cpp:1708
+#: src/libslic3r/PrintConfig.cpp:611 src/libslic3r/PrintConfig.cpp:1823
msgid "approximate seconds"
msgstr "szacowane sekundy"
-#: src/libslic3r/PrintConfig.cpp:428 src/libslic3r/PrintConfig.cpp:854
+#: src/libslic3r/PrintConfig.cpp:464 src/libslic3r/PrintConfig.cpp:892
msgid "Archimedean Chords"
msgstr "Spirala Archimedesa"
-#: src/libslic3r/Zipper.cpp:88
+#: src/libslic3r/miniz_extension.cpp:147
msgid "archive is too large"
msgstr "archiwum jest zbyt duże"
-#. TRN remove/delete
-#: src/slic3r/GUI/Tab.cpp:3123
+#: src/slic3r/GUI/Tab.cpp:3420
msgid "Are you sure you want to %1% the selected preset?"
msgstr "Czy na pewno chcesz %1% ten zestaw ustawień?"
#: src/slic3r/GUI/FirmwareDialog.cpp:902
-msgid ""
-"Are you sure you want to cancel firmware flashing?\n"
-"This could leave your printer in an unusable state!"
-msgstr ""
-"Czy na pewno chcesz przerwać flashowanie firmware?\n"
-"Może to spowodować nieprzewidziane problemy z drukarką!"
+msgid "Are you sure you want to cancel firmware flashing?\nThis could leave your printer in an unusable state!"
+msgstr "Czy na pewno chcesz przerwać flashowanie firmware?\nMoże to spowodować nieprzewidziane problemy z drukarką!"
-#: src/slic3r/GUI/DoubleSlider.cpp:1903 src/slic3r/GUI/DoubleSlider.cpp:1924
+#: src/slic3r/GUI/DoubleSlider.cpp:2122 src/slic3r/GUI/DoubleSlider.cpp:2142
msgid "Are you sure you want to continue?"
msgstr "Czy na pewno chcesz kontynuować?"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1269
+#: src/slic3r/GUI/Tab.cpp:3392
+msgid "Are you sure you want to delete \"%1%\" preset from the physical printer \"%2%\"?"
+msgstr "Czy na pewno chcesz usunąć zestaw ustawień \"%1%\" z fizycznej drukarki \"%2%\"?"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:658
+msgid "Are you sure you want to delete \"%1%\" printer?"
+msgstr "Czy na pewno chcesz usunąć drukarkę \"%1%\"?"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1128
msgid "Are you sure you want to do it?"
msgstr "Czy na pewno chcesz to zrobić?"
-#: src/libslic3r/PrintConfig.cpp:2423
+#: src/libslic3r/PrintConfig.cpp:2566
msgid "Area fill"
msgstr "Wypełnienie obszaru"
-#: src/slic3r/GUI/Plater.cpp:641
+#: src/slic3r/GUI/Plater.cpp:507
msgid "Around object"
msgstr "Wokół modelu"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:157
-#: src/slic3r/GUI/Plater.cpp:2754
+#: src/slic3r/GUI/GLCanvas3D.cpp:4859 src/slic3r/GUI/KBShortcutsDialog.cpp:151
+#: src/slic3r/GUI/Plater.cpp:1549
msgid "Arrange"
msgstr "Rozmieść"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:158
+#: src/slic3r/GUI/GLCanvas3D.cpp:3889
+msgid "Arrange options"
+msgstr "Opcje rozmieszczania"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4859 src/slic3r/GUI/KBShortcutsDialog.cpp:152
msgid "Arrange selection"
msgstr "Rozmieść zaznaczone"
-#: src/libslic3r/PrintConfig.cpp:3443
+#: src/libslic3r/PrintConfig.cpp:3642
msgid "Arrange the supplied models in a plate and merge them in a single model in order to perform actions once."
msgstr "Ułóż modele na stole i połącz je w jedną grupę, aby zastosować ustawienia do wszystkich na raz."
-#: src/slic3r/GUI/Plater.cpp:2813
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:149
msgid "Arranging"
msgstr "Układanie"
-#: src/slic3r/GUI/Plater.cpp:2841
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:182
msgid "Arranging canceled."
msgstr "Układanie anulowane."
-#: src/slic3r/GUI/Plater.cpp:2842
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:183
msgid "Arranging done."
msgstr "Układanie zakończone."
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:159
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:206
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
msgid "Arrow Down"
msgstr "Strzałka w dół"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:160
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:229
msgid "Arrow Left"
msgstr "Strzałka w lewo"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:161
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:230
msgid "Arrow Right"
msgstr "Strzałka w prawo"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:204
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:214
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:158
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
msgid "Arrow Up"
msgstr "Strzałka w górę"
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:290
+#: src/slic3r/GUI/GUI_App.cpp:246
+msgid "Artwork model by Nora Al-Badri and Jan Nikolai Nelles"
+msgstr "Autorzy modelu: Nora Al-Badri oraz Jan Nikolai Nelles"
+
+#: src/slic3r/GUI/OpenGLManager.cpp:265
msgid "As a workaround, you may run PrusaSlicer with a software rendered 3D graphics by running prusa-slicer.exe with the --sw_renderer parameter."
msgstr "Jako obejście, możesz uruchomić PrusaSlicer z grafiką 3D renderowaną przez oprogramowanie, dodając parametr --sw_renderer do prusa-slicer.exe."
-#: src/slic3r/GUI/GUI_App.cpp:1086 src/slic3r/GUI/Plater.cpp:2313
-#: src/slic3r/GUI/Tab.cpp:2960
+#: src/slic3r/GUI/Preferences.cpp:154
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:659
+msgid "Ask for unsaved changes when closing application"
+msgstr "Pytaj o niezapisane zmiany podczas zamykania programu"
+
+#: src/slic3r/GUI/Preferences.cpp:161
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:660
+msgid "Ask for unsaved changes when selecting new preset"
+msgstr "Pytaj o niezapisane zmiany przy wyborze nowego zestawu ustawień"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1183 src/slic3r/GUI/Preferences.cpp:91
+msgid "Associate .3mf files to PrusaSlicer"
+msgstr "Skojarz pliki .3mf z PrusaSlicer"
+
+#: src/slic3r/GUI/Preferences.cpp:177
+msgid "Associate .gcode files to PrusaSlicer G-code Viewer"
+msgstr "Skojarz pliki .gcode z PodglÄ…dem G-code w PrusaSlicer."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1184 src/slic3r/GUI/Preferences.cpp:98
+msgid "Associate .stl files to PrusaSlicer"
+msgstr "Skojarz pliki .stl z PrusaSlicer"
+
+#: src/slic3r/GUI/GUI_App.cpp:1878 src/slic3r/GUI/Jobs/SLAImportJob.cpp:210
+#: src/slic3r/GUI/Plater.cpp:2256 src/slic3r/GUI/Tab.cpp:3189
msgid "Attention!"
msgstr "Uwaga!"
-#: src/libslic3r/PrintConfig.cpp:1871
+#: src/libslic3r/PrintConfig.cpp:150
+msgid "Authorization Type"
+msgstr "Rodzaj autoryzacji"
+
+#: src/libslic3r/PrintConfig.cpp:2013
msgid "Auto generated supports"
msgstr "Automatyczne generowanie podpór"
-#: src/slic3r/GUI/Preferences.cpp:47
+#: src/slic3r/GUI/Preferences.cpp:64
msgid "Auto-center parts"
msgstr "Rozmieść modele automatycznie"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1377
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224
msgid "Auto-generate points"
msgstr "Generuj punkty automatycznie"
-#: src/slic3r/GUI/Plater.cpp:1157
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:1066
+#, possible-c-format
msgid "Auto-repaired (%d errors)"
msgstr "Naprawiono automatycznie (%d błędów)"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:339
-#, c-format
+#: src/slic3r/GUI/GUI_ObjectList.cpp:386
+#, possible-c-format
msgid "Auto-repaired (%d errors):"
msgstr "Naprawiono automatycznie (%d błędów):"
@@ -840,67 +965,75 @@ msgstr "Naprawiono automatycznie (%d błędów):"
msgid "Autodetected"
msgstr "Wykryto automatycznie"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1273
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1134
msgid "Autogenerate support points"
msgstr "Automatycznie generuj punkty podpór"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1268
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1127
msgid "Autogeneration will erase all manually edited points."
msgstr "Generowanie automatyczne usunie wszystkie ręcznie ustawione punkty."
-#: src/slic3r/GUI/Tab.cpp:3632
+#: src/slic3r/GUI/Tab.cpp:4051
msgid "Automatic generation"
msgstr "Generowanie automatyczne"
-#: src/slic3r/GUI/ConfigWizard.cpp:761
+#: src/slic3r/GUI/ConfigWizard.cpp:1120
msgid "Automatic updates"
msgstr "Automatyczne aktualizacje"
-#: src/slic3r/GUI/MainFrame.cpp:536
+#: src/slic3r/GUI/MainFrame.cpp:1137
msgid "Automatically repair an STL file"
msgstr "Automatyczna naprawa pliku STL"
-#: src/slic3r/GUI/Tab.cpp:1171
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:129
+msgid "Autoset by angle"
+msgstr "Ustaw automatycznie wg kÄ…ta"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:233
+msgid "Autoset custom supports"
+msgstr "Automatyczne ustawienie podpór"
+
+#: src/slic3r/GUI/Tab.cpp:1501
msgid "Autospeed (advanced)"
msgstr "Automatyczne dostosowanie prędkości (zaawansowane)"
-#: src/libslic3r/PrintConfig.cpp:136
+#: src/libslic3r/PrintConfig.cpp:169
msgid "Avoid crossing perimeters"
msgstr "Unikaj ruchów nad obrysami"
-#: src/slic3r/GUI/Tab.cpp:3268
+#: src/libslic3r/PrintConfig.cpp:188
+msgid "Avoid crossing perimeters - Max detour length"
+msgstr "Unikaj ruchów nad obrysami - maksymalna długość objazdu"
+
+#: src/slic3r/GUI/Tab.cpp:3705
msgid "BACK ARROW"
msgstr "STRZAÅKA W TYÅ"
-#: src/slic3r/GUI/Tab.cpp:3290
-msgid ""
-"BACK ARROW icon indicates that the settings were changed and are not equal to the last saved preset for the current option group.\n"
-"Click to reset all settings for the current option group to the last saved preset."
-msgstr ""
-"STRZAÅKA W TYÅ oznacza, że ustawienia zostaÅ‚y zmodyfikowane i nie odpowiadajÄ… tym z ostatnio zapisanego zestawu ustawieÅ„ dla obecnej grupy opcji.\n"
-"Kliknij aby zresetować wszystkie ustawienia w obecnej grupie opcji do tych z ostatnio zapisanego zestawu ustawień."
+#: src/slic3r/GUI/Tab.cpp:3727
+msgid "BACK ARROW icon indicates that the settings were changed and are not equal to the last saved preset for the current option group.\nClick to reset all settings for the current option group to the last saved preset."
+msgstr "STRZAÅKA W TYÅ oznacza, że ustawienia zostaÅ‚y zmodyfikowane i nie odpowiadajÄ… tym z ostatnio zapisanego zestawu ustawieÅ„ dla obecnej grupy opcji.\nKliknij, aby zresetować wszystkie ustawienia w obecnej grupie opcji do tych z ostatnio zapisanego zestawu ustawieÅ„."
-#: src/slic3r/GUI/Tab.cpp:3304
-msgid ""
-"BACK ARROW icon indicates that the value was changed and is not equal to the last saved preset.\n"
-"Click to reset current value to the last saved preset."
-msgstr ""
-"STRZAÅKA W TYÅ oznacza, że ustawienia zostaÅ‚y zmodyfikowane i nie odpowiadajÄ… tym z ostatnio zapisanego zestawu ustawieÅ„.\n"
-"Kliknij aby zresetować wszystkie ustawienia do tych z ostatnio zapisanego zestawu ustawień."
+#: src/slic3r/GUI/Tab.cpp:3741
+msgid "BACK ARROW icon indicates that the value was changed and is not equal to the last saved preset.\nClick to reset current value to the last saved preset."
+msgstr "STRZAÅKA W TYÅ oznacza, że ustawienia zostaÅ‚y zmodyfikowane i nie odpowiadajÄ… tym z ostatnio zapisanego zestawu ustawieÅ„.\nKliknij, aby zresetować wszystkie ustawienia do tych z ostatnio zapisanego zestawu ustawieÅ„."
-#: src/slic3r/GUI/Preferences.cpp:55
+#: src/slic3r/GUI/Preferences.cpp:72
msgid "Background processing"
msgstr "Przetwarzanie w tle"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:351
+#: src/slic3r/GUI/GUI_ObjectList.cpp:398
msgid "backwards edges"
msgstr "odwrócone krawędzie"
-#: src/slic3r/GUI/MainFrame.cpp:174
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60
+msgid "Balanced"
+msgstr "Zbalansowana"
+
+#: src/slic3r/GUI/MainFrame.cpp:535 src/slic3r/GUI/MainFrame.cpp:537
msgid "based on Slic3r"
msgstr "bazuje na projekcie Slic3r"
-#: src/slic3r/GUI/Tab.cpp:1439
+#: src/slic3r/GUI/Tab.cpp:1785
msgid "Bed"
msgstr "Stół"
@@ -912,7 +1045,7 @@ msgstr "Własny model stołu"
msgid "Bed custom texture"
msgstr "Własna tekstura stołu"
-#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:929
+#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1295
msgid "Bed Shape"
msgstr "Kształt stołu"
@@ -920,23 +1053,23 @@ msgstr "Kształt stołu"
msgid "Bed shape"
msgstr "Kształt stołu"
-#: src/slic3r/GUI/ConfigWizard.cpp:929
+#: src/slic3r/GUI/ConfigWizard.cpp:1295
msgid "Bed Shape and Size"
msgstr "Kształt i rozmiar stołu roboczego"
-#: src/libslic3r/PrintConfig.cpp:147
+#: src/libslic3r/PrintConfig.cpp:181
msgid "Bed temperature"
msgstr "Temperatura stołu"
-#: src/libslic3r/PrintConfig.cpp:145
+#: src/libslic3r/PrintConfig.cpp:178
msgid "Bed temperature for layers after the first one. Set this to zero to disable bed temperature control commands in the output."
-msgstr "Temperatura stołu dla warstw powyżej pierwszej. Ustaw 0 aby wyłączyć kontrolowanie temperatury w pliku wyjściowym."
+msgstr "Temperatura stołu dla warstw powyżej pierwszej. Ustaw 0, aby wyłączyć kontrolowanie temperatury w pliku wyjściowym."
-#: src/slic3r/GUI/ConfigWizard.cpp:1051
+#: src/slic3r/GUI/ConfigWizard.cpp:1417
msgid "Bed Temperature:"
msgstr "Temperatura stołu:"
-#: src/slic3r/GUI/Tab.cpp:1988 src/libslic3r/PrintConfig.cpp:153
+#: src/slic3r/GUI/Tab.cpp:2175 src/libslic3r/PrintConfig.cpp:187
msgid "Before layer change G-code"
msgstr "G-code wykonywany przed zmianÄ… warstwy"
@@ -944,143 +1077,183 @@ msgstr "G-code wykonywany przed zmianÄ… warstwy"
msgid "Before roll back"
msgstr "Przez zmianÄ…"
-#: src/slic3r/GUI/Plater.cpp:640
+#: src/slic3r/GUI/Plater.cpp:506
msgid "Below object"
msgstr "Pod modelem"
-#: src/libslic3r/PrintConfig.cpp:1578
+#: src/libslic3r/PrintConfig.cpp:1686
msgid "Below Z"
msgstr "Poniżej Z"
-#: src/libslic3r/PrintConfig.cpp:164
+#: src/libslic3r/PrintConfig.cpp:198
msgid "Between objects G-code"
msgstr "G-code wykonywany przy przejściach pomiędzy modelami"
-#: src/slic3r/GUI/Tab.cpp:2006
+#: src/slic3r/GUI/Tab.cpp:2196
msgid "Between objects G-code (for sequential printing)"
msgstr "G-code wykonywany przy przejściach pomiędzy modelami (druk sekwencyjny)"
-#: src/libslic3r/PrintConfig.cpp:2489 src/libslic3r/PrintConfig.cpp:2490
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242
+msgid "Block"
+msgstr "Blokuj"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:383
+msgid "Block seam"
+msgstr "Blokuj szew"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:373
+msgid "Block supports"
+msgstr "Blokuj podpory"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:292
+msgid "Block supports by angle"
+msgstr "Blokuj podpory wg kÄ…ta"
+
+#: src/libslic3r/PrintConfig.cpp:2632 src/libslic3r/PrintConfig.cpp:2633
msgid "Bottle volume"
-msgstr "Objętość butelki"
+msgstr "Pojemność butelki"
-#: src/libslic3r/PrintConfig.cpp:2496 src/libslic3r/PrintConfig.cpp:2497
+#: src/libslic3r/PrintConfig.cpp:2639 src/libslic3r/PrintConfig.cpp:2640
msgid "Bottle weight"
msgstr "Waga butelki"
#. TRN To be shown in the main menu View->Bottom
#. TRN To be shown in Print Settings "Bottom solid layers"
#. TRN To be shown in Print Settings "Top solid layers"
-#: src/slic3r/GUI/MainFrame.cpp:665 src/libslic3r/PrintConfig.cpp:174
-#: src/libslic3r/PrintConfig.cpp:183
+#: src/slic3r/GUI/MainFrame.cpp:962 src/slic3r/GUI/MainFrame.cpp:1282
+#: src/libslic3r/PrintConfig.cpp:208 src/libslic3r/PrintConfig.cpp:217
msgid "Bottom"
msgstr "Dolne"
-#: src/libslic3r/PrintConfig.cpp:435
+#: src/libslic3r/PrintConfig.cpp:471
msgid "Bottom fill pattern"
msgstr "Wzór wypełnienia dolnej warstwy"
-#: src/slic3r/GUI/PresetHints.cpp:342
+#: src/slic3r/GUI/PresetHints.cpp:340
msgid "Bottom is open."
msgstr "Dół jest otwarty."
-#: src/slic3r/GUI/PresetHints.cpp:336
+#: src/slic3r/GUI/PresetHints.cpp:334
msgid "Bottom shell is %1% mm thick for layer height %2% mm."
msgstr "Dolna powłoka ma %1% mm grubości dla warstwy o wysokości %2% mm."
-#: src/libslic3r/PrintConfig.cpp:177
+#: src/libslic3r/PrintConfig.cpp:211
msgid "Bottom solid layers"
msgstr "Zwarte warstwy dolne"
-#: src/slic3r/GUI/MainFrame.cpp:665
+#: src/slic3r/GUI/MainFrame.cpp:962 src/slic3r/GUI/MainFrame.cpp:1282
msgid "Bottom View"
msgstr "Widok od dołu"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1432
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1464
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1468
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1595
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1599
msgid "Box"
msgstr "Sześcian"
-#: src/libslic3r/PrintConfig.cpp:193
+#: src/libslic3r/PrintConfig.cpp:227
msgid "Bridge"
msgstr "Most"
-#: src/libslic3r/PrintConfig.cpp:222
+#: src/libslic3r/PrintConfig.cpp:256
msgid "Bridge flow ratio"
msgstr "Współczynnik przepływu przy mostach"
-#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:316
+#: src/slic3r/GUI/GUI_Preview.cpp:308 src/libslic3r/ExtrusionEntity.cpp:321
+#: src/libslic3r/ExtrusionEntity.cpp:350
msgid "Bridge infill"
msgstr "Wypełnienie mostu"
-#: src/libslic3r/PrintConfig.cpp:234
+#: src/libslic3r/PrintConfig.cpp:268
msgid "Bridges"
msgstr "Mosty"
-#: src/libslic3r/PrintConfig.cpp:213
+#: src/libslic3r/PrintConfig.cpp:247
msgid "Bridges fan speed"
msgstr "Prędkość wentylatora przy mostach"
-#: src/libslic3r/PrintConfig.cpp:202
+#: src/libslic3r/PrintConfig.cpp:236
msgid "Bridging angle"
msgstr "Kąt linii mostów"
-#: src/libslic3r/PrintConfig.cpp:204
+#: src/libslic3r/PrintConfig.cpp:238
msgid "Bridging angle override. If left to zero, the bridging angle will be calculated automatically. Otherwise the provided angle will be used for all bridges. Use 180° for zero angle."
msgstr "Nadpisanie kąta linii mostów. Jeśli zostanie 0 to kąt zostanie obliczony automatycznie. W innym przypadku ustawiony kąt będzie dotyczył wszystkich mostów. Ustaw 180° dla kąta zerowego."
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:218
msgid "Bridging volumetric"
-msgstr "Mosty objętościowe"
+msgstr "Mosty objętościowo"
-#: src/slic3r/GUI/Plater.cpp:534 src/slic3r/GUI/Tab.cpp:1117
+#: src/slic3r/GUI/Plater.cpp:400 src/slic3r/GUI/Tab.cpp:1446
msgid "Brim"
msgstr "Brim"
-#: src/libslic3r/PrintConfig.cpp:244
+#: src/libslic3r/PrintConfig.cpp:278
msgid "Brim width"
msgstr "Szerokość brim"
-#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1658
-#: src/slic3r/GUI/Tab.cpp:1721
+#: src/slic3r/GUI/FirmwareDialog.cpp:805
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:271
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327
msgid "Browse"
msgstr "PrzeglÄ…daj"
-#: src/libslic3r/Zipper.cpp:82
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:28
+msgid "Brush shape"
+msgstr "Kształt pędzla"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:27
+msgid "Brush size"
+msgstr "Rozmiar pędzla"
+
+#: src/libslic3r/miniz_extension.cpp:141
msgid "buffer too small"
msgstr "niewystarczajÄ…cy bufor"
+#: src/slic3r/GUI/GUI_App.cpp:1152
+msgid "But since this version of PrusaSlicer we don't show this information in Printer Settings anymore.\nSettings will be available in physical printers settings."
+msgstr "Od tej wersji PrusaSlicer nie pokazujemy już tej informacji w Ustawieniach drukarki.\nUstawienia będą dostępne w ustawieniach fizycznej drukarki."
+
#: src/slic3r/GUI/ButtonsDescription.cpp:16
msgid "Buttons And Text Colors Description"
msgstr "Opis Przycisków i Kolorów Tekstu"
-#: src/slic3r/GUI/PresetHints.cpp:223
+#: src/slic3r/GUI/GUI_App.cpp:1084
+msgid "By default new Printer devices will be named as \"Printer N\" during its creation.\nNote: This name can be changed later from the physical printers settings"
+msgstr "Domyślnie nowe drukarki będą nazywane \"Printer N\" podczas tworzenia.\nUwaga: można to zmienić później w ustawieniach fizycznych drukarki."
+
+#: src/slic3r/GUI/PresetHints.cpp:222
msgid "by the print profile maximum"
msgstr "maksimum zależny od profilu wydruku"
-#: src/slic3r/GUI/Preferences.cpp:113
+#: src/slic3r/GUI/Preferences.cpp:178
msgid "Camera"
msgstr "Widok"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:144
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:140
msgid "Camera view"
msgstr "Widok kamery"
-#: src/slic3r/GUI/ConfigWizard.cpp:1982 src/slic3r/GUI/FirmwareDialog.cpp:151
+#: src/slic3r/GUI/ConfigWizard.cpp:2493 src/slic3r/GUI/FirmwareDialog.cpp:151
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:245
#: src/slic3r/GUI/ProgressStatusBar.cpp:26
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:644
msgid "Cancel"
msgstr "Anuluj"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:157
+#: src/slic3r/GUI/PrintHostDialogs.cpp:155
msgid "Cancel selected"
msgstr "Anuluj wybrane"
-#: src/slic3r/GUI/Plater.cpp:3669 src/slic3r/GUI/PrintHostDialogs.cpp:233
+#: src/slic3r/GUI/Plater.cpp:3589 src/slic3r/GUI/PrintHostDialogs.cpp:233
msgid "Cancelled"
msgstr "Anulowano"
-#: src/slic3r/GUI/Plater.cpp:3153 src/slic3r/GUI/PrintHostDialogs.cpp:232
+#: src/slic3r/GUI/Plater.cpp:2953 src/slic3r/GUI/PrintHostDialogs.cpp:232
msgid "Cancelling"
msgstr "Anulowanie"
@@ -1092,108 +1265,100 @@ msgstr "Anulowanie..."
msgid "Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible."
msgstr "Nie można przeliczyć szerokości ekstruzji dla %1%: zmienna \"%2%\" jest niedostępna."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3017
-msgid ""
-"Cannot insert a new layer range after the current layer range.\n"
-"Current layer range overlaps with the next layer range."
-msgstr ""
-"Nie można wstawić nowego zakresu wysokości po obecnym.\n"
-"Zakres pokrywałby się z kolejnym."
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3400
+msgid "Cannot insert a new layer range after the current layer range.\nCurrent layer range overlaps with the next layer range."
+msgstr "Nie można wstawić nowego zakresu wysokości po obecnym.\nZakres pokrywałby się z kolejnym."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3008
-msgid ""
-"Cannot insert a new layer range after the current layer range.\n"
-"The next layer range is too thin to be split to two\n"
-"without violating the minimum layer height."
-msgstr ""
-"Nie można wstawić nowego zakresu wysokości po obecnym.\n"
-"Kolejny zakres jest zbyt niski, aby można było go podzielić\n"
-"z powodu minimalnej grubości warstwy."
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3391
+msgid "Cannot insert a new layer range after the current layer range.\nThe next layer range is too thin to be split to two\nwithout violating the minimum layer height."
+msgstr "Nie można wstawić nowego zakresu wysokości po obecnym.\nKolejny zakres jest zbyt niski, aby można było go podzielić\nz powodu minimalnej grubości warstwy."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3012
-msgid ""
-"Cannot insert a new layer range between the current and the next layer range.\n"
-"The gap between the current layer range and the next layer range\n"
-"is thinner than the minimum layer height allowed."
-msgstr ""
-"Nie można wstawić nowego zakresu wysokości pomiędzy obecne.\n"
-"Odstęp pomiędzy zakresami jest niższy \n"
-"niż dozwolona minimalna wysokość warstwy."
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3395
+msgid "Cannot insert a new layer range between the current and the next layer range.\nThe gap between the current layer range and the next layer range\nis thinner than the minimum layer height allowed."
+msgstr "Nie można wstawić nowego zakresu wysokości pomiędzy obecne.\nOdstęp pomiędzy zakresami jest niższy \nniż dozwolona minimalna wysokość warstwy."
-#: src/slic3r/GUI/Tab.cpp:3073
+#: src/slic3r/GUI/SavePresetDialog.cpp:137
msgid "Cannot overwrite a system profile."
msgstr "Nie można nadpisać profilu systemowego."
-#: src/slic3r/GUI/Tab.cpp:3077
+#: src/slic3r/GUI/SavePresetDialog.cpp:142
msgid "Cannot overwrite an external profile."
msgstr "Nie można nadpisać profilu zewnętrznego."
-#: src/libslic3r/SLAPrint.cpp:613
+#: src/libslic3r/SLAPrint.cpp:627
msgid "Cannot proceed without support points! Add support points or disable support generation."
msgstr "Nie można kontynuować bez punktów podpór! Dodaj punkty podpór lub wyłącz ich generowanie."
-#: src/slic3r/GUI/Tab.cpp:1834
+#: src/slic3r/GUI/Tab.cpp:2068 src/slic3r/GUI/UnsavedChangesDialog.cpp:1066
msgid "Capabilities"
msgstr "Możliwości"
-#: src/slic3r/GUI/GUI_App.cpp:801
+#: src/slic3r/GUI/GUI_App.cpp:1481
msgid "Capture a configuration snapshot"
msgstr "Zapisz zrzut konfiguracji"
-#: src/libslic3r/PrintConfig.cpp:3424
+#: src/slic3r/GUI/ImGuiWrapper.cpp:801 src/slic3r/GUI/Search.cpp:458
+msgid "Category"
+msgstr "Kategoria"
+
+#: src/libslic3r/PrintConfig.cpp:3623
msgid "Center"
msgstr "Punkt centralny"
-#: src/libslic3r/PrintConfig.cpp:3425
+#: src/libslic3r/PrintConfig.cpp:3624
msgid "Center the print around the given center."
msgstr "Wyśrodkuj model wokół podanego punktu centralnego."
-#: src/slic3r/GUI/Tab.cpp:1728
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:329
msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*"
msgstr "Pliki certyfikatów (*.crt, *.pem)|*.crt;*.pem|Wszystkie pliki|*.*"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:180
+#: src/slic3r/GUI/SavePresetDialog.cpp:313
+msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\""
+msgstr "Zmień \"%1%\" na \"%2%\" dla fizycznej drukarki \"%3%\""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:174
msgid "Change camera type (perspective, orthographic)"
msgstr "Zmień rodzaj widoku (perspektywiczny/ortograficzny)"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:885
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:693
msgid "Change drainage hole diameter"
msgstr "Zmień średnicę otworu odpływowego"
-#: src/slic3r/GUI/DoubleSlider.cpp:1144 src/slic3r/GUI/GUI_ObjectList.cpp:1671
+#: src/slic3r/GUI/DoubleSlider.cpp:1273 src/slic3r/GUI/GUI_ObjectList.cpp:1800
msgid "Change extruder"
msgstr "Zmiana ekstrudera"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:536
+#: src/slic3r/GUI/GUI_ObjectList.cpp:574
msgid "Change Extruder"
msgstr "Zmień Ekstruder"
-#: src/slic3r/GUI/DoubleSlider.cpp:1145
+#: src/slic3r/GUI/DoubleSlider.cpp:1274
msgid "Change extruder (N/A)"
msgstr "Zmień ekstruder (N/A)"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3997
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4484
msgid "Change Extruders"
msgstr "Zmień Ekstrudery"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:152
-#, c-format
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:157
+#, possible-c-format
msgid "Change Option %s"
msgstr "Zmień Opcję %s"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3558
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4021
msgid "Change Part Type"
msgstr "Zmień Rodzaj Elementu"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:820
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:694
msgid "Change point head diameter"
msgstr "Zmień średnicę łącznika"
-#: src/slic3r/GUI/Plater.cpp:3944
+#: src/slic3r/GUI/Plater.cpp:3862
msgid "Change the number of instances of the selected object"
-msgstr "Zmień liczbę kopii wybranego modelu"
+msgstr "Zmień liczbę instancji wybranego modelu"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1589
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1718
msgid "Change type"
msgstr "Zmiana rodzaju"
@@ -1201,125 +1366,176 @@ msgstr "Zmiana rodzaju"
msgid "Changelog && Download"
msgstr "Pobierz && ListÄ™ Zmian"
-#: src/slic3r/GUI/GUI_App.cpp:442
+#: src/slic3r/GUI/GUI_App.cpp:1245
msgid "Changing of an application language"
msgstr "Zmiana języka aplikacji"
-#: src/slic3r/GUI/ConfigWizard.cpp:769 src/slic3r/GUI/Preferences.cpp:64
+#: src/slic3r/GUI/ConfigWizard.cpp:1128 src/slic3r/GUI/Preferences.cpp:81
msgid "Check for application updates"
msgstr "Sprawdź aktualizacje aplikacji"
-#: src/slic3r/GUI/GUI_App.cpp:802
+#: src/slic3r/GUI/GUI_App.cpp:1482
msgid "Check for configuration updates"
msgstr "Sprawdzaj aktualizacje konfiguracji"
-#: src/slic3r/GUI/GUI_App.cpp:802
+#: src/slic3r/GUI/GUI_App.cpp:1482
msgid "Check for updates"
msgstr "Sprawdź akt&ualizacje"
-#: src/slic3r/GUI/BedShapeDialog.cpp:532
+#: src/slic3r/Utils/PresetUpdater.cpp:412
+#: src/slic3r/Utils/PresetUpdater.cpp:420
+msgid "checking install indices"
+msgstr "sprawdzanie zainstalowanych indeksów"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:608
msgid "Choose a file to import bed texture from (PNG/SVG):"
msgstr "Wybierz plik, z którego ma być zaimportowana tekstura stołu (PNG/SVG):"
-#: src/slic3r/GUI/MainFrame.cpp:773
+#: src/slic3r/GUI/MainFrame.cpp:1474
msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):"
msgstr "Wybierz plik do pocięcia (STL/OBJ/AMF/3MF/PRUSA):"
-#: src/slic3r/GUI/BedShapeDialog.cpp:555
+#: src/slic3r/GUI/BedShapeDialog.cpp:631
msgid "Choose an STL file to import bed model from:"
msgstr "Wybierz plik STL, z którego ma być zaimportowany model stołu:"
-#: src/slic3r/GUI/BedShapeDialog.cpp:487
+#: src/slic3r/GUI/BedShapeDialog.cpp:563
msgid "Choose an STL file to import bed shape from:"
msgstr "Wybierz plik STL, z którego ma być zaimportowany kształt stołu:"
-#: src/slic3r/GUI/GUI_App.cpp:555
+#: src/slic3r/GUI/GUI_App.cpp:1208
msgid "Choose one file (3MF/AMF):"
msgstr "Wybierz jeden plik (3MF/AMF):"
-#: src/slic3r/GUI/GUI_App.cpp:567
+#: src/slic3r/GUI/GUI_App.cpp:1233
+msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):"
+msgstr "Wybierz jeden plik (GCODE/.GCO/.G/.ngc/NGC):"
+
+#: src/slic3r/GUI/GUI_App.cpp:1220
msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):"
msgstr "Wybierz jeden lub więcej plików (STL/OBJ/AMF/3MF/PRUSA):"
-#: src/slic3r/GUI/ConfigWizard.cpp:895
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:35
+msgid "Choose SLA archive:"
+msgstr "Wybierz archiwum SLA:"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1261
msgid "Choose the type of firmware used by your printer."
msgstr "Wybierz rodzaj firmware używanego przez Twoją drukarkę."
-#: src/slic3r/GUI/BedShapeDialog.cpp:89
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36
+msgid "Circle"
+msgstr "Koło"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:142
msgid "Circular"
msgstr "Okrągły"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4624 src/slic3r/GUI/GLCanvas3D.cpp:4657
-msgid "Click right mouse button to open History"
-msgstr "Kliknij prawym przyciskiem myszy, aby otworzyć Historię"
+#: src/slic3r/GUI/GLCanvas3D.cpp:5028 src/slic3r/GUI/GLCanvas3D.cpp:5067
+msgid "Click right mouse button to open/close History"
+msgstr "Kliknij prawym przyciskiem myszy, aby otworzyć/zamknąć historię"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:404
+#: src/slic3r/GUI/GLCanvas3D.cpp:4341
+msgid "Click right mouse button to show arrangement options"
+msgstr "Naciśnij prawy przycisk myszki, aby pokazać opcje rozmieszczania"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:451
msgid "Click the icon to change the object printable property"
msgstr "Kliknij na ikonę, aby włączyć/wyłączyć drukowanie modelu"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:398
+#: src/slic3r/GUI/GUI_ObjectList.cpp:445
msgid "Click the icon to change the object settings"
msgstr "Kliknij na ikonę, aby zmienić ustawienia modelu"
-#: src/slic3r/GUI/Plater.cpp:343
+#: src/slic3r/GUI/PresetComboBoxes.cpp:566
msgid "Click to edit preset"
-msgstr "Kliknij aby edytować zestaw ustawień"
+msgstr "Kliknij, aby edytować zestaw ustawień"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2071
+msgid "Click to hide"
+msgstr "Kliknij, aby ukryć"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2071
+msgid "Click to show"
+msgstr "Kliknij, aby pokazać"
-#: src/libslic3r/PrintConfig.cpp:252
+#: src/libslic3r/PrintConfig.cpp:286
msgid "Clip multi-part objects"
msgstr "Przycinaj modele kilkuczęściowe"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:25
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57
msgid "Clipping of view"
msgstr "Widok przecinania"
#: src/slic3r/GUI/FirmwareDialog.cpp:852
-#: src/slic3r/GUI/Mouse3DController.cpp:364
-#: src/slic3r/GUI/PrintHostDialogs.cpp:161
+#: src/slic3r/GUI/Mouse3DController.cpp:353
+#: src/slic3r/GUI/PrintHostDialogs.cpp:159
msgid "Close"
msgstr "Zamknij"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45
-#: src/libslic3r/PrintConfig.cpp:2934
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44
+#: src/libslic3r/PrintConfig.cpp:3098
msgid "Closing distance"
msgstr "Dystans domykania"
-#: src/slic3r/GUI/Plater.cpp:1260 src/libslic3r/PrintConfig.cpp:582
+#: src/slic3r/GUI/MainFrame.cpp:1297 src/slic3r/GUI/Plater.cpp:2144
+msgid "Collapse sidebar"
+msgstr "Zwiń pasek narzędzi"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:180
+msgid "Collapse/Expand the sidebar"
+msgstr "Zwiń/rozwiń pasek narzędzi"
+
+#: src/slic3r/GUI/Plater.cpp:1198 src/libslic3r/PrintConfig.cpp:618
msgid "Color"
msgstr "Kolor"
-#: src/slic3r/GUI/DoubleSlider.cpp:1005
+#: src/slic3r/GUI/GCodeViewer.cpp:2410 src/slic3r/GUI/GCodeViewer.cpp:2438
+msgid "Color change"
+msgstr "Zmiana koloru"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1130
msgid "Color change (\"%1%\")"
msgstr "Zmiana koloru (\"%1%\")"
-#: src/slic3r/GUI/DoubleSlider.cpp:1006
+#: src/slic3r/GUI/DoubleSlider.cpp:1131
msgid "Color change (\"%1%\") for Extruder %2%"
msgstr "Zmiana koloru (\"%1%\") dla ekstrudera %2%"
-#: src/slic3r/GUI/GLCanvas3D.cpp:995
-#, c-format
-msgid "Color change for Extruder %d at %.2f mm"
-msgstr "Zmiana koloru dla ekstrudera %d na wysokości %.2f mm"
+#: src/slic3r/GUI/Tab.cpp:2203
+msgid "Color Change G-code"
+msgstr "G-code dla zmiany koloru"
+
+#: src/libslic3r/PrintConfig.cpp:1960
+msgid "Color change G-code"
+msgstr "G-code dla zmiany koloru"
-#: src/slic3r/GUI/GUI_Preview.cpp:228 src/slic3r/GUI/GUI_Preview.cpp:572
-#: src/libslic3r/GCode/PreviewData.cpp:359
+#: src/slic3r/GUI/GCodeViewer.cpp:2531 src/slic3r/GUI/GUI_Preview.cpp:1475
+msgid "Color changes"
+msgstr "Zmiany koloru"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2242 src/slic3r/GUI/GUI_Preview.cpp:282
+#: src/slic3r/GUI/GUI_Preview.cpp:784 src/libslic3r/GCode/PreviewData.cpp:364
msgid "Color Print"
msgstr "Zmiana Koloru"
-#: src/libslic3r/PrintConfig.cpp:260
+#: src/libslic3r/PrintConfig.cpp:294
msgid "Colorprint height"
msgstr "Wysokość (warstwa) zmiany koloru"
-#: src/libslic3r/PrintConfig.cpp:990
+#: src/libslic3r/PrintConfig.cpp:1034
msgid "Combine infill every"
msgstr "Scalaj wypełnienie co"
-#: src/libslic3r/PrintConfig.cpp:995
+#: src/libslic3r/PrintConfig.cpp:1039
msgid "Combine infill every n layers"
msgstr "Scalaj wypełnienie co n warstw"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:154
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:148
msgid "Commands"
msgstr "Komendy"
@@ -1327,23 +1543,23 @@ msgstr "Komendy"
msgid "Comment:"
msgstr "Komentarz:"
-#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:280
+#: src/slic3r/GUI/Tab.cpp:107 src/libslic3r/PrintConfig.cpp:314
msgid "Compatible print profiles"
msgstr "Kompatybilne profile druku"
-#: src/libslic3r/PrintConfig.cpp:286
+#: src/libslic3r/PrintConfig.cpp:320
msgid "Compatible print profiles condition"
msgstr "Warunki kompatybilności profili druku"
-#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:265
+#: src/slic3r/GUI/Tab.cpp:101 src/libslic3r/PrintConfig.cpp:299
msgid "Compatible printers"
msgstr "Kompatybilne drukarki"
-#: src/libslic3r/PrintConfig.cpp:271
+#: src/libslic3r/PrintConfig.cpp:305
msgid "Compatible printers condition"
msgstr "Warunki kompatybilności z drukarką"
-#: src/libslic3r/PrintConfig.cpp:304
+#: src/libslic3r/PrintConfig.cpp:338
msgid "Complete individual objects"
msgstr "Druk sekwencyjny (model po modelu)"
@@ -1351,27 +1567,27 @@ msgstr "Druk sekwencyjny (model po modelu)"
msgid "Completed"
msgstr "Zakończono"
-#: src/libslic3r/Zipper.cpp:54
+#: src/libslic3r/miniz_extension.cpp:113
msgid "compression failed"
msgstr "niepowodzenie kompresji"
-#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:849
+#: src/libslic3r/PrintConfig.cpp:462 src/libslic3r/PrintConfig.cpp:887
msgid "Concentric"
msgstr "Koncentryczny"
-#: src/slic3r/GUI/ConfigWizard.cpp:2110
+#: src/slic3r/GUI/ConfigWizard.cpp:2625
msgid "Configuration &Assistant"
msgstr "&Asystent Konfiguracji"
-#: src/slic3r/GUI/ConfigWizard.cpp:2113
+#: src/slic3r/GUI/ConfigWizard.cpp:2628
msgid "Configuration &Wizard"
msgstr "Asystent Ko&nfiguracji"
-#: src/slic3r/GUI/ConfigWizard.cpp:2109
+#: src/slic3r/GUI/ConfigWizard.cpp:2624
msgid "Configuration Assistant"
msgstr "Asystent konfiguracji"
-#: src/libslic3r/PrintConfig.cpp:1316
+#: src/libslic3r/PrintConfig.cpp:1424
msgid "Configuration notes"
msgstr "Notatki konfiguracyjne"
@@ -1387,11 +1603,15 @@ msgstr "Aktualizacja konfiguracji"
msgid "Configuration update is available"
msgstr "Dostępna jest aktualizacja konfiguracji"
-#: src/slic3r/GUI/UpdateDialogs.cpp:303
+#: src/slic3r/GUI/NotificationManager.hpp:321
+msgid "Configuration update is available."
+msgstr "Dostępna jest aktualizacja konfiguracji."
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:304
msgid "Configuration updates"
msgstr "Aktualizacje konfiguracji"
-#: src/slic3r/GUI/ConfigWizard.cpp:2112
+#: src/slic3r/GUI/ConfigWizard.cpp:2627
msgid "Configuration Wizard"
msgstr "Asystent Konfiguracji"
@@ -1399,15 +1619,19 @@ msgstr "Asystent Konfiguracji"
msgid "Confirmation"
msgstr "Potwierdzenie"
-#: src/slic3r/GUI/Tab.cpp:1931
-msgid "Connection failed."
-msgstr "Błąd połączenia."
+#: src/libslic3r/PrintConfig.cpp:1070
+msgid "Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. PrusaSlicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max. Set this parameter to zero to disable anchoring perimeters connected to a single infill line."
+msgstr "ÅÄ…czenie wypeÅ‚nienia z wewnÄ™trznym obrysem przez dodanie krótkiego segmentu obrysu. JeÅ›li wyrażone w procentach (np. 15%), zostanie obliczone z szerokoÅ›ci Å›cieżki wypeÅ‚nienia. PrusaSlicer spróbuje poÅ‚Ä…czyć dwie najbliższe linie wypeÅ‚nienia krótkim segmentem obrysu. JeÅ›li nie zostanie znaleziony segment krótszy, niż parametr infill_anchor_max, linia wypeÅ‚nienia zostanie doÅ‚Ä…czona do segmentu obrysu tylko z jednej strony, a dÅ‚ugość segmentu bÄ™dzie ograniczona do wartoÅ›ci tego parametru, ale nie dÅ‚uższa niż anchor_length_max. Ustaw zero, aby wyÅ‚Ä…czyć kotwiczenie obrysów do pojedynczej linii wypeÅ‚nienia."
+
+#: src/libslic3r/PrintConfig.cpp:1097
+msgid "Connect an infill line to an internal perimeter with a short segment of an additional perimeter. If expressed as percentage (example: 15%) it is calculated over infill extrusion width. PrusaSlicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter. Set this parameter to zero to disable anchoring."
+msgstr "ÅÄ…czenie wypeÅ‚nienia z wewnÄ™trznym obrysem przez dodanie krótkiego segmentu obrysu. JeÅ›li wyrażone w procentach (np. 15%), zostanie obliczone z szerokoÅ›ci Å›cieżki wypeÅ‚nienia. PrusaSlicer spróbuje poÅ‚Ä…czyć dwie najbliższe linie wypeÅ‚nienia krótkim segmentem obrysu. JeÅ›li nie zostanie znaleziony segment krótszy, niż ten parametr, linia wypeÅ‚nienia zostanie doÅ‚Ä…czona do segmentu obrysu tylko z jednej strony, a dÅ‚ugość segmentu bÄ™dzie ograniczona do wartoÅ›ci parametru infill_anchor, ale nie dÅ‚uższa niż ten parametr. Ustaw zero, aby wyÅ‚Ä…czyć kotwiczenie."
-#: src/slic3r/GUI/Tab.cpp:3627
+#: src/slic3r/GUI/Tab.cpp:4046
msgid "Connection of the support sticks and junctions"
msgstr "ÅÄ…czenia sÅ‚upków i skrzyżowaÅ„ podpór"
-#: src/slic3r/Utils/AstroBox.cpp:83
+#: src/slic3r/Utils/AstroBox.cpp:84
msgid "Connection to AstroBox works correctly."
msgstr "Połączenie z AstroBox pomyślne."
@@ -1423,124 +1647,148 @@ msgstr "Połączenie z FlashAir działa poprawnie a przesyłanie jest włączone
msgid "Connection to OctoPrint works correctly."
msgstr "Połączenie z OctoPrint pomyślne."
-#: src/slic3r/GUI/Tab.cpp:1928
-msgid "Connection to printer works correctly."
-msgstr "Połączenie z drukarką pomyślne."
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:260
+msgid "Connection to printers connected via the print host failed."
+msgstr "Niepowodzenie połączenia z drukarką podłączoną do serwera druku."
-#: src/slic3r/Utils/OctoPrint.cpp:176
+#: src/slic3r/Utils/OctoPrint.cpp:185
msgid "Connection to Prusa SL1 works correctly."
msgstr "Połączenie z Prusa SL1 działa prawidłowo."
-#: src/libslic3r/PrintConfig.cpp:1909
+#: src/libslic3r/PrintConfig.cpp:2051
msgid "Contact Z distance"
msgstr "Odstęp w osi Z"
-#: src/slic3r/GUI/AboutDialog.cpp:261
+#: src/slic3r/GUI/AboutDialog.cpp:286
msgid "Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and numerous others."
msgstr "Wkład: Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik i wielu innych."
-#: src/libslic3r/PrintConfig.cpp:2659
+#: src/slic3r/GUI/GUI_App.cpp:245
+msgid "Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others."
+msgstr "Swój wkład mają: Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas Meszaros, Lukas Matena, Vojtech Kral, David Kocik oraz wielu innych."
+
+#: src/libslic3r/PrintConfig.cpp:2823
msgid "Controls the bridge type between two neighboring pillars. Can be zig-zag, cross (double zig-zag) or dynamic which will automatically switch between the first two depending on the distance of the two pillars."
msgstr "Kontroluje typ mostu pomiędzy sąsiadującymi słupkami. Może być zyg-zagowy, krzyżowy (podwójny zyg-zag) lub dynamiczny, który oznacza automatyczne przełączanie się pomiędzy pierwszymi dwoma, w zależności od odstępu pomiędzy słupkami."
-#: src/slic3r/GUI/Tab.cpp:1444
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1858 src/slic3r/GUI/Plater.cpp:4886
+msgid "Convert from imperial units"
+msgstr "Konwertuj z jednostek imperialnych"
+
+#: src/slic3r/GUI/Tab.cpp:1790
msgid "Cooling"
msgstr "Chłodzenie"
-#: src/libslic3r/PrintConfig.cpp:660
+#: src/libslic3r/PrintConfig.cpp:696
msgid "Cooling moves are gradually accelerating beginning at this speed."
msgstr "Ruchy chłodzące przyspieszają zaczynając od tej prędkości."
-#: src/libslic3r/PrintConfig.cpp:679
+#: src/libslic3r/PrintConfig.cpp:715
msgid "Cooling moves are gradually accelerating towards this speed."
msgstr "Ruchy chłodzące przyspieszają kończąc z tą prędkością."
-#: src/slic3r/GUI/Tab.cpp:1465
+#: src/slic3r/GUI/Tab.cpp:1811
msgid "Cooling thresholds"
msgstr "Progi chłodzenia"
-#: src/libslic3r/PrintConfig.cpp:327
+#: src/libslic3r/PrintConfig.cpp:361
msgid "Cooling tube length"
msgstr "Długość rurki chłodzącej"
-#: src/libslic3r/PrintConfig.cpp:319
+#: src/libslic3r/PrintConfig.cpp:353
msgid "Cooling tube position"
msgstr "Pozycja rurki chłodzącej"
-#: src/slic3r/GUI/Plater.cpp:4752
+#: src/slic3r/GUI/Plater.cpp:4856
msgid "Copies of the selected object"
msgstr "Kopie wybranego modelu"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4505
+#: src/slic3r/GUI/GLCanvas3D.cpp:4871
msgid "Copy"
msgstr "Kopiuj"
-#: src/slic3r/GUI/MainFrame.cpp:589
+#: src/slic3r/GUI/MainFrame.cpp:1195
msgid "Copy selection to clipboard"
msgstr "Skopiuj zaznaczenie do schowka"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:132
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:127
msgid "Copy to clipboard"
msgstr "Skopiuj do schowka"
-#: src/slic3r/GUI/SysInfoDialog.cpp:154
+#: src/slic3r/GUI/SysInfoDialog.cpp:177
msgid "Copy to Clipboard"
msgstr "Kopiuj do Schowka"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:121
+#: src/slic3r/GUI/AboutDialog.cpp:304
+msgid "Copy Version Info"
+msgstr "Skopiuj informacje o wersji"
+
+#: src/slic3r/Utils/PresetUpdater.cpp:84
+msgid "Copying of file %1% to %2% failed.\nError message : %3%\nCopying was triggered by function: %4%"
+msgstr "Niepowodzenie kopiowania pliku %1% do %2%. \nKomunikat błędu: %3%\n Kopiowanie zostało wywołane przez funkcję: %4%"
+
+#: src/slic3r/Utils/PresetUpdater.cpp:91
+msgid "Copying of file %1% to %2% failed. Permissions fail at target file after copying.\nError message : %3%\nCopying was triggered by function: %4%"
+msgstr "Niepowodzenie kopiowania pliku %1% do %2%. Błąd uprawnień pliku docelowego po skopiowaniu.\nKomunikat błędu: %3%\n Kopiowanie zostało wywołane przez funkcję: %4%"
+
+#: src/slic3r/Utils/PresetUpdater.cpp:70
+msgid "Copying of file %1% to %2% failed. Permissions fail at target file before copying.\nError message : %3%\nThis error happend during %4% phase."
+msgstr "Niepowodzenie kopiowania pliku %1% do %2%. Błąd uprawnień pliku docelowego przed kopiowaniem.\nKomunikat błędu: %3%\n Błąd wystąpił podczas fazy: %4%"
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:156
msgid "Copying of the temporary G-code has finished but the exported code couldn't be opened during copy check. The output G-code is at %1%.tmp."
msgstr "Kopiowanie tymczasowego pliku G-code zostało zakończone, ale nie można otworzyć wyeksportowanego pliku w celu weryfikacji kopiowania. Wynikowy G-code znajduje się w lokalizacji %2%.tmp."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:118
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:153
msgid "Copying of the temporary G-code has finished but the original code at %1% couldn't be opened during copy check. The output G-code is at %2%.tmp."
msgstr "Kopiowanie tymczasowego pliku G-code zostało zakończone, ale nie można otworzyć oryginalnego pliku w lokalizacji %1% w celu weryfikacji kopiowania. Wynikowy G-code znajduje się w lokalizacji %2%.tmp."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:480
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:522
msgid "Copying of the temporary G-code to the output G-code failed"
msgstr "Kopiowanie tymczasowego G-code do wyjściowego nie powiodło się"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:109
-msgid "Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?"
-msgstr "Kopiowanie tymczasowego G-code do wyjściowego nie powiodło się. Sprawdź, czy karta nie jest zabezpieczona przed zapisem."
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:163
+msgid "Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?\nError message: %1%"
+msgstr "Niepowodzenie kopiowania tymczasowego G-code do pliku wyjściowego G-code. Karta SD zabezpieczona przed zapisem? \nKod błędu: %1%"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:112
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:147
msgid "Copying of the temporary G-code to the output G-code failed. There might be problem with target device, please try exporting again or using different device. The corrupted output G-code is at %1%.tmp."
msgstr "Niepowodzenie kopiowania tymczasowego pliku G-code do pliku docelowego. Może być to spowodowane problemem z urządzeniem docelowym. Spróbuj wyeksportować G-code ponownie lub użyj innego urządzenia. Uszkodzony plik wynikowy G-code znajduje się w lokalizacji %1%.tmp."
-#: src/slic3r/GUI/AboutDialog.cpp:127 src/slic3r/GUI/AboutDialog.cpp:256
+#: src/slic3r/GUI/AboutDialog.cpp:139 src/slic3r/GUI/AboutDialog.cpp:281
msgid "Copyright"
msgstr "Prawa autorskie"
-#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2572
+#: src/libslic3r/PrintConfig.cpp:2714 src/libslic3r/PrintConfig.cpp:2715
msgid "Correction for expansion"
msgstr "Korekcja rozszerzania"
-#: src/slic3r/GUI/Tab.cpp:2100 src/slic3r/GUI/Tab.cpp:3519
+#: src/slic3r/GUI/Tab.cpp:2270 src/slic3r/GUI/Tab.cpp:3935
msgid "Corrections"
msgstr "Korekcje"
-#: src/slic3r/GUI/Plater.cpp:1243 src/libslic3r/PrintConfig.cpp:760
-#: src/libslic3r/PrintConfig.cpp:2510 src/libslic3r/PrintConfig.cpp:2511
+#: src/slic3r/GUI/Plater.cpp:1158 src/libslic3r/PrintConfig.cpp:796
+#: src/libslic3r/PrintConfig.cpp:2653 src/libslic3r/PrintConfig.cpp:2654
msgid "Cost"
msgstr "Koszt"
-#: src/slic3r/GUI/Plater.cpp:239
+#: src/slic3r/GUI/Plater.cpp:245
msgid "Cost (money)"
msgstr "Koszt (pieniędzy)"
-#: src/slic3r/GUI/Plater.cpp:2835
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:176
msgid "Could not arrange model objects! Some geometries may be invalid."
msgstr "Nie można ułożyć modeli! Niektóre geometrie mogą być nieprawidłowe."
-#: src/slic3r/Utils/AstroBox.cpp:89
+#: src/slic3r/Utils/AstroBox.cpp:90
msgid "Could not connect to AstroBox"
msgstr "Nie można połączyć się z AstroBox"
-#: src/slic3r/Utils/Duet.cpp:54
+#: src/slic3r/Utils/Duet.cpp:55
msgid "Could not connect to Duet"
msgstr "Nie można połączyć się z Duet"
-#: src/slic3r/Utils/FlashAir.cpp:73
+#: src/slic3r/Utils/FlashAir.cpp:74
msgid "Could not connect to FlashAir"
msgstr "Nie można połączyć z FlashAir"
@@ -1548,56 +1796,73 @@ msgstr "Nie można połączyć z FlashAir"
msgid "Could not connect to OctoPrint"
msgstr "Nie można połączyć się z OctoPrint"
-#: src/slic3r/Utils/OctoPrint.cpp:181
+#: src/slic3r/Utils/OctoPrint.cpp:191
msgid "Could not connect to Prusa SLA"
msgstr "Nie można połączyć się z Prusa SLA"
-#: src/slic3r/GUI/Tab.cpp:1687
+#: src/slic3r/Utils/Http.cpp:73
+msgid "Could not detect system SSL certificate store. PrusaSlicer will be unable to establish secure network connections."
+msgstr "Nie mogę wykryć magazynu certyfikatów SSL. PrusaSlicer nie będzie w stanie nawiązać bezpiecznego połączenia z siecią."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:289
msgid "Could not get a valid Printer Host reference"
msgstr "Brak prawidłowego odwołania do serwera druku"
-#: src/slic3r/Utils/Duet.cpp:134
+#: src/slic3r/Utils/Duet.cpp:136
msgid "Could not get resources to create a new connection"
msgstr "Brak zasobów do utworzenia nowego połączenia"
-#: src/libslic3r/PrintConfig.cpp:1959
+#: src/libslic3r/PrintConfig.cpp:2101
msgid "Cover the top contact layer of the supports with loops. Disabled by default."
msgstr "Pokryj pętlą górną warstwę podpór. Domyślnie wyłączone."
-#: src/libslic3r/PrintConfig.cpp:89
+#: src/libslic3r/PrintConfig.cpp:91
msgid "Cracks smaller than 2x gap closing radius are being filled during the triangle mesh slicing. The gap closing operation may reduce the final print resolution, therefore it is advisable to keep the value reasonably low."
msgstr "Szpary mniejsze niż dwukrotność wartości parametru \"promień zamykania szpar\" zostaną zamknięte przy cięciu. Operacja zamykania szpar może zmniejszyć finalną rozdzielczość wydruku, więc zalecane jest ustawienie tej wartości na rozsądnie niskim poziomie."
-#: src/libslic3r/Zipper.cpp:58
+#: src/libslic3r/miniz_extension.cpp:117
msgid "CRC-32 check failed"
msgstr "Weryfikacja CRC-32 nie powiodła się"
-#: src/libslic3r/PrintConfig.cpp:2857
+#: src/libslic3r/PrintConfig.cpp:3021
msgid "Create pad around object and ignore the support elevation"
msgstr "Dodaj podkładkę wokół modelu i zignoruj podniesienie na podporach"
-#: src/libslic3r/PrintConfig.cpp:2724
+#: src/libslic3r/PrintConfig.cpp:2888
msgid "Critical angle"
msgstr "KÄ…t krytyczny"
-#: src/libslic3r/PrintConfig.cpp:2668
+#: src/slic3r/GUI/GUI_App.cpp:589
+msgid "Critical error"
+msgstr "BÅ‚Ä…d krytyczny"
+
+#: src/libslic3r/PrintConfig.cpp:2832
msgid "Cross"
msgstr "Krzyżowy"
-#: src/libslic3r/PrintConfig.cpp:847
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:203
+msgid "Ctrl + Mouse wheel"
+msgstr "Ctrl + kółko myszy"
+
+#: src/libslic3r/PrintConfig.cpp:885
msgid "Cubic"
msgstr "Sześcienny"
-#: src/slic3r/GUI/wxExtensions.cpp:704
-#, c-format
+#: src/slic3r/Utils/Http.cpp:91
+msgid "CURL init has failed. PrusaSlicer will be unable to establish network connections. See logs for additional details."
+msgstr "Niepowodzenie inicjalizacji CURL. PrusaSlicer nie będzie w stanie nawiązać połączenia przez sieć. Szczegóły w logach."
+
+#: src/slic3r/GUI/wxExtensions.cpp:624
+#, possible-c-format
msgid "Current mode is %s"
msgstr "Obecny tryb to %s"
-#: src/slic3r/GUI/Tab.cpp:959
+#: src/slic3r/GUI/Tab.cpp:1278
msgid "Current preset is inherited from"
msgstr "Obecny zestaw ustawień jest dziedziczony z"
-#: src/slic3r/GUI/Tab.cpp:957
+#: src/slic3r/GUI/Tab.cpp:1276
msgid "Current preset is inherited from the default preset."
msgstr "Obecny zestaw ustawień jest dziedziczony z zestawu domyślnego."
@@ -1605,486 +1870,521 @@ msgstr "Obecny zestaw ustawień jest dziedziczony z zestawu domyślnego."
msgid "Current version:"
msgstr "Obecna wersja:"
-#: src/slic3r/GUI/BedShapeDialog.cpp:98 src/slic3r/GUI/GUI_Preview.cpp:249
-#: src/libslic3r/ExtrusionEntity.cpp:322
+#: src/slic3r/GUI/BedShapeDialog.cpp:143 src/slic3r/GUI/GUI_Preview.cpp:314
+#: src/libslic3r/ExtrusionEntity.cpp:327 src/libslic3r/ExtrusionEntity.cpp:362
msgid "Custom"
msgstr "WÅ‚asny"
-#: src/libslic3r/PrintConfig.cpp:112
+#: src/libslic3r/PrintConfig.cpp:114
msgid "Custom CA certificate file can be specified for HTTPS OctoPrint connections, in crt/pem format. If left blank, the default OS CA certificate repository is used."
msgstr "Dla połączeń HTTPS z OctoPrint może zostać użyty własny plik certyfikatu CA w formacie crt/pem. Jeśli pole zostanie puste, to zostanie użyty plik z systemowego repozytorium CA."
-#: src/slic3r/GUI/Tab.cpp:1527 src/slic3r/GUI/Tab.cpp:1975
+#: src/slic3r/GUI/Tab.cpp:1872 src/slic3r/GUI/Tab.cpp:2160
+#: src/libslic3r/PrintConfig.cpp:1978
msgid "Custom G-code"
msgstr "WÅ‚asny G-code"
-#: src/slic3r/GUI/DoubleSlider.cpp:1619
+#: src/slic3r/GUI/DoubleSlider.cpp:1815
msgid "Custom G-code on current layer (%1% mm)."
msgstr "WÅ‚asny G-code na obecnej warstwie (%1% mm)."
-#: src/slic3r/GUI/ConfigWizard.cpp:732
+#: src/slic3r/GUI/GCodeViewer.cpp:2580 src/slic3r/GUI/GUI_Preview.cpp:1477
+msgid "Custom G-codes"
+msgstr "WÅ‚asny G-code"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1091
msgid "Custom Printer"
msgstr "WÅ‚asna Drukarka"
-#: src/slic3r/GUI/ConfigWizard.cpp:732
+#: src/slic3r/GUI/ConfigWizard.cpp:1091
msgid "Custom Printer Setup"
msgstr "Ustawienie WÅ‚asnej Drukarki"
-#: src/slic3r/GUI/ConfigWizard.cpp:736
+#: src/slic3r/GUI/ConfigWizard.cpp:1095
msgid "Custom profile name:"
msgstr "Nazwa własnego profilu:"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:42
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3402
+#: src/slic3r/GUI/Plater.cpp:3397
+msgid "Custom supports and seams were removed after repairing the mesh."
+msgstr "Niestandardowe podpory i szwy zostały usunięte podczas naprawy modelu."
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1135
+msgid "Custom template (\"%1%\")"
+msgstr "WÅ‚asny szablon (\"%1%\")"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:146 src/libslic3r/PrintConfig.cpp:3601
msgid "Cut"
msgstr "Przetnij"
-#: src/slic3r/GUI/Plater.cpp:4786
+#: src/slic3r/GUI/Plater.cpp:4921
msgid "Cut by Plane"
msgstr "Tnij PÅ‚aszczyznÄ…"
-#: src/libslic3r/PrintConfig.cpp:3403
+#: src/libslic3r/PrintConfig.cpp:3602
msgid "Cut model at the given Z."
msgstr "Przetnij model na wysokości Z."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1432
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
msgid "Cylinder"
msgstr "Cylinder"
-#: src/slic3r/GUI/MainFrame.cpp:568
+#: src/slic3r/GUI/MainFrame.cpp:1174
msgid "D&eselect all"
msgstr "&Odznacz wszystko"
-#: src/libslic3r/PrintConfig.cpp:3504
+#: src/libslic3r/PrintConfig.cpp:3709
msgid "Data directory"
msgstr "Katalog danych"
-#: src/slic3r/GUI/Mouse3DController.cpp:313
+#: src/slic3r/GUI/Mouse3DController.cpp:300
msgid "Deadzone:"
msgstr "Martwa strefa:"
-#: src/libslic3r/Zipper.cpp:52
+#: src/libslic3r/miniz_extension.cpp:111
msgid "decompression failed or archive is corrupted"
msgstr "niepowodzenie rozpakowywania lub uszkodzone archiwum"
-#: src/slic3r/GUI/Plater.cpp:4720
+#: src/slic3r/GUI/Plater.cpp:4824
msgid "Decrease Instances"
msgstr "Zmniejsz ilość instancji"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1704 src/libslic3r/PrintConfig.cpp:335
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1832 src/libslic3r/PrintConfig.cpp:369
msgid "Default"
msgstr "Domyślnie"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:457 src/slic3r/GUI/GUI_ObjectList.cpp:469
-#: src/slic3r/GUI/GUI_ObjectList.cpp:917 src/slic3r/GUI/GUI_ObjectList.cpp:3967
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3977
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4012
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:200
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:257
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:282
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:490
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:1753
+#: src/slic3r/GUI/ExtraRenderers.cpp:297 src/slic3r/GUI/GUI_ObjectList.cpp:496
+#: src/slic3r/GUI/GUI_ObjectList.cpp:508 src/slic3r/GUI/GUI_ObjectList.cpp:1015
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4454
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4464
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4499
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:202
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:259
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:284
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:492
msgid "default"
msgstr "domyślnie"
-#: src/libslic3r/PrintConfig.cpp:777
+#: src/libslic3r/PrintConfig.cpp:813
msgid "Default base angle for infill orientation. Cross-hatching will be applied to this. Bridges will be infilled using the best direction Slic3r can detect, so this setting does not affect them."
msgstr "Domyślny kąt linii wypełnienia. Mosty będą wypełniane z użyciem najlepszego kierunku obliczonego przez Slic3r, więc to ustawienie ich nie dotyczy."
-#: src/libslic3r/PrintConfig.cpp:554
+#: src/slic3r/GUI/GCodeViewer.cpp:2289
+msgid "Default color"
+msgstr "Domyślny kolor"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2313
+msgid "default color"
+msgstr "domyślny kolor"
+
+#: src/libslic3r/PrintConfig.cpp:590
msgid "Default extrusion width"
msgstr "Domyślna szerokość linii"
-#: src/slic3r/GUI/Tab.cpp:987
+#: src/slic3r/GUI/Tab.cpp:1305
msgid "default filament profile"
msgstr "domyślny profil filamentu"
-#: src/libslic3r/PrintConfig.cpp:345
+#: src/libslic3r/PrintConfig.cpp:379
msgid "Default filament profile"
msgstr "Domyślny profil filamentu"
-#: src/libslic3r/PrintConfig.cpp:346
+#: src/libslic3r/PrintConfig.cpp:380
msgid "Default filament profile associated with the current printer profile. On selection of the current printer profile, this filament profile will be activated."
msgstr "Domyślny profil filamentu powiązany z obecnym profilem drukarki. Przy wybraniu obecnego profilu drukarki automatycznie zostanie wybrany ten profil filamentu."
-#: src/slic3r/GUI/Tab.cpp:2919
-#, c-format
-msgid "Default preset (%s)"
-msgstr "Domyślny zestaw ustawień (%s)"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:904 src/slic3r/GUI/GLCanvas3D.cpp:933
-msgid "Default print color"
-msgstr "Domyślny kolor druku"
-
-#: src/slic3r/GUI/Tab.cpp:984
+#: src/slic3r/GUI/Tab.cpp:1302
msgid "default print profile"
msgstr "domyślny profil druku"
-#: src/libslic3r/PrintConfig.cpp:352
+#: src/libslic3r/PrintConfig.cpp:386
msgid "Default print profile"
msgstr "Domyślny profil druku"
-#: src/libslic3r/PrintConfig.cpp:353 src/libslic3r/PrintConfig.cpp:2592
-#: src/libslic3r/PrintConfig.cpp:2603
+#: src/libslic3r/PrintConfig.cpp:387 src/libslic3r/PrintConfig.cpp:2735
+#: src/libslic3r/PrintConfig.cpp:2746
msgid "Default print profile associated with the current printer profile. On selection of the current printer profile, this print profile will be activated."
msgstr "Domyślny profil druku powiązany z obecnym profilem drukarki. Przy wybraniu obecnego profilu drukarki automatycznie zostanie wybrany ten profil filamentu."
-#: src/slic3r/GUI/Tab.cpp:1001
+#: src/slic3r/GUI/Tab.cpp:1319
msgid "default SLA material profile"
msgstr "domyślny profil materiału SLA"
-#: src/libslic3r/PrintConfig.cpp:2591 src/libslic3r/PrintConfig.cpp:2602
+#: src/libslic3r/PrintConfig.cpp:2734 src/libslic3r/PrintConfig.cpp:2745
msgid "Default SLA material profile"
msgstr "Domyślny profil materiału SLA"
-#: src/slic3r/GUI/Tab.cpp:1005
+#: src/slic3r/GUI/Tab.cpp:1323
msgid "default SLA print profile"
msgstr "domyślny profil druku SLA"
-#: src/slic3r/GUI/Field.cpp:136
+#: src/slic3r/GUI/Field.cpp:184
msgid "default value"
msgstr "wartość domyślna"
-#: src/slic3r/GUI/ConfigWizard.cpp:734
+#: src/slic3r/GUI/ConfigWizard.cpp:1093
msgid "Define a custom printer profile"
msgstr "Zdefiniuj własny profil drukarki"
-#: src/libslic3r/PrintConfig.cpp:2798
+#: src/libslic3r/PrintConfig.cpp:2962
msgid "Defines the pad cavity depth. Set to zero to disable the cavity. Be careful when enabling this feature, as some resins may produce an extreme suction effect inside the cavity, which makes peeling the print off the vat foil difficult."
-msgstr "Definiuje wgłębienie podkładki. Ustaw 0 aby je wyłączyć. Zachowaj ostrożność przy ustawianiu wgłębienia, ponieważ niektóre żywice mogą powodować bardzo silny efekt zasysania wewnątrz wgłębienia, co może powodować trudności z oddzieleniem wydruku od folii zbiornika."
+msgstr "Definiuje wgłębienie podkładki. Ustaw 0, aby je wyłączyć. Zachowaj ostrożność przy ustawianiu wgłębienia, ponieważ niektóre żywice mogą powodować bardzo silny efekt zasysania wewnątrz wgłębienia, co może powodować trudności z oddzieleniem wydruku od dna zbiornika."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:346
+#: src/slic3r/GUI/GUI_ObjectList.cpp:393
msgid "degenerate facets"
msgstr "ponowne generowanie ścianek"
-#: src/libslic3r/PrintConfig.cpp:640
+#: src/libslic3r/PrintConfig.cpp:676
msgid "Delay after unloading"
msgstr "Opóźnienie po rozładowaniu"
-#: src/slic3r/GUI/Tab.cpp:3121
+#: src/slic3r/GUI/Tab.cpp:3386
msgid "delete"
msgstr "usuń"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4475 src/slic3r/GUI/GUI_ObjectList.cpp:1718
-#: src/slic3r/GUI/Plater.cpp:3931 src/slic3r/GUI/Plater.cpp:3953
-#: src/slic3r/GUI/Tab.cpp:3124
+#: src/slic3r/GUI/GLCanvas3D.cpp:4841 src/slic3r/GUI/GUI_ObjectList.cpp:1846
+#: src/slic3r/GUI/Plater.cpp:3849 src/slic3r/GUI/Plater.cpp:3871
+#: src/slic3r/GUI/Tab.cpp:3423
msgid "Delete"
msgstr "Usuń"
-#: src/slic3r/GUI/MainFrame.cpp:575
+#: src/slic3r/GUI/MainFrame.cpp:1181
msgid "Delete &all"
msgstr "Usuń &wszystko"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4484 src/slic3r/GUI/KBShortcutsDialog.cpp:129
-#: src/slic3r/GUI/Plater.cpp:4669
+#: src/slic3r/GUI/GLCanvas3D.cpp:4850 src/slic3r/GUI/KBShortcutsDialog.cpp:124
+#: src/slic3r/GUI/Plater.cpp:4774
msgid "Delete all"
msgstr "Usuń wszystko"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2176
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2341
msgid "Delete All Instances from Object"
-msgstr "Usuń wszystkie kopie modelu"
+msgstr "Usuń wszystkie instancje modelu"
-#: src/slic3r/GUI/DoubleSlider.cpp:1516
+#: src/slic3r/GUI/DoubleSlider.cpp:1708
msgid "Delete color change"
msgstr "Usuń zmianę koloru"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:220
msgid "Delete color change marker for current layer"
msgstr "Usuń punkt zmiany filamentu na obecnej warstwie"
-#: src/slic3r/GUI/DoubleSlider.cpp:1519
+#: src/slic3r/GUI/DoubleSlider.cpp:1711
msgid "Delete custom G-code"
msgstr "Usuń własny G-code"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:539
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:424
msgid "Delete drainage hole"
msgstr "Usuń otwór odpływowy"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2192
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2357
msgid "Delete Height Range"
msgstr "Usuń zakres wysokości"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2246
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2412
msgid "Delete Instance"
msgstr "Usuń instancję"
-#: src/slic3r/GUI/Plater.cpp:2712
+#: src/slic3r/GUI/Plater.cpp:2673
msgid "Delete Object"
msgstr "Usuń Model"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:101
-#, c-format
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:104
+#, possible-c-format
msgid "Delete Option %s"
msgstr "Usuń Opcję %s"
-#: src/slic3r/GUI/DoubleSlider.cpp:1518
+#: src/slic3r/GUI/DoubleSlider.cpp:1710
msgid "Delete pause print"
-msgstr "Usuń pauzę wydruku"
+msgstr "Usuń pauzę"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:128
+#: src/slic3r/GUI/PresetComboBoxes.cpp:652
+msgid "Delete physical printer"
+msgstr "Usuń fizyczną drukarkę"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:659
+msgid "Delete Physical Printer"
+msgstr "Usuń fizyczną drukarkę"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:123
msgid "Delete selected"
msgstr "Usuń zaznaczone"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2830
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3221
msgid "Delete Selected"
msgstr "Usuń Zaznaczone"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2693
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3083
msgid "Delete Selected Item"
msgstr "Usuń Wybrany Obiekt"
-#: src/slic3r/GUI/Plater.cpp:4677
+#: src/slic3r/GUI/Plater.cpp:4782
msgid "Delete Selected Objects"
msgstr "Usuń Zaznaczone Modele"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2152
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2319
msgid "Delete Settings"
-msgstr "Usuń Ustawienia"
+msgstr "Usuń ustawienia"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2227
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2393
msgid "Delete Subobject"
msgstr "Usuń Model Podrzędny"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:631
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:514
msgid "Delete support point"
msgstr "Usuń punkt podpory"
-#: src/slic3r/GUI/Tab.cpp:134
+#: src/slic3r/GUI/Tab.cpp:204
msgid "Delete this preset"
msgstr "Usuń ten zestaw ustawień"
-#: src/slic3r/GUI/DoubleSlider.cpp:1035
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:55
+msgid "Delete this preset from this printer device"
+msgstr "Usuń ten zestaw ustawień z tej drukarki"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1160
msgid "Delete tick mark - Left click or press \"-\" key"
msgstr "Usuń zaznaczenie - kliknij lewym przyciskiem lub wciśnij klawisz \"-\""
-#: src/slic3r/GUI/DoubleSlider.cpp:1517
+#: src/slic3r/GUI/DoubleSlider.cpp:1709
msgid "Delete tool change"
msgstr "Usuń zmianę narzędzia"
-#: src/slic3r/GUI/MainFrame.cpp:576
+#: src/slic3r/GUI/MainFrame.cpp:1182
msgid "Deletes all objects"
msgstr "Usuwa wszystkie modele"
-#: src/slic3r/GUI/MainFrame.cpp:573
+#: src/slic3r/GUI/MainFrame.cpp:1179
msgid "Deletes the current selection"
msgstr "Usuwa zaznaczenie"
-#: src/libslic3r/PrintConfig.cpp:717 src/libslic3r/PrintConfig.cpp:2503
-#: src/libslic3r/PrintConfig.cpp:2504
+#: src/libslic3r/PrintConfig.cpp:753 src/libslic3r/PrintConfig.cpp:2646
+#: src/libslic3r/PrintConfig.cpp:2647
msgid "Density"
msgstr "Gęstość"
-#: src/libslic3r/PrintConfig.cpp:791
+#: src/libslic3r/PrintConfig.cpp:827
msgid "Density of internal infill, expressed in the range 0% - 100%."
msgstr "Gęstość wypełnienia wewnętrznego, wyrażana w zakresie 0% - 100%."
-#: src/slic3r/GUI/Tab.cpp:1258 src/slic3r/GUI/Tab.cpp:1548
-#: src/slic3r/GUI/Tab.cpp:2019 src/slic3r/GUI/Tab.cpp:2135
-#: src/slic3r/GUI/Tab.cpp:3543 src/slic3r/GUI/Tab.cpp:3671
+#: src/slic3r/GUI/Tab.cpp:1588 src/slic3r/GUI/Tab.cpp:1895
+#: src/slic3r/GUI/Tab.cpp:2228 src/slic3r/GUI/Tab.cpp:2304
+#: src/slic3r/GUI/Tab.cpp:3959 src/slic3r/GUI/Tab.cpp:4090
msgid "Dependencies"
msgstr "Zależności"
-#: src/libslic3r/PrintConfig.cpp:1612 src/libslic3r/PrintConfig.cpp:1613
+#: src/libslic3r/PrintConfig.cpp:1720 src/libslic3r/PrintConfig.cpp:1721
msgid "Deretraction Speed"
msgstr "Prędkość powrotu retrakcji"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:127
+#: src/slic3r/GUI/GCodeViewer.cpp:2529 src/slic3r/GUI/GUI_Preview.cpp:337
+#: src/slic3r/GUI/GUI_Preview.cpp:1473
+msgid "Deretractions"
+msgstr "Powroty retrakcji"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:172
+msgid "Descriptive name for the printer"
+msgstr "Opisowa nazwa drukarki"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:122
msgid "Deselect all"
msgstr "Odznacz wszystko"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1369
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216
msgid "Deselect by rectangle"
msgstr "Odznaczenie prostokÄ…tem"
-#: src/slic3r/GUI/MainFrame.cpp:569
+#: src/slic3r/GUI/MainFrame.cpp:1175
msgid "Deselects all objects"
msgstr "Odznacza wszystkie modele"
-#: src/slic3r/GUI/Tab.cpp:963
+#: src/slic3r/GUI/Tab.cpp:1224
msgid "Detach from system preset"
msgstr "Odłącz od ustawień systemowych"
-#: src/slic3r/GUI/Tab.cpp:984
+#: src/slic3r/GUI/Tab.cpp:1246
msgid "Detach preset"
msgstr "Odłącz zestaw ustawień"
-#: src/slic3r/GUI/Tab.cpp:3029
+#: src/slic3r/GUI/Tab.cpp:3323
msgid "Detached"
msgstr "Odłączono"
-#: src/libslic3r/PrintConfig.cpp:1373
+#: src/libslic3r/PrintConfig.cpp:1481
msgid "Detect bridging perimeters"
msgstr "Wykrywanie mostów przy obrysach"
-#: src/libslic3r/PrintConfig.cpp:2075
+#: src/libslic3r/PrintConfig.cpp:2218
msgid "Detect single-width walls (parts where two extrusions don't fit and we need to collapse them into a single trace)."
msgstr "Wykrywaj ściany o grubości jednego obrysu (obszary, gdzie 2 obrysy nie zmieszczą się i trzeba będzie połączyć je w jedną linię)."
-#: src/libslic3r/PrintConfig.cpp:2073
+#: src/libslic3r/PrintConfig.cpp:2216
msgid "Detect thin walls"
msgstr "Wykrywanie cienkich ścian"
-#: src/libslic3r/PrintConfig.cpp:3472
+#: src/libslic3r/PrintConfig.cpp:3671
msgid "Detect unconnected parts in the given model(s) and split them into separate objects."
msgstr "Wykryj niepołączone elementy załadowanych modelu i odłącz je, tworząc osobne modele."
-#: src/slic3r/GUI/Plater.cpp:2368
+#: src/slic3r/GUI/Plater.cpp:2330
msgid "Detected advanced data"
msgstr "Wykryto zaawansowane dane"
-#: src/slic3r/GUI/Mouse3DController.cpp:289
+#: src/slic3r/GUI/Mouse3DController.cpp:274
msgid "Device:"
msgstr "UrzÄ…dzenie:"
-#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/libslic3r/PrintConfig.cpp:709
+#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:745
msgid "Diameter"
msgstr "Åšrednica"
-#: src/libslic3r/PrintConfig.cpp:2694
+#: src/libslic3r/PrintConfig.cpp:2858
msgid "Diameter in mm of the pillar base"
msgstr "Średnica podstawy słupka w mm"
-#: src/libslic3r/PrintConfig.cpp:2650
+#: src/libslic3r/PrintConfig.cpp:2793
msgid "Diameter in mm of the support pillars"
msgstr "Średnica słupków podpór w mm"
-#: src/libslic3r/PrintConfig.cpp:2622
+#: src/libslic3r/PrintConfig.cpp:2765
msgid "Diameter of the pointing side of the head"
msgstr "Średnica spiczastej części łącznika"
-#: src/slic3r/GUI/BedShapeDialog.cpp:94
+#: src/slic3r/GUI/BedShapeDialog.cpp:131
msgid "Diameter of the print bed. It is assumed that origin (0,0) is located in the center."
msgstr "Średnica stołu. Z założenia punkt bazowy (0, 0) jest zlokalizowany na środku."
-#: src/libslic3r/PrintConfig.cpp:1639
+#: src/libslic3r/PrintConfig.cpp:1747
msgid "Direction"
msgstr "Kierunek"
-#: src/libslic3r/PrintConfig.cpp:359
+#: src/libslic3r/PrintConfig.cpp:393
msgid "Disable fan for the first"
msgstr "Wyłącz wentylator przy pierwszych"
-#: src/libslic3r/PrintConfig.cpp:1349
+#: src/libslic3r/PrintConfig.cpp:1457
msgid "Disables retraction when the travel path does not exceed the upper layer's perimeters (and thus any ooze will be probably invisible)."
msgstr "Wyłącza retrakcję gdy ruch jałowy nie wykracza poza zewnętrzny obrys górnej warstwy (więc jakiekolwiek wycieki z dyszy prawdopodobnie i tak nie będą widoczne)."
-#: src/slic3r/GUI/DoubleSlider.cpp:952
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:641
+msgid "Discard"
+msgstr "Odrzuć"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1066
msgid "Discard all custom changes"
msgstr "Odrzuć wszystkie własne zmiany"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1375
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222
msgid "Discard changes"
msgstr "Odrzuć zmiany"
-#: src/slic3r/GUI/GUI_App.cpp:932 src/slic3r/GUI/Tab.cpp:2946
-msgid "Discard changes and continue anyway?"
-msgstr "Odrzucić zmiany i kontynuować?"
-
-#: src/slic3r/GUI/Tab.cpp:2078
+#: src/slic3r/GUI/Tab.cpp:2248
msgid "Display"
msgstr "Wyświetlacz"
-#: src/libslic3r/PrintConfig.cpp:2359
+#: src/libslic3r/PrintConfig.cpp:2502
msgid "Display height"
msgstr "Wysokość wyświetlacza"
-#: src/libslic3r/PrintConfig.cpp:2378
+#: src/libslic3r/PrintConfig.cpp:2521
msgid "Display horizontal mirroring"
msgstr "Pokaż odbicie poziome"
-#: src/libslic3r/PrintConfig.cpp:2392
+#: src/libslic3r/PrintConfig.cpp:2535
msgid "Display orientation"
msgstr "Pokaż orientację"
-#: src/slic3r/GUI/MainFrame.cpp:648
+#: src/slic3r/GUI/MainFrame.cpp:1258
msgid "Display the Print Host Upload Queue window"
msgstr "Wyświetl okno kolejki serwera druku"
-#: src/libslic3r/PrintConfig.cpp:2385
+#: src/libslic3r/PrintConfig.cpp:2528
msgid "Display vertical mirroring"
msgstr "Pokaż odbicie pionowe"
-#: src/libslic3r/PrintConfig.cpp:2353
+#: src/libslic3r/PrintConfig.cpp:2496
msgid "Display width"
msgstr "Orientacja wyświetlacza"
-#: src/libslic3r/PrintConfig.cpp:377
+#: src/libslic3r/PrintConfig.cpp:411
msgid "Distance between copies"
msgstr "Odstęp pomiędzy kopiami"
-#: src/libslic3r/PrintConfig.cpp:1680
+#: src/libslic3r/PrintConfig.cpp:1157
+msgid "Distance between ironing lines"
+msgstr "Odstęp między liniami prasowania"
+
+#: src/libslic3r/PrintConfig.cpp:1788
msgid "Distance between skirt and object(s). Set this to zero to attach the skirt to the object(s) and get a brim for better adhesion."
-msgstr "Odległość skirtu od modelu. Ustaw zero aby dołączyć do modelu i uzyskać obramowanie dla lepszej przyczepności."
+msgstr "Odległość skirtu od modelu. Ustaw zero, aby dołączyć do modelu i uzyskać obramowanie dla lepszej przyczepności."
-#: src/libslic3r/PrintConfig.cpp:2882
+#: src/libslic3r/PrintConfig.cpp:3046
msgid "Distance between two connector sticks which connect the object and the generated pad."
msgstr "Odstęp pomiędzy dwoma słupkami łączącymi model z wygenerowaną podkładką."
-#: src/libslic3r/PrintConfig.cpp:1679
+#: src/libslic3r/PrintConfig.cpp:1787
msgid "Distance from object"
msgstr "Odstęp od modelu"
-#: src/slic3r/GUI/BedShapeDialog.cpp:85
+#: src/slic3r/GUI/BedShapeDialog.cpp:121
msgid "Distance of the 0,0 G-code coordinate from the front left corner of the rectangle."
msgstr "Odległość koordynaty punktu zerowego od przedniego lewego rogu prostokąta."
-#: src/libslic3r/PrintConfig.cpp:320
+#: src/libslic3r/PrintConfig.cpp:354
msgid "Distance of the center-point of the cooling tube from the extruder tip."
msgstr "Odległość punktu centralnego rurki chłodzącej od końcówki ekstrudera."
-#: src/libslic3r/PrintConfig.cpp:1382
+#: src/libslic3r/PrintConfig.cpp:1490
msgid "Distance of the extruder tip from the position where the filament is parked when unloaded. This should match the value in printer firmware."
msgstr "Odległość końcówki ekstrudera do miejsca zatrzymania filamentu po rozładowaniu. Ta wartość powinna odpowiadać tej ustawionej w firmware drukarki."
-#: src/libslic3r/PrintConfig.cpp:378
+#: src/libslic3r/PrintConfig.cpp:412
msgid "Distance used for the auto-arrange feature of the plater."
msgstr "Odstęp używany przy automatycznym rozmieszczaniu modeli na stole."
-#: src/libslic3r/PrintConfig.cpp:3486
+#: src/libslic3r/PrintConfig.cpp:3685
msgid "Do not fail if a file supplied to --load does not exist."
msgstr "Nie przerywaj jeśli plik dołączony do --load nie istnieje."
-#: src/libslic3r/PrintConfig.cpp:3430
+#: src/libslic3r/PrintConfig.cpp:3629
msgid "Do not rearrange the given models before merging and keep their original XY coordinates."
msgstr "Nie przestawiaj modeli przed Å‚Ä…czeniem i zachowaj ich poczÄ…tkowe koordynaty XY."
-#: src/slic3r/GUI/Field.cpp:240
-#, c-format
-msgid ""
-"Do you mean %s%% instead of %s %s?\n"
-"Select YES if you want to change this value to %s%%, \n"
-"or NO if you are sure that %s %s is a correct value."
-msgstr ""
-"Czy masz na myśli %s %% zamiast %s %s ?\n"
-"Kliknij TAK, jeśli chcesz zmienić wartość na %s %%,\n"
-"lub NIE, jeśli masz pewność, że %s %s jest prawidłową wartością."
+#: src/slic3r/GUI/Field.cpp:288
+#, possible-c-format
+msgid "Do you mean %s%% instead of %s %s?\nSelect YES if you want to change this value to %s%%, \nor NO if you are sure that %s %s is a correct value."
+msgstr "Czy masz na myśli %s %% zamiast %s %s ?\nKliknij TAK, jeśli chcesz zmienić wartość na %s %%,\nlub NIE, jeśli masz pewność, że %s %s jest prawidłową wartością."
-#: src/slic3r/GUI/DoubleSlider.cpp:1920
+#: src/slic3r/GUI/DoubleSlider.cpp:2138
msgid "Do you want to delete all saved tool changes?"
msgstr "Czy chcesz usunąć wszystkie zmiany narzędzi?"
-#: src/slic3r/GUI/GUI_App.cpp:884
+#: src/slic3r/GUI/GUI_App.cpp:1610
msgid "Do you want to proceed?"
msgstr "Czy chcesz kontynuować?"
-#: src/slic3r/GUI/Plater.cpp:3321
+#: src/slic3r/GUI/Plater.cpp:3124
msgid "Do you want to retry"
msgstr "Czy chcesz spróbować ponownie"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1045
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:911
msgid "Do you want to save your manually edited support points?"
msgstr "Czy chcesz zapisać ręcznie edytowane punkty podpór?"
-#: src/slic3r/GUI/ConfigWizard.cpp:1834
+#: src/slic3r/GUI/ConfigWizard.cpp:2261
msgid "Do you want to select default filaments for these FFF printer models?"
msgstr "Czy chcesz ustawić domyślne filamenty dla tych modeli drukarek FFF?"
-#: src/slic3r/GUI/ConfigWizard.cpp:1852
+#: src/slic3r/GUI/ConfigWizard.cpp:2279
msgid "Do you want to select default SLA materials for these printer models?"
msgstr "Czy chcesz ustawić domyślne materiały SLA dla tych modeli drukarek?"
-#: src/libslic3r/PrintConfig.cpp:3429
+#: src/slic3r/GUI/Plater.cpp:4751
+msgid "does not contain valid gcode."
+msgstr "nie zawiera prawidłowego g-code."
+
+#: src/libslic3r/PrintConfig.cpp:3628
msgid "Don't arrange"
msgstr "Nie układaj"
@@ -2092,7 +2392,11 @@ msgstr "Nie układaj"
msgid "Don't notify about new releases any more"
msgstr "Nie powiadamiaj o nowych wersjach"
-#: src/libslic3r/PrintConfig.cpp:369
+#: src/slic3r/GUI/Plater.cpp:1431
+msgid "Don't show again"
+msgstr "Nie pokazuj ponownie"
+
+#: src/libslic3r/PrintConfig.cpp:403
msgid "Don't support bridges"
msgstr "Nie używaj podpór pod mostami"
@@ -2100,262 +2404,348 @@ msgstr "Nie używaj podpór pod mostami"
msgid "Downgrade"
msgstr "Deaktualizacja"
-#: src/libslic3r/PrintConfig.cpp:1695
+#: src/libslic3r/PrintConfig.cpp:1803
msgid "Draft shield"
msgstr "Draft shield"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1368
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1369
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216
msgid "Drag"
msgstr "PrzeciÄ…gnij"
-#: src/libslic3r/SLAPrintSteps.cpp:44
+#: src/slic3r/GUI/Plater.cpp:1406
+msgid "Drag and drop G-code file"
+msgstr "Przeciągnij i upuść plik G-code"
+
+#: src/libslic3r/SLAPrintSteps.cpp:45
msgid "Drilling holes into model."
msgstr "Wiercenie otworów odpływowych w modelu."
-#: src/libslic3r/SLAPrintSteps.cpp:199
+#: src/libslic3r/SLAPrintSteps.cpp:201
msgid "Drilling holes into the mesh failed. This is usually caused by broken model. Try to fix it first."
msgstr "Niepowodzenie wiercenia otworów w siatce. Zazwyczaj dzieje się tak przez błędy w modelu. Spróbuj najpierw go naprawić."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:337
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:349
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:345
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:357
msgid "Drop to bed"
msgstr "Upuść na stół"
-#: src/libslic3r/PrintConfig.cpp:3433
+#: src/libslic3r/PrintConfig.cpp:3632
msgid "Duplicate"
msgstr "Duplikuj"
-#: src/libslic3r/PrintConfig.cpp:3438
+#: src/libslic3r/PrintConfig.cpp:3637
msgid "Duplicate by grid"
msgstr "Duplikuj wg siatki"
-#: src/slic3r/GUI/PresetHints.cpp:40
-msgid "During the other layers, fan"
-msgstr "Na pozostałych warstwach, wentylator"
+#: src/slic3r/GUI/GCodeViewer.cpp:2445
+msgid "Duration"
+msgstr "Czas trwania"
+
+#: src/slic3r/GUI/PresetHints.cpp:51
+msgid "During the other layers, fan will always run at %1%%%"
+msgstr "Podczas drukowania innych warstw wentylator będzie pracować na %1%%%"
+
+#: src/slic3r/GUI/PresetHints.cpp:58
+msgid "During the other layers, fan will be turned off."
+msgstr "Podczas drukowania innych warstw wentylator będzie wyłączony."
-#: src/libslic3r/PrintConfig.cpp:2669
+#: src/libslic3r/PrintConfig.cpp:2833
msgid "Dynamic"
msgstr "Dynamicznie"
-#: src/slic3r/GUI/MainFrame.cpp:749
+#: src/slic3r/GUI/MainFrame.cpp:1448
msgid "E&xport"
msgstr "&Eksport"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:347
+#: src/slic3r/GUI/GUI_ObjectList.cpp:394
msgid "edges fixed"
msgstr "naprawiono krawędzie"
-#: src/slic3r/GUI/DoubleSlider.cpp:1508
+#: src/slic3r/GUI/DoubleSlider.cpp:1700
msgid "Edit color"
msgstr "Edytuj kolor"
-#: src/slic3r/GUI/DoubleSlider.cpp:960
+#: src/slic3r/GUI/DoubleSlider.cpp:1083
msgid "Edit current color - Right click the colored slider segment"
msgstr "Edytuj kolor - kliknij prawym przyciskiem na kolorowy segment suwaka"
-#: src/slic3r/GUI/DoubleSlider.cpp:1510
+#: src/slic3r/GUI/DoubleSlider.cpp:1702
msgid "Edit custom G-code"
msgstr "Edytuj własny G-code"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3003
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3459
msgid "Edit Height Range"
msgstr "Edytuj Zakres Wysokości"
-#: src/slic3r/GUI/DoubleSlider.cpp:1509
+#: src/slic3r/GUI/DoubleSlider.cpp:1701
msgid "Edit pause print message"
msgstr "Edytuj komunikat wstrzymania wydruku"
-#: src/slic3r/GUI/DoubleSlider.cpp:1037
+#: src/slic3r/GUI/PresetComboBoxes.cpp:645
+msgid "Edit physical printer"
+msgstr "Edytuj fizycznÄ… drukarkÄ™"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:641
+msgid "Edit preset"
+msgstr "Edytuj zestaw ustawień"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1162
msgid "Edit tick mark - Ctrl + Left click"
msgstr "Edytuj zaznaczenie - Ctrl + Klik lewym przyciskiem"
-#: src/slic3r/GUI/DoubleSlider.cpp:1038
+#: src/slic3r/GUI/DoubleSlider.cpp:1163
msgid "Edit tick mark - Right click"
msgstr "Edytuj zaznaczenie - kliknij prawym przyciskiem"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:282 src/slic3r/GUI/GUI_ObjectList.cpp:394
+#: src/slic3r/GUI/GUI_ObjectList.cpp:300 src/slic3r/GUI/GUI_ObjectList.cpp:441
msgid "Editing"
msgstr "Edytowanie"
-#: src/slic3r/GUI/MainFrame.cpp:547
+#: src/slic3r/GUI/MainFrame.cpp:1105
msgid "Ejec&t SD card / Flash drive"
msgstr "Wysuń kar&tę SD / pamięć flash"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:126
+#: src/slic3r/GUI/NotificationManager.cpp:780
+msgid "Eject drive"
+msgstr "Wysuń nośnik"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:119
msgid "Eject SD card / Flash drive"
msgstr "Wysuń kartę SD / pamięć flash"
-#: src/slic3r/GUI/MainFrame.cpp:547
+#: src/slic3r/GUI/MainFrame.cpp:1105
msgid "Eject SD card / Flash drive after the G-code was exported to it."
msgstr "Wysuń kartę SD / pamięć flash po wyeksportowaniu na nią G-code."
-#: src/slic3r/GUI/Plater.cpp:2202
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:2034
+#, possible-c-format
msgid "Ejecting of device %s(%s) has failed."
msgstr "Wysuwanie urządzenia %s(%s) nie powiodło się."
-#: src/libslic3r/PrintConfig.cpp:118
+#: src/libslic3r/PrintConfig.cpp:120
msgid "Elephant foot compensation"
msgstr "Kompensacja \"stopy słonia\""
-#: src/libslic3r/PrintConfig.cpp:2447
+#: src/libslic3r/PrintConfig.cpp:2590
msgid "Elephant foot minimum width"
msgstr "Minimalna szerokość stopy słonia"
-#: src/libslic3r/SLAPrint.cpp:625
+#: src/libslic3r/SLAPrint.cpp:639
msgid "Elevation is too low for object. Use the \"Pad around object\" feature to print the object without elevation."
msgstr "Podniesienie zbyt małe dla modelu. Użyj funkcji \"Podkładka wokół modelu\", aby wydrukować model bez podniesienia."
-#: src/libslic3r/PrintConfig.cpp:1093
+#: src/libslic3r/PrintConfig.cpp:1186
msgid "Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute intervals into the G-code to let the firmware show accurate remaining time. As of now only the Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 firmware supports M73 Qxx Sxx for the silent mode."
msgstr "Umieść M73 P[postęp w procentach] R[pozostały czas w minutach] co 1 minutę w G-code, aby pozwolić firmware na wyświetlanie dokładnego pozostałego czasu. Na ten moment jedynie firmware drukarki Prusa i3 MK3 rozpoznaje komendę M73. Firmware i3 MK3 wspiera również M73 Qxx Sxx dla trybu Stealth."
-#: src/libslic3r/GCode.cpp:637
+#: src/libslic3r/PrintConfig.cpp:1217
+msgid "Emit to G-code"
+msgstr "Przekaż do G-code"
+
+#: src/libslic3r/GCode.cpp:622
msgid "Empty layers detected, the output would not be printable."
msgstr "Wykryto puste warstwy - plik wynikowy nie będzie możliwy do wydrukowania."
-#: src/slic3r/GUI/Tab.cpp:1445 src/libslic3r/PrintConfig.cpp:1355
-#: src/libslic3r/PrintConfig.cpp:2200
+#: src/slic3r/GUI/Tab.cpp:1791 src/libslic3r/PrintConfig.cpp:1463
+#: src/libslic3r/PrintConfig.cpp:2343
msgid "Enable"
msgstr "WÅ‚Ä…cz"
-#: src/libslic3r/PrintConfig.cpp:313
+#: src/libslic3r/PrintConfig.cpp:347
msgid "Enable auto cooling"
msgstr "Włącz automatyczne chłodzenie"
-#: src/libslic3r/PrintConfig.cpp:572
+#: src/libslic3r/PrintConfig.cpp:608
msgid "Enable fan if layer print time is below"
msgstr "Włącz chłodzenie jeśli czas druku warstwy wynosi poniżej"
-#: src/libslic3r/PrintConfig.cpp:2908
+#: src/libslic3r/PrintConfig.cpp:3072
msgid "Enable hollowing"
msgstr "Włącz drążenie"
-#: src/libslic3r/PrintConfig.cpp:2380
+#: src/libslic3r/PrintConfig.cpp:2523
msgid "Enable horizontal mirroring of output images"
msgstr "Włącz odbicie poziome dla obrazów wyjściowych"
-#: src/libslic3r/PrintConfig.cpp:1867
+#: src/libslic3r/PrintConfig.cpp:1124
+msgid "Enable ironing"
+msgstr "WÅ‚Ä…cz prasowanie"
+
+#: src/libslic3r/PrintConfig.cpp:1125
+msgid "Enable ironing of the top layers with the hot print head for smooth surface"
+msgstr "Włącz prasowanie górnych warstw gorącą dyszą dla uzyskania gładkiej powierzchni"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3901
+msgid "Enable rotations (slow)"
+msgstr "WÅ‚Ä…cz obroty (powolne)"
+
+#: src/slic3r/GUI/Preferences.cpp:207
+msgid "Enable support for legacy 3DConnexion devices"
+msgstr "Włącz obsługę starszych urządzeń 3DConnexion"
+
+#: src/libslic3r/PrintConfig.cpp:2009
msgid "Enable support material generation."
msgstr "Włącz generowanie materiału podporowego."
-#: src/libslic3r/PrintConfig.cpp:966
+#: src/libslic3r/PrintConfig.cpp:1010
msgid "Enable this to add comments into the G-Code labeling print moves with what object they belong to, which is useful for the Octoprint CancelObject plugin. This settings is NOT compatible with Single Extruder Multi Material setup and Wipe into Object / Wipe into Infill."
-msgstr "Włącz tę opcję, aby dodawać komentarze do pliku G-code, przypisujące ruchy drukujące do konkretnych modeli, co pozwala współpracować z wtyczką CancelObject do OctoPrint. To ustawienie NIE jest kompatybilne z trybem Pojedynczym Multi Material i z ustawieniami Czyszczenia na wypełnieniu / modelu."
+msgstr "Włącz tę opcję, aby dodawać komentarze do pliku G-code, przypisujące ruchy drukujące do konkretnych modeli, co pozwala współpracować z wtyczką CancelObject w OctoPrint. To ustawienie NIE jest kompatybilne z trybem Pojedynczym Multi Material i z ustawieniami Czyszczenia na wypełnieniu / modelu."
-#: src/libslic3r/PrintConfig.cpp:929
+#: src/libslic3r/PrintConfig.cpp:973
msgid "Enable this to get a commented G-code file, with each line explained by a descriptive text. If you print from SD card, the additional weight of the file could make your firmware slow down."
-msgstr "Włącz tą opcję aby dodawać komentarz opsiujący do każdej liniki pliku G-code. Przy druku z karty SD dodatkowy rozmiar pliku może sprawiać, że firmware będzie reagować wolniej."
+msgstr "Włącz tą opcję, aby dodawać komentarz opisujący do każdej linijki pliku G-code. Przy druku z karty SD dodatkowy rozmiar pliku może sprawiać, że firmware będzie reagować wolniej."
-#: src/libslic3r/PrintConfig.cpp:2186
+#: src/libslic3r/PrintConfig.cpp:2329
msgid "Enable variable layer height feature"
msgstr "Zmienna wysokość warstwy"
-#: src/libslic3r/PrintConfig.cpp:2387
+#: src/libslic3r/PrintConfig.cpp:2530
msgid "Enable vertical mirroring of output images"
msgstr "Włącz odbicie pionowe dla obrazów wyjściowych"
-#: src/slic3r/GUI/Tab.cpp:1534 src/slic3r/GUI/Tab.cpp:1982
-#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:395
+#: src/slic3r/GUI/Tab.cpp:1880 src/slic3r/GUI/Tab.cpp:2168
+#: src/libslic3r/PrintConfig.cpp:419 src/libslic3r/PrintConfig.cpp:429
msgid "End G-code"
msgstr "G-code końcowy"
-#: src/libslic3r/PrintConfig.cpp:1924
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:239
+msgid "Enforce"
+msgstr "WymuÅ›"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:30
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:381
+msgid "Enforce seam"
+msgstr "WymuÅ› szew"
+
+#: src/libslic3r/PrintConfig.cpp:2066
msgid "Enforce support for the first"
msgstr "WymuÅ› podpory dla pierwszych"
-#: src/libslic3r/PrintConfig.cpp:1931
+#: src/libslic3r/PrintConfig.cpp:2073
msgid "Enforce support for the first n layers"
msgstr "WymuÅ› podpory dla pierwszych n warstw"
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47
+msgid "Enforce supports"
+msgstr "WymuÅ› podpory"
+
#: src/slic3r/GUI/PrintHostDialogs.cpp:198
#: src/slic3r/GUI/PrintHostDialogs.cpp:229
msgid "Enqueued"
msgstr "Zakolejkowano"
-#: src/libslic3r/PrintConfig.cpp:407
+#: src/libslic3r/PrintConfig.cpp:441
msgid "Ensure vertical shell thickness"
msgstr "Zagwarantuj odpowiednią grubość ścianki"
-#: src/slic3r/GUI/DoubleSlider.cpp:1618
+#: src/slic3r/GUI/GLCanvas3D.cpp:4402 src/slic3r/GUI/GLCanvas3D.cpp:4410
+#: src/slic3r/GUI/Search.cpp:433
+msgid "Enter a search term"
+msgstr "Wpisz wyszukiwanÄ… frazÄ™"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1814
msgid "Enter custom G-code used on current layer"
msgstr "Wprowadź własny G-code do wykonania na tej warstwie"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3803
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4266
msgid "Enter new name"
msgstr "Wprowadź nową nazwę"
-#: src/slic3r/GUI/DoubleSlider.cpp:1634
+#: src/slic3r/GUI/DoubleSlider.cpp:1830
msgid "Enter short message shown on Printer display when a print is paused"
msgstr "Wpisz krótką wiadomość wyświetlaną na ekranie drukarki, gdy druk jest wstrzymany"
-#: src/slic3r/GUI/ConfigWizard.cpp:1047
+#: src/slic3r/GUI/ConfigWizard.cpp:1413
msgid "Enter the bed temperature needed for getting your filament to stick to your heated bed."
msgstr "Wprowadź temperaturę potrzebną do dobrego przylegania filamentu do powierzchni podgrzewanego stołu."
-#: src/slic3r/GUI/ConfigWizard.cpp:979
+#: src/slic3r/GUI/ConfigWizard.cpp:1345
msgid "Enter the diameter of your filament."
msgstr "Wprowadź średnicę filamentu."
-#: src/slic3r/GUI/ConfigWizard.cpp:966
+#: src/slic3r/GUI/ConfigWizard.cpp:1332
msgid "Enter the diameter of your printer's hot end nozzle."
msgstr "Wprowadź średnicę dyszy hotendu."
-#: src/slic3r/GUI/DoubleSlider.cpp:1650
+#: src/slic3r/GUI/DoubleSlider.cpp:1851 src/slic3r/GUI/DoubleSlider.cpp:1855
msgid "Enter the height you want to jump to"
msgstr "Wprowadź wysokość, do której chcesz przejść"
-#: src/slic3r/GUI/Plater.cpp:4751
+#: src/slic3r/GUI/DoubleSlider.cpp:1851
+msgid "Enter the move you want to jump to"
+msgstr "Wpisz ruch, do którego chcesz przejść"
+
+#: src/slic3r/GUI/Plater.cpp:4855
msgid "Enter the number of copies:"
msgstr "Wpisz liczbÄ™ kopii:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1033
+#: src/slic3r/GUI/ConfigWizard.cpp:1399
msgid "Enter the temperature needed for extruding your filament."
msgstr "Wprowadź temperaturę potrzebną do ekstruzji filamentu."
-#: src/libslic3r/PrintConfig.cpp:761
+#: src/libslic3r/PrintConfig.cpp:813
+msgid "Enter weight of the empty filament spool. One may weigh a partially consumed filament spool before printing and one may compare the measured weight with the calculated weight of the filament with the spool to find out whether the amount of filament on the spool is sufficient to finish the print."
+msgstr "Wpisz wagę pustej szpuli. Możesz zważyć częściowo wykorzystaną szpulę przed drukowaniem i porównać wagę z obliczoną wagą filamentu ze szpulą, aby sprawdzić, czy pozostała ilość filamentu wystarczy na cały wydruk."
+
+#: src/libslic3r/PrintConfig.cpp:797
msgid "Enter your filament cost per kg here. This is only for statistical information."
msgstr "Wprowadź koszt filamentu za kilogram. Służy tylko statystykom."
-#: src/libslic3r/PrintConfig.cpp:718
+#: src/libslic3r/PrintConfig.cpp:754
msgid "Enter your filament density here. This is only for statistical information. A decent way is to weigh a known length of filament and compute the ratio of the length to volume. Better is to calculate the volume directly through displacement."
msgstr "Wprowadź gęstość filamentu. Służy tylko statystykom. Dobrą metodą jest zważenie filamentu o zmierzonej długości i przeliczenie stosunku wagi do objętości."
-#: src/libslic3r/PrintConfig.cpp:710
+#: src/libslic3r/PrintConfig.cpp:746
msgid "Enter your filament diameter here. Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average."
msgstr "Wprowadź średnicę filamentu. Wymagana jest precyzja, więc użyj suwmiarki i zmierz filament w kilku miejscach, potem oblicz średnią."
-#: src/slic3r/GUI/MainFrame.cpp:422 src/slic3r/GUI/MainFrame.cpp:785
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:39
+msgid "Entering Paint-on supports"
+msgstr "Otwieram malowanie podpór"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:40
+msgid "Entering Seam painting"
+msgstr "Otwieram malowanie szwu"
+
+#: src/slic3r/GUI/MainFrame.cpp:1003 src/slic3r/GUI/MainFrame.cpp:1486
#: src/slic3r/GUI/PrintHostDialogs.cpp:231
msgid "Error"
msgstr "BÅ‚Ä…d"
#: src/slic3r/GUI/FirmwareDialog.cpp:645
-#, c-format
+#, possible-c-format
msgid "Error accessing port at %s: %s"
msgstr "Brak dostępu do portu %s: %s"
-#: src/slic3r/GUI/Plater.cpp:3433
+#: src/slic3r/GUI/Plater.cpp:3238
msgid "Error during reload"
msgstr "Błąd podczas przeładowywania"
-#: src/slic3r/GUI/Plater.cpp:5043
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:5172
+#, possible-c-format
msgid "Error exporting 3MF file %s"
msgstr "BÅ‚Ä…d eksportowania pliku 3MF %s"
-#: src/slic3r/GUI/Plater.cpp:5005
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:5138
+#, possible-c-format
msgid "Error exporting AMF file %s"
msgstr "BÅ‚Ä…d eksportu pliku AMF %s"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:154
+#: src/slic3r/GUI/OpenGLManager.cpp:276
+msgid "Error loading shaders"
+msgstr "Błąd ładowania modułów cieniujących"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:152
msgid "Error Message"
msgstr "Komunikat o błędzie"
-#: src/slic3r/GUI/AppConfig.cpp:114
+#: src/slic3r/GUI/GUI_App.cpp:661
+msgid "Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to manually delete the file to recover from the error."
+msgstr "Błąd przetwarzania pliku konfiguracyjnego PrusaGCodeViewer. Prawdopodobnie jest uszkodzony. Spróbuj ręcznie usunąć plik, aby pozbyć się błędu."
+
+#: src/slic3r/GUI/GUI_App.cpp:655 src/slic3r/GUI/GUI_App.cpp:670
msgid "Error parsing PrusaSlicer config file, it is probably corrupted. Try to manually delete the file to recover from the error. Your user profiles will not be affected."
msgstr "Błąd przetwarzania pliku konfiguracyjnego PrusaSlicer. Prawdopodobnie jest uszkodzony. Spróbuj ręcznie usunąć plik, aby pozbyć się błędu. Nie wpłynie to na Twoje profile."
@@ -2363,163 +2753,195 @@ msgstr "BÅ‚Ä…d przetwarzania pliku konfiguracyjnego PrusaSlicer. Prawdopodobnie
msgid "Error uploading to print host:"
msgstr "Błąd wysyłania do serwera druku:"
-#: src/libslic3r/Zipper.cpp:102
+#: src/slic3r/GUI/Plater.cpp:4752
+msgid "Error while loading .gcode file"
+msgstr "BÅ‚Ä…d wczytywania pliku .gcode"
+
+#: src/libslic3r/Zipper.cpp:27
msgid "Error with zip archive"
msgstr "BÅ‚Ä…d archiwum .zip"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1918
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2077
msgid "Error!"
msgstr "BÅ‚Ä…d!"
-#: src/slic3r/GUI/BedShapeDialog.cpp:505
+#: src/slic3r/GUI/BedShapeDialog.cpp:581
msgid "Error! Invalid model"
msgstr "Błąd! Nieprawidłowy model"
+#: src/slic3r/GUI/NotificationManager.cpp:667
+#: src/slic3r/GUI/NotificationManager.cpp:683
+#: src/slic3r/GUI/NotificationManager.cpp:694
+msgid "ERROR:"
+msgstr "BÅÄ„D:"
+
#: src/slic3r/GUI/FirmwareDialog.cpp:647
-#, c-format
+#, possible-c-format
msgid "Error: %s"
msgstr "BÅ‚Ä…d: %s"
-#: src/slic3r/GUI/Job.hpp:123
+#: src/slic3r/GUI/Jobs/Job.cpp:74
msgid "ERROR: not enough resources to execute a new job."
msgstr "BÅÄ„D: brak zasobów do wykonania nowego zadania."
-#: src/slic3r/GUI/Plater.cpp:240 src/slic3r/GUI/Plater.cpp:1216
-#: src/slic3r/GUI/Plater.cpp:1258
+#: src/slic3r/GUI/Plater.cpp:3374
+msgid "ERROR: Please close all manipulators available from the left toolbar before fixing the mesh."
+msgstr "BÅÄ„D: Zamknij wszystkie manipulatory dostÄ™pne w lewym pasku narzÄ™dzi przed podjÄ™ciem naprawy modelu."
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2552 src/slic3r/GUI/GCodeViewer.cpp:2557
+#: src/slic3r/GUI/Plater.cpp:246 src/slic3r/GUI/Plater.cpp:1125
+#: src/slic3r/GUI/Plater.cpp:1175 src/slic3r/GUI/Plater.cpp:1196
msgid "Estimated printing time"
msgstr "Szacowany czas druku"
-#: src/slic3r/GUI/Plater.cpp:502
+#: src/slic3r/GUI/GCodeViewer.cpp:2442 src/slic3r/GUI/GCodeViewer.cpp:2445
+msgid "Event"
+msgstr "Wydarzenie"
+
+#: src/slic3r/GUI/Plater.cpp:368
msgid "Everywhere"
msgstr "Wszędzie"
-#: src/slic3r/GUI/PresetHints.cpp:51
+#: src/slic3r/GUI/PresetHints.cpp:50
msgid "except for the first %1% layers."
msgstr "za wyjÄ…tkiem pierwszych %1% warstw."
-#: src/slic3r/GUI/PresetHints.cpp:53
+#: src/slic3r/GUI/PresetHints.cpp:52
msgid "except for the first layer."
msgstr "za wyjÄ…tkiem pierwszej warstwy."
-#: src/libslic3r/Print.cpp:1377
+#: src/libslic3r/Print.cpp:1403
msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm"
msgstr "Wartość %1%=%2% mm jest zbyt duża, żeby mogła być wydrukowana z dyszą o średnicy %3% mm"
#: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246
-#, c-format
+#, possible-c-format
msgid "Exit %s"
msgstr "Wyjście %s"
-#: src/libslic3r/PrintConfig.cpp:371
+#: src/slic3r/GUI/Plater.cpp:2143
+msgid "Expand sidebar"
+msgstr "Rozwiń pasek narzędzi"
+
+#: src/libslic3r/PrintConfig.cpp:405
msgid "Experimental option for preventing support material from being generated under bridged areas."
msgstr "Funkcja eksperymentalna mająca zapobiegać tworzeniu podpór pod mostami."
-#: src/libslic3r/PrintConfig.cpp:1375
+#: src/libslic3r/PrintConfig.cpp:1483
msgid "Experimental option to adjust flow for overhangs (bridge flow will be used), to apply bridge speed to them and enable fan."
msgstr "Opcja eksperymentalna dostosowująca przepływ przy zwisach (zostanie zastosowany przepływ taki jak dla mostów), zastosuje również prędkość i chłodzenie takie jak dla mostów."
-#: src/slic3r/GUI/GUI_App.cpp:815 src/slic3r/GUI/wxExtensions.cpp:755
+#: src/slic3r/GUI/GUI_App.cpp:1507 src/slic3r/GUI/wxExtensions.cpp:676
msgid "Expert"
msgstr "Ekspert"
-#: src/slic3r/GUI/ConfigWizard.cpp:822
+#: src/slic3r/GUI/ConfigWizard.cpp:1181
msgid "Expert mode"
msgstr "Tryb Eksperta"
-#: src/slic3r/GUI/GUI_App.cpp:815
+#: src/slic3r/GUI/GUI_App.cpp:1507
msgid "Expert View Mode"
msgstr "Tryb Widoku Eksperta"
-#: src/slic3r/GUI/Plater.cpp:5521
+#: src/slic3r/GUI/Plater.cpp:5706
msgid "Export"
msgstr "Eksport"
-#: src/slic3r/GUI/MainFrame.cpp:500
+#: src/slic3r/GUI/MainFrame.cpp:1094
msgid "Export &Config"
msgstr "Eksport Konfigura&cji"
-#: src/slic3r/GUI/MainFrame.cpp:477 src/slic3r/GUI/MainFrame.cpp:749
+#: src/slic3r/GUI/MainFrame.cpp:1068 src/slic3r/GUI/MainFrame.cpp:1448
msgid "Export &G-code"
msgstr "Eksport &G-code"
-#: src/slic3r/GUI/MainFrame.cpp:496
+#: src/slic3r/GUI/MainFrame.cpp:1090 src/slic3r/GUI/MainFrame.cpp:1395
msgid "Export &toolpaths as OBJ"
msgstr "Ekspor&t ścieżek narzędzi jako OBJ"
-#: src/libslic3r/PrintConfig.cpp:3338
+#: src/libslic3r/PrintConfig.cpp:3531
msgid "Export 3MF"
msgstr "Eksport 3MF"
-#: src/slic3r/GUI/MainFrame.cpp:503
+#: src/slic3r/GUI/MainFrame.cpp:1100
+msgid "Export all presets including physical printers to file"
+msgstr "Eksport do pliku wszystkich zestawów ustawień wraz z fizycznymi drukarkami"
+
+#: src/slic3r/GUI/MainFrame.cpp:1097
msgid "Export all presets to file"
msgstr "Eksport wszystkich zestawów ustawień do pliku"
-#: src/libslic3r/PrintConfig.cpp:3343
+#: src/libslic3r/PrintConfig.cpp:3536
msgid "Export AMF"
msgstr "Eksport AMF"
-#: src/slic3r/GUI/Plater.cpp:2598
+#: src/slic3r/GUI/Plater.cpp:2560
msgid "Export AMF file:"
msgstr "Eksport pliku AMF:"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1657 src/slic3r/GUI/Plater.cpp:3966
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1786 src/slic3r/GUI/Plater.cpp:3884
msgid "Export as STL"
msgstr "Eksport jako STL"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:124
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:117
msgid "Export config"
msgstr "Eksport konfiguracji"
-#: src/slic3r/GUI/MainFrame.cpp:503
+#: src/slic3r/GUI/MainFrame.cpp:1097
msgid "Export Config &Bundle"
msgstr "Eks&port Paczki Konfiguracyjnej"
-#: src/slic3r/GUI/MainFrame.cpp:500
+#: src/slic3r/GUI/MainFrame.cpp:1100
+msgid "Export Config Bundle With Physical Printers"
+msgstr "Eksport paczki konfiguracyjnej z drukarkami fizycznymi"
+
+#: src/slic3r/GUI/MainFrame.cpp:1094
msgid "Export current configuration to file"
msgstr "Eksport obecnej konfiguracji do pliku"
-#: src/slic3r/GUI/MainFrame.cpp:492
+#: src/slic3r/GUI/MainFrame.cpp:1086
msgid "Export current plate as AMF"
msgstr "Eksport zawartości stołu jako AMF"
-#: src/slic3r/GUI/MainFrame.cpp:477
+#: src/slic3r/GUI/MainFrame.cpp:1068
msgid "Export current plate as G-code"
msgstr "Eksport zawartości stołu jako G-code"
-#: src/slic3r/GUI/MainFrame.cpp:521
+#: src/slic3r/GUI/MainFrame.cpp:1076
msgid "Export current plate as G-code to SD card / Flash drive"
msgstr "Eksport zawartości stołu jako G-gode na kartę SD / pamięć flash"
-#: src/slic3r/GUI/MainFrame.cpp:486
+#: src/slic3r/GUI/MainFrame.cpp:1080
msgid "Export current plate as STL"
msgstr "Eksport zawartości stołu jako STL"
-#: src/slic3r/GUI/MainFrame.cpp:489
+#: src/slic3r/GUI/MainFrame.cpp:1083
msgid "Export current plate as STL including supports"
msgstr "Eksport zawartości stołu jako STL wraz z podporami"
-#: src/slic3r/GUI/Plater.cpp:3664
-msgid "Export failed"
-msgstr "Niepowodzenie eksportu"
-
-#: src/slic3r/GUI/ConfigWizard.cpp:801
+#: src/slic3r/GUI/ConfigWizard.cpp:1160
msgid "Export full pathnames of models and parts sources into 3mf and amf files"
msgstr "Eksport pełnych ścieżek źródłowych modeli i części do plików 3MF i AMF"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 src/slic3r/GUI/Plater.cpp:891
-#: src/slic3r/GUI/Plater.cpp:5521 src/libslic3r/PrintConfig.cpp:3353
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:115 src/slic3r/GUI/Plater.cpp:766
+#: src/slic3r/GUI/Plater.cpp:5706 src/libslic3r/PrintConfig.cpp:3546
msgid "Export G-code"
msgstr "Eksport G-code"
-#: src/slic3r/GUI/MainFrame.cpp:521
+#: src/slic3r/GUI/MainFrame.cpp:1076
msgid "Export G-code to SD card / Flash drive"
msgstr "Eksport G-gode na kartę SD / pamięć flash"
-#: src/libslic3r/PrintConfig.cpp:3320
+#: src/slic3r/GUI/NotificationManager.cpp:631
+#: src/slic3r/GUI/NotificationManager.cpp:748
+msgid "Export G-Code."
+msgstr "Eksport G-code."
+
+#: src/libslic3r/PrintConfig.cpp:3513
msgid "Export OBJ"
msgstr "Eksport OBJ"
-#: src/slic3r/GUI/Plater.cpp:2610
+#: src/slic3r/GUI/Plater.cpp:2572
msgid "Export OBJ file:"
msgstr "Eksport pliku OBJ:"
@@ -2527,212 +2949,215 @@ msgstr "Eksport pliku OBJ:"
msgid "Export of a temporary 3mf file failed"
msgstr "Niepowodzenie eksportu tymczasowego pliku 3MF"
-#: src/slic3r/GUI/MainFrame.cpp:492
+#: src/slic3r/GUI/MainFrame.cpp:1086
msgid "Export plate as &AMF"
msgstr "Eksport zawartości stołu jako &AMF"
-#: src/slic3r/GUI/MainFrame.cpp:486
+#: src/slic3r/GUI/MainFrame.cpp:1080
msgid "Export plate as &STL"
msgstr "Eksport zawartości stołu jako &STL"
-#: src/slic3r/GUI/MainFrame.cpp:489
+#: src/slic3r/GUI/MainFrame.cpp:1083
msgid "Export plate as STL &including supports"
msgstr "Eksport zawartośc&i stołu z podporami do STL"
-#: src/libslic3r/PrintConfig.cpp:3332
+#: src/libslic3r/PrintConfig.cpp:3525
msgid "Export SLA"
msgstr "Eksport SLA"
-#: src/slic3r/GUI/Preferences.cpp:72
+#: src/slic3r/GUI/Preferences.cpp:89
msgid "Export sources full pathnames to 3mf and amf"
msgstr "Eksport pełnych ścieżek do 3MF i AMF"
-#: src/libslic3r/PrintConfig.cpp:3348
+#: src/libslic3r/PrintConfig.cpp:3541
msgid "Export STL"
msgstr "Eksport STL"
-#: src/slic3r/GUI/Plater.cpp:2591
+#: src/slic3r/GUI/Plater.cpp:2553
msgid "Export STL file:"
msgstr "Eksport pliku STL:"
-#: src/libslic3r/PrintConfig.cpp:3339
+#: src/libslic3r/PrintConfig.cpp:3532
msgid "Export the model(s) as 3MF."
msgstr "Eksport model(i) jako 3MF."
-#: src/libslic3r/PrintConfig.cpp:3344
+#: src/libslic3r/PrintConfig.cpp:3537
msgid "Export the model(s) as AMF."
msgstr "Eksport model(i) jako AMF."
-#: src/libslic3r/PrintConfig.cpp:3321
+#: src/libslic3r/PrintConfig.cpp:3514
msgid "Export the model(s) as OBJ."
msgstr "Eksport model(i) jako OBJ."
-#: src/libslic3r/PrintConfig.cpp:3349
+#: src/libslic3r/PrintConfig.cpp:3542
msgid "Export the model(s) as STL."
msgstr "Eksport modeli jako STL."
-#: src/slic3r/GUI/Plater.cpp:3966
+#: src/slic3r/GUI/Plater.cpp:3884
msgid "Export the selected object as STL file"
msgstr "Eksport wybranego modelu jako plik STL"
-#: src/slic3r/GUI/Plater.cpp:880
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:118 src/slic3r/GUI/Plater.cpp:755
msgid "Export to SD card / Flash drive"
msgstr "Eksport na kartę SD / pamięć flash"
-#: src/slic3r/GUI/MainFrame.cpp:496
+#: src/slic3r/GUI/MainFrame.cpp:1090 src/slic3r/GUI/MainFrame.cpp:1395
msgid "Export toolpaths as OBJ"
msgstr "Eksport ścieżek narzędzi jako OBJ"
-#: src/libslic3r/Print.cpp:1638
+#: src/slic3r/GUI/NotificationManager.hpp:317
+msgid "Exporting finished."
+msgstr "Eksport zakończony."
+
+#: src/libslic3r/Print.cpp:1676
msgid "Exporting G-code"
msgstr "Eksportowanie G-code"
#: src/slic3r/Utils/FixModelByWin10.cpp:341
-msgid "Exporting model..."
-msgstr "Eksportowanie modelu..."
+msgid "Exporting model"
+msgstr "Eksportowanie modelu"
#: src/slic3r/Utils/FixModelByWin10.cpp:219
#: src/slic3r/Utils/FixModelByWin10.cpp:359
msgid "Exporting source model"
msgstr "Eksport modelu źródłowego"
-#: src/libslic3r/SLAPrint.cpp:646
+#: src/libslic3r/SLAPrint.cpp:660
msgid "Exposition time is out of printer profile bounds."
msgstr "Czas naświetlania jest poza zakresem profilu drukarki."
-#: src/slic3r/GUI/Tab.cpp:2117 src/slic3r/GUI/Tab.cpp:3515
+#: src/slic3r/GUI/Tab.cpp:2287 src/slic3r/GUI/Tab.cpp:3931
msgid "Exposure"
msgstr "Naświetlanie"
-#: src/libslic3r/PrintConfig.cpp:2541 src/libslic3r/PrintConfig.cpp:2542
+#: src/libslic3r/PrintConfig.cpp:2684 src/libslic3r/PrintConfig.cpp:2685
msgid "Exposure time"
msgstr "Czas naświetlania"
-#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:311
+#: src/slic3r/GUI/GUI_Preview.cpp:302 src/libslic3r/ExtrusionEntity.cpp:315
+#: src/libslic3r/ExtrusionEntity.cpp:338
msgid "External perimeter"
msgstr "Obrys zewnętrzny"
-#: src/slic3r/GUI/PresetHints.cpp:156
+#: src/slic3r/GUI/PresetHints.cpp:155
msgid "external perimeters"
msgstr "obrysów zewnętrznych"
-#: src/libslic3r/PrintConfig.cpp:446 src/libslic3r/PrintConfig.cpp:457
+#: src/libslic3r/PrintConfig.cpp:482 src/libslic3r/PrintConfig.cpp:493
msgid "External perimeters"
msgstr "Obrysy zewnętrzne"
-#: src/libslic3r/PrintConfig.cpp:469
+#: src/libslic3r/PrintConfig.cpp:505
msgid "External perimeters first"
msgstr "Najpierw obrysy zewnętrzne"
-#: src/libslic3r/PrintConfig.cpp:1588 src/libslic3r/PrintConfig.cpp:1596
+#: src/libslic3r/PrintConfig.cpp:1696 src/libslic3r/PrintConfig.cpp:1704
msgid "Extra length on restart"
msgstr "Dodatkowa ilość dla powrotu"
-#: src/libslic3r/PrintConfig.cpp:1390
+#: src/libslic3r/PrintConfig.cpp:1498
msgid "Extra loading distance"
msgstr "Dodatkowa długość ładowania"
-#: src/libslic3r/PrintConfig.cpp:477
+#: src/libslic3r/PrintConfig.cpp:513
msgid "Extra perimeters if needed"
msgstr "Dodatkowe obrysy jeśli potrzebne"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:278 src/slic3r/GUI/Tab.cpp:1434
-#: src/slic3r/GUI/wxExtensions.cpp:598 src/libslic3r/PrintConfig.cpp:487
+#: src/slic3r/GUI/GCodeViewer.cpp:2277 src/slic3r/GUI/GCodeViewer.cpp:2313
+#: src/slic3r/GUI/GCodeViewer.cpp:2318 src/slic3r/GUI/GUI_ObjectList.cpp:296
+#: src/slic3r/GUI/Tab.cpp:1780 src/slic3r/GUI/wxExtensions.cpp:515
+#: src/libslic3r/PrintConfig.cpp:523
msgid "Extruder"
msgstr "Ekstruder"
-#: src/slic3r/GUI/DoubleSlider.cpp:1134 src/slic3r/GUI/DoubleSlider.cpp:1170
-#: src/slic3r/GUI/GLCanvas3D.cpp:977 src/slic3r/GUI/GUI_ObjectList.cpp:1704
-#: src/slic3r/GUI/Tab.cpp:2320 src/libslic3r/GCode/PreviewData.cpp:445
-#, c-format
+#: src/slic3r/GUI/DoubleSlider.cpp:1263 src/slic3r/GUI/DoubleSlider.cpp:1297
+#: src/slic3r/GUI/GLCanvas3D.cpp:983 src/slic3r/GUI/GUI_ObjectList.cpp:1832
+#: src/slic3r/GUI/Tab.cpp:2489 src/libslic3r/GCode/PreviewData.cpp:450
+#, possible-c-format
msgid "Extruder %d"
msgstr "Ekstruder %d"
-#: src/slic3r/GUI/DoubleSlider.cpp:1011
+#: src/slic3r/GUI/DoubleSlider.cpp:1137
msgid "Extruder (tool) is changed to Extruder \"%1%\""
msgstr "Ekstruder został zmieniony na ekstruder \"%1%\""
-#: src/slic3r/GUI/ConfigWizard.cpp:1017
-msgid "Extruder and Bed Temperatures"
-msgstr "Temperatury ekstrudera i stołu"
-
#: src/slic3r/GUI/WipeTowerDialog.cpp:255
msgid "Extruder changed to"
msgstr "Ekstruder zmieniony na"
-#: src/slic3r/GUI/Tab.cpp:1233
-msgid "Extruder clearance (mm)"
-msgstr "Odstęp od ekstrudera (mm)"
+#: src/slic3r/GUI/Tab.cpp:1589
+msgid "Extruder clearance"
+msgstr "Odstęp od ekstrudera"
-#: src/libslic3r/PrintConfig.cpp:522
+#: src/libslic3r/PrintConfig.cpp:558
msgid "Extruder Color"
msgstr "Kolor ekstrudera"
-#: src/libslic3r/PrintConfig.cpp:529
+#: src/libslic3r/PrintConfig.cpp:565
msgid "Extruder offset"
msgstr "Margines ekstrudera"
-#: src/libslic3r/PrintConfig.cpp:911
-msgid "Extruder temperature for first layer. If you want to control temperature manually during print, set this to zero to disable temperature control commands in the output file."
-msgstr "Temperatura ekstrudera dla pierwszej warstwy. Jeśli chcesz ręcznie kontrolować temperaturę podczas druku to ustaw zero aby wyłączyć komendy kontrolujące temperaturę w pliku wyjściowym."
-
-#: src/libslic3r/PrintConfig.cpp:2065
-msgid "Extruder temperature for layers after the first one. Set this to zero to disable temperature control commands in the output."
-msgstr "Temperatura ekstrudera dla warstw powyżej pierwszej. Ustaw zero aby wyłączyć komendy kontrolujące temperaturę w pliku wyjściowym."
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:99 src/slic3r/GUI/GUI_ObjectList.cpp:617
-#: src/slic3r/GUI/Tab.cpp:1180 src/slic3r/GUI/Tab.cpp:1838
-#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:1002
-#: src/libslic3r/PrintConfig.cpp:1409 src/libslic3r/PrintConfig.cpp:1737
-#: src/libslic3r/PrintConfig.cpp:1938 src/libslic3r/PrintConfig.cpp:1965
+#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:656
+#: src/slic3r/GUI/Tab.cpp:1510 src/slic3r/GUI/Tab.cpp:2072
+#: src/libslic3r/PrintConfig.cpp:524 src/libslic3r/PrintConfig.cpp:1046
+#: src/libslic3r/PrintConfig.cpp:1517 src/libslic3r/PrintConfig.cpp:1852
+#: src/libslic3r/PrintConfig.cpp:2080 src/libslic3r/PrintConfig.cpp:2107
msgid "Extruders"
msgstr "Ekstrudery"
-#: src/libslic3r/PrintConfig.cpp:539
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1061
+msgid "Extruders count"
+msgstr "Liczba ekstruderów"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2493
+msgid "Extrusion"
+msgstr "Ekstruzja"
+
+#: src/libslic3r/PrintConfig.cpp:575
msgid "Extrusion axis"
msgstr "OÅ› ekstruzji"
-#: src/libslic3r/PrintConfig.cpp:545
+#: src/libslic3r/PrintConfig.cpp:581
msgid "Extrusion multiplier"
msgstr "Współczynnik ekstruzji"
-#: src/slic3r/GUI/ConfigWizard.cpp:1037
+#: src/slic3r/GUI/ConfigWizard.cpp:1403
msgid "Extrusion Temperature:"
msgstr "Temperatura ekstrudera:"
-#: src/slic3r/GUI/Tab.cpp:1205
+#: src/slic3r/GUI/Tab.cpp:1535
msgid "Extrusion width"
msgstr "Szerokość ekstruzji"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:100 src/slic3r/GUI/GUI_ObjectList.cpp:618
-#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:555
-#: src/libslic3r/PrintConfig.cpp:877 src/libslic3r/PrintConfig.cpp:1010
-#: src/libslic3r/PrintConfig.cpp:1418 src/libslic3r/PrintConfig.cpp:1757
-#: src/libslic3r/PrintConfig.cpp:1947 src/libslic3r/PrintConfig.cpp:2106
+#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:657
+#: src/libslic3r/PrintConfig.cpp:483 src/libslic3r/PrintConfig.cpp:591
+#: src/libslic3r/PrintConfig.cpp:919 src/libslic3r/PrintConfig.cpp:1054
+#: src/libslic3r/PrintConfig.cpp:1526 src/libslic3r/PrintConfig.cpp:1872
+#: src/libslic3r/PrintConfig.cpp:2089 src/libslic3r/PrintConfig.cpp:2249
msgid "Extrusion Width"
msgstr "Szerokość Ekstruzji"
-#: src/slic3r/GUI/Plater.cpp:162
+#: src/slic3r/GUI/Plater.cpp:168
msgid "Facets"
msgstr "Powierzchnie"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:349
+#: src/slic3r/GUI/GUI_ObjectList.cpp:396
msgid "facets added"
msgstr "dodano powierzchnie"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:348
+#: src/slic3r/GUI/GUI_ObjectList.cpp:395
msgid "facets removed"
msgstr "usunięto powierzchnie"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:350
+#: src/slic3r/GUI/GUI_ObjectList.cpp:397
msgid "facets reversed"
msgstr "odwrócono powierzchnie"
-#: src/libslic3r/PrintConfig.cpp:2517
+#: src/libslic3r/PrintConfig.cpp:2660
msgid "Faded layers"
msgstr "Warstwy przejściowe"
-#: src/libslic3r/Zipper.cpp:44
+#: src/libslic3r/miniz_extension.cpp:103
msgid "failed finding central directory"
msgstr "nie odnaleziono katalogu centralnego"
@@ -2740,105 +3165,135 @@ msgstr "nie odnaleziono katalogu centralnego"
msgid "Failed loading the input model."
msgstr "Niepowodzenie ładowania modelu wejściowego."
-#: src/libslic3r/PrintBase.cpp:71
+#: src/libslic3r/PrintBase.cpp:72
msgid "Failed processing of the output_filename_format template."
msgstr "Błąd przetwarzania wzoru output_filename_format (format nazwy pliku wyjściowego)."
-#: src/slic3r/GUI/PresetHints.cpp:42
-msgid "Fan"
-msgstr "Wentylator"
+#: src/slic3r/GUI/GUI_App.cpp:1648
+msgid "Failed to activate configuration snapshot."
+msgstr "Niepowodzenie aktywacji zrzutu konfiguracji."
-#: src/slic3r/GUI/Tab.cpp:1456
+#: src/slic3r/GUI/Tab.cpp:1802
msgid "Fan settings"
msgstr "Ustawienia wentylatora"
-#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/Tab.cpp:1457
+#: src/slic3r/GUI/GUI_Preview.cpp:279 src/slic3r/GUI/Tab.cpp:1803
msgid "Fan speed"
msgstr "Prędkość wentylatora"
-#: src/libslic3r/GCode/PreviewData.cpp:353
+#: src/slic3r/GUI/GCodeViewer.cpp:2239 src/libslic3r/GCode/PreviewData.cpp:358
msgid "Fan Speed (%)"
msgstr "Prędkość wentylatora (%)"
-#: src/libslic3r/PrintConfig.cpp:2405
+#: src/slic3r/GUI/PresetHints.cpp:49
+msgid "Fan speed will be ramped from zero at layer %1% to %2%%% at layer %3%."
+msgstr "Prędkość wentylatora będzie podnoszona od zera na warstwie %1% do %2%%% na warstwie %3%."
+
+#: src/libslic3r/PrintConfig.cpp:1001
+msgid "Fan speed will be ramped up linearly from zero at layer \"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". \"full_fan_speed_layer\" will be ignored if lower than \"disable_fan_first_layers\", in which case the fan will be running at maximum allowed speed at layer \"disable_fan_first_layers\" + 1."
+msgstr "Prędkość wentylatora będzie podnoszona liniowo od zera na warstwie \"disable_fan_first_layers\" do maksimum na warstwie \"full_fan_speed_layer\". Parametr \"full_fan_speed_layer\" będzie ignorowany, jeśli jest niższy niż \"disable_fan_first_layers\" i w takim przypadku będzie pracować z najwyższą dozwoloną prędkością na warstwie \"disable_fan_first_layers\" +1."
+
+#: src/slic3r/GUI/PresetHints.cpp:51
+msgid "Fan will always run at %1%%%"
+msgstr "Wentylator będzie zawsze pracować na %1%%%"
+
+#: src/slic3r/GUI/PresetHints.cpp:58
+msgid "Fan will be turned off."
+msgstr "Wentylator będzie wyłączony."
+
+#: src/libslic3r/PrintConfig.cpp:2548
msgid "Fast"
msgstr "Szybkie"
-#: src/libslic3r/PrintConfig.cpp:2406
+#: src/libslic3r/PrintConfig.cpp:2549
msgid "Fast tilt"
msgstr "Szybkie przechylanie"
-#: src/slic3r/GUI/GUI_App.cpp:141
+#: src/slic3r/GUI/GUI_App.cpp:531
msgid "Fatal error"
msgstr "BÅ‚Ä…d krytyczny"
-#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/GUI_Preview.cpp:575
-#: src/libslic3r/GCode/PreviewData.cpp:345
+#: src/slic3r/GUI/GUI_Init.cpp:88
+msgid "Fatal error, exception catched: %1%"
+msgstr "BÅ‚Ä…d krytyczny, wyjÄ…tek wychwycony: %1%"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2225 src/slic3r/GUI/GCodeViewer.cpp:2233
+#: src/slic3r/GUI/GUI_Preview.cpp:275 src/slic3r/GUI/GUI_Preview.cpp:787
+#: src/libslic3r/GCode/PreviewData.cpp:350
msgid "Feature type"
msgstr "Rodzaj funkcji"
-#: src/slic3r/GUI/GUI_Preview.cpp:234 src/slic3r/GUI/GUI_Preview.cpp:235
+#: src/slic3r/GUI/GUI_Preview.cpp:293 src/slic3r/GUI/GUI_Preview.cpp:295
+#: src/slic3r/GUI/GUI_Preview.cpp:316
msgid "Feature types"
msgstr "Rodzaje funkcji"
-#: src/slic3r/GUI/ConfigWizard.cpp:1525
+#: src/slic3r/GUI/ConfigWizard.cpp:1926
msgid "FFF Technology Printers"
msgstr "Drukarki FFF"
-#: src/slic3r/GUI/Plater.cpp:816 src/slic3r/GUI/Tab.cpp:1425
-#: src/slic3r/GUI/Tab.cpp:1426
+#: src/slic3r/GUI/Plater.cpp:691 src/slic3r/GUI/Tab.cpp:1770
+#: src/slic3r/GUI/Tab.cpp:1771
msgid "Filament"
msgstr "Filament"
-#: src/slic3r/GUI/Preset.cpp:1522
+#: src/libslic3r/Preset.cpp:1301
msgid "filament"
msgstr "filament"
-#: src/slic3r/GUI/ConfigWizard.cpp:952
+#: src/slic3r/GUI/ConfigWizard.cpp:1318
msgid "Filament and Nozzle Diameters"
msgstr "Åšrednice filamentu i dyszy"
-#: src/slic3r/GUI/ConfigWizard.cpp:983
+#: src/slic3r/GUI/Plater.cpp:1189
+msgid "Filament at extruder %1%"
+msgstr "Filament w ekstruderze %1%"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1349
msgid "Filament Diameter:"
msgstr "Åšrednica Filamentu:"
-#: src/libslic3r/PrintConfig.cpp:651
+#: src/libslic3r/PrintConfig.cpp:687
msgid "Filament is cooled by being moved back and forth in the cooling tubes. Specify desired number of these moves."
msgstr "Filament jest chłodzony przez ruch w tę i z powrotem wewnątrz rurek chłodzących. Określ ilość tych ruchów."
-#: src/libslic3r/PrintConfig.cpp:686
+#: src/libslic3r/PrintConfig.cpp:722
msgid "Filament load time"
msgstr "Czas Å‚adowania filamentu"
-#: src/libslic3r/PrintConfig.cpp:588
+#: src/libslic3r/PrintConfig.cpp:624
msgid "Filament notes"
msgstr "Notatki do filamentu"
-#: src/slic3r/GUI/Tab.cpp:1323 src/slic3r/GUI/Tab.cpp:1378
+#: src/slic3r/GUI/Tab.cpp:1669
msgid "Filament Overrides"
msgstr "Nadpisywane Ustawienia"
-#: src/libslic3r/PrintConfig.cpp:1381
+#: src/libslic3r/PrintConfig.cpp:1489
msgid "Filament parking position"
msgstr "Pozycja zatrzymania filamentu"
-#: src/slic3r/GUI/ConfigWizard.cpp:2013
+#: src/slic3r/GUI/ConfigWizard.cpp:2524
msgid "Filament Profiles Selection"
msgstr "Wybór profili filamentu"
-#: src/slic3r/GUI/Tab.cpp:1471
+#: src/slic3r/GUI/Tab.cpp:1817
msgid "Filament properties"
msgstr "Właściwości filamentu"
-#: src/slic3r/GUI/Tab.hpp:355
+#: src/slic3r/GUI/Tab.hpp:409
msgid "Filament Settings"
msgstr "Ustawienia Filamentu"
-#: src/libslic3r/PrintConfig.cpp:726
+#: src/slic3r/GUI/GLCanvas3D.cpp:4304 src/slic3r/GUI/GLCanvas3D.cpp:4940
+msgid "Filament Settings Tab"
+msgstr "Ustawienia filamentu"
+
+#: src/libslic3r/PrintConfig.cpp:762
msgid "Filament type"
msgstr "Typ filamentu"
-#: src/libslic3r/PrintConfig.cpp:701
+#: src/libslic3r/PrintConfig.cpp:737
msgid "Filament unload time"
msgstr "Czas rozładowania filamentu"
@@ -2846,83 +3301,103 @@ msgstr "Czas rozładowania filamentu"
msgid "filaments"
msgstr "filamenty"
-#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2013
+#: src/slic3r/GUI/ConfigWizard.cpp:1872 src/slic3r/GUI/ConfigWizard.cpp:2524
msgid "Filaments"
msgstr "Filamenty"
-#: src/libslic3r/Zipper.cpp:72
+#: src/slic3r/GUI/ConfigWizard.cpp:691
+msgid "Filaments marked with <b>*</b> are <b>not</b> compatible with some installed printers."
+msgstr "Filamenty oznaczone <b>*</b> <b>nie są</b> kompatybilne z niektórymi z zainstalowanych drukarek."
+
+#: src/libslic3r/miniz_extension.cpp:131
msgid "file close failed"
msgstr "niepowodzenia zamykania pliku"
-#: src/libslic3r/Zipper.cpp:66
+#: src/libslic3r/miniz_extension.cpp:125
msgid "file create failed"
msgstr "niepowodzenie tworzenia pliku"
-#: src/slic3r/GUI/MainFrame.cpp:791
+#: src/slic3r/GUI/MainFrame.cpp:1492
msgid "File Not Found"
msgstr "Nie znaleziono pliku"
-#: src/libslic3r/Zipper.cpp:86
+#: src/libslic3r/miniz_extension.cpp:145
msgid "file not found"
msgstr "nie znaleziono pliku"
-#: src/libslic3r/Zipper.cpp:64
+#: src/libslic3r/miniz_extension.cpp:123
msgid "file open failed"
msgstr "niepowodzenie otwierania pliku"
-#: src/libslic3r/Zipper.cpp:70
+#: src/libslic3r/miniz_extension.cpp:129
msgid "file read failed"
msgstr "niepowodzenie odczytu pliku"
-#: src/libslic3r/Zipper.cpp:74
+#: src/libslic3r/miniz_extension.cpp:133
msgid "file seek failed"
msgstr "niepowodzenie szukania pliku"
-#: src/libslic3r/Zipper.cpp:76
+#: src/libslic3r/miniz_extension.cpp:135
msgid "file stat failed"
msgstr "niepowodzenie odczytu statystyk pliku"
-#: src/libslic3r/Zipper.cpp:36
+#: src/libslic3r/miniz_extension.cpp:95
msgid "file too large"
msgstr "plik jest zbyt duży"
-#: src/libslic3r/Zipper.cpp:68
+#: src/libslic3r/miniz_extension.cpp:127
msgid "file write failed"
msgstr "niepowodzenie zapisywania do pliku"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:153
+#: src/slic3r/GUI/PrintHostDialogs.cpp:151
msgid "Filename"
msgstr "Nazwa pliku"
-#: src/libslic3r/PrintConfig.cpp:775
+#: src/slic3r/GUI/ConfigWizard.cpp:1181
+msgid "Files association"
+msgstr "Skojarzenia plików"
+
+#: src/libslic3r/PrintConfig.cpp:811
msgid "Fill angle"
msgstr "Kąt wypełnienia"
-#: src/libslic3r/PrintConfig.cpp:789
+#: src/slic3r/GUI/Plater.cpp:1651
+msgid "Fill bed"
+msgstr "Wypełnij stół"
+
+#: src/slic3r/GUI/Plater.cpp:3936
+msgid "Fill bed with instances"
+msgstr "Wypełnij stół instancjami"
+
+#: src/libslic3r/PrintConfig.cpp:825
msgid "Fill density"
msgstr "Gęstość wypełnienia"
-#: src/libslic3r/PrintConfig.cpp:826
+#: src/libslic3r/PrintConfig.cpp:862
msgid "Fill pattern"
msgstr "Wzór wypełnienia"
-#: src/libslic3r/PrintConfig.cpp:437
+#: src/libslic3r/PrintConfig.cpp:473
msgid "Fill pattern for bottom infill. This only affects the bottom external visible layer, and not its adjacent solid shells."
msgstr "Wzór wypełnienia dolnej warstwy. Ma wpływ jedynie na zewnętrzną widoczną warstwę, nie ma wpływu na przylegające do nich wewnętrzne, zwarte warstwy."
-#: src/libslic3r/PrintConfig.cpp:828
+#: src/libslic3r/PrintConfig.cpp:864
msgid "Fill pattern for general low-density infill."
msgstr "Wzór dla ogólnego wypełnienia o niskiej gęstości."
-#: src/libslic3r/PrintConfig.cpp:417
+#: src/libslic3r/PrintConfig.cpp:451
msgid "Fill pattern for top infill. This only affects the top visible layer, and not its adjacent solid shells."
msgstr "Wzór wypełnienia górnej warstwy. Ma wpływ jedynie na zewnętrzne widoczne warstwy, nie ma wpływu na przylegające do nich powłoki zwartego wypełnienia."
+#: src/slic3r/GUI/Plater.cpp:3936
+msgid "Fill the remaining area of bed with instances of the selected object"
+msgstr "Wypełnij pozostałą przestrzeń stołu instancjami wybranego modelu"
+
#: src/slic3r/GUI/BonjourDialog.cpp:225
msgid "Finished"
msgstr "Zakończono"
-#: src/slic3r/GUI/ConfigWizard.cpp:891 src/slic3r/GUI/Tab.cpp:1947
+#: src/slic3r/GUI/ConfigWizard.cpp:1257 src/slic3r/GUI/Tab.cpp:2132
msgid "Firmware"
msgstr "Firmware"
@@ -2934,44 +3409,56 @@ msgstr "Flasher firmware"
msgid "Firmware image:"
msgstr "Obraz firmware:"
-#: src/slic3r/GUI/Tab.cpp:2577
+#: src/slic3r/GUI/Tab.cpp:2733
msgid "Firmware Retraction"
msgstr "Retrakcja z firmware"
-#: src/slic3r/GUI/ConfigWizard.cpp:891
+#: src/slic3r/GUI/ConfigWizard.cpp:1257
msgid "Firmware Type"
msgstr "Typ firmware"
-#: src/libslic3r/PrintConfig.cpp:859 src/libslic3r/PrintConfig.cpp:868
-#: src/libslic3r/PrintConfig.cpp:876 src/libslic3r/PrintConfig.cpp:910
+#: src/libslic3r/PrintConfig.cpp:899 src/libslic3r/PrintConfig.cpp:908
+#: src/libslic3r/PrintConfig.cpp:918 src/libslic3r/PrintConfig.cpp:952
msgid "First layer"
msgstr "Pierwsza warstwa"
-#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:889
+#: src/libslic3r/PrintConfig.cpp:909
+msgid "First layer bed temperature"
+msgstr "Temperatura stołu dla pierwszej warstwy"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:60 src/libslic3r/PrintConfig.cpp:931
msgid "First layer height"
msgstr "Wysokość pierwszej warstwy"
-#: src/libslic3r/Print.cpp:1422
+#: src/libslic3r/Print.cpp:1448
msgid "First layer height can't be greater than nozzle diameter"
msgstr "Wysokość pierwszej warstwy nie może być większa od średnicy dyszy"
-#: src/libslic3r/PrintConfig.cpp:900
+#: src/libslic3r/PrintConfig.cpp:960
+msgid "First layer nozzle temperature"
+msgstr "Temperatura dyszy dla pierwszej warstwy"
+
+#: src/libslic3r/PrintConfig.cpp:942
msgid "First layer speed"
msgstr "Prędkość pierwszej warstwy"
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:218
msgid "First layer volumetric"
msgstr "Na pierwszej warstwie"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1647
+#: src/slic3r/GUI/Plater.cpp:3380
+msgid "Fix through NetFabb"
+msgstr "Naprawa przez NetFabb"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1776
msgid "Fix through the Netfabb"
msgstr "Napraw używając Netfabb"
-#: src/slic3r/GUI/Plater.cpp:3473
+#: src/slic3r/GUI/Plater.cpp:3278
msgid "Fix Throught NetFabb"
msgstr "Napraw przez NetFabb"
-#: src/slic3r/GUI/GUI_App.cpp:824
+#: src/slic3r/GUI/GUI_App.cpp:1522
msgid "Flash printer &firmware"
msgstr "Flash &firmware drukarki"
@@ -2999,50 +3486,52 @@ msgstr "Flashowanie w toku. Proszę nie odłączać drukarki!"
msgid "Flashing succeeded!"
msgstr "Flashowanie pomyślne!"
-#: src/slic3r/GUI/Tab.cpp:1218
+#: src/slic3r/GUI/Tab.cpp:1548
msgid "Flow"
msgstr "Przepływ"
-#: src/slic3r/GUI/PresetHints.cpp:220
+#: src/libslic3r/PrintConfig.cpp:1145
+msgid "Flow rate"
+msgstr "Przepływ"
+
+#: src/slic3r/GUI/PresetHints.cpp:219
msgid "flow rate is maximized"
msgstr "przepływ osiąga wartości szczytowe"
-#: src/slic3r/GUI/UpdateDialogs.cpp:286
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:555
+msgid "Following printer preset(s) is duplicated:%1%The above preset for printer \"%2%\" will be used just once."
+msgstr "Następujący zestaw ustawień drukarki jest zduplikowany: %1% \nPowyższy zestaw ustawień dla drukarki \"%2%\" zostanie użyty tylko raz."
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:287
msgid "For more information please visit our wiki page:"
-msgstr "Aby uzyskać więcej informacji odwiedź naszą wiki:"
+msgstr "Aby uzyskać więcej informacji, odwiedź naszą wiki:"
-#: src/slic3r/GUI/Plater.cpp:501 src/slic3r/GUI/Plater.cpp:624
+#: src/slic3r/GUI/Plater.cpp:367 src/slic3r/GUI/Plater.cpp:490
msgid "For support enforcers only"
msgstr "Tylko dla wymuszania podpór"
#. TRN Description for "WHITE BULLET"
-#: src/slic3r/GUI/Tab.cpp:3267
-msgid ""
-"for the left button: indicates a non-system (or non-default) preset,\n"
-"for the right button: indicates that the settings hasn't been modified."
-msgstr ""
-"dla lewego przycisku: wskazuje na niesystemowy (lub inny niż domyślny) zestaw ustawień,\n"
-"dla prawego przycisku: wskazuje, że ustawienia nie zostały zmodyfikowane."
+#: src/slic3r/GUI/Tab.cpp:3702
+msgid "for the left button: indicates a non-system (or non-default) preset,\nfor the right button: indicates that the settings hasn't been modified."
+msgstr "dla lewego przycisku: wskazuje na niesystemowy (lub inny niż domyślny) zestaw ustawień,\ndla prawego przycisku: wskazuje, że ustawienia nie zostały zmodyfikowane."
-#: src/slic3r/GUI/ConfigManipulation.cpp:136
-msgid ""
-"For the Wipe Tower to work with the soluble supports, the support layers\n"
-"need to be synchronized with the object layers."
+#: src/slic3r/GUI/ConfigManipulation.cpp:135
+msgid "For the Wipe Tower to work with the soluble supports, the support layers\nneed to be synchronized with the object layers."
msgstr "Do działania wieży czyszczącej z podporami rozpuszczalnymi konieczna jest synchronizacja wysokości warstw modelu i podpór."
-#: src/libslic3r/Print.cpp:1396
+#: src/libslic3r/Print.cpp:1422
msgid "For the Wipe Tower to work with the soluble supports, the support layers need to be synchronized with the object layers."
msgstr "Do działania wieży czyszczącej z podporami rozpuszczalnymi konieczna jest synchronizacja wysokości warstw modelu i podpór."
-#: src/libslic3r/PrintConfig.cpp:2864
+#: src/libslic3r/PrintConfig.cpp:3028
msgid "Force pad around object everywhere"
msgstr "Wymuś podkładkę wokół wszystkich modeli, wszędzie"
-#: src/libslic3r/PrintConfig.cpp:1729
+#: src/libslic3r/PrintConfig.cpp:1844
msgid "Force solid infill for regions having a smaller area than the specified threshold."
msgstr "Wymuś zwarte wypełnienie dla obszarów mniejszych niż zadany próg."
-#: src/libslic3r/PrintConfig.cpp:1072
+#: src/libslic3r/PrintConfig.cpp:1116
msgid "Force the generation of solid shells between adjacent materials/volumes. Useful for multi-extruder prints with translucent materials or manual soluble support material."
msgstr "Wymuś generowanie zwartych powłok pomiędzy przylegającymi do siebie materiałami. Przydatne przy druku materiałami przejrzystymi lub przy ręcznych podporach rozpuszczalnych."
@@ -3050,248 +3539,317 @@ msgstr "Wymuś generowanie zwartych powłok pomiędzy przylegającymi do siebie
msgid "From"
msgstr "Od"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2223
+#: src/slic3r/GUI/GCodeViewer.cpp:2197
+msgid "from"
+msgstr "z"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2389
msgid "From Object List You can't delete the last solid part from object."
msgstr "Nie możesz usunąć ostatniej bryły modelu z Listy Modeli."
-#: src/slic3r/GUI/MainFrame.cpp:667
+#: src/slic3r/GUI/MainFrame.cpp:964 src/slic3r/GUI/MainFrame.cpp:1284
msgid "Front"
msgstr "Przód"
-#: src/slic3r/GUI/MainFrame.cpp:667
+#: src/slic3r/GUI/MainFrame.cpp:964 src/slic3r/GUI/MainFrame.cpp:1284
msgid "Front View"
msgstr "Widok przodu"
-#: src/slic3r/GUI/Tab.cpp:1013
+#: src/libslic3r/PrintConfig.cpp:1000
+msgid "Full fan speed at layer"
+msgstr "Pełna prędkość wentylatora na warstwie "
+
+#: src/slic3r/GUI/Tab.cpp:1331
msgid "full profile name"
msgstr "pełna nazwa profilu"
-#: src/slic3r/GUI/MainFrame.cpp:826
+#: src/libslic3r/PrintConfig.cpp:817
+msgid "g"
+msgstr "g"
+
+#: src/slic3r/GUI/MainFrame.cpp:1527
msgid "G-code"
msgstr "G-code"
-#: src/slic3r/GUI/DoubleSlider.cpp:1021
-msgid ""
-"G-code associated to this tick mark is in a conflict with print mode.\n"
-"Editing it will cause changes of Slider data."
-msgstr ""
-"G-code powiÄ…zany z tym zaznaczeniem powoduje konflikt z obecnym trybem drukowania.\n"
-"Edytowanie go spowoduje zmianÄ™ danych suwaka."
+#: src/slic3r/GUI/DoubleSlider.cpp:1146
+msgid "G-code associated to this tick mark is in a conflict with print mode.\nEditing it will cause changes of Slider data."
+msgstr "G-code powiÄ…zany z tym zaznaczeniem powoduje konflikt z obecnym trybem drukowania.\nEdytowanie go spowoduje zmianÄ™ danych suwaka."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:130
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:165
msgid "G-code file exported to %1%"
msgstr "Plik G-code wyeksportowany do %1%"
-#: src/libslic3r/PrintConfig.cpp:936
+#: src/libslic3r/PrintConfig.cpp:980
msgid "G-code flavor"
msgstr "Rodzaj G-code"
-#: src/libslic3r/PrintConfig.cpp:721
+#: src/slic3r/GUI/MainFrame.cpp:66 src/slic3r/GUI/MainFrame.cpp:79
+msgid "G-code preview"
+msgstr "PodglÄ…d G-code"
+
+#: src/libslic3r/PrintConfig.cpp:66
+msgid "G-code thumbnails"
+msgstr "Miniaturki G-code"
+
+#: src/libslic3r/PrintConfig.cpp:3552
+msgid "G-code viewer"
+msgstr "PrzeglÄ…darka G-code"
+
+#: src/libslic3r/PrintConfig.cpp:757
msgid "g/cm³"
msgstr "g/cm³"
-#: src/libslic3r/PrintConfig.cpp:2505
+#: src/libslic3r/PrintConfig.cpp:2648
msgid "g/ml"
msgstr "g/ml"
-#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:317
-#: src/libslic3r/PrintConfig.cpp:918
+#: src/slic3r/GUI/GUI_Preview.cpp:309 src/libslic3r/ExtrusionEntity.cpp:322
+#: src/libslic3r/ExtrusionEntity.cpp:352 src/libslic3r/PrintConfig.cpp:962
msgid "Gap fill"
msgstr "Wypełnienie szpar"
-#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1796
-#: src/slic3r/GUI/Tab.cpp:2040
+#: src/slic3r/GUI/Preferences.cpp:24 src/slic3r/GUI/Tab.cpp:2058
+#: src/slic3r/GUI/Tab.cpp:2240 src/slic3r/GUI/Tab.cpp:2348
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1066
msgid "General"
msgstr "Ogólne"
-#: src/libslic3r/PrintConfig.cpp:1307
+#: src/libslic3r/PrintConfig.cpp:1415
msgid "Generate no less than the number of skirt loops required to consume the specified amount of filament on the bottom layer. For multi-extruder machines, this minimum applies to each extruder."
-msgstr "Generuj ilość pętli skirtu nie mniejszą niż określona aby zużyć taką ilość filamentu na dolnej warstwie. Dla drukarek z kilkoma ekstuderami ta wartość jest stosowana dla każdego z nich."
+msgstr "Generuj ilość pętli skirtu nie mniejszą niż określona, aby zużyć taką ilość filamentu na dolnej warstwie. Dla drukarek z kilkoma ekstruderami ta wartość jest stosowana dla każdego z nich."
-#: src/libslic3r/PrintConfig.cpp:1865
+#: src/libslic3r/PrintConfig.cpp:2007
msgid "Generate support material"
msgstr "Generuj materiał podporowy"
-#: src/libslic3r/PrintConfig.cpp:1926
+#: src/libslic3r/PrintConfig.cpp:2068
msgid "Generate support material for the specified number of layers counting from bottom, regardless of whether normal support material is enabled or not and regardless of any angle threshold. This is useful for getting more adhesion of objects having a very thin or poor footprint on the build plate."
-msgstr "Generuj materiał podporowy dla określonej liczby warstw licząc od dołu, niezależnie od tego czy normalny materiał podporowy jest włączony i niezależnie od progu kąta. Przydaje się aby uzyskać lepszą przyczepność modelu, które mają bardzo małą powierzchnię kontaktu z powierzchnią druku."
+msgstr "Generuj materiał podporowy dla określonej liczby warstw licząc od dołu, niezależnie od tego czy normalny materiał podporowy jest włączony i niezależnie od progu kąta. Przydaje się, aby uzyskać lepszą przyczepność modelu, które mają bardzo małą powierzchnię kontaktu z powierzchnią druku."
-#: src/libslic3r/PrintConfig.cpp:2613
+#: src/libslic3r/PrintConfig.cpp:2756
msgid "Generate supports"
msgstr "Generowanie podpór"
-#: src/libslic3r/PrintConfig.cpp:2615
+#: src/libslic3r/PrintConfig.cpp:2758
msgid "Generate supports for the models"
msgstr "Generowanie podpór dla modeli"
-#: src/libslic3r/Print.cpp:1614
+#: src/slic3r/GUI/Plater.cpp:3554
+msgid "generated warnings"
+msgstr "wygenerowane ostrzeżenia"
+
+#: src/libslic3r/Print.cpp:1645
msgid "Generating brim"
msgstr "Generowanie obramowania (brim)"
-#: src/libslic3r/Print.cpp:1642
+#: src/libslic3r/Print.cpp:1680
msgid "Generating G-code"
msgstr "Generowanie G-code"
-#: src/libslic3r/SLAPrintSteps.cpp:48
+#: src/slic3r/GUI/GCodeViewer.cpp:1392
+msgid "Generating index buffers"
+msgstr "Generowanie buforów indeksujących"
+
+#: src/libslic3r/SLAPrintSteps.cpp:49
msgid "Generating pad"
msgstr "Generowanie podkładki"
-#: src/libslic3r/PrintObject.cpp:152
+#: src/libslic3r/PrintObject.cpp:158
msgid "Generating perimeters"
msgstr "Generowanie obrysów"
-#: src/libslic3r/Print.cpp:1606
+#: src/libslic3r/Print.cpp:1636
msgid "Generating skirt"
msgstr "Generowanie skirtu"
-#: src/libslic3r/PrintObject.cpp:395
+#: src/libslic3r/PrintObject.cpp:422
msgid "Generating support material"
msgstr "Generowanie materiału podporowego"
-#: src/libslic3r/SLAPrintSteps.cpp:46 src/libslic3r/SLAPrintSteps.cpp:356
+#: src/libslic3r/SLAPrintSteps.cpp:47 src/libslic3r/SLAPrintSteps.cpp:359
msgid "Generating support points"
msgstr "Generowanie punktów podpór"
-#: src/libslic3r/SLAPrintSteps.cpp:47
+#: src/libslic3r/SLAPrintSteps.cpp:48
msgid "Generating support tree"
msgstr "Generowanie drzewa podpór"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2022
+#: src/slic3r/GUI/GCodeViewer.cpp:933
+msgid "Generating toolpaths"
+msgstr "Generowanie ścieżek narzędzi"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:1318
+msgid "Generating vertex buffer"
+msgstr "Generowanie bufora wierzchołków"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2181
msgid "Generic"
msgstr "Źródłowy"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
+#: src/slic3r/Utils/PresetUpdater.cpp:600
+msgid "getting config updates"
+msgstr "pobieranie aktualizacji konfiguracji"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
msgid "Gizmo cut"
msgstr "Cięcie przy pomocy \"uchwytów\""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:172
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
msgid "Gizmo move"
msgstr "Przemieszczanie przy pomocy \"uchwytów\""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:176
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:198
+msgid "Gizmo move: Press to snap by 1mm"
+msgstr "Przesuwanie uchwytem: naciśnij, aby przyciągać co 1 mm"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
msgid "Gizmo Place face on bed"
msgstr "Położenie na płaszczyźnie przy pomocy \"uchwytów\""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:174
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
msgid "Gizmo rotate"
msgstr "Obracanie przy pomocy \"uchwytów\""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:173
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:203
+msgid "Gizmo rotate: Press to rotate selected objects around their own center"
+msgstr "Obracanie uchwytem: naciśnij, aby obrócić wybrane obiekty wokół ich środków"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
msgid "Gizmo scale"
msgstr "Skalowanie przy pomocy \"uchwytów\""
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:177
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:201
+msgid "Gizmo scale: Press to activate one direction scaling"
+msgstr "Skalowanie uchwytem: naciśnij, aby aktywować skalowanie w jednym kierunku"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:202
+msgid "Gizmo scale: Press to scale selected objects around their own center"
+msgstr "Skalowanie uchwytem: naciśnij, aby skalować wybrane obiekty względem ich środków"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:199
+msgid "Gizmo scale: Press to snap by 5%"
+msgstr "Skalowanie uchwytem: naciśnij, aby przyciągać co 5%"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:200
+msgid "Gizmo scale: Scale selection to fit print volume"
+msgstr "Skalowanie uchwytem: skaluj wybrane do rozmiarów obszaru roboczego"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
msgid "Gizmo SLA hollow"
msgstr "Drążenie SLA z uchwytem"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:178
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:172
msgid "Gizmo SLA support points"
msgstr "Punkty podpór SLA przy pomocy \"uchwytów\""
-#: src/slic3r/GUI/GLCanvas3D.cpp:2921
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:562
+#: src/slic3r/GUI/GLCanvas3D.cpp:3165
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:520
msgid "Gizmo-Move"
msgstr "Uchwyt-Przesuń"
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:489
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:639
msgid "Gizmo-Place on Face"
msgstr "Uchwyt-Połóż na Płaszczyźnie"
-#: src/slic3r/GUI/GLCanvas3D.cpp:3001
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:564
+#: src/slic3r/GUI/GLCanvas3D.cpp:3249
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:522
msgid "Gizmo-Rotate"
msgstr "Uchwyt-Obróć"
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:563
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:521
msgid "Gizmo-Scale"
msgstr "Uchwyt-Skaluj"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:201
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:199
msgid "Gizmos"
msgstr "Uchwyty"
-#: src/slic3r/GUI/AboutDialog.cpp:259
+#: src/slic3r/GUI/AboutDialog.cpp:284 src/slic3r/GUI/GUI_App.cpp:244
msgid "GNU Affero General Public License, version 3"
msgstr "Ogólna Licencja Publiczna (GPL) GNU Affero, wersja 3"
-#: src/slic3r/GUI/ConfigWizard.cpp:980
+#: src/slic3r/GUI/ConfigWizard.cpp:1346
msgid "Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average."
-msgstr "Wymagana jest spora precyzja, użyj więc suwmiarki i przeprowadź kilka pomiarów w sporych odstępach od siebie i oblicz średnią."
+msgstr "Wymagana jest spora precyzja, użyj więc suwmiarki, przeprowadź kilka pomiarów w sporych odstępach od siebie i oblicz średnią."
-#: src/libslic3r/PrintConfig.cpp:844
+#: src/libslic3r/PrintConfig.cpp:882
msgid "Grid"
msgstr "Kratka"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2454
+#: src/slic3r/GUI/PrintHostDialogs.cpp:57
+msgid "Group"
+msgstr "Grupa"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2846
msgid "Group manipulation"
msgstr "Manipulacja grupÄ…"
-#: src/slic3r/GUI/Preferences.cpp:133
+#: src/slic3r/GUI/Preferences.cpp:200
msgid "GUI"
msgstr "GUI"
-#: src/libslic3r/PrintConfig.cpp:852
+#: src/libslic3r/PrintConfig.cpp:890
msgid "Gyroid"
msgstr "Gyroidalny"
-#: src/slic3r/GUI/Tab.cpp:2937
-msgid "has the following unsaved changes:"
-msgstr "ma następujące niezapisane zmiany:"
-
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47
msgid "Head diameter"
msgstr "Åšrednica Å‚Ä…cznika"
-#: src/slic3r/GUI/ConfigManipulation.cpp:317
+#: src/libslic3r/PrintConfig.cpp:2772
+msgid "Head penetration"
+msgstr "Przenikanie łączników"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:322
msgid "Head penetration should not be greater than the head width."
msgstr "Przenikanie łączników nie powinno być większe niż ich średnica."
-#: src/libslic3r/PrintConfig.cpp:869
+#: src/libslic3r/PrintConfig.cpp:910
msgid "Heated build plate temperature for the first layer. Set this to zero to disable bed temperature control commands in the output."
-msgstr "Temperatura podgrzewanego stołu dla pierwszej warstwy. Ustaw zero aby wyłączyć komendy kontrolujące temperaturę stołu w pliku wyjściowym."
+msgstr "Temperatura podgrzewanego stołu dla pierwszej warstwy. Ustaw zero, aby wyłączyć komendy kontrolujące temperaturę stołu w pliku wyjściowym."
-#: src/slic3r/GUI/GUI_Preview.cpp:222 src/libslic3r/PrintConfig.cpp:500
+#: src/slic3r/GUI/GUI_Preview.cpp:276 src/libslic3r/PrintConfig.cpp:536
msgid "Height"
msgstr "Wysokość"
-#: src/libslic3r/GCode/PreviewData.cpp:347
+#: src/slic3r/GUI/GCodeViewer.cpp:2236 src/libslic3r/GCode/PreviewData.cpp:352
msgid "Height (mm)"
msgstr "Wysokość (mm)"
-#: src/libslic3r/PrintConfig.cpp:1688
+#: src/libslic3r/PrintConfig.cpp:1796
msgid "Height of skirt expressed in layers. Set this to a tall value to use skirt as a shield against drafts."
msgstr "Wysokość skirtu wyrażona w warstwach. Ustawienie wysokiej wartości spowoduje stworzenie osłony chroniącej przed przeciągami."
-#: src/libslic3r/PrintConfig.cpp:2360
+#: src/libslic3r/PrintConfig.cpp:2503
msgid "Height of the display"
msgstr "Wysokość wyświetlacza"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1500
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1631
msgid "Height range Modifier"
msgstr "Modyfikator zakresu wysokości"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2507
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2899
msgid "Height ranges"
msgstr "Zakres wysokości"
-#: src/libslic3r/PrintConfig.cpp:261
+#: src/libslic3r/PrintConfig.cpp:295
msgid "Heights at which a filament change is to occur."
msgstr "Wysokość w osi Z, na której ma nastąpić zmiana filamentu."
-#: src/slic3r/GUI/ConfigWizard.cpp:433
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:451
+#, possible-c-format
msgid "Hello, welcome to %s! This %s helps you with the initial configuration; just a few settings and you will be ready to print."
msgstr "Witaj w %s! Ten %s pomoże Ci z konfiguracją początkową - wszystko będzie gotowe do drukowania po zaledwie kilku kliknięciach."
-#: src/libslic3r/PrintConfig.cpp:3365
+#: src/libslic3r/PrintConfig.cpp:3564
msgid "Help"
msgstr "Pomoc"
-#: src/libslic3r/PrintConfig.cpp:3371
+#: src/libslic3r/PrintConfig.cpp:3570
msgid "Help (FFF options)"
msgstr "Pomoc (opcje FFF)"
-#: src/libslic3r/PrintConfig.cpp:3376
+#: src/libslic3r/PrintConfig.cpp:3575
msgid "Help (SLA options)"
msgstr "Pomoc (opcje SLA)"
@@ -3299,96 +3857,100 @@ msgstr "Pomoc (opcje SLA)"
msgid "Here you can adjust required purging volume (mm³) for any given pair of tools."
msgstr "To ustawienie odpowiada za objętość czyszczonego filamentu w (mm³) dla danej pary ekstruderów."
-#: src/libslic3r/PrintConfig.cpp:973
+#: src/slic3r/GUI/DoubleSlider.cpp:1849
+msgid "Hide ruler"
+msgstr "Ukryj linijkÄ™"
+
+#: src/libslic3r/PrintConfig.cpp:1017
msgid "High extruder current on filament swap"
msgstr "Zwiększenie prądu ekstrudera przy zmianie filamentu"
-#: src/slic3r/GUI/GLCanvas3D.cpp:277
+#: src/slic3r/GUI/GLCanvas3D.cpp:263
msgid "Higher print quality versus higher print speed."
msgstr "Wyższa jakość druku vs wyższa prędkość."
-#: src/libslic3r/PrintConfig.cpp:427 src/libslic3r/PrintConfig.cpp:853
+#: src/libslic3r/PrintConfig.cpp:463 src/libslic3r/PrintConfig.cpp:891
msgid "Hilbert Curve"
msgstr "Krzywa Hilberta"
-#: src/slic3r/GUI/Plater.cpp:1042
+#: src/slic3r/GUI/Plater.cpp:916
msgid "Hold Shift to Slice & Export G-code"
-msgstr "Przytrzymaj Shift aby Pociąć i Wyeksportować G-code"
+msgstr "Przytrzymaj Shift, aby pociąć i wyeksportować G-code"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46
msgid "Hole depth"
msgstr "Głębokość otworu"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45
msgid "Hole diameter"
msgstr "Åšrednica otworu"
-#: src/slic3r/GUI/Plater.cpp:2760
-msgid "Hollow"
-msgstr "Drążenie"
-
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:977
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:785
msgid "Hollow and drill"
msgstr "Drążenie i wiercenie"
-#: src/libslic3r/PrintConfig.cpp:2910
+#: src/libslic3r/PrintConfig.cpp:3074
msgid "Hollow out a model to have an empty interior"
msgstr "Wydrąż model, aby uzyskać puste wnętrze"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40
msgid "Hollow this object"
msgstr "Wydrąż ten model"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:108 src/slic3r/GUI/Tab.cpp:3654
-#: src/slic3r/GUI/Tab.cpp:3655 src/libslic3r/SLA/Hollowing.cpp:46
-#: src/libslic3r/SLA/Hollowing.cpp:58 src/libslic3r/SLA/Hollowing.cpp:67
-#: src/libslic3r/SLA/Hollowing.cpp:76 src/libslic3r/PrintConfig.cpp:2909
-#: src/libslic3r/PrintConfig.cpp:2916 src/libslic3r/PrintConfig.cpp:2926
-#: src/libslic3r/PrintConfig.cpp:2935
+#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:4073
+#: src/slic3r/GUI/Tab.cpp:4074 src/libslic3r/SLA/Hollowing.cpp:45
+#: src/libslic3r/SLA/Hollowing.cpp:57 src/libslic3r/SLA/Hollowing.cpp:66
+#: src/libslic3r/SLA/Hollowing.cpp:75 src/libslic3r/PrintConfig.cpp:3073
+#: src/libslic3r/PrintConfig.cpp:3080 src/libslic3r/PrintConfig.cpp:3090
+#: src/libslic3r/PrintConfig.cpp:3099
msgid "Hollowing"
msgstr "Drążenie"
-#: src/slic3r/GUI/Plater.cpp:2926
-msgid "Hollowing cancelled."
-msgstr "Drążenie anulowane."
-
-#: src/slic3r/GUI/Plater.cpp:2927
-msgid "Hollowing done."
-msgstr "Drążenie zakończone."
-
-#: src/slic3r/GUI/Plater.cpp:2929
-msgid "Hollowing failed."
-msgstr "Drążenie nie powiodło się."
-
-#: src/libslic3r/PrintConfig.cpp:2937
+#: src/libslic3r/PrintConfig.cpp:3101
msgid "Hollowing is done in two steps: first, an imaginary interior is calculated deeper (offset plus the closing distance) in the object and then it's inflated back to the specified offset. A greater closing distance makes the interior more rounded. At zero, the interior will resemble the exterior the most."
msgstr "Drążenie wnętrza odbywa się w dwóch etapach: w pierwszym obliczana jest wewnątrz pusta przestrzeń o rozmiarach równych sumie grubości powłoki i dystansu domykania, a w kolejnym jest \"nadmuchiwane\" z powrotem do zadanej grubości. Większy dystans zamykania tworzy większe promienie we wnętrzu. Wartość \"0\" odda wnętrze najbardziej zbliżone do zewnętrznej powłoki."
-#: src/libslic3r/SLAPrintSteps.cpp:43
+#: src/libslic3r/SLAPrintSteps.cpp:44
msgid "Hollowing model"
msgstr "Drążenie modelu"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:813
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:624
msgid "Hollowing parameter change"
msgstr "Zmiana parametrów drążenia"
-#: src/libslic3r/PrintConfig.cpp:850 src/libslic3r/PrintConfig.cpp:2011
+#: src/libslic3r/PrintConfig.cpp:888 src/libslic3r/PrintConfig.cpp:2153
msgid "Honeycomb"
msgstr "Plaster miodu"
-#: src/slic3r/GUI/Tab.cpp:1064
+#: src/slic3r/GUI/Tab.cpp:1386
msgid "Horizontal shells"
msgstr "Powłoka pozioma"
-#: src/libslic3r/PrintConfig.cpp:245
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:253
+msgid "Horizontal Slider"
+msgstr "Suwak poziomy"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:209
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:213
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:238
+msgid "Horizontal slider - Move active thumb Left"
+msgstr "Suwak poziomy - przesuń aktywny punkt w lewo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:210
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:214
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:239
+msgid "Horizontal slider - Move active thumb Right"
+msgstr "Suwak poziomy - przesuń aktywny punkt w prawo"
+
+#: src/libslic3r/PrintConfig.cpp:279
msgid "Horizontal width of the brim that will be printed around each object on the first layer."
msgstr "Szerokość brim (obramowania), drukowanego wokół każdego z modeli na pierwszej warstwie."
-#: src/slic3r/GUI/PrintHostDialogs.cpp:152
+#: src/slic3r/GUI/PrintHostDialogs.cpp:150
msgid "Host"
msgstr "Host"
-#: src/libslic3r/PrintConfig.cpp:1332
+#: src/libslic3r/PrintConfig.cpp:1440
msgid "Host Type"
msgstr "Rodzaj serwera"
@@ -3396,197 +3958,275 @@ msgstr "Rodzaj serwera"
msgid "Hostname"
msgstr "Nazwa hosta"
-#: src/libslic3r/PrintConfig.cpp:97
+#: src/libslic3r/PrintConfig.cpp:99
msgid "Hostname, IP or URL"
msgstr "Nazwa hosta, IP lub URL"
-#: src/slic3r/GUI/Tab.cpp:139
-msgid ""
-"Hover the cursor over buttons to find more information \n"
-"or click this button."
-msgstr ""
-"Umieść kursor nad przyciskiem aby uzyskać więcej informacji\n"
-"lub kliknij ten przycisk."
+#: src/slic3r/GUI/Tab.cpp:210
+msgid "Hover the cursor over buttons to find more information \nor click this button."
+msgstr "Umieść kursor nad przyciskiem, aby uzyskać więcej informacji\nlub kliknij ten przycisk."
-#: src/libslic3r/PrintConfig.cpp:2812
+#: src/libslic3r/PrintConfig.cpp:2976
msgid "How far should the pad extend around the contained geometry"
msgstr "Jak daleko poza kształt powinna sięgać podkładka"
-#: src/libslic3r/PrintConfig.cpp:2901
+#: src/libslic3r/PrintConfig.cpp:3065
msgid "How much should the tiny connectors penetrate into the model body."
msgstr "Głębokość, na którą malutkie łączniki podpór powinny wnikać w powłokę modelu."
-#: src/libslic3r/PrintConfig.cpp:2631
+#: src/libslic3r/PrintConfig.cpp:2774
msgid "How much the pinhead has to penetrate the model surface"
msgstr "Głębokość, na którą łącznik podpory powinien wnikać w powłokę modelu"
-#: src/libslic3r/PrintConfig.cpp:2755
+#: src/libslic3r/PrintConfig.cpp:2919
msgid "How much the supports should lift up the supported object. If \"Pad around object\" is enabled, this value is ignored."
msgstr "Odległość, na którą model zostanie podniesiony na podporach. Jeśli opcja \"Podkładka wokół modelu\" jest włączona, to ten parametr zostanie zignorowany."
-#: src/libslic3r/PrintConfig.cpp:111
+#: src/libslic3r/PrintConfig.cpp:1209
+msgid "How to apply limits"
+msgstr "Jak stosować limity"
+
+#: src/libslic3r/PrintConfig.cpp:1203
+msgid "How to apply the Machine Limits"
+msgstr "Jak stosować limity maszynowe"
+
+#: src/libslic3r/PrintConfig.cpp:163
+msgid "HTTP digest"
+msgstr "HTTP digest"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:358
+#: src/libslic3r/PrintConfig.cpp:113
msgid "HTTPS CA File"
msgstr "Plik certyfikatu HTTPS CA"
-#: src/slic3r/GUI/Tab.cpp:1713
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:319
msgid "HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate."
msgstr "Plik HTTPS CA jest opcjonalny. Jest potrzebny jedynie w sytuacji, gdy używasz HTTPS z certyfikatem samopodpisanym."
-#: src/slic3r/GUI/Preferences.cpp:222
+#: src/slic3r/GUI/Preferences.cpp:376
msgid "Icon size in a respect to the default size"
msgstr "Rozmiar ikon w odniesieniu do domyślnego"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:149
+#: src/slic3r/GUI/PrintHostDialogs.cpp:147
msgid "ID"
msgstr "ID"
-#: src/libslic3r/PrintConfig.cpp:1873
+#: src/libslic3r/PrintConfig.cpp:2015
msgid "If checked, supports will be generated automatically based on the overhang threshold value. If unchecked, supports will be generated inside the \"Support Enforcer\" volumes only."
msgstr "Jeśli ta opcja będzie zaznaczona, to podpory zostaną wygenerowane automatycznie, na podstawie ustawionego progu zwisu. Jeśli ją odznaczysz, to podpory będą generowane jedynie w środku modyfikatora wymuszającego podpory."
-#: src/slic3r/GUI/ConfigWizard.cpp:773
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:1132
+#, possible-c-format
msgid "If enabled, %s checks for new application versions online. When a new version becomes available, a notification is displayed at the next application startup (never during program usage). This is only a notification mechanisms, no automatic installation is done."
msgstr "To ustawienie spowoduje wyszukiwanie nowych wersji aplikacji %s online. Po pojawieniu się nowej wersji, przy kolejnym uruchomieniu zostanie wyświetlone powiadomienie (nie pojawi się, gdy aplikacja będzie uruchomiona). Jest to tylko mechanizm powiadamiania - nie instaluje aktualizacji automatycznie."
-#: src/slic3r/GUI/ConfigWizard.cpp:783
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:1142
+#, possible-c-format
msgid "If enabled, %s downloads updates of built-in system presets in the background.These updates are downloaded into a separate temporary location.When a new preset version becomes available it is offered at application startup."
msgstr "Jeśli aktywna, to %s będzie pobierać aktualizacje wbudowanych zestawów ustawień w tle. Będą one pobierane do folderu tymczasowego. Opcja aktualizacji ustawień będzie oferowana przy starcie aplikacji."
-#: src/libslic3r/PrintConfig.cpp:1852
+#: src/libslic3r/PrintConfig.cpp:1994
msgid "If enabled, all printing extruders will be primed at the front edge of the print bed at the start of the print."
msgstr "Jeśli ta opcja będzie aktywna, to wszystkie ekstrudery będą czyszczone na przedniej krawędzi stołu na początku wydruku."
-#: src/slic3r/GUI/ConfigWizard.cpp:805
-msgid ""
-"If enabled, allows the Reload from disk command to automatically find and load the files when invoked.\n"
-"If not enabled, the Reload from disk command will ask to select each file using an open file dialog."
-msgstr ""
-"Jeśli włączone, pozwala poleceniu \"Wczytaj ponownie z dysku\" automatycznie odnaleźć i wczytać pliki.\n"
-"Jeśli wyłączone, to polecenie będzie otwierać okno dialogowe, w którym wskażesz plik źródłowy."
+#: src/slic3r/GUI/ConfigWizard.cpp:1164
+msgid "If enabled, allows the Reload from disk command to automatically find and load the files when invoked.\nIf not enabled, the Reload from disk command will ask to select each file using an open file dialog."
+msgstr "Jeśli włączone, pozwala poleceniu \"Wczytaj ponownie z dysku\" automatycznie odnaleźć i wczytać pliki.\nJeśli wyłączone, to polecenie będzie otwierać okno dialogowe, w którym wskażesz plik źródłowy."
-#: src/slic3r/GUI/Preferences.cpp:74
+#: src/slic3r/GUI/Preferences.cpp:91
msgid "If enabled, allows the Reload from disk command to automatically find and load the files when invoked."
msgstr "Jeśli włączone, pozwala poleceniu Wczytaj ponownie z dysku automatycznie odnaleźć i wczytać pliki."
-#: src/slic3r/GUI/Preferences.cpp:66
+#: src/slic3r/GUI/Preferences.cpp:238
+msgid "If enabled, changes made using the sequential slider, in preview, apply only to gcode top layer. If disabled, changes made using the sequential slider, in preview, apply to the whole gcode."
+msgstr "Jeśli włączone, zmiany stosowane suwakiem sekwencyjnym w podglądzie zostaną zastosowane do górnej warstwy G-code.\nJeśli wyłączone, zmiany stosowane suwakiem sekwencyjnym w podglądzie zostaną zastosowane do całego G-code."
+
+#: src/slic3r/GUI/Preferences.cpp:83
msgid "If enabled, PrusaSlicer will check for the new versions of itself online. When a new version becomes available a notification is displayed at the next application startup (never during program usage). This is only a notification mechanisms, no automatic installation is done."
msgstr "Włączenie automatycznego sprawdzania dostępności nowych wersji PrusaSlicer online. Pojawienie się nowej wersji spowoduje wyświetlenie powiadomienia przy starcie aplikacji (nigdy podczas jej pracy). Ta funkcja służy tylko powiadamianiu, nie instaluje aktualizacji automatycznie."
-#: src/slic3r/GUI/Preferences.cpp:82
+#: src/slic3r/GUI/Preferences.cpp:270
+msgid "If enabled, renders object using the environment map."
+msgstr "Jeśli włączone, obiekty będą renderowane przy pomocy mapy środowiskowej."
+
+#: src/slic3r/GUI/Preferences.cpp:200
+msgid "If enabled, reverses the direction of zoom with mouse wheel"
+msgstr "Jeśli włączone, kierunek kółka myszy zostanie odwrócony"
+
+#: src/slic3r/GUI/Preferences.cpp:93
+msgid "If enabled, sets PrusaSlicer as default application to open .3mf files."
+msgstr "Jeśli włączone, ustawia PrusaSlicer jako domyślną aplikację do otwierania plików .3mf."
+
+#: src/slic3r/GUI/Preferences.cpp:100
+msgid "If enabled, sets PrusaSlicer as default application to open .stl files."
+msgstr "Jeśli włączone, ustawia PrusaSlicer jako domyślną aplikację do otwierania plików .stl."
+
+#: src/slic3r/GUI/Preferences.cpp:179
+msgid "If enabled, sets PrusaSlicer G-code Viewer as default application to open .gcode files."
+msgstr "Jeśli włączone, ustawia podgląd G-code w PrusaSlicer jako domyślną aplikację do otwierania plików .gcode"
+
+#: src/slic3r/GUI/Preferences.cpp:99
msgid "If enabled, Slic3r downloads updates of built-in system presets in the background. These updates are downloaded into a separate temporary location. When a new preset version becomes available it is offered at application startup."
msgstr "Włączenie powoduje pobieranie wbudowanych systemowych zestawów ustawień w tle. Te ustawienia są pobierane do oddzielnej lokalizacji tymczasowej. Jeśli pojawi się nowa wersja to opcja jej instalacji pojawi się przy starcie aplikacji."
-#: src/slic3r/GUI/Preferences.cpp:106
+#: src/slic3r/GUI/Preferences.cpp:137
msgid "If enabled, the 3D scene will be rendered in Retina resolution. If you are experiencing 3D performance problems, disabling this option may help."
msgstr "Po włączeniu podgląd 3D będzie renderowany w rozdzielczości Retina. Wyłącz tę opcję w przypadku wystąpienia problemów z wydajnością 3D."
-#: src/libslic3r/PrintConfig.cpp:1696
+#: src/slic3r/GUI/Preferences.cpp:215
+msgid "If enabled, the button for the collapse sidebar will be appeared in top right corner of the 3D Scene"
+msgstr "Jeśli włączone, na górze podglądu 3D będzie wyświetlany przycisk zwijania bocznego panelu"
+
+#: src/libslic3r/PrintConfig.cpp:3698
+msgid "If enabled, the command line arguments are sent to an existing instance of GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides the \"single_instance\" configuration value from application preferences."
+msgstr "Jeśli włączone, argumenty linii komend zostaną wysłane do istniejącego GUI PrusaSlicer lub aktywnego okna PrusaSlicer. Nadpisuje parametr konfiguracji \"single_instance\" z preferencji aplikacji."
+
+#: src/slic3r/GUI/Preferences.cpp:294
+msgid "If enabled, the descriptions of configuration parameters in settings tabs wouldn't work as hyperlinks. If disabled, the descriptions of configuration parameters in settings tabs will work as hyperlinks."
+msgstr "Po włączeniu, opisy parametrów w zakładkach ustawień nie będą działać jak hiperłącza. Po wyłączeniu, kliknięcie na opis parametru w zakładkach ustawień otworzy go jak hiperłącze."
+
+#: src/slic3r/GUI/Preferences.cpp:209
+msgid "If enabled, the legacy 3DConnexion devices settings dialog is available by pressing CTRL+M"
+msgstr "Jeśli włączone, okno dialogowe starszych urządzeń 3DConnextion będzie dostępny po wciśnięciu CTRL+M."
+
+#: src/libslic3r/PrintConfig.cpp:1804
msgid "If enabled, the skirt will be as tall as a highest printed object. This is useful to protect an ABS or ASA print from warping and detaching from print bed due to wind draft."
msgstr "Po włączeniu, wysokość skirt będzie taka sama, jak najwyższego modelu. Przydaje się podczas druku z ABS lub ASA - chroni wydruk przed podwijaniem się i odklejaniem od stołu przez przeciąg."
-#: src/libslic3r/PrintConfig.cpp:1858
+#: src/libslic3r/PrintConfig.cpp:2000
msgid "If enabled, the wipe tower will not be printed on layers with no toolchanges. On layers with a toolchange, extruder will travel downward to print the wipe tower. User is responsible for ensuring there is no collision with the print."
msgstr "Po włączeniu wieża czyszcząca nie będzie drukowana na warstwach, na których nie ma zmian koloru. Na kolejnych warstwach ze zmianami koloru ekstruder zjedzie w dół, aby kontynuować czyszczenie na wieży. Użytkownik musi upewnić się, że nie nastąpi kolizja głowicy z wydrukiem."
-#: src/slic3r/GUI/Preferences.cpp:128
+#: src/slic3r/GUI/Preferences.cpp:193
msgid "If enabled, use free camera. If not enabled, use constrained camera."
msgstr "Jeśli włączone, to używany będę wolny widok. Jeśli wyłączone, to widok będzie ograniczony."
-#: src/slic3r/GUI/Preferences.cpp:121
+#: src/slic3r/GUI/Preferences.cpp:186
msgid "If enabled, use perspective camera. If not enabled, use orthographic camera."
msgstr "Po włączeniu będzie wyświetlony widok perspektywiczny. Po wyłączeniu, ortograficzny."
-#: src/slic3r/GUI/Preferences.cpp:145
+#: src/slic3r/GUI/Preferences.cpp:222
msgid "If enabled, you can change size of toolbar icons manually."
msgstr "Włączenie umożliwi ręczną zmianę rozmiaru ikon pasków narzędzi."
-#: src/slic3r/GUI/PresetHints.cpp:29
+#: src/slic3r/GUI/PresetHints.cpp:28
msgid "If estimated layer time is below ~%1%s, fan will run at %2%%% and print speed will be reduced so that no less than %3%s are spent on that layer (however, speed will never be reduced below %4%mm/s)."
msgstr "Jeśli szacowany czas druku warstwy jest niższy niż ~%1%s, wentylator będzie pracował na %2%%% a prędkość druku zostanie obniżona tak, aby warstwa była drukowana przez nie mniej niż %3%s (jednakże prędkość nie zejdzie poniżej %4%mm/s)."
-#: src/slic3r/GUI/PresetHints.cpp:36
+#: src/slic3r/GUI/PresetHints.cpp:35
msgid "If estimated layer time is greater, but still below ~%1%s, fan will run at a proportionally decreasing speed between %2%%% and %3%%%."
msgstr "Jeśli szacowany czas jest wyższy, ale poniżej ~%1%s, wentylator będzie pracował z proporcjonalnie zmniejszaną prędkością poniędzy %2%%% a %3%%%."
-#: src/libslic3r/PrintConfig.cpp:901
+#: src/libslic3r/PrintConfig.cpp:943
msgid "If expressed as absolute value in mm/s, this speed will be applied to all the print moves of the first layer, regardless of their type. If expressed as a percentage (for example: 40%) it will scale the default speeds."
msgstr "Jeśli ustawisz wartość bezwzględną wyrażoną w mm/s, taka prędkość będzie zastosowana dla wszystkich ruchów drukujących dla pierwszej warstwy, nie zależnie od ich rodzajów. Jeśli ustawisz wartość procentową (np. 40%), będzie ona skalowana wg domyślnej prędkości."
-#: src/libslic3r/PrintConfig.cpp:573
+#: src/libslic3r/PrintConfig.cpp:609
msgid "If layer print time is estimated below this number of seconds, fan will be enabled and its speed will be calculated by interpolating the minimum and maximum speeds."
msgstr "Jeśli szacowany czas druku warstwy będzie niższy niż ta wartość to wentylator będzie włączony a jego prędkość będzie interpolowana na podstawie górnego i dolnego limitu prędkości."
-#: src/libslic3r/PrintConfig.cpp:1706
+#: src/libslic3r/PrintConfig.cpp:1821
msgid "If layer print time is estimated below this number of seconds, print moves speed will be scaled down to extend duration to this value."
-msgstr "Jeśli szacowany czas druku warstwy będzie niższy niż ta wartość to prędkość ruchów drukujących będzie zmniejszona aby wydłużyć czas druku."
+msgstr "Jeśli szacowany czas druku warstwy będzie niższy niż ta wartość to prędkość ruchów drukujących będzie zmniejszona, aby wydłużyć czas druku."
-#: src/libslic3r/PrintConfig.cpp:567
+#: src/libslic3r/PrintConfig.cpp:603
msgid "If this is enabled, fan will never be disabled and will be kept running at least at its minimum speed. Useful for PLA, harmful for ABS."
msgstr "Ta opcja spowoduje, że wentylator nie wyłączy się podczas druku, tzn. zawsze będzie pracował z przynajmniej minimalną prędkością. Przydatne dla PLA, może szkodzić przy ABS."
-#: src/slic3r/GUI/Preferences.cpp:49
+#: src/slic3r/GUI/Preferences.cpp:66
msgid "If this is enabled, Slic3r will auto-center objects around the print bed center."
-msgstr "Spowoduje, że Slic3r będzie automatycznie umieszczał modele wokół centrum stołu."
+msgstr "Spowoduje, że PrusaSlicer będzie automatycznie umieszczał modele wokół centrum stołu."
-#: src/slic3r/GUI/Preferences.cpp:57
+#: src/slic3r/GUI/Preferences.cpp:74
msgid "If this is enabled, Slic3r will pre-process objects as soon as they're loaded in order to save time when exporting G-code."
-msgstr "Spowoduje, że Slic3r będzie automatycznie procesował modele jak tylko zostaną załadowane aby zmniejszyć czas eksportu G-code."
+msgstr "Spowoduje, że Slic3r będzie automatycznie procesował modele jak tylko zostaną załadowane, aby zmniejszyć czas eksportu G-code."
-#: src/slic3r/GUI/Preferences.cpp:41
+#: src/slic3r/GUI/Preferences.cpp:54
msgid "If this is enabled, Slic3r will prompt the last output directory instead of the one containing the input files."
msgstr "Włączenie spowoduje, że Slic3r będzie za każdym razem pytał gdzie wyeksportować plik zamiast używać katalogu z plikami wejściowymi."
-#: src/libslic3r/PrintConfig.cpp:1562
+#: src/slic3r/GUI/Preferences.cpp:125
+msgid "If this is enabled, when starting PrusaSlicer and another instance of the same PrusaSlicer is already running, that instance will be reactivated instead."
+msgstr "Jeśli włączone, uruchomienie PrusaSlicer, gdy uruchomiona jest ta sama wersja PrusaSlicer, spowoduje reaktywację tej instancji."
+
+#: src/libslic3r/PrintConfig.cpp:1670
msgid "If you set this to a positive value, Z is quickly raised every time a retraction is triggered. When using multiple extruders, only the setting for the first extruder will be considered."
msgstr "Jeśli ustawisz tu wartość dodatnią to oś Z wykona szybki ruch w górę przy każdej retrakcji. Przy używaniu kilku ekstruderów tylko ustawienia pierwszego z nich będą brane pod uwagę."
-#: src/libslic3r/PrintConfig.cpp:1571
+#: src/libslic3r/PrintConfig.cpp:1679
msgid "If you set this to a positive value, Z lift will only take place above the specified absolute Z. You can tune this setting for skipping lift on the first layers."
msgstr "Jeśli ustawisz wartość dodatnią, to oś Z (z-hop) będzie podnosić się tylko powyżej ustawionej wartości. Możesz w ten sposób wyłączyć z-hop na pierwszej warstwie."
-#: src/libslic3r/PrintConfig.cpp:1580
+#: src/libslic3r/PrintConfig.cpp:1688
msgid "If you set this to a positive value, Z lift will only take place below the specified absolute Z. You can tune this setting for limiting lift to the first layers."
msgstr "Jeśli ustawisz wartość dodatnią, to z-hop będzie odbywał się tylko poniżej ustawionej wartości. Możesz w ten sposób ograniczyć działanie funkcji np. tylko dla pierwszych warstw."
-#: src/libslic3r/PrintConfig.cpp:1454
+#: src/libslic3r/PrintConfig.cpp:1562
msgid "If you want to process the output G-code through custom scripts, just list their absolute paths here. Separate multiple scripts with a semicolon. Scripts will be passed the absolute path to the G-code file as the first argument, and they can access the Slic3r config settings by reading environment variables."
msgstr "Wprowadź ścieżki do własnych skryptów jeśli chcesz dodać je do wyjściowego pliku G-code. Możesz dodać wiele skryptów, rozdzielając je średnikiem ( ; ). Skrypty będą przetwarzane jako pierwsze w kolejności i mają dostęp do ustawień konfiguracyjnych Slic3ra przez zmienne środowiskowe."
-#: src/libslic3r/PrintConfig.cpp:530
+#: src/libslic3r/PrintConfig.cpp:566
msgid "If your firmware doesn't handle the extruder displacement you need the G-code to take it into account. This option lets you specify the displacement of each extruder with respect to the first one. It expects positive coordinates (they will be subtracted from the XY coordinate)."
msgstr "Jeśli oprogramowanie układowe (firmware) Twojej drukarki nie obsługuje rozmieszczenia ekstruderów to trzeba to określić w G-code. Ta opcja pozwala ustawić rozmieszczenie każdego ekstrudera w relacji do pierwszego. Oczekuje koordynat dodatnich (będą odejmowane od koordynat XY)."
-#: src/libslic3r/PrintConfig.cpp:2169
+#: src/libslic3r/PrintConfig.cpp:2312
msgid "If your firmware requires relative E values, check this, otherwise leave it unchecked. Most firmwares use absolute values."
msgstr "Jeśli Twój firmware wymaga względnych wartości E, zaznacz to pole. W innym przypadku zostaw puste. Większość układów obsługuje wartości absolutne."
-#: src/libslic3r/PrintConfig.cpp:3485
+#: src/libslic3r/PrintConfig.cpp:1219
+msgid "Ignore"
+msgstr "Ignoruj"
+
+#: src/libslic3r/PrintConfig.cpp:3684
msgid "Ignore non-existent config files"
msgstr "Ignoruj nieistniejÄ…ce pliki konfiguracyjne"
-#: src/slic3r/GUI/MainFrame.cpp:464
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:192
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:173
+msgid "Ignores facets facing away from the camera."
+msgstr "Ignoruje powierzchnie skierowane w przeciwną stronę względem widoku."
+
+#: src/slic3r/GUI/MainFrame.cpp:1055
msgid "Import &Config"
msgstr "Import Konfigura&cji"
-#: src/slic3r/GUI/MainFrame.cpp:471
+#: src/slic3r/GUI/MainFrame.cpp:1062
msgid "Import Config &Bundle"
msgstr "Import Paczki Konfi&guracyjnej"
-#: src/slic3r/GUI/MainFrame.cpp:467
+#: src/slic3r/GUI/MainFrame.cpp:1058
msgid "Import Config from &project"
msgstr "Import Konfiguracji z &projektu"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:119
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:112
msgid "Import Config from ini/amf/3mf/gcode"
msgstr "Importuj konfiguracjÄ™ z ini/amf/3mf/gcode"
-#: src/slic3r/GUI/Plater.cpp:4603
+#: src/slic3r/GUI/Plater.cpp:1419
+msgid "Import config only"
+msgstr "Tylko import konfiguracji"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:39
+msgid "Import file"
+msgstr "Import pliku"
+
+#: src/slic3r/GUI/Plater.cpp:1418
+msgid "Import geometry only"
+msgstr "Tylko import geometrii"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:46
+msgid "Import model and profile"
+msgstr "Import modelu i profilu"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48
+msgid "Import model only"
+msgstr "Import tylko modelu"
+
+#: src/slic3r/GUI/Plater.cpp:4655
msgid "Import Object"
msgstr "Import Modelu"
-#: src/slic3r/GUI/Plater.cpp:4607
+#: src/slic3r/GUI/Plater.cpp:4659
msgid "Import Objects"
msgstr "Importuj Modele"
@@ -3594,476 +4234,581 @@ msgstr "Importuj Modele"
msgid "Import of the repaired 3mf file failed"
msgstr "Niepowodzenie importu naprawionego pliku 3MF"
-#: src/slic3r/GUI/MainFrame.cpp:460
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47
+msgid "Import profile only"
+msgstr "Import tylko profilu"
+
+#: src/slic3r/GUI/MainFrame.cpp:1050
+msgid "Import SL1 archive"
+msgstr "Import archiwum SL1"
+
+#: src/slic3r/GUI/Plater.cpp:1561
+msgid "Import SLA archive"
+msgstr "Import archiwum SLA"
+
+#: src/slic3r/GUI/MainFrame.cpp:1046
+msgid "Import STL (imperial units)"
+msgstr "Import STL (jednostki imperialne)"
+
+#: src/slic3r/GUI/MainFrame.cpp:1042
msgid "Import STL/OBJ/AM&F/3MF"
msgstr "Import STL/OBJ/AM&F/3MF"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:118
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:111
msgid "Import STL/OBJ/AMF/3MF without config, keep plater"
msgstr "Otwórz STL/OBJ/AMF/3MF bez konfiguracji, zachowaj zawartość stołu"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3422
-#, c-format
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:159
+msgid "Importing canceled."
+msgstr "Importowanie anulowane."
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:160
+msgid "Importing done."
+msgstr "Importowanie zakończone."
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135
+msgid "Importing SLA archive"
+msgstr "Importowanie archiwum SLA"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487
+msgid "in"
+msgstr "cale"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3885
+#, possible-c-format
msgid "In this mode you can select only other %s Items%s"
msgstr "W tym trybie możesz wybrać jedynie %s elementów %s"
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:423
+msgid "Inches"
+msgstr "Cale"
+
#: src/slic3r/GUI/UpdateDialogs.cpp:230
msgid "Incompatible bundles:"
msgstr "Niekompatybilne zestawy ustawień:"
+#: src/slic3r/GUI/PresetComboBoxes.cpp:241
+msgid "Incompatible presets"
+msgstr "Niekompatybilne zestawy ustawień"
+
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75
-#, c-format
+#, possible-c-format
msgid "Incompatible with this %s"
msgstr "Brak kompatybilności z %s"
-#: src/slic3r/GUI/Plater.cpp:4685
+#: src/slic3r/GUI/Plater.cpp:4790
msgid "Increase Instances"
msgstr "Zwiększ ilość instancji"
-#: src/slic3r/GUI/GLCanvas3D.cpp:264
+#: src/slic3r/GUI/GLCanvas3D.cpp:251
msgid "Increase/decrease edit area"
msgstr "Zmniejsz/zwiększ obszar edycji"
-#: src/slic3r/GUI/Plater.cpp:2922
-msgid "Indexing hollowed object"
-msgstr "Indeksowanie wydrążonego obiektu"
-
#. TRN Description for "UNLOCKED LOCK"
-#: src/slic3r/GUI/Tab.cpp:3258
-msgid ""
-"indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\n"
-"Click the UNLOCKED LOCK icon to reset all settings for current option group to the system (or default) values."
-msgstr ""
-"oznacza, że niektóre ustawienia zostały zmodyfikowane i nie odpowiadają wartościom systemowym (lub domyślnym) w obecnej grupie opcji.\n"
-"Kliknij ikonÄ™ OTWARTEJ KÅÓDKI, aby zresetować wszystkie ustawienia obecnej grupy ustawieÅ„ do wartoÅ›ci systemowych (lub domyÅ›lnych)."
+#: src/slic3r/GUI/Tab.cpp:3695
+msgid "indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\nClick the UNLOCKED LOCK icon to reset all settings for current option group to the system (or default) values."
+msgstr "oznacza, że niektóre ustawienia zostaÅ‚y zmodyfikowane i nie odpowiadajÄ… wartoÅ›ciom systemowym (lub domyÅ›lnym) w obecnej grupie opcji.\nKliknij ikonÄ™ OTWARTEJ KÅÓDKI, aby zresetować wszystkie ustawienia obecnej grupy ustawieÅ„ do wartoÅ›ci systemowych (lub domyÅ›lnych)."
#. TRN Description for "LOCKED LOCK"
-#: src/slic3r/GUI/Tab.cpp:3254
+#: src/slic3r/GUI/Tab.cpp:3691
msgid "indicates that the settings are the same as the system (or default) values for the current option group"
msgstr "wskazuje na to, że ustawienia są takie same jak systemowe (lub domyślne) wartości dla danej grupy opcji"
#. TRN Description for "BACK ARROW"
-#: src/slic3r/GUI/Tab.cpp:3270
-msgid ""
-"indicates that the settings were changed and are not equal to the last saved preset for the current option group.\n"
-"Click the BACK ARROW icon to reset all settings for the current option group to the last saved preset."
-msgstr ""
-"oznacza, że ustawienia zostały zmodyfikowane i nie odpowiadają tym z ostatnio zapisanego zestawu ustawień dla obecnej grupy opcji.\n"
-"Kliknij ikonÄ™ STRZAÅKI W TYÅ aby zresetować wszystkie ustawienia w obecnej grupie opcji do tych z ostatnio zapisanego zestawu ustawieÅ„."
-
-#: src/slic3r/GUI/ConfigManipulation.cpp:211
-#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:96
-#: src/slic3r/GUI/GUI_ObjectList.cpp:614 src/slic3r/GUI/Plater.cpp:527
-#: src/slic3r/GUI/Tab.cpp:1091 src/slic3r/GUI/Tab.cpp:1092
-#: src/libslic3r/PrintConfig.cpp:203 src/libslic3r/PrintConfig.cpp:416
-#: src/libslic3r/PrintConfig.cpp:436 src/libslic3r/PrintConfig.cpp:776
-#: src/libslic3r/PrintConfig.cpp:790 src/libslic3r/PrintConfig.cpp:827
-#: src/libslic3r/PrintConfig.cpp:981 src/libslic3r/PrintConfig.cpp:991
-#: src/libslic3r/PrintConfig.cpp:1009 src/libslic3r/PrintConfig.cpp:1028
-#: src/libslic3r/PrintConfig.cpp:1047 src/libslic3r/PrintConfig.cpp:1728
-#: src/libslic3r/PrintConfig.cpp:1745
+#: src/slic3r/GUI/Tab.cpp:3707
+msgid "indicates that the settings were changed and are not equal to the last saved preset for the current option group.\nClick the BACK ARROW icon to reset all settings for the current option group to the last saved preset."
+msgstr "oznacza, że ustawienia zostaÅ‚y zmodyfikowane i nie odpowiadajÄ… tym z ostatnio zapisanego zestawu ustawieÅ„ dla obecnej grupy opcji.\nKliknij ikonÄ™ STRZAÅKI W TYÅ, aby zresetować wszystkie ustawienia w obecnej grupie opcji do tych z ostatnio zapisanego zestawu ustawieÅ„."
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:210
+#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:93
+#: src/slic3r/GUI/GUI_ObjectList.cpp:652 src/slic3r/GUI/Plater.cpp:393
+#: src/slic3r/GUI/Tab.cpp:1413 src/slic3r/GUI/Tab.cpp:1414
+#: src/libslic3r/PrintConfig.cpp:237 src/libslic3r/PrintConfig.cpp:450
+#: src/libslic3r/PrintConfig.cpp:472 src/libslic3r/PrintConfig.cpp:812
+#: src/libslic3r/PrintConfig.cpp:826 src/libslic3r/PrintConfig.cpp:863
+#: src/libslic3r/PrintConfig.cpp:1025 src/libslic3r/PrintConfig.cpp:1035
+#: src/libslic3r/PrintConfig.cpp:1053 src/libslic3r/PrintConfig.cpp:1072
+#: src/libslic3r/PrintConfig.cpp:1091 src/libslic3r/PrintConfig.cpp:1843
+#: src/libslic3r/PrintConfig.cpp:1860
msgid "Infill"
msgstr "Wypełnienie"
-#: src/slic3r/GUI/PresetHints.cpp:174
+#: src/slic3r/GUI/PresetHints.cpp:173
msgid "infill"
msgstr "wypełnienia"
-#: src/libslic3r/PrintConfig.cpp:1021
+#: src/libslic3r/PrintConfig.cpp:1065
msgid "Infill before perimeters"
msgstr "Wypełnienie przed obrysami"
-#: src/libslic3r/PrintConfig.cpp:1001
+#: src/libslic3r/PrintConfig.cpp:1045
msgid "Infill extruder"
msgstr "Ekstruder dla wypełnienia"
-#: src/libslic3r/PrintConfig.cpp:1036
+#: src/libslic3r/PrintConfig.cpp:1080
msgid "Infill/perimeters overlap"
msgstr "Nakładanie wypełnienia na obrysy"
-#: src/libslic3r/Print.cpp:1584
+#: src/libslic3r/Print.cpp:1610
msgid "Infilling layers"
msgstr "Warstwy wypełniające"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3430
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3505 src/slic3r/GUI/Plater.cpp:141
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3893
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3968 src/slic3r/GUI/Plater.cpp:147
msgid "Info"
msgstr "Info"
-#: src/libslic3r/PrintConfig.cpp:1057
+#: src/slic3r/GUI/GUI_App.cpp:1087 src/slic3r/GUI/Tab.cpp:3435
+msgid "Information"
+msgstr "Informacje"
+
+#: src/libslic3r/PrintConfig.cpp:1101
msgid "Inherits profile"
msgstr "Dziedziczy profil"
-#: src/libslic3r/SLAPrint.cpp:653
+#: src/libslic3r/SLAPrint.cpp:667
msgid "Initial exposition time is out of printer profile bounds."
msgstr "Początkowy czas naświetlania jest poza zakresem profilu drukarki."
-#: src/libslic3r/PrintConfig.cpp:2564 src/libslic3r/PrintConfig.cpp:2565
+#: src/libslic3r/PrintConfig.cpp:2707 src/libslic3r/PrintConfig.cpp:2708
msgid "Initial exposure time"
msgstr "Początkowy czas naświetlania"
-#: src/libslic3r/PrintConfig.cpp:2482 src/libslic3r/PrintConfig.cpp:2483
+#: src/libslic3r/PrintConfig.cpp:2625 src/libslic3r/PrintConfig.cpp:2626
msgid "Initial layer height"
msgstr "Wysokość pierwszej warstwy"
-#: src/slic3r/GUI/Field.cpp:204
+#: src/slic3r/GUI/Field.cpp:269
+#, possible-c-format
+msgid "Input value is out of range\nAre you sure that %s is a correct value and that you want to continue?"
+msgstr "Wprowadzona wartość jest poza zakresem.\nCzy na pewno %s to poprawna wartość i chcesz kontynuować?"
+
+#: src/slic3r/GUI/Field.cpp:252 src/slic3r/GUI/Field.cpp:1370
msgid "Input value is out of range"
msgstr "Wartość poza zakresem"
-#: src/slic3r/GUI/GUI_App.cpp:800
+#: src/slic3r/GUI/GUI_App.cpp:1480
msgid "Inspect / activate configuration snapshots"
msgstr "Sprawdzenie / aktywacja zrzutów konfiguracji"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:60
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:216
-#, c-format
+#: src/slic3r/Utils/PresetUpdater.cpp:120
+msgid "install"
+msgstr "instalacja"
+
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:62
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:218
+#, possible-c-format
msgid "Instance %d"
-msgstr "Kopia %d"
+msgstr "Instancja %d"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2500
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2892
msgid "Instance manipulation"
-msgstr "Manipulacja kopiÄ… modelu"
+msgstr "Manipulacja instancjÄ… modelu"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:56
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:58
msgid "Instances"
msgstr "Instancje (kopie)"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1091
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3781
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1215
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4244
msgid "Instances to Separated Objects"
-msgstr "Kopie jako Osobne Modele"
+msgstr "Instancje jako osobne modele"
-#: src/libslic3r/PrintConfig.cpp:1973
+#: src/libslic3r/PrintConfig.cpp:2115
msgid "Interface layers"
msgstr "Warstwy Å‚Ä…czÄ…ce"
-#: src/libslic3r/PrintConfig.cpp:1957
+#: src/libslic3r/PrintConfig.cpp:2099
msgid "Interface loops"
msgstr "Warstwy łączące (pętle)"
-#: src/libslic3r/PrintConfig.cpp:1982
+#: src/libslic3r/PrintConfig.cpp:2124
msgid "Interface pattern spacing"
msgstr "Rozstaw wzoru warstw Å‚Ä…czÄ…cych"
-#: src/libslic3r/PrintConfig.cpp:1071
+#: src/libslic3r/PrintConfig.cpp:1115
msgid "Interface shells"
msgstr "Powłoki łączące"
-#: src/libslic3r/Zipper.cpp:84
+#: src/libslic3r/miniz_extension.cpp:143
msgid "internal error"
msgstr "błąd wewnętrzny"
-#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:313
+#: src/slic3r/GUI/GUI_Preview.cpp:304 src/libslic3r/ExtrusionEntity.cpp:317
+#: src/libslic3r/ExtrusionEntity.cpp:342
msgid "Internal infill"
msgstr "Wypełnienie wewnętrzne"
-#: src/slic3r/GUI/Plater.cpp:3106
+#: src/slic3r/GUI/BedShapeDialog.cpp:145
+msgid "Invalid"
+msgstr "Nieprawidłowy"
+
+#: src/slic3r/GUI/Plater.cpp:2906 src/slic3r/GUI/Plater.cpp:3583
msgid "Invalid data"
msgstr "Nieprawidłowe dane"
-#: src/slic3r/GUI/BedShapeDialog.cpp:494 src/slic3r/GUI/BedShapeDialog.cpp:543
-#: src/slic3r/GUI/BedShapeDialog.cpp:566
+#: src/slic3r/GUI/BedShapeDialog.cpp:570 src/slic3r/GUI/BedShapeDialog.cpp:619
+#: src/slic3r/GUI/BedShapeDialog.cpp:642
msgid "Invalid file format."
msgstr "Nieprawidłowy format pliku."
-#: src/libslic3r/Zipper.cpp:80
+#: src/libslic3r/miniz_extension.cpp:139
msgid "invalid filename"
msgstr "nieprawidłowa nazwa"
-#: src/slic3r/GUI/ConfigManipulation.cpp:319
+#: src/slic3r/GUI/ConfigManipulation.cpp:324
msgid "Invalid Head penetration"
msgstr "Nieprawidłowe przenikanie łączników podpór"
-#: src/libslic3r/Zipper.cpp:48
+#: src/libslic3r/miniz_extension.cpp:107
msgid "invalid header or archive is corrupted"
msgstr "niewłaściwy nagłówek lub uszkodzone archiwum"
-#: src/slic3r/GUI/Field.cpp:195 src/slic3r/GUI/Field.cpp:226
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:376
+#: src/slic3r/GUI/Field.cpp:375
+msgid "Invalid input format. Expected vector of dimensions in the following format: \"%1%\""
+msgstr "Błędny format wejściowy. Oczekiwano wektora wymiarów w następującym formacie: \"%1%\""
+
+#: src/slic3r/GUI/Field.cpp:243 src/slic3r/GUI/Field.cpp:274
+#: src/slic3r/GUI/Field.cpp:1358 src/slic3r/GUI/GUI_ObjectLayers.cpp:413
msgid "Invalid numeric input."
msgstr "Nieprawidłowa wartość numeryczna."
-#: src/libslic3r/Zipper.cpp:78
+#: src/libslic3r/miniz_extension.cpp:137
msgid "invalid parameter"
msgstr "nieprawidłowy parametr"
-#: src/slic3r/GUI/ConfigManipulation.cpp:332
+#: src/slic3r/GUI/ConfigManipulation.cpp:337
msgid "Invalid pinhead diameter"
msgstr "Błędna średnica łącznika"
+#: src/slic3r/GUI/GUI_ObjectList.cpp:94 src/slic3r/GUI/GUI_ObjectList.cpp:653
+#: src/slic3r/GUI/GUI_Preview.cpp:307 src/slic3r/GUI/Tab.cpp:1420
+#: src/libslic3r/ExtrusionEntity.cpp:320 src/libslic3r/ExtrusionEntity.cpp:348
+#: src/libslic3r/PrintConfig.cpp:1126 src/libslic3r/PrintConfig.cpp:1132
+#: src/libslic3r/PrintConfig.cpp:1146 src/libslic3r/PrintConfig.cpp:1156
+msgid "Ironing"
+msgstr "Prasowanie"
+
+#: src/libslic3r/PrintConfig.cpp:1131 src/libslic3r/PrintConfig.cpp:1133
+msgid "Ironing Type"
+msgstr "Rodzaj prasowania"
+
+#: src/slic3r/GUI/GUI_App.cpp:243
+msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community."
+msgstr "bazuje na projekcie Slic3r autorstwa Alessandro Ranellucciego i społeczności RepRap."
+
#. TRN "Slic3r _is licensed under the_ License"
-#: src/slic3r/GUI/AboutDialog.cpp:258
+#: src/slic3r/GUI/AboutDialog.cpp:283 src/slic3r/GUI/GUI_App.cpp:244
msgid "is licensed under the"
msgstr "ma licencjÄ™ na warunkach"
-#: src/slic3r/GUI/Tab.cpp:2941
-msgid "is not compatible with print profile"
-msgstr "nie jest kompatybilne z profilem druku"
-
-#: src/slic3r/GUI/Tab.cpp:2940
-msgid "is not compatible with printer"
-msgstr "nie jest kompatybilne z drukarkÄ…"
-
-#: src/slic3r/GUI/MainFrame.cpp:658
+#: src/slic3r/GUI/MainFrame.cpp:955 src/slic3r/GUI/MainFrame.cpp:1275
msgid "Iso"
msgstr "Izometryczny"
-#: src/slic3r/GUI/MainFrame.cpp:658
+#: src/slic3r/GUI/MainFrame.cpp:955 src/slic3r/GUI/MainFrame.cpp:1275
msgid "Iso View"
msgstr "Widok izometryczny"
-#: src/slic3r/GUI/Tab.cpp:964
+#: src/slic3r/GUI/Tab.cpp:1282
msgid "It can't be deleted or modified."
msgstr "Nie można usunąć ani zmodyfikować."
-#: src/slic3r/GUI/Plater.cpp:3321
+#: src/slic3r/GUI/Plater.cpp:3124
msgid "It is not allowed to change the file to reload"
msgstr "Zmiana modelu do ponownego wczytania jest niemożliwa"
-#: src/libslic3r/PrintConfig.cpp:974
+#: src/libslic3r/PrintConfig.cpp:1018
msgid "It may be beneficial to increase the extruder motor current during the filament exchange sequence to allow for rapid ramming feed rates and to overcome resistance when loading a filament with an ugly shaped tip."
msgstr "Zwiększenie prądu podawanego do silnika ekstrudera może mieć pozytywny wpływ podczas zmiany filamentu, pomagając kształtować końcówkę przez wyciskanie oraz przepychać filament z nieprawidłowo ukształtowaną końcówką."
-#: src/slic3r/GUI/GUI_App.cpp:1084 src/slic3r/GUI/Tab.cpp:2958
+#: src/slic3r/GUI/Tab.cpp:3413
+msgid "It's a last preset for this physical printer."
+msgstr "Jest to ostatni zestaw ustawień dla fizycznej drukarki."
+
+#: src/slic3r/GUI/GUI_App.cpp:1876 src/slic3r/GUI/Tab.cpp:3187
msgid "It's impossible to print multi-part object(s) with SLA technology."
msgstr "Drukowanie modeli złożonych z wielu elementów jest niemożliwe w technologii SLA."
-#: src/slic3r/GUI/Tab.cpp:2229
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:601
+msgid "It's not possible to delete the last related preset for the printer."
+msgstr "Nie ma możliwości usunięcia ostatniego zestawu ustawień dla drukarki."
+
+#: src/slic3r/GUI/Tab.cpp:2398
msgid "Jerk limits"
msgstr "Limity jerku"
-#: src/libslic3r/PrintConfig.cpp:1649
+#: src/libslic3r/PrintConfig.cpp:1757
msgid "Jitter"
msgstr "Jitter"
-#: src/slic3r/GUI/DoubleSlider.cpp:957 src/slic3r/GUI/DoubleSlider.cpp:1529
-#: src/slic3r/GUI/DoubleSlider.cpp:1651
+#: src/slic3r/GUI/DoubleSlider.cpp:1077 src/slic3r/GUI/DoubleSlider.cpp:1721
+#: src/slic3r/GUI/DoubleSlider.cpp:1852 src/slic3r/GUI/DoubleSlider.cpp:1856
msgid "Jump to height"
msgstr "Przejdź do wysokości"
-#: src/slic3r/GUI/DoubleSlider.cpp:955
-#, c-format
-msgid "Jump to height %s or Set extruder sequence for the entire print"
-msgstr "Przejdź na wysokość %s lub ustaw sekwencję ekstruderów dla całego wydruku"
+#: src/slic3r/GUI/DoubleSlider.cpp:1223
+#, possible-c-format
+msgid "Jump to height %s\nor Set ruler mode"
+msgstr "Przejdź na wysokość %s \nlub ustaw tryb linijki"
-#: src/libslic3r/PrintConfig.cpp:566
+#: src/slic3r/GUI/DoubleSlider.cpp:1220
+#, possible-c-format
+msgid "Jump to height %s\nSet ruler mode\nor Set extruder sequence for the entire print"
+msgstr "Przejdź na wysokość %s \nUstaw tryb linijki\nlub ustaw sekwencję ekstrudera dla całego wydruku"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1071 src/slic3r/GUI/DoubleSlider.cpp:1852
+msgid "Jump to move"
+msgstr "Przeskocz do ruchu"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:315
+msgid "Just switch to \"%1%\" preset"
+msgstr "Przełącz na zestaw ustawień \"%1%\""
+
+#: src/libslic3r/PrintConfig.cpp:602
msgid "Keep fan always on"
msgstr "Wentylator zawsze włączony"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:169
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:171
msgid "Keep lower part"
msgstr "Zachowaj dolną część"
-#: src/slic3r/GUI/GLCanvas3D.cpp:304
+#: src/slic3r/GUI/GLCanvas3D.cpp:290
msgid "Keep min"
msgstr "Zachowaj min"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:168
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170
msgid "Keep upper part"
msgstr "Zachowaj górną część"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:41 src/slic3r/GUI/MainFrame.cpp:708
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:37
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:39 src/slic3r/GUI/MainFrame.cpp:941
+#: src/slic3r/GUI/MainFrame.cpp:1332
msgid "Keyboard Shortcuts"
msgstr "Skróty klawiszowe"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:245
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:259
msgid "Keyboard shortcuts"
msgstr "Skróty klawiszowe"
-#: src/libslic3r/PrintConfig.cpp:2498
+#: src/libslic3r/PrintConfig.cpp:2641
msgid "kg"
msgstr "kg"
-#: src/libslic3r/PrintConfig.cpp:965
+#: src/libslic3r/PrintConfig.cpp:1009
msgid "Label objects"
msgstr "Oznacz modele"
-#: src/libslic3r/PrintConfig.cpp:2399
+#: src/libslic3r/PrintConfig.cpp:2542
msgid "Landscape"
msgstr "Tryb krajobrazu"
-#: src/slic3r/GUI/GUI_App.cpp:629
+#: src/slic3r/GUI/GUI_App.cpp:1295
msgid "Language"
msgstr "Język"
-#: src/slic3r/GUI/GUI_App.cpp:885
+#: src/slic3r/GUI/GUI_App.cpp:1605 src/slic3r/GUI/GUI_App.cpp:1614
msgid "Language selection"
msgstr "Wybór języka"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2140
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2242
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2307
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2408
msgid "Last instance of an object cannot be deleted."
-msgstr "Ostatnia kopia modelu nie może zostać usunięta."
+msgstr "Ostatnia instancja modelu nie może zostać usunięta."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3418
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3881
msgid "Layer"
msgstr "Warstwa"
-#: src/slic3r/GUI/ConfigManipulation.cpp:49
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1049
+#: src/slic3r/GUI/ConfigManipulation.cpp:48
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1371
#: src/libslic3r/PrintConfig.cpp:71
msgid "Layer height"
msgstr "Wysokość warstwy"
-#: src/libslic3r/Print.cpp:1427
+#: src/libslic3r/Print.cpp:1453
msgid "Layer height can't be greater than nozzle diameter"
msgstr "Wysokość pierwszej warstwy nie może być większa od średnicy dyszy"
-#: src/slic3r/GUI/Tab.cpp:2362
+#: src/slic3r/GUI/Tab.cpp:2531
msgid "Layer height limits"
msgstr "Limit wysokości warstw"
-#: src/slic3r/GUI/ConfigWizard.cpp:2015
-msgid "Layer height:"
-msgstr "Wysokość warstwy:"
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2488
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2880
msgid "Layer range Settings to modify"
msgstr "Zakres warstw dla modyfikacji ustawień"
#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:52
-#: src/libslic3r/PrintConfig.cpp:362 src/libslic3r/PrintConfig.cpp:994
-#: src/libslic3r/PrintConfig.cpp:1505 src/libslic3r/PrintConfig.cpp:1690
-#: src/libslic3r/PrintConfig.cpp:1750 src/libslic3r/PrintConfig.cpp:1930
-#: src/libslic3r/PrintConfig.cpp:1976
+#: src/libslic3r/PrintConfig.cpp:396 src/libslic3r/PrintConfig.cpp:1038
+#: src/libslic3r/PrintConfig.cpp:1613 src/libslic3r/PrintConfig.cpp:1798
+#: src/libslic3r/PrintConfig.cpp:1865 src/libslic3r/PrintConfig.cpp:2072
+#: src/libslic3r/PrintConfig.cpp:2118
msgid "layers"
msgstr "warstwy"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3512
-#: src/slic3r/GUI/Tab.cpp:3600
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3928
+#: src/slic3r/GUI/Tab.cpp:4010
msgid "Layers"
msgstr "Warstwy"
-#: src/slic3r/GUI/Tab.cpp:1048 src/slic3r/GUI/Tab.cpp:3598
+#: src/slic3r/GUI/Tab.cpp:1370 src/slic3r/GUI/Tab.cpp:4008
msgid "Layers and perimeters"
msgstr "Warstwy i obrysy"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:95
-#: src/slic3r/GUI/GUI_ObjectList.cpp:613 src/libslic3r/PrintConfig.cpp:72
-#: src/libslic3r/PrintConfig.cpp:175 src/libslic3r/PrintConfig.cpp:184
-#: src/libslic3r/PrintConfig.cpp:408 src/libslic3r/PrintConfig.cpp:470
-#: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:890
-#: src/libslic3r/PrintConfig.cpp:1075 src/libslic3r/PrintConfig.cpp:1374
-#: src/libslic3r/PrintConfig.cpp:1441 src/libslic3r/PrintConfig.cpp:1622
-#: src/libslic3r/PrintConfig.cpp:2074 src/libslic3r/PrintConfig.cpp:2133
-#: src/libslic3r/PrintConfig.cpp:2142
+#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:92
+#: src/slic3r/GUI/GUI_ObjectList.cpp:651 src/libslic3r/PrintConfig.cpp:72
+#: src/libslic3r/PrintConfig.cpp:209 src/libslic3r/PrintConfig.cpp:218
+#: src/libslic3r/PrintConfig.cpp:442 src/libslic3r/PrintConfig.cpp:506
+#: src/libslic3r/PrintConfig.cpp:514 src/libslic3r/PrintConfig.cpp:932
+#: src/libslic3r/PrintConfig.cpp:1119 src/libslic3r/PrintConfig.cpp:1482
+#: src/libslic3r/PrintConfig.cpp:1549 src/libslic3r/PrintConfig.cpp:1730
+#: src/libslic3r/PrintConfig.cpp:2217 src/libslic3r/PrintConfig.cpp:2276
+#: src/libslic3r/PrintConfig.cpp:2285
msgid "Layers and Perimeters"
msgstr "Warstwy i Obrysy"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
-msgid "Layers Slider"
-msgstr "Suwak warstw"
-
-#: src/slic3r/GUI/OptionsGroup.cpp:258
+#: src/slic3r/GUI/OptionsGroup.cpp:293
msgctxt "Layers"
msgid "Bottom"
msgstr "Spód"
-#: src/slic3r/GUI/OptionsGroup.cpp:258
+#: src/slic3r/GUI/OptionsGroup.cpp:293
msgctxt "Layers"
msgid "Top"
msgstr "Góra"
-#: src/slic3r/GUI/MainFrame.cpp:671
+#: src/slic3r/GUI/Preferences.cpp:440
+msgid "Layout Options"
+msgstr "Opcje układu"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:48
+msgid "Leaving Paint-on supports"
+msgstr "Zamykam malowanie podpór"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:47
+msgid "Leaving Seam painting"
+msgstr "Zamykam malowanie szwu"
+
+#: src/slic3r/GUI/MainFrame.cpp:968 src/slic3r/GUI/MainFrame.cpp:1288
msgid "Left"
msgstr "Lewo"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214
msgid "Left click"
msgstr "Lewy przycisk"
-#: src/slic3r/GUI/GLCanvas3D.cpp:237
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:29
+msgid "Left mouse button"
+msgstr "Lewy przycisk myszy"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:233
msgid "Left mouse button:"
-msgstr "Lewy przycisk myszki:"
+msgstr "Lewy przycisk myszy:"
-#: src/slic3r/GUI/MainFrame.cpp:671
+#: src/slic3r/GUI/MainFrame.cpp:968 src/slic3r/GUI/MainFrame.cpp:1288
msgid "Left View"
msgstr "Widok lewy"
-#: src/slic3r/GUI/GUI_Preview.cpp:257
-msgid "Legend"
-msgstr "Legenda"
+#: src/slic3r/GUI/GUI_Preview.cpp:1480
+msgid "Legend/Estimated printing time"
+msgstr "Legenda/szacowany czas drukowania"
-#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1551
+#: src/libslic3r/PrintConfig.cpp:1651 src/libslic3r/PrintConfig.cpp:1659
msgid "Length"
msgstr "Długość"
-#: src/libslic3r/PrintConfig.cpp:328
+#: src/libslic3r/PrintConfig.cpp:362
msgid "Length of the cooling tube to limit space for cooling moves inside it."
msgstr "Długość rurki chłodzącej ograniczająca ruchy chłodzące do jej zakresu."
+#: src/libslic3r/PrintConfig.cpp:1068
+msgid "Length of the infill anchor"
+msgstr "Długość kotwiczenia wypełnienia"
+
#. TRN "Slic3r _is licensed under the_ License"
-#: src/slic3r/GUI/AboutDialog.cpp:129
+#: src/slic3r/GUI/AboutDialog.cpp:141
msgid "License agreements of all following programs (libraries) are part of application license agreement"
msgstr "Umowy licencyjne dla wszystkich części programu (bibliotek) są częścią umowy licencyjnej programu"
-#: src/libslic3r/PrintConfig.cpp:1561
+#: src/libslic3r/PrintConfig.cpp:1669
msgid "Lift Z"
msgstr "Z-hop"
-#: src/libslic3r/PrintConfig.cpp:848
+#: src/libslic3r/PrintConfig.cpp:886
msgid "Line"
msgstr "Linia"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1427
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1558
msgid "Load"
msgstr "Załaduj"
-#: src/slic3r/GUI/MainFrame.cpp:460
+#: src/slic3r/GUI/MainFrame.cpp:1042
msgid "Load a model"
msgstr "Wczytaj model"
-#: src/libslic3r/PrintConfig.cpp:3505
+#: src/slic3r/GUI/MainFrame.cpp:1046
+msgid "Load an model saved with imperial units"
+msgstr "Wczytaj model zapisany w jednostkach imperialnych"
+
+#: src/slic3r/GUI/MainFrame.cpp:1058
+msgid "Load an SL1 archive"
+msgstr "Wczytaj archiwum SL1"
+
+#: src/libslic3r/PrintConfig.cpp:3710
msgid "Load and store settings at the given directory. This is useful for maintaining different profiles or including configurations from a network storage."
msgstr "Załaduj i przechowuj ustawienia w podanej lokalizacji. Jest to przydatne przy używaniu wielu profili lub konfiguracji z lokalizacji sieciowej."
-#: src/libslic3r/PrintConfig.cpp:3489
+#: src/libslic3r/PrintConfig.cpp:3688
msgid "Load config file"
msgstr "Wczytaj plik konfiguracyjny"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:120
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:113
msgid "Load Config from ini/amf/3mf/gcode and merge"
msgstr "Wczytaj Konfigurację z ini/amf/3mf/gcode i złącz"
-#: src/slic3r/GUI/MainFrame.cpp:467
+#: src/slic3r/GUI/MainFrame.cpp:1058
msgid "Load configuration from project file"
msgstr "Wczytaj konfiguracjÄ™ z pliku projektu"
-#: src/libslic3r/PrintConfig.cpp:3490
+#: src/libslic3r/PrintConfig.cpp:3689
msgid "Load configuration from the specified file. It can be used more than once to load options from multiple files."
msgstr "Wczytaj konfigurację z określonego pliku. Może być użyte więcej niż raz, aby wczytać opcje z wielu plików."
-#: src/slic3r/GUI/MainFrame.cpp:464
+#: src/slic3r/GUI/MainFrame.cpp:1055
msgid "Load exported configuration file"
msgstr "Wczytaj wyeksportowany plik konfiguracyjny"
-#: src/slic3r/GUI/Plater.cpp:1395
+#: src/slic3r/GUI/Plater.cpp:1543 src/slic3r/GUI/Plater.cpp:4976
msgid "Load File"
-msgstr "Wczytaj Plik"
+msgstr "Wczytaj plik"
-#: src/slic3r/GUI/Plater.cpp:1399
+#: src/slic3r/GUI/Plater.cpp:1548 src/slic3r/GUI/Plater.cpp:4981
msgid "Load Files"
-msgstr "Wczytaj Pliki"
+msgstr "Wczytaj pliki"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1879
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2038
msgid "Load Part"
msgstr "Wczytaj Element"
-#: src/slic3r/GUI/MainFrame.cpp:471
+#: src/slic3r/GUI/MainFrame.cpp:1062
msgid "Load presets from a bundle"
msgstr "Wczytaj zestaw ustawień"
-#: src/slic3r/GUI/Plater.cpp:4575
+#: src/slic3r/GUI/Plater.cpp:4627
msgid "Load Project"
msgstr "Wczytaj Projekt"
-#: src/slic3r/GUI/BedShapeDialog.cpp:102
+#: src/slic3r/GUI/BedShapeDialog.cpp:243
msgid "Load shape from STL..."
msgstr "Wczytaj kształt z STL..."
-#: src/slic3r/GUI/BedShapeDialog.cpp:182 src/slic3r/GUI/BedShapeDialog.cpp:261
+#: src/slic3r/GUI/BedShapeDialog.cpp:325 src/slic3r/GUI/BedShapeDialog.cpp:405
msgid "Load..."
msgstr "Otwórz..."
@@ -4071,19 +4816,27 @@ msgstr "Otwórz..."
msgid "loaded"
msgstr "załadowano"
-#: src/slic3r/GUI/Plater.cpp:2426
+#: src/slic3r/GUI/Plater.cpp:2388
msgid "Loaded"
msgstr "Wczytano"
-#: src/slic3r/GUI/Plater.cpp:2273
+#: src/slic3r/GUI/Plater.cpp:2216
msgid "Loading"
msgstr "Åadowanie"
-#: src/slic3r/GUI/GUI_App.cpp:474
+#: src/slic3r/GUI/GUI_App.cpp:797
+msgid "Loading configuration"
+msgstr "Wczytywanie konfiguracji"
+
+#: src/slic3r/GUI/Plater.cpp:2226
+msgid "Loading file"
+msgstr "Wczytywanie pliku"
+
+#: src/slic3r/GUI/GUI_App.cpp:1125
msgid "Loading of a mode view"
msgstr "Åadowanie trybu wyÅ›wietlania"
-#: src/slic3r/GUI/GUI_App.cpp:466
+#: src/slic3r/GUI/GUI_App.cpp:1120
msgid "Loading of current presets"
msgstr "Wczytywanie aktualnych zestawów ustawień"
@@ -4092,101 +4845,121 @@ msgstr "Wczytywanie aktualnych zestawów ustawień"
msgid "Loading repaired model"
msgstr "Åadowanie naprawionego modelu"
-#: src/libslic3r/PrintConfig.cpp:607
+#: src/libslic3r/PrintConfig.cpp:643
msgid "Loading speed"
msgstr "Prędkość ładowania"
-#: src/libslic3r/PrintConfig.cpp:615
+#: src/libslic3r/PrintConfig.cpp:651
msgid "Loading speed at the start"
msgstr "Początkowa prędkość ładowania"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:63
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:106
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:69
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:112
msgid "Local coordinates"
msgstr "Lokalny układ współrzędnych"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48
msgid "Lock supports under new islands"
msgstr "Zablokuj podpory pod nowymi wyspami"
-#: src/slic3r/GUI/Tab.cpp:3252
+#: src/slic3r/GUI/Tab.cpp:3689
msgid "LOCKED LOCK"
msgstr "ZAMKNIĘTA KÅÓDKA"
-#: src/slic3r/GUI/Tab.cpp:3280
+#: src/slic3r/GUI/Tab.cpp:3717
msgid "LOCKED LOCK icon indicates that the settings are the same as the system (or default) values for the current option group"
msgstr "ZAMKNIĘTA KÅÓDKA oznacza, że ustawienia sÄ… takie same jak wartoÅ›ci systemowe (lub domyÅ›lne) w obecnej grupie ustawieÅ„"
-#: src/slic3r/GUI/Tab.cpp:3296
+#: src/slic3r/GUI/Tab.cpp:3733
msgid "LOCKED LOCK icon indicates that the value is the same as the system (or default) value."
msgstr "ZAMKNIĘTA KÅÓDKA oznacza, że wartoÅ›ci sÄ… takie same jak systemowe (lub domyÅ›lne)."
-#: src/libslic3r/PrintConfig.cpp:3508
+#: src/libslic3r/PrintConfig.cpp:3713
msgid "Logging level"
msgstr "Poziom logowania"
-#: src/libslic3r/PrintConfig.cpp:1695
+#: src/libslic3r/PrintConfig.cpp:1810
msgid "Loops (minimum)"
msgstr "Pętle (minimum)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:206
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
msgid "Lower Layer"
msgstr "Dolna Warstwa"
-#: src/slic3r/GUI/Tab.cpp:2188 src/slic3r/GUI/Tab.cpp:2273
-#: src/libslic3r/PrintConfig.cpp:1129 src/libslic3r/PrintConfig.cpp:1146
-#: src/libslic3r/PrintConfig.cpp:1163 src/libslic3r/PrintConfig.cpp:1179
-#: src/libslic3r/PrintConfig.cpp:1189 src/libslic3r/PrintConfig.cpp:1199
-#: src/libslic3r/PrintConfig.cpp:1209
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+msgid "Lower layer"
+msgstr "Niższa warstwa"
+
+#: src/slic3r/GUI/Tab.cpp:2346 src/slic3r/GUI/Tab.cpp:2442
+#: src/libslic3r/PrintConfig.cpp:1202 src/libslic3r/PrintConfig.cpp:1237
+#: src/libslic3r/PrintConfig.cpp:1254 src/libslic3r/PrintConfig.cpp:1271
+#: src/libslic3r/PrintConfig.cpp:1287 src/libslic3r/PrintConfig.cpp:1297
+#: src/libslic3r/PrintConfig.cpp:1307 src/libslic3r/PrintConfig.cpp:1317
msgid "Machine limits"
msgstr "Limity maszynowe"
-#: src/slic3r/GUI/Plater.cpp:166
+#: src/slic3r/GUI/Tab.cpp:3667
+msgid "Machine limits are not set, therefore the print time estimate may not be accurate."
+msgstr "Limity maszynowe nie zostały ustawione, dlatego szacowany czas druku może odbiegać od rzeczywistości."
+
+#: src/slic3r/GUI/Tab.cpp:3660
+msgid "Machine limits will be emitted to G-code and used to estimate print time."
+msgstr "Limity maszynowe zostaną przekazane do G-code i użyte do obliczenia czasu drukowania."
+
+#: src/slic3r/GUI/Tab.cpp:3663
+msgid "Machine limits will NOT be emitted to G-code, however they will be used to estimate print time, which may therefore not be accurate as the printer may apply a different set of machine limits."
+msgstr "Limity maszynowe NIE będą przekazywane do G-code, jednak zostaną użyte do obliczenia czasu drukowania, który może okazać się niedokładny, ponieważ drukarka może zastosować inne."
+
+#: src/slic3r/GUI/Plater.cpp:172
msgid "Manifold"
msgstr "Model zamknięty"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56
msgid "Manual editing"
msgstr "Edycja ręczna"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:180
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:214
msgid "Masked SLA file exported to %1%"
msgstr "Maskowany plik SLA wyeksportowany do %1%"
-#: src/slic3r/GUI/MainFrame.cpp:752
+#: src/slic3r/GUI/MainFrame.cpp:1451
msgid "Mate&rial Settings Tab"
-msgstr "Ustawienia Mate&riału"
+msgstr "Ustawienia mate&riału"
-#: src/slic3r/GUI/Tab.cpp:3478 src/slic3r/GUI/Tab.cpp:3480
+#: src/slic3r/GUI/Tab.cpp:3894 src/slic3r/GUI/Tab.cpp:3896
msgid "Material"
msgstr "Materiał"
-#: src/slic3r/GUI/Tab.hpp:416
+#: src/slic3r/GUI/Tab.hpp:486
msgid "Material Settings"
-msgstr "Ustawienia Materiału"
+msgstr "Ustawienia materiału"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4304 src/slic3r/GUI/GLCanvas3D.cpp:4940
+msgid "Material Settings Tab"
+msgstr "Ustawienia materiału"
-#: src/slic3r/GUI/Plater.cpp:163
+#: src/slic3r/GUI/Plater.cpp:169
msgid "Materials"
msgstr "Materiały"
-#: src/libslic3r/PrintConfig.cpp:1217 src/libslic3r/PrintConfig.cpp:1226
+#: src/libslic3r/PrintConfig.cpp:1325 src/libslic3r/PrintConfig.cpp:1334
msgid "Max"
msgstr "Max"
-#: src/libslic3r/PrintConfig.cpp:2734
+#: src/libslic3r/PrintConfig.cpp:2898
msgid "Max bridge length"
msgstr "Maksymalna długość mostu"
-#: src/libslic3r/PrintConfig.cpp:2658
+#: src/libslic3r/PrintConfig.cpp:2812
msgid "Max bridges on a pillar"
msgstr "Maks. liczba mostków na słupku"
-#: src/libslic3r/PrintConfig.cpp:2822
+#: src/libslic3r/PrintConfig.cpp:2986
msgid "Max merge distance"
msgstr "Maksymalny dystans Å‚Ä…czenia"
-#: src/libslic3r/PrintConfig.cpp:2743
+#: src/libslic3r/PrintConfig.cpp:2907
msgid "Max pillar linking distance"
msgstr "Maksymalny dystans łączenia słupków"
@@ -4194,7 +4967,7 @@ msgstr "Maksymalny dystans łączenia słupków"
msgid "Max print height"
msgstr "Maksymalna wysokość wydruku"
-#: src/libslic3r/PrintConfig.cpp:1237
+#: src/libslic3r/PrintConfig.cpp:1345
msgid "Max print speed"
msgstr "Maksymalna prędkość druku"
@@ -4202,171 +4975,193 @@ msgstr "Maksymalna prędkość druku"
msgid "max PrusaSlicer version"
msgstr "max wersja PrusaSlicer"
-#: src/libslic3r/PrintConfig.cpp:1268
+#: src/libslic3r/PrintConfig.cpp:1376
msgid "Max volumetric slope negative"
msgstr "Maksymalny negatywny kÄ…t zwisu"
-#: src/libslic3r/PrintConfig.cpp:1257
+#: src/libslic3r/PrintConfig.cpp:1365
msgid "Max volumetric slope positive"
-msgstr "Maksymalny objętościowo kąt pozytywny"
+msgstr "Pozytywna krzywa natężenia przepływu"
-#: src/libslic3r/PrintConfig.cpp:597 src/libslic3r/PrintConfig.cpp:1247
+#: src/libslic3r/PrintConfig.cpp:633 src/libslic3r/PrintConfig.cpp:1355
msgid "Max volumetric speed"
msgstr "Maksymalny przepływ"
-#: src/libslic3r/PrintConfig.cpp:2268
+#: src/libslic3r/PrintConfig.cpp:2411
msgid "Maximal bridging distance"
msgstr "Maksymalna odległość drukowania mostów"
-#: src/libslic3r/PrintConfig.cpp:2269
+#: src/libslic3r/PrintConfig.cpp:2412
msgid "Maximal distance between supports on sparse infill sections."
msgstr "Minimalny odstęp pomiędzy podporami w sekcjach rzadkiego wypełnienia."
-#: src/libslic3r/PrintConfig.cpp:1145
+#: src/libslic3r/PrintConfig.cpp:1253
msgid "Maximum acceleration E"
msgstr "Maksymalne przyspieszenie E"
-#: src/libslic3r/PrintConfig.cpp:1151
+#: src/libslic3r/PrintConfig.cpp:1259
msgid "Maximum acceleration of the E axis"
msgstr "Maksymalne przyspieszenie osi E (ekstrudera)"
-#: src/libslic3r/PrintConfig.cpp:1148
+#: src/libslic3r/PrintConfig.cpp:1256
msgid "Maximum acceleration of the X axis"
msgstr "Maksymalne przyspieszenie osi X"
-#: src/libslic3r/PrintConfig.cpp:1149
+#: src/libslic3r/PrintConfig.cpp:1257
msgid "Maximum acceleration of the Y axis"
msgstr "Maksymalne przyspieszenie osi Y"
-#: src/libslic3r/PrintConfig.cpp:1150
+#: src/libslic3r/PrintConfig.cpp:1258
msgid "Maximum acceleration of the Z axis"
msgstr "Maksymalne przyspieszenie osi Z"
-#: src/libslic3r/PrintConfig.cpp:1198
+#: src/libslic3r/PrintConfig.cpp:1306
msgid "Maximum acceleration when extruding"
msgstr "Maksymalne przyspieszenie podczas ekstruzji"
-#: src/libslic3r/PrintConfig.cpp:1200
+#: src/libslic3r/PrintConfig.cpp:1308
msgid "Maximum acceleration when extruding (M204 S)"
msgstr "Maksymalne przyspieszenie podczas ekstrudowania (M204 S)"
-#: src/libslic3r/PrintConfig.cpp:1208
+#: src/libslic3r/PrintConfig.cpp:1316
msgid "Maximum acceleration when retracting"
msgstr "Maksymalne przyspieszenie podczas retrakcji"
-#: src/libslic3r/PrintConfig.cpp:1210
+#: src/libslic3r/PrintConfig.cpp:1318
msgid "Maximum acceleration when retracting (M204 T)"
msgstr "Maksymalne przyspieszenie podczas retrakcji (M204 T)"
-#: src/libslic3r/PrintConfig.cpp:1142
+#: src/libslic3r/PrintConfig.cpp:1250
msgid "Maximum acceleration X"
msgstr "Maksymalne przyspieszenie X"
-#: src/libslic3r/PrintConfig.cpp:1143
+#: src/libslic3r/PrintConfig.cpp:1251
msgid "Maximum acceleration Y"
msgstr "Maksymalne przyspieszenie Y"
-#: src/libslic3r/PrintConfig.cpp:1144
+#: src/libslic3r/PrintConfig.cpp:1252
msgid "Maximum acceleration Z"
msgstr "Maksymalne przyspieszenie Z"
-#: src/slic3r/GUI/Tab.cpp:2222
+#: src/slic3r/GUI/Tab.cpp:2391
msgid "Maximum accelerations"
msgstr "Maksymalne przyspieszenia"
-#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2534
+#: src/libslic3r/PrintConfig.cpp:2676 src/libslic3r/PrintConfig.cpp:2677
msgid "Maximum exposure time"
msgstr "Maksymalny czas naświetlania"
-#: src/libslic3r/PrintConfig.cpp:1128
+#: src/libslic3r/PrintConfig.cpp:1236
msgid "Maximum feedrate E"
msgstr "Maksymalny posuw E"
-#: src/libslic3r/PrintConfig.cpp:1134
+#: src/libslic3r/PrintConfig.cpp:1242
msgid "Maximum feedrate of the E axis"
msgstr "Maksymalny posuw (prędkość ruchu) osi E (ekstrudera)"
-#: src/libslic3r/PrintConfig.cpp:1131
+#: src/libslic3r/PrintConfig.cpp:1239
msgid "Maximum feedrate of the X axis"
msgstr "Maksymalny posuw (prędkość ruchu) osi X"
-#: src/libslic3r/PrintConfig.cpp:1132
+#: src/libslic3r/PrintConfig.cpp:1240
msgid "Maximum feedrate of the Y axis"
msgstr "Maksymalny posuw (prędkość ruchu) osi Y"
-#: src/libslic3r/PrintConfig.cpp:1133
+#: src/libslic3r/PrintConfig.cpp:1241
msgid "Maximum feedrate of the Z axis"
msgstr "Maksymalny posuw (prędkość ruchu) osi Z"
-#: src/libslic3r/PrintConfig.cpp:1125
+#: src/libslic3r/PrintConfig.cpp:1233
msgid "Maximum feedrate X"
msgstr "Maksymalny posuw osi X"
-#: src/libslic3r/PrintConfig.cpp:1126
+#: src/libslic3r/PrintConfig.cpp:1234
msgid "Maximum feedrate Y"
msgstr "Maksymalny posuw Y"
-#: src/libslic3r/PrintConfig.cpp:1127
+#: src/libslic3r/PrintConfig.cpp:1235
msgid "Maximum feedrate Z"
msgstr "Maksymalny posuw Z"
-#: src/slic3r/GUI/Tab.cpp:2217
+#: src/slic3r/GUI/Tab.cpp:2386
msgid "Maximum feedrates"
msgstr "Maksymalne prędkości posuwu"
-#: src/libslic3r/PrintConfig.cpp:2556 src/libslic3r/PrintConfig.cpp:2557
+#: src/libslic3r/PrintConfig.cpp:2699 src/libslic3r/PrintConfig.cpp:2700
msgid "Maximum initial exposure time"
msgstr "Maksymalny początkowy czas naświetlania"
-#: src/libslic3r/PrintConfig.cpp:1162
+#: src/libslic3r/PrintConfig.cpp:1270
msgid "Maximum jerk E"
msgstr "Maksymalny jerk E"
-#: src/libslic3r/PrintConfig.cpp:1168
+#: src/libslic3r/PrintConfig.cpp:1276
msgid "Maximum jerk of the E axis"
msgstr "Maksymalny jerk dla osi E (ekstrudera)"
-#: src/libslic3r/PrintConfig.cpp:1165
+#: src/libslic3r/PrintConfig.cpp:1273
msgid "Maximum jerk of the X axis"
msgstr "Maksymalny jerk osi X"
-#: src/libslic3r/PrintConfig.cpp:1166
+#: src/libslic3r/PrintConfig.cpp:1274
msgid "Maximum jerk of the Y axis"
msgstr "Maksymalny jerk osi Y"
-#: src/libslic3r/PrintConfig.cpp:1167
+#: src/libslic3r/PrintConfig.cpp:1275
msgid "Maximum jerk of the Z axis"
msgstr "Maksymalny jerk dla osi Z"
-#: src/libslic3r/PrintConfig.cpp:1159
+#: src/libslic3r/PrintConfig.cpp:1267
msgid "Maximum jerk X"
msgstr "Maksymalny jerk X"
-#: src/libslic3r/PrintConfig.cpp:1160
+#: src/libslic3r/PrintConfig.cpp:1268
msgid "Maximum jerk Y"
msgstr "Maksymalny jerk Y"
-#: src/libslic3r/PrintConfig.cpp:1161
+#: src/libslic3r/PrintConfig.cpp:1269
msgid "Maximum jerk Z"
msgstr "Maksymalny jerk Z"
-#: src/libslic3r/PrintConfig.cpp:2660
+#: src/libslic3r/PrintConfig.cpp:1095
+msgid "Maximum length of the infill anchor"
+msgstr "Maksymalna długość kotwiczenia wypełnienia"
+
+#: src/libslic3r/PrintConfig.cpp:2814
msgid "Maximum number of bridges that can be placed on a pillar. Bridges hold support point pinheads and connect to pillars as small branches."
msgstr "Maksymalna liczba mostków, która zostanie umieszczona na słupku podpory. Mostki wspierają łączniki podpór i łączą słupki podpór."
-#: src/libslic3r/PrintConfig.cpp:598
+#: src/libslic3r/PrintConfig.cpp:634
msgid "Maximum volumetric speed allowed for this filament. Limits the maximum volumetric speed of a print to the minimum of print and filament volumetric speed. Set to zero for no limit."
-msgstr "Maksymalna prędkość objętościowa dla tego filamentu. Ogranicza maksymalną prędkość objętościową do minimum objętościowej prędkości druku i filamentu. Ustaw zero aby usunąć ograniczenie."
+msgstr "Maksymalne objętościowe natężenie przepływu dla tego filamentu. Ogranicza maksymalne natężenie przepływu do minimum objętościowej prędkości druku i filamentu. Ustaw zero aby usunąć ograniczenie."
-#: src/libslic3r/PrintConfig.cpp:3442
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1868
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1876
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2569 src/libslic3r/PrintConfig.cpp:3641
msgid "Merge"
msgstr "ÅÄ…czenie"
-#: src/libslic3r/PrintConfig.cpp:2683
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2660
+msgid "Merge all parts to the one single object"
+msgstr "Scal wszystkie części w jeden model"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1868
+msgid "Merge objects to the one multipart object"
+msgstr "Scal modele w jeden model wieloczęściowy"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1876
+msgid "Merge objects to the one single object"
+msgstr "Scal modele w jeden model pojedynczy"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2576
+msgid "Merged"
+msgstr "Scalono"
+
+#: src/libslic3r/PrintConfig.cpp:2847
msgid "Merging bridges or pillars into another pillars can increase the radius. Zero means no increase, one means full increase."
msgstr "ÅÄ…czenie mostów lub sÅ‚upków podpór z innymi może zwiÄ™kszyć ich promieÅ„. 0 oznacza brak zmiany, 1 oznacza zmianÄ™ w caÅ‚oÅ›ci."
-#: src/libslic3r/SLAPrintSteps.cpp:64
+#: src/libslic3r/SLAPrintSteps.cpp:65
msgid "Merging slices and calculating statistics"
msgstr "ÅÄ…czenie cięć i obliczanie statystyk"
@@ -4374,15 +5169,15 @@ msgstr "ÅÄ…czenie cięć i obliczanie statystyk"
msgid "Mesh repair failed."
msgstr "Niepowodzenie naprawy siatki."
-#: src/slic3r/GUI/DoubleSlider.cpp:1635
+#: src/slic3r/GUI/DoubleSlider.cpp:1831
msgid "Message for pause print on current layer (%1% mm)."
msgstr "Komenda pauzujÄ…ca wydruk na danej warstwie (%1% mm)."
-#: src/libslic3r/PrintConfig.cpp:1280 src/libslic3r/PrintConfig.cpp:1289
+#: src/libslic3r/PrintConfig.cpp:1388 src/libslic3r/PrintConfig.cpp:1397
msgid "Min"
msgstr "Min"
-#: src/libslic3r/PrintConfig.cpp:1298
+#: src/libslic3r/PrintConfig.cpp:1406
msgid "Min print speed"
msgstr "Minimalna prędkość druku"
@@ -4390,232 +5185,241 @@ msgstr "Minimalna prędkość druku"
msgid "min PrusaSlicer version"
msgstr "min wersja PrusaSlicer"
-#: src/libslic3r/PrintConfig.cpp:2772
+#: src/libslic3r/PrintConfig.cpp:2936
msgid "Minimal distance of the support points"
msgstr "Minimalne rozmieszczenie punktów podpór"
-#: src/libslic3r/PrintConfig.cpp:1306
+#: src/libslic3r/PrintConfig.cpp:1414
msgid "Minimal filament extrusion length"
msgstr "Minimalna długość ekstruzji"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53
msgid "Minimal points distance"
msgstr "Minimalny dystans pomiędzy punktami"
-#: src/libslic3r/PrintConfig.cpp:667
+#: src/libslic3r/PrintConfig.cpp:703
msgid "Minimal purge on wipe tower"
msgstr "Minimalna objętość czyszczenia"
-#: src/libslic3r/PrintConfig.cpp:187
+#: src/libslic3r/PrintConfig.cpp:221
msgid "Minimum bottom shell thickness"
msgstr "Minimalna grubość dolnej powłoki"
-#: src/slic3r/GUI/PresetHints.cpp:339
+#: src/slic3r/GUI/PresetHints.cpp:337
msgid "Minimum bottom shell thickness is %1% mm."
msgstr "Minimalna grubość dolnej powłoki to %1% mm."
-#: src/libslic3r/PrintConfig.cpp:1512
+#: src/libslic3r/PrintConfig.cpp:1620
msgid "Minimum detail resolution, used to simplify the input file for speeding up the slicing job and reducing memory usage. High-resolution models often carry more detail than printers can render. Set to zero to disable any simplification and use full resolution from input."
-msgstr "Minimalna rozdzielczość, używana do uproszczenia modelu wejściowego, co prowadzi do przyspieszenia procesu cięcia. Modele w wysokiej rozdzielczości mogą zawierać więcej szczegółów niż drukarka jest w stanie przetworzyć. Ustaw zero aby wyłączyć upraszczanie i użyć pełnej rozdzielczości pliku wejściowego."
+msgstr "Minimalna rozdzielczość, używana do uproszczenia modelu wejściowego, co prowadzi do przyspieszenia procesu cięcia. Modele w wysokiej rozdzielczości mogą zawierać więcej szczegółów niż drukarka jest w stanie przetworzyć. Ustaw zero, aby wyłączyć upraszczanie i użyć pełnej rozdzielczości pliku wejściowego."
-#: src/libslic3r/PrintConfig.cpp:2525 src/libslic3r/PrintConfig.cpp:2526
+#: src/libslic3r/PrintConfig.cpp:2668 src/libslic3r/PrintConfig.cpp:2669
msgid "Minimum exposure time"
msgstr "Minimalny czas naświetlania"
-#: src/libslic3r/PrintConfig.cpp:1178
+#: src/libslic3r/PrintConfig.cpp:1286
msgid "Minimum feedrate when extruding"
msgstr "Minimalna prędkość posuwu z ekstruzją"
-#: src/libslic3r/PrintConfig.cpp:1180
+#: src/libslic3r/PrintConfig.cpp:1288
msgid "Minimum feedrate when extruding (M205 S)"
msgstr "Minimalna prędkość posuwu z ekstruzją (M205 S)"
-#: src/slic3r/GUI/Tab.cpp:2234
+#: src/slic3r/GUI/Tab.cpp:2403
msgid "Minimum feedrates"
msgstr "Minimalna prędkość posuwu"
-#: src/libslic3r/PrintConfig.cpp:2548 src/libslic3r/PrintConfig.cpp:2549
+#: src/libslic3r/PrintConfig.cpp:2691 src/libslic3r/PrintConfig.cpp:2692
msgid "Minimum initial exposure time"
msgstr "Minimalny początkowy czas naświetlania"
-#: src/slic3r/GUI/Tab.cpp:1069
+#: src/slic3r/GUI/Tab.cpp:1391
msgid "Minimum shell thickness"
msgstr "Minimalna grubość powłoki"
-#: src/libslic3r/PrintConfig.cpp:1787 src/libslic3r/PrintConfig.cpp:1788
+#: src/libslic3r/PrintConfig.cpp:1902 src/libslic3r/PrintConfig.cpp:1903
msgid "Minimum thickness of a top / bottom shell"
msgstr "Minimalna grubość górnej/dolnej powłoki"
-#: src/libslic3r/PrintConfig.cpp:2146
+#: src/libslic3r/PrintConfig.cpp:2289
msgid "Minimum top shell thickness"
msgstr "Minimalna grubość górnej powłoki"
-#: src/slic3r/GUI/PresetHints.cpp:320
+#: src/slic3r/GUI/PresetHints.cpp:318
msgid "Minimum top shell thickness is %1% mm."
msgstr "Minimalna grubość górnej powłoki to %1% mm."
-#: src/libslic3r/PrintConfig.cpp:1522
+#: src/libslic3r/PrintConfig.cpp:1630
msgid "Minimum travel after retraction"
msgstr "Minimalny ruch jałowy po retrakcji"
-#: src/libslic3r/PrintConfig.cpp:1188
+#: src/libslic3r/PrintConfig.cpp:1296
msgid "Minimum travel feedrate"
msgstr "Minimalna prędkość posuwu ruchu jałowego"
-#: src/libslic3r/PrintConfig.cpp:1190
+#: src/libslic3r/PrintConfig.cpp:1298
msgid "Minimum travel feedrate (M205 T)"
msgstr "Minimalna prędkość posuwu ruchu jałowego (M205 T)"
-#: src/libslic3r/PrintConfig.cpp:2917
+#: src/libslic3r/PrintConfig.cpp:3081
msgid "Minimum wall thickness of a hollowed model."
msgstr "Minimalna grubość ścianki drążonego modelu."
-#: src/libslic3r/PrintConfig.cpp:2449
+#: src/libslic3r/PrintConfig.cpp:2592
msgid "Minimum width of features to maintain when doing elephant foot compensation."
msgstr "Minimalna szerokość detali do zachowania podczas kompensacji stopy słonia."
-#: src/slic3r/GUI/Plater.cpp:4002
+#: src/slic3r/GUI/Plater.cpp:3922
msgid "Mirror"
msgstr "Lustrzane"
-#: src/libslic3r/PrintConfig.cpp:2379
+#: src/libslic3r/PrintConfig.cpp:2522
msgid "Mirror horizontally"
msgstr "Odbij w poziomie"
-#: src/slic3r/GUI/GLCanvas3D.cpp:2053
+#: src/slic3r/GUI/GLCanvas3D.cpp:2226
msgid "Mirror Object"
msgstr "Odbicie Lustrzane"
-#: src/slic3r/GUI/Plater.cpp:4002
+#: src/slic3r/GUI/Plater.cpp:3922
msgid "Mirror the selected object"
msgstr "Odbicie lustrzane wybranego modelu"
-#: src/slic3r/GUI/Plater.cpp:3995
+#: src/slic3r/GUI/Plater.cpp:3915
msgid "Mirror the selected object along the X axis"
msgstr "Odbicie lustrzane wybranego modelu w osi X"
-#: src/slic3r/GUI/Plater.cpp:3997
+#: src/slic3r/GUI/Plater.cpp:3917
msgid "Mirror the selected object along the Y axis"
msgstr "Odbicie lustrzane wybranego modelu w osi Y"
-#: src/slic3r/GUI/Plater.cpp:3999
+#: src/slic3r/GUI/Plater.cpp:3919
msgid "Mirror the selected object along the Z axis"
msgstr "Odbicie lustrzane wybranego modelu w osi Z"
-#: src/libslic3r/PrintConfig.cpp:2386
+#: src/libslic3r/PrintConfig.cpp:2529
msgid "Mirror vertically"
-msgstr "Odbij w poziomie"
+msgstr "Odbij w pionie"
-#: src/slic3r/Utils/AstroBox.cpp:68 src/slic3r/Utils/OctoPrint.cpp:68
-#, c-format
+#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:68
+#, possible-c-format
msgid "Mismatched type of print host: %s"
msgstr "NiepasujÄ…cy typ serwera wydruku: %s"
-#: src/libslic3r/ExtrusionEntity.cpp:323
+#: src/libslic3r/ExtrusionEntity.cpp:328 src/libslic3r/ExtrusionEntity.cpp:364
msgid "Mixed"
msgstr "Mieszane"
-#: src/libslic3r/PrintConfig.cpp:2491
+#: src/libslic3r/PrintConfig.cpp:2634
msgid "ml"
msgstr "ml"
-#: src/slic3r/GUI/BedShapeDialog.cpp:92 src/slic3r/GUI/ConfigWizard.cpp:218
-#: src/slic3r/GUI/ConfigWizard.cpp:970 src/slic3r/GUI/ConfigWizard.cpp:984
+#: src/slic3r/GUI/BedShapeDialog.cpp:129 src/slic3r/GUI/ConfigWizard.cpp:236
+#: src/slic3r/GUI/ConfigWizard.cpp:1336 src/slic3r/GUI/ConfigWizard.cpp:1350
#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:87
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:135
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:333
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:94
+#: src/slic3r/GUI/GCodeViewer.cpp:2183 src/slic3r/GUI/GCodeViewer.cpp:2189
+#: src/slic3r/GUI/GCodeViewer.cpp:2197 src/slic3r/GUI/GUI_ObjectLayers.cpp:145
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:96
#: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:75
-#: src/libslic3r/PrintConfig.cpp:82 src/libslic3r/PrintConfig.cpp:91
-#: src/libslic3r/PrintConfig.cpp:122 src/libslic3r/PrintConfig.cpp:188
-#: src/libslic3r/PrintConfig.cpp:246 src/libslic3r/PrintConfig.cpp:321
-#: src/libslic3r/PrintConfig.cpp:329 src/libslic3r/PrintConfig.cpp:379
-#: src/libslic3r/PrintConfig.cpp:505 src/libslic3r/PrintConfig.cpp:516
-#: src/libslic3r/PrintConfig.cpp:534 src/libslic3r/PrintConfig.cpp:712
-#: src/libslic3r/PrintConfig.cpp:1231 src/libslic3r/PrintConfig.cpp:1292
-#: src/libslic3r/PrintConfig.cpp:1310 src/libslic3r/PrintConfig.cpp:1328
-#: src/libslic3r/PrintConfig.cpp:1384 src/libslic3r/PrintConfig.cpp:1394
-#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1524
-#: src/libslic3r/PrintConfig.cpp:1565 src/libslic3r/PrintConfig.cpp:1573
-#: src/libslic3r/PrintConfig.cpp:1583 src/libslic3r/PrintConfig.cpp:1591
-#: src/libslic3r/PrintConfig.cpp:1599 src/libslic3r/PrintConfig.cpp:1682
-#: src/libslic3r/PrintConfig.cpp:1914 src/libslic3r/PrintConfig.cpp:1985
-#: src/libslic3r/PrintConfig.cpp:2019 src/libslic3r/PrintConfig.cpp:2147
-#: src/libslic3r/PrintConfig.cpp:2226 src/libslic3r/PrintConfig.cpp:2233
-#: src/libslic3r/PrintConfig.cpp:2240 src/libslic3r/PrintConfig.cpp:2270
-#: src/libslic3r/PrintConfig.cpp:2280 src/libslic3r/PrintConfig.cpp:2290
-#: src/libslic3r/PrintConfig.cpp:2450 src/libslic3r/PrintConfig.cpp:2484
-#: src/libslic3r/PrintConfig.cpp:2623 src/libslic3r/PrintConfig.cpp:2632
-#: src/libslic3r/PrintConfig.cpp:2641 src/libslic3r/PrintConfig.cpp:2651
-#: src/libslic3r/PrintConfig.cpp:2695 src/libslic3r/PrintConfig.cpp:2705
-#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2737
-#: src/libslic3r/PrintConfig.cpp:2747 src/libslic3r/PrintConfig.cpp:2757
-#: src/libslic3r/PrintConfig.cpp:2775 src/libslic3r/PrintConfig.cpp:2790
-#: src/libslic3r/PrintConfig.cpp:2804 src/libslic3r/PrintConfig.cpp:2815
-#: src/libslic3r/PrintConfig.cpp:2828 src/libslic3r/PrintConfig.cpp:2873
-#: src/libslic3r/PrintConfig.cpp:2883 src/libslic3r/PrintConfig.cpp:2892
-#: src/libslic3r/PrintConfig.cpp:2902 src/libslic3r/PrintConfig.cpp:2918
-#: src/libslic3r/PrintConfig.cpp:2942
+#: src/libslic3r/PrintConfig.cpp:82 src/libslic3r/PrintConfig.cpp:93
+#: src/libslic3r/PrintConfig.cpp:124 src/libslic3r/PrintConfig.cpp:222
+#: src/libslic3r/PrintConfig.cpp:280 src/libslic3r/PrintConfig.cpp:355
+#: src/libslic3r/PrintConfig.cpp:363 src/libslic3r/PrintConfig.cpp:413
+#: src/libslic3r/PrintConfig.cpp:541 src/libslic3r/PrintConfig.cpp:552
+#: src/libslic3r/PrintConfig.cpp:570 src/libslic3r/PrintConfig.cpp:748
+#: src/libslic3r/PrintConfig.cpp:1158 src/libslic3r/PrintConfig.cpp:1339
+#: src/libslic3r/PrintConfig.cpp:1400 src/libslic3r/PrintConfig.cpp:1418
+#: src/libslic3r/PrintConfig.cpp:1436 src/libslic3r/PrintConfig.cpp:1492
+#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1624
+#: src/libslic3r/PrintConfig.cpp:1632 src/libslic3r/PrintConfig.cpp:1673
+#: src/libslic3r/PrintConfig.cpp:1681 src/libslic3r/PrintConfig.cpp:1691
+#: src/libslic3r/PrintConfig.cpp:1699 src/libslic3r/PrintConfig.cpp:1707
+#: src/libslic3r/PrintConfig.cpp:1790 src/libslic3r/PrintConfig.cpp:2056
+#: src/libslic3r/PrintConfig.cpp:2127 src/libslic3r/PrintConfig.cpp:2161
+#: src/libslic3r/PrintConfig.cpp:2290 src/libslic3r/PrintConfig.cpp:2369
+#: src/libslic3r/PrintConfig.cpp:2376 src/libslic3r/PrintConfig.cpp:2383
+#: src/libslic3r/PrintConfig.cpp:2413 src/libslic3r/PrintConfig.cpp:2423
+#: src/libslic3r/PrintConfig.cpp:2433 src/libslic3r/PrintConfig.cpp:2593
+#: src/libslic3r/PrintConfig.cpp:2627 src/libslic3r/PrintConfig.cpp:2766
+#: src/libslic3r/PrintConfig.cpp:2775 src/libslic3r/PrintConfig.cpp:2784
+#: src/libslic3r/PrintConfig.cpp:2794 src/libslic3r/PrintConfig.cpp:2859
+#: src/libslic3r/PrintConfig.cpp:2869 src/libslic3r/PrintConfig.cpp:2881
+#: src/libslic3r/PrintConfig.cpp:2901 src/libslic3r/PrintConfig.cpp:2911
+#: src/libslic3r/PrintConfig.cpp:2921 src/libslic3r/PrintConfig.cpp:2939
+#: src/libslic3r/PrintConfig.cpp:2954 src/libslic3r/PrintConfig.cpp:2968
+#: src/libslic3r/PrintConfig.cpp:2979 src/libslic3r/PrintConfig.cpp:2992
+#: src/libslic3r/PrintConfig.cpp:3037 src/libslic3r/PrintConfig.cpp:3047
+#: src/libslic3r/PrintConfig.cpp:3056 src/libslic3r/PrintConfig.cpp:3066
+#: src/libslic3r/PrintConfig.cpp:3082 src/libslic3r/PrintConfig.cpp:3106
msgid "mm"
msgstr "mm"
-#: src/libslic3r/PrintConfig.cpp:1547 src/libslic3r/PrintConfig.cpp:1556
+#: src/libslic3r/PrintConfig.cpp:1655 src/libslic3r/PrintConfig.cpp:1664
msgid "mm (zero to disable)"
-msgstr "mm (zero aby wyłączyć)"
-
-#: src/libslic3r/PrintConfig.cpp:451 src/libslic3r/PrintConfig.cpp:560
-#: src/libslic3r/PrintConfig.cpp:882 src/libslic3r/PrintConfig.cpp:895
-#: src/libslic3r/PrintConfig.cpp:1015 src/libslic3r/PrintConfig.cpp:1041
-#: src/libslic3r/PrintConfig.cpp:1423 src/libslic3r/PrintConfig.cpp:1761
-#: src/libslic3r/PrintConfig.cpp:1883 src/libslic3r/PrintConfig.cpp:1951
-#: src/libslic3r/PrintConfig.cpp:2111
+msgstr "mm (zero, aby wyłączyć)"
+
+#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:596
+#: src/libslic3r/PrintConfig.cpp:924 src/libslic3r/PrintConfig.cpp:937
+#: src/libslic3r/PrintConfig.cpp:1059 src/libslic3r/PrintConfig.cpp:1085
+#: src/libslic3r/PrintConfig.cpp:1531 src/libslic3r/PrintConfig.cpp:1876
+#: src/libslic3r/PrintConfig.cpp:2025 src/libslic3r/PrintConfig.cpp:2093
+#: src/libslic3r/PrintConfig.cpp:2254
msgid "mm or %"
msgstr "mm lub %"
-#: src/libslic3r/PrintConfig.cpp:237 src/libslic3r/PrintConfig.cpp:609
-#: src/libslic3r/PrintConfig.cpp:617 src/libslic3r/PrintConfig.cpp:626
-#: src/libslic3r/PrintConfig.cpp:634 src/libslic3r/PrintConfig.cpp:661
-#: src/libslic3r/PrintConfig.cpp:680 src/libslic3r/PrintConfig.cpp:922
-#: src/libslic3r/PrintConfig.cpp:1050 src/libslic3r/PrintConfig.cpp:1135
-#: src/libslic3r/PrintConfig.cpp:1169 src/libslic3r/PrintConfig.cpp:1181
-#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:1241
-#: src/libslic3r/PrintConfig.cpp:1300 src/libslic3r/PrintConfig.cpp:1433
-#: src/libslic3r/PrintConfig.cpp:1607 src/libslic3r/PrintConfig.cpp:1616
-#: src/libslic3r/PrintConfig.cpp:2028 src/libslic3r/PrintConfig.cpp:2154
+#: src/libslic3r/PrintConfig.cpp:193
+msgid "mm or % (zero to disable)"
+msgstr "mm lub % (zero, aby wyłączyć)"
+
+#: src/libslic3r/PrintConfig.cpp:271 src/libslic3r/PrintConfig.cpp:645
+#: src/libslic3r/PrintConfig.cpp:653 src/libslic3r/PrintConfig.cpp:662
+#: src/libslic3r/PrintConfig.cpp:670 src/libslic3r/PrintConfig.cpp:697
+#: src/libslic3r/PrintConfig.cpp:716 src/libslic3r/PrintConfig.cpp:966
+#: src/libslic3r/PrintConfig.cpp:1094 src/libslic3r/PrintConfig.cpp:1167
+#: src/libslic3r/PrintConfig.cpp:1243 src/libslic3r/PrintConfig.cpp:1277
+#: src/libslic3r/PrintConfig.cpp:1289 src/libslic3r/PrintConfig.cpp:1299
+#: src/libslic3r/PrintConfig.cpp:1349 src/libslic3r/PrintConfig.cpp:1408
+#: src/libslic3r/PrintConfig.cpp:1541 src/libslic3r/PrintConfig.cpp:1715
+#: src/libslic3r/PrintConfig.cpp:1724 src/libslic3r/PrintConfig.cpp:2170
+#: src/libslic3r/PrintConfig.cpp:2297
msgid "mm/s"
msgstr "mm/s"
-#: src/libslic3r/PrintConfig.cpp:462 src/libslic3r/PrintConfig.cpp:904
-#: src/libslic3r/PrintConfig.cpp:1720 src/libslic3r/PrintConfig.cpp:1772
-#: src/libslic3r/PrintConfig.cpp:1995 src/libslic3r/PrintConfig.cpp:2124
+#: src/libslic3r/PrintConfig.cpp:498 src/libslic3r/PrintConfig.cpp:946
+#: src/libslic3r/PrintConfig.cpp:1835 src/libslic3r/PrintConfig.cpp:1887
+#: src/libslic3r/PrintConfig.cpp:2137 src/libslic3r/PrintConfig.cpp:2267
msgid "mm/s or %"
msgstr "mm/s lub %"
-#: src/libslic3r/PrintConfig.cpp:196 src/libslic3r/PrintConfig.cpp:339
-#: src/libslic3r/PrintConfig.cpp:862 src/libslic3r/PrintConfig.cpp:984
-#: src/libslic3r/PrintConfig.cpp:1152 src/libslic3r/PrintConfig.cpp:1201
-#: src/libslic3r/PrintConfig.cpp:1211 src/libslic3r/PrintConfig.cpp:1403
+#: src/libslic3r/PrintConfig.cpp:230 src/libslic3r/PrintConfig.cpp:373
+#: src/libslic3r/PrintConfig.cpp:902 src/libslic3r/PrintConfig.cpp:1028
+#: src/libslic3r/PrintConfig.cpp:1260 src/libslic3r/PrintConfig.cpp:1309
+#: src/libslic3r/PrintConfig.cpp:1319 src/libslic3r/PrintConfig.cpp:1511
msgid "mm/s²"
msgstr "mm/s²"
-#: src/libslic3r/PrintConfig.cpp:1730
+#: src/libslic3r/PrintConfig.cpp:1845
msgid "mm²"
msgstr "mm²"
-#: src/libslic3r/PrintConfig.cpp:672
+#: src/libslic3r/PrintConfig.cpp:708
msgid "mm³"
msgstr "mm³"
-#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:601
-#: src/libslic3r/PrintConfig.cpp:1250
+#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:637
+#: src/libslic3r/PrintConfig.cpp:1358
msgid "mm³/s"
msgstr "mm³/s"
-#: src/libslic3r/PrintConfig.cpp:1262 src/libslic3r/PrintConfig.cpp:1273
+#: src/libslic3r/PrintConfig.cpp:1370 src/libslic3r/PrintConfig.cpp:1381
msgid "mm³/s²"
msgstr "mm³/s²"
-#: src/slic3r/GUI/GUI_App.cpp:820
+#: src/slic3r/GUI/GUI_App.cpp:1512
msgid "Mode"
msgstr "&Tryb"
@@ -4623,7 +5427,7 @@ msgstr "&Tryb"
msgid "model"
msgstr "model"
-#: src/slic3r/GUI/BedShapeDialog.cpp:251
+#: src/slic3r/GUI/BedShapeDialog.cpp:395
msgid "Model"
msgstr "Model"
@@ -4652,150 +5456,192 @@ msgstr "Ukończono naprawę modelu"
msgid "Model repaired successfully"
msgstr "Model naprawiono pomyślnie"
-#: src/slic3r/GUI/Tab.cpp:979
+#: src/slic3r/GUI/GUI_App.cpp:1506 src/slic3r/GUI/wxExtensions.cpp:675
+msgctxt "Mode"
+msgid "Advanced"
+msgstr "Zaawansowany"
+
+#: src/slic3r/GUI/Tab.cpp:1241
msgid "Modifications to the current profile will be saved."
msgstr "Modyfikacje zostanÄ… zapisane na obecnym profilu."
-#: src/slic3r/GUI/Preset.cpp:247
+#: src/slic3r/GUI/GUI_App.cpp:1425
msgid "modified"
msgstr "zmodyfikowano"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
msgid "Modifier"
msgstr "Modyfikator"
-#: src/slic3r/GUI/Tab.cpp:1161
+#: src/slic3r/GUI/Tab.cpp:1491
msgid "Modifiers"
msgstr "Modyfikatory"
-#: src/libslic3r/PrintConfig.cpp:2512
+#: src/libslic3r/PrintConfig.cpp:2655
msgid "money/bottle"
msgstr "pieniędzy/butelkę"
-#: src/libslic3r/PrintConfig.cpp:762
+#: src/libslic3r/PrintConfig.cpp:798
msgid "money/kg"
msgstr "pieniędzy/kg"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372
+#: src/libslic3r/PrintConfig.cpp:461
+msgid "Monotonic"
+msgstr "Monotoniczny"
+
+#: src/slic3r/GUI/NotificationManager.cpp:305
+#: src/slic3r/GUI/NotificationManager.cpp:315
+msgid "More"
+msgstr "Więcej"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219
msgid "Mouse wheel"
msgstr "Kółko myszy"
-#: src/slic3r/GUI/GLCanvas3D.cpp:261
+#: src/slic3r/GUI/GLCanvas3D.cpp:249
msgid "Mouse wheel:"
msgstr "Kółko myszy:"
-#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:64
msgid "Move"
msgstr "Przesuń"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1372
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:255
+msgid "Move active slider thumb Left"
+msgstr "Przesuń aktywny punkt suwaka w lewo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:256
+msgid "Move active slider thumb Right"
+msgstr "Przesuń aktywny punkt suwaka w prawo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:220
+msgid "Move active thumb Down"
+msgstr "Przesuń aktywny punkt w dół"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:241
+msgid "Move active thumb Left"
+msgstr "Przesuń aktywny punkt w lewo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:242
+msgid "Move active thumb Right"
+msgstr "Przesuń aktywny punkt w prawo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+msgid "Move active thumb Up"
+msgstr "Przesuń aktywny punkt w górę"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219
msgid "Move clipping plane"
msgstr "Przesunięcie płaszczyzny przecinania"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
msgid "Move current slider thumb Down"
-msgstr "Przesuń suwak w dół"
+msgstr "Przesuń obecny punkt suwaka w dół"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:214
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
msgid "Move current slider thumb Up"
-msgstr "Przesuń suwak w górę"
+msgstr "Przesuń obecny punkt suwaka w górę"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1059
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:835
msgid "Move drainage hole"
msgstr "Przesuń otwór odpływowy"
-#: src/slic3r/GUI/GLCanvas3D.cpp:3505
+#: src/slic3r/GUI/GLCanvas3D.cpp:3810
msgid "Move Object"
msgstr "Przesuń Model"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212
msgid "Move point"
msgstr "Przesuń punkt"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:160
msgid "Move selection 10 mm in negative X direction"
msgstr "Przesuń zaznaczenie o -10 mm w osi X"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:159
msgid "Move selection 10 mm in negative Y direction"
msgstr "Przesuń zaznaczenie o -10 mm w osi Y"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:161
msgid "Move selection 10 mm in positive X direction"
msgstr "Przesuń zaznaczenie o +10 mm w osi X"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:158
msgid "Move selection 10 mm in positive Y direction"
msgstr "Przesuń zaznaczenie o +10 mm w osi Y"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1097
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:955
msgid "Move support point"
msgstr "PrzenieÅ› plik podpory"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
+#: src/slic3r/GUI/GCodeViewer.cpp:2492
+msgid "Movement"
+msgstr "Ruch"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
msgid "Movement in camera space"
msgstr "Ruch w przestrzeni widoku"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:162
msgid "Movement step set to 1 mm"
msgstr "Krok przesunięcia ustawiony na 1 mm"
-#: src/libslic3r/PrintConfig.cpp:2201
+#: src/libslic3r/PrintConfig.cpp:2344
msgid "Multi material printers may need to prime or purge extruders on tool changes. Extrude the excess material into the wipe tower."
msgstr "Drukarki pracujące z kilkoma filamentami na raz (multi-material) mogą wymagać czyszczenia głowicy przy zmianie filamentu. Nadmiar materiału jest wytłaczany w formie wieży czyszczącej."
-#: src/slic3r/GUI/Plater.cpp:2360 src/slic3r/GUI/Plater.cpp:2413
+#: src/slic3r/GUI/Plater.cpp:2322 src/slic3r/GUI/Plater.cpp:2375
msgid "Multi-part object detected"
msgstr "Wykryto obiekt wieloczęściowy"
#: src/slic3r/GUI/FirmwareDialog.cpp:419 src/slic3r/GUI/FirmwareDialog.cpp:454
-#, c-format
+#, possible-c-format
msgid "Multiple %s devices found. Please only connect one at a time for flashing."
msgstr "Wiele urządzeń %s znaleziono. Proszę zostawić tylko jedno podłączone podczas flashowania."
-#: src/slic3r/GUI/Tab.cpp:1179
+#: src/slic3r/GUI/Tab.cpp:1509
msgid "Multiple Extruders"
msgstr "Kilka ekstruderów"
-#: src/slic3r/GUI/Plater.cpp:2410
-msgid ""
-"Multiple objects were loaded for a multi-material printer.\n"
-"Instead of considering them as multiple objects, should I consider\n"
-"these files to represent a single object having multiple parts?"
-msgstr ""
-"Kilka obiektów zostało załadowanych dla drukarki typu multi-material.\n"
-"Traktować je jako jeden model zawierający kilka części?"
+#: src/slic3r/GUI/Plater.cpp:2372
+msgid "Multiple objects were loaded for a multi-material printer.\nInstead of considering them as multiple objects, should I consider\nthese files to represent a single object having multiple parts?"
+msgstr "Kilka obiektów zostało załadowanych dla drukarki typu multi-material.\nTraktować je jako jeden model zawierający kilka części?"
-#: src/libslic3r/PrintConfig.cpp:3439
+#: src/libslic3r/PrintConfig.cpp:3638
msgid "Multiply copies by creating a grid."
msgstr "Pomnóż ilość kopii przez stworzenie siatki."
-#: src/libslic3r/PrintConfig.cpp:3434
+#: src/libslic3r/PrintConfig.cpp:3633
msgid "Multiply copies by this factor."
msgstr "Pomnóż ilość kopii przez tę wartość."
-#: src/slic3r/GUI/Field.cpp:150 src/slic3r/GUI/OptionsGroup.cpp:580
+#: src/slic3r/GUI/Field.cpp:198 src/slic3r/GUI/OptionsGroup.cpp:715
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:874
msgid "N/A"
msgstr "N/D"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:270
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153
+#: src/slic3r/GUI/GUI_ObjectList.cpp:284
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:161
msgid "Name"
msgstr "Nazwa"
-#: src/libslic3r/PrintConfig.cpp:1488
+#: src/libslic3r/PrintConfig.cpp:114
+msgid "Name of the printer"
+msgstr "Nazwa drukarki"
+
+#: src/libslic3r/PrintConfig.cpp:1596
msgid "Name of the printer variant. For example, the printer variants may be differentiated by a nozzle diameter."
msgstr "Nazwa wersji drukarki. Możesz np. tworzyć warianty wg średnicy dyszy."
-#: src/libslic3r/PrintConfig.cpp:1482
+#: src/libslic3r/PrintConfig.cpp:1590
msgid "Name of the printer vendor."
msgstr "Nazwa dostawcy drukarki."
-#: src/libslic3r/PrintConfig.cpp:1058
+#: src/libslic3r/PrintConfig.cpp:1102
msgid "Name of the profile, from which this profile inherits."
msgstr "Nazwa profilu, z którego dziedziczy ten profil."
-#: src/libslic3r/PrintConfig.cpp:1630
+#: src/libslic3r/PrintConfig.cpp:1738
msgid "Nearest"
msgstr "Najbliższy"
@@ -4803,16 +5649,32 @@ msgstr "Najbliższy"
msgid "Network lookup"
msgstr "PodglÄ…d sieci"
-#: src/slic3r/GUI/Plater.cpp:2151
+#: src/slic3r/GUI/Preferences.cpp:430
+msgid "New layout, access via settings button in the top menu"
+msgstr "Nowy układ z dostępem przez przycisk ustawień w górnym menu"
+
+#: src/slic3r/GUI/Plater.cpp:2056
msgid "New Project"
msgstr "Nowy Projekt"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:112
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:105
msgid "New project, clear plater"
msgstr "Nowy projekt, wyczyść stół"
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:609
+msgid "New Value"
+msgstr "Nowa wartość"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1178
+msgid "New value"
+msgstr "Nowa wartość"
+
+#: src/slic3r/GUI/NotificationManager.hpp:322
+msgid "New version is available."
+msgstr "Dostępna jest nowa wersja."
+
#: src/slic3r/GUI/UpdateDialogs.cpp:38
-#, c-format
+#, possible-c-format
msgid "New version of %s is available"
msgstr "Dostępna jest nowa wersja: %s"
@@ -4820,23 +5682,23 @@ msgstr "Dostępna jest nowa wersja: %s"
msgid "New version:"
msgstr "Nowa wersja:"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4673
+#: src/slic3r/GUI/GLCanvas3D.cpp:5089
msgid "Next Redo action: %1%"
msgstr "Następna akcja do powtórzenia: %1%"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4641
+#: src/slic3r/GUI/GLCanvas3D.cpp:5051
msgid "Next Undo action: %1%"
msgstr "Następna akcja do cofnięcia: %1%"
-#: src/libslic3r/PrintConfig.cpp:960
+#: src/libslic3r/PrintConfig.cpp:1004
msgid "No extrusion"
msgstr "Brak ekstruzji"
-#: src/libslic3r/SLAPrintSteps.cpp:453
+#: src/libslic3r/SLAPrintSteps.cpp:451
msgid "No pad can be generated for this model with the current configuration"
msgstr "Nie ma możliwości wygenerowania podkładki dla tego modelu przy obecnych ustawieniach"
-#: src/slic3r/GUI/MainFrame.cpp:784
+#: src/slic3r/GUI/MainFrame.cpp:1485
msgid "No previously sliced file."
msgstr "Brak poprzednio pociętych plików."
@@ -4844,175 +5706,215 @@ msgstr "Brak poprzednio pociętych plików."
msgid "NO RAMMING AT ALL"
msgstr "BRAK WYCISKANIA"
-#: src/libslic3r/PrintConfig.cpp:1857
+#: src/libslic3r/PrintConfig.cpp:1999
msgid "No sparse layers (EXPERIMENTAL)"
msgstr "Brak warstw bez czyszczenia (EKSPERYMENTALNE)"
-#: src/libslic3r/PrintConfig.cpp:2774
+#: src/libslic3r/PrintConfig.cpp:2938
msgid "No support points will be placed closer than this threshold."
msgstr "Punkty nie zostaną umieszczone bliżej siebie niż ustawiona wartość."
-#: src/slic3r/GUI/UpdateDialogs.cpp:303
+#: src/slic3r/GUI/UpdateDialogs.cpp:304
msgid "No updates available"
msgstr "Brak dostępnych aktualizacji"
-#: src/slic3r/GUI/ConfigWizard.cpp:291 src/slic3r/GUI/ConfigWizard.cpp:574
-#: src/slic3r/GUI/Plater.cpp:499 src/slic3r/GUI/Plater.cpp:639
-#: src/libslic3r/ExtrusionEntity.cpp:309
+#: src/slic3r/GUI/ConfigWizard.cpp:309 src/slic3r/GUI/ConfigWizard.cpp:599
+#: src/slic3r/GUI/Plater.cpp:365 src/slic3r/GUI/Plater.cpp:505
+#: src/libslic3r/ExtrusionEntity.cpp:312
msgid "None"
msgstr "Brak"
-#: src/slic3r/GUI/Tab.cpp:2203
+#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2372
msgid "Normal"
msgstr "Normalny"
-#: src/slic3r/GUI/Plater.cpp:1286
+#: src/slic3r/GUI/Plater.cpp:1177 src/slic3r/GUI/Plater.cpp:1224
msgid "normal mode"
msgstr "tryb normalny"
-#: src/libslic3r/Zipper.cpp:46
+#: src/slic3r/GUI/GCodeViewer.cpp:2552
+msgid "Normal mode"
+msgstr "Tryb normalny"
+
+#: src/libslic3r/miniz_extension.cpp:105
msgid "not a ZIP archive"
msgstr "nie jest archiwum ZIP"
-#: src/slic3r/GUI/BedShapeDialog.cpp:223 src/slic3r/GUI/BedShapeDialog.cpp:302
+#: src/slic3r/GUI/BedShapeDialog.cpp:366 src/slic3r/GUI/BedShapeDialog.cpp:446
msgid "Not found:"
msgstr "Nie znaleziono:"
-#: src/slic3r/GUI/DoubleSlider.cpp:1019
+#: src/slic3r/GUI/DoubleSlider.cpp:1144
msgid "Note"
msgstr "Uwaga"
-#: src/slic3r/Utils/AstroBox.cpp:89
+#: src/slic3r/GUI/Tab.cpp:3408
+msgid "Note, that selected preset will be deleted from this/those printer(s) too."
+msgstr "Zwróć uwagę, że wybrany zestaw ustawień zostanie również usunięty z tej drukarki (lub tych drukarek)."
+
+#: src/slic3r/GUI/Tab.cpp:3416
+msgid "Note, that this/those printer(s) will be deleted after deleting of the selected preset."
+msgstr "Zwróć uwagę, że usunięcie wybranego zestawu ustawień spowoduje również usunięcie tej drukarki (lub drukarek)."
+
+#: src/slic3r/GUI/Tab.cpp:2039
+msgid "Note: All parameters from this group are moved to the Physical Printer settings (see changelog).\n\nA new Physical Printer profile is created by clicking on the \"cog\" icon right of the Printer profiles combo box, by selecting the \"Add physical printer\" item in the Printer combo box. The Physical Printer profile editor opens also when clicking on the \"cog\" icon in the Printer settings tab. The Physical Printer profiles are being stored into PrusaSlicer/physical_printer directory."
+msgstr "Uwaga: wszystkie parametry z tej grupy zostały przeniesione do ustawień fizycznej drukarki (szczegóły na liście zmian).\n\nNowy profil fizycznej drukarki tworzysz klikając ikonkę \"koła zębatego\" na liście rozwijanej z profilami drukarek lub wybierając \"Dodaj fizyczną drukarkę\" na tej samej liście. Edytor profilu fizycznej drukarki pojawi się również po kliknięciu na ikonkę \"koła zębatego\" w zakładce \"Ustawienia drukarki\". Profile fizycznych drukarek są przechowywane w katalogu PrusaSlicer/physical_printer."
+
+#: src/slic3r/Utils/AstroBox.cpp:92
msgid "Note: AstroBox version at least 1.1.0 is required."
msgstr "Uwaga: Wymagany jest AstroBox w wersji co najmniej 1.1.0."
-#: src/slic3r/Utils/FlashAir.cpp:73
+#: src/slic3r/Utils/FlashAir.cpp:76
msgid "Note: FlashAir with firmware 2.00.02 or newer and activated upload function is required."
msgstr "Uwaga: Wymagana jest karta FlashAir z FW 2.00.02 lub nowszym z włączoną funkcją przesyłania."
-#: src/slic3r/Utils/OctoPrint.cpp:89
+#: src/slic3r/Utils/OctoPrint.cpp:91
msgid "Note: OctoPrint version at least 1.1.0 is required."
msgstr "Uwaga: wymagany jest OctoPrint w wersji 1.1.0 lub wyższej."
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1345
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1192
msgid "Note: some shortcuts work in (non)editing mode only."
msgstr "Uwaga: niektóre skróty działają tylko poza trybem edycji."
-#: src/slic3r/GUI/Tab.cpp:1251 src/slic3r/GUI/Tab.cpp:1252
-#: src/slic3r/GUI/Tab.cpp:1540 src/slic3r/GUI/Tab.cpp:1541
-#: src/slic3r/GUI/Tab.cpp:2012 src/slic3r/GUI/Tab.cpp:2013
-#: src/slic3r/GUI/Tab.cpp:2128 src/slic3r/GUI/Tab.cpp:2129
-#: src/slic3r/GUI/Tab.cpp:3535 src/slic3r/GUI/Tab.cpp:3536
+#: src/slic3r/GUI/SavePresetDialog.cpp:151
+msgid "Note: This preset will be replaced after saving"
+msgstr "Uwaga: ten zestaw ustawień zostanie zastąpiony po zapisaniu"
+
+#: src/slic3r/GUI/Tab.cpp:1581 src/slic3r/GUI/Tab.cpp:1582
+#: src/slic3r/GUI/Tab.cpp:1887 src/slic3r/GUI/Tab.cpp:1888
+#: src/slic3r/GUI/Tab.cpp:2221 src/slic3r/GUI/Tab.cpp:2222
+#: src/slic3r/GUI/Tab.cpp:2297 src/slic3r/GUI/Tab.cpp:2298
+#: src/slic3r/GUI/Tab.cpp:3951 src/slic3r/GUI/Tab.cpp:3952
msgid "Notes"
msgstr "Notatki"
-#: src/slic3r/GUI/ConfigWizard.cpp:1751 src/slic3r/GUI/DoubleSlider.cpp:1905
-#: src/slic3r/GUI/DoubleSlider.cpp:1926 src/slic3r/GUI/GUI.cpp:245
+#: src/slic3r/GUI/ConfigWizard.cpp:2237 src/slic3r/GUI/DoubleSlider.cpp:2124
+#: src/slic3r/GUI/DoubleSlider.cpp:2144 src/slic3r/GUI/GUI.cpp:244
msgid "Notice"
msgstr "Uwaga"
-#: src/slic3r/GUI/ConfigWizard.cpp:218
+#: src/slic3r/GUI/ConfigWizard.cpp:236
msgid "nozzle"
msgstr "dysza"
-#: src/slic3r/GUI/Tab.cpp:1870 src/slic3r/GUI/Tab.cpp:2340
-#: src/libslic3r/PrintConfig.cpp:1326
+#: src/slic3r/GUI/Tab.cpp:1790
+msgid "Nozzle"
+msgstr "Dysza"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1392
+msgid "Nozzle and Bed Temperatures"
+msgstr "Temperatury dyszy oraz stołu"
+
+#: src/slic3r/GUI/Tab.cpp:2104 src/slic3r/GUI/Tab.cpp:2509
+#: src/libslic3r/PrintConfig.cpp:1434
msgid "Nozzle diameter"
msgstr "Åšrednica dyszy"
-#: src/slic3r/GUI/ConfigWizard.cpp:969
+#: src/slic3r/GUI/ConfigWizard.cpp:1335
msgid "Nozzle Diameter:"
msgstr "Åšrednica dyszy:"
-#: src/libslic3r/PrintConfig.cpp:650
+#: src/libslic3r/PrintConfig.cpp:2201
+msgid "Nozzle temperature"
+msgstr "Temperatura dyszy"
+
+#: src/libslic3r/PrintConfig.cpp:2198
+msgid "Nozzle temperature for layers after the first one. Set this to zero to disable temperature control commands in the output G-code."
+msgstr "Temperatura dyszy dla warstw powyżej pierwszej. Ustaw 0, aby wyłączyć kontrolowanie temperatury w pliku G-code."
+
+#: src/libslic3r/PrintConfig.cpp:961
+msgid "Nozzle temperature for the first layer. If you want to control temperature manually during print, set this to zero to disable temperature control commands in the output G-code."
+msgstr "Temperatura dyszy dla pierwszej warstwy. Jeśli chcesz kontrolować temperaturę ręcznie podczas drukowania, ustaw 0, aby wyłączyć kontrolowanie temperatury w pliku G-code."
+
+#: src/libslic3r/PrintConfig.cpp:686
msgid "Number of cooling moves"
msgstr "Ilość ruchów chłodzących"
-#: src/slic3r/GUI/Tab.cpp:1839
+#: src/slic3r/GUI/Tab.cpp:2073
msgid "Number of extruders of the printer."
msgstr "Liczba ekstruderów drukarki."
-#: src/libslic3r/PrintConfig.cpp:1975
+#: src/libslic3r/PrintConfig.cpp:2117
msgid "Number of interface layers to insert between the object(s) and support material."
msgstr "Liczba warstw łączących materiał podporowy z modelem właściwym."
-#: src/libslic3r/PrintConfig.cpp:1697
+#: src/libslic3r/PrintConfig.cpp:1812
msgid "Number of loops for the skirt. If the Minimum Extrusion Length option is set, the number of loops might be greater than the one configured here. Set this to zero to disable skirt completely."
-msgstr "Liczba pętli skirt. Jeśli włączona jest opcja \"Minimalna długość ekstruzji\", to może ona nadpisać wartość wprowadzoną w tym polu. Ustaw zero aby całkowicie wyłączyć skirt."
+msgstr "Liczba pętli skirt. Jeśli włączona jest opcja \"Minimalna długość ekstruzji\", to może ona nadpisać wartość wprowadzoną w tym polu. Ustaw zero, aby całkowicie wyłączyć skirt."
-#: src/libslic3r/PrintConfig.cpp:2365
+#: src/libslic3r/PrintConfig.cpp:2508
msgid "Number of pixels in"
msgstr "Liczba pikseli"
-#: src/libslic3r/PrintConfig.cpp:2367
+#: src/libslic3r/PrintConfig.cpp:2510
msgid "Number of pixels in X"
msgstr "Liczba pikseli w osi X"
-#: src/libslic3r/PrintConfig.cpp:2373
+#: src/libslic3r/PrintConfig.cpp:2516
msgid "Number of pixels in Y"
msgstr "Liczba pikseli w osi Y"
-#: src/libslic3r/PrintConfig.cpp:176
+#: src/libslic3r/PrintConfig.cpp:210
msgid "Number of solid layers to generate on bottom surfaces."
msgstr "Liczba zwartych warstw dolnych."
-#: src/libslic3r/PrintConfig.cpp:1781
+#: src/libslic3r/PrintConfig.cpp:1896
msgid "Number of solid layers to generate on top and bottom surfaces."
msgstr "Liczba zwartych warstw górnych i dolnych."
-#: src/libslic3r/PrintConfig.cpp:2134
+#: src/libslic3r/PrintConfig.cpp:2277
msgid "Number of solid layers to generate on top surfaces."
msgstr "Liczba zwartych warstw górnych."
-#: src/libslic3r/PrintConfig.cpp:2518
+#: src/libslic3r/PrintConfig.cpp:2661
msgid "Number of the layers needed for the exposure time fade from initial exposure time to the exposure time"
msgstr "Liczba warstw potrzebnych, aby zmienić czas naświetlania z początkowego do stałego"
-#: src/slic3r/GUI/Plater.cpp:241
+#: src/slic3r/GUI/Plater.cpp:247
msgid "Number of tool changes"
msgstr "Ilość zmian narzędzi"
-#: src/libslic3r/PrintConfig.cpp:2753
+#: src/slic3r/GUI/Tab.cpp:4127 src/libslic3r/PrintConfig.cpp:2917
msgid "Object elevation"
msgstr "Podniesienie modelu"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2466
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2858
msgid "Object manipulation"
msgstr "Manipulowanie modelem"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:638
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:163 src/libslic3r/GCode.cpp:623
msgid "Object name"
msgstr "Nazwa modelu"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3417
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3880
msgid "Object or Instance"
-msgstr "Model lub Kopia"
+msgstr "Model lub instancja"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1106
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1230
msgid "Object reordered"
msgstr "Model przeorganizowany"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2479
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2871
msgid "Object Settings to modify"
-msgstr "Ustawienia Modelu do modyfikacji"
+msgstr "Ustawienia modelu do modyfikacji"
-#: src/slic3r/GUI/Plater.cpp:2529
+#: src/slic3r/GUI/Plater.cpp:2491
msgid "Object too large?"
msgstr "Model zbyt duży?"
-#: src/libslic3r/PrintConfig.cpp:2262
+#: src/libslic3r/PrintConfig.cpp:2405
msgid "Object will be used to purge the nozzle after a toolchange to save material that would otherwise end up in the wipe tower and decrease print time. Colours of the objects will be mixed as a result."
-msgstr "Modele zostaną użyte do czyszczenia dyszy po zmianie narzędzia (filamentu) aby oszczędzić materiał, który inaczej zostałby wyekstrudowany do wieży czyszczącej i aby skrócić czas wydruku. W rezultacie kolor tego modelu będzie niejednolity."
+msgstr "Modele zostaną użyte do czyszczenia dyszy po zmianie narzędzia (filamentu), aby oszczędzić materiał, który inaczej zostałby wyekstrudowany do wieży czyszczącej i aby skrócić czas wydruku. W rezultacie kolor tego modelu będzie niejednolity."
-#: src/slic3r/GUI/Plater.cpp:1194
+#: src/slic3r/GUI/Plater.cpp:1103
msgid "object(s)"
msgstr "model(e)"
-#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245
+#: src/slic3r/GUI/Plater.cpp:1143 src/slic3r/GUI/Plater.cpp:1160
msgid "objects"
msgstr "modele"
-#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:855
+#: src/libslic3r/PrintConfig.cpp:465 src/libslic3r/PrintConfig.cpp:893
msgid "Octagram Spiral"
msgstr "Spirala ośmiokątna"
@@ -5020,64 +5922,113 @@ msgstr "Spirala ośmiokątna"
msgid "OctoPrint version"
msgstr "Wersja OctoPrint"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3425
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3888
msgid "of a current Object"
msgstr "obecnego Modelu"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42
msgid "Offset"
msgstr "Offset"
-#: src/slic3r/GUI/Tab.cpp:1755
-#, c-format
+#: src/slic3r/GUI/Preferences.cpp:422
+msgid "Old regular layout with the tab bar"
+msgstr "Poprzedni układ z paskiem kart"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:608
+msgid "Old Value"
+msgstr "Poprzednia wartość"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1177
+msgid "Old value"
+msgstr "Poprzednia wartość"
+
+#: src/slic3r/GUI/Preferences.cpp:123
+msgid "On OSX there is always only one instance of app running by default. However it is allowed to run multiple instances of same app from the command line. In such case this settings will allow only one instance."
+msgstr "Na OSX domyślnie zawsze jest uruchomiona jedna instancja aplikacji. Dozwolone jest jednak uruchomienie wielu instancji tej samej aplikacji z linii komend. Ustawienie to spowoduje dopuszczenie tylko jednej instancji do działania."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:359
+#, possible-c-format
msgid "On this system, %s uses HTTPS certificates from the system Certificate Store or Keychain."
msgstr "W tym systemie, %s używa certyfikatu HTTPS z magazynu systemowego (Certificate Store) lub Keychain."
-#: src/slic3r/GUI/DoubleSlider.cpp:950
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
+msgid "On/Off one layer mode of the vertical slider"
+msgstr "Włącz/wyłącz wyświetlanie jednej warstwy suwaka pionowego"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1064
msgid "One layer mode"
msgstr "Tryb jednej warstwy"
-#: src/libslic3r/Print.cpp:1365
+#: src/libslic3r/Print.cpp:1391
msgid "One or more object were assigned an extruder that the printer does not have."
msgstr "Jeden lub więcej modeli zostało przypisanych do ekstrudera, którego drukarka nie posiada."
-#: src/libslic3r/PrintConfig.cpp:1903 src/libslic3r/PrintConfig.cpp:2676
+#: src/slic3r/GUI/GUI_App.cpp:1784
+msgid "Ongoing uploads"
+msgstr "TrwajÄ…ce transfery"
+
+#: src/libslic3r/Print.cpp:1269
+msgid "Only a single object may be printed at a time in Spiral Vase mode. Either remove all but the last object, or enable sequential mode by \"complete_objects\"."
+msgstr "W trybie wazy możliwe jest drukowanie tylko jednego modelu na raz. Zostaw na stole tylko jeden model lub włącz druk sekwencyjny parametrem \"complete_objects\"."
+
+#: src/libslic3r/PrintConfig.cpp:2045 src/libslic3r/PrintConfig.cpp:2840
msgid "Only create support if it lies on a build plate. Don't create support on a print."
msgstr "Tworzenie podpór tylko na stole. Nie będą tworzone na wydruku."
-#: src/libslic3r/PrintConfig.cpp:1027
+#: src/libslic3r/PrintConfig.cpp:1071
msgid "Only infill where needed"
msgstr "Tylko potrzebne wypełnienie"
-#: src/slic3r/GUI/Tab.cpp:2373
+#: src/slic3r/GUI/Tab.cpp:2542
msgid "Only lift Z"
msgstr "Z-hop tylko"
-#: src/libslic3r/PrintConfig.cpp:1570
+#: src/libslic3r/PrintConfig.cpp:1678
msgid "Only lift Z above"
msgstr "Z-hop tylko powyżej"
-#: src/libslic3r/PrintConfig.cpp:1579
+#: src/libslic3r/PrintConfig.cpp:1687
msgid "Only lift Z below"
msgstr "Z-hop tylko poniżej"
-#: src/libslic3r/PrintConfig.cpp:1348
+#: src/libslic3r/PrintConfig.cpp:1456
msgid "Only retract when crossing perimeters"
msgstr "Retrakcja tylko przy przechodzeniu nad obrysami"
-#: src/slic3r/GUI/Tab.cpp:1187
+#: src/slic3r/GUI/ConfigWizard.cpp:714
+msgid "Only the following installed printers are compatible with the selected filament:"
+msgstr "Tylko te zainstalowane drukarki sÄ… kompatybilne z wybranym filamentem:"
+
+#: src/slic3r/GUI/Tab.cpp:1517
msgid "Ooze prevention"
msgstr "Zapobieganie wyciekom (ooze)"
-#: src/libslic3r/Print.cpp:1266
+#: src/libslic3r/Print.cpp:1292
msgid "Ooze prevention is currently not supported with the wipe tower enabled."
msgstr "Zapobieganie wyciekom jest obecnie niedostępne przy włączonej wieży czyszczącej."
-#: src/slic3r/GUI/MainFrame.cpp:408
+#: src/slic3r/GUI/MainFrame.cpp:1398
+msgid "Open &PrusaSlicer"
+msgstr "Otwórz &PrusaSlicer"
+
+#: src/slic3r/GUI/MainFrame.cpp:1391
+msgid "Open a G-code file"
+msgstr "Otwórz plik G-code"
+
+#: src/slic3r/GUI/MainFrame.cpp:63 src/slic3r/GUI/MainFrame.cpp:77
+#: src/slic3r/GUI/MainFrame.cpp:1262
+msgid "Open a new PrusaSlicer instance"
+msgstr "Otwórz nową instancję PrusaSlicer"
+
+#: src/slic3r/GUI/MainFrame.cpp:989
msgid "Open a project file"
msgstr "Otwórz plik projektu"
-#: src/slic3r/GUI/Tab.cpp:1729
+#: src/slic3r/GUI/Plater.cpp:1417
+msgid "Open as project"
+msgstr "Otwórz jako projekt"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:330
msgid "Open CA certificate file"
msgstr "Otwórz plik certyfikatu CA"
@@ -5090,116 +6041,150 @@ msgstr "Otwórz stronę z listami zmian"
msgid "Open download page"
msgstr "Otwórz stronę pobierania"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:113
+#: src/slic3r/GUI/NotificationManager.cpp:742
+msgid "Open Folder."
+msgstr "Otwórz folder."
+
+#: src/slic3r/Utils/Process.cpp:151
+msgid "Open G-code file:"
+msgstr "Otwórz plik G-code:"
+
+#: src/slic3r/GUI/MainFrame.cpp:66 src/slic3r/GUI/MainFrame.cpp:1141
+msgid "Open G-code viewer"
+msgstr "Otwórz przeglądarkę G-code"
+
+#: src/slic3r/GUI/MainFrame.cpp:79
+msgid "Open new G-code viewer"
+msgstr "Otwórz nową przeglądarkę G-code"
+
+#: src/slic3r/GUI/MainFrame.cpp:63 src/slic3r/GUI/MainFrame.cpp:1262
+msgid "Open new instance"
+msgstr "Otwórz nową instancję"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:106
msgid "Open project STL/OBJ/AMF/3MF with config, clear plater"
msgstr "Otwórz projekt STL/OBJ/AMF/3MF z konfiguracją, wyczyść stół"
-#: src/slic3r/GUI/MainFrame.cpp:693
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:77 src/slic3r/GUI/MainFrame.cpp:1398
+msgid "Open PrusaSlicer"
+msgstr "Otwórz PrusaSlicer "
+
+#: src/slic3r/GUI/MainFrame.cpp:918 src/slic3r/GUI/MainFrame.cpp:1317
+#, possible-c-format
msgid "Open the %s website in your browser"
msgstr "Otwórz stronę %s w przeglądarce"
-#: src/slic3r/GUI/MainFrame.cpp:684
+#: src/slic3r/GUI/MainFrame.cpp:909 src/slic3r/GUI/MainFrame.cpp:1308
msgid "Open the Prusa3D drivers download page in your browser"
msgstr "Otwórz stronę Prusa3D ze sterownikami w przeglądarce"
-#: src/slic3r/GUI/MainFrame.cpp:686
+#: src/slic3r/GUI/MainFrame.cpp:911 src/slic3r/GUI/MainFrame.cpp:1310
msgid "Open the software releases page in your browser"
msgstr "Otwórz stronę z wersjami oprogramowania w przeglądarce"
-#: src/slic3r/GUI/Plater.cpp:4040
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:220 src/slic3r/GUI/Plater.cpp:3961
msgid "Optimize orientation"
msgstr "Optymalizuj orientacjÄ™"
-#: src/slic3r/GUI/Plater.cpp:2767
+#: src/slic3r/GUI/Plater.cpp:1555
msgid "Optimize Rotation"
msgstr "Optymalizuj obrót"
-#: src/slic3r/GUI/Plater.cpp:4040
+#: src/slic3r/GUI/Plater.cpp:3962
msgid "Optimize the rotation of the object for better print results."
msgstr "Optymalizuj obrót modelu dla lepszych efektów."
-#: src/libslic3r/PrintConfig.cpp:137
+#: src/libslic3r/PrintConfig.cpp:170
msgid "Optimize travel moves in order to minimize the crossing of perimeters. This is mostly useful with Bowden extruders which suffer from oozing. This feature slows down both the print and the G-code generation."
-msgstr "Optymalizuj ruchy jałowe aby zminimalizować przejeżdżanie nad obrysami. Ta funkcja jest przydatna szczególne przy ekstruderach typu bowden, podatnych na wyciekanie filamentu z dyszy. Włączenie tej funkcji wydłuża zarówno czas druku jak i czas generowania G-code."
+msgstr "Optymalizuj ruchy jałowe, aby zminimalizować przejeżdżanie nad obrysami. Ta funkcja jest przydatna szczególne przy ekstruderach typu Bowden, podatnych na wyciekanie filamentu z dyszy. Włączenie tej funkcji wydłuża zarówno czas druku, jak i czas generowania G-code."
-#: src/slic3r/GUI/Tab.cpp:1131
+#: src/slic3r/GUI/GCodeViewer.cpp:2525 src/slic3r/GUI/GUI_Preview.cpp:320
+#: src/slic3r/GUI/GUI_Preview.cpp:333
+msgid "Options"
+msgstr "Opcje"
+
+#: src/slic3r/GUI/Tab.cpp:1460
msgid "Options for support material and raft"
msgstr "Opcje materiału podporowego i tratwy (raft)"
-#: src/slic3r/GUI/DoubleSlider.cpp:989
+#: src/slic3r/GUI/Mouse3DController.cpp:315
+msgid "Options:"
+msgstr "Opcje:"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1112
msgid "or press \"+\" key"
msgstr "lub naciśnij klawisz \"+\""
-#: src/slic3r/GUI/Plater.cpp:2892
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:74
msgid "Orientation found."
msgstr "Znaleziono orientacjÄ™."
-#: src/slic3r/GUI/Plater.cpp:2891
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:73
msgid "Orientation search canceled."
msgstr "Anulowano ustawianie orientacji."
-#: src/slic3r/GUI/BedShapeDialog.cpp:84
+#: src/slic3r/GUI/BedShapeDialog.cpp:94
msgid "Origin"
msgstr "Punkt zerowy"
-#: src/slic3r/GUI/Tab.cpp:1227
+#: src/slic3r/GUI/Tab.cpp:1557
msgid "Other"
msgstr "Inne"
-#: src/libslic3r/PrintConfig.cpp:144 src/libslic3r/PrintConfig.cpp:2064
+#: src/libslic3r/PrintConfig.cpp:177 src/libslic3r/PrintConfig.cpp:2206
msgid "Other layers"
msgstr "Inne warstwy"
-#: src/slic3r/GUI/ConfigWizard.cpp:856
+#: src/slic3r/GUI/ConfigWizard.cpp:1222
msgid "Other Vendors"
msgstr "Inni dostawcy"
-#: src/slic3r/GUI/Tab.cpp:1238 src/slic3r/GUI/Tab.cpp:3666
+#: src/slic3r/GUI/Tab.cpp:1568 src/slic3r/GUI/Tab.cpp:4085
msgid "Output file"
msgstr "Plik wyjściowy"
-#: src/libslic3r/PrintConfig.cpp:3493
+#: src/libslic3r/PrintConfig.cpp:3692
msgid "Output File"
msgstr "Plik Wyjściowy"
-#: src/libslic3r/PrintConfig.cpp:1363
+#: src/libslic3r/PrintConfig.cpp:1471
msgid "Output filename format"
msgstr "Format pliku wyjściowego"
-#: src/libslic3r/PrintConfig.cpp:3381
+#: src/libslic3r/PrintConfig.cpp:3580
msgid "Output Model Info"
msgstr "Informacje o Modelu wyjściowym"
-#: src/slic3r/GUI/Tab.cpp:1230 src/slic3r/GUI/Tab.cpp:3665
+#: src/slic3r/GUI/Tab.cpp:1560 src/slic3r/GUI/Tab.cpp:4084
msgid "Output options"
msgstr "Opcje wyjściowe"
-#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:312
+#: src/slic3r/GUI/GUI_Preview.cpp:303 src/libslic3r/ExtrusionEntity.cpp:316
+#: src/libslic3r/ExtrusionEntity.cpp:340
msgid "Overhang perimeter"
msgstr "Obrys zwisu"
-#: src/libslic3r/PrintConfig.cpp:2042
+#: src/libslic3r/PrintConfig.cpp:2184
msgid "Overhang threshold"
msgstr "Próg zwisu"
-#: src/slic3r/GUI/Tab.cpp:1215
+#: src/slic3r/GUI/Tab.cpp:1545
msgid "Overlap"
msgstr "Nakładanie"
-#: src/slic3r/GUI/MainFrame.cpp:614
+#: src/slic3r/GUI/MainFrame.cpp:1221
msgid "P&rint Settings Tab"
-msgstr "Ustawienia D&ruku"
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:107 src/slic3r/GUI/GUI_ObjectList.cpp:625
-#: src/slic3r/GUI/Plater.cpp:635 src/slic3r/GUI/Tab.cpp:3636
-#: src/slic3r/GUI/Tab.cpp:3637 src/libslic3r/PrintConfig.cpp:2781
-#: src/libslic3r/PrintConfig.cpp:2788 src/libslic3r/PrintConfig.cpp:2802
-#: src/libslic3r/PrintConfig.cpp:2813 src/libslic3r/PrintConfig.cpp:2823
-#: src/libslic3r/PrintConfig.cpp:2845 src/libslic3r/PrintConfig.cpp:2856
-#: src/libslic3r/PrintConfig.cpp:2863 src/libslic3r/PrintConfig.cpp:2870
-#: src/libslic3r/PrintConfig.cpp:2881 src/libslic3r/PrintConfig.cpp:2890
-#: src/libslic3r/PrintConfig.cpp:2899
+msgstr "Ustawienia d&ruku"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:664
+#: src/slic3r/GUI/Plater.cpp:501 src/slic3r/GUI/Tab.cpp:4055
+#: src/slic3r/GUI/Tab.cpp:4056 src/slic3r/GUI/Tab.cpp:4127
+#: src/libslic3r/PrintConfig.cpp:2945 src/libslic3r/PrintConfig.cpp:2952
+#: src/libslic3r/PrintConfig.cpp:2966 src/libslic3r/PrintConfig.cpp:2977
+#: src/libslic3r/PrintConfig.cpp:2987 src/libslic3r/PrintConfig.cpp:3009
+#: src/libslic3r/PrintConfig.cpp:3020 src/libslic3r/PrintConfig.cpp:3027
+#: src/libslic3r/PrintConfig.cpp:3034 src/libslic3r/PrintConfig.cpp:3045
+#: src/libslic3r/PrintConfig.cpp:3054 src/libslic3r/PrintConfig.cpp:3063
msgid "Pad"
msgstr "Podkładka"
@@ -5207,443 +6192,517 @@ msgstr "Podkładka"
msgid "Pad and Support"
msgstr "Podkładka i Podpory"
-#: src/libslic3r/PrintConfig.cpp:2855
+#: src/slic3r/GUI/Tab.cpp:4127 src/libslic3r/PrintConfig.cpp:3019
msgid "Pad around object"
msgstr "Podkładka wokół modelu"
-#: src/libslic3r/PrintConfig.cpp:2862
+#: src/libslic3r/PrintConfig.cpp:3026
msgid "Pad around object everywhere"
msgstr "Podkładka wokół wszystkich modeli"
-#: src/libslic3r/PrintConfig.cpp:2811
+#: src/libslic3r/PrintConfig.cpp:2975
msgid "Pad brim size"
msgstr "Rozmiar brimu dla podkładki"
-#: src/libslic3r/SLA/Pad.cpp:691
+#: src/libslic3r/SLA/Pad.cpp:532
msgid "Pad brim size is too small for the current configuration."
msgstr "Rozmiar brimu podkładki jest zbyt mały dla obecnej konfiguracji."
-#: src/libslic3r/PrintConfig.cpp:2898
+#: src/libslic3r/PrintConfig.cpp:3062
msgid "Pad object connector penetration"
msgstr "Przenikanie łącznika podkładki z modelem"
-#: src/libslic3r/PrintConfig.cpp:2880
+#: src/libslic3r/PrintConfig.cpp:3044
msgid "Pad object connector stride"
msgstr "Rozmieszczenie łączników podkładki z modelem"
-#: src/libslic3r/PrintConfig.cpp:2889
+#: src/libslic3r/PrintConfig.cpp:3053
msgid "Pad object connector width"
msgstr "Szerokość łącznika podkładki z modelem"
-#: src/libslic3r/PrintConfig.cpp:2869
+#: src/libslic3r/PrintConfig.cpp:3033
msgid "Pad object gap"
msgstr "Odstęp modelu od podkładki"
-#: src/libslic3r/PrintConfig.cpp:2797
+#: src/libslic3r/PrintConfig.cpp:2961
msgid "Pad wall height"
msgstr "Wysokość ścianki podkładki"
-#: src/libslic3r/PrintConfig.cpp:2844
+#: src/libslic3r/PrintConfig.cpp:3008
msgid "Pad wall slope"
msgstr "Kąt pochylenia ścianki podkładki"
-#: src/libslic3r/PrintConfig.cpp:2787
+#: src/libslic3r/PrintConfig.cpp:2951
msgid "Pad wall thickness"
msgstr "Grubość ścianki podkładki"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
msgid "Page Down"
msgstr "Page Down"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
msgid "Page Up"
msgstr "Page Up"
-#: src/slic3r/GUI/Field.cpp:139
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33
+msgid "Paint-on supports"
+msgstr "Malowanie podpór"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:178
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:159
+msgid "Paints all facets inside, regardless of their orientation."
+msgstr "Maluje wszystkie powierzchnie wewnątrz, bez względu na ich kierunek."
+
+#: src/slic3r/GUI/Field.cpp:187
msgid "parameter name"
msgstr "nazwa parametru"
-#: src/slic3r/GUI/Field.cpp:243
+#: src/slic3r/GUI/Field.cpp:291
msgid "Parameter validation"
msgstr "Weryfikacja parametru"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3418
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3881
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
msgid "Part"
msgstr "Część"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2494
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2886
msgid "Part manipulation"
msgstr "Manipulacja częścią"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2483
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2875
msgid "Part Settings to modify"
-msgstr "Ustawienia Części do modyfikacji"
+msgstr "Ustawienia części do modyfikacji"
+
+#: src/libslic3r/PrintConfig.cpp:138
+msgid "Password"
+msgstr "Hasło"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4514
+#: src/slic3r/GUI/GLCanvas3D.cpp:4880
msgid "Paste"
msgstr "Wklej"
-#: src/slic3r/GUI/MainFrame.cpp:592
+#: src/slic3r/GUI/MainFrame.cpp:1198
msgid "Paste clipboard"
msgstr "Wklej zawartość schowka"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:133
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:128
msgid "Paste from clipboard"
msgstr "Wklej ze schowka"
-#: src/slic3r/GUI/Plater.cpp:5606
+#: src/slic3r/GUI/Plater.cpp:5803
msgid "Paste From Clipboard"
msgstr "Wklej Ze Schowka"
-#: src/libslic3r/PrintConfig.cpp:2002
+#: src/libslic3r/PrintConfig.cpp:2144
msgid "Pattern"
msgstr "Wzór"
-#: src/libslic3r/PrintConfig.cpp:1891
+#: src/libslic3r/PrintConfig.cpp:2033
msgid "Pattern angle"
msgstr "KÄ…t wzoru"
-#: src/libslic3r/PrintConfig.cpp:2016
+#: src/libslic3r/PrintConfig.cpp:2158
msgid "Pattern spacing"
msgstr "Rozstaw wzoru"
-#: src/libslic3r/PrintConfig.cpp:2004
+#: src/libslic3r/PrintConfig.cpp:2146
msgid "Pattern used to generate support material."
msgstr "Wzór podpór."
-#: src/slic3r/GUI/Plater.cpp:1261
+#: src/slic3r/GUI/GCodeViewer.cpp:2437 src/slic3r/GUI/GCodeViewer.cpp:2460
+#: src/slic3r/GUI/Plater.cpp:1199
msgid "Pause"
msgstr "Pauza"
-#: src/slic3r/GUI/DoubleSlider.cpp:1009
+#: src/slic3r/GUI/DoubleSlider.cpp:1133
msgid "Pause print (\"%1%\")"
msgstr "Wstrzymaj wydruk (\"%1%\")"
-#: src/slic3r/GUI/GLCanvas3D.cpp:934 src/slic3r/GUI/GLCanvas3D.cpp:943
-#: src/slic3r/GUI/GLCanvas3D.cpp:982
-msgid "Pause print or custom G-code"
-msgstr "Pauza wydruku lub własny G-code"
+#: src/slic3r/GUI/Tab.cpp:2209 src/libslic3r/PrintConfig.cpp:1969
+msgid "Pause Print G-code"
+msgstr "G-code dla pauzy drukowania"
+
+#: src/libslic3r/PrintConfig.cpp:1147
+msgid "Percent of a flow rate relative to object's normal layer height."
+msgstr "Procentowy udział przepływu w stosunku do normalnej wysokości warstwy modelu."
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:175
+#: src/slic3r/GUI/GCodeViewer.cpp:2233
+msgid "Percentage"
+msgstr "Procentowo"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:177
msgid "Perform cut"
msgstr "Przetnij"
-#: src/libslic3r/PrintConfig.cpp:2927
+#: src/libslic3r/PrintConfig.cpp:3091
msgid "Performance vs accuracy of calculation. Lower values may produce unwanted artifacts."
msgstr "Kalkulacja prędkości względem dokładności. Niższe wartości mogą powodować artefakty."
-#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:310
+#: src/slic3r/GUI/GUI_Preview.cpp:301 src/libslic3r/ExtrusionEntity.cpp:314
+#: src/libslic3r/ExtrusionEntity.cpp:336
msgid "Perimeter"
msgstr "Obrys"
-#: src/libslic3r/PrintConfig.cpp:1408
+#: src/libslic3r/PrintConfig.cpp:1516
msgid "Perimeter extruder"
msgstr "Ekstruder dla obrysów"
-#: src/slic3r/GUI/PresetHints.cpp:165
+#: src/slic3r/GUI/PresetHints.cpp:164
msgid "perimeters"
msgstr "obrysy"
-#: src/libslic3r/PrintConfig.cpp:1399 src/libslic3r/PrintConfig.cpp:1417
-#: src/libslic3r/PrintConfig.cpp:1430 src/libslic3r/PrintConfig.cpp:1440
+#: src/libslic3r/PrintConfig.cpp:1507 src/libslic3r/PrintConfig.cpp:1525
+#: src/libslic3r/PrintConfig.cpp:1538 src/libslic3r/PrintConfig.cpp:1548
msgid "Perimeters"
msgstr "Obrysy"
-#: src/slic3r/GUI/ConfigWizard.cpp:860
-#, c-format
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:159
+msgid "Physical Printer"
+msgstr "Drukarka fizyczna"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:789
+#: src/slic3r/GUI/PresetComboBoxes.cpp:948
+msgid "Physical printers"
+msgstr "Drukarki fizyczne"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1226
+#, possible-c-format
msgid "Pick another vendor supported by %s"
msgstr "Wybierz innego producenta obsługiwanego przez %s"
-#: src/libslic3r/PrintConfig.cpp:66
-msgid "Picture sizes to be stored into a .gcode and .sl1 files"
-msgstr "Rozmiary obrazów będą przechowywane w plikach .gcode i .sl1"
+#: src/libslic3r/PrintConfig.cpp:67
+msgid "Picture sizes to be stored into a .gcode and .sl1 files, in the following format: \"XxY, XxY, ...\""
+msgstr "Rozmiary grafik przechowywanych w plikach .gcode i .sl1, w formacie: \"XxY, XxY, ...\""
-#: src/libslic3r/PrintConfig.cpp:2681
+#: src/libslic3r/PrintConfig.cpp:2822
+msgid "Pillar connection mode"
+msgstr "Tryb łączenia słupków"
+
+#: src/libslic3r/PrintConfig.cpp:2791
+msgid "Pillar diameter"
+msgstr "Średnica słupka"
+
+#: src/libslic3r/PrintConfig.cpp:2845
msgid "Pillar widening factor"
msgstr "Współczynnik rozszerzania słupka"
-#: src/slic3r/GUI/ConfigManipulation.cpp:330
+#: src/slic3r/GUI/ConfigManipulation.cpp:335
msgid "Pinhead diameter should be smaller than the pillar diameter."
msgstr "Średnica łączników podpór powinna być mniejsza niż średnica słupków."
-#: src/slic3r/GUI/DoubleSlider.cpp:79
+#: src/libslic3r/PrintConfig.cpp:2763
+msgid "Pinhead front diameter"
+msgstr "Przednia średnica łącznika"
+
+#: src/libslic3r/PrintConfig.cpp:2781
+msgid "Pinhead width"
+msgstr "Szerokość łącznika"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:110
msgid "Place bearings in slots and resume printing"
msgstr "Umieść łożyska w gniazdach i wznów drukowanie"
-#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:45
+#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:41
msgid "Place on face"
msgstr "Połóż na płaszczyźnie"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 src/slic3r/GUI/MainFrame.cpp:204
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 src/slic3r/GUI/MainFrame.cpp:340
+#: src/slic3r/GUI/MainFrame.cpp:352
msgid "Plater"
msgstr "Zawartość Stołu"
-#: src/slic3r/GUI/GUI_App.cpp:1085
+#: src/slic3r/GUI/GUI_App.cpp:1877
msgid "Please check and fix your object list."
msgstr "Sprawdź i popraw listę modeli."
-#: src/slic3r/GUI/Plater.cpp:2312 src/slic3r/GUI/Tab.cpp:2959
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:209 src/slic3r/GUI/Plater.cpp:2255
+#: src/slic3r/GUI/Tab.cpp:3188
msgid "Please check your object list before preset changing."
msgstr "Sprawdź listę modeli przed zmianą zestawu ustawień."
-#: src/slic3r/GUI/Plater.cpp:3286
+#: src/slic3r/GUI/Plater.cpp:3089
msgid "Please select the file to reload"
msgstr "Wybierz plik do przeładowania"
-#: src/slic3r/GUI/AboutDialog.cpp:39 src/slic3r/GUI/AboutDialog.cpp:291
+#: src/slic3r/GUI/AboutDialog.cpp:43 src/slic3r/GUI/AboutDialog.cpp:48
+#: src/slic3r/GUI/AboutDialog.cpp:317
msgid "Portions copyright"
msgstr "Częściowe prawa autorskie"
-#: src/libslic3r/PrintConfig.cpp:2400
+#: src/libslic3r/PrintConfig.cpp:2543
msgid "Portrait"
msgstr "Tryb Portretowy"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:215
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:457
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:223
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:505
msgid "Position"
msgstr "Pozycja"
-#: src/slic3r/GUI/Tab.cpp:2367
+#: src/slic3r/GUI/Tab.cpp:2536
msgid "Position (for multi-extruder printers)"
msgstr "Pozycja (dla drukarek z kilkoma ekstruderami)"
-#: src/libslic3r/PrintConfig.cpp:1623
+#: src/libslic3r/PrintConfig.cpp:1731
msgid "Position of perimeters starting points."
msgstr "Pozycja startowa druku obrysów."
-#: src/libslic3r/PrintConfig.cpp:2224
+#: src/libslic3r/PrintConfig.cpp:2367
msgid "Position X"
msgstr "Pozycja X"
-#: src/libslic3r/PrintConfig.cpp:2231
+#: src/libslic3r/PrintConfig.cpp:2374
msgid "Position Y"
msgstr "Pozycja Y"
-#: src/slic3r/GUI/Tab.cpp:1245 src/libslic3r/PrintConfig.cpp:1453
+#: src/slic3r/GUI/Tab.cpp:1575 src/libslic3r/PrintConfig.cpp:1561
msgid "Post-processing scripts"
msgstr "Skrypty do przetwarzania końcowego"
-#: src/slic3r/GUI/MainFrame.cpp:629
+#: src/slic3r/GUI/MainFrame.cpp:1237
msgid "Pre&view"
msgstr "Pod&glÄ…d"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 src/slic3r/GUI/Preferences.cpp:10
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 src/slic3r/GUI/Preferences.cpp:12
msgid "Preferences"
msgstr "Preferencje"
-#: src/libslic3r/PrintConfig.cpp:1641
+#: src/libslic3r/PrintConfig.cpp:1749
msgid "Preferred direction of the seam"
msgstr "Preferowane ustawienie szwu"
-#: src/libslic3r/PrintConfig.cpp:1652
+#: src/libslic3r/PrintConfig.cpp:1760
msgid "Preferred direction of the seam - jitter"
msgstr "Preferowany kierunek szwu - jitter"
-#: src/libslic3r/PrintObject.cpp:255
+#: src/libslic3r/PrintObject.cpp:261
msgid "Preparing infill"
msgstr "Przygotowywanie wypełnienia"
-#: src/slic3r/GUI/Tab.cpp:2920
-#, c-format
-msgid "Preset (%s)"
-msgstr "Zestaw ustawień (%s)"
+#: src/slic3r/GUI/GUI_App.cpp:855
+msgid "Preparing settings tabs"
+msgstr "Przygotowuję zakładkę ustawień"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1009
+msgid "Preset \"%1%\" has the following unsaved changes:"
+msgstr "Zestaw ustawień \"%1%\" ma następujące niezapisane zmiany:"
-#: src/slic3r/GUI/Tab.cpp:3082
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1014
+msgid "Preset \"%1%\" is not compatible with the new print profile and it has the following unsaved changes:"
+msgstr "Zestaw ustawień \"%1%\" jest niekompatybilny z nowym profilem druku i ma następujące niezapisane zmiany:"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1013
+msgid "Preset \"%1%\" is not compatible with the new printer profile and it has the following unsaved changes:"
+msgstr "Zestaw ustawień \"%1%\" jest niekompatybilny z nowym profilem drukarki i ma następujące niezapisane zmiany:"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:136
+msgid "Preset with name \"%1%\" already exists and is incompatible with selected printer."
+msgstr "Zestaw ustawień o nazwie \"%1%\" już istnieje i jest niekompatybilny z wybraną drukarką."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:148
msgid "Preset with name \"%1%\" already exists."
msgstr "Zestaw ustawień o nazwie \"%1%\" już istnieje."
-#: src/slic3r/GUI/Tab.cpp:3029
+#: src/slic3r/GUI/SavePresetDialog.cpp:219
msgctxt "PresetName"
msgid "Copy"
msgstr "Kopia"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
-msgid "Press to activate deselection rectangle"
-msgstr "Naciśnij aby aktywować prostokąt odznaczający"
+#: src/slic3r/GUI/GLCanvas3D.cpp:3990
+msgid "Press %1%left mouse button to enter the exact value"
+msgstr "Naciśnij %1%lewy przycisk myszy, aby wprowadzić wartość liczbową."
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:197
-msgid "Press to activate one direction scaling in Gizmo scale"
-msgstr "Naciśnij aby aktywować skalowanie uchwytem w jednym kierunku"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:157
+msgid "Press to activate deselection rectangle"
+msgstr "Naciśnij, aby aktywować prostokąt odznaczający"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:162
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:156
msgid "Press to activate selection rectangle"
msgstr "Naciśnij, aby aktywować prostokąt zaznaczający"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:198
-msgid ""
-"Press to scale (in Gizmo scale) or rotate (in Gizmo rotate)\n"
-"selected objects around their own center"
-msgstr ""
-"Naciśnij, aby skalować (z uchwytem) lub obracać (z uchwytem)\n"
-"zaznaczone modele wokół ich środków"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:155
+msgid "Press to select multiple objects\nor move multiple objects with mouse"
+msgstr "Kliknij, aby wybrać wiele modeli\nlub przesunąć je przy pomocy myszy"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:161
-msgid ""
-"Press to select multiple objects\n"
-"or move multiple objects with mouse"
-msgstr ""
-"Kliknij aby wybrać wiele modeli\n"
-"lub przesunąć je przy pomocy myszki"
-
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:195
-#, no-c-format
-msgid ""
-"Press to snap by 5% in Gizmo scale\n"
-"or to snap by 1mm in Gizmo move"
-msgstr ""
-"Naciśnij, aby a przyciągać co 5% podczas skalowania z uchwytem\n"
-"lub przyciągać co 1 mm podczas przemieszczania z uchwytem"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:221
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:231
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:232
+msgid "Press to speed up 5 times while moving thumb\nwith arrow keys or mouse wheel"
+msgstr "Naciśnij, aby przyspieszyć suwak 5-krotnie\npodczas ruchu strzałkami lub kółkiem myszy"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/Plater.cpp:4105
-#: src/slic3r/GUI/Tab.cpp:2390
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:212 src/slic3r/GUI/Plater.cpp:4052
+#: src/slic3r/GUI/Tab.cpp:2559
msgid "Preview"
msgstr "Podgląd cięcia"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41
msgid "Preview hollowed and drilled model"
-msgstr "Podgląd wydrążonego modelu z otworem"
+msgstr "Podgląd drążenia/wiercenia"
-#: src/slic3r/GUI/MainFrame.cpp:790
+#: src/slic3r/GUI/MainFrame.cpp:1491
msgid "Previously sliced file ("
msgstr "Poprzednio pocięty plik ("
-#: src/libslic3r/PrintConfig.cpp:1851
+#: src/libslic3r/PrintConfig.cpp:1993
msgid "Prime all printing extruders"
msgstr "Wyczyść wszystkie używane ekstrudery"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1521
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/libslic3r/Preset.cpp:1300
msgid "print"
msgstr "druk"
-#: src/slic3r/GUI/MainFrame.cpp:648
+#: src/slic3r/GUI/GCodeViewer.cpp:2436 src/slic3r/GUI/GCodeViewer.cpp:2451
+msgid "Print"
+msgstr "Druk"
+
+#: src/slic3r/GUI/MainFrame.cpp:1258
msgid "Print &Host Upload Queue"
msgstr "Kolej&ka zadań serwera druku"
-#: src/libslic3r/PrintConfig.cpp:471
+#: src/libslic3r/PrintConfig.cpp:507
msgid "Print contour perimeters from the outermost one to the innermost one instead of the default inverse order."
msgstr "Drukuj obrysy od zewnątrz do wewnątrz zamiast domyślnego ustawienia węwnątrz-zewnątrz."
-#: src/slic3r/GUI/ConfigWizard.cpp:952
+#: src/slic3r/GUI/ConfigWizard.cpp:1318
msgid "Print Diameters"
-msgstr "Åšrednice wydruku"
+msgstr "Åšrednice"
-#: src/slic3r/GUI/Tab.cpp:1944 src/slic3r/GUI/Tab.cpp:2123
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:209 src/slic3r/GUI/Tab.cpp:2024
msgid "Print Host upload"
-msgstr "Wysyłanie do serwera druku"
+msgstr "Przesyłanie do serwera druku"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:142
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:138
#: src/slic3r/GUI/PrintHostDialogs.cpp:136
msgid "Print host upload queue"
msgstr "Kolejka serwera druku"
-#: src/slic3r/GUI/DoubleSlider.cpp:970
+#: src/slic3r/GUI/DoubleSlider.cpp:1093
msgid "Print mode"
msgstr "Tryb drukowania"
-#: src/slic3r/GUI/Tab.hpp:328 src/slic3r/GUI/Tab.hpp:431
+#: src/slic3r/GUI/GCodeViewer.cpp:2579 src/slic3r/GUI/GUI_Preview.cpp:1476
+msgid "Print pauses"
+msgstr "Pauzuje wydruk"
+
+#: src/slic3r/GUI/Tab.hpp:378 src/slic3r/GUI/Tab.hpp:502
msgid "Print Settings"
msgstr "Ustawienia Druku"
-#: src/slic3r/GUI/Plater.cpp:815
+#: src/slic3r/GUI/Plater.cpp:690
msgid "Print settings"
msgstr "Ustawienia druku"
-#: src/slic3r/GUI/Tab.cpp:1478
+#: src/slic3r/GUI/GLCanvas3D.cpp:4303 src/slic3r/GUI/GLCanvas3D.cpp:4939
+msgid "Print Settings Tab"
+msgstr "Ustawienia druku"
+
+#: src/slic3r/GUI/Tab.cpp:1824
msgid "Print speed override"
msgstr "Nadpisanie prędkości druku"
-#: src/libslic3r/GCode.cpp:638
+#: src/libslic3r/GCode.cpp:623
msgid "Print z"
msgstr "Druk z"
-#: src/slic3r/GUI/MainFrame.cpp:621
+#: src/slic3r/GUI/MainFrame.cpp:1228
msgid "Print&er Settings Tab"
-msgstr "Ustawi&enia Drukarki"
+msgstr "Ustawi&enia drukarki"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1621
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1750
msgid "Printable"
msgstr "Do druku"
-#: src/slic3r/GUI/Plater.cpp:819
+#: src/slic3r/GUI/Plater.cpp:694
msgid "Printer"
msgstr "Drukarka"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1525
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/libslic3r/Preset.cpp:1304
msgid "printer"
msgstr "drukarka"
-#: src/libslic3r/PrintConfig.cpp:2439 src/libslic3r/PrintConfig.cpp:2440
+#: src/libslic3r/PrintConfig.cpp:2582 src/libslic3r/PrintConfig.cpp:2583
msgid "Printer absolute correction"
msgstr "Korekcje bezwzględne drukarki"
-#: src/libslic3r/PrintConfig.cpp:2456 src/libslic3r/PrintConfig.cpp:2457
+#: src/libslic3r/PrintConfig.cpp:2599 src/libslic3r/PrintConfig.cpp:2600
msgid "Printer gamma correction"
msgstr "Korekcja gamma drukarki"
-#: src/slic3r/GUI/Tab.cpp:976
+#: src/slic3r/GUI/Tab.cpp:1294
msgid "printer model"
msgstr "model drukarki"
-#: src/libslic3r/PrintConfig.cpp:1472
+#: src/libslic3r/PrintConfig.cpp:1580
msgid "Printer notes"
msgstr "Notatki o drukarce"
-#: src/libslic3r/PrintConfig.cpp:2431 src/libslic3r/PrintConfig.cpp:2432
-#: src/libslic3r/PrintConfig.cpp:2433
+#: src/libslic3r/PrintConfig.cpp:144
+msgid "Printer preset name"
+msgstr "Nazwa zestawu ustawień drukarki"
+
+#: src/libslic3r/PrintConfig.cpp:2574 src/libslic3r/PrintConfig.cpp:2575
+#: src/libslic3r/PrintConfig.cpp:2576
msgid "Printer scaling correction"
msgstr "Korekcja skalowania drukarki"
-#: src/slic3r/GUI/Tab.hpp:391
+#: src/slic3r/GUI/Tab.hpp:453
msgid "Printer Settings"
msgstr "Ustawienia Drukarki"
+#: src/slic3r/GUI/GLCanvas3D.cpp:4305 src/slic3r/GUI/GLCanvas3D.cpp:4941
+msgid "Printer Settings Tab"
+msgstr "Ustawienia drukarki"
+
#: src/libslic3r/PrintConfig.cpp:43 src/libslic3r/PrintConfig.cpp:44
msgid "Printer technology"
msgstr "Technologia druku"
-#: src/libslic3r/PrintConfig.cpp:1466
+#: src/libslic3r/PrintConfig.cpp:1574
msgid "Printer type"
msgstr "Rodzaj drukarki"
-#: src/libslic3r/PrintConfig.cpp:1487
+#: src/libslic3r/PrintConfig.cpp:1595
msgid "Printer variant"
msgstr "Wariant drukarki"
-#: src/libslic3r/PrintConfig.cpp:1481
+#: src/libslic3r/PrintConfig.cpp:1589
msgid "Printer vendor"
msgstr "Dostawca drukarki"
-#: src/libslic3r/Print.cpp:1388
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:476
+msgid "Printer with name \"%1%\" already exists."
+msgstr "Drukarka o nazwie \"%1%\" już istnieje."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:587
+msgid "Printer:"
+msgstr "Drukarka:"
+
+#: src/libslic3r/Print.cpp:1414
msgid "Printing with multiple extruders of differing nozzle diameters. If support is to be printed with the current extruder (support_material_extruder == 0 or support_material_interface_extruder == 0), all nozzles have to be of the same diameter."
msgstr "Druk ekstruderami o różnych średnicach dysz. Jeśli podpory mają być drukowane obecnie ustawionym ekstruderem (support_material_extruder == 0 lub support_material_interface_extruder == 0) to wszystkie dysze muszą mieć taką samą średnicę."
#. TRN "Processing input_file_basename"
-#: src/slic3r/GUI/MainFrame.cpp:849
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:1550
+#, possible-c-format
msgid "Processing %s"
msgstr "Przetwarzanie %s"
-#: src/slic3r/GUI/Plater.cpp:2283
-#, c-format
-msgid "Processing input file %s"
-msgstr "Przetwarzanie pliku wejściowego %s"
-
-#: src/libslic3r/PrintObject.cpp:108
+#: src/libslic3r/PrintObject.cpp:114
msgid "Processing triangulated mesh"
msgstr "Przetwarzanie siatki trójkątów"
-#: src/slic3r/GUI/Tab.cpp:1259 src/slic3r/GUI/Tab.cpp:1549
-#: src/slic3r/GUI/Tab.cpp:2020 src/slic3r/GUI/Tab.cpp:2136
-#: src/slic3r/GUI/Tab.cpp:3544 src/slic3r/GUI/Tab.cpp:3672
+#: src/slic3r/GUI/Tab.cpp:1589 src/slic3r/GUI/Tab.cpp:1896
+#: src/slic3r/GUI/Tab.cpp:2229 src/slic3r/GUI/Tab.cpp:2305
+#: src/slic3r/GUI/Tab.cpp:3960 src/slic3r/GUI/Tab.cpp:4091
msgid "Profile dependencies"
msgstr "Zależności profilowe"
-#: src/slic3r/GUI/ConfigWizard.cpp:566
+#: src/slic3r/GUI/ConfigWizard.cpp:590
msgid "Profile:"
msgstr "Profil:"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:150
+#: src/slic3r/GUI/PrintHostDialogs.cpp:148
msgid "Progress"
msgstr "Postęp"
@@ -5651,103 +6710,129 @@ msgstr "Postęp"
msgid "Progress:"
msgstr "Postęp:"
-#: src/slic3r/GUI/MainFrame.cpp:684
+#: src/slic3r/GUI/MainFrame.cpp:909 src/slic3r/GUI/MainFrame.cpp:1308
msgid "Prusa 3D &Drivers"
msgstr "Sterowniki Prusa 3&D"
-#: src/slic3r/GUI/ConfigWizard.cpp:1995
+#: src/slic3r/GUI/ConfigWizard.cpp:2506
msgid "Prusa FFF Technology Printers"
msgstr "Drukarki Prusa w technologii FFF"
-#: src/slic3r/GUI/ConfigWizard.cpp:1998
+#: src/slic3r/GUI/ConfigWizard.cpp:2509
msgid "Prusa MSLA Technology Printers"
msgstr "Drukarki Prusa w technologii MSLA"
-#: src/slic3r/GUI/AboutDialog.cpp:260
+#: src/slic3r/Utils/Http.cpp:78
+msgid "PrusaSlicer detected system SSL certificate store in: %1%"
+msgstr "PrusaSlicer wykrył systemowy magazyn certyfikatów SSL w: %1%"
+
+#: src/slic3r/GUI/GUI_Init.cpp:85 src/slic3r/GUI/GUI_Init.cpp:88
+msgid "PrusaSlicer GUI initialization failed"
+msgstr "Niepowodzenie inicjalizacji PrusaSlicer GUI"
+
+#: src/slic3r/GUI/GUI_App.cpp:586
+msgid "PrusaSlicer has encountered a localization error. Please report to PrusaSlicer team, what language was active and in which scenario this issue happened. Thank you.\n\nThe application will now terminate."
+msgstr "PrusaSlicer napotkał błąd związany z tłumaczeniem tekstów. Skontaktuj się z zespołem odpowiedzialnym za rozwój PrusaSlicer i podaj język, który był włączony, gdy wystąpił błąd. Dziękujemy.\n\nAplikacja zostanie zamknięta."
+
+#: src/slic3r/GUI/AboutDialog.cpp:285
msgid "PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap community."
-msgstr "PrusaSlicer bazuje na projekcie Slic3r autorstwa Alessandro Ranelucciego i społeczności RepRap."
+msgstr "PrusaSlicer bazuje na projekcie Slic3r autorstwa Alessandro Ranellucciego i społeczności RepRap."
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:284
-#, c-format
-msgid ""
-"PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n"
-"while OpenGL version %s, render %s, vendor %s was detected."
-msgstr ""
-"PrusaSlicer wymaga karty graficznej kompatybilnej z OpenGL 2.0, aby działać prawidłowo.\n"
-"wykryto OpenGL w wersji %s, render %s, producent %s ."
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:525
+msgid "PrusaSlicer is closing: Unsaved Changes"
+msgstr "Zamykanie PrusaSlicer: niezapisane zmiany"
+
+#: src/slic3r/GUI/OpenGLManager.cpp:259
+#, possible-c-format
+msgid "PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \nwhile OpenGL version %s, render %s, vendor %s was detected."
+msgstr "PrusaSlicer wymaga karty graficznej kompatybilnej z OpenGL 2.0, aby działać prawidłowo.\nwykryto OpenGL w wersji %s, render %s, producent %s ."
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:50
msgid "PrusaSlicer version"
msgstr "wersja PrusaSlicer"
-#: src/slic3r/GUI/ConfigWizard.cpp:815
-msgid ""
-"PrusaSlicer's user interfaces comes in three variants:\n"
-"Simple, Advanced, and Expert.\n"
-"The Simple mode shows only the most frequently used settings relevant for regular 3D printing. The other two offer progressively more sophisticated fine-tuning, they are suitable for advanced and expert users, respectively."
-msgstr ""
-"Interfejs PrusaSlicer ma trzy warianty do wyboru:\n"
-"Prosty, Zaawansowany i Ekspercki.\n"
-"Tryb Prosty wyświetla tylko najczęściej używane ustawienia potrzebne w codziennym druku 3D. Pozostałe dwa oferują coraz większe możliwości konfiguracji i są przeznaczone odpowiednio dla użytkowników zaawansowanych i ekspertów."
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:662
+msgid "PrusaSlicer will remember your action."
+msgstr "PrusaSlicer zapamięta tą czynność."
-#: src/libslic3r/PrintConfig.cpp:2254
+#: src/slic3r/GUI/ConfigWizard.cpp:1174
+msgid "PrusaSlicer's user interfaces comes in three variants:\nSimple, Advanced, and Expert.\nThe Simple mode shows only the most frequently used settings relevant for regular 3D printing. The other two offer progressively more sophisticated fine-tuning, they are suitable for advanced and expert users, respectively."
+msgstr "Interfejs PrusaSlicer ma trzy warianty do wyboru:\nProsty, Zaawansowany i Ekspercki.\nTryb Prosty wyświetla tylko najczęściej używane ustawienia potrzebne w codziennym druku 3D. Pozostałe dwa oferują coraz większe możliwości konfiguracji i są przeznaczone odpowiednio dla użytkowników zaawansowanych i ekspertów."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:668
+msgid "PrusaSlicer: Don't ask me again"
+msgstr "PrusaSlicer: nie pytaj ponownie"
+
+#: src/libslic3r/PrintConfig.cpp:2397
msgid "Purging after toolchange will done inside this object's infills. This lowers the amount of waste but may result in longer print time due to additional travel moves."
msgstr "Czyszczenie po zmianie filamentu następować wewnątrz wypełnienia tego modelu. Obniża to ilość zużywanego materiału, jednak może skutkować wydłużeniem czasu druku przez dodatkowe ruchy jałowe."
-#: src/slic3r/GUI/Plater.cpp:544
+#: src/slic3r/GUI/Plater.cpp:410
msgid "Purging volumes"
msgstr "Objętości czyszczenia"
-#: src/libslic3r/PrintConfig.cpp:2207
+#: src/libslic3r/PrintConfig.cpp:2350
msgid "Purging volumes - load/unload volumes"
msgstr "Objętość czyszczenia - objętość ładowania/rozładowania"
-#: src/libslic3r/PrintConfig.cpp:2214
+#: src/libslic3r/PrintConfig.cpp:2357
msgid "Purging volumes - matrix"
msgstr "Objętości czyszczenia - formuła"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44
+#: src/libslic3r/PrintConfig.cpp:1201
+msgid "Purpose of Machine Limits"
+msgstr "Cel limitów maszynowych"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43
msgid "Quality"
msgstr "Jakość"
-#: src/slic3r/GUI/Tab.cpp:1080
+#: src/slic3r/GUI/Tab.cpp:1402
msgid "Quality (slower slicing)"
msgstr "Jakość (wolniejsze cięcie)"
-#: src/slic3r/GUI/GLCanvas3D.cpp:273
+#: src/slic3r/GUI/GLCanvas3D.cpp:260
msgid "Quality / Speed"
msgstr "Jakość / Prędkość"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1182
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1530
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1536
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1849
-#, c-format
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61
+msgid "Quick"
+msgstr "Szybka"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1306
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1661
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1667
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2008
+#, possible-c-format
msgid "Quick Add Settings (%s)"
-msgstr "Szybkie Dodanie Ustawień (%s)"
+msgstr "Szybkie dodanie ustawień (%s)"
-#: src/slic3r/GUI/MainFrame.cpp:512
+#: src/slic3r/GUI/MainFrame.cpp:1113
msgid "Quick Slice"
msgstr "Szybkie Cięcie"
-#: src/slic3r/GUI/MainFrame.cpp:518
+#: src/slic3r/GUI/MainFrame.cpp:1119
msgid "Quick Slice and Save As"
msgstr "Szybkie cięcie i Zapis jako"
-#: src/slic3r/GUI/MainFrame.cpp:540
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:1144 src/slic3r/GUI/MainFrame.cpp:1402
+#, possible-c-format
msgid "Quit %s"
msgstr "Wyjście z %s"
-#: src/slic3r/GUI/GLCanvas3D.cpp:294 src/libslic3r/PrintConfig.cpp:511
+#: src/slic3r/GUI/GUI_App.cpp:396
+msgid "Quit, I will move my data now"
+msgstr "Zamknij, przeniosÄ™ teraz swoje dane"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:280 src/libslic3r/PrintConfig.cpp:547
msgid "Radius"
msgstr "Promień"
-#: src/slic3r/GUI/Tab.cpp:1127
+#: src/slic3r/GUI/Tab.cpp:1456
msgid "Raft"
msgstr "Tratwa (raft)"
-#: src/libslic3r/PrintConfig.cpp:1501
+#: src/libslic3r/PrintConfig.cpp:1609
msgid "Raft layers"
msgstr "Warstwy tratwy"
@@ -5756,14 +6841,8 @@ msgid "Ramming customization"
msgstr "Dostosowywanie wyciskania"
#: src/slic3r/GUI/WipeTowerDialog.cpp:41
-msgid ""
-"Ramming denotes the rapid extrusion just before a tool change in a single-extruder MM printer. Its purpose is to properly shape the end of the unloaded filament so it does not prevent insertion of the new filament and can itself be reinserted later. This phase is important and different materials can require different extrusion speeds to get the good shape. For this reason, the extrusion rates during ramming are adjustable.\n"
-"\n"
-"This is an expert-level setting, incorrect adjustment will likely lead to jams, extruder wheel grinding into filament etc."
-msgstr ""
-"Wyciskanie oznacza szybką ekstruzję bezpośrednio przed zmianą narzędzia w drukarce typu MultiMaterial z jednym ekstruderem (narzędzie w tym przypadku oznacza filament). Jego zadaniem jest odpowiednie ukształtowanie końcówki rozładowywanego filamentu, aby jego ponowne załadowanie mogło odbyć się bez przeszkód. Ta faza procesu zmiany filamentu jest bardzo ważna a różne filamenty mogą potrzebować różnej prędkości wyciskania aby uzyskać odpowiedni kształt końcówki. Z tego powodu można edytować jego parametry.\n"
-"\n"
-"To jest ustawienie dla zaawansowanych użytkowników. Nieprawidłowe wartości mogą powodować blokady, ścieranie filamentu przez radełko itp."
+msgid "Ramming denotes the rapid extrusion just before a tool change in a single-extruder MM printer. Its purpose is to properly shape the end of the unloaded filament so it does not prevent insertion of the new filament and can itself be reinserted later. This phase is important and different materials can require different extrusion speeds to get the good shape. For this reason, the extrusion rates during ramming are adjustable.\n\nThis is an expert-level setting, incorrect adjustment will likely lead to jams, extruder wheel grinding into filament etc."
+msgstr "Wyciskanie oznacza szybką ekstruzję bezpośrednio przed zmianą narzędzia w drukarce typu MultiMaterial z jednym ekstruderem (narzędzie w tym przypadku oznacza filament). Jego zadaniem jest odpowiednie ukształtowanie końcówki rozładowywanego filamentu, aby jego ponowne załadowanie mogło odbyć się bez przeszkód. Ta faza procesu zmiany filamentu jest bardzo ważna, a różne filamenty mogą potrzebować różnej prędkości wyciskania aby uzyskać odpowiedni kształt końcówki. Z tego powodu można edytować jego parametry.\n\nTo jest ustawienie dla zaawansowanych użytkowników. Nieprawidłowe wartości mogą powodować blokady, ścieranie filamentu przez radełko itp."
#: src/slic3r/GUI/WipeTowerDialog.cpp:91
msgid "Ramming line spacing"
@@ -5773,27 +6852,27 @@ msgstr "Rozstaw linii wyciskania"
msgid "Ramming line width"
msgstr "Szerokość linii wyciskania"
-#: src/libslic3r/PrintConfig.cpp:694
+#: src/libslic3r/PrintConfig.cpp:730
msgid "Ramming parameters"
msgstr "Parametry wyciskania"
-#: src/slic3r/GUI/Tab.cpp:1505
+#: src/slic3r/GUI/Tab.cpp:1850
msgid "Ramming settings"
msgstr "Ustawienia wyciskania"
-#: src/libslic3r/PrintConfig.cpp:1629
+#: src/libslic3r/PrintConfig.cpp:1737
msgid "Random"
msgstr "Dowolny"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:94
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:96
msgid "Range"
msgstr "Zakres"
-#: src/libslic3r/SLAPrintSteps.cpp:65
+#: src/libslic3r/SLAPrintSteps.cpp:66
msgid "Rasterizing layers"
msgstr "Rasteryzowanie warstw"
-#: src/slic3r/GUI/MainFrame.cpp:596
+#: src/slic3r/GUI/MainFrame.cpp:1202
msgid "Re&load from disk"
msgstr "Wczytaj ponownie z d&ysku"
@@ -5805,59 +6884,60 @@ msgstr "Ponowna konfiguracja"
msgid "Ready"
msgstr "Gotowe"
-#: src/slic3r/GUI/Plater.cpp:3115
+#: src/slic3r/GUI/Plater.cpp:2915
msgid "Ready to slice"
msgstr "Gotowość do cięcia"
-#: src/slic3r/GUI/MainFrame.cpp:669 src/libslic3r/PrintConfig.cpp:1632
+#: src/slic3r/GUI/MainFrame.cpp:966 src/slic3r/GUI/MainFrame.cpp:1286
+#: src/libslic3r/PrintConfig.cpp:1740
msgid "Rear"
msgstr "Tył"
-#: src/slic3r/GUI/MainFrame.cpp:669
+#: src/slic3r/GUI/MainFrame.cpp:966 src/slic3r/GUI/MainFrame.cpp:1286
msgid "Rear View"
msgstr "Widok z tyłu"
-#: src/slic3r/GUI/MainFrame.cpp:413
+#: src/slic3r/GUI/MainFrame.cpp:994
msgid "Recent projects"
msgstr "Ostatni&e projekty"
-#: src/slic3r/GUI/PresetHints.cpp:263
-#, c-format
+#: src/slic3r/GUI/PresetHints.cpp:262
+#, possible-c-format
msgid "Recommended object thin wall thickness for layer height %.2f and"
msgstr "Zalecana grubość ściany modelu dla wysokości warstwy %.2f i"
-#: src/slic3r/GUI/PresetHints.cpp:274
+#: src/slic3r/GUI/PresetHints.cpp:273
msgid "Recommended object thin wall thickness: Not available due to excessively small extrusion width."
msgstr "Zalecana grubość ścian dla modelu: niedostępna ze względu na zbyt małą szerokość ścieżki."
-#: src/slic3r/GUI/PresetHints.cpp:247
+#: src/slic3r/GUI/PresetHints.cpp:246
msgid "Recommended object thin wall thickness: Not available due to invalid layer height."
msgstr "Zalecana grubość ścian dla modelu: niedostępna ze względu na niewłaściwą wysokość warstwy."
-#: src/slic3r/GUI/GUI_App.cpp:450 src/slic3r/GUI/GUI_App.cpp:459
+#: src/slic3r/GUI/GUI_App.cpp:1102 src/slic3r/GUI/GUI_App.cpp:1115
msgid "Recreating"
msgstr "Odtwarzanie"
-#: src/slic3r/GUI/BedShapeDialog.cpp:73
+#: src/slic3r/GUI/BedShapeDialog.cpp:141
msgid "Rectangular"
msgstr "ProstokÄ…tny"
-#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:843
-#: src/libslic3r/PrintConfig.cpp:2009
+#: src/libslic3r/PrintConfig.cpp:460 src/libslic3r/PrintConfig.cpp:881
+#: src/libslic3r/PrintConfig.cpp:2151
msgid "Rectilinear"
msgstr "Linie równoległe"
-#: src/libslic3r/PrintConfig.cpp:2010
+#: src/libslic3r/PrintConfig.cpp:2152
msgid "Rectilinear grid"
msgstr "Linie równoległe - kratka"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4657 src/slic3r/GUI/KBShortcutsDialog.cpp:131
-#: src/slic3r/GUI/MainFrame.cpp:584
+#: src/slic3r/GUI/GLCanvas3D.cpp:5067 src/slic3r/GUI/KBShortcutsDialog.cpp:126
+#: src/slic3r/GUI/MainFrame.cpp:1190
msgid "Redo"
msgstr "Powtórz"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4065
-#, c-format
+#: src/slic3r/GUI/GLCanvas3D.cpp:4382
+#, possible-c-format
msgid "Redo %1$d Action"
msgid_plural "Redo %1$d Actions"
msgstr[0] "Powtórz %1$d akcję"
@@ -5865,152 +6945,184 @@ msgstr[1] "Powtórz %1$d akcje"
msgstr[2] "Powtórz %1$d akcji"
msgstr[3] "Powtórz %1$d akcji"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4047
+#: src/slic3r/GUI/GLCanvas3D.cpp:4361
msgid "Redo History"
msgstr "Historia Powtórzeń"
-#: src/slic3r/GUI/Tab.cpp:1098
+#: src/slic3r/GUI/Tab.cpp:1426
msgid "Reducing printing time"
msgstr "Obniżanie czasu wydruku"
-#: src/slic3r/GUI/Plater.cpp:3452
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:327
+msgid "Refresh Printers"
+msgstr "Odśwież drukarki"
+
+#: src/libslic3r/PrintConfig.cpp:145
+msgid "Related printer preset name"
+msgstr "Nazwa powiązanego zestawu ustawień drukarki"
+
+#: src/slic3r/GUI/Plater.cpp:3257
msgid "Reload all from disk"
msgstr "Wczytaj ponownie wszystko z dysku"
-#: src/slic3r/GUI/ConfigWizard.cpp:798 src/slic3r/GUI/GUI_ObjectList.cpp:1664
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3956 src/slic3r/GUI/Plater.cpp:3225
-#: src/slic3r/GUI/Plater.cpp:3934 src/slic3r/GUI/Plater.cpp:3963
+#: src/slic3r/GUI/ConfigWizard.cpp:1157 src/slic3r/GUI/GUI_ObjectList.cpp:1793
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4439 src/slic3r/GUI/Plater.cpp:3028
+#: src/slic3r/GUI/Plater.cpp:3852 src/slic3r/GUI/Plater.cpp:3881
msgid "Reload from disk"
msgstr "Wczytaj ponownie z dysku"
-#: src/slic3r/GUI/Plater.cpp:3339
+#: src/slic3r/GUI/Plater.cpp:3142
msgid "Reload from:"
msgstr "Wczytaj z:"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:134
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:129
msgid "Reload plater from disk"
msgstr "Przeładuj wirtualny stół z dysku"
-#: src/slic3r/GUI/MainFrame.cpp:597
+#: src/slic3r/GUI/MainFrame.cpp:1203
msgid "Reload the plater from disk"
msgstr "Przeładuj wirtualny stół z dysku"
-#: src/slic3r/GUI/Plater.cpp:3963
+#: src/slic3r/GUI/Plater.cpp:3881
msgid "Reload the selected object from disk"
msgstr "Wczytaj wybrany model ponownie z dysku"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1664
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3956 src/slic3r/GUI/Plater.cpp:3934
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1793
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4439 src/slic3r/GUI/Plater.cpp:3852
msgid "Reload the selected volumes from disk"
msgstr "Wczytaj wybrane kształty ponownie z dysku"
-#: src/slic3r/GUI/Preferences.cpp:39
+#: src/slic3r/GUI/GCodeViewer.cpp:2442 src/slic3r/GUI/GCodeViewer.cpp:2445
+msgid "Remaining time"
+msgstr "Pozostały czas"
+
+#: src/slic3r/GUI/GUI_App.cpp:720 src/slic3r/GUI/UnsavedChangesDialog.cpp:653
+msgid "Remember my choice"
+msgstr "Zapamiętaj mój wybór"
+
+#: src/slic3r/GUI/Preferences.cpp:52
msgid "Remember output directory"
msgstr "Zapamiętaj katalog wyjściowy"
-#: src/slic3r/GUI/Tab.cpp:3121
+#: src/slic3r/GUI/MainFrame.cpp:166
+msgid "Remember to check for updates at https://github.com/prusa3d/PrusaSlicer/releases"
+msgstr "Pamiętaj, aby sprawdzać aktualizacje na https://github.com/prusa3d/PrusaSlicer/releases"
+
+#: src/slic3r/GUI/Tab.cpp:3386
msgid "remove"
msgstr "usuń"
-#: src/slic3r/GUI/BedShapeDialog.cpp:190 src/slic3r/GUI/BedShapeDialog.cpp:269
-#: src/slic3r/GUI/Tab.cpp:3124
+#: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/BedShapeDialog.cpp:413
+#: src/slic3r/GUI/Tab.cpp:3423
msgid "Remove"
msgstr "Usuń"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48
msgid "Remove all holes"
msgstr "Usuń wszystkie otwory"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50
msgid "Remove all points"
msgstr "Usuń wszystkie punkty"
-#: src/slic3r/GUI/GLCanvas3D.cpp:246
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35
+msgid "Remove all selection"
+msgstr "Usuń całe zaznaczenie"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:239
msgid "Remove detail"
msgstr "Niższa szczegółowość"
-#: src/slic3r/GUI/Plater.cpp:879
-msgid "Remove device"
-msgstr "Odłącz urządzenie"
-
#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:182
msgid "Remove extruder from sequence"
msgstr "Usuń ekstruder z sekwencji"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4537 src/slic3r/GUI/Plater.cpp:3942
+#: src/slic3r/GUI/GLCanvas3D.cpp:4903 src/slic3r/GUI/Plater.cpp:3860
msgid "Remove instance"
msgstr "Usuń instancję"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:160
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:154
msgid "Remove Instance of the selected object"
msgstr "Usuń instancję zaznaczonego modelu"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:153
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:161
msgid "Remove layer range"
msgstr "Usuń zakres warstw"
-#: src/slic3r/GUI/Plater.cpp:3942
+#: src/slic3r/GUI/Plater.cpp:3860
msgid "Remove one instance of the selected object"
msgstr "Usuń jedną instancję zaznaczonego modelu"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:95
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:98
msgid "Remove parameter"
msgstr "Usuń parametr"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211
msgid "Remove point"
msgstr "Usuń punkt"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214
msgid "Remove point from selection"
msgstr "Usuń punkt z zaznaczenia"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47
msgid "Remove selected holes"
msgstr "Usuń zaznaczone otwory"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1371
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218
msgid "Remove selected points"
msgstr "Usuń zaznaczone punkty"
-#: src/slic3r/GUI/Plater.cpp:3931 src/slic3r/GUI/Plater.cpp:3953
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:368
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:378
+msgid "Remove selection"
+msgstr "Usuń zaznaczenie"
+
+#: src/slic3r/GUI/Plater.cpp:3849 src/slic3r/GUI/Plater.cpp:3871
msgid "Remove the selected object"
msgstr "Usuń wybrany model"
-#: src/slic3r/GUI/ConfigWizard.cpp:453
+#: src/slic3r/GUI/ConfigWizard.cpp:456
msgid "Remove user profiles (a snapshot will be taken beforehand)"
msgstr "Usuń profile użytkownika (zostanie wykonany zrzut)"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1636
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1765
msgid "Rename"
msgstr "Zmień nazwę"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:589
msgid "Rename Object"
msgstr "Zmień Nazwę Modelu"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:589
msgid "Rename Sub-object"
msgstr "Zmień Nazwę Modelu Podrzędnego"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3803
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4266
msgid "Renaming"
msgstr "Zmiana nazwy"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:115
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:150
msgid "Renaming of the G-code after copying to the selected destination folder has failed. Current path is %1%.tmp. Please try exporting again."
msgstr "Niepowodzenie zmiany nazwy pliku G-code po skopiowaniu do folderu docelowego. Obecna ścieżka to %1%.tmp. Spróbuj wyeksportować G-code ponownie."
-#: src/libslic3r/PrintConfig.cpp:3515
+#: src/slic3r/GUI/Preferences.cpp:255
+msgid "Render"
+msgstr "Render"
+
+#: src/libslic3r/PrintConfig.cpp:3720
msgid "Render with a software renderer"
msgstr "Renderuj programowo"
-#: src/libslic3r/PrintConfig.cpp:3516
+#: src/libslic3r/PrintConfig.cpp:3721
msgid "Render with a software renderer. The bundled MESA software renderer is loaded instead of the default OpenGL driver."
msgstr "Renderowanie software'owe. Dołączony silnik MESA zostanie użyty zamiast domyślnego OpenGL."
-#: src/slic3r/GUI/MainFrame.cpp:911 src/libslic3r/PrintConfig.cpp:3447
+#: src/slic3r/GUI/MainFrame.cpp:1612 src/libslic3r/PrintConfig.cpp:3646
msgid "Repair"
msgstr "Naprawa"
@@ -6034,39 +7146,39 @@ msgstr "Naprawiony plik 3MF nie zawiera żadnej objętości"
msgid "Repairing model by the Netfabb service"
msgstr "Naprawianie modelu przez usługę Netfabb"
-#: src/slic3r/GUI/MainFrame.cpp:524
+#: src/slic3r/GUI/MainFrame.cpp:1125
msgid "Repeat last quick slice"
msgstr "Powtórz ostatnie szybkie cięcie"
-#: src/slic3r/GUI/MainFrame.cpp:524
+#: src/slic3r/GUI/MainFrame.cpp:1125
msgid "Repeat Last Quick Slice"
msgstr "Powtórz Ostatnie Szybkie Cięcie"
-#: src/slic3r/GUI/Tab.cpp:3083
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:477
msgid "Replace?"
msgstr "Zamienić?"
-#: src/slic3r/GUI/MainFrame.cpp:703
+#: src/slic3r/GUI/MainFrame.cpp:928 src/slic3r/GUI/MainFrame.cpp:1327
msgid "Report an I&ssue"
msgstr "Zgło&szenie problemu"
-#: src/slic3r/GUI/MainFrame.cpp:703
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:928 src/slic3r/GUI/MainFrame.cpp:1327
+#, possible-c-format
msgid "Report an issue on %s"
msgstr "Zgłoś problem z %s"
-#: src/slic3r/Utils/PresetUpdater.cpp:713
-#, c-format
+#: src/slic3r/Utils/PresetUpdater.cpp:733
+#, possible-c-format
msgid "requires max. %s"
msgstr "wymaga max %s"
-#: src/slic3r/Utils/PresetUpdater.cpp:710
-#, c-format
+#: src/slic3r/Utils/PresetUpdater.cpp:730
+#, possible-c-format
msgid "requires min. %s"
msgstr "wymaga min. %s"
-#: src/slic3r/Utils/PresetUpdater.cpp:705
-#, c-format
+#: src/slic3r/Utils/PresetUpdater.cpp:726
+#, possible-c-format
msgid "requires min. %s and max. %s"
msgstr "wymaga min. %s i max. %s"
@@ -6074,270 +7186,304 @@ msgstr "wymaga min. %s i max. %s"
msgid "Rescan"
msgstr "Skanuj ponownie"
-#: src/slic3r/GUI/Tab.cpp:1906
-msgid "Rescan serial ports"
-msgstr "Przeskanuj porty szeregowe"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:313
+#: src/slic3r/GUI/GLCanvas3D.cpp:299
msgid "Reset"
msgstr "Reset"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1373
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220
msgid "Reset clipping plane"
msgstr "Reset płaszczyzny przecinania"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:59
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:26
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58
msgid "Reset direction"
msgstr "Reset kierunku"
-#: src/slic3r/GUI/Plater.cpp:2723
+#: src/slic3r/GUI/Plater.cpp:2684
msgid "Reset Project"
msgstr "Resetuj Projekt"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:372
msgid "Reset rotation"
msgstr "Resetuj obrót"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:394
msgid "Reset Rotation"
msgstr "Resetuj Obrót"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:397
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:407
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409
msgid "Reset scale"
msgstr "Resetuj skalÄ™"
-#: src/slic3r/GUI/GLCanvas3D.cpp:252
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:136
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:118
+msgid "Reset selection"
+msgstr "Reset zaznaczenia"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:243
msgid "Reset to base"
msgstr "Resetuj do bazowego ust"
-#: src/slic3r/GUI/Tab.cpp:2394
+#: src/slic3r/GUI/Tab.cpp:2564
msgid "Reset to Filament Color"
msgstr "Zresetuj do koloru filamentu"
-#: src/libslic3r/PrintConfig.cpp:1511
+#: src/libslic3r/PrintConfig.cpp:1619
msgid "Resolution"
msgstr "Rozdzielczość"
-#: src/libslic3r/PrintConfig.cpp:1529
+#: src/libslic3r/PrintConfig.cpp:1637
msgid "Retract amount before wipe"
msgstr "Długość retrakcji przed ruchem czyszczącym"
-#: src/libslic3r/PrintConfig.cpp:1537
+#: src/libslic3r/PrintConfig.cpp:1645
msgid "Retract on layer change"
msgstr "Retrakcja przy zmianie warstwy"
-#: src/slic3r/GUI/Tab.cpp:1324 src/slic3r/GUI/Tab.cpp:1383
-#: src/slic3r/GUI/Tab.cpp:2370
+#: src/slic3r/GUI/GCodeViewer.cpp:2494 src/slic3r/GUI/Tab.cpp:1670
+#: src/slic3r/GUI/Tab.cpp:2539
msgid "Retraction"
msgstr "Retrakcja"
-#: src/libslic3r/PrintConfig.cpp:1523
+#: src/libslic3r/PrintConfig.cpp:1631
msgid "Retraction is not triggered when travel moves are shorter than this length."
msgstr "Retrakcja nie zostanie wykonana przy ruchu jałowym krótszym niż ta wartość."
-#: src/libslic3r/PrintConfig.cpp:1544
+#: src/libslic3r/PrintConfig.cpp:1652
msgid "Retraction Length"
msgstr "Długość retrakcji"
-#: src/libslic3r/PrintConfig.cpp:1552
+#: src/libslic3r/PrintConfig.cpp:1660
msgid "Retraction Length (Toolchange)"
msgstr "Długość Retrakcji (zmiana narzędzia)"
-#: src/libslic3r/PrintConfig.cpp:1604 src/libslic3r/PrintConfig.cpp:1605
+#: src/libslic3r/PrintConfig.cpp:1712 src/libslic3r/PrintConfig.cpp:1713
msgid "Retraction Speed"
msgstr "Prędkość retrakcji"
-#: src/slic3r/GUI/Tab.cpp:2386
+#: src/slic3r/GUI/Tab.cpp:2555
msgid "Retraction when tool is disabled (advanced settings for multi-extruder setups)"
msgstr "Retrakcja gdy dany ekstruder nie jest w użyciu (funkcja zaawansowana dla drukarek z kilkoma ekstruderami)"
-#: src/slic3r/GUI/GUI_Preview.cpp:254
+#: src/slic3r/GUI/GCodeViewer.cpp:2528 src/slic3r/GUI/GUI_Preview.cpp:336
+#: src/slic3r/GUI/GUI_Preview.cpp:1472
msgid "Retractions"
msgstr "Retrakcje"
-#: src/slic3r/GUI/MainFrame.cpp:673
+#: src/slic3r/GUI/Preferences.cpp:198
+msgid "Reverse direction of zoom with mouse wheel"
+msgstr "Odwróć kierunek zoomu kółkiem myszy"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1861 src/slic3r/GUI/Plater.cpp:4886
+msgid "Revert conversion from imperial units"
+msgstr "Odwróć konwersję z jednostek imperialnych"
+
+#: src/slic3r/GUI/MainFrame.cpp:970 src/slic3r/GUI/MainFrame.cpp:1290
msgid "Right"
msgstr "Prawo"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:402
+#: src/slic3r/GUI/GUI_ObjectList.cpp:449
msgid "Right button click the icon to change the object printable property"
msgstr "Kliknij na ikonę prawym przyciskiem, aby włączyć/wyłączyć drukowanie modelu"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:396
+#: src/slic3r/GUI/GUI_ObjectList.cpp:443
msgid "Right button click the icon to change the object settings"
msgstr "Kliknij na ikonę prawym przyciskiem, aby zmienić ustawienia modelu"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:359
+#: src/slic3r/GUI/GUI_ObjectList.cpp:406
msgid "Right button click the icon to fix STL through Netfabb"
msgstr "Kliknij prawym przyciskiem myszy na ikonę, aby naprawić plik STL przez serwis Netfabb"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211
msgid "Right click"
msgstr "Prawy przycisk"
-#: src/slic3r/GUI/GLCanvas3D.cpp:243
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31
+msgid "Right mouse button"
+msgstr "Prawy przycisk myszy"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:237
msgid "Right mouse button:"
-msgstr "Prawy przycisk myszki:"
+msgstr "Prawy przycisk myszy:"
-#: src/slic3r/GUI/MainFrame.cpp:673
+#: src/slic3r/GUI/MainFrame.cpp:970 src/slic3r/GUI/MainFrame.cpp:1290
msgid "Right View"
msgstr "Widok prawy"
-#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:449
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:480
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:499
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:517
-#: src/libslic3r/PrintConfig.cpp:3451
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:513
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:527
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562
+#: src/libslic3r/PrintConfig.cpp:3650
msgid "Rotate"
msgstr "Obróć"
-#: src/libslic3r/PrintConfig.cpp:3456
+#: src/libslic3r/PrintConfig.cpp:3655
msgid "Rotate around X"
msgstr "Obróć wokół osi X"
-#: src/libslic3r/PrintConfig.cpp:3461
+#: src/libslic3r/PrintConfig.cpp:3660
msgid "Rotate around Y"
msgstr "Obróć wokół osi Y"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:172
msgid "Rotate lower part upwards"
msgstr "Obróć dolną część do góry nogami"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
msgid "Rotate selection 45 degrees CCW"
msgstr "Obróć zaznaczone o 45 stopni w lewo"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
msgid "Rotate selection 45 degrees CW"
msgstr "Obróć zaznaczone o 45 stopni w prawo"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:458
-#: src/slic3r/GUI/Mouse3DController.cpp:304
-#: src/slic3r/GUI/Mouse3DController.cpp:321
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:210
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:224
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:506
+#: src/slic3r/GUI/Mouse3DController.cpp:288
+#: src/slic3r/GUI/Mouse3DController.cpp:309
msgid "Rotation"
msgstr "Obrót"
-#: src/libslic3r/PrintConfig.cpp:3457
+#: src/libslic3r/PrintConfig.cpp:3656
msgid "Rotation angle around the X axis in degrees."
msgstr "Kąt obrotu w stopniach wokół osi X."
-#: src/libslic3r/PrintConfig.cpp:3462
+#: src/libslic3r/PrintConfig.cpp:3661
msgid "Rotation angle around the Y axis in degrees."
msgstr "Kąt obrotu w stopniach wokół osi Y."
-#: src/libslic3r/PrintConfig.cpp:3452
+#: src/libslic3r/PrintConfig.cpp:3651
msgid "Rotation angle around the Z axis in degrees."
msgstr "Kąt obrotu w stopniach wokół osi Z."
-#: src/slic3r/GUI/GUI_App.cpp:797
-#, c-format
+#: src/slic3r/GUI/DoubleSlider.cpp:1836
+msgid "Ruler mode"
+msgstr "Tryb linijki"
+
+#: src/slic3r/GUI/GUI_App.cpp:1474
+#, possible-c-format
msgid "Run %s"
msgstr "Uruchom %s"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:128
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:478
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:163
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:520
msgid "Running post-processing scripts"
msgstr "Wykonywanie skryptów przetwarzania końcowego (post-processing)"
#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83
-#: src/libslic3r/PrintConfig.cpp:644 src/libslic3r/PrintConfig.cpp:688
-#: src/libslic3r/PrintConfig.cpp:703 src/libslic3r/PrintConfig.cpp:2408
-#: src/libslic3r/PrintConfig.cpp:2417 src/libslic3r/PrintConfig.cpp:2527
-#: src/libslic3r/PrintConfig.cpp:2535 src/libslic3r/PrintConfig.cpp:2543
-#: src/libslic3r/PrintConfig.cpp:2550 src/libslic3r/PrintConfig.cpp:2558
-#: src/libslic3r/PrintConfig.cpp:2566
+#: src/libslic3r/PrintConfig.cpp:680 src/libslic3r/PrintConfig.cpp:724
+#: src/libslic3r/PrintConfig.cpp:739 src/libslic3r/PrintConfig.cpp:2551
+#: src/libslic3r/PrintConfig.cpp:2560 src/libslic3r/PrintConfig.cpp:2670
+#: src/libslic3r/PrintConfig.cpp:2678 src/libslic3r/PrintConfig.cpp:2686
+#: src/libslic3r/PrintConfig.cpp:2693 src/libslic3r/PrintConfig.cpp:2701
+#: src/libslic3r/PrintConfig.cpp:2709
msgid "s"
msgstr ""
-#: src/slic3r/GUI/MainFrame.cpp:481 src/slic3r/GUI/MainFrame.cpp:750
+#: src/slic3r/GUI/MainFrame.cpp:1072 src/slic3r/GUI/MainFrame.cpp:1449
msgid "S&end G-code"
msgstr "Wyślij G-cod&e"
-#: src/slic3r/GUI/MainFrame.cpp:750
+#: src/slic3r/GUI/MainFrame.cpp:1449
msgid "S&end to print"
msgstr "W&yślij do druku"
-#. TRN Preset
-#: src/slic3r/GUI/Tab.cpp:3417
-#, c-format
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:642
+msgid "Save"
+msgstr "Zapisz"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:72
+#, possible-c-format
msgid "Save %s as:"
msgstr "Zapisz %s jako:"
-#: src/slic3r/GUI/MainFrame.cpp:826
-#, c-format
+#: src/slic3r/GUI/MainFrame.cpp:1527
+#, possible-c-format
msgid "Save %s file as:"
msgstr "Zapisz plik %s jako:"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1046
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912
msgid "Save changes?"
msgstr "Zapisać zmiany?"
-#: src/libslic3r/PrintConfig.cpp:3386
+#: src/libslic3r/PrintConfig.cpp:3585
msgid "Save config file"
msgstr "Zapisz plik konfiguracyjny"
-#: src/slic3r/GUI/MainFrame.cpp:925
+#: src/slic3r/GUI/MainFrame.cpp:1626
msgid "Save configuration as:"
msgstr "Zapisz konfiguracjÄ™ jako:"
-#: src/libslic3r/PrintConfig.cpp:3387
+#: src/libslic3r/PrintConfig.cpp:3586
msgid "Save configuration to the specified file."
msgstr "Zapisz konfiguracjÄ™ jako wskazany plik."
#. TRN "Save current Settings"
-#: src/slic3r/GUI/Tab.cpp:133
-#, c-format
+#: src/slic3r/GUI/Tab.cpp:203
+#, possible-c-format
msgid "Save current %s"
msgstr "Zapisz bieżące %s"
-#: src/slic3r/GUI/MainFrame.cpp:446
+#: src/slic3r/GUI/MainFrame.cpp:1028
msgid "Save current project file"
msgstr "Zapisz obecny projekt"
-#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452
+#: src/slic3r/GUI/MainFrame.cpp:1032 src/slic3r/GUI/MainFrame.cpp:1034
msgid "Save current project file as"
msgstr "Zapisz obecny projekt jako"
-#: src/slic3r/GUI/Plater.cpp:2604
+#: src/slic3r/GUI/Plater.cpp:2566
msgid "Save file as:"
msgstr "Zapisz plik jako:"
-#: src/slic3r/GUI/Plater.cpp:4839
+#: src/slic3r/GUI/Plater.cpp:4975
msgid "Save G-code file as:"
msgstr "Zapisz plik G-code jako:"
-#: src/slic3r/GUI/MainFrame.cpp:899
+#: src/slic3r/GUI/MainFrame.cpp:1600
msgid "Save OBJ file (less prone to coordinate errors than STL) as:"
msgstr "Zapisz plik OBJ (mniej podatny na błędy współrzędnych niż STL) jako:"
-#: src/slic3r/GUI/Tab.hpp:443
+#: src/slic3r/GUI/SavePresetDialog.cpp:190
+#: src/slic3r/GUI/SavePresetDialog.cpp:196
msgid "Save preset"
msgstr "Zapisz zestaw ustawień"
-#: src/slic3r/GUI/MainFrame.cpp:980
+#: src/slic3r/GUI/MainFrame.cpp:1681
msgid "Save presets bundle as:"
msgstr "Zapisz paczkę ustawień jako:"
-#: src/slic3r/GUI/MainFrame.cpp:450 src/slic3r/GUI/MainFrame.cpp:452
+#: src/slic3r/GUI/MainFrame.cpp:1032 src/slic3r/GUI/MainFrame.cpp:1034
msgid "Save Project &as"
msgstr "Zapisz Projekt j&ako"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:114
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:107
msgid "Save project (3mf)"
msgstr "Zapisz Projekt (3mf)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:115
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:108
msgid "Save project as (3mf)"
msgstr "Zapisz Projekt jako (3mf)"
-#: src/slic3r/GUI/Plater.cpp:4839
+#: src/slic3r/GUI/Plater.cpp:4975
msgid "Save SL1 file as:"
msgstr "Zapisz plik SL1 jako:"
-#: src/slic3r/GUI/MainFrame.cpp:838
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:744
+msgid "Save the selected options to preset \"%1%\"."
+msgstr "Zapisz wybrane opcje w zestawie ustawień \"%1%\"."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:740
+msgid "Save the selected options."
+msgstr "Zapisz wybrane opcje."
+
+#: src/slic3r/GUI/MainFrame.cpp:1539
msgid "Save zip file as:"
msgstr "Zapisz plik .zip jako:"
@@ -6347,221 +7493,244 @@ msgstr "Zapisz plik .zip jako:"
msgid "Saving mesh into the 3MF container failed."
msgstr "Niepowodzenie zapisywania siatki jako 3MF."
-#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:47
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:230
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:500
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:518
-#: src/libslic3r/PrintConfig.cpp:3466
+#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:78
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:238
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:547
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563
+#: src/libslic3r/PrintConfig.cpp:3665
msgid "Scale"
msgstr "Skaluj"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:459
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:507
msgid "Scale factors"
msgstr "Współczynnik skalowania"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:196
-msgid ""
-"Scale selection to fit print volume\n"
-"in Gizmo scale"
-msgstr ""
-"Skaluj zaznaczenie do wielkości przestrzeni roboczej\n"
-"w skalowaniu z uchwytem"
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1724
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1852
msgid "Scale the selected object to fit the print volume"
msgstr "Skaluj wybrany model, aby zmieścił się w przestrzeni roboczej"
-#: src/libslic3r/PrintConfig.cpp:3475
+#: src/libslic3r/PrintConfig.cpp:3674
msgid "Scale to Fit"
msgstr "Skaluj, aby dopasować"
-#: src/slic3r/GUI/Selection.cpp:939
+#: src/slic3r/GUI/Selection.cpp:988
msgid "Scale To Fit"
-msgstr "Skaluj aby zmieścić"
+msgstr "Skaluj, aby zmieścić"
-#: src/libslic3r/PrintConfig.cpp:3476
+#: src/libslic3r/PrintConfig.cpp:3675
msgid "Scale to fit the given volume."
msgstr "Skaluj, aby wypełnić zadaną objętość."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1724
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1852
msgid "Scale to print volume"
msgstr "Skaluj do obszaru roboczego"
-#: src/libslic3r/PrintConfig.cpp:3467
+#: src/libslic3r/PrintConfig.cpp:3666
msgid "Scaling factor or percentage."
msgstr "Współczynnik lub procent skalowania."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:505
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:545
msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue"
msgstr "Ustawianie harmonogramu przesyłania do `%1%`. Zobacz okno -> Kolejka serwera druku"
-#: src/libslic3r/PrintConfig.cpp:1621
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:46
+msgid "Seam painting"
+msgstr "Malowanie szwu"
+
+#: src/libslic3r/PrintConfig.cpp:1729
msgid "Seam position"
msgstr "Pozycja szwu"
-#: src/libslic3r/PrintConfig.cpp:1642
+#: src/libslic3r/PrintConfig.cpp:1750
msgid "Seam preferred direction"
msgstr "Preferowany kierunek szwu"
-#: src/libslic3r/PrintConfig.cpp:1651
+#: src/libslic3r/PrintConfig.cpp:1759
msgid "Seam preferred direction jitter"
msgstr "Kierunek jitter wyznaczany przez szew"
+#: src/slic3r/GUI/MainFrame.cpp:1207
+msgid "Searc&h"
+msgstr "Szu&kaj"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4402 src/slic3r/GUI/GLCanvas3D.cpp:4957
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:130 src/slic3r/GUI/Search.cpp:426
+msgid "Search"
+msgstr "Szukaj"
+
+#: src/slic3r/GUI/ImGuiWrapper.cpp:803 src/slic3r/GUI/Search.cpp:460
+msgid "Search in English"
+msgstr "Szukaj po angielsku"
+
+#: src/slic3r/GUI/MainFrame.cpp:1216
+msgid "Search in settings"
+msgstr "Szukaj w ustawieniach"
+
+#: src/slic3r/GUI/Tab.cpp:222
+msgid "Search in settings [%1%]"
+msgstr "Szukaj w ustawieniach [%1%]"
+
#: src/slic3r/GUI/BonjourDialog.cpp:218
msgid "Searching for devices"
msgstr "Wyszukiwanie urządzeń"
-#: src/slic3r/GUI/Plater.cpp:2858
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:41
msgid "Searching for optimal orientation"
msgstr "Wyszukiwanie optymalnej orientacji"
-#: src/slic3r/GUI/GUI_App.cpp:1103
+#: src/slic3r/GUI/NotificationManager.hpp:321
+msgid "See more."
+msgstr "Zobacz więcej."
+
+#: src/slic3r/GUI/NotificationManager.hpp:322
+msgid "See Releases page."
+msgstr "Zobacz stronÄ™ z wydaniami (\"Releases\")."
+
+#: src/slic3r/GUI/GUI_App.cpp:1895
msgid "Select a gcode file:"
msgstr "Wybierz plik gcode:"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:126
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:121
msgid "Select all objects"
msgstr "Zaznacz wszystkie modele"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1370
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217
msgid "Select all points"
msgstr "Zaznacz wszystkie punkty"
-#: src/slic3r/GUI/ConfigWizard.cpp:1976
+#: src/slic3r/GUI/ConfigWizard.cpp:2487
msgid "Select all standard printers"
msgstr "Zaznacz wszystkie podstawowe drukarki"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1368
+#: src/slic3r/GUI/Plater.cpp:1422
+msgid "Select an action to apply to the file"
+msgstr "Wybierz akcję, która ma zostać zastosowana do pliku"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215
msgid "Select by rectangle"
msgstr "Zaznaczenie prostokÄ…tem"
-#: src/slic3r/GUI/MainFrame.cpp:944 src/slic3r/GUI/MainFrame.cpp:1006
+#: src/slic3r/GUI/MainFrame.cpp:1645 src/slic3r/GUI/MainFrame.cpp:1707
msgid "Select configuration to load:"
msgstr "Wybierz konfiguracjÄ™ do wczytania:"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:82
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:88
msgid "Select coordinate space, in which the transformation will be performed."
msgstr "Wybierz płaszczyznę, w której ma nastąpić przekształcenie."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3971
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4458
msgid "Select extruder number:"
msgstr "Wybierz numer ekstrudera:"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:138
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:134
msgid "Select Filament Settings Tab"
-msgstr "Wybierz Zakładkę Ustawień Filamentu"
+msgstr "Wybierz ustawienia filamentu"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:136
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:132
msgid "Select Plater Tab"
msgstr "Wybierz Zakładkę Podglądu Stołu"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:137
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:133
msgid "Select Print Settings Tab"
-msgstr "Wybierz Zakładkę Ustawień Druku"
+msgstr "Wybierz ustawienia druku"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:139
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:135
msgid "Select Printer Settings Tab"
-msgstr "Wybierz Zakładkę Ustawień Drukarki"
+msgstr "Wybierz ustawienia drukarki"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1265
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1396
msgid "Select showing settings"
msgstr "Wybierz widok ustawień"
-#: src/slic3r/GUI/GUI_App.cpp:629
+#: src/slic3r/GUI/GUI_App.cpp:1295
msgid "Select the language"
msgstr "Wybierz język"
-#: src/slic3r/GUI/Tab.cpp:57
+#: src/slic3r/GUI/Tab.cpp:108
msgid "Select the print profiles this profile is compatible with."
msgstr "Wybierz profile druku, z którymi kompatybilny jest ten profil."
-#: src/slic3r/GUI/Tab.cpp:51
+#: src/slic3r/GUI/Tab.cpp:102
msgid "Select the printers this profile is compatible with."
msgstr "Wybierz drukarki kompatybilne z tym profilem."
-#: src/slic3r/GUI/MainFrame.cpp:889
+#: src/slic3r/GUI/MainFrame.cpp:1590
msgid "Select the STL file to repair:"
msgstr "Wybierz plik STL do naprawy:"
-#: src/slic3r/GUI/Preferences.cpp:237
+#: src/slic3r/GUI/Preferences.cpp:391
msgid "Select toolbar icon size in respect to the default one."
msgstr "Wybierz rozmiar ikon w odniesieniu do domyślnego."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3553
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4016
msgid "Select type of part"
msgstr "Wybierz rodzaj części"
-#: src/slic3r/GUI/Plater.cpp:638
+#: src/slic3r/GUI/Plater.cpp:504
msgid "Select what kind of pad do you need"
msgstr "Wybierz rodzaj wymaganej podkładki"
-#: src/slic3r/GUI/Plater.cpp:498
+#: src/slic3r/GUI/Plater.cpp:364
msgid "Select what kind of support do you need"
msgstr "Wybierz rodzaj potrzebnych podpór"
-#: src/slic3r/GUI/DoubleSlider.cpp:1917
-msgid ""
-"Select YES if you want to delete all saved tool changes, \n"
-"NO if you want all tool changes switch to color changes, \n"
-"or CANCEL to leave it unchanged."
-msgstr ""
-"Wybierz TAK, jeśli chcesz usunąć wszystkie zapisane zmiany narzędzi,\n"
-"NIE, jeśli chcesz przełączyć zmiany narzędzi na zmiany koloru lub\n"
-"ANULUJ, aby pozostawić bez zmian."
+#: src/slic3r/GUI/DoubleSlider.cpp:2135
+msgid "Select YES if you want to delete all saved tool changes, \nNO if you want all tool changes switch to color changes, \nor CANCEL to leave it unchanged."
+msgstr "Wybierz TAK, jeśli chcesz usunąć wszystkie zapisane zmiany narzędzi,\nNIE, jeśli chcesz przełączyć zmiany narzędzi na zmiany koloru lub\nANULUJ, aby pozostawić bez zmian."
-#: src/slic3r/GUI/Selection.cpp:146
+#: src/slic3r/GUI/Selection.cpp:191
msgid "Selection-Add"
msgstr "Zaznaczenie-Dodaj"
-#: src/slic3r/GUI/Selection.cpp:376
+#: src/slic3r/GUI/Selection.cpp:421
msgid "Selection-Add All"
msgstr "Zaznaczenie-Dodaj wszystko"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3299
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3762
msgid "Selection-Add from list"
msgstr "Zaznaczenie-Dodaj z listy"
-#: src/slic3r/GUI/GLCanvas3D.cpp:6598
+#: src/slic3r/GUI/GLCanvas3D.cpp:7193
msgid "Selection-Add from rectangle"
msgstr "Zaznaczenie-Dodaj z prostokÄ…ta"
-#: src/slic3r/GUI/Selection.cpp:256
+#: src/slic3r/GUI/Selection.cpp:301
msgid "Selection-Add Instance"
msgstr "Zaznaczenie-Dodaj instancjÄ™"
-#: src/slic3r/GUI/Selection.cpp:219
+#: src/slic3r/GUI/Selection.cpp:264
msgid "Selection-Add Object"
msgstr "Zaznaczenie-Dodaj Model"
-#: src/slic3r/GUI/Selection.cpp:187
+#: src/slic3r/GUI/Selection.cpp:232
msgid "Selection-Remove"
msgstr "Zaznaczenie-Usuń"
-#: src/slic3r/GUI/Selection.cpp:402
+#: src/slic3r/GUI/Selection.cpp:447
msgid "Selection-Remove All"
msgstr "Zaznaczenie-Usuń Wszystko"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3291
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3754
msgid "Selection-Remove from list"
msgstr "Zaznaczenie-Usunięcie z listy"
-#: src/slic3r/GUI/GLCanvas3D.cpp:6617
+#: src/slic3r/GUI/GLCanvas3D.cpp:7212
msgid "Selection-Remove from rectangle"
msgstr "Zaznaczenie-Usuń z prostokąta"
-#: src/slic3r/GUI/Selection.cpp:275
+#: src/slic3r/GUI/Selection.cpp:320
msgid "Selection-Remove Instance"
msgstr "Zaznaczenie-Usuń kopię"
-#: src/slic3r/GUI/Selection.cpp:238
+#: src/slic3r/GUI/Selection.cpp:283
msgid "Selection-Remove Object"
msgstr "Zaznaczenie-Usuń model"
-#: src/slic3r/GUI/MainFrame.cpp:566
+#: src/slic3r/GUI/MainFrame.cpp:1172
msgid "Selects all objects"
msgstr "Zaznacza wszystkie modele"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Plater.cpp:5522
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:116 src/slic3r/GUI/Plater.cpp:5707
msgid "Send G-code"
msgstr "Wyślij G-code"
@@ -6569,29 +7738,25 @@ msgstr "Wyślij G-code"
msgid "Send G-Code to printer host"
msgstr "Wyślij G-code do serwera druku"
-#: src/slic3r/GUI/MainFrame.cpp:481
+#: src/slic3r/GUI/MainFrame.cpp:1072
msgid "Send to print current plate as G-code"
msgstr "Wyślij zawartość stołu do druku jako G-code"
-#: src/slic3r/GUI/Plater.cpp:878 src/slic3r/GUI/Plater.cpp:5522
+#: src/slic3r/GUI/Plater.cpp:753 src/slic3r/GUI/Plater.cpp:5707
msgid "Send to printer"
msgstr "Wyślij do drukarki"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1305
+#: src/slic3r/GUI/GLCanvas3D.cpp:1312
msgid "Seq."
msgstr "Sekw."
-#: src/slic3r/GUI/Tab.cpp:1231
+#: src/slic3r/GUI/Tab.cpp:1561
msgid "Sequential printing"
msgstr "Drukowanie sekwencyjne (model po modelu)"
-#: src/slic3r/GUI/Tab.cpp:1901 src/libslic3r/PrintConfig.cpp:1661
-msgid "Serial port"
-msgstr "Port szeregowy"
-
-#: src/libslic3r/PrintConfig.cpp:1669
-msgid "Serial port speed"
-msgstr "Szybkość portu szeregowego"
+#: src/slic3r/GUI/Preferences.cpp:230
+msgid "Sequential slider applied only to top layer"
+msgstr "Suwak sekwencyjny stosowany tylko do górnej warstwy"
#: src/slic3r/GUI/FirmwareDialog.cpp:807
msgid "Serial port:"
@@ -6601,17 +7766,16 @@ msgstr "Port szeregowy:"
msgid "Service name"
msgstr "Nazwa usługi"
-#: src/slic3r/GUI/Tab.cpp:1802 src/slic3r/GUI/Tab.cpp:2046
-#: src/slic3r/GUI/Tab.cpp:3176
+#: src/slic3r/GUI/Tab.cpp:3509 src/slic3r/GUI/Tab.cpp:3588
msgid "Set"
msgstr "Ustaw"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1599
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1611
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1728
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1740
msgid "Set as a Separated Object"
msgstr "Ustaw jako osobny model"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1611
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1740
msgid "Set as a Separated Objects"
msgstr "Ustaw jako Osobne Modele"
@@ -6619,7 +7783,7 @@ msgstr "Ustaw jako Osobne Modele"
msgid "Set extruder change for every"
msgstr "Ustaw zmianę ekstrudera dla każdej"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1671
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1800
msgid "Set extruder for selected items"
msgstr "Ustaw ekstruder dla wybranych elementów"
@@ -6627,7 +7791,7 @@ msgstr "Ustaw ekstruder dla wybranych elementów"
msgid "Set extruder sequence"
msgstr "Ustaw sekwencję ekstruderów"
-#: src/slic3r/GUI/DoubleSlider.cpp:1532
+#: src/slic3r/GUI/DoubleSlider.cpp:1728
msgid "Set extruder sequence for the entire print"
msgstr "Ustaw sekwencję ekstruderów dla całego wydruku"
@@ -6635,84 +7799,100 @@ msgstr "Ustaw sekwencję ekstruderów dla całego wydruku"
msgid "Set extruder(tool) sequence"
msgstr "Ustaw sekwencję ekstruderów (narzędzi)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:243
+msgid "Set left thumb as active"
+msgstr "Ustaw lewy punkt jako aktywny"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
+msgid "Set lower thumb as active"
+msgstr "Ustaw dolny punkt jako aktywny"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
msgid "Set lower thumb to current slider thumb"
-msgstr "Ustaw punkt zmiany koloru na poziomie dolnego suwaka"
+msgstr "Przysuń dolny punkt suwaka do obecnego"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:297
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:305
msgid "Set Mirror"
msgstr "Ustaw Odbicie"
-#: src/slic3r/GUI/Plater.cpp:3944
+#: src/slic3r/GUI/Plater.cpp:3862
msgid "Set number of instances"
-msgstr "Ustaw liczbÄ™ kopii"
+msgstr "Ustaw liczbÄ™ instancji"
-#: src/slic3r/GUI/Plater.cpp:4756
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:4860
+#, possible-c-format
msgid "Set numbers of copies to %d"
msgstr "Ustaw ilość instancji na %d"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:781
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:828
msgid "Set Orientation"
msgstr "Ustaw OrientacjÄ™"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:750
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:797
msgid "Set Position"
msgstr "Ustaw PozycjÄ™"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4581 src/slic3r/GUI/Selection.cpp:1513
msgid "Set Printable"
msgstr "Zaznacz do drukowania"
-#: src/slic3r/GUI/Selection.cpp:1475
+#: src/slic3r/GUI/Selection.cpp:1515
msgid "Set Printable Instance"
-msgstr "WÅ‚Ä…cz drukowanie kopii"
+msgstr "WÅ‚Ä…cz drukowanie instancji"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:846
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:244
+msgid "Set right thumb as active"
+msgstr "Ustaw prawy punkt jako aktywny"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1836
+msgid "Set ruler mode"
+msgstr "Ustaw tryb linijki"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:893
msgid "Set Scale"
msgstr "Ustaw SkalÄ™"
-#: src/libslic3r/PrintConfig.cpp:2393
+#: src/libslic3r/PrintConfig.cpp:2536
msgid "Set the actual LCD display orientation inside the SLA printer. Portrait mode will flip the meaning of display width and height parameters and the output images will be rotated by 90 degrees."
msgstr "Ustaw właściwą orientację ekranu LCD wewnątrz drukarki SLA. Tryb portretowy spowoduje zamianę parametrów szerokości i wysokości a obrazek wyjściowy będzie obrócony o 90 stopni."
-#: src/slic3r/GUI/ConfigWizard.cpp:932
+#: src/slic3r/GUI/ConfigWizard.cpp:1298
msgid "Set the shape of your printer's bed."
msgstr "Ustaw kształt stołu roboczego drukarki."
-#: src/libslic3r/PrintConfig.cpp:556
+#: src/libslic3r/PrintConfig.cpp:592
msgid "Set this to a non-zero value to allow a manual extrusion width. If left to zero, Slic3r derives extrusion widths from the nozzle diameter (see the tooltips for perimeter extrusion width, infill extrusion width etc). If expressed as percentage (for example: 230%), it will be computed over layer height."
-msgstr "Ustaw tą wartość jako niezerową aby pozwolić na ręczne ustawienie szerokości ekstrudowanej linii. Jeśli ustawisz zero, Slic3r obliczy szerokość ekstruzji na podstawie średnicy dyszy (zobacz wskazówki dla szerokości ekstruzji obrysów, wypełnienia itp). Jeśli ustawisz wartość procentową (np. 230%) to zostanie obliczona z wysokości warstwy."
+msgstr "Ustaw tą wartość jako niezerową, aby pozwolić na ręczne ustawienie szerokości ekstrudowanej linii. Jeśli ustawisz zero, PrusaSlicer obliczy szerokość ekstruzji na podstawie średnicy dyszy (zobacz wskazówki dla szerokości ekstruzji obrysów, wypełnienia itp). Jeśli ustawisz wartość procentową (np. 230%) to zostanie obliczona z wysokości warstwy."
-#: src/libslic3r/PrintConfig.cpp:448
+#: src/libslic3r/PrintConfig.cpp:484
msgid "Set this to a non-zero value to set a manual extrusion width for external perimeters. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 200%), it will be computed over layer height."
-msgstr "Ustaw tą wartość jako niezerową aby pozwolić na ręczne ustawienie szerokości ekstruzji obrysów zewnętrznych. Jeśli ustawisz zero, szerokość będzie miała wartość domyślną, czyli 1.125x średnicy dyszy. Jeśli ustawisz wartość procentową (np. 200%) to zostanie obliczona z wysokości warstwy."
+msgstr "Ustaw tą wartość jako niezerową, aby pozwolić na ręczne ustawienie szerokości ekstruzji obrysów zewnętrznych. Jeśli ustawisz zero, szerokość będzie miała wartość domyślną, czyli 1.125x średnicy dyszy. Jeśli ustawisz wartość procentową (np. 200%) to zostanie obliczona z wysokości warstwy."
-#: src/libslic3r/PrintConfig.cpp:878
+#: src/libslic3r/PrintConfig.cpp:920
msgid "Set this to a non-zero value to set a manual extrusion width for first layer. You can use this to force fatter extrudates for better adhesion. If expressed as percentage (for example 120%) it will be computed over first layer height. If set to zero, it will use the default extrusion width."
-msgstr "Ustaw tą wartość jako niezerową aby pozwolić na ręczne ustawienie szerokości ekstruzji pierwszej warstwy. Dzięki tej funkcji możesz wymusić grubsze linie dla lepszej przyczepności. Jeśli ustawisz wartość procentową (np. 120%) to będzie oliczona z wysokości pierwszej warstwy. Ustaw zero dla wartości domyślnej."
+msgstr "Ustaw tą wartość jako niezerową, aby pozwolić na ręczne ustawienie szerokości ekstruzji pierwszej warstwy. Dzięki tej funkcji możesz wymusić grubsze linie dla lepszej przyczepności. Jeśli ustawisz wartość procentową (np. 120%), to będzie obliczona z wysokości pierwszej warstwy. Ustaw zero dla wartości domyślnej."
-#: src/libslic3r/PrintConfig.cpp:1758
+#: src/libslic3r/PrintConfig.cpp:1873
msgid "Set this to a non-zero value to set a manual extrusion width for infill for solid surfaces. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 90%) it will be computed over layer height."
-msgstr "Ustaw tą wartość jako niezerową aby pozwolić na ręczne ustawienie szerokości ekstruzji wypełnienia powierzchni zwartych. Jeśli ustawisz zero, szerokość będzie miała wartość domyślną, czyli 1.125x średnicy dyszy. Jeśli ustawisz wartość procentową (np. 90%) to zostanie obliczona z wysokości warstwy."
+msgstr "Ustaw tą wartość jako niezerową, aby pozwolić na ręczne ustawienie szerokości ekstruzji wypełnienia powierzchni zwartych. Jeśli ustawisz zero, szerokość będzie miała wartość domyślną, czyli 1.125x średnicy dyszy. Jeśli ustawisz wartość procentową (np. 90%), to zostanie obliczona z wysokości warstwy."
-#: src/libslic3r/PrintConfig.cpp:2107
+#: src/libslic3r/PrintConfig.cpp:2250
msgid "Set this to a non-zero value to set a manual extrusion width for infill for top surfaces. You may want to use thinner extrudates to fill all narrow regions and get a smoother finish. If left zero, default extrusion width will be used if set, otherwise nozzle diameter will be used. If expressed as percentage (for example 90%) it will be computed over layer height."
-msgstr "Ustaw tą wartość jako niezerową aby pozwolić na ręczne ustawienie szerokości ekstruzji zwartego wypełnienia górnych warstw. Możesz ustawić mniejszą szerokość aby wypełnić szczeliny i uzyskać gładsze wykończenie. Jeśli ustawisz zero, szerokość będzie miała wartość domyślną, czyli będzie równa średnicy dyszy. Jeśli ustawisz wartość procentową (np. 90%) to zostanie obliczona z wysokości warstwy."
+msgstr "Ustaw tą wartość jako niezerową, aby pozwolić na ręczne ustawienie szerokości ekstruzji zwartego wypełnienia górnych warstw. Możesz ustawić mniejszą szerokość, aby wypełnić szczeliny i uzyskać gładsze wykończenie. Jeśli ustawisz zero, szerokość będzie miała wartość domyślną, czyli będzie równa średnicy dyszy. Jeśli ustawisz wartość procentową (np. 90%), to zostanie obliczona z wysokości warstwy."
-#: src/libslic3r/PrintConfig.cpp:1011
+#: src/libslic3r/PrintConfig.cpp:1055
msgid "Set this to a non-zero value to set a manual extrusion width for infill. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. You may want to use fatter extrudates to speed up the infill and make your parts stronger. If expressed as percentage (for example 90%) it will be computed over layer height."
-msgstr "Ustaw tą wartość jako niezerową aby pozwolić na ręczne ustawienie szerokości ekstruzji wypełnienia. Jeśli ustawisz zero to szerokość będzie miała wartość domyślną, czyli 1.125x średnicy dyszy. Możesz ustawić większą szerokość aby przyspieszyć druk wypełnienia i zwiększyć wytrzymałość wydruków. Jeśli ustawisz wartość procentową (np. 90%) to zostanie obliczona z wysokości warstwy."
+msgstr "Ustaw tą wartość jako niezerową, aby pozwolić na ręczne ustawienie szerokości ekstruzji wypełnienia. Jeśli ustawisz zero, to szerokość będzie miała wartość domyślną, czyli 1.125x średnicy dyszy. Możesz ustawić większą szerokość, aby przyspieszyć druk wypełnienia i zwiększyć wytrzymałość wydruków. Jeśli ustawisz wartość procentową (np. 90%), to zostanie obliczona z wysokości warstwy."
-#: src/libslic3r/PrintConfig.cpp:1419
+#: src/libslic3r/PrintConfig.cpp:1527
msgid "Set this to a non-zero value to set a manual extrusion width for perimeters. You may want to use thinner extrudates to get more accurate surfaces. If left zero, default extrusion width will be used if set, otherwise 1.125 x nozzle diameter will be used. If expressed as percentage (for example 200%) it will be computed over layer height."
-msgstr "Ustaw tą wartość jako niezerową aby pozwolić na ręczne ustawienie szerokości ekstruzji obrysów. Możesz ustawić większą szerokość aby uzyskać dokładniejsze wykończenie powierzchni. Jeśli ustawisz zero to szerokość będzie miała wartość domyślną, czyli 1.125x średnicy dyszy. Jeśli ustawisz wartość procentową (np. 200%) to zostanie obliczona z wysokości warstwy."
+msgstr "Ustaw tą wartość jako niezerową, aby pozwolić na ręczne ustawienie szerokości ekstruzji obrysów. Możesz ustawić większą szerokość, aby uzyskać dokładniejsze wykończenie powierzchni. Jeśli ustawisz zero to szerokość będzie miała wartość domyślną, czyli 1.125x średnicy dyszy. Jeśli ustawisz wartość procentową (np. 200%), to zostanie obliczona z wysokości warstwy."
-#: src/libslic3r/PrintConfig.cpp:1948
+#: src/libslic3r/PrintConfig.cpp:2090
msgid "Set this to a non-zero value to set a manual extrusion width for support material. If left zero, default extrusion width will be used if set, otherwise nozzle diameter will be used. If expressed as percentage (for example 90%) it will be computed over layer height."
-msgstr "Ustaw tą wartość jako niezerową aby pozwolić na ręczne ustawienie szerokości ekstruzji materiału podporowego. Jeśli ustawisz zero to szerokość będzie miała wartość domyślną, czyli będzie równa średnicy dyszy. Jeśli ustawisz wartość procentową (np. 90%) to zostanie obliczona z wysokości warstwy."
+msgstr "Ustaw tą wartość jako niezerową, aby pozwolić na ręczne ustawienie szerokości ekstruzji materiału podporowego. Jeśli ustawisz zero, to szerokość będzie miała wartość domyślną, czyli będzie równa średnicy dyszy. Jeśli ustawisz wartość procentową (np. 90%), to zostanie obliczona z wysokości warstwy."
-#: src/libslic3r/PrintConfig.cpp:512
+#: src/libslic3r/PrintConfig.cpp:548
msgid "Set this to the clearance radius around your extruder. If the extruder is not centered, choose the largest value for safety. This setting is used to check for collisions and to display the graphical preview in the plater."
msgstr "Określa promień okręgu opisanego na całym zespole ekstrudera (matematycznie - wyobraź sobie, że chcesz narysować okrąg opisany na zespole ekstrudera patrząc na niego z góry). Jeśli sam ekstruder nie jest dokładnie na środku, użyj największego promienia. Ta wartość jest używana do wykrywania możliwych kolizji z wydrukowanymi modelami i jako graficzna reprezentacja na wirtualnym stole."
@@ -6720,87 +7900,98 @@ msgstr "Określa promień okręgu opisanego na całym zespole ekstrudera (matema
msgid "Set this to the maximum height that can be reached by your extruder while printing."
msgstr "Ustaw tutaj maksymalną wysokość, jaką może osiągnąć Twój ekstruder podczas drukowania."
-#: src/libslic3r/PrintConfig.cpp:501
+#: src/libslic3r/PrintConfig.cpp:537
msgid "Set this to the vertical distance between your nozzle tip and (usually) the X carriage rods. In other words, this is the height of the clearance cylinder around your extruder, and it represents the maximum depth the extruder can peek before colliding with other printed objects."
-msgstr "Określa pionową odległość końcówki dyszy od (zazwyczaj) prętów osi X. Inaczej mówiąc (matematycznie), jest to wysokość cylindra opisanego na zespole ekstrudera i określa maksymalną głębokość, na którą może opuścić się ekstruder aby nie uderzyć w obiekt znajdujący się bezpośrednio pod prętami osi X."
+msgstr "Określa pionową odległość końcówki dyszy od (zazwyczaj) prętów osi X. Inaczej mówiąc (matematycznie), jest to wysokość cylindra opisanego na zespole ekstrudera i określa maksymalną głębokość, na którą może opuścić się ekstruder, aby nie uderzyć w obiekt znajdujący się bezpośrednio pod prętami osi X."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4094 src/slic3r/GUI/Selection.cpp:1474
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4581 src/slic3r/GUI/Selection.cpp:1513
msgid "Set Unprintable"
msgstr "Zaznacz do ignorowania przy drukowaniu"
-#: src/slic3r/GUI/Selection.cpp:1475
+#: src/slic3r/GUI/Selection.cpp:1515
msgid "Set Unprintable Instance"
-msgstr "Ignoruj drukowanie kopii"
+msgstr "Ignoruj drukowanie instancji"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:221
+msgid "Set upper thumb as active"
+msgstr "Ustaw górny punkt jako aktywny"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
msgid "Set upper thumb to current slider thumb"
-msgstr "Ustaw punkt zmiany koloru na poziomie górnego suwaka"
+msgstr "Przysuń górny punkt suwaka do obecnego"
-#: src/libslic3r/PrintConfig.cpp:3509
-msgid ""
-"Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:trace\n"
-"For example. loglevel=2 logs fatal, error and warning level messages."
-msgstr ""
-"Ustawia czułość logowania. 0:krytyczne, 1:błędy, 2:ostrzeżenia, 3:info, 4:debug, 5:trace\n"
-"Np: loglevel=2 loguje krytyczne, błędy i ostrzeżenia."
+#: src/libslic3r/PrintConfig.cpp:3714
+msgid "Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:trace\nFor example. loglevel=2 logs fatal, error and warning level messages."
+msgstr "Ustawia czułość logowania. 0:krytyczne, 1:błędy, 2:ostrzeżenia, 3:info, 4:debug, 5:trace\nNp: loglevel=2 loguje krytyczne, błędy i ostrzeżenia."
-#: src/slic3r/GUI/BedShapeDialog.cpp:155
+#: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/MainFrame.cpp:1969
msgid "Settings"
msgstr "Ustawienia"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2507
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2899
msgid "Settings for height range"
msgstr "Ustawienie zakresu wysokości"
-#: src/slic3r/GUI/ConfigManipulation.cpp:162
+#: src/slic3r/GUI/Preferences.cpp:431
+msgid "Settings in non-modal window"
+msgstr "Ustawienia w osobnym okienku"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:161
msgid "Shall I adjust those settings for supports?"
msgstr "Czy chcesz zmienić te ustawienia dla podpór?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:89
+#: src/slic3r/GUI/ConfigManipulation.cpp:88
msgid "Shall I adjust those settings in order to enable Spiral Vase?"
msgstr "Czy chcesz zmienić te ustawienia, aby włączyć tryb wazy?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:119
+#: src/slic3r/GUI/ConfigManipulation.cpp:118
msgid "Shall I adjust those settings in order to enable the Wipe Tower?"
msgstr "Czy chcesz zmienić te ustawienia, aby włączyć wieżę czyszczącą?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:210
+#: src/slic3r/GUI/ConfigManipulation.cpp:209
msgid "Shall I switch to rectilinear fill pattern?"
msgstr "Czy chcesz zmienić wzór wypełnienia na linie równoległe?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:139
+#: src/slic3r/GUI/ConfigManipulation.cpp:138
msgid "Shall I synchronize support layers in order to enable the Wipe Tower?"
msgstr "Czy chcesz zsynchronizować warstwy podporowe, aby włączyć wieżę czyszczącą?"
-#: src/slic3r/GUI/BedShapeDialog.cpp:66 src/slic3r/GUI/GUI_ObjectList.cpp:2059
+#: src/slic3r/GUI/BedShapeDialog.cpp:156 src/slic3r/GUI/BedShapeDialog.cpp:222
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2215
msgid "Shape"
msgstr "Kształt"
-#: src/slic3r/GUI/GUI_Preview.cpp:256
+#: src/slic3r/GUI/GUI_Preview.cpp:338 src/slic3r/GUI/GUI_Preview.cpp:1478
msgid "Shells"
msgstr "Powłoki"
-#: src/slic3r/GUI/GLCanvas3D.cpp:249
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33
+msgid "Shift + Left mouse button"
+msgstr "Shift + lewy przycisk myszy"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:241
msgid "Shift + Left mouse button:"
-msgstr "Shift + lewy przycisk myszki:"
+msgstr "Shift + lewy przycisk myszy:"
-#: src/slic3r/GUI/GLCanvas3D.cpp:255
+#: src/slic3r/GUI/GLCanvas3D.cpp:245
msgid "Shift + Right mouse button:"
-msgstr "Shift + Prawy przycisk myszki:"
+msgstr "Shift + Prawy przycisk myszy:"
-#: src/slic3r/GUI/GUI_Preview.cpp:231
+#: src/slic3r/GUI/GUI_Preview.cpp:286 src/slic3r/GUI/GUI_Preview.cpp:288
msgid "Show"
msgstr "Pokaż"
-#: src/slic3r/GUI/MainFrame.cpp:701
+#: src/slic3r/GUI/MainFrame.cpp:926 src/slic3r/GUI/MainFrame.cpp:1325
msgid "Show &Configuration Folder"
msgstr "Pokaż folder Konfigura&cyjny"
-#: src/slic3r/GUI/MainFrame.cpp:676
+#: src/slic3r/GUI/MainFrame.cpp:1294
msgid "Show &labels"
msgstr "Pokaż &etykiety"
-#: src/slic3r/GUI/MainFrame.cpp:705
+#: src/slic3r/GUI/MainFrame.cpp:933 src/slic3r/GUI/MainFrame.cpp:937
+#: src/slic3r/GUI/MainFrame.cpp:1329
msgid "Show about dialog"
msgstr "Pokaż okienko"
@@ -6808,549 +7999,619 @@ msgstr "Pokaż okienko"
msgid "Show advanced settings"
msgstr "Pokaż ustawienia zaawansowane"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:159
+#: src/slic3r/GUI/Preferences.cpp:120
+msgid "Show drop project dialog"
+msgstr "Pokaż okno dialogowe przy upuszczeniu projektu"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:157
msgid "Show error message"
msgstr "Pokaż komunikat błędu"
-#: src/slic3r/GUI/Preferences.cpp:95
+#: src/slic3r/GUI/DoubleSlider.cpp:1832
+msgid "Show estimated print time"
+msgstr "Pokaż szacowany czas druku"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1832
+msgid "Show estimated print time on the ruler"
+msgstr "Pokaż szacowany czas druku na linijce"
+
+#: src/slic3r/GUI/Preferences.cpp:112
msgid "Show incompatible print and filament presets"
msgstr "Pokaż niekompatybilne ustawienia druku i filamentów"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:151
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:145
msgid "Show keyboard shortcuts list"
msgstr "Pokaż listę skrótów klawiszowych"
-#: src/slic3r/GUI/MainFrame.cpp:676
+#: src/slic3r/GUI/GCodeViewer.cpp:2591
+msgid "Show normal mode"
+msgstr "Pokaż dla trybu normalnego"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1828
+msgid "Show object height"
+msgstr "Pokaż wysokość modelu"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1828
+msgid "Show object height on the ruler"
+msgstr "Pokaż wysokość modelu na linijce"
+
+#: src/slic3r/GUI/MainFrame.cpp:1294
msgid "Show object/instance labels in 3D scene"
-msgstr "Pokaż etykiety modelu/kopii w widoku edycji 3D"
+msgstr "Pokaż etykiety modelu/instancji w widoku edycji 3D"
+
+#: src/slic3r/GUI/Preferences.cpp:213
+msgid "Show sidebar collapse/expand button"
+msgstr "Pokaż przycisk zwijania/rozwijania bocznego panelu"
#: src/slic3r/GUI/WipeTowerDialog.cpp:377
msgid "Show simplified settings"
msgstr "Pokaż ustawienia uproszczone"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:52
+#: src/slic3r/GUI/Preferences.cpp:169 src/slic3r/GUI/Preferences.cpp:171
+msgid "Show splash screen"
+msgstr "Pokaż ekran startowy"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2586
+msgid "Show stealth mode"
+msgstr "Pokaż dla trybu stealth"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51
msgid "Show supports"
msgstr "Pokaż podpory"
-#: src/slic3r/GUI/MainFrame.cpp:699
+#: src/slic3r/GUI/MainFrame.cpp:924 src/slic3r/GUI/MainFrame.cpp:1323
msgid "Show system information"
msgstr "Pokaż informacje o systemie"
-#: src/slic3r/GUI/MainFrame.cpp:626
+#: src/slic3r/GUI/MainFrame.cpp:1234
msgid "Show the 3D editing view"
msgstr "Pokaż widok edycji 3D"
-#: src/slic3r/GUI/MainFrame.cpp:629
+#: src/slic3r/GUI/MainFrame.cpp:1237
msgid "Show the 3D slices preview"
msgstr "Pokaż podgląd cięcia 3D"
-#: src/slic3r/GUI/MainFrame.cpp:617
+#: src/slic3r/GUI/MainFrame.cpp:1224
msgid "Show the filament settings"
msgstr "Pokaż ustawienia filamentu"
-#: src/libslic3r/PrintConfig.cpp:3372
+#: src/libslic3r/PrintConfig.cpp:3571
msgid "Show the full list of print/G-code configuration options."
msgstr "Pokaż pełną listę opcji konfiguracji druku/G-code."
-#: src/libslic3r/PrintConfig.cpp:3377
+#: src/libslic3r/PrintConfig.cpp:3576
msgid "Show the full list of SLA print configuration options."
msgstr "Pokaż pełną listę opcji konfiguracji druku SLA."
-#: src/slic3r/GUI/MainFrame.cpp:708
+#: src/slic3r/GUI/MainFrame.cpp:941 src/slic3r/GUI/MainFrame.cpp:1332
msgid "Show the list of the keyboard shortcuts"
msgstr "Pokaż listę skrótów klawiszowych"
-#: src/slic3r/GUI/MainFrame.cpp:606
+#: src/slic3r/GUI/MainFrame.cpp:1216
msgid "Show the plater"
msgstr "Pokaż zawartość stołu"
-#: src/slic3r/GUI/MainFrame.cpp:614
+#: src/slic3r/GUI/MainFrame.cpp:1221
msgid "Show the print settings"
msgstr "Pokaż ustawienia druku"
-#: src/slic3r/GUI/MainFrame.cpp:621
+#: src/slic3r/GUI/MainFrame.cpp:1228
msgid "Show the printer settings"
msgstr "Pokaż ustawienia drukarki"
-#: src/libslic3r/PrintConfig.cpp:3366
+#: src/libslic3r/PrintConfig.cpp:3565
msgid "Show this help."
msgstr "Pokaż tą wskazówkę pomocy."
-#: src/slic3r/GUI/MainFrame.cpp:701
+#: src/slic3r/GUI/MainFrame.cpp:926 src/slic3r/GUI/MainFrame.cpp:1325
msgid "Show user configuration folder (datadir)"
msgstr "Pokaż folder z konfiguracjami użytkownika (datadir)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:185
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:182
msgid "Show/Hide 3Dconnexion devices settings dialog"
msgstr "Pokaż/ukryj ustawienia urządzeń 3Dconnexion"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
-msgid "Show/Hide Legend"
-msgstr "Pokaż/ukryj legendę"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
+msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled"
+msgstr "Pokaż/ukryj okno dialogowe ustawień urządzeń 3DConnexion, jeśli włączone"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+msgid "Show/Hide Legend & Estimated printing time"
+msgstr "Pokaż/ukryj legendę i szacowany czas druku"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:146
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+msgid "Show/Hide Legend and Estimated printing time"
+msgstr "Pokaż/ukryj legendę i szacowany czas druku"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:141
msgid "Show/Hide object/instance labels"
-msgstr "Ukryj/pokaż etykiety modelu/kopii"
+msgstr "Ukryj/pokaż etykiety modelu/instancji"
-#: src/slic3r/GUI/GUI_App.cpp:813 src/slic3r/GUI/wxExtensions.cpp:753
+#: src/slic3r/GUI/GUI_App.cpp:1504 src/slic3r/GUI/wxExtensions.cpp:673
msgid "Simple"
msgstr "Prosty"
-#: src/slic3r/GUI/ConfigWizard.cpp:820
+#: src/slic3r/GUI/ConfigWizard.cpp:1179
msgid "Simple mode"
msgstr "Tryb Prosty"
-#: src/slic3r/GUI/GUI_App.cpp:813
+#: src/slic3r/GUI/GUI_App.cpp:1504
msgid "Simple View Mode"
msgstr "Tryb Widoku Prostego"
-#: src/slic3r/GUI/Tab.cpp:2298 src/slic3r/GUI/Tab.cpp:2306
+#: src/slic3r/GUI/Tab.cpp:2467 src/slic3r/GUI/Tab.cpp:2475
msgid "Single extruder MM setup"
msgstr "Ustawienia MM dla jednego ekstrudera"
-#: src/libslic3r/PrintConfig.cpp:1845
+#: src/libslic3r/PrintConfig.cpp:1987
msgid "Single Extruder Multi Material"
msgstr "Multi Material z jednym ekstruderem"
-#: src/slic3r/GUI/Tab.cpp:1867
-msgid ""
-"Single Extruder Multi Material is selected, \n"
-"and all extruders must have the same diameter.\n"
-"Do you want to change the diameter for all extruders to first extruder nozzle diameter value?"
-msgstr ""
-"Wybrano Multi Material z jednym ekstruderem,\n"
-"więc wszystkie ekstrudery muszą mieć taką samą średnicę dyszy.\n"
-"Czy chcesz zmienić średnicę dyszy dla wszystkich ekstruderów na wartość z pierwszego?"
+#: src/slic3r/GUI/Tab.cpp:2101
+msgid "Single Extruder Multi Material is selected, \nand all extruders must have the same diameter.\nDo you want to change the diameter for all extruders to first extruder nozzle diameter value?"
+msgstr "Wybrano Multi Material z jednym ekstruderem,\nwięc wszystkie ekstrudery muszą mieć taką samą średnicę dyszy.\nCzy chcesz zmienić średnicę dyszy dla wszystkich ekstruderów na wartość z pierwszego?"
-#: src/slic3r/GUI/Tab.cpp:2307
+#: src/slic3r/GUI/Tab.cpp:2476
msgid "Single extruder multimaterial parameters"
msgstr "Parametry multimaterial przy jednym ekstruderze"
-#: src/slic3r/GUI/BedShapeDialog.cpp:77
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:232 src/slic3r/GUI/Plater.cpp:160
-#: src/slic3r/GUI/Tab.cpp:2324
+#: src/slic3r/GUI/Preferences.cpp:120 src/libslic3r/PrintConfig.cpp:3689
+msgid "Single instance mode"
+msgstr "Tryb jednej instancji"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:93
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:240 src/slic3r/GUI/Plater.cpp:166
+#: src/slic3r/GUI/Tab.cpp:2493
msgid "Size"
msgstr "Rozmiar"
-#: src/slic3r/GUI/Tab.cpp:1797 src/slic3r/GUI/Tab.cpp:2041
+#: src/slic3r/GUI/Tab.cpp:2059 src/slic3r/GUI/Tab.cpp:2241
msgid "Size and coordinates"
msgstr "Rozmiar i koordynaty"
-#: src/slic3r/GUI/BedShapeDialog.cpp:78
+#: src/slic3r/GUI/BedShapeDialog.cpp:110
msgid "Size in X and Y of the rectangular plate."
msgstr "Rozmiar X i Y stołu prostokątnego."
-#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1111
-#: src/libslic3r/ExtrusionEntity.cpp:318
+#: src/slic3r/GUI/GUI_Preview.cpp:310 src/slic3r/GUI/Tab.cpp:1439
+#: src/libslic3r/ExtrusionEntity.cpp:323 src/libslic3r/ExtrusionEntity.cpp:354
msgid "Skirt"
msgstr "Skirt"
-#: src/slic3r/GUI/Tab.cpp:1110
+#: src/slic3r/GUI/Tab.cpp:1438
msgid "Skirt and brim"
msgstr "Skirt i brim"
-#: src/libslic3r/PrintConfig.cpp:1687
+#: src/libslic3r/PrintConfig.cpp:1795
msgid "Skirt height"
msgstr "Wysokość skirt"
-#: src/libslic3r/PrintConfig.cpp:1696
+#: src/libslic3r/PrintConfig.cpp:1811
msgid "Skirt Loops"
msgstr "Liczba obrysów skirt"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1334
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1181
msgid "SLA gizmo keyboard shortcuts"
msgstr "Skróty klawiszowe \"uchwytów\" SLA"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1058
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:924
msgid "SLA gizmo turned off"
msgstr "Uchwyt SLA wyłączony"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1017
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897
msgid "SLA gizmo turned on"
msgstr "Uchwyt SLA włączony"
-#: src/slic3r/GUI/Plater.cpp:818 src/slic3r/GUI/Preset.cpp:1524
+#: src/slic3r/GUI/Plater.cpp:693 src/libslic3r/Preset.cpp:1303
msgid "SLA material"
msgstr "Materiał SLA"
-#: src/slic3r/GUI/ConfigWizard.cpp:2015
+#: src/slic3r/GUI/ConfigWizard.cpp:2526
msgid "SLA Material Profiles Selection"
msgstr "Wybór profili materiałów SLA"
-#: src/libslic3r/PrintConfig.cpp:2470 src/libslic3r/PrintConfig.cpp:2471
+#: src/libslic3r/PrintConfig.cpp:2613 src/libslic3r/PrintConfig.cpp:2614
msgid "SLA material type"
msgstr "Rodzaj materiału SLA"
-#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2015
+#: src/slic3r/GUI/ConfigWizard.cpp:1872 src/slic3r/GUI/ConfigWizard.cpp:2526
msgid "SLA Materials"
msgstr "Materiały SLA"
-#: src/slic3r/GUI/Preset.cpp:1523
+#: src/libslic3r/Preset.cpp:1302
msgid "SLA print"
msgstr "Druk SLA"
-#: src/libslic3r/PrintConfig.cpp:2578
+#: src/libslic3r/PrintConfig.cpp:2721
msgid "SLA print material notes"
msgstr "Notatki dla materiału SLA"
-#: src/slic3r/GUI/Plater.cpp:817
+#: src/slic3r/GUI/Plater.cpp:692
msgid "SLA print settings"
-msgstr "Ustawienia Druku SLA"
+msgstr "Ustawienia druku SLA"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:996
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869
msgid "SLA Support Points"
msgstr "Punkty podpór SLA"
-#: src/slic3r/GUI/GLCanvas3D.cpp:687
-msgid "SLA supports outside the print area were detected"
-msgstr "Wykryto podpory SLA poza obszarem roboczym"
+#: src/slic3r/GUI/GLCanvas3D.cpp:635
+msgid "SLA supports outside the print area were detected."
+msgstr "Wykryto podpory SLA poza obszarem roboczym."
-#: src/slic3r/GUI/ConfigWizard.cpp:1530
+#: src/slic3r/GUI/ConfigWizard.cpp:1931
msgid "SLA Technology Printers"
msgstr "Drukarki SLA"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1432
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
msgid "Slab"
msgstr "Tafla"
-#: src/libslic3r/PrintConfig.cpp:1333
+#: src/libslic3r/PrintConfig.cpp:1441
msgid "Slic3r can upload G-code files to a printer host. This field must contain the kind of the host."
-msgstr "Slic3r może przesyłać pliki G-code do serwera druku. To pole powinno zawierać rodzaj serwera."
+msgstr "PrusaSlicer może przesyłać pliki G-code do serwera druku. To pole powinno zawierać rodzaj serwera."
-#: src/libslic3r/PrintConfig.cpp:105
+#: src/libslic3r/PrintConfig.cpp:107
msgid "Slic3r can upload G-code files to a printer host. This field should contain the API Key or the password required for authentication."
msgstr "Slic3r może przesyłać pliki G-code do serwera druku. To pole powinno zawierać klucz API lub hasło niezbędne do uwierzytelnienia."
-#: src/libslic3r/PrintConfig.cpp:98
-msgid "Slic3r can upload G-code files to a printer host. This field should contain the hostname, IP address or URL of the printer host instance."
-msgstr "Slic3r może przesyłać pliki G-code do serwera druku. Ta sekcja powinna zawierać nazwę hosta, adres IP lub adres URL serwera."
+#: src/libslic3r/PrintConfig.cpp:100
+msgid "Slic3r can upload G-code files to a printer host. This field should contain the hostname, IP address or URL of the printer host instance. Print host behind HAProxy with basic auth enabled can be accessed by putting the user name and password into the URL in the following format: https://username:password@your-octopi-address/"
+msgstr "PrusaSlicer może przesyłać pliki G-code do serwera druku. To pole powinno zawierać nazwę hosta, adres IP lub URL instancji hosta drukarki. Możesz zyskać dostęp do hosta ukrytego za HAProxy z podstawową autoryzacją przez wpisanie hasła w pole URL w tym formacie: https://nazwa_użytkownika:hasło@adres-octopi/"
-#: src/libslic3r/PrintConfig.cpp:1299
+#: src/libslic3r/PrintConfig.cpp:1407
msgid "Slic3r will not scale speed down below this speed."
-msgstr "Slic3r nie będzie skalował prędkości poniżej tej wartości."
+msgstr "PrusaSlicer nie będzie skalował prędkości poniżej tej wartości."
-#: src/libslic3r/PrintConfig.cpp:3359
+#: src/libslic3r/PrintConfig.cpp:3558
msgid "Slice"
msgstr "Cięcie"
-#: src/slic3r/GUI/MainFrame.cpp:512
+#: src/slic3r/GUI/MainFrame.cpp:1113
msgid "Slice a file into a G-code"
msgstr "Cięcie jako G-code"
-#: src/slic3r/GUI/MainFrame.cpp:518
+#: src/slic3r/GUI/MainFrame.cpp:1119
msgid "Slice a file into a G-code, save as"
msgstr "Cięcie jako G-code, zapisz jako"
-#: src/libslic3r/PrintConfig.cpp:87
+#: src/libslic3r/PrintConfig.cpp:89
msgid "Slice gap closing radius"
msgstr "Promień zamykania szpar"
-#: src/slic3r/GUI/Plater.cpp:892 src/slic3r/GUI/Plater.cpp:3121
-#: src/slic3r/GUI/Plater.cpp:5110
+#: src/slic3r/GUI/Plater.cpp:767 src/slic3r/GUI/Plater.cpp:2921
+#: src/slic3r/GUI/Plater.cpp:5237
msgid "Slice now"
msgstr "Cięcie"
-#: src/libslic3r/PrintConfig.cpp:3333
+#: src/libslic3r/PrintConfig.cpp:3526
msgid "Slice the model and export SLA printing layers as PNG."
msgstr "Cięcie modelu i eksport warstw SLA jako PNG."
-#: src/libslic3r/PrintConfig.cpp:3354
+#: src/libslic3r/PrintConfig.cpp:3547
msgid "Slice the model and export toolpaths as G-code."
msgstr "Cięcie modelu i eksport ścieżek narzędzi jako G-code."
-#: src/libslic3r/PrintConfig.cpp:3360
+#: src/libslic3r/PrintConfig.cpp:3559
msgid "Slice the model as FFF or SLA based on the printer_technology configuration value."
msgstr "Cięcie modelu jako FFF lub SLA oparte o ustawienie konfiguracji printer_technology."
-#: src/slic3r/GUI/Plater.cpp:216
+#: src/slic3r/GUI/Plater.cpp:222
msgid "Sliced Info"
msgstr "Informacje o cięciu"
-#: src/slic3r/GUI/MainFrame.cpp:847 src/slic3r/GUI/Plater.cpp:3121
-#: src/slic3r/GUI/Plater.cpp:5107 src/slic3r/GUI/Tab.cpp:1221
-#: src/slic3r/GUI/Tab.cpp:3662
+#: src/slic3r/GUI/MainFrame.cpp:1548 src/slic3r/GUI/Plater.cpp:2921
+#: src/slic3r/GUI/Plater.cpp:5234 src/slic3r/GUI/Tab.cpp:1551
+#: src/slic3r/GUI/Tab.cpp:4081
msgid "Slicing"
msgstr "Cięcie"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:134
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:184
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:170
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:219
msgid "Slicing complete"
msgstr "Cięcie zakończone"
-#: src/libslic3r/SLAPrint.cpp:760
+#: src/libslic3r/SLAPrint.cpp:780
msgid "Slicing done"
msgstr "Cięcie zakończone"
-#: src/slic3r/GUI/MainFrame.cpp:874
+#: src/slic3r/GUI/MainFrame.cpp:1575
msgid "Slicing Done!"
msgstr "Cięcie zakończone!"
-#: src/libslic3r/SLAPrintSteps.cpp:245
+#: src/slic3r/GUI/NotificationManager.cpp:751
+msgid "Slicing finished."
+msgstr "Cięcie zakończone."
+
+#: src/libslic3r/SLAPrintSteps.cpp:247
msgid "Slicing had to be stopped due to an internal error: Inconsistent slice index."
msgstr "Cięcie zostało zatrzymane z powodu błędu wewnętrznego: nieciągły indeks cięcia."
-#: src/libslic3r/SLAPrintSteps.cpp:45
+#: src/libslic3r/SLAPrintSteps.cpp:46
msgid "Slicing model"
msgstr "Cięcie modelu"
-#: src/libslic3r/SLAPrintSteps.cpp:49
+#: src/libslic3r/SLAPrintSteps.cpp:50
msgid "Slicing supports"
msgstr "Cięcie podpór"
-#: src/libslic3r/PrintConfig.cpp:2414
+#: src/libslic3r/PrintConfig.cpp:2557
msgid "Slow"
msgstr "Wolne"
-#: src/libslic3r/PrintConfig.cpp:1705
+#: src/libslic3r/PrintConfig.cpp:1820
msgid "Slow down if layer print time is below"
msgstr "Zwolnij jeśli czas warstwy wynosi mniej niż"
-#: src/libslic3r/PrintConfig.cpp:2415
+#: src/libslic3r/PrintConfig.cpp:2558
msgid "Slow tilt"
msgstr "Wolne przechylanie"
-#: src/libslic3r/PrintConfig.cpp:1715
+#: src/libslic3r/PrintConfig.cpp:1830
msgid "Small perimeters"
msgstr "Małe obrysy"
-#: src/slic3r/GUI/GLCanvas3D.cpp:288
+#: src/libslic3r/PrintConfig.cpp:2801
+msgid "Small pillar diameter percent"
+msgstr "Procent średnicy małego słupka"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:274
msgid "Smooth"
-msgstr "GÅ‚adki"
+msgstr "Wygładzanie"
-#: src/slic3r/GUI/GLCanvas3D.cpp:258
+#: src/slic3r/GUI/GLCanvas3D.cpp:247
msgid "Smoothing"
msgstr "Wygładzanie"
-#: src/slic3r/GUI/GUI_App.cpp:839
+#: src/slic3r/GUI/GUI_App.cpp:1540
msgid "Snapshot name"
msgstr "Nazwa zrzutu"
-#: src/slic3r/GUI/MainFrame.cpp:686
+#: src/slic3r/GUI/MainFrame.cpp:911 src/slic3r/GUI/MainFrame.cpp:1310
msgid "Software &Releases"
msgstr "Wersje oprog&ramowania"
-#: src/slic3r/GUI/PresetHints.cpp:184
+#: src/slic3r/GUI/PresetHints.cpp:183
msgid "solid infill"
msgstr "zwarte wypełnienie"
-#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:314
-#: src/libslic3r/PrintConfig.cpp:1756 src/libslic3r/PrintConfig.cpp:1767
+#: src/slic3r/GUI/GUI_Preview.cpp:305 src/libslic3r/ExtrusionEntity.cpp:318
+#: src/libslic3r/ExtrusionEntity.cpp:344 src/libslic3r/PrintConfig.cpp:1871
+#: src/libslic3r/PrintConfig.cpp:1882
msgid "Solid infill"
msgstr "Zwarte wypełnienie"
-#: src/libslic3r/PrintConfig.cpp:1744
+#: src/libslic3r/PrintConfig.cpp:1859
msgid "Solid infill every"
msgstr "Zwarte wypełnienie co"
-#: src/libslic3r/PrintConfig.cpp:1736
+#: src/libslic3r/PrintConfig.cpp:1851
msgid "Solid infill extruder"
msgstr "Ekstruder do zwartego wypełnienia"
-#: src/libslic3r/PrintConfig.cpp:1727
+#: src/libslic3r/PrintConfig.cpp:1842
msgid "Solid infill threshold area"
msgstr "Min. powierzchnia zwartego wypełnienia"
-#: src/slic3r/GUI/Tab.cpp:1065 src/libslic3r/PrintConfig.cpp:1780
+#: src/slic3r/GUI/Tab.cpp:1387 src/libslic3r/PrintConfig.cpp:1895
msgid "Solid layers"
msgstr "Zwarte warstwy"
-#: src/libslic3r/PrintConfig.cpp:754
+#: src/libslic3r/PrintConfig.cpp:790
msgid "Soluble material"
msgstr "Materiał rozpuszczalny"
-#: src/libslic3r/PrintConfig.cpp:755
+#: src/libslic3r/PrintConfig.cpp:791
msgid "Soluble material is most likely used for a soluble support."
msgstr "Materiał rozpuszczalny jest używany zazwyczaj do rozpuszczalnych podpór."
-#: src/libslic3r/PrintConfig.cpp:937
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:735
+msgid "Some fields are too long to fit. Right mouse click reveals the full text."
+msgstr "Niektóre opisy są zbyt długie, aby mogły się zmieścić. Kliknij prawym przyciskiem, aby pokazać cały tekst."
+
+#: src/libslic3r/PrintConfig.cpp:981
msgid "Some G/M-code commands, including temperature control and others, are not universal. Set this option to your printer's firmware to get a compatible output. The \"No extrusion\" flavor prevents PrusaSlicer from exporting any extrusion value at all."
msgstr "Niektóre komendy kodu G/M, wliczając kontrolę temperatury i inne, nie są uniwersalne. Ustaw tą opcję w firmware Twojej drukarki, aby uzyskać kompatybilny plik wyjściowy. Wariant \"no extrusion\" wyłączy generowanie jakichkolwiek wartości ekstruzji."
-#: src/slic3r/GUI/GLCanvas3D.cpp:688
-msgid "Some objects are not visible"
-msgstr "Niektóre obiekty są niewidoczne"
+#: src/slic3r/GUI/Plater.cpp:2309
+#, possible-c-format
+msgid "Some object(s) in file %s looks like saved in inches.\nShould I consider them as a saved in inches and convert them?"
+msgstr "Niektóre modele w pliku %s wyglądają, jak zapisane w calach.\nCzy traktować je jako zapisane w calach i przekonwertować?"
-#: src/libslic3r/Print.cpp:1226
+#: src/slic3r/GUI/GLCanvas3D.cpp:636
+msgid "Some objects are not visible."
+msgstr "Niektóre modele są niewidoczne."
+
+#: src/libslic3r/Print.cpp:1252
msgid "Some objects are too close; your extruder will collide with them."
msgstr "Niektóre modele są zbyt blisko; ekstruder zderzy się z którymś z nich."
-#: src/libslic3r/Print.cpp:1228
+#: src/libslic3r/Print.cpp:1254
msgid "Some objects are too tall and cannot be printed without extruder collisions."
-msgstr "Niektóre modele są zbyt wysokie aby można było wydrukować je bez kolizji."
+msgstr "Niektóre modele są zbyt wysokie, aby można było wydrukować je bez kolizji."
-#: src/libslic3r/PrintConfig.cpp:2824
+#: src/libslic3r/PrintConfig.cpp:2988
msgid "Some objects can get along with a few smaller pads instead of a single big one. This parameter defines how far the center of two smaller pads should be. If theyare closer, they will get merged into one pad."
msgstr "Niektóre modele można wydrukować z kilkoma mniejszymi podkładkami, zamiast jednej dużej. Ten parametr określa jak daleko od siebie powinny znajdować się dwie mniejsze podkładki. Jeśli znajdą się zbyt blisko, to zostaną złączone w jedną, dużą podkładkę."
-#: src/libslic3r/PrintConfig.cpp:2187
+#: src/libslic3r/PrintConfig.cpp:2330
msgid "Some printers or printer setups may have difficulties printing with a variable layer height. Enabled by default."
msgstr "Niektóre drukarki mogą mieć trudności z drukiem ze zmienną wysokością warstwy. Domyślnie włączone."
-#: src/libslic3r/PrintConfig.cpp:1984
+#: src/slic3r/GUI/GLCanvas3D.cpp:3967
+msgid "Spacing"
+msgstr "Odstęp"
+
+#: src/libslic3r/PrintConfig.cpp:2126
msgid "Spacing between interface lines. Set zero to get a solid interface."
msgstr "Rozstaw linii warstwy Å‚Ä…czÄ…cej. Ustaw zero dla zwartej warstwy Å‚Ä…czÄ…cej."
-#: src/libslic3r/PrintConfig.cpp:2018
+#: src/libslic3r/PrintConfig.cpp:1155
+msgid "Spacing between ironing passes"
+msgstr "Odstęp między ścieżkami prasowania"
+
+#: src/libslic3r/PrintConfig.cpp:2160
msgid "Spacing between support material lines."
msgstr "Rozstaw linii materiału podporowego."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:616
-#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/Tab.cpp:1145
-#: src/libslic3r/PrintConfig.cpp:235 src/libslic3r/PrintConfig.cpp:458
-#: src/libslic3r/PrintConfig.cpp:919 src/libslic3r/PrintConfig.cpp:1048
-#: src/libslic3r/PrintConfig.cpp:1431 src/libslic3r/PrintConfig.cpp:1668
-#: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1768
-#: src/libslic3r/PrintConfig.cpp:2118
+#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:655
+#: src/slic3r/GUI/GUI_Preview.cpp:278 src/slic3r/GUI/Tab.cpp:1474
+#: src/libslic3r/PrintConfig.cpp:269 src/libslic3r/PrintConfig.cpp:494
+#: src/libslic3r/PrintConfig.cpp:963 src/libslic3r/PrintConfig.cpp:1092
+#: src/libslic3r/PrintConfig.cpp:1165 src/libslic3r/PrintConfig.cpp:1539
+#: src/libslic3r/PrintConfig.cpp:1776 src/libslic3r/PrintConfig.cpp:1831
+#: src/libslic3r/PrintConfig.cpp:1883 src/libslic3r/PrintConfig.cpp:2261
msgid "Speed"
msgstr "Prędkość"
-#: src/libslic3r/PrintConfig.cpp:1670
-msgid "Speed (baud) of USB/serial port for printer connection."
-msgstr "Szybkość transmisji portu USB/portu szeregowego do połączenia z drukarką."
-
-#: src/libslic3r/GCode/PreviewData.cpp:351
+#: src/slic3r/GUI/GCodeViewer.cpp:2238 src/libslic3r/GCode/PreviewData.cpp:356
msgid "Speed (mm/s)"
msgstr "Prędkość (mm/s)"
-#: src/libslic3r/PrintConfig.cpp:920
+#: src/libslic3r/PrintConfig.cpp:964
msgid "Speed for filling small gaps using short zigzag moves. Keep this reasonably low to avoid too much shaking and resonance issues. Set zero to disable gaps filling."
-msgstr "Prędkość wypełniania szczelin krótkimi ruchami typu zygzak. Ustaw tą wartość na tyle nisko aby uniknąć wibracji i rezonansu. Ustaw 0 aby wyłączyć wypełnianie szczelin."
+msgstr "Prędkość wypełniania szczelin krótkimi ruchami typu zygzak. Ustaw tą wartość na tyle nisko, aby uniknąć wibracji i rezonansu. Ustaw 0, aby wyłączyć wypełnianie szczelin."
-#: src/slic3r/GUI/Tab.cpp:1158
+#: src/slic3r/GUI/Tab.cpp:1488
msgid "Speed for non-print moves"
msgstr "Prędkość ruchów jałowych"
-#: src/libslic3r/PrintConfig.cpp:1432
+#: src/libslic3r/PrintConfig.cpp:1540
msgid "Speed for perimeters (contours, aka vertical shells). Set to zero for auto."
msgstr "Prędkość obrysów (inaczej powłoki pionowej). Ustaw 0 dla prędkości automatycznej."
-#: src/slic3r/GUI/Tab.cpp:1146
+#: src/slic3r/GUI/Tab.cpp:1475
msgid "Speed for print moves"
msgstr "Prędkość ruchów drukujących"
-#: src/libslic3r/PrintConfig.cpp:236
+#: src/libslic3r/PrintConfig.cpp:270
msgid "Speed for printing bridges."
msgstr "Prędkość drukowania mostów."
-#: src/libslic3r/PrintConfig.cpp:1769
+#: src/libslic3r/PrintConfig.cpp:1884
msgid "Speed for printing solid regions (top/bottom/internal horizontal shells). This can be expressed as a percentage (for example: 80%) over the default infill speed above. Set to zero for auto."
msgstr "Prędkość druku zwartych obszarów (góra/dół/poziome powłoki wewnętrzne). Może być wyrażona procentowo (np. 80%) ponad domyślną prędkość wypełnienia. Wpisz zero dla automatycznego ustawienia."
-#: src/libslic3r/PrintConfig.cpp:1993
+#: src/libslic3r/PrintConfig.cpp:2135
msgid "Speed for printing support material interface layers. If expressed as percentage (for example 50%) it will be calculated over support material speed."
msgstr "Prędkość druku warstw łączących materiału podporowego. Jeśli ustawisz wartość procentową (np. 50%) to zostanie obliczona z prędkości druku materiału podporowego."
-#: src/libslic3r/PrintConfig.cpp:2027
+#: src/libslic3r/PrintConfig.cpp:2169
msgid "Speed for printing support material."
msgstr "Prędkość druku materiału podporowego."
-#: src/libslic3r/PrintConfig.cpp:1049
+#: src/libslic3r/PrintConfig.cpp:1093
msgid "Speed for printing the internal fill. Set to zero for auto."
msgstr "Prędkość druku wewnętrznego wypełnienia. Ustaw 0 dla prędkości automatycznej."
-#: src/libslic3r/PrintConfig.cpp:2119
+#: src/libslic3r/PrintConfig.cpp:2262
msgid "Speed for printing top solid layers (it only applies to the uppermost external layers and not to their internal solid layers). You may want to slow down this to get a nicer surface finish. This can be expressed as a percentage (for example: 80%) over the solid infill speed above. Set to zero for auto."
msgstr "Prędkość druku najwyższych warstw zwartych (dotyczy tylko najwyższych, zewnętrznych warstw i nie obejmuje zwartych warstw umieszczonych niżej). Warto obniżyć tą wartość dla ładniejszego wykończenia powierzchni. Jeśli ustawisz wartość procentową (np. 80%) to zosttanie obliczona z prędkości druku zwartego wypełnienia. Ustaw zero dla prędkości automatycznej."
-#: src/libslic3r/PrintConfig.cpp:2153
+#: src/libslic3r/PrintConfig.cpp:2296
msgid "Speed for travel moves (jumps between distant extrusion points)."
msgstr "Prędkość ruchów jałowych (przeskoków pomiędzy punktami ekstruzji)."
-#: src/libslic3r/PrintConfig.cpp:659
+#: src/libslic3r/PrintConfig.cpp:695
msgid "Speed of the first cooling move"
msgstr "Prędkość pierwszego ruchu chłodzącego"
-#: src/libslic3r/PrintConfig.cpp:678
+#: src/libslic3r/PrintConfig.cpp:714
msgid "Speed of the last cooling move"
msgstr "Prędkość ostatniego ruchu chłodzącego"
-#: src/libslic3r/PrintConfig.cpp:616
+#: src/libslic3r/PrintConfig.cpp:652
msgid "Speed used at the very beginning of loading phase."
msgstr "Prędkość używana podczas początkowej fazy ładowania filamentu."
-#: src/libslic3r/PrintConfig.cpp:608
+#: src/libslic3r/PrintConfig.cpp:644
msgid "Speed used for loading the filament on the wipe tower."
msgstr "Prędkość ładowania filamentu podczas drukowania wieży czyszczącej."
-#: src/libslic3r/PrintConfig.cpp:624
+#: src/libslic3r/PrintConfig.cpp:660
msgid "Speed used for unloading the filament on the wipe tower (does not affect initial part of unloading just after ramming)."
msgstr "Prędkość rozładowywania filamentu dla wieży czyszczącej (nie wpływa na początkową fazę rozładowywania zaraz po wyciskaniu)."
-#: src/libslic3r/PrintConfig.cpp:633
+#: src/libslic3r/PrintConfig.cpp:669
msgid "Speed used for unloading the tip of the filament immediately after ramming."
msgstr "Prędkość wycofywania (rozładowywania) końcówki filamentu bezpośrednio po wyciskaniu."
-#: src/slic3r/GUI/Mouse3DController.cpp:296
+#: src/slic3r/GUI/Mouse3DController.cpp:279
msgid "Speed:"
msgstr "Prędkość:"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1432
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
msgid "Sphere"
msgstr "Kula"
-#: src/libslic3r/PrintConfig.cpp:1794
+#: src/libslic3r/PrintConfig.cpp:1909
msgid "Spiral vase"
msgstr "Tryb wazy"
-#: src/slic3r/GUI/ConfigManipulation.cpp:90
+#: src/slic3r/GUI/ConfigManipulation.cpp:89
msgid "Spiral Vase"
msgstr "Tryb wazy"
-#: src/slic3r/GUI/Plater.cpp:4019 src/slic3r/GUI/Plater.cpp:4034
-#: src/slic3r/GUI/Plater.cpp:4048 src/libslic3r/PrintConfig.cpp:3471
+#: src/slic3r/GUI/Plater.cpp:3939 src/slic3r/GUI/Plater.cpp:3954
+#: src/slic3r/GUI/Plater.cpp:3972 src/libslic3r/PrintConfig.cpp:3670
msgid "Split"
msgstr "Podziel"
-#: src/slic3r/GUI/Plater.cpp:4019
+#: src/slic3r/GUI/Plater.cpp:3939
msgid "Split the selected object"
msgstr "Podziel zaznaczony model"
-#: src/slic3r/GUI/Plater.cpp:4014 src/slic3r/GUI/Plater.cpp:4034
+#: src/slic3r/GUI/Plater.cpp:3934 src/slic3r/GUI/Plater.cpp:3954
msgid "Split the selected object into individual objects"
msgstr "Podziel wybrany model na osobne modele"
-#: src/slic3r/GUI/Plater.cpp:4016 src/slic3r/GUI/Plater.cpp:4048
+#: src/slic3r/GUI/Plater.cpp:3936 src/slic3r/GUI/Plater.cpp:3972
msgid "Split the selected object into individual sub-parts"
msgstr "Podziel wybrany model na części"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4550
+#: src/slic3r/GUI/GLCanvas3D.cpp:4916
msgid "Split to objects"
msgstr "Podziel na osobne modele"
-#: src/slic3r/GUI/Plater.cpp:2981
+#: src/slic3r/GUI/Plater.cpp:2774
msgid "Split to Objects"
msgstr "Podziel na modele"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4560 src/slic3r/GUI/GUI_ObjectList.cpp:1487
+#: src/slic3r/GUI/GLCanvas3D.cpp:4926 src/slic3r/GUI/GUI_ObjectList.cpp:1618
msgid "Split to parts"
msgstr "Podziel na części"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2274
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2440
msgid "Split to Parts"
msgstr "Podziel na części"
-#: src/slic3r/GUI/ConfigWizard.cpp:289
+#: src/libslic3r/PrintConfig.cpp:812
+msgid "Spool weight"
+msgstr "Waga szpuli"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:307
msgid "Standard"
msgstr "Standard"
-#: src/libslic3r/PrintConfig.cpp:846
+#: src/libslic3r/PrintConfig.cpp:884
msgid "Stars"
msgstr "Gwiazdki"
-#: src/slic3r/GUI/MainFrame.cpp:405
+#: src/slic3r/GUI/MainFrame.cpp:986
msgid "Start a new project"
msgstr "Rozpocznij nowy projekt"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29
msgid "Start at height"
msgstr "Zakres od"
-#: src/slic3r/GUI/Tab.cpp:1528 src/slic3r/GUI/Tab.cpp:1976
-#: src/libslic3r/PrintConfig.cpp:1813 src/libslic3r/PrintConfig.cpp:1828
+#: src/slic3r/GUI/Tab.cpp:1873 src/slic3r/GUI/Tab.cpp:2161
+#: src/libslic3r/PrintConfig.cpp:1928 src/libslic3r/PrintConfig.cpp:1943
msgid "Start G-code"
msgstr "G-code startowy"
-#: src/slic3r/GUI/MainFrame.cpp:532
+#: src/slic3r/GUI/MainFrame.cpp:1133
msgid "Start new slicing process"
msgstr "Uruchom nowy proces cięcia"
@@ -7358,7 +8619,15 @@ msgstr "Uruchom nowy proces cięcia"
msgid "Start printing after upload"
msgstr "Zacznij druk po przesłaniu"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:151
+#: src/slic3r/GUI/GUI_App.cpp:396
+msgid "Start the application"
+msgstr "Uruchom aplikacjÄ™"
+
+#: src/slic3r/GUI/GUI_App.cpp:386
+msgid "Starting with %1% 2.3, configuration directory on Linux has changed (according to XDG Base Directory Specification) to \n%2%.\n\nThis directory did not exist yet (maybe you run the new version for the first time).\nHowever, an old %1% configuration directory was detected in \n%3%.\n\nConsider moving the contents of the old directory to the new location in order to access your profiles, etc.\nNote that if you decide to downgrade %1% in future, it will use the old location again.\n\nWhat do you want to do now?"
+msgstr "Zaczynając od %1% 2.3, konfiguracje na Linuxie zostały przeniesione (zgodnie ze specyfikacją XDG Base Directory) do\n%2%.\n\nTen katalog jeszcze nie istnieje (powodem może być pierwsze uruchomienie nowej wersji).\nJednak poprzedni katalog konfiguracji %1% został wykryty w\n%3%.\n\nRozważ przeniesienie zawartości poprzedniego katalogu do nowej lokalizacji, aby mieć dostęp do swoich profili itd.\nWeź pod uwagę, że jeśli zdecyduje się w przyszłości zainstalować starszą wersję %1%, z powrotem zostanie użyty poprzedni katalog.\n\nCzy chcesz to teraz zrobić?"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:149
msgid "Status"
msgstr "Stan"
@@ -7366,863 +8635,873 @@ msgstr "Stan"
msgid "Status:"
msgstr "Stan:"
-#: src/slic3r/GUI/Tab.cpp:2209
+#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2378
msgid "Stealth"
msgstr "Stealth"
-#: src/slic3r/GUI/Plater.cpp:1291
+#: src/slic3r/GUI/Plater.cpp:1187 src/slic3r/GUI/Plater.cpp:1235
msgid "stealth mode"
msgstr "tryb stealth"
-#: src/slic3r/GUI/Plater.cpp:4985
-#, c-format
+#: src/slic3r/GUI/GCodeViewer.cpp:2557
+msgid "Stealth mode"
+msgstr "Tryb stealth"
+
+#: src/slic3r/GUI/Plater.cpp:5118
+#, possible-c-format
msgid "STL file exported to %s"
msgstr "Plik STL wyeksportowany do %s"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29
msgid "Stop at height"
msgstr "Zakres do"
-#: src/slic3r/GUI/Tab.cpp:1693 src/slic3r/GUI/Tab.cpp:1928
+#: src/slic3r/GUI/GUI_App.cpp:1781
+msgid "Stop them and continue anyway?"
+msgstr "Zatrzymać i kontynuować mimo wszystko?"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:295
msgid "Success!"
msgstr "Powodzenie!"
-#: src/slic3r/GUI/PresetHints.cpp:203
+#: src/slic3r/GUI/Plater.cpp:2047
+#, possible-c-format
+msgid "Successfully unmounted. The device %s(%s) can now be safely removed from the computer."
+msgstr "Wysunięto pomyślnie. Urządzenie %s(%s) można teraz bezpiecznie odłączyć od komputera."
+
+#: src/slic3r/GUI/PresetHints.cpp:202
msgid "support"
msgstr "podpora"
-#: src/libslic3r/PrintConfig.cpp:2692
+#: src/libslic3r/PrintConfig.cpp:2856
msgid "Support base diameter"
msgstr "Åšrednica stopy podpory"
-#: src/libslic3r/PrintConfig.cpp:2702
+#: src/libslic3r/PrintConfig.cpp:2866
msgid "Support base height"
msgstr "Wysokość stopy podpory"
-#: src/libslic3r/PrintConfig.cpp:2711
+#: src/libslic3r/PrintConfig.cpp:2875
msgid "Support base safety distance"
msgstr "Bezpieczna odległość stopy podpory"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3551
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
msgid "Support Blocker"
msgstr "Blokada podpór"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3551
+#: src/libslic3r/PrintConfig.cpp:895
+msgid "Support Cubic"
+msgstr "Sześcienny podpierający"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
msgid "Support Enforcer"
msgstr "Wymuszenie podpór"
-#: src/slic3r/GUI/ConfigManipulation.cpp:163
+#: src/slic3r/GUI/ConfigManipulation.cpp:162
msgid "Support Generator"
msgstr "Generator podpór"
-#: src/slic3r/GUI/Tab.cpp:3608
+#: src/slic3r/GUI/Tab.cpp:4018
msgid "Support head"
msgstr "ÅÄ…cznik podpory"
-#: src/libslic3r/PrintConfig.cpp:2620
-msgid "Support head front diameter"
-msgstr "Åšrednica poczÄ…tku Å‚Ä…cznika"
-
-#: src/libslic3r/PrintConfig.cpp:2629
-msgid "Support head penetration"
-msgstr "Przenikanie łączników podpór"
-
-#: src/libslic3r/PrintConfig.cpp:2638
-msgid "Support head width"
-msgstr "Szerokość łączników podpór"
-
-#: src/slic3r/GUI/PresetHints.cpp:213
+#: src/slic3r/GUI/PresetHints.cpp:212
msgid "support interface"
msgstr "warstwa Å‚Ä…czÄ…ca podpory z modelem"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:97
-#: src/slic3r/GUI/GUI_ObjectList.cpp:615 src/slic3r/GUI/GUI_Preview.cpp:246
-#: src/slic3r/GUI/Tab.cpp:1120 src/slic3r/GUI/Tab.cpp:1121
-#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/PrintConfig.cpp:370
-#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1866
-#: src/libslic3r/PrintConfig.cpp:1872 src/libslic3r/PrintConfig.cpp:1880
-#: src/libslic3r/PrintConfig.cpp:1892 src/libslic3r/PrintConfig.cpp:1902
-#: src/libslic3r/PrintConfig.cpp:1910 src/libslic3r/PrintConfig.cpp:1925
-#: src/libslic3r/PrintConfig.cpp:1946 src/libslic3r/PrintConfig.cpp:1958
-#: src/libslic3r/PrintConfig.cpp:1974 src/libslic3r/PrintConfig.cpp:1983
-#: src/libslic3r/PrintConfig.cpp:1992 src/libslic3r/PrintConfig.cpp:2003
-#: src/libslic3r/PrintConfig.cpp:2017 src/libslic3r/PrintConfig.cpp:2025
-#: src/libslic3r/PrintConfig.cpp:2026 src/libslic3r/PrintConfig.cpp:2035
-#: src/libslic3r/PrintConfig.cpp:2043 src/libslic3r/PrintConfig.cpp:2057
+#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:95
+#: src/slic3r/GUI/GUI_ObjectList.cpp:654 src/slic3r/GUI/GUI_Preview.cpp:311
+#: src/slic3r/GUI/Tab.cpp:1449 src/slic3r/GUI/Tab.cpp:1450
+#: src/libslic3r/ExtrusionEntity.cpp:324 src/libslic3r/ExtrusionEntity.cpp:356
+#: src/libslic3r/PrintConfig.cpp:404 src/libslic3r/PrintConfig.cpp:1610
+#: src/libslic3r/PrintConfig.cpp:2008 src/libslic3r/PrintConfig.cpp:2014
+#: src/libslic3r/PrintConfig.cpp:2022 src/libslic3r/PrintConfig.cpp:2034
+#: src/libslic3r/PrintConfig.cpp:2044 src/libslic3r/PrintConfig.cpp:2052
+#: src/libslic3r/PrintConfig.cpp:2067 src/libslic3r/PrintConfig.cpp:2088
+#: src/libslic3r/PrintConfig.cpp:2100 src/libslic3r/PrintConfig.cpp:2116
+#: src/libslic3r/PrintConfig.cpp:2125 src/libslic3r/PrintConfig.cpp:2134
+#: src/libslic3r/PrintConfig.cpp:2145 src/libslic3r/PrintConfig.cpp:2159
+#: src/libslic3r/PrintConfig.cpp:2167 src/libslic3r/PrintConfig.cpp:2168
+#: src/libslic3r/PrintConfig.cpp:2177 src/libslic3r/PrintConfig.cpp:2185
+#: src/libslic3r/PrintConfig.cpp:2199
msgid "Support material"
msgstr "Materiał podporowy"
-#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:320
-#: src/libslic3r/PrintConfig.cpp:1991
+#: src/slic3r/GUI/GUI_Preview.cpp:312 src/libslic3r/ExtrusionEntity.cpp:325
+#: src/libslic3r/ExtrusionEntity.cpp:358 src/libslic3r/PrintConfig.cpp:2133
msgid "Support material interface"
msgstr "Warstwa Å‚Ä…czÄ…ca podpory z modelem"
-#: src/libslic3r/PrintConfig.cpp:2044
+#: src/libslic3r/PrintConfig.cpp:2186
msgid "Support material will not be generated for overhangs whose slope angle (90° = vertical) is above the given threshold. In other words, this value represent the most horizontal slope (measured from the horizontal plane) that you can print without support material. Set to zero for automatic detection (recommended)."
msgstr "Podpory nie będą generowane dla zwisów, których kąt przekracza zadany próg (90° = pion). Inaczej mówiąc, ta wartość określa największy kąt od poziomu (kąt mierzony od płaszczyzny poziomej), który będzie drukowany bez podpór."
-#: src/libslic3r/PrintConfig.cpp:1964
+#: src/libslic3r/PrintConfig.cpp:2106
msgid "Support material/raft interface extruder"
msgstr "Ekstruder dla podpór/warstw łączących raft z modelem"
-#: src/libslic3r/PrintConfig.cpp:1937
+#: src/libslic3r/PrintConfig.cpp:2079
msgid "Support material/raft/skirt extruder"
msgstr "Ekstruder dla podpór/tratwy (raft)/skirtu"
-#: src/slic3r/GUI/Plater.cpp:500 src/libslic3r/PrintConfig.cpp:1901
-#: src/libslic3r/PrintConfig.cpp:2674
+#: src/slic3r/GUI/Plater.cpp:366 src/libslic3r/PrintConfig.cpp:2043
+#: src/libslic3r/PrintConfig.cpp:2838
msgid "Support on build plate only"
msgstr "Podpory tylko na stole"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:888
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:762
msgid "Support parameter change"
msgstr "Zmiana parametrów podpór"
-#: src/slic3r/GUI/Tab.cpp:3613
+#: src/slic3r/GUI/Tab.cpp:4023
msgid "Support pillar"
msgstr "SÅ‚upek podpory"
-#: src/libslic3r/PrintConfig.cpp:2658
-msgid "Support pillar connection mode"
-msgstr "Tryb łączenia słupków podpór"
-
-#: src/libslic3r/PrintConfig.cpp:2648
-msgid "Support pillar diameter"
-msgstr "Średnica słupków podpór"
-
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55
-#: src/libslic3r/PrintConfig.cpp:2764
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54
+#: src/libslic3r/PrintConfig.cpp:2928
msgid "Support points density"
msgstr "Gęstość punktów podpór"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1196
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1048
msgid "Support points edit"
msgstr "Edycja punktów podpór"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/GUI_ObjectList.cpp:624
-#: src/slic3r/GUI/Plater.cpp:495 src/slic3r/GUI/Tab.cpp:3604
-#: src/slic3r/GUI/Tab.cpp:3605 src/libslic3r/PrintConfig.cpp:2614
-#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2630
-#: src/libslic3r/PrintConfig.cpp:2639 src/libslic3r/PrintConfig.cpp:2649
-#: src/libslic3r/PrintConfig.cpp:2675 src/libslic3r/PrintConfig.cpp:2682
-#: src/libslic3r/PrintConfig.cpp:2693 src/libslic3r/PrintConfig.cpp:2703
-#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2725
-#: src/libslic3r/PrintConfig.cpp:2735 src/libslic3r/PrintConfig.cpp:2744
-#: src/libslic3r/PrintConfig.cpp:2754 src/libslic3r/PrintConfig.cpp:2765
-#: src/libslic3r/PrintConfig.cpp:2773
+#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:663
+#: src/slic3r/GUI/Plater.cpp:361 src/slic3r/GUI/Tab.cpp:4014
+#: src/slic3r/GUI/Tab.cpp:4015 src/libslic3r/PrintConfig.cpp:2757
+#: src/libslic3r/PrintConfig.cpp:2764 src/libslic3r/PrintConfig.cpp:2773
+#: src/libslic3r/PrintConfig.cpp:2782 src/libslic3r/PrintConfig.cpp:2792
+#: src/libslic3r/PrintConfig.cpp:2802 src/libslic3r/PrintConfig.cpp:2839
+#: src/libslic3r/PrintConfig.cpp:2846 src/libslic3r/PrintConfig.cpp:2857
+#: src/libslic3r/PrintConfig.cpp:2867 src/libslic3r/PrintConfig.cpp:2876
+#: src/libslic3r/PrintConfig.cpp:2889 src/libslic3r/PrintConfig.cpp:2899
+#: src/libslic3r/PrintConfig.cpp:2908 src/libslic3r/PrintConfig.cpp:2918
+#: src/libslic3r/PrintConfig.cpp:2929 src/libslic3r/PrintConfig.cpp:2937
msgid "Supports"
msgstr "Podpory"
-#: src/slic3r/GUI/Plater.cpp:1194
+#: src/slic3r/GUI/Plater.cpp:1103
msgid "supports and pad"
msgstr "podpory i podkładka"
-#: src/libslic3r/PrintConfig.cpp:1092
+#: src/libslic3r/PrintConfig.cpp:1185
msgid "Supports remaining times"
msgstr "Obsługa pozostałego czasu druku"
-#: src/libslic3r/PrintConfig.cpp:1101
+#: src/libslic3r/PrintConfig.cpp:1194
msgid "Supports stealth mode"
msgstr "Wspiera tryb Stealth"
-#: src/slic3r/GUI/ConfigManipulation.cpp:159
-msgid ""
-"Supports work better, if the following feature is enabled:\n"
-"- Detect bridging perimeters"
-msgstr ""
-"Podpory działają lepiej, jeśli włączone jest poniższe ustawienie:\n"
-"- Wykrywanie mostów przy obrysach"
+#: src/slic3r/GUI/ConfigManipulation.cpp:158
+msgid "Supports work better, if the following feature is enabled:\n- Detect bridging perimeters"
+msgstr "Podpory działają lepiej, jeśli włączone jest poniższe ustawienie:\n- Wykrywanie mostów przy obrysach"
-#: src/slic3r/GUI/Preferences.cpp:87
+#: src/slic3r/GUI/Preferences.cpp:104
msgid "Suppress \" - default - \" presets"
msgstr "Ukryj \" - domyślne - \" zestawy ustawień"
-#: src/slic3r/GUI/Preferences.cpp:89
+#: src/slic3r/GUI/Preferences.cpp:106
msgid "Suppress \" - default - \" presets in the Print / Filament / Printer selections once there are any other valid presets available."
msgstr "Ukryj \" - domyślne - \" zestawy ustawień w zakładkach Druk / Filament / Drukarka gdy dostępne są inne kompatybilne ustawienia."
-#: src/slic3r/GUI/MainFrame.cpp:826
+#: src/slic3r/GUI/Preferences.cpp:276
+msgid "Suppress to open hyperlink in browser"
+msgstr "Nie otwieraj linków w przeglądarce."
+
+#: src/slic3r/GUI/MainFrame.cpp:1527
msgid "SVG"
msgstr "SVG"
-#: src/slic3r/GUI/DoubleSlider.cpp:1144
+#: src/slic3r/GUI/Mouse3DController.cpp:318
+msgid "Swap Y/Z axes"
+msgstr "Zamień osie Y/Z"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+msgid "Switch between Editor/Preview"
+msgstr "Przełącz między edytorem/podglądem"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1273
msgid "Switch code to Change extruder"
msgstr "Przełącz kod na zmianę ekstrudera"
-#: src/slic3r/GUI/DoubleSlider.cpp:1179
+#: src/slic3r/GUI/DoubleSlider.cpp:1306
msgid "Switch code to Color change (%1%) for:"
msgstr "Zmień kod na zmianę koloru (%1%) dla:"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:140
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:136
msgid "Switch to 3D"
msgstr "Przełącz na 3D"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1376
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223
msgid "Switch to editing mode"
msgstr "Tryb edycji"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:141
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:137
msgid "Switch to Preview"
msgstr "Przełącz na Podgląd cięcia"
-#: src/slic3r/GUI/wxExtensions.cpp:703
-#, c-format
+#: src/slic3r/GUI/GLCanvas3D.cpp:4302 src/slic3r/GUI/GLCanvas3D.cpp:4939
+msgid "Switch to Settings"
+msgstr "Przełącz na ustawienia"
+
+#: src/slic3r/GUI/wxExtensions.cpp:623
+#, possible-c-format
msgid "Switch to the %s mode"
msgstr "Przełącz na tryb %s"
-#: src/slic3r/GUI/GUI_App.cpp:882
-msgid ""
-"Switching the language will trigger application restart.\n"
-"You will lose content of the plater."
-msgstr ""
-"Zmiana języka spowoduje zrestartowanie aplikacji.\n"
-"Zawartość stołu zostanie wyczyszczona."
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:542
+msgid "Switching Presets: Unsaved Changes"
+msgstr "Przełączanie zestawu ustawień: niezapisane zmiany"
+
+#: src/slic3r/GUI/GUI_App.cpp:1608
+msgid "Switching the language will trigger application restart.\nYou will lose content of the plater."
+msgstr "Zmiana języka spowoduje zrestartowanie aplikacji.\nZawartość stołu zostanie wyczyszczona."
#: src/slic3r/GUI/WipeTowerDialog.cpp:365
-msgid ""
-"Switching to simple settings will discard changes done in the advanced mode!\n"
-"\n"
-"Do you want to proceed?"
+msgid "Switching to simple settings will discard changes done in the advanced mode!\n\nDo you want to proceed?"
msgstr "Włączenie trybu prostego spowoduje odrzucenie zmian wprowadzonych w trybie zaawansowanym! Czy chcesz kontynować?"
-#: src/slic3r/GUI/Tab.cpp:1014
+#: src/slic3r/GUI/Tab.cpp:1332
msgid "symbolic profile name"
msgstr "skrócona nazwa profilu"
-#: src/libslic3r/PrintConfig.cpp:2036
+#: src/libslic3r/PrintConfig.cpp:2178
msgid "Synchronize support layers with the object print layers. This is useful with multi-material printers, where the extruder switch is expensive."
msgstr "Synchronizuj warstwy podporowe z warstwami modelu. Przydaje się przy drukarkach typu multi-material gdy zmiana używanego materiału jest kosztowna."
-#: src/libslic3r/PrintConfig.cpp:2034
+#: src/libslic3r/PrintConfig.cpp:2176
msgid "Synchronize with object layers"
msgstr "Synchronizuj z warstwami modelu"
-#: src/slic3r/GUI/MainFrame.cpp:699
+#: src/slic3r/GUI/MainFrame.cpp:924 src/slic3r/GUI/MainFrame.cpp:1323
msgid "System &Info"
msgstr "&Informacje o Systemie"
-#: src/slic3r/GUI/SysInfoDialog.cpp:78
+#: src/slic3r/GUI/SysInfoDialog.cpp:90 src/slic3r/GUI/SysInfoDialog.cpp:92
msgid "System Information"
msgstr "Informacje o systemie"
-#: src/slic3r/GUI/Preset.cpp:1109 src/slic3r/GUI/Preset.cpp:1164
-#: src/slic3r/GUI/Preset.cpp:1242 src/slic3r/GUI/Preset.cpp:1284
-#: src/slic3r/GUI/PresetBundle.cpp:1583 src/slic3r/GUI/PresetBundle.cpp:1672
+#: src/slic3r/GUI/PresetComboBoxes.cpp:188
+#: src/slic3r/GUI/PresetComboBoxes.cpp:226
+#: src/slic3r/GUI/PresetComboBoxes.cpp:724
+#: src/slic3r/GUI/PresetComboBoxes.cpp:774
+#: src/slic3r/GUI/PresetComboBoxes.cpp:886
+#: src/slic3r/GUI/PresetComboBoxes.cpp:930
msgid "System presets"
msgstr "Ustawienia systemowe"
-#: src/slic3r/GUI/GUI_App.cpp:801
+#: src/slic3r/GUI/GUI_App.cpp:1481
msgid "Take Configuration &Snapshot"
msgstr "Wykonaj Zrzu&t Konfiguracji"
-#: src/slic3r/GUI/GUI_App.cpp:839
+#: src/slic3r/GUI/GUI_App.cpp:1540
msgid "Taking configuration snapshot"
msgstr "Zrzucanie konfiguracji"
-#: src/slic3r/GUI/Tab.cpp:1433 src/libslic3r/PrintConfig.cpp:2067
+#: src/slic3r/GUI/Tab.cpp:1779
msgid "Temperature"
msgstr "Temperatura"
-#: src/libslic3r/PrintConfig.cpp:1804
+#: src/libslic3r/PrintConfig.cpp:1919
msgid "Temperature difference to be applied when an extruder is not active. Enables a full-height \"sacrificial\" skirt on which the nozzles are periodically wiped."
msgstr "Różnica temperatur mająca zastosowanie gdy ekstruder nie jest używany. Włącza druk skirtu o wysokości równej wysokości modelu, dzięki której dysze będą co jakiś czas czyszczone."
-#: src/libslic3r/PrintConfig.cpp:1803
+#: src/libslic3r/PrintConfig.cpp:1918
msgid "Temperature variation"
msgstr "Zmiana temperatury"
-#: src/slic3r/GUI/ConfigWizard.cpp:1017
+#: src/slic3r/GUI/ConfigWizard.cpp:1383
msgid "Temperatures"
msgstr "Temperatury"
-#: src/slic3r/GUI/Tab.cpp:1677 src/slic3r/GUI/Tab.cpp:1915
+#: src/slic3r/GUI/Tab.cpp:2215
+msgid "Template Custom G-code"
+msgstr "Szablon niestandardowego G-code"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:284
msgid "Test"
msgstr "Test"
-#: src/slic3r/GUI/BedShapeDialog.cpp:172
+#: src/slic3r/GUI/BedShapeDialog.cpp:315
msgid "Texture"
msgstr "Tekstura"
-#: src/slic3r/GUI/ConfigManipulation.cpp:208
+#: src/slic3r/GUI/ConfigManipulation.cpp:207
msgid "The %1% infill pattern is not supposed to work at 100%% density."
msgstr "Wzór wypełnienia %1% nie działa z gęstością ustawioną na 100%%."
#: src/slic3r/GUI/FirmwareDialog.cpp:548
-#, c-format
+#, possible-c-format
msgid "The %s device could not have been found"
msgstr "Nie znaleziono urzÄ…dzenia %s"
#: src/slic3r/GUI/FirmwareDialog.cpp:436
-#, c-format
-msgid ""
-"The %s device was not found.\n"
-"If the device is connected, please press the Reset button next to the USB connector ..."
-msgstr ""
-"Nie znaleziono urzÄ…dzenia %s .\n"
-"Jeśli urządzenie jest podłączone, to naciśnij przycisk Reset obok złącza USB ..."
+#, possible-c-format
+msgid "The %s device was not found.\nIf the device is connected, please press the Reset button next to the USB connector ..."
+msgstr "Nie znaleziono urządzenia %s .\nJeśli urządzenie jest podłączone, to naciśnij przycisk Reset obok złącza USB ..."
-#: src/slic3r/GUI/Tab.cpp:976
+#: src/slic3r/GUI/Tab.cpp:1238
msgid "The current custom preset will be detached from the parent system preset."
msgstr "Obecny niestandardowy zestaw ustawień zostanie odłączony od dziedziczącego zestawu systemowego."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875
-msgid ""
-"The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n"
-"Non-uniform scaling of tilted objects is only possible in the World coordinate system,\n"
-"once the rotation is embedded into the object coordinates."
-msgstr ""
-"Obecnie przekształcany model jest przechylony (kąty obrotu nie są wielokrotnością 90°).\n"
-"Nierównomierne skalowanie przechylonych modeli jest możliwe tylko w globalnym systemie koordynat, po osadzeniu kątów obrotu w koordynatach modelu."
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:925
+msgid "The currently manipulated object is tilted (rotation angles are not multiples of 90°).\nNon-uniform scaling of tilted objects is only possible in the World coordinate system,\nonce the rotation is embedded into the object coordinates."
+msgstr "Obecnie przekształcany model jest przechylony (kąty obrotu nie są wielokrotnością 90°).\nNierównomierne skalowanie przechylonych modeli jest możliwe tylko w globalnym systemie koordynat, po osadzeniu kątów obrotu w koordynatach modelu."
-#: src/libslic3r/PrintConfig.cpp:2726
+#: src/libslic3r/PrintConfig.cpp:2890
msgid "The default angle for connecting support sticks and junctions."
msgstr "Domyślny kąt łączenia słupków i \"skrzyżowań\" podpór."
-#: src/libslic3r/SLAPrint.cpp:631
+#: src/libslic3r/SLAPrint.cpp:645
msgid "The endings of the support pillars will be deployed on the gap between the object and the pad. 'Support base safety distance' has to be greater than the 'Pad object gap' parameter to avoid this."
-msgstr "Końcówki słupków podpór będą rozmieszczone w przestrzeni pomiędzy modelem a podkładką. Aby tego uniknąć, parametr \"Bezpieczna odległość stopy podpory\" powinien być większy niż \"Odstęp modelu od podkładki\"."
+msgstr "Końcówki słupków podpór będą rozmieszczone w przestrzeni pomiędzy modelem, a podkładką. Aby tego uniknąć, parametr \"Bezpieczna odległość stopy podpory\" powinien być większy niż \"Odstęp modelu od podkładki\"."
-#: src/libslic3r/PrintConfig.cpp:489
+#: src/libslic3r/PrintConfig.cpp:525
msgid "The extruder to use (unless more specific extruder settings are specified). This value overrides perimeter and infill extruders, but not the support extruders."
msgstr "Używany ekstruder (jeśli nie są określone dokładniejsze ustawienia ekstuderów). To ustawienie nadpisuje ustawienia ekstruderów dla obrysów i wypełnienia, ale nie tych dla podpór."
-#: src/libslic3r/PrintConfig.cpp:1003
+#: src/libslic3r/PrintConfig.cpp:1047
msgid "The extruder to use when printing infill."
msgstr "Ekstruder używany do druku wypełnienia."
-#: src/libslic3r/PrintConfig.cpp:1410
+#: src/libslic3r/PrintConfig.cpp:1518
msgid "The extruder to use when printing perimeters and brim. First extruder is 1."
msgstr "Ekstruder używany przy druku obrysów i brim. Pierwszy ekstruder ma nr 1."
-#: src/libslic3r/PrintConfig.cpp:1738
+#: src/libslic3r/PrintConfig.cpp:1853
msgid "The extruder to use when printing solid infill."
msgstr "Ekstruder używany do druku zwartego wypełnienia."
-#: src/libslic3r/PrintConfig.cpp:1966
+#: src/libslic3r/PrintConfig.cpp:2108
msgid "The extruder to use when printing support material interface (1+, 0 to use the current extruder to minimize tool changes). This affects raft too."
-msgstr "Ekstruder używany przy druku warstw łączących podpory z modelem (1+, zero aby użyć obecnie wybranego ekstrudera i zminimalizować zmiany filamentu). Ma wpływ również na druk tratwy (raftu)."
+msgstr "Ekstruder używany przy druku warstw łączących podpory z modelem (1+, zero, aby użyć obecnie wybranego ekstrudera i zminimalizować zmiany filamentu). Ma wpływ również na druk tratwy (raftu)."
-#: src/libslic3r/PrintConfig.cpp:1939
+#: src/libslic3r/PrintConfig.cpp:2081
msgid "The extruder to use when printing support material, raft and skirt (1+, 0 to use the current extruder to minimize tool changes)."
msgstr "Ekstruder używany przy druku podpór, tratwy (raft) i skirtu (1+, zero aby użyć obecnie wybranego ekstrudera i zminimalizować zmiany filamentu)."
-#: src/libslic3r/PrintConfig.cpp:727
+#: src/libslic3r/PrintConfig.cpp:763
msgid "The filament material type for use in custom G-codes."
msgstr "Rodzaj filamentu używanego przy własnym G-code."
-#: src/libslic3r/PrintConfig.cpp:3494
+#: src/libslic3r/PrintConfig.cpp:3693
msgid "The file where the output will be written (if not specified, it will be based on the input file)."
msgstr "Plik, w którym będzie zapisany efekt wyjściowy (jeśli nie zostanie określony, to będzie bazować na pliku wejściowym)."
-#: src/libslic3r/PrintConfig.cpp:1102
+#: src/libslic3r/PrintConfig.cpp:1195
msgid "The firmware supports stealth mode"
msgstr "Firmware wspiera tryb Stealth"
-#: src/libslic3r/PrintConfig.cpp:120
+#: src/libslic3r/PrintConfig.cpp:122
msgid "The first layer will be shrunk in the XY plane by the configured value to compensate for the 1st layer squish aka an Elephant Foot effect."
-msgstr "Pierwsza warstwa zostanie zmniejszona o tą wartość w osiach X i Y aby zniwelować efekt stopy słonia (Elephant Foot - gdy pierwsza warstwa \"rozjeżdża\" się na boki)."
+msgstr "Pierwsza warstwa zostanie zmniejszona o tą wartość w osiach X i Y, aby zniwelować efekt stopy słonia (Elephant Foot - gdy pierwsza warstwa \"rozjeżdża\" się na boki)."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3820
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3927 src/slic3r/GUI/Tab.cpp:3457
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4283
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4410
+#: src/slic3r/GUI/SavePresetDialog.cpp:117
msgid "the following characters are not allowed:"
msgstr "następujące znaki nie są dozwolone:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1830
+#: src/slic3r/GUI/ConfigWizard.cpp:2257
msgid "The following FFF printer models have no filament selected:"
msgstr "Następujące modele drukarek FFF nie mają przypisanych filamentów:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1848
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1004
+msgid "The following presets were modified:"
+msgstr "Następujące zestawy ustawień zostały zmodyfikowane:"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:253
+msgid "The following shortcuts are applicable in G-code preview when the horizontal slider is active"
+msgstr "Następujące skróty mają zastosowanie w podglądzie G-code, gdy aktywny jest suwak poziomy"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:237
+msgid "The following shortcuts are applicable in G-code preview when the vertical slider is active"
+msgstr "Następujące skróty mają zastosowanie w podglądzie G-code, gdy aktywny jest suwak pionowy"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+msgid "The following shortcuts are applicable when the specified gizmo is active"
+msgstr "Następujące skróty mają zastosowanie, gdy aktywy jest określony uchwyt"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2275
msgid "The following SLA printer models have no materials selected:"
msgstr "Następujące modele drukarek SLA nie mają przypisanych materiałów:"
-#: src/slic3r/GUI/Tab.cpp:3461
+#: src/slic3r/GUI/SavePresetDialog.cpp:125
msgid "the following suffix is not allowed:"
msgstr "następujący sufiks nie jest dozwolony:"
-#: src/libslic3r/PrintConfig.cpp:2871
+#: src/libslic3r/PrintConfig.cpp:3035
msgid "The gap between the object bottom and the generated pad in zero elevation mode."
msgstr "Odstęp między najniższą częścią modelu a wygenerowaną podkładką w trybie zerowego podniesienia."
-#: src/libslic3r/PrintConfig.cpp:2704
+#: src/libslic3r/PrintConfig.cpp:2868
msgid "The height of the pillar base cone"
msgstr "Wysokość stożka bazowego podpory"
-#: src/slic3r/GUI/DoubleSlider.cpp:1922
+#: src/slic3r/GUI/DoubleSlider.cpp:2140
msgid "The last color change data was saved for a multi extruder printing with tool changes for whole print."
msgstr "Dane ostatniej zmiany koloru zostały zapisane dla drukarki wielomateriałowej ze zmianami narzędzi dla całego wydruku."
-#: src/slic3r/GUI/DoubleSlider.cpp:1900 src/slic3r/GUI/DoubleSlider.cpp:1916
+#: src/slic3r/GUI/DoubleSlider.cpp:2119 src/slic3r/GUI/DoubleSlider.cpp:2134
msgid "The last color change data was saved for a multi extruder printing."
msgstr "Dane ostatniej zmiany koloru zostały zapisane dla druku wielomateriałowego."
-#: src/slic3r/GUI/DoubleSlider.cpp:1899
+#: src/slic3r/GUI/DoubleSlider.cpp:2118
msgid "The last color change data was saved for a single extruder printing."
msgstr "Dane ostatniej zmiany koloru zostały zapisane dla druku z jednym ekstruderem."
-#: src/libslic3r/PrintConfig.cpp:2745
+#: src/libslic3r/PrintConfig.cpp:2909
msgid "The max distance of two pillars to get linked with each other. A zero value will prohibit pillar cascading."
msgstr "Maksymalny dystans pomiędzy słupkami podpór, które powinny zostać połączone. Wartość 0 zapobiegnie łączeniu słupków podpór."
-#: src/libslic3r/PrintConfig.cpp:2736
+#: src/libslic3r/PrintConfig.cpp:2900
msgid "The max length of a bridge"
msgstr "Maksymalna długość mostu"
-#: src/libslic3r/PrintConfig.cpp:2714
+#: src/libslic3r/PrintConfig.cpp:190
+msgid "The maximum detour length for avoid crossing perimeters. If the detour is longer than this value, avoid crossing perimeters is not applied for this travel path. Detour length could be specified either as an absolute value or as percentage (for example 50%) of a direct travel path."
+msgstr "Maksymalna długość objazdu przy unikaniu przejeżdżania nad obrysami. Jeśli objazd miałby wykroczyć poza tę wartość, funkcja \"Unikaj ruchów nad obrysami\" zostanie zignorowana dla tej ścieżki. Długość objazdu można zdefiniować jako wartość absolutna lub obliczona procentowo (np. 50%) z długości ruchu bezpośredniego."
+
+#: src/libslic3r/PrintConfig.cpp:2878
msgid "The minimum distance of the pillar base from the model in mm. Makes sense in zero elevation mode where a gap according to this parameter is inserted between the model and the pad."
msgstr "Minimalny odstęp stopy słupka od modelu, wyrażony w mm. Ma zastosowanie w trybie zerowego podniesienia, gdy odstęp określony tym parametrem będzie oddzielał model od podkładki."
-#: src/libslic3r/PrintConfig.cpp:185
+#: src/slic3r/GUI/SavePresetDialog.cpp:142
+msgid "The name cannot be empty."
+msgstr "Nazwa nie może być pusta."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:152
+msgid "The name cannot end with space character."
+msgstr "Nazwa nie może kończyć się spacją."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:147
+msgid "The name cannot start with space character."
+msgstr "Nazwa nie może zaczynać się spacją."
+
+#: src/libslic3r/PrintConfig.cpp:219
msgid "The number of bottom solid layers is increased above bottom_solid_layers if necessary to satisfy minimum thickness of bottom shell."
msgstr "Liczba dolnych warstw jest zwiększona ponad bottom_solid_layers, jeśli to konieczne, aby spełnić warunek minimalnej grubości powłoki."
-#: src/libslic3r/PrintConfig.cpp:2143
+#: src/libslic3r/PrintConfig.cpp:2286
msgid "The number of top solid layers is increased above top_solid_layers if necessary to satisfy minimum thickness of top shell. This is useful to prevent pillowing effect when printing with variable layer height."
msgstr "Liczba górnych warstw jest zwiększona ponad top_solid_layers, jeśli to konieczne, aby spełnić warunek minimalnej grubości powłoki. Przydaje się do uniknięcia efektu \"pillowingu\" (wypychania górnych warstw) podczas drukowania ze zmienną wysokością warstwy."
-#: src/libslic3r/PrintConfig.cpp:2277
+#: src/slic3r/GUI/Plater.cpp:2326
+msgid "The object appears to be saved in inches"
+msgstr "Model wyglÄ…da na zapisany w calach"
+
+#: src/libslic3r/PrintConfig.cpp:2420
msgid "The object will be grown/shrunk in the XY plane by the configured value (negative = inwards, positive = outwards). This might be useful for fine-tuning hole sizes."
msgstr "Model zostanie zmniejszony lub zwiększony w osiach X i Y o zadaną wartość (ujemna = zmniejszenie, dotatnia = zwiększenie). Może być przydatne przy kalibracji średnic otworów."
-#: src/libslic3r/PrintConfig.cpp:1503
+#: src/libslic3r/PrintConfig.cpp:1611
msgid "The object will be raised by this number of layers, and support material will be generated under it."
msgstr "Model zostanie podniesiony o zadaną ilość warstw i umieszczony na podporach."
-#: src/libslic3r/PrintConfig.cpp:2424
-msgid ""
-"The percentage of the bed area. \n"
-"If the print area exceeds the specified value, \n"
-"then a slow tilt will be used, otherwise - a fast tilt"
-msgstr ""
-"Procentowa powierzchnia stołu.\n"
-"Jeśli gabaryty wydruku przekraczają zadaną wartość,\n"
-"to zostanie użyte wolne przechylanie, w innym przypadku - szybkie"
+#: src/libslic3r/PrintConfig.cpp:2803
+msgid "The percentage of smaller pillars compared to the normal pillar diameter which are used in problematic areas where a normal pilla cannot fit."
+msgstr "Udział procentowy mniejszych słupków w stosunku do normalnych w problematycznych obszarach, gdzie normalne słupki nie mieszczą się."
+
+#: src/libslic3r/PrintConfig.cpp:2567
+msgid "The percentage of the bed area. \nIf the print area exceeds the specified value, \nthen a slow tilt will be used, otherwise - a fast tilt"
+msgstr "Procentowa powierzchnia stołu.\nJeśli gabaryty wydruku przekraczają zadaną wartość,\nto zostanie użyte wolne przechylanie, w innym przypadku - szybkie"
+
+#: src/slic3r/GUI/Tab.cpp:3430
+msgid "The physical printer(s) below is based on the preset, you are going to delete."
+msgstr "Na zestawie ustawień, który chcesz usunąć, bazuje poniższa fizyczna drukarka (lub fizyczne drukarki)."
+
+#: src/slic3r/GUI/Tab.cpp:3438
+msgid "The physical printer(s) below is based only on the preset, you are going to delete."
+msgstr "Tylko na zestawie ustawień, który chcesz usunąć, bazuje poniższa fizyczna drukarka (lub fizyczne drukarki)."
-#: src/slic3r/GUI/GUI_App.cpp:932
-msgid "The presets on the following tabs were modified"
-msgstr "Ustawienia na następujących kartach zostały zmodyfikowane"
+#: src/slic3r/GUI/GUI_App.cpp:1676
+msgid "The preset(s) modifications are successfully saved"
+msgstr "Modyfikacje zestawu (lub zestawów) ustawień zapisane pomyślnie"
-#: src/libslic3r/PrintConfig.cpp:1846
+#: src/libslic3r/PrintConfig.cpp:1988
msgid "The printer multiplexes filaments into a single hot end."
msgstr "Drukarka przechodzi pomiędzy filamentami używając jednego hotendu."
-#: src/libslic3r/Format/3mf.cpp:1630
+#: src/libslic3r/Format/3mf.cpp:1667
msgid "The selected 3mf file has been saved with a newer version of %1% and is not compatible."
msgstr "Wybrany plik 3mf został zapisany przy pomocy nowszej wersji %1% i nie jest kompatybilny."
-#: src/libslic3r/Format/AMF.cpp:934
+#: src/libslic3r/Format/AMF.cpp:955
msgid "The selected amf file has been saved with a newer version of %1% and is not compatible."
msgstr "Wybrany plik amf został zapisany przy pomocy nowszej wersji %1% i nie jest kompatybilny."
-#: src/slic3r/GUI/BedShapeDialog.cpp:513
+#: src/slic3r/GUI/Plater.cpp:4751
+msgid "The selected file"
+msgstr "Wybrany plik"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:589
msgid "The selected file contains no geometry."
msgstr "Wybrany plik nie zawiera żadnego kształtu."
-#: src/slic3r/GUI/BedShapeDialog.cpp:517
+#: src/slic3r/GUI/BedShapeDialog.cpp:593
msgid "The selected file contains several disjoint areas. This is not supported."
msgstr "Wybrany plik zawiera kilka rozłączonych obszarów. Taki plik nie jest obsługiwany."
-#: src/slic3r/GUI/Plater.cpp:2970
+#: src/slic3r/GUI/Plater.cpp:2763
msgid "The selected object can't be split because it contains more than one volume/material."
msgstr "Wybrany model nie może być podzielony ponieważ składa się z więcej niż jednej części lub zawiera więcej niż jeden materiał."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2270 src/slic3r/GUI/Plater.cpp:2978
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2436 src/slic3r/GUI/Plater.cpp:2771
msgid "The selected object couldn't be split because it contains only one part."
msgstr "Wybrany model nie może być rozdzielony ponieważ zawiera tylko jedną część."
-#: src/slic3r/GUI/MainFrame.cpp:461
-msgid ""
-"The selected project is no longer available.\n"
-"Do you want to remove it from the recent projects list?"
-msgstr ""
-"Wybrany obiekt nie jest już dostępny.\n"
-"Czy chcesz usunąć go z listy niedawno używanych projektów?"
+#: src/slic3r/GUI/MainFrame.cpp:1003
+msgid "The selected project is no longer available.\nDo you want to remove it from the recent projects list?"
+msgstr "Wybrany obiekt nie jest już dostępny.\nCzy chcesz usunąć go z listy niedawno używanych projektów?"
-#: src/slic3r/GUI/DoubleSlider.cpp:998
-msgid ""
-"The sequential print is on.\n"
-"It's impossible to apply any custom G-code for objects printing sequentually.\n"
-"This code won't be processed during G-code generation."
-msgstr ""
-"Druk sekwencyjny jest włączony.\n"
-"Niemożliwe jest dodawanie własnego G-code do modeli drukowanych sekwencyjnie.\n"
-"Ten kod nie będzie przetwarzany podczas generowania pliku G-code."
+#: src/slic3r/GUI/DoubleSlider.cpp:1121
+msgid "The sequential print is on.\nIt's impossible to apply any custom G-code for objects printing sequentually.\nThis code won't be processed during G-code generation."
+msgstr "Druk sekwencyjny jest włączony.\nNiemożliwe jest dodawanie własnego G-code do modeli drukowanych sekwencyjnie.\nTen kod nie będzie przetwarzany podczas generowania pliku G-code."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1187
+msgid "The size of the object can be specified in inches"
+msgstr "Rozmiar modelu może być wyrażony w calach"
-#: src/libslic3r/PrintConfig.cpp:2846
+#: src/libslic3r/PrintConfig.cpp:3010
msgid "The slope of the pad wall relative to the bed plane. 90 degrees means straight walls."
msgstr "Kąt pochylenia ścian podkładki względem powierzchni stołu. 90 stopni oznacza proste ściany."
-#: src/libslic3r/PrintConfig.cpp:1614
+#: src/libslic3r/PrintConfig.cpp:1722
msgid "The speed for loading of a filament into extruder after retraction (it only applies to the extruder motor). If left to zero, the retraction speed is used."
-msgstr "Prędkość powrotu filamentu do ekstrudera po retrakcji (dotyczy tylko silnika ekstrudera). Ustaw zero aby użyć prędkości retrakcji."
+msgstr "Prędkość powrotu filamentu do ekstrudera po retrakcji (dotyczy tylko silnika ekstrudera). Ustaw zero, aby użyć prędkości retrakcji."
-#: src/libslic3r/PrintConfig.cpp:1606
+#: src/libslic3r/PrintConfig.cpp:1714
msgid "The speed for retractions (it only applies to the extruder motor)."
msgstr "Prędkość retrakcji (stosowana tylko dla silnika ekstrudera)."
-#: src/slic3r/GUI/ConfigManipulation.cpp:81
-#, no-c-format
-msgid ""
-"The Spiral Vase mode requires:\n"
-"- one perimeter\n"
-"- no top solid layers\n"
-"- 0% fill density\n"
-"- no support material\n"
-"- Ensure vertical shell thickness enabled\n"
-"- Detect thin walls disabled"
-msgstr ""
-"Wymagania trybu wazy:\n"
-"- jeden obrys\n"
-"- brak górnych warstw\n"
-"- 0% wypełnienia\n"
-"- brak materiału podporowego\n"
-"- wyłączone ustawienie \"Zagwarantuj grubość ścianki\"\n"
-"- wyłączone wykrywanie cienkich ścian"
-
-#: src/libslic3r/Print.cpp:1237
-msgid "The Spiral Vase option can only be used when printing a single object."
-msgstr "Tryb Wazy może być aktywny tylko podczas druku pojedynczego modelu."
-
-#: src/libslic3r/Print.cpp:1244
+#: src/slic3r/GUI/ConfigManipulation.cpp:80
+#, possible-c-format
+msgid "The Spiral Vase mode requires:\n- one perimeter\n- no top solid layers\n- 0% fill density\n- no support material\n- Ensure vertical shell thickness enabled\n- Detect thin walls disabled"
+msgstr "Wymagania trybu wazy:\n- jeden obrys\n- brak górnych warstw\n- 0% wypełnienia\n- brak materiału podporowego\n- wyłączone ustawienie \"Zagwarantuj grubość ścianki\"\n- wyłączone wykrywanie cienkich ścian"
+
+#: src/libslic3r/Print.cpp:1270
msgid "The Spiral Vase option can only be used when printing single material objects."
msgstr "Tryb Wazy może być używany jedynie podczas druku z jednego materiału."
-#: src/slic3r/GUI/Tab.cpp:3068
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:464
msgid "The supplied name is empty. It can't be saved."
msgstr "Podana nazwa jest pusta. Nie można zapisać."
-#: src/slic3r/GUI/Tab.cpp:3465
+#: src/slic3r/GUI/SavePresetDialog.cpp:131
msgid "The supplied name is not available."
msgstr "Podana nazwa jest niedostępna."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3819
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3926 src/slic3r/GUI/Tab.cpp:3456
-#: src/slic3r/GUI/Tab.cpp:3460
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4282
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4409
+#: src/slic3r/GUI/SavePresetDialog.cpp:116
+#: src/slic3r/GUI/SavePresetDialog.cpp:124
msgid "The supplied name is not valid;"
msgstr "Podana nazwa nie jest prawidłowa;"
-#: src/libslic3r/Print.cpp:1222
+#: src/libslic3r/Print.cpp:1248
msgid "The supplied settings will cause an empty print."
msgstr "Wprowadzone ustawienia spowodujÄ… pusty wydruk."
-#: src/libslic3r/PrintConfig.cpp:2789
+#: src/libslic3r/PrintConfig.cpp:2953
msgid "The thickness of the pad and its optional cavity walls."
msgstr "Grubość podkładki i opcjonalnie wydrążenie ścianek."
-#: src/libslic3r/PrintConfig.cpp:1911
+#: src/slic3r/GUI/GUI_App.cpp:1781
+msgid "The uploads are still ongoing"
+msgstr "TrwajÄ… jeszcze transfery"
+
+#: src/libslic3r/PrintConfig.cpp:2053
msgid "The vertical distance between object and support material interface. Setting this to 0 will also prevent Slic3r from using bridge flow and speed for the first object layer."
msgstr "Dystans w pionie między modelem a warstwą łączącą materiału podporowego. Ustawienie na 0 wyłączy ustawienie mostu (prędkości i przepływu) dla pierwszej warstwy modelu nad warstwą łączącą."
-#: src/slic3r/GUI/Tab.cpp:2575
-msgid ""
-"The Wipe option is not available when using the Firmware Retraction mode.\n"
-"\n"
-"Shall I disable it in order to enable Firmware Retraction?"
-msgstr ""
-"Opcja czyszczenia dyszy nie jest dostępna z funkcją Retrakcji w Firmware (Firmware Retraction).\n"
-"\n"
-"Wyłączyć ją aby włączyć Firmware Retraction?"
+#: src/slic3r/GUI/Tab.cpp:2731
+msgid "The Wipe option is not available when using the Firmware Retraction mode.\n\nShall I disable it in order to enable Firmware Retraction?"
+msgstr "Opcja czyszczenia dyszy nie jest dostępna z funkcją retrakcji w firmware (Firmware Retraction).\n\nWyłączyć ją, aby włączyć Firmware Retraction?"
-#: src/libslic3r/Print.cpp:1268
+#: src/libslic3r/Print.cpp:1294
msgid "The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)."
msgstr "Wieża czyszcząca obecnie nie obsługuje wolumetrycznego parametru E (use_volumetric_e=0)."
-#: src/slic3r/GUI/ConfigManipulation.cpp:115
-msgid ""
-"The Wipe Tower currently supports the non-soluble supports only\n"
-"if they are printed with the current extruder without triggering a tool change.\n"
-"(both support_material_extruder and support_material_interface_extruder need to be set to 0)."
+#: src/slic3r/GUI/ConfigManipulation.cpp:114
+msgid "The Wipe Tower currently supports the non-soluble supports only\nif they are printed with the current extruder without triggering a tool change.\n(both support_material_extruder and support_material_interface_extruder need to be set to 0)."
msgstr "Wieża czyszcząca obsługuje podpory nierozpuszczalne jedynie, gdy są drukowane tym samym ekstruderem - bez wywoływania zmiany narzędzia (zarówno support_material_extruder i support_material_interface_extruder muszą być ustawione na 0)."
-#: src/libslic3r/Print.cpp:1400
+#: src/libslic3r/Print.cpp:1426
msgid "The Wipe Tower currently supports the non-soluble supports only if they are printed with the current extruder without triggering a tool change. (both support_material_extruder and support_material_interface_extruder need to be set to 0)."
msgstr "Wieża Czyszcząca obsługuje podpory nierozpuszczalne jedynie, gdy są drukowane tym samym ekstruderem - bez wywoływania zmiany narzędzia (zarówno support_material_extruder i support_material_interface_extruder muszą być ustawione na 0)."
-#: src/libslic3r/Print.cpp:1270
+#: src/libslic3r/Print.cpp:1296
msgid "The Wipe Tower is currently not supported for multimaterial sequential prints."
msgstr "Wieża czyszcząca jest obecnie niedostępna dla wielomateriałowego druku sekwencyjnego."
-#: src/libslic3r/Print.cpp:1262
-msgid "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter and Repetier G-code flavors."
-msgstr "Wieża Czyszcząca jest obecnie dostępna tylko dla G-code w stylu Marlin, RepRap/Sprinter i Repetier."
+#: src/libslic3r/Print.cpp:1290
+msgid "The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, RepRapFirmware and Repetier G-code flavors."
+msgstr "Wieża czyszcząca jest obecnie wspierana tylko dla G-code w stylu Marlin, RepRap/Sprinter, RepRapFirmware oraz Repetier."
-#: src/libslic3r/Print.cpp:1264
+#: src/libslic3r/Print.cpp:1290
msgid "The Wipe Tower is currently only supported with the relative extruder addressing (use_relative_e_distances=1)."
msgstr "Wieża Czyszcząca jest obecnie dostępna tylko przy relatywnym adresowaniu ekstrudera (use_relative_e_distances=1)."
-#: src/libslic3r/Print.cpp:1293
+#: src/libslic3r/Print.cpp:1319
msgid "The Wipe Tower is only supported for multiple objects if they are printed over an equal number of raft layers"
msgstr "Wieża Czyszcząca jest dostępna dla wielu modeli tylko gdy są drukowane na takiej samej ilości warstw tratwy (raft)"
-#: src/libslic3r/Print.cpp:1295
+#: src/libslic3r/Print.cpp:1321
msgid "The Wipe Tower is only supported for multiple objects if they are printed with the same support_material_contact_distance"
msgstr "Wieża czyszcząca jest dostępna dla wielu modeli pod warunkiem, że ustawienie support_material_contact_distance jest jednakowe dla każdego z nich"
-#: src/libslic3r/Print.cpp:1297
+#: src/libslic3r/Print.cpp:1323
msgid "The Wipe Tower is only supported for multiple objects if they are sliced equally."
msgstr "Wieża Czyszcząca jest dostępna dla kilku modeli tylko jeśli są cięte z taką samą wysokością warstwy."
-#: src/libslic3r/Print.cpp:1291
+#: src/libslic3r/Print.cpp:1317
msgid "The Wipe Tower is only supported for multiple objects if they have equal layer heights"
msgstr "Wieża czyszcząca jest dostępna dla wielu modeli pod warunkiem, że mają one równą wysokość warstwy"
-#: src/libslic3r/Print.cpp:1257
+#: src/libslic3r/Print.cpp:1283
msgid "The wipe tower is only supported if all extruders have the same nozzle diameter and use filaments of the same diameter."
msgstr "Wieża Czyszcząca jest dostępna tylko, gdy wszystkie ekstrudery mają taką samą średnicę dyszy i używają filamentów i takiej samej średnicy."
-#: src/libslic3r/Print.cpp:1339
+#: src/libslic3r/Print.cpp:1365
msgid "The Wipe tower is only supported if all objects have the same variable layer height"
msgstr "Wieża czyszcząca jest dostępna dla wielu modeli pod warunkiem, że mają one taką samą wysokość warstwy"
-#: src/libslic3r/SLAPrintSteps.cpp:621
+#: src/slic3r/GUI/Plater.cpp:3563
+msgid "There are active warnings concerning sliced models:"
+msgstr "Istnieją aktywne ostrzeżenia dotyczące ciętych modeli:"
+
+#: src/libslic3r/SLAPrintSteps.cpp:619
msgid "There are unprintable objects. Try to adjust support settings to make the objects printable."
msgstr "Na stole są modele niemożliwe do wydrukowania. Spróbuj zmienić ustawienia podpór, aby możliwe było ich drukowanie."
-#: src/slic3r/GUI/DoubleSlider.cpp:1030
-msgid ""
-"There is a color change for extruder that has not been used before.\n"
-"Check your settings to avoid redundant color changes."
-msgstr ""
-"Występuje zmiana koloru dla ekstrudera, który nie był jeszcze używany.\n"
-"Sprawdź ustawienia, aby uniknąć niepotrzebnych zmian koloru."
+#: src/slic3r/GUI/DoubleSlider.cpp:1155
+msgid "There is a color change for extruder that has not been used before.\nCheck your settings to avoid redundant color changes."
+msgstr "Występuje zmiana koloru dla ekstrudera, który nie był jeszcze używany.\nSprawdź ustawienia, aby uniknąć niepotrzebnych zmian koloru."
-#: src/slic3r/GUI/DoubleSlider.cpp:1024
-msgid ""
-"There is a color change for extruder that won't be used till the end of print job.\n"
-"This code won't be processed during G-code generation."
-msgstr ""
-"Występuje zmiana koloru dla ekstrudera, który nie będzie używany do końca tego wydruku.\n"
-"Ten kod nie będzie przetwarzany podczas generowania G-code."
+#: src/slic3r/GUI/DoubleSlider.cpp:1149
+msgid "There is a color change for extruder that won't be used till the end of print job.\nThis code won't be processed during G-code generation."
+msgstr "Występuje zmiana koloru dla ekstrudera, który nie będzie używany do końca tego wydruku.\nTen kod nie będzie przetwarzany podczas generowania G-code."
-#: src/slic3r/GUI/DoubleSlider.cpp:1027
-msgid ""
-"There is an extruder change set to the same extruder.\n"
-"This code won't be processed during G-code generation."
-msgstr ""
-"Występuje zmiana koloru na używany przez ten sam ekstruder.\n"
-"Ten kod nie będzie przetwarzany podczas generowania G-code."
+#: src/slic3r/GUI/DoubleSlider.cpp:1152
+msgid "There is an extruder change set to the same extruder.\nThis code won't be processed during G-code generation."
+msgstr "Występuje zmiana koloru na używany przez ten sam ekstruder.\nTen kod nie będzie przetwarzany podczas generowania G-code."
+
+#: src/libslic3r/GCode.cpp:604
+msgid "There is an object with no extrusions on the first layer."
+msgstr "Istnieje model bez ekstruzji na pierwszej warstwie."
#: src/slic3r/GUI/UpdateDialogs.cpp:225
-#, c-format
+#, possible-c-format
msgid "This %s version: %s"
msgstr "%s wersja: %s"
-#: src/slic3r/GUI/Tab.cpp:982
-msgid ""
-"This action is not revertable.\n"
-"Do you want to proceed?"
-msgstr ""
-"Tej czynności nie można odwrócić.\n"
-"Czy chcesz kontynuować?"
+#: src/slic3r/GUI/Tab.cpp:1244
+msgid "This action is not revertable.\nDo you want to proceed?"
+msgstr "Tej czynności nie można odwrócić.\nCzy chcesz kontynuować?"
-#: src/libslic3r/PrintConfig.cpp:165
+#: src/libslic3r/PrintConfig.cpp:199
msgid "This code is inserted between objects when using sequential printing. By default extruder and bed temperature are reset using non-wait command; however if M104, M109, M140 or M190 are detected in this custom code, Slic3r will not add temperature commands. Note that you can use placeholder variables for all Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."
msgstr "Ten kod jest wykonywany pomiędzy drukiem poszczególnych modeli w trybie druku sekwencyjnego. Domyślnie przy komendzie non-wait temperatury dyszy i stołu są resetowane; jednakże jeśli przy tej opcji zostaną użyte komendy M104, M109, M140 lub M190 to Slic3r nie doda własnych komend do kontroli temperatury. Pamiętaj, że możesz używać zmiennych typu placeholder, więc np. komendę \"M109 S[first_layer_temperature]\" (temperatura pierwszej warstwy) możesz umieścić gdzie chcesz."
-#: src/libslic3r/PrintConfig.cpp:1081
+#: src/libslic3r/PrintConfig.cpp:1174
msgid "This custom code is inserted at every layer change, right after the Z move and before the extruder moves to the first layer point. Note that you can use placeholder variables for all Slic3r settings as well as [layer_num] and [layer_z]."
msgstr "Ten kod jest wykonywany przy każdej zmianie warstwy - zaraz po podniesieniu głowicy na wysokość kolejnej warstwy ale zanim ekstruder przejdzie do pierwszego punktu nowej warstwy. Pamiętaj, że możesz użyć zmiennych typu placeholder dla wszystkich ustawień Slic3r, jak np. [layer_num] (numer warstwy) i [layer_z] (położenie warstwy w osi Z)."
-#: src/libslic3r/PrintConfig.cpp:154
+#: src/libslic3r/PrintConfig.cpp:188
msgid "This custom code is inserted at every layer change, right before the Z move. Note that you can use placeholder variables for all Slic3r settings as well as [layer_num] and [layer_z]."
msgstr "Ten kod jest wykonywany przy każdej zmianie warstwy, zaraz przed podniesieniem ekstrudera na wysokość nowej warstwy. Pamiętaj, że możesz użyć zmiennych typu placeholder dla wszystkich ustawień PrusaSlicer, jak np. [layer_num] (numer warstwy) i [layer_z] (położenie warstwy w osi Z)."
-#: src/libslic3r/PrintConfig.cpp:2094
+#: src/libslic3r/PrintConfig.cpp:2237
msgid "This custom code is inserted before every toolchange. Placeholder variables for all PrusaSlicer settings as well as {previous_extruder} and {next_extruder} can be used. When a tool-changing command which changes to the correct extruder is included (such as T{next_extruder}), PrusaSlicer will emit no other such command. It is therefore possible to script custom behaviour both before and after the toolchange."
msgstr "Ten kod jest wykonywany przy każdej zmianie narzędzia (filamentu). Możesz użyć zmiennych dla wszystkich ustawień PrusaSlicer, jak i również {previous_extruder} i {next_extruder}. Po wysłaniu komendy zmiany narzędzia, która zmienia obecny ekstruder (np. T{next_extruder}), PrusaSlicer nie powtórzy tej komendy. Możliwe jest więc zdefiniowanie własnego zachowania zarówno przed jak i po zmianie narzędzia."
-#: src/libslic3r/PrintConfig.cpp:396
+#: src/libslic3r/PrintConfig.cpp:430
msgid "This end procedure is inserted at the end of the output file, before the printer end gcode (and before any toolchange from this filament in case of multimaterial printers). Note that you can use placeholder variables for all PrusaSlicer settings. If you have multiple extruders, the gcode is processed in extruder order."
msgstr "Ta procedura końcowa jest dodawana na końcu pliku wyjściowego, przed kodem końcowym (jak i również przed każdą zmianą z tego filamentu na kolejny w przypadku drukarek wielomateriałowych). Zauważ, że możesz używać zmiennych dla wszystkich ustawień PrusaSlicer. Jeśli masz kilka ekstruderów, to G-code jest wykonywany w ich kolejności."
-#: src/libslic3r/PrintConfig.cpp:386
+#: src/libslic3r/PrintConfig.cpp:420
msgid "This end procedure is inserted at the end of the output file. Note that you can use placeholder variables for all PrusaSlicer settings."
msgstr "Ta procedura końcowa jest dodawana na końcu pliku wyjściowego. Zauważ, że możesz używać zmiennych dla wszystkich ustawień PrusaSlicer."
-#: src/libslic3r/PrintConfig.cpp:1258 src/libslic3r/PrintConfig.cpp:1269
+#: src/libslic3r/PrintConfig.cpp:1366 src/libslic3r/PrintConfig.cpp:1377
msgid "This experimental setting is used to limit the speed of change in extrusion rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds."
msgstr "To ustawienie eksperymentalne jest używane do ograniczania szybkości zmian ilości ekstrudowanego materiału. Wartość 1.8 mm³/s² oznacza, że zmiana z ilości ekstrudowanego materiału z poziomu 1.8 mm³/s (czyli 0.45 mm szerokości ekstruzji, 0.2 mm wysokości warstwy przy prędkości 20 mm/s) na 5.4 mm³/s (prędkość 60 mm/s) zajmie co najmniej 2 sekundy."
-#: src/libslic3r/PrintConfig.cpp:1248
+#: src/libslic3r/PrintConfig.cpp:1356
msgid "This experimental setting is used to set the maximum volumetric speed your extruder supports."
-msgstr "Ta eksperymentalna funkcja określa maksymalną prędkość objętościową, którą jest w stanie wytłoczyć Twój ekstruder."
+msgstr "Ta eksperymentalna funkcja określa maksymalne natężenie przepływu (strumień objętości), które jest w stanie wytłoczyć Twój ekstruder."
-#: src/libslic3r/PrintConfig.cpp:2162
+#: src/libslic3r/PrintConfig.cpp:2305
msgid "This experimental setting uses G10 and G11 commands to have the firmware handle the retraction. This is only supported in recent Marlin."
-msgstr "Ta eksperymentalna funkcja używa komend G10 i G11 aby przerzucić kontrolę retrakcji na firmware. Jest wspierana jedynie przez najnowsze wersje Marlina."
+msgstr "Ta eksperymentalna funkcja używa komend G10 i G11, aby przerzucić kontrolę retrakcji na firmware. Jest wspierana jedynie przez najnowsze wersje Marlina."
-#: src/libslic3r/PrintConfig.cpp:2176
+#: src/libslic3r/PrintConfig.cpp:2319
msgid "This experimental setting uses outputs the E values in cubic millimeters instead of linear millimeters. If your firmware doesn't already know filament diameter(s), you can put commands like 'M200 D[filament_diameter_0] T0' in your start G-code in order to turn volumetric mode on and use the filament diameter associated to the filament selected in Slic3r. This is only supported in recent Marlin."
-msgstr "Ta eksperymentalna funkcja określa wyjściowe dane E (ilość ekstruzji) w milimetrach sześciennych zamiast długości. Jeśli średnica filamentu nie została jeszcze ustawiona w firmware, możesz użyć komendy \"M200 D[filament_diameter_0] T0\" w skrypcie startowym aby włączyć tryb objętościowy i użyć filamentu powiązanego z ustawionym w Slic3r. Ta funkcja jest wspierana jedynie przez najnowsze wersje Marlina."
+msgstr "Ta eksperymentalna funkcja określa wyjściowe dane E (ilość ekstruzji) w milimetrach sześciennych zamiast długości. Jeśli średnica filamentu nie została jeszcze ustawiona w firmware, możesz użyć komendy \"M200 D[filament_diameter_0] T0\" w skrypcie startowym, aby włączyć tryb objętościowy i użyć filamentu powiązanego z ustawionym w Slic3r. Ta funkcja jest wspierana jedynie przez najnowsze wersje Marlina."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3972
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4459
msgid "This extruder will be set for selected items"
msgstr "Ten ekstruder zostanie ustawiony dla wybranych elementów"
-#: src/libslic3r/PrintConfig.cpp:224
+#: src/libslic3r/PrintConfig.cpp:258
msgid "This factor affects the amount of plastic for bridging. You can decrease it slightly to pull the extrudates and prevent sagging, although default settings are usually good and you should experiment with cooling (use a fan) before tweaking this."
-msgstr "Ten współczynnik określa ilość plastiku wytłaczaną przy drukowaniu mostów. Możesz delikatnie zmniejszyć tą wartość aby zapobiec opadaniu drukowanej linii, jednakże standardowe ustawienia są zazwyczaj dobrze dobrane i najpierw poeksperymentuj z chłodzeniem wydruku."
+msgstr "Ten współczynnik określa ilość plastiku wytłaczaną przy drukowaniu mostów. Możesz delikatnie zmniejszyć tą wartość, aby zapobiec opadaniu drukowanej linii, jednakże standardowe ustawienia są zazwyczaj dobrze dobrane i najpierw poeksperymentuj z chłodzeniem wydruku."
-#: src/libslic3r/PrintConfig.cpp:546
+#: src/libslic3r/PrintConfig.cpp:582
msgid "This factor changes the amount of flow proportionally. You may need to tweak this setting to get nice surface finish and correct single wall widths. Usual values are between 0.9 and 1.1. If you think you need to change this more, check filament diameter and your firmware E steps."
-msgstr "Ten współczynnik określa proporcjonalną ilość przepływu plastiku. Możesz zmienić tą wartość aby uzyskać gładsze powierzchnie i poprawną szerokość ścian drukowanych z 1 linii. Ten współczynnik waha się zazwyczaj od 0.9 do 1.1. Jeśli musisz wykroczyć poza ten zakres to najpierw zmierz średnicę filamentu i kroki ekstrudera (E steps)."
+msgstr "Ten współczynnik określa proporcjonalną ilość przepływu plastiku. Możesz zmienić tą wartość, aby uzyskać gładsze powierzchnie i poprawną szerokość ścian drukowanych z 1 linii. Ten współczynnik waha się zazwyczaj od 0.9 do 1.1. Jeśli musisz wykroczyć poza ten zakres to najpierw zmierz średnicę filamentu i kroki ekstrudera (E steps)."
-#: src/libslic3r/PrintConfig.cpp:214
+#: src/libslic3r/PrintConfig.cpp:248
msgid "This fan speed is enforced during all bridges and overhangs."
msgstr "Ta prędkość wentylatora zostanie zastosowana przy druku mostów i zwisów."
-#: src/libslic3r/PrintConfig.cpp:992
+#: src/libslic3r/PrintConfig.cpp:1036
msgid "This feature allows to combine infill and speed up your print by extruding thicker infill layers while preserving thin perimeters, thus accuracy."
msgstr "Ta funkcja pozwala ustawić oddzielne wysokości dla wypełnienia i obrysów modelu i przyspieszyć wydruk ustawiając np. wyższą warstwę wypełnienia zachowując nominalną wysokość obrysów, co pozwoli zachować wysoką jakość i dokładność wydruku."
-#: src/libslic3r/PrintConfig.cpp:1746
+#: src/libslic3r/PrintConfig.cpp:1861
msgid "This feature allows to force a solid layer every given number of layers. Zero to disable. You can set this to any value (for example 9999); Slic3r will automatically choose the maximum possible number of layers to combine according to nozzle diameter and layer height."
-msgstr "Ta funkcja pozwoli wstawić zwartą warstwę wypełnienia pomiędzy określoną liczbą warstw. Ustaw zero aby wyłączyć. Możesz ustawić tu dowolną wartość (np. 9999) a Slic3r automatycznie wybierze maksymalną możliwą liczbę warstw biorąc pod uwagę średnicę dyszy i wysokość warstwy."
+msgstr "Ta funkcja pozwoli wstawić zwartą warstwę wypełnienia pomiędzy określoną liczbą warstw. Ustaw zero, aby wyłączyć. Możesz ustawić tu dowolną wartość (np. 9999) a PrusaSlicer automatycznie wybierze maksymalną możliwą liczbę warstw biorąc pod uwagę średnicę dyszy i wysokość warstwy."
-#: src/libslic3r/PrintConfig.cpp:1795
-msgid "This feature will raise Z gradually while printing a single-walled object in order to remove any visible seam. This option requires a single perimeter, no infill, no top solid layers and no support material. You can still set any number of bottom solid layers as well as skirt/brim loops. It won't work when printing more than an object."
-msgstr "Ta funkcja pozwala drukować modele z 1 zewnętrzną ścianką z ciągłym podnoszeniem Z, aby uniknąć widocznego szwu (czyli ekstruder nie będzie drukował po 1 warstwie na 1 wysokości, lecz będzie podnosił się płynnie w formie spirali). Wymaga użycia 1 obrysu, zerowego wypełnienia, braku warstw górnych i braku podpór. Możesz ustawić dowolną ilość dolnych warstw jak i obrysów skirt/brim. Nie zadziała przy druku więcej niż jednego modelu."
+#: src/libslic3r/PrintConfig.cpp:1995
+msgid "This feature will raise Z gradually while printing a single-walled object in order to remove any visible seam. This option requires a single perimeter, no infill, no top solid layers and no support material. You can still set any number of bottom solid layers as well as skirt/brim loops. It won't work when printing more than one single object."
+msgstr "Ta funkcja pozwala drukować modele z 1 zewnętrzną ścianką z ciągłym podnoszeniem Z, aby uniknąć widocznego szwu. Wymaga włączenia 1 obrysu, zerowego wypełnienia, braku warstw górnych i braku podpór. Możesz ustawić dowolną ilość dolnych warstw jak i obrysów skirt/brim. Nie zadziała przy druku więcej niż jednego modelu."
-#: src/slic3r/GUI/Plater.cpp:2367
+#: src/slic3r/GUI/Plater.cpp:2329
msgid "This file cannot be loaded in a simple mode. Do you want to switch to an advanced mode?"
msgstr "Ten plik nie może zostać wczytany w Trybie Prostym. Czy chcesz przełączyć na Tryb Zaawansowany?"
-#: src/slic3r/GUI/Plater.cpp:2357
-msgid ""
-"This file contains several objects positioned at multiple heights.\n"
-"Instead of considering them as multiple objects, should I consider\n"
-"this file as a single object having multiple parts?"
-msgstr ""
-"Ten plik zawiera kilka modeli umieszczonych na różnych wysokościach. \n"
-"Potraktować go jako\n"
-"jeden model składający się z kilku części?"
+#: src/slic3r/GUI/Plater.cpp:2319
+msgid "This file contains several objects positioned at multiple heights.\nInstead of considering them as multiple objects, should I consider\nthis file as a single object having multiple parts?"
+msgstr "Ten plik zawiera kilka modeli umieszczonych na różnych wysokościach. \nPotraktować go jako\njeden model składający się z kilku części?"
#: src/slic3r/GUI/FirmwareDialog.cpp:332
-#, c-format
-msgid ""
-"This firmware hex file does not match the printer model.\n"
-"The hex file is intended for: %s\n"
-"Printer reported: %s\n"
-"\n"
-"Do you want to continue and flash this hex file anyway?\n"
-"Please only continue if you are sure this is the right thing to do."
-msgstr ""
-"Ten plik .hex z firmware nie jest przeznaczony dla tej drukarki.\n"
-"Plik .hex jest przeznaczony dla: %s\n"
-"Wykryta drukarka: %s\n"
-"\n"
-"Czy chcesz kontynuować i mimo wszystko wgrać ten plik .hex?\n"
-"Kontynuuj tylko, jeśli wiesz, że tak powinno być."
-
-#: src/libslic3r/PrintConfig.cpp:314
+#, possible-c-format
+msgid "This firmware hex file does not match the printer model.\nThe hex file is intended for: %s\nPrinter reported: %s\n\nDo you want to continue and flash this hex file anyway?\nPlease only continue if you are sure this is the right thing to do."
+msgstr "Ten plik .hex z firmware nie jest przeznaczony dla tej drukarki.\nPlik .hex jest przeznaczony dla: %s\nWykryta drukarka: %s\n\nCzy chcesz kontynuować i mimo wszystko wgrać ten plik .hex?\nKontynuuj tylko, jeśli wiesz, że tak powinno być."
+
+#: src/libslic3r/PrintConfig.cpp:348
msgid "This flag enables the automatic cooling logic that adjusts print speed and fan speed according to layer printing time."
msgstr "Ta flaga umożliwia automatyczne sterowanie chłodzeniem przez zmianę prędkości druku i wentylatora względem czasu druku jednej warstwy."
-#: src/slic3r/GUI/Plater.cpp:536
+#: src/slic3r/GUI/Plater.cpp:402
msgid "This flag enables the brim that will be printed around each object on the first layer."
msgstr "Ta flaga włącza brim, który zostanie wydrukowany na pierwszej warstwie wokół każdego modelu."
-#: src/libslic3r/PrintConfig.cpp:1538
+#: src/libslic3r/PrintConfig.cpp:1646
msgid "This flag enforces a retraction whenever a Z move is done."
msgstr "Ta flaga wymusza retrakcję przy każdej zmianie wysokości Z."
-#: src/libslic3r/PrintConfig.cpp:2194
+#: src/libslic3r/PrintConfig.cpp:2337
msgid "This flag will move the nozzle while retracting to minimize the possible blob on leaky extruders."
-msgstr "Ta flaga włączy ruch dyszy przy retrakcji aby zminimalizować formowanie się kropli filamentu wokół końcówki dyszy przy ekstruderach, które mają tendencję do wyciekania filamentu."
+msgstr "Ta flaga włączy ruch dyszy przy retrakcji, aby zminimalizować formowanie się kropli filamentu wokół końcówki dyszy przy ekstruderach, które mają tendencję do wyciekania filamentu."
+
+#: src/libslic3r/PrintConfig.cpp:1961
+msgid "This G-code will be used as a code for the color change"
+msgstr "Ten G-code zostanie użyty przy zmianie koloru"
-#: src/slic3r/GUI/Tab.cpp:953
+#: src/libslic3r/PrintConfig.cpp:1970
+msgid "This G-code will be used as a code for the pause print"
+msgstr "Ten G-code zostanie użyty przy pauzie wydruku"
+
+#: src/libslic3r/PrintConfig.cpp:1979
+msgid "This G-code will be used as a custom code"
+msgstr "Ten G-code zostanie użyty jako niestandardowy"
+
+#: src/slic3r/GUI/Tab.cpp:1272
msgid "This is a default preset."
msgstr "To jest domyślny zestaw ustawień."
-#: src/libslic3r/PrintConfig.cpp:2766
+#: src/libslic3r/PrintConfig.cpp:2930
msgid "This is a relative measure of support points density."
msgstr "To jest względna miara gęstości punktów podpór."
-#: src/slic3r/GUI/Tab.cpp:2338
+#: src/slic3r/GUI/Tab.cpp:2507
msgid "This is a single extruder multimaterial printer, diameters of all extruders will be set to the new value. Do you want to proceed?"
msgstr "To jest drukarka wielomateriałowa z jednym ekstruderem, więc średnice wszystkich ekstruderów zostaną zastąpione nową wartością. Kontynuować?"
-#: src/slic3r/GUI/Tab.cpp:955
+#: src/slic3r/GUI/Tab.cpp:1274
msgid "This is a system preset."
msgstr "To jest systemowy zestaw ustawień."
-#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:583
+#: src/libslic3r/PrintConfig.cpp:559 src/libslic3r/PrintConfig.cpp:619
msgid "This is only used in the Slic3r interface as a visual help."
-msgstr "Ta funkcja jest używana jedynie w interfejsie Slic3ra jako pomoc wizualna."
+msgstr "Ta funkcja jest używana jedynie w interfejsie PrusaSlicer jako pomoc wizualna."
-#: src/libslic3r/PrintConfig.cpp:336
+#: src/libslic3r/PrintConfig.cpp:370
msgid "This is the acceleration your printer will be reset to after the role-specific acceleration values are used (perimeter/infill). Set zero to prevent resetting acceleration at all."
-msgstr "Do tej wartości przyspieszenia drukarka wróci gdy ustawione zostaną przyspieszenia dla określonych ruchów (obrysy/wypełnienie). Ustaw zero aby wyłączyć resetowanie przyspieszeń."
+msgstr "Do tej wartości przyspieszenia drukarka wróci gdy ustawione zostaną przyspieszenia dla określonych ruchów (obrysy/wypełnienie). Ustaw zero, aby wyłączyć resetowanie przyspieszeń."
-#: src/libslic3r/PrintConfig.cpp:194
+#: src/libslic3r/PrintConfig.cpp:228
msgid "This is the acceleration your printer will use for bridges. Set zero to disable acceleration control for bridges."
-msgstr "To jest przyspieszenie stosowane przy druku mostów. Ustaw zero aby wyłączyć osobne ustawienia przyspieszenia dla mostów."
+msgstr "To jest przyspieszenie stosowane przy druku mostów. Ustaw zero, aby wyłączyć osobne ustawienia przyspieszenia dla mostów."
-#: src/libslic3r/PrintConfig.cpp:860
+#: src/libslic3r/PrintConfig.cpp:900
msgid "This is the acceleration your printer will use for first layer. Set zero to disable acceleration control for first layer."
-msgstr "To jest przyspieszenie stosowane przy druku pierwszej warstwy. Ustaw zero aby wyłączyć osobne ustawienia przyspieszenia dla pierwszej warstwy."
+msgstr "To jest przyspieszenie stosowane przy druku pierwszej warstwy. Ustaw zero, aby wyłączyć osobne ustawienia przyspieszenia dla pierwszej warstwy."
-#: src/libslic3r/PrintConfig.cpp:982
+#: src/libslic3r/PrintConfig.cpp:1026
msgid "This is the acceleration your printer will use for infill. Set zero to disable acceleration control for infill."
-msgstr "To jest przyspieszenie stosowane przy druku wypełnienia. Ustaw zero aby wyłączyć osobne ustawienia przyspieszenia dla wypełnienia."
+msgstr "To jest przyspieszenie stosowane przy druku wypełnienia. Ustaw zero aby, wyłączyć osobne ustawienia przyspieszenia dla wypełnienia."
-#: src/libslic3r/PrintConfig.cpp:1400
-msgid "This is the acceleration your printer will use for perimeters. A high value like 9000 usually gives good results if your hardware is up to the job. Set zero to disable acceleration control for perimeters."
-msgstr "To jest przyspieszenie stosowane przy druku obrysów. Wysoka wartość, np. 9000 zazwyczaj daje dobre rezultaty - pod warunkiem, że Twój sprzęt się do tego nadaje. Ustaw zero aby wyłączyć osobne ustawienia przyspieszenia dla obrysów."
+#: src/libslic3r/PrintConfig.cpp:1582
+msgid "This is the acceleration your printer will use for perimeters. Set zero to disable acceleration control for perimeters."
+msgstr "Z takim przyspieszeniem będą drukowane obrysy. Ustaw zero, aby wyłączyć kontrolowanie przyspieszenia tylko dla obrysów."
-#: src/libslic3r/PrintConfig.cpp:1327
+#: src/libslic3r/PrintConfig.cpp:1435
msgid "This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)"
msgstr "To jest średnica dyszy ekstrudera (np. 0.5, 0.35 itp.)"
-#: src/libslic3r/PrintConfig.cpp:1227
-#, no-c-format
+#: src/libslic3r/PrintConfig.cpp:1335
+#, possible-c-format
msgid "This is the highest printable layer height for this extruder, used to cap the variable layer height and support layer height. Maximum recommended layer height is 75% of the extrusion width to achieve reasonable inter-layer adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter."
-msgstr "To jest najwyższa możliwa do wydrukowania wysokość warstwy dla tego ekstrudera i jednocześnie górny limit dla funkcji zmiennej wysokości warstwy i materiału podporowego. Zalecana jest wartość nie większa niż 75% szerokości ekstruzji aby zapewnić dobrą przyczepność warstw do siebie. Jeśli ustawisz zero, wysokość warstwy zostanie ograniczona do 75% średnicy dyszy."
+msgstr "To jest najwyższa możliwa do wydrukowania wysokość warstwy dla tego ekstrudera i jednocześnie górny limit dla funkcji zmiennej wysokości warstwy i materiału podporowego. Zalecana jest wartość nie większa niż 75% szerokości ekstruzji, aby zapewnić dobrą przyczepność warstw do siebie. Jeśli ustawisz zero, wysokość warstwy zostanie ograniczona do 75% średnicy dyszy."
-#: src/libslic3r/PrintConfig.cpp:1290
+#: src/libslic3r/PrintConfig.cpp:1398
msgid "This is the lowest printable layer height for this extruder and limits the resolution for variable layer height. Typical values are between 0.05 mm and 0.1 mm."
msgstr "To jest najniższa możliwa do wydrukowania wysokość warstwy dla tego ekstrudera i jednocześnie dolny limit dla funkcji zmiennej wysokości warstwy. Zazwyczaj jest to 0.05 lub 0.1 mm."
-#: src/libslic3r/GCode.cpp:639
+#: src/libslic3r/GCode.cpp:624
msgid "This is usually caused by negligibly small extrusions or by a faulty model. Try to repair the model or change its orientation on the bed."
msgstr "Dzieje się to zazwyczaj z powodu zbyt małych odcinków ekstruzji (są one pomijane) lub uszkodzenia modelu. Spróbuj naprawić model lub zmienić jego orientację na stole."
-#: src/libslic3r/PrintConfig.cpp:2215
+#: src/libslic3r/PrintConfig.cpp:2358
msgid "This matrix describes volumes (in cubic milimetres) required to purge the new filament on the wipe tower for any given pair of tools."
msgstr "Ta formuła określa objętość (w milimetrach sześciennych) wymaganą do wyczyszczenia filamentu na wieży czyszczącej dla danej pary narzędzi (filamentów)."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:878
-msgid ""
-"This operation is irreversible.\n"
-"Do you want to proceed?"
-msgstr ""
-"Tej czynności nie można cofnąć.\n"
-"Czy chcesz kontynuować?"
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:928
+msgid "This operation is irreversible.\nDo you want to proceed?"
+msgstr "Tej czynności nie można cofnąć.\nCzy chcesz kontynuować?"
-#: src/libslic3r/PrintConfig.cpp:1442
+#: src/libslic3r/PrintConfig.cpp:1550
msgid "This option sets the number of perimeters to generate for each layer. Note that Slic3r may increase this number automatically when it detects sloping surfaces which benefit from a higher number of perimeters if the Extra Perimeters option is enabled."
msgstr "To ustawienie określa ilość obrysów, które będą generowane dla każdej warstwy. Weź po uwagę, że Slic3r może zwiększyć tą liczbę automatycznie gdy wykryje zwisy, w których wydruku pomoże dodatkowa ilość obrysów przy jednocześnie włączonej opcji \"Dodatkowe obrysy jeśli potrzebne\"."
-#: src/libslic3r/PrintConfig.cpp:1356
+#: src/libslic3r/PrintConfig.cpp:1464
msgid "This option will drop the temperature of the inactive extruders to prevent oozing. It will enable a tall skirt automatically and move extruders outside such skirt when changing temperatures."
msgstr "Ta funkcja obniży temperatury nieużywanych ekstruderów aby zapobiec wyciekaniu filamentu z dyszy. Równocześnie włączy wysoki skirt i przesunie ekstrudery poza jego obrys przy zmianie temperatury."
-#: src/libslic3r/PrintConfig.cpp:1029
+#: src/libslic3r/PrintConfig.cpp:1073
msgid "This option will limit infill to the areas actually needed for supporting ceilings (it will act as internal support material). If enabled, slows down the G-code generation due to the multiple checks involved."
msgstr "Ta opcja wygeneruje wypełnienie jedynie w miejscach, gdzie jest potrzebne do podparcia górnych warstw (zadziała na zasadzie wewnętrznych podpór). Włączenie jej spowolni generowanie G-code ze względu na konieczność kilkukrotnej weryfikacji."
-#: src/libslic3r/PrintConfig.cpp:1022
+#: src/libslic3r/PrintConfig.cpp:1066
msgid "This option will switch the print order of perimeters and infill, making the latter first."
msgstr "Ta opcja zamieni kolejność druku obrysów i wypełnienia, aby te drugie były drukowane jako pierwsze."
-#: src/libslic3r/PrintConfig.cpp:459
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:85
+msgid "This printer will be shown in the presets list as"
+msgstr "Ta drukarka będzie widnieć na liście zestawów ustawień jako"
+
+#: src/libslic3r/PrintConfig.cpp:495
msgid "This separate setting will affect the speed of external perimeters (the visible ones). If expressed as percentage (for example: 80%) it will be calculated on the perimeters speed setting above. Set to zero for auto."
-msgstr "To ustawienie steruje prędkością zewnętrznych (widocznych) obrysów. Jeśli ustawisz wartość procentową (np. 80%) to zostanie obliczona z prędkości obrysów ustawionej powyżej. Ustaw zero aby pozwolić na sterowanie automatyczne."
+msgstr "To ustawienie steruje prędkością zewnętrznych (widocznych) obrysów. Jeśli ustawisz wartość procentową (np. 80%) to zostanie obliczona z prędkości obrysów ustawionej powyżej. Ustaw zero, aby pozwolić na sterowanie automatyczne."
-#: src/libslic3r/PrintConfig.cpp:1717
+#: src/libslic3r/PrintConfig.cpp:1832
msgid "This separate setting will affect the speed of perimeters having radius <= 6.5mm (usually holes). If expressed as percentage (for example: 80%) it will be calculated on the perimeters speed setting above. Set to zero for auto."
-msgstr "To ustawienie reguluje prędkość obrysów posiadających promień mniejszy lub równy 6.5 mm (zazwyczaj chodzi o otwory). Jeśli ustawisz wartość procentową (np. 80%) to zostanie obliczona z prędkości obrysów ustawionej powyżej. Ustaw zero aby użyć nastawów automatycznych."
+msgstr "To ustawienie reguluje prędkość obrysów posiadających promień mniejszy lub równy 6.5 mm (zazwyczaj chodzi o otwory). Jeśli ustawisz wartość procentową (np. 80%) to zostanie obliczona z prędkości obrysów ustawionej powyżej. Ustaw zero, aby użyć ustawień automatycznych."
-#: src/libslic3r/PrintConfig.cpp:1038
+#: src/libslic3r/PrintConfig.cpp:1082
msgid "This setting applies an additional overlap between infill and perimeters for better bonding. Theoretically this shouldn't be needed, but backlash might cause gaps. If expressed as percentage (example: 15%) it is calculated over perimeter extrusion width."
msgstr "To ustawienie odpowiada za dodatkowe nakładanie na siebie linii obrysów i wypełnienia dla lepszego spojenia. Teoretycznie nie powinno być potrzebne ale luz może powodować szczeliny. Jeśli ustawisz wartość procentową (np. 15%) to zostanie obliczona z szerokości ekstruzji obrysów."
@@ -8230,123 +9509,129 @@ msgstr "To ustawienie odpowiada za dodatkowe nakładanie na siebie linii obrysó
msgid "This setting controls the height (and thus the total number) of the slices/layers. Thinner layers give better accuracy but take more time to print."
msgstr "To ustawienie odpowiada za wysokość warstwy (czyli cięcia), a w konsekwencji za ich liczbę. Niższe warstwy zapewniają lepszą dokładność i jakość, ale wydłużają ogólny czas wydruku."
-#: src/libslic3r/PrintConfig.cpp:1218
+#: src/libslic3r/PrintConfig.cpp:1326
msgid "This setting represents the maximum speed of your fan."
msgstr "To ustawienie odpowiada za maksymalną prędkość wentylatora."
-#: src/libslic3r/PrintConfig.cpp:1281
+#: src/libslic3r/PrintConfig.cpp:1389
msgid "This setting represents the minimum PWM your fan needs to work."
msgstr "To ustawienie wyraża minimalny PWM (Pulse Width Modulation), który jest niezbędny dla wentylatora."
-#: src/libslic3r/PrintConfig.cpp:1829
+#: src/libslic3r/PrintConfig.cpp:1944
msgid "This start procedure is inserted at the beginning, after any printer start gcode (and after any toolchange to this filament in case of multi-material printers). This is used to override settings for a specific filament. If PrusaSlicer detects M104, M109, M140 or M190 in your custom codes, such commands will not be prepended automatically so you're free to customize the order of heating commands and other custom actions. Note that you can use placeholder variables for all PrusaSlicer settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want. If you have multiple extruders, the gcode is processed in extruder order."
msgstr "Ta procedura startowa jest dodawana po kodzie startowym drukarki (i po zmianie filamentu w przypadku drukarek wielomateriałowych). Jest używana, aby nadpisać ustawienia dla konkretnego filamentu. Jeśli PrusaSlicer wykryje M104, M109, M140 lub M190 w Twoich kodach, to takie komendy nie będą automatycznie poprzedzane, więc możesz dowolnie ustawić kolejność nagrzewania i inne skonfigurowane przez siebie akcje. Zauważ, że możesz używać zmiennych dla wszystkich ustawień PrusaSlicer, więc możesz umieścić komendę \"M109 S[first_layer_temperature]\" gdzie tylko zechcesz. Jeśli masz kilka ekstruderów, to ten G-code jest wykonywany zgodnie z kolejnością ekstruderów."
-#: src/libslic3r/PrintConfig.cpp:1814
+#: src/libslic3r/PrintConfig.cpp:1929
msgid "This start procedure is inserted at the beginning, after bed has reached the target temperature and extruder just started heating, and before extruder has finished heating. If PrusaSlicer detects M104 or M190 in your custom codes, such commands will not be prepended automatically so you're free to customize the order of heating commands and other custom actions. Note that you can use placeholder variables for all PrusaSlicer settings, so you can put a \"M109 S[first_layer_temperature]\" command wherever you want."
msgstr "Ta procedura startowa jest dodawana na początku, po osiągnięciu przez stół zadanej temperatury i rozpoczęciu nagrzewania ekstrudera, ale przed zakończeniem tego procesu. Jeśli PrusaSlicer wykryje M140 lub M190 w Twoich kodach, to takie komendy nie będą automatycznie poprzedzane, więc możesz dowolnie ustawić kolejność nagrzewania i inne skonfigurowane przez siebie akcje. Zauważ, że możesz używać zmiennych dla wszystkich ustawień PrusaSlicer, więc możesz umieścić komendę \"M109 S[first_layer_temperature]\" gdzie tylko zechcesz."
-#: src/libslic3r/PrintConfig.cpp:695
+#: src/libslic3r/PrintConfig.cpp:731
msgid "This string is edited by RammingDialog and contains ramming specific parameters."
msgstr "Ten ciąg jest edytowany przez RammingDialog i zawiera parametry właściwe dla wyciskania."
-#: src/libslic3r/PrintConfig.cpp:2286
+#: src/libslic3r/PrintConfig.cpp:2429
msgid "This value will be added (or subtracted) from all the Z coordinates in the output G-code. It is used to compensate for bad Z endstop position: for example, if your endstop zero actually leaves the nozzle 0.3mm far from the print bed, set this to -0.3 (or fix your endstop)."
msgstr "Wartość tego ustawienia zostanie dodana (lub odjęta) od wszystkich koordynat w osi Z w pliku wyjściowym G-code. Jest używana dla korekcji złego położenia wyłącznika krańcowego osi Z. Np. jeśli końcówka dyszy znajduje się 0.3 mm ponad położeniem zerowym, ustaw tutaj -0.3 (lub napraw krańcówkę)."
-#: src/libslic3r/PrintConfig.cpp:2208
+#: src/libslic3r/PrintConfig.cpp:2351
msgid "This vector saves required volumes to change from/to each tool used on the wipe tower. These values are used to simplify creation of the full purging volumes below."
msgstr "To ustawienie określa wymaganą objętość wieży czyszczącej przy zmianie danego narzędzia. Te wartości używane są do uproszczenia określenia pełnych wartości czyszczenia poniżej."
#: src/slic3r/GUI/UpdateDialogs.cpp:216
-#, c-format
-msgid ""
-"This version of %s is not compatible with currently installed configuration bundles.\n"
-"This probably happened as a result of running an older %s after using a newer one.\n"
-"\n"
-"You may either exit %s and try again with a newer version, or you may re-run the initial configuration. Doing so will create a backup snapshot of the existing configuration before installing files compatible with this %s."
-msgstr ""
-"Ta wersja %s nie jest kompatybilna z aktualnie zainstalowanym zestawem konfiguracji.\n"
-"Prawdopodobnie stało się tak, ponieważ uruchomiono starszy %s po użyciu nowszego.\n"
-"\n"
-"Możesz zamknąć %s i spróbować ponownie z nowszą wersją, lub możesz też uruchomić ponownie konfigurację początkową. Spowoduje to stworzenie kopii istniejącej konfiguracji przed zainstalowaniem plików kompatybilnych z %s ."
+#, possible-c-format
+msgid "This version of %s is not compatible with currently installed configuration bundles.\nThis probably happened as a result of running an older %s after using a newer one.\n\nYou may either exit %s and try again with a newer version, or you may re-run the initial configuration. Doing so will create a backup snapshot of the existing configuration before installing files compatible with this %s."
+msgstr "Ta wersja %s nie jest kompatybilna z aktualnie zainstalowanym zestawem konfiguracji.\nPrawdopodobnie stało się tak, ponieważ uruchomiono starszy %s po użyciu nowszego.\n\nMożesz zamknąć %s i spróbować ponownie z nowszą wersją, lub możesz też uruchomić ponownie konfigurację początkową. Spowoduje to stworzenie kopii istniejącej konfiguracji przed zainstalowaniem plików kompatybilnych z %s ."
-#: src/libslic3r/PrintConfig.cpp:2458
+#: src/libslic3r/PrintConfig.cpp:2601
msgid "This will apply a gamma correction to the rasterized 2D polygons. A gamma value of zero means thresholding with the threshold in the middle. This behaviour eliminates antialiasing without losing holes in polygons."
msgstr "To ustawienie zastosuje korekcję gamma do zrasteryzowanych wielokątów 2D. Wartość 0 oznacza ustawienie progu w środku zakresu. Spowoduje to wyeliminowanie antaliasing bez utraty otworów w wielokątach."
-#: src/libslic3r/PrintConfig.cpp:2081
+#: src/libslic3r/PrintConfig.cpp:2224
msgid "Threads"
msgstr "WÄ…tki"
-#: src/libslic3r/PrintConfig.cpp:2082
+#: src/libslic3r/PrintConfig.cpp:2225
msgid "Threads are used to parallelize long-running tasks. Optimal threads number is slightly above the number of available cores/processors."
msgstr "Wątki są używane do równoległego przetwarzania zadań wymagających używa wielu zasobów. Optymalna liczba wątków powinna być odrobinę większa od dostępnej liczby rdzeni lub procesorów."
-#: src/slic3r/GUI/Tab.cpp:2093
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:235
+msgid "Threshold:"
+msgstr "Próg:"
+
+#: src/slic3r/GUI/Tab.cpp:2263
msgid "Tilt"
msgstr "Przechylanie"
-#: src/slic3r/GUI/Tab.cpp:2094
+#: src/slic3r/GUI/Tab.cpp:2264
msgid "Tilt time"
msgstr "Czas przechylania"
+#: src/slic3r/GUI/GCodeViewer.cpp:2225 src/slic3r/GUI/GCodeViewer.cpp:2233
#: src/slic3r/GUI/RammingChart.cpp:76
msgid "Time"
msgstr "Czas"
-#: src/libslic3r/PrintConfig.cpp:687
+#: src/libslic3r/PrintConfig.cpp:723
msgid "Time for the printer firmware (or the Multi Material Unit 2.0) to load a new filament during a tool change (when executing the T code). This time is added to the total print time by the G-code time estimator."
msgstr "Czas, który drukarka (lub dodatek Multi Material 2.0) poświęca na ładowanie nowego filamentu podczas zmiany narzędzia (przy wykonywaniu kodu T). Ten czas jest dodawany do szacowanego czasu druku."
-#: src/libslic3r/PrintConfig.cpp:702
+#: src/libslic3r/PrintConfig.cpp:738
msgid "Time for the printer firmware (or the Multi Material Unit 2.0) to unload a filament during a tool change (when executing the T code). This time is added to the total print time by the G-code time estimator."
msgstr "Czas, który drukarka (lub dodatek Multi Material 2.0) poświęca na rozładowanie nowego filamentu podczas zmiany narzędzia (przy wykonywaniu kodu T). Ten czas jest dodawany do szacowanego czasu druku."
-#: src/libslic3r/PrintConfig.cpp:2407
+#: src/libslic3r/PrintConfig.cpp:2550
msgid "Time of the fast tilt"
msgstr "Czas szybkiego przechylania"
-#: src/libslic3r/PrintConfig.cpp:2416
+#: src/libslic3r/PrintConfig.cpp:2559
msgid "Time of the slow tilt"
msgstr "Czas wolnego przechylania"
-#: src/libslic3r/PrintConfig.cpp:641
+#: src/libslic3r/PrintConfig.cpp:677
msgid "Time to wait after the filament is unloaded. May help to get reliable toolchanges with flexible materials that may need more time to shrink to original dimensions."
msgstr "Czas bezczynności po rozładowaniu filamentu. Może pomóc w bezproblemowej zmianie narzędzia podczas druku z materiałami elastycznymi, które mogą potrzebować więcej czasu na skurcz termiczny wracając do nominalnego rozmiaru."
-#: src/slic3r/GUI/Tab.cpp:966
+#: src/slic3r/GUI/GCodeViewer.cpp:2197
+msgid "to"
+msgstr "do"
+
+#: src/slic3r/GUI/Tab.cpp:1284
msgid "To do that please specify a new name for the preset."
-msgstr "Aby to zrobić ustaw nową nazwę zestawu ustawień."
+msgstr "Aby to zrobić, ustaw nową nazwę zestawu ustawień."
-#: src/slic3r/GUI/Plater.cpp:4014
+#: src/slic3r/GUI/Plater.cpp:3934
msgid "To objects"
msgstr "Do modeli"
-#: src/slic3r/GUI/Plater.cpp:4016
+#: src/slic3r/GUI/Plater.cpp:3936
msgid "To parts"
msgstr "Na części"
-#: src/slic3r/GUI/Tab.cpp:1756
+#: src/slic3r/Utils/Http.cpp:82
+msgid "To specify the system certificate store manually, please set the %1% environment variable to the correct CA bundle and restart the application."
+msgstr "Aby ręcznie ustawić systemowy magazyn certyfikatów, ustaw %1% jako zmienną środowiskową pakietu i zrestartuj aplikację."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:360
msgid "To use a custom CA file, please import your CA file into Certificate Store / Keychain."
-msgstr "Aby użyć własnego certyfikatu, zaimportuj plik do Certificate Store / Keychain."
+msgstr "Aby użyć własnego certyfikatu, zaimportuj plik do magazynu (Certificate Store / Keychain)."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263
-#, c-format
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:271
+#, possible-c-format
msgid "Toggle %c axis mirroring"
msgstr "WÅ‚Ä…cz odbicie w osi %c"
-#: src/libslic3r/Zipper.cpp:34
+#: src/libslic3r/miniz_extension.cpp:93
msgid "too many files"
msgstr "zbyt wiele plików"
-#: src/libslic3r/SLAPrintSteps.cpp:190
-msgid "Too much overlapping holes."
+#: src/libslic3r/SLAPrintSteps.cpp:192
+msgid "Too many overlapping holes."
msgstr "Zbyt wiele nakładających się otworów."
-#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/GUI_Preview.cpp:335
-#: src/slic3r/GUI/GUI_Preview.cpp:519 src/slic3r/GUI/GUI_Preview.cpp:574
-#: src/slic3r/GUI/GUI_Preview.cpp:835 src/libslic3r/GCode/PreviewData.cpp:357
+#: src/slic3r/GUI/GCodeViewer.cpp:2241 src/slic3r/GUI/GUI_Preview.cpp:281
+#: src/slic3r/GUI/GUI_Preview.cpp:453 src/slic3r/GUI/GUI_Preview.cpp:693
+#: src/slic3r/GUI/GUI_Preview.cpp:786 src/slic3r/GUI/GUI_Preview.cpp:1270
+#: src/libslic3r/GCode/PreviewData.cpp:362
msgid "Tool"
msgstr "Narzędzie"
@@ -8354,54 +9639,71 @@ msgstr "Narzędzie"
msgid "Tool #"
msgstr "Narzędzie #"
-#: src/slic3r/GUI/Tab.cpp:2000 src/libslic3r/PrintConfig.cpp:2093
+#: src/slic3r/GUI/Tab.cpp:2189 src/libslic3r/PrintConfig.cpp:2236
msgid "Tool change G-code"
msgstr "G-code wykonywany przy zmianie narzędzia"
-#: src/slic3r/GUI/Tab.cpp:1491
+#: src/slic3r/GUI/GCodeViewer.cpp:2530 src/slic3r/GUI/GUI_Preview.cpp:1474
+msgid "Tool changes"
+msgstr "Zmiany narzędzi"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:1479
+msgid "Tool marker"
+msgstr "Oznaczenie narzędzia"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:223
+msgid "Tool position"
+msgstr "Pozycja narzędzia"
+
+#: src/slic3r/GUI/Tab.cpp:1837
msgid "Toolchange parameters with single extruder MM printers"
msgstr "Parametry zmiany narzędzia dla drukarek MM z jednym ekstruderem"
#. TRN To be shown in the main menu View->Top
#. TRN To be shown in Print Settings "Top solid layers"
-#: src/slic3r/GUI/MainFrame.cpp:662 src/libslic3r/PrintConfig.cpp:2132
-#: src/libslic3r/PrintConfig.cpp:2141
+#: src/slic3r/GUI/MainFrame.cpp:959 src/slic3r/GUI/MainFrame.cpp:1279
+#: src/libslic3r/PrintConfig.cpp:2275 src/libslic3r/PrintConfig.cpp:2284
msgid "Top"
msgstr "Górne"
-#: src/slic3r/GUI/PresetHints.cpp:304
+#: src/slic3r/GUI/PresetHints.cpp:302
msgid "Top / bottom shell thickness hint: Not available due to invalid layer height."
msgstr "Porada dot. grubości dolnej / górnej powłoki: niedostępne z powodu nieprawidłowej wysokości warstwy."
-#: src/libslic3r/PrintConfig.cpp:415
+#: src/libslic3r/PrintConfig.cpp:449
msgid "Top fill pattern"
msgstr "Wzór wypełnienia górnej warstwy"
-#: src/slic3r/GUI/PresetHints.cpp:323
+#: src/slic3r/GUI/PresetHints.cpp:321
msgid "Top is open."
msgstr "Góra jest otwarta."
-#: src/slic3r/GUI/PresetHints.cpp:317
+#: src/slic3r/GUI/PresetHints.cpp:315
msgid "Top shell is %1% mm thick for layer height %2% mm."
msgstr "Górna powłoka ma %1% mm grubości dla warstwy o wysokości %2% mm."
-#: src/slic3r/GUI/PresetHints.cpp:192
+#: src/slic3r/GUI/PresetHints.cpp:191
msgid "top solid infill"
msgstr "zwarte wypełnienie na szczycie"
-#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:315
-#: src/libslic3r/PrintConfig.cpp:2105 src/libslic3r/PrintConfig.cpp:2117
+#: src/slic3r/GUI/GUI_Preview.cpp:306 src/libslic3r/ExtrusionEntity.cpp:319
+#: src/libslic3r/ExtrusionEntity.cpp:346 src/libslic3r/PrintConfig.cpp:2248
+#: src/libslic3r/PrintConfig.cpp:2260
msgid "Top solid infill"
msgstr "Zwarte wypełnienie górne"
-#: src/libslic3r/PrintConfig.cpp:2135
+#: src/libslic3r/PrintConfig.cpp:2278
msgid "Top solid layers"
msgstr "Zwarte warstwy górne"
-#: src/slic3r/GUI/MainFrame.cpp:662
+#: src/slic3r/GUI/MainFrame.cpp:959 src/slic3r/GUI/MainFrame.cpp:1279
msgid "Top View"
msgstr "Widok z góry"
+#: src/libslic3r/PrintConfig.cpp:1211
+msgid "Topmost surface only"
+msgstr "Tylko najwyżej położona warstwa"
+
#: src/slic3r/GUI/WipeTowerDialog.cpp:285
msgid "Total purging volume is calculated by summing two values below, depending on which tools are loaded/unloaded."
msgstr "Całkowita objętość czyszczenia jest obliczana z sumy obydwóch wartości poniżej, w zależności która para narzędzi jest rozładowana/ładowana."
@@ -8414,50 +9716,79 @@ msgstr "Całkowita objętość wyciskania"
msgid "Total ramming time"
msgstr "Całkowity czas wyciskania"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:640
+msgid "Transfer"
+msgstr "Transfer"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:745
+msgid "Transfer the selected options to the newly selected preset \"%1%\"."
+msgstr "Przenieś wybrane opcje do nowo wybranego zestawu ustawień \"%1%\"."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:740
+msgid "Transfer the selected settings to the newly selected preset."
+msgstr "Przenieś wybrane ustawienia do nowo wybranego zestawu ustawień."
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:561
msgid "Translate"
msgstr "Konwersja"
-#: src/slic3r/GUI/Mouse3DController.cpp:300
-#: src/slic3r/GUI/Mouse3DController.cpp:317
+#: src/slic3r/GUI/Mouse3DController.cpp:282
+#: src/slic3r/GUI/Mouse3DController.cpp:303
msgid "Translation"
msgstr "TÅ‚umaczenie"
-#: src/slic3r/GUI/GUI_Preview.cpp:253 src/libslic3r/PrintConfig.cpp:2152
+#: src/slic3r/GUI/GCodeViewer.cpp:2489 src/slic3r/GUI/GUI_Preview.cpp:335
+#: src/slic3r/GUI/GUI_Preview.cpp:1471 src/libslic3r/PrintConfig.cpp:2295
msgid "Travel"
msgstr "Jałowy"
-#: src/libslic3r/PrintConfig.cpp:845
+#: src/libslic3r/PrintConfig.cpp:883
msgid "Triangles"
msgstr "Trójkąty"
-#: src/libslic3r/PrintConfig.cpp:3448
+#: src/libslic3r/PrintConfig.cpp:3647
msgid "Try to repair any non-manifold meshes (this option is implicitly added whenever we need to slice the model to perform the requested action)."
msgstr "Podejmij próbę naprawienia wszystkich niezamkniętych obszarów siatki (ta opcja jest dodana w przypadku, w którym potrzebujemy pociąć model, aby przeprowadzić jakieś zadanie)."
-#: src/libslic3r/PrintConfig.cpp:1467
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:165
+msgid "Type here the name of your printer device"
+msgstr "Wpisz tutaj nazwÄ™ drukarki"
+
+#: src/libslic3r/PrintConfig.cpp:1575
msgid "Type of the printer."
msgstr "Rodzaj drukarki."
-#: src/slic3r/GUI/ConfigWizard.cpp:2013 src/slic3r/GUI/GUI_ObjectList.cpp:3553
+#: src/slic3r/GUI/ConfigWizard.cpp:2524 src/slic3r/GUI/ConfigWizard.cpp:2526
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4016
msgid "Type:"
msgstr "Typ:"
-#: src/slic3r/GUI/Plater.cpp:3428
+#: src/slic3r/GUI/OpenGLManager.cpp:275
+#, possible-c-format
+msgid "Unable to load the following shaders:\n%s"
+msgstr "Niepowodzenie wczytywania następujących modułów cieniujących:\n%s"
+
+#: src/slic3r/GUI/Plater.cpp:3233
msgid "Unable to reload:"
msgstr "Nie można wczytać:"
-#: src/libslic3r/Zipper.cpp:32
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:137
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:146
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:845
+msgid "Undef"
+msgstr "Undef"
+
+#: src/libslic3r/miniz_extension.cpp:91
msgid "undefined error"
msgstr "nieznany błąd"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4624 src/slic3r/GUI/KBShortcutsDialog.cpp:130
-#: src/slic3r/GUI/MainFrame.cpp:581
+#: src/slic3r/GUI/GLCanvas3D.cpp:5028 src/slic3r/GUI/KBShortcutsDialog.cpp:125
+#: src/slic3r/GUI/MainFrame.cpp:1187
msgid "Undo"
msgstr "Cofnij"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4065
-#, c-format
+#: src/slic3r/GUI/GLCanvas3D.cpp:4382
+#, possible-c-format
msgid "Undo %1$d Action"
msgid_plural "Undo %1$d Actions"
msgstr[0] "Cofnij %1$d akcjÄ™"
@@ -8465,123 +9796,102 @@ msgstr[1] "Cofnij %1$d akcji"
msgstr[2] "Cofnij %1$d akcji"
msgstr[3] "Cofnij %1$d akcji"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4047
+#: src/slic3r/GUI/GLCanvas3D.cpp:4361
msgid "Undo History"
msgstr "Historia Cofnięć"
-#: src/libslic3r/Zipper.cpp:56
+#: src/libslic3r/miniz_extension.cpp:115
msgid "unexpected decompressed size"
msgstr "nieoczekiwany rozmiar po rozpakowaniu"
#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:27
+#: src/slic3r/GUI/GUI_Preview.cpp:299 src/libslic3r/ExtrusionEntity.cpp:310
msgid "Unknown"
msgstr "Nieznane"
-#: src/slic3r/Utils/Duet.cpp:82 src/slic3r/Utils/Duet.cpp:137
-#: src/slic3r/Utils/FlashAir.cpp:119 src/slic3r/Utils/FlashAir.cpp:140
-#: src/slic3r/Utils/FlashAir.cpp:156
+#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:139
+#: src/slic3r/Utils/FlashAir.cpp:122 src/slic3r/Utils/FlashAir.cpp:143
+#: src/slic3r/Utils/FlashAir.cpp:159
msgid "Unknown error occured"
msgstr "Wystąpił nieznany błąd"
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:178
+msgid "Unknown error occured during exporting G-code."
+msgstr "Wystąpił nieznany błąd podczas eksportowania G-code."
+
#: src/slic3r/GUI/WipeTowerDialog.cpp:263
msgid "unloaded"
msgstr "rozładowano"
-#: src/libslic3r/PrintConfig.cpp:623
+#: src/libslic3r/PrintConfig.cpp:659
msgid "Unloading speed"
msgstr "Prędkość rozładowania"
-#: src/libslic3r/PrintConfig.cpp:632
+#: src/libslic3r/PrintConfig.cpp:668
msgid "Unloading speed at the start"
msgstr "Początkowa prędkość rozładowania"
-#: src/slic3r/GUI/Tab.cpp:3256
+#: src/slic3r/GUI/Tab.cpp:3693
msgid "UNLOCKED LOCK"
msgstr "OTWARTA KÅÓDKA"
-#: src/slic3r/GUI/Tab.cpp:3282
-msgid ""
-"UNLOCKED LOCK icon indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\n"
-"Click to reset all settings for current option group to the system (or default) values."
-msgstr ""
-"OTWARTA KÅÓDKA oznacza, że niektóre ustawienia zostaÅ‚y zmodyfikowane i nie odpowiadajÄ… wartoÅ›ciom systemowym (lub domyÅ›lnym) w obecnej grupie opcji.\n"
-"Kliknij aby zresetować wszystkie ustawienia obecnej grupy ustawień do wartości systemowych (lub domyślnych)."
-
-#: src/slic3r/GUI/Tab.cpp:3297
-msgid ""
-"UNLOCKED LOCK icon indicates that the value was changed and is not equal to the system (or default) value.\n"
-"Click to reset current value to the system (or default) value."
-msgstr ""
-"OTWARTA KÅÓDKA oznacza, że niektóre wartoÅ›ci zostaÅ‚y zmodyfikowane i nie odpowiadajÄ… systemowym (lub domyÅ›lnym).\n"
-"Kliknij ikonę aby zresetować do wartości systemowej (lub domyślnej)."
+#: src/slic3r/GUI/Tab.cpp:3719
+msgid "UNLOCKED LOCK icon indicates that some settings were changed and are not equal to the system (or default) values for the current option group.\nClick to reset all settings for current option group to the system (or default) values."
+msgstr "OTWARTA KÅÓDKA oznacza, że niektóre ustawienia zostaÅ‚y zmodyfikowane i nie odpowiadajÄ… wartoÅ›ciom systemowym (lub domyÅ›lnym) w obecnej grupie opcji.\nKliknij, aby zresetować wszystkie ustawienia obecnej grupy ustawieÅ„ do wartoÅ›ci systemowych (lub domyÅ›lnych)."
-#: src/slic3r/GUI/Plater.cpp:5203
-#, c-format
-msgid "Unmounting successful. The device %s(%s) can now be safely removed from the computer."
-msgstr "Wysuwanie nośnika zakończone. Urządzenie %s (%s) może być teraz bezpiecznie odłączone od komputera."
+#: src/slic3r/GUI/Tab.cpp:3734
+msgid "UNLOCKED LOCK icon indicates that the value was changed and is not equal to the system (or default) value.\nClick to reset current value to the system (or default) value."
+msgstr "OTWARTA KÅÓDKA oznacza, że niektóre wartoÅ›ci zostaÅ‚y zmodyfikowane i nie odpowiadajÄ… systemowym (lub domyÅ›lnym).\nKliknij ikonÄ™, aby zresetować do wartoÅ›ci systemowej (lub domyÅ›lnej)."
-#: src/slic3r/GUI/GUI_Preview.cpp:255
-msgid "Unretractions"
-msgstr "Powrót retrakcji"
-
-#: src/slic3r/GUI/Tab.cpp:2947
-msgid "Unsaved Changes"
-msgstr "Niezapisane zmiany"
-
-#: src/slic3r/GUI/GUI_App.cpp:935
-msgid "Unsaved Presets"
-msgstr "Niezapisane zestawy ustawień"
-
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:173
msgid "Unselect gizmo or clear selection"
msgstr "Odznacz uchwyt lub wyczyść zaznaczenie"
-#: src/libslic3r/Zipper.cpp:60
+#: src/libslic3r/miniz_extension.cpp:119
msgid "unsupported central directory size"
msgstr "nieobsługiwany rozmiar katalogu centralnego"
-#: src/libslic3r/Zipper.cpp:40
+#: src/libslic3r/miniz_extension.cpp:99
msgid "unsupported encryption"
msgstr "nieobsługiwane szyfrowanie"
-#: src/libslic3r/Zipper.cpp:42
+#: src/libslic3r/miniz_extension.cpp:101
msgid "unsupported feature"
msgstr "nieobsługiwana funkcja"
-#: src/libslic3r/Zipper.cpp:38
+#: src/libslic3r/miniz_extension.cpp:97
msgid "unsupported method"
msgstr "nieobsługiwana metoda"
-#: src/libslic3r/Zipper.cpp:50
+#: src/libslic3r/miniz_extension.cpp:109
msgid "unsupported multidisk archive"
msgstr "nieobsługiwane archiwum wielodyskowe"
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:292
+#: src/slic3r/GUI/OpenGLManager.cpp:267
msgid "Unsupported OpenGL version"
msgstr "Nieobsługiwana wersja OpenGL"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3420
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3883
msgid "Unsupported selection"
msgstr "Niewłaściwy wybór"
-#: src/slic3r/GUI/GLCanvas3D.cpp:955
-#, c-format
-msgid "up to %.2f mm"
-msgstr "do %.2f mm"
+#: src/slic3r/GUI/GCodeViewer.cpp:2183
+msgid "up to"
+msgstr "do"
#: src/slic3r/GUI/UpdateDialogs.cpp:38
msgid "Update available"
msgstr "Dostępna jest aktualizacja"
-#: src/slic3r/GUI/ConfigWizard.cpp:779 src/slic3r/GUI/Preferences.cpp:80
+#: src/slic3r/GUI/ConfigWizard.cpp:1138 src/slic3r/GUI/Preferences.cpp:97
msgid "Update built-in Presets automatically"
msgstr "Automatyczna aktualizacja wbudowanych zestawów ustawień"
-#: src/slic3r/GUI/ConfigWizard.cpp:761
+#: src/slic3r/GUI/ConfigWizard.cpp:1120
msgid "Updates"
msgstr "Aktualizacje"
-#: src/slic3r/GUI/ConfigWizard.cpp:786
+#: src/slic3r/GUI/ConfigWizard.cpp:1145
msgid "Updates are never applied without user's consent and never overwrite user's customized settings."
msgstr "Aktualizacje nie są stosowane bez wiedzy użytkownika i nigdy nie nadpisują zapisanych ustawień własnych."
@@ -8589,7 +9899,7 @@ msgstr "Aktualizacje nie są stosowane bez wiedzy użytkownika i nigdy nie nadpi
msgid "Upgrade"
msgstr "Aktualizacja"
-#: src/slic3r/GUI/GUI_App.cpp:824
+#: src/slic3r/GUI/GUI_App.cpp:1522
msgid "Upload a firmware image into an Arduino based printer"
msgstr "Wgraj obraz firmware do drukarki opartej na Adruino"
@@ -8605,101 +9915,122 @@ msgstr "Prześlij do serwera druku z następującą nazwą pliku:"
msgid "Uploading"
msgstr "Przesyłanie"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:204
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:206
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
msgid "Upper Layer"
msgstr "Górna Warstwa"
-#: src/slic3r/GUI/Tab.cpp:1900
-msgid "USB/Serial connection"
-msgstr "Połączenie USB/szeregowe"
-
-#: src/libslic3r/PrintConfig.cpp:1662
-msgid "USB/serial port for printer connection."
-msgstr "Port USB/szeregowy do połączenia z drukarką."
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
+msgid "Upper layer"
+msgstr "Górna warstwa"
-#: src/slic3r/GUI/DoubleSlider.cpp:1147
+#: src/slic3r/GUI/DoubleSlider.cpp:1276
msgid "Use another extruder"
msgstr "Użyj innego ekstrudera"
-#: src/slic3r/GUI/Preferences.cpp:143
+#: src/slic3r/GUI/Preferences.cpp:220
msgid "Use custom size for toolbar icons"
msgstr "Użyj własnego rozmiaru ikon pasków narzędzi"
-#: src/libslic3r/PrintConfig.cpp:2161
+#: src/slic3r/GUI/Preferences.cpp:268
+msgid "Use environment map"
+msgstr "Użyj mapy środowiskowej"
+
+#: src/libslic3r/PrintConfig.cpp:2304
msgid "Use firmware retraction"
msgstr "Użyj retrakcji z firmware"
+#: src/slic3r/GUI/ImGuiWrapper.cpp:800 src/slic3r/GUI/Search.cpp:464
+msgid "Use for search"
+msgstr "Użyj do wyszukiwania"
+
+#: src/libslic3r/PrintConfig.cpp:1218
+msgid "Use for time estimate"
+msgstr "Użyj do obliczenia czasu"
+
#: src/slic3r/GUI/PrintHostDialogs.cpp:42
msgid "Use forward slashes ( / ) as a directory separator if needed."
msgstr "Użyj prawego ukośnika ( / ) jako separatora katalogu w razie potrzeby."
-#: src/slic3r/GUI/Preferences.cpp:126
+#: src/slic3r/GUI/Preferences.cpp:191
msgid "Use free camera"
msgstr "Użyj wolnego widoku"
-#: src/libslic3r/PrintConfig.cpp:2780
+#: src/slic3r/GUI/ConfigWizard.cpp:1188
+msgid "Use inches"
+msgstr "Użyj cali"
+
+#: src/libslic3r/PrintConfig.cpp:2944
msgid "Use pad"
msgstr "Użyj podkładki"
-#: src/slic3r/GUI/Preferences.cpp:119
+#: src/slic3r/GUI/Preferences.cpp:184
msgid "Use perspective camera"
msgstr "Użyj widoku perspektywicznego"
-#: src/libslic3r/PrintConfig.cpp:2168
+#: src/libslic3r/PrintConfig.cpp:2311
msgid "Use relative E distances"
msgstr "Użyj względnych wartości E (ekstruzji)"
-#: src/slic3r/GUI/Preferences.cpp:104
+#: src/slic3r/GUI/Preferences.cpp:135
msgid "Use Retina resolution for the 3D scene"
msgstr "Użyj rozdzielczości Retina dla generowania podglądu 3D"
-#: src/libslic3r/PrintConfig.cpp:540
+#: src/libslic3r/PrintConfig.cpp:576
msgid "Use this option to set the axis letter associated to your printer's extruder (usually E but some printers use A)."
msgstr "Ta opcja określa literę, którą Twoja drukarka opisuje oś ekstrudera (zazwyczaj jest to E ale niektóre drukarki używają A)."
-#: src/libslic3r/PrintConfig.cpp:1893
+#: src/libslic3r/PrintConfig.cpp:2035
msgid "Use this setting to rotate the support material pattern on the horizontal plane."
msgstr "To ustawienie odpowiada za obrót materiału podporowego w płaszczyźnie poziomej."
-#: src/libslic3r/PrintConfig.cpp:2175
+#: src/libslic3r/PrintConfig.cpp:2318
msgid "Use volumetric E"
msgstr "Użyj wolumetrycznej wartości E"
-#: src/slic3r/GUI/DoubleSlider.cpp:1171
+#: src/slic3r/GUI/DoubleSlider.cpp:1298
msgid "used"
msgstr "używany"
-#: src/slic3r/GUI/Plater.cpp:237
+#: src/slic3r/GUI/Plater.cpp:243
msgid "Used Filament (g)"
msgstr "Użyty filament (g)"
-#: src/slic3r/GUI/Plater.cpp:235 src/slic3r/GUI/Plater.cpp:1229
+#: src/slic3r/GUI/Plater.cpp:1141
+msgid "Used Filament (in)"
+msgstr "Użyty filament (cale)"
+
+#: src/slic3r/GUI/Plater.cpp:1153
+msgid "Used Filament (in³)"
+msgstr "Użyty filament (cale³)"
+
+#: src/slic3r/GUI/Plater.cpp:241 src/slic3r/GUI/Plater.cpp:1141
msgid "Used Filament (m)"
msgstr "Użyty filament (m)"
-#: src/slic3r/GUI/Plater.cpp:236
+#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1153
msgid "Used Filament (mm³)"
msgstr "Użyty filament (mm³)"
-#: src/slic3r/GUI/Plater.cpp:1191
+#: src/slic3r/GUI/Plater.cpp:1100
msgid "Used Material (ml)"
msgstr "Używany materiał (ml)"
-#: src/slic3r/GUI/Plater.cpp:238
+#: src/slic3r/GUI/Plater.cpp:244
msgid "Used Material (unit)"
msgstr "Używany materiał (jednostka)"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24 src/libslic3r/PrintConfig.cpp:132
msgid "User"
msgstr "Użytkownik"
-#: src/slic3r/GUI/Preset.cpp:1168 src/slic3r/GUI/Preset.cpp:1288
-#: src/slic3r/GUI/PresetBundle.cpp:1677
+#: src/slic3r/GUI/PresetComboBoxes.cpp:230
+#: src/slic3r/GUI/PresetComboBoxes.cpp:778
+#: src/slic3r/GUI/PresetComboBoxes.cpp:934
msgid "User presets"
msgstr "Zestawy użytkownika"
-#: src/libslic3r/Zipper.cpp:90
+#: src/libslic3r/miniz_extension.cpp:149
msgid "validation failed"
msgstr "niepowodzenie weryfikacji"
@@ -8711,31 +10042,31 @@ msgstr "Wartość jest taka sama jak systemowa"
msgid "Value was changed and is not equal to the system value or the last saved preset"
msgstr "Wartość została zmieniona i nie równa się wartości systemowej lub tej z ostatnio zapisanego zestawu ustawień"
-#: src/slic3r/GUI/Tab.cpp:2202
+#: src/slic3r/GUI/Tab.cpp:2371
msgid "Values in this column are for Normal mode"
msgstr "Wartości w tej kolumnie dotyczą trybu Normal"
-#: src/slic3r/GUI/Tab.cpp:2208
+#: src/slic3r/GUI/Tab.cpp:2377
msgid "Values in this column are for Stealth mode"
msgstr "Wartości w tej kolumnie dotyczą trybu Stealth"
-#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/slic3r/GUI/GLCanvas3D.cpp:4573
+#: src/slic3r/GUI/GLCanvas3D.cpp:231 src/slic3r/GUI/GLCanvas3D.cpp:4978
msgid "Variable layer height"
msgstr "Zmienna wysokość warstwy"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1709
+#: src/slic3r/GUI/GLCanvas3D.cpp:1786
msgid "Variable layer height - Adaptive"
msgstr "Zmienna wysokość warstwy - Adaptacyjna"
-#: src/slic3r/GUI/GLCanvas3D.cpp:599
+#: src/slic3r/GUI/GLCanvas3D.cpp:565
msgid "Variable layer height - Manual edit"
msgstr "Zmienna wysokość warstwy - ręczna edycja"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1701
+#: src/slic3r/GUI/GLCanvas3D.cpp:1778
msgid "Variable layer height - Reset"
msgstr "Zmienna wysokość warstwy - Reset"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1717
+#: src/slic3r/GUI/GLCanvas3D.cpp:1794
msgid "Variable layer height - Smooth all"
msgstr "Zmienna wysokość warstwy - Wygładź wszystko"
@@ -8743,19 +10074,20 @@ msgstr "Zmienna wysokość warstwy - Wygładź wszystko"
msgid "variants"
msgstr "warianty"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:971
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:1289
msgid "vendor"
msgstr "dostawca"
-#: src/slic3r/GUI/ConfigWizard.cpp:565
+#: src/slic3r/GUI/ConfigWizard.cpp:589
msgid "Vendor:"
msgstr "Producent:"
-#: src/libslic3r/PrintConfig.cpp:928
+#: src/libslic3r/PrintConfig.cpp:972
msgid "Verbose G-code"
msgstr "G-code rozszerzony"
-#: src/slic3r/GUI/AboutDialog.cpp:231 src/slic3r/GUI/MainFrame.cpp:64
+#: src/slic3r/GUI/AboutDialog.cpp:256 src/slic3r/GUI/GUI_App.cpp:239
+#: src/slic3r/GUI/MainFrame.cpp:164
msgid "Version"
msgstr "Wersja"
@@ -8763,24 +10095,48 @@ msgstr "Wersja"
msgid "version"
msgstr "wersja"
-#: src/slic3r/GUI/Tab.cpp:1053
+#: src/slic3r/GUI/Tab.cpp:1375
msgid "Vertical shells"
msgstr "Powłoka pionowa"
-#: src/slic3r/GUI/GUI_Preview.cpp:218
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:237
+msgid "Vertical Slider"
+msgstr "Suwak pionowy"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:212
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:231
+msgid "Vertical slider - Move active thumb Down"
+msgstr "Suwak pionowy - przesuń aktywny punkt w dół"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:211
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:230
+msgid "Vertical slider - Move active thumb Up"
+msgstr "Suwak pionowy - przesuń aktywny punkt w górę"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:265 src/slic3r/GUI/GUI_Preview.cpp:271
msgid "View"
msgstr "Widok"
-#: src/slic3r/GUI/ConfigWizard.cpp:813
+#: src/slic3r/GUI/ConfigWizard.cpp:1172
msgid "View mode"
msgstr "Widok"
-#: src/libslic3r/SLAPrintSteps.cpp:413 src/libslic3r/SLAPrintSteps.cpp:422
-#: src/libslic3r/SLAPrintSteps.cpp:461
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:666
+msgid "Visit \"Preferences\" and check \"%1%\"\nto be asked about unsaved changes again."
+msgstr "Otwórz Preferencje i sprawdź \"%1%\",\naby włączyć potwierdzanie niezapisanych zmian."
+
+#: src/libslic3r/PrintConfig.cpp:3553
+msgid "Visualize an already sliced and saved G-code"
+msgstr "Wizualizacja pociętego i zapisanego G-code"
+
+#: src/libslic3r/SLAPrintSteps.cpp:411 src/libslic3r/SLAPrintSteps.cpp:420
+#: src/libslic3r/SLAPrintSteps.cpp:459
msgid "Visualizing supports"
msgstr "Wizualizacja podpór"
-#: src/slic3r/GUI/Plater.cpp:161
+#: src/slic3r/GUI/Plater.cpp:167
msgid "Volume"
msgstr "Objętość"
@@ -8788,175 +10144,191 @@ msgstr "Objętość"
msgid "Volume to purge (mm³) when the filament is being"
msgstr "Objętość do wyczyszczenia (mm³), gdy filament jest"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1106
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1230
msgid "Volumes in Object reordered"
msgstr "Części modelu przeorganizowane"
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:218
msgid "Volumetric"
msgstr "Objętościowy"
-#: src/slic3r/GUI/Tab.cpp:1591
+#: src/slic3r/GUI/Tab.cpp:1930
msgid "Volumetric flow hints not available"
msgstr "Podpowiedzi dot. objętości przepływu są niedostępne"
-#: src/slic3r/GUI/GUI_Preview.cpp:226
+#: src/slic3r/GUI/GUI_Preview.cpp:280
msgid "Volumetric flow rate"
-msgstr "Objętościowa wartość przepływu"
+msgstr "Objętościowe natężenie przepływu"
-#: src/libslic3r/GCode/PreviewData.cpp:355
+#: src/slic3r/GUI/GCodeViewer.cpp:2240 src/libslic3r/GCode/PreviewData.cpp:360
msgid "Volumetric flow rate (mm³/s)"
-msgstr "Objętościowy współczynnik przepływu (mm³/s)"
+msgstr "Natężenie przepływu (mm³/s)"
#: src/slic3r/GUI/RammingChart.cpp:81
msgid "Volumetric speed"
-msgstr "Prędkość objętościowa"
+msgstr "Natężenie przepływu"
-#: src/libslic3r/PrintConfig.cpp:2915
+#: src/libslic3r/PrintConfig.cpp:3079
msgid "Wall thickness"
msgstr "Grubość ścianki"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1270 src/slic3r/GUI/GUI.cpp:251
-#: src/slic3r/GUI/Tab.cpp:3084 src/slic3r/GUI/WipeTowerDialog.cpp:45
-#: src/slic3r/GUI/WipeTowerDialog.cpp:366
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1129 src/slic3r/GUI/GUI.cpp:256
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:478
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:502
+#: src/slic3r/GUI/WipeTowerDialog.cpp:45 src/slic3r/GUI/WipeTowerDialog.cpp:366
msgid "Warning"
msgstr "Ostrzeżenie"
-#: src/slic3r/GUI/ConfigWizard.cpp:431
+#: src/slic3r/GUI/NotificationManager.cpp:672
+#: src/slic3r/GUI/NotificationManager.cpp:687
+#: src/slic3r/GUI/NotificationManager.cpp:702
+msgid "WARNING:"
+msgstr "OSTRZEŻENIE:"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:449
msgid "Welcome"
msgstr "Witaj"
-#: src/slic3r/GUI/ConfigWizard.cpp:427
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:445
+#, possible-c-format
msgid "Welcome to the %s Configuration Assistant"
msgstr "Witamy w Asystencie Konfiguracji %s"
-#: src/slic3r/GUI/ConfigWizard.cpp:429
-#, c-format
+#: src/slic3r/GUI/ConfigWizard.cpp:447
+#, possible-c-format
msgid "Welcome to the %s Configuration Wizard"
msgstr "Witamy w Asystencie Konfiguracji %s"
-#: src/slic3r/GUI/Preferences.cpp:97
+#: src/slic3r/GUI/SavePresetDialog.cpp:310
+msgid "What would you like to do with \"%1%\" preset after saving?"
+msgstr "Co chcesz zrobić z zestawem ustawień \"%1%\" po zapisaniu?"
+
+#: src/slic3r/GUI/Preferences.cpp:114
msgid "When checked, the print and filament presets are shown in the preset editor even if they are marked as incompatible with the active printer"
msgstr "Zaznaczenie tej opcji spowoduje wyświetlanie wszystkich ustawień druku i filamentów w edytorze zestawów ustawień, nawet jeśli są oznaczone jak niekompatybilne z wybraną drukarką"
-#: src/slic3r/GUI/PresetHints.cpp:224
+#: src/slic3r/GUI/Preferences.cpp:122
+msgid "When checked, whenever dragging and dropping a project file on the application, shows a dialog asking to select the action to take on the file to load."
+msgstr "Jeśli zaznaczone, przeciągnięcie i upuszczenie pliku z projektem do okna aplikacji spowoduje wyświetlenie monitu w pytaniem o wybranie akcji do podjęcia przy wczytaniu pliku"
+
+#: src/slic3r/GUI/Preferences.cpp:156
+msgid "When closing the application, always ask for unsaved changes"
+msgstr "Zawsze pytaj o niezapisane zmiany podczas zamykania aplikacji"
+
+#: src/slic3r/GUI/PresetHints.cpp:223
msgid "when printing"
msgstr "podczas druku"
-#: src/libslic3r/PrintConfig.cpp:253
+#: src/libslic3r/PrintConfig.cpp:287
msgid "When printing multi-material objects, this settings will make Slic3r to clip the overlapping object parts one by the other (2nd part will be clipped by the 1st, 3rd part will be clipped by the 1st and 2nd etc)."
msgstr "To ustawienie sprawi, że podczas druku modeli z wielu materiałów, PrusaSlicer przytnie nachodzące na siebie części (druga część zostanie przycięta przez pierwszą, trzecia przez pierwszą i drugą itd.)"
-#: src/libslic3r/PrintConfig.cpp:305
+#: src/libslic3r/PrintConfig.cpp:339
msgid "When printing multiple objects or copies, this feature will complete each object before moving onto next one (and starting it from its bottom layer). This feature is useful to avoid the risk of ruined prints. Slic3r should warn and prevent you from extruder collisions, but beware."
-msgstr "Włączenie tej opcji sprawi, że przy druku kilku modeli drukarka wydrukuje jeden model w całości zanim przejdzie do następnego (zaczynając od najniższej warstwy). Przydaje się aby uniknąć ryzyka niepowodzenia wydruku kilku części. Slic3r powinien ostrzec przed możliwością kolizji z ekstruderem, ale zachowaj ostrożność."
+msgstr "Włączenie tej opcji sprawi, że przy druku kilku modeli drukarka wydrukuje jeden model w całości zanim przejdzie do następnego (zaczynając od najniższej warstwy). Przydaje się, aby uniknąć ryzyka niepowodzenia wydruku kilku części. PrusaSlicer powinien ostrzec przed możliwością kolizji z ekstruderem, ale zachowaj ostrożność."
-#: src/libslic3r/PrintConfig.cpp:891
+#: src/libslic3r/PrintConfig.cpp:933
msgid "When printing with very low layer heights, you might still want to print a thicker bottom layer to improve adhesion and tolerance for non perfect build plates. This can be expressed as an absolute value or as a percentage (for example: 150%) over the default layer height."
-msgstr "Podczas druku z bardzo małą wysokością warstwy warto mimo wszystko wydrukować najniższą warstwę o większej wysokości aby zwiększyć przyczepność i tolerancję na niedoskonałości powierzchni druki. Może być wyrażona jako wartość bezwzględna lub procentowa (np. 150%) nominalnej wysokości warstwy."
+msgstr "Podczas druku z bardzo małą wysokością warstwy warto mimo wszystko wydrukować najniższą warstwę o większej wysokości, aby zwiększyć przyczepność i tolerancję na niedoskonałości powierzchni druki. Może być wyrażona jako wartość bezwzględna lub procentowa (np. 150%) nominalnej wysokości warstwy."
-#: src/libslic3r/PrintConfig.cpp:1553
+#: src/libslic3r/PrintConfig.cpp:1661
msgid "When retraction is triggered before changing tool, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder)."
msgstr "Kiedy retrakcja zostaje wykonana przed zmianą ekstrudera, filament o określonej długości jest wciągany z powrotem (mierzona jest długość nieprzetworzonego filamentu, zanim wejdzie do ekstrudera)."
-#: src/libslic3r/PrintConfig.cpp:1545
+#: src/libslic3r/PrintConfig.cpp:1653
msgid "When retraction is triggered, filament is pulled back by the specified amount (the length is measured on raw filament, before it enters the extruder)."
msgstr "Kiedy zostaje wykonana retrakcja to filament o określonej długości jest wciągany z powrotem (mierzona jest długość nieprzetworzonego filamentu, zanim wejdzie do ekstrudera)."
-#: src/libslic3r/PrintConfig.cpp:1391
+#: src/libslic3r/PrintConfig.cpp:1499
msgid "When set to zero, the distance the filament is moved from parking position during load is exactly the same as it was moved back during unload. When positive, it is loaded further, if negative, the loading move is shorter than unloading."
msgstr "Gdy ta wartość wynosi zero, to długość ładowania filamentu z pozycji zaparkowanej jest dokładnie taka sama, jak podczas rozładowywania. Jeśli jest dodatnia to jest większa (więcej filamentu zostanie załadowane), jeśli ujemna to jest mniejsza niż przy rozładowywaniu."
-#: src/libslic3r/PrintConfig.cpp:1238
+#: src/libslic3r/PrintConfig.cpp:1346
msgid "When setting other speed settings to 0 Slic3r will autocalculate the optimal speed in order to keep constant extruder pressure. This experimental setting is used to set the highest print speed you want to allow."
msgstr "Ustawienie pozostałych prędkości na 0 spowoduje, ze Slic3r będzie automatycznie przeliczał optymalną prędkość dla utrzymania stałego ciśnienia materiału w ekstruderze. To eksperymentalne ustawienie określa maksymalną dozwoloną prędkość druku."
-#: src/libslic3r/PrintConfig.cpp:1597
+#: src/libslic3r/PrintConfig.cpp:1705
msgid "When the retraction is compensated after changing tool, the extruder will push this additional amount of filament."
msgstr "Jeśli retrakcja jest korygowana po zmianie narzędzia, ekstruder przepchnie taką dodatkową ilość filamentu."
-#: src/libslic3r/PrintConfig.cpp:1589
+#: src/libslic3r/PrintConfig.cpp:1697
msgid "When the retraction is compensated after the travel move, the extruder will push this additional amount of filament. This setting is rarely needed."
msgstr "Jeśli retrakcja jest korygowana po ruchu jałowym, ekstruder przepchnie taką dodatkową ilość filamentu. Ta opcja jest rzadko potrzebna."
-#: src/slic3r/GUI/Tab.cpp:3263
+#: src/slic3r/GUI/Tab.cpp:3700
msgid "WHITE BULLET"
msgstr "BIAÅA KROPKA"
-#: src/slic3r/GUI/Tab.cpp:3285
+#: src/slic3r/GUI/Tab.cpp:3722
msgid "WHITE BULLET icon indicates a non system (or non default) preset."
msgstr "BIAÅA KROPKA oznacza niesystemowy (lub inny niż domyÅ›lny) zestaw ustawieÅ„."
-#: src/slic3r/GUI/Tab.cpp:3288
+#: src/slic3r/GUI/Tab.cpp:3725
msgid "WHITE BULLET icon indicates that the settings are the same as in the last saved preset for the current option group."
msgstr "BIAÅA KROPKA oznacza, że ustawienia sÄ… takie same jak w ostatnio zapisanym zestawie ustawieÅ„ dla obecnej grupy opcji."
-#: src/slic3r/GUI/Tab.cpp:3303
+#: src/slic3r/GUI/Tab.cpp:3740
msgid "WHITE BULLET icon indicates that the value is the same as in the last saved preset."
msgstr "BIAÅA KROPKA oznacza, że wartość jest taka sama jak w ostatnio zapisanym zestawie ustawieÅ„."
-#: src/slic3r/GUI/GUI_Preview.cpp:223 src/libslic3r/PrintConfig.cpp:2238
+#: src/slic3r/GUI/GUI_Preview.cpp:277 src/libslic3r/PrintConfig.cpp:2381
msgid "Width"
msgstr "Szerokość"
-#: src/libslic3r/GCode/PreviewData.cpp:349
+#: src/slic3r/GUI/GCodeViewer.cpp:2237 src/libslic3r/GCode/PreviewData.cpp:354
msgid "Width (mm)"
msgstr "Szerokość (mm)"
-#: src/libslic3r/PrintConfig.cpp:2640
+#: src/libslic3r/PrintConfig.cpp:2783
msgid "Width from the back sphere center to the front sphere center"
msgstr "Odstęp pomiędzy środkami przedniej i tylnej części łącznika podpory"
-#: src/libslic3r/PrintConfig.cpp:2239
+#: src/libslic3r/PrintConfig.cpp:2382
msgid "Width of a wipe tower"
msgstr "Szerokość wieży czyszczącej"
-#: src/libslic3r/PrintConfig.cpp:2891
+#: src/libslic3r/PrintConfig.cpp:3055
msgid "Width of the connector sticks which connect the object and the generated pad."
msgstr "Średnica słupków łączących model z wygenerowaną podkładką."
-#: src/libslic3r/PrintConfig.cpp:2354
+#: src/libslic3r/PrintConfig.cpp:2497
msgid "Width of the display"
msgstr "Szerokość wyświetlacza"
-#: src/slic3r/GUI/PresetHints.cpp:48
-msgid "will always run at %1%%%"
-msgstr "będzie zawsze pracować w %1%%%"
-
-#: src/slic3r/GUI/PresetHints.cpp:55
-msgid "will be turned off."
-msgstr "będzie wyłączony."
-
-#: src/libslic3r/PrintConfig.cpp:2441
+#: src/libslic3r/PrintConfig.cpp:2584
msgid "Will inflate or deflate the sliced 2D polygons according to the sign of the correction."
msgstr "Trójkąty 2D zostaną rozciągnięte lub ściśnięte zgodnie z kierunkiem korekcji."
-#: src/libslic3r/PrintConfig.cpp:2261
+#: src/slic3r/GUI/GCodeViewer.cpp:2660 src/slic3r/GUI/GCodeViewer.cpp:2663
+#: src/slic3r/GUI/GUI_Preview.cpp:978
+msgid "Wipe"
+msgstr "Czyszczenie"
+
+#: src/libslic3r/PrintConfig.cpp:2404
msgid "Wipe into this object"
msgstr "Czyszczenie na tym modelu"
-#: src/libslic3r/PrintConfig.cpp:2253
+#: src/libslic3r/PrintConfig.cpp:2396
msgid "Wipe into this object's infill"
msgstr "Czyszczenie na wypełnieniu modelu"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:101
-#: src/slic3r/GUI/GUI_ObjectList.cpp:619 src/libslic3r/PrintConfig.cpp:2252
-#: src/libslic3r/PrintConfig.cpp:2260
+#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:99
+#: src/slic3r/GUI/GUI_ObjectList.cpp:658 src/libslic3r/PrintConfig.cpp:2395
+#: src/libslic3r/PrintConfig.cpp:2403
msgid "Wipe options"
msgstr "Opcje czyszczenia"
-#: src/slic3r/GUI/GUI_Preview.cpp:248 src/slic3r/GUI/Tab.cpp:1191
-#: src/libslic3r/ExtrusionEntity.cpp:321
+#: src/slic3r/GUI/GUI_Preview.cpp:313 src/slic3r/GUI/Tab.cpp:1521
+#: src/libslic3r/ExtrusionEntity.cpp:326 src/libslic3r/ExtrusionEntity.cpp:360
msgid "Wipe tower"
msgstr "Wieża czyszcząca"
-#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245
+#: src/slic3r/GUI/Plater.cpp:1143 src/slic3r/GUI/Plater.cpp:1160
msgid "wipe tower"
msgstr "wieża czyszcząca"
-#: src/slic3r/GUI/ConfigManipulation.cpp:120
-#: src/slic3r/GUI/ConfigManipulation.cpp:140
+#: src/slic3r/GUI/ConfigManipulation.cpp:119
+#: src/slic3r/GUI/ConfigManipulation.cpp:139
msgid "Wipe Tower"
msgstr "Wieża czyszcząca"
@@ -8964,131 +10336,141 @@ msgstr "Wieża czyszcząca"
msgid "Wipe tower - Purging volume adjustment"
msgstr "Wieża czyszcząca - dostosowanie objętości czyszczenia"
-#: src/slic3r/GUI/Tab.cpp:1488
+#: src/slic3r/GUI/Tab.cpp:1834
msgid "Wipe tower parameters"
msgstr "Parametry wieży czyszczącej"
-#: src/libslic3r/PrintConfig.cpp:2245
+#: src/libslic3r/PrintConfig.cpp:2388
msgid "Wipe tower rotation angle"
msgstr "Kąt obrotu wieży czyszczącej"
-#: src/libslic3r/PrintConfig.cpp:2246
+#: src/libslic3r/PrintConfig.cpp:2389
msgid "Wipe tower rotation angle with respect to x-axis."
msgstr "Obrót wieży czyszczącej względem osi X."
-#: src/libslic3r/PrintConfig.cpp:2193
+#: src/libslic3r/PrintConfig.cpp:2336
msgid "Wipe while retracting"
msgstr "Czyszczenie przy retrakcji"
-#: src/slic3r/GUI/PresetHints.cpp:225
+#: src/slic3r/GUI/PresetHints.cpp:224
msgid "with a volumetric rate"
msgstr "ze współczynnikiem objętościowym"
-#: src/libslic3r/PrintConfig.cpp:1530
+#: src/libslic3r/PrintConfig.cpp:1638
msgid "With bowden extruders, it may be wise to do some amount of quick retract before doing the wipe movement."
msgstr "Przy ekstruderze typu bowden warto wykonać szybką retrakcję przed ruchem czyszczącym."
-#: src/libslic3r/PrintConfig.cpp:2056
+#: src/libslic3r/PrintConfig.cpp:2198
msgid "With sheath around the support"
msgstr "Osłona wokół podpór"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:68
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:111
msgid "World coordinates"
msgstr "Globalny układ współrzędnych"
#: src/slic3r/GUI/UpdateDialogs.cpp:92
-msgid ""
-"Would you like to install it?\n"
-"\n"
-"Note that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n"
-"\n"
-"Updated configuration bundles:"
-msgstr ""
-"Czy chcesz kontynuować instalację?\n"
-"\n"
-"Weź pod uwagę, że najpierw zostanie stworzony zrzut konfiguracji. Może być przywrócony w każdej chwili, gdyby okazało się, że nowa wersja powoduje problemy.\n"
-"\n"
-"Zaktualizowane paczki konfiguracyjne:"
+msgid "Would you like to install it?\n\nNote that a full configuration snapshot will be created first. It can then be restored at any time should there be a problem with the new version.\n\nUpdated configuration bundles:"
+msgstr "Czy chcesz kontynuować instalację?\n\nWeź pod uwagę, że najpierw zostanie stworzony zrzut konfiguracji. Może być przywrócony w każdej chwili, gdyby okazało się, że nowa wersja powoduje problemy.\n\nZaktualizowane paczki konfiguracyjne:"
+
+#: src/slic3r/GUI/GUI_App.cpp:1802
+msgid "Would you like to stop uploads and close the program?"
+msgstr "Czy chcesz zatrzymać przesyłanie i zamknąć program?"
-#: src/libslic3r/Zipper.cpp:92
+#: src/libslic3r/miniz_extension.cpp:151
msgid "write calledback failed"
msgstr "błąd write calledback"
-#: src/libslic3r/PrintConfig.cpp:3382
+#: src/libslic3r/PrintConfig.cpp:3581
msgid "Write information about the model to the console."
msgstr "Zapis informacji o modelu do konsoli."
-#: src/slic3r/Utils/Duet.cpp:131
+#: src/slic3r/Utils/Duet.cpp:133
msgid "Wrong password"
msgstr "Nieprawidłowe hasło"
-#: src/libslic3r/PrintConfig.cpp:2225
+#: src/libslic3r/PrintConfig.cpp:2368
msgid "X coordinate of the left front corner of a wipe tower"
msgstr "Koordynata X wieży czyszczącej od przedniego lewego narożnika"
-#: src/libslic3r/PrintConfig.cpp:1879
+#: src/libslic3r/PrintConfig.cpp:2021
msgid "XY separation between an object and its support"
msgstr "Odstęp materiału podporowego od modelu w osiach XY"
-#: src/libslic3r/PrintConfig.cpp:1881
+#: src/libslic3r/PrintConfig.cpp:2023
msgid "XY separation between an object and its support. If expressed as percentage (for example 50%), it will be calculated over external perimeter width."
msgstr "Odstęp materiału podporowego od modelu w osiach XY. Jeśli ustawisz wartość procentową (np. 15%) to zostanie obliczona z szerokości ekstruzji obrysów zewnętrznych."
-#: src/libslic3r/PrintConfig.cpp:2275
+#: src/libslic3r/PrintConfig.cpp:2418
msgid "XY Size Compensation"
msgstr "Korekta wymiarów XY"
-#: src/libslic3r/PrintConfig.cpp:2232
+#: src/libslic3r/PrintConfig.cpp:2375
msgid "Y coordinate of the left front corner of a wipe tower"
msgstr "Koordynata wieży czyszczącej w osi Y od przedniego lewego narożnika"
-#: src/slic3r/GUI/Plater.cpp:1170
+#: src/slic3r/GUI/Plater.cpp:1079
msgid "Yes"
msgstr "Tak"
-#: src/libslic3r/PrintConfig.cpp:1317
+#: src/slic3r/GUI/Plater.cpp:1405
+msgid "You can open only one .gcode file at a time."
+msgstr "Możesz mieć otwarty tylko jeden plik .gcode w tym samym czasie."
+
+#: src/libslic3r/PrintConfig.cpp:1425
msgid "You can put here your personal notes. This text will be added to the G-code header comments."
msgstr "Tutaj możesz umieścić notatki, które zostaną dodane do nagłówka pliku G-code."
-#: src/libslic3r/PrintConfig.cpp:589
+#: src/libslic3r/PrintConfig.cpp:625
msgid "You can put your notes regarding the filament here."
msgstr "Tutaj możesz umieścić notatki dotyczące filamentu."
-#: src/libslic3r/PrintConfig.cpp:1473
+#: src/libslic3r/PrintConfig.cpp:1581
msgid "You can put your notes regarding the printer here."
msgstr "Tutaj możesz umieścić notatki dotyczące drukarki."
-#: src/libslic3r/PrintConfig.cpp:2579
+#: src/libslic3r/PrintConfig.cpp:2722
msgid "You can put your notes regarding the SLA print material here."
msgstr "Tutaj możesz umieścić notatki dotyczące materiału druku SLA."
-#: src/libslic3r/PrintConfig.cpp:360
+#: src/libslic3r/PrintConfig.cpp:394
msgid "You can set this to a positive value to disable fan at all during the first layers, so that it does not make adhesion worse."
msgstr "Wpisując tutaj wartość dodatnią możesz wyłączyć wentylator podczas druku pierwszych warstw, aby nie pogarszać przyczepności do stołu."
-#: src/libslic3r/PrintConfig.cpp:1364
+#: src/libslic3r/PrintConfig.cpp:1472
msgid "You can use all configuration options as variables inside this template. For example: [layer_height], [fill_density] etc. You can also use [timestamp], [year], [month], [day], [hour], [minute], [second], [version], [input_filename], [input_filename_base]."
msgstr "Możesz użyć wszystkich opcji konfiguracjnych jako zmiennych w tym szablonie, takich jak np: [layer_height] - wysokość warstwy, [fill_density] - gęstość wypełnienia, itp. Możesz również użyć [timestamp] - czas, [year] - rok, [month] - miesiąc, [day] - dzień, [hour] - godzina, [minute] - minuta, [second] - sekunda, [version] - wersja, [input_filename] - pełna nazwa pliku wejściowego, [input_filename_base] - nazwa pliku wejściowego bez rozszerzenia."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3546
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4009
msgid "You can't change a type of the last solid part of the object."
msgstr "Nie możesz zmienić typu ostatniej zwartej części modelu."
-#: src/slic3r/GUI/Plater.cpp:2390
-#, c-format
+#: src/slic3r/GUI/Plater.cpp:2352
+#, possible-c-format
msgid "You can't to add the object(s) from %s because of one or some of them is(are) multi-part"
msgstr "Nie możesz dodać obiektu/ów z %s, ponieważ jeden lub więcej modeli składa się z wielu części"
-#: src/slic3r/GUI/Plater.cpp:2311
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:208 src/slic3r/GUI/Plater.cpp:2254
msgid "You cannot load SLA project with a multi-part object on the bed"
msgstr "Nie możesz wczytać projektu SLA mając na stole wieloczęściowy model"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:625
msgid "You cannot use non-uniform scaling mode for multiple objects/parts selection"
msgstr "Nie możesz używać skalowania nierównomiernego dla kliku modeli/części"
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:287
+#: src/slic3r/GUI/NotificationManager.hpp:459
+msgid "You have just added a G-code for color change, but its value is empty.\nTo export the G-code correctly, check the \"Color Change G-code\" in \"Printer Settings > Custom G-code\""
+msgstr "Dodany został G-code dla zmiany koloru, ale nie zawiera parametrów.\nAby poprawnie wyeksportować G-code, wybierz \"G-code dla zmiany koloru\" w sekcji \"Ustawienia drukarki -> Własny G-code\""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:277
+msgid "You have selected physical printer \"%1%\" \nwith related printer preset \"%2%\""
+msgstr "Wybrana została fizyczna drukarka \"%1%\"\nz powiązanym zestawem ustawień drukarki \"%2%\""
+
+#: src/slic3r/GUI/GUI_App.cpp:1078
+msgid "You have the following presets with saved options for \"Print Host upload\""
+msgstr "Masz następujące zestawy ustawień z zapisaną opcją \"Wysyłania do serwera druku\""
+
+#: src/slic3r/GUI/OpenGLManager.cpp:262
msgid "You may need to update your graphics card driver."
msgstr "Może być wymagana aktualizacja sterowników karty graficznej."
@@ -9096,93 +10478,95 @@ msgstr "Może być wymagana aktualizacja sterowników karty graficznej."
msgid "You must install a configuration update."
msgstr "Do instalacji jest wymagana aktualizacja konfiguracji."
-#: src/slic3r/GUI/Preferences.cpp:172
-#, c-format
+#: src/slic3r/GUI/Preferences.cpp:299
+#, possible-c-format
msgid "You need to restart %s to make the changes effective."
msgstr "Wymagany jest restart %s, aby wprowadzić zmiany."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3421
-#, c-format
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:468
+msgid "You should change the name of your printer device."
+msgstr "Należy zmienić nazwę drukarki."
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3884
+#, possible-c-format
msgid "You started your selection with %s Item."
msgstr "Wybór rozpoczęty przez %s."
-#: src/slic3r/GUI/DoubleSlider.cpp:1902
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:664
+msgid "You will not be asked about the unsaved changes the next time you close PrusaSlicer."
+msgstr "Podczas kolejnego zamknięcia PrusaSlicer nie dostaniesz pytania o niezapisane zmiany."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:665
+msgid "You will not be asked about the unsaved changes the next time you switch a preset."
+msgstr "Podczas kolejnej zmiany zestawu ustawień nie dostaniesz pytania o niezapisane zmiany."
+
+#: src/slic3r/GUI/DoubleSlider.cpp:2121
msgid "Your current changes will delete all saved color changes."
msgstr "Wprowadzane zmiany usuną wszystkie zmiany kolorów."
-#: src/slic3r/GUI/DoubleSlider.cpp:1923
+#: src/slic3r/GUI/DoubleSlider.cpp:2141
msgid "Your current changes will delete all saved extruder (tool) changes."
msgstr "Obecne zmiany spowodują usunięcie wszystkich zapisanych zmian ekstruderów (narzędzi)."
-#: src/slic3r/GUI/MainFrame.cpp:911
+#: src/slic3r/GUI/MainFrame.cpp:1612
msgid "Your file was repaired."
msgstr "Twój plik został naprawiony."
-#: src/slic3r/GUI/Plater.cpp:2528
+#: src/slic3r/GUI/Plater.cpp:2490
msgid "Your object appears to be too large, so it was automatically scaled down to fit your print bed."
msgstr "Importowany model przekracza wymiary przestrzeni roboczej i został przeskalowany do odpowiednich rozmiarów."
-#: src/libslic3r/PrintConfig.cpp:2285
+#: src/libslic3r/GCode.cpp:1261
+msgid "Your print is very close to the priming regions. Make sure there is no collision."
+msgstr "Twój wydruk znajduje się bardzo blisko obszaru czyszczenia dyszy. Upewnij się, że nie dojdzie do kolizji."
+
+#: src/libslic3r/PrintConfig.cpp:2428
msgid "Z offset"
msgstr "Z offset"
-#: src/slic3r/GUI/ConfigManipulation.cpp:60
-msgid ""
-"Zero first layer height is not valid.\n"
-"\n"
-"The first layer height will be reset to 0.01."
-msgstr ""
-"Zerowa wysokość pierwszej warstwy jest nieprawidłowa.\n"
-"\n"
-"Wysokość pierwszej warstwy zostanie ustawiona na 0,01."
+#: src/slic3r/GUI/ConfigManipulation.cpp:59
+msgid "Zero first layer height is not valid.\n\nThe first layer height will be reset to 0.01."
+msgstr "Zerowa wysokość pierwszej warstwy jest nieprawidłowa.\n\nWysokość pierwszej warstwy zostanie ustawiona na 0,01."
-#: src/slic3r/GUI/ConfigManipulation.cpp:48
-msgid ""
-"Zero layer height is not valid.\n"
-"\n"
-"The layer height will be reset to 0.01."
-msgstr ""
-"Zerowa wysokość warstwy jest nieprawidłowa.\n"
-"\n"
-"Wysokość warstwy zostanie ustawiona na 0,01."
+#: src/slic3r/GUI/ConfigManipulation.cpp:47
+msgid "Zero layer height is not valid.\n\nThe layer height will be reset to 0.01."
+msgstr "Zerowa wysokość warstwy jest nieprawidłowa.\n\nWysokość warstwy zostanie ustawiona na 0,01."
-#: src/libslic3r/PrintConfig.cpp:2667
+#: src/libslic3r/PrintConfig.cpp:2831
msgid "Zig-Zag"
msgstr "Zig-Zag"
-#: src/slic3r/GUI/Mouse3DController.cpp:308
-#: src/slic3r/GUI/Mouse3DController.cpp:317
+#: src/slic3r/GUI/Mouse3DController.cpp:294
+#: src/slic3r/GUI/Mouse3DController.cpp:303
msgid "Zoom"
msgstr "Zoom"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:183
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:177
msgid "Zoom in"
msgstr "Przybliżenie"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:184
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:178
msgid "Zoom out"
msgstr "Oddalenie"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:181
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
msgid "Zoom to Bed"
msgstr "Zbliżenie na Stół"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:182
-msgid ""
-"Zoom to selected object\n"
-"or all objects in scene, if none selected"
-msgstr ""
-"Ustaw zbliżenie na wybrany model\n"
-"lub wszystkie na stole, jeśli żaden nie został wybrany"
-
-#: src/libslic3r/PrintConfig.cpp:207 src/libslic3r/PrintConfig.cpp:780
-#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1650
-#: src/libslic3r/PrintConfig.cpp:1894 src/libslic3r/PrintConfig.cpp:2049
-#: src/libslic3r/PrintConfig.cpp:2247 src/libslic3r/PrintConfig.cpp:2727
-#: src/libslic3r/PrintConfig.cpp:2848
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:176
+msgid "Zoom to selected object\nor all objects in scene, if none selected"
+msgstr "Ustaw zbliżenie na wybrany model\nlub wszystkie na stole, jeśli żaden nie został wybrany"
+
+#: src/libslic3r/PrintConfig.cpp:241 src/libslic3r/PrintConfig.cpp:816
+#: src/libslic3r/PrintConfig.cpp:1748 src/libslic3r/PrintConfig.cpp:1758
+#: src/libslic3r/PrintConfig.cpp:2036 src/libslic3r/PrintConfig.cpp:2191
+#: src/libslic3r/PrintConfig.cpp:2390 src/libslic3r/PrintConfig.cpp:2891
+#: src/libslic3r/PrintConfig.cpp:3012
msgid "°"
msgstr "°"
-#: src/slic3r/GUI/ConfigWizard.cpp:1038 src/slic3r/GUI/ConfigWizard.cpp:1052
+#: src/slic3r/GUI/ConfigWizard.cpp:1404 src/slic3r/GUI/ConfigWizard.cpp:1418
+#: src/libslic3r/PrintConfig.cpp:180 src/libslic3r/PrintConfig.cpp:912
+#: src/libslic3r/PrintConfig.cpp:956 src/libslic3r/PrintConfig.cpp:2209
msgid "°C"
msgstr "°C"
diff --git a/resources/localization/pt_br/PrusaSlicer.mo b/resources/localization/pt_br/PrusaSlicer.mo
index 152f1e2a1..62cb2fdbc 100644
--- a/resources/localization/pt_br/PrusaSlicer.mo
+++ b/resources/localization/pt_br/PrusaSlicer.mo
Binary files differ
diff --git a/resources/localization/pt_br/PrusaSlicer_pt_br.po b/resources/localization/pt_br/PrusaSlicer_pt_br.po
index 30b3eb569..d362cbfea 100644
--- a/resources/localization/pt_br/PrusaSlicer_pt_br.po
+++ b/resources/localization/pt_br/PrusaSlicer_pt_br.po
@@ -7,27 +7,27 @@ msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-03-05 13:51+0100\n"
-"PO-Revision-Date: 2020-03-11 09:32-0300\n"
-"Last-Translator: \n"
+"POT-Creation-Date: 2020-12-18 13:59+0100\n"
+"PO-Revision-Date: 2021-01-06 10:53+0100\n"
+"Last-Translator: Oleksandra Iushchenko <yusanka@gmail.com>\n"
"Language-Team: \n"
"Language: pt_BR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n > 1);\n"
-"X-Generator: Poedit 2.2.4\n"
+"X-Generator: Poedit 2.4.2\n"
-#: src/slic3r/GUI/AboutDialog.cpp:41 src/slic3r/GUI/AboutDialog.cpp:294
+#: src/slic3r/GUI/AboutDialog.cpp:45 src/slic3r/GUI/AboutDialog.cpp:299
msgid "Portions copyright"
msgstr "Direitos autorais das partes"
-#: src/slic3r/GUI/AboutDialog.cpp:129 src/slic3r/GUI/AboutDialog.cpp:258
+#: src/slic3r/GUI/AboutDialog.cpp:135 src/slic3r/GUI/AboutDialog.cpp:263
msgid "Copyright"
msgstr "Direitos autorais"
#. TRN "Slic3r _is licensed under the_ License"
-#: src/slic3r/GUI/AboutDialog.cpp:131
+#: src/slic3r/GUI/AboutDialog.cpp:137
msgid ""
"License agreements of all following programs (libraries) are part of "
"application license agreement"
@@ -35,25 +35,26 @@ msgstr ""
"Os contratos de licença de todos os seguintes programas (bibliotecas) são "
"parte do contrato de licença de aplicativo"
-#: src/slic3r/GUI/AboutDialog.cpp:201
+#: src/slic3r/GUI/AboutDialog.cpp:206
#, c-format
msgid "About %s"
msgstr "Sobre %s"
-#: src/slic3r/GUI/AboutDialog.cpp:233 src/slic3r/GUI/MainFrame.cpp:64
+#: src/slic3r/GUI/AboutDialog.cpp:238 src/slic3r/GUI/AboutDialog.cpp:361
+#: src/slic3r/GUI/GUI_App.cpp:235 src/slic3r/GUI/MainFrame.cpp:151
msgid "Version"
msgstr "Versão"
#. TRN "Slic3r _is licensed under the_ License"
-#: src/slic3r/GUI/AboutDialog.cpp:260
+#: src/slic3r/GUI/AboutDialog.cpp:265 src/slic3r/GUI/GUI_App.cpp:240
msgid "is licensed under the"
msgstr "está licenciado sobre o(a)"
-#: src/slic3r/GUI/AboutDialog.cpp:261
+#: src/slic3r/GUI/AboutDialog.cpp:266 src/slic3r/GUI/GUI_App.cpp:240
msgid "GNU Affero General Public License, version 3"
msgstr "Licensa GNU Affero General Public, versão 3"
-#: src/slic3r/GUI/AboutDialog.cpp:262
+#: src/slic3r/GUI/AboutDialog.cpp:267
msgid ""
"PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap "
"community."
@@ -61,258 +62,265 @@ msgstr ""
"PrusaSlicer é baseado no Slic3r criado por Alessandro Ranellucci e a "
"comunidade RepRap."
-#: src/slic3r/GUI/AboutDialog.cpp:263
+#: src/slic3r/GUI/AboutDialog.cpp:268
msgid ""
-"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, "
-"Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and "
-"numerous others."
+"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr "
+"Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and numerous "
+"others."
msgstr ""
-"Contribuições por Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, "
-"Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik e "
-"outros."
+"Contribuições por Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr "
+"Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik e outros."
-#: src/slic3r/GUI/AppConfig.cpp:114
+#: src/slic3r/GUI/AboutDialog.cpp:304
+msgid "Copy Version Info"
+msgstr "Copiar Informações da Versão"
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:78
+#, c-format
msgid ""
-"Error parsing PrusaSlicer config file, it is probably corrupted. Try to "
-"manually delete the file to recover from the error. Your user profiles will "
-"not be affected."
+"%s has encountered an error. It was likely caused by running out of memory. If "
+"you are sure you have enough RAM on your system, this may also be a bug and we "
+"would be glad if you reported it."
msgstr ""
-"Erro de análise da config do arquivo, ele provavelmente está corrompido. "
-"Tente excluir manualmente o arquivo para recuperar do erro. Seus perfis de "
-"usuário não serão afetados."
+"%s encontrou um erro. Provavelmente foi causado por ficar sem memória. Se você "
+"tem certeza que você tem RAM suficiente em seu sistema, isso também pode ser "
+"um bug e nós estaríamos contentes se você relatou."
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:163
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183
+msgid "Unknown error occured during exporting G-code."
+msgstr "Ocorreu um erro desconhecido durante a exportação do G-code."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:110
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:168
msgid ""
-"Copying of the temporary G-code to the output G-code failed. Maybe the SD "
-"card is write locked?"
+"Copying of the temporary G-code to the output G-code failed. Maybe the SD card "
+"is write locked?\n"
+"Error message: %1%"
msgstr ""
"A cópia do G-código provisório G-código falhou na saída. Talvez o cartão SD "
-"está bloqueado para escrita?"
+"está bloqueado para escrita?\n"
+"Mensagem de erro: %1%"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:113
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:171
msgid ""
"Copying of the temporary G-code to the output G-code failed. There might be "
"problem with target device, please try exporting again or using different "
"device. The corrupted output G-code is at %1%.tmp."
msgstr ""
"A cópia do G-code temporário para o G-code de saída falhou. Pode haver "
-"problemas com o dispositivo de destino, por favor tente exportar novamente "
-"ou usar dispositivo diferente. O G-code de saída corrompido está em %1%.tmp."
+"problemas com o dispositivo de destino, por favor tente exportar novamente ou "
+"usar dispositivo diferente. O G-code de saída corrompido está em %1%.tmp."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:116
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:174
msgid ""
"Renaming of the G-code after copying to the selected destination folder has "
"failed. Current path is %1%.tmp. Please try exporting again."
msgstr ""
-"A renomeação do G-code após a cópia na pasta de destino selecionada falhou. "
-"O caminho atual é %1%.tmp. Por favor, tente exportar de novo."
+"A renomeação do G-code após a cópia na pasta de destino selecionada falhou. O "
+"caminho atual é %1%.tmp. Por favor, tente exportar de novo."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:119
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:177
msgid ""
"Copying of the temporary G-code has finished but the original code at %1% "
"couldn't be opened during copy check. The output G-code is at %2%.tmp."
msgstr ""
-"A cópia do código G temporário foi concluída, mas o código original em %1% "
-"não pôde ser aberto durante a verificação de cópia. O código G de saída está "
-"em %2%.tmp."
+"A cópia do código G temporário foi concluída, mas o código original em %1% não "
+"pôde ser aberto durante a verificação de cópia. O código G de saída está em "
+"%2%.tmp."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:122
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:180
msgid ""
-"Copying of the temporary G-code has finished but the exported code couldn't "
-"be opened during copy check. The output G-code is at %1%.tmp."
+"Copying of the temporary G-code has finished but the exported code couldn't be "
+"opened during copy check. The output G-code is at %1%.tmp."
msgstr ""
-"A cópia do código G temporário foi concluída, mas o código exportado não "
-"pôde ser aberto durante a verificação de cópia. O código G de saída está em "
-"%1%.tmp."
+"A cópia do código G temporário foi concluída, mas o código exportado não pôde "
+"ser aberto durante a verificação de cópia. O código G de saída está em %1%.tmp."
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:129
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:479
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:187
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:536
msgid "Running post-processing scripts"
msgstr "Aplicando scripts de pós-processamento"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:131
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:189
msgid "G-code file exported to %1%"
msgstr "Arquivo G-code exportado para %1%"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:135
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:185
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:194
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:243
msgid "Slicing complete"
msgstr "Fatiamento completo"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:181
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:238
msgid "Masked SLA file exported to %1%"
msgstr "Arquivo SLA mascarado exportado para %1%"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:223
-#, c-format
-msgid ""
-"%s has encountered an error. It was likely caused by running out of memory. "
-"If you are sure you have enough RAM on your system, this may also be a bug "
-"and we would be glad if you reported it."
-msgstr ""
-"%s encontrou um erro. Provavelmente foi causado por ficar sem memória. Se "
-"você tem certeza que você tem RAM suficiente em seu sistema, isso também "
-"pode ser um bug e nós estaríamos contentes se você relatou."
-
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:481
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:539
msgid "Copying of the temporary G-code to the output G-code failed"
msgstr "A cópia do G-código provisório G-código falhou na saída"
-#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:506
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:562
msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue"
msgstr "Agendando upload para ` %1%` . Veja a aba -> Print Host Upload Queue"
-#: src/slic3r/GUI/BedShapeDialog.cpp:66 src/slic3r/GUI/GUI_ObjectList.cpp:2060
-msgid "Shape"
-msgstr "Forma"
-
-#: src/slic3r/GUI/BedShapeDialog.cpp:73
-msgid "Rectangular"
-msgstr "Retangular"
-
-#: src/slic3r/GUI/BedShapeDialog.cpp:77
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:232 src/slic3r/GUI/Plater.cpp:160
-#: src/slic3r/GUI/Tab.cpp:2326
+#: src/slic3r/GUI/BedShapeDialog.cpp:93
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:240 src/slic3r/GUI/Plater.cpp:162
+#: src/slic3r/GUI/Tab.cpp:2536
msgid "Size"
msgstr "Tamanho"
-#: src/slic3r/GUI/BedShapeDialog.cpp:78
-msgid "Size in X and Y of the rectangular plate."
-msgstr "Tamanho no X e Y na mesa retangular."
-
-#: src/slic3r/GUI/BedShapeDialog.cpp:84
+#: src/slic3r/GUI/BedShapeDialog.cpp:94
msgid "Origin"
msgstr "Origem"
-#: src/slic3r/GUI/BedShapeDialog.cpp:85
+#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:771
+msgid "Diameter"
+msgstr "Diâmetro"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:110
+msgid "Size in X and Y of the rectangular plate."
+msgstr "Tamanho no X e Y na mesa retangular."
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:121
msgid ""
"Distance of the 0,0 G-code coordinate from the front left corner of the "
"rectangle."
msgstr ""
-"Distância do ponto 0,0 da coordenada do G-code do canto esquerdo do "
-"retângulo."
-
-#: src/slic3r/GUI/BedShapeDialog.cpp:89
-msgid "Circular"
-msgstr "Circular"
-
-#: src/slic3r/GUI/BedShapeDialog.cpp:92 src/slic3r/GUI/ConfigWizard.cpp:218
-#: src/slic3r/GUI/ConfigWizard.cpp:970 src/slic3r/GUI/ConfigWizard.cpp:984
-#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:87
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:135
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:333
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:94
-#: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:75
-#: src/libslic3r/PrintConfig.cpp:82 src/libslic3r/PrintConfig.cpp:91
-#: src/libslic3r/PrintConfig.cpp:122 src/libslic3r/PrintConfig.cpp:188
-#: src/libslic3r/PrintConfig.cpp:246 src/libslic3r/PrintConfig.cpp:321
-#: src/libslic3r/PrintConfig.cpp:329 src/libslic3r/PrintConfig.cpp:379
-#: src/libslic3r/PrintConfig.cpp:505 src/libslic3r/PrintConfig.cpp:516
-#: src/libslic3r/PrintConfig.cpp:534 src/libslic3r/PrintConfig.cpp:712
-#: src/libslic3r/PrintConfig.cpp:1231 src/libslic3r/PrintConfig.cpp:1292
-#: src/libslic3r/PrintConfig.cpp:1310 src/libslic3r/PrintConfig.cpp:1328
-#: src/libslic3r/PrintConfig.cpp:1384 src/libslic3r/PrintConfig.cpp:1394
-#: src/libslic3r/PrintConfig.cpp:1516 src/libslic3r/PrintConfig.cpp:1524
-#: src/libslic3r/PrintConfig.cpp:1565 src/libslic3r/PrintConfig.cpp:1573
-#: src/libslic3r/PrintConfig.cpp:1583 src/libslic3r/PrintConfig.cpp:1591
-#: src/libslic3r/PrintConfig.cpp:1599 src/libslic3r/PrintConfig.cpp:1682
-#: src/libslic3r/PrintConfig.cpp:1914 src/libslic3r/PrintConfig.cpp:1985
-#: src/libslic3r/PrintConfig.cpp:2019 src/libslic3r/PrintConfig.cpp:2147
-#: src/libslic3r/PrintConfig.cpp:2226 src/libslic3r/PrintConfig.cpp:2233
-#: src/libslic3r/PrintConfig.cpp:2240 src/libslic3r/PrintConfig.cpp:2270
-#: src/libslic3r/PrintConfig.cpp:2280 src/libslic3r/PrintConfig.cpp:2290
-#: src/libslic3r/PrintConfig.cpp:2450 src/libslic3r/PrintConfig.cpp:2484
-#: src/libslic3r/PrintConfig.cpp:2623 src/libslic3r/PrintConfig.cpp:2632
-#: src/libslic3r/PrintConfig.cpp:2641 src/libslic3r/PrintConfig.cpp:2651
-#: src/libslic3r/PrintConfig.cpp:2705 src/libslic3r/PrintConfig.cpp:2715
-#: src/libslic3r/PrintConfig.cpp:2727 src/libslic3r/PrintConfig.cpp:2747
-#: src/libslic3r/PrintConfig.cpp:2757 src/libslic3r/PrintConfig.cpp:2767
-#: src/libslic3r/PrintConfig.cpp:2785 src/libslic3r/PrintConfig.cpp:2800
-#: src/libslic3r/PrintConfig.cpp:2814 src/libslic3r/PrintConfig.cpp:2825
-#: src/libslic3r/PrintConfig.cpp:2838 src/libslic3r/PrintConfig.cpp:2883
-#: src/libslic3r/PrintConfig.cpp:2893 src/libslic3r/PrintConfig.cpp:2902
-#: src/libslic3r/PrintConfig.cpp:2912 src/libslic3r/PrintConfig.cpp:2928
-#: src/libslic3r/PrintConfig.cpp:2952
+"Distância do ponto 0,0 da coordenada do G-code do canto esquerdo do retângulo."
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:129 src/slic3r/GUI/ConfigWizard.cpp:242
+#: src/slic3r/GUI/ConfigWizard.cpp:1368 src/slic3r/GUI/ConfigWizard.cpp:1382
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:88
+#: src/slic3r/GUI/GCodeViewer.cpp:2337 src/slic3r/GUI/GCodeViewer.cpp:2343
+#: src/slic3r/GUI/GCodeViewer.cpp:2351 src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:179
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:145
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:96
+#: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:77
+#: src/libslic3r/PrintConfig.cpp:84 src/libslic3r/PrintConfig.cpp:95
+#: src/libslic3r/PrintConfig.cpp:135 src/libslic3r/PrintConfig.cpp:244
+#: src/libslic3r/PrintConfig.cpp:302 src/libslic3r/PrintConfig.cpp:377
+#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:435
+#: src/libslic3r/PrintConfig.cpp:565 src/libslic3r/PrintConfig.cpp:576
+#: src/libslic3r/PrintConfig.cpp:594 src/libslic3r/PrintConfig.cpp:774
+#: src/libslic3r/PrintConfig.cpp:1258 src/libslic3r/PrintConfig.cpp:1439
+#: src/libslic3r/PrintConfig.cpp:1500 src/libslic3r/PrintConfig.cpp:1518
+#: src/libslic3r/PrintConfig.cpp:1536 src/libslic3r/PrintConfig.cpp:1594
+#: src/libslic3r/PrintConfig.cpp:1604 src/libslic3r/PrintConfig.cpp:1729
+#: src/libslic3r/PrintConfig.cpp:1737 src/libslic3r/PrintConfig.cpp:1778
+#: src/libslic3r/PrintConfig.cpp:1786 src/libslic3r/PrintConfig.cpp:1796
+#: src/libslic3r/PrintConfig.cpp:1804 src/libslic3r/PrintConfig.cpp:1812
+#: src/libslic3r/PrintConfig.cpp:1875 src/libslic3r/PrintConfig.cpp:2141
+#: src/libslic3r/PrintConfig.cpp:2212 src/libslic3r/PrintConfig.cpp:2246
+#: src/libslic3r/PrintConfig.cpp:2375 src/libslic3r/PrintConfig.cpp:2454
+#: src/libslic3r/PrintConfig.cpp:2461 src/libslic3r/PrintConfig.cpp:2468
+#: src/libslic3r/PrintConfig.cpp:2498 src/libslic3r/PrintConfig.cpp:2508
+#: src/libslic3r/PrintConfig.cpp:2518 src/libslic3r/PrintConfig.cpp:2678
+#: src/libslic3r/PrintConfig.cpp:2712 src/libslic3r/PrintConfig.cpp:2851
+#: src/libslic3r/PrintConfig.cpp:2860 src/libslic3r/PrintConfig.cpp:2869
+#: src/libslic3r/PrintConfig.cpp:2879 src/libslic3r/PrintConfig.cpp:2944
+#: src/libslic3r/PrintConfig.cpp:2954 src/libslic3r/PrintConfig.cpp:2966
+#: src/libslic3r/PrintConfig.cpp:2986 src/libslic3r/PrintConfig.cpp:2996
+#: src/libslic3r/PrintConfig.cpp:3006 src/libslic3r/PrintConfig.cpp:3024
+#: src/libslic3r/PrintConfig.cpp:3039 src/libslic3r/PrintConfig.cpp:3053
+#: src/libslic3r/PrintConfig.cpp:3064 src/libslic3r/PrintConfig.cpp:3077
+#: src/libslic3r/PrintConfig.cpp:3122 src/libslic3r/PrintConfig.cpp:3132
+#: src/libslic3r/PrintConfig.cpp:3141 src/libslic3r/PrintConfig.cpp:3151
+#: src/libslic3r/PrintConfig.cpp:3167 src/libslic3r/PrintConfig.cpp:3191
msgid "mm"
msgstr "mm"
-#: src/slic3r/GUI/BedShapeDialog.cpp:93 src/libslic3r/PrintConfig.cpp:709
-msgid "Diameter"
-msgstr "Diâmetro"
-
-#: src/slic3r/GUI/BedShapeDialog.cpp:94
+#: src/slic3r/GUI/BedShapeDialog.cpp:131
msgid ""
"Diameter of the print bed. It is assumed that origin (0,0) is located in the "
"center."
msgstr ""
-"Diâmetro da mesa de impressão. Se assume que a origem (0,0) seja localizado "
-"no centro."
+"Diâmetro da mesa de impressão. Se assume que a origem (0,0) seja localizado no "
+"centro."
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:141
+msgid "Rectangular"
+msgstr "Retangular"
-#: src/slic3r/GUI/BedShapeDialog.cpp:98 src/slic3r/GUI/GUI_Preview.cpp:249
-#: src/libslic3r/ExtrusionEntity.cpp:322
+#: src/slic3r/GUI/BedShapeDialog.cpp:142
+msgid "Circular"
+msgstr "Circular"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:143 src/slic3r/GUI/GUI_Preview.cpp:243
+#: src/libslic3r/ExtrusionEntity.cpp:323 src/libslic3r/ExtrusionEntity.cpp:358
msgid "Custom"
msgstr "Customizado"
-#: src/slic3r/GUI/BedShapeDialog.cpp:102
+#: src/slic3r/GUI/BedShapeDialog.cpp:145
+msgid "Invalid"
+msgstr "Inválido"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:156 src/slic3r/GUI/BedShapeDialog.cpp:222
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2288
+msgid "Shape"
+msgstr "Forma"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:243
msgid "Load shape from STL..."
msgstr "Carregar forma do STL..."
-#: src/slic3r/GUI/BedShapeDialog.cpp:155
+#: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/MainFrame.cpp:1826
msgid "Settings"
-msgstr "Config."
+msgstr "Config"
-#: src/slic3r/GUI/BedShapeDialog.cpp:172
+#: src/slic3r/GUI/BedShapeDialog.cpp:315
msgid "Texture"
msgstr "Textura"
-#: src/slic3r/GUI/BedShapeDialog.cpp:182 src/slic3r/GUI/BedShapeDialog.cpp:261
+#: src/slic3r/GUI/BedShapeDialog.cpp:325 src/slic3r/GUI/BedShapeDialog.cpp:405
msgid "Load..."
msgstr "Carregar..."
-#: src/slic3r/GUI/BedShapeDialog.cpp:190 src/slic3r/GUI/BedShapeDialog.cpp:269
-#: src/slic3r/GUI/Tab.cpp:3126
+#: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/BedShapeDialog.cpp:413
+#: src/slic3r/GUI/Tab.cpp:3484
msgid "Remove"
msgstr "Remover"
-#: src/slic3r/GUI/BedShapeDialog.cpp:223 src/slic3r/GUI/BedShapeDialog.cpp:302
+#: src/slic3r/GUI/BedShapeDialog.cpp:366 src/slic3r/GUI/BedShapeDialog.cpp:446
msgid "Not found:"
msgstr "Não encontrado:"
-#: src/slic3r/GUI/BedShapeDialog.cpp:251
+#: src/slic3r/GUI/BedShapeDialog.cpp:395
msgid "Model"
msgstr "Modelo"
-#: src/slic3r/GUI/BedShapeDialog.cpp:487
+#: src/slic3r/GUI/BedShapeDialog.cpp:563
msgid "Choose an STL file to import bed shape from:"
msgstr "Escolha um arquivo STL para importar o formato da mesa:"
-#: src/slic3r/GUI/BedShapeDialog.cpp:494 src/slic3r/GUI/BedShapeDialog.cpp:543
-#: src/slic3r/GUI/BedShapeDialog.cpp:566
+#: src/slic3r/GUI/BedShapeDialog.cpp:570 src/slic3r/GUI/BedShapeDialog.cpp:619
+#: src/slic3r/GUI/BedShapeDialog.cpp:642
msgid "Invalid file format."
msgstr "Formato de arquivo inválido."
-#: src/slic3r/GUI/BedShapeDialog.cpp:505
+#: src/slic3r/GUI/BedShapeDialog.cpp:581
msgid "Error! Invalid model"
msgstr "Erro! Modelo inválido"
-#: src/slic3r/GUI/BedShapeDialog.cpp:513
+#: src/slic3r/GUI/BedShapeDialog.cpp:589
msgid "The selected file contains no geometry."
msgstr "O arquivo selecionado não contém geometria."
-#: src/slic3r/GUI/BedShapeDialog.cpp:517
-msgid ""
-"The selected file contains several disjoint areas. This is not supported."
+#: src/slic3r/GUI/BedShapeDialog.cpp:593
+msgid "The selected file contains several disjoint areas. This is not supported."
msgstr "O arquivo selecionado contém áreas não juntas. Isso não é suportado."
-#: src/slic3r/GUI/BedShapeDialog.cpp:532
+#: src/slic3r/GUI/BedShapeDialog.cpp:608
msgid "Choose a file to import bed texture from (PNG/SVG):"
msgstr "Escolher um arquivo para importar a textura da mesa (PNG/SVG):"
-#: src/slic3r/GUI/BedShapeDialog.cpp:555
+#: src/slic3r/GUI/BedShapeDialog.cpp:631
msgid "Choose an STL file to import bed model from:"
msgstr "Escolha um arquivo STL para importar o modelo da mesa:"
-#: src/slic3r/GUI/BedShapeDialog.hpp:59 src/slic3r/GUI/ConfigWizard.cpp:929
+#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1327
msgid "Bed Shape"
msgstr "Formato da mesa"
@@ -354,11 +362,9 @@ msgstr "O valor é o mesmo que o valor do sistema"
#: src/slic3r/GUI/ButtonsDescription.cpp:53
msgid ""
-"Value was changed and is not equal to the system value or the last saved "
-"preset"
+"Value was changed and is not equal to the system value or the last saved preset"
msgstr ""
-"O valor foi mudado e não é igual ao valor do sistema ou da última config. "
-"salva"
+"O valor foi mudado e não é igual ao valor do sistema ou da última config. salva"
#: src/slic3r/GUI/ConfigManipulation.cpp:48
msgid ""
@@ -371,8 +377,8 @@ msgstr ""
"A altura da camada será redefinida para 0.01."
#: src/slic3r/GUI/ConfigManipulation.cpp:49
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27 src/slic3r/GUI/Tab.cpp:1048
-#: src/libslic3r/PrintConfig.cpp:71
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1387
+#: src/libslic3r/PrintConfig.cpp:73
msgid "Layer height"
msgstr "Altura da camada"
@@ -386,12 +392,12 @@ msgstr ""
"\n"
"A altura da primeira camada será redefinida para 0.01."
-#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:889
+#: src/slic3r/GUI/ConfigManipulation.cpp:61 src/libslic3r/PrintConfig.cpp:969
msgid "First layer height"
msgstr "Altura da primeira camada"
#: src/slic3r/GUI/ConfigManipulation.cpp:81
-#, no-c-format
+#, c-format
msgid ""
"The Spiral Vase mode requires:\n"
"- one perimeter\n"
@@ -404,7 +410,7 @@ msgstr ""
"O modo Vaso Espiral requer:\n"
"- um perímetro\n"
"- sem camadas sólidas superiores\n"
-"- 0% de densidade de enchimento\n"
+"- 0% fdensidade de enchimento 0\n"
"- nenhum material de suporte\n"
"- habilitar opção Garantir a espessura da casca vertical\n"
"- desativar opção Detectar paredes finas"
@@ -468,256 +474,286 @@ msgstr "Devo ajustar essas configurações para suportes?"
msgid "Support Generator"
msgstr "Gerador de suporte"
-#: src/slic3r/GUI/ConfigManipulation.cpp:208
+#: src/slic3r/GUI/ConfigManipulation.cpp:198
msgid "The %1% infill pattern is not supposed to work at 100%% density."
-msgstr ""
-"O padrão de preenchimento %1% não deve funcionar com 100%% de densidade."
+msgstr "O padrão de preenchimento %1% não deve funcionar com 100%% de densidade."
-#: src/slic3r/GUI/ConfigManipulation.cpp:210
+#: src/slic3r/GUI/ConfigManipulation.cpp:201
msgid "Shall I switch to rectilinear fill pattern?"
msgstr "Devo mudar para padrão de preenchimento retilíneo?"
-#: src/slic3r/GUI/ConfigManipulation.cpp:211
-#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:96
-#: src/slic3r/GUI/GUI_ObjectList.cpp:615 src/slic3r/GUI/Plater.cpp:527
-#: src/slic3r/GUI/Tab.cpp:1090 src/slic3r/GUI/Tab.cpp:1091
-#: src/libslic3r/PrintConfig.cpp:203 src/libslic3r/PrintConfig.cpp:416
-#: src/libslic3r/PrintConfig.cpp:436 src/libslic3r/PrintConfig.cpp:776
-#: src/libslic3r/PrintConfig.cpp:790 src/libslic3r/PrintConfig.cpp:827
-#: src/libslic3r/PrintConfig.cpp:981 src/libslic3r/PrintConfig.cpp:991
-#: src/libslic3r/PrintConfig.cpp:1009 src/libslic3r/PrintConfig.cpp:1028
-#: src/libslic3r/PrintConfig.cpp:1047 src/libslic3r/PrintConfig.cpp:1728
-#: src/libslic3r/PrintConfig.cpp:1745
+#: src/slic3r/GUI/ConfigManipulation.cpp:202 src/slic3r/GUI/GUI_ObjectList.cpp:35
+#: src/slic3r/GUI/GUI_ObjectList.cpp:93 src/slic3r/GUI/GUI_ObjectList.cpp:668
+#: src/slic3r/GUI/Plater.cpp:389 src/slic3r/GUI/Tab.cpp:1432
+#: src/slic3r/GUI/Tab.cpp:1434 src/libslic3r/PrintConfig.cpp:259
+#: src/libslic3r/PrintConfig.cpp:472 src/libslic3r/PrintConfig.cpp:496
+#: src/libslic3r/PrintConfig.cpp:848 src/libslic3r/PrintConfig.cpp:862
+#: src/libslic3r/PrintConfig.cpp:899 src/libslic3r/PrintConfig.cpp:1076
+#: src/libslic3r/PrintConfig.cpp:1086 src/libslic3r/PrintConfig.cpp:1153
+#: src/libslic3r/PrintConfig.cpp:1172 src/libslic3r/PrintConfig.cpp:1191
+#: src/libslic3r/PrintConfig.cpp:1928 src/libslic3r/PrintConfig.cpp:1945
msgid "Infill"
msgstr "Preenchimento"
-#: src/slic3r/GUI/ConfigManipulation.cpp:317
+#: src/slic3r/GUI/ConfigManipulation.cpp:320
msgid "Head penetration should not be greater than the head width."
msgstr "A penetração da cabeça não deve ser maior do que a largura da cabeça."
-#: src/slic3r/GUI/ConfigManipulation.cpp:319
+#: src/slic3r/GUI/ConfigManipulation.cpp:322
msgid "Invalid Head penetration"
msgstr "Penetração inválida da cabeça"
-#: src/slic3r/GUI/ConfigManipulation.cpp:330
+#: src/slic3r/GUI/ConfigManipulation.cpp:333
msgid "Pinhead diameter should be smaller than the pillar diameter."
-msgstr ""
-"O diâmetro da cabeça de pino deve ser menor do que o diâmetro do pilar."
+msgstr "O diâmetro da cabeça de pino deve ser menor do que o diâmetro do pilar."
-#: src/slic3r/GUI/ConfigManipulation.cpp:332
+#: src/slic3r/GUI/ConfigManipulation.cpp:335
msgid "Invalid pinhead diameter"
msgstr "Diâmetro inválido da cabeça de pino"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:18
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19
msgid "Upgrade"
msgstr "Atualização"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:20
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21
msgid "Downgrade"
msgstr "Desatualização"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:22
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23
msgid "Before roll back"
msgstr "Antes de reverter"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:24
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:143
msgid "User"
msgstr "Usuário"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:27
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28 src/slic3r/GUI/GUI_Preview.cpp:229
+#: src/libslic3r/ExtrusionEntity.cpp:309
msgid "Unknown"
msgstr "Desconhecido"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:43
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:44
msgid "Active"
msgstr "Ativar"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:50
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51
msgid "PrusaSlicer version"
msgstr "Versão do PrusaSlicer"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51 src/slic3r/GUI/Preset.cpp:1533
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 src/libslic3r/Preset.cpp:1298
msgid "print"
msgstr "impressão"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:52
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:56
msgid "filaments"
msgstr "filamentos"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:53 src/slic3r/GUI/Preset.cpp:1537
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 src/libslic3r/Preset.cpp:1300
+msgid "SLA print"
+msgstr "Impressão de SLA"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 src/slic3r/GUI/Plater.cpp:696
+#: src/libslic3r/Preset.cpp:1301
+msgid "SLA material"
+msgstr "Material de SLA"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:62 src/libslic3r/Preset.cpp:1302
msgid "printer"
msgstr "impressora"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57 src/slic3r/GUI/Tab.cpp:970
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:66 src/slic3r/GUI/Tab.cpp:1304
msgid "vendor"
msgstr "fornecedor"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:57
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:66
msgid "version"
msgstr "versão"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:58
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:67
msgid "min PrusaSlicer version"
msgstr "versão mínima do PrusaSlicer"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69
msgid "max PrusaSlicer version"
msgstr "versão máxima do PrusaSlicer"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:72
msgid "model"
msgstr "modelo"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:63
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:72
msgid "variants"
msgstr "variantes"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:75
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:84
#, c-format
msgid "Incompatible with this %s"
msgstr "Incompatível com isso %s"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:78
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:87
msgid "Activate"
msgstr "Ativar"
-#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:104
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:113
msgid "Configuration Snapshots"
msgstr "Config. das versões"
-#: src/slic3r/GUI/ConfigWizard.cpp:218
+#: src/slic3r/GUI/ConfigWizard.cpp:242
msgid "nozzle"
msgstr "bico de impressão"
-#: src/slic3r/GUI/ConfigWizard.cpp:222
+#: src/slic3r/GUI/ConfigWizard.cpp:246
msgid "Alternate nozzles:"
msgstr "Alternar bicos:"
-#: src/slic3r/GUI/ConfigWizard.cpp:289
+#: src/slic3r/GUI/ConfigWizard.cpp:310
msgid "All standard"
msgstr "Todos padrão"
-#: src/slic3r/GUI/ConfigWizard.cpp:289
+#: src/slic3r/GUI/ConfigWizard.cpp:310
msgid "Standard"
msgstr "Todos padrão"
-#: src/slic3r/GUI/ConfigWizard.cpp:290 src/slic3r/GUI/ConfigWizard.cpp:573
-#: src/slic3r/GUI/Tab.cpp:3176
+#: src/slic3r/GUI/ConfigWizard.cpp:311 src/slic3r/GUI/ConfigWizard.cpp:605
+#: src/slic3r/GUI/Tab.cpp:3565 src/slic3r/GUI/UnsavedChangesDialog.cpp:933
msgid "All"
msgstr "Todos"
-#: src/slic3r/GUI/ConfigWizard.cpp:291 src/slic3r/GUI/ConfigWizard.cpp:574
-#: src/slic3r/GUI/Plater.cpp:499 src/slic3r/GUI/Plater.cpp:639
-#: src/libslic3r/ExtrusionEntity.cpp:309
+#: src/slic3r/GUI/ConfigWizard.cpp:312 src/slic3r/GUI/ConfigWizard.cpp:606
+#: src/slic3r/GUI/DoubleSlider.cpp:1859 src/slic3r/GUI/Plater.cpp:361
+#: src/slic3r/GUI/Plater.cpp:504
msgid "None"
msgstr "Nenhum"
-#: src/slic3r/GUI/ConfigWizard.cpp:427
+#: src/slic3r/GUI/ConfigWizard.cpp:452
#, c-format
msgid "Welcome to the %s Configuration Assistant"
-msgstr "Bem-vindo ao %s Assistente de config."
+msgstr "Bem-vindo ao %s Assistente de config"
-#: src/slic3r/GUI/ConfigWizard.cpp:429
+#: src/slic3r/GUI/ConfigWizard.cpp:454
#, c-format
msgid "Welcome to the %s Configuration Wizard"
-msgstr "Bem-vindo ao %s Assistente de config."
+msgstr "Bem-vindo ao %s Assistente de config"
-#: src/slic3r/GUI/ConfigWizard.cpp:431
+#: src/slic3r/GUI/ConfigWizard.cpp:456
msgid "Welcome"
msgstr "Bem-vindo(a)"
-#: src/slic3r/GUI/ConfigWizard.cpp:433
+#: src/slic3r/GUI/ConfigWizard.cpp:458
#, c-format
msgid ""
-"Hello, welcome to %s! This %s helps you with the initial configuration; just "
-"a few settings and you will be ready to print."
+"Hello, welcome to %s! This %s helps you with the initial configuration; just a "
+"few settings and you will be ready to print."
msgstr ""
-"Olá, bem-vindo ao %s! Isso %s te ajuda com a config. inicial; com apenas "
+"Olá, bem-vindo ao %s! Isso %s te ajuda com a config. inicial; com apenas "
"algumas config. e você estará pronto para imprimir."
-#: src/slic3r/GUI/ConfigWizard.cpp:438
-msgid ""
-"Remove user profiles - install from scratch (a snapshot will be taken "
-"beforehand)"
+#: src/slic3r/GUI/ConfigWizard.cpp:463
+msgid "Remove user profiles (a snapshot will be taken beforehand)"
msgstr ""
"Remover perfis de usuário - instalar do zero (uma snapshot será salva antes)"
-#: src/slic3r/GUI/ConfigWizard.cpp:481
+#: src/slic3r/GUI/ConfigWizard.cpp:506
#, c-format
msgid "%s Family"
msgstr "%s Família"
-#: src/slic3r/GUI/ConfigWizard.cpp:565
+#: src/slic3r/GUI/ConfigWizard.cpp:594
+msgid "Printer:"
+msgstr "Impressora:"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:596
msgid "Vendor:"
msgstr "Fornecedor:"
-#: src/slic3r/GUI/ConfigWizard.cpp:566
+#: src/slic3r/GUI/ConfigWizard.cpp:597
msgid "Profile:"
msgstr "Perfil:"
-#: src/slic3r/GUI/ConfigWizard.cpp:603 src/slic3r/GUI/ConfigWizard.cpp:631
+#: src/slic3r/GUI/ConfigWizard.cpp:669 src/slic3r/GUI/ConfigWizard.cpp:819
+#: src/slic3r/GUI/ConfigWizard.cpp:880 src/slic3r/GUI/ConfigWizard.cpp:1017
msgid "(All)"
msgstr "(Todos)"
-#: src/slic3r/GUI/ConfigWizard.cpp:732
+#: src/slic3r/GUI/ConfigWizard.cpp:698
+msgid ""
+"Filaments marked with <b>*</b> are <b>not</b> compatible with some installed "
+"printers."
+msgstr ""
+"Filamentos marcados com <b>*</b> são <b>incompatíveis</b> com algumas "
+"impressoras instaladas."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:701
+msgid "All installed printers are compatible with the selected filament."
+msgstr ""
+"Todas as impressoras instaladas são compatíveis com o filamento selecionado."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:721
+msgid ""
+"Only the following installed printers are compatible with the selected "
+"filament:"
+msgstr ""
+"Somente as seguintes impressoras instaladas são compatíveis com o filamento "
+"selecionado:"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1107
msgid "Custom Printer Setup"
msgstr "Config. da impressora customizada"
-#: src/slic3r/GUI/ConfigWizard.cpp:732
+#: src/slic3r/GUI/ConfigWizard.cpp:1107
msgid "Custom Printer"
msgstr "Impressora customizada"
-#: src/slic3r/GUI/ConfigWizard.cpp:734
+#: src/slic3r/GUI/ConfigWizard.cpp:1109
msgid "Define a custom printer profile"
msgstr "Definir uma config. para a impressora customizada"
-#: src/slic3r/GUI/ConfigWizard.cpp:736
+#: src/slic3r/GUI/ConfigWizard.cpp:1111
msgid "Custom profile name:"
msgstr "Nome customizado da config.:"
-#: src/slic3r/GUI/ConfigWizard.cpp:761
+#: src/slic3r/GUI/ConfigWizard.cpp:1136
msgid "Automatic updates"
msgstr "Atualizações automáticas"
-#: src/slic3r/GUI/ConfigWizard.cpp:761
+#: src/slic3r/GUI/ConfigWizard.cpp:1136
msgid "Updates"
msgstr "Atualizações"
-#: src/slic3r/GUI/ConfigWizard.cpp:769 src/slic3r/GUI/Preferences.cpp:64
+#: src/slic3r/GUI/ConfigWizard.cpp:1144 src/slic3r/GUI/Preferences.cpp:94
msgid "Check for application updates"
msgstr "Verificar atualizações nas aplicações"
-#: src/slic3r/GUI/ConfigWizard.cpp:773
+#: src/slic3r/GUI/ConfigWizard.cpp:1148
#, c-format
msgid ""
-"If enabled, %s checks for new application versions online. When a new "
-"version becomes available, a notification is displayed at the next "
-"application startup (never during program usage). This is only a "
-"notification mechanisms, no automatic installation is done."
+"If enabled, %s checks for new application versions online. When a new version "
+"becomes available, a notification is displayed at the next application startup "
+"(never during program usage). This is only a notification mechanisms, no "
+"automatic installation is done."
msgstr ""
"Se ativada, %s verifica se há novas versões do aplicativo online. Quando uma "
"nova versão se torna disponível, uma notificação é exibida na próxima "
"inicialização do aplicativo (nunca durante o uso do programa). Este é apenas "
"um mecanismos de notificação, nenhuma instalação automática é feita."
-#: src/slic3r/GUI/ConfigWizard.cpp:779 src/slic3r/GUI/Preferences.cpp:80
+#: src/slic3r/GUI/ConfigWizard.cpp:1154 src/slic3r/GUI/Preferences.cpp:129
msgid "Update built-in Presets automatically"
msgstr "Atualizar predefinições incorporadas automaticamente"
-#: src/slic3r/GUI/ConfigWizard.cpp:783
+#: src/slic3r/GUI/ConfigWizard.cpp:1158
#, c-format
msgid ""
-"If enabled, %s downloads updates of built-in system presets in the "
-"background.These updates are downloaded into a separate temporary location."
-"When a new preset version becomes available it is offered at application "
-"startup."
+"If enabled, %s downloads updates of built-in system presets in the background."
+"These updates are downloaded into a separate temporary location.When a new "
+"preset version becomes available it is offered at application startup."
msgstr ""
-"Se ativada, %s baixa atualizações de predefinições de sistema incorporadas "
-"em segundo plano. Essas atualizações são baixadas em um local temporário "
+"Se ativada, %s baixa atualizações de predefinições de sistema incorporadas em "
+"segundo plano. Essas atualizações são baixadas em um local temporário "
"separado. Quando uma nova versão predefinida se torna disponível, ela é "
"oferecida na inicialização do aplicativo."
-#: src/slic3r/GUI/ConfigWizard.cpp:786
+#: src/slic3r/GUI/ConfigWizard.cpp:1161
msgid ""
"Updates are never applied without user's consent and never overwrite user's "
"customized settings."
@@ -725,49 +761,60 @@ msgstr ""
"Atualizações nunca são aplicadas sem a permissão do usuário e nunca sobre "
"escrevem as config. do usuário."
-#: src/slic3r/GUI/ConfigWizard.cpp:791
+#: src/slic3r/GUI/ConfigWizard.cpp:1166
msgid ""
-"Additionally a backup snapshot of the whole configuration is created before "
-"an update is applied."
+"Additionally a backup snapshot of the whole configuration is created before an "
+"update is applied."
msgstr ""
"Além disso, uma captura de backup de toda a config. é criado antes que uma "
"atualização seja aplicada."
-#: src/slic3r/GUI/ConfigWizard.cpp:798 src/slic3r/GUI/GUI_ObjectList.cpp:1665
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3957 src/slic3r/GUI/Plater.cpp:3227
-#: src/slic3r/GUI/Plater.cpp:3936 src/slic3r/GUI/Plater.cpp:3965
+#: src/slic3r/GUI/ConfigWizard.cpp:1173 src/slic3r/GUI/GUI_ObjectList.cpp:1825
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4567 src/slic3r/GUI/Plater.cpp:3116
+#: src/slic3r/GUI/Plater.cpp:4001 src/slic3r/GUI/Plater.cpp:4032
msgid "Reload from disk"
msgstr "Recarregar a partir do disco"
-#: src/slic3r/GUI/ConfigWizard.cpp:801
-msgid ""
-"Export full pathnames of models and parts sources into 3mf and amf files"
+#: src/slic3r/GUI/ConfigWizard.cpp:1176
+msgid "Export full pathnames of models and parts sources into 3mf and amf files"
msgstr ""
"Exportar nomes completos de modelos e fontes de peças para arquivos 3mf e amf"
-#: src/slic3r/GUI/ConfigWizard.cpp:805
+#: src/slic3r/GUI/ConfigWizard.cpp:1180
msgid ""
-"If enabled, allows the Reload from disk command to automatically find and "
-"load the files when invoked.\n"
+"If enabled, allows the Reload from disk command to automatically find and load "
+"the files when invoked.\n"
"If not enabled, the Reload from disk command will ask to select each file "
"using an open file dialog."
msgstr ""
"Se ativado, permite que o comando Recarregar a partir do disco encontre e "
"carregue automaticamente os arquivos quando invocado.\n"
-"Se não estiver habilitado, o comando Recarregar a partir do disco pedirá "
-"para selecionar cada arquivo usando uma caixa de diálogo de arquivo aberto."
+"Se não estiver habilitado, o comando Recarregar a partir do disco pedirá para "
+"selecionar cada arquivo usando uma caixa de diálogo de arquivo aberto."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1190
+msgid "Files association"
+msgstr "Associação de arquivos"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1192 src/slic3r/GUI/Preferences.cpp:112
+msgid "Associate .3mf files to PrusaSlicer"
+msgstr "Associar arquivos .3mf para PrusaSlicer"
-#: src/slic3r/GUI/ConfigWizard.cpp:813
+#: src/slic3r/GUI/ConfigWizard.cpp:1193 src/slic3r/GUI/Preferences.cpp:119
+msgid "Associate .stl files to PrusaSlicer"
+msgstr "Associar arquivos .stl para PrusaSlicer"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1204
msgid "View mode"
msgstr "Modo de visualização"
-#: src/slic3r/GUI/ConfigWizard.cpp:815
+#: src/slic3r/GUI/ConfigWizard.cpp:1206
msgid ""
"PrusaSlicer's user interfaces comes in three variants:\n"
"Simple, Advanced, and Expert.\n"
"The Simple mode shows only the most frequently used settings relevant for "
-"regular 3D printing. The other two offer progressively more sophisticated "
-"fine-tuning, they are suitable for advanced and expert users, respectively."
+"regular 3D printing. The other two offer progressively more sophisticated fine-"
+"tuning, they are suitable for advanced and expert users, respectively."
msgstr ""
"As interfaces de usuário do PrusaSlicer vêm em três variantes:\n"
"Simples, Avançado e Especialista.\n"
@@ -776,104 +823,114 @@ msgstr ""
"sofisticados, são adequados para usuários avançados e experientes, "
"respectivamente."
-#: src/slic3r/GUI/ConfigWizard.cpp:820
+#: src/slic3r/GUI/ConfigWizard.cpp:1211
msgid "Simple mode"
msgstr "Modo simples"
-#: src/slic3r/GUI/ConfigWizard.cpp:821
+#: src/slic3r/GUI/ConfigWizard.cpp:1212
msgid "Advanced mode"
msgstr "Modo avançado"
-#: src/slic3r/GUI/ConfigWizard.cpp:822
+#: src/slic3r/GUI/ConfigWizard.cpp:1213
msgid "Expert mode"
msgstr "Modo especialista"
-#: src/slic3r/GUI/ConfigWizard.cpp:856
+#: src/slic3r/GUI/ConfigWizard.cpp:1219
+msgid "The size of the object can be specified in inches"
+msgstr "O tamanho do objeto pode ser especificado em polegadas"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1220
+msgid "Use inches"
+msgstr "Usar polegadas"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1254
msgid "Other Vendors"
msgstr "Outros fornecedores"
-#: src/slic3r/GUI/ConfigWizard.cpp:860
+#: src/slic3r/GUI/ConfigWizard.cpp:1258
#, c-format
msgid "Pick another vendor supported by %s"
msgstr "Escolha outro fornecedor suportado por %s"
-#: src/slic3r/GUI/ConfigWizard.cpp:891
+#: src/slic3r/GUI/ConfigWizard.cpp:1289
msgid "Firmware Type"
msgstr "Tipo de Firmware"
-#: src/slic3r/GUI/ConfigWizard.cpp:891 src/slic3r/GUI/Tab.cpp:1949
+#: src/slic3r/GUI/ConfigWizard.cpp:1289 src/slic3r/GUI/Tab.cpp:2172
msgid "Firmware"
msgstr "Firmware"
-#: src/slic3r/GUI/ConfigWizard.cpp:895
+#: src/slic3r/GUI/ConfigWizard.cpp:1293
msgid "Choose the type of firmware used by your printer."
msgstr "Escolha o tipo de firmware utilizado na sua impressora."
-#: src/slic3r/GUI/ConfigWizard.cpp:929
+#: src/slic3r/GUI/ConfigWizard.cpp:1327
msgid "Bed Shape and Size"
msgstr "Forma e tamanho da mesa"
-#: src/slic3r/GUI/ConfigWizard.cpp:932
+#: src/slic3r/GUI/ConfigWizard.cpp:1330
msgid "Set the shape of your printer's bed."
msgstr "Insira o formato da mesa de impressão."
-#: src/slic3r/GUI/ConfigWizard.cpp:952
+#: src/slic3r/GUI/ConfigWizard.cpp:1350
msgid "Filament and Nozzle Diameters"
msgstr "Diâmetro do bico e do filamento"
-#: src/slic3r/GUI/ConfigWizard.cpp:952
+#: src/slic3r/GUI/ConfigWizard.cpp:1350
msgid "Print Diameters"
msgstr "Diâmetros de impressão"
-#: src/slic3r/GUI/ConfigWizard.cpp:966
+#: src/slic3r/GUI/ConfigWizard.cpp:1364
msgid "Enter the diameter of your printer's hot end nozzle."
msgstr "Insira o diâmetro do bico de impressão."
-#: src/slic3r/GUI/ConfigWizard.cpp:969
+#: src/slic3r/GUI/ConfigWizard.cpp:1367
msgid "Nozzle Diameter:"
msgstr "Diâmetro do bico:"
-#: src/slic3r/GUI/ConfigWizard.cpp:979
+#: src/slic3r/GUI/ConfigWizard.cpp:1377
msgid "Enter the diameter of your filament."
msgstr "Coloque o diâmetro do seu filamento."
-#: src/slic3r/GUI/ConfigWizard.cpp:980
+#: src/slic3r/GUI/ConfigWizard.cpp:1378
msgid ""
"Good precision is required, so use a caliper and do multiple measurements "
"along the filament, then compute the average."
msgstr ""
-"É necessário uma boa precisão, utilize um paquímetro e realize várias "
-"medições ao longo do filamento, faça uma média."
+"É necessário uma boa precisão, utilize um paquímetro e realize várias medições "
+"ao longo do filamento, faça uma média."
-#: src/slic3r/GUI/ConfigWizard.cpp:983
+#: src/slic3r/GUI/ConfigWizard.cpp:1381
msgid "Filament Diameter:"
msgstr "Diâmetro do filamento:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1017
-msgid "Extruder and Bed Temperatures"
+#: src/slic3r/GUI/ConfigWizard.cpp:1415
+msgid "Nozzle and Bed Temperatures"
msgstr "Temperaturas da mesa e da extrusora"
-#: src/slic3r/GUI/ConfigWizard.cpp:1017
+#: src/slic3r/GUI/ConfigWizard.cpp:1415
msgid "Temperatures"
msgstr "Temperaturas"
-#: src/slic3r/GUI/ConfigWizard.cpp:1033
+#: src/slic3r/GUI/ConfigWizard.cpp:1431
msgid "Enter the temperature needed for extruding your filament."
msgstr "Coloque a temperatura necessária para extrusar seu filamento."
-#: src/slic3r/GUI/ConfigWizard.cpp:1034
+#: src/slic3r/GUI/ConfigWizard.cpp:1432
msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS."
msgstr "A regra de ouro é 160 à 230°C para PLA, e 215 à 250°C para ABS."
-#: src/slic3r/GUI/ConfigWizard.cpp:1037
+#: src/slic3r/GUI/ConfigWizard.cpp:1435
msgid "Extrusion Temperature:"
msgstr "Temperatura de extrusão:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1038 src/slic3r/GUI/ConfigWizard.cpp:1052
+#: src/slic3r/GUI/ConfigWizard.cpp:1436 src/slic3r/GUI/ConfigWizard.cpp:1450
+#: src/libslic3r/PrintConfig.cpp:202 src/libslic3r/PrintConfig.cpp:950
+#: src/libslic3r/PrintConfig.cpp:994 src/libslic3r/PrintConfig.cpp:2294
msgid "°C"
msgstr "°C"
-#: src/slic3r/GUI/ConfigWizard.cpp:1047
+#: src/slic3r/GUI/ConfigWizard.cpp:1445
msgid ""
"Enter the bed temperature needed for getting your filament to stick to your "
"heated bed."
@@ -881,156 +938,166 @@ msgstr ""
"Coloque a temperatura da mesa necessária para fazer com que seu filamento "
"grude na mesa."
-#: src/slic3r/GUI/ConfigWizard.cpp:1048
+#: src/slic3r/GUI/ConfigWizard.cpp:1446
msgid ""
-"A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have "
-"no heated bed."
+"A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have no "
+"heated bed."
msgstr ""
"A regra de ouro é 60°C para PLA, e 110°C para ABS. Deixe em zero se não há "
"mesa aquecida."
-#: src/slic3r/GUI/ConfigWizard.cpp:1051
+#: src/slic3r/GUI/ConfigWizard.cpp:1449
msgid "Bed Temperature:"
msgstr "Temperatura da mesa:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2013
+#: src/slic3r/GUI/ConfigWizard.cpp:1909 src/slic3r/GUI/ConfigWizard.cpp:2582
msgid "Filaments"
msgstr "Filamentos"
-#: src/slic3r/GUI/ConfigWizard.cpp:1471 src/slic3r/GUI/ConfigWizard.cpp:2015
+#: src/slic3r/GUI/ConfigWizard.cpp:1909 src/slic3r/GUI/ConfigWizard.cpp:2584
msgid "SLA Materials"
msgstr "Materiais"
-#: src/slic3r/GUI/ConfigWizard.cpp:1525
+#: src/slic3r/GUI/ConfigWizard.cpp:1963
msgid "FFF Technology Printers"
msgstr "Impressoras de tecnologia Prusa FFF"
-#: src/slic3r/GUI/ConfigWizard.cpp:1530
+#: src/slic3r/GUI/ConfigWizard.cpp:1968
msgid "SLA Technology Printers"
msgstr "Impressoras de tecnologia SLA"
-#: src/slic3r/GUI/ConfigWizard.cpp:1751 src/slic3r/GUI/DoubleSlider.cpp:1905
-#: src/slic3r/GUI/DoubleSlider.cpp:1926 src/slic3r/GUI/GUI.cpp:246
+#: src/slic3r/GUI/ConfigWizard.cpp:2274 src/slic3r/GUI/DoubleSlider.cpp:2245
+#: src/slic3r/GUI/DoubleSlider.cpp:2265 src/slic3r/GUI/GUI.cpp:244
msgid "Notice"
msgstr "Aviso"
-#: src/slic3r/GUI/ConfigWizard.cpp:1760
-msgid "You have to select at least one filament for selected printers"
-msgstr ""
-"Você tem que selecionar pelo menos um filamento para impressoras selecionadas"
+#: src/slic3r/GUI/ConfigWizard.cpp:2295
+msgid "The following FFF printer models have no filament selected:"
+msgstr "Os seguintes caracteres não são permitidos:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1761
-msgid "Do you want to automatic select default filaments?"
+#: src/slic3r/GUI/ConfigWizard.cpp:2299
+msgid "Do you want to select default filaments for these FFF printer models?"
msgstr "Deseja selecionar filamentos padrão automáticos?"
-#: src/slic3r/GUI/ConfigWizard.cpp:1771
-msgid "You have to select at least one material for selected printers"
-msgstr ""
-"Você tem que selecionar pelo menos um material para impressoras selecionadas"
+#: src/slic3r/GUI/ConfigWizard.cpp:2313
+msgid "The following SLA printer models have no materials selected:"
+msgstr "Os seguintes caracteres não são permitidos:"
-#: src/slic3r/GUI/ConfigWizard.cpp:1772
-msgid "Do you want to automatic select default materials?"
+#: src/slic3r/GUI/ConfigWizard.cpp:2317
+msgid "Do you want to select default SLA materials for these printer models?"
msgstr "Deseja selecionar automaticamente materiais padrão?"
-#: src/slic3r/GUI/ConfigWizard.cpp:1976
+#: src/slic3r/GUI/ConfigWizard.cpp:2545
msgid "Select all standard printers"
msgstr "Selecione todas as impressoras padrão"
-#: src/slic3r/GUI/ConfigWizard.cpp:1979
+#: src/slic3r/GUI/ConfigWizard.cpp:2548
msgid "< &Back"
msgstr "< &Voltar"
-#: src/slic3r/GUI/ConfigWizard.cpp:1980
+#: src/slic3r/GUI/ConfigWizard.cpp:2549
msgid "&Next >"
msgstr "&Próximo >"
-#: src/slic3r/GUI/ConfigWizard.cpp:1981
+#: src/slic3r/GUI/ConfigWizard.cpp:2550
msgid "&Finish"
msgstr "&Final"
-#: src/slic3r/GUI/ConfigWizard.cpp:1982 src/slic3r/GUI/FirmwareDialog.cpp:151
+#: src/slic3r/GUI/ConfigWizard.cpp:2551 src/slic3r/GUI/FirmwareDialog.cpp:151
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:248
#: src/slic3r/GUI/ProgressStatusBar.cpp:26
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:656
msgid "Cancel"
msgstr "Cancelar"
-#: src/slic3r/GUI/ConfigWizard.cpp:1995
+#: src/slic3r/GUI/ConfigWizard.cpp:2564
msgid "Prusa FFF Technology Printers"
msgstr "Impressoras de tecnologia Prusa FFF"
-#: src/slic3r/GUI/ConfigWizard.cpp:1998
+#: src/slic3r/GUI/ConfigWizard.cpp:2567
msgid "Prusa MSLA Technology Printers"
msgstr "Impressoras de tecnologia Prusa MSLA"
-#: src/slic3r/GUI/ConfigWizard.cpp:2013
+#: src/slic3r/GUI/ConfigWizard.cpp:2582
msgid "Filament Profiles Selection"
msgstr "Seleção de Perfis de Filamento"
-#: src/slic3r/GUI/ConfigWizard.cpp:2013 src/slic3r/GUI/GUI_ObjectList.cpp:3554
+#: src/slic3r/GUI/ConfigWizard.cpp:2582 src/slic3r/GUI/ConfigWizard.cpp:2584
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4144
msgid "Type:"
msgstr "Tipo:"
-#: src/slic3r/GUI/ConfigWizard.cpp:2015
+#: src/slic3r/GUI/ConfigWizard.cpp:2584
msgid "SLA Material Profiles Selection"
msgstr "Perfil de material SLA padrão"
-#: src/slic3r/GUI/ConfigWizard.cpp:2015
-msgid "Layer height:"
-msgstr "Altura da camada:"
-
-#: src/slic3r/GUI/ConfigWizard.cpp:2109
+#: src/slic3r/GUI/ConfigWizard.cpp:2701
msgid "Configuration Assistant"
-msgstr "Assistente de config."
+msgstr "Assistente de config"
-#: src/slic3r/GUI/ConfigWizard.cpp:2110
+#: src/slic3r/GUI/ConfigWizard.cpp:2702
msgid "Configuration &Assistant"
-msgstr "Assistente &de config."
+msgstr "Assistente &de config"
-#: src/slic3r/GUI/ConfigWizard.cpp:2112
+#: src/slic3r/GUI/ConfigWizard.cpp:2704
msgid "Configuration Wizard"
-msgstr "Assistente de config."
+msgstr "Assistente de config"
-#: src/slic3r/GUI/ConfigWizard.cpp:2113
+#: src/slic3r/GUI/ConfigWizard.cpp:2705
msgid "Configuration &Wizard"
-msgstr "Assistente &de config."
+msgstr "Assistente &de config"
-#: src/slic3r/GUI/DoubleSlider.cpp:79
+#: src/slic3r/GUI/DoubleSlider.cpp:97
msgid "Place bearings in slots and resume printing"
msgstr "Coloque rolamentos em ranhuras e retome a impressão"
-#: src/slic3r/GUI/DoubleSlider.cpp:950
+#: src/slic3r/GUI/DoubleSlider.cpp:1224
msgid "One layer mode"
msgstr "Modo de uma camada"
-#: src/slic3r/GUI/DoubleSlider.cpp:952
+#: src/slic3r/GUI/DoubleSlider.cpp:1226
msgid "Discard all custom changes"
msgstr "Descarte todas as alterações personalizadas"
-#: src/slic3r/GUI/DoubleSlider.cpp:955
+#: src/slic3r/GUI/DoubleSlider.cpp:1230 src/slic3r/GUI/DoubleSlider.cpp:1995
+msgid "Jump to move"
+msgstr "Pule para movimento"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1233
#, c-format
-msgid "Jump to height %s or Set extruder sequence for the entire print"
+msgid ""
+"Jump to height %s\n"
+"Set ruler mode\n"
+"or Set extruder sequence for the entire print"
msgstr ""
-"Pule para altura %s ou Definir seqüência de extrusora para toda a impressão"
+"Pule para altura %s\n"
+"Definir modo régua\n"
+"ou Definir extrusoras sequenciais para toda impressão"
-#: src/slic3r/GUI/DoubleSlider.cpp:957 src/slic3r/GUI/DoubleSlider.cpp:1529
-#: src/slic3r/GUI/DoubleSlider.cpp:1651
-msgid "Jump to height"
-msgstr "Pule para altura"
+#: src/slic3r/GUI/DoubleSlider.cpp:1236
+#, c-format
+msgid ""
+"Jump to height %s\n"
+"or Set ruler mode"
+msgstr ""
+"Pule para altura %s\n"
+"Ou Definir modo régua"
-#: src/slic3r/GUI/DoubleSlider.cpp:960
+#: src/slic3r/GUI/DoubleSlider.cpp:1241
msgid "Edit current color - Right click the colored slider segment"
msgstr ""
-"Editar cor atual - Clique com o botão direito do mouse no segmento de "
-"controle deslizante colorido"
+"Editar cor atual - Clique com o botão direito do mouse no segmento de controle "
+"deslizante colorido"
-#: src/slic3r/GUI/DoubleSlider.cpp:970
+#: src/slic3r/GUI/DoubleSlider.cpp:1251
msgid "Print mode"
msgstr "Modo da impressora"
-#: src/slic3r/GUI/DoubleSlider.cpp:984
+#: src/slic3r/GUI/DoubleSlider.cpp:1265
msgid "Add extruder change - Left click"
msgstr "Adicionar alteração extrusora - Clique à esquerda"
-#: src/slic3r/GUI/DoubleSlider.cpp:986
+#: src/slic3r/GUI/DoubleSlider.cpp:1267
msgid ""
"Add color change - Left click for predefined color or Shift + Left click for "
"custom color selection"
@@ -1038,27 +1105,26 @@ msgstr ""
"Adicionar mudança de cor - Clique à esquerda para cor predefinida ou Shift + "
"Clique à esquerda para seleção personalizada de cores"
-#: src/slic3r/GUI/DoubleSlider.cpp:988
+#: src/slic3r/GUI/DoubleSlider.cpp:1269
msgid "Add color change - Left click"
msgstr "Adicionar mudança de cor - Clique à esquerda"
-#: src/slic3r/GUI/DoubleSlider.cpp:989
+#: src/slic3r/GUI/DoubleSlider.cpp:1270
msgid "or press \"+\" key"
msgstr "ou pressione a tecla \"+\""
-#: src/slic3r/GUI/DoubleSlider.cpp:991
+#: src/slic3r/GUI/DoubleSlider.cpp:1272
msgid "Add another code - Ctrl + Left click"
msgstr "Adicionar outro código - Ctrl + Clique à esquerda"
-#: src/slic3r/GUI/DoubleSlider.cpp:992
+#: src/slic3r/GUI/DoubleSlider.cpp:1273
msgid "Add another code - Right click"
msgstr "Adicionar outro código - Clique com o botão direito"
-#: src/slic3r/GUI/DoubleSlider.cpp:998
+#: src/slic3r/GUI/DoubleSlider.cpp:1279
msgid ""
"The sequential print is on.\n"
-"It's impossible to apply any custom G-code for objects printing "
-"sequentually.\n"
+"It's impossible to apply any custom G-code for objects printing sequentually.\n"
"This code won't be processed during G-code generation."
msgstr ""
"A impressão sequencial está.\n"
@@ -1066,27 +1132,31 @@ msgstr ""
"de objetos.\n"
"Este código não será processado durante a geração de G-code."
-#: src/slic3r/GUI/DoubleSlider.cpp:1005
+#: src/slic3r/GUI/DoubleSlider.cpp:1288
msgid "Color change (\"%1%\")"
msgstr "Mudança de cor (\"%1%\")"
-#: src/slic3r/GUI/DoubleSlider.cpp:1006
+#: src/slic3r/GUI/DoubleSlider.cpp:1289
msgid "Color change (\"%1%\") for Extruder %2%"
msgstr "Mudança de cor (\"%1%\") para Extrusor %2%"
-#: src/slic3r/GUI/DoubleSlider.cpp:1009
+#: src/slic3r/GUI/DoubleSlider.cpp:1291
msgid "Pause print (\"%1%\")"
msgstr "Pausar impressão (\"%1%\")"
-#: src/slic3r/GUI/DoubleSlider.cpp:1011
+#: src/slic3r/GUI/DoubleSlider.cpp:1293
+msgid "Custom template (\"%1%\")"
+msgstr "Modelo customizado (\"%1%\")"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1295
msgid "Extruder (tool) is changed to Extruder \"%1%\""
msgstr "Extrusora (ferramenta) é alterada para Extrusora \"%1%\""
-#: src/slic3r/GUI/DoubleSlider.cpp:1019
+#: src/slic3r/GUI/DoubleSlider.cpp:1302
msgid "Note"
msgstr "Nota"
-#: src/slic3r/GUI/DoubleSlider.cpp:1021
+#: src/slic3r/GUI/DoubleSlider.cpp:1304
msgid ""
"G-code associated to this tick mark is in a conflict with print mode.\n"
"Editing it will cause changes of Slider data."
@@ -1095,17 +1165,17 @@ msgstr ""
"de impressão.\n"
"Editá-lo causará alterações nos dados do Slider."
-#: src/slic3r/GUI/DoubleSlider.cpp:1024
+#: src/slic3r/GUI/DoubleSlider.cpp:1307
msgid ""
-"There is a color change for extruder that won't be used till the end of "
-"print job.\n"
+"There is a color change for extruder that won't be used till the end of print "
+"job.\n"
"This code won't be processed during G-code generation."
msgstr ""
-"Há uma mudança de cor para extrusor que não será usada até o final do "
-"trabalho de impressão.\n"
+"Há uma mudança de cor para extrusor que não será usada até o final do trabalho "
+"de impressão.\n"
"Este código não será processado durante a geração de código G."
-#: src/slic3r/GUI/DoubleSlider.cpp:1027
+#: src/slic3r/GUI/DoubleSlider.cpp:1310
msgid ""
"There is an extruder change set to the same extruder.\n"
"This code won't be processed during G-code generation."
@@ -1113,7 +1183,7 @@ msgstr ""
"Há uma mudança extrusora definida para o mesmo extrusor.\n"
"Este código não será processado durante a geração de código G."
-#: src/slic3r/GUI/DoubleSlider.cpp:1030
+#: src/slic3r/GUI/DoubleSlider.cpp:1313
msgid ""
"There is a color change for extruder that has not been used before.\n"
"Check your settings to avoid redundant color changes."
@@ -1121,161 +1191,199 @@ msgstr ""
"Há uma mudança de cor para extrusor que não foi usada antes.\n"
"Verifique suas configurações para evitar alterações de cor redundantes."
-#: src/slic3r/GUI/DoubleSlider.cpp:1035
+#: src/slic3r/GUI/DoubleSlider.cpp:1318
msgid "Delete tick mark - Left click or press \"-\" key"
msgstr ""
-"Excluir marca de marca de marca - Clique à esquerda ou pressione a tecla \"-"
-"\""
+"Excluir marca de marca de marca - Clique à esquerda ou pressione a tecla \"-\""
-#: src/slic3r/GUI/DoubleSlider.cpp:1037
+#: src/slic3r/GUI/DoubleSlider.cpp:1320
msgid "Edit tick mark - Ctrl + Left click"
msgstr "Editar marca de tique - Ctrl + Clique à esquerda"
-#: src/slic3r/GUI/DoubleSlider.cpp:1038
+#: src/slic3r/GUI/DoubleSlider.cpp:1321
msgid "Edit tick mark - Right click"
msgstr "Editar marca de tique - Clique com o botão direito do mouse"
-#: src/slic3r/GUI/DoubleSlider.cpp:1134 src/slic3r/GUI/DoubleSlider.cpp:1170
-#: src/slic3r/GUI/GLCanvas3D.cpp:977 src/slic3r/GUI/GUI_ObjectList.cpp:1705
-#: src/slic3r/GUI/Tab.cpp:2322 src/libslic3r/GCode/PreviewData.cpp:445
+#: src/slic3r/GUI/DoubleSlider.cpp:1417 src/slic3r/GUI/DoubleSlider.cpp:1451
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1864
#, c-format
msgid "Extruder %d"
msgstr "Extrusora %d"
-#: src/slic3r/GUI/DoubleSlider.cpp:1135 src/slic3r/GUI/GUI_ObjectList.cpp:1706
+#: src/slic3r/GUI/DoubleSlider.cpp:1418 src/slic3r/GUI/GUI_ObjectList.cpp:1865
msgid "active"
msgstr "ativar"
-#: src/slic3r/GUI/DoubleSlider.cpp:1144
+#: src/slic3r/GUI/DoubleSlider.cpp:1427
msgid "Switch code to Change extruder"
msgstr "Mudar código para extrusor de alterar"
-#: src/slic3r/GUI/DoubleSlider.cpp:1144 src/slic3r/GUI/GUI_ObjectList.cpp:1672
+#: src/slic3r/GUI/DoubleSlider.cpp:1427 src/slic3r/GUI/GUI_ObjectList.cpp:1832
msgid "Change extruder"
msgstr "Mudar extrusora"
-#: src/slic3r/GUI/DoubleSlider.cpp:1145
+#: src/slic3r/GUI/DoubleSlider.cpp:1428
msgid "Change extruder (N/A)"
msgstr "Extrusora de alterações (N/A)"
-#: src/slic3r/GUI/DoubleSlider.cpp:1147
+#: src/slic3r/GUI/DoubleSlider.cpp:1430
msgid "Use another extruder"
msgstr "Use outra extrusora"
-#: src/slic3r/GUI/DoubleSlider.cpp:1171
+#: src/slic3r/GUI/DoubleSlider.cpp:1452
msgid "used"
msgstr "usado"
-#: src/slic3r/GUI/DoubleSlider.cpp:1179
+#: src/slic3r/GUI/DoubleSlider.cpp:1460
msgid "Switch code to Color change (%1%) for:"
msgstr "Mudar o código para mudança de cor (%1%) Para:"
-#: src/slic3r/GUI/DoubleSlider.cpp:1180
+#: src/slic3r/GUI/DoubleSlider.cpp:1461
msgid "Add color change (%1%) for:"
msgstr "Add/Excluir mudança de cor (%1%) para:"
-#: src/slic3r/GUI/DoubleSlider.cpp:1477
+#: src/slic3r/GUI/DoubleSlider.cpp:1797
msgid "Add color change"
msgstr "Adicionar mudança de cor"
-#: src/slic3r/GUI/DoubleSlider.cpp:1487
+#: src/slic3r/GUI/DoubleSlider.cpp:1808
msgid "Add pause print"
msgstr "Adicionar impressão de pausa"
-#: src/slic3r/GUI/DoubleSlider.cpp:1490
+#: src/slic3r/GUI/DoubleSlider.cpp:1812
+msgid "Add custom template"
+msgstr "Adicionar modelo customizado"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1815
msgid "Add custom G-code"
msgstr "Adicionar código G personalizado"
-#: src/slic3r/GUI/DoubleSlider.cpp:1508
+#: src/slic3r/GUI/DoubleSlider.cpp:1833
msgid "Edit color"
msgstr "Editar cor"
-#: src/slic3r/GUI/DoubleSlider.cpp:1509
+#: src/slic3r/GUI/DoubleSlider.cpp:1834
msgid "Edit pause print message"
msgstr "Editar mensagem de impressão de pausa"
-#: src/slic3r/GUI/DoubleSlider.cpp:1510
+#: src/slic3r/GUI/DoubleSlider.cpp:1835
msgid "Edit custom G-code"
msgstr "Editar código G personalizado"
-#: src/slic3r/GUI/DoubleSlider.cpp:1516
+#: src/slic3r/GUI/DoubleSlider.cpp:1841
msgid "Delete color change"
msgstr "Excluir alteração de cor"
-#: src/slic3r/GUI/DoubleSlider.cpp:1517
+#: src/slic3r/GUI/DoubleSlider.cpp:1842
msgid "Delete tool change"
msgstr "Excluir alteração de ferramenta"
-#: src/slic3r/GUI/DoubleSlider.cpp:1518
+#: src/slic3r/GUI/DoubleSlider.cpp:1843
msgid "Delete pause print"
msgstr "Excluir impressão de pausa"
-#: src/slic3r/GUI/DoubleSlider.cpp:1519
+#: src/slic3r/GUI/DoubleSlider.cpp:1844
msgid "Delete custom G-code"
msgstr "Excluir código G personalizado"
-#: src/slic3r/GUI/DoubleSlider.cpp:1532
+#: src/slic3r/GUI/DoubleSlider.cpp:1854 src/slic3r/GUI/DoubleSlider.cpp:1995
+msgid "Jump to height"
+msgstr "Pule para altura"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1859
+msgid "Hide ruler"
+msgstr "Esconder régua"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1863
+msgid "Show object height"
+msgstr "Mostrar altura do objeto"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1863
+msgid "Show object height on the ruler"
+msgstr "Mostrar altura do objeto na régua"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1867
+msgid "Show estimated print time"
+msgstr "Mostrar tempo estimado de impressão"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1867
+msgid "Show estimated print time on the ruler"
+msgstr "Mostrar tempo estimado de impressão na régua"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1871
+msgid "Ruler mode"
+msgstr "Modo régua"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1871
+msgid "Set ruler mode"
+msgstr "Definir modo régua"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1876
msgid "Set extruder sequence for the entire print"
msgstr "Definir sequência de extrusora para toda a impressão"
-#: src/slic3r/GUI/DoubleSlider.cpp:1618
+#: src/slic3r/GUI/DoubleSlider.cpp:1962
msgid "Enter custom G-code used on current layer"
msgstr "Digite o código G personalizado usado na camada atual"
-#: src/slic3r/GUI/DoubleSlider.cpp:1619
+#: src/slic3r/GUI/DoubleSlider.cpp:1963
msgid "Custom G-code on current layer (%1% mm)."
msgstr "Código G personalizado na camada atual (%1% mm)."
-#: src/slic3r/GUI/DoubleSlider.cpp:1634
+#: src/slic3r/GUI/DoubleSlider.cpp:1978
msgid "Enter short message shown on Printer display when a print is paused"
msgstr ""
"Digite mensagem curta mostrada no visor da impressora quando uma impressão é "
"pausada"
-#: src/slic3r/GUI/DoubleSlider.cpp:1635
+#: src/slic3r/GUI/DoubleSlider.cpp:1979
msgid "Message for pause print on current layer (%1% mm)."
msgstr "Mensagem para impressão de pausa na camada atual (%1% mm)."
-#: src/slic3r/GUI/DoubleSlider.cpp:1650
+#: src/slic3r/GUI/DoubleSlider.cpp:1994
+msgid "Enter the move you want to jump to"
+msgstr "Digite o movimento que você deseja saltar para"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1994
msgid "Enter the height you want to jump to"
msgstr "Digite a altura que você deseja saltar para"
-#: src/slic3r/GUI/DoubleSlider.cpp:1899
+#: src/slic3r/GUI/DoubleSlider.cpp:2239
msgid "The last color change data was saved for a single extruder printing."
msgstr ""
"Parâmetros de mudança de ferramenta com impressoras de multi material com "
"apenas uma extrusora."
-#: src/slic3r/GUI/DoubleSlider.cpp:1900 src/slic3r/GUI/DoubleSlider.cpp:1916
+#: src/slic3r/GUI/DoubleSlider.cpp:2240 src/slic3r/GUI/DoubleSlider.cpp:2255
msgid "The last color change data was saved for a multi extruder printing."
msgstr ""
"Os últimos dados de mudança de cor foram salvos para uma impressão de vários "
"extrusores."
-#: src/slic3r/GUI/DoubleSlider.cpp:1902
+#: src/slic3r/GUI/DoubleSlider.cpp:2242
msgid "Your current changes will delete all saved color changes."
msgstr "Suas alterações atuais excluirão todas as alterações de cor salvas."
-#: src/slic3r/GUI/DoubleSlider.cpp:1903 src/slic3r/GUI/DoubleSlider.cpp:1924
+#: src/slic3r/GUI/DoubleSlider.cpp:2243 src/slic3r/GUI/DoubleSlider.cpp:2263
msgid "Are you sure you want to continue?"
msgstr "Você tem certeza que deseja continuar?"
-#: src/slic3r/GUI/DoubleSlider.cpp:1917
+#: src/slic3r/GUI/DoubleSlider.cpp:2256
msgid ""
"Select YES if you want to delete all saved tool changes, \n"
"NO if you want all tool changes switch to color changes, \n"
"or CANCEL to leave it unchanged."
msgstr ""
"Selecione SIM se quiser excluir todas as alterações de ferramenta salvas, \n"
-"NÃO, se você quiser que todas as alterações de ferramenta mudem para "
-"mudanças de cor, \n"
+"NÃO, se você quiser que todas as alterações de ferramenta mudem para mudanças "
+"de cor, \n"
"ou CANCELAR para deixá-lo inalterado."
-#: src/slic3r/GUI/DoubleSlider.cpp:1920
+#: src/slic3r/GUI/DoubleSlider.cpp:2259
msgid "Do you want to delete all saved tool changes?"
msgstr "Deseja excluir todas as alterações de ferramenta salvas?"
-#: src/slic3r/GUI/DoubleSlider.cpp:1922
+#: src/slic3r/GUI/DoubleSlider.cpp:2261
msgid ""
"The last color change data was saved for a multi extruder printing with tool "
"changes for whole print."
@@ -1283,67 +1391,92 @@ msgstr ""
"Os últimos dados de mudança de cor foram salvos para uma impressão multi-"
"extrusora com alterações de ferramenta para impressão inteira."
-#: src/slic3r/GUI/DoubleSlider.cpp:1923
+#: src/slic3r/GUI/DoubleSlider.cpp:2262
msgid "Your current changes will delete all saved extruder (tool) changes."
msgstr ""
-"Suas alterações atuais excluirão todas as alterações do extrusor "
-"(ferramenta) salvos."
+"Suas alterações atuais excluirão todas as alterações do extrusor (ferramenta) "
+"salvos."
+
+#: src/slic3r/GUI/ExtraRenderers.cpp:297 src/slic3r/GUI/GUI_ObjectList.cpp:512
+#: src/slic3r/GUI/GUI_ObjectList.cpp:524 src/slic3r/GUI/GUI_ObjectList.cpp:1033
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4582 src/slic3r/GUI/GUI_ObjectList.cpp:4592
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4627
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:209
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:266
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:291
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:499 src/libslic3r/PrintConfig.cpp:552
+msgid "default"
+msgstr "padrão"
-#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:23
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:24
msgid "Set extruder sequence"
msgstr "Definir seqüência de extrusor"
-#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:39
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:40
msgid "Set extruder change for every"
msgstr "Definir a mudança de extrusor para cada"
-#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:52
-#: src/libslic3r/PrintConfig.cpp:362 src/libslic3r/PrintConfig.cpp:994
-#: src/libslic3r/PrintConfig.cpp:1505 src/libslic3r/PrintConfig.cpp:1690
-#: src/libslic3r/PrintConfig.cpp:1750 src/libslic3r/PrintConfig.cpp:1930
-#: src/libslic3r/PrintConfig.cpp:1976
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:53 src/libslic3r/PrintConfig.cpp:418
+#: src/libslic3r/PrintConfig.cpp:1089 src/libslic3r/PrintConfig.cpp:1718
+#: src/libslic3r/PrintConfig.cpp:1883 src/libslic3r/PrintConfig.cpp:1950
+#: src/libslic3r/PrintConfig.cpp:2157 src/libslic3r/PrintConfig.cpp:2203
msgid "layers"
msgstr "camadas"
-#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:136
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:137
msgid "Set extruder(tool) sequence"
msgstr "Definir sequência da extrusora (ferramenta)"
-#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:182
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:183
msgid "Remove extruder from sequence"
msgstr "Remover extrusor da seqüência"
-#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:192
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:193
msgid "Add extruder to sequence"
msgstr "Adicionar extrusor à seqüência"
-#: src/slic3r/GUI/Field.cpp:136
+#: src/slic3r/GUI/Field.cpp:197
msgid "default value"
msgstr "valor padrão"
-#: src/slic3r/GUI/Field.cpp:139
+#: src/slic3r/GUI/Field.cpp:200
msgid "parameter name"
msgstr "nome do parâmetro"
-#: src/slic3r/GUI/Field.cpp:150 src/slic3r/GUI/OptionsGroup.cpp:581
+#: src/slic3r/GUI/Field.cpp:211 src/slic3r/GUI/OptionsGroup.cpp:781
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:886
msgid "N/A"
msgstr "N/D"
-#: src/slic3r/GUI/Field.cpp:175
+#: src/slic3r/GUI/Field.cpp:233
#, c-format
msgid "%s doesn't support percentage"
msgstr "%s não suporta porcentagem"
-#: src/slic3r/GUI/Field.cpp:195 src/slic3r/GUI/Field.cpp:226
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:376
+#: src/slic3r/GUI/Field.cpp:253 src/slic3r/GUI/Field.cpp:307
+#: src/slic3r/GUI/Field.cpp:1520 src/slic3r/GUI/GUI_ObjectLayers.cpp:413
msgid "Invalid numeric input."
msgstr "Entrada numérica não válida."
-#: src/slic3r/GUI/Field.cpp:204
+#: src/slic3r/GUI/Field.cpp:264
+#, c-format
+msgid ""
+"Input value is out of range\n"
+"Are you sure that %s is a correct value and that you want to continue?"
+msgstr ""
+"O valor de entrada está fora do intervalo\n"
+"Tem certeza de que %s é um valor correto e deseja continuar?"
+
+#: src/slic3r/GUI/Field.cpp:266 src/slic3r/GUI/Field.cpp:326
+msgid "Parameter validation"
+msgstr "Validação do parâmetro"
+
+#: src/slic3r/GUI/Field.cpp:279 src/slic3r/GUI/Field.cpp:373
+#: src/slic3r/GUI/Field.cpp:1532
msgid "Input value is out of range"
msgstr "Valor de entrada está fora do limite"
-#: src/slic3r/GUI/Field.cpp:240
+#: src/slic3r/GUI/Field.cpp:323
#, c-format
msgid ""
"Do you mean %s%% instead of %s %s?\n"
@@ -1354,9 +1487,13 @@ msgstr ""
"Selecione SIM se quiser trocar esse valor para %s%%, \n"
"ou NÃO se você tem certeza que %s %s é o valor correto."
-#: src/slic3r/GUI/Field.cpp:243
-msgid "Parameter validation"
-msgstr "Validação do parâmetro"
+#: src/slic3r/GUI/Field.cpp:381
+msgid ""
+"Invalid input format. Expected vector of dimensions in the following format: "
+"\"%1%\""
+msgstr ""
+"Formato de entrada inválido. Vetor de dimensões esperado no seguinte formato: "
+"\"%1%\""
#: src/slic3r/GUI/FirmwareDialog.cpp:150
msgid "Flash!"
@@ -1441,8 +1578,9 @@ msgstr "Atualizador de Firmware"
msgid "Firmware image:"
msgstr "Imagem do Firmware:"
-#: src/slic3r/GUI/FirmwareDialog.cpp:805 src/slic3r/GUI/Tab.cpp:1657
-#: src/slic3r/GUI/Tab.cpp:1719
+#: src/slic3r/GUI/FirmwareDialog.cpp:805
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:289
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364
msgid "Browse"
msgstr "Procurar"
@@ -1474,9 +1612,8 @@ msgstr "Pronto"
msgid "Advanced: Output log"
msgstr "Avançado: log de Saída"
-#: src/slic3r/GUI/FirmwareDialog.cpp:852
-#: src/slic3r/GUI/Mouse3DController.cpp:336
-#: src/slic3r/GUI/PrintHostDialogs.cpp:161
+#: src/slic3r/GUI/FirmwareDialog.cpp:852 src/slic3r/GUI/Mouse3DController.cpp:551
+#: src/slic3r/GUI/PrintHostDialogs.cpp:189
msgid "Close"
msgstr "Fechar"
@@ -1496,318 +1633,664 @@ msgstr "Confirmação"
msgid "Cancelling..."
msgstr "Cancelando..."
-#: src/slic3r/GUI/GLCanvas3D.cpp:234 src/slic3r/GUI/GLCanvas3D.cpp:4573
+#: src/slic3r/GUI/GCodeViewer.cpp:239
+msgid "Tool position"
+msgstr "Posição da ferramenta"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:1016
+msgid "Generating toolpaths"
+msgstr "Gerando caminhos"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:1405
+msgid "Generating vertex buffer"
+msgstr "Gerando buffer do vértice"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:1496
+msgid "Generating index buffers"
+msgstr "Gerando buffer do índice"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2225
+msgid "Click to hide"
+msgstr "Clique para esconder"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2225
+msgid "Click to show"
+msgstr "Clique para mostrar"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2337
+msgid "up to"
+msgstr "até"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2343
+msgid "above"
+msgstr "acima de Z"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2351
+msgid "from"
+msgstr "de"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2351
+msgid "to"
+msgstr "para"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2379 src/slic3r/GUI/GCodeViewer.cpp:2387
+#: src/slic3r/GUI/GUI_Preview.cpp:214 src/slic3r/GUI/GUI_Preview.cpp:533
+#: src/slic3r/GUI/GUI_Preview.cpp:942
+msgid "Feature type"
+msgstr "Tipo de recurso"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2379 src/slic3r/GUI/GCodeViewer.cpp:2387
+#: src/slic3r/GUI/RammingChart.cpp:76
+msgid "Time"
+msgstr "Tempo"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2387
+msgid "Percentage"
+msgstr "Porcentagem"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2390
+msgid "Height (mm)"
+msgstr "Altura (mm)"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2391
+msgid "Width (mm)"
+msgstr "Espessura (mm)"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2392
+msgid "Speed (mm/s)"
+msgstr "Velocidade (mm/s)"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2393
+msgid "Fan Speed (%)"
+msgstr "Velocidade da ventoinha (%)"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2394
+msgid "Volumetric flow rate (mm³/s)"
+msgstr "Vazão volumétrica (mm³/s)"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2395 src/slic3r/GUI/GUI_Preview.cpp:220
+#: src/slic3r/GUI/GUI_Preview.cpp:326 src/slic3r/GUI/GUI_Preview.cpp:471
+#: src/slic3r/GUI/GUI_Preview.cpp:532 src/slic3r/GUI/GUI_Preview.cpp:878
+#: src/slic3r/GUI/GUI_Preview.cpp:942
+msgid "Tool"
+msgstr "Ferramenta"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2396 src/slic3r/GUI/GUI_Preview.cpp:221
+#: src/slic3r/GUI/GUI_Preview.cpp:530 src/slic3r/GUI/GUI_Preview.cpp:941
+msgid "Color Print"
+msgstr "Impressão colorida"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2432 src/slic3r/GUI/GCodeViewer.cpp:2467
+#: src/slic3r/GUI/GCodeViewer.cpp:2472 src/slic3r/GUI/GUI_ObjectList.cpp:312
+#: src/slic3r/GUI/wxExtensions.cpp:519 src/libslic3r/PrintConfig.cpp:547
+msgid "Extruder"
+msgstr "Extrusora"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2443
+msgid "Default color"
+msgstr "Cor de impressão padrão"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2467
+msgid "default color"
+msgstr "cor de impressão padrão"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2562 src/slic3r/GUI/GCodeViewer.cpp:2608
+msgid "Color change"
+msgstr "Adicionar mudança de cor"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2581 src/slic3r/GUI/GCodeViewer.cpp:2606
+msgid "Print"
+msgstr "Imprrimir"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2607 src/slic3r/GUI/GCodeViewer.cpp:2624
+msgid "Pause"
+msgstr "Pausar"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2612 src/slic3r/GUI/GCodeViewer.cpp:2615
+msgid "Event"
+msgstr "Evento"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2612 src/slic3r/GUI/GCodeViewer.cpp:2615
+msgid "Remaining time"
+msgstr "Tempo de impressão restante"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2615
+msgid "Duration"
+msgstr "Duração"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2650 src/slic3r/GUI/GUI_Preview.cpp:1023
+#: src/libslic3r/PrintConfig.cpp:2380
+msgid "Travel"
+msgstr "Viagem"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2653
+msgid "Movement"
+msgstr "Movimento"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2654
+msgid "Extrusion"
+msgstr "Extrusão"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2655 src/slic3r/GUI/Tab.cpp:1694
+#: src/slic3r/GUI/Tab.cpp:2582
+msgid "Retraction"
+msgstr "Retração"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2672 src/slic3r/GUI/GCodeViewer.cpp:2675
+#: src/slic3r/GUI/GUI_Preview.cpp:1024
+msgid "Wipe"
+msgstr "Limpar"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2706 src/slic3r/GUI/GUI_Preview.cpp:248
+#: src/slic3r/GUI/GUI_Preview.cpp:262
+msgid "Options"
+msgstr "Opções de saída"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2709 src/slic3r/GUI/GUI_Preview.cpp:1025
+msgid "Retractions"
+msgstr "Retrações"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2710 src/slic3r/GUI/GUI_Preview.cpp:1026
+msgid "Deretractions"
+msgstr "Retorno da retração"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2711 src/slic3r/GUI/GUI_Preview.cpp:1027
+msgid "Tool changes"
+msgstr "G-code de troca de ferramenta"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2712 src/slic3r/GUI/GUI_Preview.cpp:1028
+msgid "Color changes"
+msgstr "Adicionar mudança de cor"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2713 src/slic3r/GUI/GUI_Preview.cpp:1029
+msgid "Print pauses"
+msgstr "Pausas de impressão"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2714 src/slic3r/GUI/GUI_Preview.cpp:1030
+msgid "Custom G-codes"
+msgstr "G-code customizado"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2725 src/slic3r/GUI/GCodeViewer.cpp:2749
+#: src/slic3r/GUI/Plater.cpp:697 src/libslic3r/PrintConfig.cpp:117
+msgid "Printer"
+msgstr "Impressora"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2727 src/slic3r/GUI/GCodeViewer.cpp:2754
+#: src/slic3r/GUI/Plater.cpp:693
+msgid "Print settings"
+msgstr "Config. de impressão"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2730 src/slic3r/GUI/GCodeViewer.cpp:2760
+#: src/slic3r/GUI/Plater.cpp:694 src/slic3r/GUI/Tab.cpp:1794
+#: src/slic3r/GUI/Tab.cpp:1795
+msgid "Filament"
+msgstr "Filamento"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2785 src/slic3r/GUI/GCodeViewer.cpp:2790
+#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1135
+#: src/slic3r/GUI/Plater.cpp:1220
+msgid "Estimated printing time"
+msgstr "Tempo estimado de impressão"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2785
+msgid "Normal mode"
+msgstr "Modo normal"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2790
+msgid "Stealth mode"
+msgstr "Modo silencioso"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2817
+msgid "Show stealth mode"
+msgstr "Mostrar modo silencioso"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2821
+msgid "Show normal mode"
+msgstr "Mostrar modo normal"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:236 src/slic3r/GUI/GLCanvas3D.cpp:4610
msgid "Variable layer height"
msgstr "Altura da camada variável"
-#: src/slic3r/GUI/GLCanvas3D.cpp:237
+#: src/slic3r/GUI/GLCanvas3D.cpp:238
msgid "Left mouse button:"
msgstr "Botão esquerdo do mouse:"
#: src/slic3r/GUI/GLCanvas3D.cpp:240
msgid "Add detail"
-msgstr "Adicionar config."
+msgstr "Adicionar Detalhe"
-#: src/slic3r/GUI/GLCanvas3D.cpp:243
+#: src/slic3r/GUI/GLCanvas3D.cpp:242
msgid "Right mouse button:"
msgstr "Botão direito do mouse:"
-#: src/slic3r/GUI/GLCanvas3D.cpp:246
+#: src/slic3r/GUI/GLCanvas3D.cpp:244
msgid "Remove detail"
msgstr "Remover detalhes"
-#: src/slic3r/GUI/GLCanvas3D.cpp:249
+#: src/slic3r/GUI/GLCanvas3D.cpp:246
msgid "Shift + Left mouse button:"
msgstr "Shift + Botão do mouse esquerdo:"
-#: src/slic3r/GUI/GLCanvas3D.cpp:252
+#: src/slic3r/GUI/GLCanvas3D.cpp:248
msgid "Reset to base"
-msgstr "Reset para base"
+msgstr "Redefinir para base"
-#: src/slic3r/GUI/GLCanvas3D.cpp:255
+#: src/slic3r/GUI/GLCanvas3D.cpp:250
msgid "Shift + Right mouse button:"
msgstr "Shift + Botão do mouse direito:"
-#: src/slic3r/GUI/GLCanvas3D.cpp:258
+#: src/slic3r/GUI/GLCanvas3D.cpp:252
msgid "Smoothing"
-msgstr "Suavizando"
+msgstr "Suavizar"
-#: src/slic3r/GUI/GLCanvas3D.cpp:261
+#: src/slic3r/GUI/GLCanvas3D.cpp:254
msgid "Mouse wheel:"
msgstr "Scroll do mouse:"
-#: src/slic3r/GUI/GLCanvas3D.cpp:264
+#: src/slic3r/GUI/GLCanvas3D.cpp:256
msgid "Increase/decrease edit area"
msgstr "Aumentar/diminuir a área de edição"
-#: src/slic3r/GUI/GLCanvas3D.cpp:267
+#: src/slic3r/GUI/GLCanvas3D.cpp:259
msgid "Adaptive"
msgstr "Adaptativo"
-#: src/slic3r/GUI/GLCanvas3D.cpp:273
+#: src/slic3r/GUI/GLCanvas3D.cpp:265
msgid "Quality / Speed"
msgstr "Qualidade / Velocidade"
-#: src/slic3r/GUI/GLCanvas3D.cpp:277
+#: src/slic3r/GUI/GLCanvas3D.cpp:268
msgid "Higher print quality versus higher print speed."
msgstr "Maior qualidade de impressão versus maior velocidade de impressão."
-#: src/slic3r/GUI/GLCanvas3D.cpp:288
+#: src/slic3r/GUI/GLCanvas3D.cpp:279
msgid "Smooth"
-msgstr "Suave"
+msgstr "Suavizar"
-#: src/slic3r/GUI/GLCanvas3D.cpp:294 src/libslic3r/PrintConfig.cpp:511
+#: src/slic3r/GUI/GLCanvas3D.cpp:285 src/libslic3r/PrintConfig.cpp:571
msgid "Radius"
msgstr "Raio"
-#: src/slic3r/GUI/GLCanvas3D.cpp:304
+#: src/slic3r/GUI/GLCanvas3D.cpp:295
msgid "Keep min"
-msgstr "Mantenha min."
+msgstr "Mantenha min"
-#: src/slic3r/GUI/GLCanvas3D.cpp:313
+#: src/slic3r/GUI/GLCanvas3D.cpp:304 src/slic3r/GUI/GLCanvas3D.cpp:4050
msgid "Reset"
msgstr "Redefinir"
-#: src/slic3r/GUI/GLCanvas3D.cpp:599
+#: src/slic3r/GUI/GLCanvas3D.cpp:566
msgid "Variable layer height - Manual edit"
msgstr "Habilitar altura de camada variável"
-#: src/slic3r/GUI/GLCanvas3D.cpp:685
-msgid "An object outside the print area was detected"
-msgstr "Um objeto foi detectado fora da área de impressão"
+#: src/slic3r/GUI/GLCanvas3D.cpp:634
+msgid "An object outside the print area was detected."
+msgstr "Um objeto foi detectado fora da área de impressão."
-#: src/slic3r/GUI/GLCanvas3D.cpp:686
-msgid "A toolpath outside the print area was detected"
-msgstr "Há movimentos fora da área de impressão"
+#: src/slic3r/GUI/GLCanvas3D.cpp:635
+msgid "A toolpath outside the print area was detected."
+msgstr "Há movimentos fora da área de impressão."
-#: src/slic3r/GUI/GLCanvas3D.cpp:687
-msgid "SLA supports outside the print area were detected"
-msgstr "Suportes de SLA foram detectados fora da área de impressão"
+#: src/slic3r/GUI/GLCanvas3D.cpp:636
+msgid "SLA supports outside the print area were detected."
+msgstr "Suportes de SLA foram detectados fora da área de impressão."
-#: src/slic3r/GUI/GLCanvas3D.cpp:688
-msgid "Some objects are not visible"
-msgstr "Alguns objetos não são visíveis"
+#: src/slic3r/GUI/GLCanvas3D.cpp:637
+msgid "Some objects are not visible."
+msgstr "Alguns objetos não são visíveis."
-#: src/slic3r/GUI/GLCanvas3D.cpp:690
+#: src/slic3r/GUI/GLCanvas3D.cpp:639
msgid ""
-"An object outside the print area was detected\n"
-"Resolve the current problem to continue slicing"
+"An object outside the print area was detected.\n"
+"Resolve the current problem to continue slicing."
msgstr ""
-"Um objeto foi encontrado fora da área de impressão\n"
-"Resolva o problema atual para continuar o fatiamento"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:904 src/slic3r/GUI/GLCanvas3D.cpp:933
-msgid "Default print color"
-msgstr "Cor de impressão padrão"
+"Um objeto foi encontrado fora da área de impressão.\n"
+"Resolva o problema atual para continuar o fatiamento."
-#: src/slic3r/GUI/GLCanvas3D.cpp:934 src/slic3r/GUI/GLCanvas3D.cpp:943
-#: src/slic3r/GUI/GLCanvas3D.cpp:982
-msgid "Pause print or custom G-code"
-msgstr "Pausa impressão ou código G personalizado"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:955
-#, c-format
-msgid "up to %.2f mm"
-msgstr "até %.2f mm"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:959
-#, c-format
-msgid "above %.2f mm"
-msgstr "acima de %.2f mm"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:963
-#, c-format
-msgid "%.2f - %.2f mm"
-msgstr "%.2f - %.2f mm"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:995
-#, c-format
-msgid "Color change for Extruder %d at %.2f mm"
-msgstr "Mudança de cor para Extrusor %d em %.2f mm"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:1305
+#: src/slic3r/GUI/GLCanvas3D.cpp:949
msgid "Seq."
msgstr "Seq."
-#: src/slic3r/GUI/GLCanvas3D.cpp:1701
+#: src/slic3r/GUI/GLCanvas3D.cpp:1455
msgid "Variable layer height - Reset"
msgstr "Habilitar altura de camada variável - Resetar"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1709
+#: src/slic3r/GUI/GLCanvas3D.cpp:1463
msgid "Variable layer height - Adaptive"
msgstr "Habilitar altura de camada variável - Adaptativo"
-#: src/slic3r/GUI/GLCanvas3D.cpp:1717
+#: src/slic3r/GUI/GLCanvas3D.cpp:1471
msgid "Variable layer height - Smooth all"
msgstr "Habilitar altura de camada variável - Deixar tudo suave"
-#: src/slic3r/GUI/GLCanvas3D.cpp:2053
+#: src/slic3r/GUI/GLCanvas3D.cpp:1876
msgid "Mirror Object"
msgstr "Espelhar objeto"
-#: src/slic3r/GUI/GLCanvas3D.cpp:2921
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:570
+#: src/slic3r/GUI/GLCanvas3D.cpp:2746
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:520
msgid "Gizmo-Move"
msgstr "Gizmo-Mover"
-#: src/slic3r/GUI/GLCanvas3D.cpp:3001
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:572
+#: src/slic3r/GUI/GLCanvas3D.cpp:2832
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:522
msgid "Gizmo-Rotate"
msgstr "Gizmo-Rotacionar"
-#: src/slic3r/GUI/GLCanvas3D.cpp:3505
+#: src/slic3r/GUI/GLCanvas3D.cpp:3388
msgid "Move Object"
msgstr "Mover objeto"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4047
+#: src/slic3r/GUI/GLCanvas3D.cpp:3858 src/slic3r/GUI/GLCanvas3D.cpp:4571
+msgid "Switch to Settings"
+msgstr "Alterar para modo de edição"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3859 src/slic3r/GUI/GLCanvas3D.cpp:4571
+msgid "Print Settings Tab"
+msgstr "Config. de impressão"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3860 src/slic3r/GUI/GLCanvas3D.cpp:4572
+msgid "Filament Settings Tab"
+msgstr "Config. de filamentos"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3860 src/slic3r/GUI/GLCanvas3D.cpp:4572
+msgid "Material Settings Tab"
+msgstr "Aba de config. de material"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3861 src/slic3r/GUI/GLCanvas3D.cpp:4573
+msgid "Printer Settings Tab"
+msgstr "Aba de config. da impressora"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3909
msgid "Undo History"
msgstr "Desfazer histórico"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4047
+#: src/slic3r/GUI/GLCanvas3D.cpp:3909
msgid "Redo History"
msgstr "Refazer histórico"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4065
+#: src/slic3r/GUI/GLCanvas3D.cpp:3930
#, c-format
msgid "Undo %1$d Action"
msgid_plural "Undo %1$d Actions"
msgstr[0] "Desfazer ação de %1$d"
msgstr[1] "Desfazer ações de %1$d"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4065
+#: src/slic3r/GUI/GLCanvas3D.cpp:3930
#, c-format
msgid "Redo %1$d Action"
msgid_plural "Redo %1$d Actions"
msgstr[0] "Refazer ação de %1$d"
msgstr[1] "Refazer ações de %1$d"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4467
+#: src/slic3r/GUI/GLCanvas3D.cpp:3950 src/slic3r/GUI/GLCanvas3D.cpp:4589
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:98 src/slic3r/GUI/Search.cpp:351
+msgid "Search"
+msgstr "Pesquisar"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3964 src/slic3r/GUI/GLCanvas3D.cpp:3972
+#: src/slic3r/GUI/Search.cpp:358
+msgid "Enter a search term"
+msgstr "Entre com um termo de busca"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4003
+msgid "Arrange options"
+msgstr "Arranjar opções"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4033
+msgid "Press %1%left mouse button to enter the exact value"
+msgstr "Pressione %1%botão esquerdo do mouse para inserir o valor exato"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4035
+msgid "Spacing"
+msgstr "Espaçamento"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4042
+msgid "Enable rotations (slow)"
+msgstr "Ativar rotações (devagar)"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4060 src/slic3r/GUI/GLCanvas3D.cpp:4481
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:120 src/slic3r/GUI/Plater.cpp:1648
+msgid "Arrange"
+msgstr "Arranjar"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4455
msgid "Add..."
msgstr "Adicionar..."
-#: src/slic3r/GUI/GLCanvas3D.cpp:4475 src/slic3r/GUI/GUI_ObjectList.cpp:1719
-#: src/slic3r/GUI/Plater.cpp:3933 src/slic3r/GUI/Plater.cpp:3955
-#: src/slic3r/GUI/Tab.cpp:3126
+#: src/slic3r/GUI/GLCanvas3D.cpp:4463 src/slic3r/GUI/GUI_ObjectList.cpp:1878
+#: src/slic3r/GUI/Plater.cpp:3998 src/slic3r/GUI/Plater.cpp:4022
+#: src/slic3r/GUI/Tab.cpp:3484
msgid "Delete"
msgstr "Deletar"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4484 src/slic3r/GUI/KBShortcutsDialog.cpp:129
-#: src/slic3r/GUI/Plater.cpp:4671
+#: src/slic3r/GUI/GLCanvas3D.cpp:4472 src/slic3r/GUI/KBShortcutsDialog.cpp:88
+#: src/slic3r/GUI/Plater.cpp:5107
msgid "Delete all"
msgstr "Deletar todos"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:157
-#: src/slic3r/GUI/Plater.cpp:2756
-msgid "Arrange"
-msgstr "Arranjar"
-
-#: src/slic3r/GUI/GLCanvas3D.cpp:4493 src/slic3r/GUI/KBShortcutsDialog.cpp:158
+#: src/slic3r/GUI/GLCanvas3D.cpp:4481 src/slic3r/GUI/KBShortcutsDialog.cpp:121
msgid "Arrange selection"
msgstr "Arranjar seleção"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4505
+#: src/slic3r/GUI/GLCanvas3D.cpp:4481
+msgid "Click right mouse button to show arrangement options"
+msgstr "Clique no botão direito para mostrar opções de arranjo"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4503
msgid "Copy"
msgstr "Copiar"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4514
+#: src/slic3r/GUI/GLCanvas3D.cpp:4512
msgid "Paste"
msgstr "Colar"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4526 src/slic3r/GUI/Plater.cpp:3790
-#: src/slic3r/GUI/Plater.cpp:3802 src/slic3r/GUI/Plater.cpp:3942
+#: src/slic3r/GUI/GLCanvas3D.cpp:4524 src/slic3r/GUI/Plater.cpp:3857
+#: src/slic3r/GUI/Plater.cpp:3869 src/slic3r/GUI/Plater.cpp:4007
msgid "Add instance"
msgstr "Adicionar instância"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4537 src/slic3r/GUI/Plater.cpp:3944
+#: src/slic3r/GUI/GLCanvas3D.cpp:4535 src/slic3r/GUI/Plater.cpp:4009
msgid "Remove instance"
msgstr "Remover instância"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4550
+#: src/slic3r/GUI/GLCanvas3D.cpp:4548
msgid "Split to objects"
msgstr "Dividir em objetos"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4560 src/slic3r/GUI/GUI_ObjectList.cpp:1488
+#: src/slic3r/GUI/GLCanvas3D.cpp:4558 src/slic3r/GUI/GUI_ObjectList.cpp:1650
msgid "Split to parts"
msgstr "Dividir em partes"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4624 src/slic3r/GUI/KBShortcutsDialog.cpp:130
-#: src/slic3r/GUI/MainFrame.cpp:592
+#: src/slic3r/GUI/GLCanvas3D.cpp:4660 src/slic3r/GUI/KBShortcutsDialog.cpp:89
+#: src/slic3r/GUI/MainFrame.cpp:1125
msgid "Undo"
msgstr "Desfazer"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4624 src/slic3r/GUI/GLCanvas3D.cpp:4657
-msgid "Click right mouse button to open History"
-msgstr "Clique no botão direito para abrir o Histórico"
+#: src/slic3r/GUI/GLCanvas3D.cpp:4660 src/slic3r/GUI/GLCanvas3D.cpp:4699
+msgid "Click right mouse button to open/close History"
+msgstr "Clique no botão direito para abrir/fechar o Histórico"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4641
+#: src/slic3r/GUI/GLCanvas3D.cpp:4683
msgid "Next Undo action: %1%"
msgstr "Próxima ação de desfazer: %1%"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4657 src/slic3r/GUI/KBShortcutsDialog.cpp:131
-#: src/slic3r/GUI/MainFrame.cpp:595
+#: src/slic3r/GUI/GLCanvas3D.cpp:4699 src/slic3r/GUI/KBShortcutsDialog.cpp:90
+#: src/slic3r/GUI/MainFrame.cpp:1128
msgid "Redo"
msgstr "Refazer"
-#: src/slic3r/GUI/GLCanvas3D.cpp:4673
+#: src/slic3r/GUI/GLCanvas3D.cpp:4721
msgid "Next Redo action: %1%"
msgstr "Próxima ação de refazer: %1%"
-#: src/slic3r/GUI/GLCanvas3D.cpp:6598
+#: src/slic3r/GUI/GLCanvas3D.cpp:6345
msgid "Selection-Add from rectangle"
msgstr "Seleção-Adicionar do retângulo"
-#: src/slic3r/GUI/GLCanvas3D.cpp:6617
+#: src/slic3r/GUI/GLCanvas3D.cpp:6364
msgid "Selection-Remove from rectangle"
msgstr "Seleção-remover do retângulo"
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:306
-#, c-format
-msgid ""
-"PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n"
-"while OpenGL version %s, render %s, vendor %s was detected."
-msgstr ""
-"PrusaSlicer requer drivers capazes de executar OpenGL 2.0, \n"
-"enquanto a versão do OpenGL %s, renderização %s, fornecedor %s foi detectada."
-
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:309
-msgid "You may need to update your graphics card driver."
-msgstr "Você pode ter que atualizar os drivers da sua placa de vídeo."
-
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:312
-msgid ""
-"As a workaround, you may run PrusaSlicer with a software rendered 3D "
-"graphics by running prusa-slicer.exe with the --sw_renderer parameter."
-msgstr ""
-"Como solução alternativa, você pode executar o PrusaSlicer com um software "
-"renderizando gráficos 3D por executar Prusa-slicer.exe com o parâmetro--"
-"sw_renderer."
-
-#: src/slic3r/GUI/GLCanvas3DManager.cpp:314
-msgid "Unsupported OpenGL version"
-msgstr "Versão do OpenGL não suportada"
-
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:42
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:144 src/libslic3r/PrintConfig.cpp:3412
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:54
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:151 src/libslic3r/PrintConfig.cpp:3690
msgid "Cut"
msgstr "Cortar"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:168
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:179
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487
+msgid "in"
+msgstr "pol"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:185
msgid "Keep upper part"
msgstr "Manter parte superior"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:169
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:186
msgid "Keep lower part"
msgstr "Manter parte inferior"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:187
msgid "Rotate lower part upwards"
msgstr "Rotacione as partes inferiores para cima"
-#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:175
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:192
msgid "Perform cut"
msgstr "Aplicar o corte"
-#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:45
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33
+msgid "Paint-on supports"
+msgstr "Pincel de suportes"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:25
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57
+msgid "Clipping of view"
+msgstr "Recorte de vista"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:26
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58
+msgid "Reset direction"
+msgstr "Restabelecer direção"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:27
+msgid "Brush size"
+msgstr "Tamanho do pincel"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:28
+msgid "Brush shape"
+msgstr "Formato do pincel"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:29
+msgid "Left mouse button"
+msgstr "Botão esquerdo do mouse"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47
+msgid "Enforce supports"
+msgstr "Reforçar suportes"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31
+msgid "Right mouse button"
+msgstr "Botão direito do mouse"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:373
+msgid "Block supports"
+msgstr "Bloquear suportes"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33
+msgid "Shift + Left mouse button"
+msgstr "Shift + Botão do mouse esquerdo"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:368
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:378
+msgid "Remove selection"
+msgstr "Remover seleção"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35
+msgid "Remove all selection"
+msgstr "Remover toda seleção"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36
+msgid "Circle"
+msgstr "Circular"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1595
+msgid "Sphere"
+msgstr "Esfera"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:129
+msgid "Autoset by angle"
+msgstr "Auto definir por angulo"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:136
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:118
+msgid "Reset selection"
+msgstr "Restabelecer seleção"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:160
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141
+msgid "Alt + Mouse wheel"
+msgstr "Alt + Scroll do mouse"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:178
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:159
+msgid "Paints all facets inside, regardless of their orientation."
+msgstr "Pinte todas as facetas internas, independente de suas orientações."
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:192
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:173
+msgid "Ignores facets facing away from the camera."
+msgstr "Ignore facetas de costas para a câmera."
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:203
+msgid "Ctrl + Mouse wheel"
+msgstr "Ctrl + Scroll do mouse"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:233
+msgid "Autoset custom supports"
+msgstr "Definir automaticamente suportes customizados"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:235
+msgid "Threshold:"
+msgstr "Limite:"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242
+msgid "Enforce"
+msgstr "Reforçar"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:245
+msgid "Block"
+msgstr "Bloquear"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:295
+msgid "Block supports by angle"
+msgstr "Bloquear suporte por ângulo"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:296
+msgid "Add supports by angle"
+msgstr "Adicionar suportes por ângulo"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:40
msgid "Place on face"
msgstr "Colocar em uma face"
@@ -1821,14 +2304,14 @@ msgstr "Modelo de visualização oco e perfurado"
#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42
msgid "Offset"
-msgstr "Compensamento do Z"
+msgstr "Compensação"
#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:56
msgid "Quality"
msgstr "Qualidade"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44
-#: src/libslic3r/PrintConfig.cpp:2944
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44 src/libslic3r/PrintConfig.cpp:3183
msgid "Closing distance"
msgstr "Distância de fechamento"
@@ -1848,64 +2331,68 @@ msgstr "Remover os buracos selecionados"
msgid "Remove all holes"
msgstr "Remova todos os buracos"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57
-msgid "Clipping of view"
-msgstr "Recorte de vista"
-
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58
-msgid "Reset direction"
-msgstr "Restabelecer direção"
-
#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51
msgid "Show supports"
msgstr "Mostrar suportes"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:423
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:308
msgid "Add drainage hole"
msgstr "Adicionar orifício de drenagem"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:541
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:424
msgid "Delete drainage hole"
msgstr "Excluir orifício de drenagem"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:815
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:624
msgid "Hollowing parameter change"
msgstr "Mudança de parâmetro de suporte"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:887
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:693
msgid "Change drainage hole diameter"
msgstr "Mudar o diâmetro do orifício de drenagem"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:979
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:785
msgid "Hollow and drill"
msgstr "Oco e broca"
-#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:1061
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:835
msgid "Move drainage hole"
msgstr "Mover o orifício de drenagem"
-#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:64
msgid "Move"
msgstr "Mover"
-#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:449
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:480
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:499
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:517
-#: src/libslic3r/PrintConfig.cpp:3461
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:461
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:527
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562
+#: src/libslic3r/PrintConfig.cpp:3739
msgid "Rotate"
msgstr "Rotacionar"
-#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:47
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:230
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:500
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:518
-#: src/libslic3r/PrintConfig.cpp:3476
+#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:78
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:238
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:547
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563
+#: src/libslic3r/PrintConfig.cpp:3754
msgid "Scale"
msgstr "Escala"
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:30
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:381
+msgid "Enforce seam"
+msgstr "Reforçar costura"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:383
+msgid "Block seam"
+msgstr "Bloquear costura"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:46
+msgid "Seam painting"
+msgstr "Pintura de costura"
+
#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47
msgid "Head diameter"
msgstr "Diâmetro da cabeça"
@@ -1915,7 +2402,7 @@ msgid "Lock supports under new islands"
msgstr "Travar suportes debaixo de novas ilhas"
#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1361
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218
msgid "Remove selected points"
msgstr "Remover pontos selecionados"
@@ -1924,12 +2411,12 @@ msgid "Remove all points"
msgstr "Remover todos os pontos"
#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1364
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221
msgid "Apply changes"
msgstr "Aplicar mudanças"
#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1365
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222
msgid "Discard changes"
msgstr "Descartar mudanças"
@@ -1938,12 +2425,12 @@ msgid "Minimal points distance"
msgstr "Distância mínima entre pontos"
#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54
-#: src/libslic3r/PrintConfig.cpp:2774
+#: src/libslic3r/PrintConfig.cpp:3013
msgid "Support points density"
msgstr "Densidade dos pontos de suporte"
#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1367
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224
msgid "Auto-generate points"
msgstr "Pontos gerados automaticamente"
@@ -1951,298 +2438,479 @@ msgstr "Pontos gerados automaticamente"
msgid "Manual editing"
msgstr "Edição manual"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:484
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:374
msgid "Add support point"
msgstr "Adicionar ponto de suporte"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:621
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:514
msgid "Delete support point"
msgstr "Deletar ponto de suporte"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:810
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:694
msgid "Change point head diameter"
msgstr "Mudar o diâmetro do ponto da cabeça"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:878
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:762
msgid "Support parameter change"
msgstr "Mudança de parâmetro de suporte"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:986
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869
msgid "SLA Support Points"
msgstr "Pontos de suporte SLA"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1007
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897
msgid "SLA gizmo turned on"
msgstr "Gizmo de SLA ligado"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1035
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:911
msgid "Do you want to save your manually edited support points?"
msgstr "Você deseja salvar os pontos manualmente editados?"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1036
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912
msgid "Save changes?"
msgstr "Salvar mudanças?"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1048
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:924
msgid "SLA gizmo turned off"
msgstr "Gizmo de SLA desligado"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1087
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:955
msgid "Move support point"
msgstr "Mover pontos de suporte"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1186
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1048
msgid "Support points edit"
msgstr "Edição de pontos de suporte"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1258
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1127
msgid "Autogeneration will erase all manually edited points."
msgstr "Gerar automaticamente irá apagar todos os pontos manualmente editados."
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1259
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1128
msgid "Are you sure you want to do it?"
msgstr "Tem certeza que quer fazer isso?"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1260 src/slic3r/GUI/GUI.cpp:258
-#: src/slic3r/GUI/Tab.cpp:3086 src/slic3r/GUI/WipeTowerDialog.cpp:45
-#: src/slic3r/GUI/WipeTowerDialog.cpp:366
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1129 src/slic3r/GUI/GUI.cpp:256
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:557
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:581
+#: src/slic3r/GUI/WipeTowerDialog.cpp:45 src/slic3r/GUI/WipeTowerDialog.cpp:366
msgid "Warning"
msgstr "Aviso"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1263
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1134
msgid "Autogenerate support points"
msgstr "Pontos de suporte gerados automaticamente"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1324
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1181
msgid "SLA gizmo keyboard shortcuts"
msgstr "Atalhos no teclado para gizmo SLA"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1335
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1192
msgid "Note: some shortcuts work in (non)editing mode only."
msgstr "Nota: alguns atalhos funcionam somente em modos que não editam."
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1353
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1356
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1357
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214
msgid "Left click"
msgstr "Clique esquerdo"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1353
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210
msgid "Add point"
msgstr "Adicionar ponto"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1354
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211
msgid "Right click"
msgstr "Clique direito"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1354
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211
msgid "Remove point"
msgstr "Remover ponto"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1355
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1358
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1359
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216
msgid "Drag"
msgstr "Arrastar"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1355
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212
msgid "Move point"
msgstr "Mover ponto"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1356
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213
msgid "Add point to selection"
msgstr "Adicionar ponto à seleção"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1357
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214
msgid "Remove point from selection"
msgstr "Remover ponto da seleção"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1358
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215
msgid "Select by rectangle"
msgstr "Selecionar por retângulo"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1359
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216
msgid "Deselect by rectangle"
msgstr "Desselecionar por retângulo"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1360
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217
msgid "Select all points"
msgstr "Selecionar todos os pontos"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1362
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219
msgid "Mouse wheel"
msgstr "Scroll do mouse"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1362
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219
msgid "Move clipping plane"
msgstr "Mover plano de recorte"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1363
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220
msgid "Reset clipping plane"
msgstr "Restabelecer plano de recorte"
-#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1366
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223
msgid "Switch to editing mode"
msgstr "Alterar para modo de edição"
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:497
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:521
+msgid "Gizmo-Scale"
+msgstr "Gizmo-Escala"
+
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:630
msgid "Gizmo-Place on Face"
msgstr "Gizmo-Colocar em uma face"
-#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:571
-msgid "Gizmo-Scale"
-msgstr "Gizmo-Escala"
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:39
+msgid "Entering Paint-on supports"
+msgstr "Entrando na pintura de suportes"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:40
+msgid "Entering Seam painting"
+msgstr "Entrando na pintura de costura"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:47
+msgid "Leaving Seam painting"
+msgstr "Deixar Pintura de Costura"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:48
+msgid "Leaving Paint-on supports"
+msgstr "Deixar Pintura de Suportes"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:371
+msgid "Add supports"
+msgstr "Adicionar ponto de suporte"
+
+#: src/slic3r/GUI/GUI_App.cpp:239
+msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community."
+msgstr ""
+"é baseado no Slic3r criado por Alessandro Ranellucci e a comunidade RepRap."
+
+#: src/slic3r/GUI/GUI_App.cpp:241
+msgid ""
+"Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas "
+"Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others."
+msgstr ""
+"Contribuições por Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas "
+"Meszaros, Lukas Matena, Vojtech Kral, David Kocik e outros."
+
+#: src/slic3r/GUI/GUI_App.cpp:242
+msgid "Artwork model by Nora Al-Badri and Jan Nikolai Nelles"
+msgstr "Modelo de arte de Nora Al-Badri e Jan Nikolai Nelles"
+
+#: src/slic3r/GUI/GUI_App.cpp:382
+msgid ""
+"Starting with %1% 2.3, configuration directory on Linux has changed (according "
+"to XDG Base Directory Specification) to \n"
+"%2%.\n"
+"\n"
+"This directory did not exist yet (maybe you run the new version for the first "
+"time).\n"
+"However, an old %1% configuration directory was detected in \n"
+"%3%.\n"
+"\n"
+"Consider moving the contents of the old directory to the new location in order "
+"to access your profiles, etc.\n"
+"Note that if you decide to downgrade %1% in future, it will use the old "
+"location again.\n"
+"\n"
+"What do you want to do now?"
+msgstr ""
+"Começando com %1% 2.3, o diretório de configuração no Linux foi alterado (de "
+"acordo com a Especificação de diretório base XDG) para\n"
+"%2%.\n"
+"\n"
+"Este diretório ainda não existia (talvez você esteja executando a nova versão "
+"pela primeira vez).\n"
+"No entanto, um antigo diretório de configuração %1% foi detectado em\n"
+"%3%.\n"
+"\n"
+"Considere mover o conteúdo do diretório antigo para o novo local para acessar "
+"seus perfis, etc.\n"
+"Observe que, se você decidir fazer downgrade de %1% no futuro, ele usará o "
+"local antigo novamente.\n"
+"\n"
+"O que você quer fazer agora?"
+
+#: src/slic3r/GUI/GUI_App.cpp:390
+#, c-format
+msgid "%s - BREAKING CHANGE"
+msgstr "%s - QUEBRANDO MUDANÇAS"
+
+#: src/slic3r/GUI/GUI_App.cpp:392
+msgid "Quit, I will move my data now"
+msgstr "Sair, eu moverei meus dados agora"
+
+#: src/slic3r/GUI/GUI_App.cpp:392
+msgid "Start the application"
+msgstr "Começar a aplicação"
-#: src/slic3r/GUI/GUI_App.cpp:138
+#: src/slic3r/GUI/GUI_App.cpp:580
#, c-format
msgid ""
-"%s has encountered an error. It was likely caused by running out of memory. "
-"If you are sure you have enough RAM on your system, this may also be a bug "
-"and we would be glad if you reported it.\n"
+"%s has encountered an error. It was likely caused by running out of memory. If "
+"you are sure you have enough RAM on your system, this may also be a bug and we "
+"would be glad if you reported it.\n"
"\n"
"The application will now terminate."
msgstr ""
-"%s encontrou um erro. Provavelmente foi causado por ficar sem memória. Se "
-"você tem certeza que você tem RAM suficiente em seu sistema, isso também "
-"pode ser um bug e nós estaríamos contentes se você relatou.\n"
+"%s encontrou um erro. Provavelmente foi causado por ficar sem memória. Se você "
+"tem certeza que você tem RAM suficiente em seu sistema, isso também pode ser "
+"um bug e nós estaríamos contentes se você relatou.\n"
"\n"
"O aplicativo será encerrado agora."
-#: src/slic3r/GUI/GUI_App.cpp:141
+#: src/slic3r/GUI/GUI_App.cpp:583
msgid "Fatal error"
msgstr "Erro fatal"
-#: src/slic3r/GUI/GUI_App.cpp:446
-msgid "Changing of an application language"
-msgstr "Alteração de um idioma do aplicativo"
+#: src/slic3r/GUI/GUI_App.cpp:587
+msgid ""
+"PrusaSlicer has encountered a localization error. Please report to PrusaSlicer "
+"team, what language was active and in which scenario this issue happened. "
+"Thank you.\n"
+"\n"
+"The application will now terminate."
+msgstr ""
+"PrusaSlicer encontrou um erro de localização. Informe a equipe PrusaSlicer, "
+"que idioma estava ativo e em que cenário esse problema aconteceu. Obrigado.\n"
+"\n"
+"O aplicativo será encerrado agora."
+
+#: src/slic3r/GUI/GUI_App.cpp:590
+msgid "Critical error"
+msgstr "Erro crítico"
+
+#: src/slic3r/GUI/GUI_App.cpp:711
+msgid ""
+"Error parsing PrusaSlicer config file, it is probably corrupted. Try to "
+"manually delete the file to recover from the error. Your user profiles will "
+"not be affected."
+msgstr ""
+"Erro de análise da config do arquivo, ele provavelmente está corrompido. Tente "
+"excluir manualmente o arquivo para recuperar do erro. Seus perfis de usuário "
+"não serão afetados."
-#: src/slic3r/GUI/GUI_App.cpp:454 src/slic3r/GUI/GUI_App.cpp:463
+#: src/slic3r/GUI/GUI_App.cpp:717
+msgid ""
+"Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to "
+"manually delete the file to recover from the error."
+msgstr ""
+"Erro de análise PrusaGCodeViewer, ele provavelmente está corrompido. Tente "
+"excluir manualmente o arquivo para recuperar do erro."
+
+#: src/slic3r/GUI/GUI_App.cpp:771
+#, c-format
+msgid ""
+"%s\n"
+"Do you want to continue?"
+msgstr ""
+"%s\n"
+"\vVocê tem certeza que deseja continuar?"
+
+#: src/slic3r/GUI/GUI_App.cpp:773 src/slic3r/GUI/UnsavedChangesDialog.cpp:665
+msgid "Remember my choice"
+msgstr "Lembrar minha escolha"
+
+#: src/slic3r/GUI/GUI_App.cpp:808
+msgid "Loading configuration"
+msgstr "Carregando configuração"
+
+#: src/slic3r/GUI/GUI_App.cpp:876
+msgid "Preparing settings tabs"
+msgstr "Preparando abas de configuração"
+
+#: src/slic3r/GUI/GUI_App.cpp:1115
+msgid ""
+"You have the following presets with saved options for \"Print Host upload\""
+msgstr ""
+"Você tem a seguinte predefinição com opções salvas para o \"Print Host upload\""
+
+#: src/slic3r/GUI/GUI_App.cpp:1119
+msgid ""
+"But since this version of PrusaSlicer we don't show this information in "
+"Printer Settings anymore.\n"
+"Settings will be available in physical printers settings."
+msgstr ""
+"Mas a partir dessa versão do PrusaSlicer, não mostramos esta informação nas "
+"Configurações de Impressora.\n"
+"Agora essa informação vai ser exposta em configurações das impressoras físicas."
+
+#: src/slic3r/GUI/GUI_App.cpp:1121
+msgid ""
+"By default new Printer devices will be named as \"Printer N\" during its "
+"creation.\n"
+"Note: This name can be changed later from the physical printers settings"
+msgstr ""
+"Por padrão, novas impressoras vão ser nomeadas como \"Printer N\" durante a "
+"sua criação.\n"
+"Nota: Esse nome pode ser alterado depois a partir das configurações de "
+"impressoras físicas"
+
+#: src/slic3r/GUI/GUI_App.cpp:1124 src/slic3r/GUI/PhysicalPrinterDialog.cpp:626
+msgid "Information"
+msgstr "Informação"
+
+#: src/slic3r/GUI/GUI_App.cpp:1137 src/slic3r/GUI/GUI_App.cpp:1148
msgid "Recreating"
msgstr "Recriando"
-#: src/slic3r/GUI/GUI_App.cpp:470
+#: src/slic3r/GUI/GUI_App.cpp:1153
msgid "Loading of current presets"
msgstr "Carregando presets"
-#: src/slic3r/GUI/GUI_App.cpp:478
+#: src/slic3r/GUI/GUI_App.cpp:1158
msgid "Loading of a mode view"
msgstr "Carregamento de um modelo de vista"
-#: src/slic3r/GUI/GUI_App.cpp:559
+#: src/slic3r/GUI/GUI_App.cpp:1234
msgid "Choose one file (3MF/AMF):"
msgstr "Escolha um arquivo (3MF/AMF):"
-#: src/slic3r/GUI/GUI_App.cpp:571
+#: src/slic3r/GUI/GUI_App.cpp:1246
msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):"
msgstr "Escolha um ou mais arquivos (STL/OBJ/AMF/3MF/PRUSA):"
-#: src/slic3r/GUI/GUI_App.cpp:633
+#: src/slic3r/GUI/GUI_App.cpp:1258
+msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):"
+msgstr "Escolha um arquivo (GCODE/.GCO/.G/.ngc/NGC):"
+
+#: src/slic3r/GUI/GUI_App.cpp:1269
+msgid "Changing of an application language"
+msgstr "Alteração de um idioma do aplicativo"
+
+#: src/slic3r/GUI/GUI_App.cpp:1392
msgid "Select the language"
-msgstr "Selecione a linguagem"
+msgstr "Selecione o idioma"
-#: src/slic3r/GUI/GUI_App.cpp:633
+#: src/slic3r/GUI/GUI_App.cpp:1392
msgid "Language"
-msgstr "Linguagem"
+msgstr "Idioma"
+
+#: src/slic3r/GUI/GUI_App.cpp:1541
+msgid "modified"
+msgstr "modificado"
-#: src/slic3r/GUI/GUI_App.cpp:801
+#: src/slic3r/GUI/GUI_App.cpp:1590
#, c-format
msgid "Run %s"
msgstr "Executar %s"
-#: src/slic3r/GUI/GUI_App.cpp:804
+#: src/slic3r/GUI/GUI_App.cpp:1594
msgid "&Configuration Snapshots"
-msgstr "&Captura das config."
+msgstr "&Captura das config"
-#: src/slic3r/GUI/GUI_App.cpp:804
+#: src/slic3r/GUI/GUI_App.cpp:1594
msgid "Inspect / activate configuration snapshots"
-msgstr "Inspecionar / ativar capturas de config."
+msgstr "Inspecionar / ativar capturas de config"
-#: src/slic3r/GUI/GUI_App.cpp:805
+#: src/slic3r/GUI/GUI_App.cpp:1595
msgid "Take Configuration &Snapshot"
-msgstr "Capturar &config."
+msgstr "Capturar &config"
-#: src/slic3r/GUI/GUI_App.cpp:805
+#: src/slic3r/GUI/GUI_App.cpp:1595
msgid "Capture a configuration snapshot"
-msgstr "Capturar uma config."
+msgstr "Capturar uma config"
-#: src/slic3r/GUI/GUI_App.cpp:806
+#: src/slic3r/GUI/GUI_App.cpp:1596
msgid "Check for updates"
msgstr "Verificar Atualizações"
-#: src/slic3r/GUI/GUI_App.cpp:806
+#: src/slic3r/GUI/GUI_App.cpp:1596
msgid "Check for configuration updates"
msgstr "Verificar atualizações nas aplicações"
-#: src/slic3r/GUI/GUI_App.cpp:808
+#: src/slic3r/GUI/GUI_App.cpp:1599
msgid "&Preferences"
msgstr "&Preferências"
-#: src/slic3r/GUI/GUI_App.cpp:814
+#: src/slic3r/GUI/GUI_App.cpp:1605
msgid "Application preferences"
msgstr "Preferências de aplicação"
-#: src/slic3r/GUI/GUI_App.cpp:817 src/slic3r/GUI/wxExtensions.cpp:756
+#: src/slic3r/GUI/GUI_App.cpp:1610 src/slic3r/GUI/wxExtensions.cpp:685
msgid "Simple"
msgstr "Simples"
-#: src/slic3r/GUI/GUI_App.cpp:817
+#: src/slic3r/GUI/GUI_App.cpp:1610
msgid "Simple View Mode"
msgstr "Modo simples de visualização"
-#: src/slic3r/GUI/GUI_App.cpp:818 src/slic3r/GUI/GUI_ObjectList.cpp:104
-#: src/slic3r/GUI/GUI_ObjectList.cpp:623 src/slic3r/GUI/Tab.cpp:1086
-#: src/slic3r/GUI/Tab.cpp:1101 src/slic3r/GUI/Tab.cpp:1200
-#: src/slic3r/GUI/Tab.cpp:1203 src/slic3r/GUI/Tab.cpp:1469
-#: src/slic3r/GUI/Tab.cpp:1969 src/slic3r/GUI/Tab.cpp:3665
-#: src/slic3r/GUI/wxExtensions.cpp:757 src/libslic3r/PrintConfig.cpp:88
-#: src/libslic3r/PrintConfig.cpp:119 src/libslic3r/PrintConfig.cpp:223
-#: src/libslic3r/PrintConfig.cpp:1037 src/libslic3r/PrintConfig.cpp:2276
-#: src/libslic3r/PrintConfig.cpp:2448
+#: src/slic3r/GUI/GUI_App.cpp:1612 src/slic3r/GUI/wxExtensions.cpp:687
+msgctxt "Mode"
msgid "Advanced"
msgstr "Avançado"
-#: src/slic3r/GUI/GUI_App.cpp:818
+#: src/slic3r/GUI/GUI_App.cpp:1612
msgid "Advanced View Mode"
msgstr "Modo avançado de visualização"
-#: src/slic3r/GUI/GUI_App.cpp:819 src/slic3r/GUI/wxExtensions.cpp:758
+#: src/slic3r/GUI/GUI_App.cpp:1613 src/slic3r/GUI/wxExtensions.cpp:688
msgid "Expert"
msgstr "Especialista"
-#: src/slic3r/GUI/GUI_App.cpp:819
+#: src/slic3r/GUI/GUI_App.cpp:1613
msgid "Expert View Mode"
msgstr "Modo especialista de visualização"
-#: src/slic3r/GUI/GUI_App.cpp:824
+#: src/slic3r/GUI/GUI_App.cpp:1618
msgid "Mode"
msgstr "Modo"
-#: src/slic3r/GUI/GUI_App.cpp:824
+#: src/slic3r/GUI/GUI_App.cpp:1618
#, c-format
msgid "%s View Mode"
msgstr "%s Modo de visualização"
-#: src/slic3r/GUI/GUI_App.cpp:826
+#: src/slic3r/GUI/GUI_App.cpp:1621
msgid "&Language"
msgstr "&Linguagem"
-#: src/slic3r/GUI/GUI_App.cpp:828
+#: src/slic3r/GUI/GUI_App.cpp:1624
msgid "Flash printer &firmware"
msgstr "Atualizar firmware &da impressora"
-#: src/slic3r/GUI/GUI_App.cpp:828
+#: src/slic3r/GUI/GUI_App.cpp:1624
msgid "Upload a firmware image into an Arduino based printer"
msgstr "Atualizar o firmware para uma impressora baseada em Arduino"
-#: src/slic3r/GUI/GUI_App.cpp:843
+#: src/slic3r/GUI/GUI_App.cpp:1640
msgid "Taking configuration snapshot"
-msgstr "Capturando a config."
+msgstr "Capturando a config"
-#: src/slic3r/GUI/GUI_App.cpp:843
+#: src/slic3r/GUI/GUI_App.cpp:1640
msgid "Snapshot name"
msgstr "Nome da captura"
-#: src/slic3r/GUI/GUI_App.cpp:886
+#: src/slic3r/GUI/GUI_App.cpp:1669
+msgid "Failed to activate configuration snapshot."
+msgstr "Falha ao ativar a captura de configuração."
+
+#: src/slic3r/GUI/GUI_App.cpp:1719
+msgid "Language selection"
+msgstr "Seleção de linguagem"
+
+#: src/slic3r/GUI/GUI_App.cpp:1721
msgid ""
"Switching the language will trigger application restart.\n"
"You will lose content of the plater."
@@ -2250,96 +2918,104 @@ msgstr ""
"Alterar a linguagem fará com que o aplicativo reinicie.\n"
"Você irá perder conteúdo na bandeja."
-#: src/slic3r/GUI/GUI_App.cpp:888
+#: src/slic3r/GUI/GUI_App.cpp:1723
msgid "Do you want to proceed?"
msgstr "Você quer prosseguir?"
-#: src/slic3r/GUI/GUI_App.cpp:889
-msgid "Language selection"
-msgstr "Seleção de linguagem"
-
-#: src/slic3r/GUI/GUI_App.cpp:912
+#: src/slic3r/GUI/GUI_App.cpp:1750
msgid "&Configuration"
msgstr "&Configuração"
-#: src/slic3r/GUI/GUI_App.cpp:936
-msgid "The presets on the following tabs were modified"
-msgstr "Os presets seguintes foram modificados"
+#: src/slic3r/GUI/GUI_App.cpp:1781
+msgid "The preset(s) modifications are successfully saved"
+msgstr "As modificações da(s) predefinição(ões) foram salvas com sucesso"
-#: src/slic3r/GUI/GUI_App.cpp:936 src/slic3r/GUI/Tab.cpp:2948
-msgid "Discard changes and continue anyway?"
-msgstr "Descartar mudanças e continuar assim mesmo?"
+#: src/slic3r/GUI/GUI_App.cpp:1802
+msgid "The uploads are still ongoing"
+msgstr "Os uploads ainda estão em andamento"
-#: src/slic3r/GUI/GUI_App.cpp:939
-msgid "Unsaved Presets"
-msgstr "config. não salvas"
+#: src/slic3r/GUI/GUI_App.cpp:1802
+msgid "Stop them and continue anyway?"
+msgstr "Pará-los e continuar assim mesmo?"
-#: src/slic3r/GUI/GUI_App.cpp:1088 src/slic3r/GUI/Tab.cpp:2960
+#: src/slic3r/GUI/GUI_App.cpp:1805
+msgid "Ongoing uploads"
+msgstr "Uploads em andamento"
+
+#: src/slic3r/GUI/GUI_App.cpp:2019 src/slic3r/GUI/Tab.cpp:3242
msgid "It's impossible to print multi-part object(s) with SLA technology."
-msgstr ""
-"É impossível imprimir objetos com múltiplas partes com a tecnologia SLA."
+msgstr "É impossível imprimir objetos com múltiplas partes com a tecnologia SLA."
-#: src/slic3r/GUI/GUI_App.cpp:1089
+#: src/slic3r/GUI/GUI_App.cpp:2020
msgid "Please check and fix your object list."
msgstr "Favor verificar e concertar sua lista de objetos."
-#: src/slic3r/GUI/GUI_App.cpp:1090 src/slic3r/GUI/Plater.cpp:2315
-#: src/slic3r/GUI/Tab.cpp:2962
+#: src/slic3r/GUI/GUI_App.cpp:2021 src/slic3r/GUI/Jobs/SLAImportJob.cpp:210
+#: src/slic3r/GUI/Plater.cpp:2359 src/slic3r/GUI/Tab.cpp:3244
msgid "Attention!"
msgstr "Atenção!"
-#: src/slic3r/GUI/GUI_App.cpp:1107
+#: src/slic3r/GUI/GUI_App.cpp:2038
msgid "Select a gcode file:"
msgstr "Selecione um arquivo gcode:"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27
+#: src/slic3r/GUI/GUI_Init.cpp:73 src/slic3r/GUI/GUI_Init.cpp:76
+msgid "PrusaSlicer GUI initialization failed"
+msgstr "Inicialização do PrusaSlicer GUI falhou"
+
+#: src/slic3r/GUI/GUI_Init.cpp:76
+msgid "Fatal error, exception catched: %1%"
+msgstr "Erro Fatal, exceção capturada: %1%"
+
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29
msgid "Start at height"
msgstr "Começar na altura"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:27
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29
msgid "Stop at height"
msgstr "Parar na altura"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:153
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:161
msgid "Remove layer range"
msgstr "Remover limite da camada"
-#: src/slic3r/GUI/GUI_ObjectLayers.cpp:162
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:165
msgid "Add layer range"
msgstr "Adicionar limite da camada"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:95
-#: src/slic3r/GUI/GUI_ObjectList.cpp:614 src/libslic3r/PrintConfig.cpp:72
-#: src/libslic3r/PrintConfig.cpp:175 src/libslic3r/PrintConfig.cpp:184
-#: src/libslic3r/PrintConfig.cpp:408 src/libslic3r/PrintConfig.cpp:470
-#: src/libslic3r/PrintConfig.cpp:478 src/libslic3r/PrintConfig.cpp:890
-#: src/libslic3r/PrintConfig.cpp:1075 src/libslic3r/PrintConfig.cpp:1374
-#: src/libslic3r/PrintConfig.cpp:1441 src/libslic3r/PrintConfig.cpp:1622
-#: src/libslic3r/PrintConfig.cpp:2074 src/libslic3r/PrintConfig.cpp:2133
-#: src/libslic3r/PrintConfig.cpp:2142
+#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:92
+#: src/slic3r/GUI/GUI_ObjectList.cpp:667 src/libslic3r/PrintConfig.cpp:74
+#: src/libslic3r/PrintConfig.cpp:189 src/libslic3r/PrintConfig.cpp:231
+#: src/libslic3r/PrintConfig.cpp:240 src/libslic3r/PrintConfig.cpp:464
+#: src/libslic3r/PrintConfig.cpp:530 src/libslic3r/PrintConfig.cpp:538
+#: src/libslic3r/PrintConfig.cpp:970 src/libslic3r/PrintConfig.cpp:1219
+#: src/libslic3r/PrintConfig.cpp:1584 src/libslic3r/PrintConfig.cpp:1650
+#: src/libslic3r/PrintConfig.cpp:1835 src/libslic3r/PrintConfig.cpp:2302
+#: src/libslic3r/PrintConfig.cpp:2361 src/libslic3r/PrintConfig.cpp:2370
msgid "Layers and Perimeters"
msgstr "Camadas e perímetros"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:97
-#: src/slic3r/GUI/GUI_ObjectList.cpp:616 src/slic3r/GUI/GUI_Preview.cpp:246
-#: src/slic3r/GUI/Tab.cpp:1119 src/slic3r/GUI/Tab.cpp:1120
-#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/PrintConfig.cpp:370
-#: src/libslic3r/PrintConfig.cpp:1502 src/libslic3r/PrintConfig.cpp:1866
-#: src/libslic3r/PrintConfig.cpp:1872 src/libslic3r/PrintConfig.cpp:1880
-#: src/libslic3r/PrintConfig.cpp:1892 src/libslic3r/PrintConfig.cpp:1902
-#: src/libslic3r/PrintConfig.cpp:1910 src/libslic3r/PrintConfig.cpp:1925
-#: src/libslic3r/PrintConfig.cpp:1946 src/libslic3r/PrintConfig.cpp:1958
-#: src/libslic3r/PrintConfig.cpp:1974 src/libslic3r/PrintConfig.cpp:1983
-#: src/libslic3r/PrintConfig.cpp:1992 src/libslic3r/PrintConfig.cpp:2003
-#: src/libslic3r/PrintConfig.cpp:2017 src/libslic3r/PrintConfig.cpp:2025
-#: src/libslic3r/PrintConfig.cpp:2026 src/libslic3r/PrintConfig.cpp:2035
-#: src/libslic3r/PrintConfig.cpp:2043 src/libslic3r/PrintConfig.cpp:2057
+#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:95
+#: src/slic3r/GUI/GUI_ObjectList.cpp:670 src/slic3r/GUI/GUI_Preview.cpp:240
+#: src/slic3r/GUI/Tab.cpp:1472 src/slic3r/GUI/Tab.cpp:1474
+#: src/libslic3r/ExtrusionEntity.cpp:320 src/libslic3r/ExtrusionEntity.cpp:352
+#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:1715
+#: src/libslic3r/PrintConfig.cpp:2093 src/libslic3r/PrintConfig.cpp:2099
+#: src/libslic3r/PrintConfig.cpp:2107 src/libslic3r/PrintConfig.cpp:2119
+#: src/libslic3r/PrintConfig.cpp:2129 src/libslic3r/PrintConfig.cpp:2137
+#: src/libslic3r/PrintConfig.cpp:2152 src/libslic3r/PrintConfig.cpp:2173
+#: src/libslic3r/PrintConfig.cpp:2185 src/libslic3r/PrintConfig.cpp:2201
+#: src/libslic3r/PrintConfig.cpp:2210 src/libslic3r/PrintConfig.cpp:2219
+#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2244
+#: src/libslic3r/PrintConfig.cpp:2252 src/libslic3r/PrintConfig.cpp:2253
+#: src/libslic3r/PrintConfig.cpp:2262 src/libslic3r/PrintConfig.cpp:2270
+#: src/libslic3r/PrintConfig.cpp:2284
msgid "Support material"
msgstr "Material de suporte"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:101
-#: src/slic3r/GUI/GUI_ObjectList.cpp:620 src/libslic3r/PrintConfig.cpp:2252
-#: src/libslic3r/PrintConfig.cpp:2260
+#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:99
+#: src/slic3r/GUI/GUI_ObjectList.cpp:674 src/libslic3r/PrintConfig.cpp:2480
+#: src/libslic3r/PrintConfig.cpp:2488
msgid "Wipe options"
msgstr "Opções de limpeza"
@@ -2363,611 +3039,663 @@ msgstr "Adicionar reforço de suporte"
msgid "Add support blocker"
msgstr "Adicionar bloqueador de suporte"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:617
-#: src/slic3r/GUI/GUI_Preview.cpp:224 src/slic3r/GUI/Tab.cpp:1144
-#: src/libslic3r/PrintConfig.cpp:235 src/libslic3r/PrintConfig.cpp:458
-#: src/libslic3r/PrintConfig.cpp:919 src/libslic3r/PrintConfig.cpp:1048
-#: src/libslic3r/PrintConfig.cpp:1431 src/libslic3r/PrintConfig.cpp:1668
-#: src/libslic3r/PrintConfig.cpp:1716 src/libslic3r/PrintConfig.cpp:1768
-#: src/libslic3r/PrintConfig.cpp:2118
+#: src/slic3r/GUI/GUI_ObjectList.cpp:94 src/slic3r/GUI/GUI_ObjectList.cpp:669
+#: src/slic3r/GUI/GUI_Preview.cpp:236 src/slic3r/GUI/Tab.cpp:1442
+#: src/libslic3r/ExtrusionEntity.cpp:316 src/libslic3r/ExtrusionEntity.cpp:344
+#: src/libslic3r/PrintConfig.cpp:1226 src/libslic3r/PrintConfig.cpp:1232
+#: src/libslic3r/PrintConfig.cpp:1246 src/libslic3r/PrintConfig.cpp:1256
+#: src/libslic3r/PrintConfig.cpp:1264 src/libslic3r/PrintConfig.cpp:1266
+msgid "Ironing"
+msgstr "Passar ferro"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:671
+#: src/slic3r/GUI/GUI_Preview.cpp:217 src/slic3r/GUI/Tab.cpp:1498
+#: src/libslic3r/PrintConfig.cpp:291 src/libslic3r/PrintConfig.cpp:518
+#: src/libslic3r/PrintConfig.cpp:1012 src/libslic3r/PrintConfig.cpp:1192
+#: src/libslic3r/PrintConfig.cpp:1265 src/libslic3r/PrintConfig.cpp:1640
+#: src/libslic3r/PrintConfig.cpp:1916 src/libslic3r/PrintConfig.cpp:1968
+#: src/libslic3r/PrintConfig.cpp:2346
msgid "Speed"
msgstr "Velocidade"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:99 src/slic3r/GUI/GUI_ObjectList.cpp:618
-#: src/slic3r/GUI/Tab.cpp:1179 src/slic3r/GUI/Tab.cpp:1840
-#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:1002
-#: src/libslic3r/PrintConfig.cpp:1409 src/libslic3r/PrintConfig.cpp:1737
-#: src/libslic3r/PrintConfig.cpp:1938 src/libslic3r/PrintConfig.cpp:1965
+#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:672
+#: src/slic3r/GUI/Tab.cpp:1534 src/slic3r/GUI/Tab.cpp:2112
+#: src/libslic3r/PrintConfig.cpp:548 src/libslic3r/PrintConfig.cpp:1146
+#: src/libslic3r/PrintConfig.cpp:1618 src/libslic3r/PrintConfig.cpp:1937
+#: src/libslic3r/PrintConfig.cpp:2165 src/libslic3r/PrintConfig.cpp:2192
msgid "Extruders"
msgstr "Exrtrusoras"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:100 src/slic3r/GUI/GUI_ObjectList.cpp:619
-#: src/libslic3r/PrintConfig.cpp:447 src/libslic3r/PrintConfig.cpp:555
-#: src/libslic3r/PrintConfig.cpp:877 src/libslic3r/PrintConfig.cpp:1010
-#: src/libslic3r/PrintConfig.cpp:1418 src/libslic3r/PrintConfig.cpp:1757
-#: src/libslic3r/PrintConfig.cpp:1947 src/libslic3r/PrintConfig.cpp:2106
+#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:673
+#: src/libslic3r/PrintConfig.cpp:507 src/libslic3r/PrintConfig.cpp:616
+#: src/libslic3r/PrintConfig.cpp:957 src/libslic3r/PrintConfig.cpp:1154
+#: src/libslic3r/PrintConfig.cpp:1627 src/libslic3r/PrintConfig.cpp:1957
+#: src/libslic3r/PrintConfig.cpp:2174 src/libslic3r/PrintConfig.cpp:2334
msgid "Extrusion Width"
msgstr "Espessura da extrusão"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/GUI_ObjectList.cpp:625
-#: src/slic3r/GUI/Plater.cpp:495 src/slic3r/GUI/Tab.cpp:3606
-#: src/slic3r/GUI/Tab.cpp:3607 src/libslic3r/PrintConfig.cpp:2614
-#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2630
-#: src/libslic3r/PrintConfig.cpp:2639 src/libslic3r/PrintConfig.cpp:2649
-#: src/libslic3r/PrintConfig.cpp:2685 src/libslic3r/PrintConfig.cpp:2692
-#: src/libslic3r/PrintConfig.cpp:2703 src/libslic3r/PrintConfig.cpp:2713
-#: src/libslic3r/PrintConfig.cpp:2722 src/libslic3r/PrintConfig.cpp:2735
-#: src/libslic3r/PrintConfig.cpp:2745 src/libslic3r/PrintConfig.cpp:2754
-#: src/libslic3r/PrintConfig.cpp:2764 src/libslic3r/PrintConfig.cpp:2775
-#: src/libslic3r/PrintConfig.cpp:2783
+#: src/slic3r/GUI/GUI_ObjectList.cpp:102 src/slic3r/GUI/GUI_ObjectList.cpp:677
+#: src/slic3r/GUI/Tab.cpp:1428 src/slic3r/GUI/Tab.cpp:1452
+#: src/slic3r/GUI/Tab.cpp:1555 src/slic3r/GUI/Tab.cpp:1558
+#: src/slic3r/GUI/Tab.cpp:1855 src/slic3r/GUI/Tab.cpp:2197
+#: src/slic3r/GUI/Tab.cpp:4114 src/libslic3r/PrintConfig.cpp:92
+#: src/libslic3r/PrintConfig.cpp:132 src/libslic3r/PrintConfig.cpp:279
+#: src/libslic3r/PrintConfig.cpp:1097 src/libslic3r/PrintConfig.cpp:1181
+#: src/libslic3r/PrintConfig.cpp:2504 src/libslic3r/PrintConfig.cpp:2676
+msgid "Advanced"
+msgstr "Avançado"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:679
+#: src/slic3r/GUI/Plater.cpp:357 src/slic3r/GUI/Tab.cpp:4048
+#: src/slic3r/GUI/Tab.cpp:4049 src/libslic3r/PrintConfig.cpp:2842
+#: src/libslic3r/PrintConfig.cpp:2849 src/libslic3r/PrintConfig.cpp:2858
+#: src/libslic3r/PrintConfig.cpp:2867 src/libslic3r/PrintConfig.cpp:2877
+#: src/libslic3r/PrintConfig.cpp:2887 src/libslic3r/PrintConfig.cpp:2924
+#: src/libslic3r/PrintConfig.cpp:2931 src/libslic3r/PrintConfig.cpp:2942
+#: src/libslic3r/PrintConfig.cpp:2952 src/libslic3r/PrintConfig.cpp:2961
+#: src/libslic3r/PrintConfig.cpp:2974 src/libslic3r/PrintConfig.cpp:2984
+#: src/libslic3r/PrintConfig.cpp:2993 src/libslic3r/PrintConfig.cpp:3003
+#: src/libslic3r/PrintConfig.cpp:3014 src/libslic3r/PrintConfig.cpp:3022
msgid "Supports"
msgstr "Suportes"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:107 src/slic3r/GUI/GUI_ObjectList.cpp:626
-#: src/slic3r/GUI/Plater.cpp:635 src/slic3r/GUI/Tab.cpp:3640
-#: src/slic3r/GUI/Tab.cpp:3641 src/libslic3r/PrintConfig.cpp:2791
-#: src/libslic3r/PrintConfig.cpp:2798 src/libslic3r/PrintConfig.cpp:2812
-#: src/libslic3r/PrintConfig.cpp:2823 src/libslic3r/PrintConfig.cpp:2833
-#: src/libslic3r/PrintConfig.cpp:2855 src/libslic3r/PrintConfig.cpp:2866
-#: src/libslic3r/PrintConfig.cpp:2873 src/libslic3r/PrintConfig.cpp:2880
-#: src/libslic3r/PrintConfig.cpp:2891 src/libslic3r/PrintConfig.cpp:2900
-#: src/libslic3r/PrintConfig.cpp:2909
+#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:680
+#: src/slic3r/GUI/Plater.cpp:500 src/slic3r/GUI/Tab.cpp:4089
+#: src/slic3r/GUI/Tab.cpp:4090 src/slic3r/GUI/Tab.cpp:4161
+#: src/libslic3r/PrintConfig.cpp:3030 src/libslic3r/PrintConfig.cpp:3037
+#: src/libslic3r/PrintConfig.cpp:3051 src/libslic3r/PrintConfig.cpp:3062
+#: src/libslic3r/PrintConfig.cpp:3072 src/libslic3r/PrintConfig.cpp:3094
+#: src/libslic3r/PrintConfig.cpp:3105 src/libslic3r/PrintConfig.cpp:3112
+#: src/libslic3r/PrintConfig.cpp:3119 src/libslic3r/PrintConfig.cpp:3130
+#: src/libslic3r/PrintConfig.cpp:3139 src/libslic3r/PrintConfig.cpp:3148
msgid "Pad"
msgstr "Bloco"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:108 src/slic3r/GUI/Tab.cpp:3658
-#: src/slic3r/GUI/Tab.cpp:3659 src/libslic3r/SLA/Hollowing.cpp:46
-#: src/libslic3r/SLA/Hollowing.cpp:58 src/libslic3r/SLA/Hollowing.cpp:67
-#: src/libslic3r/SLA/Hollowing.cpp:76 src/libslic3r/PrintConfig.cpp:2919
-#: src/libslic3r/PrintConfig.cpp:2926 src/libslic3r/PrintConfig.cpp:2936
-#: src/libslic3r/PrintConfig.cpp:2945
+#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:4107
+#: src/slic3r/GUI/Tab.cpp:4108 src/libslic3r/SLA/Hollowing.cpp:45
+#: src/libslic3r/SLA/Hollowing.cpp:57 src/libslic3r/SLA/Hollowing.cpp:66
+#: src/libslic3r/SLA/Hollowing.cpp:75 src/libslic3r/PrintConfig.cpp:3158
+#: src/libslic3r/PrintConfig.cpp:3165 src/libslic3r/PrintConfig.cpp:3175
+#: src/libslic3r/PrintConfig.cpp:3184
msgid "Hollowing"
msgstr "Deixar oco"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:270
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:153
+#: src/slic3r/GUI/GUI_ObjectList.cpp:300
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:161
msgid "Name"
msgstr "Nome"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:278 src/slic3r/GUI/Tab.cpp:1433
-#: src/slic3r/GUI/wxExtensions.cpp:598 src/libslic3r/PrintConfig.cpp:487
-msgid "Extruder"
-msgstr "Extrusora"
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:282 src/slic3r/GUI/GUI_ObjectList.cpp:395
+#: src/slic3r/GUI/GUI_ObjectList.cpp:316 src/slic3r/GUI/GUI_ObjectList.cpp:457
msgid "Editing"
msgstr "Edição"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:340
+#: src/slic3r/GUI/GUI_ObjectList.cpp:402
#, c-format
msgid "Auto-repaired (%d errors):"
msgstr "Auto reparando (%d erros):"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:347
+#: src/slic3r/GUI/GUI_ObjectList.cpp:409
msgid "degenerate facets"
msgstr "facetas degeneradas"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:348
+#: src/slic3r/GUI/GUI_ObjectList.cpp:410
msgid "edges fixed"
msgstr "arestas fixadas"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:349
+#: src/slic3r/GUI/GUI_ObjectList.cpp:411
msgid "facets removed"
msgstr "facetas removidas"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:350
+#: src/slic3r/GUI/GUI_ObjectList.cpp:412
msgid "facets added"
msgstr "facetas adicionadas"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:351
+#: src/slic3r/GUI/GUI_ObjectList.cpp:413
msgid "facets reversed"
-msgstr "facetas reversidas"
+msgstr "facetas revertidas"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:352
+#: src/slic3r/GUI/GUI_ObjectList.cpp:414
msgid "backwards edges"
msgstr "arestas viradas para trás"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:360
+#: src/slic3r/GUI/GUI_ObjectList.cpp:422
msgid "Right button click the icon to fix STL through Netfabb"
-msgstr ""
-"Clique com o botão direito no ícone para arrumar STL através do Netfabb"
+msgstr "Clique com o botão direito no ícone para arrumar STL através do Netfabb"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:397
+#: src/slic3r/GUI/GUI_ObjectList.cpp:459
msgid "Right button click the icon to change the object settings"
msgstr "Clique com o botão direito no ícone para mudar as config. do objeto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:399
+#: src/slic3r/GUI/GUI_ObjectList.cpp:461
msgid "Click the icon to change the object settings"
msgstr "Clique no ícone para mudar as config. do objeto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:403
+#: src/slic3r/GUI/GUI_ObjectList.cpp:465
msgid "Right button click the icon to change the object printable property"
msgstr ""
"Clique com o botão direito no ícone para mudar a propriedade de impressão do "
"objeto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:405
+#: src/slic3r/GUI/GUI_ObjectList.cpp:467
msgid "Click the icon to change the object printable property"
msgstr "Clique no ícone para mudar a propriedade de impressão do objeto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:458 src/slic3r/GUI/GUI_ObjectList.cpp:470
-#: src/slic3r/GUI/GUI_ObjectList.cpp:918 src/slic3r/GUI/GUI_ObjectList.cpp:3968
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3978
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4013
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:200
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:257
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:282
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:490
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:1753
-msgid "default"
-msgstr "padrão"
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:537
+#: src/slic3r/GUI/GUI_ObjectList.cpp:590
msgid "Change Extruder"
msgstr "Mudar extrusora"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:552
+#: src/slic3r/GUI/GUI_ObjectList.cpp:605
msgid "Rename Object"
msgstr "Renomear objeto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:552
+#: src/slic3r/GUI/GUI_ObjectList.cpp:605
msgid "Rename Sub-object"
msgstr "Renomear sub-objeto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1092
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3782
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1247 src/slic3r/GUI/GUI_ObjectList.cpp:4372
msgid "Instances to Separated Objects"
msgstr "Instâncias para separar objetos"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1107
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1262
msgid "Volumes in Object reordered"
msgstr "Volume reorganizados no objeto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1107
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1262
msgid "Object reordered"
msgstr "Objeto reorganizado"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1183
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1531
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1537
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1850
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1338 src/slic3r/GUI/GUI_ObjectList.cpp:1693
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1699 src/slic3r/GUI/GUI_ObjectList.cpp:2081
#, c-format
msgid "Quick Add Settings (%s)"
msgstr "Adicionar config. rapidamente (%s)"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1266
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1428
msgid "Select showing settings"
msgstr "Selecionar config. mostradas"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1315
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1477
msgid "Add Settings for Layers"
msgstr "Adicionar config. para camadas"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1316
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1478
msgid "Add Settings for Sub-object"
msgstr "Adicionar config. para sub-objetos"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1317
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1479
msgid "Add Settings for Object"
msgstr "Adicionar config. para objetos"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1387
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1549
msgid "Add Settings Bundle for Height range"
msgstr "Adicionar pacote de config. para intervalo de altura"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1388
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1550
msgid "Add Settings Bundle for Sub-object"
msgstr "Adicionar pacote de config. para subobjeto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1389
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1551
msgid "Add Settings Bundle for Object"
msgstr "Adicionar pacote de config. para objeto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1428
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1590
msgid "Load"
msgstr "Carregar"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1433
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1465
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1469
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1595 src/slic3r/GUI/GUI_ObjectList.cpp:1627
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1631
msgid "Box"
msgstr "Caixa"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1433
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1595
msgid "Cylinder"
msgstr "Cilindro"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1433
-msgid "Sphere"
-msgstr "Esfera"
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1433
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1595
msgid "Slab"
msgstr "Placa"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1501
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1663
msgid "Height range Modifier"
msgstr "Modificador de intervalo de altura"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1510
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1672
msgid "Add settings"
-msgstr "Adicionar config."
+msgstr "Adicionar config"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1590
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1750
msgid "Change type"
msgstr "Mudar o tipo"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1600
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1612
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1760 src/slic3r/GUI/GUI_ObjectList.cpp:1772
msgid "Set as a Separated Object"
msgstr "Configurar como objeto separado"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1612
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1772
msgid "Set as a Separated Objects"
msgstr "Definir como objetos separados"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1622
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1782
msgid "Printable"
msgstr "Imprimível"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1637
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1797
msgid "Rename"
msgstr "Renomear"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1648
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1808
msgid "Fix through the Netfabb"
msgstr "Arrumar através do Netfabb"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1658 src/slic3r/GUI/Plater.cpp:3968
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1818 src/slic3r/GUI/Plater.cpp:4035
msgid "Export as STL"
msgstr "Exportar como STL"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1665
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3957 src/slic3r/GUI/Plater.cpp:3936
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1825 src/slic3r/GUI/GUI_ObjectList.cpp:4567
+#: src/slic3r/GUI/Plater.cpp:4001
msgid "Reload the selected volumes from disk"
msgstr "Recarregue os volumes selecionados do disco"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1672
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1832
msgid "Set extruder for selected items"
msgstr "Definir extrusora para itens selecionados"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1705 src/libslic3r/PrintConfig.cpp:335
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1864 src/libslic3r/PrintConfig.cpp:391
msgid "Default"
msgstr "Padrão"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1725
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1884
msgid "Scale to print volume"
msgstr "Escalar para volume de impressão"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1725
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1884
msgid "Scale the selected object to fit the print volume"
msgstr "Escale o objeto selecionado para se adequar ao volume de impressão"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1794
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2052
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1913 src/slic3r/GUI/Plater.cpp:5224
+msgid "Convert from imperial units"
+msgstr "Converter de unidades imperiais"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1915 src/slic3r/GUI/Plater.cpp:5224
+msgid "Revert conversion from imperial units"
+msgstr "Reverter conversão de unidades imperiais"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1944 src/slic3r/GUI/GUI_ObjectList.cpp:1952
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2630 src/libslic3r/PrintConfig.cpp:3730
+msgid "Merge"
+msgstr "Mesclar"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1944
+msgid "Merge objects to the one multipart object"
+msgstr "Mesclar objetos para um objeto multiparte"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1952
+msgid "Merge objects to the one single object"
+msgstr "Mesclar objetos para um único objeto"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2026 src/slic3r/GUI/GUI_ObjectList.cpp:2283
msgid "Add Shape"
msgstr "Adicionar forma"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1880
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2111
msgid "Load Part"
msgstr "Carregar parte"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1919
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2150
msgid "Error!"
msgstr "Erro!"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:1994
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2225
msgid "Add Generic Subobject"
msgstr "Adicionar sub-objeto genérico"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2023
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2254
msgid "Generic"
msgstr "Genérico"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2141
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2243
-msgid "Last instance of an object cannot be deleted."
-msgstr "A última instância de um objeto não pode ser excluída."
-
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2153
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2380
msgid "Delete Settings"
-msgstr "Deletar config."
+msgstr "Deletar config"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2177
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2402
msgid "Delete All Instances from Object"
msgstr "Excluir todas as instâncias do objeto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2193
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2418
msgid "Delete Height Range"
msgstr "Excluir limite de altura"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2224
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2450
msgid "From Object List You can't delete the last solid part from object."
msgstr ""
"Na lista de objetos não é possível excluir a última parte sólida do objeto."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2228
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2454
msgid "Delete Subobject"
msgstr "Deletar sub-objeto"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2247
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2469
+msgid "Last instance of an object cannot be deleted."
+msgstr "A última instância de um objeto não pode ser excluída."
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2473
msgid "Delete Instance"
msgstr "Deletar instância"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2271 src/slic3r/GUI/Plater.cpp:2980
-msgid ""
-"The selected object couldn't be split because it contains only one part."
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2497 src/slic3r/GUI/Plater.cpp:2865
+msgid "The selected object couldn't be split because it contains only one part."
msgstr "O seguinte objeto não pode ser dividido pois contém uma parte."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2275
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2501
msgid "Split to Parts"
msgstr "Dividir em partes"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2329
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2637
+msgid "Merged"
+msgstr "Mesclado"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2721
+msgid "Merge all parts to the one single object"
+msgstr "Mesclar todas partes para um único objeto"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2753
msgid "Add Layers"
msgstr "Adicionar camadas"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2455
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2907
msgid "Group manipulation"
msgstr "Manipulação de grupos"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2467
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2919
msgid "Object manipulation"
msgstr "Manipulação de objetos"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2480
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2932
msgid "Object Settings to modify"
-msgstr "config. do objeto para modificar"
+msgstr "Config. do objeto para modificar"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2484
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2936
msgid "Part Settings to modify"
-msgstr "config. da parte para modificar"
+msgstr "Config. da parte para modificar"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2489
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2941
msgid "Layer range Settings to modify"
-msgstr "config. de intervalo de camada para modificar"
+msgstr "Config. de intervalo de camada para modificar"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2495
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2947
msgid "Part manipulation"
msgstr "Manipulação da parte"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2501
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2953
msgid "Instance manipulation"
msgstr "Manipulação da instância"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2508
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2960
msgid "Height ranges"
msgstr "Limites de altura"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2508
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2960
msgid "Settings for height range"
-msgstr "config. para intervalo de altura"
+msgstr "Config. para intervalo de altura"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2694
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3144
msgid "Delete Selected Item"
msgstr "Excluir item selecionado"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2831
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3332
msgid "Delete Selected"
msgstr "Excluir seleção"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2897
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2926
-#: src/slic3r/GUI/GUI_ObjectList.cpp:2944
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3408 src/slic3r/GUI/GUI_ObjectList.cpp:3436
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3456
msgid "Add Height Range"
msgstr "Adicionar intervalo de altura"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3004
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3502
+msgid ""
+"Cannot insert a new layer range after the current layer range.\n"
+"The next layer range is too thin to be split to two\n"
+"without violating the minimum layer height."
+msgstr ""
+"Não é possível inserir um novo intervalo de camada após o atual intervalo de "
+"camada\n"
+"O próximo intervalo de camada é muito fino para ser separado em dois\n"
+"sem violar a altura mínima de camada."
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3506
+msgid ""
+"Cannot insert a new layer range between the current and the next layer range.\n"
+"The gap between the current layer range and the next layer range\n"
+"is thinner than the minimum layer height allowed."
+msgstr ""
+"Não é possível inserir um novo intervalo de camada entre o atual e o próximo "
+"intervalo de camada.\n"
+"O vão entre o atual intervalo de camada e o próximo intervalo de camada\n"
+"é mais fino que a altura de camada mínima permitida."
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3511
+msgid ""
+"Cannot insert a new layer range after the current layer range.\n"
+"Current layer range overlaps with the next layer range."
+msgstr ""
+"Não é possível inserir um novo intervalo de camada após o atual intervalo de "
+"camada\n"
+"Intervalo de altura atual se sobrepões com o próximo intervalo."
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3570
msgid "Edit Height Range"
msgstr "Editar intervalo de altura"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3292
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3865
msgid "Selection-Remove from list"
msgstr "Seleção-Remover da lista"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3300
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3873
msgid "Selection-Add from list"
msgstr "Seleção-Adicionar da lista"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3418
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4008
msgid "Object or Instance"
msgstr "Objeto ou instância"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3419
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3552
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4009 src/slic3r/GUI/GUI_ObjectList.cpp:4142
msgid "Part"
msgstr "Parte"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3419
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4009
msgid "Layer"
msgstr "Camada"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3421
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4011
msgid "Unsupported selection"
msgstr "Seleção não suportada"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3422
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4012
#, c-format
msgid "You started your selection with %s Item."
msgstr "Você iniciou sua seleção com o item de %s."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3423
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4013
#, c-format
msgid "In this mode you can select only other %s Items%s"
msgstr "Neste modo, você pode selecionar apenas outros %s itens%s"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3426
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4016
msgid "of a current Object"
msgstr "de um objeto atual"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3431
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3506 src/slic3r/GUI/Plater.cpp:141
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4021 src/slic3r/GUI/GUI_ObjectList.cpp:4096
+#: src/slic3r/GUI/Plater.cpp:143
msgid "Info"
msgstr "Informação"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3547
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4137
msgid "You can't change a type of the last solid part of the object."
msgstr "Não é possível alterar um tipo da última parte sólida do objeto."
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3552
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4142
msgid "Modifier"
msgstr "Modificador"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3552
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4142
msgid "Support Enforcer"
msgstr "Reforçador de suporte"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3552
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4142
msgid "Support Blocker"
msgstr "Bloqueador de suporte"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3554
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4144
msgid "Select type of part"
msgstr "Selecione o tipo de parte"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3559
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4149
msgid "Change Part Type"
msgstr "Mudar o tipo da parte"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3804
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4394
msgid "Enter new name"
msgstr "Insira o novo nome"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3804
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4394
msgid "Renaming"
msgstr "Renomeando"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3820
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3927 src/slic3r/GUI/Tab.cpp:3458
-#: src/slic3r/GUI/Tab.cpp:3462
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4410 src/slic3r/GUI/GUI_ObjectList.cpp:4537
+#: src/slic3r/GUI/SavePresetDialog.cpp:101
+#: src/slic3r/GUI/SavePresetDialog.cpp:109
msgid "The supplied name is not valid;"
msgstr "O nome inserido não é valido;"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3821
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3928 src/slic3r/GUI/Tab.cpp:3459
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4411 src/slic3r/GUI/GUI_ObjectList.cpp:4538
+#: src/slic3r/GUI/SavePresetDialog.cpp:102
msgid "the following characters are not allowed:"
msgstr "os seguintes caracteres não são permitidos:"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3972
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4586
msgid "Select extruder number:"
msgstr "Selecione o número da extrusora:"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3973
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4587
msgid "This extruder will be set for selected items"
msgstr "Esta extrusora será ajustada para artigos selecionados"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:3998
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4612
msgid "Change Extruders"
msgstr "Mudar extrusoras"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4095 src/slic3r/GUI/Selection.cpp:1475
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4709 src/slic3r/GUI/Selection.cpp:1485
msgid "Set Printable"
msgstr "Definir como imprimível"
-#: src/slic3r/GUI/GUI_ObjectList.cpp:4095 src/slic3r/GUI/Selection.cpp:1475
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4709 src/slic3r/GUI/Selection.cpp:1485
msgid "Set Unprintable"
msgstr "Definir não imprimível"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:62
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:105
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:68
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:111
msgid "World coordinates"
msgstr "Coordenadas mundiais"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:63
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:106
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:69
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:112
msgid "Local coordinates"
msgstr "Coordenadas locais"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:82
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:88
msgid "Select coordinate space, in which the transformation will be performed."
msgstr ""
"Selecione o espaço de coordenadas, no qual a transformação será executada."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:155 src/libslic3r/GCode.cpp:638
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:163 src/libslic3r/GCode.cpp:537
msgid "Object name"
msgstr "Nome do objeto"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:215
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:457
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:223
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:505
msgid "Position"
msgstr "Posição"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:216
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:458
-#: src/slic3r/GUI/Mouse3DController.cpp:271
-#: src/slic3r/GUI/Mouse3DController.cpp:294
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:224
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:506
+#: src/slic3r/GUI/Mouse3DController.cpp:486
+#: src/slic3r/GUI/Mouse3DController.cpp:507
msgid "Rotation"
msgstr "Rotação"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:263
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:271
#, c-format
msgid "Toggle %c axis mirroring"
msgstr "Ativar espelhamento do eixo %c"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:297
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:305
msgid "Set Mirror"
msgstr "Definir espelhamento"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:337
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:349
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:345
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:357
msgid "Drop to bed"
msgstr "Soltar na mesa"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:363
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:372
msgid "Reset rotation"
msgstr "Restabelecer rotação"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:385
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:394
msgid "Reset Rotation"
msgstr "Restabelecer Rotação"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:397
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:399
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:407
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409
msgid "Reset scale"
msgstr "Restabelecer escala"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:459
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:423
+msgid "Inches"
+msgstr "Polegadas"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:507
msgid "Scale factors"
msgstr "Fatores de escala"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:516
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:561
msgid "Translate"
msgstr "Tradução"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:578
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:625
msgid ""
"You cannot use non-uniform scaling mode for multiple objects/parts selection"
msgstr ""
-"Não é possível usar o modo de dimensionamento não uniforme para vários "
-"objetos/seleção de peças"
+"Não é possível usar o modo de dimensionamento não uniforme para vários objetos/"
+"seleção de peças"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:750
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:797
msgid "Set Position"
msgstr "Definir posição"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:781
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:828
msgid "Set Orientation"
msgstr "Definir orientação"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:846
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:893
msgid "Set Scale"
msgstr "Definir escala"
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:875
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:925
msgid ""
-"The currently manipulated object is tilted (rotation angles are not "
-"multiples of 90°).\n"
-"Non-uniform scaling of tilted objects is only possible in the World "
-"coordinate system,\n"
+"The currently manipulated object is tilted (rotation angles are not multiples "
+"of 90°).\n"
+"Non-uniform scaling of tilted objects is only possible in the World coordinate "
+"system,\n"
"once the rotation is embedded into the object coordinates."
msgstr ""
"O objeto atualmente manipulado é inclinado (os ângulos de rotação não são "
"múltiplos de 90 °).\n"
-"O dimensionamento não uniforme de objetos inclinados só é possível no "
-"sistema de coordenadas do mundo,\n"
+"O dimensionamento não uniforme de objetos inclinados só é possível no sistema "
+"de coordenadas mundiais,\n"
"uma vez que a rotação é incorporada nas coordenadas do objeto."
-#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:878
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:928
msgid ""
"This operation is irreversible.\n"
"Do you want to proceed?"
@@ -2975,396 +3703,504 @@ msgstr ""
"Esta operação é irreversível.\n"
"Você quer prosseguir?"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:59
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:62
msgid "Additional Settings"
-msgstr "config. Adicionais"
+msgstr "Config. Adicionais"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:95
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:98
msgid "Remove parameter"
msgstr "Remover parâmetro"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:101
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:104
#, c-format
msgid "Delete Option %s"
msgstr "Excluir opção %s"
-#: src/slic3r/GUI/GUI_ObjectSettings.cpp:152
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:157
#, c-format
msgid "Change Option %s"
msgstr "Alterar opção %s"
-#: src/slic3r/GUI/GUI_Preview.cpp:218
+#: src/slic3r/GUI/GUI_Preview.cpp:212
msgid "View"
msgstr "Vista"
-#: src/slic3r/GUI/GUI_Preview.cpp:221 src/slic3r/GUI/GUI_Preview.cpp:575
-#: src/libslic3r/GCode/PreviewData.cpp:345
-msgid "Feature type"
-msgstr "Tipo de recurso"
-
-#: src/slic3r/GUI/GUI_Preview.cpp:222 src/libslic3r/PrintConfig.cpp:500
+#: src/slic3r/GUI/GUI_Preview.cpp:215 src/libslic3r/PrintConfig.cpp:560
msgid "Height"
msgstr "Altura"
-#: src/slic3r/GUI/GUI_Preview.cpp:223 src/libslic3r/PrintConfig.cpp:2238
+#: src/slic3r/GUI/GUI_Preview.cpp:216 src/libslic3r/PrintConfig.cpp:2466
msgid "Width"
msgstr "Espessura"
-#: src/slic3r/GUI/GUI_Preview.cpp:225 src/slic3r/GUI/Tab.cpp:1456
+#: src/slic3r/GUI/GUI_Preview.cpp:218 src/slic3r/GUI/Tab.cpp:1840
msgid "Fan speed"
msgstr "Velocidade do ventoinha"
-#: src/slic3r/GUI/GUI_Preview.cpp:226
+#: src/slic3r/GUI/GUI_Preview.cpp:219
msgid "Volumetric flow rate"
msgstr "Taxa de fluxo volumétrico"
-#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/GUI_Preview.cpp:335
-#: src/slic3r/GUI/GUI_Preview.cpp:519 src/slic3r/GUI/GUI_Preview.cpp:574
-#: src/slic3r/GUI/GUI_Preview.cpp:835 src/libslic3r/GCode/PreviewData.cpp:357
-msgid "Tool"
-msgstr "Ferramenta"
-
-#: src/slic3r/GUI/GUI_Preview.cpp:228 src/slic3r/GUI/GUI_Preview.cpp:572
-#: src/libslic3r/GCode/PreviewData.cpp:359
-msgid "Color Print"
-msgstr "Impressão colorida"
-
-#: src/slic3r/GUI/GUI_Preview.cpp:231
+#: src/slic3r/GUI/GUI_Preview.cpp:224
msgid "Show"
msgstr "Mostrar"
-#: src/slic3r/GUI/GUI_Preview.cpp:234 src/slic3r/GUI/GUI_Preview.cpp:235
+#: src/slic3r/GUI/GUI_Preview.cpp:227 src/slic3r/GUI/GUI_Preview.cpp:245
msgid "Feature types"
msgstr "Tipos de características"
-#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:310
+#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/ExtrusionEntity.cpp:310
+#: src/libslic3r/ExtrusionEntity.cpp:332
msgid "Perimeter"
msgstr "Perímetro"
-#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:311
+#: src/slic3r/GUI/GUI_Preview.cpp:231 src/libslic3r/ExtrusionEntity.cpp:311
+#: src/libslic3r/ExtrusionEntity.cpp:334
msgid "External perimeter"
msgstr "Perímetro externo"
-#: src/slic3r/GUI/GUI_Preview.cpp:239 src/libslic3r/ExtrusionEntity.cpp:312
+#: src/slic3r/GUI/GUI_Preview.cpp:232 src/libslic3r/ExtrusionEntity.cpp:312
+#: src/libslic3r/ExtrusionEntity.cpp:336
msgid "Overhang perimeter"
msgstr "Perímetro de angulação"
-#: src/slic3r/GUI/GUI_Preview.cpp:240 src/libslic3r/ExtrusionEntity.cpp:313
+#: src/slic3r/GUI/GUI_Preview.cpp:233 src/libslic3r/ExtrusionEntity.cpp:313
+#: src/libslic3r/ExtrusionEntity.cpp:338
msgid "Internal infill"
msgstr "Preenchimento interno"
-#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:314
-#: src/libslic3r/PrintConfig.cpp:1756 src/libslic3r/PrintConfig.cpp:1767
+#: src/slic3r/GUI/GUI_Preview.cpp:234 src/libslic3r/ExtrusionEntity.cpp:314
+#: src/libslic3r/ExtrusionEntity.cpp:340 src/libslic3r/PrintConfig.cpp:1956
+#: src/libslic3r/PrintConfig.cpp:1967
msgid "Solid infill"
msgstr "Preenchimento sólido"
-#: src/slic3r/GUI/GUI_Preview.cpp:242 src/libslic3r/ExtrusionEntity.cpp:315
-#: src/libslic3r/PrintConfig.cpp:2105 src/libslic3r/PrintConfig.cpp:2117
+#: src/slic3r/GUI/GUI_Preview.cpp:235 src/libslic3r/ExtrusionEntity.cpp:315
+#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/PrintConfig.cpp:2333
+#: src/libslic3r/PrintConfig.cpp:2345
msgid "Top solid infill"
msgstr "Preenchimento do sólido do topo"
-#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:316
+#: src/slic3r/GUI/GUI_Preview.cpp:237 src/libslic3r/ExtrusionEntity.cpp:317
+#: src/libslic3r/ExtrusionEntity.cpp:346
msgid "Bridge infill"
msgstr "Preenchimento de pontes"
-#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:317
-#: src/libslic3r/PrintConfig.cpp:918
+#: src/slic3r/GUI/GUI_Preview.cpp:238 src/libslic3r/ExtrusionEntity.cpp:318
+#: src/libslic3r/ExtrusionEntity.cpp:348 src/libslic3r/PrintConfig.cpp:1011
msgid "Gap fill"
msgstr "Preenchimento de vão"
-#: src/slic3r/GUI/GUI_Preview.cpp:245 src/slic3r/GUI/Tab.cpp:1110
-#: src/libslic3r/ExtrusionEntity.cpp:318
+#: src/slic3r/GUI/GUI_Preview.cpp:239 src/slic3r/GUI/Tab.cpp:1462
+#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/ExtrusionEntity.cpp:350
msgid "Skirt"
msgstr "Saia"
-#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:320
-#: src/libslic3r/PrintConfig.cpp:1991
+#: src/slic3r/GUI/GUI_Preview.cpp:241 src/libslic3r/ExtrusionEntity.cpp:321
+#: src/libslic3r/ExtrusionEntity.cpp:354 src/libslic3r/PrintConfig.cpp:2218
msgid "Support material interface"
msgstr "Interface do material de suporte"
-#: src/slic3r/GUI/GUI_Preview.cpp:248 src/slic3r/GUI/Tab.cpp:1190
-#: src/libslic3r/ExtrusionEntity.cpp:321
+#: src/slic3r/GUI/GUI_Preview.cpp:242 src/slic3r/GUI/Tab.cpp:1545
+#: src/libslic3r/ExtrusionEntity.cpp:322 src/libslic3r/ExtrusionEntity.cpp:356
msgid "Wipe tower"
msgstr "Torre de limpeza"
-#: src/slic3r/GUI/GUI_Preview.cpp:253 src/libslic3r/PrintConfig.cpp:2152
-msgid "Travel"
-msgstr "Viagem"
+#: src/slic3r/GUI/GUI_Preview.cpp:1031
+msgid "Shells"
+msgstr "Paredes"
-#: src/slic3r/GUI/GUI_Preview.cpp:254
-msgid "Retractions"
-msgstr "Retrações"
+#: src/slic3r/GUI/GUI_Preview.cpp:1032
+msgid "Tool marker"
+msgstr "Ferramenta de marcação"
-#: src/slic3r/GUI/GUI_Preview.cpp:255
-msgid "Unretractions"
-msgstr "Retorno da retração"
+#: src/slic3r/GUI/GUI_Preview.cpp:1033
+msgid "Legend/Estimated printing time"
+msgstr "Legenda/Tempo estimado de impressão"
-#: src/slic3r/GUI/GUI_Preview.cpp:256
-msgid "Shells"
-msgstr "Paredes"
+#: src/slic3r/GUI/ImGuiWrapper.cpp:804 src/slic3r/GUI/Search.cpp:389
+msgid "Use for search"
+msgstr "Use para pesquisar"
+
+#: src/slic3r/GUI/ImGuiWrapper.cpp:805 src/slic3r/GUI/Search.cpp:383
+msgid "Category"
+msgstr "Categoria"
+
+#: src/slic3r/GUI/ImGuiWrapper.cpp:807 src/slic3r/GUI/Search.cpp:385
+msgid "Search in English"
+msgstr "Procurar em inglês"
+
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:145
+msgid "Arranging"
+msgstr "Organizar"
+
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:175
+msgid "Could not arrange model objects! Some geometries may be invalid."
+msgstr ""
+"Não foi possível organizar objetos de modelo! Algumas geometrias podem ser "
+"inválidas."
+
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:181
+msgid "Arranging canceled."
+msgstr "Arranjo cancelado."
-#: src/slic3r/GUI/GUI_Preview.cpp:257
-msgid "Legend"
-msgstr "Legenda"
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:182
+msgid "Arranging done."
+msgstr "Arranjo feito."
-#: src/slic3r/GUI/Job.hpp:123
+#: src/slic3r/GUI/Jobs/Job.cpp:75
msgid "ERROR: not enough resources to execute a new job."
msgstr "ERRO: não há recursos suficientes para executar um novo trabalho."
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:41 src/slic3r/GUI/MainFrame.cpp:719
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:41
+msgid "Searching for optimal orientation"
+msgstr "Procurando orientação ideal"
+
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:73
+msgid "Orientation search canceled."
+msgstr "Pesquisa de orientação cancelada."
+
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:74
+msgid "Orientation found."
+msgstr "Orientação encontrada."
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:35
+msgid "Choose SLA archive:"
+msgstr "Selecione arquivo SLA:"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:39
+msgid "Import file"
+msgstr "Importar arquivo"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:46
+msgid "Import model and profile"
+msgstr "Importar modelo e perfil"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47
+msgid "Import profile only"
+msgstr "Importar somente perfil"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48
+msgid "Import model only"
+msgstr "Modelo somente modelo"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:59
+msgid "Accurate"
+msgstr "Preciso"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60
+msgid "Balanced"
+msgstr "Balanceado"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61
+msgid "Quick"
+msgstr "Ãgil"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135
+msgid "Importing SLA archive"
+msgstr "Importando arquivos SLA"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:159
+msgid "Importing canceled."
+msgstr "Importação cancelada."
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:160
+msgid "Importing done."
+msgstr "Importação feita."
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:208 src/slic3r/GUI/Plater.cpp:2357
+msgid "You cannot load SLA project with a multi-part object on the bed"
+msgstr ""
+"Você não pode carregar o projeto SLA com um objeto de várias partes na cama"
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:209 src/slic3r/GUI/Plater.cpp:2358
+#: src/slic3r/GUI/Tab.cpp:3243
+msgid "Please check your object list before preset changing."
+msgstr "Verifique a lista de objetos antes de alterar a predefinição."
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:17 src/slic3r/GUI/MainFrame.cpp:894
msgid "Keyboard Shortcuts"
msgstr "Atalhos do teclado"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:112
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:69
msgid "New project, clear plater"
msgstr "Novo projeto, limpar a bandeja"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:113
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:70
msgid "Open project STL/OBJ/AMF/3MF with config, clear plater"
-msgstr "Abra o projeto STL/OBJ/AMF/3MF com config, clear plater"
+msgstr "Abra o projeto STL/OBJ/AMF/3MF com config, limpar bandeja"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:114
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:71
msgid "Save project (3mf)"
msgstr "Salvar projeto (3MF)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:115
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:72
msgid "Save project as (3mf)"
msgstr "Salvar projeto como (3mf)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:116
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:73
msgid "(Re)slice"
msgstr "(Re)fatiar"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:118
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:75
msgid "Import STL/OBJ/AMF/3MF without config, keep plater"
msgstr "Importar STL/OBJ/AMF/3MF sem config, manter bandeja"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:119
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:76
msgid "Import Config from ini/amf/3mf/gcode"
msgstr "Config importação de ini/amf/3mf/gcode"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:120
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:77
msgid "Load Config from ini/amf/3mf/gcode and merge"
msgstr "Carregar config. de um. ini/AMF/3mf/Gcode e mesclar"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 src/slic3r/GUI/Plater.cpp:891
-#: src/slic3r/GUI/Plater.cpp:5522 src/libslic3r/PrintConfig.cpp:3363
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:79 src/slic3r/GUI/Plater.cpp:770
+#: src/slic3r/GUI/Plater.cpp:6054 src/libslic3r/PrintConfig.cpp:3635
msgid "Export G-code"
msgstr "Exportar G-code"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:123 src/slic3r/GUI/Plater.cpp:5523
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:80 src/slic3r/GUI/Plater.cpp:6055
msgid "Send G-code"
msgstr "Enviar G-code"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:124
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:81
msgid "Export config"
-msgstr "Exportar config."
+msgstr "Exportar config"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:126
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:82 src/slic3r/GUI/Plater.cpp:758
+msgid "Export to SD card / Flash drive"
+msgstr "Exportar para cartão SD / unidade Flash"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:83
+msgid "Eject SD card / Flash drive"
+msgstr "Ejetar cartão SD / unidade Flash"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:85
msgid "Select all objects"
msgstr "Selecionar todos os objetos"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:127
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:86
msgid "Deselect all"
msgstr "Desmarcar todos"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:128
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:87
msgid "Delete selected"
msgstr "Deletar seleção"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:132
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:91
msgid "Copy to clipboard"
msgstr "Copiar para a área de transferência"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:133
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:92
msgid "Paste from clipboard"
msgstr "Colar da área de transferência"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:134
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:94
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:96
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:187
msgid "Reload plater from disk"
msgstr "Recarregar bandeja do disco"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:136
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:100
msgid "Select Plater Tab"
msgstr "Selecione a guia de bandeja"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:137
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:101
msgid "Select Print Settings Tab"
msgstr "Selecione a guia config. de impressão"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:138
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:102
msgid "Select Filament Settings Tab"
msgstr "Selecione a guia config. de filamento"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:139
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:103
msgid "Select Printer Settings Tab"
msgstr "Selecione a guia config. da impressora"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:140
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:104
msgid "Switch to 3D"
msgstr "Mude para 3D"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:141
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:105
msgid "Switch to Preview"
msgstr "Mudar para pré-visualização"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:142
-#: src/slic3r/GUI/PrintHostDialogs.cpp:136
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:106
+#: src/slic3r/GUI/PrintHostDialogs.cpp:165
msgid "Print host upload queue"
msgstr "Fila de carregamento do host de impressão"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:144
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 src/slic3r/GUI/MainFrame.cpp:65
+#: src/slic3r/GUI/MainFrame.cpp:1191
+msgid "Open new instance"
+msgstr "Abrir nova instância"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:109
msgid "Camera view"
msgstr "Vista da câmera"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:146
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:110
msgid "Show/Hide object/instance labels"
msgstr "Mostrar/Ocultar rótulos de objeto/instância"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:149 src/slic3r/GUI/Preferences.cpp:10
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:112 src/slic3r/GUI/Preferences.cpp:13
msgid "Preferences"
msgstr "Preferências"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:151
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:114
msgid "Show keyboard shortcuts list"
msgstr "Mostrar lista dos atalhos no teclado"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:154
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:117
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:191
msgid "Commands"
msgstr "Comandos"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:159
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:122
msgid "Add Instance of the selected object"
msgstr "Adicionar instância do objeto selecionado"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:160
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:123
msgid "Remove Instance of the selected object"
msgstr "Remover instância do objeto selecionado"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:161
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:124
msgid ""
"Press to select multiple objects\n"
"or move multiple objects with mouse"
msgstr ""
-"Aperte para selecionar múltiplos objetos ou mover múltiplos objetos com o "
-"mouse"
+"Aperte para selecionar múltiplos objetos ou mover múltiplos objetos com o mouse"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:162
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:125
msgid "Press to activate selection rectangle"
msgstr "Pressione para ativar o retângulo de seleção"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:126
msgid "Press to activate deselection rectangle"
msgstr "Pressione para ativar o retângulo de desseleção"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:204
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:214
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:127
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:196
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:226
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:243
msgid "Arrow Up"
msgstr "Seta para cima"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:127
msgid "Move selection 10 mm in positive Y direction"
msgstr "Mover seleção 10 mm na direção Y positiva"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:128
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:197
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:220
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:227
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:244
msgid "Arrow Down"
msgstr "Seta para baixo"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:128
msgid "Move selection 10 mm in negative Y direction"
msgstr "Mover seleção 10 mm na direção Y negativa"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:129
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:198
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:221
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:228
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:241
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:246
msgid "Arrow Left"
msgstr "Seta esquerda"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:129
msgid "Move selection 10 mm in negative X direction"
msgstr "Mover seleção 10 mm na direção X negativa"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:130
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:199
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:229
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:242
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:247
msgid "Arrow Right"
msgstr "Seta direita"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:130
msgid "Move selection 10 mm in positive X direction"
msgstr "Mover seleção 10 mm na direção X positiva"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:131
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:132
msgid "Any arrow"
msgstr "Qualquer flecha"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:131
msgid "Movement step set to 1 mm"
msgstr "Passo de movimento definido para 1 mm"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:132
msgid "Movement in camera space"
msgstr "Movimento no espaço da câmera"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:133
msgid "Page Up"
msgstr "Page Up"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:133
msgid "Rotate selection 45 degrees CCW"
-msgstr "Seleção rotatura 45 graus CCW"
+msgstr "Seleção rotatura 45 graus SAH"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:134
msgid "Page Down"
msgstr "Page Down"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:134
msgid "Rotate selection 45 degrees CW"
-msgstr "Seleção de rotação 45 graus CW"
+msgstr "Seleção de rotação 45 graus SH"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:172
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:135
msgid "Gizmo move"
msgstr "Gizmo-Mover"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:173
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:136
msgid "Gizmo scale"
msgstr "Gizmo-Escala"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:174
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:137
msgid "Gizmo rotate"
msgstr "Gizmo-Rotacionar"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:138
msgid "Gizmo cut"
msgstr "Gizmo-Cortar"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:176
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:139
msgid "Gizmo Place face on bed"
msgstr "Colocar face do Gizmo na mesa"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:177
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:140
msgid "Gizmo SLA hollow"
msgstr "Gizmo de SLA ligado"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:178
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:141
msgid "Gizmo SLA support points"
msgstr "Pontos de suporte do Gizmo SLA"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:142
msgid "Unselect gizmo or clear selection"
msgstr "Desmarcar Gizmo/limpar seleção"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:180
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:143
msgid "Change camera type (perspective, orthographic)"
msgstr "Alterar tipo de câmera (perspectiva, ortográfica)"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:181
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:144
msgid "Zoom to Bed"
msgstr "Ampliar para a mesa"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:182
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:145
msgid ""
"Zoom to selected object\n"
"or all objects in scene, if none selected"
@@ -3372,838 +4208,1291 @@ msgstr ""
"Zoom para objeto selecionado\n"
"ou todos os objetos em cena, se nenhum selecionado"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:183
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:146
msgid "Zoom in"
msgstr "Ampliar"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:184
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:147
msgid "Zoom out"
-msgstr "Dimiuir"
+msgstr "Diminuir"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:148
+msgid "Switch between Editor/Preview"
+msgstr "Mudar entre Editor/Pré-visualização"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:149
+msgid "Collapse/Expand the sidebar"
+msgstr "Recolher/Expandir a barra lateral"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:185
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:152
+msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled"
+msgstr ""
+"Mostrar/Ocultar a caixa de configurações de dispositivos 3Dconnexion, se "
+"ativado"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:154
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:158
msgid "Show/Hide 3Dconnexion devices settings dialog"
msgstr "Mostrar/Ocultar a caixa de configurações de dispositivos 3Dconnexion"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:192 src/slic3r/GUI/MainFrame.cpp:214
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:167 src/slic3r/GUI/MainFrame.cpp:331
+#: src/slic3r/GUI/MainFrame.cpp:343
msgid "Plater"
msgstr "Bandeja"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:195
-#, no-c-format
-msgid ""
-"Press to snap by 5% in Gizmo scale\n"
-"or to snap by 1mm in Gizmo move"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
+msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button"
msgstr ""
-"Pressione para estalar 5% na escala Gizmo\n"
-"ou para estalar por 1mm no movimento Gizmo"
+"Todos gizmos: Rotacionar - Botão esquerdo do mouse; Pan - Botão direito do "
+"mouse"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:196
-msgid ""
-"Scale selection to fit print volume\n"
-"in Gizmo scale"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
+msgid "Gizmo move: Press to snap by 1mm"
+msgstr "Gizmo movimentar: Pressione para ajustar em 1 mm"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:172
+msgid "Gizmo scale: Press to snap by 5%"
+msgstr "Gizmo escala: Pressione para ajustar em 5%"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:173
+msgid "Gizmo scale: Scale selection to fit print volume"
+msgstr "Gizmo escala: Seleção de escala para caber no volume da impressora"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:174
+msgid "Gizmo scale: Press to activate one direction scaling"
+msgstr "Gizmo escala: Pressione para ativar escalonamento em uma direção"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
+msgid "Gizmo scale: Press to scale selected objects around their own center"
msgstr ""
-"Seleção de escala para caber volume de impressão\n"
-"na escala Gizmo"
+"Gizmo escala: Pressione para escalonar os objetos selecionados em torno de "
+"seus próprios centros"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:197
-msgid "Press to activate one direction scaling in Gizmo scale"
-msgstr "Pressione para ativar um dimensionamento de direção na escala Gizmo"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:176
+msgid "Gizmo rotate: Press to rotate selected objects around their own center"
+msgstr ""
+"Gizmo rotação: Pressione para rotacionar objetos selecionados em torno de seus "
+"próprios centros"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:198
-msgid ""
-"Press to scale (in Gizmo scale) or rotate (in Gizmo rotate)\n"
-"selected objects around their own center"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+msgid "Gizmos"
+msgstr "Gizmos"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:179
+msgid "The following shortcuts are applicable when the specified gizmo is active"
msgstr ""
-"Pressione para escalar (na escala de Gizmo) ou girar (em Gizmo girar)\n"
-"objetos selecionados em torno de seu próprio centro"
+"Os seguintes atalhos são aplicáveis quando o dispositivo especificado está "
+"ativo"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:183 src/slic3r/GUI/MainFrame.cpp:1244
+msgid "Open a G-code file"
+msgstr "Abrir um arquivo G-code"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:185 src/slic3r/GUI/MainFrame.cpp:1142
+#: src/slic3r/GUI/MainFrame.cpp:1146 src/slic3r/GUI/MainFrame.cpp:1249
+#: src/slic3r/GUI/MainFrame.cpp:1253
+msgid "Reload the plater from disk"
+msgstr "Recarregar a bandeja do disco"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:196
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:200
+msgid "Vertical slider - Move active thumb Up"
+msgstr "Rolagem vertical - Mover barra ativa para Cima"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:197
#: src/slic3r/GUI/KBShortcutsDialog.cpp:201
-msgid "Gizmos"
-msgstr "Aparelhos"
+msgid "Vertical slider - Move active thumb Down"
+msgstr "Rolagem vertical - Mover barra ativa para Baixo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:198
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:202
+msgid "Horizontal slider - Move active thumb Left"
+msgstr "Rolagem horizontal - Mover barra ativa para Esquerda"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:199
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:203
+msgid "Horizontal slider - Move active thumb Right"
+msgstr "Rolagem horizontal - Mover barra ativa para Direita"
#: src/slic3r/GUI/KBShortcutsDialog.cpp:204
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:206
-msgid "Upper Layer"
-msgstr "Camada superior"
+msgid "On/Off one layer mode of the vertical slider"
+msgstr "Liga/Desliga modo camada única da barra de rolagem vertical"
#: src/slic3r/GUI/KBShortcutsDialog.cpp:205
+msgid "Show/Hide Legend and Estimated printing time"
+msgstr "Mostrar/Esconder Legenda e Tempo estimado de impressão"
+
#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
+msgid "Upper layer"
+msgstr "Camada superior"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
+msgid "Lower layer"
+msgstr "Camada inferior"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:209
+msgid "Upper Layer"
+msgstr "Camada superior"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:210
msgid "Lower Layer"
msgstr "Camada inferior"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
-msgid "Show/Hide Legend"
-msgstr "Ligar/Desligar Legenda"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:211
+msgid "Show/Hide Legend & Estimated printing time"
+msgstr "Mostrar/Esconder Legenda & Tempo estimado de impressão"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:211 src/slic3r/GUI/Plater.cpp:4107
-#: src/slic3r/GUI/Tab.cpp:2392
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:215 src/slic3r/GUI/Plater.cpp:4200
+#: src/slic3r/GUI/Tab.cpp:2602
msgid "Preview"
msgstr "Visualização"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:214
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+msgid "Move active thumb Up"
+msgstr "Mover a barra ativa para cima"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:220
+msgid "Move active thumb Down"
+msgstr "Mover a barra ativa para baixo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:221
+msgid "Set upper thumb as active"
+msgstr "Definir barra superior como ativa"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
+msgid "Set lower thumb as active"
+msgstr "Definir barra inferior como ativa"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:223
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:230
+msgid "Add color change marker for current layer"
+msgstr "Adicionar mudança de cor para a camada atual"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:224
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:231
+msgid "Delete color change marker for current layer"
+msgstr "Excluir mudança de cor para a camada atual"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:226
msgid "Move current slider thumb Up"
msgstr "Mover a barra de rolagem para cima"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:215
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:227
msgid "Move current slider thumb Down"
msgstr "Mover a barra de rolagem para baixo"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:228
msgid "Set upper thumb to current slider thumb"
-msgstr "Definir o polegar superior para o polegar deslizante atual"
+msgstr "Definir a barra superior para barra de rolagem atual"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:229
msgid "Set lower thumb to current slider thumb"
-msgstr "Definir o polegar inferior para o polegar deslizante atual"
+msgstr "Definir a barra inferior para barra de rolagem atual"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
-msgid "Add color change marker for current layer"
-msgstr "Adicionar mudança de cor para a camada atual"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:233
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:234
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:249
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:250
+msgid ""
+"Press to speed up 5 times while moving thumb\n"
+"with arrow keys or mouse wheel"
+msgstr ""
+"Pressione para acelerar em 5 vezes enquanto move miniatura\n"
+"com as setas do teclado ou scroll do mouse"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
-msgid "Delete color change marker for current layer"
-msgstr "Excluir mudança de cor para a camada atual"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:237
+msgid "Vertical Slider"
+msgstr "Rolagem vertical"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
-msgid "Layers Slider"
-msgstr "Controle deslizante de camadas"
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:237
+msgid ""
+"The following shortcuts are applicable in G-code preview when the vertical "
+"slider is active"
+msgstr ""
+"Os seguintes atalhos são aplicáveis na visualização do código G quando a "
+"rolagem vertical está ativo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:241
+msgid "Move active thumb Left"
+msgstr "Mover a barra ativa para Esquerda"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:242
+msgid "Move active thumb Right"
+msgstr "Mover a barra ativa para Direita"
-#: src/slic3r/GUI/KBShortcutsDialog.cpp:245
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:243
+msgid "Set left thumb as active"
+msgstr "Definir barra esquerda como ativa"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:244
+msgid "Set right thumb as active"
+msgstr "Definir barra direita como ativa"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:246
+msgid "Move active slider thumb Left"
+msgstr "Mover a barra de rolagem ativa para Esquerda"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:247
+msgid "Move active slider thumb Right"
+msgstr "Mover a barra de rolagem ativa para Direita"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:253
+msgid "Horizontal Slider"
+msgstr "Rolagem horizontal"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:253
+msgid ""
+"The following shortcuts are applicable in G-code preview when the horizontal "
+"slider is active"
+msgstr ""
+"Os seguintes atalhos são aplicáveis na visualização do código G quando a "
+"rolagem horizontal está ativo"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:276
msgid "Keyboard shortcuts"
msgstr "Atalhos do teclado"
-#: src/slic3r/GUI/MainFrame.cpp:66
+#: src/slic3r/GUI/MainFrame.cpp:65 src/slic3r/GUI/MainFrame.cpp:79
+#: src/slic3r/GUI/MainFrame.cpp:1191
+msgid "Open a new PrusaSlicer instance"
+msgstr "Abrir uma nova instância do PrusaSlicer"
+
+#: src/slic3r/GUI/MainFrame.cpp:68 src/slic3r/GUI/MainFrame.cpp:81
+msgid "G-code preview"
+msgstr "Previsualização do G-code"
+
+#: src/slic3r/GUI/MainFrame.cpp:68 src/slic3r/GUI/MainFrame.cpp:1091
+msgid "Open G-code viewer"
+msgstr "Abrir visualizador G-code"
+
+#: src/slic3r/GUI/MainFrame.cpp:79 src/slic3r/GUI/MainFrame.cpp:1260
+msgid "Open PrusaSlicer"
+msgstr "Versão mínima do PrusaSlicer"
+
+#: src/slic3r/GUI/MainFrame.cpp:81
+msgid "Open new G-code viewer"
+msgstr "Abrir novo visualizador G-code"
+
+#: src/slic3r/GUI/MainFrame.cpp:153
msgid ""
-" - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/"
+"Remember to check for updates at https://github.com/prusa3d/PrusaSlicer/"
"releases"
msgstr ""
-" - Lembre-se de verificar por atualizações em http://github.com/prusa3d/"
+"Lembre-se de verificar por atualizações em http://github.com/prusa3d/"
"PrusaSlicer/releases"
-#: src/slic3r/GUI/MainFrame.cpp:184
+#: src/slic3r/GUI/MainFrame.cpp:510
msgid "based on Slic3r"
msgstr "baseado no Slic3r"
-#: src/slic3r/GUI/MainFrame.cpp:415
+#: src/slic3r/GUI/MainFrame.cpp:866
+msgid "Prusa 3D &Drivers"
+msgstr "Drivers 3D &Prusa"
+
+#: src/slic3r/GUI/MainFrame.cpp:866
+msgid "Open the Prusa3D drivers download page in your browser"
+msgstr "Abrir a página para baixar os drivers da Prusa3D no seu navegador"
+
+#: src/slic3r/GUI/MainFrame.cpp:868
+msgid "Software &Releases"
+msgstr "Lançamentos de &software"
+
+#: src/slic3r/GUI/MainFrame.cpp:868
+msgid "Open the software releases page in your browser"
+msgstr "Abrir a página de lançamentos de software no seu navegador"
+
+#: src/slic3r/GUI/MainFrame.cpp:874
+#, c-format
+msgid "%s &Website"
+msgstr "%s &Site"
+
+#: src/slic3r/GUI/MainFrame.cpp:875
+#, c-format
+msgid "Open the %s website in your browser"
+msgstr "Abra o site do %s no seu navegador"
+
+#: src/slic3r/GUI/MainFrame.cpp:881
+msgid "System &Info"
+msgstr "Informação &do sistema"
+
+#: src/slic3r/GUI/MainFrame.cpp:881
+msgid "Show system information"
+msgstr "Mostrar a informação do sistema"
+
+#: src/slic3r/GUI/MainFrame.cpp:883
+msgid "Show &Configuration Folder"
+msgstr "Mostrar &pasta de config"
+
+#: src/slic3r/GUI/MainFrame.cpp:883
+msgid "Show user configuration folder (datadir)"
+msgstr "Mostrar pasta de config. do usuário (datadir)"
+
+#: src/slic3r/GUI/MainFrame.cpp:885
+msgid "Report an I&ssue"
+msgstr "Reportar um p&roblema"
+
+#: src/slic3r/GUI/MainFrame.cpp:885
+#, c-format
+msgid "Report an issue on %s"
+msgstr "Relatar um problema em %s"
+
+#: src/slic3r/GUI/MainFrame.cpp:888 src/slic3r/GUI/MainFrame.cpp:891
+#, c-format
+msgid "&About %s"
+msgstr "&Sobre %s"
+
+#: src/slic3r/GUI/MainFrame.cpp:888 src/slic3r/GUI/MainFrame.cpp:891
+msgid "Show about dialog"
+msgstr "Mostrar diálogo sobre"
+
+#: src/slic3r/GUI/MainFrame.cpp:894
+msgid "Show the list of the keyboard shortcuts"
+msgstr "Mostrar lista dos atalhos no teclado"
+
+#: src/slic3r/GUI/MainFrame.cpp:908
+msgid "Iso"
+msgstr "Isométrico"
+
+#: src/slic3r/GUI/MainFrame.cpp:908
+msgid "Iso View"
+msgstr "Vista isométrica"
+
+#. TRN To be shown in the main menu View->Top
+#. TRN To be shown in Print Settings "Top solid layers"
+#: src/slic3r/GUI/MainFrame.cpp:912 src/libslic3r/PrintConfig.cpp:2360
+#: src/libslic3r/PrintConfig.cpp:2369
+msgid "Top"
+msgstr "Topo"
+
+#: src/slic3r/GUI/MainFrame.cpp:912
+msgid "Top View"
+msgstr "Vista do topo"
+
+#. TRN To be shown in the main menu View->Bottom
+#. TRN To be shown in Print Settings "Bottom solid layers"
+#. TRN To be shown in Print Settings "Top solid layers"
+#: src/slic3r/GUI/MainFrame.cpp:915 src/libslic3r/PrintConfig.cpp:230
+#: src/libslic3r/PrintConfig.cpp:239
+msgid "Bottom"
+msgstr "Base"
+
+#: src/slic3r/GUI/MainFrame.cpp:915
+msgid "Bottom View"
+msgstr "Vista da base"
+
+#: src/slic3r/GUI/MainFrame.cpp:917
+msgid "Front"
+msgstr "Frente"
+
+#: src/slic3r/GUI/MainFrame.cpp:917
+msgid "Front View"
+msgstr "Vista da frente"
+
+#: src/slic3r/GUI/MainFrame.cpp:919 src/libslic3r/PrintConfig.cpp:1845
+msgid "Rear"
+msgstr "Traseira"
+
+#: src/slic3r/GUI/MainFrame.cpp:919
+msgid "Rear View"
+msgstr "Vista traseira"
+
+#: src/slic3r/GUI/MainFrame.cpp:921
+msgid "Left"
+msgstr "Esquerda"
+
+#: src/slic3r/GUI/MainFrame.cpp:921
+msgid "Left View"
+msgstr "Vista esquerda"
+
+#: src/slic3r/GUI/MainFrame.cpp:923
+msgid "Right"
+msgstr "Direita"
+
+#: src/slic3r/GUI/MainFrame.cpp:923
+msgid "Right View"
+msgstr "Vista direita"
+
+#: src/slic3r/GUI/MainFrame.cpp:936
msgid "&New Project"
msgstr "&Novo projeto"
-#: src/slic3r/GUI/MainFrame.cpp:415
+#: src/slic3r/GUI/MainFrame.cpp:936
msgid "Start a new project"
msgstr "Começar um novo projeto"
-#: src/slic3r/GUI/MainFrame.cpp:418
+#: src/slic3r/GUI/MainFrame.cpp:939
msgid "&Open Project"
msgstr "&Abrir projeto"
-#: src/slic3r/GUI/MainFrame.cpp:418
+#: src/slic3r/GUI/MainFrame.cpp:939
msgid "Open a project file"
msgstr "Abrir novo projeto"
-#: src/slic3r/GUI/MainFrame.cpp:423
+#: src/slic3r/GUI/MainFrame.cpp:944
msgid "Recent projects"
msgstr "Projetos recentes"
-#: src/slic3r/GUI/MainFrame.cpp:432
+#: src/slic3r/GUI/MainFrame.cpp:953
msgid ""
"The selected project is no longer available.\n"
-"Do you want to remove it from the recent projects list ?"
+"Do you want to remove it from the recent projects list?"
msgstr ""
"O projeto selecionado não está mais disponível.\n"
"Você quer removê-lo da lista de projetos recentes?"
-#: src/slic3r/GUI/MainFrame.cpp:432 src/slic3r/GUI/MainFrame.cpp:796
-#: src/slic3r/GUI/PrintHostDialogs.cpp:231
+#: src/slic3r/GUI/MainFrame.cpp:953 src/slic3r/GUI/MainFrame.cpp:1343
+#: src/slic3r/GUI/PrintHostDialogs.cpp:263
msgid "Error"
msgstr "Erro"
-#: src/slic3r/GUI/MainFrame.cpp:457
+#: src/slic3r/GUI/MainFrame.cpp:978
msgid "&Save Project"
msgstr "&Salvar projeto"
-#: src/slic3r/GUI/MainFrame.cpp:457
+#: src/slic3r/GUI/MainFrame.cpp:978
msgid "Save current project file"
-msgstr "Salvar arquivo"
+msgstr "Salvar arquivo do projeto atual"
-#: src/slic3r/GUI/MainFrame.cpp:461 src/slic3r/GUI/MainFrame.cpp:463
+#: src/slic3r/GUI/MainFrame.cpp:982 src/slic3r/GUI/MainFrame.cpp:984
msgid "Save Project &as"
msgstr "Salvar projeto &como"
-#: src/slic3r/GUI/MainFrame.cpp:461 src/slic3r/GUI/MainFrame.cpp:463
+#: src/slic3r/GUI/MainFrame.cpp:982 src/slic3r/GUI/MainFrame.cpp:984
msgid "Save current project file as"
msgstr "Salvar arquivo atual como"
-#: src/slic3r/GUI/MainFrame.cpp:471
+#: src/slic3r/GUI/MainFrame.cpp:992
msgid "Import STL/OBJ/AM&F/3MF"
-msgstr "Import STL/OBJ/AM&F/3MF"
+msgstr "Importar STL/OBJ/AM&F/3MF"
-#: src/slic3r/GUI/MainFrame.cpp:471
+#: src/slic3r/GUI/MainFrame.cpp:992
msgid "Load a model"
msgstr "Carregar um modelo"
-#: src/slic3r/GUI/MainFrame.cpp:475
+#: src/slic3r/GUI/MainFrame.cpp:996
+msgid "Import STL (imperial units)"
+msgstr "Importar STL (unidades imperiais)"
+
+#: src/slic3r/GUI/MainFrame.cpp:996
+msgid "Load an model saved with imperial units"
+msgstr "Carregar um modelo salvo com unidades imperiais"
+
+#: src/slic3r/GUI/MainFrame.cpp:1000
+msgid "Import SL1 archive"
+msgstr "Importar arquivo SL1"
+
+#: src/slic3r/GUI/MainFrame.cpp:1000
+msgid "Load an SL1 archive"
+msgstr "Carregar um arquivo SL1"
+
+#: src/slic3r/GUI/MainFrame.cpp:1005
msgid "Import &Config"
-msgstr "Importar &config."
+msgstr "Importar &config"
-#: src/slic3r/GUI/MainFrame.cpp:475
+#: src/slic3r/GUI/MainFrame.cpp:1005
msgid "Load exported configuration file"
msgstr "Carregar config. de arquivo exportado"
-#: src/slic3r/GUI/MainFrame.cpp:478
+#: src/slic3r/GUI/MainFrame.cpp:1008
msgid "Import Config from &project"
msgstr "Importar Config do &projeto"
-#: src/slic3r/GUI/MainFrame.cpp:478
+#: src/slic3r/GUI/MainFrame.cpp:1008
msgid "Load configuration from project file"
msgstr "Carregar config. de arquivo de projeto"
-#: src/slic3r/GUI/MainFrame.cpp:482
+#: src/slic3r/GUI/MainFrame.cpp:1012
msgid "Import Config &Bundle"
-msgstr "Importar coleção &de config."
+msgstr "Importar coleção &de config"
-#: src/slic3r/GUI/MainFrame.cpp:482
+#: src/slic3r/GUI/MainFrame.cpp:1012
msgid "Load presets from a bundle"
msgstr "Carregar predefinições de um pacote"
-#: src/slic3r/GUI/MainFrame.cpp:485
+#: src/slic3r/GUI/MainFrame.cpp:1015
msgid "&Import"
msgstr "&Importar"
-#: src/slic3r/GUI/MainFrame.cpp:488 src/slic3r/GUI/MainFrame.cpp:760
+#: src/slic3r/GUI/MainFrame.cpp:1018 src/slic3r/GUI/MainFrame.cpp:1305
msgid "Export &G-code"
msgstr "Exportar &G-code"
-#: src/slic3r/GUI/MainFrame.cpp:488
+#: src/slic3r/GUI/MainFrame.cpp:1018
msgid "Export current plate as G-code"
msgstr "Exporte a bandeja atual como o G-code"
-#: src/slic3r/GUI/MainFrame.cpp:492 src/slic3r/GUI/MainFrame.cpp:761
+#: src/slic3r/GUI/MainFrame.cpp:1022 src/slic3r/GUI/MainFrame.cpp:1306
msgid "S&end G-code"
msgstr "E&nviar G-code"
-#: src/slic3r/GUI/MainFrame.cpp:492
+#: src/slic3r/GUI/MainFrame.cpp:1022
msgid "Send to print current plate as G-code"
msgstr "Enviar para imprimir a bandeja atual como G-code"
-#: src/slic3r/GUI/MainFrame.cpp:497
+#: src/slic3r/GUI/MainFrame.cpp:1026
+msgid "Export G-code to SD card / Flash drive"
+msgstr "Exportar para cartão SD / unidade Flash"
+
+#: src/slic3r/GUI/MainFrame.cpp:1026
+msgid "Export current plate as G-code to SD card / Flash drive"
+msgstr "Exportar bandeja atual como G-code para cartão SD / unidade Flash"
+
+#: src/slic3r/GUI/MainFrame.cpp:1030
msgid "Export plate as &STL"
msgstr "Exportar bandeja como &STL"
-#: src/slic3r/GUI/MainFrame.cpp:497
+#: src/slic3r/GUI/MainFrame.cpp:1030
msgid "Export current plate as STL"
msgstr "Exporte a bandeja atual como STL"
-#: src/slic3r/GUI/MainFrame.cpp:500
+#: src/slic3r/GUI/MainFrame.cpp:1033
msgid "Export plate as STL &including supports"
msgstr "Exportar bandeja como STL &incluindo suportes"
-#: src/slic3r/GUI/MainFrame.cpp:500
+#: src/slic3r/GUI/MainFrame.cpp:1033
msgid "Export current plate as STL including supports"
msgstr "Exporte a bandeja atual como o STL que inclui suportes"
-#: src/slic3r/GUI/MainFrame.cpp:503
+#: src/slic3r/GUI/MainFrame.cpp:1036
msgid "Export plate as &AMF"
msgstr "Exportar bandeja como &AMF"
-#: src/slic3r/GUI/MainFrame.cpp:503
+#: src/slic3r/GUI/MainFrame.cpp:1036
msgid "Export current plate as AMF"
msgstr "Exporte a bandeja atual como o AMF"
-#: src/slic3r/GUI/MainFrame.cpp:507
+#: src/slic3r/GUI/MainFrame.cpp:1040 src/slic3r/GUI/MainFrame.cpp:1257
msgid "Export &toolpaths as OBJ"
msgstr "Exportar &percurso da ferramenta como OBJ"
-#: src/slic3r/GUI/MainFrame.cpp:507
+#: src/slic3r/GUI/MainFrame.cpp:1040 src/slic3r/GUI/MainFrame.cpp:1257
msgid "Export toolpaths as OBJ"
msgstr "Exportar percursos como OBJ"
-#: src/slic3r/GUI/MainFrame.cpp:511
+#: src/slic3r/GUI/MainFrame.cpp:1044
msgid "Export &Config"
-msgstr "Exportar &config."
+msgstr "Exportar &config"
-#: src/slic3r/GUI/MainFrame.cpp:511
+#: src/slic3r/GUI/MainFrame.cpp:1044
msgid "Export current configuration to file"
msgstr "Exporte a config. atual para o arquivo"
-#: src/slic3r/GUI/MainFrame.cpp:514
+#: src/slic3r/GUI/MainFrame.cpp:1047
msgid "Export Config &Bundle"
-msgstr "Exportar coleção &de config."
+msgstr "Exportar coleção &de config"
-#: src/slic3r/GUI/MainFrame.cpp:514
+#: src/slic3r/GUI/MainFrame.cpp:1047
msgid "Export all presets to file"
msgstr "Exporte todas as predefinições para o arquivo"
-#: src/slic3r/GUI/MainFrame.cpp:517
+#: src/slic3r/GUI/MainFrame.cpp:1050
+msgid "Export Config Bundle With Physical Printers"
+msgstr "Exportar coleção &de config com Impressoras Físicas"
+
+#: src/slic3r/GUI/MainFrame.cpp:1050
+msgid "Export all presets including physical printers to file"
+msgstr ""
+"Exporte todas as predefinições, incluindo impressoras físicas, para o arquivo"
+
+#: src/slic3r/GUI/MainFrame.cpp:1053
msgid "&Export"
msgstr "&Exportar"
-#: src/slic3r/GUI/MainFrame.cpp:523
+#: src/slic3r/GUI/MainFrame.cpp:1055
+msgid "Ejec&t SD card / Flash drive"
+msgstr "Ejetar cartão SD / unidade Flash"
+
+#: src/slic3r/GUI/MainFrame.cpp:1055
+msgid "Eject SD card / Flash drive after the G-code was exported to it."
+msgstr "Ejetar cartão SD / unidade Flash após G-code for exportado para ele."
+
+#: src/slic3r/GUI/MainFrame.cpp:1063
msgid "Quick Slice"
msgstr "Fatiamento rápido"
-#: src/slic3r/GUI/MainFrame.cpp:523
+#: src/slic3r/GUI/MainFrame.cpp:1063
msgid "Slice a file into a G-code"
msgstr "Fatiar um arquivo em um G-code"
-#: src/slic3r/GUI/MainFrame.cpp:529
+#: src/slic3r/GUI/MainFrame.cpp:1069
msgid "Quick Slice and Save As"
msgstr "Salvamento rápido e salvar como"
-#: src/slic3r/GUI/MainFrame.cpp:529
+#: src/slic3r/GUI/MainFrame.cpp:1069
msgid "Slice a file into a G-code, save as"
msgstr "Fatiar um arquivo em um G-code, salvar como"
-#: src/slic3r/GUI/MainFrame.cpp:535
+#: src/slic3r/GUI/MainFrame.cpp:1075
msgid "Repeat Last Quick Slice"
msgstr "Repetir Último Fatiamento Rápido"
-#: src/slic3r/GUI/MainFrame.cpp:535
+#: src/slic3r/GUI/MainFrame.cpp:1075
msgid "Repeat last quick slice"
msgstr "Repetir último fatiamento rápido"
-#: src/slic3r/GUI/MainFrame.cpp:543
+#: src/slic3r/GUI/MainFrame.cpp:1083
msgid "(Re)Slice No&w"
msgstr "(Re)Fatiar ago&ra"
-#: src/slic3r/GUI/MainFrame.cpp:543
+#: src/slic3r/GUI/MainFrame.cpp:1083
msgid "Start new slicing process"
msgstr "Começar novo processo de fatiamento"
-#: src/slic3r/GUI/MainFrame.cpp:547
+#: src/slic3r/GUI/MainFrame.cpp:1087
msgid "&Repair STL file"
msgstr "&Reparar arquivo STL"
-#: src/slic3r/GUI/MainFrame.cpp:547
+#: src/slic3r/GUI/MainFrame.cpp:1087
msgid "Automatically repair an STL file"
msgstr "Reparar automaticamente um arquivo STL"
-#: src/slic3r/GUI/MainFrame.cpp:551
+#: src/slic3r/GUI/MainFrame.cpp:1091
+msgid "&G-code preview"
+msgstr "&Pré-visualizar G-code"
+
+#: src/slic3r/GUI/MainFrame.cpp:1094 src/slic3r/GUI/MainFrame.cpp:1264
msgid "&Quit"
msgstr "&Sair"
-#: src/slic3r/GUI/MainFrame.cpp:551
+#: src/slic3r/GUI/MainFrame.cpp:1094 src/slic3r/GUI/MainFrame.cpp:1264
#, c-format
msgid "Quit %s"
msgstr "Sair %s"
-#: src/slic3r/GUI/MainFrame.cpp:576
+#: src/slic3r/GUI/MainFrame.cpp:1109
msgid "&Select all"
msgstr "&Selecionar todos"
-#: src/slic3r/GUI/MainFrame.cpp:577
+#: src/slic3r/GUI/MainFrame.cpp:1110
msgid "Selects all objects"
msgstr "Selecionar todos os objetos"
-#: src/slic3r/GUI/MainFrame.cpp:579
+#: src/slic3r/GUI/MainFrame.cpp:1112
msgid "D&eselect all"
msgstr "D&eselecionar todos"
-#: src/slic3r/GUI/MainFrame.cpp:580
+#: src/slic3r/GUI/MainFrame.cpp:1113
msgid "Deselects all objects"
msgstr "Deselecionar todos os objetos"
-#: src/slic3r/GUI/MainFrame.cpp:583
+#: src/slic3r/GUI/MainFrame.cpp:1116
msgid "&Delete selected"
msgstr "&Excluir seleção"
-#: src/slic3r/GUI/MainFrame.cpp:584
+#: src/slic3r/GUI/MainFrame.cpp:1117
msgid "Deletes the current selection"
msgstr "Excluir a seleção atual"
-#: src/slic3r/GUI/MainFrame.cpp:586
+#: src/slic3r/GUI/MainFrame.cpp:1119
msgid "Delete &all"
msgstr "Excluir &todos"
-#: src/slic3r/GUI/MainFrame.cpp:587
+#: src/slic3r/GUI/MainFrame.cpp:1120
msgid "Deletes all objects"
msgstr "Excluir todos os objetos"
-#: src/slic3r/GUI/MainFrame.cpp:591
+#: src/slic3r/GUI/MainFrame.cpp:1124
msgid "&Undo"
msgstr "&Desfazer"
-#: src/slic3r/GUI/MainFrame.cpp:594
+#: src/slic3r/GUI/MainFrame.cpp:1127
msgid "&Redo"
msgstr "&Refazer"
-#: src/slic3r/GUI/MainFrame.cpp:599
+#: src/slic3r/GUI/MainFrame.cpp:1132
msgid "&Copy"
msgstr "&Copiar"
-#: src/slic3r/GUI/MainFrame.cpp:600
+#: src/slic3r/GUI/MainFrame.cpp:1133
msgid "Copy selection to clipboard"
msgstr "Copiar seleção para a área de transferência"
-#: src/slic3r/GUI/MainFrame.cpp:602
+#: src/slic3r/GUI/MainFrame.cpp:1135
msgid "&Paste"
msgstr "&Colar"
-#: src/slic3r/GUI/MainFrame.cpp:603
+#: src/slic3r/GUI/MainFrame.cpp:1136
msgid "Paste clipboard"
msgstr "Colar área de transferência"
-#: src/slic3r/GUI/MainFrame.cpp:607
+#: src/slic3r/GUI/MainFrame.cpp:1141 src/slic3r/GUI/MainFrame.cpp:1145
+#: src/slic3r/GUI/MainFrame.cpp:1248 src/slic3r/GUI/MainFrame.cpp:1252
msgid "Re&load from disk"
-msgstr "Re&load do disco"
+msgstr "Re&carregar do disco"
-#: src/slic3r/GUI/MainFrame.cpp:608
-msgid "Reload the plater from disk"
-msgstr "Recarregar a bendeja do disco"
+#: src/slic3r/GUI/MainFrame.cpp:1151
+msgid "Searc&h"
+msgstr "Pesquisa&r"
+
+#: src/slic3r/GUI/MainFrame.cpp:1152
+msgid "Search in settings"
+msgstr "Procurar em configurações"
-#: src/slic3r/GUI/MainFrame.cpp:617
+#: src/slic3r/GUI/MainFrame.cpp:1160
msgid "&Plater Tab"
msgstr "&Bandeja"
-#: src/slic3r/GUI/MainFrame.cpp:617
+#: src/slic3r/GUI/MainFrame.cpp:1160
msgid "Show the plater"
msgstr "Mostrar a bandeja"
-#: src/slic3r/GUI/MainFrame.cpp:625
+#: src/slic3r/GUI/MainFrame.cpp:1165
msgid "P&rint Settings Tab"
msgstr "C&onfig. de impressão"
-#: src/slic3r/GUI/MainFrame.cpp:625
+#: src/slic3r/GUI/MainFrame.cpp:1165
msgid "Show the print settings"
msgstr "Mostrar as config. de impressão"
-#: src/slic3r/GUI/MainFrame.cpp:628 src/slic3r/GUI/MainFrame.cpp:763
+#: src/slic3r/GUI/MainFrame.cpp:1168 src/slic3r/GUI/MainFrame.cpp:1308
msgid "&Filament Settings Tab"
-msgstr "&config. de filamentos"
+msgstr "&Config. de filamentos"
-#: src/slic3r/GUI/MainFrame.cpp:628
+#: src/slic3r/GUI/MainFrame.cpp:1168
msgid "Show the filament settings"
msgstr "Mostrar as config. de filamento"
-#: src/slic3r/GUI/MainFrame.cpp:632
+#: src/slic3r/GUI/MainFrame.cpp:1172
msgid "Print&er Settings Tab"
msgstr "A&ba de config. da impressora"
-#: src/slic3r/GUI/MainFrame.cpp:632
+#: src/slic3r/GUI/MainFrame.cpp:1172
msgid "Show the printer settings"
msgstr "Mostrar as config. da impressora"
-#: src/slic3r/GUI/MainFrame.cpp:637
+#: src/slic3r/GUI/MainFrame.cpp:1178
msgid "3&D"
msgstr "3&D"
-#: src/slic3r/GUI/MainFrame.cpp:637
+#: src/slic3r/GUI/MainFrame.cpp:1178
msgid "Show the 3D editing view"
msgstr "Mostrar a vista de edição 3D"
-#: src/slic3r/GUI/MainFrame.cpp:640
+#: src/slic3r/GUI/MainFrame.cpp:1181
msgid "Pre&view"
msgstr "Pre&visualização"
-#: src/slic3r/GUI/MainFrame.cpp:640
+#: src/slic3r/GUI/MainFrame.cpp:1181
msgid "Show the 3D slices preview"
msgstr "Mostrar a pré-visualização do fatiamento 3D"
-#: src/slic3r/GUI/MainFrame.cpp:659
+#: src/slic3r/GUI/MainFrame.cpp:1187
msgid "Print &Host Upload Queue"
msgstr "Imprimir &Fila de upload do Host"
-#: src/slic3r/GUI/MainFrame.cpp:659
+#: src/slic3r/GUI/MainFrame.cpp:1187
msgid "Display the Print Host Upload Queue window"
msgstr "Exibir a janela fila de upload do host de impressão"
-#: src/slic3r/GUI/MainFrame.cpp:669
-msgid "Iso"
-msgstr "Isométrico"
-
-#: src/slic3r/GUI/MainFrame.cpp:669
-msgid "Iso View"
-msgstr "Vista isométrica"
-
-#. TRN To be shown in the main menu View->Top
-#. TRN To be shown in Print Settings "Top solid layers"
-#: src/slic3r/GUI/MainFrame.cpp:673 src/libslic3r/PrintConfig.cpp:2132
-#: src/libslic3r/PrintConfig.cpp:2141
-msgid "Top"
-msgstr "Topo"
-
-#: src/slic3r/GUI/MainFrame.cpp:673
-msgid "Top View"
-msgstr "Vista do topo"
-
-#. TRN To be shown in the main menu View->Bottom
-#. TRN To be shown in Print Settings "Bottom solid layers"
-#. TRN To be shown in Print Settings "Top solid layers"
-#: src/slic3r/GUI/MainFrame.cpp:676 src/libslic3r/PrintConfig.cpp:174
-#: src/libslic3r/PrintConfig.cpp:183
-msgid "Bottom"
-msgstr "Base"
-
-#: src/slic3r/GUI/MainFrame.cpp:676
-msgid "Bottom View"
-msgstr "Vista da base"
-
-#: src/slic3r/GUI/MainFrame.cpp:678
-msgid "Front"
-msgstr "Frente"
-
-#: src/slic3r/GUI/MainFrame.cpp:678
-msgid "Front View"
-msgstr "Vista da frente"
-
-#: src/slic3r/GUI/MainFrame.cpp:680 src/libslic3r/PrintConfig.cpp:1632
-msgid "Rear"
-msgstr "Traseira"
-
-#: src/slic3r/GUI/MainFrame.cpp:680
-msgid "Rear View"
-msgstr "Vista traseira"
-
-#: src/slic3r/GUI/MainFrame.cpp:682
-msgid "Left"
-msgstr "Esquerda"
-
-#: src/slic3r/GUI/MainFrame.cpp:682
-msgid "Left View"
-msgstr "Vista esquerda"
-
-#: src/slic3r/GUI/MainFrame.cpp:684
-msgid "Right"
-msgstr "Direita"
-
-#: src/slic3r/GUI/MainFrame.cpp:684
-msgid "Right View"
-msgstr "Vista direita"
-
-#: src/slic3r/GUI/MainFrame.cpp:687
+#: src/slic3r/GUI/MainFrame.cpp:1201
msgid "Show &labels"
msgstr "Mostrar &rótulos"
-#: src/slic3r/GUI/MainFrame.cpp:687
+#: src/slic3r/GUI/MainFrame.cpp:1201
msgid "Show object/instance labels in 3D scene"
msgstr "Mostrar rótulos de objeto/instância em cena 3D"
-#: src/slic3r/GUI/MainFrame.cpp:695
-msgid "Prusa 3D &Drivers"
-msgstr "Drivers 3D &Prusa"
+#: src/slic3r/GUI/MainFrame.cpp:1204
+msgid "&Collapse sidebar"
+msgstr "&Recolher barra lateral"
-#: src/slic3r/GUI/MainFrame.cpp:695
-msgid "Open the Prusa3D drivers download page in your browser"
-msgstr "Abrir a página para baixar os drivers da Prusa3D no seu navegador"
+#: src/slic3r/GUI/MainFrame.cpp:1204 src/slic3r/GUI/Plater.cpp:2247
+msgid "Collapse sidebar"
+msgstr "Recolher barra lateral"
-#: src/slic3r/GUI/MainFrame.cpp:697
-msgid "Software &Releases"
-msgstr "Lançamentos de &software"
-
-#: src/slic3r/GUI/MainFrame.cpp:697
-msgid "Open the software releases page in your browser"
-msgstr "Abrir a página de lançamentos de software no seu navegador"
-
-#: src/slic3r/GUI/MainFrame.cpp:703
-#, c-format
-msgid "%s &Website"
-msgstr "%s &Site"
-
-#: src/slic3r/GUI/MainFrame.cpp:704
-#, c-format
-msgid "Open the %s website in your browser"
-msgstr "Abra o site do %s no seu navegador"
-
-#: src/slic3r/GUI/MainFrame.cpp:710
-msgid "System &Info"
-msgstr "Informação &do sistema"
-
-#: src/slic3r/GUI/MainFrame.cpp:710
-msgid "Show system information"
-msgstr "Mostrar a informação do sistema"
-
-#: src/slic3r/GUI/MainFrame.cpp:712
-msgid "Show &Configuration Folder"
-msgstr "Mostrar &pasta de config."
-
-#: src/slic3r/GUI/MainFrame.cpp:712
-msgid "Show user configuration folder (datadir)"
-msgstr "Mostrar pasta de config. do usuário (datadir)"
-
-#: src/slic3r/GUI/MainFrame.cpp:714
-msgid "Report an I&ssue"
-msgstr "Reportar um p&roblema"
-
-#: src/slic3r/GUI/MainFrame.cpp:714
-#, c-format
-msgid "Report an issue on %s"
-msgstr "Relatar um problema em %s"
-
-#: src/slic3r/GUI/MainFrame.cpp:716
-#, c-format
-msgid "&About %s"
-msgstr "&Sobre %s"
-
-#: src/slic3r/GUI/MainFrame.cpp:716
-msgid "Show about dialog"
-msgstr "Mostrar diálogo sobre"
-
-#: src/slic3r/GUI/MainFrame.cpp:719
-msgid "Show the list of the keyboard shortcuts"
-msgstr "Mostrar lista dos atalhos no teclado"
-
-#: src/slic3r/GUI/MainFrame.cpp:732
+#: src/slic3r/GUI/MainFrame.cpp:1216 src/slic3r/GUI/MainFrame.cpp:1279
msgid "&File"
msgstr "&Arquivo"
-#: src/slic3r/GUI/MainFrame.cpp:733
+#: src/slic3r/GUI/MainFrame.cpp:1217
msgid "&Edit"
msgstr "&Editar"
-#: src/slic3r/GUI/MainFrame.cpp:734
+#: src/slic3r/GUI/MainFrame.cpp:1218
msgid "&Window"
msgstr "&Janela"
-#: src/slic3r/GUI/MainFrame.cpp:735
+#: src/slic3r/GUI/MainFrame.cpp:1219 src/slic3r/GUI/MainFrame.cpp:1280
msgid "&View"
msgstr "&Vista"
-#: src/slic3r/GUI/MainFrame.cpp:738
+#: src/slic3r/GUI/MainFrame.cpp:1222 src/slic3r/GUI/MainFrame.cpp:1283
msgid "&Help"
msgstr "&Ajuda"
-#: src/slic3r/GUI/MainFrame.cpp:760
+#: src/slic3r/GUI/MainFrame.cpp:1244
+msgid "&Open G-code"
+msgstr "&Abrir G-code"
+
+#: src/slic3r/GUI/MainFrame.cpp:1260
+msgid "Open &PrusaSlicer"
+msgstr "Abrir &PrusaSlicer"
+
+#: src/slic3r/GUI/MainFrame.cpp:1305
msgid "E&xport"
msgstr "E&xportar"
-#: src/slic3r/GUI/MainFrame.cpp:761
+#: src/slic3r/GUI/MainFrame.cpp:1306
msgid "S&end to print"
msgstr "E&nviar para impressora"
-#: src/slic3r/GUI/MainFrame.cpp:763
+#: src/slic3r/GUI/MainFrame.cpp:1308
msgid "Mate&rial Settings Tab"
msgstr "A&ba de config. de material"
-#: src/slic3r/GUI/MainFrame.cpp:784
+#: src/slic3r/GUI/MainFrame.cpp:1331
msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):"
msgstr "Escolha um arquivo para fatiar (STL/OBJ/AMF/3MF/PRUSA):"
-#: src/slic3r/GUI/MainFrame.cpp:795
+#: src/slic3r/GUI/MainFrame.cpp:1342
msgid "No previously sliced file."
msgstr "Sem arquivo fatiado anteriormente."
-#: src/slic3r/GUI/MainFrame.cpp:801
+#: src/slic3r/GUI/MainFrame.cpp:1348
msgid "Previously sliced file ("
msgstr "Arquivo fatiado anteriormente ("
-#: src/slic3r/GUI/MainFrame.cpp:801
+#: src/slic3r/GUI/MainFrame.cpp:1348
msgid ") not found."
msgstr ") não encontrado."
-#: src/slic3r/GUI/MainFrame.cpp:802
+#: src/slic3r/GUI/MainFrame.cpp:1349
msgid "File Not Found"
msgstr "Arquivo não encontrado"
-#: src/slic3r/GUI/MainFrame.cpp:837
+#: src/slic3r/GUI/MainFrame.cpp:1384
#, c-format
msgid "Save %s file as:"
msgstr "Salve o arquivo %s como:"
-#: src/slic3r/GUI/MainFrame.cpp:837
+#: src/slic3r/GUI/MainFrame.cpp:1384
msgid "SVG"
msgstr "SVG"
-#: src/slic3r/GUI/MainFrame.cpp:837
+#: src/slic3r/GUI/MainFrame.cpp:1384
msgid "G-code"
msgstr "G-code"
-#: src/slic3r/GUI/MainFrame.cpp:849
+#: src/slic3r/GUI/MainFrame.cpp:1396
msgid "Save zip file as:"
msgstr "Salvar arquivo compactado(zip) como:"
-#: src/slic3r/GUI/MainFrame.cpp:858 src/slic3r/GUI/Plater.cpp:3123
-#: src/slic3r/GUI/Plater.cpp:5109 src/slic3r/GUI/Tab.cpp:1220
-#: src/slic3r/GUI/Tab.cpp:3666
+#: src/slic3r/GUI/MainFrame.cpp:1405 src/slic3r/GUI/Plater.cpp:3009
+#: src/slic3r/GUI/Plater.cpp:5581 src/slic3r/GUI/Tab.cpp:1575
+#: src/slic3r/GUI/Tab.cpp:4115
msgid "Slicing"
msgstr "Fatiamento"
#. TRN "Processing input_file_basename"
-#: src/slic3r/GUI/MainFrame.cpp:860
+#: src/slic3r/GUI/MainFrame.cpp:1407
#, c-format
msgid "Processing %s"
msgstr "Processando %s"
-#: src/slic3r/GUI/MainFrame.cpp:883
-msgid " was successfully sliced."
-msgstr " foi fatiado com sucesso."
+#: src/slic3r/GUI/MainFrame.cpp:1430
+msgid "%1% was successfully sliced."
+msgstr "%1% foi fatiado com sucesso."
-#: src/slic3r/GUI/MainFrame.cpp:885
+#: src/slic3r/GUI/MainFrame.cpp:1432
msgid "Slicing Done!"
msgstr "Fatiamento completo!"
-#: src/slic3r/GUI/MainFrame.cpp:900
+#: src/slic3r/GUI/MainFrame.cpp:1447
msgid "Select the STL file to repair:"
msgstr "Selecione o arquivo STL para corrigir:"
-#: src/slic3r/GUI/MainFrame.cpp:910
+#: src/slic3r/GUI/MainFrame.cpp:1457
msgid "Save OBJ file (less prone to coordinate errors than STL) as:"
-msgstr ""
-"Salvar arquivo OBJ (menos propenso a erros de coordenada que STL) como:"
+msgstr "Salvar arquivo OBJ (menos propenso a erros de coordenada que STL) como:"
-#: src/slic3r/GUI/MainFrame.cpp:922
+#: src/slic3r/GUI/MainFrame.cpp:1469
msgid "Your file was repaired."
msgstr "Seu arquivo foi corrigido."
-#: src/slic3r/GUI/MainFrame.cpp:922 src/libslic3r/PrintConfig.cpp:3457
+#: src/slic3r/GUI/MainFrame.cpp:1469 src/libslic3r/PrintConfig.cpp:3735
msgid "Repair"
msgstr "Corrigir"
-#: src/slic3r/GUI/MainFrame.cpp:936
+#: src/slic3r/GUI/MainFrame.cpp:1483
msgid "Save configuration as:"
msgstr "Salvar config. como:"
-#: src/slic3r/GUI/MainFrame.cpp:955 src/slic3r/GUI/MainFrame.cpp:1017
+#: src/slic3r/GUI/MainFrame.cpp:1502 src/slic3r/GUI/MainFrame.cpp:1564
msgid "Select configuration to load:"
msgstr "Selecionar config. para carregar:"
-#: src/slic3r/GUI/MainFrame.cpp:991
+#: src/slic3r/GUI/MainFrame.cpp:1538
msgid "Save presets bundle as:"
msgstr "Salvar pacote de predefinições como:"
-#: src/slic3r/GUI/MainFrame.cpp:1038
+#: src/slic3r/GUI/MainFrame.cpp:1585
#, c-format
msgid "%d presets successfully imported."
msgstr "%d predefinições importadas com êxito."
-#: src/slic3r/GUI/Mouse3DController.cpp:239
+#: src/slic3r/GUI/Mouse3DController.cpp:461
msgid "3Dconnexion settings"
msgstr "Configurações de 3Dconnexion"
-#: src/slic3r/GUI/Mouse3DController.cpp:254
+#: src/slic3r/GUI/Mouse3DController.cpp:472
msgid "Device:"
msgstr "Dispositivo:"
-#: src/slic3r/GUI/Mouse3DController.cpp:261
+#: src/slic3r/GUI/Mouse3DController.cpp:477
msgid "Speed:"
msgstr "Velocidade:"
-#: src/slic3r/GUI/Mouse3DController.cpp:265
-#: src/slic3r/GUI/Mouse3DController.cpp:288
+#: src/slic3r/GUI/Mouse3DController.cpp:480
+#: src/slic3r/GUI/Mouse3DController.cpp:501
msgid "Translation"
msgstr "Tradução"
-#: src/slic3r/GUI/Mouse3DController.cpp:277
-#: src/slic3r/GUI/Mouse3DController.cpp:288
+#: src/slic3r/GUI/Mouse3DController.cpp:492
+#: src/slic3r/GUI/Mouse3DController.cpp:501
msgid "Zoom"
msgstr "Zoom"
-#: src/slic3r/GUI/Mouse3DController.cpp:284
+#: src/slic3r/GUI/Mouse3DController.cpp:498
msgid "Deadzone:"
msgstr "Zona morta:"
-#: src/slic3r/GUI/MsgDialog.cpp:73
+#: src/slic3r/GUI/Mouse3DController.cpp:513
+msgid "Options:"
+msgstr "Opções de saída:"
+
+#: src/slic3r/GUI/Mouse3DController.cpp:516
+msgid "Swap Y/Z axes"
+msgstr "Trocar eixos Y/Z"
+
+#: src/slic3r/GUI/MsgDialog.cpp:70
#, c-format
msgid "%s error"
msgstr "%s erro"
-#: src/slic3r/GUI/MsgDialog.cpp:74
+#: src/slic3r/GUI/MsgDialog.cpp:71
#, c-format
msgid "%s has encountered an error"
msgstr "%s encontrou um erro"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:56
+#: src/slic3r/GUI/NotificationManager.hpp:471
+msgid "3D Mouse disconnected."
+msgstr "Mouse 3D desconectado."
+
+#: src/slic3r/GUI/NotificationManager.hpp:474
+msgid "Configuration update is available."
+msgstr "A atualização de config. está disponível."
+
+#: src/slic3r/GUI/NotificationManager.hpp:474
+msgid "See more."
+msgstr "Ver mais."
+
+#: src/slic3r/GUI/NotificationManager.hpp:476
+msgid "New version is available."
+msgstr "Nova versão está disponível."
+
+#: src/slic3r/GUI/NotificationManager.hpp:476
+msgid "See Releases page."
+msgstr "Ver página de lançamentos."
+
+#: src/slic3r/GUI/NotificationManager.hpp:479
+msgid ""
+"You have just added a G-code for color change, but its value is empty.\n"
+"To export the G-code correctly, check the \"Color Change G-code\" in \"Printer "
+"Settings > Custom G-code\""
+msgstr ""
+"Você acabou de adicionar um G-code para mudança de cor, mas seu valor está "
+"vazio.\n"
+"Para exportar o G-code corretamente, verifique o \"G-code de mudança de cor\" "
+"em \"Configurações da impressora> G-code personalizado\""
+
+#: src/slic3r/GUI/NotificationManager.cpp:490
+#: src/slic3r/GUI/NotificationManager.cpp:500
+msgid "More"
+msgstr "Mais"
+
+#: src/slic3r/GUI/NotificationManager.cpp:864
+#: src/slic3r/GUI/NotificationManager.cpp:1141
+msgid "Export G-Code."
+msgstr "Exportar G-code."
+
+#: src/slic3r/GUI/NotificationManager.cpp:908
+msgid "Open Folder."
+msgstr "Abrir pasta."
+
+#: src/slic3r/GUI/NotificationManager.cpp:946
+msgid "Eject drive"
+msgstr "Ejetar unidade"
+
+#: src/slic3r/GUI/NotificationManager.cpp:1060
+#: src/slic3r/GUI/NotificationManager.cpp:1076
+#: src/slic3r/GUI/NotificationManager.cpp:1087
+msgid "ERROR:"
+msgstr "ERRO:"
+
+#: src/slic3r/GUI/NotificationManager.cpp:1065
+#: src/slic3r/GUI/NotificationManager.cpp:1080
+#: src/slic3r/GUI/NotificationManager.cpp:1095
+msgid "WARNING:"
+msgstr "AVISO:"
+
+#: src/slic3r/GUI/NotificationManager.cpp:1144
+msgid "Slicing finished."
+msgstr "Fatiamento pronto."
+
+#: src/slic3r/GUI/NotificationManager.cpp:1186
+msgid "Exporting finished."
+msgstr "Exportação finalizada."
+
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:58
msgid "Instances"
msgstr "Instâncias"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:60
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:216
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:62
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:225
#, c-format
msgid "Instance %d"
msgstr "Instância %d"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:67 src/slic3r/GUI/Tab.cpp:3514
-#: src/slic3r/GUI/Tab.cpp:3602
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3962
+#: src/slic3r/GUI/Tab.cpp:4044
msgid "Layers"
msgstr "Camadas"
-#: src/slic3r/GUI/ObjectDataViewModel.cpp:94
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:96
msgid "Range"
msgstr "Intervalo"
-#: src/slic3r/GUI/OptionsGroup.cpp:259
+#: src/slic3r/GUI/OpenGLManager.cpp:259
+#, c-format
+msgid ""
+"PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n"
+"while OpenGL version %s, render %s, vendor %s was detected."
+msgstr ""
+"PrusaSlicer requer drivers capazes de executar OpenGL 2.0, \n"
+"enquanto a versão do OpenGL %s, renderização %s, fornecedor %s foi detectada."
+
+#: src/slic3r/GUI/OpenGLManager.cpp:262
+msgid "You may need to update your graphics card driver."
+msgstr "Você pode ter que atualizar os drivers da sua placa de vídeo."
+
+#: src/slic3r/GUI/OpenGLManager.cpp:265
+msgid ""
+"As a workaround, you may run PrusaSlicer with a software rendered 3D graphics "
+"by running prusa-slicer.exe with the --sw_renderer parameter."
+msgstr ""
+"Como solução alternativa, você pode executar o PrusaSlicer com um software "
+"renderizando gráficos 3D por executar Prusa-slicer.exe com o parâmetro--"
+"sw_renderer."
+
+#: src/slic3r/GUI/OpenGLManager.cpp:267
+msgid "Unsupported OpenGL version"
+msgstr "Versão do OpenGL não suportada"
+
+#: src/slic3r/GUI/OpenGLManager.cpp:275
+#, c-format
+msgid ""
+"Unable to load the following shaders:\n"
+"%s"
+msgstr ""
+"E tem as seguintes alterações não salvas:\n"
+"%s"
+
+#: src/slic3r/GUI/OpenGLManager.cpp:276
+msgid "Error loading shaders"
+msgstr "Erro carregando shaders"
+
+#: src/slic3r/GUI/OptionsGroup.cpp:335
msgctxt "Layers"
msgid "Top"
msgstr "Topo"
-#: src/slic3r/GUI/OptionsGroup.cpp:259
+#: src/slic3r/GUI/OptionsGroup.cpp:335
msgctxt "Layers"
msgid "Bottom"
msgstr "Base"
-#: src/slic3r/GUI/Plater.cpp:161
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:51
+msgid "Delete this preset from this printer device"
+msgstr "Deletar predefinição desta impressora"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:81
+msgid "This printer will be shown in the presets list as"
+msgstr "Esta impressora será na lista de predefinição como"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:155
+msgid "Physical Printer"
+msgstr "Impressora Física"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:161
+msgid "Type here the name of your printer device"
+msgstr "Insira o formato da mesa de impressão"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:172
+msgid "Descriptive name for the printer"
+msgstr "Nome descritivo para a impressora"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:176
+msgid "Add preset for this printer device"
+msgstr "Adicionar predefinição para esta impressora"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:205 src/slic3r/GUI/Tab.cpp:2064
+msgid "Print Host upload"
+msgstr "Upload do host de impressão"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:260
+msgid "Connection to printers connected via the print host failed."
+msgstr "Conexão das impressoras via host de impressão falhou."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:302
+msgid "Test"
+msgstr "Teste"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:307
+msgid "Could not get a valid Printer Host reference"
+msgstr "Não foi possível obter uma referência de host de impressora válida"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:319
+msgid "Success!"
+msgstr "Sucesso!"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:329
+msgid "Refresh Printers"
+msgstr "Atualizar Impressoras"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:356
+msgid ""
+"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-"
+"signed certificate."
+msgstr ""
+"O arquivo HTTPS CA é opcional. Só é necessário se você usar HTTPS com um "
+"certificado auto-assinado."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:366
+msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*"
+msgstr ""
+"Arquivos de certificado (*. CRT, *. pem) | *. CRT; *. pem | Todos os arquivos "
+"| *. *"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:367
+msgid "Open CA certificate file"
+msgstr "Abra o arquivo de certificado da CA"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:395 src/libslic3r/PrintConfig.cpp:124
+msgid "HTTPS CA File"
+msgstr "Arquivo de CA HTTPS"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:396
+#, c-format
+msgid ""
+"On this system, %s uses HTTPS certificates from the system Certificate Store "
+"or Keychain."
+msgstr ""
+"Neste sistema, %s usa certificados HTTPS do sistema Certificate Store ou "
+"keychain."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:397
+msgid ""
+"To use a custom CA file, please import your CA file into Certificate Store / "
+"Keychain."
+msgstr ""
+"Para usar um arquivo de CA personalizado, importe seu arquivo de CA para o "
+"repositório de certificados/chaveiro."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:543
+msgid "The supplied name is empty. It can't be saved."
+msgstr "O nome fornecido está vazio. Não pode ser salvo."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:547
+msgid "You should to change a name of your printer device. It can't be saved."
+msgstr "Você deve mudar o nome da sua impressora. Não pode ser salvo."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:555
+msgid "Printer with name \"%1%\" already exists."
+msgstr "Impressora com nome \"%1%\" já existe."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:556
+msgid "Replace?"
+msgstr "Substituir?"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:579
+msgid ""
+"Following printer preset(s) is duplicated:%1%The above preset for printer \"%2%"
+"\" will be used just once."
+msgstr ""
+"Seguintes predefinições da impressoras estão duplicados:%1%A predefinição "
+"acima para impressora \"%2%\" vai ser usada somente uma vez."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:625
+msgid "It's not possible to delete the last related preset for the printer."
+msgstr ""
+"Não é possível excluir a última predefinição relacionada para a impressora."
+
+#: src/slic3r/GUI/Plater.cpp:163
msgid "Volume"
msgstr "Volume"
-#: src/slic3r/GUI/Plater.cpp:162
+#: src/slic3r/GUI/Plater.cpp:164
msgid "Facets"
msgstr "Facetas"
-#: src/slic3r/GUI/Plater.cpp:163
+#: src/slic3r/GUI/Plater.cpp:165
msgid "Materials"
msgstr "Materiais"
-#: src/slic3r/GUI/Plater.cpp:166
+#: src/slic3r/GUI/Plater.cpp:168
msgid "Manifold"
msgstr "Múltiplo"
-#: src/slic3r/GUI/Plater.cpp:216
+#: src/slic3r/GUI/Plater.cpp:218
msgid "Sliced Info"
msgstr "Informações fatiadas"
-#: src/slic3r/GUI/Plater.cpp:235 src/slic3r/GUI/Plater.cpp:1229
+#: src/slic3r/GUI/Plater.cpp:237 src/slic3r/GUI/Plater.cpp:1151
msgid "Used Filament (m)"
msgstr "Filamento utilizado (m)"
-#: src/slic3r/GUI/Plater.cpp:236
+#: src/slic3r/GUI/Plater.cpp:238 src/slic3r/GUI/Plater.cpp:1163
msgid "Used Filament (mm³)"
msgstr "Filamento utilizado (mm³)"
-#: src/slic3r/GUI/Plater.cpp:237
+#: src/slic3r/GUI/Plater.cpp:239 src/slic3r/GUI/Plater.cpp:1170
msgid "Used Filament (g)"
msgstr "Filamento utilizado (g)"
-#: src/slic3r/GUI/Plater.cpp:238
+#: src/slic3r/GUI/Plater.cpp:240
msgid "Used Material (unit)"
msgstr "Material utilizado (unidade)"
-#: src/slic3r/GUI/Plater.cpp:239
+#: src/slic3r/GUI/Plater.cpp:241
msgid "Cost (money)"
msgstr "Custo (dinheiro)"
-#: src/slic3r/GUI/Plater.cpp:240 src/slic3r/GUI/Plater.cpp:1216
-#: src/slic3r/GUI/Plater.cpp:1258
-msgid "Estimated printing time"
-msgstr "Tempo estimado de impressão"
-
-#: src/slic3r/GUI/Plater.cpp:241
+#: src/slic3r/GUI/Plater.cpp:243
msgid "Number of tool changes"
msgstr "Número de mudanças de ferramenta"
-#: src/slic3r/GUI/Plater.cpp:343
-msgid "Click to edit preset"
-msgstr "Clique para editar a predefinição"
-
-#: src/slic3r/GUI/Plater.cpp:498
+#: src/slic3r/GUI/Plater.cpp:360
msgid "Select what kind of support do you need"
msgstr "Selecione o tipo de suporte que você precisa"
-#: src/slic3r/GUI/Plater.cpp:500 src/libslic3r/PrintConfig.cpp:1901
-#: src/libslic3r/PrintConfig.cpp:2684
+#: src/slic3r/GUI/Plater.cpp:362 src/libslic3r/PrintConfig.cpp:2128
+#: src/libslic3r/PrintConfig.cpp:2923
msgid "Support on build plate only"
msgstr "Suportes somente na mesa de impressão"
-#: src/slic3r/GUI/Plater.cpp:501 src/slic3r/GUI/Plater.cpp:624
+#: src/slic3r/GUI/Plater.cpp:363 src/slic3r/GUI/Plater.cpp:489
msgid "For support enforcers only"
msgstr "Para apenas reforçadores de suporte"
-#: src/slic3r/GUI/Plater.cpp:502
+#: src/slic3r/GUI/Plater.cpp:364
msgid "Everywhere"
msgstr "Em toda parte"
-#: src/slic3r/GUI/Plater.cpp:534 src/slic3r/GUI/Tab.cpp:1116
+#: src/slic3r/GUI/Plater.cpp:396 src/slic3r/GUI/Tab.cpp:1469
msgid "Brim"
msgstr "Aba"
-#: src/slic3r/GUI/Plater.cpp:536
+#: src/slic3r/GUI/Plater.cpp:398
msgid ""
"This flag enables the brim that will be printed around each object on the "
"first layer."
@@ -4211,159 +5500,217 @@ msgstr ""
"Este sinalizador permite que a aba que será impressa em torno de cada objeto "
"na primeira camada."
-#: src/slic3r/GUI/Plater.cpp:544
+#: src/slic3r/GUI/Plater.cpp:406
msgid "Purging volumes"
msgstr "Volumes de purga"
-#: src/slic3r/GUI/Plater.cpp:638
+#: src/slic3r/GUI/Plater.cpp:503
msgid "Select what kind of pad do you need"
msgstr "Selecione o tipo de bloco que você precisa"
-#: src/slic3r/GUI/Plater.cpp:640
+#: src/slic3r/GUI/Plater.cpp:505
msgid "Below object"
msgstr "Abaixo do objeto"
-#: src/slic3r/GUI/Plater.cpp:641
+#: src/slic3r/GUI/Plater.cpp:506
msgid "Around object"
msgstr "Em torno do objeto"
-#: src/slic3r/GUI/Plater.cpp:815
-msgid "Print settings"
-msgstr "Config. de impressão"
-
-#: src/slic3r/GUI/Plater.cpp:816 src/slic3r/GUI/Tab.cpp:1424
-#: src/slic3r/GUI/Tab.cpp:1425
-msgid "Filament"
-msgstr "Filamento"
-
-#: src/slic3r/GUI/Plater.cpp:817
+#: src/slic3r/GUI/Plater.cpp:695
msgid "SLA print settings"
msgstr "Config. de impressão de SLA"
-#: src/slic3r/GUI/Plater.cpp:818 src/slic3r/GUI/Preset.cpp:1536
-msgid "SLA material"
-msgstr "Material de SLA"
-
-#: src/slic3r/GUI/Plater.cpp:819
-msgid "Printer"
-msgstr "Impressora"
-
-#: src/slic3r/GUI/Plater.cpp:878 src/slic3r/GUI/Plater.cpp:5523
+#: src/slic3r/GUI/Plater.cpp:756 src/slic3r/GUI/Plater.cpp:6055
msgid "Send to printer"
msgstr "Enviar para a impressora"
-#: src/slic3r/GUI/Plater.cpp:879
-msgid "Remove device"
-msgstr "Remover dispositivo"
-
-#: src/slic3r/GUI/Plater.cpp:880
-msgid "Export to SD card / Flash drive"
-msgstr "Exportar para cartão SD / unidade Flash"
-
-#: src/slic3r/GUI/Plater.cpp:892 src/slic3r/GUI/Plater.cpp:3123
-#: src/slic3r/GUI/Plater.cpp:5112
+#: src/slic3r/GUI/Plater.cpp:771 src/slic3r/GUI/Plater.cpp:3009
+#: src/slic3r/GUI/Plater.cpp:5584
msgid "Slice now"
msgstr "Fatiar agora"
-#: src/slic3r/GUI/Plater.cpp:1042
+#: src/slic3r/GUI/Plater.cpp:926
msgid "Hold Shift to Slice & Export G-code"
msgstr "Hold Shift to Slice & Export G-code"
-#: src/slic3r/GUI/Plater.cpp:1152
+#: src/slic3r/GUI/Plater.cpp:1071
#, c-format
msgid "%d (%d shells)"
msgstr "%d (%d paredes)"
-#: src/slic3r/GUI/Plater.cpp:1157
+#: src/slic3r/GUI/Plater.cpp:1076
#, c-format
msgid "Auto-repaired (%d errors)"
msgstr "Auto reparando (%d erros):"
-#: src/slic3r/GUI/Plater.cpp:1160
+#: src/slic3r/GUI/Plater.cpp:1079
#, c-format
msgid ""
"%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d "
"facets reversed, %d backwards edges"
msgstr ""
-"%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d "
-"facets reversed, %d backwards edges"
+"%d facetas degeneradas, %d bordas corrigidas, %d facetas removidas, %d facetas "
+"adicionadas, %d facetas revertidas, %d bordas invertidas"
-#: src/slic3r/GUI/Plater.cpp:1170
+#: src/slic3r/GUI/Plater.cpp:1089
msgid "Yes"
msgstr "Sim"
-#: src/slic3r/GUI/Plater.cpp:1191
+#: src/slic3r/GUI/Plater.cpp:1110
msgid "Used Material (ml)"
msgstr "Material usado (ml)"
-#: src/slic3r/GUI/Plater.cpp:1194
+#: src/slic3r/GUI/Plater.cpp:1113
msgid "object(s)"
msgstr "objeto(s)"
-#: src/slic3r/GUI/Plater.cpp:1194
+#: src/slic3r/GUI/Plater.cpp:1113
msgid "supports and pad"
msgstr "suportes e bloco"
-#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245
+#: src/slic3r/GUI/Plater.cpp:1151
+msgid "Used Filament (in)"
+msgstr "Filamento utilizado (pol)"
+
+#: src/slic3r/GUI/Plater.cpp:1153 src/slic3r/GUI/Plater.cpp:1206
msgid "objects"
msgstr "objetos"
-#: src/slic3r/GUI/Plater.cpp:1231 src/slic3r/GUI/Plater.cpp:1245
+#: src/slic3r/GUI/Plater.cpp:1153 src/slic3r/GUI/Plater.cpp:1206
msgid "wipe tower"
msgstr "torre de limpeza"
-#: src/slic3r/GUI/Plater.cpp:1243 src/libslic3r/PrintConfig.cpp:760
-#: src/libslic3r/PrintConfig.cpp:2510 src/libslic3r/PrintConfig.cpp:2511
-msgid "Cost"
-msgstr "Custo"
+#: src/slic3r/GUI/Plater.cpp:1163
+msgid "Used Filament (in³)"
+msgstr "Filamento utilizado (pol³)"
-#: src/slic3r/GUI/Plater.cpp:1260 src/libslic3r/PrintConfig.cpp:582
-msgid "Color"
-msgstr "Cor"
+#: src/slic3r/GUI/Plater.cpp:1189
+msgid "Filament at extruder %1%"
+msgstr "Filamento na extrusora %1%"
-#: src/slic3r/GUI/Plater.cpp:1261
-msgid "Pause"
-msgstr "Pausar"
+#: src/slic3r/GUI/Plater.cpp:1195
+msgid "(including spool)"
+msgstr "(incluindo carretel)"
+
+#: src/slic3r/GUI/Plater.cpp:1204 src/libslic3r/PrintConfig.cpp:822
+#: src/libslic3r/PrintConfig.cpp:2738 src/libslic3r/PrintConfig.cpp:2739
+msgid "Cost"
+msgstr "Custo"
-#: src/slic3r/GUI/Plater.cpp:1286
+#: src/slic3r/GUI/Plater.cpp:1222
msgid "normal mode"
msgstr "modo normal"
-#: src/slic3r/GUI/Plater.cpp:1291
+#: src/slic3r/GUI/Plater.cpp:1232
msgid "stealth mode"
msgstr "modo silencioso"
-#: src/slic3r/GUI/Plater.cpp:1395
+#: src/slic3r/GUI/Plater.cpp:1403 src/slic3r/GUI/Plater.cpp:4923
+#, c-format
+msgid "%s - Drop project file"
+msgstr "%s - Soltar arquivo de projeto"
+
+#: src/slic3r/GUI/Plater.cpp:1410 src/slic3r/GUI/Plater.cpp:4930
+msgid "Open as project"
+msgstr "Abrir como projeto"
+
+#: src/slic3r/GUI/Plater.cpp:1411 src/slic3r/GUI/Plater.cpp:4931
+msgid "Import geometry only"
+msgstr "Modelo somente geometria"
+
+#: src/slic3r/GUI/Plater.cpp:1412 src/slic3r/GUI/Plater.cpp:4932
+msgid "Import config only"
+msgstr "Importar somente config"
+
+#: src/slic3r/GUI/Plater.cpp:1415 src/slic3r/GUI/Plater.cpp:4935
+msgid "Select an action to apply to the file"
+msgstr "Selecione uma ação para aplicar ao arquivo"
+
+#: src/slic3r/GUI/Plater.cpp:1416 src/slic3r/GUI/Plater.cpp:4936
+msgid "Action"
+msgstr "Ação"
+
+#: src/slic3r/GUI/Plater.cpp:1424 src/slic3r/GUI/Plater.cpp:4944
+msgid "Don't show again"
+msgstr "Não mostrar novamente"
+
+#: src/slic3r/GUI/Plater.cpp:1469 src/slic3r/GUI/Plater.cpp:4981
+msgid "You can open only one .gcode file at a time."
+msgstr "Você pode abrir apenas um arquivo .gcode por vez."
+
+#: src/slic3r/GUI/Plater.cpp:1470 src/slic3r/GUI/Plater.cpp:4982
+msgid "Drag and drop G-code file"
+msgstr "Arraste e solte o arquivo G-code"
+
+#: src/slic3r/GUI/Plater.cpp:1524 src/slic3r/GUI/Plater.cpp:4796
+#: src/slic3r/GUI/Plater.cpp:5036
+msgid "Import Object"
+msgstr "Importar objeto"
+
+#: src/slic3r/GUI/Plater.cpp:1546 src/slic3r/GUI/Plater.cpp:5058
msgid "Load File"
msgstr "Carregar arquivo"
-#: src/slic3r/GUI/Plater.cpp:1399
+#: src/slic3r/GUI/Plater.cpp:1551 src/slic3r/GUI/Plater.cpp:5063
msgid "Load Files"
msgstr "Carregar arquivos"
-#: src/slic3r/GUI/Plater.cpp:2155
+#: src/slic3r/GUI/Plater.cpp:1654
+msgid "Fill bed"
+msgstr "Preencher mesa"
+
+#: src/slic3r/GUI/Plater.cpp:1660
+msgid "Optimize Rotation"
+msgstr "Otimize a rotação"
+
+#: src/slic3r/GUI/Plater.cpp:1666
+msgid "Import SLA archive"
+msgstr "Importar arquivo SLA"
+
+#: src/slic3r/GUI/Plater.cpp:2129
+#, c-format
+msgid ""
+"Successfully unmounted. The device %s(%s) can now be safely removed from the "
+"computer."
+msgstr ""
+"Desmontado com sucesso. O dispositivo %s(%s) agora pode ser removido com "
+"segurança do computador."
+
+#: src/slic3r/GUI/Plater.cpp:2134
+#, c-format
+msgid "Ejecting of device %s(%s) has failed."
+msgstr "Ejetar o dispositivo %s(%s) falhou."
+
+#: src/slic3r/GUI/Plater.cpp:2153
msgid "New Project"
msgstr "Novo projeto"
-#: src/slic3r/GUI/Plater.cpp:2275
+#: src/slic3r/GUI/Plater.cpp:2246
+msgid "Expand sidebar"
+msgstr "Expandir barra lateral"
+
+#: src/slic3r/GUI/Plater.cpp:2319
msgid "Loading"
msgstr "Carregando"
-#: src/slic3r/GUI/Plater.cpp:2285
-#, c-format
-msgid "Processing input file %s"
-msgstr "Processando o arquivo de entrada %s"
+#: src/slic3r/GUI/Plater.cpp:2329
+msgid "Loading file"
+msgstr "Carregar arquivo de config"
-#: src/slic3r/GUI/Plater.cpp:2313
-msgid "You cannot load SLA project with a multi-part object on the bed"
+#: src/slic3r/GUI/Plater.cpp:2415
+#, c-format
+msgid ""
+"Some object(s) in file %s looks like saved in inches.\n"
+"Should I consider them as a saved in inches and convert them?"
msgstr ""
-"Você não pode carregar o projeto SLA com um objeto de várias partes na cama"
+"Alguns objetos no arquivo %s parecem ser salvos em polegadas.\n"
+"Devo considerá-los como salvos em polegadas e convertê-los?"
-#: src/slic3r/GUI/Plater.cpp:2314 src/slic3r/GUI/Tab.cpp:2961
-msgid "Please check your object list before preset changing."
-msgstr "Verifique a lista de objetos antes de alterar a predefinição."
+#: src/slic3r/GUI/Plater.cpp:2417
+msgid "The object appears to be saved in inches"
+msgstr "Esse objeto parece estar salvo em polegadas"
-#: src/slic3r/GUI/Plater.cpp:2359
+#: src/slic3r/GUI/Plater.cpp:2425
msgid ""
"This file contains several objects positioned at multiple heights.\n"
"Instead of considering them as multiple objects, should I consider\n"
@@ -4373,11 +5720,11 @@ msgstr ""
"Em vez de considerá-los como múltiplos objetos, devo considerar\n"
"Este arquivo como um único objeto com várias partes?"
-#: src/slic3r/GUI/Plater.cpp:2362 src/slic3r/GUI/Plater.cpp:2415
+#: src/slic3r/GUI/Plater.cpp:2428 src/slic3r/GUI/Plater.cpp:2481
msgid "Multi-part object detected"
msgstr "Objeto de várias partes detectado"
-#: src/slic3r/GUI/Plater.cpp:2369
+#: src/slic3r/GUI/Plater.cpp:2435
msgid ""
"This file cannot be loaded in a simple mode. Do you want to switch to an "
"advanced mode?"
@@ -4385,20 +5732,20 @@ msgstr ""
"Este arquivo não pode ser carregado em um modo simples. Deseja mudar para um "
"modo avançado?"
-#: src/slic3r/GUI/Plater.cpp:2370
+#: src/slic3r/GUI/Plater.cpp:2436
msgid "Detected advanced data"
msgstr "Dados avançados detectados"
-#: src/slic3r/GUI/Plater.cpp:2392
+#: src/slic3r/GUI/Plater.cpp:2458
#, c-format
msgid ""
-"You can't to add the object(s) from %s because of one or some of them "
-"is(are) multi-part"
+"You can't to add the object(s) from %s because of one or some of them is(are) "
+"multi-part"
msgstr ""
"Você não pode adicionar o objeto (s) %s por causa de um ou alguns deles é "
"(são) de várias partes"
-#: src/slic3r/GUI/Plater.cpp:2412
+#: src/slic3r/GUI/Plater.cpp:2478
msgid ""
"Multiple objects were loaded for a multi-material printer.\n"
"Instead of considering them as multiple objects, should I consider\n"
@@ -4408,101 +5755,47 @@ msgstr ""
"Em vez de considerá-los como múltiplos objetos, devo considerar\n"
"esses arquivos para representar um único objeto com várias partes?"
-#: src/slic3r/GUI/Plater.cpp:2428
+#: src/slic3r/GUI/Plater.cpp:2494
msgid "Loaded"
msgstr "Carregado"
-#: src/slic3r/GUI/Plater.cpp:2530
+#: src/slic3r/GUI/Plater.cpp:2596
msgid ""
"Your object appears to be too large, so it was automatically scaled down to "
"fit your print bed."
msgstr ""
-"Seu objeto parece ser muito grande, por isso foi automaticamente "
-"dimensionado para baixo para caber sua mesa de impressão."
+"Seu objeto parece ser muito grande, por isso foi automaticamente dimensionado "
+"para baixo para caber sua mesa de impressão."
-#: src/slic3r/GUI/Plater.cpp:2531
+#: src/slic3r/GUI/Plater.cpp:2597
msgid "Object too large?"
msgstr "Objeto muito grande?"
-#: src/slic3r/GUI/Plater.cpp:2593
+#: src/slic3r/GUI/Plater.cpp:2659
msgid "Export STL file:"
msgstr "Exportar arquivo STL:"
-#: src/slic3r/GUI/Plater.cpp:2600
+#: src/slic3r/GUI/Plater.cpp:2666
msgid "Export AMF file:"
msgstr "Exportar arquivo AMF:"
-#: src/slic3r/GUI/Plater.cpp:2606
+#: src/slic3r/GUI/Plater.cpp:2672
msgid "Save file as:"
msgstr "Salvar arquivo como:"
-#: src/slic3r/GUI/Plater.cpp:2612
+#: src/slic3r/GUI/Plater.cpp:2678
msgid "Export OBJ file:"
msgstr "Exportar arquivo OBJ:"
-#: src/slic3r/GUI/Plater.cpp:2714
+#: src/slic3r/GUI/Plater.cpp:2774
msgid "Delete Object"
msgstr "Excluir objeto"
-#: src/slic3r/GUI/Plater.cpp:2725
+#: src/slic3r/GUI/Plater.cpp:2785
msgid "Reset Project"
msgstr "Redefinir projeto"
-#: src/slic3r/GUI/Plater.cpp:2762
-msgid "Hollow"
-msgstr "Vazado"
-
-#: src/slic3r/GUI/Plater.cpp:2769
-msgid "Optimize Rotation"
-msgstr "Otimize a rotação"
-
-#: src/slic3r/GUI/Plater.cpp:2815
-msgid "Arranging"
-msgstr "Organizar"
-
-#: src/slic3r/GUI/Plater.cpp:2837
-msgid "Could not arrange model objects! Some geometries may be invalid."
-msgstr ""
-"Não foi possível organizar objetos de modelo! Algumas geometrias podem ser "
-"inválidas."
-
-#: src/slic3r/GUI/Plater.cpp:2843
-msgid "Arranging canceled."
-msgstr "Arranjo cancelado."
-
-#: src/slic3r/GUI/Plater.cpp:2844
-msgid "Arranging done."
-msgstr "Arranjo feito."
-
-#: src/slic3r/GUI/Plater.cpp:2860
-msgid "Searching for optimal orientation"
-msgstr "Procurando orientação ideal"
-
-#: src/slic3r/GUI/Plater.cpp:2893
-msgid "Orientation search canceled."
-msgstr "Pesquisa de orientação cancelada."
-
-#: src/slic3r/GUI/Plater.cpp:2894
-msgid "Orientation found."
-msgstr "Orientação encontrada."
-
-#: src/slic3r/GUI/Plater.cpp:2924
-msgid "Indexing hollowed object"
-msgstr "Indexando objeto oco"
-
-#: src/slic3r/GUI/Plater.cpp:2928
-msgid "Hollowing cancelled."
-msgstr "Cancelado"
-
-#: src/slic3r/GUI/Plater.cpp:2929
-msgid "Hollowing done."
-msgstr "Deixado oco pronto."
-
-#: src/slic3r/GUI/Plater.cpp:2931
-msgid "Hollowing failed."
-msgstr "Deixar oco falhou."
-
-#: src/slic3r/GUI/Plater.cpp:2972
+#: src/slic3r/GUI/Plater.cpp:2857
msgid ""
"The selected object can't be split because it contains more than one volume/"
"material."
@@ -4510,278 +5803,303 @@ msgstr ""
"O objeto selecionado não pode ser dividido porque contém mais de um volume/"
"material."
-#: src/slic3r/GUI/Plater.cpp:2983
+#: src/slic3r/GUI/Plater.cpp:2868
msgid "Split to Objects"
msgstr "Dividir em objetos"
-#: src/slic3r/GUI/Plater.cpp:3108
+#: src/slic3r/GUI/Plater.cpp:2993 src/slic3r/GUI/Plater.cpp:3723
msgid "Invalid data"
msgstr "Dados inválidos"
-#: src/slic3r/GUI/Plater.cpp:3117
+#: src/slic3r/GUI/Plater.cpp:3003
msgid "Ready to slice"
msgstr "Pronto para fatiar"
-#: src/slic3r/GUI/Plater.cpp:3155 src/slic3r/GUI/PrintHostDialogs.cpp:232
+#: src/slic3r/GUI/Plater.cpp:3041 src/slic3r/GUI/PrintHostDialogs.cpp:264
msgid "Cancelling"
msgstr "Cancelar"
-#: src/slic3r/GUI/Plater.cpp:3172
+#: src/slic3r/GUI/Plater.cpp:3060
msgid "Another export job is currently running."
msgstr "Outro trabalho de exportação está em execução no momento."
-#: src/slic3r/GUI/Plater.cpp:3288
+#: src/slic3r/GUI/Plater.cpp:3177
msgid "Please select the file to reload"
msgstr "Selecione o arquivo STL para recarregar"
-#: src/slic3r/GUI/Plater.cpp:3323
+#: src/slic3r/GUI/Plater.cpp:3212
msgid "It is not allowed to change the file to reload"
msgstr "Não é permitido alterar o arquivo para recarregar"
-#: src/slic3r/GUI/Plater.cpp:3323
+#: src/slic3r/GUI/Plater.cpp:3212
msgid "Do you want to retry"
msgstr "Você quer prosseguir"
-#: src/slic3r/GUI/Plater.cpp:3341
+#: src/slic3r/GUI/Plater.cpp:3230
msgid "Reload from:"
msgstr "Recarregar a partir do disco:"
-#: src/slic3r/GUI/Plater.cpp:3430
+#: src/slic3r/GUI/Plater.cpp:3323
msgid "Unable to reload:"
msgstr "Não é possível recarregar:"
-#: src/slic3r/GUI/Plater.cpp:3435
+#: src/slic3r/GUI/Plater.cpp:3328
msgid "Error during reload"
msgstr "Erro durante a recarga"
-#: src/slic3r/GUI/Plater.cpp:3454
+#: src/slic3r/GUI/Plater.cpp:3347
msgid "Reload all from disk"
msgstr "Recarregar tudo do disco"
-#: src/slic3r/GUI/Plater.cpp:3475
-msgid "Fix Throught NetFabb"
-msgstr "Arrumar através do NetFabb"
+#: src/slic3r/GUI/Plater.cpp:3374
+msgid ""
+"ERROR: Please close all manipulators available from the left toolbar before "
+"fixing the mesh."
+msgstr ""
+"ERRO: Por favor, feche todos os manipuladores disponíveis na barra de "
+"ferramentas esquerda antes de consertar a malha."
+
+#: src/slic3r/GUI/Plater.cpp:3380
+msgid "Fix through NetFabb"
+msgstr "Arrumar através do NetFabb"
-#: src/slic3r/GUI/Plater.cpp:3666
-msgid "Export failed"
-msgstr "Falha na exportação"
+#: src/slic3r/GUI/Plater.cpp:3397
+msgid "Custom supports and seams were removed after repairing the mesh."
+msgstr ""
+"Suportes e costuras personalizados foram removidos após o reparo da malha."
+
+#: src/slic3r/GUI/Plater.cpp:3680
+msgid "There are active warnings concerning sliced models:"
+msgstr "Existem avisos ativos sobre modelos fatiados:"
-#: src/slic3r/GUI/Plater.cpp:3671 src/slic3r/GUI/PrintHostDialogs.cpp:233
+#: src/slic3r/GUI/Plater.cpp:3691
+msgid "generated warnings"
+msgstr "avisos gerados"
+
+#: src/slic3r/GUI/Plater.cpp:3731 src/slic3r/GUI/PrintHostDialogs.cpp:265
msgid "Cancelled"
msgstr "Cancelado"
-#: src/slic3r/GUI/Plater.cpp:3933 src/slic3r/GUI/Plater.cpp:3955
+#: src/slic3r/GUI/Plater.cpp:3998 src/slic3r/GUI/Plater.cpp:4022
msgid "Remove the selected object"
msgstr "Remover o objeto selecionado"
-#: src/slic3r/GUI/Plater.cpp:3942
+#: src/slic3r/GUI/Plater.cpp:4007
msgid "Add one more instance of the selected object"
msgstr "Adicionar mais uma instância do objeto selecionado"
-#: src/slic3r/GUI/Plater.cpp:3944
+#: src/slic3r/GUI/Plater.cpp:4009
msgid "Remove one instance of the selected object"
msgstr "Remover uma instância do objeto selecionado"
-#: src/slic3r/GUI/Plater.cpp:3946
+#: src/slic3r/GUI/Plater.cpp:4011
msgid "Set number of instances"
msgstr "Definir o número de instâncias"
-#: src/slic3r/GUI/Plater.cpp:3946
+#: src/slic3r/GUI/Plater.cpp:4011
msgid "Change the number of instances of the selected object"
msgstr "Alterar o número de instâncias do objeto selecionado"
-#: src/slic3r/GUI/Plater.cpp:3965
+#: src/slic3r/GUI/Plater.cpp:4013
+msgid "Fill bed with instances"
+msgstr "Preencher mesa com instancias"
+
+#: src/slic3r/GUI/Plater.cpp:4013
+msgid "Fill the remaining area of bed with instances of the selected object"
+msgstr ""
+"Preencher o restante da área da mesa com instancias do objeto selecionado"
+
+#: src/slic3r/GUI/Plater.cpp:4032
msgid "Reload the selected object from disk"
msgstr "Recarregue o objeto selecionado do disco"
-#: src/slic3r/GUI/Plater.cpp:3968
+#: src/slic3r/GUI/Plater.cpp:4035
msgid "Export the selected object as STL file"
msgstr "Exportar o objeto selecionado como arquivo STL"
-#: src/slic3r/GUI/Plater.cpp:3997
+#: src/slic3r/GUI/Plater.cpp:4065
msgid "Along X axis"
msgstr "Ao longo do eixo X"
-#: src/slic3r/GUI/Plater.cpp:3997
+#: src/slic3r/GUI/Plater.cpp:4065
msgid "Mirror the selected object along the X axis"
msgstr "Espelhar o objeto selecionado ao longo do eixo X"
-#: src/slic3r/GUI/Plater.cpp:3999
+#: src/slic3r/GUI/Plater.cpp:4067
msgid "Along Y axis"
msgstr "Ao longo do eixo Y"
-#: src/slic3r/GUI/Plater.cpp:3999
+#: src/slic3r/GUI/Plater.cpp:4067
msgid "Mirror the selected object along the Y axis"
msgstr "Espelhar o objeto selecionado ao longo do eixo Y"
-#: src/slic3r/GUI/Plater.cpp:4001
+#: src/slic3r/GUI/Plater.cpp:4069
msgid "Along Z axis"
msgstr "Ao longo do eixo Z"
-#: src/slic3r/GUI/Plater.cpp:4001
+#: src/slic3r/GUI/Plater.cpp:4069
msgid "Mirror the selected object along the Z axis"
msgstr "Espelhar o objeto selecionado ao longo do eixo Z"
-#: src/slic3r/GUI/Plater.cpp:4004
+#: src/slic3r/GUI/Plater.cpp:4072
msgid "Mirror"
msgstr "Espelhar"
-#: src/slic3r/GUI/Plater.cpp:4004
+#: src/slic3r/GUI/Plater.cpp:4072
msgid "Mirror the selected object"
msgstr "Espelhar o objeto selecionado"
-#: src/slic3r/GUI/Plater.cpp:4016
+#: src/slic3r/GUI/Plater.cpp:4084
msgid "To objects"
msgstr "Para objetos"
-#: src/slic3r/GUI/Plater.cpp:4016 src/slic3r/GUI/Plater.cpp:4036
+#: src/slic3r/GUI/Plater.cpp:4084 src/slic3r/GUI/Plater.cpp:4104
msgid "Split the selected object into individual objects"
msgstr "Dividir o objeto selecionado em objetos individuais"
-#: src/slic3r/GUI/Plater.cpp:4018
+#: src/slic3r/GUI/Plater.cpp:4086
msgid "To parts"
msgstr "Para peças"
-#: src/slic3r/GUI/Plater.cpp:4018 src/slic3r/GUI/Plater.cpp:4050
+#: src/slic3r/GUI/Plater.cpp:4086 src/slic3r/GUI/Plater.cpp:4122
msgid "Split the selected object into individual sub-parts"
msgstr "Dividir o objeto selecionado em subpartes individuais"
-#: src/slic3r/GUI/Plater.cpp:4021 src/slic3r/GUI/Plater.cpp:4036
-#: src/slic3r/GUI/Plater.cpp:4050 src/libslic3r/PrintConfig.cpp:3481
+#: src/slic3r/GUI/Plater.cpp:4089 src/slic3r/GUI/Plater.cpp:4104
+#: src/slic3r/GUI/Plater.cpp:4122 src/libslic3r/PrintConfig.cpp:3759
msgid "Split"
msgstr "Dividir"
-#: src/slic3r/GUI/Plater.cpp:4021
+#: src/slic3r/GUI/Plater.cpp:4089
msgid "Split the selected object"
msgstr "Dividir o objeto selecionado"
-#: src/slic3r/GUI/Plater.cpp:4042
+#: src/slic3r/GUI/Plater.cpp:4111
msgid "Optimize orientation"
msgstr "Otimize a orientação"
-#: src/slic3r/GUI/Plater.cpp:4042
+#: src/slic3r/GUI/Plater.cpp:4112
msgid "Optimize the rotation of the object for better print results."
-msgstr ""
-"Otimize a rotação do objeto para obter melhores resultados de impressão."
+msgstr "Otimize a rotação do objeto para obter melhores resultados de impressão."
-#: src/slic3r/GUI/Plater.cpp:4099
+#: src/slic3r/GUI/Plater.cpp:4192
msgid "3D editor view"
msgstr "vista do editor 3D"
-#: src/slic3r/GUI/Plater.cpp:4402
+#: src/slic3r/GUI/Plater.cpp:4564
msgid ""
-"%1% printer was active at the time the target Undo / Redo snapshot was "
-"taken. Switching to %1% printer requires reloading of %1% presets."
+"%1% printer was active at the time the target Undo / Redo snapshot was taken. "
+"Switching to %1% printer requires reloading of %1% presets."
msgstr ""
-"a impressora %1% estava ativa no momento em que a captura de desfazer/"
-"refazer de destino foi tirado. Mudar para %1% impressora requer recarga de "
-"%1% predefinições."
+"a impressora %1% estava ativa no momento em que a captura de desfazer/refazer "
+"de destino foi tirado. Mudar para %1% impressora requer recarga de %1% "
+"predefinições."
-#: src/slic3r/GUI/Plater.cpp:4577
+#: src/slic3r/GUI/Plater.cpp:4768
msgid "Load Project"
msgstr "Carregar projeto"
-#: src/slic3r/GUI/Plater.cpp:4605
-msgid "Import Object"
-msgstr "Importar objeto"
-
-#: src/slic3r/GUI/Plater.cpp:4609
+#: src/slic3r/GUI/Plater.cpp:4800
msgid "Import Objects"
msgstr "Importar objetos"
-#: src/slic3r/GUI/Plater.cpp:4671
+#: src/slic3r/GUI/Plater.cpp:4868
+msgid "The selected file"
+msgstr "O arquivo selecionado"
+
+#: src/slic3r/GUI/Plater.cpp:4868
+msgid "does not contain valid gcode."
+msgstr "não contém um gcode válido."
+
+#: src/slic3r/GUI/Plater.cpp:4869
+msgid "Error while loading .gcode file"
+msgstr "Erro durante carregamento do arquivo .gcode"
+
+#: src/slic3r/GUI/Plater.cpp:5107
msgid "All objects will be removed, continue?"
msgstr "Todos os objetos serão removidos, continuar?"
-#: src/slic3r/GUI/Plater.cpp:4679
+#: src/slic3r/GUI/Plater.cpp:5115
msgid "Delete Selected Objects"
msgstr "Excluir objetos selecionados"
-#: src/slic3r/GUI/Plater.cpp:4687
+#: src/slic3r/GUI/Plater.cpp:5123
msgid "Increase Instances"
msgstr "Aumentar instâncias"
-#: src/slic3r/GUI/Plater.cpp:4722
+#: src/slic3r/GUI/Plater.cpp:5157
msgid "Decrease Instances"
msgstr "Diminuir instâncias"
-#: src/slic3r/GUI/Plater.cpp:4753
+#: src/slic3r/GUI/Plater.cpp:5188
msgid "Enter the number of copies:"
msgstr "Definir números de cópias:"
-#: src/slic3r/GUI/Plater.cpp:4754
+#: src/slic3r/GUI/Plater.cpp:5189
msgid "Copies of the selected object"
msgstr "Cópias do objeto selecionado"
-#: src/slic3r/GUI/Plater.cpp:4758
+#: src/slic3r/GUI/Plater.cpp:5193
#, c-format
msgid "Set numbers of copies to %d"
msgstr "Definir números de cópias para %d"
-#: src/slic3r/GUI/Plater.cpp:4788
+#: src/slic3r/GUI/Plater.cpp:5259
msgid "Cut by Plane"
msgstr "Cortado por plano"
-#: src/slic3r/GUI/Plater.cpp:4841
+#: src/slic3r/GUI/Plater.cpp:5316
msgid "Save G-code file as:"
msgstr "Salve o arquivo G-code como:"
-#: src/slic3r/GUI/Plater.cpp:4841
+#: src/slic3r/GUI/Plater.cpp:5316
msgid "Save SL1 file as:"
msgstr "Salvar SL1 arquivo como:"
-#: src/slic3r/GUI/Plater.cpp:4987
+#: src/slic3r/GUI/Plater.cpp:5463
#, c-format
msgid "STL file exported to %s"
msgstr "Arquivo STL exportado para %s"
-#: src/slic3r/GUI/Plater.cpp:5004
+#: src/slic3r/GUI/Plater.cpp:5480
#, c-format
msgid "AMF file exported to %s"
msgstr "Arquivo AMF exportado para %s"
-#: src/slic3r/GUI/Plater.cpp:5007
+#: src/slic3r/GUI/Plater.cpp:5483
#, c-format
msgid "Error exporting AMF file %s"
msgstr "Erro ao exportar arquivo AMF %s"
-#: src/slic3r/GUI/Plater.cpp:5040
+#: src/slic3r/GUI/Plater.cpp:5512
#, c-format
msgid "3MF file exported to %s"
msgstr "Arquivo 3MF exportado para %s"
-#: src/slic3r/GUI/Plater.cpp:5045
+#: src/slic3r/GUI/Plater.cpp:5517
#, c-format
msgid "Error exporting 3MF file %s"
msgstr "Erro ao exportar arquivo 3MF %s"
-#: src/slic3r/GUI/Plater.cpp:5205
-#, c-format
-msgid ""
-"Unmounting successful. The device %s(%s) can now be safely removed from the "
-"computer."
-msgstr ""
-"Não montando bem sucedido. O dispositivo %s(%s) agora pode ser removido com "
-"segurança do computador."
-
-#: src/slic3r/GUI/Plater.cpp:5522
+#: src/slic3r/GUI/Plater.cpp:6054
msgid "Export"
msgstr "Exportar"
-#: src/slic3r/GUI/Plater.cpp:5608
+#: src/slic3r/GUI/Plater.cpp:6149
msgid "Paste From Clipboard"
msgstr "Colar da área de transferência"
-#: src/slic3r/GUI/Preferences.cpp:22 src/slic3r/GUI/Tab.cpp:1798
-#: src/slic3r/GUI/Tab.cpp:2042
+#: src/slic3r/GUI/Preferences.cpp:56 src/slic3r/GUI/Tab.cpp:2098
+#: src/slic3r/GUI/Tab.cpp:2285 src/slic3r/GUI/Tab.cpp:2393
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1080
msgid "General"
msgstr "Geral"
-#: src/slic3r/GUI/Preferences.cpp:39
+#: src/slic3r/GUI/Preferences.cpp:69
msgid "Remember output directory"
msgstr "Lembrar diretório de saída"
-#: src/slic3r/GUI/Preferences.cpp:41
+#: src/slic3r/GUI/Preferences.cpp:71
msgid ""
"If this is enabled, Slic3r will prompt the last output directory instead of "
"the one containing the input files."
@@ -4789,11 +6107,11 @@ msgstr ""
"Se isso estiver habilitado, Slic3r solicitará o último diretório de saída em "
"vez de um contendo os arquivos de entrada."
-#: src/slic3r/GUI/Preferences.cpp:47
+#: src/slic3r/GUI/Preferences.cpp:77
msgid "Auto-center parts"
msgstr "Centrar automaticamente as partes"
-#: src/slic3r/GUI/Preferences.cpp:49
+#: src/slic3r/GUI/Preferences.cpp:79
msgid ""
"If this is enabled, Slic3r will auto-center objects around the print bed "
"center."
@@ -4801,44 +6119,53 @@ msgstr ""
"Se isso estiver habilitado, o Slic3r irá centralizar objetos automaticamente "
"ao redor do centro de mesa de impressão."
-#: src/slic3r/GUI/Preferences.cpp:55
+#: src/slic3r/GUI/Preferences.cpp:85
msgid "Background processing"
msgstr "Processamento em segundo plano"
-#: src/slic3r/GUI/Preferences.cpp:57
+#: src/slic3r/GUI/Preferences.cpp:87
msgid ""
-"If this is enabled, Slic3r will pre-process objects as soon as they're "
-"loaded in order to save time when exporting G-code."
+"If this is enabled, Slic3r will pre-process objects as soon as they're loaded "
+"in order to save time when exporting G-code."
msgstr ""
"Se isso estiver ativado, o Slic3r irá pré-processar objetos assim que eles "
"forem carregados para economizar tempo ao exportar o G-code."
-#: src/slic3r/GUI/Preferences.cpp:66
+#: src/slic3r/GUI/Preferences.cpp:96
msgid ""
-"If enabled, PrusaSlicer will check for the new versions of itself online. "
-"When a new version becomes available a notification is displayed at the next "
-"application startup (never during program usage). This is only a "
-"notification mechanisms, no automatic installation is done."
+"If enabled, PrusaSlicer will check for the new versions of itself online. When "
+"a new version becomes available a notification is displayed at the next "
+"application startup (never during program usage). This is only a notification "
+"mechanisms, no automatic installation is done."
msgstr ""
-"Se habilitado, PrusaSlicer irá verificar as novas versões de si mesmo on-"
-"line. Quando uma nova versão se torna disponível, uma notificação é exibida "
-"na próxima inicialização do aplicativo (nunca durante o uso do programa). "
-"Este é apenas um mecanismos de notificação, nenhuma instalação automática é "
-"feita."
+"Se habilitado, PrusaSlicer irá verificar as novas versões de si mesmo on-line. "
+"Quando uma nova versão se torna disponível, uma notificação é exibida na "
+"próxima inicialização do aplicativo (nunca durante o uso do programa). Este é "
+"apenas um mecanismos de notificação, nenhuma instalação automática é feita."
-#: src/slic3r/GUI/Preferences.cpp:72
+#: src/slic3r/GUI/Preferences.cpp:102
msgid "Export sources full pathnames to 3mf and amf"
msgstr "Fontes de exportação completas para 3mf e amf"
-#: src/slic3r/GUI/Preferences.cpp:74
+#: src/slic3r/GUI/Preferences.cpp:104
msgid ""
-"If enabled, allows the Reload from disk command to automatically find and "
-"load the files when invoked."
+"If enabled, allows the Reload from disk command to automatically find and load "
+"the files when invoked."
msgstr ""
"Se ativado, permite que o comando Reload from disk encontre e carregue "
"automaticamente os arquivos quando invocado."
-#: src/slic3r/GUI/Preferences.cpp:82
+#: src/slic3r/GUI/Preferences.cpp:114
+msgid "If enabled, sets PrusaSlicer as default application to open .3mf files."
+msgstr ""
+"Se ativado, define PrusaSlicer como aplicativo padrão para abrir arquivos .3mf."
+
+#: src/slic3r/GUI/Preferences.cpp:121
+msgid "If enabled, sets PrusaSlicer as default application to open .stl files."
+msgstr ""
+"Se ativado, define PrusaSlicer como aplicativo padrão para abrir arquivos .stl."
+
+#: src/slic3r/GUI/Preferences.cpp:131
msgid ""
"If enabled, Slic3r downloads updates of built-in system presets in the "
"background. These updates are downloaded into a separate temporary location. "
@@ -4850,23 +6177,23 @@ msgstr ""
"temporário separado. Quando uma nova versão predefinida se torna disponível, "
"ela é oferecida na inicialização do aplicativo."
-#: src/slic3r/GUI/Preferences.cpp:87
+#: src/slic3r/GUI/Preferences.cpp:136
msgid "Suppress \" - default - \" presets"
msgstr "Suprimir predefinições \"-padrão-\""
-#: src/slic3r/GUI/Preferences.cpp:89
+#: src/slic3r/GUI/Preferences.cpp:138
msgid ""
"Suppress \" - default - \" presets in the Print / Filament / Printer "
"selections once there are any other valid presets available."
msgstr ""
-"Suprimir predefinições \"-padrão-\" em impressão/filamento/impressora, uma "
-"vez que existam outras predefinições válidas disponíveis."
+"Suprimir predefinições \"-padrão-\" em impressão/filamento/impressora, uma vez "
+"que existam outras predefinições válidas disponíveis."
-#: src/slic3r/GUI/Preferences.cpp:95
+#: src/slic3r/GUI/Preferences.cpp:144
msgid "Show incompatible print and filament presets"
msgstr "Mostrar predefinições de impressão e filamento incompatíveis"
-#: src/slic3r/GUI/Preferences.cpp:97
+#: src/slic3r/GUI/Preferences.cpp:146
msgid ""
"When checked, the print and filament presets are shown in the preset editor "
"even if they are marked as incompatible with the active printer"
@@ -4875,11 +6202,77 @@ msgstr ""
"editor de predefinições, mesmo que estejam marcadas como incompatíveis com a "
"impressora ativa"
-#: src/slic3r/GUI/Preferences.cpp:104
+#: src/slic3r/GUI/Preferences.cpp:152
+msgid "Show drop project dialog"
+msgstr "Mostrar / soltar caixa de diálogo do projeto"
+
+#: src/slic3r/GUI/Preferences.cpp:154
+msgid ""
+"When checked, whenever dragging and dropping a project file on the "
+"application, shows a dialog asking to select the action to take on the file to "
+"load."
+msgstr ""
+"Quando marcada, sempre que arrastar e soltar um arquivo de projeto no "
+"aplicativo, é exibida uma caixa de diálogo solicitando a seleção da ação a ser "
+"executada no arquivo a ser carregado."
+
+#: src/slic3r/GUI/Preferences.cpp:161 src/slic3r/GUI/Preferences.cpp:165
+msgid "Allow just a single PrusaSlicer instance"
+msgstr "Permitir apenas uma única instancia do PrusaSlicer"
+
+#: src/slic3r/GUI/Preferences.cpp:163
+msgid ""
+"On OSX there is always only one instance of app running by default. However it "
+"is allowed to run multiple instances of same app from the command line. In "
+"such case this settings will allow only one instance."
+msgstr ""
+"No OSX, sempre há apenas uma instância do aplicativo em execução por padrão. "
+"No entanto, é permitido executar várias instâncias do mesmo aplicativo a "
+"partir da linha de comando. Nesse caso, essas configurações permitirão apenas "
+"uma instância."
+
+#: src/slic3r/GUI/Preferences.cpp:167
+msgid ""
+"If this is enabled, when starting PrusaSlicer and another instance of the same "
+"PrusaSlicer is already running, that instance will be reactivated instead."
+msgstr ""
+"Se estiver habilitado, ao iniciar o PrusaSlicer e outra instância do mesmo "
+"PrusaSlicer estiver em execução, essa instância será reativada."
+
+#: src/slic3r/GUI/Preferences.cpp:173 src/slic3r/GUI/UnsavedChangesDialog.cpp:671
+msgid "Ask for unsaved changes when closing application"
+msgstr "Pergunte sobre mudanças não salvas quando fechar aplicação"
+
+#: src/slic3r/GUI/Preferences.cpp:175
+msgid "When closing the application, always ask for unsaved changes"
+msgstr "Ao fechar o aplicativo, sempre peça alterações não salvas"
+
+#: src/slic3r/GUI/Preferences.cpp:180 src/slic3r/GUI/UnsavedChangesDialog.cpp:672
+msgid "Ask for unsaved changes when selecting new preset"
+msgstr "Pergunte sobre mudanças não salvas quando selecionar nova predefinição"
+
+#: src/slic3r/GUI/Preferences.cpp:182
+msgid "Always ask for unsaved changes when selecting new preset"
+msgstr ""
+"Sempre pergunte sobre mudanças não salvas quando selecionar nova predefinição"
+
+#: src/slic3r/GUI/Preferences.cpp:190
+msgid "Associate .gcode files to PrusaSlicer G-code Viewer"
+msgstr "Associar arquivos .gcode para o Visualizador de G-code PrusaSlicer"
+
+#: src/slic3r/GUI/Preferences.cpp:192
+msgid ""
+"If enabled, sets PrusaSlicer G-code Viewer as default application to open ."
+"gcode files."
+msgstr ""
+"Se ativado, define o Visualizador de G-code PrusaSLicer como aplicação padrão "
+"para abrir arquivos .gcode."
+
+#: src/slic3r/GUI/Preferences.cpp:201
msgid "Use Retina resolution for the 3D scene"
msgstr "Usar a resolução retina para a cena 3D"
-#: src/slic3r/GUI/Preferences.cpp:106
+#: src/slic3r/GUI/Preferences.cpp:203
msgid ""
"If enabled, the 3D scene will be rendered in Retina resolution. If you are "
"experiencing 3D performance problems, disabling this option may help."
@@ -4887,337 +6280,471 @@ msgstr ""
"Se ativada, a cena 3D será renderizada na resolução retina. Se você estiver "
"enfrentando problemas de desempenho 3D, desabilitar essa opção pode ajudar."
-#: src/slic3r/GUI/Preferences.cpp:113
+#: src/slic3r/GUI/Preferences.cpp:211 src/slic3r/GUI/Preferences.cpp:213
+msgid "Show splash screen"
+msgstr "Mostrar tela inicial"
+
+#: src/slic3r/GUI/Preferences.cpp:220
+msgid "Enable support for legacy 3DConnexion devices"
+msgstr "Ativar suporte para dispositivos 3DConnexion legados"
+
+#: src/slic3r/GUI/Preferences.cpp:222
+msgid ""
+"If enabled, the legacy 3DConnexion devices settings dialog is available by "
+"pressing CTRL+M"
+msgstr ""
+"Se ativado, a caixa de diálogo de configurações dos dispositivos 3DConnexion "
+"legados está disponível pressionando CTRL + M"
+
+#: src/slic3r/GUI/Preferences.cpp:232
msgid "Camera"
msgstr "Câmera"
-#: src/slic3r/GUI/Preferences.cpp:119
+#: src/slic3r/GUI/Preferences.cpp:237
msgid "Use perspective camera"
msgstr "Usar a câmera em perspectiva"
-#: src/slic3r/GUI/Preferences.cpp:121
+#: src/slic3r/GUI/Preferences.cpp:239
msgid ""
"If enabled, use perspective camera. If not enabled, use orthographic camera."
msgstr ""
-"Se ativada, use a câmera em perspectiva. Se não estiver ativada, use a "
-"câmera ortográfica."
+"Se ativada, use a câmera em perspectiva. Se não estiver ativada, use a câmera "
+"ortográfica."
-#: src/slic3r/GUI/Preferences.cpp:126
+#: src/slic3r/GUI/Preferences.cpp:244
msgid "Use free camera"
msgstr "Use câmera livre"
-#: src/slic3r/GUI/Preferences.cpp:128
+#: src/slic3r/GUI/Preferences.cpp:246
msgid "If enabled, use free camera. If not enabled, use constrained camera."
msgstr ""
-"Se ativado, use câmera livre. Se não estiver habilitado, use a câmera "
-"restrita."
+"Se ativado, use câmera livre. Se não estiver habilitado, use a câmera restrita."
-#: src/slic3r/GUI/Preferences.cpp:133
+#: src/slic3r/GUI/Preferences.cpp:251
+msgid "Reverse direction of zoom with mouse wheel"
+msgstr "Reverter direção do zoom com a roda do mouse"
+
+#: src/slic3r/GUI/Preferences.cpp:253
+msgid "If enabled, reverses the direction of zoom with mouse wheel"
+msgstr "Se ativado, reverte a direção do zoom com a roda do mouse"
+
+#: src/slic3r/GUI/Preferences.cpp:261
msgid "GUI"
msgstr "GUI"
-#: src/slic3r/GUI/Preferences.cpp:143
+#: src/slic3r/GUI/Preferences.cpp:276
+msgid "Sequential slider applied only to top layer"
+msgstr "Rolagem sequencial aplicado apenas na camada de topo"
+
+#: src/slic3r/GUI/Preferences.cpp:278
+msgid ""
+"If enabled, changes made using the sequential slider, in preview, apply only "
+"to gcode top layer. If disabled, changes made using the sequential slider, in "
+"preview, apply to the whole gcode."
+msgstr ""
+"Se ativo, mudanças feitas usando a rolagem sequencial, na pré-visualização, "
+"aplica somente para o topo do G-code. Se desativado, mudanças feitas usando a "
+"rolagem sequencial, na pré-visualização, aplica para todo o G-code."
+
+#: src/slic3r/GUI/Preferences.cpp:285
+msgid "Show sidebar collapse/expand button"
+msgstr "Mostrar botão de recolher/expandir barra lateral"
+
+#: src/slic3r/GUI/Preferences.cpp:287
+msgid ""
+"If enabled, the button for the collapse sidebar will be appeared in top right "
+"corner of the 3D Scene"
+msgstr ""
+"Se ativado, o botão para recolher a barra lateral aparecerá no canto superior "
+"direito da cena 3D"
+
+#: src/slic3r/GUI/Preferences.cpp:292
+msgid "Suppress to open hyperlink in browser"
+msgstr "Suprimir para abrir o hiperlink no navegador"
+
+#: src/slic3r/GUI/Preferences.cpp:294
+msgid ""
+"If enabled, the descriptions of configuration parameters in settings tabs "
+"wouldn't work as hyperlinks. If disabled, the descriptions of configuration "
+"parameters in settings tabs will work as hyperlinks."
+msgstr ""
+"Se ativada, as descrições dos parâmetros de configuração nas guias de "
+"configurações não funcionam como hiperlinks. Se desativado, as descrições dos "
+"parâmetros de configuração nas guias de configurações funcionarão como "
+"hiperlinks."
+
+#: src/slic3r/GUI/Preferences.cpp:300
msgid "Use custom size for toolbar icons"
msgstr "Usar tamanho personalizado para ícones da barra de ferramentas"
-#: src/slic3r/GUI/Preferences.cpp:145
+#: src/slic3r/GUI/Preferences.cpp:302
msgid "If enabled, you can change size of toolbar icons manually."
msgstr ""
"Se ativado, você pode alterar o tamanho dos ícones da barra de ferramentas "
"manualmente."
-#: src/slic3r/GUI/Preferences.cpp:172
+#: src/slic3r/GUI/Preferences.cpp:320
+msgid "Render"
+msgstr "Reenderizar"
+
+#: src/slic3r/GUI/Preferences.cpp:325
+msgid "Use environment map"
+msgstr "Usar mapa do ambiente"
+
+#: src/slic3r/GUI/Preferences.cpp:327
+msgid "If enabled, renders object using the environment map."
+msgstr "Se ativo, reenderiza objetos usando o mapa de ambiente."
+
+#: src/slic3r/GUI/Preferences.cpp:352
#, c-format
msgid "You need to restart %s to make the changes effective."
msgstr "Você precisa reiniciar %s para tornar as alterações efetivas."
-#: src/slic3r/GUI/Preferences.cpp:222
+#: src/slic3r/GUI/Preferences.cpp:427
msgid "Icon size in a respect to the default size"
msgstr "Tamanho do ícone em relação ao tamanho padrão"
-#: src/slic3r/GUI/Preferences.cpp:237
+#: src/slic3r/GUI/Preferences.cpp:442
msgid "Select toolbar icon size in respect to the default one."
msgstr ""
"Selecione o tamanho do ícone da barra de ferramentas em relação ao padrão."
-#: src/slic3r/GUI/Preset.cpp:247
-msgid "modified"
-msgstr "modificado"
+#: src/slic3r/GUI/Preferences.cpp:473
+msgid "Old regular layout with the tab bar"
+msgstr "Layout padrão antigo com a barra de abas"
+
+#: src/slic3r/GUI/Preferences.cpp:474
+msgid "New layout, access via settings button in the top menu"
+msgstr "Novo layout, acesso pelo botão de configuração no menu superior"
+
+#: src/slic3r/GUI/Preferences.cpp:475
+msgid "Settings in non-modal window"
+msgstr "Configurações em janela não modal"
-#: src/slic3r/GUI/Preset.cpp:1121 src/slic3r/GUI/Preset.cpp:1176
-#: src/slic3r/GUI/Preset.cpp:1254 src/slic3r/GUI/Preset.cpp:1296
-#: src/slic3r/GUI/PresetBundle.cpp:1583 src/slic3r/GUI/PresetBundle.cpp:1679
+#: src/slic3r/GUI/Preferences.cpp:484
+msgid "Layout Options"
+msgstr "Opções de Layout"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:197
+#: src/slic3r/GUI/PresetComboBoxes.cpp:235
+#: src/slic3r/GUI/PresetComboBoxes.cpp:761
+#: src/slic3r/GUI/PresetComboBoxes.cpp:811
+#: src/slic3r/GUI/PresetComboBoxes.cpp:925
+#: src/slic3r/GUI/PresetComboBoxes.cpp:969
msgid "System presets"
msgstr "Predefinições do sistema"
-#: src/slic3r/GUI/Preset.cpp:1180 src/slic3r/GUI/Preset.cpp:1300
-#: src/slic3r/GUI/PresetBundle.cpp:1684
+#: src/slic3r/GUI/PresetComboBoxes.cpp:239
+#: src/slic3r/GUI/PresetComboBoxes.cpp:815
+#: src/slic3r/GUI/PresetComboBoxes.cpp:973
msgid "User presets"
msgstr "Predefinições do usuário"
-#: src/slic3r/GUI/Preset.cpp:1213
-msgid "Add/Remove materials"
-msgstr "Adicionar/Remover materiais"
+#: src/slic3r/GUI/PresetComboBoxes.cpp:250
+msgid "Incompatible presets"
+msgstr "Pacotes incompatíveis"
-#: src/slic3r/GUI/Preset.cpp:1215
-msgid "Add/Remove printers"
-msgstr "Adicionar/Remover impressoras"
+#: src/slic3r/GUI/PresetComboBoxes.cpp:285
+msgid "Are you sure you want to delete \"%1%\" printer?"
+msgstr "Tem certeza que quer deletar a impressora \"%1%\"?"
-#: src/slic3r/GUI/Preset.cpp:1534
-msgid "filament"
-msgstr "filamento"
+#: src/slic3r/GUI/PresetComboBoxes.cpp:287
+msgid "Delete Physical Printer"
+msgstr "Excluir Impressora Física"
-#: src/slic3r/GUI/Preset.cpp:1535
-msgid "SLA print"
-msgstr "Impressão de SLA"
+#: src/slic3r/GUI/PresetComboBoxes.cpp:624
+msgid "Click to edit preset"
+msgstr "Clique para editar a predefinição"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:680
+#: src/slic3r/GUI/PresetComboBoxes.cpp:710
+msgid "Add/Remove presets"
+msgstr "Adicionar/Remover predefinições"
-#: src/slic3r/GUI/PresetBundle.cpp:1711
+#: src/slic3r/GUI/PresetComboBoxes.cpp:685
+#: src/slic3r/GUI/PresetComboBoxes.cpp:715 src/slic3r/GUI/Tab.cpp:2990
+msgid "Add physical printer"
+msgstr "Adicionar impressora física"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:699
+msgid "Edit preset"
+msgstr "Editar a predefinição"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:703 src/slic3r/GUI/Tab.cpp:2990
+msgid "Edit physical printer"
+msgstr "Editar impressora física"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:706
+msgid "Delete physical printer"
+msgstr "Excluir impressora física"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:826
+#: src/slic3r/GUI/PresetComboBoxes.cpp:987
+msgid "Physical printers"
+msgstr "Impressoras físicas"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:850
msgid "Add/Remove filaments"
msgstr "Adicionar/Remover filamentos"
-#: src/slic3r/GUI/PresetHints.cpp:29
+#: src/slic3r/GUI/PresetComboBoxes.cpp:852
+msgid "Add/Remove materials"
+msgstr "Adicionar/Remover materiais"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:854
+#: src/slic3r/GUI/PresetComboBoxes.cpp:1011
+msgid "Add/Remove printers"
+msgstr "Adicionar/Remover impressoras"
+
+#: src/slic3r/GUI/PresetHints.cpp:32
msgid ""
-"If estimated layer time is below ~%1%s, fan will run at %2%%% and print "
-"speed will be reduced so that no less than %3%s are spent on that layer "
-"(however, speed will never be reduced below %4%mm/s)."
+"If estimated layer time is below ~%1%s, fan will run at %2%%% and print speed "
+"will be reduced so that no less than %3%s are spent on that layer (however, "
+"speed will never be reduced below %4%mm/s)."
msgstr ""
"Se o tempo estimado da camada estiver abaixo de ~%1%s, o ventoinha será "
"executado em %2%%% e a velocidade de impressão será reduzida para que não "
"menos de %3%s sejam gastos nessa camada (no entanto, a velocidade nunca será "
"reduzida abaixo de %4% mm/s)."
-#: src/slic3r/GUI/PresetHints.cpp:36
+#: src/slic3r/GUI/PresetHints.cpp:39
msgid ""
"If estimated layer time is greater, but still below ~%1%s, fan will run at a "
"proportionally decreasing speed between %2%%% and %3%%%."
msgstr ""
"Se o tempo estimado da camada for maior, mas ainda abaixo de ~%1%s, o "
-"ventoinha será executado em uma velocidade proporcionalmente decrescente "
-"entre %2%%% e %3%%%."
-
-#: src/slic3r/GUI/PresetHints.cpp:40
-msgid "During the other layers, fan"
-msgstr "Durante as outras camadas, a ventoinha"
+"ventoinha será executado em uma velocidade proporcionalmente decrescente entre "
+"%2%%% e %3%%%."
-#: src/slic3r/GUI/PresetHints.cpp:42
-msgid "Fan"
-msgstr "Ventoinha"
+#: src/slic3r/GUI/PresetHints.cpp:49
+msgid "Fan speed will be ramped from zero at layer %1% to %2%%% at layer %3%."
+msgstr ""
+"Velocidade da ventilação será linearmente alterada de zero na camada %1% para "
+"%2%%% na camada %3%."
-#: src/slic3r/GUI/PresetHints.cpp:48
-msgid "will always run at %1%%%"
-msgstr "será sempre executado em %1%%%"
+#: src/slic3r/GUI/PresetHints.cpp:51
+msgid "During the other layers, fan will always run at %1%%%"
+msgstr "Durante as outras camadas, a ventoinha sempre vai funcionar a %1%%%"
#: src/slic3r/GUI/PresetHints.cpp:51
-msgid "except for the first %1% layers."
-msgstr "exceto para as primeiras camadas %1%."
+msgid "Fan will always run at %1%%%"
+msgstr "Ventilação será sempre executado em %1%%%"
#: src/slic3r/GUI/PresetHints.cpp:53
+msgid "except for the first %1% layers."
+msgstr "exceto para as primeiras %1% camadas ."
+
+#: src/slic3r/GUI/PresetHints.cpp:55
msgid "except for the first layer."
msgstr "exceto para a primeira camada."
-#: src/slic3r/GUI/PresetHints.cpp:55
-msgid "will be turned off."
-msgstr "será desligado."
+#: src/slic3r/GUI/PresetHints.cpp:58
+msgid "During the other layers, fan will be turned off."
+msgstr "Durante as outras camadas, a ventoinha será desligada."
-#: src/slic3r/GUI/PresetHints.cpp:156
+#: src/slic3r/GUI/PresetHints.cpp:58
+msgid "Fan will be turned off."
+msgstr "Ventoinha será desligada."
+
+#: src/slic3r/GUI/PresetHints.cpp:159
msgid "external perimeters"
msgstr "perímetros externos"
-#: src/slic3r/GUI/PresetHints.cpp:165
+#: src/slic3r/GUI/PresetHints.cpp:168
msgid "perimeters"
msgstr "perímetros"
-#: src/slic3r/GUI/PresetHints.cpp:174
+#: src/slic3r/GUI/PresetHints.cpp:177
msgid "infill"
msgstr "preenchimento"
-#: src/slic3r/GUI/PresetHints.cpp:184
+#: src/slic3r/GUI/PresetHints.cpp:187
msgid "solid infill"
msgstr "preenchimento sólido"
-#: src/slic3r/GUI/PresetHints.cpp:192
+#: src/slic3r/GUI/PresetHints.cpp:195
msgid "top solid infill"
msgstr "preenchimento sólido do topo"
-#: src/slic3r/GUI/PresetHints.cpp:203
+#: src/slic3r/GUI/PresetHints.cpp:206
msgid "support"
msgstr "suporte"
-#: src/slic3r/GUI/PresetHints.cpp:213
+#: src/slic3r/GUI/PresetHints.cpp:216
msgid "support interface"
msgstr "interface de suporte"
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:222
msgid "First layer volumetric"
msgstr "Primeira camada volumétrica"
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:222
msgid "Bridging volumetric"
-msgstr "Ponteamento volumétrico"
+msgstr "Ponte volumétrico"
-#: src/slic3r/GUI/PresetHints.cpp:219
+#: src/slic3r/GUI/PresetHints.cpp:222
msgid "Volumetric"
msgstr "Volumétrica"
-#: src/slic3r/GUI/PresetHints.cpp:220
+#: src/slic3r/GUI/PresetHints.cpp:223
msgid "flow rate is maximized"
msgstr "a taxa de fluxo é maximizada"
-#: src/slic3r/GUI/PresetHints.cpp:223
+#: src/slic3r/GUI/PresetHints.cpp:226
msgid "by the print profile maximum"
msgstr "pelo perfil de impressão máximo"
-#: src/slic3r/GUI/PresetHints.cpp:224
+#: src/slic3r/GUI/PresetHints.cpp:227
msgid "when printing"
msgstr "ao imprimir"
-#: src/slic3r/GUI/PresetHints.cpp:225
+#: src/slic3r/GUI/PresetHints.cpp:228
msgid "with a volumetric rate"
msgstr "com uma taxa volumétrica"
-#: src/slic3r/GUI/PresetHints.cpp:229
+#: src/slic3r/GUI/PresetHints.cpp:232
#, c-format
msgid "%3.2f mm³/s at filament speed %3.2f mm/s."
msgstr "%3.2f mm ³/s na velocidade do filamento %3.2f mm/s."
-#: src/slic3r/GUI/PresetHints.cpp:247
+#: src/slic3r/GUI/PresetHints.cpp:250
msgid ""
"Recommended object thin wall thickness: Not available due to invalid layer "
"height."
msgstr ""
-"Espessura de parede fina do objeto recomendado: não disponível devido à "
-"altura da camada inválida."
+"Espessura de parede fina do objeto recomendado: não disponível devido à altura "
+"da camada inválida."
-#: src/slic3r/GUI/PresetHints.cpp:263
+#: src/slic3r/GUI/PresetHints.cpp:266
#, c-format
msgid "Recommended object thin wall thickness for layer height %.2f and"
msgstr ""
"Espessura de parede fina do objeto recomendado para a altura da camada %.2f e"
-#: src/slic3r/GUI/PresetHints.cpp:270
+#: src/slic3r/GUI/PresetHints.cpp:273
#, c-format
msgid "%d lines: %.2f mm"
msgstr "%d linhas: %.2f mm"
-#: src/slic3r/GUI/PresetHints.cpp:274
+#: src/slic3r/GUI/PresetHints.cpp:277
msgid ""
-"Recommended object thin wall thickness: Not available due to excessively "
-"small extrusion width."
+"Recommended object thin wall thickness: Not available due to excessively small "
+"extrusion width."
msgstr ""
"Espessura fina da parede do objeto recomendada: Não disponível devido à "
"largura de extrusão excessivamente pequena."
-#: src/slic3r/GUI/PresetHints.cpp:304
+#: src/slic3r/GUI/PresetHints.cpp:306
msgid ""
"Top / bottom shell thickness hint: Not available due to invalid layer height."
msgstr ""
-"Espessura superior/inferior da concha. Dica: Não disponível devido à altura "
-"da camada inválida."
+"Espessura superior/inferior da concha. Dica: Não disponível devido à altura da "
+"camada inválida."
-#: src/slic3r/GUI/PresetHints.cpp:317
+#: src/slic3r/GUI/PresetHints.cpp:319
msgid "Top shell is %1% mm thick for layer height %2% mm."
msgstr "A camada superior tem %1% de espessura para altura da camada %2% mm."
-#: src/slic3r/GUI/PresetHints.cpp:320
+#: src/slic3r/GUI/PresetHints.cpp:322
msgid "Minimum top shell thickness is %1% mm."
msgstr "A espessura mínima da camada superior é de %1% mm."
-#: src/slic3r/GUI/PresetHints.cpp:323
+#: src/slic3r/GUI/PresetHints.cpp:325
msgid "Top is open."
-msgstr "Topo está aberto"
+msgstr "Topo está aberto."
-#: src/slic3r/GUI/PresetHints.cpp:336
+#: src/slic3r/GUI/PresetHints.cpp:338
msgid "Bottom shell is %1% mm thick for layer height %2% mm."
msgstr "A camada inferior tem %1% de espessura para a altura da camada %2% mm."
-#: src/slic3r/GUI/PresetHints.cpp:339
+#: src/slic3r/GUI/PresetHints.cpp:341
msgid "Minimum bottom shell thickness is %1% mm."
msgstr "A espessura mínima da camada inferior é de %1% mm."
-#: src/slic3r/GUI/PresetHints.cpp:342
+#: src/slic3r/GUI/PresetHints.cpp:344
msgid "Bottom is open."
-msgstr "Base está aberta"
+msgstr "Base está aberta."
-#: src/slic3r/GUI/PrintHostDialogs.cpp:33
+#: src/slic3r/GUI/PrintHostDialogs.cpp:35
msgid "Send G-Code to printer host"
msgstr "Enviar G-code para o host da impressora"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:33
+#: src/slic3r/GUI/PrintHostDialogs.cpp:35
msgid "Upload to Printer Host with the following filename:"
msgstr "Carregue para o host da impressora com o seguinte nome de arquivo:"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:35
+#: src/slic3r/GUI/PrintHostDialogs.cpp:37
msgid "Start printing after upload"
msgstr "Iniciar a impressão após o envio"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:42
+#: src/slic3r/GUI/PrintHostDialogs.cpp:45
msgid "Use forward slashes ( / ) as a directory separator if needed."
msgstr "Use barras (/) como um separador de diretório, se necessário."
-#: src/slic3r/GUI/PrintHostDialogs.cpp:149
+#: src/slic3r/GUI/PrintHostDialogs.cpp:58
+msgid "Group"
+msgstr "Grupo"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:176
msgid "ID"
msgstr "ID"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:150
+#: src/slic3r/GUI/PrintHostDialogs.cpp:177
msgid "Progress"
msgstr "Progresso"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:151
+#: src/slic3r/GUI/PrintHostDialogs.cpp:178
msgid "Status"
msgstr "Status"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:152
+#: src/slic3r/GUI/PrintHostDialogs.cpp:179
msgid "Host"
msgstr "Servidor"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:153
+#: src/slic3r/GUI/PrintHostDialogs.cpp:180
msgid "Filename"
msgstr "Nome do arquivo"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:154
+#: src/slic3r/GUI/PrintHostDialogs.cpp:181
msgid "Error Message"
msgstr "Mensagem de Erro"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:157
+#: src/slic3r/GUI/PrintHostDialogs.cpp:184
msgid "Cancel selected"
msgstr "Cancelar selecionado"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:159
+#: src/slic3r/GUI/PrintHostDialogs.cpp:186
msgid "Show error message"
msgstr "Exibir mensagem de erro"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:198
-#: src/slic3r/GUI/PrintHostDialogs.cpp:229
+#: src/slic3r/GUI/PrintHostDialogs.cpp:228
+#: src/slic3r/GUI/PrintHostDialogs.cpp:261
msgid "Enqueued"
msgstr "Enfileirado"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:230
+#: src/slic3r/GUI/PrintHostDialogs.cpp:262
msgid "Uploading"
msgstr "Enviando"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:234
+#: src/slic3r/GUI/PrintHostDialogs.cpp:266
msgid "Completed"
msgstr "Concluído"
-#: src/slic3r/GUI/PrintHostDialogs.cpp:272
+#: src/slic3r/GUI/PrintHostDialogs.cpp:304
msgid "Error uploading to print host:"
msgstr "Erro ao carregar para o host de impressão:"
#: src/slic3r/GUI/RammingChart.cpp:23
msgid "NO RAMMING AT ALL"
-msgstr "Não usar Ramming"
-
-#: src/slic3r/GUI/RammingChart.cpp:76
-msgid "Time"
-msgstr "Tempo"
+msgstr "NÃO USAR RAMMING"
#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83
-#: src/libslic3r/PrintConfig.cpp:644 src/libslic3r/PrintConfig.cpp:688
-#: src/libslic3r/PrintConfig.cpp:703 src/libslic3r/PrintConfig.cpp:2408
-#: src/libslic3r/PrintConfig.cpp:2417 src/libslic3r/PrintConfig.cpp:2527
-#: src/libslic3r/PrintConfig.cpp:2535 src/libslic3r/PrintConfig.cpp:2543
-#: src/libslic3r/PrintConfig.cpp:2550 src/libslic3r/PrintConfig.cpp:2558
-#: src/libslic3r/PrintConfig.cpp:2566
+#: src/libslic3r/PrintConfig.cpp:706 src/libslic3r/PrintConfig.cpp:750
+#: src/libslic3r/PrintConfig.cpp:765 src/libslic3r/PrintConfig.cpp:2636
+#: src/libslic3r/PrintConfig.cpp:2645 src/libslic3r/PrintConfig.cpp:2755
+#: src/libslic3r/PrintConfig.cpp:2763 src/libslic3r/PrintConfig.cpp:2771
+#: src/libslic3r/PrintConfig.cpp:2778 src/libslic3r/PrintConfig.cpp:2786
+#: src/libslic3r/PrintConfig.cpp:2794
msgid "s"
msgstr "s"
@@ -5225,91 +6752,182 @@ msgstr "s"
msgid "Volumetric speed"
msgstr "Velocidade volumétrica"
-#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:601
-#: src/libslic3r/PrintConfig.cpp:1250
+#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:663
+#: src/libslic3r/PrintConfig.cpp:1458
msgid "mm³/s"
msgstr "mm ³/s"
-#: src/slic3r/GUI/Selection.cpp:147
+#: src/slic3r/GUI/SavePresetDialog.cpp:57
+#, c-format
+msgid "Save %s as:"
+msgstr "Salvar %s como:"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:110
+msgid "the following suffix is not allowed:"
+msgstr "o sufixo seguinte não é permitido:"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:116
+msgid "The supplied name is not available."
+msgstr "O nome fornecido não está disponível."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:122
+msgid "Cannot overwrite a system profile."
+msgstr "Não é possível substituir um perfil de sistema."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:127
+msgid "Cannot overwrite an external profile."
+msgstr "Não é possível substituir um perfil externo."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:134
+msgid "Preset with name \"%1%\" already exists."
+msgstr "Predefinido com nome \"%1%\" já existe."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:136
+msgid ""
+"Preset with name \"%1%\" already exists and is incompatible with selected "
+"printer."
+msgstr ""
+"A predefinição com o nome \"%1%\" já existe e é incompatível com a impressora "
+"selecionada."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:137
+msgid "Note: This preset will be replaced after saving"
+msgstr "Nota: Essa predefinição será substituída após salvar"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:142
+msgid "The name cannot be empty."
+msgstr "O nome não pode estar vazio."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:147
+msgid "The name cannot start with space character."
+msgstr "O nome não pode começar com um caractere de espaço."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:152
+msgid "The name cannot end with space character."
+msgstr "O nome não pode terminar com um caractere de espaço."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:186
+#: src/slic3r/GUI/SavePresetDialog.cpp:192
+msgid "Save preset"
+msgstr "Salvar predefinição"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:215
+msgctxt "PresetName"
+msgid "Copy"
+msgstr "Copiar"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:273
+msgid ""
+"You have selected physical printer \"%1%\" \n"
+"with related printer preset \"%2%\""
+msgstr ""
+"Você selecionou a impressora física \"%1%\"\n"
+"com a predefinição de impressora relacionada \"%2%\""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:306
+msgid "What would you like to do with \"%1%\" preset after saving?"
+msgstr "O que você gostaria de fazer com a predefinição \"%1%\" após salvar?"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:309
+msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\""
+msgstr "Altere \"%1%\" para \"%2%\" para esta impressora física \"%3%\""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:310
+msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\""
+msgstr ""
+"Adicione \"%1%\" como uma próxima predefinição para a impressora física \"%2%\""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:311
+msgid "Just switch to \"%1%\" preset"
+msgstr "Basta mudar para a predefinição \"%1%\""
+
+#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2421
+msgid "Stealth"
+msgstr "Silencioso"
+
+#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2415
+msgid "Normal"
+msgstr "Normal"
+
+#: src/slic3r/GUI/Selection.cpp:172
msgid "Selection-Add"
msgstr "Seleção-Adicionar"
-#: src/slic3r/GUI/Selection.cpp:188
+#: src/slic3r/GUI/Selection.cpp:213
msgid "Selection-Remove"
msgstr "Seleção-remover"
-#: src/slic3r/GUI/Selection.cpp:220
+#: src/slic3r/GUI/Selection.cpp:245
msgid "Selection-Add Object"
msgstr "Seleção-Adicionar objeto"
-#: src/slic3r/GUI/Selection.cpp:239
+#: src/slic3r/GUI/Selection.cpp:264
msgid "Selection-Remove Object"
msgstr "Seleção-remover objeto"
-#: src/slic3r/GUI/Selection.cpp:257
+#: src/slic3r/GUI/Selection.cpp:282
msgid "Selection-Add Instance"
msgstr "Instância de seleção-Adicionar"
-#: src/slic3r/GUI/Selection.cpp:276
+#: src/slic3r/GUI/Selection.cpp:301
msgid "Selection-Remove Instance"
msgstr "Seleção-remover instância"
-#: src/slic3r/GUI/Selection.cpp:377
+#: src/slic3r/GUI/Selection.cpp:402
msgid "Selection-Add All"
msgstr "Seleção-adicionar todos"
-#: src/slic3r/GUI/Selection.cpp:403
+#: src/slic3r/GUI/Selection.cpp:428
msgid "Selection-Remove All"
msgstr "Seleção-remover todos"
-#: src/slic3r/GUI/Selection.cpp:940
+#: src/slic3r/GUI/Selection.cpp:960
msgid "Scale To Fit"
msgstr "Dimensionar para caber"
-#: src/slic3r/GUI/Selection.cpp:1477
+#: src/slic3r/GUI/Selection.cpp:1487
msgid "Set Printable Instance"
msgstr "Definir instância imprimível"
-#: src/slic3r/GUI/Selection.cpp:1477
+#: src/slic3r/GUI/Selection.cpp:1487
msgid "Set Unprintable Instance"
msgstr "Definir instância não imprimível"
-#: src/slic3r/GUI/SysInfoDialog.cpp:78
+#: src/slic3r/GUI/SysInfoDialog.cpp:82
msgid "System Information"
msgstr "Informações do sistema"
-#: src/slic3r/GUI/SysInfoDialog.cpp:154
+#: src/slic3r/GUI/SysInfoDialog.cpp:158
msgid "Copy to Clipboard"
msgstr "Copiar para a Ãrea de Transferência"
-#: src/slic3r/GUI/Tab.cpp:50 src/libslic3r/PrintConfig.cpp:265
+#: src/slic3r/GUI/Tab.cpp:109 src/libslic3r/PrintConfig.cpp:321
msgid "Compatible printers"
msgstr "Impressoras compatíveis"
-#: src/slic3r/GUI/Tab.cpp:51
+#: src/slic3r/GUI/Tab.cpp:110
msgid "Select the printers this profile is compatible with."
msgstr "Selecione as impressoras com as quais este perfil é compatível."
-#: src/slic3r/GUI/Tab.cpp:56 src/libslic3r/PrintConfig.cpp:280
+#: src/slic3r/GUI/Tab.cpp:115 src/libslic3r/PrintConfig.cpp:336
msgid "Compatible print profiles"
msgstr "Perfis de impressão compatíveis"
-#: src/slic3r/GUI/Tab.cpp:57
+#: src/slic3r/GUI/Tab.cpp:116
msgid "Select the print profiles this profile is compatible with."
-msgstr ""
-"Selecione os perfis de impressão com os quais este perfil é compatível."
+msgstr "Selecione os perfis de impressão com os quais este perfil é compatível."
#. TRN "Save current Settings"
-#: src/slic3r/GUI/Tab.cpp:133
+#: src/slic3r/GUI/Tab.cpp:211
#, c-format
msgid "Save current %s"
msgstr "Salvar %s atual"
-#: src/slic3r/GUI/Tab.cpp:134
+#: src/slic3r/GUI/Tab.cpp:212
msgid "Delete this preset"
msgstr "Exclua esta predefinição"
-#: src/slic3r/GUI/Tab.cpp:139
+#: src/slic3r/GUI/Tab.cpp:216
msgid ""
"Hover the cursor over buttons to find more information \n"
"or click this button."
@@ -5317,465 +6935,445 @@ msgstr ""
"Passe o cursor sobre os botões para encontrar mais informações \n"
"ou clique neste botão."
-#: src/slic3r/GUI/Tab.cpp:241
-msgid "Add a new printer"
-msgstr "Adicionar uma nova impressora"
+#: src/slic3r/GUI/Tab.cpp:220
+msgid "Search in settings [%1%]"
+msgstr "Procurar em configurações [%1%]"
+
+#: src/slic3r/GUI/Tab.cpp:1237
+msgid "Detach from system preset"
+msgstr "Esta é uma predefinição do sistema"
+
+#: src/slic3r/GUI/Tab.cpp:1250
+msgid ""
+"A copy of the current system preset will be created, which will be detached "
+"from the system preset."
+msgstr ""
+"Uma cópia da predefinição do sistema atual será criada, que será desanexada da "
+"predefinição do sistema."
+
+#: src/slic3r/GUI/Tab.cpp:1251
+msgid "The current custom preset will be detached from the parent system preset."
+msgstr ""
+"A predefinição personalizada atual será separada da predefinição do sistema "
+"padrão."
-#: src/slic3r/GUI/Tab.cpp:953
+#: src/slic3r/GUI/Tab.cpp:1254
+msgid "Modifications to the current profile will be saved."
+msgstr "Modificações no perfil atual serão salvas."
+
+#: src/slic3r/GUI/Tab.cpp:1257
+msgid ""
+"This action is not revertable.\n"
+"Do you want to proceed?"
+msgstr ""
+"Esta operação é irreversível.\n"
+"Você quer prosseguir?"
+
+#: src/slic3r/GUI/Tab.cpp:1259
+msgid "Detach preset"
+msgstr "Separar predefinição"
+
+#: src/slic3r/GUI/Tab.cpp:1285
msgid "This is a default preset."
msgstr "Esta é uma predefinição padrão."
-#: src/slic3r/GUI/Tab.cpp:955
+#: src/slic3r/GUI/Tab.cpp:1287
msgid "This is a system preset."
msgstr "Esta é uma predefinição do sistema."
-#: src/slic3r/GUI/Tab.cpp:957
+#: src/slic3r/GUI/Tab.cpp:1289
msgid "Current preset is inherited from the default preset."
msgstr "Predefinição atual é herdada da predefinição padrão."
-#: src/slic3r/GUI/Tab.cpp:959
+#: src/slic3r/GUI/Tab.cpp:1293
msgid "Current preset is inherited from"
msgstr "Predefinição atual é herdada de"
-#: src/slic3r/GUI/Tab.cpp:963
+#: src/slic3r/GUI/Tab.cpp:1297
msgid "It can't be deleted or modified."
msgstr "Ele não pode ser excluído ou modificado."
-#: src/slic3r/GUI/Tab.cpp:964
+#: src/slic3r/GUI/Tab.cpp:1298
msgid ""
"Any modifications should be saved as a new preset inherited from this one."
msgstr ""
"Todas as modificações devem ser salvas como uma nova predefinição herdada de "
"uma presente."
-#: src/slic3r/GUI/Tab.cpp:965
+#: src/slic3r/GUI/Tab.cpp:1299
msgid "To do that please specify a new name for the preset."
msgstr "Para fazer isso, especifique um novo nome para a predefinição."
-#: src/slic3r/GUI/Tab.cpp:969
+#: src/slic3r/GUI/Tab.cpp:1303
msgid "Additional information:"
msgstr "Informações adicionais:"
-#: src/slic3r/GUI/Tab.cpp:975
+#: src/slic3r/GUI/Tab.cpp:1309
msgid "printer model"
msgstr "modelo de impressora"
-#: src/slic3r/GUI/Tab.cpp:983
+#: src/slic3r/GUI/Tab.cpp:1317
msgid "default print profile"
msgstr "perfil de impressão padrão"
-#: src/slic3r/GUI/Tab.cpp:986
+#: src/slic3r/GUI/Tab.cpp:1320
msgid "default filament profile"
msgstr "perfil de filamento padrão"
-#: src/slic3r/GUI/Tab.cpp:1000
+#: src/slic3r/GUI/Tab.cpp:1334
msgid "default SLA material profile"
msgstr "perfil de material SLA padrão"
-#: src/slic3r/GUI/Tab.cpp:1004
+#: src/slic3r/GUI/Tab.cpp:1338
msgid "default SLA print profile"
msgstr "perfil de impressão padrão do SLA"
-#: src/slic3r/GUI/Tab.cpp:1012
+#: src/slic3r/GUI/Tab.cpp:1346
msgid "full profile name"
-msgstr "Nome customizado da config."
+msgstr "nome customizado da config"
-#: src/slic3r/GUI/Tab.cpp:1013
+#: src/slic3r/GUI/Tab.cpp:1347
msgid "symbolic profile name"
-msgstr "nome customizado da config.:"
+msgstr "nome customizado da config"
-#: src/slic3r/GUI/Tab.cpp:1047 src/slic3r/GUI/Tab.cpp:3600
+#: src/slic3r/GUI/Tab.cpp:1385 src/slic3r/GUI/Tab.cpp:4042
msgid "Layers and perimeters"
msgstr "Camadas e perímetros"
-#: src/slic3r/GUI/Tab.cpp:1052
+#: src/slic3r/GUI/Tab.cpp:1391
msgid "Vertical shells"
msgstr "Paredes verticais"
-#: src/slic3r/GUI/Tab.cpp:1063
+#: src/slic3r/GUI/Tab.cpp:1403
msgid "Horizontal shells"
msgstr "Paredes horizontais"
-#: src/slic3r/GUI/Tab.cpp:1064 src/libslic3r/PrintConfig.cpp:1780
+#: src/slic3r/GUI/Tab.cpp:1404 src/libslic3r/PrintConfig.cpp:1980
msgid "Solid layers"
msgstr "Camadas sólidas"
-#: src/slic3r/GUI/Tab.cpp:1068
+#: src/slic3r/GUI/Tab.cpp:1409
msgid "Minimum shell thickness"
msgstr "Espessura mínima da concha"
-#: src/slic3r/GUI/Tab.cpp:1079
+#: src/slic3r/GUI/Tab.cpp:1420
msgid "Quality (slower slicing)"
msgstr "Qualidade (fatiamento mais lento)"
-#: src/slic3r/GUI/Tab.cpp:1097
+#: src/slic3r/GUI/Tab.cpp:1448
msgid "Reducing printing time"
msgstr "Reduzindo o tempo de impressão"
-#: src/slic3r/GUI/Tab.cpp:1109
+#: src/slic3r/GUI/Tab.cpp:1460
msgid "Skirt and brim"
msgstr "Saia e aba"
-#: src/slic3r/GUI/Tab.cpp:1126
+#: src/slic3r/GUI/Tab.cpp:1480
msgid "Raft"
msgstr "Estrado"
-#: src/slic3r/GUI/Tab.cpp:1130
+#: src/slic3r/GUI/Tab.cpp:1484
msgid "Options for support material and raft"
msgstr "Opções para material de suporte e estrado"
-#: src/slic3r/GUI/Tab.cpp:1145
+#: src/slic3r/GUI/Tab.cpp:1499
msgid "Speed for print moves"
msgstr "Velocidade para movimentos de impressão"
-#: src/slic3r/GUI/Tab.cpp:1157
+#: src/slic3r/GUI/Tab.cpp:1512
msgid "Speed for non-print moves"
msgstr "Velocidade para movimentos não impressos"
-#: src/slic3r/GUI/Tab.cpp:1160
+#: src/slic3r/GUI/Tab.cpp:1515
msgid "Modifiers"
msgstr "Modificadores"
-#: src/slic3r/GUI/Tab.cpp:1163
+#: src/slic3r/GUI/Tab.cpp:1518
msgid "Acceleration control (advanced)"
msgstr "Controle de aceleração (avançado)"
-#: src/slic3r/GUI/Tab.cpp:1170
+#: src/slic3r/GUI/Tab.cpp:1525
msgid "Autospeed (advanced)"
msgstr "Velocidade automática (avançado)"
-#: src/slic3r/GUI/Tab.cpp:1178
+#: src/slic3r/GUI/Tab.cpp:1533
msgid "Multiple Extruders"
msgstr "Extrusoras múltiplas"
-#: src/slic3r/GUI/Tab.cpp:1186
+#: src/slic3r/GUI/Tab.cpp:1541
msgid "Ooze prevention"
msgstr "Prevenção de vazão"
-#: src/slic3r/GUI/Tab.cpp:1204
+#: src/slic3r/GUI/Tab.cpp:1559
msgid "Extrusion width"
msgstr "Espessura da extrusão"
-#: src/slic3r/GUI/Tab.cpp:1214
+#: src/slic3r/GUI/Tab.cpp:1569
msgid "Overlap"
msgstr "Cobrir"
-#: src/slic3r/GUI/Tab.cpp:1217
+#: src/slic3r/GUI/Tab.cpp:1572
msgid "Flow"
msgstr "Fluxo"
-#: src/slic3r/GUI/Tab.cpp:1226
+#: src/slic3r/GUI/Tab.cpp:1581
msgid "Other"
msgstr "Outro"
-#: src/slic3r/GUI/Tab.cpp:1229 src/slic3r/GUI/Tab.cpp:3669
+#: src/slic3r/GUI/Tab.cpp:1584 src/slic3r/GUI/Tab.cpp:4118
msgid "Output options"
msgstr "Opções de saída"
-#: src/slic3r/GUI/Tab.cpp:1230
+#: src/slic3r/GUI/Tab.cpp:1585
msgid "Sequential printing"
msgstr "Impressão sequencial"
-#: src/slic3r/GUI/Tab.cpp:1232
-msgid "Extruder clearance (mm)"
-msgstr "Folga da extrusora (milímetro)"
+#: src/slic3r/GUI/Tab.cpp:1587
+msgid "Extruder clearance"
+msgstr "Folga da extrusora"
-#: src/slic3r/GUI/Tab.cpp:1237 src/slic3r/GUI/Tab.cpp:3670
+#: src/slic3r/GUI/Tab.cpp:1592 src/slic3r/GUI/Tab.cpp:4119
msgid "Output file"
msgstr "Arquivo de saída"
-#: src/slic3r/GUI/Tab.cpp:1244 src/libslic3r/PrintConfig.cpp:1453
+#: src/slic3r/GUI/Tab.cpp:1599 src/libslic3r/PrintConfig.cpp:1662
msgid "Post-processing scripts"
msgstr "Scripts de pós-processamento"
-#: src/slic3r/GUI/Tab.cpp:1250 src/slic3r/GUI/Tab.cpp:1251
-#: src/slic3r/GUI/Tab.cpp:1539 src/slic3r/GUI/Tab.cpp:1540
-#: src/slic3r/GUI/Tab.cpp:2014 src/slic3r/GUI/Tab.cpp:2015
-#: src/slic3r/GUI/Tab.cpp:2130 src/slic3r/GUI/Tab.cpp:2131
-#: src/slic3r/GUI/Tab.cpp:3537 src/slic3r/GUI/Tab.cpp:3538
+#: src/slic3r/GUI/Tab.cpp:1605 src/slic3r/GUI/Tab.cpp:1606
+#: src/slic3r/GUI/Tab.cpp:1927 src/slic3r/GUI/Tab.cpp:1928
+#: src/slic3r/GUI/Tab.cpp:2266 src/slic3r/GUI/Tab.cpp:2267
+#: src/slic3r/GUI/Tab.cpp:2342 src/slic3r/GUI/Tab.cpp:2343
+#: src/slic3r/GUI/Tab.cpp:3985 src/slic3r/GUI/Tab.cpp:3986
msgid "Notes"
msgstr "Notas"
-#: src/slic3r/GUI/Tab.cpp:1257 src/slic3r/GUI/Tab.cpp:1547
-#: src/slic3r/GUI/Tab.cpp:2021 src/slic3r/GUI/Tab.cpp:2137
-#: src/slic3r/GUI/Tab.cpp:3545 src/slic3r/GUI/Tab.cpp:3675
+#: src/slic3r/GUI/Tab.cpp:1612 src/slic3r/GUI/Tab.cpp:1935
+#: src/slic3r/GUI/Tab.cpp:2273 src/slic3r/GUI/Tab.cpp:2349
+#: src/slic3r/GUI/Tab.cpp:3993 src/slic3r/GUI/Tab.cpp:4124
msgid "Dependencies"
msgstr "Dependências"
-#: src/slic3r/GUI/Tab.cpp:1258 src/slic3r/GUI/Tab.cpp:1548
-#: src/slic3r/GUI/Tab.cpp:2022 src/slic3r/GUI/Tab.cpp:2138
-#: src/slic3r/GUI/Tab.cpp:3546 src/slic3r/GUI/Tab.cpp:3676
+#: src/slic3r/GUI/Tab.cpp:1613 src/slic3r/GUI/Tab.cpp:1936
+#: src/slic3r/GUI/Tab.cpp:2274 src/slic3r/GUI/Tab.cpp:2350
+#: src/slic3r/GUI/Tab.cpp:3994 src/slic3r/GUI/Tab.cpp:4125
msgid "Profile dependencies"
msgstr "Dependências de perfil"
-#: src/slic3r/GUI/Tab.cpp:1322 src/slic3r/GUI/Tab.cpp:1377
+#: src/slic3r/GUI/Tab.cpp:1693
msgid "Filament Overrides"
msgstr "Sobrescrever config. de filamento"
-#: src/slic3r/GUI/Tab.cpp:1323 src/slic3r/GUI/Tab.cpp:1382
-#: src/slic3r/GUI/Tab.cpp:2372
-msgid "Retraction"
-msgstr "Retração"
-
-#: src/slic3r/GUI/Tab.cpp:1432 src/libslic3r/PrintConfig.cpp:2067
+#: src/slic3r/GUI/Tab.cpp:1815
msgid "Temperature"
msgstr "Temperatura"
-#: src/slic3r/GUI/Tab.cpp:1438
+#: src/slic3r/GUI/Tab.cpp:1816
+msgid "Nozzle"
+msgstr "Bico de impressão"
+
+#: src/slic3r/GUI/Tab.cpp:1821
msgid "Bed"
msgstr "Mesa"
-#: src/slic3r/GUI/Tab.cpp:1443
+#: src/slic3r/GUI/Tab.cpp:1826
msgid "Cooling"
msgstr "Resfriamento"
-#: src/slic3r/GUI/Tab.cpp:1444 src/libslic3r/PrintConfig.cpp:1355
-#: src/libslic3r/PrintConfig.cpp:2200
+#: src/slic3r/GUI/Tab.cpp:1828 src/libslic3r/PrintConfig.cpp:1565
+#: src/libslic3r/PrintConfig.cpp:2428
msgid "Enable"
msgstr "Habilitar"
-#: src/slic3r/GUI/Tab.cpp:1455
+#: src/slic3r/GUI/Tab.cpp:1839
msgid "Fan settings"
msgstr "Config. da ventoinha"
-#: src/slic3r/GUI/Tab.cpp:1464
+#: src/slic3r/GUI/Tab.cpp:1850
msgid "Cooling thresholds"
msgstr "Limiares de resfriamento"
-#: src/slic3r/GUI/Tab.cpp:1470
+#: src/slic3r/GUI/Tab.cpp:1856
msgid "Filament properties"
msgstr "Propriedades de filamento"
-#: src/slic3r/GUI/Tab.cpp:1477
+#: src/slic3r/GUI/Tab.cpp:1863
msgid "Print speed override"
msgstr "Substituição da velocidade de impressão"
-#: src/slic3r/GUI/Tab.cpp:1487
+#: src/slic3r/GUI/Tab.cpp:1873
msgid "Wipe tower parameters"
msgstr "Parâmetros da torre de limpeza"
-#: src/slic3r/GUI/Tab.cpp:1490
+#: src/slic3r/GUI/Tab.cpp:1876
msgid "Toolchange parameters with single extruder MM printers"
msgstr ""
"Parâmetros de mudança de ferramenta com impressoras de multi material com "
"apenas uma extrusora"
-#: src/slic3r/GUI/Tab.cpp:1504
+#: src/slic3r/GUI/Tab.cpp:1889
msgid "Ramming settings"
msgstr "Config. de Ramming"
-#: src/slic3r/GUI/Tab.cpp:1526 src/slic3r/GUI/Tab.cpp:1977
+#: src/slic3r/GUI/Tab.cpp:1912 src/slic3r/GUI/Tab.cpp:2205
+#: src/libslic3r/PrintConfig.cpp:2063
msgid "Custom G-code"
msgstr "G-code customizado"
-#: src/slic3r/GUI/Tab.cpp:1527 src/slic3r/GUI/Tab.cpp:1978
-#: src/libslic3r/PrintConfig.cpp:1813 src/libslic3r/PrintConfig.cpp:1828
+#: src/slic3r/GUI/Tab.cpp:1913 src/slic3r/GUI/Tab.cpp:2206
+#: src/libslic3r/PrintConfig.cpp:2013 src/libslic3r/PrintConfig.cpp:2028
msgid "Start G-code"
msgstr "G-code de início"
-#: src/slic3r/GUI/Tab.cpp:1533 src/slic3r/GUI/Tab.cpp:1984
-#: src/libslic3r/PrintConfig.cpp:385 src/libslic3r/PrintConfig.cpp:395
+#: src/slic3r/GUI/Tab.cpp:1920 src/slic3r/GUI/Tab.cpp:2213
+#: src/libslic3r/PrintConfig.cpp:441 src/libslic3r/PrintConfig.cpp:451
msgid "End G-code"
msgstr "G-code de finalização"
-#: src/slic3r/GUI/Tab.cpp:1590
+#: src/slic3r/GUI/Tab.cpp:1970
msgid "Volumetric flow hints not available"
msgstr "Dicas de fluxo volumétrico não disponíveis"
-#: src/slic3r/GUI/Tab.cpp:1676 src/slic3r/GUI/Tab.cpp:1917
-msgid "Test"
-msgstr "Teste"
-
-#: src/slic3r/GUI/Tab.cpp:1685
-msgid "Could not get a valid Printer Host reference"
-msgstr "Não foi possível obter uma referência de host de impressora válida"
-
-#: src/slic3r/GUI/Tab.cpp:1691 src/slic3r/GUI/Tab.cpp:1930
-msgid "Success!"
-msgstr "Sucesso!"
-
-#: src/slic3r/GUI/Tab.cpp:1711
+#: src/slic3r/GUI/Tab.cpp:2066
msgid ""
-"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-"
-"signed certificate."
-msgstr ""
-"O arquivo HTTPS CA é opcional. Só é necessário se você usar HTTPS com um "
-"certificado auto-assinado."
-
-#: src/slic3r/GUI/Tab.cpp:1726
-msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*"
-msgstr ""
-"Arquivos de certificado (*. CRT, *. pem) | *. CRT; *. pem | Todos os "
-"arquivos | *. *"
-
-#: src/slic3r/GUI/Tab.cpp:1727
-msgid "Open CA certificate file"
-msgstr "Abra o arquivo de certificado da CA"
-
-#: src/slic3r/GUI/Tab.cpp:1754 src/libslic3r/PrintConfig.cpp:111
-msgid "HTTPS CA File"
-msgstr "Arquivo de CA HTTPS"
-
-#: src/slic3r/GUI/Tab.cpp:1755
-#, c-format
-msgid ""
-"On this system, %s uses HTTPS certificates from the system Certificate Store "
-"or Keychain."
-msgstr ""
-"Neste sistema, %s usa certificados HTTPS do sistema Certificate Store ou "
-"keychain."
-
-#: src/slic3r/GUI/Tab.cpp:1756
-msgid ""
-"To use a custom CA file, please import your CA file into Certificate Store / "
-"Keychain."
-msgstr ""
-"Para usar um arquivo de CA personalizado, importe seu arquivo de CA para o "
-"repositório de certificados/chaveiro."
-
-#: src/slic3r/GUI/Tab.cpp:1799 src/slic3r/GUI/Tab.cpp:2043
+"Note: All parameters from this group are moved to the Physical Printer "
+"settings (see changelog).\n"
+"\n"
+"A new Physical Printer profile is created by clicking on the \"cog\" icon "
+"right of the Printer profiles combo box, by selecting the \"Add physical "
+"printer\" item in the Printer combo box. The Physical Printer profile editor "
+"opens also when clicking on the \"cog\" icon in the Printer settings tab. The "
+"Physical Printer profiles are being stored into PrusaSlicer/physical_printer "
+"directory."
+msgstr ""
+"Nota: Todos os parâmetros deste grupo são movidos para as configurações da "
+"Impressora Física (consulte o changelog).\n"
+"\n"
+"Um novo perfil de impressora física é criado clicando no ícone \"engrenagem\" "
+"à direita da caixa de combinação Perfis de impressora, selecionando o item "
+"\"adicionar ou remover impressoras\" na caixa de combinação Impressora. O "
+"editor de perfis físicos da impressora também é aberto ao clicar no ícone "
+"\"engrenagem\" na guia Configurações da impressora. Os perfis de impressora "
+"física estão sendo armazenados no diretório PrusaSlicer /physical_printer."
+
+#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2286
msgid "Size and coordinates"
msgstr "Tamanho e coordenadas"
-#: src/slic3r/GUI/Tab.cpp:1804 src/slic3r/GUI/Tab.cpp:2048
-#: src/slic3r/GUI/Tab.cpp:3178
-msgid "Set"
-msgstr "Definir"
-
-#: src/slic3r/GUI/Tab.cpp:1836
+#: src/slic3r/GUI/Tab.cpp:2108 src/slic3r/GUI/UnsavedChangesDialog.cpp:1080
msgid "Capabilities"
msgstr "Capacidades"
-#: src/slic3r/GUI/Tab.cpp:1841
+#: src/slic3r/GUI/Tab.cpp:2113
msgid "Number of extruders of the printer."
msgstr "Número de extrusoras da impressora."
-#: src/slic3r/GUI/Tab.cpp:1869
+#: src/slic3r/GUI/Tab.cpp:2141
msgid ""
"Single Extruder Multi Material is selected, \n"
"and all extruders must have the same diameter.\n"
-"Do you want to change the diameter for all extruders to first extruder "
-"nozzle diameter value?"
+"Do you want to change the diameter for all extruders to first extruder nozzle "
+"diameter value?"
msgstr ""
"A extrusora multi material é selecionada, \n"
"e todas as extrusoras devem ter o mesmo diâmetro.\n"
"Você quer mudar o diâmetro para todas as extrusoras ao primeiro valor do "
"diâmetro da ponteira da extrusora?"
-#: src/slic3r/GUI/Tab.cpp:1872 src/slic3r/GUI/Tab.cpp:2342
-#: src/libslic3r/PrintConfig.cpp:1326
+#: src/slic3r/GUI/Tab.cpp:2144 src/slic3r/GUI/Tab.cpp:2552
+#: src/libslic3r/PrintConfig.cpp:1534
msgid "Nozzle diameter"
msgstr "Diâmetro do bico"
-#: src/slic3r/GUI/Tab.cpp:1902
-msgid "USB/Serial connection"
-msgstr "Conexão USB/serial"
-
-#: src/slic3r/GUI/Tab.cpp:1903 src/libslic3r/PrintConfig.cpp:1661
-msgid "Serial port"
-msgstr "Porte Serial"
-
-#: src/slic3r/GUI/Tab.cpp:1908
-msgid "Rescan serial ports"
-msgstr "Portas seriais de Rescan"
-
-#: src/slic3r/GUI/Tab.cpp:1930
-msgid "Connection to printer works correctly."
-msgstr "A ligação à impressora funciona corretamente."
-
-#: src/slic3r/GUI/Tab.cpp:1933
-msgid "Connection failed."
-msgstr "A conexão falhou."
-
-#: src/slic3r/GUI/Tab.cpp:1946 src/slic3r/GUI/Tab.cpp:2125
-msgid "Print Host upload"
-msgstr "Upload do host de impressão"
-
-#: src/slic3r/GUI/Tab.cpp:1990 src/libslic3r/PrintConfig.cpp:153
+#: src/slic3r/GUI/Tab.cpp:2220 src/libslic3r/PrintConfig.cpp:209
msgid "Before layer change G-code"
msgstr "Antes da mudança de camada G-code"
-#: src/slic3r/GUI/Tab.cpp:1996 src/libslic3r/PrintConfig.cpp:1080
+#: src/slic3r/GUI/Tab.cpp:2227 src/libslic3r/PrintConfig.cpp:1273
msgid "After layer change G-code"
msgstr "Após a mudança da camada do G-code"
-#: src/slic3r/GUI/Tab.cpp:2002 src/libslic3r/PrintConfig.cpp:2093
+#: src/slic3r/GUI/Tab.cpp:2234 src/libslic3r/PrintConfig.cpp:2321
msgid "Tool change G-code"
msgstr "G-code de troca de ferramenta"
-#: src/slic3r/GUI/Tab.cpp:2008
+#: src/slic3r/GUI/Tab.cpp:2241
msgid "Between objects G-code (for sequential printing)"
msgstr "G-code entre objetos (para impressão sequencial)"
-#: src/slic3r/GUI/Tab.cpp:2080
+#: src/slic3r/GUI/Tab.cpp:2248
+msgid "Color Change G-code"
+msgstr "G-code de troca de cor"
+
+#: src/slic3r/GUI/Tab.cpp:2254 src/libslic3r/PrintConfig.cpp:2054
+msgid "Pause Print G-code"
+msgstr "Pausa impressão ou código G personalizado"
+
+#: src/slic3r/GUI/Tab.cpp:2260
+msgid "Template Custom G-code"
+msgstr "Modelo de G-code customizado"
+
+#: src/slic3r/GUI/Tab.cpp:2293
msgid "Display"
msgstr "Exibição"
-#: src/slic3r/GUI/Tab.cpp:2095
+#: src/slic3r/GUI/Tab.cpp:2308
msgid "Tilt"
msgstr "Inclinar"
-#: src/slic3r/GUI/Tab.cpp:2096
+#: src/slic3r/GUI/Tab.cpp:2309
msgid "Tilt time"
msgstr "Tempo de inclinação"
-#: src/slic3r/GUI/Tab.cpp:2102 src/slic3r/GUI/Tab.cpp:3521
+#: src/slic3r/GUI/Tab.cpp:2315 src/slic3r/GUI/Tab.cpp:3969
msgid "Corrections"
msgstr "Correções"
-#: src/slic3r/GUI/Tab.cpp:2119 src/slic3r/GUI/Tab.cpp:3517
+#: src/slic3r/GUI/Tab.cpp:2332 src/slic3r/GUI/Tab.cpp:3965
msgid "Exposure"
msgstr "Exposição"
-#: src/slic3r/GUI/Tab.cpp:2190 src/slic3r/GUI/Tab.cpp:2275
-#: src/libslic3r/PrintConfig.cpp:1129 src/libslic3r/PrintConfig.cpp:1146
-#: src/libslic3r/PrintConfig.cpp:1163 src/libslic3r/PrintConfig.cpp:1179
-#: src/libslic3r/PrintConfig.cpp:1189 src/libslic3r/PrintConfig.cpp:1199
-#: src/libslic3r/PrintConfig.cpp:1209
+#: src/slic3r/GUI/Tab.cpp:2391 src/slic3r/GUI/Tab.cpp:2485
+#: src/libslic3r/PrintConfig.cpp:1302 src/libslic3r/PrintConfig.cpp:1337
+#: src/libslic3r/PrintConfig.cpp:1354 src/libslic3r/PrintConfig.cpp:1371
+#: src/libslic3r/PrintConfig.cpp:1387 src/libslic3r/PrintConfig.cpp:1397
+#: src/libslic3r/PrintConfig.cpp:1407 src/libslic3r/PrintConfig.cpp:1417
msgid "Machine limits"
msgstr "Limites da máquina"
-#: src/slic3r/GUI/Tab.cpp:2204
+#: src/slic3r/GUI/Tab.cpp:2414
msgid "Values in this column are for Normal mode"
msgstr "Valores nesta coluna são para o modo normal"
-#: src/slic3r/GUI/Tab.cpp:2205
-msgid "Normal"
-msgstr "Normal"
-
-#: src/slic3r/GUI/Tab.cpp:2210
+#: src/slic3r/GUI/Tab.cpp:2420
msgid "Values in this column are for Stealth mode"
msgstr "Valores nesta coluna são para o modo furtivo"
-#: src/slic3r/GUI/Tab.cpp:2211
-msgid "Stealth"
-msgstr "Furtivo"
-
-#: src/slic3r/GUI/Tab.cpp:2219
+#: src/slic3r/GUI/Tab.cpp:2429
msgid "Maximum feedrates"
msgstr "Velocidade máxima de alimentação"
-#: src/slic3r/GUI/Tab.cpp:2224
+#: src/slic3r/GUI/Tab.cpp:2434
msgid "Maximum accelerations"
msgstr "Acelerações máximas"
-#: src/slic3r/GUI/Tab.cpp:2231
+#: src/slic3r/GUI/Tab.cpp:2441
msgid "Jerk limits"
msgstr "Limites de empurrão"
-#: src/slic3r/GUI/Tab.cpp:2236
+#: src/slic3r/GUI/Tab.cpp:2446
msgid "Minimum feedrates"
msgstr "Velocidades alimentação mínimos"
-#: src/slic3r/GUI/Tab.cpp:2300 src/slic3r/GUI/Tab.cpp:2308
+#: src/slic3r/GUI/Tab.cpp:2510 src/slic3r/GUI/Tab.cpp:2518
msgid "Single extruder MM setup"
msgstr "Config. de extrusora multi material"
-#: src/slic3r/GUI/Tab.cpp:2309
+#: src/slic3r/GUI/Tab.cpp:2519
msgid "Single extruder multimaterial parameters"
msgstr "Parâmetros para extrusora única multimaterial"
-#: src/slic3r/GUI/Tab.cpp:2340
+#: src/slic3r/GUI/Tab.cpp:2550
msgid ""
"This is a single extruder multimaterial printer, diameters of all extruders "
"will be set to the new value. Do you want to proceed?"
@@ -5783,31 +7381,30 @@ msgstr ""
"Esta é uma única impressora multimaterial extrusora, diâmetros de todas as "
"extrusoras será definido para o novo valor. Você quer prosseguir?"
-#: src/slic3r/GUI/Tab.cpp:2364
+#: src/slic3r/GUI/Tab.cpp:2574
msgid "Layer height limits"
msgstr "Limites de altura da camada"
-#: src/slic3r/GUI/Tab.cpp:2369
+#: src/slic3r/GUI/Tab.cpp:2579
msgid "Position (for multi-extruder printers)"
msgstr "Posição (para impressoras multiextrusoras)"
-#: src/slic3r/GUI/Tab.cpp:2375
+#: src/slic3r/GUI/Tab.cpp:2585
msgid "Only lift Z"
msgstr "Apenas elevar Z"
-#: src/slic3r/GUI/Tab.cpp:2388
+#: src/slic3r/GUI/Tab.cpp:2598
msgid ""
-"Retraction when tool is disabled (advanced settings for multi-extruder "
-"setups)"
+"Retraction when tool is disabled (advanced settings for multi-extruder setups)"
msgstr ""
"Retração quando a ferramenta está desativada (config. avançadas para "
"instalações multiextrusoras)"
-#: src/slic3r/GUI/Tab.cpp:2396
+#: src/slic3r/GUI/Tab.cpp:2605
msgid "Reset to Filament Color"
msgstr "Restabelecer cor do filamento"
-#: src/slic3r/GUI/Tab.cpp:2577
+#: src/slic3r/GUI/Tab.cpp:2783
msgid ""
"The Wipe option is not available when using the Firmware Retraction mode.\n"
"\n"
@@ -5817,119 +7414,138 @@ msgstr ""
"\n"
"Devo desativá-lo, a fim de permitir a retração de firmware?"
-#: src/slic3r/GUI/Tab.cpp:2579
+#: src/slic3r/GUI/Tab.cpp:2785
msgid "Firmware Retraction"
msgstr "Retração do firmware"
-#: src/slic3r/GUI/Tab.cpp:2921
-#, c-format
-msgid "Default preset (%s)"
-msgstr "Predefinição padrão ( %s)"
-
-#: src/slic3r/GUI/Tab.cpp:2922
-#, c-format
-msgid "Preset (%s)"
-msgstr "Predefinição ( %s)"
-
-#: src/slic3r/GUI/Tab.cpp:2939
-msgid "has the following unsaved changes:"
-msgstr "tem as seguintes alterações não salvas:"
+#: src/slic3r/GUI/Tab.cpp:3376
+msgid "Detached"
+msgstr "Separado"
-#: src/slic3r/GUI/Tab.cpp:2942
-msgid "is not compatible with printer"
-msgstr "não é compatível com a impressora"
-
-#: src/slic3r/GUI/Tab.cpp:2943
-msgid "is not compatible with print profile"
-msgstr "não é compatível com o perfil de impressão"
-
-#: src/slic3r/GUI/Tab.cpp:2945
-msgid "and it has the following unsaved changes:"
-msgstr "e tem as seguintes alterações não salvas:"
-
-#: src/slic3r/GUI/Tab.cpp:2949
-msgid "Unsaved Changes"
-msgstr "Alterações não salvas"
-
-#: src/slic3r/GUI/Tab.cpp:3047
-msgctxt "PresetName"
-msgid "%1% - Copy"
-msgstr "%1% - cópia"
+#: src/slic3r/GUI/Tab.cpp:3439
+msgid "remove"
+msgstr "remover"
-#: src/slic3r/GUI/Tab.cpp:3070
-msgid "The supplied name is empty. It can't be saved."
-msgstr "O nome fornecido está vazio. Não pode ser salvo."
+#: src/slic3r/GUI/Tab.cpp:3439
+msgid "delete"
+msgstr "excluir"
-#: src/slic3r/GUI/Tab.cpp:3075
-msgid "Cannot overwrite a system profile."
-msgstr "Não é possível substituir um perfil de sistema."
+#: src/slic3r/GUI/Tab.cpp:3448
+msgid "It's a last preset for this physical printer."
+msgstr "É uma última predefinição para esta impressora física."
-#: src/slic3r/GUI/Tab.cpp:3079
-msgid "Cannot overwrite an external profile."
-msgstr "Não é possível substituir um perfil externo."
+#: src/slic3r/GUI/Tab.cpp:3453
+msgid ""
+"Are you sure you want to delete \"%1%\" preset from the physical printer \"%2%"
+"\"?"
+msgstr ""
+"Tem certeza de que deseja excluir predefinição \"%1%\" da impressora física "
+"\"%2%\"?"
-#: src/slic3r/GUI/Tab.cpp:3084
-msgid "Preset with name \"%1%\" already exists."
-msgstr "Predefinido com nome \"%1%\" já existe."
+#: src/slic3r/GUI/Tab.cpp:3465
+msgid ""
+"The physical printer(s) below is based on the preset, you are going to delete."
+msgstr ""
+"As impressoras físicas abaixo são baseadas na predefinição que você irá "
+"excluir."
-#: src/slic3r/GUI/Tab.cpp:3085
-msgid "Replace?"
-msgstr "Substituir?"
+#: src/slic3r/GUI/Tab.cpp:3469
+msgid ""
+"Note, that selected preset will be deleted from this/those printer(s) too."
+msgstr ""
+"Note que a predefinição selecionada será deletada desta(s) impressora(s) "
+"também."
-#: src/slic3r/GUI/Tab.cpp:3123
-msgid "remove"
-msgstr "remover"
+#: src/slic3r/GUI/Tab.cpp:3473
+msgid ""
+"The physical printer(s) below is based only on the preset, you are going to "
+"delete."
+msgstr ""
+"As impressoras físicas abaixo são baseadas somente na predefinição que você "
+"irá excluir."
-#: src/slic3r/GUI/Tab.cpp:3123
-msgid "delete"
-msgstr "excluir"
+#: src/slic3r/GUI/Tab.cpp:3477
+msgid ""
+"Note, that this/those printer(s) will be deleted after deleting of the "
+"selected preset."
+msgstr ""
+"Note que esta(s) impressora(s) serão excluídas após a exclusão da predefinição "
+"selecionada."
-#. TRN remove/delete
-#: src/slic3r/GUI/Tab.cpp:3125
+#: src/slic3r/GUI/Tab.cpp:3481
msgid "Are you sure you want to %1% the selected preset?"
msgstr "Tem certeza de que deseja %1% da predefinição selecionada?"
#. TRN Remove/Delete
-#: src/slic3r/GUI/Tab.cpp:3128
+#: src/slic3r/GUI/Tab.cpp:3486
msgid "%1% Preset"
msgstr "%1% Predefinição"
-#: src/slic3r/GUI/Tab.cpp:3254
+#: src/slic3r/GUI/Tab.cpp:3567 src/slic3r/GUI/Tab.cpp:3639
+msgid "Set"
+msgstr "Definir"
+
+#: src/slic3r/GUI/Tab.cpp:3703
+msgid "Machine limits will be emitted to G-code and used to estimate print time."
+msgstr ""
+"Os limites da máquina serão emitidos para o G-code e usados ​​o para estimar o "
+"tempo de impressão."
+
+#: src/slic3r/GUI/Tab.cpp:3706
+msgid ""
+"Machine limits will NOT be emitted to G-code, however they will be used to "
+"estimate print time, which may therefore not be accurate as the printer may "
+"apply a different set of machine limits."
+msgstr ""
+"Os limites da máquina NÃO serão emitidos para o código G, no entanto, eles "
+"serão usados ​​para estimar o tempo de impressão, que pode, portanto, não ser "
+"preciso, pois a impressora pode aplicar um conjunto diferente de limites da "
+"máquina."
+
+#: src/slic3r/GUI/Tab.cpp:3710
+msgid ""
+"Machine limits are not set, therefore the print time estimate may not be "
+"accurate."
+msgstr ""
+"Os limites da máquina não são definidos, portanto, a estimativa do tempo de "
+"impressão pode não ser precisa."
+
+#: src/slic3r/GUI/Tab.cpp:3732
msgid "LOCKED LOCK"
msgstr "CADEADO FECHADO"
#. TRN Description for "LOCKED LOCK"
-#: src/slic3r/GUI/Tab.cpp:3256
+#: src/slic3r/GUI/Tab.cpp:3734
msgid ""
-"indicates that the settings are the same as the system (or default) values "
-"for the current option group"
+"indicates that the settings are the same as the system (or default) values for "
+"the current option group"
msgstr ""
-"indica que as config. são as mesmas que os valores do sistema (ou padrão) "
-"para o grupo de opções atual"
+"indica que as config. são as mesmas que os valores do sistema (ou padrão) para "
+"o grupo de opções atual"
-#: src/slic3r/GUI/Tab.cpp:3258
+#: src/slic3r/GUI/Tab.cpp:3736
msgid "UNLOCKED LOCK"
msgstr "CADEADO ABERTO"
#. TRN Description for "UNLOCKED LOCK"
-#: src/slic3r/GUI/Tab.cpp:3260
+#: src/slic3r/GUI/Tab.cpp:3738
msgid ""
-"indicates that some settings were changed and are not equal to the system "
-"(or default) values for the current option group.\n"
-"Click the UNLOCKED LOCK icon to reset all settings for current option group "
-"to the system (or default) values."
+"indicates that some settings were changed and are not equal to the system (or "
+"default) values for the current option group.\n"
+"Click the UNLOCKED LOCK icon to reset all settings for current option group to "
+"the system (or default) values."
msgstr ""
"indica que algumas config. foram alteradas e não são iguais aos valores do "
"sistema (ou padrão) para o grupo de opções atual.\n"
-"Clique no ícone DESBLOQUEAR para redefinir todas as config. do grupo de "
-"opções atual para os valores do sistema (ou padrão)."
+"Clique no ícone DESBLOQUEAR para redefinir todas as config. do grupo de opções "
+"atual para os valores do sistema (ou padrão)."
-#: src/slic3r/GUI/Tab.cpp:3265
+#: src/slic3r/GUI/Tab.cpp:3743
msgid "WHITE BULLET"
msgstr "PONTO BRANCO"
#. TRN Description for "WHITE BULLET"
-#: src/slic3r/GUI/Tab.cpp:3267
+#: src/slic3r/GUI/Tab.cpp:3745
msgid ""
"for the left button: indicates a non-system (or non-default) preset,\n"
"for the right button: indicates that the settings hasn't been modified."
@@ -5938,12 +7554,12 @@ msgstr ""
"padrão),\n"
"para o botão direito: indica que as config. não foram modificadas."
-#: src/slic3r/GUI/Tab.cpp:3270
+#: src/slic3r/GUI/Tab.cpp:3748
msgid "BACK ARROW"
msgstr "REDEFINIR"
#. TRN Description for "BACK ARROW"
-#: src/slic3r/GUI/Tab.cpp:3272
+#: src/slic3r/GUI/Tab.cpp:3750
msgid ""
"indicates that the settings were changed and are not equal to the last saved "
"preset for the current option group.\n"
@@ -5955,33 +7571,33 @@ msgstr ""
"Clique no ícone REDEFINIR para redefinir todas as config. do grupo de opções "
"atual para a última predefinição salva."
-#: src/slic3r/GUI/Tab.cpp:3282
+#: src/slic3r/GUI/Tab.cpp:3760
msgid ""
"LOCKED LOCK icon indicates that the settings are the same as the system (or "
"default) values for the current option group"
msgstr ""
-"O ícone CADEADO FECHADO indica que as config. são as mesmas que os valores "
-"do sistema (ou padrão) para o grupo de opções atual"
+"O ícone CADEADO FECHADO indica que as config. são as mesmas que os valores do "
+"sistema (ou padrão) para o grupo de opções atual"
-#: src/slic3r/GUI/Tab.cpp:3284
+#: src/slic3r/GUI/Tab.cpp:3762
msgid ""
-"UNLOCKED LOCK icon indicates that some settings were changed and are not "
-"equal to the system (or default) values for the current option group.\n"
+"UNLOCKED LOCK icon indicates that some settings were changed and are not equal "
+"to the system (or default) values for the current option group.\n"
"Click to reset all settings for current option group to the system (or "
"default) values."
msgstr ""
-"O ícone de CADEADO ABERTO indica que algumas config. foram alteradas e não "
-"são iguais aos valores do sistema (ou padrão) para o grupo de opções atual.\n"
+"O ícone de CADEADO ABERTO indica que algumas config. foram alteradas e não são "
+"iguais aos valores do sistema (ou padrão) para o grupo de opções atual.\n"
"Clique para redefinir todas as config. para o grupo de opções atual para os "
"valores do sistema (ou padrão)."
-#: src/slic3r/GUI/Tab.cpp:3287
+#: src/slic3r/GUI/Tab.cpp:3765
msgid "WHITE BULLET icon indicates a non system (or non default) preset."
msgstr ""
"O ícone PONTO BRANCO indica uma predefinição que não é do sistema (ou não "
"predefinida)."
-#: src/slic3r/GUI/Tab.cpp:3290
+#: src/slic3r/GUI/Tab.cpp:3768
msgid ""
"WHITE BULLET icon indicates that the settings are the same as in the last "
"saved preset for the current option group."
@@ -5989,19 +7605,19 @@ msgstr ""
"O ícone PONTO BRANCO indica que as config. são as mesmas da última "
"predefinição salva para o grupo de opções atual."
-#: src/slic3r/GUI/Tab.cpp:3292
+#: src/slic3r/GUI/Tab.cpp:3770
msgid ""
-"BACK ARROW icon indicates that the settings were changed and are not equal "
-"to the last saved preset for the current option group.\n"
+"BACK ARROW icon indicates that the settings were changed and are not equal to "
+"the last saved preset for the current option group.\n"
"Click to reset all settings for the current option group to the last saved "
"preset."
msgstr ""
-"O ícone de REDEFINIR indica que as config. foram alteradas e não são iguais "
-"à última predefinição salva para o grupo de opções atual.\n"
-"Clique para redefinir todas as config. do grupo de opções atual para a "
-"última predefinição salva."
+"O ícone de REDEFINIR indica que as config. foram alteradas e não são iguais à "
+"última predefinição salva para o grupo de opções atual.\n"
+"Clique para redefinir todas as config. do grupo de opções atual para a última "
+"predefinição salva."
-#: src/slic3r/GUI/Tab.cpp:3298
+#: src/slic3r/GUI/Tab.cpp:3776
msgid ""
"LOCKED LOCK icon indicates that the value is the same as the system (or "
"default) value."
@@ -6009,7 +7625,7 @@ msgstr ""
"O ícone CADEADO FECHADO indica que o valor é o mesmo que o valor do sistema "
"(ou padrão)."
-#: src/slic3r/GUI/Tab.cpp:3299
+#: src/slic3r/GUI/Tab.cpp:3777
msgid ""
"UNLOCKED LOCK icon indicates that the value was changed and is not equal to "
"the system (or default) value.\n"
@@ -6019,7 +7635,7 @@ msgstr ""
"valor do sistema (ou padrão).\n"
"Clique para redefinir o valor atual para o valor do sistema (ou padrão)."
-#: src/slic3r/GUI/Tab.cpp:3305
+#: src/slic3r/GUI/Tab.cpp:3783
msgid ""
"WHITE BULLET icon indicates that the value is the same as in the last saved "
"preset."
@@ -6027,7 +7643,7 @@ msgstr ""
"O ícone PONTO BRANCO indica que o valor é o mesmo da última predefinição "
"guardada."
-#: src/slic3r/GUI/Tab.cpp:3306
+#: src/slic3r/GUI/Tab.cpp:3784
msgid ""
"BACK ARROW icon indicates that the value was changed and is not equal to the "
"last saved preset.\n"
@@ -6037,59 +7653,187 @@ msgstr ""
"predefinição salva.\n"
"Clique para redefinir o valor atual para a última predefinição salva."
-#. TRN Preset
-#: src/slic3r/GUI/Tab.cpp:3419
-#, c-format
-msgid "Save %s as:"
-msgstr "Salvar %s como:"
-
-#: src/slic3r/GUI/Tab.cpp:3463
-msgid "the following suffix is not allowed:"
-msgstr "o sufixo seguinte não é permitido:"
-
-#: src/slic3r/GUI/Tab.cpp:3467
-msgid "The supplied name is not available."
-msgstr "O nome fornecido não está disponível."
-
-#: src/slic3r/GUI/Tab.cpp:3480 src/slic3r/GUI/Tab.cpp:3482
+#: src/slic3r/GUI/Tab.cpp:3928 src/slic3r/GUI/Tab.cpp:3930
msgid "Material"
msgstr "Material"
-#: src/slic3r/GUI/Tab.cpp:3610
+#: src/slic3r/GUI/Tab.cpp:4052
msgid "Support head"
msgstr "Cabeça de suporte"
-#: src/slic3r/GUI/Tab.cpp:3615
+#: src/slic3r/GUI/Tab.cpp:4057
msgid "Support pillar"
msgstr "Pilar de suporte"
-#: src/slic3r/GUI/Tab.cpp:3631
+#: src/slic3r/GUI/Tab.cpp:4080
msgid "Connection of the support sticks and junctions"
msgstr "Conexão das varas de suporte e junções"
-#: src/slic3r/GUI/Tab.cpp:3636
+#: src/slic3r/GUI/Tab.cpp:4085
msgid "Automatic generation"
msgstr "Geração Automática"
-#: src/slic3r/GUI/Tab.hpp:328 src/slic3r/GUI/Tab.hpp:431
+#: src/slic3r/GUI/Tab.cpp:4159
+msgid ""
+"\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n"
+"To enable \"%1%\", please switch off \"%2%\""
+msgstr ""
+"\"%1%\" está desabilitado porque \"%2%\" está ativado na categoria \"%3%\".\n"
+"Para habilitar \"%1%\", desligue \"%2%\""
+
+#: src/slic3r/GUI/Tab.cpp:4161 src/libslic3r/PrintConfig.cpp:3002
+msgid "Object elevation"
+msgstr "Elevação do objeto"
+
+#: src/slic3r/GUI/Tab.cpp:4161 src/libslic3r/PrintConfig.cpp:3104
+msgid "Pad around object"
+msgstr "Pad em torno do objeto"
+
+#: src/slic3r/GUI/Tab.hpp:370 src/slic3r/GUI/Tab.hpp:492
msgid "Print Settings"
msgstr "Config. de impressão"
-#: src/slic3r/GUI/Tab.hpp:355
+#: src/slic3r/GUI/Tab.hpp:401
msgid "Filament Settings"
msgstr "Config. de filamento"
-#: src/slic3r/GUI/Tab.hpp:391
+#: src/slic3r/GUI/Tab.hpp:442
msgid "Printer Settings"
msgstr "Config. da impressora"
-#: src/slic3r/GUI/Tab.hpp:416
+#: src/slic3r/GUI/Tab.hpp:476
msgid "Material Settings"
msgstr "Config. de material"
-#: src/slic3r/GUI/Tab.hpp:443
-msgid "Save preset"
-msgstr "Salvar predefinição"
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:149
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:158
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:857
+msgid "Undef"
+msgstr "Indef"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:537
+msgid "PrusaSlicer is closing: Unsaved Changes"
+msgstr "PrusaSlicer está fechando: Alterações não salvas"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:554
+msgid "Switching Presets: Unsaved Changes"
+msgstr "Alterando Predefinições: Alterações não salvas"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:620
+msgid "Old Value"
+msgstr "Valor Antigo"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:621
+msgid "New Value"
+msgstr "Valor Novo"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:652
+msgid "Transfer"
+msgstr "Transferir"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:653
+msgid "Discard"
+msgstr "Descartar"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:654
+msgid "Save"
+msgstr "Salvar"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:674
+msgid "PrusaSlicer will remember your action."
+msgstr "PrusaSlicer se lembrará de sua ação."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:676
+msgid ""
+"You will not be asked about the unsaved changes the next time you close "
+"PrusaSlicer."
+msgstr ""
+"Você não será questionado sobre as alterações não salvas na próxima vez que "
+"fechar o PrusaSlicer."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:677
+msgid ""
+"You will not be asked about the unsaved changes the next time you switch a "
+"preset."
+msgstr ""
+"Você não será questionado sobre as alterações não salvas na próxima vez que "
+"alternar uma predefinição."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:678
+msgid ""
+"Visit \"Preferences\" and check \"%1%\"\n"
+"to be asked about unsaved changes again."
+msgstr ""
+"Visite \"Preferências\" e marque \"%1%\"\n"
+"para ser questionado sobre alterações não salvas novamente."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:680
+msgid "PrusaSlicer: Don't ask me again"
+msgstr "PrusaSlicer: Não me pergunte de novo"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:747
+msgid "Some fields are too long to fit. Right mouse click reveals the full text."
+msgstr ""
+"Alguns campos são muito longos para caber. Clique com o botão direito do mouse "
+"para revelar o texto completo."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:749
+msgid "All settings changes will be discarded."
+msgstr "Todas as alterações nas configurações serão descartadas."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:752
+msgid "Save the selected options."
+msgstr "Remover o objeto selecionado."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:752
+msgid "Transfer the selected settings to the newly selected preset."
+msgstr ""
+"Transfira as opções selecionadas para as predefinições recém-selecionadas."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:756
+msgid "Save the selected options to preset \"%1%\"."
+msgstr "Salve as opções selecionadas para predefinir \"%1%\"."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:757
+msgid "Transfer the selected options to the newly selected preset \"%1%\"."
+msgstr ""
+"Transfira as opções selecionadas para a predefinição recém-selecionada \"%1%\"."
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1019
+msgid "The following presets were modified:"
+msgstr "Os presets seguintes foram modificados:"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1024
+msgid "Preset \"%1%\" has the following unsaved changes:"
+msgstr "\"%1%\"Tem as seguintes alterações não salvas:"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1028
+msgid ""
+"Preset \"%1%\" is not compatible with the new printer profile and it has the "
+"following unsaved changes:"
+msgstr ""
+"A predefinição \"%1%\" não é compatível com o novo perfil de impressora e "
+"possui as seguintes alterações não salvas:"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1029
+msgid ""
+"Preset \"%1%\" is not compatible with the new print profile and it has the "
+"following unsaved changes:"
+msgstr ""
+"A predefinição \"%1%\" não é compatível com o novo perfil de impressão e "
+"possui as seguintes alterações não salvas:"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1075
+msgid "Extruders count"
+msgstr "Contagem de extrusoras"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1197
+msgid "Old value"
+msgstr "Valor padrão"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1198
+msgid "New value"
+msgstr "Novo Valor"
#: src/slic3r/GUI/UpdateDialogs.cpp:38
msgid "Update available"
@@ -6127,7 +7871,7 @@ msgstr "Não notifique mais sobre novas versões"
#: src/slic3r/GUI/UpdateDialogs.cpp:89 src/slic3r/GUI/UpdateDialogs.cpp:266
msgid "Configuration update"
-msgstr "Atualização de config."
+msgstr "Atualização de config"
#: src/slic3r/GUI/UpdateDialogs.cpp:89
msgid "Configuration update is available"
@@ -6137,8 +7881,8 @@ msgstr "A atualização de config. está disponível"
msgid ""
"Would you like to install it?\n"
"\n"
-"Note that a full configuration snapshot will be created first. It can then "
-"be restored at any time should there be a problem with the new version.\n"
+"Note that a full configuration snapshot will be created first. It can then be "
+"restored at any time should there be a problem with the new version.\n"
"\n"
"Updated configuration bundles:"
msgstr ""
@@ -6168,16 +7912,16 @@ msgstr "Você deve instalar uma atualização de configuração."
msgid ""
"%s will now start updates. Otherwise it won't be able to start.\n"
"\n"
-"Note that a full configuration snapshot will be created first. It can then "
-"be restored at any time should there be a problem with the new version.\n"
+"Note that a full configuration snapshot will be created first. It can then be "
+"restored at any time should there be a problem with the new version.\n"
"\n"
"Updated configuration bundles:"
msgstr ""
"%s agora iniciará atualizações. Caso contrário, não será capaz de começar.\n"
"\n"
-"Observe que um instantâneo de configuração completo será criado primeiro. "
-"Ele pode então ser restaurado a qualquer momento caso haja um problema com a "
-"nova versão.\n"
+"Observe que um instantâneo de configuração completo será criado primeiro. Ele "
+"pode então ser restaurado a qualquer momento caso haja um problema com a nova "
+"versão.\n"
"\n"
"Pacotes de configuração atualizados:"
@@ -6196,8 +7940,8 @@ msgstr "%s config. é incompatível"
msgid ""
"This version of %s is not compatible with currently installed configuration "
"bundles.\n"
-"This probably happened as a result of running an older %s after using a "
-"newer one.\n"
+"This probably happened as a result of running an older %s after using a newer "
+"one.\n"
"\n"
"You may either exit %s and try again with a newer version, or you may re-run "
"the initial configuration. Doing so will create a backup snapshot of the "
@@ -6208,10 +7952,9 @@ msgstr ""
"Isso provavelmente aconteceu como resultado da execução de um %s mais antigo "
"depois de usar um mais recente.\n"
"\n"
-"Você pode sair %s e tente novamente com uma versão mais recente, ou você "
-"pode executar novamente a config. inicial. Isso criará um instantâneo de "
-"backup da config. existente antes de instalar os arquivos compatíveis com "
-"este %s."
+"Você pode sair %s e tente novamente com uma versão mais recente, ou você pode "
+"executar novamente a config. inicial. Isso criará um instantâneo de backup da "
+"config. existente antes de instalar os arquivos compatíveis com este %s."
#: src/slic3r/GUI/UpdateDialogs.cpp:225
#, c-format
@@ -6233,10 +7976,10 @@ msgid ""
"\n"
"So called 'System presets' have been introduced, which hold the built-in "
"default settings for various printers. These System presets cannot be "
-"modified, instead, users now may create their own presets inheriting "
-"settings from one of the System presets.\n"
-"An inheriting preset may either inherit a particular value from its parent "
-"or override it with a customized value.\n"
+"modified, instead, users now may create their own presets inheriting settings "
+"from one of the System presets.\n"
+"An inheriting preset may either inherit a particular value from its parent or "
+"override it with a customized value.\n"
"\n"
"Please proceed with the %s that follows to set up the new presets and to "
"choose whether to enable automatic preset updates."
@@ -6245,9 +7988,9 @@ msgstr ""
"\n"
"Assim chamado ' Predefinições do sistema ' foram introduzidas, que mantêm as "
"config. padrão internas para várias impressoras. Essas predefinições do "
-"sistema não podem ser modificadas, em vez disso, os usuários agora podem "
-"criar suas próprias predefinições herdando as config. de uma das "
-"predefinições do sistema.\n"
+"sistema não podem ser modificadas, em vez disso, os usuários agora podem criar "
+"suas próprias predefinições herdando as config. de uma das predefinições do "
+"sistema.\n"
"Uma predefinição herdada pode herdar um valor específico de seu pai ou "
"substituí-lo por um valor personalizado.\n"
"\n"
@@ -6279,22 +8022,22 @@ msgstr "Personalização de Ramming"
#: src/slic3r/GUI/WipeTowerDialog.cpp:41
msgid ""
"Ramming denotes the rapid extrusion just before a tool change in a single-"
-"extruder MM printer. Its purpose is to properly shape the end of the "
-"unloaded filament so it does not prevent insertion of the new filament and "
-"can itself be reinserted later. This phase is important and different "
-"materials can require different extrusion speeds to get the good shape. For "
-"this reason, the extrusion rates during ramming are adjustable.\n"
+"extruder MM printer. Its purpose is to properly shape the end of the unloaded "
+"filament so it does not prevent insertion of the new filament and can itself "
+"be reinserted later. This phase is important and different materials can "
+"require different extrusion speeds to get the good shape. For this reason, the "
+"extrusion rates during ramming are adjustable.\n"
"\n"
"This is an expert-level setting, incorrect adjustment will likely lead to "
"jams, extruder wheel grinding into filament etc."
msgstr ""
-"O Ramming denota a extrusão rápida apenas antes que uma mudança da "
-"ferramenta em uma única-extrusora a impressora de multifilamentos Sua "
-"finalidade é moldar corretamente a extremidade do filamento descarregado "
-"assim que não impede a inserção do filamento novo e pode próprio ser "
-"reintroduzido mais tarde. Esta fase é importante e os materiais diferentes "
-"podem exigir velocidades diferentes da extrusão para começ a boa forma. Por "
-"esta razão, as taxas de extrusão durante a batendo são ajustáveis.\n"
+"O Ramming denota a extrusão rápida apenas antes que uma mudança da ferramenta "
+"em uma única-extrusora a impressora de multifilamentos Sua finalidade é moldar "
+"corretamente a extremidade do filamento descarregado assim que não impede a "
+"inserção do filamento novo e pode próprio ser reintroduzido mais tarde. Esta "
+"fase é importante e os materiais diferentes podem exigir velocidades "
+"diferentes da extrusão para começ a boa forma. Por esta razão, as taxas de "
+"extrusão durante a batendo são ajustáveis.\n"
"\n"
"Esta é uma config. de nível especialista, ajuste incorreto provavelmente "
"levará a compotas, roda extrusora moagem em filamento etc."
@@ -6321,8 +8064,7 @@ msgstr "Torre de limpeza - Ajuste de volume de purga"
#: src/slic3r/GUI/WipeTowerDialog.cpp:254
msgid ""
-"Here you can adjust required purging volume (mm³) for any given pair of "
-"tools."
+"Here you can adjust required purging volume (mm³) for any given pair of tools."
msgstr ""
"Aqui você pode ajustar o volume de purga necessário (mm ³) para qualquer par "
"dado de ferramentas."
@@ -6348,8 +8090,8 @@ msgid ""
"Total purging volume is calculated by summing two values below, depending on "
"which tools are loaded/unloaded."
msgstr ""
-"O volume de purga total é calculado somando-se dois valores abaixo, "
-"dependendo de quais ferramentas são carregadas/descarregadas."
+"O volume de purga total é calculado somando-se dois valores abaixo, dependendo "
+"de quais ferramentas são carregadas/descarregadas."
#: src/slic3r/GUI/WipeTowerDialog.cpp:286
msgid "Volume to purge (mm³) when the filament is being"
@@ -6361,8 +8103,7 @@ msgstr "De"
#: src/slic3r/GUI/WipeTowerDialog.cpp:365
msgid ""
-"Switching to simple settings will discard changes done in the advanced "
-"mode!\n"
+"Switching to simple settings will discard changes done in the advanced mode!\n"
"\n"
"Do you want to proceed?"
msgstr ""
@@ -6379,17 +8120,17 @@ msgstr "Mostrar config. simplificadas"
msgid "Show advanced settings"
msgstr "Mostrar opções avançadas"
-#: src/slic3r/GUI/wxExtensions.cpp:706
+#: src/slic3r/GUI/wxExtensions.cpp:627
#, c-format
msgid "Switch to the %s mode"
msgstr "Mude para o modo %s"
-#: src/slic3r/GUI/wxExtensions.cpp:707
+#: src/slic3r/GUI/wxExtensions.cpp:628
#, c-format
msgid "Current mode is %s"
msgstr "O modo atual é %s"
-#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:69
+#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:68
#, c-format
msgid "Mismatched type of print host: %s"
msgstr "Tipo incompatível de host de impressão: %s"
@@ -6406,25 +8147,25 @@ msgstr "Não foi possível conectar-se ao AstroBox"
msgid "Note: AstroBox version at least 1.1.0 is required."
msgstr "Nota: A versão astrobox é necessária pelo menos 1.1.0."
-#: src/slic3r/Utils/Duet.cpp:49
+#: src/slic3r/Utils/Duet.cpp:47
msgid "Connection to Duet works correctly."
msgstr "A conexão com o Duet funciona corretamente."
-#: src/slic3r/Utils/Duet.cpp:55
+#: src/slic3r/Utils/Duet.cpp:53
msgid "Could not connect to Duet"
msgstr "Não foi possível conectar-se ao Duet"
-#: src/slic3r/Utils/Duet.cpp:84 src/slic3r/Utils/Duet.cpp:139
+#: src/slic3r/Utils/Duet.cpp:88 src/slic3r/Utils/Duet.cpp:151
#: src/slic3r/Utils/FlashAir.cpp:122 src/slic3r/Utils/FlashAir.cpp:143
#: src/slic3r/Utils/FlashAir.cpp:159
msgid "Unknown error occured"
msgstr "Ocorreu um erro desconhecido"
-#: src/slic3r/Utils/Duet.cpp:133
+#: src/slic3r/Utils/Duet.cpp:145
msgid "Wrong password"
msgstr "Senha incorreta"
-#: src/slic3r/Utils/Duet.cpp:136
+#: src/slic3r/Utils/Duet.cpp:148
msgid "Could not get resources to create a new connection"
msgstr "Não foi possível obter recursos para criar uma nova conexão"
@@ -6461,8 +8202,8 @@ msgid "Model fixing"
msgstr "Fixação do modelo"
#: src/slic3r/Utils/FixModelByWin10.cpp:341
-msgid "Exporting model..."
-msgstr "Exportando o modelo..."
+msgid "Exporting model"
+msgstr "Exportando o modelo"
#: src/slic3r/Utils/FixModelByWin10.cpp:368
msgid "Export of a temporary 3mf file failed"
@@ -6515,8 +8256,7 @@ msgstr "Upload não ativado no cartão FlashAir."
#: src/slic3r/Utils/FlashAir.cpp:68
msgid "Connection to FlashAir works correctly and upload is enabled."
-msgstr ""
-"A conexão com o FlashAir funciona corretamente e o upload está ativado."
+msgstr "A conexão com o FlashAir funciona corretamente e o upload está ativado."
#: src/slic3r/Utils/FlashAir.cpp:74
msgid "Could not connect to FlashAir"
@@ -6524,253 +8264,299 @@ msgstr "Não foi possível conectar-se ao FlashAir"
#: src/slic3r/Utils/FlashAir.cpp:76
msgid ""
-"Note: FlashAir with firmware 2.00.02 or newer and activated upload function "
-"is required."
+"Note: FlashAir with firmware 2.00.02 or newer and activated upload function is "
+"required."
msgstr ""
-"Nota: O FlashAir com firmware 2.00.02 ou função de upload mais nova e "
-"ativada é necessário."
+"Nota: O FlashAir com firmware 2.00.02 ou função de upload mais nova e ativada "
+"é necessário."
-#: src/slic3r/Utils/OctoPrint.cpp:84
+#: src/slic3r/Utils/OctoPrint.cpp:83
msgid "Connection to OctoPrint works correctly."
msgstr "A ligação ao OctoPrint funciona correctamente."
-#: src/slic3r/Utils/OctoPrint.cpp:90
+#: src/slic3r/Utils/OctoPrint.cpp:89
msgid "Could not connect to OctoPrint"
msgstr "Não foi possível conectar-se ao OctoPrint"
-#: src/slic3r/Utils/OctoPrint.cpp:92
+#: src/slic3r/Utils/OctoPrint.cpp:91
msgid "Note: OctoPrint version at least 1.1.0 is required."
msgstr "Nota: OctoPrint versão pelo menos 1.1.0 é necessária."
-#: src/slic3r/Utils/OctoPrint.cpp:179
+#: src/slic3r/Utils/OctoPrint.cpp:185
msgid "Connection to Prusa SL1 works correctly."
msgstr "A conexão com o Prusa SL1 funciona corretamente."
-#: src/slic3r/Utils/OctoPrint.cpp:185
+#: src/slic3r/Utils/OctoPrint.cpp:191
msgid "Could not connect to Prusa SLA"
msgstr "Não foi possível conectar-se a Prusa SLA"
-#: src/slic3r/Utils/PresetUpdater.cpp:705
+#: src/slic3r/Utils/PresetUpdater.cpp:727
#, c-format
msgid "requires min. %s and max. %s"
msgstr "requer min . %s e máx. %s"
-#: src/slic3r/Utils/PresetUpdater.cpp:710
+#: src/slic3r/Utils/PresetUpdater.cpp:731
#, c-format
msgid "requires min. %s"
msgstr "requer min . %s"
-#: src/slic3r/Utils/PresetUpdater.cpp:713
+#: src/slic3r/Utils/PresetUpdater.cpp:734
#, c-format
msgid "requires max. %s"
msgstr "requer Max. %s"
-#: src/libslic3r/SLA/Pad.cpp:691
-msgid "Pad brim size is too small for the current configuration."
-msgstr "O tamanho da borda do bloco é muito pequeno para a configuração atual."
+#: src/slic3r/Utils/Http.cpp:73
+msgid ""
+"Could not detect system SSL certificate store. PrusaSlicer will be unable to "
+"establish secure network connections."
+msgstr ""
+"Não foi possível detectar o armazenamento de certificados SSL do sistema. O "
+"PrusaSlicer não conseguirá estabelecer conexões de rede seguras."
+
+#: src/slic3r/Utils/Http.cpp:78
+msgid "PrusaSlicer detected system SSL certificate store in: %1%"
+msgstr ""
+"PrusaSlicer detectou armazenamento de certificados SSL do sistema em: %1%"
+
+#: src/slic3r/Utils/Http.cpp:82
+msgid ""
+"To specify the system certificate store manually, please set the %1% "
+"environment variable to the correct CA bundle and restart the application."
+msgstr ""
+"Para especificar o armazenamento de certificado do sistema manualmente, defina "
+"a variável de ambiente %1% para o pacote CA correto e reinicie o aplicativo."
+
+#: src/slic3r/Utils/Http.cpp:91
+msgid ""
+"CURL init has failed. PrusaSlicer will be unable to establish network "
+"connections. See logs for additional details."
+msgstr ""
+"A iniciação do CURL falhou. PrusaSlicer não conseguirá estabelecer conexões de "
+"rede. Consulte os logs para obter detalhes adicionais."
+
+#: src/slic3r/Utils/Process.cpp:151
+msgid "Open G-code file:"
+msgstr "Abrir arquivo G-code:"
-#: src/libslic3r/Zipper.cpp:32
+#: src/libslic3r/GCode.cpp:518
+msgid "There is an object with no extrusions on the first layer."
+msgstr "Há um objeto sem extrusões na primeira camada."
+
+#: src/libslic3r/GCode.cpp:536
+msgid "Empty layers detected, the output would not be printable."
+msgstr "Camadas vazias detectadas, a saída não seria imprimível."
+
+#: src/libslic3r/GCode.cpp:537
+msgid "Print z"
+msgstr "Imprimir Z"
+
+#: src/libslic3r/GCode.cpp:538
+msgid ""
+"This is usually caused by negligibly small extrusions or by a faulty model. "
+"Try to repair the model or change its orientation on the bed."
+msgstr ""
+"Isso geralmente é causado por extrusões insignificantes ou por um modelo "
+"defeituoso. Tente reparar o modelo ou mudar sua orientação na cama."
+
+#: src/libslic3r/GCode.cpp:1261
+msgid ""
+"Your print is very close to the priming regions. Make sure there is no "
+"collision."
+msgstr ""
+"Sua impressão está muito próxima das regiões de preparação. Certifique-se de "
+"que não haverá colisão."
+
+#: src/libslic3r/ExtrusionEntity.cpp:324 src/libslic3r/ExtrusionEntity.cpp:360
+msgid "Mixed"
+msgstr "Misto"
+
+#: src/libslic3r/Flow.cpp:61
+msgid ""
+"Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible."
+msgstr ""
+"Não é possível calcular a largura de extrusão para %1%: Variável \"%2%\" não "
+"acessível."
+
+#: src/libslic3r/Format/3mf.cpp:1668
+msgid ""
+"The selected 3mf file has been saved with a newer version of %1% and is not "
+"compatible."
+msgstr ""
+"O arquivo 3mf selecionado foi salvo com uma versão mais recente de %1% e não é "
+"compatível."
+
+#: src/libslic3r/Format/AMF.cpp:958
+msgid ""
+"The selected amf file has been saved with a newer version of %1% and is not "
+"compatible."
+msgstr ""
+"O arquivo amf selecionado foi salvo com uma versão mais recente de %1% e não é "
+"compatível."
+
+#: src/libslic3r/miniz_extension.cpp:91
msgid "undefined error"
msgstr "erro indefinido"
-#: src/libslic3r/Zipper.cpp:34
+#: src/libslic3r/miniz_extension.cpp:93
msgid "too many files"
msgstr "muitos arquivos"
-#: src/libslic3r/Zipper.cpp:36
+#: src/libslic3r/miniz_extension.cpp:95
msgid "file too large"
msgstr "arquivo muito grande"
-#: src/libslic3r/Zipper.cpp:38
+#: src/libslic3r/miniz_extension.cpp:97
msgid "unsupported method"
msgstr "método não suportado"
-#: src/libslic3r/Zipper.cpp:40
+#: src/libslic3r/miniz_extension.cpp:99
msgid "unsupported encryption"
msgstr "criptografia sem suporte"
-#: src/libslic3r/Zipper.cpp:42
+#: src/libslic3r/miniz_extension.cpp:101
msgid "unsupported feature"
msgstr "recurso não suportado"
-#: src/libslic3r/Zipper.cpp:44
+#: src/libslic3r/miniz_extension.cpp:103
msgid "failed finding central directory"
msgstr "falha ao encontrar o diretório central"
-#: src/libslic3r/Zipper.cpp:46
+#: src/libslic3r/miniz_extension.cpp:105
msgid "not a ZIP archive"
msgstr "não um arquivo ZIP"
-#: src/libslic3r/Zipper.cpp:48
+#: src/libslic3r/miniz_extension.cpp:107
msgid "invalid header or archive is corrupted"
msgstr "cabeçalho ou arquivo inválido está corrompido"
-#: src/libslic3r/Zipper.cpp:50
+#: src/libslic3r/miniz_extension.cpp:109
msgid "unsupported multidisk archive"
msgstr "arquivo Multidisk sem suporte"
-#: src/libslic3r/Zipper.cpp:52
+#: src/libslic3r/miniz_extension.cpp:111
msgid "decompression failed or archive is corrupted"
msgstr "descompressão falhou ou arquivo está corrompido"
-#: src/libslic3r/Zipper.cpp:54
+#: src/libslic3r/miniz_extension.cpp:113
msgid "compression failed"
msgstr "falha na compactação"
-#: src/libslic3r/Zipper.cpp:56
+#: src/libslic3r/miniz_extension.cpp:115
msgid "unexpected decompressed size"
msgstr "tamanho descomprimido inesperado"
-#: src/libslic3r/Zipper.cpp:58
+#: src/libslic3r/miniz_extension.cpp:117
msgid "CRC-32 check failed"
msgstr "Verificação CRC-32 falhou"
-#: src/libslic3r/Zipper.cpp:60
+#: src/libslic3r/miniz_extension.cpp:119
msgid "unsupported central directory size"
msgstr "tamanho do diretório central não suportado"
-#: src/libslic3r/Zipper.cpp:62
+#: src/libslic3r/miniz_extension.cpp:121
msgid "allocation failed"
msgstr "alocação falhou"
-#: src/libslic3r/Zipper.cpp:64
+#: src/libslic3r/miniz_extension.cpp:123
msgid "file open failed"
msgstr "falha na abertura do arquivo"
-#: src/libslic3r/Zipper.cpp:66
+#: src/libslic3r/miniz_extension.cpp:125
msgid "file create failed"
msgstr "falha na criação do arquivo"
-#: src/libslic3r/Zipper.cpp:68
+#: src/libslic3r/miniz_extension.cpp:127
msgid "file write failed"
msgstr "falha na gravação do arquivo"
-#: src/libslic3r/Zipper.cpp:70
+#: src/libslic3r/miniz_extension.cpp:129
msgid "file read failed"
msgstr "falha na leitura do arquivo"
-#: src/libslic3r/Zipper.cpp:72
+#: src/libslic3r/miniz_extension.cpp:131
msgid "file close failed"
msgstr "falha ao fechar o arquivo"
-#: src/libslic3r/Zipper.cpp:74
+#: src/libslic3r/miniz_extension.cpp:133
msgid "file seek failed"
msgstr "falha na busca de arquivo"
-#: src/libslic3r/Zipper.cpp:76
+#: src/libslic3r/miniz_extension.cpp:135
msgid "file stat failed"
msgstr "falha no status do arquivo"
-#: src/libslic3r/Zipper.cpp:78
+#: src/libslic3r/miniz_extension.cpp:137
msgid "invalid parameter"
msgstr "parâmetro inválido"
-#: src/libslic3r/Zipper.cpp:80
+#: src/libslic3r/miniz_extension.cpp:139
msgid "invalid filename"
msgstr "nome de arquivo inválido"
-#: src/libslic3r/Zipper.cpp:82
+#: src/libslic3r/miniz_extension.cpp:141
msgid "buffer too small"
msgstr "buffer muito pequeno"
-#: src/libslic3r/Zipper.cpp:84
+#: src/libslic3r/miniz_extension.cpp:143
msgid "internal error"
msgstr "erro interno"
-#: src/libslic3r/Zipper.cpp:86
+#: src/libslic3r/miniz_extension.cpp:145
msgid "file not found"
msgstr "arquivo não encontrado"
-#: src/libslic3r/Zipper.cpp:88
+#: src/libslic3r/miniz_extension.cpp:147
msgid "archive is too large"
msgstr "arquivo é muito grande"
-#: src/libslic3r/Zipper.cpp:90
+#: src/libslic3r/miniz_extension.cpp:149
msgid "validation failed"
msgstr "falha na validação"
-#: src/libslic3r/Zipper.cpp:92
+#: src/libslic3r/miniz_extension.cpp:151
msgid "write calledback failed"
msgstr "write calledback falhou"
-#: src/libslic3r/Zipper.cpp:102
-msgid "Error with zip archive"
-msgstr "Erro com arquivo zip"
-
-#: src/libslic3r/GCode.cpp:637
-msgid "Empty layers detected, the output would not be printable."
-msgstr "Camadas vazias detectadas, a saída não seria imprimível."
-
-#: src/libslic3r/GCode.cpp:638
-msgid "Print z"
-msgstr "Imprimir Z"
-
-#: src/libslic3r/GCode.cpp:639
-msgid ""
-"This is usually caused by negligibly small extrusions or by a faulty model. "
-"Try to repair the model or change its orientation on the bed."
-msgstr ""
-"Isso geralmente é causado por extrusões insignificantes ou por um modelo "
-"defeituoso. Tente reparar o modelo ou mudar sua orientação na cama."
-
-#: src/libslic3r/ExtrusionEntity.cpp:323
-msgid "Mixed"
-msgstr "Misto"
-
-#: src/libslic3r/Flow.cpp:61
-msgid ""
-"Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible."
-msgstr ""
-"Não é possível calcular a largura de extrusão para %1%: Variável \"%2%\" não "
-"acessível."
-
-#: src/libslic3r/Format/3mf.cpp:1630
-msgid ""
-"The selected 3mf file has been saved with a newer version of %1% and is not "
-"compatible."
-msgstr ""
-"O arquivo 3mf selecionado foi salvo com uma versão mais recente de %1% e não "
-"é compatível."
-
-#: src/libslic3r/Format/AMF.cpp:934
-msgid ""
-"The selected amf file has been saved with a newer version of %1% and is not "
-"compatible."
-msgstr ""
-"O arquivo amf selecionado foi salvo com uma versão mais recente de %1% e não "
-"é compatível."
+#: src/libslic3r/Preset.cpp:1299
+msgid "filament"
+msgstr "filamento"
-#: src/libslic3r/Print.cpp:1219
+#: src/libslic3r/Print.cpp:1251
msgid "All objects are outside of the print volume."
msgstr "Todos os objetos estão fora do volume de impressão."
-#: src/libslic3r/Print.cpp:1222
+#: src/libslic3r/Print.cpp:1254
msgid "The supplied settings will cause an empty print."
msgstr "As config. fornecidas causarão uma impressão vazia."
-#: src/libslic3r/Print.cpp:1226
+#: src/libslic3r/Print.cpp:1258
msgid "Some objects are too close; your extruder will collide with them."
msgstr "Alguns objetos são muito próximos; sua extrusora irá colidir com eles."
-#: src/libslic3r/Print.cpp:1228
+#: src/libslic3r/Print.cpp:1260
msgid ""
"Some objects are too tall and cannot be printed without extruder collisions."
msgstr ""
"Alguns objetos são muito altos e não podem ser impressos sem colisões de "
"extrusoras."
-#: src/libslic3r/Print.cpp:1237
-msgid "The Spiral Vase option can only be used when printing a single object."
-msgstr "A opção vaso espiral só pode ser usada ao imprimir um único objeto."
+#: src/libslic3r/Print.cpp:1269
+msgid ""
+"Only a single object may be printed at a time in Spiral Vase mode. Either "
+"remove all but the last object, or enable sequential mode by \"complete_objects"
+"\"."
+msgstr ""
+"Apenas um único objeto pode ser impresso por vez no modo Vaso Espiral. Remova "
+"todos, exceto o último objeto, ou habilite o modo sequencial por "
+"\"complete_objects\"."
-#: src/libslic3r/Print.cpp:1244
+#: src/libslic3r/Print.cpp:1277
msgid ""
-"The Spiral Vase option can only be used when printing single material "
-"objects."
+"The Spiral Vase option can only be used when printing single material objects."
msgstr ""
"A opção vaso espiral só pode ser usada ao imprimir objetos de material único."
-#: src/libslic3r/Print.cpp:1257
+#: src/libslic3r/Print.cpp:1290
msgid ""
"The wipe tower is only supported if all extruders have the same nozzle "
"diameter and use filaments of the same diameter."
@@ -6778,67 +8564,66 @@ msgstr ""
"A torre de limpeza só é suportada se todas as extrusoras tiverem o mesmo "
"diâmetro da ponteira e usarem filamentos do mesmo diâmetro."
-#: src/libslic3r/Print.cpp:1262
+#: src/libslic3r/Print.cpp:1296
msgid ""
-"The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter "
-"and Repetier G-code flavors."
+"The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, "
+"RepRapFirmware and Repetier G-code flavors."
msgstr ""
-"A Wipe Tower é atualmente suportada apenas para os firmwares Marlin, RepRap/"
-"Sprinter e Repetier G-code."
+"A Torre de Limpeza é atualmente suportada apenas para os firmwares Marlin, "
+"RepRap/Sprinter, RepRapFirmware e Repetier G-code."
-#: src/libslic3r/Print.cpp:1264
+#: src/libslic3r/Print.cpp:1298
msgid ""
"The Wipe Tower is currently only supported with the relative extruder "
"addressing (use_relative_e_distances=1)."
msgstr ""
-"A torre da limpeza é suportada atualmente somente com o endereçamento "
-"relativo da extrusora (use_relative_e_distances = 1)."
+"A torre da limpeza é suportada atualmente somente com o endereçamento relativo "
+"da extrusora (use_relative_e_distances = 1)."
-#: src/libslic3r/Print.cpp:1266
+#: src/libslic3r/Print.cpp:1300
msgid "Ooze prevention is currently not supported with the wipe tower enabled."
msgstr ""
-"A prevenção de escorrimento não é suportada atualmente com a torre da "
-"limpeza permitida."
+"A prevenção de escorrimento não é suportada atualmente com a torre da limpeza "
+"permitida."
-#: src/libslic3r/Print.cpp:1268
+#: src/libslic3r/Print.cpp:1302
msgid ""
"The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)."
msgstr ""
"Atualmente, a Torre limpa não suporta E volumétrica (use_volumetric_e=0)."
-#: src/libslic3r/Print.cpp:1270
+#: src/libslic3r/Print.cpp:1304
msgid ""
-"The Wipe Tower is currently not supported for multimaterial sequential "
-"prints."
+"The Wipe Tower is currently not supported for multimaterial sequential prints."
msgstr ""
-"A torre de limpeza só é suportada para vários objetos se eles tiverem "
-"alturas de camada iguais."
+"A torre de limpeza só é suportada para vários objetos se eles tiverem alturas "
+"de camada iguais."
-#: src/libslic3r/Print.cpp:1291
+#: src/libslic3r/Print.cpp:1325
msgid ""
-"The Wipe Tower is only supported for multiple objects if they have equal "
-"layer heights"
+"The Wipe Tower is only supported for multiple objects if they have equal layer "
+"heights"
msgstr ""
-"A torre de limpeza só é suportada para vários objetos se eles tiverem "
-"alturas de camada iguais"
+"A torre de limpeza só é suportada para vários objetos se eles tiverem alturas "
+"de camada iguais"
-#: src/libslic3r/Print.cpp:1293
+#: src/libslic3r/Print.cpp:1327
msgid ""
-"The Wipe Tower is only supported for multiple objects if they are printed "
-"over an equal number of raft layers"
+"The Wipe Tower is only supported for multiple objects if they are printed over "
+"an equal number of raft layers"
msgstr ""
-"A torre de limpeza só é suportada para vários objetos se elas forem "
-"impressas em um número igual de camadas de estrado"
+"A torre de limpeza só é suportada para vários objetos se elas forem impressas "
+"em um número igual de camadas de estrado"
-#: src/libslic3r/Print.cpp:1295
+#: src/libslic3r/Print.cpp:1329
msgid ""
-"The Wipe Tower is only supported for multiple objects if they are printed "
-"with the same support_material_contact_distance"
+"The Wipe Tower is only supported for multiple objects if they are printed with "
+"the same support_material_contact_distance"
msgstr ""
"A torre de limpeza só é suportado para vários objetos se eles são impressos "
"com a mesma distância de contato do suporte"
-#: src/libslic3r/Print.cpp:1297
+#: src/libslic3r/Print.cpp:1331
msgid ""
"The Wipe Tower is only supported for multiple objects if they are sliced "
"equally."
@@ -6846,7 +8631,7 @@ msgstr ""
"A torre de limpeza só é suportada para vários objetos se eles são fatiados "
"igualmente."
-#: src/libslic3r/Print.cpp:1339
+#: src/libslic3r/Print.cpp:1373
msgid ""
"The Wipe tower is only supported if all objects have the same variable layer "
"height"
@@ -6854,85 +8639,89 @@ msgstr ""
"A torre de limpeza só é suportada se todos os objetos tiverem a mesma altura "
"de camada variável"
-#: src/libslic3r/Print.cpp:1365
+#: src/libslic3r/Print.cpp:1399
msgid ""
"One or more object were assigned an extruder that the printer does not have."
msgstr ""
"Um ou mais objetos foram atribuídos a uma extrusora que a impressora não tem."
-#: src/libslic3r/Print.cpp:1374
+#: src/libslic3r/Print.cpp:1408
msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm"
msgstr ""
"%1% = %2% mm é muito baixo para ser impresso a uma altura de camada %3% mm"
-#: src/libslic3r/Print.cpp:1377
+#: src/libslic3r/Print.cpp:1411
msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm"
msgstr ""
"Excesso %1%=%2% milímetro a ser imprimível com um diâmetro da ponteira %3% "
"milímetro"
-#: src/libslic3r/Print.cpp:1388
+#: src/libslic3r/Print.cpp:1422
msgid ""
-"Printing with multiple extruders of differing nozzle diameters. If support "
-"is to be printed with the current extruder (support_material_extruder == 0 "
-"or support_material_interface_extruder == 0), all nozzles have to be of the "
-"same diameter."
+"Printing with multiple extruders of differing nozzle diameters. If support is "
+"to be printed with the current extruder (support_material_extruder == 0 or "
+"support_material_interface_extruder == 0), all nozzles have to be of the same "
+"diameter."
msgstr ""
"Impressão com múltiplas extrusoras de diferentes diâmetros de bicos. Se a "
"sustentação deve ser imprimida com a extrusora atual "
"(support_material_extruder = = 0 ou support_material_interface_extruder = = "
"0), todos as ponteiras têm que ser do mesmo diâmetro."
-#: src/libslic3r/Print.cpp:1396
+#: src/libslic3r/Print.cpp:1430
msgid ""
-"For the Wipe Tower to work with the soluble supports, the support layers "
-"need to be synchronized with the object layers."
+"For the Wipe Tower to work with the soluble supports, the support layers need "
+"to be synchronized with the object layers."
msgstr ""
"Para que a torre de limpeza funcione com os suportes solúveis, as camadas de "
"suporte precisam ser sincronizadas com as camadas de objeto."
-#: src/libslic3r/Print.cpp:1400
+#: src/libslic3r/Print.cpp:1434
msgid ""
"The Wipe Tower currently supports the non-soluble supports only if they are "
"printed with the current extruder without triggering a tool change. (both "
"support_material_extruder and support_material_interface_extruder need to be "
"set to 0)."
msgstr ""
-"A torre de limpeza suporta atualmente os suportes não-solúveis somente se "
-"são imprimidos com o extrusor atual sem provocar uma mudança da ferramenta. "
-"(ambos support_material_extruder e support_material_interface_extruder "
-"precisam ser definidos como 0)."
+"A torre de limpeza suporta atualmente os suportes não-solúveis somente se são "
+"imprimidos com o extrusor atual sem provocar uma mudança da ferramenta. (ambos "
+"support_material_extruder e support_material_interface_extruder precisam ser "
+"definidos como 0)."
-#: src/libslic3r/Print.cpp:1422
+#: src/libslic3r/Print.cpp:1456
msgid "First layer height can't be greater than nozzle diameter"
msgstr ""
"A primeira altura da camada não pode ser maior do que o diâmetro da ponteira"
-#: src/libslic3r/Print.cpp:1427
+#: src/libslic3r/Print.cpp:1461
msgid "Layer height can't be greater than nozzle diameter"
msgstr "A altura da camada não pode ser maior do que o diâmetro da ponteira"
-#: src/libslic3r/Print.cpp:1584
+#: src/libslic3r/Print.cpp:1620
msgid "Infilling layers"
msgstr "Camadas de preenchimento"
-#: src/libslic3r/Print.cpp:1606
+#: src/libslic3r/Print.cpp:1646
msgid "Generating skirt"
msgstr "Gerando saia"
-#: src/libslic3r/Print.cpp:1614
+#: src/libslic3r/Print.cpp:1655
msgid "Generating brim"
msgstr "Gerando a aba"
-#: src/libslic3r/Print.cpp:1638
+#: src/libslic3r/Print.cpp:1678
msgid "Exporting G-code"
msgstr "Exportando o G-code"
-#: src/libslic3r/Print.cpp:1642
+#: src/libslic3r/Print.cpp:1682
msgid "Generating G-code"
msgstr "Gerando G-code"
-#: src/libslic3r/SLAPrint.cpp:615
+#: src/libslic3r/SLA/Pad.cpp:532
+msgid "Pad brim size is too small for the current configuration."
+msgstr "O tamanho da borda do bloco é muito pequeno para a configuração atual."
+
+#: src/libslic3r/SLAPrint.cpp:630
msgid ""
"Cannot proceed without support points! Add support points or disable support "
"generation."
@@ -6940,110 +8729,110 @@ msgstr ""
"Não pode prosseguir sem pontos de suporte! Adicione pontos de suporte ou "
"desative a geração de suporte."
-#: src/libslic3r/SLAPrint.cpp:627
+#: src/libslic3r/SLAPrint.cpp:642
msgid ""
"Elevation is too low for object. Use the \"Pad around object\" feature to "
"print the object without elevation."
msgstr ""
-"A elevação é muito baixa para o objeto. Use o recurso \"pad ao redor do "
-"objeto\" para imprimir o objeto sem elevação."
+"A elevação é muito baixa para o objeto. Use o recurso \"pad ao redor do objeto"
+"\" para imprimir o objeto sem elevação."
-#: src/libslic3r/SLAPrint.cpp:633
+#: src/libslic3r/SLAPrint.cpp:648
msgid ""
"The endings of the support pillars will be deployed on the gap between the "
-"object and the pad. 'Support base safety distance' has to be greater than "
-"the 'Pad object gap' parameter to avoid this."
+"object and the pad. 'Support base safety distance' has to be greater than the "
+"'Pad object gap' parameter to avoid this."
msgstr ""
"As terminações dos pilares de suporte serão implantadas na lacuna entre o "
-"objeto e o pad. ' Distância de segurança de base de suporte ' tem de ser "
-"maior do que o parâmetro ' pad objecto Gap ' para evitar este."
+"objeto e o pad. ' Distância de segurança de base de suporte ' tem de ser maior "
+"do que o parâmetro ' pad objecto Gap ' para evitar este."
-#: src/libslic3r/SLAPrint.cpp:648
+#: src/libslic3r/SLAPrint.cpp:663
msgid "Exposition time is out of printer profile bounds."
msgstr "O tempo de exposição está fora dos limites do perfil da impressora."
-#: src/libslic3r/SLAPrint.cpp:655
+#: src/libslic3r/SLAPrint.cpp:670
msgid "Initial exposition time is out of printer profile bounds."
msgstr ""
"O tempo de exposição inicial está fora dos limites do perfil da impressora."
-#: src/libslic3r/SLAPrint.cpp:762
+#: src/libslic3r/SLAPrint.cpp:786
msgid "Slicing done"
msgstr "Fatiamento pronto"
-#: src/libslic3r/SLAPrintSteps.cpp:43
+#: src/libslic3r/SLAPrintSteps.cpp:44
msgid "Hollowing model"
msgstr "Deixar oco o modelo"
-#: src/libslic3r/SLAPrintSteps.cpp:44
+#: src/libslic3r/SLAPrintSteps.cpp:45
msgid "Drilling holes into model."
-msgstr "Furando o modelo"
+msgstr "Furando o modelo."
-#: src/libslic3r/SLAPrintSteps.cpp:45
+#: src/libslic3r/SLAPrintSteps.cpp:46
msgid "Slicing model"
msgstr "Modelo de fatiamento"
-#: src/libslic3r/SLAPrintSteps.cpp:46 src/libslic3r/SLAPrintSteps.cpp:356
+#: src/libslic3r/SLAPrintSteps.cpp:47 src/libslic3r/SLAPrintSteps.cpp:359
msgid "Generating support points"
msgstr "Gerando pontos de suporte"
-#: src/libslic3r/SLAPrintSteps.cpp:47
+#: src/libslic3r/SLAPrintSteps.cpp:48
msgid "Generating support tree"
msgstr "Gerando suporte em árvore"
-#: src/libslic3r/SLAPrintSteps.cpp:48
+#: src/libslic3r/SLAPrintSteps.cpp:49
msgid "Generating pad"
msgstr "Gerando pad"
-#: src/libslic3r/SLAPrintSteps.cpp:49
+#: src/libslic3r/SLAPrintSteps.cpp:50
msgid "Slicing supports"
msgstr "Fatiando suportes"
-#: src/libslic3r/SLAPrintSteps.cpp:64
+#: src/libslic3r/SLAPrintSteps.cpp:65
msgid "Merging slices and calculating statistics"
msgstr "Mesclando camadas e calculando estatísticas"
-#: src/libslic3r/SLAPrintSteps.cpp:65
+#: src/libslic3r/SLAPrintSteps.cpp:66
msgid "Rasterizing layers"
msgstr "Rasterizando camadas"
-#: src/libslic3r/SLAPrintSteps.cpp:190
-msgid "Too much overlapping holes."
+#: src/libslic3r/SLAPrintSteps.cpp:192
+msgid "Too many overlapping holes."
msgstr "Muitos buracos sobrepostos."
-#: src/libslic3r/SLAPrintSteps.cpp:199
+#: src/libslic3r/SLAPrintSteps.cpp:201
msgid ""
"Drilling holes into the mesh failed. This is usually caused by broken model. "
"Try to fix it first."
msgstr ""
-"Os furos de perfuração na malha falharam. Isso geralmente é causado por "
-"modelo quebrado. Tente consertá-lo primeiro."
+"Os furos de perfuração na malha falharam. Isso geralmente é causado por modelo "
+"quebrado. Tente consertá-lo primeiro."
-#: src/libslic3r/SLAPrintSteps.cpp:245
+#: src/libslic3r/SLAPrintSteps.cpp:247
msgid ""
"Slicing had to be stopped due to an internal error: Inconsistent slice index."
msgstr ""
"O fatiamento teve que ser parado devido a um erro interno: índice de "
"fatiamento inconsistente."
-#: src/libslic3r/SLAPrintSteps.cpp:413 src/libslic3r/SLAPrintSteps.cpp:422
-#: src/libslic3r/SLAPrintSteps.cpp:461
+#: src/libslic3r/SLAPrintSteps.cpp:411 src/libslic3r/SLAPrintSteps.cpp:420
+#: src/libslic3r/SLAPrintSteps.cpp:459
msgid "Visualizing supports"
msgstr "Visualizando suportes"
-#: src/libslic3r/SLAPrintSteps.cpp:453
+#: src/libslic3r/SLAPrintSteps.cpp:451
msgid "No pad can be generated for this model with the current configuration"
msgstr "Nenhum pad pode ser gerado para este modelo com a configuração atual"
-#: src/libslic3r/SLAPrintSteps.cpp:621
+#: src/libslic3r/SLAPrintSteps.cpp:619
msgid ""
"There are unprintable objects. Try to adjust support settings to make the "
"objects printable."
msgstr ""
-"Há objetos imprimíveis. Tente ajustar as configurações de suporte para "
-"tornar os objetos imprimíveis."
+"Há objetos imprimíveis. Tente ajustar as configurações de suporte para tornar "
+"os objetos imprimíveis."
-#: src/libslic3r/PrintBase.cpp:71
+#: src/libslic3r/PrintBase.cpp:72
msgid "Failed processing of the output_filename_format template."
msgstr "Falha no processamento do modelo output_filename_format."
@@ -7064,10 +8853,18 @@ msgid "Bed custom model"
msgstr "Modelo customizado da mesa"
#: src/libslic3r/PrintConfig.cpp:66
-msgid "Picture sizes to be stored into a .gcode and .sl1 files"
-msgstr "Tamanhos de imagem a serem armazenados em arquivos .gcode e .sl1"
+msgid "G-code thumbnails"
+msgstr "Miniaturas de G-code"
-#: src/libslic3r/PrintConfig.cpp:73
+#: src/libslic3r/PrintConfig.cpp:67
+msgid ""
+"Picture sizes to be stored into a .gcode and .sl1 files, in the following "
+"format: \"XxY, XxY, ...\""
+msgstr ""
+"Tamanhos de imagem a serem armazenados em arquivos .gcode e .sl1, no seguinte "
+"formato: \"XxY, XxY, ...\""
+
+#: src/libslic3r/PrintConfig.cpp:75
msgid ""
"This setting controls the height (and thus the total number) of the slices/"
"layers. Thinner layers give better accuracy but take more time to print."
@@ -7076,11 +8873,11 @@ msgstr ""
"camadas. Camadas mais finas dão melhor precisão, mas levam mais tempo para "
"imprimir."
-#: src/libslic3r/PrintConfig.cpp:80
+#: src/libslic3r/PrintConfig.cpp:82
msgid "Max print height"
msgstr "Altura máxima de impressão"
-#: src/libslic3r/PrintConfig.cpp:81
+#: src/libslic3r/PrintConfig.cpp:83
msgid ""
"Set this to the maximum height that can be reached by your extruder while "
"printing."
@@ -7088,61 +8885,70 @@ msgstr ""
"Defina isto para a altura máxima que pode ser alcançada pela sua extrusora "
"durante a impressão."
-#: src/libslic3r/PrintConfig.cpp:87
+#: src/libslic3r/PrintConfig.cpp:91
msgid "Slice gap closing radius"
msgstr "Raio de fechamento da abertura da fatia"
-#: src/libslic3r/PrintConfig.cpp:89
+#: src/libslic3r/PrintConfig.cpp:93
msgid ""
-"Cracks smaller than 2x gap closing radius are being filled during the "
-"triangle mesh slicing. The gap closing operation may reduce the final print "
-"resolution, therefore it is advisable to keep the value reasonably low."
+"Cracks smaller than 2x gap closing radius are being filled during the triangle "
+"mesh slicing. The gap closing operation may reduce the final print resolution, "
+"therefore it is advisable to keep the value reasonably low."
msgstr ""
"As rachaduras menores do que duas vezes o raio de fechamento estão sendo "
-"preenchidas durante o fatiamento da malha triangular. A operação de "
-"fechamento de vão pode reduzir a resolução final de impressão, portanto, é "
-"aconselhável manter o valor razoavelmente baixo."
+"preenchidas durante o fatiamento da malha triangular. A operação de fechamento "
+"de vão pode reduzir a resolução final de impressão, portanto, é aconselhável "
+"manter o valor razoavelmente baixo."
-#: src/libslic3r/PrintConfig.cpp:97
+#: src/libslic3r/PrintConfig.cpp:101
msgid "Hostname, IP or URL"
msgstr "Hostname, IP ou URL"
-#: src/libslic3r/PrintConfig.cpp:98
+#: src/libslic3r/PrintConfig.cpp:102
msgid ""
"Slic3r can upload G-code files to a printer host. This field should contain "
-"the hostname, IP address or URL of the printer host instance."
-msgstr ""
-"Slic3r pode carregar arquivos de G-code para um host de impressora. Este "
-"campo deve conter o nome de host, o endereço IP ou a URL da instância de "
-"host da impressora."
-
-#: src/libslic3r/PrintConfig.cpp:104
+"the hostname, IP address or URL of the printer host instance. Print host "
+"behind HAProxy with basic auth enabled can be accessed by putting the user "
+"name and password into the URL in the following format: https://username:"
+"password@your-octopi-address/"
+msgstr ""
+"Slic3r pode carregar arquivos de código G para um host de impressora. Este "
+"campo deve conter o nome do host, endereço IP ou URL da instância do host da "
+"impressora. O host de impressão atrás do HAProxy com autenticação básica "
+"ativada pode ser acessado colocando o nome de usuário e a senha na URL no "
+"seguinte formato: https: //nomedeusuário:senha@seu-endereço-de-octopi/"
+
+#: src/libslic3r/PrintConfig.cpp:110
msgid "API Key / Password"
msgstr "Chave de API/senha"
-#: src/libslic3r/PrintConfig.cpp:105
+#: src/libslic3r/PrintConfig.cpp:111
msgid ""
"Slic3r can upload G-code files to a printer host. This field should contain "
"the API Key or the password required for authentication."
msgstr ""
-"Slic3r pode carregar arquivos de G-code para um host de impressora. Este "
-"campo deve conter a chave de API ou a senha exigida para a autenticação."
+"Slic3r pode carregar arquivos de G-code para um host de impressora. Este campo "
+"deve conter a chave de API ou a senha exigida para a autenticação."
+
+#: src/libslic3r/PrintConfig.cpp:118
+msgid "Name of the printer"
+msgstr "Nome da impressora"
-#: src/libslic3r/PrintConfig.cpp:112
+#: src/libslic3r/PrintConfig.cpp:125
msgid ""
"Custom CA certificate file can be specified for HTTPS OctoPrint connections, "
-"in crt/pem format. If left blank, the default OS CA certificate repository "
-"is used."
+"in crt/pem format. If left blank, the default OS CA certificate repository is "
+"used."
msgstr ""
"O arquivo de certificado de CA personalizado pode ser especificado para "
"conexões HTTPS OctoPrint, no formato CRT/PEM. Se deixado em branco, o "
"repositório de certificados do OS CA padrão é usado."
-#: src/libslic3r/PrintConfig.cpp:118
+#: src/libslic3r/PrintConfig.cpp:131
msgid "Elephant foot compensation"
msgstr "Compensação do pé do elefante"
-#: src/libslic3r/PrintConfig.cpp:120
+#: src/libslic3r/PrintConfig.cpp:133
msgid ""
"The first layer will be shrunk in the XY plane by the configured value to "
"compensate for the 1st layer squish aka an Elephant Foot effect."
@@ -7150,25 +8956,69 @@ msgstr ""
"A primeira camada será encolhido no plano XY pelo valor config.urado para "
"compensar a 1ª camada esmagada, também conhecida como pé de elefante."
-#: src/libslic3r/PrintConfig.cpp:136
+#: src/libslic3r/PrintConfig.cpp:149
+msgid "Password"
+msgstr "Senha"
+
+#: src/libslic3r/PrintConfig.cpp:155
+msgid "Printer preset name"
+msgstr "Nome da predefinição da impressora"
+
+#: src/libslic3r/PrintConfig.cpp:156
+msgid "Related printer preset name"
+msgstr "Nome da predefinição da impressora relacionada"
+
+#: src/libslic3r/PrintConfig.cpp:161
+msgid "Authorization Type"
+msgstr "Tipo de Autorização"
+
+#: src/libslic3r/PrintConfig.cpp:166
+msgid "API key"
+msgstr "Chave API"
+
+#: src/libslic3r/PrintConfig.cpp:167
+msgid "HTTP digest"
+msgstr "Resumo HTTP"
+
+#: src/libslic3r/PrintConfig.cpp:180
msgid "Avoid crossing perimeters"
msgstr "Evitar cruzamento de perímetros"
-#: src/libslic3r/PrintConfig.cpp:137
+#: src/libslic3r/PrintConfig.cpp:181
msgid ""
-"Optimize travel moves in order to minimize the crossing of perimeters. This "
-"is mostly useful with Bowden extruders which suffer from oozing. This "
-"feature slows down both the print and the G-code generation."
+"Optimize travel moves in order to minimize the crossing of perimeters. This is "
+"mostly useful with Bowden extruders which suffer from oozing. This feature "
+"slows down both the print and the G-code generation."
msgstr ""
"Otimize os movimentos de viagem para minimizar o cruzamento de perímetros. "
"Isto é principalmente útil com extrusoras Bowden que sofrem de escorrimento. "
"Este recurso retarda a impressão e a geração de G-code."
-#: src/libslic3r/PrintConfig.cpp:144 src/libslic3r/PrintConfig.cpp:2064
+#: src/libslic3r/PrintConfig.cpp:188
+msgid "Avoid crossing perimeters - Max detour length"
+msgstr "Evitar cruzamento de perímetros - Comprimento máximo do desvio"
+
+#: src/libslic3r/PrintConfig.cpp:190
+msgid ""
+"The maximum detour length for avoid crossing perimeters. If the detour is "
+"longer than this value, avoid crossing perimeters is not applied for this "
+"travel path. Detour length could be specified either as an absolute value or "
+"as percentage (for example 50%) of a direct travel path."
+msgstr ""
+"O comprimento máximo do desvio para evitar perímetros cruzados. Se o desvio "
+"for maior que este valor, Evitar cruzar perímetros não é aplicado para este "
+"caminho de viagem. O comprimento do desvio pode ser especificado como um valor "
+"absoluto ou como porcentagem (por exemplo, 50%) de um caminho de viagem direto."
+
+#: src/libslic3r/PrintConfig.cpp:193
+msgid "mm or % (zero to disable)"
+msgstr "mm ou % (zero para desativar)"
+
+#: src/libslic3r/PrintConfig.cpp:199 src/libslic3r/PrintConfig.cpp:2291
msgid "Other layers"
msgstr "Outras camadas"
-#: src/libslic3r/PrintConfig.cpp:145
+#: src/libslic3r/PrintConfig.cpp:200
msgid ""
"Bed temperature for layers after the first one. Set this to zero to disable "
"bed temperature control commands in the output."
@@ -7176,32 +9026,32 @@ msgstr ""
"Temperatura da mesa para camadas após o primeiro. Defina isso como zero para "
"desabilitar os comandos de controle de temperatura da mesa na saída."
-#: src/libslic3r/PrintConfig.cpp:147
+#: src/libslic3r/PrintConfig.cpp:203
msgid "Bed temperature"
msgstr "Temperatura da mesa"
-#: src/libslic3r/PrintConfig.cpp:154
+#: src/libslic3r/PrintConfig.cpp:210
msgid ""
"This custom code is inserted at every layer change, right before the Z move. "
-"Note that you can use placeholder variables for all Slic3r settings as well "
-"as [layer_num] and [layer_z]."
+"Note that you can use placeholder variables for all Slic3r settings as well as "
+"[layer_num] and [layer_z]."
msgstr ""
"Esse código personalizado é inserido em cada alteração de camada, logo antes "
"da movimentação Z. Observe que você pode usar variáveis de espaço reservado "
"para todas as config. Slic3r, bem como [layer_num] e [layer_z]."
-#: src/libslic3r/PrintConfig.cpp:164
+#: src/libslic3r/PrintConfig.cpp:220
msgid "Between objects G-code"
msgstr "G-code entre objetos"
-#: src/libslic3r/PrintConfig.cpp:165
+#: src/libslic3r/PrintConfig.cpp:221
msgid ""
"This code is inserted between objects when using sequential printing. By "
-"default extruder and bed temperature are reset using non-wait command; "
-"however if M104, M109, M140 or M190 are detected in this custom code, Slic3r "
-"will not add temperature commands. Note that you can use placeholder "
-"variables for all Slic3r settings, so you can put a \"M109 "
-"S[first_layer_temperature]\" command wherever you want."
+"default extruder and bed temperature are reset using non-wait command; however "
+"if M104, M109, M140 or M190 are detected in this custom code, Slic3r will not "
+"add temperature commands. Note that you can use placeholder variables for all "
+"Slic3r settings, so you can put a \"M109 S[first_layer_temperature]\" command "
+"wherever you want."
msgstr ""
"Esse código é inserido entre objetos ao usar a impressão sequencial. Por "
"padrão, a extrusora e a temperatura da mesa são redefinidas usando o comando "
@@ -7211,32 +9061,32 @@ msgstr ""
"Slic3r, para que você possa colocar um comando \"M109 S "
"[temperatura_primeira_camada]\" onde quiser."
-#: src/libslic3r/PrintConfig.cpp:176
+#: src/libslic3r/PrintConfig.cpp:232
msgid "Number of solid layers to generate on bottom surfaces."
msgstr "Número de camadas sólidas para gerar em superfícies inferiores."
-#: src/libslic3r/PrintConfig.cpp:177
+#: src/libslic3r/PrintConfig.cpp:233
msgid "Bottom solid layers"
msgstr "Camadas sólidas inferiores"
-#: src/libslic3r/PrintConfig.cpp:185
+#: src/libslic3r/PrintConfig.cpp:241
msgid ""
"The number of bottom solid layers is increased above bottom_solid_layers if "
"necessary to satisfy minimum thickness of bottom shell."
msgstr ""
"O número de camadas sólidas inferiores é aumentado acima de "
-"bottom_solid_layers se necessário para satisfazer a espessura mínima da "
-"camada inferior."
+"bottom_solid_layers se necessário para satisfazer a espessura mínima da camada "
+"inferior."
-#: src/libslic3r/PrintConfig.cpp:187
+#: src/libslic3r/PrintConfig.cpp:243
msgid "Minimum bottom shell thickness"
msgstr "Espessura mínima da casca inferior"
-#: src/libslic3r/PrintConfig.cpp:193
+#: src/libslic3r/PrintConfig.cpp:249
msgid "Bridge"
msgstr "Ponte"
-#: src/libslic3r/PrintConfig.cpp:194
+#: src/libslic3r/PrintConfig.cpp:250
msgid ""
"This is the acceleration your printer will use for bridges. Set zero to "
"disable acceleration control for bridges."
@@ -7244,93 +9094,95 @@ msgstr ""
"Esta é a aceleração que sua impressora usará para pontes. Defina zero para "
"desabilitar o controle de aceleração para pontes."
-#: src/libslic3r/PrintConfig.cpp:196 src/libslic3r/PrintConfig.cpp:339
-#: src/libslic3r/PrintConfig.cpp:862 src/libslic3r/PrintConfig.cpp:984
-#: src/libslic3r/PrintConfig.cpp:1152 src/libslic3r/PrintConfig.cpp:1201
-#: src/libslic3r/PrintConfig.cpp:1211 src/libslic3r/PrintConfig.cpp:1403
+#: src/libslic3r/PrintConfig.cpp:252 src/libslic3r/PrintConfig.cpp:395
+#: src/libslic3r/PrintConfig.cpp:940 src/libslic3r/PrintConfig.cpp:1079
+#: src/libslic3r/PrintConfig.cpp:1360 src/libslic3r/PrintConfig.cpp:1409
+#: src/libslic3r/PrintConfig.cpp:1419 src/libslic3r/PrintConfig.cpp:1612
msgid "mm/s²"
msgstr "mm/s²"
-#: src/libslic3r/PrintConfig.cpp:202
+#: src/libslic3r/PrintConfig.cpp:258
msgid "Bridging angle"
msgstr "Ângulo de ponte"
-#: src/libslic3r/PrintConfig.cpp:204
+#: src/libslic3r/PrintConfig.cpp:260
msgid ""
"Bridging angle override. If left to zero, the bridging angle will be "
"calculated automatically. Otherwise the provided angle will be used for all "
"bridges. Use 180° for zero angle."
msgstr ""
"Sobreposição de ângulo de ponte. Se deixado em zero, o ângulo de ponte será "
-"calculado automaticamente. Caso contrário, o ângulo fornecido será usado "
-"para todas as pontes. Use 180 ° para o ângulo zero."
-
-#: src/libslic3r/PrintConfig.cpp:207 src/libslic3r/PrintConfig.cpp:780
-#: src/libslic3r/PrintConfig.cpp:1640 src/libslic3r/PrintConfig.cpp:1650
-#: src/libslic3r/PrintConfig.cpp:1894 src/libslic3r/PrintConfig.cpp:2049
-#: src/libslic3r/PrintConfig.cpp:2247 src/libslic3r/PrintConfig.cpp:2737
-#: src/libslic3r/PrintConfig.cpp:2858
+"calculado automaticamente. Caso contrário, o ângulo fornecido será usado para "
+"todas as pontes. Use 180 ° para o ângulo zero."
+
+#: src/libslic3r/PrintConfig.cpp:263 src/libslic3r/PrintConfig.cpp:852
+#: src/libslic3r/PrintConfig.cpp:1853 src/libslic3r/PrintConfig.cpp:1863
+#: src/libslic3r/PrintConfig.cpp:2121 src/libslic3r/PrintConfig.cpp:2276
+#: src/libslic3r/PrintConfig.cpp:2475 src/libslic3r/PrintConfig.cpp:2976
+#: src/libslic3r/PrintConfig.cpp:3097
msgid "°"
msgstr "°"
-#: src/libslic3r/PrintConfig.cpp:213
+#: src/libslic3r/PrintConfig.cpp:269
msgid "Bridges fan speed"
msgstr "Velocidade da ventoinha nas pontes"
-#: src/libslic3r/PrintConfig.cpp:214
+#: src/libslic3r/PrintConfig.cpp:270
msgid "This fan speed is enforced during all bridges and overhangs."
msgstr ""
"Esta velocidade da ventoinha é imposta durante todas as pontes e angulações."
-#: src/libslic3r/PrintConfig.cpp:215 src/libslic3r/PrintConfig.cpp:792
-#: src/libslic3r/PrintConfig.cpp:1219 src/libslic3r/PrintConfig.cpp:1282
-#: src/libslic3r/PrintConfig.cpp:1532 src/libslic3r/PrintConfig.cpp:2425
-#: src/libslic3r/PrintConfig.cpp:2777
+#: src/libslic3r/PrintConfig.cpp:271 src/libslic3r/PrintConfig.cpp:864
+#: src/libslic3r/PrintConfig.cpp:1248 src/libslic3r/PrintConfig.cpp:1427
+#: src/libslic3r/PrintConfig.cpp:1490 src/libslic3r/PrintConfig.cpp:1745
+#: src/libslic3r/PrintConfig.cpp:2653 src/libslic3r/PrintConfig.cpp:2890
+#: src/libslic3r/PrintConfig.cpp:3016
msgid "%"
msgstr "%"
-#: src/libslic3r/PrintConfig.cpp:222
+#: src/libslic3r/PrintConfig.cpp:278
msgid "Bridge flow ratio"
msgstr "Relação de fluxo da ponte"
-#: src/libslic3r/PrintConfig.cpp:224
+#: src/libslic3r/PrintConfig.cpp:280
msgid ""
"This factor affects the amount of plastic for bridging. You can decrease it "
-"slightly to pull the extrudates and prevent sagging, although default "
-"settings are usually good and you should experiment with cooling (use a fan) "
-"before tweaking this."
+"slightly to pull the extrudates and prevent sagging, although default settings "
+"are usually good and you should experiment with cooling (use a fan) before "
+"tweaking this."
msgstr ""
"Esse fator afeta a quantidade de plástico para a ponte. Você pode diminuí-lo "
-"um pouco para puxar as extrusões e evitar a flacidez, embora as config. "
-"padrão são geralmente boas e você deve experimentar com refrigeração (use "
-"uma ventoinha) antes de ajustes isso."
+"um pouco para puxar as extrusões e evitar a flacidez, embora as config. padrão "
+"são geralmente boas e você deve experimentar com refrigeração (use uma "
+"ventoinha) antes de ajustes isso."
-#: src/libslic3r/PrintConfig.cpp:234
+#: src/libslic3r/PrintConfig.cpp:290
msgid "Bridges"
msgstr "Pontes"
-#: src/libslic3r/PrintConfig.cpp:236
+#: src/libslic3r/PrintConfig.cpp:292
msgid "Speed for printing bridges."
msgstr "Velocidade para a impressão de pontes."
-#: src/libslic3r/PrintConfig.cpp:237 src/libslic3r/PrintConfig.cpp:609
-#: src/libslic3r/PrintConfig.cpp:617 src/libslic3r/PrintConfig.cpp:626
-#: src/libslic3r/PrintConfig.cpp:634 src/libslic3r/PrintConfig.cpp:661
-#: src/libslic3r/PrintConfig.cpp:680 src/libslic3r/PrintConfig.cpp:922
-#: src/libslic3r/PrintConfig.cpp:1050 src/libslic3r/PrintConfig.cpp:1135
-#: src/libslic3r/PrintConfig.cpp:1169 src/libslic3r/PrintConfig.cpp:1181
-#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:1241
-#: src/libslic3r/PrintConfig.cpp:1300 src/libslic3r/PrintConfig.cpp:1433
-#: src/libslic3r/PrintConfig.cpp:1607 src/libslic3r/PrintConfig.cpp:1616
-#: src/libslic3r/PrintConfig.cpp:2028 src/libslic3r/PrintConfig.cpp:2154
+#: src/libslic3r/PrintConfig.cpp:293 src/libslic3r/PrintConfig.cpp:671
+#: src/libslic3r/PrintConfig.cpp:679 src/libslic3r/PrintConfig.cpp:688
+#: src/libslic3r/PrintConfig.cpp:696 src/libslic3r/PrintConfig.cpp:723
+#: src/libslic3r/PrintConfig.cpp:742 src/libslic3r/PrintConfig.cpp:1015
+#: src/libslic3r/PrintConfig.cpp:1194 src/libslic3r/PrintConfig.cpp:1267
+#: src/libslic3r/PrintConfig.cpp:1343 src/libslic3r/PrintConfig.cpp:1377
+#: src/libslic3r/PrintConfig.cpp:1389 src/libslic3r/PrintConfig.cpp:1399
+#: src/libslic3r/PrintConfig.cpp:1449 src/libslic3r/PrintConfig.cpp:1508
+#: src/libslic3r/PrintConfig.cpp:1642 src/libslic3r/PrintConfig.cpp:1820
+#: src/libslic3r/PrintConfig.cpp:1829 src/libslic3r/PrintConfig.cpp:2255
+#: src/libslic3r/PrintConfig.cpp:2382
msgid "mm/s"
msgstr "mm/s"
-#: src/libslic3r/PrintConfig.cpp:244
+#: src/libslic3r/PrintConfig.cpp:300
msgid "Brim width"
msgstr "Largura da aba"
-#: src/libslic3r/PrintConfig.cpp:245
+#: src/libslic3r/PrintConfig.cpp:301
msgid ""
"Horizontal width of the brim that will be printed around each object on the "
"first layer."
@@ -7338,146 +9190,145 @@ msgstr ""
"Largura horizontal da aba que será impressa em torno de cada objeto na "
"primeira camada."
-#: src/libslic3r/PrintConfig.cpp:252
+#: src/libslic3r/PrintConfig.cpp:308
msgid "Clip multi-part objects"
msgstr "Clip objetos de várias partes"
-#: src/libslic3r/PrintConfig.cpp:253
+#: src/libslic3r/PrintConfig.cpp:309
msgid ""
"When printing multi-material objects, this settings will make Slic3r to clip "
-"the overlapping object parts one by the other (2nd part will be clipped by "
-"the 1st, 3rd part will be clipped by the 1st and 2nd etc)."
+"the overlapping object parts one by the other (2nd part will be clipped by the "
+"1st, 3rd part will be clipped by the 1st and 2nd etc)."
msgstr ""
-"Ao imprimir objetos de vários materiais, essas config. farão com que o "
-"Slic3r recorte as partes do objeto sobrepostas uma pela outra (2ª parte será "
-"cortada pela 1ª, 3ª parte será cortada pela 1ª e 2ª, etc.)."
+"Ao imprimir objetos de vários materiais, essas config. farão com que o Slic3r "
+"recorte as partes do objeto sobrepostas uma pela outra (2ª parte será cortada "
+"pela 1ª, 3ª parte será cortada pela 1ª e 2ª, etc.)."
-#: src/libslic3r/PrintConfig.cpp:260
+#: src/libslic3r/PrintConfig.cpp:316
msgid "Colorprint height"
msgstr "Altura da impressão colorida"
-#: src/libslic3r/PrintConfig.cpp:261
+#: src/libslic3r/PrintConfig.cpp:317
msgid "Heights at which a filament change is to occur."
msgstr "Alturas em que uma mudança do filamento ocorre."
-#: src/libslic3r/PrintConfig.cpp:271
+#: src/libslic3r/PrintConfig.cpp:327
msgid "Compatible printers condition"
msgstr "Condição de impressoras compatíveis"
-#: src/libslic3r/PrintConfig.cpp:272
+#: src/libslic3r/PrintConfig.cpp:328
msgid ""
"A boolean expression using the configuration values of an active printer "
"profile. If this expression evaluates to true, this profile is considered "
"compatible with the active printer profile."
msgstr ""
-"Uma expressão booleana usando os valores de config. de um perfil de "
-"impressora ativo. Se essa expressão for avaliada como verdadeira, esse "
-"perfil será considerado compatível com o perfil de impressora ativo."
+"Uma expressão booleana usando os valores de config. de um perfil de impressora "
+"ativo. Se essa expressão for avaliada como verdadeira, esse perfil será "
+"considerado compatível com o perfil de impressora ativo."
-#: src/libslic3r/PrintConfig.cpp:286
+#: src/libslic3r/PrintConfig.cpp:342
msgid "Compatible print profiles condition"
msgstr "Condição de perfis de impressão compatíveis"
-#: src/libslic3r/PrintConfig.cpp:287
+#: src/libslic3r/PrintConfig.cpp:343
msgid ""
"A boolean expression using the configuration values of an active print "
"profile. If this expression evaluates to true, this profile is considered "
"compatible with the active print profile."
msgstr ""
-"Uma expressão booleana usando os valores de config. de um perfil de "
-"impressão ativo. Se essa expressão for avaliada como verdadeira, esse perfil "
-"será considerado compatível com o perfil de impressão ativo."
+"Uma expressão booleana usando os valores de config. de um perfil de impressão "
+"ativo. Se essa expressão for avaliada como verdadeira, esse perfil será "
+"considerado compatível com o perfil de impressão ativo."
-#: src/libslic3r/PrintConfig.cpp:304
+#: src/libslic3r/PrintConfig.cpp:360
msgid "Complete individual objects"
msgstr "Complete objetos individuais"
-#: src/libslic3r/PrintConfig.cpp:305
+#: src/libslic3r/PrintConfig.cpp:361
msgid ""
"When printing multiple objects or copies, this feature will complete each "
"object before moving onto next one (and starting it from its bottom layer). "
-"This feature is useful to avoid the risk of ruined prints. Slic3r should "
-"warn and prevent you from extruder collisions, but beware."
+"This feature is useful to avoid the risk of ruined prints. Slic3r should warn "
+"and prevent you from extruder collisions, but beware."
msgstr ""
-"Ao imprimir vários objetos ou cópias, esse recurso concluirá cada objeto "
-"antes de passar para o próximo (e iniciando-o de sua camada inferior). Este "
-"recurso é útil para evitar o risco de impressões arruinadas. Slic3r deve "
-"avisar e impedi-lo de colisões de extrusoras, mas cuidado."
+"Ao imprimir vários objetos ou cópias, esse recurso concluirá cada objeto antes "
+"de passar para o próximo (e iniciando-o de sua camada inferior). Este recurso "
+"é útil para evitar o risco de impressões arruinadas. Slic3r deve avisar e "
+"impedi-lo de colisões de extrusoras, mas cuidado."
-#: src/libslic3r/PrintConfig.cpp:313
+#: src/libslic3r/PrintConfig.cpp:369
msgid "Enable auto cooling"
msgstr "Ativar o resfriamento automático"
-#: src/libslic3r/PrintConfig.cpp:314
+#: src/libslic3r/PrintConfig.cpp:370
msgid ""
-"This flag enables the automatic cooling logic that adjusts print speed and "
-"fan speed according to layer printing time."
+"This flag enables the automatic cooling logic that adjusts print speed and fan "
+"speed according to layer printing time."
msgstr ""
"Esse sinalizador permite a lógica de resfriamento automática que ajusta a "
"velocidade de impressão e a velocidade do ventoinha de acordo com o tempo de "
"impressão da camada."
-#: src/libslic3r/PrintConfig.cpp:319
+#: src/libslic3r/PrintConfig.cpp:375
msgid "Cooling tube position"
msgstr "Posição do tubo de resfriamento"
-#: src/libslic3r/PrintConfig.cpp:320
+#: src/libslic3r/PrintConfig.cpp:376
msgid "Distance of the center-point of the cooling tube from the extruder tip."
msgstr ""
"Distância do ponto central do tubo de resfriamento da ponta da extrusora."
-#: src/libslic3r/PrintConfig.cpp:327
+#: src/libslic3r/PrintConfig.cpp:383
msgid "Cooling tube length"
msgstr "Comprimento do tubo de resfriamento"
-#: src/libslic3r/PrintConfig.cpp:328
+#: src/libslic3r/PrintConfig.cpp:384
msgid "Length of the cooling tube to limit space for cooling moves inside it."
msgstr ""
"Comprimento do tubo de resfriamento para limitar o espaço para movimentos de "
"resfriamento dentro dele."
-#: src/libslic3r/PrintConfig.cpp:336
+#: src/libslic3r/PrintConfig.cpp:392
msgid ""
-"This is the acceleration your printer will be reset to after the role-"
-"specific acceleration values are used (perimeter/infill). Set zero to "
-"prevent resetting acceleration at all."
+"This is the acceleration your printer will be reset to after the role-specific "
+"acceleration values are used (perimeter/infill). Set zero to prevent resetting "
+"acceleration at all."
msgstr ""
"Esta é a aceleração que sua impressora será redefinida para depois que os "
"valores de aceleração específicos da função forem usados (perímetro/"
"preenchimento). Defina zero para evitar redefinir a aceleração em tudo."
-#: src/libslic3r/PrintConfig.cpp:345
+#: src/libslic3r/PrintConfig.cpp:401
msgid "Default filament profile"
msgstr "Perfil de filamento padrão"
-#: src/libslic3r/PrintConfig.cpp:346
+#: src/libslic3r/PrintConfig.cpp:402
msgid ""
"Default filament profile associated with the current printer profile. On "
"selection of the current printer profile, this filament profile will be "
"activated."
msgstr ""
-"Perfil de filamento padrão associado ao perfil de impressora atual. Na "
-"seleção do perfil da impressora atual, este perfil de filamento será ativado."
+"Perfil de filamento padrão associado ao perfil de impressora atual. Na seleção "
+"do perfil da impressora atual, este perfil de filamento será ativado."
-#: src/libslic3r/PrintConfig.cpp:352
+#: src/libslic3r/PrintConfig.cpp:408
msgid "Default print profile"
msgstr "Perfil de impressão padrão"
-#: src/libslic3r/PrintConfig.cpp:353 src/libslic3r/PrintConfig.cpp:2592
-#: src/libslic3r/PrintConfig.cpp:2603
+#: src/libslic3r/PrintConfig.cpp:409 src/libslic3r/PrintConfig.cpp:2820
+#: src/libslic3r/PrintConfig.cpp:2831
msgid ""
"Default print profile associated with the current printer profile. On "
-"selection of the current printer profile, this print profile will be "
-"activated."
+"selection of the current printer profile, this print profile will be activated."
msgstr ""
-"Perfil de impressão padrão associado ao perfil de impressora atual. Na "
-"seleção do perfil de impressora atual, este perfil de impressão será ativado."
+"Perfil de impressão padrão associado ao perfil de impressora atual. Na seleção "
+"do perfil de impressora atual, este perfil de impressão será ativado."
-#: src/libslic3r/PrintConfig.cpp:359
+#: src/libslic3r/PrintConfig.cpp:415
msgid "Disable fan for the first"
msgstr "Desabilite o ventoinha para a(s) primeira(s)"
-#: src/libslic3r/PrintConfig.cpp:360
+#: src/libslic3r/PrintConfig.cpp:416
msgid ""
"You can set this to a positive value to disable fan at all during the first "
"layers, so that it does not make adhesion worse."
@@ -7485,27 +9336,27 @@ msgstr ""
"Você pode ajustar isto a um valor positivo para desabilitar a ventoinha "
"durante as primeiras camadas, de modo que melhore a adesão."
-#: src/libslic3r/PrintConfig.cpp:369
+#: src/libslic3r/PrintConfig.cpp:425
msgid "Don't support bridges"
msgstr "Não suporte pontes"
-#: src/libslic3r/PrintConfig.cpp:371
+#: src/libslic3r/PrintConfig.cpp:427
msgid ""
-"Experimental option for preventing support material from being generated "
-"under bridged areas."
+"Experimental option for preventing support material from being generated under "
+"bridged areas."
msgstr ""
-"Opção experimental para impedir que o material de suporte seja gerado em "
-"áreas com ponte."
+"Opção experimental para impedir que o material de suporte seja gerado em áreas "
+"com ponte."
-#: src/libslic3r/PrintConfig.cpp:377
+#: src/libslic3r/PrintConfig.cpp:433
msgid "Distance between copies"
msgstr "Distância entre cópias"
-#: src/libslic3r/PrintConfig.cpp:378
+#: src/libslic3r/PrintConfig.cpp:434
msgid "Distance used for the auto-arrange feature of the plater."
msgstr "Distância usada para o recurso de organizar automaticamente a bandeja."
-#: src/libslic3r/PrintConfig.cpp:386
+#: src/libslic3r/PrintConfig.cpp:442
msgid ""
"This end procedure is inserted at the end of the output file. Note that you "
"can use placeholder variables for all PrusaSlicer settings."
@@ -7514,7 +9365,7 @@ msgstr ""
"você pode usar variáveis de espaço reservado para todas as config. de "
"PrusaSlicer."
-#: src/libslic3r/PrintConfig.cpp:396
+#: src/libslic3r/PrintConfig.cpp:452
msgid ""
"This end procedure is inserted at the end of the output file, before the "
"printer end gcode (and before any toolchange from this filament in case of "
@@ -7523,73 +9374,81 @@ msgid ""
"in extruder order."
msgstr ""
"Este procedimento final é inserido no final do arquivo de saída, antes da "
-"extremidade da impressora Gcode (e antes de qualquer troca de ferramenta "
-"deste filamento em caso de impressoras multimaterial). Observe que você pode "
-"usar variáveis de espaço reservado para todas as config. de PrusaSlicer. Se "
-"você tiver várias extrusoras, o Gcode é processado em ordem de extrusora."
+"extremidade da impressora Gcode (e antes de qualquer troca de ferramenta deste "
+"filamento em caso de impressoras multimaterial). Observe que você pode usar "
+"variáveis de espaço reservado para todas as config. de PrusaSlicer. Se você "
+"tiver várias extrusoras, o Gcode é processado em ordem de extrusora."
-#: src/libslic3r/PrintConfig.cpp:407
+#: src/libslic3r/PrintConfig.cpp:463
msgid "Ensure vertical shell thickness"
msgstr "Assegure a espessura vertical da parede"
-#: src/libslic3r/PrintConfig.cpp:409
+#: src/libslic3r/PrintConfig.cpp:465
msgid ""
"Add solid infill near sloping surfaces to guarantee the vertical shell "
"thickness (top+bottom solid layers)."
msgstr ""
-"Adicionar preenchimento sólido perto de superfícies inclinadas para garantir "
-"a espessura do escudo vertical (camadas sólidas no topo + base )."
+"Adicionar preenchimento sólido perto de superfícies inclinadas para garantir a "
+"espessura do escudo vertical (camadas sólidas no topo + base )."
-#: src/libslic3r/PrintConfig.cpp:415
+#: src/libslic3r/PrintConfig.cpp:471
msgid "Top fill pattern"
msgstr "Padrão de preenchimento do topo"
-#: src/libslic3r/PrintConfig.cpp:417
+#: src/libslic3r/PrintConfig.cpp:473
msgid ""
-"Fill pattern for top infill. This only affects the top visible layer, and "
-"not its adjacent solid shells."
+"Fill pattern for top infill. This only affects the top visible layer, and not "
+"its adjacent solid shells."
msgstr ""
"Padrão de preenchimento para preenchimento do topo. Isto afeta somente a "
"camada visível superior, e não suas paredes adjacentes."
-#: src/libslic3r/PrintConfig.cpp:425 src/libslic3r/PrintConfig.cpp:843
-#: src/libslic3r/PrintConfig.cpp:2009
+#: src/libslic3r/PrintConfig.cpp:483 src/libslic3r/PrintConfig.cpp:918
+#: src/libslic3r/PrintConfig.cpp:2236
msgid "Rectilinear"
msgstr "Rectilíneo"
-#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:849
+#: src/libslic3r/PrintConfig.cpp:484
+msgid "Monotonic"
+msgstr "Monotônico"
+
+#: src/libslic3r/PrintConfig.cpp:485 src/libslic3r/PrintConfig.cpp:919
+msgid "Aligned Rectilinear"
+msgstr "Rectilíneo Alinhado"
+
+#: src/libslic3r/PrintConfig.cpp:486 src/libslic3r/PrintConfig.cpp:925
msgid "Concentric"
msgstr "Concêntrico"
-#: src/libslic3r/PrintConfig.cpp:427 src/libslic3r/PrintConfig.cpp:853
+#: src/libslic3r/PrintConfig.cpp:487 src/libslic3r/PrintConfig.cpp:929
msgid "Hilbert Curve"
msgstr "Curva de Hilbert"
-#: src/libslic3r/PrintConfig.cpp:428 src/libslic3r/PrintConfig.cpp:854
+#: src/libslic3r/PrintConfig.cpp:488 src/libslic3r/PrintConfig.cpp:930
msgid "Archimedean Chords"
msgstr "Cordas Archimedean"
-#: src/libslic3r/PrintConfig.cpp:429 src/libslic3r/PrintConfig.cpp:855
+#: src/libslic3r/PrintConfig.cpp:489 src/libslic3r/PrintConfig.cpp:931
msgid "Octagram Spiral"
msgstr "Espiral estrelado"
-#: src/libslic3r/PrintConfig.cpp:435
+#: src/libslic3r/PrintConfig.cpp:495
msgid "Bottom fill pattern"
msgstr "Padrão de preenchimento da base"
-#: src/libslic3r/PrintConfig.cpp:437
+#: src/libslic3r/PrintConfig.cpp:497
msgid ""
-"Fill pattern for bottom infill. This only affects the bottom external "
-"visible layer, and not its adjacent solid shells."
+"Fill pattern for bottom infill. This only affects the bottom external visible "
+"layer, and not its adjacent solid shells."
msgstr ""
"Padrão de preenchimento para preenchimento da base. Isto afeta somente a "
"camada visível externa inferior, e não suas paredes adjacentes."
-#: src/libslic3r/PrintConfig.cpp:446 src/libslic3r/PrintConfig.cpp:457
+#: src/libslic3r/PrintConfig.cpp:506 src/libslic3r/PrintConfig.cpp:517
msgid "External perimeters"
msgstr "Perímetros externos"
-#: src/libslic3r/PrintConfig.cpp:448
+#: src/libslic3r/PrintConfig.cpp:508
msgid ""
"Set this to a non-zero value to set a manual extrusion width for external "
"perimeters. If left zero, default extrusion width will be used if set, "
@@ -7602,16 +9461,16 @@ msgstr ""
"ponteira será usado. Se expresso em porcentagem(por exemplo 200%), será "
"calculado sobre a altura da camada."
-#: src/libslic3r/PrintConfig.cpp:451 src/libslic3r/PrintConfig.cpp:560
-#: src/libslic3r/PrintConfig.cpp:882 src/libslic3r/PrintConfig.cpp:895
-#: src/libslic3r/PrintConfig.cpp:1015 src/libslic3r/PrintConfig.cpp:1041
-#: src/libslic3r/PrintConfig.cpp:1423 src/libslic3r/PrintConfig.cpp:1761
-#: src/libslic3r/PrintConfig.cpp:1883 src/libslic3r/PrintConfig.cpp:1951
-#: src/libslic3r/PrintConfig.cpp:2111
+#: src/libslic3r/PrintConfig.cpp:511 src/libslic3r/PrintConfig.cpp:621
+#: src/libslic3r/PrintConfig.cpp:962 src/libslic3r/PrintConfig.cpp:975
+#: src/libslic3r/PrintConfig.cpp:1104 src/libslic3r/PrintConfig.cpp:1159
+#: src/libslic3r/PrintConfig.cpp:1185 src/libslic3r/PrintConfig.cpp:1632
+#: src/libslic3r/PrintConfig.cpp:1961 src/libslic3r/PrintConfig.cpp:2110
+#: src/libslic3r/PrintConfig.cpp:2178 src/libslic3r/PrintConfig.cpp:2339
msgid "mm or %"
msgstr "mm ou %"
-#: src/libslic3r/PrintConfig.cpp:459
+#: src/libslic3r/PrintConfig.cpp:519
msgid ""
"This separate setting will affect the speed of external perimeters (the "
"visible ones). If expressed as percentage (for example: 80%) it will be "
@@ -7621,17 +9480,17 @@ msgstr ""
"visíveis). Se expresso em porcentagem(por exemplo: 80%) Ele será calculado "
"sobre a velocidade de perímetros config. acima. Defina como zero para auto."
-#: src/libslic3r/PrintConfig.cpp:462 src/libslic3r/PrintConfig.cpp:904
-#: src/libslic3r/PrintConfig.cpp:1720 src/libslic3r/PrintConfig.cpp:1772
-#: src/libslic3r/PrintConfig.cpp:1995 src/libslic3r/PrintConfig.cpp:2124
+#: src/libslic3r/PrintConfig.cpp:522 src/libslic3r/PrintConfig.cpp:984
+#: src/libslic3r/PrintConfig.cpp:1920 src/libslic3r/PrintConfig.cpp:1972
+#: src/libslic3r/PrintConfig.cpp:2222 src/libslic3r/PrintConfig.cpp:2352
msgid "mm/s or %"
msgstr "mm/s ou %"
-#: src/libslic3r/PrintConfig.cpp:469
+#: src/libslic3r/PrintConfig.cpp:529
msgid "External perimeters first"
msgstr "Perímetros externos primeiro"
-#: src/libslic3r/PrintConfig.cpp:471
+#: src/libslic3r/PrintConfig.cpp:531
msgid ""
"Print contour perimeters from the outermost one to the innermost one instead "
"of the default inverse order."
@@ -7639,22 +9498,22 @@ msgstr ""
"Imprima perímetros de contorno do mais externo para o mais interno em vez da "
"ordem inversa padrão."
-#: src/libslic3r/PrintConfig.cpp:477
+#: src/libslic3r/PrintConfig.cpp:537
msgid "Extra perimeters if needed"
msgstr "Perímetros extras se necessário"
-#: src/libslic3r/PrintConfig.cpp:479
-#, no-c-format
+#: src/libslic3r/PrintConfig.cpp:539
+#, c-format
msgid ""
"Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r "
-"keeps adding perimeters, until more than 70% of the loop immediately above "
-"is supported."
+"keeps adding perimeters, until more than 70% of the loop immediately above is "
+"supported."
msgstr ""
"Adicione mais perímetros quando necessário para evitar lacunas em paredes "
"inclinados. Slic3r continua adicionando perímetros, até que mais de 70% o do "
"loop imediatamente acima é suportado."
-#: src/libslic3r/PrintConfig.cpp:489
+#: src/libslic3r/PrintConfig.cpp:549
msgid ""
"The extruder to use (unless more specific extruder settings are specified). "
"This value overrides perimeter and infill extruders, but not the support "
@@ -7664,58 +9523,57 @@ msgstr ""
"sejam especificadas). Esse valor substitui as extrusoras de perímetro e "
"preenchimento, mas não as extrusoras de suporte."
-#: src/libslic3r/PrintConfig.cpp:501
+#: src/libslic3r/PrintConfig.cpp:561
msgid ""
-"Set this to the vertical distance between your nozzle tip and (usually) the "
-"X carriage rods. In other words, this is the height of the clearance "
-"cylinder around your extruder, and it represents the maximum depth the "
-"extruder can peek before colliding with other printed objects."
+"Set this to the vertical distance between your nozzle tip and (usually) the X "
+"carriage rods. In other words, this is the height of the clearance cylinder "
+"around your extruder, and it represents the maximum depth the extruder can "
+"peek before colliding with other printed objects."
msgstr ""
-"Defina isto para a distância vertical entre a ponta do bico e (normalmente) "
-"as hastes do X. Em outras palavras, esta é a altura do cilindro de folga em "
-"torno de sua extrusora, e representa a profundidade máxima que a extrusora "
-"pode espreitar antes de colidir com outros objetos impressos."
+"Defina isto para a distância vertical entre a ponta do bico e (normalmente) as "
+"hastes do X. Em outras palavras, esta é a altura do cilindro de folga em torno "
+"de sua extrusora, e representa a profundidade máxima que a extrusora pode "
+"espreitar antes de colidir com outros objetos impressos."
-#: src/libslic3r/PrintConfig.cpp:512
+#: src/libslic3r/PrintConfig.cpp:572
msgid ""
-"Set this to the clearance radius around your extruder. If the extruder is "
-"not centered, choose the largest value for safety. This setting is used to "
-"check for collisions and to display the graphical preview in the plater."
+"Set this to the clearance radius around your extruder. If the extruder is not "
+"centered, choose the largest value for safety. This setting is used to check "
+"for collisions and to display the graphical preview in the plater."
msgstr ""
-"Defina isso para o raio de folga em torno de sua extrusora. Se a extrusora "
-"não estiver centralizada, escolha o maior valor para a segurança. Essa "
-"config. é usada para verificar colisões e exibir a visualização gráfica na "
-"bandeja."
+"Defina isso para o raio de folga em torno de sua extrusora. Se a extrusora não "
+"estiver centralizada, escolha o maior valor para a segurança. Essa config. é "
+"usada para verificar colisões e exibir a visualização gráfica na bandeja."
-#: src/libslic3r/PrintConfig.cpp:522
+#: src/libslic3r/PrintConfig.cpp:582
msgid "Extruder Color"
msgstr "Cor da extrusora"
-#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:583
+#: src/libslic3r/PrintConfig.cpp:583 src/libslic3r/PrintConfig.cpp:645
msgid "This is only used in the Slic3r interface as a visual help."
msgstr "Isso é usado apenas na interface Slic3r como uma ajuda visual."
-#: src/libslic3r/PrintConfig.cpp:529
+#: src/libslic3r/PrintConfig.cpp:589
msgid "Extruder offset"
-msgstr "Compensamento da extrusora"
+msgstr "Compensação da extrusora"
-#: src/libslic3r/PrintConfig.cpp:530
+#: src/libslic3r/PrintConfig.cpp:590
msgid ""
-"If your firmware doesn't handle the extruder displacement you need the G-"
-"code to take it into account. This option lets you specify the displacement "
-"of each extruder with respect to the first one. It expects positive "
-"coordinates (they will be subtracted from the XY coordinate)."
+"If your firmware doesn't handle the extruder displacement you need the G-code "
+"to take it into account. This option lets you specify the displacement of each "
+"extruder with respect to the first one. It expects positive coordinates (they "
+"will be subtracted from the XY coordinate)."
msgstr ""
-"Se o seu firmware não manipula o deslocamento da extrusora, você precisa do "
-"G-code para levá-lo em conta. Esta opção permite especificar o deslocamento "
-"de cada extrusora em relação à primeira. Ele espera coordenadas positivas "
-"(eles serão subtraída da coordenada XY)."
+"Se o seu firmware não manipula o deslocamento da extrusora, você precisa do G-"
+"code para levá-lo em conta. Esta opção permite especificar o deslocamento de "
+"cada extrusora em relação à primeira. Ele espera coordenadas positivas (eles "
+"serão subtraída da coordenada XY)."
-#: src/libslic3r/PrintConfig.cpp:539
+#: src/libslic3r/PrintConfig.cpp:599
msgid "Extrusion axis"
msgstr "Eixo de extrusão"
-#: src/libslic3r/PrintConfig.cpp:540
+#: src/libslic3r/PrintConfig.cpp:600
msgid ""
"Use this option to set the axis letter associated to your printer's extruder "
"(usually E but some printers use A)."
@@ -7723,28 +9581,28 @@ msgstr ""
"Use esta opção para definir a letra do eixo associada à extrusora da sua "
"impressora (geralmente E, mas algumas impressoras usam A)."
-#: src/libslic3r/PrintConfig.cpp:545
+#: src/libslic3r/PrintConfig.cpp:605
msgid "Extrusion multiplier"
msgstr "Multiplicador de extrusão"
-#: src/libslic3r/PrintConfig.cpp:546
+#: src/libslic3r/PrintConfig.cpp:606
msgid ""
"This factor changes the amount of flow proportionally. You may need to tweak "
-"this setting to get nice surface finish and correct single wall widths. "
-"Usual values are between 0.9 and 1.1. If you think you need to change this "
-"more, check filament diameter and your firmware E steps."
+"this setting to get nice surface finish and correct single wall widths. Usual "
+"values are between 0.9 and 1.1. If you think you need to change this more, "
+"check filament diameter and your firmware E steps."
msgstr ""
-"Esse fator altera a quantidade de fluxo proporcionalmente. Você pode "
-"precisar de ajustar esta config. para obter acabamento de superfície "
-"agradável e corrigir larguras de parede única. Os valores usuais são entre "
-"0,9 e 1,1. Se você acha que precisa mudar isso mais, verifique o diâmetro do "
-"filamento e os passos configurados no firmware da extrusora."
+"Esse fator altera a quantidade de fluxo proporcionalmente. Você pode precisar "
+"de ajustar esta config. para obter acabamento de superfície agradável e "
+"corrigir larguras de parede única. Os valores usuais são entre 0,9 e 1,1. Se "
+"você acha que precisa mudar isso mais, verifique o diâmetro do filamento e os "
+"passos configurados no firmware da extrusora."
-#: src/libslic3r/PrintConfig.cpp:554
+#: src/libslic3r/PrintConfig.cpp:615
msgid "Default extrusion width"
msgstr "Largura de extrusão padrão"
-#: src/libslic3r/PrintConfig.cpp:556
+#: src/libslic3r/PrintConfig.cpp:617
msgid ""
"Set this to a non-zero value to allow a manual extrusion width. If left to "
"zero, Slic3r derives extrusion widths from the nozzle diameter (see the "
@@ -7754,28 +9612,28 @@ msgid ""
msgstr ""
"Defina isso como um valor diferente de zero para permitir uma largura de "
"extrusão manual. Se deixado a zero, Slic3r deriva larguras da extrusão do "
-"diâmetro da ponteira (veja as dicas ferramentas para a largura da extrusão "
-"do perímetro, a largura de extrusão do preenchimento etc.). Se expresso como "
+"diâmetro da ponteira (veja as dicas ferramentas para a largura da extrusão do "
+"perímetro, a largura de extrusão do preenchimento etc.). Se expresso como "
"porcentagem (por exemplo: 230%), ele será calculado sobre a altura da camada."
-#: src/libslic3r/PrintConfig.cpp:566
+#: src/libslic3r/PrintConfig.cpp:628
msgid "Keep fan always on"
msgstr "Mantenha a ventoinha sempre ligada"
-#: src/libslic3r/PrintConfig.cpp:567
+#: src/libslic3r/PrintConfig.cpp:629
msgid ""
"If this is enabled, fan will never be disabled and will be kept running at "
"least at its minimum speed. Useful for PLA, harmful for ABS."
msgstr ""
"Se isso estiver ativado, a ventoinha nunca será desativada e será mantida "
-"funcionando pelo menos em sua velocidade mínima. Útil para o PLA, "
-"prejudicial para o ABS."
+"funcionando pelo menos em sua velocidade mínima. Útil para o PLA, prejudicial "
+"para o ABS."
-#: src/libslic3r/PrintConfig.cpp:572
+#: src/libslic3r/PrintConfig.cpp:634
msgid "Enable fan if layer print time is below"
msgstr "Ative o ventoinha se o tempo de impressão da camada estiver abaixo"
-#: src/libslic3r/PrintConfig.cpp:573
+#: src/libslic3r/PrintConfig.cpp:635
msgid ""
"If layer print time is estimated below this number of seconds, fan will be "
"enabled and its speed will be calculated by interpolating the minimum and "
@@ -7785,23 +9643,27 @@ msgstr ""
"segundos, a ventoinha será ativada e sua velocidade será calculada "
"interpolando as velocidades mínima e máxima."
-#: src/libslic3r/PrintConfig.cpp:575 src/libslic3r/PrintConfig.cpp:1708
+#: src/libslic3r/PrintConfig.cpp:637 src/libslic3r/PrintConfig.cpp:1908
msgid "approximate seconds"
msgstr "segundos aproximados"
-#: src/libslic3r/PrintConfig.cpp:588
+#: src/libslic3r/PrintConfig.cpp:644
+msgid "Color"
+msgstr "Cor"
+
+#: src/libslic3r/PrintConfig.cpp:650
msgid "Filament notes"
msgstr "Notas de filamento"
-#: src/libslic3r/PrintConfig.cpp:589
+#: src/libslic3r/PrintConfig.cpp:651
msgid "You can put your notes regarding the filament here."
msgstr "Você pode colocar suas anotações sobre o filamento aqui."
-#: src/libslic3r/PrintConfig.cpp:597 src/libslic3r/PrintConfig.cpp:1247
+#: src/libslic3r/PrintConfig.cpp:659 src/libslic3r/PrintConfig.cpp:1455
msgid "Max volumetric speed"
msgstr "Máxima velocidade volumétrica"
-#: src/libslic3r/PrintConfig.cpp:598
+#: src/libslic3r/PrintConfig.cpp:660
msgid ""
"Maximum volumetric speed allowed for this filament. Limits the maximum "
"volumetric speed of a print to the minimum of print and filament volumetric "
@@ -7811,27 +9673,27 @@ msgstr ""
"velocidade volumétrica máxima de uma impressão ao mínimo de velocidade "
"volumétrica de impressão e de filamento. Defina como zero para nenhum limite."
-#: src/libslic3r/PrintConfig.cpp:607
+#: src/libslic3r/PrintConfig.cpp:669
msgid "Loading speed"
msgstr "Velocidade de carregamento"
-#: src/libslic3r/PrintConfig.cpp:608
+#: src/libslic3r/PrintConfig.cpp:670
msgid "Speed used for loading the filament on the wipe tower."
msgstr "Velocidade utilizada para carregar o filamento na torre de limpeza."
-#: src/libslic3r/PrintConfig.cpp:615
+#: src/libslic3r/PrintConfig.cpp:677
msgid "Loading speed at the start"
msgstr "Velocidade de carregamento no início"
-#: src/libslic3r/PrintConfig.cpp:616
+#: src/libslic3r/PrintConfig.cpp:678
msgid "Speed used at the very beginning of loading phase."
msgstr "Velocidade utilizada no início da fase de carregamento."
-#: src/libslic3r/PrintConfig.cpp:623
+#: src/libslic3r/PrintConfig.cpp:685
msgid "Unloading speed"
msgstr "Velocidade de descarregamento"
-#: src/libslic3r/PrintConfig.cpp:624
+#: src/libslic3r/PrintConfig.cpp:686
msgid ""
"Speed used for unloading the filament on the wipe tower (does not affect "
"initial part of unloading just after ramming)."
@@ -7839,106 +9701,105 @@ msgstr ""
"Velocidade utilizada para descarregar o filamento na torre de limpeza (não "
"afeta a parte inicial do descarregamento logo após o Ramming)."
-#: src/libslic3r/PrintConfig.cpp:632
+#: src/libslic3r/PrintConfig.cpp:694
msgid "Unloading speed at the start"
msgstr "Velocidade de descarregamento no início"
-#: src/libslic3r/PrintConfig.cpp:633
+#: src/libslic3r/PrintConfig.cpp:695
msgid ""
"Speed used for unloading the tip of the filament immediately after ramming."
msgstr ""
"Velocidade usada para descarregar a ponta do filamento imediatamente após o "
"Ramming."
-#: src/libslic3r/PrintConfig.cpp:640
+#: src/libslic3r/PrintConfig.cpp:702
msgid "Delay after unloading"
msgstr "Atraso após o descarregamento"
-#: src/libslic3r/PrintConfig.cpp:641
+#: src/libslic3r/PrintConfig.cpp:703
msgid ""
"Time to wait after the filament is unloaded. May help to get reliable "
"toolchanges with flexible materials that may need more time to shrink to "
"original dimensions."
msgstr ""
-"Tempo de espera após o filamento ser descarregado. Pode ajudar a obter "
-"trocas de ferramenta confiáveis com materiais flexíveis que podem precisar "
-"de mais tempo para reduzir as dimensões originais."
+"Tempo de espera após o filamento ser descarregado. Pode ajudar a obter trocas "
+"de ferramenta confiáveis com materiais flexíveis que podem precisar de mais "
+"tempo para reduzir as dimensões originais."
-#: src/libslic3r/PrintConfig.cpp:650
+#: src/libslic3r/PrintConfig.cpp:712
msgid "Number of cooling moves"
msgstr "Número de movimentos de resfriamento"
-#: src/libslic3r/PrintConfig.cpp:651
+#: src/libslic3r/PrintConfig.cpp:713
msgid ""
-"Filament is cooled by being moved back and forth in the cooling tubes. "
-"Specify desired number of these moves."
+"Filament is cooled by being moved back and forth in the cooling tubes. Specify "
+"desired number of these moves."
msgstr ""
"O filamento é resfriado por ser movido para frente e para trás nos tubos de "
"resfriamento. Especifique o número desejado desses movimentos."
-#: src/libslic3r/PrintConfig.cpp:659
+#: src/libslic3r/PrintConfig.cpp:721
msgid "Speed of the first cooling move"
msgstr "Velocidade do primeiro movimento de resfriamento"
-#: src/libslic3r/PrintConfig.cpp:660
+#: src/libslic3r/PrintConfig.cpp:722
msgid "Cooling moves are gradually accelerating beginning at this speed."
msgstr ""
"Movimentos de resfriamento estão gradualmente acelerando a partir desta "
"velocidade."
-#: src/libslic3r/PrintConfig.cpp:667
+#: src/libslic3r/PrintConfig.cpp:729
msgid "Minimal purge on wipe tower"
msgstr "Remoção mínima na torre da limpeza"
-#: src/libslic3r/PrintConfig.cpp:668
+#: src/libslic3r/PrintConfig.cpp:730
msgid ""
"After a tool change, the exact position of the newly loaded filament inside "
"the nozzle may not be known, and the filament pressure is likely not yet "
-"stable. Before purging the print head into an infill or a sacrificial "
-"object, Slic3r will always prime this amount of material into the wipe tower "
-"to produce successive infill or sacrificial object extrusions reliably."
+"stable. Before purging the print head into an infill or a sacrificial object, "
+"Slic3r will always prime this amount of material into the wipe tower to "
+"produce successive infill or sacrificial object extrusions reliably."
msgstr ""
"Após uma mudança da ferramenta, a posição exata do filamento recentemente "
-"carregado dentro da ponteira pode não ser conhecida, e a pressão do "
-"filamento provavelmente ainda não esteja estável. Antes de purgar a cabeça "
-"de impressão em um preenchimento ou um objeto sacrificial, Slic3r sempre "
-"Prime esta quantidade de material para a torre de limpeza para produzir "
-"sucessivas preenchimento ou sacrificial objeto extrusões de forma confiável."
+"carregado dentro da ponteira pode não ser conhecida, e a pressão do filamento "
+"provavelmente ainda não esteja estável. Antes de purgar a cabeça de impressão "
+"em um preenchimento ou um objeto sacrificial, Slic3r sempre Prime esta "
+"quantidade de material para a torre de limpeza para produzir sucessivas "
+"preenchimento ou sacrificial objeto extrusões de forma confiável."
-#: src/libslic3r/PrintConfig.cpp:672
+#: src/libslic3r/PrintConfig.cpp:734
msgid "mm³"
msgstr "mm³"
-#: src/libslic3r/PrintConfig.cpp:678
+#: src/libslic3r/PrintConfig.cpp:740
msgid "Speed of the last cooling move"
msgstr "Velocidade do último movimento de resfriamento"
-#: src/libslic3r/PrintConfig.cpp:679
+#: src/libslic3r/PrintConfig.cpp:741
msgid "Cooling moves are gradually accelerating towards this speed."
msgstr ""
-"Movimentos de resfriamento estão gradualmente acelerando para esta "
-"velocidade."
+"Movimentos de resfriamento estão gradualmente acelerando para esta velocidade."
-#: src/libslic3r/PrintConfig.cpp:686
+#: src/libslic3r/PrintConfig.cpp:748
msgid "Filament load time"
msgstr "Tempo de carga do filamento"
-#: src/libslic3r/PrintConfig.cpp:687
+#: src/libslic3r/PrintConfig.cpp:749
msgid ""
"Time for the printer firmware (or the Multi Material Unit 2.0) to load a new "
-"filament during a tool change (when executing the T code). This time is "
-"added to the total print time by the G-code time estimator."
+"filament during a tool change (when executing the T code). This time is added "
+"to the total print time by the G-code time estimator."
msgstr ""
"Tempo para o firmware da impressora (ou a Multi Material Unit 2.0 para "
"carregar um novo filamento durante uma mudança de ferramenta (ao executar o "
-"código T). Esse tempo é adicionado ao tempo total de impressão pelo "
-"estimador de tempo do G-code."
+"código T). Esse tempo é adicionado ao tempo total de impressão pelo estimador "
+"de tempo do G-code."
-#: src/libslic3r/PrintConfig.cpp:694
+#: src/libslic3r/PrintConfig.cpp:756
msgid "Ramming parameters"
msgstr "Parâmetros de Ramming"
-#: src/libslic3r/PrintConfig.cpp:695
+#: src/libslic3r/PrintConfig.cpp:757
msgid ""
"This string is edited by RammingDialog and contains ramming specific "
"parameters."
@@ -7946,152 +9807,179 @@ msgstr ""
"Essa cadeia de caracteres é editada por rammingdialog e contém parâmetros "
"específicos de Ramming."
-#: src/libslic3r/PrintConfig.cpp:701
+#: src/libslic3r/PrintConfig.cpp:763
msgid "Filament unload time"
msgstr "Tempo de descarregamento do filamento"
-#: src/libslic3r/PrintConfig.cpp:702
+#: src/libslic3r/PrintConfig.cpp:764
msgid ""
"Time for the printer firmware (or the Multi Material Unit 2.0) to unload a "
-"filament during a tool change (when executing the T code). This time is "
-"added to the total print time by the G-code time estimator."
+"filament during a tool change (when executing the T code). This time is added "
+"to the total print time by the G-code time estimator."
msgstr ""
-"Tempo para o firmware da impressora (ou a unidade de material multi 2,0) "
-"para descarregar um filamento durante uma mudança de ferramenta (ao executar "
-"o código T). Esse tempo é adicionado ao tempo total de impressão pelo "
-"estimador de tempo do G-code."
+"Tempo para o firmware da impressora (ou a unidade de material multi 2,0) para "
+"descarregar um filamento durante uma mudança de ferramenta (ao executar o "
+"código T). Esse tempo é adicionado ao tempo total de impressão pelo estimador "
+"de tempo do G-code."
-#: src/libslic3r/PrintConfig.cpp:710
+#: src/libslic3r/PrintConfig.cpp:772
msgid ""
"Enter your filament diameter here. Good precision is required, so use a "
"caliper and do multiple measurements along the filament, then compute the "
"average."
msgstr ""
"Insira o diâmetro do filamento aqui. Boa precisão é necessária, então use um "
-"paquímetro e fazer várias medições ao longo do filamento, em seguida, "
-"calcular a média."
+"paquímetro e fazer várias medições ao longo do filamento, em seguida, calcular "
+"a média."
-#: src/libslic3r/PrintConfig.cpp:717 src/libslic3r/PrintConfig.cpp:2503
-#: src/libslic3r/PrintConfig.cpp:2504
+#: src/libslic3r/PrintConfig.cpp:779 src/libslic3r/PrintConfig.cpp:2731
+#: src/libslic3r/PrintConfig.cpp:2732
msgid "Density"
msgstr "Densidade"
-#: src/libslic3r/PrintConfig.cpp:718
+#: src/libslic3r/PrintConfig.cpp:780
msgid ""
-"Enter your filament density here. This is only for statistical information. "
-"A decent way is to weigh a known length of filament and compute the ratio of "
-"the length to volume. Better is to calculate the volume directly through "
+"Enter your filament density here. This is only for statistical information. A "
+"decent way is to weigh a known length of filament and compute the ratio of the "
+"length to volume. Better is to calculate the volume directly through "
"displacement."
msgstr ""
"Insira sua densidade de filamento aqui. Isto é apenas para informação "
-"estatística. Uma maneira decente é pesar um comprimento conhecido do "
-"filamento e computar a relação do comprimento ao volume. Melhor é calcular o "
-"volume diretamente através do deslocamento."
+"estatística. Uma maneira decente é pesar um comprimento conhecido do filamento "
+"e computar a relação do comprimento ao volume. Melhor é calcular o volume "
+"diretamente através do deslocamento."
-#: src/libslic3r/PrintConfig.cpp:721
+#: src/libslic3r/PrintConfig.cpp:783
msgid "g/cm³"
msgstr "g/cm³"
-#: src/libslic3r/PrintConfig.cpp:726
+#: src/libslic3r/PrintConfig.cpp:788
msgid "Filament type"
msgstr "Tipo de filamento"
-#: src/libslic3r/PrintConfig.cpp:727
+#: src/libslic3r/PrintConfig.cpp:789
msgid "The filament material type for use in custom G-codes."
msgstr "O tipo de material de filamento para uso em G-code customizados."
-#: src/libslic3r/PrintConfig.cpp:754
+#: src/libslic3r/PrintConfig.cpp:816
msgid "Soluble material"
msgstr "Material solúvel"
-#: src/libslic3r/PrintConfig.cpp:755
+#: src/libslic3r/PrintConfig.cpp:817
msgid "Soluble material is most likely used for a soluble support."
msgstr "O material solúvel é mais provável usado para um suporte solúvel."
-#: src/libslic3r/PrintConfig.cpp:761
+#: src/libslic3r/PrintConfig.cpp:823
msgid ""
-"Enter your filament cost per kg here. This is only for statistical "
-"information."
+"Enter your filament cost per kg here. This is only for statistical information."
msgstr ""
"Insira o seu custo de filamento por kg aqui. Isto é apenas para informação "
"estatística."
-#: src/libslic3r/PrintConfig.cpp:762
+#: src/libslic3r/PrintConfig.cpp:824
msgid "money/kg"
msgstr "dinheiro/kg"
-#: src/libslic3r/PrintConfig.cpp:771 src/libslic3r/PrintConfig.cpp:2587
+#: src/libslic3r/PrintConfig.cpp:829
+msgid "Spool weight"
+msgstr "Peso do carretel"
+
+#: src/libslic3r/PrintConfig.cpp:830
+msgid ""
+"Enter weight of the empty filament spool. One may weigh a partially consumed "
+"filament spool before printing and one may compare the measured weight with "
+"the calculated weight of the filament with the spool to find out whether the "
+"amount of filament on the spool is sufficient to finish the print."
+msgstr ""
+"Insira o peso do carretel de filamento vazio. Pode-se pesar um carretel de "
+"filamento parcialmente consumido antes de imprimir e pode-se comparar o peso "
+"medido com o peso calculado do filamento com o carretel para descobrir se a "
+"quantidade de filamento no carretel é suficiente para terminar a impressão."
+
+#: src/libslic3r/PrintConfig.cpp:834
+msgid "g"
+msgstr "g"
+
+#: src/libslic3r/PrintConfig.cpp:843 src/libslic3r/PrintConfig.cpp:2815
msgid "(Unknown)"
msgstr "(Desconhecido)"
-#: src/libslic3r/PrintConfig.cpp:775
+#: src/libslic3r/PrintConfig.cpp:847
msgid "Fill angle"
msgstr "Ângulo de preenchimento"
-#: src/libslic3r/PrintConfig.cpp:777
+#: src/libslic3r/PrintConfig.cpp:849
msgid ""
"Default base angle for infill orientation. Cross-hatching will be applied to "
-"this. Bridges will be infilled using the best direction Slic3r can detect, "
-"so this setting does not affect them."
+"this. Bridges will be infilled using the best direction Slic3r can detect, so "
+"this setting does not affect them."
msgstr ""
"Ângulo padrão para a orientação de preenchimento. A hachura cruzada será "
-"aplicada a isso. Pontes serão preenchidas usando a melhor direção Slic3r "
-"pode detectar, portanto, essa config. não vai afeta-los."
+"aplicada a isso. Pontes serão preenchidas usando a melhor direção Slic3r pode "
+"detectar, portanto, essa config. não vai afeta-los."
-#: src/libslic3r/PrintConfig.cpp:789
+#: src/libslic3r/PrintConfig.cpp:861
msgid "Fill density"
msgstr "Densidade de preenchimento"
-#: src/libslic3r/PrintConfig.cpp:791
+#: src/libslic3r/PrintConfig.cpp:863
msgid "Density of internal infill, expressed in the range 0% - 100%."
msgstr "Densidade de preenchimento interno, expresso na faixa de 0%-100%."
-#: src/libslic3r/PrintConfig.cpp:826
+#: src/libslic3r/PrintConfig.cpp:898
msgid "Fill pattern"
msgstr "Padrão de preenchimento"
-#: src/libslic3r/PrintConfig.cpp:828
+#: src/libslic3r/PrintConfig.cpp:900
msgid "Fill pattern for general low-density infill."
msgstr "Padrão de preenchimento para preenchimento de baixa densidade."
-#: src/libslic3r/PrintConfig.cpp:844
+#: src/libslic3r/PrintConfig.cpp:920
msgid "Grid"
msgstr "Grade"
-#: src/libslic3r/PrintConfig.cpp:845
+#: src/libslic3r/PrintConfig.cpp:921
msgid "Triangles"
msgstr "Triângulos"
-#: src/libslic3r/PrintConfig.cpp:846
+#: src/libslic3r/PrintConfig.cpp:922
msgid "Stars"
msgstr "Estrelas"
-#: src/libslic3r/PrintConfig.cpp:847
+#: src/libslic3r/PrintConfig.cpp:923
msgid "Cubic"
msgstr "Cúbico"
-#: src/libslic3r/PrintConfig.cpp:848
+#: src/libslic3r/PrintConfig.cpp:924
msgid "Line"
msgstr "Linha"
-#: src/libslic3r/PrintConfig.cpp:850 src/libslic3r/PrintConfig.cpp:2011
+#: src/libslic3r/PrintConfig.cpp:926 src/libslic3r/PrintConfig.cpp:2238
msgid "Honeycomb"
msgstr "Hexágono"
-#: src/libslic3r/PrintConfig.cpp:851
+#: src/libslic3r/PrintConfig.cpp:927
msgid "3D Honeycomb"
msgstr "Hexágono 3D"
-#: src/libslic3r/PrintConfig.cpp:852
+#: src/libslic3r/PrintConfig.cpp:928
msgid "Gyroid"
msgstr "Giróide"
-#: src/libslic3r/PrintConfig.cpp:859 src/libslic3r/PrintConfig.cpp:868
-#: src/libslic3r/PrintConfig.cpp:876 src/libslic3r/PrintConfig.cpp:910
+#: src/libslic3r/PrintConfig.cpp:932
+msgid "Adaptive Cubic"
+msgstr "Adaptativo"
+
+#: src/libslic3r/PrintConfig.cpp:933
+msgid "Support Cubic"
+msgstr "Pilar de suporte"
+
+#: src/libslic3r/PrintConfig.cpp:937 src/libslic3r/PrintConfig.cpp:946
+#: src/libslic3r/PrintConfig.cpp:956 src/libslic3r/PrintConfig.cpp:990
msgid "First layer"
msgstr "Primeira camada"
-#: src/libslic3r/PrintConfig.cpp:860
+#: src/libslic3r/PrintConfig.cpp:938
msgid ""
"This is the acceleration your printer will use for first layer. Set zero to "
"disable acceleration control for first layer."
@@ -8099,7 +9987,11 @@ msgstr ""
"Esta é a aceleração que sua impressora usará para a primeira camada. Defina "
"zero para desabilitar o controle de aceleração para a primeira camada."
-#: src/libslic3r/PrintConfig.cpp:869
+#: src/libslic3r/PrintConfig.cpp:947
+msgid "First layer bed temperature"
+msgstr "Velocidade da primeira camada"
+
+#: src/libslic3r/PrintConfig.cpp:948
msgid ""
"Heated build plate temperature for the first layer. Set this to zero to "
"disable bed temperature control commands in the output."
@@ -8107,12 +9999,12 @@ msgstr ""
"Temperatura da mesa aquecida para a primeira camada. Defina isso como zero "
"para desabilitar os comandos de controle de temperatura da mesa na saída."
-#: src/libslic3r/PrintConfig.cpp:878
+#: src/libslic3r/PrintConfig.cpp:958
msgid ""
-"Set this to a non-zero value to set a manual extrusion width for first "
-"layer. You can use this to force fatter extrudates for better adhesion. If "
-"expressed as percentage (for example 120%) it will be computed over first "
-"layer height. If set to zero, it will use the default extrusion width."
+"Set this to a non-zero value to set a manual extrusion width for first layer. "
+"You can use this to force fatter extrudates for better adhesion. If expressed "
+"as percentage (for example 120%) it will be computed over first layer height. "
+"If set to zero, it will use the default extrusion width."
msgstr ""
"Defina isso como um valor diferente de zero para definir uma largura de "
"extrusão manual para a primeira camada. Você pode usar este para forçar "
@@ -8120,7 +10012,7 @@ msgstr ""
"exemplo, 120%) será computado sobre a primeira altura da camada. Se definido "
"como zero, ele usará a largura de extrusão padrão."
-#: src/libslic3r/PrintConfig.cpp:891
+#: src/libslic3r/PrintConfig.cpp:971
msgid ""
"When printing with very low layer heights, you might still want to print a "
"thicker bottom layer to improve adhesion and tolerance for non perfect build "
@@ -8128,37 +10020,58 @@ msgid ""
"example: 150%) over the default layer height."
msgstr ""
"Ao imprimir com alturas muito baixas da camada, você pode ainda querer "
-"imprimir uma camada inferior mais grossa para melhorar a adesão e a "
-"tolerância para mesas não perfeitas. Isso pode ser expresso como um valor "
-"absoluto ou como uma porcentagem (por exemplo: 150%) sobre a altura da "
-"camada padrão."
+"imprimir uma camada inferior mais grossa para melhorar a adesão e a tolerância "
+"para mesas não perfeitas. Isso pode ser expresso como um valor absoluto ou "
+"como uma porcentagem (por exemplo: 150%) sobre a altura da camada padrão."
-#: src/libslic3r/PrintConfig.cpp:900
+#: src/libslic3r/PrintConfig.cpp:980
msgid "First layer speed"
msgstr "Velocidade da primeira camada"
-#: src/libslic3r/PrintConfig.cpp:901
+#: src/libslic3r/PrintConfig.cpp:981
msgid ""
-"If expressed as absolute value in mm/s, this speed will be applied to all "
-"the print moves of the first layer, regardless of their type. If expressed "
-"as a percentage (for example: 40%) it will scale the default speeds."
+"If expressed as absolute value in mm/s, this speed will be applied to all the "
+"print moves of the first layer, regardless of their type. If expressed as a "
+"percentage (for example: 40%) it will scale the default speeds."
msgstr ""
-"Se expresso como valor absoluto em mm/s, esta velocidade será aplicada a "
-"todos os movimentos de impressão da primeira camada, independentemente do "
-"seu tipo. Se expresso em porcentagem(por exemplo: 40%) Ele dimensionará as "
-"velocidades padrão."
+"Se expresso como valor absoluto em mm/s, esta velocidade será aplicada a todos "
+"os movimentos de impressão da primeira camada, independentemente do seu tipo. "
+"Se expresso em porcentagem(por exemplo: 40%) Ele dimensionará as velocidades "
+"padrão."
-#: src/libslic3r/PrintConfig.cpp:911
+#: src/libslic3r/PrintConfig.cpp:991
+msgid "First layer nozzle temperature"
+msgstr "Temperatura do bico da primeira camada"
+
+#: src/libslic3r/PrintConfig.cpp:992
msgid ""
-"Extruder temperature for first layer. If you want to control temperature "
+"Nozzle temperature for the first layer. If you want to control temperature "
"manually during print, set this to zero to disable temperature control "
-"commands in the output file."
+"commands in the output G-code."
msgstr ""
-"Temperatura da extrusora para a primeira camada. Se você quiser controlar a "
+"Temperatura do bico para a primeira camada. Se você quiser controlar a "
"temperatura manualmente durante a impressão, defina isso como zero para "
-"desabilitar os comandos de controle de temperatura no arquivo de saída."
+"desabilitar os comandos de controle no arquivo de saída G-code."
-#: src/libslic3r/PrintConfig.cpp:920
+#: src/libslic3r/PrintConfig.cpp:1000
+msgid "Full fan speed at layer"
+msgstr "Velocidade total da ventoinha na camada"
+
+#: src/libslic3r/PrintConfig.cpp:1001
+msgid ""
+"Fan speed will be ramped up linearly from zero at layer "
+"\"disable_fan_first_layers\" to maximum at layer \"full_fan_speed_layer\". "
+"\"full_fan_speed_layer\" will be ignored if lower than "
+"\"disable_fan_first_layers\", in which case the fan will be running at maximum "
+"allowed speed at layer \"disable_fan_first_layers\" + 1."
+msgstr ""
+"A velocidade do ventilador será aumentada linearmente de zero na camada "
+"\"disable_fan_first_layers\" para o máximo na camada \"full_fan_speed_layer\". "
+"\"full_fan_speed_layer\" será ignorado se for inferior a "
+"\"disable_fan_first_layers\", caso em que o ventilador estará funcionando na "
+"velocidade máxima permitida na camada \"disable_fan_first_layers\" + 1."
+
+#: src/libslic3r/PrintConfig.cpp:1013
msgid ""
"Speed for filling small gaps using short zigzag moves. Keep this reasonably "
"low to avoid too much shaking and resonance issues. Set zero to disable gaps "
@@ -8169,107 +10082,170 @@ msgstr ""
"problemas de ressonância. Defina zero para desabilitar o preenchimento de "
"lacunas."
-#: src/libslic3r/PrintConfig.cpp:928
+#: src/libslic3r/PrintConfig.cpp:1021
msgid "Verbose G-code"
msgstr "Gcode detalhado"
-#: src/libslic3r/PrintConfig.cpp:929
+#: src/libslic3r/PrintConfig.cpp:1022
msgid ""
"Enable this to get a commented G-code file, with each line explained by a "
-"descriptive text. If you print from SD card, the additional weight of the "
-"file could make your firmware slow down."
+"descriptive text. If you print from SD card, the additional weight of the file "
+"could make your firmware slow down."
msgstr ""
"Habilite isso para obter um arquivo de G-code comentado, com cada linha "
"explicada por um texto descritivo. Se você imprimir a partir do cartão SD, o "
"peso adicional do arquivo pode fazer o seu firmware ficar mais lento."
-#: src/libslic3r/PrintConfig.cpp:936
+#: src/libslic3r/PrintConfig.cpp:1029
msgid "G-code flavor"
msgstr "Tipo de G-code"
-#: src/libslic3r/PrintConfig.cpp:937
+#: src/libslic3r/PrintConfig.cpp:1030
msgid ""
"Some G/M-code commands, including temperature control and others, are not "
"universal. Set this option to your printer's firmware to get a compatible "
"output. The \"No extrusion\" flavor prevents PrusaSlicer from exporting any "
"extrusion value at all."
msgstr ""
-"Alguns comandos G/M-code, incluindo controle de temperatura e outros, não "
-"são universais. Defina esta opção para o firmware da impressora para obter "
-"uma saída compatível. O \"sem extrusão\" tipo impede PrusaSlicer de exportar "
+"Alguns comandos G/M-code, incluindo controle de temperatura e outros, não são "
+"universais. Defina esta opção para o firmware da impressora para obter uma "
+"saída compatível. O \"sem extrusão\" tipo impede PrusaSlicer de exportar "
"qualquer valor de extrusão em tudo."
-#: src/libslic3r/PrintConfig.cpp:960
+#: src/libslic3r/PrintConfig.cpp:1055
msgid "No extrusion"
msgstr "Sem extrusão"
-#: src/libslic3r/PrintConfig.cpp:965
+#: src/libslic3r/PrintConfig.cpp:1060
msgid "Label objects"
msgstr "Rotular objetos"
-#: src/libslic3r/PrintConfig.cpp:966
+#: src/libslic3r/PrintConfig.cpp:1061
msgid ""
"Enable this to add comments into the G-Code labeling print moves with what "
-"object they belong to, which is useful for the Octoprint CancelObject "
-"plugin. This settings is NOT compatible with Single Extruder Multi Material "
-"setup and Wipe into Object / Wipe into Infill."
+"object they belong to, which is useful for the Octoprint CancelObject plugin. "
+"This settings is NOT compatible with Single Extruder Multi Material setup and "
+"Wipe into Object / Wipe into Infill."
msgstr ""
"Habilite isso para adicionar comentários aos movimentos de impressão de "
"rotulagem do G-code com o objeto ao qual eles pertencem, o que é útil para o "
-"plugin Octoprint CancelObject. Essas config. não são compatíveis com a "
-"config. de multi material de extrusora única e limpe em objeto/limpar em "
-"preenchimento."
+"plugin Octoprint CancelObject. Essas config. não são compatíveis com a config. "
+"de multi material de extrusora única e limpe em objeto/limpar em preenchimento."
-#: src/libslic3r/PrintConfig.cpp:973
+#: src/libslic3r/PrintConfig.cpp:1068
msgid "High extruder current on filament swap"
msgstr "Corrente elevada da extrusora na troca do filamento"
-#: src/libslic3r/PrintConfig.cpp:974
+#: src/libslic3r/PrintConfig.cpp:1069
msgid ""
"It may be beneficial to increase the extruder motor current during the "
"filament exchange sequence to allow for rapid ramming feed rates and to "
"overcome resistance when loading a filament with an ugly shaped tip."
msgstr ""
"Pode ser benéfico aumentar a corrente do motor da extrusora durante a "
-"seqüência da troca do filamento para permitir taxas de alimentação de "
-"Ramming rápidas e para superar a resistência ao carregar um filamento com "
-"uma ponta feia."
+"seqüência da troca do filamento para permitir taxas de alimentação de Ramming "
+"rápidas e para superar a resistência ao carregar um filamento com uma ponta "
+"feia."
-#: src/libslic3r/PrintConfig.cpp:982
+#: src/libslic3r/PrintConfig.cpp:1077
msgid ""
-"This is the acceleration your printer will use for infill. Set zero to "
-"disable acceleration control for infill."
+"This is the acceleration your printer will use for infill. Set zero to disable "
+"acceleration control for infill."
msgstr ""
"Esta é a aceleração que sua impressora usará para preenchimento. Defina zero "
"para desabilitar o controle de aceleração para preenchimento."
-#: src/libslic3r/PrintConfig.cpp:990
+#: src/libslic3r/PrintConfig.cpp:1085
msgid "Combine infill every"
msgstr "Combine preenchimento a cada"
-#: src/libslic3r/PrintConfig.cpp:992
+#: src/libslic3r/PrintConfig.cpp:1087
msgid ""
"This feature allows to combine infill and speed up your print by extruding "
"thicker infill layers while preserving thin perimeters, thus accuracy."
msgstr ""
"Este recurso permite combinar preenchimento e acelerar a sua impressão por "
-"extrusão camadas de preenchimento mais espessa, preservando perímetros "
-"finos, assim, a precisão."
+"extrusão camadas de preenchimento mais espessa, preservando perímetros finos, "
+"assim, a precisão."
-#: src/libslic3r/PrintConfig.cpp:995
+#: src/libslic3r/PrintConfig.cpp:1090
msgid "Combine infill every n layers"
msgstr "Combine preenchimento cada n camadas"
-#: src/libslic3r/PrintConfig.cpp:1001
+#: src/libslic3r/PrintConfig.cpp:1096
+msgid "Length of the infill anchor"
+msgstr "Comprimento da âncora de preenchimento"
+
+#: src/libslic3r/PrintConfig.cpp:1098
+msgid ""
+"Connect an infill line to an internal perimeter with a short segment of an "
+"additional perimeter. If expressed as percentage (example: 15%) it is "
+"calculated over infill extrusion width. PrusaSlicer tries to connect two close "
+"infill lines to a short perimeter segment. If no such perimeter segment "
+"shorter than infill_anchor_max is found, the infill line is connected to a "
+"perimeter segment at just one side and the length of the perimeter segment "
+"taken is limited to this parameter, but no longer than anchor_length_max. Set "
+"this parameter to zero to disable anchoring perimeters connected to a single "
+"infill line."
+msgstr ""
+"Conecte uma linha de preenchimento a um perímetro interno com um segmento "
+"curto de um perímetro adicional. Se expresso como porcentagem (exemplo: 15%), "
+"é calculado sobre a largura de extrusão do enchimento. PrusaSlicer tenta "
+"conectar duas linhas de preenchimento próximas a um segmento de perímetro "
+"curto. Se nenhum segmento de perímetro menor que infill_anchor_max for "
+"encontrado, a linha de preenchimento é conectada a um segmento de perímetro em "
+"apenas um lado e o comprimento do segmento de perímetro tomado é limitado a "
+"este parâmetro, mas não mais longo que anchor_length_max. Defina este "
+"parâmetro como zero para desativar os perímetros de ancoragem conectados a uma "
+"única linha de enchimento."
+
+#: src/libslic3r/PrintConfig.cpp:1113
+msgid "0 (no open anchors)"
+msgstr "0 (sem âncoras abertas)"
+
+#: src/libslic3r/PrintConfig.cpp:1118 src/libslic3r/PrintConfig.cpp:1140
+msgid "1000 (unlimited)"
+msgstr "1000 (ilimitado)"
+
+#: src/libslic3r/PrintConfig.cpp:1123
+msgid "Maximum length of the infill anchor"
+msgstr "Comprimento máximo da âncora de preenchimento"
+
+#: src/libslic3r/PrintConfig.cpp:1125
+msgid ""
+"Connect an infill line to an internal perimeter with a short segment of an "
+"additional perimeter. If expressed as percentage (example: 15%) it is "
+"calculated over infill extrusion width. PrusaSlicer tries to connect two close "
+"infill lines to a short perimeter segment. If no such perimeter segment "
+"shorter than this parameter is found, the infill line is connected to a "
+"perimeter segment at just one side and the length of the perimeter segment "
+"taken is limited to infill_anchor, but no longer than this parameter. Set this "
+"parameter to zero to disable anchoring."
+msgstr ""
+"Conecte uma linha de preenchimento a um perímetro interno com um segmento "
+"curto de um perímetro adicional. Se expresso como porcentagem (exemplo: 15%), "
+"é calculado sobre a largura de extrusão do enchimento. PrusaSlicer tenta "
+"conectar duas linhas de preenchimento próximas a um segmento de perímetro "
+"curto. Se nenhum segmento de perímetro mais curto do que este parâmetro for "
+"encontrado, a linha de preenchimento é conectada a um segmento de perímetro em "
+"apenas um lado e o comprimento do segmento de perímetro tomado é limitado a "
+"infill_anchor, mas não mais do que este parâmetro. Defina este parâmetro como "
+"zero para desativar a ancoragem."
+
+#: src/libslic3r/PrintConfig.cpp:1135
+msgid "0 (not anchored)"
+msgstr "0(não ancorado)"
+
+#: src/libslic3r/PrintConfig.cpp:1145
msgid "Infill extruder"
msgstr "Extrusora de preenchimento"
-#: src/libslic3r/PrintConfig.cpp:1003
+#: src/libslic3r/PrintConfig.cpp:1147
msgid "The extruder to use when printing infill."
msgstr ""
"A extrusora a ser utilizada quando estiver imprimindo preenchimento sólido."
-#: src/libslic3r/PrintConfig.cpp:1011
+#: src/libslic3r/PrintConfig.cpp:1155
msgid ""
"Set this to a non-zero value to set a manual extrusion width for infill. If "
"left zero, default extrusion width will be used if set, otherwise 1.125 x "
@@ -8278,17 +10254,17 @@ msgid ""
"example 90%) it will be computed over layer height."
msgstr ""
"Defina isso como um valor diferente de zero para definir uma largura de "
-"extrusão manual para preenchimento. Se for deixado zero, a largura de "
-"extrusão padrão será usada se definido, caso contrário, 1,125 x diâmetro da "
-"ponteira será usado. Você pode querer usar extrusora mais larga para "
-"acelerar o preenchimento e tornar suas peças mais fortes. Se expresso em "
-"porcentagem(por exemplo, 90%) Ele será calculado sobre a altura da camada."
+"extrusão manual para preenchimento. Se for deixado zero, a largura de extrusão "
+"padrão será usada se definido, caso contrário, 1,125 x diâmetro da ponteira "
+"será usado. Você pode querer usar extrusora mais larga para acelerar o "
+"preenchimento e tornar suas peças mais fortes. Se expresso em porcentagem(por "
+"exemplo, 90%) Ele será calculado sobre a altura da camada."
-#: src/libslic3r/PrintConfig.cpp:1021
+#: src/libslic3r/PrintConfig.cpp:1165
msgid "Infill before perimeters"
msgstr "Preenchimento antes dos perímetros"
-#: src/libslic3r/PrintConfig.cpp:1022
+#: src/libslic3r/PrintConfig.cpp:1166
msgid ""
"This option will switch the print order of perimeters and infill, making the "
"latter first."
@@ -8296,26 +10272,25 @@ msgstr ""
"Esta opção irá mudar a ordem de impressão de perímetros e preenchimento, "
"tornando o último primeiro."
-#: src/libslic3r/PrintConfig.cpp:1027
+#: src/libslic3r/PrintConfig.cpp:1171
msgid "Only infill where needed"
msgstr "Somente preenchimento onde necessário"
-#: src/libslic3r/PrintConfig.cpp:1029
+#: src/libslic3r/PrintConfig.cpp:1173
msgid ""
"This option will limit infill to the areas actually needed for supporting "
"ceilings (it will act as internal support material). If enabled, slows down "
"the G-code generation due to the multiple checks involved."
msgstr ""
"Esta opção limitará a preenchimento às áreas realmente necessárias para "
-"suportar tetos (atuará como o material de sustentação interno). Se "
-"habilitada, retarda a geração de G-code devido às várias verificações "
-"envolvidas."
+"suportar tetos (atuará como o material de sustentação interno). Se habilitada, "
+"retarda a geração de G-code devido às várias verificações envolvidas."
-#: src/libslic3r/PrintConfig.cpp:1036
+#: src/libslic3r/PrintConfig.cpp:1180
msgid "Infill/perimeters overlap"
msgstr "Sobreposição de preenchimento/perímetros"
-#: src/libslic3r/PrintConfig.cpp:1038
+#: src/libslic3r/PrintConfig.cpp:1182
msgid ""
"This setting applies an additional overlap between infill and perimeters for "
"better bonding. Theoretically this shouldn't be needed, but backlash might "
@@ -8323,230 +10298,297 @@ msgid ""
"perimeter extrusion width."
msgstr ""
"Esta config. aplica uma sobreposição adicional entre preenchimento e "
-"perímetros para melhor colagem. Teoricamente isso não deveria ser "
-"necessário, mas a folga pode causar lacunas. Se expresso em "
-"porcentagem(exemplo: 15%) é calculado sobre a largura da extrusão do "
-"perímetro."
+"perímetros para melhor colagem. Teoricamente isso não deveria ser necessário, "
+"mas a folga pode causar lacunas. Se expresso em porcentagem(exemplo: 15%) é "
+"calculado sobre a largura da extrusão do perímetro."
-#: src/libslic3r/PrintConfig.cpp:1049
+#: src/libslic3r/PrintConfig.cpp:1193
msgid "Speed for printing the internal fill. Set to zero for auto."
msgstr ""
"Velocidade para imprimir o preenchimento interno. Defina como zero para auto."
-#: src/libslic3r/PrintConfig.cpp:1057
+#: src/libslic3r/PrintConfig.cpp:1201
msgid "Inherits profile"
msgstr "Herda o perfil"
-#: src/libslic3r/PrintConfig.cpp:1058
+#: src/libslic3r/PrintConfig.cpp:1202
msgid "Name of the profile, from which this profile inherits."
msgstr "Nome do perfil, a partir do qual este perfil herda."
-#: src/libslic3r/PrintConfig.cpp:1071
+#: src/libslic3r/PrintConfig.cpp:1215
msgid "Interface shells"
-msgstr "Interface dos perímetros externos."
+msgstr "Interface dos perímetros externos"
-#: src/libslic3r/PrintConfig.cpp:1072
+#: src/libslic3r/PrintConfig.cpp:1216
msgid ""
"Force the generation of solid shells between adjacent materials/volumes. "
-"Useful for multi-extruder prints with translucent materials or manual "
-"soluble support material."
+"Useful for multi-extruder prints with translucent materials or manual soluble "
+"support material."
msgstr ""
"Force a geração de perímetros externos sólidas entre materiais/volumes "
-"adjacentes. Útil para cópias da multi-extrusora com materiais translúcidos "
-"ou material de sustentação solúvel manual."
+"adjacentes. Útil para cópias da multi-extrusora com materiais translúcidos ou "
+"material de sustentação solúvel manual."
+
+#: src/libslic3r/PrintConfig.cpp:1224
+msgid "Enable ironing"
+msgstr "Ativar passar ferro"
+
+#: src/libslic3r/PrintConfig.cpp:1225
+msgid ""
+"Enable ironing of the top layers with the hot print head for smooth surface"
+msgstr ""
+"Ative Passar Ferro nas camadas de topo com a cabeça de impressão a quente para "
+"uma superfície lisa"
+
+#: src/libslic3r/PrintConfig.cpp:1231 src/libslic3r/PrintConfig.cpp:1233
+msgid "Ironing Type"
+msgstr "Tipo de Passar Ferro"
+
+#: src/libslic3r/PrintConfig.cpp:1238
+msgid "All top surfaces"
+msgstr "Todas superfícies de topo"
+
+#: src/libslic3r/PrintConfig.cpp:1239
+msgid "Topmost surface only"
+msgstr "Apenas superfície superior"
+
+#: src/libslic3r/PrintConfig.cpp:1240
+msgid "All solid surfaces"
+msgstr "Todas superfícies sólidas"
+
+#: src/libslic3r/PrintConfig.cpp:1245
+msgid "Flow rate"
+msgstr "Fluxo"
+
+#: src/libslic3r/PrintConfig.cpp:1247
+msgid "Percent of a flow rate relative to object's normal layer height."
+msgstr ""
+"Porcentagem de uma taxa de fluxo em relação à altura normal da camada do "
+"objeto."
-#: src/libslic3r/PrintConfig.cpp:1081
+#: src/libslic3r/PrintConfig.cpp:1255
+msgid "Spacing between ironing passes"
+msgstr "Espaçamento entre passagem de ferro"
+
+#: src/libslic3r/PrintConfig.cpp:1257
+msgid "Distance between ironing lines"
+msgstr "Distância entre cópias"
+
+#: src/libslic3r/PrintConfig.cpp:1274
msgid ""
-"This custom code is inserted at every layer change, right after the Z move "
-"and before the extruder moves to the first layer point. Note that you can "
-"use placeholder variables for all Slic3r settings as well as [layer_num] and "
+"This custom code is inserted at every layer change, right after the Z move and "
+"before the extruder moves to the first layer point. Note that you can use "
+"placeholder variables for all Slic3r settings as well as [layer_num] and "
"[layer_z]."
msgstr ""
"Este código personalizado é inserido em cada mudança de camada, logo após o "
"movimento Z e antes que a extrusora se mova para o primeiro ponto de camada. "
-"Observe que você pode usar variáveis de espaço reservado para todas as "
-"config. Slic3r, bem como [layer_num] e [layer_z]."
+"Observe que você pode usar variáveis de espaço reservado para todas as config. "
+"Slic3r, bem como [layer_num] e [layer_z]."
-#: src/libslic3r/PrintConfig.cpp:1092
+#: src/libslic3r/PrintConfig.cpp:1285
msgid "Supports remaining times"
msgstr "Tempo de impressão restante"
-#: src/libslic3r/PrintConfig.cpp:1093
+#: src/libslic3r/PrintConfig.cpp:1286
msgid ""
-"Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute "
-"intervals into the G-code to let the firmware show accurate remaining time. "
-"As of now only the Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 "
-"firmware supports M73 Qxx Sxx for the silent mode."
+"Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute intervals "
+"into the G-code to let the firmware show accurate remaining time. As of now "
+"only the Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 firmware "
+"supports M73 Qxx Sxx for the silent mode."
msgstr ""
-"Emita M73 P [porcentagem impressa] R [tempo restante em minutos] em "
-"intervalos de 1 minuto no G-code para permitir que o firmware mostre o tempo "
-"restante exato. A partir de agora apenas o firmware Prusa i3 MK3 reconhece "
-"M73. Além disso, o firmware i3 MK3 suporta M73 QXX Sxx para o modo "
-"silencioso."
+"Emita M73 P [porcentagem impressa] R [tempo restante em minutos] em intervalos "
+"de 1 minuto no G-code para permitir que o firmware mostre o tempo restante "
+"exato. A partir de agora apenas o firmware Prusa i3 MK3 reconhece M73. Além "
+"disso, o firmware i3 MK3 suporta M73 QXX Sxx para o modo silencioso."
-#: src/libslic3r/PrintConfig.cpp:1101
+#: src/libslic3r/PrintConfig.cpp:1294
msgid "Supports stealth mode"
msgstr "Suporta o modo silencioso"
-#: src/libslic3r/PrintConfig.cpp:1102
+#: src/libslic3r/PrintConfig.cpp:1295
msgid "The firmware supports stealth mode"
msgstr "O firmware suporta o modo silencioso"
-#: src/libslic3r/PrintConfig.cpp:1125
+#: src/libslic3r/PrintConfig.cpp:1300
+msgid "How to apply limits"
+msgstr "Como aplicar limites"
+
+#: src/libslic3r/PrintConfig.cpp:1301
+msgid "Purpose of Machine Limits"
+msgstr "Proposito dos Limites da máquina"
+
+#: src/libslic3r/PrintConfig.cpp:1303
+msgid "How to apply the Machine Limits"
+msgstr "Como aplicar os Limites da Máquina"
+
+#: src/libslic3r/PrintConfig.cpp:1308
+msgid "Emit to G-code"
+msgstr "Emitir para G-code"
+
+#: src/libslic3r/PrintConfig.cpp:1309
+msgid "Use for time estimate"
+msgstr "Usar para estimar tempo"
+
+#: src/libslic3r/PrintConfig.cpp:1310
+msgid "Ignore"
+msgstr "Ignorar"
+
+#: src/libslic3r/PrintConfig.cpp:1333
msgid "Maximum feedrate X"
msgstr "Máxima taxa de alimentação do X"
-#: src/libslic3r/PrintConfig.cpp:1126
+#: src/libslic3r/PrintConfig.cpp:1334
msgid "Maximum feedrate Y"
msgstr "Máxima taxa de alimentação do Y"
-#: src/libslic3r/PrintConfig.cpp:1127
+#: src/libslic3r/PrintConfig.cpp:1335
msgid "Maximum feedrate Z"
msgstr "Máxima taxa de alimentação do Z"
-#: src/libslic3r/PrintConfig.cpp:1128
+#: src/libslic3r/PrintConfig.cpp:1336
msgid "Maximum feedrate E"
msgstr "Máxima taxa de alimentação do E"
-#: src/libslic3r/PrintConfig.cpp:1131
+#: src/libslic3r/PrintConfig.cpp:1339
msgid "Maximum feedrate of the X axis"
msgstr "Máxima taxa de alimentação do eixo X"
-#: src/libslic3r/PrintConfig.cpp:1132
+#: src/libslic3r/PrintConfig.cpp:1340
msgid "Maximum feedrate of the Y axis"
msgstr "Máxima taxa de alimentação do eixo Y"
-#: src/libslic3r/PrintConfig.cpp:1133
+#: src/libslic3r/PrintConfig.cpp:1341
msgid "Maximum feedrate of the Z axis"
msgstr "Máxima taxa de alimentação do eixo Z"
-#: src/libslic3r/PrintConfig.cpp:1134
+#: src/libslic3r/PrintConfig.cpp:1342
msgid "Maximum feedrate of the E axis"
msgstr "Máxima taxa de alimentação do eixo E"
-#: src/libslic3r/PrintConfig.cpp:1142
+#: src/libslic3r/PrintConfig.cpp:1350
msgid "Maximum acceleration X"
msgstr "Aceleração máxima do X"
-#: src/libslic3r/PrintConfig.cpp:1143
+#: src/libslic3r/PrintConfig.cpp:1351
msgid "Maximum acceleration Y"
msgstr "Aceleração máxima do Y"
-#: src/libslic3r/PrintConfig.cpp:1144
+#: src/libslic3r/PrintConfig.cpp:1352
msgid "Maximum acceleration Z"
msgstr "Aceleração máxima do Z"
-#: src/libslic3r/PrintConfig.cpp:1145
+#: src/libslic3r/PrintConfig.cpp:1353
msgid "Maximum acceleration E"
msgstr "Aceleração máxima do E"
-#: src/libslic3r/PrintConfig.cpp:1148
+#: src/libslic3r/PrintConfig.cpp:1356
msgid "Maximum acceleration of the X axis"
msgstr "Aceleração máxima do eixo X"
-#: src/libslic3r/PrintConfig.cpp:1149
+#: src/libslic3r/PrintConfig.cpp:1357
msgid "Maximum acceleration of the Y axis"
msgstr "Aceleração máxima do eixo Y"
-#: src/libslic3r/PrintConfig.cpp:1150
+#: src/libslic3r/PrintConfig.cpp:1358
msgid "Maximum acceleration of the Z axis"
msgstr "Aceleração máxima do eixo Z"
-#: src/libslic3r/PrintConfig.cpp:1151
+#: src/libslic3r/PrintConfig.cpp:1359
msgid "Maximum acceleration of the E axis"
msgstr "Aceleração máxima do eixo E"
-#: src/libslic3r/PrintConfig.cpp:1159
+#: src/libslic3r/PrintConfig.cpp:1367
msgid "Maximum jerk X"
msgstr "Máximo empurrão X"
-#: src/libslic3r/PrintConfig.cpp:1160
+#: src/libslic3r/PrintConfig.cpp:1368
msgid "Maximum jerk Y"
msgstr "Máximo empurrão Y"
-#: src/libslic3r/PrintConfig.cpp:1161
+#: src/libslic3r/PrintConfig.cpp:1369
msgid "Maximum jerk Z"
msgstr "Máximo empurrão Z"
-#: src/libslic3r/PrintConfig.cpp:1162
+#: src/libslic3r/PrintConfig.cpp:1370
msgid "Maximum jerk E"
msgstr "Máximo empurrão E"
-#: src/libslic3r/PrintConfig.cpp:1165
+#: src/libslic3r/PrintConfig.cpp:1373
msgid "Maximum jerk of the X axis"
msgstr "Máximo empurrão do eixo X"
-#: src/libslic3r/PrintConfig.cpp:1166
+#: src/libslic3r/PrintConfig.cpp:1374
msgid "Maximum jerk of the Y axis"
msgstr "Máximo empurrão do eixo Y"
-#: src/libslic3r/PrintConfig.cpp:1167
+#: src/libslic3r/PrintConfig.cpp:1375
msgid "Maximum jerk of the Z axis"
msgstr "Máximo empurrão do eixo Z"
-#: src/libslic3r/PrintConfig.cpp:1168
+#: src/libslic3r/PrintConfig.cpp:1376
msgid "Maximum jerk of the E axis"
msgstr "Máximo empurrão do eixo E"
-#: src/libslic3r/PrintConfig.cpp:1178
+#: src/libslic3r/PrintConfig.cpp:1386
msgid "Minimum feedrate when extruding"
msgstr "Taxa de alimentação mínima ao extrudar"
-#: src/libslic3r/PrintConfig.cpp:1180
+#: src/libslic3r/PrintConfig.cpp:1388
msgid "Minimum feedrate when extruding (M205 S)"
msgstr "Taxa de alimentação mínima ao extrudar (M205 S)"
-#: src/libslic3r/PrintConfig.cpp:1188
+#: src/libslic3r/PrintConfig.cpp:1396
msgid "Minimum travel feedrate"
msgstr "Taxa de alimentação mínima ao viajar"
-#: src/libslic3r/PrintConfig.cpp:1190
+#: src/libslic3r/PrintConfig.cpp:1398
msgid "Minimum travel feedrate (M205 T)"
msgstr "Taxa de alimentação mínima ao viajar (M205 T)"
-#: src/libslic3r/PrintConfig.cpp:1198
+#: src/libslic3r/PrintConfig.cpp:1406
msgid "Maximum acceleration when extruding"
msgstr "Aceleração máxima quando expurgando"
-#: src/libslic3r/PrintConfig.cpp:1200
+#: src/libslic3r/PrintConfig.cpp:1408
msgid "Maximum acceleration when extruding (M204 S)"
msgstr "Aceleração máxima quando extrudando (M204 S)"
-#: src/libslic3r/PrintConfig.cpp:1208
+#: src/libslic3r/PrintConfig.cpp:1416
msgid "Maximum acceleration when retracting"
msgstr "Aceleração máxima durante a retração"
-#: src/libslic3r/PrintConfig.cpp:1210
+#: src/libslic3r/PrintConfig.cpp:1418
msgid "Maximum acceleration when retracting (M204 T)"
msgstr "Aceleração máxima quando retração (M204 T)"
-#: src/libslic3r/PrintConfig.cpp:1217 src/libslic3r/PrintConfig.cpp:1226
+#: src/libslic3r/PrintConfig.cpp:1425 src/libslic3r/PrintConfig.cpp:1434
msgid "Max"
msgstr "Máx"
-#: src/libslic3r/PrintConfig.cpp:1218
+#: src/libslic3r/PrintConfig.cpp:1426
msgid "This setting represents the maximum speed of your fan."
msgstr "Esta config. representa a velocidade máxima da sua ventoinha."
-#: src/libslic3r/PrintConfig.cpp:1227
-#, no-c-format
+#: src/libslic3r/PrintConfig.cpp:1435
+#, c-format
msgid ""
-"This is the highest printable layer height for this extruder, used to cap "
-"the variable layer height and support layer height. Maximum recommended "
-"layer height is 75% of the extrusion width to achieve reasonable inter-layer "
+"This is the highest printable layer height for this extruder, used to cap the "
+"variable layer height and support layer height. Maximum recommended layer "
+"height is 75% of the extrusion width to achieve reasonable inter-layer "
"adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter."
msgstr ""
-"Esta é a altura mais alta imprimível para esta extrusora, usada para tampar "
-"a altura variável da camada e suportar a altura da camada. A altura "
-"recomendada máxima da camada é 75% o da largura da extrusão para conseguir a "
-"adesão razoável entre camadas. Se definido como 0, a altura da camada é "
-"limitada a 75% o do diâmetro da ponteira."
+"Esta é a altura mais alta imprimível para esta extrusora, usada para tampar a "
+"altura variável da camada e suportar a altura da camada. A altura recomendada "
+"máxima da camada é 75% o da largura da extrusão para conseguir a adesão "
+"razoável entre camadas. Se definido como 0, a altura da camada é limitada a "
+"75% o do diâmetro da ponteira."
-#: src/libslic3r/PrintConfig.cpp:1237
+#: src/libslic3r/PrintConfig.cpp:1445
msgid "Max print speed"
msgstr "Velocidade máxima de impressão"
-#: src/libslic3r/PrintConfig.cpp:1238
+#: src/libslic3r/PrintConfig.cpp:1446
msgid ""
"When setting other speed settings to 0 Slic3r will autocalculate the optimal "
"speed in order to keep constant extruder pressure. This experimental setting "
@@ -8557,116 +10599,114 @@ msgstr ""
"extrusora. Esta config. experimental é usada para definir a velocidade de "
"impressão mais alta que você deseja permitir."
-#: src/libslic3r/PrintConfig.cpp:1248
+#: src/libslic3r/PrintConfig.cpp:1456
msgid ""
"This experimental setting is used to set the maximum volumetric speed your "
"extruder supports."
msgstr ""
-"Esta config. experimental é usada para definir a velocidade máxima "
-"volumétrica que sua extrusora suporta."
+"Esta config. experimental é usada para definir a velocidade máxima volumétrica "
+"que sua extrusora suporta."
-#: src/libslic3r/PrintConfig.cpp:1257
+#: src/libslic3r/PrintConfig.cpp:1465
msgid "Max volumetric slope positive"
msgstr "Inclinação volumétrica máx positiva"
-#: src/libslic3r/PrintConfig.cpp:1258 src/libslic3r/PrintConfig.cpp:1269
+#: src/libslic3r/PrintConfig.cpp:1466 src/libslic3r/PrintConfig.cpp:1477
msgid ""
"This experimental setting is used to limit the speed of change in extrusion "
-"rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate "
-"of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/"
-"s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds."
+"rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate of "
+"1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/s) "
+"to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds."
msgstr ""
-"Esta config. experimental é usada para limitar a velocidade de mudança na "
-"taxa de extrusão. Um valor de 1,8 mm ³/s ² assegura que uma alteração da "
-"taxa de extrusão de 1,8 mm ³/s (largura de extrusão de 0,45 mm, altura de "
-"extrusão de 0,2 mm, avanço de 20 mm/s) para 5,4 mm ³/s (avanço 60 mm/s) "
-"levará pelo menos 2 segundos."
+"Esta config. experimental é usada para limitar a velocidade de mudança na taxa "
+"de extrusão. Um valor de 1,8 mm ³/s ² assegura que uma alteração da taxa de "
+"extrusão de 1,8 mm ³/s (largura de extrusão de 0,45 mm, altura de extrusão de "
+"0,2 mm, avanço de 20 mm/s) para 5,4 mm ³/s (avanço 60 mm/s) levará pelo menos "
+"2 segundos."
-#: src/libslic3r/PrintConfig.cpp:1262 src/libslic3r/PrintConfig.cpp:1273
+#: src/libslic3r/PrintConfig.cpp:1470 src/libslic3r/PrintConfig.cpp:1481
msgid "mm³/s²"
msgstr "mm ³/s ²"
-#: src/libslic3r/PrintConfig.cpp:1268
+#: src/libslic3r/PrintConfig.cpp:1476
msgid "Max volumetric slope negative"
msgstr "Inclinação volumétrica máx negativa"
-#: src/libslic3r/PrintConfig.cpp:1280 src/libslic3r/PrintConfig.cpp:1289
+#: src/libslic3r/PrintConfig.cpp:1488 src/libslic3r/PrintConfig.cpp:1497
msgid "Min"
msgstr "Min"
-#: src/libslic3r/PrintConfig.cpp:1281
+#: src/libslic3r/PrintConfig.cpp:1489
msgid "This setting represents the minimum PWM your fan needs to work."
msgstr ""
-"Esta config. representa o PWM mínimo que seu ventoinha precisa para "
-"trabalhar."
+"Esta config. representa o PWM mínimo que seu ventoinha precisa para trabalhar."
-#: src/libslic3r/PrintConfig.cpp:1290
+#: src/libslic3r/PrintConfig.cpp:1498
msgid ""
"This is the lowest printable layer height for this extruder and limits the "
"resolution for variable layer height. Typical values are between 0.05 mm and "
"0.1 mm."
msgstr ""
-"Esta é a altura mais baixa imprimível para esta extrusora e limita a "
-"definição para a altura variável da camada. Os valores típicos são entre 0, "
-"5 mm e 0,1 mm."
+"Esta é a altura mais baixa imprimível para esta extrusora e limita a definição "
+"para a altura variável da camada. Os valores típicos são entre 0, 5 mm e 0,1 "
+"mm."
-#: src/libslic3r/PrintConfig.cpp:1298
+#: src/libslic3r/PrintConfig.cpp:1506
msgid "Min print speed"
msgstr "Velocidade mínima de impressão"
-#: src/libslic3r/PrintConfig.cpp:1299
+#: src/libslic3r/PrintConfig.cpp:1507
msgid "Slic3r will not scale speed down below this speed."
msgstr "Slic3r não vai escalar a velocidade abaixo desta velocidade."
-#: src/libslic3r/PrintConfig.cpp:1306
+#: src/libslic3r/PrintConfig.cpp:1514
msgid "Minimal filament extrusion length"
msgstr "Comprimento mínimo da extrusão do filamento"
-#: src/libslic3r/PrintConfig.cpp:1307
+#: src/libslic3r/PrintConfig.cpp:1515
msgid ""
"Generate no less than the number of skirt loops required to consume the "
-"specified amount of filament on the bottom layer. For multi-extruder "
-"machines, this minimum applies to each extruder."
+"specified amount of filament on the bottom layer. For multi-extruder machines, "
+"this minimum applies to each extruder."
msgstr ""
-"Gerar não menos do que o número de voltas de saia necessários para consumir "
-"a quantidade especificada de filamento na camada inferior. Para máquinas "
+"Gerar não menos do que o número de voltas de saia necessários para consumir a "
+"quantidade especificada de filamento na camada inferior. Para máquinas "
"multiextrusoras, este mínimo aplica-se a cada extrusora."
-#: src/libslic3r/PrintConfig.cpp:1316
+#: src/libslic3r/PrintConfig.cpp:1524
msgid "Configuration notes"
-msgstr "Notas de config."
+msgstr "Notas de config"
-#: src/libslic3r/PrintConfig.cpp:1317
+#: src/libslic3r/PrintConfig.cpp:1525
msgid ""
"You can put here your personal notes. This text will be added to the G-code "
"header comments."
msgstr ""
-"Você pode colocar aqui suas anotações pessoais. Este texto será adicionado "
-"aos comentários do cabeçalho do G-code."
+"Você pode colocar aqui suas anotações pessoais. Este texto será adicionado aos "
+"comentários do cabeçalho do G-code."
-#: src/libslic3r/PrintConfig.cpp:1327
+#: src/libslic3r/PrintConfig.cpp:1535
msgid ""
"This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)"
-msgstr ""
-"Este é o diâmetro da ponteira da extrusora (por exemplo: 0.5, 0.35 etc.)"
+msgstr "Este é o diâmetro da ponteira da extrusora (por exemplo: 0.5, 0.35 etc.)"
-#: src/libslic3r/PrintConfig.cpp:1332
+#: src/libslic3r/PrintConfig.cpp:1540
msgid "Host Type"
msgstr "Tipo de host"
-#: src/libslic3r/PrintConfig.cpp:1333
+#: src/libslic3r/PrintConfig.cpp:1541
msgid ""
-"Slic3r can upload G-code files to a printer host. This field must contain "
-"the kind of the host."
+"Slic3r can upload G-code files to a printer host. This field must contain the "
+"kind of the host."
msgstr ""
-"Slic3r pode carregar arquivos de G-code para um host de impressora. Este "
-"campo deve conter o tipo do host."
+"Slic3r pode carregar arquivos de G-code para um host de impressora. Este campo "
+"deve conter o tipo do host."
-#: src/libslic3r/PrintConfig.cpp:1348
+#: src/libslic3r/PrintConfig.cpp:1558
msgid "Only retract when crossing perimeters"
msgstr "Apenas retrair quando cruzar perímetros"
-#: src/libslic3r/PrintConfig.cpp:1349
+#: src/libslic3r/PrintConfig.cpp:1559
msgid ""
"Disables retraction when the travel path does not exceed the upper layer's "
"perimeters (and thus any ooze will be probably invisible)."
@@ -8675,7 +10715,7 @@ msgstr ""
"camada superior (e, portanto, qualquer escorrimento será provavelmente "
"invisível)."
-#: src/libslic3r/PrintConfig.cpp:1356
+#: src/libslic3r/PrintConfig.cpp:1566
msgid ""
"This option will drop the temperature of the inactive extruders to prevent "
"oozing. It will enable a tall skirt automatically and move extruders outside "
@@ -8685,96 +10725,92 @@ msgstr ""
"escorrimento. Ele vai permitir uma saia alta automaticamente e mover "
"extrusoras fora de tal saia quando a mudança de temperatura."
-#: src/libslic3r/PrintConfig.cpp:1363
+#: src/libslic3r/PrintConfig.cpp:1573
msgid "Output filename format"
msgstr "Formato de nome de arquivo de saída"
-#: src/libslic3r/PrintConfig.cpp:1364
+#: src/libslic3r/PrintConfig.cpp:1574
msgid ""
"You can use all configuration options as variables inside this template. For "
"example: [layer_height], [fill_density] etc. You can also use [timestamp], "
"[year], [month], [day], [hour], [minute], [second], [version], "
"[input_filename], [input_filename_base]."
msgstr ""
-"Você pode usar todas as opções de config. como variáveis dentro deste "
-"modelo. Por exemplo: [camada_altura], [densidade_preenchimento] etc. Você "
-"também pode usar [tempo], [ano], [mês], [dia], [hora], [minuto], [segundo], "
-"[versão], [nome_entrada], [nome_entrada_base]."
+"Você pode usar todas as opções de config. como variáveis dentro deste modelo. "
+"Por exemplo: [camada_altura], [densidade_preenchimento] etc. Você também pode "
+"usar [tempo], [ano], [mês], [dia], [hora], [minuto], [segundo], [versão], "
+"[nome_entrada], [nome_entrada_base]."
-#: src/libslic3r/PrintConfig.cpp:1373
+#: src/libslic3r/PrintConfig.cpp:1583
msgid "Detect bridging perimeters"
msgstr "Detectar perímetros de ponte"
-#: src/libslic3r/PrintConfig.cpp:1375
+#: src/libslic3r/PrintConfig.cpp:1585
msgid ""
"Experimental option to adjust flow for overhangs (bridge flow will be used), "
"to apply bridge speed to them and enable fan."
msgstr ""
-"Opção experimental para ajustar o fluxo para angulações (o fluxo da ponte "
-"será usado), para aplicar a velocidade da ponte a eles e para habilitar a "
-"ventoinha."
+"Opção experimental para ajustar o fluxo para angulações (o fluxo da ponte será "
+"usado), para aplicar a velocidade da ponte a eles e para habilitar a ventoinha."
-#: src/libslic3r/PrintConfig.cpp:1381
+#: src/libslic3r/PrintConfig.cpp:1591
msgid "Filament parking position"
msgstr "Posição de estacionamento do filamento"
-#: src/libslic3r/PrintConfig.cpp:1382
+#: src/libslic3r/PrintConfig.cpp:1592
msgid ""
"Distance of the extruder tip from the position where the filament is parked "
"when unloaded. This should match the value in printer firmware."
msgstr ""
"Distância da ponta da extrusora da posição onde o filamento está estacionado "
-"quando descarregado. Isso deve corresponder ao valor no firmware da "
-"impressora."
+"quando descarregado. Isso deve corresponder ao valor no firmware da impressora."
-#: src/libslic3r/PrintConfig.cpp:1390
+#: src/libslic3r/PrintConfig.cpp:1600
msgid "Extra loading distance"
msgstr "Distância de carregamento extra"
-#: src/libslic3r/PrintConfig.cpp:1391
+#: src/libslic3r/PrintConfig.cpp:1601
msgid ""
"When set to zero, the distance the filament is moved from parking position "
"during load is exactly the same as it was moved back during unload. When "
-"positive, it is loaded further, if negative, the loading move is shorter "
-"than unloading."
+"positive, it is loaded further, if negative, the loading move is shorter than "
+"unloading."
msgstr ""
"Quando ajustado a zero, a distância que o filamento é movida da posição do "
"estacionamento durante a carga é exatamente a mesma que foi movida para trás "
"durante o descarregamento. Quando positivo, ele é carregado ainda mais, se "
"negativo, o movimento de carga é menor do que o descarregamento."
-#: src/libslic3r/PrintConfig.cpp:1399 src/libslic3r/PrintConfig.cpp:1417
-#: src/libslic3r/PrintConfig.cpp:1430 src/libslic3r/PrintConfig.cpp:1440
+#: src/libslic3r/PrintConfig.cpp:1609 src/libslic3r/PrintConfig.cpp:1626
+#: src/libslic3r/PrintConfig.cpp:1639 src/libslic3r/PrintConfig.cpp:1649
msgid "Perimeters"
msgstr "Perímetros"
-#: src/libslic3r/PrintConfig.cpp:1400
+#: src/libslic3r/PrintConfig.cpp:1610
msgid ""
-"This is the acceleration your printer will use for perimeters. A high value "
-"like 9000 usually gives good results if your hardware is up to the job. Set "
-"zero to disable acceleration control for perimeters."
+"This is the acceleration your printer will use for perimeters. Set zero to "
+"disable acceleration control for perimeters."
msgstr ""
-"Esta é a aceleração que sua impressora usará para perímetros. Um alto valor "
-"como 9000 geralmente dá bons resultados se o seu hardware suporta. Defina "
-"zero para desabilitar o controle de aceleração para perímetros."
+"Esta é a aceleração que sua impressora usará para perimetros. Defina zero para "
+"desabilitar o controle de aceleração para perimetros."
-#: src/libslic3r/PrintConfig.cpp:1408
+#: src/libslic3r/PrintConfig.cpp:1617
msgid "Perimeter extruder"
msgstr "Extrusora de perímetro"
-#: src/libslic3r/PrintConfig.cpp:1410
+#: src/libslic3r/PrintConfig.cpp:1619
msgid ""
"The extruder to use when printing perimeters and brim. First extruder is 1."
msgstr ""
"A extrusora para usar ao imprimir perímetros e aba. A primeira extrusora é 1."
-#: src/libslic3r/PrintConfig.cpp:1419
+#: src/libslic3r/PrintConfig.cpp:1628
msgid ""
"Set this to a non-zero value to set a manual extrusion width for perimeters. "
-"You may want to use thinner extrudates to get more accurate surfaces. If "
-"left zero, default extrusion width will be used if set, otherwise 1.125 x "
-"nozzle diameter will be used. If expressed as percentage (for example 200%) "
-"it will be computed over layer height."
+"You may want to use thinner extrudates to get more accurate surfaces. If left "
+"zero, default extrusion width will be used if set, otherwise 1.125 x nozzle "
+"diameter will be used. If expressed as percentage (for example 200%) it will "
+"be computed over layer height."
msgstr ""
"Defina isso como um valor diferente de zero para definir uma largura de "
"extrusão manual para perímetros. Você pode querer usar extrusões mais finos "
@@ -8783,124 +10819,123 @@ msgstr ""
"ponteira será usado. Se expresso em porcentagem(por exemplo, 200%) Ele será "
"calculado sobre a altura da camada."
-#: src/libslic3r/PrintConfig.cpp:1432
+#: src/libslic3r/PrintConfig.cpp:1641
msgid ""
"Speed for perimeters (contours, aka vertical shells). Set to zero for auto."
msgstr ""
-"Velocidade para perímetros (contornos, também chamadas de perímetros "
-"externos verticais). Defina como zero para auto."
+"Velocidade para perímetros (contornos, também chamadas de perímetros externos "
+"verticais). Defina como zero para auto."
-#: src/libslic3r/PrintConfig.cpp:1442
+#: src/libslic3r/PrintConfig.cpp:1651
msgid ""
"This option sets the number of perimeters to generate for each layer. Note "
"that Slic3r may increase this number automatically when it detects sloping "
"surfaces which benefit from a higher number of perimeters if the Extra "
"Perimeters option is enabled."
msgstr ""
-"Esta opção define o número de perímetros a gerar para cada camada. Observe "
-"que o Slic3r pode aumentar esse número automaticamente quando detecta "
-"superfícies inclinadas que se beneficiam de um número maior de perímetros se "
-"a opção extra perímetros estiver habilitada."
+"Esta opção define o número de perímetros a gerar para cada camada. Observe que "
+"o Slic3r pode aumentar esse número automaticamente quando detecta superfícies "
+"inclinadas que se beneficiam de um número maior de perímetros se a opção extra "
+"perímetros estiver habilitada."
-#: src/libslic3r/PrintConfig.cpp:1446
+#: src/libslic3r/PrintConfig.cpp:1655
msgid "(minimum)"
msgstr "(mínimo)"
-#: src/libslic3r/PrintConfig.cpp:1454
+#: src/libslic3r/PrintConfig.cpp:1663
msgid ""
"If you want to process the output G-code through custom scripts, just list "
-"their absolute paths here. Separate multiple scripts with a semicolon. "
-"Scripts will be passed the absolute path to the G-code file as the first "
-"argument, and they can access the Slic3r config settings by reading "
-"environment variables."
-msgstr ""
-"Se você quiser processar o G-code de saída por meio de scripts "
-"personalizados, basta listar seus caminhos absolutos aqui. Separe vários "
-"scripts com um ponto-e-vírgula. Os scripts serão passados o caminho absoluto "
-"para o arquivo de G-code como o primeiro argumento, e eles poderão acessar "
-"as config. de config. do Slic3r lendo variáveis de ambiente."
-
-#: src/libslic3r/PrintConfig.cpp:1466
+"their absolute paths here. Separate multiple scripts with a semicolon. Scripts "
+"will be passed the absolute path to the G-code file as the first argument, and "
+"they can access the Slic3r config settings by reading environment variables."
+msgstr ""
+"Se você quiser processar o G-code de saída por meio de scripts personalizados, "
+"basta listar seus caminhos absolutos aqui. Separe vários scripts com um ponto-"
+"e-vírgula. Os scripts serão passados o caminho absoluto para o arquivo de G-"
+"code como o primeiro argumento, e eles poderão acessar as config. de config. "
+"do Slic3r lendo variáveis de ambiente."
+
+#: src/libslic3r/PrintConfig.cpp:1675
msgid "Printer type"
msgstr "Tipo de impressora"
-#: src/libslic3r/PrintConfig.cpp:1467
+#: src/libslic3r/PrintConfig.cpp:1676
msgid "Type of the printer."
msgstr "Tipo da impressora."
-#: src/libslic3r/PrintConfig.cpp:1472
+#: src/libslic3r/PrintConfig.cpp:1681
msgid "Printer notes"
msgstr "Notas da impressora"
-#: src/libslic3r/PrintConfig.cpp:1473
+#: src/libslic3r/PrintConfig.cpp:1682
msgid "You can put your notes regarding the printer here."
msgstr "Você pode colocar suas anotações sobre a impressora aqui."
-#: src/libslic3r/PrintConfig.cpp:1481
+#: src/libslic3r/PrintConfig.cpp:1690
msgid "Printer vendor"
msgstr "Fornecedor da impressora"
-#: src/libslic3r/PrintConfig.cpp:1482
+#: src/libslic3r/PrintConfig.cpp:1691
msgid "Name of the printer vendor."
msgstr "Nome do fornecedor da impressora."
-#: src/libslic3r/PrintConfig.cpp:1487
+#: src/libslic3r/PrintConfig.cpp:1696
msgid "Printer variant"
msgstr "Variante da impressora"
-#: src/libslic3r/PrintConfig.cpp:1488
+#: src/libslic3r/PrintConfig.cpp:1697
msgid ""
"Name of the printer variant. For example, the printer variants may be "
"differentiated by a nozzle diameter."
msgstr ""
-"Nome da variante da impressora. Por exemplo, as variantes da impressora "
-"podem ser diferenciadas por um diâmetro da ponteira."
+"Nome da variante da impressora. Por exemplo, as variantes da impressora podem "
+"ser diferenciadas por um diâmetro da ponteira."
-#: src/libslic3r/PrintConfig.cpp:1501
+#: src/libslic3r/PrintConfig.cpp:1714
msgid "Raft layers"
msgstr "Camadas da estrado"
-#: src/libslic3r/PrintConfig.cpp:1503
+#: src/libslic3r/PrintConfig.cpp:1716
msgid ""
-"The object will be raised by this number of layers, and support material "
-"will be generated under it."
+"The object will be raised by this number of layers, and support material will "
+"be generated under it."
msgstr ""
-"O objeto será elevado por este número de camadas, e o material de suporte "
-"será gerado em baixo dele."
+"O objeto será elevado por este número de camadas, e o material de suporte será "
+"gerado em baixo dele."
-#: src/libslic3r/PrintConfig.cpp:1511
+#: src/libslic3r/PrintConfig.cpp:1724
msgid "Resolution"
msgstr "Resolução"
-#: src/libslic3r/PrintConfig.cpp:1512
+#: src/libslic3r/PrintConfig.cpp:1725
msgid ""
-"Minimum detail resolution, used to simplify the input file for speeding up "
-"the slicing job and reducing memory usage. High-resolution models often "
-"carry more detail than printers can render. Set to zero to disable any "
-"simplification and use full resolution from input."
+"Minimum detail resolution, used to simplify the input file for speeding up the "
+"slicing job and reducing memory usage. High-resolution models often carry more "
+"detail than printers can render. Set to zero to disable any simplification and "
+"use full resolution from input."
msgstr ""
"Resolução de detalhes mínimos, usada para simplificar o arquivo de entrada "
-"para acelerar o trabalho de fatiamento e reduzir o uso de memória. Modelos "
-"de alta resolução geralmente carregam mais detalhes do que as impressoras "
-"podem renderizar. Defina como zero para desabilitar qualquer simplificação e "
-"usar a resolução completa da entrada."
+"para acelerar o trabalho de fatiamento e reduzir o uso de memória. Modelos de "
+"alta resolução geralmente carregam mais detalhes do que as impressoras podem "
+"renderizar. Defina como zero para desabilitar qualquer simplificação e usar a "
+"resolução completa da entrada."
-#: src/libslic3r/PrintConfig.cpp:1522
+#: src/libslic3r/PrintConfig.cpp:1735
msgid "Minimum travel after retraction"
msgstr "Retração em viagens acima de"
-#: src/libslic3r/PrintConfig.cpp:1523
+#: src/libslic3r/PrintConfig.cpp:1736
msgid ""
"Retraction is not triggered when travel moves are shorter than this length."
msgstr ""
"A retração não é acionada quando os movimentos de viagem são mais curtos que "
"esse comprimento."
-#: src/libslic3r/PrintConfig.cpp:1529
+#: src/libslic3r/PrintConfig.cpp:1742
msgid "Retract amount before wipe"
msgstr "Quantidade de retração antes da limpeza"
-#: src/libslic3r/PrintConfig.cpp:1530
+#: src/libslic3r/PrintConfig.cpp:1743
msgid ""
"With bowden extruders, it may be wise to do some amount of quick retract "
"before doing the wipe movement."
@@ -8908,105 +10943,104 @@ msgstr ""
"Com extrusoras Bowden, pode ser sábio fazer alguma quantidade de retração "
"rápida antes de fazer o movimento da limpeza."
-#: src/libslic3r/PrintConfig.cpp:1537
+#: src/libslic3r/PrintConfig.cpp:1750
msgid "Retract on layer change"
msgstr "Retrair na mudança de camada"
-#: src/libslic3r/PrintConfig.cpp:1538
+#: src/libslic3r/PrintConfig.cpp:1751
msgid "This flag enforces a retraction whenever a Z move is done."
msgstr "Este sinalizador impõe uma retração sempre que um movimento Z é feito."
-#: src/libslic3r/PrintConfig.cpp:1543 src/libslic3r/PrintConfig.cpp:1551
+#: src/libslic3r/PrintConfig.cpp:1756 src/libslic3r/PrintConfig.cpp:1764
msgid "Length"
msgstr "Comprimento"
-#: src/libslic3r/PrintConfig.cpp:1544
+#: src/libslic3r/PrintConfig.cpp:1757
msgid "Retraction Length"
msgstr "Comprimento de retração"
-#: src/libslic3r/PrintConfig.cpp:1545
+#: src/libslic3r/PrintConfig.cpp:1758
msgid ""
-"When retraction is triggered, filament is pulled back by the specified "
-"amount (the length is measured on raw filament, before it enters the "
-"extruder)."
+"When retraction is triggered, filament is pulled back by the specified amount "
+"(the length is measured on raw filament, before it enters the extruder)."
msgstr ""
"Quando a retração é acionada, o filamento é puxado para trás pela quantidade "
"especificada (o comprimento é medido em filamento cru, antes de entrar na "
"extrusora)."
-#: src/libslic3r/PrintConfig.cpp:1547 src/libslic3r/PrintConfig.cpp:1556
+#: src/libslic3r/PrintConfig.cpp:1760 src/libslic3r/PrintConfig.cpp:1769
msgid "mm (zero to disable)"
msgstr "mm (zero para desativar)"
-#: src/libslic3r/PrintConfig.cpp:1552
+#: src/libslic3r/PrintConfig.cpp:1765
msgid "Retraction Length (Toolchange)"
msgstr "Comprimento de retração (mudança de ferramenta)"
-#: src/libslic3r/PrintConfig.cpp:1553
+#: src/libslic3r/PrintConfig.cpp:1766
msgid ""
-"When retraction is triggered before changing tool, filament is pulled back "
-"by the specified amount (the length is measured on raw filament, before it "
-"enters the extruder)."
+"When retraction is triggered before changing tool, filament is pulled back by "
+"the specified amount (the length is measured on raw filament, before it enters "
+"the extruder)."
msgstr ""
"Quando a retração é acionada antes de mudar de ferramenta, o filamento é "
"puxado para trás pela quantidade especificada (o comprimento é medido em "
"filamento cru, antes de entrar na extrusora)."
-#: src/libslic3r/PrintConfig.cpp:1561
+#: src/libslic3r/PrintConfig.cpp:1774
msgid "Lift Z"
msgstr "Elevar Z"
-#: src/libslic3r/PrintConfig.cpp:1562
+#: src/libslic3r/PrintConfig.cpp:1775
msgid ""
"If you set this to a positive value, Z is quickly raised every time a "
"retraction is triggered. When using multiple extruders, only the setting for "
"the first extruder will be considered."
msgstr ""
"Se você definir isso como um valor positivo, Z é rapidamente elevado sempre "
-"que uma retração é acionada. Ao usar várias extrusoras, somente a config. "
-"para a primeira extrusora será considerada."
+"que uma retração é acionada. Ao usar várias extrusoras, somente a config. para "
+"a primeira extrusora será considerada."
-#: src/libslic3r/PrintConfig.cpp:1569
+#: src/libslic3r/PrintConfig.cpp:1782
msgid "Above Z"
msgstr "Acima de Z"
-#: src/libslic3r/PrintConfig.cpp:1570
+#: src/libslic3r/PrintConfig.cpp:1783
msgid "Only lift Z above"
msgstr "Apenas elevar Z acima"
-#: src/libslic3r/PrintConfig.cpp:1571
+#: src/libslic3r/PrintConfig.cpp:1784
msgid ""
"If you set this to a positive value, Z lift will only take place above the "
-"specified absolute Z. You can tune this setting for skipping lift on the "
-"first layers."
+"specified absolute Z. You can tune this setting for skipping lift on the first "
+"layers."
msgstr ""
-"Se você definir isso como um valor positivo, o levante do Z só ocorrerá "
-"acima do Z absoluto especificado. Você pode ajustar essa config. para pular "
-"o elevador nas primeiras camadas."
+"Se você definir isso como um valor positivo, o levante do Z só ocorrerá acima "
+"do Z absoluto especificado. Você pode ajustar essa config. para pular o "
+"elevador nas primeiras camadas."
-#: src/libslic3r/PrintConfig.cpp:1578
+#: src/libslic3r/PrintConfig.cpp:1791
msgid "Below Z"
msgstr "Abaixo de Z"
-#: src/libslic3r/PrintConfig.cpp:1579
+#: src/libslic3r/PrintConfig.cpp:1792
msgid "Only lift Z below"
msgstr "Apenas elevar Z abaixo"
-#: src/libslic3r/PrintConfig.cpp:1580
+#: src/libslic3r/PrintConfig.cpp:1793
msgid ""
"If you set this to a positive value, Z lift will only take place below the "
-"specified absolute Z. You can tune this setting for limiting lift to the "
-"first layers."
+"specified absolute Z. You can tune this setting for limiting lift to the first "
+"layers."
msgstr ""
-"Se você definir isso como um valor positivo, o levante do Z só ocorrerá "
-"abaixo do Z absoluto especificado. Você pode ajustar essa config. para "
-"limitar a elevação às primeiras camadas."
+"Se você definir isso como um valor positivo, o levante do Z só ocorrerá abaixo "
+"do Z absoluto especificado. Você pode ajustar essa config. para limitar a "
+"elevação às primeiras camadas."
-#: src/libslic3r/PrintConfig.cpp:1588 src/libslic3r/PrintConfig.cpp:1596
+#: src/libslic3r/PrintConfig.cpp:1801 src/libslic3r/PrintConfig.cpp:1809
msgid "Extra length on restart"
msgstr "Comprimento extra no reinício"
-#: src/libslic3r/PrintConfig.cpp:1589
+#: src/libslic3r/PrintConfig.cpp:1802
msgid ""
"When the retraction is compensated after the travel move, the extruder will "
"push this additional amount of filament. This setting is rarely needed."
@@ -9015,140 +11049,140 @@ msgstr ""
"empurrar esta quantidade adicional de filamento. Essa config. raramente é "
"necessária."
-#: src/libslic3r/PrintConfig.cpp:1597
+#: src/libslic3r/PrintConfig.cpp:1810
msgid ""
-"When the retraction is compensated after changing tool, the extruder will "
-"push this additional amount of filament."
+"When the retraction is compensated after changing tool, the extruder will push "
+"this additional amount of filament."
msgstr ""
"Quando a retração é compensada após a ferramenta de mudança, a extrusora "
"empurrará esta quantidade adicional de filamento."
-#: src/libslic3r/PrintConfig.cpp:1604 src/libslic3r/PrintConfig.cpp:1605
+#: src/libslic3r/PrintConfig.cpp:1817 src/libslic3r/PrintConfig.cpp:1818
msgid "Retraction Speed"
msgstr "Velocidade da retração"
-#: src/libslic3r/PrintConfig.cpp:1606
+#: src/libslic3r/PrintConfig.cpp:1819
msgid "The speed for retractions (it only applies to the extruder motor)."
msgstr "A velocidade para retrações (aplica-se somente ao motor da extrusora)."
-#: src/libslic3r/PrintConfig.cpp:1612 src/libslic3r/PrintConfig.cpp:1613
+#: src/libslic3r/PrintConfig.cpp:1825 src/libslic3r/PrintConfig.cpp:1826
msgid "Deretraction Speed"
msgstr "Velocidade de retorno de retração"
-#: src/libslic3r/PrintConfig.cpp:1614
+#: src/libslic3r/PrintConfig.cpp:1827
msgid ""
"The speed for loading of a filament into extruder after retraction (it only "
-"applies to the extruder motor). If left to zero, the retraction speed is "
-"used."
+"applies to the extruder motor). If left to zero, the retraction speed is used."
msgstr ""
-"A velocidade para o carregamento de um filamento na extrusora após a "
-"retração (aplica-se somente ao motor da extrusora). Se deixada como zero, a "
-"velocidade de retração é usada."
+"A velocidade para o carregamento de um filamento na extrusora após a retração "
+"(aplica-se somente ao motor da extrusora). Se deixada como zero, a velocidade "
+"de retração é usada."
-#: src/libslic3r/PrintConfig.cpp:1621
+#: src/libslic3r/PrintConfig.cpp:1834
msgid "Seam position"
msgstr "Posição da costura"
-#: src/libslic3r/PrintConfig.cpp:1623
+#: src/libslic3r/PrintConfig.cpp:1836
msgid "Position of perimeters starting points."
msgstr "Posição inicial dos pontos do perímetro."
-#: src/libslic3r/PrintConfig.cpp:1629
+#: src/libslic3r/PrintConfig.cpp:1842
msgid "Random"
msgstr "Aleatório"
-#: src/libslic3r/PrintConfig.cpp:1630
+#: src/libslic3r/PrintConfig.cpp:1843
msgid "Nearest"
msgstr "Próximo"
-#: src/libslic3r/PrintConfig.cpp:1631
+#: src/libslic3r/PrintConfig.cpp:1844
msgid "Aligned"
msgstr "Alinhado(a)"
-#: src/libslic3r/PrintConfig.cpp:1639
+#: src/libslic3r/PrintConfig.cpp:1852
msgid "Direction"
msgstr "Direção"
-#: src/libslic3r/PrintConfig.cpp:1641
+#: src/libslic3r/PrintConfig.cpp:1854
msgid "Preferred direction of the seam"
msgstr "Direção preferida da costura"
-#: src/libslic3r/PrintConfig.cpp:1642
+#: src/libslic3r/PrintConfig.cpp:1855
msgid "Seam preferred direction"
msgstr "Direção de preferência da costura"
-#: src/libslic3r/PrintConfig.cpp:1649
+#: src/libslic3r/PrintConfig.cpp:1862
msgid "Jitter"
msgstr "Jitter"
-#: src/libslic3r/PrintConfig.cpp:1651
+#: src/libslic3r/PrintConfig.cpp:1864
msgid "Seam preferred direction jitter"
msgstr "Direção da costura preferencial para Jitter"
-#: src/libslic3r/PrintConfig.cpp:1652
+#: src/libslic3r/PrintConfig.cpp:1865
msgid "Preferred direction of the seam - jitter"
msgstr "Direção preferida da costura-jitter"
-#: src/libslic3r/PrintConfig.cpp:1662
-msgid "USB/serial port for printer connection."
-msgstr "USB/porta serial para conexão da impressora."
-
-#: src/libslic3r/PrintConfig.cpp:1669
-msgid "Serial port speed"
-msgstr "Velocidade da porta serial"
-
-#: src/libslic3r/PrintConfig.cpp:1670
-msgid "Speed (baud) of USB/serial port for printer connection."
-msgstr "Velocidade (baud) do USB/porta serial para conexão da impressora."
-
-#: src/libslic3r/PrintConfig.cpp:1679
+#: src/libslic3r/PrintConfig.cpp:1872
msgid "Distance from object"
msgstr "Distância do objeto"
-#: src/libslic3r/PrintConfig.cpp:1680
+#: src/libslic3r/PrintConfig.cpp:1873
msgid ""
-"Distance between skirt and object(s). Set this to zero to attach the skirt "
-"to the object(s) and get a brim for better adhesion."
+"Distance between skirt and object(s). Set this to zero to attach the skirt to "
+"the object(s) and get a brim for better adhesion."
msgstr ""
"Distância entre a saia e o objeto (s). Defina isso como zero para anexar a "
"saia para o objeto (s) e obter uma aba para uma melhor aderência."
-#: src/libslic3r/PrintConfig.cpp:1687
+#: src/libslic3r/PrintConfig.cpp:1880
msgid "Skirt height"
msgstr "Altura da saia"
-#: src/libslic3r/PrintConfig.cpp:1688
+#: src/libslic3r/PrintConfig.cpp:1881
+msgid ""
+"Height of skirt expressed in layers. Set this to a tall value to use skirt as "
+"a shield against drafts."
+msgstr ""
+"Altura da saia expressa em camadas. Defina isso como um valor alto para usar a "
+"saia como um escudo contra rascunhos."
+
+#: src/libslic3r/PrintConfig.cpp:1888
+msgid "Draft shield"
+msgstr "Escudo de proteção"
+
+#: src/libslic3r/PrintConfig.cpp:1889
msgid ""
-"Height of skirt expressed in layers. Set this to a tall value to use skirt "
-"as a shield against drafts."
+"If enabled, the skirt will be as tall as a highest printed object. This is "
+"useful to protect an ABS or ASA print from warping and detaching from print "
+"bed due to wind draft."
msgstr ""
-"Altura da saia expressa em camadas. Defina isso como um valor alto para usar "
-"a saia como um escudo contra rascunhos."
+"Se habilitado, a saia será tão alta quanto um objeto impresso mais alto. Isso "
+"é útil para proteger uma impressão ABS ou ASA de empenamento e destacamento da "
+"base de impressão devido à corrente de vento."
-#: src/libslic3r/PrintConfig.cpp:1695
+#: src/libslic3r/PrintConfig.cpp:1895
msgid "Loops (minimum)"
msgstr "Voltas (mínimo)"
-#: src/libslic3r/PrintConfig.cpp:1696
+#: src/libslic3r/PrintConfig.cpp:1896
msgid "Skirt Loops"
msgstr "Voltas de saia"
-#: src/libslic3r/PrintConfig.cpp:1697
+#: src/libslic3r/PrintConfig.cpp:1897
msgid ""
-"Number of loops for the skirt. If the Minimum Extrusion Length option is "
-"set, the number of loops might be greater than the one configured here. Set "
-"this to zero to disable skirt completely."
+"Number of loops for the skirt. If the Minimum Extrusion Length option is set, "
+"the number of loops might be greater than the one configured here. Set this to "
+"zero to disable skirt completely."
msgstr ""
"Número de voltas para a saia. Se a opção comprimento mínimo de extrusão "
-"estiver definida, o número de voltas pode ser maior do que aquele "
-"configurado aqui. Defina isso como zero para desabilitar a saia "
-"completamente."
+"estiver definida, o número de voltas pode ser maior do que aquele configurado "
+"aqui. Defina isso como zero para desabilitar a saia completamente."
-#: src/libslic3r/PrintConfig.cpp:1705
+#: src/libslic3r/PrintConfig.cpp:1905
msgid "Slow down if layer print time is below"
msgstr "Diminuir a velocidade quando o tempo de impressão for menor que"
-#: src/libslic3r/PrintConfig.cpp:1706
+#: src/libslic3r/PrintConfig.cpp:1906
msgid ""
"If layer print time is estimated below this number of seconds, print moves "
"speed will be scaled down to extend duration to this value."
@@ -9157,11 +11191,11 @@ msgstr ""
"segundos, a velocidade de impressão será reduzida para estender a duração a "
"esse valor."
-#: src/libslic3r/PrintConfig.cpp:1715
+#: src/libslic3r/PrintConfig.cpp:1915
msgid "Small perimeters"
msgstr "Perímetro pequeno"
-#: src/libslic3r/PrintConfig.cpp:1717
+#: src/libslic3r/PrintConfig.cpp:1917
msgid ""
"This separate setting will affect the speed of perimeters having radius <= "
"6.5mm (usually holes). If expressed as percentage (for example: 80%) it will "
@@ -9172,11 +11206,11 @@ msgstr ""
"será calculado sobre a velocidade de perímetros configurados acima. Defina "
"como zero para auto."
-#: src/libslic3r/PrintConfig.cpp:1727
+#: src/libslic3r/PrintConfig.cpp:1927
msgid "Solid infill threshold area"
msgstr "Ãrea de limiar de preenchimento sólido"
-#: src/libslic3r/PrintConfig.cpp:1729
+#: src/libslic3r/PrintConfig.cpp:1929
msgid ""
"Force solid infill for regions having a smaller area than the specified "
"threshold."
@@ -9184,37 +11218,37 @@ msgstr ""
"Forçar preenchimento sólido para regiões com uma área menor do que o limite "
"especificado."
-#: src/libslic3r/PrintConfig.cpp:1730
+#: src/libslic3r/PrintConfig.cpp:1930
msgid "mm²"
msgstr "mm²"
-#: src/libslic3r/PrintConfig.cpp:1736
+#: src/libslic3r/PrintConfig.cpp:1936
msgid "Solid infill extruder"
msgstr "Extrusora de preenchimento sólido"
-#: src/libslic3r/PrintConfig.cpp:1738
+#: src/libslic3r/PrintConfig.cpp:1938
msgid "The extruder to use when printing solid infill."
msgstr ""
"A extrusora a ser utilizada quando estiver imprimindo preenchimento sólido."
-#: src/libslic3r/PrintConfig.cpp:1744
+#: src/libslic3r/PrintConfig.cpp:1944
msgid "Solid infill every"
msgstr "Preenchimento sólido a cada"
-#: src/libslic3r/PrintConfig.cpp:1746
+#: src/libslic3r/PrintConfig.cpp:1946
msgid ""
-"This feature allows to force a solid layer every given number of layers. "
-"Zero to disable. You can set this to any value (for example 9999); Slic3r "
-"will automatically choose the maximum possible number of layers to combine "
+"This feature allows to force a solid layer every given number of layers. Zero "
+"to disable. You can set this to any value (for example 9999); Slic3r will "
+"automatically choose the maximum possible number of layers to combine "
"according to nozzle diameter and layer height."
msgstr ""
"Este recurso permite forçar uma camada sólida a cada número determinado de "
"camadas. Zero para desabilitar. Você pode definir isso para qualquer valor "
-"(por exemplo 9999); Slic3r escolherá automaticamente o número máximo "
-"possível de camadas para combinar de acordo com o diâmetro da ponteira e a "
-"altura da camada."
+"(por exemplo 9999); Slic3r escolherá automaticamente o número máximo possível "
+"de camadas para combinar de acordo com o diâmetro da ponteira e a altura da "
+"camada."
-#: src/libslic3r/PrintConfig.cpp:1758
+#: src/libslic3r/PrintConfig.cpp:1958
msgid ""
"Set this to a non-zero value to set a manual extrusion width for infill for "
"solid surfaces. If left zero, default extrusion width will be used if set, "
@@ -9227,80 +11261,77 @@ msgstr ""
"1,125 x diâmetro da ponteira será usado. Se expresso em porcentagem(por "
"exemplo, 90%) Ele será calculado sobre a altura da camada."
-#: src/libslic3r/PrintConfig.cpp:1769
+#: src/libslic3r/PrintConfig.cpp:1969
msgid ""
-"Speed for printing solid regions (top/bottom/internal horizontal shells). "
-"This can be expressed as a percentage (for example: 80%) over the default "
-"infill speed above. Set to zero for auto."
+"Speed for printing solid regions (top/bottom/internal horizontal shells). This "
+"can be expressed as a percentage (for example: 80%) over the default infill "
+"speed above. Set to zero for auto."
msgstr ""
"Velocidade para imprimir regiões sólidas (topo/fundo/perímetros externos "
-"horizontais internas). Isto pode ser expresso em porcentagem(por exemplo: "
-"80%) sobre a velocidade de preenchimento padrão acima. Defina como zero para "
-"auto."
+"horizontais internas). Isto pode ser expresso em porcentagem(por exemplo: 80%) "
+"sobre a velocidade de preenchimento padrão acima. Defina como zero para auto."
-#: src/libslic3r/PrintConfig.cpp:1781
+#: src/libslic3r/PrintConfig.cpp:1981
msgid "Number of solid layers to generate on top and bottom surfaces."
-msgstr ""
-"Número de camadas sólidas a serem geradas nas interfaces do topo e base."
+msgstr "Número de camadas sólidas a serem geradas nas interfaces do topo e base."
-#: src/libslic3r/PrintConfig.cpp:1787 src/libslic3r/PrintConfig.cpp:1788
+#: src/libslic3r/PrintConfig.cpp:1987 src/libslic3r/PrintConfig.cpp:1988
msgid "Minimum thickness of a top / bottom shell"
msgstr "Espessura mínima de uma parede superior/inferior"
-#: src/libslic3r/PrintConfig.cpp:1794
+#: src/libslic3r/PrintConfig.cpp:1994
msgid "Spiral vase"
msgstr "Vaso espiral"
-#: src/libslic3r/PrintConfig.cpp:1795
+#: src/libslic3r/PrintConfig.cpp:1995
msgid ""
"This feature will raise Z gradually while printing a single-walled object in "
-"order to remove any visible seam. This option requires a single perimeter, "
-"no infill, no top solid layers and no support material. You can still set "
-"any number of bottom solid layers as well as skirt/brim loops. It won't work "
-"when printing more than an object."
+"order to remove any visible seam. This option requires a single perimeter, no "
+"infill, no top solid layers and no support material. You can still set any "
+"number of bottom solid layers as well as skirt/brim loops. It won't work when "
+"printing more than one single object."
msgstr ""
"Este recurso irá elevar Z gradualmente durante a impressão de um objeto de "
"parede única, a fim de remover qualquer costura visível. Esta opção exige um "
-"único perímetro, nenhum preenchimento, nenhumas camadas contínuas superiores "
-"e nenhum material de sustentação. Você ainda pode definir qualquer número de "
-"camadas sólidas de fundo, bem como saia/aba voltas. Ele não funcionará ao "
+"único perímetro, nenhum preenchimento, nenhumas camadas contínuas superiores e "
+"nenhum material de sustentação. Você ainda pode definir qualquer número de "
+"camadas sólidas de fundo, bem como voltas de saia/aba. Ele não funcionará ao "
"imprimir mais de um objeto."
-#: src/libslic3r/PrintConfig.cpp:1803
+#: src/libslic3r/PrintConfig.cpp:2003
msgid "Temperature variation"
msgstr "Variação de temperatura"
-#: src/libslic3r/PrintConfig.cpp:1804
+#: src/libslic3r/PrintConfig.cpp:2004
msgid ""
-"Temperature difference to be applied when an extruder is not active. Enables "
-"a full-height \"sacrificial\" skirt on which the nozzles are periodically "
-"wiped."
+"Temperature difference to be applied when an extruder is not active. Enables a "
+"full-height \"sacrificial\" skirt on which the nozzles are periodically wiped."
msgstr ""
"Diferença de temperatura a ser aplicada quando uma extrusora não está ativa. "
"Permite uma saia \"sacrificial\" em que as ponteiras são limpadas "
"periodicamente."
-#: src/libslic3r/PrintConfig.cpp:1814
+#: src/libslic3r/PrintConfig.cpp:2014
msgid ""
"This start procedure is inserted at the beginning, after bed has reached the "
-"target temperature and extruder just started heating, and before extruder "
-"has finished heating. If PrusaSlicer detects M104 or M190 in your custom "
-"codes, such commands will not be prepended automatically so you're free to "
-"customize the order of heating commands and other custom actions. Note that "
-"you can use placeholder variables for all PrusaSlicer settings, so you can "
-"put a \"M109 S[first_layer_temperature]\" command wherever you want."
+"target temperature and extruder just started heating, and before extruder has "
+"finished heating. If PrusaSlicer detects M104 or M190 in your custom codes, "
+"such commands will not be prepended automatically so you're free to customize "
+"the order of heating commands and other custom actions. Note that you can use "
+"placeholder variables for all PrusaSlicer settings, so you can put a \"M109 "
+"S[first_layer_temperature]\" command wherever you want."
msgstr ""
"Este procedimento do começo é introduzido no início, depois que a mesa "
"alcançou a temperatura alvo e a extrusora apenas começou o aquecimento, e "
-"antes que a extrusora terminasse o aquecimento. Se PrusaSlicer detecta M104 "
-"ou M190 em seus códigos personalizados, esses comandos não serão precedidos "
+"antes que a extrusora terminasse o aquecimento. Se PrusaSlicer detecta M104 ou "
+"M190 em seus códigos personalizados, esses comandos não serão precedidos "
"automaticamente para que você esteja livre para personalizar a ordem dos "
"comandos de aquecimento e outras ações personalizadas. Observe que você pode "
-"usar variáveis de espaço reservado para todas as config. de PrusaSlicer, "
-"para que você possa colocar um comando \"M109 S "
-"[temperatura_primeira_camada]\" onde quiser."
+"usar variáveis de espaço reservado para todas as config. de PrusaSlicer, para "
+"que você possa colocar um comando \"M109 S [temperatura_primeira_camada]\" "
+"onde quiser."
-#: src/libslic3r/PrintConfig.cpp:1829
+#: src/libslic3r/PrintConfig.cpp:2029
msgid ""
"This start procedure is inserted at the beginning, after any printer start "
"gcode (and after any toolchange to this filament in case of multi-material "
@@ -9315,28 +11346,44 @@ msgstr ""
"Este procedimento de início é inserido no começo, depois de qualquer "
"impressora iniciar Gcode (e depois de qualquer troca de ferramenta para este "
"filamento em caso de impressoras de vários materiais). Isso é usado para "
-"substituir as config. de um filamento específico. Se PrusaSlicer detecta "
-"M104, M109, M140 ou M190 em seus códigos personalizados, esses comandos não "
-"serão precedidos automaticamente para que você esteja livre para "
-"personalizar a ordem dos comandos de aquecimento e outras ações "
-"personalizadas. Observe que você pode usar variáveis de espaço reservado "
-"para todas as config. de PrusaSlicer, para que você possa colocar um comando "
-"\"M109 S [temperatura_primeira_camada]\" onde quiser. Se você tiver várias "
-"extrusoras, o Gcode é processado em ordem de extrusora."
-
-#: src/libslic3r/PrintConfig.cpp:1845
+"substituir as config. de um filamento específico. Se PrusaSlicer detecta M104, "
+"M109, M140 ou M190 em seus códigos personalizados, esses comandos não serão "
+"precedidos automaticamente para que você esteja livre para personalizar a "
+"ordem dos comandos de aquecimento e outras ações personalizadas. Observe que "
+"você pode usar variáveis de espaço reservado para todas as config. de "
+"PrusaSlicer, para que você possa colocar um comando \"M109 S "
+"[temperatura_primeira_camada]\" onde quiser. Se você tiver várias extrusoras, "
+"o Gcode é processado em ordem de extrusora."
+
+#: src/libslic3r/PrintConfig.cpp:2045
+msgid "Color change G-code"
+msgstr "G-code de troca de ferramenta"
+
+#: src/libslic3r/PrintConfig.cpp:2046
+msgid "This G-code will be used as a code for the color change"
+msgstr "Este G-code será usado como um código para a mudança de cor"
+
+#: src/libslic3r/PrintConfig.cpp:2055
+msgid "This G-code will be used as a code for the pause print"
+msgstr "Este G-code será usado como um código para pausar a impressora"
+
+#: src/libslic3r/PrintConfig.cpp:2064
+msgid "This G-code will be used as a custom code"
+msgstr "Este G-code será usado como um código customizado"
+
+#: src/libslic3r/PrintConfig.cpp:2072
msgid "Single Extruder Multi Material"
msgstr "Única extrusora multi material"
-#: src/libslic3r/PrintConfig.cpp:1846
+#: src/libslic3r/PrintConfig.cpp:2073
msgid "The printer multiplexes filaments into a single hot end."
msgstr "A impressora multiplexes filamentos em uma única extremidade quente."
-#: src/libslic3r/PrintConfig.cpp:1851
+#: src/libslic3r/PrintConfig.cpp:2078
msgid "Prime all printing extruders"
msgstr "Extrusar todas as extrusoras de impressão"
-#: src/libslic3r/PrintConfig.cpp:1852
+#: src/libslic3r/PrintConfig.cpp:2079
msgid ""
"If enabled, all printing extruders will be primed at the front edge of the "
"print bed at the start of the print."
@@ -9344,62 +11391,60 @@ msgstr ""
"Se ativada, todas as extrusoras de impressão extrusarão na aba dianteira da "
"mesa de impressão no início da impressão."
-#: src/libslic3r/PrintConfig.cpp:1857
+#: src/libslic3r/PrintConfig.cpp:2084
msgid "No sparse layers (EXPERIMENTAL)"
msgstr "Sem camadas esparsas (EXPERIMENTAL)"
-#: src/libslic3r/PrintConfig.cpp:1858
+#: src/libslic3r/PrintConfig.cpp:2085
msgid ""
-"If enabled, the wipe tower will not be printed on layers with no "
-"toolchanges. On layers with a toolchange, extruder will travel downward to "
-"print the wipe tower. User is responsible for ensuring there is no collision "
-"with the print."
+"If enabled, the wipe tower will not be printed on layers with no toolchanges. "
+"On layers with a toolchange, extruder will travel downward to print the wipe "
+"tower. User is responsible for ensuring there is no collision with the print."
msgstr ""
-"Se ativada, a torre de limpeza não será impressa em camadas sem alterações "
-"de ferramentas. Em camadas com uma troca de ferramentas, o extrusor viajará "
-"para baixo para imprimir a torre de limpeza. O usuário é responsável por "
-"garantir que não haja colisão com a impressão."
+"Se ativada, a torre de limpeza não será impressa em camadas sem alterações de "
+"ferramentas. Em camadas com uma troca de ferramentas, o extrusor viajará para "
+"baixo para imprimir a torre de limpeza. O usuário é responsável por garantir "
+"que não haja colisão com a impressão."
-#: src/libslic3r/PrintConfig.cpp:1865
+#: src/libslic3r/PrintConfig.cpp:2092
msgid "Generate support material"
msgstr "Gerar material de suporte"
-#: src/libslic3r/PrintConfig.cpp:1867
+#: src/libslic3r/PrintConfig.cpp:2094
msgid "Enable support material generation."
msgstr "Habilitar geração de material de suporte."
-#: src/libslic3r/PrintConfig.cpp:1871
+#: src/libslic3r/PrintConfig.cpp:2098
msgid "Auto generated supports"
msgstr "Gerar suportes automaticamente"
-#: src/libslic3r/PrintConfig.cpp:1873
+#: src/libslic3r/PrintConfig.cpp:2100
msgid ""
"If checked, supports will be generated automatically based on the overhang "
-"threshold value. If unchecked, supports will be generated inside the "
-"\"Support Enforcer\" volumes only."
+"threshold value. If unchecked, supports will be generated inside the \"Support "
+"Enforcer\" volumes only."
msgstr ""
"Se marcada, os suportes serão gerados automaticamente com base no valor do "
"limite de angulação. Se desmarcada, as sustentações serão geradas dentro dos "
"volumes do \"reforçador de suporte\" somente."
-#: src/libslic3r/PrintConfig.cpp:1879
+#: src/libslic3r/PrintConfig.cpp:2106
msgid "XY separation between an object and its support"
msgstr "Separação entre o objeto e seu suporte em XY"
-#: src/libslic3r/PrintConfig.cpp:1881
+#: src/libslic3r/PrintConfig.cpp:2108
msgid ""
"XY separation between an object and its support. If expressed as percentage "
"(for example 50%), it will be calculated over external perimeter width."
msgstr ""
"Separação entre o objeto e seu suporte em XY. Se expresso como porcentagem "
-"(por exemplo, 50%), será calculado com base na espessura do perímetro "
-"externo."
+"(por exemplo, 50%), será calculado com base na espessura do perímetro externo."
-#: src/libslic3r/PrintConfig.cpp:1891
+#: src/libslic3r/PrintConfig.cpp:2118
msgid "Pattern angle"
msgstr "Ângulo do padrão"
-#: src/libslic3r/PrintConfig.cpp:1893
+#: src/libslic3r/PrintConfig.cpp:2120
msgid ""
"Use this setting to rotate the support material pattern on the horizontal "
"plane."
@@ -9407,7 +11452,7 @@ msgstr ""
"Use essa config. para girar o padrão de material de suporte no plano "
"horizontal."
-#: src/libslic3r/PrintConfig.cpp:1903 src/libslic3r/PrintConfig.cpp:2686
+#: src/libslic3r/PrintConfig.cpp:2130 src/libslic3r/PrintConfig.cpp:2925
msgid ""
"Only create support if it lies on a build plate. Don't create support on a "
"print."
@@ -9415,11 +11460,11 @@ msgstr ""
"Apenas criar suporte se ele está em uma mesa. Não crie suporte em uma "
"impressão."
-#: src/libslic3r/PrintConfig.cpp:1909
+#: src/libslic3r/PrintConfig.cpp:2136
msgid "Contact Z distance"
msgstr "Distância de contato Z"
-#: src/libslic3r/PrintConfig.cpp:1911
+#: src/libslic3r/PrintConfig.cpp:2138
msgid ""
"The vertical distance between object and support material interface. Setting "
"this to 0 will also prevent Slic3r from using bridge flow and speed for the "
@@ -9429,24 +11474,24 @@ msgstr ""
"Definir isso como 0 também impedirá Slic3r de usar o fluxo de ponte e a "
"velocidade para a primeira camada de objeto."
-#: src/libslic3r/PrintConfig.cpp:1918
+#: src/libslic3r/PrintConfig.cpp:2145
msgid "0 (soluble)"
msgstr "0 (solúvel)"
-#: src/libslic3r/PrintConfig.cpp:1919
+#: src/libslic3r/PrintConfig.cpp:2146
msgid "0.2 (detachable)"
msgstr "0.2 (destacável)"
-#: src/libslic3r/PrintConfig.cpp:1924
+#: src/libslic3r/PrintConfig.cpp:2151
msgid "Enforce support for the first"
msgstr "Reforçar suportes para a(s) primeira(s)"
-#: src/libslic3r/PrintConfig.cpp:1926
+#: src/libslic3r/PrintConfig.cpp:2153
msgid ""
"Generate support material for the specified number of layers counting from "
"bottom, regardless of whether normal support material is enabled or not and "
-"regardless of any angle threshold. This is useful for getting more adhesion "
-"of objects having a very thin or poor footprint on the build plate."
+"regardless of any angle threshold. This is useful for getting more adhesion of "
+"objects having a very thin or poor footprint on the build plate."
msgstr ""
"Gere material de suporte para o número especificado de camadas que contam da "
"parte inferior, independentemente de o material de suporte normal estar "
@@ -9454,64 +11499,63 @@ msgstr ""
"para obter mais aderência de objetos com uma pegada muito fina ou fraca na "
"placa de construção."
-#: src/libslic3r/PrintConfig.cpp:1931
+#: src/libslic3r/PrintConfig.cpp:2158
msgid "Enforce support for the first n layers"
msgstr "Reforçar suportes na(s) primera(s) n camada(s)"
-#: src/libslic3r/PrintConfig.cpp:1937
+#: src/libslic3r/PrintConfig.cpp:2164
msgid "Support material/raft/skirt extruder"
msgstr "Extrusora de material de suporte/estrado/saia"
-#: src/libslic3r/PrintConfig.cpp:1939
+#: src/libslic3r/PrintConfig.cpp:2166
msgid ""
"The extruder to use when printing support material, raft and skirt (1+, 0 to "
"use the current extruder to minimize tool changes)."
msgstr ""
-"A extrusora a ser usada ao imprimir material de suporte, estrado e saia (1 "
-"+, 0 para usar a extrusora atual para minimizar as mudanças na ferramenta)."
+"A extrusora a ser usada ao imprimir material de suporte, estrado e saia (1 +, "
+"0 para usar a extrusora atual para minimizar as mudanças na ferramenta)."
-#: src/libslic3r/PrintConfig.cpp:1948
+#: src/libslic3r/PrintConfig.cpp:2175
msgid ""
"Set this to a non-zero value to set a manual extrusion width for support "
-"material. If left zero, default extrusion width will be used if set, "
-"otherwise nozzle diameter will be used. If expressed as percentage (for "
-"example 90%) it will be computed over layer height."
+"material. If left zero, default extrusion width will be used if set, otherwise "
+"nozzle diameter will be used. If expressed as percentage (for example 90%) it "
+"will be computed over layer height."
msgstr ""
"Defina isso como um valor diferente de zero para definir uma largura de "
-"extrusão manual para material de suporte. Se deixada em zero, a largura "
-"padrão da extrusão será usada, se não o diâmetro da ponteira será usado. Se "
-"expresso em porcentagem(por exemplo, 90%) Ele será calculado sobre a altura "
-"da camada."
+"extrusão manual para material de suporte. Se deixada em zero, a largura padrão "
+"da extrusão será usada, se não o diâmetro da ponteira será usado. Se expresso "
+"em porcentagem(por exemplo, 90%) Ele será calculado sobre a altura da camada."
-#: src/libslic3r/PrintConfig.cpp:1957
+#: src/libslic3r/PrintConfig.cpp:2184
msgid "Interface loops"
msgstr "Voltas da interface"
-#: src/libslic3r/PrintConfig.cpp:1959
+#: src/libslic3r/PrintConfig.cpp:2186
msgid ""
"Cover the top contact layer of the supports with loops. Disabled by default."
msgstr ""
"Cubra a camada de contato superior dos suportes com laços. Desativado por "
"padrão."
-#: src/libslic3r/PrintConfig.cpp:1964
+#: src/libslic3r/PrintConfig.cpp:2191
msgid "Support material/raft interface extruder"
msgstr "Extrusora de material de suporte/estrado"
-#: src/libslic3r/PrintConfig.cpp:1966
+#: src/libslic3r/PrintConfig.cpp:2193
msgid ""
-"The extruder to use when printing support material interface (1+, 0 to use "
-"the current extruder to minimize tool changes). This affects raft too."
+"The extruder to use when printing support material interface (1+, 0 to use the "
+"current extruder to minimize tool changes). This affects raft too."
msgstr ""
"A extrusora para usar ao imprimir a relação material do apoio (1 +, 0 para "
"usar o extrusor atual para minimizar mudanças da ferramenta). Isso afeta o "
"estrado também."
-#: src/libslic3r/PrintConfig.cpp:1973
+#: src/libslic3r/PrintConfig.cpp:2200
msgid "Interface layers"
msgstr "Camadas de interface"
-#: src/libslic3r/PrintConfig.cpp:1975
+#: src/libslic3r/PrintConfig.cpp:2202
msgid ""
"Number of interface layers to insert between the object(s) and support "
"material."
@@ -9519,55 +11563,54 @@ msgstr ""
"Número de camadas de interface para inserir entre o objeto(s) e material de "
"suporte."
-#: src/libslic3r/PrintConfig.cpp:1982
+#: src/libslic3r/PrintConfig.cpp:2209
msgid "Interface pattern spacing"
msgstr "Espaçamento do padrão da interface"
-#: src/libslic3r/PrintConfig.cpp:1984
+#: src/libslic3r/PrintConfig.cpp:2211
msgid "Spacing between interface lines. Set zero to get a solid interface."
msgstr ""
-"Espaçamento entre as linhas de interface. Defina zero para obter uma "
-"interface sólida."
+"Espaçamento entre as linhas de interface. Defina zero para obter uma interface "
+"sólida."
-#: src/libslic3r/PrintConfig.cpp:1993
+#: src/libslic3r/PrintConfig.cpp:2220
msgid ""
"Speed for printing support material interface layers. If expressed as "
-"percentage (for example 50%) it will be calculated over support material "
-"speed."
+"percentage (for example 50%) it will be calculated over support material speed."
msgstr ""
"Velocidade para camadas de interface de material de suporte de impressão. Se "
"expresso em porcentagem(por exemplo, 50%) Ele será calculado sobre a "
"velocidade do material de suporte."
-#: src/libslic3r/PrintConfig.cpp:2002
+#: src/libslic3r/PrintConfig.cpp:2229
msgid "Pattern"
msgstr "Padrão"
-#: src/libslic3r/PrintConfig.cpp:2004
+#: src/libslic3r/PrintConfig.cpp:2231
msgid "Pattern used to generate support material."
msgstr "Padrão usado para gerar material de suporte."
-#: src/libslic3r/PrintConfig.cpp:2010
+#: src/libslic3r/PrintConfig.cpp:2237
msgid "Rectilinear grid"
msgstr "Grade rectilínea"
-#: src/libslic3r/PrintConfig.cpp:2016
+#: src/libslic3r/PrintConfig.cpp:2243
msgid "Pattern spacing"
msgstr "Padrão de espaçamento"
-#: src/libslic3r/PrintConfig.cpp:2018
+#: src/libslic3r/PrintConfig.cpp:2245
msgid "Spacing between support material lines."
msgstr "Espaçamento entre linhas de material de suporte."
-#: src/libslic3r/PrintConfig.cpp:2027
+#: src/libslic3r/PrintConfig.cpp:2254
msgid "Speed for printing support material."
msgstr "Velocidade para imprimir material de suporte."
-#: src/libslic3r/PrintConfig.cpp:2034
+#: src/libslic3r/PrintConfig.cpp:2261
msgid "Synchronize with object layers"
msgstr "Sincronizar com camadas de objeto"
-#: src/libslic3r/PrintConfig.cpp:2036
+#: src/libslic3r/PrintConfig.cpp:2263
msgid ""
"Synchronize support layers with the object print layers. This is useful with "
"multi-material printers, where the extruder switch is expensive."
@@ -9576,162 +11619,165 @@ msgstr ""
"útil com as impressoras do multi-material, onde o interruptor da extrusora é "
"caro."
-#: src/libslic3r/PrintConfig.cpp:2042
+#: src/libslic3r/PrintConfig.cpp:2269
msgid "Overhang threshold"
msgstr "Limite de angulação"
-#: src/libslic3r/PrintConfig.cpp:2044
+#: src/libslic3r/PrintConfig.cpp:2271
msgid ""
-"Support material will not be generated for overhangs whose slope angle (90° "
-"= vertical) is above the given threshold. In other words, this value "
-"represent the most horizontal slope (measured from the horizontal plane) "
-"that you can print without support material. Set to zero for automatic "
-"detection (recommended)."
+"Support material will not be generated for overhangs whose slope angle (90° = "
+"vertical) is above the given threshold. In other words, this value represent "
+"the most horizontal slope (measured from the horizontal plane) that you can "
+"print without support material. Set to zero for automatic detection "
+"(recommended)."
msgstr ""
"O material de suporte não será gerado para angulações cujo ângulo de "
"inclinação (90 ° = vertical) esteja acima do limite determinado. Em outras "
-"palavras, esse valor representa a inclinação mais horizontal (medida a "
-"partir do plano horizontal) que você pode imprimir sem material de suporte. "
-"Defina como zero para detecção automática (recomendado)."
+"palavras, esse valor representa a inclinação mais horizontal (medida a partir "
+"do plano horizontal) que você pode imprimir sem material de suporte. Defina "
+"como zero para detecção automática (recomendado)."
-#: src/libslic3r/PrintConfig.cpp:2056
+#: src/libslic3r/PrintConfig.cpp:2283
msgid "With sheath around the support"
msgstr "Com bainha em torno do apoio"
-#: src/libslic3r/PrintConfig.cpp:2058
+#: src/libslic3r/PrintConfig.cpp:2285
msgid ""
-"Add a sheath (a single perimeter line) around the base support. This makes "
-"the support more reliable, but also more difficult to remove."
+"Add a sheath (a single perimeter line) around the base support. This makes the "
+"support more reliable, but also more difficult to remove."
msgstr ""
"Adicione uma bainha (uma única linha de perímetro) em torno do suporte base. "
"Isso torna o suporte mais confiável, mas também mais difícil de remover."
-#: src/libslic3r/PrintConfig.cpp:2065
+#: src/libslic3r/PrintConfig.cpp:2292
msgid ""
-"Extruder temperature for layers after the first one. Set this to zero to "
-"disable temperature control commands in the output."
+"Nozzle temperature for layers after the first one. Set this to zero to disable "
+"temperature control commands in the output G-code."
msgstr ""
-"Temperatura da extrusora para camadas após a primeira. Defina como zero para "
-"desabilitar os comandos de controle de temperatura na saída."
+"Temperatura da mesa para camadas após a primeira. Defina isso como zero para "
+"desabilitar os comandos de controle de temperatura da mesa na saída do G-code."
-#: src/libslic3r/PrintConfig.cpp:2073
+#: src/libslic3r/PrintConfig.cpp:2295
+msgid "Nozzle temperature"
+msgstr "Temperatura do Bico"
+
+#: src/libslic3r/PrintConfig.cpp:2301
msgid "Detect thin walls"
msgstr "Detectar paredes finas"
-#: src/libslic3r/PrintConfig.cpp:2075
+#: src/libslic3r/PrintConfig.cpp:2303
msgid ""
-"Detect single-width walls (parts where two extrusions don't fit and we need "
-"to collapse them into a single trace)."
+"Detect single-width walls (parts where two extrusions don't fit and we need to "
+"collapse them into a single trace)."
msgstr ""
"Detecte paredes de largura única (partes onde duas extrusões não cabem e "
"precisamos recolhê-las em um único traço)."
-#: src/libslic3r/PrintConfig.cpp:2081
+#: src/libslic3r/PrintConfig.cpp:2309
msgid "Threads"
msgstr "Roscas"
-#: src/libslic3r/PrintConfig.cpp:2082
+#: src/libslic3r/PrintConfig.cpp:2310
msgid ""
-"Threads are used to parallelize long-running tasks. Optimal threads number "
-"is slightly above the number of available cores/processors."
+"Threads are used to parallelize long-running tasks. Optimal threads number is "
+"slightly above the number of available cores/processors."
msgstr ""
-"Tópicos são usados para paralelizar tarefas de execução demorada. O número "
-"de tópicos ideais está ligeiramente acima do número de núcleos/processadores "
+"Tópicos são usados para paralelizar tarefas de execução demorada. O número de "
+"tópicos ideais está ligeiramente acima do número de núcleos/processadores "
"disponíveis."
-#: src/libslic3r/PrintConfig.cpp:2094
+#: src/libslic3r/PrintConfig.cpp:2322
msgid ""
"This custom code is inserted before every toolchange. Placeholder variables "
"for all PrusaSlicer settings as well as {previous_extruder} and "
-"{next_extruder} can be used. When a tool-changing command which changes to "
-"the correct extruder is included (such as T{next_extruder}), PrusaSlicer "
-"will emit no other such command. It is therefore possible to script custom "
-"behaviour both before and after the toolchange."
+"{next_extruder} can be used. When a tool-changing command which changes to the "
+"correct extruder is included (such as T{next_extruder}), PrusaSlicer will emit "
+"no other such command. It is therefore possible to script custom behaviour "
+"both before and after the toolchange."
msgstr ""
"Este código personalizado é inserido antes de cada troca de ferramenta. "
"Variáveis de espaço reservado para todas as config. de PrusaSlicer, bem como "
"{previous_extruder} e {next_extruder} podem ser usadas. Quando um comando de "
-"mudança de ferramenta que muda para a extrusora correta está incluído (como "
-"T {next_extruder}), PrusaSlicer emitirá nenhum outro comando tal. Portanto, "
-"é possível script comportamento personalizado antes e depois da mudança de "
+"mudança de ferramenta que muda para a extrusora correta está incluído (como T "
+"{next_extruder}), PrusaSlicer emitirá nenhum outro comando tal. Portanto, é "
+"possível script comportamento personalizado antes e depois da mudança de "
"ferramenta."
-#: src/libslic3r/PrintConfig.cpp:2107
+#: src/libslic3r/PrintConfig.cpp:2335
msgid ""
"Set this to a non-zero value to set a manual extrusion width for infill for "
"top surfaces. You may want to use thinner extrudates to fill all narrow "
-"regions and get a smoother finish. If left zero, default extrusion width "
-"will be used if set, otherwise nozzle diameter will be used. If expressed as "
+"regions and get a smoother finish. If left zero, default extrusion width will "
+"be used if set, otherwise nozzle diameter will be used. If expressed as "
"percentage (for example 90%) it will be computed over layer height."
msgstr ""
"Defina isso como um valor diferente de zero para definir uma largura de "
"extrusão manual para preenchimento para superfícies superiores. Você pode "
"querer usar extrusões mais finos para preencher todas as regiões estreitas e "
"obter um acabamento mais suave. Se a esquerda zero, a largura padrão da "
-"extrusão será usada se ajustado, se não o diâmetro da ponteira será usado. "
-"Se expresso em porcentagem(por exemplo, 90%) Ele será calculado sobre a "
-"altura da camada."
+"extrusão será usada se ajustado, se não o diâmetro da ponteira será usado. Se "
+"expresso em porcentagem(por exemplo, 90%) Ele será calculado sobre a altura da "
+"camada."
-#: src/libslic3r/PrintConfig.cpp:2119
+#: src/libslic3r/PrintConfig.cpp:2347
msgid ""
-"Speed for printing top solid layers (it only applies to the uppermost "
-"external layers and not to their internal solid layers). You may want to "
-"slow down this to get a nicer surface finish. This can be expressed as a "
-"percentage (for example: 80%) over the solid infill speed above. Set to zero "
-"for auto."
+"Speed for printing top solid layers (it only applies to the uppermost external "
+"layers and not to their internal solid layers). You may want to slow down this "
+"to get a nicer surface finish. This can be expressed as a percentage (for "
+"example: 80%) over the solid infill speed above. Set to zero for auto."
msgstr ""
"Velocidade para imprimir camadas sólidas superiores (só se aplica às camadas "
-"externas superiores e não às suas camadas sólidas internas). Você pode "
-"querer diminuir este para ter um revestimento de superfície mais agradável. "
-"Isto pode ser expresso em porcentagem(por exemplo: 80%) sobre a velocidade "
-"de preenchimento sólido acima. Defina como zero para auto."
+"externas superiores e não às suas camadas sólidas internas). Você pode querer "
+"diminuir este para ter um revestimento de superfície mais agradável. Isto pode "
+"ser expresso em porcentagem(por exemplo: 80%) sobre a velocidade de "
+"preenchimento sólido acima. Defina como zero para auto."
-#: src/libslic3r/PrintConfig.cpp:2134
+#: src/libslic3r/PrintConfig.cpp:2362
msgid "Number of solid layers to generate on top surfaces."
msgstr "Número de camadas sólidas para gerar em superfícies superiores."
-#: src/libslic3r/PrintConfig.cpp:2135
+#: src/libslic3r/PrintConfig.cpp:2363
msgid "Top solid layers"
msgstr "Camadas sólidas de topo"
-#: src/libslic3r/PrintConfig.cpp:2143
+#: src/libslic3r/PrintConfig.cpp:2371
msgid ""
"The number of top solid layers is increased above top_solid_layers if "
-"necessary to satisfy minimum thickness of top shell. This is useful to "
-"prevent pillowing effect when printing with variable layer height."
+"necessary to satisfy minimum thickness of top shell. This is useful to prevent "
+"pillowing effect when printing with variable layer height."
msgstr ""
"O número de camadas sólidas superiores é aumentado acima de top_solid_layers "
"se necessário para satisfazer a espessura mínima da camada superior. Isso é "
"útil para evitar o efeito de travesseiro ao imprimir com altura de camada "
"variável."
-#: src/libslic3r/PrintConfig.cpp:2146
+#: src/libslic3r/PrintConfig.cpp:2374
msgid "Minimum top shell thickness"
msgstr "Espessura mínima vertical da parede"
-#: src/libslic3r/PrintConfig.cpp:2153
+#: src/libslic3r/PrintConfig.cpp:2381
msgid "Speed for travel moves (jumps between distant extrusion points)."
msgstr ""
"Velocidade para movimentos de viagem (saltos entre pontos de extrusão "
"distantes)."
-#: src/libslic3r/PrintConfig.cpp:2161
+#: src/libslic3r/PrintConfig.cpp:2389
msgid "Use firmware retraction"
msgstr "Usar retração do firmware"
-#: src/libslic3r/PrintConfig.cpp:2162
+#: src/libslic3r/PrintConfig.cpp:2390
msgid ""
"This experimental setting uses G10 and G11 commands to have the firmware "
"handle the retraction. This is only supported in recent Marlin."
msgstr ""
-"Esta config. experimental usa comandos G10 e G11 para que o firmware "
-"manipule a retração. Isso só é suportado no recente Marlin."
+"Esta config. experimental usa comandos G10 e G11 para que o firmware manipule "
+"a retração. Isso só é suportado no recente Marlin."
-#: src/libslic3r/PrintConfig.cpp:2168
+#: src/libslic3r/PrintConfig.cpp:2396
msgid "Use relative E distances"
msgstr "Utilizar distâncias relativas do E"
-#: src/libslic3r/PrintConfig.cpp:2169
+#: src/libslic3r/PrintConfig.cpp:2397
msgid ""
"If your firmware requires relative E values, check this, otherwise leave it "
"unchecked. Most firmwares use absolute values."
@@ -9739,118 +11785,118 @@ msgstr ""
"Se o firmware necessitar de valores relativos E, verifique isto, caso "
"contrário, deixe-o desmarcado. A maioria dos firmwares usa valores absolutos."
-#: src/libslic3r/PrintConfig.cpp:2175
+#: src/libslic3r/PrintConfig.cpp:2403
msgid "Use volumetric E"
msgstr "Usar E volumétrico"
-#: src/libslic3r/PrintConfig.cpp:2176
+#: src/libslic3r/PrintConfig.cpp:2404
msgid ""
"This experimental setting uses outputs the E values in cubic millimeters "
-"instead of linear millimeters. If your firmware doesn't already know "
-"filament diameter(s), you can put commands like 'M200 D[filament_diameter_0] "
-"T0' in your start G-code in order to turn volumetric mode on and use the "
-"filament diameter associated to the filament selected in Slic3r. This is "
-"only supported in recent Marlin."
-msgstr ""
-"Essa config. experimental usa saídas os valores E em milímetros cúbicos em "
-"vez de milímetros lineares. Se o firmware já não souber o diâmetro (s) do "
-"filamento, você pode colocar comandos como ' m 200 D [filament_diameter_0] "
-"T0 ' no seu G-code inicial para ativar o modo volumétrico e usar o diâmetro "
-"do filamento associado ao filamento selecionado em Slic3r. Isso só é "
-"suportado no recente Marlin."
+"instead of linear millimeters. If your firmware doesn't already know filament "
+"diameter(s), you can put commands like 'M200 D[filament_diameter_0] T0' in "
+"your start G-code in order to turn volumetric mode on and use the filament "
+"diameter associated to the filament selected in Slic3r. This is only supported "
+"in recent Marlin."
+msgstr ""
+"Essa config. experimental usa saídas os valores E em milímetros cúbicos em vez "
+"de milímetros lineares. Se o firmware já não souber o diâmetro (s) do "
+"filamento, você pode colocar comandos como ' m 200 D [filament_diameter_0] T0 "
+"' no seu G-code inicial para ativar o modo volumétrico e usar o diâmetro do "
+"filamento associado ao filamento selecionado em Slic3r. Isso só é suportado no "
+"recente Marlin."
-#: src/libslic3r/PrintConfig.cpp:2186
+#: src/libslic3r/PrintConfig.cpp:2414
msgid "Enable variable layer height feature"
msgstr "Habilitar altura de camada variável"
-#: src/libslic3r/PrintConfig.cpp:2187
+#: src/libslic3r/PrintConfig.cpp:2415
msgid ""
-"Some printers or printer setups may have difficulties printing with a "
-"variable layer height. Enabled by default."
+"Some printers or printer setups may have difficulties printing with a variable "
+"layer height. Enabled by default."
msgstr ""
"Algumas impressoras ou config. de impressora podem ter dificuldades para "
"imprimir com uma altura de camada variável. Ativado por padrão."
-#: src/libslic3r/PrintConfig.cpp:2193
+#: src/libslic3r/PrintConfig.cpp:2421
msgid "Wipe while retracting"
msgstr "Limpe durante a retração"
-#: src/libslic3r/PrintConfig.cpp:2194
+#: src/libslic3r/PrintConfig.cpp:2422
msgid ""
-"This flag will move the nozzle while retracting to minimize the possible "
-"blob on leaky extruders."
+"This flag will move the nozzle while retracting to minimize the possible blob "
+"on leaky extruders."
msgstr ""
-"Esta bandeira moverá a ponteira ao retrair para minimizar a bolha possível "
-"em extrusoras vazando."
+"Esta bandeira moverá a ponteira ao retrair para minimizar a bolha possível em "
+"extrusoras vazando."
-#: src/libslic3r/PrintConfig.cpp:2201
+#: src/libslic3r/PrintConfig.cpp:2429
msgid ""
-"Multi material printers may need to prime or purge extruders on tool "
-"changes. Extrude the excess material into the wipe tower."
+"Multi material printers may need to prime or purge extruders on tool changes. "
+"Extrude the excess material into the wipe tower."
msgstr ""
"Várias impressoras de multi-material podem precisar purgar extrusoras em "
"alterações de ferramenta. EXTRUDE o excesso de material para a torre de "
"limpeza."
-#: src/libslic3r/PrintConfig.cpp:2207
+#: src/libslic3r/PrintConfig.cpp:2435
msgid "Purging volumes - load/unload volumes"
msgstr "Volumes de purga-volumes de carga/descarregamento"
-#: src/libslic3r/PrintConfig.cpp:2208
+#: src/libslic3r/PrintConfig.cpp:2436
msgid ""
"This vector saves required volumes to change from/to each tool used on the "
"wipe tower. These values are used to simplify creation of the full purging "
"volumes below."
msgstr ""
"Este vetor salva os volumes necessários para mudar de/para cada ferramenta "
-"usada na torre de limpeza. Esses valores são usados para simplificar a "
-"criação dos volumes de purga completos abaixo."
+"usada na torre de limpeza. Esses valores são usados para simplificar a criação "
+"dos volumes de purga completos abaixo."
-#: src/libslic3r/PrintConfig.cpp:2214
+#: src/libslic3r/PrintConfig.cpp:2442
msgid "Purging volumes - matrix"
msgstr "Volumes de purga-matriz"
-#: src/libslic3r/PrintConfig.cpp:2215
+#: src/libslic3r/PrintConfig.cpp:2443
msgid ""
-"This matrix describes volumes (in cubic milimetres) required to purge the "
-"new filament on the wipe tower for any given pair of tools."
+"This matrix describes volumes (in cubic milimetres) required to purge the new "
+"filament on the wipe tower for any given pair of tools."
msgstr ""
-"Esta matriz descreve volumes (em milimetros cúbicos) necessários para limpar "
-"o novo filamento na torre de limpeza para qualquer dado par de ferramentas."
+"Esta matriz descreve volumes (em milimetros cúbicos) necessários para limpar o "
+"novo filamento na torre de limpeza para qualquer dado par de ferramentas."
-#: src/libslic3r/PrintConfig.cpp:2224
+#: src/libslic3r/PrintConfig.cpp:2452
msgid "Position X"
msgstr "Posição X"
-#: src/libslic3r/PrintConfig.cpp:2225
+#: src/libslic3r/PrintConfig.cpp:2453
msgid "X coordinate of the left front corner of a wipe tower"
msgstr "Coordenada X do canto frontal esquerdo de uma torre de limpeza"
-#: src/libslic3r/PrintConfig.cpp:2231
+#: src/libslic3r/PrintConfig.cpp:2459
msgid "Position Y"
msgstr "Posição Y"
-#: src/libslic3r/PrintConfig.cpp:2232
+#: src/libslic3r/PrintConfig.cpp:2460
msgid "Y coordinate of the left front corner of a wipe tower"
msgstr "Coordenada Y do canto dianteiro esquerdo de uma torre de limpeza"
-#: src/libslic3r/PrintConfig.cpp:2239
+#: src/libslic3r/PrintConfig.cpp:2467
msgid "Width of a wipe tower"
msgstr "Largura de uma torre da limpeza"
-#: src/libslic3r/PrintConfig.cpp:2245
+#: src/libslic3r/PrintConfig.cpp:2473
msgid "Wipe tower rotation angle"
msgstr "Ângulo de rotação da torre"
-#: src/libslic3r/PrintConfig.cpp:2246
+#: src/libslic3r/PrintConfig.cpp:2474
msgid "Wipe tower rotation angle with respect to x-axis."
msgstr "Ângulo de rotação da torre de limpeza em relação ao eixo X."
-#: src/libslic3r/PrintConfig.cpp:2253
+#: src/libslic3r/PrintConfig.cpp:2481
msgid "Wipe into this object's infill"
msgstr "Limpe no preenchimento deste objeto"
-#: src/libslic3r/PrintConfig.cpp:2254
+#: src/libslic3r/PrintConfig.cpp:2482
msgid ""
"Purging after toolchange will done inside this object's infills. This lowers "
"the amount of waste but may result in longer print time due to additional "
@@ -9860,163 +11906,161 @@ msgstr ""
"objeto. Isso diminui a quantidade de resíduos, mas pode resultar em tempo de "
"impressão mais longo devido a movimentos de viagem adicionais."
-#: src/libslic3r/PrintConfig.cpp:2261
+#: src/libslic3r/PrintConfig.cpp:2489
msgid "Wipe into this object"
msgstr "Limpar neste objeto"
-#: src/libslic3r/PrintConfig.cpp:2262
+#: src/libslic3r/PrintConfig.cpp:2490
msgid ""
"Object will be used to purge the nozzle after a toolchange to save material "
-"that would otherwise end up in the wipe tower and decrease print time. "
-"Colours of the objects will be mixed as a result."
+"that would otherwise end up in the wipe tower and decrease print time. Colours "
+"of the objects will be mixed as a result."
msgstr ""
-"Objeto será usado para limpar o bico após uma troca de ferramenta para "
-"salvar o material que de outra forma acabaria na torre de limpeza e diminuir "
-"o tempo de impressão. As cores dos objetos serão misturadas como resultado."
+"Objeto será usado para limpar o bico após uma troca de ferramenta para salvar "
+"o material que de outra forma acabaria na torre de limpeza e diminuir o tempo "
+"de impressão. As cores dos objetos serão misturadas como resultado."
-#: src/libslic3r/PrintConfig.cpp:2268
+#: src/libslic3r/PrintConfig.cpp:2496
msgid "Maximal bridging distance"
msgstr "Distância de ponte máxima"
-#: src/libslic3r/PrintConfig.cpp:2269
+#: src/libslic3r/PrintConfig.cpp:2497
msgid "Maximal distance between supports on sparse infill sections."
-msgstr ""
-"Distância máxima entre as sustentações em seções preenchimento esparsas."
+msgstr "Distância máxima entre as sustentações em seções preenchimento esparsas."
-#: src/libslic3r/PrintConfig.cpp:2275
+#: src/libslic3r/PrintConfig.cpp:2503
msgid "XY Size Compensation"
msgstr "Compensação de tamanho em XY"
-#: src/libslic3r/PrintConfig.cpp:2277
+#: src/libslic3r/PrintConfig.cpp:2505
msgid ""
"The object will be grown/shrunk in the XY plane by the configured value "
"(negative = inwards, positive = outwards). This might be useful for fine-"
"tuning hole sizes."
msgstr ""
-"O objeto será aumentado/encolhido no plano XY pelo valor configurado "
-"(negativo = para dentro, positivo = para fora). Isso pode ser útil para "
-"ajustar os tamanhos dos furos."
+"O objeto será aumentado/encolhido no plano XY pelo valor configurado (negativo "
+"= para dentro, positivo = para fora). Isso pode ser útil para ajustar os "
+"tamanhos dos furos."
-#: src/libslic3r/PrintConfig.cpp:2285
+#: src/libslic3r/PrintConfig.cpp:2513
msgid "Z offset"
-msgstr "Compensamento do Z"
+msgstr "Compensação do Z"
-#: src/libslic3r/PrintConfig.cpp:2286
+#: src/libslic3r/PrintConfig.cpp:2514
msgid ""
"This value will be added (or subtracted) from all the Z coordinates in the "
"output G-code. It is used to compensate for bad Z endstop position: for "
"example, if your endstop zero actually leaves the nozzle 0.3mm far from the "
"print bed, set this to -0.3 (or fix your endstop)."
msgstr ""
-"Esse valor será adicionado (ou subtraído) de todas as coordenadas Z no G-"
-"code de saída. Ele é usado para compensar a posição de final de curso Z "
-"ruim: por exemplo, se o seu final de curso zero realmente deixa o bico 0.3 "
-"mm longe da mesa de impressão, defina este para-0,3 (ou corrigir o seu final "
-"de curso)."
+"Esse valor será adicionado (ou subtraído) de todas as coordenadas Z no G-code "
+"de saída. Ele é usado para compensar a posição de final de curso Z ruim: por "
+"exemplo, se o seu final de curso zero realmente deixa o bico 0.3 mm longe da "
+"mesa de impressão, defina este para-0,3 (ou corrigir o seu final de curso)."
-#: src/libslic3r/PrintConfig.cpp:2353
+#: src/libslic3r/PrintConfig.cpp:2581
msgid "Display width"
msgstr "Largura do display"
-#: src/libslic3r/PrintConfig.cpp:2354
+#: src/libslic3r/PrintConfig.cpp:2582
msgid "Width of the display"
msgstr "Largura do display"
-#: src/libslic3r/PrintConfig.cpp:2359
+#: src/libslic3r/PrintConfig.cpp:2587
msgid "Display height"
msgstr "Altura do display"
-#: src/libslic3r/PrintConfig.cpp:2360
+#: src/libslic3r/PrintConfig.cpp:2588
msgid "Height of the display"
msgstr "Altura do display"
-#: src/libslic3r/PrintConfig.cpp:2365
+#: src/libslic3r/PrintConfig.cpp:2593
msgid "Number of pixels in"
msgstr "Número de pixels em"
-#: src/libslic3r/PrintConfig.cpp:2367
+#: src/libslic3r/PrintConfig.cpp:2595
msgid "Number of pixels in X"
msgstr "Número de pixels em X"
-#: src/libslic3r/PrintConfig.cpp:2373
+#: src/libslic3r/PrintConfig.cpp:2601
msgid "Number of pixels in Y"
msgstr "Número de pixels em Y"
-#: src/libslic3r/PrintConfig.cpp:2378
+#: src/libslic3r/PrintConfig.cpp:2606
msgid "Display horizontal mirroring"
msgstr "Exibir espelhamento horizontal"
-#: src/libslic3r/PrintConfig.cpp:2379
+#: src/libslic3r/PrintConfig.cpp:2607
msgid "Mirror horizontally"
msgstr "Espelhar horizontalmente"
-#: src/libslic3r/PrintConfig.cpp:2380
+#: src/libslic3r/PrintConfig.cpp:2608
msgid "Enable horizontal mirroring of output images"
msgstr "Habilitar espelhamento horizontal de imagens de saída"
-#: src/libslic3r/PrintConfig.cpp:2385
+#: src/libslic3r/PrintConfig.cpp:2613
msgid "Display vertical mirroring"
msgstr "Exibir espelhamento vertical"
-#: src/libslic3r/PrintConfig.cpp:2386
+#: src/libslic3r/PrintConfig.cpp:2614
msgid "Mirror vertically"
msgstr "Espelharvertical"
-#: src/libslic3r/PrintConfig.cpp:2387
+#: src/libslic3r/PrintConfig.cpp:2615
msgid "Enable vertical mirroring of output images"
msgstr "Habilitar espelhamento vertical de imagens de saída"
-#: src/libslic3r/PrintConfig.cpp:2392
+#: src/libslic3r/PrintConfig.cpp:2620
msgid "Display orientation"
msgstr "Orientação do display"
-#: src/libslic3r/PrintConfig.cpp:2393
+#: src/libslic3r/PrintConfig.cpp:2621
msgid ""
"Set the actual LCD display orientation inside the SLA printer. Portrait mode "
"will flip the meaning of display width and height parameters and the output "
"images will be rotated by 90 degrees."
msgstr ""
-"Defina a orientação real do visor LCD dentro da impressora SLA. O modo "
-"retrato inverterá o significado dos parâmetros de largura e altura da tela e "
-"as imagens de saída serão giradas por 90 graus."
+"Defina a orientação real do visor LCD dentro da impressora SLA. O modo retrato "
+"inverterá o significado dos parâmetros de largura e altura da tela e as "
+"imagens de saída serão giradas por 90 graus."
-#: src/libslic3r/PrintConfig.cpp:2399
+#: src/libslic3r/PrintConfig.cpp:2627
msgid "Landscape"
msgstr "Paisagem"
-#: src/libslic3r/PrintConfig.cpp:2400
+#: src/libslic3r/PrintConfig.cpp:2628
msgid "Portrait"
msgstr "Retrato"
-#: src/libslic3r/PrintConfig.cpp:2405
+#: src/libslic3r/PrintConfig.cpp:2633
msgid "Fast"
msgstr "Rápido"
-#: src/libslic3r/PrintConfig.cpp:2406
+#: src/libslic3r/PrintConfig.cpp:2634
msgid "Fast tilt"
msgstr "Inclinação rápida"
-#: src/libslic3r/PrintConfig.cpp:2407
+#: src/libslic3r/PrintConfig.cpp:2635
msgid "Time of the fast tilt"
msgstr "Tempo da inclinação rápida"
-#: src/libslic3r/PrintConfig.cpp:2414
+#: src/libslic3r/PrintConfig.cpp:2642
msgid "Slow"
msgstr "Lento"
-#: src/libslic3r/PrintConfig.cpp:2415
+#: src/libslic3r/PrintConfig.cpp:2643
msgid "Slow tilt"
msgstr "Inclinação lenta"
-#: src/libslic3r/PrintConfig.cpp:2416
+#: src/libslic3r/PrintConfig.cpp:2644
msgid "Time of the slow tilt"
msgstr "Tempo da inclinação lenta"
-#: src/libslic3r/PrintConfig.cpp:2423
+#: src/libslic3r/PrintConfig.cpp:2651
msgid "Area fill"
msgstr "Preenchimento de área"
-#: src/libslic3r/PrintConfig.cpp:2424
+#: src/libslic3r/PrintConfig.cpp:2652
msgid ""
"The percentage of the bed area. \n"
"If the print area exceeds the specified value, \n"
@@ -10027,16 +12071,16 @@ msgstr ""
"em seguida, uma inclinação lenta será usada, caso contrário-uma inclinação "
"rápida"
-#: src/libslic3r/PrintConfig.cpp:2431 src/libslic3r/PrintConfig.cpp:2432
-#: src/libslic3r/PrintConfig.cpp:2433
+#: src/libslic3r/PrintConfig.cpp:2659 src/libslic3r/PrintConfig.cpp:2660
+#: src/libslic3r/PrintConfig.cpp:2661
msgid "Printer scaling correction"
msgstr "Correção de dimensionamento da impressora"
-#: src/libslic3r/PrintConfig.cpp:2439 src/libslic3r/PrintConfig.cpp:2440
+#: src/libslic3r/PrintConfig.cpp:2667 src/libslic3r/PrintConfig.cpp:2668
msgid "Printer absolute correction"
msgstr "Correção absoluta da impressora"
-#: src/libslic3r/PrintConfig.cpp:2441
+#: src/libslic3r/PrintConfig.cpp:2669
msgid ""
"Will inflate or deflate the sliced 2D polygons according to the sign of the "
"correction."
@@ -10044,257 +12088,269 @@ msgstr ""
"Irá inflar ou esvaziar os polígonos 2D cortados de acordo com o sinal da "
"correção."
-#: src/libslic3r/PrintConfig.cpp:2447
+#: src/libslic3r/PrintConfig.cpp:2675
msgid "Elephant foot minimum width"
msgstr "Largura mínima do pé de elefante"
-#: src/libslic3r/PrintConfig.cpp:2449
+#: src/libslic3r/PrintConfig.cpp:2677
msgid ""
"Minimum width of features to maintain when doing elephant foot compensation."
msgstr ""
"Largura mínima de características para manter ao fazer compensação do pé de "
"elefante."
-#: src/libslic3r/PrintConfig.cpp:2456 src/libslic3r/PrintConfig.cpp:2457
+#: src/libslic3r/PrintConfig.cpp:2684 src/libslic3r/PrintConfig.cpp:2685
msgid "Printer gamma correction"
msgstr "Correção de gama de impressora"
-#: src/libslic3r/PrintConfig.cpp:2458
+#: src/libslic3r/PrintConfig.cpp:2686
msgid ""
"This will apply a gamma correction to the rasterized 2D polygons. A gamma "
"value of zero means thresholding with the threshold in the middle. This "
"behaviour eliminates antialiasing without losing holes in polygons."
msgstr ""
-"Isso aplicará uma correção de gama para os polígonos 2D rasterizados. Um "
-"valor gama de zero significa limiarização com o limiar no meio. Este "
-"comportamento elimina suavização sem perder buracos em polígonos."
+"Isso aplicará uma correção de gama para os polígonos 2D rasterizados. Um valor "
+"gama de zero significa limiarização com o limiar no meio. Este comportamento "
+"elimina suavização sem perder buracos em polígonos."
-#: src/libslic3r/PrintConfig.cpp:2470 src/libslic3r/PrintConfig.cpp:2471
+#: src/libslic3r/PrintConfig.cpp:2698 src/libslic3r/PrintConfig.cpp:2699
msgid "SLA material type"
msgstr "Tipo de Material de SLA"
-#: src/libslic3r/PrintConfig.cpp:2482 src/libslic3r/PrintConfig.cpp:2483
+#: src/libslic3r/PrintConfig.cpp:2710 src/libslic3r/PrintConfig.cpp:2711
msgid "Initial layer height"
msgstr "Altura da camada inicial"
-#: src/libslic3r/PrintConfig.cpp:2489 src/libslic3r/PrintConfig.cpp:2490
+#: src/libslic3r/PrintConfig.cpp:2717 src/libslic3r/PrintConfig.cpp:2718
msgid "Bottle volume"
msgstr "Volume do pote"
-#: src/libslic3r/PrintConfig.cpp:2491
+#: src/libslic3r/PrintConfig.cpp:2719
msgid "ml"
msgstr "ml"
-#: src/libslic3r/PrintConfig.cpp:2496 src/libslic3r/PrintConfig.cpp:2497
+#: src/libslic3r/PrintConfig.cpp:2724 src/libslic3r/PrintConfig.cpp:2725
msgid "Bottle weight"
msgstr "Peso do pote"
-#: src/libslic3r/PrintConfig.cpp:2498
+#: src/libslic3r/PrintConfig.cpp:2726
msgid "kg"
msgstr "kg"
-#: src/libslic3r/PrintConfig.cpp:2505
+#: src/libslic3r/PrintConfig.cpp:2733
msgid "g/ml"
msgstr "g/ml"
-#: src/libslic3r/PrintConfig.cpp:2512
+#: src/libslic3r/PrintConfig.cpp:2740
msgid "money/bottle"
msgstr "dinheiro/pote"
-#: src/libslic3r/PrintConfig.cpp:2517
+#: src/libslic3r/PrintConfig.cpp:2745
msgid "Faded layers"
msgstr "Camadas desbotadas"
-#: src/libslic3r/PrintConfig.cpp:2518
+#: src/libslic3r/PrintConfig.cpp:2746
msgid ""
"Number of the layers needed for the exposure time fade from initial exposure "
"time to the exposure time"
msgstr ""
-"Número de camadas necessárias para o tempo de exposição desvanecer-se do "
-"tempo de exposição inicial ao tempo de exposição"
+"Número de camadas necessárias para o tempo de exposição desvanecer-se do tempo "
+"de exposição inicial ao tempo de exposição"
-#: src/libslic3r/PrintConfig.cpp:2525 src/libslic3r/PrintConfig.cpp:2526
+#: src/libslic3r/PrintConfig.cpp:2753 src/libslic3r/PrintConfig.cpp:2754
msgid "Minimum exposure time"
msgstr "Tempo mínimo de exposição"
-#: src/libslic3r/PrintConfig.cpp:2533 src/libslic3r/PrintConfig.cpp:2534
+#: src/libslic3r/PrintConfig.cpp:2761 src/libslic3r/PrintConfig.cpp:2762
msgid "Maximum exposure time"
msgstr "Tempo máximo de exposição"
-#: src/libslic3r/PrintConfig.cpp:2541 src/libslic3r/PrintConfig.cpp:2542
+#: src/libslic3r/PrintConfig.cpp:2769 src/libslic3r/PrintConfig.cpp:2770
msgid "Exposure time"
msgstr "Tempo de exposição"
-#: src/libslic3r/PrintConfig.cpp:2548 src/libslic3r/PrintConfig.cpp:2549
+#: src/libslic3r/PrintConfig.cpp:2776 src/libslic3r/PrintConfig.cpp:2777
msgid "Minimum initial exposure time"
msgstr "Tempo inicial mínimo de exposição"
-#: src/libslic3r/PrintConfig.cpp:2556 src/libslic3r/PrintConfig.cpp:2557
+#: src/libslic3r/PrintConfig.cpp:2784 src/libslic3r/PrintConfig.cpp:2785
msgid "Maximum initial exposure time"
msgstr "Tempo inicial máximo de exposição"
-#: src/libslic3r/PrintConfig.cpp:2564 src/libslic3r/PrintConfig.cpp:2565
+#: src/libslic3r/PrintConfig.cpp:2792 src/libslic3r/PrintConfig.cpp:2793
msgid "Initial exposure time"
msgstr "Tempo inicial mínimo de exposição"
-#: src/libslic3r/PrintConfig.cpp:2571 src/libslic3r/PrintConfig.cpp:2572
+#: src/libslic3r/PrintConfig.cpp:2799 src/libslic3r/PrintConfig.cpp:2800
msgid "Correction for expansion"
msgstr "Correção para expansão"
-#: src/libslic3r/PrintConfig.cpp:2578
+#: src/libslic3r/PrintConfig.cpp:2806
msgid "SLA print material notes"
msgstr "Notas de material de impressão de SLA"
-#: src/libslic3r/PrintConfig.cpp:2579
+#: src/libslic3r/PrintConfig.cpp:2807
msgid "You can put your notes regarding the SLA print material here."
msgstr ""
"Você pode colocar suas anotações sobre o material de impressão de SLA aqui."
-#: src/libslic3r/PrintConfig.cpp:2591 src/libslic3r/PrintConfig.cpp:2602
+#: src/libslic3r/PrintConfig.cpp:2819 src/libslic3r/PrintConfig.cpp:2830
msgid "Default SLA material profile"
msgstr "Perfil de material de SLA padrão"
-#: src/libslic3r/PrintConfig.cpp:2613
+#: src/libslic3r/PrintConfig.cpp:2841
msgid "Generate supports"
msgstr "Gerar suportes"
-#: src/libslic3r/PrintConfig.cpp:2615
+#: src/libslic3r/PrintConfig.cpp:2843
msgid "Generate supports for the models"
msgstr "Gere suportes para os modelos"
-#: src/libslic3r/PrintConfig.cpp:2620
-msgid "Support head front diameter"
+#: src/libslic3r/PrintConfig.cpp:2848
+msgid "Pinhead front diameter"
msgstr "Diâmetro dianteiro principal da sustentação"
-#: src/libslic3r/PrintConfig.cpp:2622
+#: src/libslic3r/PrintConfig.cpp:2850
msgid "Diameter of the pointing side of the head"
msgstr "Diâmetro do lado apontando da cabeça"
-#: src/libslic3r/PrintConfig.cpp:2629
-msgid "Support head penetration"
-msgstr "Suporte de penetração da cabeça"
+#: src/libslic3r/PrintConfig.cpp:2857
+msgid "Head penetration"
+msgstr "Penetração inválida da cabeça"
-#: src/libslic3r/PrintConfig.cpp:2631
+#: src/libslic3r/PrintConfig.cpp:2859
msgid "How much the pinhead has to penetrate the model surface"
msgstr "Quanto a cabeça de alfinete tem de penetrar na superfície do modelo"
-#: src/libslic3r/PrintConfig.cpp:2638
-msgid "Support head width"
+#: src/libslic3r/PrintConfig.cpp:2866
+msgid "Pinhead width"
msgstr "Largura da cabeça de suporte"
-#: src/libslic3r/PrintConfig.cpp:2640
+#: src/libslic3r/PrintConfig.cpp:2868
msgid "Width from the back sphere center to the front sphere center"
msgstr "Largura do centro da esfera traseira ao centro da esfera dianteira"
-#: src/libslic3r/PrintConfig.cpp:2648
-msgid "Support pillar diameter"
+#: src/libslic3r/PrintConfig.cpp:2876
+msgid "Pillar diameter"
msgstr "Diâmetro do pilar do suporte"
-#: src/libslic3r/PrintConfig.cpp:2650
+#: src/libslic3r/PrintConfig.cpp:2878
msgid "Diameter in mm of the support pillars"
msgstr "Diâmetro em mm dos pilares de suporte"
-#: src/libslic3r/PrintConfig.cpp:2658
+#: src/libslic3r/PrintConfig.cpp:2886
+msgid "Small pillar diameter percent"
+msgstr "Diâmetro do pilar do suporte"
+
+#: src/libslic3r/PrintConfig.cpp:2888
+msgid ""
+"The percentage of smaller pillars compared to the normal pillar diameter which "
+"are used in problematic areas where a normal pilla cannot fit."
+msgstr ""
+"A porcentagem de pilares menores em comparação com o diâmetro de pilar normal "
+"que são usados ​​em áreas problemáticas onde um pilar normal não pode caber."
+
+#: src/libslic3r/PrintConfig.cpp:2897
msgid "Max bridges on a pillar"
msgstr "Distância máxima de conexão entre pilares"
-#: src/libslic3r/PrintConfig.cpp:2660
+#: src/libslic3r/PrintConfig.cpp:2899
msgid ""
-"Maximum number of bridges that can be placed on a pillar. Bridges hold "
-"support point pinheads and connect to pillars as small branches."
+"Maximum number of bridges that can be placed on a pillar. Bridges hold support "
+"point pinheads and connect to pillars as small branches."
msgstr ""
-"Número máximo de pontes que podem ser colocadas em um pilar. As pontes "
-"seguram pinças de ponto de apoio e se conectam a pilares como pequenos ramos."
+"Número máximo de pontes que podem ser colocadas em um pilar. As pontes seguram "
+"pinças de ponto de apoio e se conectam a pilares como pequenos ramos."
-#: src/libslic3r/PrintConfig.cpp:2668
-msgid "Support pillar connection mode"
+#: src/libslic3r/PrintConfig.cpp:2907
+msgid "Pillar connection mode"
msgstr "Modalidade da conexão da coluna da sustentação"
-#: src/libslic3r/PrintConfig.cpp:2669
+#: src/libslic3r/PrintConfig.cpp:2908
msgid ""
"Controls the bridge type between two neighboring pillars. Can be zig-zag, "
-"cross (double zig-zag) or dynamic which will automatically switch between "
-"the first two depending on the distance of the two pillars."
+"cross (double zig-zag) or dynamic which will automatically switch between the "
+"first two depending on the distance of the two pillars."
msgstr ""
"Controla o tipo de ponte entre dois pilares vizinhos. Pode ser zig-zag, Cruz "
"(zig-zag dobro) ou dinâmico que comutará automaticamente entre os primeiros "
"dois dependendo da distância dos dois pilares."
-#: src/libslic3r/PrintConfig.cpp:2677
+#: src/libslic3r/PrintConfig.cpp:2916
msgid "Zig-Zag"
msgstr "Zig-Zag"
-#: src/libslic3r/PrintConfig.cpp:2678
+#: src/libslic3r/PrintConfig.cpp:2917
msgid "Cross"
msgstr "Cruz"
-#: src/libslic3r/PrintConfig.cpp:2679
+#: src/libslic3r/PrintConfig.cpp:2918
msgid "Dynamic"
msgstr "Dinâmico"
-#: src/libslic3r/PrintConfig.cpp:2691
+#: src/libslic3r/PrintConfig.cpp:2930
msgid "Pillar widening factor"
msgstr "Fator de alargamento da coluna"
-#: src/libslic3r/PrintConfig.cpp:2693
+#: src/libslic3r/PrintConfig.cpp:2932
msgid ""
-"Merging bridges or pillars into another pillars can increase the radius. "
-"Zero means no increase, one means full increase."
+"Merging bridges or pillars into another pillars can increase the radius. Zero "
+"means no increase, one means full increase."
msgstr ""
"Mesclar pontes ou pilares em outros pilares pode aumentar o raio. Zero "
"significa que não há aumento, um significa aumento total."
-#: src/libslic3r/PrintConfig.cpp:2702
+#: src/libslic3r/PrintConfig.cpp:2941
msgid "Support base diameter"
msgstr "Diâmetro base do suporte"
-#: src/libslic3r/PrintConfig.cpp:2704
+#: src/libslic3r/PrintConfig.cpp:2943
msgid "Diameter in mm of the pillar base"
msgstr "Diâmetro em mm da base do pilar"
-#: src/libslic3r/PrintConfig.cpp:2712
+#: src/libslic3r/PrintConfig.cpp:2951
msgid "Support base height"
msgstr "Altura base do suporte"
-#: src/libslic3r/PrintConfig.cpp:2714
+#: src/libslic3r/PrintConfig.cpp:2953
msgid "The height of the pillar base cone"
msgstr "A altura do cone da base da coluna"
-#: src/libslic3r/PrintConfig.cpp:2721
+#: src/libslic3r/PrintConfig.cpp:2960
msgid "Support base safety distance"
msgstr "Distância da segurança da base da sustentação"
-#: src/libslic3r/PrintConfig.cpp:2724
+#: src/libslic3r/PrintConfig.cpp:2963
msgid ""
"The minimum distance of the pillar base from the model in mm. Makes sense in "
"zero elevation mode where a gap according to this parameter is inserted "
"between the model and the pad."
msgstr ""
"A distância mínima da base do pilar do modelo em mm. faz sentido no modo de "
-"elevação zero, onde uma lacuna de acordo com este parâmetro é inserida entre "
-"o modelo e o pad."
+"elevação zero, onde uma lacuna de acordo com este parâmetro é inserida entre o "
+"modelo e o pad."
-#: src/libslic3r/PrintConfig.cpp:2734
+#: src/libslic3r/PrintConfig.cpp:2973
msgid "Critical angle"
msgstr "Ângulo crítico"
-#: src/libslic3r/PrintConfig.cpp:2736
+#: src/libslic3r/PrintConfig.cpp:2975
msgid "The default angle for connecting support sticks and junctions."
msgstr "O ângulo padrão para conectar suportes e junções."
-#: src/libslic3r/PrintConfig.cpp:2744
+#: src/libslic3r/PrintConfig.cpp:2983
msgid "Max bridge length"
msgstr "Comprimento máximo da ponte"
-#: src/libslic3r/PrintConfig.cpp:2746
+#: src/libslic3r/PrintConfig.cpp:2985
msgid "The max length of a bridge"
msgstr "O comprimento máximo de uma ponte"
-#: src/libslic3r/PrintConfig.cpp:2753
+#: src/libslic3r/PrintConfig.cpp:2992
msgid "Max pillar linking distance"
msgstr "Distância máxima de conexão entre pilares"
-#: src/libslic3r/PrintConfig.cpp:2755
+#: src/libslic3r/PrintConfig.cpp:2994
msgid ""
"The max distance of two pillars to get linked with each other. A zero value "
"will prohibit pillar cascading."
@@ -10302,11 +12358,7 @@ msgstr ""
"A distância máxima de dois pilares para ficar ligado uns com os outros. Um "
"valor zero irá proibir o pilar em cascata."
-#: src/libslic3r/PrintConfig.cpp:2763
-msgid "Object elevation"
-msgstr "Elevação do objeto"
-
-#: src/libslic3r/PrintConfig.cpp:2765
+#: src/libslic3r/PrintConfig.cpp:3004
msgid ""
"How much the supports should lift up the supported object. If \"Pad around "
"object\" is enabled, this value is ignored."
@@ -10314,161 +12366,156 @@ msgstr ""
"Quanto os suportes devem levantar o objecto suportado. Se \"pad em torno do "
"objeto\" estiver habilitado, esse valor será ignorado."
-#: src/libslic3r/PrintConfig.cpp:2776
+#: src/libslic3r/PrintConfig.cpp:3015
msgid "This is a relative measure of support points density."
msgstr "Esta é uma medida relativa de densidade de pontos de suporte."
-#: src/libslic3r/PrintConfig.cpp:2782
+#: src/libslic3r/PrintConfig.cpp:3021
msgid "Minimal distance of the support points"
msgstr "Distância mínima dos pontos de suporte"
-#: src/libslic3r/PrintConfig.cpp:2784
+#: src/libslic3r/PrintConfig.cpp:3023
msgid "No support points will be placed closer than this threshold."
msgstr "Nenhum ponto de apoio será colocado mais perto do que este limiar."
-#: src/libslic3r/PrintConfig.cpp:2790
+#: src/libslic3r/PrintConfig.cpp:3029
msgid "Use pad"
msgstr "Use pad"
-#: src/libslic3r/PrintConfig.cpp:2792
+#: src/libslic3r/PrintConfig.cpp:3031
msgid "Add a pad underneath the supported model"
msgstr "Adicionar um pad por baixo do modelo suportado"
-#: src/libslic3r/PrintConfig.cpp:2797
+#: src/libslic3r/PrintConfig.cpp:3036
msgid "Pad wall thickness"
msgstr "Espessura da parede do pad"
-#: src/libslic3r/PrintConfig.cpp:2799
+#: src/libslic3r/PrintConfig.cpp:3038
msgid "The thickness of the pad and its optional cavity walls."
msgstr "A espessura da pad e suas paredes de cavidade opcionais."
-#: src/libslic3r/PrintConfig.cpp:2807
+#: src/libslic3r/PrintConfig.cpp:3046
msgid "Pad wall height"
msgstr "Altura da parede do pad"
-#: src/libslic3r/PrintConfig.cpp:2808
+#: src/libslic3r/PrintConfig.cpp:3047
msgid ""
"Defines the pad cavity depth. Set to zero to disable the cavity. Be careful "
"when enabling this feature, as some resins may produce an extreme suction "
"effect inside the cavity, which makes peeling the print off the vat foil "
"difficult."
msgstr ""
-"Define a profundidade da cavidade da pad. Defina como zero para desabilitar "
-"a cavidade. Tenha cuidado ao ativar este recurso, como algumas resinas podem "
+"Define a profundidade da cavidade da pad. Defina como zero para desabilitar a "
+"cavidade. Tenha cuidado ao ativar este recurso, como algumas resinas podem "
"produzir um efeito de sucção extrema dentro da cavidade, o que torna a "
"descascar a impressão fora da folha de IVA difícil."
-#: src/libslic3r/PrintConfig.cpp:2821
+#: src/libslic3r/PrintConfig.cpp:3060
msgid "Pad brim size"
msgstr "Tamanho da borda do bloco"
-#: src/libslic3r/PrintConfig.cpp:2822
+#: src/libslic3r/PrintConfig.cpp:3061
msgid "How far should the pad extend around the contained geometry"
msgstr "Até onde o bloco deve se estender em torno da geometria contida"
-#: src/libslic3r/PrintConfig.cpp:2832
+#: src/libslic3r/PrintConfig.cpp:3071
msgid "Max merge distance"
msgstr "Distância máxima da fusão"
-#: src/libslic3r/PrintConfig.cpp:2834
+#: src/libslic3r/PrintConfig.cpp:3073
msgid ""
"Some objects can get along with a few smaller pads instead of a single big "
-"one. This parameter defines how far the center of two smaller pads should "
-"be. If theyare closer, they will get merged into one pad."
+"one. This parameter defines how far the center of two smaller pads should be. "
+"If theyare closer, they will get merged into one pad."
msgstr ""
"Alguns objetos podem se dar bem com algumas pads menores em vez de um único "
-"grande. Este parâmetro define até que ponto o centro de duas pads menores "
-"deve ser. Se eles estão mais perto, eles vão se fundir em uma pad."
+"grande. Este parâmetro define até que ponto o centro de duas pads menores deve "
+"ser. Se eles estão mais perto, eles vão se fundir em uma pad."
-#: src/libslic3r/PrintConfig.cpp:2854
+#: src/libslic3r/PrintConfig.cpp:3093
msgid "Pad wall slope"
msgstr "Inclinação da parede da pad"
-#: src/libslic3r/PrintConfig.cpp:2856
+#: src/libslic3r/PrintConfig.cpp:3095
msgid ""
-"The slope of the pad wall relative to the bed plane. 90 degrees means "
-"straight walls."
+"The slope of the pad wall relative to the bed plane. 90 degrees means straight "
+"walls."
msgstr ""
-"A inclinação da parede da pad em relação ao plano da mesa. 90 graus "
-"significa paredes retas."
-
-#: src/libslic3r/PrintConfig.cpp:2865
-msgid "Pad around object"
-msgstr "Pad em torno do objeto"
+"A inclinação da parede da pad em relação ao plano da mesa. 90 graus significa "
+"paredes retas."
-#: src/libslic3r/PrintConfig.cpp:2867
+#: src/libslic3r/PrintConfig.cpp:3106
msgid "Create pad around object and ignore the support elevation"
msgstr "Criar pad ao redor do objeto e ignorar a elevação de suporte"
-#: src/libslic3r/PrintConfig.cpp:2872
+#: src/libslic3r/PrintConfig.cpp:3111
msgid "Pad around object everywhere"
msgstr "Pad em torno do objeto em todo lugar"
-#: src/libslic3r/PrintConfig.cpp:2874
+#: src/libslic3r/PrintConfig.cpp:3113
msgid "Force pad around object everywhere"
msgstr "Forçar Pad em torno do objeto em todo lugar"
-#: src/libslic3r/PrintConfig.cpp:2879
+#: src/libslic3r/PrintConfig.cpp:3118
msgid "Pad object gap"
msgstr "Vão entre o pad e o objeto"
-#: src/libslic3r/PrintConfig.cpp:2881
+#: src/libslic3r/PrintConfig.cpp:3120
msgid ""
-"The gap between the object bottom and the generated pad in zero elevation "
-"mode."
+"The gap between the object bottom and the generated pad in zero elevation mode."
msgstr ""
"A lacuna entre a parte inferior do objeto e o pad gerado no modo de elevação "
"zero."
-#: src/libslic3r/PrintConfig.cpp:2890
+#: src/libslic3r/PrintConfig.cpp:3129
msgid "Pad object connector stride"
msgstr "Inserir pad entre o objeto"
-#: src/libslic3r/PrintConfig.cpp:2892
+#: src/libslic3r/PrintConfig.cpp:3131
msgid ""
"Distance between two connector sticks which connect the object and the "
"generated pad."
msgstr ""
"Distância entre duas varas do conector que conectam o objeto e a pad gerada."
-#: src/libslic3r/PrintConfig.cpp:2899
+#: src/libslic3r/PrintConfig.cpp:3138
msgid "Pad object connector width"
msgstr "Largura do conector do objeto pad"
-#: src/libslic3r/PrintConfig.cpp:2901
+#: src/libslic3r/PrintConfig.cpp:3140
msgid ""
"Width of the connector sticks which connect the object and the generated pad."
msgstr "Largura das varas do conector que conectam o objeto e a pad gerada."
-#: src/libslic3r/PrintConfig.cpp:2908
+#: src/libslic3r/PrintConfig.cpp:3147
msgid "Pad object connector penetration"
msgstr "Pad objeto conector de penetração"
-#: src/libslic3r/PrintConfig.cpp:2911
+#: src/libslic3r/PrintConfig.cpp:3150
msgid "How much should the tiny connectors penetrate into the model body."
msgstr "Quanto deve os conectores minúsculos penetrar no corpo do modelo."
-#: src/libslic3r/PrintConfig.cpp:2918
+#: src/libslic3r/PrintConfig.cpp:3157
msgid "Enable hollowing"
msgstr "Ativar o modo oco"
-#: src/libslic3r/PrintConfig.cpp:2920
+#: src/libslic3r/PrintConfig.cpp:3159
msgid "Hollow out a model to have an empty interior"
msgstr "Deixar o modelo oco para ter um interior vazio"
-#: src/libslic3r/PrintConfig.cpp:2925
+#: src/libslic3r/PrintConfig.cpp:3164
msgid "Wall thickness"
msgstr "Espessura da parede"
-#: src/libslic3r/PrintConfig.cpp:2927
+#: src/libslic3r/PrintConfig.cpp:3166
msgid "Minimum wall thickness of a hollowed model."
msgstr "Espessura mínima da parede de um modelo oco."
-#: src/libslic3r/PrintConfig.cpp:2935
+#: src/libslic3r/PrintConfig.cpp:3174
msgid "Accuracy"
msgstr "Precisão"
-#: src/libslic3r/PrintConfig.cpp:2937
+#: src/libslic3r/PrintConfig.cpp:3176
msgid ""
"Performance vs accuracy of calculation. Lower values may produce unwanted "
"artifacts."
@@ -10476,69 +12523,76 @@ msgstr ""
"Desempenho versus precisão do cálculo. Valores mais baixos podem produzir "
"artefatos indesejados."
-#: src/libslic3r/PrintConfig.cpp:2947
+#: src/libslic3r/PrintConfig.cpp:3186
msgid ""
"Hollowing is done in two steps: first, an imaginary interior is calculated "
-"deeper (offset plus the closing distance) in the object and then it's "
-"inflated back to the specified offset. A greater closing distance makes the "
-"interior more rounded. At zero, the interior will resemble the exterior the "
-"most."
+"deeper (offset plus the closing distance) in the object and then it's inflated "
+"back to the specified offset. A greater closing distance makes the interior "
+"more rounded. At zero, the interior will resemble the exterior the most."
msgstr ""
"O oco é feito em duas etapas: primeiro, um interior imaginário é calculado "
"mais fundo (deslocamento mais a distância de fechamento) no objeto e, em "
"seguida, é inflado de volta para o deslocamento especificado. Uma maior "
-"distância de fechamento torna o interior mais arredondado. Ao zero, o "
-"interior será o mais parecido com o exterior."
+"distância de fechamento torna o interior mais arredondado. Ao zero, o interior "
+"será o mais parecido com o exterior."
-#: src/libslic3r/PrintConfig.cpp:3330
+#: src/libslic3r/PrintConfig.cpp:3602
msgid "Export OBJ"
msgstr "Exportar OBJ"
-#: src/libslic3r/PrintConfig.cpp:3331
+#: src/libslic3r/PrintConfig.cpp:3603
msgid "Export the model(s) as OBJ."
msgstr "Exportar modelo(s) como OBJ."
-#: src/libslic3r/PrintConfig.cpp:3342
+#: src/libslic3r/PrintConfig.cpp:3614
msgid "Export SLA"
msgstr "Exportar SLA"
-#: src/libslic3r/PrintConfig.cpp:3343
+#: src/libslic3r/PrintConfig.cpp:3615
msgid "Slice the model and export SLA printing layers as PNG."
msgstr "Fatiar o modelo e exportar as camadas de impressão SLA como PNG."
-#: src/libslic3r/PrintConfig.cpp:3348
+#: src/libslic3r/PrintConfig.cpp:3620
msgid "Export 3MF"
msgstr "Exportar 3MF"
-#: src/libslic3r/PrintConfig.cpp:3349
+#: src/libslic3r/PrintConfig.cpp:3621
msgid "Export the model(s) as 3MF."
msgstr "Exportar modelo(s) como 3MF."
-#: src/libslic3r/PrintConfig.cpp:3353
+#: src/libslic3r/PrintConfig.cpp:3625
msgid "Export AMF"
msgstr "Exportar AMF"
-#: src/libslic3r/PrintConfig.cpp:3354
+#: src/libslic3r/PrintConfig.cpp:3626
msgid "Export the model(s) as AMF."
msgstr "Exportar modelo(s) como AMF."
-#: src/libslic3r/PrintConfig.cpp:3358
+#: src/libslic3r/PrintConfig.cpp:3630
msgid "Export STL"
msgstr "Exportar STL"
-#: src/libslic3r/PrintConfig.cpp:3359
+#: src/libslic3r/PrintConfig.cpp:3631
msgid "Export the model(s) as STL."
msgstr "Exportar modelo(s) como STL."
-#: src/libslic3r/PrintConfig.cpp:3364
+#: src/libslic3r/PrintConfig.cpp:3636
msgid "Slice the model and export toolpaths as G-code."
msgstr "Fatiar o modelo e exportar o percurso da ferramenta como G-code."
-#: src/libslic3r/PrintConfig.cpp:3369
+#: src/libslic3r/PrintConfig.cpp:3641
+msgid "G-code viewer"
+msgstr "Tipo de G-code"
+
+#: src/libslic3r/PrintConfig.cpp:3642
+msgid "Visualize an already sliced and saved G-code"
+msgstr "Visualize um G-code já fatiado e salvo"
+
+#: src/libslic3r/PrintConfig.cpp:3647
msgid "Slice"
msgstr "Fatiar"
-#: src/libslic3r/PrintConfig.cpp:3370
+#: src/libslic3r/PrintConfig.cpp:3648
msgid ""
"Slice the model as FFF or SLA based on the printer_technology configuration "
"value."
@@ -10546,71 +12600,71 @@ msgstr ""
"Divida o modelo como FFF ou SLA com base no valor de config. "
"printer_technology."
-#: src/libslic3r/PrintConfig.cpp:3375
+#: src/libslic3r/PrintConfig.cpp:3653
msgid "Help"
msgstr "Ajuda"
-#: src/libslic3r/PrintConfig.cpp:3376
+#: src/libslic3r/PrintConfig.cpp:3654
msgid "Show this help."
msgstr "Mostrar esta ajuda."
-#: src/libslic3r/PrintConfig.cpp:3381
+#: src/libslic3r/PrintConfig.cpp:3659
msgid "Help (FFF options)"
msgstr "Ajuda (opções FDM)"
-#: src/libslic3r/PrintConfig.cpp:3382
+#: src/libslic3r/PrintConfig.cpp:3660
msgid "Show the full list of print/G-code configuration options."
msgstr "Mostre a lista completa de opções de config. do Print/G-code."
-#: src/libslic3r/PrintConfig.cpp:3386
+#: src/libslic3r/PrintConfig.cpp:3664
msgid "Help (SLA options)"
msgstr "Ajuda (opções SLA)"
-#: src/libslic3r/PrintConfig.cpp:3387
+#: src/libslic3r/PrintConfig.cpp:3665
msgid "Show the full list of SLA print configuration options."
msgstr "Mostrar a lista completa de opções de config. de impressão de SLA."
-#: src/libslic3r/PrintConfig.cpp:3391
+#: src/libslic3r/PrintConfig.cpp:3669
msgid "Output Model Info"
msgstr "Informações do modelo de saída"
-#: src/libslic3r/PrintConfig.cpp:3392
+#: src/libslic3r/PrintConfig.cpp:3670
msgid "Write information about the model to the console."
msgstr "Escreva informações sobre o modelo para o console."
-#: src/libslic3r/PrintConfig.cpp:3396
+#: src/libslic3r/PrintConfig.cpp:3674
msgid "Save config file"
-msgstr "Salvar arquivo de config."
+msgstr "Salvar arquivo de config"
-#: src/libslic3r/PrintConfig.cpp:3397
+#: src/libslic3r/PrintConfig.cpp:3675
msgid "Save configuration to the specified file."
msgstr "Salvar config. para o arquivo específico."
-#: src/libslic3r/PrintConfig.cpp:3407
+#: src/libslic3r/PrintConfig.cpp:3685
msgid "Align XY"
msgstr "Alinhar XY"
-#: src/libslic3r/PrintConfig.cpp:3408
+#: src/libslic3r/PrintConfig.cpp:3686
msgid "Align the model to the given point."
msgstr "Alinhar modelo de acordo com o ponto inserido."
-#: src/libslic3r/PrintConfig.cpp:3413
+#: src/libslic3r/PrintConfig.cpp:3691
msgid "Cut model at the given Z."
msgstr "Cortar modelo ao Z fornecido."
-#: src/libslic3r/PrintConfig.cpp:3434
+#: src/libslic3r/PrintConfig.cpp:3712
msgid "Center"
msgstr "Centralizar"
-#: src/libslic3r/PrintConfig.cpp:3435
+#: src/libslic3r/PrintConfig.cpp:3713
msgid "Center the print around the given center."
msgstr "Centralizar a impressão de acordo com o centro informado."
-#: src/libslic3r/PrintConfig.cpp:3439
+#: src/libslic3r/PrintConfig.cpp:3717
msgid "Don't arrange"
msgstr "Não organizar"
-#: src/libslic3r/PrintConfig.cpp:3440
+#: src/libslic3r/PrintConfig.cpp:3718
msgid ""
"Do not rearrange the given models before merging and keep their original XY "
"coordinates."
@@ -10618,27 +12672,23 @@ msgstr ""
"Não reorganize os modelos fornecidos antes de Mesclar e manter suas "
"coordenadas XY originais."
-#: src/libslic3r/PrintConfig.cpp:3443
+#: src/libslic3r/PrintConfig.cpp:3721
msgid "Duplicate"
msgstr "Duplicar"
-#: src/libslic3r/PrintConfig.cpp:3444
+#: src/libslic3r/PrintConfig.cpp:3722
msgid "Multiply copies by this factor."
msgstr "Multiplicar cópias por esse fator."
-#: src/libslic3r/PrintConfig.cpp:3448
+#: src/libslic3r/PrintConfig.cpp:3726
msgid "Duplicate by grid"
msgstr "Duplicar por grade"
-#: src/libslic3r/PrintConfig.cpp:3449
+#: src/libslic3r/PrintConfig.cpp:3727
msgid "Multiply copies by creating a grid."
msgstr "Multiplique cópias criando uma grade."
-#: src/libslic3r/PrintConfig.cpp:3452
-msgid "Merge"
-msgstr "Mesclar"
-
-#: src/libslic3r/PrintConfig.cpp:3453
+#: src/libslic3r/PrintConfig.cpp:3731
msgid ""
"Arrange the supplied models in a plate and merge them in a single model in "
"order to perform actions once."
@@ -10646,7 +12696,7 @@ msgstr ""
"Organize os modelos fornecidos em uma placa e junte-os em um único modelo, a "
"fim de executar ações uma só vez."
-#: src/libslic3r/PrintConfig.cpp:3458
+#: src/libslic3r/PrintConfig.cpp:3736
msgid ""
"Try to repair any non-manifold meshes (this option is implicitly added "
"whenever we need to slice the model to perform the requested action)."
@@ -10655,31 +12705,31 @@ msgstr ""
"adicionada sempre que precisamos cortar o modelo para executar a ação "
"solicitada)."
-#: src/libslic3r/PrintConfig.cpp:3462
+#: src/libslic3r/PrintConfig.cpp:3740
msgid "Rotation angle around the Z axis in degrees."
msgstr "Ângulo de rotação ao redor do eixo Zem graus."
-#: src/libslic3r/PrintConfig.cpp:3466
+#: src/libslic3r/PrintConfig.cpp:3744
msgid "Rotate around X"
msgstr "Rotacionar no X"
-#: src/libslic3r/PrintConfig.cpp:3467
+#: src/libslic3r/PrintConfig.cpp:3745
msgid "Rotation angle around the X axis in degrees."
msgstr "Ângulo de rotação ao redor do eixo X em graus."
-#: src/libslic3r/PrintConfig.cpp:3471
+#: src/libslic3r/PrintConfig.cpp:3749
msgid "Rotate around Y"
msgstr "Rotacionar no Y"
-#: src/libslic3r/PrintConfig.cpp:3472
+#: src/libslic3r/PrintConfig.cpp:3750
msgid "Rotation angle around the Y axis in degrees."
msgstr "Ângulo de rotação ao redor do eixo Y em graus."
-#: src/libslic3r/PrintConfig.cpp:3477
+#: src/libslic3r/PrintConfig.cpp:3755
msgid "Scaling factor or percentage."
msgstr "Escalando fator ou porcentagem."
-#: src/libslic3r/PrintConfig.cpp:3482
+#: src/libslic3r/PrintConfig.cpp:3760
msgid ""
"Detect unconnected parts in the given model(s) and split them into separate "
"objects."
@@ -10687,64 +12737,78 @@ msgstr ""
"Detecte peças não conectadas em um determinado modelo (s) e divida-as em "
"objetos separados."
-#: src/libslic3r/PrintConfig.cpp:3485
+#: src/libslic3r/PrintConfig.cpp:3763
msgid "Scale to Fit"
msgstr "Dimensionar para caber"
-#: src/libslic3r/PrintConfig.cpp:3486
+#: src/libslic3r/PrintConfig.cpp:3764
msgid "Scale to fit the given volume."
msgstr "Escalar para se adequar ao volume informado."
-#: src/libslic3r/PrintConfig.cpp:3495
+#: src/libslic3r/PrintConfig.cpp:3773
msgid "Ignore non-existent config files"
msgstr "Ignorar arquivos de config. não existentes"
-#: src/libslic3r/PrintConfig.cpp:3496
+#: src/libslic3r/PrintConfig.cpp:3774
msgid "Do not fail if a file supplied to --load does not exist."
msgstr "Não falhe se um arquivo fornecido para--carregamento não existe."
-#: src/libslic3r/PrintConfig.cpp:3499
+#: src/libslic3r/PrintConfig.cpp:3777
msgid "Load config file"
-msgstr "Carregar arquivo de config."
+msgstr "Carregar arquivo de config"
-#: src/libslic3r/PrintConfig.cpp:3500
+#: src/libslic3r/PrintConfig.cpp:3778
msgid ""
"Load configuration from the specified file. It can be used more than once to "
"load options from multiple files."
msgstr ""
-"Carregar a config. do arquivo especificado. Ele pode ser usado mais de uma "
-"vez para carregar opções de vários arquivos."
+"Carregar a config. do arquivo especificado. Ele pode ser usado mais de uma vez "
+"para carregar opções de vários arquivos."
-#: src/libslic3r/PrintConfig.cpp:3503
+#: src/libslic3r/PrintConfig.cpp:3781
msgid "Output File"
msgstr "Arquivo de saída"
-#: src/libslic3r/PrintConfig.cpp:3504
+#: src/libslic3r/PrintConfig.cpp:3782
msgid ""
-"The file where the output will be written (if not specified, it will be "
-"based on the input file)."
+"The file where the output will be written (if not specified, it will be based "
+"on the input file)."
msgstr ""
-"O arquivo onde a saída será gravada (se não for especificado, ele será "
-"baseado no arquivo de entrada)."
+"O arquivo onde a saída será gravada (se não for especificado, ele será baseado "
+"no arquivo de entrada)."
+
+#: src/libslic3r/PrintConfig.cpp:3786
+msgid "Single instance mode"
+msgstr "Modo instancia única"
-#: src/libslic3r/PrintConfig.cpp:3514
+#: src/libslic3r/PrintConfig.cpp:3787
+msgid ""
+"If enabled, the command line arguments are sent to an existing instance of GUI "
+"PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides the "
+"\"single_instance\" configuration value from application preferences."
+msgstr ""
+"Se habilitado, os argumentos da linha de comando são enviados para uma "
+"instância existente do GUI PrusaSlicer ou uma janela do PrusaSlicer existente "
+"é ativada. Substitui o valor de configuração \"single_instance\" das "
+"preferências do aplicativo."
+
+#: src/libslic3r/PrintConfig.cpp:3798
msgid "Data directory"
msgstr "Diretório de dados"
-#: src/libslic3r/PrintConfig.cpp:3515
+#: src/libslic3r/PrintConfig.cpp:3799
msgid ""
-"Load and store settings at the given directory. This is useful for "
-"maintaining different profiles or including configurations from a network "
-"storage."
+"Load and store settings at the given directory. This is useful for maintaining "
+"different profiles or including configurations from a network storage."
msgstr ""
"Carregar e armazenar as config. no diretório especificado. Isso é útil para "
"manter perfis diferentes ou incluir config. de um armazenamento de rede."
-#: src/libslic3r/PrintConfig.cpp:3518
+#: src/libslic3r/PrintConfig.cpp:3802
msgid "Logging level"
msgstr "Nível de registro"
-#: src/libslic3r/PrintConfig.cpp:3519
+#: src/libslic3r/PrintConfig.cpp:3803
msgid ""
"Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:"
"trace\n"
@@ -10752,56 +12816,310 @@ msgid ""
msgstr ""
"Define a sensibilidade de registro. 0:fatal, 1:erro, 2:warning, 3:info, 4:"
"debug, 5:trace\n"
-"Por exemplo. loglevel=2 logs de mensagens fatais, de nível de erro e de "
-"aviso."
+"Por exemplo. loglevel=2 logs de mensagens fatais, de nível de erro e de aviso."
-#: src/libslic3r/PrintConfig.cpp:3525
+#: src/libslic3r/PrintConfig.cpp:3809
msgid "Render with a software renderer"
msgstr "Renderizar com um software renderizador"
-#: src/libslic3r/PrintConfig.cpp:3526
+#: src/libslic3r/PrintConfig.cpp:3810
msgid ""
-"Render with a software renderer. The bundled MESA software renderer is "
-"loaded instead of the default OpenGL driver."
+"Render with a software renderer. The bundled MESA software renderer is loaded "
+"instead of the default OpenGL driver."
msgstr ""
"Renderizar com um software renderizador. O renderizador de software MESA "
"empacotado é carregado em vez do driver OpenGL padrão."
-#: src/libslic3r/PrintObject.cpp:108
+#: src/libslic3r/Zipper.cpp:27
+msgid "Error with zip archive"
+msgstr "Erro com arquivo zip"
+
+#: src/libslic3r/PrintObject.cpp:112
msgid "Processing triangulated mesh"
msgstr "Processando malha triangulada"
-#: src/libslic3r/PrintObject.cpp:152
+#: src/libslic3r/PrintObject.cpp:157
msgid "Generating perimeters"
msgstr "Gerando perímetros"
-#: src/libslic3r/PrintObject.cpp:255
+#: src/libslic3r/PrintObject.cpp:260
msgid "Preparing infill"
msgstr "Preparando o preenchimento"
-#: src/libslic3r/PrintObject.cpp:395
+#: src/libslic3r/PrintObject.cpp:421
msgid "Generating support material"
msgstr "Gerando material de suporte"
-#: src/libslic3r/GCode/PreviewData.cpp:347
-msgid "Height (mm)"
-msgstr "Altura (mm)"
+#~ msgid ""
+#~ "Copying of file %1% to %2% failed. Permissions fail at target file before "
+#~ "copying.\n"
+#~ "Error message : %3%\n"
+#~ "This error happend during %4% phase."
+#~ msgstr ""
+#~ "A cópia do arquivo %1% para %2% falhou. As permissões falham no arquivo de "
+#~ "destino antes de copiar.\n"
+#~ "Mensagem de erro: %3%\n"
+#~ "Este erro ocorreu durante a fase %4%."
-#: src/libslic3r/GCode/PreviewData.cpp:349
-msgid "Width (mm)"
-msgstr "Espessura (mm)"
+#~ msgid ""
+#~ "Copying of file %1% to %2% failed.\n"
+#~ "Error message : %3%\n"
+#~ "Copying was triggered by function: %4%"
+#~ msgstr ""
+#~ "A cópia do arquivo %1% para %2% falhou.\n"
+#~ "Mensagem de erro: %3%\n"
+#~ "A cópia foi acionada pela função: %4%"
-#: src/libslic3r/GCode/PreviewData.cpp:351
-msgid "Speed (mm/s)"
-msgstr "Velocidade (mm/s)"
+#~ msgid ""
+#~ "Copying of file %1% to %2% failed. Permissions fail at target file after "
+#~ "copying.\n"
+#~ "Error message : %3%\n"
+#~ "Copying was triggered by function: %4%"
+#~ msgstr ""
+#~ "A cópia do arquivo %1% para %2% falhou. As permissões falham no arquivo de "
+#~ "destino após a cópia.\n"
+#~ "Mensagem de erro: %3%\n"
+#~ "A cópia foi acionada pela função: %4%"
-#: src/libslic3r/GCode/PreviewData.cpp:353
-msgid "Fan Speed (%)"
-msgstr "Velocidade da ventoinha (%)"
+#~ msgid "install"
+#~ msgstr "instalar"
-#: src/libslic3r/GCode/PreviewData.cpp:355
-msgid "Volumetric flow rate (mm³/s)"
-msgstr "Vazão volumétrica (mm³/s)"
+#~ msgid "checking install indices"
+#~ msgstr "checando índices de instalação"
+
+#~ msgid "getting config updates"
+#~ msgstr "obtendo atualizações de configuração"
+
+#~ msgid "Vertical slider - Add color change marker for current layer"
+#~ msgstr "Rolagem vertical - Adicionar mudança de cor para a camada atual"
+
+#~ msgid "Vertical slider - Delete color change marker for current layer"
+#~ msgstr "Rolagem vertical - Excluir mudança de cor para a camada atual"
+
+#~ msgid "Layers Slider"
+#~ msgstr "Controle deslizante de camadas"
+
+#~ msgid "Fan"
+#~ msgstr "Ventoinha"
+
+#~ msgid "The Spiral Vase option can only be used when printing a single object."
+#~ msgstr "A opção vaso espiral só pode ser usada ao imprimir um único objeto."
+
+#~ msgid "Pause prints"
+#~ msgstr "Adicionar impressão de pausa"
+
+#~ msgid "Custom GCodes"
+#~ msgstr "G-code customizado"
+
+#~ msgid "Default print color"
+#~ msgstr "Cor de impressão padrão"
+
+#~ msgid "Pause print or custom G-code"
+#~ msgstr "Pausa impressão ou código G personalizado"
+
+#, c-format
+#~ msgid "up to %.2f mm"
+#~ msgstr "até %.2f mm"
+
+#, c-format
+#~ msgid "above %.2f mm"
+#~ msgstr "acima de %.2f mm"
+
+#, c-format
+#~ msgid "%.2f - %.2f mm"
+#~ msgstr "%.2f - %.2f mm"
+
+#, c-format
+#~ msgid "Color change for Extruder %d at %.2f mm"
+#~ msgstr "Mudança de cor para Extrusor %d em %.2f mm"
+
+#~ msgid "canvas_tooltip"
+#~ msgstr "canvas_tooltip"
+
+#~ msgid "Type here to search"
+#~ msgstr "Digite aqui para pesquisar"
+
+#~ msgid "FDM Support Editing"
+#~ msgstr "Editor de Suporte FDM"
+
+#~ msgid "Cursor type"
+#~ msgstr "Tipo do Cursor"
+
+#~ msgid "deg"
+#~ msgstr "deg"
+
+#~ msgid "Suface quality"
+#~ msgstr "Qualidade da superfície"
+
+#~ msgid "Supports gizmo turned on"
+#~ msgstr "Gizmo de suportes ligado"
+
+#~ msgid "Seam gizmo turned on"
+#~ msgstr "Gizmo de costura ligado"
+
+#~ msgid "Seam gizmo turned off"
+#~ msgstr "Gizmo de costura desligado"
+
+#~ msgid "Supports gizmo turned off"
+#~ msgstr "Gizmo de suporte desligado"
+
+#~ msgid "Legend"
+#~ msgstr "Legenda"
+
+#~ msgid "Quality: "
+#~ msgstr "Qualidade: "
+
+#, c-format
+#~ msgid ""
+#~ "Press to snap by 5% in Gizmo scale\n"
+#~ "or to snap by 1mm in Gizmo move"
+#~ msgstr ""
+#~ "Pressione para tirar 5% ina escala Gizmo\n"
+#~ "ou para tirar 1mm no movimento Gizmo"
+
+#~ msgid "Find option"
+#~ msgstr "Procurar opções"
+
+#~ msgid "Infornation"
+#~ msgstr "Informação"
+
+#~ msgid "Remove device"
+#~ msgstr "Remover dispositivo"
+
+#~ msgid "Saved in inches object detected"
+#~ msgstr "Detectado objeto salvo em polegadas"
+
+#~ msgid "Always ask for unsaved changes when closing application"
+#~ msgstr "Sempre pergunte sobre mudanças não salvas quando fechar aplicação"
+
+#~ msgid "New layout without the tab bar on the plater"
+#~ msgstr "Novo layout sem a barra de abas na bandeja"
+
+#~ msgid "Settings layout mode"
+#~ msgstr "Config. da parte para modificar"
+
+#~ msgid "The empty name is not available."
+#~ msgstr "O nome fornecido não está disponível."
+
+#~ msgid "Click to start a search or use %1% shortcut"
+#~ msgstr "Clique para iniciar uma pesquisa ou use o atalho%1%"
+
+#~ msgid "Next physical printer(s) has/have selected preset"
+#~ msgstr "Impressora física seguinte tem predefinição selecionada"
+
+#~ msgid "Next physical printer(s) has/have one and only selected preset"
+#~ msgstr "Impressora física seguinte tem uma única predefinição selecionada"
+
+#~ msgid "All modified options will be reverted."
+#~ msgstr "Todos os objetos serão removidos, continuar?"
+
+#~ msgid ""
+#~ "Slic3r can upload G-code files to a printer host. This field should contain "
+#~ "the hostname, IP address or URL of the printer host instance."
+#~ msgstr ""
+#~ "Slic3r pode carregar arquivos de G-code para um host de impressora. Este "
+#~ "campo deve conter o nome de host, o endereço IP ou a URL da instância de "
+#~ "host da impressora."
+
+#~ msgid "First layer extruder temperature"
+#~ msgstr "Temperatura do extrusor na primeira camada"
+
+#~ msgid "Ironing speed"
+#~ msgstr "Velocidade de carregamento"
+
+#~ msgid ""
+#~ "This is the acceleration your printer will use for perimeters. A high value "
+#~ "like 9000 usually gives good results if your hardware is up to the job. Set "
+#~ "zero to disable acceleration control for perimeters."
+#~ msgstr ""
+#~ "Esta é a aceleração que sua impressora usará para perímetros. Um alto valor "
+#~ "como 9000 geralmente dá bons resultados se o seu hardware suporta. Defina "
+#~ "zero para desabilitar o controle de aceleração para perímetros."
+
+#~ msgid "Serial port"
+#~ msgstr "Porte Serial"
+
+#~ msgid "USB/serial port for printer connection."
+#~ msgstr "USB/porta serial para conexão da impressora."
+
+#~ msgid "Serial port speed"
+#~ msgstr "Velocidade da porta serial"
+
+#~ msgid "Speed (baud) of USB/serial port for printer connection."
+#~ msgstr "Velocidade (baud) do USB/porta serial para conexão da impressora."
+
+#~ msgid ""
+#~ "Extruder temperature for layers after the first one. Set this to zero to "
+#~ "disable temperature control commands in the output."
+#~ msgstr ""
+#~ "Temperatura da extrusora para camadas após a primeira. Defina como zero "
+#~ "para desabilitar os comandos de controle de temperatura na saída."
+
+#~ msgid "Extruder temperature"
+#~ msgstr "Temperaturas da mesa e da extrusora"
+
+#~ msgid "You have to select at least one filament for selected printers"
+#~ msgstr ""
+#~ "Você tem que selecionar pelo menos um filamento para impressoras "
+#~ "selecionadas"
+
+#~ msgid "Layer height:"
+#~ msgstr "Altura da camada:"
+
+#~ msgid "Unsaved Presets"
+#~ msgstr "config. não salvas"
+
+#~ msgid "Show/Hide Legend"
+#~ msgstr "Ligar/Desligar Legenda"
+
+#, c-format
+#~ msgid "Processing input file %s"
+#~ msgstr "Processando o arquivo de entrada %s"
+
+#~ msgid "Hollow"
+#~ msgstr "Vazado"
+
+#~ msgid "Indexing hollowed object"
+#~ msgstr "Indexando objeto oco"
+
+#~ msgid "Hollowing cancelled."
+#~ msgstr "Cancelado"
+
+#~ msgid "Hollowing done."
+#~ msgstr "Deixado oco pronto."
+
+#~ msgid "Hollowing failed."
+#~ msgstr "Deixar oco falhou."
+
+#~ msgid "USB/Serial connection"
+#~ msgstr "Conexão USB/serial"
+
+#~ msgid "Rescan serial ports"
+#~ msgstr "Portas seriais de Rescan"
+
+#~ msgid "Connection failed."
+#~ msgstr "A conexão falhou."
+
+#, c-format
+#~ msgid "Default preset (%s)"
+#~ msgstr "Predefinição padrão ( %s)"
+
+#, c-format
+#~ msgid "Preset (%s)"
+#~ msgstr "Predefinição ( %s)"
+
+#~ msgid "is not compatible with printer"
+#~ msgstr "não é compatível com a impressora"
+
+#~ msgid "is not compatible with print profile"
+#~ msgstr "não é compatível com o perfil de impressão"
+
+#~ msgctxt "PresetName"
+#~ msgid "%1% - Copy"
+#~ msgstr "%1% - cópia"
+
+#~ msgid "Support head penetration"
+#~ msgstr "Suporte de penetração da cabeça"
#~ msgid "Layers heights"
#~ msgstr "Altura de camada"
@@ -10825,8 +13143,7 @@ msgstr "Vazão volumétrica (mm³/s)"
#~ msgstr "Selecionar nova extrusora para objeto/parte"
#~ msgid "Select extruder number for selected objects and/or parts"
-#~ msgstr ""
-#~ "Selecione o número da extrusora para objetos e/ou peças selecionados"
+#~ msgstr "Selecione o número da extrusora para objetos e/ou peças selecionados"
#~ msgid "Object Manipulation"
#~ msgstr "Manipulação de objeto"
@@ -10853,8 +13170,8 @@ msgstr "Vazão volumétrica (mm³/s)"
#~ msgstr "O projeto selecionado não está mais disponível"
#~ msgid ""
-#~ "Messages with severity lower or eqal to the loglevel will be printed out. "
-#~ "0:trace, 1:debug, 2:info, 3:warning, 4:error, 5:fatal"
+#~ "Messages with severity lower or eqal to the loglevel will be printed out. 0:"
+#~ "trace, 1:debug, 2:info, 3:warning, 4:error, 5:fatal"
#~ msgstr ""
-#~ "Mensagens com severidade menor ou igual para o LogLevel serão impressos. "
-#~ "0: Trace, 1: debug, 2: info, 3: aviso, 4: erro, 5: fatal"
+#~ "Mensagens com severidade menor ou igual para o LogLevel serão impressos. 0: "
+#~ "Trace, 1: debug, 2: info, 3: aviso, 4: erro, 5: fatal"
diff --git a/resources/localization/ru/PrusaSlicer.mo b/resources/localization/ru/PrusaSlicer.mo
new file mode 100644
index 000000000..c0b9a51e9
--- /dev/null
+++ b/resources/localization/ru/PrusaSlicer.mo
Binary files differ
diff --git a/resources/localization/ru/PrusaSlicer_ru.po b/resources/localization/ru/PrusaSlicer_ru.po
new file mode 100644
index 000000000..93c914542
--- /dev/null
+++ b/resources/localization/ru/PrusaSlicer_ru.po
@@ -0,0 +1,12847 @@
+# Copyright (C) 2018
+# This file is distributed under the same license as the Slic3r Prusa Edition package.
+#
+# Alexander Golikov <alex@ws54.tk>, 2018.
+# Alexander Khvostuk <axboct@gmail.com>, 2018.
+# Andylg N. <andylg@yandex.ru>, 2018.
+# Andrey Tarasik <tarasik99@gmail.com>, 2018.
+# Yuri Kozlov <yuray@komyakino.ru>, 2020.
+msgid ""
+msgstr ""
+"Project-Id-Version: Slic3r Prusa Edition 1.41.1\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2020-12-01 16:23+0100\n"
+"PO-Revision-Date: 2020-12-01 13:18+0100\n"
+"Last-Translator: Oleksandra Iushchenko <yusanka@gmail.com>\n"
+"Language-Team: Russian <man-pages-ru-talks@lists.sourceforge.net>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: Poedit 2.4.2\n"
+"X-Poedit-Flags-xgettext: --add-comments\n"
+
+#: src/slic3r/GUI/AboutDialog.cpp:42 src/slic3r/GUI/AboutDialog.cpp:297
+msgid "Portions copyright"
+msgstr "ЧаÑти авторÑких прав"
+
+#: src/slic3r/GUI/AboutDialog.cpp:132 src/slic3r/GUI/AboutDialog.cpp:261
+msgid "Copyright"
+msgstr "ÐвторÑкие права"
+
+#. TRN "Slic3r _is licensed under the_ License"
+#: src/slic3r/GUI/AboutDialog.cpp:134
+msgid ""
+"License agreements of all following programs (libraries) are part of "
+"application license agreement"
+msgstr ""
+"Лицензионные ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð²Ñех Ñледующих программ (библиотек) ÑвлÑÑŽÑ‚ÑÑ Ñ‡Ð°Ñтью "
+"лицензионного ÑÐ¾Ð³Ð»Ð°ÑˆÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ"
+
+#: src/slic3r/GUI/AboutDialog.cpp:204
+#, c-format
+msgid "About %s"
+msgstr "О %s"
+
+#: src/slic3r/GUI/AboutDialog.cpp:236 src/slic3r/GUI/GUI_App.cpp:231
+#: src/slic3r/GUI/MainFrame.cpp:153
+msgid "Version"
+msgstr "ВерÑиÑ"
+
+#. TRN "Slic3r _is licensed under the_ License"
+#: src/slic3r/GUI/AboutDialog.cpp:263 src/slic3r/GUI/GUI_App.cpp:236
+msgid "is licensed under the"
+msgstr "лицензирована на уÑловиÑÑ…"
+
+#: src/slic3r/GUI/AboutDialog.cpp:264 src/slic3r/GUI/GUI_App.cpp:236
+msgid "GNU Affero General Public License, version 3"
+msgstr "GNU Affero General Public License верÑии 3"
+
+#: src/slic3r/GUI/AboutDialog.cpp:265
+msgid ""
+"PrusaSlicer is based on Slic3r by Alessandro Ranellucci and the RepRap "
+"community."
+msgstr ""
+"PrusaSlicer оÑнована на Slic3r, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ð°Ð¿Ð¸Ñана Alessandro Ranellucci и "
+"ÑообщеÑтвом RepRap."
+
+#: src/slic3r/GUI/AboutDialog.cpp:266
+msgid ""
+"Contributions by Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, "
+"Petr Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik and "
+"numerous others."
+msgstr ""
+"При учаÑтии Henrik Brix Andersen, Nicolas Dandrimont, Mark Hindess, Petr "
+"Ledvina, Joseph Lenox, Y. Sapir, Mike Sheldrake, Vojtech Bubnik и многих "
+"других."
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:77
+#, c-format
+msgid ""
+"%s has encountered an error. It was likely caused by running out of memory. "
+"If you are sure you have enough RAM on your system, this may also be a bug "
+"and we would be glad if you reported it."
+msgstr ""
+"Возникла ошибка в %s. ВероÑтно, Ñто вызвано нехваткой памÑти. ЕÑли в вашей "
+"ÑиÑтеме много оперативной памÑти, то, возможно, вы обнаружили ошибку в "
+"программе, пожалуйÑта, Ñообщите о Ñтом."
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:156
+msgid ""
+"Copying of the temporary G-code to the output G-code failed. Maybe the SD "
+"card is write locked?\n"
+"Error message: %1%"
+msgstr ""
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:159
+msgid ""
+"Copying of the temporary G-code to the output G-code failed. There might be "
+"problem with target device, please try exporting again or using different "
+"device. The corrupted output G-code is at %1%.tmp."
+msgstr ""
+"Ðе удалоÑÑŒ Ñкопировать временный G-код в конечный G-код. Это может быть из-"
+"за проблемы Ñ ÑƒÑтройÑтвом куда выполнÑетÑÑ Ð·Ð°Ð¿Ð¸ÑÑŒ, попробуйте запуÑтить "
+"ÑкÑпорт ещё раз или иÑпользуйте другое уÑтройÑтво. Повреждённый конечный G-"
+"код находитÑÑ Ð² файле %1%.tmp."
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:162
+msgid ""
+"Renaming of the G-code after copying to the selected destination folder has "
+"failed. Current path is %1%.tmp. Please try exporting again."
+msgstr ""
+"Ðе удалоÑÑŒ переименовать G-код поÑле ÐºÐ¾Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² указанный каталог "
+"назначениÑ. Текущий путь: %1%.tmp. Попробуйте выполнить ÑкÑпорт ещё раз."
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:165
+msgid ""
+"Copying of the temporary G-code has finished but the original code at %1% "
+"couldn't be opened during copy check. The output G-code is at %2%.tmp."
+msgstr ""
+"Копирование временного G-кода выполнено, но не удалоÑÑŒ открыть оригинальный "
+"код %1% Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ копированиÑ. Конечный G-код в файле %2%.tmp."
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:168
+msgid ""
+"Copying of the temporary G-code has finished but the exported code couldn't "
+"be opened during copy check. The output G-code is at %1%.tmp."
+msgstr ""
+"Копирование временного G-кода выполнено, но ÑкÑпортированный код не удалоÑÑŒ "
+"открыть во Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ копированиÑ. Конечный G-код запиÑан в файл %1%.tmp."
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:171
+msgid "Unknown error occured during exporting G-code."
+msgstr ""
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:176
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:525
+msgid "Running post-processing scripts"
+msgstr "ВыполнÑÑŽÑ‚ÑÑ Ñценарии поÑтобработки"
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:178
+msgid "G-code file exported to %1%"
+msgstr "Файл G-кода ÑкÑпортирован в %1%"
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:183
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:232
+msgid "Slicing complete"
+msgstr "Ðарезка выполнена"
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:227
+msgid "Masked SLA file exported to %1%"
+msgstr "Файл SLA-маÑки ÑкÑпортирован в %1%"
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:528
+msgid "Copying of the temporary G-code to the output G-code failed"
+msgstr "Ðе удалоÑÑŒ Ñкопировать временный G-код в конечный G-код"
+
+#: src/slic3r/GUI/BackgroundSlicingProcess.cpp:551
+msgid "Scheduling upload to `%1%`. See Window -> Print Host Upload Queue"
+msgstr ""
+"Запланирована отправка в «%1%». Смотрите Окна -> Очередь отправки на узел "
+"печати"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:93
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:240 src/slic3r/GUI/Plater.cpp:162
+#: src/slic3r/GUI/Tab.cpp:2531
+msgid "Size"
+msgstr "Размер"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:94
+msgid "Origin"
+msgstr "Ðачало координат"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:95 src/libslic3r/PrintConfig.cpp:754
+msgid "Diameter"
+msgstr "Диаметр"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:110
+msgid "Size in X and Y of the rectangular plate."
+msgstr "Размеры прÑмоугольной платформы в XY координатах."
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:121
+msgid ""
+"Distance of the 0,0 G-code coordinate from the front left corner of the "
+"rectangle."
+msgstr ""
+"РаÑÑтоÑние от координаты 0,0 G-кода. ОтÑчёт от левого переднего угла "
+"прÑмоугольной платформы."
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:129 src/slic3r/GUI/ConfigWizard.cpp:237
+#: src/slic3r/GUI/ConfigWizard.cpp:1359 src/slic3r/GUI/ConfigWizard.cpp:1373
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:88
+#: src/slic3r/GUI/GCodeViewer.cpp:2324 src/slic3r/GUI/GCodeViewer.cpp:2330
+#: src/slic3r/GUI/GCodeViewer.cpp:2338 src/slic3r/GUI/GUI_ObjectLayers.cpp:145
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:96
+#: src/slic3r/GUI/WipeTowerDialog.cpp:85 src/libslic3r/PrintConfig.cpp:75
+#: src/libslic3r/PrintConfig.cpp:82 src/libslic3r/PrintConfig.cpp:93
+#: src/libslic3r/PrintConfig.cpp:131 src/libslic3r/PrintConfig.cpp:229
+#: src/libslic3r/PrintConfig.cpp:287 src/libslic3r/PrintConfig.cpp:362
+#: src/libslic3r/PrintConfig.cpp:370 src/libslic3r/PrintConfig.cpp:420
+#: src/libslic3r/PrintConfig.cpp:550 src/libslic3r/PrintConfig.cpp:561
+#: src/libslic3r/PrintConfig.cpp:579 src/libslic3r/PrintConfig.cpp:757
+#: src/libslic3r/PrintConfig.cpp:1230 src/libslic3r/PrintConfig.cpp:1411
+#: src/libslic3r/PrintConfig.cpp:1472 src/libslic3r/PrintConfig.cpp:1490
+#: src/libslic3r/PrintConfig.cpp:1508 src/libslic3r/PrintConfig.cpp:1566
+#: src/libslic3r/PrintConfig.cpp:1576 src/libslic3r/PrintConfig.cpp:1697
+#: src/libslic3r/PrintConfig.cpp:1705 src/libslic3r/PrintConfig.cpp:1746
+#: src/libslic3r/PrintConfig.cpp:1754 src/libslic3r/PrintConfig.cpp:1764
+#: src/libslic3r/PrintConfig.cpp:1772 src/libslic3r/PrintConfig.cpp:1780
+#: src/libslic3r/PrintConfig.cpp:1843 src/libslic3r/PrintConfig.cpp:2109
+#: src/libslic3r/PrintConfig.cpp:2180 src/libslic3r/PrintConfig.cpp:2214
+#: src/libslic3r/PrintConfig.cpp:2343 src/libslic3r/PrintConfig.cpp:2422
+#: src/libslic3r/PrintConfig.cpp:2429 src/libslic3r/PrintConfig.cpp:2436
+#: src/libslic3r/PrintConfig.cpp:2466 src/libslic3r/PrintConfig.cpp:2476
+#: src/libslic3r/PrintConfig.cpp:2486 src/libslic3r/PrintConfig.cpp:2646
+#: src/libslic3r/PrintConfig.cpp:2680 src/libslic3r/PrintConfig.cpp:2819
+#: src/libslic3r/PrintConfig.cpp:2828 src/libslic3r/PrintConfig.cpp:2837
+#: src/libslic3r/PrintConfig.cpp:2847 src/libslic3r/PrintConfig.cpp:2912
+#: src/libslic3r/PrintConfig.cpp:2922 src/libslic3r/PrintConfig.cpp:2934
+#: src/libslic3r/PrintConfig.cpp:2954 src/libslic3r/PrintConfig.cpp:2964
+#: src/libslic3r/PrintConfig.cpp:2974 src/libslic3r/PrintConfig.cpp:2992
+#: src/libslic3r/PrintConfig.cpp:3007 src/libslic3r/PrintConfig.cpp:3021
+#: src/libslic3r/PrintConfig.cpp:3032 src/libslic3r/PrintConfig.cpp:3045
+#: src/libslic3r/PrintConfig.cpp:3090 src/libslic3r/PrintConfig.cpp:3100
+#: src/libslic3r/PrintConfig.cpp:3109 src/libslic3r/PrintConfig.cpp:3119
+#: src/libslic3r/PrintConfig.cpp:3135 src/libslic3r/PrintConfig.cpp:3159
+msgid "mm"
+msgstr "мм"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:131
+msgid ""
+"Diameter of the print bed. It is assumed that origin (0,0) is located in the "
+"center."
+msgstr ""
+"Диаметр платформы печати. ПредполагаетÑÑ, что начало координат (0,0) "
+"находитÑÑ Ð² центре."
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:141
+msgid "Rectangular"
+msgstr "ПрÑмоугольнаÑ"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:142
+msgid "Circular"
+msgstr "КруглаÑ"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:143 src/slic3r/GUI/GUI_Preview.cpp:257
+#: src/libslic3r/ExtrusionEntity.cpp:323 src/libslic3r/ExtrusionEntity.cpp:358
+msgid "Custom"
+msgstr "ПользовательÑкаÑ"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:145
+msgid "Invalid"
+msgstr ""
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:156 src/slic3r/GUI/BedShapeDialog.cpp:222
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2215
+msgid "Shape"
+msgstr "Форма"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:243
+msgid "Load shape from STL..."
+msgstr "Загрузить форму платформы из STL-файла…"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:292 src/slic3r/GUI/MainFrame.cpp:1816
+msgid "Settings"
+msgstr "Параметры"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:315
+msgid "Texture"
+msgstr "ТекÑтура"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:325 src/slic3r/GUI/BedShapeDialog.cpp:405
+msgid "Load..."
+msgstr "Загрузить…"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:333 src/slic3r/GUI/BedShapeDialog.cpp:413
+#: src/slic3r/GUI/Tab.cpp:3474
+msgid "Remove"
+msgstr "Убрать"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:366 src/slic3r/GUI/BedShapeDialog.cpp:446
+msgid "Not found:"
+msgstr "Ðе найден:"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:395
+msgid "Model"
+msgstr "Модель"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:563
+msgid "Choose an STL file to import bed shape from:"
+msgstr "Выберите файл STL Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð° формы платформы из:"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:570 src/slic3r/GUI/BedShapeDialog.cpp:619
+#: src/slic3r/GUI/BedShapeDialog.cpp:642
+msgid "Invalid file format."
+msgstr "Ðеправильный формат файла."
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:581
+msgid "Error! Invalid model"
+msgstr "Ошибка! ÐÐµÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:589
+msgid "The selected file contains no geometry."
+msgstr "Выбранный файл не Ñодержит геометрии."
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:593
+msgid ""
+"The selected file contains several disjoint areas. This is not supported."
+msgstr ""
+"Выбранный файл Ñодержит неÑколько не переÑекающихÑÑ Ð¾Ð±Ð»Ð°Ñтей. Такие файлы не "
+"поддерживаютÑÑ."
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:608
+msgid "Choose a file to import bed texture from (PNG/SVG):"
+msgstr "Выберите файл Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð° текÑтуры платформы из (PNG/SVG):"
+
+#: src/slic3r/GUI/BedShapeDialog.cpp:631
+msgid "Choose an STL file to import bed model from:"
+msgstr "Выберите файл STL Ð´Ð»Ñ Ð¸Ð¼Ð¿Ð¾Ñ€Ñ‚Ð° модели платформы из:"
+
+#: src/slic3r/GUI/BedShapeDialog.hpp:98 src/slic3r/GUI/ConfigWizard.cpp:1318
+msgid "Bed Shape"
+msgstr "Форма платформы"
+
+#: src/slic3r/GUI/BonjourDialog.cpp:55
+msgid "Network lookup"
+msgstr "ПоиÑк по Ñети"
+
+#: src/slic3r/GUI/BonjourDialog.cpp:72
+msgid "Address"
+msgstr "ÐдреÑ"
+
+#: src/slic3r/GUI/BonjourDialog.cpp:73
+msgid "Hostname"
+msgstr "Ð˜Ð¼Ñ ÑƒÐ·Ð»Ð°"
+
+#: src/slic3r/GUI/BonjourDialog.cpp:74
+msgid "Service name"
+msgstr "Ð˜Ð¼Ñ Ñлужбы"
+
+#: src/slic3r/GUI/BonjourDialog.cpp:76
+msgid "OctoPrint version"
+msgstr "ВерÑÐ¸Ñ OctoPrint"
+
+#: src/slic3r/GUI/BonjourDialog.cpp:218
+msgid "Searching for devices"
+msgstr "ПоиÑк уÑтройÑтв"
+
+#: src/slic3r/GUI/BonjourDialog.cpp:225
+msgid "Finished"
+msgstr "Завершено"
+
+#: src/slic3r/GUI/ButtonsDescription.cpp:16
+msgid "Buttons And Text Colors Description"
+msgstr "ОпиÑание кнопок и цвет текÑта"
+
+#: src/slic3r/GUI/ButtonsDescription.cpp:36
+msgid "Value is the same as the system value"
+msgstr "Значение Ñовпадает Ñ ÑиÑтемным значением"
+
+#: src/slic3r/GUI/ButtonsDescription.cpp:53
+msgid ""
+"Value was changed and is not equal to the system value or the last saved "
+"preset"
+msgstr ""
+"Значение изменено и не равно ÑиÑтемному значению или поÑледнему Ñохранённому "
+"профилю"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:47
+msgid ""
+"Zero layer height is not valid.\n"
+"\n"
+"The layer height will be reset to 0.01."
+msgstr ""
+"ÐÑƒÐ»ÐµÐ²Ð°Ñ Ð²Ñ‹Ñота ÑÐ»Ð¾Ñ Ð½Ðµ допуÑкаетÑÑ.\n"
+"\n"
+"Ð’Ñ‹Ñота ÑÐ»Ð¾Ñ Ð±ÑƒÐ´ÐµÑ‚ уÑтановлена равной 0.01."
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:48
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29 src/slic3r/GUI/Tab.cpp:1389
+#: src/libslic3r/PrintConfig.cpp:71
+msgid "Layer height"
+msgstr "Ð’Ñ‹Ñота ÑлоÑ"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:59
+msgid ""
+"Zero first layer height is not valid.\n"
+"\n"
+"The first layer height will be reset to 0.01."
+msgstr ""
+"ÐÑƒÐ»ÐµÐ²Ð°Ñ Ð²Ñ‹Ñота первого ÑÐ»Ð¾Ñ Ð½Ðµ допуÑкаетÑÑ.\n"
+"\n"
+"Ð’Ñ‹Ñота первого ÑÐ»Ð¾Ñ Ð±ÑƒÐ´ÐµÑ‚ уÑтановлена равной 0.01."
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:60 src/libslic3r/PrintConfig.cpp:952
+msgid "First layer height"
+msgstr "Ð’Ñ‹Ñота первого ÑлоÑ"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:80
+msgid ""
+"The Spiral Vase mode requires:\n"
+"- one perimeter\n"
+"- no top solid layers\n"
+"- 0% fill density\n"
+"- no support material\n"
+"- Ensure vertical shell thickness enabled\n"
+"- Detect thin walls disabled"
+msgstr ""
+"Ð”Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° Â«Ð¡Ð¿Ð¸Ñ€Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ð°Ð·Ð°Â» требуютÑÑ Ð½Ð°Ñтройки:\n"
+"- периметр в одну Ñтенку\n"
+"- выключение верхних Ñплошных Ñлоёв\n"
+"- плотноÑÑ‚ÑŒ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ 0%\n"
+"- выключение материала поддержек\n"
+"- включение обеÑÐ¿ÐµÑ‡ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð»Ñ‰Ð¸Ð½Ñ‹ вертикальной оболочки\n"
+"- выключение Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð½ÐºÐ¸Ñ… Ñтенок"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:88
+msgid "Shall I adjust those settings in order to enable Spiral Vase?"
+msgstr "Изменить Ñти наÑтройки, чтобы задейÑтвовать режим Â«Ð¡Ð¿Ð¸Ñ€Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ð°Ð·Ð°Â»?"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:89
+msgid "Spiral Vase"
+msgstr "Ð¡Ð¿Ð¸Ñ€Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ð°Ð·Ð°"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:114
+msgid ""
+"The Wipe Tower currently supports the non-soluble supports only\n"
+"if they are printed with the current extruder without triggering a tool "
+"change.\n"
+"(both support_material_extruder and support_material_interface_extruder need "
+"to be set to 0)."
+msgstr ""
+"Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð±Ð°ÑˆÐ½Ñ Ð¾Ñ‡Ð¸Ñтки поддерживаетÑÑ Ð´Ð»Ñ Ð½ÐµÑ€Ð°Ñтворимых поддержек\n"
+"только в том Ñлучае, еÑли они печатаютÑÑ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ð¼ ÑкÑтрудером, без запуÑка\n"
+"Ñмены Ñопла (Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ support_material_extruder и\n"
+"support_material_interface_extruder должны быть уÑтановлены в 0)."
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:118
+msgid "Shall I adjust those settings in order to enable the Wipe Tower?"
+msgstr "Изменить Ñти наÑтройки, чтобы включить башню очиÑтки?"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:119
+#: src/slic3r/GUI/ConfigManipulation.cpp:139
+msgid "Wipe Tower"
+msgstr "Ð‘Ð°ÑˆÐ½Ñ Ð¾Ñ‡Ð¸Ñтки"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:135
+msgid ""
+"For the Wipe Tower to work with the soluble supports, the support layers\n"
+"need to be synchronized with the object layers."
+msgstr ""
+"Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы Ð±Ð°ÑˆÐ½Ñ Ð¾Ñ‡Ð¸Ñтки работала Ð´Ð»Ñ Ñ€Ð°Ñтворимых поддержек,\n"
+"Ñлои поддержек должны быть Ñинхронизированы Ñо ÑлоÑми объекта."
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:138
+msgid "Shall I synchronize support layers in order to enable the Wipe Tower?"
+msgstr "Синхронизировать Ñлои поддержек, чтобы включить башню очиÑтки?"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:158
+msgid ""
+"Supports work better, if the following feature is enabled:\n"
+"- Detect bridging perimeters"
+msgstr ""
+"Поддержки работают лучше, еÑли включена ÑÐ»ÐµÐ´ÑƒÑŽÑ‰Ð°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ:\n"
+"- ОпределÑÑ‚ÑŒ навиÑающие периметры"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:161
+msgid "Shall I adjust those settings for supports?"
+msgstr "Изменить Ñти наÑтройки Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐµÐº?"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:162
+msgid "Support Generator"
+msgstr "Генератор поддержек"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:207
+msgid "The %1% infill pattern is not supposed to work at 100%% density."
+msgstr "Шаблон Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ %1% не предполагает работу Ñо 100%% заполнением."
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:209
+msgid "Shall I switch to rectilinear fill pattern?"
+msgstr "Заменить его на прÑмолинейный (Rectilinear)?"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:210
+#: src/slic3r/GUI/GUI_ObjectList.cpp:35 src/slic3r/GUI/GUI_ObjectList.cpp:93
+#: src/slic3r/GUI/GUI_ObjectList.cpp:652 src/slic3r/GUI/Plater.cpp:389
+#: src/slic3r/GUI/Tab.cpp:1433 src/slic3r/GUI/Tab.cpp:1435
+#: src/libslic3r/PrintConfig.cpp:244 src/libslic3r/PrintConfig.cpp:457
+#: src/libslic3r/PrintConfig.cpp:481 src/libslic3r/PrintConfig.cpp:831
+#: src/libslic3r/PrintConfig.cpp:845 src/libslic3r/PrintConfig.cpp:882
+#: src/libslic3r/PrintConfig.cpp:1048 src/libslic3r/PrintConfig.cpp:1058
+#: src/libslic3r/PrintConfig.cpp:1125 src/libslic3r/PrintConfig.cpp:1144
+#: src/libslic3r/PrintConfig.cpp:1163 src/libslic3r/PrintConfig.cpp:1896
+#: src/libslic3r/PrintConfig.cpp:1913
+msgid "Infill"
+msgstr "Заполнение"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:325
+msgid "Head penetration should not be greater than the head width."
+msgstr ""
+"Погружение головной чаÑти не должно быть больше толщины головной чаÑти."
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:327
+msgid "Invalid Head penetration"
+msgstr "Ðекорректное погружение головной чаÑти"
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:338
+msgid "Pinhead diameter should be smaller than the pillar diameter."
+msgstr "Диаметр точки ÐºÑ€ÐµÐ¿Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ быть меньше диаметра колонны."
+
+#: src/slic3r/GUI/ConfigManipulation.cpp:340
+msgid "Invalid pinhead diameter"
+msgstr "Ðекорректный диаметр точки креплениÑ"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:19
+msgid "Upgrade"
+msgstr "Обновить"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:21
+msgid "Downgrade"
+msgstr "Понизить верÑию"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:23
+msgid "Before roll back"
+msgstr "Перед откатом к прежнему"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:25 src/libslic3r/PrintConfig.cpp:139
+msgid "User"
+msgstr "Пользователь"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:28
+#: src/slic3r/GUI/GUI_Preview.cpp:243 src/libslic3r/ExtrusionEntity.cpp:309
+msgid "Unknown"
+msgstr "ÐеизвеÑтно"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:44
+msgid "Active"
+msgstr "Ðктивировать"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:51
+msgid "PrusaSlicer version"
+msgstr "ВерÑÐ¸Ñ PrusaSlicer"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:55 src/libslic3r/Preset.cpp:1257
+msgid "print"
+msgstr "печать"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:56
+msgid "filaments"
+msgstr "пруток"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:59 src/libslic3r/Preset.cpp:1259
+msgid "SLA print"
+msgstr "Печать SLA"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:60 src/slic3r/GUI/Plater.cpp:696
+#: src/libslic3r/Preset.cpp:1260
+msgid "SLA material"
+msgstr "Материал SLA"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:62 src/libslic3r/Preset.cpp:1261
+msgid "printer"
+msgstr "принтер"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:66 src/slic3r/GUI/Tab.cpp:1306
+msgid "vendor"
+msgstr "производитель"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:66
+msgid "version"
+msgstr "верÑиÑ"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:67
+msgid "min PrusaSlicer version"
+msgstr "Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ PrusaSlicer"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:69
+msgid "max PrusaSlicer version"
+msgstr "макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ PrusaSlicer"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:72
+msgid "model"
+msgstr "модель"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:72
+msgid "variants"
+msgstr "модификации"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:84
+#, c-format
+msgid "Incompatible with this %s"
+msgstr "ÐеÑовмеÑтимо Ñ Ñтой верÑией %s"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:87
+msgid "Activate"
+msgstr "Ðктивировать"
+
+#: src/slic3r/GUI/ConfigSnapshotDialog.cpp:113
+msgid "Configuration Snapshots"
+msgstr "Резервные копии конфигурации (Ñнапшот)"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:237
+msgid "nozzle"
+msgstr "Ñопло"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:241
+msgid "Alternate nozzles:"
+msgstr "Другие Ñопла:"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:305
+msgid "All standard"
+msgstr "Ð’Ñе Ñтандартные"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:305
+msgid "Standard"
+msgstr "Стандартные"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:306 src/slic3r/GUI/ConfigWizard.cpp:596
+#: src/slic3r/GUI/Tab.cpp:3555 src/slic3r/GUI/UnsavedChangesDialog.cpp:927
+msgid "All"
+msgstr "Ð’Ñе"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:307 src/slic3r/GUI/ConfigWizard.cpp:597
+#: src/slic3r/GUI/DoubleSlider.cpp:1824 src/slic3r/GUI/Plater.cpp:361
+#: src/slic3r/GUI/Plater.cpp:504
+msgid "None"
+msgstr "Ðет"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:443
+#, c-format
+msgid "Welcome to the %s Configuration Assistant"
+msgstr "Помощник по наÑтройке %s"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:445
+#, c-format
+msgid "Welcome to the %s Configuration Wizard"
+msgstr "МаÑтер наÑтройки %s"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:447
+msgid "Welcome"
+msgstr "Ðачало"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:449
+#, c-format
+msgid ""
+"Hello, welcome to %s! This %s helps you with the initial configuration; just "
+"a few settings and you will be ready to print."
+msgstr ""
+"ПриветÑтвуем Ð²Ð°Ñ Ð² %s! %s поможет вам Ñ Ð½Ð°Ñ‡Ð°Ð»ÑŒÐ½Ð¾Ð¹ наÑтройкой программы; "
+"вÑего неÑколько вопроÑов и вы Ñможете печатать."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:454
+msgid "Remove user profiles (a snapshot will be taken beforehand)"
+msgstr "Удалить профили пользователей (перед Ñтим будет Ñделан Ñнапшот)"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:497
+#, c-format
+msgid "%s Family"
+msgstr "СемейÑтво %s"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:585
+msgid "Printer:"
+msgstr ""
+
+#: src/slic3r/GUI/ConfigWizard.cpp:587
+msgid "Vendor:"
+msgstr "Производитель:"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:588
+msgid "Profile:"
+msgstr "Профиль:"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:660 src/slic3r/GUI/ConfigWizard.cpp:810
+#: src/slic3r/GUI/ConfigWizard.cpp:871 src/slic3r/GUI/ConfigWizard.cpp:1008
+msgid "(All)"
+msgstr "(Ð’Ñе)"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:689
+msgid ""
+"Filaments marked with <b>*</b> are <b>not</b> compatible with some installed "
+"printers."
+msgstr ""
+
+#: src/slic3r/GUI/ConfigWizard.cpp:692
+msgid "All installed printers are compatible with the selected filament."
+msgstr ""
+
+#: src/slic3r/GUI/ConfigWizard.cpp:712
+msgid ""
+"Only the following installed printers are compatible with the selected "
+"filament:"
+msgstr ""
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1098
+msgid "Custom Printer Setup"
+msgstr "УÑтановки заказного принтера"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1098
+msgid "Custom Printer"
+msgstr "Заказной принтер"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1100
+msgid "Define a custom printer profile"
+msgstr "Создать профиль заказного принтера"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1102
+msgid "Custom profile name:"
+msgstr "Ð˜Ð¼Ñ Ð·Ð°ÐºÐ°Ð·Ð½Ð¾Ð³Ð¾ профилÑ:"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1127
+msgid "Automatic updates"
+msgstr "ÐвтоматичеÑкое обновление"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1127
+msgid "Updates"
+msgstr "ОбновлениÑ"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1135 src/slic3r/GUI/Preferences.cpp:73
+msgid "Check for application updates"
+msgstr "ПроверÑÑ‚ÑŒ обновлениÑ"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1139
+#, c-format
+msgid ""
+"If enabled, %s checks for new application versions online. When a new "
+"version becomes available, a notification is displayed at the next "
+"application startup (never during program usage). This is only a "
+"notification mechanisms, no automatic installation is done."
+msgstr ""
+"ЕÑли включено, то %s проверÑет наличие новых верÑий Ð¿Ñ€Ð¸Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð² Ñети. ЕÑли "
+"доÑтупна Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑиÑ, то при Ñледующем запуÑке отображаетÑÑ ÑƒÐ²ÐµÐ´Ð¾Ð¼Ð»ÐµÐ½Ð¸Ðµ (не "
+"отображаетÑÑ Ð²Ð¾ Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ программы). ÐвтоматичеÑÐºÐ°Ñ ÑƒÑтановка не "
+"производитÑÑ. Ð’Ñ‹ увидите только уведомление."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1145 src/slic3r/GUI/Preferences.cpp:108
+msgid "Update built-in Presets automatically"
+msgstr "ОбновлÑÑ‚ÑŒ вÑтроенные профили автоматичеÑки"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1149
+#, c-format
+msgid ""
+"If enabled, %s downloads updates of built-in system presets in the "
+"background.These updates are downloaded into a separate temporary location."
+"When a new preset version becomes available it is offered at application "
+"startup."
+msgstr ""
+"ЕÑли включено, то %s будет Ñкачивать Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ñтроенных ÑиÑтемных "
+"профилей в фоновом режиме. Эти Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑкачиваютÑÑ Ð² отдельный временный "
+"каталог. Когда новые профили ÑтановÑÑ‚ÑÑ Ð´Ð¾Ñтупны, они предлагаютÑÑ Ð¿Ñ€Ð¸ "
+"запуÑке приложениÑ."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1152
+msgid ""
+"Updates are never applied without user's consent and never overwrite user's "
+"customized settings."
+msgstr ""
+"ÐžÐ±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð¸ÐºÐ¾Ð³Ð´Ð° не применÑÑŽÑ‚ÑÑ Ð±ÐµÐ· ÑоглаÑÐ¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¸ никогда не "
+"перезапиÑывают пользовательÑкие наÑтройки."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1157
+msgid ""
+"Additionally a backup snapshot of the whole configuration is created before "
+"an update is applied."
+msgstr ""
+"Кроме того, перед обновлением ÑоздаётÑÑ Ñ€ÐµÐ·ÐµÑ€Ð²Ð½Ð°Ñ ÐºÐ¾Ð¿Ð¸Ñ Ð²Ñех наÑтроек "
+"(Ñнапшот)."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1164 src/slic3r/GUI/GUI_ObjectList.cpp:1793
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4439 src/slic3r/GUI/Plater.cpp:3091
+#: src/slic3r/GUI/Plater.cpp:3924 src/slic3r/GUI/Plater.cpp:3955
+msgid "Reload from disk"
+msgstr "Перезагрузить Ñ Ð´Ð¸Ñка"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1167
+msgid ""
+"Export full pathnames of models and parts sources into 3mf and amf files"
+msgstr ""
+"ЭкÑпортировать полные имена иÑточников моделей и чаÑтей в файлы 3mf и amf"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1171
+msgid ""
+"If enabled, allows the Reload from disk command to automatically find and "
+"load the files when invoked.\n"
+"If not enabled, the Reload from disk command will ask to select each file "
+"using an open file dialog."
+msgstr ""
+"ЕÑли включено, команда перезагрузки Ñ Ð´Ð¸Ñка автоматичеÑки будет находить и "
+"загружать файлы при вызове.\n"
+"ЕÑли выключено, то команда перезагрузки Ñ Ð´Ð¸Ñка будет запрашивать каждый "
+"файл через окно диалога Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1181
+msgid "Files association"
+msgstr ""
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1183 src/slic3r/GUI/Preferences.cpp:91
+msgid "Associate .3mf files to PrusaSlicer"
+msgstr ""
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1184 src/slic3r/GUI/Preferences.cpp:98
+msgid "Associate .stl files to PrusaSlicer"
+msgstr ""
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1195
+msgid "View mode"
+msgstr "Режим проÑмотра"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1197
+msgid ""
+"PrusaSlicer's user interfaces comes in three variants:\n"
+"Simple, Advanced, and Expert.\n"
+"The Simple mode shows only the most frequently used settings relevant for "
+"regular 3D printing. The other two offer progressively more sophisticated "
+"fine-tuning, they are suitable for advanced and expert users, respectively."
+msgstr ""
+"Ð’ PrusaSlicer еÑÑ‚ÑŒ три режима пользовательÑкого интерфейÑа:\n"
+"проÑтой, раÑширенный и ÑкÑпертный.\n"
+"Ð’ проÑтом режиме показываютÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ наиболее чаÑто употреблÑемые наÑтройки "
+"обычной печати 3D. Ð’ других двух по нараÑтающей предлагаютÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ðµ "
+"техничеÑки Ñложные параметры Ð´Ð»Ñ Ñ‚Ð¾Ñ‡Ð½Ð¾Ð¹ наÑтройки; Ñти режимы подходÑÑ‚ Ð´Ð»Ñ "
+"понимающих процеÑÑ Ð¸ ÑкÑпертных пользователей."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1202
+msgid "Simple mode"
+msgstr "ПроÑтой режим"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1203
+msgid "Advanced mode"
+msgstr "РаÑширенный режим"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1204
+msgid "Expert mode"
+msgstr "ЭкÑпертный режим"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1210
+msgid "The size of the object can be specified in inches"
+msgstr ""
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1211
+msgid "Use inches"
+msgstr ""
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1245
+msgid "Other Vendors"
+msgstr "Другие производители"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1249
+#, c-format
+msgid "Pick another vendor supported by %s"
+msgstr "Выберите другого производителÑ, поддерживаемого %s"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1280
+msgid "Firmware Type"
+msgstr "Тип прошивки"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1280 src/slic3r/GUI/Tab.cpp:2172
+msgid "Firmware"
+msgstr "Прошивка"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1284
+msgid "Choose the type of firmware used by your printer."
+msgstr "Выберите тип прошивки вашего принтера."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1318
+msgid "Bed Shape and Size"
+msgstr "Форма и размеры"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1321
+msgid "Set the shape of your printer's bed."
+msgstr "Задайте форму и размеры платформы принтера."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1341
+msgid "Filament and Nozzle Diameters"
+msgstr "Диаметр прутка и Ñопла"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1341
+msgid "Print Diameters"
+msgstr "Диаметры печати"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1355
+msgid "Enter the diameter of your printer's hot end nozzle."
+msgstr "Введите диаметр Ñопла."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1358
+msgid "Nozzle Diameter:"
+msgstr "Диаметр Ñопла:"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1368
+msgid "Enter the diameter of your filament."
+msgstr "Введите диаметр прутка."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1369
+msgid ""
+"Good precision is required, so use a caliper and do multiple measurements "
+"along the filament, then compute the average."
+msgstr ""
+"Ðеобходима Ñ…Ð¾Ñ€Ð¾ÑˆÐ°Ñ Ñ‚Ð¾Ñ‡Ð½Ð¾ÑÑ‚ÑŒ, поÑтому иÑпользуйте штангенциркуль и выполните "
+"неÑколько измерений вдоль прутка, а затем вычиÑлите Ñреднее значение."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1372
+msgid "Filament Diameter:"
+msgstr "Диаметр прутка:"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1406
+msgid "Nozzle and Bed Temperatures"
+msgstr ""
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1406
+msgid "Temperatures"
+msgstr "Температуры"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1422
+msgid "Enter the temperature needed for extruding your filament."
+msgstr "Введите температуру, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ñ‚Ñ€ÐµÐ±ÑƒÐµÑ‚ÑÑ Ð´Ð»Ñ ÑкÑтрузии прутка."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1423
+msgid "A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS."
+msgstr "Как правило Ð´Ð»Ñ PLA Ñто 160-230 °C, а Ð´Ð»Ñ ABS 215-250 °C."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1426
+msgid "Extrusion Temperature:"
+msgstr "Температура ÑкÑтрузии:"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1427 src/slic3r/GUI/ConfigWizard.cpp:1441
+#: src/libslic3r/PrintConfig.cpp:187 src/libslic3r/PrintConfig.cpp:933
+#: src/libslic3r/PrintConfig.cpp:977 src/libslic3r/PrintConfig.cpp:2262
+msgid "°C"
+msgstr "°C"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1436
+msgid ""
+"Enter the bed temperature needed for getting your filament to stick to your "
+"heated bed."
+msgstr ""
+"Введите температуру платформы, необходимую Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы пруток прилипал к "
+"ней."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1437
+msgid ""
+"A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have "
+"no heated bed."
+msgstr ""
+"Как правило Ð´Ð»Ñ PLA Ñто 60 °C, а Ð´Ð»Ñ ABS 110 °С. ЕÑли у Ð²Ð°Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ñ‹ без "
+"подогрева, оÑтавьте 0."
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1440
+msgid "Bed Temperature:"
+msgstr "Температура платформы:"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1900 src/slic3r/GUI/ConfigWizard.cpp:2572
+msgid "Filaments"
+msgstr "Прутки"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1900 src/slic3r/GUI/ConfigWizard.cpp:2574
+msgid "SLA Materials"
+msgstr "Материалы SLA"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1954
+msgid "FFF Technology Printers"
+msgstr "Принтеры Ñ Ñ‚ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ð¸ÐµÐ¹ печати FFF"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:1959
+msgid "SLA Technology Printers"
+msgstr "Принтеры Ñ Ñ‚ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ð¸ÐµÐ¹ печати SLA"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2265 src/slic3r/GUI/DoubleSlider.cpp:2207
+#: src/slic3r/GUI/DoubleSlider.cpp:2227 src/slic3r/GUI/GUI.cpp:244
+msgid "Notice"
+msgstr "Примечание"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2285
+msgid "The following FFF printer models have no filament selected:"
+msgstr "Ð”Ð»Ñ Ñледующих моделей принтеров FFF не указаны прутки:"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2289
+msgid "Do you want to select default filaments for these FFF printer models?"
+msgstr "Хотите выбрать прутки по умолчанию Ð´Ð»Ñ Ñтих моделей принтеров FFF?"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2303
+msgid "The following SLA printer models have no materials selected:"
+msgstr "Ð”Ð»Ñ Ñледующих моделей принтеров SLA не указан материал:"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2307
+msgid "Do you want to select default SLA materials for these printer models?"
+msgstr "Хотите выбрать материалы по умолчанию Ð´Ð»Ñ Ñтих моделей принтеров SLA?"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2535
+msgid "Select all standard printers"
+msgstr "Выбрать вÑе Ñтандартные принтеры"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2538
+msgid "< &Back"
+msgstr "< &Ðазад"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2539
+msgid "&Next >"
+msgstr "&Далее >"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2540
+msgid "&Finish"
+msgstr "&Завершить"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2541 src/slic3r/GUI/FirmwareDialog.cpp:151
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:248
+#: src/slic3r/GUI/ProgressStatusBar.cpp:26
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:650
+msgid "Cancel"
+msgstr "Отмена"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2554
+msgid "Prusa FFF Technology Printers"
+msgstr "Принтеры Prusa Ñ Ñ‚ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ð¸ÐµÐ¹ печати FFF"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2557
+msgid "Prusa MSLA Technology Printers"
+msgstr "Принтеры Prusa Ñ Ñ‚ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ð¸ÐµÐ¹ печати MSLA"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2572
+msgid "Filament Profiles Selection"
+msgstr "Выбор профилей прутка"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2572 src/slic3r/GUI/ConfigWizard.cpp:2574
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4016
+msgid "Type:"
+msgstr "Тип:"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2574
+msgid "SLA Material Profiles Selection"
+msgstr "Выбор профилей материалов SLA"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2677
+msgid "Configuration Assistant"
+msgstr "Помощник по наÑтройке"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2678
+msgid "Configuration &Assistant"
+msgstr "Помощник по наÑтройке"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2680
+msgid "Configuration Wizard"
+msgstr "МаÑтер наÑтройки"
+
+#: src/slic3r/GUI/ConfigWizard.cpp:2681
+msgid "Configuration &Wizard"
+msgstr "МаÑтер наÑтройки"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:96
+msgid "Place bearings in slots and resume printing"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1211
+msgid "One layer mode"
+msgstr "ОдноÑлойный режим"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1213
+msgid "Discard all custom changes"
+msgstr "ОтброÑить вÑе пользовательÑкие изменениÑ"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1217 src/slic3r/GUI/DoubleSlider.cpp:1960
+msgid "Jump to move"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1220
+#, c-format
+msgid ""
+"Jump to height %s Set ruler mode\n"
+" or Set extruder sequence for the entire print"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1222
+#, c-format
+msgid "Jump to height %s or Set ruler mode"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1226
+msgid "Edit current color - Right click the colored slider segment"
+msgstr "Изменить текущий цвет — Правым щелчком по раÑкрашенной чаÑти ползунка"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1236
+msgid "Print mode"
+msgstr "Режим принтера"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1250
+msgid "Add extruder change - Left click"
+msgstr "Добавить \"Сменить ÑкÑтрудер\" - левый щелчок мыши"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1252
+msgid ""
+"Add color change - Left click for predefined color or Shift + Left click for "
+"custom color selection"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1254
+msgid "Add color change - Left click"
+msgstr "Добавить \"Сменить цвет\" - левый щелчок мыши"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1255
+msgid "or press \"+\" key"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1257
+msgid "Add another code - Ctrl + Left click"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1258
+msgid "Add another code - Right click"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1264
+msgid ""
+"The sequential print is on.\n"
+"It's impossible to apply any custom G-code for objects printing "
+"sequentually.\n"
+"This code won't be processed during G-code generation."
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1273
+msgid "Color change (\"%1%\")"
+msgstr "Смена цвета («%1%»)"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1274
+msgid "Color change (\"%1%\") for Extruder %2%"
+msgstr "Смена цвета («%1%») Ð´Ð»Ñ ÑкÑтрудера %2%"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1276
+msgid "Pause print (\"%1%\")"
+msgstr "Пауза печати («%1%»)"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1278
+msgid "Custom template (\"%1%\")"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1280
+msgid "Extruder (tool) is changed to Extruder \"%1%\""
+msgstr "ЭкÑтрудер (инÑтрумент) Ñменен на ÑкÑтрудер «%1%»"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1287
+msgid "Note"
+msgstr "Примечание"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1289
+msgid ""
+"G-code associated to this tick mark is in a conflict with print mode.\n"
+"Editing it will cause changes of Slider data."
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1292
+msgid ""
+"There is a color change for extruder that won't be used till the end of "
+"print job.\n"
+"This code won't be processed during G-code generation."
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1295
+msgid ""
+"There is an extruder change set to the same extruder.\n"
+"This code won't be processed during G-code generation."
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1298
+msgid ""
+"There is a color change for extruder that has not been used before.\n"
+"Check your settings to avoid redundant color changes."
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1303
+msgid "Delete tick mark - Left click or press \"-\" key"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1305
+msgid "Edit tick mark - Ctrl + Left click"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1306
+msgid "Edit tick mark - Right click"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1406 src/slic3r/GUI/DoubleSlider.cpp:1440
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1832 src/slic3r/GUI/Tab.cpp:2527
+#, c-format
+msgid "Extruder %d"
+msgstr "ЭкÑтрудер %d"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1407 src/slic3r/GUI/GUI_ObjectList.cpp:1833
+msgid "active"
+msgstr "активный"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1416
+msgid "Switch code to Change extruder"
+msgstr "Изменить код на \"Сменить ÑкÑтрудер\""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1416 src/slic3r/GUI/GUI_ObjectList.cpp:1800
+msgid "Change extruder"
+msgstr "Сменить ÑкÑтрудер"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1417
+msgid "Change extruder (N/A)"
+msgstr "Сменить ÑкÑтрудер (нед.)"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1419
+msgid "Use another extruder"
+msgstr "ИÑпользовать другой ÑкÑтрудер"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1441
+msgid "used"
+msgstr "иÑпользуетÑÑ"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1449
+msgid "Switch code to Color change (%1%) for:"
+msgstr "Переключить код на Ñмену цвета (%1%) длÑ:"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1450
+msgid "Add color change (%1%) for:"
+msgstr "Добавить Ñмену цвета (%1%) длÑ:"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1763
+msgid "Add color change"
+msgstr "Добавить Ñмену цвета"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1773
+msgid "Add pause print"
+msgstr "Добавить паузу печати"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1777
+msgid "Add custom template"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1780
+msgid "Add custom G-code"
+msgstr "Добавить пользовательÑкий G-код"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1798
+msgid "Edit color"
+msgstr "Редактировать цвет"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1799
+msgid "Edit pause print message"
+msgstr "Редактировать Ñообщение паузы печати"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1800
+msgid "Edit custom G-code"
+msgstr "Редактировать пользовательÑкий G-код"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1806
+msgid "Delete color change"
+msgstr "Удалить Ñмену цвета"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1807
+msgid "Delete tool change"
+msgstr "Удалить Ñмену инÑтрумента"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1808
+msgid "Delete pause print"
+msgstr "Удалить паузу печати"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1809
+msgid "Delete custom G-code"
+msgstr "Удалить пользовательÑкий G-код"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1819 src/slic3r/GUI/DoubleSlider.cpp:1960
+msgid "Jump to height"
+msgstr "ПеремеÑтитьÑÑ Ð½Ð° выÑоту"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1824
+msgid "Supprese show the ruler"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1828
+msgid "Show object height"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1828
+msgid "Show object height on the ruler"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1832
+msgid "Show estimated print time"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1832
+msgid "Show estimated print time on the ruler"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1836
+msgid "Ruler mode"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1836
+msgid "Set ruler mode"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1841
+msgid "Set extruder sequence for the entire print"
+msgstr "УÑтановить поÑледовательноÑÑ‚ÑŒ ÑкÑтрудеров Ð´Ð»Ñ Ð²Ñей печати"
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1927
+msgid "Enter custom G-code used on current layer"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1928
+msgid "Custom G-code on current layer (%1% mm)."
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1943
+msgid "Enter short message shown on Printer display when a print is paused"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1944
+msgid "Message for pause print on current layer (%1% mm)."
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1959
+msgid "Enter the move you want to jump to"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:1959
+msgid "Enter the height you want to jump to"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:2201
+msgid "The last color change data was saved for a single extruder printing."
+msgstr ""
+"ПоÑледние данные Ð´Ð»Ñ Ñмены цвет были Ñохранены Ð´Ð»Ñ Ð¾Ð´Ð½Ð¾ÑкÑтрудерной печати."
+
+#: src/slic3r/GUI/DoubleSlider.cpp:2202 src/slic3r/GUI/DoubleSlider.cpp:2217
+msgid "The last color change data was saved for a multi extruder printing."
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:2204
+msgid "Your current changes will delete all saved color changes."
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:2205 src/slic3r/GUI/DoubleSlider.cpp:2225
+msgid "Are you sure you want to continue?"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:2218
+msgid ""
+"Select YES if you want to delete all saved tool changes, \n"
+"NO if you want all tool changes switch to color changes, \n"
+"or CANCEL to leave it unchanged."
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:2221
+msgid "Do you want to delete all saved tool changes?"
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:2223
+msgid ""
+"The last color change data was saved for a multi extruder printing with tool "
+"changes for whole print."
+msgstr ""
+
+#: src/slic3r/GUI/DoubleSlider.cpp:2224
+msgid "Your current changes will delete all saved extruder (tool) changes."
+msgstr ""
+
+#: src/slic3r/GUI/ExtraRenderers.cpp:297 src/slic3r/GUI/GUI_ObjectList.cpp:496
+#: src/slic3r/GUI/GUI_ObjectList.cpp:508 src/slic3r/GUI/GUI_ObjectList.cpp:1015
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4454
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4464
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4499
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:209
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:266
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:291
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:499 src/libslic3r/PrintConfig.cpp:537
+msgid "default"
+msgstr "по умолчанию"
+
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:24
+msgid "Set extruder sequence"
+msgstr "УÑтановить поÑледовательноÑÑ‚ÑŒ ÑкÑтрудеров"
+
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:40
+msgid "Set extruder change for every"
+msgstr "УÑтановите Ñмену ÑкÑтрудера Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ñ‹Ñ…"
+
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:53
+#: src/libslic3r/PrintConfig.cpp:403 src/libslic3r/PrintConfig.cpp:1061
+#: src/libslic3r/PrintConfig.cpp:1686 src/libslic3r/PrintConfig.cpp:1851
+#: src/libslic3r/PrintConfig.cpp:1918 src/libslic3r/PrintConfig.cpp:2125
+#: src/libslic3r/PrintConfig.cpp:2171
+msgid "layers"
+msgstr "Ñлои"
+
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:137
+msgid "Set extruder(tool) sequence"
+msgstr ""
+
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:183
+msgid "Remove extruder from sequence"
+msgstr ""
+
+#: src/slic3r/GUI/ExtruderSequenceDialog.cpp:193
+msgid "Add extruder to sequence"
+msgstr ""
+
+#: src/slic3r/GUI/Field.cpp:184
+msgid "default value"
+msgstr "значение по умолчанию"
+
+#: src/slic3r/GUI/Field.cpp:187
+msgid "parameter name"
+msgstr "Ð¸Ð¼Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°"
+
+#: src/slic3r/GUI/Field.cpp:198 src/slic3r/GUI/OptionsGroup.cpp:779
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:880
+msgid "N/A"
+msgstr "Ð/Д"
+
+#: src/slic3r/GUI/Field.cpp:220
+#, c-format
+msgid "%s doesn't support percentage"
+msgstr "%s не поддерживает значение в процентах"
+
+#: src/slic3r/GUI/Field.cpp:240 src/slic3r/GUI/Field.cpp:276
+#: src/slic3r/GUI/Field.cpp:1430 src/slic3r/GUI/GUI_ObjectLayers.cpp:413
+msgid "Invalid numeric input."
+msgstr "Ðеправильное чиÑловое значение."
+
+#: src/slic3r/GUI/Field.cpp:249 src/slic3r/GUI/Field.cpp:1442
+msgid "Input value is out of range"
+msgstr "Введённое значение вне диапазона"
+
+#: src/slic3r/GUI/Field.cpp:292
+#, c-format
+msgid ""
+"Do you mean %s%% instead of %s %s?\n"
+"Select YES if you want to change this value to %s%%, \n"
+"or NO if you are sure that %s %s is a correct value."
+msgstr ""
+"Ð’Ñ‹ имели ввиду %s%% вмеÑто %s %s?\n"
+"Выберите ДÐ, еÑли хотите изменить Ñто значение на %s%%, \n"
+"или ÐЕТ, еÑли %s %s дейÑтвительно правильные значениÑ."
+
+#: src/slic3r/GUI/Field.cpp:295
+msgid "Parameter validation"
+msgstr "Проверка корректноÑти параметров"
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:150
+msgid "Flash!"
+msgstr "Прошить!"
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:152
+msgid "Flashing in progress. Please do not disconnect the printer!"
+msgstr "ВыполнÑетÑÑ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ°. Ðе отключайте принтер!"
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:199
+msgid "Flashing failed"
+msgstr "Ошибка при прошивке"
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:282
+msgid "Flashing succeeded!"
+msgstr "Прошивка завершена уÑпешно!"
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:283
+msgid "Flashing failed. Please see the avrdude log below."
+msgstr "При прошивке возникла ошибка. Смотрите журнал avrdude ниже."
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:284
+msgid "Flashing cancelled."
+msgstr "Прошивка отменена."
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:332
+#, c-format
+msgid ""
+"This firmware hex file does not match the printer model.\n"
+"The hex file is intended for: %s\n"
+"Printer reported: %s\n"
+"\n"
+"Do you want to continue and flash this hex file anyway?\n"
+"Please only continue if you are sure this is the right thing to do."
+msgstr ""
+"Данный hex-файл прошивки не ÑоответÑтвует модели принтера.\n"
+"Файл hex предназначен длÑ: %s\n"
+"Принтер выдаёт: %s\n"
+"\n"
+"Хотите продолжить и вÑÑ‘ равно прошить Ñтот hex-файл?\n"
+"Подумайте, вÑÑ‘ ли правильно вы делаете."
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:419 src/slic3r/GUI/FirmwareDialog.cpp:454
+#, c-format
+msgid ""
+"Multiple %s devices found. Please only connect one at a time for flashing."
+msgstr "Обнаружено неÑколько уÑтройÑтв %s. Ð”Ð»Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¸ оÑтавьте только одно."
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:436
+#, c-format
+msgid ""
+"The %s device was not found.\n"
+"If the device is connected, please press the Reset button next to the USB "
+"connector ..."
+msgstr ""
+"УÑтройÑтво %s не найдено.\n"
+"ЕÑли уÑтройÑтво подключено, то нажмите кнопку ÑброÑа около разъёма USB …"
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:548
+#, c-format
+msgid "The %s device could not have been found"
+msgstr "Ðе удалоÑÑŒ найти уÑтройÑтво %s"
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:645
+#, c-format
+msgid "Error accessing port at %s: %s"
+msgstr "Ошибка доÑтупа по порту в %s: %s"
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:647
+#, c-format
+msgid "Error: %s"
+msgstr "Ошибка: %s"
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:777
+msgid "Firmware flasher"
+msgstr "Прошивальшик"
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:802
+msgid "Firmware image:"
+msgstr "Файл прошивки:"
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:805
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:289
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:364
+msgid "Browse"
+msgstr "Обзор"
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:807
+msgid "Serial port:"
+msgstr "ПоÑледовательный порт:"
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:809
+msgid "Autodetected"
+msgstr "Ðвтоопределение"
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:810
+msgid "Rescan"
+msgstr "ПереÑканировать"
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:817
+msgid "Progress:"
+msgstr "Ход выполнениÑ:"
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:820
+msgid "Status:"
+msgstr "СоÑтоÑние:"
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:821
+msgid "Ready"
+msgstr "Готово"
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:841
+msgid "Advanced: Output log"
+msgstr "Дополнительно: журнал результата"
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:852
+#: src/slic3r/GUI/Mouse3DController.cpp:552
+#: src/slic3r/GUI/PrintHostDialogs.cpp:187
+msgid "Close"
+msgstr "Закрыть"
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:902
+msgid ""
+"Are you sure you want to cancel firmware flashing?\n"
+"This could leave your printer in an unusable state!"
+msgstr ""
+"Вы уверены, что хотите отменить прошивку?\n"
+"Это может привеÑти к неработоÑпоÑобноÑти вашего принтера!"
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:903
+msgid "Confirmation"
+msgstr "Подтверждение"
+
+#: src/slic3r/GUI/FirmwareDialog.cpp:906
+msgid "Cancelling..."
+msgstr "Отмена…"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:220
+msgid "Tool position"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:984
+msgid "Generating toolpaths"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:1375
+msgid "Generating vertex buffer"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:1468
+msgid "Generating index buffers"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2212
+msgid "Click to hide"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2212
+msgid "Click to show"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2324
+msgid "up to"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2330
+msgid "above"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2338
+msgid "from"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2338
+msgid "to"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2366 src/slic3r/GUI/GCodeViewer.cpp:2374
+#: src/slic3r/GUI/GUI_Preview.cpp:228 src/slic3r/GUI/GUI_Preview.cpp:526
+msgid "Feature type"
+msgstr "Типы линий"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2366 src/slic3r/GUI/GCodeViewer.cpp:2374
+#: src/slic3r/GUI/RammingChart.cpp:76
+msgid "Time"
+msgstr "ВремÑ"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2374
+msgid "Percentage"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2377
+msgid "Height (mm)"
+msgstr "Ð’Ñ‹Ñота (мм)"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2378
+msgid "Width (mm)"
+msgstr "Ширина (мм)"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2379
+msgid "Speed (mm/s)"
+msgstr "СкороÑÑ‚ÑŒ (мм/Ñ)"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2380
+msgid "Fan Speed (%)"
+msgstr "СкороÑÑ‚ÑŒ вентилÑтора (%)"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2381
+msgid "Volumetric flow rate (mm³/s)"
+msgstr "Объёмный раÑход (мм³/Ñ)"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2382 src/slic3r/GUI/GUI_Preview.cpp:234
+#: src/slic3r/GUI/GUI_Preview.cpp:341 src/slic3r/GUI/GUI_Preview.cpp:477
+#: src/slic3r/GUI/GUI_Preview.cpp:525 src/slic3r/GUI/GUI_Preview.cpp:850
+msgid "Tool"
+msgstr "ИнÑтрумент"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2383 src/slic3r/GUI/GUI_Preview.cpp:235
+#: src/slic3r/GUI/GUI_Preview.cpp:523
+msgid "Color Print"
+msgstr "Цвет печати"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2419 src/slic3r/GUI/GCodeViewer.cpp:2454
+#: src/slic3r/GUI/GCodeViewer.cpp:2459 src/slic3r/GUI/GUI_ObjectList.cpp:296
+#: src/slic3r/GUI/wxExtensions.cpp:515 src/libslic3r/PrintConfig.cpp:532
+msgid "Extruder"
+msgstr "ЭкÑтрудер"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2430
+msgid "Default color"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2454
+msgid "default color"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2549 src/slic3r/GUI/GCodeViewer.cpp:2595
+msgid "Color change"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2568 src/slic3r/GUI/GCodeViewer.cpp:2593
+msgid "Print"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2594 src/slic3r/GUI/GCodeViewer.cpp:2611
+msgid "Pause"
+msgstr "Пауза"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2599 src/slic3r/GUI/GCodeViewer.cpp:2602
+msgid "Event"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2599 src/slic3r/GUI/GCodeViewer.cpp:2602
+msgid "Remaining time"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2602
+msgid "Duration"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2637 src/slic3r/GUI/GUI_Preview.cpp:976
+#: src/libslic3r/PrintConfig.cpp:2348
+msgid "Travel"
+msgstr "Перемещение"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2640
+msgid "Movement"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2641
+msgid "Extrusion"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2642 src/slic3r/GUI/Tab.cpp:1695
+#: src/slic3r/GUI/Tab.cpp:2577
+msgid "Retraction"
+msgstr "Ретракт (втÑгивание)"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2660 src/slic3r/GUI/GCodeViewer.cpp:2663
+#: src/slic3r/GUI/GUI_Preview.cpp:978
+msgid "Wipe"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2695 src/slic3r/GUI/GUI_Preview.cpp:262
+#: src/slic3r/GUI/GUI_Preview.cpp:278
+msgid "Options"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2698 src/slic3r/GUI/GUI_Preview.cpp:980
+msgid "Retractions"
+msgstr "Ретракт"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2699 src/slic3r/GUI/GUI_Preview.cpp:981
+msgid "Deretractions"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2700 src/slic3r/GUI/GUI_Preview.cpp:982
+msgid "Tool changes"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2701 src/slic3r/GUI/GUI_Preview.cpp:983
+msgid "Color changes"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2702 src/slic3r/GUI/GUI_Preview.cpp:984
+msgid "Print pauses"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2703 src/slic3r/GUI/GUI_Preview.cpp:985
+msgid "Custom G-codes"
+msgstr ""
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2714 src/slic3r/GUI/GCodeViewer.cpp:2738
+#: src/slic3r/GUI/Plater.cpp:697 src/libslic3r/PrintConfig.cpp:113
+msgid "Printer"
+msgstr "Принтер"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2716 src/slic3r/GUI/GCodeViewer.cpp:2743
+#: src/slic3r/GUI/Plater.cpp:693
+msgid "Print settings"
+msgstr "ÐаÑтройки печати"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2719 src/slic3r/GUI/GCodeViewer.cpp:2749
+#: src/slic3r/GUI/Plater.cpp:694 src/slic3r/GUI/Tab.cpp:1795
+#: src/slic3r/GUI/Tab.cpp:1796
+msgid "Filament"
+msgstr "Пруток"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2774 src/slic3r/GUI/GCodeViewer.cpp:2779
+#: src/slic3r/GUI/Plater.cpp:242 src/slic3r/GUI/Plater.cpp:1135
+#: src/slic3r/GUI/Plater.cpp:1220
+msgid "Estimated printing time"
+msgstr "РаÑчётное Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2774
+msgid "Normal mode"
+msgstr "Ðормальный режим"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2779
+msgid "Stealth mode"
+msgstr "Тихий режим"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2806
+msgid "Show stealth mode"
+msgstr "Показывать нормальный режим"
+
+#: src/slic3r/GUI/GCodeViewer.cpp:2810
+msgid "Show normal mode"
+msgstr "Показывать тихий режим"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:228 src/slic3r/GUI/GLCanvas3D.cpp:4470
+msgid "Variable layer height"
+msgstr "ÐŸÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð²Ñ‹Ñота ÑлоÑ"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:230
+msgid "Left mouse button:"
+msgstr "Ð›ÐµÐ²Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÑƒ мыши:"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:232
+msgid "Add detail"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:234
+msgid "Right mouse button:"
+msgstr "ÐŸÑ€Ð°Ð²Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° мыши:"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:236
+msgid "Remove detail"
+msgstr "Убрать подробноÑти"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:238
+msgid "Shift + Left mouse button:"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:240
+msgid "Reset to base"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:242
+msgid "Shift + Right mouse button:"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:244
+msgid "Smoothing"
+msgstr "Сглаживание"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:246
+msgid "Mouse wheel:"
+msgstr "КолеÑо мыши:"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:248
+msgid "Increase/decrease edit area"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:251
+msgid "Adaptive"
+msgstr "Ðдаптивный"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:257
+msgid "Quality / Speed"
+msgstr "КачеÑтво / СкороÑÑ‚ÑŒ"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:260
+msgid "Higher print quality versus higher print speed."
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:271
+msgid "Smooth"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:277 src/libslic3r/PrintConfig.cpp:556
+msgid "Radius"
+msgstr "РадиуÑ"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:287
+msgid "Keep min"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:296 src/slic3r/GUI/GLCanvas3D.cpp:3908
+msgid "Reset"
+msgstr "СброÑ"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:558
+msgid "Variable layer height - Manual edit"
+msgstr "ÐŸÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð²Ñ‹Ñота Ñлоёв - Ð ÑƒÑ‡Ð½Ð°Ñ Ð¿Ñ€Ð°Ð²ÐºÐ°"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:626
+msgid "An object outside the print area was detected."
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:627
+msgid "A toolpath outside the print area was detected."
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:628
+msgid "SLA supports outside the print area were detected."
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:629
+msgid "Some objects are not visible."
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:631
+msgid ""
+"An object outside the print area was detected.\n"
+"Resolve the current problem to continue slicing."
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:941
+msgid "Seq."
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:1416
+msgid "Variable layer height - Reset"
+msgstr "ÐŸÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð²Ñ‹Ñота ÑÐ»Ð¾Ñ - СброÑ"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:1424
+msgid "Variable layer height - Adaptive"
+msgstr "ÐŸÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð²Ñ‹Ñота ÑÐ»Ð¾Ñ - ÐдаптивнаÑ"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:1432
+msgid "Variable layer height - Smooth all"
+msgstr "ÐŸÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð²Ñ‹Ñота ÑÐ»Ð¾Ñ - Сглаживание вÑех"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:1831
+msgid "Mirror Object"
+msgstr "Отразить обект"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:2682
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:520
+msgid "Gizmo-Move"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:2760
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:522
+msgid "Gizmo-Rotate"
+msgstr "Повернуть"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3275
+msgid "Move Object"
+msgstr "ПеремеÑтить объект"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3744 src/slic3r/GUI/GLCanvas3D.cpp:4431
+msgid "Switch to Settings"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3745 src/slic3r/GUI/GLCanvas3D.cpp:4431
+msgid "Print Settings Tab"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3746 src/slic3r/GUI/GLCanvas3D.cpp:4432
+msgid "Filament Settings Tab"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3746 src/slic3r/GUI/GLCanvas3D.cpp:4432
+msgid "Material Settings Tab"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3747 src/slic3r/GUI/GLCanvas3D.cpp:4433
+msgid "Printer Settings Tab"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3795
+msgid "Undo History"
+msgstr "Откатить по иÑтории"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3795
+msgid "Redo History"
+msgstr "Вернуть по иÑтории"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3816
+#, c-format
+msgid "Undo %1$d Action"
+msgid_plural "Undo %1$d Actions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3816
+#, c-format
+msgid "Redo %1$d Action"
+msgid_plural "Redo %1$d Actions"
+msgstr[0] ""
+msgstr[1] ""
+msgstr[2] ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3836 src/slic3r/GUI/GLCanvas3D.cpp:4449
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:122 src/slic3r/GUI/Search.cpp:351
+msgid "Search"
+msgstr "ПоиÑк"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3850 src/slic3r/GUI/GLCanvas3D.cpp:3858
+#: src/slic3r/GUI/Search.cpp:358
+msgid "Enter a search term"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3889
+msgid "Arrange options"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3896
+msgid "Gap size"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3901
+msgid "Enable rotations (slow)"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:3920 src/slic3r/GUI/GLCanvas3D.cpp:4341
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:143 src/slic3r/GUI/Plater.cpp:1645
+msgid "Arrange"
+msgstr "РаÑÑтавить"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4315
+msgid "Add..."
+msgstr "Добавить..."
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4323 src/slic3r/GUI/GUI_ObjectList.cpp:1846
+#: src/slic3r/GUI/Plater.cpp:3921 src/slic3r/GUI/Plater.cpp:3945
+#: src/slic3r/GUI/Tab.cpp:3474
+msgid "Delete"
+msgstr "Удалить"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4332 src/slic3r/GUI/KBShortcutsDialog.cpp:116
+#: src/slic3r/GUI/Plater.cpp:5025
+msgid "Delete all"
+msgstr "Удалить вÑÑ‘"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4341 src/slic3r/GUI/KBShortcutsDialog.cpp:144
+msgid "Arrange selection"
+msgstr "РаÑÑтавить выделенное"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4341
+msgid "Click right mouse button to show arrangement options"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4363
+msgid "Copy"
+msgstr "Копировать"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4372
+msgid "Paste"
+msgstr "Ð’Ñтавить"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4384 src/slic3r/GUI/Plater.cpp:3780
+#: src/slic3r/GUI/Plater.cpp:3792 src/slic3r/GUI/Plater.cpp:3930
+msgid "Add instance"
+msgstr "Добавить ÑкземплÑÑ€"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4395 src/slic3r/GUI/Plater.cpp:3932
+msgid "Remove instance"
+msgstr "Удалить ÑкземплÑÑ€"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4408
+msgid "Split to objects"
+msgstr "Разбить на объекты"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4418 src/slic3r/GUI/GUI_ObjectList.cpp:1618
+msgid "Split to parts"
+msgstr "Разбить на чаÑти"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4520 src/slic3r/GUI/KBShortcutsDialog.cpp:117
+#: src/slic3r/GUI/MainFrame.cpp:1129
+msgid "Undo"
+msgstr "Отменить"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4520 src/slic3r/GUI/GLCanvas3D.cpp:4559
+msgid "Click right mouse button to open/close History"
+msgstr "Щелчок по правой кнопке мыши открывает/закрывает иÑторию дейÑтвий"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4543
+msgid "Next Undo action: %1%"
+msgstr "Следующее отменÑемое дейÑтвие: %1%"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4559 src/slic3r/GUI/KBShortcutsDialog.cpp:118
+#: src/slic3r/GUI/MainFrame.cpp:1132
+msgid "Redo"
+msgstr "Вернуть"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:4581
+msgid "Next Redo action: %1%"
+msgstr "Следующее возвращаемое дейÑтвие: %1%"
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:6203
+msgid "Selection-Add from rectangle"
+msgstr ""
+
+#: src/slic3r/GUI/GLCanvas3D.cpp:6222
+msgid "Selection-Remove from rectangle"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:146 src/libslic3r/PrintConfig.cpp:3655
+msgid "Cut"
+msgstr "Обрезать"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:170
+msgid "Keep upper part"
+msgstr "ОÑтавить верхнюю чаÑÑ‚ÑŒ"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:171
+msgid "Keep lower part"
+msgstr "ОÑтавить нижнюю чаÑÑ‚ÑŒ"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:172
+msgid "Rotate lower part upwards"
+msgstr "Повернуть нижней чаÑтью вверх"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoCut.cpp:177
+msgid "Perform cut"
+msgstr "Выполнить обрезку"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:33
+msgid "Paint-on supports"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:42
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:25
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:57
+msgid "Clipping of view"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:43
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:50
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:26
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:58
+msgid "Reset direction"
+msgstr "СброÑить направление"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:44
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:27
+msgid "Brush size"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:45
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:28
+msgid "Brush shape"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:46
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:29
+msgid "Left mouse button"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:47
+msgid "Enforce supports"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:48
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:31
+msgid "Right mouse button"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:373
+msgid "Block supports"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:50
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:33
+msgid "Shift + Left mouse button"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:51
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:34
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:368
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:378
+msgid "Remove selection"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:52
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:35
+msgid "Remove all selection"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:53
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:36
+msgid "Circle"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:54
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:37
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
+msgid "Sphere"
+msgstr "Сфера"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:129
+msgid "Autoset by angle"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:136
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:118
+msgid "Reset selection"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:160
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:141
+msgid "Alt + Mouse wheel"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:178
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:159
+msgid "Paints all facets inside, regardless of their orientation."
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:192
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:173
+msgid "Ignores facets facing away from the camera."
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:225
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:203
+msgid "Ctrl + Mouse wheel"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:233
+msgid "Autoset custom supports"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:235
+msgid "Threshold:"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:242
+msgid "Enforce"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:245
+msgid "Block"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:295
+msgid "Block supports by angle"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp:296
+msgid "Add supports by angle"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp:40
+msgid "Place on face"
+msgstr "Положить гранью"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:40
+msgid "Hollow this object"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:41
+msgid "Preview hollowed and drilled model"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:42
+msgid "Offset"
+msgstr "Смещение"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:43
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:56
+msgid "Quality"
+msgstr "КачеÑтво"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:44
+#: src/libslic3r/PrintConfig.cpp:3151
+msgid "Closing distance"
+msgstr "РаÑÑтоÑние закрытиÑ"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:45
+msgid "Hole diameter"
+msgstr "Диаметр отверÑтиÑ"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:46
+msgid "Hole depth"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:47
+msgid "Remove selected holes"
+msgstr "Удалить выбранные отверÑтиÑ"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:48
+msgid "Remove all holes"
+msgstr "Удалить вÑе отверÑтиÑ"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:51
+msgid "Show supports"
+msgstr "Показать поддержки"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:308
+msgid "Add drainage hole"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:424
+msgid "Delete drainage hole"
+msgstr "Удалить дренажное отверÑтие"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:624
+msgid "Hollowing parameter change"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:693
+msgid "Change drainage hole diameter"
+msgstr "Изменить диаметр дренажного отверÑтиÑ"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:785
+msgid "Hollow and drill"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp:835
+msgid "Move drainage hole"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoMove.cpp:64
+msgid "Move"
+msgstr "ПеремеÑтить"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp:461
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:527
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:546
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:562
+#: src/libslic3r/PrintConfig.cpp:3704
+msgid "Rotate"
+msgstr "Повернуть"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoScale.cpp:78
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:238
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:547
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:563
+#: src/libslic3r/PrintConfig.cpp:3719
+msgid "Scale"
+msgstr "МаÑштабировать"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:30
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:381
+msgid "Enforce seam"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:32
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:383
+msgid "Block seam"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp:46
+msgid "Seam painting"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:47
+msgid "Head diameter"
+msgstr "Диаметр головы"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:48
+msgid "Lock supports under new islands"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:49
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1218
+msgid "Remove selected points"
+msgstr "Удалить выбранные точки"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:50
+msgid "Remove all points"
+msgstr "Удалить вÑе точки"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:51
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1221
+msgid "Apply changes"
+msgstr "Выполнить изменениÑ"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:52
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1222
+msgid "Discard changes"
+msgstr "ОтброÑить изменениÑ"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:53
+msgid "Minimal points distance"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:54
+#: src/libslic3r/PrintConfig.cpp:2981
+msgid "Support points density"
+msgstr "ПлотноÑÑ‚ÑŒ опорных точек"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:55
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1224
+msgid "Auto-generate points"
+msgstr "ÐвтоматичеÑÐºÐ°Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ‚Ð¾Ñ‡ÐµÐº"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:56
+msgid "Manual editing"
+msgstr "Правка вручную"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:374
+msgid "Add support point"
+msgstr "Добавить точку поддержки"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:514
+msgid "Delete support point"
+msgstr "Удалить точку поддержки"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:694
+msgid "Change point head diameter"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:762
+msgid "Support parameter change"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:869
+msgid "SLA Support Points"
+msgstr "Точки поддержек SLA"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:897
+msgid "SLA gizmo turned on"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:911
+msgid "Do you want to save your manually edited support points?"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:912
+msgid "Save changes?"
+msgstr "Сохранить изменениÑ?"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:924
+msgid "SLA gizmo turned off"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:955
+msgid "Move support point"
+msgstr "ПеремеÑтить точку поддержки"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1048
+msgid "Support points edit"
+msgstr "Правка точек поддержки"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1127
+msgid "Autogeneration will erase all manually edited points."
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1128
+msgid "Are you sure you want to do it?"
+msgstr "Ð’Ñ‹ уверены, что хотите Ñделать Ñто?"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1129 src/slic3r/GUI/GUI.cpp:256
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:557
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:581
+#: src/slic3r/GUI/WipeTowerDialog.cpp:45 src/slic3r/GUI/WipeTowerDialog.cpp:366
+msgid "Warning"
+msgstr "Предупреждение"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1134
+msgid "Autogenerate support points"
+msgstr "ÐвтоматичеÑÐºÐ°Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ñ‚Ð¾Ñ‡ÐµÐº поддержки"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1181
+msgid "SLA gizmo keyboard shortcuts"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1192
+msgid "Note: some shortcuts work in (non)editing mode only."
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214
+msgid "Left click"
+msgstr "Щелчок левой клавишей"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1210
+msgid "Add point"
+msgstr "Добавить точку"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211
+msgid "Right click"
+msgstr "Щелчок правой клавишей"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1211
+msgid "Remove point"
+msgstr "Убрать точку"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216
+msgid "Drag"
+msgstr "Перетащить"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1212
+msgid "Move point"
+msgstr "ПеремеÑтить точку"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1213
+msgid "Add point to selection"
+msgstr "Добавить точку к выделению"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1214
+msgid "Remove point from selection"
+msgstr "Удалить точку из выделениÑ"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1215
+msgid "Select by rectangle"
+msgstr "Выбрать прÑмоугольником"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1216
+msgid "Deselect by rectangle"
+msgstr "Удалить выбор прÑмоугольником"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1217
+msgid "Select all points"
+msgstr "Выбрать вÑе точки"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219
+msgid "Mouse wheel"
+msgstr "КолеÑо мыши"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1219
+msgid "Move clipping plane"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1220
+msgid "Reset clipping plane"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp:1223
+msgid "Switch to editing mode"
+msgstr "ПереключитьÑÑ Ð² режим редактированиÑ"
+
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:521
+msgid "Gizmo-Scale"
+msgstr "МаÑштабировать"
+
+#: src/slic3r/GUI/Gizmos/GLGizmosManager.cpp:630
+msgid "Gizmo-Place on Face"
+msgstr "ПомеÑтить на грань"
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:39
+msgid "Entering Paint-on supports"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:40
+msgid "Entering Seam painting"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:47
+msgid "Leaving Seam painting"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:48
+msgid "Leaving Paint-on supports"
+msgstr ""
+
+#: src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp:371
+msgid "Add supports"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:235
+msgid "is based on Slic3r by Alessandro Ranellucci and the RepRap community."
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:237
+msgid ""
+"Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas "
+"Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others."
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:238
+msgid "Artwork model by Nora Al-Badri and Jan Nikolai Nelles"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:378
+msgid ""
+"Starting with %1% 2.3, configuration directory on Linux has changed "
+"(according to XDG Base Directory Specification) to \n"
+"%2%.\n"
+"\n"
+"This directory did not exist yet (maybe you run the new version for the "
+"first time).\n"
+"However, an old %1% configuration directory was detected in \n"
+"%3%.\n"
+"\n"
+"Consider moving the contents of the old directory to the new location in "
+"order to access your profiles, etc.\n"
+"Note that if you decide to downgrade %1% in future, it will use the old "
+"location again.\n"
+"\n"
+"What do you want to do now?"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:386
+#, c-format
+msgid "%s - BREAKING CHANGE"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:388
+msgid "Quit, I will move my data now"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:388
+msgid "Start the application"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:576
+#, c-format
+msgid ""
+"%s has encountered an error. It was likely caused by running out of memory. "
+"If you are sure you have enough RAM on your system, this may also be a bug "
+"and we would be glad if you reported it.\n"
+"\n"
+"The application will now terminate."
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:579
+msgid "Fatal error"
+msgstr "КритичеÑÐºÐ°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°"
+
+#: src/slic3r/GUI/GUI_App.cpp:699
+msgid ""
+"Error parsing PrusaSlicer config file, it is probably corrupted. Try to "
+"manually delete the file to recover from the error. Your user profiles will "
+"not be affected."
+msgstr ""
+"Ошибка при разборе файла наÑтроек PrusaSlicer, вероÑтно, он повреждён. Чтобы "
+"ошибка пропала, попробуйте удалить файл. Это не повлиÑет на ваши "
+"пользовательÑкие профили."
+
+#: src/slic3r/GUI/GUI_App.cpp:705
+msgid ""
+"Error parsing PrusaGCodeViewer config file, it is probably corrupted. Try to "
+"manually delete the file to recover from the error."
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:759
+#, c-format
+msgid ""
+"%s\n"
+"Do you want to continue?"
+msgstr ""
+"%s\n"
+"Хотите продолжить?"
+
+#: src/slic3r/GUI/GUI_App.cpp:761 src/slic3r/GUI/UnsavedChangesDialog.cpp:659
+msgid "Remember my choice"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:796
+msgid "Loading configuration"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:864
+msgid "Preparing settings tabs"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:1109
+msgid ""
+"You have the following presets with saved options for \"Print Host upload\""
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:1113
+msgid ""
+"But since this version of PrusaSlicer we don't show this information in "
+"Printer Settings anymore.\n"
+"Settings will be available in physical printers settings."
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:1115
+msgid ""
+"By default new Printer devices will be named as \"Printer N\" during its "
+"creation.\n"
+"Note: This name can be changed later from the physical printers settings"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:1118
+msgid "Information"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:1131 src/slic3r/GUI/GUI_App.cpp:1142
+msgid "Recreating"
+msgstr "ПереÑоздание"
+
+#: src/slic3r/GUI/GUI_App.cpp:1147
+msgid "Loading of current presets"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:1152
+msgid "Loading of a mode view"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:1233
+msgid "Choose one file (3MF/AMF):"
+msgstr "Выберите файл (3MF/AMF):"
+
+#: src/slic3r/GUI/GUI_App.cpp:1245
+msgid "Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):"
+msgstr "Выберите один или неÑколько файлов (STL/OBJ/AMF/3MF/PRUSA):"
+
+#: src/slic3r/GUI/GUI_App.cpp:1257
+msgid "Choose one file (GCODE/.GCO/.G/.ngc/NGC):"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:1268
+msgid "Changing of an application language"
+msgstr "Изменить Ñзык приложениÑ"
+
+#: src/slic3r/GUI/GUI_App.cpp:1330
+msgid "Select the language"
+msgstr "Выбор Ñзыка"
+
+#: src/slic3r/GUI/GUI_App.cpp:1330
+msgid "Language"
+msgstr "Язык"
+
+#: src/slic3r/GUI/GUI_App.cpp:1460
+msgid "modified"
+msgstr "изменено"
+
+#: src/slic3r/GUI/GUI_App.cpp:1509
+#, c-format
+msgid "Run %s"
+msgstr "ЗапуÑтите %s"
+
+#: src/slic3r/GUI/GUI_App.cpp:1513
+msgid "&Configuration Snapshots"
+msgstr "Снапшоты наÑтроек"
+
+#: src/slic3r/GUI/GUI_App.cpp:1513
+msgid "Inspect / activate configuration snapshots"
+msgstr "ПоÑмотреть/вернуть наÑтройки из Ñнапшота"
+
+#: src/slic3r/GUI/GUI_App.cpp:1514
+msgid "Take Configuration &Snapshot"
+msgstr "Сделать Ñнапшот наÑтроек"
+
+#: src/slic3r/GUI/GUI_App.cpp:1514
+msgid "Capture a configuration snapshot"
+msgstr "Сделать Ñнапшот наÑтроек"
+
+#: src/slic3r/GUI/GUI_App.cpp:1515
+msgid "Check for updates"
+msgstr "Проверить обновлениÑ"
+
+#: src/slic3r/GUI/GUI_App.cpp:1515
+msgid "Check for configuration updates"
+msgstr "Проверить Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек"
+
+#: src/slic3r/GUI/GUI_App.cpp:1518
+msgid "&Preferences"
+msgstr "&ÐаÑтройки"
+
+#: src/slic3r/GUI/GUI_App.cpp:1524
+msgid "Application preferences"
+msgstr "ÐаÑтройки приложениÑ"
+
+#: src/slic3r/GUI/GUI_App.cpp:1529 src/slic3r/GUI/wxExtensions.cpp:673
+msgid "Simple"
+msgstr "ПроÑтой"
+
+#: src/slic3r/GUI/GUI_App.cpp:1529
+msgid "Simple View Mode"
+msgstr "ПроÑтой режим интерфейÑа"
+
+#: src/slic3r/GUI/GUI_App.cpp:1531 src/slic3r/GUI/wxExtensions.cpp:675
+msgctxt "Mode"
+msgid "Advanced"
+msgstr "РаÑширенный"
+
+#: src/slic3r/GUI/GUI_App.cpp:1531
+msgid "Advanced View Mode"
+msgstr "РаÑширенный режим интерфейÑа"
+
+#: src/slic3r/GUI/GUI_App.cpp:1532 src/slic3r/GUI/wxExtensions.cpp:676
+msgid "Expert"
+msgstr "ЭкÑпертный"
+
+#: src/slic3r/GUI/GUI_App.cpp:1532
+msgid "Expert View Mode"
+msgstr "ЭкÑпертный режим интерфейÑа"
+
+#: src/slic3r/GUI/GUI_App.cpp:1537
+msgid "Mode"
+msgstr "Режим"
+
+#: src/slic3r/GUI/GUI_App.cpp:1537
+#, c-format
+msgid "%s View Mode"
+msgstr "%s режим интерфейÑа"
+
+#: src/slic3r/GUI/GUI_App.cpp:1540
+msgid "&Language"
+msgstr "&Язык"
+
+#: src/slic3r/GUI/GUI_App.cpp:1543
+msgid "Flash printer &firmware"
+msgstr "Прошить принтер"
+
+#: src/slic3r/GUI/GUI_App.cpp:1543
+msgid "Upload a firmware image into an Arduino based printer"
+msgstr "Загрузить прошивку в принтер на оÑнове Arduino"
+
+#: src/slic3r/GUI/GUI_App.cpp:1559
+msgid "Taking configuration snapshot"
+msgstr "Создание Ñнапшота"
+
+#: src/slic3r/GUI/GUI_App.cpp:1559
+msgid "Snapshot name"
+msgstr "Ð˜Ð¼Ñ Ñнапшота"
+
+#: src/slic3r/GUI/GUI_App.cpp:1635
+msgid "Language selection"
+msgstr "Выбор Ñзыка"
+
+#: src/slic3r/GUI/GUI_App.cpp:1637
+msgid ""
+"Switching the language will trigger application restart.\n"
+"You will lose content of the plater."
+msgstr ""
+"При Ñмене Ñзыка приложение будет перезапущено.\n"
+"ИÑчезнет Ñодержимое компоновки."
+
+#: src/slic3r/GUI/GUI_App.cpp:1639
+msgid "Do you want to proceed?"
+msgstr "Хотите продолжить?"
+
+#: src/slic3r/GUI/GUI_App.cpp:1666
+msgid "&Configuration"
+msgstr "&ÐаÑтройки"
+
+#: src/slic3r/GUI/GUI_App.cpp:1697
+msgid "The preset(s) modifications are successfully saved"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_App.cpp:1907 src/slic3r/GUI/Tab.cpp:3232
+msgid "It's impossible to print multi-part object(s) with SLA technology."
+msgstr ""
+"Ðевозможно напечатать объект(Ñ‹), ÑоÑтоÑщий из неÑкольких чаÑтей Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ "
+"технологии SLA."
+
+#: src/slic3r/GUI/GUI_App.cpp:1908
+msgid "Please check and fix your object list."
+msgstr "Проверьте и иÑправьте ÑпиÑок объектов."
+
+#: src/slic3r/GUI/GUI_App.cpp:1909 src/slic3r/GUI/Jobs/SLAImportJob.cpp:210
+#: src/slic3r/GUI/Plater.cpp:2337 src/slic3r/GUI/Tab.cpp:3234
+msgid "Attention!"
+msgstr "Внимание!"
+
+#: src/slic3r/GUI/GUI_App.cpp:1926
+msgid "Select a gcode file:"
+msgstr "Выберите файл gcode:"
+
+#: src/slic3r/GUI/GUI_Init.cpp:73 src/slic3r/GUI/GUI_Init.cpp:76
+msgid "PrusaSlicer GUI initialization failed"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_Init.cpp:76
+msgid "Fatal error, exception catched: %1%"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29
+msgid "Start at height"
+msgstr "Ðачать Ñ Ð²Ñ‹Ñоты"
+
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:29
+msgid "Stop at height"
+msgstr "Закончить на выÑоте"
+
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:161
+msgid "Remove layer range"
+msgstr "Удалить диапазон Ñлоев"
+
+#: src/slic3r/GUI/GUI_ObjectLayers.cpp:165
+msgid "Add layer range"
+msgstr "Добавить диапазон Ñлоев"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:34 src/slic3r/GUI/GUI_ObjectList.cpp:92
+#: src/slic3r/GUI/GUI_ObjectList.cpp:651 src/libslic3r/PrintConfig.cpp:72
+#: src/libslic3r/PrintConfig.cpp:216 src/libslic3r/PrintConfig.cpp:225
+#: src/libslic3r/PrintConfig.cpp:449 src/libslic3r/PrintConfig.cpp:515
+#: src/libslic3r/PrintConfig.cpp:523 src/libslic3r/PrintConfig.cpp:953
+#: src/libslic3r/PrintConfig.cpp:1191 src/libslic3r/PrintConfig.cpp:1556
+#: src/libslic3r/PrintConfig.cpp:1622 src/libslic3r/PrintConfig.cpp:1803
+#: src/libslic3r/PrintConfig.cpp:2270 src/libslic3r/PrintConfig.cpp:2329
+#: src/libslic3r/PrintConfig.cpp:2338
+msgid "Layers and Perimeters"
+msgstr "Слои и периметры"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:36 src/slic3r/GUI/GUI_ObjectList.cpp:95
+#: src/slic3r/GUI/GUI_ObjectList.cpp:654 src/slic3r/GUI/GUI_Preview.cpp:254
+#: src/slic3r/GUI/Tab.cpp:1473 src/slic3r/GUI/Tab.cpp:1475
+#: src/libslic3r/ExtrusionEntity.cpp:320 src/libslic3r/ExtrusionEntity.cpp:352
+#: src/libslic3r/PrintConfig.cpp:411 src/libslic3r/PrintConfig.cpp:1683
+#: src/libslic3r/PrintConfig.cpp:2061 src/libslic3r/PrintConfig.cpp:2067
+#: src/libslic3r/PrintConfig.cpp:2075 src/libslic3r/PrintConfig.cpp:2087
+#: src/libslic3r/PrintConfig.cpp:2097 src/libslic3r/PrintConfig.cpp:2105
+#: src/libslic3r/PrintConfig.cpp:2120 src/libslic3r/PrintConfig.cpp:2141
+#: src/libslic3r/PrintConfig.cpp:2153 src/libslic3r/PrintConfig.cpp:2169
+#: src/libslic3r/PrintConfig.cpp:2178 src/libslic3r/PrintConfig.cpp:2187
+#: src/libslic3r/PrintConfig.cpp:2198 src/libslic3r/PrintConfig.cpp:2212
+#: src/libslic3r/PrintConfig.cpp:2220 src/libslic3r/PrintConfig.cpp:2221
+#: src/libslic3r/PrintConfig.cpp:2230 src/libslic3r/PrintConfig.cpp:2238
+#: src/libslic3r/PrintConfig.cpp:2252
+msgid "Support material"
+msgstr "Материал поддержки"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:39 src/slic3r/GUI/GUI_ObjectList.cpp:99
+#: src/slic3r/GUI/GUI_ObjectList.cpp:658 src/libslic3r/PrintConfig.cpp:2448
+#: src/libslic3r/PrintConfig.cpp:2456
+msgid "Wipe options"
+msgstr "Параметры очиÑтки"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:45
+msgid "Pad and Support"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:51
+msgid "Add part"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:52
+msgid "Add modifier"
+msgstr "Добавить модификатор"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:53
+msgid "Add support enforcer"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:54
+msgid "Add support blocker"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:94 src/slic3r/GUI/GUI_ObjectList.cpp:653
+#: src/slic3r/GUI/GUI_Preview.cpp:250 src/slic3r/GUI/Tab.cpp:1443
+#: src/libslic3r/ExtrusionEntity.cpp:316 src/libslic3r/ExtrusionEntity.cpp:344
+#: src/libslic3r/PrintConfig.cpp:1198 src/libslic3r/PrintConfig.cpp:1204
+#: src/libslic3r/PrintConfig.cpp:1218 src/libslic3r/PrintConfig.cpp:1228
+#: src/libslic3r/PrintConfig.cpp:1236 src/libslic3r/PrintConfig.cpp:1238
+msgid "Ironing"
+msgstr "Разглаживание"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:96 src/slic3r/GUI/GUI_ObjectList.cpp:655
+#: src/slic3r/GUI/GUI_Preview.cpp:231 src/slic3r/GUI/Tab.cpp:1499
+#: src/libslic3r/PrintConfig.cpp:276 src/libslic3r/PrintConfig.cpp:503
+#: src/libslic3r/PrintConfig.cpp:984 src/libslic3r/PrintConfig.cpp:1164
+#: src/libslic3r/PrintConfig.cpp:1237 src/libslic3r/PrintConfig.cpp:1612
+#: src/libslic3r/PrintConfig.cpp:1884 src/libslic3r/PrintConfig.cpp:1936
+#: src/libslic3r/PrintConfig.cpp:2314
+msgid "Speed"
+msgstr "СкороÑÑ‚ÑŒ"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:97 src/slic3r/GUI/GUI_ObjectList.cpp:656
+#: src/slic3r/GUI/Tab.cpp:1535 src/slic3r/GUI/Tab.cpp:2112
+#: src/libslic3r/PrintConfig.cpp:533 src/libslic3r/PrintConfig.cpp:1118
+#: src/libslic3r/PrintConfig.cpp:1590 src/libslic3r/PrintConfig.cpp:1905
+#: src/libslic3r/PrintConfig.cpp:2133 src/libslic3r/PrintConfig.cpp:2160
+msgid "Extruders"
+msgstr "ЭкÑтрудеры"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:98 src/slic3r/GUI/GUI_ObjectList.cpp:657
+#: src/libslic3r/PrintConfig.cpp:492 src/libslic3r/PrintConfig.cpp:600
+#: src/libslic3r/PrintConfig.cpp:940 src/libslic3r/PrintConfig.cpp:1126
+#: src/libslic3r/PrintConfig.cpp:1599 src/libslic3r/PrintConfig.cpp:1925
+#: src/libslic3r/PrintConfig.cpp:2142 src/libslic3r/PrintConfig.cpp:2302
+msgid "Extrusion Width"
+msgstr "Ширина ÑкÑтрузии"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:102 src/slic3r/GUI/GUI_ObjectList.cpp:661
+#: src/slic3r/GUI/Tab.cpp:1429 src/slic3r/GUI/Tab.cpp:1453
+#: src/slic3r/GUI/Tab.cpp:1556 src/slic3r/GUI/Tab.cpp:1559
+#: src/slic3r/GUI/Tab.cpp:1855 src/slic3r/GUI/Tab.cpp:2192
+#: src/slic3r/GUI/Tab.cpp:4104 src/libslic3r/PrintConfig.cpp:90
+#: src/libslic3r/PrintConfig.cpp:128 src/libslic3r/PrintConfig.cpp:264
+#: src/libslic3r/PrintConfig.cpp:1069 src/libslic3r/PrintConfig.cpp:1153
+#: src/libslic3r/PrintConfig.cpp:2472 src/libslic3r/PrintConfig.cpp:2644
+msgid "Advanced"
+msgstr "РаÑширенный"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:104 src/slic3r/GUI/GUI_ObjectList.cpp:663
+#: src/slic3r/GUI/Plater.cpp:357 src/slic3r/GUI/Tab.cpp:4038
+#: src/slic3r/GUI/Tab.cpp:4039 src/libslic3r/PrintConfig.cpp:2810
+#: src/libslic3r/PrintConfig.cpp:2817 src/libslic3r/PrintConfig.cpp:2826
+#: src/libslic3r/PrintConfig.cpp:2835 src/libslic3r/PrintConfig.cpp:2845
+#: src/libslic3r/PrintConfig.cpp:2855 src/libslic3r/PrintConfig.cpp:2892
+#: src/libslic3r/PrintConfig.cpp:2899 src/libslic3r/PrintConfig.cpp:2910
+#: src/libslic3r/PrintConfig.cpp:2920 src/libslic3r/PrintConfig.cpp:2929
+#: src/libslic3r/PrintConfig.cpp:2942 src/libslic3r/PrintConfig.cpp:2952
+#: src/libslic3r/PrintConfig.cpp:2961 src/libslic3r/PrintConfig.cpp:2971
+#: src/libslic3r/PrintConfig.cpp:2982 src/libslic3r/PrintConfig.cpp:2990
+msgid "Supports"
+msgstr "Поддержки"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:105 src/slic3r/GUI/GUI_ObjectList.cpp:664
+#: src/slic3r/GUI/Plater.cpp:500 src/slic3r/GUI/Tab.cpp:4079
+#: src/slic3r/GUI/Tab.cpp:4080 src/slic3r/GUI/Tab.cpp:4151
+#: src/libslic3r/PrintConfig.cpp:2998 src/libslic3r/PrintConfig.cpp:3005
+#: src/libslic3r/PrintConfig.cpp:3019 src/libslic3r/PrintConfig.cpp:3030
+#: src/libslic3r/PrintConfig.cpp:3040 src/libslic3r/PrintConfig.cpp:3062
+#: src/libslic3r/PrintConfig.cpp:3073 src/libslic3r/PrintConfig.cpp:3080
+#: src/libslic3r/PrintConfig.cpp:3087 src/libslic3r/PrintConfig.cpp:3098
+#: src/libslic3r/PrintConfig.cpp:3107 src/libslic3r/PrintConfig.cpp:3116
+msgid "Pad"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:106 src/slic3r/GUI/Tab.cpp:4097
+#: src/slic3r/GUI/Tab.cpp:4098 src/libslic3r/SLA/Hollowing.cpp:45
+#: src/libslic3r/SLA/Hollowing.cpp:57 src/libslic3r/SLA/Hollowing.cpp:66
+#: src/libslic3r/SLA/Hollowing.cpp:75 src/libslic3r/PrintConfig.cpp:3126
+#: src/libslic3r/PrintConfig.cpp:3133 src/libslic3r/PrintConfig.cpp:3143
+#: src/libslic3r/PrintConfig.cpp:3152
+msgid "Hollowing"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:284
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:161
+msgid "Name"
+msgstr "ИмÑ"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:300 src/slic3r/GUI/GUI_ObjectList.cpp:441
+msgid "Editing"
+msgstr "Редактирование"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:386
+#, c-format
+msgid "Auto-repaired (%d errors):"
+msgstr "ИÑправлено ошибок: %d"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:393
+msgid "degenerate facets"
+msgstr "граней вырождено"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:394
+msgid "edges fixed"
+msgstr "рёбер починено"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:395
+msgid "facets removed"
+msgstr "граней удалено"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:396
+msgid "facets added"
+msgstr "граней добавлено"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:397
+msgid "facets reversed"
+msgstr "граней реверÑировано"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:398
+msgid "backwards edges"
+msgstr "рёбер вывернуто"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:406
+msgid "Right button click the icon to fix STL through Netfabb"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:443
+msgid "Right button click the icon to change the object settings"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:445
+msgid "Click the icon to change the object settings"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:449
+msgid "Right button click the icon to change the object printable property"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:451
+msgid "Click the icon to change the object printable property"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:574
+msgid "Change Extruder"
+msgstr "Сменить ÑкÑтрудер"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:589
+msgid "Rename Object"
+msgstr "Переименовать объект"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:589
+msgid "Rename Sub-object"
+msgstr "Переименовать подобъект"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1215
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4244
+msgid "Instances to Separated Objects"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1230
+msgid "Volumes in Object reordered"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1230
+msgid "Object reordered"
+msgstr "Объект переупорÑдочен"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1306
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1661
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1667
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2008
+#, c-format
+msgid "Quick Add Settings (%s)"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1396
+msgid "Select showing settings"
+msgstr "Выбор наÑтроек отображениÑ"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1445
+msgid "Add Settings for Layers"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1446
+msgid "Add Settings for Sub-object"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1447
+msgid "Add Settings for Object"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1517
+msgid "Add Settings Bundle for Height range"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1518
+msgid "Add Settings Bundle for Sub-object"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1519
+msgid "Add Settings Bundle for Object"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1558
+msgid "Load"
+msgstr "Загрузить"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1595
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1599
+msgid "Box"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
+msgid "Cylinder"
+msgstr "Цилиндр"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1563
+msgid "Slab"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1631
+msgid "Height range Modifier"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1640
+msgid "Add settings"
+msgstr "Добавить наÑтройки"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1718
+msgid "Change type"
+msgstr "Изменить тип"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1728
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1740
+msgid "Set as a Separated Object"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1740
+msgid "Set as a Separated Objects"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1750
+msgid "Printable"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1765
+msgid "Rename"
+msgstr "Переименовать"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1776
+msgid "Fix through the Netfabb"
+msgstr "Починить в Netfabb"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1786 src/slic3r/GUI/Plater.cpp:3958
+msgid "Export as STL"
+msgstr "ЭкÑпорт в STL"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1793
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4439 src/slic3r/GUI/Plater.cpp:3924
+msgid "Reload the selected volumes from disk"
+msgstr "Перезагрузить выделенные объёмы Ñ Ð´Ð¸Ñка"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1800
+msgid "Set extruder for selected items"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1832 src/libslic3r/PrintConfig.cpp:376
+msgid "Default"
+msgstr "По умолчанию"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1852
+msgid "Scale to print volume"
+msgstr "МаÑштабировать к объёму принтера"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1852
+msgid "Scale the selected object to fit the print volume"
+msgstr "МаÑштабировать выделенный объект до объёма принтера"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1858 src/slic3r/GUI/Plater.cpp:5142
+msgid "Convert from imperial units"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1861 src/slic3r/GUI/Plater.cpp:5142
+msgid "Revert conversion from imperial units"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1868
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1876
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2569 src/libslic3r/PrintConfig.cpp:3695
+msgid "Merge"
+msgstr "Объединить"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1868
+msgid "Merge objects to the one multipart object"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1876
+msgid "Merge objects to the one single object"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:1953
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2210
+msgid "Add Shape"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2038
+msgid "Load Part"
+msgstr "Загрузить чаÑÑ‚ÑŒ"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2077
+msgid "Error!"
+msgstr "Ошибка!"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2152
+msgid "Add Generic Subobject"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2181
+msgid "Generic"
+msgstr "Общие"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2307
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2408
+msgid "Last instance of an object cannot be deleted."
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2319
+msgid "Delete Settings"
+msgstr "Удалить наÑтройки"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2341
+msgid "Delete All Instances from Object"
+msgstr "Удалить вÑе ÑкземплÑры из объекта"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2357
+msgid "Delete Height Range"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2389
+msgid "From Object List You can't delete the last solid part from object."
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2393
+msgid "Delete Subobject"
+msgstr "Удалить подобъект"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2412
+msgid "Delete Instance"
+msgstr "Удалить ÑкземплÑÑ€"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2436 src/slic3r/GUI/Plater.cpp:2840
+msgid ""
+"The selected object couldn't be split because it contains only one part."
+msgstr ""
+"Выбранный объект не может быть разделен, так как он ÑоÑтоит из одной чаÑти."
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2440
+msgid "Split to Parts"
+msgstr "Разбить на чаÑти"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2576
+msgid "Merged"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2660
+msgid "Merge all parts to the one single object"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2692
+msgid "Add Layers"
+msgstr "Добавить Ñлои"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2846
+msgid "Group manipulation"
+msgstr "ДейÑÑ‚Ð²Ð¸Ñ Ñ Ð³Ñ€ÑƒÐ¿Ð¿Ð¾Ð¹"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2858
+msgid "Object manipulation"
+msgstr "ДейÑÑ‚Ð²Ð¸Ñ Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð¼"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2871
+msgid "Object Settings to modify"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2875
+msgid "Part Settings to modify"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2880
+msgid "Layer range Settings to modify"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2886
+msgid "Part manipulation"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2892
+msgid "Instance manipulation"
+msgstr "ДейÑÑ‚Ð²Ð¸Ñ Ñ ÑкземплÑром"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2899
+msgid "Height ranges"
+msgstr "Диапазоны выÑот"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:2899
+msgid "Settings for height range"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3083
+msgid "Delete Selected Item"
+msgstr "Удалить выделенный Ñлемент"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3221
+msgid "Delete Selected"
+msgstr "Удалить выбранное"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3297
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3325
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3345
+msgid "Add Height Range"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3391
+msgid ""
+"Cannot insert a new layer range after the current layer range.\n"
+"The next layer range is too thin to be split to two\n"
+"without violating the minimum layer height."
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3395
+msgid ""
+"Cannot insert a new layer range between the current and the next layer "
+"range.\n"
+"The gap between the current layer range and the next layer range\n"
+"is thinner than the minimum layer height allowed."
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3400
+msgid ""
+"Cannot insert a new layer range after the current layer range.\n"
+"Current layer range overlaps with the next layer range."
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3459
+msgid "Edit Height Range"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3754
+msgid "Selection-Remove from list"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3762
+msgid "Selection-Add from list"
+msgstr "Выделение-Добавлено из ÑпиÑка"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3880
+msgid "Object or Instance"
+msgstr "Объект или ÑкземплÑÑ€"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3881
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
+msgid "Part"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3881
+msgid "Layer"
+msgstr "Слой"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3883
+msgid "Unsupported selection"
+msgstr "Ðеподдерживаемое выделение"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3884
+#, c-format
+msgid "You started your selection with %s Item."
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3885
+#, c-format
+msgid "In this mode you can select only other %s Items%s"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3888
+msgid "of a current Object"
+msgstr "текущего объекта"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3893
+#: src/slic3r/GUI/GUI_ObjectList.cpp:3968 src/slic3r/GUI/Plater.cpp:143
+msgid "Info"
+msgstr "ИнформациÑ"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4009
+msgid "You can't change a type of the last solid part of the object."
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
+msgid "Modifier"
+msgstr "Модификатор"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
+msgid "Support Enforcer"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4014
+msgid "Support Blocker"
+msgstr "Блокировщик поддержки"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4016
+msgid "Select type of part"
+msgstr "Выберите тип чаÑти"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4021
+msgid "Change Part Type"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4266
+msgid "Enter new name"
+msgstr "Введите новое имÑ"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4266
+msgid "Renaming"
+msgstr "Переименование"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4282
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4409
+#: src/slic3r/GUI/SavePresetDialog.cpp:101
+#: src/slic3r/GUI/SavePresetDialog.cpp:109
+msgid "The supplied name is not valid;"
+msgstr "Заданное Ð¸Ð¼Ñ Ð½ÐµÐ´Ð¾Ð¿ÑƒÑтимо;"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4283
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4410
+#: src/slic3r/GUI/SavePresetDialog.cpp:102
+msgid "the following characters are not allowed:"
+msgstr "Ñледующие знаки не разрешаютÑÑ:"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4458
+msgid "Select extruder number:"
+msgstr "Задайте номер ÑкÑтрудера:"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4459
+msgid "This extruder will be set for selected items"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4484
+msgid "Change Extruders"
+msgstr "Смена ÑкÑтрудеров"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4581 src/slic3r/GUI/Selection.cpp:1512
+msgid "Set Printable"
+msgstr "УÑтановить печатным"
+
+#: src/slic3r/GUI/GUI_ObjectList.cpp:4581 src/slic3r/GUI/Selection.cpp:1512
+msgid "Set Unprintable"
+msgstr "УÑтановить непечатным"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:68
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:111
+msgid "World coordinates"
+msgstr "Мировые координаты"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:69
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:112
+msgid "Local coordinates"
+msgstr "Локальные координаты"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:88
+msgid "Select coordinate space, in which the transformation will be performed."
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:163 src/libslic3r/GCode.cpp:629
+msgid "Object name"
+msgstr "Ð˜Ð¼Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:223
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:505
+msgid "Position"
+msgstr "Положение"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:224
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:506
+#: src/slic3r/GUI/Mouse3DController.cpp:487
+#: src/slic3r/GUI/Mouse3DController.cpp:508
+msgid "Rotation"
+msgstr "Вращение"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:271
+#, c-format
+msgid "Toggle %c axis mirroring"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:305
+msgid "Set Mirror"
+msgstr "Отражение"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:341
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:418
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:486
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:487
+msgid "in"
+msgstr "дюйм"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:345
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:357
+msgid "Drop to bed"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:372
+msgid "Reset rotation"
+msgstr "СброÑить поворот"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:394
+msgid "Reset Rotation"
+msgstr "СброÑить поворот"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:407
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:409
+msgid "Reset scale"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:507
+msgid "Scale factors"
+msgstr "МаÑштаб"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:561
+msgid "Translate"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:625
+msgid ""
+"You cannot use non-uniform scaling mode for multiple objects/parts selection"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:797
+msgid "Set Position"
+msgstr "Задать положение"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:828
+msgid "Set Orientation"
+msgstr "Задать ориентацию"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:893
+msgid "Set Scale"
+msgstr "Задать маÑштаб"
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:925
+msgid ""
+"The currently manipulated object is tilted (rotation angles are not "
+"multiples of 90°).\n"
+"Non-uniform scaling of tilted objects is only possible in the World "
+"coordinate system,\n"
+"once the rotation is embedded into the object coordinates."
+msgstr ""
+
+#: src/slic3r/GUI/GUI_ObjectManipulation.cpp:928
+msgid ""
+"This operation is irreversible.\n"
+"Do you want to proceed?"
+msgstr ""
+"Эта Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½ÐµÐ¾Ð±Ñ€Ð°Ñ‚Ð¸Ð¼Ð°.\n"
+"Продолжить?"
+
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:62
+msgid "Additional Settings"
+msgstr "Дополнительные наÑтройки"
+
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:98
+msgid "Remove parameter"
+msgstr "Удалить параметр"
+
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:104
+#, c-format
+msgid "Delete Option %s"
+msgstr "Удалить параметр %s"
+
+#: src/slic3r/GUI/GUI_ObjectSettings.cpp:157
+#, c-format
+msgid "Change Option %s"
+msgstr "Изменить параметр %s"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:226
+msgid "View"
+msgstr "Вид"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:229 src/libslic3r/PrintConfig.cpp:545
+msgid "Height"
+msgstr "Ð’Ñ‹Ñота"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:230 src/libslic3r/PrintConfig.cpp:2434
+msgid "Width"
+msgstr "Ширина"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:232 src/slic3r/GUI/Tab.cpp:1841
+msgid "Fan speed"
+msgstr "СкороÑÑ‚ÑŒ вентилÑтора"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:233
+msgid "Volumetric flow rate"
+msgstr "Объёмный раÑход"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:238
+msgid "Show"
+msgstr "Отображать"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:241 src/slic3r/GUI/GUI_Preview.cpp:259
+msgid "Feature types"
+msgstr "Типы линий"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:244 src/libslic3r/ExtrusionEntity.cpp:310
+#: src/libslic3r/ExtrusionEntity.cpp:332
+msgid "Perimeter"
+msgstr "Периметр"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:245 src/libslic3r/ExtrusionEntity.cpp:311
+#: src/libslic3r/ExtrusionEntity.cpp:334
+msgid "External perimeter"
+msgstr "Внешний периметр"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:246 src/libslic3r/ExtrusionEntity.cpp:312
+#: src/libslic3r/ExtrusionEntity.cpp:336
+msgid "Overhang perimeter"
+msgstr "ÐавиÑающий периметр"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:247 src/libslic3r/ExtrusionEntity.cpp:313
+#: src/libslic3r/ExtrusionEntity.cpp:338
+msgid "Internal infill"
+msgstr "Заполнение"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:248 src/libslic3r/ExtrusionEntity.cpp:314
+#: src/libslic3r/ExtrusionEntity.cpp:340 src/libslic3r/PrintConfig.cpp:1924
+#: src/libslic3r/PrintConfig.cpp:1935
+msgid "Solid infill"
+msgstr "Сплошное заполнение"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:249 src/libslic3r/ExtrusionEntity.cpp:315
+#: src/libslic3r/ExtrusionEntity.cpp:342 src/libslic3r/PrintConfig.cpp:2301
+#: src/libslic3r/PrintConfig.cpp:2313
+msgid "Top solid infill"
+msgstr "Верхний Ñплошной Ñлой"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:251 src/libslic3r/ExtrusionEntity.cpp:317
+#: src/libslic3r/ExtrusionEntity.cpp:346
+msgid "Bridge infill"
+msgstr "Заполнение моÑта"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:252 src/libslic3r/ExtrusionEntity.cpp:318
+#: src/libslic3r/ExtrusionEntity.cpp:348 src/libslic3r/PrintConfig.cpp:983
+msgid "Gap fill"
+msgstr "Заполнение пробелов"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:253 src/slic3r/GUI/Tab.cpp:1463
+#: src/libslic3r/ExtrusionEntity.cpp:319 src/libslic3r/ExtrusionEntity.cpp:350
+msgid "Skirt"
+msgstr "Юбка"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:255 src/libslic3r/ExtrusionEntity.cpp:321
+#: src/libslic3r/ExtrusionEntity.cpp:354 src/libslic3r/PrintConfig.cpp:2186
+msgid "Support material interface"
+msgstr "СвÑзующий Ñлой поддержки"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:256 src/slic3r/GUI/Tab.cpp:1546
+#: src/libslic3r/ExtrusionEntity.cpp:322 src/libslic3r/ExtrusionEntity.cpp:356
+msgid "Wipe tower"
+msgstr "Ð‘Ð°ÑˆÐ½Ñ Ð¾Ñ‡Ð¸Ñтки"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:986
+msgid "Shells"
+msgstr "Оболочка"
+
+#: src/slic3r/GUI/GUI_Preview.cpp:987
+msgid "Tool marker"
+msgstr ""
+
+#: src/slic3r/GUI/GUI_Preview.cpp:988
+msgid "Legend/Estimated printing time"
+msgstr ""
+
+#: src/slic3r/GUI/ImGuiWrapper.cpp:804 src/slic3r/GUI/Search.cpp:389
+msgid "Use for search"
+msgstr ""
+
+#: src/slic3r/GUI/ImGuiWrapper.cpp:805 src/slic3r/GUI/Search.cpp:383
+msgid "Category"
+msgstr ""
+
+#: src/slic3r/GUI/ImGuiWrapper.cpp:807 src/slic3r/GUI/Search.cpp:385
+msgid "Search in English"
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:146
+msgid "Arranging"
+msgstr "РаÑÑтановка"
+
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:175
+msgid "Could not arrange model objects! Some geometries may be invalid."
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:181
+msgid "Arranging canceled."
+msgstr "ÐвтораÑположение отменено."
+
+#: src/slic3r/GUI/Jobs/ArrangeJob.cpp:182
+msgid "Arranging done."
+msgstr "РаÑÑтановка выполнена."
+
+#: src/slic3r/GUI/Jobs/Job.cpp:75
+msgid "ERROR: not enough resources to execute a new job."
+msgstr "ОШИБКÐ: недоÑтаточно реÑурÑов Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½Ð¾Ð²Ð¾Ð³Ð¾ заданиÑ."
+
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:41
+msgid "Searching for optimal orientation"
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:73
+msgid "Orientation search canceled."
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/RotoptimizeJob.cpp:74
+msgid "Orientation found."
+msgstr "ÐžÑ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ñ Ð½Ð°Ð¹Ð´ÐµÐ½Ð°."
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:35
+msgid "Choose SLA archive:"
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:39
+msgid "Import file"
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:46
+msgid "Import model and profile"
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:47
+msgid "Import profile only"
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:48
+msgid "Import model only"
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:59
+msgid "Accurate"
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:60
+msgid "Balanced"
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:61
+msgid "Quick"
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:135
+msgid "Importing SLA archive"
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:159
+msgid "Importing canceled."
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:160
+msgid "Importing done."
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:208 src/slic3r/GUI/Plater.cpp:2335
+msgid "You cannot load SLA project with a multi-part object on the bed"
+msgstr ""
+
+#: src/slic3r/GUI/Jobs/SLAImportJob.cpp:209 src/slic3r/GUI/Plater.cpp:2336
+#: src/slic3r/GUI/Tab.cpp:3233
+msgid "Please check your object list before preset changing."
+msgstr "Проверьте ÑпиÑок объектов перед изменением профилÑ."
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:34 src/slic3r/GUI/MainFrame.cpp:898
+msgid "Keyboard Shortcuts"
+msgstr "Клавиатурные комбинации"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:97
+msgid "New project, clear plater"
+msgstr "Ðовый проект, очиÑтить компоновку"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:98
+msgid "Open project STL/OBJ/AMF/3MF with config, clear plater"
+msgstr "Открыть проект STL/OBJ/AMF/3MF Ñ Ð½Ð°Ñтройками, очиÑтить компоновку"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:99
+msgid "Save project (3mf)"
+msgstr "Сохранить проект (3mf)"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:100
+msgid "Save project as (3mf)"
+msgstr "Сохранить проект как (3mf)"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:101
+msgid "(Re)slice"
+msgstr "Ðарезать"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:103
+msgid "Import STL/OBJ/AMF/3MF without config, keep plater"
+msgstr "Импортировать проект STL/OBJ/AMF/3MF без наÑтроек, оÑтавить компоновку"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:104
+msgid "Import Config from ini/amf/3mf/gcode"
+msgstr "Импортировать наÑтройки из ini/amf/3mf/gcode"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:105
+msgid "Load Config from ini/amf/3mf/gcode and merge"
+msgstr "Загрузить наÑтройки из ini/amf/3mf/gcode и объединить"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:107 src/slic3r/GUI/Plater.cpp:770
+#: src/slic3r/GUI/Plater.cpp:5961 src/libslic3r/PrintConfig.cpp:3600
+msgid "Export G-code"
+msgstr "ЭкÑпортировать G-код"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:108 src/slic3r/GUI/Plater.cpp:5962
+msgid "Send G-code"
+msgstr "ПоÑлать G-код"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:109
+msgid "Export config"
+msgstr "ЭкÑпортировать наÑтройки"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:110 src/slic3r/GUI/Plater.cpp:758
+msgid "Export to SD card / Flash drive"
+msgstr "ЭкÑпортировать на SD-карту / Flash-накопитель"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:111
+msgid "Eject SD card / Flash drive"
+msgstr "Извлечь SD-карту / Flash-накопитель"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:113
+msgid "Select all objects"
+msgstr "Выбрать вÑе объекты"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:114
+msgid "Deselect all"
+msgstr "Отменить вÑÑ‘"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:115
+msgid "Delete selected"
+msgstr "Удалить выбранное"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:119
+msgid "Copy to clipboard"
+msgstr "Скопировать в буфер обмена"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:120
+msgid "Paste from clipboard"
+msgstr "Ð’Ñтавить из буфера обмена"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:121
+msgid "Reload plater from disk"
+msgstr "Перезагрузить компоновку Ñ Ð´Ð¸Ñка"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:124
+msgid "Select Plater Tab"
+msgstr "Вкладка компоновки"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:125
+msgid "Select Print Settings Tab"
+msgstr "Вкладка наÑтройки печати"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:126
+msgid "Select Filament Settings Tab"
+msgstr "Вкладка наÑтройки прутка"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:127
+msgid "Select Printer Settings Tab"
+msgstr "Вкладка наÑтройки принтера"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:128
+msgid "Switch to 3D"
+msgstr "ПереключитьÑÑ Ð² 3D"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:129
+msgid "Switch to Preview"
+msgstr "ПереключитьÑÑ Ð² предварительный проÑмотр"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:130
+#: src/slic3r/GUI/PrintHostDialogs.cpp:163
+msgid "Print host upload queue"
+msgstr "Очередь отправки на узел печати"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:132
+msgid "Camera view"
+msgstr "Виды Ñ ÐºÐ°Ð¼ÐµÑ€Ñ‹"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:133
+msgid "Show/Hide object/instance labels"
+msgstr "Показать/Ñкрыть метки объекта/ÑкземплÑра"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:135 src/slic3r/GUI/Preferences.cpp:12
+msgid "Preferences"
+msgstr "Параметры"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:137
+msgid "Show keyboard shortcuts list"
+msgstr "Показать ÑпиÑок клавиш доÑтупа к командам"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:140
+msgid "Commands"
+msgstr "Команды"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:145
+msgid "Add Instance of the selected object"
+msgstr "Добавить ÑкземплÑÑ€ выбранного объекта"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:146
+msgid "Remove Instance of the selected object"
+msgstr "Удалить ÑкземплÑÑ€ выбранного объекта"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:147
+msgid ""
+"Press to select multiple objects\n"
+"or move multiple objects with mouse"
+msgstr ""
+"Ðажмите Ð´Ð»Ñ Ð²Ñ‹Ð±Ð¾Ñ€Ð° или перемещениÑ\n"
+"неÑкольких объектов мышью"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:148
+msgid "Press to activate selection rectangle"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:149
+msgid "Press to activate deselection rectangle"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:150
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:206
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+msgid "Arrow Up"
+msgstr "Стрелка вверх"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:150
+msgid "Move selection 10 mm in positive Y direction"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:151
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+msgid "Arrow Down"
+msgstr "Стрелка вниз"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:151
+msgid "Move selection 10 mm in negative Y direction"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:152
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:229
+msgid "Arrow Left"
+msgstr "Стрелка влево"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:152
+msgid "Move selection 10 mm in negative X direction"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:153
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:230
+msgid "Arrow Right"
+msgstr "Стрелка вправо"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:153
+msgid "Move selection 10 mm in positive X direction"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:154
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:155
+msgid "Any arrow"
+msgstr "Ð›ÑŽÐ±Ð°Ñ Ñтрелка"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:154
+msgid "Movement step set to 1 mm"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:155
+msgid "Movement in camera space"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:156
+msgid "Page Up"
+msgstr "Page Up"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:156
+msgid "Rotate selection 45 degrees CCW"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:157
+msgid "Page Down"
+msgstr "Page Down"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:157
+msgid "Rotate selection 45 degrees CW"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:158
+msgid "Gizmo move"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:159
+msgid "Gizmo scale"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:160
+msgid "Gizmo rotate"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:161
+msgid "Gizmo cut"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:162
+msgid "Gizmo Place face on bed"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:163
+msgid "Gizmo SLA hollow"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:164
+msgid "Gizmo SLA support points"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:165
+msgid "Unselect gizmo or clear selection"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:166
+msgid "Change camera type (perspective, orthographic)"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:167
+msgid "Zoom to Bed"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:168
+msgid ""
+"Zoom to selected object\n"
+"or all objects in scene, if none selected"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:169
+msgid "Zoom in"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:170
+msgid "Zoom out"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:171
+msgid "Switch between Editor/Preview"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:172
+msgid "Collapse/Expand the sidebar"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:175
+msgid "Show/Hide 3Dconnexion devices settings dialog, if enabled"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:177
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:181
+msgid "Show/Hide 3Dconnexion devices settings dialog"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:190 src/slic3r/GUI/MainFrame.cpp:328
+#: src/slic3r/GUI/MainFrame.cpp:340
+msgid "Plater"
+msgstr "Компоновка"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:193
+msgid "All gizmos: Rotate - left mouse button; Pan - right mouse button"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:194
+msgid "Gizmo move: Press to snap by 1mm"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:195
+msgid "Gizmo scale: Press to snap by 5%"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:196
+msgid "Gizmo scale: Scale selection to fit print volume"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:197
+msgid "Gizmo scale: Press to activate one direction scaling"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:198
+msgid "Gizmo scale: Press to scale selected objects around their own center"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:199
+msgid "Gizmo rotate: Press to rotate selected objects around their own center"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:202
+msgid "Gizmos"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:206
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:208
+msgid "Upper Layer"
+msgstr "Верхний Ñлой"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:207
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:209
+msgid "Lower Layer"
+msgstr "Ðижний Ñлой"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:210
+msgid "Show/Hide Legend & Estimated printing time"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:213 src/slic3r/GUI/Plater.cpp:4124
+#: src/slic3r/GUI/Tab.cpp:2597
+msgid "Preview"
+msgstr "ПредпроÑмотр"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:216
+msgid "Move current slider thumb Up"
+msgstr "ПеремеÑтить текущий ползунок вверх"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:217
+msgid "Move current slider thumb Down"
+msgstr "ПеремеÑтить текущий ползунок вниз"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:218
+msgid "Set upper thumb to current slider thumb"
+msgstr "Сделать верхний ползунок текущим"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:219
+msgid "Set lower thumb to current slider thumb"
+msgstr "Сделать нижний ползунок текущим"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:220
+msgid "Add color change marker for current layer"
+msgstr "Добавить маркер Ñмены цвета Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ ÑлоÑ"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:221
+msgid "Delete color change marker for current layer"
+msgstr "Удалить маркер Ñмены цвета Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ ÑлоÑ"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:222
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:223
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:231
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:232
+msgid ""
+"Press to speed up 5 times while moving thumb\n"
+"with arrow keys or mouse wheel"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:226
+msgid "Layers Slider"
+msgstr "Ползунок по ÑлоÑм"
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:229
+msgid "Move current slider thumb Left"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:230
+msgid "Move current slider thumb Right"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:235
+msgid "Sequential Slider"
+msgstr ""
+
+#: src/slic3r/GUI/KBShortcutsDialog.cpp:258
+msgid "Keyboard shortcuts"
+msgstr "Клавиатурные комбинации"
+
+#: src/slic3r/GUI/MainFrame.cpp:64 src/slic3r/GUI/MainFrame.cpp:1189
+msgid "Open new instance"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:64 src/slic3r/GUI/MainFrame.cpp:78
+#: src/slic3r/GUI/MainFrame.cpp:1189
+msgid "Open a new PrusaSlicer instance"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:67 src/slic3r/GUI/MainFrame.cpp:80
+msgid "G-code preview"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:67 src/slic3r/GUI/MainFrame.cpp:1095
+msgid "Open G-code viewer"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:78 src/slic3r/GUI/MainFrame.cpp:1250
+msgid "Open PrusaSlicer"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:80
+msgid "Open new G-code viewer"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:155
+msgid ""
+"Remember to check for updates at https://github.com/prusa3d/PrusaSlicer/"
+"releases"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:507
+msgid "based on Slic3r"
+msgstr "оÑновываетÑÑ Ð½Ð° Slic3r"
+
+#: src/slic3r/GUI/MainFrame.cpp:870
+msgid "Prusa 3D &Drivers"
+msgstr "Драйверы Prusa 3D"
+
+#: src/slic3r/GUI/MainFrame.cpp:870
+msgid "Open the Prusa3D drivers download page in your browser"
+msgstr "Открыть Ñтраницу загрузки драйверов Prusa3D в браузере"
+
+#: src/slic3r/GUI/MainFrame.cpp:872
+msgid "Software &Releases"
+msgstr "ВыпуÑки ПО"
+
+#: src/slic3r/GUI/MainFrame.cpp:872
+msgid "Open the software releases page in your browser"
+msgstr "Открыть Ñтраницу выпуÑков ПО в браузере"
+
+#: src/slic3r/GUI/MainFrame.cpp:878
+#, c-format
+msgid "%s &Website"
+msgstr "Сайт %s"
+
+#: src/slic3r/GUI/MainFrame.cpp:879
+#, c-format
+msgid "Open the %s website in your browser"
+msgstr "Открыть Ñайт %s в браузере"
+
+#: src/slic3r/GUI/MainFrame.cpp:885
+msgid "System &Info"
+msgstr "СиÑÑ‚ÐµÐ¼Ð½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ"
+
+#: src/slic3r/GUI/MainFrame.cpp:885
+msgid "Show system information"
+msgstr "Показать ÑиÑтемную информацию"
+
+#: src/slic3r/GUI/MainFrame.cpp:887
+msgid "Show &Configuration Folder"
+msgstr "Каталог наÑтроек"
+
+#: src/slic3r/GUI/MainFrame.cpp:887
+msgid "Show user configuration folder (datadir)"
+msgstr "Открыть каталог наÑтроек Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ (datadir) во внешней программе"
+
+#: src/slic3r/GUI/MainFrame.cpp:889
+msgid "Report an I&ssue"
+msgstr "Сообщить о проблеме"
+
+#: src/slic3r/GUI/MainFrame.cpp:889
+#, c-format
+msgid "Report an issue on %s"
+msgstr "Сообщить о проблеме Ñ %s"
+
+#: src/slic3r/GUI/MainFrame.cpp:892 src/slic3r/GUI/MainFrame.cpp:895
+#, c-format
+msgid "&About %s"
+msgstr "О %s"
+
+#: src/slic3r/GUI/MainFrame.cpp:892 src/slic3r/GUI/MainFrame.cpp:895
+msgid "Show about dialog"
+msgstr "Показать окно Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸ÐµÐ¹ о программе"
+
+#: src/slic3r/GUI/MainFrame.cpp:898
+msgid "Show the list of the keyboard shortcuts"
+msgstr "Показать ÑпиÑок клавиш доÑтупа к командам"
+
+#: src/slic3r/GUI/MainFrame.cpp:912
+msgid "Iso"
+msgstr "ИзометриÑ"
+
+#: src/slic3r/GUI/MainFrame.cpp:912
+msgid "Iso View"
+msgstr "ИзометричеÑÐºÐ°Ñ Ð¿Ñ€Ð¾ÐµÐºÑ†Ð¸Ñ"
+
+#. TRN To be shown in the main menu View->Top
+#. TRN To be shown in Print Settings "Top solid layers"
+#: src/slic3r/GUI/MainFrame.cpp:916 src/libslic3r/PrintConfig.cpp:2328
+#: src/libslic3r/PrintConfig.cpp:2337
+msgid "Top"
+msgstr "Сверху"
+
+#: src/slic3r/GUI/MainFrame.cpp:916
+msgid "Top View"
+msgstr "Вид Ñверху"
+
+#. TRN To be shown in the main menu View->Bottom
+#. TRN To be shown in Print Settings "Bottom solid layers"
+#. TRN To be shown in Print Settings "Top solid layers"
+#: src/slic3r/GUI/MainFrame.cpp:919 src/libslic3r/PrintConfig.cpp:215
+#: src/libslic3r/PrintConfig.cpp:224
+msgid "Bottom"
+msgstr "Снизу"
+
+#: src/slic3r/GUI/MainFrame.cpp:919
+msgid "Bottom View"
+msgstr "Вид Ñнизу"
+
+#: src/slic3r/GUI/MainFrame.cpp:921
+msgid "Front"
+msgstr "Спереди"
+
+#: src/slic3r/GUI/MainFrame.cpp:921
+msgid "Front View"
+msgstr "Вид Ñпереди"
+
+#: src/slic3r/GUI/MainFrame.cpp:923 src/libslic3r/PrintConfig.cpp:1813
+msgid "Rear"
+msgstr "Сзади"
+
+#: src/slic3r/GUI/MainFrame.cpp:923
+msgid "Rear View"
+msgstr "Вид Ñзади"
+
+#: src/slic3r/GUI/MainFrame.cpp:925
+msgid "Left"
+msgstr "Слева"
+
+#: src/slic3r/GUI/MainFrame.cpp:925
+msgid "Left View"
+msgstr "Вид Ñлева"
+
+#: src/slic3r/GUI/MainFrame.cpp:927
+msgid "Right"
+msgstr "Справа"
+
+#: src/slic3r/GUI/MainFrame.cpp:927
+msgid "Right View"
+msgstr "Вид Ñправа"
+
+#: src/slic3r/GUI/MainFrame.cpp:940
+msgid "&New Project"
+msgstr "&Ðовый проект"
+
+#: src/slic3r/GUI/MainFrame.cpp:940
+msgid "Start a new project"
+msgstr "Ðачать новый проект"
+
+#: src/slic3r/GUI/MainFrame.cpp:943
+msgid "&Open Project"
+msgstr "&Открыть проект"
+
+#: src/slic3r/GUI/MainFrame.cpp:943
+msgid "Open a project file"
+msgstr "Открыть файл проекта"
+
+#: src/slic3r/GUI/MainFrame.cpp:948
+msgid "Recent projects"
+msgstr "Ðедавние проекты"
+
+#: src/slic3r/GUI/MainFrame.cpp:957
+msgid ""
+"The selected project is no longer available.\n"
+"Do you want to remove it from the recent projects list?"
+msgstr ""
+"Выбранный проект больше недоÑтупен.\n"
+"Удалить его из ÑпиÑка поÑледних проектов?"
+
+#: src/slic3r/GUI/MainFrame.cpp:957 src/slic3r/GUI/MainFrame.cpp:1333
+#: src/slic3r/GUI/PrintHostDialogs.cpp:259
+msgid "Error"
+msgstr "Ошибка"
+
+#: src/slic3r/GUI/MainFrame.cpp:982
+msgid "&Save Project"
+msgstr "&Сохранить проект"
+
+#: src/slic3r/GUI/MainFrame.cpp:982
+msgid "Save current project file"
+msgstr "Сохранить файл текущего проекта"
+
+#: src/slic3r/GUI/MainFrame.cpp:986 src/slic3r/GUI/MainFrame.cpp:988
+msgid "Save Project &as"
+msgstr "Сохранить проект как"
+
+#: src/slic3r/GUI/MainFrame.cpp:986 src/slic3r/GUI/MainFrame.cpp:988
+msgid "Save current project file as"
+msgstr "Сохранить файл текущего проекта под другим именем"
+
+#: src/slic3r/GUI/MainFrame.cpp:996
+msgid "Import STL/OBJ/AM&F/3MF"
+msgstr "Импортировать STL/OBJ/AM&F/3MF"
+
+#: src/slic3r/GUI/MainFrame.cpp:996
+msgid "Load a model"
+msgstr "Загрузить модель"
+
+#: src/slic3r/GUI/MainFrame.cpp:1000
+msgid "Import STL (imperial units)"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1000
+msgid "Load an model saved with imperial units"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1004
+msgid "Import SL1 archive"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1004
+msgid "Load an SL1 archive"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1009
+msgid "Import &Config"
+msgstr "Импортировать наÑтройки"
+
+#: src/slic3r/GUI/MainFrame.cpp:1009
+msgid "Load exported configuration file"
+msgstr "Загрузить Ñохранённый файл наÑтроек"
+
+#: src/slic3r/GUI/MainFrame.cpp:1012
+msgid "Import Config from &project"
+msgstr "Импортировать наÑтройки из проекта"
+
+#: src/slic3r/GUI/MainFrame.cpp:1012
+msgid "Load configuration from project file"
+msgstr "Загрузить наÑтройки из файла проекта"
+
+#: src/slic3r/GUI/MainFrame.cpp:1016
+msgid "Import Config &Bundle"
+msgstr "Импортировать комплект наÑтроек"
+
+#: src/slic3r/GUI/MainFrame.cpp:1016
+msgid "Load presets from a bundle"
+msgstr "Загрузить вÑе профили из комплекта"
+
+#: src/slic3r/GUI/MainFrame.cpp:1019
+msgid "&Import"
+msgstr "Импорт"
+
+#: src/slic3r/GUI/MainFrame.cpp:1022 src/slic3r/GUI/MainFrame.cpp:1295
+msgid "Export &G-code"
+msgstr "ЭкÑпортировать G-код"
+
+#: src/slic3r/GUI/MainFrame.cpp:1022
+msgid "Export current plate as G-code"
+msgstr "ЭкÑпортировать текущую компоновку как G-код"
+
+#: src/slic3r/GUI/MainFrame.cpp:1026 src/slic3r/GUI/MainFrame.cpp:1296
+msgid "S&end G-code"
+msgstr "ПоÑлать G-код"
+
+#: src/slic3r/GUI/MainFrame.cpp:1026
+msgid "Send to print current plate as G-code"
+msgstr "ПоÑлать на печать текущую компоновку как G-код"
+
+#: src/slic3r/GUI/MainFrame.cpp:1030
+msgid "Export G-code to SD card / Flash drive"
+msgstr "ЭкÑпортировать G-код на SD-карту/флешку"
+
+#: src/slic3r/GUI/MainFrame.cpp:1030
+msgid "Export current plate as G-code to SD card / Flash drive"
+msgstr "ЭкÑпортировать текущую компоновку как G-код на SD-карту/флешку"
+
+#: src/slic3r/GUI/MainFrame.cpp:1034
+msgid "Export plate as &STL"
+msgstr "ЭкÑпортировать компоновку в STL"
+
+#: src/slic3r/GUI/MainFrame.cpp:1034
+msgid "Export current plate as STL"
+msgstr "ЭкÑпортировать текущую компоновку в STL"
+
+#: src/slic3r/GUI/MainFrame.cpp:1037
+msgid "Export plate as STL &including supports"
+msgstr "ЭкÑпортировать компоновку в STL Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ°Ð¼Ð¸"
+
+#: src/slic3r/GUI/MainFrame.cpp:1037
+msgid "Export current plate as STL including supports"
+msgstr "ЭкÑпортировать текущую компоновку в STL Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸"
+
+#: src/slic3r/GUI/MainFrame.cpp:1040
+msgid "Export plate as &AMF"
+msgstr "ЭкÑпортировать компоновку в &AMF"
+
+#: src/slic3r/GUI/MainFrame.cpp:1040
+msgid "Export current plate as AMF"
+msgstr "ЭкÑпортировать текущую компоновку в AMF"
+
+#: src/slic3r/GUI/MainFrame.cpp:1044 src/slic3r/GUI/MainFrame.cpp:1247
+msgid "Export &toolpaths as OBJ"
+msgstr "ЭкÑпортировать траектории в OBJ"
+
+#: src/slic3r/GUI/MainFrame.cpp:1044 src/slic3r/GUI/MainFrame.cpp:1247
+msgid "Export toolpaths as OBJ"
+msgstr "ЭкÑпортировать траектории в OBJ"
+
+#: src/slic3r/GUI/MainFrame.cpp:1048
+msgid "Export &Config"
+msgstr "ЭкÑпортировать наÑтройки"
+
+#: src/slic3r/GUI/MainFrame.cpp:1048
+msgid "Export current configuration to file"
+msgstr "ЭкÑпортировать текущие наÑтройки в файл"
+
+#: src/slic3r/GUI/MainFrame.cpp:1051
+msgid "Export Config &Bundle"
+msgstr "ЭкÑпортировать комплект наÑтроек"
+
+#: src/slic3r/GUI/MainFrame.cpp:1051
+msgid "Export all presets to file"
+msgstr "ЭкÑпортировать комплект наÑтроек в файл"
+
+#: src/slic3r/GUI/MainFrame.cpp:1054
+msgid "Export Config Bundle With Physical Printers"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1054
+msgid "Export all presets including physical printers to file"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1057
+msgid "&Export"
+msgstr "ЭкÑпорт"
+
+#: src/slic3r/GUI/MainFrame.cpp:1059
+msgid "Ejec&t SD card / Flash drive"
+msgstr "Извлечь SD-карту / Flash-накопитель"
+
+#: src/slic3r/GUI/MainFrame.cpp:1059
+msgid "Eject SD card / Flash drive after the G-code was exported to it."
+msgstr ""
+"Извлечь SD-карту / Flash-накопитель поÑле ÑкÑÐ¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð½Ð° неё G-кода."
+
+#: src/slic3r/GUI/MainFrame.cpp:1067
+msgid "Quick Slice"
+msgstr "БыÑÑ‚Ñ€Ð°Ñ Ð½Ð°Ñ€ÐµÐ·ÐºÐ°"
+
+#: src/slic3r/GUI/MainFrame.cpp:1067
+msgid "Slice a file into a G-code"
+msgstr "Ðарезать файл в G-код"
+
+#: src/slic3r/GUI/MainFrame.cpp:1073
+msgid "Quick Slice and Save As"
+msgstr "БыÑтро нарезать и Ñохранить как"
+
+#: src/slic3r/GUI/MainFrame.cpp:1073
+msgid "Slice a file into a G-code, save as"
+msgstr "Ðарезать файл в G-код, Ñохранить как"
+
+#: src/slic3r/GUI/MainFrame.cpp:1079
+msgid "Repeat Last Quick Slice"
+msgstr "Повторить поÑледнюю быÑтрую нарезку"
+
+#: src/slic3r/GUI/MainFrame.cpp:1079
+msgid "Repeat last quick slice"
+msgstr "Повторить поÑледнюю быÑтрую нарезку"
+
+#: src/slic3r/GUI/MainFrame.cpp:1087
+msgid "(Re)Slice No&w"
+msgstr "(Пере)Ðарезать"
+
+#: src/slic3r/GUI/MainFrame.cpp:1087
+msgid "Start new slicing process"
+msgstr "Ðачать новый процеÑÑ Ð½Ð°Ñ€ÐµÐ·ÐºÐ¸"
+
+#: src/slic3r/GUI/MainFrame.cpp:1091
+msgid "&Repair STL file"
+msgstr "Починить STL-файл"
+
+#: src/slic3r/GUI/MainFrame.cpp:1091
+msgid "Automatically repair an STL file"
+msgstr "ÐвтоматичеÑÐºÐ°Ñ Ð¿Ð¾Ñ‡Ð¸Ð½ÐºÐ° STL-файла"
+
+#: src/slic3r/GUI/MainFrame.cpp:1095
+msgid "&G-code preview"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1098 src/slic3r/GUI/MainFrame.cpp:1254
+msgid "&Quit"
+msgstr "&Выход"
+
+#: src/slic3r/GUI/MainFrame.cpp:1098 src/slic3r/GUI/MainFrame.cpp:1254
+#, c-format
+msgid "Quit %s"
+msgstr "Выход из %s"
+
+#: src/slic3r/GUI/MainFrame.cpp:1113
+msgid "&Select all"
+msgstr "Выбрать вÑÑ‘"
+
+#: src/slic3r/GUI/MainFrame.cpp:1114
+msgid "Selects all objects"
+msgstr "Выбрать вÑе объекты"
+
+#: src/slic3r/GUI/MainFrame.cpp:1116
+msgid "D&eselect all"
+msgstr "Отменить вÑÑ‘"
+
+#: src/slic3r/GUI/MainFrame.cpp:1117
+msgid "Deselects all objects"
+msgstr "Отменить выбор вÑех объектов"
+
+#: src/slic3r/GUI/MainFrame.cpp:1120
+msgid "&Delete selected"
+msgstr "Удалить выбранное"
+
+#: src/slic3r/GUI/MainFrame.cpp:1121
+msgid "Deletes the current selection"
+msgstr "Удалить текущее выделение"
+
+#: src/slic3r/GUI/MainFrame.cpp:1123
+msgid "Delete &all"
+msgstr "Удалить вÑÑ‘"
+
+#: src/slic3r/GUI/MainFrame.cpp:1124
+msgid "Deletes all objects"
+msgstr "Удалить вÑе объекты"
+
+#: src/slic3r/GUI/MainFrame.cpp:1128
+msgid "&Undo"
+msgstr "&Отменить"
+
+#: src/slic3r/GUI/MainFrame.cpp:1131
+msgid "&Redo"
+msgstr "&Вернуть"
+
+#: src/slic3r/GUI/MainFrame.cpp:1136
+msgid "&Copy"
+msgstr "&Копировать"
+
+#: src/slic3r/GUI/MainFrame.cpp:1137
+msgid "Copy selection to clipboard"
+msgstr "Скопировать выделение в буфер обмена"
+
+#: src/slic3r/GUI/MainFrame.cpp:1139
+msgid "&Paste"
+msgstr "&Ð’Ñтавить"
+
+#: src/slic3r/GUI/MainFrame.cpp:1140
+msgid "Paste clipboard"
+msgstr "Ð’Ñтавить из буфера обмена"
+
+#: src/slic3r/GUI/MainFrame.cpp:1144
+msgid "Re&load from disk"
+msgstr "Перезагрузить Ñ Ð´Ð¸Ñка"
+
+#: src/slic3r/GUI/MainFrame.cpp:1145
+msgid "Reload the plater from disk"
+msgstr "Перезагрузить компоновку Ñ Ð´Ð¸Ñка"
+
+#: src/slic3r/GUI/MainFrame.cpp:1149
+msgid "Searc&h"
+msgstr "ПоиÑк"
+
+#: src/slic3r/GUI/MainFrame.cpp:1150
+msgid "Search in settings"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1158
+msgid "&Plater Tab"
+msgstr "&Вкладка компоновки"
+
+#: src/slic3r/GUI/MainFrame.cpp:1158
+msgid "Show the plater"
+msgstr "Показать компоновку"
+
+#: src/slic3r/GUI/MainFrame.cpp:1163
+msgid "P&rint Settings Tab"
+msgstr "Вкладка наÑтройки печати"
+
+#: src/slic3r/GUI/MainFrame.cpp:1163
+msgid "Show the print settings"
+msgstr "Показать наÑтройки печати"
+
+#: src/slic3r/GUI/MainFrame.cpp:1166 src/slic3r/GUI/MainFrame.cpp:1298
+msgid "&Filament Settings Tab"
+msgstr "Вкладка наÑтройки прутка"
+
+#: src/slic3r/GUI/MainFrame.cpp:1166
+msgid "Show the filament settings"
+msgstr "Показать наÑтройки прутка"
+
+#: src/slic3r/GUI/MainFrame.cpp:1170
+msgid "Print&er Settings Tab"
+msgstr "Вкладка наÑтройки принтера"
+
+#: src/slic3r/GUI/MainFrame.cpp:1170
+msgid "Show the printer settings"
+msgstr "Показать наÑтройки принтера"
+
+#: src/slic3r/GUI/MainFrame.cpp:1176
+msgid "3&D"
+msgstr "3D"
+
+#: src/slic3r/GUI/MainFrame.cpp:1176
+msgid "Show the 3D editing view"
+msgstr "Показать редактируемое отображение в 3D"
+
+#: src/slic3r/GUI/MainFrame.cpp:1179
+msgid "Pre&view"
+msgstr "Предварительный проÑмотр"
+
+#: src/slic3r/GUI/MainFrame.cpp:1179
+msgid "Show the 3D slices preview"
+msgstr "Показать 3D нарезку"
+
+#: src/slic3r/GUI/MainFrame.cpp:1185
+msgid "Print &Host Upload Queue"
+msgstr "Очередь отправки на узел печати"
+
+#: src/slic3r/GUI/MainFrame.cpp:1185
+msgid "Display the Print Host Upload Queue window"
+msgstr "Показать окно очереди отправки на узел печати"
+
+#: src/slic3r/GUI/MainFrame.cpp:1200
+msgid "Show &labels"
+msgstr "Показать метки"
+
+#: src/slic3r/GUI/MainFrame.cpp:1200
+msgid "Show object/instance labels in 3D scene"
+msgstr "Показать метки объекта/ÑкземплÑра в 3D-Ñцене"
+
+#: src/slic3r/GUI/MainFrame.cpp:1203
+msgid "&Collapse sidebar"
+msgstr "Скрыть боковую панель"
+
+#: src/slic3r/GUI/MainFrame.cpp:1203 src/slic3r/GUI/Plater.cpp:2225
+msgid "Collapse sidebar"
+msgstr "Скрыть боковую панель"
+
+#: src/slic3r/GUI/MainFrame.cpp:1215 src/slic3r/GUI/MainFrame.cpp:1269
+msgid "&File"
+msgstr "&Файл"
+
+#: src/slic3r/GUI/MainFrame.cpp:1216
+msgid "&Edit"
+msgstr "&Правка"
+
+#: src/slic3r/GUI/MainFrame.cpp:1217
+msgid "&Window"
+msgstr "&Окна"
+
+#: src/slic3r/GUI/MainFrame.cpp:1218 src/slic3r/GUI/MainFrame.cpp:1270
+msgid "&View"
+msgstr "&Вид"
+
+#: src/slic3r/GUI/MainFrame.cpp:1221 src/slic3r/GUI/MainFrame.cpp:1273
+msgid "&Help"
+msgstr "&Справка"
+
+#: src/slic3r/GUI/MainFrame.cpp:1243
+msgid "&Open G-code"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1243
+msgid "Open a G-code file"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1250
+msgid "Open &PrusaSlicer"
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1295
+msgid "E&xport"
+msgstr "&ЭкÑпорт"
+
+#: src/slic3r/GUI/MainFrame.cpp:1296
+msgid "S&end to print"
+msgstr "ПоÑлать на печать"
+
+#: src/slic3r/GUI/MainFrame.cpp:1298
+msgid "Mate&rial Settings Tab"
+msgstr "Вкладка наÑтройки материала"
+
+#: src/slic3r/GUI/MainFrame.cpp:1321
+msgid "Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):"
+msgstr "Выберите файл Ð´Ð»Ñ Ð½Ð°Ñ€ÐµÐ·ÐºÐ¸ (STL/OBJ/AMF/3MF/PRUSA):"
+
+#: src/slic3r/GUI/MainFrame.cpp:1332
+msgid "No previously sliced file."
+msgstr "Ðет ранее нарезанного файла."
+
+#: src/slic3r/GUI/MainFrame.cpp:1338
+msgid "Previously sliced file ("
+msgstr "Ранее нарезанный файл"
+
+#: src/slic3r/GUI/MainFrame.cpp:1338
+msgid ") not found."
+msgstr ") не найден."
+
+#: src/slic3r/GUI/MainFrame.cpp:1339
+msgid "File Not Found"
+msgstr "Файл не найден"
+
+#: src/slic3r/GUI/MainFrame.cpp:1374
+#, c-format
+msgid "Save %s file as:"
+msgstr "Сохранить файл %s как:"
+
+#: src/slic3r/GUI/MainFrame.cpp:1374
+msgid "SVG"
+msgstr "SVG"
+
+#: src/slic3r/GUI/MainFrame.cpp:1374
+msgid "G-code"
+msgstr "G-код"
+
+#: src/slic3r/GUI/MainFrame.cpp:1386
+msgid "Save zip file as:"
+msgstr "Сохранить zip-файл как:"
+
+#: src/slic3r/GUI/MainFrame.cpp:1395 src/slic3r/GUI/Plater.cpp:2984
+#: src/slic3r/GUI/Plater.cpp:5496 src/slic3r/GUI/Tab.cpp:1576
+#: src/slic3r/GUI/Tab.cpp:4105
+msgid "Slicing"
+msgstr "Ðарезка"
+
+#. TRN "Processing input_file_basename"
+#: src/slic3r/GUI/MainFrame.cpp:1397
+#, c-format
+msgid "Processing %s"
+msgstr "ОбрабатываетÑÑ %s"
+
+#: src/slic3r/GUI/MainFrame.cpp:1420
+msgid "%1% was successfully sliced."
+msgstr ""
+
+#: src/slic3r/GUI/MainFrame.cpp:1422
+msgid "Slicing Done!"
+msgstr "Ðарезка завершена!"
+
+#: src/slic3r/GUI/MainFrame.cpp:1437
+msgid "Select the STL file to repair:"
+msgstr "Выберите STL файл Ð´Ð»Ñ Ð¿Ð¾Ñ‡Ð¸Ð½ÐºÐ¸:"
+
+#: src/slic3r/GUI/MainFrame.cpp:1447
+msgid "Save OBJ file (less prone to coordinate errors than STL) as:"
+msgstr "Сохранить в OBJ как (меньше подвержен ошибкам в координатах, чем STL:"
+
+#: src/slic3r/GUI/MainFrame.cpp:1459
+msgid "Your file was repaired."
+msgstr "Ваш файл был починен."
+
+#: src/slic3r/GUI/MainFrame.cpp:1459 src/libslic3r/PrintConfig.cpp:3700
+msgid "Repair"
+msgstr "Починка"
+
+#: src/slic3r/GUI/MainFrame.cpp:1473
+msgid "Save configuration as:"
+msgstr "Сохранить конфигурацию в файл как:"
+
+#: src/slic3r/GUI/MainFrame.cpp:1492 src/slic3r/GUI/MainFrame.cpp:1554
+msgid "Select configuration to load:"
+msgstr "Выберите файл конфигурации Ð´Ð»Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸:"
+
+#: src/slic3r/GUI/MainFrame.cpp:1528
+msgid "Save presets bundle as:"
+msgstr "Сохранить вÑе профили в файл как:"
+
+#: src/slic3r/GUI/MainFrame.cpp:1575
+#, c-format
+msgid "%d presets successfully imported."
+msgstr "УÑпешно импортировано профилей: %d шт."
+
+#: src/slic3r/GUI/Mouse3DController.cpp:462
+msgid "3Dconnexion settings"
+msgstr "ÐаÑтройки 3Dconnexion"
+
+#: src/slic3r/GUI/Mouse3DController.cpp:473
+msgid "Device:"
+msgstr "УÑтройÑтво:"
+
+#: src/slic3r/GUI/Mouse3DController.cpp:478
+msgid "Speed:"
+msgstr "СкороÑÑ‚ÑŒ:"
+
+#: src/slic3r/GUI/Mouse3DController.cpp:481
+#: src/slic3r/GUI/Mouse3DController.cpp:502
+msgid "Translation"
+msgstr ""
+
+#: src/slic3r/GUI/Mouse3DController.cpp:493
+#: src/slic3r/GUI/Mouse3DController.cpp:502
+msgid "Zoom"
+msgstr "Увеличение"
+
+#: src/slic3r/GUI/Mouse3DController.cpp:499
+msgid "Deadzone:"
+msgstr ""
+
+#: src/slic3r/GUI/Mouse3DController.cpp:514
+msgid "Options:"
+msgstr "Параметры:"
+
+#: src/slic3r/GUI/Mouse3DController.cpp:517
+msgid "Swap Y/Z axes"
+msgstr ""
+
+#: src/slic3r/GUI/MsgDialog.cpp:73
+#, c-format
+msgid "%s error"
+msgstr "Ошибка %s"
+
+#: src/slic3r/GUI/MsgDialog.cpp:74
+#, c-format
+msgid "%s has encountered an error"
+msgstr "В %s возникла ошибка"
+
+#: src/slic3r/GUI/NotificationManager.hpp:398
+msgid "3D Mouse disconnected."
+msgstr ""
+
+#: src/slic3r/GUI/NotificationManager.hpp:401
+msgid "Configuration update is available."
+msgstr ""
+
+#: src/slic3r/GUI/NotificationManager.hpp:401
+msgid "See more."
+msgstr ""
+
+#: src/slic3r/GUI/NotificationManager.hpp:403
+msgid "New version is available."
+msgstr ""
+
+#: src/slic3r/GUI/NotificationManager.hpp:403
+msgid "See Releases page."
+msgstr ""
+
+#: src/slic3r/GUI/NotificationManager.cpp:387
+#: src/slic3r/GUI/NotificationManager.cpp:397
+msgid "More"
+msgstr "Больше"
+
+#: src/slic3r/GUI/NotificationManager.cpp:690
+#: src/slic3r/GUI/NotificationManager.cpp:961
+msgid "Export G-Code."
+msgstr ""
+
+#: src/slic3r/GUI/NotificationManager.cpp:734
+msgid "Open Folder."
+msgstr ""
+
+#: src/slic3r/GUI/NotificationManager.cpp:772
+msgid "Eject drive"
+msgstr ""
+
+#: src/slic3r/GUI/NotificationManager.cpp:880
+#: src/slic3r/GUI/NotificationManager.cpp:896
+#: src/slic3r/GUI/NotificationManager.cpp:907
+msgid "ERROR:"
+msgstr ""
+
+#: src/slic3r/GUI/NotificationManager.cpp:885
+#: src/slic3r/GUI/NotificationManager.cpp:900
+#: src/slic3r/GUI/NotificationManager.cpp:915
+msgid "WARNING:"
+msgstr ""
+
+#: src/slic3r/GUI/NotificationManager.cpp:964
+msgid "Slicing finished."
+msgstr ""
+
+#: src/slic3r/GUI/NotificationManager.cpp:1007
+msgid "Exporting finished."
+msgstr ""
+
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:58
+msgid "Instances"
+msgstr "ЭкземплÑры"
+
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:62
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:225
+#, c-format
+msgid "Instance %d"
+msgstr "ЭкземплÑÑ€ %d"
+
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:69 src/slic3r/GUI/Tab.cpp:3952
+#: src/slic3r/GUI/Tab.cpp:4034
+msgid "Layers"
+msgstr "Слои"
+
+#: src/slic3r/GUI/ObjectDataViewModel.cpp:96
+msgid "Range"
+msgstr "Диапазон"
+
+#: src/slic3r/GUI/OpenGLManager.cpp:259
+#, c-format
+msgid ""
+"PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n"
+"while OpenGL version %s, render %s, vendor %s was detected."
+msgstr ""
+
+#: src/slic3r/GUI/OpenGLManager.cpp:262
+msgid "You may need to update your graphics card driver."
+msgstr ""
+
+#: src/slic3r/GUI/OpenGLManager.cpp:265
+msgid ""
+"As a workaround, you may run PrusaSlicer with a software rendered 3D "
+"graphics by running prusa-slicer.exe with the --sw_renderer parameter."
+msgstr ""
+
+#: src/slic3r/GUI/OpenGLManager.cpp:267
+msgid "Unsupported OpenGL version"
+msgstr "ÐÐµÐ¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÐ¼Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ OpenGL"
+
+#: src/slic3r/GUI/OpenGLManager.cpp:275
+#, c-format
+msgid ""
+"Unable to load the following shaders:\n"
+"%s"
+msgstr ""
+
+#: src/slic3r/GUI/OpenGLManager.cpp:276
+msgid "Error loading shaders"
+msgstr ""
+
+#: src/slic3r/GUI/OptionsGroup.cpp:333
+msgctxt "Layers"
+msgid "Top"
+msgstr "Сверху"
+
+#: src/slic3r/GUI/OptionsGroup.cpp:333
+msgctxt "Layers"
+msgid "Bottom"
+msgstr "Снизу"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:51
+msgid "Delete this preset from this printer device"
+msgstr ""
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:81
+msgid "This printer will be shown in the presets list as"
+msgstr ""
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:155
+msgid "Physical Printer"
+msgstr ""
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:161
+msgid "Type here the name of your printer device"
+msgstr ""
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:172
+msgid "Descriptive name for the printer"
+msgstr ""
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:176
+msgid "Add preset for this printer device"
+msgstr ""
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:205 src/slic3r/GUI/Tab.cpp:2064
+msgid "Print Host upload"
+msgstr "Отправка на узел печати"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:260
+msgid "Connection to printers connected via the print host failed."
+msgstr ""
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:302
+msgid "Test"
+msgstr "ТеÑÑ‚"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:307
+msgid "Could not get a valid Printer Host reference"
+msgstr "Ðевозможно получить корректную ÑÑылку узла печати"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:319
+msgid "Success!"
+msgstr "УÑпешно!"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:329
+msgid "Refresh Printers"
+msgstr ""
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:356
+msgid ""
+"HTTPS CA file is optional. It is only needed if you use HTTPS with a self-"
+"signed certificate."
+msgstr ""
+"Файл УЦ Ð´Ð»Ñ HTTPS не ÑвлÑетÑÑ Ð¾Ð±Ñзательным. Файл необходим, только еÑли вы "
+"иÑпользуете HTTPS Ñ ÑамоподпиÑанным Ñертификатом."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:366
+msgid "Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*"
+msgstr "Файлы Ñертификатов (*.crt, *.pem)|*.crt;*.pem|Ð’Ñе файлы|*.*"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:367
+msgid "Open CA certificate file"
+msgstr "Открыть файл Ñертификата УЦ"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:395
+#: src/libslic3r/PrintConfig.cpp:120
+msgid "HTTPS CA File"
+msgstr "Файл УЦ Ð´Ð»Ñ HTTPS"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:396
+#, c-format
+msgid ""
+"On this system, %s uses HTTPS certificates from the system Certificate Store "
+"or Keychain."
+msgstr ""
+"Ð’ Ñтой ÑиÑтеме %s иÑпользует Ñертификаты HTTPS из ÑиÑтемного хранилища "
+"Ñертификатов или ÑвÑзки ключей."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:397
+msgid ""
+"To use a custom CA file, please import your CA file into Certificate Store / "
+"Keychain."
+msgstr ""
+"Чтобы иÑпользовать Ñвой файл УЦ, импортируйте Ñтот файл в хранилище "
+"Ñертификатов/ÑвÑзку ключей."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:543
+msgid "The supplied name is empty. It can't be saved."
+msgstr "Ð˜Ð¼Ñ Ð½Ðµ задано. Ðевозможно Ñохранить."
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:547
+msgid "You should change the name of your printer device."
+msgstr ""
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:555
+msgid "Printer with name \"%1%\" already exists."
+msgstr ""
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:556
+msgid "Replace?"
+msgstr "Заменить?"
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:579
+msgid ""
+"Following printer preset(s) is duplicated:%1%The above preset for printer "
+"\"%2%\" will be used just once."
+msgstr ""
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:625
+msgid "It's not possible to delete the last related preset for the printer."
+msgstr ""
+
+#: src/slic3r/GUI/PhysicalPrinterDialog.cpp:626
+msgid "Infornation"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:163
+msgid "Volume"
+msgstr "Объём"
+
+#: src/slic3r/GUI/Plater.cpp:164
+msgid "Facets"
+msgstr "Граней"
+
+#: src/slic3r/GUI/Plater.cpp:165
+msgid "Materials"
+msgstr "Материалов"
+
+#: src/slic3r/GUI/Plater.cpp:168
+msgid "Manifold"
+msgstr "ЦелоÑтноÑÑ‚ÑŒ"
+
+#: src/slic3r/GUI/Plater.cpp:218
+msgid "Sliced Info"
+msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ нарезке"
+
+#: src/slic3r/GUI/Plater.cpp:237 src/slic3r/GUI/Plater.cpp:1151
+msgid "Used Filament (m)"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:238 src/slic3r/GUI/Plater.cpp:1163
+msgid "Used Filament (mm³)"
+msgstr "ИÑпользовано прутка (мм³)"
+
+#: src/slic3r/GUI/Plater.cpp:239 src/slic3r/GUI/Plater.cpp:1170
+msgid "Used Filament (g)"
+msgstr "ИÑпользовано прутка (г)"
+
+#: src/slic3r/GUI/Plater.cpp:240
+msgid "Used Material (unit)"
+msgstr "ИÑпользовано материалов (шт)"
+
+#: src/slic3r/GUI/Plater.cpp:241
+msgid "Cost (money)"
+msgstr "СтоимоÑÑ‚ÑŒ (денег)"
+
+#: src/slic3r/GUI/Plater.cpp:243
+msgid "Number of tool changes"
+msgstr "КоличеÑтво Ñмен Ñопла"
+
+#: src/slic3r/GUI/Plater.cpp:360
+msgid "Select what kind of support do you need"
+msgstr "Выбор варианта поддержек"
+
+#: src/slic3r/GUI/Plater.cpp:362 src/libslic3r/PrintConfig.cpp:2096
+#: src/libslic3r/PrintConfig.cpp:2891
+msgid "Support on build plate only"
+msgstr "Только от платформы"
+
+#: src/slic3r/GUI/Plater.cpp:363 src/slic3r/GUI/Plater.cpp:489
+msgid "For support enforcers only"
+msgstr "Только Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð½ÑƒÐ´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ñ… поддержек"
+
+#: src/slic3r/GUI/Plater.cpp:364
+msgid "Everywhere"
+msgstr "Везде"
+
+#: src/slic3r/GUI/Plater.cpp:396 src/slic3r/GUI/Tab.cpp:1470
+msgid "Brim"
+msgstr "Кайма"
+
+#: src/slic3r/GUI/Plater.cpp:398
+msgid ""
+"This flag enables the brim that will be printed around each object on the "
+"first layer."
+msgstr ""
+"Включает кайму, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ печататьÑÑ Ð²Ð¾ÐºÑ€ÑƒÐ³ каждого объекта на первом "
+"Ñлое."
+
+#: src/slic3r/GUI/Plater.cpp:406
+msgid "Purging volumes"
+msgstr "Объём очиÑтки"
+
+#: src/slic3r/GUI/Plater.cpp:503
+msgid "Select what kind of pad do you need"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:505
+msgid "Below object"
+msgstr "Ðиже объекта"
+
+#: src/slic3r/GUI/Plater.cpp:506
+msgid "Around object"
+msgstr "Вокруг объекта"
+
+#: src/slic3r/GUI/Plater.cpp:695
+msgid "SLA print settings"
+msgstr "ÐаÑтройки печати SLA"
+
+#: src/slic3r/GUI/Plater.cpp:756 src/slic3r/GUI/Plater.cpp:5962
+msgid "Send to printer"
+msgstr "Отправить на принтер"
+
+#: src/slic3r/GUI/Plater.cpp:771 src/slic3r/GUI/Plater.cpp:2984
+#: src/slic3r/GUI/Plater.cpp:5499
+msgid "Slice now"
+msgstr "Ðарезать"
+
+#: src/slic3r/GUI/Plater.cpp:926
+msgid "Hold Shift to Slice & Export G-code"
+msgstr "Зажмите Shift что нарезать и ÑкÑпортировать G-код"
+
+#: src/slic3r/GUI/Plater.cpp:1071
+#, c-format
+msgid "%d (%d shells)"
+msgstr "%d (оболочек: %d)"
+
+#: src/slic3r/GUI/Plater.cpp:1076
+#, c-format
+msgid "Auto-repaired (%d errors)"
+msgstr "ИÑправлено ошибок: %d"
+
+#: src/slic3r/GUI/Plater.cpp:1079
+#, c-format
+msgid ""
+"%d degenerate facets, %d edges fixed, %d facets removed, %d facets added, %d "
+"facets reversed, %d backwards edges"
+msgstr ""
+"вырождено %d граней, починено %d рёбер, %d граней удалено, %d граней "
+"добавлено, %d граней реверÑировано, вывернуто %d рёбер"
+
+#: src/slic3r/GUI/Plater.cpp:1089
+msgid "Yes"
+msgstr "Да"
+
+#: src/slic3r/GUI/Plater.cpp:1110
+msgid "Used Material (ml)"
+msgstr "ИÑпользовано материала (мл)"
+
+#: src/slic3r/GUI/Plater.cpp:1113
+msgid "object(s)"
+msgstr "объект(ы)"
+
+#: src/slic3r/GUI/Plater.cpp:1113
+msgid "supports and pad"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1151
+msgid "Used Filament (in)"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1153 src/slic3r/GUI/Plater.cpp:1206
+msgid "objects"
+msgstr "объекты"
+
+#: src/slic3r/GUI/Plater.cpp:1153 src/slic3r/GUI/Plater.cpp:1206
+msgid "wipe tower"
+msgstr "Ð±Ð°ÑˆÐ½Ñ Ð¾Ñ‡Ð¸Ñтки"
+
+#: src/slic3r/GUI/Plater.cpp:1163
+msgid "Used Filament (in³)"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1189
+msgid "Filament at extruder %1%"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1195
+msgid "(weight with spool)"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1204 src/libslic3r/PrintConfig.cpp:805
+#: src/libslic3r/PrintConfig.cpp:2706 src/libslic3r/PrintConfig.cpp:2707
+msgid "Cost"
+msgstr "СтоимоÑÑ‚ÑŒ"
+
+#: src/slic3r/GUI/Plater.cpp:1222
+msgid "normal mode"
+msgstr "нормальный режим"
+
+#: src/slic3r/GUI/Plater.cpp:1232
+msgid "stealth mode"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1400 src/slic3r/GUI/Plater.cpp:4841
+#, c-format
+msgid "%s - Drop project file"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1407 src/slic3r/GUI/Plater.cpp:4848
+msgid "Open as project"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1408 src/slic3r/GUI/Plater.cpp:4849
+msgid "Import geometry only"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1409 src/slic3r/GUI/Plater.cpp:4850
+msgid "Import config only"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1412 src/slic3r/GUI/Plater.cpp:4853
+msgid "Select an action to apply to the file"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1413 src/slic3r/GUI/Plater.cpp:4854
+msgid "Action"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1421 src/slic3r/GUI/Plater.cpp:4862
+msgid "Don't show again"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1466 src/slic3r/GUI/Plater.cpp:4899
+msgid "You can open only one .gcode file at a time."
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1467 src/slic3r/GUI/Plater.cpp:4900
+msgid "Drag and drop G-code file"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1521 src/slic3r/GUI/Plater.cpp:4720
+#: src/slic3r/GUI/Plater.cpp:4954
+msgid "Import Object"
+msgstr "Импортировать объект"
+
+#: src/slic3r/GUI/Plater.cpp:1543 src/slic3r/GUI/Plater.cpp:4976
+msgid "Load File"
+msgstr "Загрузить файл"
+
+#: src/slic3r/GUI/Plater.cpp:1548 src/slic3r/GUI/Plater.cpp:4981
+msgid "Load Files"
+msgstr "Загрузить файлы"
+
+#: src/slic3r/GUI/Plater.cpp:1651
+msgid "Fill bed"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:1657
+msgid "Optimize Rotation"
+msgstr "Оптимизировать поворот"
+
+#: src/slic3r/GUI/Plater.cpp:1663
+msgid "Import SLA archive"
+msgstr "Импорт архива SLA"
+
+#: src/slic3r/GUI/Plater.cpp:2109
+#, c-format
+msgid ""
+"Successfully unmounted. The device %s(%s) can now be safely removed from the "
+"computer."
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:2112
+#, c-format
+msgid "Ejecting of device %s(%s) has failed."
+msgstr "Ðе удалоÑÑŒ извлечь уÑтройÑтво %s(%s)."
+
+#: src/slic3r/GUI/Plater.cpp:2131
+msgid "New Project"
+msgstr "Ðовый проект"
+
+#: src/slic3r/GUI/Plater.cpp:2224
+msgid "Expand sidebar"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:2297
+msgid "Loading"
+msgstr "ЗагружаетÑÑ"
+
+#: src/slic3r/GUI/Plater.cpp:2307
+msgid "Loading file"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:2390
+#, c-format
+msgid ""
+"Some object(s) in file %s looks like saved in inches.\n"
+"Should I consider them as a saved in inches and convert them?"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:2392
+msgid "The object appears to be saved in inches"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:2400
+msgid ""
+"This file contains several objects positioned at multiple heights.\n"
+"Instead of considering them as multiple objects, should I consider\n"
+"this file as a single object having multiple parts?"
+msgstr ""
+"Этот файл Ñодержит неÑколько объектов, раÑположенных на разных выÑотах.\n"
+"ВмеÑто того, чтобы раÑÑматривать их как неÑколько объектов, Ñледует ли\n"
+"раÑÑматривать Ñтот файл как один объект, ÑоÑтоÑщий из неÑкольких чаÑтей?"
+
+#: src/slic3r/GUI/Plater.cpp:2403 src/slic3r/GUI/Plater.cpp:2456
+msgid "Multi-part object detected"
+msgstr "Обнаружен объект, ÑоÑтоÑщий из неÑкольких чаÑтей"
+
+#: src/slic3r/GUI/Plater.cpp:2410
+msgid ""
+"This file cannot be loaded in a simple mode. Do you want to switch to an "
+"advanced mode?"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:2411
+msgid "Detected advanced data"
+msgstr "Обнаружены раÑширенные данные"
+
+#: src/slic3r/GUI/Plater.cpp:2433
+#, c-format
+msgid ""
+"You can't to add the object(s) from %s because of one or some of them "
+"is(are) multi-part"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:2453
+msgid ""
+"Multiple objects were loaded for a multi-material printer.\n"
+"Instead of considering them as multiple objects, should I consider\n"
+"these files to represent a single object having multiple parts?"
+msgstr ""
+"Ð”Ð»Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ð¼Ð°Ñ‚ÐµÑ€Ð¸Ð°Ð»ÑŒÐ½Ð¾Ð³Ð¾ принтера было загружено неÑколько объектов. \n"
+"ВмеÑто того, чтобы раÑÑматривать их как неÑколько моделей, Ñледует ли "
+"раÑÑматривать их как одну модель,\n"
+"ÑоÑтоÑщую из неÑколько чаÑтей?"
+
+#: src/slic3r/GUI/Plater.cpp:2469
+msgid "Loaded"
+msgstr "Загружено"
+
+#: src/slic3r/GUI/Plater.cpp:2571
+msgid ""
+"Your object appears to be too large, so it was automatically scaled down to "
+"fit your print bed."
+msgstr ""
+"Ваш объект Ñлишком большой, поÑтому он был автоматичеÑки уменьшен до размера "
+"платформы печати."
+
+#: src/slic3r/GUI/Plater.cpp:2572
+msgid "Object too large?"
+msgstr "Модель Ñлишком большаÑ?"
+
+#: src/slic3r/GUI/Plater.cpp:2634
+msgid "Export STL file:"
+msgstr "ЭкÑпорт STL-файла:"
+
+#: src/slic3r/GUI/Plater.cpp:2641
+msgid "Export AMF file:"
+msgstr "ЭкÑпорт AMF-файла:"
+
+#: src/slic3r/GUI/Plater.cpp:2647
+msgid "Save file as:"
+msgstr "Сохранить файл как:"
+
+#: src/slic3r/GUI/Plater.cpp:2653
+msgid "Export OBJ file:"
+msgstr "ЭкÑпорт OBJ-файла:"
+
+#: src/slic3r/GUI/Plater.cpp:2749
+msgid "Delete Object"
+msgstr "Удалить объект"
+
+#: src/slic3r/GUI/Plater.cpp:2760
+msgid "Reset Project"
+msgstr "СброÑить проект"
+
+#: src/slic3r/GUI/Plater.cpp:2832
+msgid ""
+"The selected object can't be split because it contains more than one volume/"
+"material."
+msgstr ""
+"Выбранный объект не может быть разделен, так как он Ñодержит более одного "
+"объёма/материала."
+
+#: src/slic3r/GUI/Plater.cpp:2843
+msgid "Split to Objects"
+msgstr "Разделить на объекты"
+
+#: src/slic3r/GUI/Plater.cpp:2968 src/slic3r/GUI/Plater.cpp:3651
+msgid "Invalid data"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:2978
+msgid "Ready to slice"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:3016 src/slic3r/GUI/PrintHostDialogs.cpp:260
+msgid "Cancelling"
+msgstr "Отмена"
+
+#: src/slic3r/GUI/Plater.cpp:3035
+msgid "Another export job is currently running."
+msgstr "Уже идёт другой процеÑÑ ÑкÑпорта."
+
+#: src/slic3r/GUI/Plater.cpp:3152
+msgid "Please select the file to reload"
+msgstr "ПожалуйÑта, выберите файл Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸"
+
+#: src/slic3r/GUI/Plater.cpp:3187
+msgid "It is not allowed to change the file to reload"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:3187
+msgid "Do you want to retry"
+msgstr "Хотите продолжить"
+
+#: src/slic3r/GUI/Plater.cpp:3205
+msgid "Reload from:"
+msgstr "Перезагрузить Ñ:"
+
+#: src/slic3r/GUI/Plater.cpp:3296
+msgid "Unable to reload:"
+msgstr "Ðе удаётÑÑ Ð¿ÐµÑ€ÐµÐ·Ð°Ð³Ñ€ÑƒÐ·Ð¸Ñ‚ÑŒ:"
+
+#: src/slic3r/GUI/Plater.cpp:3301
+msgid "Error during reload"
+msgstr "Ошибка при перезагрузке"
+
+#: src/slic3r/GUI/Plater.cpp:3320
+msgid "Reload all from disk"
+msgstr "Перезагрузить вÑÑ‘ Ñ Ð´Ð¸Ñка"
+
+#: src/slic3r/GUI/Plater.cpp:3341
+msgid "Fix Throught NetFabb"
+msgstr "Починить Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Netfabb"
+
+#: src/slic3r/GUI/Plater.cpp:3609
+msgid "There are active warnings concerning sliced models:"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:3620
+msgid "generated warnings"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:3659 src/slic3r/GUI/PrintHostDialogs.cpp:261
+msgid "Cancelled"
+msgstr "Отменено"
+
+#: src/slic3r/GUI/Plater.cpp:3921 src/slic3r/GUI/Plater.cpp:3945
+msgid "Remove the selected object"
+msgstr "Удалить выбранный объект"
+
+#: src/slic3r/GUI/Plater.cpp:3930
+msgid "Add one more instance of the selected object"
+msgstr "Добавить ещё один ÑкземплÑÑ€ выбранного объекта"
+
+#: src/slic3r/GUI/Plater.cpp:3932
+msgid "Remove one instance of the selected object"
+msgstr "Удалить один ÑкземплÑÑ€ выбранного объекта"
+
+#: src/slic3r/GUI/Plater.cpp:3934
+msgid "Set number of instances"
+msgstr "Задать количеÑтво ÑкземплÑров"
+
+#: src/slic3r/GUI/Plater.cpp:3934
+msgid "Change the number of instances of the selected object"
+msgstr "Изменить количеÑтво ÑкземплÑров выбранного объекта"
+
+#: src/slic3r/GUI/Plater.cpp:3936
+msgid "Fill bed with instances"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:3936
+msgid "Fill the remaining area of bed with instances of the selected object"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:3955
+msgid "Reload the selected object from disk"
+msgstr "Перезагрузить выбранный объект Ñ Ð´Ð¸Ñка"
+
+#: src/slic3r/GUI/Plater.cpp:3958
+msgid "Export the selected object as STL file"
+msgstr "ЭкÑпортировать выбранный объект в STL файл"
+
+#: src/slic3r/GUI/Plater.cpp:3989
+msgid "Along X axis"
+msgstr "Вдоль оÑи X"
+
+#: src/slic3r/GUI/Plater.cpp:3989
+msgid "Mirror the selected object along the X axis"
+msgstr "Отразить выбранный объект вдоль оÑи X"
+
+#: src/slic3r/GUI/Plater.cpp:3991
+msgid "Along Y axis"
+msgstr "Вдоль оÑи Y"
+
+#: src/slic3r/GUI/Plater.cpp:3991
+msgid "Mirror the selected object along the Y axis"
+msgstr "Отразить выбранный объект вдоль оÑи Y"
+
+#: src/slic3r/GUI/Plater.cpp:3993
+msgid "Along Z axis"
+msgstr "Вдоль оÑи Z"
+
+#: src/slic3r/GUI/Plater.cpp:3993
+msgid "Mirror the selected object along the Z axis"
+msgstr "Отразить выбранный объект вдоль оÑи Z"
+
+#: src/slic3r/GUI/Plater.cpp:3996
+msgid "Mirror"
+msgstr "Отразить"
+
+#: src/slic3r/GUI/Plater.cpp:3996
+msgid "Mirror the selected object"
+msgstr "Отразить выбранный объект"
+
+#: src/slic3r/GUI/Plater.cpp:4008
+msgid "To objects"
+msgstr "В объекты"
+
+#: src/slic3r/GUI/Plater.cpp:4008 src/slic3r/GUI/Plater.cpp:4028
+msgid "Split the selected object into individual objects"
+msgstr "Разделить выбранный объект на отдельные объекты"
+
+#: src/slic3r/GUI/Plater.cpp:4010
+msgid "To parts"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:4010 src/slic3r/GUI/Plater.cpp:4046
+msgid "Split the selected object into individual sub-parts"
+msgstr "Разделить выбранный объект на отдельные чаÑти"
+
+#: src/slic3r/GUI/Plater.cpp:4013 src/slic3r/GUI/Plater.cpp:4028
+#: src/slic3r/GUI/Plater.cpp:4046 src/libslic3r/PrintConfig.cpp:3724
+msgid "Split"
+msgstr "Разделить на чаÑти"
+
+#: src/slic3r/GUI/Plater.cpp:4013
+msgid "Split the selected object"
+msgstr "Разделить выбранный объект"
+
+#: src/slic3r/GUI/Plater.cpp:4035
+msgid "Optimize orientation"
+msgstr "Оптимизировать ориентацию"
+
+#: src/slic3r/GUI/Plater.cpp:4036
+msgid "Optimize the rotation of the object for better print results."
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:4116
+msgid "3D editor view"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:4488
+msgid ""
+"%1% printer was active at the time the target Undo / Redo snapshot was "
+"taken. Switching to %1% printer requires reloading of %1% presets."
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:4692
+msgid "Load Project"
+msgstr "Загрузить проект"
+
+#: src/slic3r/GUI/Plater.cpp:4724
+msgid "Import Objects"
+msgstr "Импортировать объекты"
+
+#: src/slic3r/GUI/Plater.cpp:4793
+msgid "The selected file"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:4793
+msgid "does not contain valid gcode."
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:4794
+msgid "Error while loading .gcode file"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:5025
+msgid "All objects will be removed, continue?"
+msgstr "Будут удалены вÑе объекты, продолжить?"
+
+#: src/slic3r/GUI/Plater.cpp:5033
+msgid "Delete Selected Objects"
+msgstr "Удалить выделенные объекты"
+
+#: src/slic3r/GUI/Plater.cpp:5041
+msgid "Increase Instances"
+msgstr "Добавить ÑкземплÑÑ€"
+
+#: src/slic3r/GUI/Plater.cpp:5075
+msgid "Decrease Instances"
+msgstr "Удалить ÑкземплÑÑ€"
+
+#: src/slic3r/GUI/Plater.cpp:5106
+msgid "Enter the number of copies:"
+msgstr "Введите количеÑтво копий:"
+
+#: src/slic3r/GUI/Plater.cpp:5107
+msgid "Copies of the selected object"
+msgstr "Копии выделенного объекта"
+
+#: src/slic3r/GUI/Plater.cpp:5111
+#, c-format
+msgid "Set numbers of copies to %d"
+msgstr "Задать количеÑтво копий равным %d"
+
+#: src/slic3r/GUI/Plater.cpp:5177
+msgid "Cut by Plane"
+msgstr ""
+
+#: src/slic3r/GUI/Plater.cpp:5231
+msgid "Save G-code file as:"
+msgstr "Сохранить файл G-кода как:"
+
+#: src/slic3r/GUI/Plater.cpp:5231
+msgid "Save SL1 file as:"
+msgstr "Сохранить файл SL1 как:"
+
+#: src/slic3r/GUI/Plater.cpp:5378
+#, c-format
+msgid "STL file exported to %s"
+msgstr "STL-файл ÑкÑпортирован в %s"
+
+#: src/slic3r/GUI/Plater.cpp:5395
+#, c-format
+msgid "AMF file exported to %s"
+msgstr "AMF-файл ÑкÑпортирован в %s"
+
+#: src/slic3r/GUI/Plater.cpp:5398
+#, c-format
+msgid "Error exporting AMF file %s"
+msgstr "Ошибка ÑкÑÐ¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ AMF-файла %s"
+
+#: src/slic3r/GUI/Plater.cpp:5427
+#, c-format
+msgid "3MF file exported to %s"
+msgstr "3MF-файл ÑкÑпортирован в %s"
+
+#: src/slic3r/GUI/Plater.cpp:5432
+#, c-format
+msgid "Error exporting 3MF file %s"
+msgstr "Ошибка ÑкÑÐ¿Ð¾Ñ€Ñ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ 3MF-файла %s"
+
+#: src/slic3r/GUI/Plater.cpp:5961
+msgid "Export"
+msgstr "ЭкÑпорт"
+
+#: src/slic3r/GUI/Plater.cpp:6056
+msgid "Paste From Clipboard"
+msgstr "Ð’Ñтавить из буфера обмена"
+
+#: src/slic3r/GUI/Preferences.cpp:24 src/slic3r/GUI/Tab.cpp:2098
+#: src/slic3r/GUI/Tab.cpp:2280 src/slic3r/GUI/Tab.cpp:2388
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1072
+msgid "General"
+msgstr "Общие"
+
+#: src/slic3r/GUI/Preferences.cpp:48
+msgid "Remember output directory"
+msgstr "Запоминать каталог результата"
+
+#: src/slic3r/GUI/Preferences.cpp:50
+msgid ""
+"If this is enabled, Slic3r will prompt the last output directory instead of "
+"the one containing the input files."
+msgstr ""
+"ЕÑли включено, при Ñохранении G-кода Slic3r откроет поÑледний иÑпользованный "
+"выходной каталог вмеÑто того, где лежит иÑходный файл."
+
+#: src/slic3r/GUI/Preferences.cpp:56
+msgid "Auto-center parts"
+msgstr "ÐвтоматичеÑкое центрирование чаÑтей"
+
+#: src/slic3r/GUI/Preferences.cpp:58
+msgid ""
+"If this is enabled, Slic3r will auto-center objects around the print bed "
+"center."
+msgstr ""
+"ЕÑли включено, Slic3r будет автоматичеÑки центрировать объекты вокруг центра "
+"платформы печати."
+
+#: src/slic3r/GUI/Preferences.cpp:64
+msgid "Background processing"
+msgstr "Ð¤Ð¾Ð½Ð¾Ð²Ð°Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ°"
+
+#: src/slic3r/GUI/Preferences.cpp:66
+msgid ""
+"If this is enabled, Slic3r will pre-process objects as soon as they're "
+"loaded in order to save time when exporting G-code."
+msgstr ""
+"ЕÑли включено, Slic3r будет предварительно проÑчитывать объекты при "
+"загрузке, чтобы ÑÑкономить Ð²Ñ€ÐµÐ¼Ñ Ð¿Ñ€Ð¸ ÑкÑпорте G-кода."
+
+#: src/slic3r/GUI/Preferences.cpp:75
+msgid ""
+"If enabled, PrusaSlicer will check for the new versions of itself online. "
+"When a new version becomes available a notification is displayed at the next "
+"application startup (never during program usage). This is only a "
+"notification mechanisms, no automatic installation is done."
+msgstr ""
+"ЕÑли включено, то PrusaSlicer проверÑет наличие Ñвоих новых верÑий в Ñети. "
+"ЕÑли доÑтупна Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑиÑ, то при Ñледующем запуÑке отображаетÑÑ "
+"уведомление (не отображаетÑÑ Ð²Ð¾ Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ программы). ÐвтоматичеÑÐºÐ°Ñ "
+"уÑтановка не производитÑÑ. Ð’Ñ‹ увидите только уведомление."
+
+#: src/slic3r/GUI/Preferences.cpp:81
+msgid "Export sources full pathnames to 3mf and amf"
+msgstr "ЭкÑпорт полных имён иÑточников в 3mf и amf"
+
+#: src/slic3r/GUI/Preferences.cpp:83
+msgid ""
+"If enabled, allows the Reload from disk command to automatically find and "
+"load the files when invoked."
+msgstr ""
+"ЕÑли включено, позволÑет команде перезагрузки Ñ Ð´Ð¸Ñка автоматичеÑки находить "
+"и загружать файлы при вызове."
+
+#: src/slic3r/GUI/Preferences.cpp:93
+msgid "If enabled, sets PrusaSlicer as default application to open .3mf files."
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:100
+msgid "If enabled, sets PrusaSlicer as default application to open .stl files."
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:110
+msgid ""
+"If enabled, Slic3r downloads updates of built-in system presets in the "
+"background. These updates are downloaded into a separate temporary location. "
+"When a new preset version becomes available it is offered at application "
+"startup."
+msgstr ""
+"ЕÑли включено, то Slic3r будет загружать Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ñтроенных ÑиÑтемных "
+"профилей в фоновом режиме. Эти Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ñ€ÑƒÐ¶Ð°ÑŽÑ‚ÑÑ Ð² отдельную временную "
+"папку. Когда новые профили ÑтановÑÑ‚ÑÑ Ð´Ð¾Ñтупны, они предлагаютÑÑ Ð¿Ñ€Ð¸ запуÑке "
+"приложениÑ."
+
+#: src/slic3r/GUI/Preferences.cpp:115
+msgid "Suppress \" - default - \" presets"
+msgstr "Подавить профили по умолчанию"
+
+#: src/slic3r/GUI/Preferences.cpp:117
+msgid ""
+"Suppress \" - default - \" presets in the Print / Filament / Printer "
+"selections once there are any other valid presets available."
+msgstr ""
+"ПодавлÑÑ‚ÑŒ профили по умолчанию во вкладках ÐаÑтройки печати/ÐаÑтройки прутка/"
+"ÐаÑтройки принтера, при наличии других допуÑтимых профилей."
+
+#: src/slic3r/GUI/Preferences.cpp:123
+msgid "Show incompatible print and filament presets"
+msgstr "Показывать неÑовмеÑтимые профили печати и прутка"
+
+#: src/slic3r/GUI/Preferences.cpp:125
+msgid ""
+"When checked, the print and filament presets are shown in the preset editor "
+"even if they are marked as incompatible with the active printer"
+msgstr ""
+"ЕÑли отмечено, то профили печати и прутка отображаютÑÑ Ð² редакторе профилей, "
+"даже еÑли они помечены как неÑовмеÑтимые Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼ принтером"
+
+#: src/slic3r/GUI/Preferences.cpp:131
+msgid "Show drop project dialog"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:133
+msgid ""
+"When checked, whenever dragging and dropping a project file on the "
+"application, shows a dialog asking to select the action to take on the file "
+"to load."
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:138 src/libslic3r/PrintConfig.cpp:3751
+msgid "Single instance mode"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:141
+msgid ""
+"On OSX there is always only one instance of app running by default. However "
+"it is allowed to run multiple instances of same app from the command line. "
+"In such case this settings will allow only one instance."
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:143
+msgid ""
+"If this is enabled, when starting PrusaSlicer and another instance of the "
+"same PrusaSlicer is already running, that instance will be reactivated "
+"instead."
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:160
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:665
+msgid "Ask for unsaved changes when closing application"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:162
+msgid "When closing the application, always ask for unsaved changes"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:167
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:666
+msgid "Ask for unsaved changes when selecting new preset"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:169
+msgid "Always ask for unsaved changes when selecting new preset"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:177
+msgid "Associate .gcode files to PrusaSlicer G-code Viewer"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:179
+msgid ""
+"If enabled, sets PrusaSlicer G-code Viewer as default application to open ."
+"gcode files."
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:188
+msgid "Use Retina resolution for the 3D scene"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:190
+msgid ""
+"If enabled, the 3D scene will be rendered in Retina resolution. If you are "
+"experiencing 3D performance problems, disabling this option may help."
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:198 src/slic3r/GUI/Preferences.cpp:200
+msgid "Show splash screen"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:207
+msgid "Enable support for legacy 3DConnexion devices"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:209
+msgid ""
+"If enabled, the legacy 3DConnexion devices settings dialog is available by "
+"pressing CTRL+M"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:218
+msgid "Camera"
+msgstr "Камера"
+
+#: src/slic3r/GUI/Preferences.cpp:224
+msgid "Use perspective camera"
+msgstr "ИÑпользовать перÑпективную камера"
+
+#: src/slic3r/GUI/Preferences.cpp:226
+msgid ""
+"If enabled, use perspective camera. If not enabled, use orthographic camera."
+msgstr ""
+"ЕÑли включено, то иÑпользуетÑÑ Ð¿ÐµÑ€ÑÐ¿ÐµÐºÑ‚Ð¸Ð²Ð½Ð°Ñ ÐºÐ°Ð¼ÐµÑ€Ð°. ЕÑли нет, то "
+"Ð¾Ñ€Ñ‚Ð¾Ð³Ð¾Ð½Ð°Ð»ÑŒÐ½Ð°Ñ ÐºÐ°Ð¼ÐµÑ€Ð°."
+
+#: src/slic3r/GUI/Preferences.cpp:231
+msgid "Use free camera"
+msgstr "ИÑпользовать Ñвободную камеру"
+
+#: src/slic3r/GUI/Preferences.cpp:233
+msgid "If enabled, use free camera. If not enabled, use constrained camera."
+msgstr ""
+"ЕÑли включено, то иÑпользуетÑÑ ÑÐ²Ð¾Ð±Ð¾Ð´Ð½Ð°Ñ ÐºÐ°Ð¼ÐµÑ€Ð°. ЕÑли нет, то Ð·Ð°ÐºÑ€ÐµÐ¿Ð»Ñ‘Ð½Ð½Ð°Ñ "
+"камера."
+
+#: src/slic3r/GUI/Preferences.cpp:238
+msgid "Reverse direction of zoom with mouse wheel"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:240
+msgid "If enabled, reverses the direction of zoom with mouse wheel"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:247
+msgid "GUI"
+msgstr "ГрафичеÑкий интерфейÑ"
+
+#: src/slic3r/GUI/Preferences.cpp:262
+msgid "Show sidebar collapse/expand button"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:264
+msgid ""
+"If enabled, the button for the collapse sidebar will be appeared in top "
+"right corner of the 3D Scene"
+msgstr ""
+"ЕÑли включено, то в верхнем правом углу 3D-Ñцены поÑвитÑÑ ÐºÐ½Ð¾Ð¿ÐºÐ° ÑÐºÑ€Ñ‹Ñ‚Ð¸Ñ "
+"боковой панели"
+
+#: src/slic3r/GUI/Preferences.cpp:269
+msgid "Use custom size for toolbar icons"
+msgstr "ИÑпользовать задаваемый размер значков панели инÑтрументов"
+
+#: src/slic3r/GUI/Preferences.cpp:271
+msgid "If enabled, you can change size of toolbar icons manually."
+msgstr "ЕÑли включено, то вы можете задать размер значков панели инÑтрументов."
+
+#: src/slic3r/GUI/Preferences.cpp:276
+msgid "Suppress to open hyperlink in browser"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:278
+msgid ""
+"If enabled, the descriptions of configuration parameters in settings tabs "
+"wouldn't work as hyperlinks. If disabled, the descriptions of configuration "
+"parameters in settings tabs will work as hyperlinks."
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:285
+msgid "Sequential slider applied only to top layer"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:287
+msgid ""
+"If enabled, changes made using the sequential slider, in preview, apply only "
+"to gcode top layer. If disabled, changes made using the sequential slider, "
+"in preview, apply to the whole gcode."
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:304
+msgid "Render"
+msgstr "ОтриÑовка"
+
+#: src/slic3r/GUI/Preferences.cpp:310
+msgid "Use environment map"
+msgstr "ИÑпользовать карту окружениÑ"
+
+#: src/slic3r/GUI/Preferences.cpp:312
+msgid "If enabled, renders object using the environment map."
+msgstr ""
+"ЕÑли включено, то объекты отриÑовываютÑÑ Ñ Ð¸Ñпользованием карты окружениÑ."
+
+#: src/slic3r/GUI/Preferences.cpp:345
+#, c-format
+msgid "You need to restart %s to make the changes effective."
+msgstr "Ðеобходимо перезапуÑтить %s, чтобы Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ñтупили в Ñилу."
+
+#: src/slic3r/GUI/Preferences.cpp:420
+msgid "Icon size in a respect to the default size"
+msgstr "Размер значка по отношению к размеру по умолчанию"
+
+#: src/slic3r/GUI/Preferences.cpp:435
+msgid "Select toolbar icon size in respect to the default one."
+msgstr "Выберите размер значка по отношению к размеру по умолчанию."
+
+#: src/slic3r/GUI/Preferences.cpp:466
+msgid "Old regular layout with the tab bar"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:467
+msgid "New layout, access via settings button in the top menu"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:468
+msgid "Settings in non-modal window"
+msgstr ""
+
+#: src/slic3r/GUI/Preferences.cpp:477
+msgid "Layout Options"
+msgstr ""
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:197
+#: src/slic3r/GUI/PresetComboBoxes.cpp:235
+#: src/slic3r/GUI/PresetComboBoxes.cpp:761
+#: src/slic3r/GUI/PresetComboBoxes.cpp:811
+#: src/slic3r/GUI/PresetComboBoxes.cpp:925
+#: src/slic3r/GUI/PresetComboBoxes.cpp:969
+msgid "System presets"
+msgstr "СиÑтемные профили"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:239
+#: src/slic3r/GUI/PresetComboBoxes.cpp:815
+#: src/slic3r/GUI/PresetComboBoxes.cpp:973
+msgid "User presets"
+msgstr "ПользовательÑкие профили"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:250
+msgid "Incompatible presets"
+msgstr ""
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:285
+msgid "Are you sure you want to delete \"%1%\" printer?"
+msgstr ""
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:287
+msgid "Delete Physical Printer"
+msgstr ""
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:624
+msgid "Click to edit preset"
+msgstr "Щёлкните Ð´Ð»Ñ Ñ€ÐµÐ´Ð°ÐºÑ‚Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:680
+#: src/slic3r/GUI/PresetComboBoxes.cpp:710
+msgid "Add/Remove presets"
+msgstr ""
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:685
+#: src/slic3r/GUI/PresetComboBoxes.cpp:715 src/slic3r/GUI/Tab.cpp:2985
+msgid "Add physical printer"
+msgstr ""
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:699
+msgid "Edit preset"
+msgstr ""
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:703 src/slic3r/GUI/Tab.cpp:2985
+msgid "Edit physical printer"
+msgstr ""
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:706
+msgid "Delete physical printer"
+msgstr ""
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:826
+#: src/slic3r/GUI/PresetComboBoxes.cpp:987
+msgid "Physical printers"
+msgstr ""
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:850
+msgid "Add/Remove filaments"
+msgstr "Добавление/Удаление прутков"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:852
+msgid "Add/Remove materials"
+msgstr "Добавление/Удаление материалов"
+
+#: src/slic3r/GUI/PresetComboBoxes.cpp:854
+#: src/slic3r/GUI/PresetComboBoxes.cpp:1011
+msgid "Add/Remove printers"
+msgstr "Добавление/Удаление принтеров"
+
+#: src/slic3r/GUI/PresetHints.cpp:28
+msgid ""
+"If estimated layer time is below ~%1%s, fan will run at %2%%% and print "
+"speed will be reduced so that no less than %3%s are spent on that layer "
+"(however, speed will never be reduced below %4%mm/s)."
+msgstr ""
+"ЕÑли раÑчётное Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸ ÑÐ»Ð¾Ñ Ð¼ÐµÐ½ÑŒÑˆÐµ ~%1%Ñ, вентилÑтор будет работать на "
+"%2%%%, а ÑкороÑÑ‚ÑŒ печати будет уменьшена так, что на Ñтот Ñлой будет "
+"затрачено не менее %3%Ñ (однако, ÑкороÑÑ‚ÑŒ никогда не будет уменьшена ниже "
+"%4%мм/Ñ)."
+
+#: src/slic3r/GUI/PresetHints.cpp:35
+msgid ""
+"If estimated layer time is greater, but still below ~%1%s, fan will run at a "
+"proportionally decreasing speed between %2%%% and %3%%%."
+msgstr ""
+"ЕÑли раÑчётное Ð²Ñ€ÐµÐ¼Ñ ÑÐ»Ð¾Ñ Ð±Ð¾Ð»ÑŒÑˆÐ¾Ðµ, но вÑÑ‘ ещё ниже ~%1%Ñ, вентилÑтор будет "
+"работать Ñ Ð¿Ð»Ð°Ð²Ð½Ð¾ падающей ÑкороÑтью между %2%%% и %3%%%."
+
+#: src/slic3r/GUI/PresetHints.cpp:39
+msgid "During the other layers, fan"
+msgstr "Во Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸ других Ñлоёв, вентилÑтор"
+
+#: src/slic3r/GUI/PresetHints.cpp:41
+msgid "Fan"
+msgstr "ВентилÑтор"
+
+#: src/slic3r/GUI/PresetHints.cpp:47
+msgid "will always run at %1%%%"
+msgstr "вÑегда будет работать на %1%%%"
+
+#: src/slic3r/GUI/PresetHints.cpp:50
+msgid "except for the first %1% layers."
+msgstr ", за иÑключением первых %1% Ñлоёв."
+
+#: src/slic3r/GUI/PresetHints.cpp:52
+msgid "except for the first layer."
+msgstr ", за иÑключением первого ÑлоÑ."
+
+#: src/slic3r/GUI/PresetHints.cpp:54
+msgid "will be turned off."
+msgstr "отключён."
+
+#: src/slic3r/GUI/PresetHints.cpp:155
+msgid "external perimeters"
+msgstr "внешних периметров"
+
+#: src/slic3r/GUI/PresetHints.cpp:164
+msgid "perimeters"
+msgstr "периметры"
+
+#: src/slic3r/GUI/PresetHints.cpp:173
+msgid "infill"
+msgstr "заполнение"
+
+#: src/slic3r/GUI/PresetHints.cpp:183
+msgid "solid infill"
+msgstr "Ñплошные Ñлои заполнениÑ"
+
+#: src/slic3r/GUI/PresetHints.cpp:191
+msgid "top solid infill"
+msgstr "верхние Ñплошные Ñлои заполнениÑ"
+
+#: src/slic3r/GUI/PresetHints.cpp:202
+msgid "support"
+msgstr "поддержки"
+
+#: src/slic3r/GUI/PresetHints.cpp:212
+msgid "support interface"
+msgstr "ÑвÑÐ·ÑƒÑŽÑ‰Ð°Ñ Ñлой поддержки"
+
+#: src/slic3r/GUI/PresetHints.cpp:218
+msgid "First layer volumetric"
+msgstr "Объёмный раÑход первого ÑлоÑ"
+
+#: src/slic3r/GUI/PresetHints.cpp:218
+msgid "Bridging volumetric"
+msgstr "Объёмный раÑход моÑтов"
+
+#: src/slic3r/GUI/PresetHints.cpp:218
+msgid "Volumetric"
+msgstr "Объёмный раÑход"
+
+#: src/slic3r/GUI/PresetHints.cpp:219
+msgid "flow rate is maximized"
+msgstr "ÑкороÑÑ‚ÑŒ потока макÑимальна"
+
+#: src/slic3r/GUI/PresetHints.cpp:222
+msgid "by the print profile maximum"
+msgstr "по макÑимальному значению Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»ÑŽ печати"
+
+#: src/slic3r/GUI/PresetHints.cpp:223
+msgid "when printing"
+msgstr "при печати"
+
+#: src/slic3r/GUI/PresetHints.cpp:224
+msgid "with a volumetric rate"
+msgstr "Ñ Ð¾Ð±ÑŠÑ‘Ð¼Ð½Ð¾Ð¹ ÑкороÑтью"
+
+#: src/slic3r/GUI/PresetHints.cpp:228
+#, c-format
+msgid "%3.2f mm³/s at filament speed %3.2f mm/s."
+msgstr "%3.2f мм³/Ñ Ð¿Ñ€Ð¸ ÑкороÑти плаÑтиковой нити %3.2f мм/Ñ."
+
+#: src/slic3r/GUI/PresetHints.cpp:246
+msgid ""
+"Recommended object thin wall thickness: Not available due to invalid layer "
+"height."
+msgstr ""
+"Ð ÐµÐºÐ¾Ð¼ÐµÐ½Ð´ÑƒÐµÐ¼Ð°Ñ Ñ‚Ð¾Ð»Ñ‰Ð¸Ð½Ð° тонких Ñтенок объекта: недоÑтупно из-за недопуÑтимой "
+"выÑоты ÑлоÑ."
+
+#: src/slic3r/GUI/PresetHints.cpp:262
+#, c-format
+msgid "Recommended object thin wall thickness for layer height %.2f and"
+msgstr ""
+"Ð ÐµÐºÐ¾Ð¼ÐµÐ½Ð´ÑƒÐµÐ¼Ð°Ñ Ñ‚Ð¾Ð»Ñ‰Ð¸Ð½Ð° тонких Ñтенок объекта Ð´Ð»Ñ ÑÐ»Ð¾Ñ Ñ Ð²Ñ‹Ñотой %.2f мм и"
+
+#: src/slic3r/GUI/PresetHints.cpp:269
+#, c-format
+msgid "%d lines: %.2f mm"
+msgstr "%d линий: %.2f мм"
+
+#: src/slic3r/GUI/PresetHints.cpp:273
+msgid ""
+"Recommended object thin wall thickness: Not available due to excessively "
+"small extrusion width."
+msgstr ""
+"Ð ÐµÐºÐ¾Ð¼ÐµÐ½Ð´ÑƒÐµÐ¼Ð°Ñ Ñ‚Ð¾Ð»Ñ‰Ð¸Ð½Ð° тонких Ñтенок объекта: недоÑтупно из-за недопуÑтимо "
+"малой ширины ÑкÑтрузии."
+
+#: src/slic3r/GUI/PresetHints.cpp:302
+msgid ""
+"Top / bottom shell thickness hint: Not available due to invalid layer height."
+msgstr ""
+"Ð ÐµÐºÐ¾Ð¼ÐµÐ½Ð´ÑƒÐµÐ¼Ð°Ñ Ñ‚Ð¾Ð»Ñ‰Ð¸Ð½Ð° верхней/нижней оболочки: недоÑтупно из-за недопуÑтимой "
+"выÑоты ÑлоÑ."
+
+#: src/slic3r/GUI/PresetHints.cpp:315
+msgid "Top shell is %1% mm thick for layer height %2% mm."
+msgstr "Толщина верхней оболочки равна %1% мм Ð´Ð»Ñ Ð²Ñ‹Ñоты ÑÐ»Ð¾Ñ Ð² %2% мм."
+
+#: src/slic3r/GUI/PresetHints.cpp:318
+msgid "Minimum top shell thickness is %1% mm."
+msgstr "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ‚Ð¾Ð»Ñ‰Ð¸Ð½Ð° верхней оболочки равна %1% мм."
+
+#: src/slic3r/GUI/PresetHints.cpp:321
+msgid "Top is open."
+msgstr "Ðет верхней оболочки."
+
+#: src/slic3r/GUI/PresetHints.cpp:334
+msgid "Bottom shell is %1% mm thick for layer height %2% mm."
+msgstr "Толщина нижней оболочки равна %1% мм Ð´Ð»Ñ Ð²Ñ‹Ñоты ÑÐ»Ð¾Ñ Ð² %2% мм."
+
+#: src/slic3r/GUI/PresetHints.cpp:337
+msgid "Minimum bottom shell thickness is %1% mm."
+msgstr "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ‚Ð¾Ð»Ñ‰Ð¸Ð½Ð° нижней оболочки равна %1% мм."
+
+#: src/slic3r/GUI/PresetHints.cpp:340
+msgid "Bottom is open."
+msgstr "Ðет нижней оболочки."
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:34
+msgid "Send G-Code to printer host"
+msgstr "ПоÑлать G-код на узел печати"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:34
+msgid "Upload to Printer Host with the following filename:"
+msgstr "Загрузить на узел печати Ñо Ñледующим именем файла:"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:36
+msgid "Start printing after upload"
+msgstr "Ðачать печать поÑле загрузки"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:44
+msgid "Use forward slashes ( / ) as a directory separator if needed."
+msgstr ""
+"При необходимоÑти иÑпользуйте коÑую черту ( / ) в качеÑтве Ñ€Ð°Ð·Ð´ÐµÐ»Ð¸Ñ‚ÐµÐ»Ñ "
+"каталогов."
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:57
+msgid "Group"
+msgstr ""
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:174
+msgid "ID"
+msgstr "ID"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:175
+msgid "Progress"
+msgstr "Ход выполнениÑ"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:176
+msgid "Status"
+msgstr "СоÑтоÑние"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:177
+msgid "Host"
+msgstr "Узел"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:178
+msgid "Filename"
+msgstr "Файл"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:179
+msgid "Error Message"
+msgstr "Сообщение об ошибке"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:182
+msgid "Cancel selected"
+msgstr "Отменить выбранное"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:184
+msgid "Show error message"
+msgstr "Показать Ñообщение об ошибке"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:226
+#: src/slic3r/GUI/PrintHostDialogs.cpp:257
+msgid "Enqueued"
+msgstr "В очереди"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:258
+msgid "Uploading"
+msgstr "ЗагружаетÑÑ"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:262
+msgid "Completed"
+msgstr "Завершено"
+
+#: src/slic3r/GUI/PrintHostDialogs.cpp:300
+msgid "Error uploading to print host:"
+msgstr "Ошибка при загрузке на узел печати:"
+
+#: src/slic3r/GUI/RammingChart.cpp:23
+msgid "NO RAMMING AT ALL"
+msgstr "ÐЕ ДОПУСКÐТЬ РЭММИÐГ"
+
+#: src/slic3r/GUI/RammingChart.cpp:76 src/slic3r/GUI/WipeTowerDialog.cpp:83
+#: src/libslic3r/PrintConfig.cpp:689 src/libslic3r/PrintConfig.cpp:733
+#: src/libslic3r/PrintConfig.cpp:748 src/libslic3r/PrintConfig.cpp:2604
+#: src/libslic3r/PrintConfig.cpp:2613 src/libslic3r/PrintConfig.cpp:2723
+#: src/libslic3r/PrintConfig.cpp:2731 src/libslic3r/PrintConfig.cpp:2739
+#: src/libslic3r/PrintConfig.cpp:2746 src/libslic3r/PrintConfig.cpp:2754
+#: src/libslic3r/PrintConfig.cpp:2762
+msgid "s"
+msgstr "Ñ"
+
+#: src/slic3r/GUI/RammingChart.cpp:81
+msgid "Volumetric speed"
+msgstr "ÐžÐ±ÑŠÑ‘Ð¼Ð½Ð°Ñ ÑкороÑÑ‚ÑŒ подачи"
+
+#: src/slic3r/GUI/RammingChart.cpp:81 src/libslic3r/PrintConfig.cpp:646
+#: src/libslic3r/PrintConfig.cpp:1430
+msgid "mm³/s"
+msgstr "мм³/Ñ"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:57
+#, c-format
+msgid "Save %s as:"
+msgstr "Сохранить %s как:"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:110
+msgid "the following suffix is not allowed:"
+msgstr "Ñледующий ÑÑƒÑ„Ñ„Ð¸ÐºÑ Ð½Ðµ допуÑкаетÑÑ:"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:116
+msgid "The supplied name is not available."
+msgstr "Введённое Ð¸Ð¼Ñ Ð½ÐµÐ´Ð¾Ñтупно."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:122
+msgid "Cannot overwrite a system profile."
+msgstr "Ðевозможно перезапиÑать ÑиÑтемный профиль."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:127
+msgid "Cannot overwrite an external profile."
+msgstr "Ðевозможно перезапиÑать внешний профиль."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:134
+msgid "Preset with name \"%1%\" already exists."
+msgstr "Профиль Ñ Ð¸Ð¼ÐµÐ½ÐµÐ¼ «%1%» уже ÑущеÑтвует."
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:136
+msgid ""
+"Preset with name \"%1%\" already exists and is imcopatible with selected "
+"printer."
+msgstr ""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:137
+msgid "Note: This preset will be replaced after saving"
+msgstr ""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:142
+msgid "The name cannot be empty."
+msgstr ""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:176
+#: src/slic3r/GUI/SavePresetDialog.cpp:182
+msgid "Save preset"
+msgstr "Сохранить профиль"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:205
+msgctxt "PresetName"
+msgid "Copy"
+msgstr "КопиÑ"
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:263
+msgid ""
+"You have selected physical printer \"%1%\" \n"
+"with related printer preset \"%2%\""
+msgstr ""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:296
+msgid "What would you like to do with \"%1%\" preset after saving?"
+msgstr ""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:299
+msgid "Change \"%1%\" to \"%2%\" for this physical printer \"%3%\""
+msgstr ""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:300
+msgid "Add \"%1%\" as a next preset for the the physical printer \"%2%\""
+msgstr ""
+
+#: src/slic3r/GUI/SavePresetDialog.cpp:301
+msgid "Just switch to \"%1%\" preset"
+msgstr ""
+
+#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2416
+msgid "Stealth"
+msgstr "Тихий"
+
+#: src/slic3r/GUI/Search.cpp:77 src/slic3r/GUI/Tab.cpp:2410
+msgid "Normal"
+msgstr "Ðормальный"
+
+#: src/slic3r/GUI/Selection.cpp:172
+msgid "Selection-Add"
+msgstr "Выбор-добавление"
+
+#: src/slic3r/GUI/Selection.cpp:213
+msgid "Selection-Remove"
+msgstr "Выбор-удаление"
+
+#: src/slic3r/GUI/Selection.cpp:245
+msgid "Selection-Add Object"
+msgstr "Выбор-добавление объекта"
+
+#: src/slic3r/GUI/Selection.cpp:264
+msgid "Selection-Remove Object"
+msgstr "Выбор-удаление объекта"
+
+#: src/slic3r/GUI/Selection.cpp:282
+msgid "Selection-Add Instance"
+msgstr "Выбор-добавление ÑкземплÑра"
+
+#: src/slic3r/GUI/Selection.cpp:301
+msgid "Selection-Remove Instance"
+msgstr "Выбор-удаление ÑкземплÑра"
+
+#: src/slic3r/GUI/Selection.cpp:402
+msgid "Selection-Add All"
+msgstr "Выбор-добавление вÑего"
+
+#: src/slic3r/GUI/Selection.cpp:428
+msgid "Selection-Remove All"
+msgstr "Выбор-удаление вÑего"
+
+#: src/slic3r/GUI/Selection.cpp:987
+msgid "Scale To Fit"
+msgstr "МаÑштабировать по размеру"
+
+#: src/slic3r/GUI/Selection.cpp:1514
+msgid "Set Printable Instance"
+msgstr ""
+
+#: src/slic3r/GUI/Selection.cpp:1514
+msgid "Set Unprintable Instance"
+msgstr ""
+
+#: src/slic3r/GUI/SysInfoDialog.cpp:82
+msgid "System Information"
+msgstr "Ð˜Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾ ÑиÑтеме"
+
+#: src/slic3r/GUI/SysInfoDialog.cpp:158
+msgid "Copy to Clipboard"
+msgstr "Копировать в буфер обмена"
+
+#: src/slic3r/GUI/Tab.cpp:112 src/libslic3r/PrintConfig.cpp:306
+msgid "Compatible printers"
+msgstr "СовмеÑтимые принтеры"
+
+#: src/slic3r/GUI/Tab.cpp:113
+msgid "Select the printers this profile is compatible with."
+msgstr "Выберите принтеры, ÑовмеÑтимые Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼ профилем."
+
+#: src/slic3r/GUI/Tab.cpp:118 src/libslic3r/PrintConfig.cpp:321
+msgid "Compatible print profiles"
+msgstr "СовмеÑтимые профили печати"
+
+#: src/slic3r/GUI/Tab.cpp:119
+msgid "Select the print profiles this profile is compatible with."
+msgstr "Выберите профили печати, ÑовмеÑтимые Ñ Ð´Ð°Ð½Ð½Ñ‹Ð¼ профилем."
+
+#. TRN "Save current Settings"
+#: src/slic3r/GUI/Tab.cpp:214
+#, c-format
+msgid "Save current %s"
+msgstr "Сохранить %s"
+
+#: src/slic3r/GUI/Tab.cpp:215
+msgid "Delete this preset"
+msgstr "Удалить Ñтот профиль"
+
+#: src/slic3r/GUI/Tab.cpp:219
+msgid ""
+"Hover the cursor over buttons to find more information \n"
+"or click this button."
+msgstr ""
+"Ðаведите курÑор на кнопки Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации или "
+"нажмите Ñту кнопку."
+
+#: src/slic3r/GUI/Tab.cpp:223
+msgid "Search in settings [%1%]"
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:1239
+msgid "Detach from system preset"
+msgstr "ОтÑоединить от ÑиÑтемного профилÑ"
+
+#: src/slic3r/GUI/Tab.cpp:1252
+msgid ""
+"A copy of the current system preset will be created, which will be detached "
+"from the system preset."
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:1253
+msgid ""
+"The current custom preset will be detached from the parent system preset."
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:1256
+msgid "Modifications to the current profile will be saved."
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:1259
+msgid ""
+"This action is not revertable.\n"
+"Do you want to proceed?"
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:1261
+msgid "Detach preset"
+msgstr "ОтÑоединить профиль"
+
+#: src/slic3r/GUI/Tab.cpp:1287
+msgid "This is a default preset."
+msgstr "Это профиль по умолчанию."
+
+#: src/slic3r/GUI/Tab.cpp:1289
+msgid "This is a system preset."
+msgstr "Это ÑиÑтемный профиль."
+
+#: src/slic3r/GUI/Tab.cpp:1291
+msgid "Current preset is inherited from the default preset."
+msgstr "Текущий профиль унаÑледован от Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ð¾ умолчанию."
+
+#: src/slic3r/GUI/Tab.cpp:1295
+msgid "Current preset is inherited from"
+msgstr "Текущий профиль унаÑледован от"
+
+#: src/slic3r/GUI/Tab.cpp:1299
+msgid "It can't be deleted or modified."
+msgstr "Его Ð½ÐµÐ»ÑŒÐ·Ñ Ð±ÑƒÐ´ÐµÑ‚ удалить или изменить."
+
+#: src/slic3r/GUI/Tab.cpp:1300
+msgid ""
+"Any modifications should be saved as a new preset inherited from this one."
+msgstr ""
+"Любые Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð´Ð¾Ð»Ð¶Ð½Ñ‹ быть Ñохранены как новый профиль, унаÑледованный от "
+"текущего."
+
+#: src/slic3r/GUI/Tab.cpp:1301
+msgid "To do that please specify a new name for the preset."
+msgstr "Ð”Ð»Ñ Ñтого укажите новое Ð¸Ð¼Ñ Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ."
+
+#: src/slic3r/GUI/Tab.cpp:1305
+msgid "Additional information:"
+msgstr "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ:"
+
+#: src/slic3r/GUI/Tab.cpp:1311
+msgid "printer model"
+msgstr "модель принтера"
+
+#: src/slic3r/GUI/Tab.cpp:1319
+msgid "default print profile"
+msgstr "профиль печати по умолчанию"
+
+#: src/slic3r/GUI/Tab.cpp:1322
+msgid "default filament profile"
+msgstr "профиль прутка по умолчанию"
+
+#: src/slic3r/GUI/Tab.cpp:1336
+msgid "default SLA material profile"
+msgstr "профиль по умолчанию материала SLA"
+
+#: src/slic3r/GUI/Tab.cpp:1340
+msgid "default SLA print profile"
+msgstr "профиль по умолчанию Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸ SLA"
+
+#: src/slic3r/GUI/Tab.cpp:1348
+msgid "full profile name"
+msgstr "полное название профилÑ"
+
+#: src/slic3r/GUI/Tab.cpp:1349
+msgid "symbolic profile name"
+msgstr "Ñокращённое название профилÑ"
+
+#: src/slic3r/GUI/Tab.cpp:1387 src/slic3r/GUI/Tab.cpp:4032
+msgid "Layers and perimeters"
+msgstr "Слои и периметры"
+
+#: src/slic3r/GUI/Tab.cpp:1393
+msgid "Vertical shells"
+msgstr "Вертикальные оболочки"
+
+#: src/slic3r/GUI/Tab.cpp:1405
+msgid "Horizontal shells"
+msgstr "Горизонтальные оболочки (Ñлои Ñверху и Ñнизу)"
+
+#: src/slic3r/GUI/Tab.cpp:1406 src/libslic3r/PrintConfig.cpp:1948
+msgid "Solid layers"
+msgstr "Сплошных Ñлоёв"
+
+#: src/slic3r/GUI/Tab.cpp:1411
+msgid "Minimum shell thickness"
+msgstr "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ‚Ð¾Ð»Ñ‰Ð¸Ð½Ð° оболочки"
+
+#: src/slic3r/GUI/Tab.cpp:1422
+msgid "Quality (slower slicing)"
+msgstr "КачеÑтво (замедлÑет нарезку)"
+
+#: src/slic3r/GUI/Tab.cpp:1449
+msgid "Reducing printing time"
+msgstr "Сокращение времени печати"
+
+#: src/slic3r/GUI/Tab.cpp:1461
+msgid "Skirt and brim"
+msgstr "Юбка и кайма"
+
+#: src/slic3r/GUI/Tab.cpp:1481
+msgid "Raft"
+msgstr "Подложка"
+
+#: src/slic3r/GUI/Tab.cpp:1485
+msgid "Options for support material and raft"
+msgstr "Параметры поддержек и подложки"
+
+#: src/slic3r/GUI/Tab.cpp:1500
+msgid "Speed for print moves"
+msgstr "СкороÑÑ‚ÑŒ Ð¿ÐµÑ€ÐµÐ´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ печати"
+
+#: src/slic3r/GUI/Tab.cpp:1513
+msgid "Speed for non-print moves"
+msgstr "СкороÑÑ‚ÑŒ Ð¿ÐµÑ€ÐµÐ´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð±ÐµÐ· печати"
+
+#: src/slic3r/GUI/Tab.cpp:1516
+msgid "Modifiers"
+msgstr "Модификаторы"
+
+#: src/slic3r/GUI/Tab.cpp:1519
+msgid "Acceleration control (advanced)"
+msgstr "Управление уÑкорением (дополнительно)"
+
+#: src/slic3r/GUI/Tab.cpp:1526
+msgid "Autospeed (advanced)"
+msgstr "ÐвтоматичеÑкое управление ÑкороÑтью (дополнительно)"
+
+#: src/slic3r/GUI/Tab.cpp:1534
+msgid "Multiple Extruders"
+msgstr "ÐеÑколько ÑкÑтрудеров"
+
+#: src/slic3r/GUI/Tab.cpp:1542
+msgid "Ooze prevention"
+msgstr "Предотвращение утечек"
+
+#: src/slic3r/GUI/Tab.cpp:1560
+msgid "Extrusion width"
+msgstr "Ширина ÑкÑтрузии"
+
+#: src/slic3r/GUI/Tab.cpp:1570
+msgid "Overlap"
+msgstr "Перекрытие"
+
+#: src/slic3r/GUI/Tab.cpp:1573
+msgid "Flow"
+msgstr "Поток"
+
+#: src/slic3r/GUI/Tab.cpp:1582
+msgid "Other"
+msgstr "Прочее"
+
+#: src/slic3r/GUI/Tab.cpp:1585 src/slic3r/GUI/Tab.cpp:4108
+msgid "Output options"
+msgstr "Выходные параметры"
+
+#: src/slic3r/GUI/Tab.cpp:1586
+msgid "Sequential printing"
+msgstr "ПоÑледовательноÑÑ‚ÑŒ печати"
+
+#: src/slic3r/GUI/Tab.cpp:1588
+msgid "Extruder clearance (mm)"
+msgstr "Ð Ð°Ð´Ð¸ÑƒÑ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñной зоны ÑкÑтрудера (мм)"
+
+#: src/slic3r/GUI/Tab.cpp:1593 src/slic3r/GUI/Tab.cpp:4109
+msgid "Output file"
+msgstr "Выходной файл"
+
+#: src/slic3r/GUI/Tab.cpp:1600 src/libslic3r/PrintConfig.cpp:1634
+msgid "Post-processing scripts"
+msgstr "Скрипты поÑтобработки"
+
+#: src/slic3r/GUI/Tab.cpp:1606 src/slic3r/GUI/Tab.cpp:1607
+#: src/slic3r/GUI/Tab.cpp:1927 src/slic3r/GUI/Tab.cpp:1928
+#: src/slic3r/GUI/Tab.cpp:2261 src/slic3r/GUI/Tab.cpp:2262
+#: src/slic3r/GUI/Tab.cpp:2337 src/slic3r/GUI/Tab.cpp:2338
+#: src/slic3r/GUI/Tab.cpp:3975 src/slic3r/GUI/Tab.cpp:3976
+msgid "Notes"
+msgstr "Заметки"
+
+#: src/slic3r/GUI/Tab.cpp:1613 src/slic3r/GUI/Tab.cpp:1935
+#: src/slic3r/GUI/Tab.cpp:2268 src/slic3r/GUI/Tab.cpp:2344
+#: src/slic3r/GUI/Tab.cpp:3983 src/slic3r/GUI/Tab.cpp:4114
+msgid "Dependencies"
+msgstr "ЗавиÑимоÑти"
+
+#: src/slic3r/GUI/Tab.cpp:1614 src/slic3r/GUI/Tab.cpp:1936
+#: src/slic3r/GUI/Tab.cpp:2269 src/slic3r/GUI/Tab.cpp:2345
+#: src/slic3r/GUI/Tab.cpp:3984 src/slic3r/GUI/Tab.cpp:4115
+msgid "Profile dependencies"
+msgstr "ЗавиÑимоÑти профилÑ"
+
+#: src/slic3r/GUI/Tab.cpp:1694
+msgid "Filament Overrides"
+msgstr "ÐŸÐµÑ€ÐµÐ¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ñ€ÑƒÑ‚ÐºÐ°"
+
+#: src/slic3r/GUI/Tab.cpp:1816
+msgid "Temperature"
+msgstr "Температура"
+
+#: src/slic3r/GUI/Tab.cpp:1817
+msgid "Nozzle"
+msgstr "Сопло"
+
+#: src/slic3r/GUI/Tab.cpp:1822
+msgid "Bed"
+msgstr "Платформа"
+
+#: src/slic3r/GUI/Tab.cpp:1827
+msgid "Cooling"
+msgstr "Охлаждение"
+
+#: src/slic3r/GUI/Tab.cpp:1829 src/libslic3r/PrintConfig.cpp:1537
+#: src/libslic3r/PrintConfig.cpp:2396
+msgid "Enable"
+msgstr "Включить"
+
+#: src/slic3r/GUI/Tab.cpp:1840
+msgid "Fan settings"
+msgstr "ÐаÑтройки вентилÑтора"
+
+#: src/slic3r/GUI/Tab.cpp:1850
+msgid "Cooling thresholds"
+msgstr "Пороги Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¾Ð±Ð´ÑƒÐ²Ð°"
+
+#: src/slic3r/GUI/Tab.cpp:1856
+msgid "Filament properties"
+msgstr "СвойÑтва прутка"
+
+#: src/slic3r/GUI/Tab.cpp:1863
+msgid "Print speed override"
+msgstr "Ограничение ÑкороÑти печати"
+
+#: src/slic3r/GUI/Tab.cpp:1873
+msgid "Wipe tower parameters"
+msgstr "Параметры башни очиÑтки"
+
+#: src/slic3r/GUI/Tab.cpp:1876
+msgid "Toolchange parameters with single extruder MM printers"
+msgstr "Параметры Ñмены Ñопла в одноÑкÑтрудерных мультиматериальных принтерах"
+
+#: src/slic3r/GUI/Tab.cpp:1889
+msgid "Ramming settings"
+msgstr "ÐаÑтройки Ñ€Ñмминга"
+
+#: src/slic3r/GUI/Tab.cpp:1912 src/slic3r/GUI/Tab.cpp:2200
+#: src/libslic3r/PrintConfig.cpp:2031
+msgid "Custom G-code"
+msgstr "ПользовательÑкий G-код"
+
+#: src/slic3r/GUI/Tab.cpp:1913 src/slic3r/GUI/Tab.cpp:2201
+#: src/libslic3r/PrintConfig.cpp:1981 src/libslic3r/PrintConfig.cpp:1996
+msgid "Start G-code"
+msgstr "Стартовый G-код"
+
+#: src/slic3r/GUI/Tab.cpp:1920 src/slic3r/GUI/Tab.cpp:2208
+#: src/libslic3r/PrintConfig.cpp:426 src/libslic3r/PrintConfig.cpp:436
+msgid "End G-code"
+msgstr "Завершающий G-код"
+
+#: src/slic3r/GUI/Tab.cpp:1970
+msgid "Volumetric flow hints not available"
+msgstr "ПодÑказки по объемному раÑходу недоÑтупны"
+
+#: src/slic3r/GUI/Tab.cpp:2066
+msgid ""
+"Note: All parameters from this group are moved to the Physical Printer "
+"settings (see changelog).\n"
+"\n"
+"A new Physical Printer profile is created by clicking on the \"cog\" icon "
+"right of the Printer profiles combo box, by selecting the \"Add physical "
+"printer\" item in the Printer combo box. The Physical Printer profile editor "
+"opens also when clicking on the \"cog\" icon in the Printer settings tab. "
+"The Physical Printer profiles are being stored into PrusaSlicer/"
+"physical_printer directory."
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:2099 src/slic3r/GUI/Tab.cpp:2281
+msgid "Size and coordinates"
+msgstr "Размер и координаты"
+
+#: src/slic3r/GUI/Tab.cpp:2108 src/slic3r/GUI/UnsavedChangesDialog.cpp:1072
+msgid "Capabilities"
+msgstr "ХарактериÑтики принтера"
+
+#: src/slic3r/GUI/Tab.cpp:2113
+msgid "Number of extruders of the printer."
+msgstr "КоличеÑтво ÑкÑтрудеров у принтера."
+
+#: src/slic3r/GUI/Tab.cpp:2141
+msgid ""
+"Single Extruder Multi Material is selected, \n"
+"and all extruders must have the same diameter.\n"
+"Do you want to change the diameter for all extruders to first extruder "
+"nozzle diameter value?"
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:2144 src/slic3r/GUI/Tab.cpp:2547
+#: src/libslic3r/PrintConfig.cpp:1506
+msgid "Nozzle diameter"
+msgstr "Диаметр Ñопла"
+
+#: src/slic3r/GUI/Tab.cpp:2215 src/libslic3r/PrintConfig.cpp:194
+msgid "Before layer change G-code"
+msgstr "G-код, выполнÑемый перед Ñменой ÑлоÑ"
+
+#: src/slic3r/GUI/Tab.cpp:2222 src/libslic3r/PrintConfig.cpp:1245
+msgid "After layer change G-code"
+msgstr "G-код, выполнÑемый поÑле Ñмены ÑлоÑ"
+
+#: src/slic3r/GUI/Tab.cpp:2229 src/libslic3r/PrintConfig.cpp:2289
+msgid "Tool change G-code"
+msgstr "G-код, выполнÑемый Ð´Ð»Ñ Ñмены инÑтрумента"
+
+#: src/slic3r/GUI/Tab.cpp:2236
+msgid "Between objects G-code (for sequential printing)"
+msgstr "G-код, выполнÑемый между объектами (Ð´Ð»Ñ Ð¿Ð¾Ñледовательной печати)"
+
+#: src/slic3r/GUI/Tab.cpp:2243
+msgid "Color Change G-code"
+msgstr "G-код, выполнÑемый Ð´Ð»Ñ Ñмены цвета"
+
+#: src/slic3r/GUI/Tab.cpp:2249 src/libslic3r/PrintConfig.cpp:2022
+msgid "Pause Print G-code"
+msgstr "G-код, выполнÑемый Ð´Ð»Ñ Ð¿Ð°ÑƒÐ·Ñ‹ печати"
+
+#: src/slic3r/GUI/Tab.cpp:2255
+msgid "Template Custom G-code"
+msgstr "Шаблон пользовательÑкого G-кода"
+
+#: src/slic3r/GUI/Tab.cpp:2288
+msgid "Display"
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:2303
+msgid "Tilt"
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:2304
+msgid "Tilt time"
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:2310 src/slic3r/GUI/Tab.cpp:3959
+msgid "Corrections"
+msgstr "ИÑправлениÑ"
+
+#: src/slic3r/GUI/Tab.cpp:2327 src/slic3r/GUI/Tab.cpp:3955
+msgid "Exposure"
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:2386 src/slic3r/GUI/Tab.cpp:2480
+#: src/libslic3r/PrintConfig.cpp:1274 src/libslic3r/PrintConfig.cpp:1309
+#: src/libslic3r/PrintConfig.cpp:1326 src/libslic3r/PrintConfig.cpp:1343
+#: src/libslic3r/PrintConfig.cpp:1359 src/libslic3r/PrintConfig.cpp:1369
+#: src/libslic3r/PrintConfig.cpp:1379 src/libslic3r/PrintConfig.cpp:1389
+msgid "Machine limits"
+msgstr "ÐžÐ³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°"
+
+#: src/slic3r/GUI/Tab.cpp:2409
+msgid "Values in this column are for Normal mode"
+msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² Ñтом Ñтолбце отноÑÑÑ‚ÑÑ Ðº нормальному режиму"
+
+#: src/slic3r/GUI/Tab.cpp:2415
+msgid "Values in this column are for Stealth mode"
+msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² Ñтом Ñтолбце отноÑÑÑ‚ÑÑ Ðº тихому режиму"
+
+#: src/slic3r/GUI/Tab.cpp:2424
+msgid "Maximum feedrates"
+msgstr "МакÑимальные ÑкороÑти подачи"
+
+#: src/slic3r/GUI/Tab.cpp:2429
+msgid "Maximum accelerations"
+msgstr "МакÑимальные уÑкорениÑ"
+
+#: src/slic3r/GUI/Tab.cpp:2436
+msgid "Jerk limits"
+msgstr "Ограничение рывка"
+
+#: src/slic3r/GUI/Tab.cpp:2441
+msgid "Minimum feedrates"
+msgstr "Минимальные ÑкороÑти подачи"
+
+#: src/slic3r/GUI/Tab.cpp:2505 src/slic3r/GUI/Tab.cpp:2513
+msgid "Single extruder MM setup"
+msgstr "ЭкÑтрудер в ММ принтере"
+
+#: src/slic3r/GUI/Tab.cpp:2514
+msgid "Single extruder multimaterial parameters"
+msgstr ""
+"Параметры ÑкÑтрудера в одноÑкÑтрудерном мультиматериальном (ММ) принтере"
+
+#: src/slic3r/GUI/Tab.cpp:2545
+msgid ""
+"This is a single extruder multimaterial printer, diameters of all extruders "
+"will be set to the new value. Do you want to proceed?"
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:2569
+msgid "Layer height limits"
+msgstr "Ограничение выÑоты ÑлоÑ"
+
+#: src/slic3r/GUI/Tab.cpp:2574
+msgid "Position (for multi-extruder printers)"
+msgstr "ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ ÑкÑтрудера (Ð´Ð»Ñ Ð¼Ð½Ð¾Ð³Ð¾ÑкÑтрудерных принтеров)"
+
+#: src/slic3r/GUI/Tab.cpp:2580
+msgid "Only lift Z"
+msgstr "Только подъём Z"
+
+#: src/slic3r/GUI/Tab.cpp:2593
+msgid ""
+"Retraction when tool is disabled (advanced settings for multi-extruder "
+"setups)"
+msgstr ""
+"Ретракт, при отключении Ñопла (дополнительные наÑтройки Ð´Ð»Ñ "
+"многоÑкÑтрудерных принтеров)"
+
+#: src/slic3r/GUI/Tab.cpp:2600
+msgid "Reset to Filament Color"
+msgstr "СброÑить в цвет прутка"
+
+#: src/slic3r/GUI/Tab.cpp:2778
+msgid ""
+"The Wipe option is not available when using the Firmware Retraction mode.\n"
+"\n"
+"Shall I disable it in order to enable Firmware Retraction?"
+msgstr ""
+"Параметр прочиÑтки недоÑтупен при иÑпользовании ретракта из прошивки.\n"
+"\n"
+"Отключить его Ð´Ð»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ñ€ÐµÑ‚Ñ€Ð°ÐºÑ‚Ð° из прошивки?"
+
+#: src/slic3r/GUI/Tab.cpp:2780
+msgid "Firmware Retraction"
+msgstr "Ретракт из прошивки"
+
+#: src/slic3r/GUI/Tab.cpp:3366
+msgid "Detached"
+msgstr "ОтÑоединён"
+
+#: src/slic3r/GUI/Tab.cpp:3429
+msgid "remove"
+msgstr "убрать"
+
+#: src/slic3r/GUI/Tab.cpp:3429
+msgid "delete"
+msgstr "удалить"
+
+#: src/slic3r/GUI/Tab.cpp:3438
+msgid "It's a last preset for this physical printer."
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:3443
+msgid ""
+"Are you sure you want to delete \"%1%\" preset from the physical printer "
+"\"%2%\"?"
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:3455
+msgid ""
+"The physical printer(s) below is based on the preset, you are going to "
+"delete."
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:3459
+msgid ""
+"Note, that selected preset will be deleted from this/those printer(s) too."
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:3463
+msgid ""
+"The physical printer(s) below is based only on the preset, you are going to "
+"delete."
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:3467
+msgid ""
+"Note, that this/those printer(s) will be deleted after deleting of the "
+"selected preset."
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:3471
+msgid "Are you sure you want to %1% the selected preset?"
+msgstr "Удалить выбранный профиль %1%?"
+
+#. TRN Remove/Delete
+#: src/slic3r/GUI/Tab.cpp:3476
+msgid "%1% Preset"
+msgstr "Профиль %1%"
+
+#: src/slic3r/GUI/Tab.cpp:3557 src/slic3r/GUI/Tab.cpp:3629
+msgid "Set"
+msgstr "Выбор"
+
+#: src/slic3r/GUI/Tab.cpp:3693
+msgid ""
+"Machine limits will be emitted to G-code and used to estimate print time."
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:3696
+msgid ""
+"Machine limits will NOT be emitted to G-code, however they will be used to "
+"estimate print time, which may therefore not be accurate as the printer may "
+"apply a different set of machine limits."
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:3700
+msgid ""
+"Machine limits are not set, therefore the print time estimate may not be "
+"accurate."
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:3722
+msgid "LOCKED LOCK"
+msgstr "ЗÐКРЫТЫЙ ЗÐМОК"
+
+#. TRN Description for "LOCKED LOCK"
+#: src/slic3r/GUI/Tab.cpp:3724
+msgid ""
+"indicates that the settings are the same as the system (or default) values "
+"for the current option group"
+msgstr ""
+"указывает, что наÑтройки Ñовпадают Ñ ÑиÑтемными (умолчательным) значениÑми "
+"текущей группы параметров"
+
+#: src/slic3r/GUI/Tab.cpp:3726
+msgid "UNLOCKED LOCK"
+msgstr "ОТКРЫТЫЙ ЗÐМОК"
+
+#. TRN Description for "UNLOCKED LOCK"
+#: src/slic3r/GUI/Tab.cpp:3728
+msgid ""
+"indicates that some settings were changed and are not equal to the system "
+"(or default) values for the current option group.\n"
+"Click the UNLOCKED LOCK icon to reset all settings for current option group "
+"to the system (or default) values."
+msgstr ""
+"указывает, что некоторые наÑтройки были изменены и не равны ÑиÑтемным "
+"(умолчательным) значениÑм текущей группы параметров.\n"
+"Ðажмите на ОТКРЫТЫЙ ЗÐМОК, чтобы ÑброÑить вÑе наÑтройки текущей группы "
+"параметров в ÑиÑтемные значениÑ."
+
+#: src/slic3r/GUI/Tab.cpp:3733
+msgid "WHITE BULLET"
+msgstr "БЕЛЫЙ ÐœÐРКЕР"
+
+#. TRN Description for "WHITE BULLET"
+#: src/slic3r/GUI/Tab.cpp:3735
+msgid ""
+"for the left button: indicates a non-system (or non-default) preset,\n"
+"for the right button: indicates that the settings hasn't been modified."
+msgstr ""
+"маркер Ñлева указывает на неÑиÑтемный профиль,\n"
+"а правый, что параметры не были изменены."
+
+#: src/slic3r/GUI/Tab.cpp:3738
+msgid "BACK ARROW"
+msgstr "СТРЕЛКРРÐЗВОРОТÐ"
+
+#. TRN Description for "BACK ARROW"
+#: src/slic3r/GUI/Tab.cpp:3740
+msgid ""
+"indicates that the settings were changed and are not equal to the last saved "
+"preset for the current option group.\n"
+"Click the BACK ARROW icon to reset all settings for the current option group "
+"to the last saved preset."
+msgstr ""
+"указывает, что наÑтройки были изменены и не Ñовпадают Ñ Ð½Ð°Ñтройками в "
+"поÑледнем Ñохранённом профиле Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ группы параметров.\n"
+"Ðажмите на значок СТРЕЛКИ РÐЗВОРОТÐ, чтобы ÑброÑить вÑе наÑтройки Ð´Ð»Ñ "
+"текущей группы в поÑледние Ñохранённые Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ."
+
+#: src/slic3r/GUI/Tab.cpp:3750
+msgid ""
+"LOCKED LOCK icon indicates that the settings are the same as the system (or "
+"default) values for the current option group"
+msgstr ""
+"Закрытый замочек указывает, что наÑтройки Ñовпадают Ñ ÑиÑтемными значениÑми "
+"Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ группы"
+
+#: src/slic3r/GUI/Tab.cpp:3752
+msgid ""
+"UNLOCKED LOCK icon indicates that some settings were changed and are not "
+"equal to the system (or default) values for the current option group.\n"
+"Click to reset all settings for current option group to the system (or "
+"default) values."
+msgstr ""
+"Открытый замочек указывает, что некоторые наÑтройки были изменены и не равны "
+"ÑиÑтемным значениÑм (или значениÑм по умолчанию) Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ группы.\n"
+"Ðажмите, чтобы ÑброÑить вÑе наÑтройки текущей группы до ÑиÑтемных значений."
+
+#: src/slic3r/GUI/Tab.cpp:3755
+msgid "WHITE BULLET icon indicates a non system (or non default) preset."
+msgstr ""
+"Белый маркер указывает на неÑиÑтемный профиль (либо профиль не по умолчанию)."
+
+#: src/slic3r/GUI/Tab.cpp:3758
+msgid ""
+"WHITE BULLET icon indicates that the settings are the same as in the last "
+"saved preset for the current option group."
+msgstr ""
+"Белый маркер означает, что наÑтройки Ñовпадают Ñ Ð½Ð°Ñтройками в поÑледнем "
+"Ñохранённом профиле Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ группы."
+
+#: src/slic3r/GUI/Tab.cpp:3760
+msgid ""
+"BACK ARROW icon indicates that the settings were changed and are not equal "
+"to the last saved preset for the current option group.\n"
+"Click to reset all settings for the current option group to the last saved "
+"preset."
+msgstr ""
+"Значок Ñо Ñтрелкой указывает, что наÑтройки были изменены и не Ñовпадают Ñ "
+"наÑтройками в поÑледнем Ñохранённом профиле Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ группы.\n"
+"Ðажмите, чтобы ÑброÑить вÑе наÑтройки Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ группы до поÑледнего "
+"Ñохранённого Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ."
+
+#: src/slic3r/GUI/Tab.cpp:3766
+msgid ""
+"LOCKED LOCK icon indicates that the value is the same as the system (or "
+"default) value."
+msgstr ""
+"Закрытый замочек указывает, что значение Ñовпадает Ñ ÑиÑтемным значением "
+"(либо значием по умолчанию)."
+
+#: src/slic3r/GUI/Tab.cpp:3767
+msgid ""
+"UNLOCKED LOCK icon indicates that the value was changed and is not equal to "
+"the system (or default) value.\n"
+"Click to reset current value to the system (or default) value."
+msgstr ""
+"Открытый замочек указывает, что значение было изменено и не равно ÑиÑтемному "
+"значению(или значениÑм по умолчанию).\n"
+"Ðажмите, чтобы ÑброÑить текущее значение к ÑиÑтемному значению."
+
+#: src/slic3r/GUI/Tab.cpp:3773
+msgid ""
+"WHITE BULLET icon indicates that the value is the same as in the last saved "
+"preset."
+msgstr ""
+"Белый маркер указывает, что значение Ñовпадает Ñо значением в поÑледнем "
+"Ñохранённом профиле."
+
+#: src/slic3r/GUI/Tab.cpp:3774
+msgid ""
+"BACK ARROW icon indicates that the value was changed and is not equal to the "
+"last saved preset.\n"
+"Click to reset current value to the last saved preset."
+msgstr ""
+"Значок Ñо Ñтрелкой указывает, что значение было изменено и не Ñовпадает Ñо "
+"значением в поÑледнем Ñохранённом профиле Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ группы.\n"
+"Ðажмите, чтобы ÑброÑить значение до поÑледнего Ñохранённого Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ."
+
+#: src/slic3r/GUI/Tab.cpp:3918 src/slic3r/GUI/Tab.cpp:3920
+msgid "Material"
+msgstr "Материал"
+
+#: src/slic3r/GUI/Tab.cpp:4042
+msgid "Support head"
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:4047
+msgid "Support pillar"
+msgstr "ÐžÐ¿Ð¾Ñ€Ð½Ð°Ñ Ñтойка"
+
+#: src/slic3r/GUI/Tab.cpp:4070
+msgid "Connection of the support sticks and junctions"
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:4075
+msgid "Automatic generation"
+msgstr "ÐвтоматичеÑÐºÐ°Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ"
+
+#: src/slic3r/GUI/Tab.cpp:4149
+msgid ""
+"\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n"
+"To enable \"%1%\", please switch off \"%2%\""
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:4151 src/libslic3r/PrintConfig.cpp:2970
+msgid "Object elevation"
+msgstr ""
+
+#: src/slic3r/GUI/Tab.cpp:4151 src/libslic3r/PrintConfig.cpp:3072
+msgid "Pad around object"
+msgstr ""
+
+#: src/slic3r/GUI/Tab.hpp:374 src/slic3r/GUI/Tab.hpp:496
+msgid "Print Settings"
+msgstr "ÐаÑтройки печати"
+
+#: src/slic3r/GUI/Tab.hpp:405
+msgid "Filament Settings"
+msgstr "ÐаÑтройки прутка"
+
+#: src/slic3r/GUI/Tab.hpp:446
+msgid "Printer Settings"
+msgstr "ÐаÑтройки принтера"
+
+#: src/slic3r/GUI/Tab.hpp:480
+msgid "Material Settings"
+msgstr "ÐаÑтройки материала"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:143
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:152
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:851
+msgid "Undef"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:531
+msgid "PrusaSlicer is closing: Unsaved Changes"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:548
+msgid "Switching Presets: Unsaved Changes"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:614
+msgid "Old Value"
+msgstr "Старое значение"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:615
+msgid "New Value"
+msgstr "Ðовое значение"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:646
+msgid "Transfer"
+msgstr "ПеренеÑти"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:647
+msgid "Discard"
+msgstr "СброÑить"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:648
+msgid "Save"
+msgstr "Сохранить"
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:668
+msgid "PrusaSlicer will remember your action."
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:670
+msgid ""
+"You will not be asked about the unsaved changes the next time you close "
+"PrusaSlicer."
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:671
+msgid ""
+"You will not be asked about the unsaved changes the next time you switch a "
+"preset."
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:672
+msgid ""
+"Visit \"Preferences\" and check \"%1%\"\n"
+"to be asked about unsaved changes again."
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:674
+msgid "PrusaSlicer: Don't ask me again"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:741
+msgid ""
+"Some fields are too long to fit. Right mouse click reveals the full text."
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:743
+msgid "All settings changes will be discarded."
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:746
+msgid "Save the selected options."
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:746
+msgid "Transfer the selected settings to the newly selected preset."
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:750
+msgid "Save the selected options to preset \"%1%\"."
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:751
+msgid "Transfer the selected options to the newly selected preset \"%1%\"."
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1010
+msgid "The following presets were modified:"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1015
+msgid "Preset \"%1%\" has the following unsaved changes:"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1019
+msgid ""
+"Preset \"%1%\" is not compatible with the new printer profile and it has the "
+"following unsaved changes:"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1020
+msgid ""
+"Preset \"%1%\" is not compatible with the new print profile and it has the "
+"following unsaved changes:"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1067
+msgid "Extruders count"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1183
+msgid "Old value"
+msgstr ""
+
+#: src/slic3r/GUI/UnsavedChangesDialog.cpp:1184
+msgid "New value"
+msgstr ""
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:38
+msgid "Update available"
+msgstr "ДоÑтупно обновление"
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:38
+#, c-format
+msgid "New version of %s is available"
+msgstr "ДоÑтупна Ð½Ð¾Ð²Ð°Ñ Ð²ÐµÑ€ÑÐ¸Ñ %s"
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:43
+msgid "Current version:"
+msgstr "Ð¢ÐµÐºÑƒÑ‰Ð°Ñ Ð²ÐµÑ€ÑиÑ:"
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:45
+msgid "New version:"
+msgstr "ÐÐ¾Ð²Ð°Ñ Ð²ÐµÑ€ÑиÑ:"
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:53
+msgid "Changelog && Download"
+msgstr "Журнал изменение && Скачивание"
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:60 src/slic3r/GUI/UpdateDialogs.cpp:125
+#: src/slic3r/GUI/UpdateDialogs.cpp:183
+msgid "Open changelog page"
+msgstr "Открыть Ñтраницу изменений"
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:65
+msgid "Open download page"
+msgstr "Открыть Ñтраницу закачки"
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:71
+msgid "Don't notify about new releases any more"
+msgstr "Больше не уведомлÑÑ‚ÑŒ о новых выпуÑках"
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:89 src/slic3r/GUI/UpdateDialogs.cpp:266
+msgid "Configuration update"
+msgstr "Обновление конфигурации"
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:89
+msgid "Configuration update is available"
+msgstr "ДоÑтупно обновление конфигурации"
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:92
+msgid ""
+"Would you like to install it?\n"
+"\n"
+"Note that a full configuration snapshot will be created first. It can then "
+"be restored at any time should there be a problem with the new version.\n"
+"\n"
+"Updated configuration bundles:"
+msgstr ""
+"Ð’Ñ‹ хотите уÑтановить его?\n"
+"\n"
+"Обратите внимание, что Ñначала будет Ñоздан Ñнапшот. Он может быть "
+"воÑÑтановлен в любое времÑ, еÑли возникнет проблема Ñ Ð½Ð¾Ð²Ð¾Ð¹ верÑией.\n"
+"\n"
+"Обновлённые пакеты конфигурации:"
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:113 src/slic3r/GUI/UpdateDialogs.cpp:173
+msgid "Comment:"
+msgstr "Комментарий:"
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:148 src/slic3r/GUI/UpdateDialogs.cpp:210
+#, c-format
+msgid "%s incompatibility"
+msgstr "ÐеÑовмеÑтимоÑÑ‚ÑŒ %s"
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:148
+msgid "You must install a configuration update."
+msgstr "Ð’Ñ‹ должны уÑтановить обновление наÑтроек."
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:151
+#, c-format
+msgid ""
+"%s will now start updates. Otherwise it won't be able to start.\n"
+"\n"
+"Note that a full configuration snapshot will be created first. It can then "
+"be restored at any time should there be a problem with the new version.\n"
+"\n"
+"Updated configuration bundles:"
+msgstr ""
+"%s начнет обновлениÑ. Ð’ противном Ñлучае он не запуÑтитÑÑ.\n"
+"\n"
+"Обратите внимание, что Ñначала будет Ñоздан Ñнапшот полной конфигурации. Он "
+"может быть воÑÑтановлен в любое времÑ, еÑли возникнет проблема Ñ Ð½Ð¾Ð²Ð¾Ð¹ "
+"верÑией.\n"
+"\n"
+"Обновлённые пакеты конфигурации:"
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:191 src/slic3r/GUI/UpdateDialogs.cpp:246
+#, c-format
+msgid "Exit %s"
+msgstr "Выход из %s"
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:211
+#, c-format
+msgid "%s configuration is incompatible"
+msgstr "ÐаÑтройки %s неÑовмеÑтимы"
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:216
+#, c-format
+msgid ""
+"This version of %s is not compatible with currently installed configuration "
+"bundles.\n"
+"This probably happened as a result of running an older %s after using a "
+"newer one.\n"
+"\n"
+"You may either exit %s and try again with a newer version, or you may re-run "
+"the initial configuration. Doing so will create a backup snapshot of the "
+"existing configuration before installing files compatible with this %s."
+msgstr ""
+"Эта верÑÐ¸Ñ %s не ÑовмеÑтима Ñ ÑƒÑтановленными пакетами наÑтроек.\n"
+"ВероÑтно, Ñто произошло в результате запуÑка более Ñтарой верÑии %s поÑле "
+"иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð±Ð¾Ð»ÐµÐµ новой.\n"
+"\n"
+"Ð’Ñ‹ можете выйти из %s и повторить попытку Ñ Ð½Ð¾Ð²Ð¾Ð¹ верÑией, либо повторно "
+"запуÑтить начальную наÑтройку. Это ÑоздаÑÑ‚ резервную копию ÑущеÑтвующих "
+"наÑтроек перед уÑтановкой файлов, ÑовмеÑтимых Ñ Ñтой верÑией %s."
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:225
+#, c-format
+msgid "This %s version: %s"
+msgstr "%s, верÑÐ¸Ñ %s"
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:230
+msgid "Incompatible bundles:"
+msgstr "ÐеÑовмеÑтимые пакеты конфигурации:"
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:249
+msgid "Re-configure"
+msgstr "ПеренаÑтроить"
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:270
+#, c-format
+msgid ""
+"%s now uses an updated configuration structure.\n"
+"\n"
+"So called 'System presets' have been introduced, which hold the built-in "
+"default settings for various printers. These System presets cannot be "
+"modified, instead, users now may create their own presets inheriting "
+"settings from one of the System presets.\n"
+"An inheriting preset may either inherit a particular value from its parent "
+"or override it with a customized value.\n"
+"\n"
+"Please proceed with the %s that follows to set up the new presets and to "
+"choose whether to enable automatic preset updates."
+msgstr ""
+"Ð’ %s изменилаÑÑŒ Ñтруктура наÑтроек.\n"
+"\n"
+"Были введены так называемые 'ÑиÑтемные профили', которые Ñодержат вÑтроенные "
+"наÑтройки по умолчанию Ð´Ð»Ñ Ñ€Ð°Ð·Ð½Ñ‹Ñ… принтеров. Эти ÑиÑтемные профили не могут "
+"быть изменены. ВмеÑто Ñтого пользователи теперь могут Ñоздавать ÑобÑтвенные "
+"профили, наÑледующие наÑтройки от одного из ÑиÑтемных профилей.\n"
+"ÐаÑледующий профиль может либо наÑледовать определённое значение от Ñвоего "
+"родителÑ, либо переопределить его Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ наÑтроенного значениÑ.\n"
+"\n"
+"Перейдите к %s, чтобы наÑтроить новые профили и выбрать, Ñледует ли включить "
+"автоматичеÑкое обновление ÑиÑтемных профилей."
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:287
+msgid "For more information please visit our wiki page:"
+msgstr ""
+"Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ информации, поÑетите нашу Ñтраницу в Википедии:"
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:304
+msgid "Configuration updates"
+msgstr "ÐžÐ±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸"
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:304
+msgid "No updates available"
+msgstr "Ðет доÑтупных обновлений"
+
+#: src/slic3r/GUI/UpdateDialogs.cpp:309
+#, c-format
+msgid "%s has no configuration updates available."
+msgstr "%s не имеет доÑтупных обновлений конфигурации."
+
+#: src/slic3r/GUI/WipeTowerDialog.cpp:15
+msgid "Ramming customization"
+msgstr "ÐаÑтройки Ñ€Ñмминга"
+
+#: src/slic3r/GUI/WipeTowerDialog.cpp:41
+msgid ""
+"Ramming denotes the rapid extrusion just before a tool change in a single-"
+"extruder MM printer. Its purpose is to properly shape the end of the "
+"unloaded filament so it does not prevent insertion of the new filament and "
+"can itself be reinserted later. This phase is important and different "
+"materials can require different extrusion speeds to get the good shape. For "
+"this reason, the extrusion rates during ramming are adjustable.\n"
+"\n"
+"This is an expert-level setting, incorrect adjustment will likely lead to "
+"jams, extruder wheel grinding into filament etc."
+msgstr ""
+"РÑмминг (ramming) означает быÑтрое ÑкÑтрудирование непоÑредÑтвенно перед "
+"Ñменой Ñопла в одноÑкÑтрудерном мультиматериальном принтере. Его цель "
+"ÑоÑтоит в том, чтобы правильно Ñформировать конец не загруженного прутка, "
+"чтобы он не препÑÑ‚Ñтвовал вÑтавке нового прутка или позднее повторно "
+"вÑтавлÑемого Ñтого же. Эта фаза важна, и разные материалы могут потребовать "
+"разных ÑкороÑтей ÑкÑтрузии, чтобы получить хорошую форму. По Ñтой причине "
+"ÑкороÑÑ‚ÑŒ ÑкÑтрузии во Ð²Ñ€ÐµÐ¼Ñ Ñ€Ñмминга регулируетÑÑ.\n"
+"\n"
+"Этот параметр Ð´Ð»Ñ Ð¾Ð¿Ñ‹Ñ‚Ð½Ñ‹Ñ… пользователей, Ð½ÐµÐ¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½Ð°Ñ Ð½Ð°Ñтройка, может "
+"привеÑти к замÑтию, протирание прутка приводом ÑкÑтрудера и Ñ‚.д."
+
+#: src/slic3r/GUI/WipeTowerDialog.cpp:83
+msgid "Total ramming time"
+msgstr "Общее Ð²Ñ€ÐµÐ¼Ñ Ñ€Ñмминга"
+
+#: src/slic3r/GUI/WipeTowerDialog.cpp:85
+msgid "Total rammed volume"
+msgstr "Общий объём при Ñ€Ñмминге"
+
+#: src/slic3r/GUI/WipeTowerDialog.cpp:89
+msgid "Ramming line width"
+msgstr "Ширина линии при Ñ€Ñмминге"
+
+#: src/slic3r/GUI/WipeTowerDialog.cpp:91
+msgid "Ramming line spacing"
+msgstr "РаÑÑтоÑние между линиÑми при Ñ€Ñмминге"
+
+#: src/slic3r/GUI/WipeTowerDialog.cpp:142
+msgid "Wipe tower - Purging volume adjustment"
+msgstr "Ð‘Ð°ÑˆÐ½Ñ Ð¾Ñ‡Ð¸Ñтки - регулировка объёма ÑброÑа плаÑтика"
+
+#: src/slic3r/GUI/WipeTowerDialog.cpp:254
+msgid ""
+"Here you can adjust required purging volume (mm³) for any given pair of "
+"tools."
+msgstr ""
+"ЗдеÑÑŒ вы можете отрегулировать требуемый объём очиÑтки (мм³) Ð´Ð»Ñ Ð»ÑŽÐ±Ð¾Ð¹ пары "
+"Ñопел."
+
+#: src/slic3r/GUI/WipeTowerDialog.cpp:255
+msgid "Extruder changed to"
+msgstr "ЭкÑтрудер изменен на"
+
+#: src/slic3r/GUI/WipeTowerDialog.cpp:263
+msgid "unloaded"
+msgstr "выгрузку"
+
+#: src/slic3r/GUI/WipeTowerDialog.cpp:264
+msgid "loaded"
+msgstr "загрузку"
+
+#: src/slic3r/GUI/WipeTowerDialog.cpp:276
+msgid "Tool #"
+msgstr "ИнÑтрумент #"
+
+#: src/slic3r/GUI/WipeTowerDialog.cpp:285
+msgid ""
+"Total purging volume is calculated by summing two values below, depending on "
+"which tools are loaded/unloaded."
+msgstr ""
+"Общий объём прочиÑтки вычиÑлÑетÑÑ Ð¿ÑƒÑ‚Ñ‘Ð¼ ÑÑƒÐ¼Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð´Ð²ÑƒÑ… нижеуказанных "
+"значений, в завиÑимоÑти от того, какие Ñопла предзагружены/выгружены."
+
+#: src/slic3r/GUI/WipeTowerDialog.cpp:286
+msgid "Volume to purge (mm³) when the filament is being"
+msgstr "Объём прочиÑтки (мм³) при выдавливании прутка"
+
+#: src/slic3r/GUI/WipeTowerDialog.cpp:300
+msgid "From"
+msgstr "Из"
+
+#: src/slic3r/GUI/WipeTowerDialog.cpp:365
+msgid ""
+"Switching to simple settings will discard changes done in the advanced "
+"mode!\n"
+"\n"
+"Do you want to proceed?"
+msgstr ""
+"Переключение на упрощённые наÑтройки отменит изменениÑ, Ñделанные в "
+"раÑширенном режиме!\n"
+"\n"
+"Хотите продолжить?"
+
+#: src/slic3r/GUI/WipeTowerDialog.cpp:377
+msgid "Show simplified settings"
+msgstr "Показать упрощённые наÑтройки"
+
+#: src/slic3r/GUI/WipeTowerDialog.cpp:377
+msgid "Show advanced settings"
+msgstr "Показать раÑширенные наÑтройки"
+
+#: src/slic3r/GUI/wxExtensions.cpp:623
+#, c-format
+msgid "Switch to the %s mode"
+msgstr "ПереключитьÑÑ Ð² %s режим"
+
+#: src/slic3r/GUI/wxExtensions.cpp:624
+#, c-format
+msgid "Current mode is %s"
+msgstr "Текущий режим: %s"
+
+#: src/slic3r/Utils/AstroBox.cpp:69 src/slic3r/Utils/OctoPrint.cpp:68
+#, c-format
+msgid "Mismatched type of print host: %s"
+msgstr ""
+
+#: src/slic3r/Utils/AstroBox.cpp:84
+msgid "Connection to AstroBox works correctly."
+msgstr "Подключение к AstroBox уÑтановлено."
+
+#: src/slic3r/Utils/AstroBox.cpp:90
+msgid "Could not connect to AstroBox"
+msgstr "Ðе удалоÑÑŒ подключитьÑÑ Ðº AstroBox"
+
+#: src/slic3r/Utils/AstroBox.cpp:92
+msgid "Note: AstroBox version at least 1.1.0 is required."
+msgstr "Примечание: требуетÑÑ Ð²ÐµÑ€ÑÐ¸Ñ AstroBox не ниже 1.1.0."
+
+#: src/slic3r/Utils/Duet.cpp:47
+msgid "Connection to Duet works correctly."
+msgstr "Подключение к Duet уÑтановлено."
+
+#: src/slic3r/Utils/Duet.cpp:53
+msgid "Could not connect to Duet"
+msgstr "Ðе удалоÑÑŒ подключитьÑÑ Ðº Duet"
+
+#: src/slic3r/Utils/Duet.cpp:88 src/slic3r/Utils/Duet.cpp:151
+#: src/slic3r/Utils/FlashAir.cpp:122 src/slic3r/Utils/FlashAir.cpp:143
+#: src/slic3r/Utils/FlashAir.cpp:159
+msgid "Unknown error occured"
+msgstr "Возникла неизвеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°"
+
+#: src/slic3r/Utils/Duet.cpp:145
+msgid "Wrong password"
+msgstr "Ðеправильный пароль"
+
+#: src/slic3r/Utils/Duet.cpp:148
+msgid "Could not get resources to create a new connection"
+msgstr ""
+
+#: src/slic3r/Utils/FixModelByWin10.cpp:219
+#: src/slic3r/Utils/FixModelByWin10.cpp:359
+msgid "Exporting source model"
+msgstr "ЭкÑпортируетÑÑ Ð¸ÑÑ…Ð¾Ð´Ð½Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ"
+
+#: src/slic3r/Utils/FixModelByWin10.cpp:235
+msgid "Failed loading the input model."
+msgstr ""
+
+#: src/slic3r/Utils/FixModelByWin10.cpp:242
+msgid "Repairing model by the Netfabb service"
+msgstr ""
+
+#: src/slic3r/Utils/FixModelByWin10.cpp:248
+msgid "Mesh repair failed."
+msgstr ""
+
+#: src/slic3r/Utils/FixModelByWin10.cpp:251
+#: src/slic3r/Utils/FixModelByWin10.cpp:378
+msgid "Loading repaired model"
+msgstr "ЗагружаетÑÑ Ð¸ÑÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ"
+
+#: src/slic3r/Utils/FixModelByWin10.cpp:263
+#: src/slic3r/Utils/FixModelByWin10.cpp:270
+#: src/slic3r/Utils/FixModelByWin10.cpp:302
+msgid "Saving mesh into the 3MF container failed."
+msgstr ""
+
+#: src/slic3r/Utils/FixModelByWin10.cpp:340
+msgid "Model fixing"
+msgstr ""
+
+#: src/slic3r/Utils/FixModelByWin10.cpp:341
+msgid "Exporting model"
+msgstr ""
+
+#: src/slic3r/Utils/FixModelByWin10.cpp:368
+msgid "Export of a temporary 3mf file failed"
+msgstr ""
+
+#: src/slic3r/Utils/FixModelByWin10.cpp:383
+msgid "Import of the repaired 3mf file failed"
+msgstr ""
+
+#: src/slic3r/Utils/FixModelByWin10.cpp:385
+msgid "Repaired 3MF file does not contain any object"
+msgstr ""
+
+#: src/slic3r/Utils/FixModelByWin10.cpp:387
+msgid "Repaired 3MF file contains more than one object"
+msgstr ""
+
+#: src/slic3r/Utils/FixModelByWin10.cpp:389
+msgid "Repaired 3MF file does not contain any volume"
+msgstr ""
+
+#: src/slic3r/Utils/FixModelByWin10.cpp:391
+msgid "Repaired 3MF file contains more than one volume"
+msgstr ""
+
+#: src/slic3r/Utils/FixModelByWin10.cpp:400
+msgid "Model repair finished"
+msgstr "ИÑправление модели закончено"
+
+#: src/slic3r/Utils/FixModelByWin10.cpp:406
+msgid "Model repair canceled"
+msgstr "ИÑправление модели отменено"
+
+#: src/slic3r/Utils/FixModelByWin10.cpp:423
+msgid "Model repaired successfully"
+msgstr "ИÑправление модели выполнено уÑпешно"
+
+#: src/slic3r/Utils/FixModelByWin10.cpp:423
+#: src/slic3r/Utils/FixModelByWin10.cpp:426
+msgid "Model Repair by the Netfabb service"
+msgstr "ИÑправление модели через Ñлужбу Netfabb"
+
+#: src/slic3r/Utils/FixModelByWin10.cpp:426
+msgid "Model repair failed:"
+msgstr "Ошибка при иÑправлении модели:"
+
+#: src/slic3r/Utils/FlashAir.cpp:58
+msgid "Upload not enabled on FlashAir card."
+msgstr ""
+
+#: src/slic3r/Utils/FlashAir.cpp:68
+msgid "Connection to FlashAir works correctly and upload is enabled."
+msgstr "Подключение к FlashAir уÑтановлено и загрузка включена."
+
+#: src/slic3r/Utils/FlashAir.cpp:74
+msgid "Could not connect to FlashAir"
+msgstr "Ðе удалоÑÑŒ подключитьÑÑ Ðº FlashAir"
+
+#: src/slic3r/Utils/FlashAir.cpp:76
+msgid ""
+"Note: FlashAir with firmware 2.00.02 or newer and activated upload function "
+"is required."
+msgstr ""
+"Замечание: требуетÑÑ FlashAir Ñ Ð¿Ñ€Ð¾ÑˆÐ¸Ð²ÐºÐ¾Ð¹ 2.00.02 или новее, а также "
+"включение функции заливки."
+
+#: src/slic3r/Utils/OctoPrint.cpp:83
+msgid "Connection to OctoPrint works correctly."
+msgstr "Подключение к OctoPrint уÑтановлено."
+
+#: src/slic3r/Utils/OctoPrint.cpp:89
+msgid "Could not connect to OctoPrint"
+msgstr "Ðе удалоÑÑŒ подключитьÑÑ Ðº OctoPrint"
+
+#: src/slic3r/Utils/OctoPrint.cpp:91
+msgid "Note: OctoPrint version at least 1.1.0 is required."
+msgstr "Примечание: требуетÑÑ Ð²ÐµÑ€ÑÐ¸Ñ OctoPrint не ниже 1.1.0."
+
+#: src/slic3r/Utils/OctoPrint.cpp:185
+msgid "Connection to Prusa SL1 works correctly."
+msgstr "Подключение к Prusa SL1 уÑтановлено."
+
+#: src/slic3r/Utils/OctoPrint.cpp:191
+msgid "Could not connect to Prusa SLA"
+msgstr "Ðе удалоÑÑŒ подключитьÑÑ Ðº Prusa SLA"
+
+#: src/slic3r/Utils/PresetUpdater.cpp:727
+#, c-format
+msgid "requires min. %s and max. %s"
+msgstr "требуетÑÑ Ð¼Ð¸Ð½. %s и макÑ. %s"
+
+#: src/slic3r/Utils/PresetUpdater.cpp:731
+#, c-format
+msgid "requires min. %s"
+msgstr "требуетÑÑ Ð¼Ð¸Ð½. %s"
+
+#: src/slic3r/Utils/PresetUpdater.cpp:734
+#, c-format
+msgid "requires max. %s"
+msgstr "требуетÑÑ Ð¼Ð°ÐºÑ. %s"
+
+#: src/slic3r/Utils/Http.cpp:73
+msgid ""
+"Could not detect system SSL certificate store. PrusaSlicer will be unable to "
+"establish secure network connections."
+msgstr ""
+
+#: src/slic3r/Utils/Http.cpp:78
+msgid "PrusaSlicer detected system SSL certificate store in: %1%"
+msgstr ""
+
+#: src/slic3r/Utils/Http.cpp:82
+msgid ""
+"To specify the system certificate store manually, please set the %1% "
+"environment variable to the correct CA bundle and restart the application."
+msgstr ""
+
+#: src/slic3r/Utils/Http.cpp:91
+msgid ""
+"CURL init has failed. PrusaSlicer will be unable to establish network "
+"connections. See logs for additional details."
+msgstr ""
+
+#: src/slic3r/Utils/Process.cpp:151
+msgid "Open G-code file:"
+msgstr ""
+
+#: src/libslic3r/GCode.cpp:610
+msgid "There is an object with no extrusions on the first layer."
+msgstr ""
+
+#: src/libslic3r/GCode.cpp:628
+msgid "Empty layers detected, the output would not be printable."
+msgstr ""
+
+#: src/libslic3r/GCode.cpp:629
+msgid "Print z"
+msgstr ""
+
+#: src/libslic3r/GCode.cpp:630
+msgid ""
+"This is usually caused by negligibly small extrusions or by a faulty model. "
+"Try to repair the model or change its orientation on the bed."
+msgstr ""
+
+#: src/libslic3r/ExtrusionEntity.cpp:324 src/libslic3r/ExtrusionEntity.cpp:360
+msgid "Mixed"
+msgstr "Смешанный"
+
+#: src/libslic3r/Flow.cpp:61
+msgid ""
+"Cannot calculate extrusion width for %1%: Variable \"%2%\" not accessible."
+msgstr ""
+
+#: src/libslic3r/Format/3mf.cpp:1667
+msgid ""
+"The selected 3mf file has been saved with a newer version of %1% and is not "
+"compatible."
+msgstr ""
+
+#: src/libslic3r/Format/AMF.cpp:955
+msgid ""
+"The selected amf file has been saved with a newer version of %1% and is not "
+"compatible."
+msgstr ""
+
+#: src/libslic3r/miniz_extension.cpp:91
+msgid "undefined error"
+msgstr "Ð½ÐµÐ¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°"
+
+#: src/libslic3r/miniz_extension.cpp:93
+msgid "too many files"
+msgstr "Ñлишком много файлов"
+
+#: src/libslic3r/miniz_extension.cpp:95
+msgid "file too large"
+msgstr "Ñлишком большой файл"
+
+#: src/libslic3r/miniz_extension.cpp:97
+msgid "unsupported method"
+msgstr "неподдерживаемый метод"
+
+#: src/libslic3r/miniz_extension.cpp:99
+msgid "unsupported encryption"
+msgstr "неподдерживаемое шифрование"
+
+#: src/libslic3r/miniz_extension.cpp:101
+msgid "unsupported feature"
+msgstr "неподдерживаемое ÑвойÑтво"
+
+#: src/libslic3r/miniz_extension.cpp:103
+msgid "failed finding central directory"
+msgstr ""
+
+#: src/libslic3r/miniz_extension.cpp:105
+msgid "not a ZIP archive"
+msgstr ""
+
+#: src/libslic3r/miniz_extension.cpp:107
+msgid "invalid header or archive is corrupted"
+msgstr ""
+
+#: src/libslic3r/miniz_extension.cpp:109
+msgid "unsupported multidisk archive"
+msgstr ""
+
+#: src/libslic3r/miniz_extension.cpp:111
+msgid "decompression failed or archive is corrupted"
+msgstr ""
+
+#: src/libslic3r/miniz_extension.cpp:113
+msgid "compression failed"
+msgstr "Ñбой ÑжатиÑ"
+
+#: src/libslic3r/miniz_extension.cpp:115
+msgid "unexpected decompressed size"
+msgstr ""
+
+#: src/libslic3r/miniz_extension.cpp:117
+msgid "CRC-32 check failed"
+msgstr ""
+
+#: src/libslic3r/miniz_extension.cpp:119
+msgid "unsupported central directory size"
+msgstr ""
+
+#: src/libslic3r/miniz_extension.cpp:121
+msgid "allocation failed"
+msgstr "раÑпределение не удалоÑÑŒ"
+
+#: src/libslic3r/miniz_extension.cpp:123
+msgid "file open failed"
+msgstr ""
+
+#: src/libslic3r/miniz_extension.cpp:125
+msgid "file create failed"
+msgstr ""
+
+#: src/libslic3r/miniz_extension.cpp:127
+msgid "file write failed"
+msgstr "не удалоÑÑŒ запиÑать файл"
+
+#: src/libslic3r/miniz_extension.cpp:129
+msgid "file read failed"
+msgstr ""
+
+#: src/libslic3r/miniz_extension.cpp:131
+msgid "file close failed"
+msgstr ""
+
+#: src/libslic3r/miniz_extension.cpp:133
+msgid "file seek failed"
+msgstr ""
+
+#: src/libslic3r/miniz_extension.cpp:135
+msgid "file stat failed"
+msgstr ""
+
+#: src/libslic3r/miniz_extension.cpp:137
+msgid "invalid parameter"
+msgstr "некорректный параметр"
+
+#: src/libslic3r/miniz_extension.cpp:139
+msgid "invalid filename"
+msgstr ""
+
+#: src/libslic3r/miniz_extension.cpp:141
+msgid "buffer too small"
+msgstr ""
+
+#: src/libslic3r/miniz_extension.cpp:143
+msgid "internal error"
+msgstr "внутреннÑÑ Ð¾ÑˆÐ¸Ð±ÐºÐ°"
+
+#: src/libslic3r/miniz_extension.cpp:145
+msgid "file not found"
+msgstr "файл не найден"
+
+#: src/libslic3r/miniz_extension.cpp:147
+msgid "archive is too large"
+msgstr ""
+
+#: src/libslic3r/miniz_extension.cpp:149
+msgid "validation failed"
+msgstr "проверка не удалаÑÑŒ"
+
+#: src/libslic3r/miniz_extension.cpp:151
+msgid "write calledback failed"
+msgstr ""
+
+#: src/libslic3r/Preset.cpp:1258
+msgid "filament"
+msgstr "пруток"
+
+#: src/libslic3r/Print.cpp:1247
+msgid "All objects are outside of the print volume."
+msgstr "Ð’Ñе объекты находÑÑ‚ÑÑ Ð·Ð° пределами объёма печати."
+
+#: src/libslic3r/Print.cpp:1250
+msgid "The supplied settings will cause an empty print."
+msgstr "Заданные наÑтройки приведут к пуÑтой печати."
+
+#: src/libslic3r/Print.cpp:1254
+msgid "Some objects are too close; your extruder will collide with them."
+msgstr ""
+"Ðекоторые объекты находÑÑ‚ÑÑ Ñлишком близко друг к другу. ЭкÑтрудер при "
+"печати ÑтолкнётÑÑ Ñ Ð½Ð¸Ð¼Ð¸."
+
+#: src/libslic3r/Print.cpp:1256
+msgid ""
+"Some objects are too tall and cannot be printed without extruder collisions."
+msgstr ""
+"Ðекоторые объекты Ñлишком выÑокие и при печати ÑкÑтрудер ÑтолкнётÑÑ Ñ Ð½Ð¸Ð¼Ð¸."
+
+#: src/libslic3r/Print.cpp:1265
+msgid "The Spiral Vase option can only be used when printing a single object."
+msgstr ""
+"Режим «CÐ¿Ð¸Ñ€Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ð°Ð·Ð°Â» может иÑпользоватьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ при печати одиночного "
+"объекта."
+
+#: src/libslic3r/Print.cpp:1272
+msgid ""
+"The Spiral Vase option can only be used when printing single material "
+"objects."
+msgstr "Ð’ режиме \"CÐ¿Ð¸Ñ€Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ð°Ð·Ð°\" можно печатать только одним материалом."
+
+#: src/libslic3r/Print.cpp:1285
+msgid ""
+"The wipe tower is only supported if all extruders have the same nozzle "
+"diameter and use filaments of the same diameter."
+msgstr ""
+"Ð§ÐµÑ€Ð½Ð¾Ð²Ð°Ñ Ð±Ð°ÑˆÐ½Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÑ‚ÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾, еÑли у вÑех ÑкÑтрудеров одинаковый "
+"диаметр Ñопла и иÑпользуетÑÑ Ð¿Ñ€ÑƒÑ‚Ð¾Ðº одинакового диаметра."
+
+#: src/libslic3r/Print.cpp:1291
+msgid ""
+"The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, "
+"RepRapFirmware and Repetier G-code flavors."
+msgstr ""
+
+#: src/libslic3r/Print.cpp:1293
+msgid ""
+"The Wipe Tower is currently only supported with the relative extruder "
+"addressing (use_relative_e_distances=1)."
+msgstr ""
+"Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð´Ð»Ñ Ñ€ÐµÐ¶Ð¸Ð¼Ð° башни очиÑтки поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ "
+"отноÑÐ¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð°Ð´Ñ€ÐµÑÐ°Ñ†Ð¸Ñ ÑкÑтрудера (use_relative_e_distances=1)."
+
+#: src/libslic3r/Print.cpp:1295
+msgid "Ooze prevention is currently not supported with the wipe tower enabled."
+msgstr ""
+
+#: src/libslic3r/Print.cpp:1297
+msgid ""
+"The Wipe Tower currently does not support volumetric E (use_volumetric_e=0)."
+msgstr ""
+
+#: src/libslic3r/Print.cpp:1299
+msgid ""
+"The Wipe Tower is currently not supported for multimaterial sequential "
+"prints."
+msgstr ""
+"Режим башни очиÑтки применим Ð´Ð»Ñ Ð½ÐµÑкольких объектов только в том Ñлучае, "
+"еÑли они имеют одинаковую выÑоту ÑлоÑ."
+
+#: src/libslic3r/Print.cpp:1320
+msgid ""
+"The Wipe Tower is only supported for multiple objects if they have equal "
+"layer heights"
+msgstr ""
+"Режим башни очиÑтки применим Ð´Ð»Ñ Ð½ÐµÑкольких объектов только в том Ñлучае, "
+"еÑли они имеют одинаковую выÑоту ÑлоÑ"
+
+#: src/libslic3r/Print.cpp:1322
+msgid ""
+"The Wipe Tower is only supported for multiple objects if they are printed "
+"over an equal number of raft layers"
+msgstr ""
+"Режим башни очиÑтки применим Ð´Ð»Ñ Ð½ÐµÑкольких объектов только в том Ñлучае, "
+"еÑли они имеют одинаковое чиÑло Ñлоёв подложки"
+
+#: src/libslic3r/Print.cpp:1324
+msgid ""
+"The Wipe Tower is only supported for multiple objects if they are printed "
+"with the same support_material_contact_distance"
+msgstr ""
+"Ð‘Ð°ÑˆÐ½Ñ Ð¾Ñ‡Ð¸Ñтки поддерживаетÑÑ Ð´Ð»Ñ Ð½ÐµÑкольких объектов только в том Ñлучае, "
+"еÑли они печатаютÑÑ Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñ‹Ð¼ значением support_material_contact_distance"
+
+#: src/libslic3r/Print.cpp:1326
+msgid ""
+"The Wipe Tower is only supported for multiple objects if they are sliced "
+"equally."
+msgstr ""
+"Режим башни очиÑтки применим Ð´Ð»Ñ Ð½ÐµÑкольких объектов только в том Ñлучае, "
+"еÑли они нарезаны одинаково."
+
+#: src/libslic3r/Print.cpp:1368
+msgid ""
+"The Wipe tower is only supported if all objects have the same variable layer "
+"height"
+msgstr ""
+"Ð§ÐµÑ€Ð½Ð¾Ð²Ð°Ñ Ð±Ð°ÑˆÐ½Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð¸Ð²Ð°ÐµÑ‚ÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾, еÑли вÑе объекты имеют одинаковую "
+"значение наÑтройки переменной выÑоты ÑлоÑ"
+
+#: src/libslic3r/Print.cpp:1394
+msgid ""
+"One or more object were assigned an extruder that the printer does not have."
+msgstr ""
+"Ð”Ð»Ñ Ð¾Ð´Ð½Ð¾Ð³Ð¾ или неÑкольких объектов был назначен ÑкÑтрудер, который у "
+"принтера отÑутÑтвует."
+
+#: src/libslic3r/Print.cpp:1403
+msgid "%1%=%2% mm is too low to be printable at a layer height %3% mm"
+msgstr ""
+
+#: src/libslic3r/Print.cpp:1406
+msgid "Excessive %1%=%2% mm to be printable with a nozzle diameter %3% mm"
+msgstr ""
+
+#: src/libslic3r/Print.cpp:1417
+msgid ""
+"Printing with multiple extruders of differing nozzle diameters. If support "
+"is to be printed with the current extruder (support_material_extruder == 0 "
+"or support_material_interface_extruder == 0), all nozzles have to be of the "
+"same diameter."
+msgstr ""
+"Печать неÑколькими ÑкÑтрудерами Ñ Ñоплами различного диаметра. ЕÑли "
+"поддержка должна быть напечатана текущим ÑкÑтрудером "
+"(support_material_extruder == 0 или support_material_interface_extruder == "
+"0), вÑе Ñопла должны иметь одинаковый диаметр."
+
+#: src/libslic3r/Print.cpp:1425
+msgid ""
+"For the Wipe Tower to work with the soluble supports, the support layers "
+"need to be synchronized with the object layers."
+msgstr ""
+"Ð”Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы Ð±Ð°ÑˆÐ½Ñ Ð¾Ñ‡Ð¸Ñтки работала Ñ Ñ€Ð°Ñтворимыми поддержками, Ñлои "
+"поддержек должны быть Ñинхронизированы Ñо ÑлоÑми объекта."
+
+#: src/libslic3r/Print.cpp:1429
+msgid ""
+"The Wipe Tower currently supports the non-soluble supports only if they are "
+"printed with the current extruder without triggering a tool change. (both "
+"support_material_extruder and support_material_interface_extruder need to be "
+"set to 0)."
+msgstr ""
+"Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð±Ð°ÑˆÐ½Ñ Ð¾Ñ‡Ð¸Ñтки поддерживает нераÑтворимые поддержки только "
+"в том Ñлучае, еÑли они печатаютÑÑ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ð¼ ÑкÑтрудером, без запуÑка Ñмены "
+"Ñопла. (Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ \"ЭкÑтрудер, печатающий поддержки/подложки/юбки\" и "
+"\"ЭкÑтрудер, печатающий ÑвÑзующий Ñлой поддержки/подложки\" должны быть "
+"уÑтановлены в 0)."
+
+#: src/libslic3r/Print.cpp:1451
+msgid "First layer height can't be greater than nozzle diameter"
+msgstr "Ð’Ñ‹Ñота первого ÑÐ»Ð¾Ñ Ð½Ðµ может быть больше диаметра Ñопла"
+
+#: src/libslic3r/Print.cpp:1456
+msgid "Layer height can't be greater than nozzle diameter"
+msgstr "Ð’Ñ‹Ñота ÑÐ»Ð¾Ñ Ð½Ðµ может быть больше диаметра Ñопла"
+
+#: src/libslic3r/Print.cpp:1615
+msgid "Infilling layers"
+msgstr "Слоёв заполнениÑ"
+
+#: src/libslic3r/Print.cpp:1641
+msgid "Generating skirt"
+msgstr "ГенерируетÑÑ ÑŽÐ±ÐºÐ°"
+
+#: src/libslic3r/Print.cpp:1650
+msgid "Generating brim"
+msgstr "ГенерируетÑÑ ÐºÐ°Ð¹Ð¼Ð°"
+
+#: src/libslic3r/Print.cpp:1673
+msgid "Exporting G-code"
+msgstr "ЭкÑпортируетÑÑ G-код"
+
+#: src/libslic3r/Print.cpp:1677
+msgid "Generating G-code"
+msgstr "ГенерируетÑÑ G-код"
+
+#: src/libslic3r/SLA/Pad.cpp:532
+msgid "Pad brim size is too small for the current configuration."
+msgstr ""
+
+#: src/libslic3r/SLAPrint.cpp:628
+msgid ""
+"Cannot proceed without support points! Add support points or disable support "
+"generation."
+msgstr ""
+
+#: src/libslic3r/SLAPrint.cpp:640
+msgid ""
+"Elevation is too low for object. Use the \"Pad around object\" feature to "
+"print the object without elevation."
+msgstr ""
+
+#: src/libslic3r/SLAPrint.cpp:646
+msgid ""
+"The endings of the support pillars will be deployed on the gap between the "
+"object and the pad. 'Support base safety distance' has to be greater than "
+"the 'Pad object gap' parameter to avoid this."
+msgstr ""
+
+#: src/libslic3r/SLAPrint.cpp:661
+msgid "Exposition time is out of printer profile bounds."
+msgstr ""
+
+#: src/libslic3r/SLAPrint.cpp:668
+msgid "Initial exposition time is out of printer profile bounds."
+msgstr ""
+
+#: src/libslic3r/SLAPrint.cpp:784
+msgid "Slicing done"
+msgstr "Ðарезка завершена"
+
+#: src/libslic3r/SLAPrintSteps.cpp:44
+msgid "Hollowing model"
+msgstr ""
+
+#: src/libslic3r/SLAPrintSteps.cpp:45
+msgid "Drilling holes into model."
+msgstr ""
+
+#: src/libslic3r/SLAPrintSteps.cpp:46
+msgid "Slicing model"
+msgstr "Ðарезка модели"
+
+#: src/libslic3r/SLAPrintSteps.cpp:47 src/libslic3r/SLAPrintSteps.cpp:359
+msgid "Generating support points"
+msgstr "ГенерируютÑÑ Ð²Ñпомогательные Ñтруктуры"
+
+#: src/libslic3r/SLAPrintSteps.cpp:48
+msgid "Generating support tree"
+msgstr "ГенерируетÑÑ Ð²Ñпомогательное дерево"
+
+#: src/libslic3r/SLAPrintSteps.cpp:49
+msgid "Generating pad"
+msgstr ""
+
+#: src/libslic3r/SLAPrintSteps.cpp:50
+msgid "Slicing supports"
+msgstr "ÐарезаютÑÑ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸"
+
+#: src/libslic3r/SLAPrintSteps.cpp:65
+msgid "Merging slices and calculating statistics"
+msgstr ""
+
+#: src/libslic3r/SLAPrintSteps.cpp:66
+msgid "Rasterizing layers"
+msgstr ""
+
+#: src/libslic3r/SLAPrintSteps.cpp:192
+msgid "Too many overlapping holes."
+msgstr ""
+
+#: src/libslic3r/SLAPrintSteps.cpp:201
+msgid ""
+"Drilling holes into the mesh failed. This is usually caused by broken model. "
+"Try to fix it first."
+msgstr ""
+
+#: src/libslic3r/SLAPrintSteps.cpp:247
+msgid ""
+"Slicing had to be stopped due to an internal error: Inconsistent slice index."
+msgstr ""
+
+#: src/libslic3r/SLAPrintSteps.cpp:411 src/libslic3r/SLAPrintSteps.cpp:420
+#: src/libslic3r/SLAPrintSteps.cpp:459
+msgid "Visualizing supports"
+msgstr ""
+
+#: src/libslic3r/SLAPrintSteps.cpp:451
+msgid "No pad can be generated for this model with the current configuration"
+msgstr ""
+
+#: src/libslic3r/SLAPrintSteps.cpp:619
+msgid ""
+"There are unprintable objects. Try to adjust support settings to make the "
+"objects printable."
+msgstr ""
+
+#: src/libslic3r/PrintBase.cpp:72
+msgid "Failed processing of the output_filename_format template."
+msgstr "Ошибка обработки шаблона output_filename_format."
+
+#: src/libslic3r/PrintConfig.cpp:43 src/libslic3r/PrintConfig.cpp:44
+msgid "Printer technology"
+msgstr "Ð¢ÐµÑ…Ð½Ð¾Ð»Ð¾Ð³Ð¸Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°"
+
+#: src/libslic3r/PrintConfig.cpp:51
+msgid "Bed shape"
+msgstr "Форма платформы"
+
+#: src/libslic3r/PrintConfig.cpp:56
+msgid "Bed custom texture"
+msgstr "ПользовательÑÐºÐ°Ñ Ñ‚ÐµÐºÑтура платформы"
+
+#: src/libslic3r/PrintConfig.cpp:61
+msgid "Bed custom model"
+msgstr "ПользовательÑÐºÐ°Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒ подложки"
+
+#: src/libslic3r/PrintConfig.cpp:66
+msgid "Picture sizes to be stored into a .gcode and .sl1 files"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:73
+msgid ""
+"This setting controls the height (and thus the total number) of the slices/"
+"layers. Thinner layers give better accuracy but take more time to print."
+msgstr ""
+"Этот параметр определÑет выÑоту ÑлоÑ. Чем выше значение, тем быÑтрее печать, "
+"но более низкое разрешение, и наоборот. Этот параметр не может превышать "
+"диаметр иÑпользуемого Ñопла (желательно Ñтавить не больше ¾ от Ñтого "
+"диаметра)."
+
+#: src/libslic3r/PrintConfig.cpp:80
+msgid "Max print height"
+msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ñ‹Ñота печати"
+
+#: src/libslic3r/PrintConfig.cpp:81
+msgid ""
+"Set this to the maximum height that can be reached by your extruder while "
+"printing."
+msgstr ""
+"ЗадаётÑÑ Ð¼Ð°ÐºÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ñ‹Ñота, которую может доÑтичь ваш ÑкÑтрудером во Ð²Ñ€ÐµÐ¼Ñ "
+"печати."
+
+#: src/libslic3r/PrintConfig.cpp:89
+msgid "Slice gap closing radius"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:91
+msgid ""
+"Cracks smaller than 2x gap closing radius are being filled during the "
+"triangle mesh slicing. The gap closing operation may reduce the final print "
+"resolution, therefore it is advisable to keep the value reasonably low."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:99
+msgid "Hostname, IP or URL"
+msgstr "Ð˜Ð¼Ñ ÑƒÐ·Ð»Ð°, IP или URL"
+
+#: src/libslic3r/PrintConfig.cpp:100
+msgid ""
+"Slic3r can upload G-code files to a printer host. This field should contain "
+"the hostname, IP address or URL of the printer host instance."
+msgstr ""
+"Slic3r может загрузить файлы G-кода на узел печати. Ð’ Ñтом поле нужно "
+"указать Ð¸Ð¼Ñ ÑƒÐ·Ð»Ð°, IP-Ð°Ð´Ñ€ÐµÑ Ð¸Ð»Ð¸ URL ÑкземплÑра узла печати."
+
+#: src/libslic3r/PrintConfig.cpp:106
+msgid "API Key / Password"
+msgstr "Ключ API / Пароль"
+
+#: src/libslic3r/PrintConfig.cpp:107
+msgid ""
+"Slic3r can upload G-code files to a printer host. This field should contain "
+"the API Key or the password required for authentication."
+msgstr ""
+"Slic3r может загрузить файлы G-кода на узел печати. Ð’ Ñтом поле нужно "
+"указать ключ API или пароль, требуемые Ð´Ð»Ñ Ð°ÑƒÑ‚ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ð¸."
+
+#: src/libslic3r/PrintConfig.cpp:114
+msgid "Name of the printer"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:121
+msgid ""
+"Custom CA certificate file can be specified for HTTPS OctoPrint connections, "
+"in crt/pem format. If left blank, the default OS CA certificate repository "
+"is used."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:127
+msgid "Elephant foot compensation"
+msgstr "КомпенÑÐ°Ñ†Ð¸Ñ Ñ€Ð°ÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€Ð²Ð¾Ð³Ð¾ ÑлоÑ"
+
+#: src/libslic3r/PrintConfig.cpp:129
+msgid ""
+"The first layer will be shrunk in the XY plane by the configured value to "
+"compensate for the 1st layer squish aka an Elephant Foot effect."
+msgstr ""
+"Первый Ñлой будет уменьшен в плоÑкоÑти XY на заданное значение, чтобы "
+"компенÑировать Ñффект \"хлюпанье\" первого ÑлоÑ, извеÑтное как \"ÑÐ»Ð¾Ð½Ð¾Ð²ÑŒÑ "
+"нога\"."
+
+#: src/libslic3r/PrintConfig.cpp:145
+msgid "Password"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:151
+msgid "Printer preset name"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:152
+msgid "Related printer preset name"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:157
+msgid "Authorization Type"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:162
+msgid "API key"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:163
+msgid "HTTP digest"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:176
+msgid "Avoid crossing perimeters"
+msgstr "Избегать переÑÐµÑ‡ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€Ð¸Ð¼ÐµÑ‚Ñ€Ð¾Ð²"
+
+#: src/libslic3r/PrintConfig.cpp:177
+msgid ""
+"Optimize travel moves in order to minimize the crossing of perimeters. This "
+"is mostly useful with Bowden extruders which suffer from oozing. This "
+"feature slows down both the print and the G-code generation."
+msgstr ""
+"Этот параметр призван оптимизировать маршрут Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð°ÑŽÑ‰ÐµÐ¹ головки, "
+"чтобы ÑвеÑти к минимуму переÑечение Ñтенок при движении. Полезно "
+"иÑпользовать Ñ ÑкÑтрудерами Боудена, которые Ñтрадают от проÑачивание "
+"раÑплавленного материала. Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð·Ð°Ð¼ÐµÐ´Ð»Ñет как печать, так и генерацию "
+"G-кода."
+
+#: src/libslic3r/PrintConfig.cpp:184 src/libslic3r/PrintConfig.cpp:2259
+msgid "Other layers"
+msgstr "ПоÑледующие Ñлои"
+
+#: src/libslic3r/PrintConfig.cpp:185
+msgid ""
+"Bed temperature for layers after the first one. Set this to zero to disable "
+"bed temperature control commands in the output."
+msgstr ""
+"Температура платформы Ð´Ð»Ñ Ñлоёв поÑле первого. УÑтановите 0, "
+"чтобы отключить команды ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ¼Ð¿ÐµÑ€Ð°Ñ‚ÑƒÑ€Ð¾Ð¹ платформы в результате."
+
+#: src/libslic3r/PrintConfig.cpp:188
+msgid "Bed temperature"
+msgstr "Температура платформы"
+
+#: src/libslic3r/PrintConfig.cpp:195
+msgid ""
+"This custom code is inserted at every layer change, right before the Z move. "
+"Note that you can use placeholder variables for all Slic3r settings as well "
+"as [layer_num] and [layer_z]."
+msgstr ""
+"Этот пользовательÑкий код вÑтавлÑетÑÑ Ð¿Ñ€Ð¸ каждой Ñмене ÑлоÑ, непоÑредÑтвенно "
+"перед Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¾Ñи Z. Обратите внимание, что вы можете иÑпользовать "
+"шаблонные переменные Ð´Ð»Ñ Ð²Ñех параметров Slic3r, в том чиÑле [layer_num] и "
+"[layer_z]."
+
+#: src/libslic3r/PrintConfig.cpp:205
+msgid "Between objects G-code"
+msgstr "G-код между объектами"
+
+#: src/libslic3r/PrintConfig.cpp:206
+msgid ""
+"This code is inserted between objects when using sequential printing. By "
+"default extruder and bed temperature are reset using non-wait command; "
+"however if M104, M109, M140 or M190 are detected in this custom code, Slic3r "
+"will not add temperature commands. Note that you can use placeholder "
+"variables for all Slic3r settings, so you can put a \"M109 "
+"S[first_layer_temperature]\" command wherever you want."
+msgstr ""
+"Этот код вÑтавлÑетÑÑ Ð¼ÐµÐ¶Ð´Ñƒ объектами при включении поÑледовательной печати. "
+"По умолчанию температура ÑкÑтрудера и платформы ÑбраÑываютÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ "
+"команды без ожиданиÑ; однако, еÑли в Ñтом пользовательÑком коде "
+"обнаруживаютÑÑ ÐºÐ¾Ð¼Ð°Ð½Ð´Ñ‹ M104, M109, M140 или M190, то Slic3r не добавит "
+"команды температуры. Обратите внимание, что вы можете иÑпользовать шаблонные "
+"переменные Ð´Ð»Ñ Ð²Ñех параметров Slic3r, поÑтому вы можете вÑтавить команду "
+"\"M109 S[first_layer_temperature]\" где угодно."
+
+#: src/libslic3r/PrintConfig.cpp:217
+msgid "Number of solid layers to generate on bottom surfaces."
+msgstr "КоличеÑтво Ñплошных Ñлоёв Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ нижних поверхноÑтей."
+
+#: src/libslic3r/PrintConfig.cpp:218
+msgid "Bottom solid layers"
+msgstr "Ðижних Ñплошных Ñлоёв"
+
+#: src/libslic3r/PrintConfig.cpp:226
+msgid ""
+"The number of bottom solid layers is increased above bottom_solid_layers if "
+"necessary to satisfy minimum thickness of bottom shell."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:228
+msgid "Minimum bottom shell thickness"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:234
+msgid "Bridge"
+msgstr "МоÑÑ‚"
+
+#: src/libslic3r/PrintConfig.cpp:235
+msgid ""
+"This is the acceleration your printer will use for bridges. Set zero to "
+"disable acceleration control for bridges."
+msgstr ""
+"УÑкорение, которое принтер будет иÑпользовать Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸ моÑтов. УÑтановить "
+"0, чтобы отключить управление уÑкорением Ð´Ð»Ñ Ð¼Ð¾Ñтов."
+
+#: src/libslic3r/PrintConfig.cpp:237 src/libslic3r/PrintConfig.cpp:380
+#: src/libslic3r/PrintConfig.cpp:923 src/libslic3r/PrintConfig.cpp:1051
+#: src/libslic3r/PrintConfig.cpp:1332 src/libslic3r/PrintConfig.cpp:1381
+#: src/libslic3r/PrintConfig.cpp:1391 src/libslic3r/PrintConfig.cpp:1584
+msgid "mm/s²"
+msgstr "мм/Ѳ"
+
+#: src/libslic3r/PrintConfig.cpp:243
+msgid "Bridging angle"
+msgstr "Угол (направление) печати моÑтов"
+
+#: src/libslic3r/PrintConfig.cpp:245
+msgid ""
+"Bridging angle override. If left to zero, the bridging angle will be "
+"calculated automatically. Otherwise the provided angle will be used for all "
+"bridges. Use 180° for zero angle."
+msgstr ""
+"ÐŸÑ€Ð¸Ð½ÑƒÐ´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚ÑŒ моÑтов в одном, заданном направлении. ЕÑли задано 0, "
+"угол печати моÑтов раÑÑчитываетÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки. Ð’ противном Ñлучае заданный "
+"угол будет иÑпользоватьÑÑ Ð´Ð»Ñ Ð²Ñех моÑтов. Ð”Ð»Ñ Ð½ÑƒÐ»ÐµÐ²Ð¾Ð³Ð¾ угла уÑтановите 180°."
+
+#: src/libslic3r/PrintConfig.cpp:248 src/libslic3r/PrintConfig.cpp:835
+#: src/libslic3r/PrintConfig.cpp:1821 src/libslic3r/PrintConfig.cpp:1831
+#: src/libslic3r/PrintConfig.cpp:2089 src/libslic3r/PrintConfig.cpp:2244
+#: src/libslic3r/PrintConfig.cpp:2443 src/libslic3r/PrintConfig.cpp:2944
+#: src/libslic3r/PrintConfig.cpp:3065
+msgid "°"
+msgstr "°"
+
+#: src/libslic3r/PrintConfig.cpp:254
+msgid "Bridges fan speed"
+msgstr "СкороÑÑ‚ÑŒ вентилÑтора при печати моÑтов"
+
+#: src/libslic3r/PrintConfig.cpp:255
+msgid "This fan speed is enforced during all bridges and overhangs."
+msgstr ""
+"СкороÑÑ‚ÑŒ Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð²ÐµÐ½Ñ‚Ð¸Ð»Ñтора при печати моÑтов и навиÑающих чаÑтей модели."
+
+#: src/libslic3r/PrintConfig.cpp:256 src/libslic3r/PrintConfig.cpp:847
+#: src/libslic3r/PrintConfig.cpp:1220 src/libslic3r/PrintConfig.cpp:1399
+#: src/libslic3r/PrintConfig.cpp:1462 src/libslic3r/PrintConfig.cpp:1713
+#: src/libslic3r/PrintConfig.cpp:2621 src/libslic3r/PrintConfig.cpp:2858
+#: src/libslic3r/PrintConfig.cpp:2984
+msgid "%"
+msgstr "%"
+
+#: src/libslic3r/PrintConfig.cpp:263
+msgid "Bridge flow ratio"
+msgstr "Соотношение потока при печати моÑтов"
+
+#: src/libslic3r/PrintConfig.cpp:265
+msgid ""
+"This factor affects the amount of plastic for bridging. You can decrease it "
+"slightly to pull the extrudates and prevent sagging, although default "
+"settings are usually good and you should experiment with cooling (use a fan) "
+"before tweaking this."
+msgstr ""
+"Этот параметр задаёт количеÑтво плаÑтика, затрачивающегоÑÑ Ð½Ð° поÑтроение "
+"моÑтов. Ð’ большинÑтве Ñлучаев наÑтроек по умолчанию (1) доÑтаточно, тем не "
+"менее, при печати некоторых объектов уменьшение параметра может Ñократить "
+"провиÑание плаÑтика при печати моÑтов. ЕÑли при печати моÑтов протÑгиваемый "
+"пруток рвётÑÑ, параметр нужно увеличить (например, до 1.1). Перед "
+"редактированием Ñтого параметра не забывайте, что регулировать качеÑтво "
+"натÑжки моÑтов можно и при помощи обдува модели."
+
+#: src/libslic3r/PrintConfig.cpp:275
+msgid "Bridges"
+msgstr "МоÑÑ‚Ñ‹"
+
+#: src/libslic3r/PrintConfig.cpp:277
+msgid "Speed for printing bridges."
+msgstr "СкороÑÑ‚ÑŒ печати моÑтов."
+
+#: src/libslic3r/PrintConfig.cpp:278 src/libslic3r/PrintConfig.cpp:654
+#: src/libslic3r/PrintConfig.cpp:662 src/libslic3r/PrintConfig.cpp:671
+#: src/libslic3r/PrintConfig.cpp:679 src/libslic3r/PrintConfig.cpp:706
+#: src/libslic3r/PrintConfig.cpp:725 src/libslic3r/PrintConfig.cpp:987
+#: src/libslic3r/PrintConfig.cpp:1166 src/libslic3r/PrintConfig.cpp:1239
+#: src/libslic3r/PrintConfig.cpp:1315 src/libslic3r/PrintConfig.cpp:1349
+#: src/libslic3r/PrintConfig.cpp:1361 src/libslic3r/PrintConfig.cpp:1371
+#: src/libslic3r/PrintConfig.cpp:1421 src/libslic3r/PrintConfig.cpp:1480
+#: src/libslic3r/PrintConfig.cpp:1614 src/libslic3r/PrintConfig.cpp:1788
+#: src/libslic3r/PrintConfig.cpp:1797 src/libslic3r/PrintConfig.cpp:2223
+#: src/libslic3r/PrintConfig.cpp:2350
+msgid "mm/s"
+msgstr "мм/Ñ"
+
+#: src/libslic3r/PrintConfig.cpp:285
+msgid "Brim width"
+msgstr "Ширина каймы"
+
+#: src/libslic3r/PrintConfig.cpp:286
+msgid ""
+"Horizontal width of the brim that will be printed around each object on the "
+"first layer."
+msgstr ""
+"Ð“Ð¾Ñ€Ð¸Ð·Ð¾Ð½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ ÑˆÐ¸Ñ€Ð¸Ð½Ð° каймы, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±ÑƒÐ´ÐµÑ‚ печататьÑÑ Ð½Ð° первом Ñлое вокруг "
+"каждого объекта."
+
+#: src/libslic3r/PrintConfig.cpp:293
+msgid "Clip multi-part objects"
+msgstr "Обрезать ÑоÑтавные объекты (ÑоÑтоÑщие из неÑкольких чаÑтей)"
+
+#: src/libslic3r/PrintConfig.cpp:294
+msgid ""
+"When printing multi-material objects, this settings will make Slic3r to clip "
+"the overlapping object parts one by the other (2nd part will be clipped by "
+"the 1st, 3rd part will be clipped by the 1st and 2nd etc)."
+msgstr ""
+"При печати объектов неÑколькими материалами Ñта наÑтройка заÑтавлÑет slic3r "
+"обрезать чаÑти, которые перекрываютÑÑ Ð´Ñ€ÑƒÐ³ другом (Ð²Ñ‚Ð¾Ñ€Ð°Ñ Ñ‡Ð°ÑÑ‚ÑŒ будет "
+"обрезана первой, Ñ‚Ñ€ÐµÑ‚ÑŒÑ - первой и второй и Ñ‚.д.)."
+
+#: src/libslic3r/PrintConfig.cpp:301
+msgid "Colorprint height"
+msgstr "Ð’Ñ‹Ñота цветной печати"
+
+#: src/libslic3r/PrintConfig.cpp:302
+msgid "Heights at which a filament change is to occur."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:312
+msgid "Compatible printers condition"
+msgstr "УÑÐ»Ð¾Ð²Ð¸Ñ ÑовмеÑтимоÑти Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð¾Ð¼"
+
+#: src/libslic3r/PrintConfig.cpp:313
+msgid ""
+"A boolean expression using the configuration values of an active printer "
+"profile. If this expression evaluates to true, this profile is considered "
+"compatible with the active printer profile."
+msgstr ""
+"ЛогичеÑкое выражение, иÑпользующее Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ активного Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ "
+"принтера. ЕÑли Ñто выражение имеет значение true, Ñтот профиль ÑчитаетÑÑ "
+"ÑовмеÑтимым Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼ профилем принтера."
+
+#: src/libslic3r/PrintConfig.cpp:327
+msgid "Compatible print profiles condition"
+msgstr "УÑÐ»Ð¾Ð²Ð¸Ñ ÑовмеÑтимоÑти Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»ÐµÐ¼ печати"
+
+#: src/libslic3r/PrintConfig.cpp:328
+msgid ""
+"A boolean expression using the configuration values of an active print "
+"profile. If this expression evaluates to true, this profile is considered "
+"compatible with the active print profile."
+msgstr ""
+"ЛогичеÑкое выражение, иÑпользующее Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÐºÐ¾Ð½Ñ„Ð¸Ð³ÑƒÑ€Ð°Ñ†Ð¸Ð¸ активного Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ "
+"принтера. ЕÑли Ñто выражение имеет значение true, Ñтот профиль ÑчитаетÑÑ "
+"ÑовмеÑтимым Ñ Ð°ÐºÑ‚Ð¸Ð²Ð½Ñ‹Ð¼ профилем принтера."
+
+#: src/libslic3r/PrintConfig.cpp:345
+msgid "Complete individual objects"
+msgstr "Печатать объекты поÑледовательно"
+
+#: src/libslic3r/PrintConfig.cpp:346
+msgid ""
+"When printing multiple objects or copies, this feature will complete each "
+"object before moving onto next one (and starting it from its bottom layer). "
+"This feature is useful to avoid the risk of ruined prints. Slic3r should "
+"warn and prevent you from extruder collisions, but beware."
+msgstr ""
+"Когда печатаетÑÑ Ð½ÐµÑколько объектов или копий, Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñет "
+"печатать их по очереди — Ñначала будет напечатана один, потом второй (и "
+"печать начинаетÑÑ Ñ ÐµÐ³Ð¾ нижнего ÑлоÑ). ПозволÑет избежать риÑка иÑпортить "
+"вÑÑŽ печать целиком. Slic3r должен предупреждать и предотвращать ÑÑ‚Ð¾Ð»ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ "
+"ÑкÑтрудера, но иÑпользуйте аккуратно."
+
+#: src/libslic3r/PrintConfig.cpp:354
+msgid "Enable auto cooling"
+msgstr "ÐвтоматичеÑкое управление охлаждением"
+
+#: src/libslic3r/PrintConfig.cpp:355
+msgid ""
+"This flag enables the automatic cooling logic that adjusts print speed and "
+"fan speed according to layer printing time."
+msgstr ""
+"Программа задейÑтвует алгоритм автоматичеÑкого Ð¾Ñ…Ð»Ð°Ð¶Ð´ÐµÐ½Ð¸Ñ Ð¸ Ñама регулирует "
+"ÑкороÑÑ‚ÑŒ печати и ÑкороÑÑ‚ÑŒ вентилÑтора в завиÑимоÑти от времени печати ÑлоÑ."
+
+#: src/libslic3r/PrintConfig.cpp:360
+msgid "Cooling tube position"
+msgstr "ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ Ð¾Ñ…Ð»Ð°Ð¶Ð´Ð°ÑŽÑ‰ÐµÐ¹ трубки"
+
+#: src/libslic3r/PrintConfig.cpp:361
+msgid "Distance of the center-point of the cooling tube from the extruder tip."
+msgstr ""
+"РаÑÑтоÑние между центральной точкой охлаждающей трубки и кончиком ÑкÑтрудера."
+
+#: src/libslic3r/PrintConfig.cpp:368
+msgid "Cooling tube length"
+msgstr "Длина охлаждающей трубки"
+
+#: src/libslic3r/PrintConfig.cpp:369
+msgid "Length of the cooling tube to limit space for cooling moves inside it."
+msgstr ""
+"Длина трубки Ð¾Ñ…Ð»Ð°Ð¶Ð´ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ охлаждающих "
+"движениÑÑ…."
+
+#: src/libslic3r/PrintConfig.cpp:377
+msgid ""
+"This is the acceleration your printer will be reset to after the role-"
+"specific acceleration values are used (perimeter/infill). Set zero to "
+"prevent resetting acceleration at all."
+msgstr ""
+"Это уÑкорение, на которое переключитÑÑ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€ поÑле иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ "
+"определённых наÑтроек уÑкорениÑ, например уÑтановленных Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸ периметра/"
+"заполнениÑ. УÑтановите 0, чтобы предотвратить ÑÐ±Ñ€Ð¾Ñ ÑƒÑÐºÐ¾Ñ€ÐµÐ½Ð¸Ñ Ð²Ð¾Ð¾Ð±Ñ‰Ðµ."
+
+#: src/libslic3r/PrintConfig.cpp:386
+msgid "Default filament profile"
+msgstr "Профиль прутка по умолчанию"
+
+#: src/libslic3r/PrintConfig.cpp:387
+msgid ""
+"Default filament profile associated with the current printer profile. On "
+"selection of the current printer profile, this filament profile will be "
+"activated."
+msgstr ""
+"Профиль прутка по умолчанию, ÑвÑзанный Ñ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ð¼ профилем принтера. При "
+"выборе текущего Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°, будет активирован Ñтот профиль прутка."
+
+#: src/libslic3r/PrintConfig.cpp:393
+msgid "Default print profile"
+msgstr "Профиль печати по умолчанию"
+
+#: src/libslic3r/PrintConfig.cpp:394 src/libslic3r/PrintConfig.cpp:2788
+#: src/libslic3r/PrintConfig.cpp:2799
+msgid ""
+"Default print profile associated with the current printer profile. On "
+"selection of the current printer profile, this print profile will be "
+"activated."
+msgstr ""
+"Профиль печати по умолчанию, ÑвÑзанный Ñ Ñ‚ÐµÐºÑƒÑ‰Ð¸Ð¼ профилем принтера. При "
+"выборе текущего Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°, будет активирован Ñтот профиль печати."
+
+#: src/libslic3r/PrintConfig.cpp:400
+msgid "Disable fan for the first"
+msgstr "Ðе включать вентилÑтор на первых ÑлоÑÑ…"
+
+#: src/libslic3r/PrintConfig.cpp:401
+msgid ""
+"You can set this to a positive value to disable fan at all during the first "
+"layers, so that it does not make adhesion worse."
+msgstr ""
+"Ð’Ñ‹ можете задать положительное значение, чтобы отключить вентилÑтор при "
+"печати первых Ñлоёв, чтобы не ухудшить прилипание."
+
+#: src/libslic3r/PrintConfig.cpp:410
+msgid "Don't support bridges"
+msgstr "Ðе печатать поддержки под моÑтами"
+
+#: src/libslic3r/PrintConfig.cpp:412
+msgid ""
+"Experimental option for preventing support material from being generated "
+"under bridged areas."
+msgstr "ЭкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾Ð¿Ñ†Ð¸Ñ Ð¿Ñ€ÐµÐ¿ÑÑ‚ÑÑ‚Ð²ÑƒÑŽÑ‰Ð°Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸ поддержки под моÑтами."
+
+#: src/libslic3r/PrintConfig.cpp:418
+msgid "Distance between copies"
+msgstr "РаÑÑтоÑние между копиÑми"
+
+#: src/libslic3r/PrintConfig.cpp:419
+msgid "Distance used for the auto-arrange feature of the plater."
+msgstr ""
+"РаÑÑтоÑние между объектами, иÑпользуемое автораÑÑтановкой при компоновке."
+
+#: src/libslic3r/PrintConfig.cpp:427
+msgid ""
+"This end procedure is inserted at the end of the output file. Note that you "
+"can use placeholder variables for all PrusaSlicer settings."
+msgstr ""
+"Это поÑледнÑÑ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð°, вÑтавлÑетÑÑ Ð² конец файла. Обратите внимание, что "
+"вы можете иÑпользовать шаблонные переменные Ð´Ð»Ñ Ð²Ñех параметров PrusaSlicer."
+
+#: src/libslic3r/PrintConfig.cpp:437
+msgid ""
+"This end procedure is inserted at the end of the output file, before the "
+"printer end gcode (and before any toolchange from this filament in case of "
+"multimaterial printers). Note that you can use placeholder variables for all "
+"PrusaSlicer settings. If you have multiple extruders, the gcode is processed "
+"in extruder order."
+msgstr ""
+"Это поÑледнÑÑ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð°, вÑтавлÑетÑÑ Ð² конец файла перед конечным G-кодом "
+"принтера (и перед Ñменой инÑтрумента Ð´Ð»Ñ Ñтого прутка в Ñлучае "
+"многоматериальных принтеров). Обратите внимание, что вы можете иÑпользовать "
+"шаблонные переменные Ð´Ð»Ñ Ð²Ñех параметров PrusaSlicer. ЕÑли имеетÑÑ Ð½ÐµÑколько "
+"ÑкÑтрудеров, G-код обрабатываетÑÑ Ð² ÑоответÑтвии Ñ Ð¿Ð¾Ñ€Ñдковым номером "
+"ÑкÑтрудера."
+
+#: src/libslic3r/PrintConfig.cpp:448
+msgid "Ensure vertical shell thickness"
+msgstr "ОбеÑпечивать вертикальную толщину оболочки"
+
+#: src/libslic3r/PrintConfig.cpp:450
+msgid ""
+"Add solid infill near sloping surfaces to guarantee the vertical shell "
+"thickness (top+bottom solid layers)."
+msgstr ""
+"ДобавлÑет Ñплошные опоры у наклонных поверхноÑтей Ð´Ð»Ñ Ñ‚Ð¾Ð³Ð¾, чтобы "
+"гарантировать вертикальную толщину оболочки (верхние+нижние Ñплошные Ñлои). "
+"Это помогает избежать дыр на наклонной поверхноÑти."
+
+#: src/libslic3r/PrintConfig.cpp:456
+msgid "Top fill pattern"
+msgstr "Шаблон Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²ÐµÑ€Ñ…Ð°"
+
+#: src/libslic3r/PrintConfig.cpp:458
+msgid ""
+"Fill pattern for top infill. This only affects the top visible layer, and "
+"not its adjacent solid shells."
+msgstr ""
+"Шаблон заполнениÑ, которым закрываетÑÑ Ð²ÐµÑ€Ñ…Ð½ÑÑ Ð¿Ð¾Ð²ÐµÑ€Ñ…Ð½Ð¾ÑÑ‚ÑŒ. Это влиÑет "
+"только на внешний видимый Ñлой, а не на прилегающие к нему Ñплошные оболочки."
+
+#: src/libslic3r/PrintConfig.cpp:468 src/libslic3r/PrintConfig.cpp:901
+#: src/libslic3r/PrintConfig.cpp:2204
+msgid "Rectilinear"
+msgstr "ПрÑмолинейный"
+
+#: src/libslic3r/PrintConfig.cpp:469
+msgid "Monotonic"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:470 src/libslic3r/PrintConfig.cpp:902
+msgid "Aligned Rectilinear"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:471 src/libslic3r/PrintConfig.cpp:908
+msgid "Concentric"
+msgstr "КонцентричеÑкий"
+
+#: src/libslic3r/PrintConfig.cpp:472 src/libslic3r/PrintConfig.cpp:912
+msgid "Hilbert Curve"
+msgstr "ÐšÑ€Ð¸Ð²Ð°Ñ Ð“Ð¸Ð»ÑŒÐ±ÐµÑ€Ñ‚Ð°"
+
+#: src/libslic3r/PrintConfig.cpp:473 src/libslic3r/PrintConfig.cpp:913
+msgid "Archimedean Chords"
+msgstr "Хорды Ðрхимеда"
+
+#: src/libslic3r/PrintConfig.cpp:474 src/libslic3r/PrintConfig.cpp:914
+msgid "Octagram Spiral"
+msgstr "Ð¡Ð¿Ð¸Ñ€Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾ÐºÑ‚Ð°Ð³Ñ€Ð°Ð¼Ð¼Ð°"
+
+#: src/libslic3r/PrintConfig.cpp:480
+msgid "Bottom fill pattern"
+msgstr "Шаблон Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½Ð¸Ð·Ð°"
+
+#: src/libslic3r/PrintConfig.cpp:482
+msgid ""
+"Fill pattern for bottom infill. This only affects the bottom external "
+"visible layer, and not its adjacent solid shells."
+msgstr ""
+"Шаблон заполнениÑ, которым закрываетÑÑ Ð½Ð¸Ð¶Ð½ÑÑ Ð¿Ð¾Ð²ÐµÑ€Ñ…Ð½Ð¾ÑÑ‚ÑŒ. Это влиÑет только "
+"на внешний видимый Ñлой, а не на прилегающие к нему Ñплошные оболочки."
+
+#: src/libslic3r/PrintConfig.cpp:491 src/libslic3r/PrintConfig.cpp:502
+msgid "External perimeters"
+msgstr "Внешние периметры"
+
+#: src/libslic3r/PrintConfig.cpp:493
+msgid ""
+"Set this to a non-zero value to set a manual extrusion width for external "
+"perimeters. If left zero, default extrusion width will be used if set, "
+"otherwise 1.125 x nozzle diameter will be used. If expressed as percentage "
+"(for example 200%), it will be computed over layer height."
+msgstr ""
+"УÑтановите значение отличное от 0, чтобы вручную задать ширину ÑкÑтрузии Ð´Ð»Ñ "
+"внешних периметров. ЕÑли оÑтавить 0, будет иÑпользоватьÑÑ \"Ширина ÑкÑтрузии "
+"по умолчанию\" - еÑли она задана, в противном Ñлучае будет иÑпользоватьÑÑ "
+"1,125 x диаметра Ñопла. ЕÑли задано в процентах, параметр вычиÑлÑетÑÑ "
+"отноÑительно выÑоты ÑлоÑ."
+
+#: src/libslic3r/PrintConfig.cpp:496 src/libslic3r/PrintConfig.cpp:605
+#: src/libslic3r/PrintConfig.cpp:945 src/libslic3r/PrintConfig.cpp:958
+#: src/libslic3r/PrintConfig.cpp:1076 src/libslic3r/PrintConfig.cpp:1131
+#: src/libslic3r/PrintConfig.cpp:1157 src/libslic3r/PrintConfig.cpp:1604
+#: src/libslic3r/PrintConfig.cpp:1929 src/libslic3r/PrintConfig.cpp:2078
+#: src/libslic3r/PrintConfig.cpp:2146 src/libslic3r/PrintConfig.cpp:2307
+msgid "mm or %"
+msgstr "мм или %"
+
+#: src/libslic3r/PrintConfig.cpp:504
+msgid ""
+"This separate setting will affect the speed of external perimeters (the "
+"visible ones). If expressed as percentage (for example: 80%) it will be "
+"calculated on the perimeters speed setting above. Set to zero for auto."
+msgstr ""
+"Этот параметр влиÑет на ÑкороÑÑ‚ÑŒ печати внешних периметров (видимых). ЕÑли "
+"задано в процентах, параметр вычиÑлÑетÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно ÑкороÑти печати "
+"внутренних периметров. УÑтановите 0 Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð½Ð°Ñтройки."
+
+#: src/libslic3r/PrintConfig.cpp:507 src/libslic3r/PrintConfig.cpp:967
+#: src/libslic3r/PrintConfig.cpp:1888 src/libslic3r/PrintConfig.cpp:1940
+#: src/libslic3r/PrintConfig.cpp:2190 src/libslic3r/PrintConfig.cpp:2320
+msgid "mm/s or %"
+msgstr "мм/Ñ Ð¸Ð»Ð¸ %"
+
+#: src/libslic3r/PrintConfig.cpp:514
+msgid "External perimeters first"
+msgstr "Внешние периметры печатать первыми"
+
+#: src/libslic3r/PrintConfig.cpp:516
+msgid ""
+"Print contour perimeters from the outermost one to the innermost one instead "
+"of the default inverse order."
+msgstr ""
+"При включении, Ñначала будет печататьÑÑ Ð²Ð½ÐµÑˆÐ½Ð¸Ð¹ Ñлой периметра, потом "
+"внутренний. Ðапример, еÑли периметр ÑоÑтоит из трёх Ñлоёв, то, включив Ñтот "
+"параметр, печать будет идти в Ñледующем порÑдке: Ñначала внешний, потом "
+"Ñредний, потом внутренний Ñлой."
+
+#: src/libslic3r/PrintConfig.cpp:522
+msgid "Extra perimeters if needed"
+msgstr "Дополнительные Ñтенки при необходимоÑти"
+
+#: src/libslic3r/PrintConfig.cpp:524
+#, c-format
+msgid ""
+"Add more perimeters when needed for avoiding gaps in sloping walls. Slic3r "
+"keeps adding perimeters, until more than 70% of the loop immediately above "
+"is supported."
+msgstr ""
+"ДобавлÑет дополнительные Ñтенки, когда Ñто необходимо, чтобы избежать "
+"пробелов в наклонных Ñтенках. Slic3r добавлÑет Ñтенки до тех пор, пока не "
+"будет поддержано более 70% верхнего контура."
+
+#: src/libslic3r/PrintConfig.cpp:534
+msgid ""
+"The extruder to use (unless more specific extruder settings are specified). "
+"This value overrides perimeter and infill extruders, but not the support "
+"extruders."
+msgstr ""
+"ИÑпользуемый ÑкÑтрудер (еÑли не заданы более конкретные параметры "
+"ÑкÑтрудера). Это значение переопределÑет ÑкÑтрудеры периметра и заполнениÑ, "
+"но не ÑкÑтрудеры поддержки."
+
+#: src/libslic3r/PrintConfig.cpp:546
+msgid ""
+"Set this to the vertical distance between your nozzle tip and (usually) the "
+"X carriage rods. In other words, this is the height of the clearance "
+"cylinder around your extruder, and it represents the maximum depth the "
+"extruder can peek before colliding with other printed objects."
+msgstr ""
+"Задаёт вертикальное раÑÑтоÑние между кончиком Ñопла и (обычно) оÑью валов X "
+"на которых ездит каретка. Другими Ñловами, Ñто выÑота воображаемого цилиндра "
+"вокруг ÑкÑтрудера, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñет макÑимальную глубину, до которой "
+"ÑкÑтрудер может опуÑтитьÑÑ, чтобы не ÑтолкнутьÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°Ð¼Ð¸ печати."
+
+#: src/libslic3r/PrintConfig.cpp:557
+msgid ""
+"Set this to the clearance radius around your extruder. If the extruder is "
+"not centered, choose the largest value for safety. This setting is used to "
+"check for collisions and to display the graphical preview in the plater."
+msgstr ""
+"БезопаÑное раÑÑтоÑние (зазор) вокруг ÑкÑтрудера. ЕÑли ÑкÑтрудер уÑтановлен "
+"не по центру, то берётÑÑ Ð½Ð°Ð¸Ð±Ð¾Ð»ÑŒÑˆÐµÐµ безопаÑное значение. Этот параметр "
+"иÑпользуетÑÑ Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ ÑÑ‚Ð¾Ð»ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ ÑкÑтрудера Ñ Ð¼Ð¾Ð´ÐµÐ»ÑŒÑŽ и в "
+"предварительном проÑмотре компоновки."
+
+#: src/libslic3r/PrintConfig.cpp:567
+msgid "Extruder Color"
+msgstr "Цвет ÑкÑтрудера"
+
+#: src/libslic3r/PrintConfig.cpp:568 src/libslic3r/PrintConfig.cpp:628
+msgid "This is only used in the Slic3r interface as a visual help."
+msgstr ""
+"Этот параметр иÑпользуетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в интерфейÑе Slic3r в качеÑтве визуальной "
+"помощи."
+
+#: src/libslic3r/PrintConfig.cpp:574
+msgid "Extruder offset"
+msgstr "Смещение ÑкÑтрудера по оÑÑм X/Y"
+
+#: src/libslic3r/PrintConfig.cpp:575
+msgid ""
+"If your firmware doesn't handle the extruder displacement you need the G-"
+"code to take it into account. This option lets you specify the displacement "
+"of each extruder with respect to the first one. It expects positive "
+"coordinates (they will be subtracted from the XY coordinate)."
+msgstr ""
+"ЕÑли прошивка принтера правильно не обрабатывает раÑположение/Ñмещение "
+"ÑкÑтрудера, Ñледует учеÑÑ‚ÑŒ Ñто в G-коде. Этот параметр позволÑет задать "
+"Ñмещение каждого ÑкÑтрудера отноÑительно первого. ВводÑÑ‚ÑÑ Ð¿Ð¾Ð»Ð¾Ð¶Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ðµ "
+"координаты (они будут вычтены из XY координат)."
+
+#: src/libslic3r/PrintConfig.cpp:584
+msgid "Extrusion axis"
+msgstr "ЭкÑтрузионные оÑи"
+
+#: src/libslic3r/PrintConfig.cpp:585
+msgid ""
+"Use this option to set the axis letter associated to your printer's extruder "
+"(usually E but some printers use A)."
+msgstr ""
+"ИÑпользуйте Ñту опцию, чтобы задать букву оÑи, ÑвÑзанную Ñ ÑкÑтрудером "
+"вашего принтера (обычно Ñто E, но на некоторых принтерах A)."
+
+#: src/libslic3r/PrintConfig.cpp:590
+msgid "Extrusion multiplier"
+msgstr "ЭкÑтрузионный множитель"
+
+#: src/libslic3r/PrintConfig.cpp:591
+msgid ""
+"This factor changes the amount of flow proportionally. You may need to tweak "
+"this setting to get nice surface finish and correct single wall widths. "
+"Usual values are between 0.9 and 1.1. If you think you need to change this "
+"more, check filament diameter and your firmware E steps."
+msgstr ""
+"КоÑффициент количеÑтва подаваемого плаÑтика по Ñравнению Ñ Ð¾Ñновным "
+"значением. Ð’ других ÑлайÑерах называетÑÑ Ð¢ÐµÐºÑƒÑ‡ÐµÑÑ‚ÑŒ (Flow). Вам может "
+"понадобитьÑÑ Ð½Ð°Ñтроить Ñтот параметр, чтобы получить краÑивую поверхноÑÑ‚ÑŒ и "
+"правильную ширину одиночной Ñтенки. Обычные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑоÑтавлÑÑŽÑ‚ от 0.9 до "
+"1.1. ЕÑли вы Ñчитаете, что вам требуетÑÑ Ð±Ð¾Ð»ÑŒÑˆÐµÐµ значение, проверьте диаметр "
+"прутка и шаги ÑкÑтрудера в вашей прошивке."
+
+#: src/libslic3r/PrintConfig.cpp:599
+msgid "Default extrusion width"
+msgstr "Ширина ÑкÑтрузии по умолчанию"
+
+#: src/libslic3r/PrintConfig.cpp:601
+msgid ""
+"Set this to a non-zero value to allow a manual extrusion width. If left to "
+"zero, Slic3r derives extrusion widths from the nozzle diameter (see the "
+"tooltips for perimeter extrusion width, infill extrusion width etc). If "
+"expressed as percentage (for example: 230%), it will be computed over layer "
+"height."
+msgstr ""
+"УÑтановите значение отличное от 0, чтобы вручную задать ширину ÑкÑтрузии. "
+"ЕÑли оÑтавить 0, будет иÑпользоватьÑÑ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¹ диаметр Ñопла. ЕÑли задано в "
+"процентах, параметр вычиÑлÑетÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно выÑоты ÑлоÑ."
+
+#: src/libslic3r/PrintConfig.cpp:611
+msgid "Keep fan always on"
+msgstr "ВентилÑтор включён вÑегда"
+
+#: src/libslic3r/PrintConfig.cpp:612
+msgid ""
+"If this is enabled, fan will never be disabled and will be kept running at "
+"least at its minimum speed. Useful for PLA, harmful for ABS."
+msgstr ""
+"ЕÑли Ñта Ð¾Ð¿Ñ†Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°, вентилÑтор никогда не будет отключатьÑÑ Ð¸ будет "
+"работает Ñ…Ð¾Ñ‚Ñ Ð±Ñ‹ на минимальной ÑкороÑти. Полезно Ð´Ð»Ñ PLA, вредно Ð´Ð»Ñ ABS."
+
+#: src/libslic3r/PrintConfig.cpp:617
+msgid "Enable fan if layer print time is below"
+msgstr "Включить обдув, еÑли Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸ ÑÐ»Ð¾Ñ Ð¼ÐµÐ½ÐµÐµ"
+
+#: src/libslic3r/PrintConfig.cpp:618
+msgid ""
+"If layer print time is estimated below this number of seconds, fan will be "
+"enabled and its speed will be calculated by interpolating the minimum and "
+"maximum speeds."
+msgstr ""
+"ЕÑли Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸ ÑÐ»Ð¾Ñ Ð¾Ñ†ÐµÐ½Ð¸Ð²Ð°ÐµÑ‚ÑÑ Ð½Ð¸Ð¶Ðµ Ñтого количеÑтва Ñекунд, будет "
+"включён вентилÑтор, и его ÑкороÑÑ‚ÑŒ будет раÑÑчитыватьÑÑ Ð¿ÑƒÑ‚Ñ‘Ð¼ интерполÑции "
+"минимальных и макÑимальных ÑкороÑтей."
+
+#: src/libslic3r/PrintConfig.cpp:620 src/libslic3r/PrintConfig.cpp:1876
+msgid "approximate seconds"
+msgstr "приблизительно Ñекунд"
+
+#: src/libslic3r/PrintConfig.cpp:627
+msgid "Color"
+msgstr "Цвет"
+
+#: src/libslic3r/PrintConfig.cpp:633
+msgid "Filament notes"
+msgstr "Примечание о прутке"
+
+#: src/libslic3r/PrintConfig.cpp:634
+msgid "You can put your notes regarding the filament here."
+msgstr "ЗдеÑÑŒ вы можете напиÑать Ñвои Ð¿Ñ€Ð¸Ð¼ÐµÑ‡Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ð¿Ñ€ÑƒÑ‚ÐºÐ°."
+
+#: src/libslic3r/PrintConfig.cpp:642 src/libslic3r/PrintConfig.cpp:1427
+msgid "Max volumetric speed"
+msgstr "МакÑ. Ð¾Ð±ÑŠÑ‘Ð¼Ð½Ð°Ñ ÑкороÑÑ‚ÑŒ"
+
+#: src/libslic3r/PrintConfig.cpp:643
+msgid ""
+"Maximum volumetric speed allowed for this filament. Limits the maximum "
+"volumetric speed of a print to the minimum of print and filament volumetric "
+"speed. Set to zero for no limit."
+msgstr ""
+"МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾Ð±ÑŠÑ‘Ð¼Ð½Ð°Ñ ÑкороÑÑ‚ÑŒ подачи, Ñ€Ð°Ð·Ñ€ÐµÑˆÑ‘Ð½Ð½Ð°Ñ Ð´Ð»Ñ Ñтого прутка. "
+"Ограничивает макÑимальную объёмную ÑкороÑÑ‚ÑŒ печати до минимальной Ð´Ð»Ñ Ñтого "
+"принтера и прутка. УÑтановите 0, чтобы убрать ограничениÑ."
+
+#: src/libslic3r/PrintConfig.cpp:652
+msgid "Loading speed"
+msgstr "СкороÑÑ‚ÑŒ загрузки"
+
+#: src/libslic3r/PrintConfig.cpp:653
+msgid "Speed used for loading the filament on the wipe tower."
+msgstr "СкороÑÑ‚ÑŒ загрузки прутка на башню очиÑтки."
+
+#: src/libslic3r/PrintConfig.cpp:660
+msgid "Loading speed at the start"
+msgstr "ÐÐ°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ загрузки"
+
+#: src/libslic3r/PrintConfig.cpp:661
+msgid "Speed used at the very beginning of loading phase."
+msgstr "СкороÑÑ‚ÑŒ, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÐµÐ¼Ð°Ñ Ð½Ð° очень ранней Ñтадии загрузки."
+
+#: src/libslic3r/PrintConfig.cpp:668
+msgid "Unloading speed"
+msgstr "СкороÑÑ‚ÑŒ выгрузки"
+
+#: src/libslic3r/PrintConfig.cpp:669
+msgid ""
+"Speed used for unloading the filament on the wipe tower (does not affect "
+"initial part of unloading just after ramming)."
+msgstr ""
+"СкороÑÑ‚ÑŒ выгрузки прутка на башню очиÑтки (не влиÑет на начальную фазу "
+"выгрузки Ñразу поÑле Ñ€Ñмминга)."
+
+#: src/libslic3r/PrintConfig.cpp:677
+msgid "Unloading speed at the start"
+msgstr "ÐÐ°Ñ‡Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ выгрузки"
+
+#: src/libslic3r/PrintConfig.cpp:678
+msgid ""
+"Speed used for unloading the tip of the filament immediately after ramming."
+msgstr "СкороÑÑ‚ÑŒ выгрузки кончика прутка Ñразу поÑле Ñ€Ñмминга."
+
+#: src/libslic3r/PrintConfig.cpp:685
+msgid "Delay after unloading"
+msgstr "Задержка поÑле выгрузки"
+
+#: src/libslic3r/PrintConfig.cpp:686
+msgid ""
+"Time to wait after the filament is unloaded. May help to get reliable "
+"toolchanges with flexible materials that may need more time to shrink to "
+"original dimensions."
+msgstr ""
+"Ð’Ñ€ÐµÐ¼Ñ Ð¾Ð¶Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ñле выгрузки прутка. Это может помочь вам легко Ñменить "
+"Ñопло при печати гибкими материалами, которым требуетÑÑ Ð±Ð¾Ð»ÑŒÑˆÐµ времени, "
+"чтобы вернутьÑÑ Ðº Ñвоим первоначальным размерам."
+
+#: src/libslic3r/PrintConfig.cpp:695
+msgid "Number of cooling moves"
+msgstr "КоличеÑтво охлаждающих движений"
+
+#: src/libslic3r/PrintConfig.cpp:696
+msgid ""
+"Filament is cooled by being moved back and forth in the cooling tubes. "
+"Specify desired number of these moves."
+msgstr ""
+"Пруток охлаждаетÑÑ Ð² охлаждающих трубках путём Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð½Ð°Ð·Ð°Ð´ и вперёд. "
+"Укажите желаемое количеÑтво таких движений."
+
+#: src/libslic3r/PrintConfig.cpp:704
+msgid "Speed of the first cooling move"
+msgstr "СкороÑÑ‚ÑŒ первого охлаждающего движениÑ"
+
+#: src/libslic3r/PrintConfig.cpp:705
+msgid "Cooling moves are gradually accelerating beginning at this speed."
+msgstr "Охлаждающие Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñтепенно уÑкорÑÑŽÑ‚ÑÑ, Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñ Ñтой ÑкороÑти."
+
+#: src/libslic3r/PrintConfig.cpp:712
+msgid "Minimal purge on wipe tower"
+msgstr "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° очиÑтки на башне"
+
+#: src/libslic3r/PrintConfig.cpp:713
+msgid ""
+"After a tool change, the exact position of the newly loaded filament inside "
+"the nozzle may not be known, and the filament pressure is likely not yet "
+"stable. Before purging the print head into an infill or a sacrificial "
+"object, Slic3r will always prime this amount of material into the wipe tower "
+"to produce successive infill or sacrificial object extrusions reliably."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:717
+msgid "mm³"
+msgstr "мм³"
+
+#: src/libslic3r/PrintConfig.cpp:723
+msgid "Speed of the last cooling move"
+msgstr "СкороÑÑ‚ÑŒ поÑледнего охлаждающего движениÑ"
+
+#: src/libslic3r/PrintConfig.cpp:724
+msgid "Cooling moves are gradually accelerating towards this speed."
+msgstr "Охлаждающие Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñтепенно уÑкорÑÑŽÑ‚ до Ñтой ÑкороÑти."
+
+#: src/libslic3r/PrintConfig.cpp:731
+msgid "Filament load time"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ прутка"
+
+#: src/libslic3r/PrintConfig.cpp:732
+msgid ""
+"Time for the printer firmware (or the Multi Material Unit 2.0) to load a new "
+"filament during a tool change (when executing the T code). This time is "
+"added to the total print time by the G-code time estimator."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:739
+msgid "Ramming parameters"
+msgstr "Параметры Ñ€Ñмминга"
+
+#: src/libslic3r/PrintConfig.cpp:740
+msgid ""
+"This string is edited by RammingDialog and contains ramming specific "
+"parameters."
+msgstr ""
+"Эта Ñтрока редактируетÑÑ Ð´Ð¸Ð°Ð»Ð¾Ð³Ð¾Ð²Ñ‹Ð¼ окном Ñ€Ñмминга и Ñодержит его конкретные "
+"параметры."
+
+#: src/libslic3r/PrintConfig.cpp:746
+msgid "Filament unload time"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð³Ñ€ÑƒÐ·ÐºÐ¸ прутка"
+
+#: src/libslic3r/PrintConfig.cpp:747
+msgid ""
+"Time for the printer firmware (or the Multi Material Unit 2.0) to unload a "
+"filament during a tool change (when executing the T code). This time is "
+"added to the total print time by the G-code time estimator."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:755
+msgid ""
+"Enter your filament diameter here. Good precision is required, so use a "
+"caliper and do multiple measurements along the filament, then compute the "
+"average."
+msgstr ""
+"ЗдеÑÑŒ задаётÑÑ Ð´Ð¸Ð°Ð¼ÐµÑ‚Ñ€ иÑпользуемого прутка. ТребуетÑÑ Ñ…Ð¾Ñ€Ð¾ÑˆÐ°Ñ Ñ‚Ð¾Ñ‡Ð½Ð¾ÑÑ‚ÑŒ, "
+"поÑтому иÑпользуйте штангенциркуль, чтобы Ñделать неÑколько измерений вдоль "
+"прутка и вычиÑлить Ñреднее значение."
+
+#: src/libslic3r/PrintConfig.cpp:762 src/libslic3r/PrintConfig.cpp:2699
+#: src/libslic3r/PrintConfig.cpp:2700
+msgid "Density"
+msgstr "ПлотноÑÑ‚ÑŒ"
+
+#: src/libslic3r/PrintConfig.cpp:763
+msgid ""
+"Enter your filament density here. This is only for statistical information. "
+"A decent way is to weigh a known length of filament and compute the ratio of "
+"the length to volume. Better is to calculate the volume directly through "
+"displacement."
+msgstr ""
+"Введите здеÑÑŒ плотноÑÑ‚ÑŒ иÑпользуемого прутка. Это необходимо только Ð´Ð»Ñ "
+"ÑтатиÑтичеÑкой информации. Хорошим методом ÑвлÑетÑÑ Ð²Ð·Ð²ÐµÑˆÐ¸Ð²Ð°Ð½Ð¸Ðµ куÑка прутка "
+"извеÑтной длины и вычиÑление Ð¾Ñ‚Ð½Ð¾ÑˆÐµÐ½Ð¸Ñ Ð´Ð»Ð¸Ð½Ñ‹ к его объёму. Объём же лучше "
+"вычиÑлÑÑ‚ÑŒ непоÑредÑтвенно путём вытеÑÐ½ÐµÐ½Ð¸Ñ Ð¶Ð¸Ð´ÐºÐ¾Ñти."
+
+#: src/libslic3r/PrintConfig.cpp:766
+msgid "g/cm³"
+msgstr "г/Ñм³"
+
+#: src/libslic3r/PrintConfig.cpp:771
+msgid "Filament type"
+msgstr "Тип прутка"
+
+#: src/libslic3r/PrintConfig.cpp:772
+msgid "The filament material type for use in custom G-codes."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:799
+msgid "Soluble material"
+msgstr "РаÑтворимый материал"
+
+#: src/libslic3r/PrintConfig.cpp:800
+msgid "Soluble material is most likely used for a soluble support."
+msgstr "РаÑтворимый материал, чаше вÑего иÑпользуют Ð´Ð»Ñ Ñ€Ð°Ñтворимой поддержки."
+
+#: src/libslic3r/PrintConfig.cpp:806
+msgid ""
+"Enter your filament cost per kg here. This is only for statistical "
+"information."
+msgstr ""
+"Введите ÑтоимоÑÑ‚ÑŒ прутка за 1 кг. Это необходимо только Ð´Ð»Ñ ÑтатиÑтичеÑкой "
+"информации."
+
+#: src/libslic3r/PrintConfig.cpp:807
+msgid "money/kg"
+msgstr "денег/кг"
+
+#: src/libslic3r/PrintConfig.cpp:812
+msgid "Spool weight"
+msgstr "Ð’ÐµÑ ÐºÐ°Ñ‚ÑƒÑˆÐºÐ¸"
+
+#: src/libslic3r/PrintConfig.cpp:813
+msgid ""
+"Enter weight of the empty filament spool. One may weigh a partially consumed "
+"filament spool before printing and one may compare the measured weight with "
+"the calculated weight of the filament with the spool to find out whether the "
+"amount of filament on the spool is sufficient to finish the print."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:817
+msgid "g"
+msgstr "г"
+
+#: src/libslic3r/PrintConfig.cpp:826 src/libslic3r/PrintConfig.cpp:2783
+msgid "(Unknown)"
+msgstr "(ÐеизвеÑтно)"
+
+#: src/libslic3r/PrintConfig.cpp:830
+msgid "Fill angle"
+msgstr "Угол печати заполнениÑ"
+
+#: src/libslic3r/PrintConfig.cpp:832
+msgid ""
+"Default base angle for infill orientation. Cross-hatching will be applied to "
+"this. Bridges will be infilled using the best direction Slic3r can detect, "
+"so this setting does not affect them."
+msgstr ""
+"Базовый угол Ð´Ð»Ñ Ð¾Ñ€Ð¸ÐµÐ½Ñ‚Ð°Ñ†Ð¸Ð¸ шаблона заполнениÑ. Ð”Ð»Ñ Ñтого будет применÑÑ‚ÑŒÑÑ "
+"штриховка креÑÑ‚-накреÑÑ‚. Ð”Ð»Ñ Ð¼Ð¾Ñтов будет иÑпользоватьÑÑ Ð»ÑƒÑ‡ÑˆÐ¸Ð¹ тип "
+"заполнениÑ, так что Ñтот параметр не влиÑет на них."
+
+#: src/libslic3r/PrintConfig.cpp:844
+msgid "Fill density"
+msgstr "ПлотноÑÑ‚ÑŒ заполнениÑ"
+
+#: src/libslic3r/PrintConfig.cpp:846
+msgid "Density of internal infill, expressed in the range 0% - 100%."
+msgstr ""
+"ПлотноÑÑ‚ÑŒ внутреннего заполнениÑ, Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð½Ð°Ñ Ð² диапазоне 0% - 100%. Чем выше "
+"процент заполнениÑ, тем крепче получаетÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚, но печатаетÑÑ Ð¾Ð½Ð° при Ñтом "
+"гораздо дольше."
+
+#: src/libslic3r/PrintConfig.cpp:881
+msgid "Fill pattern"
+msgstr "Шаблон заполнениÑ"
+
+#: src/libslic3r/PrintConfig.cpp:883
+msgid "Fill pattern for general low-density infill."
+msgstr "Задаёт риÑунок, иÑпользуемый Ð´Ð»Ñ ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ð¿Ð»Ð¾Ñ‚Ð½Ð¾Ñти заполнениÑ."
+
+#: src/libslic3r/PrintConfig.cpp:903
+msgid "Grid"
+msgstr "Сетка"
+
+#: src/libslic3r/PrintConfig.cpp:904
+msgid "Triangles"
+msgstr "Треугольники"
+
+#: src/libslic3r/PrintConfig.cpp:905
+msgid "Stars"
+msgstr "Звезды"
+
+#: src/libslic3r/PrintConfig.cpp:906
+msgid "Cubic"
+msgstr "Куб"
+
+#: src/libslic3r/PrintConfig.cpp:907
+msgid "Line"
+msgstr "Линии"
+
+#: src/libslic3r/PrintConfig.cpp:909 src/libslic3r/PrintConfig.cpp:2206
+msgid "Honeycomb"
+msgstr "Медовые Ñоты"
+
+#: src/libslic3r/PrintConfig.cpp:910
+msgid "3D Honeycomb"
+msgstr "3D Ñоты"
+
+#: src/libslic3r/PrintConfig.cpp:911
+msgid "Gyroid"
+msgstr "Гироидное"
+
+#: src/libslic3r/PrintConfig.cpp:915
+msgid "Adaptive Cubic"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:916
+msgid "Support Cubic"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:920 src/libslic3r/PrintConfig.cpp:929
+#: src/libslic3r/PrintConfig.cpp:939 src/libslic3r/PrintConfig.cpp:973
+msgid "First layer"
+msgstr "Первый Ñлой"
+
+#: src/libslic3r/PrintConfig.cpp:921
+msgid ""
+"This is the acceleration your printer will use for first layer. Set zero to "
+"disable acceleration control for first layer."
+msgstr ""
+"УÑкорение, которое принтер будет иÑпользовать Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸ первого ÑлоÑ. "
+"УÑтановить 0, чтобы отключить управление уÑкорением Ð´Ð»Ñ Ð¿ÐµÑ€Ð²Ð¾Ð³Ð¾ ÑлоÑ."
+
+#: src/libslic3r/PrintConfig.cpp:930
+msgid "First layer bed temperature"
+msgstr "Температура платформы на первом Ñлое"
+
+#: src/libslic3r/PrintConfig.cpp:931
+msgid ""
+"Heated build plate temperature for the first layer. Set this to zero to "
+"disable bed temperature control commands in the output."
+msgstr ""
+"Температура платформы Ð´Ð»Ñ Ð¿ÐµÑ€Ð²Ð¾Ð³Ð¾ ÑлоÑ. УÑтановите 0, чтобы "
+"отключить команды ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ¼Ð¿ÐµÑ€Ð°Ñ‚ÑƒÑ€Ð¾Ð¹ платформы в результате."
+
+#: src/libslic3r/PrintConfig.cpp:941
+msgid ""
+"Set this to a non-zero value to set a manual extrusion width for first "
+"layer. You can use this to force fatter extrudates for better adhesion. If "
+"expressed as percentage (for example 120%) it will be computed over first "
+"layer height. If set to zero, it will use the default extrusion width."
+msgstr ""
+"УÑтановите значение отличное от 0, чтобы вручную задать ширину ÑкÑтрузии Ð´Ð»Ñ "
+"первого ÑлоÑ. Ð’Ñ‹ можете поÑтавить большее значение, чем по умолчанию, Ð´Ð»Ñ "
+"лучшей адгезии. ЕÑли задано в процентах, параметр вычиÑлÑетÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно "
+"выÑоты ÑлоÑ. При 0, будет иÑпользоватьÑÑ \"Ширина ÑкÑтрузии по умолчанию\"."
+
+#: src/libslic3r/PrintConfig.cpp:954
+msgid ""
+"When printing with very low layer heights, you might still want to print a "
+"thicker bottom layer to improve adhesion and tolerance for non perfect build "
+"plates. This can be expressed as an absolute value or as a percentage (for "
+"example: 150%) over the default layer height."
+msgstr ""
+"При печати очень тонкими ÑлоÑми на неидеально ровных платформах "
+"Ð´Ð»Ñ Ð»ÑƒÑ‡ÑˆÐµÐ³Ð¾ Ð¿Ñ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð¸Ñ Ð¸ удерживаемоÑти может потребоватьÑÑ Ð¿ÐµÑ‡Ð°Ñ‚ÑŒ нижнего"
+" ÑÐ»Ð¾Ñ ÑˆÐ¸Ñ€Ðµ обычного. "
+"Эта величина задаётÑÑ Ð°Ð±Ñолютным значением или в процентах (например, 150%) "
+"от выÑоты ÑÐ»Ð¾Ñ Ð¿Ð¾ умолчанию."
+
+#: src/libslic3r/PrintConfig.cpp:963
+msgid "First layer speed"
+msgstr "СкороÑÑ‚ÑŒ печати первого ÑлоÑ"
+
+#: src/libslic3r/PrintConfig.cpp:964
+msgid ""
+"If expressed as absolute value in mm/s, this speed will be applied to all "
+"the print moves of the first layer, regardless of their type. If expressed "
+"as a percentage (for example: 40%) it will scale the default speeds."
+msgstr ""
+"ЕÑли задано абÑолютным значением в мм/Ñ, Ñта ÑкороÑÑ‚ÑŒ будет применена ко "
+"вÑем перемещениÑм при печати первого ÑлоÑ, незавиÑимо от их типа. ЕÑли "
+"задано в процентах (например, 40%), то параметр вычиÑлÑетÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно "
+"ÑкороÑтей по умолчанию."
+
+#: src/libslic3r/PrintConfig.cpp:974
+msgid "First layer nozzle temperature"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:975
+msgid ""
+"Nozzle temperature for the first layer. If you want to control temperature "
+"manually during print, set this to zero to disable temperature control "
+"commands in the output G-code."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:985
+msgid ""
+"Speed for filling small gaps using short zigzag moves. Keep this reasonably "
+"low to avoid too much shaking and resonance issues. Set zero to disable gaps "
+"filling."
+msgstr ""
+"СкороÑÑ‚ÑŒ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ¸Ñ… поверхноÑтей (пробелов). Печать проиÑходит "
+"быÑтрыми зигзагообразными движениÑми, в результате, веÑÑŒ принтер может "
+"прилично Ñ‚Ñ€ÑÑти. Задавайте низкие значениÑ, чтобы избежать Ñтого. УÑтановите "
+"0, чтобы отключить заполнение пробелов."
+
+#: src/libslic3r/PrintConfig.cpp:993
+msgid "Verbose G-code"
+msgstr "Подробный G-код"
+
+#: src/libslic3r/PrintConfig.cpp:994
+msgid ""
+"Enable this to get a commented G-code file, with each line explained by a "
+"descriptive text. If you print from SD card, the additional weight of the "
+"file could make your firmware slow down."
+msgstr ""
+"Включите Ñту опцию, чтобы в каждой Ñтроке файла G-кода, приÑутÑтвовал "
+"комментарий Ñ Ð¿Ð¾ÑÑнÑющим текÑтом. При печати Ñ SD-карты, ÑкороÑÑ‚ÑŒ чтение "
+"данных вашей прошивкой может ÑнизитÑÑ Ð·Ð° Ñчёт ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ñ€Ð°Ð·Ð¼ÐµÑ€Ð° файла."
+
+#: src/libslic3r/PrintConfig.cpp:1001
+msgid "G-code flavor"
+msgstr "Вариант G-кода"
+
+#: src/libslic3r/PrintConfig.cpp:1002
+msgid ""
+"Some G/M-code commands, including temperature control and others, are not "
+"universal. Set this option to your printer's firmware to get a compatible "
+"output. The \"No extrusion\" flavor prevents PrusaSlicer from exporting any "
+"extrusion value at all."
+msgstr ""
+"Ðекоторые команды G/M-кода, такие как контроль температуры и другие, не "
+"ÑвлÑÑŽÑ‚ÑÑ ÑƒÐ½Ð¸Ð²ÐµÑ€Ñальными. Выберите тип прошивки вашего принтера, чтобы "
+"получить ÑовмеÑтимый результат. Вариант «Без ÑкÑтрузии» не позволÑет "
+"PrusaSlicer ÑкÑпортировать какие-либо Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑкÑтрузии."
+
+#: src/libslic3r/PrintConfig.cpp:1027
+msgid "No extrusion"
+msgstr "Без ÑкÑтрузии"
+
+#: src/libslic3r/PrintConfig.cpp:1032
+msgid "Label objects"
+msgstr "Помечать объекты"
+
+#: src/libslic3r/PrintConfig.cpp:1033
+msgid ""
+"Enable this to add comments into the G-Code labeling print moves with what "
+"object they belong to, which is useful for the Octoprint CancelObject "
+"plugin. This settings is NOT compatible with Single Extruder Multi Material "
+"setup and Wipe into Object / Wipe into Infill."
+msgstr ""
+"ЕÑли включено, то в Ñтроки G-кода Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÑÑŽÑ‚ÑÑ ÐºÐ¾Ð¼Ð¼ÐµÐ½Ñ‚Ð°Ñ€Ð¸Ð¸ об "
+"объекте, которому они принадлежат, что полезно Ð´Ð»Ñ Ð¼Ð¾Ð´ÑƒÐ»Ñ Octoprint "
+"CancelObject. Эта наÑтройка ÐЕ ÑовмеÑтима Ñ Single Extruder Multi Material "
+"setup и Wipe into Object / Wipe into Infill."
+
+#: src/libslic3r/PrintConfig.cpp:1040
+msgid "High extruder current on filament swap"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1041
+msgid ""
+"It may be beneficial to increase the extruder motor current during the "
+"filament exchange sequence to allow for rapid ramming feed rates and to "
+"overcome resistance when loading a filament with an ugly shaped tip."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1049
+msgid ""
+"This is the acceleration your printer will use for infill. Set zero to "
+"disable acceleration control for infill."
+msgstr ""
+"УÑкорение, которое принтер будет иÑпользовать Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ. УÑтановить 0, "
+"чтобы отключить управление уÑкорением Ð´Ð»Ñ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ."
+
+#: src/libslic3r/PrintConfig.cpp:1057
+msgid "Combine infill every"
+msgstr "ОбъединÑÑ‚ÑŒ заполнение каждые"
+
+#: src/libslic3r/PrintConfig.cpp:1059
+msgid ""
+"This feature allows to combine infill and speed up your print by extruding "
+"thicker infill layers while preserving thin perimeters, thus accuracy."
+msgstr ""
+"Ð”Ð»Ñ Ñкономии времени печати еÑÑ‚ÑŒ возможноÑÑ‚ÑŒ печатать заполнение не на "
+"каждом Ñлое, а Ñкажем, на двух или трёх ÑлоÑÑ… Ñразу. По умолчанию Ñтоит 1, "
+"то еÑÑ‚ÑŒ печатать заполнение в каждом Ñлое. ЕÑли, например, поÑтавить 2, "
+"тогда на два ÑÐ»Ð¾Ñ Ð¿ÐµÑ€Ð¸Ð¼ÐµÑ‚Ñ€Ð° будет печататьÑÑ Ð¾Ð´Ð¸Ð½ Ñлой Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑƒÐ´Ð²Ð¾ÐµÐ½Ð½Ð¾Ð¹ "
+"толщины. При Ñтом ÑохранÑÑŽÑ‚ÑÑ Ñ‚Ð¾Ð½ÐºÐ¸Ðµ периметры, и тем Ñамым точноÑÑ‚ÑŒ."
+
+#: src/libslic3r/PrintConfig.cpp:1062
+msgid "Combine infill every n layers"
+msgstr "ОбъединÑÑ‚ÑŒ заполнение каждые"
+
+#: src/libslic3r/PrintConfig.cpp:1068
+msgid "Length of the infill anchor"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1070
+msgid ""
+"Connect an infill line to an internal perimeter with a short segment of an "
+"additional perimeter. If expressed as percentage (example: 15%) it is "
+"calculated over infill extrusion width. PrusaSlicer tries to connect two "
+"close infill lines to a short perimeter segment. If no such perimeter "
+"segment shorter than infill_anchor_max is found, the infill line is "
+"connected to a perimeter segment at just one side and the length of the "
+"perimeter segment taken is limited to this parameter, but no longer than "
+"anchor_length_max. Set this parameter to zero to disable anchoring "
+"perimeters connected to a single infill line."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1085
+msgid "0 (no open anchors)"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1090 src/libslic3r/PrintConfig.cpp:1112
+msgid "1000 (unlimited)"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1095
+msgid "Maximum length of the infill anchor"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1097
+msgid ""
+"Connect an infill line to an internal perimeter with a short segment of an "
+"additional perimeter. If expressed as percentage (example: 15%) it is "
+"calculated over infill extrusion width. PrusaSlicer tries to connect two "
+"close infill lines to a short perimeter segment. If no such perimeter "
+"segment shorter than this parameter is found, the infill line is connected "
+"to a perimeter segment at just one side and the length of the perimeter "
+"segment taken is limited to infill_anchor, but no longer than this "
+"parameter. Set this parameter to zero to disable anchoring."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1107
+msgid "0 (not anchored)"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1117
+msgid "Infill extruder"
+msgstr "ЭкÑтрудер заполнениÑ"
+
+#: src/libslic3r/PrintConfig.cpp:1119
+msgid "The extruder to use when printing infill."
+msgstr "Ðомер ÑкÑтрудера, которым печатаетÑÑ Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ðµ."
+
+#: src/libslic3r/PrintConfig.cpp:1127
+msgid ""
+"Set this to a non-zero value to set a manual extrusion width for infill. If "
+"left zero, default extrusion width will be used if set, otherwise 1.125 x "
+"nozzle diameter will be used. You may want to use fatter extrudates to speed "
+"up the infill and make your parts stronger. If expressed as percentage (for "
+"example 90%) it will be computed over layer height."
+msgstr ""
+"УÑтановите значение отличное от 0, чтобы вручную задать ширину ÑкÑтрузии Ð´Ð»Ñ "
+"заполнениÑ. ЕÑли оÑтавить 0, будет иÑпользоватьÑÑ \"Ширина ÑкÑтрузии по "
+"умолчанию\" - еÑли она задана, в противном Ñлучае будет иÑпользоватьÑÑ 1,125 "
+"x диаметра Ñопла. Ð’Ñ‹ можете иÑпользовать Ñопла большего диаметра, чтобы "
+"уÑкорить заполнение и Ñделать ваши детали прочнее. ЕÑли задано в процентах, "
+"параметр вычиÑлÑетÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно выÑоты ÑлоÑ."
+
+#: src/libslic3r/PrintConfig.cpp:1137
+msgid "Infill before perimeters"
+msgstr "Сначала печатать заполнение"
+
+#: src/libslic3r/PrintConfig.cpp:1138
+msgid ""
+"This option will switch the print order of perimeters and infill, making the "
+"latter first."
+msgstr ""
+"ИзменÑет порÑдок печати Ñлоёв. Обычно Ñначала печатаетÑÑ Ð¿ÐµÑ€Ð¸Ð¼ÐµÑ‚Ñ€, а потом "
+"заполнение. Включив Ñтот параметр, будет Ñначала печатаете заполнение, а "
+"потом периметр. Имеет ÑмыÑл, еÑли периметр печатаетÑÑ Ð² один Ñлой."
+
+#: src/libslic3r/PrintConfig.cpp:1143
+msgid "Only infill where needed"
+msgstr "Заполнение только там, где нужно"
+
+#: src/libslic3r/PrintConfig.cpp:1145
+msgid ""
+"This option will limit infill to the areas actually needed for supporting "
+"ceilings (it will act as internal support material). If enabled, slows down "
+"the G-code generation due to the multiple checks involved."
+msgstr ""
+"Slic3r проанализирует модель и выберет где именно необходимо заполнение Ð´Ð»Ñ "
+"того, чтобы поддержать внутренние потолки и ÑвеÑÑ‹. Полезно Ð´Ð»Ñ ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ "
+"времени и материалов, но параметр очень влиÑет на прочноÑÑ‚ÑŒ модели, поÑтому "
+"пользоватьÑÑ Ð½Ð°Ð´Ð¾ Ñ Ð¾ÑторожноÑтью. ЕÑли включено, замедлÑет генерацию G-кода "
+"из-за многочиÑленных раÑчётов."
+
+#: src/libslic3r/PrintConfig.cpp:1152
+msgid "Infill/perimeters overlap"
+msgstr "Перекрытие Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñ Ð»Ð¸Ð½Ð¸Ñми периметра"
+
+#: src/libslic3r/PrintConfig.cpp:1154
+msgid ""
+"This setting applies an additional overlap between infill and perimeters for "
+"better bonding. Theoretically this shouldn't be needed, but backlash might "
+"cause gaps. If expressed as percentage (example: 15%) it is calculated over "
+"perimeter extrusion width."
+msgstr ""
+"Параметр указывает на Ñколько миллиметров или процентов печать Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ "
+"будет перекрывать периметры Ð´Ð»Ñ Ð»ÑƒÑ‡ÑˆÐµÐ³Ð¾ ÑоединениÑ. ТеоретичеÑки надобноÑти "
+"в Ñтом нет, но люфты при движении могут вызывать пробелы при печати. ЕÑли "
+"задано в процентах, параметр вычиÑлÑетÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно ширины ÑкÑтрузии "
+"периметра."
+
+#: src/libslic3r/PrintConfig.cpp:1165
+msgid "Speed for printing the internal fill. Set to zero for auto."
+msgstr ""
+"СкороÑÑ‚ÑŒ печати внутреннего заполнениÑ. ЕÑли уÑтановлено 0, то ÑлайÑер "
+"автоматичеÑки наÑтраивает Ñтот параметр."
+
+#: src/libslic3r/PrintConfig.cpp:1173
+msgid "Inherits profile"
+msgstr "ÐаÑледует профиль"
+
+#: src/libslic3r/PrintConfig.cpp:1174
+msgid "Name of the profile, from which this profile inherits."
+msgstr "Ð˜Ð¼Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»Ñ, от которого наÑледуетÑÑ Ð´Ð°Ð½Ð½Ñ‹Ð¹ профиль."
+
+#: src/libslic3r/PrintConfig.cpp:1187
+msgid "Interface shells"
+msgstr "СвÑзующие оболочки"
+
+#: src/libslic3r/PrintConfig.cpp:1188
+msgid ""
+"Force the generation of solid shells between adjacent materials/volumes. "
+"Useful for multi-extruder prints with translucent materials or manual "
+"soluble support material."
+msgstr ""
+"Принудительное Ñоздание замкнутых (Ñплошных) оболочек между Ñмежными "
+"материалами/объёмами. Полезно Ð´Ð»Ñ Ð¼Ð½Ð¾Ð³Ð¾ÑкÑтрудерных принтеров при печати "
+"полупрозрачными материалами или раÑтворимыми поддержками. Помогает избежать "
+"диффузию материалов."
+
+#: src/libslic3r/PrintConfig.cpp:1196
+msgid "Enable ironing"
+msgstr "Включить разглаживание"
+
+#: src/libslic3r/PrintConfig.cpp:1197
+msgid ""
+"Enable ironing of the top layers with the hot print head for smooth surface"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1203 src/libslic3r/PrintConfig.cpp:1205
+msgid "Ironing Type"
+msgstr "Тип разглаживаниÑ"
+
+#: src/libslic3r/PrintConfig.cpp:1210
+msgid "All top surfaces"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1211
+msgid "Topmost surface only"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1212
+msgid "All solid surfaces"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1217
+msgid "Flow rate"
+msgstr "СкороÑÑ‚ÑŒ потока"
+
+#: src/libslic3r/PrintConfig.cpp:1219
+msgid "Percent of a flow rate relative to object's normal layer height."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1227
+msgid "Spacing between ironing passes"
+msgstr "РаÑÑтоÑние между линиÑми поддержки"
+
+#: src/libslic3r/PrintConfig.cpp:1229
+msgid "Distance between ironing lines"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1246
+msgid ""
+"This custom code is inserted at every layer change, right after the Z move "
+"and before the extruder moves to the first layer point. Note that you can "
+"use placeholder variables for all Slic3r settings as well as [layer_num] and "
+"[layer_z]."
+msgstr ""
+"Этот пользовательÑкий код вÑтавлÑетÑÑ Ð¿Ñ€Ð¸ каждой Ñмене ÑлоÑ, Ñразу поÑле "
+"Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¾Ñи Z и до того, как ÑкÑтрудер перемеÑтитьÑÑ Ð² точку первого ÑлоÑ. "
+"Обратите внимание, что вы можете иÑпользовать шаблонные переменные Ð´Ð»Ñ Ð²Ñех "
+"параметров Slic3r, в том чиÑле [layer_num] и [layer_z]."
+
+#: src/libslic3r/PrintConfig.cpp:1257
+msgid "Supports remaining times"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1258
+msgid ""
+"Emit M73 P[percent printed] R[remaining time in minutes] at 1 minute "
+"intervals into the G-code to let the firmware show accurate remaining time. "
+"As of now only the Prusa i3 MK3 firmware recognizes M73. Also the i3 MK3 "
+"firmware supports M73 Qxx Sxx for the silent mode."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1266
+msgid "Supports stealth mode"
+msgstr "Поддержка тихого режима"
+
+#: src/libslic3r/PrintConfig.cpp:1267
+msgid "The firmware supports stealth mode"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1272
+msgid "How to apply limits"
+msgstr "Как применÑÑ‚ÑŒ ограничениÑ"
+
+#: src/libslic3r/PrintConfig.cpp:1273
+msgid "Purpose of Machine Limits"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1275
+msgid "How to apply the Machine Limits"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1280
+msgid "Emit to G-code"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1281
+msgid "Use for time estimate"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1282
+msgid "Ignore"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1305
+msgid "Maximum feedrate X"
+msgstr "МакÑ. ÑкороÑÑ‚ÑŒ подачи X"
+
+#: src/libslic3r/PrintConfig.cpp:1306
+msgid "Maximum feedrate Y"
+msgstr "МакÑ. ÑкороÑÑ‚ÑŒ подачи Y"
+
+#: src/libslic3r/PrintConfig.cpp:1307
+msgid "Maximum feedrate Z"
+msgstr "МакÑ. ÑкороÑÑ‚ÑŒ подачи Z"
+
+#: src/libslic3r/PrintConfig.cpp:1308
+msgid "Maximum feedrate E"
+msgstr "МакÑ. ÑкороÑÑ‚ÑŒ подачи E"
+
+#: src/libslic3r/PrintConfig.cpp:1311
+msgid "Maximum feedrate of the X axis"
+msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ подачи по оÑи X"
+
+#: src/libslic3r/PrintConfig.cpp:1312
+msgid "Maximum feedrate of the Y axis"
+msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ подачи по оÑи Y"
+
+#: src/libslic3r/PrintConfig.cpp:1313
+msgid "Maximum feedrate of the Z axis"
+msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ подачи по оÑи Z"
+
+#: src/libslic3r/PrintConfig.cpp:1314
+msgid "Maximum feedrate of the E axis"
+msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ подачи по оÑи E"
+
+#: src/libslic3r/PrintConfig.cpp:1322
+msgid "Maximum acceleration X"
+msgstr "МакÑ. уÑкорение X"
+
+#: src/libslic3r/PrintConfig.cpp:1323
+msgid "Maximum acceleration Y"
+msgstr "МакÑ. уÑкорение Y"
+
+#: src/libslic3r/PrintConfig.cpp:1324
+msgid "Maximum acceleration Z"
+msgstr "МакÑ. уÑкорение Z"
+
+#: src/libslic3r/PrintConfig.cpp:1325
+msgid "Maximum acceleration E"
+msgstr "МакÑ. уÑкорение E"
+
+#: src/libslic3r/PrintConfig.cpp:1328
+msgid "Maximum acceleration of the X axis"
+msgstr "МакÑимальное уÑкорение по оÑи X"
+
+#: src/libslic3r/PrintConfig.cpp:1329
+msgid "Maximum acceleration of the Y axis"
+msgstr "МакÑимальное уÑкорение по оÑи Y"
+
+#: src/libslic3r/PrintConfig.cpp:1330
+msgid "Maximum acceleration of the Z axis"
+msgstr "МакÑимальное уÑкорение по оÑи Z"
+
+#: src/libslic3r/PrintConfig.cpp:1331
+msgid "Maximum acceleration of the E axis"
+msgstr "МакÑимальное уÑкорение по оÑи E"
+
+#: src/libslic3r/PrintConfig.cpp:1339
+msgid "Maximum jerk X"
+msgstr "МакÑимальный рывок X"
+
+#: src/libslic3r/PrintConfig.cpp:1340
+msgid "Maximum jerk Y"
+msgstr "МакÑимальный рывок Y"
+
+#: src/libslic3r/PrintConfig.cpp:1341
+msgid "Maximum jerk Z"
+msgstr "МакÑимальный рывок Z"
+
+#: src/libslic3r/PrintConfig.cpp:1342
+msgid "Maximum jerk E"
+msgstr "МакÑимальный рывок E"
+
+#: src/libslic3r/PrintConfig.cpp:1345
+msgid "Maximum jerk of the X axis"
+msgstr "МакÑимальный рывок по оÑи X"
+
+#: src/libslic3r/PrintConfig.cpp:1346
+msgid "Maximum jerk of the Y axis"
+msgstr "МакÑимальный рывок по оÑи Y"
+
+#: src/libslic3r/PrintConfig.cpp:1347
+msgid "Maximum jerk of the Z axis"
+msgstr "МакÑимальный рывок по оÑи Z"
+
+#: src/libslic3r/PrintConfig.cpp:1348
+msgid "Maximum jerk of the E axis"
+msgstr "МакÑимальный рывок по оÑи E"
+
+#: src/libslic3r/PrintConfig.cpp:1358
+msgid "Minimum feedrate when extruding"
+msgstr "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ подачи при ÑкÑтрузии"
+
+#: src/libslic3r/PrintConfig.cpp:1360
+msgid "Minimum feedrate when extruding (M205 S)"
+msgstr "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ подачи при ÑкÑтрузии (M205 S)"
+
+#: src/libslic3r/PrintConfig.cpp:1368
+msgid "Minimum travel feedrate"
+msgstr "СкороÑÑ‚ÑŒ подачи при минимальных перемещениÑÑ…"
+
+#: src/libslic3r/PrintConfig.cpp:1370
+msgid "Minimum travel feedrate (M205 T)"
+msgstr "СкороÑÑ‚ÑŒ подачи при минимальных перемещениÑÑ… (M205 T)"
+
+#: src/libslic3r/PrintConfig.cpp:1378
+msgid "Maximum acceleration when extruding"
+msgstr "МакÑ. уÑкорение при выдавливании"
+
+#: src/libslic3r/PrintConfig.cpp:1380
+msgid "Maximum acceleration when extruding (M204 S)"
+msgstr "МакÑимальное уÑкорение при выдавливании (M204 S)"
+
+#: src/libslic3r/PrintConfig.cpp:1388
+msgid "Maximum acceleration when retracting"
+msgstr "МакÑ. уÑкорение при ретракте"
+
+#: src/libslic3r/PrintConfig.cpp:1390
+msgid "Maximum acceleration when retracting (M204 T)"
+msgstr "МакÑимальное уÑкорение при ретракте (M204 T)"
+
+#: src/libslic3r/PrintConfig.cpp:1397 src/libslic3r/PrintConfig.cpp:1406
+msgid "Max"
+msgstr "МакÑимум"
+
+#: src/libslic3r/PrintConfig.cpp:1398
+msgid "This setting represents the maximum speed of your fan."
+msgstr "Этот параметр регулирует макÑимальную ÑкороÑÑ‚ÑŒ Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð²ÐµÐ½Ñ‚Ð¸Ð»Ñтора."
+
+#: src/libslic3r/PrintConfig.cpp:1407
+msgid ""
+"This is the highest printable layer height for this extruder, used to cap "
+"the variable layer height and support layer height. Maximum recommended "
+"layer height is 75% of the extrusion width to achieve reasonable inter-layer "
+"adhesion. If set to 0, layer height is limited to 75% of the nozzle diameter."
+msgstr ""
+"Это Ð½Ð°Ð¸Ð±Ð¾Ð»ÑŒÑˆÐ°Ñ Ð²Ñ‹Ñота печатного ÑÐ»Ð¾Ñ Ð´Ð»Ñ Ñтого ÑкÑтрудера, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ "
+"иÑпользуетÑÑ Ð´Ð»Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ \"ÐŸÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð²Ñ‹Ñота Ñлоёв\" и выÑоты "
+"поддерживающего ÑлоÑ. Ð”Ð»Ñ Ð´Ð¾ÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ñ…Ð¾Ñ€Ð¾ÑˆÐµÐ¹ межÑлойной адгезии, "
+"макÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ€ÐµÐºÐ¾Ð¼ÐµÐ½Ð´ÑƒÐµÐ¼Ð°Ñ Ð²Ñ‹Ñота ÑÐ»Ð¾Ñ ÑоÑтавлÑет 75% ширины ÑкÑтрузии. ЕÑли "
+"уÑтановлено 0, выÑота ÑÐ»Ð¾Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡Ð¸Ð²Ð°ÐµÑ‚ÑÑ 75% диаметра Ñопла."
+
+#: src/libslic3r/PrintConfig.cpp:1417
+msgid "Max print speed"
+msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ печати"
+
+#: src/libslic3r/PrintConfig.cpp:1418
+msgid ""
+"When setting other speed settings to 0 Slic3r will autocalculate the optimal "
+"speed in order to keep constant extruder pressure. This experimental setting "
+"is used to set the highest print speed you want to allow."
+msgstr ""
+"При уÑтановке других параметров ÑкороÑти в 0, Slic3r автоматичеÑки "
+"раÑÑчитает оптимальную ÑкороÑÑ‚ÑŒ Ð´Ð»Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶Ð°Ð½Ð¸Ñ Ð¿Ð¾ÑтоÑнного Ð´Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² "
+"ÑкÑтрудере. Этот ÑкÑпериментальный параметр иÑпользуетÑÑ Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð¸Ñ "
+"желаемой вами макÑимальной ÑкороÑти печати."
+
+#: src/libslic3r/PrintConfig.cpp:1428
+msgid ""
+"This experimental setting is used to set the maximum volumetric speed your "
+"extruder supports."
+msgstr ""
+"ЭкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾Ð¿Ñ†Ð¸Ñ Ð¸ÑпользуетÑÑ Ð´Ð»Ñ ÑƒÑтановки макÑимальной объёмной "
+"ÑкороÑти подачи (выдавливаниÑ) материала, которую поддерживает ваш "
+"ÑкÑтрудер. 0 - без ограничений."
+
+#: src/libslic3r/PrintConfig.cpp:1437
+msgid "Max volumetric slope positive"
+msgstr "МакÑ. положительное объёмное навиÑание"
+
+#: src/libslic3r/PrintConfig.cpp:1438 src/libslic3r/PrintConfig.cpp:1449
+msgid ""
+"This experimental setting is used to limit the speed of change in extrusion "
+"rate. A value of 1.8 mm³/s² ensures, that a change from the extrusion rate "
+"of 1.8 mm³/s (0.45mm extrusion width, 0.2mm extrusion height, feedrate 20 mm/"
+"s) to 5.4 mm³/s (feedrate 60 mm/s) will take at least 2 seconds."
+msgstr ""
+"Этот ÑкÑпериментальный параметр иÑпользуетÑÑ Ð´Ð»Ñ Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ ÑкороÑти "
+"Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑкÑтрузии. Значение 1.8 мм³/Ѳ гарантирует, что изменение ÑкороÑти "
+"ÑкÑтрузии Ñ 1.8 мм³/Ñ (ширина ÑкÑтрузии 0.45 мм, выÑота ÑкÑтрузии 0.2 мм, "
+"ÑкороÑÑ‚ÑŒ подачи 20 мм/Ñ) до 5.4 мм³/Ñ (ÑкороÑÑ‚ÑŒ подачи 60 мм/Ñ) займёт не "
+"менее 2-Ñ… Ñекунд."
+
+#: src/libslic3r/PrintConfig.cpp:1442 src/libslic3r/PrintConfig.cpp:1453
+msgid "mm³/s²"
+msgstr "мм³/Ѳ"
+
+#: src/libslic3r/PrintConfig.cpp:1448
+msgid "Max volumetric slope negative"
+msgstr "МакÑ. отрицательное объёмное навиÑание"
+
+#: src/libslic3r/PrintConfig.cpp:1460 src/libslic3r/PrintConfig.cpp:1469
+msgid "Min"
+msgstr "Минимум"
+
+#: src/libslic3r/PrintConfig.cpp:1461
+msgid "This setting represents the minimum PWM your fan needs to work."
+msgstr "Этот параметр регулирует минимальную ÑкороÑÑ‚ÑŒ Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ð²ÐµÐ½Ñ‚Ð¸Ð»Ñтора."
+
+#: src/libslic3r/PrintConfig.cpp:1470
+msgid ""
+"This is the lowest printable layer height for this extruder and limits the "
+"resolution for variable layer height. Typical values are between 0.05 mm and "
+"0.1 mm."
+msgstr ""
+"Это Ð½Ð°Ð¸Ð¼ÐµÐ½ÑŒÑˆÐ°Ñ Ð²Ñ‹Ñота печатаемого ÑÐ»Ð¾Ñ Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ ÑкÑтрудера и в то же "
+"Ð²Ñ€ÐµÐ¼Ñ Ð½Ð¸Ð¶Ð½Ð¸Ð¹ предел Ð´Ð»Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¸ \"ÐŸÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð²Ñ‹Ñота Ñлоёв\". Обычно Ñто 0.05 "
+"или 0.1 мм."
+
+#: src/libslic3r/PrintConfig.cpp:1478
+msgid "Min print speed"
+msgstr "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ печати"
+
+#: src/libslic3r/PrintConfig.cpp:1479
+msgid "Slic3r will not scale speed down below this speed."
+msgstr ""
+"Ðижний предел того, как медленно Ñлой может быть напечатан. Slic3 не будет "
+"Ñнижать ÑкороÑÑ‚ÑŒ ниже Ñтой."
+
+#: src/libslic3r/PrintConfig.cpp:1486
+msgid "Minimal filament extrusion length"
+msgstr "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° ÑкÑтрузии"
+
+#: src/libslic3r/PrintConfig.cpp:1487
+msgid ""
+"Generate no less than the number of skirt loops required to consume the "
+"specified amount of filament on the bottom layer. For multi-extruder "
+"machines, this minimum applies to each extruder."
+msgstr ""
+"Минимальное количеÑтво плаÑтика, которое должен протолкнуть ÑкÑтрудер при "
+"печати юбки в миллиметрах. Ð”Ð»Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð¾Ð² Ñ Ð½ÐµÑколькими ÑкÑтрудерами Ñтот "
+"минимум отноÑитÑÑ Ðº каждому ÑкÑтрудеру."
+
+#: src/libslic3r/PrintConfig.cpp:1496
+msgid "Configuration notes"
+msgstr "Примечание конфигурации"
+
+#: src/libslic3r/PrintConfig.cpp:1497
+msgid ""
+"You can put here your personal notes. This text will be added to the G-code "
+"header comments."
+msgstr ""
+"ЗдеÑÑŒ вы можете оÑтавить Ñвои Ð·Ð°Ð¼ÐµÑ‡Ð°Ð½Ð¸Ñ Ð´Ð»Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ профилÑ. Этот текÑÑ‚ "
+"будет добавлен к комментариÑм в заголовок G-кода."
+
+#: src/libslic3r/PrintConfig.cpp:1507
+msgid ""
+"This is the diameter of your extruder nozzle (for example: 0.5, 0.35 etc.)"
+msgstr "Диаметр иÑпользуемого Ñопла (например: 0.5, 0.35 и др.)"
+
+#: src/libslic3r/PrintConfig.cpp:1512
+msgid "Host Type"
+msgstr "Тип узла"
+
+#: src/libslic3r/PrintConfig.cpp:1513
+msgid ""
+"Slic3r can upload G-code files to a printer host. This field must contain "
+"the kind of the host."
+msgstr ""
+"Slic3r может загрузить файлы G-кода на узел печати. Это поле должно "
+"Ñодержать тип Ñтого узла."
+
+#: src/libslic3r/PrintConfig.cpp:1530
+msgid "Only retract when crossing perimeters"
+msgstr "Ретракт только при переÑечении периметров"
+
+#: src/libslic3r/PrintConfig.cpp:1531
+msgid ""
+"Disables retraction when the travel path does not exceed the upper layer's "
+"perimeters (and thus any ooze will be probably invisible)."
+msgstr ""
+"При включённом параметре процеÑÑ Ñ€ÐµÑ‚Ñ€Ð°ÐºÑ‚Ð° включаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ тогда, когда "
+"Ñопло выходит за внешний контур."
+
+#: src/libslic3r/PrintConfig.cpp:1538
+msgid ""
+"This option will drop the temperature of the inactive extruders to prevent "
+"oozing. It will enable a tall skirt automatically and move extruders outside "
+"such skirt when changing temperatures."
+msgstr ""
+"Этот параметр Ñнижает температуру неактивных ÑкÑтрудеров Ð´Ð»Ñ Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ "
+"проÑÐ°Ñ‡Ð¸Ð²Ð°Ð½Ð¸Ñ Ñ€Ð°Ñплавленного материала из Ñопла. Это автоматичеÑки активирует "
+"генерацию юбки и перемещает ÑкÑтрудеры на Ñту юбки при изменении температуры."
+
+#: src/libslic3r/PrintConfig.cpp:1545
+msgid "Output filename format"
+msgstr "Формат выходного файла"
+
+#: src/libslic3r/PrintConfig.cpp:1546
+msgid ""
+"You can use all configuration options as variables inside this template. For "
+"example: [layer_height], [fill_density] etc. You can also use [timestamp], "
+"[year], [month], [day], [hour], [minute], [second], [version], "
+"[input_filename], [input_filename_base]."
+msgstr ""
+"Ð’Ñ‹ можете иÑпользовать вÑе параметры в качеÑтве переменных внутри Ñтого "
+"шаблона. Они будÑÑ‚ добавлены к имени файла. Ðапример: [layer_height], "
+"[fill_density]. Так же вы можете иÑпользовать [timestamp], [year], [month], "
+"[day], [hour], [minute], [second], [version], [input_filename], "
+"[input_filename_base]."
+
+#: src/libslic3r/PrintConfig.cpp:1555
+msgid "Detect bridging perimeters"
+msgstr "ОпределÑÑ‚ÑŒ навиÑающие периметры"
+
+#: src/libslic3r/PrintConfig.cpp:1557
+msgid ""
+"Experimental option to adjust flow for overhangs (bridge flow will be used), "
+"to apply bridge speed to them and enable fan."
+msgstr ""
+"ЭкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð¾Ð¿Ñ†Ð¸Ñ. ЕÑли у объекта еÑÑ‚ÑŒ чаÑти имеющие ÑвеÑÑ‹, программа "
+"раÑÑчитает возможноÑÑ‚ÑŒ их печати без поддержки, при Ñтом увеличит обдув "
+"модели и выÑтавит ÑкороÑÑ‚ÑŒ печати, как при печати моÑтов."
+
+#: src/libslic3r/PrintConfig.cpp:1563
+msgid "Filament parking position"
+msgstr "Положение парковки прутка"
+
+#: src/libslic3r/PrintConfig.cpp:1564
+msgid ""
+"Distance of the extruder tip from the position where the filament is parked "
+"when unloaded. This should match the value in printer firmware."
+msgstr ""
+"РаÑÑтоÑние от кончика ÑкÑтрудера до точки, где размещаетÑÑ Ð¿Ñ€ÑƒÑ‚Ð¾Ðº при "
+"выгрузке. РаÑÑтоÑние должно Ñовпадать Ñо значением в прошивке принтера."
+
+#: src/libslic3r/PrintConfig.cpp:1572
+msgid "Extra loading distance"
+msgstr "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° загрузки"
+
+#: src/libslic3r/PrintConfig.cpp:1573
+msgid ""
+"When set to zero, the distance the filament is moved from parking position "
+"during load is exactly the same as it was moved back during unload. When "
+"positive, it is loaded further, if negative, the loading move is shorter "
+"than unloading."
+msgstr ""
+"ЕÑли уÑтановлено 0, то раÑÑтоÑние, которое проходит пруток при перемещении "
+"из Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¿Ð°Ñ€ÐºÐ¾Ð²ÐºÐ¸ во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸, точно такое же, как и при выгрузке. "
+"При положительном значении, она загружаетÑÑ Ð´Ð°Ð»ÑŒÑˆÐµ; при отрицательном, ход "
+"загрузки короче (по Ñравнению Ñ Ð²Ñ‹Ð³Ñ€ÑƒÐ·ÐºÐ¾Ð¹)."
+
+#: src/libslic3r/PrintConfig.cpp:1581 src/libslic3r/PrintConfig.cpp:1598
+#: src/libslic3r/PrintConfig.cpp:1611 src/libslic3r/PrintConfig.cpp:1621
+msgid "Perimeters"
+msgstr "Периметры"
+
+#: src/libslic3r/PrintConfig.cpp:1582
+msgid ""
+"This is the acceleration your printer will use for perimeters. Set zero to "
+"disable acceleration control for perimeters."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1589
+msgid "Perimeter extruder"
+msgstr "ЭкÑтрудер, печатающий внешние периметры"
+
+#: src/libslic3r/PrintConfig.cpp:1591
+msgid ""
+"The extruder to use when printing perimeters and brim. First extruder is 1."
+msgstr ""
+"Ðомер ÑкÑтрудера, которым печатаютÑÑ Ð¿ÐµÑ€Ð¸Ð¼ÐµÑ‚Ñ€Ñ‹ и кайма. Первый ÑкÑтрудер — 1."
+
+#: src/libslic3r/PrintConfig.cpp:1600
+msgid ""
+"Set this to a non-zero value to set a manual extrusion width for perimeters. "
+"You may want to use thinner extrudates to get more accurate surfaces. If "
+"left zero, default extrusion width will be used if set, otherwise 1.125 x "
+"nozzle diameter will be used. If expressed as percentage (for example 200%) "
+"it will be computed over layer height."
+msgstr ""
+"УÑтановите значение отличное от 0, чтобы вручную задать ширину ÑкÑтрузии Ð´Ð»Ñ "
+"периметров. Ð’Ñ‹ можете иÑпользовать более тонкие Ñопла, чтобы получить более "
+"точных поверхноÑтей. ЕÑли оÑтавить 0, будет иÑпользоватьÑÑ \"Ширина "
+"ÑкÑтрузии по умолчанию\" - еÑли она задана, в противном Ñлучае будет "
+"иÑпользоватьÑÑ 1,125 x диаметра Ñопла. ЕÑли задано в процентах, параметр "
+"вычиÑлÑетÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно выÑоты ÑлоÑ."
+
+#: src/libslic3r/PrintConfig.cpp:1613
+msgid ""
+"Speed for perimeters (contours, aka vertical shells). Set to zero for auto."
+msgstr ""
+"СкороÑÑ‚ÑŒ печати периметров (контуров, иначе вертикальных Ñтенок). УÑтановите "
+"0 Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð½Ð°Ñтройки."
+
+#: src/libslic3r/PrintConfig.cpp:1623
+msgid ""
+"This option sets the number of perimeters to generate for each layer. Note "
+"that Slic3r may increase this number automatically when it detects sloping "
+"surfaces which benefit from a higher number of perimeters if the Extra "
+"Perimeters option is enabled."
+msgstr ""
+"КоличеÑтво Ñлоёв контура объекта (или количеÑтво вертикальных Ñлоёв Ñтенки "
+"объекта). Чем меньше чиÑло, тем меньше толщина Ñтенки объекта, а значит, "
+"объект будет более хрупкий. Обратите внимание, еÑли включена Ð¾Ð¿Ñ†Ð¸Ñ "
+"\"Дополнительные периметры при необходимоÑти\", Slic3r может автоматичеÑки "
+"увеличить Ñто значение, еÑли обнаружит наклонные поверхноÑти."
+
+#: src/libslic3r/PrintConfig.cpp:1627
+msgid "(minimum)"
+msgstr "(минимум)"
+
+#: src/libslic3r/PrintConfig.cpp:1635
+msgid ""
+"If you want to process the output G-code through custom scripts, just list "
+"their absolute paths here. Separate multiple scripts with a semicolon. "
+"Scripts will be passed the absolute path to the G-code file as the first "
+"argument, and they can access the Slic3r config settings by reading "
+"environment variables."
+msgstr ""
+"ЕÑли вы хотите обработать выходной G-код Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ пользовательÑких "
+"Ñкриптов, проÑто перечиÑлите здеÑÑŒ абÑолютные пути к ним. РазделÑйте Ñкрипты "
+"точкой Ñ Ð·Ð°Ð¿Ñтой. Скриптам будет передан абÑолютный путь к файлу G-кода в "
+"качеÑтве первого аргумента, и они Ñмогут получить доÑтуп к наÑтройкам "
+"конфигурации Slic3r, Ñ‡Ð¸Ñ‚Ð°Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ñ‹Ðµ окружениÑ."
+
+#: src/libslic3r/PrintConfig.cpp:1647
+msgid "Printer type"
+msgstr "Тип принтера"
+
+#: src/libslic3r/PrintConfig.cpp:1648
+msgid "Type of the printer."
+msgstr "Тип принтера."
+
+#: src/libslic3r/PrintConfig.cpp:1653
+msgid "Printer notes"
+msgstr "ÐŸÑ€Ð¸Ð¼ÐµÑ‡Ð°Ð½Ð¸Ñ Ðº принтеру"
+
+#: src/libslic3r/PrintConfig.cpp:1654
+msgid "You can put your notes regarding the printer here."
+msgstr "ЗдеÑÑŒ вы можете размеÑтить Ñвои заметки о принтере."
+
+#: src/libslic3r/PrintConfig.cpp:1662
+msgid "Printer vendor"
+msgstr "Производитель принтера"
+
+#: src/libslic3r/PrintConfig.cpp:1663
+msgid "Name of the printer vendor."
+msgstr "Ðазвание Ð¿Ñ€Ð¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°."
+
+#: src/libslic3r/PrintConfig.cpp:1668
+msgid "Printer variant"
+msgstr "ÐœÐ¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°"
+
+#: src/libslic3r/PrintConfig.cpp:1669
+msgid ""
+"Name of the printer variant. For example, the printer variants may be "
+"differentiated by a nozzle diameter."
+msgstr ""
+"Ðазвание модификации принтера. Ðапример, Ñто можно различать по диаметру "
+"Ñопла."
+
+#: src/libslic3r/PrintConfig.cpp:1682
+msgid "Raft layers"
+msgstr "Слоёв в подложке"
+
+#: src/libslic3r/PrintConfig.cpp:1684
+msgid ""
+"The object will be raised by this number of layers, and support material "
+"will be generated under it."
+msgstr ""
+"Параметр уÑтанавливает выÑоту подложки в ÑлоÑÑ…. Ðоль - отключает Ñоздание "
+"подложки."
+
+#: src/libslic3r/PrintConfig.cpp:1692
+msgid "Resolution"
+msgstr "Разрешение"
+
+#: src/libslic3r/PrintConfig.cpp:1693
+msgid ""
+"Minimum detail resolution, used to simplify the input file for speeding up "
+"the slicing job and reducing memory usage. High-resolution models often "
+"carry more detail than printers can render. Set to zero to disable any "
+"simplification and use full resolution from input."
+msgstr ""
+"Минимальное разрешение детализации. ИÑпользуетÑÑ, чтобы упроÑтить входной "
+"файл Ð´Ð»Ñ ÑƒÑÐºÐ¾Ñ€ÐµÐ½Ð¸Ñ Ð½Ð°Ñ€ÐµÐ·ÐºÐ¸ и ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ‚Ñ€ÐµÐ±Ð»ÐµÐ½Ð¸Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ‚Ð¸Ð²Ð½Ð¾Ð¹ памÑти. "
+"Модели Ñ Ð²Ñ‹Ñоким разрешением чаÑто больше детализированы, чем могут "
+"отриÑовать принтеры. УÑтановите 0, чтобы отключить любое упрощение и "
+"иÑпользовать полное разрешение из входного файла."
+
+#: src/libslic3r/PrintConfig.cpp:1703
+msgid "Minimum travel after retraction"
+msgstr "Мин. перемещение поÑле ретракта"
+
+#: src/libslic3r/PrintConfig.cpp:1704
+msgid ""
+"Retraction is not triggered when travel moves are shorter than this length."
+msgstr ""
+"Ретракт не будет Ñрабатывать, еÑли раÑÑтоÑние между точками печати меньше "
+"заданного в Ñтом параметре."
+
+#: src/libslic3r/PrintConfig.cpp:1710
+msgid "Retract amount before wipe"
+msgstr "Величина ретракта перед очиÑткой"
+
+#: src/libslic3r/PrintConfig.cpp:1711
+msgid ""
+"With bowden extruders, it may be wise to do some amount of quick retract "
+"before doing the wipe movement."
+msgstr ""
+"При иÑпользовании боуден-ÑкÑтрудеров, будет разумно Ñделать неÑколько "
+"быÑтрых ретрактов перед тем, как Ñовершить движение очиÑтки."
+
+#: src/libslic3r/PrintConfig.cpp:1718
+msgid "Retract on layer change"
+msgstr "Ретракт при Ñмене ÑлоÑ"
+
+#: src/libslic3r/PrintConfig.cpp:1719
+msgid "This flag enforces a retraction whenever a Z move is done."
+msgstr "Эта Ð¾Ð¿Ñ†Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡Ð°ÐµÑ‚ ретракт при переходе Ñо ÑÐ»Ð¾Ñ Ð½Ð° Ñлой."
+
+#: src/libslic3r/PrintConfig.cpp:1724 src/libslic3r/PrintConfig.cpp:1732
+msgid "Length"
+msgstr "Длина"
+
+#: src/libslic3r/PrintConfig.cpp:1725
+msgid "Retraction Length"
+msgstr "Длина ретракта"
+
+#: src/libslic3r/PrintConfig.cpp:1726
+msgid ""
+"When retraction is triggered, filament is pulled back by the specified "
+"amount (the length is measured on raw filament, before it enters the "
+"extruder)."
+msgstr ""
+"Когда Ñрабатывает ретракт пруток втÑгиваетÑÑ Ð½Ð°Ð·Ð°Ð´ на указанную величину "
+"(длина измерÑетÑÑ Ð¿Ð¾ ненагретому прутку , то еÑÑ‚ÑŒ до Ð¿Ð¾Ð¿Ð°Ð´Ð°Ð½Ð¸Ñ ÐµÐ³Ð¾ в "
+"ÑкÑтрудер)."
+
+#: src/libslic3r/PrintConfig.cpp:1728 src/libslic3r/PrintConfig.cpp:1737
+msgid "mm (zero to disable)"
+msgstr "мм (0 - отключено)"
+
+#: src/libslic3r/PrintConfig.cpp:1733
+msgid "Retraction Length (Toolchange)"
+msgstr "Длина ретракта (при Ñмене Ñопла)"
+
+#: src/libslic3r/PrintConfig.cpp:1734
+msgid ""
+"When retraction is triggered before changing tool, filament is pulled back "
+"by the specified amount (the length is measured on raw filament, before it "
+"enters the extruder)."
+msgstr ""
+"Когда Ñрабатывает ретракт перед Ñменой инÑтрумента, пруток втÑгиваетÑÑ Ð½Ð°Ð·Ð°Ð´ "
+"на указанную величину (длина измерÑетÑÑ Ð¿Ð¾ Ñырому прутку, то еÑÑ‚ÑŒ до "
+"Ð¿Ð¾Ð¿Ð°Ð´Ð°Ð½Ð¸Ñ ÐµÐ³Ð¾ в ÑкÑтрудер)."
+
+#: src/libslic3r/PrintConfig.cpp:1742
+msgid "Lift Z"
+msgstr "Приподнимать Ñопло на"
+
+#: src/libslic3r/PrintConfig.cpp:1743
+msgid ""
+"If you set this to a positive value, Z is quickly raised every time a "
+"retraction is triggered. When using multiple extruders, only the setting for "
+"the first extruder will be considered."
+msgstr ""
+"Задаёт на Ñколько миллиметров вверх будет каждый раз приподниматьÑÑ Ñопло, "
+"когда Ñрабатывает ретракт. При иÑпользовании неÑкольких ÑкÑтрудеров будет "
+"учитываетÑÑ Ð½Ð°Ñтройки только первого ÑкÑтрудера."
+
+#: src/libslic3r/PrintConfig.cpp:1750
+msgid "Above Z"
+msgstr "Выше Z"
+
+#: src/libslic3r/PrintConfig.cpp:1751
+msgid "Only lift Z above"
+msgstr "Приподнимать Ñопло только выше (поÑле)"
+
+#: src/libslic3r/PrintConfig.cpp:1752
+msgid ""
+"If you set this to a positive value, Z lift will only take place above the "
+"specified absolute Z. You can tune this setting for skipping lift on the "
+"first layers."
+msgstr ""
+"ЕÑли указать положительное значение, то подъём Z будет "
+"выполнен только поÑле Ð¿Ñ€ÐµÐ²Ñ‹ÑˆÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ здеÑÑŒ абÑолютной выÑоты Z. "
+"Таким образом можно отключить подъём Ñопла при печати на первых ÑлоÑÑ…."
+
+#: src/libslic3r/PrintConfig.cpp:1759
+msgid "Below Z"
+msgstr "Ðиже Z"
+
+#: src/libslic3r/PrintConfig.cpp:1760
+msgid "Only lift Z below"
+msgstr "Приподнимать Ñопло только ниже (до)"
+
+#: src/libslic3r/PrintConfig.cpp:1761
+msgid ""
+"If you set this to a positive value, Z lift will only take place below the "
+"specified absolute Z. You can tune this setting for limiting lift to the "
+"first layers."
+msgstr ""
+"ЕÑли указать положительное значение, ÑкÑтрудер при перемещении будет "
+"подыматьÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ до заданной здеÑÑŒ абÑолютной выÑоты. "
+"Таким образом можно ограничить подъём Ñопла при печати до первых Ñлоёв."
+
+#: src/libslic3r/PrintConfig.cpp:1769 src/libslic3r/PrintConfig.cpp:1777
+msgid "Extra length on restart"
+msgstr "Ð”Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° подачи перед возобновлением печати"
+
+#: src/libslic3r/PrintConfig.cpp:1770
+msgid ""
+"When the retraction is compensated after the travel move, the extruder will "
+"push this additional amount of filament. This setting is rarely needed."
+msgstr ""
+"КомпенÑÐ°Ñ†Ð¸Ñ Ð´Ð»Ð¸Ð½Ñ‹ выдавливаемого плаÑтика поÑле Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ ÑкÑтрудера, "
+"поÑле работы ретракта. ПоÑле того как ÑкÑтрудер втÑнул пруток и перемеÑтилÑÑ "
+"в другое меÑто печати, проиÑходит Ð¾Ð±Ñ€Ð°Ñ‚Ð½Ð°Ñ Ð¿Ð¾Ð´Ð°Ñ‡Ð° того же количеÑтва прутка "
+"+ заданное тут значение. Ð”Ð»Ñ ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ñтавим положительное значение "
+"(например 0.5 мм), Ð´Ð»Ñ ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ - отрицательное. Этот параметр редко "
+"необходим."
+
+#: src/libslic3r/PrintConfig.cpp:1778
+msgid ""
+"When the retraction is compensated after changing tool, the extruder will "
+"push this additional amount of filament."
+msgstr ""
+"КомпенÑÐ°Ñ†Ð¸Ñ Ð´Ð»Ð¸Ð½Ñ‹ выдавливаемого плаÑтика перед возобновлением печати поÑле "
+"Ñмены Ñопла."
+
+#: src/libslic3r/PrintConfig.cpp:1785 src/libslic3r/PrintConfig.cpp:1786
+msgid "Retraction Speed"
+msgstr "СкороÑÑ‚ÑŒ ретракта"
+
+#: src/libslic3r/PrintConfig.cpp:1787
+msgid "The speed for retractions (it only applies to the extruder motor)."
+msgstr ""
+"СкороÑÑ‚ÑŒ Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð¹ проиÑходит ретракт - втÑгивание прутка (отноÑитÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ "
+"к двигателю ÑкÑтрудера)."
+
+#: src/libslic3r/PrintConfig.cpp:1793 src/libslic3r/PrintConfig.cpp:1794
+msgid "Deretraction Speed"
+msgstr "СкороÑÑ‚ÑŒ компенÑирующего ретракта"
+
+#: src/libslic3r/PrintConfig.cpp:1795
+msgid ""
+"The speed for loading of a filament into extruder after retraction (it only "
+"applies to the extruder motor). If left to zero, the retraction speed is "
+"used."
+msgstr ""
+"СкороÑÑ‚ÑŒ загрузки прутка в ÑкÑтрудер поÑле ретракта (применима только к "
+"двигателю ÑкÑтрудера). ЕÑли оÑтавить ноль, будет иÑпользоватьÑÑ ÑкороÑÑ‚ÑŒ "
+"ретракта."
+
+#: src/libslic3r/PrintConfig.cpp:1802
+msgid "Seam position"
+msgstr "ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ ÑˆÐ²Ð°"
+
+#: src/libslic3r/PrintConfig.cpp:1804
+msgid "Position of perimeters starting points."
+msgstr ""
+"Этот параметр позволÑет выбрать начальную точку каждого ÑÐ»Ð¾Ñ Ð² направлении "
+"Z, и таким образом определÑет, где будет шов объекта. ИзменÑÑ Ñтот параметр "
+"можно уменьшить видимоÑÑ‚ÑŒ шва."
+
+#: src/libslic3r/PrintConfig.cpp:1810
+msgid "Random"
+msgstr "Случайно"
+
+#: src/libslic3r/PrintConfig.cpp:1811
+msgid "Nearest"
+msgstr "БлижайшаÑ"
+
+#: src/libslic3r/PrintConfig.cpp:1812
+msgid "Aligned"
+msgstr "ВыровнÑÑ‚ÑŒ"
+
+#: src/libslic3r/PrintConfig.cpp:1820
+msgid "Direction"
+msgstr "Ðаправление"
+
+#: src/libslic3r/PrintConfig.cpp:1822
+msgid "Preferred direction of the seam"
+msgstr "Предпочтительное направление шва"
+
+#: src/libslic3r/PrintConfig.cpp:1823
+msgid "Seam preferred direction"
+msgstr "Предпочтительное направление шва"
+
+#: src/libslic3r/PrintConfig.cpp:1830
+msgid "Jitter"
+msgstr "Ð Ð°Ð·Ð±Ñ€Ð¾Ñ ÑˆÐ²Ð°"
+
+#: src/libslic3r/PrintConfig.cpp:1832
+msgid "Seam preferred direction jitter"
+msgstr "Предпочтительное направление разброÑа шва"
+
+#: src/libslic3r/PrintConfig.cpp:1833
+msgid "Preferred direction of the seam - jitter"
+msgstr "Предпочтительное направление разброÑа шва (в градуÑах) "
+
+#: src/libslic3r/PrintConfig.cpp:1840
+msgid "Distance from object"
+msgstr "РаÑÑтоÑние от объекта"
+
+#: src/libslic3r/PrintConfig.cpp:1841
+msgid ""
+"Distance between skirt and object(s). Set this to zero to attach the skirt "
+"to the object(s) and get a brim for better adhesion."
+msgstr ""
+"РаÑÑтоÑние между юбкой и объектом. Укажите 0, чтобы прикрепить юбку к "
+"объекту и получить кайму Ð´Ð»Ñ Ð»ÑƒÑ‡ÑˆÐµÐ³Ð¾ прилипаниÑ."
+
+#: src/libslic3r/PrintConfig.cpp:1848
+msgid "Skirt height"
+msgstr "Слоёв юбки"
+
+#: src/libslic3r/PrintConfig.cpp:1849
+msgid ""
+"Height of skirt expressed in layers. Set this to a tall value to use skirt "
+"as a shield against drafts."
+msgstr ""
+"Ð’Ñ‹Ñота юбки Ð²Ñ‹Ñ€Ð°Ð¶ÐµÐ½Ð½Ð°Ñ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтвом Ñлоёв. УÑтановите выÑокое значение, чтобы "
+"иÑпользовать юбку в качеÑтве защиты от ÑквознÑка."
+
+#: src/libslic3r/PrintConfig.cpp:1856
+msgid "Draft shield"
+msgstr "Защита от ÑквознÑка"
+
+#: src/libslic3r/PrintConfig.cpp:1857
+msgid ""
+"If enabled, the skirt will be as tall as a highest printed object. This is "
+"useful to protect an ABS or ASA print from warping and detaching from print "
+"bed due to wind draft."
+msgstr ""
+"ЕÑли включено, то выÑота юбки будет равна Ñамому выÑокому печатаемому"
+" объекту. Это "
+"полезно при печати ABS или ASA Ð´Ð»Ñ Ð·Ð°Ñ‰Ð¸Ñ‚Ñ‹ от ÑÐºÑ€ÑƒÑ‡Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¸ отрыва от"
+" платформы, "
+"возникающих от ÑквознÑка."
+
+#: src/libslic3r/PrintConfig.cpp:1863
+msgid "Loops (minimum)"
+msgstr "Петель (минимум)"
+
+#: src/libslic3r/PrintConfig.cpp:1864
+msgid "Skirt Loops"
+msgstr "Кругов юбки"
+
+#: src/libslic3r/PrintConfig.cpp:1865
+msgid ""
+"Number of loops for the skirt. If the Minimum Extrusion Length option is "
+"set, the number of loops might be greater than the one configured here. Set "
+"this to zero to disable skirt completely."
+msgstr ""
+"КоличеÑтво юбок вокруг модели. ЕÑли задан параметр \"ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ð´Ð»Ð¸Ð½Ð° "
+"ÑкÑтрузии\", количеÑтво юбок может быть больше, чем задано здеÑÑŒ. Чтобы "
+"полноÑтью отключить юбку, уÑтановите 0."
+
+#: src/libslic3r/PrintConfig.cpp:1873
+msgid "Slow down if layer print time is below"
+msgstr "Замедление при печати ÑÐ»Ð¾Ñ Ð¼ÐµÐ½ÐµÐµ"
+
+#: src/libslic3r/PrintConfig.cpp:1874
+msgid ""
+"If layer print time is estimated below this number of seconds, print moves "
+"speed will be scaled down to extend duration to this value."
+msgstr ""
+"ЕÑли Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸ ÑÐ»Ð¾Ñ Ð¾Ñ†ÐµÐ½Ð¸Ð²Ð°ÐµÑ‚ÑÑ Ð½Ð¸Ð¶Ðµ Ñтого количеÑтва Ñекунд, ÑкороÑÑ‚ÑŒ "
+"печати будет пропорционально уменьшена, чтобы увеличить продолжительноÑÑ‚ÑŒ до "
+"Ñтого значениÑ."
+
+#: src/libslic3r/PrintConfig.cpp:1883
+msgid "Small perimeters"
+msgstr "Маленькие периметры"
+
+#: src/libslic3r/PrintConfig.cpp:1885
+msgid ""
+"This separate setting will affect the speed of perimeters having radius <= "
+"6.5mm (usually holes). If expressed as percentage (for example: 80%) it will "
+"be calculated on the perimeters speed setting above. Set to zero for auto."
+msgstr ""
+"Этот параметр влиÑет на ÑкороÑÑ‚ÑŒ печати периметров Ñ Ñ€Ð°Ð´Ð¸ÑƒÑом \n"
+"<= 6,5 мм (обычно Ñто отверÑтиÑ). ЕÑли задано в процентах, параметр "
+"вычиÑлÑетÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно ÑкороÑти печати внутренних периметров. УÑтановите 0 "
+"Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð½Ð°Ñтройки."
+
+#: src/libslic3r/PrintConfig.cpp:1895
+msgid "Solid infill threshold area"
+msgstr "Заполнение площади, меньше указанной"
+
+#: src/libslic3r/PrintConfig.cpp:1897
+msgid ""
+"Force solid infill for regions having a smaller area than the specified "
+"threshold."
+msgstr ""
+"Заполнение площади меньше указанной будет производитьÑÑ \n"
+"100% (Ñплошным) заполнением."
+
+#: src/libslic3r/PrintConfig.cpp:1898
+msgid "mm²"
+msgstr "мм²"
+
+#: src/libslic3r/PrintConfig.cpp:1904
+msgid "Solid infill extruder"
+msgstr "ЭкÑтрудер, печатающий Ñплошные Ñлои заполнениÑ"
+
+#: src/libslic3r/PrintConfig.cpp:1906
+msgid "The extruder to use when printing solid infill."
+msgstr "Ðомер ÑкÑтрудера, которым печатаютÑÑ Ñплошные Ñлои заполнениÑ."
+
+#: src/libslic3r/PrintConfig.cpp:1912
+msgid "Solid infill every"
+msgstr "Сплошное заполнение каждые"
+
+#: src/libslic3r/PrintConfig.cpp:1914
+msgid ""
+"This feature allows to force a solid layer every given number of layers. "
+"Zero to disable. You can set this to any value (for example 9999); Slic3r "
+"will automatically choose the maximum possible number of layers to combine "
+"according to nozzle diameter and layer height."
+msgstr ""
+"Эта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð¿Ð¾Ð·Ð²Ð¾Ð»Ñет принудительно делать Ñплошное заполнение через "
+"указанное количеÑтво Ñлоёв. Чтобы отключить, уÑтановите 0. Ð’Ñ‹ можете задать "
+"любое значение, Slic3r автоматичеÑки выберет макÑимально возможное "
+"количеÑтво Ñлоёв в завиÑимоÑти от диаметра Ñопла и выÑоты ÑлоÑ."
+
+#: src/libslic3r/PrintConfig.cpp:1926
+msgid ""
+"Set this to a non-zero value to set a manual extrusion width for infill for "
+"solid surfaces. If left zero, default extrusion width will be used if set, "
+"otherwise 1.125 x nozzle diameter will be used. If expressed as percentage "
+"(for example 90%) it will be computed over layer height."
+msgstr ""
+"УÑтановите значение отличное от 0, чтобы вручную задать ширину ÑкÑтрузии Ð´Ð»Ñ "
+"Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñплошных поверхноÑтей. ЕÑли оÑтавить 0, будет иÑпользоватьÑÑ "
+"\"Ширина ÑкÑтрузии по умолчанию\" - еÑли она задана, в противном Ñлучае "
+"будет иÑпользоватьÑÑ 1,125 x диаметра Ñопла. ЕÑли задано в процентах, "
+"параметр вычиÑлÑетÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно выÑоты ÑлоÑ."
+
+#: src/libslic3r/PrintConfig.cpp:1937
+msgid ""
+"Speed for printing solid regions (top/bottom/internal horizontal shells). "
+"This can be expressed as a percentage (for example: 80%) over the default "
+"infill speed above. Set to zero for auto."
+msgstr ""
+"СкороÑÑ‚ÑŒ печати Ñплошных облаÑтей (верха/низа/внутренних горизонтальных "
+"оболочек). ЕÑли задано в процентах, параметр вычиÑлÑетÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно "
+"ÑкороÑти Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¹ выше. УÑтановите 0 Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð½Ð°Ñтройки."
+
+#: src/libslic3r/PrintConfig.cpp:1949
+msgid "Number of solid layers to generate on top and bottom surfaces."
+msgstr "КоличеÑтво Ñплошных Ñлоёв Ð´Ð»Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ð¸ верхних и нижних поверхноÑтей."
+
+#: src/libslic3r/PrintConfig.cpp:1955 src/libslic3r/PrintConfig.cpp:1956
+msgid "Minimum thickness of a top / bottom shell"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:1962
+msgid "Spiral vase"
+msgstr "Ð¡Ð¿Ð¸Ñ€Ð°Ð»ÑŒÐ½Ð°Ñ Ð²Ð°Ð·Ð°"
+
+#: src/libslic3r/PrintConfig.cpp:1963
+msgid ""
+"This feature will raise Z gradually while printing a single-walled object in "
+"order to remove any visible seam. This option requires a single perimeter, "
+"no infill, no top solid layers and no support material. You can still set "
+"any number of bottom solid layers as well as skirt/brim loops. It won't work "
+"when printing more than an object."
+msgstr ""
+"Ð”Ð°Ð½Ð½Ð°Ñ Ð½Ð°Ñтройка применÑетÑÑ Ð¿Ñ€Ð¸ печати Ñпиральных и пуÑтотелых, а также "
+"тонкоÑтенных объектов. Модель печатаетÑÑ Ð² одну Ñтенку без верней "
+"поверхноÑти, Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¸ поддержки. При Ñтом Ñопло движетÑÑ Ð²Ð´Ð¾Ð»ÑŒ периметра "
+"непрерывно поÑтепенно поднимаÑÑÑŒ, так получаютÑÑ Ñ€Ð¾Ð²Ð½Ñ‹Ðµ краÑивые вазы без "
+"видимых швов. Ð’Ñ‹ можете задать любое количеÑтво нижних Ñплошных Ñлоёв, а "
+"также печать юбки/каймы. При включении Ñтого параметра невозможно напечатать "
+"горизонтальную плоÑкоÑÑ‚ÑŒ - горизонтальные Ñлои без поддержки будут провиÑать."
+
+#: src/libslic3r/PrintConfig.cpp:1971
+msgid "Temperature variation"
+msgstr "ÐšÐ¾Ð»ÐµÐ±Ð°Ð½Ð¸Ñ Ñ‚ÐµÐ¼Ð¿ÐµÑ€Ð°Ñ‚ÑƒÑ€Ñ‹"
+
+#: src/libslic3r/PrintConfig.cpp:1972
+msgid ""
+"Temperature difference to be applied when an extruder is not active. Enables "
+"a full-height \"sacrificial\" skirt on which the nozzles are periodically "
+"wiped."
+msgstr ""
+"РазноÑÑ‚ÑŒ температур, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ñ€Ð¸Ð¼ÐµÐ½ÑетÑÑ, когда ÑкÑтрудер не иÑпользуетÑÑ. "
+"Включает печать \"жертвенной\" юбки Ñ Ð²Ñ‹Ñотой, равной выÑоте модели, об "
+"которую Ñопла будут Ð²Ñ€ÐµÐ¼Ñ Ð¾Ñ‚ времени очищатьÑÑ."
+
+#: src/libslic3r/PrintConfig.cpp:1982
+msgid ""
+"This start procedure is inserted at the beginning, after bed has reached the "
+"target temperature and extruder just started heating, and before extruder "
+"has finished heating. If PrusaSlicer detects M104 or M190 in your custom "
+"codes, such commands will not be prepended automatically so you're free to "
+"customize the order of heating commands and other custom actions. Note that "
+"you can use placeholder variables for all PrusaSlicer settings, so you can "
+"put a \"M109 S[first_layer_temperature]\" command wherever you want."
+msgstr ""
+"Этот код вÑтавлÑетÑÑ Ð² начало, поÑле того как платформа уже доÑтигла заданной "
+"температуры, а ÑкÑтрудер только начал нагреватьÑÑ, и до того, как ÑкÑтрудер "
+"закончил нагрев. ЕÑли PrusaSlicer обнаруживает M104 или M190 в вашем "
+"пользовательÑком коде, то такие команды (нагрева) не будут добавлÑÑ‚ÑŒÑÑ"
+" автоматичеÑки, "
+"поÑтому вы можете наÑтроить порÑдок команд подогрева и другие дейÑтвиÑ. "
+"Обратите внимание, что вы можете иÑпользовать шаблонные переменные Ð´Ð»Ñ Ð²Ñех "
+"параметров PrusaSlicer, поÑтому можете вÑтавить команду \"M109"
+" S[first_layer_temperature]\" где угодно."
+
+#: src/libslic3r/PrintConfig.cpp:1997
+msgid ""
+"This start procedure is inserted at the beginning, after any printer start "
+"gcode (and after any toolchange to this filament in case of multi-material "
+"printers). This is used to override settings for a specific filament. If "
+"PrusaSlicer detects M104, M109, M140 or M190 in your custom codes, such "
+"commands will not be prepended automatically so you're free to customize the "
+"order of heating commands and other custom actions. Note that you can use "
+"placeholder variables for all PrusaSlicer settings, so you can put a \"M109 "
+"S[first_layer_temperature]\" command wherever you want. If you have multiple "
+"extruders, the gcode is processed in extruder order."
+msgstr ""
+"Этот код выполнÑетÑÑ Ð² начале, поÑле Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ñтартового G-кода принтера. "
+"Он иÑпользуетÑÑ Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»Ñ‘Ð½Ð½Ð¾Ð³Ð¾ прутка. ЕÑли "
+"Slic3r обнаруживает M104, M109, M140 или M190 в вашем пользовательÑком коде, "
+"такие команды не будут автоматичеÑки добавлÑÑ‚ÑŒÑÑ, поÑтому вы можете "
+"наÑтроить порÑдок команд подогрева и другие дейÑтвиÑ. Обратите внимание, что "
+"вы можете иÑпользовать шаблонные переменные Ð´Ð»Ñ Ð²Ñех параметров Slic3r, "
+"поÑтому вы можете вÑтавить команду \"M109 S[first_layer_temperature]\" где "
+"угодно. ЕÑли у Ð²Ð°Ñ ÐµÑÑ‚ÑŒ неÑколько ÑкÑтрудеров, G-код обрабатываетÑÑ Ð² "
+"ÑоответÑтвии Ñ Ð¿Ð¾Ñ€Ñдковым номером ÑкÑтрудера."
+
+#: src/libslic3r/PrintConfig.cpp:2013
+msgid "Color change G-code"
+msgstr "G-код, выполнÑемый при Ñмене цвета"
+
+#: src/libslic3r/PrintConfig.cpp:2014
+msgid "This G-code will be used as a code for the color change"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2023
+msgid "This G-code will be used as a code for the pause print"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2032
+msgid "This G-code will be used as a custom code"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2040
+msgid "Single Extruder Multi Material"
+msgstr "Мультиматериальный одиночный ÑкÑтрудер"
+
+#: src/libslic3r/PrintConfig.cpp:2041
+msgid "The printer multiplexes filaments into a single hot end."
+msgstr ""
+"Принтер ÑпоÑобный печатать неÑколькими видами/цветами плаÑтика (ÑоединÑÑ Ð¸Ñ… "
+"в одну нить) Ñ Ð¾Ð´Ð½Ð¾Ð¹ ÑкÑтрузионной головкой."
+
+#: src/libslic3r/PrintConfig.cpp:2046
+msgid "Prime all printing extruders"
+msgstr "Заправка вÑех печатающих ÑкÑтрудеров"
+
+#: src/libslic3r/PrintConfig.cpp:2047
+msgid ""
+"If enabled, all printing extruders will be primed at the front edge of the "
+"print bed at the start of the print."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2052
+msgid "No sparse layers (EXPERIMENTAL)"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2053
+msgid ""
+"If enabled, the wipe tower will not be printed on layers with no "
+"toolchanges. On layers with a toolchange, extruder will travel downward to "
+"print the wipe tower. User is responsible for ensuring there is no collision "
+"with the print."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2060
+msgid "Generate support material"
+msgstr "Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ð²Ñпомогательных Ñтруктур"
+
+#: src/libslic3r/PrintConfig.cpp:2062
+msgid "Enable support material generation."
+msgstr ""
+"Включение печати вÑпомогательных Ñтруктур, поддерживающих выÑтупающие и "
+"ÑвиÑающие Ñлементы печатаемой модели."
+
+#: src/libslic3r/PrintConfig.cpp:2066
+msgid "Auto generated supports"
+msgstr "ÐвтоматичеÑÐºÐ°Ñ Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐµÐº"
+
+#: src/libslic3r/PrintConfig.cpp:2068
+msgid ""
+"If checked, supports will be generated automatically based on the overhang "
+"threshold value. If unchecked, supports will be generated inside the "
+"\"Support Enforcer\" volumes only."
+msgstr ""
+"ЕÑли включено, то поддержки будут генерироватьÑÑ Ð°Ð²Ñ‚Ð¾Ð¼Ð°Ñ‚Ð¸Ñ‡ÐµÑки, иÑÑ…Ð¾Ð´Ñ Ð¸Ð· "
+"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ€Ð¾Ð³Ð° навиÑаниÑ. ЕÑли выключено, то поддержки будут генерироватьÑÑ "
+"только внутри проÑтранÑтв «Support Enforcer»."
+
+#: src/libslic3r/PrintConfig.cpp:2074
+msgid "XY separation between an object and its support"
+msgstr "Зазор между объектом и поддержкой по оÑÑм XY"
+
+#: src/libslic3r/PrintConfig.cpp:2076
+msgid ""
+"XY separation between an object and its support. If expressed as percentage "
+"(for example 50%), it will be calculated over external perimeter width."
+msgstr ""
+"РаÑÑтоÑние между поддержкой и печатаемым объектом по оÑÑм XY. ЕÑли задано в "
+"процентах, то раÑÑтоÑние будет раÑÑчитано иÑÑ…Ð¾Ð´Ñ Ð¾Ñ‚ ширины внешнего "
+"периметра."
+
+#: src/libslic3r/PrintConfig.cpp:2086
+msgid "Pattern angle"
+msgstr "Угол печати поддержки и подложки"
+
+#: src/libslic3r/PrintConfig.cpp:2088
+msgid ""
+"Use this setting to rotate the support material pattern on the horizontal "
+"plane."
+msgstr ""
+"ИÑпользуйте Ñтот параметр Ð´Ð»Ñ Ð¿Ð¾Ð²Ð¾Ñ€Ð¾Ñ‚Ð° риÑунка поддержки в горизонтальной "
+"плоÑкоÑти."
+
+#: src/libslic3r/PrintConfig.cpp:2098 src/libslic3r/PrintConfig.cpp:2893
+msgid ""
+"Only create support if it lies on a build plate. Don't create support on a "
+"print."
+msgstr ""
+"Создавать поддержки только от платформы. Поддержки от объектов поÑтроены не "
+"будут."
+
+#: src/libslic3r/PrintConfig.cpp:2104
+msgid "Contact Z distance"
+msgstr "РаÑÑтоÑние от поддержки до объекта по вертикали"
+
+#: src/libslic3r/PrintConfig.cpp:2106
+msgid ""
+"The vertical distance between object and support material interface. Setting "
+"this to 0 will also prevent Slic3r from using bridge flow and speed for the "
+"first object layer."
+msgstr ""
+"Вертикальное раÑÑтоÑние между объектом и ÑвÑзующим Ñлоем поддержки. ЕÑли "
+"уÑтановить 0, то Slic3r не будет иÑпользовать функцию \"Соотношение потока "
+"при печати моÑтов\" и \"СкороÑÑ‚ÑŒ печати первого ÑлоÑ\" объекта."
+
+#: src/libslic3r/PrintConfig.cpp:2113
+msgid "0 (soluble)"
+msgstr "0 (раÑтворимые)"
+
+#: src/libslic3r/PrintConfig.cpp:2114
+msgid "0.2 (detachable)"
+msgstr "0.2 (нераÑтворимые)"
+
+#: src/libslic3r/PrintConfig.cpp:2119
+msgid "Enforce support for the first"
+msgstr "ÐŸÑ€Ð¸Ð½ÑƒÐ´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ° Ð´Ð»Ñ Ð¿ÐµÑ€Ð²Ñ‹Ñ…"
+
+#: src/libslic3r/PrintConfig.cpp:2121
+msgid ""
+"Generate support material for the specified number of layers counting from "
+"bottom, regardless of whether normal support material is enabled or not and "
+"regardless of any angle threshold. This is useful for getting more adhesion "
+"of objects having a very thin or poor footprint on the build plate."
+msgstr ""
+"Ð“ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐµÐº Ð´Ð»Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð³Ð¾ количеÑтва Ñлоёв Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñо дна, вне "
+"завиÑимоÑти от порога ÑвеÑа и уÑтановленного параметра ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐµÐº. "
+"Это полезно Ð´Ð»Ñ Ð»ÑƒÑ‡ÑˆÐµÐ³Ð¾ Ð¿Ñ€Ð¸Ð»Ð¸Ð¿Ð°Ð½Ð¸Ñ Ñ‚Ð¾Ð½ÐºÐ¸Ñ… объектов или при малой площади "
+"контакта Ñ Ð¿Ð»Ð°Ñ‚Ñ„Ð¾Ñ€Ð¼Ð¾Ð¹."
+
+#: src/libslic3r/PrintConfig.cpp:2126
+msgid "Enforce support for the first n layers"
+msgstr "ÐŸÑ€Ð¸Ð½ÑƒÐ´Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð°Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ° Ð´Ð»Ñ Ð¿ÐµÑ€Ð²Ñ‹Ñ… N Ñлоёв"
+
+#: src/libslic3r/PrintConfig.cpp:2132
+msgid "Support material/raft/skirt extruder"
+msgstr "ЭкÑтрудер, печатающий поддержки/подложки/юбки"
+
+#: src/libslic3r/PrintConfig.cpp:2134
+msgid ""
+"The extruder to use when printing support material, raft and skirt (1+, 0 to "
+"use the current extruder to minimize tool changes)."
+msgstr ""
+"Ðомер ÑкÑтрудера, которым печатаютÑÑ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ°, подложка и юбка (1+, 0 Ð´Ð»Ñ "
+"иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ ÑкÑтрудера Ð´Ð»Ñ Ð¼Ð¸Ð½Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ð¸ Ñмены инÑтрумента)."
+
+#: src/libslic3r/PrintConfig.cpp:2143
+msgid ""
+"Set this to a non-zero value to set a manual extrusion width for support "
+"material. If left zero, default extrusion width will be used if set, "
+"otherwise nozzle diameter will be used. If expressed as percentage (for "
+"example 90%) it will be computed over layer height."
+msgstr ""
+"УÑтановите значение отличное от 0, чтобы вручную задать ширину ÑкÑтрузии Ð´Ð»Ñ "
+"поддержки. ЕÑли оÑтавить 0, будет иÑпользоватьÑÑ \"Ширина ÑкÑтрузии по "
+"умолчанию\" - еÑли она задана, в противном Ñлучае будет иÑпользоватьÑÑ "
+"диаметр Ñопла. ЕÑли задано в процентах, параметр вычиÑлÑетÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно "
+"выÑоты ÑлоÑ."
+
+#: src/libslic3r/PrintConfig.cpp:2152
+msgid "Interface loops"
+msgstr "СвÑзующий Ñлой петлÑми"
+
+#: src/libslic3r/PrintConfig.cpp:2154
+msgid ""
+"Cover the top contact layer of the supports with loops. Disabled by default."
+msgstr "Печатать верхний ÑвÑзующий Ñлой петлÑми. По умолчанию отключено."
+
+#: src/libslic3r/PrintConfig.cpp:2159
+msgid "Support material/raft interface extruder"
+msgstr "ЭкÑтрудер, печатающий ÑвÑзующий Ñлой поддержки/подложки"
+
+#: src/libslic3r/PrintConfig.cpp:2161
+msgid ""
+"The extruder to use when printing support material interface (1+, 0 to use "
+"the current extruder to minimize tool changes). This affects raft too."
+msgstr ""
+"Ðомер ÑкÑтрудера, которым печатаютÑÑ ÑвÑзующие Ñлой поддержки (1+, 0 Ð´Ð»Ñ "
+"иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ³Ð¾ ÑкÑтрудера Ð´Ð»Ñ Ð¼Ð¸Ð½Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ð¸ Ñмены инÑтрумента). Это "
+"также влиÑет на печать подложки."
+
+#: src/libslic3r/PrintConfig.cpp:2168
+msgid "Interface layers"
+msgstr "СвÑзующих Ñлоёв"
+
+#: src/libslic3r/PrintConfig.cpp:2170
+msgid ""
+"Number of interface layers to insert between the object(s) and support "
+"material."
+msgstr "КоличеÑтво ÑвÑзующих Ñлоёв между моделью и материалом поддержки."
+
+#: src/libslic3r/PrintConfig.cpp:2177
+msgid "Interface pattern spacing"
+msgstr "РаÑÑтоÑние между ÑвÑзующими линиÑми"
+
+#: src/libslic3r/PrintConfig.cpp:2179
+msgid "Spacing between interface lines. Set zero to get a solid interface."
+msgstr ""
+"РаÑÑтоÑние между ÑвÑзующими линиÑми. УÑтановите 0, чтобы получить Ñплошной "
+"Ñлой."
+
+#: src/libslic3r/PrintConfig.cpp:2188
+msgid ""
+"Speed for printing support material interface layers. If expressed as "
+"percentage (for example 50%) it will be calculated over support material "
+"speed."
+msgstr ""
+"СкороÑÑ‚ÑŒ печати ÑвÑзующих Ñлоёв поддержки. ЕÑли она выражена в процентах, то "
+"будет раÑÑчитана отноÑительно ÑкороÑти печати поддержки указанной выше."
+
+#: src/libslic3r/PrintConfig.cpp:2197
+msgid "Pattern"
+msgstr "Шаблон поддержки и подложки"
+
+#: src/libslic3r/PrintConfig.cpp:2199
+msgid "Pattern used to generate support material."
+msgstr "Шаблон, по которому будет проиÑходить печать поддержки."
+
+#: src/libslic3r/PrintConfig.cpp:2205
+msgid "Rectilinear grid"
+msgstr "ПрÑÐ¼Ð¾Ð»Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ñетка"
+
+#: src/libslic3r/PrintConfig.cpp:2211
+msgid "Pattern spacing"
+msgstr "ПлотноÑÑ‚ÑŒ поддержки"
+
+#: src/libslic3r/PrintConfig.cpp:2213
+msgid "Spacing between support material lines."
+msgstr "РаÑÑтоÑние между линиÑми поддержки."
+
+#: src/libslic3r/PrintConfig.cpp:2222
+msgid "Speed for printing support material."
+msgstr "СкороÑÑ‚ÑŒ печати поддержек."
+
+#: src/libslic3r/PrintConfig.cpp:2229
+msgid "Synchronize with object layers"
+msgstr "Ð¡Ð¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñо ÑлоÑми объекта"
+
+#: src/libslic3r/PrintConfig.cpp:2231
+msgid ""
+"Synchronize support layers with the object print layers. This is useful with "
+"multi-material printers, where the extruder switch is expensive."
+msgstr ""
+"Синхронизирует Ñлои поддержки Ñо ÑлоÑми печатаемого объекта. Это полезно Ð´Ð»Ñ "
+"мультиматериальных принтеров, которые требуют больших затрат на Ñмену одного "
+"ÑкÑтрудера на другой."
+
+#: src/libslic3r/PrintConfig.cpp:2237
+msgid "Overhang threshold"
+msgstr "Угол навиÑÐ°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸"
+
+#: src/libslic3r/PrintConfig.cpp:2239
+msgid ""
+"Support material will not be generated for overhangs whose slope angle (90° "
+"= vertical) is above the given threshold. In other words, this value "
+"represent the most horizontal slope (measured from the horizontal plane) "
+"that you can print without support material. Set to zero for automatic "
+"detection (recommended)."
+msgstr ""
+"ЗадаётÑÑ ÑƒÐ³Ð¾Ð» навиÑаниÑ, при превышении которого будут иÑпользоватьÑÑ "
+"поддержки (угол задаётÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно вертикальной оÑи). УÑтановите 0 Ð´Ð»Ñ "
+"Ñ„Ð¾Ñ€Ð¼Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¸ в автоматичеÑком режиме."
+
+#: src/libslic3r/PrintConfig.cpp:2251
+msgid "With sheath around the support"
+msgstr "Оболочка вокруг поддержки"
+
+#: src/libslic3r/PrintConfig.cpp:2253
+msgid ""
+"Add a sheath (a single perimeter line) around the base support. This makes "
+"the support more reliable, but also more difficult to remove."
+msgstr ""
+"Добавить оболочку (одну линию периметра) вокруг базовой поддержки. Это "
+"делает поддержку более надёжной, но её труднее удалить."
+
+#: src/libslic3r/PrintConfig.cpp:2260
+msgid ""
+"Nozzle temperature for layers after the first one. Set this to zero to "
+"disable temperature control commands in the output G-code."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2263
+msgid "Nozzle temperature"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2269
+msgid "Detect thin walls"
+msgstr "Обнаружение тонких Ñтенок"
+
+#: src/libslic3r/PrintConfig.cpp:2271
+msgid ""
+"Detect single-width walls (parts where two extrusions don't fit and we need "
+"to collapse them into a single trace)."
+msgstr ""
+"Данный параметр ищет тонкие Ñтенки (Ñтенки одинарной ширины), которые можно "
+"напечатать только в один проход ÑкÑтрудера, и производит нарезку правильно."
+
+#: src/libslic3r/PrintConfig.cpp:2277
+msgid "Threads"
+msgstr "Потоков"
+
+#: src/libslic3r/PrintConfig.cpp:2278
+msgid ""
+"Threads are used to parallelize long-running tasks. Optimal threads number "
+"is slightly above the number of available cores/processors."
+msgstr ""
+"КоличеÑтво потоков Ð´Ð»Ñ Ñ€Ð°ÑÐ¿Ð°Ñ€Ð°Ð»Ð»ÐµÐ»Ð¸Ð²Ð°Ð½Ð¸Ñ Ð´Ð»Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ñ… задач. Оптимальное "
+"количеÑтво потоков немного превышает количеÑтво доÑтупных Ñдер/процеÑÑоров."
+
+#: src/libslic3r/PrintConfig.cpp:2290
+msgid ""
+"This custom code is inserted before every toolchange. Placeholder variables "
+"for all PrusaSlicer settings as well as {previous_extruder} and "
+"{next_extruder} can be used. When a tool-changing command which changes to "
+"the correct extruder is included (such as T{next_extruder}), PrusaSlicer "
+"will emit no other such command. It is therefore possible to script custom "
+"behaviour both before and after the toolchange."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2303
+msgid ""
+"Set this to a non-zero value to set a manual extrusion width for infill for "
+"top surfaces. You may want to use thinner extrudates to fill all narrow "
+"regions and get a smoother finish. If left zero, default extrusion width "
+"will be used if set, otherwise nozzle diameter will be used. If expressed as "
+"percentage (for example 90%) it will be computed over layer height."
+msgstr ""
+"УÑтановите значение отличное от 0, чтобы вручную задать ширину ÑкÑтрузии Ð´Ð»Ñ "
+"Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð²ÐµÑ€Ñ…Ð½ÐµÐ¹ поверхноÑти. Ð’Ñ‹ можете иÑпользовать более тонкие Ñопла, "
+"чтобы заполнить вÑе узкие облаÑти и получить более гладкую поверхноÑÑ‚ÑŒ. ЕÑли "
+"оÑтавить 0, будет иÑпользоватьÑÑ \"Ширина ÑкÑтрузии по умолчанию\" - еÑли "
+"она задана, в противном Ñлучае будет иÑпользоватьÑÑ Ð´Ð¸Ð°Ð¼ÐµÑ‚Ñ€ Ñопла. ЕÑли "
+"задано в процентах, параметр вычиÑлÑетÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно выÑоты ÑлоÑ."
+
+#: src/libslic3r/PrintConfig.cpp:2315
+msgid ""
+"Speed for printing top solid layers (it only applies to the uppermost "
+"external layers and not to their internal solid layers). You may want to "
+"slow down this to get a nicer surface finish. This can be expressed as a "
+"percentage (for example: 80%) over the solid infill speed above. Set to zero "
+"for auto."
+msgstr ""
+"СкороÑÑ‚ÑŒ печати верхних Ñплошных Ñлоёв. Ð’Ñ‹ можете Ñнизить ÑкороÑÑ‚ÑŒ, чтобы "
+"получить более качеÑтвенную поверхноÑÑ‚ÑŒ. ЕÑли задано в процентах, параметр "
+"вычиÑлÑетÑÑ Ð¾Ñ‚Ð½Ð¾Ñительно ÑкороÑти Ñплошного Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð¾Ð¹ выше. "
+"УÑтановите 0 Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð½Ð°Ñтройки."
+
+#: src/libslic3r/PrintConfig.cpp:2330
+msgid "Number of solid layers to generate on top surfaces."
+msgstr "КоличеÑтво Ñплошных Ñлоёв при печати верхней поверхноÑти модели."
+
+#: src/libslic3r/PrintConfig.cpp:2331
+msgid "Top solid layers"
+msgstr "Верхних Ñплошных Ñлоёв"
+
+#: src/libslic3r/PrintConfig.cpp:2339
+msgid ""
+"The number of top solid layers is increased above top_solid_layers if "
+"necessary to satisfy minimum thickness of top shell. This is useful to "
+"prevent pillowing effect when printing with variable layer height."
+msgstr ""
+"Ðа Ñколько количеÑтво верхних Ñплошных Ñлоёв может быть больше "
+"top_solid_layers, еÑли Ñто необходимо Ð´Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ð¼Ð¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð¾Ð¹ толщины "
+"верхней оболочки. Это полезно Ð´Ð»Ñ ÑƒÐ±Ð¸Ñ€Ð°Ð½Ð¸Ñ Ñффекта подушки при печати Ñ "
+"переменной выÑотой ÑлоÑ."
+
+#: src/libslic3r/PrintConfig.cpp:2342
+msgid "Minimum top shell thickness"
+msgstr "ÐœÐ¸Ð½Ð¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ Ñ‚Ð¾Ð»Ñ‰Ð¸Ð½Ð° верхней оболочки"
+
+#: src/libslic3r/PrintConfig.cpp:2349
+msgid "Speed for travel moves (jumps between distant extrusion points)."
+msgstr "СкороÑÑ‚ÑŒ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ ÑкÑтрудера при позиционировании без печати."
+
+#: src/libslic3r/PrintConfig.cpp:2357
+msgid "Use firmware retraction"
+msgstr "ИÑпользовать ретракт из прошивки"
+
+#: src/libslic3r/PrintConfig.cpp:2358
+msgid ""
+"This experimental setting uses G10 and G11 commands to have the firmware "
+"handle the retraction. This is only supported in recent Marlin."
+msgstr ""
+"Эта ÑкÑÐ¿ÐµÑ€Ð¸Ð¼ÐµÐ½Ñ‚Ð°Ð»ÑŒÐ½Ð°Ñ Ð½Ð°Ñтройка иÑпользует команды G10 и G11, чтобы прошивка "
+"обрабатывала ретракт. ПоддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в поÑледних верÑиÑÑ… Marlin."
+
+#: src/libslic3r/PrintConfig.cpp:2364
+msgid "Use relative E distances"
+msgstr "ИÑпользовать отноÑительные раÑÑтоÑÐ½Ð¸Ñ E"
+
+#: src/libslic3r/PrintConfig.cpp:2365
+msgid ""
+"If your firmware requires relative E values, check this, otherwise leave it "
+"unchecked. Most firmwares use absolute values."
+msgstr ""
+"Движение ÑкÑтрудера (E) по отношению к предыдущей позиции не в абÑолютном "
+"выражении, а в отноÑительном. БольшинÑтво прошивок иÑпользуют абÑолютные "
+"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ позиционировании. ЕÑли вы не знаете - иÑпользует ли ваша "
+"прошивка Ñту функцию, то не отмечайте Ñто значение."
+
+#: src/libslic3r/PrintConfig.cpp:2371
+msgid "Use volumetric E"
+msgstr "ИÑпользовать объёмные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ E"
+
+#: src/libslic3r/PrintConfig.cpp:2372
+msgid ""
+"This experimental setting uses outputs the E values in cubic millimeters "
+"instead of linear millimeters. If your firmware doesn't already know "
+"filament diameter(s), you can put commands like 'M200 D[filament_diameter_0] "
+"T0' in your start G-code in order to turn volumetric mode on and use the "
+"filament diameter associated to the filament selected in Slic3r. This is "
+"only supported in recent Marlin."
+msgstr ""
+"Это ÑкÑпериментальный параметр иÑпользует выходные Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÑкÑтрудера в "
+"кубичеÑких миллиметрах вмеÑто линейных миллиметров. ЕÑли ваша прошивка ещё "
+"не знает диаметр прутка, вы можете помеÑтить в Ñвой Ñтартовый G-код команду "
+"«M200 D [диаметр_прутка_0] T0», чтобы включить объёмный режим и иÑпользовать "
+"диаметр прутка, указанный в Slic3r. ПоддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ в поÑледних "
+"верÑиÑÑ… Marlin."
+
+#: src/libslic3r/PrintConfig.cpp:2382
+msgid "Enable variable layer height feature"
+msgstr "Включить функцию переменной выÑоты Ñлоёв"
+
+#: src/libslic3r/PrintConfig.cpp:2383
+msgid ""
+"Some printers or printer setups may have difficulties printing with a "
+"variable layer height. Enabled by default."
+msgstr ""
+"Ðекоторые принтеры (или из-за наÑтроек принтера) могут иÑпытывать трудноÑти "
+"при печати Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸ÐµÐ¹ переменной выÑотой Ñлоёв. По умолчанию включено."
+
+#: src/libslic3r/PrintConfig.cpp:2389
+msgid "Wipe while retracting"
+msgstr "Ретракт во Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ"
+
+#: src/libslic3r/PrintConfig.cpp:2390
+msgid ""
+"This flag will move the nozzle while retracting to minimize the possible "
+"blob on leaky extruders."
+msgstr ""
+"ПозволÑет Ñоплу перемещатьÑÑ Ð²Ð¾ Ð²Ñ€ÐµÐ¼Ñ Ñ€ÐµÑ‚Ñ€Ð°ÐºÑ‚Ð° (втÑÐ³Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€ÑƒÑ‚ÐºÐ°), чтобы "
+"ÑвеÑти к минимуму возможное образование капли на не герметичных ÑкÑтрудерах."
+
+#: src/libslic3r/PrintConfig.cpp:2397
+msgid ""
+"Multi material printers may need to prime or purge extruders on tool "
+"changes. Extrude the excess material into the wipe tower."
+msgstr ""
+"Ð”Ð»Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ð¼Ð°Ñ‚ÐµÑ€Ð¸Ð°Ð»ÑŒÐ½Ñ‹Ñ… принтеров может потребоватьÑÑ Ð¿Ñ€ÐµÐ´Ð·Ð°Ñ€Ñдка и прочиÑтка "
+"Ñопел при их Ñмене. Избыточный материал будет выдавливатьÑÑ Ð½Ð° башню очиÑтки."
+
+#: src/libslic3r/PrintConfig.cpp:2403
+msgid "Purging volumes - load/unload volumes"
+msgstr "Очищающие объёмы - загрузка/выгрузка объёмов"
+
+#: src/libslic3r/PrintConfig.cpp:2404
+msgid ""
+"This vector saves required volumes to change from/to each tool used on the "
+"wipe tower. These values are used to simplify creation of the full purging "
+"volumes below."
+msgstr ""
+"Этот вектор задаёт объём материала, который будет выдавлен на башню очиÑтки "
+"Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ‡Ð¸Ñтки Ñопла при Ñмене ÑкÑтрудеров/инÑтрументов. Эти Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ "
+"иÑпользуютÑÑ Ð´Ð»Ñ ÑƒÐ¿Ñ€Ð¾Ñ‰ÐµÐ½Ð¸Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¿Ð¾Ð»Ð½Ð¾Ñ‚Ñ‹ объёмов очиÑтки, указанной ниже."
+
+#: src/libslic3r/PrintConfig.cpp:2410
+msgid "Purging volumes - matrix"
+msgstr "Таблица очищающих объёмов"
+
+#: src/libslic3r/PrintConfig.cpp:2411
+msgid ""
+"This matrix describes volumes (in cubic milimetres) required to purge the "
+"new filament on the wipe tower for any given pair of tools."
+msgstr ""
+"Эта таблица опиÑывает объёмы (в кубичеÑких миллиметрах), необходимые Ð´Ð»Ñ "
+"прочиÑтки нового прутка на башне очиÑтки Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð¹ пары Ñопел/ÑкÑтрудеров."
+
+#: src/libslic3r/PrintConfig.cpp:2420
+msgid "Position X"
+msgstr "Ð¥ позициÑ"
+
+#: src/libslic3r/PrintConfig.cpp:2421
+msgid "X coordinate of the left front corner of a wipe tower"
+msgstr "X координата левого переднего угла башни очиÑтки"
+
+#: src/libslic3r/PrintConfig.cpp:2427
+msgid "Position Y"
+msgstr "Y позициÑ"
+
+#: src/libslic3r/PrintConfig.cpp:2428
+msgid "Y coordinate of the left front corner of a wipe tower"
+msgstr "Y координата левого переднего угла башни очиÑтки"
+
+#: src/libslic3r/PrintConfig.cpp:2435
+msgid "Width of a wipe tower"
+msgstr "Ширина башни очиÑтки"
+
+#: src/libslic3r/PrintConfig.cpp:2441
+msgid "Wipe tower rotation angle"
+msgstr "Угол поворота башни очиÑтки"
+
+#: src/libslic3r/PrintConfig.cpp:2442
+msgid "Wipe tower rotation angle with respect to x-axis."
+msgstr "Угол поворота башни очиÑтки отноÑительно оÑи X."
+
+#: src/libslic3r/PrintConfig.cpp:2449
+msgid "Wipe into this object's infill"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2450
+msgid ""
+"Purging after toolchange will done inside this object's infills. This lowers "
+"the amount of waste but may result in longer print time due to additional "
+"travel moves."
+msgstr ""
+"ПрочиÑтка Ñопла поÑле Ñмены будет выполнÑÑ‚ÑŒÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ заполнениÑ. Это "
+"уменьшает количеÑтво отходов, но может привеÑти к увеличению времени печати "
+"из-за дополнительных перемещений."
+
+#: src/libslic3r/PrintConfig.cpp:2457
+msgid "Wipe into this object"
+msgstr "ПрочиÑтка в объект"
+
+#: src/libslic3r/PrintConfig.cpp:2458
+msgid ""
+"Object will be used to purge the nozzle after a toolchange to save material "
+"that would otherwise end up in the wipe tower and decrease print time. "
+"Colours of the objects will be mixed as a result."
+msgstr ""
+"ПрочиÑтка Ñопла поÑле Ñмены будет выполнÑÑ‚ÑŒÑÑ Ð² объекте, чтобы Ñохранить "
+"материал (который иначе попал бы на башню очиÑтки) и Ñократить Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸. "
+"Ð’ результате цвета объектов будут Ñмешаны."
+
+#: src/libslic3r/PrintConfig.cpp:2464
+msgid "Maximal bridging distance"
+msgstr "МакÑимальное длина моÑта"
+
+#: src/libslic3r/PrintConfig.cpp:2465
+msgid "Maximal distance between supports on sparse infill sections."
+msgstr ""
+"МакÑимальное раÑÑтоÑние между опорами на разрÑженных учаÑтках заполнениÑ."
+
+#: src/libslic3r/PrintConfig.cpp:2471
+msgid "XY Size Compensation"
+msgstr "ÐšÐ¾Ñ€Ñ€ÐµÐºÑ†Ð¸Ñ Ð³Ð¾Ñ€Ð¸Ð·Ð¾Ð½Ñ‚Ð°Ð»ÑŒÐ½Ñ‹Ñ… размеров модели"
+
+#: src/libslic3r/PrintConfig.cpp:2473
+msgid ""
+"The object will be grown/shrunk in the XY plane by the configured value "
+"(negative = inwards, positive = outwards). This might be useful for fine-"
+"tuning hole sizes."
+msgstr ""
+"Параметр, отвечает за Ñмещение границы контура печатаемого объекта в "
+"плоÑкоÑти XY на заданное значение. Отрицательное значение - во внутрь, "
+"положительный - наружу. Может быть полезно Ð´Ð»Ñ Ñ‚Ð¾Ñ‡Ð½Ð¾Ð¹ наÑтройки размеров "
+"отверÑтий, при печати шевронных подшипников."
+
+#: src/libslic3r/PrintConfig.cpp:2481
+msgid "Z offset"
+msgstr "Смещение платформы по оÑи Z"
+
+#: src/libslic3r/PrintConfig.cpp:2482
+msgid ""
+"This value will be added (or subtracted) from all the Z coordinates in the "
+"output G-code. It is used to compensate for bad Z endstop position: for "
+"example, if your endstop zero actually leaves the nozzle 0.3mm far from the "
+"print bed, set this to -0.3 (or fix your endstop)."
+msgstr ""
+"Это значение будет добавлено (или вычтено) из вÑех координат Z в конечном"
+" G-коде. "
+"ИÑпользуетÑÑ Ð´Ð»Ñ Ð¸ÑÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¾ÑˆÐ¸Ð±Ð¾Ðº работы концевого датчика Z: например, "
+"еÑли при нулевом значении по датчику Ñопло в дейÑтвительноÑти выше платформы"
+" на "
+"0.3 мм, то укажите здеÑÑŒ -0.3 (или иÑправьте датчик)."
+
+#: src/libslic3r/PrintConfig.cpp:2549
+msgid "Display width"
+msgstr "Ширина диÑплеÑ"
+
+#: src/libslic3r/PrintConfig.cpp:2550
+msgid "Width of the display"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2555
+msgid "Display height"
+msgstr "Ð’Ñ‹Ñота диÑплеÑ"
+
+#: src/libslic3r/PrintConfig.cpp:2556
+msgid "Height of the display"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2561
+msgid "Number of pixels in"
+msgstr "КоличеÑтво пикÑелей в"
+
+#: src/libslic3r/PrintConfig.cpp:2563
+msgid "Number of pixels in X"
+msgstr "КоличеÑтво пикÑелей в X"
+
+#: src/libslic3r/PrintConfig.cpp:2569
+msgid "Number of pixels in Y"
+msgstr "КоличеÑтво пикÑелей в Y"
+
+#: src/libslic3r/PrintConfig.cpp:2574
+msgid "Display horizontal mirroring"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2575
+msgid "Mirror horizontally"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2576
+msgid "Enable horizontal mirroring of output images"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2581
+msgid "Display vertical mirroring"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2582
+msgid "Mirror vertically"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2583
+msgid "Enable vertical mirroring of output images"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2588
+msgid "Display orientation"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2589
+msgid ""
+"Set the actual LCD display orientation inside the SLA printer. Portrait mode "
+"will flip the meaning of display width and height parameters and the output "
+"images will be rotated by 90 degrees."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2595
+msgid "Landscape"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2596
+msgid "Portrait"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2601
+msgid "Fast"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2602
+msgid "Fast tilt"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2603
+msgid "Time of the fast tilt"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2610
+msgid "Slow"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2611
+msgid "Slow tilt"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2612
+msgid "Time of the slow tilt"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2619
+msgid "Area fill"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2620
+msgid ""
+"The percentage of the bed area. \n"
+"If the print area exceeds the specified value, \n"
+"then a slow tilt will be used, otherwise - a fast tilt"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2627 src/libslic3r/PrintConfig.cpp:2628
+#: src/libslic3r/PrintConfig.cpp:2629
+msgid "Printer scaling correction"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2635 src/libslic3r/PrintConfig.cpp:2636
+msgid "Printer absolute correction"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2637
+msgid ""
+"Will inflate or deflate the sliced 2D polygons according to the sign of the "
+"correction."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2643
+msgid "Elephant foot minimum width"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2645
+msgid ""
+"Minimum width of features to maintain when doing elephant foot compensation."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2652 src/libslic3r/PrintConfig.cpp:2653
+msgid "Printer gamma correction"
+msgstr "Гамма Ð¼Ð¾Ð´Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð°"
+
+#: src/libslic3r/PrintConfig.cpp:2654
+msgid ""
+"This will apply a gamma correction to the rasterized 2D polygons. A gamma "
+"value of zero means thresholding with the threshold in the middle. This "
+"behaviour eliminates antialiasing without losing holes in polygons."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2666 src/libslic3r/PrintConfig.cpp:2667
+msgid "SLA material type"
+msgstr "Тип материала SLA"
+
+#: src/libslic3r/PrintConfig.cpp:2678 src/libslic3r/PrintConfig.cpp:2679
+msgid "Initial layer height"
+msgstr "Ð’Ñ‹Ñота иÑходного ÑлоÑ"
+
+#: src/libslic3r/PrintConfig.cpp:2685 src/libslic3r/PrintConfig.cpp:2686
+msgid "Bottle volume"
+msgstr "Объем бутылки"
+
+#: src/libslic3r/PrintConfig.cpp:2687
+msgid "ml"
+msgstr "мл"
+
+#: src/libslic3r/PrintConfig.cpp:2692 src/libslic3r/PrintConfig.cpp:2693
+msgid "Bottle weight"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2694
+msgid "kg"
+msgstr "кг"
+
+#: src/libslic3r/PrintConfig.cpp:2701
+msgid "g/ml"
+msgstr "г/мл"
+
+#: src/libslic3r/PrintConfig.cpp:2708
+msgid "money/bottle"
+msgstr "денег/бутылка"
+
+#: src/libslic3r/PrintConfig.cpp:2713
+msgid "Faded layers"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2714
+msgid ""
+"Number of the layers needed for the exposure time fade from initial exposure "
+"time to the exposure time"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2721 src/libslic3r/PrintConfig.cpp:2722
+msgid "Minimum exposure time"
+msgstr "Минимальное Ð²Ñ€ÐµÐ¼Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð°"
+
+#: src/libslic3r/PrintConfig.cpp:2729 src/libslic3r/PrintConfig.cpp:2730
+msgid "Maximum exposure time"
+msgstr "МакÑимальное Ð²Ñ€ÐµÐ¼Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð°"
+
+#: src/libslic3r/PrintConfig.cpp:2737 src/libslic3r/PrintConfig.cpp:2738
+msgid "Exposure time"
+msgstr "Ð’Ñ€ÐµÐ¼Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð°"
+
+#: src/libslic3r/PrintConfig.cpp:2744 src/libslic3r/PrintConfig.cpp:2745
+msgid "Minimum initial exposure time"
+msgstr "Минимальное начальное Ð²Ñ€ÐµÐ¼Ñ ÐºÐ¾Ð½Ñ‚Ð°ÐºÑ‚Ð°"
+
+#: src/libslic3r/PrintConfig.cpp:2752 src/libslic3r/PrintConfig.cpp:2753
+msgid "Maximum initial exposure time"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2760 src/libslic3r/PrintConfig.cpp:2761
+msgid "Initial exposure time"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2767 src/libslic3r/PrintConfig.cpp:2768
+msgid "Correction for expansion"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2774
+msgid "SLA print material notes"
+msgstr "ÐŸÑ€Ð¸Ð¼ÐµÑ‡Ð°Ð½Ð¸Ñ Ðº материалу Ð´Ð»Ñ SLA-печати"
+
+#: src/libslic3r/PrintConfig.cpp:2775
+msgid "You can put your notes regarding the SLA print material here."
+msgstr "ЗдеÑÑŒ вы можете размеÑтить Ñвои заметки о материале Ð´Ð»Ñ SLA печати."
+
+#: src/libslic3r/PrintConfig.cpp:2787 src/libslic3r/PrintConfig.cpp:2798
+msgid "Default SLA material profile"
+msgstr "Профиль материала SLA-печати по умолчанию"
+
+#: src/libslic3r/PrintConfig.cpp:2809
+msgid "Generate supports"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2811
+msgid "Generate supports for the models"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2816
+msgid "Pinhead front diameter"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2818
+msgid "Diameter of the pointing side of the head"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2825
+msgid "Head penetration"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2827
+msgid "How much the pinhead has to penetrate the model surface"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2834
+msgid "Pinhead width"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2836
+msgid "Width from the back sphere center to the front sphere center"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2844
+msgid "Pillar diameter"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2846
+msgid "Diameter in mm of the support pillars"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2854
+msgid "Small pillar diameter percent"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2856
+msgid ""
+"The percentage of smaller pillars compared to the normal pillar diameter "
+"which are used in problematic areas where a normal pilla cannot fit."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2865
+msgid "Max bridges on a pillar"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2867
+msgid ""
+"Maximum number of bridges that can be placed on a pillar. Bridges hold "
+"support point pinheads and connect to pillars as small branches."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2875
+msgid "Pillar connection mode"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2876
+msgid ""
+"Controls the bridge type between two neighboring pillars. Can be zig-zag, "
+"cross (double zig-zag) or dynamic which will automatically switch between "
+"the first two depending on the distance of the two pillars."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2884
+msgid "Zig-Zag"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2885
+msgid "Cross"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2886
+msgid "Dynamic"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2898
+msgid "Pillar widening factor"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2900
+msgid ""
+"Merging bridges or pillars into another pillars can increase the radius. "
+"Zero means no increase, one means full increase."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2909
+msgid "Support base diameter"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2911
+msgid "Diameter in mm of the pillar base"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2919
+msgid "Support base height"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2921
+msgid "The height of the pillar base cone"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2928
+msgid "Support base safety distance"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2931
+msgid ""
+"The minimum distance of the pillar base from the model in mm. Makes sense in "
+"zero elevation mode where a gap according to this parameter is inserted "
+"between the model and the pad."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2941
+msgid "Critical angle"
+msgstr "КритичеÑкий угол"
+
+#: src/libslic3r/PrintConfig.cpp:2943
+msgid "The default angle for connecting support sticks and junctions."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2951
+msgid "Max bridge length"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2953
+msgid "The max length of a bridge"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2960
+msgid "Max pillar linking distance"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2962
+msgid ""
+"The max distance of two pillars to get linked with each other. A zero value "
+"will prohibit pillar cascading."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2972
+msgid ""
+"How much the supports should lift up the supported object. If \"Pad around "
+"object\" is enabled, this value is ignored."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2983
+msgid "This is a relative measure of support points density."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2989
+msgid "Minimal distance of the support points"
+msgstr "Минимальное раÑÑтоÑние опорных точек"
+
+#: src/libslic3r/PrintConfig.cpp:2991
+msgid "No support points will be placed closer than this threshold."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2997
+msgid "Use pad"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:2999
+msgid "Add a pad underneath the supported model"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3004
+msgid "Pad wall thickness"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3006
+msgid "The thickness of the pad and its optional cavity walls."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3014
+msgid "Pad wall height"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3015
+msgid ""
+"Defines the pad cavity depth. Set to zero to disable the cavity. Be careful "
+"when enabling this feature, as some resins may produce an extreme suction "
+"effect inside the cavity, which makes peeling the print off the vat foil "
+"difficult."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3028
+msgid "Pad brim size"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3029
+msgid "How far should the pad extend around the contained geometry"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3039
+msgid "Max merge distance"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3041
+msgid ""
+"Some objects can get along with a few smaller pads instead of a single big "
+"one. This parameter defines how far the center of two smaller pads should "
+"be. If theyare closer, they will get merged into one pad."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3061
+msgid "Pad wall slope"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3063
+msgid ""
+"The slope of the pad wall relative to the bed plane. 90 degrees means "
+"straight walls."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3074
+msgid "Create pad around object and ignore the support elevation"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3079
+msgid "Pad around object everywhere"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3081
+msgid "Force pad around object everywhere"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3086
+msgid "Pad object gap"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3088
+msgid ""
+"The gap between the object bottom and the generated pad in zero elevation "
+"mode."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3097
+msgid "Pad object connector stride"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3099
+msgid ""
+"Distance between two connector sticks which connect the object and the "
+"generated pad."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3106
+msgid "Pad object connector width"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3108
+msgid ""
+"Width of the connector sticks which connect the object and the generated pad."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3115
+msgid "Pad object connector penetration"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3118
+msgid "How much should the tiny connectors penetrate into the model body."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3125
+msgid "Enable hollowing"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3127
+msgid "Hollow out a model to have an empty interior"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3132
+msgid "Wall thickness"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3134
+msgid "Minimum wall thickness of a hollowed model."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3142
+msgid "Accuracy"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3144
+msgid ""
+"Performance vs accuracy of calculation. Lower values may produce unwanted "
+"artifacts."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3154
+msgid ""
+"Hollowing is done in two steps: first, an imaginary interior is calculated "
+"deeper (offset plus the closing distance) in the object and then it's "
+"inflated back to the specified offset. A greater closing distance makes the "
+"interior more rounded. At zero, the interior will resemble the exterior the "
+"most."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3567
+msgid "Export OBJ"
+msgstr "ЭкÑпорт в OBJ"
+
+#: src/libslic3r/PrintConfig.cpp:3568
+msgid "Export the model(s) as OBJ."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3579
+msgid "Export SLA"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3580
+msgid "Slice the model and export SLA printing layers as PNG."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3585
+msgid "Export 3MF"
+msgstr "ЭкÑпорт в 3MF"
+
+#: src/libslic3r/PrintConfig.cpp:3586
+msgid "Export the model(s) as 3MF."
+msgstr "ЭкÑпортировать модель(и) в 3MF."
+
+#: src/libslic3r/PrintConfig.cpp:3590
+msgid "Export AMF"
+msgstr "ЭкÑпорт в AMF"
+
+#: src/libslic3r/PrintConfig.cpp:3591
+msgid "Export the model(s) as AMF."
+msgstr "ЭкÑпортировать модель(и) в AMF."
+
+#: src/libslic3r/PrintConfig.cpp:3595
+msgid "Export STL"
+msgstr "ЭкÑпорт в STL"
+
+#: src/libslic3r/PrintConfig.cpp:3596
+msgid "Export the model(s) as STL."
+msgstr "ЭкÑпортировать модель(и) в STL."
+
+#: src/libslic3r/PrintConfig.cpp:3601
+msgid "Slice the model and export toolpaths as G-code."
+msgstr "Ðарезать модель и ÑкÑпортировать траектории в G-код."
+
+#: src/libslic3r/PrintConfig.cpp:3606
+msgid "G-code viewer"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3607
+msgid "Visualize an already sliced and saved G-code"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3612
+msgid "Slice"
+msgstr "Ðарезать"
+
+#: src/libslic3r/PrintConfig.cpp:3613
+msgid ""
+"Slice the model as FFF or SLA based on the printer_technology configuration "
+"value."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3618
+msgid "Help"
+msgstr "Справка"
+
+#: src/libslic3r/PrintConfig.cpp:3619
+msgid "Show this help."
+msgstr "Показать Ñту Ñправку."
+
+#: src/libslic3r/PrintConfig.cpp:3624
+msgid "Help (FFF options)"
+msgstr "Справка (параметры Ð´Ð»Ñ FFF)"
+
+#: src/libslic3r/PrintConfig.cpp:3625
+msgid "Show the full list of print/G-code configuration options."
+msgstr "Показать полный ÑпиÑок параметров наÑтройки печати/G-кода."
+
+#: src/libslic3r/PrintConfig.cpp:3629
+msgid "Help (SLA options)"
+msgstr "Справка (параметры Ð´Ð»Ñ SLA)"
+
+#: src/libslic3r/PrintConfig.cpp:3630
+msgid "Show the full list of SLA print configuration options."
+msgstr "Показать полный ÑпиÑок параметров наÑтройки печати по технологии SLA."
+
+#: src/libslic3r/PrintConfig.cpp:3634
+msgid "Output Model Info"
+msgstr "ВывеÑти информацию о модели"
+
+#: src/libslic3r/PrintConfig.cpp:3635
+msgid "Write information about the model to the console."
+msgstr "ЗапиÑать информацию о модели в конÑоль."
+
+#: src/libslic3r/PrintConfig.cpp:3639
+msgid "Save config file"
+msgstr "Сохранить файл наÑтроек"
+
+#: src/libslic3r/PrintConfig.cpp:3640
+msgid "Save configuration to the specified file."
+msgstr "Сохранить наÑтройки в указанный файл."
+
+#: src/libslic3r/PrintConfig.cpp:3650
+msgid "Align XY"
+msgstr "ВыровнÑÑ‚ÑŒ XY"
+
+#: src/libslic3r/PrintConfig.cpp:3651
+msgid "Align the model to the given point."
+msgstr "ВыровнÑÑ‚ÑŒ модель в указанной точке."
+
+#: src/libslic3r/PrintConfig.cpp:3656
+msgid "Cut model at the given Z."
+msgstr "Разрезать модель на указанном Z."
+
+#: src/libslic3r/PrintConfig.cpp:3677
+msgid "Center"
+msgstr "Центр"
+
+#: src/libslic3r/PrintConfig.cpp:3678
+msgid "Center the print around the given center."
+msgstr "РаÑположить печать вокруг указанного центра."
+
+#: src/libslic3r/PrintConfig.cpp:3682
+msgid "Don't arrange"
+msgstr "Ðе раÑÑтавлÑÑ‚ÑŒ"
+
+#: src/libslic3r/PrintConfig.cpp:3683
+msgid ""
+"Do not rearrange the given models before merging and keep their original XY "
+"coordinates."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3686
+msgid "Duplicate"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3687
+msgid "Multiply copies by this factor."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3691
+msgid "Duplicate by grid"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3692
+msgid "Multiply copies by creating a grid."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3696
+msgid ""
+"Arrange the supplied models in a plate and merge them in a single model in "
+"order to perform actions once."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3701
+msgid ""
+"Try to repair any non-manifold meshes (this option is implicitly added "
+"whenever we need to slice the model to perform the requested action)."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3705
+msgid "Rotation angle around the Z axis in degrees."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3709
+msgid "Rotate around X"
+msgstr "Повернуть вокруг X"
+
+#: src/libslic3r/PrintConfig.cpp:3710
+msgid "Rotation angle around the X axis in degrees."
+msgstr "Поворот вокруг оÑи X в градуÑах."
+
+#: src/libslic3r/PrintConfig.cpp:3714
+msgid "Rotate around Y"
+msgstr "Повернуть вокруг Y"
+
+#: src/libslic3r/PrintConfig.cpp:3715
+msgid "Rotation angle around the Y axis in degrees."
+msgstr "Поворот вокруг оÑи Y в градуÑах."
+
+#: src/libslic3r/PrintConfig.cpp:3720
+msgid "Scaling factor or percentage."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3725
+msgid ""
+"Detect unconnected parts in the given model(s) and split them into separate "
+"objects."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3728
+msgid "Scale to Fit"
+msgstr "МаÑштабировать по размеру"
+
+#: src/libslic3r/PrintConfig.cpp:3729
+msgid "Scale to fit the given volume."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3738
+msgid "Ignore non-existent config files"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3739
+msgid "Do not fail if a file supplied to --load does not exist."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3742
+msgid "Load config file"
+msgstr "Загрузить конфигурационный файл"
+
+#: src/libslic3r/PrintConfig.cpp:3743
+msgid ""
+"Load configuration from the specified file. It can be used more than once to "
+"load options from multiple files."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3746
+msgid "Output File"
+msgstr "Выходной файл"
+
+#: src/libslic3r/PrintConfig.cpp:3747
+msgid ""
+"The file where the output will be written (if not specified, it will be "
+"based on the input file)."
+msgstr ""
+"Файл, в который будет запиÑан результат (еÑли не указан, то Ð¸Ð¼Ñ Ð±ÑƒÐ´ÐµÑ‚ "
+"оÑновано на имени входного файла)."
+
+#: src/libslic3r/PrintConfig.cpp:3752
+msgid ""
+"If enabled, the command line arguments are sent to an existing instance of "
+"GUI PrusaSlicer, or an existing PrusaSlicer window is activated. Overrides "
+"the \"single_instance\" configuration value from application preferences."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3763
+msgid "Data directory"
+msgstr "Каталог данных"
+
+#: src/libslic3r/PrintConfig.cpp:3764
+msgid ""
+"Load and store settings at the given directory. This is useful for "
+"maintaining different profiles or including configurations from a network "
+"storage."
+msgstr ""
+"Загрузка и Ñохранение наÑтроек в указанный каталог. Полезно Ð´Ð»Ñ Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ "
+"различных профилей или Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½Ð°Ñтроек из Ñетевого хранилища."
+
+#: src/libslic3r/PrintConfig.cpp:3767
+msgid "Logging level"
+msgstr "Уровень протоколированиÑ"
+
+#: src/libslic3r/PrintConfig.cpp:3768
+msgid ""
+"Sets logging sensitivity. 0:fatal, 1:error, 2:warning, 3:info, 4:debug, 5:"
+"trace\n"
+"For example. loglevel=2 logs fatal, error and warning level messages."
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3774
+msgid "Render with a software renderer"
+msgstr ""
+
+#: src/libslic3r/PrintConfig.cpp:3775
+msgid ""
+"Render with a software renderer. The bundled MESA software renderer is "
+"loaded instead of the default OpenGL driver."
+msgstr ""
+
+#: src/libslic3r/Zipper.cpp:27
+msgid "Error with zip archive"
+msgstr ""
+
+#: src/libslic3r/PrintObject.cpp:113
+msgid "Processing triangulated mesh"
+msgstr "Обрабатывает Ñ‚Ñ€ÐµÑƒÐ³Ð¾Ð»ÑŒÐ½Ð°Ñ Ñетка"
+
+#: src/libslic3r/PrintObject.cpp:157
+msgid "Generating perimeters"
+msgstr "ГенерируютÑÑ Ð¿ÐµÑ€Ð¸Ð¼ÐµÑ‚Ñ€Ñ‹"
+
+#: src/libslic3r/PrintObject.cpp:260
+msgid "Preparing infill"
+msgstr "Подготовка заполнениÑ"
+
+#: src/libslic3r/PrintObject.cpp:421
+msgid "Generating support material"
+msgstr "ГенерируетÑÑ Ð¼Ð°Ñ‚ÐµÑ€Ð¸Ð°Ð» поддержки"
+
+#~ msgid "Jump to height %s or Set extruder sequence for the entire print"
+#~ msgstr ""
+#~ "Перейти к выÑоте %s или уÑтановить поÑледовательноÑÑ‚ÑŒ ÑкÑтрудеров Ð´Ð»Ñ "
+#~ "вÑей печати"
+
+#~ msgid "Default print color"
+#~ msgstr "Цвет печати по умолчанию"
+
+#~ msgid "Pause print or custom G-code"
+#~ msgstr "Пауза печати или пользовательÑкий G-код"
+
+#~ msgid "%.2f - %.2f mm"
+#~ msgstr "%.2f - %.2f мм"
+
+#~ msgid "Legend"
+#~ msgstr "ОбозначениÑ"
+
+#~ msgid ""
+#~ "This is the acceleration your printer will use for perimeters. A high "
+#~ "value like 9000 usually gives good results if your hardware is up to the "
+#~ "job. Set zero to disable acceleration control for perimeters."
+#~ msgstr ""
+#~ "УÑкорение, которое принтер будет иÑпользовать Ð´Ð»Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸ внутренних "
+#~ "периметров. Ð’Ñ‹Ñокое значение, такое как 9000, обычно даёт хороший "
+#~ "результат, еÑли ваше оборудование ÑправлÑетÑÑ Ñ Ñ‚Ð°ÐºÐ¸Ð¼ значением. "
+#~ "УÑтановите 0, чтобы отключить управление уÑкорением Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€ÐµÐ½Ð½Ð¸Ñ… "
+#~ "периметров."
+
+#~ msgid ""
+#~ "Copying of the temporary G-code to the output G-code failed. Maybe the SD "
+#~ "card is write locked?"
+#~ msgstr ""
+#~ "Ðе удалоÑÑŒ Ñкопировать временный G-код в конечный G-код. Возможно SD-"
+#~ "карта защищена от запиÑи?"
+
+#~ msgid "Extruder and Bed Temperatures"
+#~ msgstr "Температуры ÑкÑтрудера и Ñтола"
+
+#~ msgid "An object outside the print area was detected"
+#~ msgstr "Обнаружен объект, выходÑщий за пределы облаÑти печати"
+
+#~ msgid "A toolpath outside the print area was detected"
+#~ msgstr "Обнаружена траекториÑ, выходÑÑ‰Ð°Ñ Ð·Ð° пределы облаÑти печати"
+
+#~ msgid "Some objects are not visible"
+#~ msgstr "Ðекоторые объекты невидимы"
+
+#~ msgid "FDM Support Editing"
+#~ msgstr "Правка поддержек FDM"
+
+#~ msgid "The presets on the following tabs were modified"
+#~ msgstr "Изменены наÑтройки на Ñледующих вкладках"
+
+#~ msgid "Discard changes and continue anyway?"
+#~ msgstr "ОтброÑить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ продолжить?"
+
+#~ msgid "Unsaved Presets"
+#~ msgstr "ÐеÑохранённые наÑтройки"
+
+#~ msgid "Unretractions"
+#~ msgstr "Подача (выдавливание)"
+
+#~ msgid ""
+#~ "Scale selection to fit print volume\n"
+#~ "in Gizmo scale"
+#~ msgstr "МаÑштабировать выбранную модель по оÑÑм XYZ"
+
+#~ msgid "Show/Hide Legend"
+#~ msgstr "Показать/Ñкрыть подÑказку"
+
+#~ msgid ""
+#~ " - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/"
+#~ "releases"
+#~ msgstr ""
+#~ " - Ðе забывайте проверÑÑ‚ÑŒ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð½Ð° https://github.com/prusa3d/"
+#~ "PrusaSlicer/"
+
+#~ msgid "Find option"
+#~ msgstr "Параметры поиÑка"
+
+#~ msgid "Show &slope"
+#~ msgstr "Показать метки"
+
+#~ msgid "&Options"
+#~ msgstr "Параметры"
+
+#~ msgid " was successfully sliced."
+#~ msgstr " уÑпешно нарезан."
+
+#~ msgid "Expand right panel"
+#~ msgstr "РаÑкрыть правую панель"
+
+#~ msgid "Collapse right panel"
+#~ msgstr "Скрыть правую панель"
+
+#~ msgid "Single Instance"
+#~ msgstr "Один ÑкземплÑÑ€"
+
+#~ msgid ""
+#~ "If this is enabled, when staring PrusaSlicer and another instance of same "
+#~ "PrusaSlicer is running, that instance will be reactivated instead."
+#~ msgstr ""
+#~ "ЕÑли включено, то при запуÑке проверÑетÑÑ Ð½ÐµÑ‚ ли уже работающего "
+#~ "PrusaSlicer, и при наличии открываетÑÑ ÑƒÐ¶Ðµ запущенный."
+
+#~ msgid "Show the button for the collapse sidebar"
+#~ msgstr "Показывать кнопку ÑÐºÑ€Ñ‹Ñ‚Ð¸Ñ Ð±Ð¾ÐºÐ¾Ð²Ð¾Ð¹ панели."
+
+#~ msgid "Add a new printer"
+#~ msgstr "Добавить новый принтер"
+
+#~ msgid "USB/Serial connection"
+#~ msgstr "USB/ПоÑледовательный порт"
+
+#~ msgid "Serial port"
+#~ msgstr "ПоÑледовательный порт"
+
+#~ msgid "Rescan serial ports"
+#~ msgstr "ПереÑканировать поÑледовательные порты"
+
+#~ msgid "Connection to printer works correctly."
+#~ msgstr "Подключение к принтеру уÑтановлено."
+
+#~ msgid "Connection failed."
+#~ msgstr "Сбой подключениÑ."
+
+#~ msgid "Default preset (%s)"
+#~ msgstr "Профиль по умолчанию (%s)"
+
+#~ msgid "Preset (%s)"
+#~ msgstr "Профиль (%s)"
+
+#~ msgid "has the following unsaved changes:"
+#~ msgstr "имеет Ñледующие неÑохранённые изменениÑ:"
+
+#~ msgid "is not compatible with printer"
+#~ msgstr "не ÑовмеÑтим Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð¾Ð¼"
+
+#~ msgid "is not compatible with print profile"
+#~ msgstr "не ÑовмеÑтим Ñ Ð¿Ñ€Ð¾Ñ„Ð¸Ð»ÐµÐ¼ принтера"
+
+#~ msgid "and it has the following unsaved changes:"
+#~ msgstr "и имеет Ñледующие неÑохранённые изменениÑ:"
+
+#~ msgid "Unsaved Changes"
+#~ msgstr "ÐеÑохранённые изменениÑ"
+
+#~ msgid "Exporting model..."
+#~ msgstr "ЭкÑпортируетÑÑ Ð¼Ð¾Ð´ÐµÐ»ÑŒâ€¦"
+
+#~ msgid ""
+#~ "The Wipe Tower is currently only supported for the Marlin, RepRap/"
+#~ "Sprinter and Repetier G-code flavors."
+#~ msgstr ""
+#~ "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ñ€ÐµÐ¶Ð¸Ð¼ черновой башни поддерживаетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ð´Ð»Ñ Marlin и "
+#~ "RepRap/Sprinter типов G-кода."
+
+#~ msgid "First layer extruder temperature"
+#~ msgstr "Объёмный раÑход первого ÑлоÑ"
+
+#~ msgid ""
+#~ "Extruder temperature for first layer. If you want to control temperature "
+#~ "manually during print, set this to zero to disable temperature control "
+#~ "commands in the output file."
+#~ msgstr ""
+#~ "Температура ÑкÑтрудера при печати первого ÑлоÑ. ЕÑли во Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸ "
+#~ "хотите контролировать температуру вручную, уÑтановите 0 Ð´Ð»Ñ Ð¾Ñ‚ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒ "
+#~ "команд ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ‚ÐµÐ¼Ð¿ÐµÑ€Ð°Ñ‚ÑƒÑ€Ð¾Ð¹ в выходном файле."
+
+#~ msgid "Distance between ironing lins"
+#~ msgstr "РаÑÑтоÑние между копиÑми"
+
+#~ msgid "Ironing speed"
+#~ msgstr "СкороÑÑ‚ÑŒ разглаживаниÑ"
+
+#~ msgid "USB/serial port for printer connection."
+#~ msgstr "Подключение к принтеру через USB/ПоÑледовательный порт."
+
+#~ msgid "Serial port speed"
+#~ msgstr "СкороÑÑ‚ÑŒ поÑледовательного порта"
+
+#~ msgid "Speed (baud) of USB/serial port for printer connection."
+#~ msgstr ""
+#~ "СкороÑÑ‚ÑŒ в бодах при подключении к принтеру через USB/ПоÑледовательный "
+#~ "порт."
+
+#~ msgid ""
+#~ "Extruder temperature for layers after the first one. Set this to zero to "
+#~ "disable temperature control commands in the output."
+#~ msgstr ""
+#~ "Температура ÑкÑтрудера Ð´Ð»Ñ Ñлоёв поÑле первого. УÑтановите 0 Ð´Ð»Ñ "
+#~ "Ð¾Ñ‚ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ñ‚ÐµÐ¼Ð¿ÐµÑ€Ð°Ñ‚ÑƒÑ€Ñ‹ на выходе."
+
+#~ msgid "Extruder temperature"
+#~ msgstr "Температуры ÑкÑтрудера и Ñтола"
+
+#~ msgid "Support head front diameter"
+#~ msgstr "Поддержка тихого режима"
+
+#~ msgid "Support head penetration"
+#~ msgstr "Генератор поддержек"
+
+#~ msgid "Support head width"
+#~ msgstr "Генератор поддержек"
+
+#~ msgid "Support pillar diameter"
+#~ msgstr "Поддержка тихого режима"
+
+#~ msgid "Support pillar connection mode"
+#~ msgstr "Поддержка тихого режима"
+
+#~ msgid "Layer height:"
+#~ msgstr "Ð’Ñ‹Ñота ÑлоÑ:"
+
+#~ msgid "Remove device"
+#~ msgstr "Удалить уÑтройÑтво"
+
+#~ msgid ""
+#~ "Unmounting successful. The device %s(%s) can now be safely removed from "
+#~ "the computer."
+#~ msgstr ""
+#~ "Размонтирование выполнено. Теперь уÑтройÑтво %s(%s) можно отключить от "
+#~ "компьютера."
+
+#~ msgid "Processing input file %s"
+#~ msgstr "ОбрабатываетÑÑ Ð²Ñ…Ð¾Ð´Ð½Ð¾Ð¹ файл %s"
+
+#~ msgid "Export failed"
+#~ msgstr "Ðе удалоÑÑŒ выполнить ÑкÑпорт"
+
+#~ msgid "Indexing hollowed object"
+#~ msgstr "Ðиже объекта"
+
+#~ msgid "Hollowing cancelled."
+#~ msgstr "Прошивка отменена."
+
+#~ msgid "Hollowing done."
+#~ msgstr "Ðарезка завершена"
+
+#~ msgid "Hollowing failed."
+#~ msgstr "Сбой подключениÑ."
+
+#~ msgid ""
+#~ "To except of redundant tool manipulation, \n"
+#~ "Color change(s) for unused extruder(s) was(were) deleted"
+#~ msgstr ""
+#~ "Ð”Ð»Ñ Ð¸ÑÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð½ÐµÐ½ÑƒÐ¶Ð½Ð¾Ð¹ работы Ñ Ð¸Ð½Ñтрументом\n"
+#~ "была удалена Ñмена цвета в неиÑпользуемых ÑкÑтрудерах"
+
+#~ msgid "Position (mm)"
+#~ msgstr "Ð¥ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð±Ð°ÑˆÐ½Ð¸"
+
+#~ msgid "Displacement (mm)"
+#~ msgstr "ИÑпользовано прутка в мм³"
+
+#~ msgid "Rotation (deg)"
+#~ msgstr "Длина ретракта"
+
+#~ msgid "Scale (%)"
+#~ msgstr "МаÑштаб"
+
+#~ msgid "Change Application &Language"
+#~ msgstr "Изменить Ñзык приложениÑ"
+
+#~ msgid "Select extruder number for selected objects and/or parts"
+#~ msgstr "Разделить выбранную модель на отдельные чаÑти"
+
+#~ msgid "Main Shortcuts"
+#~ msgstr "ОÑновные команды"
+
+#~ msgid "Select All objects"
+#~ msgstr "Выбрать вÑе объекты"
+
+#~ msgid "Delete All"
+#~ msgstr "Удалить вÑÑ‘"
+
+
+#~ msgid "Zoom to selected object"
+#~ msgstr "Удалить выбранную модель"
+
+#~ msgid "Plater Shortcuts"
+#~ msgstr "Команды работы на вкладке плиты"
+
+#~ msgid "The selected project is no more available"
+#~ msgstr "Выбранный проект больше недоÑтупен"
+
+#~ msgid "(default)"
+#~ msgstr "(по умолчанию)"
+
+#~ msgid "Welcome to the Slic3r %s"
+#~ msgstr "ПриветÑтвуем в Slic3r %s"
+
+#~ msgid "Other vendors"
+#~ msgstr "Другие производители"
+
+#~ msgid "Detected object outside print volume"
+#~ msgstr "Модель не помещаетÑÑ Ð² печатную облаÑÑ‚ÑŒ принтера"
+
+#~ msgid "Array of language names and identifiers should have the same size."
+#~ msgstr "СпиÑок Ñзыков и идентификаторов должен быть одного размера."
+
+#~ msgid "Application will be restarted"
+#~ msgstr "Приложение будет перезапущено."
+
+#~ msgid "You have unsaved changes "
+#~ msgstr "У Ð²Ð°Ñ ÐµÑÑ‚ÑŒ неÑохраненные Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² профиле: "
+
+#~ msgid "Attempt to free unreferenced scalar"
+#~ msgstr "Попытка оÑвободить неопределённый ÑкалÑÑ€"
+
+#~ msgid "The "
+#~ msgstr "Шаблон Ð·Ð°Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ "
+
+#~ msgid "Temperature "
+#~ msgstr "Температура "
+
+#~ msgid "Values in this column are for Full Power mode"
+#~ msgstr "Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² Ñтом Ñтолбце отноÑÑÑ‚ÑÑ Ðº режиму полной мощноÑти"
+
+#~ msgid "Full Power"
+#~ msgstr "ÐŸÐ¾Ð»Ð½Ð°Ñ Ð¼Ð¾Ñ‰Ð½Ð¾ÑÑ‚ÑŒ"
+
+#~ msgid "Silent"
+#~ msgstr "Тихий режим"
+
+#~ msgid "Default "
+#~ msgstr "По умолчанию "
+
+#~ msgid " preset\n"
+#~ msgstr " шаблон\n"
+
+#~ msgid ""
+#~ "\n"
+#~ "\n"
+#~ "Discard changes and continue anyway?"
+#~ msgstr ""
+#~ "\n"
+#~ "\n"
+#~ "Отменить Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð¸ продолжить в любом Ñлучае?"
+
+#~ msgid " the selected preset?"
+#~ msgstr " выбранный профиль?"
+
+#~ msgid " as:"
+#~ msgstr " как:"
+
+#~ msgid "%3.2f mm³/s"
+#~ msgstr "%3.2f мм³/Ñ"
+
+#~ msgid "Disable USB/serial connection"
+#~ msgstr "Отключить поÑледовательный порт/USB"
+
+#~ msgid ""
+#~ "Disable communication with the printer over a serial / USB cable. This "
+#~ "simplifies the user interface in case the printer is never attached to "
+#~ "the computer."
+#~ msgstr ""
+#~ "Отключить ÑвÑзь Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð¾Ð¼ через поÑледовательный порт / USB кабель. "
+#~ "ÐžÐ¿Ñ†Ð¸Ñ ÑƒÐ¿Ñ€Ð¾Ñ‰Ð°ÐµÑ‚ пользовательÑкий Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð² Ñлучае, еÑли принтер не будет "
+#~ "подключатьÑÑ Ðº компьютеру."
+
+#~ msgid "Use legacy OpenGL 1.1 rendering"
+#~ msgstr "ИÑпользовать уÑтаревшую верÑию OpenGL 1.1"
+
+#~ msgid ""
+#~ "If you have rendering issues caused by a buggy OpenGL 2.0 driver, you may "
+#~ "try to check this checkbox. This will disable the layer height editing "
+#~ "and anti aliasing, so it is likely better to upgrade your graphics driver."
+#~ msgstr ""
+#~ "ЕÑли у Ð²Ð°Ñ Ð²Ð¾Ð·Ð½Ð¸ÐºÐ»Ð¸ проблемы Ñ Ð¾Ñ‚Ñ€Ð¸Ñовкой в программе, вызванные "
+#~ "неиÑправным драйвером OpenGL 2.0, вы можете попробовать уÑтановить Ñтот "
+#~ "флажок. Это отключит функцию \"ÐŸÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð²Ñ‹Ñота Ñлоёв\" и Ñглаживание, "
+#~ "поÑтому вам вÑÑ‘ же лучше обновить графичеÑкий драйвер."
+
+#~ msgid "To download, follow the link below."
+#~ msgstr "Чтобы Ñкачать, перейдите по ÑÑылке ниже."
+
+#~ msgid "Exit Slic3r"
+#~ msgstr "Выйти из Slic3r"
+
+#~ msgid "Sending G-code file to the OctoPrint server..."
+#~ msgstr "Отправка файла G-кода на Ñервер OctoPrint..."
+
+#~ msgid ""
+#~ "All extruders must have the same diameter for single extruder "
+#~ "multimaterial printer."
+#~ msgstr ""
+#~ "Ð’Ñе ÑкÑтрудеры в одноÑкÑтрудерном мультиматериальном принтере должны "
+#~ "иметь Ñопло одинакового диаметра."
+
+#~ msgid "first_layer_height"
+#~ msgstr "first_layer_height"
+
+#~ msgid "mm or % (leave 0 for default)"
+#~ msgstr "мм или % (по умолчанию 0)"
+
+#~ msgid "mm or % (leave 0 for auto)"
+#~ msgstr "мм или % (0 Ð´Ð»Ñ Ð°Ð²Ñ‚Ð¾Ð½Ð°Ñтройки)"
+
+#~ msgid "Set silent mode for the G-code flavor"
+#~ msgstr "Тихий режим Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð³Ð¾ G-кода."
+
+#~ msgid "Maximum feedrate %1%"
+#~ msgstr "МакÑÐ¸Ð¼Ð°Ð»ÑŒÐ½Ð°Ñ ÑкороÑÑ‚ÑŒ подачи %1%"
+
+#~ msgid "Maximum acceleration %1%"
+#~ msgstr "МакÑимальное уÑкорение %1%"
+
+#~ msgid "API Key"
+#~ msgstr "API ключ"
+
+#~ msgid ""
+#~ "This custom code is inserted right before every extruder change. Note "
+#~ "that you can use placeholder variables for all Slic3r settings as well as "
+#~ "[previous_extruder] and [next_extruder]."
+#~ msgstr ""
+#~ "Этот пользовательÑкий код вÑтавлÑетÑÑ Ð¿ÐµÑ€ÐµÐ´ каждой Ñменой ÑкÑтрудера. "
+#~ "Обратите внимание, что вы можете иÑпользовать шаблонные переменные Ð´Ð»Ñ "
+#~ "вÑех параметров Slic3r, в том чиÑле [previous_extruder] и [next_extruder] "
+#~ "(предыдущий_ÑкÑтрудер и Ñледующий_ÑкÑтрудер)"
+
+#~ msgid "degrees"
+#~ msgstr "градуÑÑ‹"
+
+#~ msgid "Purging into infill"
+#~ msgstr "ПрочиÑтка в заполнение"
+
+#~ msgid "Version "
+#~ msgstr "ВерÑÐ¸Ñ "
+
+#~ msgid "Controller"
+#~ msgstr "Ð£Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð¾Ð¼"
+
+#~ msgid "&Load Config…\tCtrl+L"
+#~ msgstr "&Загрузить конфигурацию…\tCtrl+L"
+
+#~ msgid "&Export Config…\tCtrl+E"
+#~ msgstr "&Сохранить текущую конфигурацию…\tCtrl+E"
+
+#~ msgid "Q&uick Slice…\tCtrl+U"
+#~ msgstr "БыÑÑ‚Ñ€Ð°Ñ &нарезка…\tCtrl+U"
+
+#~ msgid "&Repeat Last Quick Slice\tCtrl+Shift+U"
+#~ msgstr "&Повтор поÑледней быÑтрой нарезки\tCtrl+Shift+U"
+
+#~ msgid "Slice to SV&G…\tCtrl+G"
+#~ msgstr "Ðарезать в SV&G…\tCtrl+G"
+
+#~ msgid "Slice file to a multi-layer SVG"
+#~ msgstr "Ðарезать в SVG"
+
+#~ msgid "Export current plate as 3MF"
+#~ msgstr "ЭкÑпортировать текущие модели Ñо Ñтола в 3MF"
+
+#~ msgid "Select &Controller Tab\tCtrl+T"
+#~ msgstr "Вкладка ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð½Ñ‚ÐµÑ€Ð¾Ð¼\tCtrl+T"
+
+#~ msgid "Show the printer controller"
+#~ msgstr "Показать управление принтером"
+
+#~ msgid "Prusa Edition Releases"
+#~ msgstr "Сайт Prusa Edition"
+
+#~ msgid "Slic3r &Manual"
+#~ msgstr "Онлайн руководÑтво по Slic3r"
+
+#~ msgid "Open the Slic3r manual in your browser"
+#~ msgstr "Открыть руководÑтво по Slic3r"
+
+#~ msgid "Report an issue on the Slic3r Prusa Edition"
+#~ msgstr "Сообщить о проблеме в Slic3r Prusa Edition"
+
+#~ msgid "2D"
+#~ msgstr "2D"
+
+#~ msgid "Add…"
+#~ msgstr "Добавить…"
+
+#~ msgid "Fewer"
+#~ msgstr "Меньше"
+
+#~ msgid "45° ccw"
+#~ msgstr "45° влево"
+
+#~ msgid "45° cw"
+#~ msgstr "45° вправо"
+
+#~ msgid "Scale…"
+#~ msgstr "МаÑштабирование..."
+
+#~ msgid "Cut…"
+#~ msgstr "Разрезать…"
+
+#~ msgid "Settings…"
+#~ msgstr "ÐаÑтройки…"
+
+#~ msgid "Copies"
+#~ msgstr "Копий"
+
+#~ msgid "Export G-code…"
+#~ msgstr "ЭкÑпорт G-кода…"
+
+#~ msgid "Print…"
+#~ msgstr "Печать…"
+
+#~ msgid "Enter the number of copies of the selected object:"
+#~ msgstr "Введите нужное количеÑтво копий выбранной модели:"
+
+#~ msgid ""
+#~ "\n"
+#~ "Non-positive value."
+#~ msgstr ""
+#~ "\n"
+#~ "Ðе положительное значение."
+
+#~ msgid ""
+#~ "\n"
+#~ "Not a numeric value."
+#~ msgstr ""
+#~ "\n"
+#~ "Ðе чиÑловое значение."
+
+#~ msgid "Slic3r Error"
+#~ msgstr "Ошибка Slic3r"
+
+#~ msgid "Enter the rotation angle:"
+#~ msgstr "Введите угол поворота:"
+
+#~ msgid "Enter the new size for the selected object (print bed: %smm):"
+#~ msgstr "Введите новый размер Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ модели (Ñтол: %s мм):"
+
+#~ msgid "Scale along "
+#~ msgstr "МаÑштаб по оÑи "
+
+#~ msgid "Enter the scale % for the selected object:"
+#~ msgstr "Введите нужный маÑштаб в % Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ модели:"
+
+#~ msgid "Enter the new max size for the selected object:"
+#~ msgstr "Введите новый макÑимальный размер Ð´Ð»Ñ Ð²Ñ‹Ð±Ñ€Ð°Ð½Ð½Ð¾Ð¹ модели:"
+
+#~ msgid "Slicing cancelled"
+#~ msgstr "Ðарезка отменена"
+
+#~ msgid "File added to print queue"
+#~ msgstr "Файл добавлен в очередь печати"
+
+#~ msgid "OctoPrint upload finished."
+#~ msgstr "Отправка на Ñервер OctoPrint выполнена."
+
+#~ msgid "Estimated printing time (silent mode)"
+#~ msgstr "РаÑчётное Ð²Ñ€ÐµÐ¼Ñ Ð¿ÐµÑ‡Ð°Ñ‚Ð¸ (тихий режим)"
+
+#~ msgid "Rotate 45° clockwise"
+#~ msgstr "Поворот на 45° по чаÑовой Ñтрелке"
+
+#~ msgid "Rotate the selected object by 45° clockwise"
+#~ msgstr "Поворот выбранной модели на 45° по чаÑовой Ñтрелке"
+
+#~ msgid "Rotate 45° counter-clockwise"
+#~ msgstr "Поворот на 45° против чаÑовой Ñтрелки"
+
+#~ msgid "Rotate the selected object by 45° counter-clockwise"
+#~ msgstr "Поворот выбранной модели на 45° против чаÑовой Ñтрелки"
+
+#~ msgid "Rotate the selected object by an arbitrary angle"
+#~ msgstr "Поворот выбранной модели на произвольный угол"
+
+#~ msgid "Around X axis…"
+#~ msgstr "Вокруг оÑи X..."
+
+#~ msgid "Rotate the selected object by an arbitrary angle around X axis"
+#~ msgstr "Поворот выбранной модели на произвольный угол вокруг оÑи X"
+
+#~ msgid "Around Y axis…"
+#~ msgstr "Вокруг оÑи Y..."
+
+#~ msgid "Rotate the selected object by an arbitrary angle around Y axis"
+#~ msgstr "Поворот выбранной модели на произвольный угол вокруг оÑи Y"
+
+#~ msgid "Around Z axis…"
+#~ msgstr "Вокруг оÑи Z..."
+
+#~ msgid "Rotate the selected object by an arbitrary angle around Z axis"
+#~ msgstr "Поворот выбранной модели на произвольный угол вокруг оÑи Z"
+
+#~ msgid "Scale the selected object along a single axis"
+#~ msgstr "МаÑштабирование выбранной модели вдоль одной оÑи"
+
+#~ msgid "Uniformly…"
+#~ msgstr "Одинаково..."
+
+#~ msgid "Scale the selected object along the X axis"
+#~ msgstr "МаÑштабировать выбранную модель вдоль оÑи Ð¥"
+
+#~ msgid "Scale the selected object along the Y axis"
+#~ msgstr "МаÑштабировать выбранную модель вдоль оÑи Y"
+
+#~ msgid "Scale the selected object along the Z axis"
+#~ msgstr "МаÑштабировать выбранную модель вдоль оÑи Z"
+
+#~ msgid "Open the 3D cutting tool"
+#~ msgstr "Открыть режущий инÑтрумент"
+
+#~ msgid "Open the object editor dialog"
+#~ msgstr "Открыть диалоговое окно редактора модели"
+
+#~ msgid "Export object as STL…"
+#~ msgstr "ЭкÑпорт модели в STL..."
+
+#~ msgid ""
+#~ "Fix the model by sending it to a Netfabb cloud service through Windows 10 "
+#~ "API"
+#~ msgstr ""
+#~ "ИÑправить модель, отправив её в облачную Ñлужбу Netfabb через API Windows "
+#~ "10"
diff --git a/resources/profiles/Anycubic.idx b/resources/profiles/Anycubic.idx
new file mode 100644
index 000000000..062a0ec00
--- /dev/null
+++ b/resources/profiles/Anycubic.idx
@@ -0,0 +1,9 @@
+min_slic3r_version = 2.3.0-beta2
+0.0.6 Reduced max print height for Predator. Updated end g-code, before layer change g-code and output filename format for Kossel.
+0.0.5 Updated end g-code.
+min_slic3r_version = 2.3.0-alpha2
+0.0.4 Fixed predator output filaname format, infill overlap.
+0.0.3 Fixed infill_overlap, start_gcode, end_gcode for Anycubic Predator
+0.0.2 Added Anycubic Predator
+min_slic3r_version = 2.3.0-alpha0
+0.0.1 Initial Version
diff --git a/resources/profiles/Anycubic.ini b/resources/profiles/Anycubic.ini
new file mode 100644
index 000000000..c36f50ec8
--- /dev/null
+++ b/resources/profiles/Anycubic.ini
@@ -0,0 +1,1778 @@
+# Print profiles for the Anycubic printers.
+
+[vendor]
+# Vendor name will be shown by the Config Wizard.
+name = Anycubic
+# Configuration version of this file. Config file will only be installed, if the config_version differs.
+# This means, the server may force the PrusaSlicer configuration to be downgraded.
+config_version = 0.0.6
+# Where to get the updates from?
+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.
+# Printer model name will be shown by the installation wizard.
+
+[printer_model:AKLP]
+name = Anycubic Kossel Linear Plus
+variants = 0.4
+technology = FFF
+family = KOSSEL
+bed_model = AKLP_Bed.stl
+bed_texture = AK.png
+default_materials = Generic PLA @AKOSSEL; Generic PETG @AKOSSEL; Generic ABS @AKOSSEL
+
+[printer_model:AK]
+name = Anycubic Kossel Pulley (Linear)
+variants = 0.4
+technology = FFF
+family = KOSSEL
+bed_model = AK_Bed.stl
+bed_texture = AK.png
+default_materials = Generic PLA @AKOSSEL; Generic PETG @AKOSSEL; Generic ABS @AKOSSEL
+
+[printer_model:MEGA0]
+name = Anycubic Mega Zero
+variants = 0.4
+technology = FFF
+family = MEGA
+bed_model = mega0_bed.stl
+bed_texture = mega0.svg
+default_materials = Generic PLA @MEGA0; Generic PETG @MEGA0; Anycubic PLA @MEGA0; Prusament PLA @MEGA0; Prusament PETG @MEGA0
+
+[printer_model:I3MEGA]
+name = Anycubic i3 Mega
+variants = 0.4
+technology = FFF
+family = MEGA
+
+[printer_model:I3MEGAS]
+name = Anycubic i3 Mega S
+variants = 0.4
+technology = FFF
+family = MEGA
+
+[printer_model:PREDATOR]
+name = Anycubic Predator
+variants = 0.4; 0.6; 0.8
+technology = FFF
+family = PREDATOR
+default_materials = Generic PLA @PREDATOR; Generic PETG @PREDATOR; Generic ABS @PREDATOR
+
+# All presets starting with asterisk, for example *common*, are intermediate and they will
+# not make it into the user interface.
+
+## Anycubic KOSSEL
+## Author: https://github.com/tc0fh
+## Initial PR: https://github.com/prusa3d/PrusaSlicer/pull/4220
+
+# Common print preset
+[print:*common_akossel*]
+avoid_crossing_perimeters = 0
+bottom_solid_min_thickness = 0.5
+bridge_angle = 0
+bridge_flow_ratio = 0.8
+bridge_speed = 30
+brim_width = 0
+clip_multipart_objects = 1
+compatible_printers =
+complete_objects = 0
+dont_support_bridges = 1
+elefant_foot_compensation = 0
+ensure_vertical_shell_thickness = 1
+external_fill_pattern = rectilinear
+external_perimeters_first = 0
+external_perimeter_extrusion_width = 0.45
+extra_perimeters = 0
+extruder_clearance_height = 25
+extruder_clearance_radius = 45
+extrusion_width = 0.45
+fill_angle = 45
+fill_density = 20%
+fill_pattern = grid
+first_layer_extrusion_width = 0.42
+first_layer_height = 0.2
+first_layer_speed = 20
+gap_fill_speed = 40
+gcode_comments = 0
+infill_every_layers = 1
+infill_extruder = 1
+infill_extrusion_width = 0.45
+infill_first = 0
+infill_only_where_needed = 0
+infill_overlap = 25%
+interface_shells = 0
+max_print_speed = 200
+max_volumetric_extrusion_rate_slope_negative = 0
+max_volumetric_extrusion_rate_slope_positive = 0
+max_volumetric_speed = 0
+min_skirt_length = 4
+notes =
+overhangs = 0
+only_retract_when_crossing_perimeters = 0
+ooze_prevention = 0
+output_filename_format = {input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode
+perimeters = 2
+perimeter_extruder = 1
+perimeter_extrusion_width = 0.45
+perimeter_speed = 45
+post_process =
+print_settings_id =
+raft_layers = 0
+resolution = 0
+seam_position = nearest
+single_extruder_multi_material_priming = 0
+skirts = 2
+skirt_distance = 5
+skirt_height = 1
+small_perimeter_speed = 25
+solid_infill_below_area = 0
+solid_infill_every_layers = 0
+solid_infill_extruder = 1
+solid_infill_extrusion_width = 0.45
+spiral_vase = 0
+standby_temperature_delta = -5
+support_material = 0
+support_material_extruder = 0
+support_material_extrusion_width = 0.38
+support_material_interface_extruder = 0
+support_material_angle = 0
+support_material_buildplate_only = 0
+support_material_enforce_layers = 0
+support_material_contact_distance = 0.15
+support_material_interface_contact_loops = 0
+support_material_interface_layers = 2
+support_material_interface_spacing = 0.2
+support_material_interface_speed = 100%
+support_material_pattern = rectilinear
+support_material_spacing = 2
+support_material_speed = 50
+support_material_synchronize_layers = 0
+support_material_threshold = 45
+support_material_with_sheath = 0
+support_material_xy_spacing = 60%
+thin_walls = 0
+top_infill_extrusion_width = 0.4
+top_solid_infill_speed = 40
+top_solid_min_thickness = 0.6
+travel_speed = 180
+wipe_tower = 1
+wipe_tower_bridging = 10
+wipe_tower_rotation_angle = 0
+wipe_tower_width = 60
+wipe_tower_x = 170
+wipe_tower_y = 140
+xy_size_compensation = 0
+bridge_acceleration = 1000
+default_acceleration = 1500
+first_layer_acceleration = 1000
+infill_acceleration = 1500
+perimeter_acceleration = 800
+
+[print:*0.08mm_akossel*]
+inherits = *common_akossel*
+bottom_solid_layers = 10
+bridge_acceleration = 300
+bridge_flow_ratio = 0.7
+bridge_speed = 20
+external_perimeter_speed = 20
+first_layer_acceleration = 500
+gap_fill_speed = 20
+infill_acceleration = 800
+infill_speed = 40
+layer_height = 0.08
+max_print_speed = 80
+perimeter_acceleration = 300
+perimeter_speed = 30
+perimeters = 3
+small_perimeter_speed = 20
+solid_infill_speed = 40
+support_material_extrusion_width = 0.3
+support_material_spacing = 1.5
+support_material_speed = 40
+top_solid_infill_speed = 30
+top_solid_layers = 12
+
+[print:*0.16mm_akossel*]
+inherits = *common_akossel*
+bottom_solid_layers = 5
+layer_height = 0.16
+top_solid_layers = 6
+
+[print:*0.20mm_akossel*]
+inherits = *common_akossel*
+bottom_solid_layers = 4
+bridge_flow_ratio = 0.95
+layer_height = 0.20
+top_solid_layers = 5
+
+[print:*0.24mm_akossel*]
+inherits = *common_akossel*
+bottom_solid_layers = 4
+bridge_flow_ratio = 0.95
+layer_height = 0.24
+perimeter_speed = 50
+external_perimeter_speed = 35
+top_solid_layers = 4
+infill_speed = 100
+solid_infill_speed = 100
+top_solid_infill_speed = 40
+
+[print:*0.30mm_akossel*]
+inherits = *common_akossel*
+bottom_solid_layers = 3
+bridge_flow_ratio = 0.95
+external_perimeter_extrusion_width = 0.6
+external_perimeter_speed = 35
+extrusion_width = 0.5
+infill_extrusion_width = 0.5
+infill_speed = 70
+layer_height = 0.30
+perimeter_extrusion_width = 0.5
+perimeter_speed = 50
+small_perimeter_speed = 30
+solid_infill_extrusion_width = 0.5
+solid_infill_speed = 70
+support_material_speed = 45
+top_infill_extrusion_width = 0.45
+top_solid_infill_speed = 50
+top_solid_layers = 3
+
+[print:0.08mm ULTRADETAIL @AKOSSEL]
+inherits = *0.08mm_akossel*
+fill_density = 15%
+fill_pattern = gyroid
+compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_AK(|LP).*/ and nozzle_diameter[0]==0.4
+
+[print:0.16mm QUALITY @AKOSSEL]
+inherits = *0.16mm_akossel*
+external_perimeter_speed = 25
+fill_density = 15%
+fill_pattern = gyroid
+infill_speed = 80
+compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_AK(|LP).*/ and nozzle_diameter[0]==0.4
+
+[print:0.16mm SPEED @AKOSSEL]
+inherits = *0.16mm_akossel*
+external_perimeter_speed = 35
+infill_speed = 120
+perimeter_speed = 60
+solid_infill_speed = 120
+top_solid_infill_speed = 50
+compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_AK(|LP).*/ and nozzle_diameter[0]==0.4
+
+[print:0.20mm QUALITY @AKOSSEL]
+inherits = *0.20mm_akossel*
+external_perimeter_speed = 25
+fill_density = 15%
+fill_pattern = gyroid
+infill_speed = 80
+compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_AK(|LP).*/ and nozzle_diameter[0]==0.4
+
+[print:0.20mm SPEED @AKOSSEL]
+inherits = *0.20mm_akossel*
+external_perimeter_speed = 35
+infill_speed = 120
+perimeter_speed = 60
+solid_infill_speed = 120
+top_solid_infill_speed = 50
+compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_AK(|LP).*/ and nozzle_diameter[0]==0.4
+
+[print:0.24mm DRAFT @AKOSSEL]
+inherits = *0.24mm_akossel*
+compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_AK(|LP).*/ and nozzle_diameter[0]==0.4
+
+[print:0.30mm FAST @AKOSSEL]
+inherits = *0.30mm_akossel*
+compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_AK(|LP).*/ and nozzle_diameter[0]==0.4
+
+# Common filament preset
+[filament:*common_akossel*]
+cooling = 0
+compatible_printers =
+extrusion_multiplier = 1
+filament_cost = 0
+filament_density = 0
+filament_diameter = 1.75
+filament_notes = ""
+filament_settings_id = ""
+filament_soluble = 0
+min_print_speed = 15
+slowdown_below_layer_time = 20
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_Anycubic.*/ and printer_notes=~/.*PRINTER_MODEL_AK(|LP).*/
+
+[filament:*PLA_akossel*]
+inherits = *common_akossel*
+bed_temperature = 60
+fan_below_layer_time = 100
+filament_colour = #FF3232
+filament_max_volumetric_speed = 10
+filament_type = PLA
+filament_density = 1.24
+filament_cost = 20
+first_layer_bed_temperature = 60
+first_layer_temperature = 200
+fan_always_on = 1
+cooling = 1
+max_fan_speed = 100
+min_fan_speed = 100
+bridge_fan_speed = 100
+disable_fan_first_layers = 1
+temperature = 200
+
+[filament:*PET_akossel*]
+inherits = *common_akossel*
+bed_temperature = 70
+cooling = 1
+disable_fan_first_layers = 3
+fan_below_layer_time = 20
+filament_colour = #FF8000
+filament_max_volumetric_speed = 8
+filament_type = PETG
+filament_density = 1.27
+filament_cost = 30
+first_layer_bed_temperature =70
+first_layer_temperature = 240
+fan_always_on = 1
+max_fan_speed = 50
+min_fan_speed = 20
+bridge_fan_speed = 100
+temperature = 240
+
+[filament:*ABS_akossel*]
+inherits = *common_akossel*
+bed_temperature = 100
+cooling = 0
+disable_fan_first_layers = 3
+fan_below_layer_time = 20
+filament_colour = #3A80CA
+filament_max_volumetric_speed = 10
+filament_type = ABS
+filament_density = 1.04
+filament_cost = 20
+first_layer_bed_temperature = 100
+first_layer_temperature = 245
+fan_always_on = 0
+max_fan_speed = 0
+min_fan_speed = 0
+bridge_fan_speed = 30
+top_fan_speed = 0
+temperature = 245
+
+[filament:Generic PLA @AKOSSEL]
+inherits = *PLA_akossel*
+filament_vendor = Generic
+
+[filament:Generic PETG @AKOSSEL]
+inherits = *PET_akossel*
+filament_vendor = Generic
+
+[filament:Generic ABS @AKOSSEL]
+inherits = *ABS_akossel*
+filament_vendor = Generic
+
+# Common printer preset
+[printer:*common_akossel*]
+printer_technology = FFF
+bed_shape =
+before_layer_gcode = ;BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z]
+between_objects_gcode =
+deretract_speed = 40
+extruder_colour = #FFFF00
+extruder_offset = 0x0
+gcode_flavor = marlin
+silent_mode = 0
+remaining_times = 0
+machine_max_acceleration_e = 3000
+machine_max_acceleration_extruding = 1000
+machine_max_acceleration_retracting = 1000
+machine_max_acceleration_x = 1500
+machine_max_acceleration_y = 1500
+machine_max_acceleration_z = 1500
+machine_max_feedrate_e = 60
+machine_max_feedrate_x = 200
+machine_max_feedrate_y = 200
+machine_max_feedrate_z = 200
+machine_max_jerk_e = 5
+machine_max_jerk_x = 5
+machine_max_jerk_y = 5
+machine_max_jerk_z = 5
+machine_min_extruding_rate = 0
+machine_min_travel_rate = 0
+layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z]
+max_layer_height = 0.3
+min_layer_height = 0.08
+max_print_height = 300
+nozzle_diameter = 0.4
+printer_notes =
+printer_settings_id =
+retract_before_travel = 2
+retract_before_wipe = 70%
+retract_layer_change = 1
+retract_length = 5
+retract_length_toolchange = 1
+retract_lift = 0
+retract_lift_above = 0
+retract_lift_below = 0
+retract_restart_extra = 0
+retract_restart_extra_toolchange = 0
+retract_speed = 60
+single_extruder_multi_material = 0
+start_gcode =
+end_gcode = M104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG28 ; home\nM84 ; disable motors
+toolchange_gcode =
+use_firmware_retraction = 0
+use_relative_e_distances = 1
+use_volumetric_e = 0
+variable_layer_height = 1
+wipe = 1
+z_offset = 0
+default_print_profile = 0.20mm QUALITY @AKOSSEL
+default_filament_profile = Generic PLA @AKOSSEL
+
+[printer:Anycubic Kossel Linear Plus]
+inherits = *common_akossel*
+printer_model = AKLP
+printer_variant = 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_Anycubic\nPRINTER_MODEL_AKLP\nPRINTER_HAS_BOWDEN\n
+bed_shape = 114.562x10.0229,113.253x19.9695,111.081x29.7642,108.065x39.3323,104.225x48.6011,99.5929x57.5,94.2025x65.9613,88.0951x73.9206,81.3173x81.3173,73.9206x88.0951,65.9613x94.2025,57.5x99.5929,48.6011x104.225,39.3323x108.065,29.7642x111.081,19.9695x113.253,10.0229x114.562,7.04172e-15x115,-10.0229x114.562,-19.9695x113.253,-29.7642x111.081,-39.3323x108.065,-48.6011x104.225,-57.5x99.5929,-65.9613x94.2025,-73.9206x88.0951,-81.3173x81.3173,-88.0951x73.9206,-94.2025x65.9613,-99.5929x57.5,-104.225x48.6011,-108.065x39.3323,-111.081x29.7642,-113.253x19.9695,-114.562x10.0229,-115x1.40834e-14,-114.562x-10.0229,-113.253x-19.9695,-111.081x-29.7642,-108.065x-39.3323,-104.225x-48.6011,-99.5929x-57.5,-94.2025x-65.9613,-88.0951x-73.9206,-81.3173x-81.3173,-73.9206x-88.0951,-65.9613x-94.2025,-57.5x-99.5929,-48.6011x-104.225,-39.3323x-108.065,-29.7642x-111.081,-19.9695x-113.253,-10.0229x-114.562,-2.11252e-14x-115,10.0229x-114.562,19.9695x-113.253,29.7642x-111.081,39.3323x-108.065,48.6011x-104.225,57.5x-99.5929,65.9613x-94.2025,73.9206x-88.0951,81.3173x-81.3173,88.0951x-73.9206,94.2025x-65.9613,99.5929x-57.5,104.225x-48.6011,108.065x-39.3323,111.081x-29.7642,113.253x-19.9695,114.562x-10.0229,115x-2.81669e-14
+start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home\nG1 X-54.672 Y95.203 Z0.3 F9000\nG92 E0.0\nG1 F1000\nG1 X-52.931 Y96.185 E0.300\nG1 X-50.985 Y97.231 E0.331\nG1 X-49.018 Y98.238 E0.331\nG1 X-47.032 Y99.205 E0.331\nG1 X-45.026 Y100.132 E0.331\nG1 X-43.003 Y101.019 E0.331\nG1 X-40.961 Y101.864 E0.331\nG1 X-38.904 Y102.668 E0.331\nG1 X-36.83 Y103.431 E0.331\nG1 X-34.742 Y104.152 E0.331\nG1 X-32.639 Y104.83 E0.331\nG1 X-30.523 Y105.466 E0.331\nG1 X-28.395 Y106.06 E0.331\nG1 X-26.255 Y106.61 E0.331\nG1 X-24.105 Y107.117 E0.331\nG1 X-21.945 Y107.581 E0.331\nG1 X-19.776 Y108.001 E0.331\nG1 X-17.599 Y108.377 E0.331\nG1 X-15.415 Y108.71 E0.331\nG1 X-13.224 Y108.998 E0.331\nG1 X-11.028 Y109.242 E0.331\nG1 X-8.828 Y109.442 E0.331\nG1 X-6.624 Y109.598 E0.331\nG1 X-4.418 Y109.709 E0.331\nG1 X-2.209 Y109.776 E0.332\nG1 X0 Y109.798 E0.331\nG1 X2.209 Y109.776 E0.690\nG1 X4.418 Y109.709 E0.691\nG1 X6.624 Y109.598 E0.690\nG1 X8.828 Y109.442 E0.690\nG1 X11.028 Y109.242 E0.690\nG1 X13.224 Y108.998 E0.690\nG1 X15.415 Y108.71 E0.691\nG1 X17.599 Y108.377 E0.690\nG1 X19.776 Y108.001 E0.690\nG1 X21.945 Y107.581 E0.690\nG1 X24.105 Y107.117 E0.690\nG1 X26.255 Y106.61 E0.690\nG1 X28.395 Y106.06 E0.690\nG1 X30.523 Y105.466 E0.690\nG1 X32.639 Y104.83 E0.690\nG1 X34.742 Y104.152 E0.690\nG1 X36.83 Y103.431 E0.690\nG1 X38.904 Y102.668 E0.691\nG1 X40.961 Y101.864 E0.690\nG1 X43.003 Y101.019 E0.691\nG1 X45.026 Y100.132 E0.690\nG1 X47.032 Y99.205 E0.691\nG1 X49.018 Y98.238 E0.690\nG1 X50.985 Y97.231 E0.691\nG1 X52.931 Y96.185 E0.690\nG1 X54.672 Y95.203 E0.625\nG92 E0.0\nG1 E-5 F3000 ; retract 5mm\nG1 X52.931 Y96.185 F1000 ; wipe\nG1 X50.985 Y97.231 F1000 ; wipe\nG1 X49.018 Y98.238 F1000 ; wipe\nG1 X0 Y109.798 F1000\nG1 E4.8 F1500; de-retract\nG92 E0.0 ; reset extrusion distance\nM221 S{if layer_height<0.075}100{else}95{endif}
+
+[printer:Anycubic Kossel Pulley (Linear)]
+inherits = *common_akossel*
+printer_model = AK
+printer_variant = 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_Anycubic\nPRINTER_MODEL_AK\nPRINTER_HAS_BOWDEN\n
+bed_shape = 89.6575x7.84402,88.6327x15.6283,86.9333x23.2937,84.5723x30.7818,81.5677x38.0356,77.9423x45,73.7237x51.6219,68.944x57.8509,63.6396x63.6396,57.8509x68.944,51.6219x73.7237,45x77.9423,38.0356x81.5677,30.7818x84.5723,23.2937x86.9333,15.6283x88.6327,7.84402x89.6575,5.51091e-15x90,-7.84402x89.6575,-15.6283x88.6327,-23.2937x86.9333,-30.7818x84.5723,-38.0356x81.5677,-45x77.9423,-51.6219x73.7237,-57.8509x68.944,-63.6396x63.6396,-68.944x57.8509,-73.7237x51.6219,-77.9423x45,-81.5677x38.0356,-84.5723x30.7818,-86.9333x23.2937,-88.6327x15.6283,-89.6575x7.84402,-90x1.10218e-14,-89.6575x-7.84402,-88.6327x-15.6283,-86.9333x-23.2937,-84.5723x-30.7818,-81.5677x-38.0356,-77.9423x-45,-73.7237x-51.6219,-68.944x-57.8509,-63.6396x-63.6396,-57.8509x-68.944,-51.6219x-73.7237,-45x-77.9423,-38.0356x-81.5677,-30.7818x-84.5723,-23.2937x-86.9333,-15.6283x-88.6327,-7.84402x-89.6575,-1.65327e-14x-90,7.84402x-89.6575,15.6283x-88.6327,23.2937x-86.9333,30.7818x-84.5723,38.0356x-81.5677,45x-77.9423,51.6219x-73.7237,57.8509x-68.944,63.6396x-63.6396,68.944x-57.8509,73.7237x-51.6219,77.9423x-45,81.5677x-38.0356,84.5723x-30.7818,86.9333x-23.2937,88.6327x-15.6283,89.6575x-7.84402,90x-2.20436e-14
+start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home\nG1 X-39.672 Y69.712 Z0.3 F9000\nG92 E0.0\nG1 F1000\nG1 X-38.457 Y70.397 E0.209\nG1 X-37.043 Y71.157 E0.241\nG1 X-35.614 Y71.889 E0.241\nG1 X-34.171 Y72.591 E0.241\nG1 X-32.714 Y73.265 E0.241\nG1 X-31.244 Y73.909 E0.241\nG1 X-29.761 Y74.523 E0.241\nG1 X-28.266 Y75.108 E0.241\nG1 X-26.759 Y75.662 E0.241\nG1 X-25.242 Y76.185 E0.241\nG1 X-23.714 Y76.678 E0.241\nG1 X-22.177 Y77.14 E0.241\nG1 X-20.63 Y77.571 E0.241\nG1 X-19.076 Y77.971 E0.241\nG1 X-17.514 Y78.34 E0.241\nG1 X-15.944 Y78.677 E0.241\nG1 X-14.368 Y78.982 E0.241\nG1 X-12.786 Y79.255 E0.241\nG1 X-11.199 Y79.497 E0.241\nG1 X-9.608 Y79.706 E0.241\nG1 X-8.013 Y79.884 E0.241\nG1 X-6.414 Y80.029 E0.241\nG1 X-4.813 Y80.142 E0.241\nG1 X-3.21 Y80.223 E0.241\nG1 X-1.605 Y80.271 E0.241\nG1 X0 Y80.287 E0.241\nG1 X1.605 Y80.271 E0.502\nG1 X3.21 Y80.223 E0.502\nG1 X4.813 Y80.142 E0.502\nG1 X6.414 Y80.029 E0.502\nG1 X8.013 Y79.884 E0.502\nG1 X9.608 Y79.706 E0.502\nG1 X11.199 Y79.497 E0.501\nG1 X12.786 Y79.255 E0.502\nG1 X14.368 Y78.982 E0.502\nG1 X15.944 Y78.677 E0.502\nG1 X17.514 Y78.34 E0.502\nG1 X19.076 Y77.971 E0.502\nG1 X20.63 Y77.571 E0.501\nG1 X22.177 Y77.14 E0.502\nG1 X23.714 Y76.678 E0.502\nG1 X25.242 Y76.185 E0.502\nG1 X26.759 Y75.662 E0.501\nG1 X28.266 Y75.108 E0.502\nG1 X29.761 Y74.523 E0.502\nG1 X31.244 Y73.909 E0.502\nG1 X32.714 Y73.265 E0.502\nG1 X34.171 Y72.591 E0.502\nG1 X35.614 Y71.889 E0.501\nG1 X37.043 Y71.157 E0.502\nG1 X38.457 Y70.397 E0.502\nG1 X39.672 Y69.712 E0.436\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}
+
+## Anycubic MEGA ZERO
+## Author: https://github.com/kad
+## Initial PR: https://github.com/prusa3d/PrusaSlicer/pull/4057
+
+# Common print preset
+[print:*common_mega0*]
+avoid_crossing_perimeters = 1
+bridge_angle = 0
+bridge_flow_ratio = 0.7
+bridge_speed = 25
+brim_width = 0
+clip_multipart_objects = 1
+compatible_printers =
+complete_objects = 0
+dont_support_bridges = 1
+elefant_foot_compensation = 0
+ensure_vertical_shell_thickness = 1
+external_fill_pattern = rectilinear
+external_perimeters_first = 0
+external_perimeter_extrusion_width = 0.45
+extra_perimeters = 0
+extruder_clearance_height = 25
+extruder_clearance_radius = 45
+extrusion_width = 0.45
+fill_angle = 45
+fill_density = 20%
+fill_pattern = grid
+first_layer_extrusion_width = 0.42
+first_layer_height = 0.2
+first_layer_speed = 20
+gap_fill_speed = 30
+gcode_comments = 0
+infill_every_layers = 1
+infill_extruder = 1
+infill_extrusion_width = 0.45
+infill_first = 0
+infill_only_where_needed = 0
+infill_overlap = 25%
+interface_shells = 0
+max_print_speed = 100
+max_volumetric_extrusion_rate_slope_negative = 0
+max_volumetric_extrusion_rate_slope_positive = 0
+max_volumetric_speed = 0
+min_skirt_length = 4
+notes =
+overhangs = 1
+only_retract_when_crossing_perimeters = 0
+ooze_prevention = 0
+output_filename_format = {input_filename_base}_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode
+perimeters = 2
+perimeter_extruder = 1
+perimeter_extrusion_width = 0.45
+post_process =
+print_settings_id =
+raft_layers = 0
+resolution = 0
+seam_position = nearest
+single_extruder_multi_material_priming = 1
+skirts = 2
+skirt_distance = 2
+skirt_height = 2
+small_perimeter_speed = 25
+solid_infill_below_area = 0
+solid_infill_every_layers = 0
+solid_infill_extruder = 1
+solid_infill_extrusion_width = 0.45
+spiral_vase = 0
+standby_temperature_delta = -5
+support_material = 0
+support_material_extruder = 0
+support_material_extrusion_width = 0.4
+support_material_interface_extruder = 0
+support_material_angle = 0
+support_material_buildplate_only = 0
+support_material_enforce_layers = 0
+support_material_contact_distance = 0.15
+support_material_interface_contact_loops = 0
+support_material_interface_layers = 2
+support_material_interface_spacing = 0.2
+support_material_interface_speed = 100%
+support_material_pattern = rectilinear
+support_material_spacing = 2
+support_material_speed = 40
+support_material_synchronize_layers = 0
+support_material_threshold = 45
+support_material_with_sheath = 0
+support_material_xy_spacing = 60%
+thin_walls = 0
+top_infill_extrusion_width = 0.45
+top_solid_infill_speed = 40
+travel_speed = 100
+wipe_tower = 0
+wipe_tower_bridging = 10
+wipe_tower_rotation_angle = 0
+wipe_tower_width = 60
+wipe_tower_x = 170
+wipe_tower_y = 140
+xy_size_compensation = 0
+
+[print:*0.10mm_mega0*]
+inherits = *common_mega0*
+perimeter_speed = 40
+external_perimeter_speed = 25
+infill_speed = 50
+solid_infill_speed = 40
+layer_height = 0.10
+perimeters = 3
+top_infill_extrusion_width = 0.4
+bottom_solid_layers = 6
+top_solid_layers = 7
+
+[print:*0.20mm_mega0*]
+inherits = *common_mega0*
+perimeter_speed = 40
+external_perimeter_speed = 25
+infill_speed = 50
+solid_infill_speed = 40
+layer_height = 0.20
+top_infill_extrusion_width = 0.4
+bottom_solid_layers = 4
+top_solid_layers = 5
+
+[print:*0.30mm_mega0*]
+inherits = *common_mega0*
+perimeter_speed = 40
+external_perimeter_speed = 25
+infill_speed = 50
+solid_infill_speed = 40
+layer_height = 0.24
+top_infill_extrusion_width = 0.45
+bottom_solid_layers = 3
+top_solid_layers = 4
+
+[print:0.10mm DETAIL @MEGA0]
+inherits = *0.10mm_mega0*
+travel_speed = 120
+infill_speed = 50
+solid_infill_speed = 40
+top_solid_infill_speed = 30
+support_material_extrusion_width = 0.38
+compatible_printers_condition = printer_model=="MEGA0" and nozzle_diameter[0]==0.4
+
+[print:0.20mm NORMAL @MEGA0]
+inherits = *0.20mm_mega0*
+travel_speed = 120
+infill_speed = 50
+solid_infill_speed = 40
+top_solid_infill_speed = 30
+support_material_extrusion_width = 0.38
+compatible_printers_condition = printer_model=="MEGA0" and nozzle_diameter[0]==0.4
+
+[print:0.30mm DRAFT @MEGA0]
+inherits = *0.30mm_mega0*
+travel_speed = 120
+infill_speed = 50
+solid_infill_speed = 40
+top_solid_infill_speed = 30
+support_material_extrusion_width = 0.38
+compatible_printers_condition = printer_model=="MEGA0" and nozzle_diameter[0]==0.4
+
+# Common filament preset
+[filament:*common_mega0*]
+cooling = 0
+compatible_printers =
+extrusion_multiplier = 1
+filament_cost = 0
+filament_density = 0
+filament_diameter = 1.75
+filament_notes = ""
+filament_settings_id = ""
+filament_soluble = 0
+min_print_speed = 15
+slowdown_below_layer_time = 20
+compatible_printers_condition = printer_model=="MEGA0"
+
+[filament:*PLA_mega0*]
+inherits = *common_mega0*
+bed_temperature = 40
+fan_below_layer_time = 100
+filament_colour = #FF3232
+filament_max_volumetric_speed = 15
+filament_type = PLA
+filament_density = 1.24
+filament_cost = 20
+first_layer_bed_temperature = 40
+first_layer_temperature = 215
+fan_always_on = 1
+cooling = 1
+max_fan_speed = 100
+min_fan_speed = 100
+bridge_fan_speed = 100
+disable_fan_first_layers = 1
+temperature = 210
+
+[filament:*PET_mega0*]
+inherits = *common_mega0*
+bed_temperature = 70
+cooling = 1
+disable_fan_first_layers = 3
+fan_below_layer_time = 20
+filament_colour = #FF8000
+filament_max_volumetric_speed = 8
+filament_type = PETG
+filament_density = 1.27
+filament_cost = 30
+first_layer_bed_temperature =70
+first_layer_temperature = 240
+fan_always_on = 1
+max_fan_speed = 50
+min_fan_speed = 20
+bridge_fan_speed = 100
+temperature = 240
+
+[filament:*ABS_mega0*]
+inherits = *common_mega0*
+bed_temperature = 100
+cooling = 0
+disable_fan_first_layers = 3
+fan_below_layer_time = 20
+filament_colour = #3A80CA
+filament_max_volumetric_speed = 11
+filament_type = ABS
+filament_density = 1.04
+filament_cost = 20
+first_layer_bed_temperature = 100
+first_layer_temperature = 245
+fan_always_on = 0
+max_fan_speed = 0
+min_fan_speed = 0
+bridge_fan_speed = 30
+top_fan_speed = 0
+temperature = 245
+
+[filament:Generic PLA @MEGA0]
+inherits = *PLA_mega0*
+filament_vendor = Generic
+
+[filament:Generic PETG @MEGA0]
+inherits = *PET_mega0*
+filament_vendor = Generic
+
+[filament:Generic ABS @MEGA0]
+inherits = *ABS_mega0*
+filament_vendor = Generic
+
+[filament:Anycubic PLA @MEGA0]
+inherits = *PLA_mega0*
+filament_vendor = Anycubic
+temperature = 190
+first_layer_temperature = 195
+filament_cost = 24.99
+filament_density = 1.25
+
+[filament:Prusament PLA @MEGA0]
+inherits = *PLA_mega0*
+filament_vendor = Prusa Polymers
+temperature = 215
+bed_temperature = 40
+first_layer_temperature = 215
+filament_cost = 24.99
+filament_density = 1.24
+
+[filament:Prusament PETG @MEGA0]
+inherits = *PET_mega0*
+filament_vendor = Prusa Polymers
+temperature = 245
+bed_temperature = 70
+first_layer_temperature = 245
+filament_cost = 24.99
+filament_density = 1.27
+
+# Common printer preset
+[printer:*common_mega0*]
+printer_technology = FFF
+bed_shape = 0x0,220x0,220x220,0x220
+before_layer_gcode = ; BEFORE_LAYER_CHANGE [layer_num] @ [layer_z]mm
+between_objects_gcode =
+deretract_speed = 0
+extruder_colour = #FFFF00
+extruder_offset = 0x0
+gcode_flavor = marlin
+silent_mode = 0
+remaining_times = 0
+machine_max_acceleration_e = 10000
+machine_max_acceleration_extruding = 2000
+machine_max_acceleration_retracting = 1500
+machine_max_acceleration_x = 3000
+machine_max_acceleration_y = 3000
+machine_max_acceleration_z = 500
+machine_max_feedrate_e = 120
+machine_max_feedrate_x = 500
+machine_max_feedrate_y = 500
+machine_max_feedrate_z = 12
+machine_max_jerk_e = 2.5
+machine_max_jerk_x = 20
+machine_max_jerk_y = 20
+machine_max_jerk_z = 0.4
+machine_min_extruding_rate = 0
+machine_min_travel_rate = 0
+layer_gcode = ; AFTER_LAYER_CHANGE [layer_num] @ [layer_z]mm
+max_layer_height = 0.3
+min_layer_height = 0.1
+max_print_height = 200
+nozzle_diameter = 0.4
+printer_notes =
+printer_settings_id =
+retract_before_travel = 1
+retract_before_wipe = 0%
+retract_layer_change = 1
+retract_length = 6
+retract_length_toolchange = 1
+retract_lift = 0
+retract_lift_above = 0
+retract_lift_below = 0
+retract_restart_extra = 0
+retract_restart_extra_toolchange = 0
+retract_speed = 30
+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
+toolchange_gcode =
+use_firmware_retraction = 0
+use_relative_e_distances = 1
+use_volumetric_e = 0
+variable_layer_height = 1
+wipe = 1
+z_offset = 0
+printer_model =
+default_print_profile =
+default_filament_profile =
+
+[printer:Anycubic Mega Zero]
+inherits = *common_mega0*
+printer_model = MEGA0
+printer_variant = 0.4
+max_layer_height = 0.3
+min_layer_height = 0.1
+printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ANYCUBIC\nPRINTER_MODEL_MEGA0
+bed_shape = 0x0,220x0,220x220,0x220
+max_print_height = 250
+machine_max_acceleration_e = 5000
+machine_max_acceleration_extruding = 500
+machine_max_acceleration_retracting = 500
+machine_max_acceleration_x = 500
+machine_max_acceleration_y = 500
+machine_max_acceleration_z = 100
+machine_max_feedrate_e = 25
+machine_max_feedrate_x = 500
+machine_max_feedrate_y = 500
+machine_max_feedrate_z = 5
+machine_max_jerk_e = 5
+machine_max_jerk_x = 10
+machine_max_jerk_y = 10
+machine_max_jerk_z = 0.4
+machine_min_extruding_rate = 0
+machine_min_travel_rate = 0
+nozzle_diameter = 0.4
+retract_before_travel = 2
+retract_layer_change = 0
+retract_length = 7
+retract_speed = 30
+retract_lift = 0.2
+deretract_speed = 30
+retract_before_wipe = 70%
+default_print_profile = 0.20mm NORMAL @MEGA0
+default_filament_profile = Anycubic PLA @MEGA0
+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\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\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
+
+## Anycubic i3 Mega and i3 Mega S
+## Author: https://github.com/Igami
+## Initial PR: https://github.com/prusa3d/PrusaSlicer/pull/4619
+
+[print:*common_mega*]
+bottom_solid_min_thickness = 0.5
+bridge_acceleration = 1800
+bridge_flow_ratio = 0.8
+bridge_speed = 30
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_I3_MEGA.*/ and nozzle_diameter[0]==0.4
+default_acceleration = 1800
+ensure_vertical_shell_thickness = 1
+external_perimeter_extrusion_width = 0.6
+external_perimeter_speed = 40
+extruder_clearance_height = 35
+extruder_clearance_radius = 60
+extrusion_width = 0.45
+fill_density = 15%
+fill_pattern = gyroid
+first_layer_acceleration = 1800
+first_layer_extrusion_width = 0.42
+first_layer_height = 0.2
+gap_fill_speed = 40
+gcode_comments = 1
+infill_acceleration = 1800
+infill_extrusion_width = 0.45
+infill_speed = 60
+only_retract_when_crossing_perimeters = 0
+output_filename_format = {input_filename_base}_{nozzle_diameter[0]}n_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode
+perimeter_acceleration = 1800
+perimeter_extrusion_width = 0.45
+perimeters = 2
+seam_position = nearest
+skirts = 0
+slice_closing_radius = 0.05
+small_perimeter_speed = 30
+solid_infill_below_area = 0
+solid_infill_speed = 60
+support_material_buildplate_only = 1
+support_material_contact_distance = 0.1
+support_material_extrusion_width = 0.35
+support_material_interface_layers = 2
+support_material_interface_spacing = 0.2
+support_material_spacing = 2
+support_material_threshold = 55
+support_material_with_sheath = 0
+thin_walls = 0
+top_infill_extrusion_width = 0.4
+top_solid_infill_speed = 40
+top_solid_min_thickness = 0.6
+travel_speed = 180
+
+[print:*supported_mega*]
+raft_layers = 2
+support_material = 1
+
+# XXXXXXXXXXXXXXXXXXXX
+# XXX--- 0.15mm ---XXX
+# XXXXXXXXXXXXXXXXXXXX
+
+[print:*0.15mm_mega*]
+inherits = *common_mega*
+bottom_solid_layers = 5
+layer_height = 0.15
+top_solid_layers = 7
+
+[print:0.15mm QUALITY @MEGA]
+inherits = *0.15mm_mega*
+
+[print:0.15mm QUALITY SUPPORTED @MEGA]
+inherits = *0.15mm_mega*;*supported_mega*
+
+# XXXXXXXXXXXXXXXXXXXX
+# XXX--- 0.20mm ---XXX
+# XXXXXXXXXXXXXXXXXXXX
+
+[print:*0.20mm_mega*]
+inherits = *common_mega*
+bottom_solid_layers = 4
+layer_height = 0.2
+top_solid_layers = 5
+
+[print:0.20mm QUALITY @MEGA]
+inherits = *0.20mm_mega*
+
+[print:0.20mm QUALITY SUPPORTED @MEGA]
+inherits = *0.20mm_mega*;*supported_mega*
+
+# XXXXXXXXXXXXXXXXXXXX
+# XXX--- 0.30mm ---XXX
+# XXXXXXXXXXXXXXXXXXXX
+
+[print:*0.30mm_mega*]
+inherits = *common_mega*
+bottom_solid_layers = 4
+bridge_flow_ratio = 0.95
+top_solid_layers = 4
+
+[print:0.30mm DRAFT @MEGA]
+inherits = *0.30mm_mega*
+
+[print:0.30mm DRAFT SUPPORTED @MEGA]
+inherits = *0.30mm_mega*;*supported_mega*
+
+# XXXXXXXXXXXXXXXXXXXXXX
+# XXX--- filament ---XXX
+# XXXXXXXXXXXXXXXXXXXXXX
+
+[filament:*common_mega*]
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_I3_MEGA.*/
+end_filament_gcode = "; Filament-specific end gcode"
+fan_always_on = 1
+fan_below_layer_time = 100
+filament_colour = #FF8000
+filament_vendor = Generic
+min_print_speed = 15
+slowdown_below_layer_time = 20
+
+[filament:*ABS_mega*]
+ inherits = *common_mega*
+ bed_temperature = 110
+ bridge_fan_speed = 25
+ cooling = 0
+ fan_always_on = 0
+ fan_below_layer_time = 20
+ filament_colour = #FFF2EC
+ filament_cost = 27.82
+ filament_density = 1.04
+ filament_max_volumetric_speed = 11
+ filament_ramming_parameters = "120 100 5.70968 6.03226 7 8.25806 9 9.19355 9.3871 9.77419 10.129 10.3226 10.4516 10.5161| 0.05 5.69677 0.45 6.15484 0.95 8.76774 1.45 9.20323 1.95 9.95806 2.45 10.3871 2.95 10.5677 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6"
+ filament_type = ABS
+ first_layer_bed_temperature = 100
+ first_layer_temperature = 255
+ max_fan_speed = 30
+ min_fan_speed = 20
+ temperature = 255
+
+[filament:Generic ABS @MEGA]
+inherits = *ABS_mega*
+
+[filament:*FLEX_mega*]
+inherits = *common_mega*
+bed_temperature = 50
+bridge_fan_speed = 80
+cooling = 0
+extrusion_multiplier = 1.15
+fan_always_on = 0
+filament_colour = #008000
+filament_cost = 82.00
+filament_density = 1.22
+filament_deretract_speed = 25
+filament_max_volumetric_speed = 1.2
+filament_retract_length = 0.8
+filament_type = FLEX
+first_layer_bed_temperature = 50
+first_layer_temperature = 240
+max_fan_speed = 90
+min_fan_speed = 70
+temperature = 240
+
+[filament:Generic FLEX @MEGA]
+inherits = *FLEX_mega*
+
+[filament:*PETG_mega*]
+inherits = *common_mega*
+bed_temperature = 90
+bridge_fan_speed = 50
+fan_below_layer_time = 20
+filament_cost = 27.82
+filament_density = 1.27
+filament_max_volumetric_speed = 8
+filament_type = PETG
+first_layer_bed_temperature = 85
+first_layer_temperature = 230
+max_fan_speed = 50
+min_fan_speed = 30
+temperature = 240
+
+[filament:Generic PETG @MEGA]
+inherits = *PETG_mega*
+
+[filament:*PLA_mega*]
+inherits = *common_mega*
+bed_temperature = 60
+disable_fan_first_layers = 1
+filament_cost = 25.40
+filament_density = 1.24
+filament_max_volumetric_speed = 10
+first_layer_bed_temperature = 60
+first_layer_temperature = 215
+min_fan_speed = 100
+temperature = 210
+
+[filament:Generic PLA @MEGA]
+inherits = *PLA_mega*
+
+[filament:*3Dmensionals PLA_mega*]
+inherits = *PLA_mega*
+filament_vendor = 3Dmensionals
+filament_cost = 23.35
+
+[filament:3Dmensionals PLA @MEGA]
+inherits = *3Dmensionals PLA_mega*
+
+[filament:3Dmensionals PLA blue @MEGA]
+inherits = *3Dmensionals PLA_mega*
+filament_colour = #4155FB
+
+[filament:3Dmensionals PLA silver @MEGA]
+inherits = *3Dmensionals PLA_mega*
+filament_colour = #B9B5B4
+
+[filament:3Dmensionals PLA white @MEGA]
+inherits = *3Dmensionals PLA_mega*
+filament_colour = #FEFEFD
+
+[filament:*Verbatim PLA_mega*]
+inherits = *PLA_mega*
+filament_vendor = Verbatim
+filament_cost = 23.88
+
+[filament:Verbatim PLA @MEGA]
+inherits = *Verbatim PLA_mega*
+
+[filament:Verbatim PLA black @MEGA]
+inherits = *Verbatim PLA_mega*
+filament_colour = #333333
+
+[printer:*common_mega*]
+printer_technology = FFF
+bed_shape = 0x0,210x0,210x210,0x210
+before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;[layer_z]
+default_filament_profile = Generic PLA @MEGA
+default_print_profile = 0.15mm QUALITY @MEGA
+deretract_speed = 50
+end_gcode = G4 ; wait\nG92 E0\nG1{if max_layer_z < max_print_height} Z{z_offset+min(max_layer_z+30, max_print_height)}{endif} E-35 F1000 ; move print head up & retract filament\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors
+extruder_colour = #808080
+gcode_flavor = marlin
+layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z]
+max_layer_height = 0.36
+max_print_height = 205
+retract_before_wipe = 60%
+retract_layer_change = 1
+retract_length = 6
+retract_lift = 0.075
+retract_lift_below = 204
+silent_mode = 0
+start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting]\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nG28 ; home all\nG1 Y0 Z1 F100 ; move print head up\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG92 E0\nG1 E38 F1000; deretract filament\nG92 E0\nG1 X60 Z0 E9 ; intro line\nG1 X100 E12.5 ; intro line\nG92 E0
+use_relative_e_distances = 1
+wipe = 1
+machine_max_acceleration_e = 5000
+machine_max_acceleration_extruding = 1250
+machine_max_acceleration_retracting = 1250
+machine_max_acceleration_x = 1000
+machine_max_acceleration_y = 1000
+machine_max_acceleration_z = 200
+machine_max_feedrate_e = 60
+machine_max_feedrate_x = 200
+machine_max_feedrate_y = 200
+machine_max_feedrate_z = 6
+machine_max_jerk_e = 5
+machine_max_jerk_x = 8
+machine_max_jerk_y = 8
+machine_max_jerk_z = 0.4
+
+[printer:Anycubic i3 Mega]
+inherits = *common_mega*
+printer_model = I3MEGA
+printer_variant = 0.4
+printer_notes = Do not 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_I3_MEGA\nPRINTER_HAS_BOWDEN
+
+[printer:Anycubic i3 Mega S]
+inherits = *common_mega*
+printer_model = I3MEGAS
+printer_variant = 0.4
+printer_notes = Do not 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_I3_MEGA_S\nPRINTER_HAS_BOWDEN
+machine_max_feedrate_z = 8
+
+
+## Anycubic PREDATOR
+## Author: https://github.com/tillverka3d
+## Initial PR: https://github.com/prusa3d/PrusaSlicer/pull/4960
+
+#########################################
+###### begin common print presets #######
+#########################################
+
+# Common print preset
+[print:*common predator*]
+spiral_vase = 0
+top_solid_min_thickness = 0.8
+bottom_solid_min_thickness = 0.6
+extra_perimeters = 0
+ensure_vertical_shell_thickness = 1
+avoid_crossing_perimeters = 0
+thin_walls = 0
+overhangs = 1
+seam_position = nearest
+external_perimeters_first = 0
+fill_density = 20%
+external_fill_pattern = rectilinear
+infill_every_layers = 1
+infill_only_where_needed = 0
+solid_infill_every_layers = 0
+fill_angle = 45
+solid_infill_below_area = 20
+bridge_angle = 0
+only_retract_when_crossing_perimeters = 0
+infill_first = 0
+skirts = 1
+skirt_distance = 4
+skirt_height = 1
+min_skirt_length = 8
+brim_width = 0
+support_material = 0
+support_material_auto = 1
+support_material_threshold = 50
+support_material_enforce_layers = 0
+raft_layers = 0
+support_material_contact_distance = 0.1
+support_material_pattern = rectilinear
+support_material_with_sheath = 0
+support_material_spacing = 2
+support_material_angle = 0
+support_material_interface_layers = 2
+support_material_interface_spacing = 0.2
+support_material_interface_contact_loops = 0
+support_material_buildplate_only = 0
+support_material_xy_spacing = 60%
+dont_support_bridges = 1
+support_material_synchronize_layers = 0
+travel_speed = 94
+first_layer_speed = 15
+perimeter_acceleration = 0
+infill_acceleration = 0
+bridge_acceleration = 0
+first_layer_acceleration = 0
+default_acceleration = 0
+max_volumetric_speed = 15
+perimeter_extruder = 1
+infill_extruder = 1
+solid_infill_extruder = 1
+support_material_extruder = 0
+support_material_interface_extruder = 0
+ooze_prevention = 0
+standby_temperature_delta = -5
+wipe_tower = 0
+wipe_tower_x = 170
+wipe_tower_y = 140
+wipe_tower_width = 60
+wipe_tower_rotation_angle = 0
+wipe_tower_bridging = 10
+interface_shells = 0
+bridge_flow_ratio = 0.8
+resolution = 0
+xy_size_compensation = 0
+elefant_foot_compensation = 0.2
+clip_multipart_objects = 1
+complete_objects = 0
+extruder_clearance_radius = 45
+extruder_clearance_height = 25
+gcode_comments = 0
+output_filename_format = {input_filename_base}.gcode
+post_process =
+notes =
+max_volumetric_extrusion_rate_slope_negative = 0
+max_volumetric_extrusion_rate_slope_positive = 0
+print_settings_id =
+
+# Common print preset
+[print:*common predator 0.4 nozzle*]
+inherits = *common predator*
+first_layer_height = 0.16
+infill_overlap = 25%
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_PREDATOR.*/ and printer_notes=~/.*PRINTER_HAS_BOWDEN.*/ and nozzle_diameter[0]==0.4
+
+# Common print preset
+[print:*common predator 0.6 nozzle*]
+inherits = *common predator*
+first_layer_height = 0.24
+infill_overlap = 27%
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_PREDATOR.*/ and printer_notes=~/.*PRINTER_HAS_BOWDEN.*/ and nozzle_diameter[0]==0.6
+
+# Common print preset
+[print:*common predator 0.8 nozzle*]
+inherits = *common predator*
+first_layer_height = 0.32
+infill_overlap = 30%
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_PREDATOR.*/ and printer_notes=~/.*PRINTER_HAS_BOWDEN.*/ and nozzle_diameter[0]==0.8
+
+# Common print preset
+[print:*common predator quality*]
+perimeter_speed = 50
+small_perimeter_speed = 15
+external_perimeter_speed = 70%
+infill_speed = 65
+solid_infill_speed = 85%
+top_solid_infill_speed = 85%
+support_material_speed = 30
+support_material_interface_speed = 85%
+bridge_speed = 30
+gap_fill_speed = 40
+ironing_speed = 15
+
+# Common print preset
+[print:*common predator speed*]
+perimeter_speed = 70
+small_perimeter_speed = 15
+external_perimeter_speed = 70%
+infill_speed = 85
+solid_infill_speed = 85%
+top_solid_infill_speed = 85%
+support_material_speed = 30
+support_material_interface_speed = 85%
+bridge_speed = 30
+gap_fill_speed = 40
+ironing_speed = 15
+
+# Common print preset
+[print:*common predator 0.4 nozzle detailed*]
+inherits = *common predator 0.4 nozzle*
+extrusion_width = 0.42
+first_layer_extrusion_width = 0.41
+perimeter_extrusion_width = 0.42
+external_perimeter_extrusion_width = 0.42
+infill_extrusion_width = 0.4
+solid_infill_extrusion_width = 0.4
+top_infill_extrusion_width = 0.4
+support_material_extrusion_width = 0.38
+
+# Common print preset
+[print:*common predator 0.4 nozzle coarse*]
+inherits = *common predator 0.4 nozzle*
+extrusion_width = 0.44
+first_layer_extrusion_width = 0.42
+perimeter_extrusion_width = 0.5
+external_perimeter_extrusion_width = 0.5
+infill_extrusion_width = 0.5
+solid_infill_extrusion_width = 0.5
+top_infill_extrusion_width = 0.4
+support_material_extrusion_width = 0.38
+
+# Common print preset
+[print:*common predator 0.6 nozzle detailed*]
+inherits = *common predator 0.6 nozzle*
+extrusion_width = 0.64
+first_layer_extrusion_width = 0.62
+perimeter_extrusion_width = 0.64
+external_perimeter_extrusion_width = 0.64
+infill_extrusion_width = 0.6
+solid_infill_extrusion_width = 0.6
+top_infill_extrusion_width = 0.6
+support_material_extrusion_width = 0.56
+
+# Common print preset
+[print:*common predator 0.6 nozzle coarse*]
+inherits = *common predator 0.6 nozzle*
+extrusion_width = 0.67
+first_layer_extrusion_width = 0.64
+perimeter_extrusion_width = 0.7
+external_perimeter_extrusion_width = 0.7
+infill_extrusion_width = 0.7
+solid_infill_extrusion_width = 0.7
+top_infill_extrusion_width = 0.6
+support_material_extrusion_width = 0.56
+
+# Common print preset
+[print:*common predator 0.8 nozzle detailed*]
+inherits = *common predator 0.8 nozzle*
+extrusion_width = 0.84
+first_layer_extrusion_width = 0.82
+perimeter_extrusion_width = 0.84
+external_perimeter_extrusion_width = 0.84
+infill_extrusion_width = 0.8
+solid_infill_extrusion_width = 0.8
+top_infill_extrusion_width = 0.8
+support_material_extrusion_width = 0.72
+
+# Common print preset
+[print:*common predator 0.8 nozzle coarse*]
+inherits = *common predator 0.8 nozzle*
+extrusion_width = 0.87
+first_layer_extrusion_width = 0.84
+perimeter_extrusion_width = 0.9
+external_perimeter_extrusion_width = 0.9
+infill_extrusion_width = 0.9
+solid_infill_extrusion_width = 0.9
+top_infill_extrusion_width = 0.8
+support_material_extrusion_width = 0.72
+
+#########################################
+####### end common print presets ########
+#########################################
+
+#########################################
+########## begin print presets ##########
+#########################################
+
+[print:0.08mm 0.4 nozzle DETAILED QUALITY @PREDATOR]
+inherits = *common predator 0.4 nozzle detailed*; *common predator quality*
+layer_height = 0.08
+max_print_speed = 50
+perimeters = 3
+fill_pattern = grid
+
+[print:0.16mm 0.4 nozzle DETAILED QUALITY @PREDATOR]
+inherits = *common predator 0.4 nozzle detailed*; *common predator quality*
+layer_height = 0.16
+max_print_speed = 60
+perimeters = 3
+fill_pattern = grid
+
+[print:0.16mm 0.4 nozzle COARSE QUALITY @PREDATOR]
+inherits = *common predator 0.4 nozzle coarse*; *common predator quality*
+layer_height = 0.16
+max_print_speed = 60
+perimeters = 3
+fill_pattern = grid
+
+[print:0.24mm 0.4 nozzle DETAILED QUALITY @PREDATOR]
+inherits = *common predator 0.4 nozzle detailed*; *common predator quality*
+layer_height = 0.24
+max_print_speed = 70
+perimeters = 3
+fill_pattern = grid
+
+[print:0.24mm 0.4 nozzle COARSE QUALITY @PREDATOR]
+inherits = *common predator 0.4 nozzle coarse*; *common predator quality*
+layer_height = 0.24
+max_print_speed = 70
+perimeters = 3
+fill_pattern = grid
+
+[print:0.32mm 0.4 nozzle DETAILED QUALITY @PREDATOR]
+inherits = *common predator 0.4 nozzle detailed*; *common predator quality*
+layer_height = 0.32
+max_print_speed = 70
+perimeters = 3
+fill_pattern = grid
+
+[print:0.32mm 0.4 nozzle COARSE QUALITY @PREDATOR]
+inherits = *common predator 0.4 nozzle coarse*; *common predator quality*
+layer_height = 0.32
+max_print_speed = 70
+perimeters = 3
+fill_pattern = grid
+
+[print:0.16mm 0.6 nozzle DETAILED QUALITY @PREDATOR]
+inherits = *common predator 0.6 nozzle detailed*; *common predator quality*
+layer_height = 0.16
+max_print_speed = 70
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.16mm 0.6 nozzle DETAILED SPEED @PREDATOR]
+inherits = *common predator 0.6 nozzle detailed*; *common predator speed*
+layer_height = 0.16
+max_print_speed = 80
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.16mm 0.6 nozzle COARSE QUALITY @PREDATOR]
+inherits = *common predator 0.6 nozzle coarse*; *common predator quality*
+layer_height = 0.16
+max_print_speed = 70
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.16mm 0.6 nozzle COARSE SPEED @PREDATOR]
+inherits = *common predator 0.6 nozzle coarse*; *common predator speed*
+layer_height = 0.16
+max_print_speed = 80
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.24mm 0.6 nozzle DETAILED QUALITY @PREDATOR]
+inherits = *common predator 0.6 nozzle detailed*; *common predator quality*
+layer_height = 0.24
+max_print_speed = 70
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.24mm 0.6 nozzle DETAILED SPEED @PREDATOR]
+inherits = *common predator 0.6 nozzle detailed*; *common predator speed*
+layer_height = 0.24
+max_print_speed = 80
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.24mm 0.6 nozzle COARSE QUALITY @PREDATOR]
+inherits = *common predator 0.6 nozzle coarse*; *common predator quality*
+layer_height = 0.24
+max_print_speed = 70
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.24mm 0.6 nozzle COARSE SPEED @PREDATOR]
+inherits = *common predator 0.6 nozzle coarse*; *common predator speed*
+layer_height = 0.24
+max_print_speed = 80
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.32mm 0.6 nozzle DETAILED QUALITY @PREDATOR]
+inherits = *common predator 0.6 nozzle detailed*; *common predator quality*
+layer_height = 0.32
+max_print_speed = 70
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.32mm 0.6 nozzle DETAILED SPEED @PREDATOR]
+inherits = *common predator 0.6 nozzle detailed*; *common predator speed*
+layer_height = 0.32
+max_print_speed = 80
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.32mm 0.6 nozzle COARSE QUALITY @PREDATOR]
+inherits = *common predator 0.6 nozzle coarse*; *common predator quality*
+layer_height = 0.32
+max_print_speed = 70
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.32mm 0.6 nozzle COARSE SPEED @PREDATOR]
+inherits = *common predator 0.6 nozzle coarse*; *common predator speed*
+layer_height = 0.32
+max_print_speed = 80
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.4mm 0.6 nozzle DETAILED QUALITY @PREDATOR]
+inherits = *common predator 0.6 nozzle detailed*; *common predator quality*
+layer_height = 0.4
+max_print_speed = 70
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.4mm 0.6 nozzle DETAILED SPEED @PREDATOR]
+inherits = *common predator 0.6 nozzle detailed*; *common predator speed*
+layer_height = 0.4
+max_print_speed = 80
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.4mm 0.6 nozzle COARSE QUALITY @PREDATOR]
+inherits = *common predator 0.6 nozzle coarse*; *common predator quality*
+layer_height = 0.4
+max_print_speed = 70
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.4mm 0.6 nozzle COARSE SPEED @PREDATOR]
+inherits = *common predator 0.6 nozzle coarse*; *common predator speed*
+layer_height = 0.4
+max_print_speed = 80
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.24mm 0.8 nozzle DETAILED QUALITY @PREDATOR]
+inherits = *common predator 0.8 nozzle detailed*; *common predator quality*
+layer_height = 0.24
+max_print_speed = 80
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.24mm 0.8 nozzle DETAILED SPEED @PREDATOR]
+inherits = *common predator 0.8 nozzle detailed*; *common predator speed*
+layer_height = 0.24
+max_print_speed = 90
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.24mm 0.8 nozzle COARSE QUALITY @PREDATOR]
+inherits = *common predator 0.8 nozzle coarse*; *common predator quality*
+layer_height = 0.24
+max_print_speed = 80
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.24mm 0.8 nozzle COARSE SPEED @PREDATOR]
+inherits = *common predator 0.8 nozzle coarse*; *common predator speed*
+layer_height = 0.24
+max_print_speed = 90
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.32mm 0.8 nozzle DETAILED QUALITY @PREDATOR]
+inherits = *common predator 0.8 nozzle detailed*; *common predator quality*
+layer_height = 0.32
+max_print_speed = 80
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.32mm 0.8 nozzle DETAILED SPEED @PREDATOR]
+inherits = *common predator 0.8 nozzle detailed*; *common predator speed*
+layer_height = 0.32
+max_print_speed = 90
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.32mm 0.8 nozzle COARSE QUALITY @PREDATOR]
+inherits = *common predator 0.8 nozzle coarse*; *common predator quality*
+layer_height = 0.32
+max_print_speed = 80
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.32mm 0.8 nozzle COARSE SPEED @PREDATOR]
+inherits = *common predator 0.8 nozzle coarse*; *common predator speed*
+layer_height = 0.32
+max_print_speed = 90
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.4mm 0.8 nozzle DETAILED QUALITY @PREDATOR]
+inherits = *common predator 0.8 nozzle detailed*; *common predator quality*
+layer_height = 0.4
+max_print_speed = 80
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.4mm 0.8 nozzle DETAILED SPEED @PREDATOR]
+inherits = *common predator 0.8 nozzle detailed*; *common predator speed*
+layer_height = 0.4
+max_print_speed = 90
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.4mm 0.8 nozzle COARSE QUALITY @PREDATOR]
+inherits = *common predator 0.8 nozzle coarse*; *common predator quality*
+layer_height = 0.4
+max_print_speed = 80
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.4mm 0.8 nozzle COARSE SPEED @PREDATOR]
+inherits = *common predator 0.8 nozzle coarse*; *common predator speed*
+layer_height = 0.4
+max_print_speed = 90
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.48mm 0.8 nozzle DETAILED QUALITY @PREDATOR]
+inherits = *common predator 0.8 nozzle detailed*; *common predator quality*
+layer_height = 0.48
+max_print_speed = 80
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.48mm 0.8 nozzle DETAILED SPEED @PREDATOR]
+inherits = *common predator 0.8 nozzle detailed*; *common predator speed*
+layer_height = 0.48
+max_print_speed = 90
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.48mm 0.8 nozzle COARSE QUALITY @PREDATOR]
+inherits = *common predator 0.8 nozzle coarse*; *common predator quality*
+layer_height = 0.48
+max_print_speed = 80
+perimeters = 2
+fill_pattern = gyroid
+
+[print:0.48mm 0.8 nozzle COARSE SPEED @PREDATOR]
+inherits = *common predator 0.8 nozzle coarse*; *common predator speed*
+layer_height = 0.48
+max_print_speed = 90
+perimeters = 2
+fill_pattern = gyroid
+
+#########################################
+########### end print presets ###########
+#########################################
+
+#########################################
+######## begin filament presets #########
+#########################################
+
+# Common filament preset
+[filament:*common predator*]
+cooling = 0
+compatible_printers =
+extrusion_multiplier = 1
+filament_cost = 0
+filament_density = 0
+filament_diameter = 1.75
+filament_notes = ""
+filament_settings_id = ""
+filament_soluble = 0
+min_print_speed = 15
+slowdown_below_layer_time = 20
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_ANYCUBIC.*/ and printer_notes=~/.*PRINTER_MODEL_PREDATOR.*/
+
+[filament:*PLA predator*]
+inherits = *common predator*
+bed_temperature = 60
+fan_below_layer_time = 100
+filament_colour = #FF3232
+filament_max_volumetric_speed = 10
+filament_type = PLA
+filament_density = 1.24
+filament_cost = 20
+first_layer_bed_temperature = 60
+first_layer_temperature = 200
+fan_always_on = 1
+cooling = 1
+max_fan_speed = 100
+min_fan_speed = 100
+bridge_fan_speed = 100
+disable_fan_first_layers = 1
+temperature = 200
+
+[filament:*PET predator*]
+inherits = *common predator*
+bed_temperature = 70
+cooling = 1
+disable_fan_first_layers = 3
+fan_below_layer_time = 20
+filament_colour = #FF8000
+filament_max_volumetric_speed = 8
+filament_type = PETG
+filament_density = 1.27
+filament_cost = 30
+first_layer_bed_temperature =70
+first_layer_temperature = 240
+fan_always_on = 1
+max_fan_speed = 50
+min_fan_speed = 20
+bridge_fan_speed = 100
+temperature = 240
+
+[filament:*ABS predator*]
+inherits = *common predator*
+bed_temperature = 100
+cooling = 0
+disable_fan_first_layers = 3
+fan_below_layer_time = 20
+filament_colour = #3A80CA
+filament_max_volumetric_speed = 10
+filament_type = ABS
+filament_density = 1.04
+filament_cost = 20
+first_layer_bed_temperature = 100
+first_layer_temperature = 245
+fan_always_on = 0
+max_fan_speed = 0
+min_fan_speed = 0
+bridge_fan_speed = 30
+top_fan_speed = 0
+temperature = 245
+
+[filament:Generic PLA @PREDATOR]
+inherits = *PLA predator*
+filament_vendor = Generic
+
+[filament:Generic PETG @PREDATOR]
+inherits = *PET predator*
+filament_vendor = Generic
+
+[filament:Generic ABS @PREDATOR]
+inherits = *ABS predator*
+filament_vendor = Generic
+
+#########################################
+######### end filament presets ##########
+#########################################
+
+#########################################
+######### begin printer presets #########
+#########################################
+
+# Anycubic predator common printer preset
+[printer:*common predator*]
+printer_vendor = Anycubic
+printer_model = Predator
+printer_technology = FFF
+printer_variant = 0.4
+thumbnails = 16x16,220x124
+bed_shape = 188.779x16.516,186.621x32.9063,183.043x49.0462,178.072x64.8128,171.745x80.0862,164.112x94.75,155.229x108.693,145.165x121.808,133.997x133.997,121.808x145.165,108.693x155.229,94.75x164.112,80.0862x171.745,64.8128x178.072,49.0462x183.043,32.9063x186.621,16.516x188.779,1.16035e-14x189.5,-16.516x188.779,-32.9063x186.621,-49.0462x183.043,-64.8128x178.072,-80.0862x171.745,-94.75x164.112,-108.693x155.229,-121.808x145.165,-133.997x133.997,-145.165x121.808,-155.229x108.693,-164.112x94.75,-171.745x80.0862,-178.072x64.8128,-183.043x49.0462,-186.621x32.9063,-188.779x16.516,-189.5x2.32071e-14,-188.779x-16.516,-186.621x-32.9063,-183.043x-49.0462,-178.072x-64.8128,-171.745x-80.0862,-164.112x-94.75,-155.229x-108.693,-145.165x-121.808,-133.997x-133.997,-121.808x-145.165,-108.693x-155.229,-94.75x-164.112,-80.0862x-171.745,-64.8128x-178.072,-49.0462x-183.043,-32.9063x-186.621,-16.516x-188.779,-3.48106e-14x-189.5,16.516x-188.779,32.9063x-186.621,49.0462x-183.043,64.8128x-178.072,80.0862x-171.745,94.75x-164.112,108.693x-155.229,121.808x-145.165,133.997x-133.997,145.165x-121.808,155.229x-108.693,164.112x-94.75,171.745x-80.0862,178.072x-64.8128,183.043x-49.0462,186.621x-32.9063,188.779x-16.516,189.5x-4.64141e-14
+max_print_height = 445
+z_offset = 0
+single_extruder_multi_material = 0
+gcode_flavor = reprap
+silent_mode = 0
+remaining_times = 0
+use_relative_e_distances = 0
+use_firmware_retraction = 0
+use_volumetric_e = 0
+variable_layer_height = 1
+start_gcode = ; start_gcode | start\n\n; v11 2020-11-14_11-27 tillverka\n\n; set metric values\n\nG21\n\n; use absolute positioning\n\nG90\n\n; set extruder to absolute mode\n\nM82\n\n; start with fan off\n\nM107\n\n; set temps\n\nM104 S[first_layer_temperature]\nM140 S[first_layer_bed_temperature]\n\n; home xy\n\nG28 X0 Y0\n\n; home z\n\nG28 Z0\n\n; move the head down to Z 94mm\n\nG1 Z94.0 F2394\n\n; set and wait for temps\n\nM109 S[first_layer_temperature]\nM190 S[first_layer_bed_temperature]\n\n; zero the extruded length\n\nG92 E0\n\n; extrude 3mm of feed stock\n\nG1 F200 E3\n\n; zero the extruded length again\n\nG92 E0\n\n; set speed\n\nG1 F{travel_speed}\n\n; print preskirt\n\nG92 E0\nG1 E3.94000 F2520.00000\n\nG1 X125.464 Y-139.310\nG1 Z0.329 F3994.000\n\nG1 F994.000\n\nG1 X125.464 Y-139.310 E4.19679\nG1 X130.218 Y-134.876 E4.70359\nG1 X132.569 Y-132.567 E4.96053\nG1 X137.099 Y-127.877 E5.46890\nG1 X139.325 Y-125.447 E5.72585\nG1 X141.507 Y-122.981 E5.98254\nG1 X145.685 Y-118.002 E6.48934\nG1 X149.741 Y-112.810 E7.00296\nG1 X153.561 Y-107.552 E7.50975\nG1 X155.440 Y-104.819 E7.76827\nG1 X158.980 Y-99.367 E8.27506\nG1 X160.702 Y-96.558 E8.53201\nG1 X163.962 Y-90.911 E9.04038\nG1 X165.535 Y-88.015 E9.29732\nG1 X168.496 Y-82.205 E9.80570\nG1 X169.915 Y-79.231 E10.06264\nG1 X171.280 Y-76.235 E10.31934\nG1 X173.819 Y-70.251 E10.82613\nG1 X176.180 Y-64.101 E11.33975\nG1 X178.297 Y-57.955 E11.84654\nG1 X179.294 Y-54.793 E12.10507\nG1 X181.085 Y-48.544 E12.61186\nG1 X181.911 Y-45.354 E12.86880\nG1 X183.378 Y-39.001 E13.37718\nG1 X184.035 Y-35.771 E13.63412\nG1 X185.168 Y-29.350 E14.14250\nG1 X185.655 Y-26.091 E14.39944\nG1 X186.084 Y-22.826 E14.65614\nG1 X186.764 Y-16.362 E15.16293\nG1 X187.223 Y-9.790 E15.67655\nG1 X187.450 Y-3.294 E16.18334\nG1 X187.479 Y0.002 E16.44028\nG1 X187.450 Y3.294 E16.69698\nG1 X187.223 Y9.810 E17.20529\nG1 X187.021 Y13.100 E17.46229\nG1 X186.454 Y19.575 E17.96909\nG1 X186.079 Y22.870 E18.22761\nG1 X185.174 Y29.307 E18.73440\nG1 X184.031 Y35.794 E19.24802\nG1 X182.679 Y42.152 E19.75481\nG1 X181.910 Y45.357 E20.01176\nG1 X180.223 Y51.655 E20.52013\nG1 X179.287 Y54.815 E20.77708\nG1 X177.272 Y61.017 E21.28545\nG1 X176.172 Y64.123 E21.54239\nG1 X175.019 Y67.207 E21.79909\nG1 X172.584 Y73.234 E22.30588\nG1 X169.905 Y79.252 E22.81950\nG1 X167.055 Y85.094 E23.32629\nG1 X165.524 Y88.035 E23.58482\nG1 X162.373 Y93.721 E24.09161\nG1 X160.700 Y96.560 E24.34855\nG1 X157.245 Y102.090 E24.85693\nG1 X155.427 Y104.838 E25.11387\nG1 X151.687 Y110.180 E25.62225\nG1 X149.727 Y112.829 E25.87919\nG1 X147.722 Y115.441 E26.13588\nG1 X143.631 Y120.493 E26.64268\nG1 X139.310 Y125.464 E27.15629\nG1 X134.876 Y130.218 E27.66309\nG1 X132.567 Y132.569 E27.92003\nG1 X127.877 Y137.099 E28.42840\nG1 X125.447 Y139.325 E28.68535\nG1 X122.981 Y141.507 E28.94204\nG1 X118.002 Y145.685 E29.44883\nG1 X112.810 Y149.741 E29.96245\nG1 X107.552 Y153.561 E30.46924\nG1 X104.819 Y155.440 E30.72777\nG1 X99.367 Y158.980 E31.23456\nG1 X96.558 Y160.702 E31.49151\nG1 X90.911 Y163.962 E31.99988\nG1 X88.015 Y165.535 E32.25682\nG1 X82.205 Y168.496 E32.76520\nG1 X79.231 Y169.915 E33.02214\nG1 X76.235 Y171.280 E33.27884\nG1 X70.251 Y173.819 E33.78563\nG1 X64.101 Y176.180 E34.29925\nG1 X57.955 Y178.297 E34.80604\nG1 X54.793 Y179.294 E35.06457\nG1 X48.544 Y181.085 E35.57136\nG1 X45.354 Y181.911 E35.82830\nG1 X39.001 Y183.378 E36.33668\nG1 X35.771 Y184.035 E36.59362\nG1 X29.350 Y185.168 E37.10200\nG1 X26.091 Y185.655 E37.35894\nG1 X22.826 Y186.084 E37.61563\nG1 X16.362 Y186.764 E38.12242\nG1 X9.790 Y187.223 E38.63605\nG1 X3.294 Y187.450 E39.14283\nG1 X-0.002 Y187.479 E39.39978\nG1 X-3.294 Y187.450 E39.65648\nG1 X-9.810 Y187.223 E40.16479\nG1 X-13.100 Y187.021 E40.42179\nG1 X-19.575 Y186.454 E40.92858\nG1 X-22.870 Y186.079 E41.18711\nG1 X-29.307 Y185.174 E41.69390\nG1 X-35.794 Y184.031 E42.20752\nG1 X-42.152 Y182.679 E42.71431\nG1 X-45.357 Y181.910 E42.97126\nG1 X-51.655 Y180.223 E43.47963\nG1 X-54.815 Y179.287 E43.73657\nG1 X-61.017 Y177.272 E44.24495\nG1 X-64.123 Y176.172 E44.50189\nG1 X-67.207 Y175.019 E44.75859\nG1 X-73.234 Y172.584 E45.26538\nG1 X-79.252 Y169.905 E45.77900\nG1 X-85.094 Y167.055 E46.28579\nG1 X-88.035 Y165.524 E46.54432\nG1 X-93.721 Y162.373 E47.05111\nG1 X-96.560 Y160.700 E47.30805\nG1 X-102.090 Y157.245 E47.81643\nG1 X-104.838 Y155.427 E48.07337\nG1 X-110.180 Y151.687 E48.58174\nG1 X-112.829 Y149.727 E48.83869\nG1 X-115.441 Y147.722 E49.09538\nG1 X-120.493 Y143.631 E49.60218\nG1 X-125.464 Y139.310 E50.11579\nG1 X-130.218 Y134.876 E50.62259\nG1 X-132.569 Y132.567 E50.87953\nG1 X-137.099 Y127.877 E51.38790\nG1 X-139.325 Y125.447 E51.64485\nG1 X-141.507 Y122.981 E51.90154\nG1 X-145.685 Y118.002 E52.40833\nG1 X-149.741 Y112.810 E52.92195\nG1 X-153.561 Y107.552 E53.42874\nG1 X-155.440 Y104.819 E53.68727\nG1 X-158.980 Y99.367 E54.19406\nG1 X-160.702 Y96.558 E54.45101\nG1 X-163.962 Y90.911 E54.95938\nG1 X-165.535 Y88.015 E55.21632\nG1 X-168.496 Y82.205 E55.72470\nG1 X-169.915 Y79.231 E55.98164\nG1 X-171.280 Y76.235 E56.23834\nG1 X-173.819 Y70.251 E56.74513\nG1 X-176.180 Y64.101 E57.25875\nG1 X-178.297 Y57.955 E57.76554\nG1 X-179.294 Y54.793 E58.02407\nG1 X-181.085 Y48.544 E58.53086\nG1 X-181.911 Y45.354 E58.78780\nG1 X-183.378 Y39.001 E59.29618\nG1 X-184.035 Y35.771 E59.55312\nG1 X-185.168 Y29.350 E60.06149\nG1 X-185.655 Y26.091 E60.31844\nG1 X-186.084 Y22.826 E60.57513\nG1 X-186.764 Y16.362 E61.08192\nG1 X-187.223 Y9.790 E61.59554\nG1 X-187.450 Y3.294 E62.10233\nG1 X-187.479 Y-0.002 E62.35928\nG1 X-187.450 Y-3.294 E62.61598\nG1 X-187.223 Y-9.810 E63.12429\nG1 X-187.021 Y-13.100 E63.38129\nG1 X-186.454 Y-19.575 E63.88808\nG1 X-186.079 Y-22.870 E64.14661\nG1 X-185.174 Y-29.307 E64.65340\nG1 X-184.031 Y-35.794 E65.16702\nG1 X-182.679 Y-42.152 E65.67381\nG1 X-181.910 Y-45.357 E65.93076\nG1 X-180.223 Y-51.655 E66.43913\nG1 X-179.287 Y-54.815 E66.69607\nG1 X-177.272 Y-61.017 E67.20445\nG1 X-176.172 Y-64.123 E67.46139\nG1 X-175.019 Y-67.207 E67.71809\nG1 X-172.584 Y-73.234 E68.22488\nG1 X-169.905 Y-79.252 E68.73850\nG1 X-167.055 Y-85.094 E69.24529\nG1 X-165.524 Y-88.035 E69.50382\nG1 X-162.373 Y-93.721 E70.01061\nG1 X-160.700 Y-96.560 E70.26755\nG1 X-157.245 Y-102.090 E70.77593\nG1 X-155.427 Y-104.838 E71.03287\nG1 X-151.687 Y-110.180 E71.54124\nG1 X-149.727 Y-112.829 E71.79819\nG1 X-147.722 Y-115.441 E72.05488\nG1 X-143.631 Y-120.493 E72.56167\nG1 X-139.310 Y-125.464 E73.07529\nG1 X-134.876 Y-130.218 E73.58209\nG1 X-132.567 Y-132.569 E73.83903\nG1 X-127.877 Y-137.099 E74.34740\nG1 X-125.447 Y-139.325 E74.60435\nG1 X-122.981 Y-141.507 E74.86104\nG1 X-118.002 Y-145.685 E75.36783\nG1 X-112.810 Y-149.741 E75.88145\nG1 X-107.552 Y-153.561 E76.38824\nG1 X-104.819 Y-155.440 E76.64677\nG1 X-99.367 Y-158.980 E77.15356\nG1 X-96.558 Y-160.702 E77.41051\nG1 X-90.911 Y-163.962 E77.91888\nG1 X-88.015 Y-165.535 E78.17582\nG1 X-82.205 Y-168.496 E78.68420\nG1 X-79.231 Y-169.915 E78.94114\nG1 X-76.235 Y-171.280 E79.19784\nG1 X-70.251 Y-173.819 E79.70463\nG1 X-64.101 Y-176.180 E80.21825\nG1 X-57.955 Y-178.297 E80.72504\nG1 X-54.793 Y-179.294 E80.98356\nG1 X-48.544 Y-181.085 E81.49036\nG1 X-45.354 Y-181.911 E81.74730\nG1 X-39.001 Y-183.378 E82.25568\nG1 X-35.771 Y-184.035 E82.51262\nG1 X-29.350 Y-185.168 E83.02099\nG1 X-26.091 Y-185.655 E83.27794\nG1 X-22.826 Y-186.084 E83.53463\nG1 X-16.362 Y-186.764 E84.04142\nG1 X-9.790 Y-187.223 E84.55504\nG1 X-3.294 Y-187.450 E85.06183\nG1 X0.006 Y-187.479 E85.31908\nG1 X6.521 Y-187.366 E85.82715\nG1 X9.810 Y-187.223 E86.08379\nG1 X13.100 Y-187.021 E86.34079\nG1 X19.575 Y-186.454 E86.84758\nG1 X22.870 Y-186.079 E87.10611\nG1 X29.307 Y-185.174 E87.61290\nG1 X35.794 Y-184.031 E88.12652\nG1 X42.152 Y-182.679 E88.63331\nG1 X45.357 Y-181.910 E88.89025\nG1 X51.655 Y-180.223 E89.39863\nG1 X54.815 Y-179.287 E89.65557\nG1 X61.017 Y-177.272 E90.16395\nG1 X64.123 Y-176.172 E90.42089\nG1 X67.207 Y-175.019 E90.67759\nG1 X73.234 Y-172.584 E91.18438\nG1 X79.252 Y-169.905 E91.69800\nG1 X85.094 Y-167.055 E92.20479\nG1 X88.035 Y-165.524 E92.46332\nG1 X93.721 Y-162.373 E92.97011\nG1 X96.560 Y-160.700 E93.22705\nG1 X102.090 Y-157.245 E93.73543\nG1 X104.838 Y-155.427 E93.99237\nG1 X110.180 Y-151.687 E94.50074\nG1 X112.829 Y-149.727 E94.75768\nG1 X115.441 Y-147.722 E95.01438\nG1 X120.493 Y-143.631 E95.52117\nG1 X122.911 Y-141.529 E95.77098\n\n; end preskirt\n; start_gcode | end
+end_gcode = ; end_gcode | start\n\n; v11 2020-11-14_11-27 tillverka\n\n; use relative positioning\n\nG91\n\n; retract the filament a bit before lifting the nozzle to release some of the pressure\n\nG1 E-1 F300\n\n; home\n\nG28\n\n; use absolute positioning\n\nG90\n\n; cooldown\n\nM104 S0\nM140 S0\n\n; end_gcode | end\n
+before_layer_gcode =
+layer_gcode =
+toolchange_gcode =
+between_objects_gcode =
+retract_length = 4
+retract_lift = 0.3
+retract_lift_above = 0
+retract_lift_below = 449
+retract_speed = 30
+deretract_speed = 0
+retract_restart_extra = 0
+retract_before_travel = 2
+retract_layer_change = 1
+wipe = 1
+retract_before_wipe = 70%
+retract_length_toolchange = 10
+retract_restart_extra_toolchange = 0
+extruder_colour = #1193FF
+machine_max_acceleration_e = 3000
+machine_max_acceleration_extruding = 1000
+machine_max_acceleration_retracting = 1000
+machine_max_acceleration_x = 1500
+machine_max_acceleration_y = 1500
+machine_max_acceleration_z = 1500
+machine_max_feedrate_e = 60
+machine_max_feedrate_x = 200
+machine_max_feedrate_y = 200
+machine_max_feedrate_z = 200
+machine_max_jerk_e = 5
+machine_max_jerk_x = 5
+machine_max_jerk_y = 5
+machine_max_jerk_z = 5
+machine_min_extruding_rate = 0
+machine_min_travel_rate = 0
+printer_settings_id =
+printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_ANYCUBIC\nPRINTER_MODEL_PREDATOR\nPRINTER_HAS_BOWDEN\n
+default_filament_profile = Generic PLA @PREDATOR
+
+[printer:Anycubic Predator 0.4 nozzle]
+inherits = *common predator*
+printer_model = PREDATOR
+printer_variant = 0.4
+nozzle_diameter = 0.4
+min_layer_height = 0.08
+max_layer_height = 0.32
+default_print_profile = 0.16mm 0.4 nozzle DETAILED QUALITY @PREDATOR
+
+[printer:Anycubic Predator 0.6 nozzle]
+inherits = *common predator*
+printer_model = PREDATOR
+printer_variant = 0.6
+nozzle_diameter = 0.6
+min_layer_height = 0.12
+max_layer_height = 0.4
+default_print_profile = 0.24mm 0.8 nozzle DETAILED QUALITY @PREDATOR
+
+[printer:Anycubic Predator 0.8 nozzle]
+inherits = *common predator*
+printer_model = PREDATOR
+printer_variant = 0.8
+nozzle_diameter = 0.8
+min_layer_height = 0.16
+max_layer_height = 0.48
+default_print_profile = 0.24mm 0.8 nozzle DETAILED QUALITY @PREDATOR
+
+#########################################
+########## end printer presets ##########
+#########################################
diff --git a/resources/profiles/Anycubic/AK.png b/resources/profiles/Anycubic/AK.png
new file mode 100644
index 000000000..a3837ba7a
--- /dev/null
+++ b/resources/profiles/Anycubic/AK.png
Binary files differ
diff --git a/resources/profiles/Anycubic/AKLP_Bed.stl b/resources/profiles/Anycubic/AKLP_Bed.stl
new file mode 100644
index 000000000..07abce367
--- /dev/null
+++ b/resources/profiles/Anycubic/AKLP_Bed.stl
@@ -0,0 +1,145756 @@
+solid Anycubic lineal plus cerramiento
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -177.04752841003284 -70.98664256999803 -43.00000000000016
+ vertex -177.3939385715466 -70.78664256999802 -43.00000000000016
+ vertex -177.04752841003287 -70.98664256999795 -44.40000000000016
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -180.49940999781728 -68.99369780608006 -43.254518677937675
+ vertex -177.04752841003287 -70.98664256999795 -44.40000000000016
+ vertex -177.3939385715466 -70.78664256999802 -43.00000000000016
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -180.8580401866845 -68.7866425699981 -43.20000000000018
+ vertex -180.49940999781728 -68.99369780608006 -43.254518677937675
+ vertex -177.3939385715466 -70.78664256999802 -43.00000000000016
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.6472706712258 -67.75362986810595 -43.10000000000016
+ vertex -180.8580401866845 -68.7866425699981 -43.20000000000018
+ vertex -177.3939385715466 -70.78664256999802 -43.00000000000016
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -180.16521986365692 -69.18664256999809 -43.41435935394508
+ vertex -177.04752841003287 -70.98664256999795 -44.40000000000016
+ vertex -180.49940999781728 -68.99369780608006 -43.254518677937675
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -179.87824428957117 -69.35232799494727 -43.6686291501017
+ vertex -177.04752841003287 -70.98664256999795 -44.40000000000016
+ vertex -180.16521986365692 -69.18664256999809 -43.41435935394508
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -179.65804018668445 -69.4794628930256 -44.0000000000002
+ vertex -177.04752841003287 -70.98664256999795 -44.40000000000016
+ vertex -179.87824428957117 -69.35232799494727 -43.6686291501017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -179.51961410070393 -69.55938323102929 -44.38588952783616
+ vertex -177.04752841003287 -70.98664256999795 -44.40000000000016
+ vertex -179.65804018668445 -69.4794628930256 -44.0000000000002
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -178.95278429835867 -69.88664256999802 -44.40000000000017
+ vertex -177.04752841003287 -70.98664256999795 -44.40000000000016
+ vertex -179.51961410070393 -69.55938323102929 -44.38588952783616
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -179.4723995406293 -69.58664256999803 -44.800000000000196
+ vertex -178.95278429835867 -69.88664256999802 -44.40000000000017
+ vertex -179.51961410070393 -69.55938323102929 -44.38588952783616
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -178.9527842983586 -69.88664256999792 -46.43431457505091
+ vertex -178.95278429835867 -69.88664256999802 -44.40000000000017
+ vertex -179.4723995406293 -69.58664256999803 -44.800000000000196
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -179.51961410070393 -69.55938323102926 -45.21411047216423
+ vertex -178.9527842983586 -69.88664256999792 -46.43431457505091
+ vertex -179.4723995406293 -69.58664256999803 -44.800000000000196
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -179.65804018668445 -69.47946289302554 -45.60000000000019
+ vertex -178.9527842983586 -69.88664256999792 -46.43431457505091
+ vertex -179.51961410070393 -69.55938323102926 -45.21411047216423
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -179.87824428957114 -69.35232799494723 -45.931370849898656
+ vertex -178.9527842983586 -69.88664256999792 -46.43431457505091
+ vertex -179.65804018668445 -69.47946289302554 -45.60000000000019
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -180.16521986365683 -69.18664256999797 -46.1856406460553
+ vertex -178.9527842983586 -69.88664256999792 -46.43431457505091
+ vertex -179.87824428957114 -69.35232799494723 -45.931370849898656
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -180.49940999781717 -68.99369780608001 -46.3454813220627
+ vertex -178.9527842983586 -69.88664256999792 -46.43431457505091
+ vertex -180.16521986365683 -69.18664256999797 -46.1856406460553
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -180.85804018668438 -68.78664256999798 -46.4000000000002
+ vertex -178.9527842983586 -69.88664256999792 -46.43431457505091
+ vertex -180.49940999781717 -68.99369780608001 -46.3454813220627
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -166.30881340310572 -77.18664256999767 -42.60000000000018
+ vertex -170.81214550278483 -74.58664256999784 -42.60000000000017
+ vertex -166.08466953506365 -77.31605209254894 -42.63407417371111
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -170.8121455027848 -74.58664256999782 -43.00000000000017
+ vertex -166.08466953506365 -77.31605209254894 -42.63407417371111
+ vertex -170.81214550278483 -74.58664256999784 -42.60000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -165.87580070121342 -77.43664256999769 -42.73397459621574
+ vertex -166.08466953506365 -77.31605209254894 -42.63407417371111
+ vertex -170.8121455027848 -74.58664256999782 -43.00000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -165.69644096740984 -77.54019596059094 -42.892893218813626
+ vertex -165.87580070121342 -77.43664256999769 -42.73397459621574
+ vertex -170.8121455027848 -74.58664256999782 -43.00000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -165.55881340310563 -77.61965527188991 -43.10000000000017
+ vertex -165.69644096740984 -77.54019596059094 -42.892893218813626
+ vertex -170.8121455027848 -74.58664256999782 -43.00000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -171.15855566429858 -74.38664256999785 -43.00000000000017
+ vertex -165.55881340310563 -77.61965527188991 -43.10000000000017
+ vertex -170.8121455027848 -74.58664256999782 -43.00000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -167.34804388764698 -76.58664256999771 -43.20000000000017
+ vertex -165.55881340310563 -77.61965527188991 -43.10000000000017
+ vertex -171.15855566429858 -74.38664256999785 -43.00000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -167.70667407651422 -76.37958733391568 -43.25451867793767
+ vertex -167.34804388764698 -76.58664256999771 -43.20000000000017
+ vertex -171.15855566429858 -74.38664256999785 -43.00000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -171.15855566429855 -74.38664256999782 -44.40000000000017
+ vertex -167.70667407651422 -76.37958733391568 -43.25451867793767
+ vertex -171.15855566429858 -74.38664256999785 -43.00000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -168.04086421067456 -76.18664256999774 -43.41435935394507
+ vertex -167.70667407651422 -76.37958733391568 -43.25451867793767
+ vertex -171.15855566429855 -74.38664256999782 -44.40000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -168.32783978476027 -76.02095714504847 -43.668629150101715
+ vertex -168.04086421067456 -76.18664256999774 -43.41435935394507
+ vertex -171.15855566429855 -74.38664256999782 -44.40000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -168.54804388764703 -75.89382224697016 -44.000000000000185
+ vertex -168.32783978476027 -76.02095714504847 -43.668629150101715
+ vertex -171.15855566429855 -74.38664256999782 -44.40000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -168.68646997362748 -75.81390190896644 -44.38588952783615
+ vertex -168.54804388764703 -75.89382224697016 -44.000000000000185
+ vertex -171.15855566429855 -74.38664256999782 -44.40000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -169.25329977597278 -75.48664256999771 -44.40000000000018
+ vertex -168.68646997362748 -75.81390190896644 -44.38588952783615
+ vertex -171.15855566429855 -74.38664256999782 -44.40000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -168.7336845337021 -75.7866425699977 -44.8000000000002
+ vertex -168.68646997362748 -75.81390190896644 -44.38588952783615
+ vertex -169.25329977597278 -75.48664256999771 -44.40000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -169.25329977597272 -75.48664256999764 -46.43431457505094
+ vertex -168.7336845337021 -75.7866425699977 -44.8000000000002
+ vertex -169.25329977597278 -75.48664256999771 -44.40000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -168.68646997362748 -75.81390190896644 -45.214110472164236
+ vertex -168.7336845337021 -75.7866425699977 -44.8000000000002
+ vertex -169.25329977597272 -75.48664256999764 -46.43431457505094
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -168.54804388764697 -75.89382224697013 -45.60000000000021
+ vertex -168.68646997362748 -75.81390190896644 -45.214110472164236
+ vertex -169.25329977597272 -75.48664256999764 -46.43431457505094
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -168.32783978476022 -76.02095714504841 -45.93137084989868
+ vertex -168.54804388764697 -75.89382224697013 -45.60000000000021
+ vertex -169.25329977597272 -75.48664256999764 -46.43431457505094
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -168.0408642106745 -76.18664256999763 -46.18564064605529
+ vertex -168.32783978476022 -76.02095714504841 -45.93137084989868
+ vertex -169.25329977597272 -75.48664256999764 -46.43431457505094
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -167.70667407651416 -76.37958733391561 -46.345481322062696
+ vertex -168.0408642106745 -76.18664256999763 -46.18564064605529
+ vertex -169.25329977597272 -75.48664256999764 -46.43431457505094
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -167.3480438876469 -76.5866425699976 -46.40000000000017
+ vertex -167.70667407651416 -76.37958733391561 -46.345481322062696
+ vertex -169.25329977597272 -75.48664256999764 -46.43431457505094
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -165.44278799932096 -77.68664256999723 -56.400000000000205
+ vertex -165.78919816083476 -77.48664256999727 -56.400000000000205
+ vertex -165.44278799932087 -77.68664256999709 -61.60000000000019
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -166.0096178016662 -77.3593832310284 -59.98588952783613
+ vertex -165.44278799932087 -77.68664256999709 -61.60000000000019
+ vertex -165.78919816083476 -77.48664256999727 -56.400000000000205
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -166.14804388764668 -77.2794628930247 -59.600000000000165
+ vertex -166.0096178016662 -77.3593832310284 -59.98588952783613
+ vertex -165.78919816083476 -77.48664256999727 -56.400000000000205
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -167.00163372613295 -76.7866425699972 -58.200000000000166
+ vertex -166.14804388764668 -77.2794628930247 -59.600000000000165
+ vertex -165.78919816083476 -77.48664256999727 -56.400000000000205
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -166.36824799053343 -77.15232799494639 -59.26862915010169
+ vertex -166.14804388764668 -77.2794628930247 -59.600000000000165
+ vertex -167.00163372613295 -76.7866425699972 -58.200000000000166
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -166.65522356461918 -76.98664256999719 -59.01435935394505
+ vertex -166.36824799053343 -77.15232799494639 -59.26862915010169
+ vertex -167.00163372613295 -76.7866425699972 -58.200000000000166
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -166.9894136987795 -76.79369780607921 -58.854518677937655
+ vertex -166.65522356461918 -76.98664256999719 -59.01435935394505
+ vertex -167.00163372613295 -76.7866425699972 -58.200000000000166
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -168.7634018274159 -75.7694852824719 -58.200000000000166
+ vertex -166.9894136987795 -76.79369780607921 -58.854518677937655
+ vertex -167.00163372613295 -76.7866425699972 -58.200000000000166
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -167.34804388764675 -76.5866425699972 -58.80000000000016
+ vertex -166.9894136987795 -76.79369780607921 -58.854518677937655
+ vertex -168.7634018274159 -75.7694852824719 -58.200000000000166
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -169.25329977597252 -75.48664256999727 -58.765685424949424
+ vertex -167.34804388764675 -76.5866425699972 -58.80000000000016
+ vertex -168.7634018274159 -75.7694852824719 -58.200000000000166
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -165.96240324159157 -77.38664256999711 -60.40000000000016
+ vertex -165.44278799932087 -77.68664256999709 -61.60000000000019
+ vertex -166.0096178016662 -77.3593832310284 -59.98588952783613
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -166.0096178016662 -77.35938323102839 -60.814110472164195
+ vertex -165.44278799932087 -77.68664256999709 -61.60000000000019
+ vertex -165.96240324159157 -77.38664256999711 -60.40000000000016
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -166.14804388764665 -77.27946289302466 -61.20000000000016
+ vertex -165.44278799932087 -77.68664256999709 -61.60000000000019
+ vertex -166.0096178016662 -77.35938323102839 -60.814110472164195
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -166.36824799053338 -77.15232799494633 -61.53137084989863
+ vertex -165.44278799932087 -77.68664256999709 -61.60000000000019
+ vertex -166.14804388764665 -77.27946289302466 -61.20000000000016
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -166.6552235646191 -76.98664256999713 -61.78564064605527
+ vertex -165.44278799932087 -77.68664256999709 -61.60000000000019
+ vertex -166.36824799053338 -77.15232799494633 -61.53137084989863
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -165.47229709936752 -77.66960548314157 -61.858819045102706
+ vertex -165.44278799932087 -77.68664256999709 -61.60000000000019
+ vertex -166.6552235646191 -76.98664256999713 -61.78564064605527
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -166.9894136987794 -76.7936978060791 -61.94548132206268
+ vertex -165.47229709936752 -77.66960548314157 -61.858819045102706
+ vertex -166.6552235646191 -76.98664256999713 -61.78564064605527
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -165.55881340310532 -77.61965527188926 -62.10000000000019
+ vertex -165.47229709936752 -77.66960548314157 -61.858819045102706
+ vertex -166.9894136987794 -76.7936978060791 -61.94548132206268
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -167.34804388764667 -76.58664256999714 -62.00000000000018
+ vertex -165.55881340310532 -77.61965527188926 -62.10000000000019
+ vertex -166.9894136987794 -76.7936978060791 -61.94548132206268
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -169.2532997759725 -75.4866425699972 -60.80000000000016
+ vertex -168.54804388764674 -75.89382224696966 -59.600000000000186
+ vertex -169.25329977597252 -75.48664256999727 -58.765685424949424
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -168.32783978476002 -76.02095714504797 -59.26862915010171
+ vertex -169.25329977597252 -75.48664256999727 -58.765685424949424
+ vertex -168.54804388764674 -75.89382224696966 -59.600000000000186
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -168.0408642106743 -76.18664256999723 -59.014359353945075
+ vertex -169.25329977597252 -75.48664256999727 -58.765685424949424
+ vertex -168.32783978476002 -76.02095714504797 -59.26862915010171
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -167.70667407651396 -76.37958733391518 -58.854518677937655
+ vertex -169.25329977597252 -75.48664256999727 -58.765685424949424
+ vertex -168.0408642106743 -76.18664256999723 -59.014359353945075
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -167.34804388764675 -76.5866425699972 -58.80000000000016
+ vertex -169.25329977597252 -75.48664256999727 -58.765685424949424
+ vertex -167.70667407651396 -76.37958733391518 -58.854518677937655
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -168.68646997362725 -75.81390190896596 -59.98588952783615
+ vertex -168.54804388764674 -75.89382224696966 -59.600000000000186
+ vertex -169.2532997759725 -75.4866425699972 -60.80000000000016
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -168.73368453370182 -75.78664256999723 -60.40000000000018
+ vertex -168.68646997362725 -75.81390190896596 -59.98588952783615
+ vertex -169.2532997759725 -75.4866425699972 -60.80000000000016
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -168.68646997362723 -75.81390190896595 -60.81411047216422
+ vertex -168.73368453370182 -75.78664256999723 -60.40000000000018
+ vertex -169.2532997759725 -75.4866425699972 -60.80000000000016
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -171.15855566429826 -74.38664256999729 -60.80000000000016
+ vertex -168.68646997362723 -75.81390190896595 -60.81411047216422
+ vertex -169.2532997759725 -75.4866425699972 -60.80000000000016
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -171.15855566429823 -74.3866425699972 -62.20000000000018
+ vertex -168.68646997362723 -75.81390190896595 -60.81411047216422
+ vertex -171.15855566429826 -74.38664256999729 -60.80000000000016
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -168.5480438876467 -75.89382224696963 -61.20000000000018
+ vertex -168.68646997362723 -75.81390190896595 -60.81411047216422
+ vertex -171.15855566429823 -74.3866425699972 -62.20000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -168.32783978475996 -76.02095714504792 -61.53137084989868
+ vertex -168.5480438876467 -75.89382224696963 -61.20000000000018
+ vertex -171.15855566429823 -74.3866425699972 -62.20000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -168.04086421067421 -76.18664256999713 -61.78564064605529
+ vertex -168.32783978475996 -76.02095714504792 -61.53137084989868
+ vertex -171.15855566429823 -74.3866425699972 -62.20000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -167.70667407651388 -76.37958733391513 -61.94548132206268
+ vertex -168.04086421067421 -76.18664256999713 -61.78564064605529
+ vertex -171.15855566429823 -74.3866425699972 -62.20000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -167.34804388764667 -76.58664256999714 -62.00000000000018
+ vertex -167.70667407651388 -76.37958733391513 -61.94548132206268
+ vertex -171.15855566429823 -74.3866425699972 -62.20000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -165.55881340310532 -77.61965527188926 -62.10000000000019
+ vertex -167.34804388764667 -76.58664256999714 -62.00000000000018
+ vertex -171.15855566429823 -74.3866425699972 -62.20000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -170.8121455027845 -74.5866425699972 -62.2000000000002
+ vertex -165.55881340310532 -77.61965527188926 -62.10000000000019
+ vertex -171.15855566429823 -74.3866425699972 -62.20000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -165.69644096740947 -77.54019596059028 -62.30710678118674
+ vertex -165.55881340310532 -77.61965527188926 -62.10000000000019
+ vertex -170.8121455027845 -74.5866425699972 -62.2000000000002
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -170.81214550278446 -74.5866425699972 -62.6000000000002
+ vertex -165.69644096740947 -77.54019596059028 -62.30710678118674
+ vertex -170.8121455027845 -74.5866425699972 -62.2000000000002
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -165.87580070121308 -77.43664256999705 -62.46602540378463
+ vertex -165.69644096740947 -77.54019596059028 -62.30710678118674
+ vertex -170.81214550278446 -74.5866425699972 -62.6000000000002
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -166.0846695350633 -77.31605209254832 -62.56592582628924
+ vertex -165.87580070121308 -77.43664256999705 -62.46602540378463
+ vertex -170.81214550278446 -74.5866425699972 -62.6000000000002
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -166.30881340310532 -77.18664256999705 -62.60000000000018
+ vertex -166.0846695350633 -77.31605209254832 -62.56592582628924
+ vertex -170.81214550278446 -74.5866425699972 -62.6000000000002
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -181.20445034819818 -68.58664256999799 -47.00000000000015
+ vertex -179.44268224691524 -69.60379985752333 -47.00000000000017
+ vertex -178.9527842983586 -69.88664256999792 -46.43431457505091
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -176.81743808261146 -71.11948528247241 -48.900000000000155
+ vertex -178.9527842983586 -69.88664256999792 -46.43431457505091
+ vertex -179.44268224691524 -69.60379985752333 -47.00000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -177.30733603116812 -70.83664256999782 -49.465685424949434
+ vertex -176.81743808261146 -71.11948528247241 -48.900000000000155
+ vertex -179.44268224691524 -69.60379985752333 -47.00000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -171.3886459917198 -74.25379985752299 -48.90000000000018
+ vertex -176.81743808261146 -71.11948528247241 -48.900000000000155
+ vertex -177.30733603116812 -70.83664256999782 -49.465685424949434
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -170.89874804316315 -74.53664256999762 -49.46568542494941
+ vertex -171.3886459917198 -74.25379985752299 -48.90000000000018
+ vertex -177.30733603116812 -70.83664256999782 -49.465685424949434
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -174.1030420371656 -72.6866425699977 -49.90000000000019
+ vertex -170.89874804316315 -74.53664256999762 -49.46568542494941
+ vertex -177.30733603116812 -70.83664256999782 -49.465685424949434
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -173.49785359345213 -73.03604828088608 -49.9920002690197
+ vertex -170.89874804316315 -74.53664256999762 -49.46568542494941
+ vertex -174.1030420371656 -72.6866425699977 -49.90000000000019
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -172.93390774205662 -73.36164256999763 -50.2617314097822
+ vertex -170.89874804316315 -74.53664256999762 -49.46568542494941
+ vertex -173.49785359345213 -73.03604828088608 -49.9920002690197
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -172.4496364607869 -73.64123672459945 -50.69081169079649
+ vertex -170.89874804316315 -74.53664256999762 -49.46568542494941
+ vertex -172.93390774205662 -73.36164256999763 -50.2617314097822
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -172.07804203716555 -73.8557768651066 -51.25000000000016
+ vertex -170.89874804316315 -74.53664256999762 -49.46568542494941
+ vertex -172.4496364607869 -73.64123672459945 -50.69081169079649
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -171.84444801707346 -73.99064243548779 -51.901188578223376
+ vertex -170.89874804316315 -74.53664256999762 -49.46568542494941
+ vertex -172.07804203716555 -73.8557768651066 -51.25000000000016
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -170.89874804316304 -74.53664256999741 -55.73431457505091
+ vertex -170.89874804316315 -74.53664256999762 -49.46568542494941
+ vertex -171.84444801707346 -73.99064243548779 -51.901188578223376
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -171.76477344694757 -74.03664256999754 -52.60000000000017
+ vertex -170.89874804316304 -74.53664256999741 -55.73431457505091
+ vertex -171.84444801707346 -73.99064243548779 -51.901188578223376
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -171.8444480170734 -73.99064243548774 -53.298811421776996
+ vertex -170.89874804316304 -74.53664256999741 -55.73431457505091
+ vertex -171.76477344694757 -74.03664256999754 -52.60000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -172.07804203716555 -73.85577686510648 -53.95000000000018
+ vertex -170.89874804316304 -74.53664256999741 -55.73431457505091
+ vertex -171.8444480170734 -73.99064243548774 -53.298811421776996
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -172.44963646078688 -73.64123672459934 -54.509188309203864
+ vertex -170.89874804316304 -74.53664256999741 -55.73431457505091
+ vertex -172.07804203716555 -73.85577686510648 -53.95000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -172.9339077420565 -73.3616425699975 -54.93826859021815
+ vertex -170.89874804316304 -74.53664256999741 -55.73431457505091
+ vertex -172.44963646078688 -73.64123672459934 -54.509188309203864
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -173.49785359345208 -73.03604828088592 -55.20799973098066
+ vertex -170.89874804316304 -74.53664256999741 -55.73431457505091
+ vertex -172.9339077420565 -73.3616425699975 -54.93826859021815
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -174.10304203716552 -72.68664256999753 -55.30000000000017
+ vertex -170.89874804316304 -74.53664256999741 -55.73431457505091
+ vertex -173.49785359345208 -73.03604828088592 -55.20799973098066
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -177.39393857154667 -70.78664256999807 -42.600000000000165
+ vertex -181.89727067122584 -68.18664256999816 -42.60000000000016
+ vertex -177.3939385715466 -70.78664256999802 -43.00000000000016
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.12141453926785 -68.05723304744691 -42.6340741737111
+ vertex -177.3939385715466 -70.78664256999802 -43.00000000000016
+ vertex -181.89727067122584 -68.18664256999816 -42.60000000000016
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.33028337311805 -67.93664256999818 -42.733974596215724
+ vertex -177.3939385715466 -70.78664256999802 -43.00000000000016
+ vertex -182.12141453926785 -68.05723304744691 -42.6340741737111
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.5096431069216 -67.8330891794049 -42.892893218813605
+ vertex -177.3939385715466 -70.78664256999802 -43.00000000000016
+ vertex -182.33028337311805 -67.93664256999818 -42.733974596215724
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.6472706712258 -67.75362986810595 -43.10000000000016
+ vertex -177.3939385715466 -70.78664256999802 -43.00000000000016
+ vertex -182.5096431069216 -67.8330891794049 -42.892893218813605
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -165.55881340310563 -77.61965527188991 -43.10000000000017
+ vertex -167.34804388764698 -76.58664256999771 -43.20000000000017
+ vertex -165.4722970993678 -77.66960548314219 -43.34118095489766
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -166.98941369877977 -76.7936978060797 -43.25451867793765
+ vertex -165.4722970993678 -77.66960548314219 -43.34118095489766
+ vertex -167.34804388764698 -76.58664256999771 -43.20000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -166.65522356461943 -76.9866425699977 -43.414359353945066
+ vertex -165.4722970993678 -77.66960548314219 -43.34118095489766
+ vertex -166.98941369877977 -76.7936978060797 -43.25451867793765
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -165.44278799932118 -77.68664256999766 -43.60000000000017
+ vertex -165.4722970993678 -77.66960548314219 -43.34118095489766
+ vertex -166.65522356461943 -76.9866425699977 -43.414359353945066
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -166.3682479905337 -77.15232799494687 -43.66862915010168
+ vertex -165.44278799932118 -77.68664256999766 -43.60000000000017
+ vertex -166.65522356461943 -76.9866425699977 -43.414359353945066
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -166.14804388764696 -77.2794628930252 -44.00000000000015
+ vertex -165.44278799932118 -77.68664256999766 -43.60000000000017
+ vertex -166.3682479905337 -77.15232799494687 -43.66862915010168
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -166.00961780166648 -77.3593832310289 -44.38588952783612
+ vertex -165.44278799932118 -77.68664256999766 -43.60000000000017
+ vertex -166.14804388764696 -77.2794628930252 -44.00000000000015
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -165.4427879993211 -77.6866425699975 -48.80000000000017
+ vertex -165.44278799932118 -77.68664256999766 -43.60000000000017
+ vertex -166.00961780166648 -77.3593832310289 -44.38588952783612
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -165.96240324159183 -77.38664256999762 -44.800000000000146
+ vertex -165.4427879993211 -77.6866425699975 -48.80000000000017
+ vertex -166.00961780166648 -77.3593832310289 -44.38588952783612
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -166.00961780166642 -77.3593832310289 -45.21411047216418
+ vertex -165.4427879993211 -77.6866425699975 -48.80000000000017
+ vertex -165.96240324159183 -77.38664256999762 -44.800000000000146
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -166.14804388764693 -77.27946289302517 -45.60000000000017
+ vertex -165.4427879993211 -77.6866425699975 -48.80000000000017
+ vertex -166.00961780166642 -77.3593832310289 -45.21411047216418
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -166.36824799053363 -77.15232799494682 -45.93137084989864
+ vertex -165.4427879993211 -77.6866425699975 -48.80000000000017
+ vertex -166.14804388764693 -77.27946289302517 -45.60000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -166.65522356461935 -76.98664256999758 -46.185640646055276
+ vertex -165.4427879993211 -77.6866425699975 -48.80000000000017
+ vertex -166.36824799053363 -77.15232799494682 -45.93137084989864
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -166.98941369877969 -76.79369780607962 -46.345481322062675
+ vertex -165.4427879993211 -77.6866425699975 -48.80000000000017
+ vertex -166.65522356461935 -76.98664256999758 -46.185640646055276
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -167.3480438876469 -76.5866425699976 -46.40000000000017
+ vertex -165.4427879993211 -77.6866425699975 -48.80000000000017
+ vertex -166.98941369877969 -76.79369780607962 -46.345481322062675
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -167.00163372613315 -76.78664256999758 -47.00000000000017
+ vertex -165.4427879993211 -77.6866425699975 -48.80000000000017
+ vertex -167.3480438876469 -76.5866425699976 -46.40000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -169.25329977597272 -75.48664256999764 -46.43431457505094
+ vertex -167.00163372613315 -76.78664256999758 -47.00000000000017
+ vertex -167.3480438876469 -76.5866425699976 -46.40000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -165.78919816083487 -77.48664256999749 -48.80000000000017
+ vertex -165.4427879993211 -77.6866425699975 -48.80000000000017
+ vertex -167.00163372613315 -76.78664256999758 -47.00000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -167.00163372613312 -76.7866425699975 -49.200000000000166
+ vertex -165.78919816083487 -77.48664256999749 -48.80000000000017
+ vertex -167.00163372613315 -76.78664256999758 -47.00000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -165.78919816083487 -77.48664256999749 -49.200000000000166
+ vertex -165.78919816083487 -77.48664256999749 -48.80000000000017
+ vertex -167.00163372613312 -76.7866425699975 -49.200000000000166
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -177.307336031168 -70.83664256999761 -55.73431457505093
+ vertex -176.36163605725767 -71.38264270450745 -51.901188578223376
+ vertex -177.30733603116812 -70.83664256999782 -49.465685424949434
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -176.12804203716564 -71.51750827488873 -51.25000000000016
+ vertex -177.30733603116812 -70.83664256999782 -49.465685424949434
+ vertex -176.36163605725767 -71.38264270450745 -51.901188578223376
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -175.75644761354428 -71.73204841539585 -50.69081169079648
+ vertex -177.30733603116812 -70.83664256999782 -49.465685424949434
+ vertex -176.12804203716564 -71.51750827488873 -51.25000000000016
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -175.27217633227463 -72.01164256999769 -50.2617314097822
+ vertex -177.30733603116812 -70.83664256999782 -49.465685424949434
+ vertex -175.75644761354428 -71.73204841539585 -50.69081169079648
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -174.70823048087905 -72.33723685910932 -49.99200026901969
+ vertex -177.30733603116812 -70.83664256999782 -49.465685424949434
+ vertex -175.27217633227463 -72.01164256999769 -50.2617314097822
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -174.1030420371656 -72.6866425699977 -49.90000000000019
+ vertex -177.30733603116812 -70.83664256999782 -49.465685424949434
+ vertex -174.70823048087905 -72.33723685910932 -49.99200026901969
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -176.44131062738361 -71.3366425699977 -52.60000000000017
+ vertex -176.36163605725767 -71.38264270450745 -51.901188578223376
+ vertex -177.307336031168 -70.83664256999761 -55.73431457505093
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -176.36163605725767 -71.38264270450739 -53.29881142177697
+ vertex -176.44131062738361 -71.3366425699977 -52.60000000000017
+ vertex -177.307336031168 -70.83664256999761 -55.73431457505093
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -176.12804203716556 -71.51750827488863 -53.95000000000018
+ vertex -176.36163605725767 -71.38264270450739 -53.29881142177697
+ vertex -177.307336031168 -70.83664256999761 -55.73431457505093
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -175.75644761354422 -71.73204841539575 -54.509188309203864
+ vertex -176.12804203716556 -71.51750827488863 -53.95000000000018
+ vertex -177.307336031168 -70.83664256999761 -55.73431457505093
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -175.27217633227454 -72.01164256999756 -54.93826859021815
+ vertex -175.75644761354422 -71.73204841539575 -54.509188309203864
+ vertex -177.307336031168 -70.83664256999761 -55.73431457505093
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -174.70823048087897 -72.33723685910915 -55.20799973098066
+ vertex -175.27217633227454 -72.01164256999756 -54.93826859021815
+ vertex -177.307336031168 -70.83664256999761 -55.73431457505093
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -174.10304203716552 -72.68664256999753 -55.30000000000017
+ vertex -174.70823048087897 -72.33723685910915 -55.20799973098066
+ vertex -177.307336031168 -70.83664256999761 -55.73431457505093
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -170.89874804316304 -74.53664256999741 -55.73431457505091
+ vertex -174.10304203716552 -72.68664256999753 -55.30000000000017
+ vertex -177.307336031168 -70.83664256999761 -55.73431457505093
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -171.38864599171967 -74.25379985752278 -56.30000000000017
+ vertex -170.89874804316304 -74.53664256999741 -55.73431457505091
+ vertex -177.307336031168 -70.83664256999761 -55.73431457505093
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -168.7634018274159 -75.7694852824719 -58.200000000000166
+ vertex -170.89874804316304 -74.53664256999741 -55.73431457505091
+ vertex -171.38864599171967 -74.25379985752278 -56.30000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -169.25329977597252 -75.48664256999727 -58.765685424949424
+ vertex -168.7634018274159 -75.7694852824719 -58.200000000000166
+ vertex -171.38864599171967 -74.25379985752278 -56.30000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -167.00163372613298 -76.7866425699973 -56.00000000000017
+ vertex -167.00163372613295 -76.7866425699972 -58.200000000000166
+ vertex -165.78919816083476 -77.48664256999727 -56.0000000000002
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -165.78919816083476 -77.48664256999727 -56.400000000000205
+ vertex -165.78919816083476 -77.48664256999727 -56.0000000000002
+ vertex -167.00163372613295 -76.7866425699972 -58.200000000000166
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -179.44268224691507 -69.60379985752294 -58.20000000000017
+ vertex -176.8174380826113 -71.1194852824722 -56.30000000000017
+ vertex -177.307336031168 -70.83664256999761 -55.73431457505093
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -171.38864599171967 -74.25379985752278 -56.30000000000017
+ vertex -177.307336031168 -70.83664256999761 -55.73431457505093
+ vertex -176.8174380826113 -71.1194852824722 -56.30000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -178.95278429835838 -69.88664256999755 -58.76568542494941
+ vertex -176.8174380826113 -71.1194852824722 -56.30000000000017
+ vertex -179.44268224691507 -69.60379985752294 -58.20000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -181.204450348198 -68.58664256999766 -58.200000000000195
+ vertex -178.95278429835838 -69.88664256999755 -58.76568542494941
+ vertex -179.44268224691507 -69.60379985752294 -58.20000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -177.04752841003258 -70.98664256999746 -60.80000000000018
+ vertex -178.95278429835838 -69.8866425699975 -60.80000000000017
+ vertex -177.04752841003258 -70.98664256999737 -62.20000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -179.51961410070365 -69.55938323102878 -60.8141104721642
+ vertex -177.04752841003258 -70.98664256999737 -62.20000000000018
+ vertex -178.95278429835838 -69.8866425699975 -60.80000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -179.6580401866841 -69.47946289302507 -61.20000000000017
+ vertex -177.04752841003258 -70.98664256999737 -62.20000000000018
+ vertex -179.51961410070365 -69.55938323102878 -60.8141104721642
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -179.87824428957083 -69.35232799494672 -61.53137084989864
+ vertex -177.04752841003258 -70.98664256999737 -62.20000000000018
+ vertex -179.6580401866841 -69.47946289302507 -61.20000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -180.16521986365657 -69.18664256999752 -61.78564064605528
+ vertex -177.04752841003258 -70.98664256999737 -62.20000000000018
+ vertex -179.87824428957083 -69.35232799494672 -61.53137084989864
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -180.49940999781688 -68.99369780607951 -61.945481322062676
+ vertex -177.04752841003258 -70.98664256999737 -62.20000000000018
+ vertex -180.16521986365657 -69.18664256999752 -61.78564064605528
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -180.85804018668415 -68.78664256999754 -62.00000000000017
+ vertex -177.04752841003258 -70.98664256999737 -62.20000000000018
+ vertex -180.49940999781688 -68.99369780607951 -61.945481322062676
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.6472706712255 -67.75362986810535 -62.10000000000018
+ vertex -177.04752841003258 -70.98664256999737 -62.20000000000018
+ vertex -180.85804018668415 -68.78664256999754 -62.00000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -177.39393857154636 -70.78664256999738 -62.20000000000018
+ vertex -177.04752841003258 -70.98664256999737 -62.20000000000018
+ vertex -182.6472706712255 -67.75362986810535 -62.10000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.5096431069213 -67.8330891794043 -62.30710678118673
+ vertex -177.39393857154636 -70.78664256999738 -62.20000000000018
+ vertex -182.6472706712255 -67.75362986810535 -62.10000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -177.39393857154636 -70.78664256999735 -62.60000000000018
+ vertex -177.39393857154636 -70.78664256999738 -62.20000000000018
+ vertex -182.5096431069213 -67.8330891794043 -62.30710678118673
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.3302833731177 -67.93664256999756 -62.46602540378461
+ vertex -177.39393857154636 -70.78664256999735 -62.60000000000018
+ vertex -182.5096431069213 -67.8330891794043 -62.30710678118673
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.1214145392675 -68.05723304744627 -62.56592582628924
+ vertex -177.39393857154636 -70.78664256999735 -62.60000000000018
+ vertex -182.3302833731177 -67.93664256999756 -62.46602540378461
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -181.8972706712255 -68.18664256999753 -62.60000000000018
+ vertex -177.39393857154636 -70.78664256999735 -62.60000000000018
+ vertex -182.1214145392675 -68.05723304744627 -62.56592582628924
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.4168859134963 -67.88664256999775 -56.00000000000017
+ vertex -182.4168859134963 -67.88664256999773 -56.40000000000017
+ vertex -181.20445034819804 -68.58664256999772 -56.0000000000002
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -181.204450348198 -68.58664256999766 -58.200000000000195
+ vertex -181.20445034819804 -68.58664256999772 -56.0000000000002
+ vertex -182.4168859134963 -67.88664256999773 -56.40000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.76329607501006 -67.68664256999776 -56.40000000000017
+ vertex -181.204450348198 -68.58664256999766 -58.200000000000195
+ vertex -182.4168859134963 -67.88664256999773 -56.40000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.05804018668422 -68.09382224697006 -59.600000000000186
+ vertex -181.204450348198 -68.58664256999766 -58.200000000000195
+ vertex -182.76329607501006 -67.68664256999776 -56.40000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.1964662726647 -68.01390190896635 -59.98588952783617
+ vertex -182.05804018668422 -68.09382224697006 -59.600000000000186
+ vertex -182.76329607501006 -67.68664256999776 -56.40000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.76329607500998 -67.68664256999759 -61.60000000000018
+ vertex -182.1964662726647 -68.01390190896635 -59.98588952783617
+ vertex -182.76329607501006 -67.68664256999776 -56.40000000000017
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -181.83783608379747 -68.22095714504837 -59.26862915010171
+ vertex -181.204450348198 -68.58664256999766 -58.200000000000195
+ vertex -182.05804018668422 -68.09382224697006 -59.600000000000186
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -181.55086050971178 -68.38664256999762 -59.014359353945075
+ vertex -181.204450348198 -68.58664256999766 -58.200000000000195
+ vertex -181.83783608379747 -68.22095714504837 -59.26862915010171
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -181.21667037555144 -68.57958733391561 -58.85451867793769
+ vertex -181.204450348198 -68.58664256999766 -58.200000000000195
+ vertex -181.55086050971178 -68.38664256999762 -59.014359353945075
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -180.8580401866842 -68.7866425699976 -58.800000000000175
+ vertex -181.204450348198 -68.58664256999766 -58.200000000000195
+ vertex -181.21667037555144 -68.57958733391561 -58.85451867793769
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -178.95278429835838 -69.88664256999755 -58.76568542494941
+ vertex -181.204450348198 -68.58664256999766 -58.200000000000195
+ vertex -180.8580401866842 -68.7866425699976 -58.800000000000175
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.2436808327393 -67.9866425699976 -60.400000000000205
+ vertex -182.1964662726647 -68.01390190896635 -59.98588952783617
+ vertex -182.76329607500998 -67.68664256999759 -61.60000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.19646627266468 -68.01390190896635 -60.81411047216424
+ vertex -182.2436808327393 -67.9866425699976 -60.400000000000205
+ vertex -182.76329607500998 -67.68664256999759 -61.60000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.0580401866842 -68.09382224697002 -61.2000000000002
+ vertex -182.19646627266468 -68.01390190896635 -60.81411047216424
+ vertex -182.76329607500998 -67.68664256999759 -61.60000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -181.8378360837974 -68.22095714504832 -61.53137084989868
+ vertex -182.0580401866842 -68.09382224697002 -61.2000000000002
+ vertex -182.76329607500998 -67.68664256999759 -61.60000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -181.55086050971173 -68.38664256999753 -61.78564064605529
+ vertex -181.8378360837974 -68.22095714504832 -61.53137084989868
+ vertex -182.76329607500998 -67.68664256999759 -61.60000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.73378697496332 -67.70367965685304 -61.85881904510269
+ vertex -181.55086050971173 -68.38664256999753 -61.78564064605529
+ vertex -182.76329607500998 -67.68664256999759 -61.60000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -181.21667037555136 -68.5795873339155 -61.94548132206272
+ vertex -181.55086050971173 -68.38664256999753 -61.78564064605529
+ vertex -182.73378697496332 -67.70367965685304 -61.85881904510269
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.6472706712255 -67.75362986810535 -62.10000000000018
+ vertex -181.21667037555136 -68.5795873339155 -61.94548132206272
+ vertex -182.73378697496332 -67.70367965685304 -61.85881904510269
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -180.85804018668415 -68.78664256999754 -62.00000000000017
+ vertex -181.21667037555136 -68.5795873339155 -61.94548132206272
+ vertex -182.6472706712255 -67.75362986810535 -62.10000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -180.8580401866842 -68.7866425699976 -58.800000000000175
+ vertex -180.49940999781697 -68.99369780607962 -58.85451867793765
+ vertex -178.95278429835838 -69.88664256999755 -58.76568542494941
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -180.16521986365666 -69.18664256999759 -59.01435935394506
+ vertex -178.95278429835838 -69.88664256999755 -58.76568542494941
+ vertex -180.49940999781697 -68.99369780607962 -58.85451867793765
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -179.87824428957092 -69.3523279949468 -59.26862915010168
+ vertex -178.95278429835838 -69.88664256999755 -58.76568542494941
+ vertex -180.16521986365666 -69.18664256999759 -59.01435935394506
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -179.65804018668416 -69.47946289302509 -59.60000000000015
+ vertex -178.95278429835838 -69.88664256999755 -58.76568542494941
+ vertex -179.87824428957092 -69.3523279949468 -59.26862915010168
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -178.95278429835838 -69.8866425699975 -60.80000000000017
+ vertex -178.95278429835838 -69.88664256999755 -58.76568542494941
+ vertex -179.65804018668416 -69.47946289302509 -59.60000000000015
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -179.51961410070365 -69.5593832310288 -59.985889527836115
+ vertex -178.95278429835838 -69.8866425699975 -60.80000000000017
+ vertex -179.65804018668416 -69.47946289302509 -59.60000000000015
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -179.47239954062903 -69.58664256999755 -60.40000000000015
+ vertex -178.95278429835838 -69.8866425699975 -60.80000000000017
+ vertex -179.51961410070365 -69.5593832310288 -59.985889527836115
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -179.51961410070365 -69.55938323102878 -60.8141104721642
+ vertex -178.95278429835838 -69.8866425699975 -60.80000000000017
+ vertex -179.47239954062903 -69.58664256999755 -60.40000000000015
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -171.3886459917198 -74.25379985752299 -48.90000000000018
+ vertex -168.76340182741606 -75.76948528247226 -47.00000000000018
+ vertex -169.25329977597272 -75.48664256999764 -46.43431457505094
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -167.00163372613315 -76.78664256999758 -47.00000000000017
+ vertex -169.25329977597272 -75.48664256999764 -46.43431457505094
+ vertex -168.76340182741606 -75.76948528247226 -47.00000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -170.89874804316315 -74.53664256999762 -49.46568542494941
+ vertex -168.76340182741606 -75.76948528247226 -47.00000000000018
+ vertex -171.3886459917198 -74.25379985752299 -48.90000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -181.20445034819818 -68.58664256999799 -47.00000000000015
+ vertex -182.41688591349637 -67.88664256999797 -48.800000000000125
+ vertex -181.20445034819815 -68.58664256999792 -49.200000000000145
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.41688591349637 -67.88664256999797 -49.200000000000124
+ vertex -181.20445034819815 -68.58664256999792 -49.200000000000145
+ vertex -182.41688591349637 -67.88664256999797 -48.800000000000125
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.6472706712258 -67.75362986810595 -43.10000000000016
+ vertex -182.73378697496364 -67.70367965685361 -43.341180954897645
+ vertex -180.8580401866845 -68.7866425699981 -43.20000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -181.21667037555173 -68.57958733391607 -43.254518677937675
+ vertex -180.8580401866845 -68.7866425699981 -43.20000000000018
+ vertex -182.73378697496364 -67.70367965685361 -43.341180954897645
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -181.55086050971207 -68.38664256999812 -43.414359353945095
+ vertex -181.21667037555173 -68.57958733391607 -43.254518677937675
+ vertex -182.73378697496364 -67.70367965685361 -43.341180954897645
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.76329607501026 -67.68664256999813 -43.60000000000016
+ vertex -181.55086050971207 -68.38664256999812 -43.414359353945095
+ vertex -182.73378697496364 -67.70367965685361 -43.341180954897645
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -181.83783608379778 -68.22095714504887 -43.66862915010171
+ vertex -181.55086050971207 -68.38664256999812 -43.414359353945095
+ vertex -182.76329607501026 -67.68664256999813 -43.60000000000016
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.05804018668448 -68.09382224697055 -44.0000000000002
+ vertex -181.83783608379778 -68.22095714504887 -43.66862915010171
+ vertex -182.76329607501026 -67.68664256999813 -43.60000000000016
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.196466272665 -68.01390190896684 -44.38588952783617
+ vertex -182.05804018668448 -68.09382224697055 -44.0000000000002
+ vertex -182.76329607501026 -67.68664256999813 -43.60000000000016
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.76329607501015 -67.68664256999799 -48.800000000000125
+ vertex -182.196466272665 -68.01390190896684 -44.38588952783617
+ vertex -182.76329607501026 -67.68664256999813 -43.60000000000016
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.24368083273959 -67.98664256999808 -44.8000000000002
+ vertex -182.196466272665 -68.01390190896684 -44.38588952783617
+ vertex -182.76329607501015 -67.68664256999799 -48.800000000000125
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.19646627266496 -68.01390190896683 -45.21411047216423
+ vertex -182.24368083273959 -67.98664256999808 -44.8000000000002
+ vertex -182.76329607501015 -67.68664256999799 -48.800000000000125
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.05804018668445 -68.09382224697053 -45.6000000000002
+ vertex -182.19646627266496 -68.01390190896683 -45.21411047216423
+ vertex -182.76329607501015 -67.68664256999799 -48.800000000000125
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -181.8378360837977 -68.2209571450488 -45.93137084989867
+ vertex -182.05804018668445 -68.09382224697053 -45.6000000000002
+ vertex -182.76329607501015 -67.68664256999799 -48.800000000000125
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -181.550860509712 -68.38664256999806 -46.185640646055305
+ vertex -181.8378360837977 -68.2209571450488 -45.93137084989867
+ vertex -182.76329607501015 -67.68664256999799 -48.800000000000125
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -181.21667037555162 -68.57958733391597 -46.3454813220627
+ vertex -181.550860509712 -68.38664256999806 -46.185640646055305
+ vertex -182.76329607501015 -67.68664256999799 -48.800000000000125
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -180.85804018668438 -68.78664256999798 -46.4000000000002
+ vertex -181.21667037555162 -68.57958733391597 -46.3454813220627
+ vertex -182.76329607501015 -67.68664256999799 -48.800000000000125
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -181.20445034819818 -68.58664256999799 -47.00000000000015
+ vertex -180.85804018668438 -68.78664256999798 -46.4000000000002
+ vertex -182.76329607501015 -67.68664256999799 -48.800000000000125
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -178.9527842983586 -69.88664256999792 -46.43431457505091
+ vertex -180.85804018668438 -68.78664256999798 -46.4000000000002
+ vertex -181.20445034819818 -68.58664256999799 -47.00000000000015
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.9750497701033076e-16
+ outer loop
+ vertex -182.41688591349637 -67.88664256999797 -48.800000000000125
+ vertex -181.20445034819818 -68.58664256999799 -47.00000000000015
+ vertex -182.76329607501015 -67.68664256999799 -48.800000000000125
+ endloop
+endfacet
+facet normal -1.7149041329274714e-14 -3.158301486324295e-14 1.0
+ outer loop
+ vertex -181.89727067122584 -68.18664256999816 -42.60000000000016
+ vertex -177.39393857154667 -70.78664256999807 -42.600000000000165
+ vertex -31.897270671226583 191.62097856533254 -42.600000000000065
+ endloop
+endfacet
+facet normal -1.7149041329274714e-14 -3.158301486324295e-14 1.0
+ outer loop
+ vertex -27.393938571547345 189.02097856533265 -42.60000000000007
+ vertex -31.897270671226583 191.62097856533254 -42.600000000000065
+ vertex -177.39393857154667 -70.78664256999807 -42.600000000000165
+ endloop
+endfacet
+facet normal -0.11303899832185417 0.06526309610999999 0.9914448613738078
+ outer loop
+ vertex -182.12141453926785 -68.05723304744691 -42.6340741737111
+ vertex -181.89727067122584 -68.18664256999816 -42.60000000000016
+ vertex -32.12141453926859 191.75038808788375 -42.63407417371101
+ endloop
+endfacet
+facet normal -0.11303899832185417 0.06526309610999999 0.9914448613738078
+ outer loop
+ vertex -31.897270671226583 191.62097856533254 -42.600000000000065
+ vertex -32.12141453926859 191.75038808788375 -42.63407417371101
+ vertex -181.89727067122584 -68.18664256999816 -42.60000000000016
+ endloop
+endfacet
+facet normal -1.4032362957362874e-14 -3.338242996024358e-14 1.0
+ outer loop
+ vertex -176.81743808261146 -71.11948528247241 -48.900000000000155
+ vertex -171.3886459917198 -74.25379985752299 -48.90000000000018
+ vertex -26.81743808261221 188.68813585285818 -48.90000000000006
+ endloop
+endfacet
+facet normal -1.4032362957362874e-14 -3.338242996024358e-14 1.0
+ outer loop
+ vertex -21.38864599172057 185.5538212778076 -48.900000000000105
+ vertex -26.81743808261221 188.68813585285818 -48.90000000000006
+ vertex -171.3886459917198 -74.25379985752299 -48.90000000000018
+ endloop
+endfacet
+facet normal -0.33141357403561217 0.19134171618249274 0.9238795325112902
+ outer loop
+ vertex -182.33028337311805 -67.93664256999818 -42.733974596215724
+ vertex -182.12141453926785 -68.05723304744691 -42.6340741737111
+ vertex -32.33028337311875 191.87097856533256 -42.73397459621563
+ endloop
+endfacet
+facet normal -0.33141357403561217 0.19134171618249274 0.9238795325112902
+ outer loop
+ vertex -32.12141453926859 191.75038808788375 -42.63407417371101
+ vertex -32.33028337311875 191.87097856533256 -42.73397459621563
+ vertex -182.12141453926785 -68.05723304744691 -42.6340741737111
+ endloop
+endfacet
+facet normal -0.5272028623656807 0.30438071450430654 0.7933533402912483
+ outer loop
+ vertex -182.5096431069216 -67.8330891794049 -42.892893218813605
+ vertex -182.33028337311805 -67.93664256999818 -42.733974596215724
+ vertex -32.509643106922326 191.9745319559258 -42.89289321881352
+ endloop
+endfacet
+facet normal -0.5272028623656807 0.30438071450430654 0.7933533402912483
+ outer loop
+ vertex -32.33028337311875 191.87097856533256 -42.73397459621563
+ vertex -32.509643106922326 191.9745319559258 -42.89289321881352
+ vertex -182.33028337311805 -67.93664256999818 -42.733974596215724
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -7.797766215937039e-16
+ outer loop
+ vertex -181.20445034819818 -68.58664256999799 -47.00000000000015
+ vertex -181.20445034819815 -68.58664256999792 -49.200000000000145
+ vertex -31.204450348198904 191.2209785653327 -47.00000000000007
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -7.797766215937039e-16
+ outer loop
+ vertex -31.204450348198883 191.22097856533276 -49.20000000000007
+ vertex -31.204450348198904 191.2209785653327 -47.00000000000007
+ vertex -181.20445034819815 -68.58664256999792 -49.200000000000145
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -6.227439144697606e-15
+ outer loop
+ vertex -177.39393857154667 -70.78664256999807 -42.600000000000165
+ vertex -177.3939385715466 -70.78664256999802 -43.00000000000016
+ vertex -27.393938571547345 189.02097856533265 -42.60000000000007
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -6.227439144697606e-15
+ outer loop
+ vertex -27.393938571547366 189.02097856533257 -43.00000000000007
+ vertex -27.393938571547345 189.02097856533265 -42.60000000000007
+ vertex -177.3939385715466 -70.78664256999802 -43.00000000000016
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -9.400019899202893e-16
+ outer loop
+ vertex -178.95278429835867 -69.88664256999802 -44.40000000000017
+ vertex -178.9527842983586 -69.88664256999792 -46.43431457505091
+ vertex -28.952784298359386 189.92097856533263 -44.40000000000007
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -9.400019899202893e-16
+ outer loop
+ vertex -28.952784298359365 189.92097856533272 -46.434314575050806
+ vertex -28.952784298359386 189.92097856533263 -44.40000000000007
+ vertex -178.9527842983586 -69.88664256999792 -46.43431457505091
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 9.400019899202893e-16
+ outer loop
+ vertex -169.25329977597278 -75.48664256999771 -44.40000000000018
+ vertex -19.253299775973456 184.32097856533298 -44.40000000000009
+ vertex -169.25329977597272 -75.48664256999764 -46.43431457505094
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 9.400019899202893e-16
+ outer loop
+ vertex -19.253299775973435 184.32097856533298 -46.434314575050855
+ vertex -169.25329977597272 -75.48664256999764 -46.43431457505094
+ vertex -19.253299775973456 184.32097856533298 -44.40000000000009
+ endloop
+endfacet
+facet normal 1.7149041329274714e-14 3.158301486324295e-14 -1.0
+ outer loop
+ vertex -181.20445034819818 -68.58664256999799 -47.00000000000015
+ vertex -31.204450348198904 191.2209785653327 -47.00000000000007
+ vertex -179.44268224691524 -69.60379985752333 -47.00000000000017
+ endloop
+endfacet
+facet normal 1.7149041329274714e-14 3.158301486324295e-14 -1.0
+ outer loop
+ vertex -29.442682246915975 190.20382127780732 -47.00000000000008
+ vertex -179.44268224691524 -69.60379985752333 -47.00000000000017
+ vertex -31.204450348198904 191.2209785653327 -47.00000000000007
+ endloop
+endfacet
+facet normal 1.7149041329274714e-14 3.158301486324295e-14 -1.0
+ outer loop
+ vertex -178.95278429835867 -69.88664256999802 -44.40000000000017
+ vertex -28.952784298359386 189.92097856533263 -44.40000000000007
+ vertex -177.04752841003287 -70.98664256999795 -44.40000000000016
+ endloop
+endfacet
+facet normal 1.7149041329274714e-14 3.158301486324295e-14 -1.0
+ outer loop
+ vertex -27.047528410033582 188.82097856533272 -44.40000000000007
+ vertex -177.04752841003287 -70.98664256999795 -44.40000000000016
+ vertex -28.952784298359386 189.92097856533263 -44.40000000000007
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 9.400019899202893e-16
+ outer loop
+ vertex -170.81214550278483 -74.58664256999784 -42.60000000000017
+ vertex -20.812145502785523 185.2209785653329 -42.600000000000094
+ vertex -170.8121455027848 -74.58664256999782 -43.00000000000017
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 9.400019899202893e-16
+ outer loop
+ vertex -20.812145502785523 185.2209785653328 -43.00000000000009
+ vertex -170.8121455027848 -74.58664256999782 -43.00000000000017
+ vertex -20.812145502785523 185.2209785653329 -42.600000000000094
+ endloop
+endfacet
+facet normal -0.8001031451912931 0.46193976625560507 0.38268343236507835
+ outer loop
+ vertex -182.6472706712258 -67.75362986810595 -43.10000000000016
+ vertex -32.64727067122652 192.05399126722477 -43.100000000000065
+ vertex -182.73378697496364 -67.70367965685361 -43.341180954897645
+ endloop
+endfacet
+facet normal -0.8001031451912931 0.46193976625560507 0.38268343236507835
+ outer loop
+ vertex -32.73378697496435 192.10394147847708 -43.34118095489755
+ vertex -182.73378697496364 -67.70367965685361 -43.341180954897645
+ vertex -32.64727067122652 192.05399126722477 -43.100000000000065
+ endloop
+endfacet
+facet normal -0.6123724356957986 0.3535533905932744 -0.7071067811865439
+ outer loop
+ vertex -177.30733603116812 -70.83664256999782 -49.465685424949434
+ vertex -179.44268224691524 -69.60379985752333 -47.00000000000017
+ vertex -27.30733603116882 188.97097856533284 -49.46568542494934
+ endloop
+endfacet
+facet normal -0.6123724356957986 0.3535533905932744 -0.7071067811865439
+ outer loop
+ vertex -29.442682246915975 190.20382127780732 -47.00000000000008
+ vertex -27.30733603116882 188.97097856533284 -49.46568542494934
+ vertex -179.44268224691524 -69.60379985752333 -47.00000000000017
+ endloop
+endfacet
+facet normal 0.6123724356957958 -0.3535533905932728 0.7071067811865469
+ outer loop
+ vertex -178.9527842983586 -69.88664256999792 -46.43431457505091
+ vertex -176.81743808261146 -71.11948528247241 -48.900000000000155
+ vertex -28.952784298359365 189.92097856533272 -46.434314575050806
+ endloop
+endfacet
+facet normal 0.6123724356957958 -0.3535533905932728 0.7071067811865469
+ outer loop
+ vertex -26.81743808261221 188.68813585285818 -48.90000000000006
+ vertex -28.952784298359365 189.92097856533272 -46.434314575050806
+ vertex -176.81743808261146 -71.11948528247241 -48.900000000000155
+ endloop
+endfacet
+facet normal 1.7149041329274714e-14 3.158301486324295e-14 -1.0
+ outer loop
+ vertex -182.76329607501015 -67.68664256999799 -48.800000000000125
+ vertex -32.76329607501086 192.12097856533268 -48.80000000000003
+ vertex -182.41688591349637 -67.88664256999797 -48.800000000000125
+ endloop
+endfacet
+facet normal 1.7149041329274714e-14 3.158301486324295e-14 -1.0
+ outer loop
+ vertex -32.4168859134971 191.92097856533272 -48.80000000000003
+ vertex -182.41688591349637 -67.88664256999797 -48.800000000000125
+ vertex -32.76329607501086 192.12097856533268 -48.80000000000003
+ endloop
+endfacet
+facet normal -1.7149041329274714e-14 -3.158301486324295e-14 1.0
+ outer loop
+ vertex -171.15855566429858 -74.38664256999785 -43.00000000000017
+ vertex -170.8121455027848 -74.58664256999782 -43.00000000000017
+ vertex -21.158555664299303 185.4209785653328 -43.00000000000008
+ endloop
+endfacet
+facet normal -1.7149041329274714e-14 -3.158301486324295e-14 1.0
+ outer loop
+ vertex -20.812145502785523 185.2209785653328 -43.00000000000009
+ vertex -21.158555664299303 185.4209785653328 -43.00000000000008
+ vertex -170.8121455027848 -74.58664256999782 -43.00000000000017
+ endloop
+endfacet
+facet normal 3.1938264052333316e-15 3.964006195623638e-14 -1.0
+ outer loop
+ vertex -182.41688591349637 -67.88664256999797 -49.200000000000124
+ vertex -32.4168859134971 191.9209785653327 -49.20000000000003
+ vertex -181.20445034819815 -68.58664256999792 -49.200000000000145
+ endloop
+endfacet
+facet normal 3.1938264052333316e-15 3.964006195623638e-14 -1.0
+ outer loop
+ vertex -31.204450348198883 191.22097856533276 -49.20000000000007
+ vertex -181.20445034819815 -68.58664256999792 -49.200000000000145
+ vertex -32.4168859134971 191.9209785653327 -49.20000000000003
+ endloop
+endfacet
+facet normal -0.6123724356958149 0.35355339059323304 0.7071067811865502
+ outer loop
+ vertex -171.3886459917198 -74.25379985752299 -48.90000000000018
+ vertex -169.25329977597272 -75.48664256999764 -46.43431457505094
+ vertex -21.38864599172057 185.5538212778076 -48.900000000000105
+ endloop
+endfacet
+facet normal -0.6123724356958149 0.35355339059323304 0.7071067811865502
+ outer loop
+ vertex -19.253299775973435 184.32097856533298 -46.434314575050855
+ vertex -21.38864599172057 185.5538212778076 -48.900000000000105
+ vertex -169.25329977597272 -75.48664256999764 -46.43431457505094
+ endloop
+endfacet
+facet normal 0.11303899832181934 -0.06526309611006442 0.9914448613738074
+ outer loop
+ vertex -166.30881340310572 -77.18664256999767 -42.60000000000018
+ vertex -166.08466953506365 -77.31605209254894 -42.63407417371111
+ vertex -16.308813403106395 182.62097856533293 -42.60000000000009
+ endloop
+endfacet
+facet normal 0.11303899832181934 -0.06526309611006442 0.9914448613738074
+ outer loop
+ vertex -16.084669535064364 182.4915690427817 -42.63407417371102
+ vertex -16.308813403106395 182.62097856533293 -42.60000000000009
+ vertex -166.08466953506365 -77.31605209254894 -42.63407417371111
+ endloop
+endfacet
+facet normal 0.3314135740355757 -0.1913417161825591 0.9238795325112896
+ outer loop
+ vertex -166.08466953506365 -77.31605209254894 -42.63407417371111
+ vertex -165.87580070121342 -77.43664256999769 -42.73397459621574
+ vertex -16.084669535064364 182.4915690427817 -42.63407417371102
+ endloop
+endfacet
+facet normal 0.3314135740355757 -0.1913417161825591 0.9238795325112896
+ outer loop
+ vertex -15.875800701214178 182.370978565333 -42.73397459621565
+ vertex -16.084669535064364 182.4915690427817 -42.63407417371102
+ vertex -165.87580070121342 -77.43664256999769 -42.73397459621574
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 -2.4387889803801352e-15
+ outer loop
+ vertex -182.76329607501015 -67.68664256999799 -48.800000000000125
+ vertex -182.76329607501026 -67.68664256999813 -43.60000000000016
+ vertex -32.76329607501086 192.12097856533268 -48.80000000000003
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 -2.4387889803801352e-15
+ outer loop
+ vertex -32.76329607501097 192.1209785653325 -43.600000000000065
+ vertex -32.76329607501086 192.12097856533268 -48.80000000000003
+ vertex -182.76329607501026 -67.68664256999813 -43.60000000000016
+ endloop
+endfacet
+facet normal -1.7149041329274714e-14 -3.158301486324295e-14 1.0
+ outer loop
+ vertex -177.3939385715466 -70.78664256999802 -43.00000000000016
+ vertex -177.04752841003284 -70.98664256999803 -43.00000000000016
+ vertex -27.393938571547366 189.02097856533257 -43.00000000000007
+ endloop
+endfacet
+facet normal -1.7149041329274714e-14 -3.158301486324295e-14 1.0
+ outer loop
+ vertex -27.04752841003356 188.8209785653326 -43.00000000000007
+ vertex -27.393938571547366 189.02097856533257 -43.00000000000007
+ vertex -177.04752841003284 -70.98664256999803 -43.00000000000016
+ endloop
+endfacet
+facet normal -0.85861643640128 0.4957224306868709 0.1305261922200573
+ outer loop
+ vertex -182.76329607501026 -67.68664256999813 -43.60000000000016
+ vertex -182.73378697496364 -67.70367965685361 -43.341180954897645
+ vertex -32.76329607501097 192.1209785653325 -43.600000000000065
+ endloop
+endfacet
+facet normal -0.85861643640128 0.4957224306868709 0.1305261922200573
+ outer loop
+ vertex -32.73378697496435 192.10394147847708 -43.34118095489755
+ vertex -32.76329607501097 192.1209785653325 -43.600000000000065
+ vertex -182.73378697496364 -67.70367965685361 -43.341180954897645
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 9.400019899202893e-16
+ outer loop
+ vertex -171.15855566429855 -74.38664256999782 -44.40000000000017
+ vertex -171.15855566429858 -74.38664256999785 -43.00000000000017
+ vertex -21.15855566429926 185.4209785653329 -44.40000000000008
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 9.400019899202893e-16
+ outer loop
+ vertex -21.158555664299303 185.4209785653328 -43.00000000000008
+ vertex -21.15855566429926 185.4209785653329 -44.40000000000008
+ vertex -171.15855566429858 -74.38664256999785 -43.00000000000017
+ endloop
+endfacet
+facet normal 0.5272028623656503 -0.30438071450436227 0.7933533402912472
+ outer loop
+ vertex -165.87580070121342 -77.43664256999769 -42.73397459621574
+ vertex -165.69644096740984 -77.54019596059094 -42.892893218813626
+ vertex -15.875800701214178 182.370978565333 -42.73397459621565
+ endloop
+endfacet
+facet normal 0.5272028623656503 -0.30438071450436227 0.7933533402912472
+ outer loop
+ vertex -15.696440967410565 182.26742517473969 -42.89289321881353
+ vertex -15.875800701214178 182.370978565333 -42.73397459621565
+ vertex -165.69644096740984 -77.54019596059094 -42.892893218813626
+ endloop
+endfacet
+facet normal 0.687064146869451 -0.396676670145619 0.6087614290087188
+ outer loop
+ vertex -165.55881340310563 -77.61965527188991 -43.10000000000017
+ vertex -15.558813403106363 182.18796586344075 -43.1000000000001
+ vertex -165.69644096740984 -77.54019596059094 -42.892893218813626
+ endloop
+endfacet
+facet normal 0.687064146869451 -0.396676670145619 0.6087614290087188
+ outer loop
+ vertex -15.696440967410565 182.26742517473969 -42.89289321881353
+ vertex -165.69644096740984 -77.54019596059094 -42.892893218813626
+ vertex -15.558813403106363 182.18796586344075 -43.1000000000001
+ endloop
+endfacet
+facet normal -0.6870641468694724 0.39667667014558616 0.6087614290087162
+ outer loop
+ vertex -182.6472706712258 -67.75362986810595 -43.10000000000016
+ vertex -182.5096431069216 -67.8330891794049 -42.892893218813605
+ vertex -32.64727067122652 192.05399126722477 -43.100000000000065
+ endloop
+endfacet
+facet normal -0.6870641468694724 0.39667667014558616 0.6087614290087162
+ outer loop
+ vertex -32.509643106922326 191.9745319559258 -42.89289321881352
+ vertex -32.64727067122652 192.05399126722477 -43.100000000000065
+ vertex -182.5096431069216 -67.8330891794049 -42.892893218813605
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -4.1225237454890334e-14
+ outer loop
+ vertex -177.04752841003284 -70.98664256999803 -43.00000000000016
+ vertex -177.04752841003287 -70.98664256999795 -44.40000000000016
+ vertex -27.04752841003356 188.8209785653326 -43.00000000000007
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -4.1225237454890334e-14
+ outer loop
+ vertex -27.047528410033582 188.82097856533272 -44.40000000000007
+ vertex -27.04752841003356 188.8209785653326 -43.00000000000007
+ vertex -177.04752841003287 -70.98664256999795 -44.40000000000016
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 6.007129263248552e-15
+ outer loop
+ vertex -182.41688591349637 -67.88664256999797 -49.200000000000124
+ vertex -182.41688591349637 -67.88664256999797 -48.800000000000125
+ vertex -32.4168859134971 191.9209785653327 -49.20000000000003
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 6.007129263248552e-15
+ outer loop
+ vertex -32.4168859134971 191.92097856533272 -48.80000000000003
+ vertex -32.4168859134971 191.9209785653327 -49.20000000000003
+ vertex -182.41688591349637 -67.88664256999797 -48.800000000000125
+ endloop
+endfacet
+facet normal 1.7149041329274714e-14 3.158301486324295e-14 -1.0
+ outer loop
+ vertex -171.15855566429855 -74.38664256999782 -44.40000000000017
+ vertex -21.15855566429926 185.4209785653329 -44.40000000000008
+ vertex -169.25329977597278 -75.48664256999771 -44.40000000000018
+ endloop
+endfacet
+facet normal 1.7149041329274714e-14 3.158301486324295e-14 -1.0
+ outer loop
+ vertex -19.253299775973456 184.32097856533298 -44.40000000000009
+ vertex -169.25329977597278 -75.48664256999771 -44.40000000000018
+ vertex -21.15855566429926 185.4209785653329 -44.40000000000008
+ endloop
+endfacet
+facet normal -1.7149041329274714e-14 -3.158301486324295e-14 1.0
+ outer loop
+ vertex -170.81214550278483 -74.58664256999784 -42.60000000000017
+ vertex -166.30881340310572 -77.18664256999767 -42.60000000000018
+ vertex -20.812145502785523 185.2209785653329 -42.600000000000094
+ endloop
+endfacet
+facet normal -1.7149041329274714e-14 -3.158301486324295e-14 1.0
+ outer loop
+ vertex -16.308813403106395 182.62097856533293 -42.60000000000009
+ vertex -20.812145502785523 185.2209785653329 -42.600000000000094
+ vertex -166.30881340310572 -77.18664256999767 -42.60000000000018
+ endloop
+endfacet
+facet normal 0.11303899832184441 -0.06526309610999435 -0.9914448613738092
+ outer loop
+ vertex -167.70667407651422 -76.37958733391568 -43.25451867793767
+ vertex -17.70667407651493 183.42803380141493 -43.25451867793758
+ vertex -167.34804388764698 -76.58664256999771 -43.20000000000017
+ endloop
+endfacet
+facet normal 0.11303899832184441 -0.06526309610999435 -0.9914448613738092
+ outer loop
+ vertex -17.34804388764772 183.22097856533296 -43.20000000000008
+ vertex -167.34804388764698 -76.58664256999771 -43.20000000000017
+ vertex -17.70667407651493 183.42803380141493 -43.25451867793758
+ endloop
+endfacet
+facet normal 0.8586164364012806 -0.4957224306868712 0.1305261922200513
+ outer loop
+ vertex -176.44131062738361 -71.3366425699977 -52.60000000000017
+ vertex -176.36163605725767 -71.38264270450739 -53.29881142177697
+ vertex -26.44131062738434 188.47097856533296 -52.60000000000009
+ endloop
+endfacet
+facet normal 0.8586164364012806 -0.4957224306868712 0.1305261922200513
+ outer loop
+ vertex -26.36163605725843 188.42497843082322 -53.29881142177688
+ vertex -26.44131062738434 188.47097856533296 -52.60000000000009
+ vertex -176.36163605725767 -71.38264270450739 -53.29881142177697
+ endloop
+endfacet
+facet normal 0.52720286236568 -0.3043807145043062 -0.7933533402912488
+ outer loop
+ vertex -175.75644761354428 -71.73204841539585 -50.69081169079648
+ vertex -25.756447613545006 188.07557271993477 -50.690811690796394
+ vertex -175.27217633227463 -72.01164256999769 -50.2617314097822
+ endloop
+endfacet
+facet normal 0.52720286236568 -0.3043807145043062 -0.7933533402912488
+ outer loop
+ vertex -25.272176332275354 187.79597856533294 -50.26173140978212
+ vertex -175.27217633227463 -72.01164256999769 -50.2617314097822
+ vertex -25.756447613545006 188.07557271993477 -50.690811690796394
+ endloop
+endfacet
+facet normal 0.8001031451912727 -0.46193976625563826 0.38268343236508084
+ outer loop
+ vertex -176.12804203716556 -71.51750827488863 -53.95000000000018
+ vertex -26.12804203716631 188.29011286044204 -53.950000000000095
+ vertex -176.36163605725767 -71.38264270450739 -53.29881142177697
+ endloop
+endfacet
+facet normal 0.8001031451912727 -0.46193976625563826 0.38268343236508084
+ outer loop
+ vertex -26.36163605725843 188.42497843082322 -53.29881142177688
+ vertex -176.36163605725767 -71.38264270450739 -53.29881142177697
+ vertex -26.12804203716631 188.29011286044204 -53.950000000000095
+ endloop
+endfacet
+facet normal 0.8001031451912782 -0.46193976625563016 0.38268343236507885
+ outer loop
+ vertex -165.55881340310563 -77.61965527188991 -43.10000000000017
+ vertex -165.4722970993678 -77.66960548314219 -43.34118095489766
+ vertex -15.558813403106363 182.18796586344075 -43.1000000000001
+ endloop
+endfacet
+facet normal 0.8001031451912782 -0.46193976625563016 0.38268343236507885
+ outer loop
+ vertex -15.472297099368534 182.13801565218847 -43.34118095489759
+ vertex -15.558813403106363 182.18796586344075 -43.1000000000001
+ vertex -165.4722970993678 -77.66960548314219 -43.34118095489766
+ endloop
+endfacet
+facet normal 0.11303899832179293 -0.06526309611005199 0.9914448613738114
+ outer loop
+ vertex -174.70823048087897 -72.33723685910915 -55.20799973098066
+ vertex -174.10304203716552 -72.68664256999753 -55.30000000000017
+ vertex -24.708230480879674 187.47038427622155 -55.20799973098057
+ endloop
+endfacet
+facet normal 0.11303899832179293 -0.06526309611005199 0.9914448613738114
+ outer loop
+ vertex -24.103042037166208 187.1209785653331 -55.30000000000008
+ vertex -24.708230480879674 187.47038427622155 -55.20799973098057
+ vertex -174.10304203716552 -72.68664256999753 -55.30000000000017
+ endloop
+endfacet
+facet normal -0.52720286236568 0.3043807145043062 0.7933533402912488
+ outer loop
+ vertex -172.9339077420565 -73.3616425699975 -54.93826859021815
+ vertex -172.44963646078688 -73.64123672459934 -54.509188309203864
+ vertex -22.93390774205722 186.4459785653332 -54.93826859021808
+ endloop
+endfacet
+facet normal -0.52720286236568 0.3043807145043062 0.7933533402912488
+ outer loop
+ vertex -22.449636460787566 186.16638441073135 -54.50918830920379
+ vertex -22.93390774205722 186.4459785653332 -54.93826859021808
+ vertex -172.44963646078688 -73.64123672459934 -54.509188309203864
+ endloop
+endfacet
+facet normal 0.8001031451912971 -0.461939766255596 -0.3826834323650809
+ outer loop
+ vertex -176.12804203716564 -71.51750827488873 -51.25000000000016
+ vertex -176.36163605725767 -71.38264270450745 -51.901188578223376
+ vertex -26.128042037166377 188.29011286044195 -51.25000000000008
+ endloop
+endfacet
+facet normal 0.8001031451912971 -0.461939766255596 -0.3826834323650809
+ outer loop
+ vertex -26.36163605725845 188.42497843082322 -51.901188578223284
+ vertex -26.128042037166377 188.29011286044195 -51.25000000000008
+ vertex -176.36163605725767 -71.38264270450745 -51.901188578223376
+ endloop
+endfacet
+facet normal 0.3314135740355923 -0.19134171618256868 0.9238795325112817
+ outer loop
+ vertex -175.27217633227454 -72.01164256999756 -54.93826859021815
+ vertex -174.70823048087897 -72.33723685910915 -55.20799973098066
+ vertex -25.272176332275286 187.79597856533303 -54.93826859021806
+ endloop
+endfacet
+facet normal 0.3314135740355923 -0.19134171618256868 0.9238795325112817
+ outer loop
+ vertex -24.708230480879674 187.47038427622155 -55.20799973098057
+ vertex -25.272176332275286 187.79597856533303 -54.93826859021806
+ vertex -174.70823048087897 -72.33723685910915 -55.20799973098066
+ endloop
+endfacet
+facet normal -0.11303899832179376 0.06526309611005106 -0.9914448613738113
+ outer loop
+ vertex -174.1030420371656 -72.6866425699977 -49.90000000000019
+ vertex -24.103042037166343 187.12097856533296 -49.90000000000009
+ vertex -173.49785359345213 -73.03604828088608 -49.9920002690197
+ endloop
+endfacet
+facet normal -0.11303899832179376 0.06526309611005106 -0.9914448613738113
+ outer loop
+ vertex -23.4978535934529 186.77157285444457 -49.9920002690196
+ vertex -173.49785359345213 -73.03604828088608 -49.9920002690197
+ vertex -24.103042037166343 187.12097856533296 -49.90000000000009
+ endloop
+endfacet
+facet normal -0.8001031451912727 0.46193976625563826 -0.38268343236508084
+ outer loop
+ vertex -172.07804203716555 -73.8557768651066 -51.25000000000016
+ vertex -22.078042037166306 185.95184427022406 -51.25000000000008
+ vertex -171.84444801707346 -73.99064243548779 -51.901188578223376
+ endloop
+endfacet
+facet normal -0.8001031451912727 0.46193976625563826 -0.38268343236508084
+ outer loop
+ vertex -21.84444801707419 185.81697869984285 -51.90118857822331
+ vertex -171.84444801707346 -73.99064243548779 -51.901188578223376
+ vertex -22.078042037166306 185.95184427022406 -51.25000000000008
+ endloop
+endfacet
+facet normal -0.33141357403562627 0.19134171618250656 0.9238795325112824
+ outer loop
+ vertex -173.49785359345208 -73.03604828088592 -55.20799973098066
+ vertex -172.9339077420565 -73.3616425699975 -54.93826859021815
+ vertex -23.497853593452785 186.77157285444477 -55.20799973098057
+ endloop
+endfacet
+facet normal -0.33141357403562627 0.19134171618250656 0.9238795325112824
+ outer loop
+ vertex -22.93390774205722 186.4459785653332 -54.93826859021808
+ vertex -23.497853593452785 186.77157285444477 -55.20799973098057
+ vertex -172.9339077420565 -73.3616425699975 -54.93826859021815
+ endloop
+endfacet
+facet normal 0.6870641468694538 -0.39667667014561503 0.6087614290087181
+ outer loop
+ vertex -176.12804203716556 -71.51750827488863 -53.95000000000018
+ vertex -175.75644761354422 -71.73204841539575 -54.509188309203864
+ vertex -26.12804203716631 188.29011286044204 -53.950000000000095
+ endloop
+endfacet
+facet normal 0.6870641468694538 -0.39667667014561503 0.6087614290087181
+ outer loop
+ vertex -25.756447613544914 188.0755727199349 -54.50918830920377
+ vertex -26.12804203716631 188.29011286044204 -53.950000000000095
+ vertex -175.75644761354422 -71.73204841539575 -54.509188309203864
+ endloop
+endfacet
+facet normal 0.8586164364012753 -0.4957224306868794 -0.13052619222005518
+ outer loop
+ vertex -176.44131062738361 -71.3366425699977 -52.60000000000017
+ vertex -26.44131062738434 188.47097856533296 -52.60000000000009
+ vertex -176.36163605725767 -71.38264270450745 -51.901188578223376
+ endloop
+endfacet
+facet normal 0.8586164364012753 -0.4957224306868794 -0.13052619222005518
+ outer loop
+ vertex -26.36163605725845 188.42497843082322 -51.901188578223284
+ vertex -176.36163605725767 -71.38264270450745 -51.901188578223376
+ vertex -26.44131062738434 188.47097856533296 -52.60000000000009
+ endloop
+endfacet
+facet normal -0.8001031451912881 0.4619397662556022 0.38268343236509217
+ outer loop
+ vertex -172.07804203716555 -73.85577686510648 -53.95000000000018
+ vertex -171.8444480170734 -73.99064243548774 -53.298811421776996
+ vertex -22.078042037166238 185.95184427022414 -53.95000000000012
+ endloop
+endfacet
+facet normal -0.8001031451912881 0.4619397662556022 0.38268343236509217
+ outer loop
+ vertex -21.844448017074168 185.81697869984293 -53.298811421776925
+ vertex -22.078042037166238 185.95184427022414 -53.95000000000012
+ vertex -171.8444480170734 -73.99064243548774 -53.298811421776996
+ endloop
+endfacet
+facet normal -0.11303899832176341 0.06526309611003213 -0.9914448613738159
+ outer loop
+ vertex -167.34804388764698 -76.58664256999771 -43.20000000000017
+ vertex -17.34804388764772 183.22097856533296 -43.20000000000008
+ vertex -166.98941369877977 -76.7936978060797 -43.25451867793765
+ endloop
+endfacet
+facet normal -0.11303899832176341 0.06526309611003213 -0.9914448613738159
+ outer loop
+ vertex -16.989413698780513 183.01392332925096 -43.254518677937554
+ vertex -166.98941369877977 -76.7936978060797 -43.25451867793765
+ vertex -17.34804388764772 183.22097856533296 -43.20000000000008
+ endloop
+endfacet
+facet normal -0.6870641468694506 0.39667667014561886 -0.6087614290087194
+ outer loop
+ vertex -172.07804203716555 -73.8557768651066 -51.25000000000016
+ vertex -172.4496364607869 -73.64123672459945 -50.69081169079649
+ vertex -22.078042037166306 185.95184427022406 -51.25000000000008
+ endloop
+endfacet
+facet normal -0.6870641468694506 0.39667667014561886 -0.6087614290087194
+ outer loop
+ vertex -22.449636460787655 186.16638441073113 -50.690811690796394
+ vertex -22.078042037166306 185.95184427022406 -51.25000000000008
+ vertex -172.4496364607869 -73.64123672459945 -50.69081169079649
+ endloop
+endfacet
+facet normal 0.527202862365652 -0.30438071450435766 0.7933533402912477
+ outer loop
+ vertex -175.75644761354422 -71.73204841539575 -54.509188309203864
+ vertex -175.27217633227454 -72.01164256999756 -54.93826859021815
+ vertex -25.756447613544914 188.0755727199349 -54.50918830920377
+ endloop
+endfacet
+facet normal 0.527202862365652 -0.30438071450435766 0.7933533402912477
+ outer loop
+ vertex -25.272176332275286 187.79597856533303 -54.93826859021806
+ vertex -25.756447613544914 188.0755727199349 -54.50918830920377
+ vertex -175.27217633227454 -72.01164256999756 -54.93826859021815
+ endloop
+endfacet
+facet normal 0.11303899832182902 -0.06526309610998687 -0.9914448613738115
+ outer loop
+ vertex -174.70823048087905 -72.33723685910932 -49.99200026901969
+ vertex -24.708230480879788 187.47038427622132 -49.99200026901961
+ vertex -174.1030420371656 -72.6866425699977 -49.90000000000019
+ endloop
+endfacet
+facet normal 0.11303899832182902 -0.06526309610998687 -0.9914448613738115
+ outer loop
+ vertex -24.103042037166343 187.12097856533296 -49.90000000000009
+ vertex -174.1030420371656 -72.6866425699977 -49.90000000000019
+ vertex -24.708230480879788 187.47038427622132 -49.99200026901961
+ endloop
+endfacet
+facet normal -0.6870641468694684 0.39667667014558383 0.6087614290087221
+ outer loop
+ vertex -172.44963646078688 -73.64123672459934 -54.509188309203864
+ vertex -172.07804203716555 -73.85577686510648 -53.95000000000018
+ vertex -22.449636460787566 186.16638441073135 -54.50918830920379
+ endloop
+endfacet
+facet normal -0.6870641468694684 0.39667667014558383 0.6087614290087221
+ outer loop
+ vertex -22.078042037166238 185.95184427022414 -53.95000000000012
+ vertex -22.449636460787566 186.16638441073135 -54.50918830920379
+ vertex -172.07804203716555 -73.85577686510648 -53.95000000000018
+ endloop
+endfacet
+facet normal -0.8586164364012806 0.4957224306868712 0.13052619222005102
+ outer loop
+ vertex -171.76477344694757 -74.03664256999754 -52.60000000000017
+ vertex -21.764773446948276 185.77097856533308 -52.60000000000011
+ vertex -171.8444480170734 -73.99064243548774 -53.298811421776996
+ endloop
+endfacet
+facet normal -0.8586164364012806 0.4957224306868712 0.13052619222005102
+ outer loop
+ vertex -21.844448017074168 185.81697869984293 -53.298811421776925
+ vertex -171.8444480170734 -73.99064243548774 -53.298811421776996
+ vertex -21.764773446948276 185.77097856533308 -52.60000000000011
+ endloop
+endfacet
+facet normal -0.11303899832182902 0.06526309610998687 0.9914448613738115
+ outer loop
+ vertex -174.10304203716552 -72.68664256999753 -55.30000000000017
+ vertex -173.49785359345208 -73.03604828088592 -55.20799973098066
+ vertex -24.103042037166208 187.1209785653331 -55.30000000000008
+ endloop
+endfacet
+facet normal -0.11303899832182902 0.06526309610998687 0.9914448613738115
+ outer loop
+ vertex -23.497853593452785 186.77157285444477 -55.20799973098057
+ vertex -24.103042037166208 187.1209785653331 -55.30000000000008
+ vertex -173.49785359345208 -73.03604828088592 -55.20799973098066
+ endloop
+endfacet
+facet normal -0.33141357403559885 0.19134171618256962 -0.9238795325112792
+ outer loop
+ vertex -166.98941369877977 -76.7936978060797 -43.25451867793765
+ vertex -16.989413698780513 183.01392332925096 -43.254518677937554
+ vertex -166.65522356461943 -76.9866425699977 -43.414359353945066
+ endloop
+endfacet
+facet normal -0.33141357403559885 0.19134171618256962 -0.9238795325112792
+ outer loop
+ vertex -16.655223564620155 182.8209785653329 -43.414359353944974
+ vertex -166.65522356461943 -76.9866425699977 -43.414359353945066
+ vertex -16.989413698780513 183.01392332925096 -43.254518677937554
+ endloop
+endfacet
+facet normal 0.6870641468694717 -0.3966766701455802 -0.6087614290087209
+ outer loop
+ vertex -176.12804203716564 -71.51750827488873 -51.25000000000016
+ vertex -26.128042037166377 188.29011286044195 -51.25000000000008
+ vertex -175.75644761354428 -71.73204841539585 -50.69081169079648
+ endloop
+endfacet
+facet normal 0.6870641468694717 -0.3966766701455802 -0.6087614290087209
+ outer loop
+ vertex -25.756447613545006 188.07557271993477 -50.690811690796394
+ vertex -175.75644761354428 -71.73204841539585 -50.69081169079648
+ vertex -26.128042037166377 188.29011286044195 -51.25000000000008
+ endloop
+endfacet
+facet normal -0.5272028623656437 0.30438071450436416 -0.7933533402912507
+ outer loop
+ vertex -166.65522356461943 -76.9866425699977 -43.414359353945066
+ vertex -16.655223564620155 182.8209785653329 -43.414359353944974
+ vertex -166.3682479905337 -77.15232799494687 -43.66862915010168
+ endloop
+endfacet
+facet normal -0.5272028623656437 0.30438071450436416 -0.7933533402912507
+ outer loop
+ vertex -16.36824799053443 182.6552931403837 -43.66862915010159
+ vertex -166.3682479905337 -77.15232799494687 -43.66862915010168
+ vertex -16.655223564620155 182.8209785653329 -43.414359353944974
+ endloop
+endfacet
+facet normal 0.3314135740355925 -0.19134171618248988 -0.923879532511298
+ outer loop
+ vertex -168.04086421067456 -76.18664256999774 -43.41435935394507
+ vertex -18.040864210675263 183.62097856533293 -43.414359353944974
+ vertex -167.70667407651422 -76.37958733391568 -43.25451867793767
+ endloop
+endfacet
+facet normal 0.3314135740355925 -0.19134171618248988 -0.923879532511298
+ outer loop
+ vertex -17.70667407651493 183.42803380141493 -43.25451867793758
+ vertex -167.70667407651422 -76.37958733391568 -43.25451867793767
+ vertex -18.040864210675263 183.62097856533293 -43.414359353944974
+ endloop
+endfacet
+facet normal -0.527202862365652 0.30438071450435766 -0.7933533402912477
+ outer loop
+ vertex -172.93390774205662 -73.36164256999763 -50.2617314097822
+ vertex -22.933907742057333 186.44597856533304 -50.26173140978211
+ vertex -172.4496364607869 -73.64123672459945 -50.69081169079649
+ endloop
+endfacet
+facet normal -0.527202862365652 0.30438071450435766 -0.7933533402912477
+ outer loop
+ vertex -22.449636460787655 186.16638441073113 -50.690811690796394
+ vertex -172.4496364607869 -73.64123672459945 -50.69081169079649
+ vertex -22.933907742057333 186.44597856533304 -50.26173140978211
+ endloop
+endfacet
+facet normal -0.3314135740355923 0.19134171618256868 -0.9238795325112817
+ outer loop
+ vertex -173.49785359345213 -73.03604828088608 -49.9920002690197
+ vertex -23.4978535934529 186.77157285444457 -49.9920002690196
+ vertex -172.93390774205662 -73.36164256999763 -50.2617314097822
+ endloop
+endfacet
+facet normal -0.3314135740355923 0.19134171618256868 -0.9238795325112817
+ outer loop
+ vertex -22.933907742057333 186.44597856533304 -50.26173140978211
+ vertex -172.93390774205662 -73.36164256999763 -50.2617314097822
+ vertex -23.4978535934529 186.77157285444457 -49.9920002690196
+ endloop
+endfacet
+facet normal -0.8586164364012806 0.4957224306868712 -0.1305261922200513
+ outer loop
+ vertex -171.76477344694757 -74.03664256999754 -52.60000000000017
+ vertex -171.84444801707346 -73.99064243548779 -51.901188578223376
+ vertex -21.764773446948276 185.77097856533308 -52.60000000000011
+ endloop
+endfacet
+facet normal -0.8586164364012806 0.4957224306868712 -0.1305261922200513
+ outer loop
+ vertex -21.84444801707419 185.81697869984285 -51.90118857822331
+ vertex -21.764773446948276 185.77097856533308 -52.60000000000011
+ vertex -171.84444801707346 -73.99064243548779 -51.901188578223376
+ endloop
+endfacet
+facet normal 0.8586164364012802 -0.49572243068687094 0.13052619222005538
+ outer loop
+ vertex -165.44278799932118 -77.68664256999766 -43.60000000000017
+ vertex -15.442787999321872 182.12097856533305 -43.6000000000001
+ vertex -165.4722970993678 -77.66960548314219 -43.34118095489766
+ endloop
+endfacet
+facet normal 0.8586164364012802 -0.49572243068687094 0.13052619222005538
+ outer loop
+ vertex -15.472297099368534 182.13801565218847 -43.34118095489759
+ vertex -165.4722970993678 -77.66960548314219 -43.34118095489766
+ vertex -15.442787999321872 182.12097856533305 -43.6000000000001
+ endloop
+endfacet
+facet normal -0.6870641468694431 0.3966766701456088 -0.6087614290087343
+ outer loop
+ vertex -166.14804388764696 -77.2794628930252 -44.00000000000015
+ vertex -166.3682479905337 -77.15232799494687 -43.66862915010168
+ vertex -16.148043887647678 182.52815824230547 -44.00000000000006
+ endloop
+endfacet
+facet normal -0.6870641468694431 0.3966766701456088 -0.6087614290087343
+ outer loop
+ vertex -16.36824799053443 182.6552931403837 -43.66862915010159
+ vertex -16.148043887647678 182.52815824230547 -44.00000000000006
+ vertex -166.3682479905337 -77.15232799494687 -43.66862915010168
+ endloop
+endfacet
+facet normal 0.33141357403562205 -0.19134171618251256 -0.9238795325112827
+ outer loop
+ vertex -175.27217633227463 -72.01164256999769 -50.2617314097822
+ vertex -25.272176332275354 187.79597856533294 -50.26173140978212
+ vertex -174.70823048087905 -72.33723685910932 -49.99200026901969
+ endloop
+endfacet
+facet normal 0.33141357403562205 -0.19134171618251256 -0.9238795325112827
+ outer loop
+ vertex -24.708230480879788 187.47038427622132 -49.99200026901961
+ vertex -174.70823048087905 -72.33723685910932 -49.99200026901969
+ vertex -25.272176332275354 187.79597856533294 -50.26173140978212
+ endloop
+endfacet
+facet normal 0.33141357403559885 -0.19134171618256962 0.9238795325112792
+ outer loop
+ vertex -168.0408642106745 -76.18664256999763 -46.18564064605529
+ vertex -167.70667407651416 -76.37958733391561 -46.345481322062696
+ vertex -18.040864210675217 183.620978565333 -46.18564064605519
+ endloop
+endfacet
+facet normal 0.33141357403559885 -0.19134171618256962 0.9238795325112792
+ outer loop
+ vertex -17.706674076514883 183.42803380141498 -46.345481322062604
+ vertex -18.040864210675217 183.620978565333 -46.18564064605519
+ vertex -167.70667407651416 -76.37958733391561 -46.345481322062696
+ endloop
+endfacet
+facet normal -0.1130389983218446 0.06526309610999587 0.9914448613738092
+ outer loop
+ vertex -167.3480438876469 -76.5866425699976 -46.40000000000017
+ vertex -166.98941369877969 -76.79369780607962 -46.345481322062675
+ vertex -17.348043887647652 183.22097856533298 -46.40000000000008
+ endloop
+endfacet
+facet normal -0.1130389983218446 0.06526309610999587 0.9914448613738092
+ outer loop
+ vertex -16.9894136987804 183.013923329251 -46.34548132206258
+ vertex -17.348043887647652 183.22097856533298 -46.40000000000008
+ vertex -166.98941369877969 -76.79369780607962 -46.345481322062675
+ endloop
+endfacet
+facet normal -0.8586164364012766 0.49572243068688016 0.1305261922200438
+ outer loop
+ vertex -166.00961780166642 -77.3593832310289 -45.21411047216418
+ vertex -165.96240324159183 -77.38664256999762 -44.800000000000146
+ vertex -16.009617801667133 182.44823790430183 -45.214110472164094
+ endloop
+endfacet
+facet normal -0.8586164364012766 0.49572243068688016 0.1305261922200438
+ outer loop
+ vertex -15.962403241592522 182.4209785653331 -44.80000000000006
+ vertex -16.009617801667133 182.44823790430183 -45.214110472164094
+ vertex -165.96240324159183 -77.38664256999762 -44.800000000000146
+ endloop
+endfacet
+facet normal 0.8586164364012794 -0.4957224306868705 0.13052619222006182
+ outer loop
+ vertex -168.7336845337021 -75.7866425699977 -44.8000000000002
+ vertex -168.68646997362748 -75.81390190896644 -45.214110472164236
+ vertex -18.733684533702807 184.020978565333 -44.800000000000104
+ endloop
+endfacet
+facet normal 0.8586164364012794 -0.4957224306868705 0.13052619222006182
+ outer loop
+ vertex -18.68646997362817 183.99371922636428 -45.21411047216414
+ vertex -18.733684533702807 184.020978565333 -44.800000000000104
+ vertex -168.68646997362748 -75.81390190896644 -45.214110472164236
+ endloop
+endfacet
+facet normal 0.6870641468694701 -0.3966766701455793 -0.608761429008723
+ outer loop
+ vertex -168.32783978476027 -76.02095714504847 -43.668629150101715
+ vertex -168.54804388764703 -75.89382224697016 -44.000000000000185
+ vertex -18.327839784760986 183.78666399028216 -43.66862915010161
+ endloop
+endfacet
+facet normal 0.6870641468694701 -0.3966766701455793 -0.608761429008723
+ outer loop
+ vertex -18.548043887647765 183.91379888836047 -44.000000000000085
+ vertex -18.327839784760986 183.78666399028216 -43.66862915010161
+ vertex -168.54804388764703 -75.89382224697016 -44.000000000000185
+ endloop
+endfacet
+facet normal -0.8586164364012804 0.4957224306868824 0.13052619222001063
+ outer loop
+ vertex -166.0096178016662 -77.35938323102839 -60.814110472164195
+ vertex -165.96240324159157 -77.38664256999711 -60.40000000000016
+ vertex -16.009617801666863 182.44823790430226 -60.8141104721641
+ endloop
+endfacet
+facet normal -0.8586164364012804 0.4957224306868824 0.13052619222001063
+ outer loop
+ vertex -15.96240324159232 182.42097856533348 -60.40000000000007
+ vertex -16.009617801666863 182.44823790430226 -60.8141104721641
+ vertex -165.96240324159157 -77.38664256999711 -60.40000000000016
+ endloop
+endfacet
+facet normal -0.5272028623657167 0.3043807145043161 0.7933533402912207
+ outer loop
+ vertex -166.65522356461935 -76.98664256999758 -46.185640646055276
+ vertex -166.36824799053363 -77.15232799494682 -45.93137084989864
+ vertex -16.655223564620087 182.82097856533304 -46.18564064605519
+ endloop
+endfacet
+facet normal -0.5272028623657167 0.3043807145043161 0.7933533402912207
+ outer loop
+ vertex -16.36824799053434 182.65529314038386 -45.93137084989855
+ vertex -16.655223564620087 182.82097856533304 -46.18564064605519
+ vertex -166.36824799053363 -77.15232799494682 -45.93137084989864
+ endloop
+endfacet
+facet normal 0.11303899832176205 -0.06526309611003275 0.991444861373816
+ outer loop
+ vertex -167.70667407651416 -76.37958733391561 -46.345481322062696
+ vertex -167.3480438876469 -76.5866425699976 -46.40000000000017
+ vertex -17.706674076514883 183.42803380141498 -46.345481322062604
+ endloop
+endfacet
+facet normal 0.11303899832176205 -0.06526309611003275 0.991444861373816
+ outer loop
+ vertex -17.348043887647652 183.22097856533298 -46.40000000000008
+ vertex -17.706674076514883 183.42803380141498 -46.345481322062604
+ vertex -167.3480438876469 -76.5866425699976 -46.40000000000017
+ endloop
+endfacet
+facet normal -0.8586164364012794 0.4957224306868705 -0.13052619222006182
+ outer loop
+ vertex -166.00961780166648 -77.3593832310289 -44.38588952783612
+ vertex -16.009617801667133 182.4482379043018 -44.38588952783603
+ vertex -165.96240324159183 -77.38664256999762 -44.800000000000146
+ endloop
+endfacet
+facet normal -0.8586164364012794 0.4957224306868705 -0.13052619222006182
+ outer loop
+ vertex -15.962403241592522 182.4209785653331 -44.80000000000006
+ vertex -165.96240324159183 -77.38664256999762 -44.800000000000146
+ vertex -16.009617801667133 182.4482379043018 -44.38588952783603
+ endloop
+endfacet
+facet normal 0.3314135740355432 -0.1913417161825403 0.9238795325113052
+ outer loop
+ vertex -168.04086421067421 -76.18664256999713 -61.78564064605529
+ vertex -167.70667407651388 -76.37958733391513 -61.94548132206268
+ vertex -18.040864210674947 183.62097856533347 -61.7856406460552
+ endloop
+endfacet
+facet normal 0.3314135740355432 -0.1913417161825403 0.9238795325113052
+ outer loop
+ vertex -17.706674076514588 183.42803380141552 -61.94548132206259
+ vertex -18.040864210674947 183.62097856533347 -61.7856406460552
+ vertex -167.70667407651388 -76.37958733391513 -61.94548132206268
+ endloop
+endfacet
+facet normal -0.6870641468694701 0.3966766701455793 0.608761429008723
+ outer loop
+ vertex -166.14804388764693 -77.27946289302517 -45.60000000000017
+ vertex -16.14804388764763 182.52815824230547 -45.60000000000008
+ vertex -166.36824799053363 -77.15232799494682 -45.93137084989864
+ endloop
+endfacet
+facet normal -0.6870641468694701 0.3966766701455793 0.608761429008723
+ outer loop
+ vertex -16.36824799053434 182.65529314038386 -45.93137084989855
+ vertex -166.36824799053363 -77.15232799494682 -45.93137084989864
+ vertex -16.14804388764763 182.52815824230547 -45.60000000000008
+ endloop
+endfacet
+facet normal -0.6870641468694763 0.3966766701455884 0.6087614290087102
+ outer loop
+ vertex -166.14804388764665 -77.27946289302466 -61.20000000000016
+ vertex -16.14804388764743 182.52815824230598 -61.20000000000007
+ vertex -166.36824799053338 -77.15232799494633 -61.53137084989863
+ endloop
+endfacet
+facet normal -0.6870641468694763 0.3966766701455884 0.6087614290087102
+ outer loop
+ vertex -16.36824799053407 182.6552931403843 -61.531370849898536
+ vertex -166.36824799053338 -77.15232799494633 -61.53137084989863
+ vertex -16.14804388764743 182.52815824230598 -61.20000000000007
+ endloop
+endfacet
+facet normal 0.8586164364012794 -0.4957224306868705 0.13052619222006182
+ outer loop
+ vertex -168.73368453370182 -75.78664256999723 -60.40000000000018
+ vertex -168.68646997362723 -75.81390190896595 -60.81411047216422
+ vertex -18.73368453370258 184.0209785653334 -60.40000000000009
+ endloop
+endfacet
+facet normal 0.8586164364012794 -0.4957224306868705 0.13052619222006182
+ outer loop
+ vertex -18.6864699736279 183.99371922636468 -60.814110472164124
+ vertex -18.73368453370258 184.0209785653334 -60.40000000000009
+ vertex -168.68646997362723 -75.81390190896595 -60.81411047216422
+ endloop
+endfacet
+facet normal -0.33141357403563115 0.191341716182515 0.9238795325112789
+ outer loop
+ vertex -166.9894136987794 -76.7936978060791 -61.94548132206268
+ vertex -166.6552235646191 -76.98664256999713 -61.78564064605527
+ vertex -16.98941369878013 183.01392332925155 -61.94548132206259
+ endloop
+endfacet
+facet normal -0.33141357403563115 0.191341716182515 0.9238795325112789
+ outer loop
+ vertex -16.655223564619817 182.82097856533352 -61.78564064605518
+ vertex -16.98941369878013 183.01392332925155 -61.94548132206259
+ vertex -166.6552235646191 -76.98664256999713 -61.78564064605527
+ endloop
+endfacet
+facet normal -0.8001031451912816 0.4619397662555984 0.38268343236511065
+ outer loop
+ vertex -166.0096178016662 -77.35938323102839 -60.814110472164195
+ vertex -16.009617801666863 182.44823790430226 -60.8141104721641
+ vertex -166.14804388764665 -77.27946289302466 -61.20000000000016
+ endloop
+endfacet
+facet normal -0.8001031451912816 0.4619397662555984 0.38268343236511065
+ outer loop
+ vertex -16.14804388764743 182.52815824230598 -61.20000000000007
+ vertex -166.14804388764665 -77.27946289302466 -61.20000000000016
+ vertex -16.009617801666863 182.44823790430226 -60.8141104721641
+ endloop
+endfacet
+facet normal -0.3314135740355904 0.19134171618248866 0.923879532511299
+ outer loop
+ vertex -166.98941369877969 -76.79369780607962 -46.345481322062675
+ vertex -166.65522356461935 -76.98664256999758 -46.185640646055276
+ vertex -16.9894136987804 183.013923329251 -46.34548132206258
+ endloop
+endfacet
+facet normal -0.3314135740355904 0.19134171618248866 0.923879532511299
+ outer loop
+ vertex -16.655223564620087 182.82097856533304 -46.18564064605519
+ vertex -16.9894136987804 183.013923329251 -46.34548132206258
+ vertex -166.65522356461935 -76.98664256999758 -46.185640646055276
+ endloop
+endfacet
+facet normal 0.5272028623656437 -0.30438071450436416 0.7933533402912507
+ outer loop
+ vertex -168.32783978476022 -76.02095714504841 -45.93137084989868
+ vertex -168.0408642106745 -76.18664256999763 -46.18564064605529
+ vertex -18.327839784760965 183.78666399028225 -45.93137084989857
+ endloop
+endfacet
+facet normal 0.5272028623656437 -0.30438071450436416 0.7933533402912507
+ outer loop
+ vertex -18.040864210675217 183.620978565333 -46.18564064605519
+ vertex -18.327839784760965 183.78666399028225 -45.93137084989857
+ vertex -168.0408642106745 -76.18664256999763 -46.18564064605529
+ endloop
+endfacet
+facet normal -0.8586164364012794 0.4957224306868705 -0.13052619222006182
+ outer loop
+ vertex -166.0096178016662 -77.3593832310284 -59.98588952783613
+ vertex -16.00961780166693 182.44823790430226 -59.98588952783604
+ vertex -165.96240324159157 -77.38664256999711 -60.40000000000016
+ endloop
+endfacet
+facet normal -0.8586164364012794 0.4957224306868705 -0.13052619222006182
+ outer loop
+ vertex -15.96240324159232 182.42097856533348 -60.40000000000007
+ vertex -165.96240324159157 -77.38664256999711 -60.40000000000016
+ vertex -16.00961780166693 182.44823790430226 -59.98588952783604
+ endloop
+endfacet
+facet normal 0.527202862365657 -0.3043807145043606 0.7933533402912432
+ outer loop
+ vertex -168.32783978475996 -76.02095714504792 -61.53137084989868
+ vertex -168.04086421067421 -76.18664256999713 -61.78564064605529
+ vertex -18.32783978476067 183.7866639902828 -61.531370849898586
+ endloop
+endfacet
+facet normal 0.527202862365657 -0.3043807145043606 0.7933533402912432
+ outer loop
+ vertex -18.040864210674947 183.62097856533347 -61.7856406460552
+ vertex -18.32783978476067 183.7866639902828 -61.531370849898586
+ vertex -168.04086421067421 -76.18664256999713 -61.78564064605529
+ endloop
+endfacet
+facet normal 0.800103145191289 -0.46193976625562516 0.38268343236506275
+ outer loop
+ vertex -168.68646997362723 -75.81390190896595 -60.81411047216422
+ vertex -168.5480438876467 -75.89382224696963 -61.20000000000018
+ vertex -18.6864699736279 183.99371922636468 -60.814110472164124
+ endloop
+endfacet
+facet normal 0.800103145191289 -0.46193976625562516 0.38268343236506275
+ outer loop
+ vertex -18.54804388764747 183.91379888836101 -61.20000000000009
+ vertex -18.6864699736279 183.99371922636468 -60.814110472164124
+ vertex -168.5480438876467 -75.89382224696963 -61.20000000000018
+ endloop
+endfacet
+facet normal 0.8586164364012767 -0.4957224306868802 -0.13052619222004344
+ outer loop
+ vertex -168.7336845337021 -75.7866425699977 -44.8000000000002
+ vertex -18.733684533702807 184.020978565333 -44.800000000000104
+ vertex -168.68646997362748 -75.81390190896644 -44.38588952783615
+ endloop
+endfacet
+facet normal 0.8586164364012767 -0.4957224306868802 -0.13052619222004344
+ outer loop
+ vertex -18.686469973628217 183.99371922636428 -44.38588952783605
+ vertex -168.68646997362748 -75.81390190896644 -44.38588952783615
+ vertex -18.733684533702807 184.020978565333 -44.800000000000104
+ endloop
+endfacet
+facet normal 0.8001031451912766 -0.46193976625561795 0.3826834323650973
+ outer loop
+ vertex -168.68646997362748 -75.81390190896644 -45.214110472164236
+ vertex -168.54804388764697 -75.89382224697013 -45.60000000000021
+ vertex -18.68646997362817 183.99371922636428 -45.21411047216414
+ endloop
+endfacet
+facet normal 0.8001031451912766 -0.46193976625561795 0.3826834323650973
+ outer loop
+ vertex -18.548043887647673 183.9137988883606 -45.6000000000001
+ vertex -18.68646997362817 183.99371922636428 -45.21411047216414
+ vertex -168.54804388764697 -75.89382224697013 -45.60000000000021
+ endloop
+endfacet
+facet normal -0.8001031451913015 0.4619397662555986 0.3826834323650685
+ outer loop
+ vertex -166.00961780166642 -77.3593832310289 -45.21411047216418
+ vertex -16.009617801667133 182.44823790430183 -45.214110472164094
+ vertex -166.14804388764693 -77.27946289302517 -45.60000000000017
+ endloop
+endfacet
+facet normal -0.8001031451913015 0.4619397662555986 0.3826834323650685
+ outer loop
+ vertex -16.14804388764763 182.52815824230547 -45.60000000000008
+ vertex -166.14804388764693 -77.27946289302517 -45.60000000000017
+ vertex -16.009617801667133 182.44823790430183 -45.214110472164094
+ endloop
+endfacet
+facet normal 0.11303899832181018 -0.06526309611005914 0.9914448613738089
+ outer loop
+ vertex -167.70667407651388 -76.37958733391513 -61.94548132206268
+ vertex -167.34804388764667 -76.58664256999714 -62.00000000000018
+ vertex -17.706674076514588 183.42803380141552 -61.94548132206259
+ endloop
+endfacet
+facet normal 0.11303899832181018 -0.06526309611005914 0.9914448613738089
+ outer loop
+ vertex -17.34804388764736 183.22097856533352 -62.00000000000009
+ vertex -17.706674076514588 183.42803380141552 -61.94548132206259
+ vertex -167.34804388764667 -76.58664256999714 -62.00000000000018
+ endloop
+endfacet
+facet normal -0.1130389983218446 0.06526309610999587 0.9914448613738092
+ outer loop
+ vertex -167.34804388764667 -76.58664256999714 -62.00000000000018
+ vertex -166.9894136987794 -76.7936978060791 -61.94548132206268
+ vertex -17.34804388764736 183.22097856533352 -62.00000000000009
+ endloop
+endfacet
+facet normal -0.1130389983218446 0.06526309610999587 0.9914448613738092
+ outer loop
+ vertex -16.98941369878013 183.01392332925155 -61.94548132206259
+ vertex -17.34804388764736 183.22097856533352 -62.00000000000009
+ vertex -166.9894136987794 -76.7936978060791 -61.94548132206268
+ endloop
+endfacet
+facet normal 0.800103145191292 -0.4619397662556044 -0.3826834323650818
+ outer loop
+ vertex -168.54804388764703 -75.89382224697016 -44.000000000000185
+ vertex -168.68646997362748 -75.81390190896644 -44.38588952783615
+ vertex -18.548043887647765 183.91379888836047 -44.000000000000085
+ endloop
+endfacet
+facet normal 0.800103145191292 -0.4619397662556044 -0.3826834323650818
+ outer loop
+ vertex -18.686469973628217 183.99371922636428 -44.38588952783605
+ vertex -18.548043887647765 183.91379888836047 -44.000000000000085
+ vertex -168.68646997362748 -75.81390190896644 -44.38588952783615
+ endloop
+endfacet
+facet normal 0.5272028623657089 -0.30438071450432286 -0.7933533402912231
+ outer loop
+ vertex -168.32783978476027 -76.02095714504847 -43.668629150101715
+ vertex -18.327839784760986 183.78666399028216 -43.66862915010161
+ vertex -168.04086421067456 -76.18664256999774 -43.41435935394507
+ endloop
+endfacet
+facet normal 0.5272028623657089 -0.30438071450432286 -0.7933533402912231
+ outer loop
+ vertex -18.040864210675263 183.62097856533293 -43.414359353944974
+ vertex -168.04086421067456 -76.18664256999774 -43.41435935394507
+ vertex -18.327839784760986 183.78666399028216 -43.66862915010161
+ endloop
+endfacet
+facet normal -0.5272028623657145 0.3043807145043261 0.7933533402912182
+ outer loop
+ vertex -166.6552235646191 -76.98664256999713 -61.78564064605527
+ vertex -166.36824799053338 -77.15232799494633 -61.53137084989863
+ vertex -16.655223564619817 182.82097856533352 -61.78564064605518
+ endloop
+endfacet
+facet normal -0.5272028623657145 0.3043807145043261 0.7933533402912182
+ outer loop
+ vertex -16.36824799053407 182.6552931403843 -61.531370849898536
+ vertex -16.655223564619817 182.82097856533352 -61.78564064605518
+ vertex -166.36824799053338 -77.15232799494633 -61.53137084989863
+ endloop
+endfacet
+facet normal -0.8001031451912766 0.46193976625561795 -0.3826834323650973
+ outer loop
+ vertex -166.00961780166648 -77.3593832310289 -44.38588952783612
+ vertex -166.14804388764696 -77.2794628930252 -44.00000000000015
+ vertex -16.009617801667133 182.4482379043018 -44.38588952783603
+ endloop
+endfacet
+facet normal -0.8001031451912766 0.46193976625561795 -0.3826834323650973
+ outer loop
+ vertex -16.148043887647678 182.52815824230547 -44.00000000000006
+ vertex -16.009617801667133 182.4482379043018 -44.38588952783603
+ vertex -166.14804388764696 -77.2794628930252 -44.00000000000015
+ endloop
+endfacet
+facet normal -0.800103145191289 0.46193976625562516 -0.38268343236506275
+ outer loop
+ vertex -166.0096178016662 -77.3593832310284 -59.98588952783613
+ vertex -166.14804388764668 -77.2794628930247 -59.600000000000165
+ vertex -16.00961780166693 182.44823790430226 -59.98588952783604
+ endloop
+endfacet
+facet normal -0.800103145191289 0.46193976625562516 -0.38268343236506275
+ outer loop
+ vertex -16.14804388764743 182.52815824230586 -59.60000000000007
+ vertex -16.00961780166693 182.44823790430226 -59.98588952783604
+ vertex -166.14804388764668 -77.2794628930247 -59.600000000000165
+ endloop
+endfacet
+facet normal 0.6870641468694548 -0.3966766701456156 0.6087614290087167
+ outer loop
+ vertex -168.5480438876467 -75.89382224696963 -61.20000000000018
+ vertex -168.32783978475996 -76.02095714504792 -61.53137084989868
+ vertex -18.54804388764747 183.91379888836101 -61.20000000000009
+ endloop
+endfacet
+facet normal 0.6870641468694548 -0.3966766701456156 0.6087614290087167
+ outer loop
+ vertex -18.32783978476067 183.7866639902828 -61.531370849898586
+ vertex -18.54804388764747 183.91379888836101 -61.20000000000009
+ vertex -168.32783978475996 -76.02095714504792 -61.53137084989868
+ endloop
+endfacet
+facet normal 0.6870641468694431 -0.3966766701456088 0.6087614290087343
+ outer loop
+ vertex -168.54804388764697 -75.89382224697013 -45.60000000000021
+ vertex -168.32783978476022 -76.02095714504841 -45.93137084989868
+ vertex -18.548043887647673 183.9137988883606 -45.6000000000001
+ endloop
+endfacet
+facet normal 0.6870641468694431 -0.3966766701456088 0.6087614290087343
+ outer loop
+ vertex -18.327839784760965 183.78666399028225 -45.93137084989857
+ vertex -18.548043887647673 183.9137988883606 -45.6000000000001
+ vertex -168.32783978476022 -76.02095714504841 -45.93137084989868
+ endloop
+endfacet
+facet normal 0.8586164364012794 -0.4957224306868705 0.13052619222006182
+ outer loop
+ vertex -182.19646627266468 -68.01390190896635 -60.81411047216424
+ vertex -32.19646627266542 191.79371922636432 -60.814110472164145
+ vertex -182.2436808327393 -67.9866425699976 -60.400000000000205
+ endloop
+endfacet
+facet normal 0.8586164364012794 -0.4957224306868705 0.13052619222006182
+ outer loop
+ vertex -32.24368083274005 191.82097856533298 -60.40000000000011
+ vertex -182.2436808327393 -67.9866425699976 -60.400000000000205
+ vertex -32.19646627266542 191.79371922636432 -60.814110472164145
+ endloop
+endfacet
+facet normal -0.5272028623657089 0.30438071450432286 0.7933533402912231
+ outer loop
+ vertex -180.16521986365657 -69.18664256999752 -61.78564064605528
+ vertex -179.87824428957083 -69.35232799494672 -61.53137084989864
+ vertex -30.16521986365729 190.6209785653331 -61.785640646055185
+ endloop
+endfacet
+facet normal -0.5272028623657089 0.30438071450432286 0.7933533402912231
+ outer loop
+ vertex -29.878244289571587 190.4552931403839 -61.53137084989855
+ vertex -30.16521986365729 190.6209785653331 -61.785640646055185
+ vertex -179.87824428957083 -69.35232799494672 -61.53137084989864
+ endloop
+endfacet
+facet normal 0.33141357403563115 -0.191341716182515 -0.9238795325112789
+ outer loop
+ vertex -168.0408642106743 -76.18664256999723 -59.014359353945075
+ vertex -18.040864210674993 183.62097856533347 -59.01435935394498
+ vertex -167.70667407651396 -76.37958733391518 -58.854518677937655
+ endloop
+endfacet
+facet normal 0.33141357403563115 -0.191341716182515 -0.9238795325112789
+ outer loop
+ vertex -17.7066740765147 183.42803380141538 -58.85451867793757
+ vertex -167.70667407651396 -76.37958733391518 -58.854518677937655
+ vertex -18.040864210674993 183.62097856533347 -59.01435935394498
+ endloop
+endfacet
+facet normal -0.5272028623656507 0.3043807145043513 -0.7933533402912508
+ outer loop
+ vertex -180.16521986365666 -69.18664256999759 -59.01435935394506
+ vertex -30.165219863657356 190.62097856533308 -59.014359353944975
+ vertex -179.87824428957092 -69.3523279949468 -59.26862915010168
+ endloop
+endfacet
+facet normal -0.5272028623656507 0.3043807145043513 -0.7933533402912508
+ outer loop
+ vertex -29.87824428957163 190.45529314038384 -59.26862915010159
+ vertex -179.87824428957092 -69.3523279949468 -59.26862915010168
+ vertex -30.165219863657356 190.62097856533308 -59.014359353944975
+ endloop
+endfacet
+facet normal -0.5272028623656865 0.3043807145043776 -0.7933533402912171
+ outer loop
+ vertex -166.65522356461918 -76.98664256999719 -59.01435935394505
+ vertex -16.655223564619863 182.82097856533343 -59.01435935394496
+ vertex -166.36824799053343 -77.15232799494639 -59.26862915010169
+ endloop
+endfacet
+facet normal -0.5272028623656865 0.3043807145043776 -0.7933533402912171
+ outer loop
+ vertex -16.368247990534137 182.65529314038423 -59.2686291501016
+ vertex -166.36824799053343 -77.15232799494639 -59.26862915010169
+ vertex -16.655223564619863 182.82097856533343 -59.01435935394496
+ endloop
+endfacet
+facet normal 0.6870641468694763 -0.3966766701455884 -0.6087614290087102
+ outer loop
+ vertex -168.32783978476002 -76.02095714504797 -59.26862915010171
+ vertex -168.54804388764674 -75.89382224696966 -59.600000000000186
+ vertex -18.327839784760762 183.78666399028262 -59.268629150101624
+ endloop
+endfacet
+facet normal 0.6870641468694763 -0.3966766701455884 -0.6087614290087102
+ outer loop
+ vertex -18.54804388764747 183.91379888836096 -59.600000000000094
+ vertex -18.327839784760762 183.78666399028262 -59.268629150101624
+ vertex -168.54804388764674 -75.89382224696966 -59.600000000000186
+ endloop
+endfacet
+facet normal 0.33141357403559885 -0.19134171618256962 0.9238795325112792
+ outer loop
+ vertex -181.55086050971173 -68.38664256999753 -61.78564064605529
+ vertex -181.21667037555136 -68.5795873339155 -61.94548132206272
+ vertex -31.55086050971244 191.42097856533306 -61.785640646055185
+ endloop
+endfacet
+facet normal 0.33141357403559885 -0.19134171618256962 0.9238795325112792
+ outer loop
+ vertex -31.216670375552106 191.22803380141514 -61.945481322062605
+ vertex -31.55086050971244 191.42097856533306 -61.785640646055185
+ vertex -181.21667037555136 -68.5795873339155 -61.94548132206272
+ endloop
+endfacet
+facet normal 0.6870641468694431 -0.3966766701456088 0.6087614290087343
+ outer loop
+ vertex -182.0580401866842 -68.09382224697002 -61.2000000000002
+ vertex -181.8378360837974 -68.22095714504832 -61.53137084989868
+ vertex -32.05804018668492 191.71379888836057 -61.20000000000012
+ endloop
+endfacet
+facet normal 0.6870641468694431 -0.3966766701456088 0.6087614290087343
+ outer loop
+ vertex -31.83783608379814 191.58666399028237 -61.53137084989857
+ vertex -32.05804018668492 191.71379888836057 -61.20000000000012
+ vertex -181.8378360837974 -68.22095714504832 -61.53137084989868
+ endloop
+endfacet
+facet normal -0.3314135740355925 0.19134171618248988 0.923879532511298
+ outer loop
+ vertex -180.49940999781688 -68.99369780607951 -61.945481322062676
+ vertex -180.16521986365657 -69.18664256999752 -61.78564064605528
+ vertex -30.49940999781767 190.81392332925108 -61.945481322062584
+ endloop
+endfacet
+facet normal -0.3314135740355925 0.19134171618248988 0.923879532511298
+ outer loop
+ vertex -30.16521986365729 190.6209785653331 -61.785640646055185
+ vertex -30.49940999781767 190.81392332925108 -61.945481322062584
+ vertex -180.16521986365657 -69.18664256999752 -61.78564064605528
+ endloop
+endfacet
+facet normal -0.11303899832180349 0.06526309611005668 -0.9914448613738097
+ outer loop
+ vertex -167.34804388764675 -76.5866425699972 -58.80000000000016
+ vertex -17.34804388764747 183.2209785653335 -58.800000000000075
+ vertex -166.9894136987795 -76.79369780607921 -58.854518677937655
+ endloop
+endfacet
+facet normal -0.11303899832180349 0.06526309611005668 -0.9914448613738097
+ outer loop
+ vertex -16.98941369878022 183.0139233292514 -58.85451867793757
+ vertex -166.9894136987795 -76.79369780607921 -58.854518677937655
+ vertex -17.34804388764747 183.2209785653335 -58.800000000000075
+ endloop
+endfacet
+facet normal -0.6870641468694701 0.3966766701455793 0.608761429008723
+ outer loop
+ vertex -179.6580401866841 -69.47946289302507 -61.20000000000017
+ vertex -29.6580401866849 190.32815824230553 -61.20000000000008
+ vertex -179.87824428957083 -69.35232799494672 -61.53137084989864
+ endloop
+endfacet
+facet normal -0.6870641468694701 0.3966766701455793 0.608761429008723
+ outer loop
+ vertex -29.878244289571587 190.4552931403839 -61.53137084989855
+ vertex -179.87824428957083 -69.35232799494672 -61.53137084989864
+ vertex -29.6580401866849 190.32815824230553 -61.20000000000008
+ endloop
+endfacet
+facet normal -0.800103145191292 0.4619397662556044 0.3826834323650818
+ outer loop
+ vertex -179.51961410070365 -69.55938323102878 -60.8141104721642
+ vertex -29.519614100704356 190.24823790430187 -60.81411047216411
+ vertex -179.6580401866841 -69.47946289302507 -61.20000000000017
+ endloop
+endfacet
+facet normal -0.800103145191292 0.4619397662556044 0.3826834323650818
+ outer loop
+ vertex -29.6580401866849 190.32815824230553 -61.20000000000008
+ vertex -179.6580401866841 -69.47946289302507 -61.20000000000017
+ vertex -29.519614100704356 190.24823790430187 -60.81411047216411
+ endloop
+endfacet
+facet normal -0.8586164364012767 0.4957224306868802 0.13052619222004344
+ outer loop
+ vertex -179.51961410070365 -69.55938323102878 -60.8141104721642
+ vertex -179.47239954062903 -69.58664256999755 -60.40000000000015
+ vertex -29.519614100704356 190.24823790430187 -60.81411047216411
+ endloop
+endfacet
+facet normal -0.8586164364012767 0.4957224306868802 0.13052619222004344
+ outer loop
+ vertex -29.47239954062979 190.22097856533307 -60.400000000000055
+ vertex -29.519614100704356 190.24823790430187 -60.81411047216411
+ vertex -179.47239954062903 -69.58664256999755 -60.40000000000015
+ endloop
+endfacet
+facet normal -0.6870641468694375 0.3966766701456056 -0.6087614290087427
+ outer loop
+ vertex -166.14804388764668 -77.2794628930247 -59.600000000000165
+ vertex -166.36824799053343 -77.15232799494639 -59.26862915010169
+ vertex -16.14804388764743 182.52815824230586 -59.60000000000007
+ endloop
+endfacet
+facet normal -0.6870641468694375 0.3966766701456056 -0.6087614290087427
+ outer loop
+ vertex -16.368247990534137 182.65529314038423 -59.2686291501016
+ vertex -16.14804388764743 182.52815824230586 -59.60000000000007
+ vertex -166.36824799053343 -77.15232799494639 -59.26862915010169
+ endloop
+endfacet
+facet normal 0.8586164364012804 -0.4957224306868824 -0.13052619222001063
+ outer loop
+ vertex -168.68646997362725 -75.81390190896596 -59.98588952783615
+ vertex -168.73368453370182 -75.78664256999723 -60.40000000000018
+ vertex -18.686469973627926 183.99371922636473 -59.98588952783606
+ endloop
+endfacet
+facet normal 0.8586164364012804 -0.4957224306868824 -0.13052619222001063
+ outer loop
+ vertex -18.73368453370258 184.0209785653334 -60.40000000000009
+ vertex -18.686469973627926 183.99371922636473 -59.98588952783606
+ vertex -168.73368453370182 -75.78664256999723 -60.40000000000018
+ endloop
+endfacet
+facet normal 0.3314135740355904 -0.19134171618248866 -0.923879532511299
+ outer loop
+ vertex -181.55086050971178 -68.38664256999762 -59.014359353945075
+ vertex -31.55086050971253 191.42097856533306 -59.014359353944975
+ vertex -181.21667037555144 -68.57958733391561 -58.85451867793769
+ endloop
+endfacet
+facet normal 0.3314135740355904 -0.19134171618248866 -0.923879532511299
+ outer loop
+ vertex -31.216670375552173 191.22803380141505 -58.85451867793758
+ vertex -181.21667037555144 -68.57958733391561 -58.85451867793769
+ vertex -31.55086050971253 191.42097856533306 -59.014359353944975
+ endloop
+endfacet
+facet normal 0.6870641468694701 -0.3966766701455793 -0.608761429008723
+ outer loop
+ vertex -181.83783608379747 -68.22095714504837 -59.26862915010171
+ vertex -182.05804018668422 -68.09382224697006 -59.600000000000186
+ vertex -31.83783608379823 191.58666399028223 -59.26862915010161
+ endloop
+endfacet
+facet normal 0.6870641468694701 -0.3966766701455793 -0.608761429008723
+ outer loop
+ vertex -32.05804018668494 191.71379888836057 -59.600000000000094
+ vertex -31.83783608379823 191.58666399028223 -59.26862915010161
+ vertex -182.05804018668422 -68.09382224697006 -59.600000000000186
+ endloop
+endfacet
+facet normal -0.11303899832184441 0.06526309610999435 0.9914448613738092
+ outer loop
+ vertex -180.85804018668415 -68.78664256999754 -62.00000000000017
+ vertex -180.49940999781688 -68.99369780607951 -61.945481322062676
+ vertex -30.858040186684896 191.02097856533317 -62.00000000000008
+ endloop
+endfacet
+facet normal -0.11303899832184441 0.06526309610999435 0.9914448613738092
+ outer loop
+ vertex -30.49940999781767 190.81392332925108 -61.945481322062584
+ vertex -30.858040186684896 191.02097856533317 -62.00000000000008
+ vertex -180.49940999781688 -68.99369780607951 -61.945481322062676
+ endloop
+endfacet
+facet normal -0.6870641468694431 0.3966766701456088 -0.6087614290087343
+ outer loop
+ vertex -179.65804018668416 -69.47946289302509 -59.60000000000015
+ vertex -179.87824428957092 -69.3523279949468 -59.26862915010168
+ vertex -29.658040186684875 190.32815824230553 -59.60000000000006
+ endloop
+endfacet
+facet normal -0.6870641468694431 0.3966766701456088 -0.6087614290087343
+ outer loop
+ vertex -29.87824428957163 190.45529314038384 -59.26862915010159
+ vertex -29.658040186684875 190.32815824230553 -59.60000000000006
+ vertex -179.87824428957092 -69.3523279949468 -59.26862915010168
+ endloop
+endfacet
+facet normal 0.5272028623657167 -0.3043807145043161 -0.7933533402912207
+ outer loop
+ vertex -181.83783608379747 -68.22095714504837 -59.26862915010171
+ vertex -31.83783608379823 191.58666399028223 -59.26862915010161
+ vertex -181.55086050971178 -68.38664256999762 -59.014359353945075
+ endloop
+endfacet
+facet normal 0.5272028623657167 -0.3043807145043161 -0.7933533402912207
+ outer loop
+ vertex -31.55086050971253 191.42097856533306 -59.014359353944975
+ vertex -181.55086050971178 -68.38664256999762 -59.014359353945075
+ vertex -31.83783608379823 191.58666399028223 -59.26862915010161
+ endloop
+endfacet
+facet normal -0.33141357403555854 0.191341716182552 -0.9238795325112973
+ outer loop
+ vertex -166.9894136987795 -76.79369780607921 -58.854518677937655
+ vertex -16.98941369878022 183.0139233292514 -58.85451867793757
+ vertex -166.65522356461918 -76.98664256999719 -59.01435935394505
+ endloop
+endfacet
+facet normal -0.33141357403555854 0.191341716182552 -0.9238795325112973
+ outer loop
+ vertex -16.655223564619863 182.82097856533343 -59.01435935394496
+ vertex -166.65522356461918 -76.98664256999719 -59.01435935394505
+ vertex -16.98941369878022 183.0139233292514 -58.85451867793757
+ endloop
+endfacet
+facet normal 0.5272028623657145 -0.3043807145043261 -0.7933533402912182
+ outer loop
+ vertex -168.32783978476002 -76.02095714504797 -59.26862915010171
+ vertex -18.327839784760762 183.78666399028262 -59.268629150101624
+ vertex -168.0408642106743 -76.18664256999723 -59.014359353945075
+ endloop
+endfacet
+facet normal 0.5272028623657145 -0.3043807145043261 -0.7933533402912182
+ outer loop
+ vertex -18.040864210674993 183.62097856533347 -59.01435935394498
+ vertex -168.0408642106743 -76.18664256999723 -59.014359353945075
+ vertex -18.327839784760762 183.78666399028262 -59.268629150101624
+ endloop
+endfacet
+facet normal 0.8001031451912766 -0.46193976625561795 0.3826834323650973
+ outer loop
+ vertex -182.19646627266468 -68.01390190896635 -60.81411047216424
+ vertex -182.0580401866842 -68.09382224697002 -61.2000000000002
+ vertex -32.19646627266542 191.79371922636432 -60.814110472164145
+ endloop
+endfacet
+facet normal 0.8001031451912766 -0.46193976625561795 0.3826834323650973
+ outer loop
+ vertex -32.05804018668492 191.71379888836057 -61.20000000000012
+ vertex -32.19646627266542 191.79371922636432 -60.814110472164145
+ vertex -182.0580401866842 -68.09382224697002 -61.2000000000002
+ endloop
+endfacet
+facet normal -0.8586164364012794 0.4957224306868705 -0.13052619222006182
+ outer loop
+ vertex -179.47239954062903 -69.58664256999755 -60.40000000000015
+ vertex -179.51961410070365 -69.5593832310288 -59.985889527836115
+ vertex -29.47239954062979 190.22097856533307 -60.400000000000055
+ endloop
+endfacet
+facet normal -0.8586164364012794 0.4957224306868705 -0.13052619222006182
+ outer loop
+ vertex -29.519614100704377 190.24823790430187 -59.98588952783603
+ vertex -29.47239954062979 190.22097856533307 -60.400000000000055
+ vertex -179.51961410070365 -69.5593832310288 -59.985889527836115
+ endloop
+endfacet
+facet normal 0.5272028623656437 -0.30438071450436416 0.7933533402912507
+ outer loop
+ vertex -181.8378360837974 -68.22095714504832 -61.53137084989868
+ vertex -181.55086050971173 -68.38664256999753 -61.78564064605529
+ vertex -31.83783608379814 191.58666399028237 -61.53137084989857
+ endloop
+endfacet
+facet normal 0.5272028623656437 -0.30438071450436416 0.7933533402912507
+ outer loop
+ vertex -31.55086050971244 191.42097856533306 -61.785640646055185
+ vertex -31.83783608379814 191.58666399028237 -61.53137084989857
+ vertex -181.55086050971173 -68.38664256999753 -61.78564064605529
+ endloop
+endfacet
+facet normal 0.1130389983218446 -0.06526309610999587 -0.9914448613738092
+ outer loop
+ vertex -181.21667037555144 -68.57958733391561 -58.85451867793769
+ vertex -31.216670375552173 191.22803380141505 -58.85451867793758
+ vertex -180.8580401866842 -68.7866425699976 -58.800000000000175
+ endloop
+endfacet
+facet normal 0.1130389983218446 -0.06526309610999587 -0.9914448613738092
+ outer loop
+ vertex -30.858040186684942 191.02097856533302 -58.80000000000008
+ vertex -180.8580401866842 -68.7866425699976 -58.800000000000175
+ vertex -31.216670375552173 191.22803380141505 -58.85451867793758
+ endloop
+endfacet
+facet normal 0.8586164364012767 -0.4957224306868802 -0.13052619222004297
+ outer loop
+ vertex -182.1964662726647 -68.01390190896635 -59.98588952783617
+ vertex -182.2436808327393 -67.9866425699976 -60.400000000000205
+ vertex -32.19646627266542 191.79371922636426 -59.985889527836086
+ endloop
+endfacet
+facet normal 0.8586164364012767 -0.4957224306868802 -0.13052619222004297
+ outer loop
+ vertex -32.24368083274005 191.82097856533298 -60.40000000000011
+ vertex -32.19646627266542 191.79371922636426 -59.985889527836086
+ vertex -182.2436808327393 -67.9866425699976 -60.400000000000205
+ endloop
+endfacet
+facet normal 0.8001031451912816 -0.4619397662555984 -0.38268343236511065
+ outer loop
+ vertex -168.68646997362725 -75.81390190896596 -59.98588952783615
+ vertex -18.686469973627926 183.99371922636473 -59.98588952783606
+ vertex -168.54804388764674 -75.89382224696966 -59.600000000000186
+ endloop
+endfacet
+facet normal 0.8001031451912816 -0.4619397662555984 -0.38268343236511065
+ outer loop
+ vertex -18.54804388764747 183.91379888836096 -59.600000000000094
+ vertex -168.54804388764674 -75.89382224696966 -59.600000000000186
+ vertex -18.686469973627926 183.99371922636473 -59.98588952783606
+ endloop
+endfacet
+facet normal 0.11303899832176341 -0.06526309611003213 0.9914448613738159
+ outer loop
+ vertex -181.21667037555136 -68.5795873339155 -61.94548132206272
+ vertex -180.85804018668415 -68.78664256999754 -62.00000000000017
+ vertex -31.216670375552106 191.22803380141514 -61.945481322062605
+ endloop
+endfacet
+facet normal 0.11303899832176341 -0.06526309611003213 0.9914448613738159
+ outer loop
+ vertex -30.858040186684896 191.02097856533317 -62.00000000000008
+ vertex -31.216670375552106 191.22803380141514 -61.945481322062605
+ vertex -180.85804018668415 -68.78664256999754 -62.00000000000017
+ endloop
+endfacet
+facet normal 0.8001031451913015 -0.4619397662555986 -0.3826834323650685
+ outer loop
+ vertex -182.05804018668422 -68.09382224697006 -59.600000000000186
+ vertex -182.1964662726647 -68.01390190896635 -59.98588952783617
+ vertex -32.05804018668494 191.71379888836057 -59.600000000000094
+ endloop
+endfacet
+facet normal 0.8001031451913015 -0.4619397662555986 -0.3826834323650685
+ outer loop
+ vertex -32.19646627266542 191.79371922636426 -59.985889527836086
+ vertex -32.05804018668494 191.71379888836057 -59.600000000000094
+ vertex -182.1964662726647 -68.01390190896635 -59.98588952783617
+ endloop
+endfacet
+facet normal -0.8001031451912766 0.46193976625561795 -0.3826834323650973
+ outer loop
+ vertex -179.51961410070365 -69.5593832310288 -59.985889527836115
+ vertex -179.65804018668416 -69.47946289302509 -59.60000000000015
+ vertex -29.519614100704377 190.24823790430187 -59.98588952783603
+ endloop
+endfacet
+facet normal -0.8001031451912766 0.46193976625561795 -0.3826834323650973
+ outer loop
+ vertex -29.658040186684875 190.32815824230553 -59.60000000000006
+ vertex -29.519614100704377 190.24823790430187 -59.98588952783603
+ vertex -179.65804018668416 -69.47946289302509 -59.60000000000015
+ endloop
+endfacet
+facet normal 0.1130389983218446 -0.06526309610999587 -0.9914448613738092
+ outer loop
+ vertex -167.70667407651396 -76.37958733391518 -58.854518677937655
+ vertex -17.7066740765147 183.42803380141538 -58.85451867793757
+ vertex -167.34804388764675 -76.5866425699972 -58.80000000000016
+ endloop
+endfacet
+facet normal 0.1130389983218446 -0.06526309610999587 -0.9914448613738092
+ outer loop
+ vertex -17.34804388764747 183.2209785653335 -58.800000000000075
+ vertex -167.34804388764675 -76.5866425699972 -58.80000000000016
+ vertex -17.7066740765147 183.42803380141538 -58.85451867793757
+ endloop
+endfacet
+facet normal -0.8001031451912816 0.4619397662555984 0.38268343236511065
+ outer loop
+ vertex -179.65804018668445 -69.47946289302554 -45.60000000000019
+ vertex -179.51961410070393 -69.55938323102926 -45.21411047216423
+ vertex -29.658040186685124 190.3281582423051 -45.6000000000001
+ endloop
+endfacet
+facet normal -0.8001031451912816 0.4619397662555984 0.38268343236511065
+ outer loop
+ vertex -29.519614100704626 190.24823790430136 -45.21411047216414
+ vertex -29.658040186685124 190.3281582423051 -45.6000000000001
+ vertex -179.51961410070393 -69.55938323102926 -45.21411047216423
+ endloop
+endfacet
+facet normal -0.8586164364012804 0.4957224306868824 0.13052619222001063
+ outer loop
+ vertex -179.51961410070393 -69.55938323102926 -45.21411047216423
+ vertex -179.4723995406293 -69.58664256999803 -44.800000000000196
+ vertex -29.519614100704626 190.24823790430136 -45.21411047216414
+ endloop
+endfacet
+facet normal -0.8586164364012804 0.4957224306868824 0.13052619222001063
+ outer loop
+ vertex -29.47239954063004 190.22097856533262 -44.800000000000104
+ vertex -29.519614100704626 190.24823790430136 -45.21411047216414
+ vertex -179.4723995406293 -69.58664256999803 -44.800000000000196
+ endloop
+endfacet
+facet normal -0.800103145191289 0.46193976625562516 -0.38268343236506275
+ outer loop
+ vertex -179.51961410070393 -69.55938323102929 -44.38588952783616
+ vertex -179.65804018668445 -69.4794628930256 -44.0000000000002
+ vertex -29.519614100704672 190.24823790430136 -44.38588952783607
+ endloop
+endfacet
+facet normal -0.800103145191289 0.46193976625562516 -0.38268343236506275
+ outer loop
+ vertex -29.65804018668519 190.32815824230505 -44.00000000000011
+ vertex -29.519614100704672 190.24823790430136 -44.38588952783607
+ vertex -179.65804018668445 -69.4794628930256 -44.0000000000002
+ endloop
+endfacet
+facet normal -0.8586164364012794 0.4957224306868705 -0.13052619222006182
+ outer loop
+ vertex -179.4723995406293 -69.58664256999803 -44.800000000000196
+ vertex -179.51961410070393 -69.55938323102929 -44.38588952783616
+ vertex -29.47239954063004 190.22097856533262 -44.800000000000104
+ endloop
+endfacet
+facet normal -0.8586164364012794 0.4957224306868705 -0.13052619222006182
+ outer loop
+ vertex -29.519614100704672 190.24823790430136 -44.38588952783607
+ vertex -29.47239954063004 190.22097856533262 -44.800000000000104
+ vertex -179.51961410070393 -69.55938323102929 -44.38588952783616
+ endloop
+endfacet
+facet normal -0.11303899832176205 0.06526309611003275 -0.991444861373816
+ outer loop
+ vertex -180.8580401866842 -68.7866425699976 -58.800000000000175
+ vertex -30.858040186684942 191.02097856533302 -58.80000000000008
+ vertex -180.49940999781697 -68.99369780607962 -58.85451867793765
+ endloop
+endfacet
+facet normal -0.11303899832176205 0.06526309611003275 -0.991444861373816
+ outer loop
+ vertex -30.49940999781769 190.81392332925108 -58.854518677937556
+ vertex -180.49940999781697 -68.99369780607962 -58.85451867793765
+ vertex -30.858040186684942 191.02097856533302 -58.80000000000008
+ endloop
+endfacet
+facet normal -0.11303899832181018 0.06526309611005914 -0.9914448613738089
+ outer loop
+ vertex -180.8580401866845 -68.7866425699981 -43.20000000000018
+ vertex -30.858040186685212 191.02097856533263 -43.20000000000011
+ vertex -180.49940999781728 -68.99369780608006 -43.254518677937675
+ endloop
+endfacet
+facet normal -0.11303899832181018 0.06526309611005914 -0.9914448613738089
+ outer loop
+ vertex -30.49940999781798 190.81392332925054 -43.254518677937604
+ vertex -180.49940999781728 -68.99369780608006 -43.254518677937675
+ vertex -30.858040186685212 191.02097856533263 -43.20000000000011
+ endloop
+endfacet
+facet normal 0.8586164364012804 -0.4957224306868823 -0.13052619222001038
+ outer loop
+ vertex -182.196466272665 -68.01390190896684 -44.38588952783617
+ vertex -182.24368083273959 -67.98664256999808 -44.8000000000002
+ vertex -32.19646627266571 191.7937192263638 -44.38588952783608
+ endloop
+endfacet
+facet normal 0.8586164364012804 -0.4957224306868823 -0.13052619222001038
+ outer loop
+ vertex -32.243680832740345 191.82097856533252 -44.80000000000011
+ vertex -32.19646627266571 191.7937192263638 -44.38588952783608
+ vertex -182.24368083273959 -67.98664256999808 -44.8000000000002
+ endloop
+endfacet
+facet normal 0.6870641468694348 -0.39667667014560976 0.6087614290087431
+ outer loop
+ vertex -182.05804018668445 -68.09382224697053 -45.6000000000002
+ vertex -181.8378360837977 -68.2209571450488 -45.93137084989867
+ vertex -32.05804018668523 191.7137988883601 -45.60000000000011
+ endloop
+endfacet
+facet normal 0.6870641468694348 -0.39667667014560976 0.6087614290087431
+ outer loop
+ vertex -31.837836083798436 191.58666399028183 -45.93137084989858
+ vertex -32.05804018668523 191.7137988883601 -45.60000000000011
+ vertex -181.8378360837977 -68.2209571450488 -45.93137084989867
+ endloop
+endfacet
+facet normal -0.3314135740355432 0.1913417161825403 -0.9238795325113052
+ outer loop
+ vertex -180.49940999781728 -68.99369780608006 -43.254518677937675
+ vertex -30.49940999781798 190.81392332925054 -43.254518677937604
+ vertex -180.16521986365692 -69.18664256999809 -43.41435935394508
+ endloop
+endfacet
+facet normal -0.3314135740355432 0.1913417161825403 -0.9238795325113052
+ outer loop
+ vertex -30.165219863657626 190.62097856533256 -43.414359353944995
+ vertex -180.16521986365692 -69.18664256999809 -43.41435935394508
+ vertex -30.49940999781798 190.81392332925054 -43.254518677937604
+ endloop
+endfacet
+facet normal 0.5272028623656865 -0.3043807145043776 0.7933533402912171
+ outer loop
+ vertex -181.8378360837977 -68.2209571450488 -45.93137084989867
+ vertex -181.550860509712 -68.38664256999806 -46.185640646055305
+ vertex -31.837836083798436 191.58666399028183 -45.93137084989858
+ endloop
+endfacet
+facet normal 0.5272028623656865 -0.3043807145043776 0.7933533402912171
+ outer loop
+ vertex -31.55086050971271 191.42097856533266 -46.18564064605523
+ vertex -31.837836083798436 191.58666399028183 -45.93137084989858
+ vertex -181.550860509712 -68.38664256999806 -46.185640646055305
+ endloop
+endfacet
+facet normal 0.527202862365685 -0.3043807145043091 -0.7933533402912443
+ outer loop
+ vertex -181.83783608379778 -68.22095714504887 -43.66862915010171
+ vertex -31.837836083798525 191.58666399028175 -43.668629150101616
+ vertex -181.55086050971207 -68.38664256999812 -43.414359353945095
+ endloop
+endfacet
+facet normal 0.527202862365685 -0.3043807145043091 -0.7933533402912443
+ outer loop
+ vertex -31.550860509712756 191.42097856533258 -43.414359353945
+ vertex -181.55086050971207 -68.38664256999812 -43.414359353945095
+ vertex -31.837836083798525 191.58666399028175 -43.668629150101616
+ endloop
+endfacet
+facet normal 0.11303899832180349 -0.06526309611005668 0.9914448613738097
+ outer loop
+ vertex -181.21667037555162 -68.57958733391597 -46.3454813220627
+ vertex -180.85804018668438 -68.78664256999798 -46.4000000000002
+ vertex -31.21667037555242 191.2280338014146 -46.345481322062625
+ endloop
+endfacet
+facet normal 0.11303899832180349 -0.06526309611005668 0.9914448613738097
+ outer loop
+ vertex -30.858040186685145 191.02097856533257 -46.40000000000013
+ vertex -31.21667037555242 191.2280338014146 -46.345481322062625
+ vertex -180.85804018668438 -68.78664256999798 -46.4000000000002
+ endloop
+endfacet
+facet normal -0.5272028623657145 0.3043807145043261 0.7933533402912182
+ outer loop
+ vertex -180.16521986365683 -69.18664256999797 -46.1856406460553
+ vertex -179.87824428957114 -69.35232799494723 -45.931370849898656
+ vertex -30.16521986365756 190.6209785653327 -46.18564064605521
+ endloop
+endfacet
+facet normal -0.5272028623657145 0.3043807145043261 0.7933533402912182
+ outer loop
+ vertex -29.878244289571878 190.4552931403834 -45.93137084989857
+ vertex -30.16521986365756 190.6209785653327 -46.18564064605521
+ vertex -179.87824428957114 -69.35232799494723 -45.931370849898656
+ endloop
+endfacet
+facet normal -0.6870641468694763 0.3966766701455884 0.6087614290087102
+ outer loop
+ vertex -179.65804018668445 -69.47946289302554 -45.60000000000019
+ vertex -29.658040186685124 190.3281582423051 -45.6000000000001
+ vertex -179.87824428957114 -69.35232799494723 -45.931370849898656
+ endloop
+endfacet
+facet normal -0.6870641468694763 0.3966766701455884 0.6087614290087102
+ outer loop
+ vertex -29.878244289571878 190.4552931403834 -45.93137084989857
+ vertex -179.87824428957114 -69.35232799494723 -45.931370849898656
+ vertex -29.658040186685124 190.3281582423051 -45.6000000000001
+ endloop
+endfacet
+facet normal 0.687064146869501 -0.39667667014558583 -0.6087614290086841
+ outer loop
+ vertex -181.83783608379778 -68.22095714504887 -43.66862915010171
+ vertex -182.05804018668448 -68.09382224697055 -44.0000000000002
+ vertex -31.837836083798525 191.58666399028175 -43.668629150101616
+ endloop
+endfacet
+facet normal 0.687064146869501 -0.39667667014558583 -0.6087614290086841
+ outer loop
+ vertex -32.058040186685254 191.71379888836003 -44.000000000000114
+ vertex -31.837836083798525 191.58666399028175 -43.668629150101616
+ vertex -182.05804018668448 -68.09382224697055 -44.0000000000002
+ endloop
+endfacet
+facet normal 0.3314135740356313 -0.1913417161825151 -0.9238795325112787
+ outer loop
+ vertex -181.55086050971207 -68.38664256999812 -43.414359353945095
+ vertex -31.550860509712756 191.42097856533258 -43.414359353945
+ vertex -181.21667037555173 -68.57958733391607 -43.254518677937675
+ endloop
+endfacet
+facet normal 0.3314135740356313 -0.1913417161825151 -0.9238795325112787
+ outer loop
+ vertex -31.216670375552443 191.22803380141454 -43.2545186779376
+ vertex -181.21667037555173 -68.57958733391607 -43.254518677937675
+ vertex -31.550860509712756 191.42097856533258 -43.414359353945
+ endloop
+endfacet
+facet normal -0.5272028623656588 0.304380714504356 -0.7933533402912438
+ outer loop
+ vertex -180.16521986365692 -69.18664256999809 -43.41435935394508
+ vertex -30.165219863657626 190.62097856533256 -43.414359353944995
+ vertex -179.87824428957117 -69.35232799494727 -43.6686291501017
+ endloop
+endfacet
+facet normal -0.5272028623656588 0.304380714504356 -0.7933533402912438
+ outer loop
+ vertex -29.8782442895719 190.45529314038336 -43.66862915010161
+ vertex -179.87824428957117 -69.35232799494727 -43.6686291501017
+ vertex -30.165219863657626 190.62097856533256 -43.414359353944995
+ endloop
+endfacet
+facet normal 0.8001031451912816 -0.46193976625559835 -0.38268343236511043
+ outer loop
+ vertex -182.196466272665 -68.01390190896684 -44.38588952783617
+ vertex -32.19646627266571 191.7937192263638 -44.38588952783608
+ vertex -182.05804018668448 -68.09382224697055 -44.0000000000002
+ endloop
+endfacet
+facet normal 0.8001031451912816 -0.46193976625559835 -0.38268343236511043
+ outer loop
+ vertex -32.058040186685254 191.71379888836003 -44.000000000000114
+ vertex -182.05804018668448 -68.09382224697055 -44.0000000000002
+ vertex -32.19646627266571 191.7937192263638 -44.38588952783608
+ endloop
+endfacet
+facet normal 0.800103145191289 -0.46193976625562516 0.38268343236506275
+ outer loop
+ vertex -182.05804018668445 -68.09382224697053 -45.6000000000002
+ vertex -32.05804018668523 191.7137988883601 -45.60000000000011
+ vertex -182.19646627266496 -68.01390190896683 -45.21411047216423
+ endloop
+endfacet
+facet normal 0.800103145191289 -0.46193976625562516 0.38268343236506275
+ outer loop
+ vertex -32.19646627266567 191.79371922636386 -45.214110472164144
+ vertex -182.19646627266496 -68.01390190896683 -45.21411047216423
+ vertex -32.05804018668523 191.7137988883601 -45.60000000000011
+ endloop
+endfacet
+facet normal -0.33141357403559885 0.19134171618256962 -0.9238795325112792
+ outer loop
+ vertex -180.49940999781697 -68.99369780607962 -58.85451867793765
+ vertex -30.49940999781769 190.81392332925108 -58.854518677937556
+ vertex -180.16521986365666 -69.18664256999759 -59.01435935394506
+ endloop
+endfacet
+facet normal -0.33141357403559885 0.19134171618256962 -0.9238795325112792
+ outer loop
+ vertex -30.165219863657356 190.62097856533308 -59.014359353944975
+ vertex -180.16521986365666 -69.18664256999759 -59.01435935394506
+ vertex -30.49940999781769 190.81392332925108 -58.854518677937556
+ endloop
+endfacet
+facet normal -0.6870641468694548 0.3966766701456156 -0.6087614290087167
+ outer loop
+ vertex -179.65804018668445 -69.4794628930256 -44.0000000000002
+ vertex -179.87824428957117 -69.35232799494727 -43.6686291501017
+ vertex -29.65804018668519 190.32815824230505 -44.00000000000011
+ endloop
+endfacet
+facet normal -0.6870641468694548 0.3966766701456156 -0.6087614290087167
+ outer loop
+ vertex -29.8782442895719 190.45529314038336 -43.66862915010161
+ vertex -29.65804018668519 190.32815824230505 -44.00000000000011
+ vertex -179.87824428957117 -69.35232799494727 -43.6686291501017
+ endloop
+endfacet
+facet normal 0.1130389983218446 -0.06526309610999587 -0.9914448613738092
+ outer loop
+ vertex -181.21667037555173 -68.57958733391607 -43.254518677937675
+ vertex -31.216670375552443 191.22803380141454 -43.2545186779376
+ vertex -180.8580401866845 -68.7866425699981 -43.20000000000018
+ endloop
+endfacet
+facet normal 0.1130389983218446 -0.06526309610999587 -0.9914448613738092
+ outer loop
+ vertex -30.858040186685212 191.02097856533263 -43.20000000000011
+ vertex -180.8580401866845 -68.7866425699981 -43.20000000000018
+ vertex -31.216670375552443 191.22803380141454 -43.2545186779376
+ endloop
+endfacet
+facet normal 0.33141357403555854 -0.191341716182552 0.9238795325112973
+ outer loop
+ vertex -181.550860509712 -68.38664256999806 -46.185640646055305
+ vertex -181.21667037555162 -68.57958733391597 -46.3454813220627
+ vertex -31.55086050971271 191.42097856533266 -46.18564064605523
+ endloop
+endfacet
+facet normal 0.33141357403555854 -0.191341716182552 0.9238795325112973
+ outer loop
+ vertex -31.21667037555242 191.2280338014146 -46.345481322062625
+ vertex -31.55086050971271 191.42097856533266 -46.18564064605523
+ vertex -181.21667037555162 -68.57958733391597 -46.3454813220627
+ endloop
+endfacet
+facet normal -0.33141357403563115 0.191341716182515 0.9238795325112789
+ outer loop
+ vertex -180.49940999781717 -68.99369780608001 -46.3454813220627
+ vertex -180.16521986365683 -69.18664256999797 -46.1856406460553
+ vertex -30.499409997817892 190.81392332925068 -46.345481322062625
+ endloop
+endfacet
+facet normal -0.33141357403563115 0.191341716182515 0.9238795325112789
+ outer loop
+ vertex -30.16521986365756 190.6209785653327 -46.18564064605521
+ vertex -30.499409997817892 190.81392332925068 -46.345481322062625
+ vertex -180.16521986365683 -69.18664256999797 -46.1856406460553
+ endloop
+endfacet
+facet normal 0.8586164364012794 -0.4957224306868705 0.130526192220062
+ outer loop
+ vertex -182.19646627266496 -68.01390190896683 -45.21411047216423
+ vertex -32.19646627266567 191.79371922636386 -45.214110472164144
+ vertex -182.24368083273959 -67.98664256999808 -44.8000000000002
+ endloop
+endfacet
+facet normal 0.8586164364012794 -0.4957224306868705 0.130526192220062
+ outer loop
+ vertex -32.243680832740345 191.82097856533252 -44.80000000000011
+ vertex -182.24368083273959 -67.98664256999808 -44.8000000000002
+ vertex -32.19646627266567 191.79371922636386 -45.214110472164144
+ endloop
+endfacet
+facet normal -0.1130389983218446 0.06526309610999587 0.9914448613738092
+ outer loop
+ vertex -180.85804018668438 -68.78664256999798 -46.4000000000002
+ vertex -180.49940999781717 -68.99369780608001 -46.3454813220627
+ vertex -30.858040186685145 191.02097856533257 -46.40000000000013
+ endloop
+endfacet
+facet normal -0.1130389983218446 0.06526309610999587 0.9914448613738092
+ outer loop
+ vertex -30.499409997817892 190.81392332925068 -46.345481322062625
+ vertex -30.858040186685145 191.02097856533257 -46.40000000000013
+ vertex -180.49940999781717 -68.99369780608001 -46.3454813220627
+ endloop
+endfacet
+facet normal -0.8586164364012802 0.49572243068687094 -0.13052619222005538
+ outer loop
+ vertex -182.73378697496332 -67.70367965685304 -61.85881904510269
+ vertex -182.76329607500998 -67.68664256999759 -61.60000000000018
+ vertex -32.73378697496404 192.1039414784776 -61.8588190451026
+ endloop
+endfacet
+facet normal -0.8586164364012802 0.49572243068687094 -0.13052619222005538
+ outer loop
+ vertex -32.76329607501068 192.12097856533305 -61.60000000000009
+ vertex -32.73378697496404 192.1039414784776 -61.8588190451026
+ vertex -182.76329607500998 -67.68664256999759 -61.60000000000018
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 -1.5003536199769236e-15
+ outer loop
+ vertex -182.76329607501006 -67.68664256999776 -56.40000000000017
+ vertex -32.76329607501074 192.12097856533296 -56.40000000000008
+ vertex -182.76329607500998 -67.68664256999759 -61.60000000000018
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 -1.5003536199769236e-15
+ outer loop
+ vertex -32.76329607501068 192.12097856533305 -61.60000000000009
+ vertex -182.76329607500998 -67.68664256999759 -61.60000000000018
+ vertex -32.76329607501074 192.12097856533296 -56.40000000000008
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 4.464960093105168e-15
+ outer loop
+ vertex -182.4168859134963 -67.88664256999773 -56.40000000000017
+ vertex -182.4168859134963 -67.88664256999775 -56.00000000000017
+ vertex -32.416885913496984 191.92097856533292 -56.40000000000008
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 4.464960093105168e-15
+ outer loop
+ vertex -32.41688591349703 191.92097856533286 -56.00000000000008
+ vertex -32.416885913496984 191.92097856533292 -56.40000000000008
+ vertex -182.4168859134963 -67.88664256999775 -56.00000000000017
+ endloop
+endfacet
+facet normal -1.7149041329274714e-14 -3.158301486324295e-14 1.0
+ outer loop
+ vertex -181.204450348198 -68.58664256999766 -58.200000000000195
+ vertex -179.44268224691507 -69.60379985752294 -58.20000000000017
+ vertex -31.204450348198748 191.22097856533298 -58.20000000000009
+ endloop
+endfacet
+facet normal -1.7149041329274714e-14 -3.158301486324295e-14 1.0
+ outer loop
+ vertex -29.442682246915794 190.20382127780772 -58.20000000000009
+ vertex -31.204450348198748 191.22097856533298 -58.20000000000009
+ vertex -179.44268224691507 -69.60379985752294 -58.20000000000017
+ endloop
+endfacet
+facet normal -0.8001031451912836 0.461939766255622 -0.3826834323650778
+ outer loop
+ vertex -182.6472706712255 -67.75362986810535 -62.10000000000018
+ vertex -182.73378697496332 -67.70367965685304 -61.85881904510269
+ vertex -32.64727067122623 192.0539912672253 -62.10000000000009
+ endloop
+endfacet
+facet normal -0.8001031451912836 0.461939766255622 -0.3826834323650778
+ outer loop
+ vertex -32.73378697496404 192.1039414784776 -61.8588190451026
+ vertex -32.64727067122623 192.0539912672253 -62.10000000000009
+ vertex -182.73378697496332 -67.70367965685304 -61.85881904510269
+ endloop
+endfacet
+facet normal -0.6123724356958129 0.3535533905932375 0.7071067811865498
+ outer loop
+ vertex -179.44268224691507 -69.60379985752294 -58.20000000000017
+ vertex -177.307336031168 -70.83664256999761 -55.73431457505093
+ vertex -29.442682246915794 190.20382127780772 -58.20000000000009
+ endloop
+endfacet
+facet normal -0.6123724356958129 0.3535533905932375 0.7071067811865498
+ outer loop
+ vertex -27.307336031168706 188.97097856533304 -55.734314575050846
+ vertex -29.442682246915794 190.20382127780772 -58.20000000000009
+ vertex -177.307336031168 -70.83664256999761 -55.73431457505093
+ endloop
+endfacet
+facet normal -3.1938264052337197e-15 -3.964006195623615e-14 1.0
+ outer loop
+ vertex -182.4168859134963 -67.88664256999775 -56.00000000000017
+ vertex -181.20445034819804 -68.58664256999772 -56.0000000000002
+ vertex -32.41688591349703 191.92097856533286 -56.00000000000008
+ endloop
+endfacet
+facet normal -3.1938264052337197e-15 -3.964006195623615e-14 1.0
+ outer loop
+ vertex -31.204450348198748 191.22097856533293 -56.00000000000009
+ vertex -32.41688591349703 191.92097856533286 -56.00000000000008
+ vertex -181.20445034819804 -68.58664256999772 -56.0000000000002
+ endloop
+endfacet
+facet normal -1.7149041329274714e-14 -3.158301486324295e-14 1.0
+ outer loop
+ vertex -182.76329607501006 -67.68664256999776 -56.40000000000017
+ vertex -182.4168859134963 -67.88664256999773 -56.40000000000017
+ vertex -32.76329607501074 192.12097856533296 -56.40000000000008
+ endloop
+endfacet
+facet normal -1.7149041329274714e-14 -3.158301486324295e-14 1.0
+ outer loop
+ vertex -32.416885913496984 191.92097856533292 -56.40000000000008
+ vertex -32.76329607501074 192.12097856533296 -56.40000000000008
+ vertex -182.4168859134963 -67.88664256999773 -56.40000000000017
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -9.400019899202893e-16
+ outer loop
+ vertex -181.204450348198 -68.58664256999766 -58.200000000000195
+ vertex -31.204450348198748 191.22097856533298 -58.20000000000009
+ vertex -181.20445034819804 -68.58664256999772 -56.0000000000002
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -9.400019899202893e-16
+ outer loop
+ vertex -31.204450348198748 191.22097856533293 -56.00000000000009
+ vertex -181.20445034819804 -68.58664256999772 -56.0000000000002
+ vertex -31.204450348198748 191.22097856533298 -58.20000000000009
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 1.052465433482836e-15
+ outer loop
+ vertex -177.30733603116812 -70.83664256999782 -49.465685424949434
+ vertex -27.30733603116882 188.97097856533284 -49.46568542494934
+ vertex -177.307336031168 -70.83664256999761 -55.73431457505093
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 1.052465433482836e-15
+ outer loop
+ vertex -27.307336031168706 188.97097856533304 -55.734314575050846
+ vertex -177.307336031168 -70.83664256999761 -55.73431457505093
+ vertex -27.30733603116882 188.97097856533284 -49.46568542494934
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -9.400019899202893e-16
+ outer loop
+ vertex -165.44278799932118 -77.68664256999766 -43.60000000000017
+ vertex -165.4427879993211 -77.6866425699975 -48.80000000000017
+ vertex -15.442787999321872 182.12097856533305 -43.6000000000001
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -9.400019899202893e-16
+ outer loop
+ vertex -15.442787999321826 182.12097856533316 -48.80000000000009
+ vertex -15.442787999321872 182.12097856533305 -43.6000000000001
+ vertex -165.4427879993211 -77.6866425699975 -48.80000000000017
+ endloop
+endfacet
+facet normal 1.7149041329274714e-14 3.158301486324295e-14 -1.0
+ outer loop
+ vertex -165.78919816083487 -77.48664256999749 -48.80000000000017
+ vertex -15.789198160835587 182.3209785653332 -48.80000000000008
+ vertex -165.4427879993211 -77.6866425699975 -48.80000000000017
+ endloop
+endfacet
+facet normal 1.7149041329274714e-14 3.158301486324295e-14 -1.0
+ outer loop
+ vertex -15.442787999321826 182.12097856533316 -48.80000000000009
+ vertex -165.4427879993211 -77.6866425699975 -48.80000000000017
+ vertex -15.789198160835587 182.3209785653332 -48.80000000000008
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -2.7394170869210427e-15
+ outer loop
+ vertex -170.89874804316315 -74.53664256999762 -49.46568542494941
+ vertex -170.89874804316304 -74.53664256999741 -55.73431457505091
+ vertex -20.898748043163867 185.27097856533302 -49.465685424949335
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -2.7394170869210427e-15
+ outer loop
+ vertex -20.8987480431638 185.2709785653332 -55.734314575050796
+ vertex -20.898748043163867 185.27097856533302 -49.465685424949335
+ vertex -170.89874804316304 -74.53664256999741 -55.73431457505091
+ endloop
+endfacet
+facet normal 1.7149041329274714e-14 3.158301486324295e-14 -1.0
+ outer loop
+ vertex -167.00163372613312 -76.7866425699975 -49.200000000000166
+ vertex -17.001633726133825 183.02097856533314 -49.200000000000074
+ vertex -165.78919816083487 -77.48664256999749 -49.200000000000166
+ endloop
+endfacet
+facet normal 1.7149041329274714e-14 3.158301486324295e-14 -1.0
+ outer loop
+ vertex -15.789198160835609 182.3209785653332 -49.20000000000008
+ vertex -165.78919816083487 -77.48664256999749 -49.200000000000166
+ vertex -17.001633726133825 183.02097856533314 -49.200000000000074
+ endloop
+endfacet
+facet normal -1.7149041329274714e-14 -3.158301486324295e-14 1.0
+ outer loop
+ vertex -168.7634018274159 -75.7694852824719 -58.200000000000166
+ vertex -167.00163372613295 -76.7866425699972 -58.200000000000166
+ vertex -18.763401827416597 184.03813585285874 -58.200000000000074
+ endloop
+endfacet
+facet normal -1.7149041329274714e-14 -3.158301486324295e-14 1.0
+ outer loop
+ vertex -17.00163372613369 183.02097856533345 -58.200000000000074
+ vertex -18.763401827416597 184.03813585285874 -58.200000000000074
+ vertex -167.00163372613295 -76.7866425699972 -58.200000000000166
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 9.400019899202893e-16
+ outer loop
+ vertex -167.00163372613295 -76.7866425699972 -58.200000000000166
+ vertex -167.00163372613298 -76.7866425699973 -56.00000000000017
+ vertex -17.00163372613369 183.02097856533345 -58.200000000000074
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 9.400019899202893e-16
+ outer loop
+ vertex -17.00163372613369 183.02097856533337 -56.00000000000008
+ vertex -17.00163372613369 183.02097856533345 -58.200000000000074
+ vertex -167.00163372613298 -76.7866425699973 -56.00000000000017
+ endloop
+endfacet
+facet normal -3.1938264052335588e-15 -3.964006195623625e-14 1.0
+ outer loop
+ vertex -167.00163372613298 -76.7866425699973 -56.00000000000017
+ vertex -165.78919816083476 -77.48664256999727 -56.0000000000002
+ vertex -17.00163372613369 183.02097856533337 -56.00000000000008
+ endloop
+endfacet
+facet normal -3.1938264052335588e-15 -3.964006195623625e-14 1.0
+ outer loop
+ vertex -15.78919816083545 182.32097856533338 -56.000000000000114
+ vertex -17.00163372613369 183.02097856533337 -56.00000000000008
+ vertex -165.78919816083476 -77.48664256999727 -56.0000000000002
+ endloop
+endfacet
+facet normal 1.7149041329274714e-14 3.158301486324295e-14 -1.0
+ outer loop
+ vertex -168.76340182741606 -75.76948528247226 -47.00000000000018
+ vertex -18.763401827416754 184.03813585285843 -47.00000000000008
+ vertex -167.00163372613315 -76.78664256999758 -47.00000000000017
+ endloop
+endfacet
+facet normal 1.7149041329274714e-14 3.158301486324295e-14 -1.0
+ outer loop
+ vertex -17.00163372613387 183.02097856533308 -47.00000000000008
+ vertex -167.00163372613315 -76.78664256999758 -47.00000000000017
+ vertex -18.763401827416754 184.03813585285843 -47.00000000000008
+ endloop
+endfacet
+facet normal 0.6123724356958129 -0.3535533905932375 -0.7071067811865498
+ outer loop
+ vertex -170.89874804316315 -74.53664256999762 -49.46568542494941
+ vertex -20.898748043163867 185.27097856533302 -49.465685424949335
+ vertex -168.76340182741606 -75.76948528247226 -47.00000000000018
+ endloop
+endfacet
+facet normal 0.6123724356958129 -0.3535533905932375 -0.7071067811865498
+ outer loop
+ vertex -18.763401827416754 184.03813585285843 -47.00000000000008
+ vertex -168.76340182741606 -75.76948528247226 -47.00000000000018
+ vertex -20.898748043163867 185.27097856533302 -49.465685424949335
+ endloop
+endfacet
+facet normal 0.6123724356957987 -0.35355339059327445 0.7071067811865437
+ outer loop
+ vertex -168.7634018274159 -75.7694852824719 -58.200000000000166
+ vertex -18.763401827416597 184.03813585285874 -58.200000000000074
+ vertex -170.89874804316304 -74.53664256999741 -55.73431457505091
+ endloop
+endfacet
+facet normal 0.6123724356957987 -0.35355339059327445 0.7071067811865437
+ outer loop
+ vertex -20.8987480431638 185.2709785653332 -55.734314575050796
+ vertex -170.89874804316304 -74.53664256999741 -55.73431457505091
+ vertex -18.763401827416597 184.03813585285874 -58.200000000000074
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -9.400019899202893e-16
+ outer loop
+ vertex -165.78919816083476 -77.48664256999727 -56.400000000000205
+ vertex -15.78919816083545 182.32097856533338 -56.40000000000011
+ vertex -165.78919816083476 -77.48664256999727 -56.0000000000002
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -9.400019899202893e-16
+ outer loop
+ vertex -15.78919816083545 182.32097856533338 -56.000000000000114
+ vertex -165.78919816083476 -77.48664256999727 -56.0000000000002
+ vertex -15.78919816083545 182.32097856533338 -56.40000000000011
+ endloop
+endfacet
+facet normal -1.7149041329274714e-14 -3.158301486324295e-14 1.0
+ outer loop
+ vertex -165.78919816083476 -77.48664256999727 -56.400000000000205
+ vertex -165.44278799932096 -77.68664256999723 -56.400000000000205
+ vertex -15.78919816083545 182.32097856533338 -56.40000000000011
+ endloop
+endfacet
+facet normal -1.7149041329274714e-14 -3.158301486324295e-14 1.0
+ outer loop
+ vertex -15.442787999321691 182.12097856533347 -56.40000000000011
+ vertex -15.78919816083545 182.32097856533338 -56.40000000000011
+ vertex -165.44278799932096 -77.68664256999723 -56.400000000000205
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -9.400019899202893e-16
+ outer loop
+ vertex -165.78919816083487 -77.48664256999749 -48.80000000000017
+ vertex -165.78919816083487 -77.48664256999749 -49.200000000000166
+ vertex -15.789198160835587 182.3209785653332 -48.80000000000008
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -9.400019899202893e-16
+ outer loop
+ vertex -15.789198160835609 182.3209785653332 -49.20000000000008
+ vertex -15.789198160835587 182.3209785653332 -48.80000000000008
+ vertex -165.78919816083487 -77.48664256999749 -49.200000000000166
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 9.400019899202893e-16
+ outer loop
+ vertex -167.00163372613315 -76.78664256999758 -47.00000000000017
+ vertex -17.00163372613387 183.02097856533308 -47.00000000000008
+ vertex -167.00163372613312 -76.7866425699975 -49.200000000000166
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 9.400019899202893e-16
+ outer loop
+ vertex -17.001633726133825 183.02097856533314 -49.200000000000074
+ vertex -167.00163372613312 -76.7866425699975 -49.200000000000166
+ vertex -17.00163372613387 183.02097856533308 -47.00000000000008
+ endloop
+endfacet
+facet normal 0.6870641468694697 -0.3966766701455846 -0.6087614290087203
+ outer loop
+ vertex -165.55881340310532 -77.61965527188926 -62.10000000000019
+ vertex -165.69644096740947 -77.54019596059028 -62.30710678118674
+ vertex -15.558813403106026 182.18796586344138 -62.1000000000001
+ endloop
+endfacet
+facet normal 0.6870641468694697 -0.3966766701455846 -0.6087614290087203
+ outer loop
+ vertex -15.696440967410249 182.26742517474028 -62.307106781186654
+ vertex -15.558813403106026 182.18796586344138 -62.1000000000001
+ vertex -165.69644096740947 -77.54019596059028 -62.30710678118674
+ endloop
+endfacet
+facet normal 0.3314135740356084 -0.19134171618249907 -0.9238795325112903
+ outer loop
+ vertex -166.0846695350633 -77.31605209254832 -62.56592582628924
+ vertex -16.084669535064027 182.49156904278234 -62.56592582628915
+ vertex -165.87580070121308 -77.43664256999705 -62.46602540378463
+ endloop
+endfacet
+facet normal 0.3314135740356084 -0.19134171618249907 -0.9238795325112903
+ outer loop
+ vertex -15.875800701213794 182.37097856533364 -62.466025403784535
+ vertex -165.87580070121308 -77.43664256999705 -62.46602540378463
+ vertex -16.084669535064027 182.49156904278234 -62.56592582628915
+ endloop
+endfacet
+facet normal 0.1130389983218544 -0.06526309611000013 -0.9914448613738078
+ outer loop
+ vertex -166.30881340310532 -77.18664256999705 -62.60000000000018
+ vertex -16.308813403106058 182.6209785653336 -62.60000000000009
+ vertex -166.0846695350633 -77.31605209254832 -62.56592582628924
+ endloop
+endfacet
+facet normal 0.1130389983218544 -0.06526309611000013 -0.9914448613738078
+ outer loop
+ vertex -16.084669535064027 182.49156904278234 -62.56592582628915
+ vertex -166.0846695350633 -77.31605209254832 -62.56592582628924
+ vertex -16.308813403106058 182.6209785653336 -62.60000000000009
+ endloop
+endfacet
+facet normal 1.7149041329274714e-14 3.158301486324295e-14 -1.0
+ outer loop
+ vertex -170.81214550278446 -74.5866425699972 -62.6000000000002
+ vertex -20.812145502785206 185.22097856533344 -62.60000000000009
+ vertex -166.30881340310532 -77.18664256999705 -62.60000000000018
+ endloop
+endfacet
+facet normal 1.7149041329274714e-14 3.158301486324295e-14 -1.0
+ outer loop
+ vertex -16.308813403106058 182.6209785653336 -62.60000000000009
+ vertex -166.30881340310532 -77.18664256999705 -62.60000000000018
+ vertex -20.812145502785206 185.22097856533344 -62.60000000000009
+ endloop
+endfacet
+facet normal 0.5272028623656807 -0.30438071450430654 -0.7933533402912483
+ outer loop
+ vertex -165.87580070121308 -77.43664256999705 -62.46602540378463
+ vertex -15.875800701213794 182.37097856533364 -62.466025403784535
+ vertex -165.69644096740947 -77.54019596059028 -62.30710678118674
+ endloop
+endfacet
+facet normal 0.5272028623656807 -0.30438071450430654 -0.7933533402912483
+ outer loop
+ vertex -15.696440967410249 182.26742517474028 -62.307106781186654
+ vertex -165.69644096740947 -77.54019596059028 -62.30710678118674
+ vertex -15.875800701213794 182.37097856533364 -62.466025403784535
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -9.400019899202893e-16
+ outer loop
+ vertex -165.44278799932087 -77.68664256999709 -61.60000000000019
+ vertex -15.44278799932158 182.12097856533364 -61.6000000000001
+ vertex -165.44278799932096 -77.68664256999723 -56.400000000000205
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -9.400019899202893e-16
+ outer loop
+ vertex -15.442787999321691 182.12097856533347 -56.40000000000011
+ vertex -165.44278799932096 -77.68664256999723 -56.400000000000205
+ vertex -15.44278799932158 182.12097856533364 -61.6000000000001
+ endloop
+endfacet
+facet normal 0.8001031451912876 -0.46193976625561306 -0.3826834323650808
+ outer loop
+ vertex -165.55881340310532 -77.61965527188926 -62.10000000000019
+ vertex -15.558813403106026 182.18796586344138 -62.1000000000001
+ vertex -165.47229709936752 -77.66960548314157 -61.858819045102706
+ endloop
+endfacet
+facet normal 0.8001031451912876 -0.46193976625561306 -0.3826834323650808
+ outer loop
+ vertex -15.472297099368218 182.13801565218895 -61.858819045102614
+ vertex -165.47229709936752 -77.66960548314157 -61.858819045102706
+ vertex -15.558813403106026 182.18796586344138 -62.1000000000001
+ endloop
+endfacet
+facet normal 0.85861643640128 -0.4957224306868709 -0.1305261922200573
+ outer loop
+ vertex -165.44278799932087 -77.68664256999709 -61.60000000000019
+ vertex -165.47229709936752 -77.66960548314157 -61.858819045102706
+ vertex -15.44278799932158 182.12097856533364 -61.6000000000001
+ endloop
+endfacet
+facet normal 0.85861643640128 -0.4957224306868709 -0.1305261922200573
+ outer loop
+ vertex -15.472297099368218 182.13801565218895 -61.858819045102614
+ vertex -15.44278799932158 182.12097856533364 -61.6000000000001
+ vertex -165.47229709936752 -77.66960548314157 -61.858819045102706
+ endloop
+endfacet
+facet normal 1.7149041329274714e-14 3.158301486324295e-14 -1.0
+ outer loop
+ vertex -171.15855566429823 -74.3866425699972 -62.20000000000018
+ vertex -21.158555664298987 185.42097856533343 -62.20000000000008
+ vertex -170.8121455027845 -74.5866425699972 -62.2000000000002
+ endloop
+endfacet
+facet normal 1.7149041329274714e-14 3.158301486324295e-14 -1.0
+ outer loop
+ vertex -20.812145502785185 185.22097856533344 -62.20000000000009
+ vertex -170.8121455027845 -74.5866425699972 -62.2000000000002
+ vertex -21.158555664298987 185.42097856533343 -62.20000000000008
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 9.400019899202893e-16
+ outer loop
+ vertex -169.25329977597252 -75.48664256999727 -58.765685424949424
+ vertex -19.253299775973254 184.32097856533338 -58.76568542494933
+ vertex -169.2532997759725 -75.4866425699972 -60.80000000000016
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 9.400019899202893e-16
+ outer loop
+ vertex -19.253299775973186 184.3209785653334 -60.80000000000007
+ vertex -169.2532997759725 -75.4866425699972 -60.80000000000016
+ vertex -19.253299775973254 184.32097856533338 -58.76568542494933
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 9.400019899202893e-16
+ outer loop
+ vertex -170.81214550278446 -74.5866425699972 -62.6000000000002
+ vertex -170.8121455027845 -74.5866425699972 -62.2000000000002
+ vertex -20.812145502785206 185.22097856533344 -62.60000000000009
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 9.400019899202893e-16
+ outer loop
+ vertex -20.812145502785185 185.22097856533344 -62.20000000000009
+ vertex -20.812145502785206 185.22097856533344 -62.60000000000009
+ vertex -170.8121455027845 -74.5866425699972 -62.2000000000002
+ endloop
+endfacet
+facet normal -1.7149041329274714e-14 -3.158301486324295e-14 1.0
+ outer loop
+ vertex -171.15855566429826 -74.38664256999729 -60.80000000000016
+ vertex -169.2532997759725 -75.4866425699972 -60.80000000000016
+ vertex -21.158555664299012 185.4209785653334 -60.80000000000006
+ endloop
+endfacet
+facet normal -1.7149041329274714e-14 -3.158301486324295e-14 1.0
+ outer loop
+ vertex -19.253299775973186 184.3209785653334 -60.80000000000007
+ vertex -21.158555664299012 185.4209785653334 -60.80000000000006
+ vertex -169.2532997759725 -75.4866425699972 -60.80000000000016
+ endloop
+endfacet
+facet normal 1.7149041329274714e-14 3.158301486324295e-14 -1.0
+ outer loop
+ vertex -176.8174380826113 -71.1194852824722 -56.30000000000017
+ vertex -26.817438082612004 188.6881358528584 -56.300000000000075
+ vertex -171.38864599171967 -74.25379985752278 -56.30000000000017
+ endloop
+endfacet
+facet normal 1.7149041329274714e-14 3.158301486324295e-14 -1.0
+ outer loop
+ vertex -21.388645991720363 185.5538212778079 -56.30000000000007
+ vertex -171.38864599171967 -74.25379985752278 -56.30000000000017
+ vertex -26.817438082612004 188.6881358528584 -56.300000000000075
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 8.997049082914166e-15
+ outer loop
+ vertex -171.15855566429826 -74.38664256999729 -60.80000000000016
+ vertex -21.158555664299012 185.4209785653334 -60.80000000000006
+ vertex -171.15855566429823 -74.3866425699972 -62.20000000000018
+ endloop
+endfacet
+facet normal -0.8660254037844584 0.49999999999996575 8.997049082914166e-15
+ outer loop
+ vertex -21.158555664298987 185.42097856533343 -62.20000000000008
+ vertex -171.15855566429823 -74.3866425699972 -62.20000000000018
+ vertex -21.158555664299012 185.4209785653334 -60.80000000000006
+ endloop
+endfacet
+facet normal -0.6123724356957958 0.3535533905932728 -0.7071067811865469
+ outer loop
+ vertex -171.38864599171967 -74.25379985752278 -56.30000000000017
+ vertex -21.388645991720363 185.5538212778079 -56.30000000000007
+ vertex -169.25329977597252 -75.48664256999727 -58.765685424949424
+ endloop
+endfacet
+facet normal -0.6123724356957958 0.3535533905932728 -0.7071067811865469
+ outer loop
+ vertex -19.253299775973254 184.32097856533338 -58.76568542494933
+ vertex -169.25329977597252 -75.48664256999727 -58.765685424949424
+ vertex -21.388645991720363 185.5538212778079 -56.30000000000007
+ endloop
+endfacet
+facet normal 0.6123724356958177 -0.353553390593229 -0.70710678118655
+ outer loop
+ vertex -178.95278429835838 -69.88664256999755 -58.76568542494941
+ vertex -28.952784298359116 189.9209785653331 -58.76568542494932
+ vertex -176.8174380826113 -71.1194852824722 -56.30000000000017
+ endloop
+endfacet
+facet normal 0.6123724356958177 -0.353553390593229 -0.70710678118655
+ outer loop
+ vertex -26.817438082612004 188.6881358528584 -56.300000000000075
+ vertex -176.8174380826113 -71.1194852824722 -56.30000000000017
+ vertex -28.952784298359116 189.9209785653331 -58.76568542494932
+ endloop
+endfacet
+facet normal -1.7149041329274714e-14 -3.158301486324295e-14 1.0
+ outer loop
+ vertex -178.95278429835838 -69.8866425699975 -60.80000000000017
+ vertex -177.04752841003258 -70.98664256999746 -60.80000000000018
+ vertex -28.952784298359095 189.92097856533314 -60.80000000000008
+ endloop
+endfacet
+facet normal -1.7149041329274714e-14 -3.158301486324295e-14 1.0
+ outer loop
+ vertex -27.04752841003327 188.82097856533326 -60.80000000000009
+ vertex -28.952784298359095 189.92097856533314 -60.80000000000008
+ vertex -177.04752841003258 -70.98664256999746 -60.80000000000018
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -2.6118274155526564e-14
+ outer loop
+ vertex -177.04752841003258 -70.98664256999746 -60.80000000000018
+ vertex -177.04752841003258 -70.98664256999737 -62.20000000000018
+ vertex -27.04752841003327 188.82097856533326 -60.80000000000009
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -2.6118274155526564e-14
+ outer loop
+ vertex -27.04752841003329 188.82097856533326 -62.20000000000009
+ vertex -27.04752841003327 188.82097856533326 -60.80000000000009
+ vertex -177.04752841003258 -70.98664256999737 -62.20000000000018
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -9.400019899202893e-16
+ outer loop
+ vertex -178.95278429835838 -69.8866425699975 -60.80000000000017
+ vertex -28.952784298359095 189.92097856533314 -60.80000000000008
+ vertex -178.95278429835838 -69.88664256999755 -58.76568542494941
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -9.400019899202893e-16
+ outer loop
+ vertex -28.952784298359116 189.9209785653331 -58.76568542494932
+ vertex -178.95278429835838 -69.88664256999755 -58.76568542494941
+ vertex -28.952784298359095 189.92097856533314 -60.80000000000008
+ endloop
+endfacet
+facet normal 1.7149041329274714e-14 3.158301486324295e-14 -1.0
+ outer loop
+ vertex -177.39393857154636 -70.78664256999738 -62.20000000000018
+ vertex -27.393938571547096 189.02097856533325 -62.20000000000009
+ vertex -177.04752841003258 -70.98664256999737 -62.20000000000018
+ endloop
+endfacet
+facet normal 1.7149041329274714e-14 3.158301486324295e-14 -1.0
+ outer loop
+ vertex -27.04752841003329 188.82097856533326 -62.20000000000009
+ vertex -177.04752841003258 -70.98664256999737 -62.20000000000018
+ vertex -27.393938571547096 189.02097856533325 -62.20000000000009
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -4.464960093105168e-15
+ outer loop
+ vertex -177.39393857154636 -70.78664256999738 -62.20000000000018
+ vertex -177.39393857154636 -70.78664256999735 -62.60000000000018
+ vertex -27.393938571547096 189.02097856533325 -62.20000000000009
+ endloop
+endfacet
+facet normal 0.8660254037844584 -0.49999999999996575 -4.464960093105168e-15
+ outer loop
+ vertex -27.39393857154707 189.02097856533325 -62.60000000000009
+ vertex -27.393938571547096 189.02097856533325 -62.20000000000009
+ vertex -177.39393857154636 -70.78664256999735 -62.60000000000018
+ endloop
+endfacet
+facet normal 1.7149041329274714e-14 3.158301486324295e-14 -1.0
+ outer loop
+ vertex -181.8972706712255 -68.18664256999753 -62.60000000000018
+ vertex -31.8972706712262 191.6209785653332 -62.60000000000008
+ vertex -177.39393857154636 -70.78664256999735 -62.60000000000018
+ endloop
+endfacet
+facet normal 1.7149041329274714e-14 3.158301486324295e-14 -1.0
+ outer loop
+ vertex -27.39393857154707 189.02097856533325 -62.60000000000009
+ vertex -177.39393857154636 -70.78664256999735 -62.60000000000018
+ vertex -31.8972706712262 191.6209785653332 -62.60000000000008
+ endloop
+endfacet
+facet normal -0.11303899832181775 0.06526309611006632 -0.9914448613738075
+ outer loop
+ vertex -182.1214145392675 -68.05723304744627 -62.56592582628924
+ vertex -32.12141453926823 191.75038808788443 -62.56592582628915
+ vertex -181.8972706712255 -68.18664256999753 -62.60000000000018
+ endloop
+endfacet
+facet normal -0.11303899832181775 0.06526309611006632 -0.9914448613738075
+ outer loop
+ vertex -31.8972706712262 191.6209785653332 -62.60000000000008
+ vertex -181.8972706712255 -68.18664256999753 -62.60000000000018
+ vertex -32.12141453926823 191.75038808788443 -62.56592582628915
+ endloop
+endfacet
+facet normal -0.3314135740355742 0.19134171618256102 -0.9238795325112896
+ outer loop
+ vertex -182.3302833731177 -67.93664256999756 -62.46602540378461
+ vertex -32.33028337311846 191.87097856533305 -62.46602540378452
+ vertex -182.1214145392675 -68.05723304744627 -62.56592582628924
+ endloop
+endfacet
+facet normal -0.3314135740355742 0.19134171618256102 -0.9238795325112896
+ outer loop
+ vertex -32.12141453926823 191.75038808788443 -62.56592582628915
+ vertex -182.1214145392675 -68.05723304744627 -62.56592582628924
+ vertex -32.33028337311846 191.87097856533305 -62.46602540378452
+ endloop
+endfacet
+facet normal -0.5272028623656496 0.30438071450436194 -0.7933533402912476
+ outer loop
+ vertex -182.5096431069213 -67.8330891794043 -62.30710678118673
+ vertex -32.509643106922006 191.9745319559264 -62.30710678118664
+ vertex -182.3302833731177 -67.93664256999756 -62.46602540378461
+ endloop
+endfacet
+facet normal -0.5272028623656496 0.30438071450436194 -0.7933533402912476
+ outer loop
+ vertex -32.33028337311846 191.87097856533305 -62.46602540378452
+ vertex -182.3302833731177 -67.93664256999756 -62.46602540378461
+ vertex -32.509643106922006 191.9745319559264 -62.30710678118664
+ endloop
+endfacet
+facet normal -0.6870641468694534 0.39667667014562047 -0.6087614290087151
+ outer loop
+ vertex -182.5096431069213 -67.8330891794043 -62.30710678118673
+ vertex -182.6472706712255 -67.75362986810535 -62.10000000000018
+ vertex -32.509643106922006 191.9745319559264 -62.30710678118664
+ endloop
+endfacet
+facet normal -0.6870641468694534 0.39667667014562047 -0.6087614290087151
+ outer loop
+ vertex -32.64727067122623 192.0539912672253 -62.10000000000009
+ vertex -32.509643106922006 191.9745319559264 -62.30710678118664
+ vertex -182.6472706712255 -67.75362986810535 -62.10000000000018
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.76329607501074 192.12097856533296 -56.40000000000008
+ vertex -32.416885913496984 191.92097856533292 -56.40000000000008
+ vertex -32.76329607501068 192.12097856533305 -61.60000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.19646627266542 191.79371922636426 -59.985889527836086
+ vertex -32.76329607501068 192.12097856533305 -61.60000000000009
+ vertex -32.416885913496984 191.92097856533292 -56.40000000000008
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.05804018668494 191.71379888836057 -59.600000000000094
+ vertex -32.19646627266542 191.79371922636426 -59.985889527836086
+ vertex -32.416885913496984 191.92097856533292 -56.40000000000008
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -31.204450348198748 191.22097856533298 -58.20000000000009
+ vertex -32.05804018668494 191.71379888836057 -59.600000000000094
+ vertex -32.416885913496984 191.92097856533292 -56.40000000000008
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -31.83783608379823 191.58666399028223 -59.26862915010161
+ vertex -32.05804018668494 191.71379888836057 -59.600000000000094
+ vertex -31.204450348198748 191.22097856533298 -58.20000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -31.55086050971253 191.42097856533306 -59.014359353944975
+ vertex -31.83783608379823 191.58666399028223 -59.26862915010161
+ vertex -31.204450348198748 191.22097856533298 -58.20000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -31.216670375552173 191.22803380141505 -58.85451867793758
+ vertex -31.55086050971253 191.42097856533306 -59.014359353944975
+ vertex -31.204450348198748 191.22097856533298 -58.20000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -29.442682246915794 190.20382127780772 -58.20000000000009
+ vertex -31.216670375552173 191.22803380141505 -58.85451867793758
+ vertex -31.204450348198748 191.22097856533298 -58.20000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -30.858040186684942 191.02097856533302 -58.80000000000008
+ vertex -31.216670375552173 191.22803380141505 -58.85451867793758
+ vertex -29.442682246915794 190.20382127780772 -58.20000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -28.952784298359116 189.9209785653331 -58.76568542494932
+ vertex -30.858040186684942 191.02097856533302 -58.80000000000008
+ vertex -29.442682246915794 190.20382127780772 -58.20000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.24368083274005 191.82097856533298 -60.40000000000011
+ vertex -32.76329607501068 192.12097856533305 -61.60000000000009
+ vertex -32.19646627266542 191.79371922636426 -59.985889527836086
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.19646627266542 191.79371922636432 -60.814110472164145
+ vertex -32.76329607501068 192.12097856533305 -61.60000000000009
+ vertex -32.24368083274005 191.82097856533298 -60.40000000000011
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.05804018668492 191.71379888836057 -61.20000000000012
+ vertex -32.76329607501068 192.12097856533305 -61.60000000000009
+ vertex -32.19646627266542 191.79371922636432 -60.814110472164145
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -31.83783608379814 191.58666399028237 -61.53137084989857
+ vertex -32.76329607501068 192.12097856533305 -61.60000000000009
+ vertex -32.05804018668492 191.71379888836057 -61.20000000000012
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -31.55086050971244 191.42097856533306 -61.785640646055185
+ vertex -32.76329607501068 192.12097856533305 -61.60000000000009
+ vertex -31.83783608379814 191.58666399028237 -61.53137084989857
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.73378697496404 192.1039414784776 -61.8588190451026
+ vertex -32.76329607501068 192.12097856533305 -61.60000000000009
+ vertex -31.55086050971244 191.42097856533306 -61.785640646055185
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -31.216670375552106 191.22803380141514 -61.945481322062605
+ vertex -32.73378697496404 192.1039414784776 -61.8588190451026
+ vertex -31.55086050971244 191.42097856533306 -61.785640646055185
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.64727067122623 192.0539912672253 -62.10000000000009
+ vertex -32.73378697496404 192.1039414784776 -61.8588190451026
+ vertex -31.216670375552106 191.22803380141514 -61.945481322062605
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -30.858040186684896 191.02097856533317 -62.00000000000008
+ vertex -32.64727067122623 192.0539912672253 -62.10000000000009
+ vertex -31.216670375552106 191.22803380141514 -61.945481322062605
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.64727067122623 192.0539912672253 -62.10000000000009
+ vertex -27.393938571547096 189.02097856533325 -62.20000000000009
+ vertex -32.509643106922006 191.9745319559264 -62.30710678118664
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -27.39393857154707 189.02097856533325 -62.60000000000009
+ vertex -32.509643106922006 191.9745319559264 -62.30710678118664
+ vertex -27.393938571547096 189.02097856533325 -62.20000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.33028337311846 191.87097856533305 -62.46602540378452
+ vertex -32.509643106922006 191.9745319559264 -62.30710678118664
+ vertex -27.39393857154707 189.02097856533325 -62.60000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.12141453926823 191.75038808788443 -62.56592582628915
+ vertex -32.33028337311846 191.87097856533305 -62.46602540378452
+ vertex -27.39393857154707 189.02097856533325 -62.60000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -31.8972706712262 191.6209785653332 -62.60000000000008
+ vertex -32.12141453926823 191.75038808788443 -62.56592582628915
+ vertex -27.39393857154707 189.02097856533325 -62.60000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -28.952784298359095 189.92097856533314 -60.80000000000008
+ vertex -29.658040186684875 190.32815824230553 -59.60000000000006
+ vertex -28.952784298359116 189.9209785653331 -58.76568542494932
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -29.87824428957163 190.45529314038384 -59.26862915010159
+ vertex -28.952784298359116 189.9209785653331 -58.76568542494932
+ vertex -29.658040186684875 190.32815824230553 -59.60000000000006
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -30.165219863657356 190.62097856533308 -59.014359353944975
+ vertex -28.952784298359116 189.9209785653331 -58.76568542494932
+ vertex -29.87824428957163 190.45529314038384 -59.26862915010159
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -30.49940999781769 190.81392332925108 -58.854518677937556
+ vertex -28.952784298359116 189.9209785653331 -58.76568542494932
+ vertex -30.165219863657356 190.62097856533308 -59.014359353944975
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -30.858040186684942 191.02097856533302 -58.80000000000008
+ vertex -28.952784298359116 189.9209785653331 -58.76568542494932
+ vertex -30.49940999781769 190.81392332925108 -58.854518677937556
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -29.519614100704377 190.24823790430187 -59.98588952783603
+ vertex -29.658040186684875 190.32815824230553 -59.60000000000006
+ vertex -28.952784298359095 189.92097856533314 -60.80000000000008
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -29.47239954062979 190.22097856533307 -60.400000000000055
+ vertex -29.519614100704377 190.24823790430187 -59.98588952783603
+ vertex -28.952784298359095 189.92097856533314 -60.80000000000008
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -29.519614100704356 190.24823790430187 -60.81411047216411
+ vertex -29.47239954062979 190.22097856533307 -60.400000000000055
+ vertex -28.952784298359095 189.92097856533314 -60.80000000000008
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -27.04752841003327 188.82097856533326 -60.80000000000009
+ vertex -29.519614100704356 190.24823790430187 -60.81411047216411
+ vertex -28.952784298359095 189.92097856533314 -60.80000000000008
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -27.04752841003329 188.82097856533326 -62.20000000000009
+ vertex -29.519614100704356 190.24823790430187 -60.81411047216411
+ vertex -27.04752841003327 188.82097856533326 -60.80000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -29.6580401866849 190.32815824230553 -61.20000000000008
+ vertex -29.519614100704356 190.24823790430187 -60.81411047216411
+ vertex -27.04752841003329 188.82097856533326 -62.20000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -29.878244289571587 190.4552931403839 -61.53137084989855
+ vertex -29.6580401866849 190.32815824230553 -61.20000000000008
+ vertex -27.04752841003329 188.82097856533326 -62.20000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -30.16521986365729 190.6209785653331 -61.785640646055185
+ vertex -29.878244289571587 190.4552931403839 -61.53137084989855
+ vertex -27.04752841003329 188.82097856533326 -62.20000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -30.49940999781767 190.81392332925108 -61.945481322062584
+ vertex -30.16521986365729 190.6209785653331 -61.785640646055185
+ vertex -27.04752841003329 188.82097856533326 -62.20000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -30.858040186684896 191.02097856533317 -62.00000000000008
+ vertex -30.49940999781767 190.81392332925108 -61.945481322062584
+ vertex -27.04752841003329 188.82097856533326 -62.20000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.64727067122623 192.0539912672253 -62.10000000000009
+ vertex -30.858040186684896 191.02097856533317 -62.00000000000008
+ vertex -27.04752841003329 188.82097856533326 -62.20000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -27.393938571547096 189.02097856533325 -62.20000000000009
+ vertex -32.64727067122623 192.0539912672253 -62.10000000000009
+ vertex -27.04752841003329 188.82097856533326 -62.20000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -21.158555664299303 185.4209785653328 -43.00000000000008
+ vertex -20.812145502785523 185.2209785653328 -43.00000000000009
+ vertex -21.15855566429926 185.4209785653329 -44.40000000000008
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -17.70667407651493 183.42803380141493 -43.25451867793758
+ vertex -21.15855566429926 185.4209785653329 -44.40000000000008
+ vertex -20.812145502785523 185.2209785653328 -43.00000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -17.34804388764772 183.22097856533296 -43.20000000000008
+ vertex -17.70667407651493 183.42803380141493 -43.25451867793758
+ vertex -20.812145502785523 185.2209785653328 -43.00000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -15.558813403106363 182.18796586344075 -43.1000000000001
+ vertex -17.34804388764772 183.22097856533296 -43.20000000000008
+ vertex -20.812145502785523 185.2209785653328 -43.00000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -18.040864210675263 183.62097856533293 -43.414359353944974
+ vertex -21.15855566429926 185.4209785653329 -44.40000000000008
+ vertex -17.70667407651493 183.42803380141493 -43.25451867793758
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -18.327839784760986 183.78666399028216 -43.66862915010161
+ vertex -21.15855566429926 185.4209785653329 -44.40000000000008
+ vertex -18.040864210675263 183.62097856533293 -43.414359353944974
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -18.548043887647765 183.91379888836047 -44.000000000000085
+ vertex -21.15855566429926 185.4209785653329 -44.40000000000008
+ vertex -18.327839784760986 183.78666399028216 -43.66862915010161
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -18.686469973628217 183.99371922636428 -44.38588952783605
+ vertex -21.15855566429926 185.4209785653329 -44.40000000000008
+ vertex -18.548043887647765 183.91379888836047 -44.000000000000085
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -19.253299775973456 184.32097856533298 -44.40000000000009
+ vertex -21.15855566429926 185.4209785653329 -44.40000000000008
+ vertex -18.686469973628217 183.99371922636428 -44.38588952783605
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -18.733684533702807 184.020978565333 -44.800000000000104
+ vertex -19.253299775973456 184.32097856533298 -44.40000000000009
+ vertex -18.686469973628217 183.99371922636428 -44.38588952783605
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -19.253299775973435 184.32097856533298 -46.434314575050855
+ vertex -19.253299775973456 184.32097856533298 -44.40000000000009
+ vertex -18.733684533702807 184.020978565333 -44.800000000000104
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -18.68646997362817 183.99371922636428 -45.21411047216414
+ vertex -19.253299775973435 184.32097856533298 -46.434314575050855
+ vertex -18.733684533702807 184.020978565333 -44.800000000000104
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -18.548043887647673 183.9137988883606 -45.6000000000001
+ vertex -19.253299775973435 184.32097856533298 -46.434314575050855
+ vertex -18.68646997362817 183.99371922636428 -45.21411047216414
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -18.327839784760965 183.78666399028225 -45.93137084989857
+ vertex -19.253299775973435 184.32097856533298 -46.434314575050855
+ vertex -18.548043887647673 183.9137988883606 -45.6000000000001
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -18.040864210675217 183.620978565333 -46.18564064605519
+ vertex -19.253299775973435 184.32097856533298 -46.434314575050855
+ vertex -18.327839784760965 183.78666399028225 -45.93137084989857
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -17.706674076514883 183.42803380141498 -46.345481322062604
+ vertex -19.253299775973435 184.32097856533298 -46.434314575050855
+ vertex -18.040864210675217 183.620978565333 -46.18564064605519
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -17.348043887647652 183.22097856533298 -46.40000000000008
+ vertex -19.253299775973435 184.32097856533298 -46.434314575050855
+ vertex -17.706674076514883 183.42803380141498 -46.345481322062604
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -17.00163372613387 183.02097856533308 -47.00000000000008
+ vertex -15.789198160835587 182.3209785653332 -48.80000000000008
+ vertex -17.001633726133825 183.02097856533314 -49.200000000000074
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -15.789198160835609 182.3209785653332 -49.20000000000008
+ vertex -17.001633726133825 183.02097856533314 -49.200000000000074
+ vertex -15.789198160835587 182.3209785653332 -48.80000000000008
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -15.558813403106363 182.18796586344075 -43.1000000000001
+ vertex -15.472297099368534 182.13801565218847 -43.34118095489759
+ vertex -17.34804388764772 183.22097856533296 -43.20000000000008
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -16.989413698780513 183.01392332925096 -43.254518677937554
+ vertex -17.34804388764772 183.22097856533296 -43.20000000000008
+ vertex -15.472297099368534 182.13801565218847 -43.34118095489759
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -16.655223564620155 182.8209785653329 -43.414359353944974
+ vertex -16.989413698780513 183.01392332925096 -43.254518677937554
+ vertex -15.472297099368534 182.13801565218847 -43.34118095489759
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -15.442787999321872 182.12097856533305 -43.6000000000001
+ vertex -16.655223564620155 182.8209785653329 -43.414359353944974
+ vertex -15.472297099368534 182.13801565218847 -43.34118095489759
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -16.36824799053443 182.6552931403837 -43.66862915010159
+ vertex -16.655223564620155 182.8209785653329 -43.414359353944974
+ vertex -15.442787999321872 182.12097856533305 -43.6000000000001
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -16.148043887647678 182.52815824230547 -44.00000000000006
+ vertex -16.36824799053443 182.6552931403837 -43.66862915010159
+ vertex -15.442787999321872 182.12097856533305 -43.6000000000001
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -16.009617801667133 182.4482379043018 -44.38588952783603
+ vertex -16.148043887647678 182.52815824230547 -44.00000000000006
+ vertex -15.442787999321872 182.12097856533305 -43.6000000000001
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -15.442787999321826 182.12097856533316 -48.80000000000009
+ vertex -16.009617801667133 182.4482379043018 -44.38588952783603
+ vertex -15.442787999321872 182.12097856533305 -43.6000000000001
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -15.962403241592522 182.4209785653331 -44.80000000000006
+ vertex -16.009617801667133 182.4482379043018 -44.38588952783603
+ vertex -15.442787999321826 182.12097856533316 -48.80000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -16.009617801667133 182.44823790430183 -45.214110472164094
+ vertex -15.962403241592522 182.4209785653331 -44.80000000000006
+ vertex -15.442787999321826 182.12097856533316 -48.80000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -16.14804388764763 182.52815824230547 -45.60000000000008
+ vertex -16.009617801667133 182.44823790430183 -45.214110472164094
+ vertex -15.442787999321826 182.12097856533316 -48.80000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -16.36824799053434 182.65529314038386 -45.93137084989855
+ vertex -16.14804388764763 182.52815824230547 -45.60000000000008
+ vertex -15.442787999321826 182.12097856533316 -48.80000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -16.655223564620087 182.82097856533304 -46.18564064605519
+ vertex -16.36824799053434 182.65529314038386 -45.93137084989855
+ vertex -15.442787999321826 182.12097856533316 -48.80000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -16.9894136987804 183.013923329251 -46.34548132206258
+ vertex -16.655223564620087 182.82097856533304 -46.18564064605519
+ vertex -15.442787999321826 182.12097856533316 -48.80000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -17.348043887647652 183.22097856533298 -46.40000000000008
+ vertex -16.9894136987804 183.013923329251 -46.34548132206258
+ vertex -15.442787999321826 182.12097856533316 -48.80000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -17.00163372613387 183.02097856533308 -47.00000000000008
+ vertex -17.348043887647652 183.22097856533298 -46.40000000000008
+ vertex -15.442787999321826 182.12097856533316 -48.80000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -19.253299775973435 184.32097856533298 -46.434314575050855
+ vertex -17.348043887647652 183.22097856533298 -46.40000000000008
+ vertex -17.00163372613387 183.02097856533308 -47.00000000000008
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -18.763401827416754 184.03813585285843 -47.00000000000008
+ vertex -19.253299775973435 184.32097856533298 -46.434314575050855
+ vertex -17.00163372613387 183.02097856533308 -47.00000000000008
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -15.789198160835587 182.3209785653332 -48.80000000000008
+ vertex -17.00163372613387 183.02097856533308 -47.00000000000008
+ vertex -15.442787999321826 182.12097856533316 -48.80000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -29.519614100704672 190.24823790430136 -44.38588952783607
+ vertex -28.952784298359386 189.92097856533263 -44.40000000000007
+ vertex -29.47239954063004 190.22097856533262 -44.800000000000104
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -28.952784298359365 189.92097856533272 -46.434314575050806
+ vertex -29.47239954063004 190.22097856533262 -44.800000000000104
+ vertex -28.952784298359386 189.92097856533263 -44.40000000000007
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -29.519614100704626 190.24823790430136 -45.21411047216414
+ vertex -29.47239954063004 190.22097856533262 -44.800000000000104
+ vertex -28.952784298359365 189.92097856533272 -46.434314575050806
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -29.658040186685124 190.3281582423051 -45.6000000000001
+ vertex -29.519614100704626 190.24823790430136 -45.21411047216414
+ vertex -28.952784298359365 189.92097856533272 -46.434314575050806
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -29.878244289571878 190.4552931403834 -45.93137084989857
+ vertex -29.658040186685124 190.3281582423051 -45.6000000000001
+ vertex -28.952784298359365 189.92097856533272 -46.434314575050806
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -30.16521986365756 190.6209785653327 -46.18564064605521
+ vertex -29.878244289571878 190.4552931403834 -45.93137084989857
+ vertex -28.952784298359365 189.92097856533272 -46.434314575050806
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -30.499409997817892 190.81392332925068 -46.345481322062625
+ vertex -30.16521986365756 190.6209785653327 -46.18564064605521
+ vertex -28.952784298359365 189.92097856533272 -46.434314575050806
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -30.858040186685145 191.02097856533257 -46.40000000000013
+ vertex -30.499409997817892 190.81392332925068 -46.345481322062625
+ vertex -28.952784298359365 189.92097856533272 -46.434314575050806
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -31.897270671226583 191.62097856533254 -42.600000000000065
+ vertex -27.393938571547345 189.02097856533265 -42.60000000000007
+ vertex -32.12141453926859 191.75038808788375 -42.63407417371101
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -27.393938571547366 189.02097856533257 -43.00000000000007
+ vertex -32.12141453926859 191.75038808788375 -42.63407417371101
+ vertex -27.393938571547345 189.02097856533265 -42.60000000000007
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.33028337311875 191.87097856533256 -42.73397459621563
+ vertex -32.12141453926859 191.75038808788375 -42.63407417371101
+ vertex -27.393938571547366 189.02097856533257 -43.00000000000007
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.509643106922326 191.9745319559258 -42.89289321881352
+ vertex -32.33028337311875 191.87097856533256 -42.73397459621563
+ vertex -27.393938571547366 189.02097856533257 -43.00000000000007
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.64727067122652 192.05399126722477 -43.100000000000065
+ vertex -32.509643106922326 191.9745319559258 -42.89289321881352
+ vertex -27.393938571547366 189.02097856533257 -43.00000000000007
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -27.04752841003356 188.8209785653326 -43.00000000000007
+ vertex -32.64727067122652 192.05399126722477 -43.100000000000065
+ vertex -27.393938571547366 189.02097856533257 -43.00000000000007
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -30.858040186685212 191.02097856533263 -43.20000000000011
+ vertex -32.64727067122652 192.05399126722477 -43.100000000000065
+ vertex -27.04752841003356 188.8209785653326 -43.00000000000007
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -30.49940999781798 190.81392332925054 -43.254518677937604
+ vertex -30.858040186685212 191.02097856533263 -43.20000000000011
+ vertex -27.04752841003356 188.8209785653326 -43.00000000000007
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -27.047528410033582 188.82097856533272 -44.40000000000007
+ vertex -30.49940999781798 190.81392332925054 -43.254518677937604
+ vertex -27.04752841003356 188.8209785653326 -43.00000000000007
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -30.165219863657626 190.62097856533256 -43.414359353944995
+ vertex -30.49940999781798 190.81392332925054 -43.254518677937604
+ vertex -27.047528410033582 188.82097856533272 -44.40000000000007
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -29.8782442895719 190.45529314038336 -43.66862915010161
+ vertex -30.165219863657626 190.62097856533256 -43.414359353944995
+ vertex -27.047528410033582 188.82097856533272 -44.40000000000007
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -29.65804018668519 190.32815824230505 -44.00000000000011
+ vertex -29.8782442895719 190.45529314038336 -43.66862915010161
+ vertex -27.047528410033582 188.82097856533272 -44.40000000000007
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -29.519614100704672 190.24823790430136 -44.38588952783607
+ vertex -29.65804018668519 190.32815824230505 -44.00000000000011
+ vertex -27.047528410033582 188.82097856533272 -44.40000000000007
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -28.952784298359386 189.92097856533263 -44.40000000000007
+ vertex -29.519614100704672 190.24823790430136 -44.38588952783607
+ vertex -27.047528410033582 188.82097856533272 -44.40000000000007
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -16.308813403106395 182.62097856533293 -42.60000000000009
+ vertex -16.084669535064364 182.4915690427817 -42.63407417371102
+ vertex -20.812145502785523 185.2209785653329 -42.600000000000094
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -20.812145502785523 185.2209785653328 -43.00000000000009
+ vertex -20.812145502785523 185.2209785653329 -42.600000000000094
+ vertex -16.084669535064364 182.4915690427817 -42.63407417371102
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -15.875800701214178 182.370978565333 -42.73397459621565
+ vertex -20.812145502785523 185.2209785653328 -43.00000000000009
+ vertex -16.084669535064364 182.4915690427817 -42.63407417371102
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -15.696440967410565 182.26742517473969 -42.89289321881353
+ vertex -20.812145502785523 185.2209785653328 -43.00000000000009
+ vertex -15.875800701214178 182.370978565333 -42.73397459621565
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -15.558813403106363 182.18796586344075 -43.1000000000001
+ vertex -20.812145502785523 185.2209785653328 -43.00000000000009
+ vertex -15.696440967410565 182.26742517473969 -42.89289321881353
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.64727067122652 192.05399126722477 -43.100000000000065
+ vertex -30.858040186685212 191.02097856533263 -43.20000000000011
+ vertex -32.73378697496435 192.10394147847708 -43.34118095489755
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -31.216670375552443 191.22803380141454 -43.2545186779376
+ vertex -32.73378697496435 192.10394147847708 -43.34118095489755
+ vertex -30.858040186685212 191.02097856533263 -43.20000000000011
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -31.550860509712756 191.42097856533258 -43.414359353945
+ vertex -32.73378697496435 192.10394147847708 -43.34118095489755
+ vertex -31.216670375552443 191.22803380141454 -43.2545186779376
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.76329607501097 192.1209785653325 -43.600000000000065
+ vertex -32.73378697496435 192.10394147847708 -43.34118095489755
+ vertex -31.550860509712756 191.42097856533258 -43.414359353945
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -31.837836083798525 191.58666399028175 -43.668629150101616
+ vertex -32.76329607501097 192.1209785653325 -43.600000000000065
+ vertex -31.550860509712756 191.42097856533258 -43.414359353945
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.058040186685254 191.71379888836003 -44.000000000000114
+ vertex -32.76329607501097 192.1209785653325 -43.600000000000065
+ vertex -31.837836083798525 191.58666399028175 -43.668629150101616
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.19646627266571 191.7937192263638 -44.38588952783608
+ vertex -32.76329607501097 192.1209785653325 -43.600000000000065
+ vertex -32.058040186685254 191.71379888836003 -44.000000000000114
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.76329607501086 192.12097856533268 -48.80000000000003
+ vertex -32.76329607501097 192.1209785653325 -43.600000000000065
+ vertex -32.19646627266571 191.7937192263638 -44.38588952783608
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.243680832740345 191.82097856533252 -44.80000000000011
+ vertex -32.76329607501086 192.12097856533268 -48.80000000000003
+ vertex -32.19646627266571 191.7937192263638 -44.38588952783608
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.19646627266567 191.79371922636386 -45.214110472164144
+ vertex -32.76329607501086 192.12097856533268 -48.80000000000003
+ vertex -32.243680832740345 191.82097856533252 -44.80000000000011
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.05804018668523 191.7137988883601 -45.60000000000011
+ vertex -32.76329607501086 192.12097856533268 -48.80000000000003
+ vertex -32.19646627266567 191.79371922636386 -45.214110472164144
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -31.837836083798436 191.58666399028183 -45.93137084989858
+ vertex -32.76329607501086 192.12097856533268 -48.80000000000003
+ vertex -32.05804018668523 191.7137988883601 -45.60000000000011
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -31.55086050971271 191.42097856533266 -46.18564064605523
+ vertex -32.76329607501086 192.12097856533268 -48.80000000000003
+ vertex -31.837836083798436 191.58666399028183 -45.93137084989858
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -31.21667037555242 191.2280338014146 -46.345481322062625
+ vertex -32.76329607501086 192.12097856533268 -48.80000000000003
+ vertex -31.55086050971271 191.42097856533266 -46.18564064605523
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -30.858040186685145 191.02097856533257 -46.40000000000013
+ vertex -32.76329607501086 192.12097856533268 -48.80000000000003
+ vertex -31.21667037555242 191.2280338014146 -46.345481322062625
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -31.204450348198904 191.2209785653327 -47.00000000000007
+ vertex -32.76329607501086 192.12097856533268 -48.80000000000003
+ vertex -30.858040186685145 191.02097856533257 -46.40000000000013
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -28.952784298359365 189.92097856533272 -46.434314575050806
+ vertex -31.204450348198904 191.2209785653327 -47.00000000000007
+ vertex -30.858040186685145 191.02097856533257 -46.40000000000013
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.4168859134971 191.92097856533272 -48.80000000000003
+ vertex -32.76329607501086 192.12097856533268 -48.80000000000003
+ vertex -31.204450348198904 191.2209785653327 -47.00000000000007
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -31.204450348198883 191.22097856533276 -49.20000000000007
+ vertex -32.4168859134971 191.92097856533272 -48.80000000000003
+ vertex -31.204450348198904 191.2209785653327 -47.00000000000007
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.4168859134971 191.9209785653327 -49.20000000000003
+ vertex -32.4168859134971 191.92097856533272 -48.80000000000003
+ vertex -31.204450348198883 191.22097856533276 -49.20000000000007
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -21.388645991720363 185.5538212778079 -56.30000000000007
+ vertex -26.817438082612004 188.6881358528584 -56.300000000000075
+ vertex -27.307336031168706 188.97097856533304 -55.734314575050846
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -29.442682246915794 190.20382127780772 -58.20000000000009
+ vertex -27.307336031168706 188.97097856533304 -55.734314575050846
+ vertex -26.817438082612004 188.6881358528584 -56.300000000000075
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -28.952784298359116 189.9209785653331 -58.76568542494932
+ vertex -29.442682246915794 190.20382127780772 -58.20000000000009
+ vertex -26.817438082612004 188.6881358528584 -56.300000000000075
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -32.41688591349703 191.92097856533286 -56.00000000000008
+ vertex -31.204450348198748 191.22097856533293 -56.00000000000009
+ vertex -32.416885913496984 191.92097856533292 -56.40000000000008
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -31.204450348198748 191.22097856533298 -58.20000000000009
+ vertex -32.416885913496984 191.92097856533292 -56.40000000000008
+ vertex -31.204450348198748 191.22097856533293 -56.00000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -24.103042037166343 187.12097856533296 -49.90000000000009
+ vertex -24.708230480879788 187.47038427622132 -49.99200026901961
+ vertex -27.30733603116882 188.97097856533284 -49.46568542494934
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -25.272176332275354 187.79597856533294 -50.26173140978212
+ vertex -27.30733603116882 188.97097856533284 -49.46568542494934
+ vertex -24.708230480879788 187.47038427622132 -49.99200026901961
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -25.756447613545006 188.07557271993477 -50.690811690796394
+ vertex -27.30733603116882 188.97097856533284 -49.46568542494934
+ vertex -25.272176332275354 187.79597856533294 -50.26173140978212
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -26.128042037166377 188.29011286044195 -51.25000000000008
+ vertex -27.30733603116882 188.97097856533284 -49.46568542494934
+ vertex -25.756447613545006 188.07557271993477 -50.690811690796394
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -26.36163605725845 188.42497843082322 -51.901188578223284
+ vertex -27.30733603116882 188.97097856533284 -49.46568542494934
+ vertex -26.128042037166377 188.29011286044195 -51.25000000000008
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -27.307336031168706 188.97097856533304 -55.734314575050846
+ vertex -27.30733603116882 188.97097856533284 -49.46568542494934
+ vertex -26.36163605725845 188.42497843082322 -51.901188578223284
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -26.44131062738434 188.47097856533296 -52.60000000000009
+ vertex -27.307336031168706 188.97097856533304 -55.734314575050846
+ vertex -26.36163605725845 188.42497843082322 -51.901188578223284
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -26.36163605725843 188.42497843082322 -53.29881142177688
+ vertex -27.307336031168706 188.97097856533304 -55.734314575050846
+ vertex -26.44131062738434 188.47097856533296 -52.60000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -26.12804203716631 188.29011286044204 -53.950000000000095
+ vertex -27.307336031168706 188.97097856533304 -55.734314575050846
+ vertex -26.36163605725843 188.42497843082322 -53.29881142177688
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -25.756447613544914 188.0755727199349 -54.50918830920377
+ vertex -27.307336031168706 188.97097856533304 -55.734314575050846
+ vertex -26.12804203716631 188.29011286044204 -53.950000000000095
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -25.272176332275286 187.79597856533303 -54.93826859021806
+ vertex -27.307336031168706 188.97097856533304 -55.734314575050846
+ vertex -25.756447613544914 188.0755727199349 -54.50918830920377
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -24.708230480879674 187.47038427622155 -55.20799973098057
+ vertex -27.307336031168706 188.97097856533304 -55.734314575050846
+ vertex -25.272176332275286 187.79597856533303 -54.93826859021806
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -24.103042037166208 187.1209785653331 -55.30000000000008
+ vertex -27.307336031168706 188.97097856533304 -55.734314575050846
+ vertex -24.708230480879674 187.47038427622155 -55.20799973098057
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -20.8987480431638 185.2709785653332 -55.734314575050796
+ vertex -27.307336031168706 188.97097856533304 -55.734314575050846
+ vertex -24.103042037166208 187.1209785653331 -55.30000000000008
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -21.388645991720363 185.5538212778079 -56.30000000000007
+ vertex -27.307336031168706 188.97097856533304 -55.734314575050846
+ vertex -20.8987480431638 185.2709785653332 -55.734314575050796
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -18.763401827416597 184.03813585285874 -58.200000000000074
+ vertex -21.388645991720363 185.5538212778079 -56.30000000000007
+ vertex -20.8987480431638 185.2709785653332 -55.734314575050796
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -19.253299775973254 184.32097856533338 -58.76568542494933
+ vertex -21.388645991720363 185.5538212778079 -56.30000000000007
+ vertex -18.763401827416597 184.03813585285874 -58.200000000000074
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -17.00163372613369 183.02097856533345 -58.200000000000074
+ vertex -19.253299775973254 184.32097856533338 -58.76568542494933
+ vertex -18.763401827416597 184.03813585285874 -58.200000000000074
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -21.158555664299012 185.4209785653334 -60.80000000000006
+ vertex -19.253299775973186 184.3209785653334 -60.80000000000007
+ vertex -21.158555664298987 185.42097856533343 -62.20000000000008
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -18.6864699736279 183.99371922636468 -60.814110472164124
+ vertex -21.158555664298987 185.42097856533343 -62.20000000000008
+ vertex -19.253299775973186 184.3209785653334 -60.80000000000007
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -18.54804388764747 183.91379888836101 -61.20000000000009
+ vertex -21.158555664298987 185.42097856533343 -62.20000000000008
+ vertex -18.6864699736279 183.99371922636468 -60.814110472164124
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -18.32783978476067 183.7866639902828 -61.531370849898586
+ vertex -21.158555664298987 185.42097856533343 -62.20000000000008
+ vertex -18.54804388764747 183.91379888836101 -61.20000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -18.040864210674947 183.62097856533347 -61.7856406460552
+ vertex -21.158555664298987 185.42097856533343 -62.20000000000008
+ vertex -18.32783978476067 183.7866639902828 -61.531370849898586
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -17.706674076514588 183.42803380141552 -61.94548132206259
+ vertex -21.158555664298987 185.42097856533343 -62.20000000000008
+ vertex -18.040864210674947 183.62097856533347 -61.7856406460552
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -17.34804388764736 183.22097856533352 -62.00000000000009
+ vertex -21.158555664298987 185.42097856533343 -62.20000000000008
+ vertex -17.706674076514588 183.42803380141552 -61.94548132206259
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -15.558813403106026 182.18796586344138 -62.1000000000001
+ vertex -21.158555664298987 185.42097856533343 -62.20000000000008
+ vertex -17.34804388764736 183.22097856533352 -62.00000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -20.812145502785185 185.22097856533344 -62.20000000000009
+ vertex -21.158555664298987 185.42097856533343 -62.20000000000008
+ vertex -15.558813403106026 182.18796586344138 -62.1000000000001
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -15.696440967410249 182.26742517474028 -62.307106781186654
+ vertex -20.812145502785185 185.22097856533344 -62.20000000000009
+ vertex -15.558813403106026 182.18796586344138 -62.1000000000001
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -20.812145502785206 185.22097856533344 -62.60000000000009
+ vertex -20.812145502785185 185.22097856533344 -62.20000000000009
+ vertex -15.696440967410249 182.26742517474028 -62.307106781186654
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -15.875800701213794 182.37097856533364 -62.466025403784535
+ vertex -20.812145502785206 185.22097856533344 -62.60000000000009
+ vertex -15.696440967410249 182.26742517474028 -62.307106781186654
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -16.084669535064027 182.49156904278234 -62.56592582628915
+ vertex -20.812145502785206 185.22097856533344 -62.60000000000009
+ vertex -15.875800701213794 182.37097856533364 -62.466025403784535
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -16.308813403106058 182.6209785653336 -62.60000000000009
+ vertex -20.812145502785206 185.22097856533344 -62.60000000000009
+ vertex -16.084669535064027 182.49156904278234 -62.56592582628915
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -17.00163372613369 183.02097856533337 -56.00000000000008
+ vertex -15.78919816083545 182.32097856533338 -56.000000000000114
+ vertex -17.00163372613369 183.02097856533345 -58.200000000000074
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -15.78919816083545 182.32097856533338 -56.40000000000011
+ vertex -17.00163372613369 183.02097856533345 -58.200000000000074
+ vertex -15.78919816083545 182.32097856533338 -56.000000000000114
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -15.442787999321691 182.12097856533347 -56.40000000000011
+ vertex -17.00163372613369 183.02097856533345 -58.200000000000074
+ vertex -15.78919816083545 182.32097856533338 -56.40000000000011
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -16.14804388764743 182.52815824230586 -59.60000000000007
+ vertex -17.00163372613369 183.02097856533345 -58.200000000000074
+ vertex -15.442787999321691 182.12097856533347 -56.40000000000011
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -16.00961780166693 182.44823790430226 -59.98588952783604
+ vertex -16.14804388764743 182.52815824230586 -59.60000000000007
+ vertex -15.442787999321691 182.12097856533347 -56.40000000000011
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -15.44278799932158 182.12097856533364 -61.6000000000001
+ vertex -16.00961780166693 182.44823790430226 -59.98588952783604
+ vertex -15.442787999321691 182.12097856533347 -56.40000000000011
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -16.368247990534137 182.65529314038423 -59.2686291501016
+ vertex -17.00163372613369 183.02097856533345 -58.200000000000074
+ vertex -16.14804388764743 182.52815824230586 -59.60000000000007
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -16.655223564619863 182.82097856533343 -59.01435935394496
+ vertex -17.00163372613369 183.02097856533345 -58.200000000000074
+ vertex -16.368247990534137 182.65529314038423 -59.2686291501016
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -16.98941369878022 183.0139233292514 -58.85451867793757
+ vertex -17.00163372613369 183.02097856533345 -58.200000000000074
+ vertex -16.655223564619863 182.82097856533343 -59.01435935394496
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -17.34804388764747 183.2209785653335 -58.800000000000075
+ vertex -17.00163372613369 183.02097856533345 -58.200000000000074
+ vertex -16.98941369878022 183.0139233292514 -58.85451867793757
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -19.253299775973254 184.32097856533338 -58.76568542494933
+ vertex -17.00163372613369 183.02097856533345 -58.200000000000074
+ vertex -17.34804388764747 183.2209785653335 -58.800000000000075
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -15.96240324159232 182.42097856533348 -60.40000000000007
+ vertex -16.00961780166693 182.44823790430226 -59.98588952783604
+ vertex -15.44278799932158 182.12097856533364 -61.6000000000001
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -16.009617801666863 182.44823790430226 -60.8141104721641
+ vertex -15.96240324159232 182.42097856533348 -60.40000000000007
+ vertex -15.44278799932158 182.12097856533364 -61.6000000000001
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -16.14804388764743 182.52815824230598 -61.20000000000007
+ vertex -16.009617801666863 182.44823790430226 -60.8141104721641
+ vertex -15.44278799932158 182.12097856533364 -61.6000000000001
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -16.36824799053407 182.6552931403843 -61.531370849898536
+ vertex -16.14804388764743 182.52815824230598 -61.20000000000007
+ vertex -15.44278799932158 182.12097856533364 -61.6000000000001
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -16.655223564619817 182.82097856533352 -61.78564064605518
+ vertex -16.36824799053407 182.6552931403843 -61.531370849898536
+ vertex -15.44278799932158 182.12097856533364 -61.6000000000001
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -15.472297099368218 182.13801565218895 -61.858819045102614
+ vertex -16.655223564619817 182.82097856533352 -61.78564064605518
+ vertex -15.44278799932158 182.12097856533364 -61.6000000000001
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -16.98941369878013 183.01392332925155 -61.94548132206259
+ vertex -16.655223564619817 182.82097856533352 -61.78564064605518
+ vertex -15.472297099368218 182.13801565218895 -61.858819045102614
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -15.558813403106026 182.18796586344138 -62.1000000000001
+ vertex -16.98941369878013 183.01392332925155 -61.94548132206259
+ vertex -15.472297099368218 182.13801565218895 -61.858819045102614
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -17.34804388764736 183.22097856533352 -62.00000000000009
+ vertex -16.98941369878013 183.01392332925155 -61.94548132206259
+ vertex -15.558813403106026 182.18796586344138 -62.1000000000001
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -17.34804388764747 183.2209785653335 -58.800000000000075
+ vertex -17.7066740765147 183.42803380141538 -58.85451867793757
+ vertex -19.253299775973254 184.32097856533338 -58.76568542494933
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -18.040864210674993 183.62097856533347 -59.01435935394498
+ vertex -19.253299775973254 184.32097856533338 -58.76568542494933
+ vertex -17.7066740765147 183.42803380141538 -58.85451867793757
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -18.327839784760762 183.78666399028262 -59.268629150101624
+ vertex -19.253299775973254 184.32097856533338 -58.76568542494933
+ vertex -18.040864210674993 183.62097856533347 -59.01435935394498
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -18.54804388764747 183.91379888836096 -59.600000000000094
+ vertex -19.253299775973254 184.32097856533338 -58.76568542494933
+ vertex -18.327839784760762 183.78666399028262 -59.268629150101624
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -19.253299775973186 184.3209785653334 -60.80000000000007
+ vertex -19.253299775973254 184.32097856533338 -58.76568542494933
+ vertex -18.54804388764747 183.91379888836096 -59.600000000000094
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -18.686469973627926 183.99371922636473 -59.98588952783606
+ vertex -19.253299775973186 184.3209785653334 -60.80000000000007
+ vertex -18.54804388764747 183.91379888836096 -59.600000000000094
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -18.73368453370258 184.0209785653334 -60.40000000000009
+ vertex -19.253299775973186 184.3209785653334 -60.80000000000007
+ vertex -18.686469973627926 183.99371922636473 -59.98588952783606
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -18.6864699736279 183.99371922636468 -60.814110472164124
+ vertex -19.253299775973186 184.3209785653334 -60.80000000000007
+ vertex -18.73368453370258 184.0209785653334 -60.40000000000009
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -26.81743808261221 188.68813585285818 -48.90000000000006
+ vertex -29.442682246915975 190.20382127780732 -47.00000000000008
+ vertex -28.952784298359365 189.92097856533272 -46.434314575050806
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -31.204450348198904 191.2209785653327 -47.00000000000007
+ vertex -28.952784298359365 189.92097856533272 -46.434314575050806
+ vertex -29.442682246915975 190.20382127780732 -47.00000000000008
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -27.30733603116882 188.97097856533284 -49.46568542494934
+ vertex -29.442682246915975 190.20382127780732 -47.00000000000008
+ vertex -26.81743808261221 188.68813585285818 -48.90000000000006
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -21.38864599172057 185.5538212778076 -48.900000000000105
+ vertex -27.30733603116882 188.97097856533284 -49.46568542494934
+ vertex -26.81743808261221 188.68813585285818 -48.90000000000006
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -20.898748043163867 185.27097856533302 -49.465685424949335
+ vertex -27.30733603116882 188.97097856533284 -49.46568542494934
+ vertex -21.38864599172057 185.5538212778076 -48.900000000000105
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -24.103042037166343 187.12097856533296 -49.90000000000009
+ vertex -27.30733603116882 188.97097856533284 -49.46568542494934
+ vertex -20.898748043163867 185.27097856533302 -49.465685424949335
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -23.4978535934529 186.77157285444457 -49.9920002690196
+ vertex -24.103042037166343 187.12097856533296 -49.90000000000009
+ vertex -20.898748043163867 185.27097856533302 -49.465685424949335
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -22.933907742057333 186.44597856533304 -50.26173140978211
+ vertex -23.4978535934529 186.77157285444457 -49.9920002690196
+ vertex -20.898748043163867 185.27097856533302 -49.465685424949335
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -22.449636460787655 186.16638441073113 -50.690811690796394
+ vertex -22.933907742057333 186.44597856533304 -50.26173140978211
+ vertex -20.898748043163867 185.27097856533302 -49.465685424949335
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -22.078042037166306 185.95184427022406 -51.25000000000008
+ vertex -22.449636460787655 186.16638441073113 -50.690811690796394
+ vertex -20.898748043163867 185.27097856533302 -49.465685424949335
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -21.84444801707419 185.81697869984285 -51.90118857822331
+ vertex -22.078042037166306 185.95184427022406 -51.25000000000008
+ vertex -20.898748043163867 185.27097856533302 -49.465685424949335
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -20.8987480431638 185.2709785653332 -55.734314575050796
+ vertex -21.84444801707419 185.81697869984285 -51.90118857822331
+ vertex -20.898748043163867 185.27097856533302 -49.465685424949335
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -21.764773446948276 185.77097856533308 -52.60000000000011
+ vertex -21.84444801707419 185.81697869984285 -51.90118857822331
+ vertex -20.8987480431638 185.2709785653332 -55.734314575050796
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -21.844448017074168 185.81697869984293 -53.298811421776925
+ vertex -21.764773446948276 185.77097856533308 -52.60000000000011
+ vertex -20.8987480431638 185.2709785653332 -55.734314575050796
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -22.078042037166238 185.95184427022414 -53.95000000000012
+ vertex -21.844448017074168 185.81697869984293 -53.298811421776925
+ vertex -20.8987480431638 185.2709785653332 -55.734314575050796
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -22.449636460787566 186.16638441073135 -54.50918830920379
+ vertex -22.078042037166238 185.95184427022414 -53.95000000000012
+ vertex -20.8987480431638 185.2709785653332 -55.734314575050796
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -22.93390774205722 186.4459785653332 -54.93826859021808
+ vertex -22.449636460787566 186.16638441073135 -54.50918830920379
+ vertex -20.8987480431638 185.2709785653332 -55.734314575050796
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -23.497853593452785 186.77157285444477 -55.20799973098057
+ vertex -22.93390774205722 186.4459785653332 -54.93826859021808
+ vertex -20.8987480431638 185.2709785653332 -55.734314575050796
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -24.103042037166208 187.1209785653331 -55.30000000000008
+ vertex -23.497853593452785 186.77157285444477 -55.20799973098057
+ vertex -20.8987480431638 185.2709785653332 -55.734314575050796
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -19.253299775973435 184.32097856533298 -46.434314575050855
+ vertex -18.763401827416754 184.03813585285843 -47.00000000000008
+ vertex -21.38864599172057 185.5538212778076 -48.900000000000105
+ endloop
+endfacet
+facet normal 0.49999999999999944 0.866025403784439 2.9750497701033076e-16
+ outer loop
+ vertex -20.898748043163867 185.27097856533302 -49.465685424949335
+ vertex -21.38864599172057 185.5538212778076 -48.900000000000105
+ vertex -18.763401827416754 184.03813585285843 -47.00000000000008
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.970018574227152e-16
+ outer loop
+ vertex -167.34804388764675 -76.5866425699972 -58.80000000000016
+ vertex -167.70667407651396 -76.37958733391518 -58.854518677937655
+ vertex -166.9894136987795 -76.79369780607921 -58.854518677937655
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.970018574227152e-16
+ outer loop
+ vertex -166.65522356461918 -76.98664256999719 -59.01435935394505
+ vertex -166.9894136987795 -76.79369780607921 -58.854518677937655
+ vertex -167.70667407651396 -76.37958733391518 -58.854518677937655
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.970018574227152e-16
+ outer loop
+ vertex -168.0408642106743 -76.18664256999723 -59.014359353945075
+ vertex -166.65522356461918 -76.98664256999719 -59.01435935394505
+ vertex -167.70667407651396 -76.37958733391518 -58.854518677937655
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.970018574227152e-16
+ outer loop
+ vertex -166.36824799053343 -77.15232799494639 -59.26862915010169
+ vertex -166.65522356461918 -76.98664256999719 -59.01435935394505
+ vertex -168.0408642106743 -76.18664256999723 -59.014359353945075
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.970018574227152e-16
+ outer loop
+ vertex -168.32783978476002 -76.02095714504797 -59.26862915010171
+ vertex -166.36824799053343 -77.15232799494639 -59.26862915010169
+ vertex -168.0408642106743 -76.18664256999723 -59.014359353945075
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.970018574227152e-16
+ outer loop
+ vertex -166.14804388764668 -77.2794628930247 -59.600000000000165
+ vertex -166.36824799053343 -77.15232799494639 -59.26862915010169
+ vertex -168.32783978476002 -76.02095714504797 -59.26862915010171
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.970018574227152e-16
+ outer loop
+ vertex -168.54804388764674 -75.89382224696966 -59.600000000000186
+ vertex -166.14804388764668 -77.2794628930247 -59.600000000000165
+ vertex -168.32783978476002 -76.02095714504797 -59.26862915010171
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.970018574227152e-16
+ outer loop
+ vertex -166.0096178016662 -77.3593832310284 -59.98588952783613
+ vertex -166.14804388764668 -77.2794628930247 -59.600000000000165
+ vertex -168.54804388764674 -75.89382224696966 -59.600000000000186
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.970018574227152e-16
+ outer loop
+ vertex -168.68646997362725 -75.81390190896596 -59.98588952783615
+ vertex -166.0096178016662 -77.3593832310284 -59.98588952783613
+ vertex -168.54804388764674 -75.89382224696966 -59.600000000000186
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.970018574227152e-16
+ outer loop
+ vertex -165.96240324159157 -77.38664256999711 -60.40000000000016
+ vertex -166.0096178016662 -77.3593832310284 -59.98588952783613
+ vertex -168.68646997362725 -75.81390190896596 -59.98588952783615
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.970018574227152e-16
+ outer loop
+ vertex -168.73368453370182 -75.78664256999723 -60.40000000000018
+ vertex -165.96240324159157 -77.38664256999711 -60.40000000000016
+ vertex -168.68646997362725 -75.81390190896596 -59.98588952783615
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.970018574227152e-16
+ outer loop
+ vertex -166.0096178016662 -77.35938323102839 -60.814110472164195
+ vertex -165.96240324159157 -77.38664256999711 -60.40000000000016
+ vertex -168.73368453370182 -75.78664256999723 -60.40000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.970018574227152e-16
+ outer loop
+ vertex -168.68646997362723 -75.81390190896595 -60.81411047216422
+ vertex -166.0096178016662 -77.35938323102839 -60.814110472164195
+ vertex -168.73368453370182 -75.78664256999723 -60.40000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.970018574227152e-16
+ outer loop
+ vertex -166.14804388764665 -77.27946289302466 -61.20000000000016
+ vertex -166.0096178016662 -77.35938323102839 -60.814110472164195
+ vertex -168.68646997362723 -75.81390190896595 -60.81411047216422
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.970018574227152e-16
+ outer loop
+ vertex -168.5480438876467 -75.89382224696963 -61.20000000000018
+ vertex -166.14804388764665 -77.27946289302466 -61.20000000000016
+ vertex -168.68646997362723 -75.81390190896595 -60.81411047216422
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.970018574227152e-16
+ outer loop
+ vertex -166.36824799053338 -77.15232799494633 -61.53137084989863
+ vertex -166.14804388764665 -77.27946289302466 -61.20000000000016
+ vertex -168.5480438876467 -75.89382224696963 -61.20000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.970018574227152e-16
+ outer loop
+ vertex -168.32783978475996 -76.02095714504792 -61.53137084989868
+ vertex -166.36824799053338 -77.15232799494633 -61.53137084989863
+ vertex -168.5480438876467 -75.89382224696963 -61.20000000000018
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.970018574227152e-16
+ outer loop
+ vertex -166.6552235646191 -76.98664256999713 -61.78564064605527
+ vertex -166.36824799053338 -77.15232799494633 -61.53137084989863
+ vertex -168.32783978475996 -76.02095714504792 -61.53137084989868
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.970018574227152e-16
+ outer loop
+ vertex -168.04086421067421 -76.18664256999713 -61.78564064605529
+ vertex -166.6552235646191 -76.98664256999713 -61.78564064605527
+ vertex -168.32783978475996 -76.02095714504792 -61.53137084989868
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.970018574227152e-16
+ outer loop
+ vertex -166.9894136987794 -76.7936978060791 -61.94548132206268
+ vertex -166.6552235646191 -76.98664256999713 -61.78564064605527
+ vertex -168.04086421067421 -76.18664256999713 -61.78564064605529
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.970018574227152e-16
+ outer loop
+ vertex -167.70667407651388 -76.37958733391513 -61.94548132206268
+ vertex -166.9894136987794 -76.7936978060791 -61.94548132206268
+ vertex -168.04086421067421 -76.18664256999713 -61.78564064605529
+ endloop
+endfacet
+facet normal -0.49999999999999944 -0.866025403784439 -2.970018574227152e-16
+ outer loop
+ vertex -167.34804388764667 -76.58664256999714 -62.00000000000018
+ vertex -166.9894136987794 -76.7936978060791 -61.94548132206268
+ vertex -167.70667407651388 -76.37958733391513 -61.94548132206268
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -163.12500836434157 -90.25428566022323 -62.60000000000005
+ vertex -162.1125727990433 -89.20787549870951 -62.60000000000005
+ vertex -161.91257279904332 -89.55428566022329 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -162.1125727990433 -89.20787549870951 -62.60000000000005
+ vertex -163.12500836434157 -90.25428566022323 -62.60000000000005
+ vertex -164.12593720379286 -86.22966341140767 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -162.1125727990433 -89.20787549870951 -62.60000000000005
+ vertex -164.12593720379286 -86.22966341140767 -62.60000000000005
+ vertex -164.28577787980026 -85.8437738835717 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -162.1125727990433 -89.20787549870951 -62.60000000000005
+ vertex -164.28577787980026 -85.8437738835717 -62.60000000000005
+ vertex -165.232188041314 -84.0045433990304 -62.600000000000044
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -164.12593720379286 -86.22966341140767 -62.60000000000005
+ vertex -163.12500836434157 -90.25428566022323 -62.60000000000005
+ vertex -164.07141852585536 -86.64377388357171 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -164.07141852585536 -86.64377388357171 -62.60000000000005
+ vertex -163.12500836434157 -90.25428566022323 -62.60000000000005
+ vertex -164.12593720379283 -87.05788435573575 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -164.12593720379283 -87.05788435573575 -62.60000000000005
+ vertex -163.12500836434157 -90.25428566022323 -62.60000000000005
+ vertex -164.28577787980024 -87.44377388357172 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -164.28577787980024 -87.44377388357172 -62.60000000000005
+ vertex -163.12500836434157 -90.25428566022323 -62.60000000000005
+ vertex -164.54004767595688 -87.7751447334702 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -164.54004767595688 -87.7751447334702 -62.60000000000005
+ vertex -163.12500836434157 -90.25428566022323 -62.60000000000005
+ vertex -164.22500836434156 -88.34902977189748 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -164.54004767595688 -87.7751447334702 -62.60000000000005
+ vertex -164.22500836434156 -88.34902977189748 -62.60000000000005
+ vertex -164.87141852585535 -88.02941452962682 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -164.87141852585535 -88.02941452962682 -62.60000000000005
+ vertex -164.22500836434156 -88.34902977189748 -62.60000000000005
+ vertex -165.98677646562444 -89.36618705942284 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -164.87141852585535 -88.02941452962682 -62.60000000000005
+ vertex -165.98677646562444 -89.36618705942284 -62.60000000000005
+ vertex -165.25730805369133 -88.18925520563424 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -165.25730805369133 -88.18925520563424 -62.60000000000005
+ vertex -165.98677646562444 -89.36618705942284 -62.60000000000005
+ vertex -165.67141852585536 -88.24377388357172 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -165.67141852585536 -88.24377388357172 -62.60000000000005
+ vertex -165.98677646562444 -89.36618705942284 -62.60000000000005
+ vertex -166.08552899801936 -88.18925520563424 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -166.08552899801936 -88.18925520563424 -62.60000000000005
+ vertex -165.98677646562444 -89.36618705942284 -62.60000000000005
+ vertex -166.47141852585534 -88.02941452962685 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -166.47141852585534 -88.02941452962685 -62.60000000000005
+ vertex -165.98677646562444 -89.36618705942284 -62.60000000000005
+ vertex -166.80278937575383 -87.77514473347021 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -166.80278937575383 -87.77514473347021 -62.60000000000005
+ vertex -165.98677646562444 -89.36618705942284 -62.60000000000005
+ vertex -167.05705917191045 -87.44377388357175 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -158.67141852585536 -98.76812953655387 -62.60000000000005
+ vertex -158.62500836434157 -98.04851429428321 -62.60000000000005
+ vertex -158.28552899801937 -98.60828886054645 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -158.62500836434157 -98.04851429428321 -62.60000000000005
+ vertex -158.67141852585536 -98.76812953655387 -62.60000000000005
+ vertex -160.38677646562448 -99.06567158180859 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -160.38677646562448 -99.06567158180859 -62.60000000000005
+ vertex -158.67141852585536 -98.76812953655387 -62.60000000000005
+ vertex -159.00278937575385 -99.0223993327105 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -160.38677646562448 -99.06567158180859 -62.60000000000005
+ vertex -159.00278937575385 -99.0223993327105 -62.60000000000005
+ vertex -159.25705917191047 -99.35377018260897 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -160.38677646562448 -99.06567158180859 -62.60000000000005
+ vertex -159.25705917191047 -99.35377018260897 -62.60000000000005
+ vertex -159.41689984791785 -99.73965971044495 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -160.38677646562448 -99.06567158180859 -62.60000000000005
+ vertex -159.41689984791785 -99.73965971044495 -62.60000000000005
+ vertex -159.47141852585534 -100.15377018260898 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -160.38677646562448 -99.06567158180859 -62.60000000000005
+ vertex -159.47141852585534 -100.15377018260898 -62.60000000000005
+ vertex -159.41689984791785 -100.56788065477302 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -160.38677646562448 -99.06567158180859 -62.60000000000005
+ vertex -159.41689984791785 -100.56788065477302 -62.60000000000005
+ vertex -159.25705917191044 -100.95377018260898 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -155.26626221502494 -100.33418162204778 -62.60000000000005
+ vertex -157.96616263752958 -95.58966856747121 -62.60000000000005
+ vertex -155.36616263752956 -100.09300066715029 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -157.96616263752958 -95.58966856747121 -62.60000000000005
+ vertex -155.26626221502494 -100.33418162204778 -62.60000000000005
+ vertex -158.31257279904335 -95.78966856747121 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -158.31257279904335 -95.78966856747121 -62.60000000000005
+ vertex -155.26626221502494 -100.33418162204778 -62.60000000000005
+ vertex -155.232188041314 -100.59300066715029 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -158.31257279904335 -95.78966856747121 -62.60000000000005
+ vertex -155.232188041314 -100.59300066715029 -62.600000000000065
+ vertex -155.26626221502494 -100.85181971225282 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -158.31257279904335 -95.78966856747121 -62.60000000000005
+ vertex -155.26626221502494 -100.85181971225282 -62.600000000000065
+ vertex -155.36616263752956 -101.09300066715029 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -158.31257279904335 -95.78966856747121 -62.60000000000005
+ vertex -155.36616263752956 -101.09300066715029 -62.600000000000065
+ vertex -158.51257279904334 -95.44325840595744 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -158.51257279904334 -95.44325840595744 -62.60000000000005
+ vertex -155.36616263752956 -101.09300066715029 -62.600000000000065
+ vertex -156.48577787980025 -99.35377018260895 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -158.51257279904334 -95.44325840595744 -62.60000000000005
+ vertex -156.48577787980025 -99.35377018260895 -62.60000000000005
+ vertex -156.74004767595687 -99.02239933271049 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -158.51257279904334 -95.44325840595744 -62.60000000000005
+ vertex -156.74004767595687 -99.02239933271049 -62.60000000000005
+ vertex -159.72500836434156 -96.14325840595744 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -159.72500836434156 -96.14325840595744 -62.60000000000005
+ vertex -156.74004767595687 -99.02239933271049 -62.60000000000005
+ vertex -157.07141852585534 -98.76812953655386 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -159.72500836434156 -96.14325840595744 -62.60000000000005
+ vertex -157.07141852585534 -98.76812953655386 -62.60000000000005
+ vertex -157.45730805369132 -98.60828886054645 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -159.72500836434156 -96.14325840595744 -62.60000000000005
+ vertex -157.45730805369132 -98.60828886054645 -62.60000000000005
+ vertex -157.87141852585535 -98.55377018260896 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -159.72500836434156 -96.14325840595744 -62.60000000000005
+ vertex -157.87141852585535 -98.55377018260896 -62.60000000000005
+ vertex -158.28552899801937 -98.60828886054645 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -159.72500836434156 -96.14325840595744 -62.60000000000005
+ vertex -158.28552899801937 -98.60828886054645 -62.60000000000005
+ vertex -158.62500836434157 -98.04851429428321 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -171.32064530943393 -110.45902607093474 -62.60000000000005
+ vertex -167.01731320975483 -107.51261590942096 -62.60000000000005
+ vertex -166.81731320975484 -107.85902607093475 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -167.01731320975483 -107.51261590942096 -62.60000000000005
+ vertex -171.32064530943393 -110.45902607093474 -62.60000000000005
+ vertex -170.2500439749941 -109.08514103250742 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -167.01731320975483 -107.51261590942096 -62.60000000000005
+ vertex -170.2500439749941 -109.08514103250742 -62.60000000000005
+ vertex -169.99577417883745 -108.75377018260897 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -167.01731320975483 -107.51261590942096 -62.60000000000005
+ vertex -169.99577417883745 -108.75377018260897 -62.60000000000005
+ vertex -169.27615893656682 -107.20018034412274 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -169.27615893656682 -107.20018034412274 -62.60000000000005
+ vertex -169.99577417883745 -108.75377018260897 -62.60000000000005
+ vertex -169.83593350283007 -108.36788065477299 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -169.27615893656682 -107.20018034412274 -62.60000000000005
+ vertex -169.83593350283007 -108.36788065477299 -62.60000000000005
+ vertex -169.78141482489258 -107.95377018260895 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -169.27615893656682 -107.20018034412274 -62.60000000000005
+ vertex -169.78141482489258 -107.95377018260895 -62.60000000000005
+ vertex -169.83593350283007 -107.53965971044492 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -169.27615893656682 -107.20018034412274 -62.60000000000005
+ vertex -169.83593350283007 -107.53965971044492 -62.60000000000005
+ vertex -170.2933162240922 -105.43841224283983 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -170.2933162240922 -105.43841224283983 -62.60000000000005
+ vertex -169.83593350283007 -107.53965971044492 -62.60000000000005
+ vertex -169.99577417883748 -107.15377018260895 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -170.2933162240922 -105.43841224283983 -62.60000000000005
+ vertex -169.99577417883748 -107.15377018260895 -62.60000000000005
+ vertex -171.06605688512346 -105.23135700675783 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -170.2500439749941 -109.08514103250742 -62.60000000000005
+ vertex -171.32064530943393 -110.45902607093474 -62.60000000000005
+ vertex -170.58141482489256 -109.33941082866406 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -170.58141482489256 -109.33941082866406 -62.60000000000005
+ vertex -171.32064530943393 -110.45902607093474 -62.60000000000005
+ vertex -170.96730435272855 -109.49925150467148 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -170.96730435272855 -109.49925150467148 -62.60000000000005
+ vertex -171.32064530943393 -110.45902607093474 -62.60000000000005
+ vertex -171.38141482489257 -109.55377018260897 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -171.38141482489257 -109.55377018260897 -62.60000000000005
+ vertex -171.32064530943393 -110.45902607093474 -62.60000000000005
+ vertex -171.7955252970566 -109.49925150467148 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -171.7955252970566 -109.49925150467148 -62.60000000000005
+ vertex -171.32064530943393 -110.45902607093474 -62.60000000000005
+ vertex -172.18141482489256 -109.33941082866409 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -172.18141482489256 -109.33941082866409 -62.60000000000005
+ vertex -171.32064530943393 -110.45902607093474 -62.60000000000005
+ vertex -171.5618262643314 -110.55892649343936 -62.600000000000044
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -172.18141482489256 -109.33941082866409 -62.60000000000005
+ vertex -171.5618262643314 -110.55892649343936 -62.600000000000044
+ vertex -172.51278567479108 -109.08514103250747 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -172.51278567479108 -109.08514103250747 -62.60000000000005
+ vertex -171.5618262643314 -110.55892649343936 -62.600000000000044
+ vertex -171.82064530943393 -110.59300066715029 -62.60000000000003
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -172.51278567479108 -109.08514103250747 -62.60000000000005
+ vertex -171.82064530943393 -110.59300066715029 -62.60000000000003
+ vertex -172.76705547094767 -108.753770182609 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -172.07946435453644 -110.55892649343936 -62.60000000000003
+ vertex -174.9402605517046 -105.38966856747122 -62.60000000000005
+ vertex -171.82064530943393 -110.59300066715029 -62.60000000000003
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -174.9402605517046 -105.38966856747122 -62.60000000000005
+ vertex -172.07946435453644 -110.55892649343936 -62.60000000000003
+ vertex -175.28667071321837 -105.58966856747122 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -175.28667071321837 -105.58966856747122 -62.60000000000005
+ vertex -172.07946435453644 -110.55892649343936 -62.60000000000003
+ vertex -172.32064530943393 -110.45902607093474 -62.60000000000002
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -175.28667071321837 -105.58966856747122 -62.60000000000005
+ vertex -172.32064530943393 -110.45902607093474 -62.60000000000002
+ vertex -172.52775209062048 -110.30010744833685 -62.60000000000002
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -175.28667071321837 -105.58966856747122 -62.60000000000005
+ vertex -172.52775209062048 -110.30010744833685 -62.60000000000002
+ vertex -172.68667071321835 -110.0930006671503 -62.60000000000002
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -171.06605688512346 -105.23135700675783 -62.60000000000005
+ vertex -171.3814148248926 -106.35377018260895 -62.60000000000005
+ vertex -172.82782498640634 -106.2485142942832 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -171.3814148248926 -106.35377018260895 -62.60000000000005
+ vertex -171.06605688512346 -105.23135700675783 -62.60000000000005
+ vertex -170.96730435272858 -106.40828886054645 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -170.96730435272858 -106.40828886054645 -62.60000000000005
+ vertex -171.06605688512346 -105.23135700675783 -62.60000000000005
+ vertex -170.5814148248926 -106.56812953655385 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -170.5814148248926 -106.56812953655385 -62.60000000000005
+ vertex -171.06605688512346 -105.23135700675783 -62.60000000000005
+ vertex -170.25004397499413 -106.82239933271049 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -170.25004397499413 -106.82239933271049 -62.60000000000005
+ vertex -171.06605688512346 -105.23135700675783 -62.60000000000005
+ vertex -169.99577417883748 -107.15377018260895 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -172.82782498640634 -106.2485142942832 -62.60000000000005
+ vertex -171.3814148248926 -106.35377018260895 -62.60000000000005
+ vertex -171.79552529705666 -106.40828886054645 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -172.82782498640634 -106.2485142942832 -62.60000000000005
+ vertex -171.79552529705666 -106.40828886054645 -62.60000000000005
+ vertex -172.18141482489258 -106.56812953655387 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -172.82782498640634 -106.2485142942832 -62.60000000000005
+ vertex -172.18141482489258 -106.56812953655387 -62.60000000000005
+ vertex -172.51278567479108 -106.8223993327105 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -172.82782498640634 -106.2485142942832 -62.60000000000005
+ vertex -172.51278567479108 -106.8223993327105 -62.60000000000005
+ vertex -173.92782498640634 -104.34325840595744 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -173.92782498640634 -104.34325840595744 -62.60000000000005
+ vertex -172.51278567479108 -106.8223993327105 -62.60000000000005
+ vertex -175.14026055170459 -105.04325840595743 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -175.14026055170459 -105.04325840595743 -62.60000000000005
+ vertex -172.51278567479108 -106.8223993327105 -62.60000000000005
+ vertex -172.7670554709477 -107.15377018260895 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -175.14026055170459 -105.04325840595743 -62.60000000000005
+ vertex -172.7670554709477 -107.15377018260895 -62.60000000000005
+ vertex -172.92689614695513 -107.53965971044495 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -175.14026055170459 -105.04325840595743 -62.60000000000005
+ vertex -172.92689614695513 -107.53965971044495 -62.60000000000005
+ vertex -172.9814148248926 -107.95377018260898 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -175.14026055170459 -105.04325840595743 -62.60000000000005
+ vertex -172.9814148248926 -107.95377018260898 -62.60000000000005
+ vertex -172.9268961469551 -108.367880654773 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -175.14026055170459 -105.04325840595743 -62.60000000000005
+ vertex -172.9268961469551 -108.367880654773 -62.60000000000005
+ vertex -172.76705547094767 -108.753770182609 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -175.14026055170459 -105.04325840595743 -62.60000000000005
+ vertex -172.76705547094767 -108.753770182609 -62.60000000000005
+ vertex -171.82064530943393 -110.59300066715029 -62.60000000000003
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -175.14026055170459 -105.04325840595743 -62.60000000000005
+ vertex -171.82064530943393 -110.59300066715029 -62.60000000000003
+ vertex -174.9402605517046 -105.38966856747122 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -166.88927996889691 -92.73437598764454 -62.60000000000005
+ vertex -166.75951712665574 -89.15913182334084 -62.60000000000005
+ vertex -165.98677646562444 -89.36618705942284 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -166.75951712665574 -89.15913182334084 -62.60000000000005
+ vertex -166.88927996889691 -92.73437598764454 -62.60000000000005
+ vertex -167.6620206299282 -92.52732075156256 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -167.6620206299282 -92.52732075156256 -62.60000000000005
+ vertex -166.88927996889691 -92.73437598764454 -62.60000000000005
+ vertex -163.75496539384616 -98.1631680785361 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -167.6620206299282 -92.52732075156256 -62.60000000000005
+ vertex -163.75496539384616 -98.1631680785361 -62.60000000000005
+ vertex -163.9620206299282 -98.9359087395674 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -167.6620206299282 -92.52732075156256 -62.60000000000005
+ vertex -163.9620206299282 -98.9359087395674 -62.60000000000005
+ vertex -166.188148085156 -95.94877203309035 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -166.188148085156 -95.94877203309035 -62.60000000000005
+ vertex -163.9620206299282 -98.9359087395674 -62.60000000000005
+ vertex -165.91841694439347 -96.59996061131355 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -165.91841694439347 -96.59996061131355 -62.60000000000005
+ vertex -163.9620206299282 -98.9359087395674 -62.60000000000005
+ vertex -165.82641667537396 -97.29877203309034 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -165.82641667537396 -97.29877203309034 -62.60000000000005
+ vertex -163.9620206299282 -98.9359087395674 -62.60000000000005
+ vertex -165.91841694439347 -97.99758345486715 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -165.91841694439347 -97.99758345486715 -62.60000000000005
+ vertex -163.9620206299282 -98.9359087395674 -62.60000000000005
+ vertex -166.18814808515597 -98.64877203309035 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -166.18814808515597 -98.64877203309035 -62.60000000000005
+ vertex -163.9620206299282 -98.9359087395674 -62.60000000000005
+ vertex -166.6172283661703 -99.20796034229403 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -166.6172283661703 -99.20796034229403 -62.60000000000005
+ vertex -163.9620206299282 -98.9359087395674 -62.60000000000005
+ vertex -169.3908127208197 -102.0702233146181 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -166.6172283661703 -99.20796034229403 -62.60000000000005
+ vertex -169.3908127208197 -102.0702233146181 -62.60000000000005
+ vertex -167.17641667537396 -99.63704062330834 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -167.17641667537396 -99.63704062330834 -62.60000000000005
+ vertex -169.3908127208197 -102.0702233146181 -62.60000000000005
+ vertex -167.82760525359717 -99.90677176407084 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -167.82760525359717 -99.90677176407084 -62.60000000000005
+ vertex -169.3908127208197 -102.0702233146181 -62.60000000000005
+ vertex -168.52641667537395 -99.99877203309036 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -168.52641667537395 -99.99877203309036 -62.60000000000005
+ vertex -169.3908127208197 -102.0702233146181 -62.60000000000005
+ vertex -169.2252280971508 -99.90677176407084 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -169.2252280971508 -99.90677176407084 -62.60000000000005
+ vertex -169.3908127208197 -102.0702233146181 -62.60000000000005
+ vertex -169.87641667537395 -99.63704062330832 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -169.87641667537395 -99.63704062330832 -62.60000000000005
+ vertex -169.3908127208197 -102.0702233146181 -62.60000000000005
+ vertex -170.43560498457765 -99.20796034229403 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -170.43560498457765 -99.20796034229403 -62.60000000000005
+ vertex -169.3908127208197 -102.0702233146181 -62.60000000000005
+ vertex -170.86468526559193 -98.64877203309034 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -162.1125727990433 -89.20787549870951 -62.60000000000005
+ vertex -164.36616263752958 -84.5045433990304 -62.600000000000044
+ vertex -161.76616263752956 -89.00787549870951 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -164.36616263752958 -84.5045433990304 -62.600000000000044
+ vertex -162.1125727990433 -89.20787549870951 -62.60000000000005
+ vertex -164.52508126012745 -84.29743661784386 -62.600000000000044
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -164.52508126012745 -84.29743661784386 -62.600000000000044
+ vertex -162.1125727990433 -89.20787549870951 -62.60000000000005
+ vertex -164.732188041314 -84.13851799524596 -62.600000000000044
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -164.732188041314 -84.13851799524596 -62.600000000000044
+ vertex -162.1125727990433 -89.20787549870951 -62.60000000000005
+ vertex -164.97336899621146 -84.03861757274133 -62.600000000000044
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -164.97336899621146 -84.03861757274133 -62.600000000000044
+ vertex -162.1125727990433 -89.20787549870951 -62.60000000000005
+ vertex -165.232188041314 -84.0045433990304 -62.600000000000044
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -155.52508126012748 -101.30010744833686 -62.60000000000008
+ vertex -156.48577787980025 -99.35377018260895 -62.60000000000005
+ vertex -155.36616263752956 -101.09300066715029 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -156.48577787980025 -99.35377018260895 -62.60000000000005
+ vertex -155.52508126012748 -101.30010744833686 -62.60000000000008
+ vertex -156.32593720379282 -99.73965971044491 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -156.32593720379282 -99.73965971044491 -62.60000000000005
+ vertex -155.52508126012748 -101.30010744833686 -62.60000000000008
+ vertex -156.27141852585532 -100.15377018260895 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -156.27141852585532 -100.15377018260895 -62.60000000000005
+ vertex -155.52508126012748 -101.30010744833686 -62.60000000000008
+ vertex -155.732188041314 -101.45902607093474 -62.60000000000008
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -156.27141852585532 -100.15377018260895 -62.60000000000005
+ vertex -155.732188041314 -101.45902607093474 -62.60000000000008
+ vertex -156.32593720379282 -100.56788065477299 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -156.32593720379282 -100.56788065477299 -62.60000000000005
+ vertex -155.732188041314 -101.45902607093474 -62.60000000000008
+ vertex -156.48577787980022 -100.95377018260896 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -156.48577787980022 -100.95377018260896 -62.60000000000005
+ vertex -155.732188041314 -101.45902607093474 -62.60000000000008
+ vertex -156.74004767595684 -101.28514103250744 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -156.74004767595684 -101.28514103250744 -62.60000000000005
+ vertex -155.732188041314 -101.45902607093474 -62.60000000000008
+ vertex -160.2355201409931 -104.05902607093472 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -156.74004767595684 -101.28514103250744 -62.60000000000005
+ vertex -160.2355201409931 -104.05902607093472 -62.60000000000005
+ vertex -157.0714185258553 -101.53941082866406 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -157.0714185258553 -101.53941082866406 -62.60000000000005
+ vertex -160.2355201409931 -104.05902607093472 -62.60000000000005
+ vertex -157.45730805369126 -101.69925150467147 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -157.45730805369126 -101.69925150467147 -62.60000000000005
+ vertex -160.2355201409931 -104.05902607093472 -62.60000000000005
+ vertex -157.87141852585532 -101.75377018260896 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -157.87141852585532 -101.75377018260896 -62.60000000000005
+ vertex -160.2355201409931 -104.05902607093472 -62.60000000000005
+ vertex -158.28552899801934 -101.6992515046715 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -158.28552899801934 -101.6992515046715 -62.60000000000005
+ vertex -160.2355201409931 -104.05902607093472 -62.60000000000005
+ vertex -158.67141852585533 -101.53941082866409 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -158.67141852585533 -101.53941082866409 -62.60000000000005
+ vertex -160.2355201409931 -104.05902607093472 -62.60000000000005
+ vertex -159.0027893757538 -101.28514103250745 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -159.0027893757538 -101.28514103250745 -62.60000000000005
+ vertex -160.2355201409931 -104.05902607093472 -62.60000000000005
+ vertex -159.25705917191044 -100.95377018260898 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -159.25705917191044 -100.95377018260898 -62.60000000000005
+ vertex -160.2355201409931 -104.05902607093472 -62.60000000000005
+ vertex -159.57667441418107 -101.60018034412275 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -159.25705917191044 -100.95377018260898 -62.60000000000005
+ vertex -159.57667441418107 -101.60018034412275 -62.60000000000005
+ vertex -160.38677646562448 -99.06567158180859 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -159.57667441418107 -101.60018034412275 -62.60000000000005
+ vertex -160.2355201409931 -104.05902607093472 -62.60000000000005
+ vertex -160.43552014099308 -103.71261590942096 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -159.57667441418107 -101.60018034412275 -62.60000000000005
+ vertex -160.43552014099308 -103.71261590942096 -62.60000000000005
+ vertex -161.48193030250687 -102.70018034412274 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -161.48193030250687 -102.70018034412274 -62.60000000000005
+ vertex -160.43552014099308 -103.71261590942096 -62.60000000000005
+ vertex -160.78193030250688 -103.91261590942096 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -167.6620206299282 -92.52732075156256 -62.60000000000005
+ vertex -169.2252280971508 -94.69077230210986 -62.60000000000005
+ vertex -173.09081272081974 -95.6616353266133 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -169.2252280971508 -94.69077230210986 -62.60000000000005
+ vertex -167.6620206299282 -92.52732075156256 -62.60000000000005
+ vertex -168.52641667537395 -94.59877203309034 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -168.52641667537395 -94.59877203309034 -62.60000000000005
+ vertex -167.6620206299282 -92.52732075156256 -62.60000000000005
+ vertex -167.82760525359714 -94.69077230210985 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -167.82760525359714 -94.69077230210985 -62.60000000000005
+ vertex -167.6620206299282 -92.52732075156256 -62.60000000000005
+ vertex -167.17641667537399 -94.96050344287237 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -167.17641667537399 -94.96050344287237 -62.60000000000005
+ vertex -167.6620206299282 -92.52732075156256 -62.60000000000005
+ vertex -166.61722836617028 -95.38958372388667 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -166.61722836617028 -95.38958372388667 -62.60000000000005
+ vertex -167.6620206299282 -92.52732075156256 -62.60000000000005
+ vertex -166.188148085156 -95.94877203309035 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -173.09081272081974 -95.6616353266133 -62.60000000000005
+ vertex -169.2252280971508 -94.69077230210986 -62.60000000000005
+ vertex -169.87641667537397 -94.96050344287237 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -173.09081272081974 -95.6616353266133 -62.60000000000005
+ vertex -169.87641667537397 -94.96050344287237 -62.60000000000005
+ vertex -170.43560498457762 -95.38958372388666 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -173.09081272081974 -95.6616353266133 -62.60000000000005
+ vertex -170.43560498457762 -95.38958372388666 -62.60000000000005
+ vertex -170.86468526559196 -95.94877203309034 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -173.09081272081974 -95.6616353266133 -62.60000000000005
+ vertex -170.86468526559196 -95.94877203309034 -62.60000000000005
+ vertex -171.13441640635446 -96.59996061131355 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -173.09081272081974 -95.6616353266133 -62.60000000000005
+ vertex -171.13441640635446 -96.59996061131355 -62.60000000000005
+ vertex -171.22641667537397 -97.29877203309034 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -173.09081272081974 -95.6616353266133 -62.60000000000005
+ vertex -171.22641667537397 -97.29877203309034 -62.60000000000005
+ vertex -171.13441640635446 -97.99758345486715 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -173.09081272081974 -95.6616353266133 -62.60000000000005
+ vertex -171.13441640635446 -97.99758345486715 -62.60000000000005
+ vertex -170.86468526559193 -98.64877203309034 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -173.09081272081974 -95.6616353266133 -62.60000000000005
+ vertex -170.86468526559193 -98.64877203309034 -62.60000000000005
+ vertex -169.3908127208197 -102.0702233146181 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -173.09081272081974 -95.6616353266133 -62.60000000000005
+ vertex -169.3908127208197 -102.0702233146181 -62.60000000000005
+ vertex -170.16355338185102 -101.86316807853612 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -170.16355338185102 -101.86316807853612 -62.60000000000005
+ vertex -169.3908127208197 -102.0702233146181 -62.60000000000005
+ vertex -170.2933162240922 -105.43841224283983 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -170.16355338185102 -101.86316807853612 -62.60000000000005
+ vertex -170.2933162240922 -105.43841224283983 -62.60000000000005
+ vertex -171.06605688512346 -105.23135700675783 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -166.6709030482411 -107.31261590942096 -62.60000000000005
+ vertex -169.27615893656682 -107.20018034412274 -62.60000000000005
+ vertex -167.37090304824105 -106.10018034412275 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -169.27615893656682 -107.20018034412274 -62.60000000000005
+ vertex -166.6709030482411 -107.31261590942096 -62.60000000000005
+ vertex -167.01731320975483 -107.51261590942096 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -173.09081272081974 -95.6616353266133 -62.60000000000005
+ vertex -173.29786795690174 -96.43437598764457 -62.60000000000005
+ vertex -176.45900164904148 -94.75913182334084 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -173.29786795690174 -96.43437598764457 -62.60000000000005
+ vertex -173.09081272081974 -95.6616353266133 -62.60000000000005
+ vertex -170.16355338185102 -101.86316807853612 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -176.45900164904148 -94.75913182334084 -62.60000000000005
+ vertex -173.29786795690174 -96.43437598764457 -62.60000000000005
+ vertex -176.66605688512345 -95.53187248437212 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -176.45900164904148 -94.75913182334084 -62.60000000000005
+ vertex -176.66605688512345 -95.53187248437212 -62.60000000000005
+ vertex -177.47615893656683 -92.99736372205795 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -178.5402605517046 -99.15428566022322 -62.60000000000005
+ vertex -178.42782498640636 -96.5490297718975 -62.60000000000005
+ vertex -177.32782498640637 -98.45428566022325 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -178.42782498640636 -96.5490297718975 -62.60000000000005
+ vertex -178.5402605517046 -99.15428566022322 -62.60000000000005
+ vertex -178.76730435272856 -95.98925520563425 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -178.76730435272856 -95.98925520563425 -62.60000000000005
+ vertex -178.5402605517046 -99.15428566022322 -62.60000000000005
+ vertex -179.18141482489258 -96.04377388357173 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -179.18141482489258 -96.04377388357173 -62.60000000000005
+ vertex -178.5402605517046 -99.15428566022322 -62.60000000000005
+ vertex -179.5955252970566 -95.98925520563425 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -179.5955252970566 -95.98925520563425 -62.60000000000005
+ vertex -178.5402605517046 -99.15428566022322 -62.60000000000005
+ vertex -179.98141482489257 -95.82941452962685 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -179.98141482489257 -95.82941452962685 -62.60000000000005
+ vertex -178.5402605517046 -99.15428566022322 -62.60000000000005
+ vertex -180.31278567479106 -95.5751447334702 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -180.31278567479106 -95.5751447334702 -62.60000000000005
+ vertex -178.5402605517046 -99.15428566022322 -62.60000000000005
+ vertex -180.56705547094768 -95.24377388357173 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -180.56705547094768 -95.24377388357173 -62.60000000000005
+ vertex -178.5402605517046 -99.15428566022322 -62.60000000000005
+ vertex -181.68667071321835 -93.50454339903038 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -181.68667071321835 -93.50454339903038 -62.600000000000065
+ vertex -178.5402605517046 -99.15428566022322 -62.60000000000005
+ vertex -178.7402605517046 -98.80787549870945 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -181.68667071321835 -93.50454339903038 -62.600000000000065
+ vertex -178.7402605517046 -98.80787549870945 -62.60000000000005
+ vertex -181.786571135723 -93.74572435392787 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -181.786571135723 -93.74572435392787 -62.600000000000065
+ vertex -178.7402605517046 -98.80787549870945 -62.60000000000005
+ vertex -179.08667071321835 -99.00787549870944 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -181.786571135723 -93.74572435392787 -62.600000000000065
+ vertex -179.08667071321835 -99.00787549870944 -62.60000000000005
+ vertex -181.82064530943393 -94.00454339903038 -62.60000000000008
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -181.82064530943393 -94.00454339903038 -62.60000000000008
+ vertex -179.08667071321835 -99.00787549870944 -62.60000000000005
+ vertex -181.786571135723 -94.26336244413291 -62.60000000000008
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -181.786571135723 -94.26336244413291 -62.60000000000008
+ vertex -179.08667071321835 -99.00787549870944 -62.60000000000005
+ vertex -181.68667071321835 -94.5045433990304 -62.60000000000008
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -175.57090304824106 -91.89736372205796 -62.60000000000005
+ vertex -176.61731320975483 -90.88492815675971 -62.60000000000005
+ vertex -176.27090304824105 -90.68492815675971 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -176.61731320975483 -90.88492815675971 -62.60000000000005
+ vertex -175.57090304824106 -91.89736372205796 -62.60000000000005
+ vertex -177.47615893656683 -92.99736372205795 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -176.61731320975483 -90.88492815675971 -62.60000000000005
+ vertex -177.47615893656683 -92.99736372205795 -62.60000000000005
+ vertex -176.81731320975481 -90.53851799524594 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -176.81731320975481 -90.53851799524594 -62.60000000000005
+ vertex -177.47615893656683 -92.99736372205795 -62.60000000000005
+ vertex -179.1814148248926 -92.84377388357171 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -176.81731320975481 -90.53851799524594 -62.60000000000005
+ vertex -179.1814148248926 -92.84377388357171 -62.60000000000005
+ vertex -179.59552529705667 -92.89829256150922 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -176.81731320975481 -90.53851799524594 -62.60000000000005
+ vertex -179.59552529705667 -92.89829256150922 -62.60000000000005
+ vertex -181.32064530943393 -93.13851799524595 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -179.1814148248926 -92.84377388357171 -62.60000000000005
+ vertex -177.47615893656683 -92.99736372205795 -62.60000000000005
+ vertex -178.76730435272856 -92.89829256150921 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -178.76730435272856 -92.89829256150921 -62.60000000000005
+ vertex -177.47615893656683 -92.99736372205795 -62.60000000000005
+ vertex -178.3814148248926 -93.0581332375166 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -178.3814148248926 -93.0581332375166 -62.60000000000005
+ vertex -177.47615893656683 -92.99736372205795 -62.60000000000005
+ vertex -178.05004397499414 -93.31240303367323 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -178.05004397499414 -93.31240303367323 -62.60000000000005
+ vertex -177.47615893656683 -92.99736372205795 -62.60000000000005
+ vertex -177.7957741788375 -93.64377388357171 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -177.7957741788375 -93.64377388357171 -62.60000000000005
+ vertex -177.47615893656683 -92.99736372205795 -62.60000000000005
+ vertex -176.66605688512345 -95.53187248437212 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -181.32064530943393 -93.13851799524595 -62.60000000000005
+ vertex -179.59552529705667 -92.89829256150922 -62.60000000000005
+ vertex -179.98141482489262 -93.05813323751663 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -181.32064530943393 -93.13851799524595 -62.60000000000005
+ vertex -179.98141482489262 -93.05813323751663 -62.60000000000005
+ vertex -180.3127856747911 -93.31240303367325 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -181.32064530943393 -93.13851799524595 -62.60000000000005
+ vertex -180.3127856747911 -93.31240303367325 -62.60000000000005
+ vertex -180.5670554709477 -93.64377388357174 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -181.32064530943393 -93.13851799524595 -62.60000000000005
+ vertex -180.5670554709477 -93.64377388357174 -62.60000000000005
+ vertex -180.7268961469551 -94.0296634114077 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -181.32064530943393 -93.13851799524595 -62.60000000000005
+ vertex -180.7268961469551 -94.0296634114077 -62.60000000000005
+ vertex -180.7814148248926 -94.44377388357174 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -181.32064530943393 -93.13851799524595 -62.60000000000005
+ vertex -180.7814148248926 -94.44377388357174 -62.60000000000005
+ vertex -181.52775209062045 -93.29743661784383 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -181.52775209062045 -93.29743661784383 -62.60000000000005
+ vertex -180.7814148248926 -94.44377388357174 -62.60000000000005
+ vertex -180.7268961469551 -94.85788435573578 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -181.52775209062045 -93.29743661784383 -62.60000000000005
+ vertex -180.7268961469551 -94.85788435573578 -62.60000000000005
+ vertex -181.68667071321835 -93.50454339903038 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -181.68667071321835 -93.50454339903038 -62.600000000000065
+ vertex -180.7268961469551 -94.85788435573578 -62.60000000000005
+ vertex -180.56705547094768 -95.24377388357173 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -176.66605688512345 -95.53187248437212 -62.60000000000005
+ vertex -177.63593350283008 -94.02966341140768 -62.60000000000005
+ vertex -177.7957741788375 -93.64377388357171 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -177.63593350283008 -94.02966341140768 -62.60000000000005
+ vertex -176.66605688512345 -95.53187248437212 -62.60000000000005
+ vertex -177.5814148248926 -94.44377388357171 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -177.5814148248926 -94.44377388357171 -62.60000000000005
+ vertex -176.66605688512345 -95.53187248437212 -62.60000000000005
+ vertex -177.63593350283008 -94.85788435573575 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -177.63593350283008 -94.85788435573575 -62.60000000000005
+ vertex -176.66605688512345 -95.53187248437212 -62.60000000000005
+ vertex -177.79577417883746 -95.2437738835717 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -177.79577417883746 -95.2437738835717 -62.60000000000005
+ vertex -176.66605688512345 -95.53187248437212 -62.60000000000005
+ vertex -178.42782498640636 -96.5490297718975 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -177.79577417883746 -95.2437738835717 -62.60000000000005
+ vertex -178.42782498640636 -96.5490297718975 -62.60000000000005
+ vertex -178.0500439749941 -95.5751447334702 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -178.0500439749941 -95.5751447334702 -62.60000000000005
+ vertex -178.42782498640636 -96.5490297718975 -62.60000000000005
+ vertex -178.38141482489257 -95.82941452962682 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -178.38141482489257 -95.82941452962682 -62.60000000000005
+ vertex -178.42782498640636 -96.5490297718975 -62.60000000000005
+ vertex -178.76730435272856 -95.98925520563425 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -160.38677646562448 -99.06567158180859 -62.60000000000005
+ vertex -160.59383170170645 -99.83841224283987 -62.60000000000005
+ vertex -163.75496539384616 -98.1631680785361 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -160.59383170170645 -99.83841224283987 -62.60000000000005
+ vertex -160.38677646562448 -99.06567158180859 -62.60000000000005
+ vertex -159.57667441418107 -101.60018034412275 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -163.75496539384616 -98.1631680785361 -62.60000000000005
+ vertex -160.59383170170645 -99.83841224283987 -62.60000000000005
+ vertex -163.9620206299282 -98.9359087395674 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -169.68193030250686 -88.49736372205793 -62.60000000000005
+ vertex -170.03552014099304 -87.08492815675972 -62.60000000000005
+ vertex -167.7766744141811 -87.39736372205793 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -170.03552014099304 -87.08492815675972 -62.60000000000005
+ vertex -169.68193030250686 -88.49736372205793 -62.60000000000005
+ vertex -170.38193030250682 -87.28492815675972 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -164.28577787980026 -85.8437738835717 -62.60000000000005
+ vertex -165.49100708641654 -84.03861757274133 -62.600000000000044
+ vertex -165.232188041314 -84.0045433990304 -62.600000000000044
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -165.49100708641654 -84.03861757274133 -62.600000000000044
+ vertex -164.28577787980026 -85.8437738835717 -62.60000000000005
+ vertex -164.54004767595688 -85.51240303367324 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -165.49100708641654 -84.03861757274133 -62.600000000000044
+ vertex -164.54004767595688 -85.51240303367324 -62.60000000000005
+ vertex -164.87141852585538 -85.2581332375166 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -165.49100708641654 -84.03861757274133 -62.600000000000044
+ vertex -164.87141852585538 -85.2581332375166 -62.60000000000005
+ vertex -165.732188041314 -84.13851799524596 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -165.732188041314 -84.13851799524596 -62.60000000000005
+ vertex -164.87141852585538 -85.2581332375166 -62.60000000000005
+ vertex -165.25730805369133 -85.0982925615092 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -165.732188041314 -84.13851799524596 -62.60000000000005
+ vertex -165.25730805369133 -85.0982925615092 -62.60000000000005
+ vertex -165.6714185258554 -85.04377388357173 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -165.732188041314 -84.13851799524596 -62.60000000000005
+ vertex -165.6714185258554 -85.04377388357173 -62.60000000000005
+ vertex -166.0855289980194 -85.09829256150921 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -165.732188041314 -84.13851799524596 -62.60000000000005
+ vertex -166.0855289980194 -85.09829256150921 -62.60000000000005
+ vertex -170.23552014099303 -86.73851799524596 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -170.23552014099303 -86.73851799524596 -62.60000000000005
+ vertex -166.0855289980194 -85.09829256150921 -62.60000000000005
+ vertex -166.47141852585537 -85.25813323751663 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -170.23552014099303 -86.73851799524596 -62.60000000000005
+ vertex -166.47141852585537 -85.25813323751663 -62.60000000000005
+ vertex -166.80278937575386 -85.51240303367325 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -170.23552014099303 -86.73851799524596 -62.60000000000005
+ vertex -166.80278937575386 -85.51240303367325 -62.60000000000005
+ vertex -167.05705917191048 -85.84377388357173 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -170.23552014099303 -86.73851799524596 -62.60000000000005
+ vertex -167.05705917191048 -85.84377388357173 -62.60000000000005
+ vertex -167.2168998479179 -86.2296634114077 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -170.23552014099303 -86.73851799524596 -62.60000000000005
+ vertex -167.2168998479179 -86.2296634114077 -62.60000000000005
+ vertex -167.27141852585538 -86.64377388357174 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -170.23552014099303 -86.73851799524596 -62.60000000000005
+ vertex -167.27141852585538 -86.64377388357174 -62.60000000000005
+ vertex -167.2168998479179 -87.05788435573575 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -170.23552014099303 -86.73851799524596 -62.60000000000005
+ vertex -167.2168998479179 -87.05788435573575 -62.60000000000005
+ vertex -167.05705917191045 -87.44377388357175 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -170.23552014099303 -86.73851799524596 -62.60000000000005
+ vertex -167.05705917191045 -87.44377388357175 -62.60000000000005
+ vertex -167.7766744141811 -87.39736372205793 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -167.7766744141811 -87.39736372205793 -62.60000000000005
+ vertex -167.05705917191045 -87.44377388357175 -62.60000000000005
+ vertex -165.98677646562444 -89.36618705942284 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -167.7766744141811 -87.39736372205793 -62.60000000000005
+ vertex -165.98677646562444 -89.36618705942284 -62.60000000000005
+ vertex -166.75951712665574 -89.15913182334084 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.455826945656519e-20 -4.0139287745165085e-19 -1.0
+ outer loop
+ vertex -170.23552014099303 -86.73851799524596 -62.60000000000005
+ vertex -167.7766744141811 -87.39736372205793 -62.60000000000005
+ vertex -170.03552014099304 -87.08492815675972 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -169.83593350283007 -107.53965971044492 -62.60000000000005
+ vertex -170.25004397499413 -106.82239933271049 -62.60000000000005
+ vertex -169.99577417883748 -107.15377018260895 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -170.25004397499413 -106.82239933271049 -62.60000000000005
+ vertex -169.83593350283007 -107.53965971044492 -62.60000000000005
+ vertex -169.78141482489258 -107.95377018260895 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -170.25004397499413 -106.82239933271049 -62.60000000000005
+ vertex -169.78141482489258 -107.95377018260895 -62.60000000000005
+ vertex -170.5814148248926 -106.56812953655385 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -170.5814148248926 -106.56812953655385 -62.60000000000005
+ vertex -169.78141482489258 -107.95377018260895 -62.60000000000005
+ vertex -169.83593350283007 -108.36788065477299 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -170.5814148248926 -106.56812953655385 -62.60000000000005
+ vertex -169.83593350283007 -108.36788065477299 -62.60000000000005
+ vertex -170.96730435272858 -106.40828886054645 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -170.96730435272858 -106.40828886054645 -62.60000000000005
+ vertex -169.83593350283007 -108.36788065477299 -62.60000000000005
+ vertex -169.99577417883745 -108.75377018260897 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -170.96730435272858 -106.40828886054645 -62.60000000000005
+ vertex -169.99577417883745 -108.75377018260897 -62.60000000000005
+ vertex -171.3814148248926 -106.35377018260895 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -171.3814148248926 -106.35377018260895 -62.60000000000005
+ vertex -169.99577417883745 -108.75377018260897 -62.60000000000005
+ vertex -170.2500439749941 -109.08514103250742 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -171.3814148248926 -106.35377018260895 -62.60000000000005
+ vertex -170.2500439749941 -109.08514103250742 -62.60000000000005
+ vertex -171.79552529705666 -106.40828886054645 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -171.79552529705666 -106.40828886054645 -62.60000000000005
+ vertex -170.2500439749941 -109.08514103250742 -62.60000000000005
+ vertex -170.58141482489256 -109.33941082866406 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -171.79552529705666 -106.40828886054645 -62.60000000000005
+ vertex -170.58141482489256 -109.33941082866406 -62.60000000000005
+ vertex -172.18141482489258 -106.56812953655387 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -172.18141482489258 -106.56812953655387 -62.60000000000005
+ vertex -170.58141482489256 -109.33941082866406 -62.60000000000005
+ vertex -170.96730435272855 -109.49925150467148 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -172.18141482489258 -106.56812953655387 -62.60000000000005
+ vertex -170.96730435272855 -109.49925150467148 -62.60000000000005
+ vertex -172.51278567479108 -106.8223993327105 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -172.51278567479108 -106.8223993327105 -62.60000000000005
+ vertex -170.96730435272855 -109.49925150467148 -62.60000000000005
+ vertex -171.38141482489257 -109.55377018260897 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -172.51278567479108 -106.8223993327105 -62.60000000000005
+ vertex -171.38141482489257 -109.55377018260897 -62.60000000000005
+ vertex -172.7670554709477 -107.15377018260895 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -172.7670554709477 -107.15377018260895 -62.60000000000005
+ vertex -171.38141482489257 -109.55377018260897 -62.60000000000005
+ vertex -171.7955252970566 -109.49925150467148 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -172.7670554709477 -107.15377018260895 -62.60000000000005
+ vertex -171.7955252970566 -109.49925150467148 -62.60000000000005
+ vertex -172.92689614695513 -107.53965971044495 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -172.92689614695513 -107.53965971044495 -62.60000000000005
+ vertex -171.7955252970566 -109.49925150467148 -62.60000000000005
+ vertex -172.18141482489256 -109.33941082866409 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -172.92689614695513 -107.53965971044495 -62.60000000000005
+ vertex -172.18141482489256 -109.33941082866409 -62.60000000000005
+ vertex -172.9814148248926 -107.95377018260898 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -172.9814148248926 -107.95377018260898 -62.60000000000005
+ vertex -172.18141482489256 -109.33941082866409 -62.60000000000005
+ vertex -172.51278567479108 -109.08514103250747 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -172.9814148248926 -107.95377018260898 -62.60000000000005
+ vertex -172.51278567479108 -109.08514103250747 -62.60000000000005
+ vertex -172.9268961469551 -108.367880654773 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -172.9268961469551 -108.367880654773 -62.60000000000005
+ vertex -172.51278567479108 -109.08514103250747 -62.60000000000005
+ vertex -172.76705547094767 -108.753770182609 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 -1.3771336778111678e-16
+ outer loop
+ vertex -161.76616263752956 -89.00787549870951 617.3999999999999
+ vertex -164.36616263752958 -84.5045433990304 -62.600000000000044
+ vertex -164.36616263752958 -84.5045433990304 617.3999999999999
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 -1.3771336778111678e-16
+ outer loop
+ vertex -164.36616263752958 -84.5045433990304 -62.600000000000044
+ vertex -161.76616263752956 -89.00787549870951 617.3999999999999
+ vertex -161.76616263752956 -89.00787549870951 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912223 0.6087614290087374 -1.636916019876929e-16
+ outer loop
+ vertex -164.36616263752958 -84.5045433990304 617.3999999999999
+ vertex -164.52508126012745 -84.29743661784386 -62.600000000000044
+ vertex -164.52508126012745 -84.29743661784386 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912223 0.6087614290087374 -1.636916019876929e-16
+ outer loop
+ vertex -164.52508126012745 -84.29743661784386 -62.600000000000044
+ vertex -164.36616263752958 -84.5045433990304 617.3999999999999
+ vertex -164.36616263752958 -84.5045433990304 -62.600000000000044
+ endloop
+endfacet
+facet normal 0.8660254037844408 0.4999999999999964 -1.37713367781116e-16
+ outer loop
+ vertex -163.75496539384616 -98.1631680785361 617.3999999999999
+ vertex -166.88927996889691 -92.73437598764454 -62.60000000000005
+ vertex -166.88927996889691 -92.73437598764454 617.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844408 0.4999999999999964 -1.37713367781116e-16
+ outer loop
+ vertex -166.88927996889691 -92.73437598764454 -62.60000000000005
+ vertex -163.75496539384616 -98.1631680785361 617.3999999999999
+ vertex -163.75496539384616 -98.1631680785361 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.6087614290087277 0.7933533402912298 -2.0684907214262717e-16
+ outer loop
+ vertex -164.52508126012745 -84.29743661784386 617.3999999999999
+ vertex -164.732188041314 -84.13851799524596 -62.600000000000044
+ vertex -164.732188041314 -84.13851799524596 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087277 0.7933533402912298 -2.0684907214262717e-16
+ outer loop
+ vertex -164.732188041314 -84.13851799524596 -62.600000000000044
+ vertex -164.52508126012745 -84.29743661784386 617.3999999999999
+ vertex -164.52508126012745 -84.29743661784386 -62.600000000000044
+ endloop
+endfacet
+facet normal 0.3826834323651092 0.9238795325112787 -2.3591011986530023e-16
+ outer loop
+ vertex -164.732188041314 -84.13851799524596 617.3999999999999
+ vertex -164.97336899621146 -84.03861757274133 -62.600000000000044
+ vertex -164.97336899621146 -84.03861757274133 617.3999999999999
+ endloop
+endfacet
+facet normal 0.3826834323651092 0.9238795325112787 -2.3591011986530023e-16
+ outer loop
+ vertex -164.97336899621146 -84.03861757274133 -62.600000000000044
+ vertex -164.732188041314 -84.13851799524596 617.3999999999999
+ vertex -164.732188041314 -84.13851799524596 -62.600000000000044
+ endloop
+endfacet
+facet normal 0.4999999999999998 -0.8660254037844387 2.0805319374395384e-16
+ outer loop
+ vertex -167.7766744141811 -87.39736372205793 617.3999999999999
+ vertex -169.68193030250686 -88.49736372205793 -62.60000000000005
+ vertex -167.7766744141811 -87.39736372205793 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.4999999999999998 -0.8660254037844387 2.0805319374395384e-16
+ outer loop
+ vertex -169.68193030250686 -88.49736372205793 -62.60000000000005
+ vertex -167.7766744141811 -87.39736372205793 617.3999999999999
+ vertex -169.68193030250686 -88.49736372205793 617.3999999999999
+ endloop
+endfacet
+facet normal 0.4999999999999951 -0.8660254037844415 2.0805319374395458e-16
+ outer loop
+ vertex -161.76616263752956 -89.00787549870951 -62.60000000000005
+ vertex -162.1125727990433 -89.20787549870951 617.3999999999999
+ vertex -162.1125727990433 -89.20787549870951 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.4999999999999951 -0.8660254037844415 2.0805319374395458e-16
+ outer loop
+ vertex -162.1125727990433 -89.20787549870951 617.3999999999999
+ vertex -161.76616263752956 -89.00787549870951 -62.60000000000005
+ vertex -161.76616263752956 -89.00787549870951 617.3999999999999
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 2.0805319374395384e-16
+ outer loop
+ vertex -164.22500836434156 -88.34902977189748 617.3999999999999
+ vertex -165.98677646562444 -89.36618705942284 -62.60000000000005
+ vertex -164.22500836434156 -88.34902977189748 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 2.0805319374395384e-16
+ outer loop
+ vertex -165.98677646562444 -89.36618705942284 -62.60000000000005
+ vertex -164.22500836434156 -88.34902977189748 617.3999999999999
+ vertex -165.98677646562444 -89.36618705942284 617.3999999999999
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 -2.0805319374395384e-16
+ outer loop
+ vertex -160.38677646562448 -99.06567158180859 617.3999999999999
+ vertex -158.62500836434157 -98.04851429428321 -62.60000000000005
+ vertex -160.38677646562448 -99.06567158180859 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 -2.0805319374395384e-16
+ outer loop
+ vertex -158.62500836434157 -98.04851429428321 -62.60000000000005
+ vertex -160.38677646562448 -99.06567158180859 617.3999999999999
+ vertex -158.62500836434157 -98.04851429428321 617.3999999999999
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 1.3771336778111678e-16
+ outer loop
+ vertex -166.75951712665574 -89.15913182334084 -62.60000000000005
+ vertex -167.7766744141811 -87.39736372205793 617.3999999999999
+ vertex -167.7766744141811 -87.39736372205793 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 1.3771336778111678e-16
+ outer loop
+ vertex -167.7766744141811 -87.39736372205793 617.3999999999999
+ vertex -166.75951712665574 -89.15913182334084 -62.60000000000005
+ vertex -166.75951712665574 -89.15913182334084 617.3999999999999
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 1.3771336778111675e-16
+ outer loop
+ vertex -163.12500836434157 -90.25428566022323 -62.60000000000005
+ vertex -164.22500836434156 -88.34902977189748 617.3999999999999
+ vertex -164.22500836434156 -88.34902977189748 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 1.3771336778111675e-16
+ outer loop
+ vertex -164.22500836434156 -88.34902977189748 617.3999999999999
+ vertex -163.12500836434157 -90.25428566022323 -62.60000000000005
+ vertex -163.12500836434157 -90.25428566022323 617.3999999999999
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 -2.0805319374395384e-16
+ outer loop
+ vertex -158.31257279904335 -95.78966856747121 617.3999999999999
+ vertex -157.96616263752958 -95.58966856747121 -62.60000000000005
+ vertex -158.31257279904335 -95.78966856747121 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 -2.0805319374395384e-16
+ outer loop
+ vertex -157.96616263752958 -95.58966856747121 -62.60000000000005
+ vertex -158.31257279904335 -95.78966856747121 617.3999999999999
+ vertex -157.96616263752958 -95.58966856747121 617.3999999999999
+ endloop
+endfacet
+facet normal -0.1305261922200643 0.9914448613738087 -2.4491671163867733e-16
+ outer loop
+ vertex -165.49100708641654 -84.03861757274133 617.3999999999999
+ vertex -165.232188041314 -84.0045433990304 -62.600000000000044
+ vertex -165.49100708641654 -84.03861757274133 -62.600000000000044
+ endloop
+endfacet
+facet normal -0.1305261922200643 0.9914448613738087 -2.4491671163867733e-16
+ outer loop
+ vertex -165.232188041314 -84.0045433990304 -62.600000000000044
+ vertex -165.49100708641654 -84.03861757274133 617.3999999999999
+ vertex -165.232188041314 -84.0045433990304 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9659258262890671 0.2588190451025256 -4.973776792580478e-17
+ outer loop
+ vertex -167.6620206299282 -92.52732075156256 617.3999999999999
+ vertex -166.75951712665574 -89.15913182334084 -62.60000000000005
+ vertex -167.6620206299282 -92.52732075156256 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9659258262890671 0.2588190451025256 -4.973776792580478e-17
+ outer loop
+ vertex -166.75951712665574 -89.15913182334084 -62.60000000000005
+ vertex -167.6620206299282 -92.52732075156256 617.3999999999999
+ vertex -166.75951712665574 -89.15913182334084 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9659258262890682 -0.2588190451025213 4.973776792580366e-17
+ outer loop
+ vertex -166.88927996889691 -92.73437598764454 617.3999999999999
+ vertex -165.98677646562444 -89.36618705942284 -62.60000000000005
+ vertex -165.98677646562444 -89.36618705942284 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9659258262890682 -0.2588190451025213 4.973776792580366e-17
+ outer loop
+ vertex -165.98677646562444 -89.36618705942284 -62.60000000000005
+ vertex -166.88927996889691 -92.73437598764454 617.3999999999999
+ vertex -166.88927996889691 -92.73437598764454 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 1.3771336778111675e-16
+ outer loop
+ vertex -170.23552014099303 -86.73851799524596 -62.60000000000005
+ vertex -170.03552014099304 -87.08492815675972 617.3999999999999
+ vertex -170.23552014099303 -86.73851799524596 617.3999999999999
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 1.3771336778111675e-16
+ outer loop
+ vertex -170.03552014099304 -87.08492815675972 617.3999999999999
+ vertex -170.23552014099303 -86.73851799524596 -62.60000000000005
+ vertex -170.03552014099304 -87.08492815675972 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 -1.3771336778111675e-16
+ outer loop
+ vertex -158.31257279904335 -95.78966856747121 617.3999999999999
+ vertex -158.51257279904334 -95.44325840595744 -62.60000000000005
+ vertex -158.51257279904334 -95.44325840595744 617.3999999999999
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 -1.3771336778111675e-16
+ outer loop
+ vertex -158.51257279904334 -95.44325840595744 -62.60000000000005
+ vertex -158.31257279904335 -95.78966856747121 617.3999999999999
+ vertex -158.31257279904335 -95.78966856747121 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844469 -0.49999999999998546 1.377133677811134e-16
+ outer loop
+ vertex -169.68193030250686 -88.49736372205793 -62.60000000000005
+ vertex -170.38193030250682 -87.28492815675972 617.3999999999999
+ vertex -170.38193030250682 -87.28492815675972 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844469 -0.49999999999998546 1.377133677811134e-16
+ outer loop
+ vertex -170.38193030250682 -87.28492815675972 617.3999999999999
+ vertex -169.68193030250686 -88.49736372205793 -62.60000000000005
+ vertex -169.68193030250686 -88.49736372205793 617.3999999999999
+ endloop
+endfacet
+facet normal 0.25881904510252396 0.9659258262890675 -2.4449388036193293e-16
+ outer loop
+ vertex -160.38677646562448 -99.06567158180859 617.3999999999999
+ vertex -163.75496539384616 -98.1631680785361 -62.60000000000005
+ vertex -163.75496539384616 -98.1631680785361 617.3999999999999
+ endloop
+endfacet
+facet normal 0.25881904510252396 0.9659258262890675 -2.4449388036193293e-16
+ outer loop
+ vertex -163.75496539384616 -98.1631680785361 -62.60000000000005
+ vertex -160.38677646562448 -99.06567158180859 617.3999999999999
+ vertex -160.38677646562448 -99.06567158180859 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112955 0.38268343236506885 -1.0937881967044597e-16
+ outer loop
+ vertex -155.26626221502494 -100.33418162204778 617.3999999999999
+ vertex -155.36616263752956 -100.09300066715029 -62.60000000000005
+ vertex -155.36616263752956 -100.09300066715029 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112955 0.38268343236506885 -1.0937881967044597e-16
+ outer loop
+ vertex -155.36616263752956 -100.09300066715029 -62.60000000000005
+ vertex -155.26626221502494 -100.33418162204778 617.3999999999999
+ vertex -155.26626221502494 -100.33418162204778 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738094 0.13052619222005926 -4.761205154971978e-17
+ outer loop
+ vertex -155.232188041314 -100.59300066715029 617.3999999999999
+ vertex -155.26626221502494 -100.33418162204778 -62.60000000000005
+ vertex -155.26626221502494 -100.33418162204778 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738094 0.13052619222005926 -4.761205154971978e-17
+ outer loop
+ vertex -155.26626221502494 -100.33418162204778 -62.60000000000005
+ vertex -155.232188041314 -100.59300066715029 617.3999999999999
+ vertex -155.232188041314 -100.59300066715029 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.5000000000000026 0.8660254037844372 -2.080531937439534e-16
+ outer loop
+ vertex -170.23552014099303 -86.73851799524596 617.3999999999999
+ vertex -165.732188041314 -84.13851799524596 -62.60000000000005
+ vertex -170.23552014099303 -86.73851799524596 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.5000000000000026 0.8660254037844372 -2.080531937439534e-16
+ outer loop
+ vertex -165.732188041314 -84.13851799524596 -62.60000000000005
+ vertex -170.23552014099303 -86.73851799524596 617.3999999999999
+ vertex -165.732188041314 -84.13851799524596 617.3999999999999
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 -1.3771336778111675e-16
+ outer loop
+ vertex -161.91257279904332 -89.55428566022329 617.3999999999999
+ vertex -162.1125727990433 -89.20787549870951 -62.60000000000005
+ vertex -162.1125727990433 -89.20787549870951 617.3999999999999
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 -1.3771336778111675e-16
+ outer loop
+ vertex -162.1125727990433 -89.20787549870951 -62.60000000000005
+ vertex -161.91257279904332 -89.55428566022329 617.3999999999999
+ vertex -161.91257279904332 -89.55428566022329 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.382683432365085 0.9238795325112886 -2.2424847134412203e-16
+ outer loop
+ vertex -165.732188041314 -84.13851799524596 617.3999999999999
+ vertex -165.49100708641654 -84.03861757274133 -62.600000000000044
+ vertex -165.732188041314 -84.13851799524596 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.382683432365085 0.9238795325112886 -2.2424847134412203e-16
+ outer loop
+ vertex -165.49100708641654 -84.03861757274133 -62.600000000000044
+ vertex -165.732188041314 -84.13851799524596 617.3999999999999
+ vertex -165.49100708641654 -84.03861757274133 617.3999999999999
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 -2.0805319374395384e-16
+ outer loop
+ vertex -159.72500836434156 -96.14325840595744 617.3999999999999
+ vertex -158.51257279904334 -95.44325840595744 -62.60000000000005
+ vertex -159.72500836434156 -96.14325840595744 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 -2.0805319374395384e-16
+ outer loop
+ vertex -158.51257279904334 -95.44325840595744 -62.60000000000005
+ vertex -159.72500836434156 -96.14325840595744 617.3999999999999
+ vertex -158.51257279904334 -95.44325840595744 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738132 -0.13052619222003178 1.739939920148812e-17
+ outer loop
+ vertex -155.26626221502494 -100.85181971225282 617.3999999999999
+ vertex -155.232188041314 -100.59300066715029 -62.600000000000065
+ vertex -155.232188041314 -100.59300066715029 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738132 -0.13052619222003178 1.739939920148812e-17
+ outer loop
+ vertex -155.232188041314 -100.59300066715029 -62.600000000000065
+ vertex -155.26626221502494 -100.85181971225282 617.3999999999999
+ vertex -155.26626221502494 -100.85181971225282 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9238795325112861 -0.38268343236509156 8.122510965098952e-17
+ outer loop
+ vertex -155.26626221502494 -100.85181971225282 -62.600000000000065
+ vertex -155.36616263752956 -101.09300066715029 617.3999999999999
+ vertex -155.36616263752956 -101.09300066715029 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9238795325112861 -0.38268343236509156 8.122510965098952e-17
+ outer loop
+ vertex -155.36616263752956 -101.09300066715029 617.3999999999999
+ vertex -155.26626221502494 -100.85181971225282 -62.600000000000065
+ vertex -155.26626221502494 -100.85181971225282 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222004552 0.9914448613738113 -2.4889428277906157e-16
+ outer loop
+ vertex -165.232188041314 -84.0045433990304 617.3999999999999
+ vertex -164.97336899621146 -84.03861757274133 -62.600000000000044
+ vertex -165.232188041314 -84.0045433990304 -62.600000000000044
+ endloop
+endfacet
+facet normal 0.13052619222004552 0.9914448613738113 -2.4889428277906157e-16
+ outer loop
+ vertex -164.97336899621146 -84.03861757274133 -62.600000000000044
+ vertex -165.232188041314 -84.0045433990304 617.3999999999999
+ vertex -164.97336899621146 -84.03861757274133 617.3999999999999
+ endloop
+endfacet
+facet normal 0.4999999999999648 -0.8660254037844589 2.0805319374395936e-16
+ outer loop
+ vertex -161.91257279904332 -89.55428566022329 617.3999999999999
+ vertex -163.12500836434157 -90.25428566022323 -62.60000000000005
+ vertex -161.91257279904332 -89.55428566022329 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.4999999999999648 -0.8660254037844589 2.0805319374395936e-16
+ outer loop
+ vertex -163.12500836434157 -90.25428566022323 -62.60000000000005
+ vertex -161.91257279904332 -89.55428566022329 617.3999999999999
+ vertex -163.12500836434157 -90.25428566022323 617.3999999999999
+ endloop
+endfacet
+facet normal -0.4999999999999953 0.8660254037844414 -2.0805319374395453e-16
+ outer loop
+ vertex -170.38193030250682 -87.28492815675972 617.3999999999999
+ vertex -170.03552014099304 -87.08492815675972 -62.60000000000005
+ vertex -170.38193030250682 -87.28492815675972 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.4999999999999953 0.8660254037844414 -2.0805319374395453e-16
+ outer loop
+ vertex -170.03552014099304 -87.08492815675972 -62.60000000000005
+ vertex -170.38193030250682 -87.28492815675972 617.3999999999999
+ vertex -170.03552014099304 -87.08492815675972 617.3999999999999
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 1.3771336778111678e-16
+ outer loop
+ vertex -158.62500836434157 -98.04851429428321 -62.60000000000005
+ vertex -159.72500836434156 -96.14325840595744 617.3999999999999
+ vertex -159.72500836434156 -96.14325840595744 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 1.3771336778111678e-16
+ outer loop
+ vertex -159.72500836434156 -96.14325840595744 617.3999999999999
+ vertex -158.62500836434157 -98.04851429428321 -62.60000000000005
+ vertex -158.62500836434157 -98.04851429428321 617.3999999999999
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 -1.3771336778111678e-16
+ outer loop
+ vertex -155.36616263752956 -100.09300066715029 617.3999999999999
+ vertex -157.96616263752958 -95.58966856747121 -62.60000000000005
+ vertex -157.96616263752958 -95.58966856747121 617.3999999999999
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 -1.3771336778111678e-16
+ outer loop
+ vertex -157.96616263752958 -95.58966856747121 -62.60000000000005
+ vertex -155.36616263752956 -100.09300066715029 617.3999999999999
+ vertex -155.36616263752956 -100.09300066715029 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912293 -0.6087614290087284 1.6369160198769076e-16
+ outer loop
+ vertex -156.48577787980025 -99.35377018260895 -62.60000000000005
+ vertex -156.74004767595687 -99.02239933271049 617.3999999999999
+ vertex -156.74004767595687 -99.02239933271049 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912293 -0.6087614290087284 1.6369160198769076e-16
+ outer loop
+ vertex -156.74004767595687 -99.02239933271049 617.3999999999999
+ vertex -156.48577787980025 -99.35377018260895 -62.60000000000005
+ vertex -156.48577787980025 -99.35377018260895 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087209 -0.793353340291235 1.8829806831558401e-16
+ outer loop
+ vertex -169.87641667537397 -94.96050344287237 617.3999999999999
+ vertex -170.43560498457762 -95.38958372388666 -62.60000000000005
+ vertex -169.87641667537397 -94.96050344287237 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.6087614290087209 -0.793353340291235 1.8829806831558401e-16
+ outer loop
+ vertex -170.43560498457762 -95.38958372388666 -62.60000000000005
+ vertex -169.87641667537397 -94.96050344287237 617.3999999999999
+ vertex -170.43560498457762 -95.38958372388666 617.3999999999999
+ endloop
+endfacet
+facet normal -0.38268343236510993 -0.9238795325112785 2.359101198653002e-16
+ outer loop
+ vertex -167.17641667537399 -94.96050344287237 -62.60000000000005
+ vertex -167.82760525359714 -94.69077230210985 617.3999999999999
+ vertex -167.82760525359714 -94.69077230210985 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.38268343236510993 -0.9238795325112785 2.359101198653002e-16
+ outer loop
+ vertex -167.82760525359714 -94.69077230210985 617.3999999999999
+ vertex -167.17641667537399 -94.96050344287237 -62.60000000000005
+ vertex -167.17641667537399 -94.96050344287237 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912297 -0.608761429008728 1.3951546310861233e-16
+ outer loop
+ vertex -170.43560498457762 -95.38958372388666 617.3999999999999
+ vertex -170.86468526559196 -95.94877203309034 -62.60000000000005
+ vertex -170.43560498457762 -95.38958372388666 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912297 -0.608761429008728 1.3951546310861233e-16
+ outer loop
+ vertex -170.86468526559196 -95.94877203309034 -62.60000000000005
+ vertex -170.43560498457762 -95.38958372388666 617.3999999999999
+ vertex -170.86468526559196 -95.94877203309034 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912283 -0.6087614290087296 1.3951546310861272e-16
+ outer loop
+ vertex -155.36616263752956 -101.09300066715029 -62.600000000000065
+ vertex -155.52508126012748 -101.30010744833686 617.3999999999999
+ vertex -155.52508126012748 -101.30010744833686 -62.60000000000008
+ endloop
+endfacet
+facet normal 0.7933533402912283 -0.6087614290087296 1.3951546310861272e-16
+ outer loop
+ vertex -155.52508126012748 -101.30010744833686 617.3999999999999
+ vertex -155.36616263752956 -101.09300066715029 -62.600000000000065
+ vertex -155.36616263752956 -101.09300066715029 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112842 0.38268343236509594 -1.0937881967045255e-16
+ outer loop
+ vertex -170.86468526559193 -98.64877203309034 617.3999999999999
+ vertex -171.13441640635446 -97.99758345486715 -62.60000000000005
+ vertex -171.13441640635446 -97.99758345486715 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112842 0.38268343236509594 -1.0937881967045255e-16
+ outer loop
+ vertex -171.13441640635446 -97.99758345486715 -62.60000000000005
+ vertex -170.86468526559193 -98.64877203309034 617.3999999999999
+ vertex -170.86468526559193 -98.64877203309034 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.38268343236510993 0.9238795325112785 -2.359101198653002e-16
+ outer loop
+ vertex -169.2252280971508 -99.90677176407084 617.3999999999999
+ vertex -169.87641667537395 -99.63704062330832 -62.60000000000005
+ vertex -169.87641667537395 -99.63704062330832 617.3999999999999
+ endloop
+endfacet
+facet normal 0.38268343236510993 0.9238795325112785 -2.359101198653002e-16
+ outer loop
+ vertex -169.87641667537395 -99.63704062330832 -62.60000000000005
+ vertex -169.2252280971508 -99.90677176407084 617.3999999999999
+ vertex -169.2252280971508 -99.90677176407084 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222006162 -0.9914448613738092 2.4491671163867753e-16
+ outer loop
+ vertex -168.52641667537395 -94.59877203309034 617.3999999999999
+ vertex -169.2252280971508 -94.69077230210986 -62.60000000000005
+ vertex -168.52641667537395 -94.59877203309034 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222006162 -0.9914448613738092 2.4491671163867753e-16
+ outer loop
+ vertex -169.2252280971508 -94.69077230210986 -62.60000000000005
+ vertex -168.52641667537395 -94.59877203309034 617.3999999999999
+ vertex -169.2252280971508 -94.69077230210986 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738122 0.13052619222003867 -4.7612051549714715e-17
+ outer loop
+ vertex -171.13441640635446 -97.99758345486715 617.3999999999999
+ vertex -171.22641667537397 -97.29877203309034 -62.60000000000005
+ vertex -171.22641667537397 -97.29877203309034 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738122 0.13052619222003867 -4.7612051549714715e-17
+ outer loop
+ vertex -171.22641667537397 -97.29877203309034 -62.60000000000005
+ vertex -171.13441640635446 -97.99758345486715 617.3999999999999
+ vertex -171.13441640635446 -97.99758345486715 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112844 -0.38268343236509583 1.0937881967045252e-16
+ outer loop
+ vertex -165.91841694439347 -96.59996061131355 -62.60000000000005
+ vertex -166.188148085156 -95.94877203309035 617.3999999999999
+ vertex -166.188148085156 -95.94877203309035 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112844 -0.38268343236509583 1.0937881967045252e-16
+ outer loop
+ vertex -166.188148085156 -95.94877203309035 617.3999999999999
+ vertex -165.91841694439347 -96.59996061131355 -62.60000000000005
+ vertex -165.91841694439347 -96.59996061131355 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912297 0.608761429008728 -1.3951546310861233e-16
+ outer loop
+ vertex -166.6172283661703 -99.20796034229403 617.3999999999999
+ vertex -166.18814808515597 -98.64877203309035 -62.60000000000005
+ vertex -166.6172283661703 -99.20796034229403 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912297 0.608761429008728 -1.3951546310861233e-16
+ outer loop
+ vertex -166.18814808515597 -98.64877203309035 -62.60000000000005
+ vertex -166.6172283661703 -99.20796034229403 617.3999999999999
+ vertex -166.18814808515597 -98.64877203309035 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087112 0.7933533402912425 -2.068490721426301e-16
+ outer loop
+ vertex -169.87641667537395 -99.63704062330832 617.3999999999999
+ vertex -170.43560498457765 -99.20796034229403 -62.60000000000005
+ vertex -170.43560498457765 -99.20796034229403 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087112 0.7933533402912425 -2.068490721426301e-16
+ outer loop
+ vertex -170.43560498457765 -99.20796034229403 -62.60000000000005
+ vertex -169.87641667537395 -99.63704062330832 617.3999999999999
+ vertex -169.87641667537395 -99.63704062330832 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112856 -0.3826834323650923 8.122510965098968e-17
+ outer loop
+ vertex -170.86468526559196 -95.94877203309034 617.3999999999999
+ vertex -171.13441640635446 -96.59996061131355 -62.60000000000005
+ vertex -170.86468526559196 -95.94877203309034 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112856 -0.3826834323650923 8.122510965098968e-17
+ outer loop
+ vertex -171.13441640635446 -96.59996061131355 -62.60000000000005
+ vertex -170.86468526559196 -95.94877203309034 617.3999999999999
+ vertex -171.13441640635446 -96.59996061131355 617.3999999999999
+ endloop
+endfacet
+facet normal 0.382683432365087 -0.9238795325112881 2.2424847134412183e-16
+ outer loop
+ vertex -169.2252280971508 -94.69077230210986 617.3999999999999
+ vertex -169.87641667537397 -94.96050344287237 -62.60000000000005
+ vertex -169.2252280971508 -94.69077230210986 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.382683432365087 -0.9238795325112881 2.2424847134412183e-16
+ outer loop
+ vertex -169.87641667537397 -94.96050344287237 -62.60000000000005
+ vertex -169.2252280971508 -94.69077230210986 617.3999999999999
+ vertex -169.87641667537397 -94.96050344287237 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222004946 0.9914448613738108 -2.449167116386781e-16
+ outer loop
+ vertex -168.52641667537395 -99.99877203309036 617.3999999999999
+ vertex -167.82760525359717 -99.90677176407084 -62.60000000000005
+ vertex -168.52641667537395 -99.99877203309036 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222004946 0.9914448613738108 -2.449167116386781e-16
+ outer loop
+ vertex -167.82760525359717 -99.90677176407084 -62.60000000000005
+ vertex -168.52641667537395 -99.99877203309036 617.3999999999999
+ vertex -167.82760525359717 -99.90677176407084 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112706 -0.3826834323651291 1.093788196704606e-16
+ outer loop
+ vertex -156.32593720379282 -99.73965971044491 -62.60000000000005
+ vertex -156.48577787980025 -99.35377018260895 617.3999999999999
+ vertex -156.48577787980025 -99.35377018260895 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112706 -0.3826834323651291 1.093788196704606e-16
+ outer loop
+ vertex -156.48577787980025 -99.35377018260895 617.3999999999999
+ vertex -156.32593720379282 -99.73965971044491 -62.60000000000005
+ vertex -156.32593720379282 -99.73965971044491 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112863 0.38268343236509095 -8.122510965098934e-17
+ outer loop
+ vertex -166.18814808515597 -98.64877203309035 617.3999999999999
+ vertex -165.91841694439347 -97.99758345486715 -62.60000000000005
+ vertex -166.18814808515597 -98.64877203309035 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112863 0.38268343236509095 -8.122510965098934e-17
+ outer loop
+ vertex -165.91841694439347 -97.99758345486715 -62.60000000000005
+ vertex -166.18814808515597 -98.64877203309035 617.3999999999999
+ vertex -165.91841694439347 -97.99758345486715 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738133 -0.13052619222003106 1.7399399201487936e-17
+ outer loop
+ vertex -171.22641667537397 -97.29877203309034 617.3999999999999
+ vertex -171.13441640635446 -96.59996061131355 -62.60000000000005
+ vertex -171.13441640635446 -96.59996061131355 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738133 -0.13052619222003106 1.7399399201487936e-17
+ outer loop
+ vertex -171.13441640635446 -96.59996061131355 -62.60000000000005
+ vertex -171.22641667537397 -97.29877203309034 617.3999999999999
+ vertex -171.22641667537397 -97.29877203309034 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912398 -0.6087614290087148 1.6369160198768753e-16
+ outer loop
+ vertex -166.188148085156 -95.94877203309035 -62.60000000000005
+ vertex -166.61722836617028 -95.38958372388667 617.3999999999999
+ vertex -166.61722836617028 -95.38958372388667 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912398 -0.6087614290087148 1.6369160198768753e-16
+ outer loop
+ vertex -166.61722836617028 -95.38958372388667 617.3999999999999
+ vertex -166.188148085156 -95.94877203309035 -62.60000000000005
+ vertex -166.188148085156 -95.94877203309035 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222005302 0.9914448613738104 -2.4889428277906147e-16
+ outer loop
+ vertex -169.2252280971508 -99.90677176407084 617.3999999999999
+ vertex -168.52641667537395 -99.99877203309036 -62.60000000000005
+ vertex -169.2252280971508 -99.90677176407084 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222005302 0.9914448613738104 -2.4889428277906147e-16
+ outer loop
+ vertex -168.52641667537395 -99.99877203309036 -62.60000000000005
+ vertex -169.2252280971508 -99.90677176407084 617.3999999999999
+ vertex -168.52641667537395 -99.99877203309036 617.3999999999999
+ endloop
+endfacet
+facet normal -0.3826834323650908 0.9238795325112863 -2.2424847134412134e-16
+ outer loop
+ vertex -167.82760525359717 -99.90677176407084 617.3999999999999
+ vertex -167.17641667537396 -99.63704062330834 -62.60000000000005
+ vertex -167.82760525359717 -99.90677176407084 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.3826834323650908 0.9238795325112863 -2.2424847134412134e-16
+ outer loop
+ vertex -167.17641667537396 -99.63704062330834 -62.60000000000005
+ vertex -167.82760525359717 -99.90677176407084 617.3999999999999
+ vertex -167.17641667537396 -99.63704062330834 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912398 0.6087614290087148 -1.6369160198768753e-16
+ outer loop
+ vertex -170.43560498457765 -99.20796034229403 617.3999999999999
+ vertex -170.86468526559193 -98.64877203309034 -62.60000000000005
+ vertex -170.86468526559193 -98.64877203309034 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912398 0.6087614290087148 -1.6369160198768753e-16
+ outer loop
+ vertex -170.86468526559193 -98.64877203309034 -62.60000000000005
+ vertex -170.43560498457765 -99.20796034229403 617.3999999999999
+ vertex -170.43560498457765 -99.20796034229403 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738132 -0.13052619222003214 4.7612051549713106e-17
+ outer loop
+ vertex -156.27141852585532 -100.15377018260895 -62.60000000000005
+ vertex -156.32593720379282 -99.73965971044491 617.3999999999999
+ vertex -156.32593720379282 -99.73965971044491 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738132 -0.13052619222003214 4.7612051549713106e-17
+ outer loop
+ vertex -156.32593720379282 -99.73965971044491 617.3999999999999
+ vertex -156.27141852585532 -100.15377018260895 -62.60000000000005
+ vertex -156.27141852585532 -100.15377018260895 617.3999999999999
+ endloop
+endfacet
+facet normal -0.1305261922200513 -0.9914448613738106 2.4889428277906147e-16
+ outer loop
+ vertex -167.82760525359714 -94.69077230210985 617.3999999999999
+ vertex -168.52641667537395 -94.59877203309034 -62.60000000000005
+ vertex -167.82760525359714 -94.69077230210985 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.1305261922200513 -0.9914448613738106 2.4889428277906147e-16
+ outer loop
+ vertex -168.52641667537395 -94.59877203309034 -62.60000000000005
+ vertex -167.82760525359714 -94.69077230210985 617.3999999999999
+ vertex -168.52641667537395 -94.59877203309034 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738139 0.13052619222002612 -1.739939920148668e-17
+ outer loop
+ vertex -156.32593720379282 -100.56788065477299 -62.60000000000005
+ vertex -156.27141852585532 -100.15377018260895 617.3999999999999
+ vertex -156.27141852585532 -100.15377018260895 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738139 0.13052619222002612 -1.739939920148668e-17
+ outer loop
+ vertex -156.27141852585532 -100.15377018260895 617.3999999999999
+ vertex -156.32593720379282 -100.56788065477299 -62.60000000000005
+ vertex -156.32593720379282 -100.56788065477299 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087435 -0.7933533402912177 2.0684907214262443e-16
+ outer loop
+ vertex -156.74004767595687 -99.02239933271049 -62.60000000000005
+ vertex -157.07141852585534 -98.76812953655386 617.3999999999999
+ vertex -157.07141852585534 -98.76812953655386 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087435 -0.7933533402912177 2.0684907214262443e-16
+ outer loop
+ vertex -157.07141852585534 -98.76812953655386 617.3999999999999
+ vertex -156.74004767595687 -99.02239933271049 -62.60000000000005
+ vertex -156.74004767595687 -99.02239933271049 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738133 0.13052619222003106 -1.7399399201487936e-17
+ outer loop
+ vertex -165.91841694439347 -97.99758345486715 -62.60000000000005
+ vertex -165.82641667537396 -97.29877203309034 617.3999999999999
+ vertex -165.82641667537396 -97.29877203309034 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738133 0.13052619222003106 -1.7399399201487936e-17
+ outer loop
+ vertex -165.82641667537396 -97.29877203309034 617.3999999999999
+ vertex -165.91841694439347 -97.99758345486715 -62.60000000000005
+ vertex -165.91841694439347 -97.99758345486715 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738122 -0.13052619222003867 4.7612051549714715e-17
+ outer loop
+ vertex -165.82641667537396 -97.29877203309034 -62.60000000000005
+ vertex -165.91841694439347 -96.59996061131355 617.3999999999999
+ vertex -165.91841694439347 -96.59996061131355 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738122 -0.13052619222003867 4.7612051549714715e-17
+ outer loop
+ vertex -165.91841694439347 -96.59996061131355 617.3999999999999
+ vertex -165.82641667537396 -97.29877203309034 -62.60000000000005
+ vertex -165.82641667537396 -97.29877203309034 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087209 0.793353340291235 -1.8829806831558401e-16
+ outer loop
+ vertex -167.17641667537396 -99.63704062330834 617.3999999999999
+ vertex -166.6172283661703 -99.20796034229403 -62.60000000000005
+ vertex -167.17641667537396 -99.63704062330834 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087209 0.793353340291235 -1.8829806831558401e-16
+ outer loop
+ vertex -166.6172283661703 -99.20796034229403 -62.60000000000005
+ vertex -167.17641667537396 -99.63704062330834 617.3999999999999
+ vertex -166.6172283661703 -99.20796034229403 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087241 -0.7933533402912325 1.8829806831558332e-16
+ outer loop
+ vertex -155.52508126012748 -101.30010744833686 -62.60000000000008
+ vertex -155.732188041314 -101.45902607093474 617.3999999999999
+ vertex -155.732188041314 -101.45902607093474 -62.60000000000008
+ endloop
+endfacet
+facet normal 0.6087614290087241 -0.7933533402912325 1.8829806831558332e-16
+ outer loop
+ vertex -155.732188041314 -101.45902607093474 617.3999999999999
+ vertex -155.52508126012748 -101.30010744833686 -62.60000000000008
+ vertex -155.52508126012748 -101.30010744833686 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112936 0.38268343236507346 -8.122510965098492e-17
+ outer loop
+ vertex -156.48577787980022 -100.95377018260896 617.3999999999999
+ vertex -156.32593720379282 -100.56788065477299 -62.60000000000005
+ vertex -156.48577787980022 -100.95377018260896 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112936 0.38268343236507346 -8.122510965098492e-17
+ outer loop
+ vertex -156.32593720379282 -100.56788065477299 -62.60000000000005
+ vertex -156.48577787980022 -100.95377018260896 617.3999999999999
+ vertex -156.32593720379282 -100.56788065477299 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087119 -0.7933533402912418 2.0684907214262993e-16
+ outer loop
+ vertex -166.61722836617028 -95.38958372388667 -62.60000000000005
+ vertex -167.17641667537399 -94.96050344287237 617.3999999999999
+ vertex -167.17641667537399 -94.96050344287237 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087119 -0.7933533402912418 2.0684907214262993e-16
+ outer loop
+ vertex -167.17641667537399 -94.96050344287237 617.3999999999999
+ vertex -166.61722836617028 -95.38958372388667 -62.60000000000005
+ vertex -166.61722836617028 -95.38958372388667 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738132 0.13052619222003214 -4.7612051549713106e-17
+ outer loop
+ vertex -159.41689984791785 -100.56788065477302 617.3999999999999
+ vertex -159.47141852585534 -100.15377018260898 -62.60000000000005
+ vertex -159.47141852585534 -100.15377018260898 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738132 0.13052619222003214 -4.7612051549713106e-17
+ outer loop
+ vertex -159.47141852585534 -100.15377018260898 -62.60000000000005
+ vertex -159.41689984791785 -100.56788065477302 617.3999999999999
+ vertex -159.41689984791785 -100.56788065477302 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912286 0.6087614290087291 -1.6369160198769096e-16
+ outer loop
+ vertex -159.0027893757538 -101.28514103250745 617.3999999999999
+ vertex -159.25705917191044 -100.95377018260898 -62.60000000000005
+ vertex -159.25705917191044 -100.95377018260898 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912286 0.6087614290087291 -1.6369160198769096e-16
+ outer loop
+ vertex -159.25705917191044 -100.95377018260898 -62.60000000000005
+ vertex -159.0027893757538 -101.28514103250745 617.3999999999999
+ vertex -159.0027893757538 -101.28514103250745 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.38268343236509755 0.9238795325112835 -2.242484713441206e-16
+ outer loop
+ vertex -157.45730805369126 -101.69925150467147 617.3999999999999
+ vertex -157.0714185258553 -101.53941082866406 -62.60000000000005
+ vertex -157.45730805369126 -101.69925150467147 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.38268343236509755 0.9238795325112835 -2.242484713441206e-16
+ outer loop
+ vertex -157.0714185258553 -101.53941082866406 -62.60000000000005
+ vertex -157.45730805369126 -101.69925150467147 617.3999999999999
+ vertex -157.0714185258553 -101.53941082866406 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087293 -0.7933533402912285 1.8829806831558229e-16
+ outer loop
+ vertex -158.67141852585536 -98.76812953655387 617.3999999999999
+ vertex -159.00278937575385 -99.0223993327105 -62.60000000000005
+ vertex -158.67141852585536 -98.76812953655387 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.6087614290087293 -0.7933533402912285 1.8829806831558229e-16
+ outer loop
+ vertex -159.00278937575385 -99.0223993327105 -62.60000000000005
+ vertex -158.67141852585536 -98.76812953655387 617.3999999999999
+ vertex -159.00278937575385 -99.0223993327105 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222005393 -0.99144486137381 2.488942827790614e-16
+ outer loop
+ vertex -157.45730805369132 -98.60828886054645 617.3999999999999
+ vertex -157.87141852585535 -98.55377018260896 -62.60000000000005
+ vertex -157.45730805369132 -98.60828886054645 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222005393 -0.99144486137381 2.488942827790614e-16
+ outer loop
+ vertex -157.87141852585535 -98.55377018260896 -62.60000000000005
+ vertex -157.45730805369132 -98.60828886054645 617.3999999999999
+ vertex -157.87141852585535 -98.55377018260896 617.3999999999999
+ endloop
+endfacet
+facet normal -0.3826834323651285 0.9238795325112709 -2.2424847134411695e-16
+ outer loop
+ vertex -170.96730435272855 -109.49925150467148 617.3999999999999
+ vertex -170.58141482489256 -109.33941082866406 -62.60000000000005
+ vertex -170.96730435272855 -109.49925150467148 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.3826834323651285 0.9238795325112709 -2.2424847134411695e-16
+ outer loop
+ vertex -170.58141482489256 -109.33941082866406 -62.60000000000005
+ vertex -170.96730435272855 -109.49925150467148 617.3999999999999
+ vertex -170.58141482489256 -109.33941082866406 617.3999999999999
+ endloop
+endfacet
+facet normal 0.38268343236506736 0.9238795325112962 -2.3591011986530397e-16
+ outer loop
+ vertex -158.28552899801934 -101.6992515046715 617.3999999999999
+ vertex -158.67141852585533 -101.53941082866409 -62.60000000000005
+ vertex -158.67141852585533 -101.53941082866409 617.3999999999999
+ endloop
+endfacet
+facet normal 0.38268343236506736 0.9238795325112962 -2.3591011986530397e-16
+ outer loop
+ vertex -158.67141852585533 -101.53941082866409 -62.60000000000005
+ vertex -158.28552899801934 -101.6992515046715 617.3999999999999
+ vertex -158.28552899801934 -101.6992515046715 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112702 0.3826834323651299 -1.093788196704608e-16
+ outer loop
+ vertex -159.25705917191044 -100.95377018260898 617.3999999999999
+ vertex -159.41689984791785 -100.56788065477302 -62.60000000000005
+ vertex -159.41689984791785 -100.56788065477302 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112702 0.3826834323651299 -1.093788196704608e-16
+ outer loop
+ vertex -159.41689984791785 -100.56788065477302 -62.60000000000005
+ vertex -159.25705917191044 -100.95377018260898 617.3999999999999
+ vertex -159.25705917191044 -100.95377018260898 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087293 0.7933533402912285 -1.8829806831558229e-16
+ outer loop
+ vertex -157.0714185258553 -101.53941082866406 617.3999999999999
+ vertex -156.74004767595684 -101.28514103250744 -62.60000000000005
+ vertex -157.0714185258553 -101.53941082866406 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087293 0.7933533402912285 -1.8829806831558229e-16
+ outer loop
+ vertex -156.74004767595684 -101.28514103250744 -62.60000000000005
+ vertex -157.0714185258553 -101.53941082866406 617.3999999999999
+ vertex -156.74004767595684 -101.28514103250744 617.3999999999999
+ endloop
+endfacet
+facet normal 0.991444861373804 0.1305261922200995 -4.761205154972974e-17
+ outer loop
+ vertex -172.9268961469551 -108.367880654773 617.3999999999999
+ vertex -172.9814148248926 -107.95377018260898 -62.60000000000005
+ vertex -172.9814148248926 -107.95377018260898 617.3999999999999
+ endloop
+endfacet
+facet normal 0.991444861373804 0.1305261922200995 -4.761205154972974e-17
+ outer loop
+ vertex -172.9814148248926 -107.95377018260898 -62.60000000000005
+ vertex -172.9268961469551 -108.367880654773 617.3999999999999
+ vertex -172.9268961469551 -108.367880654773 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222005393 0.99144486137381 -2.488942827790614e-16
+ outer loop
+ vertex -158.28552899801934 -101.6992515046715 617.3999999999999
+ vertex -157.87141852585532 -101.75377018260896 -62.60000000000005
+ vertex -158.28552899801934 -101.6992515046715 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222005393 0.99144486137381 -2.488942827790614e-16
+ outer loop
+ vertex -157.87141852585532 -101.75377018260896 -62.60000000000005
+ vertex -158.28552899801934 -101.6992515046715 617.3999999999999
+ vertex -157.87141852585532 -101.75377018260896 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222003814 0.9914448613738123 -2.488942827790617e-16
+ outer loop
+ vertex -171.7955252970566 -109.49925150467148 617.3999999999999
+ vertex -171.38141482489257 -109.55377018260897 -62.60000000000005
+ vertex -171.7955252970566 -109.49925150467148 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222003814 0.9914448613738123 -2.488942827790617e-16
+ outer loop
+ vertex -171.38141482489257 -109.55377018260897 -62.60000000000005
+ vertex -171.7955252970566 -109.49925150467148 617.3999999999999
+ vertex -171.38141482489257 -109.55377018260897 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087293 -0.7933533402912285 1.8829806831558229e-16
+ outer loop
+ vertex -172.18141482489258 -106.56812953655387 617.3999999999999
+ vertex -172.51278567479108 -106.8223993327105 -62.60000000000005
+ vertex -172.18141482489258 -106.56812953655387 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.6087614290087293 -0.7933533402912285 1.8829806831558229e-16
+ outer loop
+ vertex -172.51278567479108 -106.8223993327105 -62.60000000000005
+ vertex -172.18141482489258 -106.56812953655387 617.3999999999999
+ vertex -172.51278567479108 -106.8223993327105 617.3999999999999
+ endloop
+endfacet
+facet normal 0.608761429008704 0.793353340291248 -2.0684907214263136e-16
+ outer loop
+ vertex -172.18141482489256 -109.33941082866409 617.3999999999999
+ vertex -172.51278567479108 -109.08514103250747 -62.60000000000005
+ vertex -172.51278567479108 -109.08514103250747 617.3999999999999
+ endloop
+endfacet
+facet normal 0.608761429008704 0.793353340291248 -2.0684907214263136e-16
+ outer loop
+ vertex -172.51278567479108 -109.08514103250747 -62.60000000000005
+ vertex -172.18141482489256 -109.33941082866409 617.3999999999999
+ vertex -172.18141482489256 -109.33941082866409 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222002979 0.9914448613738133 -2.44916711638679e-16
+ outer loop
+ vertex -171.38141482489257 -109.55377018260897 617.3999999999999
+ vertex -170.96730435272855 -109.49925150467148 -62.60000000000005
+ vertex -171.38141482489257 -109.55377018260897 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222002979 0.9914448613738133 -2.44916711638679e-16
+ outer loop
+ vertex -170.96730435272855 -109.49925150467148 -62.60000000000005
+ vertex -171.38141482489257 -109.55377018260897 617.3999999999999
+ vertex -170.96730435272855 -109.49925150467148 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087455 0.7933533402912161 -2.0684907214262404e-16
+ outer loop
+ vertex -158.67141852585533 -101.53941082866409 617.3999999999999
+ vertex -159.0027893757538 -101.28514103250745 -62.60000000000005
+ vertex -159.0027893757538 -101.28514103250745 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087455 0.7933533402912161 -2.0684907214262404e-16
+ outer loop
+ vertex -159.0027893757538 -101.28514103250745 -62.60000000000005
+ vertex -158.67141852585533 -101.53941082866409 617.3999999999999
+ vertex -158.67141852585533 -101.53941082866409 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738139 -0.13052619222002612 1.739939920148668e-17
+ outer loop
+ vertex -159.47141852585534 -100.15377018260898 617.3999999999999
+ vertex -159.41689984791785 -99.73965971044495 -62.60000000000005
+ vertex -159.41689984791785 -99.73965971044495 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738139 -0.13052619222002612 1.739939920148668e-17
+ outer loop
+ vertex -159.41689984791785 -99.73965971044495 -62.60000000000005
+ vertex -159.47141852585534 -100.15377018260898 617.3999999999999
+ vertex -159.47141852585534 -100.15377018260898 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087293 0.7933533402912285 -1.8829806831558229e-16
+ outer loop
+ vertex -170.58141482489256 -109.33941082866406 617.3999999999999
+ vertex -170.2500439749941 -109.08514103250742 -62.60000000000005
+ vertex -170.58141482489256 -109.33941082866406 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087293 0.7933533402912285 -1.8829806831558229e-16
+ outer loop
+ vertex -170.2500439749941 -109.08514103250742 -62.60000000000005
+ vertex -170.58141482489256 -109.33941082866406 617.3999999999999
+ vertex -170.2500439749941 -109.08514103250742 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738123 -0.13052619222003833 1.7399399201489748e-17
+ outer loop
+ vertex -172.9814148248926 -107.95377018260898 617.3999999999999
+ vertex -172.92689614695513 -107.53965971044495 -62.60000000000005
+ vertex -172.92689614695513 -107.53965971044495 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738123 -0.13052619222003833 1.7399399201489748e-17
+ outer loop
+ vertex -172.92689614695513 -107.53965971044495 -62.60000000000005
+ vertex -172.9814148248926 -107.95377018260898 617.3999999999999
+ vertex -172.9814148248926 -107.95377018260898 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912176 -0.6087614290087435 1.3951546310861635e-16
+ outer loop
+ vertex -172.51278567479108 -106.8223993327105 617.3999999999999
+ vertex -172.7670554709477 -107.15377018260895 -62.60000000000005
+ vertex -172.51278567479108 -106.8223993327105 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912176 -0.6087614290087435 1.3951546310861635e-16
+ outer loop
+ vertex -172.7670554709477 -107.15377018260895 -62.60000000000005
+ vertex -172.51278567479108 -106.8223993327105 617.3999999999999
+ vertex -172.7670554709477 -107.15377018260895 617.3999999999999
+ endloop
+endfacet
+facet normal 0.38268343236509794 -0.9238795325112834 2.242484713441205e-16
+ outer loop
+ vertex -158.28552899801937 -98.60828886054645 617.3999999999999
+ vertex -158.67141852585536 -98.76812953655387 -62.60000000000005
+ vertex -158.28552899801937 -98.60828886054645 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.38268343236509794 -0.9238795325112834 2.242484713441205e-16
+ outer loop
+ vertex -158.67141852585536 -98.76812953655387 -62.60000000000005
+ vertex -158.28552899801937 -98.60828886054645 617.3999999999999
+ vertex -158.67141852585536 -98.76812953655387 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912404 -0.6087614290087139 1.3951546310860865e-16
+ outer loop
+ vertex -159.00278937575385 -99.0223993327105 617.3999999999999
+ vertex -159.25705917191047 -99.35377018260897 -62.60000000000005
+ vertex -159.00278937575385 -99.0223993327105 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912404 -0.6087614290087139 1.3951546310860865e-16
+ outer loop
+ vertex -159.25705917191047 -99.35377018260897 -62.60000000000005
+ vertex -159.00278937575385 -99.0223993327105 617.3999999999999
+ vertex -159.25705917191047 -99.35377018260897 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222007497 0.9914448613738074 -2.4491671163867684e-16
+ outer loop
+ vertex -157.87141852585532 -101.75377018260896 617.3999999999999
+ vertex -157.45730805369126 -101.69925150467147 -62.60000000000005
+ vertex -157.87141852585532 -101.75377018260896 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222007497 0.9914448613738074 -2.4491671163867684e-16
+ outer loop
+ vertex -157.45730805369126 -101.69925150467147 -62.60000000000005
+ vertex -157.87141852585532 -101.75377018260896 617.3999999999999
+ vertex -157.45730805369126 -101.69925150467147 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112913 0.38268343236507874 -1.0937881967044837e-16
+ outer loop
+ vertex -172.76705547094767 -108.753770182609 617.3999999999999
+ vertex -172.9268961469551 -108.367880654773 -62.60000000000005
+ vertex -172.9268961469551 -108.367880654773 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112913 0.38268343236507874 -1.0937881967044837e-16
+ outer loop
+ vertex -172.9268961469551 -108.367880654773 -62.60000000000005
+ vertex -172.76705547094767 -108.753770182609 617.3999999999999
+ vertex -172.76705547094767 -108.753770182609 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912286 0.6087614290087291 -1.6369160198769096e-16
+ outer loop
+ vertex -172.51278567479108 -109.08514103250747 617.3999999999999
+ vertex -172.76705547094767 -108.753770182609 -62.60000000000005
+ vertex -172.76705547094767 -108.753770182609 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912286 0.6087614290087291 -1.6369160198769096e-16
+ outer loop
+ vertex -172.76705547094767 -108.753770182609 -62.60000000000005
+ vertex -172.51278567479108 -109.08514103250747 617.3999999999999
+ vertex -172.51278567479108 -109.08514103250747 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222006068 -0.9914448613738093 2.449167116386776e-16
+ outer loop
+ vertex -157.87141852585535 -98.55377018260896 617.3999999999999
+ vertex -158.28552899801937 -98.60828886054645 -62.60000000000005
+ vertex -157.87141852585535 -98.55377018260896 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222006068 -0.9914448613738093 2.449167116386776e-16
+ outer loop
+ vertex -158.28552899801937 -98.60828886054645 -62.60000000000005
+ vertex -157.87141852585535 -98.55377018260896 617.3999999999999
+ vertex -158.28552899801937 -98.60828886054645 617.3999999999999
+ endloop
+endfacet
+facet normal -0.3826834323650711 -0.9238795325112945 2.359101198653036e-16
+ outer loop
+ vertex -157.07141852585534 -98.76812953655386 -62.60000000000005
+ vertex -157.45730805369132 -98.60828886054645 617.3999999999999
+ vertex -157.45730805369132 -98.60828886054645 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.3826834323650711 -0.9238795325112945 2.359101198653036e-16
+ outer loop
+ vertex -157.45730805369132 -98.60828886054645 617.3999999999999
+ vertex -157.07141852585534 -98.76812953655386 -62.60000000000005
+ vertex -157.07141852585534 -98.76812953655386 617.3999999999999
+ endloop
+endfacet
+facet normal 0.3826834323650635 0.9238795325112976 -2.3591011986530427e-16
+ outer loop
+ vertex -171.7955252970566 -109.49925150467148 617.3999999999999
+ vertex -172.18141482489256 -109.33941082866409 -62.60000000000005
+ vertex -172.18141482489256 -109.33941082866409 617.3999999999999
+ endloop
+endfacet
+facet normal 0.3826834323650635 0.9238795325112976 -2.3591011986530427e-16
+ outer loop
+ vertex -172.18141482489256 -109.33941082866409 -62.60000000000005
+ vertex -171.7955252970566 -109.49925150467148 617.3999999999999
+ vertex -171.7955252970566 -109.49925150467148 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912404 0.6087614290087139 -1.3951546310860865e-16
+ outer loop
+ vertex -156.74004767595684 -101.28514103250744 617.3999999999999
+ vertex -156.48577787980022 -100.95377018260896 -62.60000000000005
+ vertex -156.74004767595684 -101.28514103250744 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912404 0.6087614290087139 -1.3951546310860865e-16
+ outer loop
+ vertex -156.48577787980022 -100.95377018260896 -62.60000000000005
+ vertex -156.74004767595684 -101.28514103250744 617.3999999999999
+ vertex -156.48577787980022 -100.95377018260896 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912176 0.6087614290087435 -1.3951546310861635e-16
+ outer loop
+ vertex -170.2500439749941 -109.08514103250742 617.3999999999999
+ vertex -169.99577417883745 -108.75377018260897 -62.60000000000005
+ vertex -170.2500439749941 -109.08514103250742 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912176 0.6087614290087435 -1.3951546310861635e-16
+ outer loop
+ vertex -169.99577417883745 -108.75377018260897 -62.60000000000005
+ vertex -170.2500439749941 -109.08514103250742 617.3999999999999
+ vertex -169.99577417883745 -108.75377018260897 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112851 -0.38268343236509406 8.122510965099015e-17
+ outer loop
+ vertex -172.7670554709477 -107.15377018260895 617.3999999999999
+ vertex -172.92689614695513 -107.53965971044495 -62.60000000000005
+ vertex -172.7670554709477 -107.15377018260895 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112851 -0.38268343236509406 8.122510965099015e-17
+ outer loop
+ vertex -172.92689614695513 -107.53965971044495 -62.60000000000005
+ vertex -172.7670554709477 -107.15377018260895 617.3999999999999
+ vertex -172.92689614695513 -107.53965971044495 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112936 -0.38268343236507346 8.122510965098492e-17
+ outer loop
+ vertex -159.25705917191047 -99.35377018260897 617.3999999999999
+ vertex -159.41689984791785 -99.73965971044495 -62.60000000000005
+ vertex -159.25705917191047 -99.35377018260897 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112936 -0.38268343236507346 8.122510965098492e-17
+ outer loop
+ vertex -159.41689984791785 -99.73965971044495 -62.60000000000005
+ vertex -159.25705917191047 -99.35377018260897 617.3999999999999
+ vertex -159.41689984791785 -99.73965971044495 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087293 -0.7933533402912285 1.8829806831558229e-16
+ outer loop
+ vertex -179.98141482489262 -93.05813323751663 617.3999999999999
+ vertex -180.3127856747911 -93.31240303367325 -62.60000000000005
+ vertex -179.98141482489262 -93.05813323751663 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.6087614290087293 -0.7933533402912285 1.8829806831558229e-16
+ outer loop
+ vertex -180.3127856747911 -93.31240303367325 -62.60000000000005
+ vertex -179.98141482489262 -93.05813323751663 617.3999999999999
+ vertex -180.3127856747911 -93.31240303367325 617.3999999999999
+ endloop
+endfacet
+facet normal 0.3826834323650711 0.9238795325112945 -2.359101198653036e-16
+ outer loop
+ vertex -179.5955252970566 -95.98925520563425 617.3999999999999
+ vertex -179.98141482489257 -95.82941452962685 -62.60000000000005
+ vertex -179.98141482489257 -95.82941452962685 617.3999999999999
+ endloop
+endfacet
+facet normal 0.3826834323650711 0.9238795325112945 -2.359101198653036e-16
+ outer loop
+ vertex -179.98141482489257 -95.82941452962685 -62.60000000000005
+ vertex -179.5955252970566 -95.98925520563425 617.3999999999999
+ vertex -179.5955252970566 -95.98925520563425 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.608761429008704 -0.793353340291248 2.0684907214263136e-16
+ outer loop
+ vertex -170.25004397499413 -106.82239933271049 -62.60000000000005
+ vertex -170.5814148248926 -106.56812953655385 617.3999999999999
+ vertex -170.5814148248926 -106.56812953655385 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.608761429008704 -0.793353340291248 2.0684907214263136e-16
+ outer loop
+ vertex -170.5814148248926 -106.56812953655385 617.3999999999999
+ vertex -170.25004397499413 -106.82239933271049 -62.60000000000005
+ vertex -170.25004397499413 -106.82239933271049 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738139 0.1305261922200255 -1.739939920148656e-17
+ outer loop
+ vertex -177.63593350283008 -94.85788435573575 -62.60000000000005
+ vertex -177.5814148248926 -94.44377388357171 617.3999999999999
+ vertex -177.5814148248926 -94.44377388357171 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738139 0.1305261922200255 -1.739939920148656e-17
+ outer loop
+ vertex -177.5814148248926 -94.44377388357171 617.3999999999999
+ vertex -177.63593350283008 -94.85788435573575 -62.60000000000005
+ vertex -177.63593350283008 -94.85788435573575 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738066 0.1305261922200808 -1.7399399201500422e-17
+ outer loop
+ vertex -169.83593350283007 -108.36788065477299 -62.60000000000005
+ vertex -169.78141482489258 -107.95377018260895 617.3999999999999
+ vertex -169.78141482489258 -107.95377018260895 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738066 0.1305261922200808 -1.7399399201500422e-17
+ outer loop
+ vertex -169.78141482489258 -107.95377018260895 617.3999999999999
+ vertex -169.83593350283007 -108.36788065477299 -62.60000000000005
+ vertex -169.83593350283007 -108.36788065477299 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222003814 -0.9914448613738123 2.488942827790617e-16
+ outer loop
+ vertex -170.96730435272858 -106.40828886054645 617.3999999999999
+ vertex -171.3814148248926 -106.35377018260895 -62.60000000000005
+ vertex -170.96730435272858 -106.40828886054645 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222003814 -0.9914448613738123 2.488942827790617e-16
+ outer loop
+ vertex -171.3814148248926 -106.35377018260895 -62.60000000000005
+ vertex -170.96730435272858 -106.40828886054645 617.3999999999999
+ vertex -171.3814148248926 -106.35377018260895 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738132 0.13052619222003214 -4.7612051549713106e-17
+ outer loop
+ vertex -180.7268961469551 -94.85788435573578 617.3999999999999
+ vertex -180.7814148248926 -94.44377388357174 -62.60000000000005
+ vertex -180.7814148248926 -94.44377388357174 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738132 0.13052619222003214 -4.7612051549713106e-17
+ outer loop
+ vertex -180.7814148248926 -94.44377388357174 -62.60000000000005
+ vertex -180.7268961469551 -94.85788435573578 617.3999999999999
+ vertex -180.7268961469551 -94.85788435573578 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112936 -0.38268343236507346 8.122510965098492e-17
+ outer loop
+ vertex -180.5670554709477 -93.64377388357174 617.3999999999999
+ vertex -180.7268961469551 -94.0296634114077 -62.60000000000005
+ vertex -180.5670554709477 -93.64377388357174 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112936 -0.38268343236507346 8.122510965098492e-17
+ outer loop
+ vertex -180.7268961469551 -94.0296634114077 -62.60000000000005
+ vertex -180.5670554709477 -93.64377388357174 617.3999999999999
+ vertex -180.7268961469551 -94.0296634114077 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087435 0.7933533402912177 -2.0684907214262443e-16
+ outer loop
+ vertex -179.98141482489257 -95.82941452962685 617.3999999999999
+ vertex -180.31278567479106 -95.5751447334702 -62.60000000000005
+ vertex -180.31278567479106 -95.5751447334702 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087435 0.7933533402912177 -2.0684907214262443e-16
+ outer loop
+ vertex -180.31278567479106 -95.5751447334702 -62.60000000000005
+ vertex -179.98141482489257 -95.82941452962685 617.3999999999999
+ vertex -179.98141482489257 -95.82941452962685 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112887 -0.3826834323650853 1.0937881967044996e-16
+ outer loop
+ vertex -169.83593350283007 -107.53965971044492 -62.60000000000005
+ vertex -169.99577417883748 -107.15377018260895 617.3999999999999
+ vertex -169.99577417883748 -107.15377018260895 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112887 -0.3826834323650853 1.0937881967044996e-16
+ outer loop
+ vertex -169.99577417883748 -107.15377018260895 617.3999999999999
+ vertex -169.83593350283007 -107.53965971044492 -62.60000000000005
+ vertex -169.83593350283007 -107.53965971044492 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222005393 0.99144486137381 -2.488942827790614e-16
+ outer loop
+ vertex -179.5955252970566 -95.98925520563425 617.3999999999999
+ vertex -179.18141482489258 -96.04377388357173 -62.60000000000005
+ vertex -179.5955252970566 -95.98925520563425 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222005393 0.99144486137381 -2.488942827790614e-16
+ outer loop
+ vertex -179.18141482489258 -96.04377388357173 -62.60000000000005
+ vertex -179.5955252970566 -95.98925520563425 617.3999999999999
+ vertex -179.18141482489258 -96.04377388357173 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222006068 0.9914448613738093 -2.449167116386776e-16
+ outer loop
+ vertex -179.18141482489258 -96.04377388357173 617.3999999999999
+ vertex -178.76730435272856 -95.98925520563425 -62.60000000000005
+ vertex -179.18141482489258 -96.04377388357173 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222006068 0.9914448613738093 -2.449167116386776e-16
+ outer loop
+ vertex -178.76730435272856 -95.98925520563425 -62.60000000000005
+ vertex -179.18141482489258 -96.04377388357173 617.3999999999999
+ vertex -178.76730435272856 -95.98925520563425 617.3999999999999
+ endloop
+endfacet
+facet normal -0.38268343236509794 0.9238795325112834 -2.242484713441205e-16
+ outer loop
+ vertex -178.76730435272856 -95.98925520563425 617.3999999999999
+ vertex -178.38141482489257 -95.82941452962682 -62.60000000000005
+ vertex -178.76730435272856 -95.98925520563425 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.38268343236509794 0.9238795325112834 -2.242484713441205e-16
+ outer loop
+ vertex -178.38141482489257 -95.82941452962682 -62.60000000000005
+ vertex -178.76730435272856 -95.98925520563425 617.3999999999999
+ vertex -178.38141482489257 -95.82941452962682 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112976 0.3826834323650636 -8.122510965098238e-17
+ outer loop
+ vertex -169.99577417883745 -108.75377018260897 617.3999999999999
+ vertex -169.83593350283007 -108.36788065477299 -62.60000000000005
+ vertex -169.99577417883745 -108.75377018260897 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112976 0.3826834323650636 -8.122510965098238e-17
+ outer loop
+ vertex -169.83593350283007 -108.36788065477299 -62.60000000000005
+ vertex -169.99577417883745 -108.75377018260897 617.3999999999999
+ vertex -169.83593350283007 -108.36788065477299 617.3999999999999
+ endloop
+endfacet
+facet normal 0.3826834323651285 -0.9238795325112709 2.2424847134411695e-16
+ outer loop
+ vertex -171.79552529705666 -106.40828886054645 617.3999999999999
+ vertex -172.18141482489258 -106.56812953655387 -62.60000000000005
+ vertex -171.79552529705666 -106.40828886054645 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.3826834323651285 -0.9238795325112709 2.2424847134411695e-16
+ outer loop
+ vertex -172.18141482489258 -106.56812953655387 -62.60000000000005
+ vertex -171.79552529705666 -106.40828886054645 617.3999999999999
+ vertex -172.18141482489258 -106.56812953655387 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087455 -0.7933533402912161 2.0684907214262404e-16
+ outer loop
+ vertex -178.05004397499414 -93.31240303367323 -62.60000000000005
+ vertex -178.3814148248926 -93.0581332375166 617.3999999999999
+ vertex -178.3814148248926 -93.0581332375166 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087455 -0.7933533402912161 2.0684907214262404e-16
+ outer loop
+ vertex -178.3814148248926 -93.0581332375166 617.3999999999999
+ vertex -178.05004397499414 -93.31240303367323 -62.60000000000005
+ vertex -178.05004397499414 -93.31240303367323 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222005393 -0.99144486137381 2.488942827790614e-16
+ outer loop
+ vertex -178.76730435272856 -92.89829256150921 617.3999999999999
+ vertex -179.1814148248926 -92.84377388357171 -62.60000000000005
+ vertex -178.76730435272856 -92.89829256150921 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222005393 -0.99144486137381 2.488942827790614e-16
+ outer loop
+ vertex -179.1814148248926 -92.84377388357171 -62.60000000000005
+ vertex -178.76730435272856 -92.89829256150921 617.3999999999999
+ vertex -179.1814148248926 -92.84377388357171 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912293 0.6087614290087284 -1.6369160198769076e-16
+ outer loop
+ vertex -180.31278567479106 -95.5751447334702 617.3999999999999
+ vertex -180.56705547094768 -95.24377388357173 -62.60000000000005
+ vertex -180.56705547094768 -95.24377388357173 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912293 0.6087614290087284 -1.6369160198769076e-16
+ outer loop
+ vertex -180.56705547094768 -95.24377388357173 -62.60000000000005
+ vertex -180.31278567479106 -95.5751447334702 617.3999999999999
+ vertex -180.31278567479106 -95.5751447334702 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112936 0.38268343236507346 -8.122510965098492e-17
+ outer loop
+ vertex -177.79577417883746 -95.2437738835717 617.3999999999999
+ vertex -177.63593350283008 -94.85788435573575 -62.60000000000005
+ vertex -177.79577417883746 -95.2437738835717 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112936 0.38268343236507346 -8.122510965098492e-17
+ outer loop
+ vertex -177.63593350283008 -94.85788435573575 -62.60000000000005
+ vertex -177.79577417883746 -95.2437738835717 617.3999999999999
+ vertex -177.63593350283008 -94.85788435573575 617.3999999999999
+ endloop
+endfacet
+facet normal -0.38268343236506736 -0.9238795325112962 2.3591011986530397e-16
+ outer loop
+ vertex -178.3814148248926 -93.0581332375166 -62.60000000000005
+ vertex -178.76730435272856 -92.89829256150921 617.3999999999999
+ vertex -178.76730435272856 -92.89829256150921 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.38268343236506736 -0.9238795325112962 2.3591011986530397e-16
+ outer loop
+ vertex -178.76730435272856 -92.89829256150921 617.3999999999999
+ vertex -178.3814148248926 -93.0581332375166 -62.60000000000005
+ vertex -178.3814148248926 -93.0581332375166 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738069 -0.13052619222007897 4.7612051549724674e-17
+ outer loop
+ vertex -169.78141482489258 -107.95377018260895 -62.60000000000005
+ vertex -169.83593350283007 -107.53965971044492 617.3999999999999
+ vertex -169.83593350283007 -107.53965971044492 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738069 -0.13052619222007897 4.7612051549724674e-17
+ outer loop
+ vertex -169.83593350283007 -107.53965971044492 617.3999999999999
+ vertex -169.78141482489258 -107.95377018260895 -62.60000000000005
+ vertex -169.78141482489258 -107.95377018260895 617.3999999999999
+ endloop
+endfacet
+facet normal -0.3826834323650635 -0.9238795325112976 2.3591011986530427e-16
+ outer loop
+ vertex -170.5814148248926 -106.56812953655385 -62.60000000000005
+ vertex -170.96730435272858 -106.40828886054645 617.3999999999999
+ vertex -170.96730435272858 -106.40828886054645 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.3826834323650635 -0.9238795325112976 2.3591011986530427e-16
+ outer loop
+ vertex -170.96730435272858 -106.40828886054645 617.3999999999999
+ vertex -170.5814148248926 -106.56812953655385 -62.60000000000005
+ vertex -170.5814148248926 -106.56812953655385 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912404 -0.6087614290087139 1.3951546310860865e-16
+ outer loop
+ vertex -180.3127856747911 -93.31240303367325 617.3999999999999
+ vertex -180.5670554709477 -93.64377388357174 -62.60000000000005
+ vertex -180.3127856747911 -93.31240303367325 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912404 -0.6087614290087139 1.3951546310860865e-16
+ outer loop
+ vertex -180.5670554709477 -93.64377388357174 -62.60000000000005
+ vertex -180.3127856747911 -93.31240303367325 617.3999999999999
+ vertex -180.5670554709477 -93.64377388357174 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087293 0.7933533402912285 -1.8829806831558229e-16
+ outer loop
+ vertex -178.38141482489257 -95.82941452962682 617.3999999999999
+ vertex -178.0500439749941 -95.5751447334702 -62.60000000000005
+ vertex -178.38141482489257 -95.82941452962682 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087293 0.7933533402912285 -1.8829806831558229e-16
+ outer loop
+ vertex -178.0500439749941 -95.5751447334702 -62.60000000000005
+ vertex -178.38141482489257 -95.82941452962682 617.3999999999999
+ vertex -178.0500439749941 -95.5751447334702 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738139 -0.13052619222002612 1.739939920148668e-17
+ outer loop
+ vertex -180.7814148248926 -94.44377388357174 617.3999999999999
+ vertex -180.7268961469551 -94.0296634114077 -62.60000000000005
+ vertex -180.7268961469551 -94.0296634114077 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738139 -0.13052619222002612 1.739939920148668e-17
+ outer loop
+ vertex -180.7268961469551 -94.0296634114077 -62.60000000000005
+ vertex -180.7814148248926 -94.44377388357174 617.3999999999999
+ vertex -180.7814148248926 -94.44377388357174 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912286 -0.6087614290087291 1.6369160198769096e-16
+ outer loop
+ vertex -177.7957741788375 -93.64377388357171 -62.60000000000005
+ vertex -178.05004397499414 -93.31240303367323 617.3999999999999
+ vertex -178.05004397499414 -93.31240303367323 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912286 -0.6087614290087291 1.6369160198769096e-16
+ outer loop
+ vertex -178.05004397499414 -93.31240303367323 617.3999999999999
+ vertex -177.7957741788375 -93.64377388357171 -62.60000000000005
+ vertex -177.7957741788375 -93.64377388357171 617.3999999999999
+ endloop
+endfacet
+facet normal 0.38268343236509833 -0.9238795325112832 2.2424847134412045e-16
+ outer loop
+ vertex -179.59552529705667 -92.89829256150922 617.3999999999999
+ vertex -179.98141482489262 -93.05813323751663 -62.60000000000005
+ vertex -179.59552529705667 -92.89829256150922 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.38268343236509833 -0.9238795325112832 2.2424847134412045e-16
+ outer loop
+ vertex -179.98141482489262 -93.05813323751663 -62.60000000000005
+ vertex -179.59552529705667 -92.89829256150922 617.3999999999999
+ vertex -179.98141482489262 -93.05813323751663 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222002979 -0.9914448613738133 2.44916711638679e-16
+ outer loop
+ vertex -171.3814148248926 -106.35377018260895 617.3999999999999
+ vertex -171.79552529705666 -106.40828886054645 -62.60000000000005
+ vertex -171.3814148248926 -106.35377018260895 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222002979 -0.9914448613738133 2.44916711638679e-16
+ outer loop
+ vertex -171.79552529705666 -106.40828886054645 -62.60000000000005
+ vertex -171.3814148248926 -106.35377018260895 617.3999999999999
+ vertex -171.79552529705666 -106.40828886054645 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112706 0.3826834323651291 -1.093788196704606e-16
+ outer loop
+ vertex -180.56705547094768 -95.24377388357173 617.3999999999999
+ vertex -180.7268961469551 -94.85788435573578 -62.60000000000005
+ vertex -180.7268961469551 -94.85788435573578 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112706 0.3826834323651291 -1.093788196704606e-16
+ outer loop
+ vertex -180.7268961469551 -94.85788435573578 -62.60000000000005
+ vertex -180.56705547094768 -95.24377388357173 617.3999999999999
+ vertex -180.56705547094768 -95.24377388357173 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222007497 -0.9914448613738074 2.4491671163867684e-16
+ outer loop
+ vertex -179.1814148248926 -92.84377388357171 617.3999999999999
+ vertex -179.59552529705667 -92.89829256150922 -62.60000000000005
+ vertex -179.1814148248926 -92.84377388357171 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222007497 -0.9914448613738074 2.4491671163867684e-16
+ outer loop
+ vertex -179.59552529705667 -92.89829256150922 -62.60000000000005
+ vertex -179.1814148248926 -92.84377388357171 617.3999999999999
+ vertex -179.59552529705667 -92.89829256150922 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912404 0.6087614290087139 -1.3951546310860865e-16
+ outer loop
+ vertex -178.0500439749941 -95.5751447334702 617.3999999999999
+ vertex -177.79577417883746 -95.2437738835717 -62.60000000000005
+ vertex -178.0500439749941 -95.5751447334702 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912404 0.6087614290087139 -1.3951546310860865e-16
+ outer loop
+ vertex -177.79577417883746 -95.2437738835717 -62.60000000000005
+ vertex -178.0500439749941 -95.5751447334702 617.3999999999999
+ vertex -177.79577417883746 -95.2437738835717 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912286 -0.6087614290087291 1.6369160198769096e-16
+ outer loop
+ vertex -169.99577417883748 -107.15377018260895 -62.60000000000005
+ vertex -170.25004397499413 -106.82239933271049 617.3999999999999
+ vertex -170.25004397499413 -106.82239933271049 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912286 -0.6087614290087291 1.6369160198769096e-16
+ outer loop
+ vertex -170.25004397499413 -106.82239933271049 617.3999999999999
+ vertex -169.99577417883748 -107.15377018260895 -62.60000000000005
+ vertex -169.99577417883748 -107.15377018260895 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222002979 0.9914448613738133 -2.44916711638679e-16
+ outer loop
+ vertex -165.67141852585536 -88.24377388357172 617.3999999999999
+ vertex -165.25730805369133 -88.18925520563424 -62.60000000000005
+ vertex -165.67141852585536 -88.24377388357172 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222002979 0.9914448613738133 -2.44916711638679e-16
+ outer loop
+ vertex -165.25730805369133 -88.18925520563424 -62.60000000000005
+ vertex -165.67141852585536 -88.24377388357172 617.3999999999999
+ vertex -165.25730805369133 -88.18925520563424 617.3999999999999
+ endloop
+endfacet
+facet normal -0.3826834323651285 0.9238795325112709 -2.2424847134411695e-16
+ outer loop
+ vertex -165.25730805369133 -88.18925520563424 617.3999999999999
+ vertex -164.87141852585535 -88.02941452962682 -62.60000000000005
+ vertex -165.25730805369133 -88.18925520563424 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.3826834323651285 0.9238795325112709 -2.2424847134411695e-16
+ outer loop
+ vertex -164.87141852585535 -88.02941452962682 -62.60000000000005
+ vertex -165.25730805369133 -88.18925520563424 617.3999999999999
+ vertex -164.87141852585535 -88.02941452962682 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912176 0.6087614290087435 -1.3951546310861635e-16
+ outer loop
+ vertex -164.54004767595688 -87.7751447334702 617.3999999999999
+ vertex -164.28577787980024 -87.44377388357172 -62.60000000000005
+ vertex -164.54004767595688 -87.7751447334702 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912176 0.6087614290087435 -1.3951546310861635e-16
+ outer loop
+ vertex -164.28577787980024 -87.44377388357172 -62.60000000000005
+ vertex -164.54004767595688 -87.7751447334702 617.3999999999999
+ vertex -164.28577787980024 -87.44377388357172 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087293 0.7933533402912285 -1.8829806831558229e-16
+ outer loop
+ vertex -164.87141852585535 -88.02941452962682 617.3999999999999
+ vertex -164.54004767595688 -87.7751447334702 -62.60000000000005
+ vertex -164.87141852585535 -88.02941452962682 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087293 0.7933533402912285 -1.8829806831558229e-16
+ outer loop
+ vertex -164.54004767595688 -87.7751447334702 -62.60000000000005
+ vertex -164.87141852585535 -88.02941452962682 617.3999999999999
+ vertex -164.54004767595688 -87.7751447334702 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112702 -0.3826834323651299 1.093788196704608e-16
+ outer loop
+ vertex -177.63593350283008 -94.02966341140768 -62.60000000000005
+ vertex -177.7957741788375 -93.64377388357171 617.3999999999999
+ vertex -177.7957741788375 -93.64377388357171 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112702 -0.3826834323651299 1.093788196704608e-16
+ outer loop
+ vertex -177.7957741788375 -93.64377388357171 617.3999999999999
+ vertex -177.63593350283008 -94.02966341140768 -62.60000000000005
+ vertex -177.63593350283008 -94.02966341140768 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112913 -0.38268343236507874 1.0937881967044837e-16
+ outer loop
+ vertex -164.12593720379286 -86.22966341140767 -62.60000000000005
+ vertex -164.28577787980026 -85.8437738835717 617.3999999999999
+ vertex -164.28577787980026 -85.8437738835717 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112913 -0.38268343236507874 1.0937881967044837e-16
+ outer loop
+ vertex -164.28577787980026 -85.8437738835717 617.3999999999999
+ vertex -164.12593720379286 -86.22966341140767 -62.60000000000005
+ vertex -164.12593720379286 -86.22966341140767 617.3999999999999
+ endloop
+endfacet
+facet normal 0.3826834323651287 -0.9238795325112708 2.2424847134411695e-16
+ outer loop
+ vertex -166.0855289980194 -85.09829256150921 617.3999999999999
+ vertex -166.47141852585537 -85.25813323751663 -62.60000000000005
+ vertex -166.0855289980194 -85.09829256150921 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.3826834323651287 -0.9238795325112708 2.2424847134411695e-16
+ outer loop
+ vertex -166.47141852585537 -85.25813323751663 -62.60000000000005
+ vertex -166.0855289980194 -85.09829256150921 617.3999999999999
+ vertex -166.47141852585537 -85.25813323751663 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112978 -0.38268343236506336 8.12251096509823e-17
+ outer loop
+ vertex -167.05705917191048 -85.84377388357173 617.3999999999999
+ vertex -167.2168998479179 -86.2296634114077 -62.60000000000005
+ vertex -167.05705917191048 -85.84377388357173 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112978 -0.38268343236506336 8.12251096509823e-17
+ outer loop
+ vertex -167.2168998479179 -86.2296634114077 -62.60000000000005
+ vertex -167.05705917191048 -85.84377388357173 617.3999999999999
+ vertex -167.2168998479179 -86.2296634114077 617.3999999999999
+ endloop
+endfacet
+facet normal -0.991444861373804 -0.1305261922200995 4.761205154972974e-17
+ outer loop
+ vertex -164.07141852585536 -86.64377388357171 -62.60000000000005
+ vertex -164.12593720379286 -86.22966341140767 617.3999999999999
+ vertex -164.12593720379286 -86.22966341140767 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.991444861373804 -0.1305261922200995 4.761205154972974e-17
+ outer loop
+ vertex -164.12593720379286 -86.22966341140767 617.3999999999999
+ vertex -164.07141852585536 -86.64377388357171 -62.60000000000005
+ vertex -164.07141852585536 -86.64377388357171 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738066 -0.1305261922200808 1.7399399201500422e-17
+ outer loop
+ vertex -167.27141852585538 -86.64377388357174 617.3999999999999
+ vertex -167.2168998479179 -86.2296634114077 -62.60000000000005
+ vertex -167.2168998479179 -86.2296634114077 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738066 -0.1305261922200808 1.7399399201500422e-17
+ outer loop
+ vertex -167.2168998479179 -86.2296634114077 -62.60000000000005
+ vertex -167.27141852585538 -86.64377388357174 617.3999999999999
+ vertex -167.27141852585538 -86.64377388357174 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.38268343236510316 -0.9238795325112813 2.359101198653008e-16
+ outer loop
+ vertex -164.87141852585538 -85.2581332375166 -62.60000000000005
+ vertex -165.25730805369133 -85.0982925615092 617.3999999999999
+ vertex -165.25730805369133 -85.0982925615092 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.38268343236510316 -0.9238795325112813 2.359101198653008e-16
+ outer loop
+ vertex -165.25730805369133 -85.0982925615092 617.3999999999999
+ vertex -164.87141852585538 -85.2581332375166 -62.60000000000005
+ vertex -164.87141852585538 -85.2581332375166 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112887 0.3826834323650853 -1.0937881967044996e-16
+ outer loop
+ vertex -167.05705917191045 -87.44377388357175 617.3999999999999
+ vertex -167.2168998479179 -87.05788435573575 -62.60000000000005
+ vertex -167.2168998479179 -87.05788435573575 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112887 0.3826834323650853 -1.0937881967044996e-16
+ outer loop
+ vertex -167.2168998479179 -87.05788435573575 -62.60000000000005
+ vertex -167.05705917191045 -87.44377388357175 617.3999999999999
+ vertex -167.05705917191045 -87.44377388357175 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.3826834323650635 0.9238795325112976 -2.3591011986530427e-16
+ outer loop
+ vertex -166.08552899801936 -88.18925520563424 617.3999999999999
+ vertex -166.47141852585534 -88.02941452962685 -62.60000000000005
+ vertex -166.47141852585534 -88.02941452962685 617.3999999999999
+ endloop
+endfacet
+facet normal 0.3826834323650635 0.9238795325112976 -2.3591011986530427e-16
+ outer loop
+ vertex -166.47141852585534 -88.02941452962685 -62.60000000000005
+ vertex -166.08552899801936 -88.18925520563424 617.3999999999999
+ vertex -166.08552899801936 -88.18925520563424 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222003814 0.9914448613738123 -2.488942827790617e-16
+ outer loop
+ vertex -166.08552899801936 -88.18925520563424 617.3999999999999
+ vertex -165.67141852585536 -88.24377388357172 -62.60000000000005
+ vertex -166.08552899801936 -88.18925520563424 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222003814 0.9914448613738123 -2.488942827790617e-16
+ outer loop
+ vertex -165.67141852585536 -88.24377388357172 -62.60000000000005
+ vertex -166.08552899801936 -88.18925520563424 617.3999999999999
+ vertex -165.67141852585536 -88.24377388357172 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222000525 -0.9914448613738165 2.4889428277906226e-16
+ outer loop
+ vertex -165.25730805369133 -85.0982925615092 617.3999999999999
+ vertex -165.6714185258554 -85.04377388357173 -62.60000000000005
+ vertex -165.25730805369133 -85.0982925615092 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222000525 -0.9914448613738165 2.4889428277906226e-16
+ outer loop
+ vertex -165.6714185258554 -85.04377388357173 -62.60000000000005
+ vertex -165.25730805369133 -85.0982925615092 617.3999999999999
+ vertex -165.6714185258554 -85.04377388357173 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087038 -0.7933533402912482 2.0684907214263136e-16
+ outer loop
+ vertex -164.54004767595688 -85.51240303367324 -62.60000000000005
+ vertex -164.87141852585538 -85.2581332375166 617.3999999999999
+ vertex -164.87141852585538 -85.2581332375166 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087038 -0.7933533402912482 2.0684907214263136e-16
+ outer loop
+ vertex -164.87141852585538 -85.2581332375166 617.3999999999999
+ vertex -164.54004767595688 -85.51240303367324 -62.60000000000005
+ vertex -164.54004767595688 -85.51240303367324 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738123 0.1305261922200373 -1.7399399201489483e-17
+ outer loop
+ vertex -164.12593720379283 -87.05788435573575 -62.60000000000005
+ vertex -164.07141852585536 -86.64377388357171 617.3999999999999
+ vertex -164.07141852585536 -86.64377388357171 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738123 0.1305261922200373 -1.7399399201489483e-17
+ outer loop
+ vertex -164.07141852585536 -86.64377388357171 617.3999999999999
+ vertex -164.12593720379283 -87.05788435573575 -62.60000000000005
+ vertex -164.12593720379283 -87.05788435573575 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222002995 -0.9914448613738134 2.44916711638679e-16
+ outer loop
+ vertex -165.6714185258554 -85.04377388357173 617.3999999999999
+ vertex -166.0855289980194 -85.09829256150921 -62.60000000000005
+ vertex -165.6714185258554 -85.04377388357173 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222002995 -0.9914448613738134 2.44916711638679e-16
+ outer loop
+ vertex -166.0855289980194 -85.09829256150921 -62.60000000000005
+ vertex -165.6714185258554 -85.04377388357173 617.3999999999999
+ vertex -166.0855289980194 -85.09829256150921 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912176 -0.6087614290087435 1.3951546310861635e-16
+ outer loop
+ vertex -166.80278937575386 -85.51240303367325 617.3999999999999
+ vertex -167.05705917191048 -85.84377388357173 -62.60000000000005
+ vertex -166.80278937575386 -85.51240303367325 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912176 -0.6087614290087435 1.3951546310861635e-16
+ outer loop
+ vertex -167.05705917191048 -85.84377388357173 -62.60000000000005
+ vertex -166.80278937575386 -85.51240303367325 617.3999999999999
+ vertex -167.05705917191048 -85.84377388357173 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738132 -0.13052619222003214 4.7612051549713106e-17
+ outer loop
+ vertex -177.5814148248926 -94.44377388357171 -62.60000000000005
+ vertex -177.63593350283008 -94.02966341140768 617.3999999999999
+ vertex -177.63593350283008 -94.02966341140768 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738132 -0.13052619222003214 4.7612051549713106e-17
+ outer loop
+ vertex -177.63593350283008 -94.02966341140768 617.3999999999999
+ vertex -177.5814148248926 -94.44377388357171 -62.60000000000005
+ vertex -177.5814148248926 -94.44377388357171 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112851 0.38268343236509406 -8.122510965099015e-17
+ outer loop
+ vertex -164.28577787980024 -87.44377388357172 617.3999999999999
+ vertex -164.12593720379283 -87.05788435573575 -62.60000000000005
+ vertex -164.28577787980024 -87.44377388357172 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112851 0.38268343236509406 -8.122510965099015e-17
+ outer loop
+ vertex -164.12593720379283 -87.05788435573575 -62.60000000000005
+ vertex -164.28577787980024 -87.44377388357172 617.3999999999999
+ vertex -164.12593720379283 -87.05788435573575 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912286 -0.6087614290087291 1.6369160198769096e-16
+ outer loop
+ vertex -164.28577787980026 -85.8437738835717 -62.60000000000005
+ vertex -164.54004767595688 -85.51240303367324 617.3999999999999
+ vertex -164.54004767595688 -85.51240303367324 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912286 -0.6087614290087291 1.6369160198769096e-16
+ outer loop
+ vertex -164.54004767595688 -85.51240303367324 617.3999999999999
+ vertex -164.28577787980026 -85.8437738835717 -62.60000000000005
+ vertex -164.28577787980026 -85.8437738835717 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738069 0.13052619222007897 -4.7612051549724674e-17
+ outer loop
+ vertex -167.2168998479179 -87.05788435573575 617.3999999999999
+ vertex -167.27141852585538 -86.64377388357174 -62.60000000000005
+ vertex -167.27141852585538 -86.64377388357174 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738069 0.13052619222007897 -4.7612051549724674e-17
+ outer loop
+ vertex -167.27141852585538 -86.64377388357174 -62.60000000000005
+ vertex -167.2168998479179 -87.05788435573575 617.3999999999999
+ vertex -167.2168998479179 -87.05788435573575 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.608761429008704 0.793353340291248 -2.0684907214263136e-16
+ outer loop
+ vertex -166.47141852585534 -88.02941452962685 617.3999999999999
+ vertex -166.80278937575383 -87.77514473347021 -62.60000000000005
+ vertex -166.80278937575383 -87.77514473347021 617.3999999999999
+ endloop
+endfacet
+facet normal 0.608761429008704 0.793353340291248 -2.0684907214263136e-16
+ outer loop
+ vertex -166.80278937575383 -87.77514473347021 -62.60000000000005
+ vertex -166.47141852585534 -88.02941452962685 617.3999999999999
+ vertex -166.47141852585534 -88.02941452962685 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.6087614290087295 -0.7933533402912285 1.8829806831558229e-16
+ outer loop
+ vertex -166.47141852585537 -85.25813323751663 617.3999999999999
+ vertex -166.80278937575386 -85.51240303367325 -62.60000000000005
+ vertex -166.47141852585537 -85.25813323751663 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.6087614290087295 -0.7933533402912285 1.8829806831558229e-16
+ outer loop
+ vertex -166.80278937575386 -85.51240303367325 -62.60000000000005
+ vertex -166.47141852585537 -85.25813323751663 617.3999999999999
+ vertex -166.80278937575386 -85.51240303367325 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912286 0.6087614290087291 -1.6369160198769096e-16
+ outer loop
+ vertex -166.80278937575383 -87.77514473347021 617.3999999999999
+ vertex -167.05705917191045 -87.44377388357175 -62.60000000000005
+ vertex -167.05705917191045 -87.44377388357175 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912286 0.6087614290087291 -1.6369160198769096e-16
+ outer loop
+ vertex -167.05705917191045 -87.44377388357175 -62.60000000000005
+ vertex -166.80278937575383 -87.77514473347021 617.3999999999999
+ vertex -166.80278937575383 -87.77514473347021 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087241 0.7933533402912325 -1.8829806831558332e-16
+ outer loop
+ vertex -181.52775209062045 -93.29743661784383 617.3999999999999
+ vertex -181.32064530943393 -93.13851799524595 -62.60000000000005
+ vertex -181.52775209062045 -93.29743661784383 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087241 0.7933533402912325 -1.8829806831558332e-16
+ outer loop
+ vertex -181.32064530943393 -93.13851799524595 -62.60000000000005
+ vertex -181.52775209062045 -93.29743661784383 617.3999999999999
+ vertex -181.32064530943393 -93.13851799524595 617.3999999999999
+ endloop
+endfacet
+facet normal -0.5000000000000018 0.8660254037844376 -2.0805319374395354e-16
+ outer loop
+ vertex -181.32064530943393 -93.13851799524595 -62.60000000000005
+ vertex -176.81731320975481 -90.53851799524594 617.3999999999999
+ vertex -176.81731320975481 -90.53851799524594 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.5000000000000018 0.8660254037844376 -2.0805319374395354e-16
+ outer loop
+ vertex -176.81731320975481 -90.53851799524594 617.3999999999999
+ vertex -181.32064530943393 -93.13851799524595 -62.60000000000005
+ vertex -181.32064530943393 -93.13851799524595 617.3999999999999
+ endloop
+endfacet
+facet normal -0.4999999999999966 0.8660254037844406 -2.0805319374395436e-16
+ outer loop
+ vertex -176.61731320975483 -90.88492815675971 617.3999999999999
+ vertex -176.27090304824105 -90.68492815675971 -62.60000000000005
+ vertex -176.61731320975483 -90.88492815675971 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.4999999999999966 0.8660254037844406 -2.0805319374395436e-16
+ outer loop
+ vertex -176.27090304824105 -90.68492815675971 -62.60000000000005
+ vertex -176.61731320975483 -90.88492815675971 617.3999999999999
+ vertex -176.27090304824105 -90.68492815675971 617.3999999999999
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 -1.3771336778111675e-16
+ outer loop
+ vertex -176.45900164904148 -94.75913182334084 617.3999999999999
+ vertex -177.47615893656683 -92.99736372205795 -62.60000000000005
+ vertex -177.47615893656683 -92.99736372205795 617.3999999999999
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 -1.3771336778111675e-16
+ outer loop
+ vertex -177.47615893656683 -92.99736372205795 -62.60000000000005
+ vertex -176.45900164904148 -94.75913182334084 617.3999999999999
+ vertex -176.45900164904148 -94.75913182334084 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912276 0.6087614290087306 -1.39515463108613e-16
+ outer loop
+ vertex -181.68667071321835 -93.50454339903038 617.3999999999999
+ vertex -181.52775209062045 -93.29743661784383 -62.60000000000005
+ vertex -181.68667071321835 -93.50454339903038 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.7933533402912276 0.6087614290087306 -1.39515463108613e-16
+ outer loop
+ vertex -181.52775209062045 -93.29743661784383 -62.60000000000005
+ vertex -181.68667071321835 -93.50454339903038 617.3999999999999
+ vertex -181.52775209062045 -93.29743661784383 617.3999999999999
+ endloop
+endfacet
+facet normal 0.2588190451025234 0.9659258262890678 -2.44493880361933e-16
+ outer loop
+ vertex -173.09081272081974 -95.6616353266133 617.3999999999999
+ vertex -176.45900164904148 -94.75913182334084 -62.60000000000005
+ vertex -176.45900164904148 -94.75913182334084 617.3999999999999
+ endloop
+endfacet
+facet normal 0.2588190451025234 0.9659258262890678 -2.44493880361933e-16
+ outer loop
+ vertex -176.45900164904148 -94.75913182334084 -62.60000000000005
+ vertex -173.09081272081974 -95.6616353266133 617.3999999999999
+ vertex -173.09081272081974 -95.6616353266133 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844469 0.49999999999998546 -1.3771336778111338e-16
+ outer loop
+ vertex -175.57090304824106 -91.89736372205796 617.3999999999999
+ vertex -176.27090304824105 -90.68492815675971 -62.60000000000005
+ vertex -176.27090304824105 -90.68492815675971 617.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844469 0.49999999999998546 -1.3771336778111338e-16
+ outer loop
+ vertex -176.27090304824105 -90.68492815675971 -62.60000000000005
+ vertex -175.57090304824106 -91.89736372205796 617.3999999999999
+ vertex -175.57090304824106 -91.89736372205796 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 -1.3771336778111675e-16
+ outer loop
+ vertex -176.61731320975483 -90.88492815675971 617.3999999999999
+ vertex -176.81731320975481 -90.53851799524594 -62.60000000000005
+ vertex -176.81731320975481 -90.53851799524594 617.3999999999999
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 -1.3771336778111675e-16
+ outer loop
+ vertex -176.81731320975481 -90.53851799524594 -62.60000000000005
+ vertex -176.61731320975483 -90.88492815675971 617.3999999999999
+ vertex -176.61731320975483 -90.88492815675971 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 2.0805319374395384e-16
+ outer loop
+ vertex -175.57090304824106 -91.89736372205796 617.3999999999999
+ vertex -177.47615893656683 -92.99736372205795 -62.60000000000005
+ vertex -175.57090304824106 -91.89736372205796 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 2.0805319374395384e-16
+ outer loop
+ vertex -177.47615893656683 -92.99736372205795 -62.60000000000005
+ vertex -175.57090304824106 -91.89736372205796 617.3999999999999
+ vertex -177.47615893656683 -92.99736372205795 617.3999999999999
+ endloop
+endfacet
+facet normal -0.49999999999999956 0.8660254037844389 -2.0805319374395384e-16
+ outer loop
+ vertex -173.09081272081974 -95.6616353266133 617.3999999999999
+ vertex -167.6620206299282 -92.52732075156256 -62.60000000000005
+ vertex -173.09081272081974 -95.6616353266133 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.49999999999999956 0.8660254037844389 -2.0805319374395384e-16
+ outer loop
+ vertex -167.6620206299282 -92.52732075156256 -62.60000000000005
+ vertex -173.09081272081974 -95.6616353266133 617.3999999999999
+ vertex -167.6620206299282 -92.52732075156256 617.3999999999999
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 2.080531937439539e-16
+ outer loop
+ vertex -155.732188041314 -101.45902607093474 617.3999999999999
+ vertex -160.2355201409931 -104.05902607093472 -62.60000000000005
+ vertex -155.732188041314 -101.45902607093474 -62.60000000000008
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 2.080531937439539e-16
+ outer loop
+ vertex -160.2355201409931 -104.05902607093472 -62.60000000000005
+ vertex -155.732188041314 -101.45902607093474 617.3999999999999
+ vertex -160.2355201409931 -104.05902607093472 617.3999999999999
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 1.3771336778111675e-16
+ outer loop
+ vertex -160.2355201409931 -104.05902607093472 -62.60000000000005
+ vertex -160.43552014099308 -103.71261590942096 617.3999999999999
+ vertex -160.43552014099308 -103.71261590942096 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 1.3771336778111675e-16
+ outer loop
+ vertex -160.43552014099308 -103.71261590942096 617.3999999999999
+ vertex -160.2355201409931 -104.05902607093472 -62.60000000000005
+ vertex -160.2355201409931 -104.05902607093472 617.3999999999999
+ endloop
+endfacet
+facet normal 0.4999999999999981 -0.8660254037844397 2.080531937439541e-16
+ outer loop
+ vertex -163.9620206299282 -98.9359087395674 617.3999999999999
+ vertex -169.3908127208197 -102.0702233146181 -62.60000000000005
+ vertex -163.9620206299282 -98.9359087395674 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.4999999999999981 -0.8660254037844397 2.080531937439541e-16
+ outer loop
+ vertex -169.3908127208197 -102.0702233146181 -62.60000000000005
+ vertex -163.9620206299282 -98.9359087395674 617.3999999999999
+ vertex -169.3908127208197 -102.0702233146181 617.3999999999999
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 1.3771336778111675e-16
+ outer loop
+ vertex -160.78193030250688 -103.91261590942096 -62.60000000000005
+ vertex -161.48193030250687 -102.70018034412274 617.3999999999999
+ vertex -161.48193030250687 -102.70018034412274 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 1.3771336778111675e-16
+ outer loop
+ vertex -161.48193030250687 -102.70018034412274 617.3999999999999
+ vertex -160.78193030250688 -103.91261590942096 -62.60000000000005
+ vertex -160.78193030250688 -103.91261590942096 617.3999999999999
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 -1.3771336778111675e-16
+ outer loop
+ vertex -169.27615893656682 -107.20018034412274 617.3999999999999
+ vertex -170.2933162240922 -105.43841224283983 -62.60000000000005
+ vertex -170.2933162240922 -105.43841224283983 617.3999999999999
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 -1.3771336778111675e-16
+ outer loop
+ vertex -170.2933162240922 -105.43841224283983 -62.60000000000005
+ vertex -169.27615893656682 -107.20018034412274 617.3999999999999
+ vertex -169.27615893656682 -107.20018034412274 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 -2.0805319374395384e-16
+ outer loop
+ vertex -169.27615893656682 -107.20018034412274 617.3999999999999
+ vertex -167.37090304824105 -106.10018034412275 -62.60000000000005
+ vertex -169.27615893656682 -107.20018034412274 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 -2.0805319374395384e-16
+ outer loop
+ vertex -167.37090304824105 -106.10018034412275 -62.60000000000005
+ vertex -169.27615893656682 -107.20018034412274 617.3999999999999
+ vertex -167.37090304824105 -106.10018034412275 617.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844469 0.49999999999998546 -1.3771336778111338e-16
+ outer loop
+ vertex -166.6709030482411 -107.31261590942096 617.3999999999999
+ vertex -167.37090304824105 -106.10018034412275 -62.60000000000005
+ vertex -167.37090304824105 -106.10018034412275 617.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844469 0.49999999999998546 -1.3771336778111338e-16
+ outer loop
+ vertex -167.37090304824105 -106.10018034412275 -62.60000000000005
+ vertex -166.6709030482411 -107.31261590942096 617.3999999999999
+ vertex -166.6709030482411 -107.31261590942096 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 1.3771336778111675e-16
+ outer loop
+ vertex -159.57667441418107 -101.60018034412275 -62.60000000000005
+ vertex -160.59383170170645 -99.83841224283987 617.3999999999999
+ vertex -160.59383170170645 -99.83841224283987 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 1.3771336778111675e-16
+ outer loop
+ vertex -160.59383170170645 -99.83841224283987 617.3999999999999
+ vertex -159.57667441418107 -101.60018034412275 -62.60000000000005
+ vertex -159.57667441418107 -101.60018034412275 617.3999999999999
+ endloop
+endfacet
+facet normal -0.2588190451025234 -0.9659258262890678 2.44493880361933e-16
+ outer loop
+ vertex -160.59383170170645 -99.83841224283987 -62.60000000000005
+ vertex -163.9620206299282 -98.9359087395674 617.3999999999999
+ vertex -163.9620206299282 -98.9359087395674 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.2588190451025234 -0.9659258262890678 2.44493880361933e-16
+ outer loop
+ vertex -163.9620206299282 -98.9359087395674 617.3999999999999
+ vertex -160.59383170170645 -99.83841224283987 -62.60000000000005
+ vertex -160.59383170170645 -99.83841224283987 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9659258262890671 -0.2588190451025257 4.973776792580483e-17
+ outer loop
+ vertex -169.3908127208197 -102.0702233146181 617.3999999999999
+ vertex -170.2933162240922 -105.43841224283983 -62.60000000000005
+ vertex -169.3908127208197 -102.0702233146181 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9659258262890671 -0.2588190451025257 4.973776792580483e-17
+ outer loop
+ vertex -170.2933162240922 -105.43841224283983 -62.60000000000005
+ vertex -169.3908127208197 -102.0702233146181 617.3999999999999
+ vertex -170.2933162240922 -105.43841224283983 617.3999999999999
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 2.0805319374395384e-16
+ outer loop
+ vertex -166.6709030482411 -107.31261590942096 617.3999999999999
+ vertex -167.01731320975483 -107.51261590942096 -62.60000000000005
+ vertex -166.6709030482411 -107.31261590942096 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 2.0805319374395384e-16
+ outer loop
+ vertex -167.01731320975483 -107.51261590942096 -62.60000000000005
+ vertex -166.6709030482411 -107.31261590942096 617.3999999999999
+ vertex -167.01731320975483 -107.51261590942096 617.3999999999999
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 -1.3771336778111675e-16
+ outer loop
+ vertex -166.81731320975484 -107.85902607093475 617.3999999999999
+ vertex -167.01731320975483 -107.51261590942096 -62.60000000000005
+ vertex -167.01731320975483 -107.51261590942096 617.3999999999999
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 -1.3771336778111675e-16
+ outer loop
+ vertex -167.01731320975483 -107.51261590942096 -62.60000000000005
+ vertex -166.81731320975484 -107.85902607093475 617.3999999999999
+ vertex -166.81731320975484 -107.85902607093475 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 2.0805319374395384e-16
+ outer loop
+ vertex -160.43552014099308 -103.71261590942096 617.3999999999999
+ vertex -160.78193030250688 -103.91261590942096 -62.60000000000005
+ vertex -160.43552014099308 -103.71261590942096 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 2.0805319374395384e-16
+ outer loop
+ vertex -160.78193030250688 -103.91261590942096 -62.60000000000005
+ vertex -160.43552014099308 -103.71261590942096 617.3999999999999
+ vertex -160.78193030250688 -103.91261590942096 617.3999999999999
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 -2.0805319374395384e-16
+ outer loop
+ vertex -161.48193030250687 -102.70018034412274 617.3999999999999
+ vertex -159.57667441418107 -101.60018034412275 -62.60000000000005
+ vertex -161.48193030250687 -102.70018034412274 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 -2.0805319374395384e-16
+ outer loop
+ vertex -159.57667441418107 -101.60018034412275 -62.60000000000005
+ vertex -161.48193030250687 -102.70018034412274 617.3999999999999
+ vertex -159.57667441418107 -101.60018034412275 617.3999999999999
+ endloop
+endfacet
+facet normal -0.1305261922200506 -0.9914448613738105 2.4889428277906147e-16
+ outer loop
+ vertex -171.82064530943393 -110.59300066715029 617.3999999999999
+ vertex -172.07946435453644 -110.55892649343936 -62.60000000000003
+ vertex -171.82064530943393 -110.59300066715029 -62.60000000000003
+ endloop
+endfacet
+facet normal -0.1305261922200506 -0.9914448613738105 2.4889428277906147e-16
+ outer loop
+ vertex -172.07946435453644 -110.55892649343936 -62.60000000000003
+ vertex -171.82064530943393 -110.59300066715029 617.3999999999999
+ vertex -172.07946435453644 -110.55892649343936 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087278 -0.7933533402912298 2.068490721426272e-16
+ outer loop
+ vertex -172.32064530943393 -110.45902607093474 -62.60000000000002
+ vertex -172.52775209062048 -110.30010744833685 617.3999999999999
+ vertex -172.52775209062048 -110.30010744833685 -62.60000000000002
+ endloop
+endfacet
+facet normal -0.6087614290087278 -0.7933533402912298 2.068490721426272e-16
+ outer loop
+ vertex -172.52775209062048 -110.30010744833685 617.3999999999999
+ vertex -172.32064530943393 -110.45902607093474 -62.60000000000002
+ vertex -172.32064530943393 -110.45902607093474 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912222 -0.6087614290087376 1.6369160198769298e-16
+ outer loop
+ vertex -172.52775209062048 -110.30010744833685 -62.60000000000002
+ vertex -172.68667071321835 -110.0930006671503 617.3999999999999
+ vertex -172.68667071321835 -110.0930006671503 -62.60000000000002
+ endloop
+endfacet
+facet normal -0.7933533402912222 -0.6087614290087376 1.6369160198769298e-16
+ outer loop
+ vertex -172.68667071321835 -110.0930006671503 617.3999999999999
+ vertex -172.52775209062048 -110.30010744833685 -62.60000000000002
+ vertex -172.52775209062048 -110.30010744833685 617.3999999999999
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 1.3771336778111678e-16
+ outer loop
+ vertex -172.68667071321835 -110.0930006671503 -62.60000000000002
+ vertex -175.28667071321837 -105.58966856747122 617.3999999999999
+ vertex -175.28667071321837 -105.58966856747122 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 1.3771336778111678e-16
+ outer loop
+ vertex -175.28667071321837 -105.58966856747122 617.3999999999999
+ vertex -172.68667071321835 -110.0930006671503 -62.60000000000002
+ vertex -172.68667071321835 -110.0930006671503 617.3999999999999
+ endloop
+endfacet
+facet normal -0.3826834323651092 -0.9238795325112787 2.3591011986530023e-16
+ outer loop
+ vertex -172.07946435453644 -110.55892649343936 -62.60000000000003
+ vertex -172.32064530943393 -110.45902607093474 617.3999999999999
+ vertex -172.32064530943393 -110.45902607093474 -62.60000000000002
+ endloop
+endfacet
+facet normal -0.3826834323651092 -0.9238795325112787 2.3591011986530023e-16
+ outer loop
+ vertex -172.32064530943393 -110.45902607093474 617.3999999999999
+ vertex -172.07946435453644 -110.55892649343936 -62.60000000000003
+ vertex -172.07946435453644 -110.55892649343936 617.3999999999999
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 2.080531937439539e-16
+ outer loop
+ vertex -166.81731320975484 -107.85902607093475 617.3999999999999
+ vertex -171.32064530943393 -110.45902607093474 -62.60000000000005
+ vertex -166.81731320975484 -107.85902607093475 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 2.080531937439539e-16
+ outer loop
+ vertex -171.32064530943393 -110.45902607093474 -62.60000000000005
+ vertex -166.81731320975484 -107.85902607093475 617.3999999999999
+ vertex -171.32064530943393 -110.45902607093474 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222006187 -0.991444861373809 2.449167116386775e-16
+ outer loop
+ vertex -171.5618262643314 -110.55892649343936 617.3999999999999
+ vertex -171.82064530943393 -110.59300066715029 -62.60000000000003
+ vertex -171.5618262643314 -110.55892649343936 -62.600000000000044
+ endloop
+endfacet
+facet normal 0.13052619222006187 -0.991444861373809 2.449167116386775e-16
+ outer loop
+ vertex -171.82064530943393 -110.59300066715029 -62.60000000000003
+ vertex -171.5618262643314 -110.55892649343936 617.3999999999999
+ vertex -171.82064530943393 -110.59300066715029 617.3999999999999
+ endloop
+endfacet
+facet normal 0.382683432365085 -0.9238795325112886 2.2424847134412203e-16
+ outer loop
+ vertex -171.32064530943393 -110.45902607093474 617.3999999999999
+ vertex -171.5618262643314 -110.55892649343936 -62.600000000000044
+ vertex -171.32064530943393 -110.45902607093474 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.382683432365085 -0.9238795325112886 2.2424847134412203e-16
+ outer loop
+ vertex -171.5618262643314 -110.55892649343936 -62.600000000000044
+ vertex -171.32064530943393 -110.45902607093474 617.3999999999999
+ vertex -171.5618262643314 -110.55892649343936 617.3999999999999
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 1.3771336778111675e-16
+ outer loop
+ vertex -174.9402605517046 -105.38966856747122 -62.60000000000005
+ vertex -175.14026055170459 -105.04325840595743 617.3999999999999
+ vertex -175.14026055170459 -105.04325840595743 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 1.3771336778111675e-16
+ outer loop
+ vertex -175.14026055170459 -105.04325840595743 617.3999999999999
+ vertex -174.9402605517046 -105.38966856747122 -62.60000000000005
+ vertex -174.9402605517046 -105.38966856747122 617.3999999999999
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 -2.0805319374395384e-16
+ outer loop
+ vertex -172.82782498640634 -106.2485142942832 617.3999999999999
+ vertex -171.06605688512346 -105.23135700675783 -62.60000000000005
+ vertex -172.82782498640634 -106.2485142942832 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 -2.0805319374395384e-16
+ outer loop
+ vertex -171.06605688512346 -105.23135700675783 -62.60000000000005
+ vertex -172.82782498640634 -106.2485142942832 617.3999999999999
+ vertex -171.06605688512346 -105.23135700675783 617.3999999999999
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 -2.0805319374395384e-16
+ outer loop
+ vertex -175.28667071321837 -105.58966856747122 -62.60000000000005
+ vertex -174.9402605517046 -105.38966856747122 617.3999999999999
+ vertex -174.9402605517046 -105.38966856747122 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 -2.0805319374395384e-16
+ outer loop
+ vertex -174.9402605517046 -105.38966856747122 617.3999999999999
+ vertex -175.28667071321837 -105.58966856747122 -62.60000000000005
+ vertex -175.28667071321837 -105.58966856747122 617.3999999999999
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 -1.3771336778111678e-16
+ outer loop
+ vertex -172.82782498640634 -106.2485142942832 617.3999999999999
+ vertex -173.92782498640634 -104.34325840595744 -62.60000000000005
+ vertex -173.92782498640634 -104.34325840595744 617.3999999999999
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 -1.3771336778111678e-16
+ outer loop
+ vertex -173.92782498640634 -104.34325840595744 -62.60000000000005
+ vertex -172.82782498640634 -106.2485142942832 617.3999999999999
+ vertex -172.82782498640634 -106.2485142942832 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 1.3771336778111675e-16
+ outer loop
+ vertex -170.16355338185102 -101.86316807853612 -62.60000000000005
+ vertex -173.29786795690174 -96.43437598764457 617.3999999999999
+ vertex -173.29786795690174 -96.43437598764457 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 1.3771336778111675e-16
+ outer loop
+ vertex -173.29786795690174 -96.43437598764457 617.3999999999999
+ vertex -170.16355338185102 -101.86316807853612 -62.60000000000005
+ vertex -170.16355338185102 -101.86316807853612 617.3999999999999
+ endloop
+endfacet
+facet normal -0.4999999999999927 0.8660254037844428 -2.0805319374395492e-16
+ outer loop
+ vertex -175.14026055170459 -105.04325840595743 617.3999999999999
+ vertex -173.92782498640634 -104.34325840595744 -62.60000000000005
+ vertex -175.14026055170459 -105.04325840595743 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.4999999999999927 0.8660254037844428 -2.0805319374395492e-16
+ outer loop
+ vertex -173.92782498640634 -104.34325840595744 -62.60000000000005
+ vertex -175.14026055170459 -105.04325840595743 617.3999999999999
+ vertex -173.92782498640634 -104.34325840595744 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9659258262890682 0.2588190451025213 -4.97377679258037e-17
+ outer loop
+ vertex -171.06605688512346 -105.23135700675783 -62.60000000000005
+ vertex -170.16355338185102 -101.86316807853612 617.3999999999999
+ vertex -170.16355338185102 -101.86316807853612 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9659258262890682 0.2588190451025213 -4.97377679258037e-17
+ outer loop
+ vertex -170.16355338185102 -101.86316807853612 617.3999999999999
+ vertex -171.06605688512346 -105.23135700675783 -62.60000000000005
+ vertex -171.06605688512346 -105.23135700675783 617.3999999999999
+ endloop
+endfacet
+facet normal -0.2588190451025237 -0.9659258262890675 2.4449388036193293e-16
+ outer loop
+ vertex -173.29786795690174 -96.43437598764457 -62.60000000000005
+ vertex -176.66605688512345 -95.53187248437212 617.3999999999999
+ vertex -176.66605688512345 -95.53187248437212 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.2588190451025237 -0.9659258262890675 2.4449388036193293e-16
+ outer loop
+ vertex -176.66605688512345 -95.53187248437212 617.3999999999999
+ vertex -173.29786795690174 -96.43437598764457 -62.60000000000005
+ vertex -173.29786795690174 -96.43437598764457 617.3999999999999
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 -1.3771336778111678e-16
+ outer loop
+ vertex -177.32782498640637 -98.45428566022325 617.3999999999999
+ vertex -178.42782498640636 -96.5490297718975 -62.60000000000005
+ vertex -178.42782498640636 -96.5490297718975 617.3999999999999
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 -1.3771336778111678e-16
+ outer loop
+ vertex -178.42782498640636 -96.5490297718975 -62.60000000000005
+ vertex -177.32782498640637 -98.45428566022325 617.3999999999999
+ vertex -177.32782498640637 -98.45428566022325 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.49999999999997785 -0.8660254037844514 2.0805319374395734e-16
+ outer loop
+ vertex -177.32782498640637 -98.45428566022325 617.3999999999999
+ vertex -178.5402605517046 -99.15428566022322 -62.60000000000005
+ vertex -177.32782498640637 -98.45428566022325 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.49999999999997785 -0.8660254037844514 2.0805319374395734e-16
+ outer loop
+ vertex -178.5402605517046 -99.15428566022322 -62.60000000000005
+ vertex -177.32782498640637 -98.45428566022325 617.3999999999999
+ vertex -178.5402605517046 -99.15428566022322 617.3999999999999
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 2.0805319374395384e-16
+ outer loop
+ vertex -176.66605688512345 -95.53187248437212 617.3999999999999
+ vertex -178.42782498640636 -96.5490297718975 -62.60000000000005
+ vertex -176.66605688512345 -95.53187248437212 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 2.0805319374395384e-16
+ outer loop
+ vertex -178.42782498640636 -96.5490297718975 -62.60000000000005
+ vertex -176.66605688512345 -95.53187248437212 617.3999999999999
+ vertex -178.42782498640636 -96.5490297718975 617.3999999999999
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 1.3771336778111675e-16
+ outer loop
+ vertex -178.5402605517046 -99.15428566022322 -62.60000000000005
+ vertex -178.7402605517046 -98.80787549870945 617.3999999999999
+ vertex -178.7402605517046 -98.80787549870945 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 1.3771336778111675e-16
+ outer loop
+ vertex -178.7402605517046 -98.80787549870945 617.3999999999999
+ vertex -178.5402605517046 -99.15428566022322 -62.60000000000005
+ vertex -178.5402605517046 -99.15428566022322 617.3999999999999
+ endloop
+endfacet
+facet normal 0.4999999999999966 -0.8660254037844406 2.0805319374395436e-16
+ outer loop
+ vertex -178.7402605517046 -98.80787549870945 617.3999999999999
+ vertex -179.08667071321835 -99.00787549870944 -62.60000000000005
+ vertex -178.7402605517046 -98.80787549870945 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.4999999999999966 -0.8660254037844406 2.0805319374395436e-16
+ outer loop
+ vertex -179.08667071321835 -99.00787549870944 -62.60000000000005
+ vertex -178.7402605517046 -98.80787549870945 617.3999999999999
+ vertex -179.08667071321835 -99.00787549870944 617.3999999999999
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 1.3771336778111675e-16
+ outer loop
+ vertex -179.08667071321835 -99.00787549870944 -62.60000000000005
+ vertex -181.68667071321835 -94.5045433990304 617.3999999999999
+ vertex -181.68667071321835 -94.5045433990304 -62.60000000000008
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 1.3771336778111675e-16
+ outer loop
+ vertex -181.68667071321835 -94.5045433990304 617.3999999999999
+ vertex -179.08667071321835 -99.00787549870944 -62.60000000000005
+ vertex -179.08667071321835 -99.00787549870944 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112954 -0.3826834323650693 1.0937881967044609e-16
+ outer loop
+ vertex -181.68667071321835 -94.5045433990304 -62.60000000000008
+ vertex -181.786571135723 -94.26336244413291 617.3999999999999
+ vertex -181.786571135723 -94.26336244413291 -62.60000000000008
+ endloop
+endfacet
+facet normal -0.9238795325112954 -0.3826834323650693 1.0937881967044609e-16
+ outer loop
+ vertex -181.786571135723 -94.26336244413291 617.3999999999999
+ vertex -181.68667071321835 -94.5045433990304 -62.60000000000008
+ vertex -181.68667071321835 -94.5045433990304 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738095 -0.1305261922200596 4.7612051549719885e-17
+ outer loop
+ vertex -181.786571135723 -94.26336244413291 -62.60000000000008
+ vertex -181.82064530943393 -94.00454339903038 617.3999999999999
+ vertex -181.82064530943393 -94.00454339903038 -62.60000000000008
+ endloop
+endfacet
+facet normal -0.9914448613738095 -0.1305261922200596 4.7612051549719885e-17
+ outer loop
+ vertex -181.82064530943393 -94.00454339903038 617.3999999999999
+ vertex -181.786571135723 -94.26336244413291 -62.60000000000008
+ vertex -181.786571135723 -94.26336244413291 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738132 0.130526192220031 -1.7399399201487912e-17
+ outer loop
+ vertex -181.82064530943393 -94.00454339903038 -62.60000000000008
+ vertex -181.786571135723 -93.74572435392787 617.3999999999999
+ vertex -181.786571135723 -93.74572435392787 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9914448613738132 0.130526192220031 -1.7399399201487912e-17
+ outer loop
+ vertex -181.786571135723 -93.74572435392787 617.3999999999999
+ vertex -181.82064530943393 -94.00454339903038 -62.60000000000008
+ vertex -181.82064530943393 -94.00454339903038 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112843 0.38268343236509583 -8.12251096509906e-17
+ outer loop
+ vertex -181.786571135723 -93.74572435392787 617.3999999999999
+ vertex -181.68667071321835 -93.50454339903038 -62.600000000000065
+ vertex -181.786571135723 -93.74572435392787 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9238795325112843 0.38268343236509583 -8.12251096509906e-17
+ outer loop
+ vertex -181.68667071321835 -93.50454339903038 -62.600000000000065
+ vertex -181.786571135723 -93.74572435392787 617.3999999999999
+ vertex -181.68667071321835 -93.50454339903038 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -181.32064530943393 -93.13851799524595 617.3999999999999
+ vertex -176.61731320975483 -90.88492815675971 617.3999999999999
+ vertex -176.81731320975481 -90.53851799524594 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -176.61731320975483 -90.88492815675971 617.3999999999999
+ vertex -181.32064530943393 -93.13851799524595 617.3999999999999
+ vertex -179.59552529705667 -92.89829256150922 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -176.61731320975483 -90.88492815675971 617.3999999999999
+ vertex -179.59552529705667 -92.89829256150922 617.3999999999999
+ vertex -179.1814148248926 -92.84377388357171 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -176.61731320975483 -90.88492815675971 617.3999999999999
+ vertex -179.1814148248926 -92.84377388357171 617.3999999999999
+ vertex -177.47615893656683 -92.99736372205795 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -177.47615893656683 -92.99736372205795 617.3999999999999
+ vertex -179.1814148248926 -92.84377388357171 617.3999999999999
+ vertex -178.76730435272856 -92.89829256150921 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -177.47615893656683 -92.99736372205795 617.3999999999999
+ vertex -178.76730435272856 -92.89829256150921 617.3999999999999
+ vertex -178.3814148248926 -93.0581332375166 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -177.47615893656683 -92.99736372205795 617.3999999999999
+ vertex -178.3814148248926 -93.0581332375166 617.3999999999999
+ vertex -178.05004397499414 -93.31240303367323 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -177.47615893656683 -92.99736372205795 617.3999999999999
+ vertex -178.05004397499414 -93.31240303367323 617.3999999999999
+ vertex -176.45900164904148 -94.75913182334084 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -176.45900164904148 -94.75913182334084 617.3999999999999
+ vertex -178.05004397499414 -93.31240303367323 617.3999999999999
+ vertex -177.7957741788375 -93.64377388357171 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -176.45900164904148 -94.75913182334084 617.3999999999999
+ vertex -177.7957741788375 -93.64377388357171 617.3999999999999
+ vertex -176.66605688512345 -95.53187248437212 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -179.59552529705667 -92.89829256150922 617.3999999999999
+ vertex -181.32064530943393 -93.13851799524595 617.3999999999999
+ vertex -179.98141482489262 -93.05813323751663 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -179.98141482489262 -93.05813323751663 617.3999999999999
+ vertex -181.32064530943393 -93.13851799524595 617.3999999999999
+ vertex -180.3127856747911 -93.31240303367325 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -180.3127856747911 -93.31240303367325 617.3999999999999
+ vertex -181.32064530943393 -93.13851799524595 617.3999999999999
+ vertex -180.5670554709477 -93.64377388357174 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -180.5670554709477 -93.64377388357174 617.3999999999999
+ vertex -181.32064530943393 -93.13851799524595 617.3999999999999
+ vertex -180.7268961469551 -94.0296634114077 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -180.7268961469551 -94.0296634114077 617.3999999999999
+ vertex -181.32064530943393 -93.13851799524595 617.3999999999999
+ vertex -180.7814148248926 -94.44377388357174 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -180.7814148248926 -94.44377388357174 617.3999999999999
+ vertex -181.32064530943393 -93.13851799524595 617.3999999999999
+ vertex -181.52775209062045 -93.29743661784383 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -180.7814148248926 -94.44377388357174 617.3999999999999
+ vertex -181.52775209062045 -93.29743661784383 617.3999999999999
+ vertex -180.7268961469551 -94.85788435573578 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -180.7268961469551 -94.85788435573578 617.3999999999999
+ vertex -181.52775209062045 -93.29743661784383 617.3999999999999
+ vertex -181.68667071321835 -93.50454339903038 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -180.7268961469551 -94.85788435573578 617.3999999999999
+ vertex -181.68667071321835 -93.50454339903038 617.3999999999999
+ vertex -180.56705547094768 -95.24377388357173 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -181.786571135723 -93.74572435392787 617.3999999999999
+ vertex -178.7402605517046 -98.80787549870945 617.3999999999999
+ vertex -181.68667071321835 -93.50454339903038 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -178.7402605517046 -98.80787549870945 617.3999999999999
+ vertex -181.786571135723 -93.74572435392787 617.3999999999999
+ vertex -179.08667071321835 -99.00787549870944 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -179.08667071321835 -99.00787549870944 617.3999999999999
+ vertex -181.786571135723 -93.74572435392787 617.3999999999999
+ vertex -181.82064530943393 -94.00454339903038 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -179.08667071321835 -99.00787549870944 617.3999999999999
+ vertex -181.82064530943393 -94.00454339903038 617.3999999999999
+ vertex -181.786571135723 -94.26336244413291 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -179.08667071321835 -99.00787549870944 617.3999999999999
+ vertex -181.786571135723 -94.26336244413291 617.3999999999999
+ vertex -181.68667071321835 -94.5045433990304 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -176.66605688512345 -95.53187248437212 617.3999999999999
+ vertex -177.79577417883746 -95.2437738835717 617.3999999999999
+ vertex -178.42782498640636 -96.5490297718975 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -177.79577417883746 -95.2437738835717 617.3999999999999
+ vertex -176.66605688512345 -95.53187248437212 617.3999999999999
+ vertex -177.63593350283008 -94.85788435573575 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -177.63593350283008 -94.85788435573575 617.3999999999999
+ vertex -176.66605688512345 -95.53187248437212 617.3999999999999
+ vertex -177.5814148248926 -94.44377388357171 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -177.5814148248926 -94.44377388357171 617.3999999999999
+ vertex -176.66605688512345 -95.53187248437212 617.3999999999999
+ vertex -177.63593350283008 -94.02966341140768 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -177.63593350283008 -94.02966341140768 617.3999999999999
+ vertex -176.66605688512345 -95.53187248437212 617.3999999999999
+ vertex -177.7957741788375 -93.64377388357171 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -178.42782498640636 -96.5490297718975 617.3999999999999
+ vertex -177.79577417883746 -95.2437738835717 617.3999999999999
+ vertex -178.0500439749941 -95.5751447334702 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -178.42782498640636 -96.5490297718975 617.3999999999999
+ vertex -178.0500439749941 -95.5751447334702 617.3999999999999
+ vertex -178.38141482489257 -95.82941452962682 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -178.42782498640636 -96.5490297718975 617.3999999999999
+ vertex -178.38141482489257 -95.82941452962682 617.3999999999999
+ vertex -178.76730435272856 -95.98925520563425 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -178.42782498640636 -96.5490297718975 617.3999999999999
+ vertex -178.76730435272856 -95.98925520563425 617.3999999999999
+ vertex -177.32782498640637 -98.45428566022325 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -177.32782498640637 -98.45428566022325 617.3999999999999
+ vertex -178.76730435272856 -95.98925520563425 617.3999999999999
+ vertex -178.5402605517046 -99.15428566022322 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -178.5402605517046 -99.15428566022322 617.3999999999999
+ vertex -178.76730435272856 -95.98925520563425 617.3999999999999
+ vertex -179.18141482489258 -96.04377388357173 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -178.5402605517046 -99.15428566022322 617.3999999999999
+ vertex -179.18141482489258 -96.04377388357173 617.3999999999999
+ vertex -179.5955252970566 -95.98925520563425 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -178.5402605517046 -99.15428566022322 617.3999999999999
+ vertex -179.5955252970566 -95.98925520563425 617.3999999999999
+ vertex -179.98141482489257 -95.82941452962685 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -178.5402605517046 -99.15428566022322 617.3999999999999
+ vertex -179.98141482489257 -95.82941452962685 617.3999999999999
+ vertex -180.31278567479106 -95.5751447334702 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -178.5402605517046 -99.15428566022322 617.3999999999999
+ vertex -180.31278567479106 -95.5751447334702 617.3999999999999
+ vertex -180.56705547094768 -95.24377388357173 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -178.5402605517046 -99.15428566022322 617.3999999999999
+ vertex -180.56705547094768 -95.24377388357173 617.3999999999999
+ vertex -181.68667071321835 -93.50454339903038 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -178.5402605517046 -99.15428566022322 617.3999999999999
+ vertex -181.68667071321835 -93.50454339903038 617.3999999999999
+ vertex -178.7402605517046 -98.80787549870945 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -159.72500836434156 -96.14325840595744 617.3999999999999
+ vertex -158.31257279904335 -95.78966856747121 617.3999999999999
+ vertex -158.51257279904334 -95.44325840595744 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -158.31257279904335 -95.78966856747121 617.3999999999999
+ vertex -159.72500836434156 -96.14325840595744 617.3999999999999
+ vertex -156.74004767595687 -99.02239933271049 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -158.31257279904335 -95.78966856747121 617.3999999999999
+ vertex -156.74004767595687 -99.02239933271049 617.3999999999999
+ vertex -156.48577787980025 -99.35377018260895 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -158.31257279904335 -95.78966856747121 617.3999999999999
+ vertex -156.48577787980025 -99.35377018260895 617.3999999999999
+ vertex -155.36616263752956 -101.09300066715029 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -156.74004767595687 -99.02239933271049 617.3999999999999
+ vertex -159.72500836434156 -96.14325840595744 617.3999999999999
+ vertex -157.07141852585534 -98.76812953655386 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -157.07141852585534 -98.76812953655386 617.3999999999999
+ vertex -159.72500836434156 -96.14325840595744 617.3999999999999
+ vertex -157.45730805369132 -98.60828886054645 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -157.45730805369132 -98.60828886054645 617.3999999999999
+ vertex -159.72500836434156 -96.14325840595744 617.3999999999999
+ vertex -157.87141852585535 -98.55377018260896 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -157.87141852585535 -98.55377018260896 617.3999999999999
+ vertex -159.72500836434156 -96.14325840595744 617.3999999999999
+ vertex -158.28552899801937 -98.60828886054645 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -158.28552899801937 -98.60828886054645 617.3999999999999
+ vertex -159.72500836434156 -96.14325840595744 617.3999999999999
+ vertex -158.62500836434157 -98.04851429428321 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -158.28552899801937 -98.60828886054645 617.3999999999999
+ vertex -158.62500836434157 -98.04851429428321 617.3999999999999
+ vertex -158.67141852585536 -98.76812953655387 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -158.67141852585536 -98.76812953655387 617.3999999999999
+ vertex -158.62500836434157 -98.04851429428321 617.3999999999999
+ vertex -160.38677646562448 -99.06567158180859 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -158.67141852585536 -98.76812953655387 617.3999999999999
+ vertex -160.38677646562448 -99.06567158180859 617.3999999999999
+ vertex -159.00278937575385 -99.0223993327105 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -159.00278937575385 -99.0223993327105 617.3999999999999
+ vertex -160.38677646562448 -99.06567158180859 617.3999999999999
+ vertex -159.25705917191047 -99.35377018260897 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -159.25705917191047 -99.35377018260897 617.3999999999999
+ vertex -160.38677646562448 -99.06567158180859 617.3999999999999
+ vertex -159.41689984791785 -99.73965971044495 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -159.41689984791785 -99.73965971044495 617.3999999999999
+ vertex -160.38677646562448 -99.06567158180859 617.3999999999999
+ vertex -159.47141852585534 -100.15377018260898 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -159.47141852585534 -100.15377018260898 617.3999999999999
+ vertex -160.38677646562448 -99.06567158180859 617.3999999999999
+ vertex -159.41689984791785 -100.56788065477302 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -159.41689984791785 -100.56788065477302 617.3999999999999
+ vertex -160.38677646562448 -99.06567158180859 617.3999999999999
+ vertex -159.25705917191044 -100.95377018260898 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -164.87141852585535 -88.02941452962682 617.3999999999999
+ vertex -164.22500836434156 -88.34902977189748 617.3999999999999
+ vertex -164.54004767595688 -87.7751447334702 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -164.22500836434156 -88.34902977189748 617.3999999999999
+ vertex -164.87141852585535 -88.02941452962682 617.3999999999999
+ vertex -165.98677646562444 -89.36618705942284 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -165.98677646562444 -89.36618705942284 617.3999999999999
+ vertex -164.87141852585535 -88.02941452962682 617.3999999999999
+ vertex -165.25730805369133 -88.18925520563424 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -165.98677646562444 -89.36618705942284 617.3999999999999
+ vertex -165.25730805369133 -88.18925520563424 617.3999999999999
+ vertex -165.67141852585536 -88.24377388357172 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -165.98677646562444 -89.36618705942284 617.3999999999999
+ vertex -165.67141852585536 -88.24377388357172 617.3999999999999
+ vertex -166.08552899801936 -88.18925520563424 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -165.98677646562444 -89.36618705942284 617.3999999999999
+ vertex -166.08552899801936 -88.18925520563424 617.3999999999999
+ vertex -166.47141852585534 -88.02941452962685 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -165.98677646562444 -89.36618705942284 617.3999999999999
+ vertex -166.47141852585534 -88.02941452962685 617.3999999999999
+ vertex -166.80278937575383 -87.77514473347021 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -165.98677646562444 -89.36618705942284 617.3999999999999
+ vertex -166.80278937575383 -87.77514473347021 617.3999999999999
+ vertex -167.05705917191045 -87.44377388357175 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -164.52508126012745 -84.29743661784386 617.3999999999999
+ vertex -161.76616263752956 -89.00787549870951 617.3999999999999
+ vertex -164.36616263752958 -84.5045433990304 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -161.76616263752956 -89.00787549870951 617.3999999999999
+ vertex -164.52508126012745 -84.29743661784386 617.3999999999999
+ vertex -162.1125727990433 -89.20787549870951 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -162.1125727990433 -89.20787549870951 617.3999999999999
+ vertex -164.52508126012745 -84.29743661784386 617.3999999999999
+ vertex -164.732188041314 -84.13851799524596 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -162.1125727990433 -89.20787549870951 617.3999999999999
+ vertex -164.732188041314 -84.13851799524596 617.3999999999999
+ vertex -164.97336899621146 -84.03861757274133 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -162.1125727990433 -89.20787549870951 617.3999999999999
+ vertex -164.97336899621146 -84.03861757274133 617.3999999999999
+ vertex -165.232188041314 -84.0045433990304 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -162.1125727990433 -89.20787549870951 617.3999999999999
+ vertex -165.232188041314 -84.0045433990304 617.3999999999999
+ vertex -161.91257279904332 -89.55428566022329 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -161.91257279904332 -89.55428566022329 617.3999999999999
+ vertex -165.232188041314 -84.0045433990304 617.3999999999999
+ vertex -164.28577787980026 -85.8437738835717 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -161.91257279904332 -89.55428566022329 617.3999999999999
+ vertex -164.28577787980026 -85.8437738835717 617.3999999999999
+ vertex -164.12593720379286 -86.22966341140767 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -161.91257279904332 -89.55428566022329 617.3999999999999
+ vertex -164.12593720379286 -86.22966341140767 617.3999999999999
+ vertex -163.12500836434157 -90.25428566022323 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -163.12500836434157 -90.25428566022323 617.3999999999999
+ vertex -164.12593720379286 -86.22966341140767 617.3999999999999
+ vertex -164.07141852585536 -86.64377388357171 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -163.12500836434157 -90.25428566022323 617.3999999999999
+ vertex -164.07141852585536 -86.64377388357171 617.3999999999999
+ vertex -164.12593720379283 -87.05788435573575 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -163.12500836434157 -90.25428566022323 617.3999999999999
+ vertex -164.12593720379283 -87.05788435573575 617.3999999999999
+ vertex -164.28577787980024 -87.44377388357172 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -163.12500836434157 -90.25428566022323 617.3999999999999
+ vertex -164.28577787980024 -87.44377388357172 617.3999999999999
+ vertex -164.54004767595688 -87.7751447334702 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -163.12500836434157 -90.25428566022323 617.3999999999999
+ vertex -164.54004767595688 -87.7751447334702 617.3999999999999
+ vertex -164.22500836434156 -88.34902977189748 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -158.31257279904335 -95.78966856747121 617.3999999999999
+ vertex -155.36616263752956 -100.09300066715029 617.3999999999999
+ vertex -157.96616263752958 -95.58966856747121 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -155.36616263752956 -100.09300066715029 617.3999999999999
+ vertex -158.31257279904335 -95.78966856747121 617.3999999999999
+ vertex -155.26626221502494 -100.33418162204778 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -155.26626221502494 -100.33418162204778 617.3999999999999
+ vertex -158.31257279904335 -95.78966856747121 617.3999999999999
+ vertex -155.232188041314 -100.59300066715029 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -155.232188041314 -100.59300066715029 617.3999999999999
+ vertex -158.31257279904335 -95.78966856747121 617.3999999999999
+ vertex -155.26626221502494 -100.85181971225282 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -155.26626221502494 -100.85181971225282 617.3999999999999
+ vertex -158.31257279904335 -95.78966856747121 617.3999999999999
+ vertex -155.36616263752956 -101.09300066715029 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -165.49100708641654 -84.03861757274133 617.3999999999999
+ vertex -164.28577787980026 -85.8437738835717 617.3999999999999
+ vertex -165.232188041314 -84.0045433990304 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -164.28577787980026 -85.8437738835717 617.3999999999999
+ vertex -165.49100708641654 -84.03861757274133 617.3999999999999
+ vertex -164.54004767595688 -85.51240303367324 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -164.54004767595688 -85.51240303367324 617.3999999999999
+ vertex -165.49100708641654 -84.03861757274133 617.3999999999999
+ vertex -164.87141852585538 -85.2581332375166 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -164.87141852585538 -85.2581332375166 617.3999999999999
+ vertex -165.49100708641654 -84.03861757274133 617.3999999999999
+ vertex -165.732188041314 -84.13851799524596 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -164.87141852585538 -85.2581332375166 617.3999999999999
+ vertex -165.732188041314 -84.13851799524596 617.3999999999999
+ vertex -165.25730805369133 -85.0982925615092 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -165.25730805369133 -85.0982925615092 617.3999999999999
+ vertex -165.732188041314 -84.13851799524596 617.3999999999999
+ vertex -165.6714185258554 -85.04377388357173 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -165.6714185258554 -85.04377388357173 617.3999999999999
+ vertex -165.732188041314 -84.13851799524596 617.3999999999999
+ vertex -166.0855289980194 -85.09829256150921 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -166.0855289980194 -85.09829256150921 617.3999999999999
+ vertex -165.732188041314 -84.13851799524596 617.3999999999999
+ vertex -170.23552014099303 -86.73851799524596 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -166.0855289980194 -85.09829256150921 617.3999999999999
+ vertex -170.23552014099303 -86.73851799524596 617.3999999999999
+ vertex -166.47141852585537 -85.25813323751663 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -166.47141852585537 -85.25813323751663 617.3999999999999
+ vertex -170.23552014099303 -86.73851799524596 617.3999999999999
+ vertex -166.80278937575386 -85.51240303367325 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -166.80278937575386 -85.51240303367325 617.3999999999999
+ vertex -170.23552014099303 -86.73851799524596 617.3999999999999
+ vertex -167.05705917191048 -85.84377388357173 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -167.05705917191048 -85.84377388357173 617.3999999999999
+ vertex -170.23552014099303 -86.73851799524596 617.3999999999999
+ vertex -167.2168998479179 -86.2296634114077 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -167.2168998479179 -86.2296634114077 617.3999999999999
+ vertex -170.23552014099303 -86.73851799524596 617.3999999999999
+ vertex -167.27141852585538 -86.64377388357174 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -167.27141852585538 -86.64377388357174 617.3999999999999
+ vertex -170.23552014099303 -86.73851799524596 617.3999999999999
+ vertex -167.2168998479179 -87.05788435573575 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -167.2168998479179 -87.05788435573575 617.3999999999999
+ vertex -170.23552014099303 -86.73851799524596 617.3999999999999
+ vertex -167.05705917191045 -87.44377388357175 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -167.05705917191045 -87.44377388357175 617.3999999999999
+ vertex -170.23552014099303 -86.73851799524596 617.3999999999999
+ vertex -167.7766744141811 -87.39736372205793 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -167.05705917191045 -87.44377388357175 617.3999999999999
+ vertex -167.7766744141811 -87.39736372205793 617.3999999999999
+ vertex -165.98677646562444 -89.36618705942284 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -167.7766744141811 -87.39736372205793 617.3999999999999
+ vertex -170.23552014099303 -86.73851799524596 617.3999999999999
+ vertex -170.03552014099304 -87.08492815675972 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -167.7766744141811 -87.39736372205793 617.3999999999999
+ vertex -170.03552014099304 -87.08492815675972 617.3999999999999
+ vertex -169.68193030250686 -88.49736372205793 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -169.68193030250686 -88.49736372205793 617.3999999999999
+ vertex -170.03552014099304 -87.08492815675972 617.3999999999999
+ vertex -170.38193030250682 -87.28492815675972 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -176.45900164904148 -94.75913182334084 617.3999999999999
+ vertex -173.29786795690174 -96.43437598764457 617.3999999999999
+ vertex -173.09081272081974 -95.6616353266133 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -173.29786795690174 -96.43437598764457 617.3999999999999
+ vertex -176.45900164904148 -94.75913182334084 617.3999999999999
+ vertex -176.66605688512345 -95.53187248437212 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -176.61731320975483 -90.88492815675971 617.3999999999999
+ vertex -175.57090304824106 -91.89736372205796 617.3999999999999
+ vertex -176.27090304824105 -90.68492815675971 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -175.57090304824106 -91.89736372205796 617.3999999999999
+ vertex -176.61731320975483 -90.88492815675971 617.3999999999999
+ vertex -177.47615893656683 -92.99736372205795 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -167.6620206299282 -92.52732075156256 617.3999999999999
+ vertex -166.61722836617028 -95.38958372388667 617.3999999999999
+ vertex -166.188148085156 -95.94877203309035 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -166.61722836617028 -95.38958372388667 617.3999999999999
+ vertex -167.6620206299282 -92.52732075156256 617.3999999999999
+ vertex -167.17641667537399 -94.96050344287237 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -167.17641667537399 -94.96050344287237 617.3999999999999
+ vertex -167.6620206299282 -92.52732075156256 617.3999999999999
+ vertex -167.82760525359714 -94.69077230210985 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -167.82760525359714 -94.69077230210985 617.3999999999999
+ vertex -167.6620206299282 -92.52732075156256 617.3999999999999
+ vertex -168.52641667537395 -94.59877203309034 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -168.52641667537395 -94.59877203309034 617.3999999999999
+ vertex -167.6620206299282 -92.52732075156256 617.3999999999999
+ vertex -169.2252280971508 -94.69077230210986 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -169.2252280971508 -94.69077230210986 617.3999999999999
+ vertex -167.6620206299282 -92.52732075156256 617.3999999999999
+ vertex -173.09081272081974 -95.6616353266133 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -169.2252280971508 -94.69077230210986 617.3999999999999
+ vertex -173.09081272081974 -95.6616353266133 617.3999999999999
+ vertex -169.87641667537397 -94.96050344287237 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -169.87641667537397 -94.96050344287237 617.3999999999999
+ vertex -173.09081272081974 -95.6616353266133 617.3999999999999
+ vertex -170.43560498457762 -95.38958372388666 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -170.43560498457762 -95.38958372388666 617.3999999999999
+ vertex -173.09081272081974 -95.6616353266133 617.3999999999999
+ vertex -170.86468526559196 -95.94877203309034 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -170.86468526559196 -95.94877203309034 617.3999999999999
+ vertex -173.09081272081974 -95.6616353266133 617.3999999999999
+ vertex -171.13441640635446 -96.59996061131355 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -171.13441640635446 -96.59996061131355 617.3999999999999
+ vertex -173.09081272081974 -95.6616353266133 617.3999999999999
+ vertex -171.22641667537397 -97.29877203309034 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -171.22641667537397 -97.29877203309034 617.3999999999999
+ vertex -173.09081272081974 -95.6616353266133 617.3999999999999
+ vertex -171.13441640635446 -97.99758345486715 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -171.13441640635446 -97.99758345486715 617.3999999999999
+ vertex -173.09081272081974 -95.6616353266133 617.3999999999999
+ vertex -170.86468526559193 -98.64877203309034 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -170.86468526559193 -98.64877203309034 617.3999999999999
+ vertex -173.09081272081974 -95.6616353266133 617.3999999999999
+ vertex -169.3908127208197 -102.0702233146181 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -169.3908127208197 -102.0702233146181 617.3999999999999
+ vertex -173.09081272081974 -95.6616353266133 617.3999999999999
+ vertex -170.16355338185102 -101.86316807853612 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -169.3908127208197 -102.0702233146181 617.3999999999999
+ vertex -170.16355338185102 -101.86316807853612 617.3999999999999
+ vertex -170.2933162240922 -105.43841224283983 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -170.16355338185102 -101.86316807853612 617.3999999999999
+ vertex -173.09081272081974 -95.6616353266133 617.3999999999999
+ vertex -173.29786795690174 -96.43437598764457 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -170.2933162240922 -105.43841224283983 617.3999999999999
+ vertex -170.16355338185102 -101.86316807853612 617.3999999999999
+ vertex -171.06605688512346 -105.23135700675783 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -170.2933162240922 -105.43841224283983 617.3999999999999
+ vertex -171.06605688512346 -105.23135700675783 617.3999999999999
+ vertex -169.27615893656682 -107.20018034412274 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -175.14026055170459 -105.04325840595743 617.3999999999999
+ vertex -172.82782498640634 -106.2485142942832 617.3999999999999
+ vertex -173.92782498640634 -104.34325840595744 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -172.82782498640634 -106.2485142942832 617.3999999999999
+ vertex -175.14026055170459 -105.04325840595743 617.3999999999999
+ vertex -172.51278567479108 -106.8223993327105 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -172.51278567479108 -106.8223993327105 617.3999999999999
+ vertex -175.14026055170459 -105.04325840595743 617.3999999999999
+ vertex -172.7670554709477 -107.15377018260895 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -172.7670554709477 -107.15377018260895 617.3999999999999
+ vertex -175.14026055170459 -105.04325840595743 617.3999999999999
+ vertex -172.92689614695513 -107.53965971044495 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -172.92689614695513 -107.53965971044495 617.3999999999999
+ vertex -175.14026055170459 -105.04325840595743 617.3999999999999
+ vertex -172.9814148248926 -107.95377018260898 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -172.9814148248926 -107.95377018260898 617.3999999999999
+ vertex -175.14026055170459 -105.04325840595743 617.3999999999999
+ vertex -172.9268961469551 -108.367880654773 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -172.9268961469551 -108.367880654773 617.3999999999999
+ vertex -175.14026055170459 -105.04325840595743 617.3999999999999
+ vertex -172.76705547094767 -108.753770182609 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -172.76705547094767 -108.753770182609 617.3999999999999
+ vertex -175.14026055170459 -105.04325840595743 617.3999999999999
+ vertex -171.82064530943393 -110.59300066715029 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -171.82064530943393 -110.59300066715029 617.3999999999999
+ vertex -175.14026055170459 -105.04325840595743 617.3999999999999
+ vertex -174.9402605517046 -105.38966856747122 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -171.82064530943393 -110.59300066715029 617.3999999999999
+ vertex -174.9402605517046 -105.38966856747122 617.3999999999999
+ vertex -172.07946435453644 -110.55892649343936 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -172.07946435453644 -110.55892649343936 617.3999999999999
+ vertex -174.9402605517046 -105.38966856747122 617.3999999999999
+ vertex -175.28667071321837 -105.58966856747122 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -172.07946435453644 -110.55892649343936 617.3999999999999
+ vertex -175.28667071321837 -105.58966856747122 617.3999999999999
+ vertex -172.32064530943393 -110.45902607093474 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -172.32064530943393 -110.45902607093474 617.3999999999999
+ vertex -175.28667071321837 -105.58966856747122 617.3999999999999
+ vertex -172.52775209062048 -110.30010744833685 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -172.52775209062048 -110.30010744833685 617.3999999999999
+ vertex -175.28667071321837 -105.58966856747122 617.3999999999999
+ vertex -172.68667071321835 -110.0930006671503 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -169.27615893656682 -107.20018034412274 617.3999999999999
+ vertex -166.6709030482411 -107.31261590942096 617.3999999999999
+ vertex -167.37090304824105 -106.10018034412275 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -166.6709030482411 -107.31261590942096 617.3999999999999
+ vertex -169.27615893656682 -107.20018034412274 617.3999999999999
+ vertex -167.01731320975483 -107.51261590942096 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -167.01731320975483 -107.51261590942096 617.3999999999999
+ vertex -169.27615893656682 -107.20018034412274 617.3999999999999
+ vertex -166.81731320975484 -107.85902607093475 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -166.81731320975484 -107.85902607093475 617.3999999999999
+ vertex -169.27615893656682 -107.20018034412274 617.3999999999999
+ vertex -169.99577417883745 -108.75377018260897 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -166.81731320975484 -107.85902607093475 617.3999999999999
+ vertex -169.99577417883745 -108.75377018260897 617.3999999999999
+ vertex -170.2500439749941 -109.08514103250742 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -166.81731320975484 -107.85902607093475 617.3999999999999
+ vertex -170.2500439749941 -109.08514103250742 617.3999999999999
+ vertex -171.32064530943393 -110.45902607093474 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -169.99577417883745 -108.75377018260897 617.3999999999999
+ vertex -169.27615893656682 -107.20018034412274 617.3999999999999
+ vertex -169.83593350283007 -108.36788065477299 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -169.83593350283007 -108.36788065477299 617.3999999999999
+ vertex -169.27615893656682 -107.20018034412274 617.3999999999999
+ vertex -169.78141482489258 -107.95377018260895 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -169.78141482489258 -107.95377018260895 617.3999999999999
+ vertex -169.27615893656682 -107.20018034412274 617.3999999999999
+ vertex -169.83593350283007 -107.53965971044492 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -169.83593350283007 -107.53965971044492 617.3999999999999
+ vertex -169.27615893656682 -107.20018034412274 617.3999999999999
+ vertex -169.99577417883748 -107.15377018260895 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -169.99577417883748 -107.15377018260895 617.3999999999999
+ vertex -169.27615893656682 -107.20018034412274 617.3999999999999
+ vertex -171.06605688512346 -105.23135700675783 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -171.32064530943393 -110.45902607093474 617.3999999999999
+ vertex -170.2500439749941 -109.08514103250742 617.3999999999999
+ vertex -170.58141482489256 -109.33941082866406 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -171.32064530943393 -110.45902607093474 617.3999999999999
+ vertex -170.58141482489256 -109.33941082866406 617.3999999999999
+ vertex -170.96730435272855 -109.49925150467148 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -171.32064530943393 -110.45902607093474 617.3999999999999
+ vertex -170.96730435272855 -109.49925150467148 617.3999999999999
+ vertex -171.38141482489257 -109.55377018260897 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -171.32064530943393 -110.45902607093474 617.3999999999999
+ vertex -171.38141482489257 -109.55377018260897 617.3999999999999
+ vertex -171.7955252970566 -109.49925150467148 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -171.32064530943393 -110.45902607093474 617.3999999999999
+ vertex -171.7955252970566 -109.49925150467148 617.3999999999999
+ vertex -172.18141482489256 -109.33941082866409 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -171.32064530943393 -110.45902607093474 617.3999999999999
+ vertex -172.18141482489256 -109.33941082866409 617.3999999999999
+ vertex -171.5618262643314 -110.55892649343936 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -171.5618262643314 -110.55892649343936 617.3999999999999
+ vertex -172.18141482489256 -109.33941082866409 617.3999999999999
+ vertex -172.51278567479108 -109.08514103250747 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -171.5618262643314 -110.55892649343936 617.3999999999999
+ vertex -172.51278567479108 -109.08514103250747 617.3999999999999
+ vertex -171.82064530943393 -110.59300066715029 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -171.82064530943393 -110.59300066715029 617.3999999999999
+ vertex -172.51278567479108 -109.08514103250747 617.3999999999999
+ vertex -172.76705547094767 -108.753770182609 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -171.06605688512346 -105.23135700675783 617.3999999999999
+ vertex -170.25004397499413 -106.82239933271049 617.3999999999999
+ vertex -169.99577417883748 -107.15377018260895 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -170.25004397499413 -106.82239933271049 617.3999999999999
+ vertex -171.06605688512346 -105.23135700675783 617.3999999999999
+ vertex -170.5814148248926 -106.56812953655385 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -170.5814148248926 -106.56812953655385 617.3999999999999
+ vertex -171.06605688512346 -105.23135700675783 617.3999999999999
+ vertex -170.96730435272858 -106.40828886054645 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -170.96730435272858 -106.40828886054645 617.3999999999999
+ vertex -171.06605688512346 -105.23135700675783 617.3999999999999
+ vertex -171.3814148248926 -106.35377018260895 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -171.3814148248926 -106.35377018260895 617.3999999999999
+ vertex -171.06605688512346 -105.23135700675783 617.3999999999999
+ vertex -172.82782498640634 -106.2485142942832 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -171.3814148248926 -106.35377018260895 617.3999999999999
+ vertex -172.82782498640634 -106.2485142942832 617.3999999999999
+ vertex -171.79552529705666 -106.40828886054645 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -171.79552529705666 -106.40828886054645 617.3999999999999
+ vertex -172.82782498640634 -106.2485142942832 617.3999999999999
+ vertex -172.18141482489258 -106.56812953655387 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -172.18141482489258 -106.56812953655387 617.3999999999999
+ vertex -172.82782498640634 -106.2485142942832 617.3999999999999
+ vertex -172.51278567479108 -106.8223993327105 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -165.98677646562444 -89.36618705942284 617.3999999999999
+ vertex -166.75951712665574 -89.15913182334084 617.3999999999999
+ vertex -166.88927996889691 -92.73437598764454 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -166.75951712665574 -89.15913182334084 617.3999999999999
+ vertex -165.98677646562444 -89.36618705942284 617.3999999999999
+ vertex -167.7766744141811 -87.39736372205793 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -166.88927996889691 -92.73437598764454 617.3999999999999
+ vertex -166.75951712665574 -89.15913182334084 617.3999999999999
+ vertex -167.6620206299282 -92.52732075156256 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -166.88927996889691 -92.73437598764454 617.3999999999999
+ vertex -167.6620206299282 -92.52732075156256 617.3999999999999
+ vertex -163.75496539384616 -98.1631680785361 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -163.75496539384616 -98.1631680785361 617.3999999999999
+ vertex -167.6620206299282 -92.52732075156256 617.3999999999999
+ vertex -163.9620206299282 -98.9359087395674 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -163.9620206299282 -98.9359087395674 617.3999999999999
+ vertex -167.6620206299282 -92.52732075156256 617.3999999999999
+ vertex -166.188148085156 -95.94877203309035 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -163.9620206299282 -98.9359087395674 617.3999999999999
+ vertex -166.188148085156 -95.94877203309035 617.3999999999999
+ vertex -165.91841694439347 -96.59996061131355 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -163.9620206299282 -98.9359087395674 617.3999999999999
+ vertex -165.91841694439347 -96.59996061131355 617.3999999999999
+ vertex -165.82641667537396 -97.29877203309034 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -163.9620206299282 -98.9359087395674 617.3999999999999
+ vertex -165.82641667537396 -97.29877203309034 617.3999999999999
+ vertex -165.91841694439347 -97.99758345486715 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -163.9620206299282 -98.9359087395674 617.3999999999999
+ vertex -165.91841694439347 -97.99758345486715 617.3999999999999
+ vertex -166.18814808515597 -98.64877203309035 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -163.9620206299282 -98.9359087395674 617.3999999999999
+ vertex -166.18814808515597 -98.64877203309035 617.3999999999999
+ vertex -166.6172283661703 -99.20796034229403 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -163.9620206299282 -98.9359087395674 617.3999999999999
+ vertex -166.6172283661703 -99.20796034229403 617.3999999999999
+ vertex -169.3908127208197 -102.0702233146181 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -169.3908127208197 -102.0702233146181 617.3999999999999
+ vertex -166.6172283661703 -99.20796034229403 617.3999999999999
+ vertex -167.17641667537396 -99.63704062330834 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -169.3908127208197 -102.0702233146181 617.3999999999999
+ vertex -167.17641667537396 -99.63704062330834 617.3999999999999
+ vertex -167.82760525359717 -99.90677176407084 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -169.3908127208197 -102.0702233146181 617.3999999999999
+ vertex -167.82760525359717 -99.90677176407084 617.3999999999999
+ vertex -168.52641667537395 -99.99877203309036 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -169.3908127208197 -102.0702233146181 617.3999999999999
+ vertex -168.52641667537395 -99.99877203309036 617.3999999999999
+ vertex -169.2252280971508 -99.90677176407084 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -169.3908127208197 -102.0702233146181 617.3999999999999
+ vertex -169.2252280971508 -99.90677176407084 617.3999999999999
+ vertex -169.87641667537395 -99.63704062330832 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -169.3908127208197 -102.0702233146181 617.3999999999999
+ vertex -169.87641667537395 -99.63704062330832 617.3999999999999
+ vertex -170.43560498457765 -99.20796034229403 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -169.3908127208197 -102.0702233146181 617.3999999999999
+ vertex -170.43560498457765 -99.20796034229403 617.3999999999999
+ vertex -170.86468526559193 -98.64877203309034 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -163.75496539384616 -98.1631680785361 617.3999999999999
+ vertex -160.59383170170645 -99.83841224283987 617.3999999999999
+ vertex -160.38677646562448 -99.06567158180859 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -160.59383170170645 -99.83841224283987 617.3999999999999
+ vertex -163.75496539384616 -98.1631680785361 617.3999999999999
+ vertex -163.9620206299282 -98.9359087395674 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -161.48193030250687 -102.70018034412274 617.3999999999999
+ vertex -160.43552014099308 -103.71261590942096 617.3999999999999
+ vertex -159.57667441418107 -101.60018034412275 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -160.43552014099308 -103.71261590942096 617.3999999999999
+ vertex -161.48193030250687 -102.70018034412274 617.3999999999999
+ vertex -160.78193030250688 -103.91261590942096 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -156.48577787980025 -99.35377018260895 617.3999999999999
+ vertex -155.52508126012748 -101.30010744833686 617.3999999999999
+ vertex -155.36616263752956 -101.09300066715029 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -155.52508126012748 -101.30010744833686 617.3999999999999
+ vertex -156.48577787980025 -99.35377018260895 617.3999999999999
+ vertex -156.32593720379282 -99.73965971044491 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -155.52508126012748 -101.30010744833686 617.3999999999999
+ vertex -156.32593720379282 -99.73965971044491 617.3999999999999
+ vertex -156.27141852585532 -100.15377018260895 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -155.52508126012748 -101.30010744833686 617.3999999999999
+ vertex -156.27141852585532 -100.15377018260895 617.3999999999999
+ vertex -155.732188041314 -101.45902607093474 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -155.732188041314 -101.45902607093474 617.3999999999999
+ vertex -156.27141852585532 -100.15377018260895 617.3999999999999
+ vertex -156.32593720379282 -100.56788065477299 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -155.732188041314 -101.45902607093474 617.3999999999999
+ vertex -156.32593720379282 -100.56788065477299 617.3999999999999
+ vertex -156.48577787980022 -100.95377018260896 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -155.732188041314 -101.45902607093474 617.3999999999999
+ vertex -156.48577787980022 -100.95377018260896 617.3999999999999
+ vertex -156.74004767595684 -101.28514103250744 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -155.732188041314 -101.45902607093474 617.3999999999999
+ vertex -156.74004767595684 -101.28514103250744 617.3999999999999
+ vertex -160.2355201409931 -104.05902607093472 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -160.2355201409931 -104.05902607093472 617.3999999999999
+ vertex -156.74004767595684 -101.28514103250744 617.3999999999999
+ vertex -157.0714185258553 -101.53941082866406 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -160.2355201409931 -104.05902607093472 617.3999999999999
+ vertex -157.0714185258553 -101.53941082866406 617.3999999999999
+ vertex -157.45730805369126 -101.69925150467147 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -160.2355201409931 -104.05902607093472 617.3999999999999
+ vertex -157.45730805369126 -101.69925150467147 617.3999999999999
+ vertex -157.87141852585532 -101.75377018260896 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -160.2355201409931 -104.05902607093472 617.3999999999999
+ vertex -157.87141852585532 -101.75377018260896 617.3999999999999
+ vertex -158.28552899801934 -101.6992515046715 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -160.2355201409931 -104.05902607093472 617.3999999999999
+ vertex -158.28552899801934 -101.6992515046715 617.3999999999999
+ vertex -158.67141852585533 -101.53941082866409 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -160.2355201409931 -104.05902607093472 617.3999999999999
+ vertex -158.67141852585533 -101.53941082866409 617.3999999999999
+ vertex -159.0027893757538 -101.28514103250745 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -160.2355201409931 -104.05902607093472 617.3999999999999
+ vertex -159.0027893757538 -101.28514103250745 617.3999999999999
+ vertex -159.25705917191044 -100.95377018260898 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -160.2355201409931 -104.05902607093472 617.3999999999999
+ vertex -159.25705917191044 -100.95377018260898 617.3999999999999
+ vertex -159.57667441418107 -101.60018034412275 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -159.57667441418107 -101.60018034412275 617.3999999999999
+ vertex -159.25705917191044 -100.95377018260898 617.3999999999999
+ vertex -160.38677646562448 -99.06567158180859 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -159.57667441418107 -101.60018034412275 617.3999999999999
+ vertex -160.38677646562448 -99.06567158180859 617.3999999999999
+ vertex -160.59383170170645 -99.83841224283987 617.3999999999999
+ endloop
+endfacet
+facet normal 2.455826945656519e-20 4.0139287745165085e-19 1.0
+ outer loop
+ vertex -160.2355201409931 -104.05902607093472 617.3999999999999
+ vertex -159.57667441418107 -101.60018034412275 617.3999999999999
+ vertex -160.43552014099308 -103.71261590942096 617.3999999999999
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.102597550340903 188.82097856533454 599.2000000000002
+ vertex 27.449007711854623 189.02097856533456 597.8000000000001
+ vertex 27.102597550340843 188.82097856533457 597.8000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.449007711854623 189.02097856533456 597.8000000000001
+ vertex 27.102597550340903 188.82097856533454 599.2000000000002
+ vertex 30.554479138125195 190.81392332925265 598.0545186779377
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.449007711854623 189.02097856533456 597.8000000000001
+ vertex 30.554479138125195 190.81392332925265 598.0545186779377
+ vertex 30.91310932699238 191.0209785653347 598.0000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.449007711854623 189.02097856533456 597.8000000000001
+ vertex 30.91310932699238 191.0209785653347 598.0000000000001
+ vertex 32.70233981153365 192.05399126722693 597.9000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 30.554479138125195 190.81392332925265 598.0545186779377
+ vertex 27.102597550340903 188.82097856533454 599.2000000000002
+ vertex 30.220289003964815 190.62097856533464 598.214359353945
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 30.220289003964815 190.62097856533464 598.214359353945
+ vertex 27.102597550340903 188.82097856533454 599.2000000000002
+ vertex 29.933313429879124 190.45529314038538 598.4686291501016
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.933313429879124 190.45529314038538 598.4686291501016
+ vertex 27.102597550340903 188.82097856533454 599.2000000000002
+ vertex 29.713109326992388 190.32815824230707 598.8000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.713109326992388 190.32815824230707 598.8000000000002
+ vertex 27.102597550340903 188.82097856533454 599.2000000000002
+ vertex 29.57468324101191 190.24823790430335 599.1858895278361
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.57468324101191 190.24823790430335 599.1858895278361
+ vertex 27.102597550340903 188.82097856533454 599.2000000000002
+ vertex 29.007853438666647 189.9209785653346 599.2000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.57468324101191 190.24823790430335 599.1858895278361
+ vertex 29.007853438666647 189.9209785653346 599.2000000000002
+ vertex 29.527468680937297 190.22097856533458 599.6000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.527468680937297 190.22097856533458 599.6000000000001
+ vertex 29.007853438666647 189.9209785653346 599.2000000000002
+ vertex 29.007853438666707 189.92097856533448 601.2343145750508
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.527468680937297 190.22097856533458 599.6000000000001
+ vertex 29.007853438666707 189.92097856533448 601.2343145750508
+ vertex 29.57468324101192 190.24823790430332 600.0141104721642
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.57468324101192 190.24823790430332 600.0141104721642
+ vertex 29.007853438666707 189.92097856533448 601.2343145750508
+ vertex 29.713109326992434 190.32815824230704 600.4000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.713109326992434 190.32815824230704 600.4000000000002
+ vertex 29.007853438666707 189.92097856533448 601.2343145750508
+ vertex 29.933313429879142 190.45529314038532 600.7313708498986
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.933313429879142 190.45529314038532 600.7313708498986
+ vertex 29.007853438666707 189.92097856533448 601.2343145750508
+ vertex 30.22028900396488 190.62097856533453 600.9856406460553
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 30.22028900396488 190.62097856533453 600.9856406460553
+ vertex 29.007853438666707 189.92097856533448 601.2343145750508
+ vertex 30.554479138125185 190.81392332925253 601.1454813220627
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 30.554479138125185 190.81392332925253 601.1454813220627
+ vertex 29.007853438666707 189.92097856533448 601.2343145750508
+ vertex 30.913109326992416 191.02097856533453 601.2000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.13973867537202 182.49156904278303 597.434074173711
+ vertex 20.86721464309301 185.22097856533443 597.4000000000001
+ vertex 16.36388254341405 182.6209785653343 597.4000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 20.86721464309301 185.22097856533443 597.4000000000001
+ vertex 16.13973867537202 182.49156904278303 597.434074173711
+ vertex 20.867214643093014 185.22097856533438 597.8000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 20.867214643093014 185.22097856533438 597.8000000000001
+ vertex 16.13973867537202 182.49156904278303 597.434074173711
+ vertex 15.930869841521801 182.37097856533427 597.5339745962157
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 20.867214643093014 185.22097856533438 597.8000000000001
+ vertex 15.930869841521801 182.37097856533427 597.5339745962157
+ vertex 15.751510107718227 182.26742517474096 597.6928932188135
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 20.867214643093014 185.22097856533438 597.8000000000001
+ vertex 15.751510107718227 182.26742517474096 597.6928932188135
+ vertex 15.613882543413997 182.187965863442 597.9000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 20.867214643093014 185.22097856533438 597.8000000000001
+ vertex 15.613882543413997 182.187965863442 597.9000000000001
+ vertex 21.213624804606773 185.4209785653344 597.8000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.213624804606773 185.4209785653344 597.8000000000001
+ vertex 15.613882543413997 182.187965863442 597.9000000000001
+ vertex 17.403113027955335 183.22097856533426 598.0000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.213624804606773 185.4209785653344 597.8000000000001
+ vertex 17.403113027955335 183.22097856533426 598.0000000000001
+ vertex 17.761743216822566 183.4280338014163 598.0545186779376
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.213624804606773 185.4209785653344 597.8000000000001
+ vertex 17.761743216822566 183.4280338014163 598.0545186779376
+ vertex 21.213624804606773 185.42097856533437 599.2000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.213624804606773 185.42097856533437 599.2000000000002
+ vertex 17.761743216822566 183.4280338014163 598.0545186779376
+ vertex 18.09593335098285 183.62097856533433 598.214359353945
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.213624804606773 185.42097856533437 599.2000000000002
+ vertex 18.09593335098285 183.62097856533433 598.214359353945
+ vertex 18.3829089250686 183.78666399028353 598.4686291501016
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.213624804606773 185.42097856533437 599.2000000000002
+ vertex 18.3829089250686 183.78666399028353 598.4686291501016
+ vertex 18.60311302795533 183.91379888836184 598.8000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.213624804606773 185.42097856533437 599.2000000000002
+ vertex 18.60311302795533 183.91379888836184 598.8000000000002
+ vertex 18.741539113935833 183.99371922636553 599.1858895278361
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.213624804606773 185.42097856533437 599.2000000000002
+ vertex 18.741539113935833 183.99371922636553 599.1858895278361
+ vertex 19.308368916281097 184.3209785653343 599.2000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.308368916281097 184.3209785653343 599.2000000000002
+ vertex 18.741539113935833 183.99371922636553 599.1858895278361
+ vertex 18.788753674010444 184.0209785653343 599.6000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.308368916281097 184.3209785653343 599.2000000000002
+ vertex 18.788753674010444 184.0209785653343 599.6000000000001
+ vertex 19.308368916281122 184.3209785653342 601.2343145750509
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.308368916281122 184.3209785653342 601.2343145750509
+ vertex 18.788753674010444 184.0209785653343 599.6000000000001
+ vertex 18.74153911393583 183.99371922636553 600.0141104721642
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.308368916281122 184.3209785653342 601.2343145750509
+ vertex 18.74153911393583 183.99371922636553 600.0141104721642
+ vertex 18.60311302795535 183.91379888836178 600.4000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.308368916281122 184.3209785653342 601.2343145750509
+ vertex 18.60311302795535 183.91379888836178 600.4000000000002
+ vertex 18.382908925068623 183.78666399028344 600.7313708498987
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.308368916281122 184.3209785653342 601.2343145750509
+ vertex 18.382908925068623 183.78666399028344 600.7313708498987
+ vertex 18.095933350982918 183.6209785653342 600.9856406460553
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.308368916281122 184.3209785653342 601.2343145750509
+ vertex 18.095933350982918 183.6209785653342 600.9856406460553
+ vertex 17.761743216822598 183.4280338014162 601.1454813220627
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.308368916281122 184.3209785653342 601.2343145750509
+ vertex 17.761743216822598 183.4280338014162 601.1454813220627
+ vertex 17.40311302795538 183.22097856533415 601.2000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 15.497857139629923 182.1209785653337 616.4000000000001
+ vertex 15.844267301143587 182.32097856533386 611.2000000000002
+ vertex 15.497857139629847 182.12097856533381 611.2000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 15.844267301143587 182.32097856533386 611.2000000000002
+ vertex 15.497857139629923 182.1209785653337 616.4000000000001
+ vertex 16.064686941975182 182.4482379043025 614.785889527836
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 15.844267301143587 182.32097856533386 611.2000000000002
+ vertex 16.064686941975182 182.4482379043025 614.785889527836
+ vertex 16.203113027955656 182.5281582423062 614.4000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 15.844267301143587 182.32097856533386 611.2000000000002
+ vertex 16.203113027955656 182.5281582423062 614.4000000000001
+ vertex 17.056702866441864 183.02097856533382 613.0000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.056702866441864 183.02097856533382 613.0000000000001
+ vertex 16.203113027955656 182.5281582423062 614.4000000000001
+ vertex 16.423317130842396 182.6552931403845 614.0686291501016
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.056702866441864 183.02097856533382 613.0000000000001
+ vertex 16.423317130842396 182.6552931403845 614.0686291501016
+ vertex 16.710292704928097 182.8209785653338 613.814359353945
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.056702866441864 183.02097856533382 613.0000000000001
+ vertex 16.710292704928097 182.8209785653338 613.814359353945
+ vertex 17.044482839088413 183.01392332925178 613.6545186779376
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.056702866441864 183.02097856533382 613.0000000000001
+ vertex 17.044482839088413 183.01392332925178 613.6545186779376
+ vertex 18.818470967724718 184.03813585285926 613.0000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 18.818470967724718 184.03813585285926 613.0000000000001
+ vertex 17.044482839088413 183.01392332925178 613.6545186779376
+ vertex 17.403113027955648 183.2209785653338 613.6000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 18.818470967724718 184.03813585285926 613.0000000000001
+ vertex 17.403113027955648 183.2209785653338 613.6000000000001
+ vertex 19.30836891628135 184.32097856533386 613.5656854249494
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.064686941975182 182.4482379043025 614.785889527836
+ vertex 15.497857139629923 182.1209785653337 616.4000000000001
+ vertex 16.01747238190058 182.4209785653337 615.2000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.01747238190058 182.4209785653337 615.2000000000002
+ vertex 15.497857139629923 182.1209785653337 616.4000000000001
+ vertex 16.064686941975175 182.44823790430246 615.6141104721642
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.064686941975175 182.44823790430246 615.6141104721642
+ vertex 15.497857139629923 182.1209785653337 616.4000000000001
+ vertex 16.20311302795568 182.52815824230615 616.0000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.20311302795568 182.52815824230615 616.0000000000001
+ vertex 15.497857139629923 182.1209785653337 616.4000000000001
+ vertex 16.42331713084241 182.65529314038446 616.3313708498986
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.42331713084241 182.65529314038446 616.3313708498986
+ vertex 15.497857139629923 182.1209785653337 616.4000000000001
+ vertex 16.71029270492811 182.8209785653337 616.5856406460553
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.71029270492811 182.8209785653337 616.5856406460553
+ vertex 15.497857139629923 182.1209785653337 616.4000000000001
+ vertex 15.527366239676597 182.1380156521891 616.6588190451026
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.71029270492811 182.8209785653337 616.5856406460553
+ vertex 15.527366239676597 182.1380156521891 616.6588190451026
+ vertex 17.04448283908847 183.01392332925164 616.7454813220626
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.04448283908847 183.01392332925164 616.7454813220626
+ vertex 15.527366239676597 182.1380156521891 616.6588190451026
+ vertex 15.613882543414398 182.18796586344143 616.9000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.04448283908847 183.01392332925164 616.7454813220626
+ vertex 15.613882543414398 182.18796586344143 616.9000000000001
+ vertex 17.403113027955662 183.22097856533372 616.8000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.30836891628135 184.32097856533386 613.5656854249494
+ vertex 18.603113027955626 183.91379888836136 614.4000000000001
+ vertex 19.308368916281395 184.3209785653338 615.6000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 18.603113027955626 183.91379888836136 614.4000000000001
+ vertex 19.30836891628135 184.32097856533386 613.5656854249494
+ vertex 18.382908925068907 183.78666399028305 614.0686291501017
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 18.382908925068907 183.78666399028305 614.0686291501017
+ vertex 19.30836891628135 184.32097856533386 613.5656854249494
+ vertex 18.095933350983174 183.62097856533384 613.814359353945
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 18.095933350983174 183.62097856533384 613.814359353945
+ vertex 19.30836891628135 184.32097856533386 613.5656854249494
+ vertex 17.761743216822868 183.42803380141584 613.6545186779376
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.761743216822868 183.42803380141584 613.6545186779376
+ vertex 19.30836891628135 184.32097856533386 613.5656854249494
+ vertex 17.403113027955648 183.2209785653338 613.6000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.308368916281395 184.3209785653338 615.6000000000001
+ vertex 18.603113027955626 183.91379888836136 614.4000000000001
+ vertex 18.741539113936128 183.99371922636507 614.785889527836
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.308368916281395 184.3209785653338 615.6000000000001
+ vertex 18.741539113936128 183.99371922636507 614.785889527836
+ vertex 18.788753674010707 184.0209785653338 615.2000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.308368916281395 184.3209785653338 615.6000000000001
+ vertex 18.788753674010707 184.0209785653338 615.2000000000002
+ vertex 18.741539113936135 183.99371922636504 615.6141104721642
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.308368916281395 184.3209785653338 615.6000000000001
+ vertex 18.741539113936135 183.99371922636504 615.6141104721642
+ vertex 21.21362480460709 185.42097856533385 615.6000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.21362480460709 185.42097856533385 615.6000000000001
+ vertex 18.741539113936135 183.99371922636504 615.6141104721642
+ vertex 21.21362480460716 185.4209785653338 617.0000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.21362480460716 185.4209785653338 617.0000000000002
+ vertex 18.741539113936135 183.99371922636504 615.6141104721642
+ vertex 18.60311302795565 183.91379888836133 616.0000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.21362480460716 185.4209785653338 617.0000000000002
+ vertex 18.60311302795565 183.91379888836133 616.0000000000001
+ vertex 18.38290892506893 183.78666399028296 616.3313708498987
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.21362480460716 185.4209785653338 617.0000000000002
+ vertex 18.38290892506893 183.78666399028296 616.3313708498987
+ vertex 18.095933350983213 183.62097856533373 616.5856406460553
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.21362480460716 185.4209785653338 617.0000000000002
+ vertex 18.095933350983213 183.62097856533373 616.5856406460553
+ vertex 17.76174321682286 183.42803380141572 616.7454813220626
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.21362480460716 185.4209785653338 617.0000000000002
+ vertex 17.76174321682286 183.42803380141572 616.7454813220626
+ vertex 17.403113027955662 183.22097856533372 616.8000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.21362480460716 185.4209785653338 617.0000000000002
+ vertex 17.403113027955662 183.22097856533372 616.8000000000002
+ vertex 15.613882543414398 182.18796586344143 616.9000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.21362480460716 185.4209785653338 617.0000000000002
+ vertex 15.613882543414398 182.18796586344143 616.9000000000001
+ vertex 20.867214643093394 185.2209785653338 617.0000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 20.867214643093394 185.2209785653338 617.0000000000002
+ vertex 15.613882543414398 182.18796586344143 616.9000000000001
+ vertex 15.751510107718625 182.26742517474034 617.1071067811868
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 20.867214643093394 185.2209785653338 617.0000000000002
+ vertex 15.751510107718625 182.26742517474034 617.1071067811868
+ vertex 20.86721464309339 185.22097856533378 617.4000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 20.86721464309339 185.22097856533378 617.4000000000002
+ vertex 15.751510107718625 182.26742517474034 617.1071067811868
+ vertex 15.930869841522176 182.37097856533364 617.2660254037846
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 20.86721464309339 185.22097856533378 617.4000000000002
+ vertex 15.930869841522176 182.37097856533364 617.2660254037846
+ vertex 16.13973867537238 182.4915690427824 617.3659258262892
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 20.86721464309339 185.22097856533378 617.4000000000002
+ vertex 16.13973867537238 182.4915690427824 617.3659258262892
+ vertex 16.363882543414398 182.62097856533364 617.4000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.007853438666707 189.92097856533448 601.2343145750508
+ vertex 29.497751387223325 190.20382127780914 601.8000000000001
+ vertex 31.259519488506204 191.22097856533455 601.8000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.497751387223325 190.20382127780914 601.8000000000001
+ vertex 29.007853438666707 189.92097856533448 601.2343145750508
+ vertex 26.872507222919698 188.68813585285974 603.7000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.497751387223325 190.20382127780914 601.8000000000001
+ vertex 26.872507222919698 188.68813585285974 603.7000000000002
+ vertex 27.362405171476308 188.97097856533438 604.2656854249494
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.362405171476308 188.97097856533438 604.2656854249494
+ vertex 26.872507222919698 188.68813585285974 603.7000000000002
+ vertex 21.443715132028238 185.55382127780885 603.7000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.362405171476308 188.97097856533438 604.2656854249494
+ vertex 21.443715132028238 185.55382127780885 603.7000000000002
+ vertex 20.953817183471575 185.2709785653342 604.2656854249494
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.362405171476308 188.97097856533438 604.2656854249494
+ vertex 20.953817183471575 185.2709785653342 604.2656854249494
+ vertex 24.15811117747396 187.12097856533427 604.7000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 24.15811117747396 187.12097856533427 604.7000000000002
+ vertex 20.953817183471575 185.2709785653342 604.2656854249494
+ vertex 23.552922733760536 186.77157285444585 604.7920002690196
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 23.552922733760536 186.77157285444585 604.7920002690196
+ vertex 20.953817183471575 185.2709785653342 604.2656854249494
+ vertex 22.98897688236502 186.44597856533423 605.0617314097822
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 22.98897688236502 186.44597856533423 605.0617314097822
+ vertex 20.953817183471575 185.2709785653342 604.2656854249494
+ vertex 22.504705601095367 186.16638441073235 605.4908116907965
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 22.504705601095367 186.16638441073235 605.4908116907965
+ vertex 20.953817183471575 185.2709785653342 604.2656854249494
+ vertex 22.13311117747401 185.9518442702252 606.0500000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 22.13311117747401 185.9518442702252 606.0500000000002
+ vertex 20.953817183471575 185.2709785653342 604.2656854249494
+ vertex 21.89951715738199 185.8169786998439 606.7011885782233
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.89951715738199 185.8169786998439 606.7011885782233
+ vertex 20.953817183471575 185.2709785653342 604.2656854249494
+ vertex 20.953817183471706 185.270978565334 610.5343145750509
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.89951715738199 185.8169786998439 606.7011885782233
+ vertex 20.953817183471706 185.270978565334 610.5343145750509
+ vertex 21.819842587256076 185.77097856533416 607.4000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.819842587256076 185.77097856533416 607.4000000000001
+ vertex 20.953817183471706 185.270978565334 610.5343145750509
+ vertex 21.899517157381997 185.81697869984384 608.098811421777
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.899517157381997 185.81697869984384 608.098811421777
+ vertex 20.953817183471706 185.270978565334 610.5343145750509
+ vertex 22.133111177474095 185.9518442702251 608.7500000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 22.133111177474095 185.9518442702251 608.7500000000001
+ vertex 20.953817183471706 185.270978565334 610.5343145750509
+ vertex 22.50470560109544 186.16638441073226 609.3091883092038
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 22.50470560109544 186.16638441073226 609.3091883092038
+ vertex 20.953817183471706 185.270978565334 610.5343145750509
+ vertex 22.988976882365094 186.4459785653341 609.7382685902181
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 22.988976882365094 186.4459785653341 609.7382685902181
+ vertex 20.953817183471706 185.270978565334 610.5343145750509
+ vertex 23.552922733760624 186.77157285444568 610.0079997309806
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 23.552922733760624 186.77157285444568 610.0079997309806
+ vertex 20.953817183471706 185.270978565334 610.5343145750509
+ vertex 24.15811117747407 187.1209785653341 610.1000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.449007711854623 189.02097856533456 597.8000000000001
+ vertex 31.952339811533662 191.62097856533472 597.4000000000001
+ vertex 27.449007711854602 189.02097856533462 597.4000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 31.952339811533662 191.62097856533472 597.4000000000001
+ vertex 27.449007711854623 189.02097856533456 597.8000000000001
+ vertex 32.17648367957566 191.750388087886 597.434074173711
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.17648367957566 191.750388087886 597.434074173711
+ vertex 27.449007711854623 189.02097856533456 597.8000000000001
+ vertex 32.38535251342584 191.87097856533475 597.5339745962157
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.38535251342584 191.87097856533475 597.5339745962157
+ vertex 27.449007711854623 189.02097856533456 597.8000000000001
+ vertex 32.56471224722943 191.97453195592797 597.6928932188135
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.56471224722943 191.97453195592797 597.6928932188135
+ vertex 27.449007711854623 189.02097856533456 597.8000000000001
+ vertex 32.70233981153365 192.05399126722693 597.9000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 15.527366239676214 182.13801565218967 598.1411809548977
+ vertex 17.403113027955335 183.22097856533426 598.0000000000001
+ vertex 15.613882543413997 182.187965863442 597.9000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.403113027955335 183.22097856533426 598.0000000000001
+ vertex 15.527366239676214 182.13801565218967 598.1411809548977
+ vertex 17.04448283908812 183.01392332925224 598.0545186779376
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.04448283908812 183.01392332925224 598.0545186779376
+ vertex 15.527366239676214 182.13801565218967 598.1411809548977
+ vertex 16.710292704927774 182.8209785653343 598.214359353945
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.710292704927774 182.8209785653343 598.214359353945
+ vertex 15.527366239676214 182.13801565218967 598.1411809548977
+ vertex 15.497857139629588 182.12097856533424 598.4000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.710292704927774 182.8209785653343 598.214359353945
+ vertex 15.497857139629588 182.12097856533424 598.4000000000002
+ vertex 16.42331713084209 182.65529314038497 598.4686291501016
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.42331713084209 182.65529314038497 598.4686291501016
+ vertex 15.497857139629588 182.12097856533424 598.4000000000002
+ vertex 16.203113027955354 182.52815824230666 598.8000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.203113027955354 182.52815824230666 598.8000000000001
+ vertex 15.497857139629588 182.12097856533424 598.4000000000002
+ vertex 16.06468694197487 182.44823790430297 599.1858895278361
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.06468694197487 182.44823790430297 599.1858895278361
+ vertex 15.497857139629588 182.12097856533424 598.4000000000002
+ vertex 15.497857139629684 182.12097856533407 603.6000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.06468694197487 182.44823790430297 599.1858895278361
+ vertex 15.497857139629684 182.12097856533407 603.6000000000001
+ vertex 16.01747238190026 182.42097856533417 599.6
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.01747238190026 182.42097856533417 599.6
+ vertex 15.497857139629684 182.12097856533407 603.6000000000001
+ vertex 16.064686941974863 182.44823790430294 600.0141104721641
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.064686941974863 182.44823790430294 600.0141104721641
+ vertex 15.497857139629684 182.12097856533407 603.6000000000001
+ vertex 16.20311302795538 182.52815824230663 600.4000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.20311302795538 182.52815824230663 600.4000000000002
+ vertex 15.497857139629684 182.12097856533407 603.6000000000001
+ vertex 16.423317130842133 182.6552931403849 600.7313708498986
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.423317130842133 182.6552931403849 600.7313708498986
+ vertex 15.497857139629684 182.12097856533407 603.6000000000001
+ vertex 16.710292704927845 182.82097856533417 600.9856406460552
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.710292704927845 182.82097856533417 600.9856406460552
+ vertex 15.497857139629684 182.12097856533407 603.6000000000001
+ vertex 17.044482839088168 183.01392332925215 601.1454813220627
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.044482839088168 183.01392332925215 601.1454813220627
+ vertex 15.497857139629684 182.12097856533407 603.6000000000001
+ vertex 17.40311302795538 183.22097856533415 601.2000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.40311302795538 183.22097856533415 601.2000000000002
+ vertex 15.497857139629684 182.12097856533407 603.6000000000001
+ vertex 17.05670286644162 183.02097856533416 601.8000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.40311302795538 183.22097856533415 601.2000000000002
+ vertex 17.05670286644162 183.02097856533416 601.8000000000001
+ vertex 19.308368916281122 184.3209785653342 601.2343145750509
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.05670286644162 183.02097856533416 601.8000000000001
+ vertex 15.497857139629684 182.12097856533407 603.6000000000001
+ vertex 15.844267301143471 182.3209785653341 603.6000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.05670286644162 183.02097856533416 601.8000000000001
+ vertex 15.844267301143471 182.3209785653341 603.6000000000001
+ vertex 17.056702866441686 183.0209785653341 604.0000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.056702866441686 183.0209785653341 604.0000000000001
+ vertex 15.844267301143471 182.3209785653341 603.6000000000001
+ vertex 15.844267301143471 182.32097856533406 604.0000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.362405171476308 188.97097856533438 604.2656854249494
+ vertex 26.41670519756606 188.4249784308245 606.7011885782233
+ vertex 27.362405171476443 188.97097856533418 610.5343145750509
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 26.41670519756606 188.4249784308245 606.7011885782233
+ vertex 27.362405171476308 188.97097856533438 604.2656854249494
+ vertex 26.183111177473965 188.29011286044332 606.0500000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 26.183111177473965 188.29011286044332 606.0500000000002
+ vertex 27.362405171476308 188.97097856533438 604.2656854249494
+ vertex 25.811516753852615 188.0755727199361 605.4908116907965
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 25.811516753852615 188.0755727199361 605.4908116907965
+ vertex 27.362405171476308 188.97097856533438 604.2656854249494
+ vertex 25.327245472582963 187.79597856533428 605.0617314097822
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 25.327245472582963 187.79597856533428 605.0617314097822
+ vertex 27.362405171476308 188.97097856533438 604.2656854249494
+ vertex 24.76329962118738 187.4703842762227 604.7920002690196
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 24.76329962118738 187.4703842762227 604.7920002690196
+ vertex 27.362405171476308 188.97097856533438 604.2656854249494
+ vertex 24.15811117747396 187.12097856533427 604.7000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.362405171476443 188.97097856533418 610.5343145750509
+ vertex 26.41670519756606 188.4249784308245 606.7011885782233
+ vertex 26.49637976769196 188.47097856533426 607.4000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.362405171476443 188.97097856533418 610.5343145750509
+ vertex 26.49637976769196 188.47097856533426 607.4000000000001
+ vertex 26.416705197566095 188.42497843082444 608.098811421777
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.362405171476443 188.97097856533418 610.5343145750509
+ vertex 26.416705197566095 188.42497843082444 608.098811421777
+ vertex 26.183111177474004 188.2901128604432 608.7500000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.362405171476443 188.97097856533418 610.5343145750509
+ vertex 26.183111177474004 188.2901128604432 608.7500000000001
+ vertex 25.811516753852683 188.07557271993602 609.3091883092038
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.362405171476443 188.97097856533418 610.5343145750509
+ vertex 25.811516753852683 188.07557271993602 609.3091883092038
+ vertex 25.32724547258304 187.79597856533414 609.7382685902181
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.362405171476443 188.97097856533418 610.5343145750509
+ vertex 25.32724547258304 187.79597856533414 609.7382685902181
+ vertex 24.763299621187485 187.47038427622252 610.0079997309806
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.362405171476443 188.97097856533418 610.5343145750509
+ vertex 24.763299621187485 187.47038427622252 610.0079997309806
+ vertex 24.15811117747407 187.1209785653341 610.1000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.362405171476443 188.97097856533418 610.5343145750509
+ vertex 24.15811117747407 187.1209785653341 610.1000000000001
+ vertex 20.953817183471706 185.270978565334 610.5343145750509
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.362405171476443 188.97097856533418 610.5343145750509
+ vertex 20.953817183471706 185.270978565334 610.5343145750509
+ vertex 21.443715132028345 185.5538212778086 611.1000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.443715132028345 185.5538212778086 611.1000000000001
+ vertex 20.953817183471706 185.270978565334 610.5343145750509
+ vertex 18.818470967724718 184.03813585285926 613.0000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.443715132028345 185.5538212778086 611.1000000000001
+ vertex 18.818470967724718 184.03813585285926 613.0000000000001
+ vertex 19.30836891628135 184.32097856533386 613.5656854249494
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 15.844267301143587 182.32097856533386 610.8000000000002
+ vertex 17.056702866441864 183.02097856533382 613.0000000000001
+ vertex 17.056702866441796 183.02097856533388 610.8000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.056702866441864 183.02097856533382 613.0000000000001
+ vertex 15.844267301143587 182.32097856533386 610.8000000000002
+ vertex 15.844267301143587 182.32097856533386 611.2000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.362405171476443 188.97097856533418 610.5343145750509
+ vertex 26.872507222919793 188.6881358528595 611.1000000000001
+ vertex 29.497751387223563 190.20382127780877 613.0000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 26.872507222919793 188.6881358528595 611.1000000000001
+ vertex 27.362405171476443 188.97097856533418 610.5343145750509
+ vertex 21.443715132028345 185.5538212778086 611.1000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.497751387223563 190.20382127780877 613.0000000000002
+ vertex 26.872507222919793 188.6881358528595 611.1000000000001
+ vertex 29.0078534386669 189.9209785653341 613.5656854249494
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.497751387223563 190.20382127780877 613.0000000000002
+ vertex 29.0078534386669 189.9209785653341 613.5656854249494
+ vertex 31.259519488506385 191.22097856533424 613.0000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.102597550341276 188.820978565334 617.0000000000002
+ vertex 29.007853438666945 189.92097856533408 615.6000000000001
+ vertex 27.102597550341205 188.82097856533403 615.6000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.007853438666945 189.92097856533408 615.6000000000001
+ vertex 27.102597550341276 188.820978565334 617.0000000000002
+ vertex 29.574683241012213 190.24823790430284 615.6141104721642
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.574683241012213 190.24823790430284 615.6141104721642
+ vertex 27.102597550341276 188.820978565334 617.0000000000002
+ vertex 29.713109326992683 190.32815824230653 616.0000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.713109326992683 190.32815824230653 616.0000000000001
+ vertex 27.102597550341276 188.820978565334 617.0000000000002
+ vertex 29.93331342987943 190.4552931403848 616.3313708498987
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.93331342987943 190.4552931403848 616.3313708498987
+ vertex 27.102597550341276 188.820978565334 617.0000000000002
+ vertex 30.220289003965142 190.62097856533407 616.5856406460553
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 30.220289003965142 190.62097856533407 616.5856406460553
+ vertex 27.102597550341276 188.820978565334 617.0000000000002
+ vertex 30.554479138125483 190.81392332925202 616.7454813220626
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 30.554479138125483 190.81392332925202 616.7454813220626
+ vertex 27.102597550341276 188.820978565334 617.0000000000002
+ vertex 30.913109326992686 191.0209785653341 616.8000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 30.913109326992686 191.0209785653341 616.8000000000002
+ vertex 27.102597550341276 188.820978565334 617.0000000000002
+ vertex 32.702339811533996 192.05399126722637 616.9000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.702339811533996 192.05399126722637 616.9000000000001
+ vertex 27.102597550341276 188.820978565334 617.0000000000002
+ vertex 27.449007711855035 189.020978565334 617.0000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.702339811533996 192.05399126722637 616.9000000000001
+ vertex 27.449007711855035 189.020978565334 617.0000000000002
+ vertex 32.5647122472298 191.97453195592743 617.1071067811868
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.5647122472298 191.97453195592743 617.1071067811868
+ vertex 27.449007711855035 189.020978565334 617.0000000000002
+ vertex 27.44900771185507 189.020978565334 617.4000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.5647122472298 191.97453195592743 617.1071067811868
+ vertex 27.44900771185507 189.020978565334 617.4000000000002
+ vertex 32.38535251342622 191.87097856533413 617.2660254037846
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.38535251342622 191.87097856533413 617.2660254037846
+ vertex 27.44900771185507 189.020978565334 617.4000000000002
+ vertex 32.17648367957604 191.7503880878854 617.3659258262892
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.17648367957604 191.7503880878854 617.3659258262892
+ vertex 27.44900771185507 189.020978565334 617.4000000000002
+ vertex 31.952339811534035 191.62097856533413 617.4000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 31.25951948850635 191.2209785653343 610.8000000000002
+ vertex 32.47195505380457 191.92097856533434 611.2000000000002
+ vertex 32.471955053804564 191.92097856533434 610.8000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.47195505380457 191.92097856533434 611.2000000000002
+ vertex 31.25951948850635 191.2209785653343 610.8000000000002
+ vertex 31.259519488506385 191.22097856533424 613.0000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.47195505380457 191.92097856533434 611.2000000000002
+ vertex 31.259519488506385 191.22097856533424 613.0000000000002
+ vertex 32.81836521531833 192.12097856533435 611.2000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531833 192.12097856533435 611.2000000000002
+ vertex 31.259519488506385 191.22097856533424 613.0000000000002
+ vertex 32.113109326992664 191.71379888836177 614.4000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531833 192.12097856533435 611.2000000000002
+ vertex 32.113109326992664 191.71379888836177 614.4000000000001
+ vertex 32.25153541297315 191.79371922636545 614.7858895278362
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531833 192.12097856533435 611.2000000000002
+ vertex 32.25153541297315 191.79371922636545 614.7858895278362
+ vertex 32.81836521531845 192.12097856533418 616.4000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.113109326992664 191.71379888836177 614.4000000000001
+ vertex 31.259519488506385 191.22097856533424 613.0000000000002
+ vertex 31.89290522410592 191.58666399028345 614.0686291501017
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 31.89290522410592 191.58666399028345 614.0686291501017
+ vertex 31.259519488506385 191.22097856533424 613.0000000000002
+ vertex 31.605929650020194 191.42097856533422 613.814359353945
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 31.605929650020194 191.42097856533422 613.814359353945
+ vertex 31.259519488506385 191.22097856533424 613.0000000000002
+ vertex 31.27173951585987 191.22803380141625 613.6545186779376
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 31.27173951585987 191.22803380141625 613.6545186779376
+ vertex 31.259519488506385 191.22097856533424 613.0000000000002
+ vertex 30.913109326992664 191.0209785653342 613.6000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 30.913109326992664 191.0209785653342 613.6000000000001
+ vertex 31.259519488506385 191.22097856533424 613.0000000000002
+ vertex 29.0078534386669 189.9209785653341 613.5656854249494
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531845 192.12097856533418 616.4000000000001
+ vertex 32.25153541297315 191.79371922636545 614.7858895278362
+ vertex 32.29874997304777 191.8209785653342 615.2000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531845 192.12097856533418 616.4000000000001
+ vertex 32.29874997304777 191.8209785653342 615.2000000000002
+ vertex 32.251535412973155 191.79371922636543 615.6141104721642
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531845 192.12097856533418 616.4000000000001
+ vertex 32.251535412973155 191.79371922636543 615.6141104721642
+ vertex 32.113109326992664 191.7137988883617 616.0000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531845 192.12097856533418 616.4000000000001
+ vertex 32.113109326992664 191.7137988883617 616.0000000000001
+ vertex 31.892905224105952 191.58666399028337 616.3313708498987
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531845 192.12097856533418 616.4000000000001
+ vertex 31.892905224105952 191.58666399028337 616.3313708498987
+ vertex 31.60592965002024 191.4209785653341 616.5856406460553
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531845 192.12097856533418 616.4000000000001
+ vertex 31.60592965002024 191.4209785653341 616.5856406460553
+ vertex 32.788856115271805 192.1039414784787 616.6588190451026
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.788856115271805 192.1039414784787 616.6588190451026
+ vertex 31.60592965002024 191.4209785653341 616.5856406460553
+ vertex 31.27173951585992 191.2280338014161 616.7454813220627
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.788856115271805 192.1039414784787 616.6588190451026
+ vertex 31.27173951585992 191.2280338014161 616.7454813220627
+ vertex 32.702339811533996 192.05399126722637 616.9000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.702339811533996 192.05399126722637 616.9000000000001
+ vertex 31.27173951585992 191.2280338014161 616.7454813220627
+ vertex 30.913109326992686 191.0209785653341 616.8000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.0078534386669 189.9209785653341 613.5656854249494
+ vertex 30.554479138125426 190.81392332925216 613.6545186779376
+ vertex 30.913109326992664 191.0209785653342 613.6000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 30.554479138125426 190.81392332925216 613.6545186779376
+ vertex 29.0078534386669 189.9209785653341 613.5656854249494
+ vertex 30.22028900396512 190.62097856533418 613.814359353945
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 30.22028900396512 190.62097856533418 613.814359353945
+ vertex 29.0078534386669 189.9209785653341 613.5656854249494
+ vertex 29.9333134298794 190.45529314038492 614.0686291501016
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.9333134298794 190.45529314038492 614.0686291501016
+ vertex 29.0078534386669 189.9209785653341 613.5656854249494
+ vertex 29.713109326992694 190.32815824230659 614.4000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.713109326992694 190.32815824230659 614.4000000000001
+ vertex 29.0078534386669 189.9209785653341 613.5656854249494
+ vertex 29.007853438666945 189.92097856533408 615.6000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.713109326992694 190.32815824230659 614.4000000000001
+ vertex 29.007853438666945 189.92097856533408 615.6000000000001
+ vertex 29.574683241012185 190.24823790430284 614.785889527836
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.574683241012185 190.24823790430284 614.785889527836
+ vertex 29.007853438666945 189.92097856533408 615.6000000000001
+ vertex 29.527468680937567 190.2209785653341 615.2000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.527468680937567 190.2209785653341 615.2000000000002
+ vertex 29.007853438666945 189.92097856533408 615.6000000000001
+ vertex 29.574683241012213 190.24823790430284 615.6141104721642
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.308368916281122 184.3209785653342 601.2343145750509
+ vertex 18.81847096772448 184.03813585285957 601.8000000000001
+ vertex 21.443715132028238 185.55382127780885 603.7000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 18.81847096772448 184.03813585285957 601.8000000000001
+ vertex 19.308368916281122 184.3209785653342 601.2343145750509
+ vertex 17.05670286644162 183.02097856533416 601.8000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.443715132028238 185.55382127780885 603.7000000000002
+ vertex 18.81847096772448 184.03813585285957 601.8000000000001
+ vertex 20.953817183471575 185.2709785653342 604.2656854249494
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 31.259519488506243 191.2209785653345 604.0000000000001
+ vertex 32.47195505380442 191.92097856533454 603.6
+ vertex 31.259519488506204 191.22097856533455 601.8000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.47195505380442 191.92097856533454 603.6
+ vertex 31.259519488506243 191.2209785653345 604.0000000000001
+ vertex 32.47195505380441 191.92097856533454 604.0000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 30.91310932699238 191.0209785653347 598.0000000000001
+ vertex 32.788856115271464 192.10394147847924 598.1411809548977
+ vertex 32.70233981153365 192.05399126722693 597.9000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.788856115271464 192.10394147847924 598.1411809548977
+ vertex 30.91310932699238 191.0209785653347 598.0000000000001
+ vertex 31.2717395158596 191.2280338014167 598.0545186779377
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.788856115271464 192.10394147847924 598.1411809548977
+ vertex 31.2717395158596 191.2280338014167 598.0545186779377
+ vertex 31.605929650019924 191.42097856533474 598.214359353945
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.788856115271464 192.10394147847924 598.1411809548977
+ vertex 31.605929650019924 191.42097856533474 598.214359353945
+ vertex 32.8183652153181 192.12097856533472 598.4000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.8183652153181 192.12097856533472 598.4000000000002
+ vertex 31.605929650019924 191.42097856533474 598.214359353945
+ vertex 31.892905224105633 191.58666399028394 598.4686291501016
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.8183652153181 192.12097856533472 598.4000000000002
+ vertex 31.892905224105633 191.58666399028394 598.4686291501016
+ vertex 32.113109326992365 191.71379888836222 598.8000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.8183652153181 192.12097856533472 598.4000000000002
+ vertex 32.113109326992365 191.71379888836222 598.8000000000002
+ vertex 32.251535412972856 191.79371922636597 599.1858895278361
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.8183652153181 192.12097856533472 598.4000000000002
+ vertex 32.251535412972856 191.79371922636597 599.1858895278361
+ vertex 32.818365215318174 192.12097856533453 603.6
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.818365215318174 192.12097856533453 603.6
+ vertex 32.251535412972856 191.79371922636597 599.1858895278361
+ vertex 32.298749973047464 191.82097856533466 599.6000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.818365215318174 192.12097856533453 603.6
+ vertex 32.298749973047464 191.82097856533466 599.6000000000001
+ vertex 32.25153541297286 191.7937192263659 600.0141104721642
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.818365215318174 192.12097856533453 603.6
+ vertex 32.25153541297286 191.7937192263659 600.0141104721642
+ vertex 32.11310932699237 191.71379888836222 600.4000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.818365215318174 192.12097856533453 603.6
+ vertex 32.11310932699237 191.71379888836222 600.4000000000002
+ vertex 31.89290522410566 191.58666399028382 600.7313708498987
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.818365215318174 192.12097856533453 603.6
+ vertex 31.89290522410566 191.58666399028382 600.7313708498987
+ vertex 31.60592965001994 191.42097856533462 600.9856406460553
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.818365215318174 192.12097856533453 603.6
+ vertex 31.60592965001994 191.42097856533462 600.9856406460553
+ vertex 31.27173951585965 191.2280338014166 601.1454813220627
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.818365215318174 192.12097856533453 603.6
+ vertex 31.27173951585965 191.2280338014166 601.1454813220627
+ vertex 30.913109326992416 191.02097856533453 601.2000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.818365215318174 192.12097856533453 603.6
+ vertex 30.913109326992416 191.02097856533453 601.2000000000002
+ vertex 31.259519488506204 191.22097856533455 601.8000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 31.259519488506204 191.22097856533455 601.8000000000001
+ vertex 30.913109326992416 191.02097856533453 601.2000000000002
+ vertex 29.007853438666707 189.92097856533448 601.2343145750508
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.818365215318174 192.12097856533453 603.6
+ vertex 31.259519488506204 191.22097856533455 601.8000000000001
+ vertex 32.47195505380442 191.92097856533454 603.6
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 181.952339811533 -68.18664256999588 597.4
+ vertex 27.449007711854602 189.02097856533462 597.4000000000001
+ vertex 31.952339811533662 191.62097856533472 597.4000000000001
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 27.449007711854602 189.02097856533462 597.4000000000001
+ vertex 181.952339811533 -68.18664256999588 597.4
+ vertex 177.44900771185397 -70.7866425699961 597.4
+ endloop
+endfacet
+facet normal 0.11303899832181251 0.0652630961100721 -0.9914448613738078
+ outer loop
+ vertex 182.176483679575 -68.05723304744467 597.434074173711
+ vertex 31.952339811533662 191.62097856533472 597.4000000000001
+ vertex 32.17648367957566 191.750388087886 597.434074173711
+ endloop
+endfacet
+facet normal 0.11303899832181251 0.0652630961100721 -0.9914448613738078
+ outer loop
+ vertex 31.952339811533662 191.62097856533472 597.4000000000001
+ vertex 182.176483679575 -68.05723304744467 597.434074173711
+ vertex 181.952339811533 -68.18664256999588 597.4
+ endloop
+endfacet
+facet normal -2.189385090694423e-14 2.884359777632179e-14 -1.0
+ outer loop
+ vertex 176.87250722291898 -71.11948528247086 603.7
+ vertex 21.443715132028238 185.55382127780885 603.7000000000002
+ vertex 26.872507222919698 188.68813585285974 603.7000000000002
+ endloop
+endfacet
+facet normal -2.189385090694423e-14 2.884359777632179e-14 -1.0
+ outer loop
+ vertex 21.443715132028238 185.55382127780885 603.7000000000002
+ vertex 176.87250722291898 -71.11948528247086 603.7
+ vertex 171.4437151320275 -74.25379985752176 603.7
+ endloop
+endfacet
+facet normal 0.33141357403555705 0.1913417161825882 -0.9238795325112902
+ outer loop
+ vertex 182.38535251342523 -67.93664256999594 597.5339745962156
+ vertex 32.17648367957566 191.750388087886 597.434074173711
+ vertex 32.38535251342584 191.87097856533475 597.5339745962157
+ endloop
+endfacet
+facet normal 0.33141357403555705 0.1913417161825882 -0.9238795325112902
+ outer loop
+ vertex 32.17648367957566 191.750388087886 597.434074173711
+ vertex 182.38535251342523 -67.93664256999594 597.5339745962156
+ vertex 182.176483679575 -68.05723304744467 597.434074173711
+ endloop
+endfacet
+facet normal 0.5272028623656286 0.3043807145043965 -0.7933533402912483
+ outer loop
+ vertex 182.5647122472288 -67.83308917940268 597.6928932188135
+ vertex 32.38535251342584 191.87097856533475 597.5339745962157
+ vertex 32.56471224722943 191.97453195592797 597.6928932188135
+ endloop
+endfacet
+facet normal 0.5272028623656286 0.3043807145043965 -0.7933533402912483
+ outer loop
+ vertex 32.38535251342584 191.87097856533475 597.5339745962157
+ vertex 182.5647122472288 -67.83308917940268 597.6928932188135
+ vertex 182.38535251342523 -67.93664256999594 597.5339745962156
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 7.797766215937043e-16
+ outer loop
+ vertex 181.25951948850556 -68.58664256999612 601.8000000000001
+ vertex 31.259519488506243 191.2209785653345 604.0000000000001
+ vertex 31.259519488506204 191.22097856533455 601.8000000000001
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 7.797766215937043e-16
+ outer loop
+ vertex 31.259519488506243 191.2209785653345 604.0000000000001
+ vertex 181.25951948850556 -68.58664256999612 601.8000000000001
+ vertex 181.25951948850556 -68.58664256999616 604.0000000000001
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 6.227439144697608e-15
+ outer loop
+ vertex 177.44900771185397 -70.7866425699961 597.4
+ vertex 27.449007711854623 189.02097856533456 597.8000000000001
+ vertex 27.449007711854602 189.02097856533462 597.4000000000001
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 6.227439144697608e-15
+ outer loop
+ vertex 27.449007711854623 189.02097856533456 597.8000000000001
+ vertex 177.44900771185397 -70.7866425699961 597.4
+ vertex 177.44900771185388 -70.78664256999606 597.8000000000001
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 179.00785343866596 -69.88664256999604 599.2
+ vertex 29.007853438666707 189.92097856533448 601.2343145750508
+ vertex 29.007853438666647 189.9209785653346 599.2000000000002
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 29.007853438666707 189.92097856533448 601.2343145750508
+ vertex 179.00785343866596 -69.88664256999604 599.2
+ vertex 179.00785343866602 -69.88664256999613 601.2343145750508
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 19.308368916281122 184.3209785653342 601.2343145750509
+ vertex 169.30836891628041 -75.48664256999639 599.2
+ vertex 19.308368916281097 184.3209785653343 599.2000000000002
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 169.30836891628041 -75.48664256999639 599.2
+ vertex 19.308368916281122 184.3209785653342 601.2343145750509
+ vertex 169.30836891628041 -75.48664256999639 601.2343145750508
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 29.497751387223325 190.20382127780914 601.8000000000001
+ vertex 181.25951948850556 -68.58664256999612 601.8000000000001
+ vertex 31.259519488506204 191.22097856533455 601.8000000000001
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 181.25951948850556 -68.58664256999612 601.8000000000001
+ vertex 29.497751387223325 190.20382127780914 601.8000000000001
+ vertex 179.49775138722262 -69.60379985752151 601.8000000000001
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 27.102597550340903 188.82097856533454 599.2000000000002
+ vertex 179.00785343866596 -69.88664256999604 599.2
+ vertex 29.007853438666647 189.9209785653346 599.2000000000002
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 179.00785343866596 -69.88664256999604 599.2
+ vertex 27.102597550340903 188.82097856533454 599.2000000000002
+ vertex 177.10259755034025 -70.9866425699961 599.2
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 20.867214643093014 185.22097856533438 597.8000000000001
+ vertex 170.86721464309238 -74.58664256999629 597.4
+ vertex 20.86721464309301 185.22097856533443 597.4000000000001
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 170.86721464309238 -74.58664256999629 597.4
+ vertex 20.867214643093014 185.22097856533438 597.8000000000001
+ vertex 170.86721464309232 -74.58664256999629 597.8000000000001
+ endloop
+endfacet
+facet normal 0.8001031451912467 0.46193976625568567 -0.38268343236507846
+ outer loop
+ vertex 32.788856115271464 192.10394147847924 598.1411809548977
+ vertex 182.702339811533 -67.75362986810374 597.9
+ vertex 32.70233981153365 192.05399126722693 597.9000000000001
+ endloop
+endfacet
+facet normal 0.8001031451912467 0.46193976625568567 -0.38268343236507846
+ outer loop
+ vertex 182.702339811533 -67.75362986810374 597.9
+ vertex 32.788856115271464 192.10394147847924 598.1411809548977
+ vertex 182.78885611527082 -67.70367965685142 598.1411809548975
+ endloop
+endfacet
+facet normal 0.6123724356957974 0.3535533905932763 0.7071067811865439
+ outer loop
+ vertex 177.36240517147564 -70.83664256999627 604.2656854249493
+ vertex 29.497751387223325 190.20382127780914 601.8000000000001
+ vertex 27.362405171476308 188.97097856533438 604.2656854249494
+ endloop
+endfacet
+facet normal 0.6123724356957974 0.3535533905932763 0.7071067811865439
+ outer loop
+ vertex 29.497751387223325 190.20382127780914 601.8000000000001
+ vertex 177.36240517147564 -70.83664256999627 604.2656854249493
+ vertex 179.49775138722262 -69.60379985752151 601.8000000000001
+ endloop
+endfacet
+facet normal -0.6123724356957947 -0.35355339059327473 -0.707106781186547
+ outer loop
+ vertex 179.00785343866602 -69.88664256999613 601.2343145750508
+ vertex 26.872507222919698 188.68813585285974 603.7000000000002
+ vertex 29.007853438666707 189.92097856533448 601.2343145750508
+ endloop
+endfacet
+facet normal -0.6123724356957947 -0.35355339059327473 -0.707106781186547
+ outer loop
+ vertex 26.872507222919698 188.68813585285974 603.7000000000002
+ vertex 179.00785343866602 -69.88664256999613 601.2343145750508
+ vertex 176.87250722291898 -71.11948528247086 603.7
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 32.47195505380442 191.92097856533454 603.6
+ vertex 182.81836521531753 -67.68664256999614 603.6
+ vertex 32.818365215318174 192.12097856533453 603.6
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 182.81836521531753 -67.68664256999614 603.6
+ vertex 32.47195505380442 191.92097856533454 603.6
+ vertex 182.47195505380378 -67.88664256999614 603.6
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 171.2136248046061 -74.38664256999624 597.8000000000001
+ vertex 20.867214643093014 185.22097856533438 597.8000000000001
+ vertex 21.213624804606773 185.4209785653344 597.8000000000001
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 20.867214643093014 185.22097856533438 597.8000000000001
+ vertex 171.2136248046061 -74.38664256999624 597.8000000000001
+ vertex 170.86721464309232 -74.58664256999629 597.8000000000001
+ endloop
+endfacet
+facet normal 3.2732387459073094e-14 -2.2585965780327815e-14 1.0
+ outer loop
+ vertex 31.259519488506243 191.2209785653345 604.0000000000001
+ vertex 182.47195505380373 -67.88664256999614 604.0
+ vertex 32.47195505380441 191.92097856533454 604.0000000000001
+ endloop
+endfacet
+facet normal 3.2732387459073094e-14 -2.2585965780327815e-14 1.0
+ outer loop
+ vertex 182.47195505380373 -67.88664256999614 604.0
+ vertex 31.259519488506243 191.2209785653345 604.0000000000001
+ vertex 181.25951948850556 -68.58664256999616 604.0000000000001
+ endloop
+endfacet
+facet normal 0.6123724356957699 0.35355339059331115 -0.7071067811865503
+ outer loop
+ vertex 171.4437151320275 -74.25379985752176 603.7
+ vertex 19.308368916281122 184.3209785653342 601.2343145750509
+ vertex 21.443715132028238 185.55382127780885 603.7000000000002
+ endloop
+endfacet
+facet normal 0.6123724356957699 0.35355339059331115 -0.7071067811865503
+ outer loop
+ vertex 19.308368916281122 184.3209785653342 601.2343145750509
+ vertex 171.4437151320275 -74.25379985752176 603.7
+ vertex 169.30836891628041 -75.48664256999639 601.2343145750508
+ endloop
+endfacet
+facet normal -0.1130389983218509 -0.06526309611000974 -0.9914448613738074
+ outer loop
+ vertex 166.36388254341333 -77.18664256999637 597.4
+ vertex 16.13973867537202 182.49156904278303 597.434074173711
+ vertex 16.36388254341405 182.6209785653343 597.4000000000001
+ endloop
+endfacet
+facet normal -0.1130389983218509 -0.06526309611000974 -0.9914448613738074
+ outer loop
+ vertex 16.13973867537202 182.49156904278303 597.434074173711
+ vertex 166.36388254341333 -77.18664256999637 597.4
+ vertex 166.13973867537132 -77.31605209254764 597.434074173711
+ endloop
+endfacet
+facet normal -0.3314135740355962 -0.1913417161825235 -0.9238795325112896
+ outer loop
+ vertex 166.13973867537132 -77.31605209254764 597.434074173711
+ vertex 15.930869841521801 182.37097856533427 597.5339745962157
+ vertex 16.13973867537202 182.49156904278303 597.434074173711
+ endloop
+endfacet
+facet normal -0.3314135740355962 -0.1913417161825235 -0.9238795325112896
+ outer loop
+ vertex 15.930869841521801 182.37097856533427 597.5339745962157
+ vertex 166.13973867537132 -77.31605209254764 597.434074173711
+ vertex 165.93086984152112 -77.43664256999635 597.5339745962156
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 2.4387889803801352e-15
+ outer loop
+ vertex 182.81836521531753 -67.68664256999614 603.6
+ vertex 32.8183652153181 192.12097856533472 598.4000000000002
+ vertex 32.818365215318174 192.12097856533453 603.6
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 2.4387889803801352e-15
+ outer loop
+ vertex 32.8183652153181 192.12097856533472 598.4000000000002
+ vertex 182.81836521531753 -67.68664256999614 603.6
+ vertex 182.81836521531739 -67.68664256999595 598.4000000000001
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 177.44900771185388 -70.78664256999606 597.8000000000001
+ vertex 27.102597550340843 188.82097856533457 597.8000000000001
+ vertex 27.449007711854623 189.02097856533456 597.8000000000001
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 27.102597550340843 188.82097856533457 597.8000000000001
+ vertex 177.44900771185388 -70.78664256999606 597.8000000000001
+ vertex 177.10259755034016 -70.9866425699961 597.8000000000001
+ endloop
+endfacet
+facet normal 0.8586164364012412 0.4957224306869379 -0.1305261922200573
+ outer loop
+ vertex 182.81836521531739 -67.68664256999595 598.4000000000001
+ vertex 32.788856115271464 192.10394147847924 598.1411809548977
+ vertex 32.8183652153181 192.12097856533472 598.4000000000002
+ endloop
+endfacet
+facet normal 0.8586164364012412 0.4957224306869379 -0.1305261922200573
+ outer loop
+ vertex 32.788856115271464 192.10394147847924 598.1411809548977
+ vertex 182.81836521531739 -67.68664256999595 598.4000000000001
+ vertex 182.78885611527082 -67.70367965685142 598.1411809548975
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 171.21362480460616 -74.38664256999633 599.2
+ vertex 21.213624804606773 185.4209785653344 597.8000000000001
+ vertex 21.213624804606773 185.42097856533437 599.2000000000002
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 21.213624804606773 185.4209785653344 597.8000000000001
+ vertex 171.21362480460616 -74.38664256999633 599.2
+ vertex 171.2136248046061 -74.38664256999624 597.8000000000001
+ endloop
+endfacet
+facet normal -0.5272028623656617 -0.30438071450434234 -0.7933533402912472
+ outer loop
+ vertex 165.93086984152112 -77.43664256999635 597.5339745962156
+ vertex 15.751510107718227 182.26742517474096 597.6928932188135
+ vertex 15.930869841521801 182.37097856533427 597.5339745962157
+ endloop
+endfacet
+facet normal -0.5272028623656617 -0.30438071450434234 -0.7933533402912472
+ outer loop
+ vertex 15.751510107718227 182.26742517474096 597.6928932188135
+ vertex 165.93086984152112 -77.43664256999635 597.5339745962156
+ vertex 165.75151010771754 -77.54019596058967 597.6928932188135
+ endloop
+endfacet
+facet normal -0.6870641468694523 -0.39667667014561686 -0.6087614290087188
+ outer loop
+ vertex 15.751510107718227 182.26742517474096 597.6928932188135
+ vertex 165.61388254341333 -77.61965527188865 597.9000000000001
+ vertex 15.613882543413997 182.187965863442 597.9000000000001
+ endloop
+endfacet
+facet normal -0.6870641468694523 -0.39667667014561686 -0.6087614290087188
+ outer loop
+ vertex 165.61388254341333 -77.61965527188865 597.9000000000001
+ vertex 15.751510107718227 182.26742517474096 597.6928932188135
+ vertex 165.75151010771754 -77.54019596058967 597.6928932188135
+ endloop
+endfacet
+facet normal 0.6870641468694344 0.3966766701456517 -0.6087614290087163
+ outer loop
+ vertex 182.702339811533 -67.75362986810374 597.9
+ vertex 32.56471224722943 191.97453195592797 597.6928932188135
+ vertex 32.70233981153365 192.05399126722693 597.9000000000001
+ endloop
+endfacet
+facet normal 0.6870641468694344 0.3966766701456517 -0.6087614290087163
+ outer loop
+ vertex 32.56471224722943 191.97453195592797 597.6928932188135
+ vertex 182.702339811533 -67.75362986810374 597.9
+ vertex 182.5647122472288 -67.83308917940268 597.6928932188135
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 4.122523745489034e-14
+ outer loop
+ vertex 177.10259755034016 -70.9866425699961 597.8000000000001
+ vertex 27.102597550340903 188.82097856533454 599.2000000000002
+ vertex 27.102597550340843 188.82097856533457 597.8000000000001
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 4.122523745489034e-14
+ outer loop
+ vertex 27.102597550340903 188.82097856533454 599.2000000000002
+ vertex 177.10259755034016 -70.9866425699961 597.8000000000001
+ vertex 177.10259755034025 -70.9866425699961 599.2
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -6.007129263248553e-15
+ outer loop
+ vertex 182.47195505380373 -67.88664256999614 604.0
+ vertex 32.47195505380442 191.92097856533454 603.6
+ vertex 32.47195505380441 191.92097856533454 604.0000000000001
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -6.007129263248553e-15
+ outer loop
+ vertex 32.47195505380442 191.92097856533454 603.6
+ vertex 182.47195505380373 -67.88664256999614 604.0
+ vertex 182.47195505380378 -67.88664256999614 603.6
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 19.308368916281097 184.3209785653343 599.2000000000002
+ vertex 171.21362480460616 -74.38664256999633 599.2
+ vertex 21.213624804606773 185.42097856533437 599.2000000000002
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 171.21362480460616 -74.38664256999633 599.2
+ vertex 19.308368916281097 184.3209785653343 599.2000000000002
+ vertex 169.30836891628041 -75.48664256999639 599.2
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 170.86721464309238 -74.58664256999629 597.4
+ vertex 16.36388254341405 182.6209785653343 597.4000000000001
+ vertex 20.86721464309301 185.22097856533443 597.4000000000001
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 16.36388254341405 182.6209785653343 597.4000000000001
+ vertex 170.86721464309238 -74.58664256999629 597.4
+ vertex 166.36388254341333 -77.18664256999637 597.4
+ endloop
+endfacet
+facet normal -0.11303899832180275 -0.06526309611006646 0.9914448613738092
+ outer loop
+ vertex 17.403113027955335 183.22097856533426 598.0000000000001
+ vertex 167.76174321682183 -76.37958733391434 598.0545186779375
+ vertex 17.761743216822566 183.4280338014163 598.0545186779376
+ endloop
+endfacet
+facet normal -0.11303899832180275 -0.06526309611006646 0.9914448613738092
+ outer loop
+ vertex 167.76174321682183 -76.37958733391434 598.0545186779375
+ vertex 17.403113027955335 183.22097856533426 598.0000000000001
+ vertex 167.40311302795465 -76.58664256999637 598.0000000000001
+ endloop
+endfacet
+facet normal -0.858616436401242 -0.49572243068693833 -0.13052619222005132
+ outer loop
+ vertex 176.49637976769128 -71.33664256999639 607.4
+ vertex 26.416705197566095 188.42497843082444 608.098811421777
+ vertex 26.49637976769196 188.47097856533426 607.4000000000001
+ endloop
+endfacet
+facet normal -0.858616436401242 -0.49572243068693833 -0.13052619222005132
+ outer loop
+ vertex 26.416705197566095 188.42497843082444 608.098811421777
+ vertex 176.49637976769128 -71.33664256999639 607.4
+ vertex 176.41670519756536 -71.38264270450611 608.0988114217769
+ endloop
+endfacet
+facet normal -0.5272028623656281 -0.3043807145043962 0.7933533402912488
+ outer loop
+ vertex 25.327245472582963 187.79597856533428 605.0617314097822
+ vertex 175.81151675385192 -71.73204841539449 605.4908116907964
+ vertex 25.811516753852615 188.0755727199361 605.4908116907965
+ endloop
+endfacet
+facet normal -0.5272028623656281 -0.3043807145043962 0.7933533402912488
+ outer loop
+ vertex 175.81151675385192 -71.73204841539449 605.4908116907964
+ vertex 25.327245472582963 187.79597856533428 605.0617314097822
+ vertex 175.32724547258226 -72.01164256999633 605.061731409782
+ endloop
+endfacet
+facet normal -0.8001031451912652 -0.46193976625565125 -0.38268343236508084
+ outer loop
+ vertex 26.416705197566095 188.42497843082444 608.098811421777
+ vertex 176.18311117747334 -71.51750827488746 608.7500000000001
+ vertex 26.183111177474004 188.2901128604432 608.7500000000001
+ endloop
+endfacet
+facet normal -0.8001031451912652 -0.46193976625565125 -0.38268343236508084
+ outer loop
+ vertex 176.18311117747334 -71.51750827488746 608.7500000000001
+ vertex 26.416705197566095 188.42497843082444 608.098811421777
+ vertex 176.41670519756536 -71.38264270450611 608.0988114217769
+ endloop
+endfacet
+facet normal -0.8001031451912611 -0.46193976625566013 -0.38268343236507896
+ outer loop
+ vertex 165.61388254341333 -77.61965527188865 597.9000000000001
+ vertex 15.527366239676214 182.13801565218967 598.1411809548977
+ vertex 15.613882543413997 182.187965863442 597.9000000000001
+ endloop
+endfacet
+facet normal -0.8001031451912611 -0.46193976625566013 -0.38268343236507896
+ outer loop
+ vertex 15.527366239676214 182.13801565218967 598.1411809548977
+ vertex 165.61388254341333 -77.61965527188865 597.9000000000001
+ vertex 165.52736623967553 -77.66960548314098 598.1411809548975
+ endloop
+endfacet
+facet normal -0.11303899832182693 -0.06526309610999309 -0.9914448613738114
+ outer loop
+ vertex 174.76329962118686 -72.33723685910816 610.0079997309805
+ vertex 24.15811117747407 187.1209785653341 610.1000000000001
+ vertex 24.763299621187485 187.47038427622252 610.0079997309806
+ endloop
+endfacet
+facet normal -0.11303899832182693 -0.06526309610999309 -0.9914448613738114
+ outer loop
+ vertex 24.15811117747407 187.1209785653341 610.1000000000001
+ vertex 174.76329962118686 -72.33723685910816 610.0079997309805
+ vertex 174.15811117747336 -72.68664256999658 610.1
+ endloop
+endfacet
+facet normal 0.5272028623656281 0.3043807145043962 -0.7933533402912488
+ outer loop
+ vertex 172.98897688236445 -73.3616425699966 609.7382685902181
+ vertex 22.50470560109544 186.16638441073226 609.3091883092038
+ vertex 22.988976882365094 186.4459785653341 609.7382685902181
+ endloop
+endfacet
+facet normal 0.5272028623656281 0.3043807145043962 -0.7933533402912488
+ outer loop
+ vertex 22.50470560109544 186.16638441073226 609.3091883092038
+ vertex 172.98897688236445 -73.3616425699966 609.7382685902181
+ vertex 172.5047056010948 -73.64123672459844 609.3091883092037
+ endloop
+endfacet
+facet normal -0.8001031451912407 -0.4619397662556935 0.3826834323650809
+ outer loop
+ vertex 176.1831111774733 -71.51750827488736 606.0500000000001
+ vertex 26.41670519756606 188.4249784308245 606.7011885782233
+ vertex 26.183111177473965 188.29011286044332 606.0500000000002
+ endloop
+endfacet
+facet normal -0.8001031451912407 -0.4619397662556935 0.3826834323650809
+ outer loop
+ vertex 26.41670519756606 188.4249784308245 606.7011885782233
+ vertex 176.1831111774733 -71.51750827488736 606.0500000000001
+ vertex 176.4167051975654 -71.38264270450611 606.7011885782233
+ endloop
+endfacet
+facet normal -0.3314135740356128 -0.19134171618253307 -0.9238795325112817
+ outer loop
+ vertex 175.3272454725823 -72.01164256999647 609.738268590218
+ vertex 24.763299621187485 187.47038427622252 610.0079997309806
+ vertex 25.32724547258304 187.79597856533414 609.7382685902181
+ endloop
+endfacet
+facet normal -0.3314135740356128 -0.19134171618253307 -0.9238795325112817
+ outer loop
+ vertex 24.763299621187485 187.47038427622252 610.0079997309806
+ vertex 175.3272454725823 -72.01164256999647 609.738268590218
+ vertex 174.76329962118686 -72.33723685910816 610.0079997309805
+ endloop
+endfacet
+facet normal 0.11303899832182654 0.06526309610999427 0.9914448613738113
+ outer loop
+ vertex 23.552922733760536 186.77157285444585 604.7920002690196
+ vertex 174.15811117747327 -72.68664256999635 604.7
+ vertex 24.15811117747396 187.12097856533427 604.7000000000002
+ endloop
+endfacet
+facet normal 0.11303899832182654 0.06526309610999427 0.9914448613738113
+ outer loop
+ vertex 174.15811117747327 -72.68664256999635 604.7
+ vertex 23.552922733760536 186.77157285444585 604.7920002690196
+ vertex 173.55292273375986 -73.03604828088481 604.7920002690196
+ endloop
+endfacet
+facet normal 0.8001031451912652 0.46193976625565125 0.38268343236508084
+ outer loop
+ vertex 21.89951715738199 185.8169786998439 606.7011885782233
+ vertex 172.13311117747335 -73.85577686510548 606.0500000000001
+ vertex 22.13311117747401 185.9518442702252 606.0500000000002
+ endloop
+endfacet
+facet normal 0.8001031451912652 0.46193976625565125 0.38268343236508084
+ outer loop
+ vertex 172.13311117747335 -73.85577686510548 606.0500000000001
+ vertex 21.89951715738199 185.8169786998439 606.7011885782233
+ vertex 171.89951715738127 -73.99064243548673 606.7011885782233
+ endloop
+endfacet
+facet normal 0.33141357403557603 0.19134171618259352 -0.9238795325112824
+ outer loop
+ vertex 173.55292273376 -73.036048280885 610.0079997309805
+ vertex 22.988976882365094 186.4459785653341 609.7382685902181
+ vertex 23.552922733760624 186.77157285444568 610.0079997309806
+ endloop
+endfacet
+facet normal 0.33141357403557603 0.19134171618259352 -0.9238795325112824
+ outer loop
+ vertex 22.988976882365094 186.4459785653341 609.7382685902181
+ vertex 173.55292273376 -73.036048280885 610.0079997309805
+ vertex 172.98897688236445 -73.3616425699966 609.7382685902181
+ endloop
+endfacet
+facet normal -0.6870641468694503 -0.3966766701456213 -0.6087614290087181
+ outer loop
+ vertex 176.18311117747334 -71.51750827488746 608.7500000000001
+ vertex 25.811516753852683 188.07557271993602 609.3091883092038
+ vertex 26.183111177474004 188.2901128604432 608.7500000000001
+ endloop
+endfacet
+facet normal -0.6870641468694503 -0.3966766701456213 -0.6087614290087181
+ outer loop
+ vertex 25.811516753852683 188.07557271993602 609.3091883092038
+ vertex 176.18311117747334 -71.51750827488746 608.7500000000001
+ vertex 175.81151675385203 -71.73204841539467 609.3091883092037
+ endloop
+endfacet
+facet normal -0.8586164364012464 -0.4957224306869296 0.1305261922200552
+ outer loop
+ vertex 26.41670519756606 188.4249784308245 606.7011885782233
+ vertex 176.49637976769128 -71.33664256999639 607.4
+ vertex 26.49637976769196 188.47097856533426 607.4000000000001
+ endloop
+endfacet
+facet normal -0.8586164364012464 -0.4957224306869296 0.1305261922200552
+ outer loop
+ vertex 176.49637976769128 -71.33664256999639 607.4
+ vertex 26.41670519756606 188.4249784308245 606.7011885782233
+ vertex 176.4167051975654 -71.38264270450611 606.7011885782233
+ endloop
+endfacet
+facet normal 0.8001031451912417 0.4619397662556828 -0.3826834323650923
+ outer loop
+ vertex 172.13311117747338 -73.85577686510553 608.7500000000001
+ vertex 21.899517157381997 185.81697869984384 608.098811421777
+ vertex 22.133111177474095 185.9518442702251 608.7500000000001
+ endloop
+endfacet
+facet normal 0.8001031451912417 0.4619397662556828 -0.3826834323650923
+ outer loop
+ vertex 21.899517157381997 185.81697869984384 608.098811421777
+ vertex 172.13311117747338 -73.85577686510553 608.7500000000001
+ vertex 171.89951715738135 -73.99064243548682 608.0988114217769
+ endloop
+endfacet
+facet normal 0.11303899832179497 0.06526309610997745 0.9914448613738159
+ outer loop
+ vertex 17.04448283908812 183.01392332925224 598.0545186779376
+ vertex 167.40311302795465 -76.58664256999637 598.0000000000001
+ vertex 17.403113027955335 183.22097856533426 598.0000000000001
+ endloop
+endfacet
+facet normal 0.11303899832179497 0.06526309610997745 0.9914448613738159
+ outer loop
+ vertex 167.40311302795465 -76.58664256999637 598.0000000000001
+ vertex 17.04448283908812 183.01392332925224 598.0545186779376
+ vertex 167.04448283908746 -76.79369780607836 598.0545186779375
+ endloop
+endfacet
+facet normal 0.6870641468694518 0.3966766701456166 0.6087614290087193
+ outer loop
+ vertex 172.13311117747335 -73.85577686510548 606.0500000000001
+ vertex 22.504705601095367 186.16638441073235 605.4908116907965
+ vertex 22.13311117747401 185.9518442702252 606.0500000000002
+ endloop
+endfacet
+facet normal 0.6870641468694518 0.3966766701456166 0.6087614290087193
+ outer loop
+ vertex 22.504705601095367 186.16638441073235 605.4908116907965
+ vertex 172.13311117747335 -73.85577686510548 606.0500000000001
+ vertex 172.50470560109466 -73.64123672459827 605.4908116907964
+ endloop
+endfacet
+facet normal -0.5272028623656586 -0.3043807145043462 -0.7933533402912477
+ outer loop
+ vertex 175.81151675385203 -71.73204841539467 609.3091883092037
+ vertex 25.32724547258304 187.79597856533414 609.7382685902181
+ vertex 25.811516753852683 188.07557271993602 609.3091883092038
+ endloop
+endfacet
+facet normal -0.5272028623656586 -0.3043807145043462 -0.7933533402912477
+ outer loop
+ vertex 25.32724547258304 187.79597856533414 609.7382685902181
+ vertex 175.81151675385203 -71.73204841539467 609.3091883092037
+ vertex 175.3272454725823 -72.01164256999647 609.738268590218
+ endloop
+endfacet
+facet normal -0.11303899832178858 -0.06526309611005687 0.9914448613738115
+ outer loop
+ vertex 24.15811117747396 187.12097856533427 604.7000000000002
+ vertex 174.76329962118672 -72.33723685910793 604.7920002690196
+ vertex 24.76329962118738 187.4703842762227 604.7920002690196
+ endloop
+endfacet
+facet normal -0.11303899832178858 -0.06526309611005687 0.9914448613738115
+ outer loop
+ vertex 174.76329962118672 -72.33723685910793 604.7920002690196
+ vertex 24.15811117747396 187.12097856533427 604.7000000000002
+ vertex 174.15811117747327 -72.68664256999635 604.7
+ endloop
+endfacet
+facet normal 0.6870641468694304 0.3966766701456494 -0.6087614290087222
+ outer loop
+ vertex 172.5047056010948 -73.64123672459844 609.3091883092037
+ vertex 22.133111177474095 185.9518442702251 608.7500000000001
+ vertex 22.50470560109544 186.16638441073226 609.3091883092038
+ endloop
+endfacet
+facet normal 0.6870641468694304 0.3966766701456494 -0.6087614290087222
+ outer loop
+ vertex 22.133111177474095 185.9518442702251 608.7500000000001
+ vertex 172.5047056010948 -73.64123672459844 609.3091883092037
+ vertex 172.13311117747338 -73.85577686510553 608.7500000000001
+ endloop
+endfacet
+facet normal 0.858616436401242 0.49572243068693833 -0.13052619222005105
+ outer loop
+ vertex 21.899517157381997 185.81697869984384 608.098811421777
+ vertex 171.81984258725538 -74.03664256999654 607.4000000000001
+ vertex 21.819842587256076 185.77097856533416 607.4000000000001
+ endloop
+endfacet
+facet normal 0.858616436401242 0.49572243068693833 -0.13052619222005105
+ outer loop
+ vertex 171.81984258725538 -74.03664256999654 607.4000000000001
+ vertex 21.899517157381997 185.81697869984384 608.098811421777
+ vertex 171.89951715738135 -73.99064243548682 608.0988114217769
+ endloop
+endfacet
+facet normal 0.11303899832178858 0.06526309611005687 -0.9914448613738115
+ outer loop
+ vertex 174.15811117747336 -72.68664256999658 610.1
+ vertex 23.552922733760624 186.77157285444568 610.0079997309806
+ vertex 24.15811117747407 187.1209785653341 610.1000000000001
+ endloop
+endfacet
+facet normal 0.11303899832178858 0.06526309611005687 -0.9914448613738115
+ outer loop
+ vertex 23.552922733760624 186.77157285444568 610.0079997309806
+ vertex 174.15811117747336 -72.68664256999658 610.1
+ vertex 173.55292273376 -73.036048280885 610.0079997309805
+ endloop
+endfacet
+facet normal 0.33141357403561683 0.19134171618253823 0.9238795325112792
+ outer loop
+ vertex 16.710292704927774 182.8209785653343 598.214359353945
+ vertex 167.04448283908746 -76.79369780607836 598.0545186779375
+ vertex 17.04448283908812 183.01392332925224 598.0545186779376
+ endloop
+endfacet
+facet normal 0.33141357403561683 0.19134171618253823 0.9238795325112792
+ outer loop
+ vertex 167.04448283908746 -76.79369780607836 598.0545186779375
+ vertex 16.710292704927774 182.8209785653343 598.214359353945
+ vertex 166.71029270492707 -76.98664256999636 598.2143593539449
+ endloop
+endfacet
+facet normal -0.6870641468694288 -0.3966766701456541 0.6087614290087209
+ outer loop
+ vertex 25.811516753852615 188.0755727199361 605.4908116907965
+ vertex 176.1831111774733 -71.51750827488736 606.0500000000001
+ vertex 26.183111177473965 188.29011286044332 606.0500000000002
+ endloop
+endfacet
+facet normal -0.6870641468694288 -0.3966766701456541 0.6087614290087209
+ outer loop
+ vertex 176.1831111774733 -71.51750827488736 606.0500000000001
+ vertex 25.811516753852615 188.0755727199361 605.4908116907965
+ vertex 175.81151675385192 -71.73204841539449 605.4908116907964
+ endloop
+endfacet
+facet normal 0.52720286236566 0.3043807145043358 0.7933533402912507
+ outer loop
+ vertex 16.42331713084209 182.65529314038497 598.4686291501016
+ vertex 166.71029270492707 -76.98664256999636 598.2143593539449
+ vertex 16.710292704927774 182.8209785653343 598.214359353945
+ endloop
+endfacet
+facet normal 0.52720286236566 0.3043807145043358 0.7933533402912507
+ outer loop
+ vertex 166.71029270492707 -76.98664256999636 598.2143593539449
+ vertex 16.42331713084209 182.65529314038497 598.4686291501016
+ vertex 166.42331713084138 -77.15232799494558 598.4686291501016
+ endloop
+endfacet
+facet normal -0.3314135740355447 -0.19134171618257262 0.923879532511298
+ outer loop
+ vertex 17.761743216822566 183.4280338014163 598.0545186779376
+ vertex 168.0959333509822 -76.18664256999637 598.2143593539449
+ vertex 18.09593335098285 183.62097856533433 598.214359353945
+ endloop
+endfacet
+facet normal -0.3314135740355447 -0.19134171618257262 0.923879532511298
+ outer loop
+ vertex 168.0959333509822 -76.18664256999637 598.2143593539449
+ vertex 17.761743216822566 183.4280338014163 598.0545186779376
+ vertex 167.76174321682183 -76.37958733391434 598.0545186779375
+ endloop
+endfacet
+facet normal 0.5272028623656586 0.3043807145043462 0.7933533402912477
+ outer loop
+ vertex 22.504705601095367 186.16638441073235 605.4908116907965
+ vertex 172.98897688236434 -73.36164256999642 605.061731409782
+ vertex 22.98897688236502 186.44597856533423 605.0617314097822
+ endloop
+endfacet
+facet normal 0.5272028623656586 0.3043807145043462 0.7933533402912477
+ outer loop
+ vertex 172.98897688236434 -73.36164256999642 605.061731409782
+ vertex 22.504705601095367 186.16638441073235 605.4908116907965
+ vertex 172.50470560109466 -73.64123672459827 605.4908116907964
+ endloop
+endfacet
+facet normal 0.3314135740356128 0.19134171618253307 0.9238795325112817
+ outer loop
+ vertex 22.98897688236502 186.44597856533423 605.0617314097822
+ vertex 173.55292273375986 -73.03604828088481 604.7920002690196
+ vertex 23.552922733760536 186.77157285444585 604.7920002690196
+ endloop
+endfacet
+facet normal 0.3314135740356128 0.19134171618253307 0.9238795325112817
+ outer loop
+ vertex 173.55292273375986 -73.03604828088481 604.7920002690196
+ vertex 22.98897688236502 186.44597856533423 605.0617314097822
+ vertex 172.98897688236434 -73.36164256999642 605.061731409782
+ endloop
+endfacet
+facet normal 0.858616436401242 0.49572243068693833 0.13052619222005132
+ outer loop
+ vertex 171.81984258725538 -74.03664256999654 607.4000000000001
+ vertex 21.89951715738199 185.8169786998439 606.7011885782233
+ vertex 21.819842587256076 185.77097856533416 607.4000000000001
+ endloop
+endfacet
+facet normal 0.858616436401242 0.49572243068693833 0.13052619222005132
+ outer loop
+ vertex 21.89951715738199 185.8169786998439 606.7011885782233
+ vertex 171.81984258725538 -74.03664256999654 607.4000000000001
+ vertex 171.89951715738127 -73.99064243548673 606.7011885782233
+ endloop
+endfacet
+facet normal -0.8586164364012415 -0.49572243068693805 -0.1305261922200554
+ outer loop
+ vertex 15.527366239676214 182.13801565218967 598.1411809548977
+ vertex 165.49785713962896 -77.68664256999648 598.4000000000001
+ vertex 15.497857139629588 182.12097856533424 598.4000000000002
+ endloop
+endfacet
+facet normal -0.8586164364012415 -0.49572243068693805 -0.1305261922200554
+ outer loop
+ vertex 165.49785713962896 -77.68664256999648 598.4000000000001
+ vertex 15.527366239676214 182.13801565218967 598.1411809548977
+ vertex 165.52736623967553 -77.66960548314098 598.1411809548975
+ endloop
+endfacet
+facet normal 0.6870641468694395 0.3966766701456151 0.6087614290087343
+ outer loop
+ vertex 166.20311302795469 -77.27946289302398 598.8
+ vertex 16.42331713084209 182.65529314038497 598.4686291501016
+ vertex 16.203113027955354 182.52815824230666 598.8000000000001
+ endloop
+endfacet
+facet normal 0.6870641468694395 0.3966766701456151 0.6087614290087343
+ outer loop
+ vertex 16.42331713084209 182.65529314038497 598.4686291501016
+ vertex 166.20311302795469 -77.27946289302398 598.8
+ vertex 166.42331713084138 -77.15232799494558 598.4686291501016
+ endloop
+endfacet
+facet normal -0.33141357403557914 -0.19134171618258686 0.9238795325112827
+ outer loop
+ vertex 24.76329962118738 187.4703842762227 604.7920002690196
+ vertex 175.32724547258226 -72.01164256999633 605.061731409782
+ vertex 25.327245472582963 187.79597856533428 605.0617314097822
+ endloop
+endfacet
+facet normal -0.33141357403557914 -0.19134171618258686 0.9238795325112827
+ outer loop
+ vertex 175.32724547258226 -72.01164256999633 605.061731409782
+ vertex 24.76329962118738 187.4703842762227 604.7920002690196
+ vertex 174.76329962118672 -72.33723685910793 604.7920002690196
+ endloop
+endfacet
+facet normal -0.33141357403561683 -0.19134171618253823 -0.9238795325112792
+ outer loop
+ vertex 168.09593335098222 -76.18664256999647 600.9856406460551
+ vertex 17.761743216822598 183.4280338014162 601.1454813220627
+ vertex 18.095933350982918 183.6209785653342 600.9856406460553
+ endloop
+endfacet
+facet normal -0.33141357403561683 -0.19134171618253823 -0.9238795325112792
+ outer loop
+ vertex 17.761743216822598 183.4280338014162 601.1454813220627
+ vertex 168.09593335098222 -76.18664256999647 600.9856406460551
+ vertex 167.76174321682188 -76.37958733391439 601.1454813220626
+ endloop
+endfacet
+facet normal 0.11303899832180415 0.06526309611006587 -0.9914448613738092
+ outer loop
+ vertex 167.40311302795465 -76.58664256999641 601.2
+ vertex 17.044482839088168 183.01392332925215 601.1454813220627
+ vertex 17.40311302795538 183.22097856533415 601.2000000000002
+ endloop
+endfacet
+facet normal 0.11303899832180415 0.06526309611006587 -0.9914448613738092
+ outer loop
+ vertex 17.044482839088168 183.01392332925215 601.1454813220627
+ vertex 167.40311302795465 -76.58664256999641 601.2
+ vertex 167.04448283908746 -76.79369780607848 601.1454813220626
+ endloop
+endfacet
+facet normal 0.8586164364012477 0.4957224306869304 -0.13052619222004383
+ outer loop
+ vertex 166.06468694197423 -77.35938323102775 600.014110472164
+ vertex 16.01747238190026 182.42097856533417 599.6
+ vertex 16.064686941974863 182.44823790430294 600.0141104721641
+ endloop
+endfacet
+facet normal 0.8586164364012477 0.4957224306869304 -0.13052619222004383
+ outer loop
+ vertex 16.01747238190026 182.42097856533417 599.6
+ vertex 166.06468694197423 -77.35938323102775 600.014110472164
+ vertex 166.01747238189964 -77.38664256999651 599.6
+ endloop
+endfacet
+facet normal -0.8586164364012407 -0.4957224306869376 -0.13052619222006184
+ outer loop
+ vertex 168.7887536740098 -75.78664256999642 599.6
+ vertex 18.74153911393583 183.99371922636553 600.0141104721642
+ vertex 18.788753674010444 184.0209785653343 599.6000000000001
+ endloop
+endfacet
+facet normal -0.8586164364012407 -0.4957224306869376 -0.13052619222006184
+ outer loop
+ vertex 18.74153911393583 183.99371922636553 600.0141104721642
+ vertex 168.7887536740098 -75.78664256999642 599.6
+ vertex 168.7415391139352 -75.81390190896518 600.0141104721641
+ endloop
+endfacet
+facet normal -0.6870641468694274 -0.3966766701456533 0.6087614290087231
+ outer loop
+ vertex 168.38290892506788 -76.0209571450471 598.4686291501016
+ vertex 18.60311302795533 183.91379888836184 598.8000000000002
+ vertex 18.3829089250686 183.78666399028353 598.4686291501016
+ endloop
+endfacet
+facet normal -0.6870641468694274 -0.3966766701456533 0.6087614290087231
+ outer loop
+ vertex 18.60311302795533 183.91379888836184 598.8000000000002
+ vertex 168.38290892506788 -76.0209571450471 598.4686291501016
+ vertex 168.60311302795463 -75.89382224696875 598.8000000000001
+ endloop
+endfacet
+facet normal 0.8586164364012514 0.4957224306869325 -0.13052619222001063
+ outer loop
+ vertex 166.06468694197446 -77.35938323102819 615.6141104721642
+ vertex 16.01747238190058 182.4209785653337 615.2000000000002
+ vertex 16.064686941975175 182.44823790430246 615.6141104721642
+ endloop
+endfacet
+facet normal 0.8586164364012514 0.4957224306869325 -0.13052619222001063
+ outer loop
+ vertex 16.01747238190058 182.4209785653337 615.2000000000002
+ vertex 166.06468694197446 -77.35938323102819 615.6141104721642
+ vertex 166.01747238189986 -77.38664256999687 615.2
+ endloop
+endfacet
+facet normal 0.5272028623656548 0.30438071450442294 -0.7933533402912207
+ outer loop
+ vertex 166.71029270492716 -76.98664256999646 600.9856406460551
+ vertex 16.423317130842133 182.6552931403849 600.7313708498986
+ vertex 16.710292704927845 182.82097856533417 600.9856406460552
+ endloop
+endfacet
+facet normal 0.5272028623656548 0.30438071450442294 -0.7933533402912207
+ outer loop
+ vertex 16.423317130842133 182.6552931403849 600.7313708498986
+ vertex 166.71029270492716 -76.98664256999646 600.9856406460551
+ vertex 166.42331713084147 -77.15232799494576 600.7313708498986
+ endloop
+endfacet
+facet normal -0.11303899832179483 -0.06526309610997597 -0.991444861373816
+ outer loop
+ vertex 167.76174321682188 -76.37958733391439 601.1454813220626
+ vertex 17.40311302795538 183.22097856533415 601.2000000000002
+ vertex 17.761743216822598 183.4280338014162 601.1454813220627
+ endloop
+endfacet
+facet normal -0.11303899832179483 -0.06526309610997597 -0.991444861373816
+ outer loop
+ vertex 17.40311302795538 183.22097856533415 601.2000000000002
+ vertex 167.76174321682188 -76.37958733391439 601.1454813220626
+ vertex 167.40311302795465 -76.58664256999641 601.2
+ endloop
+endfacet
+facet normal 0.8586164364012407 0.4957224306869376 0.13052619222006184
+ outer loop
+ vertex 16.01747238190026 182.42097856533417 599.6
+ vertex 166.06468694197423 -77.35938323102775 599.185889527836
+ vertex 16.06468694197487 182.44823790430297 599.1858895278361
+ endloop
+endfacet
+facet normal 0.8586164364012407 0.4957224306869376 0.13052619222006184
+ outer loop
+ vertex 166.06468694197423 -77.35938323102775 599.185889527836
+ vertex 16.01747238190026 182.42097856533417 599.6
+ vertex 166.01747238189964 -77.38664256999651 599.6
+ endloop
+endfacet
+facet normal -0.3314135740355637 -0.1913417161825047 -0.9238795325113052
+ outer loop
+ vertex 168.09593335098253 -76.1866425699969 616.5856406460551
+ vertex 17.76174321682286 183.42803380141572 616.7454813220626
+ vertex 18.095933350983213 183.62097856533373 616.5856406460553
+ endloop
+endfacet
+facet normal -0.3314135740355637 -0.1913417161825047 -0.9238795325113052
+ outer loop
+ vertex 17.76174321682286 183.42803380141572 616.7454813220626
+ vertex 168.09593335098253 -76.1866425699969 616.5856406460551
+ vertex 167.76174321682217 -76.37958733391493 616.7454813220626
+ endloop
+endfacet
+facet normal 0.6870641468694274 0.3966766701456533 -0.6087614290087231
+ outer loop
+ vertex 16.423317130842133 182.6552931403849 600.7313708498986
+ vertex 166.20311302795469 -77.27946289302402 600.4000000000001
+ vertex 16.20311302795538 182.52815824230663 600.4000000000002
+ endloop
+endfacet
+facet normal 0.6870641468694274 0.3966766701456533 -0.6087614290087231
+ outer loop
+ vertex 166.20311302795469 -77.27946289302402 600.4000000000001
+ vertex 16.423317130842133 182.6552931403849 600.7313708498986
+ vertex 166.42331713084147 -77.15232799494576 600.7313708498986
+ endloop
+endfacet
+facet normal 0.6870641468694383 0.39667667014565394 -0.6087614290087103
+ outer loop
+ vertex 16.42331713084241 182.65529314038446 616.3313708498986
+ vertex 166.203113027955 -77.27946289302443 616.0
+ vertex 16.20311302795568 182.52815824230615 616.0000000000001
+ endloop
+endfacet
+facet normal 0.6870641468694383 0.39667667014565394 -0.6087614290087103
+ outer loop
+ vertex 166.203113027955 -77.27946289302443 616.0
+ vertex 16.42331713084241 182.65529314038446 616.3313708498986
+ vertex 166.4233171308417 -77.15232799494622 616.3313708498985
+ endloop
+endfacet
+facet normal -0.8586164364012407 -0.4957224306869376 -0.13052619222006184
+ outer loop
+ vertex 168.78875367401002 -75.78664256999677 615.2
+ vertex 18.741539113936135 183.99371922636504 615.6141104721642
+ vertex 18.788753674010707 184.0209785653338 615.2000000000002
+ endloop
+endfacet
+facet normal -0.8586164364012407 -0.4957224306869376 -0.13052619222006184
+ outer loop
+ vertex 18.741539113936135 183.99371922636504 615.6141104721642
+ vertex 168.78875367401002 -75.78664256999677 615.2
+ vertex 168.7415391139354 -75.81390190896563 615.6141104721642
+ endloop
+endfacet
+facet normal 0.3314135740355858 0.19134171618259352 -0.9238795325112789
+ outer loop
+ vertex 167.0444828390878 -76.79369780607902 616.7454813220626
+ vertex 16.71029270492811 182.8209785653337 616.5856406460553
+ vertex 17.04448283908847 183.01392332925164 616.7454813220626
+ endloop
+endfacet
+facet normal 0.3314135740355858 0.19134171618259352 -0.9238795325112789
+ outer loop
+ vertex 16.71029270492811 182.8209785653337 616.5856406460553
+ vertex 167.0444828390878 -76.79369780607902 616.7454813220626
+ vertex 166.71029270492744 -76.98664256999696 616.5856406460551
+ endloop
+endfacet
+facet normal 0.800103145191235 0.4619397662556789 -0.38268343236511065
+ outer loop
+ vertex 16.20311302795568 182.52815824230615 616.0000000000001
+ vertex 166.06468694197446 -77.35938323102819 615.6141104721642
+ vertex 16.064686941975175 182.44823790430246 615.6141104721642
+ endloop
+endfacet
+facet normal 0.800103145191235 0.4619397662556789 -0.38268343236511065
+ outer loop
+ vertex 166.06468694197446 -77.35938323102819 615.6141104721642
+ vertex 16.20311302795568 182.52815824230615 616.0000000000001
+ vertex 166.203113027955 -77.27946289302443 616.0
+ endloop
+endfacet
+facet normal 0.3314135740355426 0.1913417161825714 -0.923879532511299
+ outer loop
+ vertex 167.04448283908746 -76.79369780607848 601.1454813220626
+ vertex 16.710292704927845 182.82097856533417 600.9856406460552
+ vertex 17.044482839088168 183.01392332925215 601.1454813220627
+ endloop
+endfacet
+facet normal 0.3314135740355426 0.1913417161825714 -0.923879532511299
+ outer loop
+ vertex 16.710292704927845 182.82097856533417 600.9856406460552
+ vertex 167.04448283908746 -76.79369780607848 601.1454813220626
+ vertex 166.71029270492716 -76.98664256999646 600.9856406460551
+ endloop
+endfacet
+facet normal -0.52720286236566 -0.3043807145043358 -0.7933533402912507
+ outer loop
+ vertex 168.38290892506797 -76.02095714504716 600.7313708498986
+ vertex 18.095933350982918 183.6209785653342 600.9856406460553
+ vertex 18.382908925068623 183.78666399028344 600.7313708498987
+ endloop
+endfacet
+facet normal -0.52720286236566 -0.3043807145043358 -0.7933533402912507
+ outer loop
+ vertex 18.095933350982918 183.6209785653342 600.9856406460553
+ vertex 168.38290892506797 -76.02095714504716 600.7313708498986
+ vertex 168.09593335098222 -76.18664256999647 600.9856406460551
+ endloop
+endfacet
+facet normal 0.8586164364012407 0.4957224306869376 0.13052619222006184
+ outer loop
+ vertex 16.01747238190058 182.4209785653337 615.2000000000002
+ vertex 166.0646869419745 -77.35938323102815 614.785889527836
+ vertex 16.064686941975182 182.4482379043025 614.785889527836
+ endloop
+endfacet
+facet normal 0.8586164364012407 0.4957224306869376 0.13052619222006184
+ outer loop
+ vertex 166.0646869419745 -77.35938323102815 614.785889527836
+ vertex 16.01747238190058 182.4209785653337 615.2000000000002
+ vertex 166.01747238189986 -77.38664256999687 615.2
+ endloop
+endfacet
+facet normal -0.5272028623656636 -0.3043807145043491 -0.7933533402912432
+ outer loop
+ vertex 168.38290892506828 -76.0209571450477 616.3313708498986
+ vertex 18.095933350983213 183.62097856533373 616.5856406460553
+ vertex 18.38290892506893 183.78666399028296 616.3313708498987
+ endloop
+endfacet
+facet normal -0.5272028623656636 -0.3043807145043491 -0.7933533402912432
+ outer loop
+ vertex 18.095933350983213 183.62097856533373 616.5856406460553
+ vertex 168.38290892506828 -76.0209571450477 616.3313708498986
+ vertex 168.09593335098253 -76.1866425699969 616.5856406460551
+ endloop
+endfacet
+facet normal -0.8001031451912619 -0.4619397662556719 -0.38268343236506275
+ outer loop
+ vertex 168.7415391139354 -75.81390190896563 615.6141104721642
+ vertex 18.60311302795565 183.91379888836133 616.0000000000001
+ vertex 18.741539113936135 183.99371922636504 615.6141104721642
+ endloop
+endfacet
+facet normal -0.8001031451912619 -0.4619397662556719 -0.38268343236506275
+ outer loop
+ vertex 18.60311302795565 183.91379888836133 616.0000000000001
+ vertex 168.7415391139354 -75.81390190896563 615.6141104721642
+ vertex 168.60311302795498 -75.89382224696925 616.0
+ endloop
+endfacet
+facet normal -0.8586164364012476 -0.49572243068693034 0.13052619222004344
+ outer loop
+ vertex 18.741539113935833 183.99371922636553 599.1858895278361
+ vertex 168.7887536740098 -75.78664256999642 599.6
+ vertex 18.788753674010444 184.0209785653343 599.6000000000001
+ endloop
+endfacet
+facet normal -0.8586164364012476 -0.49572243068693034 0.13052619222004344
+ outer loop
+ vertex 168.7887536740098 -75.78664256999642 599.6
+ vertex 18.741539113935833 183.99371922636553 599.1858895278361
+ vertex 168.7415391139352 -75.81390190896514 599.185889527836
+ endloop
+endfacet
+facet normal -0.8001031451912495 -0.4619397662556647 -0.3826834323650973
+ outer loop
+ vertex 168.7415391139352 -75.81390190896518 600.0141104721641
+ vertex 18.60311302795535 183.91379888836178 600.4000000000002
+ vertex 18.74153911393583 183.99371922636553 600.0141104721642
+ endloop
+endfacet
+facet normal -0.8001031451912495 -0.4619397662556647 -0.3826834323650973
+ outer loop
+ vertex 18.60311302795535 183.91379888836178 600.4000000000002
+ vertex 168.7415391139352 -75.81390190896518 600.0141104721641
+ vertex 168.60311302795472 -75.8938222469689 600.4000000000001
+ endloop
+endfacet
+facet normal 0.8001031451912451 0.4619397662556961 -0.3826834323650685
+ outer loop
+ vertex 16.20311302795538 182.52815824230663 600.4000000000002
+ vertex 166.06468694197423 -77.35938323102775 600.014110472164
+ vertex 16.064686941974863 182.44823790430294 600.0141104721641
+ endloop
+endfacet
+facet normal 0.8001031451912451 0.4619397662556961 -0.3826834323650685
+ outer loop
+ vertex 166.06468694197423 -77.35938323102775 600.014110472164
+ vertex 16.20311302795538 182.52815824230663 600.4000000000002
+ vertex 166.20311302795469 -77.27946289302402 600.4000000000001
+ endloop
+endfacet
+facet normal -0.11303899832184175 -0.06526309611000446 -0.9914448613738089
+ outer loop
+ vertex 167.76174321682217 -76.37958733391493 616.7454813220626
+ vertex 17.403113027955662 183.22097856533372 616.8000000000002
+ vertex 17.76174321682286 183.42803380141572 616.7454813220626
+ endloop
+endfacet
+facet normal -0.11303899832184175 -0.06526309611000446 -0.9914448613738089
+ outer loop
+ vertex 17.403113027955662 183.22097856533372 616.8000000000002
+ vertex 167.76174321682217 -76.37958733391493 616.7454813220626
+ vertex 167.40311302795496 -76.58664256999695 616.8000000000001
+ endloop
+endfacet
+facet normal 0.11303899832180415 0.06526309611006587 -0.9914448613738092
+ outer loop
+ vertex 167.40311302795496 -76.58664256999695 616.8000000000001
+ vertex 17.04448283908847 183.01392332925164 616.7454813220626
+ vertex 17.403113027955662 183.22097856533372 616.8000000000002
+ endloop
+endfacet
+facet normal 0.11303899832180415 0.06526309611006587 -0.9914448613738092
+ outer loop
+ vertex 17.04448283908847 183.01392332925164 616.7454813220626
+ vertex 167.40311302795496 -76.58664256999695 616.8000000000001
+ vertex 167.0444828390878 -76.79369780607902 616.7454813220626
+ endloop
+endfacet
+facet normal -0.8001031451912454 -0.4619397662556849 0.3826834323650818
+ outer loop
+ vertex 168.60311302795463 -75.89382224696875 598.8000000000001
+ vertex 18.741539113935833 183.99371922636553 599.1858895278361
+ vertex 18.60311302795533 183.91379888836184 598.8000000000002
+ endloop
+endfacet
+facet normal -0.8001031451912454 -0.4619397662556849 0.3826834323650818
+ outer loop
+ vertex 18.741539113935833 183.99371922636553 599.1858895278361
+ vertex 168.60311302795463 -75.89382224696875 598.8000000000001
+ vertex 168.7415391139352 -75.81390190896514 599.185889527836
+ endloop
+endfacet
+facet normal -0.5272028623656569 -0.3043807145044129 0.7933533402912233
+ outer loop
+ vertex 18.09593335098285 183.62097856533433 598.214359353945
+ vertex 168.38290892506788 -76.0209571450471 598.4686291501016
+ vertex 18.3829089250686 183.78666399028353 598.4686291501016
+ endloop
+endfacet
+facet normal -0.5272028623656569 -0.3043807145044129 0.7933533402912233
+ outer loop
+ vertex 168.38290892506788 -76.0209571450471 598.4686291501016
+ vertex 18.09593335098285 183.62097856533433 598.214359353945
+ vertex 168.0959333509822 -76.18664256999637 598.2143593539449
+ endloop
+endfacet
+facet normal 0.5272028623656624 0.30438071450441606 -0.7933533402912182
+ outer loop
+ vertex 166.71029270492744 -76.98664256999696 616.5856406460551
+ vertex 16.42331713084241 182.65529314038446 616.3313708498986
+ vertex 16.71029270492811 182.8209785653337 616.5856406460553
+ endloop
+endfacet
+facet normal 0.5272028623656624 0.30438071450441606 -0.7933533402912182
+ outer loop
+ vertex 16.42331713084241 182.65529314038446 616.3313708498986
+ vertex 166.71029270492744 -76.98664256999696 616.5856406460551
+ vertex 166.4233171308417 -77.15232799494622 616.3313708498985
+ endloop
+endfacet
+facet normal 0.8001031451912495 0.4619397662556647 0.3826834323650973
+ outer loop
+ vertex 166.06468694197423 -77.35938323102775 599.185889527836
+ vertex 16.203113027955354 182.52815824230666 598.8000000000001
+ vertex 16.06468694197487 182.44823790430297 599.1858895278361
+ endloop
+endfacet
+facet normal 0.8001031451912495 0.4619397662556647 0.3826834323650973
+ outer loop
+ vertex 16.203113027955354 182.52815824230666 598.8000000000001
+ vertex 166.06468694197423 -77.35938323102775 599.185889527836
+ vertex 166.20311302795469 -77.27946289302398 598.8
+ endloop
+endfacet
+facet normal 0.8001031451912619 0.4619397662556719 0.38268343236506275
+ outer loop
+ vertex 166.0646869419745 -77.35938323102815 614.785889527836
+ vertex 16.203113027955656 182.5281582423062 614.4000000000001
+ vertex 16.064686941975182 182.4482379043025 614.785889527836
+ endloop
+endfacet
+facet normal 0.8001031451912619 0.4619397662556719 0.38268343236506275
+ outer loop
+ vertex 16.203113027955656 182.5281582423062 614.4000000000001
+ vertex 166.0646869419745 -77.35938323102815 614.785889527836
+ vertex 166.20311302795494 -77.27946289302439 614.4000000000001
+ endloop
+endfacet
+facet normal -0.6870641468694512 -0.39667667014562186 -0.6087614290087167
+ outer loop
+ vertex 168.60311302795498 -75.89382224696925 616.0
+ vertex 18.38290892506893 183.78666399028296 616.3313708498987
+ vertex 18.60311302795565 183.91379888836133 616.0000000000001
+ endloop
+endfacet
+facet normal -0.6870641468694512 -0.39667667014562186 -0.6087614290087167
+ outer loop
+ vertex 18.38290892506893 183.78666399028296 616.3313708498987
+ vertex 168.60311302795498 -75.89382224696925 616.0
+ vertex 168.38290892506828 -76.0209571450477 616.3313708498986
+ endloop
+endfacet
+facet normal -0.6870641468694395 -0.3966766701456151 -0.6087614290087343
+ outer loop
+ vertex 168.60311302795472 -75.8938222469689 600.4000000000001
+ vertex 18.382908925068623 183.78666399028344 600.7313708498987
+ vertex 18.60311302795535 183.91379888836178 600.4000000000002
+ endloop
+endfacet
+facet normal -0.6870641468694395 -0.3966766701456151 -0.6087614290087343
+ outer loop
+ vertex 18.382908925068623 183.78666399028344 600.7313708498987
+ vertex 168.60311302795472 -75.8938222469689 600.4000000000001
+ vertex 168.38290892506797 -76.02095714504716 600.7313708498986
+ endloop
+endfacet
+facet normal -0.8586164364012407 -0.4957224306869376 -0.13052619222006184
+ outer loop
+ vertex 32.29874997304777 191.8209785653342 615.2000000000002
+ vertex 182.2515354129725 -68.01390190896524 615.6141104721642
+ vertex 32.251535412973155 191.79371922636543 615.6141104721642
+ endloop
+endfacet
+facet normal -0.8586164364012407 -0.4957224306869376 -0.13052619222006184
+ outer loop
+ vertex 182.2515354129725 -68.01390190896524 615.6141104721642
+ vertex 32.29874997304777 191.8209785653342 615.2000000000002
+ vertex 182.29874997304705 -67.98664256999643 615.2
+ endloop
+endfacet
+facet normal 0.5272028623656569 0.3043807145044129 -0.7933533402912233
+ outer loop
+ vertex 180.22028900396444 -69.18664256999656 616.5856406460551
+ vertex 29.93331342987943 190.4552931403848 616.3313708498987
+ vertex 30.220289003965142 190.62097856533407 616.5856406460553
+ endloop
+endfacet
+facet normal 0.5272028623656569 0.3043807145044129 -0.7933533402912233
+ outer loop
+ vertex 29.93331342987943 190.4552931403848 616.3313708498987
+ vertex 180.22028900396444 -69.18664256999656 616.5856406460551
+ vertex 179.93331342987875 -69.35232799494582 616.3313708498986
+ endloop
+endfacet
+facet normal -0.3314135740355858 -0.19134171618259352 0.9238795325112789
+ outer loop
+ vertex 17.761743216822868 183.42803380141584 613.6545186779376
+ vertex 168.09593335098253 -76.18664256999686 613.814359353945
+ vertex 18.095933350983174 183.62097856533384 613.814359353945
+ endloop
+endfacet
+facet normal -0.3314135740355858 -0.19134171618259352 0.9238795325112789
+ outer loop
+ vertex 168.09593335098253 -76.18664256999686 613.814359353945
+ vertex 17.761743216822868 183.42803380141584 613.6545186779376
+ vertex 167.76174321682214 -76.37958733391474 613.6545186779375
+ endloop
+endfacet
+facet normal 0.5272028623656525 0.3043807145043483 0.793353340291251
+ outer loop
+ vertex 29.9333134298794 190.45529314038492 614.0686291501016
+ vertex 180.2202890039644 -69.18664256999648 613.814359353945
+ vertex 30.22028900396512 190.62097856533418 613.814359353945
+ endloop
+endfacet
+facet normal 0.5272028623656525 0.3043807145043483 0.793353340291251
+ outer loop
+ vertex 180.2202890039644 -69.18664256999648 613.814359353945
+ vertex 29.9333134298794 190.45529314038492 614.0686291501016
+ vertex 179.93331342987872 -69.35232799494572 614.0686291501015
+ endloop
+endfacet
+facet normal 0.527202862365693 0.3043807145043661 0.7933533402912171
+ outer loop
+ vertex 16.423317130842396 182.6552931403845 614.0686291501016
+ vertex 166.71029270492738 -76.98664256999686 613.814359353945
+ vertex 16.710292704928097 182.8209785653338 613.814359353945
+ endloop
+endfacet
+facet normal 0.527202862365693 0.3043807145043661 0.7933533402912171
+ outer loop
+ vertex 166.71029270492738 -76.98664256999686 613.814359353945
+ vertex 16.423317130842396 182.6552931403845 614.0686291501016
+ vertex 166.42331713084167 -77.15232799494612 614.0686291501015
+ endloop
+endfacet
+facet normal -0.6870641468694383 -0.39667667014565394 0.6087614290087103
+ outer loop
+ vertex 168.3829089250682 -76.02095714504752 614.0686291501016
+ vertex 18.603113027955626 183.91379888836136 614.4000000000001
+ vertex 18.382908925068907 183.78666399028305 614.0686291501017
+ endloop
+endfacet
+facet normal -0.6870641468694383 -0.39667667014565394 0.6087614290087103
+ outer loop
+ vertex 18.603113027955626 183.91379888836136 614.4000000000001
+ vertex 168.3829089250682 -76.02095714504752 614.0686291501016
+ vertex 168.60311302795495 -75.89382224696925 614.4000000000001
+ endloop
+endfacet
+facet normal -0.33141357403561683 -0.19134171618253823 -0.9238795325112792
+ outer loop
+ vertex 181.60592965001953 -68.38664256999647 616.5856406460551
+ vertex 31.27173951585992 191.2280338014161 616.7454813220627
+ vertex 31.60592965002024 191.4209785653341 616.5856406460553
+ endloop
+endfacet
+facet normal -0.33141357403561683 -0.19134171618253823 -0.9238795325112792
+ outer loop
+ vertex 31.27173951585992 191.2280338014161 616.7454813220627
+ vertex 181.60592965001953 -68.38664256999647 616.5856406460551
+ vertex 181.27173951585922 -68.57958733391453 616.7454813220626
+ endloop
+endfacet
+facet normal -0.6870641468694395 -0.3966766701456151 -0.6087614290087343
+ outer loop
+ vertex 182.11310932699195 -68.09382224696891 616.0
+ vertex 31.892905224105952 191.58666399028337 616.3313708498987
+ vertex 32.113109326992664 191.7137988883617 616.0000000000001
+ endloop
+endfacet
+facet normal -0.6870641468694395 -0.3966766701456151 -0.6087614290087343
+ outer loop
+ vertex 31.892905224105952 191.58666399028337 616.3313708498987
+ vertex 182.11310932699195 -68.09382224696891 616.0
+ vertex 181.8929052241053 -68.22095714504731 616.3313708498986
+ endloop
+endfacet
+facet normal 0.3314135740355447 0.19134171618257262 -0.923879532511298
+ outer loop
+ vertex 180.55447913812478 -68.99369780607854 616.7454813220626
+ vertex 30.220289003965142 190.62097856533407 616.5856406460553
+ vertex 30.554479138125483 190.81392332925202 616.7454813220626
+ endloop
+endfacet
+facet normal 0.3314135740355447 0.19134171618257262 -0.923879532511298
+ outer loop
+ vertex 30.220289003965142 190.62097856533407 616.5856406460553
+ vertex 180.55447913812478 -68.99369780607854 616.7454813220626
+ vertex 180.22028900396444 -69.18664256999656 616.5856406460551
+ endloop
+endfacet
+facet normal 0.11303899832183627 0.06526309610999989 0.9914448613738097
+ outer loop
+ vertex 17.044482839088413 183.01392332925178 613.6545186779376
+ vertex 167.40311302795504 -76.58664256999687 613.6
+ vertex 17.403113027955648 183.2209785653338 613.6000000000001
+ endloop
+endfacet
+facet normal 0.11303899832183627 0.06526309610999989 0.9914448613738097
+ outer loop
+ vertex 167.40311302795504 -76.58664256999687 613.6
+ vertex 17.044482839088413 183.01392332925178 613.6545186779376
+ vertex 167.04448283908772 -76.7936978060789 613.6545186779375
+ endloop
+endfacet
+facet normal 0.6870641468694274 0.3966766701456533 -0.6087614290087231
+ outer loop
+ vertex 29.93331342987943 190.4552931403848 616.3313708498987
+ vertex 179.713109326992 -69.47946289302403 616.0
+ vertex 29.713109326992683 190.32815824230653 616.0000000000001
+ endloop
+endfacet
+facet normal 0.6870641468694274 0.3966766701456533 -0.6087614290087231
+ outer loop
+ vertex 179.713109326992 -69.47946289302403 616.0
+ vertex 29.93331342987943 190.4552931403848 616.3313708498987
+ vertex 179.93331342987875 -69.35232799494582 616.3313708498986
+ endloop
+endfacet
+facet normal 0.8001031451912454 0.4619397662556849 -0.3826834323650818
+ outer loop
+ vertex 29.713109326992683 190.32815824230653 616.0000000000001
+ vertex 179.57468324101148 -69.55938323102781 615.6141104721642
+ vertex 29.574683241012213 190.24823790430284 615.6141104721642
+ endloop
+endfacet
+facet normal 0.8001031451912454 0.4619397662556849 -0.3826834323650818
+ outer loop
+ vertex 179.57468324101148 -69.55938323102781 615.6141104721642
+ vertex 29.713109326992683 190.32815824230653 616.0000000000001
+ vertex 179.713109326992 -69.47946289302403 616.0
+ endloop
+endfacet
+facet normal 0.8586164364012476 0.49572243068693034 -0.13052619222004344
+ outer loop
+ vertex 179.57468324101148 -69.55938323102781 615.6141104721642
+ vertex 29.527468680937567 190.2209785653341 615.2000000000002
+ vertex 29.574683241012213 190.24823790430284 615.6141104721642
+ endloop
+endfacet
+facet normal 0.8586164364012476 0.49572243068693034 -0.13052619222004344
+ outer loop
+ vertex 29.527468680937567 190.2209785653341 615.2000000000002
+ vertex 179.57468324101148 -69.55938323102781 615.6141104721642
+ vertex 179.52746868093686 -69.58664256999651 615.2
+ endloop
+endfacet
+facet normal 0.6870641468694338 0.39667667014561186 0.6087614290087427
+ outer loop
+ vertex 166.20311302795494 -77.27946289302439 614.4000000000001
+ vertex 16.423317130842396 182.6552931403845 614.0686291501016
+ vertex 16.203113027955656 182.5281582423062 614.4000000000001
+ endloop
+endfacet
+facet normal 0.6870641468694338 0.39667667014561186 0.6087614290087427
+ outer loop
+ vertex 16.423317130842396 182.6552931403845 614.0686291501016
+ vertex 166.20311302795494 -77.27946289302439 614.4000000000001
+ vertex 166.42331713084167 -77.15232799494612 614.0686291501015
+ endloop
+endfacet
+facet normal -0.8586164364012514 -0.4957224306869325 0.13052619222001063
+ outer loop
+ vertex 168.7415391139355 -75.81390190896563 614.785889527836
+ vertex 18.788753674010707 184.0209785653338 615.2000000000002
+ vertex 18.741539113936128 183.99371922636507 614.785889527836
+ endloop
+endfacet
+facet normal -0.8586164364012514 -0.4957224306869325 0.13052619222001063
+ outer loop
+ vertex 18.788753674010707 184.0209785653338 615.2000000000002
+ vertex 168.7415391139355 -75.81390190896563 614.785889527836
+ vertex 168.78875367401002 -75.78664256999677 615.2
+ endloop
+endfacet
+facet normal -0.3314135740355426 -0.1913417161825714 0.923879532511299
+ outer loop
+ vertex 31.27173951585987 191.22803380141625 613.6545186779376
+ vertex 181.60592965001956 -68.38664256999643 613.814359353945
+ vertex 31.605929650020194 191.42097856533422 613.814359353945
+ endloop
+endfacet
+facet normal -0.3314135740355426 -0.1913417161825714 0.923879532511299
+ outer loop
+ vertex 181.60592965001956 -68.38664256999643 613.814359353945
+ vertex 31.27173951585987 191.22803380141625 613.6545186779376
+ vertex 181.2717395158592 -68.5795873339144 613.6545186779375
+ endloop
+endfacet
+facet normal -0.6870641468694274 -0.3966766701456533 0.6087614290087231
+ outer loop
+ vertex 181.8929052241052 -68.22095714504717 614.0686291501016
+ vertex 32.113109326992664 191.71379888836177 614.4000000000001
+ vertex 31.89290522410592 191.58666399028345 614.0686291501017
+ endloop
+endfacet
+facet normal -0.6870641468694274 -0.3966766701456533 0.6087614290087231
+ outer loop
+ vertex 32.113109326992664 191.71379888836177 614.4000000000001
+ vertex 181.8929052241052 -68.22095714504717 614.0686291501016
+ vertex 182.11310932699195 -68.09382224696891 614.4000000000001
+ endloop
+endfacet
+facet normal 0.11303899832180275 0.06526309611006646 -0.9914448613738092
+ outer loop
+ vertex 180.91310932699201 -68.78664256999652 616.8000000000001
+ vertex 30.554479138125483 190.81392332925202 616.7454813220626
+ vertex 30.913109326992686 191.0209785653341 616.8000000000002
+ endloop
+endfacet
+facet normal 0.11303899832180275 0.06526309611006646 -0.9914448613738092
+ outer loop
+ vertex 30.554479138125483 190.81392332925202 616.7454813220626
+ vertex 180.91310932699201 -68.78664256999652 616.8000000000001
+ vertex 180.55447913812478 -68.99369780607854 616.7454813220626
+ endloop
+endfacet
+facet normal 0.6870641468694395 0.3966766701456151 0.6087614290087343
+ outer loop
+ vertex 179.713109326992 -69.47946289302408 614.4000000000001
+ vertex 29.9333134298794 190.45529314038492 614.0686291501016
+ vertex 29.713109326992694 190.32815824230659 614.4000000000001
+ endloop
+endfacet
+facet normal 0.6870641468694395 0.3966766701456151 0.6087614290087343
+ outer loop
+ vertex 29.9333134298794 190.45529314038492 614.0686291501016
+ vertex 179.713109326992 -69.47946289302408 614.4000000000001
+ vertex 179.93331342987872 -69.35232799494572 614.0686291501015
+ endloop
+endfacet
+facet normal -0.5272028623656548 -0.30438071450442294 0.7933533402912207
+ outer loop
+ vertex 31.605929650020194 191.42097856533422 613.814359353945
+ vertex 181.8929052241052 -68.22095714504717 614.0686291501016
+ vertex 31.89290522410592 191.58666399028345 614.0686291501017
+ endloop
+endfacet
+facet normal -0.5272028623656548 -0.30438071450442294 0.7933533402912207
+ outer loop
+ vertex 181.8929052241052 -68.22095714504717 614.0686291501016
+ vertex 31.605929650020194 191.42097856533422 613.814359353945
+ vertex 181.60592965001956 -68.38664256999643 613.814359353945
+ endloop
+endfacet
+facet normal 0.33141357403558147 0.19134171618251217 0.9238795325112973
+ outer loop
+ vertex 16.710292704928097 182.8209785653338 613.814359353945
+ vertex 167.04448283908772 -76.7936978060789 613.6545186779375
+ vertex 17.044482839088413 183.01392332925178 613.6545186779376
+ endloop
+endfacet
+facet normal 0.33141357403558147 0.19134171618251217 0.9238795325112973
+ outer loop
+ vertex 167.04448283908772 -76.7936978060789 613.6545186779375
+ vertex 16.710292704928097 182.8209785653338 613.814359353945
+ vertex 166.71029270492738 -76.98664256999686 613.814359353945
+ endloop
+endfacet
+facet normal -0.5272028623656624 -0.30438071450441606 0.7933533402912182
+ outer loop
+ vertex 18.095933350983174 183.62097856533384 613.814359353945
+ vertex 168.3829089250682 -76.02095714504752 614.0686291501016
+ vertex 18.382908925068907 183.78666399028305 614.0686291501017
+ endloop
+endfacet
+facet normal -0.5272028623656624 -0.30438071450441606 0.7933533402912182
+ outer loop
+ vertex 168.3829089250682 -76.02095714504752 614.0686291501016
+ vertex 18.095933350983174 183.62097856533384 613.814359353945
+ vertex 168.09593335098253 -76.18664256999686 613.814359353945
+ endloop
+endfacet
+facet normal -0.8001031451912495 -0.4619397662556647 -0.3826834323650973
+ outer loop
+ vertex 182.2515354129725 -68.01390190896524 615.6141104721642
+ vertex 32.113109326992664 191.7137988883617 616.0000000000001
+ vertex 32.251535412973155 191.79371922636543 615.6141104721642
+ endloop
+endfacet
+facet normal -0.8001031451912495 -0.4619397662556647 -0.3826834323650973
+ outer loop
+ vertex 32.113109326992664 191.7137988883617 616.0000000000001
+ vertex 182.2515354129725 -68.01390190896524 615.6141104721642
+ vertex 182.11310932699195 -68.09382224696891 616.0
+ endloop
+endfacet
+facet normal 0.8586164364012407 0.4957224306869376 0.13052619222006184
+ outer loop
+ vertex 179.52746868093686 -69.58664256999651 615.2
+ vertex 29.574683241012185 190.24823790430284 614.785889527836
+ vertex 29.527468680937567 190.2209785653341 615.2000000000002
+ endloop
+endfacet
+facet normal 0.8586164364012407 0.4957224306869376 0.13052619222006184
+ outer loop
+ vertex 29.574683241012185 190.24823790430284 614.785889527836
+ vertex 179.52746868093686 -69.58664256999651 615.2
+ vertex 179.5746832410115 -69.55938323102781 614.785889527836
+ endloop
+endfacet
+facet normal -0.52720286236566 -0.3043807145043358 -0.7933533402912507
+ outer loop
+ vertex 181.8929052241053 -68.22095714504731 616.3313708498986
+ vertex 31.60592965002024 191.4209785653341 616.5856406460553
+ vertex 31.892905224105952 191.58666399028337 616.3313708498987
+ endloop
+endfacet
+facet normal -0.52720286236566 -0.3043807145043358 -0.7933533402912507
+ outer loop
+ vertex 31.60592965002024 191.4209785653341 616.5856406460553
+ vertex 181.8929052241053 -68.22095714504731 616.3313708498986
+ vertex 181.60592965001953 -68.38664256999647 616.5856406460551
+ endloop
+endfacet
+facet normal -0.11303899832180415 -0.06526309611006587 0.9914448613738092
+ outer loop
+ vertex 30.913109326992664 191.0209785653342 613.6000000000001
+ vertex 181.2717395158592 -68.5795873339144 613.6545186779375
+ vertex 31.27173951585987 191.22803380141625 613.6545186779376
+ endloop
+endfacet
+facet normal -0.11303899832180415 -0.06526309611006587 0.9914448613738092
+ outer loop
+ vertex 181.2717395158592 -68.5795873339144 613.6545186779375
+ vertex 30.913109326992664 191.0209785653342 613.6000000000001
+ vertex 180.913109326992 -68.78664256999643 613.6
+ endloop
+endfacet
+facet normal -0.8586164364012479 -0.49572243068693045 0.130526192220043
+ outer loop
+ vertex 182.25153541297243 -68.0139019089652 614.785889527836
+ vertex 32.29874997304777 191.8209785653342 615.2000000000002
+ vertex 32.25153541297315 191.79371922636545 614.7858895278362
+ endloop
+endfacet
+facet normal -0.8586164364012479 -0.49572243068693045 0.130526192220043
+ outer loop
+ vertex 32.29874997304777 191.8209785653342 615.2000000000002
+ vertex 182.25153541297243 -68.0139019089652 614.785889527836
+ vertex 182.29874997304705 -67.98664256999643 615.2
+ endloop
+endfacet
+facet normal -0.800103145191235 -0.4619397662556789 0.38268343236511065
+ outer loop
+ vertex 18.603113027955626 183.91379888836136 614.4000000000001
+ vertex 168.7415391139355 -75.81390190896563 614.785889527836
+ vertex 18.741539113936128 183.99371922636507 614.785889527836
+ endloop
+endfacet
+facet normal -0.800103145191235 -0.4619397662556789 0.38268343236511065
+ outer loop
+ vertex 168.7415391139355 -75.81390190896563 614.785889527836
+ vertex 18.603113027955626 183.91379888836136 614.4000000000001
+ vertex 168.60311302795495 -75.89382224696925 614.4000000000001
+ endloop
+endfacet
+facet normal -0.11303899832179497 -0.06526309610997745 -0.9914448613738159
+ outer loop
+ vertex 181.27173951585922 -68.57958733391453 616.7454813220626
+ vertex 30.913109326992686 191.0209785653341 616.8000000000002
+ vertex 31.27173951585992 191.2280338014161 616.7454813220627
+ endloop
+endfacet
+facet normal -0.11303899832179497 -0.06526309610997745 -0.9914448613738159
+ outer loop
+ vertex 30.913109326992686 191.0209785653341 616.8000000000002
+ vertex 181.27173951585922 -68.57958733391453 616.7454813220626
+ vertex 180.91310932699201 -68.78664256999652 616.8000000000001
+ endloop
+endfacet
+facet normal -0.8001031451912451 -0.4619397662556961 0.3826834323650685
+ outer loop
+ vertex 182.11310932699195 -68.09382224696891 614.4000000000001
+ vertex 32.25153541297315 191.79371922636545 614.7858895278362
+ vertex 32.113109326992664 191.71379888836177 614.4000000000001
+ endloop
+endfacet
+facet normal -0.8001031451912451 -0.4619397662556961 0.3826834323650685
+ outer loop
+ vertex 32.25153541297315 191.79371922636545 614.7858895278362
+ vertex 182.11310932699195 -68.09382224696891 614.4000000000001
+ vertex 182.25153541297243 -68.0139019089652 614.785889527836
+ endloop
+endfacet
+facet normal 0.8001031451912495 0.4619397662556647 0.3826834323650973
+ outer loop
+ vertex 179.5746832410115 -69.55938323102781 614.785889527836
+ vertex 29.713109326992694 190.32815824230659 614.4000000000001
+ vertex 29.574683241012185 190.24823790430284 614.785889527836
+ endloop
+endfacet
+facet normal 0.8001031451912495 0.4619397662556647 0.3826834323650973
+ outer loop
+ vertex 29.713109326992694 190.32815824230659 614.4000000000001
+ vertex 179.5746832410115 -69.55938323102781 614.785889527836
+ vertex 179.713109326992 -69.47946289302408 614.4000000000001
+ endloop
+endfacet
+facet normal -0.11303899832180415 -0.06526309611006587 0.9914448613738092
+ outer loop
+ vertex 17.403113027955648 183.2209785653338 613.6000000000001
+ vertex 167.76174321682214 -76.37958733391474 613.6545186779375
+ vertex 17.761743216822868 183.42803380141584 613.6545186779376
+ endloop
+endfacet
+facet normal -0.11303899832180415 -0.06526309611006587 0.9914448613738092
+ outer loop
+ vertex 167.76174321682214 -76.37958733391474 613.6545186779375
+ vertex 17.403113027955648 183.2209785653338 613.6000000000001
+ vertex 167.40311302795504 -76.58664256999687 613.6
+ endloop
+endfacet
+facet normal 0.800103145191235 0.4619397662556789 -0.38268343236511065
+ outer loop
+ vertex 179.71310932699174 -69.47946289302364 600.4000000000001
+ vertex 29.57468324101192 190.24823790430332 600.0141104721642
+ vertex 29.713109326992434 190.32815824230704 600.4000000000002
+ endloop
+endfacet
+facet normal 0.800103145191235 0.4619397662556789 -0.38268343236511065
+ outer loop
+ vertex 29.57468324101192 190.24823790430332 600.0141104721642
+ vertex 179.71310932699174 -69.47946289302364 600.4000000000001
+ vertex 179.57468324101123 -69.55938323102735 600.0141104721641
+ endloop
+endfacet
+facet normal 0.8586164364012514 0.4957224306869325 -0.13052619222001063
+ outer loop
+ vertex 179.57468324101123 -69.55938323102735 600.0141104721641
+ vertex 29.527468680937297 190.22097856533458 599.6000000000001
+ vertex 29.57468324101192 190.24823790430332 600.0141104721642
+ endloop
+endfacet
+facet normal 0.8586164364012514 0.4957224306869325 -0.13052619222001063
+ outer loop
+ vertex 29.527468680937297 190.22097856533458 599.6000000000001
+ vertex 179.57468324101123 -69.55938323102735 600.0141104721641
+ vertex 179.5274686809366 -69.58664256999607 599.6
+ endloop
+endfacet
+facet normal 0.8001031451912619 0.4619397662556719 0.38268343236506275
+ outer loop
+ vertex 179.57468324101123 -69.55938323102731 599.185889527836
+ vertex 29.713109326992388 190.32815824230707 598.8000000000002
+ vertex 29.57468324101191 190.24823790430335 599.1858895278361
+ endloop
+endfacet
+facet normal 0.8001031451912619 0.4619397662556719 0.38268343236506275
+ outer loop
+ vertex 29.713109326992388 190.32815824230707 598.8000000000002
+ vertex 179.57468324101123 -69.55938323102731 599.185889527836
+ vertex 179.71310932699174 -69.4794628930236 598.8000000000001
+ endloop
+endfacet
+facet normal 0.8586164364012407 0.4957224306869376 0.13052619222006184
+ outer loop
+ vertex 179.5274686809366 -69.58664256999607 599.6
+ vertex 29.57468324101191 190.24823790430335 599.1858895278361
+ vertex 29.527468680937297 190.22097856533458 599.6000000000001
+ endloop
+endfacet
+facet normal 0.8586164364012407 0.4957224306869376 0.13052619222006184
+ outer loop
+ vertex 29.57468324101191 190.24823790430335 599.1858895278361
+ vertex 179.5274686809366 -69.58664256999607 599.6
+ vertex 179.57468324101123 -69.55938323102731 599.185889527836
+ endloop
+endfacet
+facet normal 0.11303899832179483 0.06526309610997597 0.991444861373816
+ outer loop
+ vertex 30.554479138125426 190.81392332925216 613.6545186779376
+ vertex 180.913109326992 -68.78664256999643 613.6
+ vertex 30.913109326992664 191.0209785653342 613.6000000000001
+ endloop
+endfacet
+facet normal 0.11303899832179483 0.06526309610997597 0.991444861373816
+ outer loop
+ vertex 180.913109326992 -68.78664256999643 613.6
+ vertex 30.554479138125426 190.81392332925216 613.6545186779376
+ vertex 180.5544791381248 -68.9936978060785 613.6545186779375
+ endloop
+endfacet
+facet normal 0.11303899832184175 0.06526309611000446 0.9914448613738089
+ outer loop
+ vertex 30.554479138125195 190.81392332925265 598.0545186779377
+ vertex 180.91310932699176 -68.78664256999598 598.0000000000001
+ vertex 30.91310932699238 191.0209785653347 598.0000000000001
+ endloop
+endfacet
+facet normal 0.11303899832184175 0.06526309611000446 0.9914448613738089
+ outer loop
+ vertex 180.91310932699176 -68.78664256999598 598.0000000000001
+ vertex 30.554479138125195 190.81392332925265 598.0545186779377
+ vertex 180.5544791381245 -68.993697806078 598.0545186779376
+ endloop
+endfacet
+facet normal -0.8586164364012515 -0.49572243068693256 0.1305261922200104
+ outer loop
+ vertex 182.25153541297217 -68.0139019089647 599.185889527836
+ vertex 32.298749973047464 191.82097856533466 599.6000000000001
+ vertex 32.251535412972856 191.79371922636597 599.1858895278361
+ endloop
+endfacet
+facet normal -0.8586164364012515 -0.49572243068693256 0.1305261922200104
+ outer loop
+ vertex 32.298749973047464 191.82097856533466 599.6000000000001
+ vertex 182.25153541297217 -68.0139019089647 599.185889527836
+ vertex 182.29874997304677 -67.98664256999594 599.6
+ endloop
+endfacet
+facet normal -0.6870641468694361 -0.3966766701456075 -0.608761429008743
+ outer loop
+ vertex 182.1131093269917 -68.09382224696841 600.4000000000001
+ vertex 31.89290522410566 191.58666399028382 600.7313708498987
+ vertex 32.11310932699237 191.71379888836222 600.4000000000002
+ endloop
+endfacet
+facet normal -0.6870641468694361 -0.3966766701456075 -0.608761429008743
+ outer loop
+ vertex 31.89290522410566 191.58666399028382 600.7313708498987
+ vertex 182.1131093269917 -68.09382224696841 600.4000000000001
+ vertex 181.89290522410496 -68.22095714504681 600.7313708498986
+ endloop
+endfacet
+facet normal 0.3314135740355637 0.1913417161825047 0.9238795325113052
+ outer loop
+ vertex 30.220289003964815 190.62097856533464 598.214359353945
+ vertex 180.5544791381245 -68.993697806078 598.0545186779376
+ vertex 30.554479138125195 190.81392332925265 598.0545186779377
+ endloop
+endfacet
+facet normal 0.3314135740355637 0.1913417161825047 0.9238795325113052
+ outer loop
+ vertex 180.5544791381245 -68.993697806078 598.0545186779376
+ vertex 30.220289003964815 190.62097856533464 598.214359353945
+ vertex 180.22028900396415 -69.18664256999598 598.2143593539449
+ endloop
+endfacet
+facet normal -0.527202862365693 -0.3043807145043661 -0.7933533402912171
+ outer loop
+ vertex 181.89290522410496 -68.22095714504681 600.7313708498986
+ vertex 31.60592965001994 191.42097856533462 600.9856406460553
+ vertex 31.89290522410566 191.58666399028382 600.7313708498987
+ endloop
+endfacet
+facet normal -0.527202862365693 -0.3043807145043661 -0.7933533402912171
+ outer loop
+ vertex 31.60592965001994 191.42097856533462 600.9856406460553
+ vertex 181.89290522410496 -68.22095714504681 600.7313708498986
+ vertex 181.60592965001933 -68.38664256999607 600.9856406460552
+ endloop
+endfacet
+facet normal -0.527202862365633 -0.3043807145043991 0.7933533402912443
+ outer loop
+ vertex 31.605929650019924 191.42097856533474 598.214359353945
+ vertex 181.89290522410494 -68.22095714504667 598.4686291501016
+ vertex 31.892905224105633 191.58666399028394 598.4686291501016
+ endloop
+endfacet
+facet normal -0.527202862365633 -0.3043807145043991 0.7933533402912443
+ outer loop
+ vertex 181.89290522410494 -68.22095714504667 598.4686291501016
+ vertex 31.605929650019924 191.42097856533474 598.214359353945
+ vertex 181.60592965001928 -68.38664256999598 598.2143593539449
+ endloop
+endfacet
+facet normal -0.11303899832183627 -0.06526309610999989 -0.9914448613738097
+ outer loop
+ vertex 181.27173951585894 -68.57958733391399 601.1454813220626
+ vertex 30.913109326992416 191.02097856533453 601.2000000000002
+ vertex 31.27173951585965 191.2280338014166 601.1454813220627
+ endloop
+endfacet
+facet normal -0.11303899832183627 -0.06526309610999989 -0.9914448613738097
+ outer loop
+ vertex 30.913109326992416 191.02097856533453 601.2000000000002
+ vertex 181.27173951585894 -68.57958733391399 601.1454813220626
+ vertex 180.91310932699167 -68.78664256999602 601.2
+ endloop
+endfacet
+facet normal 0.5272028623656624 0.30438071450441606 -0.7933533402912182
+ outer loop
+ vertex 180.2202890039642 -69.18664256999611 600.9856406460552
+ vertex 29.933313429879142 190.45529314038532 600.7313708498986
+ vertex 30.22028900396488 190.62097856533453 600.9856406460553
+ endloop
+endfacet
+facet normal 0.5272028623656624 0.30438071450441606 -0.7933533402912182
+ outer loop
+ vertex 29.933313429879142 190.45529314038532 600.7313708498986
+ vertex 180.2202890039642 -69.18664256999611 600.9856406460552
+ vertex 179.93331342987847 -69.35232799494533 600.7313708498986
+ endloop
+endfacet
+facet normal 0.6870641468694383 0.39667667014565394 -0.6087614290087103
+ outer loop
+ vertex 29.933313429879142 190.45529314038532 600.7313708498986
+ vertex 179.71310932699174 -69.47946289302364 600.4000000000001
+ vertex 29.713109326992434 190.32815824230704 600.4000000000002
+ endloop
+endfacet
+facet normal 0.6870641468694383 0.39667667014565394 -0.6087614290087103
+ outer loop
+ vertex 179.71310932699174 -69.47946289302364 600.4000000000001
+ vertex 29.933313429879142 190.45529314038532 600.7313708498986
+ vertex 179.93331342987847 -69.35232799494533 600.7313708498986
+ endloop
+endfacet
+facet normal -0.6870641468694484 -0.3966766701456766 0.6087614290086841
+ outer loop
+ vertex 181.89290522410494 -68.22095714504667 598.4686291501016
+ vertex 32.113109326992365 191.71379888836222 598.8000000000002
+ vertex 31.892905224105633 191.58666399028394 598.4686291501016
+ endloop
+endfacet
+facet normal -0.6870641468694484 -0.3966766701456766 0.6087614290086841
+ outer loop
+ vertex 32.113109326992365 191.71379888836222 598.8000000000002
+ vertex 181.89290522410494 -68.22095714504667 598.4686291501016
+ vertex 182.11310932699166 -68.09382224696837 598.8000000000001
+ endloop
+endfacet
+facet normal -0.33141357403558597 -0.19134171618259363 0.9238795325112787
+ outer loop
+ vertex 31.2717395158596 191.2280338014167 598.0545186779377
+ vertex 181.60592965001928 -68.38664256999598 598.2143593539449
+ vertex 31.605929650019924 191.42097856533474 598.214359353945
+ endloop
+endfacet
+facet normal -0.33141357403558597 -0.19134171618259363 0.9238795325112787
+ outer loop
+ vertex 181.60592965001928 -68.38664256999598 598.2143593539449
+ vertex 31.2717395158596 191.2280338014167 598.0545186779377
+ vertex 181.27173951585888 -68.57958733391395 598.0545186779376
+ endloop
+endfacet
+facet normal 0.5272028623656606 0.30438071450435294 0.7933533402912438
+ outer loop
+ vertex 29.933313429879124 190.45529314038538 598.4686291501016
+ vertex 180.22028900396415 -69.18664256999598 598.2143593539449
+ vertex 30.220289003964815 190.62097856533464 598.214359353945
+ endloop
+endfacet
+facet normal 0.5272028623656606 0.30438071450435294 0.7933533402912438
+ outer loop
+ vertex 180.22028900396415 -69.18664256999598 598.2143593539449
+ vertex 29.933313429879124 190.45529314038538 598.4686291501016
+ vertex 179.9333134298784 -69.35232799494524 598.4686291501016
+ endloop
+endfacet
+facet normal -0.8001031451912352 -0.46193976625567895 0.38268343236511054
+ outer loop
+ vertex 32.113109326992365 191.71379888836222 598.8000000000002
+ vertex 182.25153541297217 -68.0139019089647 599.185889527836
+ vertex 32.251535412972856 191.79371922636597 599.1858895278361
+ endloop
+endfacet
+facet normal -0.8001031451912352 -0.46193976625567895 0.38268343236511054
+ outer loop
+ vertex 182.25153541297217 -68.0139019089647 599.185889527836
+ vertex 32.113109326992365 191.71379888836222 598.8000000000002
+ vertex 182.11310932699166 -68.09382224696837 598.8000000000001
+ endloop
+endfacet
+facet normal -0.8001031451912619 -0.4619397662556719 -0.38268343236506275
+ outer loop
+ vertex 32.25153541297286 191.7937192263659 600.0141104721642
+ vertex 182.1131093269917 -68.09382224696841 600.4000000000001
+ vertex 32.11310932699237 191.71379888836222 600.4000000000002
+ endloop
+endfacet
+facet normal -0.8001031451912619 -0.4619397662556719 -0.38268343236506275
+ outer loop
+ vertex 182.1131093269917 -68.09382224696841 600.4000000000001
+ vertex 32.25153541297286 191.7937192263659 600.0141104721642
+ vertex 182.25153541297223 -68.01390190896478 600.0141104721641
+ endloop
+endfacet
+facet normal 0.33141357403561683 0.19134171618253823 0.9238795325112792
+ outer loop
+ vertex 30.22028900396512 190.62097856533418 613.814359353945
+ vertex 180.5544791381248 -68.9936978060785 613.6545186779375
+ vertex 30.554479138125426 190.81392332925216 613.6545186779376
+ endloop
+endfacet
+facet normal 0.33141357403561683 0.19134171618253823 0.9238795325112792
+ outer loop
+ vertex 180.5544791381248 -68.9936978060785 613.6545186779375
+ vertex 30.22028900396512 190.62097856533418 613.814359353945
+ vertex 180.2202890039644 -69.18664256999648 613.814359353945
+ endloop
+endfacet
+facet normal 0.6870641468694512 0.39667667014562186 0.6087614290087167
+ outer loop
+ vertex 179.71310932699174 -69.4794628930236 598.8000000000001
+ vertex 29.933313429879124 190.45529314038538 598.4686291501016
+ vertex 29.713109326992388 190.32815824230707 598.8000000000002
+ endloop
+endfacet
+facet normal 0.6870641468694512 0.39667667014562186 0.6087614290087167
+ outer loop
+ vertex 29.933313429879124 190.45529314038538 598.4686291501016
+ vertex 179.71310932699174 -69.4794628930236 598.8000000000001
+ vertex 179.9333134298784 -69.35232799494524 598.4686291501016
+ endloop
+endfacet
+facet normal -0.11303899832180415 -0.06526309611006587 0.9914448613738092
+ outer loop
+ vertex 30.91310932699238 191.0209785653347 598.0000000000001
+ vertex 181.27173951585888 -68.57958733391395 598.0545186779376
+ vertex 31.2717395158596 191.2280338014167 598.0545186779377
+ endloop
+endfacet
+facet normal -0.11303899832180415 -0.06526309611006587 0.9914448613738092
+ outer loop
+ vertex 181.27173951585888 -68.57958733391395 598.0545186779376
+ vertex 30.91310932699238 191.0209785653347 598.0000000000001
+ vertex 180.91310932699176 -68.78664256999598 598.0000000000001
+ endloop
+endfacet
+facet normal -0.33141357403558147 -0.19134171618251217 -0.9238795325112973
+ outer loop
+ vertex 181.60592965001933 -68.38664256999607 600.9856406460552
+ vertex 31.27173951585965 191.2280338014166 601.1454813220627
+ vertex 31.60592965001994 191.42097856533462 600.9856406460553
+ endloop
+endfacet
+facet normal -0.33141357403558147 -0.19134171618251217 -0.9238795325112973
+ outer loop
+ vertex 31.27173951585965 191.2280338014166 601.1454813220627
+ vertex 181.60592965001933 -68.38664256999607 600.9856406460552
+ vertex 181.27173951585894 -68.57958733391399 601.1454813220626
+ endloop
+endfacet
+facet normal 0.3314135740355858 0.19134171618259352 -0.9238795325112789
+ outer loop
+ vertex 180.55447913812455 -68.99369780607815 601.1454813220626
+ vertex 30.22028900396488 190.62097856533453 600.9856406460553
+ vertex 30.554479138125185 190.81392332925253 601.1454813220627
+ endloop
+endfacet
+facet normal 0.3314135740355858 0.19134171618259352 -0.9238795325112789
+ outer loop
+ vertex 30.22028900396488 190.62097856533453 600.9856406460553
+ vertex 180.55447913812455 -68.99369780607815 601.1454813220626
+ vertex 180.2202890039642 -69.18664256999611 600.9856406460552
+ endloop
+endfacet
+facet normal -0.8586164364012407 -0.4957224306869376 -0.13052619222006204
+ outer loop
+ vertex 32.298749973047464 191.82097856533466 599.6000000000001
+ vertex 182.25153541297223 -68.01390190896478 600.0141104721641
+ vertex 32.25153541297286 191.7937192263659 600.0141104721642
+ endloop
+endfacet
+facet normal -0.8586164364012407 -0.4957224306869376 -0.13052619222006204
+ outer loop
+ vertex 182.25153541297223 -68.01390190896478 600.0141104721641
+ vertex 32.298749973047464 191.82097856533466 599.6000000000001
+ vertex 182.29874997304677 -67.98664256999594 599.6
+ endloop
+endfacet
+facet normal 0.11303899832180415 0.06526309611006587 -0.9914448613738092
+ outer loop
+ vertex 180.91310932699167 -68.78664256999602 601.2
+ vertex 30.554479138125185 190.81392332925253 601.1454813220627
+ vertex 30.913109326992416 191.02097856533453 601.2000000000002
+ endloop
+endfacet
+facet normal 0.11303899832180415 0.06526309611006587 -0.9914448613738092
+ outer loop
+ vertex 30.554479138125185 190.81392332925253 601.1454813220627
+ vertex 180.91310932699167 -68.78664256999602 601.2
+ vertex 180.55447913812455 -68.99369780607815 601.1454813220626
+ endloop
+endfacet
+facet normal 0.8586164364012415 0.49572243068693805 0.1305261922200554
+ outer loop
+ vertex 182.7888561152711 -67.70367965685196 616.6588190451026
+ vertex 32.81836521531845 192.12097856533418 616.4000000000001
+ vertex 32.788856115271805 192.1039414784787 616.6588190451026
+ endloop
+endfacet
+facet normal 0.8586164364012415 0.49572243068693805 0.1305261922200554
+ outer loop
+ vertex 32.81836521531845 192.12097856533418 616.4000000000001
+ vertex 182.7888561152711 -67.70367965685196 616.6588190451026
+ vertex 182.81836521531775 -67.6866425699965 616.4000000000001
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 1.5003536199769238e-15
+ outer loop
+ vertex 32.81836521531845 192.12097856533418 616.4000000000001
+ vertex 182.8183652153177 -67.68664256999637 611.2
+ vertex 32.81836521531833 192.12097856533435 611.2000000000002
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 1.5003536199769238e-15
+ outer loop
+ vertex 182.8183652153177 -67.68664256999637 611.2
+ vertex 32.81836521531845 192.12097856533418 616.4000000000001
+ vertex 182.81836521531775 -67.6866425699965 616.4000000000001
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -4.4649600931051686e-15
+ outer loop
+ vertex 182.47195505380387 -67.88664256999631 611.2
+ vertex 32.471955053804564 191.92097856533434 610.8000000000002
+ vertex 32.47195505380457 191.92097856533434 611.2000000000002
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -4.4649600931051686e-15
+ outer loop
+ vertex 32.471955053804564 191.92097856533434 610.8000000000002
+ vertex 182.47195505380387 -67.88664256999631 611.2
+ vertex 182.47195505380387 -67.88664256999627 610.8000000000001
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 181.2595194885057 -68.58664256999639 613.0000000000001
+ vertex 29.497751387223563 190.20382127780877 613.0000000000002
+ vertex 31.259519488506385 191.22097856533424 613.0000000000002
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 29.497751387223563 190.20382127780877 613.0000000000002
+ vertex 181.2595194885057 -68.58664256999639 613.0000000000001
+ vertex 179.4977513872229 -69.60379985752186 613.0000000000001
+ endloop
+endfacet
+facet normal 0.8001031451912567 0.46193976625566885 0.3826834323650779
+ outer loop
+ vertex 182.7023398115333 -67.75362986810428 616.9
+ vertex 32.788856115271805 192.1039414784787 616.6588190451026
+ vertex 32.702339811533996 192.05399126722637 616.9000000000001
+ endloop
+endfacet
+facet normal 0.8001031451912567 0.46193976625566885 0.3826834323650779
+ outer loop
+ vertex 32.788856115271805 192.1039414784787 616.6588190451026
+ vertex 182.7023398115333 -67.75362986810428 616.9
+ vertex 182.7888561152711 -67.70367965685196 616.6588190451026
+ endloop
+endfacet
+facet normal 0.6123724356957727 0.35355339059330715 -0.7071067811865499
+ outer loop
+ vertex 179.4977513872229 -69.60379985752186 613.0000000000001
+ vertex 27.362405171476443 188.97097856533418 610.5343145750509
+ vertex 29.497751387223563 190.20382127780877 613.0000000000002
+ endloop
+endfacet
+facet normal 0.6123724356957727 0.35355339059330715 -0.7071067811865499
+ outer loop
+ vertex 27.362405171476443 188.97097856533418 610.5343145750509
+ vertex 179.4977513872229 -69.60379985752186 613.0000000000001
+ vertex 177.36240517147576 -70.83664256999646 610.5343145750509
+ endloop
+endfacet
+facet normal -3.27323874590727e-14 2.2585965780328042e-14 -1.0
+ outer loop
+ vertex 182.47195505380387 -67.88664256999627 610.8000000000001
+ vertex 31.25951948850635 191.2209785653343 610.8000000000002
+ vertex 32.471955053804564 191.92097856533434 610.8000000000002
+ endloop
+endfacet
+facet normal -3.27323874590727e-14 2.2585965780328042e-14 -1.0
+ outer loop
+ vertex 31.25951948850635 191.2209785653343 610.8000000000002
+ vertex 182.47195505380387 -67.88664256999627 610.8000000000001
+ vertex 181.25951948850567 -68.58664256999634 610.8000000000001
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 182.8183652153177 -67.68664256999637 611.2
+ vertex 32.47195505380457 191.92097856533434 611.2000000000002
+ vertex 32.81836521531833 192.12097856533435 611.2000000000002
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 32.47195505380457 191.92097856533434 611.2000000000002
+ vertex 182.8183652153177 -67.68664256999637 611.2
+ vertex 182.47195505380387 -67.88664256999631 611.2
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 31.25951948850635 191.2209785653343 610.8000000000002
+ vertex 181.2595194885057 -68.58664256999639 613.0000000000001
+ vertex 31.259519488506385 191.22097856533424 613.0000000000002
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 181.2595194885057 -68.58664256999639 613.0000000000001
+ vertex 31.25951948850635 191.2209785653343 610.8000000000002
+ vertex 181.25951948850567 -68.58664256999634 610.8000000000001
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -1.0524654334828364e-15
+ outer loop
+ vertex 27.362405171476443 188.97097856533418 610.5343145750509
+ vertex 177.36240517147564 -70.83664256999627 604.2656854249493
+ vertex 27.362405171476308 188.97097856533438 604.2656854249494
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -1.0524654334828364e-15
+ outer loop
+ vertex 177.36240517147564 -70.83664256999627 604.2656854249493
+ vertex 27.362405171476443 188.97097856533418 610.5343145750509
+ vertex 177.36240517147576 -70.83664256999646 610.5343145750509
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 165.49785713962896 -77.68664256999648 598.4000000000001
+ vertex 15.497857139629684 182.12097856533407 603.6000000000001
+ vertex 15.497857139629588 182.12097856533424 598.4000000000002
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 15.497857139629684 182.12097856533407 603.6000000000001
+ vertex 165.49785713962896 -77.68664256999648 598.4000000000001
+ vertex 165.497857139629 -77.68664256999662 603.6
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 15.497857139629684 182.12097856533407 603.6000000000001
+ vertex 165.84426730114285 -77.48664256999662 603.6
+ vertex 15.844267301143471 182.3209785653341 603.6000000000001
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 165.84426730114285 -77.48664256999662 603.6
+ vertex 15.497857139629684 182.12097856533407 603.6000000000001
+ vertex 165.497857139629 -77.68664256999662 603.6
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 2.7394170869210435e-15
+ outer loop
+ vertex 170.9538171834709 -74.53664256999643 604.2656854249493
+ vertex 20.953817183471706 185.270978565334 610.5343145750509
+ vertex 20.953817183471575 185.2709785653342 604.2656854249494
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 2.7394170869210435e-15
+ outer loop
+ vertex 20.953817183471706 185.270978565334 610.5343145750509
+ vertex 170.9538171834709 -74.53664256999643 604.2656854249493
+ vertex 170.953817183471 -74.53664256999662 610.5343145750508
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 15.844267301143471 182.32097856533406 604.0000000000001
+ vertex 167.056702866441 -76.78664256999654 604.0000000000001
+ vertex 17.056702866441686 183.0209785653341 604.0000000000001
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 167.056702866441 -76.78664256999654 604.0000000000001
+ vertex 15.844267301143471 182.32097856533406 604.0000000000001
+ vertex 165.84426730114282 -77.48664256999658 604.0000000000001
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 168.818470967724 -75.76948528247138 613.0
+ vertex 17.056702866441864 183.02097856533382 613.0000000000001
+ vertex 18.818470967724718 184.03813585285926 613.0000000000001
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 17.056702866441864 183.02097856533382 613.0000000000001
+ vertex 168.818470967724 -75.76948528247138 613.0
+ vertex 167.05670286644116 -76.78664256999681 613.0
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 167.05670286644116 -76.78664256999681 613.0
+ vertex 17.056702866441796 183.02097856533388 610.8000000000002
+ vertex 17.056702866441864 183.02097856533382 613.0000000000001
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 17.056702866441796 183.02097856533388 610.8000000000002
+ vertex 167.05670286644116 -76.78664256999681 613.0
+ vertex 167.0567028664411 -76.78664256999677 610.8000000000001
+ endloop
+endfacet
+facet normal -3.2732387459072867e-14 2.2585965780327947e-14 -1.0
+ outer loop
+ vertex 167.0567028664411 -76.78664256999677 610.8000000000001
+ vertex 15.844267301143587 182.32097856533386 610.8000000000002
+ vertex 17.056702866441796 183.02097856533388 610.8000000000002
+ endloop
+endfacet
+facet normal -3.2732387459072867e-14 2.2585965780327947e-14 -1.0
+ outer loop
+ vertex 15.844267301143587 182.32097856533386 610.8000000000002
+ vertex 167.0567028664411 -76.78664256999677 610.8000000000001
+ vertex 165.8442673011429 -77.4866425699968 610.8000000000001
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 17.05670286644162 183.02097856533416 601.8000000000001
+ vertex 168.81847096772384 -75.76948528247111 601.8000000000001
+ vertex 18.81847096772448 184.03813585285957 601.8000000000001
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 168.81847096772384 -75.76948528247111 601.8000000000001
+ vertex 17.05670286644162 183.02097856533416 601.8000000000001
+ vertex 167.05670286644096 -76.78664256999646 601.8000000000001
+ endloop
+endfacet
+facet normal -0.6123724356957727 -0.35355339059330715 0.7071067811865499
+ outer loop
+ vertex 18.81847096772448 184.03813585285957 601.8000000000001
+ vertex 170.9538171834709 -74.53664256999643 604.2656854249493
+ vertex 20.953817183471575 185.2709785653342 604.2656854249494
+ endloop
+endfacet
+facet normal -0.6123724356957727 -0.35355339059330715 0.7071067811865499
+ outer loop
+ vertex 170.9538171834709 -74.53664256999643 604.2656854249493
+ vertex 18.81847096772448 184.03813585285957 601.8000000000001
+ vertex 168.81847096772384 -75.76948528247111 601.8000000000001
+ endloop
+endfacet
+facet normal -0.6123724356957975 -0.35355339059327634 -0.7071067811865437
+ outer loop
+ vertex 20.953817183471706 185.270978565334 610.5343145750509
+ vertex 168.818470967724 -75.76948528247138 613.0
+ vertex 18.818470967724718 184.03813585285926 613.0000000000001
+ endloop
+endfacet
+facet normal -0.6123724356957975 -0.35355339059327634 -0.7071067811865437
+ outer loop
+ vertex 168.818470967724 -75.76948528247138 613.0
+ vertex 20.953817183471706 185.270978565334 610.5343145750509
+ vertex 170.953817183471 -74.53664256999662 610.5343145750508
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 15.844267301143587 182.32097856533386 610.8000000000002
+ vertex 165.8442673011429 -77.48664256999685 611.2
+ vertex 15.844267301143587 182.32097856533386 611.2000000000002
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 165.8442673011429 -77.48664256999685 611.2
+ vertex 15.844267301143587 182.32097856533386 610.8000000000002
+ vertex 165.8442673011429 -77.4866425699968 610.8000000000001
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 165.8442673011429 -77.48664256999685 611.2
+ vertex 15.497857139629847 182.12097856533381 611.2000000000002
+ vertex 15.844267301143587 182.32097856533386 611.2000000000002
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 15.497857139629847 182.12097856533381 611.2000000000002
+ vertex 165.8442673011429 -77.48664256999685 611.2
+ vertex 165.49785713962922 -77.68664256999683 611.2
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 165.84426730114285 -77.48664256999662 603.6
+ vertex 15.844267301143471 182.32097856533406 604.0000000000001
+ vertex 15.844267301143471 182.3209785653341 603.6000000000001
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 15.844267301143471 182.32097856533406 604.0000000000001
+ vertex 165.84426730114285 -77.48664256999662 603.6
+ vertex 165.84426730114282 -77.48664256999658 604.0000000000001
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 17.056702866441686 183.0209785653341 604.0000000000001
+ vertex 167.05670286644096 -76.78664256999646 601.8000000000001
+ vertex 17.05670286644162 183.02097856533416 601.8000000000001
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 167.05670286644096 -76.78664256999646 601.8000000000001
+ vertex 17.056702866441686 183.0209785653341 604.0000000000001
+ vertex 167.056702866441 -76.78664256999654 604.0000000000001
+ endloop
+endfacet
+facet normal -0.6870641468694316 -0.39667667014565006 0.6087614290087203
+ outer loop
+ vertex 165.6138825434137 -77.6196552718892 616.9
+ vertex 15.751510107718625 182.26742517474034 617.1071067811868
+ vertex 15.613882543414398 182.18796586344143 616.9000000000001
+ endloop
+endfacet
+facet normal -0.6870641468694316 -0.39667667014565006 0.6087614290087203
+ outer loop
+ vertex 15.751510107718625 182.26742517474034 617.1071067811868
+ vertex 165.6138825434137 -77.6196552718892 616.9
+ vertex 165.75151010771788 -77.54019596059021 617.1071067811866
+ endloop
+endfacet
+facet normal -0.3314135740355606 -0.1913417161825818 0.9238795325112903
+ outer loop
+ vertex 15.930869841522176 182.37097856533364 617.2660254037846
+ vertex 166.1397386753717 -77.31605209254826 617.3659258262891
+ vertex 16.13973867537238 182.4915690427824 617.3659258262892
+ endloop
+endfacet
+facet normal -0.3314135740355606 -0.1913417161825818 0.9238795325112903
+ outer loop
+ vertex 166.1397386753717 -77.31605209254826 617.3659258262891
+ vertex 15.930869841522176 182.37097856533364 617.2660254037846
+ vertex 165.93086984152154 -77.43664256999703 617.2660254037845
+ endloop
+endfacet
+facet normal -0.11303899832181276 -0.06526309611007224 0.9914448613738078
+ outer loop
+ vertex 16.13973867537238 182.4915690427824 617.3659258262892
+ vertex 166.3638825434137 -77.186642569997 617.4000000000001
+ vertex 16.363882543414398 182.62097856533364 617.4000000000002
+ endloop
+endfacet
+facet normal -0.11303899832181276 -0.06526309611007224 0.9914448613738078
+ outer loop
+ vertex 166.3638825434137 -77.186642569997 617.4000000000001
+ vertex 16.13973867537238 182.4915690427824 617.3659258262892
+ vertex 166.1397386753717 -77.31605209254826 617.3659258262891
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 16.363882543414398 182.62097856533364 617.4000000000002
+ vertex 170.86721464309272 -74.58664256999687 617.4000000000001
+ vertex 20.86721464309339 185.22097856533378 617.4000000000002
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 170.86721464309272 -74.58664256999687 617.4000000000001
+ vertex 16.363882543414398 182.62097856533364 617.4000000000002
+ vertex 166.3638825434137 -77.186642569997 617.4000000000001
+ endloop
+endfacet
+facet normal -0.5272028623656286 -0.3043807145043965 0.7933533402912483
+ outer loop
+ vertex 15.751510107718625 182.26742517474034 617.1071067811868
+ vertex 165.93086984152154 -77.43664256999703 617.2660254037845
+ vertex 15.930869841522176 182.37097856533364 617.2660254037846
+ endloop
+endfacet
+facet normal -0.5272028623656286 -0.3043807145043965 0.7933533402912483
+ outer loop
+ vertex 165.93086984152154 -77.43664256999703 617.2660254037845
+ vertex 15.751510107718625 182.26742517474034 617.1071067811868
+ vertex 165.75151010771788 -77.54019596059021 617.1071067811866
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 15.497857139629847 182.12097856533381 611.2000000000002
+ vertex 165.4978571396293 -77.68664256999702 616.4000000000001
+ vertex 15.497857139629923 182.1209785653337 616.4000000000001
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 165.4978571396293 -77.68664256999702 616.4000000000001
+ vertex 15.497857139629847 182.12097856533381 611.2000000000002
+ vertex 165.49785713962922 -77.68664256999683 611.2
+ endloop
+endfacet
+facet normal -0.8001031451912507 -0.4619397662556767 0.3826834323650808
+ outer loop
+ vertex 15.527366239676597 182.1380156521891 616.6588190451026
+ vertex 165.6138825434137 -77.6196552718892 616.9
+ vertex 15.613882543414398 182.18796586344143 616.9000000000001
+ endloop
+endfacet
+facet normal -0.8001031451912507 -0.4619397662556767 0.3826834323650808
+ outer loop
+ vertex 165.6138825434137 -77.6196552718892 616.9
+ vertex 15.527366239676597 182.1380156521891 616.6588190451026
+ vertex 165.52736623967584 -77.66960548314148 616.6588190451026
+ endloop
+endfacet
+facet normal -0.8586164364012412 -0.4957224306869379 0.1305261922200573
+ outer loop
+ vertex 165.4978571396293 -77.68664256999702 616.4000000000001
+ vertex 15.527366239676597 182.1380156521891 616.6588190451026
+ vertex 15.497857139629923 182.1209785653337 616.4000000000001
+ endloop
+endfacet
+facet normal -0.8586164364012412 -0.4957224306869379 0.1305261922200573
+ outer loop
+ vertex 15.527366239676597 182.1380156521891 616.6588190451026
+ vertex 165.4978571396293 -77.68664256999702 616.4000000000001
+ vertex 165.52736623967584 -77.66960548314148 616.6588190451026
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 20.867214643093394 185.2209785653338 617.0000000000002
+ vertex 171.21362480460647 -74.38664256999682 617.0000000000001
+ vertex 21.21362480460716 185.4209785653338 617.0000000000002
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 171.21362480460647 -74.38664256999682 617.0000000000001
+ vertex 20.867214643093394 185.2209785653338 617.0000000000002
+ vertex 170.86721464309267 -74.58664256999687 617.0000000000001
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 19.308368916281395 184.3209785653338 615.6000000000001
+ vertex 169.30836891628067 -75.4866425699968 613.5656854249493
+ vertex 19.30836891628135 184.32097856533386 613.5656854249494
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 169.30836891628067 -75.4866425699968 613.5656854249493
+ vertex 19.308368916281395 184.3209785653338 615.6000000000001
+ vertex 169.30836891628067 -75.48664256999685 615.6
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 170.86721464309272 -74.58664256999687 617.4000000000001
+ vertex 20.867214643093394 185.2209785653338 617.0000000000002
+ vertex 20.86721464309339 185.22097856533378 617.4000000000002
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 20.867214643093394 185.2209785653338 617.0000000000002
+ vertex 170.86721464309272 -74.58664256999687 617.4000000000001
+ vertex 170.86721464309267 -74.58664256999687 617.0000000000001
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 171.21362480460644 -74.38664256999678 615.6
+ vertex 19.308368916281395 184.3209785653338 615.6000000000001
+ vertex 21.21362480460709 185.42097856533385 615.6000000000001
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 19.308368916281395 184.3209785653338 615.6000000000001
+ vertex 171.21362480460644 -74.38664256999678 615.6
+ vertex 169.30836891628067 -75.48664256999685 615.6
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 21.443715132028345 185.5538212778086 611.1000000000001
+ vertex 176.8725072229191 -71.11948528247113 611.1
+ vertex 26.872507222919793 188.6881358528595 611.1000000000001
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 176.8725072229191 -71.11948528247113 611.1
+ vertex 21.443715132028345 185.5538212778086 611.1000000000001
+ vertex 171.4437151320277 -74.25379985752207 611.1
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -8.99704908291417e-15
+ outer loop
+ vertex 21.21362480460716 185.4209785653338 617.0000000000002
+ vertex 171.21362480460644 -74.38664256999678 615.6
+ vertex 21.21362480460709 185.42097856533385 615.6000000000001
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -8.99704908291417e-15
+ outer loop
+ vertex 171.21362480460644 -74.38664256999678 615.6
+ vertex 21.21362480460716 185.4209785653338 617.0000000000002
+ vertex 171.21362480460647 -74.38664256999682 617.0000000000001
+ endloop
+endfacet
+facet normal 0.6123724356957947 0.35355339059327473 0.707106781186547
+ outer loop
+ vertex 19.30836891628135 184.32097856533386 613.5656854249494
+ vertex 171.4437151320277 -74.25379985752207 611.1
+ vertex 21.443715132028345 185.5538212778086 611.1000000000001
+ endloop
+endfacet
+facet normal 0.6123724356957947 0.35355339059327473 0.707106781186547
+ outer loop
+ vertex 171.4437151320277 -74.25379985752207 611.1
+ vertex 19.30836891628135 184.32097856533386 613.5656854249494
+ vertex 169.30836891628067 -75.4866425699968 613.5656854249493
+ endloop
+endfacet
+facet normal -0.6123724356957676 -0.3535533905933155 0.70710678118655
+ outer loop
+ vertex 26.872507222919793 188.6881358528595 611.1000000000001
+ vertex 179.0078534386662 -69.8866425699965 613.5656854249493
+ vertex 29.0078534386669 189.9209785653341 613.5656854249494
+ endloop
+endfacet
+facet normal -0.6123724356957676 -0.3535533905933155 0.70710678118655
+ outer loop
+ vertex 179.0078534386662 -69.8866425699965 613.5656854249493
+ vertex 26.872507222919793 188.6881358528595 611.1000000000001
+ vertex 176.8725072229191 -71.11948528247113 611.1
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 179.00785343866627 -69.88664256999658 615.6
+ vertex 27.102597550341205 188.82097856533403 615.6000000000001
+ vertex 29.007853438666945 189.92097856533408 615.6000000000001
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 27.102597550341205 188.82097856533403 615.6000000000001
+ vertex 179.00785343866627 -69.88664256999658 615.6
+ vertex 177.1025975503406 -70.98664256999665 615.6
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 2.611827415552657e-14
+ outer loop
+ vertex 177.1025975503406 -70.98664256999665 615.6
+ vertex 27.102597550341276 188.820978565334 617.0000000000002
+ vertex 27.102597550341205 188.82097856533403 615.6000000000001
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 2.611827415552657e-14
+ outer loop
+ vertex 27.102597550341276 188.820978565334 617.0000000000002
+ vertex 177.1025975503406 -70.98664256999665 615.6
+ vertex 177.1025975503406 -70.98664256999665 617.0000000000001
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 29.0078534386669 189.9209785653341 613.5656854249494
+ vertex 179.00785343866627 -69.88664256999658 615.6
+ vertex 29.007853438666945 189.92097856533408 615.6000000000001
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 179.00785343866627 -69.88664256999658 615.6
+ vertex 29.0078534386669 189.9209785653341 613.5656854249494
+ vertex 179.0078534386662 -69.8866425699965 613.5656854249493
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 27.102597550341276 188.820978565334 617.0000000000002
+ vertex 177.44900771185436 -70.78664256999664 617.0000000000001
+ vertex 27.449007711855035 189.020978565334 617.0000000000002
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 177.44900771185436 -70.78664256999664 617.0000000000001
+ vertex 27.102597550341276 188.820978565334 617.0000000000002
+ vertex 177.1025975503406 -70.98664256999665 617.0000000000001
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 4.4649600931051686e-15
+ outer loop
+ vertex 177.44900771185436 -70.78664256999664 617.0000000000001
+ vertex 27.44900771185507 189.020978565334 617.4000000000002
+ vertex 27.449007711855035 189.020978565334 617.0000000000002
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 4.4649600931051686e-15
+ outer loop
+ vertex 27.44900771185507 189.020978565334 617.4000000000002
+ vertex 177.44900771185436 -70.78664256999664 617.0000000000001
+ vertex 177.44900771185436 -70.78664256999664 617.4000000000001
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 27.44900771185507 189.020978565334 617.4000000000002
+ vertex 181.9523398115334 -68.18664256999656 617.4
+ vertex 31.952339811534035 191.62097856533413 617.4000000000002
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 181.9523398115334 -68.18664256999656 617.4
+ vertex 27.44900771185507 189.020978565334 617.4000000000002
+ vertex 177.44900771185436 -70.78664256999664 617.4000000000001
+ endloop
+endfacet
+facet normal 0.11303899832185176 0.06526309611000743 0.9914448613738075
+ outer loop
+ vertex 31.952339811534035 191.62097856533413 617.4000000000002
+ vertex 182.17648367957543 -68.0572330474453 617.3659258262891
+ vertex 32.17648367957604 191.7503880878854 617.3659258262892
+ endloop
+endfacet
+facet normal 0.11303899832185176 0.06526309611000743 0.9914448613738075
+ outer loop
+ vertex 182.17648367957543 -68.0572330474453 617.3659258262891
+ vertex 31.952339811534035 191.62097856533413 617.4000000000002
+ vertex 181.9523398115334 -68.18664256999656 617.4
+ endloop
+endfacet
+facet normal 0.3314135740355972 0.19134171618252124 0.9238795325112898
+ outer loop
+ vertex 32.17648367957604 191.7503880878854 617.3659258262892
+ vertex 182.38535251342552 -67.9366425699965 617.2660254037845
+ vertex 32.38535251342622 191.87097856533413 617.2660254037846
+ endloop
+endfacet
+facet normal 0.3314135740355972 0.19134171618252124 0.9238795325112898
+ outer loop
+ vertex 182.38535251342552 -67.9366425699965 617.2660254037845
+ vertex 32.17648367957604 191.7503880878854 617.3659258262892
+ vertex 182.17648367957543 -68.0572330474453 617.3659258262891
+ endloop
+endfacet
+facet normal 0.5272028623656612 0.304380714504342 0.7933533402912476
+ outer loop
+ vertex 32.38535251342622 191.87097856533413 617.2660254037846
+ vertex 182.56471224722918 -67.83308917940327 617.1071067811866
+ vertex 32.5647122472298 191.97453195592743 617.1071067811868
+ endloop
+endfacet
+facet normal 0.5272028623656612 0.304380714504342 0.7933533402912476
+ outer loop
+ vertex 182.56471224722918 -67.83308917940327 617.1071067811866
+ vertex 32.38535251342622 191.87097856533413 617.2660254037846
+ vertex 182.38535251342552 -67.9366425699965 617.2660254037845
+ endloop
+endfacet
+facet normal 0.6870641468694547 0.3966766701456183 0.6087614290087151
+ outer loop
+ vertex 182.56471224722918 -67.83308917940327 617.1071067811866
+ vertex 32.702339811533996 192.05399126722637 616.9000000000001
+ vertex 32.5647122472298 191.97453195592743 617.1071067811868
+ endloop
+endfacet
+facet normal 0.6870641468694547 0.3966766701456183 0.6087614290087151
+ outer loop
+ vertex 32.702339811533996 192.05399126722637 616.9000000000001
+ vertex 182.56471224722918 -67.83308917940327 617.1071067811866
+ vertex 182.7023398115333 -67.75362986810428 616.9
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.81836521531775 -67.6866425699965 616.4000000000001
+ vertex 182.47195505380387 -67.88664256999631 611.2
+ vertex 182.8183652153177 -67.68664256999637 611.2
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.47195505380387 -67.88664256999631 611.2
+ vertex 182.81836521531775 -67.6866425699965 616.4000000000001
+ vertex 182.25153541297243 -68.0139019089652 614.785889527836
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.47195505380387 -67.88664256999631 611.2
+ vertex 182.25153541297243 -68.0139019089652 614.785889527836
+ vertex 182.11310932699195 -68.09382224696891 614.4000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.47195505380387 -67.88664256999631 611.2
+ vertex 182.11310932699195 -68.09382224696891 614.4000000000001
+ vertex 181.2595194885057 -68.58664256999639 613.0000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.2595194885057 -68.58664256999639 613.0000000000001
+ vertex 182.11310932699195 -68.09382224696891 614.4000000000001
+ vertex 181.8929052241052 -68.22095714504717 614.0686291501016
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.2595194885057 -68.58664256999639 613.0000000000001
+ vertex 181.8929052241052 -68.22095714504717 614.0686291501016
+ vertex 181.60592965001956 -68.38664256999643 613.814359353945
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.2595194885057 -68.58664256999639 613.0000000000001
+ vertex 181.60592965001956 -68.38664256999643 613.814359353945
+ vertex 181.2717395158592 -68.5795873339144 613.6545186779375
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.2595194885057 -68.58664256999639 613.0000000000001
+ vertex 181.2717395158592 -68.5795873339144 613.6545186779375
+ vertex 179.4977513872229 -69.60379985752186 613.0000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.4977513872229 -69.60379985752186 613.0000000000001
+ vertex 181.2717395158592 -68.5795873339144 613.6545186779375
+ vertex 180.913109326992 -68.78664256999643 613.6
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.4977513872229 -69.60379985752186 613.0000000000001
+ vertex 180.913109326992 -68.78664256999643 613.6
+ vertex 179.0078534386662 -69.8866425699965 613.5656854249493
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.25153541297243 -68.0139019089652 614.785889527836
+ vertex 182.81836521531775 -67.6866425699965 616.4000000000001
+ vertex 182.29874997304705 -67.98664256999643 615.2
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.29874997304705 -67.98664256999643 615.2
+ vertex 182.81836521531775 -67.6866425699965 616.4000000000001
+ vertex 182.2515354129725 -68.01390190896524 615.6141104721642
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.2515354129725 -68.01390190896524 615.6141104721642
+ vertex 182.81836521531775 -67.6866425699965 616.4000000000001
+ vertex 182.11310932699195 -68.09382224696891 616.0
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.11310932699195 -68.09382224696891 616.0
+ vertex 182.81836521531775 -67.6866425699965 616.4000000000001
+ vertex 181.8929052241053 -68.22095714504731 616.3313708498986
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.8929052241053 -68.22095714504731 616.3313708498986
+ vertex 182.81836521531775 -67.6866425699965 616.4000000000001
+ vertex 181.60592965001953 -68.38664256999647 616.5856406460551
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.60592965001953 -68.38664256999647 616.5856406460551
+ vertex 182.81836521531775 -67.6866425699965 616.4000000000001
+ vertex 182.7888561152711 -67.70367965685196 616.6588190451026
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.60592965001953 -68.38664256999647 616.5856406460551
+ vertex 182.7888561152711 -67.70367965685196 616.6588190451026
+ vertex 181.27173951585922 -68.57958733391453 616.7454813220626
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.27173951585922 -68.57958733391453 616.7454813220626
+ vertex 182.7888561152711 -67.70367965685196 616.6588190451026
+ vertex 182.7023398115333 -67.75362986810428 616.9
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.27173951585922 -68.57958733391453 616.7454813220626
+ vertex 182.7023398115333 -67.75362986810428 616.9
+ vertex 180.91310932699201 -68.78664256999652 616.8000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.56471224722918 -67.83308917940327 617.1071067811866
+ vertex 177.44900771185436 -70.78664256999664 617.0000000000001
+ vertex 182.7023398115333 -67.75362986810428 616.9
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.44900771185436 -70.78664256999664 617.0000000000001
+ vertex 182.56471224722918 -67.83308917940327 617.1071067811866
+ vertex 177.44900771185436 -70.78664256999664 617.4000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.44900771185436 -70.78664256999664 617.4000000000001
+ vertex 182.56471224722918 -67.83308917940327 617.1071067811866
+ vertex 182.38535251342552 -67.9366425699965 617.2660254037845
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.44900771185436 -70.78664256999664 617.4000000000001
+ vertex 182.38535251342552 -67.9366425699965 617.2660254037845
+ vertex 182.17648367957543 -68.0572330474453 617.3659258262891
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.44900771185436 -70.78664256999664 617.4000000000001
+ vertex 182.17648367957543 -68.0572330474453 617.3659258262891
+ vertex 181.9523398115334 -68.18664256999656 617.4
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.0078534386662 -69.8866425699965 613.5656854249493
+ vertex 179.713109326992 -69.47946289302408 614.4000000000001
+ vertex 179.00785343866627 -69.88664256999658 615.6
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.713109326992 -69.47946289302408 614.4000000000001
+ vertex 179.0078534386662 -69.8866425699965 613.5656854249493
+ vertex 179.93331342987872 -69.35232799494572 614.0686291501015
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.93331342987872 -69.35232799494572 614.0686291501015
+ vertex 179.0078534386662 -69.8866425699965 613.5656854249493
+ vertex 180.2202890039644 -69.18664256999648 613.814359353945
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 180.2202890039644 -69.18664256999648 613.814359353945
+ vertex 179.0078534386662 -69.8866425699965 613.5656854249493
+ vertex 180.5544791381248 -68.9936978060785 613.6545186779375
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 180.5544791381248 -68.9936978060785 613.6545186779375
+ vertex 179.0078534386662 -69.8866425699965 613.5656854249493
+ vertex 180.913109326992 -68.78664256999643 613.6
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.00785343866627 -69.88664256999658 615.6
+ vertex 179.713109326992 -69.47946289302408 614.4000000000001
+ vertex 179.5746832410115 -69.55938323102781 614.785889527836
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.00785343866627 -69.88664256999658 615.6
+ vertex 179.5746832410115 -69.55938323102781 614.785889527836
+ vertex 179.52746868093686 -69.58664256999651 615.2
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.00785343866627 -69.88664256999658 615.6
+ vertex 179.52746868093686 -69.58664256999651 615.2
+ vertex 179.57468324101148 -69.55938323102781 615.6141104721642
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.00785343866627 -69.88664256999658 615.6
+ vertex 179.57468324101148 -69.55938323102781 615.6141104721642
+ vertex 177.1025975503406 -70.98664256999665 615.6
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.1025975503406 -70.98664256999665 615.6
+ vertex 179.57468324101148 -69.55938323102781 615.6141104721642
+ vertex 177.1025975503406 -70.98664256999665 617.0000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.1025975503406 -70.98664256999665 617.0000000000001
+ vertex 179.57468324101148 -69.55938323102781 615.6141104721642
+ vertex 179.713109326992 -69.47946289302403 616.0
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.1025975503406 -70.98664256999665 617.0000000000001
+ vertex 179.713109326992 -69.47946289302403 616.0
+ vertex 179.93331342987875 -69.35232799494582 616.3313708498986
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.1025975503406 -70.98664256999665 617.0000000000001
+ vertex 179.93331342987875 -69.35232799494582 616.3313708498986
+ vertex 180.22028900396444 -69.18664256999656 616.5856406460551
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.1025975503406 -70.98664256999665 617.0000000000001
+ vertex 180.22028900396444 -69.18664256999656 616.5856406460551
+ vertex 180.55447913812478 -68.99369780607854 616.7454813220626
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.1025975503406 -70.98664256999665 617.0000000000001
+ vertex 180.55447913812478 -68.99369780607854 616.7454813220626
+ vertex 180.91310932699201 -68.78664256999652 616.8000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.1025975503406 -70.98664256999665 617.0000000000001
+ vertex 180.91310932699201 -68.78664256999652 616.8000000000001
+ vertex 182.7023398115333 -67.75362986810428 616.9
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.1025975503406 -70.98664256999665 617.0000000000001
+ vertex 182.7023398115333 -67.75362986810428 616.9
+ vertex 177.44900771185436 -70.78664256999664 617.0000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 171.21362480460616 -74.38664256999633 599.2
+ vertex 170.86721464309232 -74.58664256999629 597.8000000000001
+ vertex 171.2136248046061 -74.38664256999624 597.8000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.86721464309232 -74.58664256999629 597.8000000000001
+ vertex 171.21362480460616 -74.38664256999633 599.2
+ vertex 167.76174321682183 -76.37958733391434 598.0545186779375
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.86721464309232 -74.58664256999629 597.8000000000001
+ vertex 167.76174321682183 -76.37958733391434 598.0545186779375
+ vertex 167.40311302795465 -76.58664256999637 598.0000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.86721464309232 -74.58664256999629 597.8000000000001
+ vertex 167.40311302795465 -76.58664256999637 598.0000000000001
+ vertex 165.61388254341333 -77.61965527188865 597.9000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 167.76174321682183 -76.37958733391434 598.0545186779375
+ vertex 171.21362480460616 -74.38664256999633 599.2
+ vertex 168.0959333509822 -76.18664256999637 598.2143593539449
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.0959333509822 -76.18664256999637 598.2143593539449
+ vertex 171.21362480460616 -74.38664256999633 599.2
+ vertex 168.38290892506788 -76.0209571450471 598.4686291501016
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.38290892506788 -76.0209571450471 598.4686291501016
+ vertex 171.21362480460616 -74.38664256999633 599.2
+ vertex 168.60311302795463 -75.89382224696875 598.8000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.60311302795463 -75.89382224696875 598.8000000000001
+ vertex 171.21362480460616 -74.38664256999633 599.2
+ vertex 168.7415391139352 -75.81390190896514 599.185889527836
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.7415391139352 -75.81390190896514 599.185889527836
+ vertex 171.21362480460616 -74.38664256999633 599.2
+ vertex 169.30836891628041 -75.48664256999639 599.2
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.7415391139352 -75.81390190896514 599.185889527836
+ vertex 169.30836891628041 -75.48664256999639 599.2
+ vertex 168.7887536740098 -75.78664256999642 599.6
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.7887536740098 -75.78664256999642 599.6
+ vertex 169.30836891628041 -75.48664256999639 599.2
+ vertex 169.30836891628041 -75.48664256999639 601.2343145750508
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.7887536740098 -75.78664256999642 599.6
+ vertex 169.30836891628041 -75.48664256999639 601.2343145750508
+ vertex 168.7415391139352 -75.81390190896518 600.0141104721641
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.7415391139352 -75.81390190896518 600.0141104721641
+ vertex 169.30836891628041 -75.48664256999639 601.2343145750508
+ vertex 168.60311302795472 -75.8938222469689 600.4000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.60311302795472 -75.8938222469689 600.4000000000001
+ vertex 169.30836891628041 -75.48664256999639 601.2343145750508
+ vertex 168.38290892506797 -76.02095714504716 600.7313708498986
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.38290892506797 -76.02095714504716 600.7313708498986
+ vertex 169.30836891628041 -75.48664256999639 601.2343145750508
+ vertex 168.09593335098222 -76.18664256999647 600.9856406460551
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.09593335098222 -76.18664256999647 600.9856406460551
+ vertex 169.30836891628041 -75.48664256999639 601.2343145750508
+ vertex 167.76174321682188 -76.37958733391439 601.1454813220626
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 167.76174321682188 -76.37958733391439 601.1454813220626
+ vertex 169.30836891628041 -75.48664256999639 601.2343145750508
+ vertex 167.40311302795465 -76.58664256999641 601.2
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 167.056702866441 -76.78664256999654 604.0000000000001
+ vertex 165.84426730114285 -77.48664256999662 603.6
+ vertex 167.05670286644096 -76.78664256999646 601.8000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.84426730114285 -77.48664256999662 603.6
+ vertex 167.056702866441 -76.78664256999654 604.0000000000001
+ vertex 165.84426730114282 -77.48664256999658 604.0000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 167.40311302795465 -76.58664256999637 598.0000000000001
+ vertex 165.52736623967553 -77.66960548314098 598.1411809548975
+ vertex 165.61388254341333 -77.61965527188865 597.9000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.52736623967553 -77.66960548314098 598.1411809548975
+ vertex 167.40311302795465 -76.58664256999637 598.0000000000001
+ vertex 167.04448283908746 -76.79369780607836 598.0545186779375
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.52736623967553 -77.66960548314098 598.1411809548975
+ vertex 167.04448283908746 -76.79369780607836 598.0545186779375
+ vertex 166.71029270492707 -76.98664256999636 598.2143593539449
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.52736623967553 -77.66960548314098 598.1411809548975
+ vertex 166.71029270492707 -76.98664256999636 598.2143593539449
+ vertex 165.49785713962896 -77.68664256999648 598.4000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.49785713962896 -77.68664256999648 598.4000000000001
+ vertex 166.71029270492707 -76.98664256999636 598.2143593539449
+ vertex 166.42331713084138 -77.15232799494558 598.4686291501016
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.49785713962896 -77.68664256999648 598.4000000000001
+ vertex 166.42331713084138 -77.15232799494558 598.4686291501016
+ vertex 166.20311302795469 -77.27946289302398 598.8
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.49785713962896 -77.68664256999648 598.4000000000001
+ vertex 166.20311302795469 -77.27946289302398 598.8
+ vertex 166.06468694197423 -77.35938323102775 599.185889527836
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.49785713962896 -77.68664256999648 598.4000000000001
+ vertex 166.06468694197423 -77.35938323102775 599.185889527836
+ vertex 165.497857139629 -77.68664256999662 603.6
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.497857139629 -77.68664256999662 603.6
+ vertex 166.06468694197423 -77.35938323102775 599.185889527836
+ vertex 166.01747238189964 -77.38664256999651 599.6
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.497857139629 -77.68664256999662 603.6
+ vertex 166.01747238189964 -77.38664256999651 599.6
+ vertex 166.06468694197423 -77.35938323102775 600.014110472164
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.497857139629 -77.68664256999662 603.6
+ vertex 166.06468694197423 -77.35938323102775 600.014110472164
+ vertex 166.20311302795469 -77.27946289302402 600.4000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.497857139629 -77.68664256999662 603.6
+ vertex 166.20311302795469 -77.27946289302402 600.4000000000001
+ vertex 166.42331713084147 -77.15232799494576 600.7313708498986
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.497857139629 -77.68664256999662 603.6
+ vertex 166.42331713084147 -77.15232799494576 600.7313708498986
+ vertex 166.71029270492716 -76.98664256999646 600.9856406460551
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.497857139629 -77.68664256999662 603.6
+ vertex 166.71029270492716 -76.98664256999646 600.9856406460551
+ vertex 167.04448283908746 -76.79369780607848 601.1454813220626
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.497857139629 -77.68664256999662 603.6
+ vertex 167.04448283908746 -76.79369780607848 601.1454813220626
+ vertex 167.40311302795465 -76.58664256999641 601.2
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.497857139629 -77.68664256999662 603.6
+ vertex 167.40311302795465 -76.58664256999641 601.2
+ vertex 167.05670286644096 -76.78664256999646 601.8000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 167.05670286644096 -76.78664256999646 601.8000000000001
+ vertex 167.40311302795465 -76.58664256999641 601.2
+ vertex 169.30836891628041 -75.48664256999639 601.2343145750508
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 167.05670286644096 -76.78664256999646 601.8000000000001
+ vertex 169.30836891628041 -75.48664256999639 601.2343145750508
+ vertex 168.81847096772384 -75.76948528247111 601.8000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.497857139629 -77.68664256999662 603.6
+ vertex 167.05670286644096 -76.78664256999646 601.8000000000001
+ vertex 165.84426730114285 -77.48664256999662 603.6
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.5274686809366 -69.58664256999607 599.6
+ vertex 179.00785343866596 -69.88664256999604 599.2
+ vertex 179.57468324101123 -69.55938323102731 599.185889527836
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.00785343866596 -69.88664256999604 599.2
+ vertex 179.5274686809366 -69.58664256999607 599.6
+ vertex 179.00785343866602 -69.88664256999613 601.2343145750508
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.00785343866602 -69.88664256999613 601.2343145750508
+ vertex 179.5274686809366 -69.58664256999607 599.6
+ vertex 179.57468324101123 -69.55938323102735 600.0141104721641
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.00785343866602 -69.88664256999613 601.2343145750508
+ vertex 179.57468324101123 -69.55938323102735 600.0141104721641
+ vertex 179.71310932699174 -69.47946289302364 600.4000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.00785343866602 -69.88664256999613 601.2343145750508
+ vertex 179.71310932699174 -69.47946289302364 600.4000000000001
+ vertex 179.93331342987847 -69.35232799494533 600.7313708498986
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.00785343866602 -69.88664256999613 601.2343145750508
+ vertex 179.93331342987847 -69.35232799494533 600.7313708498986
+ vertex 180.2202890039642 -69.18664256999611 600.9856406460552
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.00785343866602 -69.88664256999613 601.2343145750508
+ vertex 180.2202890039642 -69.18664256999611 600.9856406460552
+ vertex 180.55447913812455 -68.99369780607815 601.1454813220626
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.00785343866602 -69.88664256999613 601.2343145750508
+ vertex 180.55447913812455 -68.99369780607815 601.1454813220626
+ vertex 180.91310932699167 -68.78664256999602 601.2
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.176483679575 -68.05723304744467 597.434074173711
+ vertex 177.44900771185397 -70.7866425699961 597.4
+ vertex 181.952339811533 -68.18664256999588 597.4
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.44900771185397 -70.7866425699961 597.4
+ vertex 182.176483679575 -68.05723304744467 597.434074173711
+ vertex 177.44900771185388 -70.78664256999606 597.8000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.44900771185388 -70.78664256999606 597.8000000000001
+ vertex 182.176483679575 -68.05723304744467 597.434074173711
+ vertex 182.38535251342523 -67.93664256999594 597.5339745962156
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.44900771185388 -70.78664256999606 597.8000000000001
+ vertex 182.38535251342523 -67.93664256999594 597.5339745962156
+ vertex 182.5647122472288 -67.83308917940268 597.6928932188135
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.44900771185388 -70.78664256999606 597.8000000000001
+ vertex 182.5647122472288 -67.83308917940268 597.6928932188135
+ vertex 182.702339811533 -67.75362986810374 597.9
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.44900771185388 -70.78664256999606 597.8000000000001
+ vertex 182.702339811533 -67.75362986810374 597.9
+ vertex 177.10259755034016 -70.9866425699961 597.8000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.10259755034016 -70.9866425699961 597.8000000000001
+ vertex 182.702339811533 -67.75362986810374 597.9
+ vertex 180.91310932699176 -68.78664256999598 598.0000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.10259755034016 -70.9866425699961 597.8000000000001
+ vertex 180.91310932699176 -68.78664256999598 598.0000000000001
+ vertex 180.5544791381245 -68.993697806078 598.0545186779376
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.10259755034016 -70.9866425699961 597.8000000000001
+ vertex 180.5544791381245 -68.993697806078 598.0545186779376
+ vertex 177.10259755034025 -70.9866425699961 599.2
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.10259755034025 -70.9866425699961 599.2
+ vertex 180.5544791381245 -68.993697806078 598.0545186779376
+ vertex 180.22028900396415 -69.18664256999598 598.2143593539449
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.10259755034025 -70.9866425699961 599.2
+ vertex 180.22028900396415 -69.18664256999598 598.2143593539449
+ vertex 179.9333134298784 -69.35232799494524 598.4686291501016
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.10259755034025 -70.9866425699961 599.2
+ vertex 179.9333134298784 -69.35232799494524 598.4686291501016
+ vertex 179.71310932699174 -69.4794628930236 598.8000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.10259755034025 -70.9866425699961 599.2
+ vertex 179.71310932699174 -69.4794628930236 598.8000000000001
+ vertex 179.57468324101123 -69.55938323102731 599.185889527836
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.10259755034025 -70.9866425699961 599.2
+ vertex 179.57468324101123 -69.55938323102731 599.185889527836
+ vertex 179.00785343866596 -69.88664256999604 599.2
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.86721464309238 -74.58664256999629 597.4
+ vertex 166.13973867537132 -77.31605209254764 597.434074173711
+ vertex 166.36388254341333 -77.18664256999637 597.4
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 166.13973867537132 -77.31605209254764 597.434074173711
+ vertex 170.86721464309238 -74.58664256999629 597.4
+ vertex 170.86721464309232 -74.58664256999629 597.8000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 166.13973867537132 -77.31605209254764 597.434074173711
+ vertex 170.86721464309232 -74.58664256999629 597.8000000000001
+ vertex 165.93086984152112 -77.43664256999635 597.5339745962156
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.93086984152112 -77.43664256999635 597.5339745962156
+ vertex 170.86721464309232 -74.58664256999629 597.8000000000001
+ vertex 165.75151010771754 -77.54019596058967 597.6928932188135
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.75151010771754 -77.54019596058967 597.6928932188135
+ vertex 170.86721464309232 -74.58664256999629 597.8000000000001
+ vertex 165.61388254341333 -77.61965527188865 597.9000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.78885611527082 -67.70367965685142 598.1411809548975
+ vertex 180.91310932699176 -68.78664256999598 598.0000000000001
+ vertex 182.702339811533 -67.75362986810374 597.9
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 180.91310932699176 -68.78664256999598 598.0000000000001
+ vertex 182.78885611527082 -67.70367965685142 598.1411809548975
+ vertex 181.27173951585888 -68.57958733391395 598.0545186779376
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.27173951585888 -68.57958733391395 598.0545186779376
+ vertex 182.78885611527082 -67.70367965685142 598.1411809548975
+ vertex 181.60592965001928 -68.38664256999598 598.2143593539449
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.60592965001928 -68.38664256999598 598.2143593539449
+ vertex 182.78885611527082 -67.70367965685142 598.1411809548975
+ vertex 182.81836521531739 -67.68664256999595 598.4000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.60592965001928 -68.38664256999598 598.2143593539449
+ vertex 182.81836521531739 -67.68664256999595 598.4000000000001
+ vertex 181.89290522410494 -68.22095714504667 598.4686291501016
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.89290522410494 -68.22095714504667 598.4686291501016
+ vertex 182.81836521531739 -67.68664256999595 598.4000000000001
+ vertex 182.11310932699166 -68.09382224696837 598.8000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.11310932699166 -68.09382224696837 598.8000000000001
+ vertex 182.81836521531739 -67.68664256999595 598.4000000000001
+ vertex 182.25153541297217 -68.0139019089647 599.185889527836
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.25153541297217 -68.0139019089647 599.185889527836
+ vertex 182.81836521531739 -67.68664256999595 598.4000000000001
+ vertex 182.81836521531753 -67.68664256999614 603.6
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.25153541297217 -68.0139019089647 599.185889527836
+ vertex 182.81836521531753 -67.68664256999614 603.6
+ vertex 182.29874997304677 -67.98664256999594 599.6
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.29874997304677 -67.98664256999594 599.6
+ vertex 182.81836521531753 -67.68664256999614 603.6
+ vertex 182.25153541297223 -68.01390190896478 600.0141104721641
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.25153541297223 -68.01390190896478 600.0141104721641
+ vertex 182.81836521531753 -67.68664256999614 603.6
+ vertex 182.1131093269917 -68.09382224696841 600.4000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.1131093269917 -68.09382224696841 600.4000000000001
+ vertex 182.81836521531753 -67.68664256999614 603.6
+ vertex 181.89290522410496 -68.22095714504681 600.7313708498986
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.89290522410496 -68.22095714504681 600.7313708498986
+ vertex 182.81836521531753 -67.68664256999614 603.6
+ vertex 181.60592965001933 -68.38664256999607 600.9856406460552
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.60592965001933 -68.38664256999607 600.9856406460552
+ vertex 182.81836521531753 -67.68664256999614 603.6
+ vertex 181.27173951585894 -68.57958733391399 601.1454813220626
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.27173951585894 -68.57958733391399 601.1454813220626
+ vertex 182.81836521531753 -67.68664256999614 603.6
+ vertex 180.91310932699167 -68.78664256999602 601.2
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 180.91310932699167 -68.78664256999602 601.2
+ vertex 182.81836521531753 -67.68664256999614 603.6
+ vertex 181.25951948850556 -68.58664256999612 601.8000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 180.91310932699167 -68.78664256999602 601.2
+ vertex 181.25951948850556 -68.58664256999612 601.8000000000001
+ vertex 179.00785343866602 -69.88664256999613 601.2343145750508
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.25951948850556 -68.58664256999612 601.8000000000001
+ vertex 182.81836521531753 -67.68664256999614 603.6
+ vertex 182.47195505380378 -67.88664256999614 603.6
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.25951948850556 -68.58664256999612 601.8000000000001
+ vertex 182.47195505380378 -67.88664256999614 603.6
+ vertex 181.25951948850556 -68.58664256999616 604.0000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.25951948850556 -68.58664256999616 604.0000000000001
+ vertex 182.47195505380378 -67.88664256999614 603.6
+ vertex 182.47195505380373 -67.88664256999614 604.0
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.36240517147576 -70.83664256999646 610.5343145750509
+ vertex 176.8725072229191 -71.11948528247113 611.1
+ vertex 171.4437151320277 -74.25379985752207 611.1
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 176.8725072229191 -71.11948528247113 611.1
+ vertex 177.36240517147576 -70.83664256999646 610.5343145750509
+ vertex 179.4977513872229 -69.60379985752186 613.0000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 176.8725072229191 -71.11948528247113 611.1
+ vertex 179.4977513872229 -69.60379985752186 613.0000000000001
+ vertex 179.0078534386662 -69.8866425699965 613.5656854249493
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.47195505380387 -67.88664256999631 611.2
+ vertex 181.25951948850567 -68.58664256999634 610.8000000000001
+ vertex 182.47195505380387 -67.88664256999627 610.8000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.25951948850567 -68.58664256999634 610.8000000000001
+ vertex 182.47195505380387 -67.88664256999631 611.2
+ vertex 181.2595194885057 -68.58664256999639 613.0000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.36240517147564 -70.83664256999627 604.2656854249493
+ vertex 174.76329962118672 -72.33723685910793 604.7920002690196
+ vertex 174.15811117747327 -72.68664256999635 604.7
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 174.76329962118672 -72.33723685910793 604.7920002690196
+ vertex 177.36240517147564 -70.83664256999627 604.2656854249493
+ vertex 175.32724547258226 -72.01164256999633 605.061731409782
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 175.32724547258226 -72.01164256999633 605.061731409782
+ vertex 177.36240517147564 -70.83664256999627 604.2656854249493
+ vertex 175.81151675385192 -71.73204841539449 605.4908116907964
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 175.81151675385192 -71.73204841539449 605.4908116907964
+ vertex 177.36240517147564 -70.83664256999627 604.2656854249493
+ vertex 176.1831111774733 -71.51750827488736 606.0500000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 176.1831111774733 -71.51750827488736 606.0500000000001
+ vertex 177.36240517147564 -70.83664256999627 604.2656854249493
+ vertex 176.4167051975654 -71.38264270450611 606.7011885782233
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 176.4167051975654 -71.38264270450611 606.7011885782233
+ vertex 177.36240517147564 -70.83664256999627 604.2656854249493
+ vertex 177.36240517147576 -70.83664256999646 610.5343145750509
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 176.4167051975654 -71.38264270450611 606.7011885782233
+ vertex 177.36240517147576 -70.83664256999646 610.5343145750509
+ vertex 176.49637976769128 -71.33664256999639 607.4
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 176.49637976769128 -71.33664256999639 607.4
+ vertex 177.36240517147576 -70.83664256999646 610.5343145750509
+ vertex 176.41670519756536 -71.38264270450611 608.0988114217769
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 176.41670519756536 -71.38264270450611 608.0988114217769
+ vertex 177.36240517147576 -70.83664256999646 610.5343145750509
+ vertex 176.18311117747334 -71.51750827488746 608.7500000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 176.18311117747334 -71.51750827488746 608.7500000000001
+ vertex 177.36240517147576 -70.83664256999646 610.5343145750509
+ vertex 175.81151675385203 -71.73204841539467 609.3091883092037
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 175.81151675385203 -71.73204841539467 609.3091883092037
+ vertex 177.36240517147576 -70.83664256999646 610.5343145750509
+ vertex 175.3272454725823 -72.01164256999647 609.738268590218
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 175.3272454725823 -72.01164256999647 609.738268590218
+ vertex 177.36240517147576 -70.83664256999646 610.5343145750509
+ vertex 174.76329962118686 -72.33723685910816 610.0079997309805
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 174.76329962118686 -72.33723685910816 610.0079997309805
+ vertex 177.36240517147576 -70.83664256999646 610.5343145750509
+ vertex 174.15811117747336 -72.68664256999658 610.1
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 174.15811117747336 -72.68664256999658 610.1
+ vertex 177.36240517147576 -70.83664256999646 610.5343145750509
+ vertex 170.953817183471 -74.53664256999662 610.5343145750508
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.953817183471 -74.53664256999662 610.5343145750508
+ vertex 177.36240517147576 -70.83664256999646 610.5343145750509
+ vertex 171.4437151320277 -74.25379985752207 611.1
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.953817183471 -74.53664256999662 610.5343145750508
+ vertex 171.4437151320277 -74.25379985752207 611.1
+ vertex 168.818470967724 -75.76948528247138 613.0
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.818470967724 -75.76948528247138 613.0
+ vertex 171.4437151320277 -74.25379985752207 611.1
+ vertex 169.30836891628067 -75.4866425699968 613.5656854249493
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.818470967724 -75.76948528247138 613.0
+ vertex 169.30836891628067 -75.4866425699968 613.5656854249493
+ vertex 167.05670286644116 -76.78664256999681 613.0
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 171.21362480460647 -74.38664256999682 617.0000000000001
+ vertex 169.30836891628067 -75.48664256999685 615.6
+ vertex 171.21362480460644 -74.38664256999678 615.6
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 169.30836891628067 -75.48664256999685 615.6
+ vertex 171.21362480460647 -74.38664256999682 617.0000000000001
+ vertex 168.7415391139354 -75.81390190896563 615.6141104721642
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.7415391139354 -75.81390190896563 615.6141104721642
+ vertex 171.21362480460647 -74.38664256999682 617.0000000000001
+ vertex 168.60311302795498 -75.89382224696925 616.0
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.60311302795498 -75.89382224696925 616.0
+ vertex 171.21362480460647 -74.38664256999682 617.0000000000001
+ vertex 168.38290892506828 -76.0209571450477 616.3313708498986
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.38290892506828 -76.0209571450477 616.3313708498986
+ vertex 171.21362480460647 -74.38664256999682 617.0000000000001
+ vertex 168.09593335098253 -76.1866425699969 616.5856406460551
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.09593335098253 -76.1866425699969 616.5856406460551
+ vertex 171.21362480460647 -74.38664256999682 617.0000000000001
+ vertex 167.76174321682217 -76.37958733391493 616.7454813220626
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 167.76174321682217 -76.37958733391493 616.7454813220626
+ vertex 171.21362480460647 -74.38664256999682 617.0000000000001
+ vertex 167.40311302795496 -76.58664256999695 616.8000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 167.40311302795496 -76.58664256999695 616.8000000000001
+ vertex 171.21362480460647 -74.38664256999682 617.0000000000001
+ vertex 165.6138825434137 -77.6196552718892 616.9
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.6138825434137 -77.6196552718892 616.9
+ vertex 171.21362480460647 -74.38664256999682 617.0000000000001
+ vertex 170.86721464309267 -74.58664256999687 617.0000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.6138825434137 -77.6196552718892 616.9
+ vertex 170.86721464309267 -74.58664256999687 617.0000000000001
+ vertex 165.75151010771788 -77.54019596059021 617.1071067811866
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.75151010771788 -77.54019596059021 617.1071067811866
+ vertex 170.86721464309267 -74.58664256999687 617.0000000000001
+ vertex 170.86721464309272 -74.58664256999687 617.4000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.75151010771788 -77.54019596059021 617.1071067811866
+ vertex 170.86721464309272 -74.58664256999687 617.4000000000001
+ vertex 165.93086984152154 -77.43664256999703 617.2660254037845
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.93086984152154 -77.43664256999703 617.2660254037845
+ vertex 170.86721464309272 -74.58664256999687 617.4000000000001
+ vertex 166.1397386753717 -77.31605209254826 617.3659258262891
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 166.1397386753717 -77.31605209254826 617.3659258262891
+ vertex 170.86721464309272 -74.58664256999687 617.4000000000001
+ vertex 166.3638825434137 -77.186642569997 617.4000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 167.05670286644116 -76.78664256999681 613.0
+ vertex 165.8442673011429 -77.4866425699968 610.8000000000001
+ vertex 167.0567028664411 -76.78664256999677 610.8000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.8442673011429 -77.4866425699968 610.8000000000001
+ vertex 167.05670286644116 -76.78664256999681 613.0
+ vertex 165.8442673011429 -77.48664256999685 611.2
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.8442673011429 -77.48664256999685 611.2
+ vertex 167.05670286644116 -76.78664256999681 613.0
+ vertex 165.49785713962922 -77.68664256999683 611.2
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.49785713962922 -77.68664256999683 611.2
+ vertex 167.05670286644116 -76.78664256999681 613.0
+ vertex 166.20311302795494 -77.27946289302439 614.4000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.49785713962922 -77.68664256999683 611.2
+ vertex 166.20311302795494 -77.27946289302439 614.4000000000001
+ vertex 166.0646869419745 -77.35938323102815 614.785889527836
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.49785713962922 -77.68664256999683 611.2
+ vertex 166.0646869419745 -77.35938323102815 614.785889527836
+ vertex 165.4978571396293 -77.68664256999702 616.4000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 166.20311302795494 -77.27946289302439 614.4000000000001
+ vertex 167.05670286644116 -76.78664256999681 613.0
+ vertex 166.42331713084167 -77.15232799494612 614.0686291501015
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 166.42331713084167 -77.15232799494612 614.0686291501015
+ vertex 167.05670286644116 -76.78664256999681 613.0
+ vertex 166.71029270492738 -76.98664256999686 613.814359353945
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 166.71029270492738 -76.98664256999686 613.814359353945
+ vertex 167.05670286644116 -76.78664256999681 613.0
+ vertex 167.04448283908772 -76.7936978060789 613.6545186779375
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 167.04448283908772 -76.7936978060789 613.6545186779375
+ vertex 167.05670286644116 -76.78664256999681 613.0
+ vertex 167.40311302795504 -76.58664256999687 613.6
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 167.40311302795504 -76.58664256999687 613.6
+ vertex 167.05670286644116 -76.78664256999681 613.0
+ vertex 169.30836891628067 -75.4866425699968 613.5656854249493
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.4978571396293 -77.68664256999702 616.4000000000001
+ vertex 166.0646869419745 -77.35938323102815 614.785889527836
+ vertex 166.01747238189986 -77.38664256999687 615.2
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.4978571396293 -77.68664256999702 616.4000000000001
+ vertex 166.01747238189986 -77.38664256999687 615.2
+ vertex 166.06468694197446 -77.35938323102819 615.6141104721642
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.4978571396293 -77.68664256999702 616.4000000000001
+ vertex 166.06468694197446 -77.35938323102819 615.6141104721642
+ vertex 166.203113027955 -77.27946289302443 616.0
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.4978571396293 -77.68664256999702 616.4000000000001
+ vertex 166.203113027955 -77.27946289302443 616.0
+ vertex 166.4233171308417 -77.15232799494622 616.3313708498985
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.4978571396293 -77.68664256999702 616.4000000000001
+ vertex 166.4233171308417 -77.15232799494622 616.3313708498985
+ vertex 166.71029270492744 -76.98664256999696 616.5856406460551
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.4978571396293 -77.68664256999702 616.4000000000001
+ vertex 166.71029270492744 -76.98664256999696 616.5856406460551
+ vertex 165.52736623967584 -77.66960548314148 616.6588190451026
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.52736623967584 -77.66960548314148 616.6588190451026
+ vertex 166.71029270492744 -76.98664256999696 616.5856406460551
+ vertex 167.0444828390878 -76.79369780607902 616.7454813220626
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.52736623967584 -77.66960548314148 616.6588190451026
+ vertex 167.0444828390878 -76.79369780607902 616.7454813220626
+ vertex 165.6138825434137 -77.6196552718892 616.9
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.6138825434137 -77.6196552718892 616.9
+ vertex 167.0444828390878 -76.79369780607902 616.7454813220626
+ vertex 167.40311302795496 -76.58664256999695 616.8000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 169.30836891628067 -75.4866425699968 613.5656854249493
+ vertex 167.76174321682214 -76.37958733391474 613.6545186779375
+ vertex 167.40311302795504 -76.58664256999687 613.6
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 167.76174321682214 -76.37958733391474 613.6545186779375
+ vertex 169.30836891628067 -75.4866425699968 613.5656854249493
+ vertex 168.09593335098253 -76.18664256999686 613.814359353945
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.09593335098253 -76.18664256999686 613.814359353945
+ vertex 169.30836891628067 -75.4866425699968 613.5656854249493
+ vertex 168.3829089250682 -76.02095714504752 614.0686291501016
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.3829089250682 -76.02095714504752 614.0686291501016
+ vertex 169.30836891628067 -75.4866425699968 613.5656854249493
+ vertex 168.60311302795495 -75.89382224696925 614.4000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.60311302795495 -75.89382224696925 614.4000000000001
+ vertex 169.30836891628067 -75.4866425699968 613.5656854249493
+ vertex 169.30836891628067 -75.48664256999685 615.6
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.60311302795495 -75.89382224696925 614.4000000000001
+ vertex 169.30836891628067 -75.48664256999685 615.6
+ vertex 168.7415391139355 -75.81390190896563 614.785889527836
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.7415391139355 -75.81390190896563 614.785889527836
+ vertex 169.30836891628067 -75.48664256999685 615.6
+ vertex 168.78875367401002 -75.78664256999677 615.2
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.78875367401002 -75.78664256999677 615.2
+ vertex 169.30836891628067 -75.48664256999685 615.6
+ vertex 168.7415391139354 -75.81390190896563 615.6141104721642
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.00785343866602 -69.88664256999613 601.2343145750508
+ vertex 179.49775138722262 -69.60379985752151 601.8000000000001
+ vertex 176.87250722291898 -71.11948528247086 603.7
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.49775138722262 -69.60379985752151 601.8000000000001
+ vertex 179.00785343866602 -69.88664256999613 601.2343145750508
+ vertex 181.25951948850556 -68.58664256999612 601.8000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 176.87250722291898 -71.11948528247086 603.7
+ vertex 179.49775138722262 -69.60379985752151 601.8000000000001
+ vertex 177.36240517147564 -70.83664256999627 604.2656854249493
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 176.87250722291898 -71.11948528247086 603.7
+ vertex 177.36240517147564 -70.83664256999627 604.2656854249493
+ vertex 171.4437151320275 -74.25379985752176 603.7
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 171.4437151320275 -74.25379985752176 603.7
+ vertex 177.36240517147564 -70.83664256999627 604.2656854249493
+ vertex 170.9538171834709 -74.53664256999643 604.2656854249493
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.9538171834709 -74.53664256999643 604.2656854249493
+ vertex 177.36240517147564 -70.83664256999627 604.2656854249493
+ vertex 174.15811117747327 -72.68664256999635 604.7
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.9538171834709 -74.53664256999643 604.2656854249493
+ vertex 174.15811117747327 -72.68664256999635 604.7
+ vertex 173.55292273375986 -73.03604828088481 604.7920002690196
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.9538171834709 -74.53664256999643 604.2656854249493
+ vertex 173.55292273375986 -73.03604828088481 604.7920002690196
+ vertex 172.98897688236434 -73.36164256999642 605.061731409782
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.9538171834709 -74.53664256999643 604.2656854249493
+ vertex 172.98897688236434 -73.36164256999642 605.061731409782
+ vertex 172.50470560109466 -73.64123672459827 605.4908116907964
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.9538171834709 -74.53664256999643 604.2656854249493
+ vertex 172.50470560109466 -73.64123672459827 605.4908116907964
+ vertex 172.13311117747335 -73.85577686510548 606.0500000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.9538171834709 -74.53664256999643 604.2656854249493
+ vertex 172.13311117747335 -73.85577686510548 606.0500000000001
+ vertex 171.89951715738127 -73.99064243548673 606.7011885782233
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.9538171834709 -74.53664256999643 604.2656854249493
+ vertex 171.89951715738127 -73.99064243548673 606.7011885782233
+ vertex 170.953817183471 -74.53664256999662 610.5343145750508
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.953817183471 -74.53664256999662 610.5343145750508
+ vertex 171.89951715738127 -73.99064243548673 606.7011885782233
+ vertex 171.81984258725538 -74.03664256999654 607.4000000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.953817183471 -74.53664256999662 610.5343145750508
+ vertex 171.81984258725538 -74.03664256999654 607.4000000000001
+ vertex 171.89951715738135 -73.99064243548682 608.0988114217769
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.953817183471 -74.53664256999662 610.5343145750508
+ vertex 171.89951715738135 -73.99064243548682 608.0988114217769
+ vertex 172.13311117747338 -73.85577686510553 608.7500000000001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.953817183471 -74.53664256999662 610.5343145750508
+ vertex 172.13311117747338 -73.85577686510553 608.7500000000001
+ vertex 172.5047056010948 -73.64123672459844 609.3091883092037
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.953817183471 -74.53664256999662 610.5343145750508
+ vertex 172.5047056010948 -73.64123672459844 609.3091883092037
+ vertex 172.98897688236445 -73.3616425699966 609.7382685902181
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.953817183471 -74.53664256999662 610.5343145750508
+ vertex 172.98897688236445 -73.3616425699966 609.7382685902181
+ vertex 173.55292273376 -73.036048280885 610.0079997309805
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.953817183471 -74.53664256999662 610.5343145750508
+ vertex 173.55292273376 -73.036048280885 610.0079997309805
+ vertex 174.15811117747336 -72.68664256999658 610.1
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 171.4437151320275 -74.25379985752176 603.7
+ vertex 168.81847096772384 -75.76948528247111 601.8000000000001
+ vertex 169.30836891628041 -75.48664256999639 601.2343145750508
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.81847096772384 -75.76948528247111 601.8000000000001
+ vertex 171.4437151320275 -74.25379985752176 603.7
+ vertex 170.9538171834709 -74.53664256999643 604.2656854249493
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 17.044482839088413 183.01392332925178 613.6545186779376
+ vertex 17.761743216822868 183.42803380141584 613.6545186779376
+ vertex 17.403113027955648 183.2209785653338 613.6000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 17.761743216822868 183.42803380141584 613.6545186779376
+ vertex 17.044482839088413 183.01392332925178 613.6545186779376
+ vertex 16.710292704928097 182.8209785653338 613.814359353945
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 17.761743216822868 183.42803380141584 613.6545186779376
+ vertex 16.710292704928097 182.8209785653338 613.814359353945
+ vertex 18.095933350983174 183.62097856533384 613.814359353945
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.095933350983174 183.62097856533384 613.814359353945
+ vertex 16.710292704928097 182.8209785653338 613.814359353945
+ vertex 16.423317130842396 182.6552931403845 614.0686291501016
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.095933350983174 183.62097856533384 613.814359353945
+ vertex 16.423317130842396 182.6552931403845 614.0686291501016
+ vertex 18.382908925068907 183.78666399028305 614.0686291501017
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.382908925068907 183.78666399028305 614.0686291501017
+ vertex 16.423317130842396 182.6552931403845 614.0686291501016
+ vertex 16.203113027955656 182.5281582423062 614.4000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.382908925068907 183.78666399028305 614.0686291501017
+ vertex 16.203113027955656 182.5281582423062 614.4000000000001
+ vertex 18.603113027955626 183.91379888836136 614.4000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.603113027955626 183.91379888836136 614.4000000000001
+ vertex 16.203113027955656 182.5281582423062 614.4000000000001
+ vertex 16.064686941975182 182.4482379043025 614.785889527836
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.603113027955626 183.91379888836136 614.4000000000001
+ vertex 16.064686941975182 182.4482379043025 614.785889527836
+ vertex 18.741539113936128 183.99371922636507 614.785889527836
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.741539113936128 183.99371922636507 614.785889527836
+ vertex 16.064686941975182 182.4482379043025 614.785889527836
+ vertex 16.01747238190058 182.4209785653337 615.2000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.741539113936128 183.99371922636507 614.785889527836
+ vertex 16.01747238190058 182.4209785653337 615.2000000000002
+ vertex 18.788753674010707 184.0209785653338 615.2000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.788753674010707 184.0209785653338 615.2000000000002
+ vertex 16.01747238190058 182.4209785653337 615.2000000000002
+ vertex 16.064686941975175 182.44823790430246 615.6141104721642
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.788753674010707 184.0209785653338 615.2000000000002
+ vertex 16.064686941975175 182.44823790430246 615.6141104721642
+ vertex 18.741539113936135 183.99371922636504 615.6141104721642
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.741539113936135 183.99371922636504 615.6141104721642
+ vertex 16.064686941975175 182.44823790430246 615.6141104721642
+ vertex 16.20311302795568 182.52815824230615 616.0000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.741539113936135 183.99371922636504 615.6141104721642
+ vertex 16.20311302795568 182.52815824230615 616.0000000000001
+ vertex 18.60311302795565 183.91379888836133 616.0000000000001
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.60311302795565 183.91379888836133 616.0000000000001
+ vertex 16.20311302795568 182.52815824230615 616.0000000000001
+ vertex 16.42331713084241 182.65529314038446 616.3313708498986
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.60311302795565 183.91379888836133 616.0000000000001
+ vertex 16.42331713084241 182.65529314038446 616.3313708498986
+ vertex 18.38290892506893 183.78666399028296 616.3313708498987
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.38290892506893 183.78666399028296 616.3313708498987
+ vertex 16.42331713084241 182.65529314038446 616.3313708498986
+ vertex 16.71029270492811 182.8209785653337 616.5856406460553
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.38290892506893 183.78666399028296 616.3313708498987
+ vertex 16.71029270492811 182.8209785653337 616.5856406460553
+ vertex 18.095933350983213 183.62097856533373 616.5856406460553
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.095933350983213 183.62097856533373 616.5856406460553
+ vertex 16.71029270492811 182.8209785653337 616.5856406460553
+ vertex 17.04448283908847 183.01392332925164 616.7454813220626
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.095933350983213 183.62097856533373 616.5856406460553
+ vertex 17.04448283908847 183.01392332925164 616.7454813220626
+ vertex 17.76174321682286 183.42803380141572 616.7454813220626
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 17.76174321682286 183.42803380141572 616.7454813220626
+ vertex 17.04448283908847 183.01392332925164 616.7454813220626
+ vertex 17.403113027955662 183.22097856533372 616.8000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.0475284100329 -70.98664256999788 -21.199999999999967
+ vertex -177.3939385715467 -70.78664256999794 -22.599999999999966
+ vertex -177.0475284100329 -70.98664256999795 -22.599999999999966
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.3939385715467 -70.78664256999794 -22.599999999999966
+ vertex -177.0475284100329 -70.98664256999788 -21.199999999999967
+ vertex -180.49940999781734 -68.99369780607998 -22.34548132206245
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.3939385715467 -70.78664256999794 -22.599999999999966
+ vertex -180.49940999781734 -68.99369780607998 -22.34548132206245
+ vertex -180.85804018668452 -68.786642569998 -22.399999999999945
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.3939385715467 -70.78664256999794 -22.599999999999966
+ vertex -180.85804018668452 -68.786642569998 -22.399999999999945
+ vertex -182.64727067122587 -67.75362986810585 -22.49999999999997
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -180.49940999781734 -68.99369780607998 -22.34548132206245
+ vertex -177.0475284100329 -70.98664256999788 -21.199999999999967
+ vertex -180.16521986365697 -69.186642569998 -22.18564064605505
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -180.16521986365697 -69.186642569998 -22.18564064605505
+ vertex -177.0475284100329 -70.98664256999788 -21.199999999999967
+ vertex -179.87824428957123 -69.35232799494719 -21.93137084989843
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.87824428957123 -69.35232799494719 -21.93137084989843
+ vertex -177.0475284100329 -70.98664256999788 -21.199999999999967
+ vertex -179.6580401866845 -69.4794628930255 -21.599999999999934
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.6580401866845 -69.4794628930255 -21.599999999999934
+ vertex -177.0475284100329 -70.98664256999788 -21.199999999999967
+ vertex -179.519614100704 -69.5593832310292 -21.21411047216397
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.519614100704 -69.5593832310292 -21.21411047216397
+ vertex -177.0475284100329 -70.98664256999788 -21.199999999999967
+ vertex -178.9527842983587 -69.88664256999793 -21.199999999999957
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.519614100704 -69.5593832310292 -21.21411047216397
+ vertex -178.9527842983587 -69.88664256999793 -21.199999999999957
+ vertex -179.47239954062937 -69.58664256999793 -20.799999999999937
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.47239954062937 -69.58664256999793 -20.799999999999937
+ vertex -178.9527842983587 -69.88664256999793 -21.199999999999957
+ vertex -178.95278429835867 -69.88664256999783 -19.165685424949217
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.47239954062937 -69.58664256999793 -20.799999999999937
+ vertex -178.95278429835867 -69.88664256999783 -19.165685424949217
+ vertex -179.51961410070396 -69.55938323102919 -20.385889527835904
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.51961410070396 -69.55938323102919 -20.385889527835904
+ vertex -178.95278429835867 -69.88664256999783 -19.165685424949217
+ vertex -179.6580401866845 -69.47946289302546 -19.99999999999994
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.6580401866845 -69.47946289302546 -19.99999999999994
+ vertex -178.95278429835867 -69.88664256999783 -19.165685424949217
+ vertex -179.87824428957117 -69.35232799494715 -19.668629150101474
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.87824428957117 -69.35232799494715 -19.668629150101474
+ vertex -178.95278429835867 -69.88664256999783 -19.165685424949217
+ vertex -180.1652198636569 -69.18664256999789 -19.414359353944835
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -180.1652198636569 -69.18664256999789 -19.414359353944835
+ vertex -178.95278429835867 -69.88664256999783 -19.165685424949217
+ vertex -180.49940999781722 -68.99369780607992 -19.254518677937423
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -180.49940999781722 -68.99369780607992 -19.254518677937423
+ vertex -178.95278429835867 -69.88664256999783 -19.165685424949217
+ vertex -180.8580401866844 -68.7866425699979 -19.19999999999993
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.08466953506374 -77.31605209254886 -22.965925826289016
+ vertex -170.8121455027849 -74.58664256999778 -22.999999999999954
+ vertex -166.30881340310577 -77.1866425699976 -22.999999999999954
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -170.8121455027849 -74.58664256999778 -22.999999999999954
+ vertex -166.08466953506374 -77.31605209254886 -22.965925826289016
+ vertex -170.81214550278483 -74.58664256999774 -22.599999999999955
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -170.81214550278483 -74.58664256999774 -22.599999999999955
+ vertex -166.08466953506374 -77.31605209254886 -22.965925826289016
+ vertex -165.8758007012135 -77.4366425699976 -22.866025403784388
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -170.81214550278483 -74.58664256999774 -22.599999999999955
+ vertex -165.8758007012135 -77.4366425699976 -22.866025403784388
+ vertex -165.69644096740987 -77.54019596059086 -22.7071067811865
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -170.81214550278483 -74.58664256999774 -22.599999999999955
+ vertex -165.69644096740987 -77.54019596059086 -22.7071067811865
+ vertex -165.5588134031057 -77.61965527188984 -22.49999999999995
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -170.81214550278483 -74.58664256999774 -22.599999999999955
+ vertex -165.5588134031057 -77.61965527188984 -22.49999999999995
+ vertex -171.15855566429863 -74.38664256999776 -22.59999999999996
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.15855566429863 -74.38664256999776 -22.59999999999996
+ vertex -165.5588134031057 -77.61965527188984 -22.49999999999995
+ vertex -167.34804388764704 -76.58664256999762 -22.399999999999952
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.15855566429863 -74.38664256999776 -22.59999999999996
+ vertex -167.34804388764704 -76.58664256999762 -22.399999999999952
+ vertex -167.70667407651428 -76.3795873339156 -22.345481322062458
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.15855566429863 -74.38664256999776 -22.59999999999996
+ vertex -167.70667407651428 -76.3795873339156 -22.345481322062458
+ vertex -171.1585556642986 -74.38664256999773 -21.19999999999996
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.1585556642986 -74.38664256999773 -21.19999999999996
+ vertex -167.70667407651428 -76.3795873339156 -22.345481322062458
+ vertex -168.0408642106746 -76.18664256999767 -22.185640646055052
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.1585556642986 -74.38664256999773 -21.19999999999996
+ vertex -168.0408642106746 -76.18664256999767 -22.185640646055052
+ vertex -168.32783978476033 -76.0209571450484 -21.931370849898414
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.1585556642986 -74.38664256999773 -21.19999999999996
+ vertex -168.32783978476033 -76.0209571450484 -21.931370849898414
+ vertex -168.54804388764705 -75.89382224697007 -21.599999999999945
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.1585556642986 -74.38664256999773 -21.19999999999996
+ vertex -168.54804388764705 -75.89382224697007 -21.599999999999945
+ vertex -168.68646997362754 -75.81390190896637 -21.21411047216398
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.1585556642986 -74.38664256999773 -21.19999999999996
+ vertex -168.68646997362754 -75.81390190896637 -21.21411047216398
+ vertex -169.2532997759728 -75.48664256999764 -21.199999999999946
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.2532997759728 -75.48664256999764 -21.199999999999946
+ vertex -168.68646997362754 -75.81390190896637 -21.21411047216398
+ vertex -168.73368453370216 -75.78664256999762 -20.799999999999926
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.2532997759728 -75.48664256999764 -21.199999999999946
+ vertex -168.73368453370216 -75.78664256999762 -20.799999999999926
+ vertex -169.25329977597275 -75.48664256999757 -19.165685424949185
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.25329977597275 -75.48664256999757 -19.165685424949185
+ vertex -168.73368453370216 -75.78664256999762 -20.799999999999926
+ vertex -168.6864699736275 -75.81390190896636 -20.385889527835893
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.25329977597275 -75.48664256999757 -19.165685424949185
+ vertex -168.6864699736275 -75.81390190896636 -20.385889527835893
+ vertex -168.54804388764703 -75.89382224697005 -19.999999999999925
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.25329977597275 -75.48664256999757 -19.165685424949185
+ vertex -168.54804388764703 -75.89382224697005 -19.999999999999925
+ vertex -168.32783978476027 -76.02095714504833 -19.668629150101452
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.25329977597275 -75.48664256999757 -19.165685424949185
+ vertex -168.32783978476027 -76.02095714504833 -19.668629150101452
+ vertex -168.04086421067453 -76.18664256999756 -19.41435935394484
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.25329977597275 -75.48664256999757 -19.165685424949185
+ vertex -168.04086421067453 -76.18664256999756 -19.41435935394484
+ vertex -167.7066740765142 -76.37958733391552 -19.254518677937433
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.25329977597275 -75.48664256999757 -19.165685424949185
+ vertex -167.7066740765142 -76.37958733391552 -19.254518677937433
+ vertex -167.34804388764698 -76.58664256999752 -19.19999999999996
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -165.44278799932096 -77.68664256999702 -3.999999999999939
+ vertex -165.7891981608348 -77.4866425699972 -9.19999999999993
+ vertex -165.44278799932104 -77.68664256999716 -9.19999999999993
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -165.7891981608348 -77.4866425699972 -9.19999999999993
+ vertex -165.44278799932096 -77.68664256999702 -3.999999999999939
+ vertex -166.00961780166625 -77.35938323102832 -5.614110472163994
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -165.7891981608348 -77.4866425699972 -9.19999999999993
+ vertex -166.00961780166625 -77.35938323102832 -5.614110472163994
+ vertex -166.14804388764674 -77.27946289302463 -5.999999999999961
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -165.7891981608348 -77.4866425699972 -9.19999999999993
+ vertex -166.14804388764674 -77.27946289302463 -5.999999999999961
+ vertex -167.00163372613304 -76.78664256999713 -7.399999999999959
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -167.00163372613304 -76.78664256999713 -7.399999999999959
+ vertex -166.14804388764674 -77.27946289302463 -5.999999999999961
+ vertex -166.3682479905335 -77.1523279949463 -6.331370849898432
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -167.00163372613304 -76.78664256999713 -7.399999999999959
+ vertex -166.3682479905335 -77.1523279949463 -6.331370849898432
+ vertex -166.65522356461923 -76.98664256999712 -6.58564064605507
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -167.00163372613304 -76.78664256999713 -7.399999999999959
+ vertex -166.65522356461923 -76.98664256999712 -6.58564064605507
+ vertex -166.98941369877954 -76.79369780607912 -6.745481322062464
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -167.00163372613304 -76.78664256999713 -7.399999999999959
+ vertex -166.98941369877954 -76.79369780607912 -6.745481322062464
+ vertex -168.76340182741595 -75.76948528247182 -7.399999999999961
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -168.76340182741595 -75.76948528247182 -7.399999999999961
+ vertex -166.98941369877954 -76.79369780607912 -6.745481322062464
+ vertex -167.34804388764678 -76.58664256999711 -6.799999999999959
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -168.76340182741595 -75.76948528247182 -7.399999999999961
+ vertex -167.34804388764678 -76.58664256999711 -6.799999999999959
+ vertex -169.25329977597258 -75.4866425699972 -6.834314575050704
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.00961780166625 -77.35938323102832 -5.614110472163994
+ vertex -165.44278799932096 -77.68664256999702 -3.999999999999939
+ vertex -165.96240324159163 -77.38664256999704 -5.199999999999962
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -165.96240324159163 -77.38664256999704 -5.199999999999962
+ vertex -165.44278799932096 -77.68664256999702 -3.999999999999939
+ vertex -166.00961780166622 -77.3593832310283 -4.785889527835931
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.00961780166622 -77.3593832310283 -4.785889527835931
+ vertex -165.44278799932096 -77.68664256999702 -3.999999999999939
+ vertex -166.1480438876467 -77.27946289302459 -4.399999999999964
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.1480438876467 -77.27946289302459 -4.399999999999964
+ vertex -165.44278799932096 -77.68664256999702 -3.999999999999939
+ vertex -166.36824799053343 -77.15232799494626 -4.068629150101493
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.36824799053343 -77.15232799494626 -4.068629150101493
+ vertex -165.44278799932096 -77.68664256999702 -3.999999999999939
+ vertex -166.65522356461915 -76.98664256999704 -3.8143593539448553
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.65522356461915 -76.98664256999704 -3.8143593539448553
+ vertex -165.44278799932096 -77.68664256999702 -3.999999999999939
+ vertex -165.47229709936755 -77.6696054831415 -3.7411809548974277
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.65522356461915 -76.98664256999704 -3.8143593539448553
+ vertex -165.47229709936755 -77.6696054831415 -3.7411809548974277
+ vertex -166.98941369877946 -76.79369780607902 -3.654518677937438
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.98941369877946 -76.79369780607902 -3.654518677937438
+ vertex -165.47229709936755 -77.6696054831415 -3.7411809548974277
+ vertex -165.55881340310538 -77.6196552718892 -3.49999999999994
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.98941369877946 -76.79369780607902 -3.654518677937438
+ vertex -165.55881340310538 -77.6196552718892 -3.49999999999994
+ vertex -167.3480438876467 -76.58664256999705 -3.599999999999943
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.25329977597258 -75.4866425699972 -6.834314575050704
+ vertex -168.5480438876468 -75.89382224696958 -5.999999999999941
+ vertex -169.25329977597252 -75.48664256999713 -4.799999999999966
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -168.5480438876468 -75.89382224696958 -5.999999999999941
+ vertex -169.25329977597258 -75.4866425699972 -6.834314575050704
+ vertex -168.32783978476004 -76.0209571450479 -6.331370849898409
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -168.32783978476004 -76.0209571450479 -6.331370849898409
+ vertex -169.25329977597258 -75.4866425699972 -6.834314575050704
+ vertex -168.04086421067436 -76.18664256999716 -6.5856406460550465
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -168.04086421067436 -76.18664256999716 -6.5856406460550465
+ vertex -169.25329977597258 -75.4866425699972 -6.834314575050704
+ vertex -167.70667407651402 -76.3795873339151 -6.745481322062464
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -167.70667407651402 -76.3795873339151 -6.745481322062464
+ vertex -169.25329977597258 -75.4866425699972 -6.834314575050704
+ vertex -167.34804388764678 -76.58664256999711 -6.799999999999959
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.25329977597252 -75.48664256999713 -4.799999999999966
+ vertex -168.5480438876468 -75.89382224696958 -5.999999999999941
+ vertex -168.68646997362728 -75.81390190896589 -5.614110472163975
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.25329977597252 -75.48664256999713 -4.799999999999966
+ vertex -168.68646997362728 -75.81390190896589 -5.614110472163975
+ vertex -168.73368453370185 -75.78664256999716 -5.1999999999999424
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.25329977597252 -75.48664256999713 -4.799999999999966
+ vertex -168.73368453370185 -75.78664256999716 -5.1999999999999424
+ vertex -168.68646997362725 -75.81390190896586 -4.785889527835911
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.25329977597252 -75.48664256999713 -4.799999999999966
+ vertex -168.68646997362725 -75.81390190896586 -4.785889527835911
+ vertex -171.15855566429832 -74.38664256999722 -4.799999999999969
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.15855566429832 -74.38664256999722 -4.799999999999969
+ vertex -168.68646997362725 -75.81390190896586 -4.785889527835911
+ vertex -171.15855566429832 -74.38664256999712 -3.399999999999949
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.15855566429832 -74.38664256999712 -3.399999999999949
+ vertex -168.68646997362725 -75.81390190896586 -4.785889527835911
+ vertex -168.54804388764677 -75.89382224696955 -4.399999999999944
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.15855566429832 -74.38664256999712 -3.399999999999949
+ vertex -168.54804388764677 -75.89382224696955 -4.399999999999944
+ vertex -168.32783978476002 -76.02095714504783 -4.068629150101447
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.15855566429832 -74.38664256999712 -3.399999999999949
+ vertex -168.32783978476002 -76.02095714504783 -4.068629150101447
+ vertex -168.04086421067427 -76.18664256999706 -3.8143593539448326
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.15855566429832 -74.38664256999712 -3.399999999999949
+ vertex -168.04086421067427 -76.18664256999706 -3.8143593539448326
+ vertex -167.7066740765139 -76.37958733391504 -3.654518677937438
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.15855566429832 -74.38664256999712 -3.399999999999949
+ vertex -167.7066740765139 -76.37958733391504 -3.654518677937438
+ vertex -167.3480438876467 -76.58664256999705 -3.599999999999943
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.15855566429832 -74.38664256999712 -3.399999999999949
+ vertex -167.3480438876467 -76.58664256999705 -3.599999999999943
+ vertex -165.55881340310538 -77.6196552718892 -3.49999999999994
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.15855566429832 -74.38664256999712 -3.399999999999949
+ vertex -165.55881340310538 -77.6196552718892 -3.49999999999994
+ vertex -170.81214550278452 -74.58664256999712 -3.399999999999923
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -170.81214550278452 -74.58664256999712 -3.399999999999923
+ vertex -165.55881340310538 -77.6196552718892 -3.49999999999994
+ vertex -165.69644096740956 -77.54019596059021 -3.29289321881339
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -170.81214550278452 -74.58664256999712 -3.399999999999923
+ vertex -165.69644096740956 -77.54019596059021 -3.29289321881339
+ vertex -170.81214550278452 -74.58664256999712 -2.999999999999924
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -170.81214550278452 -74.58664256999712 -2.999999999999924
+ vertex -165.69644096740956 -77.54019596059021 -3.29289321881339
+ vertex -165.87580070121314 -77.43664256999696 -3.1339745962155057
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -170.81214550278452 -74.58664256999712 -2.999999999999924
+ vertex -165.87580070121314 -77.43664256999696 -3.1339745962155057
+ vertex -166.08466953506334 -77.31605209254823 -3.034074173710881
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -170.81214550278452 -74.58664256999712 -2.999999999999924
+ vertex -166.08466953506334 -77.31605209254823 -3.034074173710881
+ vertex -166.30881340310535 -77.18664256999696 -2.9999999999999436
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -178.95278429835867 -69.88664256999783 -19.165685424949217
+ vertex -179.4426822469153 -69.60379985752323 -18.599999999999962
+ vertex -181.20445034819824 -68.58664256999789 -18.599999999999977
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.4426822469153 -69.60379985752323 -18.599999999999962
+ vertex -178.95278429835867 -69.88664256999783 -19.165685424949217
+ vertex -176.81743808261152 -71.11948528247233 -16.699999999999974
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.4426822469153 -69.60379985752323 -18.599999999999962
+ vertex -176.81743808261152 -71.11948528247233 -16.699999999999974
+ vertex -177.30733603116815 -70.83664256999775 -16.134314575050695
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116815 -70.83664256999775 -16.134314575050695
+ vertex -176.81743808261152 -71.11948528247233 -16.699999999999974
+ vertex -171.38864599171987 -74.25379985752292 -16.699999999999946
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116815 -70.83664256999775 -16.134314575050695
+ vertex -171.38864599171987 -74.25379985752292 -16.699999999999946
+ vertex -170.89874804316318 -74.53664256999755 -16.134314575050713
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116815 -70.83664256999775 -16.134314575050695
+ vertex -170.89874804316318 -74.53664256999755 -16.134314575050713
+ vertex -174.10304203716566 -72.68664256999762 -15.699999999999937
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -174.10304203716566 -72.68664256999762 -15.699999999999937
+ vertex -170.89874804316318 -74.53664256999755 -16.134314575050713
+ vertex -173.4978535934522 -73.03604828088599 -15.607999730980426
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -173.4978535934522 -73.03604828088599 -15.607999730980426
+ vertex -170.89874804316318 -74.53664256999755 -16.134314575050713
+ vertex -172.93390774205665 -73.36164256999754 -15.338268590217929
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -172.93390774205665 -73.36164256999754 -15.338268590217929
+ vertex -170.89874804316318 -74.53664256999755 -16.134314575050713
+ vertex -172.44963646078696 -73.64123672459937 -14.90918830920364
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -172.44963646078696 -73.64123672459937 -14.90918830920364
+ vertex -170.89874804316318 -74.53664256999755 -16.134314575050713
+ vertex -172.07804203716563 -73.85577686510652 -14.349999999999962
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -172.07804203716563 -73.85577686510652 -14.349999999999962
+ vertex -170.89874804316318 -74.53664256999755 -16.134314575050713
+ vertex -171.84444801707352 -73.9906424354877 -13.69881142177675
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.84444801707352 -73.9906424354877 -13.69881142177675
+ vertex -170.89874804316318 -74.53664256999755 -16.134314575050713
+ vertex -170.89874804316307 -74.53664256999733 -9.865685424949215
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.84444801707352 -73.9906424354877 -13.69881142177675
+ vertex -170.89874804316307 -74.53664256999733 -9.865685424949215
+ vertex -171.76477344694763 -74.03664256999745 -12.999999999999954
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.76477344694763 -74.03664256999745 -12.999999999999954
+ vertex -170.89874804316307 -74.53664256999733 -9.865685424949215
+ vertex -171.8444480170735 -73.99064243548767 -12.301188578223135
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.8444480170735 -73.99064243548767 -12.301188578223135
+ vertex -170.89874804316307 -74.53664256999733 -9.865685424949215
+ vertex -172.07804203716557 -73.8557768651064 -11.649999999999945
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -172.07804203716557 -73.8557768651064 -11.649999999999945
+ vertex -170.89874804316307 -74.53664256999733 -9.865685424949215
+ vertex -172.44963646078693 -73.64123672459925 -11.090811690796267
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -172.44963646078693 -73.64123672459925 -11.090811690796267
+ vertex -170.89874804316307 -74.53664256999733 -9.865685424949215
+ vertex -172.93390774205656 -73.36164256999741 -10.661731409781979
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -172.93390774205656 -73.36164256999741 -10.661731409781979
+ vertex -170.89874804316307 -74.53664256999733 -9.865685424949215
+ vertex -173.49785359345213 -73.03604828088585 -10.392000269019471
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -173.49785359345213 -73.03604828088585 -10.392000269019471
+ vertex -170.89874804316307 -74.53664256999733 -9.865685424949215
+ vertex -174.1030420371656 -72.68664256999745 -10.299999999999962
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.3939385715467 -70.78664256999794 -22.599999999999966
+ vertex -181.89727067122587 -68.18664256999807 -22.999999999999968
+ vertex -177.3939385715467 -70.78664256999797 -22.999999999999964
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -181.89727067122587 -68.18664256999807 -22.999999999999968
+ vertex -177.3939385715467 -70.78664256999794 -22.599999999999966
+ vertex -182.12141453926787 -68.05723304744681 -22.96592582628903
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.12141453926787 -68.05723304744681 -22.96592582628903
+ vertex -177.3939385715467 -70.78664256999794 -22.599999999999966
+ vertex -182.3302833731181 -67.9366425699981 -22.866025403784406
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.3302833731181 -67.9366425699981 -22.866025403784406
+ vertex -177.3939385715467 -70.78664256999794 -22.599999999999966
+ vertex -182.50964310692163 -67.83308917940481 -22.70710678118652
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.50964310692163 -67.83308917940481 -22.70710678118652
+ vertex -177.3939385715467 -70.78664256999794 -22.599999999999966
+ vertex -182.64727067122587 -67.75362986810585 -22.49999999999997
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -165.47229709936786 -77.6696054831421 -22.258819045102463
+ vertex -167.34804388764704 -76.58664256999762 -22.399999999999952
+ vertex -165.5588134031057 -77.61965527188984 -22.49999999999995
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -167.34804388764704 -76.58664256999762 -22.399999999999952
+ vertex -165.47229709936786 -77.6696054831421 -22.258819045102463
+ vertex -166.9894136987798 -76.79369780607962 -22.34548132206248
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.9894136987798 -76.79369780607962 -22.34548132206248
+ vertex -165.47229709936786 -77.6696054831421 -22.258819045102463
+ vertex -166.65522356461946 -76.98664256999763 -22.185640646055063
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.65522356461946 -76.98664256999763 -22.185640646055063
+ vertex -165.47229709936786 -77.6696054831421 -22.258819045102463
+ vertex -165.44278799932124 -77.68664256999759 -21.99999999999995
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.65522356461946 -76.98664256999763 -22.185640646055063
+ vertex -165.44278799932124 -77.68664256999759 -21.99999999999995
+ vertex -166.36824799053372 -77.1523279949468 -21.93137084989845
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.36824799053372 -77.1523279949468 -21.93137084989845
+ vertex -165.44278799932124 -77.68664256999759 -21.99999999999995
+ vertex -166.148043887647 -77.27946289302511 -21.599999999999977
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.148043887647 -77.27946289302511 -21.599999999999977
+ vertex -165.44278799932124 -77.68664256999759 -21.99999999999995
+ vertex -166.0096178016665 -77.35938323102883 -21.21411047216401
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.0096178016665 -77.35938323102883 -21.21411047216401
+ vertex -165.44278799932124 -77.68664256999759 -21.99999999999995
+ vertex -165.44278799932115 -77.68664256999742 -16.79999999999996
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.0096178016665 -77.35938323102883 -21.21411047216401
+ vertex -165.44278799932115 -77.68664256999742 -16.79999999999996
+ vertex -165.96240324159186 -77.38664256999755 -20.79999999999998
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -165.96240324159186 -77.38664256999755 -20.79999999999998
+ vertex -165.44278799932115 -77.68664256999742 -16.79999999999996
+ vertex -166.00961780166648 -77.35938323102881 -20.385889527835946
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.00961780166648 -77.35938323102881 -20.385889527835946
+ vertex -165.44278799932115 -77.68664256999742 -16.79999999999996
+ vertex -166.14804388764696 -77.27946289302508 -19.999999999999957
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.14804388764696 -77.27946289302508 -19.999999999999957
+ vertex -165.44278799932115 -77.68664256999742 -16.79999999999996
+ vertex -166.36824799053372 -77.15232799494673 -19.668629150101488
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.36824799053372 -77.15232799494673 -19.668629150101488
+ vertex -165.44278799932115 -77.68664256999742 -16.79999999999996
+ vertex -166.65522356461943 -76.98664256999751 -19.41435935394485
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.65522356461943 -76.98664256999751 -19.41435935394485
+ vertex -165.44278799932115 -77.68664256999742 -16.79999999999996
+ vertex -166.98941369877974 -76.79369780607954 -19.254518677937455
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.98941369877974 -76.79369780607954 -19.254518677937455
+ vertex -165.44278799932115 -77.68664256999742 -16.79999999999996
+ vertex -167.34804388764698 -76.58664256999752 -19.19999999999996
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -167.34804388764698 -76.58664256999752 -19.19999999999996
+ vertex -165.44278799932115 -77.68664256999742 -16.79999999999996
+ vertex -167.00163372613318 -76.78664256999751 -18.59999999999996
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -167.34804388764698 -76.58664256999752 -19.19999999999996
+ vertex -167.00163372613318 -76.78664256999751 -18.59999999999996
+ vertex -169.25329977597275 -75.48664256999757 -19.165685424949185
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -167.00163372613318 -76.78664256999751 -18.59999999999996
+ vertex -165.44278799932115 -77.68664256999742 -16.79999999999996
+ vertex -165.78919816083493 -77.4866425699974 -16.799999999999965
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -167.00163372613318 -76.78664256999751 -18.59999999999996
+ vertex -165.78919816083493 -77.4866425699974 -16.799999999999965
+ vertex -167.00163372613318 -76.78664256999741 -16.399999999999963
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -167.00163372613318 -76.78664256999741 -16.399999999999963
+ vertex -165.78919816083493 -77.4866425699974 -16.799999999999965
+ vertex -165.78919816083493 -77.4866425699974 -16.399999999999963
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116815 -70.83664256999775 -16.134314575050695
+ vertex -176.36163605725775 -71.38264270450735 -13.698811421776757
+ vertex -177.30733603116803 -70.83664256999754 -9.8656854249492
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -176.36163605725775 -71.38264270450735 -13.698811421776757
+ vertex -177.30733603116815 -70.83664256999775 -16.134314575050695
+ vertex -176.1280420371657 -71.51750827488864 -14.349999999999968
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -176.1280420371657 -71.51750827488864 -14.349999999999968
+ vertex -177.30733603116815 -70.83664256999775 -16.134314575050695
+ vertex -175.75644761354434 -71.73204841539578 -14.909188309203646
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -175.75644761354434 -71.73204841539578 -14.909188309203646
+ vertex -177.30733603116815 -70.83664256999775 -16.134314575050695
+ vertex -175.27217633227468 -72.01164256999762 -15.33826859021793
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -175.27217633227468 -72.01164256999762 -15.33826859021793
+ vertex -177.30733603116815 -70.83664256999775 -16.134314575050695
+ vertex -174.7082304808791 -72.33723685910924 -15.60799973098044
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -174.7082304808791 -72.33723685910924 -15.60799973098044
+ vertex -177.30733603116815 -70.83664256999775 -16.134314575050695
+ vertex -174.10304203716566 -72.68664256999762 -15.699999999999937
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116803 -70.83664256999754 -9.8656854249492
+ vertex -176.36163605725775 -71.38264270450735 -13.698811421776757
+ vertex -176.44131062738367 -71.3366425699976 -12.99999999999996
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116803 -70.83664256999754 -9.8656854249492
+ vertex -176.44131062738367 -71.3366425699976 -12.99999999999996
+ vertex -176.3616360572577 -71.38264270450729 -12.301188578223162
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116803 -70.83664256999754 -9.8656854249492
+ vertex -176.3616360572577 -71.38264270450729 -12.301188578223162
+ vertex -176.1280420371656 -71.51750827488856 -11.649999999999949
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116803 -70.83664256999754 -9.8656854249492
+ vertex -176.1280420371656 -71.51750827488856 -11.649999999999949
+ vertex -175.75644761354425 -71.73204841539567 -11.09081169079627
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116803 -70.83664256999754 -9.8656854249492
+ vertex -175.75644761354425 -71.73204841539567 -11.09081169079627
+ vertex -175.27217633227457 -72.01164256999746 -10.661731409781982
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116803 -70.83664256999754 -9.8656854249492
+ vertex -175.27217633227457 -72.01164256999746 -10.661731409781982
+ vertex -174.70823048087902 -72.33723685910905 -10.392000269019473
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116803 -70.83664256999754 -9.8656854249492
+ vertex -174.70823048087902 -72.33723685910905 -10.392000269019473
+ vertex -174.1030420371656 -72.68664256999745 -10.299999999999962
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116803 -70.83664256999754 -9.8656854249492
+ vertex -174.1030420371656 -72.68664256999745 -10.299999999999962
+ vertex -170.89874804316307 -74.53664256999733 -9.865685424949215
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116803 -70.83664256999754 -9.8656854249492
+ vertex -170.89874804316307 -74.53664256999733 -9.865685424949215
+ vertex -171.3886459917197 -74.25379985752271 -9.29999999999996
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.3886459917197 -74.25379985752271 -9.29999999999996
+ vertex -170.89874804316307 -74.53664256999733 -9.865685424949215
+ vertex -168.76340182741595 -75.76948528247182 -7.399999999999961
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.3886459917197 -74.25379985752271 -9.29999999999996
+ vertex -168.76340182741595 -75.76948528247182 -7.399999999999961
+ vertex -169.25329977597258 -75.4866425699972 -6.834314575050704
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -165.7891981608348 -77.48664256999719 -9.599999999999929
+ vertex -167.00163372613304 -76.78664256999713 -7.399999999999959
+ vertex -167.00163372613304 -76.78664256999721 -9.599999999999953
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -167.00163372613304 -76.78664256999713 -7.399999999999959
+ vertex -165.7891981608348 -77.48664256999719 -9.599999999999929
+ vertex -165.7891981608348 -77.4866425699972 -9.19999999999993
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116803 -70.83664256999754 -9.8656854249492
+ vertex -176.81743808261132 -71.11948528247211 -9.299999999999965
+ vertex -179.44268224691513 -69.60379985752284 -7.39999999999995
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -176.81743808261132 -71.11948528247211 -9.299999999999965
+ vertex -177.30733603116803 -70.83664256999754 -9.8656854249492
+ vertex -171.3886459917197 -74.25379985752271 -9.29999999999996
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.44268224691513 -69.60379985752284 -7.39999999999995
+ vertex -176.81743808261132 -71.11948528247211 -9.299999999999965
+ vertex -178.9527842983584 -69.88664256999746 -6.834314575050715
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.44268224691513 -69.60379985752284 -7.39999999999995
+ vertex -178.9527842983584 -69.88664256999746 -6.834314575050715
+ vertex -181.20445034819804 -68.58664256999758 -7.3999999999999275
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.04752841003264 -70.98664256999729 -3.399999999999954
+ vertex -178.9527842983584 -69.88664256999742 -4.7999999999999545
+ vertex -177.04752841003264 -70.98664256999737 -4.799999999999952
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -178.9527842983584 -69.88664256999742 -4.7999999999999545
+ vertex -177.04752841003264 -70.98664256999729 -3.399999999999954
+ vertex -179.5196141007037 -69.55938323102869 -4.785889527835922
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.5196141007037 -69.55938323102869 -4.785889527835922
+ vertex -177.04752841003264 -70.98664256999729 -3.399999999999954
+ vertex -179.65804018668416 -69.47946289302497 -4.399999999999955
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.65804018668416 -69.47946289302497 -4.399999999999955
+ vertex -177.04752841003264 -70.98664256999729 -3.399999999999954
+ vertex -179.8782442895709 -69.35232799494665 -4.068629150101484
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.8782442895709 -69.35232799494665 -4.068629150101484
+ vertex -177.04752841003264 -70.98664256999729 -3.399999999999954
+ vertex -180.1652198636566 -69.18664256999742 -3.814359353944847
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -180.1652198636566 -69.18664256999742 -3.814359353944847
+ vertex -177.04752841003264 -70.98664256999729 -3.399999999999954
+ vertex -180.4994099978169 -68.99369780607941 -3.654518677937452
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -180.4994099978169 -68.99369780607941 -3.654518677937452
+ vertex -177.04752841003264 -70.98664256999729 -3.399999999999954
+ vertex -180.8580401866842 -68.78664256999744 -3.5999999999999566
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -180.8580401866842 -68.78664256999744 -3.5999999999999566
+ vertex -177.04752841003264 -70.98664256999729 -3.399999999999954
+ vertex -182.64727067122556 -67.75362986810526 -3.4999999999999485
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.64727067122556 -67.75362986810526 -3.4999999999999485
+ vertex -177.04752841003264 -70.98664256999729 -3.399999999999954
+ vertex -177.39393857154639 -70.78664256999731 -3.399999999999954
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.64727067122556 -67.75362986810526 -3.4999999999999485
+ vertex -177.39393857154639 -70.78664256999731 -3.399999999999954
+ vertex -182.50964310692132 -67.83308917940421 -3.2928932188133984
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.50964310692132 -67.83308917940421 -3.2928932188133984
+ vertex -177.39393857154639 -70.78664256999731 -3.399999999999954
+ vertex -177.39393857154639 -70.78664256999726 -2.999999999999955
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.50964310692132 -67.83308917940421 -3.2928932188133984
+ vertex -177.39393857154639 -70.78664256999726 -2.999999999999955
+ vertex -182.33028337311777 -67.93664256999747 -3.133974596215514
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.33028337311777 -67.93664256999747 -3.133974596215514
+ vertex -177.39393857154639 -70.78664256999726 -2.999999999999955
+ vertex -182.12141453926756 -68.05723304744619 -3.034074173710887
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.12141453926756 -68.05723304744619 -3.034074173710887
+ vertex -177.39393857154639 -70.78664256999726 -2.999999999999955
+ vertex -181.89727067122553 -68.18664256999743 -2.9999999999999494
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -181.2044503481981 -68.58664256999764 -9.599999999999923
+ vertex -182.41688591349632 -67.88664256999765 -9.19999999999996
+ vertex -182.41688591349632 -67.88664256999766 -9.59999999999996
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.41688591349632 -67.88664256999765 -9.19999999999996
+ vertex -181.2044503481981 -68.58664256999764 -9.599999999999923
+ vertex -181.20445034819804 -68.58664256999758 -7.3999999999999275
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.41688591349632 -67.88664256999765 -9.19999999999996
+ vertex -181.20445034819804 -68.58664256999758 -7.3999999999999275
+ vertex -182.76329607501012 -67.68664256999767 -9.19999999999996
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501012 -67.68664256999767 -9.19999999999996
+ vertex -181.20445034819804 -68.58664256999758 -7.3999999999999275
+ vertex -182.05804018668428 -68.09382224696996 -5.999999999999944
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501012 -67.68664256999767 -9.19999999999996
+ vertex -182.05804018668428 -68.09382224696996 -5.999999999999944
+ vertex -182.19646627266476 -68.01390190896626 -5.614110472163954
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501012 -67.68664256999767 -9.19999999999996
+ vertex -182.19646627266476 -68.01390190896626 -5.614110472163954
+ vertex -182.76329607501003 -67.68664256999749 -3.9999999999999476
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.05804018668428 -68.09382224696996 -5.999999999999944
+ vertex -181.20445034819804 -68.58664256999758 -7.3999999999999275
+ vertex -181.83783608379753 -68.22095714504829 -6.331370849898415
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -181.83783608379753 -68.22095714504829 -6.331370849898415
+ vertex -181.20445034819804 -68.58664256999758 -7.3999999999999275
+ vertex -181.55086050971184 -68.38664256999753 -6.585640646055053
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -181.55086050971184 -68.38664256999753 -6.585640646055053
+ vertex -181.20445034819804 -68.58664256999758 -7.3999999999999275
+ vertex -181.2166703755515 -68.57958733391551 -6.7454813220624334
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -181.2166703755515 -68.57958733391551 -6.7454813220624334
+ vertex -181.20445034819804 -68.58664256999758 -7.3999999999999275
+ vertex -180.85804018668426 -68.78664256999751 -6.799999999999951
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -180.85804018668426 -68.78664256999751 -6.799999999999951
+ vertex -181.20445034819804 -68.58664256999758 -7.3999999999999275
+ vertex -178.9527842983584 -69.88664256999746 -6.834314575050715
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501003 -67.68664256999749 -3.9999999999999476
+ vertex -182.19646627266476 -68.01390190896626 -5.614110472163954
+ vertex -182.24368083273936 -67.9866425699975 -5.199999999999923
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501003 -67.68664256999749 -3.9999999999999476
+ vertex -182.24368083273936 -67.9866425699975 -5.199999999999923
+ vertex -182.19646627266474 -68.01390190896625 -4.785889527835891
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501003 -67.68664256999749 -3.9999999999999476
+ vertex -182.19646627266474 -68.01390190896625 -4.785889527835891
+ vertex -182.05804018668422 -68.09382224696995 -4.399999999999924
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501003 -67.68664256999749 -3.9999999999999476
+ vertex -182.05804018668422 -68.09382224696995 -4.399999999999924
+ vertex -181.83783608379747 -68.22095714504822 -4.068629150101453
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501003 -67.68664256999749 -3.9999999999999476
+ vertex -181.83783608379747 -68.22095714504822 -4.068629150101453
+ vertex -181.55086050971175 -68.38664256999745 -3.8143593539448384
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501003 -67.68664256999749 -3.9999999999999476
+ vertex -181.55086050971175 -68.38664256999745 -3.8143593539448384
+ vertex -182.73378697496338 -67.70367965685296 -3.741180954897436
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.73378697496338 -67.70367965685296 -3.741180954897436
+ vertex -181.55086050971175 -68.38664256999745 -3.8143593539448384
+ vertex -181.2166703755514 -68.57958733391541 -3.654518677937407
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.73378697496338 -67.70367965685296 -3.741180954897436
+ vertex -181.2166703755514 -68.57958733391541 -3.654518677937407
+ vertex -182.64727067122556 -67.75362986810526 -3.4999999999999485
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.64727067122556 -67.75362986810526 -3.4999999999999485
+ vertex -181.2166703755514 -68.57958733391541 -3.654518677937407
+ vertex -180.8580401866842 -68.78664256999744 -3.5999999999999566
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -178.9527842983584 -69.88664256999746 -6.834314575050715
+ vertex -180.499409997817 -68.99369780607952 -6.745481322062478
+ vertex -180.85804018668426 -68.78664256999751 -6.799999999999951
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -180.499409997817 -68.99369780607952 -6.745481322062478
+ vertex -178.9527842983584 -69.88664256999746 -6.834314575050715
+ vertex -180.1652198636567 -69.1866425699975 -6.585640646055061
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -180.1652198636567 -69.1866425699975 -6.585640646055061
+ vertex -178.9527842983584 -69.88664256999746 -6.834314575050715
+ vertex -179.87824428957094 -69.35232799494672 -6.3313708498984465
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.87824428957094 -69.35232799494672 -6.3313708498984465
+ vertex -178.9527842983584 -69.88664256999746 -6.834314575050715
+ vertex -179.65804018668422 -69.47946289302502 -5.999999999999975
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.65804018668422 -69.47946289302502 -5.999999999999975
+ vertex -178.9527842983584 -69.88664256999746 -6.834314575050715
+ vertex -178.9527842983584 -69.88664256999742 -4.7999999999999545
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.65804018668422 -69.47946289302502 -5.999999999999975
+ vertex -178.9527842983584 -69.88664256999742 -4.7999999999999545
+ vertex -179.5196141007037 -69.5593832310287 -5.6141104721640085
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.5196141007037 -69.5593832310287 -5.6141104721640085
+ vertex -178.9527842983584 -69.88664256999742 -4.7999999999999545
+ vertex -179.47239954062908 -69.58664256999745 -5.199999999999976
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.47239954062908 -69.58664256999745 -5.199999999999976
+ vertex -178.9527842983584 -69.88664256999742 -4.7999999999999545
+ vertex -179.5196141007037 -69.55938323102869 -4.785889527835922
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.25329977597275 -75.48664256999757 -19.165685424949185
+ vertex -168.7634018274161 -75.76948528247219 -18.599999999999948
+ vertex -171.38864599171987 -74.25379985752292 -16.699999999999946
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -168.7634018274161 -75.76948528247219 -18.599999999999948
+ vertex -169.25329977597275 -75.48664256999757 -19.165685424949185
+ vertex -167.00163372613318 -76.78664256999751 -18.59999999999996
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.38864599171987 -74.25379985752292 -16.699999999999946
+ vertex -168.7634018274161 -75.76948528247219 -18.599999999999948
+ vertex -170.89874804316318 -74.53664256999755 -16.134314575050713
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -181.2044503481982 -68.58664256999784 -16.39999999999998
+ vertex -182.41688591349643 -67.88664256999789 -16.800000000000004
+ vertex -181.20445034819824 -68.58664256999789 -18.599999999999977
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.41688591349643 -67.88664256999789 -16.800000000000004
+ vertex -181.2044503481982 -68.58664256999784 -16.39999999999998
+ vertex -182.41688591349643 -67.88664256999789 -16.400000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -180.85804018668452 -68.786642569998 -22.399999999999945
+ vertex -182.73378697496366 -67.70367965685351 -22.25881904510248
+ vertex -182.64727067122587 -67.75362986810585 -22.49999999999997
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.73378697496366 -67.70367965685351 -22.25881904510248
+ vertex -180.85804018668452 -68.786642569998 -22.399999999999945
+ vertex -181.21667037555176 -68.57958733391598 -22.34548132206245
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.73378697496366 -67.70367965685351 -22.25881904510248
+ vertex -181.21667037555176 -68.57958733391598 -22.34548132206245
+ vertex -181.55086050971215 -68.38664256999803 -22.185640646055035
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.73378697496366 -67.70367965685351 -22.25881904510248
+ vertex -181.55086050971215 -68.38664256999803 -22.185640646055035
+ vertex -182.76329607501032 -67.68664256999804 -21.99999999999997
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501032 -67.68664256999804 -21.99999999999997
+ vertex -181.55086050971215 -68.38664256999803 -22.185640646055035
+ vertex -181.8378360837978 -68.22095714504879 -21.93137084989842
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501032 -67.68664256999804 -21.99999999999997
+ vertex -181.8378360837978 -68.22095714504879 -21.93137084989842
+ vertex -182.05804018668454 -68.09382224697046 -21.599999999999927
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501032 -67.68664256999804 -21.99999999999997
+ vertex -182.05804018668454 -68.09382224697046 -21.599999999999927
+ vertex -182.19646627266502 -68.01390190896676 -21.21411047216396
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501032 -67.68664256999804 -21.99999999999997
+ vertex -182.19646627266502 -68.01390190896676 -21.21411047216396
+ vertex -182.7632960750102 -67.6866425699979 -16.800000000000004
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.7632960750102 -67.6866425699979 -16.800000000000004
+ vertex -182.19646627266502 -68.01390190896676 -21.21411047216396
+ vertex -182.2436808327396 -67.986642569998 -20.79999999999993
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.7632960750102 -67.6866425699979 -16.800000000000004
+ vertex -182.2436808327396 -67.986642569998 -20.79999999999993
+ vertex -182.19646627266502 -68.01390190896674 -20.385889527835896
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.7632960750102 -67.6866425699979 -16.800000000000004
+ vertex -182.19646627266502 -68.01390190896674 -20.385889527835896
+ vertex -182.0580401866845 -68.09382224697045 -19.99999999999993
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.7632960750102 -67.6866425699979 -16.800000000000004
+ vertex -182.0580401866845 -68.09382224697045 -19.99999999999993
+ vertex -181.83783608379773 -68.2209571450487 -19.66862915010146
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.7632960750102 -67.6866425699979 -16.800000000000004
+ vertex -181.83783608379773 -68.2209571450487 -19.66862915010146
+ vertex -181.55086050971204 -68.38664256999796 -19.41435935394482
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.7632960750102 -67.6866425699979 -16.800000000000004
+ vertex -181.55086050971204 -68.38664256999796 -19.41435935394482
+ vertex -181.21667037555167 -68.57958733391588 -19.254518677937426
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.7632960750102 -67.6866425699979 -16.800000000000004
+ vertex -181.21667037555167 -68.57958733391588 -19.254518677937426
+ vertex -180.8580401866844 -68.7866425699979 -19.19999999999993
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.7632960750102 -67.6866425699979 -16.800000000000004
+ vertex -180.8580401866844 -68.7866425699979 -19.19999999999993
+ vertex -181.20445034819824 -68.58664256999789 -18.599999999999977
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -181.20445034819824 -68.58664256999789 -18.599999999999977
+ vertex -180.8580401866844 -68.7866425699979 -19.19999999999993
+ vertex -178.95278429835867 -69.88664256999783 -19.165685424949217
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.7632960750102 -67.6866425699979 -16.800000000000004
+ vertex -181.20445034819824 -68.58664256999789 -18.599999999999977
+ vertex -182.41688591349643 -67.88664256999789 -16.800000000000004
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -31.897270671226426 191.62097856533254 -23.000000000000057
+ vertex -177.3939385715467 -70.78664256999797 -22.999999999999964
+ vertex -181.89727067122587 -68.18664256999807 -22.999999999999968
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -177.3939385715467 -70.78664256999797 -22.999999999999964
+ vertex -31.897270671226426 191.62097856533254 -23.000000000000057
+ vertex -27.393938571547185 189.02097856533265 -23.000000000000053
+ endloop
+endfacet
+facet normal -0.11303899832185413 0.06526309611000009 -0.9914448613738078
+ outer loop
+ vertex -32.121414539268436 191.75038808788375 -22.96592582628912
+ vertex -181.89727067122587 -68.18664256999807 -22.999999999999968
+ vertex -182.12141453926787 -68.05723304744681 -22.96592582628903
+ endloop
+endfacet
+facet normal -0.11303899832185413 0.06526309611000009 -0.9914448613738078
+ outer loop
+ vertex -181.89727067122587 -68.18664256999807 -22.999999999999968
+ vertex -32.121414539268436 191.75038808788375 -22.96592582628912
+ vertex -31.897270671226426 191.62097856533254 -23.000000000000057
+ endloop
+endfacet
+facet normal -1.4032362957362895e-14 -3.338242996024356e-14 -1.0
+ outer loop
+ vertex -26.81743808261207 188.68813585285818 -16.700000000000063
+ vertex -171.38864599171987 -74.25379985752292 -16.699999999999946
+ vertex -176.81743808261152 -71.11948528247233 -16.699999999999974
+ endloop
+endfacet
+facet normal -1.4032362957362895e-14 -3.338242996024356e-14 -1.0
+ outer loop
+ vertex -171.38864599171987 -74.25379985752292 -16.699999999999946
+ vertex -26.81743808261207 188.68813585285818 -16.700000000000063
+ vertex -21.388645991720455 185.5538212778076 -16.700000000000028
+ endloop
+endfacet
+facet normal -0.33141357403561206 0.19134171618249302 -0.9238795325112902
+ outer loop
+ vertex -32.3302833731186 191.8709785653325 -22.86602540378449
+ vertex -182.12141453926787 -68.05723304744681 -22.96592582628903
+ vertex -182.3302833731181 -67.9366425699981 -22.866025403784406
+ endloop
+endfacet
+facet normal -0.33141357403561206 0.19134171618249302 -0.9238795325112902
+ outer loop
+ vertex -182.12141453926787 -68.05723304744681 -22.96592582628903
+ vertex -32.3302833731186 191.8709785653325 -22.86602540378449
+ vertex -32.121414539268436 191.75038808788375 -22.96592582628912
+ endloop
+endfacet
+facet normal -0.5272028623656805 0.304380714504307 -0.7933533402912483
+ outer loop
+ vertex -32.50964310692216 191.9745319559258 -22.70710678118661
+ vertex -182.3302833731181 -67.9366425699981 -22.866025403784406
+ vertex -182.50964310692163 -67.83308917940481 -22.70710678118652
+ endloop
+endfacet
+facet normal -0.5272028623656805 0.304380714504307 -0.7933533402912483
+ outer loop
+ vertex -182.3302833731181 -67.9366425699981 -22.866025403784406
+ vertex -32.50964310692216 191.9745319559258 -22.70710678118661
+ vertex -32.3302833731186 191.8709785653325 -22.86602540378449
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 7.797766215937039e-16
+ outer loop
+ vertex -31.204450348198748 191.2209785653327 -18.60000000000006
+ vertex -181.2044503481982 -68.58664256999784 -16.39999999999998
+ vertex -181.20445034819824 -68.58664256999789 -18.599999999999977
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 7.797766215937039e-16
+ outer loop
+ vertex -181.2044503481982 -68.58664256999784 -16.39999999999998
+ vertex -31.204450348198748 191.2209785653327 -18.60000000000006
+ vertex -31.204450348198726 191.2209785653327 -16.400000000000063
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 6.227439144697606e-15
+ outer loop
+ vertex -27.393938571547185 189.02097856533265 -23.000000000000053
+ vertex -177.3939385715467 -70.78664256999794 -22.599999999999966
+ vertex -177.3939385715467 -70.78664256999797 -22.999999999999964
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 6.227439144697606e-15
+ outer loop
+ vertex -177.3939385715467 -70.78664256999794 -22.599999999999966
+ vertex -27.393938571547185 189.02097856533265 -23.000000000000053
+ vertex -27.39393857154723 189.02097856533257 -22.600000000000055
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -28.95278429835923 189.92097856533263 -21.200000000000056
+ vertex -178.95278429835867 -69.88664256999783 -19.165685424949217
+ vertex -178.9527842983587 -69.88664256999793 -21.199999999999957
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -178.95278429835867 -69.88664256999783 -19.165685424949217
+ vertex -28.95278429835923 189.92097856533263 -21.200000000000056
+ vertex -28.952784298359205 189.92097856533272 -19.16568542494932
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -169.25329977597275 -75.48664256999757 -19.165685424949185
+ vertex -19.253299775973296 184.32097856533298 -21.200000000000035
+ vertex -169.2532997759728 -75.48664256999764 -21.199999999999946
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -19.253299775973296 184.32097856533298 -21.200000000000035
+ vertex -169.25329977597275 -75.48664256999757 -19.165685424949185
+ vertex -19.253299775973296 184.32097856533298 -19.165685424949274
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -179.4426822469153 -69.60379985752323 -18.599999999999962
+ vertex -31.204450348198748 191.2209785653327 -18.60000000000006
+ vertex -181.20445034819824 -68.58664256999789 -18.599999999999977
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -31.204450348198748 191.2209785653327 -18.60000000000006
+ vertex -179.4426822469153 -69.60379985752323 -18.599999999999962
+ vertex -29.44268224691582 190.20382127780732 -18.60000000000005
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -177.0475284100329 -70.98664256999788 -21.199999999999967
+ vertex -28.95278429835923 189.92097856533263 -21.200000000000056
+ vertex -178.9527842983587 -69.88664256999793 -21.199999999999957
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -28.95278429835923 189.92097856533263 -21.200000000000056
+ vertex -177.0475284100329 -70.98664256999788 -21.199999999999967
+ vertex -27.047528410033426 188.82097856533272 -21.200000000000053
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -170.81214550278483 -74.58664256999774 -22.599999999999955
+ vertex -20.812145502785388 185.22097856533284 -23.000000000000036
+ vertex -170.8121455027849 -74.58664256999778 -22.999999999999954
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -20.812145502785388 185.22097856533284 -23.000000000000036
+ vertex -170.81214550278483 -74.58664256999774 -22.599999999999955
+ vertex -20.812145502785363 185.2209785653328 -22.60000000000004
+ endloop
+endfacet
+facet normal -0.8001031451912929 0.46193976625560573 -0.38268343236507835
+ outer loop
+ vertex -182.73378697496366 -67.70367965685351 -22.25881904510248
+ vertex -32.647270671226366 192.05399126722477 -22.50000000000006
+ vertex -182.64727067122587 -67.75362986810585 -22.49999999999997
+ endloop
+endfacet
+facet normal -0.8001031451912929 0.46193976625560573 -0.38268343236507835
+ outer loop
+ vertex -32.647270671226366 192.05399126722477 -22.50000000000006
+ vertex -182.73378697496366 -67.70367965685351 -22.25881904510248
+ vertex -32.7337869749642 192.10394147847708 -22.258819045102573
+ endloop
+endfacet
+facet normal -0.6123724356957982 0.35355339059327484 0.7071067811865438
+ outer loop
+ vertex -27.30733603116866 188.97097856533284 -16.134314575050784
+ vertex -179.4426822469153 -69.60379985752323 -18.599999999999962
+ vertex -177.30733603116815 -70.83664256999775 -16.134314575050695
+ endloop
+endfacet
+facet normal -0.6123724356957982 0.35355339059327484 0.7071067811865438
+ outer loop
+ vertex -179.4426822469153 -69.60379985752323 -18.599999999999962
+ vertex -27.30733603116866 188.97097856533284 -16.134314575050784
+ vertex -29.44268224691582 190.20382127780732 -18.60000000000005
+ endloop
+endfacet
+facet normal 0.6123724356957956 -0.3535533905932733 -0.7071067811865469
+ outer loop
+ vertex -28.952784298359205 189.92097856533272 -19.16568542494932
+ vertex -176.81743808261152 -71.11948528247233 -16.699999999999974
+ vertex -178.95278429835867 -69.88664256999783 -19.165685424949217
+ endloop
+endfacet
+facet normal 0.6123724356957956 -0.3535533905932733 -0.7071067811865469
+ outer loop
+ vertex -176.81743808261152 -71.11948528247233 -16.699999999999974
+ vertex -28.952784298359205 189.92097856533272 -19.16568542494932
+ vertex -26.81743808261207 188.68813585285818 -16.700000000000063
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -182.41688591349643 -67.88664256999789 -16.800000000000004
+ vertex -32.7632960750107 192.12097856533268 -16.800000000000093
+ vertex -182.7632960750102 -67.6866425699979 -16.800000000000004
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -32.7632960750107 192.12097856533268 -16.800000000000093
+ vertex -182.41688591349643 -67.88664256999789 -16.800000000000004
+ vertex -32.41688591349694 191.92097856533272 -16.80000000000009
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -21.158555664299147 185.4209785653328 -22.600000000000048
+ vertex -170.81214550278483 -74.58664256999774 -22.599999999999955
+ vertex -171.15855566429863 -74.38664256999776 -22.59999999999996
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -170.81214550278483 -74.58664256999774 -22.599999999999955
+ vertex -21.158555664299147 185.4209785653328 -22.600000000000048
+ vertex -20.812145502785363 185.2209785653328 -22.60000000000004
+ endloop
+endfacet
+facet normal 3.1938264052333552e-15 3.964006195623637e-14 1.0
+ outer loop
+ vertex -181.2044503481982 -68.58664256999784 -16.39999999999998
+ vertex -32.41688591349694 191.9209785653327 -16.400000000000095
+ vertex -182.41688591349643 -67.88664256999789 -16.400000000000002
+ endloop
+endfacet
+facet normal 3.1938264052333552e-15 3.964006195623637e-14 1.0
+ outer loop
+ vertex -32.41688591349694 191.9209785653327 -16.400000000000095
+ vertex -181.2044503481982 -68.58664256999784 -16.39999999999998
+ vertex -31.204450348198726 191.2209785653327 -16.400000000000063
+ endloop
+endfacet
+facet normal -0.6123724356958147 0.35355339059323354 -0.7071067811865502
+ outer loop
+ vertex -21.388645991720455 185.5538212778076 -16.700000000000028
+ vertex -169.25329977597275 -75.48664256999757 -19.165685424949185
+ vertex -171.38864599171987 -74.25379985752292 -16.699999999999946
+ endloop
+endfacet
+facet normal -0.6123724356958147 0.35355339059323354 -0.7071067811865502
+ outer loop
+ vertex -169.25329977597275 -75.48664256999757 -19.165685424949185
+ vertex -21.388645991720455 185.5538212778076 -16.700000000000028
+ vertex -19.253299775973296 184.32097856533298 -19.165685424949274
+ endloop
+endfacet
+facet normal 0.1130389983218193 -0.06526309611006452 -0.9914448613738074
+ outer loop
+ vertex -16.30881340310624 182.62097856533293 -23.00000000000004
+ vertex -166.08466953506374 -77.31605209254886 -22.965925826289016
+ vertex -166.30881340310577 -77.1866425699976 -22.999999999999954
+ endloop
+endfacet
+facet normal 0.1130389983218193 -0.06526309611006452 -0.9914448613738074
+ outer loop
+ vertex -166.08466953506374 -77.31605209254886 -22.965925826289016
+ vertex -16.30881340310624 182.62097856533293 -23.00000000000004
+ vertex -16.084669535064208 182.4915690427817 -22.9659258262891
+ endloop
+endfacet
+facet normal 0.3314135740355756 -0.19134171618255938 -0.9238795325112896
+ outer loop
+ vertex -16.084669535064208 182.4915690427817 -22.9659258262891
+ vertex -165.8758007012135 -77.4366425699976 -22.866025403784388
+ vertex -166.08466953506374 -77.31605209254886 -22.965925826289016
+ endloop
+endfacet
+facet normal 0.3314135740355756 -0.19134171618255938 -0.9238795325112896
+ outer loop
+ vertex -165.8758007012135 -77.4366425699976 -22.866025403784388
+ vertex -16.084669535064208 182.4915690427817 -22.9659258262891
+ vertex -15.87580070121402 182.37097856533296 -22.866025403784477
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 2.4387889803801352e-15
+ outer loop
+ vertex -32.7632960750107 192.12097856533268 -16.800000000000093
+ vertex -182.76329607501032 -67.68664256999804 -21.99999999999997
+ vertex -182.7632960750102 -67.6866425699979 -16.800000000000004
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 2.4387889803801352e-15
+ outer loop
+ vertex -182.76329607501032 -67.68664256999804 -21.99999999999997
+ vertex -32.7632960750107 192.12097856533268 -16.800000000000093
+ vertex -32.763296075010814 192.1209785653325 -22.00000000000006
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -27.39393857154723 189.02097856533257 -22.600000000000055
+ vertex -177.0475284100329 -70.98664256999795 -22.599999999999966
+ vertex -177.3939385715467 -70.78664256999794 -22.599999999999966
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -177.0475284100329 -70.98664256999795 -22.599999999999966
+ vertex -27.39393857154723 189.02097856533257 -22.600000000000055
+ vertex -27.047528410033404 188.8209785653326 -22.60000000000005
+ endloop
+endfacet
+facet normal -0.8586164364012796 0.4957224306868715 -0.13052619222005726
+ outer loop
+ vertex -32.763296075010814 192.1209785653325 -22.00000000000006
+ vertex -182.73378697496366 -67.70367965685351 -22.25881904510248
+ vertex -182.76329607501032 -67.68664256999804 -21.99999999999997
+ endloop
+endfacet
+facet normal -0.8586164364012796 0.4957224306868715 -0.13052619222005726
+ outer loop
+ vertex -182.73378697496366 -67.70367965685351 -22.25881904510248
+ vertex -32.763296075010814 192.1209785653325 -22.00000000000006
+ vertex -32.7337869749642 192.10394147847708 -22.258819045102573
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -21.1585556642991 185.4209785653329 -21.20000000000005
+ vertex -171.15855566429863 -74.38664256999776 -22.59999999999996
+ vertex -171.1585556642986 -74.38664256999773 -21.19999999999996
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -171.15855566429863 -74.38664256999776 -22.59999999999996
+ vertex -21.1585556642991 185.4209785653329 -21.20000000000005
+ vertex -21.158555664299147 185.4209785653328 -22.600000000000048
+ endloop
+endfacet
+facet normal 0.5272028623656501 -0.3043807145043627 -0.7933533402912472
+ outer loop
+ vertex -15.87580070121402 182.37097856533296 -22.866025403784477
+ vertex -165.69644096740987 -77.54019596059086 -22.7071067811865
+ vertex -165.8758007012135 -77.4366425699976 -22.866025403784388
+ endloop
+endfacet
+facet normal 0.5272028623656501 -0.3043807145043627 -0.7933533402912472
+ outer loop
+ vertex -165.69644096740987 -77.54019596059086 -22.7071067811865
+ vertex -15.87580070121402 182.37097856533296 -22.866025403784477
+ vertex -15.696440967410407 182.26742517473969 -22.707106781186592
+ endloop
+endfacet
+facet normal 0.6870641468694507 -0.3966766701456196 -0.6087614290087188
+ outer loop
+ vertex -165.69644096740987 -77.54019596059086 -22.7071067811865
+ vertex -15.558813403106205 182.18796586344075 -22.50000000000003
+ vertex -165.5588134031057 -77.61965527188984 -22.49999999999995
+ endloop
+endfacet
+facet normal 0.6870641468694507 -0.3966766701456196 -0.6087614290087188
+ outer loop
+ vertex -15.558813403106205 182.18796586344075 -22.50000000000003
+ vertex -165.69644096740987 -77.54019596059086 -22.7071067811865
+ vertex -15.696440967410407 182.26742517473969 -22.707106781186592
+ endloop
+endfacet
+facet normal -0.6870641468694719 0.39667667014558666 -0.6087614290087161
+ outer loop
+ vertex -32.647270671226366 192.05399126722477 -22.50000000000006
+ vertex -182.50964310692163 -67.83308917940481 -22.70710678118652
+ vertex -182.64727067122587 -67.75362986810585 -22.49999999999997
+ endloop
+endfacet
+facet normal -0.6870641468694719 0.39667667014558666 -0.6087614290087161
+ outer loop
+ vertex -182.50964310692163 -67.83308917940481 -22.70710678118652
+ vertex -32.647270671226366 192.05399126722477 -22.50000000000006
+ vertex -32.50964310692216 191.9745319559258 -22.70710678118661
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 4.1225237454890334e-14
+ outer loop
+ vertex -27.047528410033404 188.8209785653326 -22.60000000000005
+ vertex -177.0475284100329 -70.98664256999788 -21.199999999999967
+ vertex -177.0475284100329 -70.98664256999795 -22.599999999999966
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 4.1225237454890334e-14
+ outer loop
+ vertex -177.0475284100329 -70.98664256999788 -21.199999999999967
+ vertex -27.047528410033404 188.8209785653326 -22.60000000000005
+ vertex -27.047528410033426 188.82097856533272 -21.200000000000053
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -6.007129263248552e-15
+ outer loop
+ vertex -32.41688591349694 191.9209785653327 -16.400000000000095
+ vertex -182.41688591349643 -67.88664256999789 -16.800000000000004
+ vertex -182.41688591349643 -67.88664256999789 -16.400000000000002
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -6.007129263248552e-15
+ outer loop
+ vertex -182.41688591349643 -67.88664256999789 -16.800000000000004
+ vertex -32.41688591349694 191.9209785653327 -16.400000000000095
+ vertex -32.41688591349694 191.92097856533272 -16.80000000000009
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -169.2532997759728 -75.48664256999764 -21.199999999999946
+ vertex -21.1585556642991 185.4209785653329 -21.20000000000005
+ vertex -171.1585556642986 -74.38664256999773 -21.19999999999996
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -21.1585556642991 185.4209785653329 -21.20000000000005
+ vertex -169.2532997759728 -75.48664256999764 -21.199999999999946
+ vertex -19.253299775973296 184.32097856533298 -21.200000000000035
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -20.812145502785388 185.22097856533284 -23.000000000000036
+ vertex -166.30881340310577 -77.1866425699976 -22.999999999999954
+ vertex -170.8121455027849 -74.58664256999778 -22.999999999999954
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -166.30881340310577 -77.1866425699976 -22.999999999999954
+ vertex -20.812145502785388 185.22097856533284 -23.000000000000036
+ vertex -16.30881340310624 182.62097856533293 -23.00000000000004
+ endloop
+endfacet
+facet normal 0.11303899832184437 -0.06526309610999445 0.9914448613738092
+ outer loop
+ vertex -167.34804388764704 -76.58664256999762 -22.399999999999952
+ vertex -17.70667407651477 183.42803380141493 -22.345481322062547
+ vertex -167.70667407651428 -76.3795873339156 -22.345481322062458
+ endloop
+endfacet
+facet normal 0.11303899832184437 -0.06526309610999445 0.9914448613738092
+ outer loop
+ vertex -17.70667407651477 183.42803380141493 -22.345481322062547
+ vertex -167.34804388764704 -76.58664256999762 -22.399999999999952
+ vertex -17.348043887647563 183.22097856533296 -22.400000000000045
+ endloop
+endfacet
+facet normal 0.8586164364012803 -0.49572243068687194 -0.1305261922200513
+ outer loop
+ vertex -26.441310627384183 188.47097856533296 -13.000000000000046
+ vertex -176.3616360572577 -71.38264270450729 -12.301188578223162
+ vertex -176.44131062738367 -71.3366425699976 -12.99999999999996
+ endloop
+endfacet
+facet normal 0.8586164364012803 -0.49572243068687194 -0.1305261922200513
+ outer loop
+ vertex -176.3616360572577 -71.38264270450729 -12.301188578223162
+ vertex -26.441310627384183 188.47097856533296 -13.000000000000046
+ vertex -26.361636057258295 188.42497843082322 -12.30118857822325
+ endloop
+endfacet
+facet normal 0.5272028623656798 -0.30438071450430665 0.7933533402912488
+ outer loop
+ vertex -175.27217633227468 -72.01164256999762 -15.33826859021793
+ vertex -25.756447613544847 188.07557271993477 -14.909188309203735
+ vertex -175.75644761354434 -71.73204841539578 -14.909188309203646
+ endloop
+endfacet
+facet normal 0.5272028623656798 -0.30438071450430665 0.7933533402912488
+ outer loop
+ vertex -25.756447613544847 188.07557271993477 -14.909188309203735
+ vertex -175.27217633227468 -72.01164256999762 -15.33826859021793
+ vertex -25.272176332275194 187.79597856533294 -15.338268590218007
+ endloop
+endfacet
+facet normal 0.8001031451912723 -0.4619397662556388 -0.3826834323650808
+ outer loop
+ vertex -176.3616360572577 -71.38264270450729 -12.301188578223162
+ vertex -26.128042037166153 188.29011286044198 -11.650000000000038
+ vertex -176.1280420371656 -71.51750827488856 -11.649999999999949
+ endloop
+endfacet
+facet normal 0.8001031451912723 -0.4619397662556388 -0.3826834323650808
+ outer loop
+ vertex -26.128042037166153 188.29011286044198 -11.650000000000038
+ vertex -176.3616360572577 -71.38264270450729 -12.301188578223162
+ vertex -26.361636057258295 188.42497843082322 -12.30118857822325
+ endloop
+endfacet
+facet normal 0.8001031451912779 -0.4619397662556308 -0.38268343236507885
+ outer loop
+ vertex -15.558813403106205 182.18796586344075 -22.50000000000003
+ vertex -165.47229709936786 -77.6696054831421 -22.258819045102463
+ vertex -165.5588134031057 -77.61965527188984 -22.49999999999995
+ endloop
+endfacet
+facet normal 0.8001031451912779 -0.4619397662556308 -0.38268343236507885
+ outer loop
+ vertex -165.47229709936786 -77.6696054831421 -22.258819045102463
+ vertex -15.558813403106205 182.18796586344075 -22.50000000000003
+ vertex -15.472297099368376 182.13801565218841 -22.25881904510254
+ endloop
+endfacet
+facet normal 0.11303899832179289 -0.06526309611005209 -0.9914448613738114
+ outer loop
+ vertex -24.708230480879518 187.47038427622155 -10.392000269019562
+ vertex -174.1030420371656 -72.68664256999745 -10.299999999999962
+ vertex -174.70823048087902 -72.33723685910905 -10.392000269019473
+ endloop
+endfacet
+facet normal 0.11303899832179289 -0.06526309611005209 -0.9914448613738114
+ outer loop
+ vertex -174.1030420371656 -72.68664256999745 -10.299999999999962
+ vertex -24.708230480879518 187.47038427622155 -10.392000269019562
+ vertex -24.103042037166073 187.1209785653331 -10.30000000000005
+ endloop
+endfacet
+facet normal -0.5272028623656798 0.30438071450430665 -0.7933533402912488
+ outer loop
+ vertex -22.933907742057063 186.4459785653332 -10.661731409782044
+ vertex -172.44963646078693 -73.64123672459925 -11.090811690796267
+ vertex -172.93390774205656 -73.36164256999741 -10.661731409781979
+ endloop
+endfacet
+facet normal -0.5272028623656798 0.30438071450430665 -0.7933533402912488
+ outer loop
+ vertex -172.44963646078693 -73.64123672459925 -11.090811690796267
+ vertex -22.933907742057063 186.4459785653332 -10.661731409782044
+ vertex -22.44963646078741 186.16638441073135 -11.090811690796333
+ endloop
+endfacet
+facet normal 0.8001031451912968 -0.4619397662555967 0.3826834323650809
+ outer loop
+ vertex -26.12804203716622 188.29011286044195 -14.350000000000055
+ vertex -176.36163605725775 -71.38264270450735 -13.698811421776757
+ vertex -176.1280420371657 -71.51750827488864 -14.349999999999968
+ endloop
+endfacet
+facet normal 0.8001031451912968 -0.4619397662555967 0.3826834323650809
+ outer loop
+ vertex -176.36163605725775 -71.38264270450735 -13.698811421776757
+ vertex -26.12804203716622 188.29011286044195 -14.350000000000055
+ vertex -26.361636057258295 188.42497843082322 -13.698811421776844
+ endloop
+endfacet
+facet normal 0.3314135740355922 -0.19134171618256895 -0.9238795325112817
+ outer loop
+ vertex -25.27217633227515 187.79597856533303 -10.661731409782071
+ vertex -174.70823048087902 -72.33723685910905 -10.392000269019473
+ vertex -175.27217633227457 -72.01164256999746 -10.661731409781982
+ endloop
+endfacet
+facet normal 0.3314135740355922 -0.19134171618256895 -0.9238795325112817
+ outer loop
+ vertex -174.70823048087902 -72.33723685910905 -10.392000269019473
+ vertex -25.27217633227515 187.79597856533303 -10.661731409782071
+ vertex -24.708230480879518 187.47038427622155 -10.392000269019562
+ endloop
+endfacet
+facet normal -0.1130389983217937 0.06526309611005116 0.9914448613738113
+ outer loop
+ vertex -173.4978535934522 -73.03604828088599 -15.607999730980426
+ vertex -24.103042037166183 187.12097856533296 -15.700000000000038
+ vertex -174.10304203716566 -72.68664256999762 -15.699999999999937
+ endloop
+endfacet
+facet normal -0.1130389983217937 0.06526309611005116 0.9914448613738113
+ outer loop
+ vertex -24.103042037166183 187.12097856533296 -15.700000000000038
+ vertex -173.4978535934522 -73.03604828088599 -15.607999730980426
+ vertex -23.49785359345274 186.77157285444454 -15.607999730980529
+ endloop
+endfacet
+facet normal -0.8001031451912723 0.4619397662556388 0.3826834323650808
+ outer loop
+ vertex -171.84444801707352 -73.9906424354877 -13.69881142177675
+ vertex -22.07804203716615 185.95184427022406 -14.350000000000053
+ vertex -172.07804203716563 -73.85577686510652 -14.349999999999962
+ endloop
+endfacet
+facet normal -0.8001031451912723 0.4619397662556388 0.3826834323650808
+ outer loop
+ vertex -22.07804203716615 185.95184427022406 -14.350000000000053
+ vertex -171.84444801707352 -73.9906424354877 -13.69881142177675
+ vertex -21.844448017074033 185.81697869984282 -13.698811421776819
+ endloop
+endfacet
+facet normal -0.33141357403562616 0.19134171618250684 -0.9238795325112824
+ outer loop
+ vertex -23.497853593452625 186.77157285444477 -10.39200026901956
+ vertex -172.93390774205656 -73.36164256999741 -10.661731409781979
+ vertex -173.49785359345213 -73.03604828088585 -10.392000269019471
+ endloop
+endfacet
+facet normal -0.33141357403562616 0.19134171618250684 -0.9238795325112824
+ outer loop
+ vertex -172.93390774205656 -73.36164256999741 -10.661731409781979
+ vertex -23.497853593452625 186.77157285444477 -10.39200026901956
+ vertex -22.933907742057063 186.4459785653332 -10.661731409782044
+ endloop
+endfacet
+facet normal 0.6870641468694536 -0.3966766701456156 -0.6087614290087181
+ outer loop
+ vertex -26.128042037166153 188.29011286044198 -11.650000000000038
+ vertex -175.75644761354425 -71.73204841539567 -11.09081169079627
+ vertex -176.1280420371656 -71.51750827488856 -11.649999999999949
+ endloop
+endfacet
+facet normal 0.6870641468694536 -0.3966766701456156 -0.6087614290087181
+ outer loop
+ vertex -175.75644761354425 -71.73204841539567 -11.09081169079627
+ vertex -26.128042037166153 188.29011286044198 -11.650000000000038
+ vertex -25.756447613544758 188.0755727199349 -11.09081169079636
+ endloop
+endfacet
+facet normal 0.8586164364012749 -0.4957224306868801 0.13052619222005518
+ outer loop
+ vertex -176.36163605725775 -71.38264270450735 -13.698811421776757
+ vertex -26.441310627384183 188.47097856533296 -13.000000000000046
+ vertex -176.44131062738367 -71.3366425699976 -12.99999999999996
+ endloop
+endfacet
+facet normal 0.8586164364012749 -0.4957224306868801 0.13052619222005518
+ outer loop
+ vertex -26.441310627384183 188.47097856533296 -13.000000000000046
+ vertex -176.36163605725775 -71.38264270450735 -13.698811421776757
+ vertex -26.361636057258295 188.42497843082322 -13.698811421776844
+ endloop
+endfacet
+facet normal -0.8001031451912879 0.46193976625560285 -0.38268343236509217
+ outer loop
+ vertex -22.07804203716608 185.95184427022414 -11.650000000000011
+ vertex -171.8444480170735 -73.99064243548767 -12.301188578223135
+ vertex -172.07804203716557 -73.8557768651064 -11.649999999999945
+ endloop
+endfacet
+facet normal -0.8001031451912879 0.46193976625560285 -0.38268343236509217
+ outer loop
+ vertex -171.8444480170735 -73.99064243548767 -12.301188578223135
+ vertex -22.07804203716608 185.95184427022414 -11.650000000000011
+ vertex -21.844448017074008 185.81697869984293 -12.3011885782232
+ endloop
+endfacet
+facet normal -0.11303899832176335 0.06526309611003223 0.9914448613738159
+ outer loop
+ vertex -166.9894136987798 -76.79369780607962 -22.34548132206248
+ vertex -17.348043887647563 183.22097856533296 -22.400000000000045
+ vertex -167.34804388764704 -76.58664256999762 -22.399999999999952
+ endloop
+endfacet
+facet normal -0.11303899832176335 0.06526309611003223 0.9914448613738159
+ outer loop
+ vertex -17.348043887647563 183.22097856533296 -22.400000000000045
+ vertex -166.9894136987798 -76.79369780607962 -22.34548132206248
+ vertex -16.98941369878038 183.01392332925096 -22.34548132206257
+ endloop
+endfacet
+facet normal -0.6870641468694504 0.3966766701456194 0.6087614290087194
+ outer loop
+ vertex -22.07804203716615 185.95184427022406 -14.350000000000053
+ vertex -172.44963646078696 -73.64123672459937 -14.90918830920364
+ vertex -172.07804203716563 -73.85577686510652 -14.349999999999962
+ endloop
+endfacet
+facet normal -0.6870641468694504 0.3966766701456194 0.6087614290087194
+ outer loop
+ vertex -172.44963646078696 -73.64123672459937 -14.90918830920364
+ vertex -22.07804203716615 185.95184427022406 -14.350000000000053
+ vertex -22.449636460787545 186.16638441073113 -14.909188309203731
+ endloop
+endfacet
+facet normal 0.5272028623656518 -0.3043807145043581 -0.7933533402912477
+ outer loop
+ vertex -25.756447613544758 188.0755727199349 -11.09081169079636
+ vertex -175.27217633227457 -72.01164256999746 -10.661731409781982
+ vertex -175.75644761354425 -71.73204841539567 -11.09081169079627
+ endloop
+endfacet
+facet normal 0.5272028623656518 -0.3043807145043581 -0.7933533402912477
+ outer loop
+ vertex -175.27217633227457 -72.01164256999746 -10.661731409781982
+ vertex -25.756447613544758 188.0755727199349 -11.09081169079636
+ vertex -25.27217633227515 187.79597856533303 -10.661731409782071
+ endloop
+endfacet
+facet normal 0.11303899832182897 -0.06526309610998697 0.9914448613738115
+ outer loop
+ vertex -174.10304203716566 -72.68664256999762 -15.699999999999937
+ vertex -24.70823048087963 187.47038427622132 -15.607999730980517
+ vertex -174.7082304808791 -72.33723685910924 -15.60799973098044
+ endloop
+endfacet
+facet normal 0.11303899832182897 -0.06526309610998697 0.9914448613738115
+ outer loop
+ vertex -24.70823048087963 187.47038427622132 -15.607999730980517
+ vertex -174.10304203716566 -72.68664256999762 -15.699999999999937
+ vertex -24.103042037166183 187.12097856533296 -15.700000000000038
+ endloop
+endfacet
+facet normal -0.687064146869468 0.3966766701455844 -0.6087614290087221
+ outer loop
+ vertex -22.44963646078741 186.16638441073135 -11.090811690796333
+ vertex -172.07804203716557 -73.8557768651064 -11.649999999999945
+ vertex -172.44963646078693 -73.64123672459925 -11.090811690796267
+ endloop
+endfacet
+facet normal -0.687064146869468 0.3966766701455844 -0.6087614290087221
+ outer loop
+ vertex -172.07804203716557 -73.8557768651064 -11.649999999999945
+ vertex -22.44963646078741 186.16638441073135 -11.090811690796333
+ vertex -22.07804203716608 185.95184427022414 -11.650000000000011
+ endloop
+endfacet
+facet normal -0.8586164364012803 0.49572243068687194 -0.13052619222005102
+ outer loop
+ vertex -171.8444480170735 -73.99064243548767 -12.301188578223135
+ vertex -21.76477344694812 185.77097856533308 -13.000000000000021
+ vertex -171.76477344694763 -74.03664256999745 -12.999999999999954
+ endloop
+endfacet
+facet normal -0.8586164364012803 0.49572243068687194 -0.13052619222005102
+ outer loop
+ vertex -21.76477344694812 185.77097856533308 -13.000000000000021
+ vertex -171.8444480170735 -73.99064243548767 -12.301188578223135
+ vertex -21.844448017074008 185.81697869984293 -12.3011885782232
+ endloop
+endfacet
+facet normal -0.11303899832182897 0.06526309610998697 -0.9914448613738115
+ outer loop
+ vertex -24.103042037166073 187.1209785653331 -10.30000000000005
+ vertex -173.49785359345213 -73.03604828088585 -10.392000269019471
+ vertex -174.1030420371656 -72.68664256999745 -10.299999999999962
+ endloop
+endfacet
+facet normal -0.11303899832182897 0.06526309610998697 -0.9914448613738115
+ outer loop
+ vertex -173.49785359345213 -73.03604828088585 -10.392000269019471
+ vertex -24.103042037166073 187.1209785653331 -10.30000000000005
+ vertex -23.497853593452625 186.77157285444477 -10.39200026901956
+ endloop
+endfacet
+facet normal -0.3314135740355987 0.1913417161825699 0.9238795325112792
+ outer loop
+ vertex -166.65522356461946 -76.98664256999763 -22.185640646055063
+ vertex -16.98941369878038 183.01392332925096 -22.34548132206257
+ vertex -166.9894136987798 -76.79369780607962 -22.34548132206248
+ endloop
+endfacet
+facet normal -0.3314135740355987 0.1913417161825699 0.9238795325112792
+ outer loop
+ vertex -16.98941369878038 183.01392332925096 -22.34548132206257
+ vertex -166.65522356461946 -76.98664256999763 -22.185640646055063
+ vertex -16.655223564620044 182.8209785653329 -22.185640646055152
+ endloop
+endfacet
+facet normal 0.6870641468694714 -0.39667667014558067 0.6087614290087208
+ outer loop
+ vertex -175.75644761354434 -71.73204841539578 -14.909188309203646
+ vertex -26.12804203716622 188.29011286044195 -14.350000000000055
+ vertex -176.1280420371657 -71.51750827488864 -14.349999999999968
+ endloop
+endfacet
+facet normal 0.6870641468694714 -0.39667667014558067 0.6087614290087208
+ outer loop
+ vertex -26.12804203716622 188.29011286044195 -14.350000000000055
+ vertex -175.75644761354434 -71.73204841539578 -14.909188309203646
+ vertex -25.756447613544847 188.07557271993477 -14.909188309203735
+ endloop
+endfacet
+facet normal -0.5272028623656435 0.3043807145043646 0.7933533402912507
+ outer loop
+ vertex -166.36824799053372 -77.1523279949468 -21.93137084989845
+ vertex -16.655223564620044 182.8209785653329 -22.185640646055152
+ vertex -166.65522356461946 -76.98664256999763 -22.185640646055063
+ endloop
+endfacet
+facet normal -0.5272028623656435 0.3043807145043646 0.7933533402912507
+ outer loop
+ vertex -16.655223564620044 182.8209785653329 -22.185640646055152
+ vertex -166.36824799053372 -77.1523279949468 -21.93137084989845
+ vertex -16.368247990534318 182.6552931403837 -21.931370849898535
+ endloop
+endfacet
+facet normal 0.33141357403559235 -0.19134171618249016 0.923879532511298
+ outer loop
+ vertex -167.70667407651428 -76.3795873339156 -22.345481322062458
+ vertex -18.040864210675128 183.6209785653329 -22.185640646055155
+ vertex -168.0408642106746 -76.18664256999767 -22.185640646055052
+ endloop
+endfacet
+facet normal 0.33141357403559235 -0.19134171618249016 0.923879532511298
+ outer loop
+ vertex -18.040864210675128 183.6209785653329 -22.185640646055155
+ vertex -167.70667407651428 -76.3795873339156 -22.345481322062458
+ vertex -17.70667407651477 183.42803380141493 -22.345481322062547
+ endloop
+endfacet
+facet normal -0.5272028623656518 0.3043807145043581 0.7933533402912477
+ outer loop
+ vertex -172.44963646078696 -73.64123672459937 -14.90918830920364
+ vertex -22.933907742057176 186.44597856533298 -15.33826859021802
+ vertex -172.93390774205665 -73.36164256999754 -15.338268590217929
+ endloop
+endfacet
+facet normal -0.5272028623656518 0.3043807145043581 0.7933533402912477
+ outer loop
+ vertex -22.933907742057176 186.44597856533298 -15.33826859021802
+ vertex -172.44963646078696 -73.64123672459937 -14.90918830920364
+ vertex -22.449636460787545 186.16638441073113 -14.909188309203731
+ endloop
+endfacet
+facet normal -0.3314135740355922 0.19134171618256895 0.9238795325112817
+ outer loop
+ vertex -172.93390774205665 -73.36164256999754 -15.338268590217929
+ vertex -23.49785359345274 186.77157285444454 -15.607999730980529
+ vertex -173.4978535934522 -73.03604828088599 -15.607999730980426
+ endloop
+endfacet
+facet normal -0.3314135740355922 0.19134171618256895 0.9238795325112817
+ outer loop
+ vertex -23.49785359345274 186.77157285444454 -15.607999730980529
+ vertex -172.93390774205665 -73.36164256999754 -15.338268590217929
+ vertex -22.933907742057176 186.44597856533298 -15.33826859021802
+ endloop
+endfacet
+facet normal -0.8586164364012803 0.49572243068687194 0.1305261922200513
+ outer loop
+ vertex -21.76477344694812 185.77097856533308 -13.000000000000021
+ vertex -171.84444801707352 -73.9906424354877 -13.69881142177675
+ vertex -171.76477344694763 -74.03664256999745 -12.999999999999954
+ endloop
+endfacet
+facet normal -0.8586164364012803 0.49572243068687194 0.1305261922200513
+ outer loop
+ vertex -171.84444801707352 -73.9906424354877 -13.69881142177675
+ vertex -21.76477344694812 185.77097856533308 -13.000000000000021
+ vertex -21.844448017074033 185.81697869984282 -13.698811421776819
+ endloop
+endfacet
+facet normal 0.8586164364012798 -0.49572243068687166 -0.13052619222005538
+ outer loop
+ vertex -165.47229709936786 -77.6696054831421 -22.258819045102463
+ vertex -15.442787999321737 182.12097856533305 -22.00000000000003
+ vertex -165.44278799932124 -77.68664256999759 -21.99999999999995
+ endloop
+endfacet
+facet normal 0.8586164364012798 -0.49572243068687166 -0.13052619222005538
+ outer loop
+ vertex -15.442787999321737 182.12097856533305 -22.00000000000003
+ vertex -165.47229709936786 -77.6696054831421 -22.258819045102463
+ vertex -15.472297099368376 182.13801565218841 -22.25881904510254
+ endloop
+endfacet
+facet normal -0.6870641468694428 0.39667667014560937 0.6087614290087343
+ outer loop
+ vertex -16.14804388764752 182.52815824230544 -21.600000000000065
+ vertex -166.36824799053372 -77.1523279949468 -21.93137084989845
+ vertex -166.148043887647 -77.27946289302511 -21.599999999999977
+ endloop
+endfacet
+facet normal -0.6870641468694428 0.39667667014560937 0.6087614290087343
+ outer loop
+ vertex -166.36824799053372 -77.1523279949468 -21.93137084989845
+ vertex -16.14804388764752 182.52815824230544 -21.600000000000065
+ vertex -16.368247990534318 182.6552931403837 -21.931370849898535
+ endloop
+endfacet
+facet normal 0.3314135740356219 -0.19134171618251283 0.9238795325112827
+ outer loop
+ vertex -174.7082304808791 -72.33723685910924 -15.60799973098044
+ vertex -25.272176332275194 187.79597856533294 -15.338268590218007
+ vertex -175.27217633227468 -72.01164256999762 -15.33826859021793
+ endloop
+endfacet
+facet normal 0.3314135740356219 -0.19134171618251283 0.9238795325112827
+ outer loop
+ vertex -25.272176332275194 187.79597856533294 -15.338268590218007
+ vertex -174.7082304808791 -72.33723685910924 -15.60799973098044
+ vertex -24.70823048087963 187.47038427622132 -15.607999730980517
+ endloop
+endfacet
+facet normal 0.3314135740355987 -0.1913417161825699 -0.9238795325112792
+ outer loop
+ vertex -18.04086421067506 183.620978565333 -19.41435935394494
+ vertex -167.7066740765142 -76.37958733391552 -19.254518677937433
+ vertex -168.04086421067453 -76.18664256999756 -19.41435935394484
+ endloop
+endfacet
+facet normal 0.3314135740355987 -0.1913417161825699 -0.9238795325112792
+ outer loop
+ vertex -167.7066740765142 -76.37958733391552 -19.254518677937433
+ vertex -18.04086421067506 183.620978565333 -19.41435935394494
+ vertex -17.706674076514748 183.42803380141498 -19.254518677937522
+ endloop
+endfacet
+facet normal -0.11303899832184455 0.06526309610999596 -0.9914448613738092
+ outer loop
+ vertex -17.348043887647517 183.22097856533298 -19.20000000000005
+ vertex -166.98941369877974 -76.79369780607954 -19.254518677937455
+ vertex -167.34804388764698 -76.58664256999752 -19.19999999999996
+ endloop
+endfacet
+facet normal -0.11303899832184455 0.06526309610999596 -0.9914448613738092
+ outer loop
+ vertex -166.98941369877974 -76.79369780607954 -19.254518677937455
+ vertex -17.348043887647517 183.22097856533298 -19.20000000000005
+ vertex -16.989413698780243 183.013923329251 -19.254518677937543
+ endloop
+endfacet
+facet normal -0.8586164364012763 0.4957224306868809 -0.1305261922200438
+ outer loop
+ vertex -16.009617801666977 182.44823790430183 -20.385889527836035
+ vertex -165.96240324159186 -77.38664256999755 -20.79999999999998
+ vertex -166.00961780166648 -77.35938323102881 -20.385889527835946
+ endloop
+endfacet
+facet normal -0.8586164364012763 0.4957224306868809 -0.1305261922200438
+ outer loop
+ vertex -165.96240324159186 -77.38664256999755 -20.79999999999998
+ vertex -16.009617801666977 182.44823790430183 -20.385889527836035
+ vertex -15.962403241592387 182.4209785653331 -20.800000000000065
+ endloop
+endfacet
+facet normal 0.858616436401279 -0.4957224306868712 -0.13052619222006182
+ outer loop
+ vertex -18.733684533702647 184.020978565333 -20.800000000000026
+ vertex -168.6864699736275 -75.81390190896636 -20.385889527835893
+ vertex -168.73368453370216 -75.78664256999762 -20.799999999999926
+ endloop
+endfacet
+facet normal 0.858616436401279 -0.4957224306868712 -0.13052619222006182
+ outer loop
+ vertex -168.6864699736275 -75.81390190896636 -20.385889527835893
+ vertex -18.733684533702647 184.020978565333 -20.800000000000026
+ vertex -18.686469973628014 183.99371922636428 -20.385889527835992
+ endloop
+endfacet
+facet normal 0.6870641468694699 -0.39667667014557983 0.608761429008723
+ outer loop
+ vertex -18.32783978476083 183.78666399028216 -21.931370849898517
+ vertex -168.54804388764705 -75.89382224697007 -21.599999999999945
+ vertex -168.32783978476033 -76.0209571450484 -21.931370849898414
+ endloop
+endfacet
+facet normal 0.6870641468694699 -0.39667667014557983 0.608761429008723
+ outer loop
+ vertex -168.54804388764705 -75.89382224697007 -21.599999999999945
+ vertex -18.32783978476083 183.78666399028216 -21.931370849898517
+ vertex -18.548043887647626 183.91379888836042 -21.600000000000044
+ endloop
+endfacet
+facet normal -0.85861643640128 0.4957224306868831 -0.13052619222001063
+ outer loop
+ vertex -16.009617801666703 182.44823790430226 -4.78588952783602
+ vertex -165.96240324159163 -77.38664256999704 -5.199999999999962
+ vertex -166.00961780166622 -77.3593832310283 -4.785889527835931
+ endloop
+endfacet
+facet normal -0.85861643640128 0.4957224306868831 -0.13052619222001063
+ outer loop
+ vertex -165.96240324159163 -77.38664256999704 -5.199999999999962
+ vertex -16.009617801666703 182.44823790430226 -4.78588952783602
+ vertex -15.962403241592185 182.42097856533346 -5.200000000000053
+ endloop
+endfacet
+facet normal -0.5272028623657163 0.3043807145043165 -0.7933533402912205
+ outer loop
+ vertex -16.655223564619952 182.82097856533304 -19.414359353944935
+ vertex -166.36824799053372 -77.15232799494673 -19.668629150101488
+ vertex -166.65522356461943 -76.98664256999751 -19.41435935394485
+ endloop
+endfacet
+facet normal -0.5272028623657163 0.3043807145043165 -0.7933533402912205
+ outer loop
+ vertex -166.36824799053372 -77.15232799494673 -19.668629150101488
+ vertex -16.655223564619952 182.82097856533304 -19.414359353944935
+ vertex -16.368247990534183 182.65529314038383 -19.668629150101573
+ endloop
+endfacet
+facet normal 0.11303899832176201 -0.06526309611003285 -0.991444861373816
+ outer loop
+ vertex -17.706674076514748 183.42803380141498 -19.254518677937522
+ vertex -167.34804388764698 -76.58664256999752 -19.19999999999996
+ vertex -167.7066740765142 -76.37958733391552 -19.254518677937433
+ endloop
+endfacet
+facet normal 0.11303899832176201 -0.06526309611003285 -0.991444861373816
+ outer loop
+ vertex -167.34804388764698 -76.58664256999752 -19.19999999999996
+ vertex -17.706674076514748 183.42803380141498 -19.254518677937522
+ vertex -17.348043887647517 183.22097856533298 -19.20000000000005
+ endloop
+endfacet
+facet normal -0.858616436401279 0.4957224306868712 0.13052619222006182
+ outer loop
+ vertex -165.96240324159186 -77.38664256999755 -20.79999999999998
+ vertex -16.009617801666977 182.4482379043018 -21.214110472164098
+ vertex -166.0096178016665 -77.35938323102883 -21.21411047216401
+ endloop
+endfacet
+facet normal -0.858616436401279 0.4957224306868712 0.13052619222006182
+ outer loop
+ vertex -16.009617801666977 182.4482379043018 -21.214110472164098
+ vertex -165.96240324159186 -77.38664256999755 -20.79999999999998
+ vertex -15.962403241592387 182.4209785653331 -20.800000000000065
+ endloop
+endfacet
+facet normal 0.3314135740355431 -0.1913417161825406 -0.9238795325113052
+ outer loop
+ vertex -18.04086421067479 183.62097856533347 -3.8143593539449228
+ vertex -167.7066740765139 -76.37958733391504 -3.654518677937438
+ vertex -168.04086421067427 -76.18664256999706 -3.8143593539448326
+ endloop
+endfacet
+facet normal 0.3314135740355431 -0.1913417161825406 -0.9238795325113052
+ outer loop
+ vertex -167.7066740765139 -76.37958733391504 -3.654518677937438
+ vertex -18.04086421067479 183.62097856533347 -3.8143593539449228
+ vertex -17.70667407651443 183.42803380141552 -3.6545186779375283
+ endloop
+endfacet
+facet normal -0.6870641468694699 0.39667667014557983 -0.608761429008723
+ outer loop
+ vertex -166.36824799053372 -77.15232799494673 -19.668629150101488
+ vertex -16.148043887647475 182.52815824230547 -20.000000000000046
+ vertex -166.14804388764696 -77.27946289302508 -19.999999999999957
+ endloop
+endfacet
+facet normal -0.6870641468694699 0.39667667014557983 -0.608761429008723
+ outer loop
+ vertex -16.148043887647475 182.52815824230547 -20.000000000000046
+ vertex -166.36824799053372 -77.15232799494673 -19.668629150101488
+ vertex -16.368247990534183 182.65529314038383 -19.668629150101573
+ endloop
+endfacet
+facet normal -0.6870641468694759 0.39667667014558894 -0.6087614290087102
+ outer loop
+ vertex -166.36824799053343 -77.15232799494626 -4.068629150101493
+ vertex -16.148043887647294 182.52815824230598 -4.400000000000054
+ vertex -166.1480438876467 -77.27946289302459 -4.399999999999964
+ endloop
+endfacet
+facet normal -0.6870641468694759 0.39667667014558894 -0.6087614290087102
+ outer loop
+ vertex -16.148043887647294 182.52815824230598 -4.400000000000054
+ vertex -166.36824799053343 -77.15232799494626 -4.068629150101493
+ vertex -16.368247990533934 182.6552931403843 -4.068629150101582
+ endloop
+endfacet
+facet normal 0.858616436401279 -0.4957224306868712 -0.13052619222006182
+ outer loop
+ vertex -18.733684533702444 184.0209785653334 -5.200000000000033
+ vertex -168.68646997362725 -75.81390190896586 -4.785889527835911
+ vertex -168.73368453370185 -75.78664256999716 -5.1999999999999424
+ endloop
+endfacet
+facet normal 0.858616436401279 -0.4957224306868712 -0.13052619222006182
+ outer loop
+ vertex -168.68646997362725 -75.81390190896586 -4.785889527835911
+ vertex -18.733684533702444 184.0209785653334 -5.200000000000033
+ vertex -18.686469973627744 183.99371922636468 -4.785889527836001
+ endloop
+endfacet
+facet normal -0.331413574035631 0.19134171618251528 -0.9238795325112789
+ outer loop
+ vertex -16.98941369877997 183.01392332925155 -3.6545186779375283
+ vertex -166.65522356461915 -76.98664256999704 -3.8143593539448553
+ vertex -166.98941369877946 -76.79369780607902 -3.654518677937438
+ endloop
+endfacet
+facet normal -0.331413574035631 0.19134171618251528 -0.9238795325112789
+ outer loop
+ vertex -166.65522356461915 -76.98664256999704 -3.8143593539448553
+ vertex -16.98941369877997 183.01392332925155 -3.6545186779375283
+ vertex -16.65522356461966 182.82097856533352 -3.8143593539449454
+ endloop
+endfacet
+facet normal -0.8001031451912812 0.46193976625559896 -0.3826834323651106
+ outer loop
+ vertex -166.1480438876467 -77.27946289302459 -4.399999999999964
+ vertex -16.009617801666703 182.44823790430226 -4.78588952783602
+ vertex -166.00961780166622 -77.3593832310283 -4.785889527835931
+ endloop
+endfacet
+facet normal -0.8001031451912812 0.46193976625559896 -0.3826834323651106
+ outer loop
+ vertex -16.009617801666703 182.44823790430226 -4.78588952783602
+ vertex -166.1480438876467 -77.27946289302459 -4.399999999999964
+ vertex -16.148043887647294 182.52815824230598 -4.400000000000054
+ endloop
+endfacet
+facet normal -0.33141357403559024 0.19134171618248894 -0.923879532511299
+ outer loop
+ vertex -16.989413698780243 183.013923329251 -19.254518677937543
+ vertex -166.65522356461943 -76.98664256999751 -19.41435935394485
+ vertex -166.98941369877974 -76.79369780607954 -19.254518677937455
+ endloop
+endfacet
+facet normal -0.33141357403559024 0.19134171618248894 -0.923879532511299
+ outer loop
+ vertex -166.65522356461943 -76.98664256999751 -19.41435935394485
+ vertex -16.989413698780243 183.013923329251 -19.254518677937543
+ vertex -16.655223564619952 182.82097856533304 -19.414359353944935
+ endloop
+endfacet
+facet normal 0.5272028623656435 -0.3043807145043646 -0.7933533402912507
+ outer loop
+ vertex -18.32783978476081 183.78666399028225 -19.668629150101555
+ vertex -168.04086421067453 -76.18664256999756 -19.41435935394484
+ vertex -168.32783978476027 -76.02095714504833 -19.668629150101452
+ endloop
+endfacet
+facet normal 0.5272028623656435 -0.3043807145043646 -0.7933533402912507
+ outer loop
+ vertex -168.04086421067453 -76.18664256999756 -19.41435935394484
+ vertex -18.32783978476081 183.78666399028225 -19.668629150101555
+ vertex -18.04086421067506 183.620978565333 -19.41435935394494
+ endloop
+endfacet
+facet normal -0.858616436401279 0.4957224306868712 0.13052619222006182
+ outer loop
+ vertex -165.96240324159163 -77.38664256999704 -5.199999999999962
+ vertex -16.00961780166677 182.44823790430226 -5.614110472164084
+ vertex -166.00961780166625 -77.35938323102832 -5.614110472163994
+ endloop
+endfacet
+facet normal -0.858616436401279 0.4957224306868712 0.13052619222006182
+ outer loop
+ vertex -16.00961780166677 182.44823790430226 -5.614110472164084
+ vertex -165.96240324159163 -77.38664256999704 -5.199999999999962
+ vertex -15.962403241592185 182.42097856533346 -5.200000000000053
+ endloop
+endfacet
+facet normal 0.5272028623656568 -0.30438071450436105 -0.7933533402912432
+ outer loop
+ vertex -18.327839784760513 183.78666399028273 -4.068629150101538
+ vertex -168.04086421067427 -76.18664256999706 -3.8143593539448326
+ vertex -168.32783978476002 -76.02095714504783 -4.068629150101447
+ endloop
+endfacet
+facet normal 0.5272028623656568 -0.30438071450436105 -0.7933533402912432
+ outer loop
+ vertex -168.04086421067427 -76.18664256999706 -3.8143593539448326
+ vertex -18.327839784760513 183.78666399028273 -4.068629150101538
+ vertex -18.04086421067479 183.62097856533347 -3.8143593539449228
+ endloop
+endfacet
+facet normal 0.8001031451912887 -0.4619397662556257 -0.3826834323650627
+ outer loop
+ vertex -18.686469973627744 183.99371922636468 -4.785889527836001
+ vertex -168.54804388764677 -75.89382224696955 -4.399999999999944
+ vertex -168.68646997362725 -75.81390190896586 -4.785889527835911
+ endloop
+endfacet
+facet normal 0.8001031451912887 -0.4619397662556257 -0.3826834323650627
+ outer loop
+ vertex -168.54804388764677 -75.89382224696955 -4.399999999999944
+ vertex -18.686469973627744 183.99371922636468 -4.785889527836001
+ vertex -18.548043887647335 183.91379888836096 -4.400000000000034
+ endloop
+endfacet
+facet normal 0.8586164364012763 -0.4957224306868808 0.1305261922200434
+ outer loop
+ vertex -168.68646997362754 -75.81390190896637 -21.21411047216398
+ vertex -18.733684533702647 184.020978565333 -20.800000000000026
+ vertex -168.73368453370216 -75.78664256999762 -20.799999999999926
+ endloop
+endfacet
+facet normal 0.8586164364012763 -0.4957224306868808 0.1305261922200434
+ outer loop
+ vertex -18.733684533702647 184.020978565333 -20.800000000000026
+ vertex -168.68646997362754 -75.81390190896637 -21.21411047216398
+ vertex -18.68646997362806 183.99371922636422 -21.21411047216408
+ endloop
+endfacet
+facet normal 0.8001031451912762 -0.4619397662556186 -0.3826834323650973
+ outer loop
+ vertex -18.686469973628014 183.99371922636428 -20.385889527835992
+ vertex -168.54804388764703 -75.89382224697005 -19.999999999999925
+ vertex -168.6864699736275 -75.81390190896636 -20.385889527835893
+ endloop
+endfacet
+facet normal 0.8001031451912762 -0.4619397662556186 -0.3826834323650973
+ outer loop
+ vertex -168.54804388764703 -75.89382224697005 -19.999999999999925
+ vertex -18.686469973628014 183.99371922636428 -20.385889527835992
+ vertex -18.548043887647516 183.91379888836056 -20.000000000000025
+ endloop
+endfacet
+facet normal -0.8001031451913012 0.4619397662555992 -0.38268343236506847
+ outer loop
+ vertex -166.14804388764696 -77.27946289302508 -19.999999999999957
+ vertex -16.009617801666977 182.44823790430183 -20.385889527836035
+ vertex -166.00961780166648 -77.35938323102881 -20.385889527835946
+ endloop
+endfacet
+facet normal -0.8001031451913012 0.4619397662555992 -0.38268343236506847
+ outer loop
+ vertex -16.009617801666977 182.44823790430183 -20.385889527836035
+ vertex -166.14804388764696 -77.27946289302508 -19.999999999999957
+ vertex -16.148043887647475 182.52815824230547 -20.000000000000046
+ endloop
+endfacet
+facet normal 0.11303899832181014 -0.06526309611005923 -0.9914448613738089
+ outer loop
+ vertex -17.70667407651443 183.42803380141552 -3.6545186779375283
+ vertex -167.3480438876467 -76.58664256999705 -3.599999999999943
+ vertex -167.7066740765139 -76.37958733391504 -3.654518677937438
+ endloop
+endfacet
+facet normal 0.11303899832181014 -0.06526309611005923 -0.9914448613738089
+ outer loop
+ vertex -167.3480438876467 -76.58664256999705 -3.599999999999943
+ vertex -17.70667407651443 183.42803380141552 -3.6545186779375283
+ vertex -17.3480438876472 183.2209785653335 -3.600000000000033
+ endloop
+endfacet
+facet normal -0.11303899832184455 0.06526309610999596 -0.9914448613738092
+ outer loop
+ vertex -17.3480438876472 183.2209785653335 -3.600000000000033
+ vertex -166.98941369877946 -76.79369780607902 -3.654518677937438
+ vertex -167.3480438876467 -76.58664256999705 -3.599999999999943
+ endloop
+endfacet
+facet normal -0.11303899832184455 0.06526309610999596 -0.9914448613738092
+ outer loop
+ vertex -166.98941369877946 -76.79369780607902 -3.654518677937438
+ vertex -17.3480438876472 183.2209785653335 -3.600000000000033
+ vertex -16.98941369877997 183.01392332925155 -3.6545186779375283
+ endloop
+endfacet
+facet normal 0.8001031451912916 -0.46193976625560496 0.38268343236508173
+ outer loop
+ vertex -18.548043887647626 183.91379888836042 -21.600000000000044
+ vertex -168.68646997362754 -75.81390190896637 -21.21411047216398
+ vertex -168.54804388764705 -75.89382224697007 -21.599999999999945
+ endloop
+endfacet
+facet normal 0.8001031451912916 -0.46193976625560496 0.38268343236508173
+ outer loop
+ vertex -168.68646997362754 -75.81390190896637 -21.21411047216398
+ vertex -18.548043887647626 183.91379888836042 -21.600000000000044
+ vertex -18.68646997362806 183.99371922636422 -21.21411047216408
+ endloop
+endfacet
+facet normal 0.5272028623657087 -0.3043807145043233 0.7933533402912231
+ outer loop
+ vertex -168.0408642106746 -76.18664256999767 -22.185640646055052
+ vertex -18.32783978476083 183.78666399028216 -21.931370849898517
+ vertex -168.32783978476033 -76.0209571450484 -21.931370849898414
+ endloop
+endfacet
+facet normal 0.5272028623657087 -0.3043807145043233 0.7933533402912231
+ outer loop
+ vertex -18.32783978476083 183.78666399028216 -21.931370849898517
+ vertex -168.0408642106746 -76.18664256999767 -22.185640646055052
+ vertex -18.040864210675128 183.6209785653329 -22.185640646055155
+ endloop
+endfacet
+facet normal -0.5272028623657142 0.3043807145043265 -0.7933533402912182
+ outer loop
+ vertex -16.65522356461966 182.82097856533352 -3.8143593539449454
+ vertex -166.36824799053343 -77.15232799494626 -4.068629150101493
+ vertex -166.65522356461915 -76.98664256999704 -3.8143593539448553
+ endloop
+endfacet
+facet normal -0.5272028623657142 0.3043807145043265 -0.7933533402912182
+ outer loop
+ vertex -166.36824799053343 -77.15232799494626 -4.068629150101493
+ vertex -16.65522356461966 182.82097856533352 -3.8143593539449454
+ vertex -16.368247990533934 182.6552931403843 -4.068629150101582
+ endloop
+endfacet
+facet normal -0.8001031451912762 0.4619397662556186 0.3826834323650973
+ outer loop
+ vertex -16.009617801666977 182.4482379043018 -21.214110472164098
+ vertex -166.148043887647 -77.27946289302511 -21.599999999999977
+ vertex -166.0096178016665 -77.35938323102883 -21.21411047216401
+ endloop
+endfacet
+facet normal -0.8001031451912762 0.4619397662556186 0.3826834323650973
+ outer loop
+ vertex -166.148043887647 -77.27946289302511 -21.599999999999977
+ vertex -16.009617801666977 182.4482379043018 -21.214110472164098
+ vertex -16.14804388764752 182.52815824230544 -21.600000000000065
+ endloop
+endfacet
+facet normal -0.8001031451912887 0.4619397662556257 0.3826834323650627
+ outer loop
+ vertex -16.00961780166677 182.44823790430226 -5.614110472164084
+ vertex -166.14804388764674 -77.27946289302463 -5.999999999999961
+ vertex -166.00961780166625 -77.35938323102832 -5.614110472163994
+ endloop
+endfacet
+facet normal -0.8001031451912887 0.4619397662556257 0.3826834323650627
+ outer loop
+ vertex -166.14804388764674 -77.27946289302463 -5.999999999999961
+ vertex -16.00961780166677 182.44823790430226 -5.614110472164084
+ vertex -16.148043887647294 182.52815824230586 -6.000000000000051
+ endloop
+endfacet
+facet normal 0.6870641468694545 -0.39667667014561614 -0.6087614290087167
+ outer loop
+ vertex -18.548043887647335 183.91379888836096 -4.400000000000034
+ vertex -168.32783978476002 -76.02095714504783 -4.068629150101447
+ vertex -168.54804388764677 -75.89382224696955 -4.399999999999944
+ endloop
+endfacet
+facet normal 0.6870641468694545 -0.39667667014561614 -0.6087614290087167
+ outer loop
+ vertex -168.32783978476002 -76.02095714504783 -4.068629150101447
+ vertex -18.548043887647335 183.91379888836096 -4.400000000000034
+ vertex -18.327839784760513 183.78666399028273 -4.068629150101538
+ endloop
+endfacet
+facet normal 0.6870641468694428 -0.39667667014560937 -0.6087614290087343
+ outer loop
+ vertex -18.548043887647516 183.91379888836056 -20.000000000000025
+ vertex -168.32783978476027 -76.02095714504833 -19.668629150101452
+ vertex -168.54804388764703 -75.89382224697005 -19.999999999999925
+ endloop
+endfacet
+facet normal 0.6870641468694428 -0.39667667014560937 -0.6087614290087343
+ outer loop
+ vertex -168.32783978476027 -76.02095714504833 -19.668629150101452
+ vertex -18.548043887647516 183.91379888836056 -20.000000000000025
+ vertex -18.32783978476081 183.78666399028225 -19.668629150101555
+ endloop
+endfacet
+facet normal 0.858616436401279 -0.4957224306868712 -0.13052619222006182
+ outer loop
+ vertex -182.24368083273936 -67.9866425699975 -5.199999999999923
+ vertex -32.19646627266526 191.79371922636432 -4.785889527835981
+ vertex -182.19646627266474 -68.01390190896625 -4.785889527835891
+ endloop
+endfacet
+facet normal 0.858616436401279 -0.4957224306868712 -0.13052619222006182
+ outer loop
+ vertex -32.19646627266526 191.79371922636432 -4.785889527835981
+ vertex -182.24368083273936 -67.9866425699975 -5.199999999999923
+ vertex -32.24368083273991 191.82097856533298 -5.200000000000013
+ endloop
+endfacet
+facet normal -0.5272028623657087 0.3043807145043233 -0.7933533402912231
+ outer loop
+ vertex -30.16521986365713 190.6209785653331 -3.814359353944937
+ vertex -179.8782442895709 -69.35232799494665 -4.068629150101484
+ vertex -180.1652198636566 -69.18664256999742 -3.814359353944847
+ endloop
+endfacet
+facet normal -0.5272028623657087 0.3043807145043233 -0.7933533402912231
+ outer loop
+ vertex -179.8782442895709 -69.35232799494665 -4.068629150101484
+ vertex -30.16521986365713 190.6209785653331 -3.814359353944937
+ vertex -29.878244289571427 190.4552931403839 -4.068629150101574
+ endloop
+endfacet
+facet normal 0.331413574035631 -0.19134171618251528 0.9238795325112789
+ outer loop
+ vertex -167.70667407651402 -76.3795873339151 -6.745481322062464
+ vertex -18.040864210674833 183.62097856533344 -6.585640646055137
+ vertex -168.04086421067436 -76.18664256999716 -6.5856406460550465
+ endloop
+endfacet
+facet normal 0.331413574035631 -0.19134171618251528 0.9238795325112789
+ outer loop
+ vertex -18.040864210674833 183.62097856533344 -6.585640646055137
+ vertex -167.70667407651402 -76.3795873339151 -6.745481322062464
+ vertex -17.706674076514567 183.42803380141538 -6.745481322062554
+ endloop
+endfacet
+facet normal -0.5272028623656505 0.3043807145043517 0.7933533402912508
+ outer loop
+ vertex -179.87824428957094 -69.35232799494672 -6.3313708498984465
+ vertex -30.165219863657196 190.62097856533308 -6.585640646055151
+ vertex -180.1652198636567 -69.1866425699975 -6.585640646055061
+ endloop
+endfacet
+facet normal -0.5272028623656505 0.3043807145043517 0.7933533402912508
+ outer loop
+ vertex -30.165219863657196 190.62097856533308 -6.585640646055151
+ vertex -179.87824428957094 -69.35232799494672 -6.3313708498984465
+ vertex -29.878244289571473 190.45529314038384 -6.331370849898536
+ endloop
+endfacet
+facet normal -0.5272028623656863 0.30438071450437804 0.7933533402912171
+ outer loop
+ vertex -166.3682479905335 -77.1523279949463 -6.331370849898432
+ vertex -16.655223564619703 182.82097856533343 -6.585640646055159
+ vertex -166.65522356461923 -76.98664256999712 -6.58564064605507
+ endloop
+endfacet
+facet normal -0.5272028623656863 0.30438071450437804 0.7933533402912171
+ outer loop
+ vertex -16.655223564619703 182.82097856533343 -6.585640646055159
+ vertex -166.3682479905335 -77.1523279949463 -6.331370849898432
+ vertex -16.36824799053398 182.65529314038423 -6.331370849898522
+ endloop
+endfacet
+facet normal 0.6870641468694759 -0.39667667014558894 0.6087614290087102
+ outer loop
+ vertex -18.32783978476065 183.78666399028262 -6.3313708498985
+ vertex -168.5480438876468 -75.89382224696958 -5.999999999999941
+ vertex -168.32783978476004 -76.0209571450479 -6.331370849898409
+ endloop
+endfacet
+facet normal 0.6870641468694759 -0.39667667014558894 0.6087614290087102
+ outer loop
+ vertex -168.5480438876468 -75.89382224696958 -5.999999999999941
+ vertex -18.32783978476065 183.78666399028262 -6.3313708498985
+ vertex -18.548043887647314 183.91379888836096 -6.000000000000031
+ endloop
+endfacet
+facet normal 0.3314135740355987 -0.1913417161825699 -0.9238795325112792
+ outer loop
+ vertex -31.550860509712304 191.42097856533306 -3.8143593539449396
+ vertex -181.2166703755514 -68.57958733391541 -3.654518677937407
+ vertex -181.55086050971175 -68.38664256999745 -3.8143593539448384
+ endloop
+endfacet
+facet normal 0.3314135740355987 -0.1913417161825699 -0.9238795325112792
+ outer loop
+ vertex -181.2166703755514 -68.57958733391541 -3.654518677937407
+ vertex -31.550860509712304 191.42097856533306 -3.8143593539449396
+ vertex -31.216670375551946 191.22803380141514 -3.65451867793752
+ endloop
+endfacet
+facet normal 0.6870641468694428 -0.39667667014560937 -0.6087614290087343
+ outer loop
+ vertex -32.058040186684785 191.71379888836057 -4.400000000000015
+ vertex -181.83783608379747 -68.22095714504822 -4.068629150101453
+ vertex -182.05804018668422 -68.09382224696995 -4.399999999999924
+ endloop
+endfacet
+facet normal 0.6870641468694428 -0.39667667014560937 -0.6087614290087343
+ outer loop
+ vertex -181.83783608379747 -68.22095714504822 -4.068629150101453
+ vertex -32.058040186684785 191.71379888836057 -4.400000000000015
+ vertex -31.837836083797985 191.58666399028237 -4.068629150101555
+ endloop
+endfacet
+facet normal -0.33141357403559235 0.19134171618249016 -0.923879532511298
+ outer loop
+ vertex -30.49940999781753 190.81392332925108 -3.6545186779375425
+ vertex -180.1652198636566 -69.18664256999742 -3.814359353944847
+ vertex -180.4994099978169 -68.99369780607941 -3.654518677937452
+ endloop
+endfacet
+facet normal -0.33141357403559235 0.19134171618249016 -0.923879532511298
+ outer loop
+ vertex -180.1652198636566 -69.18664256999742 -3.814359353944847
+ vertex -30.49940999781753 190.81392332925108 -3.6545186779375425
+ vertex -30.16521986365713 190.6209785653331 -3.814359353944937
+ endloop
+endfacet
+facet normal -0.11303899832180345 0.06526309611005678 0.9914448613738097
+ outer loop
+ vertex -166.98941369877954 -76.79369780607912 -6.745481322062464
+ vertex -17.348043887647314 183.2209785653335 -6.80000000000005
+ vertex -167.34804388764678 -76.58664256999711 -6.799999999999959
+ endloop
+endfacet
+facet normal -0.11303899832180345 0.06526309611005678 0.9914448613738097
+ outer loop
+ vertex -17.348043887647314 183.2209785653335 -6.80000000000005
+ vertex -166.98941369877954 -76.79369780607912 -6.745481322062464
+ vertex -16.989413698780062 183.0139233292514 -6.745481322062554
+ endloop
+endfacet
+facet normal -0.6870641468694699 0.39667667014557983 -0.608761429008723
+ outer loop
+ vertex -179.8782442895709 -69.35232799494665 -4.068629150101484
+ vertex -29.658040186684765 190.32815824230553 -4.400000000000046
+ vertex -179.65804018668416 -69.47946289302497 -4.399999999999955
+ endloop
+endfacet
+facet normal -0.6870641468694699 0.39667667014557983 -0.608761429008723
+ outer loop
+ vertex -29.658040186684765 190.32815824230553 -4.400000000000046
+ vertex -179.8782442895709 -69.35232799494665 -4.068629150101484
+ vertex -29.878244289571427 190.4552931403839 -4.068629150101574
+ endloop
+endfacet
+facet normal -0.8001031451912916 0.46193976625560496 -0.38268343236508173
+ outer loop
+ vertex -179.65804018668416 -69.47946289302497 -4.399999999999955
+ vertex -29.519614100704196 190.24823790430187 -4.785889527836012
+ vertex -179.5196141007037 -69.55938323102869 -4.785889527835922
+ endloop
+endfacet
+facet normal -0.8001031451912916 0.46193976625560496 -0.38268343236508173
+ outer loop
+ vertex -29.519614100704196 190.24823790430187 -4.785889527836012
+ vertex -179.65804018668416 -69.47946289302497 -4.399999999999955
+ vertex -29.658040186684765 190.32815824230553 -4.400000000000046
+ endloop
+endfacet
+facet normal -0.8586164364012763 0.4957224306868808 -0.1305261922200434
+ outer loop
+ vertex -29.519614100704196 190.24823790430187 -4.785889527836012
+ vertex -179.47239954062908 -69.58664256999745 -5.199999999999976
+ vertex -179.5196141007037 -69.55938323102869 -4.785889527835922
+ endloop
+endfacet
+facet normal -0.8586164364012763 0.4957224306868808 -0.1305261922200434
+ outer loop
+ vertex -179.47239954062908 -69.58664256999745 -5.199999999999976
+ vertex -29.519614100704196 190.24823790430187 -4.785889527836012
+ vertex -29.472399540629656 190.22097856533307 -5.200000000000067
+ endloop
+endfacet
+facet normal -0.6870641468694373 0.39667667014560615 0.6087614290087427
+ outer loop
+ vertex -16.148043887647294 182.52815824230586 -6.000000000000051
+ vertex -166.3682479905335 -77.1523279949463 -6.331370849898432
+ vertex -166.14804388764674 -77.27946289302463 -5.999999999999961
+ endloop
+endfacet
+facet normal -0.6870641468694373 0.39667667014560615 0.6087614290087427
+ outer loop
+ vertex -166.3682479905335 -77.1523279949463 -6.331370849898432
+ vertex -16.148043887647294 182.52815824230586 -6.000000000000051
+ vertex -16.36824799053398 182.65529314038423 -6.331370849898522
+ endloop
+endfacet
+facet normal 0.85861643640128 -0.4957224306868831 0.13052619222001063
+ outer loop
+ vertex -18.68646997362779 183.99371922636473 -5.6141104721640644
+ vertex -168.73368453370185 -75.78664256999716 -5.1999999999999424
+ vertex -168.68646997362728 -75.81390190896589 -5.614110472163975
+ endloop
+endfacet
+facet normal 0.85861643640128 -0.4957224306868831 0.13052619222001063
+ outer loop
+ vertex -168.73368453370185 -75.78664256999716 -5.1999999999999424
+ vertex -18.68646997362779 183.99371922636473 -5.6141104721640644
+ vertex -18.733684533702444 184.0209785653334 -5.200000000000033
+ endloop
+endfacet
+facet normal 0.33141357403559024 -0.19134171618248894 0.923879532511299
+ outer loop
+ vertex -181.2166703755515 -68.57958733391551 -6.7454813220624334
+ vertex -31.550860509712372 191.42097856533303 -6.585640646055154
+ vertex -181.55086050971184 -68.38664256999753 -6.585640646055053
+ endloop
+endfacet
+facet normal 0.33141357403559024 -0.19134171618248894 0.923879532511299
+ outer loop
+ vertex -31.550860509712372 191.42097856533303 -6.585640646055154
+ vertex -181.2166703755515 -68.57958733391551 -6.7454813220624334
+ vertex -31.216670375552013 191.22803380141505 -6.745481322062546
+ endloop
+endfacet
+facet normal 0.6870641468694699 -0.39667667014557983 0.608761429008723
+ outer loop
+ vertex -31.837836083798095 191.58666399028218 -6.331370849898517
+ vertex -182.05804018668428 -68.09382224696996 -5.999999999999944
+ vertex -181.83783608379753 -68.22095714504829 -6.331370849898415
+ endloop
+endfacet
+facet normal 0.6870641468694699 -0.39667667014557983 0.608761429008723
+ outer loop
+ vertex -182.05804018668428 -68.09382224696996 -5.999999999999944
+ vertex -31.837836083798095 191.58666399028218 -6.331370849898517
+ vertex -32.058040186684785 191.71379888836057 -6.000000000000034
+ endloop
+endfacet
+facet normal -0.11303899832184437 0.06526309610999445 -0.9914448613738092
+ outer loop
+ vertex -30.85804018668474 191.02097856533317 -3.600000000000047
+ vertex -180.4994099978169 -68.99369780607941 -3.654518677937452
+ vertex -180.8580401866842 -68.78664256999744 -3.5999999999999566
+ endloop
+endfacet
+facet normal -0.11303899832184437 0.06526309610999445 -0.9914448613738092
+ outer loop
+ vertex -180.4994099978169 -68.99369780607941 -3.654518677937452
+ vertex -30.85804018668474 191.02097856533317 -3.600000000000047
+ vertex -30.49940999781753 190.81392332925108 -3.6545186779375425
+ endloop
+endfacet
+facet normal -0.6870641468694428 0.39667667014560937 0.6087614290087343
+ outer loop
+ vertex -29.65804018668472 190.32815824230553 -6.000000000000065
+ vertex -179.87824428957094 -69.35232799494672 -6.3313708498984465
+ vertex -179.65804018668422 -69.47946289302502 -5.999999999999975
+ endloop
+endfacet
+facet normal -0.6870641468694428 0.39667667014560937 0.6087614290087343
+ outer loop
+ vertex -179.87824428957094 -69.35232799494672 -6.3313708498984465
+ vertex -29.65804018668472 190.32815824230553 -6.000000000000065
+ vertex -29.878244289571473 190.45529314038384 -6.331370849898536
+ endloop
+endfacet
+facet normal 0.5272028623657163 -0.3043807145043165 0.7933533402912205
+ outer loop
+ vertex -181.55086050971184 -68.38664256999753 -6.585640646055053
+ vertex -31.837836083798095 191.58666399028218 -6.331370849898517
+ vertex -181.83783608379753 -68.22095714504829 -6.331370849898415
+ endloop
+endfacet
+facet normal 0.5272028623657163 -0.3043807145043165 0.7933533402912205
+ outer loop
+ vertex -31.837836083798095 191.58666399028218 -6.331370849898517
+ vertex -181.55086050971184 -68.38664256999753 -6.585640646055053
+ vertex -31.550860509712372 191.42097856533303 -6.585640646055154
+ endloop
+endfacet
+facet normal -0.33141357403555843 0.19134171618255227 0.9238795325112973
+ outer loop
+ vertex -166.65522356461923 -76.98664256999712 -6.58564064605507
+ vertex -16.989413698780062 183.0139233292514 -6.745481322062554
+ vertex -166.98941369877954 -76.79369780607912 -6.745481322062464
+ endloop
+endfacet
+facet normal -0.33141357403555843 0.19134171618255227 0.9238795325112973
+ outer loop
+ vertex -16.989413698780062 183.0139233292514 -6.745481322062554
+ vertex -166.65522356461923 -76.98664256999712 -6.58564064605507
+ vertex -16.655223564619703 182.82097856533343 -6.585640646055159
+ endloop
+endfacet
+facet normal 0.5272028623657142 -0.3043807145043265 0.7933533402912182
+ outer loop
+ vertex -168.04086421067436 -76.18664256999716 -6.5856406460550465
+ vertex -18.32783978476065 183.78666399028262 -6.3313708498985
+ vertex -168.32783978476004 -76.0209571450479 -6.331370849898409
+ endloop
+endfacet
+facet normal 0.5272028623657142 -0.3043807145043265 0.7933533402912182
+ outer loop
+ vertex -18.32783978476065 183.78666399028262 -6.3313708498985
+ vertex -168.04086421067436 -76.18664256999716 -6.5856406460550465
+ vertex -18.040864210674833 183.62097856533344 -6.585640646055137
+ endloop
+endfacet
+facet normal 0.8001031451912762 -0.4619397662556186 -0.3826834323650973
+ outer loop
+ vertex -32.19646627266526 191.79371922636432 -4.785889527835981
+ vertex -182.05804018668422 -68.09382224696995 -4.399999999999924
+ vertex -182.19646627266474 -68.01390190896625 -4.785889527835891
+ endloop
+endfacet
+facet normal 0.8001031451912762 -0.4619397662556186 -0.3826834323650973
+ outer loop
+ vertex -182.05804018668422 -68.09382224696995 -4.399999999999924
+ vertex -32.19646627266526 191.79371922636432 -4.785889527835981
+ vertex -32.058040186684785 191.71379888836057 -4.400000000000015
+ endloop
+endfacet
+facet normal -0.858616436401279 0.4957224306868712 0.13052619222006182
+ outer loop
+ vertex -29.472399540629656 190.22097856533307 -5.200000000000067
+ vertex -179.5196141007037 -69.5593832310287 -5.6141104721640085
+ vertex -179.47239954062908 -69.58664256999745 -5.199999999999976
+ endloop
+endfacet
+facet normal -0.858616436401279 0.4957224306868712 0.13052619222006182
+ outer loop
+ vertex -179.5196141007037 -69.5593832310287 -5.6141104721640085
+ vertex -29.472399540629656 190.22097856533307 -5.200000000000067
+ vertex -29.51961410070422 190.24823790430182 -5.614110472164098
+ endloop
+endfacet
+facet normal 0.5272028623656435 -0.3043807145043646 -0.7933533402912507
+ outer loop
+ vertex -31.837836083797985 191.58666399028237 -4.068629150101555
+ vertex -181.55086050971175 -68.38664256999745 -3.8143593539448384
+ vertex -181.83783608379747 -68.22095714504822 -4.068629150101453
+ endloop
+endfacet
+facet normal 0.5272028623656435 -0.3043807145043646 -0.7933533402912507
+ outer loop
+ vertex -181.55086050971175 -68.38664256999745 -3.8143593539448384
+ vertex -31.837836083797985 191.58666399028237 -4.068629150101555
+ vertex -31.550860509712304 191.42097856533306 -3.8143593539449396
+ endloop
+endfacet
+facet normal 0.11303899832184455 -0.06526309610999596 0.9914448613738092
+ outer loop
+ vertex -180.85804018668426 -68.78664256999751 -6.799999999999951
+ vertex -31.216670375552013 191.22803380141505 -6.745481322062546
+ vertex -181.2166703755515 -68.57958733391551 -6.7454813220624334
+ endloop
+endfacet
+facet normal 0.11303899832184455 -0.06526309610999596 0.9914448613738092
+ outer loop
+ vertex -31.216670375552013 191.22803380141505 -6.745481322062546
+ vertex -180.85804018668426 -68.78664256999751 -6.799999999999951
+ vertex -30.858040186684786 191.02097856533302 -6.800000000000041
+ endloop
+endfacet
+facet normal 0.8586164364012764 -0.49572243068688093 0.13052619222004297
+ outer loop
+ vertex -32.19646627266526 191.79371922636426 -5.614110472164045
+ vertex -182.24368083273936 -67.9866425699975 -5.199999999999923
+ vertex -182.19646627266476 -68.01390190896626 -5.614110472163954
+ endloop
+endfacet
+facet normal 0.8586164364012764 -0.49572243068688093 0.13052619222004297
+ outer loop
+ vertex -182.24368083273936 -67.9866425699975 -5.199999999999923
+ vertex -32.19646627266526 191.79371922636426 -5.614110472164045
+ vertex -32.24368083273991 191.82097856533298 -5.200000000000013
+ endloop
+endfacet
+facet normal 0.8001031451912812 -0.46193976625559896 0.3826834323651106
+ outer loop
+ vertex -168.5480438876468 -75.89382224696958 -5.999999999999941
+ vertex -18.68646997362779 183.99371922636473 -5.6141104721640644
+ vertex -168.68646997362728 -75.81390190896589 -5.614110472163975
+ endloop
+endfacet
+facet normal 0.8001031451912812 -0.46193976625559896 0.3826834323651106
+ outer loop
+ vertex -18.68646997362779 183.99371922636473 -5.6141104721640644
+ vertex -168.5480438876468 -75.89382224696958 -5.999999999999941
+ vertex -18.548043887647314 183.91379888836096 -6.000000000000031
+ endloop
+endfacet
+facet normal 0.11303899832176335 -0.06526309611003223 -0.9914448613738159
+ outer loop
+ vertex -31.216670375551946 191.22803380141514 -3.65451867793752
+ vertex -180.8580401866842 -68.78664256999744 -3.5999999999999566
+ vertex -181.2166703755514 -68.57958733391541 -3.654518677937407
+ endloop
+endfacet
+facet normal 0.11303899832176335 -0.06526309611003223 -0.9914448613738159
+ outer loop
+ vertex -180.8580401866842 -68.78664256999744 -3.5999999999999566
+ vertex -31.216670375551946 191.22803380141514 -3.65451867793752
+ vertex -30.85804018668474 191.02097856533317 -3.600000000000047
+ endloop
+endfacet
+facet normal 0.8001031451913012 -0.4619397662555992 0.38268343236506847
+ outer loop
+ vertex -32.058040186684785 191.71379888836057 -6.000000000000034
+ vertex -182.19646627266476 -68.01390190896626 -5.614110472163954
+ vertex -182.05804018668428 -68.09382224696996 -5.999999999999944
+ endloop
+endfacet
+facet normal 0.8001031451913012 -0.4619397662555992 0.38268343236506847
+ outer loop
+ vertex -182.19646627266476 -68.01390190896626 -5.614110472163954
+ vertex -32.058040186684785 191.71379888836057 -6.000000000000034
+ vertex -32.19646627266526 191.79371922636426 -5.614110472164045
+ endloop
+endfacet
+facet normal -0.8001031451912762 0.4619397662556186 0.3826834323650973
+ outer loop
+ vertex -29.51961410070422 190.24823790430182 -5.614110472164098
+ vertex -179.65804018668422 -69.47946289302502 -5.999999999999975
+ vertex -179.5196141007037 -69.5593832310287 -5.6141104721640085
+ endloop
+endfacet
+facet normal -0.8001031451912762 0.4619397662556186 0.3826834323650973
+ outer loop
+ vertex -179.65804018668422 -69.47946289302502 -5.999999999999975
+ vertex -29.51961410070422 190.24823790430182 -5.614110472164098
+ vertex -29.65804018668472 190.32815824230553 -6.000000000000065
+ endloop
+endfacet
+facet normal 0.11303899832184455 -0.06526309610999596 0.9914448613738092
+ outer loop
+ vertex -167.34804388764678 -76.58664256999711 -6.799999999999959
+ vertex -17.706674076514567 183.42803380141538 -6.745481322062554
+ vertex -167.70667407651402 -76.3795873339151 -6.745481322062464
+ endloop
+endfacet
+facet normal 0.11303899832184455 -0.06526309610999596 0.9914448613738092
+ outer loop
+ vertex -17.706674076514567 183.42803380141538 -6.745481322062554
+ vertex -167.34804388764678 -76.58664256999711 -6.799999999999959
+ vertex -17.348043887647314 183.2209785653335 -6.80000000000005
+ endloop
+endfacet
+facet normal -0.8001031451912812 0.46193976625559896 -0.3826834323651106
+ outer loop
+ vertex -29.658040186684968 190.3281582423051 -20.000000000000025
+ vertex -179.51961410070396 -69.55938323102919 -20.385889527835904
+ vertex -179.6580401866845 -69.47946289302546 -19.99999999999994
+ endloop
+endfacet
+facet normal -0.8001031451912812 0.46193976625559896 -0.3826834323651106
+ outer loop
+ vertex -179.51961410070396 -69.55938323102919 -20.385889527835904
+ vertex -29.658040186684968 190.3281582423051 -20.000000000000025
+ vertex -29.519614100704466 190.24823790430136 -20.385889527835992
+ endloop
+endfacet
+facet normal -0.85861643640128 0.4957224306868831 -0.13052619222001063
+ outer loop
+ vertex -29.519614100704466 190.24823790430136 -20.385889527835992
+ vertex -179.47239954062937 -69.58664256999793 -20.799999999999937
+ vertex -179.51961410070396 -69.55938323102919 -20.385889527835904
+ endloop
+endfacet
+facet normal -0.85861643640128 0.4957224306868831 -0.13052619222001063
+ outer loop
+ vertex -179.47239954062937 -69.58664256999793 -20.799999999999937
+ vertex -29.519614100704466 190.24823790430136 -20.385889527835992
+ vertex -29.47239954062988 190.22097856533262 -20.800000000000026
+ endloop
+endfacet
+facet normal -0.8001031451912887 0.4619397662556257 0.3826834323650627
+ outer loop
+ vertex -29.519614100704512 190.24823790430136 -21.214110472164055
+ vertex -179.6580401866845 -69.4794628930255 -21.599999999999934
+ vertex -179.519614100704 -69.5593832310292 -21.21411047216397
+ endloop
+endfacet
+facet normal -0.8001031451912887 0.4619397662556257 0.3826834323650627
+ outer loop
+ vertex -179.6580401866845 -69.4794628930255 -21.599999999999934
+ vertex -29.519614100704512 190.24823790430136 -21.214110472164055
+ vertex -29.658040186685035 190.32815824230505 -21.600000000000023
+ endloop
+endfacet
+facet normal -0.858616436401279 0.4957224306868712 0.13052619222006182
+ outer loop
+ vertex -29.47239954062988 190.22097856533262 -20.800000000000026
+ vertex -179.519614100704 -69.5593832310292 -21.21411047216397
+ vertex -179.47239954062937 -69.58664256999793 -20.799999999999937
+ endloop
+endfacet
+facet normal -0.858616436401279 0.4957224306868712 0.13052619222006182
+ outer loop
+ vertex -179.519614100704 -69.5593832310292 -21.21411047216397
+ vertex -29.47239954062988 190.22097856533262 -20.800000000000026
+ vertex -29.519614100704512 190.24823790430136 -21.214110472164055
+ endloop
+endfacet
+facet normal -0.11303899832176201 0.06526309611003285 0.991444861373816
+ outer loop
+ vertex -180.499409997817 -68.99369780607952 -6.745481322062478
+ vertex -30.858040186684786 191.02097856533302 -6.800000000000041
+ vertex -180.85804018668426 -68.78664256999751 -6.799999999999951
+ endloop
+endfacet
+facet normal -0.11303899832176201 0.06526309611003285 0.991444861373816
+ outer loop
+ vertex -30.858040186684786 191.02097856533302 -6.800000000000041
+ vertex -180.499409997817 -68.99369780607952 -6.745481322062478
+ vertex -30.49940999781753 190.81392332925108 -6.7454813220625685
+ endloop
+endfacet
+facet normal -0.11303899832181014 0.06526309611005923 0.9914448613738089
+ outer loop
+ vertex -180.49940999781734 -68.99369780607998 -22.34548132206245
+ vertex -30.858040186685056 191.02097856533263 -22.400000000000023
+ vertex -180.85804018668452 -68.786642569998 -22.399999999999945
+ endloop
+endfacet
+facet normal -0.11303899832181014 0.06526309611005923 0.9914448613738089
+ outer loop
+ vertex -30.858040186685056 191.02097856533263 -22.400000000000023
+ vertex -180.49940999781734 -68.99369780607998 -22.34548132206245
+ vertex -30.499409997817825 190.81392332925054 -22.34548132206253
+ endloop
+endfacet
+facet normal 0.85861643640128 -0.49572243068688304 0.13052619222001038
+ outer loop
+ vertex -32.19646627266555 191.7937192263638 -21.214110472164048
+ vertex -182.2436808327396 -67.986642569998 -20.79999999999993
+ vertex -182.19646627266502 -68.01390190896676 -21.21411047216396
+ endloop
+endfacet
+facet normal 0.85861643640128 -0.49572243068688304 0.13052619222001038
+ outer loop
+ vertex -182.2436808327396 -67.986642569998 -20.79999999999993
+ vertex -32.19646627266555 191.7937192263638 -21.214110472164048
+ vertex -32.24368083274021 191.82097856533252 -20.800000000000015
+ endloop
+endfacet
+facet normal 0.6870641468694346 -0.3966766701456103 -0.6087614290087431
+ outer loop
+ vertex -32.0580401866851 191.7137988883601 -20.000000000000018
+ vertex -181.83783608379773 -68.2209571450487 -19.66862915010146
+ vertex -182.0580401866845 -68.09382224697045 -19.99999999999993
+ endloop
+endfacet
+facet normal 0.6870641468694346 -0.3966766701456103 -0.6087614290087431
+ outer loop
+ vertex -181.83783608379773 -68.2209571450487 -19.66862915010146
+ vertex -32.0580401866851 191.7137988883601 -20.000000000000018
+ vertex -31.837836083798276 191.58666399028183 -19.668629150101545
+ endloop
+endfacet
+facet normal -0.3314135740355431 0.1913417161825406 0.9238795325113052
+ outer loop
+ vertex -180.16521986365697 -69.186642569998 -22.18564064605505
+ vertex -30.499409997817825 190.81392332925054 -22.34548132206253
+ vertex -180.49940999781734 -68.99369780607998 -22.34548132206245
+ endloop
+endfacet
+facet normal -0.3314135740355431 0.1913417161825406 0.9238795325113052
+ outer loop
+ vertex -30.499409997817825 190.81392332925054 -22.34548132206253
+ vertex -180.16521986365697 -69.186642569998 -22.18564064605505
+ vertex -30.165219863657466 190.62097856533256 -22.185640646055134
+ endloop
+endfacet
+facet normal 0.5272028623656863 -0.30438071450437804 -0.7933533402912171
+ outer loop
+ vertex -31.837836083798276 191.58666399028183 -19.668629150101545
+ vertex -181.55086050971204 -68.38664256999796 -19.41435935394482
+ vertex -181.83783608379773 -68.2209571450487 -19.66862915010146
+ endloop
+endfacet
+facet normal 0.5272028623656863 -0.30438071450437804 -0.7933533402912171
+ outer loop
+ vertex -181.55086050971204 -68.38664256999796 -19.41435935394482
+ vertex -31.837836083798276 191.58666399028183 -19.668629150101545
+ vertex -31.550860509712553 191.42097856533266 -19.414359353944903
+ endloop
+endfacet
+facet normal 0.5272028623656848 -0.30438071450430954 0.7933533402912443
+ outer loop
+ vertex -181.55086050971215 -68.38664256999803 -22.185640646055035
+ vertex -31.83783608379839 191.58666399028175 -21.931370849898506
+ vertex -181.8378360837978 -68.22095714504879 -21.93137084989842
+ endloop
+endfacet
+facet normal 0.5272028623656848 -0.30438071450430954 0.7933533402912443
+ outer loop
+ vertex -31.83783608379839 191.58666399028175 -21.931370849898506
+ vertex -181.55086050971215 -68.38664256999803 -22.185640646055035
+ vertex -31.550860509712596 191.42097856533258 -22.185640646055123
+ endloop
+endfacet
+facet normal 0.11303899832180345 -0.06526309611005678 -0.9914448613738097
+ outer loop
+ vertex -31.216670375552287 191.2280338014146 -19.254518677937508
+ vertex -180.8580401866844 -68.7866425699979 -19.19999999999993
+ vertex -181.21667037555167 -68.57958733391588 -19.254518677937426
+ endloop
+endfacet
+facet normal 0.11303899832180345 -0.06526309611005678 -0.9914448613738097
+ outer loop
+ vertex -180.8580401866844 -68.7866425699979 -19.19999999999993
+ vertex -31.216670375552287 191.2280338014146 -19.254518677937508
+ vertex -30.85804018668501 191.02097856533257 -19.200000000000006
+ endloop
+endfacet
+facet normal -0.5272028623657142 0.3043807145043265 -0.7933533402912182
+ outer loop
+ vertex -30.1652198636574 190.6209785653327 -19.414359353944917
+ vertex -179.87824428957117 -69.35232799494715 -19.668629150101474
+ vertex -180.1652198636569 -69.18664256999789 -19.414359353944835
+ endloop
+endfacet
+facet normal -0.5272028623657142 0.3043807145043265 -0.7933533402912182
+ outer loop
+ vertex -179.87824428957117 -69.35232799494715 -19.668629150101474
+ vertex -30.1652198636574 190.6209785653327 -19.414359353944917
+ vertex -29.87824428957172 190.4552931403834 -19.668629150101555
+ endloop
+endfacet
+facet normal -0.6870641468694759 0.39667667014558894 -0.6087614290087102
+ outer loop
+ vertex -179.87824428957117 -69.35232799494715 -19.668629150101474
+ vertex -29.658040186684968 190.3281582423051 -20.000000000000025
+ vertex -179.6580401866845 -69.47946289302546 -19.99999999999994
+ endloop
+endfacet
+facet normal -0.6870641468694759 0.39667667014558894 -0.6087614290087102
+ outer loop
+ vertex -29.658040186684968 190.3281582423051 -20.000000000000025
+ vertex -179.87824428957117 -69.35232799494715 -19.668629150101474
+ vertex -29.87824428957172 190.4552931403834 -19.668629150101555
+ endloop
+endfacet
+facet normal 0.6870641468695006 -0.39667667014558633 0.608761429008684
+ outer loop
+ vertex -31.83783608379839 191.58666399028175 -21.931370849898506
+ vertex -182.05804018668454 -68.09382224697046 -21.599999999999927
+ vertex -181.8378360837978 -68.22095714504879 -21.93137084989842
+ endloop
+endfacet
+facet normal 0.6870641468695006 -0.39667667014558633 0.608761429008684
+ outer loop
+ vertex -182.05804018668454 -68.09382224697046 -21.599999999999927
+ vertex -31.83783608379839 191.58666399028175 -21.931370849898506
+ vertex -32.05804018668512 191.71379888836003 -21.600000000000016
+ endloop
+endfacet
+facet normal 0.3314135740356312 -0.1913417161825154 0.9238795325112787
+ outer loop
+ vertex -181.21667037555176 -68.57958733391598 -22.34548132206245
+ vertex -31.550860509712596 191.42097856533258 -22.185640646055123
+ vertex -181.55086050971215 -68.38664256999803 -22.185640646055035
+ endloop
+endfacet
+facet normal 0.3314135740356312 -0.1913417161825154 0.9238795325112787
+ outer loop
+ vertex -31.550860509712596 191.42097856533258 -22.185640646055123
+ vertex -181.21667037555176 -68.57958733391598 -22.34548132206245
+ vertex -31.216670375552287 191.22803380141454 -22.345481322062533
+ endloop
+endfacet
+facet normal -0.5272028623656586 0.30438071450435644 0.7933533402912438
+ outer loop
+ vertex -179.87824428957123 -69.35232799494719 -21.93137084989843
+ vertex -30.165219863657466 190.62097856533256 -22.185640646055134
+ vertex -180.16521986365697 -69.186642569998 -22.18564064605505
+ endloop
+endfacet
+facet normal -0.5272028623656586 0.30438071450435644 0.7933533402912438
+ outer loop
+ vertex -30.165219863657466 190.62097856533256 -22.185640646055134
+ vertex -179.87824428957123 -69.35232799494719 -21.93137084989843
+ vertex -29.878244289571743 190.45529314038336 -21.931370849898517
+ endloop
+endfacet
+facet normal 0.8001031451912812 -0.461939766255599 0.38268343236511043
+ outer loop
+ vertex -182.05804018668454 -68.09382224697046 -21.599999999999927
+ vertex -32.19646627266555 191.7937192263638 -21.214110472164048
+ vertex -182.19646627266502 -68.01390190896676 -21.21411047216396
+ endloop
+endfacet
+facet normal 0.8001031451912812 -0.461939766255599 0.38268343236511043
+ outer loop
+ vertex -32.19646627266555 191.7937192263638 -21.214110472164048
+ vertex -182.05804018668454 -68.09382224697046 -21.599999999999927
+ vertex -32.05804018668512 191.71379888836003 -21.600000000000016
+ endloop
+endfacet
+facet normal 0.8001031451912887 -0.4619397662556257 -0.3826834323650627
+ outer loop
+ vertex -182.19646627266502 -68.01390190896674 -20.385889527835896
+ vertex -32.0580401866851 191.7137988883601 -20.000000000000018
+ vertex -182.0580401866845 -68.09382224697045 -19.99999999999993
+ endloop
+endfacet
+facet normal 0.8001031451912887 -0.4619397662556257 -0.3826834323650627
+ outer loop
+ vertex -32.0580401866851 191.7137988883601 -20.000000000000018
+ vertex -182.19646627266502 -68.01390190896674 -20.385889527835896
+ vertex -32.1964662726655 191.79371922636386 -20.385889527835985
+ endloop
+endfacet
+facet normal -0.3314135740355987 0.1913417161825699 0.9238795325112792
+ outer loop
+ vertex -180.1652198636567 -69.1866425699975 -6.585640646055061
+ vertex -30.49940999781753 190.81392332925108 -6.7454813220625685
+ vertex -180.499409997817 -68.99369780607952 -6.745481322062478
+ endloop
+endfacet
+facet normal -0.3314135740355987 0.1913417161825699 0.9238795325112792
+ outer loop
+ vertex -30.49940999781753 190.81392332925108 -6.7454813220625685
+ vertex -180.1652198636567 -69.1866425699975 -6.585640646055061
+ vertex -30.165219863657196 190.62097856533308 -6.585640646055151
+ endloop
+endfacet
+facet normal -0.6870641468694545 0.39667667014561614 0.6087614290087167
+ outer loop
+ vertex -29.658040186685035 190.32815824230505 -21.600000000000023
+ vertex -179.87824428957123 -69.35232799494719 -21.93137084989843
+ vertex -179.6580401866845 -69.4794628930255 -21.599999999999934
+ endloop
+endfacet
+facet normal -0.6870641468694545 0.39667667014561614 0.6087614290087167
+ outer loop
+ vertex -179.87824428957123 -69.35232799494719 -21.93137084989843
+ vertex -29.658040186685035 190.32815824230505 -21.600000000000023
+ vertex -29.878244289571743 190.45529314038336 -21.931370849898517
+ endloop
+endfacet
+facet normal 0.11303899832184455 -0.06526309610999596 0.9914448613738092
+ outer loop
+ vertex -180.85804018668452 -68.786642569998 -22.399999999999945
+ vertex -31.216670375552287 191.22803380141454 -22.345481322062533
+ vertex -181.21667037555176 -68.57958733391598 -22.34548132206245
+ endloop
+endfacet
+facet normal 0.11303899832184455 -0.06526309610999596 0.9914448613738092
+ outer loop
+ vertex -31.216670375552287 191.22803380141454 -22.345481322062533
+ vertex -180.85804018668452 -68.786642569998 -22.399999999999945
+ vertex -30.858040186685056 191.02097856533263 -22.400000000000023
+ endloop
+endfacet
+facet normal 0.33141357403555843 -0.19134171618255227 -0.9238795325112973
+ outer loop
+ vertex -31.550860509712553 191.42097856533266 -19.414359353944903
+ vertex -181.21667037555167 -68.57958733391588 -19.254518677937426
+ vertex -181.55086050971204 -68.38664256999796 -19.41435935394482
+ endloop
+endfacet
+facet normal 0.33141357403555843 -0.19134171618255227 -0.9238795325112973
+ outer loop
+ vertex -181.21667037555167 -68.57958733391588 -19.254518677937426
+ vertex -31.550860509712553 191.42097856533266 -19.414359353944903
+ vertex -31.216670375552287 191.2280338014146 -19.254518677937508
+ endloop
+endfacet
+facet normal -0.331413574035631 0.19134171618251528 -0.9238795325112789
+ outer loop
+ vertex -30.499409997817736 190.81392332925068 -19.2545186779375
+ vertex -180.1652198636569 -69.18664256999789 -19.414359353944835
+ vertex -180.49940999781722 -68.99369780607992 -19.254518677937423
+ endloop
+endfacet
+facet normal -0.331413574035631 0.19134171618251528 -0.9238795325112789
+ outer loop
+ vertex -180.1652198636569 -69.18664256999789 -19.414359353944835
+ vertex -30.499409997817736 190.81392332925068 -19.2545186779375
+ vertex -30.1652198636574 190.6209785653327 -19.414359353944917
+ endloop
+endfacet
+facet normal 0.858616436401279 -0.4957224306868712 -0.130526192220062
+ outer loop
+ vertex -182.2436808327396 -67.986642569998 -20.79999999999993
+ vertex -32.1964662726655 191.79371922636386 -20.385889527835985
+ vertex -182.19646627266502 -68.01390190896674 -20.385889527835896
+ endloop
+endfacet
+facet normal 0.858616436401279 -0.4957224306868712 -0.130526192220062
+ outer loop
+ vertex -32.1964662726655 191.79371922636386 -20.385889527835985
+ vertex -182.2436808327396 -67.986642569998 -20.79999999999993
+ vertex -32.24368083274021 191.82097856533252 -20.800000000000015
+ endloop
+endfacet
+facet normal -0.11303899832184455 0.06526309610999596 -0.9914448613738092
+ outer loop
+ vertex -30.85804018668501 191.02097856533257 -19.200000000000006
+ vertex -180.49940999781722 -68.99369780607992 -19.254518677937423
+ vertex -180.8580401866844 -68.7866425699979 -19.19999999999993
+ endloop
+endfacet
+facet normal -0.11303899832184455 0.06526309610999596 -0.9914448613738092
+ outer loop
+ vertex -180.49940999781722 -68.99369780607992 -19.254518677937423
+ vertex -30.85804018668501 191.02097856533257 -19.200000000000006
+ vertex -30.499409997817736 190.81392332925068 -19.2545186779375
+ endloop
+endfacet
+facet normal -0.8586164364012798 0.49572243068687166 0.13052619222005538
+ outer loop
+ vertex -32.73378697496388 192.1039414784776 -3.7411809548975263
+ vertex -182.76329607501003 -67.68664256999749 -3.9999999999999476
+ vertex -182.73378697496338 -67.70367965685296 -3.741180954897436
+ endloop
+endfacet
+facet normal -0.8586164364012798 0.49572243068687166 0.13052619222005538
+ outer loop
+ vertex -182.76329607501003 -67.68664256999749 -3.9999999999999476
+ vertex -32.73378697496388 192.1039414784776 -3.7411809548975263
+ vertex -32.76329607501052 192.12097856533305 -4.000000000000038
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 1.5003536199769236e-15
+ outer loop
+ vertex -182.76329607501003 -67.68664256999749 -3.9999999999999476
+ vertex -32.76329607501059 192.12097856533296 -9.20000000000005
+ vertex -182.76329607501012 -67.68664256999767 -9.19999999999996
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 1.5003536199769236e-15
+ outer loop
+ vertex -32.76329607501059 192.12097856533296 -9.20000000000005
+ vertex -182.76329607501003 -67.68664256999749 -3.9999999999999476
+ vertex -32.76329607501052 192.12097856533305 -4.000000000000038
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -4.464960093105168e-15
+ outer loop
+ vertex -32.41688591349683 191.92097856533292 -9.20000000000005
+ vertex -182.41688591349632 -67.88664256999766 -9.59999999999996
+ vertex -182.41688591349632 -67.88664256999765 -9.19999999999996
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -4.464960093105168e-15
+ outer loop
+ vertex -182.41688591349632 -67.88664256999766 -9.59999999999996
+ vertex -32.41688591349683 191.92097856533292 -9.20000000000005
+ vertex -32.4168859134969 191.92097856533286 -9.60000000000005
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -31.204450348198613 191.22097856533298 -7.40000000000004
+ vertex -179.44268224691513 -69.60379985752284 -7.39999999999995
+ vertex -181.20445034819804 -68.58664256999758 -7.3999999999999275
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -179.44268224691513 -69.60379985752284 -7.39999999999995
+ vertex -31.204450348198613 191.22097856533298 -7.40000000000004
+ vertex -29.442682246915638 190.20382127780772 -7.40000000000004
+ endloop
+endfacet
+facet normal -0.8001031451912832 0.46193976625562266 0.3826834323650778
+ outer loop
+ vertex -32.647270671226075 192.0539912672253 -3.5000000000000386
+ vertex -182.73378697496338 -67.70367965685296 -3.741180954897436
+ vertex -182.64727067122556 -67.75362986810526 -3.4999999999999485
+ endloop
+endfacet
+facet normal -0.8001031451912832 0.46193976625562266 0.3826834323650778
+ outer loop
+ vertex -182.73378697496338 -67.70367965685296 -3.741180954897436
+ vertex -32.647270671226075 192.0539912672253 -3.5000000000000386
+ vertex -32.73378697496388 192.1039414784776 -3.7411809548975263
+ endloop
+endfacet
+facet normal -0.6123724356958127 0.353553390593238 -0.7071067811865498
+ outer loop
+ vertex -29.442682246915638 190.20382127780772 -7.40000000000004
+ vertex -177.30733603116803 -70.83664256999754 -9.8656854249492
+ vertex -179.44268224691513 -69.60379985752284 -7.39999999999995
+ endloop
+endfacet
+facet normal -0.6123724356958127 0.353553390593238 -0.7071067811865498
+ outer loop
+ vertex -177.30733603116803 -70.83664256999754 -9.8656854249492
+ vertex -29.442682246915638 190.20382127780772 -7.40000000000004
+ vertex -27.30733603116855 188.97097856533304 -9.865685424949291
+ endloop
+endfacet
+facet normal -3.1938264052337434e-15 -3.9640061956236146e-14 -1.0
+ outer loop
+ vertex -32.4168859134969 191.92097856533286 -9.60000000000005
+ vertex -181.2044503481981 -68.58664256999764 -9.599999999999923
+ vertex -182.41688591349632 -67.88664256999766 -9.59999999999996
+ endloop
+endfacet
+facet normal -3.1938264052337434e-15 -3.9640061956236146e-14 -1.0
+ outer loop
+ vertex -181.2044503481981 -68.58664256999764 -9.599999999999923
+ vertex -32.4168859134969 191.92097856533286 -9.60000000000005
+ vertex -31.204450348198588 191.22097856533293 -9.600000000000035
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -32.76329607501059 192.12097856533296 -9.20000000000005
+ vertex -182.41688591349632 -67.88664256999765 -9.19999999999996
+ vertex -182.76329607501012 -67.68664256999767 -9.19999999999996
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -182.41688591349632 -67.88664256999765 -9.19999999999996
+ vertex -32.76329607501059 192.12097856533296 -9.20000000000005
+ vertex -32.41688591349683 191.92097856533292 -9.20000000000005
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -181.2044503481981 -68.58664256999764 -9.599999999999923
+ vertex -31.204450348198613 191.22097856533298 -7.40000000000004
+ vertex -181.20445034819804 -68.58664256999758 -7.3999999999999275
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -31.204450348198613 191.22097856533298 -7.40000000000004
+ vertex -181.2044503481981 -68.58664256999764 -9.599999999999923
+ vertex -31.204450348198588 191.22097856533293 -9.600000000000035
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -1.052465433482836e-15
+ outer loop
+ vertex -177.30733603116803 -70.83664256999754 -9.8656854249492
+ vertex -27.30733603116866 188.97097856533284 -16.134314575050784
+ vertex -177.30733603116815 -70.83664256999775 -16.134314575050695
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -1.052465433482836e-15
+ outer loop
+ vertex -27.30733603116866 188.97097856533284 -16.134314575050784
+ vertex -177.30733603116803 -70.83664256999754 -9.8656854249492
+ vertex -27.30733603116855 188.97097856533304 -9.865685424949291
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -15.442787999321737 182.12097856533305 -22.00000000000003
+ vertex -165.44278799932115 -77.68664256999742 -16.79999999999996
+ vertex -165.44278799932124 -77.68664256999759 -21.99999999999995
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -165.44278799932115 -77.68664256999742 -16.79999999999996
+ vertex -15.442787999321737 182.12097856533305 -22.00000000000003
+ vertex -15.442787999321668 182.12097856533316 -16.80000000000004
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -165.44278799932115 -77.68664256999742 -16.79999999999996
+ vertex -15.78919816083543 182.3209785653332 -16.80000000000005
+ vertex -165.78919816083493 -77.4866425699974 -16.799999999999965
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -15.78919816083543 182.3209785653332 -16.80000000000005
+ vertex -165.44278799932115 -77.68664256999742 -16.79999999999996
+ vertex -15.442787999321668 182.12097856533316 -16.80000000000004
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 2.7394170869210427e-15
+ outer loop
+ vertex -20.898748043163707 185.27097856533302 -16.134314575050794
+ vertex -170.89874804316307 -74.53664256999733 -9.865685424949215
+ vertex -170.89874804316318 -74.53664256999755 -16.134314575050713
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 2.7394170869210427e-15
+ outer loop
+ vertex -170.89874804316307 -74.53664256999733 -9.865685424949215
+ vertex -20.898748043163707 185.27097856533302 -16.134314575050794
+ vertex -20.898748043163664 185.2709785653332 -9.865685424949328
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -165.78919816083493 -77.4866425699974 -16.399999999999963
+ vertex -17.00163372613367 183.02097856533314 -16.400000000000055
+ vertex -167.00163372613318 -76.78664256999741 -16.399999999999963
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -17.00163372613367 183.02097856533314 -16.400000000000055
+ vertex -165.78919816083493 -77.4866425699974 -16.399999999999963
+ vertex -15.78919816083545 182.32097856533315 -16.400000000000052
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -18.763401827416438 184.03813585285874 -7.400000000000051
+ vertex -167.00163372613304 -76.78664256999713 -7.399999999999959
+ vertex -168.76340182741595 -75.76948528247182 -7.399999999999961
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -167.00163372613304 -76.78664256999713 -7.399999999999959
+ vertex -18.763401827416438 184.03813585285874 -7.400000000000051
+ vertex -17.00163372613353 183.0209785653334 -7.400000000000048
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -17.00163372613353 183.0209785653334 -7.400000000000048
+ vertex -167.00163372613304 -76.78664256999721 -9.599999999999953
+ vertex -167.00163372613304 -76.78664256999713 -7.399999999999959
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -167.00163372613304 -76.78664256999721 -9.599999999999953
+ vertex -17.00163372613353 183.0209785653334 -7.400000000000048
+ vertex -17.001633726133555 183.02097856533337 -9.600000000000044
+ endloop
+endfacet
+facet normal -3.1938264052335824e-15 -3.964006195623624e-14 -1.0
+ outer loop
+ vertex -17.001633726133555 183.02097856533337 -9.600000000000044
+ vertex -165.7891981608348 -77.48664256999719 -9.599999999999929
+ vertex -167.00163372613304 -76.78664256999721 -9.599999999999953
+ endloop
+endfacet
+facet normal -3.1938264052335824e-15 -3.964006195623624e-14 -1.0
+ outer loop
+ vertex -165.7891981608348 -77.48664256999719 -9.599999999999929
+ vertex -17.001633726133555 183.02097856533337 -9.600000000000044
+ vertex -15.789198160835294 182.32097856533338 -9.60000000000002
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -167.00163372613318 -76.78664256999751 -18.59999999999996
+ vertex -18.763401827416597 184.03813585285843 -18.60000000000005
+ vertex -168.7634018274161 -75.76948528247219 -18.599999999999948
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -18.763401827416597 184.03813585285843 -18.60000000000005
+ vertex -167.00163372613318 -76.78664256999751 -18.59999999999996
+ vertex -17.001633726133736 183.02097856533308 -18.60000000000005
+ endloop
+endfacet
+facet normal 0.6123724356958127 -0.353553390593238 0.7071067811865498
+ outer loop
+ vertex -168.7634018274161 -75.76948528247219 -18.599999999999948
+ vertex -20.898748043163707 185.27097856533302 -16.134314575050794
+ vertex -170.89874804316318 -74.53664256999755 -16.134314575050713
+ endloop
+endfacet
+facet normal 0.6123724356958127 -0.353553390593238 0.7071067811865498
+ outer loop
+ vertex -20.898748043163707 185.27097856533302 -16.134314575050794
+ vertex -168.7634018274161 -75.76948528247219 -18.599999999999948
+ vertex -18.763401827416597 184.03813585285843 -18.60000000000005
+ endloop
+endfacet
+facet normal 0.6123724356957985 -0.35355339059327495 -0.7071067811865437
+ outer loop
+ vertex -170.89874804316307 -74.53664256999733 -9.865685424949215
+ vertex -18.763401827416438 184.03813585285874 -7.400000000000051
+ vertex -168.76340182741595 -75.76948528247182 -7.399999999999961
+ endloop
+endfacet
+facet normal 0.6123724356957985 -0.35355339059327495 -0.7071067811865437
+ outer loop
+ vertex -18.763401827416438 184.03813585285874 -7.400000000000051
+ vertex -170.89874804316307 -74.53664256999733 -9.865685424949215
+ vertex -20.898748043163664 185.2709785653332 -9.865685424949328
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -165.7891981608348 -77.48664256999719 -9.599999999999929
+ vertex -15.789198160835294 182.32097856533338 -9.20000000000002
+ vertex -165.7891981608348 -77.4866425699972 -9.19999999999993
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -15.789198160835294 182.32097856533338 -9.20000000000002
+ vertex -165.7891981608348 -77.48664256999719 -9.599999999999929
+ vertex -15.789198160835294 182.32097856533338 -9.60000000000002
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -15.789198160835294 182.32097856533338 -9.20000000000002
+ vertex -165.44278799932104 -77.68664256999716 -9.19999999999993
+ vertex -165.7891981608348 -77.4866425699972 -9.19999999999993
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -165.44278799932104 -77.68664256999716 -9.19999999999993
+ vertex -15.789198160835294 182.32097856533338 -9.20000000000002
+ vertex -15.442787999321533 182.12097856533347 -9.20000000000002
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -15.78919816083543 182.3209785653332 -16.80000000000005
+ vertex -165.78919816083493 -77.4866425699974 -16.399999999999963
+ vertex -165.78919816083493 -77.4866425699974 -16.799999999999965
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -165.78919816083493 -77.4866425699974 -16.399999999999963
+ vertex -15.78919816083543 182.3209785653332 -16.80000000000005
+ vertex -15.78919816083545 182.32097856533315 -16.400000000000052
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -167.00163372613318 -76.78664256999741 -16.399999999999963
+ vertex -17.001633726133736 183.02097856533308 -18.60000000000005
+ vertex -167.00163372613318 -76.78664256999751 -18.59999999999996
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -17.001633726133736 183.02097856533308 -18.60000000000005
+ vertex -167.00163372613318 -76.78664256999741 -16.399999999999963
+ vertex -17.00163372613367 183.02097856533314 -16.400000000000055
+ endloop
+endfacet
+facet normal 0.6870641468694694 -0.39667667014558516 0.6087614290087203
+ outer loop
+ vertex -15.558813403105889 182.18796586344135 -3.50000000000003
+ vertex -165.69644096740956 -77.54019596059021 -3.29289321881339
+ vertex -165.55881340310538 -77.6196552718892 -3.49999999999994
+ endloop
+endfacet
+facet normal 0.6870641468694694 -0.39667667014558516 0.6087614290087203
+ outer loop
+ vertex -165.69644096740956 -77.54019596059021 -3.29289321881339
+ vertex -15.558813403105889 182.18796586344135 -3.50000000000003
+ vertex -15.696440967410114 182.26742517474023 -3.29289321881348
+ endloop
+endfacet
+facet normal 0.3314135740356083 -0.19134171618249934 0.9238795325112903
+ outer loop
+ vertex -165.87580070121314 -77.43664256999696 -3.1339745962155057
+ vertex -16.08466953506387 182.49156904278232 -3.0340741737109713
+ vertex -166.08466953506334 -77.31605209254823 -3.034074173710881
+ endloop
+endfacet
+facet normal 0.3314135740356083 -0.19134171618249934 0.9238795325112903
+ outer loop
+ vertex -16.08466953506387 182.49156904278232 -3.0340741737109713
+ vertex -165.87580070121314 -77.43664256999696 -3.1339745962155057
+ vertex -15.87580070121366 182.37097856533364 -3.133974596215596
+ endloop
+endfacet
+facet normal 0.11303899832185436 -0.06526309611000022 0.9914448613738078
+ outer loop
+ vertex -166.08466953506334 -77.31605209254823 -3.034074173710881
+ vertex -16.308813403105898 182.6209785653336 -3.000000000000034
+ vertex -166.30881340310535 -77.18664256999696 -2.9999999999999436
+ endloop
+endfacet
+facet normal 0.11303899832185436 -0.06526309611000022 0.9914448613738078
+ outer loop
+ vertex -16.308813403105898 182.6209785653336 -3.000000000000034
+ vertex -166.08466953506334 -77.31605209254823 -3.034074173710881
+ vertex -16.08466953506387 182.49156904278232 -3.0340741737109713
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -166.30881340310535 -77.18664256999696 -2.9999999999999436
+ vertex -20.81214550278505 185.22097856533344 -3.000000000000037
+ vertex -170.81214550278452 -74.58664256999712 -2.999999999999924
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -20.81214550278505 185.22097856533344 -3.000000000000037
+ vertex -166.30881340310535 -77.18664256999696 -2.9999999999999436
+ vertex -16.308813403105898 182.6209785653336 -3.000000000000034
+ endloop
+endfacet
+facet normal 0.5272028623656805 -0.304380714504307 0.7933533402912483
+ outer loop
+ vertex -165.69644096740956 -77.54019596059021 -3.29289321881339
+ vertex -15.87580070121366 182.37097856533364 -3.133974596215596
+ vertex -165.87580070121314 -77.43664256999696 -3.1339745962155057
+ endloop
+endfacet
+facet normal 0.5272028623656805 -0.304380714504307 0.7933533402912483
+ outer loop
+ vertex -15.87580070121366 182.37097856533364 -3.133974596215596
+ vertex -165.69644096740956 -77.54019596059021 -3.29289321881339
+ vertex -15.696440967410114 182.26742517474023 -3.29289321881348
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -165.44278799932104 -77.68664256999716 -9.19999999999993
+ vertex -15.442787999321421 182.1209785653336 -4.000000000000029
+ vertex -165.44278799932096 -77.68664256999702 -3.999999999999939
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -15.442787999321421 182.1209785653336 -4.000000000000029
+ vertex -165.44278799932104 -77.68664256999716 -9.19999999999993
+ vertex -15.442787999321533 182.12097856533347 -9.20000000000002
+ endloop
+endfacet
+facet normal 0.800103145191287 -0.4619397662556136 0.3826834323650807
+ outer loop
+ vertex -165.47229709936755 -77.6696054831415 -3.7411809548974277
+ vertex -15.558813403105889 182.18796586344135 -3.50000000000003
+ vertex -165.55881340310538 -77.6196552718892 -3.49999999999994
+ endloop
+endfacet
+facet normal 0.800103145191287 -0.4619397662556136 0.3826834323650807
+ outer loop
+ vertex -15.558813403105889 182.18796586344135 -3.50000000000003
+ vertex -165.47229709936755 -77.6696054831415 -3.7411809548974277
+ vertex -15.472297099368083 182.13801565218895 -3.741180954897518
+ endloop
+endfacet
+facet normal 0.8586164364012796 -0.4957224306868715 0.13052619222005726
+ outer loop
+ vertex -15.442787999321421 182.1209785653336 -4.000000000000029
+ vertex -165.47229709936755 -77.6696054831415 -3.7411809548974277
+ vertex -165.44278799932096 -77.68664256999702 -3.999999999999939
+ endloop
+endfacet
+facet normal 0.8586164364012796 -0.4957224306868715 0.13052619222005726
+ outer loop
+ vertex -165.47229709936755 -77.6696054831415 -3.7411809548974277
+ vertex -15.442787999321421 182.1209785653336 -4.000000000000029
+ vertex -15.472297099368083 182.13801565218895 -3.741180954897518
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -170.81214550278452 -74.58664256999712 -3.399999999999923
+ vertex -21.15855566429883 185.4209785653334 -3.40000000000005
+ vertex -171.15855566429832 -74.38664256999712 -3.399999999999949
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -21.15855566429883 185.4209785653334 -3.40000000000005
+ vertex -170.81214550278452 -74.58664256999712 -3.399999999999923
+ vertex -20.812145502785025 185.22097856533344 -3.400000000000036
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -169.25329977597252 -75.48664256999713 -4.799999999999966
+ vertex -19.253299775973094 184.32097856533338 -6.834314575050794
+ vertex -169.25329977597258 -75.4866425699972 -6.834314575050704
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -19.253299775973094 184.32097856533338 -6.834314575050794
+ vertex -169.25329977597252 -75.48664256999713 -4.799999999999966
+ vertex -19.253299775973026 184.3209785653334 -4.800000000000056
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -20.81214550278505 185.22097856533344 -3.000000000000037
+ vertex -170.81214550278452 -74.58664256999712 -3.399999999999923
+ vertex -170.81214550278452 -74.58664256999712 -2.999999999999924
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -170.81214550278452 -74.58664256999712 -3.399999999999923
+ vertex -20.81214550278505 185.22097856533344 -3.000000000000037
+ vertex -20.812145502785025 185.22097856533344 -3.400000000000036
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -21.158555664298852 185.4209785653334 -4.80000000000007
+ vertex -169.25329977597252 -75.48664256999713 -4.799999999999966
+ vertex -171.15855566429832 -74.38664256999722 -4.799999999999969
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -169.25329977597252 -75.48664256999713 -4.799999999999966
+ vertex -21.158555664298852 185.4209785653334 -4.80000000000007
+ vertex -19.253299775973026 184.3209785653334 -4.800000000000056
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -171.3886459917197 -74.25379985752271 -9.29999999999996
+ vertex -26.817438082611847 188.6881358528584 -9.300000000000056
+ vertex -176.81743808261132 -71.11948528247211 -9.299999999999965
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -26.817438082611847 188.6881358528584 -9.300000000000056
+ vertex -171.3886459917197 -74.25379985752271 -9.29999999999996
+ vertex -21.388645991720228 185.55382127780788 -9.300000000000061
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -8.997049082914166e-15
+ outer loop
+ vertex -171.15855566429832 -74.38664256999712 -3.399999999999949
+ vertex -21.158555664298852 185.4209785653334 -4.80000000000007
+ vertex -171.15855566429832 -74.38664256999722 -4.799999999999969
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -8.997049082914166e-15
+ outer loop
+ vertex -21.158555664298852 185.4209785653334 -4.80000000000007
+ vertex -171.15855566429832 -74.38664256999712 -3.399999999999949
+ vertex -21.15855566429883 185.4209785653334 -3.40000000000005
+ endloop
+endfacet
+facet normal -0.6123724356957956 0.3535533905932733 0.7071067811865469
+ outer loop
+ vertex -169.25329977597258 -75.4866425699972 -6.834314575050704
+ vertex -21.388645991720228 185.55382127780788 -9.300000000000061
+ vertex -171.3886459917197 -74.25379985752271 -9.29999999999996
+ endloop
+endfacet
+facet normal -0.6123724356957956 0.3535533905932733 0.7071067811865469
+ outer loop
+ vertex -21.388645991720228 185.55382127780788 -9.300000000000061
+ vertex -169.25329977597258 -75.4866425699972 -6.834314575050704
+ vertex -19.253299775973094 184.32097856533338 -6.834314575050794
+ endloop
+endfacet
+facet normal 0.6123724356958173 -0.35355339059322943 0.7071067811865499
+ outer loop
+ vertex -176.81743808261132 -71.11948528247211 -9.299999999999965
+ vertex -28.952784298358957 189.9209785653331 -6.834314575050805
+ vertex -178.9527842983584 -69.88664256999746 -6.834314575050715
+ endloop
+endfacet
+facet normal 0.6123724356958173 -0.35355339059322943 0.7071067811865499
+ outer loop
+ vertex -28.952784298358957 189.9209785653331 -6.834314575050805
+ vertex -176.81743808261132 -71.11948528247211 -9.299999999999965
+ vertex -26.817438082611847 188.6881358528584 -9.300000000000056
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -28.952784298358935 189.92097856533314 -4.800000000000045
+ vertex -177.04752841003264 -70.98664256999737 -4.799999999999952
+ vertex -178.9527842983584 -69.88664256999742 -4.7999999999999545
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -177.04752841003264 -70.98664256999737 -4.799999999999952
+ vertex -28.952784298358935 189.92097856533314 -4.800000000000045
+ vertex -27.04752841003311 188.82097856533326 -4.800000000000042
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 2.6118274155526564e-14
+ outer loop
+ vertex -27.04752841003311 188.82097856533326 -4.800000000000042
+ vertex -177.04752841003264 -70.98664256999729 -3.399999999999954
+ vertex -177.04752841003264 -70.98664256999737 -4.799999999999952
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 2.6118274155526564e-14
+ outer loop
+ vertex -177.04752841003264 -70.98664256999729 -3.399999999999954
+ vertex -27.04752841003311 188.82097856533326 -4.800000000000042
+ vertex -27.04752841003313 188.82097856533326 -3.4000000000000443
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -178.9527842983584 -69.88664256999746 -6.834314575050715
+ vertex -28.952784298358935 189.92097856533314 -4.800000000000045
+ vertex -178.9527842983584 -69.88664256999742 -4.7999999999999545
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -28.952784298358935 189.92097856533314 -4.800000000000045
+ vertex -178.9527842983584 -69.88664256999746 -6.834314575050715
+ vertex -28.952784298358957 189.9209785653331 -6.834314575050805
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -177.04752841003264 -70.98664256999729 -3.399999999999954
+ vertex -27.393938571546936 189.02097856533325 -3.4000000000000443
+ vertex -177.39393857154639 -70.78664256999731 -3.399999999999954
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -27.393938571546936 189.02097856533325 -3.4000000000000443
+ vertex -177.04752841003264 -70.98664256999729 -3.399999999999954
+ vertex -27.04752841003313 188.82097856533326 -3.4000000000000443
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 4.464960093105168e-15
+ outer loop
+ vertex -27.393938571546936 189.02097856533325 -3.4000000000000443
+ vertex -177.39393857154639 -70.78664256999726 -2.999999999999955
+ vertex -177.39393857154639 -70.78664256999731 -3.399999999999954
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 4.464960093105168e-15
+ outer loop
+ vertex -177.39393857154639 -70.78664256999726 -2.999999999999955
+ vertex -27.393938571546936 189.02097856533325 -3.4000000000000443
+ vertex -27.393938571546915 189.02097856533325 -3.0000000000000453
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -177.39393857154639 -70.78664256999726 -2.999999999999955
+ vertex -31.897270671226043 191.6209785653332 -3.000000000000051
+ vertex -181.89727067122553 -68.18664256999743 -2.9999999999999494
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -31.897270671226043 191.6209785653332 -3.000000000000051
+ vertex -177.39393857154639 -70.78664256999726 -2.999999999999955
+ vertex -27.393938571546915 189.02097856533325 -3.0000000000000453
+ endloop
+endfacet
+facet normal -0.11303899832181771 0.06526309611006642 0.9914448613738075
+ outer loop
+ vertex -181.89727067122553 -68.18664256999743 -2.9999999999999494
+ vertex -32.12141453926807 191.75038808788443 -3.034074173710977
+ vertex -182.12141453926756 -68.05723304744619 -3.034074173710887
+ endloop
+endfacet
+facet normal -0.11303899832181771 0.06526309611006642 0.9914448613738075
+ outer loop
+ vertex -32.12141453926807 191.75038808788443 -3.034074173710977
+ vertex -181.89727067122553 -68.18664256999743 -2.9999999999999494
+ vertex -31.897270671226043 191.6209785653332 -3.000000000000051
+ endloop
+endfacet
+facet normal -0.3314135740355741 0.1913417161825613 0.9238795325112896
+ outer loop
+ vertex -182.12141453926756 -68.05723304744619 -3.034074173710887
+ vertex -32.33028337311833 191.87097856533305 -3.1339745962156043
+ vertex -182.33028337311777 -67.93664256999747 -3.133974596215514
+ endloop
+endfacet
+facet normal -0.3314135740355741 0.1913417161825613 0.9238795325112896
+ outer loop
+ vertex -32.33028337311833 191.87097856533305 -3.1339745962156043
+ vertex -182.12141453926756 -68.05723304744619 -3.034074173710887
+ vertex -32.12141453926807 191.75038808788443 -3.034074173710977
+ endloop
+endfacet
+facet normal -0.5272028623656494 0.3043807145043624 0.7933533402912476
+ outer loop
+ vertex -182.33028337311777 -67.93664256999747 -3.133974596215514
+ vertex -32.50964310692185 191.9745319559264 -3.2928932188134885
+ vertex -182.50964310692132 -67.83308917940421 -3.2928932188133984
+ endloop
+endfacet
+facet normal -0.5272028623656494 0.3043807145043624 0.7933533402912476
+ outer loop
+ vertex -32.50964310692185 191.9745319559264 -3.2928932188134885
+ vertex -182.33028337311777 -67.93664256999747 -3.133974596215514
+ vertex -32.33028337311833 191.87097856533305 -3.1339745962156043
+ endloop
+endfacet
+facet normal -0.6870641468694532 0.396676670145621 0.6087614290087151
+ outer loop
+ vertex -32.50964310692185 191.9745319559264 -3.2928932188134885
+ vertex -182.64727067122556 -67.75362986810526 -3.4999999999999485
+ vertex -182.50964310692132 -67.83308917940421 -3.2928932188133984
+ endloop
+endfacet
+facet normal -0.6870641468694532 0.396676670145621 0.6087614290087151
+ outer loop
+ vertex -182.64727067122556 -67.75362986810526 -3.4999999999999485
+ vertex -32.50964310692185 191.9745319559264 -3.2928932188134885
+ vertex -32.647270671226075 192.0539912672253 -3.5000000000000386
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.76329607501052 192.12097856533305 -4.000000000000038
+ vertex -32.41688591349683 191.92097856533292 -9.20000000000005
+ vertex -32.76329607501059 192.12097856533296 -9.20000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.41688591349683 191.92097856533292 -9.20000000000005
+ vertex -32.76329607501052 192.12097856533305 -4.000000000000038
+ vertex -32.19646627266526 191.79371922636426 -5.614110472164045
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.41688591349683 191.92097856533292 -9.20000000000005
+ vertex -32.19646627266526 191.79371922636426 -5.614110472164045
+ vertex -32.058040186684785 191.71379888836057 -6.000000000000034
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.41688591349683 191.92097856533292 -9.20000000000005
+ vertex -32.058040186684785 191.71379888836057 -6.000000000000034
+ vertex -31.204450348198613 191.22097856533298 -7.40000000000004
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.204450348198613 191.22097856533298 -7.40000000000004
+ vertex -32.058040186684785 191.71379888836057 -6.000000000000034
+ vertex -31.837836083798095 191.58666399028218 -6.331370849898517
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.204450348198613 191.22097856533298 -7.40000000000004
+ vertex -31.837836083798095 191.58666399028218 -6.331370849898517
+ vertex -31.550860509712372 191.42097856533303 -6.585640646055154
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.204450348198613 191.22097856533298 -7.40000000000004
+ vertex -31.550860509712372 191.42097856533303 -6.585640646055154
+ vertex -31.216670375552013 191.22803380141505 -6.745481322062546
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.204450348198613 191.22097856533298 -7.40000000000004
+ vertex -31.216670375552013 191.22803380141505 -6.745481322062546
+ vertex -29.442682246915638 190.20382127780772 -7.40000000000004
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -29.442682246915638 190.20382127780772 -7.40000000000004
+ vertex -31.216670375552013 191.22803380141505 -6.745481322062546
+ vertex -30.858040186684786 191.02097856533302 -6.800000000000041
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -29.442682246915638 190.20382127780772 -7.40000000000004
+ vertex -30.858040186684786 191.02097856533302 -6.800000000000041
+ vertex -28.952784298358957 189.9209785653331 -6.834314575050805
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.19646627266526 191.79371922636426 -5.614110472164045
+ vertex -32.76329607501052 192.12097856533305 -4.000000000000038
+ vertex -32.24368083273991 191.82097856533298 -5.200000000000013
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.24368083273991 191.82097856533298 -5.200000000000013
+ vertex -32.76329607501052 192.12097856533305 -4.000000000000038
+ vertex -32.19646627266526 191.79371922636432 -4.785889527835981
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.19646627266526 191.79371922636432 -4.785889527835981
+ vertex -32.76329607501052 192.12097856533305 -4.000000000000038
+ vertex -32.058040186684785 191.71379888836057 -4.400000000000015
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.058040186684785 191.71379888836057 -4.400000000000015
+ vertex -32.76329607501052 192.12097856533305 -4.000000000000038
+ vertex -31.837836083797985 191.58666399028237 -4.068629150101555
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.837836083797985 191.58666399028237 -4.068629150101555
+ vertex -32.76329607501052 192.12097856533305 -4.000000000000038
+ vertex -31.550860509712304 191.42097856533306 -3.8143593539449396
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.550860509712304 191.42097856533306 -3.8143593539449396
+ vertex -32.76329607501052 192.12097856533305 -4.000000000000038
+ vertex -32.73378697496388 192.1039414784776 -3.7411809548975263
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.550860509712304 191.42097856533306 -3.8143593539449396
+ vertex -32.73378697496388 192.1039414784776 -3.7411809548975263
+ vertex -31.216670375551946 191.22803380141514 -3.65451867793752
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.216670375551946 191.22803380141514 -3.65451867793752
+ vertex -32.73378697496388 192.1039414784776 -3.7411809548975263
+ vertex -32.647270671226075 192.0539912672253 -3.5000000000000386
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.216670375551946 191.22803380141514 -3.65451867793752
+ vertex -32.647270671226075 192.0539912672253 -3.5000000000000386
+ vertex -30.85804018668474 191.02097856533317 -3.600000000000047
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.50964310692185 191.9745319559264 -3.2928932188134885
+ vertex -27.393938571546936 189.02097856533325 -3.4000000000000443
+ vertex -32.647270671226075 192.0539912672253 -3.5000000000000386
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.393938571546936 189.02097856533325 -3.4000000000000443
+ vertex -32.50964310692185 191.9745319559264 -3.2928932188134885
+ vertex -27.393938571546915 189.02097856533325 -3.0000000000000453
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.393938571546915 189.02097856533325 -3.0000000000000453
+ vertex -32.50964310692185 191.9745319559264 -3.2928932188134885
+ vertex -32.33028337311833 191.87097856533305 -3.1339745962156043
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.393938571546915 189.02097856533325 -3.0000000000000453
+ vertex -32.33028337311833 191.87097856533305 -3.1339745962156043
+ vertex -32.12141453926807 191.75038808788443 -3.034074173710977
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.393938571546915 189.02097856533325 -3.0000000000000453
+ vertex -32.12141453926807 191.75038808788443 -3.034074173710977
+ vertex -31.897270671226043 191.6209785653332 -3.000000000000051
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.952784298358957 189.9209785653331 -6.834314575050805
+ vertex -29.65804018668472 190.32815824230553 -6.000000000000065
+ vertex -28.952784298358935 189.92097856533314 -4.800000000000045
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -29.65804018668472 190.32815824230553 -6.000000000000065
+ vertex -28.952784298358957 189.9209785653331 -6.834314575050805
+ vertex -29.878244289571473 190.45529314038384 -6.331370849898536
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -29.878244289571473 190.45529314038384 -6.331370849898536
+ vertex -28.952784298358957 189.9209785653331 -6.834314575050805
+ vertex -30.165219863657196 190.62097856533308 -6.585640646055151
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -30.165219863657196 190.62097856533308 -6.585640646055151
+ vertex -28.952784298358957 189.9209785653331 -6.834314575050805
+ vertex -30.49940999781753 190.81392332925108 -6.7454813220625685
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -30.49940999781753 190.81392332925108 -6.7454813220625685
+ vertex -28.952784298358957 189.9209785653331 -6.834314575050805
+ vertex -30.858040186684786 191.02097856533302 -6.800000000000041
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.952784298358935 189.92097856533314 -4.800000000000045
+ vertex -29.65804018668472 190.32815824230553 -6.000000000000065
+ vertex -29.51961410070422 190.24823790430182 -5.614110472164098
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.952784298358935 189.92097856533314 -4.800000000000045
+ vertex -29.51961410070422 190.24823790430182 -5.614110472164098
+ vertex -29.472399540629656 190.22097856533307 -5.200000000000067
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.952784298358935 189.92097856533314 -4.800000000000045
+ vertex -29.472399540629656 190.22097856533307 -5.200000000000067
+ vertex -29.519614100704196 190.24823790430187 -4.785889527836012
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.952784298358935 189.92097856533314 -4.800000000000045
+ vertex -29.519614100704196 190.24823790430187 -4.785889527836012
+ vertex -27.04752841003311 188.82097856533326 -4.800000000000042
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.04752841003311 188.82097856533326 -4.800000000000042
+ vertex -29.519614100704196 190.24823790430187 -4.785889527836012
+ vertex -27.04752841003313 188.82097856533326 -3.4000000000000443
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.04752841003313 188.82097856533326 -3.4000000000000443
+ vertex -29.519614100704196 190.24823790430187 -4.785889527836012
+ vertex -29.658040186684765 190.32815824230553 -4.400000000000046
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.04752841003313 188.82097856533326 -3.4000000000000443
+ vertex -29.658040186684765 190.32815824230553 -4.400000000000046
+ vertex -29.878244289571427 190.4552931403839 -4.068629150101574
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.04752841003313 188.82097856533326 -3.4000000000000443
+ vertex -29.878244289571427 190.4552931403839 -4.068629150101574
+ vertex -30.16521986365713 190.6209785653331 -3.814359353944937
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.04752841003313 188.82097856533326 -3.4000000000000443
+ vertex -30.16521986365713 190.6209785653331 -3.814359353944937
+ vertex -30.49940999781753 190.81392332925108 -3.6545186779375425
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.04752841003313 188.82097856533326 -3.4000000000000443
+ vertex -30.49940999781753 190.81392332925108 -3.6545186779375425
+ vertex -30.85804018668474 191.02097856533317 -3.600000000000047
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.04752841003313 188.82097856533326 -3.4000000000000443
+ vertex -30.85804018668474 191.02097856533317 -3.600000000000047
+ vertex -32.647270671226075 192.0539912672253 -3.5000000000000386
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.04752841003313 188.82097856533326 -3.4000000000000443
+ vertex -32.647270671226075 192.0539912672253 -3.5000000000000386
+ vertex -27.393938571546936 189.02097856533325 -3.4000000000000443
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -21.1585556642991 185.4209785653329 -21.20000000000005
+ vertex -20.812145502785363 185.2209785653328 -22.60000000000004
+ vertex -21.158555664299147 185.4209785653328 -22.600000000000048
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.812145502785363 185.2209785653328 -22.60000000000004
+ vertex -21.1585556642991 185.4209785653329 -21.20000000000005
+ vertex -17.70667407651477 183.42803380141493 -22.345481322062547
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.812145502785363 185.2209785653328 -22.60000000000004
+ vertex -17.70667407651477 183.42803380141493 -22.345481322062547
+ vertex -17.348043887647563 183.22097856533296 -22.400000000000045
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.812145502785363 185.2209785653328 -22.60000000000004
+ vertex -17.348043887647563 183.22097856533296 -22.400000000000045
+ vertex -15.558813403106205 182.18796586344075 -22.50000000000003
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -17.70667407651477 183.42803380141493 -22.345481322062547
+ vertex -21.1585556642991 185.4209785653329 -21.20000000000005
+ vertex -18.040864210675128 183.6209785653329 -22.185640646055155
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.040864210675128 183.6209785653329 -22.185640646055155
+ vertex -21.1585556642991 185.4209785653329 -21.20000000000005
+ vertex -18.32783978476083 183.78666399028216 -21.931370849898517
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.32783978476083 183.78666399028216 -21.931370849898517
+ vertex -21.1585556642991 185.4209785653329 -21.20000000000005
+ vertex -18.548043887647626 183.91379888836042 -21.600000000000044
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.548043887647626 183.91379888836042 -21.600000000000044
+ vertex -21.1585556642991 185.4209785653329 -21.20000000000005
+ vertex -18.68646997362806 183.99371922636422 -21.21411047216408
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.68646997362806 183.99371922636422 -21.21411047216408
+ vertex -21.1585556642991 185.4209785653329 -21.20000000000005
+ vertex -19.253299775973296 184.32097856533298 -21.200000000000035
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.68646997362806 183.99371922636422 -21.21411047216408
+ vertex -19.253299775973296 184.32097856533298 -21.200000000000035
+ vertex -18.733684533702647 184.020978565333 -20.800000000000026
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.733684533702647 184.020978565333 -20.800000000000026
+ vertex -19.253299775973296 184.32097856533298 -21.200000000000035
+ vertex -19.253299775973296 184.32097856533298 -19.165685424949274
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.733684533702647 184.020978565333 -20.800000000000026
+ vertex -19.253299775973296 184.32097856533298 -19.165685424949274
+ vertex -18.686469973628014 183.99371922636428 -20.385889527835992
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.686469973628014 183.99371922636428 -20.385889527835992
+ vertex -19.253299775973296 184.32097856533298 -19.165685424949274
+ vertex -18.548043887647516 183.91379888836056 -20.000000000000025
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.548043887647516 183.91379888836056 -20.000000000000025
+ vertex -19.253299775973296 184.32097856533298 -19.165685424949274
+ vertex -18.32783978476081 183.78666399028225 -19.668629150101555
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.32783978476081 183.78666399028225 -19.668629150101555
+ vertex -19.253299775973296 184.32097856533298 -19.165685424949274
+ vertex -18.04086421067506 183.620978565333 -19.41435935394494
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.04086421067506 183.620978565333 -19.41435935394494
+ vertex -19.253299775973296 184.32097856533298 -19.165685424949274
+ vertex -17.706674076514748 183.42803380141498 -19.254518677937522
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -17.706674076514748 183.42803380141498 -19.254518677937522
+ vertex -19.253299775973296 184.32097856533298 -19.165685424949274
+ vertex -17.348043887647517 183.22097856533298 -19.20000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -17.00163372613367 183.02097856533314 -16.400000000000055
+ vertex -15.78919816083543 182.3209785653332 -16.80000000000005
+ vertex -17.001633726133736 183.02097856533308 -18.60000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.78919816083543 182.3209785653332 -16.80000000000005
+ vertex -17.00163372613367 183.02097856533314 -16.400000000000055
+ vertex -15.78919816083545 182.32097856533315 -16.400000000000052
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -17.348043887647563 183.22097856533296 -22.400000000000045
+ vertex -15.472297099368376 182.13801565218841 -22.25881904510254
+ vertex -15.558813403106205 182.18796586344075 -22.50000000000003
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.472297099368376 182.13801565218841 -22.25881904510254
+ vertex -17.348043887647563 183.22097856533296 -22.400000000000045
+ vertex -16.98941369878038 183.01392332925096 -22.34548132206257
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.472297099368376 182.13801565218841 -22.25881904510254
+ vertex -16.98941369878038 183.01392332925096 -22.34548132206257
+ vertex -16.655223564620044 182.8209785653329 -22.185640646055152
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.472297099368376 182.13801565218841 -22.25881904510254
+ vertex -16.655223564620044 182.8209785653329 -22.185640646055152
+ vertex -15.442787999321737 182.12097856533305 -22.00000000000003
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321737 182.12097856533305 -22.00000000000003
+ vertex -16.655223564620044 182.8209785653329 -22.185640646055152
+ vertex -16.368247990534318 182.6552931403837 -21.931370849898535
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321737 182.12097856533305 -22.00000000000003
+ vertex -16.368247990534318 182.6552931403837 -21.931370849898535
+ vertex -16.14804388764752 182.52815824230544 -21.600000000000065
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321737 182.12097856533305 -22.00000000000003
+ vertex -16.14804388764752 182.52815824230544 -21.600000000000065
+ vertex -16.009617801666977 182.4482379043018 -21.214110472164098
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321737 182.12097856533305 -22.00000000000003
+ vertex -16.009617801666977 182.4482379043018 -21.214110472164098
+ vertex -15.442787999321668 182.12097856533316 -16.80000000000004
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321668 182.12097856533316 -16.80000000000004
+ vertex -16.009617801666977 182.4482379043018 -21.214110472164098
+ vertex -15.962403241592387 182.4209785653331 -20.800000000000065
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321668 182.12097856533316 -16.80000000000004
+ vertex -15.962403241592387 182.4209785653331 -20.800000000000065
+ vertex -16.009617801666977 182.44823790430183 -20.385889527836035
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321668 182.12097856533316 -16.80000000000004
+ vertex -16.009617801666977 182.44823790430183 -20.385889527836035
+ vertex -16.148043887647475 182.52815824230547 -20.000000000000046
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321668 182.12097856533316 -16.80000000000004
+ vertex -16.148043887647475 182.52815824230547 -20.000000000000046
+ vertex -16.368247990534183 182.65529314038383 -19.668629150101573
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321668 182.12097856533316 -16.80000000000004
+ vertex -16.368247990534183 182.65529314038383 -19.668629150101573
+ vertex -16.655223564619952 182.82097856533304 -19.414359353944935
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321668 182.12097856533316 -16.80000000000004
+ vertex -16.655223564619952 182.82097856533304 -19.414359353944935
+ vertex -16.989413698780243 183.013923329251 -19.254518677937543
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321668 182.12097856533316 -16.80000000000004
+ vertex -16.989413698780243 183.013923329251 -19.254518677937543
+ vertex -17.348043887647517 183.22097856533298 -19.20000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321668 182.12097856533316 -16.80000000000004
+ vertex -17.348043887647517 183.22097856533298 -19.20000000000005
+ vertex -17.001633726133736 183.02097856533308 -18.60000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -17.001633726133736 183.02097856533308 -18.60000000000005
+ vertex -17.348043887647517 183.22097856533298 -19.20000000000005
+ vertex -19.253299775973296 184.32097856533298 -19.165685424949274
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -17.001633726133736 183.02097856533308 -18.60000000000005
+ vertex -19.253299775973296 184.32097856533298 -19.165685424949274
+ vertex -18.763401827416597 184.03813585285843 -18.60000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321668 182.12097856533316 -16.80000000000004
+ vertex -17.001633726133736 183.02097856533308 -18.60000000000005
+ vertex -15.78919816083543 182.3209785653332 -16.80000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -29.47239954062988 190.22097856533262 -20.800000000000026
+ vertex -28.95278429835923 189.92097856533263 -21.200000000000056
+ vertex -29.519614100704512 190.24823790430136 -21.214110472164055
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.95278429835923 189.92097856533263 -21.200000000000056
+ vertex -29.47239954062988 190.22097856533262 -20.800000000000026
+ vertex -28.952784298359205 189.92097856533272 -19.16568542494932
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.952784298359205 189.92097856533272 -19.16568542494932
+ vertex -29.47239954062988 190.22097856533262 -20.800000000000026
+ vertex -29.519614100704466 190.24823790430136 -20.385889527835992
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.952784298359205 189.92097856533272 -19.16568542494932
+ vertex -29.519614100704466 190.24823790430136 -20.385889527835992
+ vertex -29.658040186684968 190.3281582423051 -20.000000000000025
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.952784298359205 189.92097856533272 -19.16568542494932
+ vertex -29.658040186684968 190.3281582423051 -20.000000000000025
+ vertex -29.87824428957172 190.4552931403834 -19.668629150101555
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.952784298359205 189.92097856533272 -19.16568542494932
+ vertex -29.87824428957172 190.4552931403834 -19.668629150101555
+ vertex -30.1652198636574 190.6209785653327 -19.414359353944917
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.952784298359205 189.92097856533272 -19.16568542494932
+ vertex -30.1652198636574 190.6209785653327 -19.414359353944917
+ vertex -30.499409997817736 190.81392332925068 -19.2545186779375
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.952784298359205 189.92097856533272 -19.16568542494932
+ vertex -30.499409997817736 190.81392332925068 -19.2545186779375
+ vertex -30.85804018668501 191.02097856533257 -19.200000000000006
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.121414539268436 191.75038808788375 -22.96592582628912
+ vertex -27.393938571547185 189.02097856533265 -23.000000000000053
+ vertex -31.897270671226426 191.62097856533254 -23.000000000000057
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.393938571547185 189.02097856533265 -23.000000000000053
+ vertex -32.121414539268436 191.75038808788375 -22.96592582628912
+ vertex -27.39393857154723 189.02097856533257 -22.600000000000055
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.39393857154723 189.02097856533257 -22.600000000000055
+ vertex -32.121414539268436 191.75038808788375 -22.96592582628912
+ vertex -32.3302833731186 191.8709785653325 -22.86602540378449
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.39393857154723 189.02097856533257 -22.600000000000055
+ vertex -32.3302833731186 191.8709785653325 -22.86602540378449
+ vertex -32.50964310692216 191.9745319559258 -22.70710678118661
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.39393857154723 189.02097856533257 -22.600000000000055
+ vertex -32.50964310692216 191.9745319559258 -22.70710678118661
+ vertex -32.647270671226366 192.05399126722477 -22.50000000000006
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.39393857154723 189.02097856533257 -22.600000000000055
+ vertex -32.647270671226366 192.05399126722477 -22.50000000000006
+ vertex -27.047528410033404 188.8209785653326 -22.60000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.047528410033404 188.8209785653326 -22.60000000000005
+ vertex -32.647270671226366 192.05399126722477 -22.50000000000006
+ vertex -30.858040186685056 191.02097856533263 -22.400000000000023
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.047528410033404 188.8209785653326 -22.60000000000005
+ vertex -30.858040186685056 191.02097856533263 -22.400000000000023
+ vertex -30.499409997817825 190.81392332925054 -22.34548132206253
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.047528410033404 188.8209785653326 -22.60000000000005
+ vertex -30.499409997817825 190.81392332925054 -22.34548132206253
+ vertex -27.047528410033426 188.82097856533272 -21.200000000000053
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.047528410033426 188.82097856533272 -21.200000000000053
+ vertex -30.499409997817825 190.81392332925054 -22.34548132206253
+ vertex -30.165219863657466 190.62097856533256 -22.185640646055134
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.047528410033426 188.82097856533272 -21.200000000000053
+ vertex -30.165219863657466 190.62097856533256 -22.185640646055134
+ vertex -29.878244289571743 190.45529314038336 -21.931370849898517
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.047528410033426 188.82097856533272 -21.200000000000053
+ vertex -29.878244289571743 190.45529314038336 -21.931370849898517
+ vertex -29.658040186685035 190.32815824230505 -21.600000000000023
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.047528410033426 188.82097856533272 -21.200000000000053
+ vertex -29.658040186685035 190.32815824230505 -21.600000000000023
+ vertex -29.519614100704512 190.24823790430136 -21.214110472164055
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.047528410033426 188.82097856533272 -21.200000000000053
+ vertex -29.519614100704512 190.24823790430136 -21.214110472164055
+ vertex -28.95278429835923 189.92097856533263 -21.200000000000056
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.812145502785388 185.22097856533284 -23.000000000000036
+ vertex -16.084669535064208 182.4915690427817 -22.9659258262891
+ vertex -16.30881340310624 182.62097856533293 -23.00000000000004
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -16.084669535064208 182.4915690427817 -22.9659258262891
+ vertex -20.812145502785388 185.22097856533284 -23.000000000000036
+ vertex -20.812145502785363 185.2209785653328 -22.60000000000004
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -16.084669535064208 182.4915690427817 -22.9659258262891
+ vertex -20.812145502785363 185.2209785653328 -22.60000000000004
+ vertex -15.87580070121402 182.37097856533296 -22.866025403784477
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.87580070121402 182.37097856533296 -22.866025403784477
+ vertex -20.812145502785363 185.2209785653328 -22.60000000000004
+ vertex -15.696440967410407 182.26742517473969 -22.707106781186592
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.696440967410407 182.26742517473969 -22.707106781186592
+ vertex -20.812145502785363 185.2209785653328 -22.60000000000004
+ vertex -15.558813403106205 182.18796586344075 -22.50000000000003
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.7337869749642 192.10394147847708 -22.258819045102573
+ vertex -30.858040186685056 191.02097856533263 -22.400000000000023
+ vertex -32.647270671226366 192.05399126722477 -22.50000000000006
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -30.858040186685056 191.02097856533263 -22.400000000000023
+ vertex -32.7337869749642 192.10394147847708 -22.258819045102573
+ vertex -31.216670375552287 191.22803380141454 -22.345481322062533
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.216670375552287 191.22803380141454 -22.345481322062533
+ vertex -32.7337869749642 192.10394147847708 -22.258819045102573
+ vertex -31.550860509712596 191.42097856533258 -22.185640646055123
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.550860509712596 191.42097856533258 -22.185640646055123
+ vertex -32.7337869749642 192.10394147847708 -22.258819045102573
+ vertex -32.763296075010814 192.1209785653325 -22.00000000000006
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.550860509712596 191.42097856533258 -22.185640646055123
+ vertex -32.763296075010814 192.1209785653325 -22.00000000000006
+ vertex -31.83783608379839 191.58666399028175 -21.931370849898506
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.83783608379839 191.58666399028175 -21.931370849898506
+ vertex -32.763296075010814 192.1209785653325 -22.00000000000006
+ vertex -32.05804018668512 191.71379888836003 -21.600000000000016
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.05804018668512 191.71379888836003 -21.600000000000016
+ vertex -32.763296075010814 192.1209785653325 -22.00000000000006
+ vertex -32.19646627266555 191.7937192263638 -21.214110472164048
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.19646627266555 191.7937192263638 -21.214110472164048
+ vertex -32.763296075010814 192.1209785653325 -22.00000000000006
+ vertex -32.7632960750107 192.12097856533268 -16.800000000000093
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.19646627266555 191.7937192263638 -21.214110472164048
+ vertex -32.7632960750107 192.12097856533268 -16.800000000000093
+ vertex -32.24368083274021 191.82097856533252 -20.800000000000015
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.24368083274021 191.82097856533252 -20.800000000000015
+ vertex -32.7632960750107 192.12097856533268 -16.800000000000093
+ vertex -32.1964662726655 191.79371922636386 -20.385889527835985
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.1964662726655 191.79371922636386 -20.385889527835985
+ vertex -32.7632960750107 192.12097856533268 -16.800000000000093
+ vertex -32.0580401866851 191.7137988883601 -20.000000000000018
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.0580401866851 191.7137988883601 -20.000000000000018
+ vertex -32.7632960750107 192.12097856533268 -16.800000000000093
+ vertex -31.837836083798276 191.58666399028183 -19.668629150101545
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.837836083798276 191.58666399028183 -19.668629150101545
+ vertex -32.7632960750107 192.12097856533268 -16.800000000000093
+ vertex -31.550860509712553 191.42097856533266 -19.414359353944903
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.550860509712553 191.42097856533266 -19.414359353944903
+ vertex -32.7632960750107 192.12097856533268 -16.800000000000093
+ vertex -31.216670375552287 191.2280338014146 -19.254518677937508
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.216670375552287 191.2280338014146 -19.254518677937508
+ vertex -32.7632960750107 192.12097856533268 -16.800000000000093
+ vertex -30.85804018668501 191.02097856533257 -19.200000000000006
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -30.85804018668501 191.02097856533257 -19.200000000000006
+ vertex -32.7632960750107 192.12097856533268 -16.800000000000093
+ vertex -31.204450348198748 191.2209785653327 -18.60000000000006
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -30.85804018668501 191.02097856533257 -19.200000000000006
+ vertex -31.204450348198748 191.2209785653327 -18.60000000000006
+ vertex -28.952784298359205 189.92097856533272 -19.16568542494932
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.204450348198748 191.2209785653327 -18.60000000000006
+ vertex -32.7632960750107 192.12097856533268 -16.800000000000093
+ vertex -32.41688591349694 191.92097856533272 -16.80000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.204450348198748 191.2209785653327 -18.60000000000006
+ vertex -32.41688591349694 191.92097856533272 -16.80000000000009
+ vertex -31.204450348198726 191.2209785653327 -16.400000000000063
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.204450348198726 191.2209785653327 -16.400000000000063
+ vertex -32.41688591349694 191.92097856533272 -16.80000000000009
+ vertex -32.41688591349694 191.9209785653327 -16.400000000000095
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.30733603116855 188.97097856533304 -9.865685424949291
+ vertex -26.817438082611847 188.6881358528584 -9.300000000000056
+ vertex -21.388645991720228 185.55382127780788 -9.300000000000061
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -26.817438082611847 188.6881358528584 -9.300000000000056
+ vertex -27.30733603116855 188.97097856533304 -9.865685424949291
+ vertex -29.442682246915638 190.20382127780772 -7.40000000000004
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -26.817438082611847 188.6881358528584 -9.300000000000056
+ vertex -29.442682246915638 190.20382127780772 -7.40000000000004
+ vertex -28.952784298358957 189.9209785653331 -6.834314575050805
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.41688591349683 191.92097856533292 -9.20000000000005
+ vertex -31.204450348198588 191.22097856533293 -9.600000000000035
+ vertex -32.4168859134969 191.92097856533286 -9.60000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.204450348198588 191.22097856533293 -9.600000000000035
+ vertex -32.41688591349683 191.92097856533292 -9.20000000000005
+ vertex -31.204450348198613 191.22097856533298 -7.40000000000004
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.30733603116866 188.97097856533284 -16.134314575050784
+ vertex -24.70823048087963 187.47038427622132 -15.607999730980517
+ vertex -24.103042037166183 187.12097856533296 -15.700000000000038
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -24.70823048087963 187.47038427622132 -15.607999730980517
+ vertex -27.30733603116866 188.97097856533284 -16.134314575050784
+ vertex -25.272176332275194 187.79597856533294 -15.338268590218007
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -25.272176332275194 187.79597856533294 -15.338268590218007
+ vertex -27.30733603116866 188.97097856533284 -16.134314575050784
+ vertex -25.756447613544847 188.07557271993477 -14.909188309203735
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -25.756447613544847 188.07557271993477 -14.909188309203735
+ vertex -27.30733603116866 188.97097856533284 -16.134314575050784
+ vertex -26.12804203716622 188.29011286044195 -14.350000000000055
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -26.12804203716622 188.29011286044195 -14.350000000000055
+ vertex -27.30733603116866 188.97097856533284 -16.134314575050784
+ vertex -26.361636057258295 188.42497843082322 -13.698811421776844
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -26.361636057258295 188.42497843082322 -13.698811421776844
+ vertex -27.30733603116866 188.97097856533284 -16.134314575050784
+ vertex -27.30733603116855 188.97097856533304 -9.865685424949291
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -26.361636057258295 188.42497843082322 -13.698811421776844
+ vertex -27.30733603116855 188.97097856533304 -9.865685424949291
+ vertex -26.441310627384183 188.47097856533296 -13.000000000000046
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -26.441310627384183 188.47097856533296 -13.000000000000046
+ vertex -27.30733603116855 188.97097856533304 -9.865685424949291
+ vertex -26.361636057258295 188.42497843082322 -12.30118857822325
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -26.361636057258295 188.42497843082322 -12.30118857822325
+ vertex -27.30733603116855 188.97097856533304 -9.865685424949291
+ vertex -26.128042037166153 188.29011286044198 -11.650000000000038
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -26.128042037166153 188.29011286044198 -11.650000000000038
+ vertex -27.30733603116855 188.97097856533304 -9.865685424949291
+ vertex -25.756447613544758 188.0755727199349 -11.09081169079636
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -25.756447613544758 188.0755727199349 -11.09081169079636
+ vertex -27.30733603116855 188.97097856533304 -9.865685424949291
+ vertex -25.27217633227515 187.79597856533303 -10.661731409782071
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -25.27217633227515 187.79597856533303 -10.661731409782071
+ vertex -27.30733603116855 188.97097856533304 -9.865685424949291
+ vertex -24.708230480879518 187.47038427622155 -10.392000269019562
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -24.708230480879518 187.47038427622155 -10.392000269019562
+ vertex -27.30733603116855 188.97097856533304 -9.865685424949291
+ vertex -24.103042037166073 187.1209785653331 -10.30000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -24.103042037166073 187.1209785653331 -10.30000000000005
+ vertex -27.30733603116855 188.97097856533304 -9.865685424949291
+ vertex -20.898748043163664 185.2709785653332 -9.865685424949328
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163664 185.2709785653332 -9.865685424949328
+ vertex -27.30733603116855 188.97097856533304 -9.865685424949291
+ vertex -21.388645991720228 185.55382127780788 -9.300000000000061
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163664 185.2709785653332 -9.865685424949328
+ vertex -21.388645991720228 185.55382127780788 -9.300000000000061
+ vertex -18.763401827416438 184.03813585285874 -7.400000000000051
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.763401827416438 184.03813585285874 -7.400000000000051
+ vertex -21.388645991720228 185.55382127780788 -9.300000000000061
+ vertex -19.253299775973094 184.32097856533338 -6.834314575050794
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.763401827416438 184.03813585285874 -7.400000000000051
+ vertex -19.253299775973094 184.32097856533338 -6.834314575050794
+ vertex -17.00163372613353 183.0209785653334 -7.400000000000048
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -21.15855566429883 185.4209785653334 -3.40000000000005
+ vertex -19.253299775973026 184.3209785653334 -4.800000000000056
+ vertex -21.158555664298852 185.4209785653334 -4.80000000000007
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -19.253299775973026 184.3209785653334 -4.800000000000056
+ vertex -21.15855566429883 185.4209785653334 -3.40000000000005
+ vertex -18.686469973627744 183.99371922636468 -4.785889527836001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.686469973627744 183.99371922636468 -4.785889527836001
+ vertex -21.15855566429883 185.4209785653334 -3.40000000000005
+ vertex -18.548043887647335 183.91379888836096 -4.400000000000034
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.548043887647335 183.91379888836096 -4.400000000000034
+ vertex -21.15855566429883 185.4209785653334 -3.40000000000005
+ vertex -18.327839784760513 183.78666399028273 -4.068629150101538
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.327839784760513 183.78666399028273 -4.068629150101538
+ vertex -21.15855566429883 185.4209785653334 -3.40000000000005
+ vertex -18.04086421067479 183.62097856533347 -3.8143593539449228
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.04086421067479 183.62097856533347 -3.8143593539449228
+ vertex -21.15855566429883 185.4209785653334 -3.40000000000005
+ vertex -17.70667407651443 183.42803380141552 -3.6545186779375283
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -17.70667407651443 183.42803380141552 -3.6545186779375283
+ vertex -21.15855566429883 185.4209785653334 -3.40000000000005
+ vertex -17.3480438876472 183.2209785653335 -3.600000000000033
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -17.3480438876472 183.2209785653335 -3.600000000000033
+ vertex -21.15855566429883 185.4209785653334 -3.40000000000005
+ vertex -15.558813403105889 182.18796586344135 -3.50000000000003
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.558813403105889 182.18796586344135 -3.50000000000003
+ vertex -21.15855566429883 185.4209785653334 -3.40000000000005
+ vertex -20.812145502785025 185.22097856533344 -3.400000000000036
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.558813403105889 182.18796586344135 -3.50000000000003
+ vertex -20.812145502785025 185.22097856533344 -3.400000000000036
+ vertex -15.696440967410114 182.26742517474023 -3.29289321881348
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.696440967410114 182.26742517474023 -3.29289321881348
+ vertex -20.812145502785025 185.22097856533344 -3.400000000000036
+ vertex -20.81214550278505 185.22097856533344 -3.000000000000037
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.696440967410114 182.26742517474023 -3.29289321881348
+ vertex -20.81214550278505 185.22097856533344 -3.000000000000037
+ vertex -15.87580070121366 182.37097856533364 -3.133974596215596
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.87580070121366 182.37097856533364 -3.133974596215596
+ vertex -20.81214550278505 185.22097856533344 -3.000000000000037
+ vertex -16.08466953506387 182.49156904278232 -3.0340741737109713
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -16.08466953506387 182.49156904278232 -3.0340741737109713
+ vertex -20.81214550278505 185.22097856533344 -3.000000000000037
+ vertex -16.308813403105898 182.6209785653336 -3.000000000000034
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -17.00163372613353 183.0209785653334 -7.400000000000048
+ vertex -15.789198160835294 182.32097856533338 -9.60000000000002
+ vertex -17.001633726133555 183.02097856533337 -9.600000000000044
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.789198160835294 182.32097856533338 -9.60000000000002
+ vertex -17.00163372613353 183.0209785653334 -7.400000000000048
+ vertex -15.789198160835294 182.32097856533338 -9.20000000000002
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.789198160835294 182.32097856533338 -9.20000000000002
+ vertex -17.00163372613353 183.0209785653334 -7.400000000000048
+ vertex -15.442787999321533 182.12097856533347 -9.20000000000002
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321533 182.12097856533347 -9.20000000000002
+ vertex -17.00163372613353 183.0209785653334 -7.400000000000048
+ vertex -16.148043887647294 182.52815824230586 -6.000000000000051
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321533 182.12097856533347 -9.20000000000002
+ vertex -16.148043887647294 182.52815824230586 -6.000000000000051
+ vertex -16.00961780166677 182.44823790430226 -5.614110472164084
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321533 182.12097856533347 -9.20000000000002
+ vertex -16.00961780166677 182.44823790430226 -5.614110472164084
+ vertex -15.442787999321421 182.1209785653336 -4.000000000000029
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -16.148043887647294 182.52815824230586 -6.000000000000051
+ vertex -17.00163372613353 183.0209785653334 -7.400000000000048
+ vertex -16.36824799053398 182.65529314038423 -6.331370849898522
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -16.36824799053398 182.65529314038423 -6.331370849898522
+ vertex -17.00163372613353 183.0209785653334 -7.400000000000048
+ vertex -16.655223564619703 182.82097856533343 -6.585640646055159
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -16.655223564619703 182.82097856533343 -6.585640646055159
+ vertex -17.00163372613353 183.0209785653334 -7.400000000000048
+ vertex -16.989413698780062 183.0139233292514 -6.745481322062554
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -16.989413698780062 183.0139233292514 -6.745481322062554
+ vertex -17.00163372613353 183.0209785653334 -7.400000000000048
+ vertex -17.348043887647314 183.2209785653335 -6.80000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -17.348043887647314 183.2209785653335 -6.80000000000005
+ vertex -17.00163372613353 183.0209785653334 -7.400000000000048
+ vertex -19.253299775973094 184.32097856533338 -6.834314575050794
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321421 182.1209785653336 -4.000000000000029
+ vertex -16.00961780166677 182.44823790430226 -5.614110472164084
+ vertex -15.962403241592185 182.42097856533346 -5.200000000000053
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321421 182.1209785653336 -4.000000000000029
+ vertex -15.962403241592185 182.42097856533346 -5.200000000000053
+ vertex -16.009617801666703 182.44823790430226 -4.78588952783602
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321421 182.1209785653336 -4.000000000000029
+ vertex -16.009617801666703 182.44823790430226 -4.78588952783602
+ vertex -16.148043887647294 182.52815824230598 -4.400000000000054
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321421 182.1209785653336 -4.000000000000029
+ vertex -16.148043887647294 182.52815824230598 -4.400000000000054
+ vertex -16.368247990533934 182.6552931403843 -4.068629150101582
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321421 182.1209785653336 -4.000000000000029
+ vertex -16.368247990533934 182.6552931403843 -4.068629150101582
+ vertex -16.65522356461966 182.82097856533352 -3.8143593539449454
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321421 182.1209785653336 -4.000000000000029
+ vertex -16.65522356461966 182.82097856533352 -3.8143593539449454
+ vertex -15.472297099368083 182.13801565218895 -3.741180954897518
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.472297099368083 182.13801565218895 -3.741180954897518
+ vertex -16.65522356461966 182.82097856533352 -3.8143593539449454
+ vertex -16.98941369877997 183.01392332925155 -3.6545186779375283
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.472297099368083 182.13801565218895 -3.741180954897518
+ vertex -16.98941369877997 183.01392332925155 -3.6545186779375283
+ vertex -15.558813403105889 182.18796586344135 -3.50000000000003
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.558813403105889 182.18796586344135 -3.50000000000003
+ vertex -16.98941369877997 183.01392332925155 -3.6545186779375283
+ vertex -17.3480438876472 183.2209785653335 -3.600000000000033
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -19.253299775973094 184.32097856533338 -6.834314575050794
+ vertex -17.706674076514567 183.42803380141538 -6.745481322062554
+ vertex -17.348043887647314 183.2209785653335 -6.80000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -17.706674076514567 183.42803380141538 -6.745481322062554
+ vertex -19.253299775973094 184.32097856533338 -6.834314575050794
+ vertex -18.040864210674833 183.62097856533344 -6.585640646055137
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.040864210674833 183.62097856533344 -6.585640646055137
+ vertex -19.253299775973094 184.32097856533338 -6.834314575050794
+ vertex -18.32783978476065 183.78666399028262 -6.3313708498985
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.32783978476065 183.78666399028262 -6.3313708498985
+ vertex -19.253299775973094 184.32097856533338 -6.834314575050794
+ vertex -18.548043887647314 183.91379888836096 -6.000000000000031
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.548043887647314 183.91379888836096 -6.000000000000031
+ vertex -19.253299775973094 184.32097856533338 -6.834314575050794
+ vertex -19.253299775973026 184.3209785653334 -4.800000000000056
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.548043887647314 183.91379888836096 -6.000000000000031
+ vertex -19.253299775973026 184.3209785653334 -4.800000000000056
+ vertex -18.68646997362779 183.99371922636473 -5.6141104721640644
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.68646997362779 183.99371922636473 -5.6141104721640644
+ vertex -19.253299775973026 184.3209785653334 -4.800000000000056
+ vertex -18.733684533702444 184.0209785653334 -5.200000000000033
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.733684533702444 184.0209785653334 -5.200000000000033
+ vertex -19.253299775973026 184.3209785653334 -4.800000000000056
+ vertex -18.686469973627744 183.99371922636468 -4.785889527836001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.952784298359205 189.92097856533272 -19.16568542494932
+ vertex -29.44268224691582 190.20382127780732 -18.60000000000005
+ vertex -26.81743808261207 188.68813585285818 -16.700000000000063
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -29.44268224691582 190.20382127780732 -18.60000000000005
+ vertex -28.952784298359205 189.92097856533272 -19.16568542494932
+ vertex -31.204450348198748 191.2209785653327 -18.60000000000006
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -26.81743808261207 188.68813585285818 -16.700000000000063
+ vertex -29.44268224691582 190.20382127780732 -18.60000000000005
+ vertex -27.30733603116866 188.97097856533284 -16.134314575050784
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -26.81743808261207 188.68813585285818 -16.700000000000063
+ vertex -27.30733603116866 188.97097856533284 -16.134314575050784
+ vertex -21.388645991720455 185.5538212778076 -16.700000000000028
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -21.388645991720455 185.5538212778076 -16.700000000000028
+ vertex -27.30733603116866 188.97097856533284 -16.134314575050784
+ vertex -20.898748043163707 185.27097856533302 -16.134314575050794
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163707 185.27097856533302 -16.134314575050794
+ vertex -27.30733603116866 188.97097856533284 -16.134314575050784
+ vertex -24.103042037166183 187.12097856533296 -15.700000000000038
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163707 185.27097856533302 -16.134314575050794
+ vertex -24.103042037166183 187.12097856533296 -15.700000000000038
+ vertex -23.49785359345274 186.77157285444454 -15.607999730980529
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163707 185.27097856533302 -16.134314575050794
+ vertex -23.49785359345274 186.77157285444454 -15.607999730980529
+ vertex -22.933907742057176 186.44597856533298 -15.33826859021802
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163707 185.27097856533302 -16.134314575050794
+ vertex -22.933907742057176 186.44597856533298 -15.33826859021802
+ vertex -22.449636460787545 186.16638441073113 -14.909188309203731
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163707 185.27097856533302 -16.134314575050794
+ vertex -22.449636460787545 186.16638441073113 -14.909188309203731
+ vertex -22.07804203716615 185.95184427022406 -14.350000000000053
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163707 185.27097856533302 -16.134314575050794
+ vertex -22.07804203716615 185.95184427022406 -14.350000000000053
+ vertex -21.844448017074033 185.81697869984282 -13.698811421776819
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163707 185.27097856533302 -16.134314575050794
+ vertex -21.844448017074033 185.81697869984282 -13.698811421776819
+ vertex -20.898748043163664 185.2709785653332 -9.865685424949328
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163664 185.2709785653332 -9.865685424949328
+ vertex -21.844448017074033 185.81697869984282 -13.698811421776819
+ vertex -21.76477344694812 185.77097856533308 -13.000000000000021
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163664 185.2709785653332 -9.865685424949328
+ vertex -21.76477344694812 185.77097856533308 -13.000000000000021
+ vertex -21.844448017074008 185.81697869984293 -12.3011885782232
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163664 185.2709785653332 -9.865685424949328
+ vertex -21.844448017074008 185.81697869984293 -12.3011885782232
+ vertex -22.07804203716608 185.95184427022414 -11.650000000000011
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163664 185.2709785653332 -9.865685424949328
+ vertex -22.07804203716608 185.95184427022414 -11.650000000000011
+ vertex -22.44963646078741 186.16638441073135 -11.090811690796333
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163664 185.2709785653332 -9.865685424949328
+ vertex -22.44963646078741 186.16638441073135 -11.090811690796333
+ vertex -22.933907742057063 186.4459785653332 -10.661731409782044
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163664 185.2709785653332 -9.865685424949328
+ vertex -22.933907742057063 186.4459785653332 -10.661731409782044
+ vertex -23.497853593452625 186.77157285444477 -10.39200026901956
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163664 185.2709785653332 -9.865685424949328
+ vertex -23.497853593452625 186.77157285444477 -10.39200026901956
+ vertex -24.103042037166073 187.1209785653331 -10.30000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -21.388645991720455 185.5538212778076 -16.700000000000028
+ vertex -18.763401827416597 184.03813585285843 -18.60000000000005
+ vertex -19.253299775973296 184.32097856533298 -19.165685424949274
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.763401827416597 184.03813585285843 -18.60000000000005
+ vertex -21.388645991720455 185.5538212778076 -16.700000000000028
+ vertex -20.898748043163707 185.27097856533302 -16.134314575050794
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -166.98941369877954 -76.79369780607912 -6.745481322062464
+ vertex -167.70667407651402 -76.3795873339151 -6.745481322062464
+ vertex -167.34804388764678 -76.58664256999711 -6.799999999999959
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -167.70667407651402 -76.3795873339151 -6.745481322062464
+ vertex -166.98941369877954 -76.79369780607912 -6.745481322062464
+ vertex -166.65522356461923 -76.98664256999712 -6.58564064605507
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -167.70667407651402 -76.3795873339151 -6.745481322062464
+ vertex -166.65522356461923 -76.98664256999712 -6.58564064605507
+ vertex -168.04086421067436 -76.18664256999716 -6.5856406460550465
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.04086421067436 -76.18664256999716 -6.5856406460550465
+ vertex -166.65522356461923 -76.98664256999712 -6.58564064605507
+ vertex -166.3682479905335 -77.1523279949463 -6.331370849898432
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.04086421067436 -76.18664256999716 -6.5856406460550465
+ vertex -166.3682479905335 -77.1523279949463 -6.331370849898432
+ vertex -168.32783978476004 -76.0209571450479 -6.331370849898409
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.32783978476004 -76.0209571450479 -6.331370849898409
+ vertex -166.3682479905335 -77.1523279949463 -6.331370849898432
+ vertex -166.14804388764674 -77.27946289302463 -5.999999999999961
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.32783978476004 -76.0209571450479 -6.331370849898409
+ vertex -166.14804388764674 -77.27946289302463 -5.999999999999961
+ vertex -168.5480438876468 -75.89382224696958 -5.999999999999941
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.5480438876468 -75.89382224696958 -5.999999999999941
+ vertex -166.14804388764674 -77.27946289302463 -5.999999999999961
+ vertex -166.00961780166625 -77.35938323102832 -5.614110472163994
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.5480438876468 -75.89382224696958 -5.999999999999941
+ vertex -166.00961780166625 -77.35938323102832 -5.614110472163994
+ vertex -168.68646997362728 -75.81390190896589 -5.614110472163975
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.68646997362728 -75.81390190896589 -5.614110472163975
+ vertex -166.00961780166625 -77.35938323102832 -5.614110472163994
+ vertex -165.96240324159163 -77.38664256999704 -5.199999999999962
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.68646997362728 -75.81390190896589 -5.614110472163975
+ vertex -165.96240324159163 -77.38664256999704 -5.199999999999962
+ vertex -168.73368453370185 -75.78664256999716 -5.1999999999999424
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.73368453370185 -75.78664256999716 -5.1999999999999424
+ vertex -165.96240324159163 -77.38664256999704 -5.199999999999962
+ vertex -166.00961780166622 -77.3593832310283 -4.785889527835931
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.73368453370185 -75.78664256999716 -5.1999999999999424
+ vertex -166.00961780166622 -77.3593832310283 -4.785889527835931
+ vertex -168.68646997362725 -75.81390190896586 -4.785889527835911
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.68646997362725 -75.81390190896586 -4.785889527835911
+ vertex -166.00961780166622 -77.3593832310283 -4.785889527835931
+ vertex -166.1480438876467 -77.27946289302459 -4.399999999999964
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.68646997362725 -75.81390190896586 -4.785889527835911
+ vertex -166.1480438876467 -77.27946289302459 -4.399999999999964
+ vertex -168.54804388764677 -75.89382224696955 -4.399999999999944
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.54804388764677 -75.89382224696955 -4.399999999999944
+ vertex -166.1480438876467 -77.27946289302459 -4.399999999999964
+ vertex -166.36824799053343 -77.15232799494626 -4.068629150101493
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.54804388764677 -75.89382224696955 -4.399999999999944
+ vertex -166.36824799053343 -77.15232799494626 -4.068629150101493
+ vertex -168.32783978476002 -76.02095714504783 -4.068629150101447
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.32783978476002 -76.02095714504783 -4.068629150101447
+ vertex -166.36824799053343 -77.15232799494626 -4.068629150101493
+ vertex -166.65522356461915 -76.98664256999704 -3.8143593539448553
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.32783978476002 -76.02095714504783 -4.068629150101447
+ vertex -166.65522356461915 -76.98664256999704 -3.8143593539448553
+ vertex -168.04086421067427 -76.18664256999706 -3.8143593539448326
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.04086421067427 -76.18664256999706 -3.8143593539448326
+ vertex -166.65522356461915 -76.98664256999704 -3.8143593539448553
+ vertex -166.98941369877946 -76.79369780607902 -3.654518677937438
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.04086421067427 -76.18664256999706 -3.8143593539448326
+ vertex -166.98941369877946 -76.79369780607902 -3.654518677937438
+ vertex -167.7066740765139 -76.37958733391504 -3.654518677937438
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -167.7066740765139 -76.37958733391504 -3.654518677937438
+ vertex -166.98941369877946 -76.79369780607902 -3.654518677937438
+ vertex -167.3480438876467 -76.58664256999705 -3.599999999999943
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 27.10259755034066 188.82097856533443 -43.00000000000016
+ vertex 27.44900771185445 189.02097856533442 -43.00000000000016
+ vertex 27.10259755034073 188.8209785653344 -44.40000000000016
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 30.554479138125014 190.8139233292525 -43.254518677937675
+ vertex 27.10259755034073 188.8209785653344 -44.40000000000016
+ vertex 27.44900771185445 189.02097856533442 -43.00000000000016
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 30.913109326992203 191.02097856533456 -43.20000000000018
+ vertex 30.554479138125014 190.8139233292525 -43.254518677937675
+ vertex 27.44900771185445 189.02097856533442 -43.00000000000016
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.70233981153347 192.0539912672268 -43.10000000000016
+ vertex 30.913109326992203 191.02097856533456 -43.20000000000018
+ vertex 27.44900771185445 189.02097856533442 -43.00000000000016
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 30.22028900396464 190.6209785653345 -43.41435935394508
+ vertex 27.10259755034073 188.8209785653344 -44.40000000000016
+ vertex 30.554479138125014 190.8139233292525 -43.254518677937675
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 29.933313429878947 190.45529314038527 -43.6686291501017
+ vertex 27.10259755034073 188.8209785653344 -44.40000000000016
+ vertex 30.22028900396464 190.6209785653345 -43.41435935394508
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 29.713109326992214 190.32815824230693 -44.0000000000002
+ vertex 27.10259755034073 188.8209785653344 -44.40000000000016
+ vertex 29.933313429878947 190.45529314038527 -43.6686291501017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 29.574683241011734 190.24823790430324 -44.38588952783616
+ vertex 27.10259755034073 188.8209785653344 -44.40000000000016
+ vertex 29.713109326992214 190.32815824230693 -44.0000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 29.007853438666466 189.92097856533445 -44.40000000000017
+ vertex 27.10259755034073 188.8209785653344 -44.40000000000016
+ vertex 29.574683241011734 190.24823790430324 -44.38588952783616
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 29.527468680937115 190.22097856533443 -44.800000000000196
+ vertex 29.007853438666466 189.92097856533445 -44.40000000000017
+ vertex 29.574683241011734 190.24823790430324 -44.38588952783616
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 29.007853438666526 189.92097856533437 -46.43431457505091
+ vertex 29.007853438666466 189.92097856533445 -44.40000000000017
+ vertex 29.527468680937115 190.22097856533443 -44.800000000000196
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 29.574683241011737 190.24823790430318 -45.21411047216423
+ vertex 29.007853438666526 189.92097856533437 -46.43431457505091
+ vertex 29.527468680937115 190.22097856533443 -44.800000000000196
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 29.713109326992253 190.3281582423069 -45.60000000000019
+ vertex 29.007853438666526 189.92097856533437 -46.43431457505091
+ vertex 29.574683241011737 190.24823790430318 -45.21411047216423
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 29.93331342987896 190.45529314038518 -45.931370849898656
+ vertex 29.007853438666526 189.92097856533437 -46.43431457505091
+ vertex 29.713109326992253 190.3281582423069 -45.60000000000019
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 30.220289003964698 190.6209785653344 -46.1856406460553
+ vertex 29.007853438666526 189.92097856533437 -46.43431457505091
+ vertex 29.93331342987896 190.45529314038518 -45.931370849898656
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 30.554479138125004 190.8139233292524 -46.3454813220627
+ vertex 29.007853438666526 189.92097856533437 -46.43431457505091
+ vertex 30.220289003964698 190.6209785653344 -46.1856406460553
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 30.913109326992235 191.0209785653344 -46.4000000000002
+ vertex 29.007853438666526 189.92097856533437 -46.43431457505091
+ vertex 30.554479138125004 190.8139233292524 -46.3454813220627
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 16.363882543413876 182.62097856533416 -42.60000000000018
+ vertex 20.867214643092836 185.22097856533426 -42.60000000000017
+ vertex 16.13973867537185 182.49156904278288 -42.63407417371111
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 20.867214643092836 185.22097856533424 -43.00000000000017
+ vertex 16.13973867537185 182.49156904278288 -42.63407417371111
+ vertex 20.867214643092836 185.22097856533426 -42.60000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 15.930869841521629 182.3709785653341 -42.73397459621574
+ vertex 16.13973867537185 182.49156904278288 -42.63407417371111
+ vertex 20.867214643092836 185.22097856533424 -43.00000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 15.751510107718055 182.26742517474082 -42.892893218813626
+ vertex 15.930869841521629 182.3709785653341 -42.73397459621574
+ vertex 20.867214643092836 185.22097856533424 -43.00000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 15.613882543413824 182.1879658634419 -43.10000000000017
+ vertex 15.751510107718055 182.26742517474082 -42.892893218813626
+ vertex 20.867214643092836 185.22097856533424 -43.00000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 21.213624804606596 185.42097856533425 -43.00000000000017
+ vertex 15.613882543413824 182.1879658634419 -43.10000000000017
+ vertex 20.867214643092836 185.22097856533424 -43.00000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 17.40311302795516 183.22097856533415 -43.20000000000017
+ vertex 15.613882543413824 182.1879658634419 -43.10000000000017
+ vertex 21.213624804606596 185.42097856533425 -43.00000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 17.761743216822392 183.42803380141615 -43.25451867793767
+ vertex 17.40311302795516 183.22097856533415 -43.20000000000017
+ vertex 21.213624804606596 185.42097856533425 -43.00000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 21.213624804606596 185.4209785653342 -44.40000000000017
+ vertex 17.761743216822392 183.42803380141615 -43.25451867793767
+ vertex 21.213624804606596 185.42097856533425 -43.00000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 18.09593335098268 183.62097856533416 -43.41435935394507
+ vertex 17.761743216822392 183.42803380141615 -43.25451867793767
+ vertex 21.213624804606596 185.4209785653342 -44.40000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 18.38290892506843 183.7866639902834 -43.668629150101715
+ vertex 18.09593335098268 183.62097856533416 -43.41435935394507
+ vertex 21.213624804606596 185.4209785653342 -44.40000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 18.60311302795516 183.9137988883617 -44.000000000000185
+ vertex 18.38290892506843 183.7866639902834 -43.668629150101715
+ vertex 21.213624804606596 185.4209785653342 -44.40000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 18.74153911393566 183.9937192263654 -44.38588952783615
+ vertex 18.60311302795516 183.9137988883617 -44.000000000000185
+ vertex 21.213624804606596 185.4209785653342 -44.40000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 19.308368916280923 184.32097856533417 -44.40000000000018
+ vertex 18.74153911393566 183.9937192263654 -44.38588952783615
+ vertex 21.213624804606596 185.4209785653342 -44.40000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 18.788753674010273 184.02097856533413 -44.8000000000002
+ vertex 18.74153911393566 183.9937192263654 -44.38588952783615
+ vertex 19.308368916280923 184.32097856533417 -44.40000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 19.308368916280948 184.32097856533406 -46.43431457505094
+ vertex 18.788753674010273 184.02097856533413 -44.8000000000002
+ vertex 19.308368916280923 184.32097856533417 -44.40000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 18.74153911393566 183.99371922636539 -45.214110472164236
+ vertex 18.788753674010273 184.02097856533413 -44.8000000000002
+ vertex 19.308368916280948 184.32097856533406 -46.43431457505094
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 18.603113027955175 183.91379888836167 -45.60000000000021
+ vertex 18.74153911393566 183.99371922636539 -45.214110472164236
+ vertex 19.308368916280948 184.32097856533406 -46.43431457505094
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 18.382908925068453 183.7866639902833 -45.93137084989868
+ vertex 18.603113027955175 183.91379888836167 -45.60000000000021
+ vertex 19.308368916280948 184.32097856533406 -46.43431457505094
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 18.095933350982747 183.62097856533404 -46.18564064605529
+ vertex 18.382908925068453 183.7866639902833 -45.93137084989868
+ vertex 19.308368916280948 184.32097856533406 -46.43431457505094
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 17.761743216822424 183.42803380141606 -46.345481322062696
+ vertex 18.095933350982747 183.62097856533404 -46.18564064605529
+ vertex 19.308368916280948 184.32097856533406 -46.43431457505094
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 17.40311302795521 183.220978565334 -46.40000000000017
+ vertex 17.761743216822424 183.42803380141606 -46.345481322062696
+ vertex 19.308368916280948 184.32097856533406 -46.43431457505094
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 15.497857139629675 182.1209785653337 -56.400000000000205
+ vertex 15.844267301143415 182.3209785653337 -56.400000000000205
+ vertex 15.497857139629751 182.12097856533353 -61.60000000000019
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 16.06468694197501 182.44823790430235 -59.98588952783613
+ vertex 15.497857139629751 182.12097856533353 -61.60000000000019
+ vertex 15.844267301143415 182.3209785653337 -56.400000000000205
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 16.203113027955485 182.52815824230603 -59.600000000000165
+ vertex 16.06468694197501 182.44823790430235 -59.98588952783613
+ vertex 15.844267301143415 182.3209785653337 -56.400000000000205
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 17.056702866441693 183.02097856533368 -58.200000000000166
+ vertex 16.203113027955485 182.52815824230603 -59.600000000000165
+ vertex 15.844267301143415 182.3209785653337 -56.400000000000205
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 16.42331713084222 182.65529314038437 -59.26862915010169
+ vertex 16.203113027955485 182.52815824230603 -59.600000000000165
+ vertex 17.056702866441693 183.02097856533368 -58.200000000000166
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 16.710292704927927 182.82097856533363 -59.01435935394505
+ vertex 16.42331713084222 182.65529314038437 -59.26862915010169
+ vertex 17.056702866441693 183.02097856533368 -58.200000000000166
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 17.04448283908824 183.0139233292516 -58.854518677937655
+ vertex 16.710292704927927 182.82097856533363 -59.01435935394505
+ vertex 17.056702866441693 183.02097856533368 -58.200000000000166
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 18.81847096772454 184.0381358528591 -58.200000000000166
+ vertex 17.04448283908824 183.0139233292516 -58.854518677937655
+ vertex 17.056702866441693 183.02097856533368 -58.200000000000166
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 17.403113027955477 183.22097856533367 -58.80000000000016
+ vertex 17.04448283908824 183.0139233292516 -58.854518677937655
+ vertex 18.81847096772454 184.0381358528591 -58.200000000000166
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 19.308368916281175 184.32097856533375 -58.765685424949424
+ vertex 17.403113027955477 183.22097856533367 -58.80000000000016
+ vertex 18.81847096772454 184.0381358528591 -58.200000000000166
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 16.017472381900408 182.42097856533357 -60.40000000000016
+ vertex 15.497857139629751 182.12097856533353 -61.60000000000019
+ vertex 16.06468694197501 182.44823790430235 -59.98588952783613
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 16.064686941975005 182.44823790430232 -60.814110472164195
+ vertex 15.497857139629751 182.12097856533353 -61.60000000000019
+ vertex 16.017472381900408 182.42097856533357 -60.40000000000016
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 16.20311302795551 182.528158242306 -61.20000000000016
+ vertex 15.497857139629751 182.12097856533353 -61.60000000000019
+ vertex 16.064686941975005 182.44823790430232 -60.814110472164195
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 16.423317130842236 182.6552931403843 -61.53137084989863
+ vertex 15.497857139629751 182.12097856533353 -61.60000000000019
+ vertex 16.20311302795551 182.528158242306 -61.20000000000016
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 16.710292704927937 182.82097856533352 -61.78564064605527
+ vertex 15.497857139629751 182.12097856533353 -61.60000000000019
+ vertex 16.423317130842236 182.6552931403843 -61.53137084989863
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 15.527366239676425 182.13801565218895 -61.858819045102706
+ vertex 15.497857139629751 182.12097856533353 -61.60000000000019
+ vertex 16.710292704927937 182.82097856533352 -61.78564064605527
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 17.044482839088296 183.0139233292515 -61.94548132206268
+ vertex 15.527366239676425 182.13801565218895 -61.858819045102706
+ vertex 16.710292704927937 182.82097856533352 -61.78564064605527
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 15.613882543414228 182.1879658634413 -62.10000000000019
+ vertex 15.527366239676425 182.13801565218895 -61.858819045102706
+ vertex 17.044482839088296 183.0139233292515 -61.94548132206268
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 17.40311302795549 183.22097856533355 -62.00000000000018
+ vertex 15.613882543414228 182.1879658634413 -62.10000000000019
+ vertex 17.044482839088296 183.0139233292515 -61.94548132206268
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 19.30836891628122 184.32097856533363 -60.80000000000016
+ vertex 18.603113027955455 183.9137988883612 -59.600000000000186
+ vertex 19.308368916281175 184.32097856533375 -58.765685424949424
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 18.38290892506873 183.78666399028293 -59.26862915010171
+ vertex 19.308368916281175 184.32097856533375 -58.765685424949424
+ vertex 18.603113027955455 183.9137988883612 -59.600000000000186
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 18.095933350983 183.6209785653337 -59.014359353945075
+ vertex 19.308368916281175 184.32097856533375 -58.765685424949424
+ vertex 18.38290892506873 183.78666399028293 -59.26862915010171
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 17.761743216822698 183.42803380141567 -58.854518677937655
+ vertex 19.308368916281175 184.32097856533375 -58.765685424949424
+ vertex 18.095933350983 183.6209785653337 -59.014359353945075
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 17.403113027955477 183.22097856533367 -58.80000000000016
+ vertex 19.308368916281175 184.32097856533375 -58.765685424949424
+ vertex 17.761743216822698 183.42803380141567 -58.854518677937655
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 18.741539113935957 183.99371922636493 -59.98588952783615
+ vertex 18.603113027955455 183.9137988883612 -59.600000000000186
+ vertex 19.30836891628122 184.32097856533363 -60.80000000000016
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 18.788753674010536 184.02097856533365 -60.40000000000018
+ vertex 18.741539113935957 183.99371922636493 -59.98588952783615
+ vertex 19.30836891628122 184.32097856533363 -60.80000000000016
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 18.741539113935957 183.9937192263649 -60.81411047216422
+ vertex 18.788753674010536 184.02097856533365 -60.40000000000018
+ vertex 19.30836891628122 184.32097856533363 -60.80000000000016
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 21.213624804606916 185.4209785653337 -60.80000000000016
+ vertex 18.741539113935957 183.9937192263649 -60.81411047216422
+ vertex 19.30836891628122 184.32097856533363 -60.80000000000016
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 21.213624804606987 185.42097856533363 -62.20000000000018
+ vertex 18.741539113935957 183.9937192263649 -60.81411047216422
+ vertex 21.213624804606916 185.4209785653337 -60.80000000000016
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 18.60311302795548 183.91379888836119 -61.20000000000018
+ vertex 18.741539113935957 183.9937192263649 -60.81411047216422
+ vertex 21.213624804606987 185.42097856533363 -62.20000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 18.382908925068755 183.78666399028285 -61.53137084989868
+ vertex 18.60311302795548 183.91379888836119 -61.20000000000018
+ vertex 21.213624804606987 185.42097856533363 -62.20000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 18.095933350983042 183.6209785653336 -61.78564064605529
+ vertex 18.382908925068755 183.78666399028285 -61.53137084989868
+ vertex 21.213624804606987 185.42097856533363 -62.20000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 17.76174321682269 183.42803380141555 -61.94548132206268
+ vertex 18.095933350983042 183.6209785653336 -61.78564064605529
+ vertex 21.213624804606987 185.42097856533363 -62.20000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 17.40311302795549 183.22097856533355 -62.00000000000018
+ vertex 17.76174321682269 183.42803380141555 -61.94548132206268
+ vertex 21.213624804606987 185.42097856533363 -62.20000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 15.613882543414228 182.1879658634413 -62.10000000000019
+ vertex 17.40311302795549 183.22097856533355 -62.00000000000018
+ vertex 21.213624804606987 185.42097856533363 -62.20000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 20.867214643093217 185.22097856533367 -62.2000000000002
+ vertex 15.613882543414228 182.1879658634413 -62.10000000000019
+ vertex 21.213624804606987 185.42097856533363 -62.20000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 15.751510107718453 182.2674251747402 -62.30710678118674
+ vertex 15.613882543414228 182.1879658634413 -62.10000000000019
+ vertex 20.867214643093217 185.22097856533367 -62.2000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 20.867214643093217 185.22097856533364 -62.6000000000002
+ vertex 15.751510107718453 182.2674251747402 -62.30710678118674
+ vertex 20.867214643093217 185.22097856533367 -62.2000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 15.930869841522005 182.3709785653335 -62.46602540378463
+ vertex 15.751510107718453 182.2674251747402 -62.30710678118674
+ vertex 20.867214643093217 185.22097856533364 -62.6000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 16.139738675372207 182.49156904278223 -62.56592582628924
+ vertex 15.930869841522005 182.3709785653335 -62.46602540378463
+ vertex 20.867214643093217 185.22097856533364 -62.6000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 16.363882543414228 182.62097856533347 -62.60000000000018
+ vertex 16.139738675372207 182.49156904278223 -62.56592582628924
+ vertex 20.867214643093217 185.22097856533364 -62.6000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 31.259519488506022 191.2209785653344 -47.00000000000015
+ vertex 29.49775138722315 190.20382127780897 -47.00000000000017
+ vertex 29.007853438666526 189.92097856533437 -46.43431457505091
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 26.872507222919523 188.6881358528596 -48.900000000000155
+ vertex 29.007853438666526 189.92097856533437 -46.43431457505091
+ vertex 29.49775138722315 190.20382127780897 -47.00000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 27.362405171476134 188.97097856533426 -49.465685424949434
+ vertex 26.872507222919523 188.6881358528596 -48.900000000000155
+ vertex 29.49775138722315 190.20382127780897 -47.00000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 21.443715132028064 185.55382127780868 -48.90000000000018
+ vertex 26.872507222919523 188.6881358528596 -48.900000000000155
+ vertex 27.362405171476134 188.97097856533426 -49.465685424949434
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 20.9538171834714 185.27097856533405 -49.46568542494941
+ vertex 21.443715132028064 185.55382127780868 -48.90000000000018
+ vertex 27.362405171476134 188.97097856533426 -49.465685424949434
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 24.158111177473785 187.12097856533413 -49.90000000000019
+ vertex 20.9538171834714 185.27097856533405 -49.46568542494941
+ vertex 27.362405171476134 188.97097856533426 -49.465685424949434
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 23.552922733760358 186.77157285444568 -49.9920002690197
+ vertex 20.9538171834714 185.27097856533405 -49.46568542494941
+ vertex 24.158111177473785 187.12097856533413 -49.90000000000019
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 22.988976882364845 186.44597856533406 -50.2617314097822
+ vertex 20.9538171834714 185.27097856533405 -49.46568542494941
+ vertex 23.552922733760358 186.77157285444568 -49.9920002690197
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 22.50470560109519 186.1663844107322 -50.69081169079649
+ vertex 20.9538171834714 185.27097856533405 -49.46568542494941
+ vertex 22.988976882364845 186.44597856533406 -50.2617314097822
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 22.133111177473836 185.95184427022505 -51.25000000000016
+ vertex 20.9538171834714 185.27097856533405 -49.46568542494941
+ vertex 22.50470560109519 186.1663844107322 -50.69081169079649
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 21.899517157381815 185.81697869984376 -51.901188578223376
+ vertex 20.9538171834714 185.27097856533405 -49.46568542494941
+ vertex 22.133111177473836 185.95184427022505 -51.25000000000016
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 20.953817183471532 185.27097856533385 -55.73431457505091
+ vertex 20.9538171834714 185.27097856533405 -49.46568542494941
+ vertex 21.899517157381815 185.81697869984376 -51.901188578223376
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 21.819842587255902 185.770978565334 -52.60000000000017
+ vertex 20.953817183471532 185.27097856533385 -55.73431457505091
+ vertex 21.899517157381815 185.81697869984376 -51.901188578223376
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 21.89951715738182 185.8169786998437 -53.298811421776996
+ vertex 20.953817183471532 185.27097856533385 -55.73431457505091
+ vertex 21.819842587255902 185.770978565334 -52.60000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 22.13311117747392 185.95184427022497 -53.95000000000018
+ vertex 20.953817183471532 185.27097856533385 -55.73431457505091
+ vertex 21.89951715738182 185.8169786998437 -53.298811421776996
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 22.504705601095264 186.16638441073212 -54.509188309203864
+ vertex 20.953817183471532 185.27097856533385 -55.73431457505091
+ vertex 22.13311117747392 185.95184427022497 -53.95000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 22.98897688236492 186.44597856533392 -54.93826859021815
+ vertex 20.953817183471532 185.27097856533385 -55.73431457505091
+ vertex 22.504705601095264 186.16638441073212 -54.509188309203864
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 23.552922733760447 186.77157285444557 -55.20799973098066
+ vertex 20.953817183471532 185.27097856533385 -55.73431457505091
+ vertex 22.98897688236492 186.44597856533392 -54.93826859021815
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 24.158111177473895 187.12097856533398 -55.30000000000017
+ vertex 20.953817183471532 185.27097856533385 -55.73431457505091
+ vertex 23.552922733760447 186.77157285444557 -55.20799973098066
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 27.449007711854428 189.02097856533445 -42.600000000000165
+ vertex 31.95233981153348 191.6209785653346 -42.60000000000016
+ vertex 27.44900771185445 189.02097856533442 -43.00000000000016
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.17648367957548 191.75038808788585 -42.6340741737111
+ vertex 27.44900771185445 189.02097856533442 -43.00000000000016
+ vertex 31.95233981153348 191.6209785653346 -42.60000000000016
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.385352513425666 191.8709785653346 -42.733974596215724
+ vertex 27.44900771185445 189.02097856533442 -43.00000000000016
+ vertex 32.17648367957548 191.75038808788585 -42.6340741737111
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.56471224722925 191.97453195592786 -42.892893218813605
+ vertex 27.44900771185445 189.02097856533442 -43.00000000000016
+ vertex 32.385352513425666 191.8709785653346 -42.733974596215724
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.70233981153347 192.0539912672268 -43.10000000000016
+ vertex 27.44900771185445 189.02097856533442 -43.00000000000016
+ vertex 32.56471224722925 191.97453195592786 -42.892893218813605
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 15.613882543413824 182.1879658634419 -43.10000000000017
+ vertex 17.40311302795516 183.22097856533415 -43.20000000000017
+ vertex 15.527366239676041 182.13801565218952 -43.34118095489766
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 17.044482839087948 183.01392332925212 -43.25451867793765
+ vertex 15.527366239676041 182.13801565218952 -43.34118095489766
+ vertex 17.40311302795516 183.22097856533415 -43.20000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 16.710292704927603 182.82097856533412 -43.414359353945066
+ vertex 15.527366239676041 182.13801565218952 -43.34118095489766
+ vertex 17.044482839087948 183.01392332925212 -43.25451867793765
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 15.497857139629415 182.1209785653341 -43.60000000000017
+ vertex 15.527366239676041 182.13801565218952 -43.34118095489766
+ vertex 16.710292704927603 182.82097856533412 -43.414359353945066
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 16.42331713084192 182.65529314038483 -43.66862915010168
+ vertex 15.497857139629415 182.1209785653341 -43.60000000000017
+ vertex 16.710292704927603 182.82097856533412 -43.414359353945066
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 16.203113027955183 182.52815824230652 -44.00000000000015
+ vertex 15.497857139629415 182.1209785653341 -43.60000000000017
+ vertex 16.42331713084192 182.65529314038483 -43.66862915010168
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 16.064686941974696 182.44823790430283 -44.38588952783612
+ vertex 15.497857139629415 182.1209785653341 -43.60000000000017
+ vertex 16.203113027955183 182.52815824230652 -44.00000000000015
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 15.497857139629511 182.12097856533393 -48.80000000000017
+ vertex 15.497857139629415 182.1209785653341 -43.60000000000017
+ vertex 16.064686941974696 182.44823790430283 -44.38588952783612
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 16.017472381900088 182.42097856533402 -44.800000000000146
+ vertex 15.497857139629511 182.12097856533393 -48.80000000000017
+ vertex 16.064686941974696 182.44823790430283 -44.38588952783612
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 16.064686941974692 182.4482379043028 -45.21411047216418
+ vertex 15.497857139629511 182.12097856533393 -48.80000000000017
+ vertex 16.017472381900088 182.42097856533402 -44.800000000000146
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 16.203113027955208 182.5281582423065 -45.60000000000017
+ vertex 15.497857139629511 182.12097856533393 -48.80000000000017
+ vertex 16.064686941974692 182.4482379043028 -45.21411047216418
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 16.423317130841962 182.65529314038477 -45.93137084989864
+ vertex 15.497857139629511 182.12097856533393 -48.80000000000017
+ vertex 16.203113027955208 182.5281582423065 -45.60000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 16.71029270492767 182.820978565334 -46.185640646055276
+ vertex 15.497857139629511 182.12097856533393 -48.80000000000017
+ vertex 16.423317130841962 182.65529314038477 -45.93137084989864
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 17.044482839087998 183.013923329252 -46.345481322062675
+ vertex 15.497857139629511 182.12097856533393 -48.80000000000017
+ vertex 16.71029270492767 182.820978565334 -46.185640646055276
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 17.40311302795521 183.220978565334 -46.40000000000017
+ vertex 15.497857139629511 182.12097856533393 -48.80000000000017
+ vertex 17.044482839087998 183.013923329252 -46.345481322062675
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 17.056702866441448 183.02097856533402 -47.00000000000017
+ vertex 15.497857139629511 182.12097856533393 -48.80000000000017
+ vertex 17.40311302795521 183.220978565334 -46.40000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 19.308368916280948 184.32097856533406 -46.43431457505094
+ vertex 17.056702866441448 183.02097856533402 -47.00000000000017
+ vertex 17.40311302795521 183.220978565334 -46.40000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 15.844267301143299 182.32097856533392 -48.80000000000017
+ vertex 15.497857139629511 182.12097856533393 -48.80000000000017
+ vertex 17.056702866441448 183.02097856533402 -47.00000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 17.056702866441515 183.02097856533393 -49.200000000000166
+ vertex 15.844267301143299 182.32097856533392 -48.80000000000017
+ vertex 17.056702866441448 183.02097856533402 -47.00000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 15.844267301143299 182.32097856533392 -49.200000000000166
+ vertex 15.844267301143299 182.32097856533392 -48.80000000000017
+ vertex 17.056702866441515 183.02097856533393 -49.200000000000166
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 27.36240517147627 188.97097856533406 -55.73431457505093
+ vertex 26.41670519756588 188.42497843082435 -51.901188578223376
+ vertex 27.362405171476134 188.97097856533426 -49.465685424949434
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 26.183111177473783 188.29011286044317 -51.25000000000016
+ vertex 27.362405171476134 188.97097856533426 -49.465685424949434
+ vertex 26.41670519756588 188.42497843082435 -51.901188578223376
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 25.81151675385244 188.075572719936 -50.69081169079648
+ vertex 27.362405171476134 188.97097856533426 -49.465685424949434
+ vertex 26.183111177473783 188.29011286044317 -51.25000000000016
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 25.327245472582785 187.79597856533414 -50.2617314097822
+ vertex 27.362405171476134 188.97097856533426 -49.465685424949434
+ vertex 25.81151675385244 188.075572719936 -50.69081169079648
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 24.763299621187205 187.47038427622255 -49.99200026901969
+ vertex 27.362405171476134 188.97097856533426 -49.465685424949434
+ vertex 25.327245472582785 187.79597856533414 -50.2617314097822
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 24.158111177473785 187.12097856533413 -49.90000000000019
+ vertex 27.362405171476134 188.97097856533426 -49.465685424949434
+ vertex 24.763299621187205 187.47038427622255 -49.99200026901969
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 26.496379767691785 188.47097856533412 -52.60000000000017
+ vertex 26.41670519756588 188.42497843082435 -51.901188578223376
+ vertex 27.36240517147627 188.97097856533406 -55.73431457505093
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 26.416705197565914 188.4249784308243 -53.29881142177697
+ vertex 26.496379767691785 188.47097856533412 -52.60000000000017
+ vertex 27.36240517147627 188.97097856533406 -55.73431457505093
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 26.18311117747383 188.29011286044306 -53.95000000000018
+ vertex 26.416705197565914 188.4249784308243 -53.29881142177697
+ vertex 27.36240517147627 188.97097856533406 -55.73431457505093
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 25.8115167538525 188.07557271993588 -54.509188309203864
+ vertex 26.18311117747383 188.29011286044306 -53.95000000000018
+ vertex 27.36240517147627 188.97097856533406 -55.73431457505093
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 25.327245472582867 187.79597856533397 -54.93826859021815
+ vertex 25.8115167538525 188.07557271993588 -54.509188309203864
+ vertex 27.36240517147627 188.97097856533406 -55.73431457505093
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 24.76329962118731 187.4703842762224 -55.20799973098066
+ vertex 25.327245472582867 187.79597856533397 -54.93826859021815
+ vertex 27.36240517147627 188.97097856533406 -55.73431457505093
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 24.158111177473895 187.12097856533398 -55.30000000000017
+ vertex 24.76329962118731 187.4703842762224 -55.20799973098066
+ vertex 27.36240517147627 188.97097856533406 -55.73431457505093
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 20.953817183471532 185.27097856533385 -55.73431457505091
+ vertex 24.158111177473895 187.12097856533398 -55.30000000000017
+ vertex 27.36240517147627 188.97097856533406 -55.73431457505093
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 21.44371513202817 185.55382127780845 -56.30000000000017
+ vertex 20.953817183471532 185.27097856533385 -55.73431457505091
+ vertex 27.36240517147627 188.97097856533406 -55.73431457505093
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 18.81847096772454 184.0381358528591 -58.200000000000166
+ vertex 20.953817183471532 185.27097856533385 -55.73431457505091
+ vertex 21.44371513202817 185.55382127780845 -56.30000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 19.308368916281175 184.32097856533375 -58.765685424949424
+ vertex 18.81847096772454 184.0381358528591 -58.200000000000166
+ vertex 21.44371513202817 185.55382127780845 -56.30000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 17.056702866441622 183.0209785653337 -56.00000000000017
+ vertex 17.056702866441693 183.02097856533368 -58.200000000000166
+ vertex 15.844267301143415 182.3209785653337 -56.0000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 15.844267301143415 182.3209785653337 -56.400000000000205
+ vertex 15.844267301143415 182.3209785653337 -56.0000000000002
+ vertex 17.056702866441693 183.02097856533368 -58.200000000000166
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 29.497751387223385 190.20382127780866 -58.20000000000017
+ vertex 26.87250722291962 188.68813585285935 -56.30000000000017
+ vertex 27.36240517147627 188.97097856533406 -55.73431457505093
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 21.44371513202817 185.55382127780845 -56.30000000000017
+ vertex 27.36240517147627 188.97097856533406 -55.73431457505093
+ vertex 26.87250722291962 188.68813585285935 -56.30000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 29.007853438666725 189.92097856533397 -58.76568542494941
+ vertex 26.87250722291962 188.68813585285935 -56.30000000000017
+ vertex 29.497751387223385 190.20382127780866 -58.20000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 31.259519488506204 191.2209785653341 -58.200000000000195
+ vertex 29.007853438666725 189.92097856533397 -58.76568542494941
+ vertex 29.497751387223385 190.20382127780866 -58.20000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 27.102597550341027 188.82097856533392 -60.80000000000018
+ vertex 29.007853438666764 189.92097856533394 -60.80000000000017
+ vertex 27.102597550341095 188.82097856533386 -62.20000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 29.574683241012032 190.2482379043027 -60.8141104721642
+ vertex 27.102597550341095 188.82097856533386 -62.20000000000018
+ vertex 29.007853438666764 189.92097856533394 -60.80000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 29.7131093269925 190.3281582423064 -61.20000000000017
+ vertex 27.102597550341095 188.82097856533386 -62.20000000000018
+ vertex 29.574683241012032 190.2482379043027 -60.8141104721642
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 29.933313429879256 190.4552931403847 -61.53137084989864
+ vertex 27.102597550341095 188.82097856533386 -62.20000000000018
+ vertex 29.7131093269925 190.3281582423064 -61.20000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 30.220289003964965 190.62097856533393 -61.78564064605528
+ vertex 27.102597550341095 188.82097856533386 -62.20000000000018
+ vertex 29.933313429879256 190.4552931403847 -61.53137084989864
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 30.554479138125302 190.8139233292519 -61.945481322062676
+ vertex 27.102597550341095 188.82097856533386 -62.20000000000018
+ vertex 30.220289003964965 190.62097856533393 -61.78564064605528
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 30.913109326992505 191.02097856533396 -62.00000000000017
+ vertex 27.102597550341095 188.82097856533386 -62.20000000000018
+ vertex 30.554479138125302 190.8139233292519 -61.945481322062676
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.70233981153382 192.05399126722622 -62.10000000000018
+ vertex 27.102597550341095 188.82097856533386 -62.20000000000018
+ vertex 30.913109326992505 191.02097856533396 -62.00000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 27.449007711854858 189.02097856533385 -62.20000000000018
+ vertex 27.102597550341095 188.82097856533386 -62.20000000000018
+ vertex 32.70233981153382 192.05399126722622 -62.10000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.564712247229615 191.9745319559273 -62.30710678118673
+ vertex 27.449007711854858 189.02097856533385 -62.20000000000018
+ vertex 32.70233981153382 192.05399126722622 -62.10000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 27.449007711854897 189.02097856533385 -62.60000000000018
+ vertex 27.449007711854858 189.02097856533385 -62.20000000000018
+ vertex 32.564712247229615 191.9745319559273 -62.30710678118673
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.38535251342604 191.870978565334 -62.46602540378461
+ vertex 27.449007711854897 189.02097856533385 -62.60000000000018
+ vertex 32.564712247229615 191.9745319559273 -62.30710678118673
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.17648367957585 191.75038808788526 -62.56592582628924
+ vertex 27.449007711854897 189.02097856533385 -62.60000000000018
+ vertex 32.38535251342604 191.870978565334 -62.46602540378461
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 31.952339811533854 191.62097856533398 -62.60000000000018
+ vertex 27.449007711854897 189.02097856533385 -62.60000000000018
+ vertex 32.17648367957585 191.75038808788526 -62.56592582628924
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.471955053804386 191.92097856533422 -56.00000000000017
+ vertex 32.47195505380439 191.9209785653342 -56.40000000000017
+ vertex 31.259519488506168 191.22097856533415 -56.0000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 31.259519488506204 191.2209785653341 -58.200000000000195
+ vertex 31.259519488506168 191.22097856533415 -56.0000000000002
+ vertex 32.47195505380439 191.9209785653342 -56.40000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.81836521531815 192.1209785653342 -56.40000000000017
+ vertex 31.259519488506204 191.2209785653341 -58.200000000000195
+ vertex 32.47195505380439 191.9209785653342 -56.40000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.11310932699248 191.71379888836162 -59.600000000000186
+ vertex 31.259519488506204 191.2209785653341 -58.200000000000195
+ vertex 32.81836521531815 192.1209785653342 -56.40000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.25153541297297 191.7937192263653 -59.98588952783617
+ vertex 32.11310932699248 191.71379888836162 -59.600000000000186
+ vertex 32.81836521531815 192.1209785653342 -56.40000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.818365215318266 192.12097856533407 -61.60000000000018
+ vertex 32.25153541297297 191.7937192263653 -59.98588952783617
+ vertex 32.81836521531815 192.1209785653342 -56.40000000000017
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 31.89290522410574 191.5866639902833 -59.26862915010171
+ vertex 31.259519488506204 191.2209785653341 -58.200000000000195
+ vertex 32.11310932699248 191.71379888836162 -59.600000000000186
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 31.60592965002002 191.42097856533408 -59.014359353945075
+ vertex 31.259519488506204 191.2209785653341 -58.200000000000195
+ vertex 31.89290522410574 191.5866639902833 -59.26862915010171
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 31.27173951585969 191.2280338014161 -58.85451867793769
+ vertex 31.259519488506204 191.2209785653341 -58.200000000000195
+ vertex 31.60592965002002 191.42097856533408 -59.014359353945075
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 30.913109326992483 191.02097856533405 -58.800000000000175
+ vertex 31.259519488506204 191.2209785653341 -58.200000000000195
+ vertex 31.27173951585969 191.2280338014161 -58.85451867793769
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 29.007853438666725 189.92097856533397 -58.76568542494941
+ vertex 31.259519488506204 191.2209785653341 -58.200000000000195
+ vertex 30.913109326992483 191.02097856533405 -58.800000000000175
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.29874997304759 191.82097856533406 -60.400000000000205
+ vertex 32.25153541297297 191.7937192263653 -59.98588952783617
+ vertex 32.818365215318266 192.12097856533407 -61.60000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.25153541297298 191.7937192263653 -60.81411047216424
+ vertex 32.29874997304759 191.82097856533406 -60.400000000000205
+ vertex 32.818365215318266 192.12097856533407 -61.60000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.113109326992486 191.71379888836157 -61.2000000000002
+ vertex 32.25153541297298 191.7937192263653 -60.81411047216424
+ vertex 32.818365215318266 192.12097856533407 -61.60000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 31.89290522410577 191.58666399028323 -61.53137084989868
+ vertex 32.113109326992486 191.71379888836157 -61.2000000000002
+ vertex 32.818365215318266 192.12097856533407 -61.60000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 31.60592965002006 191.42097856533397 -61.78564064605529
+ vertex 31.89290522410577 191.58666399028323 -61.53137084989868
+ vertex 32.818365215318266 192.12097856533407 -61.60000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.78885611527162 192.1039414784786 -61.85881904510269
+ vertex 31.60592965002006 191.42097856533397 -61.78564064605529
+ vertex 32.818365215318266 192.12097856533407 -61.60000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 31.271739515859746 191.22803380141596 -61.94548132206272
+ vertex 31.60592965002006 191.42097856533397 -61.78564064605529
+ vertex 32.78885611527162 192.1039414784786 -61.85881904510269
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.70233981153382 192.05399126722622 -62.10000000000018
+ vertex 31.271739515859746 191.22803380141596 -61.94548132206272
+ vertex 32.78885611527162 192.1039414784786 -61.85881904510269
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 30.913109326992505 191.02097856533396 -62.00000000000017
+ vertex 31.271739515859746 191.22803380141596 -61.94548132206272
+ vertex 32.70233981153382 192.05399126722622 -62.10000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 30.913109326992483 191.02097856533405 -58.800000000000175
+ vertex 30.554479138125252 190.81392332925202 -58.85451867793765
+ vertex 29.007853438666725 189.92097856533397 -58.76568542494941
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 30.22028900396494 190.62097856533407 -59.01435935394506
+ vertex 29.007853438666725 189.92097856533397 -58.76568542494941
+ vertex 30.554479138125252 190.81392332925202 -58.85451867793765
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 29.93331342987922 190.45529314038478 -59.26862915010168
+ vertex 29.007853438666725 189.92097856533397 -58.76568542494941
+ vertex 30.22028900396494 190.62097856533407 -59.01435935394506
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 29.713109326992512 190.32815824230644 -59.60000000000015
+ vertex 29.007853438666725 189.92097856533397 -58.76568542494941
+ vertex 29.93331342987922 190.45529314038478 -59.26862915010168
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 29.007853438666764 189.92097856533394 -60.80000000000017
+ vertex 29.007853438666725 189.92097856533397 -58.76568542494941
+ vertex 29.713109326992512 190.32815824230644 -59.60000000000015
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 29.574683241012004 190.2482379043027 -59.985889527836115
+ vertex 29.007853438666764 189.92097856533394 -60.80000000000017
+ vertex 29.713109326992512 190.32815824230644 -59.60000000000015
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 29.527468680937393 190.22097856533398 -60.40000000000015
+ vertex 29.007853438666764 189.92097856533394 -60.80000000000017
+ vertex 29.574683241012004 190.2482379043027 -59.985889527836115
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 29.574683241012032 190.2482379043027 -60.8141104721642
+ vertex 29.007853438666764 189.92097856533394 -60.80000000000017
+ vertex 29.527468680937393 190.22097856533398 -60.40000000000015
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 21.443715132028064 185.55382127780868 -48.90000000000018
+ vertex 18.818470967724306 184.03813585285943 -47.00000000000018
+ vertex 19.308368916280948 184.32097856533406 -46.43431457505094
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 17.056702866441448 183.02097856533402 -47.00000000000017
+ vertex 19.308368916280948 184.32097856533406 -46.43431457505094
+ vertex 18.818470967724306 184.03813585285943 -47.00000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 20.9538171834714 185.27097856533405 -49.46568542494941
+ vertex 18.818470967724306 184.03813585285943 -47.00000000000018
+ vertex 21.443715132028064 185.55382127780868 -48.90000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 31.259519488506022 191.2209785653344 -47.00000000000015
+ vertex 32.47195505380424 191.9209785653344 -48.800000000000125
+ vertex 31.25951948850606 191.22097856533435 -49.200000000000145
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.47195505380423 191.9209785653344 -49.200000000000124
+ vertex 31.25951948850606 191.22097856533435 -49.200000000000145
+ vertex 32.47195505380424 191.9209785653344 -48.800000000000125
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.70233981153347 192.0539912672268 -43.10000000000016
+ vertex 32.78885611527129 192.1039414784791 -43.341180954897645
+ vertex 30.913109326992203 191.02097856533456 -43.20000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 31.271739515859426 191.22803380141656 -43.254518677937675
+ vertex 30.913109326992203 191.02097856533456 -43.20000000000018
+ vertex 32.78885611527129 192.1039414784791 -43.341180954897645
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 31.60592965001975 191.4209785653346 -43.414359353945095
+ vertex 31.271739515859426 191.22803380141656 -43.254518677937675
+ vertex 32.78885611527129 192.1039414784791 -43.341180954897645
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.818365215317925 192.12097856533458 -43.60000000000016
+ vertex 31.60592965001975 191.4209785653346 -43.414359353945095
+ vertex 32.78885611527129 192.1039414784791 -43.341180954897645
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 31.89290522410545 191.58666399028382 -43.66862915010171
+ vertex 31.60592965001975 191.4209785653346 -43.414359353945095
+ vertex 32.818365215317925 192.12097856533458 -43.60000000000016
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.11310932699219 191.7137988883621 -44.0000000000002
+ vertex 31.89290522410545 191.58666399028382 -43.66862915010171
+ vertex 32.818365215317925 192.12097856533458 -43.60000000000016
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.25153541297268 191.79371922636582 -44.38588952783617
+ vertex 32.11310932699219 191.7137988883621 -44.0000000000002
+ vertex 32.818365215317925 192.12097856533458 -43.60000000000016
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.818365215317996 192.12097856533438 -48.800000000000125
+ vertex 32.25153541297268 191.79371922636582 -44.38588952783617
+ vertex 32.818365215317925 192.12097856533458 -43.60000000000016
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.298749973047286 191.82097856533454 -44.8000000000002
+ vertex 32.25153541297268 191.79371922636582 -44.38588952783617
+ vertex 32.818365215317996 192.12097856533438 -48.800000000000125
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.251535412972686 191.79371922636577 -45.21411047216423
+ vertex 32.298749973047286 191.82097856533454 -44.8000000000002
+ vertex 32.818365215317996 192.12097856533438 -48.800000000000125
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.113109326992195 191.71379888836208 -45.6000000000002
+ vertex 32.251535412972686 191.79371922636577 -45.21411047216423
+ vertex 32.818365215317996 192.12097856533438 -48.800000000000125
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 31.89290522410548 191.5866639902837 -45.93137084989867
+ vertex 32.113109326992195 191.71379888836208 -45.6000000000002
+ vertex 32.818365215317996 192.12097856533438 -48.800000000000125
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 31.60592965001976 191.42097856533448 -46.185640646055305
+ vertex 31.89290522410548 191.5866639902837 -45.93137084989867
+ vertex 32.818365215317996 192.12097856533438 -48.800000000000125
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 31.27173951585947 191.22803380141644 -46.3454813220627
+ vertex 31.60592965001976 191.42097856533448 -46.185640646055305
+ vertex 32.818365215317996 192.12097856533438 -48.800000000000125
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 30.913109326992235 191.0209785653344 -46.4000000000002
+ vertex 31.27173951585947 191.22803380141644 -46.3454813220627
+ vertex 32.818365215317996 192.12097856533438 -48.800000000000125
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 31.259519488506022 191.2209785653344 -47.00000000000015
+ vertex 30.913109326992235 191.0209785653344 -46.4000000000002
+ vertex 32.818365215317996 192.12097856533438 -48.800000000000125
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 29.007853438666526 189.92097856533437 -46.43431457505091
+ vertex 30.913109326992235 191.0209785653344 -46.4000000000002
+ vertex 31.259519488506022 191.2209785653344 -47.00000000000015
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.97504977010331e-16
+ outer loop
+ vertex 32.47195505380424 191.9209785653344 -48.800000000000125
+ vertex 31.259519488506022 191.2209785653344 -47.00000000000015
+ vertex 32.818365215317996 192.12097856533438 -48.800000000000125
+ endloop
+endfacet
+facet normal -1.877717253503254e-14 3.0643012873322636e-14 1.0
+ outer loop
+ vertex 31.95233981153348 191.6209785653346 -42.60000000000016
+ vertex 27.449007711854428 189.02097856533445 -42.600000000000165
+ vertex 181.95233981153302 -68.18664256999588 -42.600000000000065
+ endloop
+endfacet
+facet normal -1.877717253503254e-14 3.0643012873322636e-14 1.0
+ outer loop
+ vertex 177.44900771185397 -70.7866425699961 -42.60000000000007
+ vertex 181.95233981153302 -68.18664256999588 -42.600000000000065
+ vertex 27.449007711854428 189.02097856533445 -42.600000000000165
+ endloop
+endfacet
+facet normal 0.11303899832181245 0.06526309611007218 0.9914448613738078
+ outer loop
+ vertex 32.17648367957548 191.75038808788585 -42.6340741737111
+ vertex 31.95233981153348 191.6209785653346 -42.60000000000016
+ vertex 182.17648367957503 -68.05723304744467 -42.63407417371101
+ endloop
+endfacet
+facet normal 0.11303899832181245 0.06526309611007218 0.9914448613738078
+ outer loop
+ vertex 181.95233981153302 -68.18664256999588 -42.600000000000065
+ vertex 182.17648367957503 -68.05723304744467 -42.63407417371101
+ vertex 31.95233981153348 191.6209785653346 -42.60000000000016
+ endloop
+endfacet
+facet normal -2.1893850906944248e-14 2.8843597776321774e-14 1.0
+ outer loop
+ vertex 26.872507222919523 188.6881358528596 -48.900000000000155
+ vertex 21.443715132028064 185.55382127780868 -48.90000000000018
+ vertex 176.872507222919 -71.11948528247086 -48.90000000000006
+ endloop
+endfacet
+facet normal -2.1893850906944248e-14 2.8843597776321774e-14 1.0
+ outer loop
+ vertex 171.44371513202756 -74.25379985752176 -48.900000000000105
+ vertex 176.872507222919 -71.11948528247086 -48.90000000000006
+ vertex 21.443715132028064 185.55382127780868 -48.90000000000018
+ endloop
+endfacet
+facet normal 0.3314135740355569 0.19134171618258844 0.9238795325112902
+ outer loop
+ vertex 32.385352513425666 191.8709785653346 -42.733974596215724
+ vertex 32.17648367957548 191.75038808788585 -42.6340741737111
+ vertex 182.38535251342523 -67.93664256999594 -42.73397459621563
+ endloop
+endfacet
+facet normal 0.3314135740355569 0.19134171618258844 0.9238795325112902
+ outer loop
+ vertex 182.17648367957503 -68.05723304744467 -42.63407417371101
+ vertex 182.38535251342523 -67.93664256999594 -42.73397459621563
+ vertex 32.17648367957548 191.75038808788585 -42.6340741737111
+ endloop
+endfacet
+facet normal 0.5272028623656284 0.30438071450439697 0.7933533402912485
+ outer loop
+ vertex 32.56471224722925 191.97453195592786 -42.892893218813605
+ vertex 32.385352513425666 191.8709785653346 -42.733974596215724
+ vertex 182.5647122472288 -67.83308917940268 -42.89289321881352
+ endloop
+endfacet
+facet normal 0.5272028623656284 0.30438071450439697 0.7933533402912485
+ outer loop
+ vertex 182.38535251342523 -67.93664256999594 -42.73397459621563
+ vertex 182.5647122472288 -67.83308917940268 -42.89289321881352
+ vertex 32.385352513425666 191.8709785653346 -42.733974596215724
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -7.797766215937039e-16
+ outer loop
+ vertex 31.259519488506022 191.2209785653344 -47.00000000000015
+ vertex 31.25951948850606 191.22097856533435 -49.200000000000145
+ vertex 181.25951948850556 -68.58664256999612 -47.00000000000007
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -7.797766215937039e-16
+ outer loop
+ vertex 181.2595194885056 -68.58664256999616 -49.20000000000007
+ vertex 181.25951948850556 -68.58664256999612 -47.00000000000007
+ vertex 31.25951948850606 191.22097856533435 -49.200000000000145
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -6.227439144697608e-15
+ outer loop
+ vertex 27.449007711854428 189.02097856533445 -42.600000000000165
+ vertex 27.44900771185445 189.02097856533442 -43.00000000000016
+ vertex 177.44900771185397 -70.7866425699961 -42.60000000000007
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -6.227439144697608e-15
+ outer loop
+ vertex 177.4490077118539 -70.78664256999606 -43.00000000000007
+ vertex 177.44900771185397 -70.7866425699961 -42.60000000000007
+ vertex 27.44900771185445 189.02097856533442 -43.00000000000016
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -9.400019899202893e-16
+ outer loop
+ vertex 29.007853438666466 189.92097856533445 -44.40000000000017
+ vertex 29.007853438666526 189.92097856533437 -46.43431457505091
+ vertex 179.007853438666 -69.88664256999604 -44.40000000000007
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -9.400019899202893e-16
+ outer loop
+ vertex 179.00785343866605 -69.88664256999613 -46.434314575050806
+ vertex 179.007853438666 -69.88664256999604 -44.40000000000007
+ vertex 29.007853438666526 189.92097856533437 -46.43431457505091
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 9.400019899202893e-16
+ outer loop
+ vertex 19.308368916280923 184.32097856533417 -44.40000000000018
+ vertex 169.30836891628041 -75.48664256999639 -44.40000000000009
+ vertex 19.308368916280948 184.32097856533406 -46.43431457505094
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 9.400019899202893e-16
+ outer loop
+ vertex 169.30836891628044 -75.48664256999643 -46.434314575050855
+ vertex 19.308368916280948 184.32097856533406 -46.43431457505094
+ vertex 169.30836891628041 -75.48664256999639 -44.40000000000009
+ endloop
+endfacet
+facet normal 1.877717253503254e-14 -3.0643012873322636e-14 -1.0
+ outer loop
+ vertex 31.259519488506022 191.2209785653344 -47.00000000000015
+ vertex 181.25951948850556 -68.58664256999612 -47.00000000000007
+ vertex 29.49775138722315 190.20382127780897 -47.00000000000017
+ endloop
+endfacet
+facet normal 1.877717253503254e-14 -3.0643012873322636e-14 -1.0
+ outer loop
+ vertex 179.49775138722265 -69.60379985752151 -47.00000000000008
+ vertex 29.49775138722315 190.20382127780897 -47.00000000000017
+ vertex 181.25951948850556 -68.58664256999612 -47.00000000000007
+ endloop
+endfacet
+facet normal 1.877717253503254e-14 -3.0643012873322636e-14 -1.0
+ outer loop
+ vertex 29.007853438666466 189.92097856533445 -44.40000000000017
+ vertex 179.007853438666 -69.88664256999604 -44.40000000000007
+ vertex 27.10259755034073 188.8209785653344 -44.40000000000016
+ endloop
+endfacet
+facet normal 1.877717253503254e-14 -3.0643012873322636e-14 -1.0
+ outer loop
+ vertex 177.10259755034025 -70.9866425699961 -44.40000000000007
+ vertex 27.10259755034073 188.8209785653344 -44.40000000000016
+ vertex 179.007853438666 -69.88664256999604 -44.40000000000007
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 9.400019899202893e-16
+ outer loop
+ vertex 20.867214643092836 185.22097856533426 -42.60000000000017
+ vertex 170.8672146430924 -74.58664256999629 -42.600000000000094
+ vertex 20.867214643092836 185.22097856533424 -43.00000000000017
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 9.400019899202893e-16
+ outer loop
+ vertex 170.86721464309235 -74.58664256999629 -43.00000000000009
+ vertex 20.867214643092836 185.22097856533424 -43.00000000000017
+ vertex 170.8672146430924 -74.58664256999629 -42.600000000000094
+ endloop
+endfacet
+facet normal 0.8001031451912461 0.46193976625568617 0.38268343236507835
+ outer loop
+ vertex 32.70233981153347 192.0539912672268 -43.10000000000016
+ vertex 182.702339811533 -67.75362986810374 -43.100000000000065
+ vertex 32.78885611527129 192.1039414784791 -43.341180954897645
+ endloop
+endfacet
+facet normal 0.8001031451912461 0.46193976625568617 0.38268343236507835
+ outer loop
+ vertex 182.78885611527082 -67.70367965685142 -43.34118095489755
+ vertex 32.78885611527129 192.1039414784791 -43.341180954897645
+ vertex 182.702339811533 -67.75362986810374 -43.100000000000065
+ endloop
+endfacet
+facet normal 0.6123724356957971 0.35355339059327673 -0.7071067811865439
+ outer loop
+ vertex 27.362405171476134 188.97097856533426 -49.465685424949434
+ vertex 29.49775138722315 190.20382127780897 -47.00000000000017
+ vertex 177.36240517147567 -70.83664256999627 -49.46568542494934
+ endloop
+endfacet
+facet normal 0.6123724356957971 0.35355339059327673 -0.7071067811865439
+ outer loop
+ vertex 179.49775138722265 -69.60379985752151 -47.00000000000008
+ vertex 177.36240517147567 -70.83664256999627 -49.46568542494934
+ vertex 29.49775138722315 190.20382127780897 -47.00000000000017
+ endloop
+endfacet
+facet normal -0.6123724356957944 -0.3535533905932752 0.707106781186547
+ outer loop
+ vertex 29.007853438666526 189.92097856533437 -46.43431457505091
+ vertex 26.872507222919523 188.6881358528596 -48.900000000000155
+ vertex 179.00785343866605 -69.88664256999613 -46.434314575050806
+ endloop
+endfacet
+facet normal -0.6123724356957944 -0.3535533905932752 0.707106781186547
+ outer loop
+ vertex 176.872507222919 -71.11948528247086 -48.90000000000006
+ vertex 179.00785343866605 -69.88664256999613 -46.434314575050806
+ vertex 26.872507222919523 188.6881358528596 -48.900000000000155
+ endloop
+endfacet
+facet normal 1.877717253503254e-14 -3.0643012873322636e-14 -1.0
+ outer loop
+ vertex 32.818365215317996 192.12097856533438 -48.800000000000125
+ vertex 182.81836521531753 -67.68664256999614 -48.80000000000003
+ vertex 32.47195505380424 191.9209785653344 -48.800000000000125
+ endloop
+endfacet
+facet normal 1.877717253503254e-14 -3.0643012873322636e-14 -1.0
+ outer loop
+ vertex 182.47195505380378 -67.88664256999614 -48.80000000000003
+ vertex 32.47195505380424 191.9209785653344 -48.800000000000125
+ vertex 182.81836521531753 -67.68664256999614 -48.80000000000003
+ endloop
+endfacet
+facet normal -1.877717253503254e-14 3.0643012873322636e-14 1.0
+ outer loop
+ vertex 21.213624804606596 185.42097856533425 -43.00000000000017
+ vertex 20.867214643092836 185.22097856533424 -43.00000000000017
+ vertex 171.21362480460613 -74.38664256999628 -43.00000000000008
+ endloop
+endfacet
+facet normal -1.877717253503254e-14 3.0643012873322636e-14 1.0
+ outer loop
+ vertex 170.86721464309235 -74.58664256999629 -43.00000000000009
+ vertex 171.21362480460613 -74.38664256999628 -43.00000000000008
+ vertex 20.867214643092836 185.22097856533424 -43.00000000000017
+ endloop
+endfacet
+facet normal 3.2732387459073106e-14 -2.2585965780327793e-14 -1.0
+ outer loop
+ vertex 32.47195505380423 191.9209785653344 -49.200000000000124
+ vertex 182.47195505380375 -67.88664256999614 -49.20000000000003
+ vertex 31.25951948850606 191.22097856533435 -49.200000000000145
+ endloop
+endfacet
+facet normal 3.2732387459073106e-14 -2.2585965780327793e-14 -1.0
+ outer loop
+ vertex 181.2595194885056 -68.58664256999616 -49.20000000000007
+ vertex 31.25951948850606 191.22097856533435 -49.200000000000145
+ vertex 182.47195505380375 -67.88664256999614 -49.20000000000003
+ endloop
+endfacet
+facet normal 0.6123724356957696 0.3535533905933116 0.7071067811865503
+ outer loop
+ vertex 21.443715132028064 185.55382127780868 -48.90000000000018
+ vertex 19.308368916280948 184.32097856533406 -46.43431457505094
+ vertex 171.44371513202756 -74.25379985752176 -48.900000000000105
+ endloop
+endfacet
+facet normal 0.6123724356957696 0.3535533905933116 0.7071067811865503
+ outer loop
+ vertex 169.30836891628044 -75.48664256999643 -46.434314575050855
+ vertex 171.44371513202756 -74.25379985752176 -48.900000000000105
+ vertex 19.308368916280948 184.32097856533406 -46.43431457505094
+ endloop
+endfacet
+facet normal -0.11303899832185084 -0.06526309611000983 0.9914448613738074
+ outer loop
+ vertex 16.363882543413876 182.62097856533416 -42.60000000000018
+ vertex 16.13973867537185 182.49156904278288 -42.63407417371111
+ vertex 166.36388254341335 -77.18664256999637 -42.60000000000009
+ endloop
+endfacet
+facet normal -0.11303899832185084 -0.06526309611000983 0.9914448613738074
+ outer loop
+ vertex 166.13973867537135 -77.31605209254768 -42.63407417371102
+ vertex 166.36388254341335 -77.18664256999637 -42.60000000000009
+ vertex 16.13973867537185 182.49156904278288 -42.63407417371111
+ endloop
+endfacet
+facet normal -0.331413574035596 -0.19134171618252374 0.9238795325112896
+ outer loop
+ vertex 16.13973867537185 182.49156904278288 -42.63407417371111
+ vertex 15.930869841521629 182.3709785653341 -42.73397459621574
+ vertex 166.13973867537135 -77.31605209254768 -42.63407417371102
+ endloop
+endfacet
+facet normal -0.331413574035596 -0.19134171618252374 0.9238795325112896
+ outer loop
+ vertex 165.93086984152117 -77.43664256999641 -42.73397459621565
+ vertex 166.13973867537135 -77.31605209254768 -42.63407417371102
+ vertex 15.930869841521629 182.3709785653341 -42.73397459621574
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 -2.4387889803801356e-15
+ outer loop
+ vertex 32.818365215317996 192.12097856533438 -48.800000000000125
+ vertex 32.818365215317925 192.12097856533458 -43.60000000000016
+ vertex 182.81836521531753 -67.68664256999614 -48.80000000000003
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 -2.4387889803801356e-15
+ outer loop
+ vertex 182.8183652153174 -67.68664256999595 -43.600000000000065
+ vertex 182.81836521531753 -67.68664256999614 -48.80000000000003
+ vertex 32.818365215317925 192.12097856533458 -43.60000000000016
+ endloop
+endfacet
+facet normal -1.877717253503254e-14 3.0643012873322636e-14 1.0
+ outer loop
+ vertex 27.44900771185445 189.02097856533442 -43.00000000000016
+ vertex 27.10259755034066 188.82097856533443 -43.00000000000016
+ vertex 177.4490077118539 -70.78664256999606 -43.00000000000007
+ endloop
+endfacet
+facet normal -1.877717253503254e-14 3.0643012873322636e-14 1.0
+ outer loop
+ vertex 177.10259755034016 -70.9866425699961 -43.00000000000007
+ vertex 177.4490077118539 -70.78664256999606 -43.00000000000007
+ vertex 27.10259755034066 188.82097856533443 -43.00000000000016
+ endloop
+endfacet
+facet normal 0.8586164364012407 0.49572243068693855 0.1305261922200573
+ outer loop
+ vertex 32.818365215317925 192.12097856533458 -43.60000000000016
+ vertex 32.78885611527129 192.1039414784791 -43.341180954897645
+ vertex 182.8183652153174 -67.68664256999595 -43.600000000000065
+ endloop
+endfacet
+facet normal 0.8586164364012407 0.49572243068693855 0.1305261922200573
+ outer loop
+ vertex 182.78885611527082 -67.70367965685142 -43.34118095489755
+ vertex 182.8183652153174 -67.68664256999595 -43.600000000000065
+ vertex 32.78885611527129 192.1039414784791 -43.341180954897645
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 9.400019899202893e-16
+ outer loop
+ vertex 21.213624804606596 185.4209785653342 -44.40000000000017
+ vertex 21.213624804606596 185.42097856533425 -43.00000000000017
+ vertex 171.21362480460618 -74.38664256999633 -44.40000000000008
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 9.400019899202893e-16
+ outer loop
+ vertex 171.21362480460613 -74.38664256999628 -43.00000000000008
+ vertex 171.21362480460618 -74.38664256999633 -44.40000000000008
+ vertex 21.213624804606596 185.42097856533425 -43.00000000000017
+ endloop
+endfacet
+facet normal -0.5272028623656614 -0.30438071450434273 0.7933533402912472
+ outer loop
+ vertex 15.930869841521629 182.3709785653341 -42.73397459621574
+ vertex 15.751510107718055 182.26742517474082 -42.892893218813626
+ vertex 165.93086984152117 -77.43664256999641 -42.73397459621565
+ endloop
+endfacet
+facet normal -0.5272028623656614 -0.30438071450434273 0.7933533402912472
+ outer loop
+ vertex 165.75151010771756 -77.54019596058971 -42.89289321881353
+ vertex 165.93086984152117 -77.43664256999641 -42.73397459621565
+ vertex 15.751510107718055 182.26742517474082 -42.892893218813626
+ endloop
+endfacet
+facet normal -0.6870641468694519 -0.3966766701456174 0.6087614290087188
+ outer loop
+ vertex 15.613882543413824 182.1879658634419 -43.10000000000017
+ vertex 165.61388254341338 -77.61965527188865 -43.1000000000001
+ vertex 15.751510107718055 182.26742517474082 -42.892893218813626
+ endloop
+endfacet
+facet normal -0.6870641468694519 -0.3966766701456174 0.6087614290087188
+ outer loop
+ vertex 165.75151010771756 -77.54019596058971 -42.89289321881353
+ vertex 15.751510107718055 182.26742517474082 -42.892893218813626
+ vertex 165.61388254341338 -77.61965527188865 -43.1000000000001
+ endloop
+endfacet
+facet normal 0.6870641468694341 0.3966766701456523 0.6087614290087163
+ outer loop
+ vertex 32.70233981153347 192.0539912672268 -43.10000000000016
+ vertex 32.56471224722925 191.97453195592786 -42.892893218813605
+ vertex 182.702339811533 -67.75362986810374 -43.100000000000065
+ endloop
+endfacet
+facet normal 0.6870641468694341 0.3966766701456523 0.6087614290087163
+ outer loop
+ vertex 182.5647122472288 -67.83308917940268 -42.89289321881352
+ vertex 182.702339811533 -67.75362986810374 -43.100000000000065
+ vertex 32.56471224722925 191.97453195592786 -42.892893218813605
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -4.122523745489034e-14
+ outer loop
+ vertex 27.10259755034066 188.82097856533443 -43.00000000000016
+ vertex 27.10259755034073 188.8209785653344 -44.40000000000016
+ vertex 177.10259755034016 -70.9866425699961 -43.00000000000007
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -4.122523745489034e-14
+ outer loop
+ vertex 177.10259755034025 -70.9866425699961 -44.40000000000007
+ vertex 177.10259755034016 -70.9866425699961 -43.00000000000007
+ vertex 27.10259755034073 188.8209785653344 -44.40000000000016
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 6.007129263248553e-15
+ outer loop
+ vertex 32.47195505380423 191.9209785653344 -49.200000000000124
+ vertex 32.47195505380424 191.9209785653344 -48.800000000000125
+ vertex 182.47195505380375 -67.88664256999614 -49.20000000000003
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 6.007129263248553e-15
+ outer loop
+ vertex 182.47195505380378 -67.88664256999614 -48.80000000000003
+ vertex 182.47195505380375 -67.88664256999614 -49.20000000000003
+ vertex 32.47195505380424 191.9209785653344 -48.800000000000125
+ endloop
+endfacet
+facet normal 1.877717253503254e-14 -3.0643012873322636e-14 -1.0
+ outer loop
+ vertex 21.213624804606596 185.4209785653342 -44.40000000000017
+ vertex 171.21362480460618 -74.38664256999633 -44.40000000000008
+ vertex 19.308368916280923 184.32097856533417 -44.40000000000018
+ endloop
+endfacet
+facet normal 1.877717253503254e-14 -3.0643012873322636e-14 -1.0
+ outer loop
+ vertex 169.30836891628041 -75.48664256999639 -44.40000000000009
+ vertex 19.308368916280923 184.32097856533417 -44.40000000000018
+ vertex 171.21362480460618 -74.38664256999633 -44.40000000000008
+ endloop
+endfacet
+facet normal -1.877717253503254e-14 3.0643012873322636e-14 1.0
+ outer loop
+ vertex 20.867214643092836 185.22097856533426 -42.60000000000017
+ vertex 16.363882543413876 182.62097856533416 -42.60000000000018
+ vertex 170.8672146430924 -74.58664256999629 -42.600000000000094
+ endloop
+endfacet
+facet normal -1.877717253503254e-14 3.0643012873322636e-14 1.0
+ outer loop
+ vertex 166.36388254341335 -77.18664256999637 -42.60000000000009
+ vertex 170.8672146430924 -74.58664256999629 -42.600000000000094
+ vertex 16.363882543413876 182.62097856533416 -42.60000000000018
+ endloop
+endfacet
+facet normal -0.1130389983218027 -0.06526309611006655 -0.9914448613738092
+ outer loop
+ vertex 17.761743216822392 183.42803380141615 -43.25451867793767
+ vertex 167.76174321682188 -76.37958733391434 -43.25451867793758
+ vertex 17.40311302795516 183.22097856533415 -43.20000000000017
+ endloop
+endfacet
+facet normal -0.1130389983218027 -0.06526309611006655 -0.9914448613738092
+ outer loop
+ vertex 167.4031130279547 -76.58664256999637 -43.20000000000008
+ vertex 17.40311302795516 183.22097856533415 -43.20000000000017
+ vertex 167.76174321682188 -76.37958733391434 -43.25451867793758
+ endloop
+endfacet
+facet normal -0.8586164364012416 -0.495722430686939 0.13052619222005132
+ outer loop
+ vertex 26.496379767691785 188.47097856533412 -52.60000000000017
+ vertex 26.416705197565914 188.4249784308243 -53.29881142177697
+ vertex 176.49637976769134 -71.33664256999639 -52.60000000000009
+ endloop
+endfacet
+facet normal -0.8586164364012416 -0.495722430686939 0.13052619222005132
+ outer loop
+ vertex 176.4167051975654 -71.38264270450611 -53.29881142177688
+ vertex 176.49637976769134 -71.33664256999639 -52.60000000000009
+ vertex 26.416705197565914 188.4249784308243 -53.29881142177697
+ endloop
+endfacet
+facet normal -0.5272028623656277 -0.3043807145043966 -0.7933533402912488
+ outer loop
+ vertex 25.81151675385244 188.075572719936 -50.69081169079648
+ vertex 175.81151675385195 -71.73204841539453 -50.690811690796394
+ vertex 25.327245472582785 187.79597856533414 -50.2617314097822
+ endloop
+endfacet
+facet normal -0.5272028623656277 -0.3043807145043966 -0.7933533402912488
+ outer loop
+ vertex 175.3272454725823 -72.01164256999637 -50.26173140978212
+ vertex 25.327245472582785 187.79597856533414 -50.2617314097822
+ vertex 175.81151675385195 -71.73204841539453 -50.690811690796394
+ endloop
+endfacet
+facet normal -0.8001031451912648 -0.46193976625565186 0.38268343236508084
+ outer loop
+ vertex 26.18311117747383 188.29011286044306 -53.95000000000018
+ vertex 176.18311117747336 -71.51750827488746 -53.950000000000095
+ vertex 26.416705197565914 188.4249784308243 -53.29881142177697
+ endloop
+endfacet
+facet normal -0.8001031451912648 -0.46193976625565186 0.38268343236508084
+ outer loop
+ vertex 176.4167051975654 -71.38264270450611 -53.29881142177688
+ vertex 26.416705197565914 188.4249784308243 -53.29881142177697
+ vertex 176.18311117747336 -71.51750827488746 -53.950000000000095
+ endloop
+endfacet
+facet normal -0.8001031451912607 -0.46193976625566074 0.38268343236507896
+ outer loop
+ vertex 15.613882543413824 182.1879658634419 -43.10000000000017
+ vertex 15.527366239676041 182.13801565218952 -43.34118095489766
+ vertex 165.61388254341338 -77.61965527188865 -43.1000000000001
+ endloop
+endfacet
+facet normal -0.8001031451912607 -0.46193976625566074 0.38268343236507896
+ outer loop
+ vertex 165.5273662396756 -77.66960548314098 -43.34118095489759
+ vertex 165.61388254341338 -77.61965527188865 -43.1000000000001
+ vertex 15.527366239676041 182.13801565218952 -43.34118095489766
+ endloop
+endfacet
+facet normal -0.11303899832182687 -0.06526309610999317 0.9914448613738114
+ outer loop
+ vertex 24.76329962118731 187.4703842762224 -55.20799973098066
+ vertex 24.158111177473895 187.12097856533398 -55.30000000000017
+ vertex 174.76329962118686 -72.33723685910816 -55.20799973098057
+ endloop
+endfacet
+facet normal -0.11303899832182687 -0.06526309610999317 0.9914448613738114
+ outer loop
+ vertex 174.1581111774734 -72.68664256999658 -55.30000000000008
+ vertex 174.76329962118686 -72.33723685910816 -55.20799973098057
+ vertex 24.158111177473895 187.12097856533398 -55.30000000000017
+ endloop
+endfacet
+facet normal 0.5272028623656277 0.3043807145043966 0.7933533402912488
+ outer loop
+ vertex 22.98897688236492 186.44597856533392 -54.93826859021815
+ vertex 22.504705601095264 186.16638441073212 -54.509188309203864
+ vertex 172.98897688236445 -73.3616425699966 -54.93826859021808
+ endloop
+endfacet
+facet normal 0.5272028623656277 0.3043807145043966 0.7933533402912488
+ outer loop
+ vertex 172.5047056010948 -73.64123672459844 -54.50918830920379
+ vertex 172.98897688236445 -73.3616425699966 -54.93826859021808
+ vertex 22.504705601095264 186.16638441073212 -54.509188309203864
+ endloop
+endfacet
+facet normal -0.8001031451912405 -0.4619397662556942 -0.382683432365081
+ outer loop
+ vertex 26.183111177473783 188.29011286044317 -51.25000000000016
+ vertex 26.41670519756588 188.42497843082435 -51.901188578223376
+ vertex 176.18311117747334 -71.51750827488736 -51.25000000000008
+ endloop
+endfacet
+facet normal -0.8001031451912405 -0.4619397662556942 -0.382683432365081
+ outer loop
+ vertex 176.4167051975654 -71.38264270450611 -51.901188578223284
+ vertex 176.18311117747334 -71.51750827488736 -51.25000000000008
+ vertex 26.41670519756588 188.42497843082435 -51.901188578223376
+ endloop
+endfacet
+facet normal -0.3314135740356126 -0.19134171618253332 0.9238795325112817
+ outer loop
+ vertex 25.327245472582867 187.79597856533397 -54.93826859021815
+ vertex 24.76329962118731 187.4703842762224 -55.20799973098066
+ vertex 175.32724547258235 -72.01164256999647 -54.93826859021806
+ endloop
+endfacet
+facet normal -0.3314135740356126 -0.19134171618253332 0.9238795325112817
+ outer loop
+ vertex 174.76329962118686 -72.33723685910816 -55.20799973098057
+ vertex 175.32724547258235 -72.01164256999647 -54.93826859021806
+ vertex 24.76329962118731 187.4703842762224 -55.20799973098066
+ endloop
+endfacet
+facet normal 0.11303899832182648 0.06526309610999435 -0.9914448613738113
+ outer loop
+ vertex 24.158111177473785 187.12097856533413 -49.90000000000019
+ vertex 174.1581111774733 -72.6866425699964 -49.90000000000009
+ vertex 23.552922733760358 186.77157285444568 -49.9920002690197
+ endloop
+endfacet
+facet normal 0.11303899832182648 0.06526309610999435 -0.9914448613738113
+ outer loop
+ vertex 173.55292273375986 -73.03604828088481 -49.9920002690196
+ vertex 23.552922733760358 186.77157285444568 -49.9920002690197
+ vertex 174.1581111774733 -72.6866425699964 -49.90000000000009
+ endloop
+endfacet
+facet normal 0.8001031451912648 0.46193976625565186 -0.38268343236508084
+ outer loop
+ vertex 22.133111177473836 185.95184427022505 -51.25000000000016
+ vertex 172.13311117747338 -73.85577686510548 -51.25000000000008
+ vertex 21.899517157381815 185.81697869984376 -51.901188578223376
+ endloop
+endfacet
+facet normal 0.8001031451912648 0.46193976625565186 -0.38268343236508084
+ outer loop
+ vertex 171.8995171573813 -73.99064243548673 -51.90118857822331
+ vertex 21.899517157381815 185.81697869984376 -51.901188578223376
+ vertex 172.13311117747338 -73.85577686510548 -51.25000000000008
+ endloop
+endfacet
+facet normal 0.33141357403557586 0.19134171618259377 0.9238795325112824
+ outer loop
+ vertex 23.552922733760447 186.77157285444557 -55.20799973098066
+ vertex 22.98897688236492 186.44597856533392 -54.93826859021815
+ vertex 173.55292273376 -73.036048280885 -55.20799973098057
+ endloop
+endfacet
+facet normal 0.33141357403557586 0.19134171618259377 0.9238795325112824
+ outer loop
+ vertex 172.98897688236445 -73.3616425699966 -54.93826859021808
+ vertex 173.55292273376 -73.036048280885 -55.20799973098057
+ vertex 22.98897688236492 186.44597856533392 -54.93826859021815
+ endloop
+endfacet
+facet normal -0.6870641468694499 -0.39667667014562186 0.6087614290087181
+ outer loop
+ vertex 26.18311117747383 188.29011286044306 -53.95000000000018
+ vertex 25.8115167538525 188.07557271993588 -54.509188309203864
+ vertex 176.18311117747336 -71.51750827488746 -53.950000000000095
+ endloop
+endfacet
+facet normal -0.6870641468694499 -0.39667667014562186 0.6087614290087181
+ outer loop
+ vertex 175.81151675385203 -71.73204841539467 -54.50918830920377
+ vertex 176.18311117747336 -71.51750827488746 -53.950000000000095
+ vertex 25.8115167538525 188.07557271993588 -54.509188309203864
+ endloop
+endfacet
+facet normal -0.858616436401246 -0.4957224306869303 -0.1305261922200552
+ outer loop
+ vertex 26.496379767691785 188.47097856533412 -52.60000000000017
+ vertex 176.49637976769134 -71.33664256999639 -52.60000000000009
+ vertex 26.41670519756588 188.42497843082435 -51.901188578223376
+ endloop
+endfacet
+facet normal -0.858616436401246 -0.4957224306869303 -0.1305261922200552
+ outer loop
+ vertex 176.4167051975654 -71.38264270450611 -51.901188578223284
+ vertex 26.41670519756588 188.42497843082435 -51.901188578223376
+ vertex 176.49637976769134 -71.33664256999639 -52.60000000000009
+ endloop
+endfacet
+facet normal 0.8001031451912411 0.4619397662556833 0.38268343236509217
+ outer loop
+ vertex 22.13311117747392 185.95184427022497 -53.95000000000018
+ vertex 21.89951715738182 185.8169786998437 -53.298811421776996
+ vertex 172.1331111774734 -73.85577686510557 -53.95000000000012
+ endloop
+endfacet
+facet normal 0.8001031451912411 0.4619397662556833 0.38268343236509217
+ outer loop
+ vertex 171.89951715738138 -73.99064243548682 -53.298811421776925
+ vertex 172.1331111774734 -73.85577686510557 -53.95000000000012
+ vertex 21.89951715738182 185.8169786998437 -53.298811421776996
+ endloop
+endfacet
+facet normal 0.11303899832179491 0.06526309610997753 -0.9914448613738159
+ outer loop
+ vertex 17.40311302795516 183.22097856533415 -43.20000000000017
+ vertex 167.4031130279547 -76.58664256999637 -43.20000000000008
+ vertex 17.044482839087948 183.01392332925212 -43.25451867793765
+ endloop
+endfacet
+facet normal 0.11303899832179491 0.06526309610997753 -0.9914448613738159
+ outer loop
+ vertex 167.0444828390875 -76.7936978060784 -43.254518677937554
+ vertex 17.044482839087948 183.01392332925212 -43.25451867793765
+ vertex 167.4031130279547 -76.58664256999637 -43.20000000000008
+ endloop
+endfacet
+facet normal 0.6870641468694515 0.39667667014561714 -0.6087614290087193
+ outer loop
+ vertex 22.133111177473836 185.95184427022505 -51.25000000000016
+ vertex 22.50470560109519 186.1663844107322 -50.69081169079649
+ vertex 172.13311117747338 -73.85577686510548 -51.25000000000008
+ endloop
+endfacet
+facet normal 0.6870641468694515 0.39667667014561714 -0.6087614290087193
+ outer loop
+ vertex 172.50470560109468 -73.64123672459827 -50.690811690796394
+ vertex 172.13311117747338 -73.85577686510548 -51.25000000000008
+ vertex 22.50470560109519 186.1663844107322 -50.69081169079649
+ endloop
+endfacet
+facet normal -0.5272028623656583 -0.30438071450434656 0.7933533402912477
+ outer loop
+ vertex 25.8115167538525 188.07557271993588 -54.509188309203864
+ vertex 25.327245472582867 187.79597856533397 -54.93826859021815
+ vertex 175.81151675385203 -71.73204841539467 -54.50918830920377
+ endloop
+endfacet
+facet normal -0.5272028623656583 -0.30438071450434656 0.7933533402912477
+ outer loop
+ vertex 175.32724547258235 -72.01164256999647 -54.93826859021806
+ vertex 175.81151675385203 -71.73204841539467 -54.50918830920377
+ vertex 25.327245472582867 187.79597856533397 -54.93826859021815
+ endloop
+endfacet
+facet normal -0.11303899832178853 -0.06526309611005696 -0.9914448613738115
+ outer loop
+ vertex 24.763299621187205 187.47038427622255 -49.99200026901969
+ vertex 174.76329962118675 -72.33723685910797 -49.99200026901961
+ vertex 24.158111177473785 187.12097856533413 -49.90000000000019
+ endloop
+endfacet
+facet normal -0.11303899832178853 -0.06526309611005696 -0.9914448613738115
+ outer loop
+ vertex 174.1581111774733 -72.6866425699964 -49.90000000000009
+ vertex 24.158111177473785 187.12097856533413 -49.90000000000019
+ vertex 174.76329962118675 -72.33723685910797 -49.99200026901961
+ endloop
+endfacet
+facet normal 0.6870641468694301 0.39667667014564995 0.6087614290087222
+ outer loop
+ vertex 22.504705601095264 186.16638441073212 -54.509188309203864
+ vertex 22.13311117747392 185.95184427022497 -53.95000000000018
+ vertex 172.5047056010948 -73.64123672459844 -54.50918830920379
+ endloop
+endfacet
+facet normal 0.6870641468694301 0.39667667014564995 0.6087614290087222
+ outer loop
+ vertex 172.1331111774734 -73.85577686510557 -53.95000000000012
+ vertex 172.5047056010948 -73.64123672459844 -54.50918830920379
+ vertex 22.13311117747392 185.95184427022497 -53.95000000000018
+ endloop
+endfacet
+facet normal 0.8586164364012417 0.4957224306869391 0.13052619222005107
+ outer loop
+ vertex 21.819842587255902 185.770978565334 -52.60000000000017
+ vertex 171.8198425872554 -74.03664256999654 -52.60000000000011
+ vertex 21.89951715738182 185.8169786998437 -53.298811421776996
+ endloop
+endfacet
+facet normal 0.8586164364012417 0.4957224306869391 0.13052619222005107
+ outer loop
+ vertex 171.89951715738138 -73.99064243548682 -53.298811421776925
+ vertex 21.89951715738182 185.8169786998437 -53.298811421776996
+ vertex 171.8198425872554 -74.03664256999654 -52.60000000000011
+ endloop
+endfacet
+facet normal 0.11303899832178853 0.06526309611005696 0.9914448613738115
+ outer loop
+ vertex 24.158111177473895 187.12097856533398 -55.30000000000017
+ vertex 23.552922733760447 186.77157285444557 -55.20799973098066
+ vertex 174.1581111774734 -72.68664256999658 -55.30000000000008
+ endloop
+endfacet
+facet normal 0.11303899832178853 0.06526309611005696 0.9914448613738115
+ outer loop
+ vertex 173.55292273376 -73.036048280885 -55.20799973098057
+ vertex 174.1581111774734 -72.68664256999658 -55.30000000000008
+ vertex 23.552922733760447 186.77157285444557 -55.20799973098066
+ endloop
+endfacet
+facet normal 0.33141357403561666 0.19134171618253848 -0.9238795325112792
+ outer loop
+ vertex 17.044482839087948 183.01392332925212 -43.25451867793765
+ vertex 167.0444828390875 -76.7936978060784 -43.254518677937554
+ vertex 16.710292704927603 182.82097856533412 -43.414359353945066
+ endloop
+endfacet
+facet normal 0.33141357403561666 0.19134171618253848 -0.9238795325112792
+ outer loop
+ vertex 166.7102927049271 -76.98664256999636 -43.414359353944974
+ vertex 16.710292704927603 182.82097856533412 -43.414359353945066
+ vertex 167.0444828390875 -76.7936978060784 -43.254518677937554
+ endloop
+endfacet
+facet normal -0.6870641468694285 -0.39667667014565466 -0.6087614290087209
+ outer loop
+ vertex 26.183111177473783 188.29011286044317 -51.25000000000016
+ vertex 176.18311117747334 -71.51750827488736 -51.25000000000008
+ vertex 25.81151675385244 188.075572719936 -50.69081169079648
+ endloop
+endfacet
+facet normal -0.6870641468694285 -0.39667667014565466 -0.6087614290087209
+ outer loop
+ vertex 175.81151675385195 -71.73204841539453 -50.690811690796394
+ vertex 25.81151675385244 188.075572719936 -50.69081169079648
+ vertex 176.18311117747334 -71.51750827488736 -51.25000000000008
+ endloop
+endfacet
+facet normal 0.5272028623656598 0.3043807145043362 -0.7933533402912507
+ outer loop
+ vertex 16.710292704927603 182.82097856533412 -43.414359353945066
+ vertex 166.7102927049271 -76.98664256999636 -43.414359353944974
+ vertex 16.42331713084192 182.65529314038483 -43.66862915010168
+ endloop
+endfacet
+facet normal 0.5272028623656598 0.3043807145043362 -0.7933533402912507
+ outer loop
+ vertex 166.4233171308414 -77.15232799494562 -43.66862915010159
+ vertex 16.42331713084192 182.65529314038483 -43.66862915010168
+ vertex 166.7102927049271 -76.98664256999636 -43.414359353944974
+ endloop
+endfacet
+facet normal -0.33141357403554456 -0.19134171618257287 -0.923879532511298
+ outer loop
+ vertex 18.09593335098268 183.62097856533416 -43.41435935394507
+ vertex 168.09593335098222 -76.18664256999637 -43.414359353944974
+ vertex 17.761743216822392 183.42803380141615 -43.25451867793767
+ endloop
+endfacet
+facet normal -0.33141357403554456 -0.19134171618257287 -0.923879532511298
+ outer loop
+ vertex 167.76174321682188 -76.37958733391434 -43.25451867793758
+ vertex 17.761743216822392 183.42803380141615 -43.25451867793767
+ vertex 168.09593335098222 -76.18664256999637 -43.414359353944974
+ endloop
+endfacet
+facet normal 0.5272028623656583 0.30438071450434656 -0.7933533402912477
+ outer loop
+ vertex 22.988976882364845 186.44597856533406 -50.2617314097822
+ vertex 172.98897688236434 -73.36164256999642 -50.26173140978211
+ vertex 22.50470560109519 186.1663844107322 -50.69081169079649
+ endloop
+endfacet
+facet normal 0.5272028623656583 0.30438071450434656 -0.7933533402912477
+ outer loop
+ vertex 172.50470560109468 -73.64123672459827 -50.690811690796394
+ vertex 22.50470560109519 186.1663844107322 -50.69081169079649
+ vertex 172.98897688236434 -73.36164256999642 -50.26173140978211
+ endloop
+endfacet
+facet normal 0.3314135740356126 0.19134171618253332 -0.9238795325112817
+ outer loop
+ vertex 23.552922733760358 186.77157285444568 -49.9920002690197
+ vertex 173.55292273375986 -73.03604828088481 -49.9920002690196
+ vertex 22.988976882364845 186.44597856533406 -50.2617314097822
+ endloop
+endfacet
+facet normal 0.3314135740356126 0.19134171618253332 -0.9238795325112817
+ outer loop
+ vertex 172.98897688236434 -73.36164256999642 -50.26173140978211
+ vertex 22.988976882364845 186.44597856533406 -50.2617314097822
+ vertex 173.55292273375986 -73.03604828088481 -49.9920002690196
+ endloop
+endfacet
+facet normal 0.8586164364012416 0.495722430686939 -0.13052619222005132
+ outer loop
+ vertex 21.819842587255902 185.770978565334 -52.60000000000017
+ vertex 21.899517157381815 185.81697869984376 -51.901188578223376
+ vertex 171.8198425872554 -74.03664256999654 -52.60000000000011
+ endloop
+endfacet
+facet normal 0.8586164364012416 0.495722430686939 -0.13052619222005132
+ outer loop
+ vertex 171.8995171573813 -73.99064243548673 -51.90118857822331
+ vertex 171.8198425872554 -74.03664256999654 -52.60000000000011
+ vertex 21.899517157381815 185.81697869984376 -51.901188578223376
+ endloop
+endfacet
+facet normal -0.8586164364012411 -0.4957224306869387 0.1305261922200554
+ outer loop
+ vertex 15.497857139629415 182.1209785653341 -43.60000000000017
+ vertex 165.49785713962896 -77.68664256999648 -43.6000000000001
+ vertex 15.527366239676041 182.13801565218952 -43.34118095489766
+ endloop
+endfacet
+facet normal -0.8586164364012411 -0.4957224306869387 0.1305261922200554
+ outer loop
+ vertex 165.5273662396756 -77.66960548314098 -43.34118095489759
+ vertex 15.527366239676041 182.13801565218952 -43.34118095489766
+ vertex 165.49785713962896 -77.68664256999648 -43.6000000000001
+ endloop
+endfacet
+facet normal 0.6870641468694392 0.39667667014561564 -0.6087614290087343
+ outer loop
+ vertex 16.203113027955183 182.52815824230652 -44.00000000000015
+ vertex 16.42331713084192 182.65529314038483 -43.66862915010168
+ vertex 166.20311302795469 -77.27946289302398 -44.00000000000006
+ endloop
+endfacet
+facet normal 0.6870641468694392 0.39667667014561564 -0.6087614290087343
+ outer loop
+ vertex 166.4233171308414 -77.15232799494562 -43.66862915010159
+ vertex 166.20311302795469 -77.27946289302398 -44.00000000000006
+ vertex 16.42331713084192 182.65529314038483 -43.66862915010168
+ endloop
+endfacet
+facet normal -0.3314135740355789 -0.1913417161825871 -0.9238795325112827
+ outer loop
+ vertex 25.327245472582785 187.79597856533414 -50.2617314097822
+ vertex 175.3272454725823 -72.01164256999637 -50.26173140978212
+ vertex 24.763299621187205 187.47038427622255 -49.99200026901969
+ endloop
+endfacet
+facet normal -0.3314135740355789 -0.1913417161825871 -0.9238795325112827
+ outer loop
+ vertex 174.76329962118675 -72.33723685910797 -49.99200026901961
+ vertex 24.763299621187205 187.47038427622255 -49.99200026901969
+ vertex 175.3272454725823 -72.01164256999637 -50.26173140978212
+ endloop
+endfacet
+facet normal -0.33141357403561666 -0.19134171618253848 0.9238795325112792
+ outer loop
+ vertex 18.095933350982747 183.62097856533404 -46.18564064605529
+ vertex 17.761743216822424 183.42803380141606 -46.345481322062696
+ vertex 168.09593335098225 -76.18664256999647 -46.18564064605519
+ endloop
+endfacet
+facet normal -0.33141357403561666 -0.19134171618253848 0.9238795325112792
+ outer loop
+ vertex 167.7617432168219 -76.37958733391443 -46.345481322062604
+ vertex 168.09593335098225 -76.18664256999647 -46.18564064605519
+ vertex 17.761743216822424 183.42803380141606 -46.345481322062696
+ endloop
+endfacet
+facet normal 0.1130389983218041 0.06526309611006595 0.9914448613738092
+ outer loop
+ vertex 17.40311302795521 183.220978565334 -46.40000000000017
+ vertex 17.044482839087998 183.013923329252 -46.345481322062675
+ vertex 167.4031130279547 -76.58664256999646 -46.40000000000008
+ endloop
+endfacet
+facet normal 0.1130389983218041 0.06526309611006595 0.9914448613738092
+ outer loop
+ vertex 167.0444828390875 -76.79369780607853 -46.34548132206258
+ vertex 167.4031130279547 -76.58664256999646 -46.40000000000008
+ vertex 17.044482839087998 183.013923329252 -46.345481322062675
+ endloop
+endfacet
+facet normal 0.8586164364012473 0.49572243068693106 0.13052619222004383
+ outer loop
+ vertex 16.064686941974692 182.4482379043028 -45.21411047216418
+ vertex 16.017472381900088 182.42097856533402 -44.800000000000146
+ vertex 166.06468694197426 -77.35938323102779 -45.214110472164094
+ endloop
+endfacet
+facet normal 0.8586164364012473 0.49572243068693106 0.13052619222004383
+ outer loop
+ vertex 166.01747238189967 -77.38664256999651 -44.80000000000006
+ vertex 166.06468694197426 -77.35938323102779 -45.214110472164094
+ vertex 16.017472381900088 182.42097856533402 -44.800000000000146
+ endloop
+endfacet
+facet normal -0.8586164364012403 -0.4957224306869383 0.13052619222006184
+ outer loop
+ vertex 18.788753674010273 184.02097856533413 -44.8000000000002
+ vertex 18.74153911393566 183.99371922636539 -45.214110472164236
+ vertex 168.78875367400983 -75.78664256999642 -44.800000000000104
+ endloop
+endfacet
+facet normal -0.8586164364012403 -0.4957224306869383 0.13052619222006184
+ outer loop
+ vertex 168.7415391139352 -75.81390190896518 -45.21411047216414
+ vertex 168.78875367400983 -75.78664256999642 -44.800000000000104
+ vertex 18.74153911393566 183.99371922636539 -45.214110472164236
+ endloop
+endfacet
+facet normal -0.6870641468694271 -0.39667667014565383 -0.6087614290087231
+ outer loop
+ vertex 18.38290892506843 183.7866639902834 -43.668629150101715
+ vertex 18.60311302795516 183.9137988883617 -44.000000000000185
+ vertex 168.3829089250679 -76.0209571450471 -43.66862915010161
+ endloop
+endfacet
+facet normal -0.6870641468694271 -0.39667667014565383 -0.6087614290087231
+ outer loop
+ vertex 168.60311302795466 -75.89382224696875 -44.000000000000085
+ vertex 168.3829089250679 -76.0209571450471 -43.66862915010161
+ vertex 18.60311302795516 183.9137988883617 -44.000000000000185
+ endloop
+endfacet
+facet normal 0.858616436401251 0.49572243068693317 0.13052619222001063
+ outer loop
+ vertex 16.064686941975005 182.44823790430232 -60.814110472164195
+ vertex 16.017472381900408 182.42097856533357 -60.40000000000016
+ vertex 166.06468694197451 -77.35938323102825 -60.8141104721641
+ endloop
+endfacet
+facet normal 0.858616436401251 0.49572243068693317 0.13052619222001063
+ outer loop
+ vertex 166.0174723818999 -77.38664256999691 -60.40000000000007
+ vertex 166.06468694197451 -77.35938323102825 -60.8141104721641
+ vertex 16.017472381900408 182.42097856533357 -60.40000000000016
+ endloop
+endfacet
+facet normal 0.5272028623656546 0.30438071450442333 0.7933533402912207
+ outer loop
+ vertex 16.71029270492767 182.820978565334 -46.185640646055276
+ vertex 16.423317130841962 182.65529314038477 -45.93137084989864
+ vertex 166.71029270492718 -76.9866425699965 -46.18564064605519
+ endloop
+endfacet
+facet normal 0.5272028623656546 0.30438071450442333 0.7933533402912207
+ outer loop
+ vertex 166.42331713084147 -77.15232799494576 -45.93137084989855
+ vertex 166.71029270492718 -76.9866425699965 -46.18564064605519
+ vertex 16.423317130841962 182.65529314038477 -45.93137084989864
+ endloop
+endfacet
+facet normal -0.11303899832179477 -0.06526309610997605 0.991444861373816
+ outer loop
+ vertex 17.761743216822424 183.42803380141606 -46.345481322062696
+ vertex 17.40311302795521 183.220978565334 -46.40000000000017
+ vertex 167.7617432168219 -76.37958733391443 -46.345481322062604
+ endloop
+endfacet
+facet normal -0.11303899832179477 -0.06526309610997605 0.991444861373816
+ outer loop
+ vertex 167.4031130279547 -76.58664256999646 -46.40000000000008
+ vertex 167.7617432168219 -76.37958733391443 -46.345481322062604
+ vertex 17.40311302795521 183.220978565334 -46.40000000000017
+ endloop
+endfacet
+facet normal 0.8586164364012403 0.4957224306869383 -0.13052619222006184
+ outer loop
+ vertex 16.064686941974696 182.44823790430283 -44.38588952783612
+ vertex 166.06468694197423 -77.35938323102775 -44.38588952783603
+ vertex 16.017472381900088 182.42097856533402 -44.800000000000146
+ endloop
+endfacet
+facet normal 0.8586164364012403 0.4957224306869383 -0.13052619222006184
+ outer loop
+ vertex 166.01747238189967 -77.38664256999651 -44.80000000000006
+ vertex 16.017472381900088 182.42097856533402 -44.800000000000146
+ vertex 166.06468694197423 -77.35938323102775 -44.38588952783603
+ endloop
+endfacet
+facet normal -0.33141357403556354 -0.19134171618250495 0.9238795325113052
+ outer loop
+ vertex 18.095933350983042 183.6209785653336 -61.78564064605529
+ vertex 17.76174321682269 183.42803380141555 -61.94548132206268
+ vertex 168.09593335098256 -76.1866425699969 -61.7856406460552
+ endloop
+endfacet
+facet normal -0.33141357403556354 -0.19134171618250495 0.9238795325113052
+ outer loop
+ vertex 167.7617432168222 -76.37958733391493 -61.94548132206259
+ vertex 168.09593335098256 -76.1866425699969 -61.7856406460552
+ vertex 17.76174321682269 183.42803380141555 -61.94548132206268
+ endloop
+endfacet
+facet normal 0.6870641468694271 0.39667667014565383 0.6087614290087231
+ outer loop
+ vertex 16.203113027955208 182.5281582423065 -45.60000000000017
+ vertex 166.2031130279547 -77.27946289302402 -45.60000000000008
+ vertex 16.423317130841962 182.65529314038477 -45.93137084989864
+ endloop
+endfacet
+facet normal 0.6870641468694271 0.39667667014565383 0.6087614290087231
+ outer loop
+ vertex 166.42331713084147 -77.15232799494576 -45.93137084989855
+ vertex 16.423317130841962 182.65529314038477 -45.93137084989864
+ vertex 166.2031130279547 -77.27946289302402 -45.60000000000008
+ endloop
+endfacet
+facet normal 0.687064146869438 0.3966766701456545 0.6087614290087103
+ outer loop
+ vertex 16.20311302795551 182.528158242306 -61.20000000000016
+ vertex 166.20311302795503 -77.27946289302447 -61.20000000000007
+ vertex 16.423317130842236 182.6552931403843 -61.53137084989863
+ endloop
+endfacet
+facet normal 0.687064146869438 0.3966766701456545 0.6087614290087103
+ outer loop
+ vertex 166.42331713084175 -77.15232799494622 -61.531370849898536
+ vertex 16.423317130842236 182.6552931403843 -61.53137084989863
+ vertex 166.20311302795503 -77.27946289302447 -61.20000000000007
+ endloop
+endfacet
+facet normal -0.8586164364012403 -0.4957224306869383 0.13052619222006184
+ outer loop
+ vertex 18.788753674010536 184.02097856533365 -60.40000000000018
+ vertex 18.741539113935957 183.9937192263649 -60.81411047216422
+ vertex 168.78875367401005 -75.78664256999683 -60.40000000000009
+ endloop
+endfacet
+facet normal -0.8586164364012403 -0.4957224306869383 0.13052619222006184
+ outer loop
+ vertex 168.74153911393546 -75.81390190896563 -60.814110472164124
+ vertex 168.78875367401005 -75.78664256999683 -60.40000000000009
+ vertex 18.741539113935957 183.9937192263649 -60.81411047216422
+ endloop
+endfacet
+facet normal 0.33141357403558563 0.19134171618259377 0.9238795325112789
+ outer loop
+ vertex 17.044482839088296 183.0139233292515 -61.94548132206268
+ vertex 16.710292704927937 182.82097856533352 -61.78564064605527
+ vertex 167.04448283908783 -76.79369780607902 -61.94548132206259
+ endloop
+endfacet
+facet normal 0.33141357403558563 0.19134171618259377 0.9238795325112789
+ outer loop
+ vertex 166.71029270492747 -76.98664256999696 -61.78564064605518
+ vertex 167.04448283908783 -76.79369780607902 -61.94548132206259
+ vertex 16.710292704927937 182.82097856533352 -61.78564064605527
+ endloop
+endfacet
+facet normal 0.8001031451912346 0.4619397662556795 0.38268343236511065
+ outer loop
+ vertex 16.064686941975005 182.44823790430232 -60.814110472164195
+ vertex 166.06468694197451 -77.35938323102825 -60.8141104721641
+ vertex 16.20311302795551 182.528158242306 -61.20000000000016
+ endloop
+endfacet
+facet normal 0.8001031451912346 0.4619397662556795 0.38268343236511065
+ outer loop
+ vertex 166.20311302795503 -77.27946289302447 -61.20000000000007
+ vertex 16.20311302795551 182.528158242306 -61.20000000000016
+ vertex 166.06468694197451 -77.35938323102825 -60.8141104721641
+ endloop
+endfacet
+facet normal 0.3314135740355424 0.19134171618257165 0.923879532511299
+ outer loop
+ vertex 17.044482839087998 183.013923329252 -46.345481322062675
+ vertex 16.71029270492767 182.820978565334 -46.185640646055276
+ vertex 167.0444828390875 -76.79369780607853 -46.34548132206258
+ endloop
+endfacet
+facet normal 0.3314135740355424 0.19134171618257165 0.923879532511299
+ outer loop
+ vertex 166.71029270492718 -76.9866425699965 -46.18564064605519
+ vertex 167.0444828390875 -76.79369780607853 -46.34548132206258
+ vertex 16.71029270492767 182.820978565334 -46.185640646055276
+ endloop
+endfacet
+facet normal -0.5272028623656598 -0.3043807145043362 0.7933533402912507
+ outer loop
+ vertex 18.382908925068453 183.7866639902833 -45.93137084989868
+ vertex 18.095933350982747 183.62097856533404 -46.18564064605529
+ vertex 168.382908925068 -76.0209571450472 -45.93137084989857
+ endloop
+endfacet
+facet normal -0.5272028623656598 -0.3043807145043362 0.7933533402912507
+ outer loop
+ vertex 168.09593335098225 -76.18664256999647 -46.18564064605519
+ vertex 168.382908925068 -76.0209571450472 -45.93137084989857
+ vertex 18.095933350982747 183.62097856533404 -46.18564064605529
+ endloop
+endfacet
+facet normal 0.8586164364012403 0.4957224306869383 -0.13052619222006184
+ outer loop
+ vertex 16.06468694197501 182.44823790430235 -59.98588952783613
+ vertex 166.06468694197454 -77.35938323102819 -59.98588952783604
+ vertex 16.017472381900408 182.42097856533357 -60.40000000000016
+ endloop
+endfacet
+facet normal 0.8586164364012403 0.4957224306869383 -0.13052619222006184
+ outer loop
+ vertex 166.0174723818999 -77.38664256999691 -60.40000000000007
+ vertex 16.017472381900408 182.42097856533357 -60.40000000000016
+ vertex 166.06468694197454 -77.35938323102819 -59.98588952783604
+ endloop
+endfacet
+facet normal -0.5272028623656634 -0.3043807145043495 0.7933533402912432
+ outer loop
+ vertex 18.382908925068755 183.78666399028285 -61.53137084989868
+ vertex 18.095933350983042 183.6209785653336 -61.78564064605529
+ vertex 168.3829089250683 -76.0209571450477 -61.531370849898586
+ endloop
+endfacet
+facet normal -0.5272028623656634 -0.3043807145043495 0.7933533402912432
+ outer loop
+ vertex 168.09593335098256 -76.1866425699969 -61.7856406460552
+ vertex 168.3829089250683 -76.0209571450477 -61.531370849898586
+ vertex 18.095933350983042 183.6209785653336 -61.78564064605529
+ endloop
+endfacet
+facet normal -0.8001031451912616 -0.4619397662556725 0.38268343236506275
+ outer loop
+ vertex 18.741539113935957 183.9937192263649 -60.81411047216422
+ vertex 18.60311302795548 183.91379888836119 -61.20000000000018
+ vertex 168.74153911393546 -75.81390190896563 -60.814110472164124
+ endloop
+endfacet
+facet normal -0.8001031451912616 -0.4619397662556725 0.38268343236506275
+ outer loop
+ vertex 168.603113027955 -75.89382224696931 -61.20000000000009
+ vertex 168.74153911393546 -75.81390190896563 -60.814110472164124
+ vertex 18.60311302795548 183.91379888836119 -61.20000000000018
+ endloop
+endfacet
+facet normal -0.8586164364012474 -0.4957224306869311 -0.13052619222004347
+ outer loop
+ vertex 18.788753674010273 184.02097856533413 -44.8000000000002
+ vertex 168.78875367400983 -75.78664256999642 -44.800000000000104
+ vertex 18.74153911393566 183.9937192263654 -44.38588952783615
+ endloop
+endfacet
+facet normal -0.8586164364012474 -0.4957224306869311 -0.13052619222004347
+ outer loop
+ vertex 168.7415391139352 -75.81390190896514 -44.38588952783605
+ vertex 18.74153911393566 183.9937192263654 -44.38588952783615
+ vertex 168.78875367400983 -75.78664256999642 -44.800000000000104
+ endloop
+endfacet
+facet normal -0.8001031451912493 -0.4619397662556654 0.3826834323650974
+ outer loop
+ vertex 18.74153911393566 183.99371922636539 -45.214110472164236
+ vertex 18.603113027955175 183.91379888836167 -45.60000000000021
+ vertex 168.7415391139352 -75.81390190896518 -45.21411047216414
+ endloop
+endfacet
+facet normal -0.8001031451912493 -0.4619397662556654 0.3826834323650974
+ outer loop
+ vertex 168.60311302795475 -75.8938222469689 -45.6000000000001
+ vertex 168.7415391139352 -75.81390190896518 -45.21411047216414
+ vertex 18.603113027955175 183.91379888836167 -45.60000000000021
+ endloop
+endfacet
+facet normal 0.8001031451912448 0.4619397662556967 0.3826834323650685
+ outer loop
+ vertex 16.064686941974692 182.4482379043028 -45.21411047216418
+ vertex 166.06468694197426 -77.35938323102779 -45.214110472164094
+ vertex 16.203113027955208 182.5281582423065 -45.60000000000017
+ endloop
+endfacet
+facet normal 0.8001031451912448 0.4619397662556967 0.3826834323650685
+ outer loop
+ vertex 166.2031130279547 -77.27946289302402 -45.60000000000008
+ vertex 16.203113027955208 182.5281582423065 -45.60000000000017
+ vertex 166.06468694197426 -77.35938323102779 -45.214110472164094
+ endloop
+endfacet
+facet normal -0.11303899832184168 -0.06526309611000454 0.9914448613738089
+ outer loop
+ vertex 17.76174321682269 183.42803380141555 -61.94548132206268
+ vertex 17.40311302795549 183.22097856533355 -62.00000000000018
+ vertex 167.7617432168222 -76.37958733391493 -61.94548132206259
+ endloop
+endfacet
+facet normal -0.11303899832184168 -0.06526309611000454 0.9914448613738089
+ outer loop
+ vertex 167.403113027955 -76.58664256999695 -62.00000000000009
+ vertex 167.7617432168222 -76.37958733391493 -61.94548132206259
+ vertex 17.40311302795549 183.22097856533355 -62.00000000000018
+ endloop
+endfacet
+facet normal 0.1130389983218041 0.06526309611006595 0.9914448613738092
+ outer loop
+ vertex 17.40311302795549 183.22097856533355 -62.00000000000018
+ vertex 17.044482839088296 183.0139233292515 -61.94548132206268
+ vertex 167.403113027955 -76.58664256999695 -62.00000000000009
+ endloop
+endfacet
+facet normal 0.1130389983218041 0.06526309611006595 0.9914448613738092
+ outer loop
+ vertex 167.04448283908783 -76.79369780607902 -61.94548132206259
+ vertex 167.403113027955 -76.58664256999695 -62.00000000000009
+ vertex 17.044482839088296 183.0139233292515 -61.94548132206268
+ endloop
+endfacet
+facet normal -0.8001031451912449 -0.4619397662556855 -0.3826834323650818
+ outer loop
+ vertex 18.60311302795516 183.9137988883617 -44.000000000000185
+ vertex 18.74153911393566 183.9937192263654 -44.38588952783615
+ vertex 168.60311302795466 -75.89382224696875 -44.000000000000085
+ endloop
+endfacet
+facet normal -0.8001031451912449 -0.4619397662556855 -0.3826834323650818
+ outer loop
+ vertex 168.7415391139352 -75.81390190896514 -44.38588952783605
+ vertex 168.60311302795466 -75.89382224696875 -44.000000000000085
+ vertex 18.74153911393566 183.9937192263654 -44.38588952783615
+ endloop
+endfacet
+facet normal -0.5272028623656567 -0.3043807145044133 -0.7933533402912233
+ outer loop
+ vertex 18.38290892506843 183.7866639902834 -43.668629150101715
+ vertex 168.3829089250679 -76.0209571450471 -43.66862915010161
+ vertex 18.09593335098268 183.62097856533416 -43.41435935394507
+ endloop
+endfacet
+facet normal -0.5272028623656567 -0.3043807145044133 -0.7933533402912233
+ outer loop
+ vertex 168.09593335098222 -76.18664256999637 -43.414359353944974
+ vertex 18.09593335098268 183.62097856533416 -43.41435935394507
+ vertex 168.3829089250679 -76.0209571450471 -43.66862915010161
+ endloop
+endfacet
+facet normal 0.5272028623656622 0.30438071450441645 0.7933533402912182
+ outer loop
+ vertex 16.710292704927937 182.82097856533352 -61.78564064605527
+ vertex 16.423317130842236 182.6552931403843 -61.53137084989863
+ vertex 166.71029270492747 -76.98664256999696 -61.78564064605518
+ endloop
+endfacet
+facet normal 0.5272028623656622 0.30438071450441645 0.7933533402912182
+ outer loop
+ vertex 166.42331713084175 -77.15232799494622 -61.531370849898536
+ vertex 166.71029270492747 -76.98664256999696 -61.78564064605518
+ vertex 16.423317130842236 182.6552931403843 -61.53137084989863
+ endloop
+endfacet
+facet normal 0.8001031451912493 0.4619397662556654 -0.3826834323650974
+ outer loop
+ vertex 16.064686941974696 182.44823790430283 -44.38588952783612
+ vertex 16.203113027955183 182.52815824230652 -44.00000000000015
+ vertex 166.06468694197423 -77.35938323102775 -44.38588952783603
+ endloop
+endfacet
+facet normal 0.8001031451912493 0.4619397662556654 -0.3826834323650974
+ outer loop
+ vertex 166.20311302795469 -77.27946289302398 -44.00000000000006
+ vertex 166.06468694197423 -77.35938323102775 -44.38588952783603
+ vertex 16.203113027955183 182.52815824230652 -44.00000000000015
+ endloop
+endfacet
+facet normal 0.8001031451912616 0.4619397662556725 -0.38268343236506275
+ outer loop
+ vertex 16.06468694197501 182.44823790430235 -59.98588952783613
+ vertex 16.203113027955485 182.52815824230603 -59.600000000000165
+ vertex 166.06468694197454 -77.35938323102819 -59.98588952783604
+ endloop
+endfacet
+facet normal 0.8001031451912616 0.4619397662556725 -0.38268343236506275
+ outer loop
+ vertex 166.20311302795497 -77.27946289302443 -59.60000000000007
+ vertex 166.06468694197454 -77.35938323102819 -59.98588952783604
+ vertex 16.203113027955485 182.52815824230603 -59.600000000000165
+ endloop
+endfacet
+facet normal -0.6870641468694508 -0.3966766701456224 0.6087614290087167
+ outer loop
+ vertex 18.60311302795548 183.91379888836119 -61.20000000000018
+ vertex 18.382908925068755 183.78666399028285 -61.53137084989868
+ vertex 168.603113027955 -75.89382224696931 -61.20000000000009
+ endloop
+endfacet
+facet normal -0.6870641468694508 -0.3966766701456224 0.6087614290087167
+ outer loop
+ vertex 168.3829089250683 -76.0209571450477 -61.531370849898586
+ vertex 168.603113027955 -75.89382224696931 -61.20000000000009
+ vertex 18.382908925068755 183.78666399028285 -61.53137084989868
+ endloop
+endfacet
+facet normal -0.6870641468694392 -0.39667667014561564 0.6087614290087343
+ outer loop
+ vertex 18.603113027955175 183.91379888836167 -45.60000000000021
+ vertex 18.382908925068453 183.7866639902833 -45.93137084989868
+ vertex 168.60311302795475 -75.8938222469689 -45.6000000000001
+ endloop
+endfacet
+facet normal -0.6870641468694392 -0.39667667014561564 0.6087614290087343
+ outer loop
+ vertex 168.382908925068 -76.0209571450472 -45.93137084989857
+ vertex 168.60311302795475 -75.8938222469689 -45.6000000000001
+ vertex 18.382908925068453 183.7866639902833 -45.93137084989868
+ endloop
+endfacet
+facet normal -0.8586164364012403 -0.4957224306869383 0.13052619222006184
+ outer loop
+ vertex 32.25153541297298 191.7937192263653 -60.81411047216424
+ vertex 182.25153541297252 -68.01390190896524 -60.814110472164145
+ vertex 32.29874997304759 191.82097856533406 -60.400000000000205
+ endloop
+endfacet
+facet normal -0.8586164364012403 -0.4957224306869383 0.13052619222006184
+ outer loop
+ vertex 182.29874997304708 -67.98664256999643 -60.40000000000011
+ vertex 32.29874997304759 191.82097856533406 -60.400000000000205
+ vertex 182.25153541297252 -68.01390190896524 -60.814110472164145
+ endloop
+endfacet
+facet normal 0.5272028623656567 0.3043807145044133 0.7933533402912233
+ outer loop
+ vertex 30.220289003964965 190.62097856533393 -61.78564064605528
+ vertex 29.933313429879256 190.4552931403847 -61.53137084989864
+ vertex 180.2202890039645 -69.18664256999656 -61.785640646055185
+ endloop
+endfacet
+facet normal 0.5272028623656567 0.3043807145044133 0.7933533402912233
+ outer loop
+ vertex 179.93331342987878 -69.35232799494582 -61.53137084989855
+ vertex 180.2202890039645 -69.18664256999656 -61.785640646055185
+ vertex 29.933313429879256 190.4552931403847 -61.53137084989864
+ endloop
+endfacet
+facet normal -0.33141357403558563 -0.19134171618259377 -0.9238795325112789
+ outer loop
+ vertex 18.095933350983 183.6209785653337 -59.014359353945075
+ vertex 168.09593335098256 -76.18664256999686 -59.01435935394498
+ vertex 17.761743216822698 183.42803380141567 -58.854518677937655
+ endloop
+endfacet
+facet normal -0.33141357403558563 -0.19134171618259377 -0.9238795325112789
+ outer loop
+ vertex 167.76174321682214 -76.3795873339148 -58.85451867793757
+ vertex 17.761743216822698 183.42803380141567 -58.854518677937655
+ vertex 168.09593335098256 -76.18664256999686 -59.01435935394498
+ endloop
+endfacet
+facet normal 0.5272028623656522 0.30438071450434867 -0.793353340291251
+ outer loop
+ vertex 30.22028900396494 190.62097856533407 -59.01435935394506
+ vertex 180.22028900396444 -69.18664256999648 -59.014359353944975
+ vertex 29.93331342987922 190.45529314038478 -59.26862915010168
+ endloop
+endfacet
+facet normal 0.5272028623656522 0.30438071450434867 -0.793353340291251
+ outer loop
+ vertex 179.93331342987875 -69.35232799494572 -59.26862915010159
+ vertex 29.93331342987922 190.45529314038478 -59.26862915010168
+ vertex 180.22028900396444 -69.18664256999648 -59.014359353944975
+ endloop
+endfacet
+facet normal 0.5272028623656928 0.3043807145043665 -0.7933533402912171
+ outer loop
+ vertex 16.710292704927927 182.82097856533363 -59.01435935394505
+ vertex 166.7102927049274 -76.98664256999692 -59.01435935394496
+ vertex 16.42331713084222 182.65529314038437 -59.26862915010169
+ endloop
+endfacet
+facet normal 0.5272028623656928 0.3043807145043665 -0.7933533402912171
+ outer loop
+ vertex 166.4233171308417 -77.15232799494616 -59.2686291501016
+ vertex 16.42331713084222 182.65529314038437 -59.26862915010169
+ vertex 166.7102927049274 -76.98664256999692 -59.01435935394496
+ endloop
+endfacet
+facet normal -0.687064146869438 -0.3966766701456545 -0.6087614290087103
+ outer loop
+ vertex 18.38290892506873 183.78666399028293 -59.26862915010171
+ vertex 18.603113027955455 183.9137988883612 -59.600000000000186
+ vertex 168.38290892506822 -76.02095714504756 -59.268629150101624
+ endloop
+endfacet
+facet normal -0.687064146869438 -0.3966766701456545 -0.6087614290087103
+ outer loop
+ vertex 168.60311302795498 -75.89382224696931 -59.600000000000094
+ vertex 168.38290892506822 -76.02095714504756 -59.268629150101624
+ vertex 18.603113027955455 183.9137988883612 -59.600000000000186
+ endloop
+endfacet
+facet normal -0.33141357403561666 -0.19134171618253848 0.9238795325112792
+ outer loop
+ vertex 31.60592965002006 191.42097856533397 -61.78564064605529
+ vertex 31.271739515859746 191.22803380141596 -61.94548132206272
+ vertex 181.60592965001956 -68.38664256999647 -61.785640646055185
+ endloop
+endfacet
+facet normal -0.33141357403561666 -0.19134171618253848 0.9238795325112792
+ outer loop
+ vertex 181.27173951585925 -68.57958733391453 -61.945481322062605
+ vertex 181.60592965001956 -68.38664256999647 -61.785640646055185
+ vertex 31.271739515859746 191.22803380141596 -61.94548132206272
+ endloop
+endfacet
+facet normal -0.6870641468694392 -0.39667667014561564 0.6087614290087343
+ outer loop
+ vertex 32.113109326992486 191.71379888836157 -61.2000000000002
+ vertex 31.89290522410577 191.58666399028323 -61.53137084989868
+ vertex 182.11310932699197 -68.09382224696891 -61.20000000000012
+ endloop
+endfacet
+facet normal -0.6870641468694392 -0.39667667014561564 0.6087614290087343
+ outer loop
+ vertex 181.8929052241053 -68.22095714504731 -61.53137084989857
+ vertex 182.11310932699197 -68.09382224696891 -61.20000000000012
+ vertex 31.89290522410577 191.58666399028323 -61.53137084989868
+ endloop
+endfacet
+facet normal 0.33141357403554456 0.19134171618257287 0.923879532511298
+ outer loop
+ vertex 30.554479138125302 190.8139233292519 -61.945481322062676
+ vertex 30.220289003964965 190.62097856533393 -61.78564064605528
+ vertex 180.5544791381248 -68.99369780607854 -61.945481322062584
+ endloop
+endfacet
+facet normal 0.33141357403554456 0.19134171618257287 0.923879532511298
+ outer loop
+ vertex 180.2202890039645 -69.18664256999656 -61.785640646055185
+ vertex 180.5544791381248 -68.99369780607854 -61.945481322062584
+ vertex 30.220289003964965 190.62097856533393 -61.78564064605528
+ endloop
+endfacet
+facet normal 0.11303899832183621 0.06526309610999997 -0.9914448613738097
+ outer loop
+ vertex 17.403113027955477 183.22097856533367 -58.80000000000016
+ vertex 167.40311302795504 -76.58664256999687 -58.800000000000075
+ vertex 17.04448283908824 183.0139233292516 -58.854518677937655
+ endloop
+endfacet
+facet normal 0.11303899832183621 0.06526309610999997 -0.9914448613738097
+ outer loop
+ vertex 167.04448283908772 -76.7936978060789 -58.85451867793757
+ vertex 17.04448283908824 183.0139233292516 -58.854518677937655
+ vertex 167.40311302795504 -76.58664256999687 -58.800000000000075
+ endloop
+endfacet
+facet normal 0.6870641468694271 0.39667667014565383 0.6087614290087231
+ outer loop
+ vertex 29.7131093269925 190.3281582423064 -61.20000000000017
+ vertex 179.71310932699203 -69.47946289302408 -61.20000000000008
+ vertex 29.933313429879256 190.4552931403847 -61.53137084989864
+ endloop
+endfacet
+facet normal 0.6870641468694271 0.39667667014565383 0.6087614290087231
+ outer loop
+ vertex 179.93331342987878 -69.35232799494582 -61.53137084989855
+ vertex 29.933313429879256 190.4552931403847 -61.53137084989864
+ vertex 179.71310932699203 -69.47946289302408 -61.20000000000008
+ endloop
+endfacet
+facet normal 0.8001031451912449 0.4619397662556855 0.3826834323650818
+ outer loop
+ vertex 29.574683241012032 190.2482379043027 -60.8141104721642
+ vertex 179.57468324101154 -69.55938323102781 -60.81411047216411
+ vertex 29.7131093269925 190.3281582423064 -61.20000000000017
+ endloop
+endfacet
+facet normal 0.8001031451912449 0.4619397662556855 0.3826834323650818
+ outer loop
+ vertex 179.71310932699203 -69.47946289302408 -61.20000000000008
+ vertex 29.7131093269925 190.3281582423064 -61.20000000000017
+ vertex 179.57468324101154 -69.55938323102781 -60.81411047216411
+ endloop
+endfacet
+facet normal 0.8586164364012474 0.4957224306869311 0.13052619222004347
+ outer loop
+ vertex 29.574683241012032 190.2482379043027 -60.8141104721642
+ vertex 29.527468680937393 190.22097856533398 -60.40000000000015
+ vertex 179.57468324101154 -69.55938323102781 -60.81411047216411
+ endloop
+endfacet
+facet normal 0.8586164364012474 0.4957224306869311 0.13052619222004347
+ outer loop
+ vertex 179.5274686809369 -69.58664256999651 -60.400000000000055
+ vertex 179.57468324101154 -69.55938323102781 -60.81411047216411
+ vertex 29.527468680937393 190.22097856533398 -60.40000000000015
+ endloop
+endfacet
+facet normal 0.6870641468694335 0.3966766701456124 -0.6087614290087427
+ outer loop
+ vertex 16.203113027955485 182.52815824230603 -59.600000000000165
+ vertex 16.42331713084222 182.65529314038437 -59.26862915010169
+ vertex 166.20311302795497 -77.27946289302443 -59.60000000000007
+ endloop
+endfacet
+facet normal 0.6870641468694335 0.3966766701456124 -0.6087614290087427
+ outer loop
+ vertex 166.4233171308417 -77.15232799494616 -59.2686291501016
+ vertex 166.20311302795497 -77.27946289302443 -59.60000000000007
+ vertex 16.42331713084222 182.65529314038437 -59.26862915010169
+ endloop
+endfacet
+facet normal -0.858616436401251 -0.49572243068693317 -0.13052619222001063
+ outer loop
+ vertex 18.741539113935957 183.99371922636493 -59.98588952783615
+ vertex 18.788753674010536 184.02097856533365 -60.40000000000018
+ vertex 168.74153911393552 -75.81390190896563 -59.98588952783606
+ endloop
+endfacet
+facet normal -0.858616436401251 -0.49572243068693317 -0.13052619222001063
+ outer loop
+ vertex 168.78875367401005 -75.78664256999683 -60.40000000000009
+ vertex 168.74153911393552 -75.81390190896563 -59.98588952783606
+ vertex 18.788753674010536 184.02097856533365 -60.40000000000018
+ endloop
+endfacet
+facet normal -0.3314135740355424 -0.19134171618257165 -0.923879532511299
+ outer loop
+ vertex 31.60592965002002 191.42097856533408 -59.014359353945075
+ vertex 181.60592965001956 -68.38664256999643 -59.014359353944975
+ vertex 31.27173951585969 191.2280338014161 -58.85451867793769
+ endloop
+endfacet
+facet normal -0.3314135740355424 -0.19134171618257165 -0.923879532511299
+ outer loop
+ vertex 181.27173951585922 -68.5795873339144 -58.85451867793758
+ vertex 31.27173951585969 191.2280338014161 -58.85451867793769
+ vertex 181.60592965001956 -68.38664256999643 -59.014359353944975
+ endloop
+endfacet
+facet normal -0.6870641468694271 -0.39667667014565383 -0.6087614290087231
+ outer loop
+ vertex 31.89290522410574 191.5866639902833 -59.26862915010171
+ vertex 32.11310932699248 191.71379888836162 -59.600000000000186
+ vertex 181.89290522410522 -68.22095714504717 -59.26862915010161
+ endloop
+endfacet
+facet normal -0.6870641468694271 -0.39667667014565383 -0.6087614290087231
+ outer loop
+ vertex 182.11310932699197 -68.09382224696891 -59.600000000000094
+ vertex 181.89290522410522 -68.22095714504717 -59.26862915010161
+ vertex 32.11310932699248 191.71379888836162 -59.600000000000186
+ endloop
+endfacet
+facet normal 0.1130389983218027 0.06526309611006655 0.9914448613738092
+ outer loop
+ vertex 30.913109326992505 191.02097856533396 -62.00000000000017
+ vertex 30.554479138125302 190.8139233292519 -61.945481322062676
+ vertex 180.91310932699204 -68.78664256999656 -62.00000000000008
+ endloop
+endfacet
+facet normal 0.1130389983218027 0.06526309611006655 0.9914448613738092
+ outer loop
+ vertex 180.5544791381248 -68.99369780607854 -61.945481322062584
+ vertex 180.91310932699204 -68.78664256999656 -62.00000000000008
+ vertex 30.554479138125302 190.8139233292519 -61.945481322062676
+ endloop
+endfacet
+facet normal 0.6870641468694392 0.39667667014561564 -0.6087614290087343
+ outer loop
+ vertex 29.713109326992512 190.32815824230644 -59.60000000000015
+ vertex 29.93331342987922 190.45529314038478 -59.26862915010168
+ vertex 179.713109326992 -69.47946289302408 -59.60000000000006
+ endloop
+endfacet
+facet normal 0.6870641468694392 0.39667667014561564 -0.6087614290087343
+ outer loop
+ vertex 179.93331342987875 -69.35232799494572 -59.26862915010159
+ vertex 179.713109326992 -69.47946289302408 -59.60000000000006
+ vertex 29.93331342987922 190.45529314038478 -59.26862915010168
+ endloop
+endfacet
+facet normal -0.5272028623656546 -0.30438071450442333 -0.7933533402912207
+ outer loop
+ vertex 31.89290522410574 191.5866639902833 -59.26862915010171
+ vertex 181.89290522410522 -68.22095714504717 -59.26862915010161
+ vertex 31.60592965002002 191.42097856533408 -59.014359353945075
+ endloop
+endfacet
+facet normal -0.5272028623656546 -0.30438071450442333 -0.7933533402912207
+ outer loop
+ vertex 181.60592965001956 -68.38664256999643 -59.014359353944975
+ vertex 31.60592965002002 191.42097856533408 -59.014359353945075
+ vertex 181.89290522410522 -68.22095714504717 -59.26862915010161
+ endloop
+endfacet
+facet normal 0.3314135740355813 0.19134171618251242 -0.9238795325112973
+ outer loop
+ vertex 17.04448283908824 183.0139233292516 -58.854518677937655
+ vertex 167.04448283908772 -76.7936978060789 -58.85451867793757
+ vertex 16.710292704927927 182.82097856533363 -59.01435935394505
+ endloop
+endfacet
+facet normal 0.3314135740355813 0.19134171618251242 -0.9238795325112973
+ outer loop
+ vertex 166.7102927049274 -76.98664256999692 -59.01435935394496
+ vertex 16.710292704927927 182.82097856533363 -59.01435935394505
+ vertex 167.04448283908772 -76.7936978060789 -58.85451867793757
+ endloop
+endfacet
+facet normal -0.5272028623656622 -0.30438071450441645 -0.7933533402912182
+ outer loop
+ vertex 18.38290892506873 183.78666399028293 -59.26862915010171
+ vertex 168.38290892506822 -76.02095714504756 -59.268629150101624
+ vertex 18.095933350983 183.6209785653337 -59.014359353945075
+ endloop
+endfacet
+facet normal -0.5272028623656622 -0.30438071450441645 -0.7933533402912182
+ outer loop
+ vertex 168.09593335098256 -76.18664256999686 -59.01435935394498
+ vertex 18.095933350983 183.6209785653337 -59.014359353945075
+ vertex 168.38290892506822 -76.02095714504756 -59.268629150101624
+ endloop
+endfacet
+facet normal -0.8001031451912493 -0.4619397662556654 0.3826834323650974
+ outer loop
+ vertex 32.25153541297298 191.7937192263653 -60.81411047216424
+ vertex 32.113109326992486 191.71379888836157 -61.2000000000002
+ vertex 182.25153541297252 -68.01390190896524 -60.814110472164145
+ endloop
+endfacet
+facet normal -0.8001031451912493 -0.4619397662556654 0.3826834323650974
+ outer loop
+ vertex 182.11310932699197 -68.09382224696891 -61.20000000000012
+ vertex 182.25153541297252 -68.01390190896524 -60.814110472164145
+ vertex 32.113109326992486 191.71379888836157 -61.2000000000002
+ endloop
+endfacet
+facet normal 0.8586164364012403 0.4957224306869383 -0.13052619222006184
+ outer loop
+ vertex 29.527468680937393 190.22097856533398 -60.40000000000015
+ vertex 29.574683241012004 190.2482379043027 -59.985889527836115
+ vertex 179.5274686809369 -69.58664256999651 -60.400000000000055
+ endloop
+endfacet
+facet normal 0.8586164364012403 0.4957224306869383 -0.13052619222006184
+ outer loop
+ vertex 179.57468324101154 -69.55938323102781 -59.98588952783603
+ vertex 179.5274686809369 -69.58664256999651 -60.400000000000055
+ vertex 29.574683241012004 190.2482379043027 -59.985889527836115
+ endloop
+endfacet
+facet normal -0.5272028623656598 -0.3043807145043362 0.7933533402912507
+ outer loop
+ vertex 31.89290522410577 191.58666399028323 -61.53137084989868
+ vertex 31.60592965002006 191.42097856533397 -61.78564064605529
+ vertex 181.8929052241053 -68.22095714504731 -61.53137084989857
+ endloop
+endfacet
+facet normal -0.5272028623656598 -0.3043807145043362 0.7933533402912507
+ outer loop
+ vertex 181.60592965001956 -68.38664256999647 -61.785640646055185
+ vertex 181.8929052241053 -68.22095714504731 -61.53137084989857
+ vertex 31.60592965002006 191.42097856533397 -61.78564064605529
+ endloop
+endfacet
+facet normal -0.1130389983218041 -0.06526309611006595 -0.9914448613738092
+ outer loop
+ vertex 31.27173951585969 191.2280338014161 -58.85451867793769
+ vertex 181.27173951585922 -68.5795873339144 -58.85451867793758
+ vertex 30.913109326992483 191.02097856533405 -58.800000000000175
+ endloop
+endfacet
+facet normal -0.1130389983218041 -0.06526309611006595 -0.9914448613738092
+ outer loop
+ vertex 180.91310932699201 -68.78664256999643 -58.80000000000008
+ vertex 30.913109326992483 191.02097856533405 -58.800000000000175
+ vertex 181.27173951585922 -68.5795873339144 -58.85451867793758
+ endloop
+endfacet
+facet normal -0.8586164364012474 -0.4957224306869311 -0.130526192220043
+ outer loop
+ vertex 32.25153541297297 191.7937192263653 -59.98588952783617
+ vertex 32.29874997304759 191.82097856533406 -60.400000000000205
+ vertex 182.25153541297246 -68.0139019089652 -59.985889527836086
+ endloop
+endfacet
+facet normal -0.8586164364012474 -0.4957224306869311 -0.130526192220043
+ outer loop
+ vertex 182.29874997304708 -67.98664256999643 -60.40000000000011
+ vertex 182.25153541297246 -68.0139019089652 -59.985889527836086
+ vertex 32.29874997304759 191.82097856533406 -60.400000000000205
+ endloop
+endfacet
+facet normal -0.8001031451912346 -0.4619397662556795 -0.38268343236511065
+ outer loop
+ vertex 18.741539113935957 183.99371922636493 -59.98588952783615
+ vertex 168.74153911393552 -75.81390190896563 -59.98588952783606
+ vertex 18.603113027955455 183.9137988883612 -59.600000000000186
+ endloop
+endfacet
+facet normal -0.8001031451912346 -0.4619397662556795 -0.38268343236511065
+ outer loop
+ vertex 168.60311302795498 -75.89382224696931 -59.600000000000094
+ vertex 18.603113027955455 183.9137988883612 -59.600000000000186
+ vertex 168.74153911393552 -75.81390190896563 -59.98588952783606
+ endloop
+endfacet
+facet normal -0.11303899832179491 -0.06526309610997753 0.9914448613738159
+ outer loop
+ vertex 31.271739515859746 191.22803380141596 -61.94548132206272
+ vertex 30.913109326992505 191.02097856533396 -62.00000000000017
+ vertex 181.27173951585925 -68.57958733391453 -61.945481322062605
+ endloop
+endfacet
+facet normal -0.11303899832179491 -0.06526309610997753 0.9914448613738159
+ outer loop
+ vertex 180.91310932699204 -68.78664256999656 -62.00000000000008
+ vertex 181.27173951585925 -68.57958733391453 -61.945481322062605
+ vertex 30.913109326992505 191.02097856533396 -62.00000000000017
+ endloop
+endfacet
+facet normal -0.8001031451912448 -0.4619397662556967 -0.3826834323650685
+ outer loop
+ vertex 32.11310932699248 191.71379888836162 -59.600000000000186
+ vertex 32.25153541297297 191.7937192263653 -59.98588952783617
+ vertex 182.11310932699197 -68.09382224696891 -59.600000000000094
+ endloop
+endfacet
+facet normal -0.8001031451912448 -0.4619397662556967 -0.3826834323650685
+ outer loop
+ vertex 182.25153541297246 -68.0139019089652 -59.985889527836086
+ vertex 182.11310932699197 -68.09382224696891 -59.600000000000094
+ vertex 32.25153541297297 191.7937192263653 -59.98588952783617
+ endloop
+endfacet
+facet normal 0.8001031451912493 0.4619397662556654 -0.3826834323650974
+ outer loop
+ vertex 29.574683241012004 190.2482379043027 -59.985889527836115
+ vertex 29.713109326992512 190.32815824230644 -59.60000000000015
+ vertex 179.57468324101154 -69.55938323102781 -59.98588952783603
+ endloop
+endfacet
+facet normal 0.8001031451912493 0.4619397662556654 -0.3826834323650974
+ outer loop
+ vertex 179.713109326992 -69.47946289302408 -59.60000000000006
+ vertex 179.57468324101154 -69.55938323102781 -59.98588952783603
+ vertex 29.713109326992512 190.32815824230644 -59.60000000000015
+ endloop
+endfacet
+facet normal -0.1130389983218041 -0.06526309611006595 -0.9914448613738092
+ outer loop
+ vertex 17.761743216822698 183.42803380141567 -58.854518677937655
+ vertex 167.76174321682214 -76.3795873339148 -58.85451867793757
+ vertex 17.403113027955477 183.22097856533367 -58.80000000000016
+ endloop
+endfacet
+facet normal -0.1130389983218041 -0.06526309611006595 -0.9914448613738092
+ outer loop
+ vertex 167.40311302795504 -76.58664256999687 -58.800000000000075
+ vertex 17.403113027955477 183.22097856533367 -58.80000000000016
+ vertex 167.76174321682214 -76.3795873339148 -58.85451867793757
+ endloop
+endfacet
+facet normal 0.8001031451912346 0.4619397662556795 0.38268343236511065
+ outer loop
+ vertex 29.713109326992253 190.3281582423069 -45.60000000000019
+ vertex 29.574683241011737 190.24823790430318 -45.21411047216423
+ vertex 179.71310932699177 -69.47946289302364 -45.6000000000001
+ endloop
+endfacet
+facet normal 0.8001031451912346 0.4619397662556795 0.38268343236511065
+ outer loop
+ vertex 179.57468324101126 -69.55938323102735 -45.21411047216414
+ vertex 179.71310932699177 -69.47946289302364 -45.6000000000001
+ vertex 29.574683241011737 190.24823790430318 -45.21411047216423
+ endloop
+endfacet
+facet normal 0.858616436401251 0.49572243068693317 0.13052619222001063
+ outer loop
+ vertex 29.574683241011737 190.24823790430318 -45.21411047216423
+ vertex 29.527468680937115 190.22097856533443 -44.800000000000196
+ vertex 179.57468324101126 -69.55938323102735 -45.21411047216414
+ endloop
+endfacet
+facet normal 0.858616436401251 0.49572243068693317 0.13052619222001063
+ outer loop
+ vertex 179.52746868093664 -69.58664256999607 -44.800000000000104
+ vertex 179.57468324101126 -69.55938323102735 -45.21411047216414
+ vertex 29.527468680937115 190.22097856533443 -44.800000000000196
+ endloop
+endfacet
+facet normal 0.8001031451912616 0.4619397662556725 -0.38268343236506275
+ outer loop
+ vertex 29.574683241011734 190.24823790430324 -44.38588952783616
+ vertex 29.713109326992214 190.32815824230693 -44.0000000000002
+ vertex 179.57468324101126 -69.55938323102731 -44.38588952783607
+ endloop
+endfacet
+facet normal 0.8001031451912616 0.4619397662556725 -0.38268343236506275
+ outer loop
+ vertex 179.71310932699177 -69.4794628930236 -44.00000000000011
+ vertex 179.57468324101126 -69.55938323102731 -44.38588952783607
+ vertex 29.713109326992214 190.32815824230693 -44.0000000000002
+ endloop
+endfacet
+facet normal 0.8586164364012403 0.4957224306869383 -0.13052619222006184
+ outer loop
+ vertex 29.527468680937115 190.22097856533443 -44.800000000000196
+ vertex 29.574683241011734 190.24823790430324 -44.38588952783616
+ vertex 179.52746868093664 -69.58664256999607 -44.800000000000104
+ endloop
+endfacet
+facet normal 0.8586164364012403 0.4957224306869383 -0.13052619222006184
+ outer loop
+ vertex 179.57468324101126 -69.55938323102731 -44.38588952783607
+ vertex 179.52746868093664 -69.58664256999607 -44.800000000000104
+ vertex 29.574683241011734 190.24823790430324 -44.38588952783616
+ endloop
+endfacet
+facet normal 0.11303899832179477 0.06526309610997605 -0.991444861373816
+ outer loop
+ vertex 30.913109326992483 191.02097856533405 -58.800000000000175
+ vertex 180.91310932699201 -68.78664256999643 -58.80000000000008
+ vertex 30.554479138125252 190.81392332925202 -58.85451867793765
+ endloop
+endfacet
+facet normal 0.11303899832179477 0.06526309610997605 -0.991444861373816
+ outer loop
+ vertex 180.5544791381248 -68.9936978060785 -58.854518677937556
+ vertex 30.554479138125252 190.81392332925202 -58.85451867793765
+ vertex 180.91310932699201 -68.78664256999643 -58.80000000000008
+ endloop
+endfacet
+facet normal 0.11303899832184168 0.06526309611000454 -0.9914448613738089
+ outer loop
+ vertex 30.913109326992203 191.02097856533456 -43.20000000000018
+ vertex 180.91310932699176 -68.78664256999598 -43.20000000000011
+ vertex 30.554479138125014 190.8139233292525 -43.254518677937675
+ endloop
+endfacet
+facet normal 0.11303899832184168 0.06526309611000454 -0.9914448613738089
+ outer loop
+ vertex 180.5544791381245 -68.993697806078 -43.254518677937604
+ vertex 30.554479138125014 190.8139233292525 -43.254518677937675
+ vertex 180.91310932699176 -68.78664256999598 -43.20000000000011
+ endloop
+endfacet
+facet normal -0.8586164364012511 -0.4957224306869332 -0.1305261922200104
+ outer loop
+ vertex 32.25153541297268 191.79371922636582 -44.38588952783617
+ vertex 32.298749973047286 191.82097856533454 -44.8000000000002
+ vertex 182.2515354129722 -68.0139019089647 -44.38588952783608
+ endloop
+endfacet
+facet normal -0.8586164364012511 -0.4957224306869332 -0.1305261922200104
+ outer loop
+ vertex 182.2987499730468 -67.98664256999594 -44.80000000000011
+ vertex 182.2515354129722 -68.0139019089647 -44.38588952783608
+ vertex 32.298749973047286 191.82097856533454 -44.8000000000002
+ endloop
+endfacet
+facet normal -0.6870641468694358 -0.39667667014560815 0.6087614290087431
+ outer loop
+ vertex 32.113109326992195 191.71379888836208 -45.6000000000002
+ vertex 31.89290522410548 191.5866639902837 -45.93137084989867
+ vertex 182.11310932699172 -68.09382224696841 -45.60000000000011
+ endloop
+endfacet
+facet normal -0.6870641468694358 -0.39667667014560815 0.6087614290087431
+ outer loop
+ vertex 181.892905224105 -68.22095714504681 -45.93137084989858
+ vertex 182.11310932699172 -68.09382224696841 -45.60000000000011
+ vertex 31.89290522410548 191.5866639902837 -45.93137084989867
+ endloop
+endfacet
+facet normal 0.33141357403556354 0.19134171618250495 -0.9238795325113052
+ outer loop
+ vertex 30.554479138125014 190.8139233292525 -43.254518677937675
+ vertex 180.5544791381245 -68.993697806078 -43.254518677937604
+ vertex 30.22028900396464 190.6209785653345 -43.41435935394508
+ endloop
+endfacet
+facet normal 0.33141357403556354 0.19134171618250495 -0.9238795325113052
+ outer loop
+ vertex 180.22028900396418 -69.18664256999598 -43.414359353944995
+ vertex 30.22028900396464 190.6209785653345 -43.41435935394508
+ vertex 180.5544791381245 -68.993697806078 -43.254518677937604
+ endloop
+endfacet
+facet normal -0.5272028623656928 -0.3043807145043665 0.7933533402912171
+ outer loop
+ vertex 31.89290522410548 191.5866639902837 -45.93137084989867
+ vertex 31.60592965001976 191.42097856533448 -46.185640646055305
+ vertex 181.892905224105 -68.22095714504681 -45.93137084989858
+ endloop
+endfacet
+facet normal -0.5272028623656928 -0.3043807145043665 0.7933533402912171
+ outer loop
+ vertex 181.60592965001933 -68.38664256999607 -46.18564064605523
+ vertex 181.892905224105 -68.22095714504681 -45.93137084989858
+ vertex 31.60592965001976 191.42097856533448 -46.185640646055305
+ endloop
+endfacet
+facet normal -0.5272028623656327 -0.30438071450439946 -0.7933533402912443
+ outer loop
+ vertex 31.89290522410545 191.58666399028382 -43.66862915010171
+ vertex 181.89290522410496 -68.22095714504667 -43.668629150101616
+ vertex 31.60592965001975 191.4209785653346 -43.414359353945095
+ endloop
+endfacet
+facet normal -0.5272028623656327 -0.30438071450439946 -0.7933533402912443
+ outer loop
+ vertex 181.60592965001928 -68.38664256999598 -43.414359353945
+ vertex 31.60592965001975 191.4209785653346 -43.414359353945095
+ vertex 181.89290522410496 -68.22095714504667 -43.668629150101616
+ endloop
+endfacet
+facet normal -0.11303899832183621 -0.06526309610999997 0.9914448613738097
+ outer loop
+ vertex 31.27173951585947 191.22803380141644 -46.3454813220627
+ vertex 30.913109326992235 191.0209785653344 -46.4000000000002
+ vertex 181.27173951585897 -68.57958733391399 -46.345481322062625
+ endloop
+endfacet
+facet normal -0.11303899832183621 -0.06526309610999997 0.9914448613738097
+ outer loop
+ vertex 180.9131093269917 -68.78664256999602 -46.40000000000013
+ vertex 181.27173951585897 -68.57958733391399 -46.345481322062625
+ vertex 30.913109326992235 191.0209785653344 -46.4000000000002
+ endloop
+endfacet
+facet normal 0.5272028623656622 0.30438071450441645 0.7933533402912182
+ outer loop
+ vertex 30.220289003964698 190.6209785653344 -46.1856406460553
+ vertex 29.93331342987896 190.45529314038518 -45.931370849898656
+ vertex 180.2202890039642 -69.18664256999615 -46.18564064605521
+ endloop
+endfacet
+facet normal 0.5272028623656622 0.30438071450441645 0.7933533402912182
+ outer loop
+ vertex 179.9333134298785 -69.35232799494533 -45.93137084989857
+ vertex 180.2202890039642 -69.18664256999615 -46.18564064605521
+ vertex 29.93331342987896 190.45529314038518 -45.931370849898656
+ endloop
+endfacet
+facet normal 0.687064146869438 0.3966766701456545 0.6087614290087103
+ outer loop
+ vertex 29.713109326992253 190.3281582423069 -45.60000000000019
+ vertex 179.71310932699177 -69.47946289302364 -45.6000000000001
+ vertex 29.93331342987896 190.45529314038518 -45.931370849898656
+ endloop
+endfacet
+facet normal 0.687064146869438 0.3966766701456545 0.6087614290087103
+ outer loop
+ vertex 179.9333134298785 -69.35232799494533 -45.93137084989857
+ vertex 29.93331342987896 190.45529314038518 -45.931370849898656
+ vertex 179.71310932699177 -69.47946289302364 -45.6000000000001
+ endloop
+endfacet
+facet normal -0.6870641468694481 -0.39667667014567715 -0.6087614290086841
+ outer loop
+ vertex 31.89290522410545 191.58666399028382 -43.66862915010171
+ vertex 32.11310932699219 191.7137988883621 -44.0000000000002
+ vertex 181.89290522410496 -68.22095714504667 -43.668629150101616
+ endloop
+endfacet
+facet normal -0.6870641468694481 -0.39667667014567715 -0.6087614290086841
+ outer loop
+ vertex 182.1131093269917 -68.09382224696837 -44.000000000000114
+ vertex 181.89290522410496 -68.22095714504667 -43.668629150101616
+ vertex 32.11310932699219 191.7137988883621 -44.0000000000002
+ endloop
+endfacet
+facet normal -0.3314135740355858 -0.19134171618259388 -0.9238795325112787
+ outer loop
+ vertex 31.60592965001975 191.4209785653346 -43.414359353945095
+ vertex 181.60592965001928 -68.38664256999598 -43.414359353945
+ vertex 31.271739515859426 191.22803380141656 -43.254518677937675
+ endloop
+endfacet
+facet normal -0.3314135740355858 -0.19134171618259388 -0.9238795325112787
+ outer loop
+ vertex 181.2717395158589 -68.57958733391395 -43.2545186779376
+ vertex 31.271739515859426 191.22803380141656 -43.254518677937675
+ vertex 181.60592965001928 -68.38664256999598 -43.414359353945
+ endloop
+endfacet
+facet normal 0.5272028623656603 0.30438071450435333 -0.7933533402912438
+ outer loop
+ vertex 30.22028900396464 190.6209785653345 -43.41435935394508
+ vertex 180.22028900396418 -69.18664256999598 -43.414359353944995
+ vertex 29.933313429878947 190.45529314038527 -43.6686291501017
+ endloop
+endfacet
+facet normal 0.5272028623656603 0.30438071450435333 -0.7933533402912438
+ outer loop
+ vertex 179.93331342987844 -69.35232799494524 -43.66862915010161
+ vertex 29.933313429878947 190.45529314038527 -43.6686291501017
+ vertex 180.22028900396418 -69.18664256999598 -43.414359353944995
+ endloop
+endfacet
+facet normal -0.8001031451912347 -0.46193976625567956 -0.38268343236511054
+ outer loop
+ vertex 32.25153541297268 191.79371922636582 -44.38588952783617
+ vertex 182.2515354129722 -68.0139019089647 -44.38588952783608
+ vertex 32.11310932699219 191.7137988883621 -44.0000000000002
+ endloop
+endfacet
+facet normal -0.8001031451912347 -0.46193976625567956 -0.38268343236511054
+ outer loop
+ vertex 182.1131093269917 -68.09382224696837 -44.000000000000114
+ vertex 32.11310932699219 191.7137988883621 -44.0000000000002
+ vertex 182.2515354129722 -68.0139019089647 -44.38588952783608
+ endloop
+endfacet
+facet normal -0.8001031451912616 -0.4619397662556725 0.38268343236506275
+ outer loop
+ vertex 32.113109326992195 191.71379888836208 -45.6000000000002
+ vertex 182.11310932699172 -68.09382224696841 -45.60000000000011
+ vertex 32.251535412972686 191.79371922636577 -45.21411047216423
+ endloop
+endfacet
+facet normal -0.8001031451912616 -0.4619397662556725 0.38268343236506275
+ outer loop
+ vertex 182.25153541297223 -68.01390190896478 -45.214110472164144
+ vertex 32.251535412972686 191.79371922636577 -45.21411047216423
+ vertex 182.11310932699172 -68.09382224696841 -45.60000000000011
+ endloop
+endfacet
+facet normal 0.33141357403561666 0.19134171618253848 -0.9238795325112792
+ outer loop
+ vertex 30.554479138125252 190.81392332925202 -58.85451867793765
+ vertex 180.5544791381248 -68.9936978060785 -58.854518677937556
+ vertex 30.22028900396494 190.62097856533407 -59.01435935394506
+ endloop
+endfacet
+facet normal 0.33141357403561666 0.19134171618253848 -0.9238795325112792
+ outer loop
+ vertex 180.22028900396444 -69.18664256999648 -59.014359353944975
+ vertex 30.22028900396494 190.62097856533407 -59.01435935394506
+ vertex 180.5544791381248 -68.9936978060785 -58.854518677937556
+ endloop
+endfacet
+facet normal 0.6870641468694508 0.3966766701456224 -0.6087614290087167
+ outer loop
+ vertex 29.713109326992214 190.32815824230693 -44.0000000000002
+ vertex 29.933313429878947 190.45529314038527 -43.6686291501017
+ vertex 179.71310932699177 -69.4794628930236 -44.00000000000011
+ endloop
+endfacet
+facet normal 0.6870641468694508 0.3966766701456224 -0.6087614290087167
+ outer loop
+ vertex 179.93331342987844 -69.35232799494524 -43.66862915010161
+ vertex 179.71310932699177 -69.4794628930236 -44.00000000000011
+ vertex 29.933313429878947 190.45529314038527 -43.6686291501017
+ endloop
+endfacet
+facet normal -0.1130389983218041 -0.06526309611006595 -0.9914448613738092
+ outer loop
+ vertex 31.271739515859426 191.22803380141656 -43.254518677937675
+ vertex 181.2717395158589 -68.57958733391395 -43.2545186779376
+ vertex 30.913109326992203 191.02097856533456 -43.20000000000018
+ endloop
+endfacet
+facet normal -0.1130389983218041 -0.06526309611006595 -0.9914448613738092
+ outer loop
+ vertex 180.91310932699176 -68.78664256999598 -43.20000000000011
+ vertex 30.913109326992203 191.02097856533456 -43.20000000000018
+ vertex 181.2717395158589 -68.57958733391395 -43.2545186779376
+ endloop
+endfacet
+facet normal -0.3314135740355813 -0.19134171618251242 0.9238795325112973
+ outer loop
+ vertex 31.60592965001976 191.42097856533448 -46.185640646055305
+ vertex 31.27173951585947 191.22803380141644 -46.3454813220627
+ vertex 181.60592965001933 -68.38664256999607 -46.18564064605523
+ endloop
+endfacet
+facet normal -0.3314135740355813 -0.19134171618251242 0.9238795325112973
+ outer loop
+ vertex 181.27173951585897 -68.57958733391399 -46.345481322062625
+ vertex 181.60592965001933 -68.38664256999607 -46.18564064605523
+ vertex 31.27173951585947 191.22803380141644 -46.3454813220627
+ endloop
+endfacet
+facet normal 0.33141357403558563 0.19134171618259377 0.9238795325112789
+ outer loop
+ vertex 30.554479138125004 190.8139233292524 -46.3454813220627
+ vertex 30.220289003964698 190.6209785653344 -46.1856406460553
+ vertex 180.55447913812455 -68.99369780607815 -46.345481322062625
+ endloop
+endfacet
+facet normal 0.33141357403558563 0.19134171618259377 0.9238795325112789
+ outer loop
+ vertex 180.2202890039642 -69.18664256999615 -46.18564064605521
+ vertex 180.55447913812455 -68.99369780607815 -46.345481322062625
+ vertex 30.220289003964698 190.6209785653344 -46.1856406460553
+ endloop
+endfacet
+facet normal -0.8586164364012403 -0.4957224306869383 0.13052619222006204
+ outer loop
+ vertex 32.251535412972686 191.79371922636577 -45.21411047216423
+ vertex 182.25153541297223 -68.01390190896478 -45.214110472164144
+ vertex 32.298749973047286 191.82097856533454 -44.8000000000002
+ endloop
+endfacet
+facet normal -0.8586164364012403 -0.4957224306869383 0.13052619222006204
+ outer loop
+ vertex 182.2987499730468 -67.98664256999594 -44.80000000000011
+ vertex 32.298749973047286 191.82097856533454 -44.8000000000002
+ vertex 182.25153541297223 -68.01390190896478 -45.214110472164144
+ endloop
+endfacet
+facet normal 0.1130389983218041 0.06526309611006595 0.9914448613738092
+ outer loop
+ vertex 30.913109326992235 191.0209785653344 -46.4000000000002
+ vertex 30.554479138125004 190.8139233292524 -46.3454813220627
+ vertex 180.9131093269917 -68.78664256999602 -46.40000000000013
+ endloop
+endfacet
+facet normal 0.1130389983218041 0.06526309611006595 0.9914448613738092
+ outer loop
+ vertex 180.55447913812455 -68.99369780607815 -46.345481322062625
+ vertex 180.9131093269917 -68.78664256999602 -46.40000000000013
+ vertex 30.554479138125004 190.8139233292524 -46.3454813220627
+ endloop
+endfacet
+facet normal 0.8586164364012411 0.4957224306869387 -0.1305261922200554
+ outer loop
+ vertex 32.78885611527162 192.1039414784786 -61.85881904510269
+ vertex 32.818365215318266 192.12097856533407 -61.60000000000018
+ vertex 182.78885611527113 -67.70367965685196 -61.8588190451026
+ endloop
+endfacet
+facet normal 0.8586164364012411 0.4957224306869387 -0.1305261922200554
+ outer loop
+ vertex 182.81836521531775 -67.6866425699965 -61.60000000000009
+ vertex 182.78885611527113 -67.70367965685196 -61.8588190451026
+ vertex 32.818365215318266 192.12097856533407 -61.60000000000018
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 -1.5003536199769242e-15
+ outer loop
+ vertex 32.81836521531815 192.1209785653342 -56.40000000000017
+ vertex 182.8183652153177 -67.68664256999637 -56.40000000000008
+ vertex 32.818365215318266 192.12097856533407 -61.60000000000018
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 -1.5003536199769242e-15
+ outer loop
+ vertex 182.81836521531775 -67.6866425699965 -61.60000000000009
+ vertex 32.818365215318266 192.12097856533407 -61.60000000000018
+ vertex 182.8183652153177 -67.68664256999637 -56.40000000000008
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 4.4649600931051686e-15
+ outer loop
+ vertex 32.47195505380439 191.9209785653342 -56.40000000000017
+ vertex 32.471955053804386 191.92097856533422 -56.00000000000017
+ vertex 182.4719550538039 -67.88664256999631 -56.40000000000008
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 4.4649600931051686e-15
+ outer loop
+ vertex 182.4719550538039 -67.88664256999627 -56.00000000000008
+ vertex 182.4719550538039 -67.88664256999631 -56.40000000000008
+ vertex 32.471955053804386 191.92097856533422 -56.00000000000017
+ endloop
+endfacet
+facet normal -1.877717253503254e-14 3.0643012873322636e-14 1.0
+ outer loop
+ vertex 31.259519488506204 191.2209785653341 -58.200000000000195
+ vertex 29.497751387223385 190.20382127780866 -58.20000000000017
+ vertex 181.25951948850573 -68.58664256999639 -58.20000000000009
+ endloop
+endfacet
+facet normal -1.877717253503254e-14 3.0643012873322636e-14 1.0
+ outer loop
+ vertex 179.4977513872229 -69.60379985752186 -58.20000000000009
+ vertex 181.25951948850573 -68.58664256999639 -58.20000000000009
+ vertex 29.497751387223385 190.20382127780866 -58.20000000000017
+ endloop
+endfacet
+facet normal 0.8001031451912562 0.46193976625566946 -0.3826834323650779
+ outer loop
+ vertex 32.70233981153382 192.05399126722622 -62.10000000000018
+ vertex 32.78885611527162 192.1039414784786 -61.85881904510269
+ vertex 182.70233981153334 -67.75362986810428 -62.10000000000009
+ endloop
+endfacet
+facet normal 0.8001031451912562 0.46193976625566946 -0.3826834323650779
+ outer loop
+ vertex 182.78885611527113 -67.70367965685196 -61.8588190451026
+ vertex 182.70233981153334 -67.75362986810428 -62.10000000000009
+ vertex 32.78885611527162 192.1039414784786 -61.85881904510269
+ endloop
+endfacet
+facet normal 0.6123724356957724 0.3535533905933076 0.7071067811865499
+ outer loop
+ vertex 29.497751387223385 190.20382127780866 -58.20000000000017
+ vertex 27.36240517147627 188.97097856533406 -55.73431457505093
+ vertex 179.4977513872229 -69.60379985752186 -58.20000000000009
+ endloop
+endfacet
+facet normal 0.6123724356957724 0.3535533905933076 0.7071067811865499
+ outer loop
+ vertex 177.36240517147576 -70.83664256999646 -55.734314575050846
+ vertex 179.4977513872229 -69.60379985752186 -58.20000000000009
+ vertex 27.36240517147627 188.97097856533406 -55.73431457505093
+ endloop
+endfacet
+facet normal -3.273238745907272e-14 2.2585965780328017e-14 1.0
+ outer loop
+ vertex 32.471955053804386 191.92097856533422 -56.00000000000017
+ vertex 31.259519488506168 191.22097856533415 -56.0000000000002
+ vertex 182.4719550538039 -67.88664256999627 -56.00000000000008
+ endloop
+endfacet
+facet normal -3.273238745907272e-14 2.2585965780328017e-14 1.0
+ outer loop
+ vertex 181.2595194885057 -68.58664256999634 -56.00000000000009
+ vertex 182.4719550538039 -67.88664256999627 -56.00000000000008
+ vertex 31.259519488506168 191.22097856533415 -56.0000000000002
+ endloop
+endfacet
+facet normal -1.877717253503254e-14 3.0643012873322636e-14 1.0
+ outer loop
+ vertex 32.81836521531815 192.1209785653342 -56.40000000000017
+ vertex 32.47195505380439 191.9209785653342 -56.40000000000017
+ vertex 182.8183652153177 -67.68664256999637 -56.40000000000008
+ endloop
+endfacet
+facet normal -1.877717253503254e-14 3.0643012873322636e-14 1.0
+ outer loop
+ vertex 182.4719550538039 -67.88664256999631 -56.40000000000008
+ vertex 182.8183652153177 -67.68664256999637 -56.40000000000008
+ vertex 32.47195505380439 191.9209785653342 -56.40000000000017
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -9.400019899202893e-16
+ outer loop
+ vertex 31.259519488506204 191.2209785653341 -58.200000000000195
+ vertex 181.25951948850573 -68.58664256999639 -58.20000000000009
+ vertex 31.259519488506168 191.22097856533415 -56.0000000000002
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -9.400019899202893e-16
+ outer loop
+ vertex 181.2595194885057 -68.58664256999634 -56.00000000000009
+ vertex 31.259519488506168 191.22097856533415 -56.0000000000002
+ vertex 181.25951948850573 -68.58664256999639 -58.20000000000009
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 1.052465433482836e-15
+ outer loop
+ vertex 27.362405171476134 188.97097856533426 -49.465685424949434
+ vertex 177.36240517147567 -70.83664256999627 -49.46568542494934
+ vertex 27.36240517147627 188.97097856533406 -55.73431457505093
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 1.052465433482836e-15
+ outer loop
+ vertex 177.36240517147576 -70.83664256999646 -55.734314575050846
+ vertex 27.36240517147627 188.97097856533406 -55.73431457505093
+ vertex 177.36240517147567 -70.83664256999627 -49.46568542494934
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -9.400019899202893e-16
+ outer loop
+ vertex 15.497857139629415 182.1209785653341 -43.60000000000017
+ vertex 15.497857139629511 182.12097856533393 -48.80000000000017
+ vertex 165.49785713962896 -77.68664256999648 -43.6000000000001
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -9.400019899202893e-16
+ outer loop
+ vertex 165.49785713962905 -77.68664256999662 -48.80000000000009
+ vertex 165.49785713962896 -77.68664256999648 -43.6000000000001
+ vertex 15.497857139629511 182.12097856533393 -48.80000000000017
+ endloop
+endfacet
+facet normal 1.877717253503254e-14 -3.0643012873322636e-14 -1.0
+ outer loop
+ vertex 15.844267301143299 182.32097856533392 -48.80000000000017
+ vertex 165.84426730114285 -77.48664256999662 -48.80000000000008
+ vertex 15.497857139629511 182.12097856533393 -48.80000000000017
+ endloop
+endfacet
+facet normal 1.877717253503254e-14 -3.0643012873322636e-14 -1.0
+ outer loop
+ vertex 165.49785713962905 -77.68664256999662 -48.80000000000009
+ vertex 15.497857139629511 182.12097856533393 -48.80000000000017
+ vertex 165.84426730114285 -77.48664256999662 -48.80000000000008
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -2.739417086921043e-15
+ outer loop
+ vertex 20.9538171834714 185.27097856533405 -49.46568542494941
+ vertex 20.953817183471532 185.27097856533385 -55.73431457505091
+ vertex 170.95381718347093 -74.53664256999647 -49.465685424949335
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -2.739417086921043e-15
+ outer loop
+ vertex 170.95381718347102 -74.53664256999662 -55.734314575050796
+ vertex 170.95381718347093 -74.53664256999647 -49.465685424949335
+ vertex 20.953817183471532 185.27097856533385 -55.73431457505091
+ endloop
+endfacet
+facet normal 1.877717253503254e-14 -3.0643012873322636e-14 -1.0
+ outer loop
+ vertex 17.056702866441515 183.02097856533393 -49.200000000000166
+ vertex 167.05670286644101 -76.7866425699966 -49.200000000000074
+ vertex 15.844267301143299 182.32097856533392 -49.200000000000166
+ endloop
+endfacet
+facet normal 1.877717253503254e-14 -3.0643012873322636e-14 -1.0
+ outer loop
+ vertex 165.84426730114282 -77.48664256999662 -49.20000000000008
+ vertex 15.844267301143299 182.32097856533392 -49.200000000000166
+ vertex 167.05670286644101 -76.7866425699966 -49.200000000000074
+ endloop
+endfacet
+facet normal -1.877717253503254e-14 3.0643012873322636e-14 1.0
+ outer loop
+ vertex 18.81847096772454 184.0381358528591 -58.200000000000166
+ vertex 17.056702866441693 183.02097856533368 -58.200000000000166
+ vertex 168.81847096772404 -75.76948528247144 -58.200000000000074
+ endloop
+endfacet
+facet normal -1.877717253503254e-14 3.0643012873322636e-14 1.0
+ outer loop
+ vertex 167.05670286644119 -76.78664256999687 -58.200000000000074
+ vertex 168.81847096772404 -75.76948528247144 -58.200000000000074
+ vertex 17.056702866441693 183.02097856533368 -58.200000000000166
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 9.400019899202893e-16
+ outer loop
+ vertex 17.056702866441693 183.02097856533368 -58.200000000000166
+ vertex 17.056702866441622 183.0209785653337 -56.00000000000017
+ vertex 167.05670286644119 -76.78664256999687 -58.200000000000074
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 9.400019899202893e-16
+ outer loop
+ vertex 167.05670286644113 -76.78664256999677 -56.00000000000008
+ vertex 167.05670286644119 -76.78664256999687 -58.200000000000074
+ vertex 17.056702866441622 183.0209785653337 -56.00000000000017
+ endloop
+endfacet
+facet normal -3.273238745907288e-14 2.2585965780327922e-14 1.0
+ outer loop
+ vertex 17.056702866441622 183.0209785653337 -56.00000000000017
+ vertex 15.844267301143415 182.3209785653337 -56.0000000000002
+ vertex 167.05670286644113 -76.78664256999677 -56.00000000000008
+ endloop
+endfacet
+facet normal -3.273238745907288e-14 2.2585965780327922e-14 1.0
+ outer loop
+ vertex 165.8442673011429 -77.48664256999685 -56.000000000000114
+ vertex 167.05670286644113 -76.78664256999677 -56.00000000000008
+ vertex 15.844267301143415 182.3209785653337 -56.0000000000002
+ endloop
+endfacet
+facet normal 1.877717253503254e-14 -3.0643012873322636e-14 -1.0
+ outer loop
+ vertex 18.818470967724306 184.03813585285943 -47.00000000000018
+ vertex 168.81847096772387 -75.76948528247111 -47.00000000000008
+ vertex 17.056702866441448 183.02097856533402 -47.00000000000017
+ endloop
+endfacet
+facet normal 1.877717253503254e-14 -3.0643012873322636e-14 -1.0
+ outer loop
+ vertex 167.056702866441 -76.7866425699965 -47.00000000000008
+ vertex 17.056702866441448 183.02097856533402 -47.00000000000017
+ vertex 168.81847096772387 -75.76948528247111 -47.00000000000008
+ endloop
+endfacet
+facet normal -0.6123724356957724 -0.3535533905933076 -0.7071067811865499
+ outer loop
+ vertex 20.9538171834714 185.27097856533405 -49.46568542494941
+ vertex 170.95381718347093 -74.53664256999647 -49.465685424949335
+ vertex 18.818470967724306 184.03813585285943 -47.00000000000018
+ endloop
+endfacet
+facet normal -0.6123724356957724 -0.3535533905933076 -0.7071067811865499
+ outer loop
+ vertex 168.81847096772387 -75.76948528247111 -47.00000000000008
+ vertex 18.818470967724306 184.03813585285943 -47.00000000000018
+ vertex 170.95381718347093 -74.53664256999647 -49.465685424949335
+ endloop
+endfacet
+facet normal -0.6123724356957972 -0.35355339059327684 0.7071067811865438
+ outer loop
+ vertex 18.81847096772454 184.0381358528591 -58.200000000000166
+ vertex 168.81847096772404 -75.76948528247144 -58.200000000000074
+ vertex 20.953817183471532 185.27097856533385 -55.73431457505091
+ endloop
+endfacet
+facet normal -0.6123724356957972 -0.35355339059327684 0.7071067811865438
+ outer loop
+ vertex 170.95381718347102 -74.53664256999662 -55.734314575050796
+ vertex 20.953817183471532 185.27097856533385 -55.73431457505091
+ vertex 168.81847096772404 -75.76948528247144 -58.200000000000074
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -9.400019899202893e-16
+ outer loop
+ vertex 15.844267301143415 182.3209785653337 -56.400000000000205
+ vertex 165.84426730114293 -77.48664256999685 -56.40000000000011
+ vertex 15.844267301143415 182.3209785653337 -56.0000000000002
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -9.400019899202893e-16
+ outer loop
+ vertex 165.8442673011429 -77.48664256999685 -56.000000000000114
+ vertex 15.844267301143415 182.3209785653337 -56.0000000000002
+ vertex 165.84426730114293 -77.48664256999685 -56.40000000000011
+ endloop
+endfacet
+facet normal -1.877717253503254e-14 3.0643012873322636e-14 1.0
+ outer loop
+ vertex 15.844267301143415 182.3209785653337 -56.400000000000205
+ vertex 15.497857139629675 182.1209785653337 -56.400000000000205
+ vertex 165.84426730114293 -77.48664256999685 -56.40000000000011
+ endloop
+endfacet
+facet normal -1.877717253503254e-14 3.0643012873322636e-14 1.0
+ outer loop
+ vertex 165.49785713962922 -77.68664256999689 -56.40000000000011
+ vertex 165.84426730114293 -77.48664256999685 -56.40000000000011
+ vertex 15.497857139629675 182.1209785653337 -56.400000000000205
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -9.400019899202893e-16
+ outer loop
+ vertex 15.844267301143299 182.32097856533392 -48.80000000000017
+ vertex 15.844267301143299 182.32097856533392 -49.200000000000166
+ vertex 165.84426730114285 -77.48664256999662 -48.80000000000008
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -9.400019899202893e-16
+ outer loop
+ vertex 165.84426730114282 -77.48664256999662 -49.20000000000008
+ vertex 165.84426730114285 -77.48664256999662 -48.80000000000008
+ vertex 15.844267301143299 182.32097856533392 -49.200000000000166
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 9.400019899202893e-16
+ outer loop
+ vertex 17.056702866441448 183.02097856533402 -47.00000000000017
+ vertex 167.056702866441 -76.7866425699965 -47.00000000000008
+ vertex 17.056702866441515 183.02097856533393 -49.200000000000166
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 9.400019899202893e-16
+ outer loop
+ vertex 167.05670286644101 -76.7866425699966 -49.200000000000074
+ vertex 17.056702866441515 183.02097856533393 -49.200000000000166
+ vertex 167.056702866441 -76.7866425699965 -47.00000000000008
+ endloop
+endfacet
+facet normal -0.6870641468694313 -0.3966766701456506 -0.6087614290087203
+ outer loop
+ vertex 15.613882543414228 182.1879658634413 -62.10000000000019
+ vertex 15.751510107718453 182.2674251747402 -62.30710678118674
+ vertex 165.61388254341375 -77.61965527188924 -62.1000000000001
+ endloop
+endfacet
+facet normal -0.6870641468694313 -0.3966766701456506 -0.6087614290087203
+ outer loop
+ vertex 165.75151010771793 -77.54019596059025 -62.307106781186654
+ vertex 165.61388254341375 -77.61965527188924 -62.1000000000001
+ vertex 15.751510107718453 182.2674251747402 -62.30710678118674
+ endloop
+endfacet
+facet normal -0.33141357403556043 -0.19134171618258206 -0.9238795325112903
+ outer loop
+ vertex 16.139738675372207 182.49156904278223 -62.56592582628924
+ vertex 166.13973867537172 -77.31605209254826 -62.56592582628915
+ vertex 15.930869841522005 182.3709785653335 -62.46602540378463
+ endloop
+endfacet
+facet normal -0.33141357403556043 -0.19134171618258206 -0.9238795325112903
+ outer loop
+ vertex 165.93086984152157 -77.43664256999703 -62.466025403784535
+ vertex 15.930869841522005 182.3709785653335 -62.46602540378463
+ vertex 166.13973867537172 -77.31605209254826 -62.56592582628915
+ endloop
+endfacet
+facet normal -0.11303899832181269 -0.06526309611007232 -0.9914448613738078
+ outer loop
+ vertex 16.363882543414228 182.62097856533347 -62.60000000000018
+ vertex 166.36388254341375 -77.186642569997 -62.60000000000009
+ vertex 16.139738675372207 182.49156904278223 -62.56592582628924
+ endloop
+endfacet
+facet normal -0.11303899832181269 -0.06526309611007232 -0.9914448613738078
+ outer loop
+ vertex 166.13973867537172 -77.31605209254826 -62.56592582628915
+ vertex 16.139738675372207 182.49156904278223 -62.56592582628924
+ vertex 166.36388254341375 -77.186642569997 -62.60000000000009
+ endloop
+endfacet
+facet normal 1.877717253503254e-14 -3.0643012873322636e-14 -1.0
+ outer loop
+ vertex 20.867214643093217 185.22097856533364 -62.6000000000002
+ vertex 170.86721464309275 -74.58664256999687 -62.60000000000009
+ vertex 16.363882543414228 182.62097856533347 -62.60000000000018
+ endloop
+endfacet
+facet normal 1.877717253503254e-14 -3.0643012873322636e-14 -1.0
+ outer loop
+ vertex 166.36388254341375 -77.186642569997 -62.60000000000009
+ vertex 16.363882543414228 182.62097856533347 -62.60000000000018
+ vertex 170.86721464309275 -74.58664256999687 -62.60000000000009
+ endloop
+endfacet
+facet normal -0.5272028623656284 -0.30438071450439697 -0.7933533402912485
+ outer loop
+ vertex 15.930869841522005 182.3709785653335 -62.46602540378463
+ vertex 165.93086984152157 -77.43664256999703 -62.466025403784535
+ vertex 15.751510107718453 182.2674251747402 -62.30710678118674
+ endloop
+endfacet
+facet normal -0.5272028623656284 -0.30438071450439697 -0.7933533402912485
+ outer loop
+ vertex 165.75151010771793 -77.54019596059025 -62.307106781186654
+ vertex 15.751510107718453 182.2674251747402 -62.30710678118674
+ vertex 165.93086984152157 -77.43664256999703 -62.466025403784535
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -9.400019899202893e-16
+ outer loop
+ vertex 15.497857139629751 182.12097856533353 -61.60000000000019
+ vertex 165.49785713962933 -77.68664256999702 -61.6000000000001
+ vertex 15.497857139629675 182.1209785653337 -56.400000000000205
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -9.400019899202893e-16
+ outer loop
+ vertex 165.49785713962922 -77.68664256999689 -56.40000000000011
+ vertex 15.497857139629675 182.1209785653337 -56.400000000000205
+ vertex 165.49785713962933 -77.68664256999702 -61.6000000000001
+ endloop
+endfacet
+facet normal -0.8001031451912503 -0.4619397662556773 -0.3826834323650808
+ outer loop
+ vertex 15.613882543414228 182.1879658634413 -62.10000000000019
+ vertex 165.61388254341375 -77.61965527188924 -62.1000000000001
+ vertex 15.527366239676425 182.13801565218895 -61.858819045102706
+ endloop
+endfacet
+facet normal -0.8001031451912503 -0.4619397662556773 -0.3826834323650808
+ outer loop
+ vertex 165.52736623967587 -77.66960548314152 -61.858819045102614
+ vertex 15.527366239676425 182.13801565218895 -61.858819045102706
+ vertex 165.61388254341375 -77.61965527188924 -62.1000000000001
+ endloop
+endfacet
+facet normal -0.8586164364012407 -0.49572243068693855 -0.1305261922200573
+ outer loop
+ vertex 15.497857139629751 182.12097856533353 -61.60000000000019
+ vertex 15.527366239676425 182.13801565218895 -61.858819045102706
+ vertex 165.49785713962933 -77.68664256999702 -61.6000000000001
+ endloop
+endfacet
+facet normal -0.8586164364012407 -0.49572243068693855 -0.1305261922200573
+ outer loop
+ vertex 165.52736623967587 -77.66960548314152 -61.858819045102614
+ vertex 165.49785713962933 -77.68664256999702 -61.6000000000001
+ vertex 15.527366239676425 182.13801565218895 -61.858819045102706
+ endloop
+endfacet
+facet normal 1.877717253503254e-14 -3.0643012873322636e-14 -1.0
+ outer loop
+ vertex 21.213624804606987 185.42097856533363 -62.20000000000018
+ vertex 171.21362480460647 -74.38664256999687 -62.20000000000008
+ vertex 20.867214643093217 185.22097856533367 -62.2000000000002
+ endloop
+endfacet
+facet normal 1.877717253503254e-14 -3.0643012873322636e-14 -1.0
+ outer loop
+ vertex 170.86721464309272 -74.58664256999687 -62.20000000000009
+ vertex 20.867214643093217 185.22097856533367 -62.2000000000002
+ vertex 171.21362480460647 -74.38664256999687 -62.20000000000008
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 9.400019899202893e-16
+ outer loop
+ vertex 19.308368916281175 184.32097856533375 -58.765685424949424
+ vertex 169.3083689162807 -75.4866425699968 -58.76568542494933
+ vertex 19.30836891628122 184.32097856533363 -60.80000000000016
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 9.400019899202893e-16
+ outer loop
+ vertex 169.3083689162807 -75.48664256999689 -60.80000000000007
+ vertex 19.30836891628122 184.32097856533363 -60.80000000000016
+ vertex 169.3083689162807 -75.4866425699968 -58.76568542494933
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 9.400019899202893e-16
+ outer loop
+ vertex 20.867214643093217 185.22097856533364 -62.6000000000002
+ vertex 20.867214643093217 185.22097856533367 -62.2000000000002
+ vertex 170.86721464309275 -74.58664256999687 -62.60000000000009
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 9.400019899202893e-16
+ outer loop
+ vertex 170.86721464309272 -74.58664256999687 -62.20000000000009
+ vertex 170.86721464309275 -74.58664256999687 -62.60000000000009
+ vertex 20.867214643093217 185.22097856533367 -62.2000000000002
+ endloop
+endfacet
+facet normal -1.877717253503254e-14 3.0643012873322636e-14 1.0
+ outer loop
+ vertex 21.213624804606916 185.4209785653337 -60.80000000000016
+ vertex 19.30836891628122 184.32097856533363 -60.80000000000016
+ vertex 171.21362480460647 -74.38664256999682 -60.80000000000006
+ endloop
+endfacet
+facet normal -1.877717253503254e-14 3.0643012873322636e-14 1.0
+ outer loop
+ vertex 169.3083689162807 -75.48664256999689 -60.80000000000007
+ vertex 171.21362480460647 -74.38664256999682 -60.80000000000006
+ vertex 19.30836891628122 184.32097856533363 -60.80000000000016
+ endloop
+endfacet
+facet normal 1.877717253503254e-14 -3.0643012873322636e-14 -1.0
+ outer loop
+ vertex 26.87250722291962 188.68813585285935 -56.30000000000017
+ vertex 176.87250722291913 -71.11948528247113 -56.300000000000075
+ vertex 21.44371513202817 185.55382127780845 -56.30000000000017
+ endloop
+endfacet
+facet normal 1.877717253503254e-14 -3.0643012873322636e-14 -1.0
+ outer loop
+ vertex 171.44371513202773 -74.25379985752207 -56.30000000000007
+ vertex 21.44371513202817 185.55382127780845 -56.30000000000017
+ vertex 176.87250722291913 -71.11948528247113 -56.300000000000075
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 8.997049082914168e-15
+ outer loop
+ vertex 21.213624804606916 185.4209785653337 -60.80000000000016
+ vertex 171.21362480460647 -74.38664256999682 -60.80000000000006
+ vertex 21.213624804606987 185.42097856533363 -62.20000000000018
+ endloop
+endfacet
+facet normal 0.8660254037844191 0.500000000000034 8.997049082914168e-15
+ outer loop
+ vertex 171.21362480460647 -74.38664256999687 -62.20000000000008
+ vertex 21.213624804606987 185.42097856533363 -62.20000000000018
+ vertex 171.21362480460647 -74.38664256999682 -60.80000000000006
+ endloop
+endfacet
+facet normal 0.6123724356957944 0.3535533905932752 -0.707106781186547
+ outer loop
+ vertex 21.44371513202817 185.55382127780845 -56.30000000000017
+ vertex 171.44371513202773 -74.25379985752207 -56.30000000000007
+ vertex 19.308368916281175 184.32097856533375 -58.765685424949424
+ endloop
+endfacet
+facet normal 0.6123724356957944 0.3535533905932752 -0.707106781186547
+ outer loop
+ vertex 169.3083689162807 -75.4866425699968 -58.76568542494933
+ vertex 19.308368916281175 184.32097856533375 -58.765685424949424
+ vertex 171.44371513202773 -74.25379985752207 -56.30000000000007
+ endloop
+endfacet
+facet normal -0.6123724356957673 -0.3535533905933159 -0.70710678118655
+ outer loop
+ vertex 29.007853438666725 189.92097856533397 -58.76568542494941
+ vertex 179.00785343866625 -69.8866425699965 -58.76568542494932
+ vertex 26.87250722291962 188.68813585285935 -56.30000000000017
+ endloop
+endfacet
+facet normal -0.6123724356957673 -0.3535533905933159 -0.70710678118655
+ outer loop
+ vertex 176.87250722291913 -71.11948528247113 -56.300000000000075
+ vertex 26.87250722291962 188.68813585285935 -56.30000000000017
+ vertex 179.00785343866625 -69.8866425699965 -58.76568542494932
+ endloop
+endfacet
+facet normal -1.877717253503254e-14 3.0643012873322636e-14 1.0
+ outer loop
+ vertex 29.007853438666764 189.92097856533394 -60.80000000000017
+ vertex 27.102597550341027 188.82097856533392 -60.80000000000018
+ vertex 179.0078534386663 -69.88664256999658 -60.80000000000008
+ endloop
+endfacet
+facet normal -1.877717253503254e-14 3.0643012873322636e-14 1.0
+ outer loop
+ vertex 177.1025975503406 -70.98664256999665 -60.80000000000009
+ vertex 179.0078534386663 -69.88664256999658 -60.80000000000008
+ vertex 27.102597550341027 188.82097856533392 -60.80000000000018
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -2.611827415552657e-14
+ outer loop
+ vertex 27.102597550341027 188.82097856533392 -60.80000000000018
+ vertex 27.102597550341095 188.82097856533386 -62.20000000000018
+ vertex 177.1025975503406 -70.98664256999665 -60.80000000000009
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -2.611827415552657e-14
+ outer loop
+ vertex 177.1025975503406 -70.98664256999665 -62.20000000000009
+ vertex 177.1025975503406 -70.98664256999665 -60.80000000000009
+ vertex 27.102597550341095 188.82097856533386 -62.20000000000018
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -9.400019899202893e-16
+ outer loop
+ vertex 29.007853438666764 189.92097856533394 -60.80000000000017
+ vertex 179.0078534386663 -69.88664256999658 -60.80000000000008
+ vertex 29.007853438666725 189.92097856533397 -58.76568542494941
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -9.400019899202893e-16
+ outer loop
+ vertex 179.00785343866625 -69.8866425699965 -58.76568542494932
+ vertex 29.007853438666725 189.92097856533397 -58.76568542494941
+ vertex 179.0078534386663 -69.88664256999658 -60.80000000000008
+ endloop
+endfacet
+facet normal 1.877717253503254e-14 -3.0643012873322636e-14 -1.0
+ outer loop
+ vertex 27.449007711854858 189.02097856533385 -62.20000000000018
+ vertex 177.4490077118544 -70.78664256999664 -62.20000000000009
+ vertex 27.102597550341095 188.82097856533386 -62.20000000000018
+ endloop
+endfacet
+facet normal 1.877717253503254e-14 -3.0643012873322636e-14 -1.0
+ outer loop
+ vertex 177.1025975503406 -70.98664256999665 -62.20000000000009
+ vertex 27.102597550341095 188.82097856533386 -62.20000000000018
+ vertex 177.4490077118544 -70.78664256999664 -62.20000000000009
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -4.4649600931051686e-15
+ outer loop
+ vertex 27.449007711854858 189.02097856533385 -62.20000000000018
+ vertex 27.449007711854897 189.02097856533385 -62.60000000000018
+ vertex 177.4490077118544 -70.78664256999664 -62.20000000000009
+ endloop
+endfacet
+facet normal -0.8660254037844191 -0.500000000000034 -4.4649600931051686e-15
+ outer loop
+ vertex 177.4490077118544 -70.78664256999664 -62.60000000000009
+ vertex 177.4490077118544 -70.78664256999664 -62.20000000000009
+ vertex 27.449007711854897 189.02097856533385 -62.60000000000018
+ endloop
+endfacet
+facet normal 1.877717253503254e-14 -3.0643012873322636e-14 -1.0
+ outer loop
+ vertex 31.952339811533854 191.62097856533398 -62.60000000000018
+ vertex 181.9523398115334 -68.18664256999656 -62.60000000000008
+ vertex 27.449007711854897 189.02097856533385 -62.60000000000018
+ endloop
+endfacet
+facet normal 1.877717253503254e-14 -3.0643012873322636e-14 -1.0
+ outer loop
+ vertex 177.4490077118544 -70.78664256999664 -62.60000000000009
+ vertex 27.449007711854897 189.02097856533385 -62.60000000000018
+ vertex 181.9523398115334 -68.18664256999656 -62.60000000000008
+ endloop
+endfacet
+facet normal 0.1130389983218517 0.06526309611000751 -0.9914448613738075
+ outer loop
+ vertex 32.17648367957585 191.75038808788526 -62.56592582628924
+ vertex 182.17648367957543 -68.0572330474453 -62.56592582628915
+ vertex 31.952339811533854 191.62097856533398 -62.60000000000018
+ endloop
+endfacet
+facet normal 0.1130389983218517 0.06526309611000751 -0.9914448613738075
+ outer loop
+ vertex 181.9523398115334 -68.18664256999656 -62.60000000000008
+ vertex 31.952339811533854 191.62097856533398 -62.60000000000018
+ vertex 182.17648367957543 -68.0572330474453 -62.56592582628915
+ endloop
+endfacet
+facet normal 0.331413574035597 0.1913417161825215 -0.9238795325112898
+ outer loop
+ vertex 32.38535251342604 191.870978565334 -62.46602540378461
+ vertex 182.38535251342554 -67.9366425699965 -62.46602540378452
+ vertex 32.17648367957585 191.75038808788526 -62.56592582628924
+ endloop
+endfacet
+facet normal 0.331413574035597 0.1913417161825215 -0.9238795325112898
+ outer loop
+ vertex 182.17648367957543 -68.0572330474453 -62.56592582628915
+ vertex 32.17648367957585 191.75038808788526 -62.56592582628924
+ vertex 182.38535251342554 -67.9366425699965 -62.46602540378452
+ endloop
+endfacet
+facet normal 0.5272028623656608 0.3043807145043424 -0.7933533402912476
+ outer loop
+ vertex 32.564712247229615 191.9745319559273 -62.30710678118673
+ vertex 182.56471224722918 -67.83308917940327 -62.30710678118664
+ vertex 32.38535251342604 191.870978565334 -62.46602540378461
+ endloop
+endfacet
+facet normal 0.5272028623656608 0.3043807145043424 -0.7933533402912476
+ outer loop
+ vertex 182.38535251342554 -67.9366425699965 -62.46602540378452
+ vertex 32.38535251342604 191.870978565334 -62.46602540378461
+ vertex 182.56471224722918 -67.83308917940327 -62.30710678118664
+ endloop
+endfacet
+facet normal 0.6870641468694544 0.39667667014561886 -0.6087614290087151
+ outer loop
+ vertex 32.564712247229615 191.9745319559273 -62.30710678118673
+ vertex 32.70233981153382 192.05399126722622 -62.10000000000018
+ vertex 182.56471224722918 -67.83308917940327 -62.30710678118664
+ endloop
+endfacet
+facet normal 0.6870641468694544 0.39667667014561886 -0.6087614290087151
+ outer loop
+ vertex 182.70233981153334 -67.75362986810428 -62.10000000000009
+ vertex 182.56471224722918 -67.83308917940327 -62.30710678118664
+ vertex 32.70233981153382 192.05399126722622 -62.10000000000018
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.8183652153177 -67.68664256999637 -56.40000000000008
+ vertex 182.4719550538039 -67.88664256999631 -56.40000000000008
+ vertex 182.81836521531775 -67.6866425699965 -61.60000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.25153541297246 -68.0139019089652 -59.985889527836086
+ vertex 182.81836521531775 -67.6866425699965 -61.60000000000009
+ vertex 182.4719550538039 -67.88664256999631 -56.40000000000008
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.11310932699197 -68.09382224696891 -59.600000000000094
+ vertex 182.25153541297246 -68.0139019089652 -59.985889527836086
+ vertex 182.4719550538039 -67.88664256999631 -56.40000000000008
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 181.25951948850573 -68.58664256999639 -58.20000000000009
+ vertex 182.11310932699197 -68.09382224696891 -59.600000000000094
+ vertex 182.4719550538039 -67.88664256999631 -56.40000000000008
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 181.89290522410522 -68.22095714504717 -59.26862915010161
+ vertex 182.11310932699197 -68.09382224696891 -59.600000000000094
+ vertex 181.25951948850573 -68.58664256999639 -58.20000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 181.60592965001956 -68.38664256999643 -59.014359353944975
+ vertex 181.89290522410522 -68.22095714504717 -59.26862915010161
+ vertex 181.25951948850573 -68.58664256999639 -58.20000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 181.27173951585922 -68.5795873339144 -58.85451867793758
+ vertex 181.60592965001956 -68.38664256999643 -59.014359353944975
+ vertex 181.25951948850573 -68.58664256999639 -58.20000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 179.4977513872229 -69.60379985752186 -58.20000000000009
+ vertex 181.27173951585922 -68.5795873339144 -58.85451867793758
+ vertex 181.25951948850573 -68.58664256999639 -58.20000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 180.91310932699201 -68.78664256999643 -58.80000000000008
+ vertex 181.27173951585922 -68.5795873339144 -58.85451867793758
+ vertex 179.4977513872229 -69.60379985752186 -58.20000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 179.00785343866625 -69.8866425699965 -58.76568542494932
+ vertex 180.91310932699201 -68.78664256999643 -58.80000000000008
+ vertex 179.4977513872229 -69.60379985752186 -58.20000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.29874997304708 -67.98664256999643 -60.40000000000011
+ vertex 182.81836521531775 -67.6866425699965 -61.60000000000009
+ vertex 182.25153541297246 -68.0139019089652 -59.985889527836086
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.25153541297252 -68.01390190896524 -60.814110472164145
+ vertex 182.81836521531775 -67.6866425699965 -61.60000000000009
+ vertex 182.29874997304708 -67.98664256999643 -60.40000000000011
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.11310932699197 -68.09382224696891 -61.20000000000012
+ vertex 182.81836521531775 -67.6866425699965 -61.60000000000009
+ vertex 182.25153541297252 -68.01390190896524 -60.814110472164145
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 181.8929052241053 -68.22095714504731 -61.53137084989857
+ vertex 182.81836521531775 -67.6866425699965 -61.60000000000009
+ vertex 182.11310932699197 -68.09382224696891 -61.20000000000012
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 181.60592965001956 -68.38664256999647 -61.785640646055185
+ vertex 182.81836521531775 -67.6866425699965 -61.60000000000009
+ vertex 181.8929052241053 -68.22095714504731 -61.53137084989857
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.78885611527113 -67.70367965685196 -61.8588190451026
+ vertex 182.81836521531775 -67.6866425699965 -61.60000000000009
+ vertex 181.60592965001956 -68.38664256999647 -61.785640646055185
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 181.27173951585925 -68.57958733391453 -61.945481322062605
+ vertex 182.78885611527113 -67.70367965685196 -61.8588190451026
+ vertex 181.60592965001956 -68.38664256999647 -61.785640646055185
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.70233981153334 -67.75362986810428 -62.10000000000009
+ vertex 182.78885611527113 -67.70367965685196 -61.8588190451026
+ vertex 181.27173951585925 -68.57958733391453 -61.945481322062605
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 180.91310932699204 -68.78664256999656 -62.00000000000008
+ vertex 182.70233981153334 -67.75362986810428 -62.10000000000009
+ vertex 181.27173951585925 -68.57958733391453 -61.945481322062605
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.70233981153334 -67.75362986810428 -62.10000000000009
+ vertex 177.4490077118544 -70.78664256999664 -62.20000000000009
+ vertex 182.56471224722918 -67.83308917940327 -62.30710678118664
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 177.4490077118544 -70.78664256999664 -62.60000000000009
+ vertex 182.56471224722918 -67.83308917940327 -62.30710678118664
+ vertex 177.4490077118544 -70.78664256999664 -62.20000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.38535251342554 -67.9366425699965 -62.46602540378452
+ vertex 182.56471224722918 -67.83308917940327 -62.30710678118664
+ vertex 177.4490077118544 -70.78664256999664 -62.60000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.17648367957543 -68.0572330474453 -62.56592582628915
+ vertex 182.38535251342554 -67.9366425699965 -62.46602540378452
+ vertex 177.4490077118544 -70.78664256999664 -62.60000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 181.9523398115334 -68.18664256999656 -62.60000000000008
+ vertex 182.17648367957543 -68.0572330474453 -62.56592582628915
+ vertex 177.4490077118544 -70.78664256999664 -62.60000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 179.0078534386663 -69.88664256999658 -60.80000000000008
+ vertex 179.713109326992 -69.47946289302408 -59.60000000000006
+ vertex 179.00785343866625 -69.8866425699965 -58.76568542494932
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 179.93331342987875 -69.35232799494572 -59.26862915010159
+ vertex 179.00785343866625 -69.8866425699965 -58.76568542494932
+ vertex 179.713109326992 -69.47946289302408 -59.60000000000006
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 180.22028900396444 -69.18664256999648 -59.014359353944975
+ vertex 179.00785343866625 -69.8866425699965 -58.76568542494932
+ vertex 179.93331342987875 -69.35232799494572 -59.26862915010159
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 180.5544791381248 -68.9936978060785 -58.854518677937556
+ vertex 179.00785343866625 -69.8866425699965 -58.76568542494932
+ vertex 180.22028900396444 -69.18664256999648 -59.014359353944975
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 180.91310932699201 -68.78664256999643 -58.80000000000008
+ vertex 179.00785343866625 -69.8866425699965 -58.76568542494932
+ vertex 180.5544791381248 -68.9936978060785 -58.854518677937556
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 179.57468324101154 -69.55938323102781 -59.98588952783603
+ vertex 179.713109326992 -69.47946289302408 -59.60000000000006
+ vertex 179.0078534386663 -69.88664256999658 -60.80000000000008
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 179.5274686809369 -69.58664256999651 -60.400000000000055
+ vertex 179.57468324101154 -69.55938323102781 -59.98588952783603
+ vertex 179.0078534386663 -69.88664256999658 -60.80000000000008
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 179.57468324101154 -69.55938323102781 -60.81411047216411
+ vertex 179.5274686809369 -69.58664256999651 -60.400000000000055
+ vertex 179.0078534386663 -69.88664256999658 -60.80000000000008
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 177.1025975503406 -70.98664256999665 -60.80000000000009
+ vertex 179.57468324101154 -69.55938323102781 -60.81411047216411
+ vertex 179.0078534386663 -69.88664256999658 -60.80000000000008
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 177.1025975503406 -70.98664256999665 -62.20000000000009
+ vertex 179.57468324101154 -69.55938323102781 -60.81411047216411
+ vertex 177.1025975503406 -70.98664256999665 -60.80000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 179.71310932699203 -69.47946289302408 -61.20000000000008
+ vertex 179.57468324101154 -69.55938323102781 -60.81411047216411
+ vertex 177.1025975503406 -70.98664256999665 -62.20000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 179.93331342987878 -69.35232799494582 -61.53137084989855
+ vertex 179.71310932699203 -69.47946289302408 -61.20000000000008
+ vertex 177.1025975503406 -70.98664256999665 -62.20000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 180.2202890039645 -69.18664256999656 -61.785640646055185
+ vertex 179.93331342987878 -69.35232799494582 -61.53137084989855
+ vertex 177.1025975503406 -70.98664256999665 -62.20000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 180.5544791381248 -68.99369780607854 -61.945481322062584
+ vertex 180.2202890039645 -69.18664256999656 -61.785640646055185
+ vertex 177.1025975503406 -70.98664256999665 -62.20000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 180.91310932699204 -68.78664256999656 -62.00000000000008
+ vertex 180.5544791381248 -68.99369780607854 -61.945481322062584
+ vertex 177.1025975503406 -70.98664256999665 -62.20000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.70233981153334 -67.75362986810428 -62.10000000000009
+ vertex 180.91310932699204 -68.78664256999656 -62.00000000000008
+ vertex 177.1025975503406 -70.98664256999665 -62.20000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 177.4490077118544 -70.78664256999664 -62.20000000000009
+ vertex 182.70233981153334 -67.75362986810428 -62.10000000000009
+ vertex 177.1025975503406 -70.98664256999665 -62.20000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 171.21362480460613 -74.38664256999628 -43.00000000000008
+ vertex 170.86721464309235 -74.58664256999629 -43.00000000000009
+ vertex 171.21362480460618 -74.38664256999633 -44.40000000000008
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 167.76174321682188 -76.37958733391434 -43.25451867793758
+ vertex 171.21362480460618 -74.38664256999633 -44.40000000000008
+ vertex 170.86721464309235 -74.58664256999629 -43.00000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 167.4031130279547 -76.58664256999637 -43.20000000000008
+ vertex 167.76174321682188 -76.37958733391434 -43.25451867793758
+ vertex 170.86721464309235 -74.58664256999629 -43.00000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 165.61388254341338 -77.61965527188865 -43.1000000000001
+ vertex 167.4031130279547 -76.58664256999637 -43.20000000000008
+ vertex 170.86721464309235 -74.58664256999629 -43.00000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 168.09593335098222 -76.18664256999637 -43.414359353944974
+ vertex 171.21362480460618 -74.38664256999633 -44.40000000000008
+ vertex 167.76174321682188 -76.37958733391434 -43.25451867793758
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 168.3829089250679 -76.0209571450471 -43.66862915010161
+ vertex 171.21362480460618 -74.38664256999633 -44.40000000000008
+ vertex 168.09593335098222 -76.18664256999637 -43.414359353944974
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 168.60311302795466 -75.89382224696875 -44.000000000000085
+ vertex 171.21362480460618 -74.38664256999633 -44.40000000000008
+ vertex 168.3829089250679 -76.0209571450471 -43.66862915010161
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 168.7415391139352 -75.81390190896514 -44.38588952783605
+ vertex 171.21362480460618 -74.38664256999633 -44.40000000000008
+ vertex 168.60311302795466 -75.89382224696875 -44.000000000000085
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 169.30836891628041 -75.48664256999639 -44.40000000000009
+ vertex 171.21362480460618 -74.38664256999633 -44.40000000000008
+ vertex 168.7415391139352 -75.81390190896514 -44.38588952783605
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 168.78875367400983 -75.78664256999642 -44.800000000000104
+ vertex 169.30836891628041 -75.48664256999639 -44.40000000000009
+ vertex 168.7415391139352 -75.81390190896514 -44.38588952783605
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 169.30836891628044 -75.48664256999643 -46.434314575050855
+ vertex 169.30836891628041 -75.48664256999639 -44.40000000000009
+ vertex 168.78875367400983 -75.78664256999642 -44.800000000000104
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 168.7415391139352 -75.81390190896518 -45.21411047216414
+ vertex 169.30836891628044 -75.48664256999643 -46.434314575050855
+ vertex 168.78875367400983 -75.78664256999642 -44.800000000000104
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 168.60311302795475 -75.8938222469689 -45.6000000000001
+ vertex 169.30836891628044 -75.48664256999643 -46.434314575050855
+ vertex 168.7415391139352 -75.81390190896518 -45.21411047216414
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 168.382908925068 -76.0209571450472 -45.93137084989857
+ vertex 169.30836891628044 -75.48664256999643 -46.434314575050855
+ vertex 168.60311302795475 -75.8938222469689 -45.6000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 168.09593335098225 -76.18664256999647 -46.18564064605519
+ vertex 169.30836891628044 -75.48664256999643 -46.434314575050855
+ vertex 168.382908925068 -76.0209571450472 -45.93137084989857
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 167.7617432168219 -76.37958733391443 -46.345481322062604
+ vertex 169.30836891628044 -75.48664256999643 -46.434314575050855
+ vertex 168.09593335098225 -76.18664256999647 -46.18564064605519
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 167.4031130279547 -76.58664256999646 -46.40000000000008
+ vertex 169.30836891628044 -75.48664256999643 -46.434314575050855
+ vertex 167.7617432168219 -76.37958733391443 -46.345481322062604
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 167.056702866441 -76.7866425699965 -47.00000000000008
+ vertex 165.84426730114285 -77.48664256999662 -48.80000000000008
+ vertex 167.05670286644101 -76.7866425699966 -49.200000000000074
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 165.84426730114282 -77.48664256999662 -49.20000000000008
+ vertex 167.05670286644101 -76.7866425699966 -49.200000000000074
+ vertex 165.84426730114285 -77.48664256999662 -48.80000000000008
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 165.61388254341338 -77.61965527188865 -43.1000000000001
+ vertex 165.5273662396756 -77.66960548314098 -43.34118095489759
+ vertex 167.4031130279547 -76.58664256999637 -43.20000000000008
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 167.0444828390875 -76.7936978060784 -43.254518677937554
+ vertex 167.4031130279547 -76.58664256999637 -43.20000000000008
+ vertex 165.5273662396756 -77.66960548314098 -43.34118095489759
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 166.7102927049271 -76.98664256999636 -43.414359353944974
+ vertex 167.0444828390875 -76.7936978060784 -43.254518677937554
+ vertex 165.5273662396756 -77.66960548314098 -43.34118095489759
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 165.49785713962896 -77.68664256999648 -43.6000000000001
+ vertex 166.7102927049271 -76.98664256999636 -43.414359353944974
+ vertex 165.5273662396756 -77.66960548314098 -43.34118095489759
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 166.4233171308414 -77.15232799494562 -43.66862915010159
+ vertex 166.7102927049271 -76.98664256999636 -43.414359353944974
+ vertex 165.49785713962896 -77.68664256999648 -43.6000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 166.20311302795469 -77.27946289302398 -44.00000000000006
+ vertex 166.4233171308414 -77.15232799494562 -43.66862915010159
+ vertex 165.49785713962896 -77.68664256999648 -43.6000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 166.06468694197423 -77.35938323102775 -44.38588952783603
+ vertex 166.20311302795469 -77.27946289302398 -44.00000000000006
+ vertex 165.49785713962896 -77.68664256999648 -43.6000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 165.49785713962905 -77.68664256999662 -48.80000000000009
+ vertex 166.06468694197423 -77.35938323102775 -44.38588952783603
+ vertex 165.49785713962896 -77.68664256999648 -43.6000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 166.01747238189967 -77.38664256999651 -44.80000000000006
+ vertex 166.06468694197423 -77.35938323102775 -44.38588952783603
+ vertex 165.49785713962905 -77.68664256999662 -48.80000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 166.06468694197426 -77.35938323102779 -45.214110472164094
+ vertex 166.01747238189967 -77.38664256999651 -44.80000000000006
+ vertex 165.49785713962905 -77.68664256999662 -48.80000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 166.2031130279547 -77.27946289302402 -45.60000000000008
+ vertex 166.06468694197426 -77.35938323102779 -45.214110472164094
+ vertex 165.49785713962905 -77.68664256999662 -48.80000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 166.42331713084147 -77.15232799494576 -45.93137084989855
+ vertex 166.2031130279547 -77.27946289302402 -45.60000000000008
+ vertex 165.49785713962905 -77.68664256999662 -48.80000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 166.71029270492718 -76.9866425699965 -46.18564064605519
+ vertex 166.42331713084147 -77.15232799494576 -45.93137084989855
+ vertex 165.49785713962905 -77.68664256999662 -48.80000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 167.0444828390875 -76.79369780607853 -46.34548132206258
+ vertex 166.71029270492718 -76.9866425699965 -46.18564064605519
+ vertex 165.49785713962905 -77.68664256999662 -48.80000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 167.4031130279547 -76.58664256999646 -46.40000000000008
+ vertex 167.0444828390875 -76.79369780607853 -46.34548132206258
+ vertex 165.49785713962905 -77.68664256999662 -48.80000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 167.056702866441 -76.7866425699965 -47.00000000000008
+ vertex 167.4031130279547 -76.58664256999646 -46.40000000000008
+ vertex 165.49785713962905 -77.68664256999662 -48.80000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 169.30836891628044 -75.48664256999643 -46.434314575050855
+ vertex 167.4031130279547 -76.58664256999646 -46.40000000000008
+ vertex 167.056702866441 -76.7866425699965 -47.00000000000008
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 168.81847096772387 -75.76948528247111 -47.00000000000008
+ vertex 169.30836891628044 -75.48664256999643 -46.434314575050855
+ vertex 167.056702866441 -76.7866425699965 -47.00000000000008
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 165.84426730114285 -77.48664256999662 -48.80000000000008
+ vertex 167.056702866441 -76.7866425699965 -47.00000000000008
+ vertex 165.49785713962905 -77.68664256999662 -48.80000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 179.57468324101126 -69.55938323102731 -44.38588952783607
+ vertex 179.007853438666 -69.88664256999604 -44.40000000000007
+ vertex 179.52746868093664 -69.58664256999607 -44.800000000000104
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 179.00785343866605 -69.88664256999613 -46.434314575050806
+ vertex 179.52746868093664 -69.58664256999607 -44.800000000000104
+ vertex 179.007853438666 -69.88664256999604 -44.40000000000007
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 179.57468324101126 -69.55938323102735 -45.21411047216414
+ vertex 179.52746868093664 -69.58664256999607 -44.800000000000104
+ vertex 179.00785343866605 -69.88664256999613 -46.434314575050806
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 179.71310932699177 -69.47946289302364 -45.6000000000001
+ vertex 179.57468324101126 -69.55938323102735 -45.21411047216414
+ vertex 179.00785343866605 -69.88664256999613 -46.434314575050806
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 179.9333134298785 -69.35232799494533 -45.93137084989857
+ vertex 179.71310932699177 -69.47946289302364 -45.6000000000001
+ vertex 179.00785343866605 -69.88664256999613 -46.434314575050806
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 180.2202890039642 -69.18664256999615 -46.18564064605521
+ vertex 179.9333134298785 -69.35232799494533 -45.93137084989857
+ vertex 179.00785343866605 -69.88664256999613 -46.434314575050806
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 180.55447913812455 -68.99369780607815 -46.345481322062625
+ vertex 180.2202890039642 -69.18664256999615 -46.18564064605521
+ vertex 179.00785343866605 -69.88664256999613 -46.434314575050806
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 180.9131093269917 -68.78664256999602 -46.40000000000013
+ vertex 180.55447913812455 -68.99369780607815 -46.345481322062625
+ vertex 179.00785343866605 -69.88664256999613 -46.434314575050806
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 181.95233981153302 -68.18664256999588 -42.600000000000065
+ vertex 177.44900771185397 -70.7866425699961 -42.60000000000007
+ vertex 182.17648367957503 -68.05723304744467 -42.63407417371101
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 177.4490077118539 -70.78664256999606 -43.00000000000007
+ vertex 182.17648367957503 -68.05723304744467 -42.63407417371101
+ vertex 177.44900771185397 -70.7866425699961 -42.60000000000007
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.38535251342523 -67.93664256999594 -42.73397459621563
+ vertex 182.17648367957503 -68.05723304744467 -42.63407417371101
+ vertex 177.4490077118539 -70.78664256999606 -43.00000000000007
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.5647122472288 -67.83308917940268 -42.89289321881352
+ vertex 182.38535251342523 -67.93664256999594 -42.73397459621563
+ vertex 177.4490077118539 -70.78664256999606 -43.00000000000007
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.702339811533 -67.75362986810374 -43.100000000000065
+ vertex 182.5647122472288 -67.83308917940268 -42.89289321881352
+ vertex 177.4490077118539 -70.78664256999606 -43.00000000000007
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 177.10259755034016 -70.9866425699961 -43.00000000000007
+ vertex 182.702339811533 -67.75362986810374 -43.100000000000065
+ vertex 177.4490077118539 -70.78664256999606 -43.00000000000007
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 180.91310932699176 -68.78664256999598 -43.20000000000011
+ vertex 182.702339811533 -67.75362986810374 -43.100000000000065
+ vertex 177.10259755034016 -70.9866425699961 -43.00000000000007
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 180.5544791381245 -68.993697806078 -43.254518677937604
+ vertex 180.91310932699176 -68.78664256999598 -43.20000000000011
+ vertex 177.10259755034016 -70.9866425699961 -43.00000000000007
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 177.10259755034025 -70.9866425699961 -44.40000000000007
+ vertex 180.5544791381245 -68.993697806078 -43.254518677937604
+ vertex 177.10259755034016 -70.9866425699961 -43.00000000000007
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 180.22028900396418 -69.18664256999598 -43.414359353944995
+ vertex 180.5544791381245 -68.993697806078 -43.254518677937604
+ vertex 177.10259755034025 -70.9866425699961 -44.40000000000007
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 179.93331342987844 -69.35232799494524 -43.66862915010161
+ vertex 180.22028900396418 -69.18664256999598 -43.414359353944995
+ vertex 177.10259755034025 -70.9866425699961 -44.40000000000007
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 179.71310932699177 -69.4794628930236 -44.00000000000011
+ vertex 179.93331342987844 -69.35232799494524 -43.66862915010161
+ vertex 177.10259755034025 -70.9866425699961 -44.40000000000007
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 179.57468324101126 -69.55938323102731 -44.38588952783607
+ vertex 179.71310932699177 -69.4794628930236 -44.00000000000011
+ vertex 177.10259755034025 -70.9866425699961 -44.40000000000007
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 179.007853438666 -69.88664256999604 -44.40000000000007
+ vertex 179.57468324101126 -69.55938323102731 -44.38588952783607
+ vertex 177.10259755034025 -70.9866425699961 -44.40000000000007
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 166.36388254341335 -77.18664256999637 -42.60000000000009
+ vertex 166.13973867537135 -77.31605209254768 -42.63407417371102
+ vertex 170.8672146430924 -74.58664256999629 -42.600000000000094
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 170.86721464309235 -74.58664256999629 -43.00000000000009
+ vertex 170.8672146430924 -74.58664256999629 -42.600000000000094
+ vertex 166.13973867537135 -77.31605209254768 -42.63407417371102
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 165.93086984152117 -77.43664256999641 -42.73397459621565
+ vertex 170.86721464309235 -74.58664256999629 -43.00000000000009
+ vertex 166.13973867537135 -77.31605209254768 -42.63407417371102
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 165.75151010771756 -77.54019596058971 -42.89289321881353
+ vertex 170.86721464309235 -74.58664256999629 -43.00000000000009
+ vertex 165.93086984152117 -77.43664256999641 -42.73397459621565
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 165.61388254341338 -77.61965527188865 -43.1000000000001
+ vertex 170.86721464309235 -74.58664256999629 -43.00000000000009
+ vertex 165.75151010771756 -77.54019596058971 -42.89289321881353
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.702339811533 -67.75362986810374 -43.100000000000065
+ vertex 180.91310932699176 -68.78664256999598 -43.20000000000011
+ vertex 182.78885611527082 -67.70367965685142 -43.34118095489755
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 181.2717395158589 -68.57958733391395 -43.2545186779376
+ vertex 182.78885611527082 -67.70367965685142 -43.34118095489755
+ vertex 180.91310932699176 -68.78664256999598 -43.20000000000011
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 181.60592965001928 -68.38664256999598 -43.414359353945
+ vertex 182.78885611527082 -67.70367965685142 -43.34118095489755
+ vertex 181.2717395158589 -68.57958733391395 -43.2545186779376
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.8183652153174 -67.68664256999595 -43.600000000000065
+ vertex 182.78885611527082 -67.70367965685142 -43.34118095489755
+ vertex 181.60592965001928 -68.38664256999598 -43.414359353945
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 181.89290522410496 -68.22095714504667 -43.668629150101616
+ vertex 182.8183652153174 -67.68664256999595 -43.600000000000065
+ vertex 181.60592965001928 -68.38664256999598 -43.414359353945
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.1131093269917 -68.09382224696837 -44.000000000000114
+ vertex 182.8183652153174 -67.68664256999595 -43.600000000000065
+ vertex 181.89290522410496 -68.22095714504667 -43.668629150101616
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.2515354129722 -68.0139019089647 -44.38588952783608
+ vertex 182.8183652153174 -67.68664256999595 -43.600000000000065
+ vertex 182.1131093269917 -68.09382224696837 -44.000000000000114
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.81836521531753 -67.68664256999614 -48.80000000000003
+ vertex 182.8183652153174 -67.68664256999595 -43.600000000000065
+ vertex 182.2515354129722 -68.0139019089647 -44.38588952783608
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.2987499730468 -67.98664256999594 -44.80000000000011
+ vertex 182.81836521531753 -67.68664256999614 -48.80000000000003
+ vertex 182.2515354129722 -68.0139019089647 -44.38588952783608
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.25153541297223 -68.01390190896478 -45.214110472164144
+ vertex 182.81836521531753 -67.68664256999614 -48.80000000000003
+ vertex 182.2987499730468 -67.98664256999594 -44.80000000000011
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.11310932699172 -68.09382224696841 -45.60000000000011
+ vertex 182.81836521531753 -67.68664256999614 -48.80000000000003
+ vertex 182.25153541297223 -68.01390190896478 -45.214110472164144
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 181.892905224105 -68.22095714504681 -45.93137084989858
+ vertex 182.81836521531753 -67.68664256999614 -48.80000000000003
+ vertex 182.11310932699172 -68.09382224696841 -45.60000000000011
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 181.60592965001933 -68.38664256999607 -46.18564064605523
+ vertex 182.81836521531753 -67.68664256999614 -48.80000000000003
+ vertex 181.892905224105 -68.22095714504681 -45.93137084989858
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 181.27173951585897 -68.57958733391399 -46.345481322062625
+ vertex 182.81836521531753 -67.68664256999614 -48.80000000000003
+ vertex 181.60592965001933 -68.38664256999607 -46.18564064605523
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 180.9131093269917 -68.78664256999602 -46.40000000000013
+ vertex 182.81836521531753 -67.68664256999614 -48.80000000000003
+ vertex 181.27173951585897 -68.57958733391399 -46.345481322062625
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 181.25951948850556 -68.58664256999612 -47.00000000000007
+ vertex 182.81836521531753 -67.68664256999614 -48.80000000000003
+ vertex 180.9131093269917 -68.78664256999602 -46.40000000000013
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 179.00785343866605 -69.88664256999613 -46.434314575050806
+ vertex 181.25951948850556 -68.58664256999612 -47.00000000000007
+ vertex 180.9131093269917 -68.78664256999602 -46.40000000000013
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.47195505380378 -67.88664256999614 -48.80000000000003
+ vertex 182.81836521531753 -67.68664256999614 -48.80000000000003
+ vertex 181.25951948850556 -68.58664256999612 -47.00000000000007
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 181.2595194885056 -68.58664256999616 -49.20000000000007
+ vertex 182.47195505380378 -67.88664256999614 -48.80000000000003
+ vertex 181.25951948850556 -68.58664256999612 -47.00000000000007
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.47195505380375 -67.88664256999614 -49.20000000000003
+ vertex 182.47195505380378 -67.88664256999614 -48.80000000000003
+ vertex 181.2595194885056 -68.58664256999616 -49.20000000000007
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 171.44371513202773 -74.25379985752207 -56.30000000000007
+ vertex 176.87250722291913 -71.11948528247113 -56.300000000000075
+ vertex 177.36240517147576 -70.83664256999646 -55.734314575050846
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 179.4977513872229 -69.60379985752186 -58.20000000000009
+ vertex 177.36240517147576 -70.83664256999646 -55.734314575050846
+ vertex 176.87250722291913 -71.11948528247113 -56.300000000000075
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 179.00785343866625 -69.8866425699965 -58.76568542494932
+ vertex 179.4977513872229 -69.60379985752186 -58.20000000000009
+ vertex 176.87250722291913 -71.11948528247113 -56.300000000000075
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 182.4719550538039 -67.88664256999627 -56.00000000000008
+ vertex 181.2595194885057 -68.58664256999634 -56.00000000000009
+ vertex 182.4719550538039 -67.88664256999631 -56.40000000000008
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 181.25951948850573 -68.58664256999639 -58.20000000000009
+ vertex 182.4719550538039 -67.88664256999631 -56.40000000000008
+ vertex 181.2595194885057 -68.58664256999634 -56.00000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 174.1581111774733 -72.6866425699964 -49.90000000000009
+ vertex 174.76329962118675 -72.33723685910797 -49.99200026901961
+ vertex 177.36240517147567 -70.83664256999627 -49.46568542494934
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 175.3272454725823 -72.01164256999637 -50.26173140978212
+ vertex 177.36240517147567 -70.83664256999627 -49.46568542494934
+ vertex 174.76329962118675 -72.33723685910797 -49.99200026901961
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 175.81151675385195 -71.73204841539453 -50.690811690796394
+ vertex 177.36240517147567 -70.83664256999627 -49.46568542494934
+ vertex 175.3272454725823 -72.01164256999637 -50.26173140978212
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 176.18311117747334 -71.51750827488736 -51.25000000000008
+ vertex 177.36240517147567 -70.83664256999627 -49.46568542494934
+ vertex 175.81151675385195 -71.73204841539453 -50.690811690796394
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 176.4167051975654 -71.38264270450611 -51.901188578223284
+ vertex 177.36240517147567 -70.83664256999627 -49.46568542494934
+ vertex 176.18311117747334 -71.51750827488736 -51.25000000000008
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 177.36240517147576 -70.83664256999646 -55.734314575050846
+ vertex 177.36240517147567 -70.83664256999627 -49.46568542494934
+ vertex 176.4167051975654 -71.38264270450611 -51.901188578223284
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 176.49637976769134 -71.33664256999639 -52.60000000000009
+ vertex 177.36240517147576 -70.83664256999646 -55.734314575050846
+ vertex 176.4167051975654 -71.38264270450611 -51.901188578223284
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 176.4167051975654 -71.38264270450611 -53.29881142177688
+ vertex 177.36240517147576 -70.83664256999646 -55.734314575050846
+ vertex 176.49637976769134 -71.33664256999639 -52.60000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 176.18311117747336 -71.51750827488746 -53.950000000000095
+ vertex 177.36240517147576 -70.83664256999646 -55.734314575050846
+ vertex 176.4167051975654 -71.38264270450611 -53.29881142177688
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 175.81151675385203 -71.73204841539467 -54.50918830920377
+ vertex 177.36240517147576 -70.83664256999646 -55.734314575050846
+ vertex 176.18311117747336 -71.51750827488746 -53.950000000000095
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 175.32724547258235 -72.01164256999647 -54.93826859021806
+ vertex 177.36240517147576 -70.83664256999646 -55.734314575050846
+ vertex 175.81151675385203 -71.73204841539467 -54.50918830920377
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 174.76329962118686 -72.33723685910816 -55.20799973098057
+ vertex 177.36240517147576 -70.83664256999646 -55.734314575050846
+ vertex 175.32724547258235 -72.01164256999647 -54.93826859021806
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 174.1581111774734 -72.68664256999658 -55.30000000000008
+ vertex 177.36240517147576 -70.83664256999646 -55.734314575050846
+ vertex 174.76329962118686 -72.33723685910816 -55.20799973098057
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 170.95381718347102 -74.53664256999662 -55.734314575050796
+ vertex 177.36240517147576 -70.83664256999646 -55.734314575050846
+ vertex 174.1581111774734 -72.68664256999658 -55.30000000000008
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 171.44371513202773 -74.25379985752207 -56.30000000000007
+ vertex 177.36240517147576 -70.83664256999646 -55.734314575050846
+ vertex 170.95381718347102 -74.53664256999662 -55.734314575050796
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 168.81847096772404 -75.76948528247144 -58.200000000000074
+ vertex 171.44371513202773 -74.25379985752207 -56.30000000000007
+ vertex 170.95381718347102 -74.53664256999662 -55.734314575050796
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 169.3083689162807 -75.4866425699968 -58.76568542494933
+ vertex 171.44371513202773 -74.25379985752207 -56.30000000000007
+ vertex 168.81847096772404 -75.76948528247144 -58.200000000000074
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 167.05670286644119 -76.78664256999687 -58.200000000000074
+ vertex 169.3083689162807 -75.4866425699968 -58.76568542494933
+ vertex 168.81847096772404 -75.76948528247144 -58.200000000000074
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 171.21362480460647 -74.38664256999682 -60.80000000000006
+ vertex 169.3083689162807 -75.48664256999689 -60.80000000000007
+ vertex 171.21362480460647 -74.38664256999687 -62.20000000000008
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 168.74153911393546 -75.81390190896563 -60.814110472164124
+ vertex 171.21362480460647 -74.38664256999687 -62.20000000000008
+ vertex 169.3083689162807 -75.48664256999689 -60.80000000000007
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 168.603113027955 -75.89382224696931 -61.20000000000009
+ vertex 171.21362480460647 -74.38664256999687 -62.20000000000008
+ vertex 168.74153911393546 -75.81390190896563 -60.814110472164124
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 168.3829089250683 -76.0209571450477 -61.531370849898586
+ vertex 171.21362480460647 -74.38664256999687 -62.20000000000008
+ vertex 168.603113027955 -75.89382224696931 -61.20000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 168.09593335098256 -76.1866425699969 -61.7856406460552
+ vertex 171.21362480460647 -74.38664256999687 -62.20000000000008
+ vertex 168.3829089250683 -76.0209571450477 -61.531370849898586
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 167.7617432168222 -76.37958733391493 -61.94548132206259
+ vertex 171.21362480460647 -74.38664256999687 -62.20000000000008
+ vertex 168.09593335098256 -76.1866425699969 -61.7856406460552
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 167.403113027955 -76.58664256999695 -62.00000000000009
+ vertex 171.21362480460647 -74.38664256999687 -62.20000000000008
+ vertex 167.7617432168222 -76.37958733391493 -61.94548132206259
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 165.61388254341375 -77.61965527188924 -62.1000000000001
+ vertex 171.21362480460647 -74.38664256999687 -62.20000000000008
+ vertex 167.403113027955 -76.58664256999695 -62.00000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 170.86721464309272 -74.58664256999687 -62.20000000000009
+ vertex 171.21362480460647 -74.38664256999687 -62.20000000000008
+ vertex 165.61388254341375 -77.61965527188924 -62.1000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 165.75151010771793 -77.54019596059025 -62.307106781186654
+ vertex 170.86721464309272 -74.58664256999687 -62.20000000000009
+ vertex 165.61388254341375 -77.61965527188924 -62.1000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 170.86721464309275 -74.58664256999687 -62.60000000000009
+ vertex 170.86721464309272 -74.58664256999687 -62.20000000000009
+ vertex 165.75151010771793 -77.54019596059025 -62.307106781186654
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 165.93086984152157 -77.43664256999703 -62.466025403784535
+ vertex 170.86721464309275 -74.58664256999687 -62.60000000000009
+ vertex 165.75151010771793 -77.54019596059025 -62.307106781186654
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 166.13973867537172 -77.31605209254826 -62.56592582628915
+ vertex 170.86721464309275 -74.58664256999687 -62.60000000000009
+ vertex 165.93086984152157 -77.43664256999703 -62.466025403784535
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 166.36388254341375 -77.186642569997 -62.60000000000009
+ vertex 170.86721464309275 -74.58664256999687 -62.60000000000009
+ vertex 166.13973867537172 -77.31605209254826 -62.56592582628915
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 167.05670286644113 -76.78664256999677 -56.00000000000008
+ vertex 165.8442673011429 -77.48664256999685 -56.000000000000114
+ vertex 167.05670286644119 -76.78664256999687 -58.200000000000074
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 165.84426730114293 -77.48664256999685 -56.40000000000011
+ vertex 167.05670286644119 -76.78664256999687 -58.200000000000074
+ vertex 165.8442673011429 -77.48664256999685 -56.000000000000114
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 165.49785713962922 -77.68664256999689 -56.40000000000011
+ vertex 167.05670286644119 -76.78664256999687 -58.200000000000074
+ vertex 165.84426730114293 -77.48664256999685 -56.40000000000011
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 166.20311302795497 -77.27946289302443 -59.60000000000007
+ vertex 167.05670286644119 -76.78664256999687 -58.200000000000074
+ vertex 165.49785713962922 -77.68664256999689 -56.40000000000011
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 166.06468694197454 -77.35938323102819 -59.98588952783604
+ vertex 166.20311302795497 -77.27946289302443 -59.60000000000007
+ vertex 165.49785713962922 -77.68664256999689 -56.40000000000011
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 165.49785713962933 -77.68664256999702 -61.6000000000001
+ vertex 166.06468694197454 -77.35938323102819 -59.98588952783604
+ vertex 165.49785713962922 -77.68664256999689 -56.40000000000011
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 166.4233171308417 -77.15232799494616 -59.2686291501016
+ vertex 167.05670286644119 -76.78664256999687 -58.200000000000074
+ vertex 166.20311302795497 -77.27946289302443 -59.60000000000007
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 166.7102927049274 -76.98664256999692 -59.01435935394496
+ vertex 167.05670286644119 -76.78664256999687 -58.200000000000074
+ vertex 166.4233171308417 -77.15232799494616 -59.2686291501016
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 167.04448283908772 -76.7936978060789 -58.85451867793757
+ vertex 167.05670286644119 -76.78664256999687 -58.200000000000074
+ vertex 166.7102927049274 -76.98664256999692 -59.01435935394496
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 167.40311302795504 -76.58664256999687 -58.800000000000075
+ vertex 167.05670286644119 -76.78664256999687 -58.200000000000074
+ vertex 167.04448283908772 -76.7936978060789 -58.85451867793757
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 169.3083689162807 -75.4866425699968 -58.76568542494933
+ vertex 167.05670286644119 -76.78664256999687 -58.200000000000074
+ vertex 167.40311302795504 -76.58664256999687 -58.800000000000075
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 166.0174723818999 -77.38664256999691 -60.40000000000007
+ vertex 166.06468694197454 -77.35938323102819 -59.98588952783604
+ vertex 165.49785713962933 -77.68664256999702 -61.6000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 166.06468694197451 -77.35938323102825 -60.8141104721641
+ vertex 166.0174723818999 -77.38664256999691 -60.40000000000007
+ vertex 165.49785713962933 -77.68664256999702 -61.6000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 166.20311302795503 -77.27946289302447 -61.20000000000007
+ vertex 166.06468694197451 -77.35938323102825 -60.8141104721641
+ vertex 165.49785713962933 -77.68664256999702 -61.6000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 166.42331713084175 -77.15232799494622 -61.531370849898536
+ vertex 166.20311302795503 -77.27946289302447 -61.20000000000007
+ vertex 165.49785713962933 -77.68664256999702 -61.6000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 166.71029270492747 -76.98664256999696 -61.78564064605518
+ vertex 166.42331713084175 -77.15232799494622 -61.531370849898536
+ vertex 165.49785713962933 -77.68664256999702 -61.6000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 165.52736623967587 -77.66960548314152 -61.858819045102614
+ vertex 166.71029270492747 -76.98664256999696 -61.78564064605518
+ vertex 165.49785713962933 -77.68664256999702 -61.6000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 167.04448283908783 -76.79369780607902 -61.94548132206259
+ vertex 166.71029270492747 -76.98664256999696 -61.78564064605518
+ vertex 165.52736623967587 -77.66960548314152 -61.858819045102614
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 165.61388254341375 -77.61965527188924 -62.1000000000001
+ vertex 167.04448283908783 -76.79369780607902 -61.94548132206259
+ vertex 165.52736623967587 -77.66960548314152 -61.858819045102614
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 167.403113027955 -76.58664256999695 -62.00000000000009
+ vertex 167.04448283908783 -76.79369780607902 -61.94548132206259
+ vertex 165.61388254341375 -77.61965527188924 -62.1000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 167.40311302795504 -76.58664256999687 -58.800000000000075
+ vertex 167.76174321682214 -76.3795873339148 -58.85451867793757
+ vertex 169.3083689162807 -75.4866425699968 -58.76568542494933
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 168.09593335098256 -76.18664256999686 -59.01435935394498
+ vertex 169.3083689162807 -75.4866425699968 -58.76568542494933
+ vertex 167.76174321682214 -76.3795873339148 -58.85451867793757
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 168.38290892506822 -76.02095714504756 -59.268629150101624
+ vertex 169.3083689162807 -75.4866425699968 -58.76568542494933
+ vertex 168.09593335098256 -76.18664256999686 -59.01435935394498
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 168.60311302795498 -75.89382224696931 -59.600000000000094
+ vertex 169.3083689162807 -75.4866425699968 -58.76568542494933
+ vertex 168.38290892506822 -76.02095714504756 -59.268629150101624
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 169.3083689162807 -75.48664256999689 -60.80000000000007
+ vertex 169.3083689162807 -75.4866425699968 -58.76568542494933
+ vertex 168.60311302795498 -75.89382224696931 -59.600000000000094
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 168.74153911393552 -75.81390190896563 -59.98588952783606
+ vertex 169.3083689162807 -75.48664256999689 -60.80000000000007
+ vertex 168.60311302795498 -75.89382224696931 -59.600000000000094
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 168.78875367401005 -75.78664256999683 -60.40000000000009
+ vertex 169.3083689162807 -75.48664256999689 -60.80000000000007
+ vertex 168.74153911393552 -75.81390190896563 -59.98588952783606
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 168.74153911393546 -75.81390190896563 -60.814110472164124
+ vertex 169.3083689162807 -75.48664256999689 -60.80000000000007
+ vertex 168.78875367401005 -75.78664256999683 -60.40000000000009
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 176.872507222919 -71.11948528247086 -48.90000000000006
+ vertex 179.49775138722265 -69.60379985752151 -47.00000000000008
+ vertex 179.00785343866605 -69.88664256999613 -46.434314575050806
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 181.25951948850556 -68.58664256999612 -47.00000000000007
+ vertex 179.00785343866605 -69.88664256999613 -46.434314575050806
+ vertex 179.49775138722265 -69.60379985752151 -47.00000000000008
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 177.36240517147567 -70.83664256999627 -49.46568542494934
+ vertex 179.49775138722265 -69.60379985752151 -47.00000000000008
+ vertex 176.872507222919 -71.11948528247086 -48.90000000000006
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 171.44371513202756 -74.25379985752176 -48.900000000000105
+ vertex 177.36240517147567 -70.83664256999627 -49.46568542494934
+ vertex 176.872507222919 -71.11948528247086 -48.90000000000006
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 170.95381718347093 -74.53664256999647 -49.465685424949335
+ vertex 177.36240517147567 -70.83664256999627 -49.46568542494934
+ vertex 171.44371513202756 -74.25379985752176 -48.900000000000105
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 174.1581111774733 -72.6866425699964 -49.90000000000009
+ vertex 177.36240517147567 -70.83664256999627 -49.46568542494934
+ vertex 170.95381718347093 -74.53664256999647 -49.465685424949335
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 173.55292273375986 -73.03604828088481 -49.9920002690196
+ vertex 174.1581111774733 -72.6866425699964 -49.90000000000009
+ vertex 170.95381718347093 -74.53664256999647 -49.465685424949335
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 172.98897688236434 -73.36164256999642 -50.26173140978211
+ vertex 173.55292273375986 -73.03604828088481 -49.9920002690196
+ vertex 170.95381718347093 -74.53664256999647 -49.465685424949335
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 172.50470560109468 -73.64123672459827 -50.690811690796394
+ vertex 172.98897688236434 -73.36164256999642 -50.26173140978211
+ vertex 170.95381718347093 -74.53664256999647 -49.465685424949335
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 172.13311117747338 -73.85577686510548 -51.25000000000008
+ vertex 172.50470560109468 -73.64123672459827 -50.690811690796394
+ vertex 170.95381718347093 -74.53664256999647 -49.465685424949335
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 171.8995171573813 -73.99064243548673 -51.90118857822331
+ vertex 172.13311117747338 -73.85577686510548 -51.25000000000008
+ vertex 170.95381718347093 -74.53664256999647 -49.465685424949335
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 170.95381718347102 -74.53664256999662 -55.734314575050796
+ vertex 171.8995171573813 -73.99064243548673 -51.90118857822331
+ vertex 170.95381718347093 -74.53664256999647 -49.465685424949335
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 171.8198425872554 -74.03664256999654 -52.60000000000011
+ vertex 171.8995171573813 -73.99064243548673 -51.90118857822331
+ vertex 170.95381718347102 -74.53664256999662 -55.734314575050796
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 171.89951715738138 -73.99064243548682 -53.298811421776925
+ vertex 171.8198425872554 -74.03664256999654 -52.60000000000011
+ vertex 170.95381718347102 -74.53664256999662 -55.734314575050796
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 172.1331111774734 -73.85577686510557 -53.95000000000012
+ vertex 171.89951715738138 -73.99064243548682 -53.298811421776925
+ vertex 170.95381718347102 -74.53664256999662 -55.734314575050796
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 172.5047056010948 -73.64123672459844 -54.50918830920379
+ vertex 172.1331111774734 -73.85577686510557 -53.95000000000012
+ vertex 170.95381718347102 -74.53664256999662 -55.734314575050796
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 172.98897688236445 -73.3616425699966 -54.93826859021808
+ vertex 172.5047056010948 -73.64123672459844 -54.50918830920379
+ vertex 170.95381718347102 -74.53664256999662 -55.734314575050796
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 173.55292273376 -73.036048280885 -55.20799973098057
+ vertex 172.98897688236445 -73.3616425699966 -54.93826859021808
+ vertex 170.95381718347102 -74.53664256999662 -55.734314575050796
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 174.1581111774734 -72.68664256999658 -55.30000000000008
+ vertex 173.55292273376 -73.036048280885 -55.20799973098057
+ vertex 170.95381718347102 -74.53664256999662 -55.734314575050796
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 169.30836891628044 -75.48664256999643 -46.434314575050855
+ vertex 168.81847096772387 -75.76948528247111 -47.00000000000008
+ vertex 171.44371513202756 -74.25379985752176 -48.900000000000105
+ endloop
+endfacet
+facet normal 0.5000000000000006 -0.8660254037844384 2.97504977010331e-16
+ outer loop
+ vertex 170.95381718347093 -74.53664256999647 -49.465685424949335
+ vertex 171.44371513202756 -74.25379985752176 -48.900000000000105
+ vertex 168.81847096772387 -75.76948528247111 -47.00000000000008
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.9700185742271545e-16
+ outer loop
+ vertex 17.403113027955477 183.22097856533367 -58.80000000000016
+ vertex 17.761743216822698 183.42803380141567 -58.854518677937655
+ vertex 17.04448283908824 183.0139233292516 -58.854518677937655
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.9700185742271545e-16
+ outer loop
+ vertex 16.710292704927927 182.82097856533363 -59.01435935394505
+ vertex 17.04448283908824 183.0139233292516 -58.854518677937655
+ vertex 17.761743216822698 183.42803380141567 -58.854518677937655
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.9700185742271545e-16
+ outer loop
+ vertex 18.095933350983 183.6209785653337 -59.014359353945075
+ vertex 16.710292704927927 182.82097856533363 -59.01435935394505
+ vertex 17.761743216822698 183.42803380141567 -58.854518677937655
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.9700185742271545e-16
+ outer loop
+ vertex 16.42331713084222 182.65529314038437 -59.26862915010169
+ vertex 16.710292704927927 182.82097856533363 -59.01435935394505
+ vertex 18.095933350983 183.6209785653337 -59.014359353945075
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.9700185742271545e-16
+ outer loop
+ vertex 18.38290892506873 183.78666399028293 -59.26862915010171
+ vertex 16.42331713084222 182.65529314038437 -59.26862915010169
+ vertex 18.095933350983 183.6209785653337 -59.014359353945075
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.9700185742271545e-16
+ outer loop
+ vertex 16.203113027955485 182.52815824230603 -59.600000000000165
+ vertex 16.42331713084222 182.65529314038437 -59.26862915010169
+ vertex 18.38290892506873 183.78666399028293 -59.26862915010171
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.9700185742271545e-16
+ outer loop
+ vertex 18.603113027955455 183.9137988883612 -59.600000000000186
+ vertex 16.203113027955485 182.52815824230603 -59.600000000000165
+ vertex 18.38290892506873 183.78666399028293 -59.26862915010171
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.9700185742271545e-16
+ outer loop
+ vertex 16.06468694197501 182.44823790430235 -59.98588952783613
+ vertex 16.203113027955485 182.52815824230603 -59.600000000000165
+ vertex 18.603113027955455 183.9137988883612 -59.600000000000186
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.9700185742271545e-16
+ outer loop
+ vertex 18.741539113935957 183.99371922636493 -59.98588952783615
+ vertex 16.06468694197501 182.44823790430235 -59.98588952783613
+ vertex 18.603113027955455 183.9137988883612 -59.600000000000186
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.9700185742271545e-16
+ outer loop
+ vertex 16.017472381900408 182.42097856533357 -60.40000000000016
+ vertex 16.06468694197501 182.44823790430235 -59.98588952783613
+ vertex 18.741539113935957 183.99371922636493 -59.98588952783615
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.9700185742271545e-16
+ outer loop
+ vertex 18.788753674010536 184.02097856533365 -60.40000000000018
+ vertex 16.017472381900408 182.42097856533357 -60.40000000000016
+ vertex 18.741539113935957 183.99371922636493 -59.98588952783615
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.9700185742271545e-16
+ outer loop
+ vertex 16.064686941975005 182.44823790430232 -60.814110472164195
+ vertex 16.017472381900408 182.42097856533357 -60.40000000000016
+ vertex 18.788753674010536 184.02097856533365 -60.40000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.9700185742271545e-16
+ outer loop
+ vertex 18.741539113935957 183.9937192263649 -60.81411047216422
+ vertex 16.064686941975005 182.44823790430232 -60.814110472164195
+ vertex 18.788753674010536 184.02097856533365 -60.40000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.9700185742271545e-16
+ outer loop
+ vertex 16.20311302795551 182.528158242306 -61.20000000000016
+ vertex 16.064686941975005 182.44823790430232 -60.814110472164195
+ vertex 18.741539113935957 183.9937192263649 -60.81411047216422
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.9700185742271545e-16
+ outer loop
+ vertex 18.60311302795548 183.91379888836119 -61.20000000000018
+ vertex 16.20311302795551 182.528158242306 -61.20000000000016
+ vertex 18.741539113935957 183.9937192263649 -60.81411047216422
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.9700185742271545e-16
+ outer loop
+ vertex 16.423317130842236 182.6552931403843 -61.53137084989863
+ vertex 16.20311302795551 182.528158242306 -61.20000000000016
+ vertex 18.60311302795548 183.91379888836119 -61.20000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.9700185742271545e-16
+ outer loop
+ vertex 18.382908925068755 183.78666399028285 -61.53137084989868
+ vertex 16.423317130842236 182.6552931403843 -61.53137084989863
+ vertex 18.60311302795548 183.91379888836119 -61.20000000000018
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.9700185742271545e-16
+ outer loop
+ vertex 16.710292704927937 182.82097856533352 -61.78564064605527
+ vertex 16.423317130842236 182.6552931403843 -61.53137084989863
+ vertex 18.382908925068755 183.78666399028285 -61.53137084989868
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.9700185742271545e-16
+ outer loop
+ vertex 18.095933350983042 183.6209785653336 -61.78564064605529
+ vertex 16.710292704927937 182.82097856533352 -61.78564064605527
+ vertex 18.382908925068755 183.78666399028285 -61.53137084989868
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.9700185742271545e-16
+ outer loop
+ vertex 17.044482839088296 183.0139233292515 -61.94548132206268
+ vertex 16.710292704927937 182.82097856533352 -61.78564064605527
+ vertex 18.095933350983042 183.6209785653336 -61.78564064605529
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.9700185742271545e-16
+ outer loop
+ vertex 17.76174321682269 183.42803380141555 -61.94548132206268
+ vertex 17.044482839088296 183.0139233292515 -61.94548132206268
+ vertex 18.095933350983042 183.6209785653336 -61.78564064605529
+ endloop
+endfacet
+facet normal -0.5000000000000006 0.8660254037844384 -2.9700185742271545e-16
+ outer loop
+ vertex 17.40311302795549 183.22097856533355 -62.00000000000018
+ vertex 17.044482839088296 183.0139233292515 -61.94548132206268
+ vertex 17.76174321682269 183.42803380141555 -61.94548132206268
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.102597550340814 188.82097856533446 -21.199999999999967
+ vertex 27.449007711854534 189.02097856533447 -22.599999999999966
+ vertex 27.102597550340754 188.82097856533446 -22.599999999999966
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.449007711854534 189.02097856533447 -22.599999999999966
+ vertex 27.102597550340814 188.82097856533446 -21.199999999999967
+ vertex 30.554479138125107 190.81392332925256 -22.34548132206245
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.449007711854534 189.02097856533447 -22.599999999999966
+ vertex 30.554479138125107 190.81392332925256 -22.34548132206245
+ vertex 30.91310932699229 191.0209785653346 -22.399999999999945
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.449007711854534 189.02097856533447 -22.599999999999966
+ vertex 30.91310932699229 191.0209785653346 -22.399999999999945
+ vertex 32.702339811533555 192.05399126722685 -22.49999999999997
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 30.554479138125107 190.81392332925256 -22.34548132206245
+ vertex 27.102597550340814 188.82097856533446 -21.199999999999967
+ vertex 30.220289003964727 190.62097856533455 -22.18564064605505
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 30.220289003964727 190.62097856533455 -22.18564064605505
+ vertex 27.102597550340814 188.82097856533446 -21.199999999999967
+ vertex 29.933313429879036 190.4552931403853 -21.93137084989843
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.933313429879036 190.4552931403853 -21.93137084989843
+ vertex 27.102597550340814 188.82097856533446 -21.199999999999967
+ vertex 29.7131093269923 190.32815824230696 -21.599999999999934
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.7131093269923 190.32815824230696 -21.599999999999934
+ vertex 27.102597550340814 188.82097856533446 -21.199999999999967
+ vertex 29.574683241011822 190.24823790430327 -21.21411047216397
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.574683241011822 190.24823790430327 -21.21411047216397
+ vertex 27.102597550340814 188.82097856533446 -21.199999999999967
+ vertex 29.007853438666555 189.9209785653345 -21.199999999999957
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.574683241011822 190.24823790430327 -21.21411047216397
+ vertex 29.007853438666555 189.9209785653345 -21.199999999999957
+ vertex 29.527468680937208 190.2209785653345 -20.799999999999937
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.527468680937208 190.2209785653345 -20.799999999999937
+ vertex 29.007853438666555 189.9209785653345 -21.199999999999957
+ vertex 29.00785343866662 189.9209785653344 -19.165685424949217
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.527468680937208 190.2209785653345 -20.799999999999937
+ vertex 29.00785343866662 189.9209785653344 -19.165685424949217
+ vertex 29.57468324101183 190.24823790430324 -20.385889527835904
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.57468324101183 190.24823790430324 -20.385889527835904
+ vertex 29.00785343866662 189.9209785653344 -19.165685424949217
+ vertex 29.713109326992345 190.32815824230696 -19.99999999999994
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.713109326992345 190.32815824230696 -19.99999999999994
+ vertex 29.00785343866662 189.9209785653344 -19.165685424949217
+ vertex 29.933313429879053 190.45529314038524 -19.668629150101474
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.933313429879053 190.45529314038524 -19.668629150101474
+ vertex 29.00785343866662 189.9209785653344 -19.165685424949217
+ vertex 30.220289003964787 190.62097856533444 -19.414359353944835
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 30.220289003964787 190.62097856533444 -19.414359353944835
+ vertex 29.00785343866662 189.9209785653344 -19.165685424949217
+ vertex 30.554479138125096 190.81392332925245 -19.254518677937423
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 30.554479138125096 190.81392332925245 -19.254518677937423
+ vertex 29.00785343866662 189.9209785653344 -19.165685424949217
+ vertex 30.913109326992327 191.02097856533445 -19.19999999999993
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.13973867537193 182.49156904278294 -22.965925826289016
+ vertex 20.867214643092918 185.22097856533435 -22.999999999999954
+ vertex 16.363882543413958 182.6209785653342 -22.999999999999954
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 20.867214643092918 185.22097856533435 -22.999999999999954
+ vertex 16.13973867537193 182.49156904278294 -22.965925826289016
+ vertex 20.86721464309292 185.2209785653343 -22.599999999999955
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 20.86721464309292 185.2209785653343 -22.599999999999955
+ vertex 16.13973867537193 182.49156904278294 -22.965925826289016
+ vertex 15.930869841521712 182.37097856533418 -22.866025403784388
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 20.86721464309292 185.2209785653343 -22.599999999999955
+ vertex 15.930869841521712 182.37097856533418 -22.866025403784388
+ vertex 15.751510107718136 182.26742517474088 -22.7071067811865
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 20.86721464309292 185.2209785653343 -22.599999999999955
+ vertex 15.751510107718136 182.26742517474088 -22.7071067811865
+ vertex 15.613882543413906 182.18796586344192 -22.49999999999995
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 20.86721464309292 185.2209785653343 -22.599999999999955
+ vertex 15.613882543413906 182.18796586344192 -22.49999999999995
+ vertex 21.21362480460668 185.4209785653343 -22.59999999999996
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.21362480460668 185.4209785653343 -22.59999999999996
+ vertex 15.613882543413906 182.18796586344192 -22.49999999999995
+ vertex 17.403113027955243 183.22097856533418 -22.399999999999952
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.21362480460668 185.4209785653343 -22.59999999999996
+ vertex 17.403113027955243 183.22097856533418 -22.399999999999952
+ vertex 17.761743216822477 183.4280338014162 -22.345481322062458
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.21362480460668 185.4209785653343 -22.59999999999996
+ vertex 17.761743216822477 183.4280338014162 -22.345481322062458
+ vertex 21.21362480460668 185.42097856533428 -21.19999999999996
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.21362480460668 185.42097856533428 -21.19999999999996
+ vertex 17.761743216822477 183.4280338014162 -22.345481322062458
+ vertex 18.09593335098276 183.62097856533424 -22.185640646055052
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.21362480460668 185.42097856533428 -21.19999999999996
+ vertex 18.09593335098276 183.62097856533424 -22.185640646055052
+ vertex 18.382908925068513 183.78666399028344 -21.931370849898414
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.21362480460668 185.42097856533428 -21.19999999999996
+ vertex 18.382908925068513 183.78666399028344 -21.931370849898414
+ vertex 18.603113027955242 183.91379888836175 -21.599999999999945
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.21362480460668 185.42097856533428 -21.19999999999996
+ vertex 18.603113027955242 183.91379888836175 -21.599999999999945
+ vertex 18.74153911393574 183.99371922636544 -21.21411047216398
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.21362480460668 185.42097856533428 -21.19999999999996
+ vertex 18.74153911393574 183.99371922636544 -21.21411047216398
+ vertex 19.308368916281005 184.3209785653342 -21.199999999999946
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.308368916281005 184.3209785653342 -21.199999999999946
+ vertex 18.74153911393574 183.99371922636544 -21.21411047216398
+ vertex 18.788753674010355 184.02097856533422 -20.799999999999926
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.308368916281005 184.3209785653342 -21.199999999999946
+ vertex 18.788753674010355 184.02097856533422 -20.799999999999926
+ vertex 19.30836891628103 184.32097856533412 -19.165685424949185
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.30836891628103 184.32097856533412 -19.165685424949185
+ vertex 18.788753674010355 184.02097856533422 -20.799999999999926
+ vertex 18.74153911393574 183.9937192263654 -20.385889527835893
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.30836891628103 184.32097856533412 -19.165685424949185
+ vertex 18.74153911393574 183.9937192263654 -20.385889527835893
+ vertex 18.60311302795526 183.9137988883617 -19.999999999999925
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.30836891628103 184.32097856533412 -19.165685424949185
+ vertex 18.60311302795526 183.9137988883617 -19.999999999999925
+ vertex 18.382908925068534 183.78666399028336 -19.668629150101452
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.30836891628103 184.32097856533412 -19.165685424949185
+ vertex 18.382908925068534 183.78666399028336 -19.668629150101452
+ vertex 18.09593335098283 183.62097856533413 -19.41435935394484
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.30836891628103 184.32097856533412 -19.165685424949185
+ vertex 18.09593335098283 183.62097856533413 -19.41435935394484
+ vertex 17.76174321682251 183.42803380141612 -19.254518677937433
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.30836891628103 184.32097856533412 -19.165685424949185
+ vertex 17.76174321682251 183.42803380141612 -19.254518677937433
+ vertex 17.403113027955293 183.22097856533406 -19.19999999999996
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 15.497857139629833 182.1209785653336 -3.999999999999939
+ vertex 15.844267301143496 182.32097856533375 -9.19999999999993
+ vertex 15.497857139629756 182.12097856533373 -9.19999999999993
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 15.844267301143496 182.32097856533375 -9.19999999999993
+ vertex 15.497857139629833 182.1209785653336 -3.999999999999939
+ vertex 16.06468694197509 182.4482379043024 -5.614110472163994
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 15.844267301143496 182.32097856533375 -9.19999999999993
+ vertex 16.06468694197509 182.4482379043024 -5.614110472163994
+ vertex 16.203113027955567 182.5281582423061 -5.999999999999961
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 15.844267301143496 182.32097856533375 -9.19999999999993
+ vertex 16.203113027955567 182.5281582423061 -5.999999999999961
+ vertex 17.056702866441775 183.02097856533373 -7.399999999999959
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.056702866441775 183.02097856533373 -7.399999999999959
+ vertex 16.203113027955567 182.5281582423061 -5.999999999999961
+ vertex 16.423317130842303 182.6552931403844 -6.331370849898432
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.056702866441775 183.02097856533373 -7.399999999999959
+ vertex 16.423317130842303 182.6552931403844 -6.331370849898432
+ vertex 16.71029270492801 182.82097856533372 -6.58564064605507
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.056702866441775 183.02097856533373 -7.399999999999959
+ vertex 16.71029270492801 182.82097856533372 -6.58564064605507
+ vertex 17.04448283908832 183.0139233292517 -6.745481322062464
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.056702866441775 183.02097856533373 -7.399999999999959
+ vertex 17.04448283908832 183.0139233292517 -6.745481322062464
+ vertex 18.818470967724625 184.03813585285917 -7.399999999999961
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 18.818470967724625 184.03813585285917 -7.399999999999961
+ vertex 17.04448283908832 183.0139233292517 -6.745481322062464
+ vertex 17.40311302795556 183.22097856533372 -6.799999999999959
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 18.818470967724625 184.03813585285917 -7.399999999999961
+ vertex 17.40311302795556 183.22097856533372 -6.799999999999959
+ vertex 19.30836891628126 184.32097856533377 -6.834314575050704
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.06468694197509 182.4482379043024 -5.614110472163994
+ vertex 15.497857139629833 182.1209785653336 -3.999999999999939
+ vertex 16.01747238190049 182.42097856533363 -5.199999999999962
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.01747238190049 182.42097856533363 -5.199999999999962
+ vertex 15.497857139629833 182.1209785653336 -3.999999999999939
+ vertex 16.064686941975086 182.44823790430237 -4.785889527835931
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.064686941975086 182.44823790430237 -4.785889527835931
+ vertex 15.497857139629833 182.1209785653336 -3.999999999999939
+ vertex 16.20311302795559 182.52815824230606 -4.399999999999964
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.20311302795559 182.52815824230606 -4.399999999999964
+ vertex 15.497857139629833 182.1209785653336 -3.999999999999939
+ vertex 16.423317130842317 182.65529314038437 -4.068629150101493
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.423317130842317 182.65529314038437 -4.068629150101493
+ vertex 15.497857139629833 182.1209785653336 -3.999999999999939
+ vertex 16.710292704928023 182.8209785653336 -3.8143593539448553
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.710292704928023 182.8209785653336 -3.8143593539448553
+ vertex 15.497857139629833 182.1209785653336 -3.999999999999939
+ vertex 15.527366239676507 182.138015652189 -3.7411809548974277
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.710292704928023 182.8209785653336 -3.8143593539448553
+ vertex 15.527366239676507 182.138015652189 -3.7411809548974277
+ vertex 17.04448283908838 183.01392332925155 -3.654518677937438
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.04448283908838 183.01392332925155 -3.654518677937438
+ vertex 15.527366239676507 182.138015652189 -3.7411809548974277
+ vertex 15.613882543414308 182.18796586344135 -3.49999999999994
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.04448283908838 183.01392332925155 -3.654518677937438
+ vertex 15.613882543414308 182.18796586344135 -3.49999999999994
+ vertex 17.403113027955573 183.2209785653336 -3.599999999999943
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.30836891628126 184.32097856533377 -6.834314575050704
+ vertex 18.603113027955537 183.91379888836127 -5.999999999999941
+ vertex 19.308368916281303 184.32097856533372 -4.799999999999966
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 18.603113027955537 183.91379888836127 -5.999999999999941
+ vertex 19.30836891628126 184.32097856533377 -6.834314575050704
+ vertex 18.382908925068815 183.78666399028296 -6.331370849898409
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 18.382908925068815 183.78666399028296 -6.331370849898409
+ vertex 19.30836891628126 184.32097856533377 -6.834314575050704
+ vertex 18.09593335098308 183.62097856533376 -6.5856406460550465
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 18.09593335098308 183.62097856533376 -6.5856406460550465
+ vertex 19.30836891628126 184.32097856533377 -6.834314575050704
+ vertex 17.76174321682278 183.42803380141575 -6.745481322062464
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.76174321682278 183.42803380141575 -6.745481322062464
+ vertex 19.30836891628126 184.32097856533377 -6.834314575050704
+ vertex 17.40311302795556 183.22097856533372 -6.799999999999959
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.308368916281303 184.32097856533372 -4.799999999999966
+ vertex 18.603113027955537 183.91379888836127 -5.999999999999941
+ vertex 18.74153911393604 183.993719226365 -5.614110472163975
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.308368916281303 184.32097856533372 -4.799999999999966
+ vertex 18.74153911393604 183.993719226365 -5.614110472163975
+ vertex 18.788753674010618 184.0209785653337 -5.1999999999999424
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.308368916281303 184.32097856533372 -4.799999999999966
+ vertex 18.788753674010618 184.0209785653337 -5.1999999999999424
+ vertex 18.741539113936042 183.99371922636496 -4.785889527835911
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.308368916281303 184.32097856533372 -4.799999999999966
+ vertex 18.741539113936042 183.99371922636496 -4.785889527835911
+ vertex 21.213624804607 185.42097856533377 -4.799999999999969
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.213624804607 185.42097856533377 -4.799999999999969
+ vertex 18.741539113936042 183.99371922636496 -4.785889527835911
+ vertex 21.213624804607072 185.4209785653337 -3.399999999999949
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.213624804607072 185.4209785653337 -3.399999999999949
+ vertex 18.741539113936042 183.99371922636496 -4.785889527835911
+ vertex 18.603113027955562 183.91379888836124 -4.399999999999944
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.213624804607072 185.4209785653337 -3.399999999999949
+ vertex 18.603113027955562 183.91379888836124 -4.399999999999944
+ vertex 18.38290892506884 183.78666399028288 -4.068629150101447
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.213624804607072 185.4209785653337 -3.399999999999949
+ vertex 18.38290892506884 183.78666399028288 -4.068629150101447
+ vertex 18.095933350983124 183.62097856533364 -3.8143593539448326
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.213624804607072 185.4209785653337 -3.399999999999949
+ vertex 18.095933350983124 183.62097856533364 -3.8143593539448326
+ vertex 17.761743216822772 183.42803380141564 -3.654518677937438
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.213624804607072 185.4209785653337 -3.399999999999949
+ vertex 17.761743216822772 183.42803380141564 -3.654518677937438
+ vertex 17.403113027955573 183.2209785653336 -3.599999999999943
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.213624804607072 185.4209785653337 -3.399999999999949
+ vertex 17.403113027955573 183.2209785653336 -3.599999999999943
+ vertex 15.613882543414308 182.18796586344135 -3.49999999999994
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.213624804607072 185.4209785653337 -3.399999999999949
+ vertex 15.613882543414308 182.18796586344135 -3.49999999999994
+ vertex 20.867214643093302 185.2209785653337 -3.399999999999923
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 20.867214643093302 185.2209785653337 -3.399999999999923
+ vertex 15.613882543414308 182.18796586344135 -3.49999999999994
+ vertex 15.751510107718534 182.26742517474023 -3.29289321881339
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 20.867214643093302 185.2209785653337 -3.399999999999923
+ vertex 15.751510107718534 182.26742517474023 -3.29289321881339
+ vertex 20.8672146430933 185.2209785653337 -2.999999999999924
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 20.8672146430933 185.2209785653337 -2.999999999999924
+ vertex 15.751510107718534 182.26742517474023 -3.29289321881339
+ vertex 15.930869841522087 182.37097856533356 -3.1339745962155057
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 20.8672146430933 185.2209785653337 -2.999999999999924
+ vertex 15.930869841522087 182.37097856533356 -3.1339745962155057
+ vertex 16.13973867537229 182.49156904278232 -3.034074173710881
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 20.8672146430933 185.2209785653337 -2.999999999999924
+ vertex 16.13973867537229 182.49156904278232 -3.034074173710881
+ vertex 16.36388254341431 182.62097856533356 -2.9999999999999436
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.00785343866662 189.9209785653344 -19.165685424949217
+ vertex 29.497751387223236 190.20382127780906 -18.599999999999962
+ vertex 31.259519488506115 191.22097856533446 -18.599999999999977
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.497751387223236 190.20382127780906 -18.599999999999962
+ vertex 29.00785343866662 189.9209785653344 -19.165685424949217
+ vertex 26.87250722291961 188.68813585285966 -16.699999999999974
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.497751387223236 190.20382127780906 -18.599999999999962
+ vertex 26.87250722291961 188.68813585285966 -16.699999999999974
+ vertex 27.36240517147622 188.9709785653343 -16.134314575050695
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.36240517147622 188.9709785653343 -16.134314575050695
+ vertex 26.87250722291961 188.68813585285966 -16.699999999999974
+ vertex 21.44371513202815 185.55382127780877 -16.699999999999946
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.36240517147622 188.9709785653343 -16.134314575050695
+ vertex 21.44371513202815 185.55382127780877 -16.699999999999946
+ vertex 20.953817183471486 185.2709785653341 -16.134314575050713
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.36240517147622 188.9709785653343 -16.134314575050695
+ vertex 20.953817183471486 185.2709785653341 -16.134314575050713
+ vertex 24.15811117747387 187.12097856533418 -15.699999999999937
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 24.15811117747387 187.12097856533418 -15.699999999999937
+ vertex 20.953817183471486 185.2709785653341 -16.134314575050713
+ vertex 23.552922733760443 186.77157285444576 -15.607999730980426
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 23.552922733760443 186.77157285444576 -15.607999730980426
+ vertex 20.953817183471486 185.2709785653341 -16.134314575050713
+ vertex 22.98897688236493 186.44597856533412 -15.338268590217929
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 22.98897688236493 186.44597856533412 -15.338268590217929
+ vertex 20.953817183471486 185.2709785653341 -16.134314575050713
+ vertex 22.504705601095278 186.16638441073223 -14.90918830920364
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 22.504705601095278 186.16638441073223 -14.90918830920364
+ vertex 20.953817183471486 185.2709785653341 -16.134314575050713
+ vertex 22.13311117747392 185.9518442702251 -14.349999999999962
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 22.13311117747392 185.9518442702251 -14.349999999999962
+ vertex 20.953817183471486 185.2709785653341 -16.134314575050713
+ vertex 21.8995171573819 185.8169786998438 -13.69881142177675
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.8995171573819 185.8169786998438 -13.69881142177675
+ vertex 20.953817183471486 185.2709785653341 -16.134314575050713
+ vertex 20.953817183471617 185.2709785653339 -9.865685424949215
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.8995171573819 185.8169786998438 -13.69881142177675
+ vertex 20.953817183471617 185.2709785653339 -9.865685424949215
+ vertex 21.819842587255987 185.77097856533405 -12.999999999999954
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.819842587255987 185.77097856533405 -12.999999999999954
+ vertex 20.953817183471617 185.2709785653339 -9.865685424949215
+ vertex 21.899517157381904 185.81697869984376 -12.301188578223135
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.899517157381904 185.81697869984376 -12.301188578223135
+ vertex 20.953817183471617 185.2709785653339 -9.865685424949215
+ vertex 22.133111177474007 185.95184427022502 -11.649999999999945
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 22.133111177474007 185.95184427022502 -11.649999999999945
+ vertex 20.953817183471617 185.2709785653339 -9.865685424949215
+ vertex 22.50470560109535 186.16638441073218 -11.090811690796267
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 22.50470560109535 186.16638441073218 -11.090811690796267
+ vertex 20.953817183471617 185.2709785653339 -9.865685424949215
+ vertex 22.988976882365 186.445978565334 -10.661731409781979
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 22.988976882365 186.445978565334 -10.661731409781979
+ vertex 20.953817183471617 185.2709785653339 -9.865685424949215
+ vertex 23.552922733760536 186.7715728544456 -10.392000269019471
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 23.552922733760536 186.7715728544456 -10.392000269019471
+ vertex 20.953817183471617 185.2709785653339 -9.865685424949215
+ vertex 24.15811117747398 187.120978565334 -10.299999999999962
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.449007711854534 189.02097856533447 -22.599999999999966
+ vertex 31.95233981153357 191.62097856533464 -22.999999999999968
+ vertex 27.449007711854513 189.0209785653345 -22.999999999999964
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 31.95233981153357 191.62097856533464 -22.999999999999968
+ vertex 27.449007711854534 189.02097856533447 -22.599999999999966
+ vertex 32.176483679575576 191.7503880878859 -22.96592582628903
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.176483679575576 191.7503880878859 -22.96592582628903
+ vertex 27.449007711854534 189.02097856533447 -22.599999999999966
+ vertex 32.38535251342575 191.87097856533467 -22.866025403784406
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.38535251342575 191.87097856533467 -22.866025403784406
+ vertex 27.449007711854534 189.02097856533447 -22.599999999999966
+ vertex 32.56471224722934 191.9745319559279 -22.70710678118652
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.56471224722934 191.9745319559279 -22.70710678118652
+ vertex 27.449007711854534 189.02097856533447 -22.599999999999966
+ vertex 32.702339811533555 192.05399126722685 -22.49999999999997
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 15.527366239676123 182.13801565218958 -22.258819045102463
+ vertex 17.403113027955243 183.22097856533418 -22.399999999999952
+ vertex 15.613882543413906 182.18796586344192 -22.49999999999995
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.403113027955243 183.22097856533418 -22.399999999999952
+ vertex 15.527366239676123 182.13801565218958 -22.258819045102463
+ vertex 17.04448283908803 183.01392332925215 -22.34548132206248
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.04448283908803 183.01392332925215 -22.34548132206248
+ vertex 15.527366239676123 182.13801565218958 -22.258819045102463
+ vertex 16.710292704927685 182.82097856533417 -22.185640646055063
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.710292704927685 182.82097856533417 -22.185640646055063
+ vertex 15.527366239676123 182.13801565218958 -22.258819045102463
+ vertex 15.497857139629497 182.12097856533416 -21.99999999999995
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.710292704927685 182.82097856533417 -22.185640646055063
+ vertex 15.497857139629497 182.12097856533416 -21.99999999999995
+ vertex 16.423317130842 182.65529314038488 -21.93137084989845
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.423317130842 182.65529314038488 -21.93137084989845
+ vertex 15.497857139629497 182.12097856533416 -21.99999999999995
+ vertex 16.203113027955265 182.52815824230657 -21.599999999999977
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.203113027955265 182.52815824230657 -21.599999999999977
+ vertex 15.497857139629497 182.12097856533416 -21.99999999999995
+ vertex 16.064686941974777 182.44823790430289 -21.21411047216401
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.064686941974777 182.44823790430289 -21.21411047216401
+ vertex 15.497857139629497 182.12097856533416 -21.99999999999995
+ vertex 15.497857139629593 182.12097856533398 -16.79999999999996
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.064686941974777 182.44823790430289 -21.21411047216401
+ vertex 15.497857139629593 182.12097856533398 -16.79999999999996
+ vertex 16.01747238190017 182.42097856533408 -20.79999999999998
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.01747238190017 182.42097856533408 -20.79999999999998
+ vertex 15.497857139629593 182.12097856533398 -16.79999999999996
+ vertex 16.064686941974774 182.44823790430286 -20.385889527835946
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.064686941974774 182.44823790430286 -20.385889527835946
+ vertex 15.497857139629593 182.12097856533398 -16.79999999999996
+ vertex 16.20311302795529 182.52815824230652 -19.999999999999957
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.20311302795529 182.52815824230652 -19.999999999999957
+ vertex 15.497857139629593 182.12097856533398 -16.79999999999996
+ vertex 16.423317130842044 182.65529314038483 -19.668629150101488
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.423317130842044 182.65529314038483 -19.668629150101488
+ vertex 15.497857139629593 182.12097856533398 -16.79999999999996
+ vertex 16.710292704927753 182.8209785653341 -19.41435935394485
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 16.710292704927753 182.8209785653341 -19.41435935394485
+ vertex 15.497857139629593 182.12097856533398 -16.79999999999996
+ vertex 17.04448283908808 183.01392332925207 -19.254518677937455
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.04448283908808 183.01392332925207 -19.254518677937455
+ vertex 15.497857139629593 182.12097856533398 -16.79999999999996
+ vertex 17.403113027955293 183.22097856533406 -19.19999999999996
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.403113027955293 183.22097856533406 -19.19999999999996
+ vertex 15.497857139629593 182.12097856533398 -16.79999999999996
+ vertex 17.05670286644153 183.02097856533408 -18.59999999999996
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.403113027955293 183.22097856533406 -19.19999999999996
+ vertex 17.05670286644153 183.02097856533408 -18.59999999999996
+ vertex 19.30836891628103 184.32097856533412 -19.165685424949185
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.05670286644153 183.02097856533408 -18.59999999999996
+ vertex 15.497857139629593 182.12097856533398 -16.79999999999996
+ vertex 15.84426730114338 182.32097856533397 -16.799999999999965
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.05670286644153 183.02097856533408 -18.59999999999996
+ vertex 15.84426730114338 182.32097856533397 -16.799999999999965
+ vertex 17.056702866441597 183.02097856533402 -16.399999999999963
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.056702866441597 183.02097856533402 -16.399999999999963
+ vertex 15.84426730114338 182.32097856533397 -16.799999999999965
+ vertex 15.84426730114338 182.32097856533397 -16.399999999999963
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.36240517147622 188.9709785653343 -16.134314575050695
+ vertex 26.41670519756597 188.4249784308244 -13.698811421776757
+ vertex 27.362405171476354 188.9709785653341 -9.8656854249492
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 26.41670519756597 188.4249784308244 -13.698811421776757
+ vertex 27.36240517147622 188.9709785653343 -16.134314575050695
+ vertex 26.183111177473876 188.2901128604432 -14.349999999999968
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 26.183111177473876 188.2901128604432 -14.349999999999968
+ vertex 27.36240517147622 188.9709785653343 -16.134314575050695
+ vertex 25.811516753852523 188.07557271993602 -14.909188309203646
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 25.811516753852523 188.07557271993602 -14.909188309203646
+ vertex 27.36240517147622 188.9709785653343 -16.134314575050695
+ vertex 25.32724547258287 187.7959785653342 -15.33826859021793
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 25.32724547258287 187.7959785653342 -15.33826859021793
+ vertex 27.36240517147622 188.9709785653343 -16.134314575050695
+ vertex 24.76329962118729 187.4703842762226 -15.60799973098044
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 24.76329962118729 187.4703842762226 -15.60799973098044
+ vertex 27.36240517147622 188.9709785653343 -16.134314575050695
+ vertex 24.15811117747387 187.12097856533418 -15.699999999999937
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.362405171476354 188.9709785653341 -9.8656854249492
+ vertex 26.41670519756597 188.4249784308244 -13.698811421776757
+ vertex 26.49637976769187 188.47097856533418 -12.99999999999996
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.362405171476354 188.9709785653341 -9.8656854249492
+ vertex 26.49637976769187 188.47097856533418 -12.99999999999996
+ vertex 26.416705197566003 188.42497843082435 -12.301188578223162
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.362405171476354 188.9709785653341 -9.8656854249492
+ vertex 26.416705197566003 188.42497843082435 -12.301188578223162
+ vertex 26.183111177473915 188.2901128604431 -11.649999999999949
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.362405171476354 188.9709785653341 -9.8656854249492
+ vertex 26.183111177473915 188.2901128604431 -11.649999999999949
+ vertex 25.81151675385259 188.07557271993593 -11.09081169079627
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.362405171476354 188.9709785653341 -9.8656854249492
+ vertex 25.81151675385259 188.07557271993593 -11.09081169079627
+ vertex 25.32724547258295 187.79597856533405 -10.661731409781982
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.362405171476354 188.9709785653341 -9.8656854249492
+ vertex 25.32724547258295 187.79597856533405 -10.661731409781982
+ vertex 24.763299621187397 187.47038427622243 -10.392000269019473
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.362405171476354 188.9709785653341 -9.8656854249492
+ vertex 24.763299621187397 187.47038427622243 -10.392000269019473
+ vertex 24.15811117747398 187.120978565334 -10.299999999999962
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.362405171476354 188.9709785653341 -9.8656854249492
+ vertex 24.15811117747398 187.120978565334 -10.299999999999962
+ vertex 20.953817183471617 185.2709785653339 -9.865685424949215
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.362405171476354 188.9709785653341 -9.8656854249492
+ vertex 20.953817183471617 185.2709785653339 -9.865685424949215
+ vertex 21.443715132028256 185.5538212778085 -9.29999999999996
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.443715132028256 185.5538212778085 -9.29999999999996
+ vertex 20.953817183471617 185.2709785653339 -9.865685424949215
+ vertex 18.818470967724625 184.03813585285917 -7.399999999999961
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.443715132028256 185.5538212778085 -9.29999999999996
+ vertex 18.818470967724625 184.03813585285917 -7.399999999999961
+ vertex 19.30836891628126 184.32097856533377 -6.834314575050704
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 15.844267301143496 182.32097856533375 -9.599999999999929
+ vertex 17.056702866441775 183.02097856533373 -7.399999999999959
+ vertex 17.056702866441704 183.0209785653338 -9.599999999999953
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 17.056702866441775 183.02097856533373 -7.399999999999959
+ vertex 15.844267301143496 182.32097856533375 -9.599999999999929
+ vertex 15.844267301143496 182.32097856533375 -9.19999999999993
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.362405171476354 188.9709785653341 -9.8656854249492
+ vertex 26.872507222919705 188.6881358528594 -9.299999999999965
+ vertex 29.49775138722347 190.2038212778087 -7.39999999999995
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 26.872507222919705 188.6881358528594 -9.299999999999965
+ vertex 27.362405171476354 188.9709785653341 -9.8656854249492
+ vertex 21.443715132028256 185.5538212778085 -9.29999999999996
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.49775138722347 190.2038212778087 -7.39999999999995
+ vertex 26.872507222919705 188.6881358528594 -9.299999999999965
+ vertex 29.00785343866681 189.92097856533402 -6.834314575050715
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.49775138722347 190.2038212778087 -7.39999999999995
+ vertex 29.00785343866681 189.92097856533402 -6.834314575050715
+ vertex 31.259519488506292 191.22097856533415 -7.3999999999999275
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 27.102597550341187 188.82097856533392 -3.399999999999954
+ vertex 29.007853438666853 189.920978565334 -4.7999999999999545
+ vertex 27.102597550341113 188.82097856533395 -4.799999999999952
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.007853438666853 189.920978565334 -4.7999999999999545
+ vertex 27.102597550341187 188.82097856533392 -3.399999999999954
+ vertex 29.57468324101212 190.24823790430275 -4.785889527835922
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.57468324101212 190.24823790430275 -4.785889527835922
+ vertex 27.102597550341187 188.82097856533392 -3.399999999999954
+ vertex 29.713109326992594 190.32815824230642 -4.399999999999955
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.713109326992594 190.32815824230642 -4.399999999999955
+ vertex 27.102597550341187 188.82097856533392 -3.399999999999954
+ vertex 29.93331342987934 190.45529314038473 -4.068629150101484
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.93331342987934 190.45529314038473 -4.068629150101484
+ vertex 27.102597550341187 188.82097856533392 -3.399999999999954
+ vertex 30.220289003965053 190.62097856533396 -3.814359353944847
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 30.220289003965053 190.62097856533396 -3.814359353944847
+ vertex 27.102597550341187 188.82097856533392 -3.399999999999954
+ vertex 30.554479138125394 190.81392332925194 -3.654518677937452
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 30.554479138125394 190.81392332925194 -3.654518677937452
+ vertex 27.102597550341187 188.82097856533392 -3.399999999999954
+ vertex 30.913109326992597 191.02097856533402 -3.5999999999999566
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 30.913109326992597 191.02097856533402 -3.5999999999999566
+ vertex 27.102597550341187 188.82097856533392 -3.399999999999954
+ vertex 32.70233981153391 192.05399126722628 -3.4999999999999485
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.70233981153391 192.05399126722628 -3.4999999999999485
+ vertex 27.102597550341187 188.82097856533392 -3.399999999999954
+ vertex 27.449007711854946 189.0209785653339 -3.399999999999954
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.70233981153391 192.05399126722628 -3.4999999999999485
+ vertex 27.449007711854946 189.0209785653339 -3.399999999999954
+ vertex 32.56471224722971 191.97453195592732 -3.2928932188133984
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.56471224722971 191.97453195592732 -3.2928932188133984
+ vertex 27.449007711854946 189.0209785653339 -3.399999999999954
+ vertex 27.449007711854982 189.0209785653339 -2.999999999999955
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.56471224722971 191.97453195592732 -3.2928932188133984
+ vertex 27.449007711854982 189.0209785653339 -2.999999999999955
+ vertex 32.385352513426135 191.87097856533404 -3.133974596215514
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.385352513426135 191.87097856533404 -3.133974596215514
+ vertex 27.449007711854982 189.0209785653339 -2.999999999999955
+ vertex 32.176483679575945 191.7503880878853 -3.034074173710887
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.176483679575945 191.7503880878853 -3.034074173710887
+ vertex 27.449007711854982 189.0209785653339 -2.999999999999955
+ vertex 31.952339811533943 191.62097856533404 -2.9999999999999494
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 31.25951948850626 191.2209785653342 -9.599999999999923
+ vertex 32.47195505380448 191.92097856533422 -9.19999999999996
+ vertex 32.47195505380448 191.92097856533425 -9.59999999999996
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.47195505380448 191.92097856533422 -9.19999999999996
+ vertex 31.25951948850626 191.2209785653342 -9.599999999999923
+ vertex 31.259519488506292 191.22097856533415 -7.3999999999999275
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.47195505380448 191.92097856533422 -9.19999999999996
+ vertex 31.259519488506292 191.22097856533415 -7.3999999999999275
+ vertex 32.81836521531824 192.12097856533427 -9.19999999999996
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531824 192.12097856533427 -9.19999999999996
+ vertex 31.259519488506292 191.22097856533415 -7.3999999999999275
+ vertex 32.11310932699257 191.71379888836168 -5.999999999999944
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531824 192.12097856533427 -9.19999999999996
+ vertex 32.11310932699257 191.71379888836168 -5.999999999999944
+ vertex 32.25153541297306 191.79371922636537 -5.614110472163954
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531824 192.12097856533427 -9.19999999999996
+ vertex 32.25153541297306 191.79371922636537 -5.614110472163954
+ vertex 32.81836521531836 192.1209785653341 -3.9999999999999476
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.11310932699257 191.71379888836168 -5.999999999999944
+ vertex 31.259519488506292 191.22097856533415 -7.3999999999999275
+ vertex 31.892905224105828 191.58666399028337 -6.331370849898415
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 31.892905224105828 191.58666399028337 -6.331370849898415
+ vertex 31.259519488506292 191.22097856533415 -7.3999999999999275
+ vertex 31.605929650020105 191.42097856533414 -6.585640646055053
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 31.605929650020105 191.42097856533414 -6.585640646055053
+ vertex 31.259519488506292 191.22097856533415 -7.3999999999999275
+ vertex 31.27173951585978 191.22803380141616 -6.7454813220624334
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 31.27173951585978 191.22803380141616 -6.7454813220624334
+ vertex 31.259519488506292 191.22097856533415 -7.3999999999999275
+ vertex 30.913109326992572 191.0209785653341 -6.799999999999951
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 30.913109326992572 191.0209785653341 -6.799999999999951
+ vertex 31.259519488506292 191.22097856533415 -7.3999999999999275
+ vertex 29.00785343866681 189.92097856533402 -6.834314575050715
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531836 192.1209785653341 -3.9999999999999476
+ vertex 32.25153541297306 191.79371922636537 -5.614110472163954
+ vertex 32.29874997304768 191.82097856533412 -5.199999999999923
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531836 192.1209785653341 -3.9999999999999476
+ vertex 32.29874997304768 191.82097856533412 -5.199999999999923
+ vertex 32.25153541297306 191.79371922636534 -4.785889527835891
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531836 192.1209785653341 -3.9999999999999476
+ vertex 32.25153541297306 191.79371922636534 -4.785889527835891
+ vertex 32.11310932699258 191.71379888836162 -4.399999999999924
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531836 192.1209785653341 -3.9999999999999476
+ vertex 32.11310932699258 191.71379888836162 -4.399999999999924
+ vertex 31.892905224105863 191.58666399028328 -4.068629150101453
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531836 192.1209785653341 -3.9999999999999476
+ vertex 31.892905224105863 191.58666399028328 -4.068629150101453
+ vertex 31.60592965002015 191.42097856533402 -3.8143593539448384
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531836 192.1209785653341 -3.9999999999999476
+ vertex 31.60592965002015 191.42097856533402 -3.8143593539448384
+ vertex 32.78885611527171 192.10394147847862 -3.741180954897436
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.78885611527171 192.10394147847862 -3.741180954897436
+ vertex 31.60592965002015 191.42097856533402 -3.8143593539448384
+ vertex 31.27173951585983 191.22803380141602 -3.654518677937407
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.78885611527171 192.10394147847862 -3.741180954897436
+ vertex 31.27173951585983 191.22803380141602 -3.654518677937407
+ vertex 32.70233981153391 192.05399126722628 -3.4999999999999485
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.70233981153391 192.05399126722628 -3.4999999999999485
+ vertex 31.27173951585983 191.22803380141602 -3.654518677937407
+ vertex 30.913109326992597 191.02097856533402 -3.5999999999999566
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.00785343866681 189.92097856533402 -6.834314575050715
+ vertex 30.554479138125338 190.81392332925208 -6.745481322062478
+ vertex 30.913109326992572 191.0209785653341 -6.799999999999951
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 30.554479138125338 190.81392332925208 -6.745481322062478
+ vertex 29.00785343866681 189.92097856533402 -6.834314575050715
+ vertex 30.220289003965032 190.6209785653341 -6.585640646055061
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 30.220289003965032 190.6209785653341 -6.585640646055061
+ vertex 29.00785343866681 189.92097856533402 -6.834314575050715
+ vertex 29.933313429879313 190.4552931403848 -6.3313708498984465
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.933313429879313 190.4552931403848 -6.3313708498984465
+ vertex 29.00785343866681 189.92097856533402 -6.834314575050715
+ vertex 29.713109326992605 190.3281582423065 -5.999999999999975
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.713109326992605 190.3281582423065 -5.999999999999975
+ vertex 29.00785343866681 189.92097856533402 -6.834314575050715
+ vertex 29.007853438666853 189.920978565334 -4.7999999999999545
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.713109326992605 190.3281582423065 -5.999999999999975
+ vertex 29.007853438666853 189.920978565334 -4.7999999999999545
+ vertex 29.574683241012092 190.24823790430275 -5.6141104721640085
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.574683241012092 190.24823790430275 -5.6141104721640085
+ vertex 29.007853438666853 189.920978565334 -4.7999999999999545
+ vertex 29.527468680937478 190.220978565334 -5.199999999999976
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 29.527468680937478 190.220978565334 -5.199999999999976
+ vertex 29.007853438666853 189.920978565334 -4.7999999999999545
+ vertex 29.57468324101212 190.24823790430275 -4.785889527835922
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 19.30836891628103 184.32097856533412 -19.165685424949185
+ vertex 18.818470967724387 184.03813585285948 -18.599999999999948
+ vertex 21.44371513202815 185.55382127780877 -16.699999999999946
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 18.818470967724387 184.03813585285948 -18.599999999999948
+ vertex 19.30836891628103 184.32097856533412 -19.165685424949185
+ vertex 17.05670286644153 183.02097856533408 -18.59999999999996
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 21.44371513202815 185.55382127780877 -16.699999999999946
+ vertex 18.818470967724387 184.03813585285948 -18.599999999999948
+ vertex 20.953817183471486 185.2709785653341 -16.134314575050713
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 31.259519488506154 191.2209785653344 -16.39999999999998
+ vertex 32.47195505380433 191.92097856533445 -16.800000000000004
+ vertex 31.259519488506115 191.22097856533446 -18.599999999999977
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.47195505380433 191.92097856533445 -16.800000000000004
+ vertex 31.259519488506154 191.2209785653344 -16.39999999999998
+ vertex 32.471955053804315 191.92097856533445 -16.400000000000002
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 30.91310932699229 191.0209785653346 -22.399999999999945
+ vertex 32.78885611527138 192.10394147847913 -22.25881904510248
+ vertex 32.702339811533555 192.05399126722685 -22.49999999999997
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.78885611527138 192.10394147847913 -22.25881904510248
+ vertex 30.91310932699229 191.0209785653346 -22.399999999999945
+ vertex 31.27173951585951 191.22803380141661 -22.34548132206245
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.78885611527138 192.10394147847913 -22.25881904510248
+ vertex 31.27173951585951 191.22803380141661 -22.34548132206245
+ vertex 31.605929650019835 191.42097856533465 -22.185640646055035
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.78885611527138 192.10394147847913 -22.25881904510248
+ vertex 31.605929650019835 191.42097856533465 -22.185640646055035
+ vertex 32.81836521531802 192.1209785653346 -21.99999999999997
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531802 192.1209785653346 -21.99999999999997
+ vertex 31.605929650019835 191.42097856533465 -22.185640646055035
+ vertex 31.89290522410554 191.58666399028385 -21.93137084989842
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531802 192.1209785653346 -21.99999999999997
+ vertex 31.89290522410554 191.58666399028385 -21.93137084989842
+ vertex 32.11310932699228 191.71379888836213 -21.599999999999927
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531802 192.1209785653346 -21.99999999999997
+ vertex 32.11310932699228 191.71379888836213 -21.599999999999927
+ vertex 32.251535412972764 191.79371922636585 -21.21411047216396
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531802 192.1209785653346 -21.99999999999997
+ vertex 32.251535412972764 191.79371922636585 -21.21411047216396
+ vertex 32.81836521531808 192.12097856533444 -16.800000000000004
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531808 192.12097856533444 -16.800000000000004
+ vertex 32.251535412972764 191.79371922636585 -21.21411047216396
+ vertex 32.29874997304738 191.82097856533457 -20.79999999999993
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531808 192.12097856533444 -16.800000000000004
+ vertex 32.29874997304738 191.82097856533457 -20.79999999999993
+ vertex 32.25153541297277 191.79371922636582 -20.385889527835896
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531808 192.12097856533444 -16.800000000000004
+ vertex 32.25153541297277 191.79371922636582 -20.385889527835896
+ vertex 32.11310932699228 191.7137988883621 -19.99999999999993
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531808 192.12097856533444 -16.800000000000004
+ vertex 32.11310932699228 191.7137988883621 -19.99999999999993
+ vertex 31.89290522410557 191.58666399028374 -19.66862915010146
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531808 192.12097856533444 -16.800000000000004
+ vertex 31.89290522410557 191.58666399028374 -19.66862915010146
+ vertex 31.60592965001985 191.42097856533454 -19.41435935394482
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531808 192.12097856533444 -16.800000000000004
+ vertex 31.60592965001985 191.42097856533454 -19.41435935394482
+ vertex 31.27173951585956 191.2280338014165 -19.254518677937426
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531808 192.12097856533444 -16.800000000000004
+ vertex 31.27173951585956 191.2280338014165 -19.254518677937426
+ vertex 30.913109326992327 191.02097856533445 -19.19999999999993
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531808 192.12097856533444 -16.800000000000004
+ vertex 30.913109326992327 191.02097856533445 -19.19999999999993
+ vertex 31.259519488506115 191.22097856533446 -18.599999999999977
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 31.259519488506115 191.22097856533446 -18.599999999999977
+ vertex 30.913109326992327 191.02097856533445 -19.19999999999993
+ vertex 29.00785343866662 189.9209785653344 -19.165685424949217
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.975049770103308e-16
+ outer loop
+ vertex 32.81836521531808 192.12097856533444 -16.800000000000004
+ vertex 31.259519488506115 191.22097856533446 -18.599999999999977
+ vertex 32.47195505380433 191.92097856533445 -16.800000000000004
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 181.9523398115329 -68.18664256999598 -23.000000000000057
+ vertex 27.449007711854513 189.0209785653345 -22.999999999999964
+ vertex 31.95233981153357 191.62097856533464 -22.999999999999968
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 27.449007711854513 189.0209785653345 -22.999999999999964
+ vertex 181.9523398115329 -68.18664256999598 -23.000000000000057
+ vertex 177.44900771185388 -70.7866425699962 -23.000000000000053
+ endloop
+endfacet
+facet normal 0.11303899832181251 0.0652630961100721 -0.9914448613738078
+ outer loop
+ vertex 182.17648367957491 -68.05723304744475 -22.96592582628912
+ vertex 31.95233981153357 191.62097856533464 -22.999999999999968
+ vertex 32.176483679575576 191.7503880878859 -22.96592582628903
+ endloop
+endfacet
+facet normal 0.11303899832181251 0.0652630961100721 -0.9914448613738078
+ outer loop
+ vertex 31.95233981153357 191.62097856533464 -22.999999999999968
+ vertex 182.17648367957491 -68.05723304744475 -22.96592582628912
+ vertex 181.9523398115329 -68.18664256999598 -23.000000000000057
+ endloop
+endfacet
+facet normal -2.189385090694423e-14 2.884359777632179e-14 -1.0
+ outer loop
+ vertex 176.8725072229189 -71.11948528247095 -16.700000000000063
+ vertex 21.44371513202815 185.55382127780877 -16.699999999999946
+ vertex 26.87250722291961 188.68813585285966 -16.699999999999974
+ endloop
+endfacet
+facet normal -2.189385090694423e-14 2.884359777632179e-14 -1.0
+ outer loop
+ vertex 21.44371513202815 185.55382127780877 -16.699999999999946
+ vertex 176.8725072229189 -71.11948528247095 -16.700000000000063
+ vertex 171.44371513202742 -74.25379985752184 -16.700000000000028
+ endloop
+endfacet
+facet normal 0.33141357403555705 0.1913417161825882 -0.9238795325112902
+ outer loop
+ vertex 182.38535251342515 -67.93664256999604 -22.86602540378449
+ vertex 32.176483679575576 191.7503880878859 -22.96592582628903
+ vertex 32.38535251342575 191.87097856533467 -22.866025403784406
+ endloop
+endfacet
+facet normal 0.33141357403555705 0.1913417161825882 -0.9238795325112902
+ outer loop
+ vertex 32.176483679575576 191.7503880878859 -22.96592582628903
+ vertex 182.38535251342515 -67.93664256999604 -22.86602540378449
+ vertex 182.17648367957491 -68.05723304744475 -22.96592582628912
+ endloop
+endfacet
+facet normal 0.5272028623656286 0.3043807145043965 -0.7933533402912483
+ outer loop
+ vertex 182.5647122472287 -67.83308917940278 -22.70710678118661
+ vertex 32.38535251342575 191.87097856533467 -22.866025403784406
+ vertex 32.56471224722934 191.9745319559279 -22.70710678118652
+ endloop
+endfacet
+facet normal 0.5272028623656286 0.3043807145043965 -0.7933533402912483
+ outer loop
+ vertex 32.38535251342575 191.87097856533467 -22.866025403784406
+ vertex 182.5647122472287 -67.83308917940278 -22.70710678118661
+ vertex 182.38535251342515 -67.93664256999604 -22.86602540378449
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 7.797766215937043e-16
+ outer loop
+ vertex 181.25951948850548 -68.5866425699962 -18.60000000000006
+ vertex 31.259519488506154 191.2209785653344 -16.39999999999998
+ vertex 31.259519488506115 191.22097856533446 -18.599999999999977
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 7.797766215937043e-16
+ outer loop
+ vertex 31.259519488506154 191.2209785653344 -16.39999999999998
+ vertex 181.25951948850548 -68.5866425699962 -18.60000000000006
+ vertex 181.25951948850548 -68.58664256999624 -16.400000000000063
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 6.227439144697608e-15
+ outer loop
+ vertex 177.44900771185388 -70.7866425699962 -23.000000000000053
+ vertex 27.449007711854534 189.02097856533447 -22.599999999999966
+ vertex 27.449007711854513 189.0209785653345 -22.999999999999964
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 6.227439144697608e-15
+ outer loop
+ vertex 27.449007711854534 189.02097856533447 -22.599999999999966
+ vertex 177.44900771185388 -70.7866425699962 -23.000000000000053
+ vertex 177.4490077118538 -70.78664256999616 -22.600000000000055
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 179.00785343866588 -69.88664256999613 -21.200000000000056
+ vertex 29.00785343866662 189.9209785653344 -19.165685424949217
+ vertex 29.007853438666555 189.9209785653345 -21.199999999999957
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 29.00785343866662 189.9209785653344 -19.165685424949217
+ vertex 179.00785343866588 -69.88664256999613 -21.200000000000056
+ vertex 179.00785343866593 -69.88664256999623 -19.16568542494932
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 19.30836891628103 184.32097856533412 -19.165685424949185
+ vertex 169.30836891628033 -75.48664256999649 -21.200000000000035
+ vertex 19.308368916281005 184.3209785653342 -21.199999999999946
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 169.30836891628033 -75.48664256999649 -21.200000000000035
+ vertex 19.30836891628103 184.32097856533412 -19.165685424949185
+ vertex 169.30836891628033 -75.48664256999649 -19.165685424949274
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 29.497751387223236 190.20382127780906 -18.599999999999962
+ vertex 181.25951948850548 -68.5866425699962 -18.60000000000006
+ vertex 31.259519488506115 191.22097856533446 -18.599999999999977
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 181.25951948850548 -68.5866425699962 -18.60000000000006
+ vertex 29.497751387223236 190.20382127780906 -18.599999999999962
+ vertex 179.49775138722254 -69.6037998575216 -18.60000000000005
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 27.102597550340814 188.82097856533446 -21.199999999999967
+ vertex 179.00785343866588 -69.88664256999613 -21.200000000000056
+ vertex 29.007853438666555 189.9209785653345 -21.199999999999957
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 179.00785343866588 -69.88664256999613 -21.200000000000056
+ vertex 27.102597550340814 188.82097856533446 -21.199999999999967
+ vertex 177.10259755034016 -70.9866425699962 -21.200000000000053
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 20.86721464309292 185.2209785653343 -22.599999999999955
+ vertex 170.8672146430923 -74.58664256999637 -23.000000000000036
+ vertex 20.867214643092918 185.22097856533435 -22.999999999999954
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 170.8672146430923 -74.58664256999637 -23.000000000000036
+ vertex 20.86721464309292 185.2209785653343 -22.599999999999955
+ vertex 170.8672146430922 -74.58664256999637 -22.60000000000004
+ endloop
+endfacet
+facet normal 0.8001031451912467 0.46193976625568567 -0.38268343236507846
+ outer loop
+ vertex 32.78885611527138 192.10394147847913 -22.25881904510248
+ vertex 182.7023398115329 -67.75362986810383 -22.50000000000006
+ vertex 32.702339811533555 192.05399126722685 -22.49999999999997
+ endloop
+endfacet
+facet normal 0.8001031451912467 0.46193976625568567 -0.38268343236507846
+ outer loop
+ vertex 182.7023398115329 -67.75362986810383 -22.50000000000006
+ vertex 32.78885611527138 192.10394147847913 -22.25881904510248
+ vertex 182.78885611527073 -67.7036796568515 -22.258819045102573
+ endloop
+endfacet
+facet normal 0.6123724356957974 0.3535533905932763 0.7071067811865439
+ outer loop
+ vertex 177.36240517147556 -70.83664256999637 -16.134314575050784
+ vertex 29.497751387223236 190.20382127780906 -18.599999999999962
+ vertex 27.36240517147622 188.9709785653343 -16.134314575050695
+ endloop
+endfacet
+facet normal 0.6123724356957974 0.3535533905932763 0.7071067811865439
+ outer loop
+ vertex 29.497751387223236 190.20382127780906 -18.599999999999962
+ vertex 177.36240517147556 -70.83664256999637 -16.134314575050784
+ vertex 179.49775138722254 -69.6037998575216 -18.60000000000005
+ endloop
+endfacet
+facet normal -0.6123724356957947 -0.35355339059327473 -0.707106781186547
+ outer loop
+ vertex 179.00785343866593 -69.88664256999623 -19.16568542494932
+ vertex 26.87250722291961 188.68813585285966 -16.699999999999974
+ vertex 29.00785343866662 189.9209785653344 -19.165685424949217
+ endloop
+endfacet
+facet normal -0.6123724356957947 -0.35355339059327473 -0.707106781186547
+ outer loop
+ vertex 26.87250722291961 188.68813585285966 -16.699999999999974
+ vertex 179.00785343866593 -69.88664256999623 -19.16568542494932
+ vertex 176.8725072229189 -71.11948528247095 -16.700000000000063
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 32.47195505380433 191.92097856533445 -16.800000000000004
+ vertex 182.81836521531744 -67.68664256999622 -16.800000000000093
+ vertex 32.81836521531808 192.12097856533444 -16.800000000000004
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 182.81836521531744 -67.68664256999622 -16.800000000000093
+ vertex 32.47195505380433 191.92097856533445 -16.800000000000004
+ vertex 182.4719550538037 -67.88664256999623 -16.80000000000009
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 171.213624804606 -74.38664256999633 -22.600000000000048
+ vertex 20.86721464309292 185.2209785653343 -22.599999999999955
+ vertex 21.21362480460668 185.4209785653343 -22.59999999999996
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 20.86721464309292 185.2209785653343 -22.599999999999955
+ vertex 171.213624804606 -74.38664256999633 -22.600000000000048
+ vertex 170.8672146430922 -74.58664256999637 -22.60000000000004
+ endloop
+endfacet
+facet normal 3.2732387459073094e-14 -2.2585965780327815e-14 1.0
+ outer loop
+ vertex 31.259519488506154 191.2209785653344 -16.39999999999998
+ vertex 182.47195505380364 -67.88664256999623 -16.400000000000095
+ vertex 32.471955053804315 191.92097856533445 -16.400000000000002
+ endloop
+endfacet
+facet normal 3.2732387459073094e-14 -2.2585965780327815e-14 1.0
+ outer loop
+ vertex 182.47195505380364 -67.88664256999623 -16.400000000000095
+ vertex 31.259519488506154 191.2209785653344 -16.39999999999998
+ vertex 181.25951948850548 -68.58664256999624 -16.400000000000063
+ endloop
+endfacet
+facet normal 0.6123724356957699 0.35355339059331115 -0.7071067811865503
+ outer loop
+ vertex 171.44371513202742 -74.25379985752184 -16.700000000000028
+ vertex 19.30836891628103 184.32097856533412 -19.165685424949185
+ vertex 21.44371513202815 185.55382127780877 -16.699999999999946
+ endloop
+endfacet
+facet normal 0.6123724356957699 0.35355339059331115 -0.7071067811865503
+ outer loop
+ vertex 19.30836891628103 184.32097856533412 -19.165685424949185
+ vertex 171.44371513202742 -74.25379985752184 -16.700000000000028
+ vertex 169.30836891628033 -75.48664256999649 -19.165685424949274
+ endloop
+endfacet
+facet normal -0.1130389983218509 -0.06526309611000974 -0.9914448613738074
+ outer loop
+ vertex 166.36388254341324 -77.18664256999647 -23.00000000000004
+ vertex 16.13973867537193 182.49156904278294 -22.965925826289016
+ vertex 16.363882543413958 182.6209785653342 -22.999999999999954
+ endloop
+endfacet
+facet normal -0.1130389983218509 -0.06526309611000974 -0.9914448613738074
+ outer loop
+ vertex 16.13973867537193 182.49156904278294 -22.965925826289016
+ vertex 166.36388254341324 -77.18664256999647 -23.00000000000004
+ vertex 166.13973867537123 -77.31605209254772 -22.9659258262891
+ endloop
+endfacet
+facet normal -0.3314135740355962 -0.1913417161825235 -0.9238795325112896
+ outer loop
+ vertex 166.13973867537123 -77.31605209254772 -22.9659258262891
+ vertex 15.930869841521712 182.37097856533418 -22.866025403784388
+ vertex 16.13973867537193 182.49156904278294 -22.965925826289016
+ endloop
+endfacet
+facet normal -0.3314135740355962 -0.1913417161825235 -0.9238795325112896
+ outer loop
+ vertex 15.930869841521712 182.37097856533418 -22.866025403784388
+ vertex 166.13973867537123 -77.31605209254772 -22.9659258262891
+ vertex 165.93086984152103 -77.43664256999645 -22.866025403784477
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 2.4387889803801352e-15
+ outer loop
+ vertex 182.81836521531744 -67.68664256999622 -16.800000000000093
+ vertex 32.81836521531802 192.1209785653346 -21.99999999999997
+ vertex 32.81836521531808 192.12097856533444 -16.800000000000004
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 2.4387889803801352e-15
+ outer loop
+ vertex 32.81836521531802 192.1209785653346 -21.99999999999997
+ vertex 182.81836521531744 -67.68664256999622 -16.800000000000093
+ vertex 182.8183652153173 -67.68664256999605 -22.00000000000006
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 177.4490077118538 -70.78664256999616 -22.600000000000055
+ vertex 27.102597550340754 188.82097856533446 -22.599999999999966
+ vertex 27.449007711854534 189.02097856533447 -22.599999999999966
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 27.102597550340754 188.82097856533446 -22.599999999999966
+ vertex 177.4490077118538 -70.78664256999616 -22.600000000000055
+ vertex 177.10259755034005 -70.9866425699962 -22.60000000000005
+ endloop
+endfacet
+facet normal 0.8586164364012412 0.4957224306869379 -0.1305261922200573
+ outer loop
+ vertex 182.8183652153173 -67.68664256999605 -22.00000000000006
+ vertex 32.78885611527138 192.10394147847913 -22.25881904510248
+ vertex 32.81836521531802 192.1209785653346 -21.99999999999997
+ endloop
+endfacet
+facet normal 0.8586164364012412 0.4957224306869379 -0.1305261922200573
+ outer loop
+ vertex 32.78885611527138 192.10394147847913 -22.25881904510248
+ vertex 182.8183652153173 -67.68664256999605 -22.00000000000006
+ vertex 182.78885611527073 -67.7036796568515 -22.258819045102573
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 171.21362480460607 -74.38664256999643 -21.20000000000005
+ vertex 21.21362480460668 185.4209785653343 -22.59999999999996
+ vertex 21.21362480460668 185.42097856533428 -21.19999999999996
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 21.21362480460668 185.4209785653343 -22.59999999999996
+ vertex 171.21362480460607 -74.38664256999643 -21.20000000000005
+ vertex 171.213624804606 -74.38664256999633 -22.600000000000048
+ endloop
+endfacet
+facet normal -0.5272028623656617 -0.30438071450434234 -0.7933533402912472
+ outer loop
+ vertex 165.93086984152103 -77.43664256999645 -22.866025403784477
+ vertex 15.751510107718136 182.26742517474088 -22.7071067811865
+ vertex 15.930869841521712 182.37097856533418 -22.866025403784388
+ endloop
+endfacet
+facet normal -0.5272028623656617 -0.30438071450434234 -0.7933533402912472
+ outer loop
+ vertex 15.751510107718136 182.26742517474088 -22.7071067811865
+ vertex 165.93086984152103 -77.43664256999645 -22.866025403784477
+ vertex 165.75151010771745 -77.54019596058976 -22.707106781186592
+ endloop
+endfacet
+facet normal -0.6870641468694523 -0.39667667014561686 -0.6087614290087188
+ outer loop
+ vertex 15.751510107718136 182.26742517474088 -22.7071067811865
+ vertex 165.61388254341324 -77.61965527188875 -22.50000000000003
+ vertex 15.613882543413906 182.18796586344192 -22.49999999999995
+ endloop
+endfacet
+facet normal -0.6870641468694523 -0.39667667014561686 -0.6087614290087188
+ outer loop
+ vertex 165.61388254341324 -77.61965527188875 -22.50000000000003
+ vertex 15.751510107718136 182.26742517474088 -22.7071067811865
+ vertex 165.75151010771745 -77.54019596058976 -22.707106781186592
+ endloop
+endfacet
+facet normal 0.6870641468694344 0.3966766701456517 -0.6087614290087163
+ outer loop
+ vertex 182.7023398115329 -67.75362986810383 -22.50000000000006
+ vertex 32.56471224722934 191.9745319559279 -22.70710678118652
+ vertex 32.702339811533555 192.05399126722685 -22.49999999999997
+ endloop
+endfacet
+facet normal 0.6870641468694344 0.3966766701456517 -0.6087614290087163
+ outer loop
+ vertex 32.56471224722934 191.9745319559279 -22.70710678118652
+ vertex 182.7023398115329 -67.75362986810383 -22.50000000000006
+ vertex 182.5647122472287 -67.83308917940278 -22.70710678118661
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 4.122523745489034e-14
+ outer loop
+ vertex 177.10259755034005 -70.9866425699962 -22.60000000000005
+ vertex 27.102597550340814 188.82097856533446 -21.199999999999967
+ vertex 27.102597550340754 188.82097856533446 -22.599999999999966
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 4.122523745489034e-14
+ outer loop
+ vertex 27.102597550340814 188.82097856533446 -21.199999999999967
+ vertex 177.10259755034005 -70.9866425699962 -22.60000000000005
+ vertex 177.10259755034016 -70.9866425699962 -21.200000000000053
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -6.007129263248553e-15
+ outer loop
+ vertex 182.47195505380364 -67.88664256999623 -16.400000000000095
+ vertex 32.47195505380433 191.92097856533445 -16.800000000000004
+ vertex 32.471955053804315 191.92097856533445 -16.400000000000002
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -6.007129263248553e-15
+ outer loop
+ vertex 32.47195505380433 191.92097856533445 -16.800000000000004
+ vertex 182.47195505380364 -67.88664256999623 -16.400000000000095
+ vertex 182.4719550538037 -67.88664256999623 -16.80000000000009
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 19.308368916281005 184.3209785653342 -21.199999999999946
+ vertex 171.21362480460607 -74.38664256999643 -21.20000000000005
+ vertex 21.21362480460668 185.42097856533428 -21.19999999999996
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 171.21362480460607 -74.38664256999643 -21.20000000000005
+ vertex 19.308368916281005 184.3209785653342 -21.199999999999946
+ vertex 169.30836891628033 -75.48664256999649 -21.200000000000035
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 170.8672146430923 -74.58664256999637 -23.000000000000036
+ vertex 16.363882543413958 182.6209785653342 -22.999999999999954
+ vertex 20.867214643092918 185.22097856533435 -22.999999999999954
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 16.363882543413958 182.6209785653342 -22.999999999999954
+ vertex 170.8672146430923 -74.58664256999637 -23.000000000000036
+ vertex 166.36388254341324 -77.18664256999647 -23.00000000000004
+ endloop
+endfacet
+facet normal -0.11303899832180275 -0.06526309611006646 0.9914448613738092
+ outer loop
+ vertex 17.403113027955243 183.22097856533418 -22.399999999999952
+ vertex 167.76174321682174 -76.37958733391443 -22.345481322062547
+ vertex 17.761743216822477 183.4280338014162 -22.345481322062458
+ endloop
+endfacet
+facet normal -0.11303899832180275 -0.06526309611006646 0.9914448613738092
+ outer loop
+ vertex 167.76174321682174 -76.37958733391443 -22.345481322062547
+ vertex 17.403113027955243 183.22097856533418 -22.399999999999952
+ vertex 167.40311302795456 -76.58664256999646 -22.400000000000045
+ endloop
+endfacet
+facet normal -0.858616436401242 -0.49572243068693833 -0.13052619222005132
+ outer loop
+ vertex 176.4963797676912 -71.33664256999649 -13.000000000000046
+ vertex 26.416705197566003 188.42497843082435 -12.301188578223162
+ vertex 26.49637976769187 188.47097856533418 -12.99999999999996
+ endloop
+endfacet
+facet normal -0.858616436401242 -0.49572243068693833 -0.13052619222005132
+ outer loop
+ vertex 26.416705197566003 188.42497843082435 -12.301188578223162
+ vertex 176.4963797676912 -71.33664256999649 -13.000000000000046
+ vertex 176.41670519756528 -71.3826427045062 -12.30118857822325
+ endloop
+endfacet
+facet normal -0.5272028623656281 -0.3043807145043962 0.7933533402912488
+ outer loop
+ vertex 25.32724547258287 187.7959785653342 -15.33826859021793
+ vertex 175.81151675385183 -71.73204841539457 -14.909188309203735
+ vertex 25.811516753852523 188.07557271993602 -14.909188309203646
+ endloop
+endfacet
+facet normal -0.5272028623656281 -0.3043807145043962 0.7933533402912488
+ outer loop
+ vertex 175.81151675385183 -71.73204841539457 -14.909188309203735
+ vertex 25.32724547258287 187.7959785653342 -15.33826859021793
+ vertex 175.32724547258218 -72.01164256999641 -15.338268590218007
+ endloop
+endfacet
+facet normal -0.8001031451912652 -0.46193976625565125 -0.38268343236508084
+ outer loop
+ vertex 26.416705197566003 188.42497843082435 -12.301188578223162
+ vertex 176.18311117747325 -71.51750827488755 -11.650000000000038
+ vertex 26.183111177473915 188.2901128604431 -11.649999999999949
+ endloop
+endfacet
+facet normal -0.8001031451912652 -0.46193976625565125 -0.38268343236508084
+ outer loop
+ vertex 176.18311117747325 -71.51750827488755 -11.650000000000038
+ vertex 26.416705197566003 188.42497843082435 -12.301188578223162
+ vertex 176.41670519756528 -71.3826427045062 -12.30118857822325
+ endloop
+endfacet
+facet normal -0.8001031451912611 -0.46193976625566013 -0.38268343236507896
+ outer loop
+ vertex 165.61388254341324 -77.61965527188875 -22.50000000000003
+ vertex 15.527366239676123 182.13801565218958 -22.258819045102463
+ vertex 15.613882543413906 182.18796586344192 -22.49999999999995
+ endloop
+endfacet
+facet normal -0.8001031451912611 -0.46193976625566013 -0.38268343236507896
+ outer loop
+ vertex 15.527366239676123 182.13801565218958 -22.258819045102463
+ vertex 165.61388254341324 -77.61965527188875 -22.50000000000003
+ vertex 165.52736623967544 -77.66960548314107 -22.25881904510254
+ endloop
+endfacet
+facet normal -0.11303899832182693 -0.06526309610999309 -0.9914448613738114
+ outer loop
+ vertex 174.76329962118677 -72.33723685910824 -10.392000269019562
+ vertex 24.15811117747398 187.120978565334 -10.299999999999962
+ vertex 24.763299621187397 187.47038427622243 -10.392000269019473
+ endloop
+endfacet
+facet normal -0.11303899832182693 -0.06526309610999309 -0.9914448613738114
+ outer loop
+ vertex 24.15811117747398 187.120978565334 -10.299999999999962
+ vertex 174.76329962118677 -72.33723685910824 -10.392000269019562
+ vertex 174.15811117747327 -72.68664256999666 -10.30000000000005
+ endloop
+endfacet
+facet normal 0.5272028623656281 0.3043807145043962 -0.7933533402912488
+ outer loop
+ vertex 172.98897688236434 -73.3616425699967 -10.661731409782044
+ vertex 22.50470560109535 186.16638441073218 -11.090811690796267
+ vertex 22.988976882365 186.445978565334 -10.661731409781979
+ endloop
+endfacet
+facet normal 0.5272028623656281 0.3043807145043962 -0.7933533402912488
+ outer loop
+ vertex 22.50470560109535 186.16638441073218 -11.090811690796267
+ vertex 172.98897688236434 -73.3616425699967 -10.661731409782044
+ vertex 172.5047056010947 -73.64123672459854 -11.090811690796333
+ endloop
+endfacet
+facet normal -0.8001031451912407 -0.4619397662556935 0.3826834323650809
+ outer loop
+ vertex 176.18311117747322 -71.51750827488746 -14.350000000000055
+ vertex 26.41670519756597 188.4249784308244 -13.698811421776757
+ vertex 26.183111177473876 188.2901128604432 -14.349999999999968
+ endloop
+endfacet
+facet normal -0.8001031451912407 -0.4619397662556935 0.3826834323650809
+ outer loop
+ vertex 26.41670519756597 188.4249784308244 -13.698811421776757
+ vertex 176.18311117747322 -71.51750827488746 -14.350000000000055
+ vertex 176.41670519756528 -71.3826427045062 -13.698811421776844
+ endloop
+endfacet
+facet normal -0.3314135740356128 -0.19134171618253307 -0.9238795325112817
+ outer loop
+ vertex 175.3272454725822 -72.01164256999655 -10.661731409782071
+ vertex 24.763299621187397 187.47038427622243 -10.392000269019473
+ vertex 25.32724547258295 187.79597856533405 -10.661731409781982
+ endloop
+endfacet
+facet normal -0.3314135740356128 -0.19134171618253307 -0.9238795325112817
+ outer loop
+ vertex 24.763299621187397 187.47038427622243 -10.392000269019473
+ vertex 175.3272454725822 -72.01164256999655 -10.661731409782071
+ vertex 174.76329962118677 -72.33723685910824 -10.392000269019562
+ endloop
+endfacet
+facet normal 0.11303899832182654 0.06526309610999427 0.9914448613738113
+ outer loop
+ vertex 23.552922733760443 186.77157285444576 -15.607999730980426
+ vertex 174.1581111774732 -72.68664256999645 -15.700000000000038
+ vertex 24.15811117747387 187.12097856533418 -15.699999999999937
+ endloop
+endfacet
+facet normal 0.11303899832182654 0.06526309610999427 0.9914448613738113
+ outer loop
+ vertex 174.1581111774732 -72.68664256999645 -15.700000000000038
+ vertex 23.552922733760443 186.77157285444576 -15.607999730980426
+ vertex 173.55292273375974 -73.03604828088491 -15.607999730980529
+ endloop
+endfacet
+facet normal 0.8001031451912652 0.46193976625565125 0.38268343236508084
+ outer loop
+ vertex 21.8995171573819 185.8169786998438 -13.69881142177675
+ vertex 172.13311117747327 -73.85577686510557 -14.350000000000053
+ vertex 22.13311117747392 185.9518442702251 -14.349999999999962
+ endloop
+endfacet
+facet normal 0.8001031451912652 0.46193976625565125 0.38268343236508084
+ outer loop
+ vertex 172.13311117747327 -73.85577686510557 -14.350000000000053
+ vertex 21.8995171573819 185.8169786998438 -13.69881142177675
+ vertex 171.89951715738118 -73.99064243548682 -13.698811421776819
+ endloop
+endfacet
+facet normal 0.33141357403557603 0.19134171618259352 -0.9238795325112824
+ outer loop
+ vertex 173.5529227337599 -73.0360482808851 -10.39200026901956
+ vertex 22.988976882365 186.445978565334 -10.661731409781979
+ vertex 23.552922733760536 186.7715728544456 -10.392000269019471
+ endloop
+endfacet
+facet normal 0.33141357403557603 0.19134171618259352 -0.9238795325112824
+ outer loop
+ vertex 22.988976882365 186.445978565334 -10.661731409781979
+ vertex 173.5529227337599 -73.0360482808851 -10.39200026901956
+ vertex 172.98897688236434 -73.3616425699967 -10.661731409782044
+ endloop
+endfacet
+facet normal -0.6870641468694503 -0.3966766701456213 -0.6087614290087181
+ outer loop
+ vertex 176.18311117747325 -71.51750827488755 -11.650000000000038
+ vertex 25.81151675385259 188.07557271993593 -11.09081169079627
+ vertex 26.183111177473915 188.2901128604431 -11.649999999999949
+ endloop
+endfacet
+facet normal -0.6870641468694503 -0.3966766701456213 -0.6087614290087181
+ outer loop
+ vertex 25.81151675385259 188.07557271993593 -11.09081169079627
+ vertex 176.18311117747325 -71.51750827488755 -11.650000000000038
+ vertex 175.81151675385195 -71.73204841539476 -11.09081169079636
+ endloop
+endfacet
+facet normal -0.8586164364012464 -0.4957224306869296 0.1305261922200552
+ outer loop
+ vertex 26.41670519756597 188.4249784308244 -13.698811421776757
+ vertex 176.4963797676912 -71.33664256999649 -13.000000000000046
+ vertex 26.49637976769187 188.47097856533418 -12.99999999999996
+ endloop
+endfacet
+facet normal -0.8586164364012464 -0.4957224306869296 0.1305261922200552
+ outer loop
+ vertex 176.4963797676912 -71.33664256999649 -13.000000000000046
+ vertex 26.41670519756597 188.4249784308244 -13.698811421776757
+ vertex 176.41670519756528 -71.3826427045062 -13.698811421776844
+ endloop
+endfacet
+facet normal 0.8001031451912417 0.4619397662556828 -0.3826834323650923
+ outer loop
+ vertex 172.1331111774733 -73.85577686510561 -11.650000000000011
+ vertex 21.899517157381904 185.81697869984376 -12.301188578223135
+ vertex 22.133111177474007 185.95184427022502 -11.649999999999945
+ endloop
+endfacet
+facet normal 0.8001031451912417 0.4619397662556828 -0.3826834323650923
+ outer loop
+ vertex 21.899517157381904 185.81697869984376 -12.301188578223135
+ vertex 172.1331111774733 -73.85577686510561 -11.650000000000011
+ vertex 171.89951715738127 -73.99064243548692 -12.3011885782232
+ endloop
+endfacet
+facet normal 0.11303899832179497 0.06526309610997745 0.9914448613738159
+ outer loop
+ vertex 17.04448283908803 183.01392332925215 -22.34548132206248
+ vertex 167.40311302795456 -76.58664256999646 -22.400000000000045
+ vertex 17.403113027955243 183.22097856533418 -22.399999999999952
+ endloop
+endfacet
+facet normal 0.11303899832179497 0.06526309610997745 0.9914448613738159
+ outer loop
+ vertex 167.40311302795456 -76.58664256999646 -22.400000000000045
+ vertex 17.04448283908803 183.01392332925215 -22.34548132206248
+ vertex 167.04448283908738 -76.79369780607844 -22.34548132206257
+ endloop
+endfacet
+facet normal 0.6870641468694518 0.3966766701456166 0.6087614290087193
+ outer loop
+ vertex 172.13311117747327 -73.85577686510557 -14.350000000000053
+ vertex 22.504705601095278 186.16638441073223 -14.90918830920364
+ vertex 22.13311117747392 185.9518442702251 -14.349999999999962
+ endloop
+endfacet
+facet normal 0.6870641468694518 0.3966766701456166 0.6087614290087193
+ outer loop
+ vertex 22.504705601095278 186.16638441073223 -14.90918830920364
+ vertex 172.13311117747327 -73.85577686510557 -14.350000000000053
+ vertex 172.50470560109457 -73.64123672459836 -14.909188309203731
+ endloop
+endfacet
+facet normal -0.5272028623656586 -0.3043807145043462 -0.7933533402912477
+ outer loop
+ vertex 175.81151675385195 -71.73204841539476 -11.09081169079636
+ vertex 25.32724547258295 187.79597856533405 -10.661731409781982
+ vertex 25.81151675385259 188.07557271993593 -11.09081169079627
+ endloop
+endfacet
+facet normal -0.5272028623656586 -0.3043807145043462 -0.7933533402912477
+ outer loop
+ vertex 25.32724547258295 187.79597856533405 -10.661731409781982
+ vertex 175.81151675385195 -71.73204841539476 -11.09081169079636
+ vertex 175.3272454725822 -72.01164256999655 -10.661731409782071
+ endloop
+endfacet
+facet normal -0.11303899832178858 -0.06526309611005687 0.9914448613738115
+ outer loop
+ vertex 24.15811117747387 187.12097856533418 -15.699999999999937
+ vertex 174.76329962118663 -72.33723685910802 -15.607999730980517
+ vertex 24.76329962118729 187.4703842762226 -15.60799973098044
+ endloop
+endfacet
+facet normal -0.11303899832178858 -0.06526309611005687 0.9914448613738115
+ outer loop
+ vertex 174.76329962118663 -72.33723685910802 -15.607999730980517
+ vertex 24.15811117747387 187.12097856533418 -15.699999999999937
+ vertex 174.1581111774732 -72.68664256999645 -15.700000000000038
+ endloop
+endfacet
+facet normal 0.6870641468694304 0.3966766701456494 -0.6087614290087222
+ outer loop
+ vertex 172.5047056010947 -73.64123672459854 -11.090811690796333
+ vertex 22.133111177474007 185.95184427022502 -11.649999999999945
+ vertex 22.50470560109535 186.16638441073218 -11.090811690796267
+ endloop
+endfacet
+facet normal 0.6870641468694304 0.3966766701456494 -0.6087614290087222
+ outer loop
+ vertex 22.133111177474007 185.95184427022502 -11.649999999999945
+ vertex 172.5047056010947 -73.64123672459854 -11.090811690796333
+ vertex 172.1331111774733 -73.85577686510561 -11.650000000000011
+ endloop
+endfacet
+facet normal 0.858616436401242 0.49572243068693833 -0.13052619222005105
+ outer loop
+ vertex 21.899517157381904 185.81697869984376 -12.301188578223135
+ vertex 171.8198425872553 -74.03664256999663 -13.000000000000021
+ vertex 21.819842587255987 185.77097856533405 -12.999999999999954
+ endloop
+endfacet
+facet normal 0.858616436401242 0.49572243068693833 -0.13052619222005105
+ outer loop
+ vertex 171.8198425872553 -74.03664256999663 -13.000000000000021
+ vertex 21.899517157381904 185.81697869984376 -12.301188578223135
+ vertex 171.89951715738127 -73.99064243548692 -12.3011885782232
+ endloop
+endfacet
+facet normal 0.11303899832178858 0.06526309611005687 -0.9914448613738115
+ outer loop
+ vertex 174.15811117747327 -72.68664256999666 -10.30000000000005
+ vertex 23.552922733760536 186.7715728544456 -10.392000269019471
+ vertex 24.15811117747398 187.120978565334 -10.299999999999962
+ endloop
+endfacet
+facet normal 0.11303899832178858 0.06526309611005687 -0.9914448613738115
+ outer loop
+ vertex 23.552922733760536 186.7715728544456 -10.392000269019471
+ vertex 174.15811117747327 -72.68664256999666 -10.30000000000005
+ vertex 173.5529227337599 -73.0360482808851 -10.39200026901956
+ endloop
+endfacet
+facet normal 0.33141357403561683 0.19134171618253823 0.9238795325112792
+ outer loop
+ vertex 16.710292704927685 182.82097856533417 -22.185640646055063
+ vertex 167.04448283908738 -76.79369780607844 -22.34548132206257
+ vertex 17.04448283908803 183.01392332925215 -22.34548132206248
+ endloop
+endfacet
+facet normal 0.33141357403561683 0.19134171618253823 0.9238795325112792
+ outer loop
+ vertex 167.04448283908738 -76.79369780607844 -22.34548132206257
+ vertex 16.710292704927685 182.82097856533417 -22.185640646055063
+ vertex 166.71029270492699 -76.98664256999646 -22.185640646055152
+ endloop
+endfacet
+facet normal -0.6870641468694288 -0.3966766701456541 0.6087614290087209
+ outer loop
+ vertex 25.811516753852523 188.07557271993602 -14.909188309203646
+ vertex 176.18311117747322 -71.51750827488746 -14.350000000000055
+ vertex 26.183111177473876 188.2901128604432 -14.349999999999968
+ endloop
+endfacet
+facet normal -0.6870641468694288 -0.3966766701456541 0.6087614290087209
+ outer loop
+ vertex 176.18311117747322 -71.51750827488746 -14.350000000000055
+ vertex 25.811516753852523 188.07557271993602 -14.909188309203646
+ vertex 175.81151675385183 -71.73204841539457 -14.909188309203735
+ endloop
+endfacet
+facet normal 0.52720286236566 0.3043807145043358 0.7933533402912507
+ outer loop
+ vertex 16.423317130842 182.65529314038488 -21.93137084989845
+ vertex 166.71029270492699 -76.98664256999646 -22.185640646055152
+ vertex 16.710292704927685 182.82097856533417 -22.185640646055063
+ endloop
+endfacet
+facet normal 0.52720286236566 0.3043807145043358 0.7933533402912507
+ outer loop
+ vertex 166.71029270492699 -76.98664256999646 -22.185640646055152
+ vertex 16.423317130842 182.65529314038488 -21.93137084989845
+ vertex 166.4233171308413 -77.15232799494568 -21.931370849898535
+ endloop
+endfacet
+facet normal -0.3314135740355447 -0.19134171618257262 0.923879532511298
+ outer loop
+ vertex 17.761743216822477 183.4280338014162 -22.345481322062458
+ vertex 168.0959333509821 -76.18664256999647 -22.185640646055155
+ vertex 18.09593335098276 183.62097856533424 -22.185640646055052
+ endloop
+endfacet
+facet normal -0.3314135740355447 -0.19134171618257262 0.923879532511298
+ outer loop
+ vertex 168.0959333509821 -76.18664256999647 -22.185640646055155
+ vertex 17.761743216822477 183.4280338014162 -22.345481322062458
+ vertex 167.76174321682174 -76.37958733391443 -22.345481322062547
+ endloop
+endfacet
+facet normal 0.5272028623656586 0.3043807145043462 0.7933533402912477
+ outer loop
+ vertex 22.504705601095278 186.16638441073223 -14.90918830920364
+ vertex 172.98897688236423 -73.36164256999652 -15.33826859021802
+ vertex 22.98897688236493 186.44597856533412 -15.338268590217929
+ endloop
+endfacet
+facet normal 0.5272028623656586 0.3043807145043462 0.7933533402912477
+ outer loop
+ vertex 172.98897688236423 -73.36164256999652 -15.33826859021802
+ vertex 22.504705601095278 186.16638441073223 -14.90918830920364
+ vertex 172.50470560109457 -73.64123672459836 -14.909188309203731
+ endloop
+endfacet
+facet normal 0.3314135740356128 0.19134171618253307 0.9238795325112817
+ outer loop
+ vertex 22.98897688236493 186.44597856533412 -15.338268590217929
+ vertex 173.55292273375974 -73.03604828088491 -15.607999730980529
+ vertex 23.552922733760443 186.77157285444576 -15.607999730980426
+ endloop
+endfacet
+facet normal 0.3314135740356128 0.19134171618253307 0.9238795325112817
+ outer loop
+ vertex 173.55292273375974 -73.03604828088491 -15.607999730980529
+ vertex 22.98897688236493 186.44597856533412 -15.338268590217929
+ vertex 172.98897688236423 -73.36164256999652 -15.33826859021802
+ endloop
+endfacet
+facet normal 0.858616436401242 0.49572243068693833 0.13052619222005132
+ outer loop
+ vertex 171.8198425872553 -74.03664256999663 -13.000000000000021
+ vertex 21.8995171573819 185.8169786998438 -13.69881142177675
+ vertex 21.819842587255987 185.77097856533405 -12.999999999999954
+ endloop
+endfacet
+facet normal 0.858616436401242 0.49572243068693833 0.13052619222005132
+ outer loop
+ vertex 21.8995171573819 185.8169786998438 -13.69881142177675
+ vertex 171.8198425872553 -74.03664256999663 -13.000000000000021
+ vertex 171.89951715738118 -73.99064243548682 -13.698811421776819
+ endloop
+endfacet
+facet normal -0.8586164364012415 -0.49572243068693805 -0.1305261922200554
+ outer loop
+ vertex 15.527366239676123 182.13801565218958 -22.258819045102463
+ vertex 165.49785713962888 -77.68664256999656 -22.00000000000003
+ vertex 15.497857139629497 182.12097856533416 -21.99999999999995
+ endloop
+endfacet
+facet normal -0.8586164364012415 -0.49572243068693805 -0.1305261922200554
+ outer loop
+ vertex 165.49785713962888 -77.68664256999656 -22.00000000000003
+ vertex 15.527366239676123 182.13801565218958 -22.258819045102463
+ vertex 165.52736623967544 -77.66960548314107 -22.25881904510254
+ endloop
+endfacet
+facet normal 0.6870641468694395 0.3966766701456151 0.6087614290087343
+ outer loop
+ vertex 166.20311302795457 -77.27946289302407 -21.600000000000065
+ vertex 16.423317130842 182.65529314038488 -21.93137084989845
+ vertex 16.203113027955265 182.52815824230657 -21.599999999999977
+ endloop
+endfacet
+facet normal 0.6870641468694395 0.3966766701456151 0.6087614290087343
+ outer loop
+ vertex 16.423317130842 182.65529314038488 -21.93137084989845
+ vertex 166.20311302795457 -77.27946289302407 -21.600000000000065
+ vertex 166.4233171308413 -77.15232799494568 -21.931370849898535
+ endloop
+endfacet
+facet normal -0.33141357403557914 -0.19134171618258686 0.9238795325112827
+ outer loop
+ vertex 24.76329962118729 187.4703842762226 -15.60799973098044
+ vertex 175.32724547258218 -72.01164256999641 -15.338268590218007
+ vertex 25.32724547258287 187.7959785653342 -15.33826859021793
+ endloop
+endfacet
+facet normal -0.33141357403557914 -0.19134171618258686 0.9238795325112827
+ outer loop
+ vertex 175.32724547258218 -72.01164256999641 -15.338268590218007
+ vertex 24.76329962118729 187.4703842762226 -15.60799973098044
+ vertex 174.76329962118663 -72.33723685910802 -15.607999730980517
+ endloop
+endfacet
+facet normal -0.33141357403561683 -0.19134171618253823 -0.9238795325112792
+ outer loop
+ vertex 168.09593335098214 -76.18664256999655 -19.41435935394494
+ vertex 17.76174321682251 183.42803380141612 -19.254518677937433
+ vertex 18.09593335098283 183.62097856533413 -19.41435935394484
+ endloop
+endfacet
+facet normal -0.33141357403561683 -0.19134171618253823 -0.9238795325112792
+ outer loop
+ vertex 17.76174321682251 183.42803380141612 -19.254518677937433
+ vertex 168.09593335098214 -76.18664256999655 -19.41435935394494
+ vertex 167.7617432168218 -76.37958733391447 -19.254518677937522
+ endloop
+endfacet
+facet normal 0.11303899832180415 0.06526309611006587 -0.9914448613738092
+ outer loop
+ vertex 167.40311302795456 -76.5866425699965 -19.20000000000005
+ vertex 17.04448283908808 183.01392332925207 -19.254518677937455
+ vertex 17.403113027955293 183.22097856533406 -19.19999999999996
+ endloop
+endfacet
+facet normal 0.11303899832180415 0.06526309611006587 -0.9914448613738092
+ outer loop
+ vertex 17.04448283908808 183.01392332925207 -19.254518677937455
+ vertex 167.40311302795456 -76.5866425699965 -19.20000000000005
+ vertex 167.04448283908738 -76.79369780607858 -19.254518677937543
+ endloop
+endfacet
+facet normal 0.8586164364012477 0.4957224306869304 -0.13052619222004383
+ outer loop
+ vertex 166.06468694197414 -77.35938323102783 -20.385889527836035
+ vertex 16.01747238190017 182.42097856533408 -20.79999999999998
+ vertex 16.064686941974774 182.44823790430286 -20.385889527835946
+ endloop
+endfacet
+facet normal 0.8586164364012477 0.4957224306869304 -0.13052619222004383
+ outer loop
+ vertex 16.01747238190017 182.42097856533408 -20.79999999999998
+ vertex 166.06468694197414 -77.35938323102783 -20.385889527836035
+ vertex 166.01747238189955 -77.3866425699966 -20.800000000000065
+ endloop
+endfacet
+facet normal -0.8586164364012407 -0.4957224306869376 -0.13052619222006184
+ outer loop
+ vertex 168.7887536740097 -75.7866425699965 -20.800000000000026
+ vertex 18.74153911393574 183.9937192263654 -20.385889527835893
+ vertex 18.788753674010355 184.02097856533422 -20.799999999999926
+ endloop
+endfacet
+facet normal -0.8586164364012407 -0.4957224306869376 -0.13052619222006184
+ outer loop
+ vertex 18.74153911393574 183.9937192263654 -20.385889527835893
+ vertex 168.7887536740097 -75.7866425699965 -20.800000000000026
+ vertex 168.7415391139351 -75.81390190896526 -20.385889527835992
+ endloop
+endfacet
+facet normal -0.6870641468694274 -0.3966766701456533 0.6087614290087231
+ outer loop
+ vertex 168.3829089250678 -76.0209571450472 -21.931370849898517
+ vertex 18.603113027955242 183.91379888836175 -21.599999999999945
+ vertex 18.382908925068513 183.78666399028344 -21.931370849898414
+ endloop
+endfacet
+facet normal -0.6870641468694274 -0.3966766701456533 0.6087614290087231
+ outer loop
+ vertex 18.603113027955242 183.91379888836175 -21.599999999999945
+ vertex 168.3829089250678 -76.0209571450472 -21.931370849898517
+ vertex 168.60311302795452 -75.89382224696885 -21.600000000000044
+ endloop
+endfacet
+facet normal 0.8586164364012514 0.4957224306869325 -0.13052619222001063
+ outer loop
+ vertex 166.06468694197437 -77.35938323102829 -4.78588952783602
+ vertex 16.01747238190049 182.42097856533363 -5.199999999999962
+ vertex 16.064686941975086 182.44823790430237 -4.785889527835931
+ endloop
+endfacet
+facet normal 0.8586164364012514 0.4957224306869325 -0.13052619222001063
+ outer loop
+ vertex 16.01747238190049 182.42097856533363 -5.199999999999962
+ vertex 166.06468694197437 -77.35938323102829 -4.78588952783602
+ vertex 166.01747238189978 -77.38664256999695 -5.200000000000053
+ endloop
+endfacet
+facet normal 0.5272028623656548 0.30438071450442294 -0.7933533402912207
+ outer loop
+ vertex 166.71029270492707 -76.98664256999655 -19.414359353944935
+ vertex 16.423317130842044 182.65529314038483 -19.668629150101488
+ vertex 16.710292704927753 182.8209785653341 -19.41435935394485
+ endloop
+endfacet
+facet normal 0.5272028623656548 0.30438071450442294 -0.7933533402912207
+ outer loop
+ vertex 16.423317130842044 182.65529314038483 -19.668629150101488
+ vertex 166.71029270492707 -76.98664256999655 -19.414359353944935
+ vertex 166.42331713084138 -77.15232799494585 -19.668629150101573
+ endloop
+endfacet
+facet normal -0.11303899832179483 -0.06526309610997597 -0.991444861373816
+ outer loop
+ vertex 167.7617432168218 -76.37958733391447 -19.254518677937522
+ vertex 17.403113027955293 183.22097856533406 -19.19999999999996
+ vertex 17.76174321682251 183.42803380141612 -19.254518677937433
+ endloop
+endfacet
+facet normal -0.11303899832179483 -0.06526309610997597 -0.991444861373816
+ outer loop
+ vertex 17.403113027955293 183.22097856533406 -19.19999999999996
+ vertex 167.7617432168218 -76.37958733391447 -19.254518677937522
+ vertex 167.40311302795456 -76.5866425699965 -19.20000000000005
+ endloop
+endfacet
+facet normal 0.8586164364012407 0.4957224306869376 0.13052619222006184
+ outer loop
+ vertex 16.01747238190017 182.42097856533408 -20.79999999999998
+ vertex 166.06468694197412 -77.35938323102783 -21.214110472164098
+ vertex 16.064686941974777 182.44823790430289 -21.21411047216401
+ endloop
+endfacet
+facet normal 0.8586164364012407 0.4957224306869376 0.13052619222006184
+ outer loop
+ vertex 166.06468694197412 -77.35938323102783 -21.214110472164098
+ vertex 16.01747238190017 182.42097856533408 -20.79999999999998
+ vertex 166.01747238189955 -77.3866425699966 -20.800000000000065
+ endloop
+endfacet
+facet normal -0.3314135740355637 -0.1913417161825047 -0.9238795325113052
+ outer loop
+ vertex 168.09593335098245 -76.186642569997 -3.8143593539449228
+ vertex 17.761743216822772 183.42803380141564 -3.654518677937438
+ vertex 18.095933350983124 183.62097856533364 -3.8143593539448326
+ endloop
+endfacet
+facet normal -0.3314135740355637 -0.1913417161825047 -0.9238795325113052
+ outer loop
+ vertex 17.761743216822772 183.42803380141564 -3.654518677937438
+ vertex 168.09593335098245 -76.186642569997 -3.8143593539449228
+ vertex 167.76174321682208 -76.37958733391503 -3.6545186779375283
+ endloop
+endfacet
+facet normal 0.6870641468694274 0.3966766701456533 -0.6087614290087231
+ outer loop
+ vertex 16.423317130842044 182.65529314038483 -19.668629150101488
+ vertex 166.2031130279546 -77.27946289302412 -20.000000000000046
+ vertex 16.20311302795529 182.52815824230652 -19.999999999999957
+ endloop
+endfacet
+facet normal 0.6870641468694274 0.3966766701456533 -0.6087614290087231
+ outer loop
+ vertex 166.2031130279546 -77.27946289302412 -20.000000000000046
+ vertex 16.423317130842044 182.65529314038483 -19.668629150101488
+ vertex 166.42331713084138 -77.15232799494585 -19.668629150101573
+ endloop
+endfacet
+facet normal 0.6870641468694383 0.39667667014565394 -0.6087614290087103
+ outer loop
+ vertex 16.423317130842317 182.65529314038437 -4.068629150101493
+ vertex 166.20311302795488 -77.27946289302452 -4.400000000000054
+ vertex 16.20311302795559 182.52815824230606 -4.399999999999964
+ endloop
+endfacet
+facet normal 0.6870641468694383 0.39667667014565394 -0.6087614290087103
+ outer loop
+ vertex 166.20311302795488 -77.27946289302452 -4.400000000000054
+ vertex 16.423317130842317 182.65529314038437 -4.068629150101493
+ vertex 166.4233171308416 -77.1523279949463 -4.068629150101582
+ endloop
+endfacet
+facet normal -0.8586164364012407 -0.4957224306869376 -0.13052619222006184
+ outer loop
+ vertex 168.78875367400994 -75.78664256999687 -5.200000000000033
+ vertex 18.741539113936042 183.99371922636496 -4.785889527835911
+ vertex 18.788753674010618 184.0209785653337 -5.1999999999999424
+ endloop
+endfacet
+facet normal -0.8586164364012407 -0.4957224306869376 -0.13052619222006184
+ outer loop
+ vertex 18.741539113936042 183.99371922636496 -4.785889527835911
+ vertex 168.78875367400994 -75.78664256999687 -5.200000000000033
+ vertex 168.74153911393532 -75.81390190896572 -4.785889527836001
+ endloop
+endfacet
+facet normal 0.3314135740355858 0.19134171618259352 -0.9238795325112789
+ outer loop
+ vertex 167.04448283908772 -76.79369780607912 -3.6545186779375283
+ vertex 16.710292704928023 182.8209785653336 -3.8143593539448553
+ vertex 17.04448283908838 183.01392332925155 -3.654518677937438
+ endloop
+endfacet
+facet normal 0.3314135740355858 0.19134171618259352 -0.9238795325112789
+ outer loop
+ vertex 16.710292704928023 182.8209785653336 -3.8143593539448553
+ vertex 167.04448283908772 -76.79369780607912 -3.6545186779375283
+ vertex 166.71029270492735 -76.98664256999704 -3.8143593539449454
+ endloop
+endfacet
+facet normal 0.800103145191235 0.4619397662556789 -0.38268343236511065
+ outer loop
+ vertex 16.20311302795559 182.52815824230606 -4.399999999999964
+ vertex 166.06468694197437 -77.35938323102829 -4.78588952783602
+ vertex 16.064686941975086 182.44823790430237 -4.785889527835931
+ endloop
+endfacet
+facet normal 0.800103145191235 0.4619397662556789 -0.38268343236511065
+ outer loop
+ vertex 166.06468694197437 -77.35938323102829 -4.78588952783602
+ vertex 16.20311302795559 182.52815824230606 -4.399999999999964
+ vertex 166.20311302795488 -77.27946289302452 -4.400000000000054
+ endloop
+endfacet
+facet normal 0.3314135740355426 0.1913417161825714 -0.923879532511299
+ outer loop
+ vertex 167.04448283908738 -76.79369780607858 -19.254518677937543
+ vertex 16.710292704927753 182.8209785653341 -19.41435935394485
+ vertex 17.04448283908808 183.01392332925207 -19.254518677937455
+ endloop
+endfacet
+facet normal 0.3314135740355426 0.1913417161825714 -0.923879532511299
+ outer loop
+ vertex 16.710292704927753 182.8209785653341 -19.41435935394485
+ vertex 167.04448283908738 -76.79369780607858 -19.254518677937543
+ vertex 166.71029270492707 -76.98664256999655 -19.414359353944935
+ endloop
+endfacet
+facet normal -0.52720286236566 -0.3043807145043358 -0.7933533402912507
+ outer loop
+ vertex 168.38290892506788 -76.02095714504725 -19.668629150101555
+ vertex 18.09593335098283 183.62097856533413 -19.41435935394484
+ vertex 18.382908925068534 183.78666399028336 -19.668629150101452
+ endloop
+endfacet
+facet normal -0.52720286236566 -0.3043807145043358 -0.7933533402912507
+ outer loop
+ vertex 18.09593335098283 183.62097856533413 -19.41435935394484
+ vertex 168.38290892506788 -76.02095714504725 -19.668629150101555
+ vertex 168.09593335098214 -76.18664256999655 -19.41435935394494
+ endloop
+endfacet
+facet normal 0.8586164364012407 0.4957224306869376 0.13052619222006184
+ outer loop
+ vertex 16.01747238190049 182.42097856533363 -5.199999999999962
+ vertex 166.0646869419744 -77.35938323102825 -5.614110472164084
+ vertex 16.06468694197509 182.4482379043024 -5.614110472163994
+ endloop
+endfacet
+facet normal 0.8586164364012407 0.4957224306869376 0.13052619222006184
+ outer loop
+ vertex 166.0646869419744 -77.35938323102825 -5.614110472164084
+ vertex 16.01747238190049 182.42097856533363 -5.199999999999962
+ vertex 166.01747238189978 -77.38664256999695 -5.200000000000053
+ endloop
+endfacet
+facet normal -0.5272028623656636 -0.3043807145043491 -0.7933533402912432
+ outer loop
+ vertex 168.3829089250682 -76.02095714504779 -4.068629150101538
+ vertex 18.095933350983124 183.62097856533364 -3.8143593539448326
+ vertex 18.38290892506884 183.78666399028288 -4.068629150101447
+ endloop
+endfacet
+facet normal -0.5272028623656636 -0.3043807145043491 -0.7933533402912432
+ outer loop
+ vertex 18.095933350983124 183.62097856533364 -3.8143593539448326
+ vertex 168.3829089250682 -76.02095714504779 -4.068629150101538
+ vertex 168.09593335098245 -76.186642569997 -3.8143593539449228
+ endloop
+endfacet
+facet normal -0.8001031451912619 -0.4619397662556719 -0.38268343236506275
+ outer loop
+ vertex 168.74153911393532 -75.81390190896572 -4.785889527836001
+ vertex 18.603113027955562 183.91379888836124 -4.399999999999944
+ vertex 18.741539113936042 183.99371922636496 -4.785889527835911
+ endloop
+endfacet
+facet normal -0.8001031451912619 -0.4619397662556719 -0.38268343236506275
+ outer loop
+ vertex 18.603113027955562 183.91379888836124 -4.399999999999944
+ vertex 168.74153911393532 -75.81390190896572 -4.785889527836001
+ vertex 168.60311302795486 -75.89382224696935 -4.400000000000034
+ endloop
+endfacet
+facet normal -0.8586164364012476 -0.49572243068693034 0.13052619222004344
+ outer loop
+ vertex 18.74153911393574 183.99371922636544 -21.21411047216398
+ vertex 168.7887536740097 -75.7866425699965 -20.800000000000026
+ vertex 18.788753674010355 184.02097856533422 -20.799999999999926
+ endloop
+endfacet
+facet normal -0.8586164364012476 -0.49572243068693034 0.13052619222004344
+ outer loop
+ vertex 168.7887536740097 -75.7866425699965 -20.800000000000026
+ vertex 18.74153911393574 183.99371922636544 -21.21411047216398
+ vertex 168.74153911393512 -75.81390190896522 -21.21411047216408
+ endloop
+endfacet
+facet normal -0.8001031451912495 -0.4619397662556647 -0.3826834323650973
+ outer loop
+ vertex 168.7415391139351 -75.81390190896526 -20.385889527835992
+ vertex 18.60311302795526 183.9137988883617 -19.999999999999925
+ vertex 18.74153911393574 183.9937192263654 -20.385889527835893
+ endloop
+endfacet
+facet normal -0.8001031451912495 -0.4619397662556647 -0.3826834323650973
+ outer loop
+ vertex 18.60311302795526 183.9137988883617 -19.999999999999925
+ vertex 168.7415391139351 -75.81390190896526 -20.385889527835992
+ vertex 168.60311302795463 -75.89382224696898 -20.000000000000025
+ endloop
+endfacet
+facet normal 0.8001031451912451 0.4619397662556961 -0.3826834323650685
+ outer loop
+ vertex 16.20311302795529 182.52815824230652 -19.999999999999957
+ vertex 166.06468694197414 -77.35938323102783 -20.385889527836035
+ vertex 16.064686941974774 182.44823790430286 -20.385889527835946
+ endloop
+endfacet
+facet normal 0.8001031451912451 0.4619397662556961 -0.3826834323650685
+ outer loop
+ vertex 166.06468694197414 -77.35938323102783 -20.385889527836035
+ vertex 16.20311302795529 182.52815824230652 -19.999999999999957
+ vertex 166.2031130279546 -77.27946289302412 -20.000000000000046
+ endloop
+endfacet
+facet normal -0.11303899832184175 -0.06526309611000446 -0.9914448613738089
+ outer loop
+ vertex 167.76174321682208 -76.37958733391503 -3.6545186779375283
+ vertex 17.403113027955573 183.2209785653336 -3.599999999999943
+ vertex 17.761743216822772 183.42803380141564 -3.654518677937438
+ endloop
+endfacet
+facet normal -0.11303899832184175 -0.06526309611000446 -0.9914448613738089
+ outer loop
+ vertex 17.403113027955573 183.2209785653336 -3.599999999999943
+ vertex 167.76174321682208 -76.37958733391503 -3.6545186779375283
+ vertex 167.40311302795487 -76.58664256999705 -3.600000000000033
+ endloop
+endfacet
+facet normal 0.11303899832180415 0.06526309611006587 -0.9914448613738092
+ outer loop
+ vertex 167.40311302795487 -76.58664256999705 -3.600000000000033
+ vertex 17.04448283908838 183.01392332925155 -3.654518677937438
+ vertex 17.403113027955573 183.2209785653336 -3.599999999999943
+ endloop
+endfacet
+facet normal 0.11303899832180415 0.06526309611006587 -0.9914448613738092
+ outer loop
+ vertex 17.04448283908838 183.01392332925155 -3.654518677937438
+ vertex 167.40311302795487 -76.58664256999705 -3.600000000000033
+ vertex 167.04448283908772 -76.79369780607912 -3.6545186779375283
+ endloop
+endfacet
+facet normal -0.8001031451912454 -0.4619397662556849 0.3826834323650818
+ outer loop
+ vertex 168.60311302795452 -75.89382224696885 -21.600000000000044
+ vertex 18.74153911393574 183.99371922636544 -21.21411047216398
+ vertex 18.603113027955242 183.91379888836175 -21.599999999999945
+ endloop
+endfacet
+facet normal -0.8001031451912454 -0.4619397662556849 0.3826834323650818
+ outer loop
+ vertex 18.74153911393574 183.99371922636544 -21.21411047216398
+ vertex 168.60311302795452 -75.89382224696885 -21.600000000000044
+ vertex 168.74153911393512 -75.81390190896522 -21.21411047216408
+ endloop
+endfacet
+facet normal -0.5272028623656569 -0.3043807145044129 0.7933533402912233
+ outer loop
+ vertex 18.09593335098276 183.62097856533424 -22.185640646055052
+ vertex 168.3829089250678 -76.0209571450472 -21.931370849898517
+ vertex 18.382908925068513 183.78666399028344 -21.931370849898414
+ endloop
+endfacet
+facet normal -0.5272028623656569 -0.3043807145044129 0.7933533402912233
+ outer loop
+ vertex 168.3829089250678 -76.0209571450472 -21.931370849898517
+ vertex 18.09593335098276 183.62097856533424 -22.185640646055052
+ vertex 168.0959333509821 -76.18664256999647 -22.185640646055155
+ endloop
+endfacet
+facet normal 0.5272028623656624 0.30438071450441606 -0.7933533402912182
+ outer loop
+ vertex 166.71029270492735 -76.98664256999704 -3.8143593539449454
+ vertex 16.423317130842317 182.65529314038437 -4.068629150101493
+ vertex 16.710292704928023 182.8209785653336 -3.8143593539448553
+ endloop
+endfacet
+facet normal 0.5272028623656624 0.30438071450441606 -0.7933533402912182
+ outer loop
+ vertex 16.423317130842317 182.65529314038437 -4.068629150101493
+ vertex 166.71029270492735 -76.98664256999704 -3.8143593539449454
+ vertex 166.4233171308416 -77.1523279949463 -4.068629150101582
+ endloop
+endfacet
+facet normal 0.8001031451912495 0.4619397662556647 0.3826834323650973
+ outer loop
+ vertex 166.06468694197412 -77.35938323102783 -21.214110472164098
+ vertex 16.203113027955265 182.52815824230657 -21.599999999999977
+ vertex 16.064686941974777 182.44823790430289 -21.21411047216401
+ endloop
+endfacet
+facet normal 0.8001031451912495 0.4619397662556647 0.3826834323650973
+ outer loop
+ vertex 16.203113027955265 182.52815824230657 -21.599999999999977
+ vertex 166.06468694197412 -77.35938323102783 -21.214110472164098
+ vertex 166.20311302795457 -77.27946289302407 -21.600000000000065
+ endloop
+endfacet
+facet normal 0.8001031451912619 0.4619397662556719 0.38268343236506275
+ outer loop
+ vertex 166.0646869419744 -77.35938323102825 -5.614110472164084
+ vertex 16.203113027955567 182.5281582423061 -5.999999999999961
+ vertex 16.06468694197509 182.4482379043024 -5.614110472163994
+ endloop
+endfacet
+facet normal 0.8001031451912619 0.4619397662556719 0.38268343236506275
+ outer loop
+ vertex 16.203113027955567 182.5281582423061 -5.999999999999961
+ vertex 166.0646869419744 -77.35938323102825 -5.614110472164084
+ vertex 166.20311302795486 -77.27946289302447 -6.000000000000051
+ endloop
+endfacet
+facet normal -0.6870641468694512 -0.39667667014562186 -0.6087614290087167
+ outer loop
+ vertex 168.60311302795486 -75.89382224696935 -4.400000000000034
+ vertex 18.38290892506884 183.78666399028288 -4.068629150101447
+ vertex 18.603113027955562 183.91379888836124 -4.399999999999944
+ endloop
+endfacet
+facet normal -0.6870641468694512 -0.39667667014562186 -0.6087614290087167
+ outer loop
+ vertex 18.38290892506884 183.78666399028288 -4.068629150101447
+ vertex 168.60311302795486 -75.89382224696935 -4.400000000000034
+ vertex 168.3829089250682 -76.02095714504779 -4.068629150101538
+ endloop
+endfacet
+facet normal -0.6870641468694395 -0.3966766701456151 -0.6087614290087343
+ outer loop
+ vertex 168.60311302795463 -75.89382224696898 -20.000000000000025
+ vertex 18.382908925068534 183.78666399028336 -19.668629150101452
+ vertex 18.60311302795526 183.9137988883617 -19.999999999999925
+ endloop
+endfacet
+facet normal -0.6870641468694395 -0.3966766701456151 -0.6087614290087343
+ outer loop
+ vertex 18.382908925068534 183.78666399028336 -19.668629150101452
+ vertex 168.60311302795463 -75.89382224696898 -20.000000000000025
+ vertex 168.38290892506788 -76.02095714504725 -19.668629150101555
+ endloop
+endfacet
+facet normal -0.8586164364012407 -0.4957224306869376 -0.13052619222006184
+ outer loop
+ vertex 32.29874997304768 191.82097856533412 -5.199999999999923
+ vertex 182.2515354129724 -68.01390190896532 -4.785889527835981
+ vertex 32.25153541297306 191.79371922636534 -4.785889527835891
+ endloop
+endfacet
+facet normal -0.8586164364012407 -0.4957224306869376 -0.13052619222006184
+ outer loop
+ vertex 182.2515354129724 -68.01390190896532 -4.785889527835981
+ vertex 32.29874997304768 191.82097856533412 -5.199999999999923
+ vertex 182.29874997304697 -67.98664256999652 -5.200000000000013
+ endloop
+endfacet
+facet normal 0.5272028623656569 0.3043807145044129 -0.7933533402912233
+ outer loop
+ vertex 180.22028900396435 -69.18664256999665 -3.814359353944937
+ vertex 29.93331342987934 190.45529314038473 -4.068629150101484
+ vertex 30.220289003965053 190.62097856533396 -3.814359353944847
+ endloop
+endfacet
+facet normal 0.5272028623656569 0.3043807145044129 -0.7933533402912233
+ outer loop
+ vertex 29.93331342987934 190.45529314038473 -4.068629150101484
+ vertex 180.22028900396435 -69.18664256999665 -3.814359353944937
+ vertex 179.93331342987867 -69.35232799494591 -4.068629150101574
+ endloop
+endfacet
+facet normal -0.3314135740355858 -0.19134171618259352 0.9238795325112789
+ outer loop
+ vertex 17.76174321682278 183.42803380141575 -6.745481322062464
+ vertex 168.09593335098245 -76.18664256999696 -6.585640646055137
+ vertex 18.09593335098308 183.62097856533376 -6.5856406460550465
+ endloop
+endfacet
+facet normal -0.3314135740355858 -0.19134171618259352 0.9238795325112789
+ outer loop
+ vertex 168.09593335098245 -76.18664256999696 -6.585640646055137
+ vertex 17.76174321682278 183.42803380141575 -6.745481322062464
+ vertex 167.76174321682203 -76.37958733391484 -6.745481322062554
+ endloop
+endfacet
+facet normal 0.5272028623656525 0.3043807145043483 0.793353340291251
+ outer loop
+ vertex 29.933313429879313 190.4552931403848 -6.3313708498984465
+ vertex 180.22028900396433 -69.18664256999656 -6.585640646055151
+ vertex 30.220289003965032 190.6209785653341 -6.585640646055061
+ endloop
+endfacet
+facet normal 0.5272028623656525 0.3043807145043483 0.793353340291251
+ outer loop
+ vertex 180.22028900396433 -69.18664256999656 -6.585640646055151
+ vertex 29.933313429879313 190.4552931403848 -6.3313708498984465
+ vertex 179.93331342987864 -69.35232799494582 -6.331370849898536
+ endloop
+endfacet
+facet normal 0.527202862365693 0.3043807145043661 0.7933533402912171
+ outer loop
+ vertex 16.423317130842303 182.6552931403844 -6.331370849898432
+ vertex 166.7102927049273 -76.98664256999696 -6.585640646055159
+ vertex 16.71029270492801 182.82097856533372 -6.58564064605507
+ endloop
+endfacet
+facet normal 0.527202862365693 0.3043807145043661 0.7933533402912171
+ outer loop
+ vertex 166.7102927049273 -76.98664256999696 -6.585640646055159
+ vertex 16.423317130842303 182.6552931403844 -6.331370849898432
+ vertex 166.42331713084158 -77.15232799494622 -6.331370849898522
+ endloop
+endfacet
+facet normal -0.6870641468694383 -0.39667667014565394 0.6087614290087103
+ outer loop
+ vertex 168.3829089250681 -76.0209571450476 -6.3313708498985
+ vertex 18.603113027955537 183.91379888836127 -5.999999999999941
+ vertex 18.382908925068815 183.78666399028296 -6.331370849898409
+ endloop
+endfacet
+facet normal -0.6870641468694383 -0.39667667014565394 0.6087614290087103
+ outer loop
+ vertex 18.603113027955537 183.91379888836127 -5.999999999999941
+ vertex 168.3829089250681 -76.0209571450476 -6.3313708498985
+ vertex 168.60311302795486 -75.89382224696935 -6.000000000000031
+ endloop
+endfacet
+facet normal -0.33141357403561683 -0.19134171618253823 -0.9238795325112792
+ outer loop
+ vertex 181.60592965001945 -68.38664256999657 -3.8143593539449396
+ vertex 31.27173951585983 191.22803380141602 -3.654518677937407
+ vertex 31.60592965002015 191.42097856533402 -3.8143593539448384
+ endloop
+endfacet
+facet normal -0.33141357403561683 -0.19134171618253823 -0.9238795325112792
+ outer loop
+ vertex 31.27173951585983 191.22803380141602 -3.654518677937407
+ vertex 181.60592965001945 -68.38664256999657 -3.8143593539449396
+ vertex 181.27173951585914 -68.57958733391463 -3.65451867793752
+ endloop
+endfacet
+facet normal -0.6870641468694395 -0.3966766701456151 -0.6087614290087343
+ outer loop
+ vertex 182.11310932699186 -68.093822246969 -4.400000000000015
+ vertex 31.892905224105863 191.58666399028328 -4.068629150101453
+ vertex 32.11310932699258 191.71379888836162 -4.399999999999924
+ endloop
+endfacet
+facet normal -0.6870641468694395 -0.3966766701456151 -0.6087614290087343
+ outer loop
+ vertex 31.892905224105863 191.58666399028328 -4.068629150101453
+ vertex 182.11310932699186 -68.093822246969 -4.400000000000015
+ vertex 181.8929052241052 -68.2209571450474 -4.068629150101555
+ endloop
+endfacet
+facet normal 0.3314135740355447 0.19134171618257262 -0.923879532511298
+ outer loop
+ vertex 180.5544791381247 -68.99369780607864 -3.6545186779375425
+ vertex 30.220289003965053 190.62097856533396 -3.814359353944847
+ vertex 30.554479138125394 190.81392332925194 -3.654518677937452
+ endloop
+endfacet
+facet normal 0.3314135740355447 0.19134171618257262 -0.923879532511298
+ outer loop
+ vertex 30.220289003965053 190.62097856533396 -3.814359353944847
+ vertex 180.5544791381247 -68.99369780607864 -3.6545186779375425
+ vertex 180.22028900396435 -69.18664256999665 -3.814359353944937
+ endloop
+endfacet
+facet normal 0.11303899832183627 0.06526309610999989 0.9914448613738097
+ outer loop
+ vertex 17.04448283908832 183.0139233292517 -6.745481322062464
+ vertex 167.40311302795493 -76.58664256999695 -6.80000000000005
+ vertex 17.40311302795556 183.22097856533372 -6.799999999999959
+ endloop
+endfacet
+facet normal 0.11303899832183627 0.06526309610999989 0.9914448613738097
+ outer loop
+ vertex 167.40311302795493 -76.58664256999695 -6.80000000000005
+ vertex 17.04448283908832 183.0139233292517 -6.745481322062464
+ vertex 167.0444828390876 -76.79369780607898 -6.745481322062554
+ endloop
+endfacet
+facet normal 0.6870641468694274 0.3966766701456533 -0.6087614290087231
+ outer loop
+ vertex 29.93331342987934 190.45529314038473 -4.068629150101484
+ vertex 179.7131093269919 -69.47946289302413 -4.400000000000046
+ vertex 29.713109326992594 190.32815824230642 -4.399999999999955
+ endloop
+endfacet
+facet normal 0.6870641468694274 0.3966766701456533 -0.6087614290087231
+ outer loop
+ vertex 179.7131093269919 -69.47946289302413 -4.400000000000046
+ vertex 29.93331342987934 190.45529314038473 -4.068629150101484
+ vertex 179.93331342987867 -69.35232799494591 -4.068629150101574
+ endloop
+endfacet
+facet normal 0.8001031451912454 0.4619397662556849 -0.3826834323650818
+ outer loop
+ vertex 29.713109326992594 190.32815824230642 -4.399999999999955
+ vertex 179.5746832410114 -69.5593832310279 -4.785889527836012
+ vertex 29.57468324101212 190.24823790430275 -4.785889527835922
+ endloop
+endfacet
+facet normal 0.8001031451912454 0.4619397662556849 -0.3826834323650818
+ outer loop
+ vertex 179.5746832410114 -69.5593832310279 -4.785889527836012
+ vertex 29.713109326992594 190.32815824230642 -4.399999999999955
+ vertex 179.7131093269919 -69.47946289302413 -4.400000000000046
+ endloop
+endfacet
+facet normal 0.8586164364012476 0.49572243068693034 -0.13052619222004344
+ outer loop
+ vertex 179.5746832410114 -69.5593832310279 -4.785889527836012
+ vertex 29.527468680937478 190.220978565334 -5.199999999999976
+ vertex 29.57468324101212 190.24823790430275 -4.785889527835922
+ endloop
+endfacet
+facet normal 0.8586164364012476 0.49572243068693034 -0.13052619222004344
+ outer loop
+ vertex 29.527468680937478 190.220978565334 -5.199999999999976
+ vertex 179.5746832410114 -69.5593832310279 -4.785889527836012
+ vertex 179.52746868093678 -69.58664256999661 -5.200000000000067
+ endloop
+endfacet
+facet normal 0.6870641468694338 0.39667667014561186 0.6087614290087427
+ outer loop
+ vertex 166.20311302795486 -77.27946289302447 -6.000000000000051
+ vertex 16.423317130842303 182.6552931403844 -6.331370849898432
+ vertex 16.203113027955567 182.5281582423061 -5.999999999999961
+ endloop
+endfacet
+facet normal 0.6870641468694338 0.39667667014561186 0.6087614290087427
+ outer loop
+ vertex 16.423317130842303 182.6552931403844 -6.331370849898432
+ vertex 166.20311302795486 -77.27946289302447 -6.000000000000051
+ vertex 166.42331713084158 -77.15232799494622 -6.331370849898522
+ endloop
+endfacet
+facet normal -0.8586164364012514 -0.4957224306869325 0.13052619222001063
+ outer loop
+ vertex 168.7415391139354 -75.81390190896572 -5.6141104721640644
+ vertex 18.788753674010618 184.0209785653337 -5.1999999999999424
+ vertex 18.74153911393604 183.993719226365 -5.614110472163975
+ endloop
+endfacet
+facet normal -0.8586164364012514 -0.4957224306869325 0.13052619222001063
+ outer loop
+ vertex 18.788753674010618 184.0209785653337 -5.1999999999999424
+ vertex 168.7415391139354 -75.81390190896572 -5.6141104721640644
+ vertex 168.78875367400994 -75.78664256999687 -5.200000000000033
+ endloop
+endfacet
+facet normal -0.3314135740355426 -0.1913417161825714 0.923879532511299
+ outer loop
+ vertex 31.27173951585978 191.22803380141616 -6.7454813220624334
+ vertex 181.60592965001945 -68.38664256999652 -6.585640646055154
+ vertex 31.605929650020105 191.42097856533414 -6.585640646055053
+ endloop
+endfacet
+facet normal -0.3314135740355426 -0.1913417161825714 0.923879532511299
+ outer loop
+ vertex 181.60592965001945 -68.38664256999652 -6.585640646055154
+ vertex 31.27173951585978 191.22803380141616 -6.7454813220624334
+ vertex 181.2717395158591 -68.57958733391449 -6.745481322062546
+ endloop
+endfacet
+facet normal -0.6870641468694274 -0.3966766701456533 0.6087614290087231
+ outer loop
+ vertex 181.8929052241051 -68.22095714504727 -6.331370849898517
+ vertex 32.11310932699257 191.71379888836168 -5.999999999999944
+ vertex 31.892905224105828 191.58666399028337 -6.331370849898415
+ endloop
+endfacet
+facet normal -0.6870641468694274 -0.3966766701456533 0.6087614290087231
+ outer loop
+ vertex 32.11310932699257 191.71379888836168 -5.999999999999944
+ vertex 181.8929052241051 -68.22095714504727 -6.331370849898517
+ vertex 182.11310932699186 -68.093822246969 -6.000000000000034
+ endloop
+endfacet
+facet normal 0.11303899832180275 0.06526309611006646 -0.9914448613738092
+ outer loop
+ vertex 180.91310932699193 -68.78664256999662 -3.600000000000047
+ vertex 30.554479138125394 190.81392332925194 -3.654518677937452
+ vertex 30.913109326992597 191.02097856533402 -3.5999999999999566
+ endloop
+endfacet
+facet normal 0.11303899832180275 0.06526309611006646 -0.9914448613738092
+ outer loop
+ vertex 30.554479138125394 190.81392332925194 -3.654518677937452
+ vertex 180.91310932699193 -68.78664256999662 -3.600000000000047
+ vertex 180.5544791381247 -68.99369780607864 -3.6545186779375425
+ endloop
+endfacet
+facet normal 0.6870641468694395 0.3966766701456151 0.6087614290087343
+ outer loop
+ vertex 179.71310932699188 -69.47946289302418 -6.000000000000065
+ vertex 29.933313429879313 190.4552931403848 -6.3313708498984465
+ vertex 29.713109326992605 190.3281582423065 -5.999999999999975
+ endloop
+endfacet
+facet normal 0.6870641468694395 0.3966766701456151 0.6087614290087343
+ outer loop
+ vertex 29.933313429879313 190.4552931403848 -6.3313708498984465
+ vertex 179.71310932699188 -69.47946289302418 -6.000000000000065
+ vertex 179.93331342987864 -69.35232799494582 -6.331370849898536
+ endloop
+endfacet
+facet normal -0.5272028623656548 -0.30438071450442294 0.7933533402912207
+ outer loop
+ vertex 31.605929650020105 191.42097856533414 -6.585640646055053
+ vertex 181.8929052241051 -68.22095714504727 -6.331370849898517
+ vertex 31.892905224105828 191.58666399028337 -6.331370849898415
+ endloop
+endfacet
+facet normal -0.5272028623656548 -0.30438071450442294 0.7933533402912207
+ outer loop
+ vertex 181.8929052241051 -68.22095714504727 -6.331370849898517
+ vertex 31.605929650020105 191.42097856533414 -6.585640646055053
+ vertex 181.60592965001945 -68.38664256999652 -6.585640646055154
+ endloop
+endfacet
+facet normal 0.33141357403558147 0.19134171618251217 0.9238795325112973
+ outer loop
+ vertex 16.71029270492801 182.82097856533372 -6.58564064605507
+ vertex 167.0444828390876 -76.79369780607898 -6.745481322062554
+ vertex 17.04448283908832 183.0139233292517 -6.745481322062464
+ endloop
+endfacet
+facet normal 0.33141357403558147 0.19134171618251217 0.9238795325112973
+ outer loop
+ vertex 167.0444828390876 -76.79369780607898 -6.745481322062554
+ vertex 16.71029270492801 182.82097856533372 -6.58564064605507
+ vertex 166.7102927049273 -76.98664256999696 -6.585640646055159
+ endloop
+endfacet
+facet normal -0.5272028623656624 -0.30438071450441606 0.7933533402912182
+ outer loop
+ vertex 18.09593335098308 183.62097856533376 -6.5856406460550465
+ vertex 168.3829089250681 -76.0209571450476 -6.3313708498985
+ vertex 18.382908925068815 183.78666399028296 -6.331370849898409
+ endloop
+endfacet
+facet normal -0.5272028623656624 -0.30438071450441606 0.7933533402912182
+ outer loop
+ vertex 168.3829089250681 -76.0209571450476 -6.3313708498985
+ vertex 18.09593335098308 183.62097856533376 -6.5856406460550465
+ vertex 168.09593335098245 -76.18664256999696 -6.585640646055137
+ endloop
+endfacet
+facet normal -0.8001031451912495 -0.4619397662556647 -0.3826834323650973
+ outer loop
+ vertex 182.2515354129724 -68.01390190896532 -4.785889527835981
+ vertex 32.11310932699258 191.71379888836162 -4.399999999999924
+ vertex 32.25153541297306 191.79371922636534 -4.785889527835891
+ endloop
+endfacet
+facet normal -0.8001031451912495 -0.4619397662556647 -0.3826834323650973
+ outer loop
+ vertex 32.11310932699258 191.71379888836162 -4.399999999999924
+ vertex 182.2515354129724 -68.01390190896532 -4.785889527835981
+ vertex 182.11310932699186 -68.093822246969 -4.400000000000015
+ endloop
+endfacet
+facet normal 0.8586164364012407 0.4957224306869376 0.13052619222006184
+ outer loop
+ vertex 179.52746868093678 -69.58664256999661 -5.200000000000067
+ vertex 29.574683241012092 190.24823790430275 -5.6141104721640085
+ vertex 29.527468680937478 190.220978565334 -5.199999999999976
+ endloop
+endfacet
+facet normal 0.8586164364012407 0.4957224306869376 0.13052619222006184
+ outer loop
+ vertex 29.574683241012092 190.24823790430275 -5.6141104721640085
+ vertex 179.52746868093678 -69.58664256999661 -5.200000000000067
+ vertex 179.57468324101143 -69.5593832310279 -5.614110472164098
+ endloop
+endfacet
+facet normal -0.52720286236566 -0.3043807145043358 -0.7933533402912507
+ outer loop
+ vertex 181.8929052241052 -68.2209571450474 -4.068629150101555
+ vertex 31.60592965002015 191.42097856533402 -3.8143593539448384
+ vertex 31.892905224105863 191.58666399028328 -4.068629150101453
+ endloop
+endfacet
+facet normal -0.52720286236566 -0.3043807145043358 -0.7933533402912507
+ outer loop
+ vertex 31.60592965002015 191.42097856533402 -3.8143593539448384
+ vertex 181.8929052241052 -68.2209571450474 -4.068629150101555
+ vertex 181.60592965001945 -68.38664256999657 -3.8143593539449396
+ endloop
+endfacet
+facet normal -0.11303899832180415 -0.06526309611006587 0.9914448613738092
+ outer loop
+ vertex 30.913109326992572 191.0209785653341 -6.799999999999951
+ vertex 181.2717395158591 -68.57958733391449 -6.745481322062546
+ vertex 31.27173951585978 191.22803380141616 -6.7454813220624334
+ endloop
+endfacet
+facet normal -0.11303899832180415 -0.06526309611006587 0.9914448613738092
+ outer loop
+ vertex 181.2717395158591 -68.57958733391449 -6.745481322062546
+ vertex 30.913109326992572 191.0209785653341 -6.799999999999951
+ vertex 180.9131093269919 -68.78664256999652 -6.800000000000041
+ endloop
+endfacet
+facet normal -0.8586164364012479 -0.49572243068693045 0.130526192220043
+ outer loop
+ vertex 182.25153541297234 -68.01390190896528 -5.614110472164045
+ vertex 32.29874997304768 191.82097856533412 -5.199999999999923
+ vertex 32.25153541297306 191.79371922636537 -5.614110472163954
+ endloop
+endfacet
+facet normal -0.8586164364012479 -0.49572243068693045 0.130526192220043
+ outer loop
+ vertex 32.29874997304768 191.82097856533412 -5.199999999999923
+ vertex 182.25153541297234 -68.01390190896528 -5.614110472164045
+ vertex 182.29874997304697 -67.98664256999652 -5.200000000000013
+ endloop
+endfacet
+facet normal -0.800103145191235 -0.4619397662556789 0.38268343236511065
+ outer loop
+ vertex 18.603113027955537 183.91379888836127 -5.999999999999941
+ vertex 168.7415391139354 -75.81390190896572 -5.6141104721640644
+ vertex 18.74153911393604 183.993719226365 -5.614110472163975
+ endloop
+endfacet
+facet normal -0.800103145191235 -0.4619397662556789 0.38268343236511065
+ outer loop
+ vertex 168.7415391139354 -75.81390190896572 -5.6141104721640644
+ vertex 18.603113027955537 183.91379888836127 -5.999999999999941
+ vertex 168.60311302795486 -75.89382224696935 -6.000000000000031
+ endloop
+endfacet
+facet normal -0.11303899832179497 -0.06526309610997745 -0.9914448613738159
+ outer loop
+ vertex 181.27173951585914 -68.57958733391463 -3.65451867793752
+ vertex 30.913109326992597 191.02097856533402 -3.5999999999999566
+ vertex 31.27173951585983 191.22803380141602 -3.654518677937407
+ endloop
+endfacet
+facet normal -0.11303899832179497 -0.06526309610997745 -0.9914448613738159
+ outer loop
+ vertex 30.913109326992597 191.02097856533402 -3.5999999999999566
+ vertex 181.27173951585914 -68.57958733391463 -3.65451867793752
+ vertex 180.91310932699193 -68.78664256999662 -3.600000000000047
+ endloop
+endfacet
+facet normal -0.8001031451912451 -0.4619397662556961 0.3826834323650685
+ outer loop
+ vertex 182.11310932699186 -68.093822246969 -6.000000000000034
+ vertex 32.25153541297306 191.79371922636537 -5.614110472163954
+ vertex 32.11310932699257 191.71379888836168 -5.999999999999944
+ endloop
+endfacet
+facet normal -0.8001031451912451 -0.4619397662556961 0.3826834323650685
+ outer loop
+ vertex 32.25153541297306 191.79371922636537 -5.614110472163954
+ vertex 182.11310932699186 -68.093822246969 -6.000000000000034
+ vertex 182.25153541297234 -68.01390190896528 -5.614110472164045
+ endloop
+endfacet
+facet normal 0.8001031451912495 0.4619397662556647 0.3826834323650973
+ outer loop
+ vertex 179.57468324101143 -69.5593832310279 -5.614110472164098
+ vertex 29.713109326992605 190.3281582423065 -5.999999999999975
+ vertex 29.574683241012092 190.24823790430275 -5.6141104721640085
+ endloop
+endfacet
+facet normal 0.8001031451912495 0.4619397662556647 0.3826834323650973
+ outer loop
+ vertex 29.713109326992605 190.3281582423065 -5.999999999999975
+ vertex 179.57468324101143 -69.5593832310279 -5.614110472164098
+ vertex 179.71310932699188 -69.47946289302418 -6.000000000000065
+ endloop
+endfacet
+facet normal -0.11303899832180415 -0.06526309611006587 0.9914448613738092
+ outer loop
+ vertex 17.40311302795556 183.22097856533372 -6.799999999999959
+ vertex 167.76174321682203 -76.37958733391484 -6.745481322062554
+ vertex 17.76174321682278 183.42803380141575 -6.745481322062464
+ endloop
+endfacet
+facet normal -0.11303899832180415 -0.06526309611006587 0.9914448613738092
+ outer loop
+ vertex 167.76174321682203 -76.37958733391484 -6.745481322062554
+ vertex 17.40311302795556 183.22097856533372 -6.799999999999959
+ vertex 167.40311302795493 -76.58664256999695 -6.80000000000005
+ endloop
+endfacet
+facet normal 0.800103145191235 0.4619397662556789 -0.38268343236511065
+ outer loop
+ vertex 179.71310932699166 -69.47946289302372 -20.000000000000025
+ vertex 29.57468324101183 190.24823790430324 -20.385889527835904
+ vertex 29.713109326992345 190.32815824230696 -19.99999999999994
+ endloop
+endfacet
+facet normal 0.800103145191235 0.4619397662556789 -0.38268343236511065
+ outer loop
+ vertex 29.57468324101183 190.24823790430324 -20.385889527835904
+ vertex 179.71310932699166 -69.47946289302372 -20.000000000000025
+ vertex 179.57468324101112 -69.55938323102744 -20.385889527835992
+ endloop
+endfacet
+facet normal 0.8586164364012514 0.4957224306869325 -0.13052619222001063
+ outer loop
+ vertex 179.57468324101112 -69.55938323102744 -20.385889527835992
+ vertex 29.527468680937208 190.2209785653345 -20.799999999999937
+ vertex 29.57468324101183 190.24823790430324 -20.385889527835904
+ endloop
+endfacet
+facet normal 0.8586164364012514 0.4957224306869325 -0.13052619222001063
+ outer loop
+ vertex 29.527468680937208 190.2209785653345 -20.799999999999937
+ vertex 179.57468324101112 -69.55938323102744 -20.385889527835992
+ vertex 179.52746868093652 -69.58664256999616 -20.800000000000026
+ endloop
+endfacet
+facet normal 0.8001031451912619 0.4619397662556719 0.38268343236506275
+ outer loop
+ vertex 179.57468324101114 -69.5593832310274 -21.214110472164055
+ vertex 29.7131093269923 190.32815824230696 -21.599999999999934
+ vertex 29.574683241011822 190.24823790430327 -21.21411047216397
+ endloop
+endfacet
+facet normal 0.8001031451912619 0.4619397662556719 0.38268343236506275
+ outer loop
+ vertex 29.7131093269923 190.32815824230696 -21.599999999999934
+ vertex 179.57468324101114 -69.5593832310274 -21.214110472164055
+ vertex 179.71310932699166 -69.47946289302368 -21.600000000000023
+ endloop
+endfacet
+facet normal 0.8586164364012407 0.4957224306869376 0.13052619222006184
+ outer loop
+ vertex 179.52746868093652 -69.58664256999616 -20.800000000000026
+ vertex 29.574683241011822 190.24823790430327 -21.21411047216397
+ vertex 29.527468680937208 190.2209785653345 -20.799999999999937
+ endloop
+endfacet
+facet normal 0.8586164364012407 0.4957224306869376 0.13052619222006184
+ outer loop
+ vertex 29.574683241011822 190.24823790430327 -21.21411047216397
+ vertex 179.52746868093652 -69.58664256999616 -20.800000000000026
+ vertex 179.57468324101114 -69.5593832310274 -21.214110472164055
+ endloop
+endfacet
+facet normal 0.11303899832179483 0.06526309610997597 0.991444861373816
+ outer loop
+ vertex 30.554479138125338 190.81392332925208 -6.745481322062478
+ vertex 180.9131093269919 -68.78664256999652 -6.800000000000041
+ vertex 30.913109326992572 191.0209785653341 -6.799999999999951
+ endloop
+endfacet
+facet normal 0.11303899832179483 0.06526309610997597 0.991444861373816
+ outer loop
+ vertex 180.9131093269919 -68.78664256999652 -6.800000000000041
+ vertex 30.554479138125338 190.81392332925208 -6.745481322062478
+ vertex 180.55447913812472 -68.99369780607859 -6.7454813220625685
+ endloop
+endfacet
+facet normal 0.11303899832184175 0.06526309611000446 0.9914448613738089
+ outer loop
+ vertex 30.554479138125107 190.81392332925256 -22.34548132206245
+ vertex 180.91310932699167 -68.78664256999606 -22.400000000000023
+ vertex 30.91310932699229 191.0209785653346 -22.399999999999945
+ endloop
+endfacet
+facet normal 0.11303899832184175 0.06526309611000446 0.9914448613738089
+ outer loop
+ vertex 180.91310932699167 -68.78664256999606 -22.400000000000023
+ vertex 30.554479138125107 190.81392332925256 -22.34548132206245
+ vertex 180.55447913812438 -68.99369780607809 -22.34548132206253
+ endloop
+endfacet
+facet normal -0.8586164364012515 -0.49572243068693256 0.1305261922200104
+ outer loop
+ vertex 182.2515354129721 -68.01390190896478 -21.214110472164048
+ vertex 32.29874997304738 191.82097856533457 -20.79999999999993
+ vertex 32.251535412972764 191.79371922636585 -21.21411047216396
+ endloop
+endfacet
+facet normal -0.8586164364012515 -0.49572243068693256 0.1305261922200104
+ outer loop
+ vertex 32.29874997304738 191.82097856533457 -20.79999999999993
+ vertex 182.2515354129721 -68.01390190896478 -21.214110472164048
+ vertex 182.29874997304668 -67.98664256999602 -20.800000000000015
+ endloop
+endfacet
+facet normal -0.6870641468694361 -0.3966766701456075 -0.608761429008743
+ outer loop
+ vertex 182.1131093269916 -68.0938222469685 -20.000000000000018
+ vertex 31.89290522410557 191.58666399028374 -19.66862915010146
+ vertex 32.11310932699228 191.7137988883621 -19.99999999999993
+ endloop
+endfacet
+facet normal -0.6870641468694361 -0.3966766701456075 -0.608761429008743
+ outer loop
+ vertex 31.89290522410557 191.58666399028374 -19.66862915010146
+ vertex 182.1131093269916 -68.0938222469685 -20.000000000000018
+ vertex 181.89290522410488 -68.2209571450469 -19.668629150101545
+ endloop
+endfacet
+facet normal 0.3314135740355637 0.1913417161825047 0.9238795325113052
+ outer loop
+ vertex 30.220289003964727 190.62097856533455 -22.18564064605505
+ vertex 180.55447913812438 -68.99369780607809 -22.34548132206253
+ vertex 30.554479138125107 190.81392332925256 -22.34548132206245
+ endloop
+endfacet
+facet normal 0.3314135740355637 0.1913417161825047 0.9238795325113052
+ outer loop
+ vertex 180.55447913812438 -68.99369780607809 -22.34548132206253
+ vertex 30.220289003964727 190.62097856533455 -22.18564064605505
+ vertex 180.22028900396407 -69.18664256999607 -22.185640646055134
+ endloop
+endfacet
+facet normal -0.527202862365693 -0.3043807145043661 -0.7933533402912171
+ outer loop
+ vertex 181.89290522410488 -68.2209571450469 -19.668629150101545
+ vertex 31.60592965001985 191.42097856533454 -19.41435935394482
+ vertex 31.89290522410557 191.58666399028374 -19.66862915010146
+ endloop
+endfacet
+facet normal -0.527202862365693 -0.3043807145043661 -0.7933533402912171
+ outer loop
+ vertex 31.60592965001985 191.42097856533454 -19.41435935394482
+ vertex 181.89290522410488 -68.2209571450469 -19.668629150101545
+ vertex 181.60592965001922 -68.38664256999616 -19.414359353944903
+ endloop
+endfacet
+facet normal -0.527202862365633 -0.3043807145043991 0.7933533402912443
+ outer loop
+ vertex 31.605929650019835 191.42097856533465 -22.185640646055035
+ vertex 181.89290522410485 -68.22095714504677 -21.931370849898506
+ vertex 31.89290522410554 191.58666399028385 -21.93137084989842
+ endloop
+endfacet
+facet normal -0.527202862365633 -0.3043807145043991 0.7933533402912443
+ outer loop
+ vertex 181.89290522410485 -68.22095714504677 -21.931370849898506
+ vertex 31.605929650019835 191.42097856533465 -22.185640646055035
+ vertex 181.6059296500192 -68.38664256999607 -22.185640646055123
+ endloop
+endfacet
+facet normal -0.11303899832183627 -0.06526309610999989 -0.9914448613738097
+ outer loop
+ vertex 181.27173951585885 -68.57958733391409 -19.254518677937508
+ vertex 30.913109326992327 191.02097856533445 -19.19999999999993
+ vertex 31.27173951585956 191.2280338014165 -19.254518677937426
+ endloop
+endfacet
+facet normal -0.11303899832183627 -0.06526309610999989 -0.9914448613738097
+ outer loop
+ vertex 30.913109326992327 191.02097856533445 -19.19999999999993
+ vertex 181.27173951585885 -68.57958733391409 -19.254518677937508
+ vertex 180.9131093269916 -68.78664256999612 -19.200000000000006
+ endloop
+endfacet
+facet normal 0.5272028623656624 0.30438071450441606 -0.7933533402912182
+ outer loop
+ vertex 180.22028900396413 -69.18664256999621 -19.414359353944917
+ vertex 29.933313429879053 190.45529314038524 -19.668629150101474
+ vertex 30.220289003964787 190.62097856533444 -19.414359353944835
+ endloop
+endfacet
+facet normal 0.5272028623656624 0.30438071450441606 -0.7933533402912182
+ outer loop
+ vertex 29.933313429879053 190.45529314038524 -19.668629150101474
+ vertex 180.22028900396413 -69.18664256999621 -19.414359353944917
+ vertex 179.93331342987838 -69.35232799494541 -19.668629150101555
+ endloop
+endfacet
+facet normal 0.6870641468694383 0.39667667014565394 -0.6087614290087103
+ outer loop
+ vertex 29.933313429879053 190.45529314038524 -19.668629150101474
+ vertex 179.71310932699166 -69.47946289302372 -20.000000000000025
+ vertex 29.713109326992345 190.32815824230696 -19.99999999999994
+ endloop
+endfacet
+facet normal 0.6870641468694383 0.39667667014565394 -0.6087614290087103
+ outer loop
+ vertex 179.71310932699166 -69.47946289302372 -20.000000000000025
+ vertex 29.933313429879053 190.45529314038524 -19.668629150101474
+ vertex 179.93331342987838 -69.35232799494541 -19.668629150101555
+ endloop
+endfacet
+facet normal -0.6870641468694484 -0.3966766701456766 0.6087614290086841
+ outer loop
+ vertex 181.89290522410485 -68.22095714504677 -21.931370849898506
+ vertex 32.11310932699228 191.71379888836213 -21.599999999999927
+ vertex 31.89290522410554 191.58666399028385 -21.93137084989842
+ endloop
+endfacet
+facet normal -0.6870641468694484 -0.3966766701456766 0.6087614290086841
+ outer loop
+ vertex 32.11310932699228 191.71379888836213 -21.599999999999927
+ vertex 181.89290522410485 -68.22095714504677 -21.931370849898506
+ vertex 182.11310932699158 -68.09382224696846 -21.600000000000016
+ endloop
+endfacet
+facet normal -0.33141357403558597 -0.19134171618259363 0.9238795325112787
+ outer loop
+ vertex 31.27173951585951 191.22803380141661 -22.34548132206245
+ vertex 181.6059296500192 -68.38664256999607 -22.185640646055123
+ vertex 31.605929650019835 191.42097856533465 -22.185640646055035
+ endloop
+endfacet
+facet normal -0.33141357403558597 -0.19134171618259363 0.9238795325112787
+ outer loop
+ vertex 181.6059296500192 -68.38664256999607 -22.185640646055123
+ vertex 31.27173951585951 191.22803380141661 -22.34548132206245
+ vertex 181.2717395158588 -68.57958733391403 -22.345481322062533
+ endloop
+endfacet
+facet normal 0.5272028623656606 0.30438071450435294 0.7933533402912438
+ outer loop
+ vertex 29.933313429879036 190.4552931403853 -21.93137084989843
+ vertex 180.22028900396407 -69.18664256999607 -22.185640646055134
+ vertex 30.220289003964727 190.62097856533455 -22.18564064605505
+ endloop
+endfacet
+facet normal 0.5272028623656606 0.30438071450435294 0.7933533402912438
+ outer loop
+ vertex 180.22028900396407 -69.18664256999607 -22.185640646055134
+ vertex 29.933313429879036 190.4552931403853 -21.93137084989843
+ vertex 179.93331342987832 -69.35232799494533 -21.931370849898517
+ endloop
+endfacet
+facet normal -0.8001031451912352 -0.46193976625567895 0.38268343236511054
+ outer loop
+ vertex 32.11310932699228 191.71379888836213 -21.599999999999927
+ vertex 182.2515354129721 -68.01390190896478 -21.214110472164048
+ vertex 32.251535412972764 191.79371922636585 -21.21411047216396
+ endloop
+endfacet
+facet normal -0.8001031451912352 -0.46193976625567895 0.38268343236511054
+ outer loop
+ vertex 182.2515354129721 -68.01390190896478 -21.214110472164048
+ vertex 32.11310932699228 191.71379888836213 -21.599999999999927
+ vertex 182.11310932699158 -68.09382224696846 -21.600000000000016
+ endloop
+endfacet
+facet normal -0.8001031451912619 -0.4619397662556719 -0.38268343236506275
+ outer loop
+ vertex 32.25153541297277 191.79371922636582 -20.385889527835896
+ vertex 182.1131093269916 -68.0938222469685 -20.000000000000018
+ vertex 32.11310932699228 191.7137988883621 -19.99999999999993
+ endloop
+endfacet
+facet normal -0.8001031451912619 -0.4619397662556719 -0.38268343236506275
+ outer loop
+ vertex 182.1131093269916 -68.0938222469685 -20.000000000000018
+ vertex 32.25153541297277 191.79371922636582 -20.385889527835896
+ vertex 182.25153541297215 -68.01390190896487 -20.385889527835985
+ endloop
+endfacet
+facet normal 0.33141357403561683 0.19134171618253823 0.9238795325112792
+ outer loop
+ vertex 30.220289003965032 190.6209785653341 -6.585640646055061
+ vertex 180.55447913812472 -68.99369780607859 -6.7454813220625685
+ vertex 30.554479138125338 190.81392332925208 -6.745481322062478
+ endloop
+endfacet
+facet normal 0.33141357403561683 0.19134171618253823 0.9238795325112792
+ outer loop
+ vertex 180.55447913812472 -68.99369780607859 -6.7454813220625685
+ vertex 30.220289003965032 190.6209785653341 -6.585640646055061
+ vertex 180.22028900396433 -69.18664256999656 -6.585640646055151
+ endloop
+endfacet
+facet normal 0.6870641468694512 0.39667667014562186 0.6087614290087167
+ outer loop
+ vertex 179.71310932699166 -69.47946289302368 -21.600000000000023
+ vertex 29.933313429879036 190.4552931403853 -21.93137084989843
+ vertex 29.7131093269923 190.32815824230696 -21.599999999999934
+ endloop
+endfacet
+facet normal 0.6870641468694512 0.39667667014562186 0.6087614290087167
+ outer loop
+ vertex 29.933313429879036 190.4552931403853 -21.93137084989843
+ vertex 179.71310932699166 -69.47946289302368 -21.600000000000023
+ vertex 179.93331342987832 -69.35232799494533 -21.931370849898517
+ endloop
+endfacet
+facet normal -0.11303899832180415 -0.06526309611006587 0.9914448613738092
+ outer loop
+ vertex 30.91310932699229 191.0209785653346 -22.399999999999945
+ vertex 181.2717395158588 -68.57958733391403 -22.345481322062533
+ vertex 31.27173951585951 191.22803380141661 -22.34548132206245
+ endloop
+endfacet
+facet normal -0.11303899832180415 -0.06526309611006587 0.9914448613738092
+ outer loop
+ vertex 181.2717395158588 -68.57958733391403 -22.345481322062533
+ vertex 30.91310932699229 191.0209785653346 -22.399999999999945
+ vertex 180.91310932699167 -68.78664256999606 -22.400000000000023
+ endloop
+endfacet
+facet normal -0.33141357403558147 -0.19134171618251217 -0.9238795325112973
+ outer loop
+ vertex 181.60592965001922 -68.38664256999616 -19.414359353944903
+ vertex 31.27173951585956 191.2280338014165 -19.254518677937426
+ vertex 31.60592965001985 191.42097856533454 -19.41435935394482
+ endloop
+endfacet
+facet normal -0.33141357403558147 -0.19134171618251217 -0.9238795325112973
+ outer loop
+ vertex 31.27173951585956 191.2280338014165 -19.254518677937426
+ vertex 181.60592965001922 -68.38664256999616 -19.414359353944903
+ vertex 181.27173951585885 -68.57958733391409 -19.254518677937508
+ endloop
+endfacet
+facet normal 0.3314135740355858 0.19134171618259352 -0.9238795325112789
+ outer loop
+ vertex 180.55447913812446 -68.99369780607823 -19.2545186779375
+ vertex 30.220289003964787 190.62097856533444 -19.414359353944835
+ vertex 30.554479138125096 190.81392332925245 -19.254518677937423
+ endloop
+endfacet
+facet normal 0.3314135740355858 0.19134171618259352 -0.9238795325112789
+ outer loop
+ vertex 30.220289003964787 190.62097856533444 -19.414359353944835
+ vertex 180.55447913812446 -68.99369780607823 -19.2545186779375
+ vertex 180.22028900396413 -69.18664256999621 -19.414359353944917
+ endloop
+endfacet
+facet normal -0.8586164364012407 -0.4957224306869376 -0.13052619222006204
+ outer loop
+ vertex 32.29874997304738 191.82097856533457 -20.79999999999993
+ vertex 182.25153541297215 -68.01390190896487 -20.385889527835985
+ vertex 32.25153541297277 191.79371922636582 -20.385889527835896
+ endloop
+endfacet
+facet normal -0.8586164364012407 -0.4957224306869376 -0.13052619222006204
+ outer loop
+ vertex 182.25153541297215 -68.01390190896487 -20.385889527835985
+ vertex 32.29874997304738 191.82097856533457 -20.79999999999993
+ vertex 182.29874997304668 -67.98664256999602 -20.800000000000015
+ endloop
+endfacet
+facet normal 0.11303899832180415 0.06526309611006587 -0.9914448613738092
+ outer loop
+ vertex 180.9131093269916 -68.78664256999612 -19.200000000000006
+ vertex 30.554479138125096 190.81392332925245 -19.254518677937423
+ vertex 30.913109326992327 191.02097856533445 -19.19999999999993
+ endloop
+endfacet
+facet normal 0.11303899832180415 0.06526309611006587 -0.9914448613738092
+ outer loop
+ vertex 30.554479138125096 190.81392332925245 -19.254518677937423
+ vertex 180.9131093269916 -68.78664256999612 -19.200000000000006
+ vertex 180.55447913812446 -68.99369780607823 -19.2545186779375
+ endloop
+endfacet
+facet normal 0.8586164364012415 0.49572243068693805 0.1305261922200554
+ outer loop
+ vertex 182.78885611527102 -67.70367965685205 -3.7411809548975263
+ vertex 32.81836521531836 192.1209785653341 -3.9999999999999476
+ vertex 32.78885611527171 192.10394147847862 -3.741180954897436
+ endloop
+endfacet
+facet normal 0.8586164364012415 0.49572243068693805 0.1305261922200554
+ outer loop
+ vertex 32.81836521531836 192.1209785653341 -3.9999999999999476
+ vertex 182.78885611527102 -67.70367965685205 -3.7411809548975263
+ vertex 182.81836521531764 -67.6866425699966 -4.000000000000038
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 1.5003536199769238e-15
+ outer loop
+ vertex 32.81836521531836 192.1209785653341 -3.9999999999999476
+ vertex 182.8183652153176 -67.68664256999645 -9.20000000000005
+ vertex 32.81836521531824 192.12097856533427 -9.19999999999996
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 1.5003536199769238e-15
+ outer loop
+ vertex 182.8183652153176 -67.68664256999645 -9.20000000000005
+ vertex 32.81836521531836 192.1209785653341 -3.9999999999999476
+ vertex 182.81836521531764 -67.6866425699966 -4.000000000000038
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -4.4649600931051686e-15
+ outer loop
+ vertex 182.47195505380378 -67.88664256999641 -9.20000000000005
+ vertex 32.47195505380448 191.92097856533425 -9.59999999999996
+ vertex 32.47195505380448 191.92097856533422 -9.19999999999996
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -4.4649600931051686e-15
+ outer loop
+ vertex 32.47195505380448 191.92097856533425 -9.59999999999996
+ vertex 182.47195505380378 -67.88664256999641 -9.20000000000005
+ vertex 182.47195505380378 -67.88664256999637 -9.60000000000005
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 181.25951948850562 -68.58664256999647 -7.40000000000004
+ vertex 29.49775138722347 190.2038212778087 -7.39999999999995
+ vertex 31.259519488506292 191.22097856533415 -7.3999999999999275
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 29.49775138722347 190.2038212778087 -7.39999999999995
+ vertex 181.25951948850562 -68.58664256999647 -7.40000000000004
+ vertex 179.49775138722282 -69.60379985752196 -7.40000000000004
+ endloop
+endfacet
+facet normal 0.8001031451912567 0.46193976625566885 0.3826834323650779
+ outer loop
+ vertex 182.70233981153322 -67.75362986810437 -3.5000000000000386
+ vertex 32.78885611527171 192.10394147847862 -3.741180954897436
+ vertex 32.70233981153391 192.05399126722628 -3.4999999999999485
+ endloop
+endfacet
+facet normal 0.8001031451912567 0.46193976625566885 0.3826834323650779
+ outer loop
+ vertex 32.78885611527171 192.10394147847862 -3.741180954897436
+ vertex 182.70233981153322 -67.75362986810437 -3.5000000000000386
+ vertex 182.78885611527102 -67.70367965685205 -3.7411809548975263
+ endloop
+endfacet
+facet normal 0.6123724356957727 0.35355339059330715 -0.7071067811865499
+ outer loop
+ vertex 179.49775138722282 -69.60379985752196 -7.40000000000004
+ vertex 27.362405171476354 188.9709785653341 -9.8656854249492
+ vertex 29.49775138722347 190.2038212778087 -7.39999999999995
+ endloop
+endfacet
+facet normal 0.6123724356957727 0.35355339059330715 -0.7071067811865499
+ outer loop
+ vertex 27.362405171476354 188.9709785653341 -9.8656854249492
+ vertex 179.49775138722282 -69.60379985752196 -7.40000000000004
+ vertex 177.36240517147564 -70.83664256999656 -9.865685424949291
+ endloop
+endfacet
+facet normal -3.27323874590727e-14 2.2585965780328042e-14 -1.0
+ outer loop
+ vertex 182.47195505380378 -67.88664256999637 -9.60000000000005
+ vertex 31.25951948850626 191.2209785653342 -9.599999999999923
+ vertex 32.47195505380448 191.92097856533425 -9.59999999999996
+ endloop
+endfacet
+facet normal -3.27323874590727e-14 2.2585965780328042e-14 -1.0
+ outer loop
+ vertex 31.25951948850626 191.2209785653342 -9.599999999999923
+ vertex 182.47195505380378 -67.88664256999637 -9.60000000000005
+ vertex 181.2595194885056 -68.58664256999643 -9.600000000000035
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 182.8183652153176 -67.68664256999645 -9.20000000000005
+ vertex 32.47195505380448 191.92097856533422 -9.19999999999996
+ vertex 32.81836521531824 192.12097856533427 -9.19999999999996
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 32.47195505380448 191.92097856533422 -9.19999999999996
+ vertex 182.8183652153176 -67.68664256999645 -9.20000000000005
+ vertex 182.47195505380378 -67.88664256999641 -9.20000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 31.25951948850626 191.2209785653342 -9.599999999999923
+ vertex 181.25951948850562 -68.58664256999647 -7.40000000000004
+ vertex 31.259519488506292 191.22097856533415 -7.3999999999999275
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 181.25951948850562 -68.58664256999647 -7.40000000000004
+ vertex 31.25951948850626 191.2209785653342 -9.599999999999923
+ vertex 181.2595194885056 -68.58664256999643 -9.600000000000035
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -1.0524654334828364e-15
+ outer loop
+ vertex 27.362405171476354 188.9709785653341 -9.8656854249492
+ vertex 177.36240517147556 -70.83664256999637 -16.134314575050784
+ vertex 27.36240517147622 188.9709785653343 -16.134314575050695
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -1.0524654334828364e-15
+ outer loop
+ vertex 177.36240517147556 -70.83664256999637 -16.134314575050784
+ vertex 27.362405171476354 188.9709785653341 -9.8656854249492
+ vertex 177.36240517147564 -70.83664256999656 -9.865685424949291
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 165.49785713962888 -77.68664256999656 -22.00000000000003
+ vertex 15.497857139629593 182.12097856533398 -16.79999999999996
+ vertex 15.497857139629497 182.12097856533416 -21.99999999999995
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 15.497857139629593 182.12097856533398 -16.79999999999996
+ vertex 165.49785713962888 -77.68664256999656 -22.00000000000003
+ vertex 165.4978571396289 -77.6866425699967 -16.80000000000004
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 15.497857139629593 182.12097856533398 -16.79999999999996
+ vertex 165.84426730114276 -77.4866425699967 -16.80000000000005
+ vertex 15.84426730114338 182.32097856533397 -16.799999999999965
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 165.84426730114276 -77.4866425699967 -16.80000000000005
+ vertex 15.497857139629593 182.12097856533398 -16.79999999999996
+ vertex 165.4978571396289 -77.6866425699967 -16.80000000000004
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 2.7394170869210435e-15
+ outer loop
+ vertex 170.95381718347082 -74.53664256999652 -16.134314575050794
+ vertex 20.953817183471617 185.2709785653339 -9.865685424949215
+ vertex 20.953817183471486 185.2709785653341 -16.134314575050713
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 2.7394170869210435e-15
+ outer loop
+ vertex 20.953817183471617 185.2709785653339 -9.865685424949215
+ vertex 170.95381718347082 -74.53664256999652 -16.134314575050794
+ vertex 170.9538171834709 -74.5366425699967 -9.865685424949328
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 15.84426730114338 182.32097856533397 -16.399999999999963
+ vertex 167.0567028664409 -76.78664256999664 -16.400000000000055
+ vertex 17.056702866441597 183.02097856533402 -16.399999999999963
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 167.0567028664409 -76.78664256999664 -16.400000000000055
+ vertex 15.84426730114338 182.32097856533397 -16.399999999999963
+ vertex 165.8442673011427 -77.48664256999666 -16.400000000000052
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 168.81847096772393 -75.76948528247148 -7.400000000000051
+ vertex 17.056702866441775 183.02097856533373 -7.399999999999959
+ vertex 18.818470967724625 184.03813585285917 -7.399999999999961
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 17.056702866441775 183.02097856533373 -7.399999999999959
+ vertex 168.81847096772393 -75.76948528247148 -7.400000000000051
+ vertex 167.05670286644107 -76.78664256999691 -7.400000000000048
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 167.05670286644107 -76.78664256999691 -7.400000000000048
+ vertex 17.056702866441704 183.0209785653338 -9.599999999999953
+ vertex 17.056702866441775 183.02097856533373 -7.399999999999959
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 17.056702866441704 183.0209785653338 -9.599999999999953
+ vertex 167.05670286644107 -76.78664256999691 -7.400000000000048
+ vertex 167.05670286644101 -76.78664256999687 -9.600000000000044
+ endloop
+endfacet
+facet normal -3.2732387459072867e-14 2.2585965780327947e-14 -1.0
+ outer loop
+ vertex 167.05670286644101 -76.78664256999687 -9.600000000000044
+ vertex 15.844267301143496 182.32097856533375 -9.599999999999929
+ vertex 17.056702866441704 183.0209785653338 -9.599999999999953
+ endloop
+endfacet
+facet normal -3.2732387459072867e-14 2.2585965780327947e-14 -1.0
+ outer loop
+ vertex 15.844267301143496 182.32097856533375 -9.599999999999929
+ vertex 167.05670286644101 -76.78664256999687 -9.600000000000044
+ vertex 165.84426730114282 -77.48664256999689 -9.60000000000002
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 17.05670286644153 183.02097856533408 -18.59999999999996
+ vertex 168.81847096772375 -75.76948528247121 -18.60000000000005
+ vertex 18.818470967724387 184.03813585285948 -18.599999999999948
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 168.81847096772375 -75.76948528247121 -18.60000000000005
+ vertex 17.05670286644153 183.02097856533408 -18.59999999999996
+ vertex 167.05670286644087 -76.78664256999654 -18.60000000000005
+ endloop
+endfacet
+facet normal -0.6123724356957727 -0.35355339059330715 0.7071067811865499
+ outer loop
+ vertex 18.818470967724387 184.03813585285948 -18.599999999999948
+ vertex 170.95381718347082 -74.53664256999652 -16.134314575050794
+ vertex 20.953817183471486 185.2709785653341 -16.134314575050713
+ endloop
+endfacet
+facet normal -0.6123724356957727 -0.35355339059330715 0.7071067811865499
+ outer loop
+ vertex 170.95381718347082 -74.53664256999652 -16.134314575050794
+ vertex 18.818470967724387 184.03813585285948 -18.599999999999948
+ vertex 168.81847096772375 -75.76948528247121 -18.60000000000005
+ endloop
+endfacet
+facet normal -0.6123724356957975 -0.35355339059327634 -0.7071067811865437
+ outer loop
+ vertex 20.953817183471617 185.2709785653339 -9.865685424949215
+ vertex 168.81847096772393 -75.76948528247148 -7.400000000000051
+ vertex 18.818470967724625 184.03813585285917 -7.399999999999961
+ endloop
+endfacet
+facet normal -0.6123724356957975 -0.35355339059327634 -0.7071067811865437
+ outer loop
+ vertex 168.81847096772393 -75.76948528247148 -7.400000000000051
+ vertex 20.953817183471617 185.2709785653339 -9.865685424949215
+ vertex 170.9538171834709 -74.5366425699967 -9.865685424949328
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 15.844267301143496 182.32097856533375 -9.599999999999929
+ vertex 165.84426730114282 -77.48664256999693 -9.20000000000002
+ vertex 15.844267301143496 182.32097856533375 -9.19999999999993
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 165.84426730114282 -77.48664256999693 -9.20000000000002
+ vertex 15.844267301143496 182.32097856533375 -9.599999999999929
+ vertex 165.84426730114282 -77.48664256999689 -9.60000000000002
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 165.84426730114282 -77.48664256999693 -9.20000000000002
+ vertex 15.497857139629756 182.12097856533373 -9.19999999999993
+ vertex 15.844267301143496 182.32097856533375 -9.19999999999993
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 15.497857139629756 182.12097856533373 -9.19999999999993
+ vertex 165.84426730114282 -77.48664256999693 -9.20000000000002
+ vertex 165.49785713962913 -77.68664256999693 -9.20000000000002
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 165.84426730114276 -77.4866425699967 -16.80000000000005
+ vertex 15.84426730114338 182.32097856533397 -16.399999999999963
+ vertex 15.84426730114338 182.32097856533397 -16.799999999999965
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 15.84426730114338 182.32097856533397 -16.399999999999963
+ vertex 165.84426730114276 -77.4866425699967 -16.80000000000005
+ vertex 165.8442673011427 -77.48664256999666 -16.400000000000052
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 17.056702866441597 183.02097856533402 -16.399999999999963
+ vertex 167.05670286644087 -76.78664256999654 -18.60000000000005
+ vertex 17.05670286644153 183.02097856533408 -18.59999999999996
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 167.05670286644087 -76.78664256999654 -18.60000000000005
+ vertex 17.056702866441597 183.02097856533402 -16.399999999999963
+ vertex 167.0567028664409 -76.78664256999664 -16.400000000000055
+ endloop
+endfacet
+facet normal -0.6870641468694316 -0.39667667014565006 0.6087614290087203
+ outer loop
+ vertex 165.6138825434136 -77.61965527188929 -3.50000000000003
+ vertex 15.751510107718534 182.26742517474023 -3.29289321881339
+ vertex 15.613882543414308 182.18796586344135 -3.49999999999994
+ endloop
+endfacet
+facet normal -0.6870641468694316 -0.39667667014565006 0.6087614290087203
+ outer loop
+ vertex 15.751510107718534 182.26742517474023 -3.29289321881339
+ vertex 165.6138825434136 -77.61965527188929 -3.50000000000003
+ vertex 165.7515101077178 -77.5401959605903 -3.29289321881348
+ endloop
+endfacet
+facet normal -0.3314135740355606 -0.1913417161825818 0.9238795325112903
+ outer loop
+ vertex 15.930869841522087 182.37097856533356 -3.1339745962155057
+ vertex 166.1397386753716 -77.31605209254836 -3.0340741737109713
+ vertex 16.13973867537229 182.49156904278232 -3.034074173710881
+ endloop
+endfacet
+facet normal -0.3314135740355606 -0.1913417161825818 0.9238795325112903
+ outer loop
+ vertex 166.1397386753716 -77.31605209254836 -3.0340741737109713
+ vertex 15.930869841522087 182.37097856533356 -3.1339745962155057
+ vertex 165.93086984152146 -77.43664256999712 -3.133974596215596
+ endloop
+endfacet
+facet normal -0.11303899832181276 -0.06526309611007224 0.9914448613738078
+ outer loop
+ vertex 16.13973867537229 182.49156904278232 -3.034074173710881
+ vertex 166.3638825434136 -77.18664256999709 -3.000000000000034
+ vertex 16.36388254341431 182.62097856533356 -2.9999999999999436
+ endloop
+endfacet
+facet normal -0.11303899832181276 -0.06526309611007224 0.9914448613738078
+ outer loop
+ vertex 166.3638825434136 -77.18664256999709 -3.000000000000034
+ vertex 16.13973867537229 182.49156904278232 -3.034074173710881
+ vertex 166.1397386753716 -77.31605209254836 -3.0340741737109713
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 16.36388254341431 182.62097856533356 -2.9999999999999436
+ vertex 170.86721464309264 -74.58664256999695 -3.000000000000037
+ vertex 20.8672146430933 185.2209785653337 -2.999999999999924
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 170.86721464309264 -74.58664256999695 -3.000000000000037
+ vertex 16.36388254341431 182.62097856533356 -2.9999999999999436
+ vertex 166.3638825434136 -77.18664256999709 -3.000000000000034
+ endloop
+endfacet
+facet normal -0.5272028623656286 -0.3043807145043965 0.7933533402912483
+ outer loop
+ vertex 15.751510107718534 182.26742517474023 -3.29289321881339
+ vertex 165.93086984152146 -77.43664256999712 -3.133974596215596
+ vertex 15.930869841522087 182.37097856533356 -3.1339745962155057
+ endloop
+endfacet
+facet normal -0.5272028623656286 -0.3043807145043965 0.7933533402912483
+ outer loop
+ vertex 165.93086984152146 -77.43664256999712 -3.133974596215596
+ vertex 15.751510107718534 182.26742517474023 -3.29289321881339
+ vertex 165.7515101077178 -77.5401959605903 -3.29289321881348
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 15.497857139629756 182.12097856533373 -9.19999999999993
+ vertex 165.49785713962922 -77.68664256999712 -4.000000000000029
+ vertex 15.497857139629833 182.1209785653336 -3.999999999999939
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 165.49785713962922 -77.68664256999712 -4.000000000000029
+ vertex 15.497857139629756 182.12097856533373 -9.19999999999993
+ vertex 165.49785713962913 -77.68664256999693 -9.20000000000002
+ endloop
+endfacet
+facet normal -0.8001031451912507 -0.4619397662556767 0.3826834323650808
+ outer loop
+ vertex 15.527366239676507 182.138015652189 -3.7411809548974277
+ vertex 165.6138825434136 -77.61965527188929 -3.50000000000003
+ vertex 15.613882543414308 182.18796586344135 -3.49999999999994
+ endloop
+endfacet
+facet normal -0.8001031451912507 -0.4619397662556767 0.3826834323650808
+ outer loop
+ vertex 165.6138825434136 -77.61965527188929 -3.50000000000003
+ vertex 15.527366239676507 182.138015652189 -3.7411809548974277
+ vertex 165.52736623967576 -77.66960548314157 -3.741180954897518
+ endloop
+endfacet
+facet normal -0.8586164364012412 -0.4957224306869379 0.1305261922200573
+ outer loop
+ vertex 165.49785713962922 -77.68664256999712 -4.000000000000029
+ vertex 15.527366239676507 182.138015652189 -3.7411809548974277
+ vertex 15.497857139629833 182.1209785653336 -3.999999999999939
+ endloop
+endfacet
+facet normal -0.8586164364012412 -0.4957224306869379 0.1305261922200573
+ outer loop
+ vertex 15.527366239676507 182.138015652189 -3.7411809548974277
+ vertex 165.49785713962922 -77.68664256999712 -4.000000000000029
+ vertex 165.52736623967576 -77.66960548314157 -3.741180954897518
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 20.867214643093302 185.2209785653337 -3.399999999999923
+ vertex 171.21362480460635 -74.38664256999691 -3.40000000000005
+ vertex 21.213624804607072 185.4209785653337 -3.399999999999949
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 171.21362480460635 -74.38664256999691 -3.40000000000005
+ vertex 20.867214643093302 185.2209785653337 -3.399999999999923
+ vertex 170.86721464309258 -74.58664256999695 -3.400000000000036
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 19.308368916281303 184.32097856533372 -4.799999999999966
+ vertex 169.30836891628059 -75.48664256999689 -6.834314575050794
+ vertex 19.30836891628126 184.32097856533377 -6.834314575050704
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 169.30836891628059 -75.48664256999689 -6.834314575050794
+ vertex 19.308368916281303 184.32097856533372 -4.799999999999966
+ vertex 169.30836891628059 -75.48664256999693 -4.800000000000056
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 170.86721464309264 -74.58664256999695 -3.000000000000037
+ vertex 20.867214643093302 185.2209785653337 -3.399999999999923
+ vertex 20.8672146430933 185.2209785653337 -2.999999999999924
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -9.400019899202897e-16
+ outer loop
+ vertex 20.867214643093302 185.2209785653337 -3.399999999999923
+ vertex 170.86721464309264 -74.58664256999695 -3.000000000000037
+ vertex 170.86721464309258 -74.58664256999695 -3.400000000000036
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 171.21362480460635 -74.38664256999687 -4.80000000000007
+ vertex 19.308368916281303 184.32097856533372 -4.799999999999966
+ vertex 21.213624804607 185.42097856533377 -4.799999999999969
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 19.308368916281303 184.32097856533372 -4.799999999999966
+ vertex 171.21362480460635 -74.38664256999687 -4.80000000000007
+ vertex 169.30836891628059 -75.48664256999693 -4.800000000000056
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 21.443715132028256 185.5538212778085 -9.29999999999996
+ vertex 176.872507222919 -71.11948528247122 -9.300000000000056
+ vertex 26.872507222919705 188.6881358528594 -9.299999999999965
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 176.872507222919 -71.11948528247122 -9.300000000000056
+ vertex 21.443715132028256 185.5538212778085 -9.29999999999996
+ vertex 171.44371513202762 -74.25379985752217 -9.300000000000061
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -8.99704908291417e-15
+ outer loop
+ vertex 21.213624804607072 185.4209785653337 -3.399999999999949
+ vertex 171.21362480460635 -74.38664256999687 -4.80000000000007
+ vertex 21.213624804607 185.42097856533377 -4.799999999999969
+ endloop
+endfacet
+facet normal 0.8660254037844195 0.5000000000000333 -8.99704908291417e-15
+ outer loop
+ vertex 171.21362480460635 -74.38664256999687 -4.80000000000007
+ vertex 21.213624804607072 185.4209785653337 -3.399999999999949
+ vertex 171.21362480460635 -74.38664256999691 -3.40000000000005
+ endloop
+endfacet
+facet normal 0.6123724356957947 0.35355339059327473 0.707106781186547
+ outer loop
+ vertex 19.30836891628126 184.32097856533377 -6.834314575050704
+ vertex 171.44371513202762 -74.25379985752217 -9.300000000000061
+ vertex 21.443715132028256 185.5538212778085 -9.29999999999996
+ endloop
+endfacet
+facet normal 0.6123724356957947 0.35355339059327473 0.707106781186547
+ outer loop
+ vertex 171.44371513202762 -74.25379985752217 -9.300000000000061
+ vertex 19.30836891628126 184.32097856533377 -6.834314575050704
+ vertex 169.30836891628059 -75.48664256999689 -6.834314575050794
+ endloop
+endfacet
+facet normal -0.6123724356957676 -0.3535533905933155 0.70710678118655
+ outer loop
+ vertex 26.872507222919705 188.6881358528594 -9.299999999999965
+ vertex 179.0078534386661 -69.88664256999658 -6.834314575050805
+ vertex 29.00785343866681 189.92097856533402 -6.834314575050715
+ endloop
+endfacet
+facet normal -0.6123724356957676 -0.3535533905933155 0.70710678118655
+ outer loop
+ vertex 179.0078534386661 -69.88664256999658 -6.834314575050805
+ vertex 26.872507222919705 188.6881358528594 -9.299999999999965
+ vertex 176.872507222919 -71.11948528247122 -9.300000000000056
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 179.0078534386662 -69.88664256999668 -4.800000000000045
+ vertex 27.102597550341113 188.82097856533395 -4.799999999999952
+ vertex 29.007853438666853 189.920978565334 -4.7999999999999545
+ endloop
+endfacet
+facet normal -1.877717253503252e-14 3.064301287332265e-14 -1.0
+ outer loop
+ vertex 27.102597550341113 188.82097856533395 -4.799999999999952
+ vertex 179.0078534386662 -69.88664256999668 -4.800000000000045
+ vertex 177.10259755034048 -70.98664256999675 -4.800000000000042
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 2.611827415552657e-14
+ outer loop
+ vertex 177.10259755034048 -70.98664256999675 -4.800000000000042
+ vertex 27.102597550341187 188.82097856533392 -3.399999999999954
+ vertex 27.102597550341113 188.82097856533395 -4.799999999999952
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 2.611827415552657e-14
+ outer loop
+ vertex 27.102597550341187 188.82097856533392 -3.399999999999954
+ vertex 177.10259755034048 -70.98664256999675 -4.800000000000042
+ vertex 177.10259755034048 -70.98664256999675 -3.4000000000000443
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 29.00785343866681 189.92097856533402 -6.834314575050715
+ vertex 179.0078534386662 -69.88664256999668 -4.800000000000045
+ vertex 29.007853438666853 189.920978565334 -4.7999999999999545
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 9.400019899202897e-16
+ outer loop
+ vertex 179.0078534386662 -69.88664256999668 -4.800000000000045
+ vertex 29.00785343866681 189.92097856533402 -6.834314575050715
+ vertex 179.0078534386661 -69.88664256999658 -6.834314575050805
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 27.102597550341187 188.82097856533392 -3.399999999999954
+ vertex 177.44900771185428 -70.78664256999674 -3.4000000000000443
+ vertex 27.449007711854946 189.0209785653339 -3.399999999999954
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 177.44900771185428 -70.78664256999674 -3.4000000000000443
+ vertex 27.102597550341187 188.82097856533392 -3.399999999999954
+ vertex 177.10259755034048 -70.98664256999675 -3.4000000000000443
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 4.4649600931051686e-15
+ outer loop
+ vertex 177.44900771185428 -70.78664256999674 -3.4000000000000443
+ vertex 27.449007711854982 189.0209785653339 -2.999999999999955
+ vertex 27.449007711854946 189.0209785653339 -3.399999999999954
+ endloop
+endfacet
+facet normal -0.8660254037844195 -0.5000000000000333 4.4649600931051686e-15
+ outer loop
+ vertex 27.449007711854982 189.0209785653339 -2.999999999999955
+ vertex 177.44900771185428 -70.78664256999674 -3.4000000000000443
+ vertex 177.44900771185428 -70.78664256999674 -3.0000000000000453
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 27.449007711854982 189.0209785653339 -2.999999999999955
+ vertex 181.9523398115333 -68.18664256999665 -3.000000000000051
+ vertex 31.952339811533943 191.62097856533404 -2.9999999999999494
+ endloop
+endfacet
+facet normal 1.877717253503252e-14 -3.064301287332265e-14 1.0
+ outer loop
+ vertex 181.9523398115333 -68.18664256999665 -3.000000000000051
+ vertex 27.449007711854982 189.0209785653339 -2.999999999999955
+ vertex 177.44900771185428 -70.78664256999674 -3.0000000000000453
+ endloop
+endfacet
+facet normal 0.11303899832185176 0.06526309611000743 0.9914448613738075
+ outer loop
+ vertex 31.952339811533943 191.62097856533404 -2.9999999999999494
+ vertex 182.17648367957534 -68.0572330474454 -3.034074173710977
+ vertex 32.176483679575945 191.7503880878853 -3.034074173710887
+ endloop
+endfacet
+facet normal 0.11303899832185176 0.06526309611000743 0.9914448613738075
+ outer loop
+ vertex 182.17648367957534 -68.0572330474454 -3.034074173710977
+ vertex 31.952339811533943 191.62097856533404 -2.9999999999999494
+ vertex 181.9523398115333 -68.18664256999665 -3.000000000000051
+ endloop
+endfacet
+facet normal 0.3314135740355972 0.19134171618252124 0.9238795325112898
+ outer loop
+ vertex 32.176483679575945 191.7503880878853 -3.034074173710887
+ vertex 182.38535251342543 -67.93664256999658 -3.1339745962156043
+ vertex 32.385352513426135 191.87097856533404 -3.133974596215514
+ endloop
+endfacet
+facet normal 0.3314135740355972 0.19134171618252124 0.9238795325112898
+ outer loop
+ vertex 182.38535251342543 -67.93664256999658 -3.1339745962156043
+ vertex 32.176483679575945 191.7503880878853 -3.034074173710887
+ vertex 182.17648367957534 -68.0572330474454 -3.034074173710977
+ endloop
+endfacet
+facet normal 0.5272028623656612 0.304380714504342 0.7933533402912476
+ outer loop
+ vertex 32.385352513426135 191.87097856533404 -3.133974596215514
+ vertex 182.5647122472291 -67.83308917940336 -3.2928932188134885
+ vertex 32.56471224722971 191.97453195592732 -3.2928932188133984
+ endloop
+endfacet
+facet normal 0.5272028623656612 0.304380714504342 0.7933533402912476
+ outer loop
+ vertex 182.5647122472291 -67.83308917940336 -3.2928932188134885
+ vertex 32.385352513426135 191.87097856533404 -3.133974596215514
+ vertex 182.38535251342543 -67.93664256999658 -3.1339745962156043
+ endloop
+endfacet
+facet normal 0.6870641468694547 0.3966766701456183 0.6087614290087151
+ outer loop
+ vertex 182.5647122472291 -67.83308917940336 -3.2928932188134885
+ vertex 32.70233981153391 192.05399126722628 -3.4999999999999485
+ vertex 32.56471224722971 191.97453195592732 -3.2928932188133984
+ endloop
+endfacet
+facet normal 0.6870641468694547 0.3966766701456183 0.6087614290087151
+ outer loop
+ vertex 32.70233981153391 192.05399126722628 -3.4999999999999485
+ vertex 182.5647122472291 -67.83308917940336 -3.2928932188134885
+ vertex 182.70233981153322 -67.75362986810437 -3.5000000000000386
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.81836521531764 -67.6866425699966 -4.000000000000038
+ vertex 182.47195505380378 -67.88664256999641 -9.20000000000005
+ vertex 182.8183652153176 -67.68664256999645 -9.20000000000005
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.47195505380378 -67.88664256999641 -9.20000000000005
+ vertex 182.81836521531764 -67.6866425699966 -4.000000000000038
+ vertex 182.25153541297234 -68.01390190896528 -5.614110472164045
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.47195505380378 -67.88664256999641 -9.20000000000005
+ vertex 182.25153541297234 -68.01390190896528 -5.614110472164045
+ vertex 182.11310932699186 -68.093822246969 -6.000000000000034
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.47195505380378 -67.88664256999641 -9.20000000000005
+ vertex 182.11310932699186 -68.093822246969 -6.000000000000034
+ vertex 181.25951948850562 -68.58664256999647 -7.40000000000004
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.25951948850562 -68.58664256999647 -7.40000000000004
+ vertex 182.11310932699186 -68.093822246969 -6.000000000000034
+ vertex 181.8929052241051 -68.22095714504727 -6.331370849898517
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.25951948850562 -68.58664256999647 -7.40000000000004
+ vertex 181.8929052241051 -68.22095714504727 -6.331370849898517
+ vertex 181.60592965001945 -68.38664256999652 -6.585640646055154
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.25951948850562 -68.58664256999647 -7.40000000000004
+ vertex 181.60592965001945 -68.38664256999652 -6.585640646055154
+ vertex 181.2717395158591 -68.57958733391449 -6.745481322062546
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.25951948850562 -68.58664256999647 -7.40000000000004
+ vertex 181.2717395158591 -68.57958733391449 -6.745481322062546
+ vertex 179.49775138722282 -69.60379985752196 -7.40000000000004
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.49775138722282 -69.60379985752196 -7.40000000000004
+ vertex 181.2717395158591 -68.57958733391449 -6.745481322062546
+ vertex 180.9131093269919 -68.78664256999652 -6.800000000000041
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.49775138722282 -69.60379985752196 -7.40000000000004
+ vertex 180.9131093269919 -68.78664256999652 -6.800000000000041
+ vertex 179.0078534386661 -69.88664256999658 -6.834314575050805
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.25153541297234 -68.01390190896528 -5.614110472164045
+ vertex 182.81836521531764 -67.6866425699966 -4.000000000000038
+ vertex 182.29874997304697 -67.98664256999652 -5.200000000000013
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.29874997304697 -67.98664256999652 -5.200000000000013
+ vertex 182.81836521531764 -67.6866425699966 -4.000000000000038
+ vertex 182.2515354129724 -68.01390190896532 -4.785889527835981
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.2515354129724 -68.01390190896532 -4.785889527835981
+ vertex 182.81836521531764 -67.6866425699966 -4.000000000000038
+ vertex 182.11310932699186 -68.093822246969 -4.400000000000015
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.11310932699186 -68.093822246969 -4.400000000000015
+ vertex 182.81836521531764 -67.6866425699966 -4.000000000000038
+ vertex 181.8929052241052 -68.2209571450474 -4.068629150101555
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.8929052241052 -68.2209571450474 -4.068629150101555
+ vertex 182.81836521531764 -67.6866425699966 -4.000000000000038
+ vertex 181.60592965001945 -68.38664256999657 -3.8143593539449396
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.60592965001945 -68.38664256999657 -3.8143593539449396
+ vertex 182.81836521531764 -67.6866425699966 -4.000000000000038
+ vertex 182.78885611527102 -67.70367965685205 -3.7411809548975263
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.60592965001945 -68.38664256999657 -3.8143593539449396
+ vertex 182.78885611527102 -67.70367965685205 -3.7411809548975263
+ vertex 181.27173951585914 -68.57958733391463 -3.65451867793752
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.27173951585914 -68.57958733391463 -3.65451867793752
+ vertex 182.78885611527102 -67.70367965685205 -3.7411809548975263
+ vertex 182.70233981153322 -67.75362986810437 -3.5000000000000386
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.27173951585914 -68.57958733391463 -3.65451867793752
+ vertex 182.70233981153322 -67.75362986810437 -3.5000000000000386
+ vertex 180.91310932699193 -68.78664256999662 -3.600000000000047
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.5647122472291 -67.83308917940336 -3.2928932188134885
+ vertex 177.44900771185428 -70.78664256999674 -3.4000000000000443
+ vertex 182.70233981153322 -67.75362986810437 -3.5000000000000386
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.44900771185428 -70.78664256999674 -3.4000000000000443
+ vertex 182.5647122472291 -67.83308917940336 -3.2928932188134885
+ vertex 177.44900771185428 -70.78664256999674 -3.0000000000000453
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.44900771185428 -70.78664256999674 -3.0000000000000453
+ vertex 182.5647122472291 -67.83308917940336 -3.2928932188134885
+ vertex 182.38535251342543 -67.93664256999658 -3.1339745962156043
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.44900771185428 -70.78664256999674 -3.0000000000000453
+ vertex 182.38535251342543 -67.93664256999658 -3.1339745962156043
+ vertex 182.17648367957534 -68.0572330474454 -3.034074173710977
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.44900771185428 -70.78664256999674 -3.0000000000000453
+ vertex 182.17648367957534 -68.0572330474454 -3.034074173710977
+ vertex 181.9523398115333 -68.18664256999665 -3.000000000000051
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.0078534386661 -69.88664256999658 -6.834314575050805
+ vertex 179.71310932699188 -69.47946289302418 -6.000000000000065
+ vertex 179.0078534386662 -69.88664256999668 -4.800000000000045
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.71310932699188 -69.47946289302418 -6.000000000000065
+ vertex 179.0078534386661 -69.88664256999658 -6.834314575050805
+ vertex 179.93331342987864 -69.35232799494582 -6.331370849898536
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.93331342987864 -69.35232799494582 -6.331370849898536
+ vertex 179.0078534386661 -69.88664256999658 -6.834314575050805
+ vertex 180.22028900396433 -69.18664256999656 -6.585640646055151
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 180.22028900396433 -69.18664256999656 -6.585640646055151
+ vertex 179.0078534386661 -69.88664256999658 -6.834314575050805
+ vertex 180.55447913812472 -68.99369780607859 -6.7454813220625685
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 180.55447913812472 -68.99369780607859 -6.7454813220625685
+ vertex 179.0078534386661 -69.88664256999658 -6.834314575050805
+ vertex 180.9131093269919 -68.78664256999652 -6.800000000000041
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.0078534386662 -69.88664256999668 -4.800000000000045
+ vertex 179.71310932699188 -69.47946289302418 -6.000000000000065
+ vertex 179.57468324101143 -69.5593832310279 -5.614110472164098
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.0078534386662 -69.88664256999668 -4.800000000000045
+ vertex 179.57468324101143 -69.5593832310279 -5.614110472164098
+ vertex 179.52746868093678 -69.58664256999661 -5.200000000000067
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.0078534386662 -69.88664256999668 -4.800000000000045
+ vertex 179.52746868093678 -69.58664256999661 -5.200000000000067
+ vertex 179.5746832410114 -69.5593832310279 -4.785889527836012
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.0078534386662 -69.88664256999668 -4.800000000000045
+ vertex 179.5746832410114 -69.5593832310279 -4.785889527836012
+ vertex 177.10259755034048 -70.98664256999675 -4.800000000000042
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.10259755034048 -70.98664256999675 -4.800000000000042
+ vertex 179.5746832410114 -69.5593832310279 -4.785889527836012
+ vertex 177.10259755034048 -70.98664256999675 -3.4000000000000443
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.10259755034048 -70.98664256999675 -3.4000000000000443
+ vertex 179.5746832410114 -69.5593832310279 -4.785889527836012
+ vertex 179.7131093269919 -69.47946289302413 -4.400000000000046
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.10259755034048 -70.98664256999675 -3.4000000000000443
+ vertex 179.7131093269919 -69.47946289302413 -4.400000000000046
+ vertex 179.93331342987867 -69.35232799494591 -4.068629150101574
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.10259755034048 -70.98664256999675 -3.4000000000000443
+ vertex 179.93331342987867 -69.35232799494591 -4.068629150101574
+ vertex 180.22028900396435 -69.18664256999665 -3.814359353944937
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.10259755034048 -70.98664256999675 -3.4000000000000443
+ vertex 180.22028900396435 -69.18664256999665 -3.814359353944937
+ vertex 180.5544791381247 -68.99369780607864 -3.6545186779375425
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.10259755034048 -70.98664256999675 -3.4000000000000443
+ vertex 180.5544791381247 -68.99369780607864 -3.6545186779375425
+ vertex 180.91310932699193 -68.78664256999662 -3.600000000000047
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.10259755034048 -70.98664256999675 -3.4000000000000443
+ vertex 180.91310932699193 -68.78664256999662 -3.600000000000047
+ vertex 182.70233981153322 -67.75362986810437 -3.5000000000000386
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.10259755034048 -70.98664256999675 -3.4000000000000443
+ vertex 182.70233981153322 -67.75362986810437 -3.5000000000000386
+ vertex 177.44900771185428 -70.78664256999674 -3.4000000000000443
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 171.21362480460607 -74.38664256999643 -21.20000000000005
+ vertex 170.8672146430922 -74.58664256999637 -22.60000000000004
+ vertex 171.213624804606 -74.38664256999633 -22.600000000000048
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.8672146430922 -74.58664256999637 -22.60000000000004
+ vertex 171.21362480460607 -74.38664256999643 -21.20000000000005
+ vertex 167.76174321682174 -76.37958733391443 -22.345481322062547
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.8672146430922 -74.58664256999637 -22.60000000000004
+ vertex 167.76174321682174 -76.37958733391443 -22.345481322062547
+ vertex 167.40311302795456 -76.58664256999646 -22.400000000000045
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.8672146430922 -74.58664256999637 -22.60000000000004
+ vertex 167.40311302795456 -76.58664256999646 -22.400000000000045
+ vertex 165.61388254341324 -77.61965527188875 -22.50000000000003
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 167.76174321682174 -76.37958733391443 -22.345481322062547
+ vertex 171.21362480460607 -74.38664256999643 -21.20000000000005
+ vertex 168.0959333509821 -76.18664256999647 -22.185640646055155
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.0959333509821 -76.18664256999647 -22.185640646055155
+ vertex 171.21362480460607 -74.38664256999643 -21.20000000000005
+ vertex 168.3829089250678 -76.0209571450472 -21.931370849898517
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.3829089250678 -76.0209571450472 -21.931370849898517
+ vertex 171.21362480460607 -74.38664256999643 -21.20000000000005
+ vertex 168.60311302795452 -75.89382224696885 -21.600000000000044
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.60311302795452 -75.89382224696885 -21.600000000000044
+ vertex 171.21362480460607 -74.38664256999643 -21.20000000000005
+ vertex 168.74153911393512 -75.81390190896522 -21.21411047216408
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.74153911393512 -75.81390190896522 -21.21411047216408
+ vertex 171.21362480460607 -74.38664256999643 -21.20000000000005
+ vertex 169.30836891628033 -75.48664256999649 -21.200000000000035
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.74153911393512 -75.81390190896522 -21.21411047216408
+ vertex 169.30836891628033 -75.48664256999649 -21.200000000000035
+ vertex 168.7887536740097 -75.7866425699965 -20.800000000000026
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.7887536740097 -75.7866425699965 -20.800000000000026
+ vertex 169.30836891628033 -75.48664256999649 -21.200000000000035
+ vertex 169.30836891628033 -75.48664256999649 -19.165685424949274
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.7887536740097 -75.7866425699965 -20.800000000000026
+ vertex 169.30836891628033 -75.48664256999649 -19.165685424949274
+ vertex 168.7415391139351 -75.81390190896526 -20.385889527835992
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.7415391139351 -75.81390190896526 -20.385889527835992
+ vertex 169.30836891628033 -75.48664256999649 -19.165685424949274
+ vertex 168.60311302795463 -75.89382224696898 -20.000000000000025
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.60311302795463 -75.89382224696898 -20.000000000000025
+ vertex 169.30836891628033 -75.48664256999649 -19.165685424949274
+ vertex 168.38290892506788 -76.02095714504725 -19.668629150101555
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.38290892506788 -76.02095714504725 -19.668629150101555
+ vertex 169.30836891628033 -75.48664256999649 -19.165685424949274
+ vertex 168.09593335098214 -76.18664256999655 -19.41435935394494
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.09593335098214 -76.18664256999655 -19.41435935394494
+ vertex 169.30836891628033 -75.48664256999649 -19.165685424949274
+ vertex 167.7617432168218 -76.37958733391447 -19.254518677937522
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 167.7617432168218 -76.37958733391447 -19.254518677937522
+ vertex 169.30836891628033 -75.48664256999649 -19.165685424949274
+ vertex 167.40311302795456 -76.5866425699965 -19.20000000000005
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 167.0567028664409 -76.78664256999664 -16.400000000000055
+ vertex 165.84426730114276 -77.4866425699967 -16.80000000000005
+ vertex 167.05670286644087 -76.78664256999654 -18.60000000000005
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.84426730114276 -77.4866425699967 -16.80000000000005
+ vertex 167.0567028664409 -76.78664256999664 -16.400000000000055
+ vertex 165.8442673011427 -77.48664256999666 -16.400000000000052
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 167.40311302795456 -76.58664256999646 -22.400000000000045
+ vertex 165.52736623967544 -77.66960548314107 -22.25881904510254
+ vertex 165.61388254341324 -77.61965527188875 -22.50000000000003
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.52736623967544 -77.66960548314107 -22.25881904510254
+ vertex 167.40311302795456 -76.58664256999646 -22.400000000000045
+ vertex 167.04448283908738 -76.79369780607844 -22.34548132206257
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.52736623967544 -77.66960548314107 -22.25881904510254
+ vertex 167.04448283908738 -76.79369780607844 -22.34548132206257
+ vertex 166.71029270492699 -76.98664256999646 -22.185640646055152
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.52736623967544 -77.66960548314107 -22.25881904510254
+ vertex 166.71029270492699 -76.98664256999646 -22.185640646055152
+ vertex 165.49785713962888 -77.68664256999656 -22.00000000000003
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.49785713962888 -77.68664256999656 -22.00000000000003
+ vertex 166.71029270492699 -76.98664256999646 -22.185640646055152
+ vertex 166.4233171308413 -77.15232799494568 -21.931370849898535
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.49785713962888 -77.68664256999656 -22.00000000000003
+ vertex 166.4233171308413 -77.15232799494568 -21.931370849898535
+ vertex 166.20311302795457 -77.27946289302407 -21.600000000000065
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.49785713962888 -77.68664256999656 -22.00000000000003
+ vertex 166.20311302795457 -77.27946289302407 -21.600000000000065
+ vertex 166.06468694197412 -77.35938323102783 -21.214110472164098
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.49785713962888 -77.68664256999656 -22.00000000000003
+ vertex 166.06468694197412 -77.35938323102783 -21.214110472164098
+ vertex 165.4978571396289 -77.6866425699967 -16.80000000000004
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.4978571396289 -77.6866425699967 -16.80000000000004
+ vertex 166.06468694197412 -77.35938323102783 -21.214110472164098
+ vertex 166.01747238189955 -77.3866425699966 -20.800000000000065
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.4978571396289 -77.6866425699967 -16.80000000000004
+ vertex 166.01747238189955 -77.3866425699966 -20.800000000000065
+ vertex 166.06468694197414 -77.35938323102783 -20.385889527836035
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.4978571396289 -77.6866425699967 -16.80000000000004
+ vertex 166.06468694197414 -77.35938323102783 -20.385889527836035
+ vertex 166.2031130279546 -77.27946289302412 -20.000000000000046
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.4978571396289 -77.6866425699967 -16.80000000000004
+ vertex 166.2031130279546 -77.27946289302412 -20.000000000000046
+ vertex 166.42331713084138 -77.15232799494585 -19.668629150101573
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.4978571396289 -77.6866425699967 -16.80000000000004
+ vertex 166.42331713084138 -77.15232799494585 -19.668629150101573
+ vertex 166.71029270492707 -76.98664256999655 -19.414359353944935
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.4978571396289 -77.6866425699967 -16.80000000000004
+ vertex 166.71029270492707 -76.98664256999655 -19.414359353944935
+ vertex 167.04448283908738 -76.79369780607858 -19.254518677937543
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.4978571396289 -77.6866425699967 -16.80000000000004
+ vertex 167.04448283908738 -76.79369780607858 -19.254518677937543
+ vertex 167.40311302795456 -76.5866425699965 -19.20000000000005
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.4978571396289 -77.6866425699967 -16.80000000000004
+ vertex 167.40311302795456 -76.5866425699965 -19.20000000000005
+ vertex 167.05670286644087 -76.78664256999654 -18.60000000000005
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 167.05670286644087 -76.78664256999654 -18.60000000000005
+ vertex 167.40311302795456 -76.5866425699965 -19.20000000000005
+ vertex 169.30836891628033 -75.48664256999649 -19.165685424949274
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 167.05670286644087 -76.78664256999654 -18.60000000000005
+ vertex 169.30836891628033 -75.48664256999649 -19.165685424949274
+ vertex 168.81847096772375 -75.76948528247121 -18.60000000000005
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.4978571396289 -77.6866425699967 -16.80000000000004
+ vertex 167.05670286644087 -76.78664256999654 -18.60000000000005
+ vertex 165.84426730114276 -77.4866425699967 -16.80000000000005
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.52746868093652 -69.58664256999616 -20.800000000000026
+ vertex 179.00785343866588 -69.88664256999613 -21.200000000000056
+ vertex 179.57468324101114 -69.5593832310274 -21.214110472164055
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.00785343866588 -69.88664256999613 -21.200000000000056
+ vertex 179.52746868093652 -69.58664256999616 -20.800000000000026
+ vertex 179.00785343866593 -69.88664256999623 -19.16568542494932
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.00785343866593 -69.88664256999623 -19.16568542494932
+ vertex 179.52746868093652 -69.58664256999616 -20.800000000000026
+ vertex 179.57468324101112 -69.55938323102744 -20.385889527835992
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.00785343866593 -69.88664256999623 -19.16568542494932
+ vertex 179.57468324101112 -69.55938323102744 -20.385889527835992
+ vertex 179.71310932699166 -69.47946289302372 -20.000000000000025
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.00785343866593 -69.88664256999623 -19.16568542494932
+ vertex 179.71310932699166 -69.47946289302372 -20.000000000000025
+ vertex 179.93331342987838 -69.35232799494541 -19.668629150101555
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.00785343866593 -69.88664256999623 -19.16568542494932
+ vertex 179.93331342987838 -69.35232799494541 -19.668629150101555
+ vertex 180.22028900396413 -69.18664256999621 -19.414359353944917
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.00785343866593 -69.88664256999623 -19.16568542494932
+ vertex 180.22028900396413 -69.18664256999621 -19.414359353944917
+ vertex 180.55447913812446 -68.99369780607823 -19.2545186779375
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.00785343866593 -69.88664256999623 -19.16568542494932
+ vertex 180.55447913812446 -68.99369780607823 -19.2545186779375
+ vertex 180.9131093269916 -68.78664256999612 -19.200000000000006
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.17648367957491 -68.05723304744475 -22.96592582628912
+ vertex 177.44900771185388 -70.7866425699962 -23.000000000000053
+ vertex 181.9523398115329 -68.18664256999598 -23.000000000000057
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.44900771185388 -70.7866425699962 -23.000000000000053
+ vertex 182.17648367957491 -68.05723304744475 -22.96592582628912
+ vertex 177.4490077118538 -70.78664256999616 -22.600000000000055
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.4490077118538 -70.78664256999616 -22.600000000000055
+ vertex 182.17648367957491 -68.05723304744475 -22.96592582628912
+ vertex 182.38535251342515 -67.93664256999604 -22.86602540378449
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.4490077118538 -70.78664256999616 -22.600000000000055
+ vertex 182.38535251342515 -67.93664256999604 -22.86602540378449
+ vertex 182.5647122472287 -67.83308917940278 -22.70710678118661
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.4490077118538 -70.78664256999616 -22.600000000000055
+ vertex 182.5647122472287 -67.83308917940278 -22.70710678118661
+ vertex 182.7023398115329 -67.75362986810383 -22.50000000000006
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.4490077118538 -70.78664256999616 -22.600000000000055
+ vertex 182.7023398115329 -67.75362986810383 -22.50000000000006
+ vertex 177.10259755034005 -70.9866425699962 -22.60000000000005
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.10259755034005 -70.9866425699962 -22.60000000000005
+ vertex 182.7023398115329 -67.75362986810383 -22.50000000000006
+ vertex 180.91310932699167 -68.78664256999606 -22.400000000000023
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.10259755034005 -70.9866425699962 -22.60000000000005
+ vertex 180.91310932699167 -68.78664256999606 -22.400000000000023
+ vertex 180.55447913812438 -68.99369780607809 -22.34548132206253
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.10259755034005 -70.9866425699962 -22.60000000000005
+ vertex 180.55447913812438 -68.99369780607809 -22.34548132206253
+ vertex 177.10259755034016 -70.9866425699962 -21.200000000000053
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.10259755034016 -70.9866425699962 -21.200000000000053
+ vertex 180.55447913812438 -68.99369780607809 -22.34548132206253
+ vertex 180.22028900396407 -69.18664256999607 -22.185640646055134
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.10259755034016 -70.9866425699962 -21.200000000000053
+ vertex 180.22028900396407 -69.18664256999607 -22.185640646055134
+ vertex 179.93331342987832 -69.35232799494533 -21.931370849898517
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.10259755034016 -70.9866425699962 -21.200000000000053
+ vertex 179.93331342987832 -69.35232799494533 -21.931370849898517
+ vertex 179.71310932699166 -69.47946289302368 -21.600000000000023
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.10259755034016 -70.9866425699962 -21.200000000000053
+ vertex 179.71310932699166 -69.47946289302368 -21.600000000000023
+ vertex 179.57468324101114 -69.5593832310274 -21.214110472164055
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.10259755034016 -70.9866425699962 -21.200000000000053
+ vertex 179.57468324101114 -69.5593832310274 -21.214110472164055
+ vertex 179.00785343866588 -69.88664256999613 -21.200000000000056
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.8672146430923 -74.58664256999637 -23.000000000000036
+ vertex 166.13973867537123 -77.31605209254772 -22.9659258262891
+ vertex 166.36388254341324 -77.18664256999647 -23.00000000000004
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 166.13973867537123 -77.31605209254772 -22.9659258262891
+ vertex 170.8672146430923 -74.58664256999637 -23.000000000000036
+ vertex 170.8672146430922 -74.58664256999637 -22.60000000000004
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 166.13973867537123 -77.31605209254772 -22.9659258262891
+ vertex 170.8672146430922 -74.58664256999637 -22.60000000000004
+ vertex 165.93086984152103 -77.43664256999645 -22.866025403784477
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.93086984152103 -77.43664256999645 -22.866025403784477
+ vertex 170.8672146430922 -74.58664256999637 -22.60000000000004
+ vertex 165.75151010771745 -77.54019596058976 -22.707106781186592
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.75151010771745 -77.54019596058976 -22.707106781186592
+ vertex 170.8672146430922 -74.58664256999637 -22.60000000000004
+ vertex 165.61388254341324 -77.61965527188875 -22.50000000000003
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.78885611527073 -67.7036796568515 -22.258819045102573
+ vertex 180.91310932699167 -68.78664256999606 -22.400000000000023
+ vertex 182.7023398115329 -67.75362986810383 -22.50000000000006
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 180.91310932699167 -68.78664256999606 -22.400000000000023
+ vertex 182.78885611527073 -67.7036796568515 -22.258819045102573
+ vertex 181.2717395158588 -68.57958733391403 -22.345481322062533
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.2717395158588 -68.57958733391403 -22.345481322062533
+ vertex 182.78885611527073 -67.7036796568515 -22.258819045102573
+ vertex 181.6059296500192 -68.38664256999607 -22.185640646055123
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.6059296500192 -68.38664256999607 -22.185640646055123
+ vertex 182.78885611527073 -67.7036796568515 -22.258819045102573
+ vertex 182.8183652153173 -67.68664256999605 -22.00000000000006
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.6059296500192 -68.38664256999607 -22.185640646055123
+ vertex 182.8183652153173 -67.68664256999605 -22.00000000000006
+ vertex 181.89290522410485 -68.22095714504677 -21.931370849898506
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.89290522410485 -68.22095714504677 -21.931370849898506
+ vertex 182.8183652153173 -67.68664256999605 -22.00000000000006
+ vertex 182.11310932699158 -68.09382224696846 -21.600000000000016
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.11310932699158 -68.09382224696846 -21.600000000000016
+ vertex 182.8183652153173 -67.68664256999605 -22.00000000000006
+ vertex 182.2515354129721 -68.01390190896478 -21.214110472164048
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.2515354129721 -68.01390190896478 -21.214110472164048
+ vertex 182.8183652153173 -67.68664256999605 -22.00000000000006
+ vertex 182.81836521531744 -67.68664256999622 -16.800000000000093
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.2515354129721 -68.01390190896478 -21.214110472164048
+ vertex 182.81836521531744 -67.68664256999622 -16.800000000000093
+ vertex 182.29874997304668 -67.98664256999602 -20.800000000000015
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.29874997304668 -67.98664256999602 -20.800000000000015
+ vertex 182.81836521531744 -67.68664256999622 -16.800000000000093
+ vertex 182.25153541297215 -68.01390190896487 -20.385889527835985
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.25153541297215 -68.01390190896487 -20.385889527835985
+ vertex 182.81836521531744 -67.68664256999622 -16.800000000000093
+ vertex 182.1131093269916 -68.0938222469685 -20.000000000000018
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.1131093269916 -68.0938222469685 -20.000000000000018
+ vertex 182.81836521531744 -67.68664256999622 -16.800000000000093
+ vertex 181.89290522410488 -68.2209571450469 -19.668629150101545
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.89290522410488 -68.2209571450469 -19.668629150101545
+ vertex 182.81836521531744 -67.68664256999622 -16.800000000000093
+ vertex 181.60592965001922 -68.38664256999616 -19.414359353944903
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.60592965001922 -68.38664256999616 -19.414359353944903
+ vertex 182.81836521531744 -67.68664256999622 -16.800000000000093
+ vertex 181.27173951585885 -68.57958733391409 -19.254518677937508
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.27173951585885 -68.57958733391409 -19.254518677937508
+ vertex 182.81836521531744 -67.68664256999622 -16.800000000000093
+ vertex 180.9131093269916 -68.78664256999612 -19.200000000000006
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 180.9131093269916 -68.78664256999612 -19.200000000000006
+ vertex 182.81836521531744 -67.68664256999622 -16.800000000000093
+ vertex 181.25951948850548 -68.5866425699962 -18.60000000000006
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 180.9131093269916 -68.78664256999612 -19.200000000000006
+ vertex 181.25951948850548 -68.5866425699962 -18.60000000000006
+ vertex 179.00785343866593 -69.88664256999623 -19.16568542494932
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.25951948850548 -68.5866425699962 -18.60000000000006
+ vertex 182.81836521531744 -67.68664256999622 -16.800000000000093
+ vertex 182.4719550538037 -67.88664256999623 -16.80000000000009
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.25951948850548 -68.5866425699962 -18.60000000000006
+ vertex 182.4719550538037 -67.88664256999623 -16.80000000000009
+ vertex 181.25951948850548 -68.58664256999624 -16.400000000000063
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.25951948850548 -68.58664256999624 -16.400000000000063
+ vertex 182.4719550538037 -67.88664256999623 -16.80000000000009
+ vertex 182.47195505380364 -67.88664256999623 -16.400000000000095
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.36240517147564 -70.83664256999656 -9.865685424949291
+ vertex 176.872507222919 -71.11948528247122 -9.300000000000056
+ vertex 171.44371513202762 -74.25379985752217 -9.300000000000061
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 176.872507222919 -71.11948528247122 -9.300000000000056
+ vertex 177.36240517147564 -70.83664256999656 -9.865685424949291
+ vertex 179.49775138722282 -69.60379985752196 -7.40000000000004
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 176.872507222919 -71.11948528247122 -9.300000000000056
+ vertex 179.49775138722282 -69.60379985752196 -7.40000000000004
+ vertex 179.0078534386661 -69.88664256999658 -6.834314575050805
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 182.47195505380378 -67.88664256999641 -9.20000000000005
+ vertex 181.2595194885056 -68.58664256999643 -9.600000000000035
+ vertex 182.47195505380378 -67.88664256999637 -9.60000000000005
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 181.2595194885056 -68.58664256999643 -9.600000000000035
+ vertex 182.47195505380378 -67.88664256999641 -9.20000000000005
+ vertex 181.25951948850562 -68.58664256999647 -7.40000000000004
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 177.36240517147556 -70.83664256999637 -16.134314575050784
+ vertex 174.76329962118663 -72.33723685910802 -15.607999730980517
+ vertex 174.1581111774732 -72.68664256999645 -15.700000000000038
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 174.76329962118663 -72.33723685910802 -15.607999730980517
+ vertex 177.36240517147556 -70.83664256999637 -16.134314575050784
+ vertex 175.32724547258218 -72.01164256999641 -15.338268590218007
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 175.32724547258218 -72.01164256999641 -15.338268590218007
+ vertex 177.36240517147556 -70.83664256999637 -16.134314575050784
+ vertex 175.81151675385183 -71.73204841539457 -14.909188309203735
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 175.81151675385183 -71.73204841539457 -14.909188309203735
+ vertex 177.36240517147556 -70.83664256999637 -16.134314575050784
+ vertex 176.18311117747322 -71.51750827488746 -14.350000000000055
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 176.18311117747322 -71.51750827488746 -14.350000000000055
+ vertex 177.36240517147556 -70.83664256999637 -16.134314575050784
+ vertex 176.41670519756528 -71.3826427045062 -13.698811421776844
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 176.41670519756528 -71.3826427045062 -13.698811421776844
+ vertex 177.36240517147556 -70.83664256999637 -16.134314575050784
+ vertex 177.36240517147564 -70.83664256999656 -9.865685424949291
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 176.41670519756528 -71.3826427045062 -13.698811421776844
+ vertex 177.36240517147564 -70.83664256999656 -9.865685424949291
+ vertex 176.4963797676912 -71.33664256999649 -13.000000000000046
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 176.4963797676912 -71.33664256999649 -13.000000000000046
+ vertex 177.36240517147564 -70.83664256999656 -9.865685424949291
+ vertex 176.41670519756528 -71.3826427045062 -12.30118857822325
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 176.41670519756528 -71.3826427045062 -12.30118857822325
+ vertex 177.36240517147564 -70.83664256999656 -9.865685424949291
+ vertex 176.18311117747325 -71.51750827488755 -11.650000000000038
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 176.18311117747325 -71.51750827488755 -11.650000000000038
+ vertex 177.36240517147564 -70.83664256999656 -9.865685424949291
+ vertex 175.81151675385195 -71.73204841539476 -11.09081169079636
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 175.81151675385195 -71.73204841539476 -11.09081169079636
+ vertex 177.36240517147564 -70.83664256999656 -9.865685424949291
+ vertex 175.3272454725822 -72.01164256999655 -10.661731409782071
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 175.3272454725822 -72.01164256999655 -10.661731409782071
+ vertex 177.36240517147564 -70.83664256999656 -9.865685424949291
+ vertex 174.76329962118677 -72.33723685910824 -10.392000269019562
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 174.76329962118677 -72.33723685910824 -10.392000269019562
+ vertex 177.36240517147564 -70.83664256999656 -9.865685424949291
+ vertex 174.15811117747327 -72.68664256999666 -10.30000000000005
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 174.15811117747327 -72.68664256999666 -10.30000000000005
+ vertex 177.36240517147564 -70.83664256999656 -9.865685424949291
+ vertex 170.9538171834709 -74.5366425699967 -9.865685424949328
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.9538171834709 -74.5366425699967 -9.865685424949328
+ vertex 177.36240517147564 -70.83664256999656 -9.865685424949291
+ vertex 171.44371513202762 -74.25379985752217 -9.300000000000061
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.9538171834709 -74.5366425699967 -9.865685424949328
+ vertex 171.44371513202762 -74.25379985752217 -9.300000000000061
+ vertex 168.81847096772393 -75.76948528247148 -7.400000000000051
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.81847096772393 -75.76948528247148 -7.400000000000051
+ vertex 171.44371513202762 -74.25379985752217 -9.300000000000061
+ vertex 169.30836891628059 -75.48664256999689 -6.834314575050794
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.81847096772393 -75.76948528247148 -7.400000000000051
+ vertex 169.30836891628059 -75.48664256999689 -6.834314575050794
+ vertex 167.05670286644107 -76.78664256999691 -7.400000000000048
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 171.21362480460635 -74.38664256999691 -3.40000000000005
+ vertex 169.30836891628059 -75.48664256999693 -4.800000000000056
+ vertex 171.21362480460635 -74.38664256999687 -4.80000000000007
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 169.30836891628059 -75.48664256999693 -4.800000000000056
+ vertex 171.21362480460635 -74.38664256999691 -3.40000000000005
+ vertex 168.74153911393532 -75.81390190896572 -4.785889527836001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.74153911393532 -75.81390190896572 -4.785889527836001
+ vertex 171.21362480460635 -74.38664256999691 -3.40000000000005
+ vertex 168.60311302795486 -75.89382224696935 -4.400000000000034
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.60311302795486 -75.89382224696935 -4.400000000000034
+ vertex 171.21362480460635 -74.38664256999691 -3.40000000000005
+ vertex 168.3829089250682 -76.02095714504779 -4.068629150101538
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.3829089250682 -76.02095714504779 -4.068629150101538
+ vertex 171.21362480460635 -74.38664256999691 -3.40000000000005
+ vertex 168.09593335098245 -76.186642569997 -3.8143593539449228
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.09593335098245 -76.186642569997 -3.8143593539449228
+ vertex 171.21362480460635 -74.38664256999691 -3.40000000000005
+ vertex 167.76174321682208 -76.37958733391503 -3.6545186779375283
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 167.76174321682208 -76.37958733391503 -3.6545186779375283
+ vertex 171.21362480460635 -74.38664256999691 -3.40000000000005
+ vertex 167.40311302795487 -76.58664256999705 -3.600000000000033
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 167.40311302795487 -76.58664256999705 -3.600000000000033
+ vertex 171.21362480460635 -74.38664256999691 -3.40000000000005
+ vertex 165.6138825434136 -77.61965527188929 -3.50000000000003
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.6138825434136 -77.61965527188929 -3.50000000000003
+ vertex 171.21362480460635 -74.38664256999691 -3.40000000000005
+ vertex 170.86721464309258 -74.58664256999695 -3.400000000000036
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.6138825434136 -77.61965527188929 -3.50000000000003
+ vertex 170.86721464309258 -74.58664256999695 -3.400000000000036
+ vertex 165.7515101077178 -77.5401959605903 -3.29289321881348
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.7515101077178 -77.5401959605903 -3.29289321881348
+ vertex 170.86721464309258 -74.58664256999695 -3.400000000000036
+ vertex 170.86721464309264 -74.58664256999695 -3.000000000000037
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.7515101077178 -77.5401959605903 -3.29289321881348
+ vertex 170.86721464309264 -74.58664256999695 -3.000000000000037
+ vertex 165.93086984152146 -77.43664256999712 -3.133974596215596
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.93086984152146 -77.43664256999712 -3.133974596215596
+ vertex 170.86721464309264 -74.58664256999695 -3.000000000000037
+ vertex 166.1397386753716 -77.31605209254836 -3.0340741737109713
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 166.1397386753716 -77.31605209254836 -3.0340741737109713
+ vertex 170.86721464309264 -74.58664256999695 -3.000000000000037
+ vertex 166.3638825434136 -77.18664256999709 -3.000000000000034
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 167.05670286644107 -76.78664256999691 -7.400000000000048
+ vertex 165.84426730114282 -77.48664256999689 -9.60000000000002
+ vertex 167.05670286644101 -76.78664256999687 -9.600000000000044
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.84426730114282 -77.48664256999689 -9.60000000000002
+ vertex 167.05670286644107 -76.78664256999691 -7.400000000000048
+ vertex 165.84426730114282 -77.48664256999693 -9.20000000000002
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.84426730114282 -77.48664256999693 -9.20000000000002
+ vertex 167.05670286644107 -76.78664256999691 -7.400000000000048
+ vertex 165.49785713962913 -77.68664256999693 -9.20000000000002
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.49785713962913 -77.68664256999693 -9.20000000000002
+ vertex 167.05670286644107 -76.78664256999691 -7.400000000000048
+ vertex 166.20311302795486 -77.27946289302447 -6.000000000000051
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.49785713962913 -77.68664256999693 -9.20000000000002
+ vertex 166.20311302795486 -77.27946289302447 -6.000000000000051
+ vertex 166.0646869419744 -77.35938323102825 -5.614110472164084
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.49785713962913 -77.68664256999693 -9.20000000000002
+ vertex 166.0646869419744 -77.35938323102825 -5.614110472164084
+ vertex 165.49785713962922 -77.68664256999712 -4.000000000000029
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 166.20311302795486 -77.27946289302447 -6.000000000000051
+ vertex 167.05670286644107 -76.78664256999691 -7.400000000000048
+ vertex 166.42331713084158 -77.15232799494622 -6.331370849898522
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 166.42331713084158 -77.15232799494622 -6.331370849898522
+ vertex 167.05670286644107 -76.78664256999691 -7.400000000000048
+ vertex 166.7102927049273 -76.98664256999696 -6.585640646055159
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 166.7102927049273 -76.98664256999696 -6.585640646055159
+ vertex 167.05670286644107 -76.78664256999691 -7.400000000000048
+ vertex 167.0444828390876 -76.79369780607898 -6.745481322062554
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 167.0444828390876 -76.79369780607898 -6.745481322062554
+ vertex 167.05670286644107 -76.78664256999691 -7.400000000000048
+ vertex 167.40311302795493 -76.58664256999695 -6.80000000000005
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 167.40311302795493 -76.58664256999695 -6.80000000000005
+ vertex 167.05670286644107 -76.78664256999691 -7.400000000000048
+ vertex 169.30836891628059 -75.48664256999689 -6.834314575050794
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.49785713962922 -77.68664256999712 -4.000000000000029
+ vertex 166.0646869419744 -77.35938323102825 -5.614110472164084
+ vertex 166.01747238189978 -77.38664256999695 -5.200000000000053
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.49785713962922 -77.68664256999712 -4.000000000000029
+ vertex 166.01747238189978 -77.38664256999695 -5.200000000000053
+ vertex 166.06468694197437 -77.35938323102829 -4.78588952783602
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.49785713962922 -77.68664256999712 -4.000000000000029
+ vertex 166.06468694197437 -77.35938323102829 -4.78588952783602
+ vertex 166.20311302795488 -77.27946289302452 -4.400000000000054
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.49785713962922 -77.68664256999712 -4.000000000000029
+ vertex 166.20311302795488 -77.27946289302452 -4.400000000000054
+ vertex 166.4233171308416 -77.1523279949463 -4.068629150101582
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.49785713962922 -77.68664256999712 -4.000000000000029
+ vertex 166.4233171308416 -77.1523279949463 -4.068629150101582
+ vertex 166.71029270492735 -76.98664256999704 -3.8143593539449454
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.49785713962922 -77.68664256999712 -4.000000000000029
+ vertex 166.71029270492735 -76.98664256999704 -3.8143593539449454
+ vertex 165.52736623967576 -77.66960548314157 -3.741180954897518
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.52736623967576 -77.66960548314157 -3.741180954897518
+ vertex 166.71029270492735 -76.98664256999704 -3.8143593539449454
+ vertex 167.04448283908772 -76.79369780607912 -3.6545186779375283
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.52736623967576 -77.66960548314157 -3.741180954897518
+ vertex 167.04448283908772 -76.79369780607912 -3.6545186779375283
+ vertex 165.6138825434136 -77.61965527188929 -3.50000000000003
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 165.6138825434136 -77.61965527188929 -3.50000000000003
+ vertex 167.04448283908772 -76.79369780607912 -3.6545186779375283
+ vertex 167.40311302795487 -76.58664256999705 -3.600000000000033
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 169.30836891628059 -75.48664256999689 -6.834314575050794
+ vertex 167.76174321682203 -76.37958733391484 -6.745481322062554
+ vertex 167.40311302795493 -76.58664256999695 -6.80000000000005
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 167.76174321682203 -76.37958733391484 -6.745481322062554
+ vertex 169.30836891628059 -75.48664256999689 -6.834314575050794
+ vertex 168.09593335098245 -76.18664256999696 -6.585640646055137
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.09593335098245 -76.18664256999696 -6.585640646055137
+ vertex 169.30836891628059 -75.48664256999689 -6.834314575050794
+ vertex 168.3829089250681 -76.0209571450476 -6.3313708498985
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.3829089250681 -76.0209571450476 -6.3313708498985
+ vertex 169.30836891628059 -75.48664256999689 -6.834314575050794
+ vertex 168.60311302795486 -75.89382224696935 -6.000000000000031
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.60311302795486 -75.89382224696935 -6.000000000000031
+ vertex 169.30836891628059 -75.48664256999689 -6.834314575050794
+ vertex 169.30836891628059 -75.48664256999693 -4.800000000000056
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.60311302795486 -75.89382224696935 -6.000000000000031
+ vertex 169.30836891628059 -75.48664256999693 -4.800000000000056
+ vertex 168.7415391139354 -75.81390190896572 -5.6141104721640644
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.7415391139354 -75.81390190896572 -5.6141104721640644
+ vertex 169.30836891628059 -75.48664256999693 -4.800000000000056
+ vertex 168.78875367400994 -75.78664256999687 -5.200000000000033
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.78875367400994 -75.78664256999687 -5.200000000000033
+ vertex 169.30836891628059 -75.48664256999693 -4.800000000000056
+ vertex 168.74153911393532 -75.81390190896572 -4.785889527836001
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.00785343866593 -69.88664256999623 -19.16568542494932
+ vertex 179.49775138722254 -69.6037998575216 -18.60000000000005
+ vertex 176.8725072229189 -71.11948528247095 -16.700000000000063
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 179.49775138722254 -69.6037998575216 -18.60000000000005
+ vertex 179.00785343866593 -69.88664256999623 -19.16568542494932
+ vertex 181.25951948850548 -68.5866425699962 -18.60000000000006
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 176.8725072229189 -71.11948528247095 -16.700000000000063
+ vertex 179.49775138722254 -69.6037998575216 -18.60000000000005
+ vertex 177.36240517147556 -70.83664256999637 -16.134314575050784
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 176.8725072229189 -71.11948528247095 -16.700000000000063
+ vertex 177.36240517147556 -70.83664256999637 -16.134314575050784
+ vertex 171.44371513202742 -74.25379985752184 -16.700000000000028
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 171.44371513202742 -74.25379985752184 -16.700000000000028
+ vertex 177.36240517147556 -70.83664256999637 -16.134314575050784
+ vertex 170.95381718347082 -74.53664256999652 -16.134314575050794
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.95381718347082 -74.53664256999652 -16.134314575050794
+ vertex 177.36240517147556 -70.83664256999637 -16.134314575050784
+ vertex 174.1581111774732 -72.68664256999645 -15.700000000000038
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.95381718347082 -74.53664256999652 -16.134314575050794
+ vertex 174.1581111774732 -72.68664256999645 -15.700000000000038
+ vertex 173.55292273375974 -73.03604828088491 -15.607999730980529
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.95381718347082 -74.53664256999652 -16.134314575050794
+ vertex 173.55292273375974 -73.03604828088491 -15.607999730980529
+ vertex 172.98897688236423 -73.36164256999652 -15.33826859021802
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.95381718347082 -74.53664256999652 -16.134314575050794
+ vertex 172.98897688236423 -73.36164256999652 -15.33826859021802
+ vertex 172.50470560109457 -73.64123672459836 -14.909188309203731
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.95381718347082 -74.53664256999652 -16.134314575050794
+ vertex 172.50470560109457 -73.64123672459836 -14.909188309203731
+ vertex 172.13311117747327 -73.85577686510557 -14.350000000000053
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.95381718347082 -74.53664256999652 -16.134314575050794
+ vertex 172.13311117747327 -73.85577686510557 -14.350000000000053
+ vertex 171.89951715738118 -73.99064243548682 -13.698811421776819
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.95381718347082 -74.53664256999652 -16.134314575050794
+ vertex 171.89951715738118 -73.99064243548682 -13.698811421776819
+ vertex 170.9538171834709 -74.5366425699967 -9.865685424949328
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.9538171834709 -74.5366425699967 -9.865685424949328
+ vertex 171.89951715738118 -73.99064243548682 -13.698811421776819
+ vertex 171.8198425872553 -74.03664256999663 -13.000000000000021
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.9538171834709 -74.5366425699967 -9.865685424949328
+ vertex 171.8198425872553 -74.03664256999663 -13.000000000000021
+ vertex 171.89951715738127 -73.99064243548692 -12.3011885782232
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.9538171834709 -74.5366425699967 -9.865685424949328
+ vertex 171.89951715738127 -73.99064243548692 -12.3011885782232
+ vertex 172.1331111774733 -73.85577686510561 -11.650000000000011
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.9538171834709 -74.5366425699967 -9.865685424949328
+ vertex 172.1331111774733 -73.85577686510561 -11.650000000000011
+ vertex 172.5047056010947 -73.64123672459854 -11.090811690796333
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.9538171834709 -74.5366425699967 -9.865685424949328
+ vertex 172.5047056010947 -73.64123672459854 -11.090811690796333
+ vertex 172.98897688236434 -73.3616425699967 -10.661731409782044
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.9538171834709 -74.5366425699967 -9.865685424949328
+ vertex 172.98897688236434 -73.3616425699967 -10.661731409782044
+ vertex 173.5529227337599 -73.0360482808851 -10.39200026901956
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 170.9538171834709 -74.5366425699967 -9.865685424949328
+ vertex 173.5529227337599 -73.0360482808851 -10.39200026901956
+ vertex 174.15811117747327 -72.68664256999666 -10.30000000000005
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 171.44371513202742 -74.25379985752184 -16.700000000000028
+ vertex 168.81847096772375 -75.76948528247121 -18.60000000000005
+ vertex 169.30836891628033 -75.48664256999649 -19.165685424949274
+ endloop
+endfacet
+facet normal 0.4999999999999999 -0.8660254037844389 -2.975049770103308e-16
+ outer loop
+ vertex 168.81847096772375 -75.76948528247121 -18.60000000000005
+ vertex 171.44371513202742 -74.25379985752184 -16.700000000000028
+ vertex 170.95381718347082 -74.53664256999652 -16.134314575050794
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 17.04448283908832 183.0139233292517 -6.745481322062464
+ vertex 17.76174321682278 183.42803380141575 -6.745481322062464
+ vertex 17.40311302795556 183.22097856533372 -6.799999999999959
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 17.76174321682278 183.42803380141575 -6.745481322062464
+ vertex 17.04448283908832 183.0139233292517 -6.745481322062464
+ vertex 16.71029270492801 182.82097856533372 -6.58564064605507
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 17.76174321682278 183.42803380141575 -6.745481322062464
+ vertex 16.71029270492801 182.82097856533372 -6.58564064605507
+ vertex 18.09593335098308 183.62097856533376 -6.5856406460550465
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.09593335098308 183.62097856533376 -6.5856406460550465
+ vertex 16.71029270492801 182.82097856533372 -6.58564064605507
+ vertex 16.423317130842303 182.6552931403844 -6.331370849898432
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.09593335098308 183.62097856533376 -6.5856406460550465
+ vertex 16.423317130842303 182.6552931403844 -6.331370849898432
+ vertex 18.382908925068815 183.78666399028296 -6.331370849898409
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.382908925068815 183.78666399028296 -6.331370849898409
+ vertex 16.423317130842303 182.6552931403844 -6.331370849898432
+ vertex 16.203113027955567 182.5281582423061 -5.999999999999961
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.382908925068815 183.78666399028296 -6.331370849898409
+ vertex 16.203113027955567 182.5281582423061 -5.999999999999961
+ vertex 18.603113027955537 183.91379888836127 -5.999999999999941
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.603113027955537 183.91379888836127 -5.999999999999941
+ vertex 16.203113027955567 182.5281582423061 -5.999999999999961
+ vertex 16.06468694197509 182.4482379043024 -5.614110472163994
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.603113027955537 183.91379888836127 -5.999999999999941
+ vertex 16.06468694197509 182.4482379043024 -5.614110472163994
+ vertex 18.74153911393604 183.993719226365 -5.614110472163975
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.74153911393604 183.993719226365 -5.614110472163975
+ vertex 16.06468694197509 182.4482379043024 -5.614110472163994
+ vertex 16.01747238190049 182.42097856533363 -5.199999999999962
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.74153911393604 183.993719226365 -5.614110472163975
+ vertex 16.01747238190049 182.42097856533363 -5.199999999999962
+ vertex 18.788753674010618 184.0209785653337 -5.1999999999999424
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.788753674010618 184.0209785653337 -5.1999999999999424
+ vertex 16.01747238190049 182.42097856533363 -5.199999999999962
+ vertex 16.064686941975086 182.44823790430237 -4.785889527835931
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.788753674010618 184.0209785653337 -5.1999999999999424
+ vertex 16.064686941975086 182.44823790430237 -4.785889527835931
+ vertex 18.741539113936042 183.99371922636496 -4.785889527835911
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.741539113936042 183.99371922636496 -4.785889527835911
+ vertex 16.064686941975086 182.44823790430237 -4.785889527835931
+ vertex 16.20311302795559 182.52815824230606 -4.399999999999964
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.741539113936042 183.99371922636496 -4.785889527835911
+ vertex 16.20311302795559 182.52815824230606 -4.399999999999964
+ vertex 18.603113027955562 183.91379888836124 -4.399999999999944
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.603113027955562 183.91379888836124 -4.399999999999944
+ vertex 16.20311302795559 182.52815824230606 -4.399999999999964
+ vertex 16.423317130842317 182.65529314038437 -4.068629150101493
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.603113027955562 183.91379888836124 -4.399999999999944
+ vertex 16.423317130842317 182.65529314038437 -4.068629150101493
+ vertex 18.38290892506884 183.78666399028288 -4.068629150101447
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.38290892506884 183.78666399028288 -4.068629150101447
+ vertex 16.423317130842317 182.65529314038437 -4.068629150101493
+ vertex 16.710292704928023 182.8209785653336 -3.8143593539448553
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.38290892506884 183.78666399028288 -4.068629150101447
+ vertex 16.710292704928023 182.8209785653336 -3.8143593539448553
+ vertex 18.095933350983124 183.62097856533364 -3.8143593539448326
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.095933350983124 183.62097856533364 -3.8143593539448326
+ vertex 16.710292704928023 182.8209785653336 -3.8143593539448553
+ vertex 17.04448283908838 183.01392332925155 -3.654518677937438
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 18.095933350983124 183.62097856533364 -3.8143593539448326
+ vertex 17.04448283908838 183.01392332925155 -3.654518677937438
+ vertex 17.761743216822772 183.42803380141564 -3.654518677937438
+ endloop
+endfacet
+facet normal -0.4999999999999999 0.8660254037844389 2.970018574227152e-16
+ outer loop
+ vertex 17.761743216822772 183.42803380141564 -3.654518677937438
+ vertex 17.04448283908838 183.01392332925155 -3.654518677937438
+ vertex 17.403113027955573 183.2209785653336 -3.599999999999943
+ endloop
+endfacet
+facet normal -0.14720786925725476 -0.989105577392393 -3.150966317595318e-16
+ outer loop
+ vertex -153.21066695824285 -123.85676701721619 617.4
+ vertex -154.80461230967546 -123.6195412808944 597.4
+ vertex -153.21066695824285 -123.85676701721619 597.4
+ endloop
+endfacet
+facet normal -0.14720786925725476 -0.989105577392393 -3.150966317595318e-16
+ outer loop
+ vertex -154.80461230967546 -123.6195412808944 597.4
+ vertex -153.21066695824285 -123.85676701721619 617.4
+ vertex -154.80461230967546 -123.6195412808944 617.4
+ endloop
+endfacet
+facet normal 1.0 -8.881784197001248e-16 1.4922322636808805e-17
+ outer loop
+ vertex -150.00000000000014 -121.12479659831224 617.4
+ vertex -150.0000000000001 -104.43433599533701 597.4
+ vertex -150.0000000000001 -104.43433599533701 617.4
+ endloop
+endfacet
+facet normal 1.0 -8.881784197001248e-16 1.4922322636808805e-17
+ outer loop
+ vertex -150.0000000000001 -104.43433599533701 597.4
+ vertex -150.00000000000014 -121.12479659831224 617.4
+ vertex -150.00000000000014 -121.12479659831224 597.4
+ endloop
+endfacet
+facet normal 1.0 -8.881784197001248e-16 1.4922322636808805e-17
+ outer loop
+ vertex -150.00000000000014 -121.12479659831224 597.4
+ vertex -150.00000000000014 -121.12479659831224 617.4
+ vertex -150.0000000000001 -124.13030787576982 617.4
+ endloop
+endfacet
+facet normal 1.0 -8.881784197001248e-16 1.4922322636808805e-17
+ outer loop
+ vertex -150.00000000000014 -121.12479659831224 597.4
+ vertex -150.0000000000001 -124.13030787576982 617.4
+ vertex -150.0000000000001 -124.13030787576982 597.4
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -157.9516070444239 -64.71153654742272 604.4681483474218
+ vertex -145.29278799932132 -42.78581879748479 604.4
+ vertex -157.6927879993214 -64.26324881133867 604.4
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -145.29278799932132 -42.78581879748479 604.4
+ vertex -157.9516070444239 -64.71153654742272 604.4681483474218
+ vertex -145.03396895421878 -42.33753106140079 604.4681483474218
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -145.03396895421878 -42.33753106140079 604.4681483474218
+ vertex -157.9516070444239 -64.71153654742272 604.4681483474218
+ vertex -158.19278799932138 -65.12927421512313 604.6679491924311
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -145.03396895421878 -42.33753106140079 604.4681483474218
+ vertex -158.19278799932138 -65.12927421512313 604.6679491924311
+ vertex -144.7927879993213 -41.919793393700374 604.6679491924311
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -144.7927879993213 -41.919793393700374 604.6679491924311
+ vertex -158.19278799932138 -65.12927421512313 604.6679491924311
+ vertex -158.39989478050794 -65.48799368273026 604.9857864376269
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -144.7927879993213 -41.919793393700374 604.6679491924311
+ vertex -158.39989478050794 -65.48799368273026 604.9857864376269
+ vertex -144.5856812181347 -41.561073926093236 604.9857864376269
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -144.5856812181347 -41.561073926093236 604.9857864376269
+ vertex -158.39989478050794 -65.48799368273026 604.9857864376269
+ vertex -158.55881340310586 -65.76324881133868 605.4
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -144.5856812181347 -41.561073926093236 604.9857864376269
+ vertex -158.55881340310586 -65.76324881133868 605.4
+ vertex -144.42676259553681 -41.28581879748483 605.4
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -144.42676259553681 -41.28581879748483 605.4
+ vertex -158.55881340310586 -65.76324881133868 605.4
+ vertex -158.65871382561045 -65.93628141881432 605.8823619097949
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -144.42676259553681 -41.28581879748483 605.4
+ vertex -158.65871382561045 -65.93628141881432 605.8823619097949
+ vertex -144.3268621730322 -41.11278619000924 605.8823619097949
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -144.3268621730322 -41.11278619000924 605.8823619097949
+ vertex -158.65871382561045 -65.93628141881432 605.8823619097949
+ vertex -158.6927879993214 -65.99529961890755 606.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -144.3268621730322 -41.11278619000924 605.8823619097949
+ vertex -158.6927879993214 -65.99529961890755 606.3999999999999
+ vertex -144.29278799932126 -41.053767989915976 606.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -144.29278799932126 -41.053767989915976 606.3999999999999
+ vertex -158.6927879993214 -65.99529961890755 606.3999999999999
+ vertex -158.6927879993214 -65.99529961890755 608.4
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -144.29278799932126 -41.053767989915976 606.3999999999999
+ vertex -158.6927879993214 -65.99529961890755 608.4
+ vertex -144.29278799932126 -41.053767989915976 608.4
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -144.29278799932126 -41.053767989915976 608.4
+ vertex -158.6927879993214 -65.99529961890755 608.4
+ vertex -158.65871382561045 -65.93628141881432 608.9176380902051
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -144.29278799932126 -41.053767989915976 608.4
+ vertex -158.65871382561045 -65.93628141881432 608.9176380902051
+ vertex -144.3268621730322 -41.11278619000924 608.9176380902051
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -144.3268621730322 -41.11278619000924 608.9176380902051
+ vertex -158.65871382561045 -65.93628141881432 608.9176380902051
+ vertex -158.55881340310586 -65.76324881133868 609.4
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -144.3268621730322 -41.11278619000924 608.9176380902051
+ vertex -158.55881340310586 -65.76324881133868 609.4
+ vertex -144.42676259553681 -41.28581879748483 609.4
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -144.42676259553681 -41.28581879748483 609.4
+ vertex -158.55881340310586 -65.76324881133868 609.4
+ vertex -158.39989478050796 -65.48799368273028 609.814213562373
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -144.42676259553681 -41.28581879748483 609.4
+ vertex -158.39989478050796 -65.48799368273028 609.814213562373
+ vertex -144.5856812181347 -41.561073926093236 609.814213562373
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -144.5856812181347 -41.561073926093236 609.814213562373
+ vertex -158.39989478050796 -65.48799368273028 609.814213562373
+ vertex -158.19278799932138 -65.12927421512315 610.1320508075687
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -144.5856812181347 -41.561073926093236 609.814213562373
+ vertex -158.19278799932138 -65.12927421512315 610.1320508075687
+ vertex -144.7927879993213 -41.919793393700374 610.1320508075687
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -144.7927879993213 -41.919793393700374 610.1320508075687
+ vertex -158.19278799932138 -65.12927421512315 610.1320508075687
+ vertex -157.9516070444239 -64.71153654742272 610.331851652578
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -144.7927879993213 -41.919793393700374 610.1320508075687
+ vertex -157.9516070444239 -64.71153654742272 610.331851652578
+ vertex -145.03396895421878 -42.33753106140079 610.331851652578
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -145.03396895421878 -42.33753106140079 610.331851652578
+ vertex -157.9516070444239 -64.71153654742272 610.331851652578
+ vertex -157.6927879993214 -64.26324881133867 610.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -145.03396895421878 -42.33753106140079 610.331851652578
+ vertex -157.6927879993214 -64.26324881133867 610.3999999999999
+ vertex -145.29278799932132 -42.78581879748479 610.3999999999999
+ endloop
+endfacet
+facet normal -0.19134171618256532 -0.33141357403566385 -0.9238795325112568
+ outer loop
+ vertex -158.19278799932138 -65.12927421512313 604.6679491924311
+ vertex -159.68365785199265 -63.7115365474229 604.4681483474218
+ vertex -157.9516070444239 -64.71153654742272 604.4681483474218
+ endloop
+endfacet
+facet normal -0.19134171618256532 -0.33141357403566385 -0.9238795325112568
+ outer loop
+ vertex -159.68365785199265 -63.7115365474229 604.4681483474218
+ vertex -158.19278799932138 -65.12927421512313 604.6679491924311
+ vertex -159.92483880689014 -64.12927421512332 604.6679491924311
+ endloop
+endfacet
+facet normal -0.49572243068686456 -0.8586164364012856 -0.1305261922200442
+ outer loop
+ vertex -158.65871382561045 -65.93628141881432 605.8823619097949
+ vertex -160.42483880689014 -64.99529961890775 606.3999999999999
+ vertex -160.3907646331792 -64.9362814188145 605.8823619097949
+ endloop
+endfacet
+facet normal -0.49572243068686456 -0.8586164364012856 -0.1305261922200442
+ outer loop
+ vertex -160.42483880689014 -64.99529961890775 606.3999999999999
+ vertex -158.65871382561045 -65.93628141881432 605.8823619097949
+ vertex -158.6927879993214 -65.99529961890755 606.3999999999999
+ endloop
+endfacet
+facet normal -0.30438071450432724 -0.5272028623656702 -0.7933533402912473
+ outer loop
+ vertex -158.39989478050794 -65.48799368273026 604.9857864376269
+ vertex -159.92483880689014 -64.12927421512332 604.6679491924311
+ vertex -158.19278799932138 -65.12927421512313 604.6679491924311
+ endloop
+endfacet
+facet normal -0.30438071450432724 -0.5272028623656702 -0.7933533402912473
+ outer loop
+ vertex -159.92483880689014 -64.12927421512332 604.6679491924311
+ vertex -158.39989478050794 -65.48799368273026 604.9857864376269
+ vertex -160.1319455880767 -64.48799368273046 604.9857864376269
+ endloop
+endfacet
+facet normal -0.49572243068686606 -0.858616436401288 0.13052619222002182
+ outer loop
+ vertex -160.42483880689014 -64.99529961890775 608.4
+ vertex -158.65871382561045 -65.93628141881432 608.9176380902051
+ vertex -160.3907646331792 -64.9362814188145 608.9176380902051
+ endloop
+endfacet
+facet normal -0.49572243068686606 -0.858616436401288 0.13052619222002182
+ outer loop
+ vertex -158.65871382561045 -65.93628141881432 608.9176380902051
+ vertex -160.42483880689014 -64.99529961890775 608.4
+ vertex -158.6927879993214 -65.99529961890755 608.4
+ endloop
+endfacet
+facet normal -0.4619397662555923 -0.8001031451912654 0.38268343236515195
+ outer loop
+ vertex -160.3907646331792 -64.9362814188145 608.9176380902051
+ vertex -158.55881340310586 -65.76324881133868 609.4
+ vertex -160.29086421067458 -64.76324881133888 609.4
+ endloop
+endfacet
+facet normal -0.4619397662555923 -0.8001031451912654 0.38268343236515195
+ outer loop
+ vertex -158.55881340310586 -65.76324881133868 609.4
+ vertex -160.3907646331792 -64.9362814188145 608.9176380902051
+ vertex -158.65871382561045 -65.93628141881432 608.9176380902051
+ endloop
+endfacet
+facet normal -0.4264730821792865 -0.9045002543816665 -3.151450949117089e-16
+ outer loop
+ vertex -164.0346787143162 -120.8232289819003 597.4
+ vertex -165.49228244115207 -120.13596687117304 617.4
+ vertex -165.49228244115207 -120.13596687117304 597.4
+ endloop
+endfacet
+facet normal -0.4264730821792865 -0.9045002543816665 -3.151450949117089e-16
+ outer loop
+ vertex -165.49228244115207 -120.13596687117304 617.4
+ vertex -164.0346787143162 -120.8232289819003 597.4
+ vertex -164.0346787143162 -120.8232289819003 617.4
+ endloop
+endfacet
+facet normal -0.19134171618255869 -0.3314135740356523 0.9238795325112623
+ outer loop
+ vertex -159.68365785199265 -63.7115365474229 610.331851652578
+ vertex -158.19278799932138 -65.12927421512315 610.1320508075687
+ vertex -157.9516070444239 -64.71153654742272 610.331851652578
+ endloop
+endfacet
+facet normal -0.19134171618255869 -0.3314135740356523 0.9238795325112623
+ outer loop
+ vertex -158.19278799932138 -65.12927421512315 610.1320508075687
+ vertex -159.68365785199265 -63.7115365474229 610.331851652578
+ vertex -159.92483880689014 -64.12927421512333 610.1320508075687
+ endloop
+endfacet
+facet normal -0.46193976625560484 -0.8001031451912874 -0.3826834323650907
+ outer loop
+ vertex -158.55881340310586 -65.76324881133868 605.4
+ vertex -160.3907646331792 -64.9362814188145 605.8823619097949
+ vertex -160.29086421067458 -64.76324881133888 605.4
+ endloop
+endfacet
+facet normal -0.46193976625560484 -0.8001031451912874 -0.3826834323650907
+ outer loop
+ vertex -160.3907646331792 -64.9362814188145 605.8823619097949
+ vertex -158.55881340310586 -65.76324881133868 605.4
+ vertex -158.65871382561045 -65.93628141881432 605.8823619097949
+ endloop
+endfacet
+facet normal -0.06526309610998657 -0.11303899832175998 0.9914448613738195
+ outer loop
+ vertex -159.42483880689014 -63.26324881133887 610.3999999999999
+ vertex -157.9516070444239 -64.71153654742272 610.331851652578
+ vertex -157.6927879993214 -64.26324881133867 610.3999999999999
+ endloop
+endfacet
+facet normal -0.06526309610998657 -0.11303899832175998 0.9914448613738195
+ outer loop
+ vertex -157.9516070444239 -64.71153654742272 610.331851652578
+ vertex -159.42483880689014 -63.26324881133887 610.3999999999999
+ vertex -159.68365785199265 -63.7115365474229 610.331851652578
+ endloop
+endfacet
+facet normal -0.7838084275862288 -0.6210026963265165 -2.617941281554303e-16
+ outer loop
+ vertex -178.02580279487614 -110.19230341949638 597.4
+ vertex -179.02654971579267 -108.92919478062035 617.4
+ vertex -179.02654971579267 -108.92919478062035 597.4
+ endloop
+endfacet
+facet normal -0.7838084275862288 -0.6210026963265165 -2.617941281554303e-16
+ outer loop
+ vertex -179.02654971579267 -108.92919478062035 617.4
+ vertex -178.02580279487614 -110.19230341949638 597.4
+ vertex -178.02580279487614 -110.19230341949638 617.4
+ endloop
+endfacet
+facet normal -0.3966766701455666 -0.6870641468694378 -0.608761429008768
+ outer loop
+ vertex -158.39989478050794 -65.48799368273026 604.9857864376269
+ vertex -160.29086421067458 -64.76324881133888 605.4
+ vertex -160.1319455880767 -64.48799368273046 604.9857864376269
+ endloop
+endfacet
+facet normal -0.3966766701455666 -0.6870641468694378 -0.608761429008768
+ outer loop
+ vertex -160.29086421067458 -64.76324881133888 605.4
+ vertex -158.39989478050794 -65.48799368273026 604.9857864376269
+ vertex -158.55881340310586 -65.76324881133868 605.4
+ endloop
+endfacet
+facet normal -0.4999999999999586 -0.8660254037844628 1.5259013723954678e-31
+ outer loop
+ vertex -158.6927879993214 -65.99529961890755 606.3999999999999
+ vertex -160.42483880689014 -64.99529961890775 608.4
+ vertex -160.42483880689014 -64.99529961890775 606.3999999999999
+ endloop
+endfacet
+facet normal -0.4999999999999586 -0.8660254037844628 1.5259013723954678e-31
+ outer loop
+ vertex -160.42483880689014 -64.99529961890775 608.4
+ vertex -158.6927879993214 -65.99529961890755 606.3999999999999
+ vertex -158.6927879993214 -65.99529961890755 608.4
+ endloop
+endfacet
+facet normal -0.3966766701455756 -0.6870641468694534 0.6087614290087444
+ outer loop
+ vertex -160.29086421067458 -64.76324881133888 609.4
+ vertex -158.39989478050796 -65.48799368273028 609.814213562373
+ vertex -160.1319455880767 -64.48799368273048 609.814213562373
+ endloop
+endfacet
+facet normal -0.3966766701455756 -0.6870641468694534 0.6087614290087444
+ outer loop
+ vertex -158.39989478050796 -65.48799368273028 609.814213562373
+ vertex -160.29086421067458 -64.76324881133888 609.4
+ vertex -158.55881340310586 -65.76324881133868 609.4
+ endloop
+endfacet
+facet normal -0.3043807145043269 -0.5272028623656697 0.7933533402912477
+ outer loop
+ vertex -159.92483880689014 -64.12927421512333 610.1320508075687
+ vertex -158.39989478050796 -65.48799368273028 609.814213562373
+ vertex -158.19278799932138 -65.12927421512315 610.1320508075687
+ endloop
+endfacet
+facet normal -0.3043807145043269 -0.5272028623656697 0.7933533402912477
+ outer loop
+ vertex -158.39989478050796 -65.48799368273028 609.814213562373
+ vertex -159.92483880689014 -64.12927421512333 610.1320508075687
+ vertex -160.1319455880767 -64.48799368273048 609.814213562373
+ endloop
+endfacet
+facet normal 0.19134171618258172 0.331413574035647 -0.9238795325112594
+ outer loop
+ vertex -145.03396895421878 -42.33753106140079 604.4681483474218
+ vertex -146.52483880689016 -40.91979339370037 604.6679491924311
+ vertex -144.7927879993213 -41.919793393700374 604.6679491924311
+ endloop
+endfacet
+facet normal 0.19134171618258172 0.331413574035647 -0.9238795325112594
+ outer loop
+ vertex -146.52483880689016 -40.91979339370037 604.6679491924311
+ vertex -145.03396895421878 -42.33753106140079 604.4681483474218
+ vertex -146.76601976178762 -41.337531061400774 604.4681483474218
+ endloop
+endfacet
+facet normal 0.06526309610999624 0.11303899832176201 -0.9914448613738184
+ outer loop
+ vertex -145.29278799932132 -42.78581879748479 604.4
+ vertex -146.76601976178762 -41.337531061400774 604.4681483474218
+ vertex -145.03396895421878 -42.33753106140079 604.4681483474218
+ endloop
+endfacet
+facet normal 0.06526309610999624 0.11303899832176201 -0.9914448613738184
+ outer loop
+ vertex -146.76601976178762 -41.337531061400774 604.4681483474218
+ vertex -145.29278799932132 -42.78581879748479 604.4
+ vertex -147.02483880689016 -41.785818797484794 604.4
+ endloop
+endfacet
+facet normal -0.0652630961099866 -0.11303899832176004 -0.9914448613738195
+ outer loop
+ vertex -157.9516070444239 -64.71153654742272 604.4681483474218
+ vertex -159.42483880689014 -63.26324881133887 604.4
+ vertex -157.6927879993214 -64.26324881133867 604.4
+ endloop
+endfacet
+facet normal -0.0652630961099866 -0.11303899832176004 -0.9914448613738195
+ outer loop
+ vertex -159.42483880689014 -63.26324881133887 604.4
+ vertex -157.9516070444239 -64.71153654742272 604.4681483474218
+ vertex -159.68365785199265 -63.7115365474229 604.4681483474218
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -157.6927879993214 -64.26324881133867 604.4
+ vertex -147.02483880689016 -41.785818797484794 604.4
+ vertex -145.29278799932132 -42.78581879748479 604.4
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -147.02483880689016 -41.785818797484794 604.4
+ vertex -157.6927879993214 -64.26324881133867 604.4
+ vertex -159.42483880689014 -63.26324881133887 604.4
+ endloop
+endfacet
+facet normal 0.5000000000000197 0.8660254037844273 -1.5259013723954536e-31
+ outer loop
+ vertex -144.29278799932126 -41.053767989915976 608.4
+ vertex -146.02483880689016 -40.05376798991592 606.3999999999999
+ vertex -146.02483880689016 -40.05376798991592 608.4
+ endloop
+endfacet
+facet normal 0.5000000000000197 0.8660254037844273 -1.5259013723954536e-31
+ outer loop
+ vertex -146.02483880689016 -40.05376798991592 606.3999999999999
+ vertex -144.29278799932126 -41.053767989915976 608.4
+ vertex -144.29278799932126 -41.053767989915976 606.3999999999999
+ endloop
+endfacet
+facet normal 0.461939766255668 0.8001031451912717 -0.3826834323650471
+ outer loop
+ vertex -144.3268621730322 -41.11278619000924 605.8823619097949
+ vertex -146.15881340310568 -40.285818797484794 605.4
+ vertex -146.05891298060106 -40.11278619000919 605.8823619097949
+ endloop
+endfacet
+facet normal 0.461939766255668 0.8001031451912717 -0.3826834323650471
+ outer loop
+ vertex -146.15881340310568 -40.285818797484794 605.4
+ vertex -144.3268621730322 -41.11278619000924 605.8823619097949
+ vertex -144.42676259553681 -41.28581879748483 605.4
+ endloop
+endfacet
+facet normal 0.39667667014561536 0.6870641468694197 -0.6087614290087563
+ outer loop
+ vertex -144.42676259553681 -41.28581879748483 605.4
+ vertex -146.3177320257036 -40.5610739260932 604.9857864376269
+ vertex -146.15881340310568 -40.285818797484794 605.4
+ endloop
+endfacet
+facet normal 0.39667667014561536 0.6870641468694197 -0.6087614290087563
+ outer loop
+ vertex -146.3177320257036 -40.5610739260932 604.9857864376269
+ vertex -144.42676259553681 -41.28581879748483 605.4
+ vertex -144.5856812181347 -41.561073926093236 604.9857864376269
+ endloop
+endfacet
+facet normal 0.4957224306869252 0.8586164364012507 0.13052619222004302
+ outer loop
+ vertex -146.05891298060106 -40.11278619000919 608.9176380902051
+ vertex -144.29278799932126 -41.053767989915976 608.4
+ vertex -146.02483880689016 -40.05376798991592 608.4
+ endloop
+endfacet
+facet normal 0.4957224306869252 0.8586164364012507 0.13052619222004302
+ outer loop
+ vertex -144.29278799932126 -41.053767989915976 608.4
+ vertex -146.05891298060106 -40.11278619000919 608.9176380902051
+ vertex -144.3268621730322 -41.11278619000924 608.9176380902051
+ endloop
+endfacet
+facet normal 0.30438071450435705 0.5272028623656463 -0.7933533402912516
+ outer loop
+ vertex -144.7927879993213 -41.919793393700374 604.6679491924311
+ vertex -146.3177320257036 -40.5610739260932 604.9857864376269
+ vertex -144.5856812181347 -41.561073926093236 604.9857864376269
+ endloop
+endfacet
+facet normal 0.30438071450435705 0.5272028623656463 -0.7933533402912516
+ outer loop
+ vertex -146.3177320257036 -40.5610739260932 604.9857864376269
+ vertex -144.7927879993213 -41.919793393700374 604.6679491924311
+ vertex -146.52483880689016 -40.91979339370037 604.6679491924311
+ endloop
+endfacet
+facet normal 0.4957224306869231 0.8586164364012471 -0.1305261922200746
+ outer loop
+ vertex -144.29278799932126 -41.053767989915976 606.3999999999999
+ vertex -146.05891298060106 -40.11278619000919 605.8823619097949
+ vertex -146.02483880689016 -40.05376798991592 606.3999999999999
+ endloop
+endfacet
+facet normal 0.4957224306869231 0.8586164364012471 -0.1305261922200746
+ outer loop
+ vertex -146.05891298060106 -40.11278619000919 605.8823619097949
+ vertex -144.29278799932126 -41.053767989915976 606.3999999999999
+ vertex -144.3268621730322 -41.11278619000924 605.8823619097949
+ endloop
+endfacet
+facet normal 0.4619397662556538 0.800103145191247 0.3826834323651163
+ outer loop
+ vertex -146.15881340310568 -40.285818797484794 609.4
+ vertex -144.3268621730322 -41.11278619000924 608.9176380902051
+ vertex -146.05891298060106 -40.11278619000919 608.9176380902051
+ endloop
+endfacet
+facet normal 0.4619397662556538 0.800103145191247 0.3826834323651163
+ outer loop
+ vertex -144.3268621730322 -41.11278619000924 608.9176380902051
+ vertex -146.15881340310568 -40.285818797484794 609.4
+ vertex -144.42676259553681 -41.28581879748483 609.4
+ endloop
+endfacet
+facet normal 0.06526309610999628 0.11303899832176209 0.9914448613738184
+ outer loop
+ vertex -146.76601976178762 -41.337531061400774 610.331851652578
+ vertex -145.29278799932132 -42.78581879748479 610.3999999999999
+ vertex -145.03396895421878 -42.33753106140079 610.331851652578
+ endloop
+endfacet
+facet normal 0.06526309610999628 0.11303899832176209 0.9914448613738184
+ outer loop
+ vertex -145.29278799932132 -42.78581879748479 610.3999999999999
+ vertex -146.76601976178762 -41.337531061400774 610.331851652578
+ vertex -147.02483880689016 -41.785818797484794 610.3999999999999
+ endloop
+endfacet
+facet normal 0.19134171618258172 0.331413574035647 0.9238795325112594
+ outer loop
+ vertex -146.52483880689016 -40.91979339370037 610.1320508075687
+ vertex -145.03396895421878 -42.33753106140079 610.331851652578
+ vertex -144.7927879993213 -41.919793393700374 610.1320508075687
+ endloop
+endfacet
+facet normal 0.19134171618258172 0.331413574035647 0.9238795325112594
+ outer loop
+ vertex -145.03396895421878 -42.33753106140079 610.331851652578
+ vertex -146.52483880689016 -40.91979339370037 610.1320508075687
+ vertex -146.76601976178762 -41.337531061400774 610.331851652578
+ endloop
+endfacet
+facet normal 0.30438071450435705 0.5272028623656463 0.7933533402912516
+ outer loop
+ vertex -146.3177320257036 -40.5610739260932 609.814213562373
+ vertex -144.7927879993213 -41.919793393700374 610.1320508075687
+ vertex -144.5856812181347 -41.561073926093236 609.814213562373
+ endloop
+endfacet
+facet normal 0.30438071450435705 0.5272028623656463 0.7933533402912516
+ outer loop
+ vertex -144.7927879993213 -41.919793393700374 610.1320508075687
+ vertex -146.3177320257036 -40.5610739260932 609.814213562373
+ vertex -146.52483880689016 -40.91979339370037 610.1320508075687
+ endloop
+endfacet
+facet normal 5.933957380480184e-32 1.4193619471206742e-31 1.0
+ outer loop
+ vertex -147.02483880689016 -41.785818797484794 610.3999999999999
+ vertex -157.6927879993214 -64.26324881133867 610.3999999999999
+ vertex -145.29278799932132 -42.78581879748479 610.3999999999999
+ endloop
+endfacet
+facet normal 5.933957380480184e-32 1.4193619471206742e-31 1.0
+ outer loop
+ vertex -157.6927879993214 -64.26324881133867 610.3999999999999
+ vertex -147.02483880689016 -41.785818797484794 610.3999999999999
+ vertex -159.42483880689014 -63.26324881133887 610.3999999999999
+ endloop
+endfacet
+facet normal 0.3966766701456155 0.6870641468694199 0.6087614290087562
+ outer loop
+ vertex -146.3177320257036 -40.5610739260932 609.814213562373
+ vertex -144.42676259553681 -41.28581879748483 609.4
+ vertex -146.15881340310568 -40.285818797484794 609.4
+ endloop
+endfacet
+facet normal 0.3966766701456155 0.6870641468694199 0.6087614290087562
+ outer loop
+ vertex -144.42676259553681 -41.28581879748483 609.4
+ vertex -146.3177320257036 -40.5610739260932 609.814213562373
+ vertex -144.5856812181347 -41.561073926093236 609.814213562373
+ endloop
+endfacet
+facet normal -0.5711695004343966 -0.8208321398273353 -3.0302967770913997e-16
+ outer loop
+ vertex -169.67504648826252 -117.71735841031698 597.4
+ vertex -170.99781890355266 -116.79691777090856 617.4
+ vertex -170.99781890355266 -116.79691777090856 597.4
+ endloop
+endfacet
+facet normal -0.5711695004343966 -0.8208321398273353 -3.0302967770913997e-16
+ outer loop
+ vertex -170.99781890355266 -116.79691777090856 617.4
+ vertex -169.67504648826252 -117.71735841031698 597.4
+ vertex -169.67504648826252 -117.71735841031698 617.4
+ endloop
+endfacet
+facet normal -0.6049992586789363 -0.7962260338609493 -2.986595129490501e-16
+ outer loop
+ vertex -170.99781890355266 -116.79691777090856 597.4
+ vertex -172.28093853645186 -115.8219604174845 617.4
+ vertex -172.28093853645186 -115.8219604174845 597.4
+ endloop
+endfacet
+facet normal -0.6049992586789363 -0.7962260338609493 -2.986595129490501e-16
+ outer loop
+ vertex -172.28093853645186 -115.8219604174845 617.4
+ vertex -170.99781890355266 -116.79691777090856 597.4
+ vertex -170.99781890355266 -116.79691777090856 617.4
+ endloop
+endfacet
+facet normal -0.7291677277631985 -0.6843350237921877 -2.760426732024953e-16
+ outer loop
+ vertex -175.8702976548973 -112.58750790128379 597.4
+ vertex -176.9731047312377 -111.4124528448287 617.4
+ vertex -176.9731047312377 -111.4124528448287 597.4
+ endloop
+endfacet
+facet normal -0.7291677277631985 -0.6843350237921877 -2.760426732024953e-16
+ outer loop
+ vertex -176.9731047312377 -111.4124528448287 617.4
+ vertex -175.8702976548973 -112.58750790128379 597.4
+ vertex -175.8702976548973 -112.58750790128379 617.4
+ endloop
+endfacet
+facet normal -0.536340245259425 -0.8440018609665858 -3.06869566898727e-16
+ outer loop
+ vertex -168.31493602721872 -118.58167164467494 597.4
+ vertex -169.67504648826252 -117.71735841031698 617.4
+ vertex -169.67504648826252 -117.71735841031698 597.4
+ endloop
+endfacet
+facet normal -0.536340245259425 -0.8440018609665858 -3.06869566898727e-16
+ outer loop
+ vertex -169.67504648826252 -117.71735841031698 617.4
+ vertex -168.31493602721872 -118.58167164467494 597.4
+ vertex -168.31493602721872 -118.58167164467494 617.4
+ endloop
+endfacet
+facet normal -0.30989713538576086 -0.9507700907578549 -3.1846312298286416e-16
+ outer loop
+ vertex -159.5074986797672 -122.51137082887453 597.4
+ vertex -161.03966632807825 -122.01197105835392 617.4
+ vertex -161.03966632807825 -122.01197105835392 597.4
+ endloop
+endfacet
+facet normal -0.30989713538576086 -0.9507700907578549 -3.1846312298286416e-16
+ outer loop
+ vertex -161.03966632807825 -122.01197105835392 617.4
+ vertex -159.5074986797672 -122.51137082887453 597.4
+ vertex -159.5074986797672 -122.51137082887453 617.4
+ endloop
+endfacet
+facet normal -0.9659258262890695 0.2588190451025158 -1.047433653618773e-17
+ outer loop
+ vertex -121.3011598162272 -97.75284783852477 597.4
+ vertex -121.11730055134134 -97.06667572052851 617.4
+ vertex -121.11730055134134 -97.06667572052851 597.4
+ endloop
+endfacet
+facet normal -0.9659258262890695 0.2588190451025158 -1.047433653618773e-17
+ outer loop
+ vertex -121.11730055134134 -97.06667572052851 617.4
+ vertex -121.3011598162272 -97.75284783852477 597.4
+ vertex -121.3011598162272 -97.75284783852477 617.4
+ endloop
+endfacet
+facet normal -0.699908923976171 -0.7142321038279633 -2.8244839711310877e-16
+ outer loop
+ vertex -174.7193113822874 -113.71541234474994 597.4
+ vertex -175.8702976548973 -112.58750790128379 617.4
+ vertex -175.8702976548973 -112.58750790128379 597.4
+ endloop
+endfacet
+facet normal -0.699908923976171 -0.7142321038279633 -2.8244839711310877e-16
+ outer loop
+ vertex -175.8702976548973 -112.58750790128379 617.4
+ vertex -174.7193113822874 -113.71541234474994 597.4
+ vertex -174.7193113822874 -113.71541234474994 617.4
+ endloop
+endfacet
+facet normal -0.34938986583037857 -0.9369774392454868 -3.179127878275188e-16
+ outer loop
+ vertex -161.03966632807825 -122.01197105835392 597.4
+ vertex -162.54960709458362 -121.44892868430706 617.4
+ vertex -162.54960709458362 -121.44892868430706 597.4
+ endloop
+endfacet
+facet normal -0.34938986583037857 -0.9369774392454868 -3.179127878275188e-16
+ outer loop
+ vertex -162.54960709458362 -121.44892868430706 617.4
+ vertex -161.03966632807825 -122.01197105835392 597.4
+ vertex -161.03966632807825 -122.01197105835392 617.4
+ endloop
+endfacet
+facet normal -0.9063077870366506 -0.42261826174069833 -2.1265981455630452e-16
+ outer loop
+ vertex -121.3011598162272 -94.96515470653598 597.4
+ vertex -121.6013783836058 -94.32133391112707 617.4
+ vertex -121.6013783836058 -94.32133391112707 597.4
+ endloop
+endfacet
+facet normal -0.9063077870366506 -0.42261826174069833 -2.1265981455630452e-16
+ outer loop
+ vertex -121.6013783836058 -94.32133391112707 617.4
+ vertex -121.3011598162272 -94.96515470653598 597.4
+ vertex -121.3011598162272 -94.965154706536 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -165.44278799932133 -77.68664256999766 597.4
+ vertex -157.9516070444239 -64.71153654742272 604.4681483474218
+ vertex -137.79748853770056 -29.803579312014033 597.4
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -157.9516070444239 -64.71153654742272 604.4681483474218
+ vertex -165.44278799932133 -77.68664256999766 597.4
+ vertex -158.19278799932138 -65.12927421512313 604.6679491924311
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -158.19278799932138 -65.12927421512313 604.6679491924311
+ vertex -165.44278799932133 -77.68664256999766 597.4
+ vertex -158.39989478050794 -65.48799368273026 604.9857864376269
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -158.39989478050794 -65.48799368273026 604.9857864376269
+ vertex -165.44278799932133 -77.68664256999766 597.4
+ vertex -165.44278799932133 -77.68664256999766 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -137.79748853770056 -29.803579312014033 597.4
+ vertex -157.9516070444239 -64.71153654742272 604.4681483474218
+ vertex -157.6927879993214 -64.26324881133867 604.4
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -158.39989478050794 -65.48799368273026 604.9857864376269
+ vertex -165.44278799932133 -77.68664256999766 617.4
+ vertex -158.55881340310586 -65.76324881133868 605.4
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -158.55881340310586 -65.76324881133868 605.4
+ vertex -165.44278799932133 -77.68664256999766 617.4
+ vertex -158.65871382561045 -65.93628141881432 605.8823619097949
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -158.65871382561045 -65.93628141881432 605.8823619097949
+ vertex -165.44278799932133 -77.68664256999766 617.4
+ vertex -158.6927879993214 -65.99529961890755 606.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -158.6927879993214 -65.99529961890755 606.3999999999999
+ vertex -165.44278799932133 -77.68664256999766 617.4
+ vertex -158.6927879993214 -65.99529961890755 608.4
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -158.6927879993214 -65.99529961890755 608.4
+ vertex -165.44278799932133 -77.68664256999766 617.4
+ vertex -158.65871382561045 -65.93628141881432 608.9176380902051
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -158.65871382561045 -65.93628141881432 608.9176380902051
+ vertex -165.44278799932133 -77.68664256999766 617.4
+ vertex -158.55881340310586 -65.76324881133868 609.4
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -158.55881340310586 -65.76324881133868 609.4
+ vertex -165.44278799932133 -77.68664256999766 617.4
+ vertex -158.39989478050796 -65.48799368273028 609.814213562373
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -158.39989478050796 -65.48799368273028 609.814213562373
+ vertex -165.44278799932133 -77.68664256999766 617.4
+ vertex -158.19278799932138 -65.12927421512315 610.1320508075687
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -158.19278799932138 -65.12927421512315 610.1320508075687
+ vertex -165.44278799932133 -77.68664256999766 617.4
+ vertex -157.9516070444239 -64.71153654742272 610.331851652578
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -157.9516070444239 -64.71153654742272 610.331851652578
+ vertex -165.44278799932133 -77.68664256999766 617.4
+ vertex -157.6927879993214 -64.26324881133867 610.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -157.6927879993214 -64.26324881133867 610.3999999999999
+ vertex -165.44278799932133 -77.68664256999766 617.4
+ vertex -145.29278799932132 -42.78581879748479 610.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -137.79748853770056 -29.803579312014033 597.4
+ vertex -144.5856812181347 -41.561073926093236 604.9857864376269
+ vertex -137.79748853770056 -29.80357931201404 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -144.5856812181347 -41.561073926093236 604.9857864376269
+ vertex -137.79748853770056 -29.803579312014033 597.4
+ vertex -144.7927879993213 -41.919793393700374 604.6679491924311
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -144.7927879993213 -41.919793393700374 604.6679491924311
+ vertex -137.79748853770056 -29.803579312014033 597.4
+ vertex -145.03396895421878 -42.33753106140079 604.4681483474218
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -145.03396895421878 -42.33753106140079 604.4681483474218
+ vertex -137.79748853770056 -29.803579312014033 597.4
+ vertex -145.29278799932132 -42.78581879748479 604.4
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -145.29278799932132 -42.78581879748479 604.4
+ vertex -137.79748853770056 -29.803579312014033 597.4
+ vertex -157.6927879993214 -64.26324881133867 604.4
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -137.79748853770056 -29.80357931201404 617.4
+ vertex -144.5856812181347 -41.561073926093236 604.9857864376269
+ vertex -144.42676259553681 -41.28581879748483 605.4
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -137.79748853770056 -29.80357931201404 617.4
+ vertex -144.42676259553681 -41.28581879748483 605.4
+ vertex -144.3268621730322 -41.11278619000924 605.8823619097949
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -137.79748853770056 -29.80357931201404 617.4
+ vertex -144.3268621730322 -41.11278619000924 605.8823619097949
+ vertex -144.29278799932126 -41.053767989915976 606.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -137.79748853770056 -29.80357931201404 617.4
+ vertex -144.29278799932126 -41.053767989915976 606.3999999999999
+ vertex -144.29278799932126 -41.053767989915976 608.4
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -137.79748853770056 -29.80357931201404 617.4
+ vertex -144.29278799932126 -41.053767989915976 608.4
+ vertex -144.3268621730322 -41.11278619000924 608.9176380902051
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -137.79748853770056 -29.80357931201404 617.4
+ vertex -144.3268621730322 -41.11278619000924 608.9176380902051
+ vertex -144.42676259553681 -41.28581879748483 609.4
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -137.79748853770056 -29.80357931201404 617.4
+ vertex -144.42676259553681 -41.28581879748483 609.4
+ vertex -144.5856812181347 -41.561073926093236 609.814213562373
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -137.79748853770056 -29.80357931201404 617.4
+ vertex -144.5856812181347 -41.561073926093236 609.814213562373
+ vertex -144.7927879993213 -41.919793393700374 610.1320508075687
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -137.79748853770056 -29.80357931201404 617.4
+ vertex -144.7927879993213 -41.919793393700374 610.1320508075687
+ vertex -145.03396895421878 -42.33753106140079 610.331851652578
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -137.79748853770056 -29.80357931201404 617.4
+ vertex -145.03396895421878 -42.33753106140079 610.331851652578
+ vertex -145.29278799932132 -42.78581879748479 610.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 7.227945163972772e-17
+ outer loop
+ vertex -137.79748853770056 -29.80357931201404 617.4
+ vertex -145.29278799932132 -42.78581879748479 610.3999999999999
+ vertex -165.44278799932133 -77.68664256999766 617.4
+ endloop
+endfacet
+facet normal 0.5829334262945255 0.8125199200687483 3.015844579888884e-16
+ outer loop
+ vertex -135.82629141839357 -29.354089569230858 617.4
+ vertex -136.2201382685109 -29.07152850444516 597.4
+ vertex -136.2201382685109 -29.07152850444516 617.4
+ endloop
+endfacet
+facet normal 0.5829334262945255 0.8125199200687483 3.015844579888884e-16
+ outer loop
+ vertex -136.2201382685109 -29.07152850444516 597.4
+ vertex -135.82629141839357 -29.354089569230858 617.4
+ vertex -135.82629141839357 -29.35408956923085 597.4
+ endloop
+endfacet
+facet normal -0.9572353791850615 -0.28931026396661363 -1.7673928161385297e-16
+ outer loop
+ vertex -184.97256682717622 -97.55697806144181 597.4
+ vertex -185.43879081874147 -96.01439158963024 617.4
+ vertex -185.43879081874147 -96.01439158963024 597.4
+ endloop
+endfacet
+facet normal -0.9572353791850615 -0.28931026396661363 -1.7673928161385297e-16
+ outer loop
+ vertex -185.43879081874147 -96.01439158963024 617.4
+ vertex -184.97256682717622 -97.55697806144181 597.4
+ vertex -184.97256682717622 -97.55697806144181 617.4
+ endloop
+endfacet
+facet normal -0.9922171154055797 0.12451986145282407 -5.3840833328123333e-17
+ outer loop
+ vertex -186.65332502274782 -81.64658437726645 597.4
+ vertex -186.45266105030615 -80.04762477693534 617.4
+ vertex -186.45266105030615 -80.04762477693534 597.4
+ endloop
+endfacet
+facet normal -0.9922171154055797 0.12451986145282407 -5.3840833328123333e-17
+ outer loop
+ vertex -186.45266105030615 -80.04762477693534 617.4
+ vertex -186.65332502274782 -81.64658437726645 597.4
+ vertex -186.65332502274782 -81.64658437726645 617.4
+ endloop
+endfacet
+facet normal -0.8962637115698704 0.4435215432456468 5.2267432081861673e-17
+ outer loop
+ vertex -183.21473573526944 -69.28298715360742 617.4
+ vertex -182.50000000000009 -67.83865662978125 597.4
+ vertex -183.21473573526944 -69.28298715360742 597.4
+ endloop
+endfacet
+facet normal -0.8962637115698704 0.4435215432456468 5.2267432081861673e-17
+ outer loop
+ vertex -182.50000000000009 -67.83865662978125 597.4
+ vertex -183.21473573526944 -69.28298715360742 617.4
+ vertex -182.50000000000009 -67.83865662978125 617.4
+ endloop
+endfacet
+facet normal -0.9861411980746706 0.16590821998880342 -4.066361857341852e-17
+ outer loop
+ vertex -186.45266105030615 -80.04762477693534 597.4
+ vertex -186.18529966638516 -78.45845652790855 617.4
+ vertex -186.18529966638516 -78.45845652790855 597.4
+ endloop
+endfacet
+facet normal -0.9861411980746706 0.16590821998880342 -4.066361857341852e-17
+ outer loop
+ vertex -186.18529966638516 -78.45845652790855 617.4
+ vertex -186.45266105030615 -80.04762477693534 597.4
+ vertex -186.45266105030615 -80.04762477693534 617.4
+ endloop
+endfacet
+facet normal 0.8660254037844396 0.49999999999999845 2.3251894735637774e-16
+ outer loop
+ vertex -93.55470053837935 -102.43433599533701 617.4
+ vertex -94.7094010767586 -100.43433599533701 597.4
+ vertex -94.7094010767586 -100.43433599533701 617.4
+ endloop
+endfacet
+facet normal 0.8660254037844396 0.49999999999999845 2.3251894735637774e-16
+ outer loop
+ vertex -94.7094010767586 -100.43433599533701 597.4
+ vertex -93.55470053837935 -102.43433599533701 617.4
+ vertex -93.55470053837934 -102.43433599533701 597.4
+ endloop
+endfacet
+facet normal -0.9780650504691567 -0.20829968087053335 -1.5397442837550508e-16
+ outer loop
+ vertex -185.84009158351952 -94.45365601640985 597.4
+ vertex -186.17576688008776 -92.87750249323994 617.4
+ vertex -186.17576688008776 -92.87750249323994 597.4
+ endloop
+endfacet
+facet normal -0.9780650504691567 -0.20829968087053335 -1.5397442837550508e-16
+ outer loop
+ vertex -186.17576688008776 -92.87750249323994 617.4
+ vertex -185.84009158351952 -94.45365601640985 597.4
+ vertex -185.84009158351952 -94.45365601640985 617.4
+ endloop
+endfacet
+facet normal 0.41219617871316855 -0.9110951159205398 -2.3956628513972264e-16
+ outer loop
+ vertex -93.7094010767586 -104.16638680290588 617.4
+ vertex -94.15102956204207 -104.36618764791513 597.4
+ vertex -93.7094010767586 -104.16638680290588 597.4
+ endloop
+endfacet
+facet normal 0.41219617871316855 -0.9110951159205398 -2.3956628513972264e-16
+ outer loop
+ vertex -94.15102956204207 -104.36618764791513 597.4
+ vertex -93.7094010767586 -104.16638680290588 617.4
+ vertex -94.15102956204208 -104.36618764791513 617.4
+ endloop
+endfacet
+facet normal -0.944298071640538 -0.3290914035582841 -1.87667623113442e-16
+ outer loop
+ vertex -184.44223546024463 -99.07871603973358 597.4
+ vertex -184.97256682717622 -97.55697806144181 617.4
+ vertex -184.97256682717622 -97.55697806144181 597.4
+ endloop
+endfacet
+facet normal -0.944298071640538 -0.3290914035582841 -1.87667623113442e-16
+ outer loop
+ vertex -184.97256682717622 -97.55697806144181 617.4
+ vertex -184.44223546024463 -99.07871603973358 597.4
+ vertex -184.44223546024463 -99.07871603973358 617.4
+ endloop
+endfacet
+facet normal -0.9134916689428522 -0.4068574329811398 -2.0852055110422157e-16
+ outer loop
+ vertex -183.19307329363312 -102.0490360224217 597.4
+ vertex -183.84872475169666 -100.57694261544432 617.4
+ vertex -183.84872475169666 -100.57694261544432 597.4
+ endloop
+endfacet
+facet normal -0.9134916689428522 -0.4068574329811398 -2.0852055110422157e-16
+ outer loop
+ vertex -183.84872475169666 -100.57694261544432 617.4
+ vertex -183.19307329363312 -102.0490360224217 597.4
+ vertex -183.19307329363312 -102.0490360224217 617.4
+ endloop
+endfacet
+facet normal -0.9576170825074752 0.2880443078588285 -7.978454901592452e-19
+ outer loop
+ vertex -185.45247199669834 -75.32059570808379 617.4
+ vertex -184.98828809559384 -73.77739412070689 597.4
+ vertex -185.45247199669834 -75.32059570808379 597.4
+ endloop
+endfacet
+facet normal -0.9576170825074752 0.2880443078588285 -7.978454901592452e-19
+ outer loop
+ vertex -184.98828809559384 -73.77739412070689 597.4
+ vertex -185.45247199669834 -75.32059570808379 617.4
+ vertex -184.98828809559384 -73.77739412070689 617.4
+ endloop
+endfacet
+facet normal 0.5000000000000007 0.8660254037844383 7.469397001332232e-32
+ outer loop
+ vertex -179.89715088236125 -69.34141226851004 617.4
+ vertex -182.50000000000009 -67.83865662978125 597.4
+ vertex -182.50000000000009 -67.83865662978125 617.4
+ endloop
+endfacet
+facet normal 0.5000000000000007 0.8660254037844383 7.469397001332232e-32
+ outer loop
+ vertex -182.50000000000009 -67.83865662978125 597.4
+ vertex -179.89715088236125 -69.34141226851004 617.4
+ vertex -179.89715088236125 -69.34141226851004 597.4
+ endloop
+endfacet
+facet normal 0.5000000000000007 0.8660254037844383 7.469397001332232e-32
+ outer loop
+ vertex -179.89715088236125 -69.34141226851004 597.4
+ vertex -179.89715088236125 -69.34141226851004 617.4
+ vertex -165.44278799932133 -77.68664256999766 617.4
+ endloop
+endfacet
+facet normal 0.5000000000000007 0.8660254037844383 7.469397001332232e-32
+ outer loop
+ vertex -179.89715088236125 -69.34141226851004 597.4
+ vertex -165.44278799932133 -77.68664256999766 617.4
+ vertex -165.44278799932133 -77.68664256999766 597.4
+ endloop
+endfacet
+facet normal -0.9297083246305115 -0.36829666182675036 -1.9826756260084607e-16
+ outer loop
+ vertex -183.84872475169666 -100.57694261544432 597.4
+ vertex -184.44223546024463 -99.07871603973358 617.4
+ vertex -184.44223546024463 -99.07871603973358 597.4
+ endloop
+endfacet
+facet normal -0.9297083246305115 -0.36829666182675036 -1.9826756260084607e-16
+ outer loop
+ vertex -184.44223546024463 -99.07871603973358 617.4
+ vertex -183.84872475169666 -100.57694261544432 597.4
+ vertex -183.84872475169666 -100.57694261544432 617.4
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 3.047983989961054e-16
+ outer loop
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -94.7094010767586 -100.43433599533701 597.4
+ vertex -113.10682266969967 -100.43433599533701 597.4
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 3.047983989961054e-16
+ outer loop
+ vertex -94.7094010767586 -100.43433599533701 597.4
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -94.7094010767586 -100.43433599533701 617.4
+ endloop
+endfacet
+facet normal -0.9991524752349786 0.04116225494085001 -7.98897184078597e-17
+ outer loop
+ vertex -186.85327348436152 -84.86267323343138 597.4
+ vertex -186.78694043921743 -83.2525372887208 617.4
+ vertex -186.78694043921743 -83.2525372887208 597.4
+ endloop
+endfacet
+facet normal -0.9991524752349786 0.04116225494085001 -7.98897184078597e-17
+ outer loop
+ vertex -186.78694043921743 -83.2525372887208 617.4
+ vertex -186.85327348436152 -84.86267323343138 597.4
+ vertex -186.85327348436152 -84.86267323343138 617.4
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 2.32518947356378e-16
+ outer loop
+ vertex -134.3333869225628 -31.80357931201403 617.4
+ vertex -135.48808746094204 -29.803579312014033 597.4
+ vertex -135.48808746094204 -29.803579312014033 617.4
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 2.32518947356378e-16
+ outer loop
+ vertex -135.48808746094204 -29.803579312014033 597.4
+ vertex -134.3333869225628 -31.80357931201403 617.4
+ vertex -134.3333869225628 -31.80357931201403 597.4
+ endloop
+endfacet
+facet normal -0.9965567391136523 0.08291360399333735 -6.692383130898718e-17
+ outer loop
+ vertex -186.78694043921743 -83.2525372887208 597.4
+ vertex -186.65332502274782 -81.64658437726645 617.4
+ vertex -186.65332502274782 -81.64658437726645 597.4
+ endloop
+endfacet
+facet normal -0.9965567391136523 0.08291360399333735 -6.692383130898718e-17
+ outer loop
+ vertex -186.65332502274782 -81.64658437726645 617.4
+ vertex -186.78694043921743 -83.2525372887208 597.4
+ vertex -186.78694043921743 -83.2525372887208 617.4
+ endloop
+endfacet
+facet normal -0.9990971750681177 -0.042483346983344376 -1.0537964790030858e-16
+ outer loop
+ vertex -186.78374609386333 -88.08422144198272 597.4
+ vertex -186.8522080811225 -86.47417461358685 617.4
+ vertex -186.8522080811225 -86.47417461358685 597.4
+ endloop
+endfacet
+facet normal -0.9990971750681177 -0.042483346983344376 -1.0537964790030858e-16
+ outer loop
+ vertex -186.8522080811225 -86.47417461358685 617.4
+ vertex -186.78374609386333 -88.08422144198272 597.4
+ vertex -186.78374609386333 -88.08422144198272 617.4
+ endloop
+endfacet
+facet normal 0.1211494213554494 -0.9926342819514344 -2.9134528407854775e-16
+ outer loop
+ vertex -94.15102956204208 -104.36618764791513 617.4
+ vertex -94.70940107675861 -104.43433599533701 597.4
+ vertex -94.15102956204207 -104.36618764791513 597.4
+ endloop
+endfacet
+facet normal 0.1211494213554494 -0.9926342819514344 -2.9134528407854775e-16
+ outer loop
+ vertex -94.70940107675861 -104.43433599533701 597.4
+ vertex -94.15102956204208 -104.36618764791513 617.4
+ vertex -94.70940107675862 -104.43433599533701 617.4
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -94.70940107675861 -104.43433599533701 597.4
+ vertex -109.18236190979502 -104.43433599533698 604.4681483474218
+ vertex -150.0000000000001 -104.43433599533701 597.4
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -109.18236190979502 -104.43433599533698 604.4681483474218
+ vertex -94.70940107675861 -104.43433599533701 597.4
+ vertex -108.70000000000005 -104.43433599533701 604.6679491924311
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -108.70000000000005 -104.43433599533701 604.6679491924311
+ vertex -94.70940107675861 -104.43433599533701 597.4
+ vertex -108.28578643762695 -104.43433599533701 604.9857864376269
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -108.28578643762695 -104.43433599533701 604.9857864376269
+ vertex -94.70940107675861 -104.43433599533701 597.4
+ vertex -94.70940107675862 -104.43433599533701 617.4
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -150.0000000000001 -104.43433599533701 597.4
+ vertex -109.18236190979502 -104.43433599533698 604.4681483474218
+ vertex -109.70000000000005 -104.43433599533701 604.4
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -108.28578643762695 -104.43433599533701 604.9857864376269
+ vertex -94.70940107675862 -104.43433599533701 617.4
+ vertex -107.96794919243118 -104.43433599533698 605.4
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -107.96794919243118 -104.43433599533698 605.4
+ vertex -94.70940107675862 -104.43433599533701 617.4
+ vertex -107.76814834742193 -104.43433599533701 605.8823619097949
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -107.76814834742193 -104.43433599533701 605.8823619097949
+ vertex -94.70940107675862 -104.43433599533701 617.4
+ vertex -107.70000000000005 -104.43433599533701 606.3999999999999
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -107.70000000000005 -104.43433599533701 606.3999999999999
+ vertex -94.70940107675862 -104.43433599533701 617.4
+ vertex -107.70000000000005 -104.43433599533701 608.4
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -107.70000000000005 -104.43433599533701 608.4
+ vertex -94.70940107675862 -104.43433599533701 617.4
+ vertex -107.76814834742193 -104.43433599533701 608.9176380902051
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -107.76814834742193 -104.43433599533701 608.9176380902051
+ vertex -94.70940107675862 -104.43433599533701 617.4
+ vertex -107.96794919243118 -104.43433599533701 609.4
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -107.96794919243118 -104.43433599533701 609.4
+ vertex -94.70940107675862 -104.43433599533701 617.4
+ vertex -108.28578643762695 -104.43433599533701 609.814213562373
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -108.28578643762695 -104.43433599533701 609.814213562373
+ vertex -94.70940107675862 -104.43433599533701 617.4
+ vertex -108.70000000000007 -104.43433599533701 610.1320508075687
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -108.70000000000007 -104.43433599533701 610.1320508075687
+ vertex -94.70940107675862 -104.43433599533701 617.4
+ vertex -109.18236190979502 -104.43433599533701 610.331851652578
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -109.18236190979502 -104.43433599533701 610.331851652578
+ vertex -94.70940107675862 -104.43433599533701 617.4
+ vertex -109.70000000000005 -104.43433599533701 610.3999999999999
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -109.70000000000005 -104.43433599533701 610.3999999999999
+ vertex -94.70940107675862 -104.43433599533701 617.4
+ vertex -134.50000000000006 -104.43433599533697 610.3999999999999
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -150.0000000000001 -104.43433599533701 597.4
+ vertex -135.91421356237313 -104.43433599533697 604.9857864376269
+ vertex -150.0000000000001 -104.43433599533701 617.4
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -135.91421356237313 -104.43433599533697 604.9857864376269
+ vertex -150.0000000000001 -104.43433599533701 597.4
+ vertex -135.50000000000006 -104.43433599533697 604.6679491924311
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -135.50000000000006 -104.43433599533697 604.6679491924311
+ vertex -150.0000000000001 -104.43433599533701 597.4
+ vertex -135.0176380902051 -104.43433599533697 604.4681483474218
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -135.0176380902051 -104.43433599533697 604.4681483474218
+ vertex -150.0000000000001 -104.43433599533701 597.4
+ vertex -134.50000000000006 -104.43433599533697 604.4
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -134.50000000000006 -104.43433599533697 604.4
+ vertex -150.0000000000001 -104.43433599533701 597.4
+ vertex -109.70000000000005 -104.43433599533701 604.4
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -150.0000000000001 -104.43433599533701 617.4
+ vertex -135.91421356237313 -104.43433599533697 604.9857864376269
+ vertex -136.23205080756892 -104.43433599533698 605.4
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -150.0000000000001 -104.43433599533701 617.4
+ vertex -136.23205080756892 -104.43433599533698 605.4
+ vertex -136.43185165257822 -104.43433599533697 605.8823619097949
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -150.0000000000001 -104.43433599533701 617.4
+ vertex -136.43185165257822 -104.43433599533697 605.8823619097949
+ vertex -136.50000000000006 -104.43433599533698 606.3999999999999
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -150.0000000000001 -104.43433599533701 617.4
+ vertex -136.50000000000006 -104.43433599533698 606.3999999999999
+ vertex -136.50000000000006 -104.43433599533698 608.4
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -150.0000000000001 -104.43433599533701 617.4
+ vertex -136.50000000000006 -104.43433599533698 608.4
+ vertex -136.43185165257822 -104.43433599533697 608.9176380902051
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -150.0000000000001 -104.43433599533701 617.4
+ vertex -136.43185165257822 -104.43433599533697 608.9176380902051
+ vertex -136.23205080756892 -104.43433599533698 609.4
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -150.0000000000001 -104.43433599533701 617.4
+ vertex -136.23205080756892 -104.43433599533698 609.4
+ vertex -135.91421356237316 -104.43433599533698 609.814213562373
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -150.0000000000001 -104.43433599533701 617.4
+ vertex -135.91421356237316 -104.43433599533698 609.814213562373
+ vertex -135.50000000000006 -104.43433599533697 610.1320508075687
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -150.0000000000001 -104.43433599533701 617.4
+ vertex -135.50000000000006 -104.43433599533697 610.1320508075687
+ vertex -135.0176380902051 -104.43433599533697 610.331851652578
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -150.0000000000001 -104.43433599533701 617.4
+ vertex -135.0176380902051 -104.43433599533697 610.331851652578
+ vertex -134.50000000000006 -104.43433599533697 610.3999999999999
+ endloop
+endfacet
+facet normal 3.885780586188048e-16 -1.0 -3.047983989961055e-16
+ outer loop
+ vertex -150.0000000000001 -104.43433599533701 617.4
+ vertex -134.50000000000006 -104.43433599533697 610.3999999999999
+ vertex -94.70940107675862 -104.43433599533701 617.4
+ endloop
+endfacet
+facet normal -0.9301944916753129 0.3670670342824406 2.5825137241488848e-17
+ outer loop
+ vertex -184.45996930827118 -72.25495624273324 617.4
+ vertex -183.86844014664098 -70.75594620798759 597.4
+ vertex -184.45996930827118 -72.25495624273324 597.4
+ endloop
+endfacet
+facet normal -0.9301944916753129 0.3670670342824406 2.5825137241488848e-17
+ outer loop
+ vertex -183.86844014664098 -70.75594620798759 597.4
+ vertex -184.45996930827118 -72.25495624273324 617.4
+ vertex -183.86844014664098 -70.75594620798759 617.4
+ endloop
+endfacet
+facet normal -0.9684976081015079 -0.24902285658480888 -1.65501661748867e-16
+ outer loop
+ vertex -185.43879081874147 -96.01439158963024 597.4
+ vertex -185.84009158351952 -94.45365601640985 617.4
+ vertex -185.84009158351952 -94.45365601640985 597.4
+ endloop
+endfacet
+facet normal -0.9684976081015079 -0.24902285658480888 -1.65501661748867e-16
+ outer loop
+ vertex -185.84009158351952 -94.45365601640985 617.4
+ vertex -185.43879081874147 -96.01439158963024 597.4
+ vertex -185.43879081874147 -96.01439158963024 617.4
+ endloop
+endfacet
+facet normal -0.9688260316082291 0.24774204422796448 -1.4118899179752827e-17
+ outer loop
+ vertex -185.8517087301446 -76.8818605363542 597.4
+ vertex -185.45247199669834 -75.32059570808379 617.4
+ vertex -185.45247199669834 -75.32059570808379 597.4
+ endloop
+endfacet
+facet normal -0.9688260316082291 0.24774204422796448 -1.4118899179752827e-17
+ outer loop
+ vertex -185.45247199669834 -75.32059570808379 617.4
+ vertex -185.8517087301446 -76.8818605363542 597.4
+ vertex -185.8517087301446 -76.8818605363542 617.4
+ endloop
+endfacet
+facet normal -0.9783396194476177 0.20700625357483915 -2.741524602420749e-17
+ outer loop
+ vertex -186.18529966638516 -78.45845652790855 597.4
+ vertex -185.8517087301446 -76.8818605363542 617.4
+ vertex -185.8517087301446 -76.8818605363542 597.4
+ endloop
+endfacet
+facet normal -0.9783396194476177 0.20700625357483915 -2.741524602420749e-17
+ outer loop
+ vertex -185.8517087301446 -76.8818605363542 617.4
+ vertex -186.18529966638516 -78.45845652790855 597.4
+ vertex -186.18529966638516 -78.45845652790855 617.4
+ endloop
+endfacet
+facet normal -0.9964462355504122 -0.08423122732937333 -1.1785908513505626e-16
+ outer loop
+ vertex -186.64800732510514 -89.68999627675349 597.4
+ vertex -186.78374609386333 -88.08422144198272 617.4
+ vertex -186.78374609386333 -88.08422144198272 597.4
+ endloop
+endfacet
+facet normal -0.9964462355504122 -0.08423122732937333 -1.1785908513505626e-16
+ outer loop
+ vertex -186.78374609386333 -88.08422144198272 617.4
+ vertex -186.64800732510514 -89.68999627675349 597.4
+ vertex -186.64800732510514 -89.68999627675349 617.4
+ endloop
+endfacet
+facet normal -0.8956764823140547 -0.4447062390269794 -2.1840864678576692e-16
+ outer loop
+ vertex -182.4764284190598 -103.49242022528485 597.4
+ vertex -183.19307329363312 -102.0490360224217 617.4
+ vertex -183.19307329363312 -102.0490360224217 597.4
+ endloop
+endfacet
+facet normal -0.8956764823140547 -0.4447062390269794 -2.1840864678576692e-16
+ outer loop
+ vertex -183.19307329363312 -102.0490360224217 617.4
+ vertex -182.4764284190598 -103.49242022528485 597.4
+ vertex -182.4764284190598 -103.49242022528485 617.4
+ endloop
+endfacet
+facet normal -0.9920516018175768 -0.12583171035625318 -1.3013227922530804e-16
+ outer loop
+ vertex -186.44522930588303 -91.28868915165081 597.4
+ vertex -186.64800732510514 -89.68999627675349 617.4
+ vertex -186.64800732510514 -89.68999627675349 597.4
+ endloop
+endfacet
+facet normal -0.9920516018175768 -0.12583171035625318 -1.3013227922530804e-16
+ outer loop
+ vertex -186.64800732510514 -89.68999627675349 617.4
+ vertex -186.44522930588303 -91.28868915165081 597.4
+ vertex -186.44522930588303 -91.28868915165081 617.4
+ endloop
+endfacet
+facet normal -0.9859209640962909 -0.16721199883812263 -1.4217775314923108e-16
+ outer loop
+ vertex -186.17576688008776 -92.87750249323994 597.4
+ vertex -186.44522930588303 -91.28868915165081 617.4
+ vertex -186.44522930588303 -91.28868915165081 597.4
+ endloop
+endfacet
+facet normal -0.9859209640962909 -0.16721199883812263 -1.4217775314923108e-16
+ outer loop
+ vertex -186.44522930588303 -91.28868915165081 617.4
+ vertex -186.17576688008776 -92.87750249323994 597.4
+ vertex -186.17576688008776 -92.87750249323994 617.4
+ endloop
+endfacet
+facet normal -0.9999997814571895 -0.0006611244764069267 -9.271580545042551e-17
+ outer loop
+ vertex -186.8522080811225 -86.47417461358685 597.4
+ vertex -186.85327348436152 -84.86267323343138 617.4
+ vertex -186.85327348436152 -84.86267323343138 597.4
+ endloop
+endfacet
+facet normal -0.9999997814571895 -0.0006611244764069267 -9.271580545042551e-17
+ outer loop
+ vertex -186.85327348436152 -84.86267323343138 617.4
+ vertex -186.8522080811225 -86.47417461358685 597.4
+ vertex -186.8522080811225 -86.47417461358685 617.4
+ endloop
+endfacet
+facet normal -0.9140288370919263 0.4056492141794201 3.908047838012917e-17
+ outer loop
+ vertex -183.86844014664098 -70.75594620798759 617.4
+ vertex -183.21473573526944 -69.28298715360742 597.4
+ vertex -183.86844014664098 -70.75594620798759 597.4
+ endloop
+endfacet
+facet normal -0.9140288370919263 0.4056492141794201 3.908047838012917e-17
+ outer loop
+ vertex -183.21473573526944 -69.28298715360742 597.4
+ vertex -183.86844014664098 -70.75594620798759 617.4
+ vertex -183.21473573526944 -69.28298715360742 617.4
+ endloop
+endfacet
+facet normal -0.9447323868310465 0.3278425190125801 1.2524604359616315e-17
+ outer loop
+ vertex -184.98828809559384 -73.77739412070689 617.4
+ vertex -184.45996930827118 -72.25495624273324 597.4
+ vertex -184.98828809559384 -73.77739412070689 597.4
+ endloop
+endfacet
+facet normal -0.9447323868310465 0.3278425190125801 1.2524604359616315e-17
+ outer loop
+ vertex -184.45996930827118 -72.25495624273324 597.4
+ vertex -184.98828809559384 -73.77739412070689 617.4
+ vertex -184.45996930827118 -72.25495624273324 617.4
+ endloop
+endfacet
+facet normal -0.8762939397707025 -0.4817768478467397 -2.2791454633835716e-16
+ outer loop
+ vertex -181.70004419415466 -104.90456942726227 597.4
+ vertex -182.4764284190598 -103.49242022528485 617.4
+ vertex -182.4764284190598 -103.49242022528485 597.4
+ endloop
+endfacet
+facet normal -0.8762939397707025 -0.4817768478467397 -2.2791454633835716e-16
+ outer loop
+ vertex -182.4764284190598 -103.49242022528485 617.4
+ vertex -181.70004419415466 -104.90456942726227 597.4
+ vertex -181.70004419415466 -104.90456942726227 617.4
+ endloop
+endfacet
+facet normal 0.3098971353857546 0.9507700907578569 3.1846312298286416e-16
+ outer loop
+ vertex -158.63766952233078 -119.64023912920045 617.4
+ vertex -160.05051943746048 -119.1797301736866 597.4
+ vertex -160.05051943746048 -119.1797301736866 617.4
+ endloop
+endfacet
+facet normal 0.3098971353857546 0.9507700907578569 3.1846312298286416e-16
+ outer loop
+ vertex -160.05051943746048 -119.1797301736866 597.4
+ vertex -158.63766952233078 -119.64023912920045 617.4
+ vertex -158.63766952233078 -119.64023912920045 597.4
+ endloop
+endfacet
+facet normal -0.5088614820537041 -0.8608484141137207 -3.0946219034443546e-16
+ outer loop
+ vertex -166.94278799932135 -80.28471878135097 597.4
+ vertex -181.10149984918363 -71.91527419881093 617.4
+ vertex -181.10149984918363 -71.91527419881093 597.4
+ endloop
+endfacet
+facet normal -0.5088614820537041 -0.8608484141137207 -3.0946219034443546e-16
+ outer loop
+ vertex -181.10149984918363 -71.91527419881093 617.4
+ vertex -166.94278799932135 -80.28471878135097 597.4
+ vertex -166.94278799932135 -80.28471878135097 617.4
+ endloop
+endfacet
+facet normal 0.9859209640962954 0.1672119988380962 1.4217775314922344e-16
+ outer loop
+ vertex -183.42210412904055 -91.17636932989386 617.3999999999999
+ vertex -183.47762125401513 -90.84902740611359 597.4
+ vertex -183.47762125401513 -90.84902740611359 617.4
+ endloop
+endfacet
+facet normal 0.9859209640962954 0.1672119988380962 1.4217775314922344e-16
+ outer loop
+ vertex -183.47762125401513 -90.84902740611359 597.4
+ vertex -183.42210412904055 -91.17636932989386 617.3999999999999
+ vertex -183.42210412904055 -91.17636932989386 597.4
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 -2.32518947356378e-16
+ outer loop
+ vertex -174.92783335074785 -91.46835223218363 597.4
+ vertex -175.92783335074785 -89.73630142461475 617.4
+ vertex -175.92783335074785 -89.73630142461475 597.4
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 -2.32518947356378e-16
+ outer loop
+ vertex -175.92783335074785 -89.73630142461475 617.4
+ vertex -174.92783335074785 -91.46835223218363 597.4
+ vertex -174.92783335074785 -91.46835223218363 617.4
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 2.32518947356378e-16
+ outer loop
+ vertex -170.3750000000001 -88.8397726715539 617.4
+ vertex -171.37500000000009 -87.10772186398503 597.4
+ vertex -171.37500000000009 -87.10772186398503 617.4
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 2.32518947356378e-16
+ outer loop
+ vertex -171.37500000000009 -87.10772186398503 597.4
+ vertex -170.3750000000001 -88.8397726715539 617.4
+ vertex -170.3750000000001 -88.8397726715539 597.4
+ endloop
+endfacet
+facet normal 0.9783396194476196 -0.2070062535748305 2.7415246024210318e-17
+ outer loop
+ vertex -183.23793366531743 -79.01795063489293 617.4
+ vertex -182.93032116189784 -77.56413223889896 597.4
+ vertex -182.93032116189784 -77.56413223889896 617.4
+ endloop
+endfacet
+facet normal 0.9783396194476196 -0.2070062535748305 2.7415246024210318e-17
+ outer loop
+ vertex -182.93032116189784 -77.56413223889896 597.4
+ vertex -183.23793366531743 -79.01795063489293 617.4
+ vertex -183.23793366531743 -79.01795063489293 597.4
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 2.177059985700437e-16
+ outer loop
+ vertex -172.30292768969883 -111.31482220219574 617.4
+ vertex -165.67783335074787 -107.48982220219573 597.4
+ vertex -172.30292768969883 -111.31482220219574 597.4
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 2.177059985700437e-16
+ outer loop
+ vertex -165.67783335074787 -107.48982220219573 597.4
+ vertex -172.30292768969883 -111.31482220219574 617.4
+ vertex -165.67783335074787 -107.48982220219573 617.4
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 -2.32518947356378e-16
+ outer loop
+ vertex -154.54940691211783 -101.06482220219574 597.4
+ vertex -164.7994069121178 -83.31130142461475 617.4
+ vertex -164.7994069121178 -83.31130142461475 597.4
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 -2.32518947356378e-16
+ outer loop
+ vertex -164.7994069121178 -83.31130142461475 617.4
+ vertex -154.54940691211783 -101.06482220219574 597.4
+ vertex -154.54940691211783 -101.06482220219574 617.4
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 2.1770599857004372e-16
+ outer loop
+ vertex -183.42210412904055 -91.17636932989386 617.3999999999999
+ vertex -168.1355759986426 -82.35068819883382 597.4
+ vertex -183.42210412904055 -91.17636932989386 597.4
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 2.1770599857004372e-16
+ outer loop
+ vertex -168.1355759986426 -82.35068819883382 597.4
+ vertex -183.42210412904055 -91.17636932989386 617.3999999999999
+ vertex -168.1355759986426 -82.35068819883382 617.4
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 2.177059985700437e-16
+ outer loop
+ vertex -161.12500000000009 -104.861242641566 617.4
+ vertex -154.54940691211783 -101.06482220219574 597.4
+ vertex -161.12500000000009 -104.861242641566 597.4
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 2.177059985700437e-16
+ outer loop
+ vertex -154.54940691211783 -101.06482220219574 597.4
+ vertex -161.12500000000009 -104.861242641566 617.4
+ vertex -154.54940691211783 -101.06482220219574 617.4
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 2.32518947356378e-16
+ outer loop
+ vertex -172.30292768969883 -111.31482220219574 617.4
+ vertex -182.5529276896988 -93.56130142461475 597.4
+ vertex -182.5529276896988 -93.56130142461475 617.4
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 2.32518947356378e-16
+ outer loop
+ vertex -182.5529276896988 -93.56130142461475 597.4
+ vertex -172.30292768969883 -111.31482220219574 617.4
+ vertex -172.30292768969883 -111.31482220219574 597.4
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 -2.177059985700437e-16
+ outer loop
+ vertex -175.92783335074785 -89.73630142461475 617.4
+ vertex -182.5529276896988 -93.56130142461475 597.4
+ vertex -175.92783335074785 -89.73630142461475 597.4
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 -2.177059985700437e-16
+ outer loop
+ vertex -182.5529276896988 -93.56130142461475 597.4
+ vertex -175.92783335074785 -89.73630142461475 617.4
+ vertex -182.5529276896988 -93.56130142461475 617.4
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 -2.177059985700437e-16
+ outer loop
+ vertex -164.7994069121178 -83.31130142461475 617.4
+ vertex -171.37500000000009 -87.10772186398503 597.4
+ vertex -164.7994069121178 -83.31130142461475 597.4
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 -2.177059985700437e-16
+ outer loop
+ vertex -171.37500000000009 -87.10772186398503 597.4
+ vertex -164.7994069121178 -83.31130142461475 617.4
+ vertex -171.37500000000009 -87.10772186398503 617.4
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 2.32518947356378e-16
+ outer loop
+ vertex -161.12500000000009 -104.861242641566 617.4
+ vertex -162.12500000000009 -103.12919183399713 597.4
+ vertex -162.12500000000009 -103.12919183399713 617.4
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 2.32518947356378e-16
+ outer loop
+ vertex -162.12500000000009 -103.12919183399713 597.4
+ vertex -161.12500000000009 -104.861242641566 617.4
+ vertex -161.12500000000009 -104.861242641566 597.4
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000018 7.2279451639728e-17
+ outer loop
+ vertex -168.1355759986426 -82.35068819883382 617.4
+ vertex -166.94278799932135 -80.28471878135097 597.4
+ vertex -168.1355759986426 -82.35068819883382 597.4
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000018 7.2279451639728e-17
+ outer loop
+ vertex -166.94278799932135 -80.28471878135097 597.4
+ vertex -168.1355759986426 -82.35068819883382 617.4
+ vertex -166.94278799932135 -80.28471878135097 617.4
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 -2.32518947356378e-16
+ outer loop
+ vertex -165.67783335074787 -107.48982220219573 597.4
+ vertex -166.67783335074787 -105.75777139462686 617.4
+ vertex -166.67783335074787 -105.75777139462686 597.4
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 -2.32518947356378e-16
+ outer loop
+ vertex -166.67783335074787 -105.75777139462686 617.4
+ vertex -165.67783335074787 -107.48982220219573 597.4
+ vertex -165.67783335074787 -107.48982220219573 617.4
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 -2.1770599857004374e-16
+ outer loop
+ vertex -170.3750000000001 -88.8397726715539 617.4
+ vertex -174.92783335074785 -91.46835223218363 597.4
+ vertex -170.3750000000001 -88.8397726715539 597.4
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 -2.1770599857004374e-16
+ outer loop
+ vertex -174.92783335074785 -91.46835223218363 597.4
+ vertex -170.3750000000001 -88.8397726715539 617.4
+ vertex -174.92783335074785 -91.46835223218363 617.4
+ endloop
+endfacet
+facet normal 0.9920516018175792 0.1258317103562346 1.301322792253026e-16
+ outer loop
+ vertex -183.47762125401513 -90.84902740611359 617.4
+ vertex -183.66460791148953 -89.3748329241279 597.4
+ vertex -183.66460791148953 -89.3748329241279 617.4
+ endloop
+endfacet
+facet normal 0.9920516018175792 0.1258317103562346 1.301322792253026e-16
+ outer loop
+ vertex -183.66460791148953 -89.3748329241279 597.4
+ vertex -183.47762125401513 -90.84902740611359 617.4
+ vertex -183.47762125401513 -90.84902740611359 597.4
+ endloop
+endfacet
+facet normal 0.9991524752349781 -0.04116225494086089 7.988971840785634e-17
+ outer loop
+ vertex -183.8538889448047 -84.92343822226253 617.4
+ vertex -183.7927215932388 -83.43869180085149 597.4
+ vertex -183.7927215932388 -83.43869180085149 617.4
+ endloop
+endfacet
+facet normal 0.9991524752349781 -0.04116225494086089 7.988971840785634e-17
+ outer loop
+ vertex -183.7927215932388 -83.43869180085149 597.4
+ vertex -183.8538889448047 -84.92343822226253 617.4
+ vertex -183.8538889448047 -84.92343822226253 597.4
+ endloop
+endfacet
+facet normal 0.9447323868310444 -0.3278425190125857 -1.2524604359618278e-17
+ outer loop
+ vertex -181.64696360879714 -73.29754865337445 617.4
+ vertex -182.13413950932807 -74.7014265051594 597.4
+ vertex -181.64696360879714 -73.29754865337445 597.4
+ endloop
+endfacet
+facet normal 0.9447323868310444 -0.3278425190125857 -1.2524604359618278e-17
+ outer loop
+ vertex -182.13413950932807 -74.7014265051594 597.4
+ vertex -181.64696360879714 -73.29754865337445 617.4
+ vertex -182.13413950932807 -74.7014265051594 617.4
+ endloop
+endfacet
+facet normal 0.26986211191721243 0.9628989773343732 3.184561753812833e-16
+ outer loop
+ vertex -157.2067960108166 -120.04125580570847 617.4
+ vertex -158.63766952233078 -119.64023912920045 597.4
+ vertex -158.63766952233078 -119.64023912920045 617.4
+ endloop
+endfacet
+facet normal 0.26986211191721243 0.9628989773343732 3.184561753812833e-16
+ outer loop
+ vertex -158.63766952233078 -119.64023912920045 597.4
+ vertex -157.2067960108166 -120.04125580570847 617.4
+ vertex -157.2067960108166 -120.04125580570847 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -174.92783335074785 -91.46835223218363 597.4
+ vertex -171.37500000000009 -87.10772186398503 597.4
+ vertex -170.3750000000001 -88.8397726715539 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -164.7994069121178 -83.31130142461475 597.4
+ vertex -168.1355759986426 -82.35068819883382 597.4
+ vertex -166.94278799932135 -80.28471878135097 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -168.1355759986426 -82.35068819883382 597.4
+ vertex -164.7994069121178 -83.31130142461475 597.4
+ vertex -171.37500000000009 -87.10772186398503 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -168.1355759986426 -82.35068819883382 597.4
+ vertex -171.37500000000009 -87.10772186398503 597.4
+ vertex -183.42210412904055 -91.17636932989386 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -183.42210412904055 -91.17636932989386 597.4
+ vertex -171.37500000000009 -87.10772186398503 597.4
+ vertex -175.92783335074785 -89.73630142461475 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -175.92783335074785 -89.73630142461475 597.4
+ vertex -171.37500000000009 -87.10772186398503 597.4
+ vertex -174.92783335074785 -91.46835223218363 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -183.42210412904055 -91.17636932989386 597.4
+ vertex -175.92783335074785 -89.73630142461475 597.4
+ vertex -182.5529276896988 -93.56130142461475 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -135.48808746094204 -29.803579312014033 597.4
+ vertex -134.3333869225628 -31.80357931201403 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -135.48808746094204 -29.803579312014033 597.4
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -135.82629141839357 -29.35408956923085 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -135.82629141839357 -29.35408956923085 597.4
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -136.2201382685109 -29.07152850444516 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -136.2201382685109 -29.07152850444516 597.4
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -136.64278799932129 -28.97515218726785 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -136.64278799932129 -28.97515218726785 597.4
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -137.06543773013166 -29.07152850444516 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -137.06543773013166 -29.07152850444516 597.4
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -137.45928458024903 -29.35408956923086 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -137.45928458024903 -29.35408956923086 597.4
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -137.79748853770056 -29.803579312014033 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -137.79748853770056 -29.803579312014033 597.4
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -165.44278799932133 -77.68664256999766 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -165.44278799932133 -77.68664256999766 597.4
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -149.13659139480458 -57.56730855610119 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -149.13659139480458 -57.56730855610119 597.4
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -148.6342785416942 -57.064995702990785 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -148.6342785416942 -57.064995702990785 597.4
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -148.05237123795206 -56.65753982237127 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -148.05237123795206 -56.65753982237127 597.4
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -147.40855044254315 -56.35732125499265 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -147.40855044254315 -56.35732125499265 597.4
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -146.72237832454687 -56.1734619901068 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -146.72237832454687 -56.1734619901068 597.4
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -146.01470387654874 -56.111548498439994 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -146.01470387654874 -56.111548498439994 597.4
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -145.3070294285506 -56.173461990106794 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -145.3070294285506 -56.173461990106794 597.4
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -144.62085731055436 -56.35732125499265 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -144.62085731055436 -56.35732125499265 597.4
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -144.05167483247538 -56.60305820935861 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -144.05167483247538 -56.60305820935861 597.4
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -143.42990957836216 -57.03842292728556 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -143.42990957836216 -57.03842292728556 597.4
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -143.39512921140332 -57.06499570299079 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -143.39512921140332 -57.06499570299079 597.4
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -142.89319062544635 -57.575141880201365 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -142.89319062544635 -57.575141880201365 597.4
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -142.4853604776734 -58.14921585984331 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -142.4853604776734 -58.14921585984331 597.4
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -121.6013783836058 -94.32133391112707 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -144.05167483247538 -56.60305820935861 597.4
+ vertex -143.42990957836216 -57.03842292728556 597.4
+ vertex -143.97703651514541 -56.65753982237127 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -165.44278799932133 -77.68664256999766 597.4
+ vertex -149.13659139480458 -57.56730855610119 597.4
+ vertex -149.5440472754241 -58.14921585984331 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -165.44278799932133 -77.68664256999766 597.4
+ vertex -149.5440472754241 -58.14921585984331 597.4
+ vertex -162.241464507947 -80.1417876314735 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -165.44278799932133 -77.68664256999766 597.4
+ vertex -162.241464507947 -80.1417876314735 597.4
+ vertex -150.0000000000001 -104.43433599533701 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -165.44278799932133 -77.68664256999766 597.4
+ vertex -150.0000000000001 -104.43433599533701 597.4
+ vertex -154.54940691211783 -101.06482220219574 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -154.54940691211783 -101.06482220219574 597.4
+ vertex -150.0000000000001 -104.43433599533701 597.4
+ vertex -153.0000000000001 -104.43433599533701 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -153.0000000000001 -104.43433599533701 597.4
+ vertex -150.0000000000001 -104.43433599533701 597.4
+ vertex -150.00000000000014 -121.12479659831224 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -153.0000000000001 -104.43433599533701 597.4
+ vertex -150.00000000000014 -121.12479659831224 597.4
+ vertex -152.83120430088547 -120.88086243345158 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -152.83120430088547 -120.88086243345158 597.4
+ vertex -150.00000000000014 -121.12479659831224 597.4
+ vertex -150.0000000000001 -124.13030787576982 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -152.83120430088547 -120.88086243345158 597.4
+ vertex -150.0000000000001 -124.13030787576982 597.4
+ vertex -151.60819479272956 -124.02712191759254 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -152.83120430088547 -120.88086243345158 597.4
+ vertex -151.60819479272956 -124.02712191759254 597.4
+ vertex -154.30102097334648 -120.66211067883889 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -154.30102097334648 -120.66211067883889 597.4
+ vertex -151.60819479272956 -124.02712191759254 597.4
+ vertex -153.21066695824285 -123.85676701721619 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -154.30102097334648 -120.66211067883889 597.4
+ vertex -153.21066695824285 -123.85676701721619 597.4
+ vertex -155.76040280706806 -120.38207845891773 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -155.76040280706806 -120.38207845891773 597.4
+ vertex -153.21066695824285 -123.85676701721619 597.4
+ vertex -154.80461230967546 -123.6195412808944 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -155.76040280706806 -120.38207845891773 597.4
+ vertex -154.80461230967546 -123.6195412808944 597.4
+ vertex -157.2067960108166 -120.04125580570847 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -157.2067960108166 -120.04125580570847 597.4
+ vertex -154.80461230967546 -123.6195412808944 597.4
+ vertex -156.38724158134568 -123.3158598330256 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -157.2067960108166 -120.04125580570847 597.4
+ vertex -156.38724158134568 -123.3158598330256 597.4
+ vertex -158.63766952233078 -119.64023912920045 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -158.63766952233078 -119.64023912920045 597.4
+ vertex -156.38724158134568 -123.3158598330256 597.4
+ vertex -157.95578530972676 -122.9462540897214 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -158.63766952233078 -119.64023912920045 597.4
+ vertex -157.95578530972676 -122.9462540897214 597.4
+ vertex -160.05051943746048 -119.1797301736866 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -160.05051943746048 -119.1797301736866 597.4
+ vertex -157.95578530972676 -122.9462540897214 597.4
+ vertex -161.4428733917811 -118.6605347897719 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -161.4428733917811 -118.6605347897719 597.4
+ vertex -157.95578530972676 -122.9462540897214 597.4
+ vertex -159.5074986797672 -122.51137082887453 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -161.4428733917811 -118.6605347897719 597.4
+ vertex -159.5074986797672 -122.51137082887453 597.4
+ vertex -162.81229488701607 -118.08356152420495 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -162.81229488701607 -118.08356152420495 597.4
+ vertex -159.5074986797672 -122.51137082887453 597.4
+ vertex -161.03966632807825 -122.01197105835392 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -162.81229488701607 -118.08356152420495 597.4
+ vertex -161.03966632807825 -122.01197105835392 597.4
+ vertex -164.15638755469695 -117.44982003000014 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -164.15638755469695 -117.44982003000014 597.4
+ vertex -161.03966632807825 -122.01197105835392 597.4
+ vertex -162.54960709458362 -121.44892868430706 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -164.15638755469695 -117.44982003000014 597.4
+ vertex -162.54960709458362 -121.44892868430706 597.4
+ vertex -165.47279934959994 -116.76041929963289 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -165.47279934959994 -116.76041929963289 597.4
+ vertex -162.54960709458362 -121.44892868430706 597.4
+ vertex -164.0346787143162 -120.8232289819003 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -165.47279934959994 -116.76041929963289 597.4
+ vertex -164.0346787143162 -120.8232289819003 597.4
+ vertex -166.75922666561993 -116.01656572439916 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -166.75922666561993 -116.01656572439916 597.4
+ vertex -164.0346787143162 -120.8232289819003 597.4
+ vertex -168.01341836688124 -115.21956098333557 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -168.01341836688124 -115.21956098333557 597.4
+ vertex -164.0346787143162 -120.8232289819003 597.4
+ vertex -165.49228244115207 -120.13596687117304 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -168.01341836688124 -115.21956098333557 597.4
+ vertex -165.49228244115207 -120.13596687117304 597.4
+ vertex -169.2331797270292 -114.37079976539471 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -169.2331797270292 -114.37079976539471 597.4
+ vertex -165.49228244115207 -120.13596687117304 597.4
+ vertex -166.9198675953899 -119.38834500102291 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -169.2331797270292 -114.37079976539471 597.4
+ vertex -166.9198675953899 -119.38834500102291 597.4
+ vertex -170.41637626981046 -113.47176732886027 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -170.41637626981046 -113.47176732886027 597.4
+ vertex -166.9198675953899 -119.38834500102291 597.4
+ vertex -168.31493602721872 -118.58167164467494 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -170.41637626981046 -113.47176732886027 597.4
+ vertex -168.31493602721872 -118.58167164467494 597.4
+ vertex -170.67210412904055 -113.26001712639702 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -170.67210412904055 -113.26001712639702 597.4
+ vertex -168.31493602721872 -118.58167164467494 597.4
+ vertex -172.30292768969883 -111.31482220219574 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -172.30292768969883 -111.31482220219574 597.4
+ vertex -168.31493602721872 -118.58167164467494 597.4
+ vertex -182.5529276896988 -93.56130142461475 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -182.5529276896988 -93.56130142461475 597.4
+ vertex -168.31493602721872 -118.58167164467494 597.4
+ vertex -186.8522080811225 -86.47417461358685 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -186.8522080811225 -86.47417461358685 597.4
+ vertex -168.31493602721872 -118.58167164467494 597.4
+ vertex -186.78374609386333 -88.08422144198272 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -186.78374609386333 -88.08422144198272 597.4
+ vertex -168.31493602721872 -118.58167164467494 597.4
+ vertex -169.67504648826252 -117.71735841031698 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -186.78374609386333 -88.08422144198272 597.4
+ vertex -169.67504648826252 -117.71735841031698 597.4
+ vertex -186.64800732510514 -89.68999627675349 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -186.64800732510514 -89.68999627675349 597.4
+ vertex -169.67504648826252 -117.71735841031698 597.4
+ vertex -170.99781890355266 -116.79691777090856 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -186.64800732510514 -89.68999627675349 597.4
+ vertex -170.99781890355266 -116.79691777090856 597.4
+ vertex -172.28093853645186 -115.8219604174845 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -186.64800732510514 -89.68999627675349 597.4
+ vertex -172.28093853645186 -115.8219604174845 597.4
+ vertex -186.44522930588303 -91.28868915165081 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -186.44522930588303 -91.28868915165081 597.4
+ vertex -172.28093853645186 -115.8219604174845 597.4
+ vertex -186.17576688008776 -92.87750249323994 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -186.17576688008776 -92.87750249323994 597.4
+ vertex -172.28093853645186 -115.8219604174845 597.4
+ vertex -173.52216003924207 -114.79419244058586 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -186.17576688008776 -92.87750249323994 597.4
+ vertex -173.52216003924207 -114.79419244058586 597.4
+ vertex -185.84009158351952 -94.45365601640985 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -185.84009158351952 -94.45365601640985 597.4
+ vertex -173.52216003924207 -114.79419244058586 597.4
+ vertex -174.7193113822874 -113.71541234474994 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -185.84009158351952 -94.45365601640985 597.4
+ vertex -174.7193113822874 -113.71541234474994 597.4
+ vertex -175.8702976548973 -112.58750790128379 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -185.84009158351952 -94.45365601640985 597.4
+ vertex -175.8702976548973 -112.58750790128379 597.4
+ vertex -185.43879081874147 -96.01439158963024 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -185.43879081874147 -96.01439158963024 597.4
+ vertex -175.8702976548973 -112.58750790128379 597.4
+ vertex -176.9731047312377 -111.4124528448287 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -185.43879081874147 -96.01439158963024 597.4
+ vertex -176.9731047312377 -111.4124528448287 597.4
+ vertex -184.97256682717622 -97.55697806144181 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -184.97256682717622 -97.55697806144181 597.4
+ vertex -176.9731047312377 -111.4124528448287 597.4
+ vertex -178.02580279487614 -110.19230341949638 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -184.97256682717622 -97.55697806144181 597.4
+ vertex -178.02580279487614 -110.19230341949638 597.4
+ vertex -184.44223546024463 -99.07871603973358 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -184.44223546024463 -99.07871603973358 597.4
+ vertex -178.02580279487614 -110.19230341949638 597.4
+ vertex -179.02654971579267 -108.92919478062035 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -184.44223546024463 -99.07871603973358 597.4
+ vertex -179.02654971579267 -108.92919478062035 597.4
+ vertex -183.84872475169666 -100.57694261544432 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -183.84872475169666 -100.57694261544432 597.4
+ vertex -179.02654971579267 -108.92919478062035 597.4
+ vertex -179.97359427394687 -107.62533725842033 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -183.84872475169666 -100.57694261544432 597.4
+ vertex -179.97359427394687 -107.62533725842033 597.4
+ vertex -183.19307329363312 -102.0490360224217 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -183.19307329363312 -102.0490360224217 597.4
+ vertex -179.97359427394687 -107.62533725842033 597.4
+ vertex -180.86527922376087 -106.28301249011633 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -183.19307329363312 -102.0490360224217 597.4
+ vertex -180.86527922376087 -106.28301249011633 597.4
+ vertex -182.4764284190598 -103.49242022528485 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -182.4764284190598 -103.49242022528485 597.4
+ vertex -180.86527922376087 -106.28301249011633 597.4
+ vertex -181.70004419415466 -104.90456942726227 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -165.44278799932133 -77.68664256999766 597.4
+ vertex -166.94278799932135 -80.28471878135097 597.4
+ vertex -179.89715088236125 -69.34141226851004 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -166.94278799932135 -80.28471878135097 597.4
+ vertex -165.44278799932133 -77.68664256999766 597.4
+ vertex -164.7994069121178 -83.31130142461475 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -164.7994069121178 -83.31130142461475 597.4
+ vertex -165.44278799932133 -77.68664256999766 597.4
+ vertex -154.54940691211783 -101.06482220219574 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -179.89715088236125 -69.34141226851004 597.4
+ vertex -166.94278799932135 -80.28471878135097 597.4
+ vertex -181.10149984918363 -71.91527419881093 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -179.89715088236125 -69.34141226851004 597.4
+ vertex -181.10149984918363 -71.91527419881093 597.4
+ vertex -182.50000000000009 -67.83865662978125 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -182.50000000000009 -67.83865662978125 597.4
+ vertex -181.10149984918363 -71.91527419881093 597.4
+ vertex -183.21473573526944 -69.28298715360742 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -183.21473573526944 -69.28298715360742 597.4
+ vertex -181.10149984918363 -71.91527419881093 597.4
+ vertex -181.64696360879714 -73.29754865337445 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -183.21473573526944 -69.28298715360742 597.4
+ vertex -181.64696360879714 -73.29754865337445 597.4
+ vertex -183.86844014664098 -70.75594620798759 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -183.86844014664098 -70.75594620798759 597.4
+ vertex -181.64696360879714 -73.29754865337445 597.4
+ vertex -182.13413950932807 -74.7014265051594 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -183.86844014664098 -70.75594620798759 597.4
+ vertex -182.13413950932807 -74.7014265051594 597.4
+ vertex -184.45996930827118 -72.25495624273324 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -184.45996930827118 -72.25495624273324 597.4
+ vertex -182.13413950932807 -74.7014265051594 597.4
+ vertex -182.56217503533787 -76.12445109007139 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -184.45996930827118 -72.25495624273324 597.4
+ vertex -182.56217503533787 -76.12445109007139 597.4
+ vertex -184.98828809559384 -73.77739412070689 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -184.98828809559384 -73.77739412070689 597.4
+ vertex -182.56217503533787 -76.12445109007139 597.4
+ vertex -182.93032116189784 -77.56413223889896 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -184.98828809559384 -73.77739412070689 597.4
+ vertex -182.93032116189784 -77.56413223889896 597.4
+ vertex -185.45247199669834 -75.32059570808379 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -185.45247199669834 -75.32059570808379 597.4
+ vertex -182.93032116189784 -77.56413223889896 597.4
+ vertex -183.23793366531743 -79.01795063489293 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -185.45247199669834 -75.32059570808379 597.4
+ vertex -183.23793366531743 -79.01795063489293 597.4
+ vertex -183.48447425048 -80.48336222235163 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -185.45247199669834 -75.32059570808379 597.4
+ vertex -183.48447425048 -80.48336222235163 597.4
+ vertex -185.8517087301446 -76.8818605363542 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -185.8517087301446 -76.8818605363542 597.4
+ vertex -183.48447425048 -80.48336222235163 597.4
+ vertex -183.66951149281203 -81.95780265849703 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -185.8517087301446 -76.8818605363542 597.4
+ vertex -183.66951149281203 -81.95780265849703 597.4
+ vertex -186.18529966638516 -78.45845652790855 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -186.18529966638516 -78.45845652790855 597.4
+ vertex -183.66951149281203 -81.95780265849703 597.4
+ vertex -183.7927215932388 -83.43869180085149 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -186.18529966638516 -78.45845652790855 597.4
+ vertex -183.7927215932388 -83.43869180085149 597.4
+ vertex -186.45266105030615 -80.04762477693534 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -186.45266105030615 -80.04762477693534 597.4
+ vertex -183.7927215932388 -83.43869180085149 597.4
+ vertex -183.8538889448047 -84.92343822226253 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -186.45266105030615 -80.04762477693534 597.4
+ vertex -183.8538889448047 -84.92343822226253 597.4
+ vertex -186.65332502274782 -81.64658437726645 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -186.65332502274782 -81.64658437726645 597.4
+ vertex -183.8538889448047 -84.92343822226253 597.4
+ vertex -183.8529065099664 -86.40944374567499 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -186.65332502274782 -81.64658437726645 597.4
+ vertex -183.8529065099664 -86.40944374567499 597.4
+ vertex -183.7897760078994 -87.89410799071469 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -186.65332502274782 -81.64658437726645 597.4
+ vertex -183.7897760078994 -87.89410799071469 597.4
+ vertex -186.78694043921743 -83.2525372887208 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -186.78694043921743 -83.2525372887208 597.4
+ vertex -183.7897760078994 -87.89410799071469 597.4
+ vertex -183.66460791148953 -89.3748329241279 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -186.78694043921743 -83.2525372887208 597.4
+ vertex -183.66460791148953 -89.3748329241279 597.4
+ vertex -186.85327348436152 -84.86267323343138 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -186.85327348436152 -84.86267323343138 597.4
+ vertex -183.66460791148953 -89.3748329241279 597.4
+ vertex -183.47762125401513 -90.84902740611359 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -186.85327348436152 -84.86267323343138 597.4
+ vertex -183.47762125401513 -90.84902740611359 597.4
+ vertex -186.8522080811225 -86.47417461358685 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -186.8522080811225 -86.47417461358685 597.4
+ vertex -183.47762125401513 -90.84902740611359 597.4
+ vertex -183.42210412904055 -91.17636932989386 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -186.8522080811225 -86.47417461358685 597.4
+ vertex -183.42210412904055 -91.17636932989386 597.4
+ vertex -182.5529276896988 -93.56130142461475 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -154.54940691211783 -101.06482220219574 597.4
+ vertex -155.38557599864262 -104.43433599533701 597.4
+ vertex -161.12500000000009 -104.861242641566 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -155.38557599864262 -104.43433599533701 597.4
+ vertex -154.54940691211783 -101.06482220219574 597.4
+ vertex -153.0000000000001 -104.43433599533701 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -161.12500000000009 -104.861242641566 597.4
+ vertex -155.38557599864262 -104.43433599533701 597.4
+ vertex -170.67210412904055 -113.26001712639702 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -161.12500000000009 -104.861242641566 597.4
+ vertex -170.67210412904055 -113.26001712639702 597.4
+ vertex -165.67783335074787 -107.48982220219573 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -161.12500000000009 -104.861242641566 597.4
+ vertex -165.67783335074787 -107.48982220219573 597.4
+ vertex -162.12500000000009 -103.12919183399713 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -165.67783335074787 -107.48982220219573 597.4
+ vertex -170.67210412904055 -113.26001712639702 597.4
+ vertex -172.30292768969883 -111.31482220219574 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -166.67783335074787 -105.75777139462686 597.4
+ vertex -162.12500000000009 -103.12919183399713 597.4
+ vertex -165.67783335074787 -107.48982220219573 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -142.4578259075194 -58.19690713431459 597.4
+ vertex -142.4853604776734 -58.14921585984331 597.4
+ vertex -121.6013783836058 -94.32133391112707 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -93.55470053837934 -102.43433599533701 597.4
+ vertex -113.10682266969967 -100.43433599533701 597.4
+ vertex -94.7094010767586 -100.43433599533701 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -113.10682266969967 -100.43433599533701 597.4
+ vertex -93.55470053837934 -102.43433599533701 597.4
+ vertex -93.33453298111434 -102.95197408554206 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -113.10682266969967 -100.43433599533701 597.4
+ vertex -93.33453298111434 -102.95197408554206 597.4
+ vertex -93.28675134594823 -103.43433599533701 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -113.10682266969967 -100.43433599533701 597.4
+ vertex -93.28675134594823 -103.43433599533701 597.4
+ vertex -93.41461187235467 -103.84854955771011 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -113.10682266969967 -100.43433599533701 597.4
+ vertex -93.41461187235467 -103.84854955771011 597.4
+ vertex -93.7094010767586 -104.16638680290588 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -113.10682266969967 -100.43433599533701 597.4
+ vertex -93.7094010767586 -104.16638680290588 597.4
+ vertex -94.15102956204207 -104.36618764791513 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -113.10682266969967 -100.43433599533701 597.4
+ vertex -94.15102956204207 -104.36618764791513 597.4
+ vertex -94.70940107675861 -104.43433599533701 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -113.10682266969967 -100.43433599533701 597.4
+ vertex -94.70940107675861 -104.43433599533701 597.4
+ vertex -150.0000000000001 -104.43433599533701 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -113.10682266969967 -100.43433599533701 597.4
+ vertex -150.0000000000001 -104.43433599533701 597.4
+ vertex -124.42304733448304 -100.3724225036702 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -113.10682266969967 -100.43433599533701 597.4
+ vertex -124.42304733448304 -100.3724225036702 597.4
+ vertex -123.73687521648677 -100.18856323878435 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -113.10682266969967 -100.43433599533701 597.4
+ vertex -123.73687521648677 -100.18856323878435 597.4
+ vertex -123.09305442107785 -99.88834467140573 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -113.10682266969967 -100.43433599533701 597.4
+ vertex -123.09305442107785 -99.88834467140573 597.4
+ vertex -122.51114711733574 -99.48088879078622 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -113.10682266969967 -100.43433599533701 597.4
+ vertex -122.51114711733574 -99.48088879078622 597.4
+ vertex -122.00883426422534 -98.9785759376758 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -113.10682266969967 -100.43433599533701 597.4
+ vertex -122.00883426422534 -98.9785759376758 597.4
+ vertex -121.6013783836058 -98.39666863393369 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -113.10682266969967 -100.43433599533701 597.4
+ vertex -121.6013783836058 -98.39666863393369 597.4
+ vertex -121.3011598162272 -97.75284783852477 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -113.10682266969967 -100.43433599533701 597.4
+ vertex -121.3011598162272 -97.75284783852477 597.4
+ vertex -121.11730055134134 -97.06667572052851 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -113.10682266969967 -100.43433599533701 597.4
+ vertex -121.11730055134134 -97.06667572052851 597.4
+ vertex -121.05538705967454 -96.35900127253036 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -113.10682266969967 -100.43433599533701 597.4
+ vertex -121.05538705967454 -96.35900127253036 597.4
+ vertex -121.11730055134134 -95.65132682453225 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -113.10682266969967 -100.43433599533701 597.4
+ vertex -121.11730055134134 -95.65132682453225 597.4
+ vertex -121.3011598162272 -94.96515470653598 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -113.10682266969967 -100.43433599533701 597.4
+ vertex -121.3011598162272 -94.96515470653598 597.4
+ vertex -121.6013783836058 -94.32133391112707 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -113.10682266969967 -100.43433599533701 597.4
+ vertex -121.6013783836058 -94.32133391112707 597.4
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -124.42304733448304 -100.3724225036702 597.4
+ vertex -150.0000000000001 -104.43433599533701 597.4
+ vertex -125.13072178248116 -100.43433599533701 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -125.13072178248116 -100.43433599533701 597.4
+ vertex -150.0000000000001 -104.43433599533701 597.4
+ vertex -150.5255562475269 -100.43433599533701 597.4
+ endloop
+endfacet
+facet normal 9.251431598681811e-17 3.047983989961055e-16 -1.0
+ outer loop
+ vertex -150.5255562475269 -100.43433599533701 597.4
+ vertex -150.0000000000001 -104.43433599533701 597.4
+ vertex -162.241464507947 -80.1417876314735 597.4
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 2.1770599857004374e-16
+ outer loop
+ vertex -166.67783335074787 -105.75777139462686 617.4
+ vertex -162.12500000000009 -103.12919183399713 597.4
+ vertex -166.67783335074787 -105.75777139462686 597.4
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 2.1770599857004374e-16
+ outer loop
+ vertex -162.12500000000009 -103.12919183399713 597.4
+ vertex -166.67783335074787 -105.75777139462686 617.4
+ vertex -162.12500000000009 -103.12919183399713 617.4
+ endloop
+endfacet
+facet normal 0.9964462355504107 0.08423122732939085 1.1785908513506147e-16
+ outer loop
+ vertex -183.66460791148953 -89.3748329241279 617.4
+ vertex -183.7897760078994 -87.89410799071469 597.4
+ vertex -183.7897760078994 -87.89410799071469 617.4
+ endloop
+endfacet
+facet normal 0.9964462355504107 0.08423122732939085 1.1785908513506147e-16
+ outer loop
+ vertex -183.7897760078994 -87.89410799071469 597.4
+ vertex -183.66460791148953 -89.3748329241279 617.4
+ vertex -183.66460791148953 -89.3748329241279 597.4
+ endloop
+endfacet
+facet normal 0.5005724413202164 0.8656946522826156 3.1017246104582295e-16
+ outer loop
+ vertex -165.47279934959994 -116.76041929963289 617.4
+ vertex -166.75922666561993 -116.01656572439916 597.4
+ vertex -166.75922666561993 -116.01656572439916 617.4
+ endloop
+endfacet
+facet normal 0.5005724413202164 0.8656946522826156 3.1017246104582295e-16
+ outer loop
+ vertex -166.75922666561993 -116.01656572439916 597.4
+ vertex -165.47279934959994 -116.76041929963289 617.4
+ vertex -165.47279934959994 -116.76041929963289 597.4
+ endloop
+endfacet
+facet normal 0.42647308217928154 0.9045002543816691 3.1514509491170926e-16
+ outer loop
+ vertex -162.81229488701607 -118.08356152420495 617.4
+ vertex -164.15638755469695 -117.44982003000014 597.4
+ vertex -164.15638755469695 -117.44982003000014 617.4
+ endloop
+endfacet
+facet normal 0.42647308217928154 0.9045002543816691 3.1514509491170926e-16
+ outer loop
+ vertex -164.15638755469695 -117.44982003000014 597.4
+ vertex -162.81229488701607 -118.08356152420495 617.4
+ vertex -162.81229488701607 -118.08356152420495 597.4
+ endloop
+endfacet
+facet normal -0.9999473364568806 -0.010262763409049967 -9.563751771150325e-17
+ outer loop
+ vertex -152.83120430088547 -120.88086243345158 597.4
+ vertex -153.0000000000001 -104.43433599533701 617.4
+ vertex -153.0000000000001 -104.43433599533701 597.4
+ endloop
+endfacet
+facet normal -0.9999473364568806 -0.010262763409049967 -9.563751771150325e-17
+ outer loop
+ vertex -153.0000000000001 -104.43433599533701 617.4
+ vertex -152.83120430088547 -120.88086243345158 597.4
+ vertex -152.83120430088547 -120.88086243345158 617.4
+ endloop
+endfacet
+facet normal 0.9922171154055781 -0.12451986145283667 5.3840833328119346e-17
+ outer loop
+ vertex -183.66951149281203 -81.95780265849703 617.4
+ vertex -183.48447425048 -80.48336222235163 597.4
+ vertex -183.48447425048 -80.48336222235163 617.4
+ endloop
+endfacet
+facet normal 0.9922171154055781 -0.12451986145283667 5.3840833328119346e-17
+ outer loop
+ vertex -183.48447425048 -80.48336222235163 597.4
+ vertex -183.66951149281203 -81.95780265849703 617.4
+ vertex -183.66951149281203 -81.95780265849703 597.4
+ endloop
+endfacet
+facet normal 0.22935485323248844 0.9733428744788262 3.178919571804742e-16
+ outer loop
+ vertex -157.2067960108166 -120.04125580570847 617.4
+ vertex -155.76040280706806 -120.38207845891773 597.4
+ vertex -157.2067960108166 -120.04125580570847 597.4
+ endloop
+endfacet
+facet normal 0.22935485323248844 0.9733428744788262 3.178919571804742e-16
+ outer loop
+ vertex -155.76040280706806 -120.38207845891773 597.4
+ vertex -157.2067960108166 -120.04125580570847 617.4
+ vertex -155.76040280706806 -120.38207845891773 617.4
+ endloop
+endfacet
+facet normal 0.1884462435099412 0.9820835062798846 3.167714557131981e-16
+ outer loop
+ vertex -155.76040280706806 -120.38207845891773 617.4
+ vertex -154.30102097334648 -120.66211067883889 597.4
+ vertex -155.76040280706806 -120.38207845891773 597.4
+ endloop
+endfacet
+facet normal 0.1884462435099412 0.9820835062798846 3.167714557131981e-16
+ outer loop
+ vertex -154.30102097334648 -120.66211067883889 597.4
+ vertex -155.76040280706806 -120.38207845891773 617.4
+ vertex -154.30102097334648 -120.66211067883889 617.4
+ endloop
+endfacet
+facet normal 0.3882711944089147 0.9215451587373646 3.168061329538863e-16
+ outer loop
+ vertex -161.4428733917811 -118.6605347897719 617.4
+ vertex -162.81229488701607 -118.08356152420495 597.4
+ vertex -162.81229488701607 -118.08356152420495 617.4
+ endloop
+endfacet
+facet normal 0.3882711944089147 0.9215451587373646 3.168061329538863e-16
+ outer loop
+ vertex -162.81229488701607 -118.08356152420495 597.4
+ vertex -161.4428733917811 -118.6605347897719 617.4
+ vertex -161.4428733917811 -118.6605347897719 597.4
+ endloop
+endfacet
+facet normal 0.5363402452594351 0.8440018609665794 3.068695668987259e-16
+ outer loop
+ vertex -166.75922666561993 -116.01656572439916 617.4
+ vertex -168.01341836688124 -115.21956098333557 597.4
+ vertex -168.01341836688124 -115.21956098333557 617.4
+ endloop
+endfacet
+facet normal 0.5363402452594351 0.8440018609665794 3.068695668987259e-16
+ outer loop
+ vertex -168.01341836688124 -115.21956098333557 597.4
+ vertex -166.75922666561993 -116.01656572439916 617.4
+ vertex -166.75922666561993 -116.01656572439916 597.4
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 -2.1770599857004372e-16
+ outer loop
+ vertex -155.38557599864262 -104.43433599533701 617.4
+ vertex -170.67210412904055 -113.26001712639702 597.4
+ vertex -155.38557599864262 -104.43433599533701 597.4
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 -2.1770599857004372e-16
+ outer loop
+ vertex -170.67210412904055 -113.26001712639702 597.4
+ vertex -155.38557599864262 -104.43433599533701 617.4
+ vertex -170.67210412904055 -113.26001712639702 617.4
+ endloop
+endfacet
+facet normal 0.3493898658303788 0.9369774392454868 3.179127878275187e-16
+ outer loop
+ vertex -160.05051943746048 -119.1797301736866 617.4
+ vertex -161.4428733917811 -118.6605347897719 597.4
+ vertex -161.4428733917811 -118.6605347897719 617.4
+ endloop
+endfacet
+facet normal 0.3493898658303788 0.9369774392454868 3.179127878275187e-16
+ outer loop
+ vertex -161.4428733917811 -118.6605347897719 597.4
+ vertex -160.05051943746048 -119.1797301736866 617.4
+ vertex -160.05051943746048 -119.1797301736866 597.4
+ endloop
+endfacet
+facet normal 0.6377703208595258 0.7702266016119785 2.9376672002655477e-16
+ outer loop
+ vertex -170.41637626981046 -113.47176732886027 617.4
+ vertex -170.67210412904055 -113.26001712639702 597.4
+ vertex -170.67210412904055 -113.26001712639702 617.4
+ endloop
+endfacet
+facet normal 0.6377703208595258 0.7702266016119785 2.9376672002655477e-16
+ outer loop
+ vertex -170.67210412904055 -113.26001712639702 597.4
+ vertex -170.41637626981046 -113.47176732886027 617.4
+ vertex -170.41637626981046 -113.47176732886027 597.4
+ endloop
+endfacet
+facet normal 0.996556739113654 -0.08291360399331692 6.692383130899362e-17
+ outer loop
+ vertex -183.7927215932388 -83.43869180085149 617.4
+ vertex -183.66951149281203 -81.95780265849703 597.4
+ vertex -183.66951149281203 -81.95780265849703 617.4
+ endloop
+endfacet
+facet normal 0.996556739113654 -0.08291360399331692 6.692383130899362e-17
+ outer loop
+ vertex -183.66951149281203 -81.95780265849703 597.4
+ vertex -183.7927215932388 -83.43869180085149 617.4
+ vertex -183.7927215932388 -83.43869180085149 597.4
+ endloop
+endfacet
+facet normal 1.0547118733938985e-15 -1.0 -3.047983989961054e-16
+ outer loop
+ vertex -153.0000000000001 -104.43433599533701 617.4
+ vertex -155.38557599864262 -104.43433599533701 597.4
+ vertex -153.0000000000001 -104.43433599533701 597.4
+ endloop
+endfacet
+facet normal 1.0547118733938985e-15 -1.0 -3.047983989961054e-16
+ outer loop
+ vertex -155.38557599864262 -104.43433599533701 597.4
+ vertex -153.0000000000001 -104.43433599533701 617.4
+ vertex -155.38557599864262 -104.43433599533701 617.4
+ endloop
+endfacet
+facet normal 0.9576170825074752 -0.2880443078588281 7.978454901593538e-19
+ outer loop
+ vertex -182.13413950932807 -74.7014265051594 617.4
+ vertex -182.56217503533787 -76.12445109007139 597.4
+ vertex -182.13413950932807 -74.7014265051594 597.4
+ endloop
+endfacet
+facet normal 0.9576170825074752 -0.2880443078588281 7.978454901593538e-19
+ outer loop
+ vertex -182.56217503533787 -76.12445109007139 597.4
+ vertex -182.13413950932807 -74.7014265051594 617.4
+ vertex -182.56217503533787 -76.12445109007139 617.4
+ endloop
+endfacet
+facet normal 0.6049992586789453 0.7962260338609424 2.986595129490488e-16
+ outer loop
+ vertex -169.2331797270292 -114.37079976539471 617.4
+ vertex -170.41637626981046 -113.47176732886027 597.4
+ vertex -170.41637626981046 -113.47176732886027 617.4
+ endloop
+endfacet
+facet normal 0.6049992586789453 0.7962260338609424 2.986595129490488e-16
+ outer loop
+ vertex -170.41637626981046 -113.47176732886027 597.4
+ vertex -169.2331797270292 -114.37079976539471 617.4
+ vertex -169.2331797270292 -114.37079976539471 597.4
+ endloop
+endfacet
+facet normal 0.14720786925726986 0.9891055773923907 3.1509663175953245e-16
+ outer loop
+ vertex -154.30102097334648 -120.66211067883889 617.4
+ vertex -152.83120430088547 -120.88086243345158 597.4
+ vertex -154.30102097334648 -120.66211067883889 597.4
+ endloop
+endfacet
+facet normal 0.14720786925726986 0.9891055773923907 3.1509663175953245e-16
+ outer loop
+ vertex -152.83120430088547 -120.88086243345158 597.4
+ vertex -154.30102097334648 -120.66211067883889 617.4
+ vertex -152.83120430088547 -120.88086243345158 617.4
+ endloop
+endfacet
+facet normal 0.9999997814571896 0.0006611244764012646 9.271580545042376e-17
+ outer loop
+ vertex -183.8529065099664 -86.40944374567499 617.4
+ vertex -183.8538889448047 -84.92343822226253 597.4
+ vertex -183.8538889448047 -84.92343822226253 617.4
+ endloop
+endfacet
+facet normal 0.9999997814571896 0.0006611244764012646 9.271580545042376e-17
+ outer loop
+ vertex -183.8538889448047 -84.92343822226253 597.4
+ vertex -183.8529065099664 -86.40944374567499 617.4
+ vertex -183.8529065099664 -86.40944374567499 597.4
+ endloop
+endfacet
+facet normal 0.5711695004343895 0.82083213982734 3.0302967770914086e-16
+ outer loop
+ vertex -168.01341836688124 -115.21956098333557 617.4
+ vertex -169.2331797270292 -114.37079976539471 597.4
+ vertex -169.2331797270292 -114.37079976539471 617.4
+ endloop
+endfacet
+facet normal 0.5711695004343895 0.82083213982734 3.0302967770914086e-16
+ outer loop
+ vertex -169.2331797270292 -114.37079976539471 597.4
+ vertex -168.01341836688124 -115.21956098333557 617.4
+ vertex -168.01341836688124 -115.21956098333557 597.4
+ endloop
+endfacet
+facet normal 0.9861411980746724 -0.165908219988794 4.066361857342156e-17
+ outer loop
+ vertex -183.48447425048 -80.48336222235163 617.4
+ vertex -183.23793366531743 -79.01795063489293 597.4
+ vertex -183.23793366531743 -79.01795063489293 617.4
+ endloop
+endfacet
+facet normal 0.9861411980746724 -0.165908219988794 4.066361857342156e-17
+ outer loop
+ vertex -183.23793366531743 -79.01795063489293 597.4
+ vertex -183.48447425048 -80.48336222235163 617.4
+ vertex -183.48447425048 -80.48336222235163 597.4
+ endloop
+endfacet
+facet normal 0.9688260316082282 -0.24774204422796747 1.4118899179751826e-17
+ outer loop
+ vertex -182.93032116189784 -77.56413223889896 617.4
+ vertex -182.56217503533787 -76.12445109007139 597.4
+ vertex -182.56217503533787 -76.12445109007139 617.4
+ endloop
+endfacet
+facet normal 0.9688260316082282 -0.24774204422796747 1.4118899179751826e-17
+ outer loop
+ vertex -182.56217503533787 -76.12445109007139 597.4
+ vertex -182.93032116189784 -77.56413223889896 617.4
+ vertex -182.93032116189784 -77.56413223889896 597.4
+ endloop
+endfacet
+facet normal 0.9301944916753182 -0.3670670342824267 -2.582513724148415e-17
+ outer loop
+ vertex -181.10149984918363 -71.91527419881093 617.4
+ vertex -181.64696360879714 -73.29754865337445 597.4
+ vertex -181.10149984918363 -71.91527419881093 597.4
+ endloop
+endfacet
+facet normal 0.9301944916753182 -0.3670670342824267 -2.582513724148415e-17
+ outer loop
+ vertex -181.64696360879714 -73.29754865337445 597.4
+ vertex -181.10149984918363 -71.91527419881093 617.4
+ vertex -181.64696360879714 -73.29754865337445 617.4
+ endloop
+endfacet
+facet normal 0.463928679161666 0.8858725532780165 3.129325803730411e-16
+ outer loop
+ vertex -164.15638755469695 -117.44982003000014 617.4
+ vertex -165.47279934959994 -116.76041929963289 597.4
+ vertex -165.47279934959994 -116.76041929963289 617.4
+ endloop
+endfacet
+facet normal 0.463928679161666 0.8858725532780165 3.129325803730411e-16
+ outer loop
+ vertex -165.47279934959994 -116.76041929963289 597.4
+ vertex -164.15638755469695 -117.44982003000014 617.4
+ vertex -164.15638755469695 -117.44982003000014 597.4
+ endloop
+endfacet
+facet normal 0.9990971750681178 0.0424833469833426 1.0537964790030807e-16
+ outer loop
+ vertex -183.7897760078994 -87.89410799071469 617.4
+ vertex -183.8529065099664 -86.40944374567499 597.4
+ vertex -183.8529065099664 -86.40944374567499 617.4
+ endloop
+endfacet
+facet normal 0.9990971750681178 0.0424833469833426 1.0537964790030807e-16
+ outer loop
+ vertex -183.8529065099664 -86.40944374567499 597.4
+ vertex -183.7897760078994 -87.89410799071469 617.4
+ vertex -183.7897760078994 -87.89410799071469 597.4
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -109.18236190979502 -106.43433599533697 604.4681483474218
+ vertex -134.50000000000006 -106.43433599533697 604.4
+ vertex -109.70000000000007 -106.43433599533697 604.4
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -134.50000000000006 -106.43433599533697 604.4
+ vertex -109.18236190979502 -106.43433599533697 604.4681483474218
+ vertex -135.01763809020514 -106.43433599533694 604.4681483474218
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -135.01763809020514 -106.43433599533694 604.4681483474218
+ vertex -109.18236190979502 -106.43433599533697 604.4681483474218
+ vertex -108.70000000000009 -106.43433599533697 604.6679491924311
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -135.01763809020514 -106.43433599533694 604.4681483474218
+ vertex -108.70000000000009 -106.43433599533697 604.6679491924311
+ vertex -135.50000000000009 -106.43433599533691 604.6679491924311
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -135.50000000000009 -106.43433599533691 604.6679491924311
+ vertex -108.70000000000009 -106.43433599533697 604.6679491924311
+ vertex -108.28578643762697 -106.43433599533697 604.9857864376269
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -135.50000000000009 -106.43433599533691 604.6679491924311
+ vertex -108.28578643762697 -106.43433599533697 604.9857864376269
+ vertex -135.91421356237316 -106.43433599533697 604.9857864376269
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -135.91421356237316 -106.43433599533697 604.9857864376269
+ vertex -108.28578643762697 -106.43433599533697 604.9857864376269
+ vertex -107.96794919243118 -106.43433599533697 605.4
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -135.91421356237316 -106.43433599533697 604.9857864376269
+ vertex -107.96794919243118 -106.43433599533697 605.4
+ vertex -136.23205080756895 -106.43433599533697 605.4
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -136.23205080756895 -106.43433599533697 605.4
+ vertex -107.96794919243118 -106.43433599533697 605.4
+ vertex -107.76814834742194 -106.43433599533697 605.8823619097949
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -136.23205080756895 -106.43433599533697 605.4
+ vertex -107.76814834742194 -106.43433599533697 605.8823619097949
+ vertex -136.43185165257825 -106.43433599533697 605.8823619097949
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -136.43185165257825 -106.43433599533697 605.8823619097949
+ vertex -107.76814834742194 -106.43433599533697 605.8823619097949
+ vertex -107.70000000000007 -106.43433599533698 606.3999999999999
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -136.43185165257825 -106.43433599533697 605.8823619097949
+ vertex -107.70000000000007 -106.43433599533698 606.3999999999999
+ vertex -136.50000000000009 -106.43433599533697 606.3999999999999
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -136.50000000000009 -106.43433599533697 606.3999999999999
+ vertex -107.70000000000007 -106.43433599533698 606.3999999999999
+ vertex -107.7000000000001 -106.43433599533698 608.4
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -136.50000000000009 -106.43433599533697 606.3999999999999
+ vertex -107.7000000000001 -106.43433599533698 608.4
+ vertex -136.50000000000009 -106.43433599533697 608.4
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -136.50000000000009 -106.43433599533697 608.4
+ vertex -107.7000000000001 -106.43433599533698 608.4
+ vertex -107.76814834742194 -106.43433599533697 608.9176380902051
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -136.50000000000009 -106.43433599533697 608.4
+ vertex -107.76814834742194 -106.43433599533697 608.9176380902051
+ vertex -136.43185165257825 -106.43433599533697 608.9176380902051
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -136.43185165257825 -106.43433599533697 608.9176380902051
+ vertex -107.76814834742194 -106.43433599533697 608.9176380902051
+ vertex -107.9679491924312 -106.43433599533697 609.4
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -136.43185165257825 -106.43433599533697 608.9176380902051
+ vertex -107.9679491924312 -106.43433599533697 609.4
+ vertex -136.23205080756895 -106.43433599533697 609.4
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -136.23205080756895 -106.43433599533697 609.4
+ vertex -107.9679491924312 -106.43433599533697 609.4
+ vertex -108.285786437627 -106.43433599533697 609.814213562373
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -136.23205080756895 -106.43433599533697 609.4
+ vertex -108.285786437627 -106.43433599533697 609.814213562373
+ vertex -135.9142135623732 -106.43433599533697 609.814213562373
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -135.9142135623732 -106.43433599533697 609.814213562373
+ vertex -108.285786437627 -106.43433599533697 609.814213562373
+ vertex -108.70000000000009 -106.43433599533697 610.1320508075687
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -135.9142135623732 -106.43433599533697 609.814213562373
+ vertex -108.70000000000009 -106.43433599533697 610.1320508075687
+ vertex -135.50000000000009 -106.43433599533694 610.1320508075687
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -135.50000000000009 -106.43433599533694 610.1320508075687
+ vertex -108.70000000000009 -106.43433599533697 610.1320508075687
+ vertex -109.18236190979505 -106.43433599533697 610.331851652578
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -135.50000000000009 -106.43433599533694 610.1320508075687
+ vertex -109.18236190979505 -106.43433599533697 610.331851652578
+ vertex -135.01763809020514 -106.43433599533694 610.331851652578
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -135.01763809020514 -106.43433599533694 610.331851652578
+ vertex -109.18236190979505 -106.43433599533697 610.331851652578
+ vertex -109.70000000000009 -106.43433599533697 610.3999999999999
+ endloop
+endfacet
+facet normal -1.1657341758564144e-15 -1.0 -8.36021050187674e-16
+ outer loop
+ vertex -135.01763809020514 -106.43433599533694 610.331851652578
+ vertex -109.70000000000009 -106.43433599533697 610.3999999999999
+ vertex -134.50000000000006 -106.43433599533697 610.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -159.68365785199265 -63.7115365474229 604.4681483474218
+ vertex -147.02483880689016 -41.785818797484794 604.4
+ vertex -159.42483880689014 -63.26324881133887 604.4
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -147.02483880689016 -41.785818797484794 604.4
+ vertex -159.68365785199265 -63.7115365474229 604.4681483474218
+ vertex -146.76601976178762 -41.337531061400774 604.4681483474218
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -146.76601976178762 -41.337531061400774 604.4681483474218
+ vertex -159.68365785199265 -63.7115365474229 604.4681483474218
+ vertex -159.92483880689014 -64.12927421512332 604.6679491924311
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -146.76601976178762 -41.337531061400774 604.4681483474218
+ vertex -159.92483880689014 -64.12927421512332 604.6679491924311
+ vertex -146.52483880689016 -40.91979339370037 604.6679491924311
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -146.52483880689016 -40.91979339370037 604.6679491924311
+ vertex -159.92483880689014 -64.12927421512332 604.6679491924311
+ vertex -160.1319455880767 -64.48799368273046 604.9857864376269
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -146.52483880689016 -40.91979339370037 604.6679491924311
+ vertex -160.1319455880767 -64.48799368273046 604.9857864376269
+ vertex -146.3177320257036 -40.5610739260932 604.9857864376269
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -146.3177320257036 -40.5610739260932 604.9857864376269
+ vertex -160.1319455880767 -64.48799368273046 604.9857864376269
+ vertex -160.29086421067458 -64.76324881133888 605.4
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -146.3177320257036 -40.5610739260932 604.9857864376269
+ vertex -160.29086421067458 -64.76324881133888 605.4
+ vertex -146.15881340310568 -40.285818797484794 605.4
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -146.15881340310568 -40.285818797484794 605.4
+ vertex -160.29086421067458 -64.76324881133888 605.4
+ vertex -160.3907646331792 -64.9362814188145 605.8823619097949
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -146.15881340310568 -40.285818797484794 605.4
+ vertex -160.3907646331792 -64.9362814188145 605.8823619097949
+ vertex -146.05891298060106 -40.11278619000919 605.8823619097949
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -146.05891298060106 -40.11278619000919 605.8823619097949
+ vertex -160.3907646331792 -64.9362814188145 605.8823619097949
+ vertex -160.42483880689014 -64.99529961890775 606.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -146.05891298060106 -40.11278619000919 605.8823619097949
+ vertex -160.42483880689014 -64.99529961890775 606.3999999999999
+ vertex -146.02483880689016 -40.05376798991592 606.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -146.02483880689016 -40.05376798991592 606.3999999999999
+ vertex -160.42483880689014 -64.99529961890775 606.3999999999999
+ vertex -160.42483880689014 -64.99529961890775 608.4
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -146.02483880689016 -40.05376798991592 606.3999999999999
+ vertex -160.42483880689014 -64.99529961890775 608.4
+ vertex -146.02483880689016 -40.05376798991592 608.4
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -146.02483880689016 -40.05376798991592 608.4
+ vertex -160.42483880689014 -64.99529961890775 608.4
+ vertex -160.3907646331792 -64.9362814188145 608.9176380902051
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -146.02483880689016 -40.05376798991592 608.4
+ vertex -160.3907646331792 -64.9362814188145 608.9176380902051
+ vertex -146.05891298060106 -40.11278619000919 608.9176380902051
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -146.05891298060106 -40.11278619000919 608.9176380902051
+ vertex -160.3907646331792 -64.9362814188145 608.9176380902051
+ vertex -160.29086421067458 -64.76324881133888 609.4
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -146.05891298060106 -40.11278619000919 608.9176380902051
+ vertex -160.29086421067458 -64.76324881133888 609.4
+ vertex -146.15881340310568 -40.285818797484794 609.4
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -146.15881340310568 -40.285818797484794 609.4
+ vertex -160.29086421067458 -64.76324881133888 609.4
+ vertex -160.1319455880767 -64.48799368273048 609.814213562373
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -146.15881340310568 -40.285818797484794 609.4
+ vertex -160.1319455880767 -64.48799368273048 609.814213562373
+ vertex -146.3177320257036 -40.5610739260932 609.814213562373
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -146.3177320257036 -40.5610739260932 609.814213562373
+ vertex -160.1319455880767 -64.48799368273048 609.814213562373
+ vertex -159.92483880689014 -64.12927421512333 610.1320508075687
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -146.3177320257036 -40.5610739260932 609.814213562373
+ vertex -159.92483880689014 -64.12927421512333 610.1320508075687
+ vertex -146.52483880689016 -40.91979339370037 610.1320508075687
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -146.52483880689016 -40.91979339370037 610.1320508075687
+ vertex -159.92483880689014 -64.12927421512333 610.1320508075687
+ vertex -159.68365785199265 -63.7115365474229 610.331851652578
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -146.52483880689016 -40.91979339370037 610.1320508075687
+ vertex -159.68365785199265 -63.7115365474229 610.331851652578
+ vertex -146.76601976178762 -41.337531061400774 610.331851652578
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -146.76601976178762 -41.337531061400774 610.331851652578
+ vertex -159.68365785199265 -63.7115365474229 610.331851652578
+ vertex -159.42483880689014 -63.26324881133887 610.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844389 0.4999999999999998 -4.5316418029497855e-16
+ outer loop
+ vertex -146.76601976178762 -41.337531061400774 610.331851652578
+ vertex -159.42483880689014 -63.26324881133887 610.3999999999999
+ vertex -147.02483880689016 -41.785818797484794 610.3999999999999
+ endloop
+endfacet
+facet normal -5.32306105110957e-31 -8.360210501876742e-16 1.0
+ outer loop
+ vertex -134.50000000000006 -104.43433599533697 610.3999999999999
+ vertex -109.70000000000009 -106.43433599533697 610.3999999999999
+ vertex -109.70000000000005 -104.43433599533701 610.3999999999999
+ endloop
+endfacet
+facet normal -5.32306105110957e-31 -8.360210501876742e-16 1.0
+ outer loop
+ vertex -109.70000000000009 -106.43433599533697 610.3999999999999
+ vertex -134.50000000000006 -104.43433599533697 610.3999999999999
+ vertex -134.50000000000006 -106.43433599533697 610.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738074 -1.3877787807814453e-15 -0.13052619222007458
+ outer loop
+ vertex -107.70000000000005 -104.43433599533701 606.3999999999999
+ vertex -107.76814834742194 -106.43433599533697 605.8823619097949
+ vertex -107.76814834742193 -104.43433599533701 605.8823619097949
+ endloop
+endfacet
+facet normal 0.9914448613738074 -1.3877787807814453e-15 -0.13052619222007458
+ outer loop
+ vertex -107.76814834742194 -106.43433599533697 605.8823619097949
+ vertex -107.70000000000005 -104.43433599533701 606.3999999999999
+ vertex -107.70000000000007 -106.43433599533698 606.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087046 1.6653345369377356e-16 0.7933533402912474
+ outer loop
+ vertex -135.91421356237316 -104.43433599533698 609.814213562373
+ vertex -135.50000000000009 -106.43433599533694 610.1320508075687
+ vertex -135.50000000000006 -104.43433599533697 610.1320508075687
+ endloop
+endfacet
+facet normal -0.6087614290087046 1.6653345369377356e-16 0.7933533402912474
+ outer loop
+ vertex -135.50000000000009 -106.43433599533694 610.1320508075687
+ vertex -135.91421356237316 -104.43433599533698 609.814213562373
+ vertex -135.9142135623732 -106.43433599533697 609.814213562373
+ endloop
+endfacet
+facet normal 0.13052619221998926 -1.0200174038743624e-15 0.9914448613738187
+ outer loop
+ vertex -109.70000000000005 -104.43433599533701 610.3999999999999
+ vertex -109.18236190979505 -106.43433599533697 610.331851652578
+ vertex -109.18236190979502 -104.43433599533701 610.331851652578
+ endloop
+endfacet
+facet normal 0.13052619221998926 -1.0200174038743624e-15 0.9914448613738187
+ outer loop
+ vertex -109.18236190979505 -106.43433599533697 610.331851652578
+ vertex -109.70000000000005 -104.43433599533701 610.3999999999999
+ vertex -109.70000000000009 -106.43433599533697 610.3999999999999
+ endloop
+endfacet
+facet normal -0.38268343236514923 -2.2204460492503118e-16 0.9238795325112623
+ outer loop
+ vertex -135.50000000000006 -104.43433599533697 610.1320508075687
+ vertex -135.01763809020514 -106.43433599533694 610.331851652578
+ vertex -135.0176380902051 -104.43433599533697 610.331851652578
+ endloop
+endfacet
+facet normal -0.38268343236514923 -2.2204460492503118e-16 0.9238795325112623
+ outer loop
+ vertex -135.01763809020514 -106.43433599533694 610.331851652578
+ vertex -135.50000000000006 -104.43433599533697 610.1320508075687
+ vertex -135.50000000000009 -106.43433599533694 610.1320508075687
+ endloop
+endfacet
+facet normal -0.9914448613738114 1.4988010832439607e-15 -0.13052619222004416
+ outer loop
+ vertex -136.43185165257822 -104.43433599533697 605.8823619097949
+ vertex -136.50000000000009 -106.43433599533697 606.3999999999999
+ vertex -136.50000000000006 -104.43433599533698 606.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738114 1.4988010832439607e-15 -0.13052619222004416
+ outer loop
+ vertex -136.50000000000009 -106.43433599533697 606.3999999999999
+ vertex -136.43185165257822 -104.43433599533697 605.8823619097949
+ vertex -136.43185165257825 -106.43433599533697 605.8823619097949
+ endloop
+endfacet
+facet normal 0.3826834323651558 -1.3322676295501875e-15 0.9238795325112594
+ outer loop
+ vertex -109.18236190979502 -104.43433599533701 610.331851652578
+ vertex -108.70000000000009 -106.43433599533697 610.1320508075687
+ vertex -108.70000000000007 -104.43433599533701 610.1320508075687
+ endloop
+endfacet
+facet normal 0.3826834323651558 -1.3322676295501875e-15 0.9238795325112594
+ outer loop
+ vertex -108.70000000000009 -106.43433599533697 610.1320508075687
+ vertex -109.18236190979502 -104.43433599533701 610.331851652578
+ vertex -109.18236190979505 -106.43433599533697 610.331851652578
+ endloop
+endfacet
+facet normal -0.6087614290087046 1.5543122344752186e-15 -0.7933533402912474
+ outer loop
+ vertex -135.50000000000009 -106.43433599533691 604.6679491924311
+ vertex -135.91421356237313 -104.43433599533697 604.9857864376269
+ vertex -135.50000000000006 -104.43433599533697 604.6679491924311
+ endloop
+endfacet
+facet normal -0.6087614290087046 1.5543122344752186e-15 -0.7933533402912474
+ outer loop
+ vertex -135.91421356237313 -104.43433599533697 604.9857864376269
+ vertex -135.50000000000009 -106.43433599533691 604.6679491924311
+ vertex -135.91421356237316 -106.43433599533697 604.9857864376269
+ endloop
+endfacet
+facet normal -0.9238795325112612 1.0547118733938985e-15 0.38268343236515173
+ outer loop
+ vertex -136.43185165257825 -106.43433599533697 608.9176380902051
+ vertex -136.23205080756892 -104.43433599533698 609.4
+ vertex -136.43185165257822 -104.43433599533697 608.9176380902051
+ endloop
+endfacet
+facet normal -0.9238795325112612 1.0547118733938985e-15 0.38268343236515173
+ outer loop
+ vertex -136.23205080756892 -104.43433599533698 609.4
+ vertex -136.43185165257825 -106.43433599533697 608.9176380902051
+ vertex -136.23205080756895 -106.43433599533697 609.4
+ endloop
+endfacet
+facet normal -0.9914448613738145 1.3877787807814453e-15 0.13052619222002182
+ outer loop
+ vertex -136.50000000000009 -106.43433599533697 608.4
+ vertex -136.43185165257822 -104.43433599533697 608.9176380902051
+ vertex -136.50000000000006 -104.43433599533698 608.4
+ endloop
+endfacet
+facet normal -0.9914448613738145 1.3877787807814453e-15 0.13052619222002182
+ outer loop
+ vertex -136.43185165257822 -104.43433599533697 608.9176380902051
+ vertex -136.50000000000009 -106.43433599533697 608.4
+ vertex -136.43185165257825 -106.43433599533697 608.9176380902051
+ endloop
+endfacet
+facet normal 0.6087614290086943 -1.5543122344752186e-15 0.7933533402912555
+ outer loop
+ vertex -108.70000000000007 -104.43433599533701 610.1320508075687
+ vertex -108.285786437627 -106.43433599533697 609.814213562373
+ vertex -108.28578643762695 -104.43433599533701 609.814213562373
+ endloop
+endfacet
+facet normal 0.6087614290086943 -1.5543122344752186e-15 0.7933533402912555
+ outer loop
+ vertex -108.285786437627 -106.43433599533697 609.814213562373
+ vertex -108.70000000000007 -104.43433599533701 610.1320508075687
+ vertex -108.70000000000009 -106.43433599533697 610.1320508075687
+ endloop
+endfacet
+facet normal 0.6087614290086942 -1.6653345369377356e-16 -0.7933533402912555
+ outer loop
+ vertex -108.28578643762697 -106.43433599533697 604.9857864376269
+ vertex -108.70000000000005 -104.43433599533701 604.6679491924311
+ vertex -108.28578643762695 -104.43433599533701 604.9857864376269
+ endloop
+endfacet
+facet normal 0.6087614290086942 -1.6653345369377356e-16 -0.7933533402912555
+ outer loop
+ vertex -108.70000000000005 -104.43433599533701 604.6679491924311
+ vertex -108.28578643762697 -106.43433599533697 604.9857864376269
+ vertex -108.70000000000009 -106.43433599533697 604.6679491924311
+ endloop
+endfacet
+facet normal -0.13052619221998404 -6.383782391594649e-16 0.9914448613738194
+ outer loop
+ vertex -135.0176380902051 -104.43433599533697 610.331851652578
+ vertex -134.50000000000006 -106.43433599533697 610.3999999999999
+ vertex -134.50000000000006 -104.43433599533697 610.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619221998404 -6.383782391594649e-16 0.9914448613738194
+ outer loop
+ vertex -134.50000000000006 -106.43433599533697 610.3999999999999
+ vertex -135.0176380902051 -104.43433599533697 610.331851652578
+ vertex -135.01763809020514 -106.43433599533694 610.331851652578
+ endloop
+endfacet
+facet normal -0.9238795325112865 1.6653345369377344e-15 -0.38268343236509067
+ outer loop
+ vertex -136.23205080756892 -104.43433599533698 605.4
+ vertex -136.43185165257825 -106.43433599533697 605.8823619097949
+ vertex -136.43185165257822 -104.43433599533697 605.8823619097949
+ endloop
+endfacet
+facet normal -0.9238795325112865 1.6653345369377344e-15 -0.38268343236509067
+ outer loop
+ vertex -136.43185165257825 -106.43433599533697 605.8823619097949
+ vertex -136.23205080756892 -104.43433599533698 605.4
+ vertex -136.23205080756895 -106.43433599533697 605.4
+ endloop
+endfacet
+facet normal -0.38268343236516233 1.3322676295501875e-15 -0.9238795325112567
+ outer loop
+ vertex -135.01763809020514 -106.43433599533694 604.4681483474218
+ vertex -135.50000000000006 -104.43433599533697 604.6679491924311
+ vertex -135.0176380902051 -104.43433599533697 604.4681483474218
+ endloop
+endfacet
+facet normal -0.38268343236516233 1.3322676295501875e-15 -0.9238795325112567
+ outer loop
+ vertex -135.50000000000006 -104.43433599533697 604.6679491924311
+ vertex -135.01763809020514 -106.43433599533694 604.4681483474218
+ vertex -135.50000000000009 -106.43433599533691 604.6679491924311
+ endloop
+endfacet
+facet normal 0.1305261922199893 6.314393452555577e-16 -0.9914448613738187
+ outer loop
+ vertex -109.18236190979502 -106.43433599533697 604.4681483474218
+ vertex -109.70000000000005 -104.43433599533701 604.4
+ vertex -109.18236190979502 -104.43433599533698 604.4681483474218
+ endloop
+endfacet
+facet normal 0.1305261922199893 6.314393452555577e-16 -0.9914448613738187
+ outer loop
+ vertex -109.70000000000005 -104.43433599533701 604.4
+ vertex -109.18236190979502 -106.43433599533697 604.4681483474218
+ vertex -109.70000000000007 -106.43433599533697 604.4
+ endloop
+endfacet
+facet normal -1.0 1.443289932012703e-15 5.933957380480162e-32
+ outer loop
+ vertex -136.50000000000009 -106.43433599533697 606.3999999999999
+ vertex -136.50000000000006 -104.43433599533698 608.4
+ vertex -136.50000000000006 -104.43433599533698 606.3999999999999
+ endloop
+endfacet
+facet normal -1.0 1.443289932012703e-15 5.933957380480162e-32
+ outer loop
+ vertex -136.50000000000006 -104.43433599533698 608.4
+ vertex -136.50000000000009 -106.43433599533697 606.3999999999999
+ vertex -136.50000000000009 -106.43433599533697 608.4
+ endloop
+endfacet
+facet normal 0.9914448613738116 -1.5543122344752188e-15 0.13052619222004302
+ outer loop
+ vertex -107.76814834742194 -106.43433599533697 608.9176380902051
+ vertex -107.70000000000005 -104.43433599533701 608.4
+ vertex -107.76814834742193 -104.43433599533701 608.9176380902051
+ endloop
+endfacet
+facet normal 0.9914448613738116 -1.5543122344752188e-15 0.13052619222004302
+ outer loop
+ vertex -107.70000000000005 -104.43433599533701 608.4
+ vertex -107.76814834742194 -106.43433599533697 608.9176380902051
+ vertex -107.7000000000001 -106.43433599533698 608.4
+ endloop
+endfacet
+facet normal -0.793353340291217 6.661338147750938e-16 0.6087614290087443
+ outer loop
+ vertex -136.23205080756895 -106.43433599533697 609.4
+ vertex -135.91421356237316 -104.43433599533698 609.814213562373
+ vertex -136.23205080756892 -104.43433599533698 609.4
+ endloop
+endfacet
+facet normal -0.793353340291217 6.661338147750938e-16 0.6087614290087443
+ outer loop
+ vertex -135.91421356237316 -104.43433599533698 609.814213562373
+ vertex -136.23205080756895 -106.43433599533697 609.4
+ vertex -135.9142135623732 -106.43433599533697 609.814213562373
+ endloop
+endfacet
+facet normal 0.7933533402912081 -6.106226635438362e-16 -0.6087614290087562
+ outer loop
+ vertex -107.96794919243118 -104.43433599533698 605.4
+ vertex -108.28578643762697 -106.43433599533697 604.9857864376269
+ vertex -108.28578643762695 -104.43433599533701 604.9857864376269
+ endloop
+endfacet
+facet normal 0.7933533402912081 -6.106226635438362e-16 -0.6087614290087562
+ outer loop
+ vertex -108.28578643762697 -106.43433599533697 604.9857864376269
+ vertex -107.96794919243118 -104.43433599533698 605.4
+ vertex -107.96794919243118 -106.43433599533697 605.4
+ endloop
+endfacet
+facet normal 0.9238795325113006 -1.0547118733938983e-15 -0.3826834323650562
+ outer loop
+ vertex -107.76814834742193 -104.43433599533701 605.8823619097949
+ vertex -107.96794919243118 -106.43433599533697 605.4
+ vertex -107.96794919243118 -104.43433599533698 605.4
+ endloop
+endfacet
+facet normal 0.9238795325113006 -1.0547118733938983e-15 -0.3826834323650562
+ outer loop
+ vertex -107.96794919243118 -106.43433599533697 605.4
+ vertex -107.76814834742193 -104.43433599533701 605.8823619097949
+ vertex -107.76814834742194 -106.43433599533697 605.8823619097949
+ endloop
+endfacet
+facet normal 4.830022985346437e-31 8.36021050187674e-16 -1.0
+ outer loop
+ vertex -109.70000000000007 -106.43433599533697 604.4
+ vertex -134.50000000000006 -104.43433599533697 604.4
+ vertex -109.70000000000005 -104.43433599533701 604.4
+ endloop
+endfacet
+facet normal 4.830022985346437e-31 8.36021050187674e-16 -1.0
+ outer loop
+ vertex -134.50000000000006 -104.43433599533697 604.4
+ vertex -109.70000000000007 -106.43433599533697 604.4
+ vertex -134.50000000000006 -106.43433599533697 604.4
+ endloop
+endfacet
+facet normal -0.793353340291199 1.6098233857064766e-15 -0.6087614290087678
+ outer loop
+ vertex -135.91421356237313 -104.43433599533697 604.9857864376269
+ vertex -136.23205080756895 -106.43433599533697 605.4
+ vertex -136.23205080756892 -104.43433599533698 605.4
+ endloop
+endfacet
+facet normal -0.793353340291199 1.6098233857064766e-15 -0.6087614290087678
+ outer loop
+ vertex -136.23205080756895 -106.43433599533697 605.4
+ vertex -135.91421356237313 -104.43433599533697 604.9857864376269
+ vertex -135.91421356237316 -106.43433599533697 604.9857864376269
+ endloop
+endfacet
+facet normal -0.13052619221998404 1.0269562977782696e-15 -0.9914448613738194
+ outer loop
+ vertex -134.50000000000006 -106.43433599533697 604.4
+ vertex -135.0176380902051 -104.43433599533697 604.4681483474218
+ vertex -134.50000000000006 -104.43433599533697 604.4
+ endloop
+endfacet
+facet normal -0.13052619221998404 1.0269562977782696e-15 -0.9914448613738194
+ outer loop
+ vertex -135.0176380902051 -104.43433599533697 604.4681483474218
+ vertex -134.50000000000006 -106.43433599533697 604.4
+ vertex -135.01763809020514 -106.43433599533694 604.4681483474218
+ endloop
+endfacet
+facet normal 1.0 -1.443289932012703e-15 2.4421626117070182e-15
+ outer loop
+ vertex -107.7000000000001 -106.43433599533698 608.4
+ vertex -107.70000000000005 -104.43433599533701 606.3999999999999
+ vertex -107.70000000000005 -104.43433599533701 608.4
+ endloop
+endfacet
+facet normal 1.0 -1.443289932012703e-15 2.4421626117070182e-15
+ outer loop
+ vertex -107.70000000000005 -104.43433599533701 606.3999999999999
+ vertex -107.7000000000001 -106.43433599533698 608.4
+ vertex -107.70000000000007 -106.43433599533698 606.3999999999999
+ endloop
+endfacet
+facet normal 0.38268343236515573 1.9428902930940222e-16 -0.9238795325112594
+ outer loop
+ vertex -108.70000000000009 -106.43433599533697 604.6679491924311
+ vertex -109.18236190979502 -104.43433599533698 604.4681483474218
+ vertex -108.70000000000005 -104.43433599533701 604.6679491924311
+ endloop
+endfacet
+facet normal 0.38268343236515573 1.9428902930940222e-16 -0.9238795325112594
+ outer loop
+ vertex -109.18236190979502 -104.43433599533698 604.4681483474218
+ vertex -108.70000000000009 -106.43433599533697 604.6679491924311
+ vertex -109.18236190979502 -106.43433599533697 604.4681483474218
+ endloop
+endfacet
+facet normal 0.9238795325112721 -1.6653345369377348e-15 0.3826834323651253
+ outer loop
+ vertex -107.9679491924312 -106.43433599533697 609.4
+ vertex -107.76814834742193 -104.43433599533701 608.9176380902051
+ vertex -107.96794919243118 -104.43433599533701 609.4
+ endloop
+endfacet
+facet normal 0.9238795325112721 -1.6653345369377348e-15 0.3826834323651253
+ outer loop
+ vertex -107.76814834742193 -104.43433599533701 608.9176380902051
+ vertex -107.9679491924312 -106.43433599533697 609.4
+ vertex -107.76814834742194 -106.43433599533697 608.9176380902051
+ endloop
+endfacet
+facet normal 0.793353340291208 -1.6653345369377344e-15 0.6087614290087562
+ outer loop
+ vertex -108.285786437627 -106.43433599533697 609.814213562373
+ vertex -107.96794919243118 -104.43433599533701 609.4
+ vertex -108.28578643762695 -104.43433599533701 609.814213562373
+ endloop
+endfacet
+facet normal 0.793353340291208 -1.6653345369377344e-15 0.6087614290087562
+ outer loop
+ vertex -107.96794919243118 -104.43433599533701 609.4
+ vertex -108.285786437627 -106.43433599533697 609.814213562373
+ vertex -107.9679491924312 -106.43433599533697 609.4
+ endloop
+endfacet
+facet normal -0.10571189404138018 -0.9943967998028674 -3.128704161156741e-16
+ outer loop
+ vertex -151.60819479272956 -124.02712191759254 617.4
+ vertex -153.21066695824285 -123.85676701721619 597.4
+ vertex -151.60819479272956 -124.02712191759254 597.4
+ endloop
+endfacet
+facet normal -0.10571189404138018 -0.9943967998028674 -3.128704161156741e-16
+ outer loop
+ vertex -153.21066695824285 -123.85676701721619 597.4
+ vertex -151.60819479272956 -124.02712191759254 617.4
+ vertex -153.21066695824285 -123.85676701721619 617.4
+ endloop
+endfacet
+facet normal -0.6377703208595383 -0.7702266016119681 -2.9376672002655275e-16
+ outer loop
+ vertex -172.28093853645186 -115.8219604174845 597.4
+ vertex -173.52216003924207 -114.79419244058586 617.4
+ vertex -173.52216003924207 -114.79419244058586 597.4
+ endloop
+endfacet
+facet normal -0.6377703208595383 -0.7702266016119681 -2.9376672002655275e-16
+ outer loop
+ vertex -173.52216003924207 -114.79419244058586 617.4
+ vertex -172.28093853645186 -115.8219604174845 597.4
+ vertex -172.28093853645186 -115.8219604174845 617.4
+ endloop
+endfacet
+facet normal -0.1884462435099426 -0.9820835062798843 -3.1677145571319815e-16
+ outer loop
+ vertex -154.80461230967546 -123.6195412808944 617.4
+ vertex -156.38724158134568 -123.3158598330256 597.4
+ vertex -154.80461230967546 -123.6195412808944 597.4
+ endloop
+endfacet
+facet normal -0.1884462435099426 -0.9820835062798843 -3.1677145571319815e-16
+ outer loop
+ vertex -156.38724158134568 -123.3158598330256 597.4
+ vertex -154.80461230967546 -123.6195412808944 617.4
+ vertex -156.38724158134568 -123.3158598330256 617.4
+ endloop
+endfacet
+facet normal -0.8090947071516228 -0.5876782749593777 -2.5397624073309867e-16
+ outer loop
+ vertex -179.02654971579267 -108.92919478062035 597.4
+ vertex -179.97359427394687 -107.62533725842033 617.4
+ vertex -179.97359427394687 -107.62533725842033 597.4
+ endloop
+endfacet
+facet normal -0.8090947071516228 -0.5876782749593777 -2.5397624073309867e-16
+ outer loop
+ vertex -179.97359427394687 -107.62533725842033 617.4
+ vertex -179.02654971579267 -108.92919478062035 597.4
+ vertex -179.02654971579267 -108.92919478062035 617.4
+ endloop
+endfacet
+facet normal -0.06403093220853912 -0.9979479143324594 -3.100967044653076e-16
+ outer loop
+ vertex -150.0000000000001 -124.13030787576982 617.4
+ vertex -151.60819479272956 -124.02712191759254 597.4
+ vertex -150.0000000000001 -124.13030787576982 597.4
+ endloop
+endfacet
+facet normal -0.06403093220853912 -0.9979479143324594 -3.100967044653076e-16
+ outer loop
+ vertex -151.60819479272956 -124.02712191759254 597.4
+ vertex -150.0000000000001 -124.13030787576982 617.4
+ vertex -151.60819479272956 -124.02712191759254 617.4
+ endloop
+endfacet
+facet normal -0.832965141375823 -0.5533254677427698 -2.45713916987015e-16
+ outer loop
+ vertex -179.97359427394687 -107.62533725842033 597.4
+ vertex -180.86527922376087 -106.28301249011633 617.4
+ vertex -180.86527922376087 -106.28301249011633 597.4
+ endloop
+endfacet
+facet normal -0.832965141375823 -0.5533254677427698 -2.45713916987015e-16
+ outer loop
+ vertex -180.86527922376087 -106.28301249011633 617.4
+ vertex -179.97359427394687 -107.62533725842033 597.4
+ vertex -179.97359427394687 -107.62533725842033 617.4
+ endloop
+endfacet
+facet normal -0.9961946980917452 -0.08715574274766245 -1.1872720193645655e-16
+ outer loop
+ vertex -121.05538705967454 -96.35900127253036 597.4
+ vertex -121.11730055134134 -95.65132682453225 617.4
+ vertex -121.11730055134134 -95.65132682453225 597.4
+ endloop
+endfacet
+facet normal -0.9961946980917452 -0.08715574274766245 -1.1872720193645655e-16
+ outer loop
+ vertex -121.11730055134134 -95.65132682453225 617.4
+ vertex -121.05538705967454 -96.35900127253036 597.4
+ vertex -121.05538705967454 -96.35900127253038 617.4
+ endloop
+endfacet
+facet normal -0.9961946980917453 0.0871557427476599 -6.559734023084946e-17
+ outer loop
+ vertex -121.11730055134134 -97.06667572052851 597.4
+ vertex -121.05538705967454 -96.35900127253038 617.4
+ vertex -121.05538705967454 -96.35900127253036 597.4
+ endloop
+endfacet
+facet normal -0.9961946980917453 0.0871557427476599 -6.559734023084946e-17
+ outer loop
+ vertex -121.05538705967454 -96.35900127253038 617.4
+ vertex -121.11730055134134 -97.06667572052851 597.4
+ vertex -121.11730055134134 -97.06667572052851 617.4
+ endloop
+endfacet
+facet normal -0.4639286791616627 -0.8858725532780182 -3.129325803730414e-16
+ outer loop
+ vertex -165.49228244115207 -120.13596687117304 597.4
+ vertex -166.9198675953899 -119.38834500102291 617.4
+ vertex -166.9198675953899 -119.38834500102291 597.4
+ endloop
+endfacet
+facet normal -0.4639286791616627 -0.8858725532780182 -3.129325803730414e-16
+ outer loop
+ vertex -166.9198675953899 -119.38834500102291 617.4
+ vertex -165.49228244115207 -120.13596687117304 597.4
+ vertex -165.49228244115207 -120.13596687117304 617.4
+ endloop
+endfacet
+facet normal -0.7571505514688204 -0.6532404170062207 -2.6915389863122445e-16
+ outer loop
+ vertex -176.9731047312377 -111.4124528448287 597.4
+ vertex -178.02580279487614 -110.19230341949638 617.4
+ vertex -178.02580279487614 -110.19230341949638 597.4
+ endloop
+endfacet
+facet normal -0.7571505514688204 -0.6532404170062207 -2.6915389863122445e-16
+ outer loop
+ vertex -178.02580279487614 -110.19230341949638 617.4
+ vertex -176.9731047312377 -111.4124528448287 597.4
+ vertex -176.9731047312377 -111.4124528448287 617.4
+ endloop
+endfacet
+facet normal -0.22935485323249694 -0.9733428744788242 -3.178919571804744e-16
+ outer loop
+ vertex -156.38724158134568 -123.3158598330256 617.4
+ vertex -157.95578530972676 -122.9462540897214 597.4
+ vertex -156.38724158134568 -123.3158598330256 597.4
+ endloop
+endfacet
+facet normal -0.22935485323249694 -0.9733428744788242 -3.178919571804744e-16
+ outer loop
+ vertex -157.95578530972676 -122.9462540897214 597.4
+ vertex -156.38724158134568 -123.3158598330256 617.4
+ vertex -157.95578530972676 -122.9462540897214 617.4
+ endloop
+endfacet
+facet normal -0.2698621119172056 -0.9628989773343752 -3.184561753812833e-16
+ outer loop
+ vertex -157.95578530972676 -122.9462540897214 597.4
+ vertex -159.5074986797672 -122.51137082887453 617.4
+ vertex -159.5074986797672 -122.51137082887453 597.4
+ endloop
+endfacet
+facet normal -0.2698621119172056 -0.9628989773343752 -3.184561753812833e-16
+ outer loop
+ vertex -159.5074986797672 -122.51137082887453 617.4
+ vertex -157.95578530972676 -122.9462540897214 597.4
+ vertex -157.95578530972676 -122.9462540897214 617.4
+ endloop
+endfacet
+facet normal -0.9659258262890692 -0.25881904510251724 -1.6824959769008343e-16
+ outer loop
+ vertex -121.11730055134134 -95.65132682453225 597.4
+ vertex -121.3011598162272 -94.965154706536 617.4
+ vertex -121.3011598162272 -94.96515470653598 597.4
+ endloop
+endfacet
+facet normal -0.9659258262890692 -0.25881904510251724 -1.6824959769008343e-16
+ outer loop
+ vertex -121.3011598162272 -94.965154706536 617.4
+ vertex -121.11730055134134 -95.65132682453225 597.4
+ vertex -121.11730055134134 -95.65132682453225 617.4
+ endloop
+endfacet
+facet normal -0.3882711944089187 -0.9215451587373632 -3.1680613295388623e-16
+ outer loop
+ vertex -162.54960709458362 -121.44892868430706 597.4
+ vertex -164.0346787143162 -120.8232289819003 617.4
+ vertex -164.0346787143162 -120.8232289819003 597.4
+ endloop
+endfacet
+facet normal -0.3882711944089187 -0.9215451587373632 -3.1680613295388623e-16
+ outer loop
+ vertex -164.0346787143162 -120.8232289819003 617.4
+ vertex -162.54960709458362 -121.44892868430706 597.4
+ vertex -162.54960709458362 -121.44892868430706 617.4
+ endloop
+endfacet
+facet normal -0.5005724413202218 -0.8656946522826123 -3.1017246104582245e-16
+ outer loop
+ vertex -166.9198675953899 -119.38834500102291 597.4
+ vertex -168.31493602721872 -118.58167164467494 617.4
+ vertex -168.31493602721872 -118.58167164467494 597.4
+ endloop
+endfacet
+facet normal -0.5005724413202218 -0.8656946522826123 -3.1017246104582245e-16
+ outer loop
+ vertex -168.31493602721872 -118.58167164467494 617.4
+ vertex -166.9198675953899 -119.38834500102291 597.4
+ vertex -166.9198675953899 -119.38834500102291 617.4
+ endloop
+endfacet
+facet normal -0.8553779590758187 -0.5180043891004082 -2.3702161526486e-16
+ outer loop
+ vertex -180.86527922376087 -106.28301249011633 597.4
+ vertex -181.70004419415466 -104.90456942726227 617.4
+ vertex -181.70004419415466 -104.90456942726227 597.4
+ endloop
+endfacet
+facet normal -0.8553779590758187 -0.5180043891004082 -2.3702161526486e-16
+ outer loop
+ vertex -181.70004419415466 -104.90456942726227 617.4
+ vertex -180.86527922376087 -106.28301249011633 597.4
+ vertex -180.86527922376087 -106.28301249011633 617.4
+ endloop
+endfacet
+facet normal -0.258819045102516 0.9659258262890695 2.70468178479878e-16
+ outer loop
+ vertex -124.42304733448304 -100.3724225036702 617.4
+ vertex -123.73687521648677 -100.18856323878435 597.4
+ vertex -124.42304733448304 -100.3724225036702 597.4
+ endloop
+endfacet
+facet normal -0.258819045102516 0.9659258262890695 2.70468178479878e-16
+ outer loop
+ vertex -123.73687521648677 -100.18856323878435 597.4
+ vertex -124.42304733448304 -100.3724225036702 617.4
+ vertex -123.73687521648677 -100.18856323878435 617.4
+ endloop
+endfacet
+facet normal -0.6694253404686544 -0.7428793398247298 -2.8835986090356186e-16
+ outer loop
+ vertex -173.52216003924207 -114.79419244058586 597.4
+ vertex -174.7193113822874 -113.71541234474994 617.4
+ vertex -174.7193113822874 -113.71541234474994 597.4
+ endloop
+endfacet
+facet normal -0.6694253404686544 -0.7428793398247298 -2.8835986090356186e-16
+ outer loop
+ vertex -174.7193113822874 -113.71541234474994 617.4
+ vertex -173.52216003924207 -114.79419244058586 597.4
+ vertex -173.52216003924207 -114.79419244058586 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844388 -0.49999999999999983 -2.325189473563781e-16
+ outer loop
+ vertex -121.6013783836058 -94.32133391112707 597.4
+ vertex -142.45782590751944 -58.19690713431459 617.4
+ vertex -142.4578259075194 -58.19690713431459 597.4
+ endloop
+endfacet
+facet normal -0.8660254037844388 -0.49999999999999983 -2.325189473563781e-16
+ outer loop
+ vertex -142.45782590751944 -58.19690713431459 617.4
+ vertex -121.6013783836058 -94.32133391112707 597.4
+ vertex -121.6013783836058 -94.32133391112707 617.4
+ endloop
+endfacet
+facet normal 0.2588190451025141 -0.9659258262890701 -2.704681784798784e-16
+ outer loop
+ vertex -146.7223783245469 -56.1734619901068 617.4
+ vertex -147.40855044254315 -56.35732125499265 597.4
+ vertex -146.72237832454687 -56.1734619901068 597.4
+ endloop
+endfacet
+facet normal 0.2588190451025141 -0.9659258262890701 -2.704681784798784e-16
+ outer loop
+ vertex -147.40855044254315 -56.35732125499265 597.4
+ vertex -146.7223783245469 -56.1734619901068 617.4
+ vertex -147.40855044254315 -56.35732125499265 617.4
+ endloop
+endfacet
+facet normal -0.6071044080923507 -0.7946220722298348 -2.9836538446986723e-16
+ outer loop
+ vertex -143.39512921140332 -57.06499570299079 597.4
+ vertex -143.42990957836216 -57.03842292728556 617.4
+ vertex -143.42990957836216 -57.03842292728556 597.4
+ endloop
+endfacet
+facet normal -0.6071044080923507 -0.7946220722298348 -2.9836538446986723e-16
+ outer loop
+ vertex -143.42990957836216 -57.03842292728556 617.4
+ vertex -143.39512921140332 -57.06499570299079 597.4
+ vertex -143.39512921140332 -57.06499570299079 617.4
+ endloop
+endfacet
+facet normal -0.8152236677528554 -0.5791462436514476 -2.5194270784799017e-16
+ outer loop
+ vertex -142.4853604776734 -58.14921585984331 597.4
+ vertex -142.89319062544635 -57.575141880201365 617.4
+ vertex -142.89319062544635 -57.575141880201365 597.4
+ endloop
+endfacet
+facet normal -0.8152236677528554 -0.5791462436514476 -2.5194270784799017e-16
+ outer loop
+ vertex -142.89319062544635 -57.575141880201365 617.4
+ vertex -142.4853604776734 -58.14921585984331 597.4
+ vertex -142.4853604776734 -58.149215859843316 617.4
+ endloop
+endfacet
+facet normal -0.5713404822174107 -0.8207131370823649 -3.0300922412569866e-16
+ outer loop
+ vertex -143.42990957836216 -57.03842292728556 597.4
+ vertex -143.97703651514544 -56.657539822371284 617.4
+ vertex -143.97703651514541 -56.65753982237127 597.4
+ endloop
+endfacet
+facet normal -0.5713404822174107 -0.8207131370823649 -3.0300922412569866e-16
+ outer loop
+ vertex -143.97703651514544 -56.657539822371284 617.4
+ vertex -143.42990957836216 -57.03842292728556 597.4
+ vertex -143.42990957836216 -57.03842292728556 617.4
+ endloop
+endfacet
+facet normal -0.3963729504701247 -0.9180895839380863 -3.1650240770774985e-16
+ outer loop
+ vertex -144.05167483247538 -56.60305820935861 597.4
+ vertex -144.62085731055436 -56.35732125499266 617.4
+ vertex -144.62085731055436 -56.35732125499265 597.4
+ endloop
+endfacet
+facet normal -0.3963729504701247 -0.9180895839380863 -3.1650240770774985e-16
+ outer loop
+ vertex -144.62085731055436 -56.35732125499266 617.4
+ vertex -144.05167483247538 -56.60305820935861 597.4
+ vertex -144.05167483247538 -56.60305820935861 617.4
+ endloop
+endfacet
+facet normal -0.8191520442889846 0.5735764363510566 9.904188843509443e-17
+ outer loop
+ vertex -122.00883426422534 -98.9785759376758 617.4
+ vertex -121.6013783836058 -98.39666863393369 597.4
+ vertex -122.00883426422534 -98.9785759376758 597.4
+ endloop
+endfacet
+facet normal -0.8191520442889846 0.5735764363510566 9.904188843509443e-17
+ outer loop
+ vertex -121.6013783836058 -98.39666863393369 597.4
+ vertex -122.00883426422534 -98.9785759376758 617.4
+ vertex -121.6013783836058 -98.39666863393369 617.4
+ endloop
+endfacet
+facet normal 0.8191520442889846 -0.5735764363510566 -9.904188843509443e-17
+ outer loop
+ vertex -149.13659139480458 -57.5673085561012 617.4
+ vertex -149.5440472754241 -58.14921585984331 597.4
+ vertex -149.13659139480458 -57.56730855610119 597.4
+ endloop
+endfacet
+facet normal 0.8191520442889846 -0.5735764363510566 -9.904188843509443e-17
+ outer loop
+ vertex -149.5440472754241 -58.14921585984331 597.4
+ vertex -149.13659139480458 -57.5673085561012 617.4
+ vertex -149.5440472754241 -58.14921585984331 617.4
+ endloop
+endfacet
+facet normal -0.5895807326816715 -0.8077094524954773 -3.007332061776943e-16
+ outer loop
+ vertex -143.97703651514541 -56.65753982237127 597.4
+ vertex -144.05167483247538 -56.60305820935861 617.4
+ vertex -144.05167483247538 -56.60305820935861 597.4
+ endloop
+endfacet
+facet normal -0.5895807326816715 -0.8077094524954773 -3.007332061776943e-16
+ outer loop
+ vertex -144.05167483247538 -56.60305820935861 617.4
+ vertex -143.97703651514541 -56.65753982237127 597.4
+ vertex -143.97703651514544 -56.657539822371284 617.4
+ endloop
+endfacet
+facet normal -0.7128176874195393 -0.7013493740653512 -2.7971600712696406e-16
+ outer loop
+ vertex -142.89319062544635 -57.575141880201365 597.4
+ vertex -143.39512921140332 -57.06499570299079 617.4
+ vertex -143.39512921140332 -57.06499570299079 597.4
+ endloop
+endfacet
+facet normal -0.7128176874195393 -0.7013493740653512 -2.7971600712696406e-16
+ outer loop
+ vertex -143.39512921140332 -57.06499570299079 617.4
+ vertex -142.89319062544635 -57.575141880201365 597.4
+ vertex -142.89319062544635 -57.575141880201365 617.4
+ endloop
+endfacet
+facet normal 0.7071067811865519 -0.7071067811865432 -1.5010751463383334e-16
+ outer loop
+ vertex -148.6342785416942 -57.06499570299079 617.4
+ vertex -149.13659139480458 -57.56730855610119 597.4
+ vertex -148.6342785416942 -57.064995702990785 597.4
+ endloop
+endfacet
+facet normal 0.7071067811865519 -0.7071067811865432 -1.5010751463383334e-16
+ outer loop
+ vertex -149.13659139480458 -57.56730855610119 597.4
+ vertex -148.6342785416942 -57.06499570299079 617.4
+ vertex -149.13659139480458 -57.5673085561012 617.4
+ endloop
+endfacet
+facet normal -0.8660254037845414 -0.4999999999998221 -2.3251894735633336e-16
+ outer loop
+ vertex -142.4578259075194 -58.19690713431459 597.4
+ vertex -142.4853604776734 -58.149215859843316 617.4
+ vertex -142.4853604776734 -58.14921585984331 597.4
+ endloop
+endfacet
+facet normal -0.8660254037845414 -0.4999999999998221 -2.3251894735633336e-16
+ outer loop
+ vertex -142.4853604776734 -58.149215859843316 617.4
+ vertex -142.4578259075194 -58.19690713431459 597.4
+ vertex -142.45782590751944 -58.19690713431459 617.4
+ endloop
+endfacet
+facet normal -0.4226182617407045 0.9063077870366477 2.3714292307799425e-16
+ outer loop
+ vertex -123.73687521648677 -100.18856323878435 617.4
+ vertex -123.09305442107785 -99.88834467140573 597.4
+ vertex -123.73687521648677 -100.18856323878435 597.4
+ endloop
+endfacet
+facet normal -0.4226182617407045 0.9063077870366477 2.3714292307799425e-16
+ outer loop
+ vertex -123.09305442107785 -99.88834467140573 597.4
+ vertex -123.73687521648677 -100.18856323878435 617.4
+ vertex -123.09305442107785 -99.88834467140573 617.4
+ endloop
+endfacet
+facet normal -0.9063077870366494 0.42261826174070066 4.496692457386016e-17
+ outer loop
+ vertex -121.6013783836058 -98.39666863393369 617.4
+ vertex -121.3011598162272 -97.75284783852477 597.4
+ vertex -121.6013783836058 -98.39666863393369 597.4
+ endloop
+endfacet
+facet normal -0.9063077870366494 0.42261826174070066 4.496692457386016e-17
+ outer loop
+ vertex -121.3011598162272 -97.75284783852477 597.4
+ vertex -121.6013783836058 -98.39666863393369 617.4
+ vertex -121.3011598162272 -97.75284783852477 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -166.67783335074787 -105.75777139462686 617.4
+ vertex -161.12500000000009 -104.861242641566 617.4
+ vertex -162.12500000000009 -103.12919183399713 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -154.54940691211783 -101.06482220219574 617.4
+ vertex -155.38557599864262 -104.43433599533701 617.4
+ vertex -153.0000000000001 -104.43433599533701 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -155.38557599864262 -104.43433599533701 617.4
+ vertex -154.54940691211783 -101.06482220219574 617.4
+ vertex -161.12500000000009 -104.861242641566 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -155.38557599864262 -104.43433599533701 617.4
+ vertex -161.12500000000009 -104.861242641566 617.4
+ vertex -170.67210412904055 -113.26001712639702 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -170.67210412904055 -113.26001712639702 617.4
+ vertex -161.12500000000009 -104.861242641566 617.4
+ vertex -165.67783335074787 -107.48982220219573 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -165.67783335074787 -107.48982220219573 617.4
+ vertex -161.12500000000009 -104.861242641566 617.4
+ vertex -166.67783335074787 -105.75777139462686 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -170.67210412904055 -113.26001712639702 617.4
+ vertex -165.67783335074787 -107.48982220219573 617.4
+ vertex -172.30292768969883 -111.31482220219574 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -93.55470053837935 -102.43433599533701 617.4
+ vertex -94.7094010767586 -100.43433599533701 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -93.55470053837935 -102.43433599533701 617.4
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -93.33453298111435 -102.95197408554206 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -93.33453298111435 -102.95197408554206 617.4
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -93.28675134594823 -103.43433599533701 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -93.28675134594823 -103.43433599533701 617.4
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -93.41461187235467 -103.84854955771011 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -93.41461187235467 -103.84854955771011 617.4
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -93.7094010767586 -104.16638680290588 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -93.7094010767586 -104.16638680290588 617.4
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -94.15102956204208 -104.36618764791513 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -94.15102956204208 -104.36618764791513 617.4
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -94.70940107675862 -104.43433599533701 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -94.70940107675862 -104.43433599533701 617.4
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -150.0000000000001 -104.43433599533701 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -150.0000000000001 -104.43433599533701 617.4
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -124.42304733448304 -100.3724225036702 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -124.42304733448304 -100.3724225036702 617.4
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -123.73687521648677 -100.18856323878435 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -123.73687521648677 -100.18856323878435 617.4
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -123.09305442107785 -99.88834467140573 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -123.09305442107785 -99.88834467140573 617.4
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -122.51114711733574 -99.48088879078622 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -122.51114711733574 -99.48088879078622 617.4
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -122.00883426422534 -98.9785759376758 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -122.00883426422534 -98.9785759376758 617.4
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -121.6013783836058 -98.39666863393369 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -121.6013783836058 -98.39666863393369 617.4
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -121.3011598162272 -97.75284783852477 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -121.3011598162272 -97.75284783852477 617.4
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -121.11730055134134 -97.06667572052851 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -121.11730055134134 -97.06667572052851 617.4
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -121.05538705967454 -96.35900127253038 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -121.05538705967454 -96.35900127253038 617.4
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -121.11730055134134 -95.65132682453225 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -121.11730055134134 -95.65132682453225 617.4
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -121.3011598162272 -94.965154706536 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -121.3011598162272 -94.965154706536 617.4
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -121.6013783836058 -94.32133391112707 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -150.0000000000001 -104.43433599533701 617.4
+ vertex -124.42304733448304 -100.3724225036702 617.4
+ vertex -125.13072178248116 -100.43433599533701 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -150.0000000000001 -104.43433599533701 617.4
+ vertex -125.13072178248116 -100.43433599533701 617.4
+ vertex -150.5255562475269 -100.43433599533701 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -150.0000000000001 -104.43433599533701 617.4
+ vertex -150.5255562475269 -100.43433599533701 617.4
+ vertex -165.44278799932133 -77.68664256999766 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -150.0000000000001 -104.43433599533701 617.4
+ vertex -165.44278799932133 -77.68664256999766 617.4
+ vertex -164.7994069121178 -83.31130142461475 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -164.7994069121178 -83.31130142461475 617.4
+ vertex -165.44278799932133 -77.68664256999766 617.4
+ vertex -166.94278799932135 -80.28471878135097 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -166.94278799932135 -80.28471878135097 617.4
+ vertex -165.44278799932133 -77.68664256999766 617.4
+ vertex -179.89715088236125 -69.34141226851004 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -166.94278799932135 -80.28471878135097 617.4
+ vertex -179.89715088236125 -69.34141226851004 617.4
+ vertex -181.10149984918363 -71.91527419881093 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -181.10149984918363 -71.91527419881093 617.4
+ vertex -179.89715088236125 -69.34141226851004 617.4
+ vertex -182.50000000000009 -67.83865662978125 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -181.10149984918363 -71.91527419881093 617.4
+ vertex -182.50000000000009 -67.83865662978125 617.4
+ vertex -183.21473573526944 -69.28298715360742 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -181.10149984918363 -71.91527419881093 617.4
+ vertex -183.21473573526944 -69.28298715360742 617.4
+ vertex -181.64696360879714 -73.29754865337445 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -181.64696360879714 -73.29754865337445 617.4
+ vertex -183.21473573526944 -69.28298715360742 617.4
+ vertex -183.86844014664098 -70.75594620798759 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -181.64696360879714 -73.29754865337445 617.4
+ vertex -183.86844014664098 -70.75594620798759 617.4
+ vertex -182.13413950932807 -74.7014265051594 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -182.13413950932807 -74.7014265051594 617.4
+ vertex -183.86844014664098 -70.75594620798759 617.4
+ vertex -184.45996930827118 -72.25495624273324 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -182.13413950932807 -74.7014265051594 617.4
+ vertex -184.45996930827118 -72.25495624273324 617.4
+ vertex -182.56217503533787 -76.12445109007139 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -182.56217503533787 -76.12445109007139 617.4
+ vertex -184.45996930827118 -72.25495624273324 617.4
+ vertex -184.98828809559384 -73.77739412070689 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -182.56217503533787 -76.12445109007139 617.4
+ vertex -184.98828809559384 -73.77739412070689 617.4
+ vertex -182.93032116189784 -77.56413223889896 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -182.93032116189784 -77.56413223889896 617.4
+ vertex -184.98828809559384 -73.77739412070689 617.4
+ vertex -185.45247199669834 -75.32059570808379 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -182.93032116189784 -77.56413223889896 617.4
+ vertex -185.45247199669834 -75.32059570808379 617.4
+ vertex -183.23793366531743 -79.01795063489293 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.23793366531743 -79.01795063489293 617.4
+ vertex -185.45247199669834 -75.32059570808379 617.4
+ vertex -183.48447425048 -80.48336222235163 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.48447425048 -80.48336222235163 617.4
+ vertex -185.45247199669834 -75.32059570808379 617.4
+ vertex -185.8517087301446 -76.8818605363542 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.48447425048 -80.48336222235163 617.4
+ vertex -185.8517087301446 -76.8818605363542 617.4
+ vertex -183.66951149281203 -81.95780265849703 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.66951149281203 -81.95780265849703 617.4
+ vertex -185.8517087301446 -76.8818605363542 617.4
+ vertex -186.18529966638516 -78.45845652790855 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.66951149281203 -81.95780265849703 617.4
+ vertex -186.18529966638516 -78.45845652790855 617.4
+ vertex -183.7927215932388 -83.43869180085149 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.7927215932388 -83.43869180085149 617.4
+ vertex -186.18529966638516 -78.45845652790855 617.4
+ vertex -186.45266105030615 -80.04762477693534 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.7927215932388 -83.43869180085149 617.4
+ vertex -186.45266105030615 -80.04762477693534 617.4
+ vertex -183.8538889448047 -84.92343822226253 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.8538889448047 -84.92343822226253 617.4
+ vertex -186.45266105030615 -80.04762477693534 617.4
+ vertex -186.65332502274782 -81.64658437726645 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.8538889448047 -84.92343822226253 617.4
+ vertex -186.65332502274782 -81.64658437726645 617.4
+ vertex -183.8529065099664 -86.40944374567499 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.8529065099664 -86.40944374567499 617.4
+ vertex -186.65332502274782 -81.64658437726645 617.4
+ vertex -183.7897760078994 -87.89410799071469 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.7897760078994 -87.89410799071469 617.4
+ vertex -186.65332502274782 -81.64658437726645 617.4
+ vertex -186.78694043921743 -83.2525372887208 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.7897760078994 -87.89410799071469 617.4
+ vertex -186.78694043921743 -83.2525372887208 617.4
+ vertex -183.66460791148953 -89.3748329241279 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.66460791148953 -89.3748329241279 617.4
+ vertex -186.78694043921743 -83.2525372887208 617.4
+ vertex -186.85327348436152 -84.86267323343138 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.66460791148953 -89.3748329241279 617.4
+ vertex -186.85327348436152 -84.86267323343138 617.4
+ vertex -183.47762125401513 -90.84902740611359 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.47762125401513 -90.84902740611359 617.4
+ vertex -186.85327348436152 -84.86267323343138 617.4
+ vertex -186.8522080811225 -86.47417461358685 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.47762125401513 -90.84902740611359 617.4
+ vertex -186.8522080811225 -86.47417461358685 617.4
+ vertex -183.42210412904055 -91.17636932989386 617.3999999999999
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.42210412904055 -91.17636932989386 617.3999999999999
+ vertex -186.8522080811225 -86.47417461358685 617.4
+ vertex -182.5529276896988 -93.56130142461475 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -182.5529276896988 -93.56130142461475 617.4
+ vertex -186.8522080811225 -86.47417461358685 617.4
+ vertex -172.30292768969883 -111.31482220219574 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -150.0000000000001 -104.43433599533701 617.4
+ vertex -153.0000000000001 -104.43433599533701 617.4
+ vertex -150.00000000000014 -121.12479659831224 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -153.0000000000001 -104.43433599533701 617.4
+ vertex -150.0000000000001 -104.43433599533701 617.4
+ vertex -154.54940691211783 -101.06482220219574 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -154.54940691211783 -101.06482220219574 617.4
+ vertex -150.0000000000001 -104.43433599533701 617.4
+ vertex -164.7994069121178 -83.31130142461475 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -150.00000000000014 -121.12479659831224 617.4
+ vertex -153.0000000000001 -104.43433599533701 617.4
+ vertex -152.83120430088547 -120.88086243345158 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -150.00000000000014 -121.12479659831224 617.4
+ vertex -152.83120430088547 -120.88086243345158 617.4
+ vertex -150.0000000000001 -124.13030787576982 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -150.0000000000001 -124.13030787576982 617.4
+ vertex -152.83120430088547 -120.88086243345158 617.4
+ vertex -151.60819479272956 -124.02712191759254 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -151.60819479272956 -124.02712191759254 617.4
+ vertex -152.83120430088547 -120.88086243345158 617.4
+ vertex -154.30102097334648 -120.66211067883889 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -151.60819479272956 -124.02712191759254 617.4
+ vertex -154.30102097334648 -120.66211067883889 617.4
+ vertex -153.21066695824285 -123.85676701721619 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -153.21066695824285 -123.85676701721619 617.4
+ vertex -154.30102097334648 -120.66211067883889 617.4
+ vertex -155.76040280706806 -120.38207845891773 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -153.21066695824285 -123.85676701721619 617.4
+ vertex -155.76040280706806 -120.38207845891773 617.4
+ vertex -154.80461230967546 -123.6195412808944 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -154.80461230967546 -123.6195412808944 617.4
+ vertex -155.76040280706806 -120.38207845891773 617.4
+ vertex -157.2067960108166 -120.04125580570847 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -154.80461230967546 -123.6195412808944 617.4
+ vertex -157.2067960108166 -120.04125580570847 617.4
+ vertex -156.38724158134568 -123.3158598330256 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -156.38724158134568 -123.3158598330256 617.4
+ vertex -157.2067960108166 -120.04125580570847 617.4
+ vertex -158.63766952233078 -119.64023912920045 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -156.38724158134568 -123.3158598330256 617.4
+ vertex -158.63766952233078 -119.64023912920045 617.4
+ vertex -157.95578530972676 -122.9462540897214 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -157.95578530972676 -122.9462540897214 617.4
+ vertex -158.63766952233078 -119.64023912920045 617.4
+ vertex -160.05051943746048 -119.1797301736866 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -157.95578530972676 -122.9462540897214 617.4
+ vertex -160.05051943746048 -119.1797301736866 617.4
+ vertex -161.4428733917811 -118.6605347897719 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -157.95578530972676 -122.9462540897214 617.4
+ vertex -161.4428733917811 -118.6605347897719 617.4
+ vertex -159.5074986797672 -122.51137082887453 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -159.5074986797672 -122.51137082887453 617.4
+ vertex -161.4428733917811 -118.6605347897719 617.4
+ vertex -162.81229488701607 -118.08356152420495 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -159.5074986797672 -122.51137082887453 617.4
+ vertex -162.81229488701607 -118.08356152420495 617.4
+ vertex -161.03966632807825 -122.01197105835392 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -161.03966632807825 -122.01197105835392 617.4
+ vertex -162.81229488701607 -118.08356152420495 617.4
+ vertex -164.15638755469695 -117.44982003000014 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -161.03966632807825 -122.01197105835392 617.4
+ vertex -164.15638755469695 -117.44982003000014 617.4
+ vertex -162.54960709458362 -121.44892868430706 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -162.54960709458362 -121.44892868430706 617.4
+ vertex -164.15638755469695 -117.44982003000014 617.4
+ vertex -165.47279934959994 -116.76041929963289 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -162.54960709458362 -121.44892868430706 617.4
+ vertex -165.47279934959994 -116.76041929963289 617.4
+ vertex -164.0346787143162 -120.8232289819003 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -164.0346787143162 -120.8232289819003 617.4
+ vertex -165.47279934959994 -116.76041929963289 617.4
+ vertex -166.75922666561993 -116.01656572439916 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -164.0346787143162 -120.8232289819003 617.4
+ vertex -166.75922666561993 -116.01656572439916 617.4
+ vertex -168.01341836688124 -115.21956098333557 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -164.0346787143162 -120.8232289819003 617.4
+ vertex -168.01341836688124 -115.21956098333557 617.4
+ vertex -165.49228244115207 -120.13596687117304 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -165.49228244115207 -120.13596687117304 617.4
+ vertex -168.01341836688124 -115.21956098333557 617.4
+ vertex -169.2331797270292 -114.37079976539471 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -165.49228244115207 -120.13596687117304 617.4
+ vertex -169.2331797270292 -114.37079976539471 617.4
+ vertex -166.9198675953899 -119.38834500102291 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -166.9198675953899 -119.38834500102291 617.4
+ vertex -169.2331797270292 -114.37079976539471 617.4
+ vertex -170.41637626981046 -113.47176732886027 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -166.9198675953899 -119.38834500102291 617.4
+ vertex -170.41637626981046 -113.47176732886027 617.4
+ vertex -168.31493602721872 -118.58167164467494 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -168.31493602721872 -118.58167164467494 617.4
+ vertex -170.41637626981046 -113.47176732886027 617.4
+ vertex -170.67210412904055 -113.26001712639702 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -168.31493602721872 -118.58167164467494 617.4
+ vertex -170.67210412904055 -113.26001712639702 617.4
+ vertex -172.30292768969883 -111.31482220219574 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -168.31493602721872 -118.58167164467494 617.4
+ vertex -172.30292768969883 -111.31482220219574 617.4
+ vertex -186.8522080811225 -86.47417461358685 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -168.31493602721872 -118.58167164467494 617.4
+ vertex -186.8522080811225 -86.47417461358685 617.4
+ vertex -186.78374609386333 -88.08422144198272 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -168.31493602721872 -118.58167164467494 617.4
+ vertex -186.78374609386333 -88.08422144198272 617.4
+ vertex -169.67504648826252 -117.71735841031698 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -169.67504648826252 -117.71735841031698 617.4
+ vertex -186.78374609386333 -88.08422144198272 617.4
+ vertex -186.64800732510514 -89.68999627675349 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -169.67504648826252 -117.71735841031698 617.4
+ vertex -186.64800732510514 -89.68999627675349 617.4
+ vertex -170.99781890355266 -116.79691777090856 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -170.99781890355266 -116.79691777090856 617.4
+ vertex -186.64800732510514 -89.68999627675349 617.4
+ vertex -186.44522930588303 -91.28868915165081 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -170.99781890355266 -116.79691777090856 617.4
+ vertex -186.44522930588303 -91.28868915165081 617.4
+ vertex -172.28093853645186 -115.8219604174845 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -172.28093853645186 -115.8219604174845 617.4
+ vertex -186.44522930588303 -91.28868915165081 617.4
+ vertex -186.17576688008776 -92.87750249323994 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -172.28093853645186 -115.8219604174845 617.4
+ vertex -186.17576688008776 -92.87750249323994 617.4
+ vertex -173.52216003924207 -114.79419244058586 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -173.52216003924207 -114.79419244058586 617.4
+ vertex -186.17576688008776 -92.87750249323994 617.4
+ vertex -185.84009158351952 -94.45365601640985 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -173.52216003924207 -114.79419244058586 617.4
+ vertex -185.84009158351952 -94.45365601640985 617.4
+ vertex -174.7193113822874 -113.71541234474994 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -174.7193113822874 -113.71541234474994 617.4
+ vertex -185.84009158351952 -94.45365601640985 617.4
+ vertex -185.43879081874147 -96.01439158963024 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -174.7193113822874 -113.71541234474994 617.4
+ vertex -185.43879081874147 -96.01439158963024 617.4
+ vertex -175.8702976548973 -112.58750790128379 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -175.8702976548973 -112.58750790128379 617.4
+ vertex -185.43879081874147 -96.01439158963024 617.4
+ vertex -184.97256682717622 -97.55697806144181 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -175.8702976548973 -112.58750790128379 617.4
+ vertex -184.97256682717622 -97.55697806144181 617.4
+ vertex -176.9731047312377 -111.4124528448287 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -176.9731047312377 -111.4124528448287 617.4
+ vertex -184.97256682717622 -97.55697806144181 617.4
+ vertex -184.44223546024463 -99.07871603973358 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -176.9731047312377 -111.4124528448287 617.4
+ vertex -184.44223546024463 -99.07871603973358 617.4
+ vertex -178.02580279487614 -110.19230341949638 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -178.02580279487614 -110.19230341949638 617.4
+ vertex -184.44223546024463 -99.07871603973358 617.4
+ vertex -183.84872475169666 -100.57694261544432 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -178.02580279487614 -110.19230341949638 617.4
+ vertex -183.84872475169666 -100.57694261544432 617.4
+ vertex -179.02654971579267 -108.92919478062035 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -179.02654971579267 -108.92919478062035 617.4
+ vertex -183.84872475169666 -100.57694261544432 617.4
+ vertex -183.19307329363312 -102.0490360224217 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -179.02654971579267 -108.92919478062035 617.4
+ vertex -183.19307329363312 -102.0490360224217 617.4
+ vertex -179.97359427394687 -107.62533725842033 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -179.97359427394687 -107.62533725842033 617.4
+ vertex -183.19307329363312 -102.0490360224217 617.4
+ vertex -180.86527922376087 -106.28301249011633 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -180.86527922376087 -106.28301249011633 617.4
+ vertex -183.19307329363312 -102.0490360224217 617.4
+ vertex -182.4764284190598 -103.49242022528485 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -180.86527922376087 -106.28301249011633 617.4
+ vertex -182.4764284190598 -103.49242022528485 617.4
+ vertex -181.70004419415466 -104.90456942726227 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -164.7994069121178 -83.31130142461475 617.4
+ vertex -168.1355759986426 -82.35068819883382 617.4
+ vertex -171.37500000000009 -87.10772186398503 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -168.1355759986426 -82.35068819883382 617.4
+ vertex -164.7994069121178 -83.31130142461475 617.4
+ vertex -166.94278799932135 -80.28471878135097 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -171.37500000000009 -87.10772186398503 617.4
+ vertex -168.1355759986426 -82.35068819883382 617.4
+ vertex -183.42210412904055 -91.17636932989386 617.3999999999999
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -171.37500000000009 -87.10772186398503 617.4
+ vertex -183.42210412904055 -91.17636932989386 617.3999999999999
+ vertex -175.92783335074785 -89.73630142461475 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -171.37500000000009 -87.10772186398503 617.4
+ vertex -175.92783335074785 -89.73630142461475 617.4
+ vertex -170.3750000000001 -88.8397726715539 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -175.92783335074785 -89.73630142461475 617.4
+ vertex -183.42210412904055 -91.17636932989386 617.3999999999999
+ vertex -182.5529276896988 -93.56130142461475 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -174.92783335074785 -91.46835223218363 617.4
+ vertex -170.3750000000001 -88.8397726715539 617.4
+ vertex -175.92783335074785 -89.73630142461475 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -135.82629141839357 -29.354089569230858 617.4
+ vertex -134.3333869225628 -31.80357931201403 617.4
+ vertex -135.48808746094204 -29.803579312014033 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -134.3333869225628 -31.80357931201403 617.4
+ vertex -135.82629141839357 -29.354089569230858 617.4
+ vertex -143.53209771903337 -47.73621377563337 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903337 -47.73621377563337 617.4
+ vertex -135.82629141839357 -29.354089569230858 617.4
+ vertex -136.2201382685109 -29.07152850444516 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903337 -47.73621377563337 617.4
+ vertex -136.2201382685109 -29.07152850444516 617.4
+ vertex -136.64278799932129 -28.97515218726785 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903337 -47.73621377563337 617.4
+ vertex -136.64278799932129 -28.97515218726785 617.4
+ vertex -137.0654377301317 -29.071528504445165 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903337 -47.73621377563337 617.4
+ vertex -137.0654377301317 -29.071528504445165 617.4
+ vertex -137.45928458024903 -29.35408956923086 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903337 -47.73621377563337 617.4
+ vertex -137.45928458024903 -29.35408956923086 617.4
+ vertex -137.79748853770056 -29.80357931201404 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903337 -47.73621377563337 617.4
+ vertex -137.79748853770056 -29.80357931201404 617.4
+ vertex -165.44278799932133 -77.68664256999766 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903337 -47.73621377563337 617.4
+ vertex -165.44278799932133 -77.68664256999766 617.4
+ vertex -149.13659139480458 -57.5673085561012 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903337 -47.73621377563337 617.4
+ vertex -149.13659139480458 -57.5673085561012 617.4
+ vertex -148.6342785416942 -57.06499570299079 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903337 -47.73621377563337 617.4
+ vertex -148.6342785416942 -57.06499570299079 617.4
+ vertex -148.05237123795206 -56.657539822371284 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903337 -47.73621377563337 617.4
+ vertex -148.05237123795206 -56.657539822371284 617.4
+ vertex -147.40855044254315 -56.35732125499265 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903337 -47.73621377563337 617.4
+ vertex -147.40855044254315 -56.35732125499265 617.4
+ vertex -146.7223783245469 -56.1734619901068 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903337 -47.73621377563337 617.4
+ vertex -146.7223783245469 -56.1734619901068 617.4
+ vertex -146.01470387654874 -56.111548498439994 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903337 -47.73621377563337 617.4
+ vertex -146.01470387654874 -56.111548498439994 617.4
+ vertex -145.30702942855063 -56.173461990106794 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903337 -47.73621377563337 617.4
+ vertex -145.30702942855063 -56.173461990106794 617.4
+ vertex -144.62085731055436 -56.35732125499266 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903337 -47.73621377563337 617.4
+ vertex -144.62085731055436 -56.35732125499266 617.4
+ vertex -144.05167483247538 -56.60305820935861 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903337 -47.73621377563337 617.4
+ vertex -144.05167483247538 -56.60305820935861 617.4
+ vertex -143.42990957836216 -57.03842292728556 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903337 -47.73621377563337 617.4
+ vertex -143.42990957836216 -57.03842292728556 617.4
+ vertex -143.39512921140332 -57.06499570299079 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903337 -47.73621377563337 617.4
+ vertex -143.39512921140332 -57.06499570299079 617.4
+ vertex -142.89319062544635 -57.575141880201365 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903337 -47.73621377563337 617.4
+ vertex -142.89319062544635 -57.575141880201365 617.4
+ vertex -142.4853604776734 -58.149215859843316 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903337 -47.73621377563337 617.4
+ vertex -142.4853604776734 -58.149215859843316 617.4
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -142.4853604776734 -58.149215859843316 617.4
+ vertex -121.6013783836058 -94.32133391112707 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.42990957836216 -57.03842292728556 617.4
+ vertex -144.05167483247538 -56.60305820935861 617.4
+ vertex -143.97703651514544 -56.657539822371284 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -149.13659139480458 -57.5673085561012 617.4
+ vertex -165.44278799932133 -77.68664256999766 617.4
+ vertex -149.5440472754241 -58.14921585984331 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -149.5440472754241 -58.14921585984331 617.4
+ vertex -165.44278799932133 -77.68664256999766 617.4
+ vertex -162.241464507947 -80.1417876314735 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -162.241464507947 -80.1417876314735 617.4
+ vertex -165.44278799932133 -77.68664256999766 617.4
+ vertex -150.5255562475269 -100.43433599533701 617.4
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -142.45782590751944 -58.19690713431459 617.4
+ vertex -121.6013783836058 -94.32133391112707 617.4
+ vertex -142.4853604776734 -58.149215859843316 617.4
+ endloop
+endfacet
+facet normal -0.7071067811865519 0.7071067811865432 1.5010751463383334e-16
+ outer loop
+ vertex -122.51114711733574 -99.48088879078622 617.4
+ vertex -122.00883426422534 -98.9785759376758 597.4
+ vertex -122.51114711733574 -99.48088879078622 597.4
+ endloop
+endfacet
+facet normal -0.7071067811865519 0.7071067811865432 1.5010751463383334e-16
+ outer loop
+ vertex -122.00883426422534 -98.9785759376758 597.4
+ vertex -122.51114711733574 -99.48088879078622 617.4
+ vertex -122.00883426422534 -98.9785759376758 617.4
+ endloop
+endfacet
+facet normal -0.08715574274766985 0.9961946980917447 2.955753951421487e-16
+ outer loop
+ vertex -125.13072178248116 -100.43433599533701 617.4
+ vertex -124.42304733448304 -100.3724225036702 597.4
+ vertex -125.13072178248116 -100.43433599533701 597.4
+ endloop
+endfacet
+facet normal -0.08715574274766985 0.9961946980917447 2.955753951421487e-16
+ outer loop
+ vertex -124.42304733448304 -100.3724225036702 597.4
+ vertex -125.13072178248116 -100.43433599533701 617.4
+ vertex -124.42304733448304 -100.3724225036702 617.4
+ endloop
+endfacet
+facet normal 0.4226182617407045 -0.9063077870366477 -2.3714292307799425e-16
+ outer loop
+ vertex -147.40855044254315 -56.35732125499265 617.4
+ vertex -148.05237123795206 -56.65753982237127 597.4
+ vertex -147.40855044254315 -56.35732125499265 597.4
+ endloop
+endfacet
+facet normal 0.4226182617407045 -0.9063077870366477 -2.3714292307799425e-16
+ outer loop
+ vertex -148.05237123795206 -56.65753982237127 597.4
+ vertex -147.40855044254315 -56.35732125499265 617.4
+ vertex -148.05237123795206 -56.657539822371284 617.4
+ endloop
+endfacet
+facet normal 0.8660254037844382 -0.500000000000001 -7.227945163972777e-17
+ outer loop
+ vertex -149.5440472754241 -58.14921585984331 617.4
+ vertex -162.241464507947 -80.1417876314735 597.4
+ vertex -149.5440472754241 -58.14921585984331 597.4
+ endloop
+endfacet
+facet normal 0.8660254037844382 -0.500000000000001 -7.227945163972777e-17
+ outer loop
+ vertex -162.241464507947 -80.1417876314735 597.4
+ vertex -149.5440472754241 -58.14921585984331 617.4
+ vertex -162.241464507947 -80.1417876314735 617.4
+ endloop
+endfacet
+facet normal -0.0871557427476532 -0.9961946980917461 -3.117017029913951e-16
+ outer loop
+ vertex -145.30702942855063 -56.173461990106794 617.4
+ vertex -146.01470387654874 -56.111548498439994 597.4
+ vertex -145.3070294285506 -56.173461990106794 597.4
+ endloop
+endfacet
+facet normal -0.0871557427476532 -0.9961946980917461 -3.117017029913951e-16
+ outer loop
+ vertex -146.01470387654874 -56.111548498439994 597.4
+ vertex -145.30702942855063 -56.173461990106794 617.4
+ vertex -146.01470387654874 -56.111548498439994 617.4
+ endloop
+endfacet
+facet normal -0.25881904510253206 -0.9659258262890653 -3.183571123239196e-16
+ outer loop
+ vertex -144.62085731055436 -56.35732125499265 597.4
+ vertex -145.30702942855063 -56.173461990106794 617.4
+ vertex -145.3070294285506 -56.173461990106794 597.4
+ endloop
+endfacet
+facet normal -0.25881904510253206 -0.9659258262890653 -3.183571123239196e-16
+ outer loop
+ vertex -145.30702942855063 -56.173461990106794 617.4
+ vertex -144.62085731055436 -56.35732125499265 597.4
+ vertex -144.62085731055436 -56.35732125499266 617.4
+ endloop
+endfacet
+facet normal -0.5735764363510409 0.8191520442889954 1.9661219995849944e-16
+ outer loop
+ vertex -123.09305442107785 -99.88834467140573 617.4
+ vertex -122.51114711733574 -99.48088879078622 597.4
+ vertex -123.09305442107785 -99.88834467140573 597.4
+ endloop
+endfacet
+facet normal -0.5735764363510409 0.8191520442889954 1.9661219995849944e-16
+ outer loop
+ vertex -122.51114711733574 -99.48088879078622 597.4
+ vertex -123.09305442107785 -99.88834467140573 617.4
+ vertex -122.51114711733574 -99.48088879078622 617.4
+ endloop
+endfacet
+facet normal -2.7755575615628914e-16 1.0 3.0479839899610546e-16
+ outer loop
+ vertex -150.5255562475269 -100.43433599533701 617.4
+ vertex -125.13072178248116 -100.43433599533701 597.4
+ vertex -150.5255562475269 -100.43433599533701 597.4
+ endloop
+endfacet
+facet normal -2.7755575615628914e-16 1.0 3.0479839899610546e-16
+ outer loop
+ vertex -125.13072178248116 -100.43433599533701 597.4
+ vertex -150.5255562475269 -100.43433599533701 617.4
+ vertex -125.13072178248116 -100.43433599533701 617.4
+ endloop
+endfacet
+facet normal 0.08715574274766985 -0.9961946980917447 -2.955753951421487e-16
+ outer loop
+ vertex -146.01470387654874 -56.111548498439994 617.4
+ vertex -146.72237832454687 -56.1734619901068 597.4
+ vertex -146.01470387654874 -56.111548498439994 597.4
+ endloop
+endfacet
+facet normal 0.08715574274766985 -0.9961946980917447 -2.955753951421487e-16
+ outer loop
+ vertex -146.72237832454687 -56.1734619901068 597.4
+ vertex -146.01470387654874 -56.111548498439994 617.4
+ vertex -146.7223783245469 -56.1734619901068 617.4
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 2.32518947356378e-16
+ outer loop
+ vertex -150.5255562475269 -100.43433599533701 617.4
+ vertex -162.241464507947 -80.1417876314735 597.4
+ vertex -162.241464507947 -80.1417876314735 617.4
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 2.32518947356378e-16
+ outer loop
+ vertex -162.241464507947 -80.1417876314735 597.4
+ vertex -150.5255562475269 -100.43433599533701 617.4
+ vertex -150.5255562475269 -100.43433599533701 597.4
+ endloop
+endfacet
+facet normal 0.5735764363510409 -0.8191520442889954 -1.9661219995849944e-16
+ outer loop
+ vertex -148.05237123795206 -56.657539822371284 617.4
+ vertex -148.6342785416942 -57.064995702990785 597.4
+ vertex -148.05237123795206 -56.65753982237127 597.4
+ endloop
+endfacet
+facet normal 0.5735764363510409 -0.8191520442889954 -1.9661219995849944e-16
+ outer loop
+ vertex -148.6342785416942 -57.064995702990785 597.4
+ vertex -148.05237123795206 -56.657539822371284 617.4
+ vertex -148.6342785416942 -57.06499570299079 617.4
+ endloop
+endfacet
+facet normal 0.7331906391044432 -0.6800231516129568 -1.394393374272296e-16
+ outer loop
+ vertex -93.41461187235467 -103.84854955771011 617.4
+ vertex -93.7094010767586 -104.16638680290588 597.4
+ vertex -93.41461187235467 -103.84854955771011 597.4
+ endloop
+endfacet
+facet normal 0.7331906391044432 -0.6800231516129568 -1.394393374272296e-16
+ outer loop
+ vertex -93.7094010767586 -104.16638680290588 597.4
+ vertex -93.41461187235467 -103.84854955771011 617.4
+ vertex -93.7094010767586 -104.16638680290588 617.4
+ endloop
+endfacet
+facet normal -0.22232200490613085 0.97497329508788 2.7660233119403463e-16
+ outer loop
+ vertex -137.0654377301317 -29.071528504445165 617.4
+ vertex -136.64278799932129 -28.97515218726785 597.4
+ vertex -137.06543773013166 -29.07152850444516 597.4
+ endloop
+endfacet
+facet normal -0.22232200490613085 0.97497329508788 2.7660233119403463e-16
+ outer loop
+ vertex -136.64278799932129 -28.97515218726785 597.4
+ vertex -137.0654377301317 -29.071528504445165 617.4
+ vertex -136.64278799932129 -28.97515218726785 617.4
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 2.32518947356378e-16
+ outer loop
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -143.53209771903337 -47.73621377563337 617.4
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 2.32518947356378e-16
+ outer loop
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -113.1068226696997 -100.43433599533701 617.4
+ vertex -113.10682266969967 -100.43433599533701 597.4
+ endloop
+endfacet
+facet normal 0.9951296050077004 0.0985751958517875 1.221092966018723e-16
+ outer loop
+ vertex -93.28675134594823 -103.43433599533701 617.4
+ vertex -93.33453298111434 -102.95197408554206 597.4
+ vertex -93.33453298111435 -102.95197408554206 617.4
+ endloop
+endfacet
+facet normal 0.9951296050077004 0.0985751958517875 1.221092966018723e-16
+ outer loop
+ vertex -93.33453298111434 -102.95197408554206 597.4
+ vertex -93.28675134594823 -103.43433599533701 617.4
+ vertex -93.28675134594823 -103.43433599533701 597.4
+ endloop
+endfacet
+facet normal 0.22232200490612164 0.9749732950878822 3.177382676194519e-16
+ outer loop
+ vertex -136.64278799932129 -28.97515218726785 617.4
+ vertex -136.2201382685109 -29.07152850444516 597.4
+ vertex -136.64278799932129 -28.97515218726785 597.4
+ endloop
+endfacet
+facet normal 0.22232200490612164 0.9749732950878822 3.177382676194519e-16
+ outer loop
+ vertex -136.2201382685109 -29.07152850444516 597.4
+ vertex -136.64278799932129 -28.97515218726785 617.4
+ vertex -136.2201382685109 -29.07152850444516 617.4
+ endloop
+endfacet
+facet normal -0.5829334262945306 0.8125199200687447 1.9372508358990627e-16
+ outer loop
+ vertex -137.45928458024903 -29.35408956923086 617.4
+ vertex -137.06543773013166 -29.07152850444516 597.4
+ vertex -137.45928458024903 -29.35408956923086 597.4
+ endloop
+endfacet
+facet normal -0.5829334262945306 0.8125199200687447 1.9372508358990627e-16
+ outer loop
+ vertex -137.06543773013166 -29.07152850444516 597.4
+ vertex -137.45928458024903 -29.35408956923086 617.4
+ vertex -137.0654377301317 -29.071528504445165 617.4
+ endloop
+endfacet
+facet normal -0.7990717941595309 0.6012356175233369 1.0933007317951937e-16
+ outer loop
+ vertex -137.79748853770056 -29.80357931201404 617.4
+ vertex -137.45928458024903 -29.35408956923086 597.4
+ vertex -137.79748853770056 -29.803579312014033 597.4
+ endloop
+endfacet
+facet normal -0.7990717941595309 0.6012356175233369 1.0933007317951937e-16
+ outer loop
+ vertex -137.45928458024903 -29.35408956923086 597.4
+ vertex -137.79748853770056 -29.80357931201404 617.4
+ vertex -137.45928458024903 -29.35408956923086 617.4
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 -7.22794516397278e-17
+ outer loop
+ vertex -134.3333869225628 -31.80357931201403 617.4
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -134.3333869225628 -31.80357931201403 597.4
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 -7.22794516397278e-17
+ outer loop
+ vertex -143.53209771903337 -47.73621377563336 597.4
+ vertex -134.3333869225628 -31.80357931201403 617.4
+ vertex -143.53209771903337 -47.73621377563337 617.4
+ endloop
+endfacet
+facet normal 0.9555126440105939 -0.29495014347493387 -1.5017328374353077e-18
+ outer loop
+ vertex -93.28675134594823 -103.43433599533701 617.4
+ vertex -93.41461187235467 -103.84854955771011 597.4
+ vertex -93.28675134594823 -103.43433599533701 597.4
+ endloop
+endfacet
+facet normal 0.9555126440105939 -0.29495014347493387 -1.5017328374353077e-18
+ outer loop
+ vertex -93.41461187235467 -103.84854955771011 597.4
+ vertex -93.28675134594823 -103.43433599533701 617.4
+ vertex -93.41461187235467 -103.84854955771011 617.4
+ endloop
+endfacet
+facet normal 0.7990717941595378 0.6012356175233278 2.571812341015743e-16
+ outer loop
+ vertex -135.48808746094204 -29.803579312014033 617.4
+ vertex -135.82629141839357 -29.35408956923085 597.4
+ vertex -135.82629141839357 -29.354089569230858 617.4
+ endloop
+endfacet
+facet normal 0.7990717941595378 0.6012356175233278 2.571812341015743e-16
+ outer loop
+ vertex -135.82629141839357 -29.35408956923085 597.4
+ vertex -135.48808746094204 -29.803579312014033 617.4
+ vertex -135.48808746094204 -29.803579312014033 597.4
+ endloop
+endfacet
+facet normal 0.9202212155149956 0.3913986644281044 2.0443132259682835e-16
+ outer loop
+ vertex -93.33453298111435 -102.95197408554206 617.4
+ vertex -93.55470053837934 -102.43433599533701 597.4
+ vertex -93.55470053837935 -102.43433599533701 617.4
+ endloop
+endfacet
+facet normal 0.9202212155149956 0.3913986644281044 2.0443132259682835e-16
+ outer loop
+ vertex -93.55470053837934 -102.43433599533701 597.4
+ vertex -93.33453298111435 -102.95197408554206 617.4
+ vertex -93.33453298111434 -102.95197408554206 597.4
+ endloop
+endfacet
+facet normal -0.78298662241806 0.6220385431099575 -3.1509663175953196e-16
+ outer loop
+ vertex -30.60270404808994 194.6127132252034 617.4
+ vertex -29.600287858287494 195.87449752362727 597.4
+ vertex -30.60270404808994 194.6127132252034 597.4
+ endloop
+endfacet
+facet normal -0.78298662241806 0.6220385431099575 -3.1509663175953196e-16
+ outer loop
+ vertex -29.600287858287494 195.87449752362727 597.4
+ vertex -30.60270404808994 194.6127132252034 617.4
+ vertex -29.600287858287494 195.87449752362727 617.4
+ endloop
+endfacet
+facet normal -0.5000000000000009 -0.8660254037844383 1.4922322636809024e-17
+ outer loop
+ vertex -29.842081742052876 190.46620886682194 617.4
+ vertex -15.387718859012988 182.1209785653343 597.4
+ vertex -15.387718859012988 182.1209785653343 617.4
+ endloop
+endfacet
+facet normal -0.5000000000000009 -0.8660254037844383 1.4922322636809024e-17
+ outer loop
+ vertex -15.387718859012988 182.1209785653343 597.4
+ vertex -29.842081742052876 190.46620886682194 617.4
+ vertex -29.842081742052876 190.46620886682194 597.4
+ endloop
+endfacet
+facet normal -0.5000000000000009 -0.8660254037844383 1.4922322636809024e-17
+ outer loop
+ vertex -29.842081742052876 190.46620886682194 597.4
+ vertex -29.842081742052876 190.46620886682194 617.4
+ vertex -32.444930859691745 191.96896450555073 617.4
+ endloop
+endfacet
+facet normal -0.5000000000000009 -0.8660254037844383 1.4922322636809024e-17
+ outer loop
+ vertex -29.842081742052876 190.46620886682194 597.4
+ vertex -32.444930859691745 191.96896450555073 617.4
+ vertex -32.444930859691745 191.96896450555073 597.4
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 22.98903809452716 169.14587254275946 604.4681483474218
+ vertex 35.64785713962948 147.22015479282138 604.4
+ vertex 23.247857139629694 168.69758480667542 604.4
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 35.64785713962948 147.22015479282138 604.4
+ vertex 22.98903809452716 169.14587254275946 604.4681483474218
+ vertex 35.90667618473197 146.77186705673734 604.4681483474218
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 35.90667618473197 146.77186705673734 604.4681483474218
+ vertex 22.98903809452716 169.14587254275946 604.4681483474218
+ vertex 22.747857139629673 169.56361021045984 604.6679491924311
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 35.90667618473197 146.77186705673734 604.4681483474218
+ vertex 22.747857139629673 169.56361021045984 604.6679491924311
+ vertex 36.14785713962946 146.35412938903693 604.6679491924311
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 36.14785713962946 146.35412938903693 604.6679491924311
+ vertex 22.747857139629673 169.56361021045984 604.6679491924311
+ vertex 22.540750358443145 169.92232967806703 604.9857864376269
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 36.14785713962946 146.35412938903693 604.6679491924311
+ vertex 22.540750358443145 169.92232967806703 604.9857864376269
+ vertex 36.35496392081599 145.99540992142977 604.9857864376269
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 36.35496392081599 145.99540992142977 604.9857864376269
+ vertex 22.540750358443145 169.92232967806703 604.9857864376269
+ vertex 22.38183173584526 170.19758480667545 605.4
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 36.35496392081599 145.99540992142977 604.9857864376269
+ vertex 22.38183173584526 170.19758480667545 605.4
+ vertex 36.51388254341387 145.72015479282135 605.4
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 36.51388254341387 145.72015479282135 605.4
+ vertex 22.38183173584526 170.19758480667545 605.4
+ vertex 22.281931313340614 170.37061741415104 605.8823619097949
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 36.51388254341387 145.72015479282135 605.4
+ vertex 22.281931313340614 170.37061741415104 605.8823619097949
+ vertex 36.613782965918475 145.54712218534576 605.8823619097949
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 36.613782965918475 145.54712218534576 605.8823619097949
+ vertex 22.281931313340614 170.37061741415104 605.8823619097949
+ vertex 22.247857139629698 170.42963561424432 606.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 36.613782965918475 145.54712218534576 605.8823619097949
+ vertex 22.247857139629698 170.42963561424432 606.3999999999999
+ vertex 36.647857139629416 145.48810398525248 606.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 36.647857139629416 145.48810398525248 606.3999999999999
+ vertex 22.247857139629698 170.42963561424432 606.3999999999999
+ vertex 22.247857139629698 170.42963561424432 608.4
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 36.647857139629416 145.48810398525248 606.3999999999999
+ vertex 22.247857139629698 170.42963561424432 608.4
+ vertex 36.647857139629416 145.48810398525248 608.4
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 36.647857139629416 145.48810398525248 608.4
+ vertex 22.247857139629698 170.42963561424432 608.4
+ vertex 22.281931313340614 170.37061741415104 608.9176380902051
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 36.647857139629416 145.48810398525248 608.4
+ vertex 22.281931313340614 170.37061741415104 608.9176380902051
+ vertex 36.613782965918475 145.54712218534576 608.9176380902051
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 36.613782965918475 145.54712218534576 608.9176380902051
+ vertex 22.281931313340614 170.37061741415104 608.9176380902051
+ vertex 22.38183173584526 170.19758480667545 609.4
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 36.613782965918475 145.54712218534576 608.9176380902051
+ vertex 22.38183173584526 170.19758480667545 609.4
+ vertex 36.51388254341387 145.72015479282135 609.4
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 36.51388254341387 145.72015479282135 609.4
+ vertex 22.38183173584526 170.19758480667545 609.4
+ vertex 22.540750358443145 169.92232967806703 609.814213562373
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 36.51388254341387 145.72015479282135 609.4
+ vertex 22.540750358443145 169.92232967806703 609.814213562373
+ vertex 36.35496392081599 145.99540992142977 609.814213562373
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 36.35496392081599 145.99540992142977 609.814213562373
+ vertex 22.540750358443145 169.92232967806703 609.814213562373
+ vertex 22.747857139629673 169.56361021045987 610.1320508075687
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 36.35496392081599 145.99540992142977 609.814213562373
+ vertex 22.747857139629673 169.56361021045987 610.1320508075687
+ vertex 36.14785713962946 146.35412938903693 610.1320508075687
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 36.14785713962946 146.35412938903693 610.1320508075687
+ vertex 22.747857139629673 169.56361021045987 610.1320508075687
+ vertex 22.98903809452716 169.14587254275946 610.331851652578
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 36.14785713962946 146.35412938903693 610.1320508075687
+ vertex 22.98903809452716 169.14587254275946 610.331851652578
+ vertex 35.90667618473197 146.77186705673734 610.331851652578
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 35.90667618473197 146.77186705673734 610.331851652578
+ vertex 22.98903809452716 169.14587254275946 610.331851652578
+ vertex 23.247857139629694 168.69758480667542 610.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 35.90667618473197 146.77186705673734 610.331851652578
+ vertex 23.247857139629694 168.69758480667542 610.3999999999999
+ vertex 35.64785713962948 147.22015479282138 610.3999999999999
+ endloop
+endfacet
+facet normal -0.1913417161825971 0.3314135740356456 -0.9238795325112568
+ outer loop
+ vertex 22.747857139629673 169.56361021045984 604.6679491924311
+ vertex 24.721088902095804 170.14587254275943 604.4681483474218
+ vertex 22.98903809452716 169.14587254275946 604.4681483474218
+ endloop
+endfacet
+facet normal -0.1913417161825971 0.3314135740356456 -0.9238795325112568
+ outer loop
+ vertex 24.721088902095804 170.14587254275943 604.4681483474218
+ vertex 22.747857139629673 169.56361021045984 604.6679491924311
+ vertex 24.47990794719832 170.56361021045984 604.6679491924311
+ endloop
+endfacet
+facet normal -0.4957224306869468 0.858616436401238 -0.13052619222004416
+ outer loop
+ vertex 22.281931313340614 170.37061741415104 605.8823619097949
+ vertex 23.979907947198342 171.4296356142443 606.3999999999999
+ vertex 24.013982120909255 171.37061741415104 605.8823619097949
+ endloop
+endfacet
+facet normal -0.4957224306869468 0.858616436401238 -0.13052619222004416
+ outer loop
+ vertex 23.979907947198342 171.4296356142443 606.3999999999999
+ vertex 22.281931313340614 170.37061741415104 605.8823619097949
+ vertex 22.247857139629698 170.42963561424432 606.3999999999999
+ endloop
+endfacet
+facet normal -0.3043807145043778 0.5272028623656411 -0.7933533402912473
+ outer loop
+ vertex 22.540750358443145 169.92232967806703 604.9857864376269
+ vertex 24.47990794719832 170.56361021045984 604.6679491924311
+ vertex 22.747857139629673 169.56361021045984 604.6679491924311
+ endloop
+endfacet
+facet normal -0.3043807145043778 0.5272028623656411 -0.7933533402912473
+ outer loop
+ vertex 24.47990794719832 170.56361021045984 604.6679491924311
+ vertex 22.540750358443145 169.92232967806703 604.9857864376269
+ vertex 24.27280116601179 170.922329678067 604.9857864376269
+ endloop
+endfacet
+facet normal -0.4957224306869483 0.8586164364012406 0.13052619222002182
+ outer loop
+ vertex 23.979907947198342 171.4296356142443 608.4
+ vertex 22.281931313340614 170.37061741415104 608.9176380902051
+ vertex 24.013982120909255 171.37061741415104 608.9176380902051
+ endloop
+endfacet
+facet normal -0.4957224306869483 0.8586164364012406 0.13052619222002182
+ outer loop
+ vertex 22.281931313340614 170.37061741415104 608.9176380902051
+ vertex 23.979907947198342 171.4296356142443 608.4
+ vertex 22.247857139629698 170.42963561424432 608.4
+ endloop
+endfacet
+facet normal -0.46193976625566885 0.8001031451912213 0.38268343236515195
+ outer loop
+ vertex 24.013982120909255 171.37061741415104 608.9176380902051
+ vertex 22.38183173584526 170.19758480667545 609.4
+ vertex 24.113882543413904 171.19758480667542 609.4
+ endloop
+endfacet
+facet normal -0.46193976625566885 0.8001031451912213 0.38268343236515195
+ outer loop
+ vertex 22.38183173584526 170.19758480667545 609.4
+ vertex 24.013982120909255 171.37061741415104 608.9176380902051
+ vertex 22.281931313340614 170.37061741415104 608.9176380902051
+ endloop
+endfacet
+facet normal -0.570083656934367 0.821586650388344 -3.1514509491170916e-16
+ outer loop
+ vertex -22.563577168123395 202.4698133591664 597.4
+ vertex -21.23958885775712 203.3885041598935 617.4
+ vertex -21.23958885775712 203.3885041598935 597.4
+ endloop
+endfacet
+facet normal -0.570083656934367 0.821586650388344 -3.1514509491170916e-16
+ outer loop
+ vertex -21.23958885775712 203.3885041598935 617.4
+ vertex -22.563577168123395 202.4698133591664 597.4
+ vertex -22.563577168123395 202.4698133591664 617.4
+ endloop
+endfacet
+facet normal -0.1913417161825904 0.33141357403563404 0.9238795325112623
+ outer loop
+ vertex 24.721088902095804 170.14587254275943 610.331851652578
+ vertex 22.747857139629673 169.56361021045987 610.1320508075687
+ vertex 22.98903809452716 169.14587254275946 610.331851652578
+ endloop
+endfacet
+facet normal -0.1913417161825904 0.33141357403563404 0.9238795325112623
+ outer loop
+ vertex 22.747857139629673 169.56361021045987 610.1320508075687
+ vertex 24.721088902095804 170.14587254275943 610.331851652578
+ vertex 24.47990794719832 170.56361021045984 610.1320508075687
+ endloop
+endfacet
+facet normal -0.4619397662556816 0.8001031451912431 -0.3826834323650907
+ outer loop
+ vertex 22.38183173584526 170.19758480667545 605.4
+ vertex 24.013982120909255 171.37061741415104 605.8823619097949
+ vertex 24.113882543413904 171.19758480667542 605.4
+ endloop
+endfacet
+facet normal -0.4619397662556816 0.8001031451912431 -0.3826834323650907
+ outer loop
+ vertex 24.013982120909255 171.37061741415104 605.8823619097949
+ vertex 22.38183173584526 170.19758480667545 605.4
+ vertex 22.281931313340614 170.37061741415104 605.8823619097949
+ endloop
+endfacet
+facet normal -0.06526309610999739 0.11303899832175376 0.9914448613738195
+ outer loop
+ vertex 24.97990794719834 169.6975848066754 610.3999999999999
+ vertex 22.98903809452716 169.14587254275946 610.331851652578
+ vertex 23.247857139629694 168.69758480667542 610.3999999999999
+ endloop
+endfacet
+facet normal -0.06526309610999739 0.11303899832175376 0.9914448613738195
+ outer loop
+ vertex 22.98903809452716 169.14587254275946 610.331851652578
+ vertex 24.97990794719834 169.6975848066754 610.3999999999999
+ vertex 24.721088902095804 170.14587254275943 610.331851652578
+ endloop
+endfacet
+facet normal -0.14589989704428225 0.989299358153268 -2.617941281554306e-16
+ outer loop
+ vertex -6.361363525060216 209.27101945922956 597.4
+ vertex -4.767105895595756 209.5061373960643 617.4
+ vertex -4.767105895595756 209.5061373960643 597.4
+ endloop
+endfacet
+facet normal -0.14589989704428225 0.989299358153268 -2.617941281554306e-16
+ outer loop
+ vertex -4.767105895595756 209.5061373960643 617.4
+ vertex -6.361363525060216 209.27101945922956 597.4
+ vertex -6.361363525060216 209.27101945922956 617.4
+ endloop
+endfacet
+facet normal -0.3966766701456324 0.6870641468693998 -0.6087614290087678
+ outer loop
+ vertex 22.540750358443145 169.92232967806703 604.9857864376269
+ vertex 24.113882543413904 171.19758480667542 605.4
+ vertex 24.27280116601179 170.922329678067 604.9857864376269
+ endloop
+endfacet
+facet normal -0.3966766701456324 0.6870641468693998 -0.6087614290087678
+ outer loop
+ vertex 24.113882543413904 171.19758480667542 605.4
+ vertex 22.540750358443145 169.92232967806703 604.9857864376269
+ vertex 22.38183173584526 170.19758480667545 605.4
+ endloop
+endfacet
+facet normal -0.5000000000000415 0.8660254037844146 -9.325056343473811e-32
+ outer loop
+ vertex 22.247857139629698 170.42963561424432 606.3999999999999
+ vertex 23.979907947198342 171.4296356142443 608.4
+ vertex 23.979907947198342 171.4296356142443 606.3999999999999
+ endloop
+endfacet
+facet normal -0.5000000000000415 0.8660254037844146 -9.325056343473811e-32
+ outer loop
+ vertex 23.979907947198342 171.4296356142443 608.4
+ vertex 22.247857139629698 170.42963561424432 606.3999999999999
+ vertex 22.247857139629698 170.42963561424432 608.4
+ endloop
+endfacet
+facet normal -0.3966766701456414 0.6870641468694154 0.6087614290087443
+ outer loop
+ vertex 24.113882543413904 171.19758480667542 609.4
+ vertex 22.540750358443145 169.92232967806703 609.814213562373
+ vertex 24.27280116601179 170.92232967806703 609.814213562373
+ endloop
+endfacet
+facet normal -0.3966766701456414 0.6870641468694154 0.6087614290087443
+ outer loop
+ vertex 22.540750358443145 169.92232967806703 609.814213562373
+ vertex 24.113882543413904 171.19758480667542 609.4
+ vertex 22.38183173584526 170.19758480667545 609.4
+ endloop
+endfacet
+facet normal -0.3043807145043775 0.5272028623656405 0.7933533402912477
+ outer loop
+ vertex 24.47990794719832 170.56361021045984 610.1320508075687
+ vertex 22.540750358443145 169.92232967806703 609.814213562373
+ vertex 22.747857139629673 169.56361021045987 610.1320508075687
+ endloop
+endfacet
+facet normal -0.3043807145043775 0.5272028623656405 0.7933533402912477
+ outer loop
+ vertex 22.540750358443145 169.92232967806703 609.814213562373
+ vertex 24.47990794719832 170.56361021045984 610.1320508075687
+ vertex 24.27280116601179 170.92232967806703 609.814213562373
+ endloop
+endfacet
+facet normal 0.19134171618257428 -0.33141357403565136 -0.9238795325112594
+ outer loop
+ vertex 35.90667618473197 146.77186705673734 604.4681483474218
+ vertex 37.87990794719834 147.3541293890369 604.6679491924311
+ vertex 36.14785713962946 146.35412938903693 604.6679491924311
+ endloop
+endfacet
+facet normal 0.19134171618257428 -0.33141357403565136 -0.9238795325112594
+ outer loop
+ vertex 37.87990794719834 147.3541293890369 604.6679491924311
+ vertex 35.90667618473197 146.77186705673734 604.4681483474218
+ vertex 37.63872699230085 147.7718670567373 604.4681483474218
+ endloop
+endfacet
+facet normal 0.06526309610999431 -0.11303899832176315 -0.9914448613738184
+ outer loop
+ vertex 35.64785713962948 147.22015479282138 604.4
+ vertex 37.63872699230085 147.7718670567373 604.4681483474218
+ vertex 35.90667618473197 146.77186705673734 604.4681483474218
+ endloop
+endfacet
+facet normal 0.06526309610999431 -0.11303899832176315 -0.9914448613738184
+ outer loop
+ vertex 37.63872699230085 147.7718670567373 604.4681483474218
+ vertex 35.64785713962948 147.22015479282138 604.4
+ vertex 37.37990794719834 148.22015479282135 604.4
+ endloop
+endfacet
+facet normal -0.06526309610999742 0.1130389983217538 -0.9914448613738195
+ outer loop
+ vertex 22.98903809452716 169.14587254275946 604.4681483474218
+ vertex 24.97990794719834 169.6975848066754 604.4
+ vertex 23.247857139629694 168.69758480667542 604.4
+ endloop
+endfacet
+facet normal -0.06526309610999742 0.1130389983217538 -0.9914448613738195
+ outer loop
+ vertex 24.97990794719834 169.6975848066754 604.4
+ vertex 22.98903809452716 169.14587254275946 604.4681483474218
+ vertex 24.721088902095804 170.14587254275943 604.4681483474218
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 23.247857139629694 168.69758480667542 604.4
+ vertex 37.37990794719834 148.22015479282135 604.4
+ vertex 35.64785713962948 147.22015479282138 604.4
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 37.37990794719834 148.22015479282135 604.4
+ vertex 23.247857139629694 168.69758480667542 604.4
+ vertex 24.97990794719834 169.6975848066754 604.4
+ endloop
+endfacet
+facet normal 0.4999999999999804 -0.86602540378445 9.325056343474676e-32
+ outer loop
+ vertex 36.647857139629416 145.48810398525248 608.4
+ vertex 38.37990794719834 146.48810398525245 606.3999999999999
+ vertex 38.37990794719834 146.48810398525245 608.4
+ endloop
+endfacet
+facet normal 0.4999999999999804 -0.86602540378445 9.325056343474676e-32
+ outer loop
+ vertex 38.37990794719834 146.48810398525245 606.3999999999999
+ vertex 36.647857139629416 145.48810398525248 608.4
+ vertex 36.647857139629416 145.48810398525248 606.3999999999999
+ endloop
+endfacet
+facet normal 0.4619397662556365 -0.80010314519129 -0.3826834323650471
+ outer loop
+ vertex 36.613782965918475 145.54712218534576 605.8823619097949
+ vertex 38.245933350982774 146.72015479282132 605.4
+ vertex 38.3458337734874 146.54712218534573 605.8823619097949
+ endloop
+endfacet
+facet normal 0.4619397662556365 -0.80010314519129 -0.3826834323650471
+ outer loop
+ vertex 38.245933350982774 146.72015479282132 605.4
+ vertex 36.613782965918475 145.54712218534576 605.8823619097949
+ vertex 36.51388254341387 145.72015479282135 605.4
+ endloop
+endfacet
+facet normal 0.3966766701455924 -0.6870641468694332 -0.6087614290087563
+ outer loop
+ vertex 36.51388254341387 145.72015479282135 605.4
+ vertex 38.08701472838489 146.99540992142974 604.9857864376269
+ vertex 38.245933350982774 146.72015479282132 605.4
+ endloop
+endfacet
+facet normal 0.3966766701455924 -0.6870641468694332 -0.6087614290087563
+ outer loop
+ vertex 38.08701472838489 146.99540992142974 604.9857864376269
+ vertex 36.51388254341387 145.72015479282135 605.4
+ vertex 36.35496392081599 145.99540992142977 604.9857864376269
+ endloop
+endfacet
+facet normal 0.49572243068688643 -0.8586164364012732 0.13052619222004302
+ outer loop
+ vertex 38.3458337734874 146.5471221853457 608.9176380902051
+ vertex 36.647857139629416 145.48810398525248 608.4
+ vertex 38.37990794719834 146.48810398525245 608.4
+ endloop
+endfacet
+facet normal 0.49572243068688643 -0.8586164364012732 0.13052619222004302
+ outer loop
+ vertex 36.647857139629416 145.48810398525248 608.4
+ vertex 38.3458337734874 146.5471221853457 608.9176380902051
+ vertex 36.613782965918475 145.54712218534576 608.9176380902051
+ endloop
+endfacet
+facet normal 0.3043807145043422 -0.527202862365655 -0.7933533402912516
+ outer loop
+ vertex 36.14785713962946 146.35412938903693 604.6679491924311
+ vertex 38.08701472838489 146.99540992142974 604.9857864376269
+ vertex 36.35496392081599 145.99540992142977 604.9857864376269
+ endloop
+endfacet
+facet normal 0.3043807145043422 -0.527202862365655 -0.7933533402912516
+ outer loop
+ vertex 38.08701472838489 146.99540992142974 604.9857864376269
+ vertex 36.14785713962946 146.35412938903693 604.6679491924311
+ vertex 37.87990794719834 147.3541293890369 604.6679491924311
+ endloop
+endfacet
+facet normal 0.49572243068688426 -0.8586164364012696 -0.1305261922200746
+ outer loop
+ vertex 36.647857139629416 145.48810398525248 606.3999999999999
+ vertex 38.3458337734874 146.54712218534573 605.8823619097949
+ vertex 38.37990794719834 146.48810398525245 606.3999999999999
+ endloop
+endfacet
+facet normal 0.49572243068688426 -0.8586164364012696 -0.1305261922200746
+ outer loop
+ vertex 38.3458337734874 146.54712218534573 605.8823619097949
+ vertex 36.647857139629416 145.48810398525248 606.3999999999999
+ vertex 36.613782965918475 145.54712218534576 605.8823619097949
+ endloop
+endfacet
+facet normal 0.4619397662556221 -0.8001031451912651 0.3826834323651162
+ outer loop
+ vertex 38.245933350982774 146.72015479282132 609.4
+ vertex 36.613782965918475 145.54712218534576 608.9176380902051
+ vertex 38.3458337734874 146.5471221853457 608.9176380902051
+ endloop
+endfacet
+facet normal 0.4619397662556221 -0.8001031451912651 0.3826834323651162
+ outer loop
+ vertex 36.613782965918475 145.54712218534576 608.9176380902051
+ vertex 38.245933350982774 146.72015479282132 609.4
+ vertex 36.51388254341387 145.72015479282135 609.4
+ endloop
+endfacet
+facet normal 0.06526309610999435 -0.11303899832176321 0.9914448613738184
+ outer loop
+ vertex 37.63872699230085 147.7718670567373 610.331851652578
+ vertex 35.64785713962948 147.22015479282138 610.3999999999999
+ vertex 35.90667618473197 146.77186705673734 610.331851652578
+ endloop
+endfacet
+facet normal 0.06526309610999435 -0.11303899832176321 0.9914448613738184
+ outer loop
+ vertex 35.64785713962948 147.22015479282138 610.3999999999999
+ vertex 37.63872699230085 147.7718670567373 610.331851652578
+ vertex 37.37990794719834 148.22015479282135 610.3999999999999
+ endloop
+endfacet
+facet normal 0.19134171618257428 -0.33141357403565136 0.9238795325112594
+ outer loop
+ vertex 37.87990794719834 147.3541293890369 610.1320508075687
+ vertex 35.90667618473197 146.77186705673734 610.331851652578
+ vertex 36.14785713962946 146.35412938903693 610.1320508075687
+ endloop
+endfacet
+facet normal 0.19134171618257428 -0.33141357403565136 0.9238795325112594
+ outer loop
+ vertex 35.90667618473197 146.77186705673734 610.331851652578
+ vertex 37.87990794719834 147.3541293890369 610.1320508075687
+ vertex 37.63872699230085 147.7718670567373 610.331851652578
+ endloop
+endfacet
+facet normal 0.3043807145043422 -0.527202862365655 0.7933533402912516
+ outer loop
+ vertex 38.08701472838489 146.99540992142974 609.814213562373
+ vertex 36.14785713962946 146.35412938903693 610.1320508075687
+ vertex 36.35496392081599 145.99540992142977 609.814213562373
+ endloop
+endfacet
+facet normal 0.3043807145043422 -0.527202862365655 0.7933533402912516
+ outer loop
+ vertex 36.14785713962946 146.35412938903693 610.1320508075687
+ vertex 38.08701472838489 146.99540992142974 609.814213562373
+ vertex 37.87990794719834 147.3541293890369 610.1320508075687
+ endloop
+endfacet
+facet normal 5.933957380480184e-32 1.4193619471206742e-31 1.0
+ outer loop
+ vertex 37.37990794719834 148.22015479282135 610.3999999999999
+ vertex 23.247857139629694 168.69758480667542 610.3999999999999
+ vertex 35.64785713962948 147.22015479282138 610.3999999999999
+ endloop
+endfacet
+facet normal 5.933957380480184e-32 1.4193619471206742e-31 1.0
+ outer loop
+ vertex 23.247857139629694 168.69758480667542 610.3999999999999
+ vertex 37.37990794719834 148.22015479282135 610.3999999999999
+ vertex 24.97990794719834 169.6975848066754 610.3999999999999
+ endloop
+endfacet
+facet normal 0.39667667014559244 -0.6870641468694333 0.6087614290087562
+ outer loop
+ vertex 38.08701472838489 146.99540992142974 609.814213562373
+ vertex 36.51388254341387 145.72015479282135 609.4
+ vertex 38.245933350982774 146.72015479282132 609.4
+ endloop
+endfacet
+facet normal 0.39667667014559244 -0.6870641468694333 0.6087614290087562
+ outer loop
+ vertex 36.51388254341387 145.72015479282135 609.4
+ vertex 38.08701472838489 146.99540992142974 609.814213562373
+ vertex 36.35496392081599 145.99540992142977 609.814213562373
+ endloop
+endfacet
+facet normal -0.4252767351160145 0.9050633671567219 -3.0302967770914016e-16
+ outer loop
+ vertex -17.053630465292567 205.80157985229934 597.4
+ vertex -15.595119281244203 206.4869140476617 617.4
+ vertex -15.595119281244203 206.4869140476617 597.4
+ endloop
+endfacet
+facet normal -0.4252767351160145 0.9050633671567219 -3.0302967770914016e-16
+ outer loop
+ vertex -15.595119281244203 206.4869140476617 617.4
+ vertex -17.053630465292567 205.80157985229934 597.4
+ vertex -17.053630465292567 205.80157985229934 617.4
+ endloop
+endfacet
+facet normal -0.38705234313864256 0.9220577442171864 -2.986595129490503e-16
+ outer loop
+ vertex -15.595119281244203 206.4869140476617 597.4
+ vertex -14.10922162912293 207.11064956913492 617.4
+ vertex -14.10922162912293 207.11064956913492 597.4
+ endloop
+endfacet
+facet normal -0.38705234313864256 0.9220577442171864 -2.986595129490503e-16
+ outer loop
+ vertex -14.10922162912293 207.11064956913492 617.4
+ vertex -15.595119281244203 206.4869140476617 597.4
+ vertex -15.595119281244203 206.4869140476617 617.4
+ endloop
+endfacet
+facet normal -0.2280676514218636 0.9736452877587994 -2.760426732024956e-16
+ outer loop
+ vertex -9.513424023535883 208.60189949091367 597.4
+ vertex -7.944392955630252 208.96943090627016 617.4
+ vertex -7.944392955630252 208.96943090627016 597.4
+ endloop
+endfacet
+facet normal -0.2280676514218636 0.9736452877587994 -2.760426732024956e-16
+ outer loop
+ vertex -7.944392955630252 208.96943090627016 617.4
+ vertex -9.513424023535883 208.60189949091367 597.4
+ vertex -9.513424023535883 208.60189949091367 617.4
+ endloop
+endfacet
+facet normal -0.46275692980869254 0.8864852079499311 -3.068695668987272e-16
+ outer loop
+ vertex -18.48220291359554 205.05584625826145 597.4
+ vertex -17.053630465292567 205.80157985229934 617.4
+ vertex -17.053630465292567 205.80157985229934 597.4
+ endloop
+endfacet
+facet normal -0.46275692980869254 0.8864852079499311 -3.068695668987272e-16
+ outer loop
+ vertex -17.053630465292567 205.80157985229934 617.4
+ vertex -18.48220291359554 205.05584625826145 597.4
+ vertex -18.48220291359554 205.05584625826145 617.4
+ endloop
+endfacet
+facet normal -0.6684424840618581 0.743763837183022 -3.184631229828643e-16
+ outer loop
+ vertex -26.28914091006915 199.3932313652284 597.4
+ vertex -25.09056419799865 200.4704275862621 617.4
+ vertex -25.09056419799865 200.4704275862621 597.4
+ endloop
+endfacet
+facet normal -0.6684424840618581 0.743763837183022 -3.184631229828643e-16
+ outer loop
+ vertex -25.09056419799865 200.4704275862621 617.4
+ vertex -26.28914091006915 199.3932313652284 597.4
+ vertex -26.28914091006915 199.3932313652284 617.4
+ endloop
+endfacet
+facet normal 0.7071067811865441 0.707106781186551 -1.0474336536187897e-17
+ outer loop
+ vertex -23.95080047201519 153.92630982863116 597.4
+ vertex -23.448487618904775 153.42399697552077 617.4
+ vertex -23.448487618904775 153.42399697552077 597.4
+ endloop
+endfacet
+facet normal 0.7071067811865441 0.707106781186551 -1.0474336536187897e-17
+ outer loop
+ vertex -23.448487618904775 153.42399697552077 617.4
+ vertex -23.95080047201519 153.92630982863116 597.4
+ vertex -23.95080047201519 153.9263098286312 617.4
+ endloop
+endfacet
+facet normal -0.26858868412533565 0.9632549604127771 -2.82448397113109e-16
+ outer loop
+ vertex -11.065711060923867 208.16906836115942 597.4
+ vertex -9.513424023535883 208.60189949091367 617.4
+ vertex -9.513424023535883 208.60189949091367 597.4
+ endloop
+endfacet
+facet normal -0.26858868412533565 0.9632549604127771 -2.82448397113109e-16
+ outer loop
+ vertex -9.513424023535883 208.60189949091367 617.4
+ vertex -11.065711060923867 208.16906836115942 597.4
+ vertex -11.065711060923867 208.16906836115942 617.4
+ endloop
+endfacet
+facet normal -0.6367513322442928 0.7710692192566879 -3.17912787827519e-16
+ outer loop
+ vertex -25.09056419799865 200.4704275862621 597.4
+ vertex -23.847984815414293 201.49655346124206 617.4
+ vertex -23.847984815414293 201.49655346124206 597.4
+ endloop
+endfacet
+facet normal -0.6367513322442928 0.7710692192566879 -3.17912787827519e-16
+ outer loop
+ vertex -23.847984815414293 201.49655346124206 617.4
+ vertex -25.09056419799865 200.4704275862621 597.4
+ vertex -25.09056419799865 200.4704275862621 617.4
+ endloop
+endfacet
+facet normal 0.08715574274765935 0.9961946980917455 -2.1265981455630484e-16
+ outer loop
+ vertex -21.53658740175749 152.53246326263678 597.4
+ vertex -20.828912953759342 152.47054977096997 617.4
+ vertex -20.828912953759342 152.47054977096997 597.4
+ endloop
+endfacet
+facet normal 0.08715574274765935 0.9961946980917455 -2.1265981455630484e-16
+ outer loop
+ vertex -20.828912953759342 152.47054977096997 617.4
+ vertex -21.53658740175749 152.53246326263678 597.4
+ vertex -21.53658740175749 152.5324632626368 617.4
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 15.497857139629502 182.12097856533427 597.4
+ vertex 22.98903809452716 169.14587254275946 604.4681483474218
+ vertex 43.143156601250205 134.23791530735056 597.4
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 22.98903809452716 169.14587254275946 604.4681483474218
+ vertex 15.497857139629502 182.12097856533427 597.4
+ vertex 22.747857139629673 169.56361021045984 604.6679491924311
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 22.747857139629673 169.56361021045984 604.6679491924311
+ vertex 15.497857139629502 182.12097856533427 597.4
+ vertex 22.540750358443145 169.92232967806703 604.9857864376269
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 22.540750358443145 169.92232967806703 604.9857864376269
+ vertex 15.497857139629502 182.12097856533427 597.4
+ vertex 15.497857139629502 182.12097856533427 617.4
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 43.143156601250205 134.23791530735056 597.4
+ vertex 22.98903809452716 169.14587254275946 604.4681483474218
+ vertex 23.247857139629694 168.69758480667542 604.4
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 22.540750358443145 169.92232967806703 604.9857864376269
+ vertex 15.497857139629502 182.12097856533427 617.4
+ vertex 22.38183173584526 170.19758480667545 605.4
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 22.38183173584526 170.19758480667545 605.4
+ vertex 15.497857139629502 182.12097856533427 617.4
+ vertex 22.281931313340614 170.37061741415104 605.8823619097949
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 22.281931313340614 170.37061741415104 605.8823619097949
+ vertex 15.497857139629502 182.12097856533427 617.4
+ vertex 22.247857139629698 170.42963561424432 606.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 22.247857139629698 170.42963561424432 606.3999999999999
+ vertex 15.497857139629502 182.12097856533427 617.4
+ vertex 22.247857139629698 170.42963561424432 608.4
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 22.247857139629698 170.42963561424432 608.4
+ vertex 15.497857139629502 182.12097856533427 617.4
+ vertex 22.281931313340614 170.37061741415104 608.9176380902051
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 22.281931313340614 170.37061741415104 608.9176380902051
+ vertex 15.497857139629502 182.12097856533427 617.4
+ vertex 22.38183173584526 170.19758480667545 609.4
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 22.38183173584526 170.19758480667545 609.4
+ vertex 15.497857139629502 182.12097856533427 617.4
+ vertex 22.540750358443145 169.92232967806703 609.814213562373
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 22.540750358443145 169.92232967806703 609.814213562373
+ vertex 15.497857139629502 182.12097856533427 617.4
+ vertex 22.747857139629673 169.56361021045987 610.1320508075687
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 22.747857139629673 169.56361021045987 610.1320508075687
+ vertex 15.497857139629502 182.12097856533427 617.4
+ vertex 22.98903809452716 169.14587254275946 610.331851652578
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 22.98903809452716 169.14587254275946 610.331851652578
+ vertex 15.497857139629502 182.12097856533427 617.4
+ vertex 23.247857139629694 168.69758480667542 610.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 23.247857139629694 168.69758480667542 610.3999999999999
+ vertex 15.497857139629502 182.12097856533427 617.4
+ vertex 35.64785713962948 147.22015479282138 610.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 43.143156601250205 134.23791530735056 597.4
+ vertex 36.35496392081599 145.99540992142977 604.9857864376269
+ vertex 43.143156601250205 134.2379153073506 617.4
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 36.35496392081599 145.99540992142977 604.9857864376269
+ vertex 43.143156601250205 134.23791530735056 597.4
+ vertex 36.14785713962946 146.35412938903693 604.6679491924311
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 36.14785713962946 146.35412938903693 604.6679491924311
+ vertex 43.143156601250205 134.23791530735056 597.4
+ vertex 35.90667618473197 146.77186705673734 604.4681483474218
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 35.90667618473197 146.77186705673734 604.4681483474218
+ vertex 43.143156601250205 134.23791530735056 597.4
+ vertex 35.64785713962948 147.22015479282138 604.4
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 35.64785713962948 147.22015479282138 604.4
+ vertex 43.143156601250205 134.23791530735056 597.4
+ vertex 23.247857139629694 168.69758480667542 604.4
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 43.143156601250205 134.2379153073506 617.4
+ vertex 36.35496392081599 145.99540992142977 604.9857864376269
+ vertex 36.51388254341387 145.72015479282135 605.4
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 43.143156601250205 134.2379153073506 617.4
+ vertex 36.51388254341387 145.72015479282135 605.4
+ vertex 36.613782965918475 145.54712218534576 605.8823619097949
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 43.143156601250205 134.2379153073506 617.4
+ vertex 36.613782965918475 145.54712218534576 605.8823619097949
+ vertex 36.647857139629416 145.48810398525248 606.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 43.143156601250205 134.2379153073506 617.4
+ vertex 36.647857139629416 145.48810398525248 606.3999999999999
+ vertex 36.647857139629416 145.48810398525248 608.4
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 43.143156601250205 134.2379153073506 617.4
+ vertex 36.647857139629416 145.48810398525248 608.4
+ vertex 36.613782965918475 145.54712218534576 608.9176380902051
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 43.143156601250205 134.2379153073506 617.4
+ vertex 36.613782965918475 145.54712218534576 608.9176380902051
+ vertex 36.51388254341387 145.72015479282135 609.4
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 43.143156601250205 134.2379153073506 617.4
+ vertex 36.51388254341387 145.72015479282135 609.4
+ vertex 36.35496392081599 145.99540992142977 609.814213562373
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 43.143156601250205 134.2379153073506 617.4
+ vertex 36.35496392081599 145.99540992142977 609.814213562373
+ vertex 36.14785713962946 146.35412938903693 610.1320508075687
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 43.143156601250205 134.2379153073506 617.4
+ vertex 36.14785713962946 146.35412938903693 610.1320508075687
+ vertex 35.90667618473197 146.77186705673734 610.331851652578
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 43.143156601250205 134.2379153073506 617.4
+ vertex 35.90667618473197 146.77186705673734 610.331851652578
+ vertex 35.64785713962948 147.22015479282138 610.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 7.227945163972765e-17
+ outer loop
+ vertex 43.143156601250205 134.2379153073506 617.4
+ vertex 35.64785713962948 147.22015479282138 610.3999999999999
+ vertex 15.497857139629502 182.12097856533427 617.4
+ endloop
+endfacet
+facet normal 0.41219617871317477 -0.9110951159205368 3.015844579888886e-16
+ outer loop
+ vertex 42.546827577587486 132.30606365477246 617.4
+ vertex 42.98845606287095 132.5058644997817 597.4
+ vertex 42.98845606287095 132.5058644997817 617.4
+ endloop
+endfacet
+facet normal 0.41219617871317477 -0.9110951159205368 3.015844579888886e-16
+ outer loop
+ vertex 42.98845606287095 132.5058644997817 597.4
+ vertex 42.546827577587486 132.30606365477246 617.4
+ vertex 42.546827577587486 132.30606365477246 597.4
+ endloop
+endfacet
+facet normal 0.22806765142186164 0.9736452877588 -1.7673928161385326e-16
+ outer loop
+ vertex 8.05453123624676 208.96943090627016 597.4
+ vertex 9.623562304152413 208.60189949091367 617.4
+ vertex 9.623562304152413 208.60189949091367 597.4
+ endloop
+endfacet
+facet normal 0.22806765142186164 0.9736452877588 -1.7673928161385326e-16
+ outer loop
+ vertex 9.623562304152413 208.60189949091367 617.4
+ vertex 8.05453123624676 208.96943090627016 597.4
+ vertex 8.05453123624676 208.96943090627016 617.4
+ endloop
+endfacet
+facet normal 0.6039459209966543 0.7970252972845361 -5.384083332812355e-17
+ outer loop
+ vertex 22.67371544873991 202.46981335916635 597.4
+ vertex 23.958123096030832 201.49655346124203 617.4
+ vertex 23.958123096030832 201.49655346124203 597.4
+ endloop
+endfacet
+facet normal 0.6039459209966543 0.7970252972845361 -5.384083332812355e-17
+ outer loop
+ vertex 23.958123096030832 201.49655346124203 617.4
+ vertex 22.67371544873991 202.46981335916635 597.4
+ vertex 22.67371544873991 202.46981335916635 617.4
+ endloop
+endfacet
+facet normal 0.832232779361344 0.554426371086813 5.226743208186157e-17
+ outer loop
+ vertex 31.66161008284822 193.31010907119958 617.4
+ vertex 32.55506914030826 191.96896450555064 597.4
+ vertex 31.66161008284822 193.31010907119958 597.4
+ endloop
+endfacet
+facet normal 0.832232779361344 0.554426371086813 5.226743208186157e-17
+ outer loop
+ vertex 32.55506914030826 191.96896450555064 597.4
+ vertex 31.66161008284822 193.31010907119958 617.4
+ vertex 32.55506914030826 191.96896450555064 617.4
+ endloop
+endfacet
+facet normal 0.6367513322442965 0.771069219256685 -4.0663618573418724e-17
+ outer loop
+ vertex 23.958123096030832 201.49655346124203 597.4
+ vertex 25.200702478615163 200.47042758626208 617.4
+ vertex 25.200702478615163 200.47042758626208 597.4
+ endloop
+endfacet
+facet normal 0.6367513322442965 0.771069219256685 -4.0663618573418724e-17
+ outer loop
+ vertex 25.200702478615163 200.47042758626208 617.4
+ vertex 23.958123096030832 201.49655346124203 597.4
+ vertex 23.958123096030832 201.49655346124203 617.4
+ endloop
+endfacet
+facet normal -1.7761928181661448e-15 -1.0 2.32518947356378e-16
+ outer loop
+ vertex -41.8783177822545 132.23791530735065 617.4
+ vertex -39.568916705496 132.23791530735065 597.4
+ vertex -39.568916705496 132.23791530735065 617.4
+ endloop
+endfacet
+facet normal -1.7761928181661448e-15 -1.0 2.32518947356378e-16
+ outer loop
+ vertex -39.568916705496 132.23791530735065 597.4
+ vertex -41.8783177822545 132.23791530735065 617.4
+ vertex -41.8783177822545 132.23791530735065 597.4
+ endloop
+endfacet
+facet normal 0.30863971000050494 0.9511790206952655 -1.5397442837550535e-16
+ outer loop
+ vertex 11.17584934154037 208.1690683611594 597.4
+ vertex 12.708675981153974 207.6716949338254 617.4
+ vertex 12.708675981153974 207.6716949338254 597.4
+ endloop
+endfacet
+facet normal 0.30863971000050494 0.9511790206952655 -1.5397442837550535e-16
+ outer loop
+ vertex 12.708675981153974 207.6716949338254 617.4
+ vertex 11.17584934154037 208.1690683611594 597.4
+ vertex 11.17584934154037 208.1690683611594 617.4
+ endloop
+endfacet
+facet normal -0.9951296050076995 0.09857519585179583 -2.3956628513972264e-16
+ outer loop
+ vertex -43.30096751306486 133.23791530735065 617.4
+ vertex -43.253185877898744 133.7202772171456 597.4
+ vertex -43.30096751306486 133.23791530735065 597.4
+ endloop
+endfacet
+facet normal -0.9951296050076995 0.09857519585179583 -2.3956628513972264e-16
+ outer loop
+ vertex -43.253185877898744 133.7202772171456 597.4
+ vertex -43.30096751306486 133.23791530735065 617.4
+ vertex -43.253185877898744 133.72027721714562 617.4
+ endloop
+endfacet
+facet normal 0.18714752017171837 0.9823318205645059 -1.8766762311344229e-16
+ outer loop
+ vertex 6.471501805676724 209.27101945922956 597.4
+ vertex 8.05453123624676 208.96943090627016 617.4
+ vertex 8.05453123624676 208.96943090627016 597.4
+ endloop
+endfacet
+facet normal 0.18714752017171837 0.9823318205645059 -1.8766762311344229e-16
+ outer loop
+ vertex 8.05453123624676 208.96943090627016 617.4
+ vertex 6.471501805676724 209.27101945922956 597.4
+ vertex 6.471501805676724 209.27101945922956 617.4
+ endloop
+endfacet
+facet normal 0.10439696179123423 0.9945357079405243 -2.085205511042219e-16
+ outer loop
+ vertex 3.274548159994501 209.67437328084162 597.4
+ vertex 4.877244176212259 209.5061373960643 617.4
+ vertex 4.877244176212259 209.5061373960643 597.4
+ endloop
+endfacet
+facet normal 0.10439696179123423 0.9945357079405243 -2.085205511042219e-16
+ outer loop
+ vertex 4.877244176212259 209.5061373960643 617.4
+ vertex 3.274548159994501 209.67437328084162 597.4
+ vertex 3.274548159994501 209.67437328084162 617.4
+ endloop
+endfacet
+facet normal 0.7282622292749887 0.685298566619998 -7.978454901594019e-19
+ outer loop
+ vertex 27.551755827279884 198.26684979780475 617.4
+ vertex 28.65611565455649 197.09325395373207 597.4
+ vertex 27.551755827279884 198.26684979780475 597.4
+ endloop
+endfacet
+facet normal 0.7282622292749887 0.685298566619998 -7.978454901594019e-19
+ outer loop
+ vertex 28.65611565455649 197.09325395373207 597.4
+ vertex 27.551755827279884 198.26684979780475 617.4
+ vertex 28.65611565455649 197.09325395373207 617.4
+ endloop
+endfacet
+facet normal 0.49999999999999933 -0.8660254037844392 3.205346706876122e-31
+ outer loop
+ vertex 29.952220022669408 190.4662088668219 617.4
+ vertex 32.55506914030826 191.96896450555064 597.4
+ vertex 32.55506914030826 191.96896450555064 617.4
+ endloop
+endfacet
+facet normal 0.49999999999999933 -0.8660254037844392 3.205346706876122e-31
+ outer loop
+ vertex 32.55506914030826 191.96896450555064 597.4
+ vertex 29.952220022669408 190.4662088668219 617.4
+ vertex 29.952220022669408 190.4662088668219 597.4
+ endloop
+endfacet
+facet normal 0.49999999999999933 -0.8660254037844392 3.205346706876122e-31
+ outer loop
+ vertex 29.952220022669408 190.4662088668219 597.4
+ vertex 29.952220022669408 190.4662088668219 617.4
+ vertex 15.497857139629502 182.12097856533427 617.4
+ endloop
+endfacet
+facet normal 0.49999999999999933 -0.8660254037844392 3.205346706876122e-31
+ outer loop
+ vertex 29.952220022669408 190.4662088668219 597.4
+ vertex 15.497857139629502 182.12097856533427 617.4
+ vertex 15.497857139629502 182.12097856533427 597.4
+ endloop
+endfacet
+facet normal 0.14589989704428336 0.9892993581532677 -1.982675626008463e-16
+ outer loop
+ vertex 4.877244176212259 209.5061373960643 597.4
+ vertex 6.471501805676724 209.27101945922956 617.4
+ vertex 6.471501805676724 209.27101945922956 597.4
+ endloop
+endfacet
+facet normal 0.14589989704428336 0.9892993581532677 -1.982675626008463e-16
+ outer loop
+ vertex 6.471501805676724 209.27101945922956 617.4
+ vertex 4.877244176212259 209.5061373960643 597.4
+ vertex 4.877244176212259 209.5061373960643 617.4
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 3.0479839899610546e-16
+ outer loop
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex -39.568916705496 132.23791530735065 597.4
+ vertex -30.37020590902545 148.17054977096998 597.4
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 3.0479839899610546e-16
+ outer loop
+ vertex -39.568916705496 132.23791530735065 597.4
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex -39.568916705496 132.23791530735065 617.4
+ endloop
+endfacet
+facet normal 0.5352237960733169 0.8447102983371686 -7.988971840785991e-17
+ outer loop
+ vertex 19.988475029279908 204.25101823445388 597.4
+ vertex 21.349727138373666 203.38850415989344 617.4
+ vertex 21.349727138373666 203.38850415989344 597.4
+ endloop
+endfacet
+facet normal 0.5352237960733169 0.8447102983371686 -7.988971840785991e-17
+ outer loop
+ vertex 21.349727138373666 203.38850415989344 617.4
+ vertex 19.988475029279908 204.25101823445388 597.4
+ vertex 19.988475029279908 204.25101823445388 617.4
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 2.3251894735637823e-16
+ outer loop
+ vertex 39.679054986112455 132.2379153073506 617.4
+ vertex 41.98845606287095 132.2379153073506 597.4
+ vertex 41.98845606287095 132.2379153073506 617.4
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 2.3251894735637823e-16
+ outer loop
+ vertex 41.98845606287095 132.2379153073506 597.4
+ vertex 39.679054986112455 132.2379153073506 617.4
+ vertex 39.679054986112455 132.2379153073506 597.4
+ endloop
+endfacet
+facet normal 0.5700836569343793 0.8215866503883357 -6.69238313089874e-17
+ outer loop
+ vertex 21.349727138373666 203.38850415989344 597.4
+ vertex 22.67371544873991 202.46981335916635 617.4
+ vertex 22.67371544873991 202.46981335916635 597.4
+ endloop
+endfacet
+facet normal 0.5700836569343793 0.8215866503883357 -6.69238313089874e-17
+ outer loop
+ vertex 22.67371544873991 202.46981335916635 617.4
+ vertex 21.349727138373666 203.38850415989344 597.4
+ vertex 21.349727138373666 203.38850415989344 617.4
+ endloop
+endfacet
+facet normal 0.46275692980869365 0.8864852079499307 -1.0537964790030881e-16
+ outer loop
+ vertex 17.163768745909092 205.80157985229934 597.4
+ vertex 18.592341194212068 205.0558462582614 617.4
+ vertex 18.592341194212068 205.0558462582614 597.4
+ endloop
+endfacet
+facet normal 0.46275692980869365 0.8864852079499307 -1.0537964790030881e-16
+ outer loop
+ vertex 18.592341194212068 205.0558462582614 617.4
+ vertex 17.163768745909092 205.80157985229934 597.4
+ vertex 17.163768745909092 205.80157985229934 617.4
+ endloop
+endfacet
+facet normal -0.9202212155149918 0.3913986644281133 -2.913452840785478e-16
+ outer loop
+ vertex -43.253185877898744 133.72027721714562 617.4
+ vertex -43.03301832063373 134.23791530735065 597.4
+ vertex -43.253185877898744 133.7202772171456 597.4
+ endloop
+endfacet
+facet normal -0.9202212155149918 0.3913986644281133 -2.913452840785478e-16
+ outer loop
+ vertex -43.03301832063373 134.23791530735065 597.4
+ vertex -43.253185877898744 133.72027721714562 617.4
+ vertex -43.03301832063373 134.23791530735068 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -43.03301832063373 134.23791530735065 597.4
+ vertex -35.79653790411552 146.77186705673736 604.4681483474218
+ vertex -15.387718859012988 182.1209785653343 597.4
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -35.79653790411552 146.77186705673736 604.4681483474218
+ vertex -43.03301832063373 134.23791530735065 597.4
+ vertex -36.037718859013005 146.35412938903696 604.6679491924311
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -36.037718859013005 146.35412938903696 604.6679491924311
+ vertex -43.03301832063373 134.23791530735065 597.4
+ vertex -36.24482564019956 145.9954099214298 604.9857864376269
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -36.24482564019956 145.9954099214298 604.9857864376269
+ vertex -43.03301832063373 134.23791530735065 597.4
+ vertex -43.03301832063373 134.23791530735068 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -15.387718859012988 182.1209785653343 597.4
+ vertex -35.79653790411552 146.77186705673736 604.4681483474218
+ vertex -35.537718859013005 147.22015479282138 604.4
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -36.24482564019956 145.9954099214298 604.9857864376269
+ vertex -43.03301832063373 134.23791530735068 617.4
+ vertex -36.40374426279744 145.72015479282138 605.4
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -36.40374426279744 145.72015479282138 605.4
+ vertex -43.03301832063373 134.23791530735068 617.4
+ vertex -36.50364468530207 145.54712218534578 605.8823619097949
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -36.50364468530207 145.54712218534578 605.8823619097949
+ vertex -43.03301832063373 134.23791530735068 617.4
+ vertex -36.537718859013005 145.4881039852525 606.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -36.537718859013005 145.4881039852525 606.3999999999999
+ vertex -43.03301832063373 134.23791530735068 617.4
+ vertex -36.537718859013005 145.4881039852525 608.4
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -36.537718859013005 145.4881039852525 608.4
+ vertex -43.03301832063373 134.23791530735068 617.4
+ vertex -36.50364468530207 145.54712218534578 608.9176380902051
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -36.50364468530207 145.54712218534578 608.9176380902051
+ vertex -43.03301832063373 134.23791530735068 617.4
+ vertex -36.40374426279744 145.72015479282138 609.4
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -36.40374426279744 145.72015479282138 609.4
+ vertex -43.03301832063373 134.23791530735068 617.4
+ vertex -36.24482564019956 145.99540992142983 609.814213562373
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -36.24482564019956 145.99540992142983 609.814213562373
+ vertex -43.03301832063373 134.23791530735068 617.4
+ vertex -36.037718859013005 146.35412938903696 610.1320508075687
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -36.037718859013005 146.35412938903696 610.1320508075687
+ vertex -43.03301832063373 134.23791530735068 617.4
+ vertex -35.79653790411552 146.77186705673736 610.331851652578
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -35.79653790411552 146.77186705673736 610.331851652578
+ vertex -43.03301832063373 134.23791530735068 617.4
+ vertex -35.537718859013005 147.22015479282138 610.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -35.537718859013005 147.22015479282138 610.3999999999999
+ vertex -43.03301832063373 134.23791530735068 617.4
+ vertex -23.137718859012985 168.69758480667545 610.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -15.387718859012988 182.1209785653343 597.4
+ vertex -22.430612077826435 169.92232967806703 604.9857864376269
+ vertex -15.387718859012988 182.1209785653343 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -22.430612077826435 169.92232967806703 604.9857864376269
+ vertex -15.387718859012988 182.1209785653343 597.4
+ vertex -22.637718859012963 169.56361021045987 604.6679491924311
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -22.637718859012963 169.56361021045987 604.6679491924311
+ vertex -15.387718859012988 182.1209785653343 597.4
+ vertex -22.87889981391045 169.1458725427595 604.4681483474218
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -22.87889981391045 169.1458725427595 604.4681483474218
+ vertex -15.387718859012988 182.1209785653343 597.4
+ vertex -23.137718859012985 168.69758480667545 604.4
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -23.137718859012985 168.69758480667545 604.4
+ vertex -15.387718859012988 182.1209785653343 597.4
+ vertex -35.537718859013005 147.22015479282138 604.4
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -15.387718859012988 182.1209785653343 617.4
+ vertex -22.430612077826435 169.92232967806703 604.9857864376269
+ vertex -22.27169345522855 170.19758480667548 605.4
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -15.387718859012988 182.1209785653343 617.4
+ vertex -22.27169345522855 170.19758480667548 605.4
+ vertex -22.1717930327239 170.37061741415107 605.8823619097949
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -15.387718859012988 182.1209785653343 617.4
+ vertex -22.1717930327239 170.37061741415107 605.8823619097949
+ vertex -22.13771885901299 170.42963561424435 606.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -15.387718859012988 182.1209785653343 617.4
+ vertex -22.13771885901299 170.42963561424435 606.3999999999999
+ vertex -22.13771885901299 170.42963561424435 608.4
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -15.387718859012988 182.1209785653343 617.4
+ vertex -22.13771885901299 170.42963561424435 608.4
+ vertex -22.1717930327239 170.37061741415107 608.9176380902051
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -15.387718859012988 182.1209785653343 617.4
+ vertex -22.1717930327239 170.37061741415107 608.9176380902051
+ vertex -22.27169345522855 170.19758480667548 609.4
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -15.387718859012988 182.1209785653343 617.4
+ vertex -22.27169345522855 170.19758480667548 609.4
+ vertex -22.430612077826435 169.92232967806706 609.814213562373
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -15.387718859012988 182.1209785653343 617.4
+ vertex -22.430612077826435 169.92232967806706 609.814213562373
+ vertex -22.637718859012963 169.5636102104599 610.1320508075687
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -15.387718859012988 182.1209785653343 617.4
+ vertex -22.637718859012963 169.5636102104599 610.1320508075687
+ vertex -22.87889981391045 169.1458725427595 610.331851652578
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -15.387718859012988 182.1209785653343 617.4
+ vertex -22.87889981391045 169.1458725427595 610.331851652578
+ vertex -23.137718859012985 168.69758480667545 610.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -3.047983989961055e-16
+ outer loop
+ vertex -15.387718859012988 182.1209785653343 617.4
+ vertex -23.137718859012985 168.69758480667545 610.3999999999999
+ vertex -43.03301832063373 134.23791530735068 617.4
+ endloop
+endfacet
+facet normal 0.7829866224180636 0.6220385431099531 2.5825137241488715e-17
+ outer loop
+ vertex 29.71042613890401 195.8744975236272 617.4
+ vertex 30.712842328706454 194.61271322520335 597.4
+ vertex 29.71042613890401 195.8744975236272 597.4
+ endloop
+endfacet
+facet normal 0.7829866224180636 0.6220385431099531 2.5825137241488715e-17
+ outer loop
+ vertex 30.712842328706454 194.61271322520335 597.4
+ vertex 29.71042613890401 195.8744975236272 617.4
+ vertex 30.712842328706454 194.61271322520335 617.4
+ endloop
+endfacet
+facet normal 0.2685886841253404 0.9632549604127758 -1.6550166174886728e-16
+ outer loop
+ vertex 9.623562304152413 208.60189949091367 597.4
+ vertex 11.17584934154037 208.1690683611594 617.4
+ vertex 11.17584934154037 208.1690683611594 597.4
+ endloop
+endfacet
+facet normal 0.2685886841253404 0.9632549604127758 -1.6550166174886728e-16
+ outer loop
+ vertex 11.17584934154037 208.1690683611594 617.4
+ vertex 9.623562304152413 208.60189949091367 597.4
+ vertex 9.623562304152413 208.60189949091367 617.4
+ endloop
+endfacet
+facet normal 0.6989639196910199 0.7151569331064095 -1.4118899179752994e-17
+ outer loop
+ vertex 26.399279190685665 199.3932313652283 597.4
+ vertex 27.551755827279884 198.26684979780475 617.4
+ vertex 27.551755827279884 198.26684979780475 597.4
+ endloop
+endfacet
+facet normal 0.6989639196910199 0.7151569331064095 -1.4118899179752994e-17
+ outer loop
+ vertex 27.551755827279884 198.26684979780475 617.4
+ vertex 26.399279190685665 199.3932313652283 597.4
+ vertex 26.399279190685665 199.3932313652283 617.4
+ endloop
+endfacet
+facet normal 0.668442484061863 0.7437638371830175 -2.7415246024207674e-17
+ outer loop
+ vertex 25.200702478615163 200.47042758626208 597.4
+ vertex 26.399279190685665 199.3932313652283 617.4
+ vertex 26.399279190685665 199.3932313652283 597.4
+ endloop
+endfacet
+facet normal 0.668442484061863 0.7437638371830175 -2.7415246024207674e-17
+ outer loop
+ vertex 26.399279190685665 199.3932313652283 617.4
+ vertex 25.200702478615163 200.47042758626208 597.4
+ vertex 25.200702478615163 200.47042758626208 617.4
+ endloop
+endfacet
+facet normal 0.4252767351160268 0.9050633671567163 -1.178590851350565e-16
+ outer loop
+ vertex 15.705257561860751 206.48691404766168 597.4
+ vertex 17.163768745909092 205.80157985229934 617.4
+ vertex 17.163768745909092 205.80157985229934 597.4
+ endloop
+endfacet
+facet normal 0.4252767351160268 0.9050633671567163 -1.178590851350565e-16
+ outer loop
+ vertex 17.163768745909092 205.80157985229934 617.4
+ vertex 15.705257561860751 206.48691404766168 597.4
+ vertex 15.705257561860751 206.48691404766168 617.4
+ endloop
+endfacet
+facet normal 0.06271134093822832 0.9980317067697445 -2.184086467857672e-16
+ outer loop
+ vertex 1.6662183356072127 209.7754327154008 597.4
+ vertex 3.274548159994501 209.67437328084162 617.4
+ vertex 3.274548159994501 209.67437328084162 597.4
+ endloop
+endfacet
+facet normal 0.06271134093822832 0.9980317067697445 -2.184086467857672e-16
+ outer loop
+ vertex 3.274548159994501 209.67437328084162 617.4
+ vertex 1.6662183356072127 209.7754327154008 597.4
+ vertex 1.6662183356072127 209.7754327154008 617.4
+ endloop
+endfacet
+facet normal 0.3870523431386278 0.9220577442171928 -1.301322792253083e-16
+ outer loop
+ vertex 14.219359909739431 207.1106495691349 597.4
+ vertex 15.705257561860751 206.48691404766168 617.4
+ vertex 15.705257561860751 206.48691404766168 597.4
+ endloop
+endfacet
+facet normal 0.3870523431386278 0.9220577442171928 -1.301322792253083e-16
+ outer loop
+ vertex 15.705257561860751 206.48691404766168 617.4
+ vertex 14.219359909739431 207.1106495691349 597.4
+ vertex 14.219359909739431 207.1106495691349 617.4
+ endloop
+endfacet
+facet normal 0.3481506432367572 0.9374386004500948 -1.4217775314923133e-16
+ outer loop
+ vertex 12.708675981153974 207.6716949338254 597.4
+ vertex 14.219359909739431 207.1106495691349 617.4
+ vertex 14.219359909739431 207.1106495691349 597.4
+ endloop
+endfacet
+facet normal 0.3481506432367572 0.9374386004500948 -1.4217775314923133e-16
+ outer loop
+ vertex 14.219359909739431 207.1106495691349 617.4
+ vertex 12.708675981153974 207.6716949338254 597.4
+ vertex 12.708675981153974 207.6716949338254 617.4
+ endloop
+endfacet
+facet normal 0.4994273401369627 0.8663557767590164 -9.271580545042574e-17
+ outer loop
+ vertex 18.592341194212068 205.0558462582614 597.4
+ vertex 19.988475029279908 204.25101823445388 617.4
+ vertex 19.988475029279908 204.25101823445388 597.4
+ endloop
+endfacet
+facet normal 0.4994273401369627 0.8663557767590164 -9.271580545042574e-17
+ outer loop
+ vertex 19.988475029279908 204.25101823445388 617.4
+ vertex 18.592341194212068 205.0558462582614 597.4
+ vertex 18.592341194212068 205.0558462582614 617.4
+ endloop
+endfacet
+facet normal 0.8083169430505359 0.588747585623446 3.9080478380129054e-17
+ outer loop
+ vertex 30.712842328706454 194.61271322520335 617.4
+ vertex 31.66161008284822 193.31010907119958 597.4
+ vertex 30.712842328706454 194.61271322520335 597.4
+ endloop
+endfacet
+facet normal 0.8083169430505359 0.588747585623446 3.9080478380129054e-17
+ outer loop
+ vertex 31.66161008284822 193.31010907119958 597.4
+ vertex 30.712842328706454 194.61271322520335 617.4
+ vertex 31.66161008284822 193.31010907119958 617.4
+ endloop
+endfacet
+facet normal 0.7562861433211006 0.6542409872673034 1.2524604359616172e-17
+ outer loop
+ vertex 28.65611565455649 197.09325395373207 617.4
+ vertex 29.71042613890401 195.8744975236272 597.4
+ vertex 28.65611565455649 197.09325395373207 597.4
+ endloop
+endfacet
+facet normal 0.7562861433211006 0.6542409872673034 1.2524604359616172e-17
+ outer loop
+ vertex 29.71042613890401 195.8744975236272 597.4
+ vertex 28.65611565455649 197.09325395373207 617.4
+ vertex 29.71042613890401 195.8744975236272 617.4
+ endloop
+endfacet
+facet normal 0.020915980694884383 0.9997812369471489 -2.279145463383574e-16
+ outer loop
+ vertex 0.05506914030825163 209.80913885452415 597.4
+ vertex 1.6662183356072127 209.7754327154008 617.4
+ vertex 1.6662183356072127 209.7754327154008 597.4
+ endloop
+endfacet
+facet normal 0.020915980694884383 0.9997812369471489 -2.279145463383574e-16
+ outer loop
+ vertex 1.6662183356072127 209.7754327154008 617.4
+ vertex 0.05506914030825163 209.80913885452415 597.4
+ vertex 0.05506914030825163 209.80913885452415 617.4
+ endloop
+endfacet
+facet normal 0.6684424840618629 -0.7437638371830175 3.184631229828643e-16
+ outer loop
+ vertex -24.237582499258796 197.20437136809898 617.4
+ vertex -23.132345087548707 198.1976808085791 597.4
+ vertex -23.132345087548707 198.1976808085791 617.4
+ endloop
+endfacet
+facet normal 0.6684424840618629 -0.7437638371830175 3.184631229828643e-16
+ outer loop
+ vertex -23.132345087548707 198.1976808085791 597.4
+ vertex -24.237582499258796 197.20437136809898 617.4
+ vertex -24.237582499258796 197.20437136809898 597.4
+ endloop
+endfacet
+facet normal -0.4910858544031766 0.8711111775227673 -3.094621903444357e-16
+ outer loop
+ vertex 13.997857139629506 184.71905477668759 597.4
+ vertex 28.325364688606378 192.79613663226206 617.4
+ vertex 28.325364688606378 192.79613663226206 597.4
+ endloop
+endfacet
+facet normal -0.4910858544031766 0.8711111775227673 -3.094621903444357e-16
+ outer loop
+ vertex 28.325364688606378 192.79613663226206 617.4
+ vertex 13.997857139629506 184.71905477668759 597.4
+ vertex 13.997857139629506 184.71905477668759 617.4
+ endloop
+endfacet
+facet normal -0.34815064323678235 -0.9374386004500854 1.4217775314922369e-16
+ outer loop
+ vertex 12.805069140308262 204.4363864562905 617.3999999999999
+ vertex 13.116314124512934 204.32079473497345 597.4
+ vertex 13.116314124512934 204.32079473497345 617.4
+ endloop
+endfacet
+facet normal -0.34815064323678235 -0.9374386004500854 1.4217775314922369e-16
+ outer loop
+ vertex 13.116314124512934 204.32079473497345 597.4
+ vertex 12.805069140308262 204.4363864562905 617.3999999999999
+ vertex 12.805069140308262 204.4363864562905 597.4
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 -2.3251894735637823e-16
+ outer loop
+ vertex 8.305069140308264 197.2261236268101 597.4
+ vertex 10.30506914030826 197.2261236268101 617.4
+ vertex 10.30506914030826 197.2261236268101 597.4
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 -2.3251894735637823e-16
+ outer loop
+ vertex 10.30506914030826 197.2261236268101 617.4
+ vertex 8.305069140308264 197.2261236268101 597.4
+ vertex 8.305069140308264 197.2261236268101 617.4
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 2.3251894735637823e-16
+ outer loop
+ vertex 8.305069140308264 191.96896450555064 617.4
+ vertex 10.30506914030826 191.96896450555064 597.4
+ vertex 10.30506914030826 191.96896450555064 617.4
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 2.3251894735637823e-16
+ outer loop
+ vertex 10.30506914030826 191.96896450555064 597.4
+ vertex 8.305069140308264 191.96896450555064 617.4
+ vertex 8.305069140308264 191.96896450555064 597.4
+ endloop
+endfacet
+facet normal -0.6684424840618564 -0.7437638371830234 2.7415246024210497e-17
+ outer loop
+ vertex 23.24248336816515 198.1976808085791 617.4
+ vertex 24.347720779875264 197.20437136809898 597.4
+ vertex 24.347720779875264 197.20437136809898 617.4
+ endloop
+endfacet
+facet normal -0.6684424840618564 -0.7437638371830234 2.7415246024210497e-17
+ outer loop
+ vertex 24.347720779875264 197.20437136809898 597.4
+ vertex 23.24248336816515 198.1976808085791 617.4
+ vertex 23.24248336816515 198.1976808085791 597.4
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 2.1770599857004374e-16
+ outer loop
+ vertex -10.194930859691718 204.8761236268101 617.4
+ vertex -10.194930859691729 197.22612362681014 597.4
+ vertex -10.194930859691718 204.8761236268101 597.4
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 2.1770599857004374e-16
+ outer loop
+ vertex -10.194930859691729 197.22612362681014 597.4
+ vertex -10.194930859691718 204.8761236268101 617.4
+ vertex -10.194930859691729 197.22612362681014 617.4
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 -2.3251894735637823e-16
+ outer loop
+ vertex -10.194930859691729 184.3761236268101 597.4
+ vertex 10.305069140308255 184.3761236268101 617.4
+ vertex 10.305069140308255 184.3761236268101 597.4
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 -2.3251894735637823e-16
+ outer loop
+ vertex 10.305069140308255 184.3761236268101 617.4
+ vertex -10.194930859691729 184.3761236268101 597.4
+ vertex -10.194930859691729 184.3761236268101 617.4
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376093e-16 2.1770599857004377e-16
+ outer loop
+ vertex 12.805069140308262 204.4363864562905 617.3999999999999
+ vertex 12.80506914030825 186.78502419417043 597.4
+ vertex 12.805069140308262 204.4363864562905 597.4
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376093e-16 2.1770599857004377e-16
+ outer loop
+ vertex 12.80506914030825 186.78502419417043 597.4
+ vertex 12.805069140308262 204.4363864562905 617.3999999999999
+ vertex 12.80506914030825 186.78502419417043 617.4
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 2.1770599857004374e-16
+ outer loop
+ vertex -10.194930859691729 191.96896450555067 617.4
+ vertex -10.194930859691729 184.3761236268101 597.4
+ vertex -10.194930859691729 191.96896450555067 597.4
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 2.1770599857004374e-16
+ outer loop
+ vertex -10.194930859691729 184.3761236268101 597.4
+ vertex -10.194930859691729 191.96896450555067 617.4
+ vertex -10.194930859691729 184.3761236268101 617.4
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 2.3251894735637823e-16
+ outer loop
+ vertex -10.194930859691718 204.8761236268101 617.4
+ vertex 10.305069140308266 204.8761236268101 597.4
+ vertex 10.305069140308266 204.8761236268101 617.4
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 2.3251894735637823e-16
+ outer loop
+ vertex 10.305069140308266 204.8761236268101 597.4
+ vertex -10.194930859691718 204.8761236268101 617.4
+ vertex -10.194930859691718 204.8761236268101 597.4
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 -2.1770599857004374e-16
+ outer loop
+ vertex 10.30506914030826 197.2261236268101 617.4
+ vertex 10.305069140308266 204.8761236268101 597.4
+ vertex 10.30506914030826 197.2261236268101 597.4
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 -2.1770599857004374e-16
+ outer loop
+ vertex 10.305069140308266 204.8761236268101 597.4
+ vertex 10.30506914030826 197.2261236268101 617.4
+ vertex 10.305069140308266 204.8761236268101 617.4
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 -2.1770599857004374e-16
+ outer loop
+ vertex 10.305069140308255 184.3761236268101 617.4
+ vertex 10.30506914030826 191.96896450555064 597.4
+ vertex 10.305069140308255 184.3761236268101 597.4
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 -2.1770599857004374e-16
+ outer loop
+ vertex 10.30506914030826 191.96896450555064 597.4
+ vertex 10.305069140308255 184.3761236268101 617.4
+ vertex 10.30506914030826 191.96896450555064 617.4
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 2.3251894735637823e-16
+ outer loop
+ vertex -10.194930859691729 191.96896450555067 617.4
+ vertex -8.194930859691734 191.96896450555067 597.4
+ vertex -8.194930859691734 191.96896450555067 617.4
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 2.3251894735637823e-16
+ outer loop
+ vertex -8.194930859691734 191.96896450555067 597.4
+ vertex -10.194930859691729 191.96896450555067 617.4
+ vertex -10.194930859691729 191.96896450555067 597.4
+ endloop
+endfacet
+facet normal 0.8660254037844397 0.49999999999999806 7.227945163972793e-17
+ outer loop
+ vertex 12.80506914030825 186.78502419417043 617.4
+ vertex 13.997857139629506 184.71905477668759 597.4
+ vertex 12.80506914030825 186.78502419417043 597.4
+ endloop
+endfacet
+facet normal 0.8660254037844397 0.49999999999999806 7.227945163972793e-17
+ outer loop
+ vertex 13.997857139629506 184.71905477668759 597.4
+ vertex 12.80506914030825 186.78502419417043 617.4
+ vertex 13.997857139629506 184.71905477668759 617.4
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 -2.3251894735637823e-16
+ outer loop
+ vertex -10.194930859691729 197.22612362681014 597.4
+ vertex -8.194930859691734 197.22612362681014 617.4
+ vertex -8.194930859691734 197.22612362681014 597.4
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 -2.3251894735637823e-16
+ outer loop
+ vertex -8.194930859691734 197.22612362681014 617.4
+ vertex -10.194930859691729 197.22612362681014 597.4
+ vertex -10.194930859691729 197.22612362681014 617.4
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 -2.177059985700438e-16
+ outer loop
+ vertex 8.305069140308264 191.96896450555064 617.4
+ vertex 8.305069140308264 197.2261236268101 597.4
+ vertex 8.305069140308264 191.96896450555064 597.4
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 -2.177059985700438e-16
+ outer loop
+ vertex 8.305069140308264 197.2261236268101 597.4
+ vertex 8.305069140308264 191.96896450555064 617.4
+ vertex 8.305069140308264 197.2261236268101 617.4
+ endloop
+endfacet
+facet normal -0.38705234313864506 -0.9220577442171854 1.3013227922530284e-16
+ outer loop
+ vertex 13.116314124512934 204.32079473497345 617.4
+ vertex 14.486497324768576 203.74563268952215 597.4
+ vertex 14.486497324768576 203.74563268952215 617.4
+ endloop
+endfacet
+facet normal -0.38705234313864506 -0.9220577442171854 1.3013227922530284e-16
+ outer loop
+ vertex 14.486497324768576 203.74563268952215 597.4
+ vertex 13.116314124512934 204.32079473497345 617.4
+ vertex 13.116314124512934 204.32079473497345 597.4
+ endloop
+endfacet
+facet normal -0.5352237960733263 -0.8447102983371629 7.988971840785656e-17
+ outer loop
+ vertex 18.436158735513036 201.68385752189502 617.4
+ vertex 19.691403178850077 200.8885118308512 597.4
+ vertex 19.691403178850077 200.8885118308512 617.4
+ endloop
+endfacet
+facet normal -0.5352237960733263 -0.8447102983371629 7.988971840785656e-17
+ outer loop
+ vertex 19.691403178850077 200.8885118308512 597.4
+ vertex 18.436158735513036 201.68385752189502 617.4
+ vertex 18.436158735513036 201.68385752189502 597.4
+ endloop
+endfacet
+facet normal -0.7562861433211046 -0.6542409872672988 -1.2524604359618138e-17
+ outer loop
+ vertex 27.40101177575885 193.95965933221288 617.4
+ vertex 26.428805842568213 195.08350496407672 597.4
+ vertex 27.40101177575885 193.95965933221288 597.4
+ endloop
+endfacet
+facet normal -0.7562861433211046 -0.6542409872672988 -1.2524604359618138e-17
+ outer loop
+ vertex 26.428805842568213 195.08350496407672 597.4
+ vertex 27.40101177575885 193.95965933221288 617.4
+ vertex 26.428805842568213 195.08350496407672 617.4
+ endloop
+endfacet
+facet normal 0.6989639196910173 -0.7151569331064122 3.184561753812835e-16
+ outer loop
+ vertex -25.300309884213064 196.16570689577946 617.4
+ vertex -24.237582499258796 197.20437136809898 597.4
+ vertex -24.237582499258796 197.20437136809898 617.4
+ endloop
+endfacet
+facet normal 0.6989639196910173 -0.7151569331064122 3.184561753812835e-16
+ outer loop
+ vertex -24.237582499258796 197.20437136809898 597.4
+ vertex -25.300309884213064 196.16570689577946 617.4
+ vertex -25.300309884213064 196.16570689577946 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 8.305069140308264 197.2261236268101 597.4
+ vertex 10.30506914030826 191.96896450555064 597.4
+ vertex 8.305069140308264 191.96896450555064 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 10.305069140308255 184.3761236268101 597.4
+ vertex 12.80506914030825 186.78502419417043 597.4
+ vertex 13.997857139629506 184.71905477668759 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 12.80506914030825 186.78502419417043 597.4
+ vertex 10.305069140308255 184.3761236268101 597.4
+ vertex 10.30506914030826 191.96896450555064 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 12.80506914030825 186.78502419417043 597.4
+ vertex 10.30506914030826 191.96896450555064 597.4
+ vertex 12.805069140308262 204.4363864562905 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 12.805069140308262 204.4363864562905 597.4
+ vertex 10.30506914030826 191.96896450555064 597.4
+ vertex 10.30506914030826 197.2261236268101 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 10.30506914030826 197.2261236268101 597.4
+ vertex 10.30506914030826 191.96896450555064 597.4
+ vertex 8.305069140308264 197.2261236268101 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 12.805069140308262 204.4363864562905 597.4
+ vertex 10.30506914030826 197.2261236268101 597.4
+ vertex 10.305069140308266 204.8761236268101 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex 41.98845606287095 132.2379153073506 597.4
+ vertex 39.679054986112455 132.2379153073506 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 41.98845606287095 132.2379153073506 597.4
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex 42.546827577587486 132.30606365477246 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 42.546827577587486 132.30606365477246 597.4
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex 42.98845606287095 132.5058644997817 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 42.98845606287095 132.5058644997817 597.4
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex 43.28324526727487 132.82370174497748 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 43.28324526727487 132.82370174497748 597.4
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex 43.41110579368132 133.23791530735056 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 43.41110579368132 133.23791530735056 597.4
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex 43.3633241585152 133.72027721714554 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 43.3633241585152 133.72027721714554 597.4
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex 43.143156601250205 134.23791530735056 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 43.143156601250205 134.23791530735056 597.4
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex 15.497857139629502 182.12097856533427 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 15.497857139629502 182.12097856533427 597.4
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex 24.768613200629805 157.93973105977096 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 24.768613200629805 157.93973105977096 597.4
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex 24.952472465515662 157.2535589417747 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 24.952472465515662 157.2535589417747 597.4
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex 25.014385957182462 156.54588449377658 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 25.014385957182462 156.54588449377658 597.4
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex 24.952472465515662 155.83821004577842 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 24.952472465515662 155.83821004577842 597.4
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex 24.768613200629805 155.15203792778217 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 24.768613200629805 155.15203792778217 597.4
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex 24.468394633251194 154.50821713237326 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 24.468394633251194 154.50821713237326 597.4
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex 24.060938752631678 153.92630982863116 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 24.060938752631678 153.92630982863116 597.4
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex 23.55862589952126 153.42399697552074 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 23.55862589952126 153.42399697552074 597.4
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex 23.06122021535224 153.05393896729834 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 23.06122021535224 153.05393896729834 597.4
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex 22.373300682659444 152.73315682100932 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 22.373300682659444 152.73315682100932 597.4
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex 22.332897800370226 152.7163225275226 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 22.332897800370226 152.7163225275226 597.4
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex 21.640128958283878 152.53670404954954 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 21.640128958283878 152.53670404954954 597.4
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex 20.939051234375828 152.47054977096997 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 20.939051234375828 152.47054977096997 597.4
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex -20.828912953759342 152.47054977096997 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 23.06122021535224 153.05393896729834 597.4
+ vertex 22.373300682659444 152.73315682100932 597.4
+ vertex 22.976718595779143 153.0165410949012 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 15.497857139629502 182.12097856533427 597.4
+ vertex 24.768613200629805 157.93973105977096 597.4
+ vertex 24.468394633251194 158.5835518551799 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 15.497857139629502 182.12097856533427 597.4
+ vertex 24.468394633251194 158.5835518551799 597.4
+ vertex 11.770977400728352 180.5761236268101 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 15.497857139629502 182.12097856533427 597.4
+ vertex 11.770977400728352 180.5761236268101 597.4
+ vertex -15.387718859012988 182.1209785653343 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 15.497857139629502 182.12097856533427 597.4
+ vertex -15.387718859012988 182.1209785653343 597.4
+ vertex -10.194930859691729 184.3761236268101 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -10.194930859691729 184.3761236268101 597.4
+ vertex -15.387718859012988 182.1209785653343 597.4
+ vertex -13.88771885901298 184.7190547766876 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -13.88771885901298 184.7190547766876 597.4
+ vertex -15.387718859012988 182.1209785653343 597.4
+ vertex -29.842081742052876 190.46620886682194 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -13.88771885901298 184.7190547766876 597.4
+ vertex -29.842081742052876 190.46620886682194 597.4
+ vertex -28.21522640798993 192.79613663226206 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -28.21522640798993 192.79613663226206 597.4
+ vertex -29.842081742052876 190.46620886682194 597.4
+ vertex -32.444930859691745 191.96896450555073 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -28.21522640798993 192.79613663226206 597.4
+ vertex -32.444930859691745 191.96896450555073 597.4
+ vertex -31.55147180223168 193.31010907119963 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -28.21522640798993 192.79613663226206 597.4
+ vertex -31.55147180223168 193.31010907119963 597.4
+ vertex -27.290873495142403 193.95965933221288 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -27.290873495142403 193.95965933221288 597.4
+ vertex -31.55147180223168 193.31010907119963 597.4
+ vertex -30.60270404808994 194.6127132252034 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -27.290873495142403 193.95965933221288 597.4
+ vertex -30.60270404808994 194.6127132252034 597.4
+ vertex -26.318667561951766 195.08350496407672 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -26.318667561951766 195.08350496407672 597.4
+ vertex -30.60270404808994 194.6127132252034 597.4
+ vertex -29.600287858287494 195.87449752362727 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -26.318667561951766 195.08350496407672 597.4
+ vertex -29.600287858287494 195.87449752362727 597.4
+ vertex -25.300309884213064 196.16570689577946 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -25.300309884213064 196.16570689577946 597.4
+ vertex -29.600287858287494 195.87449752362727 597.4
+ vertex -28.545977373939976 197.09325395373216 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -25.300309884213064 196.16570689577946 597.4
+ vertex -28.545977373939976 197.09325395373216 597.4
+ vertex -24.237582499258796 197.20437136809898 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -24.237582499258796 197.20437136809898 597.4
+ vertex -28.545977373939976 197.09325395373216 597.4
+ vertex -27.44161754666337 198.26684979780484 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -24.237582499258796 197.20437136809898 597.4
+ vertex -27.44161754666337 198.26684979780484 597.4
+ vertex -23.132345087548707 198.1976808085791 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -23.132345087548707 198.1976808085791 597.4
+ vertex -27.44161754666337 198.26684979780484 597.4
+ vertex -21.986531718390673 199.1438970121231 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -21.986531718390673 199.1438970121231 597.4
+ vertex -27.44161754666337 198.26684979780484 597.4
+ vertex -26.28914091006915 199.3932313652284 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -21.986531718390673 199.1438970121231 597.4
+ vertex -26.28914091006915 199.3932313652284 597.4
+ vertex -20.80214746548775 200.04136418270153 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -20.80214746548775 200.04136418270153 597.4
+ vertex -26.28914091006915 199.3932313652284 597.4
+ vertex -25.09056419799865 200.4704275862621 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -20.80214746548775 200.04136418270153 597.4
+ vertex -25.09056419799865 200.4704275862621 597.4
+ vertex -19.58126489823363 200.88851183085123 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -19.58126489823363 200.88851183085123 597.4
+ vertex -25.09056419799865 200.4704275862621 597.4
+ vertex -23.847984815414293 201.49655346124206 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -19.58126489823363 200.88851183085123 597.4
+ vertex -23.847984815414293 201.49655346124206 597.4
+ vertex -18.326020454896568 201.68385752189502 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -18.326020454896568 201.68385752189502 597.4
+ vertex -23.847984815414293 201.49655346124206 597.4
+ vertex -22.563577168123395 202.4698133591664 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -18.326020454896568 201.68385752189502 597.4
+ vertex -22.563577168123395 202.4698133591664 597.4
+ vertex -17.038610704038266 202.42600947007372 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -17.038610704038266 202.42600947007372 597.4
+ vertex -22.563577168123395 202.4698133591664 597.4
+ vertex -15.721288500709916 203.11366897404986 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -15.721288500709916 203.11366897404986 597.4
+ vertex -22.563577168123395 202.4698133591664 597.4
+ vertex -21.23958885775712 203.3885041598935 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -15.721288500709916 203.11366897404986 597.4
+ vertex -21.23958885775712 203.3885041598935 597.4
+ vertex -14.376359044152096 203.7456326895222 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -14.376359044152096 203.7456326895222 597.4
+ vertex -21.23958885775712 203.3885041598935 597.4
+ vertex -19.87833674866336 204.25101823445394 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -14.376359044152096 203.7456326895222 597.4
+ vertex -19.87833674866336 204.25101823445394 597.4
+ vertex -13.00617584389643 204.32079473497348 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -13.00617584389643 204.32079473497348 597.4
+ vertex -19.87833674866336 204.25101823445394 597.4
+ vertex -18.48220291359554 205.05584625826145 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -13.00617584389643 204.32079473497348 597.4
+ vertex -18.48220291359554 205.05584625826145 597.4
+ vertex -12.694930859691715 204.43638645629056 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -12.694930859691715 204.43638645629056 597.4
+ vertex -18.48220291359554 205.05584625826145 597.4
+ vertex -10.194930859691718 204.8761236268101 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -10.194930859691718 204.8761236268101 597.4
+ vertex -18.48220291359554 205.05584625826145 597.4
+ vertex 10.305069140308266 204.8761236268101 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 10.305069140308266 204.8761236268101 597.4
+ vertex -18.48220291359554 205.05584625826145 597.4
+ vertex 18.592341194212068 205.0558462582614 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 18.592341194212068 205.0558462582614 597.4
+ vertex -18.48220291359554 205.05584625826145 597.4
+ vertex 17.163768745909092 205.80157985229934 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 17.163768745909092 205.80157985229934 597.4
+ vertex -18.48220291359554 205.05584625826145 597.4
+ vertex -17.053630465292567 205.80157985229934 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 17.163768745909092 205.80157985229934 597.4
+ vertex -17.053630465292567 205.80157985229934 597.4
+ vertex 15.705257561860751 206.48691404766168 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 15.705257561860751 206.48691404766168 597.4
+ vertex -17.053630465292567 205.80157985229934 597.4
+ vertex -15.595119281244203 206.4869140476617 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 15.705257561860751 206.48691404766168 597.4
+ vertex -15.595119281244203 206.4869140476617 597.4
+ vertex -14.10922162912293 207.11064956913492 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 15.705257561860751 206.48691404766168 597.4
+ vertex -14.10922162912293 207.11064956913492 597.4
+ vertex 14.219359909739431 207.1106495691349 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 14.219359909739431 207.1106495691349 597.4
+ vertex -14.10922162912293 207.11064956913492 597.4
+ vertex 12.708675981153974 207.6716949338254 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 12.708675981153974 207.6716949338254 597.4
+ vertex -14.10922162912293 207.11064956913492 597.4
+ vertex -12.598537700537447 207.67169493382545 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 12.708675981153974 207.6716949338254 597.4
+ vertex -12.598537700537447 207.67169493382545 597.4
+ vertex 11.17584934154037 208.1690683611594 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 11.17584934154037 208.1690683611594 597.4
+ vertex -12.598537700537447 207.67169493382545 597.4
+ vertex -11.065711060923867 208.16906836115942 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 11.17584934154037 208.1690683611594 597.4
+ vertex -11.065711060923867 208.16906836115942 597.4
+ vertex -9.513424023535883 208.60189949091367 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 11.17584934154037 208.1690683611594 597.4
+ vertex -9.513424023535883 208.60189949091367 597.4
+ vertex 9.623562304152413 208.60189949091367 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 9.623562304152413 208.60189949091367 597.4
+ vertex -9.513424023535883 208.60189949091367 597.4
+ vertex -7.944392955630252 208.96943090627016 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 9.623562304152413 208.60189949091367 597.4
+ vertex -7.944392955630252 208.96943090627016 597.4
+ vertex 8.05453123624676 208.96943090627016 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 8.05453123624676 208.96943090627016 597.4
+ vertex -7.944392955630252 208.96943090627016 597.4
+ vertex -6.361363525060216 209.27101945922956 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 8.05453123624676 208.96943090627016 597.4
+ vertex -6.361363525060216 209.27101945922956 597.4
+ vertex 6.471501805676724 209.27101945922956 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 6.471501805676724 209.27101945922956 597.4
+ vertex -6.361363525060216 209.27101945922956 597.4
+ vertex -4.767105895595756 209.5061373960643 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 6.471501805676724 209.27101945922956 597.4
+ vertex -4.767105895595756 209.5061373960643 597.4
+ vertex 4.877244176212259 209.5061373960643 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 4.877244176212259 209.5061373960643 597.4
+ vertex -4.767105895595756 209.5061373960643 597.4
+ vertex -3.1644098793779976 209.67437328084162 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 4.877244176212259 209.5061373960643 597.4
+ vertex -3.1644098793779976 209.67437328084162 597.4
+ vertex 3.274548159994501 209.67437328084162 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 3.274548159994501 209.67437328084162 597.4
+ vertex -3.1644098793779976 209.67437328084162 597.4
+ vertex -1.5560800549907094 209.7754327154008 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 3.274548159994501 209.67437328084162 597.4
+ vertex -1.5560800549907094 209.7754327154008 597.4
+ vertex 1.6662183356072127 209.7754327154008 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 1.6662183356072127 209.7754327154008 597.4
+ vertex -1.5560800549907094 209.7754327154008 597.4
+ vertex 0.05506914030825163 209.80913885452415 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 15.497857139629502 182.12097856533427 597.4
+ vertex 13.997857139629506 184.71905477668759 597.4
+ vertex 29.952220022669408 190.4662088668219 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 13.997857139629506 184.71905477668759 597.4
+ vertex 15.497857139629502 182.12097856533427 597.4
+ vertex 10.305069140308255 184.3761236268101 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 10.305069140308255 184.3761236268101 597.4
+ vertex 15.497857139629502 182.12097856533427 597.4
+ vertex -10.194930859691729 184.3761236268101 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 29.952220022669408 190.4662088668219 597.4
+ vertex 13.997857139629506 184.71905477668759 597.4
+ vertex 28.325364688606378 192.79613663226206 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 29.952220022669408 190.4662088668219 597.4
+ vertex 28.325364688606378 192.79613663226206 597.4
+ vertex 32.55506914030826 191.96896450555064 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 32.55506914030826 191.96896450555064 597.4
+ vertex 28.325364688606378 192.79613663226206 597.4
+ vertex 31.66161008284822 193.31010907119958 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 31.66161008284822 193.31010907119958 597.4
+ vertex 28.325364688606378 192.79613663226206 597.4
+ vertex 27.40101177575885 193.95965933221288 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 31.66161008284822 193.31010907119958 597.4
+ vertex 27.40101177575885 193.95965933221288 597.4
+ vertex 30.712842328706454 194.61271322520335 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 30.712842328706454 194.61271322520335 597.4
+ vertex 27.40101177575885 193.95965933221288 597.4
+ vertex 26.428805842568213 195.08350496407672 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 30.712842328706454 194.61271322520335 597.4
+ vertex 26.428805842568213 195.08350496407672 597.4
+ vertex 29.71042613890401 195.8744975236272 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 29.71042613890401 195.8744975236272 597.4
+ vertex 26.428805842568213 195.08350496407672 597.4
+ vertex 25.410448164829532 196.16570689577944 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 29.71042613890401 195.8744975236272 597.4
+ vertex 25.410448164829532 196.16570689577944 597.4
+ vertex 28.65611565455649 197.09325395373207 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 28.65611565455649 197.09325395373207 597.4
+ vertex 25.410448164829532 196.16570689577944 597.4
+ vertex 24.347720779875264 197.20437136809898 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 28.65611565455649 197.09325395373207 597.4
+ vertex 24.347720779875264 197.20437136809898 597.4
+ vertex 27.551755827279884 198.26684979780475 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 27.551755827279884 198.26684979780475 597.4
+ vertex 24.347720779875264 197.20437136809898 597.4
+ vertex 23.24248336816515 198.1976808085791 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 27.551755827279884 198.26684979780475 597.4
+ vertex 23.24248336816515 198.1976808085791 597.4
+ vertex 22.09666999900712 199.14389701212306 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 27.551755827279884 198.26684979780475 597.4
+ vertex 22.09666999900712 199.14389701212306 597.4
+ vertex 26.399279190685665 199.3932313652283 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 26.399279190685665 199.3932313652283 597.4
+ vertex 22.09666999900712 199.14389701212306 597.4
+ vertex 20.912285746104196 200.04136418270153 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 26.399279190685665 199.3932313652283 597.4
+ vertex 20.912285746104196 200.04136418270153 597.4
+ vertex 25.200702478615163 200.47042758626208 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 25.200702478615163 200.47042758626208 597.4
+ vertex 20.912285746104196 200.04136418270153 597.4
+ vertex 19.691403178850077 200.8885118308512 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 25.200702478615163 200.47042758626208 597.4
+ vertex 19.691403178850077 200.8885118308512 597.4
+ vertex 23.958123096030832 201.49655346124203 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 23.958123096030832 201.49655346124203 597.4
+ vertex 19.691403178850077 200.8885118308512 597.4
+ vertex 18.436158735513036 201.68385752189502 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 23.958123096030832 201.49655346124203 597.4
+ vertex 18.436158735513036 201.68385752189502 597.4
+ vertex 22.67371544873991 202.46981335916635 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 22.67371544873991 202.46981335916635 597.4
+ vertex 18.436158735513036 201.68385752189502 597.4
+ vertex 17.148748984654713 202.4260094700737 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 22.67371544873991 202.46981335916635 597.4
+ vertex 17.148748984654713 202.4260094700737 597.4
+ vertex 15.831426781326385 203.11366897404986 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 22.67371544873991 202.46981335916635 597.4
+ vertex 15.831426781326385 203.11366897404986 597.4
+ vertex 21.349727138373666 203.38850415989344 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 21.349727138373666 203.38850415989344 597.4
+ vertex 15.831426781326385 203.11366897404986 597.4
+ vertex 14.486497324768576 203.74563268952215 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 21.349727138373666 203.38850415989344 597.4
+ vertex 14.486497324768576 203.74563268952215 597.4
+ vertex 19.988475029279908 204.25101823445388 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 19.988475029279908 204.25101823445388 597.4
+ vertex 14.486497324768576 203.74563268952215 597.4
+ vertex 13.116314124512934 204.32079473497345 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 19.988475029279908 204.25101823445388 597.4
+ vertex 13.116314124512934 204.32079473497345 597.4
+ vertex 18.592341194212068 205.0558462582614 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 18.592341194212068 205.0558462582614 597.4
+ vertex 13.116314124512934 204.32079473497345 597.4
+ vertex 12.805069140308262 204.4363864562905 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 18.592341194212068 205.0558462582614 597.4
+ vertex 12.805069140308262 204.4363864562905 597.4
+ vertex 10.305069140308266 204.8761236268101 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -10.194930859691729 184.3761236268101 597.4
+ vertex -12.694930859691725 186.78502419417046 597.4
+ vertex -10.194930859691729 191.96896450555067 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -12.694930859691725 186.78502419417046 597.4
+ vertex -10.194930859691729 184.3761236268101 597.4
+ vertex -13.88771885901298 184.7190547766876 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -10.194930859691729 191.96896450555067 597.4
+ vertex -12.694930859691725 186.78502419417046 597.4
+ vertex -12.694930859691715 204.43638645629056 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -10.194930859691729 191.96896450555067 597.4
+ vertex -12.694930859691715 204.43638645629056 597.4
+ vertex -10.194930859691729 197.22612362681014 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -10.194930859691729 191.96896450555067 597.4
+ vertex -10.194930859691729 197.22612362681014 597.4
+ vertex -8.194930859691734 191.96896450555067 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -10.194930859691729 197.22612362681014 597.4
+ vertex -12.694930859691715 204.43638645629056 597.4
+ vertex -10.194930859691718 204.8761236268101 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -8.194930859691734 197.22612362681014 597.4
+ vertex -8.194930859691734 191.96896450555067 597.4
+ vertex -10.194930859691729 197.22612362681014 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex 20.88398209406786 152.47054977096997 597.4
+ vertex 20.939051234375828 152.47054977096997 597.4
+ vertex -20.828912953759342 152.47054977096997 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -41.8783177822545 132.23791530735065 597.4
+ vertex -30.37020590902545 148.17054977096998 597.4
+ vertex -39.568916705496 132.23791530735065 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096998 597.4
+ vertex -41.8783177822545 132.23791530735065 597.4
+ vertex -42.436689296971025 132.30606365477252 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096998 597.4
+ vertex -42.436689296971025 132.30606365477252 597.4
+ vertex -42.87831778225449 132.50586449978178 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096998 597.4
+ vertex -42.87831778225449 132.50586449978178 597.4
+ vertex -43.173106986658425 132.82370174497754 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096998 597.4
+ vertex -43.173106986658425 132.82370174497754 597.4
+ vertex -43.30096751306486 133.23791530735065 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096998 597.4
+ vertex -43.30096751306486 133.23791530735065 597.4
+ vertex -43.253185877898744 133.7202772171456 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096998 597.4
+ vertex -43.253185877898744 133.7202772171456 597.4
+ vertex -43.03301832063373 134.23791530735065 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096998 597.4
+ vertex -43.03301832063373 134.23791530735065 597.4
+ vertex -15.387718859012988 182.1209785653343 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096998 597.4
+ vertex -15.387718859012988 182.1209785653343 597.4
+ vertex -24.658474920013315 157.939731059771 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096998 597.4
+ vertex -24.658474920013315 157.939731059771 597.4
+ vertex -24.84233418489917 157.25355894177474 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096998 597.4
+ vertex -24.84233418489917 157.25355894177474 597.4
+ vertex -24.90424767656597 156.5458844937766 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096998 597.4
+ vertex -24.90424767656597 156.5458844937766 597.4
+ vertex -24.84233418489917 155.83821004577848 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096998 597.4
+ vertex -24.84233418489917 155.83821004577848 597.4
+ vertex -24.658474920013315 155.1520379277822 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096998 597.4
+ vertex -24.658474920013315 155.1520379277822 597.4
+ vertex -24.358256352634704 154.5082171323733 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096998 597.4
+ vertex -24.358256352634704 154.5082171323733 597.4
+ vertex -23.95080047201519 153.92630982863116 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096998 597.4
+ vertex -23.95080047201519 153.92630982863116 597.4
+ vertex -23.448487618904775 153.42399697552077 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096998 597.4
+ vertex -23.448487618904775 153.42399697552077 597.4
+ vertex -22.866580315162654 153.01654109490124 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096998 597.4
+ vertex -22.866580315162654 153.01654109490124 597.4
+ vertex -22.22275951975374 152.71632252752264 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096998 597.4
+ vertex -22.22275951975374 152.71632252752264 597.4
+ vertex -21.53658740175749 152.53246326263678 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096998 597.4
+ vertex -21.53658740175749 152.53246326263678 597.4
+ vertex -20.828912953759342 152.47054977096997 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096998 597.4
+ vertex -20.828912953759342 152.47054977096997 597.4
+ vertex 30.48034418964194 148.17054977096993 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -24.658474920013315 157.939731059771 597.4
+ vertex -15.387718859012988 182.1209785653343 597.4
+ vertex -24.358256352634704 158.5835518551799 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -24.358256352634704 158.5835518551799 597.4
+ vertex -15.387718859012988 182.1209785653343 597.4
+ vertex -11.660839120111838 180.57612362681013 597.4
+ endloop
+endfacet
+facet normal 2.1770599857004374e-16 -2.325189473563784e-16 -1.0
+ outer loop
+ vertex -11.660839120111838 180.57612362681013 597.4
+ vertex -15.387718859012988 182.1209785653343 597.4
+ vertex 11.770977400728352 180.5761236268101 597.4
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 2.177059985700438e-16
+ outer loop
+ vertex -8.194930859691734 197.22612362681014 617.4
+ vertex -8.194930859691734 191.96896450555067 597.4
+ vertex -8.194930859691734 197.22612362681014 597.4
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 2.177059985700438e-16
+ outer loop
+ vertex -8.194930859691734 191.96896450555067 597.4
+ vertex -8.194930859691734 197.22612362681014 617.4
+ vertex -8.194930859691734 191.96896450555067 617.4
+ endloop
+endfacet
+facet normal -0.42527673511601083 -0.9050633671567236 1.178590851350617e-16
+ outer loop
+ vertex 14.486497324768576 203.74563268952215 617.4
+ vertex 15.831426781326385 203.11366897404986 597.4
+ vertex 15.831426781326385 203.11366897404986 617.4
+ endloop
+endfacet
+facet normal -0.42527673511601083 -0.9050633671567236 1.178590851350617e-16
+ outer loop
+ vertex 15.831426781326385 203.11366897404986 597.4
+ vertex 14.486497324768576 203.74563268952215 617.4
+ vertex 14.486497324768576 203.74563268952215 597.4
+ endloop
+endfacet
+facet normal 0.4994273401369732 -0.8663557767590104 3.101724610458232e-16
+ outer loop
+ vertex -18.326020454896568 201.68385752189502 617.4
+ vertex -17.038610704038266 202.42600947007372 597.4
+ vertex -17.038610704038266 202.42600947007372 617.4
+ endloop
+endfacet
+facet normal 0.4994273401369732 -0.8663557767590104 3.101724610458232e-16
+ outer loop
+ vertex -17.038610704038266 202.42600947007372 597.4
+ vertex -18.326020454896568 201.68385752189502 617.4
+ vertex -18.326020454896568 201.68385752189502 597.4
+ endloop
+endfacet
+facet normal 0.5700836569343717 -0.8215866503883409 3.1514509491170945e-16
+ outer loop
+ vertex -20.80214746548775 200.04136418270153 617.4
+ vertex -19.58126489823363 200.88851183085123 597.4
+ vertex -19.58126489823363 200.88851183085123 617.4
+ endloop
+endfacet
+facet normal 0.5700836569343717 -0.8215866503883409 3.1514509491170945e-16
+ outer loop
+ vertex -19.58126489823363 200.88851183085123 597.4
+ vertex -20.80214746548775 200.04136418270153 617.4
+ vertex -20.80214746548775 200.04136418270153 597.4
+ endloop
+endfacet
+facet normal 0.4910858544031737 0.8711111775227689 -9.563751771150348e-17
+ outer loop
+ vertex -28.21522640798993 192.79613663226206 597.4
+ vertex -13.88771885901298 184.7190547766876 617.4
+ vertex -13.88771885901298 184.7190547766876 597.4
+ endloop
+endfacet
+facet normal 0.4910858544031737 0.8711111775227689 -9.563751771150348e-17
+ outer loop
+ vertex -13.88771885901298 184.7190547766876 617.4
+ vertex -28.21522640798993 192.79613663226206 597.4
+ vertex -28.21522640798993 192.79613663226206 617.4
+ endloop
+endfacet
+facet normal -0.6039459209966644 -0.7970252972845284 5.384083332811956e-17
+ outer loop
+ vertex 20.912285746104196 200.04136418270153 617.4
+ vertex 22.09666999900712 199.14389701212306 597.4
+ vertex 22.09666999900712 199.14389701212306 617.4
+ endloop
+endfacet
+facet normal -0.6039459209966644 -0.7970252972845284 5.384083332811956e-17
+ outer loop
+ vertex 22.09666999900712 199.14389701212306 597.4
+ vertex 20.912285746104196 200.04136418270153 617.4
+ vertex 20.912285746104196 200.04136418270153 597.4
+ endloop
+endfacet
+facet normal 0.7282622292749873 -0.6852985666199997 3.1789195718047437e-16
+ outer loop
+ vertex -25.300309884213064 196.16570689577946 617.4
+ vertex -26.318667561951766 195.08350496407672 597.4
+ vertex -25.300309884213064 196.16570689577946 597.4
+ endloop
+endfacet
+facet normal 0.7282622292749873 -0.6852985666199997 3.1789195718047437e-16
+ outer loop
+ vertex -26.318667561951766 195.08350496407672 597.4
+ vertex -25.300309884213064 196.16570689577946 617.4
+ vertex -26.318667561951766 195.08350496407672 617.4
+ endloop
+endfacet
+facet normal 0.7562861433211037 -0.6542409872672998 3.1677145571319825e-16
+ outer loop
+ vertex -26.318667561951766 195.08350496407672 617.4
+ vertex -27.290873495142403 193.95965933221288 597.4
+ vertex -26.318667561951766 195.08350496407672 597.4
+ endloop
+endfacet
+facet normal 0.7562861433211037 -0.6542409872672998 3.1677145571319825e-16
+ outer loop
+ vertex -27.290873495142403 193.95965933221288 597.4
+ vertex -26.318667561951766 195.08350496407672 617.4
+ vertex -27.290873495142403 193.95965933221288 617.4
+ endloop
+endfacet
+facet normal 0.6039459209966634 -0.7970252972845291 3.1680613295388653e-16
+ outer loop
+ vertex -21.986531718390673 199.1438970121231 617.4
+ vertex -20.80214746548775 200.04136418270153 597.4
+ vertex -20.80214746548775 200.04136418270153 617.4
+ endloop
+endfacet
+facet normal 0.6039459209966634 -0.7970252972845291 3.1680613295388653e-16
+ outer loop
+ vertex -20.80214746548775 200.04136418270153 597.4
+ vertex -21.986531718390673 199.1438970121231 617.4
+ vertex -21.986531718390673 199.1438970121231 597.4
+ endloop
+endfacet
+facet normal 0.462756929808682 -0.8864852079499369 3.0686956689872615e-16
+ outer loop
+ vertex -17.038610704038266 202.42600947007372 617.4
+ vertex -15.721288500709916 203.11366897404986 597.4
+ vertex -15.721288500709916 203.11366897404986 617.4
+ endloop
+endfacet
+facet normal 0.462756929808682 -0.8864852079499369 3.0686956689872615e-16
+ outer loop
+ vertex -15.721288500709916 203.11366897404986 597.4
+ vertex -17.038610704038266 202.42600947007372 617.4
+ vertex -17.038610704038266 202.42600947007372 597.4
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 -2.1770599857004377e-16
+ outer loop
+ vertex -12.694930859691725 186.78502419417046 617.4
+ vertex -12.694930859691715 204.43638645629056 597.4
+ vertex -12.694930859691725 186.78502419417046 597.4
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 -2.1770599857004377e-16
+ outer loop
+ vertex -12.694930859691715 204.43638645629056 597.4
+ vertex -12.694930859691725 186.78502419417046 617.4
+ vertex -12.694930859691715 204.43638645629056 617.4
+ endloop
+endfacet
+facet normal 0.6367513322442926 -0.7710692192566881 3.179127878275189e-16
+ outer loop
+ vertex -23.132345087548707 198.1976808085791 617.4
+ vertex -21.986531718390673 199.1438970121231 597.4
+ vertex -21.986531718390673 199.1438970121231 617.4
+ endloop
+endfacet
+facet normal 0.6367513322442926 -0.7710692192566881 3.179127878275189e-16
+ outer loop
+ vertex -21.986531718390673 199.1438970121231 597.4
+ vertex -23.132345087548707 198.1976808085791 617.4
+ vertex -23.132345087548707 198.1976808085791 597.4
+ endloop
+endfacet
+facet normal 0.3481506432367668 -0.9374386004500911 2.93766720026555e-16
+ outer loop
+ vertex -13.00617584389643 204.32079473497348 617.4
+ vertex -12.694930859691715 204.43638645629056 597.4
+ vertex -12.694930859691715 204.43638645629056 617.4
+ endloop
+endfacet
+facet normal 0.3481506432367668 -0.9374386004500911 2.93766720026555e-16
+ outer loop
+ vertex -12.694930859691715 204.43638645629056 597.4
+ vertex -13.00617584389643 204.32079473497348 617.4
+ vertex -13.00617584389643 204.32079473497348 597.4
+ endloop
+endfacet
+facet normal -0.5700836569343625 -0.8215866503883473 6.692383130899384e-17
+ outer loop
+ vertex 19.691403178850077 200.8885118308512 617.4
+ vertex 20.912285746104196 200.04136418270153 597.4
+ vertex 20.912285746104196 200.04136418270153 617.4
+ endloop
+endfacet
+facet normal -0.5700836569343625 -0.8215866503883473 6.692383130899384e-17
+ outer loop
+ vertex 20.912285746104196 200.04136418270153 597.4
+ vertex 19.691403178850077 200.8885118308512 617.4
+ vertex 19.691403178850077 200.8885118308512 597.4
+ endloop
+endfacet
+facet normal -0.8660254037844392 0.4999999999999993 -3.0479839899610546e-16
+ outer loop
+ vertex -13.88771885901298 184.7190547766876 617.4
+ vertex -12.694930859691725 186.78502419417046 597.4
+ vertex -13.88771885901298 184.7190547766876 597.4
+ endloop
+endfacet
+facet normal -0.8660254037844392 0.4999999999999993 -3.0479839899610546e-16
+ outer loop
+ vertex -12.694930859691725 186.78502419417046 597.4
+ vertex -13.88771885901298 184.7190547766876 617.4
+ vertex -12.694930859691725 186.78502419417046 617.4
+ endloop
+endfacet
+facet normal -0.7282622292749885 -0.6852985666199982 7.978454901595107e-19
+ outer loop
+ vertex 26.428805842568213 195.08350496407672 617.4
+ vertex 25.410448164829532 196.16570689577944 597.4
+ vertex 26.428805842568213 195.08350496407672 597.4
+ endloop
+endfacet
+facet normal -0.7282622292749885 -0.6852985666199982 7.978454901595107e-19
+ outer loop
+ vertex 25.410448164829532 196.16570689577944 597.4
+ vertex 26.428805842568213 195.08350496407672 617.4
+ vertex 25.410448164829532 196.16570689577944 617.4
+ endloop
+endfacet
+facet normal 0.3870523431386321 -0.9220577442171909 2.9865951294904906e-16
+ outer loop
+ vertex -14.376359044152096 203.7456326895222 617.4
+ vertex -13.00617584389643 204.32079473497348 597.4
+ vertex -13.00617584389643 204.32079473497348 617.4
+ endloop
+endfacet
+facet normal 0.3870523431386321 -0.9220577442171909 2.9865951294904906e-16
+ outer loop
+ vertex -13.00617584389643 204.32079473497348 597.4
+ vertex -14.376359044152096 203.7456326895222 617.4
+ vertex -14.376359044152096 203.7456326895222 597.4
+ endloop
+endfacet
+facet normal 0.7829866224180505 -0.6220385431099694 3.150966317595326e-16
+ outer loop
+ vertex -27.290873495142403 193.95965933221288 617.4
+ vertex -28.21522640798993 192.79613663226206 597.4
+ vertex -27.290873495142403 193.95965933221288 597.4
+ endloop
+endfacet
+facet normal 0.7829866224180505 -0.6220385431099694 3.150966317595326e-16
+ outer loop
+ vertex -28.21522640798993 192.79613663226206 597.4
+ vertex -27.290873495142403 193.95965933221288 617.4
+ vertex -28.21522640798993 192.79613663226206 617.4
+ endloop
+endfacet
+facet normal -0.49942734013696766 -0.8663557767590137 9.271580545042399e-17
+ outer loop
+ vertex 17.148748984654713 202.4260094700737 617.4
+ vertex 18.436158735513036 201.68385752189502 597.4
+ vertex 18.436158735513036 201.68385752189502 617.4
+ endloop
+endfacet
+facet normal -0.49942734013696766 -0.8663557767590137 9.271580545042399e-17
+ outer loop
+ vertex 18.436158735513036 201.68385752189502 597.4
+ vertex 17.148748984654713 202.4260094700737 617.4
+ vertex 17.148748984654713 202.4260094700737 597.4
+ endloop
+endfacet
+facet normal 0.42527673511602226 -0.9050633671567184 3.030296777091411e-16
+ outer loop
+ vertex -15.721288500709916 203.11366897404986 617.4
+ vertex -14.376359044152096 203.7456326895222 597.4
+ vertex -14.376359044152096 203.7456326895222 617.4
+ endloop
+endfacet
+facet normal 0.42527673511602226 -0.9050633671567184 3.030296777091411e-16
+ outer loop
+ vertex -14.376359044152096 203.7456326895222 597.4
+ vertex -15.721288500709916 203.11366897404986 617.4
+ vertex -15.721288500709916 203.11366897404986 597.4
+ endloop
+endfacet
+facet normal -0.636751332244289 -0.7710692192566911 4.066361857342175e-17
+ outer loop
+ vertex 22.09666999900712 199.14389701212306 617.4
+ vertex 23.24248336816515 198.1976808085791 597.4
+ vertex 23.24248336816515 198.1976808085791 617.4
+ endloop
+endfacet
+facet normal -0.636751332244289 -0.7710692192566911 4.066361857342175e-17
+ outer loop
+ vertex 23.24248336816515 198.1976808085791 597.4
+ vertex 22.09666999900712 199.14389701212306 617.4
+ vertex 22.09666999900712 199.14389701212306 597.4
+ endloop
+endfacet
+facet normal -0.6989639196910222 -0.7151569331064074 1.4118899179751995e-17
+ outer loop
+ vertex 24.347720779875264 197.20437136809898 617.4
+ vertex 25.410448164829532 196.16570689577944 597.4
+ vertex 25.410448164829532 196.16570689577944 617.4
+ endloop
+endfacet
+facet normal -0.6989639196910222 -0.7151569331064074 1.4118899179751995e-17
+ outer loop
+ vertex 25.410448164829532 196.16570689577944 597.4
+ vertex 24.347720779875264 197.20437136809898 617.4
+ vertex 24.347720779875264 197.20437136809898 597.4
+ endloop
+endfacet
+facet normal -0.7829866224180543 -0.6220385431099646 -2.582513724148402e-17
+ outer loop
+ vertex 28.325364688606378 192.79613663226206 617.4
+ vertex 27.40101177575885 193.95965933221288 597.4
+ vertex 28.325364688606378 192.79613663226206 597.4
+ endloop
+endfacet
+facet normal -0.7829866224180543 -0.6220385431099646 -2.582513724148402e-17
+ outer loop
+ vertex 27.40101177575885 193.95965933221288 597.4
+ vertex 28.325364688606378 192.79613663226206 617.4
+ vertex 27.40101177575885 193.95965933221288 617.4
+ endloop
+endfacet
+facet normal 0.5352237960733128 -0.8447102983371713 3.129325803730413e-16
+ outer loop
+ vertex -19.58126489823363 200.88851183085123 617.4
+ vertex -18.326020454896568 201.68385752189502 597.4
+ vertex -18.326020454896568 201.68385752189502 617.4
+ endloop
+endfacet
+facet normal 0.5352237960733128 -0.8447102983371713 3.129325803730413e-16
+ outer loop
+ vertex -18.326020454896568 201.68385752189502 597.4
+ vertex -19.58126489823363 200.88851183085123 617.4
+ vertex -19.58126489823363 200.88851183085123 597.4
+ endloop
+endfacet
+facet normal -0.4627569298086952 -0.8864852079499299 1.053796479003083e-16
+ outer loop
+ vertex 15.831426781326385 203.11366897404986 617.4
+ vertex 17.148748984654713 202.4260094700737 597.4
+ vertex 17.148748984654713 202.4260094700737 617.4
+ endloop
+endfacet
+facet normal -0.4627569298086952 -0.8864852079499299 1.053796479003083e-16
+ outer loop
+ vertex 17.148748984654713 202.4260094700737 597.4
+ vertex 15.831426781326385 203.11366897404986 617.4
+ vertex 15.831426781326385 203.11366897404986 597.4
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -37.528588711684364 147.77186705673736 604.4681483474218
+ vertex -24.86976966658183 169.69758480667545 604.4
+ vertex -37.26976966658185 148.22015479282138 604.4
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -24.86976966658183 169.69758480667545 604.4
+ vertex -37.528588711684364 147.77186705673736 604.4681483474218
+ vertex -24.610950621479297 170.1458725427595 604.4681483474218
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -24.610950621479297 170.1458725427595 604.4681483474218
+ vertex -37.528588711684364 147.77186705673736 604.4681483474218
+ vertex -37.76976966658185 147.35412938903696 604.6679491924311
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -24.610950621479297 170.1458725427595 604.4681483474218
+ vertex -37.76976966658185 147.35412938903696 604.6679491924311
+ vertex -24.36976966658181 170.56361021045987 604.6679491924311
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -24.36976966658181 170.56361021045987 604.6679491924311
+ vertex -37.76976966658185 147.35412938903696 604.6679491924311
+ vertex -37.976876447768404 146.99540992142983 604.9857864376269
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -24.36976966658181 170.56361021045987 604.6679491924311
+ vertex -37.976876447768404 146.99540992142983 604.9857864376269
+ vertex -24.16266288539528 170.92232967806703 604.9857864376269
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -24.16266288539528 170.92232967806703 604.9857864376269
+ vertex -37.976876447768404 146.99540992142983 604.9857864376269
+ vertex -38.135795070366285 146.72015479282138 605.4
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -24.16266288539528 170.92232967806703 604.9857864376269
+ vertex -38.135795070366285 146.72015479282138 605.4
+ vertex -24.003744262797397 171.19758480667545 605.4
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -24.003744262797397 171.19758480667545 605.4
+ vertex -38.135795070366285 146.72015479282138 605.4
+ vertex -38.23569549287091 146.54712218534578 605.8823619097949
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -24.003744262797397 171.19758480667545 605.4
+ vertex -38.23569549287091 146.54712218534578 605.8823619097949
+ vertex -23.903843840292748 171.37061741415107 605.8823619097949
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -23.903843840292748 171.37061741415107 605.8823619097949
+ vertex -38.23569549287091 146.54712218534578 605.8823619097949
+ vertex -38.26976966658185 146.4881039852525 606.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -23.903843840292748 171.37061741415107 605.8823619097949
+ vertex -38.26976966658185 146.4881039852525 606.3999999999999
+ vertex -23.86976966658183 171.42963561424435 606.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -23.86976966658183 171.42963561424435 606.3999999999999
+ vertex -38.26976966658185 146.4881039852525 606.3999999999999
+ vertex -38.26976966658185 146.48810398525254 608.4
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -23.86976966658183 171.42963561424435 606.3999999999999
+ vertex -38.26976966658185 146.48810398525254 608.4
+ vertex -23.86976966658183 171.42963561424435 608.4
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -23.86976966658183 171.42963561424435 608.4
+ vertex -38.26976966658185 146.48810398525254 608.4
+ vertex -38.23569549287091 146.54712218534578 608.9176380902051
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -23.86976966658183 171.42963561424435 608.4
+ vertex -38.23569549287091 146.54712218534578 608.9176380902051
+ vertex -23.903843840292748 171.37061741415107 608.9176380902051
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -23.903843840292748 171.37061741415107 608.9176380902051
+ vertex -38.23569549287091 146.54712218534578 608.9176380902051
+ vertex -38.135795070366285 146.72015479282138 609.4
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -23.903843840292748 171.37061741415107 608.9176380902051
+ vertex -38.135795070366285 146.72015479282138 609.4
+ vertex -24.003744262797397 171.19758480667545 609.4
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -24.003744262797397 171.19758480667545 609.4
+ vertex -38.135795070366285 146.72015479282138 609.4
+ vertex -37.976876447768404 146.99540992142983 609.814213562373
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -24.003744262797397 171.19758480667545 609.4
+ vertex -37.976876447768404 146.99540992142983 609.814213562373
+ vertex -24.16266288539528 170.92232967806706 609.814213562373
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -24.16266288539528 170.92232967806706 609.814213562373
+ vertex -37.976876447768404 146.99540992142983 609.814213562373
+ vertex -37.76976966658185 147.35412938903698 610.1320508075687
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -24.16266288539528 170.92232967806706 609.814213562373
+ vertex -37.76976966658185 147.35412938903698 610.1320508075687
+ vertex -24.36976966658181 170.5636102104599 610.1320508075687
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -24.36976966658181 170.5636102104599 610.1320508075687
+ vertex -37.76976966658185 147.35412938903698 610.1320508075687
+ vertex -37.528588711684364 147.77186705673736 610.331851652578
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -24.36976966658181 170.5636102104599 610.1320508075687
+ vertex -37.528588711684364 147.77186705673736 610.331851652578
+ vertex -24.610950621479297 170.1458725427595 610.331851652578
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -24.610950621479297 170.1458725427595 610.331851652578
+ vertex -37.528588711684364 147.77186705673736 610.331851652578
+ vertex -37.26976966658185 148.2201547928214 610.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000012 -8.360210501876739e-16
+ outer loop
+ vertex -24.610950621479297 170.1458725427595 610.331851652578
+ vertex -37.26976966658185 148.2201547928214 610.3999999999999
+ vertex -24.86976966658183 169.69758480667545 610.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 24.721088902095804 170.14587254275943 604.4681483474218
+ vertex 37.37990794719834 148.22015479282135 604.4
+ vertex 24.97990794719834 169.6975848066754 604.4
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 37.37990794719834 148.22015479282135 604.4
+ vertex 24.721088902095804 170.14587254275943 604.4681483474218
+ vertex 37.63872699230085 147.7718670567373 604.4681483474218
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 37.63872699230085 147.7718670567373 604.4681483474218
+ vertex 24.721088902095804 170.14587254275943 604.4681483474218
+ vertex 24.47990794719832 170.56361021045984 604.6679491924311
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 37.63872699230085 147.7718670567373 604.4681483474218
+ vertex 24.47990794719832 170.56361021045984 604.6679491924311
+ vertex 37.87990794719834 147.3541293890369 604.6679491924311
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 37.87990794719834 147.3541293890369 604.6679491924311
+ vertex 24.47990794719832 170.56361021045984 604.6679491924311
+ vertex 24.27280116601179 170.922329678067 604.9857864376269
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 37.87990794719834 147.3541293890369 604.6679491924311
+ vertex 24.27280116601179 170.922329678067 604.9857864376269
+ vertex 38.08701472838489 146.99540992142974 604.9857864376269
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 38.08701472838489 146.99540992142974 604.9857864376269
+ vertex 24.27280116601179 170.922329678067 604.9857864376269
+ vertex 24.113882543413904 171.19758480667542 605.4
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 38.08701472838489 146.99540992142974 604.9857864376269
+ vertex 24.113882543413904 171.19758480667542 605.4
+ vertex 38.245933350982774 146.72015479282132 605.4
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 38.245933350982774 146.72015479282132 605.4
+ vertex 24.113882543413904 171.19758480667542 605.4
+ vertex 24.013982120909255 171.37061741415104 605.8823619097949
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 38.245933350982774 146.72015479282132 605.4
+ vertex 24.013982120909255 171.37061741415104 605.8823619097949
+ vertex 38.3458337734874 146.54712218534573 605.8823619097949
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 38.3458337734874 146.54712218534573 605.8823619097949
+ vertex 24.013982120909255 171.37061741415104 605.8823619097949
+ vertex 23.979907947198342 171.4296356142443 606.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 38.3458337734874 146.54712218534573 605.8823619097949
+ vertex 23.979907947198342 171.4296356142443 606.3999999999999
+ vertex 38.37990794719834 146.48810398525245 606.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 38.37990794719834 146.48810398525245 606.3999999999999
+ vertex 23.979907947198342 171.4296356142443 606.3999999999999
+ vertex 23.979907947198342 171.4296356142443 608.4
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 38.37990794719834 146.48810398525245 606.3999999999999
+ vertex 23.979907947198342 171.4296356142443 608.4
+ vertex 38.37990794719834 146.48810398525245 608.4
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 38.37990794719834 146.48810398525245 608.4
+ vertex 23.979907947198342 171.4296356142443 608.4
+ vertex 24.013982120909255 171.37061741415104 608.9176380902051
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 38.37990794719834 146.48810398525245 608.4
+ vertex 24.013982120909255 171.37061741415104 608.9176380902051
+ vertex 38.3458337734874 146.5471221853457 608.9176380902051
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 38.3458337734874 146.5471221853457 608.9176380902051
+ vertex 24.013982120909255 171.37061741415104 608.9176380902051
+ vertex 24.113882543413904 171.19758480667542 609.4
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 38.3458337734874 146.5471221853457 608.9176380902051
+ vertex 24.113882543413904 171.19758480667542 609.4
+ vertex 38.245933350982774 146.72015479282132 609.4
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 38.245933350982774 146.72015479282132 609.4
+ vertex 24.113882543413904 171.19758480667542 609.4
+ vertex 24.27280116601179 170.92232967806703 609.814213562373
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 38.245933350982774 146.72015479282132 609.4
+ vertex 24.27280116601179 170.92232967806703 609.814213562373
+ vertex 38.08701472838489 146.99540992142974 609.814213562373
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 38.08701472838489 146.99540992142974 609.814213562373
+ vertex 24.27280116601179 170.92232967806703 609.814213562373
+ vertex 24.47990794719832 170.56361021045984 610.1320508075687
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 38.08701472838489 146.99540992142974 609.814213562373
+ vertex 24.47990794719832 170.56361021045984 610.1320508075687
+ vertex 37.87990794719834 147.3541293890369 610.1320508075687
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 37.87990794719834 147.3541293890369 610.1320508075687
+ vertex 24.47990794719832 170.56361021045984 610.1320508075687
+ vertex 24.721088902095804 170.14587254275943 610.331851652578
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 37.87990794719834 147.3541293890369 610.1320508075687
+ vertex 24.721088902095804 170.14587254275943 610.331851652578
+ vertex 37.63872699230085 147.7718670567373 610.331851652578
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 37.63872699230085 147.7718670567373 610.331851652578
+ vertex 24.721088902095804 170.14587254275943 610.331851652578
+ vertex 24.97990794719834 169.6975848066754 610.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844387 0.5 -4.531641802949787e-16
+ outer loop
+ vertex 37.63872699230085 147.7718670567373 610.331851652578
+ vertex 24.97990794719834 169.6975848066754 610.3999999999999
+ vertex 37.37990794719834 148.22015479282135 610.3999999999999
+ endloop
+endfacet
+facet normal -7.240154675610708e-16 4.1801052509383803e-16 1.0
+ outer loop
+ vertex -23.137718859012985 168.69758480667545 610.3999999999999
+ vertex -37.26976966658185 148.2201547928214 610.3999999999999
+ vertex -35.537718859013005 147.22015479282138 610.3999999999999
+ endloop
+endfacet
+facet normal -7.240154675610708e-16 4.1801052509383803e-16 1.0
+ outer loop
+ vertex -37.26976966658185 148.2201547928214 610.3999999999999
+ vertex -23.137718859012985 168.69758480667545 610.3999999999999
+ vertex -24.86976966658183 169.69758480667545 610.3999999999999
+ endloop
+endfacet
+facet normal -0.4957224306869049 -0.8586164364012576 -0.1305261922200746
+ outer loop
+ vertex -36.537718859013005 145.4881039852525 606.3999999999999
+ vertex -38.23569549287091 146.54712218534578 605.8823619097949
+ vertex -36.50364468530207 145.54712218534578 605.8823619097949
+ endloop
+endfacet
+facet normal -0.4957224306869049 -0.8586164364012576 -0.1305261922200746
+ outer loop
+ vertex -38.23569549287091 146.54712218534578 605.8823619097949
+ vertex -36.537718859013005 145.4881039852525 606.3999999999999
+ vertex -38.26976966658185 146.4881039852525 606.3999999999999
+ endloop
+endfacet
+facet normal 0.30438071450435245 0.5272028623656552 0.7933533402912476
+ outer loop
+ vertex -22.430612077826435 169.92232967806706 609.814213562373
+ vertex -24.36976966658181 170.5636102104599 610.1320508075687
+ vertex -22.637718859012963 169.5636102104599 610.1320508075687
+ endloop
+endfacet
+facet normal 0.30438071450435245 0.5272028623656552 0.7933533402912476
+ outer loop
+ vertex -24.36976966658181 170.5636102104599 610.1320508075687
+ vertex -22.430612077826435 169.92232967806706 609.814213562373
+ vertex -24.16266288539528 170.92232967806706 609.814213562373
+ endloop
+endfacet
+facet normal -0.06526309610999552 -0.11303899832176091 0.9914448613738187
+ outer loop
+ vertex -35.537718859013005 147.22015479282138 610.3999999999999
+ vertex -37.528588711684364 147.77186705673736 610.331851652578
+ vertex -35.79653790411552 146.77186705673736 610.331851652578
+ endloop
+endfacet
+facet normal -0.06526309610999552 -0.11303899832176091 0.9914448613738187
+ outer loop
+ vertex -37.528588711684364 147.77186705673736 610.331851652578
+ vertex -35.537718859013005 147.22015479282138 610.3999999999999
+ vertex -37.26976966658185 148.2201547928214 610.3999999999999
+ endloop
+endfacet
+facet normal 0.19134171618257442 0.33141357403564325 0.9238795325112623
+ outer loop
+ vertex -22.637718859012963 169.5636102104599 610.1320508075687
+ vertex -24.610950621479297 170.1458725427595 610.331851652578
+ vertex -22.87889981391045 169.1458725427595 610.331851652578
+ endloop
+endfacet
+facet normal 0.19134171618257442 0.33141357403564325 0.9238795325112623
+ outer loop
+ vertex -24.610950621479297 170.1458725427595 610.331851652578
+ vertex -22.637718859012963 169.5636102104599 610.1320508075687
+ vertex -24.36976966658181 170.5636102104599 610.1320508075687
+ endloop
+endfacet
+facet normal 0.495722430686907 0.858616436401261 -0.1305261922200442
+ outer loop
+ vertex -22.1717930327239 170.37061741415107 605.8823619097949
+ vertex -23.86976966658183 171.42963561424435 606.3999999999999
+ vertex -22.13771885901299 170.42963561424435 606.3999999999999
+ endloop
+endfacet
+facet normal 0.495722430686907 0.858616436401261 -0.1305261922200442
+ outer loop
+ vertex -23.86976966658183 171.42963561424435 606.3999999999999
+ vertex -22.1717930327239 170.37061741415107 605.8823619097949
+ vertex -23.903843840292748 171.37061741415107 605.8823619097949
+ endloop
+endfacet
+facet normal -0.19134171618257903 -0.3314135740356482 0.9238795325112594
+ outer loop
+ vertex -35.79653790411552 146.77186705673736 610.331851652578
+ vertex -37.76976966658185 147.35412938903698 610.1320508075687
+ vertex -36.037718859013005 146.35412938903696 610.1320508075687
+ endloop
+endfacet
+facet normal -0.19134171618257903 -0.3314135740356482 0.9238795325112594
+ outer loop
+ vertex -37.76976966658185 147.35412938903698 610.1320508075687
+ vertex -35.79653790411552 146.77186705673736 610.331851652578
+ vertex -37.528588711684364 147.77186705673736 610.331851652578
+ endloop
+endfacet
+facet normal 0.3043807145043536 0.5272028623656544 -0.7933533402912476
+ outer loop
+ vertex -24.36976966658181 170.56361021045987 604.6679491924311
+ vertex -22.430612077826435 169.92232967806703 604.9857864376269
+ vertex -22.637718859012963 169.56361021045987 604.6679491924311
+ endloop
+endfacet
+facet normal 0.3043807145043536 0.5272028623656544 -0.7933533402912476
+ outer loop
+ vertex -22.430612077826435 169.92232967806703 604.9857864376269
+ vertex -24.36976966658181 170.56361021045987 604.6679491924311
+ vertex -24.16266288539528 170.92232967806703 604.9857864376269
+ endloop
+endfacet
+facet normal 0.4619397662556316 0.8001031451912428 0.38268343236515184
+ outer loop
+ vertex -23.903843840292748 171.37061741415107 608.9176380902051
+ vertex -22.27169345522855 170.19758480667548 609.4
+ vertex -22.1717930327239 170.37061741415107 608.9176380902051
+ endloop
+endfacet
+facet normal 0.4619397662556316 0.8001031451912428 0.38268343236515184
+ outer loop
+ vertex -22.27169345522855 170.19758480667548 609.4
+ vertex -23.903843840292748 171.37061741415107 608.9176380902051
+ vertex -24.003744262797397 171.19758480667545 609.4
+ endloop
+endfacet
+facet normal 0.49572243068690847 0.8586164364012637 0.13052619222002185
+ outer loop
+ vertex -23.86976966658183 171.42963561424435 608.4
+ vertex -22.1717930327239 170.37061741415107 608.9176380902051
+ vertex -22.13771885901299 170.42963561424435 608.4
+ endloop
+endfacet
+facet normal 0.49572243068690847 0.8586164364012637 0.13052619222002185
+ outer loop
+ vertex -22.1717930327239 170.37061741415107 608.9176380902051
+ vertex -23.86976966658183 171.42963561424435 608.4
+ vertex -23.903843840292748 171.37061741415107 608.9176380902051
+ endloop
+endfacet
+facet normal -0.3043807145043484 -0.5272028623656454 0.7933533402912555
+ outer loop
+ vertex -36.037718859013005 146.35412938903696 610.1320508075687
+ vertex -37.976876447768404 146.99540992142983 609.814213562373
+ vertex -36.24482564019956 145.99540992142983 609.814213562373
+ endloop
+endfacet
+facet normal -0.3043807145043484 -0.5272028623656454 0.7933533402912555
+ outer loop
+ vertex -37.976876447768404 146.99540992142983 609.814213562373
+ vertex -36.037718859013005 146.35412938903696 610.1320508075687
+ vertex -37.76976966658185 147.35412938903698 610.1320508075687
+ endloop
+endfacet
+facet normal -0.30438071450434717 -0.5272028623656461 -0.7933533402912555
+ outer loop
+ vertex -37.976876447768404 146.99540992142983 604.9857864376269
+ vertex -36.037718859013005 146.35412938903696 604.6679491924311
+ vertex -36.24482564019956 145.9954099214298 604.9857864376269
+ endloop
+endfacet
+facet normal -0.30438071450434717 -0.5272028623656461 -0.7933533402912555
+ outer loop
+ vertex -36.037718859013005 146.35412938903696 604.6679491924311
+ vertex -37.976876447768404 146.99540992142983 604.9857864376269
+ vertex -37.76976966658185 147.35412938903696 604.6679491924311
+ endloop
+endfacet
+facet normal 0.06526309610999147 0.11303899832175722 0.9914448613738194
+ outer loop
+ vertex -22.87889981391045 169.1458725427595 610.331851652578
+ vertex -24.86976966658183 169.69758480667545 610.3999999999999
+ vertex -23.137718859012985 168.69758480667545 610.3999999999999
+ endloop
+endfacet
+facet normal 0.06526309610999147 0.11303899832175722 0.9914448613738194
+ outer loop
+ vertex -24.86976966658183 169.69758480667545 610.3999999999999
+ vertex -22.87889981391045 169.1458725427595 610.331851652578
+ vertex -24.610950621479297 170.1458725427595 610.331851652578
+ endloop
+endfacet
+facet normal 0.46193976625564476 0.8001031451912645 -0.3826834323650908
+ outer loop
+ vertex -22.27169345522855 170.19758480667548 605.4
+ vertex -23.903843840292748 171.37061741415107 605.8823619097949
+ vertex -22.1717930327239 170.37061741415107 605.8823619097949
+ endloop
+endfacet
+facet normal 0.46193976625564476 0.8001031451912645 -0.3826834323650908
+ outer loop
+ vertex -23.903843840292748 171.37061741415107 605.8823619097949
+ vertex -22.27169345522855 170.19758480667548 605.4
+ vertex -24.003744262797397 171.19758480667545 605.4
+ endloop
+endfacet
+facet normal 0.19134171618258233 0.3314135740356539 -0.9238795325112567
+ outer loop
+ vertex -24.610950621479297 170.1458725427595 604.4681483474218
+ vertex -22.637718859012963 169.56361021045987 604.6679491924311
+ vertex -22.87889981391045 169.1458725427595 604.4681483474218
+ endloop
+endfacet
+facet normal 0.19134171618258233 0.3314135740356539 -0.9238795325112567
+ outer loop
+ vertex -22.637718859012963 169.56361021045987 604.6679491924311
+ vertex -24.610950621479297 170.1458725427595 604.4681483474218
+ vertex -24.36976966658181 170.56361021045987 604.6679491924311
+ endloop
+endfacet
+facet normal -0.06526309610999409 -0.11303899832176174 -0.9914448613738187
+ outer loop
+ vertex -37.528588711684364 147.77186705673736 604.4681483474218
+ vertex -35.537718859013005 147.22015479282138 604.4
+ vertex -35.79653790411552 146.77186705673736 604.4681483474218
+ endloop
+endfacet
+facet normal -0.06526309610999409 -0.11303899832176174 -0.9914448613738187
+ outer loop
+ vertex -35.537718859013005 147.22015479282138 604.4
+ vertex -37.528588711684364 147.77186705673736 604.4681483474218
+ vertex -37.26976966658185 148.22015479282138 604.4
+ endloop
+endfacet
+facet normal 0.5000000000000013 0.8660254037844379 -1.525901372395458e-31
+ outer loop
+ vertex -23.86976966658183 171.42963561424435 606.3999999999999
+ vertex -22.13771885901299 170.42963561424435 608.4
+ vertex -22.13771885901299 170.42963561424435 606.3999999999999
+ endloop
+endfacet
+facet normal 0.5000000000000013 0.8660254037844379 -1.525901372395458e-31
+ outer loop
+ vertex -22.13771885901299 170.42963561424435 608.4
+ vertex -23.86976966658183 171.42963561424435 606.3999999999999
+ vertex -23.86976966658183 171.42963561424435 608.4
+ endloop
+endfacet
+facet normal -0.4957224306869072 -0.8586164364012612 0.13052619222004305
+ outer loop
+ vertex -38.23569549287091 146.54712218534578 608.9176380902051
+ vertex -36.537718859013005 145.4881039852525 608.4
+ vertex -36.50364468530207 145.54712218534578 608.9176380902051
+ endloop
+endfacet
+facet normal -0.4957224306869072 -0.8586164364012612 0.13052619222004305
+ outer loop
+ vertex -36.537718859013005 145.4881039852525 608.4
+ vertex -38.23569549287091 146.54712218534578 608.9176380902051
+ vertex -38.26976966658185 146.48810398525254 608.4
+ endloop
+endfacet
+facet normal 0.39667667014560914 0.687064146869434 0.6087614290087444
+ outer loop
+ vertex -24.003744262797397 171.19758480667545 609.4
+ vertex -22.430612077826435 169.92232967806706 609.814213562373
+ vertex -22.27169345522855 170.19758480667548 609.4
+ endloop
+endfacet
+facet normal 0.39667667014560914 0.687064146869434 0.6087614290087444
+ outer loop
+ vertex -22.430612077826435 169.92232967806706 609.814213562373
+ vertex -24.003744262797397 171.19758480667545 609.4
+ vertex -24.16266288539528 170.92232967806706 609.814213562373
+ endloop
+endfacet
+facet normal -0.39667667014560454 -0.6870641468694261 -0.6087614290087562
+ outer loop
+ vertex -36.40374426279744 145.72015479282138 605.4
+ vertex -37.976876447768404 146.99540992142983 604.9857864376269
+ vertex -36.24482564019956 145.9954099214298 604.9857864376269
+ endloop
+endfacet
+facet normal -0.39667667014560454 -0.6870641468694261 -0.6087614290087562
+ outer loop
+ vertex -37.976876447768404 146.99540992142983 604.9857864376269
+ vertex -36.40374426279744 145.72015479282138 605.4
+ vertex -38.135795070366285 146.72015479282138 605.4
+ endloop
+endfacet
+facet normal -0.46193976625565125 -0.8001031451912769 -0.38268343236505625
+ outer loop
+ vertex -36.50364468530207 145.54712218534578 605.8823619097949
+ vertex -38.135795070366285 146.72015479282138 605.4
+ vertex -36.40374426279744 145.72015479282138 605.4
+ endloop
+endfacet
+facet normal -0.46193976625565125 -0.8001031451912769 -0.38268343236505625
+ outer loop
+ vertex -38.135795070366285 146.72015479282138 605.4
+ vertex -36.50364468530207 145.54712218534578 605.8823619097949
+ vertex -38.23569549287091 146.54712218534578 605.8823619097949
+ endloop
+endfacet
+facet normal 7.240154675610707e-16 -4.1801052509383793e-16 -1.0
+ outer loop
+ vertex -37.26976966658185 148.22015479282138 604.4
+ vertex -23.137718859012985 168.69758480667545 604.4
+ vertex -35.537718859013005 147.22015479282138 604.4
+ endloop
+endfacet
+facet normal 7.240154675610707e-16 -4.1801052509383793e-16 -1.0
+ outer loop
+ vertex -23.137718859012985 168.69758480667545 604.4
+ vertex -37.26976966658185 148.22015479282138 604.4
+ vertex -24.86976966658183 169.69758480667545 604.4
+ endloop
+endfacet
+facet normal 0.396676670145601 0.6870641468694179 -0.608761429008768
+ outer loop
+ vertex -22.430612077826435 169.92232967806703 604.9857864376269
+ vertex -24.003744262797397 171.19758480667545 605.4
+ vertex -22.27169345522855 170.19758480667548 605.4
+ endloop
+endfacet
+facet normal 0.396676670145601 0.6870641468694179 -0.608761429008768
+ outer loop
+ vertex -24.003744262797397 171.19758480667545 605.4
+ vertex -22.430612077826435 169.92232967806703 604.9857864376269
+ vertex -24.16266288539528 170.92232967806703 604.9857864376269
+ endloop
+endfacet
+facet normal 0.06526309610999291 0.11303899832175639 -0.9914448613738194
+ outer loop
+ vertex -24.86976966658183 169.69758480667545 604.4
+ vertex -22.87889981391045 169.1458725427595 604.4681483474218
+ vertex -23.137718859012985 168.69758480667545 604.4
+ endloop
+endfacet
+facet normal 0.06526309610999291 0.11303899832175639 -0.9914448613738194
+ outer loop
+ vertex -22.87889981391045 169.1458725427595 604.4681483474218
+ vertex -24.86976966658183 169.69758480667545 604.4
+ vertex -24.610950621479297 170.1458725427595 604.4681483474218
+ endloop
+endfacet
+facet normal -0.5000000000000013 -0.8660254037844379 2.4421626117070194e-15
+ outer loop
+ vertex -38.26976966658185 146.48810398525254 608.4
+ vertex -36.537718859013005 145.4881039852525 606.3999999999999
+ vertex -36.537718859013005 145.4881039852525 608.4
+ endloop
+endfacet
+facet normal -0.5000000000000013 -0.8660254037844379 2.4421626117070194e-15
+ outer loop
+ vertex -36.537718859013005 145.4881039852525 606.3999999999999
+ vertex -38.26976966658185 146.48810398525254 608.4
+ vertex -38.26976966658185 146.4881039852525 606.3999999999999
+ endloop
+endfacet
+facet normal -0.1913417161825777 -0.3314135740356489 -0.9238795325112594
+ outer loop
+ vertex -37.76976966658185 147.35412938903696 604.6679491924311
+ vertex -35.79653790411552 146.77186705673736 604.4681483474218
+ vertex -36.037718859013005 146.35412938903696 604.6679491924311
+ endloop
+endfacet
+facet normal -0.1913417161825777 -0.3314135740356489 -0.9238795325112594
+ outer loop
+ vertex -35.79653790411552 146.77186705673736 604.4681483474218
+ vertex -37.76976966658185 147.35412938903696 604.6679491924311
+ vertex -37.528588711684364 147.77186705673736 604.4681483474218
+ endloop
+endfacet
+facet normal -0.4619397662556376 -0.800103145191252 0.3826834323651254
+ outer loop
+ vertex -38.135795070366285 146.72015479282138 609.4
+ vertex -36.50364468530207 145.54712218534578 608.9176380902051
+ vertex -36.40374426279744 145.72015479282138 609.4
+ endloop
+endfacet
+facet normal -0.4619397662556376 -0.800103145191252 0.3826834323651254
+ outer loop
+ vertex -36.50364468530207 145.54712218534578 608.9176380902051
+ vertex -38.135795070366285 146.72015479282138 609.4
+ vertex -38.23569549287091 146.54712218534578 608.9176380902051
+ endloop
+endfacet
+facet normal -0.3966766701456055 -0.6870641468694256 0.6087614290087563
+ outer loop
+ vertex -37.976876447768404 146.99540992142983 609.814213562373
+ vertex -36.40374426279744 145.72015479282138 609.4
+ vertex -36.24482564019956 145.99540992142983 609.814213562373
+ endloop
+endfacet
+facet normal -0.3966766701456055 -0.6870641468694256 0.6087614290087563
+ outer loop
+ vertex -36.40374426279744 145.72015479282138 609.4
+ vertex -37.976876447768404 146.99540992142983 609.814213562373
+ vertex -38.135795070366285 146.72015479282138 609.4
+ endloop
+endfacet
+facet normal -0.8083169430505417 0.588747585623438 -3.128704161156742e-16
+ outer loop
+ vertex -31.55147180223168 193.31010907119963 617.4
+ vertex -30.60270404808994 194.6127132252034 597.4
+ vertex -31.55147180223168 193.31010907119963 597.4
+ endloop
+endfacet
+facet normal -0.8083169430505417 0.588747585623438 -3.128704161156742e-16
+ outer loop
+ vertex -30.60270404808994 194.6127132252034 597.4
+ vertex -31.55147180223168 193.31010907119963 617.4
+ vertex -30.60270404808994 194.6127132252034 617.4
+ endloop
+endfacet
+facet normal -0.34815064323675166 0.9374386004500969 -2.9376672002655305e-16
+ outer loop
+ vertex -14.10922162912293 207.11064956913492 597.4
+ vertex -12.598537700537447 207.67169493382545 617.4
+ vertex -12.598537700537447 207.67169493382545 597.4
+ endloop
+endfacet
+facet normal -0.34815064323675166 0.9374386004500969 -2.9376672002655305e-16
+ outer loop
+ vertex -12.598537700537447 207.67169493382545 617.4
+ vertex -14.10922162912293 207.11064956913492 597.4
+ vertex -14.10922162912293 207.11064956913492 617.4
+ endloop
+endfacet
+facet normal -0.7562861433211027 0.654240987267301 -3.167714557131983e-16
+ outer loop
+ vertex -29.600287858287494 195.87449752362727 617.4
+ vertex -28.545977373939976 197.09325395373216 597.4
+ vertex -29.600287858287494 195.87449752362727 597.4
+ endloop
+endfacet
+facet normal -0.7562861433211027 0.654240987267301 -3.167714557131983e-16
+ outer loop
+ vertex -28.545977373939976 197.09325395373216 597.4
+ vertex -29.600287858287494 195.87449752362727 617.4
+ vertex -28.545977373939976 197.09325395373216 617.4
+ endloop
+endfacet
+facet normal -0.10439696179122616 0.994535707940525 -2.5397624073309896e-16
+ outer loop
+ vertex -4.767105895595756 209.5061373960643 597.4
+ vertex -3.1644098793779976 209.67437328084162 617.4
+ vertex -3.1644098793779976 209.67437328084162 597.4
+ endloop
+endfacet
+facet normal -0.10439696179122616 0.994535707940525 -2.5397624073309896e-16
+ outer loop
+ vertex -3.1644098793779976 209.67437328084162 617.4
+ vertex -4.767105895595756 209.5061373960643 597.4
+ vertex -4.767105895595756 209.5061373960643 617.4
+ endloop
+endfacet
+facet normal -0.8322327793613368 0.5544263710868239 -3.1009670446530766e-16
+ outer loop
+ vertex -32.444930859691745 191.96896450555073 617.4
+ vertex -31.55147180223168 193.31010907119963 597.4
+ vertex -32.444930859691745 191.96896450555073 597.4
+ endloop
+endfacet
+facet normal -0.8322327793613368 0.5544263710868239 -3.1009670446530766e-16
+ outer loop
+ vertex -31.55147180223168 193.31010907119963 597.4
+ vertex -32.444930859691745 191.96896450555073 617.4
+ vertex -31.55147180223168 193.31010907119963 617.4
+ endloop
+endfacet
+facet normal -0.06271134093823419 0.9980317067697442 -2.4571391698701533e-16
+ outer loop
+ vertex -3.1644098793779976 209.67437328084162 597.4
+ vertex -1.5560800549907094 209.7754327154008 617.4
+ vertex -1.5560800549907094 209.7754327154008 597.4
+ endloop
+endfacet
+facet normal -0.06271134093823419 0.9980317067697442 -2.4571391698701533e-16
+ outer loop
+ vertex -1.5560800549907094 209.7754327154008 617.4
+ vertex -3.1644098793779976 209.67437328084162 597.4
+ vertex -3.1644098793779976 209.67437328084162 617.4
+ endloop
+endfacet
+facet normal 0.42261826174069567 0.9063077870366518 -1.187272019364568e-16
+ outer loop
+ vertex -22.866580315162654 153.01654109490124 597.4
+ vertex -22.22275951975374 152.71632252752264 617.4
+ vertex -22.22275951975374 152.71632252752264 597.4
+ endloop
+endfacet
+facet normal 0.42261826174069567 0.9063077870366518 -1.187272019364568e-16
+ outer loop
+ vertex -22.22275951975374 152.71632252752264 617.4
+ vertex -22.866580315162654 153.01654109490124 597.4
+ vertex -22.866580315162654 153.01654109490127 617.4
+ endloop
+endfacet
+facet normal 0.5735764363510477 0.8191520442889909 -6.559734023084969e-17
+ outer loop
+ vertex -23.448487618904775 153.42399697552077 597.4
+ vertex -22.866580315162654 153.01654109490127 617.4
+ vertex -22.866580315162654 153.01654109490124 597.4
+ endloop
+endfacet
+facet normal 0.5735764363510477 0.8191520442889909 -6.559734023084969e-17
+ outer loop
+ vertex -22.866580315162654 153.01654109490127 617.4
+ vertex -23.448487618904775 153.42399697552077 597.4
+ vertex -23.448487618904775 153.42399697552077 617.4
+ endloop
+endfacet
+facet normal -0.5352237960733159 0.8447102983371693 -3.129325803730416e-16
+ outer loop
+ vertex -21.23958885775712 203.3885041598935 597.4
+ vertex -19.87833674866336 204.25101823445394 617.4
+ vertex -19.87833674866336 204.25101823445394 597.4
+ endloop
+endfacet
+facet normal -0.5352237960733159 0.8447102983371693 -3.129325803730416e-16
+ outer loop
+ vertex -19.87833674866336 204.25101823445394 617.4
+ vertex -21.23958885775712 203.3885041598935 597.4
+ vertex -21.23958885775712 203.3885041598935 617.4
+ endloop
+endfacet
+facet normal -0.18714752017171726 0.9823318205645061 -2.691538986312248e-16
+ outer loop
+ vertex -7.944392955630252 208.96943090627016 597.4
+ vertex -6.361363525060216 209.27101945922956 617.4
+ vertex -6.361363525060216 209.27101945922956 597.4
+ endloop
+endfacet
+facet normal -0.18714752017171726 0.9823318205645061 -2.691538986312248e-16
+ outer loop
+ vertex -6.361363525060216 209.27101945922956 617.4
+ vertex -7.944392955630252 208.96943090627016 597.4
+ vertex -7.944392955630252 208.96943090627016 617.4
+ endloop
+endfacet
+facet normal -0.7282622292749814 0.685298566620006 -3.1789195718047457e-16
+ outer loop
+ vertex -28.545977373939976 197.09325395373216 617.4
+ vertex -27.44161754666337 198.26684979780484 597.4
+ vertex -28.545977373939976 197.09325395373216 597.4
+ endloop
+endfacet
+facet normal -0.7282622292749814 0.685298566620006 -3.1789195718047457e-16
+ outer loop
+ vertex -27.44161754666337 198.26684979780484 597.4
+ vertex -28.545977373939976 197.09325395373216 617.4
+ vertex -27.44161754666337 198.26684979780484 617.4
+ endloop
+endfacet
+facet normal -0.6989639196910225 0.715156933106407 -3.1845617538128344e-16
+ outer loop
+ vertex -27.44161754666337 198.26684979780484 597.4
+ vertex -26.28914091006915 199.3932313652284 617.4
+ vertex -26.28914091006915 199.3932313652284 597.4
+ endloop
+endfacet
+facet normal -0.6989639196910225 0.715156933106407 -3.1845617538128344e-16
+ outer loop
+ vertex -26.28914091006915 199.3932313652284 617.4
+ vertex -27.44161754666337 198.26684979780484 597.4
+ vertex -27.44161754666337 198.26684979780484 617.4
+ endloop
+endfacet
+facet normal 0.25881904510252435 0.9659258262890675 -1.6824959769008377e-16
+ outer loop
+ vertex -22.22275951975374 152.71632252752264 597.4
+ vertex -21.53658740175749 152.5324632626368 617.4
+ vertex -21.53658740175749 152.53246326263678 597.4
+ endloop
+endfacet
+facet normal 0.25881904510252435 0.9659258262890675 -1.6824959769008377e-16
+ outer loop
+ vertex -21.53658740175749 152.5324632626368 617.4
+ vertex -22.22275951975374 152.71632252752264 597.4
+ vertex -22.22275951975374 152.71632252752264 617.4
+ endloop
+endfacet
+facet normal -0.6039459209966601 0.7970252972845316 -3.1680613295388643e-16
+ outer loop
+ vertex -23.847984815414293 201.49655346124206 597.4
+ vertex -22.563577168123395 202.4698133591664 617.4
+ vertex -22.563577168123395 202.4698133591664 597.4
+ endloop
+endfacet
+facet normal -0.6039459209966601 0.7970252972845316 -3.1680613295388643e-16
+ outer loop
+ vertex -22.563577168123395 202.4698133591664 617.4
+ vertex -23.847984815414293 201.49655346124206 597.4
+ vertex -23.847984815414293 201.49655346124206 617.4
+ endloop
+endfacet
+facet normal -0.49942734013696766 0.8663557767590135 -3.101724610458227e-16
+ outer loop
+ vertex -19.87833674866336 204.25101823445394 597.4
+ vertex -18.48220291359554 205.05584625826145 617.4
+ vertex -18.48220291359554 205.05584625826145 597.4
+ endloop
+endfacet
+facet normal -0.49942734013696766 0.8663557767590135 -3.101724610458227e-16
+ outer loop
+ vertex -18.48220291359554 205.05584625826145 617.4
+ vertex -19.87833674866336 204.25101823445394 597.4
+ vertex -19.87833674866336 204.25101823445394 617.4
+ endloop
+endfacet
+facet normal -0.020915980694883277 0.9997812369471492 -2.3702161526486035e-16
+ outer loop
+ vertex -1.5560800549907094 209.7754327154008 597.4
+ vertex 0.05506914030825163 209.80913885452415 617.4
+ vertex 0.05506914030825163 209.80913885452415 597.4
+ endloop
+endfacet
+facet normal -0.020915980694883277 0.9997812369471492 -2.3702161526486035e-16
+ outer loop
+ vertex 0.05506914030825163 209.80913885452415 617.4
+ vertex -1.5560800549907094 209.7754327154008 597.4
+ vertex -1.5560800549907094 209.7754327154008 617.4
+ endloop
+endfacet
+facet normal 0.9659258262890671 -0.25881904510252585 2.704681784798781e-16
+ outer loop
+ vertex -24.658474920013315 157.93973105977102 617.4
+ vertex -24.84233418489917 157.25355894177474 597.4
+ vertex -24.658474920013315 157.939731059771 597.4
+ endloop
+endfacet
+facet normal 0.9659258262890671 -0.25881904510252585 2.704681784798781e-16
+ outer loop
+ vertex -24.84233418489917 157.25355894177474 597.4
+ vertex -24.658474920013315 157.93973105977102 617.4
+ vertex -24.84233418489917 157.25355894177474 617.4
+ endloop
+endfacet
+facet normal -0.3086397100005016 0.9511790206952665 -2.8835986090356206e-16
+ outer loop
+ vertex -12.598537700537447 207.67169493382545 597.4
+ vertex -11.065711060923867 208.16906836115942 617.4
+ vertex -11.065711060923867 208.16906836115942 597.4
+ endloop
+endfacet
+facet normal -0.3086397100005016 0.9511790206952665 -2.8835986090356206e-16
+ outer loop
+ vertex -11.065711060923867 208.16906836115942 617.4
+ vertex -12.598537700537447 207.67169493382545 597.4
+ vertex -12.598537700537447 207.67169493382545 617.4
+ endloop
+endfacet
+facet normal 1.4948637227165144e-16 1.0 -2.3251894735637833e-16
+ outer loop
+ vertex -20.828912953759342 152.47054977096997 597.4
+ vertex 20.88398209406786 152.47054977096997 617.4
+ vertex 20.88398209406786 152.47054977096997 597.4
+ endloop
+endfacet
+facet normal 1.4948637227165144e-16 1.0 -2.3251894735637833e-16
+ outer loop
+ vertex 20.88398209406786 152.47054977096997 617.4
+ vertex -20.828912953759342 152.47054977096997 597.4
+ vertex -20.828912953759342 152.47054977096997 617.4
+ endloop
+endfacet
+facet normal -0.9659258262890664 0.2588190451025278 -2.7046817847987846e-16
+ outer loop
+ vertex 24.768613200629805 155.15203792778217 617.4
+ vertex 24.952472465515662 155.83821004577842 597.4
+ vertex 24.768613200629805 155.15203792778217 597.4
+ endloop
+endfacet
+facet normal -0.9659258262890664 0.2588190451025278 -2.7046817847987846e-16
+ outer loop
+ vertex 24.952472465515662 155.83821004577842 597.4
+ vertex 24.768613200629805 155.15203792778217 617.4
+ vertex 24.952472465515662 155.83821004577845 617.4
+ endloop
+endfacet
+facet normal -0.3846106969126948 0.9230788762724078 -2.983653844698674e-16
+ outer loop
+ vertex 22.332897800370226 152.7163225275226 597.4
+ vertex 22.373300682659444 152.73315682100932 617.4
+ vertex 22.373300682659444 152.73315682100932 597.4
+ endloop
+endfacet
+facet normal -0.3846106969126948 0.9230788762724078 -2.983653844698674e-16
+ outer loop
+ vertex 22.373300682659444 152.73315682100932 617.4
+ vertex 22.332897800370226 152.7163225275226 597.4
+ vertex 22.332897800370226 152.7163225275226 617.4
+ endloop
+endfacet
+facet normal -0.09394352563205821 0.9955775278660216 -2.519427078479905e-16
+ outer loop
+ vertex 20.939051234375828 152.47054977096997 597.4
+ vertex 21.640128958283878 152.53670404954954 617.4
+ vertex 21.640128958283878 152.53670404954954 597.4
+ endloop
+endfacet
+facet normal -0.09394352563205821 0.9955775278660216 -2.519427078479905e-16
+ outer loop
+ vertex 21.640128958283878 152.53670404954954 617.4
+ vertex 20.939051234375828 152.47054977096997 597.4
+ vertex 20.939051234375828 152.47054977096997 617.4
+ endloop
+endfacet
+facet normal -0.425088184824243 0.9051519403519114 -3.0300922412569886e-16
+ outer loop
+ vertex 22.373300682659444 152.73315682100932 597.4
+ vertex 22.976718595779143 153.0165410949012 617.4
+ vertex 22.976718595779143 153.0165410949012 597.4
+ endloop
+endfacet
+facet normal -0.425088184824243 0.9051519403519114 -3.0300922412569886e-16
+ outer loop
+ vertex 22.976718595779143 153.0165410949012 617.4
+ vertex 22.373300682659444 152.73315682100932 597.4
+ vertex 22.373300682659444 152.73315682100932 617.4
+ endloop
+endfacet
+facet normal -0.596902427405206 0.8023138364491621 -3.1650240770775005e-16
+ outer loop
+ vertex 23.06122021535224 153.05393896729834 597.4
+ vertex 23.55862589952126 153.42399697552077 617.4
+ vertex 23.55862589952126 153.42399697552074 597.4
+ endloop
+endfacet
+facet normal -0.596902427405206 0.8023138364491621 -3.1650240770775005e-16
+ outer loop
+ vertex 23.55862589952126 153.42399697552077 617.4
+ vertex 23.06122021535224 153.05393896729834 597.4
+ vertex 23.06122021535224 153.05393896729836 617.4
+ endloop
+endfacet
+facet normal 0.9063077870366554 0.4226182617406877 9.904188843509435e-17
+ outer loop
+ vertex -24.658474920013315 155.1520379277822 617.4
+ vertex -24.358256352634704 154.5082171323733 597.4
+ vertex -24.658474920013315 155.1520379277822 597.4
+ endloop
+endfacet
+facet normal 0.9063077870366554 0.4226182617406877 9.904188843509435e-17
+ outer loop
+ vertex -24.358256352634704 154.5082171323733 597.4
+ vertex -24.658474920013315 155.1520379277822 617.4
+ vertex -24.358256352634704 154.5082171323733 617.4
+ endloop
+endfacet
+facet normal -0.9063077870366554 -0.4226182617406877 -9.904188843509435e-17
+ outer loop
+ vertex 24.768613200629805 157.93973105977096 617.4
+ vertex 24.468394633251194 158.5835518551799 597.4
+ vertex 24.768613200629805 157.93973105977096 597.4
+ endloop
+endfacet
+facet normal -0.9063077870366554 -0.4226182617406877 -9.904188843509435e-17
+ outer loop
+ vertex 24.468394633251194 158.5835518551799 597.4
+ vertex 24.768613200629805 157.93973105977096 617.4
+ vertex 24.468394633251194 158.5835518551799 617.4
+ endloop
+endfacet
+facet normal -0.40470653839706777 0.9144466183319083 -3.007332061776945e-16
+ outer loop
+ vertex 22.976718595779143 153.0165410949012 597.4
+ vertex 23.06122021535224 153.05393896729836 617.4
+ vertex 23.06122021535224 153.05393896729834 597.4
+ endloop
+endfacet
+facet normal -0.40470653839706777 0.9144466183319083 -3.007332061776945e-16
+ outer loop
+ vertex 23.06122021535224 153.05393896729836 617.4
+ vertex 22.976718595779143 153.0165410949012 597.4
+ vertex 22.976718595779143 153.0165410949012 617.4
+ endloop
+endfacet
+facet normal -0.25097753115913946 0.9679929126048719 -2.7971600712696426e-16
+ outer loop
+ vertex 21.640128958283878 152.53670404954954 597.4
+ vertex 22.332897800370226 152.7163225275226 617.4
+ vertex 22.332897800370226 152.7163225275226 597.4
+ endloop
+endfacet
+facet normal -0.25097753115913946 0.9679929126048719 -2.7971600712696426e-16
+ outer loop
+ vertex 22.332897800370226 152.7163225275226 617.4
+ vertex 21.640128958283878 152.53670404954954 597.4
+ vertex 21.640128958283878 152.53670404954954 617.4
+ endloop
+endfacet
+facet normal -0.9659258262890669 -0.2588190451025263 -1.5010751463383332e-16
+ outer loop
+ vertex 24.952472465515662 157.2535589417747 617.4
+ vertex 24.768613200629805 157.93973105977096 597.4
+ vertex 24.952472465515662 157.2535589417747 597.4
+ endloop
+endfacet
+facet normal -0.9659258262890669 -0.2588190451025263 -1.5010751463383332e-16
+ outer loop
+ vertex 24.768613200629805 157.93973105977096 597.4
+ vertex 24.952472465515662 157.2535589417747 617.4
+ vertex 24.768613200629805 157.93973105977096 617.4
+ endloop
+endfacet
+facet normal 2.0538609066161242e-13 1.0 -2.325189473563336e-16
+ outer loop
+ vertex 20.88398209406786 152.47054977096997 597.4
+ vertex 20.939051234375828 152.47054977096997 617.4
+ vertex 20.939051234375828 152.47054977096997 597.4
+ endloop
+endfacet
+facet normal 2.0538609066161242e-13 1.0 -2.325189473563336e-16
+ outer loop
+ vertex 20.939051234375828 152.47054977096997 617.4
+ vertex 20.88398209406786 152.47054977096997 597.4
+ vertex 20.88398209406786 152.47054977096997 617.4
+ endloop
+endfacet
+facet normal 0.996194698091746 -0.08715574274765303 2.3714292307799425e-16
+ outer loop
+ vertex -24.84233418489917 157.25355894177474 617.4
+ vertex -24.90424767656597 156.5458844937766 597.4
+ vertex -24.84233418489917 157.25355894177474 597.4
+ endloop
+endfacet
+facet normal 0.996194698091746 -0.08715574274765303 2.3714292307799425e-16
+ outer loop
+ vertex -24.90424767656597 156.5458844937766 597.4
+ vertex -24.84233418489917 157.25355894177474 617.4
+ vertex -24.90424767656597 156.5458844937766 617.4
+ endloop
+endfacet
+facet normal 0.8191520442889927 0.5735764363510447 4.4966924573860044e-17
+ outer loop
+ vertex -24.358256352634704 154.5082171323733 617.4
+ vertex -23.95080047201519 153.92630982863116 597.4
+ vertex -24.358256352634704 154.5082171323733 597.4
+ endloop
+endfacet
+facet normal 0.8191520442889927 0.5735764363510447 4.4966924573860044e-17
+ outer loop
+ vertex -23.95080047201519 153.92630982863116 597.4
+ vertex -24.358256352634704 154.5082171323733 617.4
+ vertex -23.95080047201519 153.9263098286312 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -8.194930859691734 197.22612362681014 617.4
+ vertex -10.194930859691729 191.96896450555067 617.4
+ vertex -8.194930859691734 191.96896450555067 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -10.194930859691729 184.3761236268101 617.4
+ vertex -12.694930859691725 186.78502419417046 617.4
+ vertex -13.88771885901298 184.7190547766876 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -12.694930859691725 186.78502419417046 617.4
+ vertex -10.194930859691729 184.3761236268101 617.4
+ vertex -10.194930859691729 191.96896450555067 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -12.694930859691725 186.78502419417046 617.4
+ vertex -10.194930859691729 191.96896450555067 617.4
+ vertex -12.694930859691715 204.43638645629056 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -12.694930859691715 204.43638645629056 617.4
+ vertex -10.194930859691729 191.96896450555067 617.4
+ vertex -10.194930859691729 197.22612362681014 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -10.194930859691729 197.22612362681014 617.4
+ vertex -10.194930859691729 191.96896450555067 617.4
+ vertex -8.194930859691734 197.22612362681014 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -12.694930859691715 204.43638645629056 617.4
+ vertex -10.194930859691729 197.22612362681014 617.4
+ vertex -10.194930859691718 204.8761236268101 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex -41.8783177822545 132.23791530735065 617.4
+ vertex -39.568916705496 132.23791530735065 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -41.8783177822545 132.23791530735065 617.4
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex -42.436689296971025 132.30606365477252 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -42.436689296971025 132.30606365477252 617.4
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex -42.87831778225449 132.50586449978178 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -42.87831778225449 132.50586449978178 617.4
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex -43.173106986658425 132.82370174497757 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -43.173106986658425 132.82370174497757 617.4
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex -43.30096751306486 133.23791530735065 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -43.30096751306486 133.23791530735065 617.4
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex -43.253185877898744 133.72027721714562 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -43.253185877898744 133.72027721714562 617.4
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex -43.03301832063373 134.23791530735068 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -43.03301832063373 134.23791530735068 617.4
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex -15.387718859012988 182.1209785653343 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -15.387718859012988 182.1209785653343 617.4
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex -24.658474920013315 157.93973105977102 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -24.658474920013315 157.93973105977102 617.4
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex -24.84233418489917 157.25355894177474 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -24.84233418489917 157.25355894177474 617.4
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex -24.90424767656597 156.5458844937766 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -24.90424767656597 156.5458844937766 617.4
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex -24.84233418489917 155.83821004577848 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -24.84233418489917 155.83821004577848 617.4
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex -24.658474920013315 155.1520379277822 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -24.658474920013315 155.1520379277822 617.4
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex -24.358256352634704 154.5082171323733 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -24.358256352634704 154.5082171323733 617.4
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex -23.95080047201519 153.9263098286312 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -23.95080047201519 153.9263098286312 617.4
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex -23.448487618904775 153.42399697552077 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -23.448487618904775 153.42399697552077 617.4
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex -22.866580315162654 153.01654109490127 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -22.866580315162654 153.01654109490127 617.4
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex -22.22275951975374 152.71632252752264 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -22.22275951975374 152.71632252752264 617.4
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex -21.53658740175749 152.5324632626368 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -21.53658740175749 152.5324632626368 617.4
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex -20.828912953759342 152.47054977096997 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -15.387718859012988 182.1209785653343 617.4
+ vertex -24.658474920013315 157.93973105977102 617.4
+ vertex -24.358256352634704 158.58355185517993 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -15.387718859012988 182.1209785653343 617.4
+ vertex -24.358256352634704 158.58355185517993 617.4
+ vertex -11.660839120111838 180.57612362681013 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -15.387718859012988 182.1209785653343 617.4
+ vertex -11.660839120111838 180.57612362681013 617.4
+ vertex 15.497857139629502 182.12097856533427 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -15.387718859012988 182.1209785653343 617.4
+ vertex 15.497857139629502 182.12097856533427 617.4
+ vertex 10.305069140308255 184.3761236268101 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 10.305069140308255 184.3761236268101 617.4
+ vertex 15.497857139629502 182.12097856533427 617.4
+ vertex 13.997857139629506 184.71905477668759 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 13.997857139629506 184.71905477668759 617.4
+ vertex 15.497857139629502 182.12097856533427 617.4
+ vertex 29.952220022669408 190.4662088668219 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 13.997857139629506 184.71905477668759 617.4
+ vertex 29.952220022669408 190.4662088668219 617.4
+ vertex 28.325364688606378 192.79613663226206 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 28.325364688606378 192.79613663226206 617.4
+ vertex 29.952220022669408 190.4662088668219 617.4
+ vertex 32.55506914030826 191.96896450555064 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 28.325364688606378 192.79613663226206 617.4
+ vertex 32.55506914030826 191.96896450555064 617.4
+ vertex 31.66161008284822 193.31010907119958 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 28.325364688606378 192.79613663226206 617.4
+ vertex 31.66161008284822 193.31010907119958 617.4
+ vertex 27.40101177575885 193.95965933221288 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 27.40101177575885 193.95965933221288 617.4
+ vertex 31.66161008284822 193.31010907119958 617.4
+ vertex 30.712842328706454 194.61271322520335 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 27.40101177575885 193.95965933221288 617.4
+ vertex 30.712842328706454 194.61271322520335 617.4
+ vertex 26.428805842568213 195.08350496407672 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 26.428805842568213 195.08350496407672 617.4
+ vertex 30.712842328706454 194.61271322520335 617.4
+ vertex 29.71042613890401 195.8744975236272 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 26.428805842568213 195.08350496407672 617.4
+ vertex 29.71042613890401 195.8744975236272 617.4
+ vertex 25.410448164829532 196.16570689577944 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 25.410448164829532 196.16570689577944 617.4
+ vertex 29.71042613890401 195.8744975236272 617.4
+ vertex 28.65611565455649 197.09325395373207 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 25.410448164829532 196.16570689577944 617.4
+ vertex 28.65611565455649 197.09325395373207 617.4
+ vertex 24.347720779875264 197.20437136809898 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 24.347720779875264 197.20437136809898 617.4
+ vertex 28.65611565455649 197.09325395373207 617.4
+ vertex 27.551755827279884 198.26684979780475 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 24.347720779875264 197.20437136809898 617.4
+ vertex 27.551755827279884 198.26684979780475 617.4
+ vertex 23.24248336816515 198.1976808085791 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 23.24248336816515 198.1976808085791 617.4
+ vertex 27.551755827279884 198.26684979780475 617.4
+ vertex 22.09666999900712 199.14389701212306 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 22.09666999900712 199.14389701212306 617.4
+ vertex 27.551755827279884 198.26684979780475 617.4
+ vertex 26.399279190685665 199.3932313652283 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 22.09666999900712 199.14389701212306 617.4
+ vertex 26.399279190685665 199.3932313652283 617.4
+ vertex 20.912285746104196 200.04136418270153 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 20.912285746104196 200.04136418270153 617.4
+ vertex 26.399279190685665 199.3932313652283 617.4
+ vertex 25.200702478615163 200.47042758626208 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 20.912285746104196 200.04136418270153 617.4
+ vertex 25.200702478615163 200.47042758626208 617.4
+ vertex 19.691403178850077 200.8885118308512 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 19.691403178850077 200.8885118308512 617.4
+ vertex 25.200702478615163 200.47042758626208 617.4
+ vertex 23.958123096030832 201.49655346124203 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 19.691403178850077 200.8885118308512 617.4
+ vertex 23.958123096030832 201.49655346124203 617.4
+ vertex 18.436158735513036 201.68385752189502 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 18.436158735513036 201.68385752189502 617.4
+ vertex 23.958123096030832 201.49655346124203 617.4
+ vertex 22.67371544873991 202.46981335916635 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 18.436158735513036 201.68385752189502 617.4
+ vertex 22.67371544873991 202.46981335916635 617.4
+ vertex 17.148748984654713 202.4260094700737 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 17.148748984654713 202.4260094700737 617.4
+ vertex 22.67371544873991 202.46981335916635 617.4
+ vertex 15.831426781326385 203.11366897404986 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 15.831426781326385 203.11366897404986 617.4
+ vertex 22.67371544873991 202.46981335916635 617.4
+ vertex 21.349727138373666 203.38850415989344 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 15.831426781326385 203.11366897404986 617.4
+ vertex 21.349727138373666 203.38850415989344 617.4
+ vertex 14.486497324768576 203.74563268952215 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 14.486497324768576 203.74563268952215 617.4
+ vertex 21.349727138373666 203.38850415989344 617.4
+ vertex 19.988475029279908 204.25101823445388 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 14.486497324768576 203.74563268952215 617.4
+ vertex 19.988475029279908 204.25101823445388 617.4
+ vertex 13.116314124512934 204.32079473497345 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 13.116314124512934 204.32079473497345 617.4
+ vertex 19.988475029279908 204.25101823445388 617.4
+ vertex 18.592341194212068 205.0558462582614 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 13.116314124512934 204.32079473497345 617.4
+ vertex 18.592341194212068 205.0558462582614 617.4
+ vertex 12.805069140308262 204.4363864562905 617.3999999999999
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 12.805069140308262 204.4363864562905 617.3999999999999
+ vertex 18.592341194212068 205.0558462582614 617.4
+ vertex 10.305069140308266 204.8761236268101 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 10.305069140308266 204.8761236268101 617.4
+ vertex 18.592341194212068 205.0558462582614 617.4
+ vertex -10.194930859691718 204.8761236268101 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -15.387718859012988 182.1209785653343 617.4
+ vertex -13.88771885901298 184.7190547766876 617.4
+ vertex -29.842081742052876 190.46620886682194 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -13.88771885901298 184.7190547766876 617.4
+ vertex -15.387718859012988 182.1209785653343 617.4
+ vertex -10.194930859691729 184.3761236268101 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -10.194930859691729 184.3761236268101 617.4
+ vertex -15.387718859012988 182.1209785653343 617.4
+ vertex 10.305069140308255 184.3761236268101 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -29.842081742052876 190.46620886682194 617.4
+ vertex -13.88771885901298 184.7190547766876 617.4
+ vertex -28.21522640798993 192.79613663226206 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -29.842081742052876 190.46620886682194 617.4
+ vertex -28.21522640798993 192.79613663226206 617.4
+ vertex -32.444930859691745 191.96896450555073 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -32.444930859691745 191.96896450555073 617.4
+ vertex -28.21522640798993 192.79613663226206 617.4
+ vertex -31.55147180223168 193.31010907119963 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -31.55147180223168 193.31010907119963 617.4
+ vertex -28.21522640798993 192.79613663226206 617.4
+ vertex -27.290873495142403 193.95965933221288 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -31.55147180223168 193.31010907119963 617.4
+ vertex -27.290873495142403 193.95965933221288 617.4
+ vertex -30.60270404808994 194.6127132252034 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -30.60270404808994 194.6127132252034 617.4
+ vertex -27.290873495142403 193.95965933221288 617.4
+ vertex -26.318667561951766 195.08350496407672 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -30.60270404808994 194.6127132252034 617.4
+ vertex -26.318667561951766 195.08350496407672 617.4
+ vertex -29.600287858287494 195.87449752362727 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -29.600287858287494 195.87449752362727 617.4
+ vertex -26.318667561951766 195.08350496407672 617.4
+ vertex -25.300309884213064 196.16570689577946 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -29.600287858287494 195.87449752362727 617.4
+ vertex -25.300309884213064 196.16570689577946 617.4
+ vertex -28.545977373939976 197.09325395373216 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -28.545977373939976 197.09325395373216 617.4
+ vertex -25.300309884213064 196.16570689577946 617.4
+ vertex -24.237582499258796 197.20437136809898 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -28.545977373939976 197.09325395373216 617.4
+ vertex -24.237582499258796 197.20437136809898 617.4
+ vertex -27.44161754666337 198.26684979780484 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -27.44161754666337 198.26684979780484 617.4
+ vertex -24.237582499258796 197.20437136809898 617.4
+ vertex -23.132345087548707 198.1976808085791 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -27.44161754666337 198.26684979780484 617.4
+ vertex -23.132345087548707 198.1976808085791 617.4
+ vertex -21.986531718390673 199.1438970121231 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -27.44161754666337 198.26684979780484 617.4
+ vertex -21.986531718390673 199.1438970121231 617.4
+ vertex -26.28914091006915 199.3932313652284 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -26.28914091006915 199.3932313652284 617.4
+ vertex -21.986531718390673 199.1438970121231 617.4
+ vertex -20.80214746548775 200.04136418270153 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -26.28914091006915 199.3932313652284 617.4
+ vertex -20.80214746548775 200.04136418270153 617.4
+ vertex -25.09056419799865 200.4704275862621 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -25.09056419799865 200.4704275862621 617.4
+ vertex -20.80214746548775 200.04136418270153 617.4
+ vertex -19.58126489823363 200.88851183085123 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -25.09056419799865 200.4704275862621 617.4
+ vertex -19.58126489823363 200.88851183085123 617.4
+ vertex -23.847984815414293 201.49655346124206 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -23.847984815414293 201.49655346124206 617.4
+ vertex -19.58126489823363 200.88851183085123 617.4
+ vertex -18.326020454896568 201.68385752189502 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -23.847984815414293 201.49655346124206 617.4
+ vertex -18.326020454896568 201.68385752189502 617.4
+ vertex -22.563577168123395 202.4698133591664 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -22.563577168123395 202.4698133591664 617.4
+ vertex -18.326020454896568 201.68385752189502 617.4
+ vertex -17.038610704038266 202.42600947007372 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -22.563577168123395 202.4698133591664 617.4
+ vertex -17.038610704038266 202.42600947007372 617.4
+ vertex -15.721288500709916 203.11366897404986 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -22.563577168123395 202.4698133591664 617.4
+ vertex -15.721288500709916 203.11366897404986 617.4
+ vertex -21.23958885775712 203.3885041598935 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -21.23958885775712 203.3885041598935 617.4
+ vertex -15.721288500709916 203.11366897404986 617.4
+ vertex -14.376359044152096 203.7456326895222 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -21.23958885775712 203.3885041598935 617.4
+ vertex -14.376359044152096 203.7456326895222 617.4
+ vertex -19.87833674866336 204.25101823445394 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -19.87833674866336 204.25101823445394 617.4
+ vertex -14.376359044152096 203.7456326895222 617.4
+ vertex -13.00617584389643 204.32079473497348 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -19.87833674866336 204.25101823445394 617.4
+ vertex -13.00617584389643 204.32079473497348 617.4
+ vertex -18.48220291359554 205.05584625826145 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -18.48220291359554 205.05584625826145 617.4
+ vertex -13.00617584389643 204.32079473497348 617.4
+ vertex -12.694930859691715 204.43638645629056 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -18.48220291359554 205.05584625826145 617.4
+ vertex -12.694930859691715 204.43638645629056 617.4
+ vertex -10.194930859691718 204.8761236268101 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -18.48220291359554 205.05584625826145 617.4
+ vertex -10.194930859691718 204.8761236268101 617.4
+ vertex 18.592341194212068 205.0558462582614 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -18.48220291359554 205.05584625826145 617.4
+ vertex 18.592341194212068 205.0558462582614 617.4
+ vertex 17.163768745909092 205.80157985229934 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -18.48220291359554 205.05584625826145 617.4
+ vertex 17.163768745909092 205.80157985229934 617.4
+ vertex -17.053630465292567 205.80157985229934 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -17.053630465292567 205.80157985229934 617.4
+ vertex 17.163768745909092 205.80157985229934 617.4
+ vertex 15.705257561860751 206.48691404766168 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -17.053630465292567 205.80157985229934 617.4
+ vertex 15.705257561860751 206.48691404766168 617.4
+ vertex -15.595119281244203 206.4869140476617 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -15.595119281244203 206.4869140476617 617.4
+ vertex 15.705257561860751 206.48691404766168 617.4
+ vertex 14.219359909739431 207.1106495691349 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -15.595119281244203 206.4869140476617 617.4
+ vertex 14.219359909739431 207.1106495691349 617.4
+ vertex -14.10922162912293 207.11064956913492 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -14.10922162912293 207.11064956913492 617.4
+ vertex 14.219359909739431 207.1106495691349 617.4
+ vertex 12.708675981153974 207.6716949338254 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -14.10922162912293 207.11064956913492 617.4
+ vertex 12.708675981153974 207.6716949338254 617.4
+ vertex -12.598537700537447 207.67169493382545 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -12.598537700537447 207.67169493382545 617.4
+ vertex 12.708675981153974 207.6716949338254 617.4
+ vertex 11.17584934154037 208.1690683611594 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -12.598537700537447 207.67169493382545 617.4
+ vertex 11.17584934154037 208.1690683611594 617.4
+ vertex -11.065711060923867 208.16906836115942 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -11.065711060923867 208.16906836115942 617.4
+ vertex 11.17584934154037 208.1690683611594 617.4
+ vertex 9.623562304152413 208.60189949091367 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -11.065711060923867 208.16906836115942 617.4
+ vertex 9.623562304152413 208.60189949091367 617.4
+ vertex -9.513424023535883 208.60189949091367 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -9.513424023535883 208.60189949091367 617.4
+ vertex 9.623562304152413 208.60189949091367 617.4
+ vertex 8.05453123624676 208.96943090627016 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -9.513424023535883 208.60189949091367 617.4
+ vertex 8.05453123624676 208.96943090627016 617.4
+ vertex -7.944392955630252 208.96943090627016 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -7.944392955630252 208.96943090627016 617.4
+ vertex 8.05453123624676 208.96943090627016 617.4
+ vertex 6.471501805676724 209.27101945922956 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -7.944392955630252 208.96943090627016 617.4
+ vertex 6.471501805676724 209.27101945922956 617.4
+ vertex -6.361363525060216 209.27101945922956 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -6.361363525060216 209.27101945922956 617.4
+ vertex 6.471501805676724 209.27101945922956 617.4
+ vertex 4.877244176212259 209.5061373960643 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -6.361363525060216 209.27101945922956 617.4
+ vertex 4.877244176212259 209.5061373960643 617.4
+ vertex -4.767105895595756 209.5061373960643 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -4.767105895595756 209.5061373960643 617.4
+ vertex 4.877244176212259 209.5061373960643 617.4
+ vertex 3.274548159994501 209.67437328084162 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -4.767105895595756 209.5061373960643 617.4
+ vertex 3.274548159994501 209.67437328084162 617.4
+ vertex -3.1644098793779976 209.67437328084162 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -3.1644098793779976 209.67437328084162 617.4
+ vertex 3.274548159994501 209.67437328084162 617.4
+ vertex -1.5560800549907094 209.7754327154008 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -1.5560800549907094 209.7754327154008 617.4
+ vertex 3.274548159994501 209.67437328084162 617.4
+ vertex 1.6662183356072127 209.7754327154008 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -1.5560800549907094 209.7754327154008 617.4
+ vertex 1.6662183356072127 209.7754327154008 617.4
+ vertex 0.05506914030825163 209.80913885452415 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 10.305069140308255 184.3761236268101 617.4
+ vertex 12.80506914030825 186.78502419417043 617.4
+ vertex 10.30506914030826 191.96896450555064 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 12.80506914030825 186.78502419417043 617.4
+ vertex 10.305069140308255 184.3761236268101 617.4
+ vertex 13.997857139629506 184.71905477668759 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 10.30506914030826 191.96896450555064 617.4
+ vertex 12.80506914030825 186.78502419417043 617.4
+ vertex 12.805069140308262 204.4363864562905 617.3999999999999
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 10.30506914030826 191.96896450555064 617.4
+ vertex 12.805069140308262 204.4363864562905 617.3999999999999
+ vertex 10.30506914030826 197.2261236268101 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 10.30506914030826 191.96896450555064 617.4
+ vertex 10.30506914030826 197.2261236268101 617.4
+ vertex 8.305069140308264 191.96896450555064 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 10.30506914030826 197.2261236268101 617.4
+ vertex 12.805069140308262 204.4363864562905 617.3999999999999
+ vertex 10.305069140308266 204.8761236268101 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 8.305069140308264 197.2261236268101 617.4
+ vertex 8.305069140308264 191.96896450555064 617.4
+ vertex 10.30506914030826 197.2261236268101 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 42.546827577587486 132.30606365477246 617.4
+ vertex 39.679054986112455 132.2379153073506 617.4
+ vertex 41.98845606287095 132.2379153073506 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 39.679054986112455 132.2379153073506 617.4
+ vertex 42.546827577587486 132.30606365477246 617.4
+ vertex 30.48034418964194 148.17054977096993 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.17054977096993 617.4
+ vertex 42.546827577587486 132.30606365477246 617.4
+ vertex 42.98845606287095 132.5058644997817 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.17054977096993 617.4
+ vertex 42.98845606287095 132.5058644997817 617.4
+ vertex 43.28324526727487 132.82370174497748 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.17054977096993 617.4
+ vertex 43.28324526727487 132.82370174497748 617.4
+ vertex 43.41110579368132 133.2379153073506 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.17054977096993 617.4
+ vertex 43.41110579368132 133.2379153073506 617.4
+ vertex 43.3633241585152 133.72027721714554 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.17054977096993 617.4
+ vertex 43.3633241585152 133.72027721714554 617.4
+ vertex 43.143156601250205 134.2379153073506 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.17054977096993 617.4
+ vertex 43.143156601250205 134.2379153073506 617.4
+ vertex 15.497857139629502 182.12097856533427 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.17054977096993 617.4
+ vertex 15.497857139629502 182.12097856533427 617.4
+ vertex 24.768613200629805 157.93973105977096 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.17054977096993 617.4
+ vertex 24.768613200629805 157.93973105977096 617.4
+ vertex 24.952472465515662 157.2535589417747 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.17054977096993 617.4
+ vertex 24.952472465515662 157.2535589417747 617.4
+ vertex 25.014385957182462 156.54588449377658 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.17054977096993 617.4
+ vertex 25.014385957182462 156.54588449377658 617.4
+ vertex 24.952472465515662 155.83821004577845 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.17054977096993 617.4
+ vertex 24.952472465515662 155.83821004577845 617.4
+ vertex 24.768613200629805 155.15203792778217 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.17054977096993 617.4
+ vertex 24.768613200629805 155.15203792778217 617.4
+ vertex 24.468394633251194 154.50821713237326 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.17054977096993 617.4
+ vertex 24.468394633251194 154.50821713237326 617.4
+ vertex 24.060938752631678 153.92630982863116 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.17054977096993 617.4
+ vertex 24.060938752631678 153.92630982863116 617.4
+ vertex 23.55862589952126 153.42399697552077 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.17054977096993 617.4
+ vertex 23.55862589952126 153.42399697552077 617.4
+ vertex 23.06122021535224 153.05393896729836 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.17054977096993 617.4
+ vertex 23.06122021535224 153.05393896729836 617.4
+ vertex 22.373300682659444 152.73315682100932 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.17054977096993 617.4
+ vertex 22.373300682659444 152.73315682100932 617.4
+ vertex 22.332897800370226 152.7163225275226 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.17054977096993 617.4
+ vertex 22.332897800370226 152.7163225275226 617.4
+ vertex 21.640128958283878 152.53670404954954 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.17054977096993 617.4
+ vertex 21.640128958283878 152.53670404954954 617.4
+ vertex 20.939051234375828 152.47054977096997 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.17054977096993 617.4
+ vertex 20.939051234375828 152.47054977096997 617.4
+ vertex -30.37020590902545 148.17054977096998 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex 20.939051234375828 152.47054977096997 617.4
+ vertex -20.828912953759342 152.47054977096997 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 22.373300682659444 152.73315682100932 617.4
+ vertex 23.06122021535224 153.05393896729836 617.4
+ vertex 22.976718595779143 153.0165410949012 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 24.768613200629805 157.93973105977096 617.4
+ vertex 15.497857139629502 182.12097856533427 617.4
+ vertex 24.468394633251194 158.5835518551799 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 24.468394633251194 158.5835518551799 617.4
+ vertex 15.497857139629502 182.12097856533427 617.4
+ vertex 11.770977400728352 180.5761236268101 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 11.770977400728352 180.5761236268101 617.4
+ vertex 15.497857139629502 182.12097856533427 617.4
+ vertex -11.660839120111838 180.57612362681013 617.4
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 20.88398209406786 152.47054977096997 617.4
+ vertex -20.828912953759342 152.47054977096997 617.4
+ vertex 20.939051234375828 152.47054977096997 617.4
+ endloop
+endfacet
+facet normal 0.9659258262890669 0.2588190451025263 1.5010751463383332e-16
+ outer loop
+ vertex -24.84233418489917 155.83821004577848 617.4
+ vertex -24.658474920013315 155.1520379277822 597.4
+ vertex -24.84233418489917 155.83821004577848 597.4
+ endloop
+endfacet
+facet normal 0.9659258262890669 0.2588190451025263 1.5010751463383332e-16
+ outer loop
+ vertex -24.658474920013315 155.1520379277822 597.4
+ vertex -24.84233418489917 155.83821004577848 617.4
+ vertex -24.658474920013315 155.1520379277822 617.4
+ endloop
+endfacet
+facet normal 0.9063077870366547 -0.42261826174068906 2.955753951421487e-16
+ outer loop
+ vertex -24.358256352634704 158.58355185517993 617.4
+ vertex -24.658474920013315 157.939731059771 597.4
+ vertex -24.358256352634704 158.5835518551799 597.4
+ endloop
+endfacet
+facet normal 0.9063077870366547 -0.42261826174068906 2.955753951421487e-16
+ outer loop
+ vertex -24.658474920013315 157.939731059771 597.4
+ vertex -24.358256352634704 158.58355185517993 617.4
+ vertex -24.658474920013315 157.93973105977102 617.4
+ endloop
+endfacet
+facet normal -0.996194698091746 0.08715574274765303 -2.3714292307799425e-16
+ outer loop
+ vertex 24.952472465515662 155.83821004577845 617.4
+ vertex 25.014385957182462 156.54588449377658 597.4
+ vertex 24.952472465515662 155.83821004577842 597.4
+ endloop
+endfacet
+facet normal -0.996194698091746 0.08715574274765303 -2.3714292307799425e-16
+ outer loop
+ vertex 25.014385957182462 156.54588449377658 597.4
+ vertex 24.952472465515662 155.83821004577845 617.4
+ vertex 25.014385957182462 156.54588449377658 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.4999999999999988 -7.227945163972768e-17
+ outer loop
+ vertex 24.468394633251194 158.5835518551799 617.4
+ vertex 11.770977400728352 180.5761236268101 597.4
+ vertex 24.468394633251194 158.5835518551799 597.4
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.4999999999999988 -7.227945163972768e-17
+ outer loop
+ vertex 11.770977400728352 180.5761236268101 597.4
+ vertex 24.468394633251194 158.5835518551799 617.4
+ vertex 11.770977400728352 180.5761236268101 617.4
+ endloop
+endfacet
+facet normal -0.8191520442889946 0.5735764363510423 -3.1170170299139527e-16
+ outer loop
+ vertex 24.060938752631678 153.92630982863116 617.4
+ vertex 24.468394633251194 154.50821713237326 597.4
+ vertex 24.060938752631678 153.92630982863116 597.4
+ endloop
+endfacet
+facet normal -0.8191520442889946 0.5735764363510423 -3.1170170299139527e-16
+ outer loop
+ vertex 24.468394633251194 154.50821713237326 597.4
+ vertex 24.060938752631678 153.92630982863116 617.4
+ vertex 24.468394633251194 154.50821713237326 617.4
+ endloop
+endfacet
+facet normal -0.7071067811865392 0.707106781186556 -3.1835711232391977e-16
+ outer loop
+ vertex 23.55862589952126 153.42399697552074 597.4
+ vertex 24.060938752631678 153.92630982863116 617.4
+ vertex 24.060938752631678 153.92630982863116 597.4
+ endloop
+endfacet
+facet normal -0.7071067811865392 0.707106781186556 -3.1835711232391977e-16
+ outer loop
+ vertex 24.060938752631678 153.92630982863116 617.4
+ vertex 23.55862589952126 153.42399697552074 597.4
+ vertex 23.55862589952126 153.42399697552077 617.4
+ endloop
+endfacet
+facet normal 0.9961946980917462 0.08715574274765149 1.9661219995849948e-16
+ outer loop
+ vertex -24.90424767656597 156.5458844937766 617.4
+ vertex -24.84233418489917 155.83821004577848 597.4
+ vertex -24.90424767656597 156.5458844937766 597.4
+ endloop
+endfacet
+facet normal 0.9961946980917462 0.08715574274765149 1.9661219995849948e-16
+ outer loop
+ vertex -24.84233418489917 155.83821004577848 597.4
+ vertex -24.90424767656597 156.5458844937766 617.4
+ vertex -24.84233418489917 155.83821004577848 617.4
+ endloop
+endfacet
+facet normal 0.8660254037844387 -0.5 3.0479839899610556e-16
+ outer loop
+ vertex -11.660839120111838 180.57612362681013 617.4
+ vertex -24.358256352634704 158.5835518551799 597.4
+ vertex -11.660839120111838 180.57612362681013 597.4
+ endloop
+endfacet
+facet normal 0.8660254037844387 -0.5 3.0479839899610556e-16
+ outer loop
+ vertex -24.358256352634704 158.5835518551799 597.4
+ vertex -11.660839120111838 180.57612362681013 617.4
+ vertex -24.358256352634704 158.58355185517993 617.4
+ endloop
+endfacet
+facet normal -0.9063077870366547 0.42261826174068906 -2.955753951421487e-16
+ outer loop
+ vertex 24.468394633251194 154.50821713237326 617.4
+ vertex 24.768613200629805 155.15203792778217 597.4
+ vertex 24.468394633251194 154.50821713237326 597.4
+ endloop
+endfacet
+facet normal -0.9063077870366547 0.42261826174068906 -2.955753951421487e-16
+ outer loop
+ vertex 24.768613200629805 155.15203792778217 597.4
+ vertex 24.468394633251194 154.50821713237326 617.4
+ vertex 24.768613200629805 155.15203792778217 617.4
+ endloop
+endfacet
+facet normal -5.551115123125782e-16 -1.0 2.3251894735637823e-16
+ outer loop
+ vertex -11.660839120111838 180.57612362681013 617.4
+ vertex 11.770977400728352 180.5761236268101 597.4
+ vertex 11.770977400728352 180.5761236268101 617.4
+ endloop
+endfacet
+facet normal -5.551115123125782e-16 -1.0 2.3251894735637823e-16
+ outer loop
+ vertex 11.770977400728352 180.5761236268101 597.4
+ vertex -11.660839120111838 180.57612362681013 617.4
+ vertex -11.660839120111838 180.57612362681013 597.4
+ endloop
+endfacet
+facet normal -0.9961946980917462 -0.08715574274765149 -1.9661219995849948e-16
+ outer loop
+ vertex 25.014385957182462 156.54588449377658 617.4
+ vertex 24.952472465515662 157.2535589417747 597.4
+ vertex 25.014385957182462 156.54588449377658 597.4
+ endloop
+endfacet
+facet normal -0.9961946980917462 -0.08715574274765149 -1.9661219995849948e-16
+ outer loop
+ vertex 24.952472465515662 157.2535589417747 597.4
+ vertex 25.014385957182462 156.54588449377658 617.4
+ vertex 24.952472465515662 157.2535589417747 617.4
+ endloop
+endfacet
+facet normal -0.9555126440105991 -0.29495014347491727 -1.3943933742722958e-16
+ outer loop
+ vertex -43.173106986658425 132.82370174497757 617.4
+ vertex -43.30096751306486 133.23791530735065 597.4
+ vertex -43.173106986658425 132.82370174497754 597.4
+ endloop
+endfacet
+facet normal -0.9555126440105991 -0.29495014347491727 -1.3943933742722958e-16
+ outer loop
+ vertex -43.30096751306486 133.23791530735065 597.4
+ vertex -43.173106986658425 132.82370174497757 617.4
+ vertex -43.30096751306486 133.23791530735065 617.4
+ endloop
+endfacet
+facet normal 0.9555126440105912 -0.29495014347494236 2.7660233119403473e-16
+ outer loop
+ vertex 43.41110579368132 133.2379153073506 617.4
+ vertex 43.28324526727487 132.82370174497748 597.4
+ vertex 43.41110579368132 133.23791530735056 597.4
+ endloop
+endfacet
+facet normal 0.9555126440105912 -0.29495014347494236 2.7660233119403473e-16
+ outer loop
+ vertex 43.28324526727487 132.82370174497748 597.4
+ vertex 43.41110579368132 133.2379153073506 617.4
+ vertex 43.28324526727487 132.82370174497748 617.4
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 2.3251894735637823e-16
+ outer loop
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex 30.48034418964194 148.17054977096993 617.4
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 2.3251894735637823e-16
+ outer loop
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex -30.37020590902545 148.17054977096998 617.4
+ vertex -30.37020590902545 148.17054977096998 597.4
+ endloop
+endfacet
+facet normal -0.4121961787131759 -0.9110951159205364 1.2210929660187255e-16
+ outer loop
+ vertex -42.87831778225449 132.50586449978178 617.4
+ vertex -42.436689296971025 132.30606365477252 597.4
+ vertex -42.436689296971025 132.30606365477252 617.4
+ endloop
+endfacet
+facet normal -0.4121961787131759 -0.9110951159205364 1.2210929660187255e-16
+ outer loop
+ vertex -42.436689296971025 132.30606365477252 597.4
+ vertex -42.87831778225449 132.50586449978178 617.4
+ vertex -42.87831778225449 132.50586449978178 597.4
+ endloop
+endfacet
+facet normal 0.7331906391044669 -0.6800231516129311 3.1773826761945206e-16
+ outer loop
+ vertex 43.28324526727487 132.82370174497748 617.4
+ vertex 42.98845606287095 132.5058644997817 597.4
+ vertex 43.28324526727487 132.82370174497748 597.4
+ endloop
+endfacet
+facet normal 0.7331906391044669 -0.6800231516129311 3.1773826761945206e-16
+ outer loop
+ vertex 42.98845606287095 132.5058644997817 597.4
+ vertex 43.28324526727487 132.82370174497748 617.4
+ vertex 42.98845606287095 132.5058644997817 617.4
+ endloop
+endfacet
+facet normal 0.9951296050076998 0.09857519585179429 1.9372508358990627e-16
+ outer loop
+ vertex 43.3633241585152 133.72027721714554 617.4
+ vertex 43.41110579368132 133.23791530735056 597.4
+ vertex 43.3633241585152 133.72027721714554 597.4
+ endloop
+endfacet
+facet normal 0.9951296050076998 0.09857519585179429 1.9372508358990627e-16
+ outer loop
+ vertex 43.41110579368132 133.23791530735056 597.4
+ vertex 43.3633241585152 133.72027721714554 617.4
+ vertex 43.41110579368132 133.2379153073506 617.4
+ endloop
+endfacet
+facet normal 0.9202212155149998 0.39139866442809496 1.0933007317951932e-16
+ outer loop
+ vertex 43.143156601250205 134.2379153073506 617.4
+ vertex 43.3633241585152 133.72027721714554 597.4
+ vertex 43.143156601250205 134.23791530735056 597.4
+ endloop
+endfacet
+facet normal 0.9202212155149998 0.39139866442809496 1.0933007317951932e-16
+ outer loop
+ vertex 43.3633241585152 133.72027721714554 597.4
+ vertex 43.143156601250205 134.2379153073506 617.4
+ vertex 43.3633241585152 133.72027721714554 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 -7.227945163972772e-17
+ outer loop
+ vertex 39.679054986112455 132.2379153073506 617.4
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex 39.679054986112455 132.2379153073506 597.4
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 -7.227945163972772e-17
+ outer loop
+ vertex 30.48034418964194 148.17054977096993 597.4
+ vertex 39.679054986112455 132.2379153073506 617.4
+ vertex 30.48034418964194 148.17054977096993 617.4
+ endloop
+endfacet
+facet normal -0.7331906391044548 -0.6800231516129441 -1.5017328374351536e-18
+ outer loop
+ vertex -42.87831778225449 132.50586449978178 617.4
+ vertex -43.173106986658425 132.82370174497754 597.4
+ vertex -42.87831778225449 132.50586449978178 597.4
+ endloop
+endfacet
+facet normal -0.7331906391044548 -0.6800231516129441 -1.5017328374351536e-18
+ outer loop
+ vertex -43.173106986658425 132.82370174497754 597.4
+ vertex -42.87831778225449 132.50586449978178 617.4
+ vertex -43.173106986658425 132.82370174497757 617.4
+ endloop
+endfacet
+facet normal 0.12114942135545746 -0.9926342819514334 2.571812341015746e-16
+ outer loop
+ vertex 41.98845606287095 132.2379153073506 617.4
+ vertex 42.546827577587486 132.30606365477246 597.4
+ vertex 42.546827577587486 132.30606365477246 617.4
+ endloop
+endfacet
+facet normal 0.12114942135545746 -0.9926342819514334 2.571812341015746e-16
+ outer loop
+ vertex 42.546827577587486 132.30606365477246 597.4
+ vertex 41.98845606287095 132.2379153073506 617.4
+ vertex 41.98845606287095 132.2379153073506 597.4
+ endloop
+endfacet
+facet normal -0.1211494213554586 -0.9926342819514334 2.044313225968287e-16
+ outer loop
+ vertex -42.436689296971025 132.30606365477252 617.4
+ vertex -41.8783177822545 132.23791530735065 597.4
+ vertex -41.8783177822545 132.23791530735065 617.4
+ endloop
+endfacet
+facet normal -0.1211494213554586 -0.9926342819514334 2.044313225968287e-16
+ outer loop
+ vertex -41.8783177822545 132.23791530735065 597.4
+ vertex -42.436689296971025 132.30606365477252 617.4
+ vertex -42.436689296971025 132.30606365477252 597.4
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.047528410033 -70.98664256999788 599.2000000000002
+ vertex -177.3939385715468 -70.78664256999794 597.8000000000001
+ vertex -177.047528410033 -70.98664256999795 597.8000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.3939385715468 -70.78664256999794 597.8000000000001
+ vertex -177.047528410033 -70.98664256999788 599.2000000000002
+ vertex -180.49940999781742 -68.99369780607998 598.0545186779377
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.3939385715468 -70.78664256999794 597.8000000000001
+ vertex -180.49940999781742 -68.99369780607998 598.0545186779377
+ vertex -180.85804018668463 -68.786642569998 598.0000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.3939385715468 -70.78664256999794 597.8000000000001
+ vertex -180.85804018668463 -68.786642569998 598.0000000000001
+ vertex -182.64727067122598 -67.75362986810585 597.9000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -180.49940999781742 -68.99369780607998 598.0545186779377
+ vertex -177.047528410033 -70.98664256999788 599.2000000000002
+ vertex -180.1652198636571 -69.186642569998 598.214359353945
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -180.1652198636571 -69.186642569998 598.214359353945
+ vertex -177.047528410033 -70.98664256999788 599.2000000000002
+ vertex -179.87824428957134 -69.35232799494719 598.4686291501016
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.87824428957134 -69.35232799494719 598.4686291501016
+ vertex -177.047528410033 -70.98664256999788 599.2000000000002
+ vertex -179.65804018668462 -69.4794628930255 598.8000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.65804018668462 -69.4794628930255 598.8000000000002
+ vertex -177.047528410033 -70.98664256999788 599.2000000000002
+ vertex -179.5196141007041 -69.5593832310292 599.1858895278361
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.5196141007041 -69.5593832310292 599.1858895278361
+ vertex -177.047528410033 -70.98664256999788 599.2000000000002
+ vertex -178.9527842983588 -69.88664256999793 599.2000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.5196141007041 -69.5593832310292 599.1858895278361
+ vertex -178.9527842983588 -69.88664256999793 599.2000000000002
+ vertex -179.47239954062948 -69.58664256999793 599.6000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.47239954062948 -69.58664256999793 599.6000000000001
+ vertex -178.9527842983588 -69.88664256999793 599.2000000000002
+ vertex -178.95278429835878 -69.88664256999783 601.2343145750508
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.47239954062948 -69.58664256999793 599.6000000000001
+ vertex -178.95278429835878 -69.88664256999783 601.2343145750508
+ vertex -179.51961410070408 -69.55938323102919 600.0141104721642
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.51961410070408 -69.55938323102919 600.0141104721642
+ vertex -178.95278429835878 -69.88664256999783 601.2343145750508
+ vertex -179.65804018668462 -69.47946289302546 600.4000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.65804018668462 -69.47946289302546 600.4000000000002
+ vertex -178.95278429835878 -69.88664256999783 601.2343145750508
+ vertex -179.87824428957128 -69.35232799494715 600.7313708498986
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.87824428957128 -69.35232799494715 600.7313708498986
+ vertex -178.95278429835878 -69.88664256999783 601.2343145750508
+ vertex -180.165219863657 -69.18664256999789 600.9856406460553
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -180.165219863657 -69.18664256999789 600.9856406460553
+ vertex -178.95278429835878 -69.88664256999783 601.2343145750508
+ vertex -180.49940999781734 -68.99369780607992 601.1454813220627
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -180.49940999781734 -68.99369780607992 601.1454813220627
+ vertex -178.95278429835878 -69.88664256999783 601.2343145750508
+ vertex -180.85804018668452 -68.7866425699979 601.2000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.08466953506382 -77.31605209254886 597.434074173711
+ vertex -170.812145502785 -74.58664256999778 597.4000000000001
+ vertex -166.30881340310586 -77.1866425699976 597.4000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -170.812145502785 -74.58664256999778 597.4000000000001
+ vertex -166.08466953506382 -77.31605209254886 597.434074173711
+ vertex -170.81214550278494 -74.58664256999774 597.8000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -170.81214550278494 -74.58664256999774 597.8000000000001
+ vertex -166.08466953506382 -77.31605209254886 597.434074173711
+ vertex -165.87580070121362 -77.4366425699976 597.5339745962157
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -170.81214550278494 -74.58664256999774 597.8000000000001
+ vertex -165.87580070121362 -77.4366425699976 597.5339745962157
+ vertex -165.69644096740998 -77.54019596059086 597.6928932188135
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -170.81214550278494 -74.58664256999774 597.8000000000001
+ vertex -165.69644096740998 -77.54019596059086 597.6928932188135
+ vertex -165.5588134031058 -77.61965527188984 597.9000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -170.81214550278494 -74.58664256999774 597.8000000000001
+ vertex -165.5588134031058 -77.61965527188984 597.9000000000001
+ vertex -171.15855566429875 -74.38664256999776 597.8000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.15855566429875 -74.38664256999776 597.8000000000001
+ vertex -165.5588134031058 -77.61965527188984 597.9000000000001
+ vertex -167.34804388764715 -76.58664256999762 598.0000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.15855566429875 -74.38664256999776 597.8000000000001
+ vertex -167.34804388764715 -76.58664256999762 598.0000000000001
+ vertex -167.7066740765144 -76.3795873339156 598.0545186779376
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.15855566429875 -74.38664256999776 597.8000000000001
+ vertex -167.7066740765144 -76.3795873339156 598.0545186779376
+ vertex -171.15855566429872 -74.38664256999773 599.2000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.15855566429872 -74.38664256999773 599.2000000000002
+ vertex -167.7066740765144 -76.3795873339156 598.0545186779376
+ vertex -168.04086421067473 -76.18664256999767 598.214359353945
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.15855566429872 -74.38664256999773 599.2000000000002
+ vertex -168.04086421067473 -76.18664256999767 598.214359353945
+ vertex -168.32783978476044 -76.0209571450484 598.4686291501016
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.15855566429872 -74.38664256999773 599.2000000000002
+ vertex -168.32783978476044 -76.0209571450484 598.4686291501016
+ vertex -168.54804388764717 -75.89382224697007 598.8000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.15855566429872 -74.38664256999773 599.2000000000002
+ vertex -168.54804388764717 -75.89382224697007 598.8000000000002
+ vertex -168.68646997362765 -75.81390190896637 599.1858895278361
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.15855566429872 -74.38664256999773 599.2000000000002
+ vertex -168.68646997362765 -75.81390190896637 599.1858895278361
+ vertex -169.25329977597292 -75.48664256999764 599.2000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.25329977597292 -75.48664256999764 599.2000000000002
+ vertex -168.68646997362765 -75.81390190896637 599.1858895278361
+ vertex -168.73368453370225 -75.78664256999762 599.6000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.25329977597292 -75.48664256999764 599.2000000000002
+ vertex -168.73368453370225 -75.78664256999762 599.6000000000001
+ vertex -169.2532997759729 -75.48664256999757 601.2343145750509
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.2532997759729 -75.48664256999757 601.2343145750509
+ vertex -168.73368453370225 -75.78664256999762 599.6000000000001
+ vertex -168.68646997362762 -75.81390190896636 600.0141104721642
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.2532997759729 -75.48664256999757 601.2343145750509
+ vertex -168.68646997362762 -75.81390190896636 600.0141104721642
+ vertex -168.54804388764714 -75.89382224697005 600.4000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.2532997759729 -75.48664256999757 601.2343145750509
+ vertex -168.54804388764714 -75.89382224697005 600.4000000000002
+ vertex -168.32783978476039 -76.02095714504833 600.7313708498987
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.2532997759729 -75.48664256999757 601.2343145750509
+ vertex -168.32783978476039 -76.02095714504833 600.7313708498987
+ vertex -168.04086421067464 -76.18664256999756 600.9856406460553
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.2532997759729 -75.48664256999757 601.2343145750509
+ vertex -168.04086421067464 -76.18664256999756 600.9856406460553
+ vertex -167.7066740765143 -76.37958733391552 601.1454813220627
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.2532997759729 -75.48664256999757 601.2343145750509
+ vertex -167.7066740765143 -76.37958733391552 601.1454813220627
+ vertex -167.34804388764707 -76.58664256999752 601.2000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -165.44278799932107 -77.68664256999702 616.4000000000001
+ vertex -165.7891981608349 -77.4866425699972 611.2000000000002
+ vertex -165.44278799932115 -77.68664256999716 611.2000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -165.7891981608349 -77.4866425699972 611.2000000000002
+ vertex -165.44278799932107 -77.68664256999702 616.4000000000001
+ vertex -166.00961780166637 -77.35938323102832 614.785889527836
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -165.7891981608349 -77.4866425699972 611.2000000000002
+ vertex -166.00961780166637 -77.35938323102832 614.785889527836
+ vertex -166.14804388764685 -77.27946289302463 614.4000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -165.7891981608349 -77.4866425699972 611.2000000000002
+ vertex -166.14804388764685 -77.27946289302463 614.4000000000001
+ vertex -167.00163372613315 -76.78664256999713 613.0000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -167.00163372613315 -76.78664256999713 613.0000000000001
+ vertex -166.14804388764685 -77.27946289302463 614.4000000000001
+ vertex -166.3682479905336 -77.1523279949463 614.0686291501016
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -167.00163372613315 -76.78664256999713 613.0000000000001
+ vertex -166.3682479905336 -77.1523279949463 614.0686291501016
+ vertex -166.65522356461935 -76.98664256999712 613.814359353945
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -167.00163372613315 -76.78664256999713 613.0000000000001
+ vertex -166.65522356461935 -76.98664256999712 613.814359353945
+ vertex -166.98941369877966 -76.79369780607912 613.6545186779376
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -167.00163372613315 -76.78664256999713 613.0000000000001
+ vertex -166.98941369877966 -76.79369780607912 613.6545186779376
+ vertex -168.76340182741606 -75.76948528247182 613.0000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -168.76340182741606 -75.76948528247182 613.0000000000001
+ vertex -166.98941369877966 -76.79369780607912 613.6545186779376
+ vertex -167.3480438876469 -76.58664256999711 613.6000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -168.76340182741606 -75.76948528247182 613.0000000000001
+ vertex -167.3480438876469 -76.58664256999711 613.6000000000001
+ vertex -169.2532997759727 -75.4866425699972 613.5656854249494
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.00961780166637 -77.35938323102832 614.785889527836
+ vertex -165.44278799932107 -77.68664256999702 616.4000000000001
+ vertex -165.96240324159172 -77.38664256999704 615.2000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -165.96240324159172 -77.38664256999704 615.2000000000002
+ vertex -165.44278799932107 -77.68664256999702 616.4000000000001
+ vertex -166.00961780166634 -77.3593832310283 615.6141104721642
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.00961780166634 -77.3593832310283 615.6141104721642
+ vertex -165.44278799932107 -77.68664256999702 616.4000000000001
+ vertex -166.14804388764685 -77.27946289302459 616.0000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.14804388764685 -77.27946289302459 616.0000000000001
+ vertex -165.44278799932107 -77.68664256999702 616.4000000000001
+ vertex -166.36824799053355 -77.15232799494626 616.3313708498986
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.36824799053355 -77.15232799494626 616.3313708498986
+ vertex -165.44278799932107 -77.68664256999702 616.4000000000001
+ vertex -166.65522356461926 -76.98664256999704 616.5856406460553
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.65522356461926 -76.98664256999704 616.5856406460553
+ vertex -165.44278799932107 -77.68664256999702 616.4000000000001
+ vertex -165.47229709936767 -77.6696054831415 616.6588190451026
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.65522356461926 -76.98664256999704 616.5856406460553
+ vertex -165.47229709936767 -77.6696054831415 616.6588190451026
+ vertex -166.98941369877957 -76.79369780607902 616.7454813220626
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.98941369877957 -76.79369780607902 616.7454813220626
+ vertex -165.47229709936767 -77.6696054831415 616.6588190451026
+ vertex -165.5588134031055 -77.6196552718892 616.9000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.98941369877957 -76.79369780607902 616.7454813220626
+ vertex -165.5588134031055 -77.6196552718892 616.9000000000001
+ vertex -167.3480438876468 -76.58664256999705 616.8000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.2532997759727 -75.4866425699972 613.5656854249494
+ vertex -168.5480438876469 -75.89382224696958 614.4000000000001
+ vertex -169.25329977597266 -75.48664256999713 615.6000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -168.5480438876469 -75.89382224696958 614.4000000000001
+ vertex -169.2532997759727 -75.4866425699972 613.5656854249494
+ vertex -168.3278397847602 -76.0209571450479 614.0686291501017
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -168.3278397847602 -76.0209571450479 614.0686291501017
+ vertex -169.2532997759727 -75.4866425699972 613.5656854249494
+ vertex -168.0408642106745 -76.18664256999716 613.814359353945
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -168.0408642106745 -76.18664256999716 613.814359353945
+ vertex -169.2532997759727 -75.4866425699972 613.5656854249494
+ vertex -167.7066740765141 -76.3795873339151 613.6545186779376
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -167.7066740765141 -76.3795873339151 613.6545186779376
+ vertex -169.2532997759727 -75.4866425699972 613.5656854249494
+ vertex -167.3480438876469 -76.58664256999711 613.6000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.25329977597266 -75.48664256999713 615.6000000000001
+ vertex -168.5480438876469 -75.89382224696958 614.4000000000001
+ vertex -168.6864699736274 -75.81390190896589 614.785889527836
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.25329977597266 -75.48664256999713 615.6000000000001
+ vertex -168.6864699736274 -75.81390190896589 614.785889527836
+ vertex -168.73368453370196 -75.78664256999716 615.2000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.25329977597266 -75.48664256999713 615.6000000000001
+ vertex -168.73368453370196 -75.78664256999716 615.2000000000002
+ vertex -168.68646997362737 -75.81390190896586 615.6141104721642
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.25329977597266 -75.48664256999713 615.6000000000001
+ vertex -168.68646997362737 -75.81390190896586 615.6141104721642
+ vertex -171.15855566429843 -74.38664256999722 615.6000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.15855566429843 -74.38664256999722 615.6000000000001
+ vertex -168.68646997362737 -75.81390190896586 615.6141104721642
+ vertex -171.1585556642984 -74.38664256999712 617.0000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.1585556642984 -74.38664256999712 617.0000000000002
+ vertex -168.68646997362737 -75.81390190896586 615.6141104721642
+ vertex -168.54804388764688 -75.89382224696955 616.0000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.1585556642984 -74.38664256999712 617.0000000000002
+ vertex -168.54804388764688 -75.89382224696955 616.0000000000001
+ vertex -168.32783978476013 -76.02095714504783 616.3313708498987
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.1585556642984 -74.38664256999712 617.0000000000002
+ vertex -168.32783978476013 -76.02095714504783 616.3313708498987
+ vertex -168.0408642106744 -76.18664256999706 616.5856406460553
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.1585556642984 -74.38664256999712 617.0000000000002
+ vertex -168.0408642106744 -76.18664256999706 616.5856406460553
+ vertex -167.70667407651402 -76.37958733391504 616.7454813220626
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.1585556642984 -74.38664256999712 617.0000000000002
+ vertex -167.70667407651402 -76.37958733391504 616.7454813220626
+ vertex -167.3480438876468 -76.58664256999705 616.8000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.1585556642984 -74.38664256999712 617.0000000000002
+ vertex -167.3480438876468 -76.58664256999705 616.8000000000002
+ vertex -165.5588134031055 -77.6196552718892 616.9000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.1585556642984 -74.38664256999712 617.0000000000002
+ vertex -165.5588134031055 -77.6196552718892 616.9000000000001
+ vertex -170.81214550278463 -74.58664256999712 617.0000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -170.81214550278463 -74.58664256999712 617.0000000000002
+ vertex -165.5588134031055 -77.6196552718892 616.9000000000001
+ vertex -165.69644096740967 -77.54019596059021 617.1071067811868
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -170.81214550278463 -74.58664256999712 617.0000000000002
+ vertex -165.69644096740967 -77.54019596059021 617.1071067811868
+ vertex -170.81214550278463 -74.58664256999712 617.4000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -170.81214550278463 -74.58664256999712 617.4000000000002
+ vertex -165.69644096740967 -77.54019596059021 617.1071067811868
+ vertex -165.87580070121325 -77.43664256999696 617.2660254037846
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -170.81214550278463 -74.58664256999712 617.4000000000002
+ vertex -165.87580070121325 -77.43664256999696 617.2660254037846
+ vertex -166.08466953506345 -77.31605209254823 617.3659258262892
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -170.81214550278463 -74.58664256999712 617.4000000000002
+ vertex -166.08466953506345 -77.31605209254823 617.3659258262892
+ vertex -166.30881340310546 -77.18664256999696 617.4000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -178.95278429835878 -69.88664256999783 601.2343145750508
+ vertex -179.4426822469154 -69.60379985752323 601.8000000000001
+ vertex -181.20445034819835 -68.58664256999789 601.8000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.4426822469154 -69.60379985752323 601.8000000000001
+ vertex -178.95278429835878 -69.88664256999783 601.2343145750508
+ vertex -176.81743808261163 -71.11948528247233 603.7000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.4426822469154 -69.60379985752323 601.8000000000001
+ vertex -176.81743808261163 -71.11948528247233 603.7000000000002
+ vertex -177.30733603116826 -70.83664256999775 604.2656854249494
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116826 -70.83664256999775 604.2656854249494
+ vertex -176.81743808261163 -71.11948528247233 603.7000000000002
+ vertex -171.38864599171998 -74.25379985752292 603.7000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116826 -70.83664256999775 604.2656854249494
+ vertex -171.38864599171998 -74.25379985752292 603.7000000000002
+ vertex -170.8987480431633 -74.53664256999755 604.2656854249494
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116826 -70.83664256999775 604.2656854249494
+ vertex -170.8987480431633 -74.53664256999755 604.2656854249494
+ vertex -174.10304203716578 -72.68664256999762 604.7000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -174.10304203716578 -72.68664256999762 604.7000000000002
+ vertex -170.8987480431633 -74.53664256999755 604.2656854249494
+ vertex -173.4978535934523 -73.03604828088599 604.7920002690196
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -173.4978535934523 -73.03604828088599 604.7920002690196
+ vertex -170.8987480431633 -74.53664256999755 604.2656854249494
+ vertex -172.93390774205676 -73.36164256999754 605.0617314097822
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -172.93390774205676 -73.36164256999754 605.0617314097822
+ vertex -170.8987480431633 -74.53664256999755 604.2656854249494
+ vertex -172.44963646078708 -73.64123672459937 605.4908116907965
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -172.44963646078708 -73.64123672459937 605.4908116907965
+ vertex -170.8987480431633 -74.53664256999755 604.2656854249494
+ vertex -172.07804203716574 -73.85577686510652 606.0500000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -172.07804203716574 -73.85577686510652 606.0500000000002
+ vertex -170.8987480431633 -74.53664256999755 604.2656854249494
+ vertex -171.84444801707363 -73.9906424354877 606.7011885782233
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.84444801707363 -73.9906424354877 606.7011885782233
+ vertex -170.8987480431633 -74.53664256999755 604.2656854249494
+ vertex -170.89874804316318 -74.53664256999733 610.5343145750509
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.84444801707363 -73.9906424354877 606.7011885782233
+ vertex -170.89874804316318 -74.53664256999733 610.5343145750509
+ vertex -171.76477344694774 -74.03664256999745 607.4000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.76477344694774 -74.03664256999745 607.4000000000001
+ vertex -170.89874804316318 -74.53664256999733 610.5343145750509
+ vertex -171.8444480170736 -73.99064243548767 608.098811421777
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.8444480170736 -73.99064243548767 608.098811421777
+ vertex -170.89874804316318 -74.53664256999733 610.5343145750509
+ vertex -172.0780420371657 -73.8557768651064 608.7500000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -172.0780420371657 -73.8557768651064 608.7500000000001
+ vertex -170.89874804316318 -74.53664256999733 610.5343145750509
+ vertex -172.44963646078705 -73.64123672459925 609.3091883092038
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -172.44963646078705 -73.64123672459925 609.3091883092038
+ vertex -170.89874804316318 -74.53664256999733 610.5343145750509
+ vertex -172.93390774205668 -73.36164256999741 609.7382685902181
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -172.93390774205668 -73.36164256999741 609.7382685902181
+ vertex -170.89874804316318 -74.53664256999733 610.5343145750509
+ vertex -173.49785359345225 -73.03604828088585 610.0079997309806
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -173.49785359345225 -73.03604828088585 610.0079997309806
+ vertex -170.89874804316318 -74.53664256999733 610.5343145750509
+ vertex -174.1030420371657 -72.68664256999745 610.1000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.3939385715468 -70.78664256999794 597.8000000000001
+ vertex -181.89727067122598 -68.18664256999807 597.4000000000001
+ vertex -177.3939385715468 -70.78664256999797 597.4000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -181.89727067122598 -68.18664256999807 597.4000000000001
+ vertex -177.3939385715468 -70.78664256999794 597.8000000000001
+ vertex -182.121414539268 -68.05723304744681 597.434074173711
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.121414539268 -68.05723304744681 597.434074173711
+ vertex -177.3939385715468 -70.78664256999794 597.8000000000001
+ vertex -182.33028337311822 -67.9366425699981 597.5339745962157
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.33028337311822 -67.9366425699981 597.5339745962157
+ vertex -177.3939385715468 -70.78664256999794 597.8000000000001
+ vertex -182.50964310692174 -67.83308917940481 597.6928932188135
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.50964310692174 -67.83308917940481 597.6928932188135
+ vertex -177.3939385715468 -70.78664256999794 597.8000000000001
+ vertex -182.64727067122598 -67.75362986810585 597.9000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -165.47229709936798 -77.6696054831421 598.1411809548977
+ vertex -167.34804388764715 -76.58664256999762 598.0000000000001
+ vertex -165.5588134031058 -77.61965527188984 597.9000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -167.34804388764715 -76.58664256999762 598.0000000000001
+ vertex -165.47229709936798 -77.6696054831421 598.1411809548977
+ vertex -166.9894136987799 -76.79369780607962 598.0545186779376
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.9894136987799 -76.79369780607962 598.0545186779376
+ vertex -165.47229709936798 -77.6696054831421 598.1411809548977
+ vertex -166.65522356461958 -76.98664256999763 598.214359353945
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.65522356461958 -76.98664256999763 598.214359353945
+ vertex -165.47229709936798 -77.6696054831421 598.1411809548977
+ vertex -165.44278799932138 -77.68664256999759 598.4000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.65522356461958 -76.98664256999763 598.214359353945
+ vertex -165.44278799932138 -77.68664256999759 598.4000000000002
+ vertex -166.36824799053383 -77.1523279949468 598.4686291501016
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.36824799053383 -77.1523279949468 598.4686291501016
+ vertex -165.44278799932138 -77.68664256999759 598.4000000000002
+ vertex -166.1480438876471 -77.27946289302511 598.8000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.1480438876471 -77.27946289302511 598.8000000000001
+ vertex -165.44278799932138 -77.68664256999759 598.4000000000002
+ vertex -166.00961780166662 -77.35938323102883 599.1858895278361
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.00961780166662 -77.35938323102883 599.1858895278361
+ vertex -165.44278799932138 -77.68664256999759 598.4000000000002
+ vertex -165.44278799932127 -77.68664256999742 603.6000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.00961780166662 -77.35938323102883 599.1858895278361
+ vertex -165.44278799932127 -77.68664256999742 603.6000000000001
+ vertex -165.96240324159197 -77.38664256999755 599.6
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -165.96240324159197 -77.38664256999755 599.6
+ vertex -165.44278799932127 -77.68664256999742 603.6000000000001
+ vertex -166.0096178016666 -77.35938323102881 600.0141104721641
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.0096178016666 -77.35938323102881 600.0141104721641
+ vertex -165.44278799932127 -77.68664256999742 603.6000000000001
+ vertex -166.14804388764708 -77.27946289302508 600.4000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.14804388764708 -77.27946289302508 600.4000000000002
+ vertex -165.44278799932127 -77.68664256999742 603.6000000000001
+ vertex -166.36824799053383 -77.15232799494673 600.7313708498986
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.36824799053383 -77.15232799494673 600.7313708498986
+ vertex -165.44278799932127 -77.68664256999742 603.6000000000001
+ vertex -166.65522356461955 -76.98664256999751 600.9856406460552
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.65522356461955 -76.98664256999751 600.9856406460552
+ vertex -165.44278799932127 -77.68664256999742 603.6000000000001
+ vertex -166.98941369877988 -76.79369780607954 601.1454813220627
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -166.98941369877988 -76.79369780607954 601.1454813220627
+ vertex -165.44278799932127 -77.68664256999742 603.6000000000001
+ vertex -167.34804388764707 -76.58664256999752 601.2000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -167.34804388764707 -76.58664256999752 601.2000000000002
+ vertex -165.44278799932127 -77.68664256999742 603.6000000000001
+ vertex -167.0016337261333 -76.78664256999751 601.8000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -167.34804388764707 -76.58664256999752 601.2000000000002
+ vertex -167.0016337261333 -76.78664256999751 601.8000000000001
+ vertex -169.2532997759729 -75.48664256999757 601.2343145750509
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -167.0016337261333 -76.78664256999751 601.8000000000001
+ vertex -165.44278799932127 -77.68664256999742 603.6000000000001
+ vertex -165.78919816083507 -77.4866425699974 603.6000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -167.0016337261333 -76.78664256999751 601.8000000000001
+ vertex -165.78919816083507 -77.4866425699974 603.6000000000001
+ vertex -167.0016337261333 -76.78664256999741 604.0000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -167.0016337261333 -76.78664256999741 604.0000000000001
+ vertex -165.78919816083507 -77.4866425699974 603.6000000000001
+ vertex -165.78919816083504 -77.4866425699974 604.0000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116826 -70.83664256999775 604.2656854249494
+ vertex -176.36163605725787 -71.38264270450735 606.7011885782233
+ vertex -177.30733603116815 -70.83664256999754 610.5343145750509
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -176.36163605725787 -71.38264270450735 606.7011885782233
+ vertex -177.30733603116826 -70.83664256999775 604.2656854249494
+ vertex -176.1280420371658 -71.51750827488864 606.0500000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -176.1280420371658 -71.51750827488864 606.0500000000002
+ vertex -177.30733603116826 -70.83664256999775 604.2656854249494
+ vertex -175.75644761354442 -71.73204841539578 605.4908116907965
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -175.75644761354442 -71.73204841539578 605.4908116907965
+ vertex -177.30733603116826 -70.83664256999775 604.2656854249494
+ vertex -175.2721763322748 -72.01164256999762 605.0617314097822
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -175.2721763322748 -72.01164256999762 605.0617314097822
+ vertex -177.30733603116826 -70.83664256999775 604.2656854249494
+ vertex -174.70823048087922 -72.33723685910924 604.7920002690196
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -174.70823048087922 -72.33723685910924 604.7920002690196
+ vertex -177.30733603116826 -70.83664256999775 604.2656854249494
+ vertex -174.10304203716578 -72.68664256999762 604.7000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116815 -70.83664256999754 610.5343145750509
+ vertex -176.36163605725787 -71.38264270450735 606.7011885782233
+ vertex -176.44131062738379 -71.3366425699976 607.4000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116815 -70.83664256999754 610.5343145750509
+ vertex -176.44131062738379 -71.3366425699976 607.4000000000001
+ vertex -176.3616360572578 -71.38264270450729 608.098811421777
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116815 -70.83664256999754 610.5343145750509
+ vertex -176.3616360572578 -71.38264270450729 608.098811421777
+ vertex -176.12804203716573 -71.51750827488856 608.7500000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116815 -70.83664256999754 610.5343145750509
+ vertex -176.12804203716573 -71.51750827488856 608.7500000000001
+ vertex -175.75644761354437 -71.73204841539567 609.3091883092038
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116815 -70.83664256999754 610.5343145750509
+ vertex -175.75644761354437 -71.73204841539567 609.3091883092038
+ vertex -175.27217633227468 -72.01164256999746 609.7382685902181
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116815 -70.83664256999754 610.5343145750509
+ vertex -175.27217633227468 -72.01164256999746 609.7382685902181
+ vertex -174.70823048087914 -72.33723685910905 610.0079997309806
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116815 -70.83664256999754 610.5343145750509
+ vertex -174.70823048087914 -72.33723685910905 610.0079997309806
+ vertex -174.1030420371657 -72.68664256999745 610.1000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116815 -70.83664256999754 610.5343145750509
+ vertex -174.1030420371657 -72.68664256999745 610.1000000000001
+ vertex -170.89874804316318 -74.53664256999733 610.5343145750509
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116815 -70.83664256999754 610.5343145750509
+ vertex -170.89874804316318 -74.53664256999733 610.5343145750509
+ vertex -171.3886459917198 -74.25379985752271 611.1000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.3886459917198 -74.25379985752271 611.1000000000001
+ vertex -170.89874804316318 -74.53664256999733 610.5343145750509
+ vertex -168.76340182741606 -75.76948528247182 613.0000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.3886459917198 -74.25379985752271 611.1000000000001
+ vertex -168.76340182741606 -75.76948528247182 613.0000000000001
+ vertex -169.2532997759727 -75.4866425699972 613.5656854249494
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -165.7891981608349 -77.48664256999719 610.8000000000002
+ vertex -167.00163372613315 -76.78664256999713 613.0000000000001
+ vertex -167.00163372613315 -76.78664256999721 610.8000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -167.00163372613315 -76.78664256999713 613.0000000000001
+ vertex -165.7891981608349 -77.48664256999719 610.8000000000002
+ vertex -165.7891981608349 -77.4866425699972 611.2000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.30733603116815 -70.83664256999754 610.5343145750509
+ vertex -176.81743808261143 -71.11948528247211 611.1000000000001
+ vertex -179.44268224691524 -69.60379985752284 613.0000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -176.81743808261143 -71.11948528247211 611.1000000000001
+ vertex -177.30733603116815 -70.83664256999754 610.5343145750509
+ vertex -171.3886459917198 -74.25379985752271 611.1000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.44268224691524 -69.60379985752284 613.0000000000002
+ vertex -176.81743808261143 -71.11948528247211 611.1000000000001
+ vertex -178.95278429835852 -69.88664256999746 613.5656854249494
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.44268224691524 -69.60379985752284 613.0000000000002
+ vertex -178.95278429835852 -69.88664256999746 613.5656854249494
+ vertex -181.20445034819815 -68.58664256999758 613.0000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -177.04752841003275 -70.98664256999729 617.0000000000002
+ vertex -178.95278429835852 -69.88664256999742 615.6000000000001
+ vertex -177.04752841003275 -70.98664256999737 615.6000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -178.95278429835852 -69.88664256999742 615.6000000000001
+ vertex -177.04752841003275 -70.98664256999729 617.0000000000002
+ vertex -179.51961410070382 -69.55938323102869 615.6141104721642
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.51961410070382 -69.55938323102869 615.6141104721642
+ vertex -177.04752841003275 -70.98664256999729 617.0000000000002
+ vertex -179.65804018668427 -69.47946289302497 616.0000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.65804018668427 -69.47946289302497 616.0000000000001
+ vertex -177.04752841003275 -70.98664256999729 617.0000000000002
+ vertex -179.878244289571 -69.35232799494665 616.3313708498987
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.878244289571 -69.35232799494665 616.3313708498987
+ vertex -177.04752841003275 -70.98664256999729 617.0000000000002
+ vertex -180.16521986365672 -69.18664256999742 616.5856406460553
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -180.16521986365672 -69.18664256999742 616.5856406460553
+ vertex -177.04752841003275 -70.98664256999729 617.0000000000002
+ vertex -180.49940999781703 -68.99369780607941 616.7454813220626
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -180.49940999781703 -68.99369780607941 616.7454813220626
+ vertex -177.04752841003275 -70.98664256999729 617.0000000000002
+ vertex -180.85804018668432 -68.78664256999744 616.8000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -180.85804018668432 -68.78664256999744 616.8000000000002
+ vertex -177.04752841003275 -70.98664256999729 617.0000000000002
+ vertex -182.64727067122567 -67.75362986810526 616.9000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.64727067122567 -67.75362986810526 616.9000000000001
+ vertex -177.04752841003275 -70.98664256999729 617.0000000000002
+ vertex -177.3939385715465 -70.78664256999731 617.0000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.64727067122567 -67.75362986810526 616.9000000000001
+ vertex -177.3939385715465 -70.78664256999731 617.0000000000002
+ vertex -182.50964310692143 -67.83308917940421 617.1071067811868
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.50964310692143 -67.83308917940421 617.1071067811868
+ vertex -177.3939385715465 -70.78664256999731 617.0000000000002
+ vertex -177.3939385715465 -70.78664256999726 617.4000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.50964310692143 -67.83308917940421 617.1071067811868
+ vertex -177.3939385715465 -70.78664256999726 617.4000000000002
+ vertex -182.33028337311788 -67.93664256999747 617.2660254037846
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.33028337311788 -67.93664256999747 617.2660254037846
+ vertex -177.3939385715465 -70.78664256999726 617.4000000000002
+ vertex -182.12141453926765 -68.05723304744619 617.3659258262892
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.12141453926765 -68.05723304744619 617.3659258262892
+ vertex -177.3939385715465 -70.78664256999726 617.4000000000002
+ vertex -181.89727067122564 -68.18664256999743 617.4000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -181.2044503481982 -68.58664256999764 610.8000000000002
+ vertex -182.41688591349643 -67.88664256999765 611.2000000000002
+ vertex -182.41688591349643 -67.88664256999766 610.8000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.41688591349643 -67.88664256999765 611.2000000000002
+ vertex -181.2044503481982 -68.58664256999764 610.8000000000002
+ vertex -181.20445034819815 -68.58664256999758 613.0000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.41688591349643 -67.88664256999765 611.2000000000002
+ vertex -181.20445034819815 -68.58664256999758 613.0000000000002
+ vertex -182.76329607501023 -67.68664256999767 611.2000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501023 -67.68664256999767 611.2000000000002
+ vertex -181.20445034819815 -68.58664256999758 613.0000000000002
+ vertex -182.0580401866844 -68.09382224696996 614.4000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501023 -67.68664256999767 611.2000000000002
+ vertex -182.0580401866844 -68.09382224696996 614.4000000000001
+ vertex -182.19646627266488 -68.01390190896626 614.7858895278362
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501023 -67.68664256999767 611.2000000000002
+ vertex -182.19646627266488 -68.01390190896626 614.7858895278362
+ vertex -182.76329607501015 -67.68664256999749 616.4000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.0580401866844 -68.09382224696996 614.4000000000001
+ vertex -181.20445034819815 -68.58664256999758 613.0000000000002
+ vertex -181.83783608379764 -68.22095714504829 614.0686291501017
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -181.83783608379764 -68.22095714504829 614.0686291501017
+ vertex -181.20445034819815 -68.58664256999758 613.0000000000002
+ vertex -181.55086050971195 -68.38664256999753 613.814359353945
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -181.55086050971195 -68.38664256999753 613.814359353945
+ vertex -181.20445034819815 -68.58664256999758 613.0000000000002
+ vertex -181.21667037555162 -68.57958733391551 613.6545186779376
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -181.21667037555162 -68.57958733391551 613.6545186779376
+ vertex -181.20445034819815 -68.58664256999758 613.0000000000002
+ vertex -180.85804018668438 -68.78664256999751 613.6000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -180.85804018668438 -68.78664256999751 613.6000000000001
+ vertex -181.20445034819815 -68.58664256999758 613.0000000000002
+ vertex -178.95278429835852 -69.88664256999746 613.5656854249494
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501015 -67.68664256999749 616.4000000000001
+ vertex -182.19646627266488 -68.01390190896626 614.7858895278362
+ vertex -182.24368083273947 -67.9866425699975 615.2000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501015 -67.68664256999749 616.4000000000001
+ vertex -182.24368083273947 -67.9866425699975 615.2000000000002
+ vertex -182.19646627266485 -68.01390190896625 615.6141104721642
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501015 -67.68664256999749 616.4000000000001
+ vertex -182.19646627266485 -68.01390190896625 615.6141104721642
+ vertex -182.05804018668434 -68.09382224696995 616.0000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501015 -67.68664256999749 616.4000000000001
+ vertex -182.05804018668434 -68.09382224696995 616.0000000000001
+ vertex -181.83783608379758 -68.22095714504822 616.3313708498987
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501015 -67.68664256999749 616.4000000000001
+ vertex -181.83783608379758 -68.22095714504822 616.3313708498987
+ vertex -181.55086050971187 -68.38664256999745 616.5856406460553
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501015 -67.68664256999749 616.4000000000001
+ vertex -181.55086050971187 -68.38664256999745 616.5856406460553
+ vertex -182.7337869749635 -67.70367965685296 616.6588190451026
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.7337869749635 -67.70367965685296 616.6588190451026
+ vertex -181.55086050971187 -68.38664256999745 616.5856406460553
+ vertex -181.2166703755515 -68.57958733391541 616.7454813220627
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.7337869749635 -67.70367965685296 616.6588190451026
+ vertex -181.2166703755515 -68.57958733391541 616.7454813220627
+ vertex -182.64727067122567 -67.75362986810526 616.9000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.64727067122567 -67.75362986810526 616.9000000000001
+ vertex -181.2166703755515 -68.57958733391541 616.7454813220627
+ vertex -180.85804018668432 -68.78664256999744 616.8000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -178.95278429835852 -69.88664256999746 613.5656854249494
+ vertex -180.4994099978171 -68.99369780607952 613.6545186779376
+ vertex -180.85804018668438 -68.78664256999751 613.6000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -180.4994099978171 -68.99369780607952 613.6545186779376
+ vertex -178.95278429835852 -69.88664256999746 613.5656854249494
+ vertex -180.1652198636568 -69.1866425699975 613.814359353945
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -180.1652198636568 -69.1866425699975 613.814359353945
+ vertex -178.95278429835852 -69.88664256999746 613.5656854249494
+ vertex -179.87824428957106 -69.35232799494672 614.0686291501016
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.87824428957106 -69.35232799494672 614.0686291501016
+ vertex -178.95278429835852 -69.88664256999746 613.5656854249494
+ vertex -179.65804018668433 -69.47946289302502 614.4000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.65804018668433 -69.47946289302502 614.4000000000001
+ vertex -178.95278429835852 -69.88664256999746 613.5656854249494
+ vertex -178.95278429835852 -69.88664256999742 615.6000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.65804018668433 -69.47946289302502 614.4000000000001
+ vertex -178.95278429835852 -69.88664256999742 615.6000000000001
+ vertex -179.51961410070382 -69.5593832310287 614.785889527836
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.51961410070382 -69.5593832310287 614.785889527836
+ vertex -178.95278429835852 -69.88664256999742 615.6000000000001
+ vertex -179.4723995406292 -69.58664256999745 615.2000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -179.4723995406292 -69.58664256999745 615.2000000000002
+ vertex -178.95278429835852 -69.88664256999742 615.6000000000001
+ vertex -179.51961410070382 -69.55938323102869 615.6141104721642
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -169.2532997759729 -75.48664256999757 601.2343145750509
+ vertex -168.7634018274162 -75.76948528247219 601.8000000000001
+ vertex -171.38864599171998 -74.25379985752292 603.7000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -168.7634018274162 -75.76948528247219 601.8000000000001
+ vertex -169.2532997759729 -75.48664256999757 601.2343145750509
+ vertex -167.0016337261333 -76.78664256999751 601.8000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -171.38864599171998 -74.25379985752292 603.7000000000002
+ vertex -168.7634018274162 -75.76948528247219 601.8000000000001
+ vertex -170.8987480431633 -74.53664256999755 604.2656854249494
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -181.20445034819832 -68.58664256999784 604.0000000000001
+ vertex -182.41688591349654 -67.88664256999789 603.6
+ vertex -181.20445034819835 -68.58664256999789 601.8000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.41688591349654 -67.88664256999789 603.6
+ vertex -181.20445034819832 -68.58664256999784 604.0000000000001
+ vertex -182.41688591349654 -67.88664256999789 604.0000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -180.85804018668463 -68.786642569998 598.0000000000001
+ vertex -182.73378697496378 -67.70367965685351 598.1411809548977
+ vertex -182.64727067122598 -67.75362986810585 597.9000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.73378697496378 -67.70367965685351 598.1411809548977
+ vertex -180.85804018668463 -68.786642569998 598.0000000000001
+ vertex -181.21667037555187 -68.57958733391598 598.0545186779377
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.73378697496378 -67.70367965685351 598.1411809548977
+ vertex -181.21667037555187 -68.57958733391598 598.0545186779377
+ vertex -181.55086050971227 -68.38664256999803 598.214359353945
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.73378697496378 -67.70367965685351 598.1411809548977
+ vertex -181.55086050971227 -68.38664256999803 598.214359353945
+ vertex -182.76329607501043 -67.68664256999804 598.4000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501043 -67.68664256999804 598.4000000000002
+ vertex -181.55086050971227 -68.38664256999803 598.214359353945
+ vertex -181.83783608379792 -68.22095714504879 598.4686291501016
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501043 -67.68664256999804 598.4000000000002
+ vertex -181.83783608379792 -68.22095714504879 598.4686291501016
+ vertex -182.05804018668465 -68.09382224697046 598.8000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501043 -67.68664256999804 598.4000000000002
+ vertex -182.05804018668465 -68.09382224697046 598.8000000000002
+ vertex -182.19646627266513 -68.01390190896676 599.1858895278361
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501043 -67.68664256999804 598.4000000000002
+ vertex -182.19646627266513 -68.01390190896676 599.1858895278361
+ vertex -182.76329607501032 -67.6866425699979 603.6
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501032 -67.6866425699979 603.6
+ vertex -182.19646627266513 -68.01390190896676 599.1858895278361
+ vertex -182.24368083273973 -67.986642569998 599.6000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501032 -67.6866425699979 603.6
+ vertex -182.24368083273973 -67.986642569998 599.6000000000001
+ vertex -182.1964662726651 -68.01390190896674 600.0141104721642
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501032 -67.6866425699979 603.6
+ vertex -182.1964662726651 -68.01390190896674 600.0141104721642
+ vertex -182.05804018668462 -68.09382224697045 600.4000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501032 -67.6866425699979 603.6
+ vertex -182.05804018668462 -68.09382224697045 600.4000000000002
+ vertex -181.83783608379784 -68.2209571450487 600.7313708498987
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501032 -67.6866425699979 603.6
+ vertex -181.83783608379784 -68.2209571450487 600.7313708498987
+ vertex -181.55086050971215 -68.38664256999796 600.9856406460553
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501032 -67.6866425699979 603.6
+ vertex -181.55086050971215 -68.38664256999796 600.9856406460553
+ vertex -181.2166703755518 -68.57958733391588 601.1454813220627
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501032 -67.6866425699979 603.6
+ vertex -181.2166703755518 -68.57958733391588 601.1454813220627
+ vertex -180.85804018668452 -68.7866425699979 601.2000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501032 -67.6866425699979 603.6
+ vertex -180.85804018668452 -68.7866425699979 601.2000000000002
+ vertex -181.20445034819835 -68.58664256999789 601.8000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -181.20445034819835 -68.58664256999789 601.8000000000001
+ vertex -180.85804018668452 -68.7866425699979 601.2000000000002
+ vertex -178.95278429835878 -69.88664256999783 601.2343145750508
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.9750497701033105e-16
+ outer loop
+ vertex -182.76329607501032 -67.6866425699979 603.6
+ vertex -181.20445034819835 -68.58664256999789 601.8000000000001
+ vertex -182.41688591349654 -67.88664256999789 603.6
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -31.897270671226536 191.62097856533254 597.4
+ vertex -177.3939385715468 -70.78664256999797 597.4000000000001
+ vertex -181.89727067122598 -68.18664256999807 597.4000000000001
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -177.3939385715468 -70.78664256999797 597.4000000000001
+ vertex -31.897270671226536 191.62097856533254 597.4
+ vertex -27.3939385715473 189.02097856533265 597.4
+ endloop
+endfacet
+facet normal -0.11303899832185413 0.06526309611000009 -0.9914448613738078
+ outer loop
+ vertex -32.12141453926854 191.75038808788375 597.434074173711
+ vertex -181.89727067122598 -68.18664256999807 597.4000000000001
+ vertex -182.121414539268 -68.05723304744681 597.434074173711
+ endloop
+endfacet
+facet normal -0.11303899832185413 0.06526309611000009 -0.9914448613738078
+ outer loop
+ vertex -181.89727067122598 -68.18664256999807 597.4000000000001
+ vertex -32.12141453926854 191.75038808788375 597.434074173711
+ vertex -31.897270671226536 191.62097856533254 597.4
+ endloop
+endfacet
+facet normal -1.4032362957362895e-14 -3.338242996024356e-14 -1.0
+ outer loop
+ vertex -26.817438082612185 188.68813585285818 603.7
+ vertex -171.38864599171998 -74.25379985752292 603.7000000000002
+ vertex -176.81743808261163 -71.11948528247233 603.7000000000002
+ endloop
+endfacet
+facet normal -1.4032362957362895e-14 -3.338242996024356e-14 -1.0
+ outer loop
+ vertex -171.38864599171998 -74.25379985752292 603.7000000000002
+ vertex -26.817438082612185 188.68813585285818 603.7
+ vertex -21.38864599172057 185.5538212778076 603.7
+ endloop
+endfacet
+facet normal -0.33141357403561206 0.19134171618249302 -0.9238795325112902
+ outer loop
+ vertex -32.33028337311871 191.8709785653325 597.5339745962156
+ vertex -182.121414539268 -68.05723304744681 597.434074173711
+ vertex -182.33028337311822 -67.9366425699981 597.5339745962157
+ endloop
+endfacet
+facet normal -0.33141357403561206 0.19134171618249302 -0.9238795325112902
+ outer loop
+ vertex -182.121414539268 -68.05723304744681 597.434074173711
+ vertex -32.33028337311871 191.8709785653325 597.5339745962156
+ vertex -32.12141453926854 191.75038808788375 597.434074173711
+ endloop
+endfacet
+facet normal -0.5272028623656805 0.304380714504307 -0.7933533402912483
+ outer loop
+ vertex -32.509643106922276 191.9745319559258 597.6928932188135
+ vertex -182.33028337311822 -67.9366425699981 597.5339745962157
+ vertex -182.50964310692174 -67.83308917940481 597.6928932188135
+ endloop
+endfacet
+facet normal -0.5272028623656805 0.304380714504307 -0.7933533402912483
+ outer loop
+ vertex -182.33028337311822 -67.9366425699981 597.5339745962157
+ vertex -32.509643106922276 191.9745319559258 597.6928932188135
+ vertex -32.33028337311871 191.8709785653325 597.5339745962156
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 7.797766215937039e-16
+ outer loop
+ vertex -31.20445034819886 191.2209785653327 601.8000000000001
+ vertex -181.20445034819832 -68.58664256999784 604.0000000000001
+ vertex -181.20445034819835 -68.58664256999789 601.8000000000001
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 7.797766215937039e-16
+ outer loop
+ vertex -181.20445034819832 -68.58664256999784 604.0000000000001
+ vertex -31.20445034819886 191.2209785653327 601.8000000000001
+ vertex -31.204450348198836 191.2209785653327 604.0000000000001
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 6.227439144697606e-15
+ outer loop
+ vertex -27.3939385715473 189.02097856533265 597.4
+ vertex -177.3939385715468 -70.78664256999794 597.8000000000001
+ vertex -177.3939385715468 -70.78664256999797 597.4000000000001
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 6.227439144697606e-15
+ outer loop
+ vertex -177.3939385715468 -70.78664256999794 597.8000000000001
+ vertex -27.3939385715473 189.02097856533265 597.4
+ vertex -27.393938571547345 189.02097856533257 597.8000000000001
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -28.95278429835934 189.92097856533263 599.2
+ vertex -178.95278429835878 -69.88664256999783 601.2343145750508
+ vertex -178.9527842983588 -69.88664256999793 599.2000000000002
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -178.95278429835878 -69.88664256999783 601.2343145750508
+ vertex -28.95278429835934 189.92097856533263 599.2
+ vertex -28.95278429835932 189.92097856533272 601.2343145750508
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -169.2532997759729 -75.48664256999757 601.2343145750509
+ vertex -19.25329977597341 184.32097856533298 599.2
+ vertex -169.25329977597292 -75.48664256999764 599.2000000000002
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -19.25329977597341 184.32097856533298 599.2
+ vertex -169.2532997759729 -75.48664256999757 601.2343145750509
+ vertex -19.25329977597341 184.32097856533298 601.2343145750508
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -179.4426822469154 -69.60379985752323 601.8000000000001
+ vertex -31.20445034819886 191.2209785653327 601.8000000000001
+ vertex -181.20445034819835 -68.58664256999789 601.8000000000001
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -31.20445034819886 191.2209785653327 601.8000000000001
+ vertex -179.4426822469154 -69.60379985752323 601.8000000000001
+ vertex -29.44268224691593 190.20382127780732 601.8000000000001
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -177.047528410033 -70.98664256999788 599.2000000000002
+ vertex -28.95278429835934 189.92097856533263 599.2
+ vertex -178.9527842983588 -69.88664256999793 599.2000000000002
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -28.95278429835934 189.92097856533263 599.2
+ vertex -177.047528410033 -70.98664256999788 599.2000000000002
+ vertex -27.04752841003354 188.82097856533272 599.2
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -170.81214550278494 -74.58664256999774 597.8000000000001
+ vertex -20.8121455027855 185.22097856533284 597.4
+ vertex -170.812145502785 -74.58664256999778 597.4000000000001
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -20.8121455027855 185.22097856533284 597.4
+ vertex -170.81214550278494 -74.58664256999774 597.8000000000001
+ vertex -20.812145502785476 185.2209785653328 597.8000000000001
+ endloop
+endfacet
+facet normal -0.8001031451912929 0.46193976625560573 -0.38268343236507835
+ outer loop
+ vertex -182.73378697496378 -67.70367965685351 598.1411809548977
+ vertex -32.64727067122648 192.05399126722477 597.9
+ vertex -182.64727067122598 -67.75362986810585 597.9000000000001
+ endloop
+endfacet
+facet normal -0.8001031451912929 0.46193976625560573 -0.38268343236507835
+ outer loop
+ vertex -32.64727067122648 192.05399126722477 597.9
+ vertex -182.73378697496378 -67.70367965685351 598.1411809548977
+ vertex -32.73378697496431 192.10394147847708 598.1411809548975
+ endloop
+endfacet
+facet normal -0.6123724356957982 0.35355339059327484 0.7071067811865438
+ outer loop
+ vertex -27.307336031168774 188.97097856533284 604.2656854249493
+ vertex -179.4426822469154 -69.60379985752323 601.8000000000001
+ vertex -177.30733603116826 -70.83664256999775 604.2656854249494
+ endloop
+endfacet
+facet normal -0.6123724356957982 0.35355339059327484 0.7071067811865438
+ outer loop
+ vertex -179.4426822469154 -69.60379985752323 601.8000000000001
+ vertex -27.307336031168774 188.97097856533284 604.2656854249493
+ vertex -29.44268224691593 190.20382127780732 601.8000000000001
+ endloop
+endfacet
+facet normal 0.6123724356957956 -0.3535533905932733 -0.7071067811865469
+ outer loop
+ vertex -28.95278429835932 189.92097856533272 601.2343145750508
+ vertex -176.81743808261163 -71.11948528247233 603.7000000000002
+ vertex -178.95278429835878 -69.88664256999783 601.2343145750508
+ endloop
+endfacet
+facet normal 0.6123724356957956 -0.3535533905932733 -0.7071067811865469
+ outer loop
+ vertex -176.81743808261163 -71.11948528247233 603.7000000000002
+ vertex -28.95278429835932 189.92097856533272 601.2343145750508
+ vertex -26.817438082612185 188.68813585285818 603.7
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -182.41688591349654 -67.88664256999789 603.6
+ vertex -32.763296075010814 192.12097856533268 603.6
+ vertex -182.76329607501032 -67.6866425699979 603.6
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -32.763296075010814 192.12097856533268 603.6
+ vertex -182.41688591349654 -67.88664256999789 603.6
+ vertex -32.416885913497055 191.92097856533272 603.6
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -21.15855566429926 185.4209785653328 597.8000000000001
+ vertex -170.81214550278494 -74.58664256999774 597.8000000000001
+ vertex -171.15855566429875 -74.38664256999776 597.8000000000001
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -170.81214550278494 -74.58664256999774 597.8000000000001
+ vertex -21.15855566429926 185.4209785653328 597.8000000000001
+ vertex -20.812145502785476 185.2209785653328 597.8000000000001
+ endloop
+endfacet
+facet normal 3.1938264052333552e-15 3.964006195623637e-14 1.0
+ outer loop
+ vertex -181.20445034819832 -68.58664256999784 604.0000000000001
+ vertex -32.416885913497055 191.9209785653327 604.0
+ vertex -182.41688591349654 -67.88664256999789 604.0000000000001
+ endloop
+endfacet
+facet normal 3.1938264052333552e-15 3.964006195623637e-14 1.0
+ outer loop
+ vertex -32.416885913497055 191.9209785653327 604.0
+ vertex -181.20445034819832 -68.58664256999784 604.0000000000001
+ vertex -31.204450348198836 191.2209785653327 604.0000000000001
+ endloop
+endfacet
+facet normal -0.6123724356958147 0.35355339059323354 -0.7071067811865502
+ outer loop
+ vertex -21.38864599172057 185.5538212778076 603.7
+ vertex -169.2532997759729 -75.48664256999757 601.2343145750509
+ vertex -171.38864599171998 -74.25379985752292 603.7000000000002
+ endloop
+endfacet
+facet normal -0.6123724356958147 0.35355339059323354 -0.7071067811865502
+ outer loop
+ vertex -169.2532997759729 -75.48664256999757 601.2343145750509
+ vertex -21.38864599172057 185.5538212778076 603.7
+ vertex -19.25329977597341 184.32097856533298 601.2343145750508
+ endloop
+endfacet
+facet normal 0.1130389983218193 -0.06526309611006452 -0.9914448613738074
+ outer loop
+ vertex -16.30881340310635 182.62097856533293 597.4
+ vertex -166.08466953506382 -77.31605209254886 597.434074173711
+ vertex -166.30881340310586 -77.1866425699976 597.4000000000001
+ endloop
+endfacet
+facet normal 0.1130389983218193 -0.06526309611006452 -0.9914448613738074
+ outer loop
+ vertex -166.08466953506382 -77.31605209254886 597.434074173711
+ vertex -16.30881340310635 182.62097856533293 597.4
+ vertex -16.08466953506432 182.4915690427817 597.434074173711
+ endloop
+endfacet
+facet normal 0.3314135740355756 -0.19134171618255938 -0.9238795325112896
+ outer loop
+ vertex -16.08466953506432 182.4915690427817 597.434074173711
+ vertex -165.87580070121362 -77.4366425699976 597.5339745962157
+ vertex -166.08466953506382 -77.31605209254886 597.434074173711
+ endloop
+endfacet
+facet normal 0.3314135740355756 -0.19134171618255938 -0.9238795325112896
+ outer loop
+ vertex -165.87580070121362 -77.4366425699976 597.5339745962157
+ vertex -16.08466953506432 182.4915690427817 597.434074173711
+ vertex -15.875800701214134 182.37097856533296 597.5339745962156
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 2.4387889803801352e-15
+ outer loop
+ vertex -32.763296075010814 192.12097856533268 603.6
+ vertex -182.76329607501043 -67.68664256999804 598.4000000000002
+ vertex -182.76329607501032 -67.6866425699979 603.6
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 2.4387889803801352e-15
+ outer loop
+ vertex -182.76329607501043 -67.68664256999804 598.4000000000002
+ vertex -32.763296075010814 192.12097856533268 603.6
+ vertex -32.76329607501093 192.1209785653325 598.4000000000001
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -27.393938571547345 189.02097856533257 597.8000000000001
+ vertex -177.047528410033 -70.98664256999795 597.8000000000001
+ vertex -177.3939385715468 -70.78664256999794 597.8000000000001
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -177.047528410033 -70.98664256999795 597.8000000000001
+ vertex -27.393938571547345 189.02097856533257 597.8000000000001
+ vertex -27.047528410033514 188.8209785653326 597.8000000000001
+ endloop
+endfacet
+facet normal -0.8586164364012796 0.4957224306868715 -0.13052619222005726
+ outer loop
+ vertex -32.76329607501093 192.1209785653325 598.4000000000001
+ vertex -182.73378697496378 -67.70367965685351 598.1411809548977
+ vertex -182.76329607501043 -67.68664256999804 598.4000000000002
+ endloop
+endfacet
+facet normal -0.8586164364012796 0.4957224306868715 -0.13052619222005726
+ outer loop
+ vertex -182.73378697496378 -67.70367965685351 598.1411809548977
+ vertex -32.76329607501093 192.1209785653325 598.4000000000001
+ vertex -32.73378697496431 192.10394147847708 598.1411809548975
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -21.158555664299215 185.4209785653329 599.2
+ vertex -171.15855566429875 -74.38664256999776 597.8000000000001
+ vertex -171.15855566429872 -74.38664256999773 599.2000000000002
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -171.15855566429875 -74.38664256999776 597.8000000000001
+ vertex -21.158555664299215 185.4209785653329 599.2
+ vertex -21.15855566429926 185.4209785653328 597.8000000000001
+ endloop
+endfacet
+facet normal 0.5272028623656501 -0.3043807145043627 -0.7933533402912472
+ outer loop
+ vertex -15.875800701214134 182.37097856533296 597.5339745962156
+ vertex -165.69644096740998 -77.54019596059086 597.6928932188135
+ vertex -165.87580070121362 -77.4366425699976 597.5339745962157
+ endloop
+endfacet
+facet normal 0.5272028623656501 -0.3043807145043627 -0.7933533402912472
+ outer loop
+ vertex -165.69644096740998 -77.54019596059086 597.6928932188135
+ vertex -15.875800701214134 182.37097856533296 597.5339745962156
+ vertex -15.696440967410519 182.26742517473969 597.6928932188135
+ endloop
+endfacet
+facet normal 0.6870641468694507 -0.3966766701456196 -0.6087614290087188
+ outer loop
+ vertex -165.69644096740998 -77.54019596059086 597.6928932188135
+ vertex -15.558813403106319 182.18796586344075 597.9000000000001
+ vertex -165.5588134031058 -77.61965527188984 597.9000000000001
+ endloop
+endfacet
+facet normal 0.6870641468694507 -0.3966766701456196 -0.6087614290087188
+ outer loop
+ vertex -15.558813403106319 182.18796586344075 597.9000000000001
+ vertex -165.69644096740998 -77.54019596059086 597.6928932188135
+ vertex -15.696440967410519 182.26742517473969 597.6928932188135
+ endloop
+endfacet
+facet normal -0.6870641468694719 0.39667667014558666 -0.6087614290087161
+ outer loop
+ vertex -32.64727067122648 192.05399126722477 597.9
+ vertex -182.50964310692174 -67.83308917940481 597.6928932188135
+ vertex -182.64727067122598 -67.75362986810585 597.9000000000001
+ endloop
+endfacet
+facet normal -0.6870641468694719 0.39667667014558666 -0.6087614290087161
+ outer loop
+ vertex -182.50964310692174 -67.83308917940481 597.6928932188135
+ vertex -32.64727067122648 192.05399126722477 597.9
+ vertex -32.509643106922276 191.9745319559258 597.6928932188135
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 4.1225237454890334e-14
+ outer loop
+ vertex -27.047528410033514 188.8209785653326 597.8000000000001
+ vertex -177.047528410033 -70.98664256999788 599.2000000000002
+ vertex -177.047528410033 -70.98664256999795 597.8000000000001
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 4.1225237454890334e-14
+ outer loop
+ vertex -177.047528410033 -70.98664256999788 599.2000000000002
+ vertex -27.047528410033514 188.8209785653326 597.8000000000001
+ vertex -27.04752841003354 188.82097856533272 599.2
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -6.007129263248552e-15
+ outer loop
+ vertex -32.416885913497055 191.9209785653327 604.0
+ vertex -182.41688591349654 -67.88664256999789 603.6
+ vertex -182.41688591349654 -67.88664256999789 604.0000000000001
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -6.007129263248552e-15
+ outer loop
+ vertex -182.41688591349654 -67.88664256999789 603.6
+ vertex -32.416885913497055 191.9209785653327 604.0
+ vertex -32.416885913497055 191.92097856533272 603.6
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -169.25329977597292 -75.48664256999764 599.2000000000002
+ vertex -21.158555664299215 185.4209785653329 599.2
+ vertex -171.15855566429872 -74.38664256999773 599.2000000000002
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -21.158555664299215 185.4209785653329 599.2
+ vertex -169.25329977597292 -75.48664256999764 599.2000000000002
+ vertex -19.25329977597341 184.32097856533298 599.2
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -20.8121455027855 185.22097856533284 597.4
+ vertex -166.30881340310586 -77.1866425699976 597.4000000000001
+ vertex -170.812145502785 -74.58664256999778 597.4000000000001
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -166.30881340310586 -77.1866425699976 597.4000000000001
+ vertex -20.8121455027855 185.22097856533284 597.4
+ vertex -16.30881340310635 182.62097856533293 597.4
+ endloop
+endfacet
+facet normal 0.11303899832184437 -0.06526309610999445 0.9914448613738092
+ outer loop
+ vertex -167.34804388764715 -76.58664256999762 598.0000000000001
+ vertex -17.706674076514883 183.42803380141493 598.0545186779375
+ vertex -167.7066740765144 -76.3795873339156 598.0545186779376
+ endloop
+endfacet
+facet normal 0.11303899832184437 -0.06526309610999445 0.9914448613738092
+ outer loop
+ vertex -17.706674076514883 183.42803380141493 598.0545186779375
+ vertex -167.34804388764715 -76.58664256999762 598.0000000000001
+ vertex -17.348043887647677 183.22097856533296 598.0000000000001
+ endloop
+endfacet
+facet normal 0.8586164364012803 -0.49572243068687194 -0.1305261922200513
+ outer loop
+ vertex -26.441310627384293 188.47097856533296 607.4
+ vertex -176.3616360572578 -71.38264270450729 608.098811421777
+ vertex -176.44131062738379 -71.3366425699976 607.4000000000001
+ endloop
+endfacet
+facet normal 0.8586164364012803 -0.49572243068687194 -0.1305261922200513
+ outer loop
+ vertex -176.3616360572578 -71.38264270450729 608.098811421777
+ vertex -26.441310627384293 188.47097856533296 607.4
+ vertex -26.361636057258405 188.42497843082322 608.0988114217769
+ endloop
+endfacet
+facet normal 0.5272028623656798 -0.30438071450430665 0.7933533402912488
+ outer loop
+ vertex -175.2721763322748 -72.01164256999762 605.0617314097822
+ vertex -25.75644761354496 188.07557271993477 605.4908116907964
+ vertex -175.75644761354442 -71.73204841539578 605.4908116907965
+ endloop
+endfacet
+facet normal 0.5272028623656798 -0.30438071450430665 0.7933533402912488
+ outer loop
+ vertex -25.75644761354496 188.07557271993477 605.4908116907964
+ vertex -175.2721763322748 -72.01164256999762 605.0617314097822
+ vertex -25.272176332275308 187.79597856533294 605.061731409782
+ endloop
+endfacet
+facet normal 0.8001031451912723 -0.4619397662556388 -0.3826834323650808
+ outer loop
+ vertex -176.3616360572578 -71.38264270450729 608.098811421777
+ vertex -26.128042037166267 188.29011286044198 608.7500000000001
+ vertex -176.12804203716573 -71.51750827488856 608.7500000000001
+ endloop
+endfacet
+facet normal 0.8001031451912723 -0.4619397662556388 -0.3826834323650808
+ outer loop
+ vertex -26.128042037166267 188.29011286044198 608.7500000000001
+ vertex -176.3616360572578 -71.38264270450729 608.098811421777
+ vertex -26.361636057258405 188.42497843082322 608.0988114217769
+ endloop
+endfacet
+facet normal 0.8001031451912779 -0.4619397662556308 -0.38268343236507885
+ outer loop
+ vertex -15.558813403106319 182.18796586344075 597.9000000000001
+ vertex -165.47229709936798 -77.6696054831421 598.1411809548977
+ vertex -165.5588134031058 -77.61965527188984 597.9000000000001
+ endloop
+endfacet
+facet normal 0.8001031451912779 -0.4619397662556308 -0.38268343236507885
+ outer loop
+ vertex -165.47229709936798 -77.6696054831421 598.1411809548977
+ vertex -15.558813403106319 182.18796586344075 597.9000000000001
+ vertex -15.47229709936849 182.13801565218841 598.1411809548975
+ endloop
+endfacet
+facet normal 0.11303899832179289 -0.06526309611005209 -0.9914448613738114
+ outer loop
+ vertex -24.70823048087963 187.47038427622155 610.0079997309805
+ vertex -174.1030420371657 -72.68664256999745 610.1000000000001
+ vertex -174.70823048087914 -72.33723685910905 610.0079997309806
+ endloop
+endfacet
+facet normal 0.11303899832179289 -0.06526309611005209 -0.9914448613738114
+ outer loop
+ vertex -174.1030420371657 -72.68664256999745 610.1000000000001
+ vertex -24.70823048087963 187.47038427622155 610.0079997309805
+ vertex -24.103042037166183 187.1209785653331 610.1
+ endloop
+endfacet
+facet normal -0.5272028623656798 0.30438071450430665 -0.7933533402912488
+ outer loop
+ vertex -22.933907742057176 186.4459785653332 609.7382685902181
+ vertex -172.44963646078705 -73.64123672459925 609.3091883092038
+ vertex -172.93390774205668 -73.36164256999741 609.7382685902181
+ endloop
+endfacet
+facet normal -0.5272028623656798 0.30438071450430665 -0.7933533402912488
+ outer loop
+ vertex -172.44963646078705 -73.64123672459925 609.3091883092038
+ vertex -22.933907742057176 186.4459785653332 609.7382685902181
+ vertex -22.44963646078752 186.16638441073135 609.3091883092037
+ endloop
+endfacet
+facet normal 0.8001031451912968 -0.4619397662555967 0.3826834323650809
+ outer loop
+ vertex -26.128042037166335 188.29011286044195 606.0500000000001
+ vertex -176.36163605725787 -71.38264270450735 606.7011885782233
+ vertex -176.1280420371658 -71.51750827488864 606.0500000000002
+ endloop
+endfacet
+facet normal 0.8001031451912968 -0.4619397662555967 0.3826834323650809
+ outer loop
+ vertex -176.36163605725787 -71.38264270450735 606.7011885782233
+ vertex -26.128042037166335 188.29011286044195 606.0500000000001
+ vertex -26.361636057258405 188.42497843082322 606.7011885782233
+ endloop
+endfacet
+facet normal 0.3314135740355922 -0.19134171618256895 -0.9238795325112817
+ outer loop
+ vertex -25.27217633227526 187.79597856533303 609.738268590218
+ vertex -174.70823048087914 -72.33723685910905 610.0079997309806
+ vertex -175.27217633227468 -72.01164256999746 609.7382685902181
+ endloop
+endfacet
+facet normal 0.3314135740355922 -0.19134171618256895 -0.9238795325112817
+ outer loop
+ vertex -174.70823048087914 -72.33723685910905 610.0079997309806
+ vertex -25.27217633227526 187.79597856533303 609.738268590218
+ vertex -24.70823048087963 187.47038427622155 610.0079997309805
+ endloop
+endfacet
+facet normal -0.1130389983217937 0.06526309611005116 0.9914448613738113
+ outer loop
+ vertex -173.4978535934523 -73.03604828088599 604.7920002690196
+ vertex -24.103042037166297 187.12097856533296 604.7
+ vertex -174.10304203716578 -72.68664256999762 604.7000000000002
+ endloop
+endfacet
+facet normal -0.1130389983217937 0.06526309611005116 0.9914448613738113
+ outer loop
+ vertex -24.103042037166297 187.12097856533296 604.7
+ vertex -173.4978535934523 -73.03604828088599 604.7920002690196
+ vertex -23.497853593452852 186.77157285444454 604.7920002690196
+ endloop
+endfacet
+facet normal -0.8001031451912723 0.4619397662556388 0.3826834323650808
+ outer loop
+ vertex -171.84444801707363 -73.9906424354877 606.7011885782233
+ vertex -22.078042037166263 185.95184427022406 606.0500000000001
+ vertex -172.07804203716574 -73.85577686510652 606.0500000000002
+ endloop
+endfacet
+facet normal -0.8001031451912723 0.4619397662556388 0.3826834323650808
+ outer loop
+ vertex -22.078042037166263 185.95184427022406 606.0500000000001
+ vertex -171.84444801707363 -73.9906424354877 606.7011885782233
+ vertex -21.844448017074143 185.81697869984282 606.7011885782233
+ endloop
+endfacet
+facet normal -0.33141357403562616 0.19134171618250684 -0.9238795325112824
+ outer loop
+ vertex -23.49785359345274 186.77157285444477 610.0079997309805
+ vertex -172.93390774205668 -73.36164256999741 609.7382685902181
+ vertex -173.49785359345225 -73.03604828088585 610.0079997309806
+ endloop
+endfacet
+facet normal -0.33141357403562616 0.19134171618250684 -0.9238795325112824
+ outer loop
+ vertex -172.93390774205668 -73.36164256999741 609.7382685902181
+ vertex -23.49785359345274 186.77157285444477 610.0079997309805
+ vertex -22.933907742057176 186.4459785653332 609.7382685902181
+ endloop
+endfacet
+facet normal 0.6870641468694536 -0.3966766701456156 -0.6087614290087181
+ outer loop
+ vertex -26.128042037166267 188.29011286044198 608.7500000000001
+ vertex -175.75644761354437 -71.73204841539567 609.3091883092038
+ vertex -176.12804203716573 -71.51750827488856 608.7500000000001
+ endloop
+endfacet
+facet normal 0.6870641468694536 -0.3966766701456156 -0.6087614290087181
+ outer loop
+ vertex -175.75644761354437 -71.73204841539567 609.3091883092038
+ vertex -26.128042037166267 188.29011286044198 608.7500000000001
+ vertex -25.75644761354487 188.0755727199349 609.3091883092037
+ endloop
+endfacet
+facet normal 0.8586164364012749 -0.4957224306868801 0.13052619222005518
+ outer loop
+ vertex -176.36163605725787 -71.38264270450735 606.7011885782233
+ vertex -26.441310627384293 188.47097856533296 607.4
+ vertex -176.44131062738379 -71.3366425699976 607.4000000000001
+ endloop
+endfacet
+facet normal 0.8586164364012749 -0.4957224306868801 0.13052619222005518
+ outer loop
+ vertex -26.441310627384293 188.47097856533296 607.4
+ vertex -176.36163605725787 -71.38264270450735 606.7011885782233
+ vertex -26.361636057258405 188.42497843082322 606.7011885782233
+ endloop
+endfacet
+facet normal -0.8001031451912879 0.46193976625560285 -0.38268343236509217
+ outer loop
+ vertex -22.078042037166195 185.95184427022414 608.7500000000001
+ vertex -171.8444480170736 -73.99064243548767 608.098811421777
+ vertex -172.0780420371657 -73.8557768651064 608.7500000000001
+ endloop
+endfacet
+facet normal -0.8001031451912879 0.46193976625560285 -0.38268343236509217
+ outer loop
+ vertex -171.8444480170736 -73.99064243548767 608.098811421777
+ vertex -22.078042037166195 185.95184427022414 608.7500000000001
+ vertex -21.84444801707412 185.81697869984293 608.0988114217769
+ endloop
+endfacet
+facet normal -0.11303899832176335 0.06526309611003223 0.9914448613738159
+ outer loop
+ vertex -166.9894136987799 -76.79369780607962 598.0545186779376
+ vertex -17.348043887647677 183.22097856533296 598.0000000000001
+ vertex -167.34804388764715 -76.58664256999762 598.0000000000001
+ endloop
+endfacet
+facet normal -0.11303899832176335 0.06526309611003223 0.9914448613738159
+ outer loop
+ vertex -17.348043887647677 183.22097856533296 598.0000000000001
+ vertex -166.9894136987799 -76.79369780607962 598.0545186779376
+ vertex -16.98941369878049 183.01392332925096 598.0545186779375
+ endloop
+endfacet
+facet normal -0.6870641468694504 0.3966766701456194 0.6087614290087194
+ outer loop
+ vertex -22.078042037166263 185.95184427022406 606.0500000000001
+ vertex -172.44963646078708 -73.64123672459937 605.4908116907965
+ vertex -172.07804203716574 -73.85577686510652 606.0500000000002
+ endloop
+endfacet
+facet normal -0.6870641468694504 0.3966766701456194 0.6087614290087194
+ outer loop
+ vertex -172.44963646078708 -73.64123672459937 605.4908116907965
+ vertex -22.078042037166263 185.95184427022406 606.0500000000001
+ vertex -22.449636460787655 186.16638441073113 605.4908116907964
+ endloop
+endfacet
+facet normal 0.5272028623656518 -0.3043807145043581 -0.7933533402912477
+ outer loop
+ vertex -25.75644761354487 188.0755727199349 609.3091883092037
+ vertex -175.27217633227468 -72.01164256999746 609.7382685902181
+ vertex -175.75644761354437 -71.73204841539567 609.3091883092038
+ endloop
+endfacet
+facet normal 0.5272028623656518 -0.3043807145043581 -0.7933533402912477
+ outer loop
+ vertex -175.27217633227468 -72.01164256999746 609.7382685902181
+ vertex -25.75644761354487 188.0755727199349 609.3091883092037
+ vertex -25.27217633227526 187.79597856533303 609.738268590218
+ endloop
+endfacet
+facet normal 0.11303899832182897 -0.06526309610998697 0.9914448613738115
+ outer loop
+ vertex -174.10304203716578 -72.68664256999762 604.7000000000002
+ vertex -24.70823048087974 187.47038427622132 604.7920002690196
+ vertex -174.70823048087922 -72.33723685910924 604.7920002690196
+ endloop
+endfacet
+facet normal 0.11303899832182897 -0.06526309610998697 0.9914448613738115
+ outer loop
+ vertex -24.70823048087974 187.47038427622132 604.7920002690196
+ vertex -174.10304203716578 -72.68664256999762 604.7000000000002
+ vertex -24.103042037166297 187.12097856533296 604.7
+ endloop
+endfacet
+facet normal -0.687064146869468 0.3966766701455844 -0.6087614290087221
+ outer loop
+ vertex -22.44963646078752 186.16638441073135 609.3091883092037
+ vertex -172.0780420371657 -73.8557768651064 608.7500000000001
+ vertex -172.44963646078705 -73.64123672459925 609.3091883092038
+ endloop
+endfacet
+facet normal -0.687064146869468 0.3966766701455844 -0.6087614290087221
+ outer loop
+ vertex -172.0780420371657 -73.8557768651064 608.7500000000001
+ vertex -22.44963646078752 186.16638441073135 609.3091883092037
+ vertex -22.078042037166195 185.95184427022414 608.7500000000001
+ endloop
+endfacet
+facet normal -0.8586164364012803 0.49572243068687194 -0.13052619222005102
+ outer loop
+ vertex -171.8444480170736 -73.99064243548767 608.098811421777
+ vertex -21.764773446948233 185.77097856533308 607.4000000000001
+ vertex -171.76477344694774 -74.03664256999745 607.4000000000001
+ endloop
+endfacet
+facet normal -0.8586164364012803 0.49572243068687194 -0.13052619222005102
+ outer loop
+ vertex -21.764773446948233 185.77097856533308 607.4000000000001
+ vertex -171.8444480170736 -73.99064243548767 608.098811421777
+ vertex -21.84444801707412 185.81697869984293 608.0988114217769
+ endloop
+endfacet
+facet normal -0.11303899832182897 0.06526309610998697 -0.9914448613738115
+ outer loop
+ vertex -24.103042037166183 187.1209785653331 610.1
+ vertex -173.49785359345225 -73.03604828088585 610.0079997309806
+ vertex -174.1030420371657 -72.68664256999745 610.1000000000001
+ endloop
+endfacet
+facet normal -0.11303899832182897 0.06526309610998697 -0.9914448613738115
+ outer loop
+ vertex -173.49785359345225 -73.03604828088585 610.0079997309806
+ vertex -24.103042037166183 187.1209785653331 610.1
+ vertex -23.49785359345274 186.77157285444477 610.0079997309805
+ endloop
+endfacet
+facet normal -0.3314135740355987 0.1913417161825699 0.9238795325112792
+ outer loop
+ vertex -166.65522356461958 -76.98664256999763 598.214359353945
+ vertex -16.98941369878049 183.01392332925096 598.0545186779375
+ vertex -166.9894136987799 -76.79369780607962 598.0545186779376
+ endloop
+endfacet
+facet normal -0.3314135740355987 0.1913417161825699 0.9238795325112792
+ outer loop
+ vertex -16.98941369878049 183.01392332925096 598.0545186779375
+ vertex -166.65522356461958 -76.98664256999763 598.214359353945
+ vertex -16.655223564620155 182.8209785653329 598.2143593539449
+ endloop
+endfacet
+facet normal 0.6870641468694714 -0.39667667014558067 0.6087614290087208
+ outer loop
+ vertex -175.75644761354442 -71.73204841539578 605.4908116907965
+ vertex -26.128042037166335 188.29011286044195 606.0500000000001
+ vertex -176.1280420371658 -71.51750827488864 606.0500000000002
+ endloop
+endfacet
+facet normal 0.6870641468694714 -0.39667667014558067 0.6087614290087208
+ outer loop
+ vertex -26.128042037166335 188.29011286044195 606.0500000000001
+ vertex -175.75644761354442 -71.73204841539578 605.4908116907965
+ vertex -25.75644761354496 188.07557271993477 605.4908116907964
+ endloop
+endfacet
+facet normal -0.5272028623656435 0.3043807145043646 0.7933533402912507
+ outer loop
+ vertex -166.36824799053383 -77.1523279949468 598.4686291501016
+ vertex -16.655223564620155 182.8209785653329 598.2143593539449
+ vertex -166.65522356461958 -76.98664256999763 598.214359353945
+ endloop
+endfacet
+facet normal -0.5272028623656435 0.3043807145043646 0.7933533402912507
+ outer loop
+ vertex -16.655223564620155 182.8209785653329 598.2143593539449
+ vertex -166.36824799053383 -77.1523279949468 598.4686291501016
+ vertex -16.36824799053443 182.6552931403837 598.4686291501016
+ endloop
+endfacet
+facet normal 0.33141357403559235 -0.19134171618249016 0.923879532511298
+ outer loop
+ vertex -167.7066740765144 -76.3795873339156 598.0545186779376
+ vertex -18.04086421067524 183.6209785653329 598.2143593539449
+ vertex -168.04086421067473 -76.18664256999767 598.214359353945
+ endloop
+endfacet
+facet normal 0.33141357403559235 -0.19134171618249016 0.923879532511298
+ outer loop
+ vertex -18.04086421067524 183.6209785653329 598.2143593539449
+ vertex -167.7066740765144 -76.3795873339156 598.0545186779376
+ vertex -17.706674076514883 183.42803380141493 598.0545186779375
+ endloop
+endfacet
+facet normal -0.5272028623656518 0.3043807145043581 0.7933533402912477
+ outer loop
+ vertex -172.44963646078708 -73.64123672459937 605.4908116907965
+ vertex -22.933907742057286 186.44597856533298 605.061731409782
+ vertex -172.93390774205676 -73.36164256999754 605.0617314097822
+ endloop
+endfacet
+facet normal -0.5272028623656518 0.3043807145043581 0.7933533402912477
+ outer loop
+ vertex -22.933907742057286 186.44597856533298 605.061731409782
+ vertex -172.44963646078708 -73.64123672459937 605.4908116907965
+ vertex -22.449636460787655 186.16638441073113 605.4908116907964
+ endloop
+endfacet
+facet normal -0.3314135740355922 0.19134171618256895 0.9238795325112817
+ outer loop
+ vertex -172.93390774205676 -73.36164256999754 605.0617314097822
+ vertex -23.497853593452852 186.77157285444454 604.7920002690196
+ vertex -173.4978535934523 -73.03604828088599 604.7920002690196
+ endloop
+endfacet
+facet normal -0.3314135740355922 0.19134171618256895 0.9238795325112817
+ outer loop
+ vertex -23.497853593452852 186.77157285444454 604.7920002690196
+ vertex -172.93390774205676 -73.36164256999754 605.0617314097822
+ vertex -22.933907742057286 186.44597856533298 605.061731409782
+ endloop
+endfacet
+facet normal -0.8586164364012803 0.49572243068687194 0.1305261922200513
+ outer loop
+ vertex -21.764773446948233 185.77097856533308 607.4000000000001
+ vertex -171.84444801707363 -73.9906424354877 606.7011885782233
+ vertex -171.76477344694774 -74.03664256999745 607.4000000000001
+ endloop
+endfacet
+facet normal -0.8586164364012803 0.49572243068687194 0.1305261922200513
+ outer loop
+ vertex -171.84444801707363 -73.9906424354877 606.7011885782233
+ vertex -21.764773446948233 185.77097856533308 607.4000000000001
+ vertex -21.844448017074143 185.81697869984282 606.7011885782233
+ endloop
+endfacet
+facet normal 0.8586164364012798 -0.49572243068687166 -0.13052619222005538
+ outer loop
+ vertex -165.47229709936798 -77.6696054831421 598.1411809548977
+ vertex -15.44278799932185 182.12097856533305 598.4000000000001
+ vertex -165.44278799932138 -77.68664256999759 598.4000000000002
+ endloop
+endfacet
+facet normal 0.8586164364012798 -0.49572243068687166 -0.13052619222005538
+ outer loop
+ vertex -15.44278799932185 182.12097856533305 598.4000000000001
+ vertex -165.47229709936798 -77.6696054831421 598.1411809548977
+ vertex -15.47229709936849 182.13801565218841 598.1411809548975
+ endloop
+endfacet
+facet normal -0.6870641468694428 0.39667667014560937 0.6087614290087343
+ outer loop
+ vertex -16.14804388764763 182.52815824230544 598.8
+ vertex -166.36824799053383 -77.1523279949468 598.4686291501016
+ vertex -166.1480438876471 -77.27946289302511 598.8000000000001
+ endloop
+endfacet
+facet normal -0.6870641468694428 0.39667667014560937 0.6087614290087343
+ outer loop
+ vertex -166.36824799053383 -77.1523279949468 598.4686291501016
+ vertex -16.14804388764763 182.52815824230544 598.8
+ vertex -16.36824799053443 182.6552931403837 598.4686291501016
+ endloop
+endfacet
+facet normal 0.3314135740356219 -0.19134171618251283 0.9238795325112827
+ outer loop
+ vertex -174.70823048087922 -72.33723685910924 604.7920002690196
+ vertex -25.272176332275308 187.79597856533294 605.061731409782
+ vertex -175.2721763322748 -72.01164256999762 605.0617314097822
+ endloop
+endfacet
+facet normal 0.3314135740356219 -0.19134171618251283 0.9238795325112827
+ outer loop
+ vertex -25.272176332275308 187.79597856533294 605.061731409782
+ vertex -174.70823048087922 -72.33723685910924 604.7920002690196
+ vertex -24.70823048087974 187.47038427622132 604.7920002690196
+ endloop
+endfacet
+facet normal 0.3314135740355987 -0.1913417161825699 -0.9238795325112792
+ outer loop
+ vertex -18.040864210675174 183.620978565333 600.9856406460551
+ vertex -167.7066740765143 -76.37958733391552 601.1454813220627
+ vertex -168.04086421067464 -76.18664256999756 600.9856406460553
+ endloop
+endfacet
+facet normal 0.3314135740355987 -0.1913417161825699 -0.9238795325112792
+ outer loop
+ vertex -167.7066740765143 -76.37958733391552 601.1454813220627
+ vertex -18.040864210675174 183.620978565333 600.9856406460551
+ vertex -17.70667407651486 183.42803380141498 601.1454813220626
+ endloop
+endfacet
+facet normal -0.11303899832184455 0.06526309610999596 -0.9914448613738092
+ outer loop
+ vertex -17.34804388764763 183.22097856533298 601.2
+ vertex -166.98941369877988 -76.79369780607954 601.1454813220627
+ vertex -167.34804388764707 -76.58664256999752 601.2000000000002
+ endloop
+endfacet
+facet normal -0.11303899832184455 0.06526309610999596 -0.9914448613738092
+ outer loop
+ vertex -166.98941369877988 -76.79369780607954 601.1454813220627
+ vertex -17.34804388764763 183.22097856533298 601.2
+ vertex -16.989413698780353 183.013923329251 601.1454813220626
+ endloop
+endfacet
+facet normal -0.8586164364012763 0.4957224306868809 -0.1305261922200438
+ outer loop
+ vertex -16.009617801667087 182.44823790430183 600.014110472164
+ vertex -165.96240324159197 -77.38664256999755 599.6
+ vertex -166.0096178016666 -77.35938323102881 600.0141104721641
+ endloop
+endfacet
+facet normal -0.8586164364012763 0.4957224306868809 -0.1305261922200438
+ outer loop
+ vertex -165.96240324159197 -77.38664256999755 599.6
+ vertex -16.009617801667087 182.44823790430183 600.014110472164
+ vertex -15.9624032415925 182.4209785653331 599.6
+ endloop
+endfacet
+facet normal 0.858616436401279 -0.4957224306868712 -0.13052619222006182
+ outer loop
+ vertex -18.73368453370276 184.020978565333 599.6
+ vertex -168.68646997362762 -75.81390190896636 600.0141104721642
+ vertex -168.73368453370225 -75.78664256999762 599.6000000000001
+ endloop
+endfacet
+facet normal 0.858616436401279 -0.4957224306868712 -0.13052619222006182
+ outer loop
+ vertex -168.68646997362762 -75.81390190896636 600.0141104721642
+ vertex -18.73368453370276 184.020978565333 599.6
+ vertex -18.686469973628128 183.99371922636428 600.0141104721641
+ endloop
+endfacet
+facet normal 0.6870641468694699 -0.39667667014557983 0.608761429008723
+ outer loop
+ vertex -18.327839784760943 183.78666399028216 598.4686291501016
+ vertex -168.54804388764717 -75.89382224697007 598.8000000000002
+ vertex -168.32783978476044 -76.0209571450484 598.4686291501016
+ endloop
+endfacet
+facet normal 0.6870641468694699 -0.39667667014557983 0.608761429008723
+ outer loop
+ vertex -168.54804388764717 -75.89382224697007 598.8000000000002
+ vertex -18.327839784760943 183.78666399028216 598.4686291501016
+ vertex -18.54804388764774 183.91379888836042 598.8000000000001
+ endloop
+endfacet
+facet normal -0.85861643640128 0.4957224306868831 -0.13052619222001063
+ outer loop
+ vertex -16.009617801666817 182.44823790430226 615.6141104721642
+ vertex -165.96240324159172 -77.38664256999704 615.2000000000002
+ vertex -166.00961780166634 -77.3593832310283 615.6141104721642
+ endloop
+endfacet
+facet normal -0.85861643640128 0.4957224306868831 -0.13052619222001063
+ outer loop
+ vertex -165.96240324159172 -77.38664256999704 615.2000000000002
+ vertex -16.009617801666817 182.44823790430226 615.6141104721642
+ vertex -15.962403241592297 182.42097856533346 615.2
+ endloop
+endfacet
+facet normal -0.5272028623657163 0.3043807145043165 -0.7933533402912205
+ outer loop
+ vertex -16.655223564620066 182.82097856533304 600.9856406460551
+ vertex -166.36824799053383 -77.15232799494673 600.7313708498986
+ vertex -166.65522356461955 -76.98664256999751 600.9856406460552
+ endloop
+endfacet
+facet normal -0.5272028623657163 0.3043807145043165 -0.7933533402912205
+ outer loop
+ vertex -166.36824799053383 -77.15232799494673 600.7313708498986
+ vertex -16.655223564620066 182.82097856533304 600.9856406460551
+ vertex -16.368247990534297 182.65529314038383 600.7313708498986
+ endloop
+endfacet
+facet normal 0.11303899832176201 -0.06526309611003285 -0.991444861373816
+ outer loop
+ vertex -17.70667407651486 183.42803380141498 601.1454813220626
+ vertex -167.34804388764707 -76.58664256999752 601.2000000000002
+ vertex -167.7066740765143 -76.37958733391552 601.1454813220627
+ endloop
+endfacet
+facet normal 0.11303899832176201 -0.06526309611003285 -0.991444861373816
+ outer loop
+ vertex -167.34804388764707 -76.58664256999752 601.2000000000002
+ vertex -17.70667407651486 183.42803380141498 601.1454813220626
+ vertex -17.34804388764763 183.22097856533298 601.2
+ endloop
+endfacet
+facet normal -0.858616436401279 0.4957224306868712 0.13052619222006182
+ outer loop
+ vertex -165.96240324159197 -77.38664256999755 599.6
+ vertex -16.009617801667087 182.4482379043018 599.185889527836
+ vertex -166.00961780166662 -77.35938323102883 599.1858895278361
+ endloop
+endfacet
+facet normal -0.858616436401279 0.4957224306868712 0.13052619222006182
+ outer loop
+ vertex -16.009617801667087 182.4482379043018 599.185889527836
+ vertex -165.96240324159197 -77.38664256999755 599.6
+ vertex -15.9624032415925 182.4209785653331 599.6
+ endloop
+endfacet
+facet normal 0.3314135740355431 -0.1913417161825406 -0.9238795325113052
+ outer loop
+ vertex -18.0408642106749 183.62097856533347 616.5856406460551
+ vertex -167.70667407651402 -76.37958733391504 616.7454813220626
+ vertex -168.0408642106744 -76.18664256999706 616.5856406460553
+ endloop
+endfacet
+facet normal 0.3314135740355431 -0.1913417161825406 -0.9238795325113052
+ outer loop
+ vertex -167.70667407651402 -76.37958733391504 616.7454813220626
+ vertex -18.0408642106749 183.62097856533347 616.5856406460551
+ vertex -17.706674076514545 183.42803380141552 616.7454813220626
+ endloop
+endfacet
+facet normal -0.6870641468694699 0.39667667014557983 -0.608761429008723
+ outer loop
+ vertex -166.36824799053383 -77.15232799494673 600.7313708498986
+ vertex -16.14804388764759 182.52815824230547 600.4000000000001
+ vertex -166.14804388764708 -77.27946289302508 600.4000000000002
+ endloop
+endfacet
+facet normal -0.6870641468694699 0.39667667014557983 -0.608761429008723
+ outer loop
+ vertex -16.14804388764759 182.52815824230547 600.4000000000001
+ vertex -166.36824799053383 -77.15232799494673 600.7313708498986
+ vertex -16.368247990534297 182.65529314038383 600.7313708498986
+ endloop
+endfacet
+facet normal -0.6870641468694759 0.39667667014558894 -0.6087614290087102
+ outer loop
+ vertex -166.36824799053355 -77.15232799494626 616.3313708498986
+ vertex -16.148043887647408 182.52815824230598 616.0
+ vertex -166.14804388764685 -77.27946289302459 616.0000000000001
+ endloop
+endfacet
+facet normal -0.6870641468694759 0.39667667014558894 -0.6087614290087102
+ outer loop
+ vertex -16.148043887647408 182.52815824230598 616.0
+ vertex -166.36824799053355 -77.15232799494626 616.3313708498986
+ vertex -16.368247990534048 182.6552931403843 616.3313708498985
+ endloop
+endfacet
+facet normal 0.858616436401279 -0.4957224306868712 -0.13052619222006182
+ outer loop
+ vertex -18.733684533702558 184.0209785653334 615.2
+ vertex -168.68646997362737 -75.81390190896586 615.6141104721642
+ vertex -168.73368453370196 -75.78664256999716 615.2000000000002
+ endloop
+endfacet
+facet normal 0.858616436401279 -0.4957224306868712 -0.13052619222006182
+ outer loop
+ vertex -168.68646997362737 -75.81390190896586 615.6141104721642
+ vertex -18.733684533702558 184.0209785653334 615.2
+ vertex -18.686469973627858 183.99371922636468 615.6141104721642
+ endloop
+endfacet
+facet normal -0.331413574035631 0.19134171618251528 -0.9238795325112789
+ outer loop
+ vertex -16.989413698780083 183.01392332925155 616.7454813220626
+ vertex -166.65522356461926 -76.98664256999704 616.5856406460553
+ vertex -166.98941369877957 -76.79369780607902 616.7454813220626
+ endloop
+endfacet
+facet normal -0.331413574035631 0.19134171618251528 -0.9238795325112789
+ outer loop
+ vertex -166.65522356461926 -76.98664256999704 616.5856406460553
+ vertex -16.989413698780083 183.01392332925155 616.7454813220626
+ vertex -16.65522356461977 182.82097856533352 616.5856406460551
+ endloop
+endfacet
+facet normal -0.8001031451912812 0.46193976625559896 -0.3826834323651106
+ outer loop
+ vertex -166.14804388764685 -77.27946289302459 616.0000000000001
+ vertex -16.009617801666817 182.44823790430226 615.6141104721642
+ vertex -166.00961780166634 -77.3593832310283 615.6141104721642
+ endloop
+endfacet
+facet normal -0.8001031451912812 0.46193976625559896 -0.3826834323651106
+ outer loop
+ vertex -16.009617801666817 182.44823790430226 615.6141104721642
+ vertex -166.14804388764685 -77.27946289302459 616.0000000000001
+ vertex -16.148043887647408 182.52815824230598 616.0
+ endloop
+endfacet
+facet normal -0.33141357403559024 0.19134171618248894 -0.923879532511299
+ outer loop
+ vertex -16.989413698780353 183.013923329251 601.1454813220626
+ vertex -166.65522356461955 -76.98664256999751 600.9856406460552
+ vertex -166.98941369877988 -76.79369780607954 601.1454813220627
+ endloop
+endfacet
+facet normal -0.33141357403559024 0.19134171618248894 -0.923879532511299
+ outer loop
+ vertex -166.65522356461955 -76.98664256999751 600.9856406460552
+ vertex -16.989413698780353 183.013923329251 601.1454813220626
+ vertex -16.655223564620066 182.82097856533304 600.9856406460551
+ endloop
+endfacet
+facet normal 0.5272028623656435 -0.3043807145043646 -0.7933533402912507
+ outer loop
+ vertex -18.32783978476092 183.78666399028225 600.7313708498986
+ vertex -168.04086421067464 -76.18664256999756 600.9856406460553
+ vertex -168.32783978476039 -76.02095714504833 600.7313708498987
+ endloop
+endfacet
+facet normal 0.5272028623656435 -0.3043807145043646 -0.7933533402912507
+ outer loop
+ vertex -168.04086421067464 -76.18664256999756 600.9856406460553
+ vertex -18.32783978476092 183.78666399028225 600.7313708498986
+ vertex -18.040864210675174 183.620978565333 600.9856406460551
+ endloop
+endfacet
+facet normal -0.858616436401279 0.4957224306868712 0.13052619222006182
+ outer loop
+ vertex -165.96240324159172 -77.38664256999704 615.2000000000002
+ vertex -16.009617801666884 182.44823790430226 614.785889527836
+ vertex -166.00961780166637 -77.35938323102832 614.785889527836
+ endloop
+endfacet
+facet normal -0.858616436401279 0.4957224306868712 0.13052619222006182
+ outer loop
+ vertex -16.009617801666884 182.44823790430226 614.785889527836
+ vertex -165.96240324159172 -77.38664256999704 615.2000000000002
+ vertex -15.962403241592297 182.42097856533346 615.2
+ endloop
+endfacet
+facet normal 0.5272028623656568 -0.30438071450436105 -0.7933533402912432
+ outer loop
+ vertex -18.327839784760627 183.78666399028273 616.3313708498986
+ vertex -168.0408642106744 -76.18664256999706 616.5856406460553
+ vertex -168.32783978476013 -76.02095714504783 616.3313708498987
+ endloop
+endfacet
+facet normal 0.5272028623656568 -0.30438071450436105 -0.7933533402912432
+ outer loop
+ vertex -168.0408642106744 -76.18664256999706 616.5856406460553
+ vertex -18.327839784760627 183.78666399028273 616.3313708498986
+ vertex -18.0408642106749 183.62097856533347 616.5856406460551
+ endloop
+endfacet
+facet normal 0.8001031451912887 -0.4619397662556257 -0.3826834323650627
+ outer loop
+ vertex -18.686469973627858 183.99371922636468 615.6141104721642
+ vertex -168.54804388764688 -75.89382224696955 616.0000000000001
+ vertex -168.68646997362737 -75.81390190896586 615.6141104721642
+ endloop
+endfacet
+facet normal 0.8001031451912887 -0.4619397662556257 -0.3826834323650627
+ outer loop
+ vertex -168.54804388764688 -75.89382224696955 616.0000000000001
+ vertex -18.686469973627858 183.99371922636468 615.6141104721642
+ vertex -18.54804388764745 183.91379888836096 616.0
+ endloop
+endfacet
+facet normal 0.8586164364012763 -0.4957224306868808 0.1305261922200434
+ outer loop
+ vertex -168.68646997362765 -75.81390190896637 599.1858895278361
+ vertex -18.73368453370276 184.020978565333 599.6
+ vertex -168.73368453370225 -75.78664256999762 599.6000000000001
+ endloop
+endfacet
+facet normal 0.8586164364012763 -0.4957224306868808 0.1305261922200434
+ outer loop
+ vertex -18.73368453370276 184.020978565333 599.6
+ vertex -168.68646997362765 -75.81390190896637 599.1858895278361
+ vertex -18.68646997362817 183.99371922636422 599.185889527836
+ endloop
+endfacet
+facet normal 0.8001031451912762 -0.4619397662556186 -0.3826834323650973
+ outer loop
+ vertex -18.686469973628128 183.99371922636428 600.0141104721641
+ vertex -168.54804388764714 -75.89382224697005 600.4000000000002
+ vertex -168.68646997362762 -75.81390190896636 600.0141104721642
+ endloop
+endfacet
+facet normal 0.8001031451912762 -0.4619397662556186 -0.3826834323650973
+ outer loop
+ vertex -168.54804388764714 -75.89382224697005 600.4000000000002
+ vertex -18.686469973628128 183.99371922636428 600.0141104721641
+ vertex -18.548043887647626 183.91379888836056 600.4000000000001
+ endloop
+endfacet
+facet normal -0.8001031451913012 0.4619397662555992 -0.38268343236506847
+ outer loop
+ vertex -166.14804388764708 -77.27946289302508 600.4000000000002
+ vertex -16.009617801667087 182.44823790430183 600.014110472164
+ vertex -166.0096178016666 -77.35938323102881 600.0141104721641
+ endloop
+endfacet
+facet normal -0.8001031451913012 0.4619397662555992 -0.38268343236506847
+ outer loop
+ vertex -16.009617801667087 182.44823790430183 600.014110472164
+ vertex -166.14804388764708 -77.27946289302508 600.4000000000002
+ vertex -16.14804388764759 182.52815824230547 600.4000000000001
+ endloop
+endfacet
+facet normal 0.11303899832181014 -0.06526309611005923 -0.9914448613738089
+ outer loop
+ vertex -17.706674076514545 183.42803380141552 616.7454813220626
+ vertex -167.3480438876468 -76.58664256999705 616.8000000000002
+ vertex -167.70667407651402 -76.37958733391504 616.7454813220626
+ endloop
+endfacet
+facet normal 0.11303899832181014 -0.06526309611005923 -0.9914448613738089
+ outer loop
+ vertex -167.3480438876468 -76.58664256999705 616.8000000000002
+ vertex -17.706674076514545 183.42803380141552 616.7454813220626
+ vertex -17.348043887647314 183.2209785653335 616.8000000000001
+ endloop
+endfacet
+facet normal -0.11303899832184455 0.06526309610999596 -0.9914448613738092
+ outer loop
+ vertex -17.348043887647314 183.2209785653335 616.8000000000001
+ vertex -166.98941369877957 -76.79369780607902 616.7454813220626
+ vertex -167.3480438876468 -76.58664256999705 616.8000000000002
+ endloop
+endfacet
+facet normal -0.11303899832184455 0.06526309610999596 -0.9914448613738092
+ outer loop
+ vertex -166.98941369877957 -76.79369780607902 616.7454813220626
+ vertex -17.348043887647314 183.2209785653335 616.8000000000001
+ vertex -16.989413698780083 183.01392332925155 616.7454813220626
+ endloop
+endfacet
+facet normal 0.8001031451912916 -0.46193976625560496 0.38268343236508173
+ outer loop
+ vertex -18.54804388764774 183.91379888836042 598.8000000000001
+ vertex -168.68646997362765 -75.81390190896637 599.1858895278361
+ vertex -168.54804388764717 -75.89382224697007 598.8000000000002
+ endloop
+endfacet
+facet normal 0.8001031451912916 -0.46193976625560496 0.38268343236508173
+ outer loop
+ vertex -168.68646997362765 -75.81390190896637 599.1858895278361
+ vertex -18.54804388764774 183.91379888836042 598.8000000000001
+ vertex -18.68646997362817 183.99371922636422 599.185889527836
+ endloop
+endfacet
+facet normal 0.5272028623657087 -0.3043807145043233 0.7933533402912231
+ outer loop
+ vertex -168.04086421067473 -76.18664256999767 598.214359353945
+ vertex -18.327839784760943 183.78666399028216 598.4686291501016
+ vertex -168.32783978476044 -76.0209571450484 598.4686291501016
+ endloop
+endfacet
+facet normal 0.5272028623657087 -0.3043807145043233 0.7933533402912231
+ outer loop
+ vertex -18.327839784760943 183.78666399028216 598.4686291501016
+ vertex -168.04086421067473 -76.18664256999767 598.214359353945
+ vertex -18.04086421067524 183.6209785653329 598.2143593539449
+ endloop
+endfacet
+facet normal -0.5272028623657142 0.3043807145043265 -0.7933533402912182
+ outer loop
+ vertex -16.65522356461977 182.82097856533352 616.5856406460551
+ vertex -166.36824799053355 -77.15232799494626 616.3313708498986
+ vertex -166.65522356461926 -76.98664256999704 616.5856406460553
+ endloop
+endfacet
+facet normal -0.5272028623657142 0.3043807145043265 -0.7933533402912182
+ outer loop
+ vertex -166.36824799053355 -77.15232799494626 616.3313708498986
+ vertex -16.65522356461977 182.82097856533352 616.5856406460551
+ vertex -16.368247990534048 182.6552931403843 616.3313708498985
+ endloop
+endfacet
+facet normal -0.8001031451912762 0.4619397662556186 0.3826834323650973
+ outer loop
+ vertex -16.009617801667087 182.4482379043018 599.185889527836
+ vertex -166.1480438876471 -77.27946289302511 598.8000000000001
+ vertex -166.00961780166662 -77.35938323102883 599.1858895278361
+ endloop
+endfacet
+facet normal -0.8001031451912762 0.4619397662556186 0.3826834323650973
+ outer loop
+ vertex -166.1480438876471 -77.27946289302511 598.8000000000001
+ vertex -16.009617801667087 182.4482379043018 599.185889527836
+ vertex -16.14804388764763 182.52815824230544 598.8
+ endloop
+endfacet
+facet normal -0.8001031451912887 0.4619397662556257 0.3826834323650627
+ outer loop
+ vertex -16.009617801666884 182.44823790430226 614.785889527836
+ vertex -166.14804388764685 -77.27946289302463 614.4000000000001
+ vertex -166.00961780166637 -77.35938323102832 614.785889527836
+ endloop
+endfacet
+facet normal -0.8001031451912887 0.4619397662556257 0.3826834323650627
+ outer loop
+ vertex -166.14804388764685 -77.27946289302463 614.4000000000001
+ vertex -16.009617801666884 182.44823790430226 614.785889527836
+ vertex -16.148043887647408 182.52815824230586 614.4000000000001
+ endloop
+endfacet
+facet normal 0.6870641468694545 -0.39667667014561614 -0.6087614290087167
+ outer loop
+ vertex -18.54804388764745 183.91379888836096 616.0
+ vertex -168.32783978476013 -76.02095714504783 616.3313708498987
+ vertex -168.54804388764688 -75.89382224696955 616.0000000000001
+ endloop
+endfacet
+facet normal 0.6870641468694545 -0.39667667014561614 -0.6087614290087167
+ outer loop
+ vertex -168.32783978476013 -76.02095714504783 616.3313708498987
+ vertex -18.54804388764745 183.91379888836096 616.0
+ vertex -18.327839784760627 183.78666399028273 616.3313708498986
+ endloop
+endfacet
+facet normal 0.6870641468694428 -0.39667667014560937 -0.6087614290087343
+ outer loop
+ vertex -18.548043887647626 183.91379888836056 600.4000000000001
+ vertex -168.32783978476039 -76.02095714504833 600.7313708498987
+ vertex -168.54804388764714 -75.89382224697005 600.4000000000002
+ endloop
+endfacet
+facet normal 0.6870641468694428 -0.39667667014560937 -0.6087614290087343
+ outer loop
+ vertex -168.32783978476039 -76.02095714504833 600.7313708498987
+ vertex -18.548043887647626 183.91379888836056 600.4000000000001
+ vertex -18.32783978476092 183.78666399028225 600.7313708498986
+ endloop
+endfacet
+facet normal 0.858616436401279 -0.4957224306868712 -0.13052619222006182
+ outer loop
+ vertex -182.24368083273947 -67.9866425699975 615.2000000000002
+ vertex -32.19646627266537 191.79371922636432 615.6141104721642
+ vertex -182.19646627266485 -68.01390190896625 615.6141104721642
+ endloop
+endfacet
+facet normal 0.858616436401279 -0.4957224306868712 -0.13052619222006182
+ outer loop
+ vertex -32.19646627266537 191.79371922636432 615.6141104721642
+ vertex -182.24368083273947 -67.9866425699975 615.2000000000002
+ vertex -32.243680832740026 191.82097856533298 615.2
+ endloop
+endfacet
+facet normal -0.5272028623657087 0.3043807145043233 -0.7933533402912231
+ outer loop
+ vertex -30.165219863657242 190.6209785653331 616.5856406460551
+ vertex -179.878244289571 -69.35232799494665 616.3313708498987
+ vertex -180.16521986365672 -69.18664256999742 616.5856406460553
+ endloop
+endfacet
+facet normal -0.5272028623657087 0.3043807145043233 -0.7933533402912231
+ outer loop
+ vertex -179.878244289571 -69.35232799494665 616.3313708498987
+ vertex -30.165219863657242 190.6209785653331 616.5856406460551
+ vertex -29.87824428957154 190.4552931403839 616.3313708498986
+ endloop
+endfacet
+facet normal 0.331413574035631 -0.19134171618251528 0.9238795325112789
+ outer loop
+ vertex -167.7066740765141 -76.3795873339151 613.6545186779376
+ vertex -18.040864210674947 183.62097856533344 613.814359353945
+ vertex -168.0408642106745 -76.18664256999716 613.814359353945
+ endloop
+endfacet
+facet normal 0.331413574035631 -0.19134171618251528 0.9238795325112789
+ outer loop
+ vertex -18.040864210674947 183.62097856533344 613.814359353945
+ vertex -167.7066740765141 -76.3795873339151 613.6545186779376
+ vertex -17.70667407651468 183.42803380141538 613.6545186779375
+ endloop
+endfacet
+facet normal -0.5272028623656505 0.3043807145043517 0.7933533402912508
+ outer loop
+ vertex -179.87824428957106 -69.35232799494672 614.0686291501016
+ vertex -30.16521986365731 190.62097856533308 613.814359353945
+ vertex -180.1652198636568 -69.1866425699975 613.814359353945
+ endloop
+endfacet
+facet normal -0.5272028623656505 0.3043807145043517 0.7933533402912508
+ outer loop
+ vertex -30.16521986365731 190.62097856533308 613.814359353945
+ vertex -179.87824428957106 -69.35232799494672 614.0686291501016
+ vertex -29.878244289571587 190.45529314038384 614.0686291501015
+ endloop
+endfacet
+facet normal -0.5272028623656863 0.30438071450437804 0.7933533402912171
+ outer loop
+ vertex -166.3682479905336 -77.1523279949463 614.0686291501016
+ vertex -16.655223564619817 182.82097856533343 613.814359353945
+ vertex -166.65522356461935 -76.98664256999712 613.814359353945
+ endloop
+endfacet
+facet normal -0.5272028623656863 0.30438071450437804 0.7933533402912171
+ outer loop
+ vertex -16.655223564619817 182.82097856533343 613.814359353945
+ vertex -166.3682479905336 -77.1523279949463 614.0686291501016
+ vertex -16.368247990534094 182.65529314038423 614.0686291501015
+ endloop
+endfacet
+facet normal 0.6870641468694759 -0.39667667014558894 0.6087614290087102
+ outer loop
+ vertex -18.327839784760762 183.78666399028262 614.0686291501016
+ vertex -168.5480438876469 -75.89382224696958 614.4000000000001
+ vertex -168.3278397847602 -76.0209571450479 614.0686291501017
+ endloop
+endfacet
+facet normal 0.6870641468694759 -0.39667667014558894 0.6087614290087102
+ outer loop
+ vertex -168.5480438876469 -75.89382224696958 614.4000000000001
+ vertex -18.327839784760762 183.78666399028262 614.0686291501016
+ vertex -18.548043887647424 183.91379888836096 614.4000000000001
+ endloop
+endfacet
+facet normal 0.3314135740355987 -0.1913417161825699 -0.9238795325112792
+ outer loop
+ vertex -31.550860509712418 191.42097856533306 616.5856406460551
+ vertex -181.2166703755515 -68.57958733391541 616.7454813220627
+ vertex -181.55086050971187 -68.38664256999745 616.5856406460553
+ endloop
+endfacet
+facet normal 0.3314135740355987 -0.1913417161825699 -0.9238795325112792
+ outer loop
+ vertex -181.2166703755515 -68.57958733391541 616.7454813220627
+ vertex -31.550860509712418 191.42097856533306 616.5856406460551
+ vertex -31.21667037555206 191.22803380141514 616.7454813220626
+ endloop
+endfacet
+facet normal 0.6870641468694428 -0.39667667014560937 -0.6087614290087343
+ outer loop
+ vertex -32.05804018668489 191.71379888836057 616.0
+ vertex -181.83783608379758 -68.22095714504822 616.3313708498987
+ vertex -182.05804018668434 -68.09382224696995 616.0000000000001
+ endloop
+endfacet
+facet normal 0.6870641468694428 -0.39667667014560937 -0.6087614290087343
+ outer loop
+ vertex -181.83783608379758 -68.22095714504822 616.3313708498987
+ vertex -32.05804018668489 191.71379888836057 616.0
+ vertex -31.837836083798095 191.58666399028237 616.3313708498986
+ endloop
+endfacet
+facet normal -0.33141357403559235 0.19134171618249016 -0.923879532511298
+ outer loop
+ vertex -30.499409997817644 190.81392332925108 616.7454813220626
+ vertex -180.16521986365672 -69.18664256999742 616.5856406460553
+ vertex -180.49940999781703 -68.99369780607941 616.7454813220626
+ endloop
+endfacet
+facet normal -0.33141357403559235 0.19134171618249016 -0.923879532511298
+ outer loop
+ vertex -180.16521986365672 -69.18664256999742 616.5856406460553
+ vertex -30.499409997817644 190.81392332925108 616.7454813220626
+ vertex -30.165219863657242 190.6209785653331 616.5856406460551
+ endloop
+endfacet
+facet normal -0.11303899832180345 0.06526309611005678 0.9914448613738097
+ outer loop
+ vertex -166.98941369877966 -76.79369780607912 613.6545186779376
+ vertex -17.348043887647428 183.2209785653335 613.6
+ vertex -167.3480438876469 -76.58664256999711 613.6000000000001
+ endloop
+endfacet
+facet normal -0.11303899832180345 0.06526309611005678 0.9914448613738097
+ outer loop
+ vertex -17.348043887647428 183.2209785653335 613.6
+ vertex -166.98941369877966 -76.79369780607912 613.6545186779376
+ vertex -16.989413698780176 183.0139233292514 613.6545186779375
+ endloop
+endfacet
+facet normal -0.6870641468694699 0.39667667014557983 -0.608761429008723
+ outer loop
+ vertex -179.878244289571 -69.35232799494665 616.3313708498987
+ vertex -29.658040186684875 190.32815824230553 616.0
+ vertex -179.65804018668427 -69.47946289302497 616.0000000000001
+ endloop
+endfacet
+facet normal -0.6870641468694699 0.39667667014557983 -0.608761429008723
+ outer loop
+ vertex -29.658040186684875 190.32815824230553 616.0
+ vertex -179.878244289571 -69.35232799494665 616.3313708498987
+ vertex -29.87824428957154 190.4552931403839 616.3313708498986
+ endloop
+endfacet
+facet normal -0.8001031451912916 0.46193976625560496 -0.38268343236508173
+ outer loop
+ vertex -179.65804018668427 -69.47946289302497 616.0000000000001
+ vertex -29.51961410070431 190.24823790430187 615.6141104721642
+ vertex -179.51961410070382 -69.55938323102869 615.6141104721642
+ endloop
+endfacet
+facet normal -0.8001031451912916 0.46193976625560496 -0.38268343236508173
+ outer loop
+ vertex -29.51961410070431 190.24823790430187 615.6141104721642
+ vertex -179.65804018668427 -69.47946289302497 616.0000000000001
+ vertex -29.658040186684875 190.32815824230553 616.0
+ endloop
+endfacet
+facet normal -0.8586164364012763 0.4957224306868808 -0.1305261922200434
+ outer loop
+ vertex -29.51961410070431 190.24823790430187 615.6141104721642
+ vertex -179.4723995406292 -69.58664256999745 615.2000000000002
+ vertex -179.51961410070382 -69.55938323102869 615.6141104721642
+ endloop
+endfacet
+facet normal -0.8586164364012763 0.4957224306868808 -0.1305261922200434
+ outer loop
+ vertex -179.4723995406292 -69.58664256999745 615.2000000000002
+ vertex -29.51961410070431 190.24823790430187 615.6141104721642
+ vertex -29.472399540629766 190.22097856533307 615.2
+ endloop
+endfacet
+facet normal -0.6870641468694373 0.39667667014560615 0.6087614290087427
+ outer loop
+ vertex -16.148043887647408 182.52815824230586 614.4000000000001
+ vertex -166.3682479905336 -77.1523279949463 614.0686291501016
+ vertex -166.14804388764685 -77.27946289302463 614.4000000000001
+ endloop
+endfacet
+facet normal -0.6870641468694373 0.39667667014560615 0.6087614290087427
+ outer loop
+ vertex -166.3682479905336 -77.1523279949463 614.0686291501016
+ vertex -16.148043887647408 182.52815824230586 614.4000000000001
+ vertex -16.368247990534094 182.65529314038423 614.0686291501015
+ endloop
+endfacet
+facet normal 0.85861643640128 -0.4957224306868831 0.13052619222001063
+ outer loop
+ vertex -18.6864699736279 183.99371922636473 614.785889527836
+ vertex -168.73368453370196 -75.78664256999716 615.2000000000002
+ vertex -168.6864699736274 -75.81390190896589 614.785889527836
+ endloop
+endfacet
+facet normal 0.85861643640128 -0.4957224306868831 0.13052619222001063
+ outer loop
+ vertex -168.73368453370196 -75.78664256999716 615.2000000000002
+ vertex -18.6864699736279 183.99371922636473 614.785889527836
+ vertex -18.733684533702558 184.0209785653334 615.2
+ endloop
+endfacet
+facet normal 0.33141357403559024 -0.19134171618248894 0.923879532511299
+ outer loop
+ vertex -181.21667037555162 -68.57958733391551 613.6545186779376
+ vertex -31.550860509712486 191.42097856533303 613.814359353945
+ vertex -181.55086050971195 -68.38664256999753 613.814359353945
+ endloop
+endfacet
+facet normal 0.33141357403559024 -0.19134171618248894 0.923879532511299
+ outer loop
+ vertex -31.550860509712486 191.42097856533303 613.814359353945
+ vertex -181.21667037555162 -68.57958733391551 613.6545186779376
+ vertex -31.216670375552127 191.22803380141505 613.6545186779375
+ endloop
+endfacet
+facet normal 0.6870641468694699 -0.39667667014557983 0.608761429008723
+ outer loop
+ vertex -31.83783608379821 191.58666399028218 614.0686291501016
+ vertex -182.0580401866844 -68.09382224696996 614.4000000000001
+ vertex -181.83783608379764 -68.22095714504829 614.0686291501017
+ endloop
+endfacet
+facet normal 0.6870641468694699 -0.39667667014557983 0.608761429008723
+ outer loop
+ vertex -182.0580401866844 -68.09382224696996 614.4000000000001
+ vertex -31.83783608379821 191.58666399028218 614.0686291501016
+ vertex -32.05804018668489 191.71379888836057 614.4000000000001
+ endloop
+endfacet
+facet normal -0.11303899832184437 0.06526309610999445 -0.9914448613738092
+ outer loop
+ vertex -30.858040186684853 191.02097856533317 616.8000000000001
+ vertex -180.49940999781703 -68.99369780607941 616.7454813220626
+ vertex -180.85804018668432 -68.78664256999744 616.8000000000002
+ endloop
+endfacet
+facet normal -0.11303899832184437 0.06526309610999445 -0.9914448613738092
+ outer loop
+ vertex -180.49940999781703 -68.99369780607941 616.7454813220626
+ vertex -30.858040186684853 191.02097856533317 616.8000000000001
+ vertex -30.499409997817644 190.81392332925108 616.7454813220626
+ endloop
+endfacet
+facet normal -0.6870641468694428 0.39667667014560937 0.6087614290087343
+ outer loop
+ vertex -29.658040186684833 190.32815824230553 614.4000000000001
+ vertex -179.87824428957106 -69.35232799494672 614.0686291501016
+ vertex -179.65804018668433 -69.47946289302502 614.4000000000001
+ endloop
+endfacet
+facet normal -0.6870641468694428 0.39667667014560937 0.6087614290087343
+ outer loop
+ vertex -179.87824428957106 -69.35232799494672 614.0686291501016
+ vertex -29.658040186684833 190.32815824230553 614.4000000000001
+ vertex -29.878244289571587 190.45529314038384 614.0686291501015
+ endloop
+endfacet
+facet normal 0.5272028623657163 -0.3043807145043165 0.7933533402912205
+ outer loop
+ vertex -181.55086050971195 -68.38664256999753 613.814359353945
+ vertex -31.83783608379821 191.58666399028218 614.0686291501016
+ vertex -181.83783608379764 -68.22095714504829 614.0686291501017
+ endloop
+endfacet
+facet normal 0.5272028623657163 -0.3043807145043165 0.7933533402912205
+ outer loop
+ vertex -31.83783608379821 191.58666399028218 614.0686291501016
+ vertex -181.55086050971195 -68.38664256999753 613.814359353945
+ vertex -31.550860509712486 191.42097856533303 613.814359353945
+ endloop
+endfacet
+facet normal -0.33141357403555843 0.19134171618255227 0.9238795325112973
+ outer loop
+ vertex -166.65522356461935 -76.98664256999712 613.814359353945
+ vertex -16.989413698780176 183.0139233292514 613.6545186779375
+ vertex -166.98941369877966 -76.79369780607912 613.6545186779376
+ endloop
+endfacet
+facet normal -0.33141357403555843 0.19134171618255227 0.9238795325112973
+ outer loop
+ vertex -16.989413698780176 183.0139233292514 613.6545186779375
+ vertex -166.65522356461935 -76.98664256999712 613.814359353945
+ vertex -16.655223564619817 182.82097856533343 613.814359353945
+ endloop
+endfacet
+facet normal 0.5272028623657142 -0.3043807145043265 0.7933533402912182
+ outer loop
+ vertex -168.0408642106745 -76.18664256999716 613.814359353945
+ vertex -18.327839784760762 183.78666399028262 614.0686291501016
+ vertex -168.3278397847602 -76.0209571450479 614.0686291501017
+ endloop
+endfacet
+facet normal 0.5272028623657142 -0.3043807145043265 0.7933533402912182
+ outer loop
+ vertex -18.327839784760762 183.78666399028262 614.0686291501016
+ vertex -168.0408642106745 -76.18664256999716 613.814359353945
+ vertex -18.040864210674947 183.62097856533344 613.814359353945
+ endloop
+endfacet
+facet normal 0.8001031451912762 -0.4619397662556186 -0.3826834323650973
+ outer loop
+ vertex -32.19646627266537 191.79371922636432 615.6141104721642
+ vertex -182.05804018668434 -68.09382224696995 616.0000000000001
+ vertex -182.19646627266485 -68.01390190896625 615.6141104721642
+ endloop
+endfacet
+facet normal 0.8001031451912762 -0.4619397662556186 -0.3826834323650973
+ outer loop
+ vertex -182.05804018668434 -68.09382224696995 616.0000000000001
+ vertex -32.19646627266537 191.79371922636432 615.6141104721642
+ vertex -32.05804018668489 191.71379888836057 616.0
+ endloop
+endfacet
+facet normal -0.858616436401279 0.4957224306868712 0.13052619222006182
+ outer loop
+ vertex -29.472399540629766 190.22097856533307 615.2
+ vertex -179.51961410070382 -69.5593832310287 614.785889527836
+ vertex -179.4723995406292 -69.58664256999745 615.2000000000002
+ endloop
+endfacet
+facet normal -0.858616436401279 0.4957224306868712 0.13052619222006182
+ outer loop
+ vertex -179.51961410070382 -69.5593832310287 614.785889527836
+ vertex -29.472399540629766 190.22097856533307 615.2
+ vertex -29.51961410070433 190.24823790430182 614.785889527836
+ endloop
+endfacet
+facet normal 0.5272028623656435 -0.3043807145043646 -0.7933533402912507
+ outer loop
+ vertex -31.837836083798095 191.58666399028237 616.3313708498986
+ vertex -181.55086050971187 -68.38664256999745 616.5856406460553
+ vertex -181.83783608379758 -68.22095714504822 616.3313708498987
+ endloop
+endfacet
+facet normal 0.5272028623656435 -0.3043807145043646 -0.7933533402912507
+ outer loop
+ vertex -181.55086050971187 -68.38664256999745 616.5856406460553
+ vertex -31.837836083798095 191.58666399028237 616.3313708498986
+ vertex -31.550860509712418 191.42097856533306 616.5856406460551
+ endloop
+endfacet
+facet normal 0.11303899832184455 -0.06526309610999596 0.9914448613738092
+ outer loop
+ vertex -180.85804018668438 -68.78664256999751 613.6000000000001
+ vertex -31.216670375552127 191.22803380141505 613.6545186779375
+ vertex -181.21667037555162 -68.57958733391551 613.6545186779376
+ endloop
+endfacet
+facet normal 0.11303899832184455 -0.06526309610999596 0.9914448613738092
+ outer loop
+ vertex -31.216670375552127 191.22803380141505 613.6545186779375
+ vertex -180.85804018668438 -68.78664256999751 613.6000000000001
+ vertex -30.858040186684896 191.02097856533302 613.6
+ endloop
+endfacet
+facet normal 0.8586164364012764 -0.49572243068688093 0.13052619222004297
+ outer loop
+ vertex -32.19646627266537 191.79371922636426 614.785889527836
+ vertex -182.24368083273947 -67.9866425699975 615.2000000000002
+ vertex -182.19646627266488 -68.01390190896626 614.7858895278362
+ endloop
+endfacet
+facet normal 0.8586164364012764 -0.49572243068688093 0.13052619222004297
+ outer loop
+ vertex -182.24368083273947 -67.9866425699975 615.2000000000002
+ vertex -32.19646627266537 191.79371922636426 614.785889527836
+ vertex -32.243680832740026 191.82097856533298 615.2
+ endloop
+endfacet
+facet normal 0.8001031451912812 -0.46193976625559896 0.3826834323651106
+ outer loop
+ vertex -168.5480438876469 -75.89382224696958 614.4000000000001
+ vertex -18.6864699736279 183.99371922636473 614.785889527836
+ vertex -168.6864699736274 -75.81390190896589 614.785889527836
+ endloop
+endfacet
+facet normal 0.8001031451912812 -0.46193976625559896 0.3826834323651106
+ outer loop
+ vertex -18.6864699736279 183.99371922636473 614.785889527836
+ vertex -168.5480438876469 -75.89382224696958 614.4000000000001
+ vertex -18.548043887647424 183.91379888836096 614.4000000000001
+ endloop
+endfacet
+facet normal 0.11303899832176335 -0.06526309611003223 -0.9914448613738159
+ outer loop
+ vertex -31.21667037555206 191.22803380141514 616.7454813220626
+ vertex -180.85804018668432 -68.78664256999744 616.8000000000002
+ vertex -181.2166703755515 -68.57958733391541 616.7454813220627
+ endloop
+endfacet
+facet normal 0.11303899832176335 -0.06526309611003223 -0.9914448613738159
+ outer loop
+ vertex -180.85804018668432 -68.78664256999744 616.8000000000002
+ vertex -31.21667037555206 191.22803380141514 616.7454813220626
+ vertex -30.858040186684853 191.02097856533317 616.8000000000001
+ endloop
+endfacet
+facet normal 0.8001031451913012 -0.4619397662555992 0.38268343236506847
+ outer loop
+ vertex -32.05804018668489 191.71379888836057 614.4000000000001
+ vertex -182.19646627266488 -68.01390190896626 614.7858895278362
+ vertex -182.0580401866844 -68.09382224696996 614.4000000000001
+ endloop
+endfacet
+facet normal 0.8001031451913012 -0.4619397662555992 0.38268343236506847
+ outer loop
+ vertex -182.19646627266488 -68.01390190896626 614.7858895278362
+ vertex -32.05804018668489 191.71379888836057 614.4000000000001
+ vertex -32.19646627266537 191.79371922636426 614.785889527836
+ endloop
+endfacet
+facet normal -0.8001031451912762 0.4619397662556186 0.3826834323650973
+ outer loop
+ vertex -29.51961410070433 190.24823790430182 614.785889527836
+ vertex -179.65804018668433 -69.47946289302502 614.4000000000001
+ vertex -179.51961410070382 -69.5593832310287 614.785889527836
+ endloop
+endfacet
+facet normal -0.8001031451912762 0.4619397662556186 0.3826834323650973
+ outer loop
+ vertex -179.65804018668433 -69.47946289302502 614.4000000000001
+ vertex -29.51961410070433 190.24823790430182 614.785889527836
+ vertex -29.658040186684833 190.32815824230553 614.4000000000001
+ endloop
+endfacet
+facet normal 0.11303899832184455 -0.06526309610999596 0.9914448613738092
+ outer loop
+ vertex -167.3480438876469 -76.58664256999711 613.6000000000001
+ vertex -17.70667407651468 183.42803380141538 613.6545186779375
+ vertex -167.7066740765141 -76.3795873339151 613.6545186779376
+ endloop
+endfacet
+facet normal 0.11303899832184455 -0.06526309610999596 0.9914448613738092
+ outer loop
+ vertex -17.70667407651468 183.42803380141538 613.6545186779375
+ vertex -167.3480438876469 -76.58664256999711 613.6000000000001
+ vertex -17.348043887647428 183.2209785653335 613.6
+ endloop
+endfacet
+facet normal -0.8001031451912812 0.46193976625559896 -0.3826834323651106
+ outer loop
+ vertex -29.65804018668508 190.3281582423051 600.4000000000001
+ vertex -179.51961410070408 -69.55938323102919 600.0141104721642
+ vertex -179.65804018668462 -69.47946289302546 600.4000000000002
+ endloop
+endfacet
+facet normal -0.8001031451912812 0.46193976625559896 -0.3826834323651106
+ outer loop
+ vertex -179.51961410070408 -69.55938323102919 600.0141104721642
+ vertex -29.65804018668508 190.3281582423051 600.4000000000001
+ vertex -29.51961410070458 190.24823790430136 600.0141104721641
+ endloop
+endfacet
+facet normal -0.85861643640128 0.4957224306868831 -0.13052619222001063
+ outer loop
+ vertex -29.51961410070458 190.24823790430136 600.0141104721641
+ vertex -179.47239954062948 -69.58664256999793 599.6000000000001
+ vertex -179.51961410070408 -69.55938323102919 600.0141104721642
+ endloop
+endfacet
+facet normal -0.85861643640128 0.4957224306868831 -0.13052619222001063
+ outer loop
+ vertex -179.47239954062948 -69.58664256999793 599.6000000000001
+ vertex -29.51961410070458 190.24823790430136 600.0141104721641
+ vertex -29.472399540629993 190.22097856533262 599.6
+ endloop
+endfacet
+facet normal -0.8001031451912887 0.4619397662556257 0.3826834323650627
+ outer loop
+ vertex -29.519614100704626 190.24823790430136 599.185889527836
+ vertex -179.65804018668462 -69.4794628930255 598.8000000000002
+ vertex -179.5196141007041 -69.5593832310292 599.1858895278361
+ endloop
+endfacet
+facet normal -0.8001031451912887 0.4619397662556257 0.3826834323650627
+ outer loop
+ vertex -179.65804018668462 -69.4794628930255 598.8000000000002
+ vertex -29.519614100704626 190.24823790430136 599.185889527836
+ vertex -29.65804018668515 190.32815824230505 598.8000000000001
+ endloop
+endfacet
+facet normal -0.858616436401279 0.4957224306868712 0.13052619222006182
+ outer loop
+ vertex -29.472399540629993 190.22097856533262 599.6
+ vertex -179.5196141007041 -69.5593832310292 599.1858895278361
+ vertex -179.47239954062948 -69.58664256999793 599.6000000000001
+ endloop
+endfacet
+facet normal -0.858616436401279 0.4957224306868712 0.13052619222006182
+ outer loop
+ vertex -179.5196141007041 -69.5593832310292 599.1858895278361
+ vertex -29.472399540629993 190.22097856533262 599.6
+ vertex -29.519614100704626 190.24823790430136 599.185889527836
+ endloop
+endfacet
+facet normal -0.11303899832176201 0.06526309611003285 0.991444861373816
+ outer loop
+ vertex -180.4994099978171 -68.99369780607952 613.6545186779376
+ vertex -30.858040186684896 191.02097856533302 613.6
+ vertex -180.85804018668438 -68.78664256999751 613.6000000000001
+ endloop
+endfacet
+facet normal -0.11303899832176201 0.06526309611003285 0.991444861373816
+ outer loop
+ vertex -30.858040186684896 191.02097856533302 613.6
+ vertex -180.4994099978171 -68.99369780607952 613.6545186779376
+ vertex -30.499409997817644 190.81392332925108 613.6545186779375
+ endloop
+endfacet
+facet normal -0.11303899832181014 0.06526309611005923 0.9914448613738089
+ outer loop
+ vertex -180.49940999781742 -68.99369780607998 598.0545186779377
+ vertex -30.85804018668517 191.02097856533263 598.0000000000001
+ vertex -180.85804018668463 -68.786642569998 598.0000000000001
+ endloop
+endfacet
+facet normal -0.11303899832181014 0.06526309611005923 0.9914448613738089
+ outer loop
+ vertex -30.85804018668517 191.02097856533263 598.0000000000001
+ vertex -180.49940999781742 -68.99369780607998 598.0545186779377
+ vertex -30.49940999781794 190.81392332925054 598.0545186779376
+ endloop
+endfacet
+facet normal 0.85861643640128 -0.49572243068688304 0.13052619222001038
+ outer loop
+ vertex -32.19646627266567 191.7937192263638 599.185889527836
+ vertex -182.24368083273973 -67.986642569998 599.6000000000001
+ vertex -182.19646627266513 -68.01390190896676 599.1858895278361
+ endloop
+endfacet
+facet normal 0.85861643640128 -0.49572243068688304 0.13052619222001038
+ outer loop
+ vertex -182.24368083273973 -67.986642569998 599.6000000000001
+ vertex -32.19646627266567 191.7937192263638 599.185889527836
+ vertex -32.24368083274032 191.82097856533252 599.6
+ endloop
+endfacet
+facet normal 0.6870641468694346 -0.3966766701456103 -0.6087614290087431
+ outer loop
+ vertex -32.05804018668521 191.7137988883601 600.4000000000001
+ vertex -181.83783608379784 -68.2209571450487 600.7313708498987
+ vertex -182.05804018668462 -68.09382224697045 600.4000000000002
+ endloop
+endfacet
+facet normal 0.6870641468694346 -0.3966766701456103 -0.6087614290087431
+ outer loop
+ vertex -181.83783608379784 -68.2209571450487 600.7313708498987
+ vertex -32.05804018668521 191.7137988883601 600.4000000000001
+ vertex -31.83783608379839 191.58666399028183 600.7313708498986
+ endloop
+endfacet
+facet normal -0.3314135740355431 0.1913417161825406 0.9238795325113052
+ outer loop
+ vertex -180.1652198636571 -69.186642569998 598.214359353945
+ vertex -30.49940999781794 190.81392332925054 598.0545186779376
+ vertex -180.49940999781742 -68.99369780607998 598.0545186779377
+ endloop
+endfacet
+facet normal -0.3314135740355431 0.1913417161825406 0.9238795325113052
+ outer loop
+ vertex -30.49940999781794 190.81392332925054 598.0545186779376
+ vertex -180.1652198636571 -69.186642569998 598.214359353945
+ vertex -30.16521986365758 190.62097856533256 598.2143593539449
+ endloop
+endfacet
+facet normal 0.5272028623656863 -0.30438071450437804 -0.7933533402912171
+ outer loop
+ vertex -31.83783608379839 191.58666399028183 600.7313708498986
+ vertex -181.55086050971215 -68.38664256999796 600.9856406460553
+ vertex -181.83783608379784 -68.2209571450487 600.7313708498987
+ endloop
+endfacet
+facet normal 0.5272028623656863 -0.30438071450437804 -0.7933533402912171
+ outer loop
+ vertex -181.55086050971215 -68.38664256999796 600.9856406460553
+ vertex -31.83783608379839 191.58666399028183 600.7313708498986
+ vertex -31.550860509712663 191.42097856533266 600.9856406460552
+ endloop
+endfacet
+facet normal 0.5272028623656848 -0.30438071450430954 0.7933533402912443
+ outer loop
+ vertex -181.55086050971227 -68.38664256999803 598.214359353945
+ vertex -31.837836083798503 191.58666399028175 598.4686291501016
+ vertex -181.83783608379792 -68.22095714504879 598.4686291501016
+ endloop
+endfacet
+facet normal 0.5272028623656848 -0.30438071450430954 0.7933533402912443
+ outer loop
+ vertex -31.837836083798503 191.58666399028175 598.4686291501016
+ vertex -181.55086050971227 -68.38664256999803 598.214359353945
+ vertex -31.55086050971271 191.42097856533258 598.2143593539449
+ endloop
+endfacet
+facet normal 0.11303899832180345 -0.06526309611005678 -0.9914448613738097
+ outer loop
+ vertex -31.216670375552397 191.2280338014146 601.1454813220626
+ vertex -180.85804018668452 -68.7866425699979 601.2000000000002
+ vertex -181.2166703755518 -68.57958733391588 601.1454813220627
+ endloop
+endfacet
+facet normal 0.11303899832180345 -0.06526309611005678 -0.9914448613738097
+ outer loop
+ vertex -180.85804018668452 -68.7866425699979 601.2000000000002
+ vertex -31.216670375552397 191.2280338014146 601.1454813220626
+ vertex -30.858040186685123 191.02097856533257 601.2
+ endloop
+endfacet
+facet normal -0.5272028623657142 0.3043807145043265 -0.7933533402912182
+ outer loop
+ vertex -30.165219863657512 190.6209785653327 600.9856406460552
+ vertex -179.87824428957128 -69.35232799494715 600.7313708498986
+ vertex -180.165219863657 -69.18664256999789 600.9856406460553
+ endloop
+endfacet
+facet normal -0.5272028623657142 0.3043807145043265 -0.7933533402912182
+ outer loop
+ vertex -179.87824428957128 -69.35232799494715 600.7313708498986
+ vertex -30.165219863657512 190.6209785653327 600.9856406460552
+ vertex -29.878244289571832 190.4552931403834 600.7313708498986
+ endloop
+endfacet
+facet normal -0.6870641468694759 0.39667667014558894 -0.6087614290087102
+ outer loop
+ vertex -179.87824428957128 -69.35232799494715 600.7313708498986
+ vertex -29.65804018668508 190.3281582423051 600.4000000000001
+ vertex -179.65804018668462 -69.47946289302546 600.4000000000002
+ endloop
+endfacet
+facet normal -0.6870641468694759 0.39667667014558894 -0.6087614290087102
+ outer loop
+ vertex -29.65804018668508 190.3281582423051 600.4000000000001
+ vertex -179.87824428957128 -69.35232799494715 600.7313708498986
+ vertex -29.878244289571832 190.4552931403834 600.7313708498986
+ endloop
+endfacet
+facet normal 0.6870641468695006 -0.39667667014558633 0.608761429008684
+ outer loop
+ vertex -31.837836083798503 191.58666399028175 598.4686291501016
+ vertex -182.05804018668465 -68.09382224697046 598.8000000000002
+ vertex -181.83783608379792 -68.22095714504879 598.4686291501016
+ endloop
+endfacet
+facet normal 0.6870641468695006 -0.39667667014558633 0.608761429008684
+ outer loop
+ vertex -182.05804018668465 -68.09382224697046 598.8000000000002
+ vertex -31.837836083798503 191.58666399028175 598.4686291501016
+ vertex -32.05804018668523 191.71379888836003 598.8000000000001
+ endloop
+endfacet
+facet normal 0.3314135740356312 -0.1913417161825154 0.9238795325112787
+ outer loop
+ vertex -181.21667037555187 -68.57958733391598 598.0545186779377
+ vertex -31.55086050971271 191.42097856533258 598.2143593539449
+ vertex -181.55086050971227 -68.38664256999803 598.214359353945
+ endloop
+endfacet
+facet normal 0.3314135740356312 -0.1913417161825154 0.9238795325112787
+ outer loop
+ vertex -31.55086050971271 191.42097856533258 598.2143593539449
+ vertex -181.21667037555187 -68.57958733391598 598.0545186779377
+ vertex -31.216670375552397 191.22803380141454 598.0545186779376
+ endloop
+endfacet
+facet normal -0.5272028623656586 0.30438071450435644 0.7933533402912438
+ outer loop
+ vertex -179.87824428957134 -69.35232799494719 598.4686291501016
+ vertex -30.16521986365758 190.62097856533256 598.2143593539449
+ vertex -180.1652198636571 -69.186642569998 598.214359353945
+ endloop
+endfacet
+facet normal -0.5272028623656586 0.30438071450435644 0.7933533402912438
+ outer loop
+ vertex -30.16521986365758 190.62097856533256 598.2143593539449
+ vertex -179.87824428957134 -69.35232799494719 598.4686291501016
+ vertex -29.878244289571857 190.45529314038336 598.4686291501016
+ endloop
+endfacet
+facet normal 0.8001031451912812 -0.461939766255599 0.38268343236511043
+ outer loop
+ vertex -182.05804018668465 -68.09382224697046 598.8000000000002
+ vertex -32.19646627266567 191.7937192263638 599.185889527836
+ vertex -182.19646627266513 -68.01390190896676 599.1858895278361
+ endloop
+endfacet
+facet normal 0.8001031451912812 -0.461939766255599 0.38268343236511043
+ outer loop
+ vertex -32.19646627266567 191.7937192263638 599.185889527836
+ vertex -182.05804018668465 -68.09382224697046 598.8000000000002
+ vertex -32.05804018668523 191.71379888836003 598.8000000000001
+ endloop
+endfacet
+facet normal 0.8001031451912887 -0.4619397662556257 -0.3826834323650627
+ outer loop
+ vertex -182.1964662726651 -68.01390190896674 600.0141104721642
+ vertex -32.05804018668521 191.7137988883601 600.4000000000001
+ vertex -182.05804018668462 -68.09382224697045 600.4000000000002
+ endloop
+endfacet
+facet normal 0.8001031451912887 -0.4619397662556257 -0.3826834323650627
+ outer loop
+ vertex -32.05804018668521 191.7137988883601 600.4000000000001
+ vertex -182.1964662726651 -68.01390190896674 600.0141104721642
+ vertex -32.19646627266562 191.79371922636386 600.0141104721641
+ endloop
+endfacet
+facet normal -0.3314135740355987 0.1913417161825699 0.9238795325112792
+ outer loop
+ vertex -180.1652198636568 -69.1866425699975 613.814359353945
+ vertex -30.499409997817644 190.81392332925108 613.6545186779375
+ vertex -180.4994099978171 -68.99369780607952 613.6545186779376
+ endloop
+endfacet
+facet normal -0.3314135740355987 0.1913417161825699 0.9238795325112792
+ outer loop
+ vertex -30.499409997817644 190.81392332925108 613.6545186779375
+ vertex -180.1652198636568 -69.1866425699975 613.814359353945
+ vertex -30.16521986365731 190.62097856533308 613.814359353945
+ endloop
+endfacet
+facet normal -0.6870641468694545 0.39667667014561614 0.6087614290087167
+ outer loop
+ vertex -29.65804018668515 190.32815824230505 598.8000000000001
+ vertex -179.87824428957134 -69.35232799494719 598.4686291501016
+ vertex -179.65804018668462 -69.4794628930255 598.8000000000002
+ endloop
+endfacet
+facet normal -0.6870641468694545 0.39667667014561614 0.6087614290087167
+ outer loop
+ vertex -179.87824428957134 -69.35232799494719 598.4686291501016
+ vertex -29.65804018668515 190.32815824230505 598.8000000000001
+ vertex -29.878244289571857 190.45529314038336 598.4686291501016
+ endloop
+endfacet
+facet normal 0.11303899832184455 -0.06526309610999596 0.9914448613738092
+ outer loop
+ vertex -180.85804018668463 -68.786642569998 598.0000000000001
+ vertex -31.216670375552397 191.22803380141454 598.0545186779376
+ vertex -181.21667037555187 -68.57958733391598 598.0545186779377
+ endloop
+endfacet
+facet normal 0.11303899832184455 -0.06526309610999596 0.9914448613738092
+ outer loop
+ vertex -31.216670375552397 191.22803380141454 598.0545186779376
+ vertex -180.85804018668463 -68.786642569998 598.0000000000001
+ vertex -30.85804018668517 191.02097856533263 598.0000000000001
+ endloop
+endfacet
+facet normal 0.33141357403555843 -0.19134171618255227 -0.9238795325112973
+ outer loop
+ vertex -31.550860509712663 191.42097856533266 600.9856406460552
+ vertex -181.2166703755518 -68.57958733391588 601.1454813220627
+ vertex -181.55086050971215 -68.38664256999796 600.9856406460553
+ endloop
+endfacet
+facet normal 0.33141357403555843 -0.19134171618255227 -0.9238795325112973
+ outer loop
+ vertex -181.2166703755518 -68.57958733391588 601.1454813220627
+ vertex -31.550860509712663 191.42097856533266 600.9856406460552
+ vertex -31.216670375552397 191.2280338014146 601.1454813220626
+ endloop
+endfacet
+facet normal -0.331413574035631 0.19134171618251528 -0.9238795325112789
+ outer loop
+ vertex -30.499409997817846 190.81392332925068 601.1454813220626
+ vertex -180.165219863657 -69.18664256999789 600.9856406460553
+ vertex -180.49940999781734 -68.99369780607992 601.1454813220627
+ endloop
+endfacet
+facet normal -0.331413574035631 0.19134171618251528 -0.9238795325112789
+ outer loop
+ vertex -180.165219863657 -69.18664256999789 600.9856406460553
+ vertex -30.499409997817846 190.81392332925068 601.1454813220626
+ vertex -30.165219863657512 190.6209785653327 600.9856406460552
+ endloop
+endfacet
+facet normal 0.858616436401279 -0.4957224306868712 -0.130526192220062
+ outer loop
+ vertex -182.24368083273973 -67.986642569998 599.6000000000001
+ vertex -32.19646627266562 191.79371922636386 600.0141104721641
+ vertex -182.1964662726651 -68.01390190896674 600.0141104721642
+ endloop
+endfacet
+facet normal 0.858616436401279 -0.4957224306868712 -0.130526192220062
+ outer loop
+ vertex -32.19646627266562 191.79371922636386 600.0141104721641
+ vertex -182.24368083273973 -67.986642569998 599.6000000000001
+ vertex -32.24368083274032 191.82097856533252 599.6
+ endloop
+endfacet
+facet normal -0.11303899832184455 0.06526309610999596 -0.9914448613738092
+ outer loop
+ vertex -30.858040186685123 191.02097856533257 601.2
+ vertex -180.49940999781734 -68.99369780607992 601.1454813220627
+ vertex -180.85804018668452 -68.7866425699979 601.2000000000002
+ endloop
+endfacet
+facet normal -0.11303899832184455 0.06526309610999596 -0.9914448613738092
+ outer loop
+ vertex -180.49940999781734 -68.99369780607992 601.1454813220627
+ vertex -30.858040186685123 191.02097856533257 601.2
+ vertex -30.499409997817846 190.81392332925068 601.1454813220626
+ endloop
+endfacet
+facet normal -0.8586164364012798 0.49572243068687166 0.13052619222005538
+ outer loop
+ vertex -32.73378697496399 192.1039414784776 616.6588190451026
+ vertex -182.76329607501015 -67.68664256999749 616.4000000000001
+ vertex -182.7337869749635 -67.70367965685296 616.6588190451026
+ endloop
+endfacet
+facet normal -0.8586164364012798 0.49572243068687166 0.13052619222005538
+ outer loop
+ vertex -182.76329607501015 -67.68664256999749 616.4000000000001
+ vertex -32.73378697496399 192.1039414784776 616.6588190451026
+ vertex -32.76329607501063 192.12097856533305 616.4000000000001
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 1.5003536199769236e-15
+ outer loop
+ vertex -182.76329607501015 -67.68664256999749 616.4000000000001
+ vertex -32.7632960750107 192.12097856533296 611.2
+ vertex -182.76329607501023 -67.68664256999767 611.2000000000002
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 1.5003536199769236e-15
+ outer loop
+ vertex -32.7632960750107 192.12097856533296 611.2
+ vertex -182.76329607501015 -67.68664256999749 616.4000000000001
+ vertex -32.76329607501063 192.12097856533305 616.4000000000001
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -4.464960093105168e-15
+ outer loop
+ vertex -32.41688591349694 191.92097856533292 611.2
+ vertex -182.41688591349643 -67.88664256999766 610.8000000000002
+ vertex -182.41688591349643 -67.88664256999765 611.2000000000002
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -4.464960093105168e-15
+ outer loop
+ vertex -182.41688591349643 -67.88664256999766 610.8000000000002
+ vertex -32.41688591349694 191.92097856533292 611.2
+ vertex -32.416885913497005 191.92097856533286 610.8000000000001
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -31.204450348198726 191.22097856533298 613.0000000000001
+ vertex -179.44268224691524 -69.60379985752284 613.0000000000002
+ vertex -181.20445034819815 -68.58664256999758 613.0000000000002
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -179.44268224691524 -69.60379985752284 613.0000000000002
+ vertex -31.204450348198726 191.22097856533298 613.0000000000001
+ vertex -29.442682246915748 190.20382127780772 613.0000000000001
+ endloop
+endfacet
+facet normal -0.8001031451912832 0.46193976625562266 0.3826834323650778
+ outer loop
+ vertex -32.64727067122619 192.0539912672253 616.9
+ vertex -182.7337869749635 -67.70367965685296 616.6588190451026
+ vertex -182.64727067122567 -67.75362986810526 616.9000000000001
+ endloop
+endfacet
+facet normal -0.8001031451912832 0.46193976625562266 0.3826834323650778
+ outer loop
+ vertex -182.7337869749635 -67.70367965685296 616.6588190451026
+ vertex -32.64727067122619 192.0539912672253 616.9
+ vertex -32.73378697496399 192.1039414784776 616.6588190451026
+ endloop
+endfacet
+facet normal -0.6123724356958127 0.353553390593238 -0.7071067811865498
+ outer loop
+ vertex -29.442682246915748 190.20382127780772 613.0000000000001
+ vertex -177.30733603116815 -70.83664256999754 610.5343145750509
+ vertex -179.44268224691524 -69.60379985752284 613.0000000000002
+ endloop
+endfacet
+facet normal -0.6123724356958127 0.353553390593238 -0.7071067811865498
+ outer loop
+ vertex -177.30733603116815 -70.83664256999754 610.5343145750509
+ vertex -29.442682246915748 190.20382127780772 613.0000000000001
+ vertex -27.30733603116866 188.97097856533304 610.5343145750509
+ endloop
+endfacet
+facet normal -3.1938264052337434e-15 -3.9640061956236146e-14 -1.0
+ outer loop
+ vertex -32.416885913497005 191.92097856533286 610.8000000000001
+ vertex -181.2044503481982 -68.58664256999764 610.8000000000002
+ vertex -182.41688591349643 -67.88664256999766 610.8000000000002
+ endloop
+endfacet
+facet normal -3.1938264052337434e-15 -3.9640061956236146e-14 -1.0
+ outer loop
+ vertex -181.2044503481982 -68.58664256999764 610.8000000000002
+ vertex -32.416885913497005 191.92097856533286 610.8000000000001
+ vertex -31.2044503481987 191.22097856533293 610.8000000000001
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -32.7632960750107 192.12097856533296 611.2
+ vertex -182.41688591349643 -67.88664256999765 611.2000000000002
+ vertex -182.76329607501023 -67.68664256999767 611.2000000000002
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -182.41688591349643 -67.88664256999765 611.2000000000002
+ vertex -32.7632960750107 192.12097856533296 611.2
+ vertex -32.41688591349694 191.92097856533292 611.2
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -181.2044503481982 -68.58664256999764 610.8000000000002
+ vertex -31.204450348198726 191.22097856533298 613.0000000000001
+ vertex -181.20445034819815 -68.58664256999758 613.0000000000002
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -31.204450348198726 191.22097856533298 613.0000000000001
+ vertex -181.2044503481982 -68.58664256999764 610.8000000000002
+ vertex -31.2044503481987 191.22097856533293 610.8000000000001
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -1.052465433482836e-15
+ outer loop
+ vertex -177.30733603116815 -70.83664256999754 610.5343145750509
+ vertex -27.307336031168774 188.97097856533284 604.2656854249493
+ vertex -177.30733603116826 -70.83664256999775 604.2656854249494
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -1.052465433482836e-15
+ outer loop
+ vertex -27.307336031168774 188.97097856533284 604.2656854249493
+ vertex -177.30733603116815 -70.83664256999754 610.5343145750509
+ vertex -27.30733603116866 188.97097856533304 610.5343145750509
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -15.44278799932185 182.12097856533305 598.4000000000001
+ vertex -165.44278799932127 -77.68664256999742 603.6000000000001
+ vertex -165.44278799932138 -77.68664256999759 598.4000000000002
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -165.44278799932127 -77.68664256999742 603.6000000000001
+ vertex -15.44278799932185 182.12097856533305 598.4000000000001
+ vertex -15.442787999321782 182.12097856533316 603.6
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -165.44278799932127 -77.68664256999742 603.6000000000001
+ vertex -15.789198160835541 182.3209785653332 603.6
+ vertex -165.78919816083507 -77.4866425699974 603.6000000000001
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -15.789198160835541 182.3209785653332 603.6
+ vertex -165.44278799932127 -77.68664256999742 603.6000000000001
+ vertex -15.442787999321782 182.12097856533316 603.6
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 2.7394170869210427e-15
+ outer loop
+ vertex -20.89874804316382 185.27097856533302 604.2656854249493
+ vertex -170.89874804316318 -74.53664256999733 610.5343145750509
+ vertex -170.8987480431633 -74.53664256999755 604.2656854249494
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 2.7394170869210427e-15
+ outer loop
+ vertex -170.89874804316318 -74.53664256999733 610.5343145750509
+ vertex -20.89874804316382 185.27097856533302 604.2656854249493
+ vertex -20.898748043163778 185.2709785653332 610.5343145750508
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -165.78919816083504 -77.4866425699974 604.0000000000001
+ vertex -17.00163372613378 183.02097856533314 604.0000000000001
+ vertex -167.0016337261333 -76.78664256999741 604.0000000000001
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -17.00163372613378 183.02097856533314 604.0000000000001
+ vertex -165.78919816083504 -77.4866425699974 604.0000000000001
+ vertex -15.789198160835564 182.32097856533315 604.0000000000001
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -18.76340182741655 184.03813585285874 613.0
+ vertex -167.00163372613315 -76.78664256999713 613.0000000000001
+ vertex -168.76340182741606 -75.76948528247182 613.0000000000001
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -167.00163372613315 -76.78664256999713 613.0000000000001
+ vertex -18.76340182741655 184.03813585285874 613.0
+ vertex -17.001633726133644 183.0209785653334 613.0
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -17.001633726133644 183.0209785653334 613.0
+ vertex -167.00163372613315 -76.78664256999721 610.8000000000002
+ vertex -167.00163372613315 -76.78664256999713 613.0000000000001
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -167.00163372613315 -76.78664256999721 610.8000000000002
+ vertex -17.001633726133644 183.0209785653334 613.0
+ vertex -17.00163372613367 183.02097856533337 610.8000000000001
+ endloop
+endfacet
+facet normal -3.1938264052335824e-15 -3.964006195623624e-14 -1.0
+ outer loop
+ vertex -17.00163372613367 183.02097856533337 610.8000000000001
+ vertex -165.7891981608349 -77.48664256999719 610.8000000000002
+ vertex -167.00163372613315 -76.78664256999721 610.8000000000002
+ endloop
+endfacet
+facet normal -3.1938264052335824e-15 -3.964006195623624e-14 -1.0
+ outer loop
+ vertex -165.7891981608349 -77.48664256999719 610.8000000000002
+ vertex -17.00163372613367 183.02097856533337 610.8000000000001
+ vertex -15.789198160835406 182.32097856533338 610.8000000000001
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -167.0016337261333 -76.78664256999751 601.8000000000001
+ vertex -18.76340182741671 184.03813585285843 601.8000000000001
+ vertex -168.7634018274162 -75.76948528247219 601.8000000000001
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -18.76340182741671 184.03813585285843 601.8000000000001
+ vertex -167.0016337261333 -76.78664256999751 601.8000000000001
+ vertex -17.001633726133846 183.02097856533308 601.8000000000001
+ endloop
+endfacet
+facet normal 0.6123724356958127 -0.353553390593238 0.7071067811865498
+ outer loop
+ vertex -168.7634018274162 -75.76948528247219 601.8000000000001
+ vertex -20.89874804316382 185.27097856533302 604.2656854249493
+ vertex -170.8987480431633 -74.53664256999755 604.2656854249494
+ endloop
+endfacet
+facet normal 0.6123724356958127 -0.353553390593238 0.7071067811865498
+ outer loop
+ vertex -20.89874804316382 185.27097856533302 604.2656854249493
+ vertex -168.7634018274162 -75.76948528247219 601.8000000000001
+ vertex -18.76340182741671 184.03813585285843 601.8000000000001
+ endloop
+endfacet
+facet normal 0.6123724356957985 -0.35355339059327495 -0.7071067811865437
+ outer loop
+ vertex -170.89874804316318 -74.53664256999733 610.5343145750509
+ vertex -18.76340182741655 184.03813585285874 613.0
+ vertex -168.76340182741606 -75.76948528247182 613.0000000000001
+ endloop
+endfacet
+facet normal 0.6123724356957985 -0.35355339059327495 -0.7071067811865437
+ outer loop
+ vertex -18.76340182741655 184.03813585285874 613.0
+ vertex -170.89874804316318 -74.53664256999733 610.5343145750509
+ vertex -20.898748043163778 185.2709785653332 610.5343145750508
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -165.7891981608349 -77.48664256999719 610.8000000000002
+ vertex -15.789198160835406 182.32097856533338 611.2
+ vertex -165.7891981608349 -77.4866425699972 611.2000000000002
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -15.789198160835406 182.32097856533338 611.2
+ vertex -165.7891981608349 -77.48664256999719 610.8000000000002
+ vertex -15.789198160835406 182.32097856533338 610.8000000000001
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -15.789198160835406 182.32097856533338 611.2
+ vertex -165.44278799932115 -77.68664256999716 611.2000000000002
+ vertex -165.7891981608349 -77.4866425699972 611.2000000000002
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -165.44278799932115 -77.68664256999716 611.2000000000002
+ vertex -15.789198160835406 182.32097856533338 611.2
+ vertex -15.442787999321647 182.12097856533347 611.2
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -15.789198160835541 182.3209785653332 603.6
+ vertex -165.78919816083504 -77.4866425699974 604.0000000000001
+ vertex -165.78919816083507 -77.4866425699974 603.6000000000001
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -165.78919816083504 -77.4866425699974 604.0000000000001
+ vertex -15.789198160835541 182.3209785653332 603.6
+ vertex -15.789198160835564 182.32097856533315 604.0000000000001
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -167.0016337261333 -76.78664256999741 604.0000000000001
+ vertex -17.001633726133846 183.02097856533308 601.8000000000001
+ vertex -167.0016337261333 -76.78664256999751 601.8000000000001
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -17.001633726133846 183.02097856533308 601.8000000000001
+ vertex -167.0016337261333 -76.78664256999741 604.0000000000001
+ vertex -17.00163372613378 183.02097856533314 604.0000000000001
+ endloop
+endfacet
+facet normal 0.6870641468694694 -0.39667667014558516 0.6087614290087203
+ outer loop
+ vertex -15.558813403106003 182.18796586344135 616.9
+ vertex -165.69644096740967 -77.54019596059021 617.1071067811868
+ vertex -165.5588134031055 -77.6196552718892 616.9000000000001
+ endloop
+endfacet
+facet normal 0.6870641468694694 -0.39667667014558516 0.6087614290087203
+ outer loop
+ vertex -165.69644096740967 -77.54019596059021 617.1071067811868
+ vertex -15.558813403106003 182.18796586344135 616.9
+ vertex -15.696440967410226 182.26742517474023 617.1071067811866
+ endloop
+endfacet
+facet normal 0.3314135740356083 -0.19134171618249934 0.9238795325112903
+ outer loop
+ vertex -165.87580070121325 -77.43664256999696 617.2660254037846
+ vertex -16.08466953506398 182.49156904278232 617.3659258262891
+ vertex -166.08466953506345 -77.31605209254823 617.3659258262892
+ endloop
+endfacet
+facet normal 0.3314135740356083 -0.19134171618249934 0.9238795325112903
+ outer loop
+ vertex -16.08466953506398 182.49156904278232 617.3659258262891
+ vertex -165.87580070121325 -77.43664256999696 617.2660254037846
+ vertex -15.875800701213773 182.37097856533364 617.2660254037845
+ endloop
+endfacet
+facet normal 0.11303899832185436 -0.06526309611000022 0.9914448613738078
+ outer loop
+ vertex -166.08466953506345 -77.31605209254823 617.3659258262892
+ vertex -16.30881340310601 182.6209785653336 617.4000000000001
+ vertex -166.30881340310546 -77.18664256999696 617.4000000000002
+ endloop
+endfacet
+facet normal 0.11303899832185436 -0.06526309611000022 0.9914448613738078
+ outer loop
+ vertex -16.30881340310601 182.6209785653336 617.4000000000001
+ vertex -166.08466953506345 -77.31605209254823 617.3659258262892
+ vertex -16.08466953506398 182.49156904278232 617.3659258262891
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -166.30881340310546 -77.18664256999696 617.4000000000002
+ vertex -20.81214550278516 185.22097856533344 617.4000000000001
+ vertex -170.81214550278463 -74.58664256999712 617.4000000000002
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -20.81214550278516 185.22097856533344 617.4000000000001
+ vertex -166.30881340310546 -77.18664256999696 617.4000000000002
+ vertex -16.30881340310601 182.6209785653336 617.4000000000001
+ endloop
+endfacet
+facet normal 0.5272028623656805 -0.304380714504307 0.7933533402912483
+ outer loop
+ vertex -165.69644096740967 -77.54019596059021 617.1071067811868
+ vertex -15.875800701213773 182.37097856533364 617.2660254037845
+ vertex -165.87580070121325 -77.43664256999696 617.2660254037846
+ endloop
+endfacet
+facet normal 0.5272028623656805 -0.304380714504307 0.7933533402912483
+ outer loop
+ vertex -15.875800701213773 182.37097856533364 617.2660254037845
+ vertex -165.69644096740967 -77.54019596059021 617.1071067811868
+ vertex -15.696440967410226 182.26742517474023 617.1071067811866
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -165.44278799932115 -77.68664256999716 611.2000000000002
+ vertex -15.442787999321533 182.1209785653336 616.4000000000001
+ vertex -165.44278799932107 -77.68664256999702 616.4000000000001
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -15.442787999321533 182.1209785653336 616.4000000000001
+ vertex -165.44278799932115 -77.68664256999716 611.2000000000002
+ vertex -15.442787999321647 182.12097856533347 611.2
+ endloop
+endfacet
+facet normal 0.800103145191287 -0.4619397662556136 0.3826834323650807
+ outer loop
+ vertex -165.47229709936767 -77.6696054831415 616.6588190451026
+ vertex -15.558813403106003 182.18796586344135 616.9
+ vertex -165.5588134031055 -77.6196552718892 616.9000000000001
+ endloop
+endfacet
+facet normal 0.800103145191287 -0.4619397662556136 0.3826834323650807
+ outer loop
+ vertex -15.558813403106003 182.18796586344135 616.9
+ vertex -165.47229709936767 -77.6696054831415 616.6588190451026
+ vertex -15.472297099368197 182.13801565218895 616.6588190451026
+ endloop
+endfacet
+facet normal 0.8586164364012796 -0.4957224306868715 0.13052619222005726
+ outer loop
+ vertex -15.442787999321533 182.1209785653336 616.4000000000001
+ vertex -165.47229709936767 -77.6696054831415 616.6588190451026
+ vertex -165.44278799932107 -77.68664256999702 616.4000000000001
+ endloop
+endfacet
+facet normal 0.8586164364012796 -0.4957224306868715 0.13052619222005726
+ outer loop
+ vertex -165.47229709936767 -77.6696054831415 616.6588190451026
+ vertex -15.442787999321533 182.1209785653336 616.4000000000001
+ vertex -15.472297099368197 182.13801565218895 616.6588190451026
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -170.81214550278463 -74.58664256999712 617.0000000000002
+ vertex -21.158555664298945 185.4209785653334 617.0000000000001
+ vertex -171.1585556642984 -74.38664256999712 617.0000000000002
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -21.158555664298945 185.4209785653334 617.0000000000001
+ vertex -170.81214550278463 -74.58664256999712 617.0000000000002
+ vertex -20.81214550278514 185.22097856533344 617.0000000000001
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -169.25329977597266 -75.48664256999713 615.6000000000001
+ vertex -19.253299775973208 184.32097856533338 613.5656854249493
+ vertex -169.2532997759727 -75.4866425699972 613.5656854249494
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -19.253299775973208 184.32097856533338 613.5656854249493
+ vertex -169.25329977597266 -75.48664256999713 615.6000000000001
+ vertex -19.25329977597314 184.3209785653334 615.6
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -20.81214550278516 185.22097856533344 617.4000000000001
+ vertex -170.81214550278463 -74.58664256999712 617.0000000000002
+ vertex -170.81214550278463 -74.58664256999712 617.4000000000002
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -9.400019899202893e-16
+ outer loop
+ vertex -170.81214550278463 -74.58664256999712 617.0000000000002
+ vertex -20.81214550278516 185.22097856533344 617.4000000000001
+ vertex -20.81214550278514 185.22097856533344 617.0000000000001
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -21.158555664298966 185.4209785653334 615.6
+ vertex -169.25329977597266 -75.48664256999713 615.6000000000001
+ vertex -171.15855566429843 -74.38664256999722 615.6000000000001
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -169.25329977597266 -75.48664256999713 615.6000000000001
+ vertex -21.158555664298966 185.4209785653334 615.6
+ vertex -19.25329977597314 184.3209785653334 615.6
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -171.3886459917198 -74.25379985752271 611.1000000000001
+ vertex -26.81743808261196 188.6881358528584 611.1
+ vertex -176.81743808261143 -71.11948528247211 611.1000000000001
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -26.81743808261196 188.6881358528584 611.1
+ vertex -171.3886459917198 -74.25379985752271 611.1000000000001
+ vertex -21.38864599172034 185.55382127780788 611.1
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -8.997049082914166e-15
+ outer loop
+ vertex -171.1585556642984 -74.38664256999712 617.0000000000002
+ vertex -21.158555664298966 185.4209785653334 615.6
+ vertex -171.15855566429843 -74.38664256999722 615.6000000000001
+ endloop
+endfacet
+facet normal -0.866025403784458 0.49999999999996647 -8.997049082914166e-15
+ outer loop
+ vertex -21.158555664298966 185.4209785653334 615.6
+ vertex -171.1585556642984 -74.38664256999712 617.0000000000002
+ vertex -21.158555664298945 185.4209785653334 617.0000000000001
+ endloop
+endfacet
+facet normal -0.6123724356957956 0.3535533905932733 0.7071067811865469
+ outer loop
+ vertex -169.2532997759727 -75.4866425699972 613.5656854249494
+ vertex -21.38864599172034 185.55382127780788 611.1
+ vertex -171.3886459917198 -74.25379985752271 611.1000000000001
+ endloop
+endfacet
+facet normal -0.6123724356957956 0.3535533905932733 0.7071067811865469
+ outer loop
+ vertex -21.38864599172034 185.55382127780788 611.1
+ vertex -169.2532997759727 -75.4866425699972 613.5656854249494
+ vertex -19.253299775973208 184.32097856533338 613.5656854249493
+ endloop
+endfacet
+facet normal 0.6123724356958173 -0.35355339059322943 0.7071067811865499
+ outer loop
+ vertex -176.81743808261143 -71.11948528247211 611.1000000000001
+ vertex -28.95278429835907 189.9209785653331 613.5656854249493
+ vertex -178.95278429835852 -69.88664256999746 613.5656854249494
+ endloop
+endfacet
+facet normal 0.6123724356958173 -0.35355339059322943 0.7071067811865499
+ outer loop
+ vertex -28.95278429835907 189.9209785653331 613.5656854249493
+ vertex -176.81743808261143 -71.11948528247211 611.1000000000001
+ vertex -26.81743808261196 188.6881358528584 611.1
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -28.95278429835905 189.92097856533314 615.6
+ vertex -177.04752841003275 -70.98664256999737 615.6000000000001
+ vertex -178.95278429835852 -69.88664256999742 615.6000000000001
+ endloop
+endfacet
+facet normal -1.7149041329274733e-14 -3.158301486324293e-14 -1.0
+ outer loop
+ vertex -177.04752841003275 -70.98664256999737 615.6000000000001
+ vertex -28.95278429835905 189.92097856533314 615.6
+ vertex -27.047528410033223 188.82097856533326 615.6
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 2.6118274155526564e-14
+ outer loop
+ vertex -27.047528410033223 188.82097856533326 615.6
+ vertex -177.04752841003275 -70.98664256999729 617.0000000000002
+ vertex -177.04752841003275 -70.98664256999737 615.6000000000001
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 2.6118274155526564e-14
+ outer loop
+ vertex -177.04752841003275 -70.98664256999729 617.0000000000002
+ vertex -27.047528410033223 188.82097856533326 615.6
+ vertex -27.047528410033244 188.82097856533326 617.0000000000001
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -178.95278429835852 -69.88664256999746 613.5656854249494
+ vertex -28.95278429835905 189.92097856533314 615.6
+ vertex -178.95278429835852 -69.88664256999742 615.6000000000001
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 9.400019899202893e-16
+ outer loop
+ vertex -28.95278429835905 189.92097856533314 615.6
+ vertex -178.95278429835852 -69.88664256999746 613.5656854249494
+ vertex -28.95278429835907 189.9209785653331 613.5656854249493
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -177.04752841003275 -70.98664256999729 617.0000000000002
+ vertex -27.39393857154705 189.02097856533325 617.0000000000001
+ vertex -177.3939385715465 -70.78664256999731 617.0000000000002
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -27.39393857154705 189.02097856533325 617.0000000000001
+ vertex -177.04752841003275 -70.98664256999729 617.0000000000002
+ vertex -27.047528410033244 188.82097856533326 617.0000000000001
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 4.464960093105168e-15
+ outer loop
+ vertex -27.39393857154705 189.02097856533325 617.0000000000001
+ vertex -177.3939385715465 -70.78664256999726 617.4000000000002
+ vertex -177.3939385715465 -70.78664256999731 617.0000000000002
+ endloop
+endfacet
+facet normal 0.866025403784458 -0.49999999999996647 4.464960093105168e-15
+ outer loop
+ vertex -177.3939385715465 -70.78664256999726 617.4000000000002
+ vertex -27.39393857154705 189.02097856533325 617.0000000000001
+ vertex -27.39393857154703 189.02097856533325 617.4000000000001
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -177.3939385715465 -70.78664256999726 617.4000000000002
+ vertex -31.897270671226153 191.6209785653332 617.4
+ vertex -181.89727067122564 -68.18664256999743 617.4000000000002
+ endloop
+endfacet
+facet normal 1.7149041329274733e-14 3.158301486324293e-14 1.0
+ outer loop
+ vertex -31.897270671226153 191.6209785653332 617.4
+ vertex -177.3939385715465 -70.78664256999726 617.4000000000002
+ vertex -27.39393857154703 189.02097856533325 617.4000000000001
+ endloop
+endfacet
+facet normal -0.11303899832181771 0.06526309611006642 0.9914448613738075
+ outer loop
+ vertex -181.89727067122564 -68.18664256999743 617.4000000000002
+ vertex -32.12141453926819 191.75038808788443 617.3659258262891
+ vertex -182.12141453926765 -68.05723304744619 617.3659258262892
+ endloop
+endfacet
+facet normal -0.11303899832181771 0.06526309611006642 0.9914448613738075
+ outer loop
+ vertex -32.12141453926819 191.75038808788443 617.3659258262891
+ vertex -181.89727067122564 -68.18664256999743 617.4000000000002
+ vertex -31.897270671226153 191.6209785653332 617.4
+ endloop
+endfacet
+facet normal -0.3314135740355741 0.1913417161825613 0.9238795325112896
+ outer loop
+ vertex -182.12141453926765 -68.05723304744619 617.3659258262892
+ vertex -32.33028337311844 191.87097856533305 617.2660254037845
+ vertex -182.33028337311788 -67.93664256999747 617.2660254037846
+ endloop
+endfacet
+facet normal -0.3314135740355741 0.1913417161825613 0.9238795325112896
+ outer loop
+ vertex -32.33028337311844 191.87097856533305 617.2660254037845
+ vertex -182.12141453926765 -68.05723304744619 617.3659258262892
+ vertex -32.12141453926819 191.75038808788443 617.3659258262891
+ endloop
+endfacet
+facet normal -0.5272028623656494 0.3043807145043624 0.7933533402912476
+ outer loop
+ vertex -182.33028337311788 -67.93664256999747 617.2660254037846
+ vertex -32.50964310692196 191.9745319559264 617.1071067811866
+ vertex -182.50964310692143 -67.83308917940421 617.1071067811868
+ endloop
+endfacet
+facet normal -0.5272028623656494 0.3043807145043624 0.7933533402912476
+ outer loop
+ vertex -32.50964310692196 191.9745319559264 617.1071067811866
+ vertex -182.33028337311788 -67.93664256999747 617.2660254037846
+ vertex -32.33028337311844 191.87097856533305 617.2660254037845
+ endloop
+endfacet
+facet normal -0.6870641468694532 0.396676670145621 0.6087614290087151
+ outer loop
+ vertex -32.50964310692196 191.9745319559264 617.1071067811866
+ vertex -182.64727067122567 -67.75362986810526 616.9000000000001
+ vertex -182.50964310692143 -67.83308917940421 617.1071067811868
+ endloop
+endfacet
+facet normal -0.6870641468694532 0.396676670145621 0.6087614290087151
+ outer loop
+ vertex -182.64727067122567 -67.75362986810526 616.9000000000001
+ vertex -32.50964310692196 191.9745319559264 617.1071067811866
+ vertex -32.64727067122619 192.0539912672253 616.9
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.76329607501063 192.12097856533305 616.4000000000001
+ vertex -32.41688591349694 191.92097856533292 611.2
+ vertex -32.7632960750107 192.12097856533296 611.2
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.41688591349694 191.92097856533292 611.2
+ vertex -32.76329607501063 192.12097856533305 616.4000000000001
+ vertex -32.19646627266537 191.79371922636426 614.785889527836
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.41688591349694 191.92097856533292 611.2
+ vertex -32.19646627266537 191.79371922636426 614.785889527836
+ vertex -32.05804018668489 191.71379888836057 614.4000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.41688591349694 191.92097856533292 611.2
+ vertex -32.05804018668489 191.71379888836057 614.4000000000001
+ vertex -31.204450348198726 191.22097856533298 613.0000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.204450348198726 191.22097856533298 613.0000000000001
+ vertex -32.05804018668489 191.71379888836057 614.4000000000001
+ vertex -31.83783608379821 191.58666399028218 614.0686291501016
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.204450348198726 191.22097856533298 613.0000000000001
+ vertex -31.83783608379821 191.58666399028218 614.0686291501016
+ vertex -31.550860509712486 191.42097856533303 613.814359353945
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.204450348198726 191.22097856533298 613.0000000000001
+ vertex -31.550860509712486 191.42097856533303 613.814359353945
+ vertex -31.216670375552127 191.22803380141505 613.6545186779375
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.204450348198726 191.22097856533298 613.0000000000001
+ vertex -31.216670375552127 191.22803380141505 613.6545186779375
+ vertex -29.442682246915748 190.20382127780772 613.0000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -29.442682246915748 190.20382127780772 613.0000000000001
+ vertex -31.216670375552127 191.22803380141505 613.6545186779375
+ vertex -30.858040186684896 191.02097856533302 613.6
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -29.442682246915748 190.20382127780772 613.0000000000001
+ vertex -30.858040186684896 191.02097856533302 613.6
+ vertex -28.95278429835907 189.9209785653331 613.5656854249493
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.19646627266537 191.79371922636426 614.785889527836
+ vertex -32.76329607501063 192.12097856533305 616.4000000000001
+ vertex -32.243680832740026 191.82097856533298 615.2
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.243680832740026 191.82097856533298 615.2
+ vertex -32.76329607501063 192.12097856533305 616.4000000000001
+ vertex -32.19646627266537 191.79371922636432 615.6141104721642
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.19646627266537 191.79371922636432 615.6141104721642
+ vertex -32.76329607501063 192.12097856533305 616.4000000000001
+ vertex -32.05804018668489 191.71379888836057 616.0
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.05804018668489 191.71379888836057 616.0
+ vertex -32.76329607501063 192.12097856533305 616.4000000000001
+ vertex -31.837836083798095 191.58666399028237 616.3313708498986
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.837836083798095 191.58666399028237 616.3313708498986
+ vertex -32.76329607501063 192.12097856533305 616.4000000000001
+ vertex -31.550860509712418 191.42097856533306 616.5856406460551
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.550860509712418 191.42097856533306 616.5856406460551
+ vertex -32.76329607501063 192.12097856533305 616.4000000000001
+ vertex -32.73378697496399 192.1039414784776 616.6588190451026
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.550860509712418 191.42097856533306 616.5856406460551
+ vertex -32.73378697496399 192.1039414784776 616.6588190451026
+ vertex -31.21667037555206 191.22803380141514 616.7454813220626
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.21667037555206 191.22803380141514 616.7454813220626
+ vertex -32.73378697496399 192.1039414784776 616.6588190451026
+ vertex -32.64727067122619 192.0539912672253 616.9
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.21667037555206 191.22803380141514 616.7454813220626
+ vertex -32.64727067122619 192.0539912672253 616.9
+ vertex -30.858040186684853 191.02097856533317 616.8000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.50964310692196 191.9745319559264 617.1071067811866
+ vertex -27.39393857154705 189.02097856533325 617.0000000000001
+ vertex -32.64727067122619 192.0539912672253 616.9
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.39393857154705 189.02097856533325 617.0000000000001
+ vertex -32.50964310692196 191.9745319559264 617.1071067811866
+ vertex -27.39393857154703 189.02097856533325 617.4000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.39393857154703 189.02097856533325 617.4000000000001
+ vertex -32.50964310692196 191.9745319559264 617.1071067811866
+ vertex -32.33028337311844 191.87097856533305 617.2660254037845
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.39393857154703 189.02097856533325 617.4000000000001
+ vertex -32.33028337311844 191.87097856533305 617.2660254037845
+ vertex -32.12141453926819 191.75038808788443 617.3659258262891
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.39393857154703 189.02097856533325 617.4000000000001
+ vertex -32.12141453926819 191.75038808788443 617.3659258262891
+ vertex -31.897270671226153 191.6209785653332 617.4
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.95278429835907 189.9209785653331 613.5656854249493
+ vertex -29.658040186684833 190.32815824230553 614.4000000000001
+ vertex -28.95278429835905 189.92097856533314 615.6
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -29.658040186684833 190.32815824230553 614.4000000000001
+ vertex -28.95278429835907 189.9209785653331 613.5656854249493
+ vertex -29.878244289571587 190.45529314038384 614.0686291501015
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -29.878244289571587 190.45529314038384 614.0686291501015
+ vertex -28.95278429835907 189.9209785653331 613.5656854249493
+ vertex -30.16521986365731 190.62097856533308 613.814359353945
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -30.16521986365731 190.62097856533308 613.814359353945
+ vertex -28.95278429835907 189.9209785653331 613.5656854249493
+ vertex -30.499409997817644 190.81392332925108 613.6545186779375
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -30.499409997817644 190.81392332925108 613.6545186779375
+ vertex -28.95278429835907 189.9209785653331 613.5656854249493
+ vertex -30.858040186684896 191.02097856533302 613.6
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.95278429835905 189.92097856533314 615.6
+ vertex -29.658040186684833 190.32815824230553 614.4000000000001
+ vertex -29.51961410070433 190.24823790430182 614.785889527836
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.95278429835905 189.92097856533314 615.6
+ vertex -29.51961410070433 190.24823790430182 614.785889527836
+ vertex -29.472399540629766 190.22097856533307 615.2
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.95278429835905 189.92097856533314 615.6
+ vertex -29.472399540629766 190.22097856533307 615.2
+ vertex -29.51961410070431 190.24823790430187 615.6141104721642
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.95278429835905 189.92097856533314 615.6
+ vertex -29.51961410070431 190.24823790430187 615.6141104721642
+ vertex -27.047528410033223 188.82097856533326 615.6
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.047528410033223 188.82097856533326 615.6
+ vertex -29.51961410070431 190.24823790430187 615.6141104721642
+ vertex -27.047528410033244 188.82097856533326 617.0000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.047528410033244 188.82097856533326 617.0000000000001
+ vertex -29.51961410070431 190.24823790430187 615.6141104721642
+ vertex -29.658040186684875 190.32815824230553 616.0
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.047528410033244 188.82097856533326 617.0000000000001
+ vertex -29.658040186684875 190.32815824230553 616.0
+ vertex -29.87824428957154 190.4552931403839 616.3313708498986
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.047528410033244 188.82097856533326 617.0000000000001
+ vertex -29.87824428957154 190.4552931403839 616.3313708498986
+ vertex -30.165219863657242 190.6209785653331 616.5856406460551
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.047528410033244 188.82097856533326 617.0000000000001
+ vertex -30.165219863657242 190.6209785653331 616.5856406460551
+ vertex -30.499409997817644 190.81392332925108 616.7454813220626
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.047528410033244 188.82097856533326 617.0000000000001
+ vertex -30.499409997817644 190.81392332925108 616.7454813220626
+ vertex -30.858040186684853 191.02097856533317 616.8000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.047528410033244 188.82097856533326 617.0000000000001
+ vertex -30.858040186684853 191.02097856533317 616.8000000000001
+ vertex -32.64727067122619 192.0539912672253 616.9
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.047528410033244 188.82097856533326 617.0000000000001
+ vertex -32.64727067122619 192.0539912672253 616.9
+ vertex -27.39393857154705 189.02097856533325 617.0000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -21.158555664299215 185.4209785653329 599.2
+ vertex -20.812145502785476 185.2209785653328 597.8000000000001
+ vertex -21.15855566429926 185.4209785653328 597.8000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.812145502785476 185.2209785653328 597.8000000000001
+ vertex -21.158555664299215 185.4209785653329 599.2
+ vertex -17.706674076514883 183.42803380141493 598.0545186779375
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.812145502785476 185.2209785653328 597.8000000000001
+ vertex -17.706674076514883 183.42803380141493 598.0545186779375
+ vertex -17.348043887647677 183.22097856533296 598.0000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.812145502785476 185.2209785653328 597.8000000000001
+ vertex -17.348043887647677 183.22097856533296 598.0000000000001
+ vertex -15.558813403106319 182.18796586344075 597.9000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -17.706674076514883 183.42803380141493 598.0545186779375
+ vertex -21.158555664299215 185.4209785653329 599.2
+ vertex -18.04086421067524 183.6209785653329 598.2143593539449
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.04086421067524 183.6209785653329 598.2143593539449
+ vertex -21.158555664299215 185.4209785653329 599.2
+ vertex -18.327839784760943 183.78666399028216 598.4686291501016
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.327839784760943 183.78666399028216 598.4686291501016
+ vertex -21.158555664299215 185.4209785653329 599.2
+ vertex -18.54804388764774 183.91379888836042 598.8000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.54804388764774 183.91379888836042 598.8000000000001
+ vertex -21.158555664299215 185.4209785653329 599.2
+ vertex -18.68646997362817 183.99371922636422 599.185889527836
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.68646997362817 183.99371922636422 599.185889527836
+ vertex -21.158555664299215 185.4209785653329 599.2
+ vertex -19.25329977597341 184.32097856533298 599.2
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.68646997362817 183.99371922636422 599.185889527836
+ vertex -19.25329977597341 184.32097856533298 599.2
+ vertex -18.73368453370276 184.020978565333 599.6
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.73368453370276 184.020978565333 599.6
+ vertex -19.25329977597341 184.32097856533298 599.2
+ vertex -19.25329977597341 184.32097856533298 601.2343145750508
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.73368453370276 184.020978565333 599.6
+ vertex -19.25329977597341 184.32097856533298 601.2343145750508
+ vertex -18.686469973628128 183.99371922636428 600.0141104721641
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.686469973628128 183.99371922636428 600.0141104721641
+ vertex -19.25329977597341 184.32097856533298 601.2343145750508
+ vertex -18.548043887647626 183.91379888836056 600.4000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.548043887647626 183.91379888836056 600.4000000000001
+ vertex -19.25329977597341 184.32097856533298 601.2343145750508
+ vertex -18.32783978476092 183.78666399028225 600.7313708498986
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.32783978476092 183.78666399028225 600.7313708498986
+ vertex -19.25329977597341 184.32097856533298 601.2343145750508
+ vertex -18.040864210675174 183.620978565333 600.9856406460551
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.040864210675174 183.620978565333 600.9856406460551
+ vertex -19.25329977597341 184.32097856533298 601.2343145750508
+ vertex -17.70667407651486 183.42803380141498 601.1454813220626
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -17.70667407651486 183.42803380141498 601.1454813220626
+ vertex -19.25329977597341 184.32097856533298 601.2343145750508
+ vertex -17.34804388764763 183.22097856533298 601.2
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -17.00163372613378 183.02097856533314 604.0000000000001
+ vertex -15.789198160835541 182.3209785653332 603.6
+ vertex -17.001633726133846 183.02097856533308 601.8000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.789198160835541 182.3209785653332 603.6
+ vertex -17.00163372613378 183.02097856533314 604.0000000000001
+ vertex -15.789198160835564 182.32097856533315 604.0000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -17.348043887647677 183.22097856533296 598.0000000000001
+ vertex -15.47229709936849 182.13801565218841 598.1411809548975
+ vertex -15.558813403106319 182.18796586344075 597.9000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.47229709936849 182.13801565218841 598.1411809548975
+ vertex -17.348043887647677 183.22097856533296 598.0000000000001
+ vertex -16.98941369878049 183.01392332925096 598.0545186779375
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.47229709936849 182.13801565218841 598.1411809548975
+ vertex -16.98941369878049 183.01392332925096 598.0545186779375
+ vertex -16.655223564620155 182.8209785653329 598.2143593539449
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.47229709936849 182.13801565218841 598.1411809548975
+ vertex -16.655223564620155 182.8209785653329 598.2143593539449
+ vertex -15.44278799932185 182.12097856533305 598.4000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.44278799932185 182.12097856533305 598.4000000000001
+ vertex -16.655223564620155 182.8209785653329 598.2143593539449
+ vertex -16.36824799053443 182.6552931403837 598.4686291501016
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.44278799932185 182.12097856533305 598.4000000000001
+ vertex -16.36824799053443 182.6552931403837 598.4686291501016
+ vertex -16.14804388764763 182.52815824230544 598.8
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.44278799932185 182.12097856533305 598.4000000000001
+ vertex -16.14804388764763 182.52815824230544 598.8
+ vertex -16.009617801667087 182.4482379043018 599.185889527836
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.44278799932185 182.12097856533305 598.4000000000001
+ vertex -16.009617801667087 182.4482379043018 599.185889527836
+ vertex -15.442787999321782 182.12097856533316 603.6
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321782 182.12097856533316 603.6
+ vertex -16.009617801667087 182.4482379043018 599.185889527836
+ vertex -15.9624032415925 182.4209785653331 599.6
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321782 182.12097856533316 603.6
+ vertex -15.9624032415925 182.4209785653331 599.6
+ vertex -16.009617801667087 182.44823790430183 600.014110472164
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321782 182.12097856533316 603.6
+ vertex -16.009617801667087 182.44823790430183 600.014110472164
+ vertex -16.14804388764759 182.52815824230547 600.4000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321782 182.12097856533316 603.6
+ vertex -16.14804388764759 182.52815824230547 600.4000000000001
+ vertex -16.368247990534297 182.65529314038383 600.7313708498986
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321782 182.12097856533316 603.6
+ vertex -16.368247990534297 182.65529314038383 600.7313708498986
+ vertex -16.655223564620066 182.82097856533304 600.9856406460551
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321782 182.12097856533316 603.6
+ vertex -16.655223564620066 182.82097856533304 600.9856406460551
+ vertex -16.989413698780353 183.013923329251 601.1454813220626
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321782 182.12097856533316 603.6
+ vertex -16.989413698780353 183.013923329251 601.1454813220626
+ vertex -17.34804388764763 183.22097856533298 601.2
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321782 182.12097856533316 603.6
+ vertex -17.34804388764763 183.22097856533298 601.2
+ vertex -17.001633726133846 183.02097856533308 601.8000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -17.001633726133846 183.02097856533308 601.8000000000001
+ vertex -17.34804388764763 183.22097856533298 601.2
+ vertex -19.25329977597341 184.32097856533298 601.2343145750508
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -17.001633726133846 183.02097856533308 601.8000000000001
+ vertex -19.25329977597341 184.32097856533298 601.2343145750508
+ vertex -18.76340182741671 184.03813585285843 601.8000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321782 182.12097856533316 603.6
+ vertex -17.001633726133846 183.02097856533308 601.8000000000001
+ vertex -15.789198160835541 182.3209785653332 603.6
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -29.472399540629993 190.22097856533262 599.6
+ vertex -28.95278429835934 189.92097856533263 599.2
+ vertex -29.519614100704626 190.24823790430136 599.185889527836
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.95278429835934 189.92097856533263 599.2
+ vertex -29.472399540629993 190.22097856533262 599.6
+ vertex -28.95278429835932 189.92097856533272 601.2343145750508
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.95278429835932 189.92097856533272 601.2343145750508
+ vertex -29.472399540629993 190.22097856533262 599.6
+ vertex -29.51961410070458 190.24823790430136 600.0141104721641
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.95278429835932 189.92097856533272 601.2343145750508
+ vertex -29.51961410070458 190.24823790430136 600.0141104721641
+ vertex -29.65804018668508 190.3281582423051 600.4000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.95278429835932 189.92097856533272 601.2343145750508
+ vertex -29.65804018668508 190.3281582423051 600.4000000000001
+ vertex -29.878244289571832 190.4552931403834 600.7313708498986
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.95278429835932 189.92097856533272 601.2343145750508
+ vertex -29.878244289571832 190.4552931403834 600.7313708498986
+ vertex -30.165219863657512 190.6209785653327 600.9856406460552
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.95278429835932 189.92097856533272 601.2343145750508
+ vertex -30.165219863657512 190.6209785653327 600.9856406460552
+ vertex -30.499409997817846 190.81392332925068 601.1454813220626
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.95278429835932 189.92097856533272 601.2343145750508
+ vertex -30.499409997817846 190.81392332925068 601.1454813220626
+ vertex -30.858040186685123 191.02097856533257 601.2
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.12141453926854 191.75038808788375 597.434074173711
+ vertex -27.3939385715473 189.02097856533265 597.4
+ vertex -31.897270671226536 191.62097856533254 597.4
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.3939385715473 189.02097856533265 597.4
+ vertex -32.12141453926854 191.75038808788375 597.434074173711
+ vertex -27.393938571547345 189.02097856533257 597.8000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.393938571547345 189.02097856533257 597.8000000000001
+ vertex -32.12141453926854 191.75038808788375 597.434074173711
+ vertex -32.33028337311871 191.8709785653325 597.5339745962156
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.393938571547345 189.02097856533257 597.8000000000001
+ vertex -32.33028337311871 191.8709785653325 597.5339745962156
+ vertex -32.509643106922276 191.9745319559258 597.6928932188135
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.393938571547345 189.02097856533257 597.8000000000001
+ vertex -32.509643106922276 191.9745319559258 597.6928932188135
+ vertex -32.64727067122648 192.05399126722477 597.9
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.393938571547345 189.02097856533257 597.8000000000001
+ vertex -32.64727067122648 192.05399126722477 597.9
+ vertex -27.047528410033514 188.8209785653326 597.8000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.047528410033514 188.8209785653326 597.8000000000001
+ vertex -32.64727067122648 192.05399126722477 597.9
+ vertex -30.85804018668517 191.02097856533263 598.0000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.047528410033514 188.8209785653326 597.8000000000001
+ vertex -30.85804018668517 191.02097856533263 598.0000000000001
+ vertex -30.49940999781794 190.81392332925054 598.0545186779376
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.047528410033514 188.8209785653326 597.8000000000001
+ vertex -30.49940999781794 190.81392332925054 598.0545186779376
+ vertex -27.04752841003354 188.82097856533272 599.2
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.04752841003354 188.82097856533272 599.2
+ vertex -30.49940999781794 190.81392332925054 598.0545186779376
+ vertex -30.16521986365758 190.62097856533256 598.2143593539449
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.04752841003354 188.82097856533272 599.2
+ vertex -30.16521986365758 190.62097856533256 598.2143593539449
+ vertex -29.878244289571857 190.45529314038336 598.4686291501016
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.04752841003354 188.82097856533272 599.2
+ vertex -29.878244289571857 190.45529314038336 598.4686291501016
+ vertex -29.65804018668515 190.32815824230505 598.8000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.04752841003354 188.82097856533272 599.2
+ vertex -29.65804018668515 190.32815824230505 598.8000000000001
+ vertex -29.519614100704626 190.24823790430136 599.185889527836
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.04752841003354 188.82097856533272 599.2
+ vertex -29.519614100704626 190.24823790430136 599.185889527836
+ vertex -28.95278429835934 189.92097856533263 599.2
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.8121455027855 185.22097856533284 597.4
+ vertex -16.08466953506432 182.4915690427817 597.434074173711
+ vertex -16.30881340310635 182.62097856533293 597.4
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -16.08466953506432 182.4915690427817 597.434074173711
+ vertex -20.8121455027855 185.22097856533284 597.4
+ vertex -20.812145502785476 185.2209785653328 597.8000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -16.08466953506432 182.4915690427817 597.434074173711
+ vertex -20.812145502785476 185.2209785653328 597.8000000000001
+ vertex -15.875800701214134 182.37097856533296 597.5339745962156
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.875800701214134 182.37097856533296 597.5339745962156
+ vertex -20.812145502785476 185.2209785653328 597.8000000000001
+ vertex -15.696440967410519 182.26742517473969 597.6928932188135
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.696440967410519 182.26742517473969 597.6928932188135
+ vertex -20.812145502785476 185.2209785653328 597.8000000000001
+ vertex -15.558813403106319 182.18796586344075 597.9000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.73378697496431 192.10394147847708 598.1411809548975
+ vertex -30.85804018668517 191.02097856533263 598.0000000000001
+ vertex -32.64727067122648 192.05399126722477 597.9
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -30.85804018668517 191.02097856533263 598.0000000000001
+ vertex -32.73378697496431 192.10394147847708 598.1411809548975
+ vertex -31.216670375552397 191.22803380141454 598.0545186779376
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.216670375552397 191.22803380141454 598.0545186779376
+ vertex -32.73378697496431 192.10394147847708 598.1411809548975
+ vertex -31.55086050971271 191.42097856533258 598.2143593539449
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.55086050971271 191.42097856533258 598.2143593539449
+ vertex -32.73378697496431 192.10394147847708 598.1411809548975
+ vertex -32.76329607501093 192.1209785653325 598.4000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.55086050971271 191.42097856533258 598.2143593539449
+ vertex -32.76329607501093 192.1209785653325 598.4000000000001
+ vertex -31.837836083798503 191.58666399028175 598.4686291501016
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.837836083798503 191.58666399028175 598.4686291501016
+ vertex -32.76329607501093 192.1209785653325 598.4000000000001
+ vertex -32.05804018668523 191.71379888836003 598.8000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.05804018668523 191.71379888836003 598.8000000000001
+ vertex -32.76329607501093 192.1209785653325 598.4000000000001
+ vertex -32.19646627266567 191.7937192263638 599.185889527836
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.19646627266567 191.7937192263638 599.185889527836
+ vertex -32.76329607501093 192.1209785653325 598.4000000000001
+ vertex -32.763296075010814 192.12097856533268 603.6
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.19646627266567 191.7937192263638 599.185889527836
+ vertex -32.763296075010814 192.12097856533268 603.6
+ vertex -32.24368083274032 191.82097856533252 599.6
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.24368083274032 191.82097856533252 599.6
+ vertex -32.763296075010814 192.12097856533268 603.6
+ vertex -32.19646627266562 191.79371922636386 600.0141104721641
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.19646627266562 191.79371922636386 600.0141104721641
+ vertex -32.763296075010814 192.12097856533268 603.6
+ vertex -32.05804018668521 191.7137988883601 600.4000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.05804018668521 191.7137988883601 600.4000000000001
+ vertex -32.763296075010814 192.12097856533268 603.6
+ vertex -31.83783608379839 191.58666399028183 600.7313708498986
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.83783608379839 191.58666399028183 600.7313708498986
+ vertex -32.763296075010814 192.12097856533268 603.6
+ vertex -31.550860509712663 191.42097856533266 600.9856406460552
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.550860509712663 191.42097856533266 600.9856406460552
+ vertex -32.763296075010814 192.12097856533268 603.6
+ vertex -31.216670375552397 191.2280338014146 601.1454813220626
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.216670375552397 191.2280338014146 601.1454813220626
+ vertex -32.763296075010814 192.12097856533268 603.6
+ vertex -30.858040186685123 191.02097856533257 601.2
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -30.858040186685123 191.02097856533257 601.2
+ vertex -32.763296075010814 192.12097856533268 603.6
+ vertex -31.20445034819886 191.2209785653327 601.8000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -30.858040186685123 191.02097856533257 601.2
+ vertex -31.20445034819886 191.2209785653327 601.8000000000001
+ vertex -28.95278429835932 189.92097856533272 601.2343145750508
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.20445034819886 191.2209785653327 601.8000000000001
+ vertex -32.763296075010814 192.12097856533268 603.6
+ vertex -32.416885913497055 191.92097856533272 603.6
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.20445034819886 191.2209785653327 601.8000000000001
+ vertex -32.416885913497055 191.92097856533272 603.6
+ vertex -31.204450348198836 191.2209785653327 604.0000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.204450348198836 191.2209785653327 604.0000000000001
+ vertex -32.416885913497055 191.92097856533272 603.6
+ vertex -32.416885913497055 191.9209785653327 604.0
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.30733603116866 188.97097856533304 610.5343145750509
+ vertex -26.81743808261196 188.6881358528584 611.1
+ vertex -21.38864599172034 185.55382127780788 611.1
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -26.81743808261196 188.6881358528584 611.1
+ vertex -27.30733603116866 188.97097856533304 610.5343145750509
+ vertex -29.442682246915748 190.20382127780772 613.0000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -26.81743808261196 188.6881358528584 611.1
+ vertex -29.442682246915748 190.20382127780772 613.0000000000001
+ vertex -28.95278429835907 189.9209785653331 613.5656854249493
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -32.41688591349694 191.92097856533292 611.2
+ vertex -31.2044503481987 191.22097856533293 610.8000000000001
+ vertex -32.416885913497005 191.92097856533286 610.8000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -31.2044503481987 191.22097856533293 610.8000000000001
+ vertex -32.41688591349694 191.92097856533292 611.2
+ vertex -31.204450348198726 191.22097856533298 613.0000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -27.307336031168774 188.97097856533284 604.2656854249493
+ vertex -24.70823048087974 187.47038427622132 604.7920002690196
+ vertex -24.103042037166297 187.12097856533296 604.7
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -24.70823048087974 187.47038427622132 604.7920002690196
+ vertex -27.307336031168774 188.97097856533284 604.2656854249493
+ vertex -25.272176332275308 187.79597856533294 605.061731409782
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -25.272176332275308 187.79597856533294 605.061731409782
+ vertex -27.307336031168774 188.97097856533284 604.2656854249493
+ vertex -25.75644761354496 188.07557271993477 605.4908116907964
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -25.75644761354496 188.07557271993477 605.4908116907964
+ vertex -27.307336031168774 188.97097856533284 604.2656854249493
+ vertex -26.128042037166335 188.29011286044195 606.0500000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -26.128042037166335 188.29011286044195 606.0500000000001
+ vertex -27.307336031168774 188.97097856533284 604.2656854249493
+ vertex -26.361636057258405 188.42497843082322 606.7011885782233
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -26.361636057258405 188.42497843082322 606.7011885782233
+ vertex -27.307336031168774 188.97097856533284 604.2656854249493
+ vertex -27.30733603116866 188.97097856533304 610.5343145750509
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -26.361636057258405 188.42497843082322 606.7011885782233
+ vertex -27.30733603116866 188.97097856533304 610.5343145750509
+ vertex -26.441310627384293 188.47097856533296 607.4
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -26.441310627384293 188.47097856533296 607.4
+ vertex -27.30733603116866 188.97097856533304 610.5343145750509
+ vertex -26.361636057258405 188.42497843082322 608.0988114217769
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -26.361636057258405 188.42497843082322 608.0988114217769
+ vertex -27.30733603116866 188.97097856533304 610.5343145750509
+ vertex -26.128042037166267 188.29011286044198 608.7500000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -26.128042037166267 188.29011286044198 608.7500000000001
+ vertex -27.30733603116866 188.97097856533304 610.5343145750509
+ vertex -25.75644761354487 188.0755727199349 609.3091883092037
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -25.75644761354487 188.0755727199349 609.3091883092037
+ vertex -27.30733603116866 188.97097856533304 610.5343145750509
+ vertex -25.27217633227526 187.79597856533303 609.738268590218
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -25.27217633227526 187.79597856533303 609.738268590218
+ vertex -27.30733603116866 188.97097856533304 610.5343145750509
+ vertex -24.70823048087963 187.47038427622155 610.0079997309805
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -24.70823048087963 187.47038427622155 610.0079997309805
+ vertex -27.30733603116866 188.97097856533304 610.5343145750509
+ vertex -24.103042037166183 187.1209785653331 610.1
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -24.103042037166183 187.1209785653331 610.1
+ vertex -27.30733603116866 188.97097856533304 610.5343145750509
+ vertex -20.898748043163778 185.2709785653332 610.5343145750508
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163778 185.2709785653332 610.5343145750508
+ vertex -27.30733603116866 188.97097856533304 610.5343145750509
+ vertex -21.38864599172034 185.55382127780788 611.1
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163778 185.2709785653332 610.5343145750508
+ vertex -21.38864599172034 185.55382127780788 611.1
+ vertex -18.76340182741655 184.03813585285874 613.0
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.76340182741655 184.03813585285874 613.0
+ vertex -21.38864599172034 185.55382127780788 611.1
+ vertex -19.253299775973208 184.32097856533338 613.5656854249493
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.76340182741655 184.03813585285874 613.0
+ vertex -19.253299775973208 184.32097856533338 613.5656854249493
+ vertex -17.001633726133644 183.0209785653334 613.0
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -21.158555664298945 185.4209785653334 617.0000000000001
+ vertex -19.25329977597314 184.3209785653334 615.6
+ vertex -21.158555664298966 185.4209785653334 615.6
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -19.25329977597314 184.3209785653334 615.6
+ vertex -21.158555664298945 185.4209785653334 617.0000000000001
+ vertex -18.686469973627858 183.99371922636468 615.6141104721642
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.686469973627858 183.99371922636468 615.6141104721642
+ vertex -21.158555664298945 185.4209785653334 617.0000000000001
+ vertex -18.54804388764745 183.91379888836096 616.0
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.54804388764745 183.91379888836096 616.0
+ vertex -21.158555664298945 185.4209785653334 617.0000000000001
+ vertex -18.327839784760627 183.78666399028273 616.3313708498986
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.327839784760627 183.78666399028273 616.3313708498986
+ vertex -21.158555664298945 185.4209785653334 617.0000000000001
+ vertex -18.0408642106749 183.62097856533347 616.5856406460551
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.0408642106749 183.62097856533347 616.5856406460551
+ vertex -21.158555664298945 185.4209785653334 617.0000000000001
+ vertex -17.706674076514545 183.42803380141552 616.7454813220626
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -17.706674076514545 183.42803380141552 616.7454813220626
+ vertex -21.158555664298945 185.4209785653334 617.0000000000001
+ vertex -17.348043887647314 183.2209785653335 616.8000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -17.348043887647314 183.2209785653335 616.8000000000001
+ vertex -21.158555664298945 185.4209785653334 617.0000000000001
+ vertex -15.558813403106003 182.18796586344135 616.9
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.558813403106003 182.18796586344135 616.9
+ vertex -21.158555664298945 185.4209785653334 617.0000000000001
+ vertex -20.81214550278514 185.22097856533344 617.0000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.558813403106003 182.18796586344135 616.9
+ vertex -20.81214550278514 185.22097856533344 617.0000000000001
+ vertex -15.696440967410226 182.26742517474023 617.1071067811866
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.696440967410226 182.26742517474023 617.1071067811866
+ vertex -20.81214550278514 185.22097856533344 617.0000000000001
+ vertex -20.81214550278516 185.22097856533344 617.4000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.696440967410226 182.26742517474023 617.1071067811866
+ vertex -20.81214550278516 185.22097856533344 617.4000000000001
+ vertex -15.875800701213773 182.37097856533364 617.2660254037845
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.875800701213773 182.37097856533364 617.2660254037845
+ vertex -20.81214550278516 185.22097856533344 617.4000000000001
+ vertex -16.08466953506398 182.49156904278232 617.3659258262891
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -16.08466953506398 182.49156904278232 617.3659258262891
+ vertex -20.81214550278516 185.22097856533344 617.4000000000001
+ vertex -16.30881340310601 182.6209785653336 617.4000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -17.001633726133644 183.0209785653334 613.0
+ vertex -15.789198160835406 182.32097856533338 610.8000000000001
+ vertex -17.00163372613367 183.02097856533337 610.8000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.789198160835406 182.32097856533338 610.8000000000001
+ vertex -17.001633726133644 183.0209785653334 613.0
+ vertex -15.789198160835406 182.32097856533338 611.2
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.789198160835406 182.32097856533338 611.2
+ vertex -17.001633726133644 183.0209785653334 613.0
+ vertex -15.442787999321647 182.12097856533347 611.2
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321647 182.12097856533347 611.2
+ vertex -17.001633726133644 183.0209785653334 613.0
+ vertex -16.148043887647408 182.52815824230586 614.4000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321647 182.12097856533347 611.2
+ vertex -16.148043887647408 182.52815824230586 614.4000000000001
+ vertex -16.009617801666884 182.44823790430226 614.785889527836
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321647 182.12097856533347 611.2
+ vertex -16.009617801666884 182.44823790430226 614.785889527836
+ vertex -15.442787999321533 182.1209785653336 616.4000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -16.148043887647408 182.52815824230586 614.4000000000001
+ vertex -17.001633726133644 183.0209785653334 613.0
+ vertex -16.368247990534094 182.65529314038423 614.0686291501015
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -16.368247990534094 182.65529314038423 614.0686291501015
+ vertex -17.001633726133644 183.0209785653334 613.0
+ vertex -16.655223564619817 182.82097856533343 613.814359353945
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -16.655223564619817 182.82097856533343 613.814359353945
+ vertex -17.001633726133644 183.0209785653334 613.0
+ vertex -16.989413698780176 183.0139233292514 613.6545186779375
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -16.989413698780176 183.0139233292514 613.6545186779375
+ vertex -17.001633726133644 183.0209785653334 613.0
+ vertex -17.348043887647428 183.2209785653335 613.6
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -17.348043887647428 183.2209785653335 613.6
+ vertex -17.001633726133644 183.0209785653334 613.0
+ vertex -19.253299775973208 184.32097856533338 613.5656854249493
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321533 182.1209785653336 616.4000000000001
+ vertex -16.009617801666884 182.44823790430226 614.785889527836
+ vertex -15.962403241592297 182.42097856533346 615.2
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321533 182.1209785653336 616.4000000000001
+ vertex -15.962403241592297 182.42097856533346 615.2
+ vertex -16.009617801666817 182.44823790430226 615.6141104721642
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321533 182.1209785653336 616.4000000000001
+ vertex -16.009617801666817 182.44823790430226 615.6141104721642
+ vertex -16.148043887647408 182.52815824230598 616.0
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321533 182.1209785653336 616.4000000000001
+ vertex -16.148043887647408 182.52815824230598 616.0
+ vertex -16.368247990534048 182.6552931403843 616.3313708498985
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321533 182.1209785653336 616.4000000000001
+ vertex -16.368247990534048 182.6552931403843 616.3313708498985
+ vertex -16.65522356461977 182.82097856533352 616.5856406460551
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.442787999321533 182.1209785653336 616.4000000000001
+ vertex -16.65522356461977 182.82097856533352 616.5856406460551
+ vertex -15.472297099368197 182.13801565218895 616.6588190451026
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.472297099368197 182.13801565218895 616.6588190451026
+ vertex -16.65522356461977 182.82097856533352 616.5856406460551
+ vertex -16.989413698780083 183.01392332925155 616.7454813220626
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.472297099368197 182.13801565218895 616.6588190451026
+ vertex -16.989413698780083 183.01392332925155 616.7454813220626
+ vertex -15.558813403106003 182.18796586344135 616.9
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -15.558813403106003 182.18796586344135 616.9
+ vertex -16.989413698780083 183.01392332925155 616.7454813220626
+ vertex -17.348043887647314 183.2209785653335 616.8000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -19.253299775973208 184.32097856533338 613.5656854249493
+ vertex -17.70667407651468 183.42803380141538 613.6545186779375
+ vertex -17.348043887647428 183.2209785653335 613.6
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -17.70667407651468 183.42803380141538 613.6545186779375
+ vertex -19.253299775973208 184.32097856533338 613.5656854249493
+ vertex -18.040864210674947 183.62097856533344 613.814359353945
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.040864210674947 183.62097856533344 613.814359353945
+ vertex -19.253299775973208 184.32097856533338 613.5656854249493
+ vertex -18.327839784760762 183.78666399028262 614.0686291501016
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.327839784760762 183.78666399028262 614.0686291501016
+ vertex -19.253299775973208 184.32097856533338 613.5656854249493
+ vertex -18.548043887647424 183.91379888836096 614.4000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.548043887647424 183.91379888836096 614.4000000000001
+ vertex -19.253299775973208 184.32097856533338 613.5656854249493
+ vertex -19.25329977597314 184.3209785653334 615.6
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.548043887647424 183.91379888836096 614.4000000000001
+ vertex -19.25329977597314 184.3209785653334 615.6
+ vertex -18.6864699736279 183.99371922636473 614.785889527836
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.6864699736279 183.99371922636473 614.785889527836
+ vertex -19.25329977597314 184.3209785653334 615.6
+ vertex -18.733684533702558 184.0209785653334 615.2
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.733684533702558 184.0209785653334 615.2
+ vertex -19.25329977597314 184.3209785653334 615.6
+ vertex -18.686469973627858 183.99371922636468 615.6141104721642
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -28.95278429835932 189.92097856533272 601.2343145750508
+ vertex -29.44268224691593 190.20382127780732 601.8000000000001
+ vertex -26.817438082612185 188.68813585285818 603.7
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -29.44268224691593 190.20382127780732 601.8000000000001
+ vertex -28.95278429835932 189.92097856533272 601.2343145750508
+ vertex -31.20445034819886 191.2209785653327 601.8000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -26.817438082612185 188.68813585285818 603.7
+ vertex -29.44268224691593 190.20382127780732 601.8000000000001
+ vertex -27.307336031168774 188.97097856533284 604.2656854249493
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -26.817438082612185 188.68813585285818 603.7
+ vertex -27.307336031168774 188.97097856533284 604.2656854249493
+ vertex -21.38864599172057 185.5538212778076 603.7
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -21.38864599172057 185.5538212778076 603.7
+ vertex -27.307336031168774 188.97097856533284 604.2656854249493
+ vertex -20.89874804316382 185.27097856533302 604.2656854249493
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.89874804316382 185.27097856533302 604.2656854249493
+ vertex -27.307336031168774 188.97097856533284 604.2656854249493
+ vertex -24.103042037166297 187.12097856533296 604.7
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.89874804316382 185.27097856533302 604.2656854249493
+ vertex -24.103042037166297 187.12097856533296 604.7
+ vertex -23.497853593452852 186.77157285444454 604.7920002690196
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.89874804316382 185.27097856533302 604.2656854249493
+ vertex -23.497853593452852 186.77157285444454 604.7920002690196
+ vertex -22.933907742057286 186.44597856533298 605.061731409782
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.89874804316382 185.27097856533302 604.2656854249493
+ vertex -22.933907742057286 186.44597856533298 605.061731409782
+ vertex -22.449636460787655 186.16638441073113 605.4908116907964
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.89874804316382 185.27097856533302 604.2656854249493
+ vertex -22.449636460787655 186.16638441073113 605.4908116907964
+ vertex -22.078042037166263 185.95184427022406 606.0500000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.89874804316382 185.27097856533302 604.2656854249493
+ vertex -22.078042037166263 185.95184427022406 606.0500000000001
+ vertex -21.844448017074143 185.81697869984282 606.7011885782233
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.89874804316382 185.27097856533302 604.2656854249493
+ vertex -21.844448017074143 185.81697869984282 606.7011885782233
+ vertex -20.898748043163778 185.2709785653332 610.5343145750508
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163778 185.2709785653332 610.5343145750508
+ vertex -21.844448017074143 185.81697869984282 606.7011885782233
+ vertex -21.764773446948233 185.77097856533308 607.4000000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163778 185.2709785653332 610.5343145750508
+ vertex -21.764773446948233 185.77097856533308 607.4000000000001
+ vertex -21.84444801707412 185.81697869984293 608.0988114217769
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163778 185.2709785653332 610.5343145750508
+ vertex -21.84444801707412 185.81697869984293 608.0988114217769
+ vertex -22.078042037166195 185.95184427022414 608.7500000000001
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163778 185.2709785653332 610.5343145750508
+ vertex -22.078042037166195 185.95184427022414 608.7500000000001
+ vertex -22.44963646078752 186.16638441073135 609.3091883092037
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163778 185.2709785653332 610.5343145750508
+ vertex -22.44963646078752 186.16638441073135 609.3091883092037
+ vertex -22.933907742057176 186.4459785653332 609.7382685902181
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163778 185.2709785653332 610.5343145750508
+ vertex -22.933907742057176 186.4459785653332 609.7382685902181
+ vertex -23.49785359345274 186.77157285444477 610.0079997309805
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -20.898748043163778 185.2709785653332 610.5343145750508
+ vertex -23.49785359345274 186.77157285444477 610.0079997309805
+ vertex -24.103042037166183 187.1209785653331 610.1
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -21.38864599172057 185.5538212778076 603.7
+ vertex -18.76340182741671 184.03813585285843 601.8000000000001
+ vertex -19.25329977597341 184.32097856533298 601.2343145750508
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844387 -2.9750497701033105e-16
+ outer loop
+ vertex -18.76340182741671 184.03813585285843 601.8000000000001
+ vertex -21.38864599172057 185.5538212778076 603.7
+ vertex -20.89874804316382 185.27097856533302 604.2656854249493
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -166.98941369877966 -76.79369780607912 613.6545186779376
+ vertex -167.7066740765141 -76.3795873339151 613.6545186779376
+ vertex -167.3480438876469 -76.58664256999711 613.6000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -167.7066740765141 -76.3795873339151 613.6545186779376
+ vertex -166.98941369877966 -76.79369780607912 613.6545186779376
+ vertex -166.65522356461935 -76.98664256999712 613.814359353945
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -167.7066740765141 -76.3795873339151 613.6545186779376
+ vertex -166.65522356461935 -76.98664256999712 613.814359353945
+ vertex -168.0408642106745 -76.18664256999716 613.814359353945
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.0408642106745 -76.18664256999716 613.814359353945
+ vertex -166.65522356461935 -76.98664256999712 613.814359353945
+ vertex -166.3682479905336 -77.1523279949463 614.0686291501016
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.0408642106745 -76.18664256999716 613.814359353945
+ vertex -166.3682479905336 -77.1523279949463 614.0686291501016
+ vertex -168.3278397847602 -76.0209571450479 614.0686291501017
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.3278397847602 -76.0209571450479 614.0686291501017
+ vertex -166.3682479905336 -77.1523279949463 614.0686291501016
+ vertex -166.14804388764685 -77.27946289302463 614.4000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.3278397847602 -76.0209571450479 614.0686291501017
+ vertex -166.14804388764685 -77.27946289302463 614.4000000000001
+ vertex -168.5480438876469 -75.89382224696958 614.4000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.5480438876469 -75.89382224696958 614.4000000000001
+ vertex -166.14804388764685 -77.27946289302463 614.4000000000001
+ vertex -166.00961780166637 -77.35938323102832 614.785889527836
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.5480438876469 -75.89382224696958 614.4000000000001
+ vertex -166.00961780166637 -77.35938323102832 614.785889527836
+ vertex -168.6864699736274 -75.81390190896589 614.785889527836
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.6864699736274 -75.81390190896589 614.785889527836
+ vertex -166.00961780166637 -77.35938323102832 614.785889527836
+ vertex -165.96240324159172 -77.38664256999704 615.2000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.6864699736274 -75.81390190896589 614.785889527836
+ vertex -165.96240324159172 -77.38664256999704 615.2000000000002
+ vertex -168.73368453370196 -75.78664256999716 615.2000000000002
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.73368453370196 -75.78664256999716 615.2000000000002
+ vertex -165.96240324159172 -77.38664256999704 615.2000000000002
+ vertex -166.00961780166634 -77.3593832310283 615.6141104721642
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.73368453370196 -75.78664256999716 615.2000000000002
+ vertex -166.00961780166634 -77.3593832310283 615.6141104721642
+ vertex -168.68646997362737 -75.81390190896586 615.6141104721642
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.68646997362737 -75.81390190896586 615.6141104721642
+ vertex -166.00961780166634 -77.3593832310283 615.6141104721642
+ vertex -166.14804388764685 -77.27946289302459 616.0000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.68646997362737 -75.81390190896586 615.6141104721642
+ vertex -166.14804388764685 -77.27946289302459 616.0000000000001
+ vertex -168.54804388764688 -75.89382224696955 616.0000000000001
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.54804388764688 -75.89382224696955 616.0000000000001
+ vertex -166.14804388764685 -77.27946289302459 616.0000000000001
+ vertex -166.36824799053355 -77.15232799494626 616.3313708498986
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.54804388764688 -75.89382224696955 616.0000000000001
+ vertex -166.36824799053355 -77.15232799494626 616.3313708498986
+ vertex -168.32783978476013 -76.02095714504783 616.3313708498987
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.32783978476013 -76.02095714504783 616.3313708498987
+ vertex -166.36824799053355 -77.15232799494626 616.3313708498986
+ vertex -166.65522356461926 -76.98664256999704 616.5856406460553
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.32783978476013 -76.02095714504783 616.3313708498987
+ vertex -166.65522356461926 -76.98664256999704 616.5856406460553
+ vertex -168.0408642106744 -76.18664256999706 616.5856406460553
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.0408642106744 -76.18664256999706 616.5856406460553
+ vertex -166.65522356461926 -76.98664256999704 616.5856406460553
+ vertex -166.98941369877957 -76.79369780607902 616.7454813220626
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -168.0408642106744 -76.18664256999706 616.5856406460553
+ vertex -166.98941369877957 -76.79369780607902 616.7454813220626
+ vertex -167.70667407651402 -76.37958733391504 616.7454813220626
+ endloop
+endfacet
+facet normal -0.5000000000000001 -0.8660254037844387 2.970018574227155e-16
+ outer loop
+ vertex -167.70667407651402 -76.37958733391504 616.7454813220626
+ vertex -166.98941369877957 -76.79369780607902 616.7454813220626
+ vertex -167.3480438876468 -76.58664256999705 616.8000000000002
+ endloop
+endfacet
+facet normal 0.9991524752349781 -0.04116225494086089 1.0458099413404686e-16
+ outer loop
+ vertex -183.85388894480468 -84.92343822226249 -3.000000000000062
+ vertex -183.79272159323875 -83.43869180085144 -62.600000000000065
+ vertex -183.79272159323875 -83.43869180085144 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9991524752349781 -0.04116225494086089 1.0458099413404686e-16
+ outer loop
+ vertex -183.79272159323875 -83.43869180085144 -62.600000000000065
+ vertex -183.85388894480468 -84.92343822226249 -3.000000000000062
+ vertex -183.85388894480468 -84.92343822226248 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9783396194476196 -0.2070062535748305 7.690445521229571e-17
+ outer loop
+ vertex -183.23793366531743 -79.01795063489288 -3.000000000000062
+ vertex -182.93032116189778 -77.5641322388989 -62.600000000000065
+ vertex -182.93032116189778 -77.56413223889892 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9783396194476196 -0.2070062535748305 7.690445521229571e-17
+ outer loop
+ vertex -182.93032116189778 -77.5641322388989 -62.600000000000065
+ vertex -183.23793366531743 -79.01795063489288 -3.000000000000062
+ vertex -183.2379336653174 -79.01795063489288 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.3493898658303789 0.9369774392454868 1.8208893893752719e-16
+ outer loop
+ vertex -160.05051943746048 -119.17973017368655 -3.000000000000062
+ vertex -161.44287339178103 -118.66053478977186 -62.600000000000065
+ vertex -161.44287339178106 -118.66053478977186 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.3493898658303789 0.9369774392454868 1.8208893893752719e-16
+ outer loop
+ vertex -161.44287339178103 -118.66053478977186 -62.600000000000065
+ vertex -160.05051943746048 -119.17973017368655 -3.000000000000062
+ vertex -160.05051943746045 -119.17973017368655 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9859209640962954 0.1672119988380962 1.3498487096513938e-16
+ outer loop
+ vertex -183.42210412904052 -91.17636932989382 -3.000000000000085
+ vertex -183.4776212540151 -90.84902740611355 -62.600000000000065
+ vertex -183.4776212540151 -90.84902740611355 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9859209640962954 0.1672119988380962 1.3498487096513938e-16
+ outer loop
+ vertex -183.4776212540151 -90.84902740611355 -62.600000000000065
+ vertex -183.42210412904052 -91.17636932989382 -3.000000000000085
+ vertex -183.4221041290405 -91.17636932989382 -62.60000000000009
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000018 -1.962553415389855e-17
+ outer loop
+ vertex -168.13557599864257 -82.35068819883378 -3.0000000000000733
+ vertex -166.9427879993213 -80.28471878135092 -62.60000000000008
+ vertex -168.13557599864257 -82.35068819883378 -62.60000000000008
+ endloop
+endfacet
+facet normal -0.8660254037844378 0.5000000000000018 -1.962553415389855e-17
+ outer loop
+ vertex -166.9427879993213 -80.28471878135092 -62.60000000000008
+ vertex -168.13557599864257 -82.35068819883378 -3.0000000000000733
+ vertex -166.9427879993213 -80.28471878135093 -3.0000000000000733
+ endloop
+endfacet
+facet normal 0.9447323868310444 -0.3278425190125857 5.4692334833071485e-17
+ outer loop
+ vertex -181.64696360879708 -73.2975486533744 -3.000000000000062
+ vertex -182.13413950932804 -74.70142650515936 -62.600000000000065
+ vertex -181.64696360879708 -73.2975486533744 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9447323868310444 -0.3278425190125857 5.4692334833071485e-17
+ outer loop
+ vertex -182.13413950932804 -74.70142650515936 -62.600000000000065
+ vertex -181.64696360879708 -73.2975486533744 -3.000000000000062
+ vertex -182.13413950932804 -74.70142650515936 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9576170825074752 -0.2880443078588281 6.220955760198354e-17
+ outer loop
+ vertex -182.13413950932804 -74.70142650515936 -3.000000000000062
+ vertex -182.56217503533784 -76.12445109007135 -62.600000000000065
+ vertex -182.13413950932804 -74.70142650515936 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9576170825074752 -0.2880443078588281 6.220955760198354e-17
+ outer loop
+ vertex -182.56217503533784 -76.12445109007135 -62.600000000000065
+ vertex -182.13413950932804 -74.70142650515936 -3.000000000000062
+ vertex -182.56217503533784 -76.12445109007135 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.6049992586789453 0.7962260338609424 1.8892534971894295e-16
+ outer loop
+ vertex -169.23317972702915 -114.37079976539466 -3.000000000000062
+ vertex -170.4163762698104 -113.47176732886022 -62.600000000000065
+ vertex -170.4163762698104 -113.47176732886022 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.6049992586789453 0.7962260338609424 1.8892534971894295e-16
+ outer loop
+ vertex -170.4163762698104 -113.47176732886022 -62.600000000000065
+ vertex -169.23317972702915 -114.37079976539466 -3.000000000000062
+ vertex -169.23317972702915 -114.37079976539466 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.5363402452594351 0.8440018609665794 1.886138071888623e-16
+ outer loop
+ vertex -166.7592266656199 -116.01656572439911 -3.000000000000062
+ vertex -168.01341836688118 -115.21956098333553 -62.600000000000065
+ vertex -168.0134183668812 -115.21956098333553 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.5363402452594351 0.8440018609665794 1.886138071888623e-16
+ outer loop
+ vertex -168.01341836688118 -115.21956098333553 -62.600000000000065
+ vertex -166.7592266656199 -116.01656572439911 -3.000000000000062
+ vertex -166.7592266656199 -116.01656572439911 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.3882711944089147 0.9215451587373646 1.8404317463084536e-16
+ outer loop
+ vertex -161.44287339178106 -118.66053478977186 -3.000000000000062
+ vertex -162.812294887016 -118.08356152420488 -62.600000000000065
+ vertex -162.812294887016 -118.08356152420488 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.3882711944089147 0.9215451587373646 1.8404317463084536e-16
+ outer loop
+ vertex -162.812294887016 -118.08356152420488 -62.600000000000065
+ vertex -161.44287339178106 -118.66053478977186 -3.000000000000062
+ vertex -161.44287339178103 -118.66053478977186 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9922171154055781 -0.12451986145283667 9.106128389727609e-17
+ outer loop
+ vertex -183.66951149281198 -81.95780265849699 -3.000000000000062
+ vertex -183.48447425047996 -80.48336222235157 -62.600000000000065
+ vertex -183.48447425047996 -80.48336222235157 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9922171154055781 -0.12451986145283667 9.106128389727609e-17
+ outer loop
+ vertex -183.48447425047996 -80.48336222235157 -62.600000000000065
+ vertex -183.66951149281198 -81.95780265849699 -3.000000000000062
+ vertex -183.66951149281198 -81.95780265849699 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9688260316082282 -0.24774204422796747 6.96179190577175e-17
+ outer loop
+ vertex -182.93032116189778 -77.56413223889892 -3.000000000000062
+ vertex -182.56217503533784 -76.12445109007135 -62.600000000000065
+ vertex -182.56217503533784 -76.12445109007135 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9688260316082282 -0.24774204422796747 6.96179190577175e-17
+ outer loop
+ vertex -182.56217503533784 -76.12445109007135 -62.600000000000065
+ vertex -182.93032116189778 -77.56413223889892 -3.000000000000062
+ vertex -182.93032116189778 -77.5641322388989 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.42647308217928137 0.9045002543816689 1.8567535078147326e-16
+ outer loop
+ vertex -162.812294887016 -118.08356152420488 -3.000000000000062
+ vertex -164.1563875546969 -117.4498200300001 -62.600000000000065
+ vertex -164.15638755469692 -117.4498200300001 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.42647308217928137 0.9045002543816689 1.8567535078147326e-16
+ outer loop
+ vertex -164.1563875546969 -117.4498200300001 -62.600000000000065
+ vertex -162.812294887016 -118.08356152420488 -3.000000000000062
+ vertex -162.812294887016 -118.08356152420488 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9990971750681178 0.0424833469833426 1.1736899405614504e-16
+ outer loop
+ vertex -183.78977600789938 -87.89410799071464 -3.000000000000062
+ vertex -183.85290650996635 -86.40944374567493 -62.600000000000065
+ vertex -183.85290650996637 -86.40944374567495 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9990971750681178 0.0424833469833426 1.1736899405614504e-16
+ outer loop
+ vertex -183.85290650996635 -86.40944374567493 -62.600000000000065
+ vertex -183.78977600789938 -87.89410799071464 -3.000000000000062
+ vertex -183.78977600789938 -87.89410799071463 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.22935485323248844 0.9733428744788262 1.7433085302539715e-16
+ outer loop
+ vertex -157.20679601081656 -120.04125580570843 -3.000000000000062
+ vertex -155.760402807068 -120.38207845891769 -62.600000000000065
+ vertex -157.20679601081653 -120.04125580570843 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.22935485323248844 0.9733428744788262 1.7433085302539715e-16
+ outer loop
+ vertex -155.760402807068 -120.38207845891769 -62.600000000000065
+ vertex -157.20679601081656 -120.04125580570843 -3.000000000000062
+ vertex -155.76040280706803 -120.38207845891769 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 -7.69786561188505e-17
+ outer loop
+ vertex -175.92783335074782 -89.73630142461471 -3.000000000000062
+ vertex -182.55292768969875 -93.5613014246147 -62.600000000000065
+ vertex -175.9278333507478 -89.73630142461471 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 -7.69786561188505e-17
+ outer loop
+ vertex -182.55292768969875 -93.5613014246147 -62.600000000000065
+ vertex -175.92783335074782 -89.73630142461471 -3.000000000000062
+ vertex -182.55292768969878 -93.5613014246147 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 7.69786561188505e-17
+ outer loop
+ vertex -183.42210412904052 -91.17636932989382 -3.000000000000085
+ vertex -168.13557599864257 -82.35068819883378 -62.60000000000008
+ vertex -183.4221041290405 -91.17636932989382 -62.60000000000009
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 7.69786561188505e-17
+ outer loop
+ vertex -168.13557599864257 -82.35068819883378 -62.60000000000008
+ vertex -183.42210412904052 -91.17636932989382 -3.000000000000085
+ vertex -168.13557599864257 -82.35068819883378 -3.0000000000000733
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 -7.69786561188505e-17
+ outer loop
+ vertex -155.3855759986426 -104.43433599533697 -3.000000000000062
+ vertex -170.67210412904052 -113.26001712639697 -62.600000000000065
+ vertex -155.38557599864257 -104.43433599533697 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 -7.69786561188505e-17
+ outer loop
+ vertex -170.67210412904052 -113.26001712639697 -62.600000000000065
+ vertex -155.3855759986426 -104.43433599533697 -3.000000000000062
+ vertex -170.67210412904052 -113.26001712639697 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9999997814571896 0.0006611244764012646 1.1107217741834893e-16
+ outer loop
+ vertex -183.85290650996637 -86.40944374567495 -3.000000000000062
+ vertex -183.85388894480468 -84.92343822226248 -62.600000000000065
+ vertex -183.85388894480468 -84.92343822226249 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9999997814571896 0.0006611244764012646 1.1107217741834893e-16
+ outer loop
+ vertex -183.85388894480468 -84.92343822226248 -62.600000000000065
+ vertex -183.85290650996637 -86.40944374567495 -3.000000000000062
+ vertex -183.85290650996635 -86.40944374567493 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.5005724413202164 0.8656946522826156 1.879626683638603e-16
+ outer loop
+ vertex -165.47279934959988 -116.76041929963284 -3.000000000000062
+ vertex -166.7592266656199 -116.01656572439911 -62.600000000000065
+ vertex -166.7592266656199 -116.01656572439911 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.5005724413202164 0.8656946522826156 1.879626683638603e-16
+ outer loop
+ vertex -166.7592266656199 -116.01656572439911 -62.600000000000065
+ vertex -165.47279934959988 -116.76041929963284 -3.000000000000062
+ vertex -165.47279934959988 -116.76041929963284 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9964462355504107 0.08423122732939085 1.2346042516618458e-16
+ outer loop
+ vertex -183.6646079114895 -89.37483292412786 -3.000000000000062
+ vertex -183.78977600789938 -87.89410799071463 -62.600000000000065
+ vertex -183.78977600789938 -87.89410799071464 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9964462355504107 0.08423122732939085 1.2346042516618458e-16
+ outer loop
+ vertex -183.78977600789938 -87.89410799071463 -62.600000000000065
+ vertex -183.6646079114895 -89.37483292412786 -3.000000000000062
+ vertex -183.6646079114895 -89.37483292412786 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9861411980746724 -0.165908219988794 8.405641526142146e-17
+ outer loop
+ vertex -183.48447425047996 -80.48336222235157 -3.000000000000062
+ vertex -183.2379336653174 -79.01795063489288 -62.600000000000065
+ vertex -183.23793366531743 -79.01795063489288 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9861411980746724 -0.165908219988794 8.405641526142146e-17
+ outer loop
+ vertex -183.2379336653174 -79.01795063489288 -62.600000000000065
+ vertex -183.48447425047996 -80.48336222235157 -3.000000000000062
+ vertex -183.48447425047996 -80.48336222235157 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.6377703208595259 0.7702266016119785 1.8858520825170087e-16
+ outer loop
+ vertex -170.4163762698104 -113.47176732886022 -3.000000000000062
+ vertex -170.67210412904052 -113.26001712639697 -62.600000000000065
+ vertex -170.67210412904052 -113.26001712639697 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.6377703208595259 0.7702266016119785 1.8858520825170087e-16
+ outer loop
+ vertex -170.67210412904052 -113.26001712639697 -62.600000000000065
+ vertex -170.4163762698104 -113.47176732886022 -3.000000000000062
+ vertex -170.4163762698104 -113.47176732886022 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.5711695004343895 0.82083213982734 1.8893488826187023e-16
+ outer loop
+ vertex -168.0134183668812 -115.21956098333553 -3.000000000000062
+ vertex -169.23317972702915 -114.37079976539466 -62.600000000000065
+ vertex -169.23317972702915 -114.37079976539466 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.5711695004343895 0.82083213982734 1.8893488826187023e-16
+ outer loop
+ vertex -169.23317972702915 -114.37079976539466 -62.600000000000065
+ vertex -168.0134183668812 -115.21956098333553 -3.000000000000062
+ vertex -168.01341836688118 -115.21956098333553 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 7.69786561188505e-17
+ outer loop
+ vertex -161.12500000000006 -104.86124264156595 -3.000000000000062
+ vertex -154.54940691211777 -101.06482220219569 -62.600000000000065
+ vertex -161.12500000000003 -104.86124264156595 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 7.69786561188505e-17
+ outer loop
+ vertex -154.54940691211777 -101.06482220219569 -62.600000000000065
+ vertex -161.12500000000006 -104.86124264156595 -3.000000000000062
+ vertex -154.54940691211777 -101.0648222021957 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.1884462435099412 0.9820835062798846 1.7112811674140545e-16
+ outer loop
+ vertex -155.76040280706803 -120.38207845891769 -3.000000000000062
+ vertex -154.30102097334645 -120.66211067883884 -62.600000000000065
+ vertex -155.760402807068 -120.38207845891769 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.1884462435099412 0.9820835062798846 1.7112811674140545e-16
+ outer loop
+ vertex -154.30102097334645 -120.66211067883884 -62.600000000000065
+ vertex -155.76040280706803 -120.38207845891769 -3.000000000000062
+ vertex -154.30102097334645 -120.66211067883884 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9301944916753182 -0.36706703428242676 4.7079405236779536e-17
+ outer loop
+ vertex -181.1014998491836 -71.91527419881089 -3.000000000000062
+ vertex -181.64696360879708 -73.2975486533744 -62.600000000000065
+ vertex -181.10149984918357 -71.91527419881089 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9301944916753182 -0.36706703428242676 4.7079405236779536e-17
+ outer loop
+ vertex -181.64696360879708 -73.2975486533744 -62.600000000000065
+ vertex -181.1014998491836 -71.91527419881089 -3.000000000000062
+ vertex -181.64696360879708 -73.2975486533744 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.3098971353857546 0.9507700907578569 1.7981606344395074e-16
+ outer loop
+ vertex -158.63766952233075 -119.64023912920041 -3.000000000000062
+ vertex -160.05051943746045 -119.17973017368655 -62.600000000000065
+ vertex -160.05051943746048 -119.17973017368655 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.3098971353857546 0.9507700907578569 1.7981606344395074e-16
+ outer loop
+ vertex -160.05051943746045 -119.17973017368655 -62.600000000000065
+ vertex -158.63766952233075 -119.64023912920041 -3.000000000000062
+ vertex -158.63766952233073 -119.64023912920041 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.26986211191721243 0.9628989773343732 1.7722852548447586e-16
+ outer loop
+ vertex -157.20679601081656 -120.04125580570843 -3.000000000000062
+ vertex -158.63766952233073 -119.64023912920041 -62.600000000000065
+ vertex -158.63766952233075 -119.64023912920041 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.26986211191721243 0.9628989773343732 1.7722852548447586e-16
+ outer loop
+ vertex -158.63766952233073 -119.64023912920041 -62.600000000000065
+ vertex -157.20679601081656 -120.04125580570843 -3.000000000000062
+ vertex -157.20679601081653 -120.04125580570843 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.996556739113654 -0.08291360399331692 9.790680320921971e-17
+ outer loop
+ vertex -183.79272159323875 -83.43869180085144 -3.000000000000062
+ vertex -183.66951149281198 -81.95780265849699 -62.600000000000065
+ vertex -183.66951149281198 -81.95780265849699 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.996556739113654 -0.08291360399331692 9.790680320921971e-17
+ outer loop
+ vertex -183.66951149281198 -81.95780265849699 -62.600000000000065
+ vertex -183.79272159323875 -83.43869180085144 -3.000000000000062
+ vertex -183.79272159323875 -83.43869180085144 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9920516018175792 0.1258317103562346 1.2933581127401296e-16
+ outer loop
+ vertex -183.4776212540151 -90.84902740611355 -3.000000000000062
+ vertex -183.6646079114895 -89.37483292412786 -62.600000000000065
+ vertex -183.6646079114895 -89.37483292412786 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9920516018175792 0.1258317103562346 1.2933581127401296e-16
+ outer loop
+ vertex -183.6646079114895 -89.37483292412786 -62.600000000000065
+ vertex -183.4776212540151 -90.84902740611355 -3.000000000000062
+ vertex -183.4776212540151 -90.84902740611355 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9063077870366506 -0.42261826174069833 -1.6521615319541632e-16
+ outer loop
+ vertex -121.30115981622716 -94.96515470653594 -62.600000000000065
+ vertex -121.60137838360578 -94.32133391112701 -3.000000000000062
+ vertex -121.60137838360576 -94.32133391112701 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9063077870366506 -0.42261826174069833 -1.6521615319541632e-16
+ outer loop
+ vertex -121.60137838360578 -94.32133391112701 -3.000000000000062
+ vertex -121.30115981622716 -94.96515470653594 -62.600000000000065
+ vertex -121.30115981622716 -94.96515470653594 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -161.12500000000006 -104.86124264156595 -3.000000000000062
+ vertex -162.12500000000003 -103.12919183399708 -62.600000000000065
+ vertex -162.12500000000006 -103.12919183399708 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -162.12500000000003 -103.12919183399708 -62.600000000000065
+ vertex -161.12500000000006 -104.86124264156595 -3.000000000000062
+ vertex -161.12500000000003 -104.86124264156595 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 -7.697865611885051e-17
+ outer loop
+ vertex -170.37500000000006 -88.83977267155386 -62.600000000000065
+ vertex -174.92783335074782 -91.46835223218358 -3.000000000000062
+ vertex -174.9278333507478 -91.46835223218358 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 -7.697865611885051e-17
+ outer loop
+ vertex -174.92783335074782 -91.46835223218358 -3.000000000000062
+ vertex -170.37500000000006 -88.83977267155386 -62.600000000000065
+ vertex -170.37500000000006 -88.83977267155386 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 7.697865611885051e-17
+ outer loop
+ vertex -166.67783335074782 -105.75777139462681 -3.000000000000062
+ vertex -162.12500000000003 -103.12919183399708 -62.600000000000065
+ vertex -166.67783335074782 -105.75777139462681 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 7.697865611885051e-17
+ outer loop
+ vertex -162.12500000000003 -103.12919183399708 -62.600000000000065
+ vertex -166.67783335074782 -105.75777139462681 -3.000000000000062
+ vertex -162.12500000000006 -103.12919183399708 -3.000000000000062
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376092e-16 1.629868445721389e-16
+ outer loop
+ vertex -150.00000000000009 -121.1247965983122 -3.000000000000062
+ vertex -150.00000000000006 -104.43433599533697 -62.600000000000065
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376092e-16 1.629868445721389e-16
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -62.600000000000065
+ vertex -150.00000000000009 -121.1247965983122 -3.000000000000062
+ vertex -150.00000000000009 -121.1247965983122 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376092e-16 1.629868445721389e-16
+ outer loop
+ vertex -150.00000000000009 -121.1247965983122 -62.600000000000065
+ vertex -150.00000000000009 -121.1247965983122 -3.000000000000062
+ vertex -150.00000000000009 -124.13030787576977 -3.000000000000062
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376092e-16 1.629868445721389e-16
+ outer loop
+ vertex -150.00000000000009 -121.1247965983122 -62.600000000000065
+ vertex -150.00000000000009 -124.13030787576977 -3.000000000000062
+ vertex -150.00000000000006 -124.13030787576977 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 -1.7258201180401957e-16
+ outer loop
+ vertex -165.67783335074782 -107.48982220219568 -62.600000000000065
+ vertex -166.67783335074782 -105.75777139462681 -3.000000000000062
+ vertex -166.67783335074782 -105.75777139462681 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 -1.7258201180401957e-16
+ outer loop
+ vertex -166.67783335074782 -105.75777139462681 -3.000000000000062
+ vertex -165.67783335074782 -107.48982220219568 -62.600000000000065
+ vertex -165.67783335074782 -107.48982220219568 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 -7.69786561188505e-17
+ outer loop
+ vertex -164.79940691211777 -83.31130142461471 -3.000000000000062
+ vertex -171.37500000000006 -87.10772186398499 -62.600000000000065
+ vertex -164.79940691211775 -83.31130142461471 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.49999999999999967 -0.8660254037844388 -7.69786561188505e-17
+ outer loop
+ vertex -171.37500000000006 -87.10772186398499 -62.600000000000065
+ vertex -164.79940691211777 -83.31130142461471 -3.000000000000062
+ vertex -171.37500000000006 -87.10772186398499 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 -1.725820118040196e-16
+ outer loop
+ vertex -154.54940691211777 -101.06482220219569 -62.600000000000065
+ vertex -164.79940691211777 -83.31130142461471 -3.000000000000062
+ vertex -164.79940691211775 -83.31130142461471 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 -1.725820118040196e-16
+ outer loop
+ vertex -164.79940691211777 -83.31130142461471 -3.000000000000062
+ vertex -154.54940691211777 -101.06482220219569 -62.600000000000065
+ vertex -154.54940691211777 -101.0648222021957 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.725820118040196e-16
+ outer loop
+ vertex -172.30292768969878 -111.31482220219569 -3.000000000000062
+ vertex -182.55292768969875 -93.5613014246147 -62.600000000000065
+ vertex -182.55292768969878 -93.5613014246147 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.725820118040196e-16
+ outer loop
+ vertex -182.55292768969875 -93.5613014246147 -62.600000000000065
+ vertex -172.30292768969878 -111.31482220219569 -3.000000000000062
+ vertex -172.30292768969878 -111.31482220219567 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -142.45782590751938 -58.19690713431455 -62.600000000000065
+ vertex -142.48536047767337 -58.149215859843274 -3.000000000000051
+ vertex -142.48536047767334 -58.14921585984326 -62.600000000000044
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -142.48536047767337 -58.149215859843274 -3.000000000000051
+ vertex -142.45782590751938 -58.19690713431455 -62.600000000000065
+ vertex -142.45782590751938 -58.19690713431455 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -142.45782590751938 -58.19690713431455 -3.000000000000062
+ vertex -142.45782590751938 -58.19690713431455 -62.600000000000065
+ vertex -137.83892438837398 -66.19707924063145 -35.9058285412303
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -137.83892438837398 -66.19707924063145 -35.9058285412303
+ vertex -142.45782590751938 -58.19690713431455 -62.600000000000065
+ vertex -137.5866466257073 -66.63403714318997 -37.39220118838113
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -137.5866466257073 -66.63403714318997 -37.39220118838113
+ vertex -142.45782590751938 -58.19690713431455 -62.600000000000065
+ vertex -137.2395218533462 -67.23527488548514 -38.800000000000054
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -137.2395218533462 -67.23527488548514 -38.800000000000054
+ vertex -142.45782590751938 -58.19690713431455 -62.600000000000065
+ vertex -136.80348947238699 -67.99050512305173 -40.105137148104696
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -136.80348947238699 -67.99050512305173 -40.105137148104696
+ vertex -142.45782590751938 -58.19690713431455 -62.600000000000065
+ vertex -136.28601011775885 -68.88680565713561 -41.28528137423862
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -136.28601011775885 -68.88680565713561 -41.28528137423862
+ vertex -142.45782590751938 -58.19690713431455 -62.600000000000065
+ vertex -135.6959380046919 -69.9088405370971 -42.32024008349487
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -135.6959380046919 -69.9088405370971 -42.32024008349487
+ vertex -142.45782590751938 -58.19690713431455 -62.600000000000065
+ vertex -121.60137838360576 -94.32133391112701 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -142.45782590751938 -58.19690713431455 -3.000000000000062
+ vertex -137.83892438837398 -66.19707924063145 -35.9058285412303
+ vertex -137.99203859888243 -65.93187764867001 -34.36631430664067
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -142.45782590751938 -58.19690713431455 -3.000000000000062
+ vertex -137.99203859888243 -65.93187764867001 -34.36631430664067
+ vertex -138.04336943063956 -65.84297004007189 -32.800000000000054
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -135.6959380046919 -69.9088405370971 -42.32024008349487
+ vertex -121.60137838360576 -94.32133391112701 -62.600000000000065
+ vertex -135.04336943063956 -71.03912246277851 -43.19230484541332
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -135.04336943063956 -71.03912246277851 -43.19230484541332
+ vertex -121.60137838360576 -94.32133391112701 -62.600000000000065
+ vertex -134.33947002483012 -72.25831199705806 -43.8865543901355
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -134.33947002483012 -72.25831199705806 -43.8865543901355
+ vertex -121.60137838360576 -94.32133391112701 -62.600000000000065
+ vertex -133.5962837012547 -73.54554846898098 -44.391109915468874
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -133.5962837012547 -73.54554846898098 -44.391109915468874
+ vertex -121.60137838360576 -94.32133391112701 -62.600000000000065
+ vertex -132.8265265839599 -74.87880690562336 -44.69733833648578
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -132.8265265839599 -74.87880690562336 -44.69733833648578
+ vertex -121.60137838360576 -94.32133391112701 -62.600000000000065
+ vertex -132.0433694306396 -76.23527488548514 -44.800000000000054
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -132.0433694306396 -76.23527488548514 -44.800000000000054
+ vertex -121.60137838360576 -94.32133391112701 -62.600000000000065
+ vertex -131.26021227731925 -77.59174286534694 -44.69733833648578
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -131.26021227731925 -77.59174286534694 -44.69733833648578
+ vertex -121.60137838360576 -94.32133391112701 -62.600000000000065
+ vertex -130.49045516002442 -78.92500130198931 -44.391109915468874
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -130.49045516002442 -78.92500130198931 -44.391109915468874
+ vertex -121.60137838360576 -94.32133391112701 -62.600000000000065
+ vertex -129.74726883644905 -80.21223777391224 -43.8865543901355
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -129.74726883644905 -80.21223777391224 -43.8865543901355
+ vertex -121.60137838360576 -94.32133391112701 -62.600000000000065
+ vertex -129.0433694306396 -81.43142730819177 -43.192304845413325
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -129.0433694306396 -81.43142730819177 -43.192304845413325
+ vertex -121.60137838360576 -94.32133391112701 -62.600000000000065
+ vertex -128.39080085658725 -82.56170923387319 -42.32024008349488
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -128.39080085658725 -82.56170923387319 -42.32024008349488
+ vertex -121.60137838360576 -94.32133391112701 -62.600000000000065
+ vertex -127.8007287435203 -83.5837441138347 -41.285281374238636
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -127.8007287435203 -83.5837441138347 -41.285281374238636
+ vertex -121.60137838360576 -94.32133391112701 -62.600000000000065
+ vertex -127.28324938889217 -84.48004464791855 -40.10513714810471
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -127.28324938889217 -84.48004464791855 -40.10513714810471
+ vertex -121.60137838360576 -94.32133391112701 -62.600000000000065
+ vertex -126.84721700793295 -85.23527488548515 -38.80000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -126.84721700793295 -85.23527488548515 -38.80000000000006
+ vertex -121.60137838360576 -94.32133391112701 -62.600000000000065
+ vertex -126.50009223557186 -85.83651262778034 -37.392201188381144
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -126.50009223557186 -85.83651262778034 -37.392201188381144
+ vertex -121.60137838360576 -94.32133391112701 -62.600000000000065
+ vertex -126.24781447290516 -86.27347053033886 -35.905828541230306
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -126.24781447290516 -86.27347053033886 -35.905828541230306
+ vertex -121.60137838360576 -94.32133391112701 -62.600000000000065
+ vertex -126.09470026239671 -86.53867212230028 -34.36631430664068
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -126.09470026239671 -86.53867212230028 -34.36631430664068
+ vertex -121.60137838360576 -94.32133391112701 -62.600000000000065
+ vertex -126.04336943063956 -86.62757973089842 -32.800000000000054
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -142.45782590751938 -58.19690713431455 -3.000000000000062
+ vertex -135.6959380046919 -69.9088405370971 -23.279759916505228
+ vertex -121.60137838360578 -94.32133391112701 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -135.6959380046919 -69.9088405370971 -23.279759916505228
+ vertex -142.45782590751938 -58.19690713431455 -3.000000000000062
+ vertex -136.28601011775885 -68.88680565713561 -24.314718625761483
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -136.28601011775885 -68.88680565713561 -24.314718625761483
+ vertex -142.45782590751938 -58.19690713431455 -3.000000000000062
+ vertex -136.80348947238699 -67.99050512305173 -25.4948628518954
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -136.80348947238699 -67.99050512305173 -25.4948628518954
+ vertex -142.45782590751938 -58.19690713431455 -3.000000000000062
+ vertex -137.2395218533462 -67.23527488548514 -26.800000000000054
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -137.2395218533462 -67.23527488548514 -26.800000000000054
+ vertex -142.45782590751938 -58.19690713431455 -3.000000000000062
+ vertex -137.5866466257073 -66.63403714318997 -28.207798811618975
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -137.5866466257073 -66.63403714318997 -28.207798811618975
+ vertex -142.45782590751938 -58.19690713431455 -3.000000000000062
+ vertex -137.83892438837398 -66.19707924063145 -29.6941714587698
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -137.83892438837398 -66.19707924063145 -29.6941714587698
+ vertex -142.45782590751938 -58.19690713431455 -3.000000000000062
+ vertex -137.99203859888243 -65.93187764867001 -31.233685693359433
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -137.99203859888243 -65.93187764867001 -31.233685693359433
+ vertex -142.45782590751938 -58.19690713431455 -3.000000000000062
+ vertex -138.04336943063956 -65.84297004007189 -32.800000000000054
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -121.60137838360578 -94.32133391112701 -3.000000000000062
+ vertex -135.6959380046919 -69.9088405370971 -23.279759916505228
+ vertex -135.04336943063956 -71.03912246277852 -22.40769515458679
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -121.60137838360578 -94.32133391112701 -3.000000000000062
+ vertex -135.04336943063956 -71.03912246277852 -22.40769515458679
+ vertex -134.33947002483012 -72.25831199705806 -21.71344560986461
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -121.60137838360578 -94.32133391112701 -3.000000000000062
+ vertex -134.33947002483012 -72.25831199705806 -21.71344560986461
+ vertex -133.5962837012547 -73.54554846898098 -21.208890084531234
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -121.60137838360578 -94.32133391112701 -3.000000000000062
+ vertex -133.5962837012547 -73.54554846898098 -21.208890084531234
+ vertex -132.8265265839599 -74.87880690562336 -20.90266166351433
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -121.60137838360578 -94.32133391112701 -3.000000000000062
+ vertex -132.8265265839599 -74.87880690562336 -20.90266166351433
+ vertex -132.0433694306396 -76.23527488548514 -20.80000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -121.60137838360578 -94.32133391112701 -3.000000000000062
+ vertex -132.0433694306396 -76.23527488548514 -20.80000000000005
+ vertex -131.26021227731925 -77.59174286534694 -20.90266166351433
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -121.60137838360578 -94.32133391112701 -3.000000000000062
+ vertex -131.26021227731925 -77.59174286534694 -20.90266166351433
+ vertex -130.49045516002442 -78.92500130198931 -21.208890084531237
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -121.60137838360578 -94.32133391112701 -3.000000000000062
+ vertex -130.49045516002442 -78.92500130198931 -21.208890084531237
+ vertex -129.74726883644902 -80.21223777391226 -21.71344560986461
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -121.60137838360578 -94.32133391112701 -3.000000000000062
+ vertex -129.74726883644902 -80.21223777391226 -21.71344560986461
+ vertex -129.04336943063956 -81.43142730819179 -22.407695154586794
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -121.60137838360578 -94.32133391112701 -3.000000000000062
+ vertex -129.04336943063956 -81.43142730819179 -22.407695154586794
+ vertex -128.39080085658725 -82.56170923387319 -23.279759916505235
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -121.60137838360578 -94.32133391112701 -3.000000000000062
+ vertex -128.39080085658725 -82.56170923387319 -23.279759916505235
+ vertex -127.8007287435203 -83.5837441138347 -24.314718625761483
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -121.60137838360578 -94.32133391112701 -3.000000000000062
+ vertex -127.8007287435203 -83.5837441138347 -24.314718625761483
+ vertex -127.28324938889217 -84.48004464791856 -25.494862851895416
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -121.60137838360578 -94.32133391112701 -3.000000000000062
+ vertex -127.28324938889217 -84.48004464791856 -25.494862851895416
+ vertex -126.84721700793295 -85.23527488548515 -26.800000000000058
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -121.60137838360578 -94.32133391112701 -3.000000000000062
+ vertex -126.84721700793295 -85.23527488548515 -26.800000000000058
+ vertex -126.50009223557186 -85.83651262778034 -28.207798811618986
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -121.60137838360578 -94.32133391112701 -3.000000000000062
+ vertex -126.50009223557186 -85.83651262778034 -28.207798811618986
+ vertex -126.24781447290516 -86.27347053033886 -29.69417145876981
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -121.60137838360578 -94.32133391112701 -3.000000000000062
+ vertex -126.24781447290516 -86.27347053033886 -29.69417145876981
+ vertex -126.09470026239671 -86.53867212230028 -31.233685693359437
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -121.60137838360578 -94.32133391112701 -3.000000000000062
+ vertex -126.09470026239671 -86.53867212230028 -31.233685693359437
+ vertex -126.04336943063956 -86.62757973089842 -32.800000000000054
+ endloop
+endfacet
+facet normal -0.8660254037844389 -0.4999999999999997 -1.892594954730131e-16
+ outer loop
+ vertex -121.60137838360578 -94.32133391112701 -3.000000000000062
+ vertex -126.04336943063956 -86.62757973089842 -32.800000000000054
+ vertex -121.60137838360576 -94.32133391112701 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -170.37500000000006 -88.83977267155386 -3.000000000000062
+ vertex -171.37500000000006 -87.10772186398499 -62.600000000000065
+ vertex -171.37500000000006 -87.10772186398499 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -171.37500000000006 -87.10772186398499 -62.600000000000065
+ vertex -170.37500000000006 -88.83977267155386 -3.000000000000062
+ vertex -170.37500000000006 -88.83977267155386 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 7.69786561188505e-17
+ outer loop
+ vertex -172.30292768969878 -111.31482220219569 -3.000000000000062
+ vertex -165.67783335074782 -107.48982220219568 -62.600000000000065
+ vertex -172.30292768969878 -111.31482220219567 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.49999999999999967 0.8660254037844388 7.69786561188505e-17
+ outer loop
+ vertex -165.67783335074782 -107.48982220219568 -62.600000000000065
+ vertex -172.30292768969878 -111.31482220219569 -3.000000000000062
+ vertex -165.67783335074782 -107.48982220219568 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 -1.7258201180401957e-16
+ outer loop
+ vertex -174.9278333507478 -91.46835223218358 -62.600000000000065
+ vertex -175.92783335074782 -89.73630142461471 -3.000000000000062
+ vertex -175.9278333507478 -89.73630142461471 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.866025403784439 -0.4999999999999995 -1.7258201180401957e-16
+ outer loop
+ vertex -175.92783335074782 -89.73630142461471 -3.000000000000062
+ vertex -174.9278333507478 -91.46835223218358 -62.600000000000065
+ vertex -174.92783335074782 -91.46835223218358 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.463928679161666 0.8858725532780165 1.869826112231559e-16
+ outer loop
+ vertex -164.15638755469692 -117.4498200300001 -3.000000000000062
+ vertex -165.47279934959988 -116.76041929963284 -62.600000000000065
+ vertex -165.47279934959988 -116.76041929963284 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.463928679161666 0.8858725532780165 1.869826112231559e-16
+ outer loop
+ vertex -165.47279934959988 -116.76041929963284 -62.600000000000065
+ vertex -164.15638755469692 -117.4498200300001 -3.000000000000062
+ vertex -164.1563875546969 -117.4498200300001 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.5088614820537041 -0.8608484141137207 -1.8814124863278161e-16
+ outer loop
+ vertex -166.9427879993213 -80.28471878135092 -62.60000000000008
+ vertex -181.1014998491836 -71.91527419881089 -3.000000000000062
+ vertex -181.10149984918357 -71.91527419881089 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.5088614820537041 -0.8608484141137207 -1.8814124863278161e-16
+ outer loop
+ vertex -181.1014998491836 -71.91527419881089 -3.000000000000062
+ vertex -166.9427879993213 -80.28471878135092 -62.60000000000008
+ vertex -166.9427879993213 -80.28471878135093 -3.0000000000000733
+ endloop
+endfacet
+facet normal -0.9961946980917453 0.0871557427476599 -9.72177645250264e-17
+ outer loop
+ vertex -121.11730055134129 -97.06667572052845 -62.600000000000065
+ vertex -121.05538705967449 -96.35900127253034 -3.000000000000062
+ vertex -121.05538705967449 -96.35900127253032 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9961946980917453 0.0871557427476599 -9.72177645250264e-17
+ outer loop
+ vertex -121.05538705967449 -96.35900127253034 -3.000000000000062
+ vertex -121.11730055134129 -97.06667572052845 -62.600000000000065
+ vertex -121.11730055134132 -97.06667572052847 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9684976081015079 -0.24902285658480888 -1.4556488299553898e-16
+ outer loop
+ vertex -185.4387908187414 -96.0143915896302 -62.600000000000065
+ vertex -185.8400915835195 -94.45365601640981 -3.000000000000062
+ vertex -185.8400915835195 -94.4536560164098 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9684976081015079 -0.24902285658480888 -1.4556488299553898e-16
+ outer loop
+ vertex -185.8400915835195 -94.45365601640981 -3.000000000000062
+ vertex -185.4387908187414 -96.0143915896302 -62.600000000000065
+ vertex -185.4387908187414 -96.01439158963021 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9780650504691567 -0.20829968087053335 -1.4039771887661552e-16
+ outer loop
+ vertex -185.8400915835195 -94.4536560164098 -62.600000000000065
+ vertex -186.1757668800877 -92.8775024932399 -3.000000000000062
+ vertex -186.1757668800877 -92.8775024932399 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9780650504691567 -0.20829968087053335 -1.4039771887661552e-16
+ outer loop
+ vertex -186.1757668800877 -92.8775024932399 -3.000000000000062
+ vertex -185.8400915835195 -94.4536560164098 -62.600000000000065
+ vertex -185.8400915835195 -94.45365601640981 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9999473364568806 -0.010262763409049967 -1.1253499041091418e-16
+ outer loop
+ vertex -152.83120430088542 -120.88086243345154 -62.600000000000065
+ vertex -153.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -153.00000000000006 -104.43433599533697 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9999473364568806 -0.010262763409049967 -1.1253499041091418e-16
+ outer loop
+ vertex -153.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -152.83120430088542 -120.88086243345154 -62.600000000000065
+ vertex -152.83120430088542 -120.88086243345154 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9301944916753129 0.3670670342824406 -4.7079405236776824e-17
+ outer loop
+ vertex -184.45996930827113 -72.25495624273319 -3.000000000000062
+ vertex -183.86844014664095 -70.75594620798753 -62.600000000000065
+ vertex -184.45996930827113 -72.25495624273319 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9301944916753129 0.3670670342824406 -4.7079405236776824e-17
+ outer loop
+ vertex -183.86844014664095 -70.75594620798753 -62.600000000000065
+ vertex -184.45996930827113 -72.25495624273319 -3.000000000000062
+ vertex -183.86844014664098 -70.75594620798753 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -150.52555624752688 -100.43433599533697 -3.000000000000062
+ vertex -162.24146450794694 -80.14178763147345 -62.600000000000065
+ vertex -162.24146450794694 -80.14178763147346 -3.0000000000000733
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -162.24146450794694 -80.14178763147345 -62.600000000000065
+ vertex -150.52555624752688 -100.43433599533697 -3.000000000000062
+ vertex -150.52555624752685 -100.43433599533697 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.832965141375823 -0.5533254677427698 -1.7706975454735813e-16
+ outer loop
+ vertex -179.97359427394684 -107.62533725842027 -62.600000000000065
+ vertex -180.8652792237608 -106.28301249011629 -3.000000000000062
+ vertex -180.8652792237608 -106.28301249011629 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.832965141375823 -0.5533254677427698 -1.7706975454735813e-16
+ outer loop
+ vertex -180.8652792237608 -106.28301249011629 -3.000000000000062
+ vertex -179.97359427394684 -107.62533725842027 -62.600000000000065
+ vertex -179.97359427394684 -107.62533725842027 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.5735764363510409 0.8191520442889955 6.164421566816318e-17
+ outer loop
+ vertex -123.09305442107782 -99.88834467140568 -3.000000000000062
+ vertex -122.5111471173357 -99.48088879078615 -62.600000000000065
+ vertex -123.09305442107781 -99.88834467140568 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.5735764363510409 0.8191520442889955 6.164421566816318e-17
+ outer loop
+ vertex -122.5111471173357 -99.48088879078615 -62.600000000000065
+ vertex -123.09305442107782 -99.88834467140568 -3.000000000000062
+ vertex -122.51114711733571 -99.48088879078617 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.6377703208595383 -0.7702266016119681 -1.8858520825170067e-16
+ outer loop
+ vertex -172.2809385364518 -115.82196041748443 -62.600000000000065
+ vertex -173.52216003924204 -114.7941924405858 -3.000000000000062
+ vertex -173.522160039242 -114.79419244058579 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.6377703208595383 -0.7702266016119681 -1.8858520825170067e-16
+ outer loop
+ vertex -173.52216003924204 -114.7941924405858 -3.000000000000062
+ vertex -172.2809385364518 -115.82196041748443 -62.600000000000065
+ vertex -172.28093853645183 -115.82196041748446 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.7071067811865518 0.7071067811865431 2.968816052123318e-17
+ outer loop
+ vertex -122.51114711733571 -99.48088879078617 -3.000000000000062
+ vertex -122.0088342642253 -98.97857593767576 -62.600000000000065
+ vertex -122.5111471173357 -99.48088879078615 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.7071067811865518 0.7071067811865431 2.968816052123318e-17
+ outer loop
+ vertex -122.0088342642253 -98.97857593767576 -62.600000000000065
+ vertex -122.51114711733571 -99.48088879078617 -3.000000000000062
+ vertex -122.0088342642253 -98.97857593767576 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.6694253404686544 -0.7428793398247298 -1.8791505907811667e-16
+ outer loop
+ vertex -173.522160039242 -114.79419244058579 -62.600000000000065
+ vertex -174.7193113822874 -113.7154123447499 -3.000000000000062
+ vertex -174.71931138228737 -113.7154123447499 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.6694253404686544 -0.7428793398247298 -1.8791505907811667e-16
+ outer loop
+ vertex -174.7193113822874 -113.7154123447499 -3.000000000000062
+ vertex -173.522160039242 -114.79419244058579 -62.600000000000065
+ vertex -173.52216003924204 -114.7941924405858 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9140288370919263 0.4056492141794201 -3.9384090777526054e-17
+ outer loop
+ vertex -183.86844014664098 -70.75594620798753 -3.000000000000062
+ vertex -183.21473573526941 -69.28298715360737 -62.600000000000065
+ vertex -183.86844014664095 -70.75594620798753 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9140288370919263 0.4056492141794201 -3.9384090777526054e-17
+ outer loop
+ vertex -183.21473573526941 -69.28298715360737 -62.600000000000065
+ vertex -183.86844014664098 -70.75594620798753 -3.000000000000062
+ vertex -183.21473573526944 -69.28298715360738 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -134.33338692256274 -31.80357931201398 -62.60000000000003
+ vertex -137.79045781652974 -37.79140174573234 -42.69777747886726
+ vertex -138.17868638418352 -38.463833349858376 -42.800000000000054
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -137.79045781652974 -37.79140174573234 -42.69777747886726
+ vertex -134.33338692256274 -31.80357931201398 -62.60000000000003
+ vertex -137.42868638418355 -37.16479524418171 -42.39807621135338
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -137.42868638418355 -37.16479524418171 -42.39807621135338
+ vertex -134.33338692256274 -31.80357931201398 -62.60000000000003
+ vertex -137.11802621240372 -36.62671604277097 -41.9213203435597
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -137.11802621240372 -36.62671604277097 -41.9213203435597
+ vertex -134.33338692256274 -31.80357931201398 -62.60000000000003
+ vertex -136.87964827850686 -36.21383334985837 -41.30000000000006
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -136.87964827850686 -36.21383334985837 -41.30000000000006
+ vertex -134.33338692256274 -31.80357931201398 -62.60000000000003
+ vertex -136.72979764474994 -35.95428443864494 -40.57645713530762
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -136.72979764474994 -35.95428443864494 -40.57645713530762
+ vertex -134.33338692256274 -31.80357931201398 -62.60000000000003
+ vertex -136.67868638418355 -35.86575713850504 -39.800000000000054
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -136.67868638418355 -35.86575713850504 -39.800000000000054
+ vertex -134.33338692256274 -31.80357931201398 -62.60000000000003
+ vertex -134.33338692256277 -31.803579312013984 -3.0000000000000284
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -136.67868638418355 -35.86575713850504 -39.800000000000054
+ vertex -134.33338692256277 -31.803579312013984 -3.0000000000000284
+ vertex -136.67868638418352 -35.86575713850505 -25.800000000000054
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -136.67868638418352 -35.86575713850505 -25.800000000000054
+ vertex -134.33338692256277 -31.803579312013984 -3.0000000000000284
+ vertex -136.7297976447499 -35.95428443864494 -25.02354286469249
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -136.7297976447499 -35.95428443864494 -25.02354286469249
+ vertex -134.33338692256277 -31.803579312013984 -3.0000000000000284
+ vertex -136.87964827850686 -36.213833349858376 -24.300000000000058
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -136.87964827850686 -36.213833349858376 -24.300000000000058
+ vertex -134.33338692256277 -31.803579312013984 -3.0000000000000284
+ vertex -137.1180262124037 -36.62671604277098 -23.678679656440412
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -137.1180262124037 -36.62671604277098 -23.678679656440412
+ vertex -134.33338692256277 -31.803579312013984 -3.0000000000000284
+ vertex -137.42868638418352 -37.164795244181704 -23.201923788646738
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -137.42868638418352 -37.164795244181704 -23.201923788646738
+ vertex -134.33338692256277 -31.803579312013984 -3.0000000000000284
+ vertex -137.79045781652974 -37.791401745732315 -22.902222521132845
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -137.79045781652974 -37.791401745732315 -22.902222521132845
+ vertex -134.33338692256277 -31.803579312013984 -3.0000000000000284
+ vertex -138.17868638418352 -38.46383334985837 -22.800000000000054
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -138.17868638418352 -38.46383334985837 -22.800000000000054
+ vertex -134.33338692256277 -31.803579312013984 -3.0000000000000284
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -139.62757512361713 -40.97338226107177 -40.576457135307614
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -139.62757512361713 -40.97338226107177 -40.576457135307614
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -139.4777244898602 -40.71383334985835 -41.300000000000054
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -139.4777244898602 -40.71383334985835 -41.300000000000054
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -134.33338692256274 -31.80357931201398 -62.60000000000003
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -139.4777244898602 -40.71383334985835 -41.300000000000054
+ vertex -134.33338692256274 -31.80357931201398 -62.60000000000003
+ vertex -139.23934655596338 -40.30095065694574 -41.9213203435597
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -139.23934655596338 -40.30095065694574 -41.9213203435597
+ vertex -134.33338692256274 -31.80357931201398 -62.60000000000003
+ vertex -138.92868638418352 -39.76287145553502 -42.39807621135337
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -138.92868638418352 -39.76287145553502 -42.39807621135337
+ vertex -134.33338692256274 -31.80357931201398 -62.60000000000003
+ vertex -138.56691495183733 -39.13626495398441 -42.69777747886726
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -138.56691495183733 -39.13626495398441 -42.69777747886726
+ vertex -134.33338692256274 -31.80357931201398 -62.60000000000003
+ vertex -138.17868638418352 -38.463833349858376 -42.800000000000054
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -139.62757512361713 -40.97338226107177 -40.576457135307614
+ vertex -139.67868638418355 -41.06190956121165 -39.800000000000054
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -139.67868638418355 -41.06190956121165 -39.800000000000054
+ vertex -139.67868638418355 -41.06190956121165 -25.800000000000047
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -139.67868638418355 -41.06190956121165 -25.800000000000047
+ vertex -139.62757512361713 -40.97338226107177 -25.02354286469249
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -139.62757512361713 -40.97338226107177 -25.02354286469249
+ vertex -139.4777244898602 -40.713833349858334 -24.30000000000005
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -139.4777244898602 -40.713833349858334 -24.30000000000005
+ vertex -139.23934655596335 -40.30095065694573 -23.678679656440412
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -139.23934655596335 -40.30095065694573 -23.678679656440412
+ vertex -138.92868638418352 -39.76287145553501 -23.201923788646738
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -138.92868638418352 -39.76287145553501 -23.201923788646738
+ vertex -138.56691495183733 -39.13626495398439 -22.902222521132845
+ endloop
+endfacet
+facet normal 0.866025403784438 -0.5000000000000011 1.9625534153898658e-17
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -138.56691495183733 -39.13626495398439 -22.902222521132845
+ vertex -138.17868638418352 -38.46383334985837 -22.800000000000054
+ endloop
+endfacet
+facet normal 0.8660254037844383 -0.500000000000001 1.9625534153898698e-17
+ outer loop
+ vertex -149.54404727542408 -58.14921585984325 -62.60000000000005
+ vertex -162.24146450794694 -80.14178763147346 -3.0000000000000733
+ vertex -162.24146450794694 -80.14178763147345 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844383 -0.500000000000001 1.9625534153898698e-17
+ outer loop
+ vertex -162.24146450794694 -80.14178763147346 -3.0000000000000733
+ vertex -149.54404727542408 -58.14921585984325 -62.60000000000005
+ vertex -149.54404727542408 -58.14921585984326 -3.000000000000051
+ endloop
+endfacet
+facet normal -0.9688260316082291 0.24774204422796448 -6.961791905771806e-17
+ outer loop
+ vertex -185.85170873014454 -76.88186053635415 -62.600000000000065
+ vertex -185.4524719966983 -75.32059570808374 -3.000000000000062
+ vertex -185.4524719966983 -75.32059570808373 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9688260316082291 0.24774204422796448 -6.961791905771806e-17
+ outer loop
+ vertex -185.4524719966983 -75.32059570808374 -3.000000000000062
+ vertex -185.85170873014454 -76.88186053635415 -62.600000000000065
+ vertex -185.85170873014454 -76.88186053635415 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9965567391136523 0.08291360399333735 -9.790680320921636e-17
+ outer loop
+ vertex -186.78694043921737 -83.25253728872076 -62.600000000000065
+ vertex -186.65332502274777 -81.64658437726641 -3.000000000000062
+ vertex -186.65332502274777 -81.64658437726641 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9965567391136523 0.08291360399333735 -9.790680320921636e-17
+ outer loop
+ vertex -186.65332502274777 -81.64658437726641 -3.000000000000062
+ vertex -186.78694043921737 -83.25253728872076 -62.600000000000065
+ vertex -186.78694043921737 -83.25253728872076 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.258819045102516 0.9659258262890695 1.1902318351521168e-16
+ outer loop
+ vertex -124.423047334483 -100.37242250367015 -3.000000000000062
+ vertex -123.73687521648672 -100.1885632387843 -62.600000000000065
+ vertex -124.423047334483 -100.37242250367015 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.258819045102516 0.9659258262890695 1.1902318351521168e-16
+ outer loop
+ vertex -123.73687521648672 -100.1885632387843 -62.600000000000065
+ vertex -124.423047334483 -100.37242250367015 -3.000000000000062
+ vertex -123.73687521648675 -100.1885632387843 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9859209640962909 -0.16721199883812263 -1.3498487096514298e-16
+ outer loop
+ vertex -186.1757668800877 -92.8775024932399 -62.600000000000065
+ vertex -186.44522930588298 -91.28868915165077 -3.000000000000062
+ vertex -186.44522930588298 -91.28868915165076 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9859209640962909 -0.16721199883812263 -1.3498487096514298e-16
+ outer loop
+ vertex -186.44522930588298 -91.28868915165077 -3.000000000000062
+ vertex -186.1757668800877 -92.8775024932399 -62.600000000000065
+ vertex -186.1757668800877 -92.8775024932399 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8090947071516227 -0.5876782749593777 -1.7967531110889026e-16
+ outer loop
+ vertex -179.0265497157926 -108.92919478062029 -62.600000000000065
+ vertex -179.97359427394684 -107.62533725842027 -3.000000000000062
+ vertex -179.97359427394684 -107.62533725842027 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.8090947071516227 -0.5876782749593777 -1.7967531110889026e-16
+ outer loop
+ vertex -179.97359427394684 -107.62533725842027 -3.000000000000062
+ vertex -179.0265497157926 -108.92919478062029 -62.600000000000065
+ vertex -179.0265497157926 -108.92919478062029 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.14720786925726986 0.9891055773923907 1.676259211423392e-16
+ outer loop
+ vertex -154.30102097334645 -120.66211067883884 -3.000000000000062
+ vertex -152.83120430088542 -120.88086243345154 -62.600000000000065
+ vertex -154.30102097334645 -120.66211067883884 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.14720786925726986 0.9891055773923907 1.676259211423392e-16
+ outer loop
+ vertex -152.83120430088542 -120.88086243345154 -62.600000000000065
+ vertex -154.30102097334645 -120.66211067883884 -3.000000000000062
+ vertex -152.83120430088542 -120.88086243345154 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8962637115698704 0.4435215432456468 -3.161985758607215e-17
+ outer loop
+ vertex -183.21473573526944 -69.28298715360738 -3.000000000000062
+ vertex -182.50000000000003 -67.83865662978121 -62.600000000000065
+ vertex -183.21473573526941 -69.28298715360737 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.8962637115698704 0.4435215432456468 -3.161985758607215e-17
+ outer loop
+ vertex -182.50000000000003 -67.83865662978121 -62.600000000000065
+ vertex -183.21473573526944 -69.28298715360738 -3.000000000000062
+ vertex -182.50000000000003 -67.83865662978121 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9063077870366494 0.42261826174070066 -3.5931751782467846e-17
+ outer loop
+ vertex -121.60137838360578 -98.39666863393364 -3.000000000000062
+ vertex -121.30115981622716 -97.75284783852473 -62.600000000000065
+ vertex -121.60137838360576 -98.39666863393364 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9063077870366494 0.42261826174070066 -3.5931751782467846e-17
+ outer loop
+ vertex -121.30115981622716 -97.75284783852473 -62.600000000000065
+ vertex -121.60137838360578 -98.39666863393364 -3.000000000000062
+ vertex -121.30115981622716 -97.75284783852474 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9447323868310465 0.3278425190125801 -5.469233483307261e-17
+ outer loop
+ vertex -184.98828809559382 -73.77739412070686 -3.000000000000062
+ vertex -184.45996930827113 -72.25495624273319 -62.600000000000065
+ vertex -184.9882880955938 -73.77739412070684 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9447323868310465 0.3278425190125801 -5.469233483307261e-17
+ outer loop
+ vertex -184.45996930827113 -72.25495624273319 -62.600000000000065
+ vertex -184.98828809559382 -73.77739412070686 -3.000000000000062
+ vertex -184.45996930827113 -72.25495624273319 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9964462355504122 -0.08423122732937333 -1.2346042516618207e-16
+ outer loop
+ vertex -186.6480073251051 -89.68999627675343 -62.600000000000065
+ vertex -186.7837460938633 -88.08422144198268 -3.000000000000062
+ vertex -186.7837460938633 -88.08422144198268 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9964462355504122 -0.08423122732937333 -1.2346042516618207e-16
+ outer loop
+ vertex -186.7837460938633 -88.08422144198268 -3.000000000000062
+ vertex -186.6480073251051 -89.68999627675343 -62.600000000000065
+ vertex -186.6480073251051 -89.68999627675343 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.6049992586789363 -0.7962260338609493 -1.8892534971894305e-16
+ outer loop
+ vertex -170.99781890355263 -116.79691777090852 -62.600000000000065
+ vertex -172.28093853645183 -115.82196041748446 -3.000000000000062
+ vertex -172.2809385364518 -115.82196041748443 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.6049992586789363 -0.7962260338609493 -1.8892534971894305e-16
+ outer loop
+ vertex -172.28093853645183 -115.82196041748446 -3.000000000000062
+ vertex -170.99781890355263 -116.79691777090852 -62.600000000000065
+ vertex -170.99781890355263 -116.79691777090852 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.8925949547301314e-16
+ outer loop
+ vertex -134.33338692256277 -31.803579312013984 -3.0000000000000284
+ vertex -135.488087460942 -29.803579312013984 -62.60000000000003
+ vertex -135.488087460942 -29.803579312013987 -3.0000000000000284
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.8925949547301314e-16
+ outer loop
+ vertex -135.488087460942 -29.803579312013984 -62.60000000000003
+ vertex -134.33338692256277 -31.803579312013984 -3.0000000000000284
+ vertex -134.33338692256274 -31.80357931201398 -62.60000000000003
+ endloop
+endfacet
+facet normal -0.9922171154055797 0.12451986145282407 -9.106128389727817e-17
+ outer loop
+ vertex -186.65332502274777 -81.64658437726641 -62.600000000000065
+ vertex -186.4526610503061 -80.0476247769353 -3.000000000000062
+ vertex -186.4526610503061 -80.04762477693528 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9922171154055797 0.12451986145282407 -9.106128389727817e-17
+ outer loop
+ vertex -186.4526610503061 -80.0476247769353 -3.000000000000062
+ vertex -186.65332502274777 -81.64658437726641 -62.600000000000065
+ vertex -186.65332502274777 -81.64658437726641 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9920516018175768 -0.12583171035625318 -1.293358112740155e-16
+ outer loop
+ vertex -186.44522930588298 -91.28868915165076 -62.600000000000065
+ vertex -186.6480073251051 -89.68999627675343 -3.000000000000062
+ vertex -186.6480073251051 -89.68999627675343 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9920516018175768 -0.12583171035625318 -1.293358112740155e-16
+ outer loop
+ vertex -186.6480073251051 -89.68999627675343 -3.000000000000062
+ vertex -186.44522930588298 -91.28868915165076 -62.600000000000065
+ vertex -186.44522930588298 -91.28868915165077 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.5000000000000009 0.8660254037844384 1.6454656576428186e-16
+ outer loop
+ vertex -179.8971508823612 -69.34141226851 -3.0000000000000733
+ vertex -182.50000000000003 -67.83865662978121 -62.600000000000065
+ vertex -182.50000000000003 -67.83865662978121 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.5000000000000009 0.8660254037844384 1.6454656576428186e-16
+ outer loop
+ vertex -182.50000000000003 -67.83865662978121 -62.600000000000065
+ vertex -179.8971508823612 -69.34141226851 -3.0000000000000733
+ vertex -179.8971508823612 -69.34141226850998 -62.60000000000008
+ endloop
+endfacet
+facet normal 0.5000000000000009 0.8660254037844384 1.6454656576428186e-16
+ outer loop
+ vertex -179.8971508823612 -69.34141226850998 -62.60000000000008
+ vertex -179.8971508823612 -69.34141226851 -3.0000000000000733
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ endloop
+endfacet
+facet normal 0.5000000000000009 0.8660254037844384 1.6454656576428186e-16
+ outer loop
+ vertex -179.8971508823612 -69.34141226850998 -62.60000000000008
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -165.44278799932127 -77.68664256999762 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.0547118733938985e-15 -1.0 -1.529564776501206e-16
+ outer loop
+ vertex -153.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -155.38557599864257 -104.43433599533697 -62.600000000000065
+ vertex -153.00000000000006 -104.43433599533697 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.0547118733938985e-15 -1.0 -1.529564776501206e-16
+ outer loop
+ vertex -155.38557599864257 -104.43433599533697 -62.600000000000065
+ vertex -153.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -155.3855759986426 -104.43433599533697 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8762939397707025 -0.4817768478467397 -1.7093417315095018e-16
+ outer loop
+ vertex -181.7000441941546 -104.9045694272622 -62.600000000000065
+ vertex -182.47642841905977 -103.49242022528482 -3.000000000000062
+ vertex -182.47642841905974 -103.4924202252848 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.8762939397707025 -0.4817768478467397 -1.7093417315095018e-16
+ outer loop
+ vertex -182.47642841905977 -103.49242022528482 -3.000000000000062
+ vertex -181.7000441941546 -104.9045694272622 -62.600000000000065
+ vertex -181.7000441941546 -104.90456942726223 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.699908923976171 -0.7142321038279633 -1.869160749009371e-16
+ outer loop
+ vertex -174.71931138228737 -113.7154123447499 -62.600000000000065
+ vertex -175.87029765489729 -112.58750790128374 -3.000000000000062
+ vertex -175.87029765489726 -112.58750790128374 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.699908923976171 -0.7142321038279633 -1.869160749009371e-16
+ outer loop
+ vertex -175.87029765489729 -112.58750790128374 -3.000000000000062
+ vertex -174.71931138228737 -113.7154123447499 -62.600000000000065
+ vertex -174.7193113822874 -113.7154123447499 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9576170825074752 0.2880443078588285 -6.220955760198349e-17
+ outer loop
+ vertex -185.4524719966983 -75.32059570808374 -3.000000000000062
+ vertex -184.9882880955938 -73.77739412070684 -62.600000000000065
+ vertex -185.4524719966983 -75.32059570808373 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9576170825074752 0.2880443078588285 -6.220955760198349e-17
+ outer loop
+ vertex -184.9882880955938 -73.77739412070684 -62.600000000000065
+ vertex -185.4524719966983 -75.32059570808374 -3.000000000000062
+ vertex -184.98828809559382 -73.77739412070686 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.5711695004343966 -0.8208321398273353 -1.8893488826187028e-16
+ outer loop
+ vertex -169.6750464882625 -117.71735841031693 -62.600000000000065
+ vertex -170.99781890355263 -116.79691777090852 -3.000000000000062
+ vertex -170.99781890355263 -116.79691777090852 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.5711695004343966 -0.8208321398273353 -1.8893488826187028e-16
+ outer loop
+ vertex -170.99781890355263 -116.79691777090852 -3.000000000000062
+ vertex -169.6750464882625 -117.71735841031693 -62.600000000000065
+ vertex -169.6750464882625 -117.71735841031693 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.25881904510253206 -0.9659258262890653 -1.7646604060570632e-16
+ outer loop
+ vertex -144.6208573105543 -56.357321254992605 -62.60000000000005
+ vertex -145.30702942855058 -56.173461990106745 -3.000000000000051
+ vertex -145.30702942855055 -56.173461990106745 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.25881904510253206 -0.9659258262890653 -1.7646604060570632e-16
+ outer loop
+ vertex -145.30702942855058 -56.173461990106745 -3.000000000000051
+ vertex -144.6208573105543 -56.357321254992605 -62.60000000000005
+ vertex -144.6208573105543 -56.357321254992605 -3.000000000000051
+ endloop
+endfacet
+facet normal -0.8191520442889846 0.5735764363510566 -3.1699543601946607e-18
+ outer loop
+ vertex -122.0088342642253 -98.97857593767576 -3.000000000000062
+ vertex -121.60137838360576 -98.39666863393364 -62.600000000000065
+ vertex -122.0088342642253 -98.97857593767576 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.8191520442889846 0.5735764363510566 -3.1699543601946607e-18
+ outer loop
+ vertex -121.60137838360576 -98.39666863393364 -62.600000000000065
+ vertex -122.0088342642253 -98.97857593767576 -3.000000000000062
+ vertex -121.60137838360578 -98.39666863393364 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.5713404822174107 -0.8207131370823649 -1.889356600540166e-16
+ outer loop
+ vertex -143.4299095783621 -57.03842292728552 -62.600000000000065
+ vertex -143.9770365151454 -56.65753982237123 -3.000000000000051
+ vertex -143.97703651514536 -56.65753982237123 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.5713404822174107 -0.8207131370823649 -1.889356600540166e-16
+ outer loop
+ vertex -143.9770365151454 -56.65753982237123 -3.000000000000051
+ vertex -143.4299095783621 -57.03842292728552 -62.600000000000065
+ vertex -143.42990957836213 -57.03842292728552 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.08715574274766985 -0.9961946980917447 -1.427026653124568e-16
+ outer loop
+ vertex -146.0147038765487 -56.111548498439944 -62.60000000000005
+ vertex -146.72237832454684 -56.17346199010676 -3.000000000000051
+ vertex -146.72237832454684 -56.173461990106745 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.08715574274766985 -0.9961946980917447 -1.427026653124568e-16
+ outer loop
+ vertex -146.72237832454684 -56.17346199010676 -3.000000000000051
+ vertex -146.0147038765487 -56.111548498439944 -62.60000000000005
+ vertex -146.0147038765487 -56.111548498439944 -3.000000000000051
+ endloop
+endfacet
+facet normal -0.9961946980917452 -0.08715574274766245 -1.2387983536035098e-16
+ outer loop
+ vertex -121.05538705967449 -96.35900127253032 -62.600000000000065
+ vertex -121.11730055134132 -95.65132682453219 -3.000000000000062
+ vertex -121.11730055134129 -95.65132682453219 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9961946980917452 -0.08715574274766245 -1.2387983536035098e-16
+ outer loop
+ vertex -121.11730055134132 -95.65132682453219 -3.000000000000062
+ vertex -121.05538705967449 -96.35900127253032 -62.600000000000065
+ vertex -121.05538705967449 -96.35900127253034 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.0871557427476532 -0.9961946980917461 -1.620461988352189e-16
+ outer loop
+ vertex -145.30702942855055 -56.173461990106745 -62.60000000000005
+ vertex -146.0147038765487 -56.111548498439944 -3.000000000000051
+ vertex -146.0147038765487 -56.111548498439944 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.0871557427476532 -0.9961946980917461 -1.620461988352189e-16
+ outer loop
+ vertex -146.0147038765487 -56.111548498439944 -3.000000000000051
+ vertex -145.30702942855055 -56.173461990106745 -62.60000000000005
+ vertex -145.30702942855058 -56.173461990106745 -3.000000000000051
+ endloop
+endfacet
+facet normal -0.8152236677528554 -0.5791462436514476 -1.7905041902021298e-16
+ outer loop
+ vertex -142.48536047767334 -58.14921585984326 -62.600000000000044
+ vertex -142.89319062544632 -57.575141880201315 -3.000000000000062
+ vertex -142.89319062544632 -57.575141880201315 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.8152236677528554 -0.5791462436514476 -1.7905041902021298e-16
+ outer loop
+ vertex -142.89319062544632 -57.575141880201315 -3.000000000000062
+ vertex -142.48536047767334 -58.14921585984326 -62.600000000000044
+ vertex -142.48536047767337 -58.149215859843274 -3.000000000000051
+ endloop
+endfacet
+facet normal 0.7071067811865518 -0.7071067811865431 -2.968816052123318e-17
+ outer loop
+ vertex -148.63427854169413 -57.064995702990736 -62.60000000000005
+ vertex -149.13659139480455 -57.56730855610115 -3.000000000000051
+ vertex -149.13659139480453 -57.567308556101146 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7071067811865518 -0.7071067811865431 -2.968816052123318e-17
+ outer loop
+ vertex -149.13659139480455 -57.56730855610115 -3.000000000000051
+ vertex -148.63427854169413 -57.064995702990736 -62.60000000000005
+ vertex -148.63427854169413 -57.064995702990736 -3.000000000000051
+ endloop
+endfacet
+facet normal -0.4226182617407045 0.9063077870366477 9.172724251549004e-17
+ outer loop
+ vertex -123.73687521648675 -100.1885632387843 -3.000000000000062
+ vertex -123.09305442107781 -99.88834467140568 -62.600000000000065
+ vertex -123.73687521648672 -100.1885632387843 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.4226182617407045 0.9063077870366477 9.172724251549004e-17
+ outer loop
+ vertex -123.09305442107781 -99.88834467140568 -62.600000000000065
+ vertex -123.73687521648675 -100.1885632387843 -3.000000000000062
+ vertex -123.09305442107782 -99.88834467140568 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.7128176874195393 -0.7013493740653512 -1.863780773340388e-16
+ outer loop
+ vertex -142.89319062544632 -57.575141880201315 -62.600000000000065
+ vertex -143.3951292114033 -57.06499570299075 -3.000000000000051
+ vertex -143.3951292114033 -57.06499570299075 -62.600000000000044
+ endloop
+endfacet
+facet normal -0.7128176874195393 -0.7013493740653512 -1.863780773340388e-16
+ outer loop
+ vertex -143.3951292114033 -57.06499570299075 -3.000000000000051
+ vertex -142.89319062544632 -57.575141880201315 -62.600000000000065
+ vertex -142.89319062544632 -57.575141880201315 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.5735764363510409 -0.8191520442889955 -6.164421566816318e-17
+ outer loop
+ vertex -148.05237123795203 -56.65753982237123 -62.60000000000005
+ vertex -148.63427854169413 -57.064995702990736 -3.000000000000051
+ vertex -148.63427854169413 -57.064995702990736 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.5735764363510409 -0.8191520442889955 -6.164421566816318e-17
+ outer loop
+ vertex -148.63427854169413 -57.064995702990736 -3.000000000000051
+ vertex -148.05237123795203 -56.65753982237123 -62.60000000000005
+ vertex -148.05237123795203 -56.657539822371234 -3.000000000000051
+ endloop
+endfacet
+facet normal -2.775557561562891e-16 1.0 1.529564776501207e-16
+ outer loop
+ vertex -150.52555624752688 -100.43433599533697 -3.000000000000062
+ vertex -125.13072178248112 -100.43433599533697 -62.600000000000065
+ vertex -150.52555624752685 -100.43433599533697 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.775557561562891e-16 1.0 1.529564776501207e-16
+ outer loop
+ vertex -125.13072178248112 -100.43433599533697 -62.600000000000065
+ vertex -150.52555624752688 -100.43433599533697 -3.000000000000062
+ vertex -125.13072178248112 -100.43433599533697 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.25881904510251413 -0.9659258262890702 -1.19023183515212e-16
+ outer loop
+ vertex -146.72237832454684 -56.173461990106745 -62.60000000000005
+ vertex -147.4085504425431 -56.357321254992605 -3.000000000000051
+ vertex -147.4085504425431 -56.357321254992605 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.25881904510251413 -0.9659258262890702 -1.19023183515212e-16
+ outer loop
+ vertex -147.4085504425431 -56.357321254992605 -3.000000000000051
+ vertex -146.72237832454684 -56.173461990106745 -62.60000000000005
+ vertex -146.72237832454684 -56.17346199010676 -3.000000000000051
+ endloop
+endfacet
+facet normal -0.6071044080923507 -0.7946220722298348 -1.8891362409815958e-16
+ outer loop
+ vertex -143.3951292114033 -57.06499570299075 -62.600000000000044
+ vertex -143.42990957836213 -57.03842292728552 -3.000000000000062
+ vertex -143.4299095783621 -57.03842292728552 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.6071044080923507 -0.7946220722298348 -1.8891362409815958e-16
+ outer loop
+ vertex -143.42990957836213 -57.03842292728552 -3.000000000000062
+ vertex -143.3951292114033 -57.06499570299075 -62.600000000000044
+ vertex -143.3951292114033 -57.06499570299075 -3.000000000000051
+ endloop
+endfacet
+facet normal -0.9659258262890695 0.2588190451025158 -6.760178110917347e-17
+ outer loop
+ vertex -121.30115981622716 -97.75284783852473 -62.600000000000065
+ vertex -121.11730055134132 -97.06667572052847 -3.000000000000062
+ vertex -121.11730055134129 -97.06667572052845 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9659258262890695 0.2588190451025158 -6.760178110917347e-17
+ outer loop
+ vertex -121.11730055134132 -97.06667572052847 -3.000000000000062
+ vertex -121.30115981622716 -97.75284783852473 -62.600000000000065
+ vertex -121.30115981622716 -97.75284783852474 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9659258262890692 -0.25881904510251724 -1.4677788008447076e-16
+ outer loop
+ vertex -121.11730055134129 -95.65132682453219 -62.600000000000065
+ vertex -121.30115981622716 -94.96515470653594 -3.000000000000062
+ vertex -121.30115981622716 -94.96515470653594 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9659258262890692 -0.25881904510251724 -1.4677788008447076e-16
+ outer loop
+ vertex -121.30115981622716 -94.96515470653594 -3.000000000000062
+ vertex -121.11730055134129 -95.65132682453219 -62.600000000000065
+ vertex -121.11730055134132 -95.65132682453219 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.4226182617407045 -0.9063077870366477 -9.172724251549004e-17
+ outer loop
+ vertex -147.4085504425431 -56.357321254992605 -62.60000000000005
+ vertex -148.05237123795203 -56.657539822371234 -3.000000000000051
+ vertex -148.05237123795203 -56.65753982237123 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.4226182617407045 -0.9063077870366477 -9.172724251549004e-17
+ outer loop
+ vertex -148.05237123795203 -56.657539822371234 -3.000000000000051
+ vertex -147.4085504425431 -56.357321254992605 -62.60000000000005
+ vertex -147.4085504425431 -56.357321254992605 -3.000000000000051
+ endloop
+endfacet
+facet normal -0.3963729504701247 -0.9180895839380863 -1.8441368268833e-16
+ outer loop
+ vertex -144.05167483247536 -56.603058209358565 -62.600000000000065
+ vertex -144.6208573105543 -56.357321254992605 -3.000000000000051
+ vertex -144.6208573105543 -56.357321254992605 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.3963729504701247 -0.9180895839380863 -1.8441368268833e-16
+ outer loop
+ vertex -144.6208573105543 -56.357321254992605 -3.000000000000051
+ vertex -144.05167483247536 -56.603058209358565 -62.600000000000065
+ vertex -144.05167483247536 -56.603058209358565 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.8191520442889846 -0.5735764363510566 3.1699543601946607e-18
+ outer loop
+ vertex -149.13659139480453 -57.567308556101146 -62.60000000000005
+ vertex -149.54404727542408 -58.14921585984326 -3.000000000000051
+ vertex -149.54404727542408 -58.14921585984325 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.8191520442889846 -0.5735764363510566 3.1699543601946607e-18
+ outer loop
+ vertex -149.54404727542408 -58.14921585984326 -3.000000000000051
+ vertex -149.13659139480453 -57.567308556101146 -62.60000000000005
+ vertex -149.13659139480455 -57.56730855610115 -3.000000000000051
+ endloop
+endfacet
+facet normal -0.5895807326816714 -0.8077094524954771 -1.8897080252742142e-16
+ outer loop
+ vertex -143.97703651514536 -56.65753982237123 -62.60000000000005
+ vertex -144.05167483247536 -56.603058209358565 -3.000000000000062
+ vertex -144.05167483247536 -56.603058209358565 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.5895807326816714 -0.8077094524954771 -1.8897080252742142e-16
+ outer loop
+ vertex -144.05167483247536 -56.603058209358565 -3.000000000000062
+ vertex -143.97703651514536 -56.65753982237123 -62.60000000000005
+ vertex -143.9770365151454 -56.65753982237123 -3.000000000000051
+ endloop
+endfacet
+facet normal -0.08715574274766985 0.9961946980917447 1.427026653124568e-16
+ outer loop
+ vertex -125.13072178248112 -100.43433599533697 -3.000000000000062
+ vertex -124.423047334483 -100.37242250367015 -62.600000000000065
+ vertex -125.13072178248112 -100.43433599533697 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.08715574274766985 0.9961946980917447 1.427026653124568e-16
+ outer loop
+ vertex -124.423047334483 -100.37242250367015 -62.600000000000065
+ vertex -125.13072178248112 -100.43433599533697 -3.000000000000062
+ vertex -124.423047334483 -100.37242250367015 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.30989713538576086 -0.9507700907578549 -1.7981606344395116e-16
+ outer loop
+ vertex -159.50749867976714 -122.51137082887449 -62.600000000000065
+ vertex -161.03966632807823 -122.01197105835386 -3.000000000000062
+ vertex -161.03966632807823 -122.01197105835386 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.30989713538576086 -0.9507700907578549 -1.7981606344395116e-16
+ outer loop
+ vertex -161.03966632807823 -122.01197105835386 -3.000000000000062
+ vertex -159.50749867976714 -122.51137082887449 -62.600000000000065
+ vertex -159.50749867976717 -122.51137082887449 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.14720786925725476 -0.989105577392393 -1.6762592114233786e-16
+ outer loop
+ vertex -153.2106669582428 -123.85676701721616 -3.000000000000062
+ vertex -154.8046123096754 -123.61954128089435 -62.600000000000065
+ vertex -153.2106669582428 -123.85676701721613 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.14720786925725476 -0.989105577392393 -1.6762592114233786e-16
+ outer loop
+ vertex -154.8046123096754 -123.61954128089435 -62.600000000000065
+ vertex -153.2106669582428 -123.85676701721616 -3.000000000000062
+ vertex -154.8046123096754 -123.61954128089435 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.2698621119172056 -0.9628989773343752 -1.7722852548447542e-16
+ outer loop
+ vertex -157.9557853097267 -122.94625408972136 -62.600000000000065
+ vertex -159.50749867976717 -122.51137082887449 -3.000000000000062
+ vertex -159.50749867976714 -122.51137082887449 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.2698621119172056 -0.9628989773343752 -1.7722852548447542e-16
+ outer loop
+ vertex -159.50749867976717 -122.51137082887449 -3.000000000000062
+ vertex -157.9557853097267 -122.94625408972136 -62.600000000000065
+ vertex -157.9557853097267 -122.94625408972136 -3.000000000000062
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -104.99807621135338 -100.43433599533701 -41.30000000000007
+ vertex -94.70940107675855 -100.43433599533697 -62.600000000000065
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -104.99807621135338 -100.43433599533701 -41.30000000000007
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -105.29777747886726 -100.434335995337 -40.57645713530763
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -105.29777747886726 -100.434335995337 -40.57645713530763
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -94.70940107675855 -100.43433599533697 -62.600000000000065
+ vertex -104.99807621135338 -100.43433599533701 -41.30000000000007
+ vertex -104.52132034355971 -100.43433599533698 -41.921320343559714
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -94.70940107675855 -100.43433599533697 -62.600000000000065
+ vertex -104.52132034355971 -100.43433599533698 -41.921320343559714
+ vertex -103.90000000000006 -100.43433599533698 -42.398076211353384
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -94.70940107675855 -100.43433599533697 -62.600000000000065
+ vertex -103.90000000000006 -100.43433599533698 -42.398076211353384
+ vertex -103.17645713530764 -100.43433599533697 -42.69777747886727
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -94.70940107675855 -100.43433599533697 -62.600000000000065
+ vertex -103.17645713530764 -100.43433599533697 -42.69777747886727
+ vertex -102.40000000000003 -100.43433599533698 -42.80000000000007
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -105.29777747886726 -100.434335995337 -40.57645713530763
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -105.40000000000005 -100.434335995337 -39.80000000000007
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -105.40000000000005 -100.434335995337 -39.80000000000007
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -105.40000000000008 -100.434335995337 -25.800000000000065
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -105.40000000000008 -100.434335995337 -25.800000000000065
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -105.29777747886726 -100.434335995337 -25.0235428646925
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -105.29777747886726 -100.434335995337 -25.0235428646925
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -104.99807621135338 -100.43433599533701 -24.30000000000006
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -104.99807621135338 -100.43433599533701 -24.30000000000006
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -104.52132034355971 -100.43433599533698 -23.678679656440423
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -104.52132034355971 -100.43433599533698 -23.678679656440423
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -103.90000000000006 -100.43433599533698 -23.20192378864675
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -103.90000000000006 -100.43433599533698 -23.20192378864675
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -103.17645713530761 -100.434335995337 -22.90222252113286
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -103.17645713530761 -100.434335995337 -22.90222252113286
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -102.40000000000006 -100.434335995337 -22.800000000000065
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -94.70940107675855 -100.43433599533697 -62.600000000000065
+ vertex -99.40000000000005 -100.43433599533701 -39.80000000000007
+ vertex -94.70940107675855 -100.43433599533697 -3.000000000000062
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -99.40000000000005 -100.43433599533701 -39.80000000000007
+ vertex -94.70940107675855 -100.43433599533697 -62.600000000000065
+ vertex -99.50222252113285 -100.43433599533701 -40.57645713530763
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -99.50222252113285 -100.43433599533701 -40.57645713530763
+ vertex -94.70940107675855 -100.43433599533697 -62.600000000000065
+ vertex -99.80192378864673 -100.43433599533701 -41.30000000000007
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -99.80192378864673 -100.43433599533701 -41.30000000000007
+ vertex -94.70940107675855 -100.43433599533697 -62.600000000000065
+ vertex -100.27867965644039 -100.43433599533701 -41.921320343559714
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -100.27867965644039 -100.43433599533701 -41.921320343559714
+ vertex -94.70940107675855 -100.43433599533697 -62.600000000000065
+ vertex -100.90000000000003 -100.434335995337 -42.398076211353384
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -100.90000000000003 -100.434335995337 -42.398076211353384
+ vertex -94.70940107675855 -100.43433599533697 -62.600000000000065
+ vertex -101.62354286469248 -100.43433599533698 -42.69777747886727
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -101.62354286469248 -100.43433599533698 -42.69777747886727
+ vertex -94.70940107675855 -100.43433599533697 -62.600000000000065
+ vertex -102.40000000000003 -100.43433599533698 -42.80000000000007
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -94.70940107675855 -100.43433599533697 -3.000000000000062
+ vertex -99.40000000000005 -100.43433599533701 -39.80000000000007
+ vertex -99.40000000000005 -100.43433599533698 -25.800000000000065
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -94.70940107675855 -100.43433599533697 -3.000000000000062
+ vertex -99.40000000000005 -100.43433599533698 -25.800000000000065
+ vertex -99.50222252113285 -100.434335995337 -25.0235428646925
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -94.70940107675855 -100.43433599533697 -3.000000000000062
+ vertex -99.50222252113285 -100.434335995337 -25.0235428646925
+ vertex -99.80192378864673 -100.43433599533698 -24.300000000000068
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -94.70940107675855 -100.43433599533697 -3.000000000000062
+ vertex -99.80192378864673 -100.43433599533698 -24.300000000000068
+ vertex -100.27867965644042 -100.434335995337 -23.678679656440423
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -94.70940107675855 -100.43433599533697 -3.000000000000062
+ vertex -100.27867965644042 -100.434335995337 -23.678679656440423
+ vertex -100.90000000000005 -100.43433599533701 -23.20192378864675
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -94.70940107675855 -100.43433599533697 -3.000000000000062
+ vertex -100.90000000000005 -100.43433599533701 -23.20192378864675
+ vertex -101.62354286469248 -100.43433599533701 -22.90222252113286
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -94.70940107675855 -100.43433599533697 -3.000000000000062
+ vertex -101.62354286469248 -100.43433599533701 -22.90222252113286
+ vertex -102.40000000000006 -100.434335995337 -22.800000000000065
+ endloop
+endfacet
+facet normal -4.996003610813203e-16 1.0 1.5295647765012062e-16
+ outer loop
+ vertex -94.70940107675855 -100.43433599533697 -3.000000000000062
+ vertex -102.40000000000006 -100.434335995337 -22.800000000000065
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -133.51561261707312 -65.08527488548513 -26.800000000000054
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -133.51561261707312 -65.08527488548513 -26.800000000000054
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -133.07958023611388 -65.84050512305173 -25.4948628518954
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -133.07958023611388 -65.84050512305173 -25.4948628518954
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -132.56210088148578 -66.7368056571356 -24.314718625761483
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -132.56210088148578 -66.7368056571356 -24.314718625761483
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -131.9720287684188 -67.7588405370971 -23.279759916505228
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -131.9720287684188 -67.7588405370971 -23.279759916505228
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -131.31946019436646 -68.88912246277852 -22.40769515458679
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -131.31946019436646 -68.88912246277852 -22.40769515458679
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -133.51561261707312 -65.08527488548513 -26.800000000000054
+ vertex -133.8627373894342 -64.48403714318997 -28.207798811618975
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -133.8627373894342 -64.48403714318997 -28.207798811618975
+ vertex -134.11501515210088 -64.04707924063145 -29.6941714587698
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -134.11501515210088 -64.04707924063145 -29.6941714587698
+ vertex -134.26812936260933 -63.781877648670005 -31.233685693359433
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -134.26812936260933 -63.781877648670005 -31.233685693359433
+ vertex -134.31946019436648 -63.69297004007188 -32.800000000000054
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -131.31946019436646 -68.88912246277852 -22.40769515458679
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -130.615560788557 -70.10831199705805 -21.71344560986461
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -130.615560788557 -70.10831199705805 -21.71344560986461
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -129.87237446498162 -71.39554846898098 -21.208890084531234
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -129.87237446498162 -71.39554846898098 -21.208890084531234
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -129.1026173476868 -72.72880690562336 -20.90266166351433
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -129.1026173476868 -72.72880690562336 -20.90266166351433
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -128.31946019436646 -74.08527488548513 -20.80000000000005
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -128.31946019436646 -74.08527488548513 -20.80000000000005
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -127.53630304104615 -75.44174286534694 -20.90266166351433
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -127.53630304104615 -75.44174286534694 -20.90266166351433
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -126.76654592375135 -76.7750013019893 -21.208890084531237
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -126.76654592375135 -76.7750013019893 -21.208890084531237
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -126.02335960017594 -78.06223777391226 -21.71344560986461
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -126.02335960017594 -78.06223777391226 -21.71344560986461
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -125.31946019436647 -79.28142730819178 -22.407695154586794
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -125.31946019436647 -79.28142730819178 -22.407695154586794
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -124.66689162031415 -80.41170923387318 -23.279759916505235
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -124.66689162031415 -80.41170923387318 -23.279759916505235
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -124.0768195072472 -81.43374411383469 -24.314718625761483
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -124.0768195072472 -81.43374411383469 -24.314718625761483
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -123.55934015261907 -82.33004464791856 -25.494862851895416
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -123.55934015261907 -82.33004464791856 -25.494862851895416
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -123.12330777165984 -83.08527488548516 -26.800000000000058
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -123.12330777165984 -83.08527488548516 -26.800000000000058
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -122.77618299929875 -83.68651262778033 -28.207798811618986
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -122.77618299929875 -83.68651262778033 -28.207798811618986
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -122.52390523663206 -84.12347053033885 -29.69417145876981
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -122.52390523663206 -84.12347053033885 -29.69417145876981
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -122.37079102612361 -84.38867212230028 -31.233685693359437
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -122.37079102612361 -84.38867212230028 -31.233685693359437
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -122.31946019436648 -84.47757973089841 -32.800000000000054
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -131.31946019436648 -68.8891224627785 -43.19230484541332
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -131.31946019436648 -68.8891224627785 -43.19230484541332
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -131.9720287684188 -67.7588405370971 -42.32024008349487
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -131.9720287684188 -67.7588405370971 -42.32024008349487
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -132.56210088148578 -66.7368056571356 -41.28528137423862
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -132.56210088148578 -66.7368056571356 -41.28528137423862
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -133.07958023611388 -65.84050512305173 -40.105137148104696
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -133.07958023611388 -65.84050512305173 -40.105137148104696
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -133.51561261707312 -65.08527488548513 -38.800000000000054
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -133.51561261707312 -65.08527488548513 -38.800000000000054
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -133.8627373894342 -64.48403714318997 -37.39220118838113
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -133.8627373894342 -64.48403714318997 -37.39220118838113
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -134.11501515210088 -64.04707924063145 -35.9058285412303
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -134.11501515210088 -64.04707924063145 -35.9058285412303
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -134.26812936260933 -63.781877648670005 -34.36631430664067
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -134.26812936260933 -63.781877648670005 -34.36631430664067
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -134.31946019436648 -63.69297004007188 -32.800000000000054
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -131.31946019436648 -68.8891224627785 -43.19230484541332
+ vertex -130.615560788557 -70.10831199705805 -43.8865543901355
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -130.615560788557 -70.10831199705805 -43.8865543901355
+ vertex -129.87237446498162 -71.39554846898098 -44.391109915468874
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -129.87237446498162 -71.39554846898098 -44.391109915468874
+ vertex -129.1026173476868 -72.72880690562336 -44.69733833648578
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -129.1026173476868 -72.72880690562336 -44.69733833648578
+ vertex -128.31946019436646 -74.08527488548513 -44.800000000000054
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -128.31946019436646 -74.08527488548513 -44.800000000000054
+ vertex -127.53630304104615 -75.44174286534694 -44.69733833648578
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -127.53630304104615 -75.44174286534694 -44.69733833648578
+ vertex -126.76654592375135 -76.7750013019893 -44.391109915468874
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -126.76654592375135 -76.7750013019893 -44.391109915468874
+ vertex -126.02335960017594 -78.06223777391224 -43.8865543901355
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -126.02335960017594 -78.06223777391224 -43.8865543901355
+ vertex -125.31946019436647 -79.28142730819178 -43.192304845413325
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -125.31946019436647 -79.28142730819178 -43.192304845413325
+ vertex -124.66689162031415 -80.41170923387318 -42.32024008349488
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -124.66689162031415 -80.41170923387318 -42.32024008349488
+ vertex -124.0768195072472 -81.43374411383469 -41.285281374238636
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -124.0768195072472 -81.43374411383469 -41.285281374238636
+ vertex -123.55934015261907 -82.33004464791854 -40.10513714810471
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -123.55934015261907 -82.33004464791854 -40.10513714810471
+ vertex -123.12330777165984 -83.08527488548516 -38.80000000000006
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -123.12330777165984 -83.08527488548516 -38.80000000000006
+ vertex -122.77618299929875 -83.68651262778033 -37.392201188381144
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -122.77618299929875 -83.68651262778033 -37.392201188381144
+ vertex -122.52390523663206 -84.12347053033885 -35.905828541230306
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -122.52390523663206 -84.12347053033885 -35.905828541230306
+ vertex -122.37079102612361 -84.38867212230028 -34.36631430664068
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -122.37079102612361 -84.38867212230028 -34.36631430664068
+ vertex -122.31946019436648 -84.47757973089841 -32.800000000000054
+ endloop
+endfacet
+facet normal 0.866025403784439 0.4999999999999995 1.7258201180401957e-16
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -122.31946019436648 -84.47757973089841 -32.800000000000054
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.22935485323249694 -0.9733428744788242 -1.7433085302539781e-16
+ outer loop
+ vertex -156.38724158134562 -123.31585983302554 -3.000000000000062
+ vertex -157.9557853097267 -122.94625408972136 -62.600000000000065
+ vertex -156.38724158134562 -123.31585983302554 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.22935485323249694 -0.9733428744788242 -1.7433085302539781e-16
+ outer loop
+ vertex -157.9557853097267 -122.94625408972136 -62.600000000000065
+ vertex -156.38724158134562 -123.31585983302554 -3.000000000000062
+ vertex -157.9557853097267 -122.94625408972136 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.3493898658303786 -0.936977439245487 -1.820889389375272e-16
+ outer loop
+ vertex -161.03966632807823 -122.01197105835386 -62.600000000000065
+ vertex -162.5496070945836 -121.44892868430702 -3.000000000000062
+ vertex -162.54960709458356 -121.44892868430702 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.3493898658303786 -0.936977439245487 -1.820889389375272e-16
+ outer loop
+ vertex -162.5496070945836 -121.44892868430702 -3.000000000000062
+ vertex -161.03966632807823 -122.01197105835386 -62.600000000000065
+ vertex -161.03966632807823 -122.01197105835386 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.4264730821792865 -0.9045002543816665 -1.8567535078147346e-16
+ outer loop
+ vertex -164.03467871431613 -120.82322898190026 -62.600000000000065
+ vertex -165.492282441152 -120.135966871173 -3.000000000000062
+ vertex -165.492282441152 -120.135966871173 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.4264730821792865 -0.9045002543816665 -1.8567535078147346e-16
+ outer loop
+ vertex -165.492282441152 -120.135966871173 -3.000000000000062
+ vertex -164.03467871431613 -120.82322898190026 -62.600000000000065
+ vertex -164.03467871431616 -120.82322898190026 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.1884462435099426 -0.9820835062798843 -1.7112811674140554e-16
+ outer loop
+ vertex -154.8046123096754 -123.61954128089435 -3.000000000000062
+ vertex -156.38724158134562 -123.31585983302554 -62.600000000000065
+ vertex -154.8046123096754 -123.61954128089435 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.1884462435099426 -0.9820835062798843 -1.7112811674140554e-16
+ outer loop
+ vertex -156.38724158134562 -123.31585983302554 -62.600000000000065
+ vertex -154.8046123096754 -123.61954128089435 -3.000000000000062
+ vertex -156.38724158134562 -123.31585983302554 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -94.70940107675858 -104.43433599533697 -62.600000000000065
+ vertex -109.18236190979498 -104.43433599533701 -55.53185165257819
+ vertex -150.00000000000006 -104.43433599533697 -62.600000000000065
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -109.18236190979498 -104.43433599533701 -55.53185165257819
+ vertex -94.70940107675858 -104.43433599533697 -62.600000000000065
+ vertex -108.70000000000003 -104.43433599533698 -55.332050807568926
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -108.70000000000003 -104.43433599533698 -55.332050807568926
+ vertex -94.70940107675858 -104.43433599533697 -62.600000000000065
+ vertex -108.2857864376269 -104.43433599533701 -55.01421356237315
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -108.2857864376269 -104.43433599533701 -55.01421356237315
+ vertex -94.70940107675858 -104.43433599533697 -62.600000000000065
+ vertex -107.96794919243113 -104.43433599533698 -54.600000000000044
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -107.96794919243113 -104.43433599533698 -54.600000000000044
+ vertex -94.70940107675858 -104.43433599533697 -62.600000000000065
+ vertex -99.80192378864673 -104.43433599533697 -41.30000000000007
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -99.80192378864673 -104.43433599533697 -41.30000000000007
+ vertex -94.70940107675858 -104.43433599533697 -62.600000000000065
+ vertex -99.50222252113285 -104.43433599533697 -40.57645713530763
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -99.50222252113285 -104.43433599533697 -40.57645713530763
+ vertex -94.70940107675858 -104.43433599533697 -62.600000000000065
+ vertex -99.40000000000006 -104.43433599533697 -39.80000000000006
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -99.40000000000006 -104.43433599533697 -39.80000000000006
+ vertex -94.70940107675858 -104.43433599533697 -62.600000000000065
+ vertex -94.70940107675858 -104.43433599533697 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -62.600000000000065
+ vertex -109.18236190979498 -104.43433599533701 -55.53185165257819
+ vertex -109.7 -104.43433599533701 -55.60000000000006
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -62.600000000000065
+ vertex -109.7 -104.43433599533701 -55.60000000000006
+ vertex -134.50000000000003 -104.43433599533697 -55.600000000000065
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -107.96794919243113 -104.43433599533698 -54.600000000000044
+ vertex -99.80192378864673 -104.43433599533697 -41.30000000000007
+ vertex -107.76814834742189 -104.43433599533701 -54.11763809020509
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -107.76814834742189 -104.43433599533701 -54.11763809020509
+ vertex -99.80192378864673 -104.43433599533697 -41.30000000000007
+ vertex -107.7 -104.43433599533701 -53.60000000000005
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -107.7 -104.43433599533701 -53.60000000000005
+ vertex -99.80192378864673 -104.43433599533697 -41.30000000000007
+ vertex -107.7 -104.43433599533701 -51.600000000000044
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -107.7 -104.43433599533701 -51.600000000000044
+ vertex -99.80192378864673 -104.43433599533697 -41.30000000000007
+ vertex -100.27867965644042 -104.43433599533697 -41.921320343559714
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -107.7 -104.43433599533701 -51.600000000000044
+ vertex -100.27867965644042 -104.43433599533697 -41.921320343559714
+ vertex -107.76814834742189 -104.43433599533698 -51.082361909795
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -107.76814834742189 -104.43433599533698 -51.082361909795
+ vertex -100.27867965644042 -104.43433599533697 -41.921320343559714
+ vertex -107.96794919243113 -104.43433599533701 -50.60000000000003
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -107.96794919243113 -104.43433599533701 -50.60000000000003
+ vertex -100.27867965644042 -104.43433599533697 -41.921320343559714
+ vertex -108.28578643762692 -104.43433599533701 -50.185786437626945
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -108.28578643762692 -104.43433599533701 -50.185786437626945
+ vertex -100.27867965644042 -104.43433599533697 -41.921320343559714
+ vertex -108.70000000000003 -104.43433599533698 -49.86794919243116
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -108.70000000000003 -104.43433599533698 -49.86794919243116
+ vertex -100.27867965644042 -104.43433599533697 -41.921320343559714
+ vertex -109.18236190979498 -104.43433599533701 -49.6681483474219
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -109.18236190979498 -104.43433599533701 -49.6681483474219
+ vertex -100.27867965644042 -104.43433599533697 -41.921320343559714
+ vertex -109.7 -104.43433599533701 -49.60000000000003
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -109.7 -104.43433599533701 -49.60000000000003
+ vertex -100.27867965644042 -104.43433599533697 -41.921320343559714
+ vertex -100.90000000000006 -104.43433599533697 -42.398076211353384
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -109.7 -104.43433599533701 -49.60000000000003
+ vertex -100.90000000000006 -104.43433599533697 -42.398076211353384
+ vertex -101.62354286469251 -104.43433599533694 -42.697777478867266
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -109.7 -104.43433599533701 -49.60000000000003
+ vertex -101.62354286469251 -104.43433599533694 -42.697777478867266
+ vertex -102.40000000000006 -104.43433599533694 -42.80000000000007
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -99.40000000000006 -104.43433599533697 -39.80000000000006
+ vertex -94.70940107675858 -104.43433599533697 -3.000000000000062
+ vertex -99.40000000000006 -104.43433599533692 -25.800000000000065
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -99.40000000000006 -104.43433599533692 -25.800000000000065
+ vertex -94.70940107675858 -104.43433599533697 -3.000000000000062
+ vertex -99.50222252113285 -104.43433599533694 -25.0235428646925
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -99.50222252113285 -104.43433599533694 -25.0235428646925
+ vertex -94.70940107675858 -104.43433599533697 -3.000000000000062
+ vertex -99.80192378864675 -104.43433599533692 -24.300000000000068
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -99.80192378864675 -104.43433599533692 -24.300000000000068
+ vertex -94.70940107675858 -104.43433599533697 -3.000000000000062
+ vertex -100.27867965644042 -104.43433599533694 -23.678679656440423
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -100.27867965644042 -104.43433599533694 -23.678679656440423
+ vertex -94.70940107675858 -104.43433599533697 -3.000000000000062
+ vertex -100.90000000000006 -104.43433599533697 -23.20192378864675
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -100.90000000000006 -104.43433599533697 -23.20192378864675
+ vertex -94.70940107675858 -104.43433599533697 -3.000000000000062
+ vertex -101.62354286469251 -104.43433599533697 -22.90222252113286
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -101.62354286469251 -104.43433599533697 -22.90222252113286
+ vertex -94.70940107675858 -104.43433599533697 -3.000000000000062
+ vertex -102.40000000000008 -104.43433599533697 -22.800000000000065
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -102.40000000000008 -104.43433599533697 -22.800000000000065
+ vertex -94.70940107675858 -104.43433599533697 -3.000000000000062
+ vertex -108.2857864376269 -104.43433599533714 -15.41421356237314
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -102.40000000000008 -104.43433599533697 -22.800000000000065
+ vertex -108.2857864376269 -104.43433599533714 -15.41421356237314
+ vertex -108.7 -104.43433599533714 -15.732050807568926
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -102.40000000000008 -104.43433599533697 -22.800000000000065
+ vertex -108.7 -104.43433599533714 -15.732050807568926
+ vertex -109.18236190979493 -104.43433599533714 -15.931851652578185
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -102.40000000000008 -104.43433599533697 -22.800000000000065
+ vertex -109.18236190979493 -104.43433599533714 -15.931851652578185
+ vertex -109.7 -104.43433599533714 -16.00000000000005
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -102.40000000000008 -104.43433599533697 -22.800000000000065
+ vertex -109.7 -104.43433599533714 -16.00000000000005
+ vertex -134.5 -104.4343359953371 -16.000000000000068
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -108.2857864376269 -104.43433599533714 -15.41421356237314
+ vertex -94.70940107675858 -104.43433599533697 -3.000000000000062
+ vertex -107.9679491924311 -104.43433599533714 -15.000000000000046
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -107.9679491924311 -104.43433599533714 -15.000000000000046
+ vertex -94.70940107675858 -104.43433599533697 -3.000000000000062
+ vertex -107.76814834742186 -104.43433599533716 -14.517638090205088
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -107.76814834742186 -104.43433599533716 -14.517638090205088
+ vertex -94.70940107675858 -104.43433599533697 -3.000000000000062
+ vertex -107.7 -104.43433599533714 -14.000000000000048
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -107.7 -104.43433599533714 -14.000000000000048
+ vertex -94.70940107675858 -104.43433599533697 -3.000000000000062
+ vertex -107.7 -104.43433599533714 -12.000000000000034
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -107.7 -104.43433599533714 -12.000000000000034
+ vertex -94.70940107675858 -104.43433599533697 -3.000000000000062
+ vertex -107.76814834742186 -104.43433599533714 -11.482361909795
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -107.76814834742186 -104.43433599533714 -11.482361909795
+ vertex -94.70940107675858 -104.43433599533697 -3.000000000000062
+ vertex -107.9679491924311 -104.43433599533714 -11.000000000000036
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -107.9679491924311 -104.43433599533714 -11.000000000000036
+ vertex -94.70940107675858 -104.43433599533697 -3.000000000000062
+ vertex -108.2857864376269 -104.43433599533714 -10.585786437626947
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -108.2857864376269 -104.43433599533714 -10.585786437626947
+ vertex -94.70940107675858 -104.43433599533697 -3.000000000000062
+ vertex -108.7 -104.43433599533714 -10.267949192431168
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -108.7 -104.43433599533714 -10.267949192431168
+ vertex -94.70940107675858 -104.43433599533697 -3.000000000000062
+ vertex -109.18236190979493 -104.43433599533714 -10.068148347421902
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -109.18236190979493 -104.43433599533714 -10.068148347421902
+ vertex -94.70940107675858 -104.43433599533697 -3.000000000000062
+ vertex -109.7 -104.43433599533714 -10.000000000000037
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -62.600000000000065
+ vertex -136.43185165257816 -104.43433599533697 -54.117638090205105
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -136.43185165257816 -104.43433599533697 -54.117638090205105
+ vertex -150.00000000000006 -104.43433599533697 -62.600000000000065
+ vertex -136.23205080756892 -104.43433599533697 -54.60000000000007
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -136.23205080756892 -104.43433599533697 -54.60000000000007
+ vertex -150.00000000000006 -104.43433599533697 -62.600000000000065
+ vertex -135.91421356237313 -104.43433599533697 -55.01421356237316
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -135.91421356237313 -104.43433599533697 -55.01421356237316
+ vertex -150.00000000000006 -104.43433599533697 -62.600000000000065
+ vertex -135.50000000000003 -104.43433599533694 -55.33205080756895
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -135.50000000000003 -104.43433599533694 -55.33205080756895
+ vertex -150.00000000000006 -104.43433599533697 -62.600000000000065
+ vertex -135.01763809020508 -104.43433599533697 -55.531851652578204
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -135.01763809020508 -104.43433599533697 -55.531851652578204
+ vertex -150.00000000000006 -104.43433599533697 -62.600000000000065
+ vertex -134.50000000000003 -104.43433599533697 -55.600000000000065
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -136.43185165257816 -104.43433599533697 -54.117638090205105
+ vertex -136.50000000000006 -104.43433599533697 -53.60000000000007
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -136.50000000000006 -104.43433599533697 -53.60000000000007
+ vertex -136.50000000000006 -104.43433599533697 -51.600000000000065
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -136.50000000000006 -104.43433599533697 -51.600000000000065
+ vertex -136.43185165257816 -104.43433599533697 -51.08236190979502
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -136.43185165257816 -104.43433599533697 -51.08236190979502
+ vertex -136.23205080756892 -104.43433599533697 -50.60000000000005
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -136.23205080756892 -104.43433599533697 -50.60000000000005
+ vertex -135.91421356237313 -104.43433599533697 -50.185786437626966
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -135.91421356237313 -104.43433599533697 -50.185786437626966
+ vertex -135.50000000000006 -104.43433599533697 -49.86794919243118
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -135.50000000000006 -104.43433599533697 -49.86794919243118
+ vertex -135.01763809020508 -104.43433599533697 -49.66814834742192
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -135.01763809020508 -104.43433599533697 -49.66814834742192
+ vertex -134.50000000000006 -104.43433599533697 -49.60000000000006
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -134.50000000000006 -104.43433599533697 -49.60000000000006
+ vertex -109.7 -104.43433599533701 -49.60000000000003
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -109.7 -104.43433599533701 -49.60000000000003
+ vertex -135.9142135623731 -104.4343359953371 -15.414213562373158
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -135.9142135623731 -104.4343359953371 -15.414213562373158
+ vertex -109.7 -104.43433599533701 -49.60000000000003
+ vertex -104.52132034355974 -104.43433599533697 -41.921320343559714
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -104.52132034355974 -104.43433599533697 -41.921320343559714
+ vertex -109.7 -104.43433599533701 -49.60000000000003
+ vertex -103.90000000000008 -104.43433599533694 -42.39807621135338
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -103.90000000000008 -104.43433599533694 -42.39807621135338
+ vertex -109.7 -104.43433599533701 -49.60000000000003
+ vertex -103.17645713530764 -104.43433599533692 -42.697777478867266
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -103.17645713530764 -104.43433599533692 -42.697777478867266
+ vertex -109.7 -104.43433599533701 -49.60000000000003
+ vertex -102.40000000000006 -104.43433599533694 -42.80000000000007
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -135.9142135623731 -104.4343359953371 -15.414213562373158
+ vertex -104.52132034355974 -104.43433599533697 -41.921320343559714
+ vertex -104.99807621135338 -104.43433599533697 -41.30000000000007
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -135.9142135623731 -104.4343359953371 -15.414213562373158
+ vertex -104.99807621135338 -104.43433599533697 -41.30000000000007
+ vertex -105.29777747886729 -104.43433599533694 -40.57645713530763
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -135.9142135623731 -104.4343359953371 -15.414213562373158
+ vertex -105.29777747886729 -104.43433599533694 -40.57645713530763
+ vertex -105.40000000000008 -104.43433599533694 -39.80000000000006
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -135.9142135623731 -104.4343359953371 -15.414213562373158
+ vertex -105.40000000000008 -104.43433599533694 -39.80000000000006
+ vertex -135.5 -104.43433599533714 -15.732050807568942
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -135.5 -104.43433599533714 -15.732050807568942
+ vertex -105.40000000000008 -104.43433599533694 -39.80000000000006
+ vertex -135.01763809020505 -104.43433599533714 -15.931851652578203
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -135.01763809020505 -104.43433599533714 -15.931851652578203
+ vertex -105.40000000000008 -104.43433599533694 -39.80000000000006
+ vertex -105.40000000000008 -104.43433599533694 -25.800000000000065
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -135.01763809020505 -104.43433599533714 -15.931851652578203
+ vertex -105.40000000000008 -104.43433599533694 -25.800000000000065
+ vertex -105.29777747886729 -104.43433599533694 -25.0235428646925
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -135.01763809020505 -104.43433599533714 -15.931851652578203
+ vertex -105.29777747886729 -104.43433599533694 -25.0235428646925
+ vertex -104.99807621135338 -104.43433599533697 -24.30000000000006
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -135.01763809020505 -104.43433599533714 -15.931851652578203
+ vertex -104.99807621135338 -104.43433599533697 -24.30000000000006
+ vertex -104.52132034355974 -104.43433599533697 -23.678679656440423
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -135.01763809020505 -104.43433599533714 -15.931851652578203
+ vertex -104.52132034355974 -104.43433599533697 -23.678679656440423
+ vertex -103.90000000000008 -104.43433599533694 -23.20192378864675
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -135.01763809020505 -104.43433599533714 -15.931851652578203
+ vertex -103.90000000000008 -104.43433599533694 -23.20192378864675
+ vertex -103.17645713530764 -104.43433599533694 -22.90222252113286
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -135.01763809020505 -104.43433599533714 -15.931851652578203
+ vertex -103.17645713530764 -104.43433599533694 -22.90222252113286
+ vertex -102.40000000000008 -104.43433599533697 -22.800000000000065
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -135.01763809020505 -104.43433599533714 -15.931851652578203
+ vertex -102.40000000000008 -104.43433599533697 -22.800000000000065
+ vertex -134.5 -104.4343359953371 -16.000000000000068
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -135.9142135623731 -104.4343359953371 -15.414213562373158
+ vertex -136.23205080756892 -104.43433599533712 -15.000000000000062
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -136.23205080756892 -104.43433599533712 -15.000000000000062
+ vertex -136.43185165257813 -104.43433599533714 -14.517638090205104
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -136.43185165257813 -104.43433599533714 -14.517638090205104
+ vertex -136.50000000000003 -104.43433599533712 -14.000000000000064
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -136.50000000000003 -104.43433599533712 -14.000000000000064
+ vertex -136.50000000000003 -104.43433599533712 -12.000000000000052
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -136.50000000000003 -104.43433599533712 -12.000000000000052
+ vertex -136.43185165257813 -104.43433599533714 -11.482361909795022
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -136.43185165257813 -104.43433599533714 -11.482361909795022
+ vertex -136.23205080756892 -104.43433599533712 -11.000000000000048
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -136.23205080756892 -104.43433599533712 -11.000000000000048
+ vertex -135.91421356237313 -104.43433599533712 -10.58578643762697
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -135.91421356237313 -104.43433599533712 -10.58578643762697
+ vertex -135.50000000000003 -104.43433599533714 -10.267949192431178
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -135.50000000000003 -104.43433599533714 -10.267949192431178
+ vertex -135.01763809020505 -104.43433599533714 -10.068148347421925
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -135.01763809020505 -104.43433599533714 -10.068148347421925
+ vertex -134.5 -104.4343359953371 -10.00000000000005
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -134.5 -104.4343359953371 -10.00000000000005
+ vertex -109.7 -104.43433599533714 -10.000000000000037
+ endloop
+endfacet
+facet normal 3.3306690738754686e-16 -1.0 -8.065757021836445e-17
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -109.7 -104.43433599533714 -10.000000000000037
+ vertex -94.70940107675858 -104.43433599533697 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.06403093220853912 -0.9979479143324594 -1.5974817945265748e-16
+ outer loop
+ vertex -150.00000000000009 -124.13030787576977 -3.000000000000062
+ vertex -151.60819479272953 -124.0271219175925 -62.600000000000065
+ vertex -150.00000000000006 -124.13030787576977 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.06403093220853912 -0.9979479143324594 -1.5974817945265748e-16
+ outer loop
+ vertex -151.60819479272953 -124.0271219175925 -62.600000000000065
+ vertex -150.00000000000009 -124.13030787576977 -3.000000000000062
+ vertex -151.60819479272953 -124.02712191759251 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.3882711944089187 -0.9215451587373632 -1.840431746308456e-16
+ outer loop
+ vertex -162.54960709458356 -121.44892868430702 -62.600000000000065
+ vertex -164.03467871431616 -120.82322898190026 -3.000000000000062
+ vertex -164.03467871431613 -120.82322898190026 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.3882711944089187 -0.9215451587373632 -1.840431746308456e-16
+ outer loop
+ vertex -164.03467871431616 -120.82322898190026 -3.000000000000062
+ vertex -162.54960709458356 -121.44892868430702 -62.600000000000065
+ vertex -162.5496070945836 -121.44892868430702 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.10571189404138018 -0.9943967998028674 -1.6383039476578026e-16
+ outer loop
+ vertex -151.60819479272953 -124.02712191759251 -3.000000000000062
+ vertex -153.2106669582428 -123.85676701721613 -62.600000000000065
+ vertex -151.60819479272953 -124.0271219175925 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.10571189404138018 -0.9943967998028674 -1.6383039476578026e-16
+ outer loop
+ vertex -153.2106669582428 -123.85676701721613 -62.600000000000065
+ vertex -151.60819479272953 -124.02712191759251 -3.000000000000062
+ vertex -153.2106669582428 -123.85676701721616 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9990971750681177 -0.042483346983344376 -1.1736899405614529e-16
+ outer loop
+ vertex -186.7837460938633 -88.08422144198268 -62.600000000000065
+ vertex -186.85220808112246 -86.47417461358681 -3.000000000000062
+ vertex -186.85220808112246 -86.47417461358681 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9990971750681177 -0.042483346983344376 -1.1736899405614529e-16
+ outer loop
+ vertex -186.85220808112246 -86.47417461358681 -3.000000000000062
+ vertex -186.7837460938633 -88.08422144198268 -62.600000000000065
+ vertex -186.7837460938633 -88.08422144198268 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9297083246305115 -0.36829666182675036 -1.5950409550416873e-16
+ outer loop
+ vertex -183.8487247516966 -100.57694261544428 -62.600000000000065
+ vertex -184.4422354602446 -99.07871603973354 -3.000000000000062
+ vertex -184.4422354602446 -99.07871603973354 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9297083246305115 -0.36829666182675036 -1.5950409550416873e-16
+ outer loop
+ vertex -184.4422354602446 -99.07871603973354 -3.000000000000062
+ vertex -183.8487247516966 -100.57694261544428 -62.600000000000065
+ vertex -183.84872475169664 -100.57694261544428 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9991524752349786 0.04116225494085001 -1.0458099413404861e-16
+ outer loop
+ vertex -186.85327348436147 -84.86267323343132 -62.600000000000065
+ vertex -186.78694043921737 -83.25253728872076 -3.000000000000062
+ vertex -186.78694043921737 -83.25253728872076 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9991524752349786 0.04116225494085001 -1.0458099413404861e-16
+ outer loop
+ vertex -186.78694043921737 -83.25253728872076 -3.000000000000062
+ vertex -186.85327348436147 -84.86267323343132 -62.600000000000065
+ vertex -186.8532734843615 -84.86267323343132 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8553779590758187 -0.5180043891004082 -1.7415434132155012e-16
+ outer loop
+ vertex -180.8652792237608 -106.28301249011629 -62.600000000000065
+ vertex -181.7000441941546 -104.90456942726223 -3.000000000000062
+ vertex -181.7000441941546 -104.9045694272622 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.8553779590758187 -0.5180043891004082 -1.7415434132155012e-16
+ outer loop
+ vertex -181.7000441941546 -104.90456942726223 -3.000000000000062
+ vertex -180.8652792237608 -106.28301249011629 -62.600000000000065
+ vertex -180.8652792237608 -106.28301249011629 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.5005724413202218 -0.8656946522826123 -1.8796266836386042e-16
+ outer loop
+ vertex -166.91986759538986 -119.38834500102287 -62.600000000000065
+ vertex -168.31493602721866 -118.5816716446749 -3.000000000000062
+ vertex -168.31493602721866 -118.5816716446749 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.5005724413202218 -0.8656946522826123 -1.8796266836386042e-16
+ outer loop
+ vertex -168.31493602721866 -118.5816716446749 -3.000000000000062
+ vertex -166.91986759538986 -119.38834500102287 -62.600000000000065
+ vertex -166.9198675953899 -119.38834500102287 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.536340245259425 -0.8440018609665858 -1.886138071888622e-16
+ outer loop
+ vertex -168.31493602721866 -118.5816716446749 -62.600000000000065
+ vertex -169.6750464882625 -117.71735841031693 -3.000000000000062
+ vertex -169.6750464882625 -117.71735841031693 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.536340245259425 -0.8440018609665858 -1.886138071888622e-16
+ outer loop
+ vertex -169.6750464882625 -117.71735841031693 -3.000000000000062
+ vertex -168.31493602721866 -118.5816716446749 -62.600000000000065
+ vertex -168.31493602721866 -118.5816716446749 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.7571505514688204 -0.6532404170062207 -1.8393916645092185e-16
+ outer loop
+ vertex -176.97310473123767 -111.41245284482866 -62.600000000000065
+ vertex -178.0258027948761 -110.19230341949634 -3.000000000000062
+ vertex -178.0258027948761 -110.19230341949631 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.7571505514688204 -0.6532404170062207 -1.8393916645092185e-16
+ outer loop
+ vertex -178.0258027948761 -110.19230341949634 -3.000000000000062
+ vertex -176.97310473123767 -111.41245284482866 -62.600000000000065
+ vertex -176.9731047312377 -111.41245284482866 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.4639286791616627 -0.8858725532780182 -1.869826112231558e-16
+ outer loop
+ vertex -165.492282441152 -120.135966871173 -62.600000000000065
+ vertex -166.9198675953899 -119.38834500102287 -3.000000000000062
+ vertex -166.91986759538986 -119.38834500102287 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.4639286791616627 -0.8858725532780182 -1.869826112231558e-16
+ outer loop
+ vertex -166.9198675953899 -119.38834500102287 -3.000000000000062
+ vertex -165.492282441152 -120.135966871173 -62.600000000000065
+ vertex -165.492282441152 -120.135966871173 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.7838084275862288 -0.6210026963265165 -1.8196645150886382e-16
+ outer loop
+ vertex -178.0258027948761 -110.19230341949631 -62.600000000000065
+ vertex -179.0265497157926 -108.92919478062029 -3.000000000000062
+ vertex -179.0265497157926 -108.92919478062029 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.7838084275862288 -0.6210026963265165 -1.8196645150886382e-16
+ outer loop
+ vertex -179.0265497157926 -108.92919478062029 -3.000000000000062
+ vertex -178.0258027948761 -110.19230341949631 -62.600000000000065
+ vertex -178.0258027948761 -110.19230341949634 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9783396194476177 0.20700625357483915 -7.690445521229414e-17
+ outer loop
+ vertex -186.1852996663851 -78.4584565279085 -62.600000000000065
+ vertex -185.85170873014454 -76.88186053635415 -3.000000000000062
+ vertex -185.85170873014454 -76.88186053635415 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9783396194476177 0.20700625357483915 -7.690445521229414e-17
+ outer loop
+ vertex -185.85170873014454 -76.88186053635415 -3.000000000000062
+ vertex -186.1852996663851 -78.4584565279085 -62.600000000000065
+ vertex -186.1852996663851 -78.45845652790851 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9999997814571895 -0.0006611244764069267 -1.1107217741834977e-16
+ outer loop
+ vertex -186.85220808112246 -86.47417461358681 -62.600000000000065
+ vertex -186.8532734843615 -84.86267323343132 -3.000000000000062
+ vertex -186.85327348436147 -84.86267323343132 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9999997814571895 -0.0006611244764069267 -1.1107217741834977e-16
+ outer loop
+ vertex -186.8532734843615 -84.86267323343132 -3.000000000000062
+ vertex -186.85220808112246 -86.47417461358681 -62.600000000000065
+ vertex -186.85220808112246 -86.47417461358681 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9134916689428522 -0.4068574329811398 -1.6360263546573034e-16
+ outer loop
+ vertex -183.1930732936331 -102.04903602242166 -62.600000000000065
+ vertex -183.84872475169664 -100.57694261544428 -3.000000000000062
+ vertex -183.8487247516966 -100.57694261544428 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9134916689428522 -0.4068574329811398 -1.6360263546573034e-16
+ outer loop
+ vertex -183.84872475169664 -100.57694261544428 -3.000000000000062
+ vertex -183.1930732936331 -102.04903602242166 -62.600000000000065
+ vertex -183.1930732936331 -102.04903602242166 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8956764823140547 -0.4447062390269794 -1.67414885049686e-16
+ outer loop
+ vertex -182.47642841905974 -103.4924202252848 -62.600000000000065
+ vertex -183.1930732936331 -102.04903602242166 -3.000000000000062
+ vertex -183.1930732936331 -102.04903602242166 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.8956764823140547 -0.4447062390269794 -1.67414885049686e-16
+ outer loop
+ vertex -183.1930732936331 -102.04903602242166 -3.000000000000062
+ vertex -182.47642841905974 -103.4924202252848 -62.600000000000065
+ vertex -182.47642841905977 -103.49242022528482 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9861411980746706 0.16590821998880342 -8.405641526141981e-17
+ outer loop
+ vertex -186.4526610503061 -80.04762477693528 -62.600000000000065
+ vertex -186.1852996663851 -78.45845652790851 -3.000000000000062
+ vertex -186.1852996663851 -78.4584565279085 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9861411980746706 0.16590821998880342 -8.405641526141981e-17
+ outer loop
+ vertex -186.1852996663851 -78.45845652790851 -3.000000000000062
+ vertex -186.4526610503061 -80.04762477693528 -62.600000000000065
+ vertex -186.4526610503061 -80.0476247769353 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9572353791850615 -0.28931026396661363 -1.5047732123427995e-16
+ outer loop
+ vertex -184.97256682717617 -97.55697806144177 -62.600000000000065
+ vertex -185.4387908187414 -96.01439158963021 -3.000000000000062
+ vertex -185.4387908187414 -96.0143915896302 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9572353791850615 -0.28931026396661363 -1.5047732123427995e-16
+ outer loop
+ vertex -185.4387908187414 -96.01439158963021 -3.000000000000062
+ vertex -184.97256682717617 -97.55697806144177 -62.600000000000065
+ vertex -184.9725668271762 -97.55697806144177 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.944298071640538 -0.3290914035582841 -1.5512643725333327e-16
+ outer loop
+ vertex -184.4422354602446 -99.07871603973354 -62.600000000000065
+ vertex -184.9725668271762 -97.55697806144177 -3.000000000000062
+ vertex -184.97256682717617 -97.55697806144177 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.944298071640538 -0.3290914035582841 -1.5512643725333327e-16
+ outer loop
+ vertex -184.9725668271762 -97.55697806144177 -3.000000000000062
+ vertex -184.4422354602446 -99.07871603973354 -62.600000000000065
+ vertex -184.4422354602446 -99.07871603973354 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.7291677277631985 -0.6843350237921877 -1.8559000385555467e-16
+ outer loop
+ vertex -175.87029765489726 -112.58750790128374 -62.600000000000065
+ vertex -176.9731047312377 -111.41245284482866 -3.000000000000062
+ vertex -176.97310473123767 -111.41245284482866 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.7291677277631985 -0.6843350237921877 -1.8559000385555467e-16
+ outer loop
+ vertex -176.9731047312377 -111.41245284482866 -3.000000000000062
+ vertex -175.87029765489726 -112.58750790128374 -62.600000000000065
+ vertex -175.87029765489729 -112.58750790128374 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.793353340291227 -1.6653345369377353e-16 -0.6087614290087313
+ outer loop
+ vertex -107.96794919243113 -104.43433599533698 -54.600000000000044
+ vertex -108.28578643762692 -106.43433599533697 -55.01421356237315
+ vertex -108.2857864376269 -104.43433599533701 -55.01421356237315
+ endloop
+endfacet
+facet normal 0.793353340291227 -1.6653345369377353e-16 -0.6087614290087313
+ outer loop
+ vertex -108.28578643762692 -106.43433599533697 -55.01421356237315
+ vertex -107.96794919243113 -104.43433599533698 -54.600000000000044
+ vertex -107.96794919243113 -106.43433599533697 -54.600000000000044
+ endloop
+endfacet
+facet normal -0.608761429008725 7.771561172376093e-16 -0.7933533402912317
+ outer loop
+ vertex -135.50000000000006 -106.43433599533691 -55.33205080756895
+ vertex -135.91421356237313 -104.43433599533697 -55.01421356237316
+ vertex -135.50000000000003 -104.43433599533694 -55.33205080756895
+ endloop
+endfacet
+facet normal -0.608761429008725 7.771561172376093e-16 -0.7933533402912317
+ outer loop
+ vertex -135.91421356237313 -104.43433599533697 -55.01421356237316
+ vertex -135.50000000000006 -106.43433599533691 -55.33205080756895
+ vertex -135.91421356237313 -106.43433599533691 -55.01421356237316
+ endloop
+endfacet
+facet normal -0.3826834323650807 -1.9428902930940227e-16 0.9238795325112906
+ outer loop
+ vertex -135.50000000000006 -104.43433599533697 -49.86794919243118
+ vertex -135.01763809020508 -106.43433599533691 -49.66814834742192
+ vertex -135.01763809020508 -104.43433599533697 -49.66814834742192
+ endloop
+endfacet
+facet normal -0.3826834323650807 -1.9428902930940227e-16 0.9238795325112906
+ outer loop
+ vertex -135.01763809020508 -106.43433599533691 -49.66814834742192
+ vertex -135.50000000000006 -104.43433599533697 -49.86794919243118
+ vertex -135.50000000000009 -106.43433599533691 -49.86794919243118
+ endloop
+endfacet
+facet normal 0.38268343236510116 1.9428902930940222e-16 -0.923879532511282
+ outer loop
+ vertex -108.70000000000005 -106.43433599533697 -55.332050807568926
+ vertex -109.18236190979498 -104.43433599533701 -55.53185165257819
+ vertex -108.70000000000003 -104.43433599533698 -55.332050807568926
+ endloop
+endfacet
+facet normal 0.38268343236510116 1.9428902930940222e-16 -0.923879532511282
+ outer loop
+ vertex -109.18236190979498 -104.43433599533701 -55.53185165257819
+ vertex -108.70000000000005 -106.43433599533697 -55.332050807568926
+ vertex -109.18236190979498 -106.43433599533697 -55.53185165257819
+ endloop
+endfacet
+facet normal -1.0 5.551115123125781e-16 5.933957380480175e-32
+ outer loop
+ vertex -136.50000000000006 -106.43433599533697 -53.60000000000007
+ vertex -136.50000000000006 -104.43433599533697 -51.600000000000065
+ vertex -136.50000000000006 -104.43433599533697 -53.60000000000007
+ endloop
+endfacet
+facet normal -1.0 5.551115123125781e-16 5.933957380480175e-32
+ outer loop
+ vertex -136.50000000000006 -104.43433599533697 -51.600000000000065
+ vertex -136.50000000000006 -106.43433599533697 -53.60000000000007
+ vertex -136.50000000000006 -106.43433599533697 -51.600000000000065
+ endloop
+endfacet
+facet normal -0.9238795325112814 7.771561172376095e-16 -0.3826834323651031
+ outer loop
+ vertex -136.23205080756892 -104.43433599533697 -54.60000000000007
+ vertex -136.4318516525782 -106.43433599533691 -54.117638090205105
+ vertex -136.43185165257816 -104.43433599533697 -54.117638090205105
+ endloop
+endfacet
+facet normal -0.9238795325112814 7.771561172376095e-16 -0.3826834323651031
+ outer loop
+ vertex -136.4318516525782 -106.43433599533691 -54.117638090205105
+ vertex -136.23205080756892 -104.43433599533697 -54.60000000000007
+ vertex -136.23205080756892 -106.43433599533697 -54.60000000000007
+ endloop
+endfacet
+facet normal -0.9238795325112833 2.7755575615628914e-16 0.3826834323650983
+ outer loop
+ vertex -136.4318516525782 -106.43433599533691 -51.08236190979502
+ vertex -136.23205080756892 -104.43433599533697 -50.60000000000005
+ vertex -136.43185165257816 -104.43433599533697 -51.08236190979502
+ endloop
+endfacet
+facet normal -0.9238795325112833 2.7755575615628914e-16 0.3826834323650983
+ outer loop
+ vertex -136.23205080756892 -104.43433599533697 -50.60000000000005
+ vertex -136.4318516525782 -106.43433599533691 -51.08236190979502
+ vertex -136.23205080756892 -106.43433599533697 -50.60000000000005
+ endloop
+endfacet
+facet normal 6.822499554551367e-16 4.884367980290835e-16 -1.0
+ outer loop
+ vertex -109.70000000000003 -106.43433599533697 -55.60000000000006
+ vertex -134.50000000000003 -104.43433599533697 -55.600000000000065
+ vertex -109.7 -104.43433599533701 -55.60000000000006
+ endloop
+endfacet
+facet normal 6.822499554551367e-16 4.884367980290835e-16 -1.0
+ outer loop
+ vertex -134.50000000000003 -104.43433599533697 -55.600000000000065
+ vertex -109.70000000000003 -106.43433599533697 -55.60000000000006
+ vertex -134.50000000000006 -106.43433599533694 -55.600000000000065
+ endloop
+endfacet
+facet normal -0.6087614290087396 -5.5511151231257704e-17 0.7933533402912205
+ outer loop
+ vertex -135.91421356237313 -104.43433599533697 -50.185786437626966
+ vertex -135.50000000000009 -106.43433599533691 -49.86794919243118
+ vertex -135.50000000000006 -104.43433599533697 -49.86794919243118
+ endloop
+endfacet
+facet normal -0.6087614290087396 -5.5511151231257704e-17 0.7933533402912205
+ outer loop
+ vertex -135.50000000000009 -106.43433599533691 -49.86794919243118
+ vertex -135.91421356237313 -104.43433599533697 -50.185786437626966
+ vertex -135.91421356237313 -106.43433599533694 -50.185786437626966
+ endloop
+endfacet
+facet normal 0.6087614290087087 -5.551115123125794e-17 -0.7933533402912444
+ outer loop
+ vertex -108.28578643762692 -106.43433599533697 -55.01421356237315
+ vertex -108.70000000000003 -104.43433599533698 -55.332050807568926
+ vertex -108.2857864376269 -104.43433599533701 -55.01421356237315
+ endloop
+endfacet
+facet normal 0.6087614290087087 -5.551115123125794e-17 -0.7933533402912444
+ outer loop
+ vertex -108.70000000000003 -104.43433599533698 -55.332050807568926
+ vertex -108.28578643762692 -106.43433599533697 -55.01421356237315
+ vertex -108.70000000000005 -106.43433599533697 -55.332050807568926
+ endloop
+endfacet
+facet normal 0.9238795325112992 -2.220446049250313e-16 -0.38268343236505953
+ outer loop
+ vertex -107.76814834742189 -104.43433599533701 -54.11763809020509
+ vertex -107.96794919243113 -106.43433599533697 -54.600000000000044
+ vertex -107.96794919243113 -104.43433599533698 -54.600000000000044
+ endloop
+endfacet
+facet normal 0.9238795325112992 -2.220446049250313e-16 -0.38268343236505953
+ outer loop
+ vertex -107.96794919243113 -106.43433599533697 -54.600000000000044
+ vertex -107.76814834742189 -104.43433599533701 -54.11763809020509
+ vertex -107.7681483474219 -106.43433599533697 -54.11763809020509
+ endloop
+endfacet
+facet normal -0.13052619222005019 5.481726184086709e-16 -0.9914448613738106
+ outer loop
+ vertex -134.50000000000006 -106.43433599533694 -55.600000000000065
+ vertex -135.01763809020508 -104.43433599533697 -55.531851652578204
+ vertex -134.50000000000003 -104.43433599533697 -55.600000000000065
+ endloop
+endfacet
+facet normal -0.13052619222005019 5.481726184086709e-16 -0.9914448613738106
+ outer loop
+ vertex -135.01763809020508 -104.43433599533697 -55.531851652578204
+ vertex -134.50000000000006 -106.43433599533694 -55.600000000000065
+ vertex -135.01763809020508 -106.43433599533691 -55.531851652578204
+ endloop
+endfacet
+facet normal 0.9238795325113052 -7.771561172376093e-16 0.38268343236504543
+ outer loop
+ vertex -107.96794919243113 -106.43433599533697 -50.60000000000003
+ vertex -107.76814834742189 -104.43433599533698 -51.082361909795
+ vertex -107.96794919243113 -104.43433599533701 -50.60000000000003
+ endloop
+endfacet
+facet normal 0.9238795325113052 -7.771561172376093e-16 0.38268343236504543
+ outer loop
+ vertex -107.76814834742189 -104.43433599533698 -51.082361909795
+ vertex -107.96794919243113 -106.43433599533697 -50.60000000000003
+ vertex -107.7681483474219 -106.43433599533697 -51.082361909795
+ endloop
+endfacet
+facet normal 1.0 -5.551115123125781e-16 2.442162611707109e-15
+ outer loop
+ vertex -107.70000000000003 -106.43433599533698 -51.600000000000044
+ vertex -107.7 -104.43433599533701 -53.60000000000005
+ vertex -107.7 -104.43433599533701 -51.600000000000044
+ endloop
+endfacet
+facet normal 1.0 -5.551115123125781e-16 2.442162611707109e-15
+ outer loop
+ vertex -107.7 -104.43433599533701 -53.60000000000005
+ vertex -107.70000000000003 -106.43433599533698 -51.600000000000044
+ vertex -107.70000000000003 -106.43433599533698 -53.60000000000005
+ endloop
+endfacet
+facet normal 0.793353340291223 -7.771561172376093e-16 0.6087614290087365
+ outer loop
+ vertex -108.28578643762695 -106.43433599533697 -50.185786437626945
+ vertex -107.96794919243113 -104.43433599533701 -50.60000000000003
+ vertex -108.28578643762692 -104.43433599533701 -50.185786437626945
+ endloop
+endfacet
+facet normal 0.793353340291223 -7.771561172376093e-16 0.6087614290087365
+ outer loop
+ vertex -107.96794919243113 -104.43433599533701 -50.60000000000003
+ vertex -108.28578643762695 -106.43433599533697 -50.185786437626945
+ vertex -107.96794919243113 -106.43433599533697 -50.60000000000003
+ endloop
+endfacet
+facet normal -0.13052619222005263 -4.024558464266191e-16 0.9914448613738104
+ outer loop
+ vertex -135.01763809020508 -104.43433599533697 -49.66814834742192
+ vertex -134.50000000000006 -106.43433599533694 -49.60000000000006
+ vertex -134.50000000000006 -104.43433599533697 -49.60000000000006
+ endloop
+endfacet
+facet normal -0.13052619222005263 -4.024558464266191e-16 0.9914448613738104
+ outer loop
+ vertex -134.50000000000006 -106.43433599533694 -49.60000000000006
+ vertex -135.01763809020508 -104.43433599533697 -49.66814834742192
+ vertex -135.01763809020508 -106.43433599533691 -49.66814834742192
+ endloop
+endfacet
+facet normal -0.9914448613738086 6.661338147750937e-16 -0.13052619222006553
+ outer loop
+ vertex -136.43185165257816 -104.43433599533697 -54.117638090205105
+ vertex -136.50000000000006 -106.43433599533697 -53.60000000000007
+ vertex -136.50000000000006 -104.43433599533697 -53.60000000000007
+ endloop
+endfacet
+facet normal -0.9914448613738086 6.661338147750937e-16 -0.13052619222006553
+ outer loop
+ vertex -136.50000000000006 -106.43433599533697 -53.60000000000007
+ vertex -136.43185165257816 -104.43433599533697 -54.117638090205105
+ vertex -136.4318516525782 -106.43433599533691 -54.117638090205105
+ endloop
+endfacet
+facet normal -0.79335334029125 1.6653345369377353e-16 0.6087614290087011
+ outer loop
+ vertex -136.23205080756892 -106.43433599533697 -50.60000000000005
+ vertex -135.91421356237313 -104.43433599533697 -50.185786437626966
+ vertex -136.23205080756892 -104.43433599533697 -50.60000000000005
+ endloop
+endfacet
+facet normal -0.79335334029125 1.6653345369377353e-16 0.6087614290087011
+ outer loop
+ vertex -135.91421356237313 -104.43433599533697 -50.185786437626966
+ vertex -136.23205080756892 -106.43433599533697 -50.60000000000005
+ vertex -135.91421356237313 -106.43433599533694 -50.185786437626966
+ endloop
+endfacet
+facet normal 0.9914448613738078 -6.661338147750936e-16 0.13052619222007122
+ outer loop
+ vertex -107.7681483474219 -106.43433599533697 -51.082361909795
+ vertex -107.7 -104.43433599533701 -51.600000000000044
+ vertex -107.76814834742189 -104.43433599533698 -51.082361909795
+ endloop
+endfacet
+facet normal 0.9914448613738078 -6.661338147750936e-16 0.13052619222007122
+ outer loop
+ vertex -107.7 -104.43433599533701 -51.600000000000044
+ vertex -107.7681483474219 -106.43433599533697 -51.082361909795
+ vertex -107.70000000000003 -106.43433599533698 -51.600000000000044
+ endloop
+endfacet
+facet normal 0.6087614290087019 -7.771561172376095e-16 0.7933533402912496
+ outer loop
+ vertex -108.70000000000003 -104.43433599533698 -49.86794919243116
+ vertex -108.28578643762695 -106.43433599533697 -50.185786437626945
+ vertex -108.28578643762692 -104.43433599533701 -50.185786437626945
+ endloop
+endfacet
+facet normal 0.6087614290087019 -7.771561172376095e-16 0.7933533402912496
+ outer loop
+ vertex -108.28578643762695 -106.43433599533697 -50.185786437626945
+ vertex -108.70000000000003 -104.43433599533698 -49.86794919243116
+ vertex -108.70000000000005 -106.43433599533697 -49.86794919243116
+ endloop
+endfacet
+facet normal 0.13052619222005296 4.024558464266191e-16 -0.9914448613738103
+ outer loop
+ vertex -109.18236190979498 -106.43433599533697 -55.53185165257819
+ vertex -109.7 -104.43433599533701 -55.60000000000006
+ vertex -109.18236190979498 -104.43433599533701 -55.53185165257819
+ endloop
+endfacet
+facet normal 0.13052619222005296 4.024558464266191e-16 -0.9914448613738103
+ outer loop
+ vertex -109.7 -104.43433599533701 -55.60000000000006
+ vertex -109.18236190979498 -106.43433599533697 -55.53185165257819
+ vertex -109.70000000000003 -106.43433599533697 -55.60000000000006
+ endloop
+endfacet
+facet normal 0.3826834323651082 -6.661338147750938e-16 0.9238795325112792
+ outer loop
+ vertex -109.18236190979498 -104.43433599533701 -49.6681483474219
+ vertex -108.70000000000005 -106.43433599533697 -49.86794919243116
+ vertex -108.70000000000003 -104.43433599533698 -49.86794919243116
+ endloop
+endfacet
+facet normal 0.3826834323651082 -6.661338147750938e-16 0.9238795325112792
+ outer loop
+ vertex -108.70000000000005 -106.43433599533697 -49.86794919243116
+ vertex -109.18236190979498 -104.43433599533701 -49.6681483474219
+ vertex -109.18236190979498 -106.43433599533697 -49.6681483474219
+ endloop
+endfacet
+facet normal -0.793353340291236 7.771561172376095e-16 -0.6087614290087197
+ outer loop
+ vertex -135.91421356237313 -104.43433599533697 -55.01421356237316
+ vertex -136.23205080756892 -106.43433599533697 -54.60000000000007
+ vertex -136.23205080756892 -104.43433599533697 -54.60000000000007
+ endloop
+endfacet
+facet normal -0.793353340291236 7.771561172376095e-16 -0.6087614290087197
+ outer loop
+ vertex -136.23205080756892 -106.43433599533697 -54.60000000000007
+ vertex -135.91421356237313 -104.43433599533697 -55.01421356237316
+ vertex -135.91421356237313 -106.43433599533691 -55.01421356237316
+ endloop
+endfacet
+facet normal -6.822499554551365e-16 -4.884367980290834e-16 1.0
+ outer loop
+ vertex -134.50000000000006 -104.43433599533697 -49.60000000000006
+ vertex -109.70000000000003 -106.43433599533697 -49.60000000000003
+ vertex -109.7 -104.43433599533701 -49.60000000000003
+ endloop
+endfacet
+facet normal -6.822499554551365e-16 -4.884367980290834e-16 1.0
+ outer loop
+ vertex -109.70000000000003 -106.43433599533697 -49.60000000000003
+ vertex -134.50000000000006 -104.43433599533697 -49.60000000000006
+ vertex -134.50000000000006 -106.43433599533694 -49.60000000000006
+ endloop
+endfacet
+facet normal -0.38268343236509783 6.661338147750938e-16 -0.9238795325112834
+ outer loop
+ vertex -135.01763809020508 -106.43433599533691 -55.531851652578204
+ vertex -135.50000000000003 -104.43433599533694 -55.33205080756895
+ vertex -135.01763809020508 -104.43433599533697 -55.531851652578204
+ endloop
+endfacet
+facet normal -0.38268343236509783 6.661338147750938e-16 -0.9238795325112834
+ outer loop
+ vertex -135.50000000000003 -104.43433599533694 -55.33205080756895
+ vertex -135.01763809020508 -106.43433599533691 -55.531851652578204
+ vertex -135.50000000000006 -106.43433599533691 -55.33205080756895
+ endloop
+endfacet
+facet normal 0.9914448613738094 -5.551115123125782e-16 -0.1305261922200592
+ outer loop
+ vertex -107.7 -104.43433599533701 -53.60000000000005
+ vertex -107.7681483474219 -106.43433599533697 -54.11763809020509
+ vertex -107.76814834742189 -104.43433599533701 -54.11763809020509
+ endloop
+endfacet
+facet normal 0.9914448613738094 -5.551115123125782e-16 -0.1305261922200592
+ outer loop
+ vertex -107.7681483474219 -106.43433599533697 -54.11763809020509
+ vertex -107.7 -104.43433599533701 -53.60000000000005
+ vertex -107.70000000000003 -106.43433599533698 -53.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738087 5.551115123125783e-16 0.13052619222006556
+ outer loop
+ vertex -136.50000000000006 -106.43433599533697 -51.600000000000065
+ vertex -136.43185165257816 -104.43433599533697 -51.08236190979502
+ vertex -136.50000000000006 -104.43433599533697 -51.600000000000065
+ endloop
+endfacet
+facet normal -0.9914448613738087 5.551115123125783e-16 0.13052619222006556
+ outer loop
+ vertex -136.43185165257816 -104.43433599533697 -51.08236190979502
+ vertex -136.50000000000006 -106.43433599533697 -51.600000000000065
+ vertex -136.4318516525782 -106.43433599533691 -51.08236190979502
+ endloop
+endfacet
+facet normal 0.130526192220053 -5.481726184086709e-16 0.9914448613738103
+ outer loop
+ vertex -109.7 -104.43433599533701 -49.60000000000003
+ vertex -109.18236190979498 -106.43433599533697 -49.6681483474219
+ vertex -109.18236190979498 -104.43433599533701 -49.6681483474219
+ endloop
+endfacet
+facet normal 0.130526192220053 -5.481726184086709e-16 0.9914448613738103
+ outer loop
+ vertex -109.18236190979498 -106.43433599533697 -49.6681483474219
+ vertex -109.7 -104.43433599533701 -49.60000000000003
+ vertex -109.70000000000003 -106.43433599533697 -49.60000000000003
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -109.70000000000005 -106.43433599533701 -16.00000000000005
+ vertex -135.0176380902051 -106.43433599533698 -15.931851652578203
+ vertex -134.50000000000006 -106.43433599533697 -16.000000000000068
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -135.0176380902051 -106.43433599533698 -15.931851652578203
+ vertex -109.70000000000005 -106.43433599533701 -16.00000000000005
+ vertex -109.18236190979502 -106.43433599533701 -15.931851652578185
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -135.0176380902051 -106.43433599533698 -15.931851652578203
+ vertex -109.18236190979502 -106.43433599533701 -15.931851652578185
+ vertex -135.50000000000006 -106.43433599533697 -15.732050807568942
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -135.50000000000006 -106.43433599533697 -15.732050807568942
+ vertex -109.18236190979502 -106.43433599533701 -15.931851652578185
+ vertex -108.70000000000007 -106.43433599533701 -15.732050807568926
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -135.50000000000006 -106.43433599533697 -15.732050807568942
+ vertex -108.70000000000007 -106.43433599533701 -15.732050807568926
+ vertex -135.9142135623732 -106.43433599533697 -15.414213562373158
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -135.9142135623732 -106.43433599533697 -15.414213562373158
+ vertex -108.70000000000007 -106.43433599533701 -15.732050807568926
+ vertex -108.28578643762695 -106.43433599533701 -15.41421356237314
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -135.9142135623732 -106.43433599533697 -15.414213562373158
+ vertex -108.28578643762695 -106.43433599533701 -15.41421356237314
+ vertex -136.23205080756895 -106.43433599533697 -15.000000000000062
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -136.23205080756895 -106.43433599533697 -15.000000000000062
+ vertex -108.28578643762695 -106.43433599533701 -15.41421356237314
+ vertex -107.96794919243118 -106.43433599533701 -15.000000000000046
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -136.23205080756895 -106.43433599533697 -15.000000000000062
+ vertex -107.96794919243118 -106.43433599533701 -15.000000000000046
+ vertex -136.43185165257822 -106.43433599533698 -14.517638090205104
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -136.43185165257822 -106.43433599533698 -14.517638090205104
+ vertex -107.96794919243118 -106.43433599533701 -15.000000000000046
+ vertex -107.76814834742193 -106.43433599533701 -14.517638090205088
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -136.43185165257822 -106.43433599533698 -14.517638090205104
+ vertex -107.76814834742193 -106.43433599533701 -14.517638090205088
+ vertex -136.50000000000009 -106.43433599533697 -14.000000000000064
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -136.50000000000009 -106.43433599533697 -14.000000000000064
+ vertex -107.76814834742193 -106.43433599533701 -14.517638090205088
+ vertex -107.70000000000007 -106.43433599533701 -14.000000000000048
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -136.50000000000009 -106.43433599533697 -14.000000000000064
+ vertex -107.70000000000007 -106.43433599533701 -14.000000000000048
+ vertex -136.50000000000009 -106.43433599533697 -12.000000000000052
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -136.50000000000009 -106.43433599533697 -12.000000000000052
+ vertex -107.70000000000007 -106.43433599533701 -14.000000000000048
+ vertex -107.70000000000007 -106.43433599533701 -12.000000000000034
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -136.50000000000009 -106.43433599533697 -12.000000000000052
+ vertex -107.70000000000007 -106.43433599533701 -12.000000000000034
+ vertex -136.43185165257822 -106.43433599533698 -11.482361909795022
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -136.43185165257822 -106.43433599533698 -11.482361909795022
+ vertex -107.70000000000007 -106.43433599533701 -12.000000000000034
+ vertex -107.76814834742193 -106.43433599533701 -11.482361909795
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -136.43185165257822 -106.43433599533698 -11.482361909795022
+ vertex -107.76814834742193 -106.43433599533701 -11.482361909795
+ vertex -136.23205080756895 -106.43433599533697 -11.000000000000048
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -136.23205080756895 -106.43433599533697 -11.000000000000048
+ vertex -107.76814834742193 -106.43433599533701 -11.482361909795
+ vertex -107.96794919243118 -106.43433599533701 -11.000000000000036
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -136.23205080756895 -106.43433599533697 -11.000000000000048
+ vertex -107.96794919243118 -106.43433599533701 -11.000000000000036
+ vertex -135.9142135623732 -106.43433599533697 -10.58578643762697
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -135.9142135623732 -106.43433599533697 -10.58578643762697
+ vertex -107.96794919243118 -106.43433599533701 -11.000000000000036
+ vertex -108.28578643762697 -106.43433599533701 -10.585786437626947
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -135.9142135623732 -106.43433599533697 -10.58578643762697
+ vertex -108.28578643762697 -106.43433599533701 -10.585786437626947
+ vertex -135.50000000000009 -106.43433599533698 -10.267949192431178
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -135.50000000000009 -106.43433599533698 -10.267949192431178
+ vertex -108.28578643762697 -106.43433599533701 -10.585786437626947
+ vertex -108.70000000000007 -106.43433599533701 -10.267949192431168
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -135.50000000000009 -106.43433599533698 -10.267949192431178
+ vertex -108.70000000000007 -106.43433599533701 -10.267949192431168
+ vertex -135.0176380902051 -106.43433599533698 -10.068148347421925
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -135.0176380902051 -106.43433599533698 -10.068148347421925
+ vertex -108.70000000000007 -106.43433599533701 -10.267949192431168
+ vertex -109.18236190979502 -106.43433599533701 -10.068148347421902
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -135.0176380902051 -106.43433599533698 -10.068148347421925
+ vertex -109.18236190979502 -106.43433599533701 -10.068148347421902
+ vertex -134.50000000000006 -106.43433599533697 -10.00000000000005
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -134.50000000000006 -106.43433599533697 -10.00000000000005
+ vertex -109.18236190979502 -106.43433599533701 -10.068148347421902
+ vertex -109.70000000000007 -106.43433599533701 -10.000000000000037
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -109.70000000000003 -106.43433599533697 -55.60000000000006
+ vertex -135.01763809020508 -106.43433599533691 -55.531851652578204
+ vertex -134.50000000000006 -106.43433599533694 -55.600000000000065
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -135.01763809020508 -106.43433599533691 -55.531851652578204
+ vertex -109.70000000000003 -106.43433599533697 -55.60000000000006
+ vertex -109.18236190979498 -106.43433599533697 -55.53185165257819
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -135.01763809020508 -106.43433599533691 -55.531851652578204
+ vertex -109.18236190979498 -106.43433599533697 -55.53185165257819
+ vertex -135.50000000000006 -106.43433599533691 -55.33205080756895
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -135.50000000000006 -106.43433599533691 -55.33205080756895
+ vertex -109.18236190979498 -106.43433599533697 -55.53185165257819
+ vertex -108.70000000000005 -106.43433599533697 -55.332050807568926
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -135.50000000000006 -106.43433599533691 -55.33205080756895
+ vertex -108.70000000000005 -106.43433599533697 -55.332050807568926
+ vertex -135.91421356237313 -106.43433599533691 -55.01421356237316
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -135.91421356237313 -106.43433599533691 -55.01421356237316
+ vertex -108.70000000000005 -106.43433599533697 -55.332050807568926
+ vertex -108.28578643762692 -106.43433599533697 -55.01421356237315
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -135.91421356237313 -106.43433599533691 -55.01421356237316
+ vertex -108.28578643762692 -106.43433599533697 -55.01421356237315
+ vertex -136.23205080756892 -106.43433599533697 -54.60000000000007
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -136.23205080756892 -106.43433599533697 -54.60000000000007
+ vertex -108.28578643762692 -106.43433599533697 -55.01421356237315
+ vertex -107.96794919243113 -106.43433599533697 -54.600000000000044
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -136.23205080756892 -106.43433599533697 -54.60000000000007
+ vertex -107.96794919243113 -106.43433599533697 -54.600000000000044
+ vertex -136.4318516525782 -106.43433599533691 -54.117638090205105
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -136.4318516525782 -106.43433599533691 -54.117638090205105
+ vertex -107.96794919243113 -106.43433599533697 -54.600000000000044
+ vertex -107.7681483474219 -106.43433599533697 -54.11763809020509
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -136.4318516525782 -106.43433599533691 -54.117638090205105
+ vertex -107.7681483474219 -106.43433599533697 -54.11763809020509
+ vertex -136.50000000000006 -106.43433599533697 -53.60000000000007
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -136.50000000000006 -106.43433599533697 -53.60000000000007
+ vertex -107.7681483474219 -106.43433599533697 -54.11763809020509
+ vertex -107.70000000000003 -106.43433599533698 -53.60000000000005
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -136.50000000000006 -106.43433599533697 -53.60000000000007
+ vertex -107.70000000000003 -106.43433599533698 -53.60000000000005
+ vertex -136.50000000000006 -106.43433599533697 -51.600000000000065
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -136.50000000000006 -106.43433599533697 -51.600000000000065
+ vertex -107.70000000000003 -106.43433599533698 -53.60000000000005
+ vertex -107.70000000000003 -106.43433599533698 -51.600000000000044
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -136.50000000000006 -106.43433599533697 -51.600000000000065
+ vertex -107.70000000000003 -106.43433599533698 -51.600000000000044
+ vertex -136.4318516525782 -106.43433599533691 -51.08236190979502
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -136.4318516525782 -106.43433599533691 -51.08236190979502
+ vertex -107.70000000000003 -106.43433599533698 -51.600000000000044
+ vertex -107.7681483474219 -106.43433599533697 -51.082361909795
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -136.4318516525782 -106.43433599533691 -51.08236190979502
+ vertex -107.7681483474219 -106.43433599533697 -51.082361909795
+ vertex -136.23205080756892 -106.43433599533697 -50.60000000000005
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -136.23205080756892 -106.43433599533697 -50.60000000000005
+ vertex -107.7681483474219 -106.43433599533697 -51.082361909795
+ vertex -107.96794919243113 -106.43433599533697 -50.60000000000003
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -136.23205080756892 -106.43433599533697 -50.60000000000005
+ vertex -107.96794919243113 -106.43433599533697 -50.60000000000003
+ vertex -135.91421356237313 -106.43433599533694 -50.185786437626966
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -135.91421356237313 -106.43433599533694 -50.185786437626966
+ vertex -107.96794919243113 -106.43433599533697 -50.60000000000003
+ vertex -108.28578643762695 -106.43433599533697 -50.185786437626945
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -135.91421356237313 -106.43433599533694 -50.185786437626966
+ vertex -108.28578643762695 -106.43433599533697 -50.185786437626945
+ vertex -135.50000000000009 -106.43433599533691 -49.86794919243118
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -135.50000000000009 -106.43433599533691 -49.86794919243118
+ vertex -108.28578643762695 -106.43433599533697 -50.185786437626945
+ vertex -108.70000000000005 -106.43433599533697 -49.86794919243116
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -135.50000000000009 -106.43433599533691 -49.86794919243118
+ vertex -108.70000000000005 -106.43433599533697 -49.86794919243116
+ vertex -135.01763809020508 -106.43433599533691 -49.66814834742192
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -135.01763809020508 -106.43433599533691 -49.66814834742192
+ vertex -108.70000000000005 -106.43433599533697 -49.86794919243116
+ vertex -109.18236190979498 -106.43433599533697 -49.6681483474219
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -135.01763809020508 -106.43433599533691 -49.66814834742192
+ vertex -109.18236190979498 -106.43433599533697 -49.6681483474219
+ vertex -134.50000000000006 -106.43433599533694 -49.60000000000006
+ endloop
+endfacet
+facet normal -3.3306690738754686e-16 -1.0 -4.884367980290837e-16
+ outer loop
+ vertex -134.50000000000006 -106.43433599533694 -49.60000000000006
+ vertex -109.18236190979498 -106.43433599533697 -49.6681483474219
+ vertex -109.70000000000003 -106.43433599533697 -49.60000000000003
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -159.68365785199265 -63.71153654742286 -55.531851652578204
+ vertex -147.02483880689013 -41.78581879748475 -55.600000000000065
+ vertex -159.42483880689016 -63.263248811338826 -55.600000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -147.02483880689013 -41.78581879748475 -55.600000000000065
+ vertex -159.68365785199265 -63.71153654742286 -55.531851652578204
+ vertex -146.76601976178762 -41.337531061400725 -55.531851652578204
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -146.76601976178762 -41.337531061400725 -55.531851652578204
+ vertex -159.68365785199265 -63.71153654742286 -55.531851652578204
+ vertex -159.92483880689014 -64.12927421512327 -55.33205080756894
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -146.76601976178762 -41.337531061400725 -55.531851652578204
+ vertex -159.92483880689014 -64.12927421512327 -55.33205080756894
+ vertex -146.52483880689013 -40.91979339370032 -55.33205080756894
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -146.52483880689013 -40.91979339370032 -55.33205080756894
+ vertex -159.92483880689014 -64.12927421512327 -55.33205080756894
+ vertex -160.1319455880767 -64.48799368273042 -55.01421356237316
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -146.52483880689013 -40.91979339370032 -55.33205080756894
+ vertex -160.1319455880767 -64.48799368273042 -55.01421356237316
+ vertex -146.31773202570358 -40.561073926093165 -55.01421356237316
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -146.31773202570358 -40.561073926093165 -55.01421356237316
+ vertex -160.1319455880767 -64.48799368273042 -55.01421356237316
+ vertex -160.29086421067458 -64.76324881133884 -54.60000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -146.31773202570358 -40.561073926093165 -55.01421356237316
+ vertex -160.29086421067458 -64.76324881133884 -54.60000000000006
+ vertex -146.15881340310568 -40.28581879748475 -54.60000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -146.15881340310568 -40.28581879748475 -54.60000000000006
+ vertex -160.29086421067458 -64.76324881133884 -54.60000000000006
+ vertex -160.3907646331792 -64.93628141881446 -54.117638090205105
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -146.15881340310568 -40.28581879748475 -54.60000000000006
+ vertex -160.3907646331792 -64.93628141881446 -54.117638090205105
+ vertex -146.05891298060106 -40.11278619000914 -54.117638090205105
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -146.05891298060106 -40.11278619000914 -54.117638090205105
+ vertex -160.3907646331792 -64.93628141881446 -54.117638090205105
+ vertex -160.42483880689014 -64.99529961890774 -53.60000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -146.05891298060106 -40.11278619000914 -54.117638090205105
+ vertex -160.42483880689014 -64.99529961890774 -53.60000000000006
+ vertex -146.02483880689013 -40.05376798991588 -53.60000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -146.02483880689013 -40.05376798991588 -53.60000000000006
+ vertex -160.42483880689014 -64.99529961890774 -53.60000000000006
+ vertex -160.42483880689014 -64.99529961890774 -51.60000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -146.02483880689013 -40.05376798991588 -53.60000000000006
+ vertex -160.42483880689014 -64.99529961890774 -51.60000000000005
+ vertex -146.02483880689013 -40.05376798991588 -51.60000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -146.02483880689013 -40.05376798991588 -51.60000000000005
+ vertex -160.42483880689014 -64.99529961890774 -51.60000000000005
+ vertex -160.3907646331792 -64.93628141881446 -51.082361909795004
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -146.02483880689013 -40.05376798991588 -51.60000000000005
+ vertex -160.3907646331792 -64.93628141881446 -51.082361909795004
+ vertex -146.05891298060106 -40.112786190009146 -51.082361909795004
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -146.05891298060106 -40.112786190009146 -51.082361909795004
+ vertex -160.3907646331792 -64.93628141881446 -51.082361909795004
+ vertex -160.29086421067458 -64.76324881133884 -50.600000000000044
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -146.05891298060106 -40.112786190009146 -51.082361909795004
+ vertex -160.29086421067458 -64.76324881133884 -50.600000000000044
+ vertex -146.15881340310568 -40.28581879748475 -50.600000000000044
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -146.15881340310568 -40.28581879748475 -50.600000000000044
+ vertex -160.29086421067458 -64.76324881133884 -50.600000000000044
+ vertex -160.1319455880767 -64.48799368273043 -50.18578643762695
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -146.15881340310568 -40.28581879748475 -50.600000000000044
+ vertex -160.1319455880767 -64.48799368273043 -50.18578643762695
+ vertex -146.31773202570358 -40.561073926093165 -50.18578643762695
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -146.31773202570358 -40.561073926093165 -50.18578643762695
+ vertex -160.1319455880767 -64.48799368273043 -50.18578643762695
+ vertex -159.92483880689014 -64.12927421512329 -49.867949192431176
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -146.31773202570358 -40.561073926093165 -50.18578643762695
+ vertex -159.92483880689014 -64.12927421512329 -49.867949192431176
+ vertex -146.52483880689013 -40.91979339370032 -49.867949192431176
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -146.52483880689013 -40.91979339370032 -49.867949192431176
+ vertex -159.92483880689014 -64.12927421512329 -49.867949192431176
+ vertex -159.68365785199265 -63.71153654742286 -49.668148347421905
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -146.52483880689013 -40.91979339370032 -49.867949192431176
+ vertex -159.68365785199265 -63.71153654742286 -49.668148347421905
+ vertex -146.76601976178762 -41.337531061400725 -49.668148347421905
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -146.76601976178762 -41.337531061400725 -49.668148347421905
+ vertex -159.68365785199265 -63.71153654742286 -49.668148347421905
+ vertex -159.42483880689016 -63.263248811338826 -49.600000000000044
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -1.2429902774456645e-16
+ outer loop
+ vertex -146.76601976178762 -41.337531061400725 -49.668148347421905
+ vertex -159.42483880689016 -63.263248811338826 -49.600000000000044
+ vertex -147.02483880689013 -41.78581879748475 -49.600000000000044
+ endloop
+endfacet
+facet normal -4.548333036367583e-16 -4.884367980290836e-16 1.0
+ outer loop
+ vertex -134.5 -104.4343359953371 -10.00000000000005
+ vertex -109.70000000000007 -106.43433599533701 -10.000000000000037
+ vertex -109.7 -104.43433599533714 -10.000000000000037
+ endloop
+endfacet
+facet normal -4.548333036367583e-16 -4.884367980290836e-16 1.0
+ outer loop
+ vertex -109.70000000000007 -106.43433599533701 -10.000000000000037
+ vertex -134.5 -104.4343359953371 -10.00000000000005
+ vertex -134.50000000000006 -106.43433599533697 -10.00000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -159.68365785199268 -63.71153654742285 -15.931851652578198
+ vertex -147.02483880689016 -41.78581879748475 -16.00000000000006
+ vertex -159.42483880689016 -63.263248811338826 -16.00000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -147.02483880689016 -41.78581879748475 -16.00000000000006
+ vertex -159.68365785199268 -63.71153654742285 -15.931851652578198
+ vertex -146.76601976178765 -41.337531061400725 -15.931851652578198
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -146.76601976178765 -41.337531061400725 -15.931851652578198
+ vertex -159.68365785199268 -63.71153654742285 -15.931851652578198
+ vertex -159.92483880689014 -64.12927421512326 -15.732050807568937
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -146.76601976178765 -41.337531061400725 -15.931851652578198
+ vertex -159.92483880689014 -64.12927421512326 -15.732050807568937
+ vertex -146.52483880689016 -40.91979339370032 -15.732050807568937
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -146.52483880689016 -40.91979339370032 -15.732050807568937
+ vertex -159.92483880689014 -64.12927421512326 -15.732050807568937
+ vertex -160.1319455880767 -64.48799368273042 -15.414213562373153
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -146.52483880689016 -40.91979339370032 -15.732050807568937
+ vertex -160.1319455880767 -64.48799368273042 -15.414213562373153
+ vertex -146.3177320257036 -40.56107392609316 -15.414213562373153
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -146.3177320257036 -40.56107392609316 -15.414213562373153
+ vertex -160.1319455880767 -64.48799368273042 -15.414213562373153
+ vertex -160.2908642106746 -64.76324881133883 -15.000000000000057
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -146.3177320257036 -40.56107392609316 -15.414213562373153
+ vertex -160.2908642106746 -64.76324881133883 -15.000000000000057
+ vertex -146.15881340310568 -40.28581879748475 -15.000000000000057
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -146.15881340310568 -40.28581879748475 -15.000000000000057
+ vertex -160.2908642106746 -64.76324881133883 -15.000000000000057
+ vertex -160.39076463317923 -64.93628141881445 -14.517638090205098
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -146.15881340310568 -40.28581879748475 -15.000000000000057
+ vertex -160.39076463317923 -64.93628141881445 -14.517638090205098
+ vertex -146.0589129806011 -40.11278619000914 -14.517638090205098
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -146.0589129806011 -40.11278619000914 -14.517638090205098
+ vertex -160.39076463317923 -64.93628141881445 -14.517638090205098
+ vertex -160.42483880689014 -64.99529961890771 -14.000000000000059
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -146.0589129806011 -40.11278619000914 -14.517638090205098
+ vertex -160.42483880689014 -64.99529961890771 -14.000000000000059
+ vertex -146.02483880689016 -40.053767989915876 -14.000000000000059
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -146.02483880689016 -40.053767989915876 -14.000000000000059
+ vertex -160.42483880689014 -64.99529961890771 -14.000000000000059
+ vertex -160.42483880689014 -64.99529961890771 -12.000000000000046
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -146.02483880689016 -40.053767989915876 -14.000000000000059
+ vertex -160.42483880689014 -64.99529961890771 -12.000000000000046
+ vertex -146.02483880689016 -40.053767989915876 -12.000000000000046
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -146.02483880689016 -40.053767989915876 -12.000000000000046
+ vertex -160.42483880689014 -64.99529961890771 -12.000000000000046
+ vertex -160.39076463317923 -64.93628141881445 -11.482361909795012
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -146.02483880689016 -40.053767989915876 -12.000000000000046
+ vertex -160.39076463317923 -64.93628141881445 -11.482361909795012
+ vertex -146.05891298060106 -40.11278619000914 -11.482361909795012
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -146.05891298060106 -40.11278619000914 -11.482361909795012
+ vertex -160.39076463317923 -64.93628141881445 -11.482361909795012
+ vertex -160.2908642106746 -64.76324881133883 -11.000000000000048
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -146.05891298060106 -40.11278619000914 -11.482361909795012
+ vertex -160.2908642106746 -64.76324881133883 -11.000000000000048
+ vertex -146.15881340310568 -40.28581879748475 -11.000000000000048
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -146.15881340310568 -40.28581879748475 -11.000000000000048
+ vertex -160.2908642106746 -64.76324881133883 -11.000000000000048
+ vertex -160.13194558807672 -64.48799368273043 -10.58578643762696
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -146.15881340310568 -40.28581879748475 -11.000000000000048
+ vertex -160.13194558807672 -64.48799368273043 -10.58578643762696
+ vertex -146.3177320257036 -40.56107392609316 -10.58578643762696
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -146.3177320257036 -40.56107392609316 -10.58578643762696
+ vertex -160.13194558807672 -64.48799368273043 -10.58578643762696
+ vertex -159.92483880689016 -64.12927421512327 -10.267949192431178
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -146.3177320257036 -40.56107392609316 -10.58578643762696
+ vertex -159.92483880689016 -64.12927421512327 -10.267949192431178
+ vertex -146.52483880689016 -40.91979339370032 -10.267949192431178
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -146.52483880689016 -40.91979339370032 -10.267949192431178
+ vertex -159.92483880689016 -64.12927421512327 -10.267949192431178
+ vertex -159.68365785199268 -63.71153654742285 -10.068148347421912
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -146.52483880689016 -40.91979339370032 -10.267949192431178
+ vertex -159.68365785199268 -63.71153654742285 -10.068148347421912
+ vertex -146.76601976178765 -41.337531061400725 -10.068148347421912
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -146.76601976178765 -41.337531061400725 -10.068148347421912
+ vertex -159.68365785199268 -63.71153654742285 -10.068148347421912
+ vertex -159.42483880689016 -63.263248811338826 -10.00000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844386 0.5000000000000002 -2.013447875437003e-16
+ outer loop
+ vertex -146.76601976178765 -41.337531061400725 -10.068148347421912
+ vertex -159.42483880689016 -63.263248811338826 -10.00000000000005
+ vertex -147.02483880689016 -41.78581879748475 -10.00000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112884 -2.775557561562892e-16 -0.3826834323650861
+ outer loop
+ vertex -107.76814834742186 -104.43433599533716 -14.517638090205088
+ vertex -107.96794919243118 -106.43433599533701 -15.000000000000046
+ vertex -107.9679491924311 -104.43433599533714 -15.000000000000046
+ endloop
+endfacet
+facet normal 0.9238795325112884 -2.775557561562892e-16 -0.3826834323650861
+ outer loop
+ vertex -107.96794919243118 -106.43433599533701 -15.000000000000046
+ vertex -107.76814834742186 -104.43433599533716 -14.517638090205088
+ vertex -107.76814834742193 -106.43433599533701 -14.517638090205088
+ endloop
+endfacet
+facet normal -0.13052619222005338 5.481726184086709e-16 -0.9914448613738102
+ outer loop
+ vertex -134.50000000000006 -106.43433599533697 -16.000000000000068
+ vertex -135.01763809020505 -104.43433599533714 -15.931851652578203
+ vertex -134.5 -104.4343359953371 -16.000000000000068
+ endloop
+endfacet
+facet normal -0.13052619222005338 5.481726184086709e-16 -0.9914448613738102
+ outer loop
+ vertex -135.01763809020505 -104.43433599533714 -15.931851652578203
+ vertex -134.50000000000006 -106.43433599533697 -16.000000000000068
+ vertex -135.0176380902051 -106.43433599533698 -15.931851652578203
+ endloop
+endfacet
+facet normal -0.3826834323650754 -1.9428902930940227e-16 0.9238795325112927
+ outer loop
+ vertex -135.50000000000003 -104.43433599533714 -10.267949192431178
+ vertex -135.0176380902051 -106.43433599533698 -10.068148347421925
+ vertex -135.01763809020505 -104.43433599533714 -10.068148347421925
+ endloop
+endfacet
+facet normal -0.3826834323650754 -1.9428902930940227e-16 0.9238795325112927
+ outer loop
+ vertex -135.0176380902051 -106.43433599533698 -10.068148347421925
+ vertex -135.50000000000003 -104.43433599533714 -10.267949192431178
+ vertex -135.50000000000009 -106.43433599533698 -10.267949192431178
+ endloop
+endfacet
+facet normal -0.7933533402912271 7.771561172376095e-16 -0.6087614290087314
+ outer loop
+ vertex -135.9142135623731 -104.4343359953371 -15.414213562373158
+ vertex -136.23205080756895 -106.43433599533697 -15.000000000000062
+ vertex -136.23205080756892 -104.43433599533712 -15.000000000000062
+ endloop
+endfacet
+facet normal -0.7933533402912271 7.771561172376095e-16 -0.6087614290087314
+ outer loop
+ vertex -136.23205080756895 -106.43433599533697 -15.000000000000062
+ vertex -135.9142135623731 -104.4343359953371 -15.414213562373158
+ vertex -135.9142135623732 -106.43433599533697 -15.414213562373158
+ endloop
+endfacet
+facet normal 6.822499554551369e-16 4.884367980290835e-16 -1.0
+ outer loop
+ vertex -109.70000000000005 -106.43433599533701 -16.00000000000005
+ vertex -134.5 -104.4343359953371 -16.000000000000068
+ vertex -109.7 -104.43433599533714 -16.00000000000005
+ endloop
+endfacet
+facet normal 6.822499554551369e-16 4.884367980290835e-16 -1.0
+ outer loop
+ vertex -134.5 -104.4343359953371 -16.000000000000068
+ vertex -109.70000000000005 -106.43433599533701 -16.00000000000005
+ vertex -134.50000000000006 -106.43433599533697 -16.000000000000068
+ endloop
+endfacet
+facet normal 0.9238795325112942 -7.771561172376093e-16 0.38268343236507185
+ outer loop
+ vertex -107.96794919243118 -106.43433599533701 -11.000000000000036
+ vertex -107.76814834742186 -104.43433599533714 -11.482361909795
+ vertex -107.9679491924311 -104.43433599533714 -11.000000000000036
+ endloop
+endfacet
+facet normal 0.9238795325112942 -7.771561172376093e-16 0.38268343236507185
+ outer loop
+ vertex -107.76814834742186 -104.43433599533714 -11.482361909795
+ vertex -107.96794919243118 -106.43433599533701 -11.000000000000036
+ vertex -107.76814834742193 -106.43433599533701 -11.482361909795
+ endloop
+endfacet
+facet normal 0.9914448613738122 -4.996003610813203e-16 -0.13052619222003797
+ outer loop
+ vertex -107.7 -104.43433599533714 -14.000000000000048
+ vertex -107.76814834742193 -106.43433599533701 -14.517638090205088
+ vertex -107.76814834742186 -104.43433599533716 -14.517638090205088
+ endloop
+endfacet
+facet normal 0.9914448613738122 -4.996003610813203e-16 -0.13052619222003797
+ outer loop
+ vertex -107.76814834742193 -106.43433599533701 -14.517638090205088
+ vertex -107.7 -104.43433599533714 -14.000000000000048
+ vertex -107.70000000000007 -106.43433599533701 -14.000000000000048
+ endloop
+endfacet
+facet normal 0.7933533402912275 -7.771561172376095e-16 0.6087614290087308
+ outer loop
+ vertex -108.28578643762697 -106.43433599533701 -10.585786437626947
+ vertex -107.9679491924311 -104.43433599533714 -11.000000000000036
+ vertex -108.2857864376269 -104.43433599533714 -10.585786437626947
+ endloop
+endfacet
+facet normal 0.7933533402912275 -7.771561172376095e-16 0.6087614290087308
+ outer loop
+ vertex -107.9679491924311 -104.43433599533714 -11.000000000000036
+ vertex -108.28578643762697 -106.43433599533701 -10.585786437626947
+ vertex -107.96794919243118 -106.43433599533701 -11.000000000000036
+ endloop
+endfacet
+facet normal 0.6087614290087124 -7.771561172376095e-16 0.7933533402912416
+ outer loop
+ vertex -108.7 -104.43433599533714 -10.267949192431168
+ vertex -108.28578643762697 -106.43433599533701 -10.585786437626947
+ vertex -108.2857864376269 -104.43433599533714 -10.585786437626947
+ endloop
+endfacet
+facet normal 0.6087614290087124 -7.771561172376095e-16 0.7933533402912416
+ outer loop
+ vertex -108.28578643762697 -106.43433599533701 -10.585786437626947
+ vertex -108.7 -104.43433599533714 -10.267949192431168
+ vertex -108.70000000000007 -106.43433599533701 -10.267949192431168
+ endloop
+endfacet
+facet normal -0.38268343236509783 6.661338147750938e-16 -0.9238795325112834
+ outer loop
+ vertex -135.0176380902051 -106.43433599533698 -15.931851652578203
+ vertex -135.5 -104.43433599533714 -15.732050807568942
+ vertex -135.01763809020505 -104.43433599533714 -15.931851652578203
+ endloop
+endfacet
+facet normal -0.38268343236509783 6.661338147750938e-16 -0.9238795325112834
+ outer loop
+ vertex -135.5 -104.43433599533714 -15.732050807568942
+ vertex -135.0176380902051 -106.43433599533698 -15.931851652578203
+ vertex -135.50000000000006 -106.43433599533697 -15.732050807568942
+ endloop
+endfacet
+facet normal 0.3826834323651082 -6.661338147750938e-16 0.9238795325112792
+ outer loop
+ vertex -109.18236190979493 -104.43433599533714 -10.068148347421902
+ vertex -108.70000000000007 -106.43433599533701 -10.267949192431168
+ vertex -108.7 -104.43433599533714 -10.267949192431168
+ endloop
+endfacet
+facet normal 0.3826834323651082 -6.661338147750938e-16 0.9238795325112792
+ outer loop
+ vertex -108.70000000000007 -106.43433599533701 -10.267949192431168
+ vertex -109.18236190979493 -104.43433599533714 -10.068148347421902
+ vertex -109.18236190979502 -106.43433599533701 -10.068148347421902
+ endloop
+endfacet
+facet normal 0.13052619222005019 -5.481726184086709e-16 0.9914448613738106
+ outer loop
+ vertex -109.7 -104.43433599533714 -10.000000000000037
+ vertex -109.18236190979502 -106.43433599533701 -10.068148347421902
+ vertex -109.18236190979493 -104.43433599533714 -10.068148347421902
+ endloop
+endfacet
+facet normal 0.13052619222005019 -5.481726184086709e-16 0.9914448613738106
+ outer loop
+ vertex -109.18236190979502 -106.43433599533701 -10.068148347421902
+ vertex -109.7 -104.43433599533714 -10.000000000000037
+ vertex -109.70000000000007 -106.43433599533701 -10.000000000000037
+ endloop
+endfacet
+facet normal 0.38268343236509894 1.9428902930940227e-16 -0.9238795325112831
+ outer loop
+ vertex -108.70000000000007 -106.43433599533701 -15.732050807568926
+ vertex -109.18236190979493 -104.43433599533714 -15.931851652578185
+ vertex -108.7 -104.43433599533714 -15.732050807568926
+ endloop
+endfacet
+facet normal 0.38268343236509894 1.9428902930940227e-16 -0.9238795325112831
+ outer loop
+ vertex -109.18236190979493 -104.43433599533714 -15.931851652578185
+ vertex -108.70000000000007 -106.43433599533701 -15.732050807568926
+ vertex -109.18236190979502 -106.43433599533701 -15.931851652578185
+ endloop
+endfacet
+facet normal 1.0 -5.551115123125781e-16 -5.933957380480175e-32
+ outer loop
+ vertex -107.70000000000007 -106.43433599533701 -12.000000000000034
+ vertex -107.7 -104.43433599533714 -14.000000000000048
+ vertex -107.7 -104.43433599533714 -12.000000000000034
+ endloop
+endfacet
+facet normal 1.0 -5.551115123125781e-16 -5.933957380480175e-32
+ outer loop
+ vertex -107.7 -104.43433599533714 -14.000000000000048
+ vertex -107.70000000000007 -106.43433599533701 -12.000000000000034
+ vertex -107.70000000000007 -106.43433599533701 -14.000000000000048
+ endloop
+endfacet
+facet normal -0.7933533402912331 2.2204460492503136e-16 0.6087614290087234
+ outer loop
+ vertex -136.23205080756895 -106.43433599533697 -11.000000000000048
+ vertex -135.91421356237313 -104.43433599533712 -10.58578643762697
+ vertex -136.23205080756892 -104.43433599533712 -11.000000000000048
+ endloop
+endfacet
+facet normal -0.7933533402912331 2.2204460492503136e-16 0.6087614290087234
+ outer loop
+ vertex -135.91421356237313 -104.43433599533712 -10.58578643762697
+ vertex -136.23205080756895 -106.43433599533697 -11.000000000000048
+ vertex -135.9142135623732 -106.43433599533697 -10.58578643762697
+ endloop
+endfacet
+facet normal 0.6087614290087191 -1.1260555418304602e-31 -0.7933533402912364
+ outer loop
+ vertex -108.28578643762695 -106.43433599533701 -15.41421356237314
+ vertex -108.7 -104.43433599533714 -15.732050807568926
+ vertex -108.2857864376269 -104.43433599533714 -15.41421356237314
+ endloop
+endfacet
+facet normal 0.6087614290087191 -1.1260555418304602e-31 -0.7933533402912364
+ outer loop
+ vertex -108.7 -104.43433599533714 -15.732050807568926
+ vertex -108.28578643762695 -106.43433599533701 -15.41421356237314
+ vertex -108.70000000000007 -106.43433599533701 -15.732050807568926
+ endloop
+endfacet
+facet normal -0.6087614290087109 1.1260555418304691e-31 0.7933533402912427
+ outer loop
+ vertex -135.91421356237313 -104.43433599533712 -10.58578643762697
+ vertex -135.50000000000009 -106.43433599533698 -10.267949192431178
+ vertex -135.50000000000003 -104.43433599533714 -10.267949192431178
+ endloop
+endfacet
+facet normal -0.6087614290087109 1.1260555418304691e-31 0.7933533402912427
+ outer loop
+ vertex -135.50000000000009 -106.43433599533698 -10.267949192431178
+ vertex -135.91421356237313 -104.43433599533712 -10.58578643762697
+ vertex -135.9142135623732 -106.43433599533697 -10.58578643762697
+ endloop
+endfacet
+facet normal -0.9238795325113018 3.33066907387547e-16 0.3826834323650538
+ outer loop
+ vertex -136.43185165257822 -106.43433599533698 -11.482361909795022
+ vertex -136.23205080756892 -104.43433599533712 -11.000000000000048
+ vertex -136.43185165257813 -104.43433599533714 -11.482361909795022
+ endloop
+endfacet
+facet normal -0.9238795325113018 3.33066907387547e-16 0.3826834323650538
+ outer loop
+ vertex -136.23205080756892 -104.43433599533712 -11.000000000000048
+ vertex -136.43185165257822 -106.43433599533698 -11.482361909795022
+ vertex -136.23205080756895 -106.43433599533697 -11.000000000000048
+ endloop
+endfacet
+facet normal -0.9238795325112971 7.216449660063517e-16 -0.38268343236506525
+ outer loop
+ vertex -136.23205080756892 -104.43433599533712 -15.000000000000062
+ vertex -136.43185165257822 -106.43433599533698 -14.517638090205104
+ vertex -136.43185165257813 -104.43433599533714 -14.517638090205104
+ endloop
+endfacet
+facet normal -0.9238795325112971 7.216449660063517e-16 -0.38268343236506525
+ outer loop
+ vertex -136.43185165257822 -106.43433599533698 -14.517638090205104
+ vertex -136.23205080756892 -104.43433599533712 -15.000000000000062
+ vertex -136.23205080756895 -106.43433599533697 -15.000000000000062
+ endloop
+endfacet
+facet normal -0.9914448613738078 6.661338147750936e-16 -0.13052619222007122
+ outer loop
+ vertex -136.43185165257813 -104.43433599533714 -14.517638090205104
+ vertex -136.50000000000009 -106.43433599533697 -14.000000000000064
+ vertex -136.50000000000003 -104.43433599533712 -14.000000000000064
+ endloop
+endfacet
+facet normal -0.9914448613738078 6.661338147750936e-16 -0.13052619222007122
+ outer loop
+ vertex -136.50000000000009 -106.43433599533697 -14.000000000000064
+ vertex -136.43185165257813 -104.43433599533714 -14.517638090205104
+ vertex -136.43185165257822 -106.43433599533698 -14.517638090205104
+ endloop
+endfacet
+facet normal 0.9914448613738107 -6.661338147750937e-16 0.13052619222005
+ outer loop
+ vertex -107.76814834742193 -106.43433599533701 -11.482361909795
+ vertex -107.7 -104.43433599533714 -12.000000000000034
+ vertex -107.76814834742186 -104.43433599533714 -11.482361909795
+ endloop
+endfacet
+facet normal 0.9914448613738107 -6.661338147750937e-16 0.13052619222005
+ outer loop
+ vertex -107.7 -104.43433599533714 -12.000000000000034
+ vertex -107.76814834742193 -106.43433599533701 -11.482361909795
+ vertex -107.70000000000007 -106.43433599533701 -12.000000000000034
+ endloop
+endfacet
+facet normal 0.7933533402912359 -1.6653345369377353e-16 -0.6087614290087195
+ outer loop
+ vertex -107.9679491924311 -104.43433599533714 -15.000000000000046
+ vertex -108.28578643762695 -106.43433599533701 -15.41421356237314
+ vertex -108.2857864376269 -104.43433599533714 -15.41421356237314
+ endloop
+endfacet
+facet normal 0.7933533402912359 -1.6653345369377353e-16 -0.6087614290087195
+ outer loop
+ vertex -108.28578643762695 -106.43433599533701 -15.41421356237314
+ vertex -107.9679491924311 -104.43433599533714 -15.000000000000046
+ vertex -107.96794919243118 -106.43433599533701 -15.000000000000046
+ endloop
+endfacet
+facet normal -0.6087614290087041 7.771561172376093e-16 -0.7933533402912477
+ outer loop
+ vertex -135.50000000000006 -106.43433599533697 -15.732050807568942
+ vertex -135.9142135623731 -104.4343359953371 -15.414213562373158
+ vertex -135.5 -104.43433599533714 -15.732050807568942
+ endloop
+endfacet
+facet normal -0.6087614290087041 7.771561172376093e-16 -0.7933533402912477
+ outer loop
+ vertex -135.9142135623731 -104.4343359953371 -15.414213562373158
+ vertex -135.50000000000006 -106.43433599533697 -15.732050807568942
+ vertex -135.9142135623732 -106.43433599533697 -15.414213562373158
+ endloop
+endfacet
+facet normal 0.13052619222005016 4.024558464266191e-16 -0.9914448613738106
+ outer loop
+ vertex -109.18236190979502 -106.43433599533701 -15.931851652578185
+ vertex -109.7 -104.43433599533714 -16.00000000000005
+ vertex -109.18236190979493 -104.43433599533714 -15.931851652578185
+ endloop
+endfacet
+facet normal 0.13052619222005016 4.024558464266191e-16 -0.9914448613738106
+ outer loop
+ vertex -109.7 -104.43433599533714 -16.00000000000005
+ vertex -109.18236190979502 -106.43433599533701 -15.931851652578185
+ vertex -109.70000000000005 -106.43433599533701 -16.00000000000005
+ endloop
+endfacet
+facet normal -0.1305261922200746 -4.024558464266191e-16 0.9914448613738074
+ outer loop
+ vertex -135.01763809020505 -104.43433599533714 -10.068148347421925
+ vertex -134.50000000000006 -106.43433599533697 -10.00000000000005
+ vertex -134.5 -104.4343359953371 -10.00000000000005
+ endloop
+endfacet
+facet normal -0.1305261922200746 -4.024558464266191e-16 0.9914448613738074
+ outer loop
+ vertex -134.50000000000006 -106.43433599533697 -10.00000000000005
+ vertex -135.01763809020505 -104.43433599533714 -10.068148347421925
+ vertex -135.0176380902051 -106.43433599533698 -10.068148347421925
+ endloop
+endfacet
+facet normal -1.0 5.551115123125781e-16 5.933957380480175e-32
+ outer loop
+ vertex -136.50000000000009 -106.43433599533697 -14.000000000000064
+ vertex -136.50000000000003 -104.43433599533712 -12.000000000000052
+ vertex -136.50000000000003 -104.43433599533712 -14.000000000000064
+ endloop
+endfacet
+facet normal -1.0 5.551115123125781e-16 5.933957380480175e-32
+ outer loop
+ vertex -136.50000000000003 -104.43433599533712 -12.000000000000052
+ vertex -136.50000000000009 -106.43433599533697 -14.000000000000064
+ vertex -136.50000000000009 -106.43433599533697 -12.000000000000052
+ endloop
+endfacet
+facet normal -0.9914448613738076 4.996003610813203e-16 0.1305261922200726
+ outer loop
+ vertex -136.50000000000009 -106.43433599533697 -12.000000000000052
+ vertex -136.43185165257813 -104.43433599533714 -11.482361909795022
+ vertex -136.50000000000003 -104.43433599533712 -12.000000000000052
+ endloop
+endfacet
+facet normal -0.9914448613738076 4.996003610813203e-16 0.1305261922200726
+ outer loop
+ vertex -136.43185165257813 -104.43433599533714 -11.482361909795022
+ vertex -136.50000000000009 -106.43433599533697 -12.000000000000052
+ vertex -136.43185165257822 -106.43433599533698 -11.482361909795022
+ endloop
+endfacet
+facet normal -0.39667667014561114 -0.6870641468694494 0.6087614290087259
+ outer loop
+ vertex -160.29086421067458 -64.76324881133884 -50.600000000000044
+ vertex -158.39989478050782 -65.4879936827304 -50.18578643762695
+ vertex -160.1319455880767 -64.48799368273043 -50.18578643762695
+ endloop
+endfacet
+facet normal -0.39667667014561114 -0.6870641468694494 0.6087614290087259
+ outer loop
+ vertex -158.39989478050782 -65.4879936827304 -50.18578643762695
+ vertex -160.29086421067458 -64.76324881133884 -50.600000000000044
+ vertex -158.55881340310572 -65.76324881133884 -50.600000000000044
+ endloop
+endfacet
+facet normal -0.49999999999998573 -0.866025403784447 1.5259013723954617e-31
+ outer loop
+ vertex -158.69278799932127 -65.9952996189077 -53.60000000000006
+ vertex -160.42483880689014 -64.99529961890774 -51.60000000000005
+ vertex -160.42483880689014 -64.99529961890774 -53.60000000000006
+ endloop
+endfacet
+facet normal -0.49999999999998573 -0.866025403784447 1.5259013723954617e-31
+ outer loop
+ vertex -160.42483880689014 -64.99529961890774 -51.60000000000005
+ vertex -158.69278799932127 -65.9952996189077 -53.60000000000006
+ vertex -158.69278799932127 -65.9952996189077 -51.60000000000005
+ endloop
+endfacet
+facet normal -0.06526309611002494 -0.11303899832181426 0.9914448613738107
+ outer loop
+ vertex -159.42483880689016 -63.263248811338826 -49.600000000000044
+ vertex -157.9516070444238 -64.71153654742285 -49.668148347421905
+ vertex -157.6927879993213 -64.26324881133883 -49.600000000000044
+ endloop
+endfacet
+facet normal -0.06526309611002494 -0.11303899832181426 0.9914448613738107
+ outer loop
+ vertex -157.9516070444238 -64.71153654742285 -49.668148347421905
+ vertex -159.42483880689016 -63.263248811338826 -49.600000000000044
+ vertex -159.68365785199265 -63.71153654742286 -49.668148347421905
+ endloop
+endfacet
+facet normal -0.46193976625564737 -0.8001031451912702 -0.38268343236507574
+ outer loop
+ vertex -158.55881340310572 -65.76324881133884 -54.60000000000006
+ vertex -160.3907646331792 -64.93628141881446 -54.117638090205105
+ vertex -160.29086421067458 -64.76324881133884 -54.60000000000006
+ endloop
+endfacet
+facet normal -0.46193976625564737 -0.8001031451912702 -0.38268343236507574
+ outer loop
+ vertex -160.3907646331792 -64.93628141881446 -54.117638090205105
+ vertex -158.55881340310572 -65.76324881133884 -54.60000000000006
+ vertex -158.65871382561033 -65.93628141881445 -54.117638090205105
+ endloop
+endfacet
+facet normal -0.46193976625564803 -0.8001031451912715 0.3826834323650719
+ outer loop
+ vertex -160.3907646331792 -64.93628141881446 -51.082361909795004
+ vertex -158.55881340310572 -65.76324881133884 -50.600000000000044
+ vertex -160.29086421067458 -64.76324881133884 -50.600000000000044
+ endloop
+endfacet
+facet normal -0.46193976625564803 -0.8001031451912715 0.3826834323650719
+ outer loop
+ vertex -158.55881340310572 -65.76324881133884 -50.600000000000044
+ vertex -160.3907646331792 -64.93628141881446 -51.082361909795004
+ vertex -158.65871382561033 -65.93628141881445 -51.082361909795004
+ endloop
+endfacet
+facet normal -0.4957224306868973 -0.8586164364012647 0.1305261922200579
+ outer loop
+ vertex -160.42483880689014 -64.99529961890774 -51.60000000000005
+ vertex -158.65871382561033 -65.93628141881445 -51.082361909795004
+ vertex -160.3907646331792 -64.93628141881446 -51.082361909795004
+ endloop
+endfacet
+facet normal -0.4957224306868973 -0.8586164364012647 0.1305261922200579
+ outer loop
+ vertex -158.65871382561033 -65.93628141881445 -51.082361909795004
+ vertex -160.42483880689014 -64.99529961890774 -51.60000000000005
+ vertex -158.69278799932127 -65.9952996189077 -51.60000000000005
+ endloop
+endfacet
+facet normal -0.06526309611002495 -0.11303899832181433 -0.9914448613738107
+ outer loop
+ vertex -157.9516070444238 -64.71153654742285 -55.531851652578204
+ vertex -159.42483880689016 -63.263248811338826 -55.600000000000065
+ vertex -157.6927879993213 -64.26324881133883 -55.600000000000065
+ endloop
+endfacet
+facet normal -0.06526309611002495 -0.11303899832181433 -0.9914448613738107
+ outer loop
+ vertex -159.42483880689016 -63.263248811338826 -55.600000000000065
+ vertex -157.9516070444238 -64.71153654742285 -55.531851652578204
+ vertex -159.68365785199265 -63.71153654742286 -55.531851652578204
+ endloop
+endfacet
+facet normal -0.30438071450435783 -0.5272028623656784 0.7933533402912303
+ outer loop
+ vertex -159.92483880689014 -64.12927421512329 -49.867949192431176
+ vertex -158.39989478050782 -65.4879936827304 -50.18578643762695
+ vertex -158.19278799932127 -65.1292742151233 -49.867949192431176
+ endloop
+endfacet
+facet normal -0.30438071450435783 -0.5272028623656784 0.7933533402912303
+ outer loop
+ vertex -158.39989478050782 -65.4879936827304 -50.18578643762695
+ vertex -159.92483880689014 -64.12927421512329 -49.867949192431176
+ vertex -160.1319455880767 -64.48799368273043 -50.18578643762695
+ endloop
+endfacet
+facet normal 0.0652630961100257 0.1130389983218156 -0.9914448613738105
+ outer loop
+ vertex -145.2927879993213 -42.785818797484744 -16.00000000000006
+ vertex -146.76601976178765 -41.337531061400725 -15.931851652578198
+ vertex -145.03396895421878 -42.33753106140071 -15.931851652578198
+ endloop
+endfacet
+facet normal 0.0652630961100257 0.1130389983218156 -0.9914448613738105
+ outer loop
+ vertex -146.76601976178765 -41.337531061400725 -15.931851652578198
+ vertex -145.2927879993213 -42.785818797484744 -16.00000000000006
+ vertex -147.02483880689016 -41.78581879748475 -16.00000000000006
+ endloop
+endfacet
+facet normal 0.30438071450435905 0.5272028623656683 -0.7933533402912365
+ outer loop
+ vertex -144.7927879993213 -41.91979339370032 -15.732050807568937
+ vertex -146.3177320257036 -40.56107392609316 -15.414213562373153
+ vertex -144.58568121813474 -41.56107392609316 -15.414213562373153
+ endloop
+endfacet
+facet normal 0.30438071450435905 0.5272028623656683 -0.7933533402912365
+ outer loop
+ vertex -146.3177320257036 -40.56107392609316 -15.414213562373153
+ vertex -144.7927879993213 -41.91979339370032 -15.732050807568937
+ vertex -146.52483880689016 -40.91979339370032 -15.732050807568937
+ endloop
+endfacet
+facet normal -0.4957224306869059 -0.8586164364012638 -0.13052619222003028
+ outer loop
+ vertex -158.65871382561036 -65.93628141881446 -14.517638090205098
+ vertex -160.42483880689014 -64.99529961890771 -14.000000000000059
+ vertex -160.39076463317923 -64.93628141881445 -14.517638090205098
+ endloop
+endfacet
+facet normal -0.4957224306869059 -0.8586164364012638 -0.13052619222003028
+ outer loop
+ vertex -160.42483880689014 -64.99529961890771 -14.000000000000059
+ vertex -158.65871382561036 -65.93628141881446 -14.517638090205098
+ vertex -158.69278799932127 -65.9952996189077 -14.000000000000059
+ endloop
+endfacet
+facet normal 5.933957380480184e-32 1.4193619471206742e-31 1.0
+ outer loop
+ vertex -147.02483880689016 -41.78581879748475 -10.00000000000005
+ vertex -157.6927879993213 -64.26324881133883 -10.00000000000005
+ vertex -145.2927879993213 -42.785818797484744 -10.00000000000005
+ endloop
+endfacet
+facet normal 5.933957380480184e-32 1.4193619471206742e-31 1.0
+ outer loop
+ vertex -157.6927879993213 -64.26324881133883 -10.00000000000005
+ vertex -147.02483880689016 -41.78581879748475 -10.00000000000005
+ vertex -159.42483880689016 -63.263248811338826 -10.00000000000005
+ endloop
+endfacet
+facet normal 0.46193976625564875 0.8001031451912675 0.3826834323650799
+ outer loop
+ vertex -146.15881340310568 -40.28581879748475 -11.000000000000048
+ vertex -144.3268621730322 -41.112786190009146 -11.482361909795012
+ vertex -146.05891298060106 -40.11278619000914 -11.482361909795012
+ endloop
+endfacet
+facet normal 0.46193976625564875 0.8001031451912675 0.3826834323650799
+ outer loop
+ vertex -144.3268621730322 -41.112786190009146 -11.482361909795012
+ vertex -146.15881340310568 -40.28581879748475 -11.000000000000048
+ vertex -144.42676259553681 -41.28581879748476 -11.000000000000048
+ endloop
+endfacet
+facet normal 0.4999999999999989 0.8660254037844393 -1.5259013723954584e-31
+ outer loop
+ vertex -144.2927879993213 -41.05376798991587 -12.000000000000046
+ vertex -146.02483880689016 -40.053767989915876 -14.000000000000059
+ vertex -146.02483880689016 -40.053767989915876 -12.000000000000046
+ endloop
+endfacet
+facet normal 0.4999999999999989 0.8660254037844393 -1.5259013723954584e-31
+ outer loop
+ vertex -146.02483880689016 -40.053767989915876 -14.000000000000059
+ vertex -144.2927879993213 -41.05376798991587 -12.000000000000046
+ vertex -144.2927879993213 -41.05376798991587 -14.000000000000059
+ endloop
+endfacet
+facet normal 0.19134171618254736 0.3314135740355969 -0.9238795325112844
+ outer loop
+ vertex -145.03396895421878 -42.33753106140071 -15.931851652578198
+ vertex -146.52483880689016 -40.91979339370032 -15.732050807568937
+ vertex -144.7927879993213 -41.91979339370032 -15.732050807568937
+ endloop
+endfacet
+facet normal 0.19134171618254736 0.3314135740355969 -0.9238795325112844
+ outer loop
+ vertex -146.52483880689016 -40.91979339370032 -15.732050807568937
+ vertex -145.03396895421878 -42.33753106140071 -15.931851652578198
+ vertex -146.76601976178765 -41.337531061400725 -15.931851652578198
+ endloop
+endfacet
+facet normal -0.3966766701456126 -0.6870641468694436 -0.6087614290087314
+ outer loop
+ vertex -158.39989478050782 -65.48799368273042 -15.414213562373153
+ vertex -160.2908642106746 -64.76324881133883 -15.000000000000057
+ vertex -160.1319455880767 -64.48799368273042 -15.414213562373153
+ endloop
+endfacet
+facet normal -0.3966766701456126 -0.6870641468694436 -0.6087614290087314
+ outer loop
+ vertex -160.2908642106746 -64.76324881133883 -15.000000000000057
+ vertex -158.39989478050782 -65.48799368273042 -15.414213562373153
+ vertex -158.55881340310575 -65.76324881133881 -15.000000000000057
+ endloop
+endfacet
+facet normal 0.46193976625564753 0.8001031451912655 -0.38268343236508495
+ outer loop
+ vertex -144.32686217303223 -41.11278619000914 -14.517638090205098
+ vertex -146.15881340310568 -40.28581879748475 -15.000000000000057
+ vertex -146.0589129806011 -40.11278619000914 -14.517638090205098
+ endloop
+endfacet
+facet normal 0.46193976625564753 0.8001031451912655 -0.38268343236508495
+ outer loop
+ vertex -146.15881340310568 -40.28581879748475 -15.000000000000057
+ vertex -144.32686217303223 -41.11278619000914 -14.517638090205098
+ vertex -144.42676259553681 -41.28581879748476 -15.000000000000057
+ endloop
+endfacet
+facet normal 0.3043807145043553 0.5272028623656618 0.7933533402912423
+ outer loop
+ vertex -146.3177320257036 -40.56107392609316 -10.58578643762696
+ vertex -144.7927879993213 -41.91979339370032 -10.267949192431178
+ vertex -144.58568121813474 -41.56107392609316 -10.58578643762696
+ endloop
+endfacet
+facet normal 0.3043807145043553 0.5272028623656618 0.7933533402912423
+ outer loop
+ vertex -144.7927879993213 -41.91979339370032 -10.267949192431178
+ vertex -146.3177320257036 -40.56107392609316 -10.58578643762696
+ vertex -146.52483880689016 -40.91979339370032 -10.267949192431178
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -157.6927879993213 -64.26324881133883 -16.00000000000006
+ vertex -147.02483880689016 -41.78581879748475 -16.00000000000006
+ vertex -145.2927879993213 -42.785818797484744 -16.00000000000006
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -147.02483880689016 -41.78581879748475 -16.00000000000006
+ vertex -157.6927879993213 -64.26324881133883 -16.00000000000006
+ vertex -159.42483880689016 -63.263248811338826 -16.00000000000006
+ endloop
+endfacet
+facet normal 0.396676670145619 0.6870641468694485 0.6087614290087214
+ outer loop
+ vertex -146.3177320257036 -40.56107392609316 -10.58578643762696
+ vertex -144.42676259553681 -41.28581879748476 -11.000000000000048
+ vertex -146.15881340310568 -40.28581879748475 -11.000000000000048
+ endloop
+endfacet
+facet normal 0.396676670145619 0.6870641468694485 0.6087614290087214
+ outer loop
+ vertex -144.42676259553681 -41.28581879748476 -11.000000000000048
+ vertex -146.3177320257036 -40.56107392609316 -10.58578643762696
+ vertex -144.58568121813474 -41.56107392609316 -10.58578643762696
+ endloop
+endfacet
+facet normal 0.49572243068690514 0.8586164364012606 0.13052619222005535
+ outer loop
+ vertex -146.05891298060106 -40.11278619000914 -11.482361909795012
+ vertex -144.2927879993213 -41.05376798991587 -12.000000000000046
+ vertex -146.02483880689016 -40.053767989915876 -12.000000000000046
+ endloop
+endfacet
+facet normal 0.49572243068690514 0.8586164364012606 0.13052619222005535
+ outer loop
+ vertex -144.2927879993213 -41.05376798991587 -12.000000000000046
+ vertex -146.05891298060106 -40.11278619000914 -11.482361909795012
+ vertex -144.3268621730322 -41.112786190009146 -11.482361909795012
+ endloop
+endfacet
+facet normal 0.396676670145621 0.687064146869452 -0.6087614290087162
+ outer loop
+ vertex -144.42676259553681 -41.28581879748476 -15.000000000000057
+ vertex -146.3177320257036 -40.56107392609316 -15.414213562373153
+ vertex -146.15881340310568 -40.28581879748475 -15.000000000000057
+ endloop
+endfacet
+facet normal 0.396676670145621 0.687064146869452 -0.6087614290087162
+ outer loop
+ vertex -146.3177320257036 -40.56107392609316 -15.414213562373153
+ vertex -144.42676259553681 -41.28581879748476 -15.000000000000057
+ vertex -144.58568121813474 -41.56107392609316 -15.414213562373153
+ endloop
+endfacet
+facet normal -0.3043807145043605 -0.527202862365668 -0.7933533402912359
+ outer loop
+ vertex -158.39989478050782 -65.48799368273042 -15.414213562373153
+ vertex -159.92483880689014 -64.12927421512326 -15.732050807568937
+ vertex -158.1927879993213 -65.12927421512326 -15.732050807568937
+ endloop
+endfacet
+facet normal -0.3043807145043605 -0.527202862365668 -0.7933533402912359
+ outer loop
+ vertex -159.92483880689014 -64.12927421512326 -15.732050807568937
+ vertex -158.39989478050782 -65.48799368273042 -15.414213562373153
+ vertex -160.1319455880767 -64.48799368273042 -15.414213562373153
+ endloop
+endfacet
+facet normal 0.0652630961100256 0.11303899832181541 0.9914448613738105
+ outer loop
+ vertex -146.76601976178765 -41.337531061400725 -10.068148347421912
+ vertex -145.2927879993213 -42.785818797484744 -10.00000000000005
+ vertex -145.03396895421878 -42.33753106140071 -10.068148347421912
+ endloop
+endfacet
+facet normal 0.0652630961100256 0.11303899832181541 0.9914448613738105
+ outer loop
+ vertex -145.2927879993213 -42.785818797484744 -10.00000000000005
+ vertex -146.76601976178765 -41.337531061400725 -10.068148347421912
+ vertex -147.02483880689016 -41.78581879748475 -10.00000000000005
+ endloop
+endfacet
+facet normal 0.495722430686905 0.8586164364012607 -0.13052619222005396
+ outer loop
+ vertex -144.2927879993213 -41.05376798991587 -14.000000000000059
+ vertex -146.0589129806011 -40.11278619000914 -14.517638090205098
+ vertex -146.02483880689016 -40.053767989915876 -14.000000000000059
+ endloop
+endfacet
+facet normal 0.495722430686905 0.8586164364012607 -0.13052619222005396
+ outer loop
+ vertex -146.0589129806011 -40.11278619000914 -14.517638090205098
+ vertex -144.2927879993213 -41.05376798991587 -14.000000000000059
+ vertex -144.32686217303223 -41.11278619000914 -14.517638090205098
+ endloop
+endfacet
+facet normal 0.1913417161825518 0.33141357403560456 0.9238795325112809
+ outer loop
+ vertex -146.52483880689016 -40.91979339370032 -10.267949192431178
+ vertex -145.03396895421878 -42.33753106140071 -10.068148347421912
+ vertex -144.7927879993213 -41.91979339370032 -10.267949192431178
+ endloop
+endfacet
+facet normal 0.1913417161825518 0.33141357403560456 0.9238795325112809
+ outer loop
+ vertex -145.03396895421878 -42.33753106140071 -10.068148347421912
+ vertex -146.52483880689016 -40.91979339370032 -10.267949192431178
+ vertex -146.76601976178765 -41.337531061400725 -10.068148347421912
+ endloop
+endfacet
+facet normal -0.19134171618254825 -0.3314135740355942 0.9238795325112852
+ outer loop
+ vertex -159.68365785199268 -63.71153654742285 -10.068148347421912
+ vertex -158.1927879993213 -65.12927421512329 -10.267949192431178
+ vertex -157.9516070444238 -64.71153654742285 -10.068148347421912
+ endloop
+endfacet
+facet normal -0.19134171618254825 -0.3314135740355942 0.9238795325112852
+ outer loop
+ vertex -158.1927879993213 -65.12927421512329 -10.267949192431178
+ vertex -159.68365785199268 -63.71153654742285 -10.068148347421912
+ vertex -159.92483880689016 -64.12927421512327 -10.267949192431178
+ endloop
+endfacet
+facet normal -0.19134171618255053 -0.33141357403559846 -0.9238795325112833
+ outer loop
+ vertex -158.1927879993213 -65.12927421512326 -15.732050807568937
+ vertex -159.68365785199268 -63.71153654742285 -15.931851652578198
+ vertex -157.9516070444238 -64.71153654742285 -15.931851652578198
+ endloop
+endfacet
+facet normal -0.19134171618255053 -0.33141357403559846 -0.9238795325112833
+ outer loop
+ vertex -159.68365785199268 -63.71153654742285 -15.931851652578198
+ vertex -158.1927879993213 -65.12927421512326 -15.732050807568937
+ vertex -159.92483880689014 -64.12927421512326 -15.732050807568937
+ endloop
+endfacet
+facet normal -0.3043807145043595 -0.5272028623656718 0.7933533402912339
+ outer loop
+ vertex -159.92483880689016 -64.12927421512327 -10.267949192431178
+ vertex -158.39989478050782 -65.48799368273042 -10.58578643762696
+ vertex -158.1927879993213 -65.12927421512329 -10.267949192431178
+ endloop
+endfacet
+facet normal -0.3043807145043595 -0.5272028623656718 0.7933533402912339
+ outer loop
+ vertex -158.39989478050782 -65.48799368273042 -10.58578643762696
+ vertex -159.92483880689016 -64.12927421512327 -10.267949192431178
+ vertex -160.13194558807672 -64.48799368273043 -10.58578643762696
+ endloop
+endfacet
+facet normal -0.06526309611002479 -0.11303899832181329 -0.9914448613738107
+ outer loop
+ vertex -157.9516070444238 -64.71153654742285 -15.931851652578198
+ vertex -159.42483880689016 -63.263248811338826 -16.00000000000006
+ vertex -157.6927879993213 -64.26324881133883 -16.00000000000006
+ endloop
+endfacet
+facet normal -0.06526309611002479 -0.11303899832181329 -0.9914448613738107
+ outer loop
+ vertex -159.42483880689016 -63.263248811338826 -16.00000000000006
+ vertex -157.9516070444238 -64.71153654742285 -15.931851652578198
+ vertex -159.68365785199268 -63.71153654742285 -15.931851652578198
+ endloop
+endfacet
+facet normal -0.3966766701456119 -0.6870641468694498 0.6087614290087249
+ outer loop
+ vertex -160.2908642106746 -64.76324881133883 -11.000000000000048
+ vertex -158.39989478050782 -65.48799368273042 -10.58578643762696
+ vertex -160.13194558807672 -64.48799368273043 -10.58578643762696
+ endloop
+endfacet
+facet normal -0.3966766701456119 -0.6870641468694498 0.6087614290087249
+ outer loop
+ vertex -158.39989478050782 -65.48799368273042 -10.58578643762696
+ vertex -160.2908642106746 -64.76324881133883 -11.000000000000048
+ vertex -158.55881340310575 -65.76324881133881 -11.000000000000048
+ endloop
+endfacet
+facet normal -0.4957224306869059 -0.8586164364012638 0.13052619222003028
+ outer loop
+ vertex -160.42483880689014 -64.99529961890771 -12.000000000000046
+ vertex -158.65871382561036 -65.93628141881446 -11.482361909795012
+ vertex -160.39076463317923 -64.93628141881445 -11.482361909795012
+ endloop
+endfacet
+facet normal -0.4957224306869059 -0.8586164364012638 0.13052619222003028
+ outer loop
+ vertex -158.65871382561036 -65.93628141881446 -11.482361909795012
+ vertex -160.42483880689014 -64.99529961890771 -12.000000000000046
+ vertex -158.69278799932127 -65.9952996189077 -12.000000000000046
+ endloop
+endfacet
+facet normal -0.06526309611002476 -0.11303899832181324 0.9914448613738107
+ outer loop
+ vertex -159.42483880689016 -63.263248811338826 -10.00000000000005
+ vertex -157.9516070444238 -64.71153654742285 -10.068148347421912
+ vertex -157.6927879993213 -64.26324881133883 -10.00000000000005
+ endloop
+endfacet
+facet normal -0.06526309611002476 -0.11303899832181324 0.9914448613738107
+ outer loop
+ vertex -157.9516070444238 -64.71153654742285 -10.068148347421912
+ vertex -159.42483880689016 -63.263248811338826 -10.00000000000005
+ vertex -159.68365785199268 -63.71153654742285 -10.068148347421912
+ endloop
+endfacet
+facet normal -0.46193976625564404 -0.8001031451912636 -0.3826834323650928
+ outer loop
+ vertex -158.55881340310575 -65.76324881133881 -15.000000000000057
+ vertex -160.39076463317923 -64.93628141881445 -14.517638090205098
+ vertex -160.2908642106746 -64.76324881133883 -15.000000000000057
+ endloop
+endfacet
+facet normal -0.46193976625564404 -0.8001031451912636 -0.3826834323650928
+ outer loop
+ vertex -160.39076463317923 -64.93628141881445 -14.517638090205098
+ vertex -158.55881340310575 -65.76324881133881 -15.000000000000057
+ vertex -158.65871382561036 -65.93628141881446 -14.517638090205098
+ endloop
+endfacet
+facet normal -0.4999999999999948 -0.8660254037844417 1.3926223557130775e-29
+ outer loop
+ vertex -158.69278799932127 -65.9952996189077 -14.000000000000059
+ vertex -160.42483880689014 -64.99529961890771 -12.000000000000046
+ vertex -160.42483880689014 -64.99529961890771 -14.000000000000059
+ endloop
+endfacet
+facet normal -0.4999999999999948 -0.8660254037844417 1.3926223557130775e-29
+ outer loop
+ vertex -160.42483880689014 -64.99529961890771 -12.000000000000046
+ vertex -158.69278799932127 -65.9952996189077 -14.000000000000059
+ vertex -158.69278799932127 -65.9952996189077 -12.000000000000046
+ endloop
+endfacet
+facet normal -0.46193976625564476 -0.8001031451912652 0.3826834323650892
+ outer loop
+ vertex -160.39076463317923 -64.93628141881445 -11.482361909795012
+ vertex -158.55881340310575 -65.76324881133881 -11.000000000000048
+ vertex -160.2908642106746 -64.76324881133883 -11.000000000000048
+ endloop
+endfacet
+facet normal -0.46193976625564476 -0.8001031451912652 0.3826834323650892
+ outer loop
+ vertex -158.55881340310575 -65.76324881133881 -11.000000000000048
+ vertex -160.39076463317923 -64.93628141881445 -11.482361909795012
+ vertex -158.65871382561036 -65.93628141881446 -11.482361909795012
+ endloop
+endfacet
+facet normal 5.933957380480184e-32 1.4193619471206742e-31 1.0
+ outer loop
+ vertex -147.02483880689013 -41.78581879748475 -49.600000000000044
+ vertex -157.6927879993213 -64.26324881133883 -49.600000000000044
+ vertex -145.29278799932126 -42.78581879748475 -49.600000000000044
+ endloop
+endfacet
+facet normal 5.933957380480184e-32 1.4193619471206742e-31 1.0
+ outer loop
+ vertex -157.6927879993213 -64.26324881133883 -49.600000000000044
+ vertex -147.02483880689013 -41.78581879748475 -49.600000000000044
+ vertex -159.42483880689016 -63.263248811338826 -49.600000000000044
+ endloop
+endfacet
+facet normal 0.30438071450435866 0.5272028623656677 -0.7933533402912368
+ outer loop
+ vertex -144.79278799932126 -41.91979339370032 -55.33205080756894
+ vertex -146.31773202570358 -40.561073926093165 -55.01421356237316
+ vertex -144.5856812181347 -41.56107392609316 -55.01421356237316
+ endloop
+endfacet
+facet normal 0.30438071450435866 0.5272028623656677 -0.7933533402912368
+ outer loop
+ vertex -146.31773202570358 -40.561073926093165 -55.01421356237316
+ vertex -144.79278799932126 -41.91979339370032 -55.33205080756894
+ vertex -146.52483880689013 -40.91979339370032 -55.33205080756894
+ endloop
+endfacet
+facet normal -0.49572243068689736 -0.8586164364012647 -0.1305261922200579
+ outer loop
+ vertex -158.65871382561033 -65.93628141881445 -54.117638090205105
+ vertex -160.42483880689014 -64.99529961890774 -53.60000000000006
+ vertex -160.3907646331792 -64.93628141881446 -54.117638090205105
+ endloop
+endfacet
+facet normal -0.49572243068689736 -0.8586164364012647 -0.1305261922200579
+ outer loop
+ vertex -160.42483880689014 -64.99529961890774 -53.60000000000006
+ vertex -158.65871382561033 -65.93628141881445 -54.117638090205105
+ vertex -158.69278799932127 -65.9952996189077 -53.60000000000006
+ endloop
+endfacet
+facet normal 0.06526309611002559 0.11303899832181546 -0.9914448613738105
+ outer loop
+ vertex -145.29278799932126 -42.78581879748475 -55.600000000000065
+ vertex -146.76601976178762 -41.337531061400725 -55.531851652578204
+ vertex -145.03396895421875 -42.33753106140071 -55.531851652578204
+ endloop
+endfacet
+facet normal 0.06526309611002559 0.11303899832181546 -0.9914448613738105
+ outer loop
+ vertex -146.76601976178762 -41.337531061400725 -55.531851652578204
+ vertex -145.29278799932126 -42.78581879748475 -55.600000000000065
+ vertex -147.02483880689013 -41.78581879748475 -55.600000000000065
+ endloop
+endfacet
+facet normal 0.4999999999999989 0.8660254037844393 -1.5259013723954584e-31
+ outer loop
+ vertex -144.29278799932126 -41.05376798991587 -51.60000000000005
+ vertex -146.02483880689013 -40.05376798991588 -53.60000000000006
+ vertex -146.02483880689013 -40.05376798991588 -51.60000000000005
+ endloop
+endfacet
+facet normal 0.4999999999999989 0.8660254037844393 -1.5259013723954584e-31
+ outer loop
+ vertex -146.02483880689013 -40.05376798991588 -53.60000000000006
+ vertex -144.29278799932126 -41.05376798991587 -51.60000000000005
+ vertex -144.29278799932126 -41.05376798991587 -53.60000000000006
+ endloop
+endfacet
+facet normal 0.3966766701456189 0.6870641468694462 0.6087614290087244
+ outer loop
+ vertex -146.31773202570358 -40.561073926093165 -50.18578643762695
+ vertex -144.42676259553681 -41.285818797484765 -50.600000000000044
+ vertex -146.15881340310568 -40.28581879748475 -50.600000000000044
+ endloop
+endfacet
+facet normal 0.3966766701456189 0.6870641468694462 0.6087614290087244
+ outer loop
+ vertex -144.42676259553681 -41.285818797484765 -50.600000000000044
+ vertex -146.31773202570358 -40.561073926093165 -50.18578643762695
+ vertex -144.5856812181347 -41.56107392609316 -50.18578643762695
+ endloop
+endfacet
+facet normal -0.39667667014561114 -0.6870641468694373 -0.6087614290087392
+ outer loop
+ vertex -158.39989478050782 -65.4879936827304 -55.01421356237316
+ vertex -160.29086421067458 -64.76324881133884 -54.60000000000006
+ vertex -160.1319455880767 -64.48799368273042 -55.01421356237316
+ endloop
+endfacet
+facet normal -0.39667667014561114 -0.6870641468694373 -0.6087614290087392
+ outer loop
+ vertex -160.29086421067458 -64.76324881133884 -54.60000000000006
+ vertex -158.39989478050782 -65.4879936827304 -55.01421356237316
+ vertex -158.55881340310572 -65.76324881133884 -54.60000000000006
+ endloop
+endfacet
+facet normal 0.3043807145043551 0.5272028623656614 0.7933533402912423
+ outer loop
+ vertex -146.31773202570358 -40.561073926093165 -50.18578643762695
+ vertex -144.79278799932126 -41.91979339370032 -49.867949192431176
+ vertex -144.5856812181347 -41.56107392609316 -50.18578643762695
+ endloop
+endfacet
+facet normal 0.3043807145043551 0.5272028623656614 0.7933533402912423
+ outer loop
+ vertex -144.79278799932126 -41.91979339370032 -49.867949192431176
+ vertex -146.31773202570358 -40.561073926093165 -50.18578643762695
+ vertex -146.52483880689013 -40.91979339370032 -49.867949192431176
+ endloop
+endfacet
+facet normal 0.1913417161825473 0.33141357403559696 -0.9238795325112844
+ outer loop
+ vertex -145.03396895421875 -42.33753106140071 -55.531851652578204
+ vertex -146.52483880689013 -40.91979339370032 -55.33205080756894
+ vertex -144.79278799932126 -41.91979339370032 -55.33205080756894
+ endloop
+endfacet
+facet normal 0.1913417161825473 0.33141357403559696 -0.9238795325112844
+ outer loop
+ vertex -146.52483880689013 -40.91979339370032 -55.33205080756894
+ vertex -145.03396895421875 -42.33753106140071 -55.531851652578204
+ vertex -146.76601976178762 -41.337531061400725 -55.531851652578204
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -157.6927879993213 -64.26324881133883 -55.600000000000065
+ vertex -147.02483880689013 -41.78581879748475 -55.600000000000065
+ vertex -145.29278799932126 -42.78581879748475 -55.600000000000065
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -147.02483880689013 -41.78581879748475 -55.600000000000065
+ vertex -157.6927879993213 -64.26324881133883 -55.600000000000065
+ vertex -159.42483880689016 -63.263248811338826 -55.600000000000065
+ endloop
+endfacet
+facet normal 0.4619397662556504 0.8001031451912681 0.38268343236507585
+ outer loop
+ vertex -146.15881340310568 -40.28581879748475 -50.600000000000044
+ vertex -144.32686217303217 -41.11278619000915 -51.082361909795004
+ vertex -146.05891298060106 -40.112786190009146 -51.082361909795004
+ endloop
+endfacet
+facet normal 0.4619397662556504 0.8001031451912681 0.38268343236507585
+ outer loop
+ vertex -144.32686217303217 -41.11278619000915 -51.082361909795004
+ vertex -146.15881340310568 -40.28581879748475 -50.600000000000044
+ vertex -144.42676259553681 -41.285818797484765 -50.600000000000044
+ endloop
+endfacet
+facet normal 0.49572243068690514 0.8586164364012606 0.1305261922200554
+ outer loop
+ vertex -146.05891298060106 -40.112786190009146 -51.082361909795004
+ vertex -144.29278799932126 -41.05376798991587 -51.60000000000005
+ vertex -146.02483880689013 -40.05376798991588 -51.60000000000005
+ endloop
+endfacet
+facet normal 0.49572243068690514 0.8586164364012606 0.1305261922200554
+ outer loop
+ vertex -144.29278799932126 -41.05376798991587 -51.60000000000005
+ vertex -146.05891298060106 -40.112786190009146 -51.082361909795004
+ vertex -144.32686217303217 -41.11278619000915 -51.082361909795004
+ endloop
+endfacet
+facet normal 0.39667667014562075 0.6870641468694496 -0.6087614290087193
+ outer loop
+ vertex -144.42676259553681 -41.285818797484765 -54.60000000000006
+ vertex -146.31773202570358 -40.561073926093165 -55.01421356237316
+ vertex -146.15881340310568 -40.28581879748475 -54.60000000000006
+ endloop
+endfacet
+facet normal 0.39667667014562075 0.6870641468694496 -0.6087614290087193
+ outer loop
+ vertex -146.31773202570358 -40.561073926093165 -55.01421356237316
+ vertex -144.42676259553681 -41.285818797484765 -54.60000000000006
+ vertex -144.5856812181347 -41.56107392609316 -55.01421356237316
+ endloop
+endfacet
+facet normal 0.06526309611002554 0.11303899832181535 0.9914448613738105
+ outer loop
+ vertex -146.76601976178762 -41.337531061400725 -49.668148347421905
+ vertex -145.29278799932126 -42.78581879748475 -49.600000000000044
+ vertex -145.03396895421875 -42.33753106140071 -49.668148347421905
+ endloop
+endfacet
+facet normal 0.06526309611002554 0.11303899832181535 0.9914448613738105
+ outer loop
+ vertex -145.29278799932126 -42.78581879748475 -49.600000000000044
+ vertex -146.76601976178762 -41.337531061400725 -49.668148347421905
+ vertex -147.02483880689013 -41.78581879748475 -49.600000000000044
+ endloop
+endfacet
+facet normal 0.495722430686905 0.8586164364012607 -0.13052619222005396
+ outer loop
+ vertex -144.29278799932126 -41.05376798991587 -53.60000000000006
+ vertex -146.05891298060106 -40.11278619000914 -54.117638090205105
+ vertex -146.02483880689013 -40.05376798991588 -53.60000000000006
+ endloop
+endfacet
+facet normal 0.495722430686905 0.8586164364012607 -0.13052619222005396
+ outer loop
+ vertex -146.05891298060106 -40.11278619000914 -54.117638090205105
+ vertex -144.29278799932126 -41.05376798991587 -53.60000000000006
+ vertex -144.3268621730322 -41.11278619000914 -54.117638090205105
+ endloop
+endfacet
+facet normal -0.191341716182544 -0.3314135740355927 0.9238795325112867
+ outer loop
+ vertex -159.68365785199265 -63.71153654742286 -49.668148347421905
+ vertex -158.19278799932127 -65.1292742151233 -49.867949192431176
+ vertex -157.9516070444238 -64.71153654742285 -49.668148347421905
+ endloop
+endfacet
+facet normal -0.191341716182544 -0.3314135740355927 0.9238795325112867
+ outer loop
+ vertex -158.19278799932127 -65.1292742151233 -49.867949192431176
+ vertex -159.68365785199265 -63.71153654742286 -49.668148347421905
+ vertex -159.92483880689014 -64.12927421512329 -49.867949192431176
+ endloop
+endfacet
+facet normal 0.4619397662556495 0.8001031451912662 -0.3826834323650809
+ outer loop
+ vertex -144.3268621730322 -41.11278619000914 -54.117638090205105
+ vertex -146.15881340310568 -40.28581879748475 -54.60000000000006
+ vertex -146.05891298060106 -40.11278619000914 -54.117638090205105
+ endloop
+endfacet
+facet normal 0.4619397662556495 0.8001031451912662 -0.3826834323650809
+ outer loop
+ vertex -146.15881340310568 -40.28581879748475 -54.60000000000006
+ vertex -144.3268621730322 -41.11278619000914 -54.117638090205105
+ vertex -144.42676259553681 -41.285818797484765 -54.60000000000006
+ endloop
+endfacet
+facet normal -0.3043807145043653 -0.5272028623656765 -0.7933533402912286
+ outer loop
+ vertex -158.39989478050782 -65.4879936827304 -55.01421356237316
+ vertex -159.92483880689014 -64.12927421512327 -55.33205080756894
+ vertex -158.19278799932127 -65.12927421512327 -55.33205080756894
+ endloop
+endfacet
+facet normal -0.3043807145043653 -0.5272028623656765 -0.7933533402912286
+ outer loop
+ vertex -159.92483880689014 -64.12927421512327 -55.33205080756894
+ vertex -158.39989478050782 -65.4879936827304 -55.01421356237316
+ vertex -160.1319455880767 -64.48799368273042 -55.01421356237316
+ endloop
+endfacet
+facet normal 0.19134171618255189 0.33141357403560473 0.9238795325112809
+ outer loop
+ vertex -146.52483880689013 -40.91979339370032 -49.867949192431176
+ vertex -145.03396895421875 -42.33753106140071 -49.668148347421905
+ vertex -144.79278799932126 -41.91979339370032 -49.867949192431176
+ endloop
+endfacet
+facet normal 0.19134171618255189 0.33141357403560473 0.9238795325112809
+ outer loop
+ vertex -145.03396895421875 -42.33753106140071 -49.668148347421905
+ vertex -146.52483880689013 -40.91979339370032 -49.867949192431176
+ vertex -146.76601976178762 -41.337531061400725 -49.668148347421905
+ endloop
+endfacet
+facet normal -0.1913417161825476 -0.33141357403559557 -0.9238795325112849
+ outer loop
+ vertex -158.19278799932127 -65.12927421512327 -55.33205080756894
+ vertex -159.68365785199265 -63.71153654742286 -55.531851652578204
+ vertex -157.9516070444238 -64.71153654742285 -55.531851652578204
+ endloop
+endfacet
+facet normal -0.1913417161825476 -0.33141357403559557 -0.9238795325112849
+ outer loop
+ vertex -159.68365785199265 -63.71153654742286 -55.531851652578204
+ vertex -158.19278799932127 -65.12927421512327 -55.33205080756894
+ vertex -159.92483880689014 -64.12927421512327 -55.33205080756894
+ endloop
+endfacet
+facet normal -1.0 1.5543122344752188e-15 -2.823841496478738e-16
+ outer loop
+ vertex -99.40000000000005 -100.43433599533701 -39.80000000000007
+ vertex -99.40000000000006 -104.43433599533692 -25.800000000000065
+ vertex -99.40000000000005 -100.43433599533698 -25.800000000000065
+ endloop
+endfacet
+facet normal -1.0 1.5543122344752188e-15 -2.823841496478738e-16
+ outer loop
+ vertex -99.40000000000006 -104.43433599533692 -25.800000000000065
+ vertex -99.40000000000005 -100.43433599533701 -39.80000000000007
+ vertex -99.40000000000006 -104.43433599533697 -39.80000000000006
+ endloop
+endfacet
+facet normal -0.9914448613738109 1.6098233857064766e-15 -0.1305261922200486
+ outer loop
+ vertex -99.40000000000005 -100.43433599533698 -25.800000000000065
+ vertex -99.50222252113285 -104.43433599533694 -25.0235428646925
+ vertex -99.50222252113285 -100.434335995337 -25.0235428646925
+ endloop
+endfacet
+facet normal -0.9914448613738109 1.6098233857064766e-15 -0.1305261922200486
+ outer loop
+ vertex -99.50222252113285 -104.43433599533694 -25.0235428646925
+ vertex -99.40000000000005 -100.43433599533698 -25.800000000000065
+ vertex -99.40000000000006 -104.43433599533692 -25.800000000000065
+ endloop
+endfacet
+facet normal -0.9238795325112841 1.3877787807814457e-15 -0.38268343236509644
+ outer loop
+ vertex -99.50222252113285 -100.434335995337 -25.0235428646925
+ vertex -99.80192378864675 -104.43433599533692 -24.300000000000068
+ vertex -99.80192378864673 -100.43433599533698 -24.300000000000068
+ endloop
+endfacet
+facet normal -0.9238795325112841 1.3877787807814457e-15 -0.38268343236509644
+ outer loop
+ vertex -99.80192378864675 -104.43433599533692 -24.300000000000068
+ vertex -99.50222252113285 -100.434335995337 -25.0235428646925
+ vertex -99.50222252113285 -104.43433599533694 -25.0235428646925
+ endloop
+endfacet
+facet normal -0.7933533402912388 1.1657341758564142e-15 -0.6087614290087159
+ outer loop
+ vertex -99.80192378864673 -100.43433599533698 -24.300000000000068
+ vertex -100.27867965644042 -104.43433599533694 -23.678679656440423
+ vertex -100.27867965644042 -100.434335995337 -23.678679656440423
+ endloop
+endfacet
+facet normal -0.7933533402912388 1.1657341758564142e-15 -0.6087614290087159
+ outer loop
+ vertex -100.27867965644042 -104.43433599533694 -23.678679656440423
+ vertex -99.80192378864673 -100.43433599533698 -24.300000000000068
+ vertex -99.80192378864675 -104.43433599533692 -24.300000000000068
+ endloop
+endfacet
+facet normal -0.6087614290087219 8.881784197001251e-16 -0.7933533402912344
+ outer loop
+ vertex -100.27867965644042 -104.43433599533694 -23.678679656440423
+ vertex -100.90000000000005 -100.43433599533701 -23.20192378864675
+ vertex -100.27867965644042 -100.434335995337 -23.678679656440423
+ endloop
+endfacet
+facet normal -0.6087614290087219 8.881784197001251e-16 -0.7933533402912344
+ outer loop
+ vertex -100.90000000000005 -100.43433599533701 -23.20192378864675
+ vertex -100.27867965644042 -104.43433599533694 -23.678679656440423
+ vertex -100.90000000000006 -104.43433599533697 -23.20192378864675
+ endloop
+endfacet
+facet normal -0.38268343236508884 5.82867087928207e-16 -0.9238795325112871
+ outer loop
+ vertex -100.90000000000006 -104.43433599533697 -23.20192378864675
+ vertex -101.62354286469248 -100.43433599533701 -22.90222252113286
+ vertex -100.90000000000005 -100.43433599533701 -23.20192378864675
+ endloop
+endfacet
+facet normal -0.38268343236508884 5.82867087928207e-16 -0.9238795325112871
+ outer loop
+ vertex -101.62354286469248 -100.43433599533701 -22.90222252113286
+ vertex -100.90000000000006 -104.43433599533697 -23.20192378864675
+ vertex -101.62354286469251 -104.43433599533697 -22.90222252113286
+ endloop
+endfacet
+facet normal -0.13052619222005019 1.318389841742372e-16 -0.9914448613738106
+ outer loop
+ vertex -101.62354286469251 -104.43433599533697 -22.90222252113286
+ vertex -102.40000000000006 -100.434335995337 -22.800000000000065
+ vertex -101.62354286469248 -100.43433599533701 -22.90222252113286
+ endloop
+endfacet
+facet normal -0.13052619222005019 1.318389841742372e-16 -0.9914448613738106
+ outer loop
+ vertex -102.40000000000006 -100.434335995337 -22.800000000000065
+ vertex -101.62354286469251 -104.43433599533697 -22.90222252113286
+ vertex -102.40000000000008 -104.43433599533697 -22.800000000000065
+ endloop
+endfacet
+facet normal 0.13052619222005166 -2.6367796834847483e-16 -0.9914448613738105
+ outer loop
+ vertex -102.40000000000008 -104.43433599533697 -22.800000000000065
+ vertex -103.17645713530761 -100.434335995337 -22.90222252113286
+ vertex -102.40000000000006 -100.434335995337 -22.800000000000065
+ endloop
+endfacet
+facet normal 0.13052619222005166 -2.6367796834847483e-16 -0.9914448613738105
+ outer loop
+ vertex -103.17645713530761 -100.434335995337 -22.90222252113286
+ vertex -102.40000000000008 -104.43433599533697 -22.800000000000065
+ vertex -103.17645713530764 -104.43433599533694 -22.90222252113286
+ endloop
+endfacet
+facet normal 0.38268343236508595 -6.938893903907229e-16 -0.9238795325112884
+ outer loop
+ vertex -103.17645713530764 -104.43433599533694 -22.90222252113286
+ vertex -103.90000000000006 -100.43433599533698 -23.20192378864675
+ vertex -103.17645713530761 -100.434335995337 -22.90222252113286
+ endloop
+endfacet
+facet normal 0.38268343236508595 -6.938893903907229e-16 -0.9238795325112884
+ outer loop
+ vertex -103.90000000000006 -100.43433599533698 -23.20192378864675
+ vertex -103.17645713530764 -104.43433599533694 -22.90222252113286
+ vertex -103.90000000000008 -104.43433599533694 -23.20192378864675
+ endloop
+endfacet
+facet normal 0.6087614290087233 -9.99200722162641e-16 -0.7933533402912333
+ outer loop
+ vertex -103.90000000000008 -104.43433599533694 -23.20192378864675
+ vertex -104.52132034355971 -100.43433599533698 -23.678679656440423
+ vertex -103.90000000000006 -100.43433599533698 -23.20192378864675
+ endloop
+endfacet
+facet normal 0.6087614290087233 -9.99200722162641e-16 -0.7933533402912333
+ outer loop
+ vertex -104.52132034355971 -100.43433599533698 -23.678679656440423
+ vertex -103.90000000000008 -104.43433599533694 -23.20192378864675
+ vertex -104.52132034355974 -104.43433599533697 -23.678679656440423
+ endloop
+endfacet
+facet normal 0.7933533402912377 -1.2767564783189298e-15 -0.6087614290087173
+ outer loop
+ vertex -104.52132034355971 -100.43433599533698 -23.678679656440423
+ vertex -104.99807621135338 -104.43433599533697 -24.30000000000006
+ vertex -104.99807621135338 -100.43433599533701 -24.30000000000006
+ endloop
+endfacet
+facet normal 0.7933533402912377 -1.2767564783189298e-15 -0.6087614290087173
+ outer loop
+ vertex -104.99807621135338 -104.43433599533697 -24.30000000000006
+ vertex -104.52132034355971 -100.43433599533698 -23.678679656440423
+ vertex -104.52132034355974 -104.43433599533697 -23.678679656440423
+ endloop
+endfacet
+facet normal 0.9238795325112851 -1.4432899320127031e-15 -0.38268343236509383
+ outer loop
+ vertex -104.99807621135338 -100.43433599533701 -24.30000000000006
+ vertex -105.29777747886729 -104.43433599533694 -25.0235428646925
+ vertex -105.29777747886726 -100.434335995337 -25.0235428646925
+ endloop
+endfacet
+facet normal 0.9238795325112851 -1.4432899320127031e-15 -0.38268343236509383
+ outer loop
+ vertex -105.29777747886729 -104.43433599533694 -25.0235428646925
+ vertex -104.99807621135338 -100.43433599533701 -24.30000000000006
+ vertex -104.99807621135338 -104.43433599533697 -24.30000000000006
+ endloop
+endfacet
+facet normal 0.99144486137381 -1.609823385706477e-15 -0.13052619222005474
+ outer loop
+ vertex -105.29777747886726 -100.434335995337 -25.0235428646925
+ vertex -105.40000000000008 -104.43433599533694 -25.800000000000065
+ vertex -105.40000000000008 -100.434335995337 -25.800000000000065
+ endloop
+endfacet
+facet normal 0.99144486137381 -1.609823385706477e-15 -0.13052619222005474
+ outer loop
+ vertex -105.40000000000008 -104.43433599533694 -25.800000000000065
+ vertex -105.29777747886726 -100.434335995337 -25.0235428646925
+ vertex -105.29777747886729 -104.43433599533694 -25.0235428646925
+ endloop
+endfacet
+facet normal 1.0 -1.5543122344752188e-15 3.4888037310101773e-16
+ outer loop
+ vertex -105.40000000000008 -104.43433599533694 -25.800000000000065
+ vertex -105.40000000000005 -100.434335995337 -39.80000000000007
+ vertex -105.40000000000008 -100.434335995337 -25.800000000000065
+ endloop
+endfacet
+facet normal 1.0 -1.5543122344752188e-15 3.4888037310101773e-16
+ outer loop
+ vertex -105.40000000000005 -100.434335995337 -39.80000000000007
+ vertex -105.40000000000008 -104.43433599533694 -25.800000000000065
+ vertex -105.40000000000008 -104.43433599533694 -39.80000000000006
+ endloop
+endfacet
+facet normal 0.9914448613738108 -1.5543122344752188e-15 0.13052619222004905
+ outer loop
+ vertex -105.40000000000008 -104.43433599533694 -39.80000000000006
+ vertex -105.29777747886726 -100.434335995337 -40.57645713530763
+ vertex -105.40000000000005 -100.434335995337 -39.80000000000007
+ endloop
+endfacet
+facet normal 0.9914448613738108 -1.5543122344752188e-15 0.13052619222004905
+ outer loop
+ vertex -105.29777747886726 -100.434335995337 -40.57645713530763
+ vertex -105.40000000000008 -104.43433599533694 -39.80000000000006
+ vertex -105.29777747886729 -104.43433599533694 -40.57645713530763
+ endloop
+endfacet
+facet normal 0.9238795325112851 -1.4432899320127031e-15 0.38268343236509383
+ outer loop
+ vertex -105.29777747886729 -104.43433599533694 -40.57645713530763
+ vertex -104.99807621135338 -100.43433599533701 -41.30000000000007
+ vertex -105.29777747886726 -100.434335995337 -40.57645713530763
+ endloop
+endfacet
+facet normal 0.9238795325112851 -1.4432899320127031e-15 0.38268343236509383
+ outer loop
+ vertex -104.99807621135338 -100.43433599533701 -41.30000000000007
+ vertex -105.29777747886729 -104.43433599533694 -40.57645713530763
+ vertex -104.99807621135338 -104.43433599533697 -41.30000000000007
+ endloop
+endfacet
+facet normal 0.7933533402912375 -1.221245327087672e-15 0.6087614290087175
+ outer loop
+ vertex -104.99807621135338 -104.43433599533697 -41.30000000000007
+ vertex -104.52132034355971 -100.43433599533698 -41.921320343559714
+ vertex -104.99807621135338 -100.43433599533701 -41.30000000000007
+ endloop
+endfacet
+facet normal 0.7933533402912375 -1.221245327087672e-15 0.6087614290087175
+ outer loop
+ vertex -104.52132034355971 -100.43433599533698 -41.921320343559714
+ vertex -104.99807621135338 -104.43433599533697 -41.30000000000007
+ vertex -104.52132034355974 -104.43433599533697 -41.921320343559714
+ endloop
+endfacet
+facet normal 0.6087614290087211 -8.881784197001251e-16 0.7933533402912349
+ outer loop
+ vertex -104.52132034355971 -100.43433599533698 -41.921320343559714
+ vertex -103.90000000000008 -104.43433599533694 -42.39807621135338
+ vertex -103.90000000000006 -100.43433599533698 -42.398076211353384
+ endloop
+endfacet
+facet normal 0.6087614290087211 -8.881784197001251e-16 0.7933533402912349
+ outer loop
+ vertex -103.90000000000008 -104.43433599533694 -42.39807621135338
+ vertex -104.52132034355971 -100.43433599533698 -41.921320343559714
+ vertex -104.52132034355974 -104.43433599533697 -41.921320343559714
+ endloop
+endfacet
+facet normal 0.382683432365092 -4.996003610813203e-16 0.9238795325112859
+ outer loop
+ vertex -103.90000000000006 -100.43433599533698 -42.398076211353384
+ vertex -103.17645713530764 -104.43433599533692 -42.697777478867266
+ vertex -103.17645713530764 -100.43433599533697 -42.69777747886727
+ endloop
+endfacet
+facet normal 0.382683432365092 -4.996003610813203e-16 0.9238795325112859
+ outer loop
+ vertex -103.17645713530764 -104.43433599533692 -42.697777478867266
+ vertex -103.90000000000006 -100.43433599533698 -42.398076211353384
+ vertex -103.90000000000008 -104.43433599533694 -42.39807621135338
+ endloop
+endfacet
+facet normal 0.13052619222004938 -1.4571677198205165e-16 0.9914448613738108
+ outer loop
+ vertex -103.17645713530764 -100.43433599533697 -42.69777747886727
+ vertex -102.40000000000006 -104.43433599533694 -42.80000000000007
+ vertex -102.40000000000003 -100.43433599533698 -42.80000000000007
+ endloop
+endfacet
+facet normal 0.13052619222004938 -1.4571677198205165e-16 0.9914448613738108
+ outer loop
+ vertex -102.40000000000006 -104.43433599533694 -42.80000000000007
+ vertex -103.17645713530764 -100.43433599533697 -42.69777747886727
+ vertex -103.17645713530764 -104.43433599533692 -42.697777478867266
+ endloop
+endfacet
+facet normal -0.13052619222005243 2.6367796834847483e-16 0.9914448613738103
+ outer loop
+ vertex -102.40000000000003 -100.43433599533698 -42.80000000000007
+ vertex -101.62354286469251 -104.43433599533694 -42.697777478867266
+ vertex -101.62354286469248 -100.43433599533698 -42.69777747886727
+ endloop
+endfacet
+facet normal -0.13052619222005243 2.6367796834847483e-16 0.9914448613738103
+ outer loop
+ vertex -101.62354286469251 -104.43433599533694 -42.697777478867266
+ vertex -102.40000000000003 -100.43433599533698 -42.80000000000007
+ vertex -102.40000000000006 -104.43433599533694 -42.80000000000007
+ endloop
+endfacet
+facet normal -0.38268343236508595 6.938893903907229e-16 0.9238795325112884
+ outer loop
+ vertex -101.62354286469248 -100.43433599533698 -42.69777747886727
+ vertex -100.90000000000006 -104.43433599533697 -42.398076211353384
+ vertex -100.90000000000003 -100.434335995337 -42.398076211353384
+ endloop
+endfacet
+facet normal -0.38268343236508595 6.938893903907229e-16 0.9238795325112884
+ outer loop
+ vertex -100.90000000000006 -104.43433599533697 -42.398076211353384
+ vertex -101.62354286469248 -100.43433599533698 -42.69777747886727
+ vertex -101.62354286469251 -104.43433599533694 -42.697777478867266
+ endloop
+endfacet
+facet normal -0.6087614290087179 9.99200722162641e-16 0.7933533402912374
+ outer loop
+ vertex -100.90000000000003 -100.434335995337 -42.398076211353384
+ vertex -100.27867965644042 -104.43433599533697 -41.921320343559714
+ vertex -100.27867965644039 -100.43433599533701 -41.921320343559714
+ endloop
+endfacet
+facet normal -0.6087614290087179 9.99200722162641e-16 0.7933533402912374
+ outer loop
+ vertex -100.27867965644042 -104.43433599533697 -41.921320343559714
+ vertex -100.90000000000003 -100.434335995337 -42.398076211353384
+ vertex -100.90000000000006 -104.43433599533697 -42.398076211353384
+ endloop
+endfacet
+facet normal -0.7933533402912392 1.2212453270876722e-15 0.6087614290087157
+ outer loop
+ vertex -100.27867965644042 -104.43433599533697 -41.921320343559714
+ vertex -99.80192378864673 -100.43433599533701 -41.30000000000007
+ vertex -100.27867965644039 -100.43433599533701 -41.921320343559714
+ endloop
+endfacet
+facet normal -0.7933533402912392 1.2212453270876722e-15 0.6087614290087157
+ outer loop
+ vertex -99.80192378864673 -100.43433599533701 -41.30000000000007
+ vertex -100.27867965644042 -104.43433599533697 -41.921320343559714
+ vertex -99.80192378864673 -104.43433599533697 -41.30000000000007
+ endloop
+endfacet
+facet normal -0.9238795325112857 1.4432899320127035e-15 0.38268343236509245
+ outer loop
+ vertex -99.80192378864673 -104.43433599533697 -41.30000000000007
+ vertex -99.50222252113285 -100.43433599533701 -40.57645713530763
+ vertex -99.80192378864673 -100.43433599533701 -41.30000000000007
+ endloop
+endfacet
+facet normal -0.9238795325112857 1.4432899320127035e-15 0.38268343236509245
+ outer loop
+ vertex -99.50222252113285 -100.43433599533701 -40.57645713530763
+ vertex -99.80192378864673 -104.43433599533697 -41.30000000000007
+ vertex -99.50222252113285 -104.43433599533697 -40.57645713530763
+ endloop
+endfacet
+facet normal -0.9914448613738109 1.6098233857064766e-15 0.1305261922200486
+ outer loop
+ vertex -99.50222252113285 -104.43433599533697 -40.57645713530763
+ vertex -99.40000000000005 -100.43433599533701 -39.80000000000007
+ vertex -99.50222252113285 -100.43433599533701 -40.57645713530763
+ endloop
+endfacet
+facet normal -0.9914448613738109 1.6098233857064766e-15 0.1305261922200486
+ outer loop
+ vertex -99.40000000000005 -100.43433599533701 -39.80000000000007
+ vertex -99.50222252113285 -104.43433599533697 -40.57645713530763
+ vertex -99.40000000000006 -104.43433599533697 -39.80000000000006
+ endloop
+endfacet
+facet normal -0.49572243068690525 -0.8586164364012615 -0.13052619222004866
+ outer loop
+ vertex -136.67868638418352 -35.86575713850505 -25.800000000000054
+ vertex -140.19389925988764 -33.95428443864497 -25.0235428646925
+ vertex -140.14278799932123 -33.865757138505074 -25.800000000000065
+ endloop
+endfacet
+facet normal -0.49572243068690525 -0.8586164364012615 -0.13052619222004866
+ outer loop
+ vertex -140.19389925988764 -33.95428443864497 -25.0235428646925
+ vertex -136.67868638418352 -35.86575713850505 -25.800000000000054
+ vertex -136.7297976447499 -35.95428443864494 -25.02354286469249
+ endloop
+endfacet
+facet normal -0.4999999999999998 -0.8660254037844388 4.1537659655416246e-16
+ outer loop
+ vertex -136.67868638418355 -35.86575713850504 -39.800000000000054
+ vertex -140.14278799932123 -33.865757138505074 -25.800000000000065
+ vertex -140.14278799932126 -33.86575713850507 -39.80000000000006
+ endloop
+endfacet
+facet normal -0.4999999999999998 -0.8660254037844388 4.1537659655416246e-16
+ outer loop
+ vertex -140.14278799932123 -33.865757138505074 -25.800000000000065
+ vertex -136.67868638418355 -35.86575713850504 -39.800000000000054
+ vertex -136.67868638418352 -35.86575713850505 -25.800000000000054
+ endloop
+endfacet
+facet normal -0.49572243068690514 -0.8586164364012614 0.13052619222004863
+ outer loop
+ vertex -140.19389925988764 -33.954284438644954 -40.57645713530763
+ vertex -136.67868638418355 -35.86575713850504 -39.800000000000054
+ vertex -140.14278799932126 -33.86575713850507 -39.80000000000006
+ endloop
+endfacet
+facet normal -0.49572243068690514 -0.8586164364012614 0.13052619222004863
+ outer loop
+ vertex -136.67868638418355 -35.86575713850504 -39.800000000000054
+ vertex -140.19389925988764 -33.954284438644954 -40.57645713530763
+ vertex -136.72979764474994 -35.95428443864494 -40.57645713530762
+ endloop
+endfacet
+facet normal -0.4619397662556419 -0.8001031451912638 0.3826834323650951
+ outer loop
+ vertex -140.3437498936446 -34.21383334985839 -41.30000000000007
+ vertex -136.72979764474994 -35.95428443864494 -40.57645713530762
+ vertex -140.19389925988764 -33.954284438644954 -40.57645713530763
+ endloop
+endfacet
+facet normal -0.4619397662556419 -0.8001031451912638 0.3826834323650951
+ outer loop
+ vertex -136.72979764474994 -35.95428443864494 -40.57645713530762
+ vertex -140.3437498936446 -34.21383334985839 -41.30000000000007
+ vertex -136.87964827850686 -36.21383334985837 -41.30000000000006
+ endloop
+endfacet
+facet normal -0.39667667014561914 -0.6870641468694536 0.6087614290087157
+ outer loop
+ vertex -140.58212782754143 -34.626716042771 -41.921320343559714
+ vertex -136.87964827850686 -36.21383334985837 -41.30000000000006
+ vertex -140.3437498936446 -34.21383334985839 -41.30000000000007
+ endloop
+endfacet
+facet normal -0.39667667014561914 -0.6870641468694536 0.6087614290087157
+ outer loop
+ vertex -136.87964827850686 -36.21383334985837 -41.30000000000006
+ vertex -140.58212782754143 -34.626716042771 -41.921320343559714
+ vertex -137.11802621240372 -36.62671604277097 -41.9213203435597
+ endloop
+endfacet
+facet normal -0.30438071450435844 -0.5272028623656669 0.7933533402912374
+ outer loop
+ vertex -140.58212782754143 -34.626716042771 -41.921320343559714
+ vertex -137.42868638418355 -37.16479524418171 -42.39807621135338
+ vertex -137.11802621240372 -36.62671604277097 -41.9213203435597
+ endloop
+endfacet
+facet normal -0.30438071450435844 -0.5272028623656669 0.7933533402912374
+ outer loop
+ vertex -137.42868638418355 -37.16479524418171 -42.39807621135338
+ vertex -140.58212782754143 -34.626716042771 -41.921320343559714
+ vertex -140.89278799932126 -35.16479524418173 -42.398076211353384
+ endloop
+endfacet
+facet normal -0.191341716182541 -0.3314135740355861 0.9238795325112897
+ outer loop
+ vertex -140.89278799932126 -35.16479524418173 -42.398076211353384
+ vertex -137.79045781652974 -37.79140174573234 -42.69777747886726
+ vertex -137.42868638418355 -37.16479524418171 -42.39807621135338
+ endloop
+endfacet
+facet normal -0.191341716182541 -0.3314135740355861 0.9238795325112897
+ outer loop
+ vertex -137.79045781652974 -37.79140174573234 -42.69777747886726
+ vertex -140.89278799932126 -35.16479524418173 -42.398076211353384
+ vertex -141.25455943166745 -35.79140174573236 -42.697777478867266
+ endloop
+endfacet
+facet normal -0.06526309611002579 -0.11303899832181638 0.9914448613738103
+ outer loop
+ vertex -141.25455943166745 -35.79140174573236 -42.697777478867266
+ vertex -138.17868638418352 -38.463833349858376 -42.800000000000054
+ vertex -137.79045781652974 -37.79140174573234 -42.69777747886726
+ endloop
+endfacet
+facet normal -0.06526309611002579 -0.11303899832181638 0.9914448613738103
+ outer loop
+ vertex -138.17868638418352 -38.463833349858376 -42.800000000000054
+ vertex -141.25455943166745 -35.79140174573236 -42.697777478867266
+ vertex -141.64278799932123 -36.4638333498584 -42.80000000000006
+ endloop
+endfacet
+facet normal 0.06526309611002504 0.11303899832181324 0.9914448613738107
+ outer loop
+ vertex -141.64278799932123 -36.4638333498584 -42.80000000000006
+ vertex -138.56691495183733 -39.13626495398441 -42.69777747886726
+ vertex -138.17868638418352 -38.463833349858376 -42.800000000000054
+ endloop
+endfacet
+facet normal 0.06526309611002504 0.11303899832181324 0.9914448613738107
+ outer loop
+ vertex -138.56691495183733 -39.13626495398441 -42.69777747886726
+ vertex -141.64278799932123 -36.4638333498584 -42.80000000000006
+ vertex -142.031016566975 -37.13626495398446 -42.697777478867266
+ endloop
+endfacet
+facet normal 0.19134171618254625 0.33141357403559346 0.923879532511286
+ outer loop
+ vertex -142.031016566975 -37.13626495398446 -42.697777478867266
+ vertex -138.92868638418352 -39.76287145553502 -42.39807621135337
+ vertex -138.56691495183733 -39.13626495398441 -42.69777747886726
+ endloop
+endfacet
+facet normal 0.19134171618254625 0.33141357403559346 0.923879532511286
+ outer loop
+ vertex -138.92868638418352 -39.76287145553502 -42.39807621135337
+ vertex -142.031016566975 -37.13626495398446 -42.697777478867266
+ vertex -142.39278799932126 -37.76287145553507 -42.39807621135338
+ endloop
+endfacet
+facet normal 0.3043807145043607 0.5272028623656694 0.793353340291235
+ outer loop
+ vertex -142.39278799932126 -37.76287145553507 -42.39807621135338
+ vertex -139.23934655596338 -40.30095065694574 -41.9213203435597
+ vertex -138.92868638418352 -39.76287145553502 -42.39807621135337
+ endloop
+endfacet
+facet normal 0.3043807145043607 0.5272028623656694 0.793353340291235
+ outer loop
+ vertex -139.23934655596338 -40.30095065694574 -41.9213203435597
+ vertex -142.39278799932126 -37.76287145553507 -42.39807621135338
+ vertex -142.7034481711011 -38.30095065694579 -41.92132034355971
+ endloop
+endfacet
+facet normal 0.3966766701456196 0.6870641468694534 0.6087614290087158
+ outer loop
+ vertex -142.94182610499792 -38.7138333498584 -41.30000000000006
+ vertex -139.23934655596338 -40.30095065694574 -41.9213203435597
+ vertex -142.7034481711011 -38.30095065694579 -41.92132034355971
+ endloop
+endfacet
+facet normal 0.3966766701456196 0.6870641468694534 0.6087614290087158
+ outer loop
+ vertex -139.23934655596338 -40.30095065694574 -41.9213203435597
+ vertex -142.94182610499792 -38.7138333498584 -41.30000000000006
+ vertex -139.4777244898602 -40.71383334985835 -41.300000000000054
+ endloop
+endfacet
+facet normal 0.4619397662556426 0.8001031451912641 0.38268343236509395
+ outer loop
+ vertex -143.09167673875487 -38.973382261071826 -40.57645713530762
+ vertex -139.4777244898602 -40.71383334985835 -41.300000000000054
+ vertex -142.94182610499792 -38.7138333498584 -41.30000000000006
+ endloop
+endfacet
+facet normal 0.4619397662556426 0.8001031451912641 0.38268343236509395
+ outer loop
+ vertex -139.4777244898602 -40.71383334985835 -41.300000000000054
+ vertex -143.09167673875487 -38.973382261071826 -40.57645713530762
+ vertex -139.62757512361713 -40.97338226107177 -40.576457135307614
+ endloop
+endfacet
+facet normal 0.4957224306869053 0.8586164364012614 0.1305261922200491
+ outer loop
+ vertex -143.14278799932126 -39.06190956121171 -39.80000000000006
+ vertex -139.62757512361713 -40.97338226107177 -40.576457135307614
+ vertex -143.09167673875487 -38.973382261071826 -40.57645713530762
+ endloop
+endfacet
+facet normal 0.4957224306869053 0.8586164364012614 0.1305261922200491
+ outer loop
+ vertex -139.62757512361713 -40.97338226107177 -40.576457135307614
+ vertex -143.14278799932126 -39.06190956121171 -39.80000000000006
+ vertex -139.67868638418355 -41.06190956121165 -39.800000000000054
+ endloop
+endfacet
+facet normal 0.4999999999999999 0.8660254037844388 -3.488803731010181e-16
+ outer loop
+ vertex -139.67868638418355 -41.06190956121165 -25.800000000000047
+ vertex -143.14278799932126 -39.06190956121171 -39.80000000000006
+ vertex -143.14278799932126 -39.06190956121171 -25.80000000000006
+ endloop
+endfacet
+facet normal 0.4999999999999999 0.8660254037844388 -3.488803731010181e-16
+ outer loop
+ vertex -143.14278799932126 -39.06190956121171 -39.80000000000006
+ vertex -139.67868638418355 -41.06190956121165 -25.800000000000047
+ vertex -139.67868638418355 -41.06190956121165 -39.800000000000054
+ endloop
+endfacet
+facet normal 0.4957224306869047 0.8586164364012607 -0.13052619222005568
+ outer loop
+ vertex -139.62757512361713 -40.97338226107177 -25.02354286469249
+ vertex -143.14278799932126 -39.06190956121171 -25.80000000000006
+ vertex -143.09167673875484 -38.97338226107182 -25.0235428646925
+ endloop
+endfacet
+facet normal 0.4957224306869047 0.8586164364012607 -0.13052619222005568
+ outer loop
+ vertex -143.14278799932126 -39.06190956121171 -25.80000000000006
+ vertex -139.62757512361713 -40.97338226107177 -25.02354286469249
+ vertex -139.67868638418355 -41.06190956121165 -25.800000000000047
+ endloop
+endfacet
+facet normal 0.4619397662556422 0.8001031451912644 -0.38268343236509395
+ outer loop
+ vertex -139.4777244898602 -40.713833349858334 -24.30000000000005
+ vertex -143.09167673875484 -38.97338226107182 -25.0235428646925
+ vertex -142.94182610499792 -38.71383334985839 -24.30000000000006
+ endloop
+endfacet
+facet normal 0.4619397662556422 0.8001031451912644 -0.38268343236509395
+ outer loop
+ vertex -143.09167673875484 -38.97338226107182 -25.0235428646925
+ vertex -139.4777244898602 -40.713833349858334 -24.30000000000005
+ vertex -139.62757512361713 -40.97338226107177 -25.02354286469249
+ endloop
+endfacet
+facet normal 0.3966766701456185 0.6870641468694525 -0.6087614290087174
+ outer loop
+ vertex -139.23934655596335 -40.30095065694573 -23.678679656440412
+ vertex -142.94182610499792 -38.71383334985839 -24.30000000000006
+ vertex -142.70344817110106 -38.30095065694578 -23.678679656440423
+ endloop
+endfacet
+facet normal 0.3966766701456185 0.6870641468694525 -0.6087614290087174
+ outer loop
+ vertex -142.94182610499792 -38.71383334985839 -24.30000000000006
+ vertex -139.23934655596335 -40.30095065694573 -23.678679656440412
+ vertex -139.4777244898602 -40.713833349858334 -24.30000000000005
+ endloop
+endfacet
+facet normal 0.3043807145043611 0.5272028623656717 -0.7933533402912333
+ outer loop
+ vertex -139.23934655596335 -40.30095065694573 -23.678679656440412
+ vertex -142.39278799932126 -37.76287145553506 -23.20192378864675
+ vertex -138.92868638418352 -39.76287145553501 -23.201923788646738
+ endloop
+endfacet
+facet normal 0.3043807145043611 0.5272028623656717 -0.7933533402912333
+ outer loop
+ vertex -142.39278799932126 -37.76287145553506 -23.20192378864675
+ vertex -139.23934655596335 -40.30095065694573 -23.678679656440412
+ vertex -142.70344817110106 -38.30095065694578 -23.678679656440423
+ endloop
+endfacet
+facet normal 0.19134171618254506 0.331413574035593 -0.9238795325112863
+ outer loop
+ vertex -138.92868638418352 -39.76287145553501 -23.201923788646738
+ vertex -142.03101656697504 -37.13626495398444 -22.902222521132856
+ vertex -138.56691495183733 -39.13626495398439 -22.902222521132845
+ endloop
+endfacet
+facet normal 0.19134171618254506 0.331413574035593 -0.9238795325112863
+ outer loop
+ vertex -142.03101656697504 -37.13626495398444 -22.902222521132856
+ vertex -138.92868638418352 -39.76287145553501 -23.201923788646738
+ vertex -142.39278799932126 -37.76287145553506 -23.20192378864675
+ endloop
+endfacet
+facet normal 0.06526309611002205 0.1130389983218099 -0.9914448613738113
+ outer loop
+ vertex -138.56691495183733 -39.13626495398439 -22.902222521132845
+ vertex -141.64278799932123 -36.4638333498584 -22.800000000000065
+ vertex -138.17868638418352 -38.46383334985837 -22.800000000000054
+ endloop
+endfacet
+facet normal 0.06526309611002205 0.1130389983218099 -0.9914448613738113
+ outer loop
+ vertex -141.64278799932123 -36.4638333498584 -22.800000000000065
+ vertex -138.56691495183733 -39.13626495398439 -22.902222521132845
+ vertex -142.03101656697504 -37.13626495398444 -22.902222521132856
+ endloop
+endfacet
+facet normal -0.0652630961100219 -0.11303899832180783 -0.9914448613738115
+ outer loop
+ vertex -138.17868638418352 -38.46383334985837 -22.800000000000054
+ vertex -141.25455943166747 -35.79140174573234 -22.902222521132856
+ vertex -137.79045781652974 -37.791401745732315 -22.902222521132845
+ endloop
+endfacet
+facet normal -0.0652630961100219 -0.11303899832180783 -0.9914448613738115
+ outer loop
+ vertex -141.25455943166747 -35.79140174573234 -22.902222521132856
+ vertex -138.17868638418352 -38.46383334985837 -22.800000000000054
+ vertex -141.64278799932123 -36.4638333498584 -22.800000000000065
+ endloop
+endfacet
+facet normal -0.1913417161825478 -0.3314135740355961 -0.9238795325112847
+ outer loop
+ vertex -137.79045781652974 -37.791401745732315 -22.902222521132845
+ vertex -140.89278799932126 -35.164795244181725 -23.20192378864675
+ vertex -137.42868638418352 -37.164795244181704 -23.201923788646738
+ endloop
+endfacet
+facet normal -0.1913417161825478 -0.3314135740355961 -0.9238795325112847
+ outer loop
+ vertex -140.89278799932126 -35.164795244181725 -23.20192378864675
+ vertex -137.79045781652974 -37.791401745732315 -22.902222521132845
+ vertex -141.25455943166747 -35.79140174573234 -22.902222521132856
+ endloop
+endfacet
+facet normal -0.3043807145043611 -0.52720286236567 -0.7933533402912345
+ outer loop
+ vertex -137.42868638418352 -37.164795244181704 -23.201923788646738
+ vertex -140.5821278275414 -34.62671604277101 -23.678679656440423
+ vertex -137.1180262124037 -36.62671604277098 -23.678679656440412
+ endloop
+endfacet
+facet normal -0.3043807145043611 -0.52720286236567 -0.7933533402912345
+ outer loop
+ vertex -140.5821278275414 -34.62671604277101 -23.678679656440423
+ vertex -137.42868638418352 -37.164795244181704 -23.201923788646738
+ vertex -140.89278799932126 -35.164795244181725 -23.20192378864675
+ endloop
+endfacet
+facet normal -0.39667667014561947 -0.6870641468694532 -0.608761429008716
+ outer loop
+ vertex -136.87964827850686 -36.213833349858376 -24.300000000000058
+ vertex -140.5821278275414 -34.62671604277101 -23.678679656440423
+ vertex -140.34374989364457 -34.2138333498584 -24.300000000000068
+ endloop
+endfacet
+facet normal -0.39667667014561947 -0.6870641468694532 -0.608761429008716
+ outer loop
+ vertex -140.5821278275414 -34.62671604277101 -23.678679656440423
+ vertex -136.87964827850686 -36.213833349858376 -24.300000000000058
+ vertex -137.1180262124037 -36.62671604277098 -23.678679656440412
+ endloop
+endfacet
+facet normal -0.46193976625564215 -0.8001031451912632 -0.38268343236509644
+ outer loop
+ vertex -136.7297976447499 -35.95428443864494 -25.02354286469249
+ vertex -140.34374989364457 -34.2138333498584 -24.300000000000068
+ vertex -140.19389925988764 -33.95428443864497 -25.0235428646925
+ endloop
+endfacet
+facet normal -0.46193976625564215 -0.8001031451912632 -0.38268343236509644
+ outer loop
+ vertex -140.34374989364457 -34.2138333498584 -24.300000000000068
+ vertex -136.7297976447499 -35.95428443864494 -25.02354286469249
+ vertex -136.87964827850686 -36.213833349858376 -24.300000000000058
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -165.44278799932127 -77.68664256999762 -62.600000000000065
+ vertex -157.9516070444238 -64.71153654742285 -55.531851652578204
+ vertex -137.7974885377005 -29.803579312013984 -62.60000000000003
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -157.9516070444238 -64.71153654742285 -55.531851652578204
+ vertex -165.44278799932127 -77.68664256999762 -62.600000000000065
+ vertex -158.19278799932127 -65.12927421512327 -55.33205080756894
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -158.19278799932127 -65.12927421512327 -55.33205080756894
+ vertex -165.44278799932127 -77.68664256999762 -62.600000000000065
+ vertex -158.39989478050782 -65.4879936827304 -55.01421356237316
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -158.39989478050782 -65.4879936827304 -55.01421356237316
+ vertex -165.44278799932127 -77.68664256999762 -62.600000000000065
+ vertex -158.55881340310572 -65.76324881133884 -54.60000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -158.55881340310572 -65.76324881133884 -54.60000000000006
+ vertex -165.44278799932127 -77.68664256999762 -62.600000000000065
+ vertex -158.65871382561033 -65.93628141881445 -54.117638090205105
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -158.65871382561033 -65.93628141881445 -54.117638090205105
+ vertex -165.44278799932127 -77.68664256999762 -62.600000000000065
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -137.7974885377005 -29.803579312013984 -62.60000000000003
+ vertex -157.9516070444238 -64.71153654742285 -55.531851652578204
+ vertex -157.6927879993213 -64.26324881133883 -55.600000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -158.65871382561033 -65.93628141881445 -54.117638090205105
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -158.69278799932127 -65.9952996189077 -53.60000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -158.69278799932127 -65.9952996189077 -53.60000000000006
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -158.69278799932127 -65.9952996189077 -51.60000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -158.69278799932127 -65.9952996189077 -51.60000000000005
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -158.65871382561033 -65.93628141881445 -51.082361909795004
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -158.65871382561033 -65.93628141881445 -51.082361909795004
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -158.55881340310572 -65.76324881133884 -50.600000000000044
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -158.55881340310572 -65.76324881133884 -50.600000000000044
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -158.39989478050782 -65.4879936827304 -50.18578643762695
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -158.39989478050782 -65.4879936827304 -50.18578643762695
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -158.19278799932127 -65.1292742151233 -49.867949192431176
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -158.19278799932127 -65.1292742151233 -49.867949192431176
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -157.9516070444238 -64.71153654742285 -49.668148347421905
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -157.9516070444238 -64.71153654742285 -49.668148347421905
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -157.6927879993213 -64.26324881133883 -49.600000000000044
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -157.6927879993213 -64.26324881133883 -49.600000000000044
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -145.29278799932126 -42.78581879748475 -49.600000000000044
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -145.29278799932126 -42.78581879748475 -49.600000000000044
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -158.39989478050782 -65.48799368273042 -15.414213562373153
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -145.29278799932126 -42.78581879748475 -49.600000000000044
+ vertex -158.39989478050782 -65.48799368273042 -15.414213562373153
+ vertex -142.7034481711011 -38.30095065694579 -41.92132034355971
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -145.29278799932126 -42.78581879748475 -49.600000000000044
+ vertex -142.7034481711011 -38.30095065694579 -41.92132034355971
+ vertex -142.39278799932126 -37.76287145553507 -42.39807621135338
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -145.29278799932126 -42.78581879748475 -49.600000000000044
+ vertex -142.39278799932126 -37.76287145553507 -42.39807621135338
+ vertex -142.031016566975 -37.13626495398446 -42.697777478867266
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -145.29278799932126 -42.78581879748475 -49.600000000000044
+ vertex -142.031016566975 -37.13626495398446 -42.697777478867266
+ vertex -141.64278799932123 -36.4638333498584 -42.80000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -142.7034481711011 -38.30095065694579 -41.92132034355971
+ vertex -158.39989478050782 -65.48799368273042 -15.414213562373153
+ vertex -142.94182610499792 -38.7138333498584 -41.30000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -142.94182610499792 -38.7138333498584 -41.30000000000006
+ vertex -158.39989478050782 -65.48799368273042 -15.414213562373153
+ vertex -143.09167673875487 -38.973382261071826 -40.57645713530762
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -143.09167673875487 -38.973382261071826 -40.57645713530762
+ vertex -158.39989478050782 -65.48799368273042 -15.414213562373153
+ vertex -143.14278799932126 -39.06190956121171 -39.80000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -143.14278799932126 -39.06190956121171 -39.80000000000006
+ vertex -158.39989478050782 -65.48799368273042 -15.414213562373153
+ vertex -158.1927879993213 -65.12927421512326 -15.732050807568937
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -143.14278799932126 -39.06190956121171 -39.80000000000006
+ vertex -158.1927879993213 -65.12927421512326 -15.732050807568937
+ vertex -157.9516070444238 -64.71153654742285 -15.931851652578198
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -143.14278799932126 -39.06190956121171 -39.80000000000006
+ vertex -157.9516070444238 -64.71153654742285 -15.931851652578198
+ vertex -143.14278799932126 -39.06190956121171 -25.80000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -143.14278799932126 -39.06190956121171 -25.80000000000006
+ vertex -157.9516070444238 -64.71153654742285 -15.931851652578198
+ vertex -143.09167673875484 -38.97338226107182 -25.0235428646925
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -143.09167673875484 -38.97338226107182 -25.0235428646925
+ vertex -157.9516070444238 -64.71153654742285 -15.931851652578198
+ vertex -142.94182610499792 -38.71383334985839 -24.30000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -142.94182610499792 -38.71383334985839 -24.30000000000006
+ vertex -157.9516070444238 -64.71153654742285 -15.931851652578198
+ vertex -142.70344817110106 -38.30095065694578 -23.678679656440423
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -142.70344817110106 -38.30095065694578 -23.678679656440423
+ vertex -157.9516070444238 -64.71153654742285 -15.931851652578198
+ vertex -142.39278799932126 -37.76287145553506 -23.20192378864675
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -142.39278799932126 -37.76287145553506 -23.20192378864675
+ vertex -157.9516070444238 -64.71153654742285 -15.931851652578198
+ vertex -142.03101656697504 -37.13626495398444 -22.902222521132856
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -142.03101656697504 -37.13626495398444 -22.902222521132856
+ vertex -157.9516070444238 -64.71153654742285 -15.931851652578198
+ vertex -141.64278799932123 -36.4638333498584 -22.800000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -141.64278799932123 -36.4638333498584 -22.800000000000065
+ vertex -157.9516070444238 -64.71153654742285 -15.931851652578198
+ vertex -157.6927879993213 -64.26324881133883 -16.00000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -158.39989478050782 -65.48799368273042 -15.414213562373153
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -158.55881340310575 -65.76324881133881 -15.000000000000057
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -158.55881340310575 -65.76324881133881 -15.000000000000057
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -158.65871382561036 -65.93628141881446 -14.517638090205098
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -158.65871382561036 -65.93628141881446 -14.517638090205098
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -158.69278799932127 -65.9952996189077 -14.000000000000059
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -158.69278799932127 -65.9952996189077 -14.000000000000059
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -158.69278799932127 -65.9952996189077 -12.000000000000046
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -158.69278799932127 -65.9952996189077 -12.000000000000046
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -158.65871382561036 -65.93628141881446 -11.482361909795012
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -158.65871382561036 -65.93628141881446 -11.482361909795012
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -158.55881340310575 -65.76324881133881 -11.000000000000048
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -158.55881340310575 -65.76324881133881 -11.000000000000048
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -158.39989478050782 -65.48799368273042 -10.58578643762696
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -158.39989478050782 -65.48799368273042 -10.58578643762696
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -158.1927879993213 -65.12927421512329 -10.267949192431178
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -158.1927879993213 -65.12927421512329 -10.267949192431178
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -157.9516070444238 -64.71153654742285 -10.068148347421912
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -157.9516070444238 -64.71153654742285 -10.068148347421912
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -157.6927879993213 -64.26324881133883 -10.00000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -157.6927879993213 -64.26324881133883 -10.00000000000005
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -145.2927879993213 -42.785818797484744 -10.00000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -137.7974885377005 -29.803579312013984 -62.60000000000003
+ vertex -140.14278799932126 -33.86575713850507 -39.80000000000006
+ vertex -137.7974885377005 -29.803579312013994 -3.0000000000000284
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -140.14278799932126 -33.86575713850507 -39.80000000000006
+ vertex -137.7974885377005 -29.803579312013984 -62.60000000000003
+ vertex -140.19389925988764 -33.954284438644954 -40.57645713530763
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -140.19389925988764 -33.954284438644954 -40.57645713530763
+ vertex -137.7974885377005 -29.803579312013984 -62.60000000000003
+ vertex -140.3437498936446 -34.21383334985839 -41.30000000000007
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -140.3437498936446 -34.21383334985839 -41.30000000000007
+ vertex -137.7974885377005 -29.803579312013984 -62.60000000000003
+ vertex -144.42676259553681 -41.285818797484765 -54.60000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -144.42676259553681 -41.285818797484765 -54.60000000000006
+ vertex -137.7974885377005 -29.803579312013984 -62.60000000000003
+ vertex -144.5856812181347 -41.56107392609316 -55.01421356237316
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -144.5856812181347 -41.56107392609316 -55.01421356237316
+ vertex -137.7974885377005 -29.803579312013984 -62.60000000000003
+ vertex -144.79278799932126 -41.91979339370032 -55.33205080756894
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -144.79278799932126 -41.91979339370032 -55.33205080756894
+ vertex -137.7974885377005 -29.803579312013984 -62.60000000000003
+ vertex -145.03396895421875 -42.33753106140071 -55.531851652578204
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -145.03396895421875 -42.33753106140071 -55.531851652578204
+ vertex -137.7974885377005 -29.803579312013984 -62.60000000000003
+ vertex -145.29278799932126 -42.78581879748475 -55.600000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -145.29278799932126 -42.78581879748475 -55.600000000000065
+ vertex -137.7974885377005 -29.803579312013984 -62.60000000000003
+ vertex -157.6927879993213 -64.26324881133883 -55.600000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -140.3437498936446 -34.21383334985839 -41.30000000000007
+ vertex -144.42676259553681 -41.285818797484765 -54.60000000000006
+ vertex -144.3268621730322 -41.11278619000914 -54.117638090205105
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -140.3437498936446 -34.21383334985839 -41.30000000000007
+ vertex -144.3268621730322 -41.11278619000914 -54.117638090205105
+ vertex -144.29278799932126 -41.05376798991587 -53.60000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -140.3437498936446 -34.21383334985839 -41.30000000000007
+ vertex -144.29278799932126 -41.05376798991587 -53.60000000000006
+ vertex -144.29278799932126 -41.05376798991587 -51.60000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -140.3437498936446 -34.21383334985839 -41.30000000000007
+ vertex -144.29278799932126 -41.05376798991587 -51.60000000000005
+ vertex -140.58212782754143 -34.626716042771 -41.921320343559714
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -140.58212782754143 -34.626716042771 -41.921320343559714
+ vertex -144.29278799932126 -41.05376798991587 -51.60000000000005
+ vertex -144.32686217303217 -41.11278619000915 -51.082361909795004
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -140.58212782754143 -34.626716042771 -41.921320343559714
+ vertex -144.32686217303217 -41.11278619000915 -51.082361909795004
+ vertex -144.42676259553681 -41.285818797484765 -50.600000000000044
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -140.58212782754143 -34.626716042771 -41.921320343559714
+ vertex -144.42676259553681 -41.285818797484765 -50.600000000000044
+ vertex -144.5856812181347 -41.56107392609316 -50.18578643762695
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -140.58212782754143 -34.626716042771 -41.921320343559714
+ vertex -144.5856812181347 -41.56107392609316 -50.18578643762695
+ vertex -144.79278799932126 -41.91979339370032 -49.867949192431176
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -140.58212782754143 -34.626716042771 -41.921320343559714
+ vertex -144.79278799932126 -41.91979339370032 -49.867949192431176
+ vertex -145.03396895421875 -42.33753106140071 -49.668148347421905
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -140.58212782754143 -34.626716042771 -41.921320343559714
+ vertex -145.03396895421875 -42.33753106140071 -49.668148347421905
+ vertex -145.29278799932126 -42.78581879748475 -49.600000000000044
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -140.58212782754143 -34.626716042771 -41.921320343559714
+ vertex -145.29278799932126 -42.78581879748475 -49.600000000000044
+ vertex -140.89278799932126 -35.16479524418173 -42.398076211353384
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -140.89278799932126 -35.16479524418173 -42.398076211353384
+ vertex -145.29278799932126 -42.78581879748475 -49.600000000000044
+ vertex -141.25455943166745 -35.79140174573236 -42.697777478867266
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -141.25455943166745 -35.79140174573236 -42.697777478867266
+ vertex -145.29278799932126 -42.78581879748475 -49.600000000000044
+ vertex -141.64278799932123 -36.4638333498584 -42.80000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -137.7974885377005 -29.803579312013994 -3.0000000000000284
+ vertex -140.14278799932126 -33.86575713850507 -39.80000000000006
+ vertex -140.14278799932123 -33.865757138505074 -25.800000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -137.7974885377005 -29.803579312013994 -3.0000000000000284
+ vertex -140.14278799932123 -33.865757138505074 -25.800000000000065
+ vertex -140.19389925988764 -33.95428443864497 -25.0235428646925
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -137.7974885377005 -29.803579312013994 -3.0000000000000284
+ vertex -140.19389925988764 -33.95428443864497 -25.0235428646925
+ vertex -140.34374989364457 -34.2138333498584 -24.300000000000068
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -137.7974885377005 -29.803579312013994 -3.0000000000000284
+ vertex -140.34374989364457 -34.2138333498584 -24.300000000000068
+ vertex -140.5821278275414 -34.62671604277101 -23.678679656440423
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -137.7974885377005 -29.803579312013994 -3.0000000000000284
+ vertex -140.5821278275414 -34.62671604277101 -23.678679656440423
+ vertex -140.89278799932126 -35.164795244181725 -23.20192378864675
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -137.7974885377005 -29.803579312013994 -3.0000000000000284
+ vertex -140.89278799932126 -35.164795244181725 -23.20192378864675
+ vertex -141.25455943166747 -35.79140174573234 -22.902222521132856
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -137.7974885377005 -29.803579312013994 -3.0000000000000284
+ vertex -141.25455943166747 -35.79140174573234 -22.902222521132856
+ vertex -141.64278799932123 -36.4638333498584 -22.800000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -137.7974885377005 -29.803579312013994 -3.0000000000000284
+ vertex -141.64278799932123 -36.4638333498584 -22.800000000000065
+ vertex -144.58568121813474 -41.56107392609316 -15.414213562373153
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -144.58568121813474 -41.56107392609316 -15.414213562373153
+ vertex -141.64278799932123 -36.4638333498584 -22.800000000000065
+ vertex -144.7927879993213 -41.91979339370032 -15.732050807568937
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -144.7927879993213 -41.91979339370032 -15.732050807568937
+ vertex -141.64278799932123 -36.4638333498584 -22.800000000000065
+ vertex -145.03396895421878 -42.33753106140071 -15.931851652578198
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -145.03396895421878 -42.33753106140071 -15.931851652578198
+ vertex -141.64278799932123 -36.4638333498584 -22.800000000000065
+ vertex -145.2927879993213 -42.785818797484744 -16.00000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -145.2927879993213 -42.785818797484744 -16.00000000000006
+ vertex -141.64278799932123 -36.4638333498584 -22.800000000000065
+ vertex -157.6927879993213 -64.26324881133883 -16.00000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -137.7974885377005 -29.803579312013994 -3.0000000000000284
+ vertex -144.58568121813474 -41.56107392609316 -15.414213562373153
+ vertex -144.42676259553681 -41.28581879748476 -15.000000000000057
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -137.7974885377005 -29.803579312013994 -3.0000000000000284
+ vertex -144.42676259553681 -41.28581879748476 -15.000000000000057
+ vertex -144.32686217303223 -41.11278619000914 -14.517638090205098
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -137.7974885377005 -29.803579312013994 -3.0000000000000284
+ vertex -144.32686217303223 -41.11278619000914 -14.517638090205098
+ vertex -144.2927879993213 -41.05376798991587 -14.000000000000059
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -137.7974885377005 -29.803579312013994 -3.0000000000000284
+ vertex -144.2927879993213 -41.05376798991587 -14.000000000000059
+ vertex -144.2927879993213 -41.05376798991587 -12.000000000000046
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -137.7974885377005 -29.803579312013994 -3.0000000000000284
+ vertex -144.2927879993213 -41.05376798991587 -12.000000000000046
+ vertex -144.3268621730322 -41.112786190009146 -11.482361909795012
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -137.7974885377005 -29.803579312013994 -3.0000000000000284
+ vertex -144.3268621730322 -41.112786190009146 -11.482361909795012
+ vertex -144.42676259553681 -41.28581879748476 -11.000000000000048
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -137.7974885377005 -29.803579312013994 -3.0000000000000284
+ vertex -144.42676259553681 -41.28581879748476 -11.000000000000048
+ vertex -144.58568121813474 -41.56107392609316 -10.58578643762696
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -137.7974885377005 -29.803579312013994 -3.0000000000000284
+ vertex -144.58568121813474 -41.56107392609316 -10.58578643762696
+ vertex -144.7927879993213 -41.91979339370032 -10.267949192431178
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -137.7974885377005 -29.803579312013994 -3.0000000000000284
+ vertex -144.7927879993213 -41.91979339370032 -10.267949192431178
+ vertex -145.03396895421878 -42.33753106140071 -10.068148347421912
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -137.7974885377005 -29.803579312013994 -3.0000000000000284
+ vertex -145.03396895421878 -42.33753106140071 -10.068148347421912
+ vertex -145.2927879993213 -42.785818797484744 -10.00000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844383 0.5000000000000009 -9.792648627520365e-17
+ outer loop
+ vertex -137.7974885377005 -29.803579312013994 -3.0000000000000284
+ vertex -145.2927879993213 -42.785818797484744 -10.00000000000005
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ endloop
+endfacet
+facet normal 0.8660254037844396 0.49999999999999845 1.8925949547301314e-16
+ outer loop
+ vertex -93.55470053837932 -102.43433599533697 -3.000000000000062
+ vertex -94.70940107675855 -100.43433599533697 -62.600000000000065
+ vertex -94.70940107675855 -100.43433599533697 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.8660254037844396 0.49999999999999845 1.8925949547301314e-16
+ outer loop
+ vertex -94.70940107675855 -100.43433599533697 -62.600000000000065
+ vertex -93.55470053837932 -102.43433599533697 -3.000000000000062
+ vertex -93.5547005383793 -102.43433599533697 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9202212155149957 0.39139866442810445 1.878833171115838e-16
+ outer loop
+ vertex -93.33453298111431 -102.951974085542 -3.000000000000062
+ vertex -93.5547005383793 -102.43433599533697 -62.600000000000065
+ vertex -93.55470053837932 -102.43433599533697 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9202212155149957 0.39139866442810445 1.878833171115838e-16
+ outer loop
+ vertex -93.5547005383793 -102.43433599533697 -62.600000000000065
+ vertex -93.33453298111431 -102.951974085542 -3.000000000000062
+ vertex -93.3345329811143 -102.951974085542 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.7331906391044425 -0.6800231516129576 4.897386689705101e-17
+ outer loop
+ vertex -93.41461187235464 -103.84854955771006 -3.000000000000062
+ vertex -93.70940107675855 -104.16638680290583 -62.600000000000065
+ vertex -93.41461187235463 -103.84854955771006 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.7331906391044425 -0.6800231516129576 4.897386689705101e-17
+ outer loop
+ vertex -93.70940107675855 -104.16638680290583 -62.600000000000065
+ vertex -93.41461187235464 -103.84854955771006 -3.000000000000062
+ vertex -93.70940107675857 -104.16638680290583 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9951296050077003 0.09857519585178756 1.725215534807415e-16
+ outer loop
+ vertex -93.28675134594819 -103.43433599533697 -3.000000000000062
+ vertex -93.3345329811143 -102.951974085542 -62.600000000000065
+ vertex -93.33453298111431 -102.951974085542 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9951296050077003 0.09857519585178756 1.725215534807415e-16
+ outer loop
+ vertex -93.3345329811143 -102.951974085542 -62.600000000000065
+ vertex -93.28675134594819 -103.43433599533697 -3.000000000000062
+ vertex -93.28675134594819 -103.43433599533697 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.7990717941595379 0.6012356175233279 1.8784422362071584e-16
+ outer loop
+ vertex -135.488087460942 -29.803579312013987 -3.0000000000000284
+ vertex -135.82629141839354 -29.3540895692308 -62.60000000000003
+ vertex -135.82629141839354 -29.35408956923081 -3.0000000000000284
+ endloop
+endfacet
+facet normal 0.7990717941595379 0.6012356175233279 1.8784422362071584e-16
+ outer loop
+ vertex -135.82629141839354 -29.3540895692308 -62.60000000000003
+ vertex -135.488087460942 -29.803579312013987 -3.0000000000000284
+ vertex -135.488087460942 -29.803579312013984 -62.60000000000003
+ endloop
+endfacet
+facet normal -0.7990717941595309 0.6012356175233369 -7.411378289433379e-17
+ outer loop
+ vertex -137.7974885377005 -29.803579312013994 -3.0000000000000284
+ vertex -137.45928458024898 -29.354089569230812 -62.60000000000003
+ vertex -137.7974885377005 -29.803579312013984 -62.60000000000003
+ endloop
+endfacet
+facet normal -0.7990717941595309 0.6012356175233369 -7.411378289433379e-17
+ outer loop
+ vertex -137.45928458024898 -29.354089569230812 -62.60000000000003
+ vertex -137.7974885377005 -29.803579312013994 -3.0000000000000284
+ vertex -137.45928458024898 -29.35408956923082 -3.0000000000000284
+ endloop
+endfacet
+facet normal -0.22232200490613085 0.97497329508788 5.601884531566124e-17
+ outer loop
+ vertex -137.06543773013163 -29.07152850444512 -3.0000000000000284
+ vertex -136.64278799932126 -28.9751521872678 -62.60000000000003
+ vertex -137.0654377301316 -29.071528504445116 -62.60000000000003
+ endloop
+endfacet
+facet normal -0.22232200490613085 0.97497329508788 5.601884531566124e-17
+ outer loop
+ vertex -136.64278799932126 -28.9751521872678 -62.60000000000003
+ vertex -137.06543773013163 -29.07152850444512 -3.0000000000000284
+ vertex -136.64278799932126 -28.975152187267806 -3.0000000000000284
+ endloop
+endfacet
+facet normal 0.41219617871316877 -0.9110951159205396 -1.1646732101374687e-17
+ outer loop
+ vertex -93.70940107675857 -104.16638680290583 -3.000000000000062
+ vertex -94.15102956204204 -104.36618764791508 -62.600000000000065
+ vertex -93.70940107675855 -104.16638680290583 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.41219617871316877 -0.9110951159205396 -1.1646732101374687e-17
+ outer loop
+ vertex -94.15102956204204 -104.36618764791508 -62.600000000000065
+ vertex -93.70940107675857 -104.16638680290583 -3.000000000000062
+ vertex -94.15102956204204 -104.36618764791508 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.5829334262945306 0.8125199200687447 -1.8665829314470092e-17
+ outer loop
+ vertex -137.45928458024898 -29.35408956923082 -3.0000000000000284
+ vertex -137.0654377301316 -29.071528504445116 -62.60000000000003
+ vertex -137.45928458024898 -29.354089569230812 -62.60000000000003
+ endloop
+endfacet
+facet normal -0.5829334262945306 0.8125199200687447 -1.8665829314470092e-17
+ outer loop
+ vertex -137.0654377301316 -29.071528504445116 -62.60000000000003
+ vertex -137.45928458024898 -29.35408956923082 -3.0000000000000284
+ vertex -137.06543773013163 -29.07152850444512 -3.0000000000000284
+ endloop
+endfacet
+facet normal 0.22232200490612147 0.9749732950878822 1.2888213579542957e-16
+ outer loop
+ vertex -136.64278799932126 -28.975152187267806 -3.0000000000000284
+ vertex -136.22013826851088 -29.07152850444511 -62.60000000000003
+ vertex -136.64278799932126 -28.9751521872678 -62.60000000000003
+ endloop
+endfacet
+facet normal 0.22232200490612147 0.9749732950878822 1.2888213579542957e-16
+ outer loop
+ vertex -136.22013826851088 -29.07152850444511 -62.60000000000003
+ vertex -136.64278799932126 -28.975152187267806 -3.0000000000000284
+ vertex -136.22013826851088 -29.071528504445116 -3.0000000000000284
+ endloop
+endfacet
+facet normal 0.5829334262945255 0.8125199200687483 1.725215534807415e-16
+ outer loop
+ vertex -135.82629141839354 -29.35408956923081 -3.0000000000000284
+ vertex -136.22013826851088 -29.07152850444511 -62.60000000000003
+ vertex -136.22013826851088 -29.071528504445116 -3.0000000000000284
+ endloop
+endfacet
+facet normal 0.5829334262945255 0.8125199200687483 1.725215534807415e-16
+ outer loop
+ vertex -136.22013826851088 -29.07152850444511 -62.60000000000003
+ vertex -135.82629141839354 -29.35408956923081 -3.0000000000000284
+ vertex -135.82629141839354 -29.3540895692308 -62.60000000000003
+ endloop
+endfacet
+facet normal 0.9555126440105939 -0.29495014347493387 1.2865950612637304e-16
+ outer loop
+ vertex -93.28675134594819 -103.43433599533697 -3.000000000000062
+ vertex -93.41461187235463 -103.84854955771006 -62.600000000000065
+ vertex -93.28675134594819 -103.43433599533697 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9555126440105939 -0.29495014347493387 1.2865950612637304e-16
+ outer loop
+ vertex -93.41461187235463 -103.84854955771006 -62.600000000000065
+ vertex -93.28675134594819 -103.43433599533697 -3.000000000000062
+ vertex -93.41461187235464 -103.84854955771006 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.12114942135544937 -0.9926342819514344 -3.711855016837831e-17
+ outer loop
+ vertex -94.15102956204204 -104.36618764791508 -3.000000000000062
+ vertex -94.70940107675858 -104.43433599533697 -62.600000000000065
+ vertex -94.15102956204204 -104.36618764791508 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.12114942135544937 -0.9926342819514344 -3.711855016837831e-17
+ outer loop
+ vertex -94.70940107675858 -104.43433599533697 -62.600000000000065
+ vertex -94.15102956204204 -104.36618764791508 -3.000000000000062
+ vertex -94.70940107675858 -104.43433599533697 -3.000000000000062
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -174.9278333507478 -91.46835223218358 -62.600000000000065
+ vertex -171.37500000000006 -87.10772186398499 -62.600000000000065
+ vertex -170.37500000000006 -88.83977267155386 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -164.79940691211775 -83.31130142461471 -62.600000000000065
+ vertex -168.13557599864257 -82.35068819883378 -62.60000000000008
+ vertex -166.9427879993213 -80.28471878135092 -62.60000000000008
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -168.13557599864257 -82.35068819883378 -62.60000000000008
+ vertex -164.79940691211775 -83.31130142461471 -62.600000000000065
+ vertex -171.37500000000006 -87.10772186398499 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -168.13557599864257 -82.35068819883378 -62.60000000000008
+ vertex -171.37500000000006 -87.10772186398499 -62.600000000000065
+ vertex -183.4221041290405 -91.17636932989382 -62.60000000000009
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -183.4221041290405 -91.17636932989382 -62.60000000000009
+ vertex -171.37500000000006 -87.10772186398499 -62.600000000000065
+ vertex -175.9278333507478 -89.73630142461471 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -175.9278333507478 -89.73630142461471 -62.600000000000065
+ vertex -171.37500000000006 -87.10772186398499 -62.600000000000065
+ vertex -174.9278333507478 -91.46835223218358 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -183.4221041290405 -91.17636932989382 -62.60000000000009
+ vertex -175.9278333507478 -89.73630142461471 -62.600000000000065
+ vertex -182.55292768969875 -93.5613014246147 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -135.488087460942 -29.803579312013984 -62.60000000000003
+ vertex -134.33338692256274 -31.80357931201398 -62.60000000000003
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -135.488087460942 -29.803579312013984 -62.60000000000003
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -135.82629141839354 -29.3540895692308 -62.60000000000003
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -135.82629141839354 -29.3540895692308 -62.60000000000003
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -136.22013826851088 -29.07152850444511 -62.60000000000003
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -136.22013826851088 -29.07152850444511 -62.60000000000003
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -136.64278799932126 -28.9751521872678 -62.60000000000003
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -136.64278799932126 -28.9751521872678 -62.60000000000003
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -137.0654377301316 -29.071528504445116 -62.60000000000003
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -137.0654377301316 -29.071528504445116 -62.60000000000003
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -137.45928458024898 -29.354089569230812 -62.60000000000003
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -137.45928458024898 -29.354089569230812 -62.60000000000003
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -137.7974885377005 -29.803579312013984 -62.60000000000003
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -137.7974885377005 -29.803579312013984 -62.60000000000003
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -165.44278799932127 -77.68664256999762 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -165.44278799932127 -77.68664256999762 -62.600000000000065
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -149.13659139480453 -57.567308556101146 -62.60000000000005
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -149.13659139480453 -57.567308556101146 -62.60000000000005
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -148.63427854169413 -57.064995702990736 -62.60000000000005
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -148.63427854169413 -57.064995702990736 -62.60000000000005
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -148.05237123795203 -56.65753982237123 -62.60000000000005
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -148.05237123795203 -56.65753982237123 -62.60000000000005
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -147.4085504425431 -56.357321254992605 -62.60000000000005
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -147.4085504425431 -56.357321254992605 -62.60000000000005
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -146.72237832454684 -56.173461990106745 -62.60000000000005
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -146.72237832454684 -56.173461990106745 -62.60000000000005
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -146.0147038765487 -56.111548498439944 -62.60000000000005
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -146.0147038765487 -56.111548498439944 -62.60000000000005
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -145.30702942855055 -56.173461990106745 -62.60000000000005
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -145.30702942855055 -56.173461990106745 -62.60000000000005
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -144.6208573105543 -56.357321254992605 -62.60000000000005
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -144.6208573105543 -56.357321254992605 -62.60000000000005
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -144.05167483247536 -56.603058209358565 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -144.05167483247536 -56.603058209358565 -62.600000000000065
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -143.4299095783621 -57.03842292728552 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -143.4299095783621 -57.03842292728552 -62.600000000000065
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -143.3951292114033 -57.06499570299075 -62.600000000000044
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -143.3951292114033 -57.06499570299075 -62.600000000000044
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -142.89319062544632 -57.575141880201315 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -142.89319062544632 -57.575141880201315 -62.600000000000065
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -142.48536047767334 -58.14921585984326 -62.600000000000044
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -142.48536047767334 -58.14921585984326 -62.600000000000044
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ vertex -121.60137838360576 -94.32133391112701 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -144.05167483247536 -56.603058209358565 -62.600000000000065
+ vertex -143.4299095783621 -57.03842292728552 -62.600000000000065
+ vertex -143.97703651514536 -56.65753982237123 -62.60000000000005
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -165.44278799932127 -77.68664256999762 -62.600000000000065
+ vertex -149.13659139480453 -57.567308556101146 -62.60000000000005
+ vertex -149.54404727542408 -58.14921585984325 -62.60000000000005
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -165.44278799932127 -77.68664256999762 -62.600000000000065
+ vertex -149.54404727542408 -58.14921585984325 -62.60000000000005
+ vertex -162.24146450794694 -80.14178763147345 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -165.44278799932127 -77.68664256999762 -62.600000000000065
+ vertex -162.24146450794694 -80.14178763147345 -62.600000000000065
+ vertex -150.00000000000006 -104.43433599533697 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -165.44278799932127 -77.68664256999762 -62.600000000000065
+ vertex -150.00000000000006 -104.43433599533697 -62.600000000000065
+ vertex -154.54940691211777 -101.06482220219569 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -154.54940691211777 -101.06482220219569 -62.600000000000065
+ vertex -150.00000000000006 -104.43433599533697 -62.600000000000065
+ vertex -153.00000000000006 -104.43433599533697 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -153.00000000000006 -104.43433599533697 -62.600000000000065
+ vertex -150.00000000000006 -104.43433599533697 -62.600000000000065
+ vertex -150.00000000000009 -121.1247965983122 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -153.00000000000006 -104.43433599533697 -62.600000000000065
+ vertex -150.00000000000009 -121.1247965983122 -62.600000000000065
+ vertex -152.83120430088542 -120.88086243345154 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -152.83120430088542 -120.88086243345154 -62.600000000000065
+ vertex -150.00000000000009 -121.1247965983122 -62.600000000000065
+ vertex -150.00000000000006 -124.13030787576977 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -152.83120430088542 -120.88086243345154 -62.600000000000065
+ vertex -150.00000000000006 -124.13030787576977 -62.600000000000065
+ vertex -151.60819479272953 -124.0271219175925 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -152.83120430088542 -120.88086243345154 -62.600000000000065
+ vertex -151.60819479272953 -124.0271219175925 -62.600000000000065
+ vertex -154.30102097334645 -120.66211067883884 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -154.30102097334645 -120.66211067883884 -62.600000000000065
+ vertex -151.60819479272953 -124.0271219175925 -62.600000000000065
+ vertex -153.2106669582428 -123.85676701721613 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -154.30102097334645 -120.66211067883884 -62.600000000000065
+ vertex -153.2106669582428 -123.85676701721613 -62.600000000000065
+ vertex -155.760402807068 -120.38207845891769 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -155.760402807068 -120.38207845891769 -62.600000000000065
+ vertex -153.2106669582428 -123.85676701721613 -62.600000000000065
+ vertex -154.8046123096754 -123.61954128089435 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -155.760402807068 -120.38207845891769 -62.600000000000065
+ vertex -154.8046123096754 -123.61954128089435 -62.600000000000065
+ vertex -157.20679601081653 -120.04125580570843 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -157.20679601081653 -120.04125580570843 -62.600000000000065
+ vertex -154.8046123096754 -123.61954128089435 -62.600000000000065
+ vertex -156.38724158134562 -123.31585983302554 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -157.20679601081653 -120.04125580570843 -62.600000000000065
+ vertex -156.38724158134562 -123.31585983302554 -62.600000000000065
+ vertex -158.63766952233073 -119.64023912920041 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -158.63766952233073 -119.64023912920041 -62.600000000000065
+ vertex -156.38724158134562 -123.31585983302554 -62.600000000000065
+ vertex -157.9557853097267 -122.94625408972136 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -158.63766952233073 -119.64023912920041 -62.600000000000065
+ vertex -157.9557853097267 -122.94625408972136 -62.600000000000065
+ vertex -160.05051943746045 -119.17973017368655 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -160.05051943746045 -119.17973017368655 -62.600000000000065
+ vertex -157.9557853097267 -122.94625408972136 -62.600000000000065
+ vertex -161.44287339178103 -118.66053478977186 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -161.44287339178103 -118.66053478977186 -62.600000000000065
+ vertex -157.9557853097267 -122.94625408972136 -62.600000000000065
+ vertex -159.50749867976714 -122.51137082887449 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -161.44287339178103 -118.66053478977186 -62.600000000000065
+ vertex -159.50749867976714 -122.51137082887449 -62.600000000000065
+ vertex -162.812294887016 -118.08356152420488 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -162.812294887016 -118.08356152420488 -62.600000000000065
+ vertex -159.50749867976714 -122.51137082887449 -62.600000000000065
+ vertex -161.03966632807823 -122.01197105835386 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -162.812294887016 -118.08356152420488 -62.600000000000065
+ vertex -161.03966632807823 -122.01197105835386 -62.600000000000065
+ vertex -164.1563875546969 -117.4498200300001 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -164.1563875546969 -117.4498200300001 -62.600000000000065
+ vertex -161.03966632807823 -122.01197105835386 -62.600000000000065
+ vertex -162.54960709458356 -121.44892868430702 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -164.1563875546969 -117.4498200300001 -62.600000000000065
+ vertex -162.54960709458356 -121.44892868430702 -62.600000000000065
+ vertex -165.47279934959988 -116.76041929963284 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -165.47279934959988 -116.76041929963284 -62.600000000000065
+ vertex -162.54960709458356 -121.44892868430702 -62.600000000000065
+ vertex -164.03467871431613 -120.82322898190026 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -165.47279934959988 -116.76041929963284 -62.600000000000065
+ vertex -164.03467871431613 -120.82322898190026 -62.600000000000065
+ vertex -166.7592266656199 -116.01656572439911 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -166.7592266656199 -116.01656572439911 -62.600000000000065
+ vertex -164.03467871431613 -120.82322898190026 -62.600000000000065
+ vertex -168.01341836688118 -115.21956098333553 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -168.01341836688118 -115.21956098333553 -62.600000000000065
+ vertex -164.03467871431613 -120.82322898190026 -62.600000000000065
+ vertex -165.492282441152 -120.135966871173 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -168.01341836688118 -115.21956098333553 -62.600000000000065
+ vertex -165.492282441152 -120.135966871173 -62.600000000000065
+ vertex -169.23317972702915 -114.37079976539466 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -169.23317972702915 -114.37079976539466 -62.600000000000065
+ vertex -165.492282441152 -120.135966871173 -62.600000000000065
+ vertex -166.91986759538986 -119.38834500102287 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -169.23317972702915 -114.37079976539466 -62.600000000000065
+ vertex -166.91986759538986 -119.38834500102287 -62.600000000000065
+ vertex -170.4163762698104 -113.47176732886022 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -170.4163762698104 -113.47176732886022 -62.600000000000065
+ vertex -166.91986759538986 -119.38834500102287 -62.600000000000065
+ vertex -168.31493602721866 -118.5816716446749 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -170.4163762698104 -113.47176732886022 -62.600000000000065
+ vertex -168.31493602721866 -118.5816716446749 -62.600000000000065
+ vertex -170.67210412904052 -113.26001712639697 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -170.67210412904052 -113.26001712639697 -62.600000000000065
+ vertex -168.31493602721866 -118.5816716446749 -62.600000000000065
+ vertex -172.30292768969878 -111.31482220219567 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -172.30292768969878 -111.31482220219567 -62.600000000000065
+ vertex -168.31493602721866 -118.5816716446749 -62.600000000000065
+ vertex -182.55292768969875 -93.5613014246147 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -182.55292768969875 -93.5613014246147 -62.600000000000065
+ vertex -168.31493602721866 -118.5816716446749 -62.600000000000065
+ vertex -186.85220808112246 -86.47417461358681 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -186.85220808112246 -86.47417461358681 -62.600000000000065
+ vertex -168.31493602721866 -118.5816716446749 -62.600000000000065
+ vertex -186.7837460938633 -88.08422144198268 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -186.7837460938633 -88.08422144198268 -62.600000000000065
+ vertex -168.31493602721866 -118.5816716446749 -62.600000000000065
+ vertex -169.6750464882625 -117.71735841031693 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -186.7837460938633 -88.08422144198268 -62.600000000000065
+ vertex -169.6750464882625 -117.71735841031693 -62.600000000000065
+ vertex -186.6480073251051 -89.68999627675343 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -186.6480073251051 -89.68999627675343 -62.600000000000065
+ vertex -169.6750464882625 -117.71735841031693 -62.600000000000065
+ vertex -170.99781890355263 -116.79691777090852 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -186.6480073251051 -89.68999627675343 -62.600000000000065
+ vertex -170.99781890355263 -116.79691777090852 -62.600000000000065
+ vertex -172.2809385364518 -115.82196041748443 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -186.6480073251051 -89.68999627675343 -62.600000000000065
+ vertex -172.2809385364518 -115.82196041748443 -62.600000000000065
+ vertex -186.44522930588298 -91.28868915165076 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -186.44522930588298 -91.28868915165076 -62.600000000000065
+ vertex -172.2809385364518 -115.82196041748443 -62.600000000000065
+ vertex -186.1757668800877 -92.8775024932399 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -186.1757668800877 -92.8775024932399 -62.600000000000065
+ vertex -172.2809385364518 -115.82196041748443 -62.600000000000065
+ vertex -173.522160039242 -114.79419244058579 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -186.1757668800877 -92.8775024932399 -62.600000000000065
+ vertex -173.522160039242 -114.79419244058579 -62.600000000000065
+ vertex -185.8400915835195 -94.4536560164098 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -185.8400915835195 -94.4536560164098 -62.600000000000065
+ vertex -173.522160039242 -114.79419244058579 -62.600000000000065
+ vertex -174.71931138228737 -113.7154123447499 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -185.8400915835195 -94.4536560164098 -62.600000000000065
+ vertex -174.71931138228737 -113.7154123447499 -62.600000000000065
+ vertex -175.87029765489726 -112.58750790128374 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -185.8400915835195 -94.4536560164098 -62.600000000000065
+ vertex -175.87029765489726 -112.58750790128374 -62.600000000000065
+ vertex -185.4387908187414 -96.0143915896302 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -185.4387908187414 -96.0143915896302 -62.600000000000065
+ vertex -175.87029765489726 -112.58750790128374 -62.600000000000065
+ vertex -176.97310473123767 -111.41245284482866 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -185.4387908187414 -96.0143915896302 -62.600000000000065
+ vertex -176.97310473123767 -111.41245284482866 -62.600000000000065
+ vertex -184.97256682717617 -97.55697806144177 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -184.97256682717617 -97.55697806144177 -62.600000000000065
+ vertex -176.97310473123767 -111.41245284482866 -62.600000000000065
+ vertex -178.0258027948761 -110.19230341949631 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -184.97256682717617 -97.55697806144177 -62.600000000000065
+ vertex -178.0258027948761 -110.19230341949631 -62.600000000000065
+ vertex -184.4422354602446 -99.07871603973354 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -184.4422354602446 -99.07871603973354 -62.600000000000065
+ vertex -178.0258027948761 -110.19230341949631 -62.600000000000065
+ vertex -179.0265497157926 -108.92919478062029 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -184.4422354602446 -99.07871603973354 -62.600000000000065
+ vertex -179.0265497157926 -108.92919478062029 -62.600000000000065
+ vertex -183.8487247516966 -100.57694261544428 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -183.8487247516966 -100.57694261544428 -62.600000000000065
+ vertex -179.0265497157926 -108.92919478062029 -62.600000000000065
+ vertex -179.97359427394684 -107.62533725842027 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -183.8487247516966 -100.57694261544428 -62.600000000000065
+ vertex -179.97359427394684 -107.62533725842027 -62.600000000000065
+ vertex -183.1930732936331 -102.04903602242166 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -183.1930732936331 -102.04903602242166 -62.600000000000065
+ vertex -179.97359427394684 -107.62533725842027 -62.600000000000065
+ vertex -180.8652792237608 -106.28301249011629 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -183.1930732936331 -102.04903602242166 -62.600000000000065
+ vertex -180.8652792237608 -106.28301249011629 -62.600000000000065
+ vertex -182.47642841905974 -103.4924202252848 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -182.47642841905974 -103.4924202252848 -62.600000000000065
+ vertex -180.8652792237608 -106.28301249011629 -62.600000000000065
+ vertex -181.7000441941546 -104.9045694272622 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -165.44278799932127 -77.68664256999762 -62.600000000000065
+ vertex -166.9427879993213 -80.28471878135092 -62.60000000000008
+ vertex -179.8971508823612 -69.34141226850998 -62.60000000000008
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -166.9427879993213 -80.28471878135092 -62.60000000000008
+ vertex -165.44278799932127 -77.68664256999762 -62.600000000000065
+ vertex -164.79940691211775 -83.31130142461471 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -164.79940691211775 -83.31130142461471 -62.600000000000065
+ vertex -165.44278799932127 -77.68664256999762 -62.600000000000065
+ vertex -154.54940691211777 -101.06482220219569 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -179.8971508823612 -69.34141226850998 -62.60000000000008
+ vertex -166.9427879993213 -80.28471878135092 -62.60000000000008
+ vertex -181.10149984918357 -71.91527419881089 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -179.8971508823612 -69.34141226850998 -62.60000000000008
+ vertex -181.10149984918357 -71.91527419881089 -62.600000000000065
+ vertex -182.50000000000003 -67.83865662978121 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -182.50000000000003 -67.83865662978121 -62.600000000000065
+ vertex -181.10149984918357 -71.91527419881089 -62.600000000000065
+ vertex -183.21473573526941 -69.28298715360737 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -183.21473573526941 -69.28298715360737 -62.600000000000065
+ vertex -181.10149984918357 -71.91527419881089 -62.600000000000065
+ vertex -181.64696360879708 -73.2975486533744 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -183.21473573526941 -69.28298715360737 -62.600000000000065
+ vertex -181.64696360879708 -73.2975486533744 -62.600000000000065
+ vertex -183.86844014664095 -70.75594620798753 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -183.86844014664095 -70.75594620798753 -62.600000000000065
+ vertex -181.64696360879708 -73.2975486533744 -62.600000000000065
+ vertex -182.13413950932804 -74.70142650515936 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -183.86844014664095 -70.75594620798753 -62.600000000000065
+ vertex -182.13413950932804 -74.70142650515936 -62.600000000000065
+ vertex -184.45996930827113 -72.25495624273319 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -184.45996930827113 -72.25495624273319 -62.600000000000065
+ vertex -182.13413950932804 -74.70142650515936 -62.600000000000065
+ vertex -182.56217503533784 -76.12445109007135 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -184.45996930827113 -72.25495624273319 -62.600000000000065
+ vertex -182.56217503533784 -76.12445109007135 -62.600000000000065
+ vertex -184.9882880955938 -73.77739412070684 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -184.9882880955938 -73.77739412070684 -62.600000000000065
+ vertex -182.56217503533784 -76.12445109007135 -62.600000000000065
+ vertex -182.93032116189778 -77.5641322388989 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -184.9882880955938 -73.77739412070684 -62.600000000000065
+ vertex -182.93032116189778 -77.5641322388989 -62.600000000000065
+ vertex -185.4524719966983 -75.32059570808373 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -185.4524719966983 -75.32059570808373 -62.600000000000065
+ vertex -182.93032116189778 -77.5641322388989 -62.600000000000065
+ vertex -183.2379336653174 -79.01795063489288 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -185.4524719966983 -75.32059570808373 -62.600000000000065
+ vertex -183.2379336653174 -79.01795063489288 -62.600000000000065
+ vertex -183.48447425047996 -80.48336222235157 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -185.4524719966983 -75.32059570808373 -62.600000000000065
+ vertex -183.48447425047996 -80.48336222235157 -62.600000000000065
+ vertex -185.85170873014454 -76.88186053635415 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -185.85170873014454 -76.88186053635415 -62.600000000000065
+ vertex -183.48447425047996 -80.48336222235157 -62.600000000000065
+ vertex -183.66951149281198 -81.95780265849699 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -185.85170873014454 -76.88186053635415 -62.600000000000065
+ vertex -183.66951149281198 -81.95780265849699 -62.600000000000065
+ vertex -186.1852996663851 -78.4584565279085 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -186.1852996663851 -78.4584565279085 -62.600000000000065
+ vertex -183.66951149281198 -81.95780265849699 -62.600000000000065
+ vertex -183.79272159323875 -83.43869180085144 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -186.1852996663851 -78.4584565279085 -62.600000000000065
+ vertex -183.79272159323875 -83.43869180085144 -62.600000000000065
+ vertex -186.4526610503061 -80.04762477693528 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -186.4526610503061 -80.04762477693528 -62.600000000000065
+ vertex -183.79272159323875 -83.43869180085144 -62.600000000000065
+ vertex -183.85388894480468 -84.92343822226248 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -186.4526610503061 -80.04762477693528 -62.600000000000065
+ vertex -183.85388894480468 -84.92343822226248 -62.600000000000065
+ vertex -186.65332502274777 -81.64658437726641 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -186.65332502274777 -81.64658437726641 -62.600000000000065
+ vertex -183.85388894480468 -84.92343822226248 -62.600000000000065
+ vertex -183.85290650996635 -86.40944374567493 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -186.65332502274777 -81.64658437726641 -62.600000000000065
+ vertex -183.85290650996635 -86.40944374567493 -62.600000000000065
+ vertex -183.78977600789938 -87.89410799071463 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -186.65332502274777 -81.64658437726641 -62.600000000000065
+ vertex -183.78977600789938 -87.89410799071463 -62.600000000000065
+ vertex -186.78694043921737 -83.25253728872076 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -186.78694043921737 -83.25253728872076 -62.600000000000065
+ vertex -183.78977600789938 -87.89410799071463 -62.600000000000065
+ vertex -183.6646079114895 -89.37483292412786 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -186.78694043921737 -83.25253728872076 -62.600000000000065
+ vertex -183.6646079114895 -89.37483292412786 -62.600000000000065
+ vertex -186.85327348436147 -84.86267323343132 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -186.85327348436147 -84.86267323343132 -62.600000000000065
+ vertex -183.6646079114895 -89.37483292412786 -62.600000000000065
+ vertex -183.4776212540151 -90.84902740611355 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -186.85327348436147 -84.86267323343132 -62.600000000000065
+ vertex -183.4776212540151 -90.84902740611355 -62.600000000000065
+ vertex -186.85220808112246 -86.47417461358681 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -186.85220808112246 -86.47417461358681 -62.600000000000065
+ vertex -183.4776212540151 -90.84902740611355 -62.600000000000065
+ vertex -183.4221041290405 -91.17636932989382 -62.60000000000009
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -186.85220808112246 -86.47417461358681 -62.600000000000065
+ vertex -183.4221041290405 -91.17636932989382 -62.60000000000009
+ vertex -182.55292768969875 -93.5613014246147 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -154.54940691211777 -101.06482220219569 -62.600000000000065
+ vertex -155.38557599864257 -104.43433599533697 -62.600000000000065
+ vertex -161.12500000000003 -104.86124264156595 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -155.38557599864257 -104.43433599533697 -62.600000000000065
+ vertex -154.54940691211777 -101.06482220219569 -62.600000000000065
+ vertex -153.00000000000006 -104.43433599533697 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -161.12500000000003 -104.86124264156595 -62.600000000000065
+ vertex -155.38557599864257 -104.43433599533697 -62.600000000000065
+ vertex -170.67210412904052 -113.26001712639697 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -161.12500000000003 -104.86124264156595 -62.600000000000065
+ vertex -170.67210412904052 -113.26001712639697 -62.600000000000065
+ vertex -165.67783335074782 -107.48982220219568 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -161.12500000000003 -104.86124264156595 -62.600000000000065
+ vertex -165.67783335074782 -107.48982220219568 -62.600000000000065
+ vertex -162.12500000000003 -103.12919183399708 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -165.67783335074782 -107.48982220219568 -62.600000000000065
+ vertex -170.67210412904052 -113.26001712639697 -62.600000000000065
+ vertex -172.30292768969878 -111.31482220219567 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -166.67783335074782 -105.75777139462681 -62.600000000000065
+ vertex -162.12500000000003 -103.12919183399708 -62.600000000000065
+ vertex -165.67783335074782 -107.48982220219568 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -142.45782590751938 -58.19690713431455 -62.600000000000065
+ vertex -142.48536047767334 -58.14921585984326 -62.600000000000044
+ vertex -121.60137838360576 -94.32133391112701 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -93.5547005383793 -102.43433599533697 -62.600000000000065
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -94.70940107675855 -100.43433599533697 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -93.5547005383793 -102.43433599533697 -62.600000000000065
+ vertex -93.3345329811143 -102.951974085542 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -93.3345329811143 -102.951974085542 -62.600000000000065
+ vertex -93.28675134594819 -103.43433599533697 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -93.28675134594819 -103.43433599533697 -62.600000000000065
+ vertex -93.41461187235463 -103.84854955771006 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -93.41461187235463 -103.84854955771006 -62.600000000000065
+ vertex -93.70940107675855 -104.16638680290583 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -93.70940107675855 -104.16638680290583 -62.600000000000065
+ vertex -94.15102956204204 -104.36618764791508 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -94.15102956204204 -104.36618764791508 -62.600000000000065
+ vertex -94.70940107675858 -104.43433599533697 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -94.70940107675858 -104.43433599533697 -62.600000000000065
+ vertex -150.00000000000006 -104.43433599533697 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -150.00000000000006 -104.43433599533697 -62.600000000000065
+ vertex -124.423047334483 -100.37242250367015 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -124.423047334483 -100.37242250367015 -62.600000000000065
+ vertex -123.73687521648672 -100.1885632387843 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -123.73687521648672 -100.1885632387843 -62.600000000000065
+ vertex -123.09305442107781 -99.88834467140568 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -123.09305442107781 -99.88834467140568 -62.600000000000065
+ vertex -122.5111471173357 -99.48088879078615 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -122.5111471173357 -99.48088879078615 -62.600000000000065
+ vertex -122.0088342642253 -98.97857593767576 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -122.0088342642253 -98.97857593767576 -62.600000000000065
+ vertex -121.60137838360576 -98.39666863393364 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -121.60137838360576 -98.39666863393364 -62.600000000000065
+ vertex -121.30115981622716 -97.75284783852473 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -121.30115981622716 -97.75284783852473 -62.600000000000065
+ vertex -121.11730055134129 -97.06667572052845 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -121.11730055134129 -97.06667572052845 -62.600000000000065
+ vertex -121.05538705967449 -96.35900127253032 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -121.05538705967449 -96.35900127253032 -62.600000000000065
+ vertex -121.11730055134129 -95.65132682453219 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -121.11730055134129 -95.65132682453219 -62.600000000000065
+ vertex -121.30115981622716 -94.96515470653594 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -121.30115981622716 -94.96515470653594 -62.600000000000065
+ vertex -121.60137838360576 -94.32133391112701 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -113.10682266969962 -100.43433599533697 -62.600000000000065
+ vertex -121.60137838360576 -94.32133391112701 -62.600000000000065
+ vertex -143.53209771903332 -47.73621377563331 -62.600000000000044
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -124.423047334483 -100.37242250367015 -62.600000000000065
+ vertex -150.00000000000006 -104.43433599533697 -62.600000000000065
+ vertex -125.13072178248112 -100.43433599533697 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -125.13072178248112 -100.43433599533697 -62.600000000000065
+ vertex -150.00000000000006 -104.43433599533697 -62.600000000000065
+ vertex -150.52555624752685 -100.43433599533697 -62.600000000000065
+ endloop
+endfacet
+facet normal 8.050242361863537e-17 2.571917868453463e-16 -1.0
+ outer loop
+ vertex -150.52555624752685 -100.43433599533697 -62.600000000000065
+ vertex -150.00000000000006 -104.43433599533697 -62.600000000000065
+ vertex -162.24146450794694 -80.14178763147345 -62.600000000000065
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -166.67783335074782 -105.75777139462681 -3.000000000000062
+ vertex -161.12500000000006 -104.86124264156595 -3.000000000000062
+ vertex -162.12500000000006 -103.12919183399708 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -154.54940691211777 -101.0648222021957 -3.000000000000062
+ vertex -155.3855759986426 -104.43433599533697 -3.000000000000062
+ vertex -153.00000000000006 -104.43433599533697 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -155.3855759986426 -104.43433599533697 -3.000000000000062
+ vertex -154.54940691211777 -101.0648222021957 -3.000000000000062
+ vertex -161.12500000000006 -104.86124264156595 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -155.3855759986426 -104.43433599533697 -3.000000000000062
+ vertex -161.12500000000006 -104.86124264156595 -3.000000000000062
+ vertex -170.67210412904052 -113.26001712639697 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -170.67210412904052 -113.26001712639697 -3.000000000000062
+ vertex -161.12500000000006 -104.86124264156595 -3.000000000000062
+ vertex -165.67783335074782 -107.48982220219568 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -165.67783335074782 -107.48982220219568 -3.000000000000062
+ vertex -161.12500000000006 -104.86124264156595 -3.000000000000062
+ vertex -166.67783335074782 -105.75777139462681 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -170.67210412904052 -113.26001712639697 -3.000000000000062
+ vertex -165.67783335074782 -107.48982220219568 -3.000000000000062
+ vertex -172.30292768969878 -111.31482220219569 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -93.55470053837932 -102.43433599533697 -3.000000000000062
+ vertex -94.70940107675855 -100.43433599533697 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -93.55470053837932 -102.43433599533697 -3.000000000000062
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -93.33453298111431 -102.951974085542 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -93.33453298111431 -102.951974085542 -3.000000000000062
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -93.28675134594819 -103.43433599533697 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -93.28675134594819 -103.43433599533697 -3.000000000000062
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -93.41461187235464 -103.84854955771006 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -93.41461187235464 -103.84854955771006 -3.000000000000062
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -93.70940107675857 -104.16638680290583 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -93.70940107675857 -104.16638680290583 -3.000000000000062
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -94.15102956204204 -104.36618764791508 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -94.15102956204204 -104.36618764791508 -3.000000000000062
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -94.70940107675858 -104.43433599533697 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -94.70940107675858 -104.43433599533697 -3.000000000000062
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -124.423047334483 -100.37242250367015 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -124.423047334483 -100.37242250367015 -3.000000000000062
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -123.73687521648675 -100.1885632387843 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -123.73687521648675 -100.1885632387843 -3.000000000000062
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -123.09305442107782 -99.88834467140568 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -123.09305442107782 -99.88834467140568 -3.000000000000062
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -122.51114711733571 -99.48088879078617 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -122.51114711733571 -99.48088879078617 -3.000000000000062
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -122.0088342642253 -98.97857593767576 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -122.0088342642253 -98.97857593767576 -3.000000000000062
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -121.60137838360578 -98.39666863393364 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -121.60137838360578 -98.39666863393364 -3.000000000000062
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -121.30115981622716 -97.75284783852474 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -121.30115981622716 -97.75284783852474 -3.000000000000062
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -121.11730055134132 -97.06667572052847 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -121.11730055134132 -97.06667572052847 -3.000000000000062
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -121.05538705967449 -96.35900127253034 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -121.05538705967449 -96.35900127253034 -3.000000000000062
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -121.11730055134132 -95.65132682453219 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -121.11730055134132 -95.65132682453219 -3.000000000000062
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -121.30115981622716 -94.96515470653594 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -121.30115981622716 -94.96515470653594 -3.000000000000062
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -121.60137838360578 -94.32133391112701 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -124.423047334483 -100.37242250367015 -3.000000000000062
+ vertex -125.13072178248112 -100.43433599533697 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -125.13072178248112 -100.43433599533697 -3.000000000000062
+ vertex -150.52555624752688 -100.43433599533697 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -150.52555624752688 -100.43433599533697 -3.000000000000062
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -164.79940691211777 -83.31130142461471 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -164.79940691211777 -83.31130142461471 -3.000000000000062
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -166.9427879993213 -80.28471878135093 -3.0000000000000733
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -166.9427879993213 -80.28471878135093 -3.0000000000000733
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -179.8971508823612 -69.34141226851 -3.0000000000000733
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -166.9427879993213 -80.28471878135093 -3.0000000000000733
+ vertex -179.8971508823612 -69.34141226851 -3.0000000000000733
+ vertex -181.1014998491836 -71.91527419881089 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -181.1014998491836 -71.91527419881089 -3.000000000000062
+ vertex -179.8971508823612 -69.34141226851 -3.0000000000000733
+ vertex -182.50000000000003 -67.83865662978121 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -181.1014998491836 -71.91527419881089 -3.000000000000062
+ vertex -182.50000000000003 -67.83865662978121 -3.000000000000062
+ vertex -183.21473573526944 -69.28298715360738 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -181.1014998491836 -71.91527419881089 -3.000000000000062
+ vertex -183.21473573526944 -69.28298715360738 -3.000000000000062
+ vertex -181.64696360879708 -73.2975486533744 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -181.64696360879708 -73.2975486533744 -3.000000000000062
+ vertex -183.21473573526944 -69.28298715360738 -3.000000000000062
+ vertex -183.86844014664098 -70.75594620798753 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -181.64696360879708 -73.2975486533744 -3.000000000000062
+ vertex -183.86844014664098 -70.75594620798753 -3.000000000000062
+ vertex -182.13413950932804 -74.70142650515936 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -182.13413950932804 -74.70142650515936 -3.000000000000062
+ vertex -183.86844014664098 -70.75594620798753 -3.000000000000062
+ vertex -184.45996930827113 -72.25495624273319 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -182.13413950932804 -74.70142650515936 -3.000000000000062
+ vertex -184.45996930827113 -72.25495624273319 -3.000000000000062
+ vertex -182.56217503533784 -76.12445109007135 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -182.56217503533784 -76.12445109007135 -3.000000000000062
+ vertex -184.45996930827113 -72.25495624273319 -3.000000000000062
+ vertex -184.98828809559382 -73.77739412070686 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -182.56217503533784 -76.12445109007135 -3.000000000000062
+ vertex -184.98828809559382 -73.77739412070686 -3.000000000000062
+ vertex -182.93032116189778 -77.56413223889892 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -182.93032116189778 -77.56413223889892 -3.000000000000062
+ vertex -184.98828809559382 -73.77739412070686 -3.000000000000062
+ vertex -185.4524719966983 -75.32059570808374 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -182.93032116189778 -77.56413223889892 -3.000000000000062
+ vertex -185.4524719966983 -75.32059570808374 -3.000000000000062
+ vertex -183.23793366531743 -79.01795063489288 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.23793366531743 -79.01795063489288 -3.000000000000062
+ vertex -185.4524719966983 -75.32059570808374 -3.000000000000062
+ vertex -183.48447425047996 -80.48336222235157 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.48447425047996 -80.48336222235157 -3.000000000000062
+ vertex -185.4524719966983 -75.32059570808374 -3.000000000000062
+ vertex -185.85170873014454 -76.88186053635415 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.48447425047996 -80.48336222235157 -3.000000000000062
+ vertex -185.85170873014454 -76.88186053635415 -3.000000000000062
+ vertex -183.66951149281198 -81.95780265849699 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.66951149281198 -81.95780265849699 -3.000000000000062
+ vertex -185.85170873014454 -76.88186053635415 -3.000000000000062
+ vertex -186.1852996663851 -78.45845652790851 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.66951149281198 -81.95780265849699 -3.000000000000062
+ vertex -186.1852996663851 -78.45845652790851 -3.000000000000062
+ vertex -183.79272159323875 -83.43869180085144 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.79272159323875 -83.43869180085144 -3.000000000000062
+ vertex -186.1852996663851 -78.45845652790851 -3.000000000000062
+ vertex -186.4526610503061 -80.0476247769353 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.79272159323875 -83.43869180085144 -3.000000000000062
+ vertex -186.4526610503061 -80.0476247769353 -3.000000000000062
+ vertex -183.85388894480468 -84.92343822226249 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.85388894480468 -84.92343822226249 -3.000000000000062
+ vertex -186.4526610503061 -80.0476247769353 -3.000000000000062
+ vertex -186.65332502274777 -81.64658437726641 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.85388894480468 -84.92343822226249 -3.000000000000062
+ vertex -186.65332502274777 -81.64658437726641 -3.000000000000062
+ vertex -183.85290650996637 -86.40944374567495 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.85290650996637 -86.40944374567495 -3.000000000000062
+ vertex -186.65332502274777 -81.64658437726641 -3.000000000000062
+ vertex -183.78977600789938 -87.89410799071464 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.78977600789938 -87.89410799071464 -3.000000000000062
+ vertex -186.65332502274777 -81.64658437726641 -3.000000000000062
+ vertex -186.78694043921737 -83.25253728872076 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.78977600789938 -87.89410799071464 -3.000000000000062
+ vertex -186.78694043921737 -83.25253728872076 -3.000000000000062
+ vertex -183.6646079114895 -89.37483292412786 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.6646079114895 -89.37483292412786 -3.000000000000062
+ vertex -186.78694043921737 -83.25253728872076 -3.000000000000062
+ vertex -186.8532734843615 -84.86267323343132 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.6646079114895 -89.37483292412786 -3.000000000000062
+ vertex -186.8532734843615 -84.86267323343132 -3.000000000000062
+ vertex -183.4776212540151 -90.84902740611355 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.4776212540151 -90.84902740611355 -3.000000000000062
+ vertex -186.8532734843615 -84.86267323343132 -3.000000000000062
+ vertex -186.85220808112246 -86.47417461358681 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.4776212540151 -90.84902740611355 -3.000000000000062
+ vertex -186.85220808112246 -86.47417461358681 -3.000000000000062
+ vertex -183.42210412904052 -91.17636932989382 -3.000000000000085
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -183.42210412904052 -91.17636932989382 -3.000000000000085
+ vertex -186.85220808112246 -86.47417461358681 -3.000000000000062
+ vertex -182.55292768969878 -93.5613014246147 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -182.55292768969878 -93.5613014246147 -3.000000000000062
+ vertex -186.85220808112246 -86.47417461358681 -3.000000000000062
+ vertex -172.30292768969878 -111.31482220219569 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -153.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -150.00000000000009 -121.1247965983122 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -153.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -154.54940691211777 -101.0648222021957 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -154.54940691211777 -101.0648222021957 -3.000000000000062
+ vertex -150.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -164.79940691211777 -83.31130142461471 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -150.00000000000009 -121.1247965983122 -3.000000000000062
+ vertex -153.00000000000006 -104.43433599533697 -3.000000000000062
+ vertex -152.83120430088542 -120.88086243345154 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -150.00000000000009 -121.1247965983122 -3.000000000000062
+ vertex -152.83120430088542 -120.88086243345154 -3.000000000000062
+ vertex -150.00000000000009 -124.13030787576977 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -150.00000000000009 -124.13030787576977 -3.000000000000062
+ vertex -152.83120430088542 -120.88086243345154 -3.000000000000062
+ vertex -151.60819479272953 -124.02712191759251 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -151.60819479272953 -124.02712191759251 -3.000000000000062
+ vertex -152.83120430088542 -120.88086243345154 -3.000000000000062
+ vertex -154.30102097334645 -120.66211067883884 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -151.60819479272953 -124.02712191759251 -3.000000000000062
+ vertex -154.30102097334645 -120.66211067883884 -3.000000000000062
+ vertex -153.2106669582428 -123.85676701721616 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -153.2106669582428 -123.85676701721616 -3.000000000000062
+ vertex -154.30102097334645 -120.66211067883884 -3.000000000000062
+ vertex -155.76040280706803 -120.38207845891769 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -153.2106669582428 -123.85676701721616 -3.000000000000062
+ vertex -155.76040280706803 -120.38207845891769 -3.000000000000062
+ vertex -154.8046123096754 -123.61954128089435 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -154.8046123096754 -123.61954128089435 -3.000000000000062
+ vertex -155.76040280706803 -120.38207845891769 -3.000000000000062
+ vertex -157.20679601081656 -120.04125580570843 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -154.8046123096754 -123.61954128089435 -3.000000000000062
+ vertex -157.20679601081656 -120.04125580570843 -3.000000000000062
+ vertex -156.38724158134562 -123.31585983302554 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -156.38724158134562 -123.31585983302554 -3.000000000000062
+ vertex -157.20679601081656 -120.04125580570843 -3.000000000000062
+ vertex -158.63766952233075 -119.64023912920041 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -156.38724158134562 -123.31585983302554 -3.000000000000062
+ vertex -158.63766952233075 -119.64023912920041 -3.000000000000062
+ vertex -157.9557853097267 -122.94625408972136 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -157.9557853097267 -122.94625408972136 -3.000000000000062
+ vertex -158.63766952233075 -119.64023912920041 -3.000000000000062
+ vertex -160.05051943746048 -119.17973017368655 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -157.9557853097267 -122.94625408972136 -3.000000000000062
+ vertex -160.05051943746048 -119.17973017368655 -3.000000000000062
+ vertex -161.44287339178106 -118.66053478977186 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -157.9557853097267 -122.94625408972136 -3.000000000000062
+ vertex -161.44287339178106 -118.66053478977186 -3.000000000000062
+ vertex -159.50749867976717 -122.51137082887449 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -159.50749867976717 -122.51137082887449 -3.000000000000062
+ vertex -161.44287339178106 -118.66053478977186 -3.000000000000062
+ vertex -162.812294887016 -118.08356152420488 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -159.50749867976717 -122.51137082887449 -3.000000000000062
+ vertex -162.812294887016 -118.08356152420488 -3.000000000000062
+ vertex -161.03966632807823 -122.01197105835386 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -161.03966632807823 -122.01197105835386 -3.000000000000062
+ vertex -162.812294887016 -118.08356152420488 -3.000000000000062
+ vertex -164.15638755469692 -117.4498200300001 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -161.03966632807823 -122.01197105835386 -3.000000000000062
+ vertex -164.15638755469692 -117.4498200300001 -3.000000000000062
+ vertex -162.5496070945836 -121.44892868430702 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -162.5496070945836 -121.44892868430702 -3.000000000000062
+ vertex -164.15638755469692 -117.4498200300001 -3.000000000000062
+ vertex -165.47279934959988 -116.76041929963284 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -162.5496070945836 -121.44892868430702 -3.000000000000062
+ vertex -165.47279934959988 -116.76041929963284 -3.000000000000062
+ vertex -164.03467871431616 -120.82322898190026 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -164.03467871431616 -120.82322898190026 -3.000000000000062
+ vertex -165.47279934959988 -116.76041929963284 -3.000000000000062
+ vertex -166.7592266656199 -116.01656572439911 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -164.03467871431616 -120.82322898190026 -3.000000000000062
+ vertex -166.7592266656199 -116.01656572439911 -3.000000000000062
+ vertex -168.0134183668812 -115.21956098333553 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -164.03467871431616 -120.82322898190026 -3.000000000000062
+ vertex -168.0134183668812 -115.21956098333553 -3.000000000000062
+ vertex -165.492282441152 -120.135966871173 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -165.492282441152 -120.135966871173 -3.000000000000062
+ vertex -168.0134183668812 -115.21956098333553 -3.000000000000062
+ vertex -169.23317972702915 -114.37079976539466 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -165.492282441152 -120.135966871173 -3.000000000000062
+ vertex -169.23317972702915 -114.37079976539466 -3.000000000000062
+ vertex -166.9198675953899 -119.38834500102287 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -166.9198675953899 -119.38834500102287 -3.000000000000062
+ vertex -169.23317972702915 -114.37079976539466 -3.000000000000062
+ vertex -170.4163762698104 -113.47176732886022 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -166.9198675953899 -119.38834500102287 -3.000000000000062
+ vertex -170.4163762698104 -113.47176732886022 -3.000000000000062
+ vertex -168.31493602721866 -118.5816716446749 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -168.31493602721866 -118.5816716446749 -3.000000000000062
+ vertex -170.4163762698104 -113.47176732886022 -3.000000000000062
+ vertex -170.67210412904052 -113.26001712639697 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -168.31493602721866 -118.5816716446749 -3.000000000000062
+ vertex -170.67210412904052 -113.26001712639697 -3.000000000000062
+ vertex -172.30292768969878 -111.31482220219569 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -168.31493602721866 -118.5816716446749 -3.000000000000062
+ vertex -172.30292768969878 -111.31482220219569 -3.000000000000062
+ vertex -186.85220808112246 -86.47417461358681 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -168.31493602721866 -118.5816716446749 -3.000000000000062
+ vertex -186.85220808112246 -86.47417461358681 -3.000000000000062
+ vertex -186.7837460938633 -88.08422144198268 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -168.31493602721866 -118.5816716446749 -3.000000000000062
+ vertex -186.7837460938633 -88.08422144198268 -3.000000000000062
+ vertex -169.6750464882625 -117.71735841031693 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -169.6750464882625 -117.71735841031693 -3.000000000000062
+ vertex -186.7837460938633 -88.08422144198268 -3.000000000000062
+ vertex -186.6480073251051 -89.68999627675343 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -169.6750464882625 -117.71735841031693 -3.000000000000062
+ vertex -186.6480073251051 -89.68999627675343 -3.000000000000062
+ vertex -170.99781890355263 -116.79691777090852 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -170.99781890355263 -116.79691777090852 -3.000000000000062
+ vertex -186.6480073251051 -89.68999627675343 -3.000000000000062
+ vertex -186.44522930588298 -91.28868915165077 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -170.99781890355263 -116.79691777090852 -3.000000000000062
+ vertex -186.44522930588298 -91.28868915165077 -3.000000000000062
+ vertex -172.28093853645183 -115.82196041748446 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -172.28093853645183 -115.82196041748446 -3.000000000000062
+ vertex -186.44522930588298 -91.28868915165077 -3.000000000000062
+ vertex -186.1757668800877 -92.8775024932399 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -172.28093853645183 -115.82196041748446 -3.000000000000062
+ vertex -186.1757668800877 -92.8775024932399 -3.000000000000062
+ vertex -173.52216003924204 -114.7941924405858 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -173.52216003924204 -114.7941924405858 -3.000000000000062
+ vertex -186.1757668800877 -92.8775024932399 -3.000000000000062
+ vertex -185.8400915835195 -94.45365601640981 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -173.52216003924204 -114.7941924405858 -3.000000000000062
+ vertex -185.8400915835195 -94.45365601640981 -3.000000000000062
+ vertex -174.7193113822874 -113.7154123447499 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -174.7193113822874 -113.7154123447499 -3.000000000000062
+ vertex -185.8400915835195 -94.45365601640981 -3.000000000000062
+ vertex -185.4387908187414 -96.01439158963021 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -174.7193113822874 -113.7154123447499 -3.000000000000062
+ vertex -185.4387908187414 -96.01439158963021 -3.000000000000062
+ vertex -175.87029765489729 -112.58750790128374 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -175.87029765489729 -112.58750790128374 -3.000000000000062
+ vertex -185.4387908187414 -96.01439158963021 -3.000000000000062
+ vertex -184.9725668271762 -97.55697806144177 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -175.87029765489729 -112.58750790128374 -3.000000000000062
+ vertex -184.9725668271762 -97.55697806144177 -3.000000000000062
+ vertex -176.9731047312377 -111.41245284482866 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -176.9731047312377 -111.41245284482866 -3.000000000000062
+ vertex -184.9725668271762 -97.55697806144177 -3.000000000000062
+ vertex -184.4422354602446 -99.07871603973354 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -176.9731047312377 -111.41245284482866 -3.000000000000062
+ vertex -184.4422354602446 -99.07871603973354 -3.000000000000062
+ vertex -178.0258027948761 -110.19230341949634 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -178.0258027948761 -110.19230341949634 -3.000000000000062
+ vertex -184.4422354602446 -99.07871603973354 -3.000000000000062
+ vertex -183.84872475169664 -100.57694261544428 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -178.0258027948761 -110.19230341949634 -3.000000000000062
+ vertex -183.84872475169664 -100.57694261544428 -3.000000000000062
+ vertex -179.0265497157926 -108.92919478062029 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -179.0265497157926 -108.92919478062029 -3.000000000000062
+ vertex -183.84872475169664 -100.57694261544428 -3.000000000000062
+ vertex -183.1930732936331 -102.04903602242166 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -179.0265497157926 -108.92919478062029 -3.000000000000062
+ vertex -183.1930732936331 -102.04903602242166 -3.000000000000062
+ vertex -179.97359427394684 -107.62533725842027 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -179.97359427394684 -107.62533725842027 -3.000000000000062
+ vertex -183.1930732936331 -102.04903602242166 -3.000000000000062
+ vertex -180.8652792237608 -106.28301249011629 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -180.8652792237608 -106.28301249011629 -3.000000000000062
+ vertex -183.1930732936331 -102.04903602242166 -3.000000000000062
+ vertex -182.47642841905977 -103.49242022528482 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -180.8652792237608 -106.28301249011629 -3.000000000000062
+ vertex -182.47642841905977 -103.49242022528482 -3.000000000000062
+ vertex -181.7000441941546 -104.90456942726223 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -164.79940691211777 -83.31130142461471 -3.000000000000062
+ vertex -168.13557599864257 -82.35068819883378 -3.0000000000000733
+ vertex -171.37500000000006 -87.10772186398499 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -168.13557599864257 -82.35068819883378 -3.0000000000000733
+ vertex -164.79940691211777 -83.31130142461471 -3.000000000000062
+ vertex -166.9427879993213 -80.28471878135093 -3.0000000000000733
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -171.37500000000006 -87.10772186398499 -3.000000000000062
+ vertex -168.13557599864257 -82.35068819883378 -3.0000000000000733
+ vertex -183.42210412904052 -91.17636932989382 -3.000000000000085
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -171.37500000000006 -87.10772186398499 -3.000000000000062
+ vertex -183.42210412904052 -91.17636932989382 -3.000000000000085
+ vertex -175.92783335074782 -89.73630142461471 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -171.37500000000006 -87.10772186398499 -3.000000000000062
+ vertex -175.92783335074782 -89.73630142461471 -3.000000000000062
+ vertex -170.37500000000006 -88.83977267155386 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -175.92783335074782 -89.73630142461471 -3.000000000000062
+ vertex -183.42210412904052 -91.17636932989382 -3.000000000000085
+ vertex -182.55292768969878 -93.5613014246147 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -174.92783335074782 -91.46835223218358 -3.000000000000062
+ vertex -170.37500000000006 -88.83977267155386 -3.000000000000062
+ vertex -175.92783335074782 -89.73630142461471 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -135.82629141839354 -29.35408956923081 -3.0000000000000284
+ vertex -134.33338692256277 -31.803579312013984 -3.0000000000000284
+ vertex -135.488087460942 -29.803579312013987 -3.0000000000000284
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -134.33338692256277 -31.803579312013984 -3.0000000000000284
+ vertex -135.82629141839354 -29.35408956923081 -3.0000000000000284
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -135.82629141839354 -29.35408956923081 -3.0000000000000284
+ vertex -136.22013826851088 -29.071528504445116 -3.0000000000000284
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -136.22013826851088 -29.071528504445116 -3.0000000000000284
+ vertex -136.64278799932126 -28.975152187267806 -3.0000000000000284
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -136.64278799932126 -28.975152187267806 -3.0000000000000284
+ vertex -137.06543773013163 -29.07152850444512 -3.0000000000000284
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -137.06543773013163 -29.07152850444512 -3.0000000000000284
+ vertex -137.45928458024898 -29.35408956923082 -3.0000000000000284
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -137.45928458024898 -29.35408956923082 -3.0000000000000284
+ vertex -137.7974885377005 -29.803579312013994 -3.0000000000000284
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -137.7974885377005 -29.803579312013994 -3.0000000000000284
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -149.13659139480455 -57.56730855610115 -3.000000000000051
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -149.13659139480455 -57.56730855610115 -3.000000000000051
+ vertex -148.63427854169413 -57.064995702990736 -3.000000000000051
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -148.63427854169413 -57.064995702990736 -3.000000000000051
+ vertex -148.05237123795203 -56.657539822371234 -3.000000000000051
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -148.05237123795203 -56.657539822371234 -3.000000000000051
+ vertex -147.4085504425431 -56.357321254992605 -3.000000000000051
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -147.4085504425431 -56.357321254992605 -3.000000000000051
+ vertex -146.72237832454684 -56.17346199010676 -3.000000000000051
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -146.72237832454684 -56.17346199010676 -3.000000000000051
+ vertex -146.0147038765487 -56.111548498439944 -3.000000000000051
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -146.0147038765487 -56.111548498439944 -3.000000000000051
+ vertex -145.30702942855058 -56.173461990106745 -3.000000000000051
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -145.30702942855058 -56.173461990106745 -3.000000000000051
+ vertex -144.6208573105543 -56.357321254992605 -3.000000000000051
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -144.6208573105543 -56.357321254992605 -3.000000000000051
+ vertex -144.05167483247536 -56.603058209358565 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -144.05167483247536 -56.603058209358565 -3.000000000000062
+ vertex -143.42990957836213 -57.03842292728552 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -143.42990957836213 -57.03842292728552 -3.000000000000062
+ vertex -143.3951292114033 -57.06499570299075 -3.000000000000051
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -143.3951292114033 -57.06499570299075 -3.000000000000051
+ vertex -142.89319062544632 -57.575141880201315 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -142.89319062544632 -57.575141880201315 -3.000000000000062
+ vertex -142.48536047767337 -58.149215859843274 -3.000000000000051
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.53209771903332 -47.73621377563332 -3.0000000000000395
+ vertex -142.48536047767337 -58.149215859843274 -3.000000000000051
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -113.10682266969964 -100.43433599533697 -3.000000000000062
+ vertex -142.48536047767337 -58.149215859843274 -3.000000000000051
+ vertex -121.60137838360578 -94.32133391112701 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -143.42990957836213 -57.03842292728552 -3.000000000000062
+ vertex -144.05167483247536 -56.603058209358565 -3.000000000000062
+ vertex -143.9770365151454 -56.65753982237123 -3.000000000000051
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -149.13659139480455 -57.56730855610115 -3.000000000000051
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -149.54404727542408 -58.14921585984326 -3.000000000000051
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -149.54404727542408 -58.14921585984326 -3.000000000000051
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -162.24146450794694 -80.14178763147346 -3.0000000000000733
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -162.24146450794694 -80.14178763147346 -3.0000000000000733
+ vertex -165.4427879993213 -77.68664256999763 -3.0000000000000733
+ vertex -150.52555624752688 -100.43433599533697 -3.000000000000062
+ endloop
+endfacet
+facet normal -9.251431598681811e-17 -3.047983989961055e-16 1.0
+ outer loop
+ vertex -142.45782590751938 -58.19690713431455 -3.000000000000062
+ vertex -121.60137838360578 -94.32133391112701 -3.000000000000062
+ vertex -142.48536047767337 -58.149215859843274 -3.000000000000051
+ endloop
+endfacet
+facet normal 0.4989294616193014 -0.8641711769176169 -0.06540312923014449
+ outer loop
+ vertex -134.26812936260933 -63.781877648670005 -31.233685693359433
+ vertex -138.04336943063956 -65.84297004007189 -32.800000000000054
+ vertex -134.31946019436648 -63.69297004007188 -32.800000000000054
+ endloop
+endfacet
+facet normal 0.4989294616193014 -0.8641711769176169 -0.06540312923014449
+ outer loop
+ vertex -138.04336943063956 -65.84297004007189 -32.800000000000054
+ vertex -134.26812936260933 -63.781877648670005 -31.233685693359433
+ vertex -137.99203859888243 -65.93187764867001 -31.233685693359433
+ endloop
+endfacet
+facet normal 0.49039264020161505 -0.8493849684870419 -0.1950903220161271
+ outer loop
+ vertex -134.11501515210088 -64.04707924063145 -29.6941714587698
+ vertex -137.99203859888243 -65.93187764867001 -31.233685693359433
+ vertex -134.26812936260933 -63.781877648670005 -31.233685693359433
+ endloop
+endfacet
+facet normal 0.49039264020161505 -0.8493849684870419 -0.1950903220161271
+ outer loop
+ vertex -137.99203859888243 -65.93187764867001 -31.233685693359433
+ vertex -134.11501515210088 -64.04707924063145 -29.6941714587698
+ vertex -137.83892438837398 -66.19707924063145 -29.6941714587698
+ endloop
+endfacet
+facet normal 0.473465064747552 -0.820065547751649 -0.3214394653031649
+ outer loop
+ vertex -133.8627373894342 -64.48403714318997 -28.207798811618975
+ vertex -137.83892438837398 -66.19707924063145 -29.6941714587698
+ vertex -134.11501515210088 -64.04707924063145 -29.6941714587698
+ endloop
+endfacet
+facet normal 0.473465064747552 -0.820065547751649 -0.3214394653031649
+ outer loop
+ vertex -137.83892438837398 -66.19707924063145 -29.6941714587698
+ vertex -133.8627373894342 -64.48403714318997 -28.207798811618975
+ vertex -137.5866466257073 -66.63403714318997 -28.207798811618975
+ endloop
+endfacet
+facet normal 0.4484363707663453 -0.7767145781291056 -0.44228869021899536
+ outer loop
+ vertex -133.51561261707312 -65.08527488548513 -26.800000000000054
+ vertex -137.5866466257073 -66.63403714318997 -28.207798811618975
+ vertex -133.8627373894342 -64.48403714318997 -28.207798811618975
+ endloop
+endfacet
+facet normal 0.4484363707663453 -0.7767145781291056 -0.44228869021899536
+ outer loop
+ vertex -137.5866466257073 -66.63403714318997 -28.207798811618975
+ vertex -133.51561261707312 -65.08527488548513 -26.800000000000054
+ vertex -137.2395218533462 -67.23527488548514 -26.800000000000054
+ endloop
+endfacet
+facet normal 0.41573480615127295 -0.7200738067288037 -0.5555702330196005
+ outer loop
+ vertex -133.07958023611388 -65.84050512305173 -25.4948628518954
+ vertex -137.2395218533462 -67.23527488548514 -26.800000000000054
+ vertex -133.51561261707312 -65.08527488548513 -26.800000000000054
+ endloop
+endfacet
+facet normal 0.41573480615127295 -0.7200738067288037 -0.5555702330196005
+ outer loop
+ vertex -137.2395218533462 -67.23527488548514 -26.800000000000054
+ vertex -133.07958023611388 -65.84050512305173 -25.4948628518954
+ vertex -136.80348947238699 -67.99050512305173 -25.4948628518954
+ endloop
+endfacet
+facet normal 0.3759199037394864 -0.6511123728531927 -0.6593458151000736
+ outer loop
+ vertex -132.56210088148578 -66.7368056571356 -24.314718625761483
+ vertex -136.80348947238699 -67.99050512305173 -25.4948628518954
+ vertex -133.07958023611388 -65.84050512305173 -25.4948628518954
+ endloop
+endfacet
+facet normal 0.3759199037394864 -0.6511123728531927 -0.6593458151000736
+ outer loop
+ vertex -136.80348947238699 -67.99050512305173 -25.4948628518954
+ vertex -132.56210088148578 -66.7368056571356 -24.314718625761483
+ vertex -136.28601011775885 -68.88680565713561 -24.314718625761483
+ endloop
+endfacet
+facet normal 0.32967290755003653 -0.5710102257556211 -0.7518398074789733
+ outer loop
+ vertex -135.6959380046919 -69.9088405370971 -23.279759916505228
+ vertex -132.56210088148578 -66.7368056571356 -24.314718625761483
+ vertex -131.9720287684188 -67.7588405370971 -23.279759916505228
+ endloop
+endfacet
+facet normal 0.32967290755003653 -0.5710102257556211 -0.7518398074789733
+ outer loop
+ vertex -132.56210088148578 -66.7368056571356 -24.314718625761483
+ vertex -135.6959380046919 -69.9088405370971 -23.279759916505228
+ vertex -136.28601011775885 -68.88680565713561 -24.314718625761483
+ endloop
+endfacet
+facet normal 0.27778511650979765 -0.4811379353814101 -0.8314696123025496
+ outer loop
+ vertex -135.04336943063956 -71.03912246277852 -22.40769515458679
+ vertex -131.9720287684188 -67.7588405370971 -23.279759916505228
+ vertex -131.31946019436646 -68.88912246277852 -22.40769515458679
+ endloop
+endfacet
+facet normal 0.27778511650979765 -0.4811379353814101 -0.8314696123025496
+ outer loop
+ vertex -131.9720287684188 -67.7588405370971 -23.279759916505228
+ vertex -135.04336943063956 -71.03912246277852 -22.40769515458679
+ vertex -135.6959380046919 -69.9088405370971 -23.279759916505228
+ endloop
+endfacet
+facet normal 0.22114434510950054 -0.3830332415362013 -0.8968727415326885
+ outer loop
+ vertex -134.33947002483012 -72.25831199705806 -21.71344560986461
+ vertex -131.31946019436646 -68.88912246277852 -22.40769515458679
+ vertex -130.615560788557 -70.10831199705805 -21.71344560986461
+ endloop
+endfacet
+facet normal 0.22114434510950054 -0.3830332415362013 -0.8968727415326885
+ outer loop
+ vertex -131.31946019436646 -68.88912246277852 -22.40769515458679
+ vertex -134.33947002483012 -72.25831199705806 -21.71344560986461
+ vertex -135.04336943063956 -71.03912246277852 -22.40769515458679
+ endloop
+endfacet
+facet normal 0.1607197326515819 -0.27837474273142676 -0.9469301294951049
+ outer loop
+ vertex -133.5962837012547 -73.54554846898098 -21.208890084531234
+ vertex -130.615560788557 -70.10831199705805 -21.71344560986461
+ vertex -129.87237446498162 -71.39554846898098 -21.208890084531234
+ endloop
+endfacet
+facet normal 0.1607197326515819 -0.27837474273142676 -0.9469301294951049
+ outer loop
+ vertex -130.615560788557 -70.10831199705805 -21.71344560986461
+ vertex -133.5962837012547 -73.54554846898098 -21.208890084531234
+ vertex -134.33947002483012 -72.25831199705806 -21.71344560986461
+ endloop
+endfacet
+facet normal 0.09754516100806387 -0.16895317489845335 -0.9807852804032307
+ outer loop
+ vertex -132.8265265839599 -74.87880690562336 -20.90266166351433
+ vertex -129.87237446498162 -71.39554846898098 -21.208890084531234
+ vertex -129.1026173476868 -72.72880690562336 -20.90266166351433
+ endloop
+endfacet
+facet normal 0.09754516100806387 -0.16895317489845335 -0.9807852804032307
+ outer loop
+ vertex -129.87237446498162 -71.39554846898098 -21.208890084531234
+ vertex -132.8265265839599 -74.87880690562336 -20.90266166351433
+ vertex -133.5962837012547 -73.54554846898098 -21.208890084531234
+ endloop
+endfacet
+facet normal 0.03270156461507213 -0.05664077140030155 -0.9978589232386036
+ outer loop
+ vertex -132.0433694306396 -76.23527488548514 -20.80000000000005
+ vertex -129.1026173476868 -72.72880690562336 -20.90266166351433
+ vertex -128.31946019436646 -74.08527488548513 -20.80000000000005
+ endloop
+endfacet
+facet normal 0.03270156461507213 -0.05664077140030155 -0.9978589232386036
+ outer loop
+ vertex -129.1026173476868 -72.72880690562336 -20.90266166351433
+ vertex -132.0433694306396 -76.23527488548514 -20.80000000000005
+ vertex -132.8265265839599 -74.87880690562336 -20.90266166351433
+ endloop
+endfacet
+facet normal -0.03270156461507213 0.05664077140030155 -0.9978589232386036
+ outer loop
+ vertex -131.26021227731925 -77.59174286534694 -20.90266166351433
+ vertex -128.31946019436646 -74.08527488548513 -20.80000000000005
+ vertex -127.53630304104615 -75.44174286534694 -20.90266166351433
+ endloop
+endfacet
+facet normal -0.03270156461507213 0.05664077140030155 -0.9978589232386036
+ outer loop
+ vertex -128.31946019436646 -74.08527488548513 -20.80000000000005
+ vertex -131.26021227731925 -77.59174286534694 -20.90266166351433
+ vertex -132.0433694306396 -76.23527488548514 -20.80000000000005
+ endloop
+endfacet
+facet normal -0.09754516100806562 0.16895317489845638 -0.98078528040323
+ outer loop
+ vertex -130.49045516002442 -78.92500130198931 -21.208890084531237
+ vertex -127.53630304104615 -75.44174286534694 -20.90266166351433
+ vertex -126.76654592375135 -76.7750013019893 -21.208890084531237
+ endloop
+endfacet
+facet normal -0.09754516100806562 0.16895317489845638 -0.98078528040323
+ outer loop
+ vertex -127.53630304104615 -75.44174286534694 -20.90266166351433
+ vertex -130.49045516002442 -78.92500130198931 -21.208890084531237
+ vertex -131.26021227731925 -77.59174286534694 -20.90266166351433
+ endloop
+endfacet
+facet normal -0.16071973265157807 0.27837474273142016 -0.9469301294951075
+ outer loop
+ vertex -129.74726883644902 -80.21223777391226 -21.71344560986461
+ vertex -126.76654592375135 -76.7750013019893 -21.208890084531237
+ vertex -126.02335960017594 -78.06223777391226 -21.71344560986461
+ endloop
+endfacet
+facet normal -0.16071973265157807 0.27837474273142016 -0.9469301294951075
+ outer loop
+ vertex -126.76654592375135 -76.7750013019893 -21.208890084531237
+ vertex -129.74726883644902 -80.21223777391226 -21.71344560986461
+ vertex -130.49045516002442 -78.92500130198931 -21.208890084531237
+ endloop
+endfacet
+facet normal -0.22114434510950196 0.3830332415362037 -0.8968727415326869
+ outer loop
+ vertex -129.04336943063956 -81.43142730819179 -22.407695154586794
+ vertex -126.02335960017594 -78.06223777391226 -21.71344560986461
+ vertex -125.31946019436647 -79.28142730819178 -22.407695154586794
+ endloop
+endfacet
+facet normal -0.22114434510950196 0.3830332415362037 -0.8968727415326869
+ outer loop
+ vertex -126.02335960017594 -78.06223777391226 -21.71344560986461
+ vertex -129.04336943063956 -81.43142730819179 -22.407695154586794
+ vertex -129.74726883644902 -80.21223777391226 -21.71344560986461
+ endloop
+endfacet
+facet normal -0.277785116509801 0.48113793538141586 -0.8314696123025452
+ outer loop
+ vertex -128.39080085658725 -82.56170923387319 -23.279759916505235
+ vertex -125.31946019436647 -79.28142730819178 -22.407695154586794
+ vertex -124.66689162031415 -80.41170923387318 -23.279759916505235
+ endloop
+endfacet
+facet normal -0.277785116509801 0.48113793538141586 -0.8314696123025452
+ outer loop
+ vertex -125.31946019436647 -79.28142730819178 -22.407695154586794
+ vertex -128.39080085658725 -82.56170923387319 -23.279759916505235
+ vertex -129.04336943063956 -81.43142730819179 -22.407695154586794
+ endloop
+endfacet
+facet normal -0.3296729075500355 0.5710102257556193 -0.7518398074789752
+ outer loop
+ vertex -127.8007287435203 -83.5837441138347 -24.314718625761483
+ vertex -124.66689162031415 -80.41170923387318 -23.279759916505235
+ vertex -124.0768195072472 -81.43374411383469 -24.314718625761483
+ endloop
+endfacet
+facet normal -0.3296729075500355 0.5710102257556193 -0.7518398074789752
+ outer loop
+ vertex -124.66689162031415 -80.41170923387318 -23.279759916505235
+ vertex -127.8007287435203 -83.5837441138347 -24.314718625761483
+ vertex -128.39080085658725 -82.56170923387319 -23.279759916505235
+ endloop
+endfacet
+facet normal -0.3759199037394879 0.6511123728531953 -0.65934581510007
+ outer loop
+ vertex -127.8007287435203 -83.5837441138347 -24.314718625761483
+ vertex -123.55934015261907 -82.33004464791856 -25.494862851895416
+ vertex -127.28324938889217 -84.48004464791856 -25.494862851895416
+ endloop
+endfacet
+facet normal -0.3759199037394879 0.6511123728531953 -0.65934581510007
+ outer loop
+ vertex -123.55934015261907 -82.33004464791856 -25.494862851895416
+ vertex -127.8007287435203 -83.5837441138347 -24.314718625761483
+ vertex -124.0768195072472 -81.43374411383469 -24.314718625761483
+ endloop
+endfacet
+facet normal -0.41573480615127234 0.7200738067288026 -0.5555702330196021
+ outer loop
+ vertex -127.28324938889217 -84.48004464791856 -25.494862851895416
+ vertex -123.12330777165984 -83.08527488548516 -26.800000000000058
+ vertex -126.84721700793295 -85.23527488548515 -26.800000000000058
+ endloop
+endfacet
+facet normal -0.41573480615127234 0.7200738067288026 -0.5555702330196021
+ outer loop
+ vertex -123.12330777165984 -83.08527488548516 -26.800000000000058
+ vertex -127.28324938889217 -84.48004464791856 -25.494862851895416
+ vertex -123.55934015261907 -82.33004464791856 -25.494862851895416
+ endloop
+endfacet
+facet normal -0.4484363707663456 0.7767145781291062 -0.4422886902189939
+ outer loop
+ vertex -126.84721700793295 -85.23527488548515 -26.800000000000058
+ vertex -122.77618299929875 -83.68651262778033 -28.207798811618986
+ vertex -126.50009223557186 -85.83651262778034 -28.207798811618986
+ endloop
+endfacet
+facet normal -0.4484363707663456 0.7767145781291062 -0.4422886902189939
+ outer loop
+ vertex -122.77618299929875 -83.68651262778033 -28.207798811618986
+ vertex -126.84721700793295 -85.23527488548515 -26.800000000000058
+ vertex -123.12330777165984 -83.08527488548516 -26.800000000000058
+ endloop
+endfacet
+facet normal -0.47346506474755173 0.8200655477516485 -0.321439465303166
+ outer loop
+ vertex -126.50009223557186 -85.83651262778034 -28.207798811618986
+ vertex -122.52390523663206 -84.12347053033885 -29.69417145876981
+ vertex -126.24781447290516 -86.27347053033886 -29.69417145876981
+ endloop
+endfacet
+facet normal -0.47346506474755173 0.8200655477516485 -0.321439465303166
+ outer loop
+ vertex -122.52390523663206 -84.12347053033885 -29.69417145876981
+ vertex -126.50009223557186 -85.83651262778034 -28.207798811618986
+ vertex -122.77618299929875 -83.68651262778033 -28.207798811618986
+ endloop
+endfacet
+facet normal -0.49039264020161505 0.8493849684870419 -0.1950903220161271
+ outer loop
+ vertex -126.24781447290516 -86.27347053033886 -29.69417145876981
+ vertex -122.37079102612361 -84.38867212230028 -31.233685693359437
+ vertex -126.09470026239671 -86.53867212230028 -31.233685693359437
+ endloop
+endfacet
+facet normal -0.49039264020161505 0.8493849684870419 -0.1950903220161271
+ outer loop
+ vertex -122.37079102612361 -84.38867212230028 -31.233685693359437
+ vertex -126.24781447290516 -86.27347053033886 -29.69417145876981
+ vertex -122.52390523663206 -84.12347053033885 -29.69417145876981
+ endloop
+endfacet
+facet normal -0.49892946161930135 0.8641711769176168 -0.06540312923014473
+ outer loop
+ vertex -126.09470026239671 -86.53867212230028 -31.233685693359437
+ vertex -122.31946019436648 -84.47757973089841 -32.800000000000054
+ vertex -126.04336943063956 -86.62757973089842 -32.800000000000054
+ endloop
+endfacet
+facet normal -0.49892946161930135 0.8641711769176168 -0.06540312923014473
+ outer loop
+ vertex -122.31946019436648 -84.47757973089841 -32.800000000000054
+ vertex -126.09470026239671 -86.53867212230028 -31.233685693359437
+ vertex -122.37079102612361 -84.38867212230028 -31.233685693359437
+ endloop
+endfacet
+facet normal -0.4989294616193014 0.8641711769176169 0.06540312923014402
+ outer loop
+ vertex -126.04336943063956 -86.62757973089842 -32.800000000000054
+ vertex -122.37079102612361 -84.38867212230028 -34.36631430664068
+ vertex -126.09470026239671 -86.53867212230028 -34.36631430664068
+ endloop
+endfacet
+facet normal -0.4989294616193014 0.8641711769176169 0.06540312923014402
+ outer loop
+ vertex -122.37079102612361 -84.38867212230028 -34.36631430664068
+ vertex -126.04336943063956 -86.62757973089842 -32.800000000000054
+ vertex -122.31946019436648 -84.47757973089841 -32.800000000000054
+ endloop
+endfacet
+facet normal -0.4903926402016149 0.8493849684870418 0.19509032201612775
+ outer loop
+ vertex -126.09470026239671 -86.53867212230028 -34.36631430664068
+ vertex -122.52390523663206 -84.12347053033885 -35.905828541230306
+ vertex -126.24781447290516 -86.27347053033886 -35.905828541230306
+ endloop
+endfacet
+facet normal -0.4903926402016149 0.8493849684870418 0.19509032201612775
+ outer loop
+ vertex -122.52390523663206 -84.12347053033885 -35.905828541230306
+ vertex -126.09470026239671 -86.53867212230028 -34.36631430664068
+ vertex -122.37079102612361 -84.38867212230028 -34.36631430664068
+ endloop
+endfacet
+facet normal -0.473465064747552 0.820065547751649 0.3214394653031649
+ outer loop
+ vertex -126.24781447290516 -86.27347053033886 -35.905828541230306
+ vertex -122.77618299929875 -83.68651262778033 -37.392201188381144
+ vertex -126.50009223557186 -85.83651262778034 -37.392201188381144
+ endloop
+endfacet
+facet normal -0.473465064747552 0.820065547751649 0.3214394653031649
+ outer loop
+ vertex -122.77618299929875 -83.68651262778033 -37.392201188381144
+ vertex -126.24781447290516 -86.27347053033886 -35.905828541230306
+ vertex -122.52390523663206 -84.12347053033885 -35.905828541230306
+ endloop
+endfacet
+facet normal -0.4484363707663453 0.7767145781291056 0.44228869021899536
+ outer loop
+ vertex -126.50009223557186 -85.83651262778034 -37.392201188381144
+ vertex -123.12330777165984 -83.08527488548516 -38.80000000000006
+ vertex -126.84721700793295 -85.23527488548515 -38.80000000000006
+ endloop
+endfacet
+facet normal -0.4484363707663453 0.7767145781291056 0.44228869021899536
+ outer loop
+ vertex -123.12330777165984 -83.08527488548516 -38.80000000000006
+ vertex -126.50009223557186 -85.83651262778034 -37.392201188381144
+ vertex -122.77618299929875 -83.68651262778033 -37.392201188381144
+ endloop
+endfacet
+facet normal -0.41573480615126907 0.720073806728797 0.5555702330196121
+ outer loop
+ vertex -126.84721700793295 -85.23527488548515 -38.80000000000006
+ vertex -123.55934015261907 -82.33004464791854 -40.10513714810471
+ vertex -127.28324938889217 -84.48004464791855 -40.10513714810471
+ endloop
+endfacet
+facet normal -0.41573480615126907 0.720073806728797 0.5555702330196121
+ outer loop
+ vertex -123.55934015261907 -82.33004464791854 -40.10513714810471
+ vertex -126.84721700793295 -85.23527488548515 -38.80000000000006
+ vertex -123.12330777165984 -83.08527488548516 -38.80000000000006
+ endloop
+endfacet
+facet normal -0.37591990373949075 0.6511123728532002 0.6593458151000637
+ outer loop
+ vertex -127.28324938889217 -84.48004464791855 -40.10513714810471
+ vertex -124.0768195072472 -81.43374411383469 -41.285281374238636
+ vertex -127.8007287435203 -83.5837441138347 -41.285281374238636
+ endloop
+endfacet
+facet normal -0.37591990373949075 0.6511123728532002 0.6593458151000637
+ outer loop
+ vertex -124.0768195072472 -81.43374411383469 -41.285281374238636
+ vertex -127.28324938889217 -84.48004464791855 -40.10513714810471
+ vertex -123.55934015261907 -82.33004464791854 -40.10513714810471
+ endloop
+endfacet
+facet normal -0.3296729075500355 0.5710102257556193 0.7518398074789752
+ outer loop
+ vertex -128.39080085658725 -82.56170923387319 -42.32024008349488
+ vertex -124.0768195072472 -81.43374411383469 -41.285281374238636
+ vertex -124.66689162031415 -80.41170923387318 -42.32024008349488
+ endloop
+endfacet
+facet normal -0.3296729075500355 0.5710102257556193 0.7518398074789752
+ outer loop
+ vertex -124.0768195072472 -81.43374411383469 -41.285281374238636
+ vertex -128.39080085658725 -82.56170923387319 -42.32024008349488
+ vertex -127.8007287435203 -83.5837441138347 -41.285281374238636
+ endloop
+endfacet
+facet normal -0.27778511650979765 0.4811379353814101 0.8314696123025496
+ outer loop
+ vertex -129.0433694306396 -81.43142730819177 -43.192304845413325
+ vertex -124.66689162031415 -80.41170923387318 -42.32024008349488
+ vertex -125.31946019436647 -79.28142730819178 -43.192304845413325
+ endloop
+endfacet
+facet normal -0.27778511650979765 0.4811379353814101 0.8314696123025496
+ outer loop
+ vertex -124.66689162031415 -80.41170923387318 -42.32024008349488
+ vertex -129.0433694306396 -81.43142730819177 -43.192304845413325
+ vertex -128.39080085658725 -82.56170923387319 -42.32024008349488
+ endloop
+endfacet
+facet normal -0.22114434510950054 0.3830332415362013 0.8968727415326885
+ outer loop
+ vertex -129.74726883644905 -80.21223777391224 -43.8865543901355
+ vertex -125.31946019436647 -79.28142730819178 -43.192304845413325
+ vertex -126.02335960017594 -78.06223777391224 -43.8865543901355
+ endloop
+endfacet
+facet normal -0.22114434510950054 0.3830332415362013 0.8968727415326885
+ outer loop
+ vertex -125.31946019436647 -79.28142730819178 -43.192304845413325
+ vertex -129.74726883644905 -80.21223777391224 -43.8865543901355
+ vertex -129.0433694306396 -81.43142730819177 -43.192304845413325
+ endloop
+endfacet
+facet normal -0.1607197326515819 0.27837474273142676 0.9469301294951049
+ outer loop
+ vertex -130.49045516002442 -78.92500130198931 -44.391109915468874
+ vertex -126.02335960017594 -78.06223777391224 -43.8865543901355
+ vertex -126.76654592375135 -76.7750013019893 -44.391109915468874
+ endloop
+endfacet
+facet normal -0.1607197326515819 0.27837474273142676 0.9469301294951049
+ outer loop
+ vertex -126.02335960017594 -78.06223777391224 -43.8865543901355
+ vertex -130.49045516002442 -78.92500130198931 -44.391109915468874
+ vertex -129.74726883644905 -80.21223777391224 -43.8865543901355
+ endloop
+endfacet
+facet normal -0.09754516100806387 0.16895317489845335 0.9807852804032307
+ outer loop
+ vertex -131.26021227731925 -77.59174286534694 -44.69733833648578
+ vertex -126.76654592375135 -76.7750013019893 -44.391109915468874
+ vertex -127.53630304104615 -75.44174286534694 -44.69733833648578
+ endloop
+endfacet
+facet normal -0.09754516100806387 0.16895317489845335 0.9807852804032307
+ outer loop
+ vertex -126.76654592375135 -76.7750013019893 -44.391109915468874
+ vertex -131.26021227731925 -77.59174286534694 -44.69733833648578
+ vertex -130.49045516002442 -78.92500130198931 -44.391109915468874
+ endloop
+endfacet
+facet normal -0.03270156461507213 0.05664077140030155 0.9978589232386036
+ outer loop
+ vertex -132.0433694306396 -76.23527488548514 -44.800000000000054
+ vertex -127.53630304104615 -75.44174286534694 -44.69733833648578
+ vertex -128.31946019436646 -74.08527488548513 -44.800000000000054
+ endloop
+endfacet
+facet normal -0.03270156461507213 0.05664077140030155 0.9978589232386036
+ outer loop
+ vertex -127.53630304104615 -75.44174286534694 -44.69733833648578
+ vertex -132.0433694306396 -76.23527488548514 -44.800000000000054
+ vertex -131.26021227731925 -77.59174286534694 -44.69733833648578
+ endloop
+endfacet
+facet normal 0.03270156461507213 -0.05664077140030155 0.9978589232386036
+ outer loop
+ vertex -132.8265265839599 -74.87880690562336 -44.69733833648578
+ vertex -128.31946019436646 -74.08527488548513 -44.800000000000054
+ vertex -129.1026173476868 -72.72880690562336 -44.69733833648578
+ endloop
+endfacet
+facet normal 0.03270156461507213 -0.05664077140030155 0.9978589232386036
+ outer loop
+ vertex -128.31946019436646 -74.08527488548513 -44.800000000000054
+ vertex -132.8265265839599 -74.87880690562336 -44.69733833648578
+ vertex -132.0433694306396 -76.23527488548514 -44.800000000000054
+ endloop
+endfacet
+facet normal 0.09754516100806387 -0.16895317489845335 0.9807852804032307
+ outer loop
+ vertex -133.5962837012547 -73.54554846898098 -44.391109915468874
+ vertex -129.1026173476868 -72.72880690562336 -44.69733833648578
+ vertex -129.87237446498162 -71.39554846898098 -44.391109915468874
+ endloop
+endfacet
+facet normal 0.09754516100806387 -0.16895317489845335 0.9807852804032307
+ outer loop
+ vertex -129.1026173476868 -72.72880690562336 -44.69733833648578
+ vertex -133.5962837012547 -73.54554846898098 -44.391109915468874
+ vertex -132.8265265839599 -74.87880690562336 -44.69733833648578
+ endloop
+endfacet
+facet normal 0.1607197326515819 -0.27837474273142676 0.9469301294951049
+ outer loop
+ vertex -134.33947002483012 -72.25831199705806 -43.8865543901355
+ vertex -129.87237446498162 -71.39554846898098 -44.391109915468874
+ vertex -130.615560788557 -70.10831199705805 -43.8865543901355
+ endloop
+endfacet
+facet normal 0.1607197326515819 -0.27837474273142676 0.9469301294951049
+ outer loop
+ vertex -129.87237446498162 -71.39554846898098 -44.391109915468874
+ vertex -134.33947002483012 -72.25831199705806 -43.8865543901355
+ vertex -133.5962837012547 -73.54554846898098 -44.391109915468874
+ endloop
+endfacet
+facet normal 0.22114434510949837 -0.3830332415361975 0.8968727415326905
+ outer loop
+ vertex -135.04336943063956 -71.03912246277851 -43.19230484541332
+ vertex -130.615560788557 -70.10831199705805 -43.8865543901355
+ vertex -131.31946019436648 -68.8891224627785 -43.19230484541332
+ endloop
+endfacet
+facet normal 0.22114434510949837 -0.3830332415361975 0.8968727415326905
+ outer loop
+ vertex -130.615560788557 -70.10831199705805 -43.8865543901355
+ vertex -135.04336943063956 -71.03912246277851 -43.19230484541332
+ vertex -134.33947002483012 -72.25831199705806 -43.8865543901355
+ endloop
+endfacet
+facet normal 0.2777851165098016 -0.4811379353814169 0.8314696123025443
+ outer loop
+ vertex -135.6959380046919 -69.9088405370971 -42.32024008349487
+ vertex -131.31946019436648 -68.8891224627785 -43.19230484541332
+ vertex -131.9720287684188 -67.7588405370971 -42.32024008349487
+ endloop
+endfacet
+facet normal 0.2777851165098016 -0.4811379353814169 0.8314696123025443
+ outer loop
+ vertex -131.31946019436648 -68.8891224627785 -43.19230484541332
+ vertex -135.6959380046919 -69.9088405370971 -42.32024008349487
+ vertex -135.04336943063956 -71.03912246277851 -43.19230484541332
+ endloop
+endfacet
+facet normal 0.3296729075500355 -0.5710102257556193 0.7518398074789752
+ outer loop
+ vertex -136.28601011775885 -68.88680565713561 -41.28528137423862
+ vertex -131.9720287684188 -67.7588405370971 -42.32024008349487
+ vertex -132.56210088148578 -66.7368056571356 -41.28528137423862
+ endloop
+endfacet
+facet normal 0.3296729075500355 -0.5710102257556193 0.7518398074789752
+ outer loop
+ vertex -131.9720287684188 -67.7588405370971 -42.32024008349487
+ vertex -136.28601011775885 -68.88680565713561 -41.28528137423862
+ vertex -135.6959380046919 -69.9088405370971 -42.32024008349487
+ endloop
+endfacet
+facet normal 0.3759199037394872 -0.651112372853194 0.6593458151000718
+ outer loop
+ vertex -133.07958023611388 -65.84050512305173 -40.105137148104696
+ vertex -136.28601011775885 -68.88680565713561 -41.28528137423862
+ vertex -132.56210088148578 -66.7368056571356 -41.28528137423862
+ endloop
+endfacet
+facet normal 0.3759199037394872 -0.651112372853194 0.6593458151000718
+ outer loop
+ vertex -136.28601011775885 -68.88680565713561 -41.28528137423862
+ vertex -133.07958023611388 -65.84050512305173 -40.105137148104696
+ vertex -136.80348947238699 -67.99050512305173 -40.105137148104696
+ endloop
+endfacet
+facet normal 0.4157348061512726 -0.7200738067288031 0.5555702330196013
+ outer loop
+ vertex -133.51561261707312 -65.08527488548513 -38.800000000000054
+ vertex -136.80348947238699 -67.99050512305173 -40.105137148104696
+ vertex -133.07958023611388 -65.84050512305173 -40.105137148104696
+ endloop
+endfacet
+facet normal 0.4157348061512726 -0.7200738067288031 0.5555702330196013
+ outer loop
+ vertex -136.80348947238699 -67.99050512305173 -40.105137148104696
+ vertex -133.51561261707312 -65.08527488548513 -38.800000000000054
+ vertex -137.2395218533462 -67.23527488548514 -38.800000000000054
+ endloop
+endfacet
+facet normal 0.4484363707663455 -0.7767145781291059 0.4422886902189947
+ outer loop
+ vertex -133.8627373894342 -64.48403714318997 -37.39220118838113
+ vertex -137.2395218533462 -67.23527488548514 -38.800000000000054
+ vertex -133.51561261707312 -65.08527488548513 -38.800000000000054
+ endloop
+endfacet
+facet normal 0.4484363707663455 -0.7767145781291059 0.4422886902189947
+ outer loop
+ vertex -137.2395218533462 -67.23527488548514 -38.800000000000054
+ vertex -133.8627373894342 -64.48403714318997 -37.39220118838113
+ vertex -137.5866466257073 -66.63403714318997 -37.39220118838113
+ endloop
+endfacet
+facet normal 0.473465064747552 -0.820065547751649 0.3214394653031649
+ outer loop
+ vertex -134.11501515210088 -64.04707924063145 -35.9058285412303
+ vertex -137.5866466257073 -66.63403714318997 -37.39220118838113
+ vertex -133.8627373894342 -64.48403714318997 -37.39220118838113
+ endloop
+endfacet
+facet normal 0.473465064747552 -0.820065547751649 0.3214394653031649
+ outer loop
+ vertex -137.5866466257073 -66.63403714318997 -37.39220118838113
+ vertex -134.11501515210088 -64.04707924063145 -35.9058285412303
+ vertex -137.83892438837398 -66.19707924063145 -35.9058285412303
+ endloop
+endfacet
+facet normal 0.49039264020161505 -0.8493849684870419 0.1950903220161271
+ outer loop
+ vertex -134.26812936260933 -63.781877648670005 -34.36631430664067
+ vertex -137.83892438837398 -66.19707924063145 -35.9058285412303
+ vertex -134.11501515210088 -64.04707924063145 -35.9058285412303
+ endloop
+endfacet
+facet normal 0.49039264020161505 -0.8493849684870419 0.1950903220161271
+ outer loop
+ vertex -137.83892438837398 -66.19707924063145 -35.9058285412303
+ vertex -134.26812936260933 -63.781877648670005 -34.36631430664067
+ vertex -137.99203859888243 -65.93187764867001 -34.36631430664067
+ endloop
+endfacet
+facet normal 0.49892946161930135 -0.8641711769176168 0.06540312923014473
+ outer loop
+ vertex -134.31946019436648 -63.69297004007188 -32.800000000000054
+ vertex -137.99203859888243 -65.93187764867001 -34.36631430664067
+ vertex -134.26812936260933 -63.781877648670005 -34.36631430664067
+ endloop
+endfacet
+facet normal 0.49892946161930135 -0.8641711769176168 0.06540312923014473
+ outer loop
+ vertex -137.99203859888243 -65.93187764867001 -34.36631430664067
+ vertex -134.31946019436648 -63.69297004007188 -32.800000000000054
+ vertex -138.04336943063956 -65.84297004007189 -32.800000000000054
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -99.77635347630536 66.66842796235208 -3.0000000000000058
+ vertex -107.62472898392257 53.074642826279955 -3.0000000000000058
+ vertex -103.92304845413261 59.9999999999998 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -107.62472898392257 53.074642826279955 -3.0000000000000058
+ vertex -99.77635347630536 66.66842796235208 -3.0000000000000058
+ vertex -95.2024008349482 73.05137148104633 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -107.62472898392257 53.074642826279955 -3.0000000000000058
+ vertex -95.2024008349482 73.05137148104633 -3.0000000000000058
+ vertex -110.8655439013544 45.922011883810605 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -110.8655439013544 45.922011883810605 -3.0000000000000058
+ vertex -95.2024008349482 73.05137148104633 -3.0000000000000058
+ vertex -90.22077689747728 79.12149781200809 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -110.8655439013544 45.922011883810605 -3.0000000000000058
+ vertex -90.22077689747728 79.12149781200809 -3.0000000000000058
+ vertex -113.63161553941268 38.57273583637922 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -113.63161553941268 38.57273583637922 -3.0000000000000058
+ vertex -90.22077689747728 79.12149781200809 -3.0000000000000058
+ vertex -84.85281374238566 84.85281374238551 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -113.63161553941268 38.57273583637922 -3.0000000000000058
+ vertex -84.85281374238566 84.85281374238551 -3.0000000000000058
+ vertex -115.9110991546882 31.05828541230235 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -115.9110991546882 31.05828541230235 -3.0000000000000058
+ vertex -84.85281374238566 84.85281374238551 -3.0000000000000058
+ vertex -117.69423364838764 23.410838641935243 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -117.69423364838764 23.410838641935243 -3.0000000000000058
+ vertex -84.85281374238566 84.85281374238551 -3.0000000000000058
+ vertex -79.12149781200824 90.2207768974771 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -117.69423364838764 23.410838641935243 -3.0000000000000058
+ vertex -79.12149781200824 90.2207768974771 -3.0000000000000058
+ vertex -73.05137148104644 95.202400834948 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -117.69423364838764 23.410838641935243 -3.0000000000000058
+ vertex -73.05137148104644 95.202400834948 -3.0000000000000058
+ vertex -118.97338336485723 15.663143066406052 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -118.97338336485723 15.663143066406052 -3.0000000000000058
+ vertex -73.05137148104644 95.202400834948 -3.0000000000000058
+ vertex -119.74307078863242 7.848375507616978 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -119.74307078863242 7.848375507616978 -3.0000000000000058
+ vertex -73.05137148104644 95.202400834948 -3.0000000000000058
+ vertex -66.66842796235221 99.77635347630525 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -119.74307078863242 7.848375507616978 -3.0000000000000058
+ vertex -66.66842796235221 99.77635347630525 -3.0000000000000058
+ vertex -59.999999999999915 103.92304845413243 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -119.74307078863242 7.848375507616978 -3.0000000000000058
+ vertex -59.999999999999915 103.92304845413243 -3.0000000000000058
+ vertex -120.0 -1.8047785488306544e-13 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -120.0 -1.8047785488306544e-13 -3.0000000000000058
+ vertex -59.999999999999915 103.92304845413243 -3.0000000000000058
+ vertex -119.74307078863242 -7.8483755076173445 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -119.74307078863242 -7.8483755076173445 -3.0000000000000058
+ vertex -59.999999999999915 103.92304845413243 -3.0000000000000058
+ vertex -53.07464282628009 107.62472898392238 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -119.74307078863242 -7.8483755076173445 -3.0000000000000058
+ vertex -53.07464282628009 107.62472898392238 -3.0000000000000058
+ vertex -118.97338336485727 -15.663143066406345 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -118.97338336485727 -15.663143066406345 -3.0000000000000058
+ vertex -53.07464282628009 107.62472898392238 -3.0000000000000058
+ vertex -45.922011883810725 110.86554390135421 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -118.97338336485727 -15.663143066406345 -3.0000000000000058
+ vertex -45.922011883810725 110.86554390135421 -3.0000000000000058
+ vertex -117.69423364838765 -23.410838641935552 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -117.69423364838765 -23.410838641935552 -3.0000000000000058
+ vertex -45.922011883810725 110.86554390135421 -3.0000000000000058
+ vertex -38.572735836379344 113.63161553941245 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -117.69423364838765 -23.410838641935552 -3.0000000000000058
+ vertex -38.572735836379344 113.63161553941245 -3.0000000000000058
+ vertex -115.91109915468822 -31.058285412302638 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -115.91109915468822 -31.058285412302638 -3.0000000000000058
+ vertex -38.572735836379344 113.63161553941245 -3.0000000000000058
+ vertex -31.058285412302418 115.91109915468799 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -115.91109915468822 -31.058285412302638 -3.0000000000000058
+ vertex -31.058285412302418 115.91109915468799 -3.0000000000000058
+ vertex -113.6316155394127 -38.572735836379586 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -113.6316155394127 -38.572735836379586 -3.0000000000000058
+ vertex -31.058285412302418 115.91109915468799 -3.0000000000000058
+ vertex -23.41083864193531 117.69423364838741 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -113.6316155394127 -38.572735836379586 -3.0000000000000058
+ vertex -23.41083864193531 117.69423364838741 -3.0000000000000058
+ vertex -110.86554390135444 -45.92201188381096 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -110.86554390135444 -45.92201188381096 -3.0000000000000058
+ vertex -23.41083864193531 117.69423364838741 -3.0000000000000058
+ vertex -15.663143066406086 118.97338336485703 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -110.86554390135444 -45.92201188381096 -3.0000000000000058
+ vertex -15.663143066406086 118.97338336485703 -3.0000000000000058
+ vertex -107.62472898392265 -53.0746428262803 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -107.62472898392265 -53.0746428262803 -3.0000000000000058
+ vertex -15.663143066406086 118.97338336485703 -3.0000000000000058
+ vertex -7.8483755076170905 119.74307078863217 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -107.62472898392265 -53.0746428262803 -3.0000000000000058
+ vertex -7.8483755076170905 119.74307078863217 -3.0000000000000058
+ vertex -103.9230484541327 -60.000000000000185 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -103.9230484541327 -60.000000000000185 -3.0000000000000058
+ vertex -7.8483755076170905 119.74307078863217 -3.0000000000000058
+ vertex 4.511946372076636e-14 119.99999999999976 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -103.9230484541327 -60.000000000000185 -3.0000000000000058
+ vertex 4.511946372076636e-14 119.99999999999976 -3.0000000000000058
+ vertex -99.77635347630545 -66.66842796235247 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -99.77635347630545 -66.66842796235247 -3.0000000000000058
+ vertex 4.511946372076636e-14 119.99999999999976 -3.0000000000000058
+ vertex 7.848375507617226 119.74307078863215 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -99.77635347630545 -66.66842796235247 -3.0000000000000058
+ vertex 7.848375507617226 119.74307078863215 -3.0000000000000058
+ vertex -95.20240083494828 -73.05137148104666 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -95.20240083494828 -73.05137148104666 -3.0000000000000058
+ vertex 7.848375507617226 119.74307078863215 -3.0000000000000058
+ vertex 15.663143066406267 118.97338336485703 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -95.20240083494828 -73.05137148104666 -3.0000000000000058
+ vertex 15.663143066406267 118.97338336485703 -3.0000000000000058
+ vertex -90.22077689747731 -79.12149781200849 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -90.22077689747731 -79.12149781200849 -3.0000000000000058
+ vertex 15.663143066406267 118.97338336485703 -3.0000000000000058
+ vertex 23.410838641935424 117.69423364838737 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -90.22077689747731 -79.12149781200849 -3.0000000000000058
+ vertex 23.410838641935424 117.69423364838737 -3.0000000000000058
+ vertex -84.85281374238579 -84.85281374238586 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -84.85281374238579 -84.85281374238586 -3.0000000000000058
+ vertex 23.410838641935424 117.69423364838737 -3.0000000000000058
+ vertex 31.058285412302553 115.9110991546879 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -84.85281374238579 -84.85281374238586 -3.0000000000000058
+ vertex 31.058285412302553 115.9110991546879 -3.0000000000000058
+ vertex -79.12149781200831 -90.22077689747748 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -79.12149781200831 -90.22077689747748 -3.0000000000000058
+ vertex 31.058285412302553 115.9110991546879 -3.0000000000000058
+ vertex 38.57273583637948 113.63161553941242 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -79.12149781200831 -90.22077689747748 -3.0000000000000058
+ vertex 38.57273583637948 113.63161553941242 -3.0000000000000058
+ vertex -73.05137148104657 -95.20240083494838 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -73.05137148104657 -95.20240083494838 -3.0000000000000058
+ vertex 38.57273583637948 113.63161553941242 -3.0000000000000058
+ vertex 45.92201188381082 110.86554390135414 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -73.05137148104657 -95.20240083494838 -3.0000000000000058
+ vertex 45.92201188381082 110.86554390135414 -3.0000000000000058
+ vertex -66.66842796235233 -99.77635347630563 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -66.66842796235233 -99.77635347630563 -3.0000000000000058
+ vertex 45.92201188381082 110.86554390135414 -3.0000000000000058
+ vertex 53.074642826280225 107.62472898392231 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -66.66842796235233 -99.77635347630563 -3.0000000000000058
+ vertex 53.074642826280225 107.62472898392231 -3.0000000000000058
+ vertex -60.00000000000003 -103.92304845413288 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -60.00000000000003 -103.92304845413288 -3.0000000000000058
+ vertex 53.074642826280225 107.62472898392231 -3.0000000000000058
+ vertex 60.00000000000007 103.92304845413234 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -60.00000000000003 -103.92304845413288 -3.0000000000000058
+ vertex 60.00000000000007 103.92304845413234 -3.0000000000000058
+ vertex -53.074642826280225 -107.62472898392284 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -53.074642826280225 -107.62472898392284 -3.0000000000000058
+ vertex 60.00000000000007 103.92304845413234 -3.0000000000000058
+ vertex 66.66842796235235 99.77635347630513 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -53.074642826280225 -107.62472898392284 -3.0000000000000058
+ vertex 66.66842796235235 99.77635347630513 -3.0000000000000058
+ vertex -45.9220118838108 -110.86554390135464 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -45.9220118838108 -110.86554390135464 -3.0000000000000058
+ vertex 66.66842796235235 99.77635347630513 -3.0000000000000058
+ vertex 73.0513714810465 95.20240083494792 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -45.9220118838108 -110.86554390135464 -3.0000000000000058
+ vertex 73.0513714810465 95.20240083494792 -3.0000000000000058
+ vertex -38.57273583637951 -113.63161553941288 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -38.57273583637951 -113.63161553941288 -3.0000000000000058
+ vertex 73.0513714810465 95.20240083494792 -3.0000000000000058
+ vertex 79.12149781200833 90.22077689747698 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -38.57273583637951 -113.63161553941288 -3.0000000000000058
+ vertex 79.12149781200833 90.22077689747698 -3.0000000000000058
+ vertex -31.058285412302553 -115.91109915468842 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -31.058285412302553 -115.91109915468842 -3.0000000000000058
+ vertex 79.12149781200833 90.22077689747698 -3.0000000000000058
+ vertex 84.85281374238573 84.8528137423854 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -31.058285412302553 -115.91109915468842 -3.0000000000000058
+ vertex 84.85281374238573 84.8528137423854 -3.0000000000000058
+ vertex -23.410838641935378 -117.69423364838791 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -23.410838641935378 -117.69423364838791 -3.0000000000000058
+ vertex 84.85281374238573 84.8528137423854 -3.0000000000000058
+ vertex 90.22077689747732 79.12149781200795 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -23.410838641935378 -117.69423364838791 -3.0000000000000058
+ vertex 90.22077689747732 79.12149781200795 -3.0000000000000058
+ vertex 95.20240083494826 73.05137148104622 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -23.410838641935378 -117.69423364838791 -3.0000000000000058
+ vertex 95.20240083494826 73.05137148104622 -3.0000000000000058
+ vertex -15.663143066406267 -118.9733833648575 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -15.663143066406267 -118.9733833648575 -3.0000000000000058
+ vertex 95.20240083494826 73.05137148104622 -3.0000000000000058
+ vertex -7.848375507617181 -119.74307078863266 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -7.848375507617181 -119.74307078863266 -3.0000000000000058
+ vertex 95.20240083494826 73.05137148104622 -3.0000000000000058
+ vertex 99.77635347630545 66.66842796235197 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -7.848375507617181 -119.74307078863266 -3.0000000000000058
+ vertex 99.77635347630545 66.66842796235197 -3.0000000000000058
+ vertex -9.023892744153272e-14 -120.00000000000027 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -9.023892744153272e-14 -120.00000000000027 -3.0000000000000058
+ vertex 99.77635347630545 66.66842796235197 -3.0000000000000058
+ vertex 103.92304845413274 59.99999999999973 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex -9.023892744153272e-14 -120.00000000000027 -3.0000000000000058
+ vertex 103.92304845413274 59.99999999999973 -3.0000000000000058
+ vertex 7.8483755076171136 -119.74307078863269 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 7.8483755076171136 -119.74307078863269 -3.0000000000000058
+ vertex 103.92304845413274 59.99999999999973 -3.0000000000000058
+ vertex 107.62472898392265 53.07464282627982 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 7.8483755076171136 -119.74307078863269 -3.0000000000000058
+ vertex 107.62472898392265 53.07464282627982 -3.0000000000000058
+ vertex 15.663143066406086 -118.97338336485755 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 15.663143066406086 -118.97338336485755 -3.0000000000000058
+ vertex 107.62472898392265 53.07464282627982 -3.0000000000000058
+ vertex 110.86554390135444 45.92201188381046 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 15.663143066406086 -118.97338336485755 -3.0000000000000058
+ vertex 110.86554390135444 45.92201188381046 -3.0000000000000058
+ vertex 23.41083864193531 -117.69423364838794 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 23.41083864193531 -117.69423364838794 -3.0000000000000058
+ vertex 110.86554390135444 45.92201188381046 -3.0000000000000058
+ vertex 113.63161553941275 38.572735836379074 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 23.41083864193531 -117.69423364838794 -3.0000000000000058
+ vertex 113.63161553941275 38.572735836379074 -3.0000000000000058
+ vertex 31.058285412302485 -115.91109915468847 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 31.058285412302485 -115.91109915468847 -3.0000000000000058
+ vertex 113.63161553941275 38.572735836379074 -3.0000000000000058
+ vertex 115.91109915468824 31.058285412302236 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 31.058285412302485 -115.91109915468847 -3.0000000000000058
+ vertex 115.91109915468824 31.058285412302236 -3.0000000000000058
+ vertex 117.69423364838768 23.410838641935086 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 31.058285412302485 -115.91109915468847 -3.0000000000000058
+ vertex 117.69423364838768 23.410838641935086 -3.0000000000000058
+ vertex 38.5727358363793 -113.63161553941298 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 38.5727358363793 -113.63161553941298 -3.0000000000000058
+ vertex 117.69423364838768 23.410838641935086 -3.0000000000000058
+ vertex 45.92201188381077 -110.86554390135471 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 45.92201188381077 -110.86554390135471 -3.0000000000000058
+ vertex 117.69423364838768 23.410838641935086 -3.0000000000000058
+ vertex 118.97338336485727 15.663143066405883 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 45.92201188381077 -110.86554390135471 -3.0000000000000058
+ vertex 118.97338336485727 15.663143066405883 -3.0000000000000058
+ vertex 119.74307078863244 7.848375507616888 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 45.92201188381077 -110.86554390135471 -3.0000000000000058
+ vertex 119.74307078863244 7.848375507616888 -3.0000000000000058
+ vertex 53.07464282628005 -107.62472898392292 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 53.07464282628005 -107.62472898392292 -3.0000000000000058
+ vertex 119.74307078863244 7.848375507616888 -3.0000000000000058
+ vertex 59.99999999999998 -103.92304845413295 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 59.99999999999998 -103.92304845413295 -3.0000000000000058
+ vertex 119.74307078863244 7.848375507616888 -3.0000000000000058
+ vertex 120.00000000000006 -3.158362460453645e-13 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 59.99999999999998 -103.92304845413295 -3.0000000000000058
+ vertex 120.00000000000006 -3.158362460453645e-13 -3.0000000000000058
+ vertex 66.66842796235217 -99.77635347630576 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 66.66842796235217 -99.77635347630576 -3.0000000000000058
+ vertex 120.00000000000006 -3.158362460453645e-13 -3.0000000000000058
+ vertex 119.74307078863244 -7.848375507617474 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 66.66842796235217 -99.77635347630576 -3.0000000000000058
+ vertex 119.74307078863244 -7.848375507617474 -3.0000000000000058
+ vertex 73.05137148104646 -95.20240083494856 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 73.05137148104646 -95.20240083494856 -3.0000000000000058
+ vertex 119.74307078863244 -7.848375507617474 -3.0000000000000058
+ vertex 118.97338336485727 -15.66314306640647 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 73.05137148104646 -95.20240083494856 -3.0000000000000058
+ vertex 118.97338336485727 -15.66314306640647 -3.0000000000000058
+ vertex 117.69423364838772 -23.410838641935694 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 73.05137148104646 -95.20240083494856 -3.0000000000000058
+ vertex 117.69423364838772 -23.410838641935694 -3.0000000000000058
+ vertex 79.12149781200829 -90.2207768974776 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 79.12149781200829 -90.2207768974776 -3.0000000000000058
+ vertex 117.69423364838772 -23.410838641935694 -3.0000000000000058
+ vertex 115.91109915468824 -31.058285412302777 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 79.12149781200829 -90.2207768974776 -3.0000000000000058
+ vertex 115.91109915468824 -31.058285412302777 -3.0000000000000058
+ vertex 84.85281374238565 -84.85281374238605 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 84.85281374238565 -84.85281374238605 -3.0000000000000058
+ vertex 115.91109915468824 -31.058285412302777 -3.0000000000000058
+ vertex 90.22077689747728 -79.1214978120086 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 90.22077689747728 -79.1214978120086 -3.0000000000000058
+ vertex 115.91109915468824 -31.058285412302777 -3.0000000000000058
+ vertex 113.63161553941275 -38.57273583637973 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 90.22077689747728 -79.1214978120086 -3.0000000000000058
+ vertex 113.63161553941275 -38.57273583637973 -3.0000000000000058
+ vertex 95.20240083494818 -73.05137148104687 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 95.20240083494818 -73.05137148104687 -3.0000000000000058
+ vertex 113.63161553941275 -38.57273583637973 -3.0000000000000058
+ vertex 110.86554390135449 -45.92201188381109 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 95.20240083494818 -73.05137148104687 -3.0000000000000058
+ vertex 110.86554390135449 -45.92201188381109 -3.0000000000000058
+ vertex 99.7763534763054 -66.66842796235262 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 99.7763534763054 -66.66842796235262 -3.0000000000000058
+ vertex 110.86554390135449 -45.92201188381109 -3.0000000000000058
+ vertex 107.62472898392261 -53.07464282628045 -3.0000000000000058
+ endloop
+endfacet
+facet normal -2.648712187159291e-31 3.369258291131702e-32 -1.0
+ outer loop
+ vertex 99.7763534763054 -66.66842796235262 -3.0000000000000058
+ vertex 107.62472898392261 -53.07464282628045 -3.0000000000000058
+ vertex 103.9230484541327 -60.00000000000032 -3.0000000000000058
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -107.62472898392257 53.074642826279955 -1.127986593019159e-14
+ vertex -99.77635347630536 66.66842796235208 -1.127986593019159e-14
+ vertex -103.92304845413261 59.9999999999998 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -99.77635347630536 66.66842796235208 -1.127986593019159e-14
+ vertex -107.62472898392257 53.074642826279955 -1.127986593019159e-14
+ vertex -110.8655439013544 45.922011883810605 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -99.77635347630536 66.66842796235208 -1.127986593019159e-14
+ vertex -110.8655439013544 45.922011883810605 -1.127986593019159e-14
+ vertex -95.2024008349482 73.05137148104633 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -95.2024008349482 73.05137148104633 -1.127986593019159e-14
+ vertex -110.8655439013544 45.922011883810605 -1.127986593019159e-14
+ vertex -113.63161553941268 38.57273583637922 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -95.2024008349482 73.05137148104633 -1.127986593019159e-14
+ vertex -113.63161553941268 38.57273583637922 -1.127986593019159e-14
+ vertex -90.22077689747728 79.12149781200809 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -90.22077689747728 79.12149781200809 -1.127986593019159e-14
+ vertex -113.63161553941268 38.57273583637922 -1.127986593019159e-14
+ vertex -115.9110991546882 31.05828541230235 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -90.22077689747728 79.12149781200809 -1.127986593019159e-14
+ vertex -115.9110991546882 31.05828541230235 -1.127986593019159e-14
+ vertex -84.85281374238566 84.85281374238551 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -84.85281374238566 84.85281374238551 -1.127986593019159e-14
+ vertex -115.9110991546882 31.05828541230235 -1.127986593019159e-14
+ vertex -117.69423364838764 23.410838641935243 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -84.85281374238566 84.85281374238551 -1.127986593019159e-14
+ vertex -117.69423364838764 23.410838641935243 -1.127986593019159e-14
+ vertex -79.12149781200824 90.2207768974771 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -79.12149781200824 90.2207768974771 -1.127986593019159e-14
+ vertex -117.69423364838764 23.410838641935243 -1.127986593019159e-14
+ vertex -118.97338336485723 15.663143066406052 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -79.12149781200824 90.2207768974771 -1.127986593019159e-14
+ vertex -118.97338336485723 15.663143066406052 -1.127986593019159e-14
+ vertex -73.05137148104644 95.202400834948 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -73.05137148104644 95.202400834948 -1.127986593019159e-14
+ vertex -118.97338336485723 15.663143066406052 -1.127986593019159e-14
+ vertex -119.74307078863242 7.848375507616978 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -73.05137148104644 95.202400834948 -1.127986593019159e-14
+ vertex -119.74307078863242 7.848375507616978 -1.127986593019159e-14
+ vertex -66.66842796235221 99.77635347630525 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -66.66842796235221 99.77635347630525 -1.127986593019159e-14
+ vertex -119.74307078863242 7.848375507616978 -1.127986593019159e-14
+ vertex -120.0 -1.8047785488306544e-13 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -66.66842796235221 99.77635347630525 -1.127986593019159e-14
+ vertex -120.0 -1.8047785488306544e-13 -1.127986593019159e-14
+ vertex -59.999999999999915 103.92304845413243 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -59.999999999999915 103.92304845413243 -1.127986593019159e-14
+ vertex -120.0 -1.8047785488306544e-13 -1.127986593019159e-14
+ vertex -119.74307078863242 -7.8483755076173445 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -59.999999999999915 103.92304845413243 -1.127986593019159e-14
+ vertex -119.74307078863242 -7.8483755076173445 -1.127986593019159e-14
+ vertex -53.07464282628009 107.62472898392238 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -53.07464282628009 107.62472898392238 -1.127986593019159e-14
+ vertex -119.74307078863242 -7.8483755076173445 -1.127986593019159e-14
+ vertex -118.97338336485727 -15.663143066406345 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -53.07464282628009 107.62472898392238 -1.127986593019159e-14
+ vertex -118.97338336485727 -15.663143066406345 -1.127986593019159e-14
+ vertex -45.922011883810725 110.86554390135421 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -45.922011883810725 110.86554390135421 -1.127986593019159e-14
+ vertex -118.97338336485727 -15.663143066406345 -1.127986593019159e-14
+ vertex -117.69423364838765 -23.410838641935552 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -45.922011883810725 110.86554390135421 -1.127986593019159e-14
+ vertex -117.69423364838765 -23.410838641935552 -1.127986593019159e-14
+ vertex -38.572735836379344 113.63161553941245 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -38.572735836379344 113.63161553941245 -1.127986593019159e-14
+ vertex -117.69423364838765 -23.410838641935552 -1.127986593019159e-14
+ vertex -115.91109915468822 -31.058285412302638 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -38.572735836379344 113.63161553941245 -1.127986593019159e-14
+ vertex -115.91109915468822 -31.058285412302638 -1.127986593019159e-14
+ vertex -31.058285412302418 115.91109915468799 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -31.058285412302418 115.91109915468799 -1.127986593019159e-14
+ vertex -115.91109915468822 -31.058285412302638 -1.127986593019159e-14
+ vertex -113.6316155394127 -38.572735836379586 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -31.058285412302418 115.91109915468799 -1.127986593019159e-14
+ vertex -113.6316155394127 -38.572735836379586 -1.127986593019159e-14
+ vertex -23.41083864193531 117.69423364838741 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -23.41083864193531 117.69423364838741 -1.127986593019159e-14
+ vertex -113.6316155394127 -38.572735836379586 -1.127986593019159e-14
+ vertex -110.86554390135444 -45.92201188381096 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -23.41083864193531 117.69423364838741 -1.127986593019159e-14
+ vertex -110.86554390135444 -45.92201188381096 -1.127986593019159e-14
+ vertex -15.663143066406086 118.97338336485703 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -15.663143066406086 118.97338336485703 -1.127986593019159e-14
+ vertex -110.86554390135444 -45.92201188381096 -1.127986593019159e-14
+ vertex -107.62472898392265 -53.0746428262803 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -15.663143066406086 118.97338336485703 -1.127986593019159e-14
+ vertex -107.62472898392265 -53.0746428262803 -1.127986593019159e-14
+ vertex -7.8483755076170905 119.74307078863217 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -7.8483755076170905 119.74307078863217 -1.127986593019159e-14
+ vertex -107.62472898392265 -53.0746428262803 -1.127986593019159e-14
+ vertex -103.9230484541327 -60.000000000000185 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex -7.8483755076170905 119.74307078863217 -1.127986593019159e-14
+ vertex -103.9230484541327 -60.000000000000185 -1.127986593019159e-14
+ vertex 4.511946372076636e-14 119.99999999999976 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 4.511946372076636e-14 119.99999999999976 -1.127986593019159e-14
+ vertex -103.9230484541327 -60.000000000000185 -1.127986593019159e-14
+ vertex -99.77635347630545 -66.66842796235247 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 4.511946372076636e-14 119.99999999999976 -1.127986593019159e-14
+ vertex -99.77635347630545 -66.66842796235247 -1.127986593019159e-14
+ vertex 7.848375507617226 119.74307078863215 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 7.848375507617226 119.74307078863215 -1.127986593019159e-14
+ vertex -99.77635347630545 -66.66842796235247 -1.127986593019159e-14
+ vertex -95.20240083494828 -73.05137148104666 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 7.848375507617226 119.74307078863215 -1.127986593019159e-14
+ vertex -95.20240083494828 -73.05137148104666 -1.127986593019159e-14
+ vertex 15.663143066406267 118.97338336485703 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 15.663143066406267 118.97338336485703 -1.127986593019159e-14
+ vertex -95.20240083494828 -73.05137148104666 -1.127986593019159e-14
+ vertex -90.22077689747731 -79.12149781200849 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 15.663143066406267 118.97338336485703 -1.127986593019159e-14
+ vertex -90.22077689747731 -79.12149781200849 -1.127986593019159e-14
+ vertex 23.410838641935424 117.69423364838737 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 23.410838641935424 117.69423364838737 -1.127986593019159e-14
+ vertex -90.22077689747731 -79.12149781200849 -1.127986593019159e-14
+ vertex -84.85281374238579 -84.85281374238586 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 23.410838641935424 117.69423364838737 -1.127986593019159e-14
+ vertex -84.85281374238579 -84.85281374238586 -1.127986593019159e-14
+ vertex 31.058285412302553 115.9110991546879 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 31.058285412302553 115.9110991546879 -1.127986593019159e-14
+ vertex -84.85281374238579 -84.85281374238586 -1.127986593019159e-14
+ vertex -79.12149781200831 -90.22077689747748 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 31.058285412302553 115.9110991546879 -1.127986593019159e-14
+ vertex -79.12149781200831 -90.22077689747748 -1.127986593019159e-14
+ vertex 38.57273583637948 113.63161553941242 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 38.57273583637948 113.63161553941242 -1.127986593019159e-14
+ vertex -79.12149781200831 -90.22077689747748 -1.127986593019159e-14
+ vertex -73.05137148104657 -95.20240083494838 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 38.57273583637948 113.63161553941242 -1.127986593019159e-14
+ vertex -73.05137148104657 -95.20240083494838 -1.127986593019159e-14
+ vertex 45.92201188381082 110.86554390135414 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 45.92201188381082 110.86554390135414 -1.127986593019159e-14
+ vertex -73.05137148104657 -95.20240083494838 -1.127986593019159e-14
+ vertex -66.66842796235233 -99.77635347630563 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 45.92201188381082 110.86554390135414 -1.127986593019159e-14
+ vertex -66.66842796235233 -99.77635347630563 -1.127986593019159e-14
+ vertex 53.074642826280225 107.62472898392231 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 53.074642826280225 107.62472898392231 -1.127986593019159e-14
+ vertex -66.66842796235233 -99.77635347630563 -1.127986593019159e-14
+ vertex -60.00000000000003 -103.92304845413288 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 53.074642826280225 107.62472898392231 -1.127986593019159e-14
+ vertex -60.00000000000003 -103.92304845413288 -1.127986593019159e-14
+ vertex 60.00000000000007 103.92304845413234 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 60.00000000000007 103.92304845413234 -1.127986593019159e-14
+ vertex -60.00000000000003 -103.92304845413288 -1.127986593019159e-14
+ vertex -53.074642826280225 -107.62472898392284 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 60.00000000000007 103.92304845413234 -1.127986593019159e-14
+ vertex -53.074642826280225 -107.62472898392284 -1.127986593019159e-14
+ vertex 66.66842796235235 99.77635347630513 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 66.66842796235235 99.77635347630513 -1.127986593019159e-14
+ vertex -53.074642826280225 -107.62472898392284 -1.127986593019159e-14
+ vertex -45.9220118838108 -110.86554390135464 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 66.66842796235235 99.77635347630513 -1.127986593019159e-14
+ vertex -45.9220118838108 -110.86554390135464 -1.127986593019159e-14
+ vertex 73.0513714810465 95.20240083494792 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 73.0513714810465 95.20240083494792 -1.127986593019159e-14
+ vertex -45.9220118838108 -110.86554390135464 -1.127986593019159e-14
+ vertex -38.57273583637951 -113.63161553941288 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 73.0513714810465 95.20240083494792 -1.127986593019159e-14
+ vertex -38.57273583637951 -113.63161553941288 -1.127986593019159e-14
+ vertex 79.12149781200833 90.22077689747698 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 79.12149781200833 90.22077689747698 -1.127986593019159e-14
+ vertex -38.57273583637951 -113.63161553941288 -1.127986593019159e-14
+ vertex -31.058285412302553 -115.91109915468842 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 79.12149781200833 90.22077689747698 -1.127986593019159e-14
+ vertex -31.058285412302553 -115.91109915468842 -1.127986593019159e-14
+ vertex 84.85281374238573 84.8528137423854 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 84.85281374238573 84.8528137423854 -1.127986593019159e-14
+ vertex -31.058285412302553 -115.91109915468842 -1.127986593019159e-14
+ vertex -23.410838641935378 -117.69423364838791 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 84.85281374238573 84.8528137423854 -1.127986593019159e-14
+ vertex -23.410838641935378 -117.69423364838791 -1.127986593019159e-14
+ vertex 90.22077689747732 79.12149781200795 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 90.22077689747732 79.12149781200795 -1.127986593019159e-14
+ vertex -23.410838641935378 -117.69423364838791 -1.127986593019159e-14
+ vertex -15.663143066406267 -118.9733833648575 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 90.22077689747732 79.12149781200795 -1.127986593019159e-14
+ vertex -15.663143066406267 -118.9733833648575 -1.127986593019159e-14
+ vertex 95.20240083494826 73.05137148104622 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 95.20240083494826 73.05137148104622 -1.127986593019159e-14
+ vertex -15.663143066406267 -118.9733833648575 -1.127986593019159e-14
+ vertex -7.848375507617181 -119.74307078863266 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 95.20240083494826 73.05137148104622 -1.127986593019159e-14
+ vertex -7.848375507617181 -119.74307078863266 -1.127986593019159e-14
+ vertex 99.77635347630545 66.66842796235197 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 99.77635347630545 66.66842796235197 -1.127986593019159e-14
+ vertex -7.848375507617181 -119.74307078863266 -1.127986593019159e-14
+ vertex -9.023892744153272e-14 -120.00000000000027 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 99.77635347630545 66.66842796235197 -1.127986593019159e-14
+ vertex -9.023892744153272e-14 -120.00000000000027 -1.127986593019159e-14
+ vertex 103.92304845413274 59.99999999999973 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 103.92304845413274 59.99999999999973 -1.127986593019159e-14
+ vertex -9.023892744153272e-14 -120.00000000000027 -1.127986593019159e-14
+ vertex 7.8483755076171136 -119.74307078863269 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 103.92304845413274 59.99999999999973 -1.127986593019159e-14
+ vertex 7.8483755076171136 -119.74307078863269 -1.127986593019159e-14
+ vertex 107.62472898392265 53.07464282627982 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 107.62472898392265 53.07464282627982 -1.127986593019159e-14
+ vertex 7.8483755076171136 -119.74307078863269 -1.127986593019159e-14
+ vertex 15.663143066406086 -118.97338336485755 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 107.62472898392265 53.07464282627982 -1.127986593019159e-14
+ vertex 15.663143066406086 -118.97338336485755 -1.127986593019159e-14
+ vertex 110.86554390135444 45.92201188381046 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 110.86554390135444 45.92201188381046 -1.127986593019159e-14
+ vertex 15.663143066406086 -118.97338336485755 -1.127986593019159e-14
+ vertex 23.41083864193531 -117.69423364838794 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 110.86554390135444 45.92201188381046 -1.127986593019159e-14
+ vertex 23.41083864193531 -117.69423364838794 -1.127986593019159e-14
+ vertex 113.63161553941275 38.572735836379074 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 113.63161553941275 38.572735836379074 -1.127986593019159e-14
+ vertex 23.41083864193531 -117.69423364838794 -1.127986593019159e-14
+ vertex 31.058285412302485 -115.91109915468847 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 113.63161553941275 38.572735836379074 -1.127986593019159e-14
+ vertex 31.058285412302485 -115.91109915468847 -1.127986593019159e-14
+ vertex 115.91109915468824 31.058285412302236 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 115.91109915468824 31.058285412302236 -1.127986593019159e-14
+ vertex 31.058285412302485 -115.91109915468847 -1.127986593019159e-14
+ vertex 38.5727358363793 -113.63161553941298 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 115.91109915468824 31.058285412302236 -1.127986593019159e-14
+ vertex 38.5727358363793 -113.63161553941298 -1.127986593019159e-14
+ vertex 117.69423364838768 23.410838641935086 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 117.69423364838768 23.410838641935086 -1.127986593019159e-14
+ vertex 38.5727358363793 -113.63161553941298 -1.127986593019159e-14
+ vertex 45.92201188381077 -110.86554390135471 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 117.69423364838768 23.410838641935086 -1.127986593019159e-14
+ vertex 45.92201188381077 -110.86554390135471 -1.127986593019159e-14
+ vertex 118.97338336485727 15.663143066405883 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 118.97338336485727 15.663143066405883 -1.127986593019159e-14
+ vertex 45.92201188381077 -110.86554390135471 -1.127986593019159e-14
+ vertex 53.07464282628005 -107.62472898392292 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 118.97338336485727 15.663143066405883 -1.127986593019159e-14
+ vertex 53.07464282628005 -107.62472898392292 -1.127986593019159e-14
+ vertex 119.74307078863244 7.848375507616888 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 119.74307078863244 7.848375507616888 -1.127986593019159e-14
+ vertex 53.07464282628005 -107.62472898392292 -1.127986593019159e-14
+ vertex 59.99999999999998 -103.92304845413295 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 119.74307078863244 7.848375507616888 -1.127986593019159e-14
+ vertex 59.99999999999998 -103.92304845413295 -1.127986593019159e-14
+ vertex 120.00000000000006 -3.158362460453645e-13 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 120.00000000000006 -3.158362460453645e-13 -1.127986593019159e-14
+ vertex 59.99999999999998 -103.92304845413295 -1.127986593019159e-14
+ vertex 66.66842796235217 -99.77635347630576 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 120.00000000000006 -3.158362460453645e-13 -1.127986593019159e-14
+ vertex 66.66842796235217 -99.77635347630576 -1.127986593019159e-14
+ vertex 119.74307078863244 -7.848375507617474 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 119.74307078863244 -7.848375507617474 -1.127986593019159e-14
+ vertex 66.66842796235217 -99.77635347630576 -1.127986593019159e-14
+ vertex 73.05137148104646 -95.20240083494856 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 119.74307078863244 -7.848375507617474 -1.127986593019159e-14
+ vertex 73.05137148104646 -95.20240083494856 -1.127986593019159e-14
+ vertex 118.97338336485727 -15.66314306640647 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 118.97338336485727 -15.66314306640647 -1.127986593019159e-14
+ vertex 73.05137148104646 -95.20240083494856 -1.127986593019159e-14
+ vertex 79.12149781200829 -90.2207768974776 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 118.97338336485727 -15.66314306640647 -1.127986593019159e-14
+ vertex 79.12149781200829 -90.2207768974776 -1.127986593019159e-14
+ vertex 117.69423364838772 -23.410838641935694 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 117.69423364838772 -23.410838641935694 -1.127986593019159e-14
+ vertex 79.12149781200829 -90.2207768974776 -1.127986593019159e-14
+ vertex 84.85281374238565 -84.85281374238605 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 117.69423364838772 -23.410838641935694 -1.127986593019159e-14
+ vertex 84.85281374238565 -84.85281374238605 -1.127986593019159e-14
+ vertex 115.91109915468824 -31.058285412302777 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 115.91109915468824 -31.058285412302777 -1.127986593019159e-14
+ vertex 84.85281374238565 -84.85281374238605 -1.127986593019159e-14
+ vertex 90.22077689747728 -79.1214978120086 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 115.91109915468824 -31.058285412302777 -1.127986593019159e-14
+ vertex 90.22077689747728 -79.1214978120086 -1.127986593019159e-14
+ vertex 113.63161553941275 -38.57273583637973 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 113.63161553941275 -38.57273583637973 -1.127986593019159e-14
+ vertex 90.22077689747728 -79.1214978120086 -1.127986593019159e-14
+ vertex 95.20240083494818 -73.05137148104687 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 113.63161553941275 -38.57273583637973 -1.127986593019159e-14
+ vertex 95.20240083494818 -73.05137148104687 -1.127986593019159e-14
+ vertex 110.86554390135449 -45.92201188381109 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 110.86554390135449 -45.92201188381109 -1.127986593019159e-14
+ vertex 95.20240083494818 -73.05137148104687 -1.127986593019159e-14
+ vertex 99.7763534763054 -66.66842796235262 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 110.86554390135449 -45.92201188381109 -1.127986593019159e-14
+ vertex 99.7763534763054 -66.66842796235262 -1.127986593019159e-14
+ vertex 107.62472898392261 -53.07464282628045 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 2.945263319516136e-31 -3.9761054813468024e-32 1.0
+ outer loop
+ vertex 107.62472898392261 -53.07464282628045 -1.127986593019159e-14
+ vertex 99.7763534763054 -66.66842796235262 -1.127986593019159e-14
+ vertex 103.9230484541327 -60.00000000000032 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.4713967368259995 -0.8819212643483543 1.037726320584038e-31
+ outer loop
+ vertex -53.074642826280225 -107.62472898392284 -1.127986593019159e-14
+ vertex -60.00000000000003 -103.92304845413288 -3.0000000000000058
+ vertex -53.074642826280225 -107.62472898392284 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.4713967368259995 -0.8819212643483543 1.037726320584038e-31
+ outer loop
+ vertex -60.00000000000003 -103.92304845413288 -3.0000000000000058
+ vertex -53.074642826280225 -107.62472898392284 -1.127986593019159e-14
+ vertex -60.00000000000003 -103.92304845413288 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.41270702980439355 -0.9108638249211765 8.533618118863724e-32
+ outer loop
+ vertex -45.9220118838108 -110.86554390135464 -1.127986593019159e-14
+ vertex -53.074642826280225 -107.62472898392284 -3.0000000000000058
+ vertex -45.9220118838108 -110.86554390135464 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.41270702980439355 -0.9108638249211765 8.533618118863724e-32
+ outer loop
+ vertex -53.074642826280225 -107.62472898392284 -3.0000000000000058
+ vertex -45.9220118838108 -110.86554390135464 -1.127986593019159e-14
+ vertex -53.074642826280225 -107.62472898392284 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.7730104533627369 -0.6343932841636455 2.02447787244254e-31
+ outer loop
+ vertex -90.22077689747731 -79.12149781200849 -1.127986593019159e-14
+ vertex -95.20240083494828 -73.05137148104666 -3.0000000000000058
+ vertex -90.22077689747731 -79.12149781200849 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.7730104533627369 -0.6343932841636455 2.02447787244254e-31
+ outer loop
+ vertex -95.20240083494828 -73.05137148104666 -3.0000000000000058
+ vertex -90.22077689747731 -79.12149781200849 -1.127986593019159e-14
+ vertex -95.20240083494828 -73.05137148104666 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.35225004792123515 -0.9359059267573251 6.653430768997389e-32
+ outer loop
+ vertex -38.57273583637951 -113.63161553941288 -1.127986593019159e-14
+ vertex -45.9220118838108 -110.86554390135464 -3.0000000000000058
+ vertex -38.57273583637951 -113.63161553941288 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.35225004792123515 -0.9359059267573251 6.653430768997389e-32
+ outer loop
+ vertex -45.9220118838108 -110.86554390135464 -3.0000000000000058
+ vertex -38.57273583637951 -113.63161553941288 -1.127986593019159e-14
+ vertex -45.9220118838108 -110.86554390135464 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.29028467725446355 -0.9569403357322085 4.74475240712483e-32
+ outer loop
+ vertex -31.058285412302553 -115.91109915468842 -1.127986593019159e-14
+ vertex -38.57273583637951 -113.63161553941288 -3.0000000000000058
+ vertex -31.058285412302553 -115.91109915468842 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.29028467725446355 -0.9569403357322085 4.74475240712483e-32
+ outer loop
+ vertex -38.57273583637951 -113.63161553941288 -3.0000000000000058
+ vertex -31.058285412302553 -115.91109915468842 -1.127986593019159e-14
+ vertex -38.57273583637951 -113.63161553941288 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.22707626303437195 -0.9738769792773341 2.815756287017262e-32
+ outer loop
+ vertex -23.410838641935378 -117.69423364838791 -1.127986593019159e-14
+ vertex -31.058285412302553 -115.91109915468842 -3.0000000000000058
+ vertex -23.410838641935378 -117.69423364838791 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.22707626303437195 -0.9738769792773341 2.815756287017262e-32
+ outer loop
+ vertex -31.058285412302553 -115.91109915468842 -3.0000000000000058
+ vertex -23.410838641935378 -117.69423364838791 -1.127986593019159e-14
+ vertex -31.058285412302553 -115.91109915468842 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.6343932841636468 -0.7730104533627359 1.56109815991917e-31
+ outer loop
+ vertex -73.05137148104657 -95.20240083494838 -1.127986593019159e-14
+ vertex -79.12149781200831 -90.22077689747748 -3.0000000000000058
+ vertex -73.05137148104657 -95.20240083494838 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.6343932841636468 -0.7730104533627359 1.56109815991917e-31
+ outer loop
+ vertex -79.12149781200831 -90.22077689747748 -3.0000000000000058
+ vertex -73.05137148104657 -95.20240083494838 -1.127986593019159e-14
+ vertex -79.12149781200831 -90.22077689747748 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.5280678506503689 -0.8492021815265783 1.2176471258623075e-31
+ outer loop
+ vertex -60.00000000000003 -103.92304845413288 -1.127986593019159e-14
+ vertex -66.66842796235233 -99.77635347630563 -3.0000000000000058
+ vertex -60.00000000000003 -103.92304845413288 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.5280678506503689 -0.8492021815265783 1.2176471258623075e-31
+ outer loop
+ vertex -66.66842796235233 -99.77635347630563 -3.0000000000000058
+ vertex -60.00000000000003 -103.92304845413288 -1.127986593019159e-14
+ vertex -66.66842796235233 -99.77635347630563 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.7298640726978364 -0.6835923020228706 1.8778383716416334e-31
+ outer loop
+ vertex -84.85281374238579 -84.85281374238586 -1.127986593019159e-14
+ vertex -90.22077689747731 -79.12149781200849 -3.0000000000000058
+ vertex -84.85281374238579 -84.85281374238586 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.7298640726978364 -0.6835923020228706 1.8778383716416334e-31
+ outer loop
+ vertex -90.22077689747731 -79.12149781200849 -3.0000000000000058
+ vertex -84.85281374238579 -84.85281374238586 -1.127986593019159e-14
+ vertex -90.22077689747731 -79.12149781200849 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.8128466845916165 -0.5824776968678006 2.1624482481901564e-31
+ outer loop
+ vertex -95.20240083494828 -73.05137148104666 -1.127986593019159e-14
+ vertex -99.77635347630545 -66.66842796235247 -3.0000000000000058
+ vertex -95.20240083494828 -73.05137148104666 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.8128466845916165 -0.5824776968678006 2.1624482481901564e-31
+ outer loop
+ vertex -99.77635347630545 -66.66842796235247 -3.0000000000000058
+ vertex -95.20240083494828 -73.05137148104666 -1.127986593019159e-14
+ vertex -99.77635347630545 -66.66842796235247 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.8492021815265774 -0.5280678506503704 1.2534323679698897e-31
+ outer loop
+ vertex -99.77635347630545 -66.66842796235247 -1.127986593019159e-14
+ vertex -103.9230484541327 -60.000000000000185 -3.0000000000000058
+ vertex -99.77635347630545 -66.66842796235247 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.8492021815265774 -0.5280678506503704 1.2534323679698897e-31
+ outer loop
+ vertex -103.9230484541327 -60.000000000000185 -3.0000000000000058
+ vertex -99.77635347630545 -66.66842796235247 -1.127986593019159e-14
+ vertex -103.9230484541327 -60.000000000000185 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.6835923020228708 -0.7298640726978363 1.7231576786423605e-31
+ outer loop
+ vertex -79.12149781200831 -90.22077689747748 -1.127986593019159e-14
+ vertex -84.85281374238579 -84.85281374238586 -3.0000000000000058
+ vertex -79.12149781200831 -90.22077689747748 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.6835923020228708 -0.7298640726978363 1.7231576786423605e-31
+ outer loop
+ vertex -84.85281374238579 -84.85281374238586 -3.0000000000000058
+ vertex -79.12149781200831 -90.22077689747748 -1.127986593019159e-14
+ vertex -84.85281374238579 -84.85281374238586 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.5824776968678035 -0.8128466845916144 1.3923537792110507e-31
+ outer loop
+ vertex -66.66842796235233 -99.77635347630563 -1.127986593019159e-14
+ vertex -73.05137148104657 -95.20240083494838 -3.0000000000000058
+ vertex -66.66842796235233 -99.77635347630563 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.5824776968678035 -0.8128466845916144 1.3923537792110507e-31
+ outer loop
+ vertex -73.05137148104657 -95.20240083494838 -3.0000000000000058
+ vertex -66.66842796235233 -99.77635347630563 -1.127986593019159e-14
+ vertex -73.05137148104657 -95.20240083494838 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.995184726672197 0.09801714032955847 -2.8921084227172825e-31
+ outer loop
+ vertex 118.97338336485727 15.663143066405883 -3.0000000000000058
+ vertex 119.74307078863244 7.848375507616888 -1.127986593019159e-14
+ vertex 119.74307078863244 7.848375507616888 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.995184726672197 0.09801714032955847 -2.8921084227172825e-31
+ outer loop
+ vertex 119.74307078863244 7.848375507616888 -1.127986593019159e-14
+ vertex 118.97338336485727 15.663143066405883 -3.0000000000000058
+ vertex 118.97338336485727 15.663143066405883 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.3522500479212335 -0.9359059267573258 -1.4095952139806853e-31
+ outer loop
+ vertex 45.92201188381077 -110.86554390135471 -3.0000000000000058
+ vertex 38.5727358363793 -113.63161553941298 -1.127986593019159e-14
+ vertex 38.5727358363793 -113.63161553941298 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.3522500479212335 -0.9359059267573258 -1.4095952139806853e-31
+ outer loop
+ vertex 38.5727358363793 -113.63161553941298 -1.127986593019159e-14
+ vertex 45.92201188381077 -110.86554390135471 -3.0000000000000058
+ vertex 45.92201188381077 -110.86554390135471 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.7298640726978363 -0.6835923020228707 -2.421445391457556e-31
+ outer loop
+ vertex 90.22077689747728 -79.1214978120086 -3.0000000000000058
+ vertex 84.85281374238565 -84.85281374238605 -1.127986593019159e-14
+ vertex 84.85281374238565 -84.85281374238605 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.7298640726978363 -0.6835923020228707 -2.421445391457556e-31
+ outer loop
+ vertex 84.85281374238565 -84.85281374238605 -1.127986593019159e-14
+ vertex 90.22077689747728 -79.1214978120086 -3.0000000000000058
+ vertex 90.22077689747728 -79.1214978120086 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.9866433320848789 -0.16289547339459018 -2.970693373899851e-31
+ outer loop
+ vertex 118.97338336485727 -15.66314306640647 -3.0000000000000058
+ vertex 117.69423364838772 -23.410838641935694 -1.127986593019159e-14
+ vertex 117.69423364838772 -23.410838641935694 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.9866433320848789 -0.16289547339459018 -2.970693373899851e-31
+ outer loop
+ vertex 117.69423364838772 -23.410838641935694 -1.127986593019159e-14
+ vertex 118.97338336485727 -15.66314306640647 -3.0000000000000058
+ vertex 118.97338336485727 -15.66314306640647 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.5280678506503682 -0.8492021815265789 -1.892950615610203e-31
+ outer loop
+ vertex 66.66842796235217 -99.77635347630576 -3.0000000000000058
+ vertex 59.99999999999998 -103.92304845413295 -1.127986593019159e-14
+ vertex 59.99999999999998 -103.92304845413295 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.5280678506503682 -0.8492021815265789 -1.892950615610203e-31
+ outer loop
+ vertex 59.99999999999998 -103.92304845413295 -1.127986593019159e-14
+ vertex 66.66842796235217 -99.77635347630576 -3.0000000000000058
+ vertex 66.66842796235217 -99.77635347630576 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.9569403357322082 0.29028467725446544 -2.7030210201592815e-31
+ outer loop
+ vertex 113.63161553941275 38.572735836379074 -1.127986593019159e-14
+ vertex 115.91109915468824 31.058285412302236 -3.0000000000000058
+ vertex 113.63161553941275 38.572735836379074 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.9569403357322082 0.29028467725446544 -2.7030210201592815e-31
+ outer loop
+ vertex 115.91109915468824 31.058285412302236 -3.0000000000000058
+ vertex 113.63161553941275 38.572735836379074 -1.127986593019159e-14
+ vertex 115.91109915468824 31.058285412302236 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.6835923020228709 -0.7298640726978359 -2.3035609866607536e-31
+ outer loop
+ vertex 84.85281374238565 -84.85281374238605 -3.0000000000000058
+ vertex 79.12149781200829 -90.2207768974776 -1.127986593019159e-14
+ vertex 79.12149781200829 -90.2207768974776 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.6835923020228709 -0.7298640726978359 -2.3035609866607536e-31
+ outer loop
+ vertex 79.12149781200829 -90.2207768974776 -1.127986593019159e-14
+ vertex 84.85281374238565 -84.85281374238605 -3.0000000000000058
+ vertex 84.85281374238565 -84.85281374238605 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.9866433320848786 0.1628954733945909 -2.841155456969688e-31
+ outer loop
+ vertex 117.69423364838768 23.410838641935086 -3.0000000000000058
+ vertex 118.97338336485727 15.663143066405883 -1.127986593019159e-14
+ vertex 118.97338336485727 15.663143066405883 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.9866433320848786 0.1628954733945909 -2.841155456969688e-31
+ outer loop
+ vertex 118.97338336485727 15.663143066405883 -1.127986593019159e-14
+ vertex 117.69423364838768 23.410838641935086 -3.0000000000000058
+ vertex 117.69423364838768 23.410838641935086 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.6343932841636456 -0.7730104533627369 -2.175812380069957e-31
+ outer loop
+ vertex 79.12149781200829 -90.2207768974776 -3.0000000000000058
+ vertex 73.05137148104646 -95.20240083494856 -1.127986593019159e-14
+ vertex 73.05137148104646 -95.20240083494856 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.6343932841636456 -0.7730104533627369 -2.175812380069957e-31
+ outer loop
+ vertex 73.05137148104646 -95.20240083494856 -1.127986593019159e-14
+ vertex 79.12149781200829 -90.2207768974776 -3.0000000000000058
+ vertex 79.12149781200829 -90.2207768974776 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.0980171403295601 -0.9951847266721969 -6.843822327639126e-32
+ outer loop
+ vertex 15.663143066406086 -118.97338336485755 -1.127986593019159e-14
+ vertex 7.8483755076171136 -119.74307078863269 -3.0000000000000058
+ vertex 15.663143066406086 -118.97338336485755 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.0980171403295601 -0.9951847266721969 -6.843822327639126e-32
+ outer loop
+ vertex 7.8483755076171136 -119.74307078863269 -3.0000000000000058
+ vertex 15.663143066406086 -118.97338336485755 -1.127986593019159e-14
+ vertex 7.8483755076171136 -119.74307078863269 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.4127070298043942 -0.910863824921176 -1.5776999412922945e-31
+ outer loop
+ vertex 53.07464282628005 -107.62472898392292 -3.0000000000000058
+ vertex 45.92201188381077 -110.86554390135471 -1.127986593019159e-14
+ vertex 45.92201188381077 -110.86554390135471 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.4127070298043942 -0.910863824921176 -1.5776999412922945e-31
+ outer loop
+ vertex 45.92201188381077 -110.86554390135471 -1.127986593019159e-14
+ vertex 53.07464282628005 -107.62472898392292 -3.0000000000000058
+ vertex 53.07464282628005 -107.62472898392292 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.9994645874763656 -0.03271908282177698 -2.9566958411046957e-31
+ outer loop
+ vertex 120.00000000000006 -3.158362460453645e-13 -3.0000000000000058
+ vertex 119.74307078863244 -7.848375507617474 -1.127986593019159e-14
+ vertex 119.74307078863244 -7.848375507617474 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.9994645874763656 -0.03271908282177698 -2.9566958411046957e-31
+ outer loop
+ vertex 119.74307078863244 -7.848375507617474 -1.127986593019159e-14
+ vertex 120.00000000000006 -3.158362460453645e-13 -3.0000000000000058
+ vertex 120.00000000000006 -3.158362460453645e-13 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.8128466845916142 -0.5824776968678037 -2.625646800845816e-31
+ outer loop
+ vertex 99.7763534763054 -66.66842796235262 -3.0000000000000058
+ vertex 95.20240083494818 -73.05137148104687 -1.127986593019159e-14
+ vertex 95.20240083494818 -73.05137148104687 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.8128466845916142 -0.5824776968678037 -2.625646800845816e-31
+ outer loop
+ vertex 95.20240083494818 -73.05137148104687 -1.127986593019159e-14
+ vertex 99.7763534763054 -66.66842796235262 -3.0000000000000058
+ vertex 99.7763534763054 -66.66842796235262 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.8492021815265786 -0.5280678506503688 -2.7110893836527095e-31
+ outer loop
+ vertex 103.9230484541327 -60.00000000000032 -3.0000000000000058
+ vertex 99.7763534763054 -66.66842796235262 -1.127986593019159e-14
+ vertex 99.7763534763054 -66.66842796235262 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.8492021815265786 -0.5280678506503688 -2.7110893836527095e-31
+ outer loop
+ vertex 99.7763534763054 -66.66842796235262 -1.127986593019159e-14
+ vertex 103.9230484541327 -60.00000000000032 -3.0000000000000058
+ vertex 103.9230484541327 -60.00000000000032 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.9569403357322088 -0.2902846772544624 -2.933861519435775e-31
+ outer loop
+ vertex 115.91109915468824 -31.058285412302777 -3.0000000000000058
+ vertex 113.63161553941275 -38.57273583637973 -1.127986593019159e-14
+ vertex 113.63161553941275 -38.57273583637973 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.9569403357322088 -0.2902846772544624 -2.933861519435775e-31
+ outer loop
+ vertex 113.63161553941275 -38.57273583637973 -1.127986593019159e-14
+ vertex 115.91109915468824 -31.058285412302777 -3.0000000000000058
+ vertex 115.91109915468824 -31.058285412302777 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.9738769792773351 0.22707626303436773 -2.77803622737324e-31
+ outer loop
+ vertex 115.91109915468824 31.058285412302236 -3.0000000000000058
+ vertex 117.69423364838768 23.410838641935086 -1.127986593019159e-14
+ vertex 117.69423364838768 23.410838641935086 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.9738769792773351 0.22707626303436773 -2.77803622737324e-31
+ outer loop
+ vertex 117.69423364838768 23.410838641935086 -1.127986593019159e-14
+ vertex 115.91109915468824 31.058285412302236 -3.0000000000000058
+ vertex 115.91109915468824 31.058285412302236 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.16289547339459012 -0.9866433320848789 8.747026662060707e-33
+ outer loop
+ vertex -15.663143066406267 -118.9733833648575 -1.127986593019159e-14
+ vertex -23.410838641935378 -117.69423364838791 -3.0000000000000058
+ vertex -15.663143066406267 -118.9733833648575 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.16289547339459012 -0.9866433320848789 8.747026662060707e-33
+ outer loop
+ vertex -23.410838641935378 -117.69423364838791 -3.0000000000000058
+ vertex -15.663143066406267 -118.9733833648575 -1.127986593019159e-14
+ vertex -23.410838641935378 -117.69423364838791 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.9108638249211753 -0.4127070298043959 -2.8468304809540664e-31
+ outer loop
+ vertex 110.86554390135449 -45.92201188381109 -3.0000000000000058
+ vertex 107.62472898392261 -53.07464282628045 -1.127986593019159e-14
+ vertex 107.62472898392261 -53.07464282628045 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.9108638249211753 -0.4127070298043959 -2.8468304809540664e-31
+ outer loop
+ vertex 107.62472898392261 -53.07464282628045 -1.127986593019159e-14
+ vertex 110.86554390135449 -45.92201188381109 -3.0000000000000058
+ vertex 110.86554390135449 -45.92201188381109 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.9359059267573258 -0.35225004792123343 -2.8965477312305345e-31
+ outer loop
+ vertex 113.63161553941275 -38.57273583637973 -3.0000000000000058
+ vertex 110.86554390135449 -45.92201188381109 -1.127986593019159e-14
+ vertex 110.86554390135449 -45.92201188381109 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.9359059267573258 -0.35225004792123343 -2.8965477312305345e-31
+ outer loop
+ vertex 110.86554390135449 -45.92201188381109 -1.127986593019159e-14
+ vertex 113.63161553941275 -38.57273583637973 -3.0000000000000058
+ vertex 113.63161553941275 -38.57273583637973 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.032719082821776824 -0.9994645874763657 -4.93763976950869e-32
+ outer loop
+ vertex 7.8483755076171136 -119.74307078863269 -1.127986593019159e-14
+ vertex -9.023892744153272e-14 -120.00000000000027 -3.0000000000000058
+ vertex 7.8483755076171136 -119.74307078863269 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.032719082821776824 -0.9994645874763657 -4.93763976950869e-32
+ outer loop
+ vertex -9.023892744153272e-14 -120.00000000000027 -3.0000000000000058
+ vertex 7.8483755076171136 -119.74307078863269 -1.127986593019159e-14
+ vertex -9.023892744153272e-14 -120.00000000000027 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.22707626303437195 -0.9738769792773341 -1.0560231477941403e-31
+ outer loop
+ vertex 31.058285412302485 -115.91109915468847 -1.127986593019159e-14
+ vertex 23.41083864193531 -117.69423364838794 -3.0000000000000058
+ vertex 31.058285412302485 -115.91109915468847 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.22707626303437195 -0.9738769792773341 -1.0560231477941403e-31
+ outer loop
+ vertex 23.41083864193531 -117.69423364838794 -3.0000000000000058
+ vertex 31.058285412302485 -115.91109915468847 -1.127986593019159e-14
+ vertex 23.41083864193531 -117.69423364838794 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.4713967368259969 -0.8819212643483556 -1.739048715242389e-31
+ outer loop
+ vertex 59.99999999999998 -103.92304845413295 -3.0000000000000058
+ vertex 53.07464282628005 -107.62472898392292 -1.127986593019159e-14
+ vertex 53.07464282628005 -107.62472898392292 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.4713967368259969 -0.8819212643483556 -1.739048715242389e-31
+ outer loop
+ vertex 53.07464282628005 -107.62472898392292 -1.127986593019159e-14
+ vertex 59.99999999999998 -103.92304845413295 -3.0000000000000058
+ vertex 59.99999999999998 -103.92304845413295 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.7730104533627359 -0.6343932841636467 -2.5289607953410717e-31
+ outer loop
+ vertex 95.20240083494818 -73.05137148104687 -3.0000000000000058
+ vertex 90.22077689747728 -79.1214978120086 -1.127986593019159e-14
+ vertex 90.22077689747728 -79.1214978120086 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.7730104533627359 -0.6343932841636467 -2.5289607953410717e-31
+ outer loop
+ vertex 90.22077689747728 -79.1214978120086 -1.127986593019159e-14
+ vertex 95.20240083494818 -73.05137148104687 -3.0000000000000058
+ vertex 95.20240083494818 -73.05137148104687 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.29028467725446083 -0.9569403357322094 -1.2354543835578116e-31
+ outer loop
+ vertex 38.5727358363793 -113.63161553941298 -3.0000000000000058
+ vertex 31.058285412302485 -115.91109915468847 -1.127986593019159e-14
+ vertex 31.058285412302485 -115.91109915468847 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.29028467725446083 -0.9569403357322094 -1.2354543835578116e-31
+ outer loop
+ vertex 31.058285412302485 -115.91109915468847 -1.127986593019159e-14
+ vertex 38.5727358363793 -113.63161553941298 -3.0000000000000058
+ vertex 38.5727358363793 -113.63161553941298 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.8819212643483554 -0.47139673682599703 -2.7849226655047886e-31
+ outer loop
+ vertex 107.62472898392261 -53.07464282628045 -3.0000000000000058
+ vertex 103.9230484541327 -60.00000000000032 -1.127986593019159e-14
+ vertex 103.9230484541327 -60.00000000000032 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.8819212643483554 -0.47139673682599703 -2.7849226655047886e-31
+ outer loop
+ vertex 103.9230484541327 -60.00000000000032 -1.127986593019159e-14
+ vertex 107.62472898392261 -53.07464282628045 -3.0000000000000058
+ vertex 107.62472898392261 -53.07464282628045 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.9738769792773336 -0.2270762630343735 -2.9586120622001774e-31
+ outer loop
+ vertex 117.69423364838772 -23.410838641935694 -3.0000000000000058
+ vertex 115.91109915468824 -31.058285412302777 -1.127986593019159e-14
+ vertex 115.91109915468824 -31.058285412302777 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.9738769792773336 -0.2270762630343735 -2.9586120622001774e-31
+ outer loop
+ vertex 115.91109915468824 -31.058285412302777 -1.127986593019159e-14
+ vertex 117.69423364838772 -23.410838641935694 -3.0000000000000058
+ vertex 117.69423364838772 -23.410838641935694 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.09801714032956083 -0.9951847266721969 -1.0700965657087255e-32
+ outer loop
+ vertex -7.848375507617181 -119.74307078863266 -1.127986593019159e-14
+ vertex -15.663143066406267 -118.9733833648575 -3.0000000000000058
+ vertex -7.848375507617181 -119.74307078863266 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.09801714032956083 -0.9951847266721969 -1.0700965657087255e-32
+ outer loop
+ vertex -15.663143066406267 -118.9733833648575 -3.0000000000000058
+ vertex -7.848375507617181 -119.74307078863266 -1.127986593019159e-14
+ vertex -15.663143066406267 -118.9733833648575 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.16289547339458849 -0.9866433320848792 -8.720698587879935e-32
+ outer loop
+ vertex 23.41083864193531 -117.69423364838794 -1.127986593019159e-14
+ vertex 15.663143066406086 -118.97338336485755 -3.0000000000000058
+ vertex 23.41083864193531 -117.69423364838794 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.16289547339458849 -0.9866433320848792 -8.720698587879935e-32
+ outer loop
+ vertex 15.663143066406086 -118.97338336485755 -3.0000000000000058
+ vertex 23.41083864193531 -117.69423364838794 -1.127986593019159e-14
+ vertex 15.663143066406086 -118.97338336485755 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.5824776968677995 -0.8128466845916171 -2.038746610830898e-31
+ outer loop
+ vertex 73.05137148104646 -95.20240083494856 -3.0000000000000058
+ vertex 66.66842796235217 -99.77635347630576 -1.127986593019159e-14
+ vertex 66.66842796235217 -99.77635347630576 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.5824776968677995 -0.8128466845916171 -2.038746610830898e-31
+ outer loop
+ vertex 66.66842796235217 -99.77635347630576 -1.127986593019159e-14
+ vertex 73.05137148104646 -95.20240083494856 -3.0000000000000058
+ vertex 73.05137148104646 -95.20240083494856 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.032719082821779155 -0.9994645874763656 -3.010313479844827e-32
+ outer loop
+ vertex -9.023892744153272e-14 -120.00000000000027 -1.127986593019159e-14
+ vertex -7.848375507617181 -119.74307078863266 -3.0000000000000058
+ vertex -9.023892744153272e-14 -120.00000000000027 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.032719082821779155 -0.9994645874763656 -3.010313479844827e-32
+ outer loop
+ vertex -7.848375507617181 -119.74307078863266 -3.0000000000000058
+ vertex -9.023892744153272e-14 -120.00000000000027 -1.127986593019159e-14
+ vertex -7.848375507617181 -119.74307078863266 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.9951847266721968 -0.09801714032956063 -2.9700537205033417e-31
+ outer loop
+ vertex 119.74307078863244 -7.848375507617474 -3.0000000000000058
+ vertex 118.97338336485727 -15.66314306640647 -1.127986593019159e-14
+ vertex 118.97338336485727 -15.66314306640647 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.9951847266721968 -0.09801714032956063 -2.9700537205033417e-31
+ outer loop
+ vertex 118.97338336485727 -15.66314306640647 -1.127986593019159e-14
+ vertex 119.74307078863244 -7.848375507617474 -3.0000000000000058
+ vertex 119.74307078863244 -7.848375507617474 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.9994645874763657 0.03271908282177687 -2.9306769361942347e-31
+ outer loop
+ vertex 119.74307078863244 7.848375507616888 -3.0000000000000058
+ vertex 120.00000000000006 -3.158362460453645e-13 -1.127986593019159e-14
+ vertex 120.00000000000006 -3.158362460453645e-13 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.9994645874763657 0.03271908282177687 -2.9306769361942347e-31
+ outer loop
+ vertex 120.00000000000006 -3.158362460453645e-13 -1.127986593019159e-14
+ vertex 119.74307078863244 7.848375507616888 -3.0000000000000058
+ vertex 119.74307078863244 7.848375507616888 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.5280678506503641 0.8492021815265814 1.8929506156101917e-31
+ outer loop
+ vertex -59.999999999999915 103.92304845413243 -1.127986593019159e-14
+ vertex -66.66842796235221 99.77635347630525 -3.0000000000000058
+ vertex -66.66842796235221 99.77635347630525 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.5280678506503641 0.8492021815265814 1.8929506156101917e-31
+ outer loop
+ vertex -66.66842796235221 99.77635347630525 -3.0000000000000058
+ vertex -59.999999999999915 103.92304845413243 -1.127986593019159e-14
+ vertex -59.999999999999915 103.92304845413243 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.634393284163642 0.7730104533627398 2.175812380069947e-31
+ outer loop
+ vertex -73.05137148104644 95.202400834948 -1.127986593019159e-14
+ vertex -79.12149781200824 90.2207768974771 -3.0000000000000058
+ vertex -79.12149781200824 90.2207768974771 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.634393284163642 0.7730104533627398 2.175812380069947e-31
+ outer loop
+ vertex -79.12149781200824 90.2207768974771 -3.0000000000000058
+ vertex -73.05137148104644 95.202400834948 -1.127986593019159e-14
+ vertex -73.05137148104644 95.202400834948 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.8819212643483569 0.4713967368259942 -2.4100580356682253e-31
+ outer loop
+ vertex 103.92304845413274 59.99999999999973 -1.127986593019159e-14
+ vertex 107.62472898392265 53.07464282627982 -3.0000000000000058
+ vertex 103.92304845413274 59.99999999999973 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.8819212643483569 0.4713967368259942 -2.4100580356682253e-31
+ outer loop
+ vertex 107.62472898392265 53.07464282627982 -3.0000000000000058
+ vertex 103.92304845413274 59.99999999999973 -1.127986593019159e-14
+ vertex 107.62472898392265 53.07464282627982 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.09801714032955872 0.9951847266721972 6.843822327639085e-32
+ outer loop
+ vertex -15.663143066406086 118.97338336485703 -1.127986593019159e-14
+ vertex -7.8483755076170905 119.74307078863217 -3.0000000000000058
+ vertex -15.663143066406086 118.97338336485703 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.09801714032955872 0.9951847266721972 6.843822327639085e-32
+ outer loop
+ vertex -7.8483755076170905 119.74307078863217 -3.0000000000000058
+ vertex -15.663143066406086 118.97338336485703 -1.127986593019159e-14
+ vertex -7.8483755076170905 119.74307078863217 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.6835923020228726 0.7298640726978346 2.3035609866607575e-31
+ outer loop
+ vertex -79.12149781200824 90.2207768974771 -1.127986593019159e-14
+ vertex -84.85281374238566 84.85281374238551 -3.0000000000000058
+ vertex -84.85281374238566 84.85281374238551 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.6835923020228726 0.7298640726978346 2.3035609866607575e-31
+ outer loop
+ vertex -84.85281374238566 84.85281374238551 -3.0000000000000058
+ vertex -79.12149781200824 90.2207768974771 -1.127986593019159e-14
+ vertex -79.12149781200824 90.2207768974771 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.6343932841636458 0.7730104533627369 -1.561098159919167e-31
+ outer loop
+ vertex 73.0513714810465 95.20240083494792 -1.127986593019159e-14
+ vertex 79.12149781200833 90.22077689747698 -3.0000000000000058
+ vertex 73.0513714810465 95.20240083494792 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.6343932841636458 0.7730104533627369 -1.561098159919167e-31
+ outer loop
+ vertex 79.12149781200833 90.22077689747698 -3.0000000000000058
+ vertex 73.0513714810465 95.20240083494792 -1.127986593019159e-14
+ vertex 79.12149781200833 90.22077689747698 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.7298640726978385 0.6835923020228685 -1.877838371641641e-31
+ outer loop
+ vertex 84.85281374238573 84.8528137423854 -1.127986593019159e-14
+ vertex 90.22077689747732 79.12149781200795 -3.0000000000000058
+ vertex 84.85281374238573 84.8528137423854 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.7298640726978385 0.6835923020228685 -1.877838371641641e-31
+ outer loop
+ vertex 90.22077689747732 79.12149781200795 -3.0000000000000058
+ vertex 84.85281374238573 84.8528137423854 -1.127986593019159e-14
+ vertex 90.22077689747732 79.12149781200795 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.7730104533627331 0.6343932841636502 -2.0244778724425268e-31
+ outer loop
+ vertex 90.22077689747732 79.12149781200795 -1.127986593019159e-14
+ vertex 95.20240083494826 73.05137148104622 -3.0000000000000058
+ vertex 90.22077689747732 79.12149781200795 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.7730104533627331 0.6343932841636502 -2.0244778724425268e-31
+ outer loop
+ vertex 95.20240083494826 73.05137148104622 -3.0000000000000058
+ vertex 90.22077689747732 79.12149781200795 -1.127986593019159e-14
+ vertex 95.20240083494826 73.05137148104622 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.9108638249211756 0.4127070298043953 -2.5186371442749437e-31
+ outer loop
+ vertex 107.62472898392265 53.07464282627982 -1.127986593019159e-14
+ vertex 110.86554390135444 45.92201188381046 -3.0000000000000058
+ vertex 107.62472898392265 53.07464282627982 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.9108638249211756 0.4127070298043953 -2.5186371442749437e-31
+ outer loop
+ vertex 110.86554390135444 45.92201188381046 -3.0000000000000058
+ vertex 107.62472898392265 53.07464282627982 -1.127986593019159e-14
+ vertex 110.86554390135444 45.92201188381046 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.35225004792123865 0.935905926757324 -6.653430768997498e-32
+ outer loop
+ vertex 38.57273583637948 113.63161553941242 -1.127986593019159e-14
+ vertex 45.92201188381082 110.86554390135414 -3.0000000000000058
+ vertex 38.57273583637948 113.63161553941242 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.35225004792123865 0.935905926757324 -6.653430768997498e-32
+ outer loop
+ vertex 45.92201188381082 110.86554390135414 -3.0000000000000058
+ vertex 38.57273583637948 113.63161553941242 -1.127986593019159e-14
+ vertex 45.92201188381082 110.86554390135414 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.5824776968678067 0.8128466845916119 -1.392353779211061e-31
+ outer loop
+ vertex 66.66842796235235 99.77635347630513 -1.127986593019159e-14
+ vertex 73.0513714810465 95.20240083494792 -3.0000000000000058
+ vertex 66.66842796235235 99.77635347630513 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.5824776968678067 0.8128466845916119 -1.392353779211061e-31
+ outer loop
+ vertex 73.0513714810465 95.20240083494792 -3.0000000000000058
+ vertex 66.66842796235235 99.77635347630513 -1.127986593019159e-14
+ vertex 73.0513714810465 95.20240083494792 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.4713967368259996 0.881921264348354 -1.0377263205840382e-31
+ outer loop
+ vertex 53.074642826280225 107.62472898392231 -1.127986593019159e-14
+ vertex 60.00000000000007 103.92304845413234 -3.0000000000000058
+ vertex 53.074642826280225 107.62472898392231 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.4713967368259996 0.881921264348354 -1.0377263205840382e-31
+ outer loop
+ vertex 60.00000000000007 103.92304845413234 -3.0000000000000058
+ vertex 53.074642826280225 107.62472898392231 -1.127986593019159e-14
+ vertex 60.00000000000007 103.92304845413234 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.03271908282177683 0.9994645874763658 3.010313479844895e-32
+ outer loop
+ vertex 4.511946372076636e-14 119.99999999999976 -1.127986593019159e-14
+ vertex 7.848375507617226 119.74307078863215 -3.0000000000000058
+ vertex 4.511946372076636e-14 119.99999999999976 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.03271908282177683 0.9994645874763658 3.010313479844895e-32
+ outer loop
+ vertex 7.848375507617226 119.74307078863215 -3.0000000000000058
+ vertex 4.511946372076636e-14 119.99999999999976 -1.127986593019159e-14
+ vertex 7.848375507617226 119.74307078863215 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.16289547339459015 0.9866433320848789 8.720698587879981e-32
+ outer loop
+ vertex -23.41083864193531 117.69423364838741 -1.127986593019159e-14
+ vertex -15.663143066406086 118.97338336485703 -3.0000000000000058
+ vertex -23.41083864193531 117.69423364838741 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.16289547339459015 0.9866433320848789 8.720698587879981e-32
+ outer loop
+ vertex -15.663143066406086 118.97338336485703 -3.0000000000000058
+ vertex -23.41083864193531 117.69423364838741 -1.127986593019159e-14
+ vertex -15.663143066406086 118.97338336485703 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.7298640726978336 0.6835923020228738 2.421445391457549e-31
+ outer loop
+ vertex -84.85281374238566 84.85281374238551 -1.127986593019159e-14
+ vertex -90.22077689747728 79.12149781200809 -3.0000000000000058
+ vertex -90.22077689747728 79.12149781200809 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.7298640726978336 0.6835923020228738 2.421445391457549e-31
+ outer loop
+ vertex -90.22077689747728 79.12149781200809 -3.0000000000000058
+ vertex -84.85281374238566 84.85281374238551 -1.127986593019159e-14
+ vertex -84.85281374238566 84.85281374238551 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.35225004792123193 0.9359059267573264 1.4095952139806818e-31
+ outer loop
+ vertex -38.572735836379344 113.63161553941245 -1.127986593019159e-14
+ vertex -45.922011883810725 110.86554390135421 -3.0000000000000058
+ vertex -45.922011883810725 110.86554390135421 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.35225004792123193 0.9359059267573264 1.4095952139806818e-31
+ outer loop
+ vertex -45.922011883810725 110.86554390135421 -3.0000000000000058
+ vertex -38.572735836379344 113.63161553941245 -1.127986593019159e-14
+ vertex -38.572735836379344 113.63161553941245 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.5824776968678059 0.8128466845916127 2.0387466108309157e-31
+ outer loop
+ vertex -66.66842796235221 99.77635347630525 -1.127986593019159e-14
+ vertex -73.05137148104644 95.202400834948 -3.0000000000000058
+ vertex -73.05137148104644 95.202400834948 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.5824776968678059 0.8128466845916127 2.0387466108309157e-31
+ outer loop
+ vertex -73.05137148104644 95.202400834948 -3.0000000000000058
+ vertex -66.66842796235221 99.77635347630525 -1.127986593019159e-14
+ vertex -66.66842796235221 99.77635347630525 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.2270762630343709 0.9738769792773343 1.056023147794137e-31
+ outer loop
+ vertex -31.058285412302418 115.91109915468799 -1.127986593019159e-14
+ vertex -23.41083864193531 117.69423364838741 -3.0000000000000058
+ vertex -31.058285412302418 115.91109915468799 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.2270762630343709 0.9738769792773343 1.056023147794137e-31
+ outer loop
+ vertex -23.41083864193531 117.69423364838741 -3.0000000000000058
+ vertex -31.058285412302418 115.91109915468799 -1.127986593019159e-14
+ vertex -23.41083864193531 117.69423364838741 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.47139673682599736 0.8819212643483552 1.73904871524239e-31
+ outer loop
+ vertex -53.07464282628009 107.62472898392238 -1.127986593019159e-14
+ vertex -59.999999999999915 103.92304845413243 -3.0000000000000058
+ vertex -59.999999999999915 103.92304845413243 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.47139673682599736 0.8819212643483552 1.73904871524239e-31
+ outer loop
+ vertex -59.999999999999915 103.92304845413243 -3.0000000000000058
+ vertex -53.07464282628009 107.62472898392238 -1.127986593019159e-14
+ vertex -53.07464282628009 107.62472898392238 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.8492021815265764 0.5280678506503718 -2.291158688553911e-31
+ outer loop
+ vertex 99.77635347630545 66.66842796235197 -1.127986593019159e-14
+ vertex 103.92304845413274 59.99999999999973 -3.0000000000000058
+ vertex 99.77635347630545 66.66842796235197 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.8492021815265764 0.5280678506503718 -2.291158688553911e-31
+ outer loop
+ vertex 103.92304845413274 59.99999999999973 -3.0000000000000058
+ vertex 99.77635347630545 66.66842796235197 -1.127986593019159e-14
+ vertex 103.92304845413274 59.99999999999973 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.09801714032955905 0.9951847266721972 1.0700965657087824e-32
+ outer loop
+ vertex 7.848375507617226 119.74307078863215 -1.127986593019159e-14
+ vertex 15.663143066406267 118.97338336485703 -3.0000000000000058
+ vertex 7.848375507617226 119.74307078863215 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.09801714032955905 0.9951847266721972 1.0700965657087824e-32
+ outer loop
+ vertex 15.663143066406267 118.97338336485703 -3.0000000000000058
+ vertex 7.848375507617226 119.74307078863215 -1.127986593019159e-14
+ vertex 15.663143066406267 118.97338336485703 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.2902846772544625 0.9569403357322088 1.235454383557816e-31
+ outer loop
+ vertex -31.058285412302418 115.91109915468799 -1.127986593019159e-14
+ vertex -38.572735836379344 113.63161553941245 -3.0000000000000058
+ vertex -38.572735836379344 113.63161553941245 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.2902846772544625 0.9569403357322088 1.235454383557816e-31
+ outer loop
+ vertex -38.572735836379344 113.63161553941245 -3.0000000000000058
+ vertex -31.058285412302418 115.91109915468799 -1.127986593019159e-14
+ vertex -31.058285412302418 115.91109915468799 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.6835923020228695 0.7298640726978374 -1.7231576786423557e-31
+ outer loop
+ vertex 79.12149781200833 90.22077689747698 -1.127986593019159e-14
+ vertex 84.85281374238573 84.8528137423854 -3.0000000000000058
+ vertex 79.12149781200833 90.22077689747698 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.6835923020228695 0.7298640726978374 -1.7231576786423557e-31
+ outer loop
+ vertex 84.85281374238573 84.8528137423854 -3.0000000000000058
+ vertex 79.12149781200833 90.22077689747698 -1.127986593019159e-14
+ vertex 84.85281374238573 84.8528137423854 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.8128466845916191 0.5824776968677967 -2.162448248190166e-31
+ outer loop
+ vertex 95.20240083494826 73.05137148104622 -1.127986593019159e-14
+ vertex 99.77635347630545 66.66842796235197 -3.0000000000000058
+ vertex 95.20240083494826 73.05137148104622 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.8128466845916191 0.5824776968677967 -2.162448248190166e-31
+ outer loop
+ vertex 99.77635347630545 66.66842796235197 -3.0000000000000058
+ vertex 95.20240083494826 73.05137148104622 -1.127986593019159e-14
+ vertex 99.77635347630545 66.66842796235197 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.29028467725446033 0.9569403357322096 -4.7447524071247334e-32
+ outer loop
+ vertex 31.058285412302553 115.9110991546879 -1.127986593019159e-14
+ vertex 38.57273583637948 113.63161553941242 -3.0000000000000058
+ vertex 31.058285412302553 115.9110991546879 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.29028467725446033 0.9569403357322096 -4.7447524071247334e-32
+ outer loop
+ vertex 38.57273583637948 113.63161553941242 -3.0000000000000058
+ vertex 31.058285412302553 115.9110991546879 -1.127986593019159e-14
+ vertex 38.57273583637948 113.63161553941242 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.16289547339459526 0.986643332084878 -8.747026662062238e-33
+ outer loop
+ vertex 15.663143066406267 118.97338336485703 -1.127986593019159e-14
+ vertex 23.410838641935424 117.69423364838737 -3.0000000000000058
+ vertex 15.663143066406267 118.97338336485703 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.16289547339459526 0.986643332084878 -8.747026662062238e-33
+ outer loop
+ vertex 23.410838641935424 117.69423364838737 -3.0000000000000058
+ vertex 15.663143066406267 118.97338336485703 -1.127986593019159e-14
+ vertex 23.410838641935424 117.69423364838737 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.4127070298043962 0.9108638249211751 1.5776999412923e-31
+ outer loop
+ vertex -45.922011883810725 110.86554390135421 -1.127986593019159e-14
+ vertex -53.07464282628009 107.62472898392238 -3.0000000000000058
+ vertex -53.07464282628009 107.62472898392238 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.4127070298043962 0.9108638249211751 1.5776999412923e-31
+ outer loop
+ vertex -53.07464282628009 107.62472898392238 -3.0000000000000058
+ vertex -45.922011883810725 110.86554390135421 -1.127986593019159e-14
+ vertex -45.922011883810725 110.86554390135421 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.9359059267573262 0.3522500479212327 -2.6164310619616785e-31
+ outer loop
+ vertex 110.86554390135444 45.92201188381046 -1.127986593019159e-14
+ vertex 113.63161553941275 38.572735836379074 -3.0000000000000058
+ vertex 110.86554390135444 45.92201188381046 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.9359059267573262 0.3522500479212327 -2.6164310619616785e-31
+ outer loop
+ vertex 113.63161553941275 38.572735836379074 -3.0000000000000058
+ vertex 110.86554390135444 45.92201188381046 -1.127986593019159e-14
+ vertex 113.63161553941275 38.572735836379074 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.4127070298043904 0.9108638249211778 -8.533618118863625e-32
+ outer loop
+ vertex 45.92201188381082 110.86554390135414 -1.127986593019159e-14
+ vertex 53.074642826280225 107.62472898392231 -3.0000000000000058
+ vertex 45.92201188381082 110.86554390135414 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.4127070298043904 0.9108638249211778 -8.533618118863625e-32
+ outer loop
+ vertex 53.074642826280225 107.62472898392231 -3.0000000000000058
+ vertex 45.92201188381082 110.86554390135414 -1.127986593019159e-14
+ vertex 53.074642826280225 107.62472898392231 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.2270762630343699 0.9738769792773345 -2.8157562870171983e-32
+ outer loop
+ vertex 23.410838641935424 117.69423364838737 -1.127986593019159e-14
+ vertex 31.058285412302553 115.9110991546879 -3.0000000000000058
+ vertex 23.410838641935424 117.69423364838737 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.2270762630343699 0.9738769792773345 -2.8157562870171983e-32
+ outer loop
+ vertex 31.058285412302553 115.9110991546879 -3.0000000000000058
+ vertex 23.410838641935424 117.69423364838737 -1.127986593019159e-14
+ vertex 31.058285412302553 115.9110991546879 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.03271908282177621 0.9994645874763657 4.937639769508677e-32
+ outer loop
+ vertex -7.8483755076170905 119.74307078863217 -1.127986593019159e-14
+ vertex 4.511946372076636e-14 119.99999999999976 -3.0000000000000058
+ vertex -7.8483755076170905 119.74307078863217 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.03271908282177621 0.9994645874763657 4.937639769508677e-32
+ outer loop
+ vertex 4.511946372076636e-14 119.99999999999976 -3.0000000000000058
+ vertex -7.8483755076170905 119.74307078863217 -1.127986593019159e-14
+ vertex 4.511946372076636e-14 119.99999999999976 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal 0.5280678506503665 0.84920218152658 -1.2176471258622998e-31
+ outer loop
+ vertex 60.00000000000007 103.92304845413234 -1.127986593019159e-14
+ vertex 66.66842796235235 99.77635347630513 -3.0000000000000058
+ vertex 60.00000000000007 103.92304845413234 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.5280678506503665 0.84920218152658 -1.2176471258622998e-31
+ outer loop
+ vertex 66.66842796235235 99.77635347630513 -3.0000000000000058
+ vertex 60.00000000000007 103.92304845413234 -1.127986593019159e-14
+ vertex 66.66842796235235 99.77635347630513 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.9994645874763657 0.03271908282177632 2.9566958411046957e-31
+ outer loop
+ vertex -119.74307078863242 7.848375507616978 -1.127986593019159e-14
+ vertex -120.0 -1.8047785488306544e-13 -3.0000000000000058
+ vertex -120.0 -1.8047785488306544e-13 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.9994645874763657 0.03271908282177632 2.9566958411046957e-31
+ outer loop
+ vertex -120.0 -1.8047785488306544e-13 -3.0000000000000058
+ vertex -119.74307078863242 7.848375507616978 -1.127986593019159e-14
+ vertex -119.74307078863242 7.848375507616978 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.910863824921173 0.4127070298044008 2.846830480954061e-31
+ outer loop
+ vertex -107.62472898392257 53.074642826279955 -1.127986593019159e-14
+ vertex -110.8655439013544 45.922011883810605 -3.0000000000000058
+ vertex -110.8655439013544 45.922011883810605 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.910863824921173 0.4127070298044008 2.846830480954061e-31
+ outer loop
+ vertex -110.8655439013544 45.922011883810605 -3.0000000000000058
+ vertex -107.62472898392257 53.074642826279955 -1.127986593019159e-14
+ vertex -107.62472898392257 53.074642826279955 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.8819212643483569 -0.4713967368259942 1.1924109098059097e-31
+ outer loop
+ vertex -103.9230484541327 -60.000000000000185 -1.127986593019159e-14
+ vertex -107.62472898392265 -53.0746428262803 -3.0000000000000058
+ vertex -103.9230484541327 -60.000000000000185 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.8819212643483569 -0.4713967368259942 1.1924109098059097e-31
+ outer loop
+ vertex -107.62472898392265 -53.0746428262803 -3.0000000000000058
+ vertex -103.9230484541327 -60.000000000000185 -1.127986593019159e-14
+ vertex -107.62472898392265 -53.0746428262803 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.9359059267573255 0.3522500479212338 2.896547731230534e-31
+ outer loop
+ vertex -110.8655439013544 45.922011883810605 -1.127986593019159e-14
+ vertex -113.63161553941268 38.57273583637922 -3.0000000000000058
+ vertex -113.63161553941268 38.57273583637922 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.9359059267573255 0.3522500479212338 2.896547731230534e-31
+ outer loop
+ vertex -113.63161553941268 38.57273583637922 -3.0000000000000058
+ vertex -110.8655439013544 45.922011883810605 -1.127986593019159e-14
+ vertex -110.8655439013544 45.922011883810605 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.9108638249211767 -0.412707029804393 2.5186371442749477e-31
+ outer loop
+ vertex -107.62472898392265 -53.0746428262803 -1.127986593019159e-14
+ vertex -110.86554390135444 -45.92201188381096 -3.0000000000000058
+ vertex -107.62472898392265 -53.0746428262803 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.9108638249211767 -0.412707029804393 2.5186371442749477e-31
+ outer loop
+ vertex -110.86554390135444 -45.92201188381096 -3.0000000000000058
+ vertex -107.62472898392265 -53.0746428262803 -1.127986593019159e-14
+ vertex -110.86554390135444 -45.92201188381096 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.9951847266721968 0.09801714032956152 2.9700537205033425e-31
+ outer loop
+ vertex -118.97338336485723 15.663143066406052 -1.127986593019159e-14
+ vertex -119.74307078863242 7.848375507616978 -3.0000000000000058
+ vertex -119.74307078863242 7.848375507616978 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.9951847266721968 0.09801714032956152 2.9700537205033425e-31
+ outer loop
+ vertex -119.74307078863242 7.848375507616978 -3.0000000000000058
+ vertex -118.97338336485723 15.663143066406052 -1.127986593019159e-14
+ vertex -118.97338336485723 15.663143066406052 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.8819212643483567 0.4713967368259945 2.7849226655047917e-31
+ outer loop
+ vertex -103.92304845413261 59.9999999999998 -1.127986593019159e-14
+ vertex -107.62472898392257 53.074642826279955 -3.0000000000000058
+ vertex -107.62472898392257 53.074642826279955 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.8819212643483567 0.4713967368259945 2.7849226655047917e-31
+ outer loop
+ vertex -107.62472898392257 53.074642826279955 -3.0000000000000058
+ vertex -103.92304845413261 59.9999999999998 -1.127986593019159e-14
+ vertex -103.92304845413261 59.9999999999998 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.7730104533627364 0.634393284163646 2.5289607953410734e-31
+ outer loop
+ vertex -90.22077689747728 79.12149781200809 -1.127986593019159e-14
+ vertex -95.2024008349482 73.05137148104633 -3.0000000000000058
+ vertex -95.2024008349482 73.05137148104633 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.7730104533627364 0.634393284163646 2.5289607953410734e-31
+ outer loop
+ vertex -95.2024008349482 73.05137148104633 -3.0000000000000058
+ vertex -90.22077689747728 79.12149781200809 -1.127986593019159e-14
+ vertex -90.22077689747728 79.12149781200809 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.995184726672197 -0.09801714032955847 2.8921084227172825e-31
+ outer loop
+ vertex -119.74307078863242 -7.8483755076173445 -1.127986593019159e-14
+ vertex -118.97338336485727 -15.663143066406345 -3.0000000000000058
+ vertex -118.97338336485727 -15.663143066406345 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.995184726672197 -0.09801714032955847 2.8921084227172825e-31
+ outer loop
+ vertex -118.97338336485727 -15.663143066406345 -3.0000000000000058
+ vertex -119.74307078863242 -7.8483755076173445 -1.127986593019159e-14
+ vertex -119.74307078863242 -7.8483755076173445 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.9738769792773341 -0.2270762630343715 2.7780362273732366e-31
+ outer loop
+ vertex -117.69423364838765 -23.410838641935552 -1.127986593019159e-14
+ vertex -115.91109915468822 -31.058285412302638 -3.0000000000000058
+ vertex -115.91109915468822 -31.058285412302638 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.9738769792773341 -0.2270762630343715 2.7780362273732366e-31
+ outer loop
+ vertex -115.91109915468822 -31.058285412302638 -3.0000000000000058
+ vertex -117.69423364838765 -23.410838641935552 -1.127986593019159e-14
+ vertex -117.69423364838765 -23.410838641935552 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.8492021815265768 0.5280678506503713 2.7110893836527047e-31
+ outer loop
+ vertex -99.77635347630536 66.66842796235208 -1.127986593019159e-14
+ vertex -103.92304845413261 59.9999999999998 -3.0000000000000058
+ vertex -103.92304845413261 59.9999999999998 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.8492021815265768 0.5280678506503713 2.7110893836527047e-31
+ outer loop
+ vertex -103.92304845413261 59.9999999999998 -3.0000000000000058
+ vertex -99.77635347630536 66.66842796235208 -1.127986593019159e-14
+ vertex -99.77635347630536 66.66842796235208 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.9994645874763657 -0.03271908282177521 2.930676936194235e-31
+ outer loop
+ vertex -120.0 -1.8047785488306544e-13 -1.127986593019159e-14
+ vertex -119.74307078863242 -7.8483755076173445 -3.0000000000000058
+ vertex -119.74307078863242 -7.8483755076173445 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.9994645874763657 -0.03271908282177521 2.930676936194235e-31
+ outer loop
+ vertex -119.74307078863242 -7.8483755076173445 -3.0000000000000058
+ vertex -120.0 -1.8047785488306544e-13 -1.127986593019159e-14
+ vertex -120.0 -1.8047785488306544e-13 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.9866433320848789 0.16289547339459018 2.970693373899851e-31
+ outer loop
+ vertex -117.69423364838764 23.410838641935243 -1.127986593019159e-14
+ vertex -118.97338336485723 15.663143066406052 -3.0000000000000058
+ vertex -118.97338336485723 15.663143066406052 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.9866433320848789 0.16289547339459018 2.970693373899851e-31
+ outer loop
+ vertex -118.97338336485723 15.663143066406052 -3.0000000000000058
+ vertex -117.69423364838764 23.410838641935243 -1.127986593019159e-14
+ vertex -117.69423364838764 23.410838641935243 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.9866433320848788 -0.1628954733945899 2.84115545696969e-31
+ outer loop
+ vertex -118.97338336485727 -15.663143066406345 -1.127986593019159e-14
+ vertex -117.69423364838765 -23.410838641935552 -3.0000000000000058
+ vertex -117.69423364838765 -23.410838641935552 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.9866433320848788 -0.1628954733945899 2.84115545696969e-31
+ outer loop
+ vertex -117.69423364838765 -23.410838641935552 -3.0000000000000058
+ vertex -118.97338336485727 -15.663143066406345 -1.127986593019159e-14
+ vertex -118.97338336485727 -15.663143066406345 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.8128466845916188 0.5824776968677972 2.6256468008458264e-31
+ outer loop
+ vertex -95.2024008349482 73.05137148104633 -1.127986593019159e-14
+ vertex -99.77635347630536 66.66842796235208 -3.0000000000000058
+ vertex -99.77635347630536 66.66842796235208 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.8128466845916188 0.5824776968677972 2.6256468008458264e-31
+ outer loop
+ vertex -99.77635347630536 66.66842796235208 -3.0000000000000058
+ vertex -95.2024008349482 73.05137148104633 -1.127986593019159e-14
+ vertex -95.2024008349482 73.05137148104633 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.9569403357322083 0.29028467725446455 2.933861519435775e-31
+ outer loop
+ vertex -113.63161553941268 38.57273583637922 -1.127986593019159e-14
+ vertex -115.9110991546882 31.05828541230235 -3.0000000000000058
+ vertex -115.9110991546882 31.05828541230235 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.9569403357322083 0.29028467725446455 2.933861519435775e-31
+ outer loop
+ vertex -115.9110991546882 31.05828541230235 -3.0000000000000058
+ vertex -113.63161553941268 38.57273583637922 -1.127986593019159e-14
+ vertex -113.63161553941268 38.57273583637922 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.9359059267573256 -0.3522500479212339 2.6164310619616768e-31
+ outer loop
+ vertex -110.86554390135444 -45.92201188381096 -1.127986593019159e-14
+ vertex -113.6316155394127 -38.572735836379586 -3.0000000000000058
+ vertex -110.86554390135444 -45.92201188381096 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.9359059267573256 -0.3522500479212339 2.6164310619616768e-31
+ outer loop
+ vertex -113.6316155394127 -38.572735836379586 -3.0000000000000058
+ vertex -110.86554390135444 -45.92201188381096 -1.127986593019159e-14
+ vertex -113.6316155394127 -38.572735836379586 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.9569403357322093 -0.2902846772544612 2.7030210201592863e-31
+ outer loop
+ vertex -113.6316155394127 -38.572735836379586 -1.127986593019159e-14
+ vertex -115.91109915468822 -31.058285412302638 -3.0000000000000058
+ vertex -113.6316155394127 -38.572735836379586 -3.0000000000000058
+ endloop
+endfacet
+facet normal -0.9569403357322093 -0.2902846772544612 2.7030210201592863e-31
+ outer loop
+ vertex -115.91109915468822 -31.058285412302638 -3.0000000000000058
+ vertex -113.6316155394127 -38.572735836379586 -1.127986593019159e-14
+ vertex -115.91109915468822 -31.058285412302638 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.9738769792773345 0.22707626303437 2.9586120622001782e-31
+ outer loop
+ vertex -115.9110991546882 31.05828541230235 -1.127986593019159e-14
+ vertex -117.69423364838764 23.410838641935243 -3.0000000000000058
+ vertex -117.69423364838764 23.410838641935243 -1.127986593019159e-14
+ endloop
+endfacet
+facet normal -0.9738769792773345 0.22707626303437 2.9586120622001782e-31
+ outer loop
+ vertex -117.69423364838764 23.410838641935243 -3.0000000000000058
+ vertex -115.9110991546882 31.05828541230235 -1.127986593019159e-14
+ vertex -115.9110991546882 31.05828541230235 -3.0000000000000058
+ endloop
+endfacet
+facet normal 0.9301944916753149 0.3670670342824357 -3.1509663175953206e-16
+ outer loop
+ vertex 183.8959747167953 -70.80363748245902 617.4
+ vertex 184.48750387842549 -72.30264751720468 597.4
+ vertex 183.8959747167953 -70.80363748245902 597.4
+ endloop
+endfacet
+facet normal 0.9301944916753149 0.3670670342824357 -3.1509663175953206e-16
+ outer loop
+ vertex 184.48750387842549 -72.30264751720468 597.4
+ vertex 183.8959747167953 -70.80363748245902 617.4
+ vertex 184.48750387842549 -72.30264751720468 617.4
+ endloop
+endfacet
+facet normal -0.4999999999999997 0.8660254037844389 1.4922322636808774e-17
+ outer loop
+ vertex 179.92468545251552 -69.38910354298147 617.4
+ vertex 165.4703225694756 -77.73433384446909 597.4
+ vertex 165.4703225694756 -77.73433384446909 617.4
+ endloop
+endfacet
+facet normal -0.4999999999999997 0.8660254037844389 1.4922322636808774e-17
+ outer loop
+ vertex 165.4703225694756 -77.73433384446909 597.4
+ vertex 179.92468545251552 -69.38910354298147 617.4
+ vertex 179.92468545251552 -69.38910354298147 597.4
+ endloop
+endfacet
+facet normal -0.4999999999999997 0.8660254037844389 1.4922322636808774e-17
+ outer loop
+ vertex 179.92468545251552 -69.38910354298147 597.4
+ vertex 179.92468545251552 -69.38910354298147 617.4
+ vertex 182.52753457015436 -67.8863479042527 617.4
+ endloop
+endfacet
+facet normal -0.4999999999999997 0.8660254037844389 1.4922322636808774e-17
+ outer loop
+ vertex 179.92468545251552 -69.38910354298147 597.4
+ vertex 182.52753457015436 -67.8863479042527 617.4
+ vertex 182.52753457015436 -67.8863479042527 597.4
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 135.04517266035927 -104.48202726980854 604.4681483474218
+ vertex 109.72753457015432 -104.48202726980838 604.4
+ vertex 134.52753457015422 -104.48202726980857 604.4
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 109.72753457015432 -104.48202726980838 604.4
+ vertex 135.04517266035927 -104.48202726980854 604.4681483474218
+ vertex 109.20989647994931 -104.48202726980836 604.4681483474218
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 109.20989647994931 -104.48202726980836 604.4681483474218
+ vertex 135.04517266035927 -104.48202726980854 604.4681483474218
+ vertex 135.52753457015424 -104.48202726980854 604.6679491924311
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 109.20989647994931 -104.48202726980836 604.4681483474218
+ vertex 135.52753457015424 -104.48202726980854 604.6679491924311
+ vertex 108.72753457015435 -104.48202726980836 604.6679491924311
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 108.72753457015435 -104.48202726980836 604.6679491924311
+ vertex 135.52753457015424 -104.48202726980854 604.6679491924311
+ vertex 135.94174813252732 -104.48202726980857 604.9857864376269
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 108.72753457015435 -104.48202726980836 604.6679491924311
+ vertex 135.94174813252732 -104.48202726980857 604.9857864376269
+ vertex 108.31332100778125 -104.48202726980834 604.9857864376269
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 108.31332100778125 -104.48202726980834 604.9857864376269
+ vertex 135.94174813252732 -104.48202726980857 604.9857864376269
+ vertex 136.2595853777231 -104.48202726980857 605.4
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 108.31332100778125 -104.48202726980834 604.9857864376269
+ vertex 136.2595853777231 -104.48202726980857 605.4
+ vertex 107.99548376258548 -104.48202726980834 605.4
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 107.99548376258548 -104.48202726980834 605.4
+ vertex 136.2595853777231 -104.48202726980857 605.4
+ vertex 136.45938622273238 -104.48202726980857 605.8823619097949
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 107.99548376258548 -104.48202726980834 605.4
+ vertex 136.45938622273238 -104.48202726980857 605.8823619097949
+ vertex 107.79568291757623 -104.48202726980831 605.8823619097949
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 107.79568291757623 -104.48202726980831 605.8823619097949
+ vertex 136.45938622273238 -104.48202726980857 605.8823619097949
+ vertex 136.52753457015424 -104.48202726980857 606.3999999999999
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 107.79568291757623 -104.48202726980831 605.8823619097949
+ vertex 136.52753457015424 -104.48202726980857 606.3999999999999
+ vertex 107.72753457015438 -104.48202726980831 606.3999999999999
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 107.72753457015438 -104.48202726980831 606.3999999999999
+ vertex 136.52753457015424 -104.48202726980857 606.3999999999999
+ vertex 136.52753457015424 -104.48202726980857 608.4
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 107.72753457015438 -104.48202726980831 606.3999999999999
+ vertex 136.52753457015424 -104.48202726980857 608.4
+ vertex 107.72753457015438 -104.48202726980831 608.4
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 107.72753457015438 -104.48202726980831 608.4
+ vertex 136.52753457015424 -104.48202726980857 608.4
+ vertex 136.45938622273238 -104.48202726980857 608.9176380902051
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 107.72753457015438 -104.48202726980831 608.4
+ vertex 136.45938622273238 -104.48202726980857 608.9176380902051
+ vertex 107.79568291757623 -104.48202726980831 608.9176380902051
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 107.79568291757623 -104.48202726980831 608.9176380902051
+ vertex 136.45938622273238 -104.48202726980857 608.9176380902051
+ vertex 136.2595853777231 -104.48202726980857 609.4
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 107.79568291757623 -104.48202726980831 608.9176380902051
+ vertex 136.2595853777231 -104.48202726980857 609.4
+ vertex 107.99548376258548 -104.48202726980834 609.4
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 107.99548376258548 -104.48202726980834 609.4
+ vertex 136.2595853777231 -104.48202726980857 609.4
+ vertex 135.94174813252735 -104.48202726980857 609.814213562373
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 107.99548376258548 -104.48202726980834 609.4
+ vertex 135.94174813252735 -104.48202726980857 609.814213562373
+ vertex 108.31332100778125 -104.48202726980834 609.814213562373
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 108.31332100778125 -104.48202726980834 609.814213562373
+ vertex 135.94174813252735 -104.48202726980857 609.814213562373
+ vertex 135.52753457015424 -104.48202726980854 610.1320508075687
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 108.31332100778125 -104.48202726980834 609.814213562373
+ vertex 135.52753457015424 -104.48202726980854 610.1320508075687
+ vertex 108.72753457015435 -104.48202726980836 610.1320508075687
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 108.72753457015435 -104.48202726980836 610.1320508075687
+ vertex 135.52753457015424 -104.48202726980854 610.1320508075687
+ vertex 135.04517266035927 -104.48202726980854 610.331851652578
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 108.72753457015435 -104.48202726980836 610.1320508075687
+ vertex 135.04517266035927 -104.48202726980854 610.331851652578
+ vertex 109.20989647994931 -104.48202726980836 610.331851652578
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 109.20989647994931 -104.48202726980836 610.331851652578
+ vertex 135.04517266035927 -104.48202726980854 610.331851652578
+ vertex 134.52753457015422 -104.48202726980857 610.3999999999999
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 109.20989647994931 -104.48202726980836 610.331851652578
+ vertex 134.52753457015422 -104.48202726980857 610.3999999999999
+ vertex 109.72753457015432 -104.48202726980838 610.3999999999999
+ endloop
+endfacet
+facet normal 0.38268343236516245 1.837419105754634e-14 -0.9238795325112568
+ outer loop
+ vertex 135.52753457015424 -104.48202726980854 604.6679491924311
+ vertex 135.04517266035938 -106.48202726980834 604.4681483474218
+ vertex 135.04517266035927 -104.48202726980854 604.4681483474218
+ endloop
+endfacet
+facet normal 0.38268343236516245 1.837419105754634e-14 -0.9238795325112568
+ outer loop
+ vertex 135.04517266035938 -106.48202726980834 604.4681483474218
+ vertex 135.52753457015424 -104.48202726980854 604.6679491924311
+ vertex 135.52753457015433 -106.48202726980831 604.6679491924311
+ endloop
+endfacet
+facet normal 0.9914448613738114 4.768407890765046e-14 -0.13052619222004416
+ outer loop
+ vertex 136.45938622273238 -104.48202726980857 605.8823619097949
+ vertex 136.52753457015433 -106.48202726980836 606.3999999999999
+ vertex 136.45938622273246 -106.48202726980834 605.8823619097949
+ endloop
+endfacet
+facet normal 0.9914448613738114 4.768407890765046e-14 -0.13052619222004416
+ outer loop
+ vertex 136.52753457015433 -106.48202726980836 606.3999999999999
+ vertex 136.45938622273238 -104.48202726980857 605.8823619097949
+ vertex 136.52753457015424 -104.48202726980857 606.3999999999999
+ endloop
+endfacet
+facet normal 0.608761429008705 2.930988785010413e-14 -0.7933533402912473
+ outer loop
+ vertex 135.94174813252732 -104.48202726980857 604.9857864376269
+ vertex 135.52753457015433 -106.48202726980831 604.6679491924311
+ vertex 135.52753457015424 -104.48202726980854 604.6679491924311
+ endloop
+endfacet
+facet normal 0.608761429008705 2.930988785010413e-14 -0.7933533402912473
+ outer loop
+ vertex 135.52753457015433 -106.48202726980831 604.6679491924311
+ vertex 135.94174813252732 -104.48202726980857 604.9857864376269
+ vertex 135.94174813252744 -106.48202726980834 604.9857864376269
+ endloop
+endfacet
+facet normal 0.9914448613738145 4.76285677564192e-14 0.13052619222002182
+ outer loop
+ vertex 136.52753457015433 -106.48202726980836 608.4
+ vertex 136.45938622273238 -104.48202726980857 608.9176380902051
+ vertex 136.45938622273246 -106.48202726980834 608.9176380902051
+ endloop
+endfacet
+facet normal 0.9914448613738145 4.76285677564192e-14 0.13052619222002182
+ outer loop
+ vertex 136.45938622273238 -104.48202726980857 608.9176380902051
+ vertex 136.52753457015433 -106.48202726980836 608.4
+ vertex 136.52753457015424 -104.48202726980857 608.4
+ endloop
+endfacet
+facet normal 0.923879532511261 4.4297898682543733e-14 0.38268343236515184
+ outer loop
+ vertex 136.45938622273246 -106.48202726980834 608.9176380902051
+ vertex 136.2595853777231 -104.48202726980857 609.4
+ vertex 136.25958537772323 -106.48202726980836 609.4
+ endloop
+endfacet
+facet normal 0.923879532511261 4.4297898682543733e-14 0.38268343236515184
+ outer loop
+ vertex 136.2595853777231 -104.48202726980857 609.4
+ vertex 136.45938622273246 -106.48202726980834 608.9176380902051
+ vertex 136.45938622273238 -104.48202726980857 608.9176380902051
+ endloop
+endfacet
+facet normal 0.9965567391136535 0.08291360399332269 -3.151450949117091e-16
+ outer loop
+ vertex 186.6808595929021 -81.69427565173788 597.4
+ vertex 186.8144750093717 -83.30022856319225 617.4
+ vertex 186.8144750093717 -83.30022856319225 597.4
+ endloop
+endfacet
+facet normal 0.9965567391136535 0.08291360399332269 -3.151450949117091e-16
+ outer loop
+ vertex 186.8144750093717 -83.30022856319225 617.4
+ vertex 186.6808595929021 -81.69427565173788 597.4
+ vertex 186.6808595929021 -81.69427565173788 617.4
+ endloop
+endfacet
+facet normal 0.3826834323651491 1.8346435481930712e-14 0.9238795325112623
+ outer loop
+ vertex 135.04517266035938 -106.48202726980834 610.331851652578
+ vertex 135.52753457015424 -104.48202726980854 610.1320508075687
+ vertex 135.04517266035927 -104.48202726980854 610.331851652578
+ endloop
+endfacet
+facet normal 0.3826834323651491 1.8346435481930712e-14 0.9238795325112623
+ outer loop
+ vertex 135.52753457015424 -104.48202726980854 610.1320508075687
+ vertex 135.04517266035938 -106.48202726980834 610.331851652578
+ vertex 135.52753457015436 -106.48202726980834 610.1320508075687
+ endloop
+endfacet
+facet normal 0.9238795325112865 4.440892098500626e-14 -0.3826834323650907
+ outer loop
+ vertex 136.2595853777231 -104.48202726980857 605.4
+ vertex 136.45938622273246 -106.48202726980834 605.8823619097949
+ vertex 136.25958537772323 -106.48202726980836 605.4
+ endloop
+endfacet
+facet normal 0.9238795325112865 4.440892098500626e-14 -0.3826834323650907
+ outer loop
+ vertex 136.45938622273246 -106.48202726980834 605.8823619097949
+ vertex 136.2595853777231 -104.48202726980857 605.4
+ vertex 136.45938622273238 -104.48202726980857 605.8823619097949
+ endloop
+endfacet
+facet normal 0.130526192219984 6.265821195228227e-15 0.9914448613738195
+ outer loop
+ vertex 134.52753457015433 -106.48202726980834 610.3999999999999
+ vertex 135.04517266035927 -104.48202726980854 610.331851652578
+ vertex 134.52753457015422 -104.48202726980857 610.3999999999999
+ endloop
+endfacet
+facet normal 0.130526192219984 6.265821195228227e-15 0.9914448613738195
+ outer loop
+ vertex 135.04517266035927 -104.48202726980854 610.331851652578
+ vertex 134.52753457015433 -106.48202726980834 610.3999999999999
+ vertex 135.04517266035938 -106.48202726980834 610.331851652578
+ endloop
+endfacet
+facet normal 0.929708324630511 -0.3682966618267512 -2.617941281554304e-16
+ outer loop
+ vertex 184.4697700303989 -99.12640731420498 597.4
+ vertex 183.87625932185094 -100.62463388991574 617.4
+ vertex 183.87625932185094 -100.62463388991574 597.4
+ endloop
+endfacet
+facet normal 0.929708324630511 -0.3682966618267512 -2.617941281554304e-16
+ outer loop
+ vertex 183.87625932185094 -100.62463388991574 617.4
+ vertex 184.4697700303989 -99.12640731420498 597.4
+ vertex 184.4697700303989 -99.12640731420498 617.4
+ endloop
+endfacet
+facet normal 0.793353340291199 3.813616089587412e-14 -0.6087614290087678
+ outer loop
+ vertex 135.94174813252732 -104.48202726980857 604.9857864376269
+ vertex 136.25958537772323 -106.48202726980836 605.4
+ vertex 135.94174813252744 -106.48202726980834 604.9857864376269
+ endloop
+endfacet
+facet normal 0.793353340291199 3.813616089587412e-14 -0.6087614290087678
+ outer loop
+ vertex 136.25958537772323 -106.48202726980836 605.4
+ vertex 135.94174813252732 -104.48202726980857 604.9857864376269
+ vertex 136.2595853777231 -104.48202726980857 605.4
+ endloop
+endfacet
+facet normal 1.0 4.8128168117500536e-14 -5.933957380480867e-32
+ outer loop
+ vertex 136.52753457015424 -104.48202726980857 606.3999999999999
+ vertex 136.52753457015433 -106.48202726980836 608.4
+ vertex 136.52753457015433 -106.48202726980836 606.3999999999999
+ endloop
+endfacet
+facet normal 1.0 4.8128168117500536e-14 -5.933957380480867e-32
+ outer loop
+ vertex 136.52753457015433 -106.48202726980836 608.4
+ vertex 136.52753457015424 -104.48202726980857 606.3999999999999
+ vertex 136.52753457015424 -104.48202726980857 608.4
+ endloop
+endfacet
+facet normal 0.793353340291217 3.813616089587412e-14 0.6087614290087443
+ outer loop
+ vertex 136.25958537772323 -106.48202726980836 609.4
+ vertex 135.94174813252735 -104.48202726980857 609.814213562373
+ vertex 135.94174813252744 -106.48202726980836 609.814213562373
+ endloop
+endfacet
+facet normal 0.793353340291217 3.813616089587412e-14 0.6087614290087443
+ outer loop
+ vertex 135.94174813252735 -104.48202726980857 609.814213562373
+ vertex 136.25958537772323 -106.48202726980836 609.4
+ vertex 136.2595853777231 -104.48202726980857 609.4
+ endloop
+endfacet
+facet normal 0.6087614290087044 2.9254376698872875e-14 0.7933533402912477
+ outer loop
+ vertex 135.52753457015436 -106.48202726980834 610.1320508075687
+ vertex 135.94174813252735 -104.48202726980857 609.814213562373
+ vertex 135.52753457015424 -104.48202726980854 610.1320508075687
+ endloop
+endfacet
+facet normal 0.6087614290087044 2.9254376698872875e-14 0.7933533402912477
+ outer loop
+ vertex 135.94174813252735 -104.48202726980857 609.814213562373
+ vertex 135.52753457015436 -106.48202726980834 610.1320508075687
+ vertex 135.94174813252744 -106.48202726980836 609.814213562373
+ endloop
+endfacet
+facet normal -0.382683432365156 4.274358644806853e-15 -0.9238795325112594
+ outer loop
+ vertex 109.20989647994931 -104.48202726980836 604.4681483474218
+ vertex 108.72753457015433 -106.48202726980836 604.6679491924311
+ vertex 108.72753457015435 -104.48202726980836 604.6679491924311
+ endloop
+endfacet
+facet normal -0.382683432365156 4.274358644806853e-15 -0.9238795325112594
+ outer loop
+ vertex 108.72753457015433 -106.48202726980836 604.6679491924311
+ vertex 109.20989647994931 -104.48202726980836 604.4681483474218
+ vertex 109.20989647994928 -106.48202726980834 604.4681483474218
+ endloop
+endfacet
+facet normal -0.13052619221999057 1.0963452368173417e-15 -0.9914448613738184
+ outer loop
+ vertex 109.72753457015432 -104.48202726980838 604.4
+ vertex 109.20989647994928 -106.48202726980834 604.4681483474218
+ vertex 109.20989647994931 -104.48202726980836 604.4681483474218
+ endloop
+endfacet
+facet normal -0.13052619221999057 1.0963452368173417e-15 -0.9914448613738184
+ outer loop
+ vertex 109.20989647994928 -106.48202726980834 604.4681483474218
+ vertex 109.72753457015432 -104.48202726980838 604.4
+ vertex 109.72753457015432 -106.48202726980836 604.4
+ endloop
+endfacet
+facet normal 0.13052619221998402 6.2727600891321345e-15 -0.9914448613738195
+ outer loop
+ vertex 135.04517266035927 -104.48202726980854 604.4681483474218
+ vertex 134.52753457015433 -106.48202726980834 604.4
+ vertex 134.52753457015422 -104.48202726980857 604.4
+ endloop
+endfacet
+facet normal 0.13052619221998402 6.2727600891321345e-15 -0.9914448613738195
+ outer loop
+ vertex 134.52753457015433 -106.48202726980834 604.4
+ vertex 135.04517266035927 -104.48202726980854 604.4681483474218
+ vertex 135.04517266035938 -106.48202726980834 604.4681483474218
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 134.52753457015422 -104.48202726980857 604.4
+ vertex 109.72753457015432 -106.48202726980836 604.4
+ vertex 109.72753457015432 -104.48202726980838 604.4
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 109.72753457015432 -106.48202726980836 604.4
+ vertex 134.52753457015422 -104.48202726980857 604.4
+ vertex 134.52753457015433 -106.48202726980834 604.4
+ endloop
+endfacet
+facet normal -1.0 2.2537527399890668e-14 5.933957380479863e-32
+ outer loop
+ vertex 107.72753457015438 -104.48202726980831 608.4
+ vertex 107.72753457015433 -106.48202726980836 606.3999999999999
+ vertex 107.72753457015433 -106.48202726980836 608.4
+ endloop
+endfacet
+facet normal -1.0 2.2537527399890668e-14 5.933957380479863e-32
+ outer loop
+ vertex 107.72753457015433 -106.48202726980836 606.3999999999999
+ vertex 107.72753457015438 -104.48202726980831 608.4
+ vertex 107.72753457015438 -104.48202726980831 606.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325113045 1.8096635301390052e-14 -0.3826834323650471
+ outer loop
+ vertex 107.79568291757623 -104.48202726980831 605.8823619097949
+ vertex 107.99548376258544 -106.48202726980834 605.4
+ vertex 107.7956829175762 -106.48202726980834 605.8823619097949
+ endloop
+endfacet
+facet normal -0.9238795325113045 1.8096635301390052e-14 -0.3826834323650471
+ outer loop
+ vertex 107.99548376258544 -106.48202726980834 605.4
+ vertex 107.79568291757623 -104.48202726980831 605.8823619097949
+ vertex 107.99548376258548 -104.48202726980834 605.4
+ endloop
+endfacet
+facet normal -0.7933533402912079 1.321165399303936e-14 -0.6087614290087563
+ outer loop
+ vertex 107.99548376258548 -104.48202726980834 605.4
+ vertex 108.31332100778123 -106.48202726980834 604.9857864376269
+ vertex 107.99548376258544 -106.48202726980834 605.4
+ endloop
+endfacet
+facet normal -0.7933533402912079 1.321165399303936e-14 -0.6087614290087563
+ outer loop
+ vertex 108.31332100778123 -106.48202726980834 604.9857864376269
+ vertex 107.99548376258548 -104.48202726980834 605.4
+ vertex 108.31332100778125 -104.48202726980834 604.9857864376269
+ endloop
+endfacet
+facet normal -0.9914448613738116 2.2259971643734382e-14 0.13052619222004302
+ outer loop
+ vertex 107.79568291757619 -106.48202726980834 608.9176380902051
+ vertex 107.72753457015438 -104.48202726980831 608.4
+ vertex 107.72753457015433 -106.48202726980836 608.4
+ endloop
+endfacet
+facet normal -0.9914448613738116 2.2259971643734382e-14 0.13052619222004302
+ outer loop
+ vertex 107.72753457015438 -104.48202726980831 608.4
+ vertex 107.79568291757619 -106.48202726980834 608.9176380902051
+ vertex 107.79568291757623 -104.48202726980831 608.9176380902051
+ endloop
+endfacet
+facet normal -0.6087614290086992 8.493206138382446e-15 -0.7933533402912516
+ outer loop
+ vertex 108.72753457015435 -104.48202726980836 604.6679491924311
+ vertex 108.31332100778123 -106.48202726980834 604.9857864376269
+ vertex 108.31332100778125 -104.48202726980834 604.9857864376269
+ endloop
+endfacet
+facet normal -0.6087614290086992 8.493206138382446e-15 -0.7933533402912516
+ outer loop
+ vertex 108.31332100778123 -106.48202726980834 604.9857864376269
+ vertex 108.72753457015435 -104.48202726980836 604.6679491924311
+ vertex 108.72753457015433 -106.48202726980836 604.6679491924311
+ endloop
+endfacet
+facet normal -0.9914448613738074 2.2315482794965637e-14 -0.13052619222007458
+ outer loop
+ vertex 107.72753457015438 -104.48202726980831 606.3999999999999
+ vertex 107.7956829175762 -106.48202726980834 605.8823619097949
+ vertex 107.72753457015433 -106.48202726980836 606.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738074 2.2315482794965637e-14 -0.13052619222007458
+ outer loop
+ vertex 107.7956829175762 -106.48202726980834 605.8823619097949
+ vertex 107.72753457015438 -104.48202726980831 606.3999999999999
+ vertex 107.79568291757623 -104.48202726980831 605.8823619097949
+ endloop
+endfacet
+facet normal -0.9238795325112759 1.8152146452621306e-14 0.3826834323651162
+ outer loop
+ vertex 107.99548376258544 -106.48202726980834 609.4
+ vertex 107.79568291757623 -104.48202726980831 608.9176380902051
+ vertex 107.79568291757619 -106.48202726980834 608.9176380902051
+ endloop
+endfacet
+facet normal -0.9238795325112759 1.8152146452621306e-14 0.3826834323651162
+ outer loop
+ vertex 107.79568291757623 -104.48202726980831 608.9176380902051
+ vertex 107.99548376258544 -106.48202726980834 609.4
+ vertex 107.99548376258548 -104.48202726980834 609.4
+ endloop
+endfacet
+facet normal -0.13052619221999065 1.0894063429134349e-15 0.9914448613738184
+ outer loop
+ vertex 109.20989647994928 -106.48202726980834 610.331851652578
+ vertex 109.72753457015432 -104.48202726980838 610.3999999999999
+ vertex 109.20989647994931 -104.48202726980836 610.331851652578
+ endloop
+endfacet
+facet normal -0.13052619221999065 1.0894063429134349e-15 0.9914448613738184
+ outer loop
+ vertex 109.72753457015432 -104.48202726980838 610.3999999999999
+ vertex 109.20989647994928 -106.48202726980834 610.331851652578
+ vertex 109.72753457015432 -106.48202726980836 610.3999999999999
+ endloop
+endfacet
+facet normal -0.382683432365156 4.274358644806853e-15 0.9238795325112594
+ outer loop
+ vertex 108.72753457015433 -106.48202726980836 610.1320508075687
+ vertex 109.20989647994931 -104.48202726980836 610.331851652578
+ vertex 108.72753457015435 -104.48202726980836 610.1320508075687
+ endloop
+endfacet
+facet normal -0.382683432365156 4.274358644806853e-15 0.9238795325112594
+ outer loop
+ vertex 109.20989647994931 -104.48202726980836 610.331851652578
+ vertex 108.72753457015433 -106.48202726980836 610.1320508075687
+ vertex 109.20989647994928 -106.48202726980834 610.331851652578
+ endloop
+endfacet
+facet normal -0.6087614290086992 8.493206138382446e-15 0.7933533402912516
+ outer loop
+ vertex 108.31332100778123 -106.48202726980834 609.814213562373
+ vertex 108.72753457015435 -104.48202726980836 610.1320508075687
+ vertex 108.31332100778125 -104.48202726980834 609.814213562373
+ endloop
+endfacet
+facet normal -0.6087614290086992 8.493206138382446e-15 0.7933533402912516
+ outer loop
+ vertex 108.72753457015435 -104.48202726980836 610.1320508075687
+ vertex 108.31332100778123 -106.48202726980834 609.814213562373
+ vertex 108.72753457015433 -106.48202726980836 610.1320508075687
+ endloop
+endfacet
+facet normal 5.933957380480184e-32 1.4193619471206742e-31 1.0
+ outer loop
+ vertex 109.72753457015432 -106.48202726980836 610.3999999999999
+ vertex 134.52753457015422 -104.48202726980857 610.3999999999999
+ vertex 109.72753457015432 -104.48202726980838 610.3999999999999
+ endloop
+endfacet
+facet normal 5.933957380480184e-32 1.4193619471206742e-31 1.0
+ outer loop
+ vertex 134.52753457015422 -104.48202726980857 610.3999999999999
+ vertex 109.72753457015432 -106.48202726980836 610.3999999999999
+ vertex 134.52753457015433 -106.48202726980834 610.3999999999999
+ endloop
+endfacet
+facet normal -0.793353340291208 1.326716514427062e-14 0.6087614290087562
+ outer loop
+ vertex 108.31332100778123 -106.48202726980834 609.814213562373
+ vertex 107.99548376258548 -104.48202726980834 609.4
+ vertex 107.99548376258544 -106.48202726980834 609.4
+ endloop
+endfacet
+facet normal -0.793353340291208 1.326716514427062e-14 0.6087614290087562
+ outer loop
+ vertex 107.99548376258548 -104.48202726980834 609.4
+ vertex 108.31332100778123 -106.48202726980834 609.814213562373
+ vertex 108.31332100778125 -104.48202726980834 609.814213562373
+ endloop
+endfacet
+facet normal 0.996446235550411 -0.08423122732938658 -3.030296777091401e-16
+ outer loop
+ vertex 186.81128066401763 -88.13191271645415 597.4
+ vertex 186.67554189525939 -89.73768755122492 617.4
+ vertex 186.67554189525939 -89.73768755122492 597.4
+ endloop
+endfacet
+facet normal 0.996446235550411 -0.08423122732938658 -3.030296777091401e-16
+ outer loop
+ vertex 186.67554189525939 -89.73768755122492 617.4
+ vertex 186.81128066401763 -88.13191271645415 597.4
+ vertex 186.81128066401763 -88.13191271645415 617.4
+ endloop
+endfacet
+facet normal 0.9920516018175789 -0.12583171035623705 -2.9865951294905024e-16
+ outer loop
+ vertex 186.67554189525939 -89.73768755122492 597.4
+ vertex 186.4727638760373 -91.33638042612223 617.4
+ vertex 186.4727638760373 -91.33638042612223 597.4
+ endloop
+endfacet
+facet normal 0.9920516018175789 -0.12583171035623705 -2.9865951294905024e-16
+ outer loop
+ vertex 186.4727638760373 -91.33638042612223 617.4
+ vertex 186.67554189525939 -89.73768755122492 597.4
+ vertex 186.67554189525939 -89.73768755122492 617.4
+ endloop
+endfacet
+facet normal 0.9572353791850622 -0.2893102639666116 -2.7604267320249543e-16
+ outer loop
+ vertex 185.4663253888957 -96.06208286410167 597.4
+ vertex 185.0001013973305 -97.60466933591321 617.4
+ vertex 185.0001013973305 -97.60466933591321 597.4
+ endloop
+endfacet
+facet normal 0.9572353791850622 -0.2893102639666116 -2.7604267320249543e-16
+ outer loop
+ vertex 185.0001013973305 -97.60466933591321 617.4
+ vertex 185.4663253888957 -96.06208286410167 597.4
+ vertex 185.4663253888957 -96.06208286410167 617.4
+ endloop
+endfacet
+facet normal 0.9990971750681176 -0.04248334698334532 -3.0686956689872714e-16
+ outer loop
+ vertex 186.87974265127679 -86.52186588805827 597.4
+ vertex 186.81128066401763 -88.13191271645415 617.4
+ vertex 186.81128066401763 -88.13191271645415 597.4
+ endloop
+endfacet
+facet normal 0.9990971750681176 -0.04248334698334532 -3.0686956689872714e-16
+ outer loop
+ vertex 186.81128066401763 -88.13191271645415 617.4
+ vertex 186.87974265127679 -86.52186588805827 597.4
+ vertex 186.87974265127679 -86.52186588805827 617.4
+ endloop
+endfacet
+facet normal 0.978339619447619 0.2070062535748331 -3.1846312298286436e-16
+ outer loop
+ vertex 185.87924330029887 -76.92955181082564 597.4
+ vertex 186.21283423653944 -78.50614780237997 617.4
+ vertex 186.21283423653944 -78.50614780237997 597.4
+ endloop
+endfacet
+facet normal 0.978339619447619 0.2070062535748331 -3.1846312298286436e-16
+ outer loop
+ vertex 186.21283423653944 -78.50614780237997 617.4
+ vertex 185.87924330029887 -76.92955181082564 597.4
+ vertex 185.87924330029887 -76.92955181082564 617.4
+ endloop
+endfacet
+facet normal 0.258819045102526 -0.9659258262890669 -1.047433653618763e-17
+ outer loop
+ vertex 145.33456399870488 -56.22115326457819 597.4
+ vertex 144.64839188070863 -56.40501252946406 617.4
+ vertex 144.64839188070863 -56.40501252946406 597.4
+ endloop
+endfacet
+facet normal 0.258819045102526 -0.9659258262890669 -1.047433653618763e-17
+ outer loop
+ vertex 144.64839188070863 -56.40501252946406 617.4
+ vertex 145.33456399870488 -56.22115326457819 597.4
+ vertex 145.3345639987049 -56.2211532645782 617.4
+ endloop
+endfacet
+facet normal 0.9684976081015065 -0.2490228565848135 -2.8244839711310887e-16
+ outer loop
+ vertex 185.86762615367383 -94.50134729088126 597.4
+ vertex 185.4663253888957 -96.06208286410167 617.4
+ vertex 185.4663253888957 -96.06208286410167 597.4
+ endloop
+endfacet
+facet normal 0.9684976081015065 -0.2490228565848135 -2.8244839711310887e-16
+ outer loop
+ vertex 185.4663253888957 -96.06208286410167 617.4
+ vertex 185.86762615367383 -94.50134729088126 597.4
+ vertex 185.86762615367383 -94.50134729088126 617.4
+ endloop
+endfacet
+facet normal 0.9861411980746715 0.16590821998879904 -3.1791278782751904e-16
+ outer loop
+ vertex 186.21283423653944 -78.50614780237997 597.4
+ vertex 186.48019562046042 -80.0953160514068 617.4
+ vertex 186.48019562046042 -80.0953160514068 597.4
+ endloop
+endfacet
+facet normal 0.9861411980746715 0.16590821998879904 -3.1791278782751904e-16
+ outer loop
+ vertex 186.48019562046042 -80.0953160514068 617.4
+ vertex 186.21283423653944 -78.50614780237997 597.4
+ vertex 186.21283423653944 -78.50614780237997 617.4
+ endloop
+endfacet
+facet normal 0.8191520442889912 -0.5735764363510468 -2.1265981455630456e-16
+ outer loop
+ vertex 142.9203509284472 -57.614999830572586 597.4
+ vertex 142.51289504782767 -58.19690713431473 617.4
+ vertex 142.51289504782767 -58.19690713431473 597.4
+ endloop
+endfacet
+facet normal 0.8191520442889912 -0.5735764363510468 -2.1265981455630456e-16
+ outer loop
+ vertex 142.51289504782767 -58.19690713431473 617.4
+ vertex 142.9203509284472 -57.614999830572586 597.4
+ vertex 142.9203509284472 -57.6149998305726 617.4
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 150.02753457015436 -104.48202726980841 597.4
+ vertex 135.04517266035927 -104.48202726980854 604.4681483474218
+ vertex 94.73693564691287 -104.48202726980836 597.4
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 135.04517266035927 -104.48202726980854 604.4681483474218
+ vertex 150.02753457015436 -104.48202726980841 597.4
+ vertex 135.52753457015424 -104.48202726980854 604.6679491924311
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 135.52753457015424 -104.48202726980854 604.6679491924311
+ vertex 150.02753457015436 -104.48202726980841 597.4
+ vertex 135.94174813252732 -104.48202726980857 604.9857864376269
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 135.94174813252732 -104.48202726980857 604.9857864376269
+ vertex 150.02753457015436 -104.48202726980841 597.4
+ vertex 150.02753457015436 -104.48202726980841 617.4
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 94.73693564691287 -104.48202726980836 597.4
+ vertex 135.04517266035927 -104.48202726980854 604.4681483474218
+ vertex 134.52753457015422 -104.48202726980857 604.4
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 135.94174813252732 -104.48202726980857 604.9857864376269
+ vertex 150.02753457015436 -104.48202726980841 617.4
+ vertex 136.2595853777231 -104.48202726980857 605.4
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 136.2595853777231 -104.48202726980857 605.4
+ vertex 150.02753457015436 -104.48202726980841 617.4
+ vertex 136.45938622273238 -104.48202726980857 605.8823619097949
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 136.45938622273238 -104.48202726980857 605.8823619097949
+ vertex 150.02753457015436 -104.48202726980841 617.4
+ vertex 136.52753457015424 -104.48202726980857 606.3999999999999
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 136.52753457015424 -104.48202726980857 606.3999999999999
+ vertex 150.02753457015436 -104.48202726980841 617.4
+ vertex 136.52753457015424 -104.48202726980857 608.4
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 136.52753457015424 -104.48202726980857 608.4
+ vertex 150.02753457015436 -104.48202726980841 617.4
+ vertex 136.45938622273238 -104.48202726980857 608.9176380902051
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 136.45938622273238 -104.48202726980857 608.9176380902051
+ vertex 150.02753457015436 -104.48202726980841 617.4
+ vertex 136.2595853777231 -104.48202726980857 609.4
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 136.2595853777231 -104.48202726980857 609.4
+ vertex 150.02753457015436 -104.48202726980841 617.4
+ vertex 135.94174813252735 -104.48202726980857 609.814213562373
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 135.94174813252735 -104.48202726980857 609.814213562373
+ vertex 150.02753457015436 -104.48202726980841 617.4
+ vertex 135.52753457015424 -104.48202726980854 610.1320508075687
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 135.52753457015424 -104.48202726980854 610.1320508075687
+ vertex 150.02753457015436 -104.48202726980841 617.4
+ vertex 135.04517266035927 -104.48202726980854 610.331851652578
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 135.04517266035927 -104.48202726980854 610.331851652578
+ vertex 150.02753457015436 -104.48202726980841 617.4
+ vertex 134.52753457015422 -104.48202726980857 610.3999999999999
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 134.52753457015422 -104.48202726980857 610.3999999999999
+ vertex 150.02753457015436 -104.48202726980841 617.4
+ vertex 109.72753457015432 -104.48202726980838 610.3999999999999
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 94.73693564691287 -104.48202726980836 597.4
+ vertex 108.31332100778125 -104.48202726980834 604.9857864376269
+ vertex 94.73693564691287 -104.48202726980836 617.4
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 108.31332100778125 -104.48202726980834 604.9857864376269
+ vertex 94.73693564691287 -104.48202726980836 597.4
+ vertex 108.72753457015435 -104.48202726980836 604.6679491924311
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 108.72753457015435 -104.48202726980836 604.6679491924311
+ vertex 94.73693564691287 -104.48202726980836 597.4
+ vertex 109.20989647994931 -104.48202726980836 604.4681483474218
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 109.20989647994931 -104.48202726980836 604.4681483474218
+ vertex 94.73693564691287 -104.48202726980836 597.4
+ vertex 109.72753457015432 -104.48202726980838 604.4
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 109.72753457015432 -104.48202726980838 604.4
+ vertex 94.73693564691287 -104.48202726980836 597.4
+ vertex 134.52753457015422 -104.48202726980857 604.4
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 94.73693564691287 -104.48202726980836 617.4
+ vertex 108.31332100778125 -104.48202726980834 604.9857864376269
+ vertex 107.99548376258548 -104.48202726980834 605.4
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 94.73693564691287 -104.48202726980836 617.4
+ vertex 107.99548376258548 -104.48202726980834 605.4
+ vertex 107.79568291757623 -104.48202726980831 605.8823619097949
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 94.73693564691287 -104.48202726980836 617.4
+ vertex 107.79568291757623 -104.48202726980831 605.8823619097949
+ vertex 107.72753457015438 -104.48202726980831 606.3999999999999
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 94.73693564691287 -104.48202726980836 617.4
+ vertex 107.72753457015438 -104.48202726980831 606.3999999999999
+ vertex 107.72753457015438 -104.48202726980831 608.4
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 94.73693564691287 -104.48202726980836 617.4
+ vertex 107.72753457015438 -104.48202726980831 608.4
+ vertex 107.79568291757623 -104.48202726980831 608.9176380902051
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 94.73693564691287 -104.48202726980836 617.4
+ vertex 107.79568291757623 -104.48202726980831 608.9176380902051
+ vertex 107.99548376258548 -104.48202726980834 609.4
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 94.73693564691287 -104.48202726980836 617.4
+ vertex 107.99548376258548 -104.48202726980834 609.4
+ vertex 108.31332100778125 -104.48202726980834 609.814213562373
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 94.73693564691287 -104.48202726980836 617.4
+ vertex 108.31332100778125 -104.48202726980834 609.814213562373
+ vertex 108.72753457015435 -104.48202726980836 610.1320508075687
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 94.73693564691287 -104.48202726980836 617.4
+ vertex 108.72753457015435 -104.48202726980836 610.1320508075687
+ vertex 109.20989647994931 -104.48202726980836 610.331851652578
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 94.73693564691287 -104.48202726980836 617.4
+ vertex 109.20989647994931 -104.48202726980836 610.331851652578
+ vertex 109.72753457015432 -104.48202726980838 610.3999999999999
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 7.227945163972792e-17
+ outer loop
+ vertex 94.73693564691287 -104.48202726980836 617.4
+ vertex 109.72753457015432 -104.48202726980838 610.3999999999999
+ vertex 150.02753457015436 -104.48202726980841 617.4
+ endloop
+endfacet
+facet normal -0.9951296050077003 0.09857519585178845 3.0158445798888856e-16
+ outer loop
+ vertex 93.36206755126861 -102.99966536001341 617.4
+ vertex 93.31428591610249 -103.48202726980837 597.4
+ vertex 93.31428591610249 -103.48202726980837 617.4
+ endloop
+endfacet
+facet normal -0.9951296050077003 0.09857519585178845 3.0158445798888856e-16
+ outer loop
+ vertex 93.31428591610249 -103.48202726980837 597.4
+ vertex 93.36206755126861 -102.99966536001341 617.4
+ vertex 93.36206755126861 -102.99966536001341 597.4
+ endloop
+endfacet
+facet normal 0.7291677277632 -0.684335023792186 -1.7673928161385297e-16
+ outer loop
+ vertex 177.000639301392 -111.46014411930012 597.4
+ vertex 175.89783222505156 -112.6351991757552 617.4
+ vertex 175.89783222505156 -112.6351991757552 597.4
+ endloop
+endfacet
+facet normal 0.7291677277632 -0.684335023792186 -1.7673928161385297e-16
+ outer loop
+ vertex 175.89783222505156 -112.6351991757552 617.4
+ vertex 177.000639301392 -111.46014411930012 597.4
+ vertex 177.000639301392 -111.46014411930012 617.4
+ endloop
+endfacet
+facet normal 0.3882711944089259 -0.92154515873736 -5.3840833328123284e-17
+ outer loop
+ vertex 164.0622132844704 -120.8709202563717 597.4
+ vertex 162.5771416647378 -121.49661995877848 617.4
+ vertex 162.5771416647378 -121.49661995877848 597.4
+ endloop
+endfacet
+facet normal 0.3882711944089259 -0.92154515873736 -5.3840833328123284e-17
+ outer loop
+ vertex 162.5771416647378 -121.49661995877848 617.4
+ vertex 164.0622132844704 -120.8709202563717 597.4
+ vertex 164.0622132844704 -120.8709202563717 617.4
+ endloop
+endfacet
+facet normal 0.06403093220852701 -0.9979479143324601 5.2267432081861846e-17
+ outer loop
+ vertex 151.63572936288375 -124.07481319206396 617.4
+ vertex 150.02753457015433 -124.17799915024119 597.4
+ vertex 151.63572936288375 -124.07481319206396 597.4
+ endloop
+endfacet
+facet normal 0.06403093220852701 -0.9979479143324601 5.2267432081861846e-17
+ outer loop
+ vertex 150.02753457015433 -124.17799915024119 597.4
+ vertex 151.63572936288375 -124.07481319206396 617.4
+ vertex 150.02753457015433 -124.17799915024119 617.4
+ endloop
+endfacet
+facet normal 0.3493898658303748 -0.9369774392454884 -4.066361857341846e-17
+ outer loop
+ vertex 162.5771416647378 -121.49661995877848 597.4
+ vertex 161.06720089823253 -122.05966233282531 617.4
+ vertex 161.06720089823253 -122.05966233282531 597.4
+ endloop
+endfacet
+facet normal 0.3493898658303748 -0.9369774392454884 -4.066361857341846e-17
+ outer loop
+ vertex 161.06720089823253 -122.05966233282531 617.4
+ vertex 162.5771416647378 -121.49661995877848 597.4
+ vertex 162.5771416647378 -121.49661995877848 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844379 0.5000000000000013 2.325189473563778e-16
+ outer loop
+ vertex 135.51562203109634 -29.851270586485427 617.4
+ vertex 134.3609214927171 -31.851270586485423 597.4
+ vertex 134.3609214927171 -31.851270586485423 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844379 0.5000000000000013 2.325189473563778e-16
+ outer loop
+ vertex 134.3609214927171 -31.851270586485423 597.4
+ vertex 135.51562203109634 -29.851270586485427 617.4
+ vertex 135.51562203109634 -29.851270586485427 597.4
+ endloop
+endfacet
+facet normal 0.6694253404686521 -0.7428793398247319 -1.539744283755051e-16
+ outer loop
+ vertex 174.7468459524417 -113.76310361922131 597.4
+ vertex 173.5496946093963 -114.84188371505724 617.4
+ vertex 173.5496946093963 -114.84188371505724 597.4
+ endloop
+endfacet
+facet normal 0.6694253404686521 -0.7428793398247319 -1.539744283755051e-16
+ outer loop
+ vertex 173.5496946093963 -114.84188371505724 617.4
+ vertex 174.7468459524417 -113.76310361922131 597.4
+ vertex 174.7468459524417 -113.76310361922131 617.4
+ endloop
+endfacet
+facet normal 0.582933426294531 0.8125199200687444 -2.3956628513972294e-16
+ outer loop
+ vertex 137.09297230028596 -29.11921977891657 617.4
+ vertex 137.4868191504033 -29.401780843702266 597.4
+ vertex 137.09297230028596 -29.11921977891656 597.4
+ endloop
+endfacet
+facet normal 0.582933426294531 0.8125199200687444 -2.3956628513972294e-16
+ outer loop
+ vertex 137.4868191504033 -29.401780843702266 597.4
+ vertex 137.09297230028596 -29.11921977891657 617.4
+ vertex 137.4868191504033 -29.401780843702266 617.4
+ endloop
+endfacet
+facet normal 0.7571505514688199 -0.6532404170062215 -1.8766762311344204e-16
+ outer loop
+ vertex 178.05333736503042 -110.23999469396776 597.4
+ vertex 177.000639301392 -111.46014411930012 617.4
+ vertex 177.000639301392 -111.46014411930012 597.4
+ endloop
+endfacet
+facet normal 0.7571505514688199 -0.6532404170062215 -1.8766762311344204e-16
+ outer loop
+ vertex 177.000639301392 -111.46014411930012 617.4
+ vertex 178.05333736503042 -110.23999469396776 597.4
+ vertex 178.05333736503042 -110.23999469396776 617.4
+ endloop
+endfacet
+facet normal 0.809094707151618 -0.5876782749593841 -2.0852055110422162e-16
+ outer loop
+ vertex 180.00112884410115 -107.67302853289175 597.4
+ vertex 179.05408428594694 -108.97688605509174 617.4
+ vertex 179.05408428594694 -108.97688605509174 597.4
+ endloop
+endfacet
+facet normal 0.809094707151618 -0.5876782749593841 -2.0852055110422162e-16
+ outer loop
+ vertex 179.05408428594694 -108.97688605509174 617.4
+ vertex 180.00112884410115 -107.67302853289175 597.4
+ vertex 180.00112884410115 -107.67302853289175 617.4
+ endloop
+endfacet
+facet normal 0.22935485323248694 -0.9733428744788264 -7.978454901591367e-19
+ outer loop
+ vertex 157.98331987988098 -122.9939453641928 617.4
+ vertex 156.4147761514999 -123.36355110749699 597.4
+ vertex 157.98331987988098 -122.9939453641928 597.4
+ endloop
+endfacet
+facet normal 0.22935485323248694 -0.9733428744788264 -7.978454901591367e-19
+ outer loop
+ vertex 156.4147761514999 -123.36355110749699 597.4
+ vertex 157.98331987988098 -122.9939453641928 617.4
+ vertex 156.4147761514999 -123.36355110749699 617.4
+ endloop
+endfacet
+facet normal -1.0 6.661338147750937e-16 2.866236810576698e-31
+ outer loop
+ vertex 150.02753457015436 -121.17248787278366 617.4
+ vertex 150.02753457015433 -124.17799915024119 597.4
+ vertex 150.02753457015433 -124.17799915024119 617.4
+ endloop
+endfacet
+facet normal -1.0 6.661338147750937e-16 2.866236810576698e-31
+ outer loop
+ vertex 150.02753457015433 -124.17799915024119 597.4
+ vertex 150.02753457015436 -121.17248787278366 617.4
+ vertex 150.02753457015436 -121.17248787278366 597.4
+ endloop
+endfacet
+facet normal -1.0 6.661338147750937e-16 2.866236810576698e-31
+ outer loop
+ vertex 150.02753457015436 -121.17248787278366 597.4
+ vertex 150.02753457015436 -121.17248787278366 617.4
+ vertex 150.02753457015436 -104.48202726980841 617.4
+ endloop
+endfacet
+facet normal -1.0 6.661338147750937e-16 2.866236810576698e-31
+ outer loop
+ vertex 150.02753457015436 -121.17248787278366 597.4
+ vertex 150.02753457015436 -104.48202726980841 617.4
+ vertex 150.02753457015436 -104.48202726980841 597.4
+ endloop
+endfacet
+facet normal 0.7838084275862282 -0.6210026963265172 -1.9826756260084607e-16
+ outer loop
+ vertex 179.05408428594694 -108.97688605509174 597.4
+ vertex 178.05333736503042 -110.23999469396776 617.4
+ vertex 178.05333736503042 -110.23999469396776 597.4
+ endloop
+endfacet
+facet normal 0.7838084275862282 -0.6210026963265172 -1.9826756260084607e-16
+ outer loop
+ vertex 178.05333736503042 -110.23999469396776 617.4
+ vertex 179.05408428594694 -108.97688605509174 597.4
+ vertex 179.05408428594694 -108.97688605509174 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 3.047983989961057e-16
+ outer loop
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 134.3609214927171 -31.851270586485423 597.4
+ vertex 143.55963228918765 -47.783905050104764 597.4
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 3.047983989961057e-16
+ outer loop
+ vertex 134.3609214927171 -31.851270586485423 597.4
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 134.3609214927171 -31.851270586485423 617.4
+ endloop
+endfacet
+facet normal 0.46392867916166225 -0.8858725532780185 -7.988971840785966e-17
+ outer loop
+ vertex 166.94740216554413 -119.43603627549433 597.4
+ vertex 165.51981701130626 -120.18365814564446 617.4
+ vertex 165.51981701130626 -120.18365814564446 597.4
+ endloop
+endfacet
+facet normal 0.46392867916166225 -0.8858725532780185 -7.988971840785966e-17
+ outer loop
+ vertex 165.51981701130626 -120.18365814564446 617.4
+ vertex 166.94740216554413 -119.43603627549433 597.4
+ vertex 166.94740216554413 -119.43603627549433 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 2.3251894735637803e-16
+ outer loop
+ vertex 94.73693564691287 -100.48202726980837 617.4
+ vertex 93.58223510853361 -102.48202726980837 597.4
+ vertex 93.58223510853362 -102.48202726980837 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 2.3251894735637803e-16
+ outer loop
+ vertex 93.58223510853361 -102.48202726980837 597.4
+ vertex 94.73693564691287 -100.48202726980837 617.4
+ vertex 94.73693564691285 -100.48202726980837 597.4
+ endloop
+endfacet
+facet normal 0.42647308217927365 -0.9045002543816728 -6.692383130898715e-17
+ outer loop
+ vertex 165.51981701130626 -120.18365814564446 597.4
+ vertex 164.0622132844704 -120.8709202563717 617.4
+ vertex 164.0622132844704 -120.8709202563717 597.4
+ endloop
+endfacet
+facet normal 0.42647308217927365 -0.9045002543816728 -6.692383130898715e-17
+ outer loop
+ vertex 164.0622132844704 -120.8709202563717 617.4
+ vertex 165.51981701130626 -120.18365814564446 597.4
+ vertex 165.51981701130626 -120.18365814564446 617.4
+ endloop
+endfacet
+facet normal 0.5363402452594244 -0.844001860966586 -1.0537964790030855e-16
+ outer loop
+ vertex 169.70258105841677 -117.76504968478841 597.4
+ vertex 168.34247059737297 -118.62936291914635 617.4
+ vertex 168.34247059737297 -118.62936291914635 597.4
+ endloop
+endfacet
+facet normal 0.5363402452594244 -0.844001860966586 -1.0537964790030855e-16
+ outer loop
+ vertex 168.34247059737297 -118.62936291914635 617.4
+ vertex 169.70258105841677 -117.76504968478841 597.4
+ vertex 169.70258105841677 -117.76504968478841 617.4
+ endloop
+endfacet
+facet normal 0.7990717941595427 0.6012356175233216 -2.913452840785481e-16
+ outer loop
+ vertex 137.4868191504033 -29.401780843702266 617.4
+ vertex 137.82502310785486 -29.851270586485438 597.4
+ vertex 137.4868191504033 -29.401780843702266 597.4
+ endloop
+endfacet
+facet normal 0.7990717941595427 0.6012356175233216 -2.913452840785481e-16
+ outer loop
+ vertex 137.82502310785486 -29.851270586485438 597.4
+ vertex 137.4868191504033 -29.401780843702266 617.4
+ vertex 137.82502310785486 -29.851270586485448 617.4
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 137.82502310785486 -29.851270586485438 597.4
+ vertex 145.06150352437302 -42.385222335872164 604.4681483474218
+ vertex 165.4703225694756 -77.73433384446909 597.4
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 145.06150352437302 -42.385222335872164 604.4681483474218
+ vertex 137.82502310785486 -29.851270586485438 597.4
+ vertex 144.8203225694756 -41.96748466817175 604.6679491924311
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 144.8203225694756 -41.96748466817175 604.6679491924311
+ vertex 137.82502310785486 -29.851270586485438 597.4
+ vertex 144.613215788289 -41.6087652005646 604.9857864376269
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 144.613215788289 -41.6087652005646 604.9857864376269
+ vertex 137.82502310785486 -29.851270586485438 597.4
+ vertex 137.82502310785486 -29.851270586485448 617.4
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 165.4703225694756 -77.73433384446909 597.4
+ vertex 145.06150352437302 -42.385222335872164 604.4681483474218
+ vertex 145.32032256947556 -42.833510071956184 604.4
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 144.613215788289 -41.6087652005646 604.9857864376269
+ vertex 137.82502310785486 -29.851270586485448 617.4
+ vertex 144.45429716569112 -41.333510071956184 605.4
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 144.45429716569112 -41.333510071956184 605.4
+ vertex 137.82502310785486 -29.851270586485448 617.4
+ vertex 144.3543967431865 -41.160477464480586 605.8823619097949
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 144.3543967431865 -41.160477464480586 605.8823619097949
+ vertex 137.82502310785486 -29.851270586485448 617.4
+ vertex 144.32032256947556 -41.101459264387316 606.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 144.32032256947556 -41.101459264387316 606.3999999999999
+ vertex 137.82502310785486 -29.851270586485448 617.4
+ vertex 144.32032256947556 -41.101459264387316 608.4
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 144.32032256947556 -41.101459264387316 608.4
+ vertex 137.82502310785486 -29.851270586485448 617.4
+ vertex 144.3543967431865 -41.160477464480586 608.9176380902051
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 144.3543967431865 -41.160477464480586 608.9176380902051
+ vertex 137.82502310785486 -29.851270586485448 617.4
+ vertex 144.45429716569112 -41.3335100719562 609.4
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 144.45429716569112 -41.3335100719562 609.4
+ vertex 137.82502310785486 -29.851270586485448 617.4
+ vertex 144.613215788289 -41.6087652005646 609.814213562373
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 144.613215788289 -41.6087652005646 609.814213562373
+ vertex 137.82502310785486 -29.851270586485448 617.4
+ vertex 144.8203225694756 -41.96748466817175 610.1320508075687
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 144.8203225694756 -41.96748466817175 610.1320508075687
+ vertex 137.82502310785486 -29.851270586485448 617.4
+ vertex 145.06150352437305 -42.38522233587218 610.331851652578
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 145.06150352437305 -42.38522233587218 610.331851652578
+ vertex 137.82502310785486 -29.851270586485448 617.4
+ vertex 145.32032256947556 -42.833510071956184 610.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 145.32032256947556 -42.833510071956184 610.3999999999999
+ vertex 137.82502310785486 -29.851270586485448 617.4
+ vertex 157.72032256947554 -64.31094008581026 610.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 165.4703225694756 -77.73433384446909 597.4
+ vertex 158.42742935066212 -65.53568495720187 604.9857864376269
+ vertex 165.4703225694756 -77.73433384446909 617.4
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 158.42742935066212 -65.53568495720187 604.9857864376269
+ vertex 165.4703225694756 -77.73433384446909 597.4
+ vertex 158.22032256947554 -65.17696548959472 604.6679491924311
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 158.22032256947554 -65.17696548959472 604.6679491924311
+ vertex 165.4703225694756 -77.73433384446909 597.4
+ vertex 157.97914161457808 -64.7592278218943 604.4681483474218
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 157.97914161457808 -64.7592278218943 604.4681483474218
+ vertex 165.4703225694756 -77.73433384446909 597.4
+ vertex 157.72032256947554 -64.31094008581026 604.4
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 157.72032256947554 -64.31094008581026 604.4
+ vertex 165.4703225694756 -77.73433384446909 597.4
+ vertex 145.32032256947556 -42.833510071956184 604.4
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 165.4703225694756 -77.73433384446909 617.4
+ vertex 158.42742935066212 -65.53568495720187 604.9857864376269
+ vertex 158.58634797326002 -65.81094008581026 605.4
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 165.4703225694756 -77.73433384446909 617.4
+ vertex 158.58634797326002 -65.81094008581026 605.4
+ vertex 158.68624839576464 -65.98397269328589 605.8823619097949
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 165.4703225694756 -77.73433384446909 617.4
+ vertex 158.68624839576464 -65.98397269328589 605.8823619097949
+ vertex 158.72032256947557 -66.04299089337914 606.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 165.4703225694756 -77.73433384446909 617.4
+ vertex 158.72032256947557 -66.04299089337914 606.3999999999999
+ vertex 158.72032256947557 -66.04299089337914 608.4
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 165.4703225694756 -77.73433384446909 617.4
+ vertex 158.72032256947557 -66.04299089337914 608.4
+ vertex 158.68624839576464 -65.98397269328589 608.9176380902051
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 165.4703225694756 -77.73433384446909 617.4
+ vertex 158.68624839576464 -65.98397269328589 608.9176380902051
+ vertex 158.58634797326002 -65.81094008581026 609.4
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 165.4703225694756 -77.73433384446909 617.4
+ vertex 158.58634797326002 -65.81094008581026 609.4
+ vertex 158.42742935066212 -65.53568495720187 609.814213562373
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 165.4703225694756 -77.73433384446909 617.4
+ vertex 158.42742935066212 -65.53568495720187 609.814213562373
+ vertex 158.22032256947557 -65.17696548959472 610.1320508075687
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 165.4703225694756 -77.73433384446909 617.4
+ vertex 158.22032256947557 -65.17696548959472 610.1320508075687
+ vertex 157.97914161457808 -64.7592278218943 610.331851652578
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 165.4703225694756 -77.73433384446909 617.4
+ vertex 157.97914161457808 -64.7592278218943 610.331851652578
+ vertex 157.72032256947554 -64.31094008581026 610.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844385 0.5000000000000003 -3.0479839899610575e-16
+ outer loop
+ vertex 165.4703225694756 -77.73433384446909 617.4
+ vertex 157.72032256947554 -64.31094008581026 610.3999999999999
+ vertex 137.82502310785486 -29.851270586485448 617.4
+ endloop
+endfacet
+facet normal 0.14720786925724988 -0.9891055773923938 2.5825137241488983e-17
+ outer loop
+ vertex 154.83214687982968 -123.66723255536577 617.4
+ vertex 153.23820152839707 -123.90445829168756 597.4
+ vertex 154.83214687982968 -123.66723255536577 597.4
+ endloop
+endfacet
+facet normal 0.14720786925724988 -0.9891055773923938 2.5825137241488983e-17
+ outer loop
+ vertex 153.23820152839707 -123.90445829168756 597.4
+ vertex 154.83214687982968 -123.66723255536577 617.4
+ vertex 153.23820152839707 -123.90445829168756 617.4
+ endloop
+endfacet
+facet normal 0.6999089239761678 -0.7142321038279666 -1.6550166174886706e-16
+ outer loop
+ vertex 175.89783222505156 -112.6351991757552 597.4
+ vertex 174.7468459524417 -113.76310361922131 617.4
+ vertex 174.7468459524417 -113.76310361922131 597.4
+ endloop
+endfacet
+facet normal 0.6999089239761678 -0.7142321038279666 -1.6550166174886706e-16
+ outer loop
+ vertex 174.7468459524417 -113.76310361922131 617.4
+ vertex 175.89783222505156 -112.6351991757552 597.4
+ vertex 175.89783222505156 -112.6351991757552 617.4
+ endloop
+endfacet
+facet normal 0.2698621119172097 -0.9628989773343741 -1.4118899179752732e-17
+ outer loop
+ vertex 159.5350332499214 -122.55906210334592 597.4
+ vertex 157.98331987988098 -122.9939453641928 617.4
+ vertex 157.98331987988098 -122.9939453641928 597.4
+ endloop
+endfacet
+facet normal 0.2698621119172097 -0.9628989773343741 -1.4118899179752732e-17
+ outer loop
+ vertex 157.98331987988098 -122.9939453641928 617.4
+ vertex 159.5350332499214 -122.55906210334592 597.4
+ vertex 159.5350332499214 -122.55906210334592 617.4
+ endloop
+endfacet
+facet normal 0.3098971353857553 -0.9507700907578567 -2.7415246024207406e-17
+ outer loop
+ vertex 161.06720089823253 -122.05966233282531 597.4
+ vertex 159.5350332499214 -122.55906210334592 617.4
+ vertex 159.5350332499214 -122.55906210334592 597.4
+ endloop
+endfacet
+facet normal 0.3098971353857553 -0.9507700907578567 -2.7415246024207406e-17
+ outer loop
+ vertex 159.5350332499214 -122.55906210334592 617.4
+ vertex 161.06720089823253 -122.05966233282531 597.4
+ vertex 161.06720089823253 -122.05966233282531 617.4
+ endloop
+endfacet
+facet normal 0.571169500434386 -0.8208321398273426 -1.1785908513505626e-16
+ outer loop
+ vertex 171.0253534737069 -116.84460904537998 597.4
+ vertex 169.70258105841677 -117.76504968478841 617.4
+ vertex 169.70258105841677 -117.76504968478841 597.4
+ endloop
+endfacet
+facet normal 0.571169500434386 -0.8208321398273426 -1.1785908513505626e-16
+ outer loop
+ vertex 169.70258105841677 -117.76504968478841 617.4
+ vertex 171.0253534737069 -116.84460904537998 597.4
+ vertex 171.0253534737069 -116.84460904537998 617.4
+ endloop
+endfacet
+facet normal 0.8329651413758264 -0.5533254677427648 -2.1840864678576697e-16
+ outer loop
+ vertex 180.8928137939151 -106.33070376458777 597.4
+ vertex 180.00112884410115 -107.67302853289175 617.4
+ vertex 180.00112884410115 -107.67302853289175 597.4
+ endloop
+endfacet
+facet normal 0.8329651413758264 -0.5533254677427648 -2.1840864678576697e-16
+ outer loop
+ vertex 180.00112884410115 -107.67302853289175 617.4
+ vertex 180.8928137939151 -106.33070376458777 597.4
+ vertex 180.8928137939151 -106.33070376458777 617.4
+ endloop
+endfacet
+facet normal 0.6049992586789495 -0.7962260338609393 -1.3013227922530806e-16
+ outer loop
+ vertex 172.30847310660613 -115.8696516919559 597.4
+ vertex 171.0253534737069 -116.84460904537998 617.4
+ vertex 171.0253534737069 -116.84460904537998 597.4
+ endloop
+endfacet
+facet normal 0.6049992586789495 -0.7962260338609393 -1.3013227922530806e-16
+ outer loop
+ vertex 171.0253534737069 -116.84460904537998 617.4
+ vertex 172.30847310660613 -115.8696516919559 597.4
+ vertex 172.30847310660613 -115.8696516919559 617.4
+ endloop
+endfacet
+facet normal 0.6377703208595341 -0.7702266016119718 -1.4217775314923108e-16
+ outer loop
+ vertex 173.5496946093963 -114.84188371505724 597.4
+ vertex 172.30847310660613 -115.8696516919559 617.4
+ vertex 172.30847310660613 -115.8696516919559 597.4
+ endloop
+endfacet
+facet normal 0.6377703208595341 -0.7702266016119718 -1.4217775314923108e-16
+ outer loop
+ vertex 172.30847310660613 -115.8696516919559 617.4
+ vertex 173.5496946093963 -114.84188371505724 597.4
+ vertex 173.5496946093963 -114.84188371505724 617.4
+ endloop
+endfacet
+facet normal 0.5005724413202272 -0.8656946522826092 -9.271580545042547e-17
+ outer loop
+ vertex 168.34247059737297 -118.62936291914635 597.4
+ vertex 166.94740216554413 -119.43603627549433 617.4
+ vertex 166.94740216554413 -119.43603627549433 597.4
+ endloop
+endfacet
+facet normal 0.5005724413202272 -0.8656946522826092 -9.271580545042547e-17
+ outer loop
+ vertex 166.94740216554413 -119.43603627549433 617.4
+ vertex 168.34247059737297 -118.62936291914635 597.4
+ vertex 168.34247059737297 -118.62936291914635 617.4
+ endloop
+endfacet
+facet normal 0.10571189404139092 -0.9943967998028664 3.908047838012932e-17
+ outer loop
+ vertex 153.23820152839707 -123.90445829168756 617.4
+ vertex 151.63572936288375 -124.07481319206396 597.4
+ vertex 153.23820152839707 -123.90445829168756 597.4
+ endloop
+endfacet
+facet normal 0.10571189404139092 -0.9943967998028664 3.908047838012932e-17
+ outer loop
+ vertex 151.63572936288375 -124.07481319206396 597.4
+ vertex 153.23820152839707 -123.90445829168756 617.4
+ vertex 151.63572936288375 -124.07481319206396 617.4
+ endloop
+endfacet
+facet normal 0.18844624350994654 -0.9820835062798836 1.2524604359616437e-17
+ outer loop
+ vertex 156.4147761514999 -123.36355110749699 617.4
+ vertex 154.83214687982968 -123.66723255536577 597.4
+ vertex 156.4147761514999 -123.36355110749699 597.4
+ endloop
+endfacet
+facet normal 0.18844624350994654 -0.9820835062798836 1.2524604359616437e-17
+ outer loop
+ vertex 154.83214687982968 -123.66723255536577 597.4
+ vertex 156.4147761514999 -123.36355110749699 617.4
+ vertex 154.83214687982968 -123.66723255536577 617.4
+ endloop
+endfacet
+facet normal 0.8553779590758183 -0.518004389100409 -2.279145463383572e-16
+ outer loop
+ vertex 181.72757876430893 -104.95226070173368 597.4
+ vertex 180.8928137939151 -106.33070376458777 617.4
+ vertex 180.8928137939151 -106.33070376458777 597.4
+ endloop
+endfacet
+facet normal 0.8553779590758183 -0.518004389100409 -2.279145463383572e-16
+ outer loop
+ vertex 180.8928137939151 -106.33070376458777 617.4
+ vertex 181.72757876430893 -104.95226070173368 597.4
+ vertex 181.72757876430893 -104.95226070173368 617.4
+ endloop
+endfacet
+facet normal -0.9783396194476177 -0.20700625357483948 3.184631229828644e-16
+ outer loop
+ vertex 182.95785573205208 -77.61182351337034 617.4
+ vertex 183.26546823547173 -79.06564190936429 597.4
+ vertex 183.26546823547173 -79.06564190936429 617.4
+ endloop
+endfacet
+facet normal -0.9783396194476177 -0.20700625357483948 3.184631229828644e-16
+ outer loop
+ vertex 183.26546823547173 -79.06564190936429 597.4
+ vertex 182.95785573205208 -77.61182351337034 617.4
+ vertex 182.95785573205208 -77.61182351337034 597.4
+ endloop
+endfacet
+facet normal 0.9999473364568807 -0.010262763409046471 -3.0946219034443566e-16
+ outer loop
+ vertex 153.02753457015436 -104.48202726980841 597.4
+ vertex 152.85873887103978 -120.92855370792294 617.4
+ vertex 152.85873887103978 -120.92855370792294 597.4
+ endloop
+endfacet
+facet normal 0.9999473364568807 -0.010262763409046471 -3.0946219034443566e-16
+ outer loop
+ vertex 152.85873887103978 -120.92855370792294 617.4
+ vertex 153.02753457015436 -104.48202726980841 597.4
+ vertex 153.02753457015436 -104.48202726980841 617.4
+ endloop
+endfacet
+facet normal -0.6377703208595134 0.7702266016119889 1.4217775314922344e-16
+ outer loop
+ vertex 170.69963869919482 -113.30770840086846 617.3999999999999
+ vertex 170.44391083996473 -113.51945860333166 597.4
+ vertex 170.44391083996473 -113.51945860333166 617.4
+ endloop
+endfacet
+facet normal -0.6377703208595134 0.7702266016119889 1.4217775314922344e-16
+ outer loop
+ vertex 170.44391083996473 -113.51945860333166 597.4
+ vertex 170.69963869919482 -113.30770840086846 617.3999999999999
+ vertex 170.69963869919482 -113.30770840086846 597.4
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 -2.3251894735637803e-16
+ outer loop
+ vertex 166.70536792090212 -105.80546266909828 597.4
+ vertex 165.70536792090212 -107.53751347666717 617.4
+ vertex 165.70536792090212 -107.53751347666717 597.4
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 -2.3251894735637803e-16
+ outer loop
+ vertex 165.70536792090212 -107.53751347666717 617.4
+ vertex 166.70536792090212 -105.80546266909828 597.4
+ vertex 166.70536792090212 -105.80546266909828 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 2.3251894735637803e-16
+ outer loop
+ vertex 162.15253457015436 -103.17688310846856 617.4
+ vertex 161.15253457015436 -104.90893391603744 597.4
+ vertex 161.15253457015436 -104.90893391603744 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 2.3251894735637803e-16
+ outer loop
+ vertex 161.15253457015436 -104.90893391603744 597.4
+ vertex 162.15253457015436 -103.17688310846856 617.4
+ vertex 162.15253457015436 -103.17688310846856 597.4
+ endloop
+endfacet
+facet normal -0.30989713538576374 0.9507700907578538 2.7415246024210228e-17
+ outer loop
+ vertex 160.0780540076148 -119.22742144815797 617.4
+ vertex 158.66520409248508 -119.68793040367183 597.4
+ vertex 158.66520409248508 -119.68793040367183 617.4
+ endloop
+endfacet
+facet normal -0.30989713538576374 0.9507700907578538 2.7415246024210228e-17
+ outer loop
+ vertex 158.66520409248508 -119.68793040367183 597.4
+ vertex 160.0780540076148 -119.22742144815797 617.4
+ vertex 160.0780540076148 -119.22742144815797 597.4
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 2.1770599857004404e-16
+ outer loop
+ vertex 182.58046225985305 -93.60899269908619 617.4
+ vertex 175.9553679209021 -89.7839926990862 597.4
+ vertex 182.58046225985305 -93.60899269908619 597.4
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 2.1770599857004404e-16
+ outer loop
+ vertex 175.9553679209021 -89.7839926990862 597.4
+ vertex 182.58046225985305 -93.60899269908619 617.4
+ vertex 175.9553679209021 -89.7839926990862 617.4
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 -2.3251894735637803e-16
+ outer loop
+ vertex 164.82694148227208 -83.35899269908619 597.4
+ vertex 154.57694148227208 -101.11251347666716 617.4
+ vertex 154.57694148227208 -101.11251347666716 597.4
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 -2.3251894735637803e-16
+ outer loop
+ vertex 154.57694148227208 -101.11251347666716 617.4
+ vertex 164.82694148227208 -83.35899269908619 597.4
+ vertex 164.82694148227208 -83.35899269908619 617.4
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 2.1770599857004406e-16
+ outer loop
+ vertex 170.69963869919482 -113.30770840086846 617.3999999999999
+ vertex 155.41311056879687 -104.48202726980841 597.4
+ vertex 170.69963869919482 -113.30770840086846 597.4
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 2.1770599857004406e-16
+ outer loop
+ vertex 155.41311056879687 -104.48202726980841 597.4
+ vertex 170.69963869919482 -113.30770840086846 617.3999999999999
+ vertex 155.41311056879687 -104.48202726980841 617.4
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 2.1770599857004404e-16
+ outer loop
+ vertex 171.40253457015436 -87.15541313845647 617.4
+ vertex 164.82694148227208 -83.35899269908619 597.4
+ vertex 171.40253457015436 -87.15541313845647 597.4
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 2.1770599857004404e-16
+ outer loop
+ vertex 164.82694148227208 -83.35899269908619 597.4
+ vertex 171.40253457015436 -87.15541313845647 617.4
+ vertex 164.82694148227208 -83.35899269908619 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 2.3251894735637803e-16
+ outer loop
+ vertex 182.58046225985305 -93.60899269908619 617.4
+ vertex 172.33046225985308 -111.36251347666716 597.4
+ vertex 172.33046225985308 -111.36251347666716 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 2.3251894735637803e-16
+ outer loop
+ vertex 172.33046225985308 -111.36251347666716 597.4
+ vertex 182.58046225985305 -93.60899269908619 617.4
+ vertex 182.58046225985305 -93.60899269908619 597.4
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 -2.1770599857004404e-16
+ outer loop
+ vertex 165.70536792090212 -107.53751347666717 617.4
+ vertex 172.33046225985308 -111.36251347666716 597.4
+ vertex 165.70536792090212 -107.53751347666717 597.4
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 -2.1770599857004404e-16
+ outer loop
+ vertex 172.33046225985308 -111.36251347666716 597.4
+ vertex 165.70536792090212 -107.53751347666717 617.4
+ vertex 172.33046225985308 -111.36251347666716 617.4
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 -2.1770599857004404e-16
+ outer loop
+ vertex 154.57694148227208 -101.11251347666716 617.4
+ vertex 161.15253457015436 -104.90893391603744 597.4
+ vertex 154.57694148227208 -101.11251347666716 597.4
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 -2.1770599857004404e-16
+ outer loop
+ vertex 161.15253457015436 -104.90893391603744 597.4
+ vertex 154.57694148227208 -101.11251347666716 617.4
+ vertex 161.15253457015436 -104.90893391603744 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 2.3251894735637803e-16
+ outer loop
+ vertex 171.40253457015436 -87.15541313845647 617.4
+ vertex 170.40253457015436 -88.88746394602533 597.4
+ vertex 170.40253457015436 -88.88746394602533 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 2.3251894735637803e-16
+ outer loop
+ vertex 170.40253457015436 -88.88746394602533 597.4
+ vertex 171.40253457015436 -87.15541313845647 617.4
+ vertex 171.40253457015436 -87.15541313845647 597.4
+ endloop
+endfacet
+facet normal -1.5543122344752188e-15 -1.0 7.22794516397282e-17
+ outer loop
+ vertex 155.41311056879687 -104.48202726980841 617.4
+ vertex 153.02753457015436 -104.48202726980841 597.4
+ vertex 155.41311056879687 -104.48202726980841 597.4
+ endloop
+endfacet
+facet normal -1.5543122344752188e-15 -1.0 7.22794516397282e-17
+ outer loop
+ vertex 153.02753457015436 -104.48202726980841 597.4
+ vertex 155.41311056879687 -104.48202726980841 617.4
+ vertex 153.02753457015436 -104.48202726980841 617.4
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 -2.3251894735637803e-16
+ outer loop
+ vertex 175.9553679209021 -89.7839926990862 597.4
+ vertex 174.9553679209021 -91.51604350665507 617.4
+ vertex 174.9553679209021 -91.51604350665507 597.4
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 -2.3251894735637803e-16
+ outer loop
+ vertex 174.9553679209021 -91.51604350665507 617.4
+ vertex 175.9553679209021 -89.7839926990862 597.4
+ vertex 175.9553679209021 -89.7839926990862 617.4
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 -2.1770599857004409e-16
+ outer loop
+ vertex 162.15253457015436 -103.17688310846856 617.4
+ vertex 166.70536792090212 -105.80546266909828 597.4
+ vertex 162.15253457015436 -103.17688310846856 597.4
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 -2.1770599857004409e-16
+ outer loop
+ vertex 166.70536792090212 -105.80546266909828 597.4
+ vertex 162.15253457015436 -103.17688310846856 617.4
+ vertex 166.70536792090212 -105.80546266909828 617.4
+ endloop
+endfacet
+facet normal -0.6049992586789347 0.7962260338609506 1.301322792253026e-16
+ outer loop
+ vertex 170.44391083996473 -113.51945860333166 617.4
+ vertex 169.26071429718348 -114.41849103986607 597.4
+ vertex 169.26071429718348 -114.41849103986607 617.4
+ endloop
+endfacet
+facet normal -0.6049992586789347 0.7962260338609506 1.301322792253026e-16
+ outer loop
+ vertex 169.26071429718348 -114.41849103986607 597.4
+ vertex 170.44391083996473 -113.51945860333166 617.4
+ vertex 170.44391083996473 -113.51945860333166 597.4
+ endloop
+endfacet
+facet normal -0.46392867916165254 0.8858725532780236 7.98897184078563e-17
+ outer loop
+ vertex 165.5003339197542 -116.80811057410426 617.4
+ vertex 164.18392212485125 -117.4975113044715 597.4
+ vertex 164.18392212485125 -117.4975113044715 617.4
+ endloop
+endfacet
+facet normal -0.46392867916165254 0.8858725532780236 7.98897184078563e-17
+ outer loop
+ vertex 164.18392212485125 -117.4975113044715 597.4
+ vertex 165.5003339197542 -116.80811057410426 617.4
+ vertex 165.5003339197542 -116.80811057410426 597.4
+ endloop
+endfacet
+facet normal -0.18844624350994066 0.9820835062798847 -1.2524604359618403e-17
+ outer loop
+ vertex 154.3285555435008 -120.70980195331025 617.4
+ vertex 155.7879373772224 -120.42976973338911 597.4
+ vertex 154.3285555435008 -120.70980195331025 597.4
+ endloop
+endfacet
+facet normal -0.18844624350994066 0.9820835062798847 -1.2524604359618403e-17
+ outer loop
+ vertex 155.7879373772224 -120.42976973338911 597.4
+ vertex 154.3285555435008 -120.70980195331025 617.4
+ vertex 155.7879373772224 -120.42976973338911 617.4
+ endloop
+endfacet
+facet normal -0.96882603160823 -0.24774204422796148 3.184561753812836e-16
+ outer loop
+ vertex 182.58970960549215 -76.17214236454276 617.4
+ vertex 182.95785573205208 -77.61182351337034 597.4
+ vertex 182.95785573205208 -77.61182351337034 617.4
+ endloop
+endfacet
+facet normal -0.96882603160823 -0.24774204422796148 3.184561753812836e-16
+ outer loop
+ vertex 182.95785573205208 -77.61182351337034 597.4
+ vertex 182.58970960549215 -76.17214236454276 617.4
+ vertex 182.58970960549215 -76.17214236454276 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 166.70536792090212 -105.80546266909828 597.4
+ vertex 161.15253457015436 -104.90893391603744 597.4
+ vertex 162.15253457015436 -103.17688310846856 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 154.57694148227208 -101.11251347666716 597.4
+ vertex 155.41311056879687 -104.48202726980841 597.4
+ vertex 153.02753457015436 -104.48202726980841 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 155.41311056879687 -104.48202726980841 597.4
+ vertex 154.57694148227208 -101.11251347666716 597.4
+ vertex 161.15253457015436 -104.90893391603744 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 155.41311056879687 -104.48202726980841 597.4
+ vertex 161.15253457015436 -104.90893391603744 597.4
+ vertex 170.69963869919482 -113.30770840086846 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 170.69963869919482 -113.30770840086846 597.4
+ vertex 161.15253457015436 -104.90893391603744 597.4
+ vertex 165.70536792090212 -107.53751347666717 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 165.70536792090212 -107.53751347666717 597.4
+ vertex 161.15253457015436 -104.90893391603744 597.4
+ vertex 166.70536792090212 -105.80546266909828 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 170.69963869919482 -113.30770840086846 597.4
+ vertex 165.70536792090212 -107.53751347666717 597.4
+ vertex 172.33046225985308 -111.36251347666716 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 93.58223510853361 -102.48202726980837 597.4
+ vertex 94.73693564691285 -100.48202726980837 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 93.58223510853361 -102.48202726980837 597.4
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 93.36206755126861 -102.99966536001341 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 93.36206755126861 -102.99966536001341 597.4
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 93.31428591610249 -103.48202726980837 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 93.31428591610249 -103.48202726980837 597.4
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 93.44214644250893 -103.89624083218146 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 93.44214644250893 -103.89624083218146 597.4
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 93.73693564691287 -104.21407807737724 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 93.73693564691287 -104.21407807737724 597.4
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 94.17856413219633 -104.41387892238649 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 94.17856413219633 -104.41387892238649 597.4
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 94.73693564691287 -104.48202726980836 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 94.73693564691287 -104.48202726980836 597.4
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 150.02753457015436 -104.48202726980841 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 150.02753457015436 -104.48202726980841 597.4
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 124.4505819046373 -100.42011377814158 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 124.4505819046373 -100.42011377814158 597.4
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 123.76440978664102 -100.23625451325573 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 123.76440978664102 -100.23625451325573 597.4
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 123.12058899123211 -99.93603594587711 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 123.12058899123211 -99.93603594587711 597.4
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 122.53868168748998 -99.52858006525759 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 122.53868168748998 -99.52858006525759 597.4
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 122.0363688343796 -99.02626721214719 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 122.0363688343796 -99.02626721214719 597.4
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 121.62891295376006 -98.44435990840508 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 121.62891295376006 -98.44435990840508 597.4
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 121.32869438638144 -97.80053911299616 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 121.32869438638144 -97.80053911299616 597.4
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 121.14483512149562 -97.11436699499988 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 121.14483512149562 -97.11436699499988 597.4
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 121.07305832758567 -96.49857203241156 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 121.07305832758567 -96.49857203241156 597.4
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 121.13921260616524 -95.74242516819555 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 121.13921260616524 -95.74242516819555 597.4
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 121.14483512149562 -95.69901809900362 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 121.14483512149562 -95.69901809900362 597.4
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 121.335665377625 -95.00925344381999 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 121.335665377625 -95.00925344381999 597.4
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 121.62891295376008 -94.36902518559845 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 121.62891295376008 -94.36902518559845 597.4
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 142.51289504782767 -58.19690713431473 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 121.07305832758567 -96.49857203241156 597.4
+ vertex 121.13921260616524 -95.74242516819555 597.4
+ vertex 121.08292162982879 -96.40669254700175 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 150.02753457015436 -104.48202726980841 597.4
+ vertex 124.4505819046373 -100.42011377814158 597.4
+ vertex 125.15825635263542 -100.4820272698084 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 150.02753457015436 -104.48202726980841 597.4
+ vertex 125.15825635263542 -100.4820272698084 597.4
+ vertex 150.55309081768115 -100.48202726980841 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 150.02753457015436 -104.48202726980841 597.4
+ vertex 150.55309081768115 -100.48202726980841 597.4
+ vertex 165.4703225694756 -77.73433384446909 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 150.02753457015436 -104.48202726980841 597.4
+ vertex 165.4703225694756 -77.73433384446909 597.4
+ vertex 164.82694148227208 -83.35899269908619 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 164.82694148227208 -83.35899269908619 597.4
+ vertex 165.4703225694756 -77.73433384446909 597.4
+ vertex 166.9703225694756 -80.3324100558224 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 166.9703225694756 -80.3324100558224 597.4
+ vertex 165.4703225694756 -77.73433384446909 597.4
+ vertex 179.92468545251552 -69.38910354298147 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 166.9703225694756 -80.3324100558224 597.4
+ vertex 179.92468545251552 -69.38910354298147 597.4
+ vertex 181.12903441933793 -71.96296547328228 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 181.12903441933793 -71.96296547328228 597.4
+ vertex 179.92468545251552 -69.38910354298147 597.4
+ vertex 182.52753457015436 -67.8863479042527 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 181.12903441933793 -71.96296547328228 597.4
+ vertex 182.52753457015436 -67.8863479042527 597.4
+ vertex 183.24227030542377 -69.33067842807887 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 181.12903441933793 -71.96296547328228 597.4
+ vertex 183.24227030542377 -69.33067842807887 597.4
+ vertex 181.6744981789514 -73.3452399278458 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 181.6744981789514 -73.3452399278458 597.4
+ vertex 183.24227030542377 -69.33067842807887 597.4
+ vertex 183.8959747167953 -70.80363748245902 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 181.6744981789514 -73.3452399278458 597.4
+ vertex 183.8959747167953 -70.80363748245902 597.4
+ vertex 182.16167407948237 -74.74911777963077 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 182.16167407948237 -74.74911777963077 597.4
+ vertex 183.8959747167953 -70.80363748245902 597.4
+ vertex 184.48750387842549 -72.30264751720468 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 182.16167407948237 -74.74911777963077 597.4
+ vertex 184.48750387842549 -72.30264751720468 597.4
+ vertex 182.58970960549215 -76.17214236454276 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 182.58970960549215 -76.17214236454276 597.4
+ vertex 184.48750387842549 -72.30264751720468 597.4
+ vertex 185.01582266574817 -73.82508539517835 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 182.58970960549215 -76.17214236454276 597.4
+ vertex 185.01582266574817 -73.82508539517835 597.4
+ vertex 182.95785573205208 -77.61182351337034 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 182.95785573205208 -77.61182351337034 597.4
+ vertex 185.01582266574817 -73.82508539517835 597.4
+ vertex 185.48000656685264 -75.3682869825552 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 182.95785573205208 -77.61182351337034 597.4
+ vertex 185.48000656685264 -75.3682869825552 597.4
+ vertex 183.26546823547173 -79.06564190936429 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 183.26546823547173 -79.06564190936429 597.4
+ vertex 185.48000656685264 -75.3682869825552 597.4
+ vertex 183.51200882063426 -80.53105349682296 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 183.51200882063426 -80.53105349682296 597.4
+ vertex 185.48000656685264 -75.3682869825552 597.4
+ vertex 185.87924330029887 -76.92955181082564 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 183.51200882063426 -80.53105349682296 597.4
+ vertex 185.87924330029887 -76.92955181082564 597.4
+ vertex 183.6970460629663 -82.00549393296838 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 183.6970460629663 -82.00549393296838 597.4
+ vertex 185.87924330029887 -76.92955181082564 597.4
+ vertex 186.21283423653944 -78.50614780237997 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 183.6970460629663 -82.00549393296838 597.4
+ vertex 186.21283423653944 -78.50614780237997 597.4
+ vertex 183.8202561633931 -83.48638307532285 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 183.8202561633931 -83.48638307532285 597.4
+ vertex 186.21283423653944 -78.50614780237997 597.4
+ vertex 186.48019562046042 -80.0953160514068 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 183.8202561633931 -83.48638307532285 597.4
+ vertex 186.48019562046042 -80.0953160514068 597.4
+ vertex 183.881423514959 -84.97112949673391 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 183.881423514959 -84.97112949673391 597.4
+ vertex 186.48019562046042 -80.0953160514068 597.4
+ vertex 186.6808595929021 -81.69427565173788 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 183.881423514959 -84.97112949673391 597.4
+ vertex 186.6808595929021 -81.69427565173788 597.4
+ vertex 183.8804410801207 -86.45713502014634 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 183.8804410801207 -86.45713502014634 597.4
+ vertex 186.6808595929021 -81.69427565173788 597.4
+ vertex 183.81731057805365 -87.94179926518606 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 183.81731057805365 -87.94179926518606 597.4
+ vertex 186.6808595929021 -81.69427565173788 597.4
+ vertex 186.8144750093717 -83.30022856319225 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 183.81731057805365 -87.94179926518606 597.4
+ vertex 186.8144750093717 -83.30022856319225 597.4
+ vertex 183.6921424816438 -89.42252419859929 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 183.6921424816438 -89.42252419859929 597.4
+ vertex 186.8144750093717 -83.30022856319225 597.4
+ vertex 186.8808080545158 -84.91036450790281 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 183.6921424816438 -89.42252419859929 597.4
+ vertex 186.8808080545158 -84.91036450790281 597.4
+ vertex 183.5051558241694 -90.896718680585 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 183.5051558241694 -90.896718680585 597.4
+ vertex 186.8808080545158 -84.91036450790281 597.4
+ vertex 186.87974265127679 -86.52186588805827 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 183.5051558241694 -90.896718680585 597.4
+ vertex 186.87974265127679 -86.52186588805827 597.4
+ vertex 183.4496386991948 -91.22406060436529 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 183.4496386991948 -91.22406060436529 597.4
+ vertex 186.87974265127679 -86.52186588805827 597.4
+ vertex 182.58046225985305 -93.60899269908619 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 182.58046225985305 -93.60899269908619 597.4
+ vertex 186.87974265127679 -86.52186588805827 597.4
+ vertex 172.33046225985308 -111.36251347666716 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 172.33046225985308 -111.36251347666716 597.4
+ vertex 186.87974265127679 -86.52186588805827 597.4
+ vertex 168.34247059737297 -118.62936291914635 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 168.34247059737297 -118.62936291914635 597.4
+ vertex 186.87974265127679 -86.52186588805827 597.4
+ vertex 169.70258105841677 -117.76504968478841 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 169.70258105841677 -117.76504968478841 597.4
+ vertex 186.87974265127679 -86.52186588805827 597.4
+ vertex 186.81128066401763 -88.13191271645415 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 169.70258105841677 -117.76504968478841 597.4
+ vertex 186.81128066401763 -88.13191271645415 597.4
+ vertex 171.0253534737069 -116.84460904537998 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 171.0253534737069 -116.84460904537998 597.4
+ vertex 186.81128066401763 -88.13191271645415 597.4
+ vertex 186.67554189525939 -89.73768755122492 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 171.0253534737069 -116.84460904537998 597.4
+ vertex 186.67554189525939 -89.73768755122492 597.4
+ vertex 186.4727638760373 -91.33638042612223 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 171.0253534737069 -116.84460904537998 597.4
+ vertex 186.4727638760373 -91.33638042612223 597.4
+ vertex 172.30847310660613 -115.8696516919559 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 172.30847310660613 -115.8696516919559 597.4
+ vertex 186.4727638760373 -91.33638042612223 597.4
+ vertex 173.5496946093963 -114.84188371505724 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 173.5496946093963 -114.84188371505724 597.4
+ vertex 186.4727638760373 -91.33638042612223 597.4
+ vertex 186.20330145024204 -92.92519376771138 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 173.5496946093963 -114.84188371505724 597.4
+ vertex 186.20330145024204 -92.92519376771138 597.4
+ vertex 174.7468459524417 -113.76310361922131 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 174.7468459524417 -113.76310361922131 597.4
+ vertex 186.20330145024204 -92.92519376771138 597.4
+ vertex 185.86762615367383 -94.50134729088126 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 174.7468459524417 -113.76310361922131 597.4
+ vertex 185.86762615367383 -94.50134729088126 597.4
+ vertex 185.4663253888957 -96.06208286410167 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 174.7468459524417 -113.76310361922131 597.4
+ vertex 185.4663253888957 -96.06208286410167 597.4
+ vertex 175.89783222505156 -112.6351991757552 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 175.89783222505156 -112.6351991757552 597.4
+ vertex 185.4663253888957 -96.06208286410167 597.4
+ vertex 185.0001013973305 -97.60466933591321 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 175.89783222505156 -112.6351991757552 597.4
+ vertex 185.0001013973305 -97.60466933591321 597.4
+ vertex 177.000639301392 -111.46014411930012 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 177.000639301392 -111.46014411930012 597.4
+ vertex 185.0001013973305 -97.60466933591321 597.4
+ vertex 184.4697700303989 -99.12640731420498 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 177.000639301392 -111.46014411930012 597.4
+ vertex 184.4697700303989 -99.12640731420498 597.4
+ vertex 178.05333736503042 -110.23999469396776 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 178.05333736503042 -110.23999469396776 597.4
+ vertex 184.4697700303989 -99.12640731420498 597.4
+ vertex 183.87625932185094 -100.62463388991574 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 178.05333736503042 -110.23999469396776 597.4
+ vertex 183.87625932185094 -100.62463388991574 597.4
+ vertex 179.05408428594694 -108.97688605509174 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 179.05408428594694 -108.97688605509174 597.4
+ vertex 183.87625932185094 -100.62463388991574 597.4
+ vertex 183.2206078637874 -102.0967272968931 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 179.05408428594694 -108.97688605509174 597.4
+ vertex 183.2206078637874 -102.0967272968931 597.4
+ vertex 180.00112884410115 -107.67302853289175 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 180.00112884410115 -107.67302853289175 597.4
+ vertex 183.2206078637874 -102.0967272968931 597.4
+ vertex 182.5039629892141 -103.54011149975624 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 180.00112884410115 -107.67302853289175 597.4
+ vertex 182.5039629892141 -103.54011149975624 597.4
+ vertex 180.8928137939151 -106.33070376458777 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 180.8928137939151 -106.33070376458777 597.4
+ vertex 182.5039629892141 -103.54011149975624 597.4
+ vertex 181.72757876430893 -104.95226070173368 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 150.02753457015436 -104.48202726980841 597.4
+ vertex 153.02753457015436 -104.48202726980841 597.4
+ vertex 150.02753457015436 -121.17248787278366 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 153.02753457015436 -104.48202726980841 597.4
+ vertex 150.02753457015436 -104.48202726980841 597.4
+ vertex 154.57694148227208 -101.11251347666716 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 154.57694148227208 -101.11251347666716 597.4
+ vertex 150.02753457015436 -104.48202726980841 597.4
+ vertex 164.82694148227208 -83.35899269908619 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 150.02753457015436 -121.17248787278366 597.4
+ vertex 153.02753457015436 -104.48202726980841 597.4
+ vertex 152.85873887103978 -120.92855370792294 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 150.02753457015436 -121.17248787278366 597.4
+ vertex 152.85873887103978 -120.92855370792294 597.4
+ vertex 150.02753457015433 -124.17799915024119 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 150.02753457015433 -124.17799915024119 597.4
+ vertex 152.85873887103978 -120.92855370792294 597.4
+ vertex 151.63572936288375 -124.07481319206396 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 151.63572936288375 -124.07481319206396 597.4
+ vertex 152.85873887103978 -120.92855370792294 597.4
+ vertex 154.3285555435008 -120.70980195331025 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 151.63572936288375 -124.07481319206396 597.4
+ vertex 154.3285555435008 -120.70980195331025 597.4
+ vertex 153.23820152839707 -123.90445829168756 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 153.23820152839707 -123.90445829168756 597.4
+ vertex 154.3285555435008 -120.70980195331025 597.4
+ vertex 155.7879373772224 -120.42976973338911 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 153.23820152839707 -123.90445829168756 597.4
+ vertex 155.7879373772224 -120.42976973338911 597.4
+ vertex 154.83214687982968 -123.66723255536577 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 154.83214687982968 -123.66723255536577 597.4
+ vertex 155.7879373772224 -120.42976973338911 597.4
+ vertex 157.23433058097086 -120.08894708017985 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 154.83214687982968 -123.66723255536577 597.4
+ vertex 157.23433058097086 -120.08894708017985 597.4
+ vertex 156.4147761514999 -123.36355110749699 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 156.4147761514999 -123.36355110749699 597.4
+ vertex 157.23433058097086 -120.08894708017985 597.4
+ vertex 158.66520409248508 -119.68793040367183 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 156.4147761514999 -123.36355110749699 597.4
+ vertex 158.66520409248508 -119.68793040367183 597.4
+ vertex 157.98331987988098 -122.9939453641928 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 157.98331987988098 -122.9939453641928 597.4
+ vertex 158.66520409248508 -119.68793040367183 597.4
+ vertex 160.0780540076148 -119.22742144815797 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 157.98331987988098 -122.9939453641928 597.4
+ vertex 160.0780540076148 -119.22742144815797 597.4
+ vertex 161.4704079619354 -118.70822606424326 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 157.98331987988098 -122.9939453641928 597.4
+ vertex 161.4704079619354 -118.70822606424326 597.4
+ vertex 159.5350332499214 -122.55906210334592 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 159.5350332499214 -122.55906210334592 597.4
+ vertex 161.4704079619354 -118.70822606424326 597.4
+ vertex 162.83982945717034 -118.1312527986763 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 159.5350332499214 -122.55906210334592 597.4
+ vertex 162.83982945717034 -118.1312527986763 597.4
+ vertex 161.06720089823253 -122.05966233282531 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 161.06720089823253 -122.05966233282531 597.4
+ vertex 162.83982945717034 -118.1312527986763 597.4
+ vertex 164.18392212485125 -117.4975113044715 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 161.06720089823253 -122.05966233282531 597.4
+ vertex 164.18392212485125 -117.4975113044715 597.4
+ vertex 162.5771416647378 -121.49661995877848 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 162.5771416647378 -121.49661995877848 597.4
+ vertex 164.18392212485125 -117.4975113044715 597.4
+ vertex 165.5003339197542 -116.80811057410426 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 162.5771416647378 -121.49661995877848 597.4
+ vertex 165.5003339197542 -116.80811057410426 597.4
+ vertex 164.0622132844704 -120.8709202563717 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 164.0622132844704 -120.8709202563717 597.4
+ vertex 165.5003339197542 -116.80811057410426 597.4
+ vertex 166.7867612357742 -116.06425699887052 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 164.0622132844704 -120.8709202563717 597.4
+ vertex 166.7867612357742 -116.06425699887052 597.4
+ vertex 168.04095293703554 -115.26725225780697 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 164.0622132844704 -120.8709202563717 597.4
+ vertex 168.04095293703554 -115.26725225780697 597.4
+ vertex 165.51981701130626 -120.18365814564446 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 165.51981701130626 -120.18365814564446 597.4
+ vertex 168.04095293703554 -115.26725225780697 597.4
+ vertex 169.26071429718348 -114.41849103986607 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 165.51981701130626 -120.18365814564446 597.4
+ vertex 169.26071429718348 -114.41849103986607 597.4
+ vertex 166.94740216554413 -119.43603627549433 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 166.94740216554413 -119.43603627549433 597.4
+ vertex 169.26071429718348 -114.41849103986607 597.4
+ vertex 170.44391083996473 -113.51945860333166 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 166.94740216554413 -119.43603627549433 597.4
+ vertex 170.44391083996473 -113.51945860333166 597.4
+ vertex 168.34247059737297 -118.62936291914635 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 168.34247059737297 -118.62936291914635 597.4
+ vertex 170.44391083996473 -113.51945860333166 597.4
+ vertex 170.69963869919482 -113.30770840086846 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 168.34247059737297 -118.62936291914635 597.4
+ vertex 170.69963869919482 -113.30770840086846 597.4
+ vertex 172.33046225985308 -111.36251347666716 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 164.82694148227208 -83.35899269908619 597.4
+ vertex 168.16311056879687 -82.39837947330525 597.4
+ vertex 171.40253457015436 -87.15541313845647 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 168.16311056879687 -82.39837947330525 597.4
+ vertex 164.82694148227208 -83.35899269908619 597.4
+ vertex 166.9703225694756 -80.3324100558224 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 171.40253457015436 -87.15541313845647 597.4
+ vertex 168.16311056879687 -82.39837947330525 597.4
+ vertex 183.4496386991948 -91.22406060436529 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 171.40253457015436 -87.15541313845647 597.4
+ vertex 183.4496386991948 -91.22406060436529 597.4
+ vertex 175.9553679209021 -89.7839926990862 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 171.40253457015436 -87.15541313845647 597.4
+ vertex 175.9553679209021 -89.7839926990862 597.4
+ vertex 170.40253457015436 -88.88746394602533 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 175.9553679209021 -89.7839926990862 597.4
+ vertex 183.4496386991948 -91.22406060436529 597.4
+ vertex 182.58046225985305 -93.60899269908619 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 174.9553679209021 -91.51604350665507 597.4
+ vertex 170.40253457015436 -88.88746394602533 597.4
+ vertex 175.9553679209021 -89.7839926990862 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 121.65644752391407 -94.32133391112718 597.4
+ vertex 121.62891295376008 -94.36902518559845 597.4
+ vertex 142.51289504782767 -58.19690713431473 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 135.51562203109634 -29.851270586485427 597.4
+ vertex 143.55963228918765 -47.783905050104764 597.4
+ vertex 134.3609214927171 -31.851270586485423 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 143.55963228918765 -47.783905050104764 597.4
+ vertex 135.51562203109634 -29.851270586485427 597.4
+ vertex 135.85382598854787 -29.401780843702255 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 143.55963228918765 -47.783905050104764 597.4
+ vertex 135.85382598854787 -29.401780843702255 597.4
+ vertex 136.2476728386652 -29.11921977891656 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 143.55963228918765 -47.783905050104764 597.4
+ vertex 136.2476728386652 -29.11921977891656 597.4
+ vertex 136.6703225694756 -29.02284346173925 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 143.55963228918765 -47.783905050104764 597.4
+ vertex 136.6703225694756 -29.02284346173925 597.4
+ vertex 137.09297230028596 -29.11921977891656 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 143.55963228918765 -47.783905050104764 597.4
+ vertex 137.09297230028596 -29.11921977891656 597.4
+ vertex 137.4868191504033 -29.401780843702266 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 143.55963228918765 -47.783905050104764 597.4
+ vertex 137.4868191504033 -29.401780843702266 597.4
+ vertex 137.82502310785486 -29.851270586485438 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 143.55963228918765 -47.783905050104764 597.4
+ vertex 137.82502310785486 -29.851270586485438 597.4
+ vertex 165.4703225694756 -77.73433384446909 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 143.55963228918765 -47.783905050104764 597.4
+ vertex 165.4703225694756 -77.73433384446909 597.4
+ vertex 149.16412596495886 -57.61499983057261 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 143.55963228918765 -47.783905050104764 597.4
+ vertex 149.16412596495886 -57.61499983057261 597.4
+ vertex 148.66181311184846 -57.1126869774622 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 143.55963228918765 -47.783905050104764 597.4
+ vertex 148.66181311184846 -57.1126869774622 597.4
+ vertex 148.07990580810633 -56.70523109684268 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 143.55963228918765 -47.783905050104764 597.4
+ vertex 148.07990580810633 -56.70523109684268 597.4
+ vertex 147.43608501269742 -56.40501252946406 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 143.55963228918765 -47.783905050104764 597.4
+ vertex 147.43608501269742 -56.40501252946406 597.4
+ vertex 146.74991289470117 -56.22115326457821 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 143.55963228918765 -47.783905050104764 597.4
+ vertex 146.74991289470117 -56.22115326457821 597.4
+ vertex 146.04223844670304 -56.15923977291139 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 143.55963228918765 -47.783905050104764 597.4
+ vertex 146.04223844670304 -56.15923977291139 597.4
+ vertex 145.33456399870488 -56.22115326457819 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 143.55963228918765 -47.783905050104764 597.4
+ vertex 145.33456399870488 -56.22115326457819 597.4
+ vertex 144.64839188070863 -56.40501252946406 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 143.55963228918765 -47.783905050104764 597.4
+ vertex 144.64839188070863 -56.40501252946406 597.4
+ vertex 144.00457108529972 -56.70523109684268 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 143.55963228918765 -47.783905050104764 597.4
+ vertex 144.00457108529972 -56.70523109684268 597.4
+ vertex 143.4226637815576 -57.1126869774622 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 143.55963228918765 -47.783905050104764 597.4
+ vertex 143.4226637815576 -57.1126869774622 597.4
+ vertex 142.9203509284472 -57.614999830572586 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 143.55963228918765 -47.783905050104764 597.4
+ vertex 142.9203509284472 -57.614999830572586 597.4
+ vertex 142.51289504782767 -58.19690713431473 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 143.55963228918765 -47.783905050104764 597.4
+ vertex 142.51289504782767 -58.19690713431473 597.4
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 149.16412596495886 -57.61499983057261 597.4
+ vertex 165.4703225694756 -77.73433384446909 597.4
+ vertex 149.57158184557838 -58.19690713431471 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 149.57158184557838 -58.19690713431471 597.4
+ vertex 165.4703225694756 -77.73433384446909 597.4
+ vertex 162.26899907810125 -80.18947890594492 597.4
+ endloop
+endfacet
+facet normal -3.10220314556862e-16 -7.227945163972765e-17 -1.0
+ outer loop
+ vertex 162.26899907810125 -80.18947890594492 597.4
+ vertex 165.4703225694756 -77.73433384446909 597.4
+ vertex 150.55309081768115 -100.48202726980841 597.4
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 2.1770599857004409e-16
+ outer loop
+ vertex 174.9553679209021 -91.51604350665507 617.4
+ vertex 170.40253457015436 -88.88746394602533 597.4
+ vertex 174.9553679209021 -91.51604350665507 597.4
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 2.1770599857004409e-16
+ outer loop
+ vertex 170.40253457015436 -88.88746394602533 597.4
+ vertex 174.9553679209021 -91.51604350665507 617.4
+ vertex 170.40253457015436 -88.88746394602533 617.4
+ endloop
+endfacet
+facet normal -0.5711695004344003 0.8208321398273325 1.1785908513506147e-16
+ outer loop
+ vertex 169.26071429718348 -114.41849103986607 617.4
+ vertex 168.04095293703554 -115.26725225780697 597.4
+ vertex 168.04095293703554 -115.26725225780697 617.4
+ endloop
+endfacet
+facet normal -0.5711695004344003 0.8208321398273325 1.1785908513506147e-16
+ outer loop
+ vertex 168.04095293703554 -115.26725225780697 597.4
+ vertex 169.26071429718348 -114.41849103986607 617.4
+ vertex 169.26071429718348 -114.41849103986607 597.4
+ endloop
+endfacet
+facet normal -0.9999997814571896 0.0006611244763946589 3.1017246104582315e-16
+ outer loop
+ vertex 183.881423514959 -84.97112949673391 617.4
+ vertex 183.8804410801207 -86.45713502014634 597.4
+ vertex 183.8804410801207 -86.45713502014634 617.4
+ endloop
+endfacet
+facet normal -0.9999997814571896 0.0006611244763946589 3.1017246104582315e-16
+ outer loop
+ vertex 183.8804410801207 -86.45713502014634 597.4
+ vertex 183.881423514959 -84.97112949673391 617.4
+ vertex 183.881423514959 -84.97112949673391 597.4
+ endloop
+endfacet
+facet normal -0.9965567391136532 -0.08291360399332831 3.151450949117094e-16
+ outer loop
+ vertex 183.6970460629663 -82.00549393296838 617.4
+ vertex 183.8202561633931 -83.48638307532285 597.4
+ vertex 183.8202561633931 -83.48638307532285 617.4
+ endloop
+endfacet
+facet normal -0.9965567391136532 -0.08291360399332831 3.151450949117094e-16
+ outer loop
+ vertex 183.8202561633931 -83.48638307532285 597.4
+ vertex 183.6970460629663 -82.00549393296838 617.4
+ vertex 183.6970460629663 -82.00549393296838 597.4
+ endloop
+endfacet
+facet normal 0.5088614820537074 -0.8608484141137188 -9.563751771150325e-17
+ outer loop
+ vertex 181.12903441933793 -71.96296547328228 597.4
+ vertex 166.9703225694756 -80.3324100558224 617.4
+ vertex 166.9703225694756 -80.3324100558224 597.4
+ endloop
+endfacet
+facet normal 0.5088614820537074 -0.8608484141137188 -9.563751771150325e-17
+ outer loop
+ vertex 166.9703225694756 -80.3324100558224 617.4
+ vertex 181.12903441933793 -71.96296547328228 597.4
+ vertex 181.12903441933793 -71.96296547328228 617.4
+ endloop
+endfacet
+facet normal -0.3882711944089143 0.9215451587373649 5.3840833328119297e-17
+ outer loop
+ vertex 162.83982945717034 -118.1312527986763 617.4
+ vertex 161.4704079619354 -118.70822606424326 597.4
+ vertex 161.4704079619354 -118.70822606424326 617.4
+ endloop
+endfacet
+facet normal -0.3882711944089143 0.9215451587373649 5.3840833328119297e-17
+ outer loop
+ vertex 161.4704079619354 -118.70822606424326 597.4
+ vertex 162.83982945717034 -118.1312527986763 617.4
+ vertex 162.83982945717034 -118.1312527986763 597.4
+ endloop
+endfacet
+facet normal -0.9576170825074757 -0.2880443078588266 3.178919571804744e-16
+ outer loop
+ vertex 182.58970960549215 -76.17214236454276 617.4
+ vertex 182.16167407948237 -74.74911777963077 597.4
+ vertex 182.58970960549215 -76.17214236454276 597.4
+ endloop
+endfacet
+facet normal -0.9576170825074757 -0.2880443078588266 3.178919571804744e-16
+ outer loop
+ vertex 182.16167407948237 -74.74911777963077 597.4
+ vertex 182.58970960549215 -76.17214236454276 617.4
+ vertex 182.16167407948237 -74.74911777963077 617.4
+ endloop
+endfacet
+facet normal -0.9447323868310448 -0.3278425190125848 3.167714557131983e-16
+ outer loop
+ vertex 182.16167407948237 -74.74911777963077 617.4
+ vertex 181.6744981789514 -73.3452399278458 597.4
+ vertex 182.16167407948237 -74.74911777963077 597.4
+ endloop
+endfacet
+facet normal -0.9447323868310448 -0.3278425190125848 3.167714557131983e-16
+ outer loop
+ vertex 181.6744981789514 -73.3452399278458 597.4
+ vertex 182.16167407948237 -74.74911777963077 617.4
+ vertex 181.6744981789514 -73.3452399278458 617.4
+ endloop
+endfacet
+facet normal -0.9922171154055783 -0.1245198614528357 3.1680613295388653e-16
+ outer loop
+ vertex 183.51200882063426 -80.53105349682296 617.4
+ vertex 183.6970460629663 -82.00549393296838 597.4
+ vertex 183.6970460629663 -82.00549393296838 617.4
+ endloop
+endfacet
+facet normal -0.9922171154055783 -0.1245198614528357 3.1680613295388653e-16
+ outer loop
+ vertex 183.6970460629663 -82.00549393296838 597.4
+ vertex 183.51200882063426 -80.53105349682296 617.4
+ vertex 183.51200882063426 -80.53105349682296 597.4
+ endloop
+endfacet
+facet normal -0.999097175068117 0.04248334698335731 3.0686956689872605e-16
+ outer loop
+ vertex 183.8804410801207 -86.45713502014634 617.4
+ vertex 183.81731057805365 -87.94179926518606 597.4
+ vertex 183.81731057805365 -87.94179926518606 617.4
+ endloop
+endfacet
+facet normal -0.999097175068117 0.04248334698335731 3.0686956689872605e-16
+ outer loop
+ vertex 183.81731057805365 -87.94179926518606 597.4
+ vertex 183.8804410801207 -86.45713502014634 617.4
+ vertex 183.8804410801207 -86.45713502014634 597.4
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 -2.1770599857004406e-16
+ outer loop
+ vertex 168.16311056879687 -82.39837947330525 617.4
+ vertex 183.4496386991948 -91.22406060436529 597.4
+ vertex 168.16311056879687 -82.39837947330525 597.4
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 -2.1770599857004406e-16
+ outer loop
+ vertex 183.4496386991948 -91.22406060436529 597.4
+ vertex 168.16311056879687 -82.39837947330525 617.4
+ vertex 183.4496386991948 -91.22406060436529 617.4
+ endloop
+endfacet
+facet normal -0.9861411980746715 -0.16590821998879884 3.1791278782751894e-16
+ outer loop
+ vertex 183.26546823547173 -79.06564190936429 617.4
+ vertex 183.51200882063426 -80.53105349682296 597.4
+ vertex 183.51200882063426 -80.53105349682296 617.4
+ endloop
+endfacet
+facet normal -0.9861411980746715 -0.16590821998879884 3.1791278782751894e-16
+ outer loop
+ vertex 183.51200882063426 -80.53105349682296 597.4
+ vertex 183.26546823547173 -79.06564190936429 617.4
+ vertex 183.26546823547173 -79.06564190936429 597.4
+ endloop
+endfacet
+facet normal -0.9859209640962927 0.16721199883811244 2.9376672002655497e-16
+ outer loop
+ vertex 183.5051558241694 -90.896718680585 617.4
+ vertex 183.4496386991948 -91.22406060436529 597.4
+ vertex 183.4496386991948 -91.22406060436529 617.4
+ endloop
+endfacet
+facet normal -0.9859209640962927 0.16721199883811244 2.9376672002655497e-16
+ outer loop
+ vertex 183.4496386991948 -91.22406060436529 597.4
+ vertex 183.5051558241694 -90.896718680585 617.4
+ vertex 183.5051558241694 -90.896718680585 597.4
+ endloop
+endfacet
+facet normal -0.4264730821792922 0.904500254381664 6.692383130899358e-17
+ outer loop
+ vertex 164.18392212485125 -117.4975113044715 617.4
+ vertex 162.83982945717034 -118.1312527986763 597.4
+ vertex 162.83982945717034 -118.1312527986763 617.4
+ endloop
+endfacet
+facet normal -0.4264730821792922 0.904500254381664 6.692383130899358e-17
+ outer loop
+ vertex 162.83982945717034 -118.1312527986763 597.4
+ vertex 164.18392212485125 -117.4975113044715 617.4
+ vertex 164.18392212485125 -117.4975113044715 597.4
+ endloop
+endfacet
+facet normal 0.866025403784438 0.5000000000000009 -3.0479839899610566e-16
+ outer loop
+ vertex 166.9703225694756 -80.3324100558224 617.4
+ vertex 168.16311056879687 -82.39837947330525 597.4
+ vertex 166.9703225694756 -80.3324100558224 597.4
+ endloop
+endfacet
+facet normal 0.866025403784438 0.5000000000000009 -3.0479839899610566e-16
+ outer loop
+ vertex 168.16311056879687 -82.39837947330525 597.4
+ vertex 166.9703225694756 -80.3324100558224 617.4
+ vertex 168.16311056879687 -82.39837947330525 617.4
+ endloop
+endfacet
+facet normal -0.22935485323248733 0.9733428744788264 7.978454901592457e-19
+ outer loop
+ vertex 155.7879373772224 -120.42976973338911 617.4
+ vertex 157.23433058097086 -120.08894708017985 597.4
+ vertex 155.7879373772224 -120.42976973338911 597.4
+ endloop
+endfacet
+facet normal -0.22935485323248733 0.9733428744788264 7.978454901592457e-19
+ outer loop
+ vertex 157.23433058097086 -120.08894708017985 597.4
+ vertex 155.7879373772224 -120.42976973338911 617.4
+ vertex 157.23433058097086 -120.08894708017985 617.4
+ endloop
+endfacet
+facet normal -0.9920516018175776 0.12583171035624832 2.98659512949049e-16
+ outer loop
+ vertex 183.6921424816438 -89.42252419859929 617.4
+ vertex 183.5051558241694 -90.896718680585 597.4
+ vertex 183.5051558241694 -90.896718680585 617.4
+ endloop
+endfacet
+facet normal -0.9920516018175776 0.12583171035624832 2.98659512949049e-16
+ outer loop
+ vertex 183.5051558241694 -90.896718680585 597.4
+ vertex 183.6921424816438 -89.42252419859929 617.4
+ vertex 183.6921424816438 -89.42252419859929 597.4
+ endloop
+endfacet
+facet normal -0.9301944916753204 -0.36706703428242143 3.150966317595327e-16
+ outer loop
+ vertex 181.6744981789514 -73.3452399278458 617.4
+ vertex 181.12903441933793 -71.96296547328228 597.4
+ vertex 181.6744981789514 -73.3452399278458 597.4
+ endloop
+endfacet
+facet normal -0.9301944916753204 -0.36706703428242143 3.150966317595327e-16
+ outer loop
+ vertex 181.12903441933793 -71.96296547328228 597.4
+ vertex 181.6744981789514 -73.3452399278458 617.4
+ vertex 181.12903441933793 -71.96296547328228 617.4
+ endloop
+endfacet
+facet normal -0.5005724413202224 0.8656946522826121 9.271580545042372e-17
+ outer loop
+ vertex 166.7867612357742 -116.06425699887052 617.4
+ vertex 165.5003339197542 -116.80811057410426 597.4
+ vertex 165.5003339197542 -116.80811057410426 617.4
+ endloop
+endfacet
+facet normal -0.5005724413202224 0.8656946522826121 9.271580545042372e-17
+ outer loop
+ vertex 165.5003339197542 -116.80811057410426 597.4
+ vertex 166.7867612357742 -116.06425699887052 617.4
+ vertex 166.7867612357742 -116.06425699887052 597.4
+ endloop
+endfacet
+facet normal -0.9964462355504118 0.0842312273293781 3.0302967770914105e-16
+ outer loop
+ vertex 183.81731057805365 -87.94179926518606 617.4
+ vertex 183.6921424816438 -89.42252419859929 597.4
+ vertex 183.6921424816438 -89.42252419859929 617.4
+ endloop
+endfacet
+facet normal -0.9964462355504118 0.0842312273293781 3.0302967770914105e-16
+ outer loop
+ vertex 183.6921424816438 -89.42252419859929 597.4
+ vertex 183.81731057805365 -87.94179926518606 617.4
+ vertex 183.81731057805365 -87.94179926518606 597.4
+ endloop
+endfacet
+facet normal -0.34938986583038373 0.9369774392454849 4.0663618573421485e-17
+ outer loop
+ vertex 161.4704079619354 -118.70822606424326 617.4
+ vertex 160.0780540076148 -119.22742144815797 597.4
+ vertex 160.0780540076148 -119.22742144815797 617.4
+ endloop
+endfacet
+facet normal -0.34938986583038373 0.9369774392454849 4.0663618573421485e-17
+ outer loop
+ vertex 160.0780540076148 -119.22742144815797 597.4
+ vertex 161.4704079619354 -118.70822606424326 617.4
+ vertex 161.4704079619354 -118.70822606424326 597.4
+ endloop
+endfacet
+facet normal -0.26986211191720677 0.962898977334375 1.4118899179751733e-17
+ outer loop
+ vertex 158.66520409248508 -119.68793040367183 617.4
+ vertex 157.23433058097086 -120.08894708017985 597.4
+ vertex 157.23433058097086 -120.08894708017985 617.4
+ endloop
+endfacet
+facet normal -0.26986211191720677 0.962898977334375 1.4118899179751733e-17
+ outer loop
+ vertex 157.23433058097086 -120.08894708017985 597.4
+ vertex 158.66520409248508 -119.68793040367183 617.4
+ vertex 158.66520409248508 -119.68793040367183 597.4
+ endloop
+endfacet
+facet normal -0.14720786925726453 0.9891055773923916 -2.5825137241484287e-17
+ outer loop
+ vertex 152.85873887103978 -120.92855370792294 617.4
+ vertex 154.3285555435008 -120.70980195331025 597.4
+ vertex 152.85873887103978 -120.92855370792294 597.4
+ endloop
+endfacet
+facet normal -0.14720786925726453 0.9891055773923916 -2.5825137241484287e-17
+ outer loop
+ vertex 154.3285555435008 -120.70980195331025 597.4
+ vertex 152.85873887103978 -120.92855370792294 617.4
+ vertex 154.3285555435008 -120.70980195331025 617.4
+ endloop
+endfacet
+facet normal -0.9991524752349787 -0.04116225494084529 3.1293258037304125e-16
+ outer loop
+ vertex 183.8202561633931 -83.48638307532285 617.4
+ vertex 183.881423514959 -84.97112949673391 597.4
+ vertex 183.881423514959 -84.97112949673391 617.4
+ endloop
+endfacet
+facet normal -0.9991524752349787 -0.04116225494084529 3.1293258037304125e-16
+ outer loop
+ vertex 183.881423514959 -84.97112949673391 597.4
+ vertex 183.8202561633931 -83.48638307532285 617.4
+ vertex 183.8202561633931 -83.48638307532285 597.4
+ endloop
+endfacet
+facet normal -0.5363402452594229 0.8440018609665869 1.0537964790030805e-16
+ outer loop
+ vertex 168.04095293703554 -115.26725225780697 617.4
+ vertex 166.7867612357742 -116.06425699887052 597.4
+ vertex 166.7867612357742 -116.06425699887052 617.4
+ endloop
+endfacet
+facet normal -0.5363402452594229 0.8440018609665869 1.0537964790030805e-16
+ outer loop
+ vertex 166.7867612357742 -116.06425699887052 597.4
+ vertex 168.04095293703554 -115.26725225780697 617.4
+ vertex 168.04095293703554 -115.26725225780697 597.4
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 146.7935543319419 -41.3852223358722 604.4681483474218
+ vertex 159.45237337704444 -63.31094008581029 604.4
+ vertex 147.05237337704443 -41.83351007195622 604.4
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 159.45237337704444 -63.31094008581029 604.4
+ vertex 146.7935543319419 -41.3852223358722 604.4681483474218
+ vertex 159.71119242214695 -63.759227821894335 604.4681483474218
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 159.71119242214695 -63.759227821894335 604.4681483474218
+ vertex 146.7935543319419 -41.3852223358722 604.4681483474218
+ vertex 146.55237337704443 -40.967484668171785 604.6679491924311
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 159.71119242214695 -63.759227821894335 604.4681483474218
+ vertex 146.55237337704443 -40.967484668171785 604.6679491924311
+ vertex 159.9523733770444 -64.17696548959475 604.6679491924311
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 159.9523733770444 -64.17696548959475 604.6679491924311
+ vertex 146.55237337704443 -40.967484668171785 604.6679491924311
+ vertex 146.34526659585788 -40.608765200564626 604.9857864376269
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 159.9523733770444 -64.17696548959475 604.6679491924311
+ vertex 146.34526659585788 -40.608765200564626 604.9857864376269
+ vertex 160.159480158231 -64.53568495720188 604.9857864376269
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 160.159480158231 -64.53568495720188 604.9857864376269
+ vertex 146.34526659585788 -40.608765200564626 604.9857864376269
+ vertex 146.18634797325998 -40.33351007195622 605.4
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 160.159480158231 -64.53568495720188 604.9857864376269
+ vertex 146.18634797325998 -40.33351007195622 605.4
+ vertex 160.3183987808289 -64.8109400858103 605.4
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 160.3183987808289 -64.8109400858103 605.4
+ vertex 146.18634797325998 -40.33351007195622 605.4
+ vertex 146.08644755075537 -40.16047746448061 605.8823619097949
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 160.3183987808289 -64.8109400858103 605.4
+ vertex 146.08644755075537 -40.16047746448061 605.8823619097949
+ vertex 160.4182992033335 -64.98397269328593 605.8823619097949
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 160.4182992033335 -64.98397269328593 605.8823619097949
+ vertex 146.08644755075537 -40.16047746448061 605.8823619097949
+ vertex 146.05237337704443 -40.10145926438734 606.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 160.4182992033335 -64.98397269328593 605.8823619097949
+ vertex 146.05237337704443 -40.10145926438734 606.3999999999999
+ vertex 160.45237337704444 -65.04299089337918 606.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 160.45237337704444 -65.04299089337918 606.3999999999999
+ vertex 146.05237337704443 -40.10145926438734 606.3999999999999
+ vertex 146.05237337704443 -40.10145926438734 608.4
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 160.45237337704444 -65.04299089337918 606.3999999999999
+ vertex 146.05237337704443 -40.10145926438734 608.4
+ vertex 160.45237337704444 -65.04299089337918 608.4
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 160.45237337704444 -65.04299089337918 608.4
+ vertex 146.05237337704443 -40.10145926438734 608.4
+ vertex 146.08644755075537 -40.16047746448061 608.9176380902051
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 160.45237337704444 -65.04299089337918 608.4
+ vertex 146.08644755075537 -40.16047746448061 608.9176380902051
+ vertex 160.4182992033335 -64.98397269328593 608.9176380902051
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 160.4182992033335 -64.98397269328593 608.9176380902051
+ vertex 146.08644755075537 -40.16047746448061 608.9176380902051
+ vertex 146.18634797325998 -40.33351007195622 609.4
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 160.4182992033335 -64.98397269328593 608.9176380902051
+ vertex 146.18634797325998 -40.33351007195622 609.4
+ vertex 160.3183987808289 -64.8109400858103 609.4
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 160.3183987808289 -64.8109400858103 609.4
+ vertex 146.18634797325998 -40.33351007195622 609.4
+ vertex 146.34526659585788 -40.608765200564626 609.814213562373
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 160.3183987808289 -64.8109400858103 609.4
+ vertex 146.34526659585788 -40.608765200564626 609.814213562373
+ vertex 160.159480158231 -64.5356849572019 609.814213562373
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 160.159480158231 -64.5356849572019 609.814213562373
+ vertex 146.34526659585788 -40.608765200564626 609.814213562373
+ vertex 146.55237337704446 -40.9674846681718 610.1320508075687
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 160.159480158231 -64.5356849572019 609.814213562373
+ vertex 146.55237337704446 -40.9674846681718 610.1320508075687
+ vertex 159.95237337704444 -64.17696548959475 610.1320508075687
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 159.95237337704444 -64.17696548959475 610.1320508075687
+ vertex 146.55237337704446 -40.9674846681718 610.1320508075687
+ vertex 146.7935543319419 -41.3852223358722 610.331851652578
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 159.95237337704444 -64.17696548959475 610.1320508075687
+ vertex 146.7935543319419 -41.3852223358722 610.331851652578
+ vertex 159.71119242214695 -63.759227821894335 610.331851652578
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 159.71119242214695 -63.759227821894335 610.331851652578
+ vertex 146.7935543319419 -41.3852223358722 610.331851652578
+ vertex 147.05237337704443 -41.833510071956226 610.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844394 0.49999999999999906 -8.360210501876744e-16
+ outer loop
+ vertex 159.71119242214695 -63.759227821894335 610.331851652578
+ vertex 147.05237337704443 -41.833510071956226 610.3999999999999
+ vertex 159.45237337704444 -63.31094008581029 610.3999999999999
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 135.04517266035938 -106.48202726980834 604.4681483474218
+ vertex 109.72753457015432 -106.48202726980836 604.4
+ vertex 134.52753457015433 -106.48202726980834 604.4
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 109.72753457015432 -106.48202726980836 604.4
+ vertex 135.04517266035938 -106.48202726980834 604.4681483474218
+ vertex 109.20989647994928 -106.48202726980834 604.4681483474218
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 109.20989647994928 -106.48202726980834 604.4681483474218
+ vertex 135.04517266035938 -106.48202726980834 604.4681483474218
+ vertex 135.52753457015433 -106.48202726980831 604.6679491924311
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 109.20989647994928 -106.48202726980834 604.4681483474218
+ vertex 135.52753457015433 -106.48202726980831 604.6679491924311
+ vertex 108.72753457015433 -106.48202726980836 604.6679491924311
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 108.72753457015433 -106.48202726980836 604.6679491924311
+ vertex 135.52753457015433 -106.48202726980831 604.6679491924311
+ vertex 135.94174813252744 -106.48202726980834 604.9857864376269
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 108.72753457015433 -106.48202726980836 604.6679491924311
+ vertex 135.94174813252744 -106.48202726980834 604.9857864376269
+ vertex 108.31332100778123 -106.48202726980834 604.9857864376269
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 108.31332100778123 -106.48202726980834 604.9857864376269
+ vertex 135.94174813252744 -106.48202726980834 604.9857864376269
+ vertex 136.25958537772323 -106.48202726980836 605.4
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 108.31332100778123 -106.48202726980834 604.9857864376269
+ vertex 136.25958537772323 -106.48202726980836 605.4
+ vertex 107.99548376258544 -106.48202726980834 605.4
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 107.99548376258544 -106.48202726980834 605.4
+ vertex 136.25958537772323 -106.48202726980836 605.4
+ vertex 136.45938622273246 -106.48202726980834 605.8823619097949
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 107.99548376258544 -106.48202726980834 605.4
+ vertex 136.45938622273246 -106.48202726980834 605.8823619097949
+ vertex 107.7956829175762 -106.48202726980834 605.8823619097949
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 107.7956829175762 -106.48202726980834 605.8823619097949
+ vertex 136.45938622273246 -106.48202726980834 605.8823619097949
+ vertex 136.52753457015433 -106.48202726980836 606.3999999999999
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 107.7956829175762 -106.48202726980834 605.8823619097949
+ vertex 136.52753457015433 -106.48202726980836 606.3999999999999
+ vertex 107.72753457015433 -106.48202726980836 606.3999999999999
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 107.72753457015433 -106.48202726980836 606.3999999999999
+ vertex 136.52753457015433 -106.48202726980836 606.3999999999999
+ vertex 136.52753457015433 -106.48202726980836 608.4
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 107.72753457015433 -106.48202726980836 606.3999999999999
+ vertex 136.52753457015433 -106.48202726980836 608.4
+ vertex 107.72753457015433 -106.48202726980836 608.4
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 107.72753457015433 -106.48202726980836 608.4
+ vertex 136.52753457015433 -106.48202726980836 608.4
+ vertex 136.45938622273246 -106.48202726980834 608.9176380902051
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 107.72753457015433 -106.48202726980836 608.4
+ vertex 136.45938622273246 -106.48202726980834 608.9176380902051
+ vertex 107.79568291757619 -106.48202726980834 608.9176380902051
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 107.79568291757619 -106.48202726980834 608.9176380902051
+ vertex 136.45938622273246 -106.48202726980834 608.9176380902051
+ vertex 136.25958537772323 -106.48202726980836 609.4
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 107.79568291757619 -106.48202726980834 608.9176380902051
+ vertex 136.25958537772323 -106.48202726980836 609.4
+ vertex 107.99548376258544 -106.48202726980834 609.4
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 107.99548376258544 -106.48202726980834 609.4
+ vertex 136.25958537772323 -106.48202726980836 609.4
+ vertex 135.94174813252744 -106.48202726980836 609.814213562373
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 107.99548376258544 -106.48202726980834 609.4
+ vertex 135.94174813252744 -106.48202726980836 609.814213562373
+ vertex 108.31332100778123 -106.48202726980834 609.814213562373
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 108.31332100778123 -106.48202726980834 609.814213562373
+ vertex 135.94174813252744 -106.48202726980836 609.814213562373
+ vertex 135.52753457015436 -106.48202726980834 610.1320508075687
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 108.31332100778123 -106.48202726980834 609.814213562373
+ vertex 135.52753457015436 -106.48202726980834 610.1320508075687
+ vertex 108.72753457015433 -106.48202726980836 610.1320508075687
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 108.72753457015433 -106.48202726980836 610.1320508075687
+ vertex 135.52753457015436 -106.48202726980834 610.1320508075687
+ vertex 135.04517266035938 -106.48202726980834 610.331851652578
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 108.72753457015433 -106.48202726980836 610.1320508075687
+ vertex 135.04517266035938 -106.48202726980834 610.331851652578
+ vertex 109.20989647994928 -106.48202726980834 610.331851652578
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 109.20989647994928 -106.48202726980834 610.331851652578
+ vertex 135.04517266035938 -106.48202726980834 610.331851652578
+ vertex 134.52753457015433 -106.48202726980834 610.3999999999999
+ endloop
+endfacet
+facet normal 6.661338147750937e-16 -1.0 -4.5316418029497855e-16
+ outer loop
+ vertex 109.20989647994928 -106.48202726980834 610.331851652578
+ vertex 134.52753457015433 -106.48202726980834 610.3999999999999
+ vertex 109.72753457015432 -106.48202726980836 610.3999999999999
+ endloop
+endfacet
+facet normal 7.240154675610714e-16 4.1801052509383675e-16 1.0
+ outer loop
+ vertex 157.72032256947554 -64.31094008581026 610.3999999999999
+ vertex 147.05237337704443 -41.833510071956226 610.3999999999999
+ vertex 145.32032256947556 -42.833510071956184 610.3999999999999
+ endloop
+endfacet
+facet normal 7.240154675610714e-16 4.1801052509383675e-16 1.0
+ outer loop
+ vertex 147.05237337704443 -41.833510071956226 610.3999999999999
+ vertex 157.72032256947554 -64.31094008581026 610.3999999999999
+ vertex 159.45237337704444 -63.31094008581029 610.3999999999999
+ endloop
+endfacet
+facet normal -0.4957224306869029 0.858616436401259 -0.1305261922200746
+ outer loop
+ vertex 144.32032256947556 -41.101459264387316 606.3999999999999
+ vertex 146.08644755075537 -40.16047746448061 605.8823619097949
+ vertex 144.3543967431865 -41.160477464480586 605.8823619097949
+ endloop
+endfacet
+facet normal -0.4957224306869029 0.858616436401259 -0.1305261922200746
+ outer loop
+ vertex 146.08644755075537 -40.16047746448061 605.8823619097949
+ vertex 144.32032256947556 -41.101459264387316 606.3999999999999
+ vertex 146.05237337704443 -40.10145926438734 606.3999999999999
+ endloop
+endfacet
+facet normal 0.3043807145043524 -0.5272028623656552 0.7933533402912474
+ outer loop
+ vertex 158.42742935066212 -65.53568495720187 609.814213562373
+ vertex 159.95237337704444 -64.17696548959475 610.1320508075687
+ vertex 158.22032256947557 -65.17696548959472 610.1320508075687
+ endloop
+endfacet
+facet normal 0.3043807145043524 -0.5272028623656552 0.7933533402912474
+ outer loop
+ vertex 159.95237337704444 -64.17696548959475 610.1320508075687
+ vertex 158.42742935066212 -65.53568495720187 609.814213562373
+ vertex 160.159480158231 -64.5356849572019 609.814213562373
+ endloop
+endfacet
+facet normal -0.06526309610999381 0.11303899832176192 0.9914448613738187
+ outer loop
+ vertex 145.32032256947556 -42.833510071956184 610.3999999999999
+ vertex 146.7935543319419 -41.3852223358722 610.331851652578
+ vertex 145.06150352437305 -42.38522233587218 610.331851652578
+ endloop
+endfacet
+facet normal -0.06526309610999381 0.11303899832176192 0.9914448613738187
+ outer loop
+ vertex 146.7935543319419 -41.3852223358722 610.331851652578
+ vertex 145.32032256947556 -42.833510071956184 610.3999999999999
+ vertex 147.05237337704443 -41.833510071956226 610.3999999999999
+ endloop
+endfacet
+facet normal 0.19134171618257495 -0.3314135740356431 0.9238795325112623
+ outer loop
+ vertex 158.22032256947557 -65.17696548959472 610.1320508075687
+ vertex 159.71119242214695 -63.759227821894335 610.331851652578
+ vertex 157.97914161457808 -64.7592278218943 610.331851652578
+ endloop
+endfacet
+facet normal 0.19134171618257495 -0.3314135740356431 0.9238795325112623
+ outer loop
+ vertex 159.71119242214695 -63.759227821894335 610.331851652578
+ vertex 158.22032256947557 -65.17696548959472 610.1320508075687
+ vertex 159.95237337704444 -64.17696548959475 610.1320508075687
+ endloop
+endfacet
+facet normal 0.4957224306869048 -0.8586164364012623 -0.1305261922200442
+ outer loop
+ vertex 158.68624839576464 -65.98397269328589 605.8823619097949
+ vertex 160.45237337704444 -65.04299089337918 606.3999999999999
+ vertex 158.72032256947557 -66.04299089337914 606.3999999999999
+ endloop
+endfacet
+facet normal 0.4957224306869048 -0.8586164364012623 -0.1305261922200442
+ outer loop
+ vertex 160.45237337704444 -65.04299089337918 606.3999999999999
+ vertex 158.68624839576464 -65.98397269328589 605.8823619097949
+ vertex 160.4182992033335 -64.98397269328593 605.8823619097949
+ endloop
+endfacet
+facet normal -0.1913417161825769 0.3314135740356495 0.9238795325112594
+ outer loop
+ vertex 145.06150352437305 -42.38522233587218 610.331851652578
+ vertex 146.55237337704446 -40.9674846681718 610.1320508075687
+ vertex 144.8203225694756 -41.96748466817175 610.1320508075687
+ endloop
+endfacet
+facet normal -0.1913417161825769 0.3314135740356495 0.9238795325112594
+ outer loop
+ vertex 146.55237337704446 -40.9674846681718 610.1320508075687
+ vertex 145.06150352437305 -42.38522233587218 610.331851652578
+ vertex 146.7935543319419 -41.3852223358722 610.331851652578
+ endloop
+endfacet
+facet normal 0.3043807145043512 -0.5272028623656559 -0.7933533402912476
+ outer loop
+ vertex 159.9523733770444 -64.17696548959475 604.6679491924311
+ vertex 158.42742935066212 -65.53568495720187 604.9857864376269
+ vertex 158.22032256947554 -65.17696548959472 604.6679491924311
+ endloop
+endfacet
+facet normal 0.3043807145043512 -0.5272028623656559 -0.7933533402912476
+ outer loop
+ vertex 158.42742935066212 -65.53568495720187 604.9857864376269
+ vertex 159.9523733770444 -64.17696548959475 604.6679491924311
+ vertex 160.159480158231 -64.53568495720188 604.9857864376269
+ endloop
+endfacet
+facet normal 0.46193976625563005 -0.8001031451912437 0.38268343236515173
+ outer loop
+ vertex 160.4182992033335 -64.98397269328593 608.9176380902051
+ vertex 158.58634797326002 -65.81094008581026 609.4
+ vertex 158.68624839576464 -65.98397269328589 608.9176380902051
+ endloop
+endfacet
+facet normal 0.46193976625563005 -0.8001031451912437 0.38268343236515173
+ outer loop
+ vertex 158.58634797326002 -65.81094008581026 609.4
+ vertex 160.4182992033335 -64.98397269328593 608.9176380902051
+ vertex 160.3183987808289 -64.8109400858103 609.4
+ endloop
+endfacet
+facet normal 0.49572243068690647 -0.858616436401265 0.13052619222002185
+ outer loop
+ vertex 160.45237337704444 -65.04299089337918 608.4
+ vertex 158.68624839576464 -65.98397269328589 608.9176380902051
+ vertex 158.72032256947557 -66.04299089337914 608.4
+ endloop
+endfacet
+facet normal 0.49572243068690647 -0.858616436401265 0.13052619222002185
+ outer loop
+ vertex 158.68624839576464 -65.98397269328589 608.9176380902051
+ vertex 160.45237337704444 -65.04299089337918 608.4
+ vertex 160.4182992033335 -64.98397269328593 608.9176380902051
+ endloop
+endfacet
+facet normal -0.30438071450434606 0.527202862365647 0.7933533402912555
+ outer loop
+ vertex 144.8203225694756 -41.96748466817175 610.1320508075687
+ vertex 146.34526659585788 -40.608765200564626 609.814213562373
+ vertex 144.613215788289 -41.6087652005646 609.814213562373
+ endloop
+endfacet
+facet normal -0.30438071450434606 0.527202862365647 0.7933533402912555
+ outer loop
+ vertex 146.34526659585788 -40.608765200564626 609.814213562373
+ vertex 144.8203225694756 -41.96748466817175 610.1320508075687
+ vertex 146.55237337704446 -40.9674846681718 610.1320508075687
+ endloop
+endfacet
+facet normal -0.3043807145043472 0.5272028623656462 -0.7933533402912555
+ outer loop
+ vertex 146.34526659585788 -40.608765200564626 604.9857864376269
+ vertex 144.8203225694756 -41.96748466817175 604.6679491924311
+ vertex 144.613215788289 -41.6087652005646 604.9857864376269
+ endloop
+endfacet
+facet normal -0.3043807145043472 0.5272028623656462 -0.7933533402912555
+ outer loop
+ vertex 144.8203225694756 -41.96748466817175 604.6679491924311
+ vertex 146.34526659585788 -40.608765200564626 604.9857864376269
+ vertex 146.55237337704443 -40.967484668171785 604.6679491924311
+ endloop
+endfacet
+facet normal 0.06526309610999262 -0.11303899832175657 0.9914448613738194
+ outer loop
+ vertex 157.97914161457808 -64.7592278218943 610.331851652578
+ vertex 159.45237337704444 -63.31094008581029 610.3999999999999
+ vertex 157.72032256947554 -64.31094008581026 610.3999999999999
+ endloop
+endfacet
+facet normal 0.06526309610999262 -0.11303899832175657 0.9914448613738194
+ outer loop
+ vertex 159.45237337704444 -63.31094008581029 610.3999999999999
+ vertex 157.97914161457808 -64.7592278218943 610.331851652578
+ vertex 159.71119242214695 -63.759227821894335 610.331851652578
+ endloop
+endfacet
+facet normal 0.46193976625564215 -0.8001031451912659 -0.38268343236509067
+ outer loop
+ vertex 158.58634797326002 -65.81094008581026 605.4
+ vertex 160.4182992033335 -64.98397269328593 605.8823619097949
+ vertex 158.68624839576464 -65.98397269328589 605.8823619097949
+ endloop
+endfacet
+facet normal 0.46193976625564215 -0.8001031451912659 -0.38268343236509067
+ outer loop
+ vertex 160.4182992033335 -64.98397269328593 605.8823619097949
+ vertex 158.58634797326002 -65.81094008581026 605.4
+ vertex 160.3183987808289 -64.8109400858103 605.4
+ endloop
+endfacet
+facet normal 0.19134171618258017 -0.33141357403565525 -0.9238795325112567
+ outer loop
+ vertex 159.71119242214695 -63.759227821894335 604.4681483474218
+ vertex 158.22032256947554 -65.17696548959472 604.6679491924311
+ vertex 157.97914161457808 -64.7592278218943 604.4681483474218
+ endloop
+endfacet
+facet normal 0.19134171618258017 -0.33141357403565525 -0.9238795325112567
+ outer loop
+ vertex 158.22032256947554 -65.17696548959472 604.6679491924311
+ vertex 159.71119242214695 -63.759227821894335 604.4681483474218
+ vertex 159.9523733770444 -64.17696548959475 604.6679491924311
+ endloop
+endfacet
+facet normal -0.06526309610999523 0.11303899832176112 -0.9914448613738187
+ outer loop
+ vertex 146.7935543319419 -41.3852223358722 604.4681483474218
+ vertex 145.32032256947556 -42.833510071956184 604.4
+ vertex 145.06150352437302 -42.385222335872164 604.4681483474218
+ endloop
+endfacet
+facet normal -0.06526309610999523 0.11303899832176112 -0.9914448613738187
+ outer loop
+ vertex 145.32032256947556 -42.833510071956184 604.4
+ vertex 146.7935543319419 -41.3852223358722 604.4681483474218
+ vertex 147.05237337704443 -41.83351007195622 604.4
+ endloop
+endfacet
+facet normal 0.49999999999999917 -0.8660254037844392 9.32505634347441e-32
+ outer loop
+ vertex 160.45237337704444 -65.04299089337918 606.3999999999999
+ vertex 158.72032256947557 -66.04299089337914 608.4
+ vertex 158.72032256947557 -66.04299089337914 606.3999999999999
+ endloop
+endfacet
+facet normal 0.49999999999999917 -0.8660254037844392 9.32505634347441e-32
+ outer loop
+ vertex 158.72032256947557 -66.04299089337914 608.4
+ vertex 160.45237337704444 -65.04299089337918 606.3999999999999
+ vertex 160.45237337704444 -65.04299089337918 608.4
+ endloop
+endfacet
+facet normal -0.4957224306869049 0.8586164364012626 0.13052619222004305
+ outer loop
+ vertex 146.08644755075537 -40.16047746448061 608.9176380902051
+ vertex 144.32032256947556 -41.101459264387316 608.4
+ vertex 144.3543967431865 -41.160477464480586 608.9176380902051
+ endloop
+endfacet
+facet normal -0.4957224306869049 0.8586164364012626 0.13052619222004305
+ outer loop
+ vertex 144.32032256947556 -41.101459264387316 608.4
+ vertex 146.08644755075537 -40.16047746448061 608.9176380902051
+ vertex 146.05237337704443 -40.10145926438734 608.4
+ endloop
+endfacet
+facet normal 0.39667667014560826 -0.6870641468694345 0.6087614290087443
+ outer loop
+ vertex 160.3183987808289 -64.8109400858103 609.4
+ vertex 158.42742935066212 -65.53568495720187 609.814213562373
+ vertex 158.58634797326002 -65.81094008581026 609.4
+ endloop
+endfacet
+facet normal 0.39667667014560826 -0.6870641468694345 0.6087614290087443
+ outer loop
+ vertex 158.42742935066212 -65.53568495720187 609.814213562373
+ vertex 160.3183987808289 -64.8109400858103 609.4
+ vertex 160.159480158231 -64.5356849572019 609.814213562373
+ endloop
+endfacet
+facet normal -0.3966766701456038 0.6870641468694267 -0.6087614290087562
+ outer loop
+ vertex 144.45429716569112 -41.333510071956184 605.4
+ vertex 146.34526659585788 -40.608765200564626 604.9857864376269
+ vertex 144.613215788289 -41.6087652005646 604.9857864376269
+ endloop
+endfacet
+facet normal -0.3966766701456038 0.6870641468694267 -0.6087614290087562
+ outer loop
+ vertex 146.34526659585788 -40.608765200564626 604.9857864376269
+ vertex 144.45429716569112 -41.333510071956184 605.4
+ vertex 146.18634797325998 -40.33351007195622 605.4
+ endloop
+endfacet
+facet normal -0.4619397662556498 0.8001031451912779 -0.38268343236505625
+ outer loop
+ vertex 144.3543967431865 -41.160477464480586 605.8823619097949
+ vertex 146.18634797325998 -40.33351007195622 605.4
+ vertex 144.45429716569112 -41.333510071956184 605.4
+ endloop
+endfacet
+facet normal -0.4619397662556498 0.8001031451912779 -0.38268343236505625
+ outer loop
+ vertex 146.18634797325998 -40.33351007195622 605.4
+ vertex 144.3543967431865 -41.160477464480586 605.8823619097949
+ vertex 146.08644755075537 -40.16047746448061 605.8823619097949
+ endloop
+endfacet
+facet normal -7.240154675610713e-16 -4.180105250938367e-16 -1.0
+ outer loop
+ vertex 147.05237337704443 -41.83351007195622 604.4
+ vertex 157.72032256947554 -64.31094008581026 604.4
+ vertex 145.32032256947556 -42.833510071956184 604.4
+ endloop
+endfacet
+facet normal -7.240154675610713e-16 -4.180105250938367e-16 -1.0
+ outer loop
+ vertex 157.72032256947554 -64.31094008581026 604.4
+ vertex 147.05237337704443 -41.83351007195622 604.4
+ vertex 159.45237337704444 -63.31094008581029 604.4
+ endloop
+endfacet
+facet normal 0.3966766701455985 -0.6870641468694194 -0.608761429008768
+ outer loop
+ vertex 158.42742935066212 -65.53568495720187 604.9857864376269
+ vertex 160.3183987808289 -64.8109400858103 605.4
+ vertex 158.58634797326002 -65.81094008581026 605.4
+ endloop
+endfacet
+facet normal 0.3966766701455985 -0.6870641468694194 -0.608761429008768
+ outer loop
+ vertex 160.3183987808289 -64.8109400858103 605.4
+ vertex 158.42742935066212 -65.53568495720187 604.9857864376269
+ vertex 160.159480158231 -64.53568495720188 604.9857864376269
+ endloop
+endfacet
+facet normal 0.06526309610999118 -0.1130389983217574 -0.9914448613738194
+ outer loop
+ vertex 159.45237337704444 -63.31094008581029 604.4
+ vertex 157.97914161457808 -64.7592278218943 604.4681483474218
+ vertex 157.72032256947554 -64.31094008581026 604.4
+ endloop
+endfacet
+facet normal 0.06526309610999118 -0.1130389983217574 -0.9914448613738194
+ outer loop
+ vertex 157.97914161457808 -64.7592278218943 604.4681483474218
+ vertex 159.45237337704444 -63.31094008581029 604.4
+ vertex 159.71119242214695 -63.759227821894335 604.4681483474218
+ endloop
+endfacet
+facet normal -0.49999999999999917 0.8660254037844392 2.442162611707019e-15
+ outer loop
+ vertex 146.05237337704443 -40.10145926438734 608.4
+ vertex 144.32032256947556 -41.101459264387316 606.3999999999999
+ vertex 144.32032256947556 -41.101459264387316 608.4
+ endloop
+endfacet
+facet normal -0.49999999999999917 0.8660254037844392 2.442162611707019e-15
+ outer loop
+ vertex 144.32032256947556 -41.101459264387316 606.3999999999999
+ vertex 146.05237337704443 -40.10145926438734 608.4
+ vertex 146.05237337704443 -40.10145926438734 606.3999999999999
+ endloop
+endfacet
+facet normal -0.19134171618257817 0.3314135740356487 -0.9238795325112594
+ outer loop
+ vertex 146.55237337704443 -40.967484668171785 604.6679491924311
+ vertex 145.06150352437302 -42.385222335872164 604.4681483474218
+ vertex 144.8203225694756 -41.96748466817175 604.6679491924311
+ endloop
+endfacet
+facet normal -0.19134171618257817 0.3314135740356487 -0.9238795325112594
+ outer loop
+ vertex 145.06150352437302 -42.385222335872164 604.4681483474218
+ vertex 146.55237337704443 -40.967484668171785 604.6679491924311
+ vertex 146.7935543319419 -41.3852223358722 604.4681483474218
+ endloop
+endfacet
+facet normal -0.461939766255635 0.8001031451912535 0.3826834323651253
+ outer loop
+ vertex 146.18634797325998 -40.33351007195622 609.4
+ vertex 144.3543967431865 -41.160477464480586 608.9176380902051
+ vertex 144.45429716569112 -41.3335100719562 609.4
+ endloop
+endfacet
+facet normal -0.461939766255635 0.8001031451912535 0.3826834323651253
+ outer loop
+ vertex 144.3543967431865 -41.160477464480586 608.9176380902051
+ vertex 146.18634797325998 -40.33351007195622 609.4
+ vertex 146.08644755075537 -40.16047746448061 608.9176380902051
+ endloop
+endfacet
+facet normal -0.39667667014560287 0.6870641468694272 0.6087614290087562
+ outer loop
+ vertex 146.34526659585788 -40.608765200564626 609.814213562373
+ vertex 144.45429716569112 -41.3335100719562 609.4
+ vertex 144.613215788289 -41.6087652005646 609.814213562373
+ endloop
+endfacet
+facet normal -0.39667667014560287 0.6870641468694272 0.6087614290087562
+ outer loop
+ vertex 144.45429716569112 -41.3335100719562 609.4
+ vertex 146.34526659585788 -40.608765200564626 609.814213562373
+ vertex 146.18634797325998 -40.33351007195622 609.4
+ endloop
+endfacet
+facet normal 0.9140288370919221 0.40564921417942973 -3.128704161156744e-16
+ outer loop
+ vertex 183.24227030542377 -69.33067842807887 617.4
+ vertex 183.8959747167953 -70.80363748245902 597.4
+ vertex 183.24227030542377 -69.33067842807887 597.4
+ endloop
+endfacet
+facet normal 0.9140288370919221 0.40564921417942973 -3.128704161156744e-16
+ outer loop
+ vertex 183.8959747167953 -70.80363748245902 597.4
+ vertex 183.24227030542377 -69.33067842807887 617.4
+ vertex 183.8959747167953 -70.80363748245902 617.4
+ endloop
+endfacet
+facet normal 0.9859209640962899 -0.1672119988381284 -2.9376672002655295e-16
+ outer loop
+ vertex 186.4727638760373 -91.33638042612223 597.4
+ vertex 186.20330145024204 -92.92519376771138 617.4
+ vertex 186.20330145024204 -92.92519376771138 597.4
+ endloop
+endfacet
+facet normal 0.9859209640962899 -0.1672119988381284 -2.9376672002655295e-16
+ outer loop
+ vertex 186.20330145024204 -92.92519376771138 617.4
+ vertex 186.4727638760373 -91.33638042612223 597.4
+ vertex 186.4727638760373 -91.33638042612223 617.4
+ endloop
+endfacet
+facet normal 0.9447323868310453 0.32784251901258343 -3.167714557131984e-16
+ outer loop
+ vertex 184.48750387842549 -72.30264751720468 617.4
+ vertex 185.01582266574817 -73.82508539517835 597.4
+ vertex 184.48750387842549 -72.30264751720468 597.4
+ endloop
+endfacet
+facet normal 0.9447323868310453 0.32784251901258343 -3.167714557131984e-16
+ outer loop
+ vertex 185.01582266574817 -73.82508539517835 597.4
+ vertex 184.48750387842549 -72.30264751720468 617.4
+ vertex 185.01582266574817 -73.82508539517835 617.4
+ endloop
+endfacet
+facet normal 0.9134916689428489 -0.40685743298114696 -2.5397624073309877e-16
+ outer loop
+ vertex 183.87625932185094 -100.62463388991574 597.4
+ vertex 183.2206078637874 -102.0967272968931 617.4
+ vertex 183.2206078637874 -102.0967272968931 597.4
+ endloop
+endfacet
+facet normal 0.9134916689428489 -0.40685743298114696 -2.5397624073309877e-16
+ outer loop
+ vertex 183.2206078637874 -102.0967272968931 617.4
+ vertex 183.87625932185094 -100.62463388991574 597.4
+ vertex 183.87625932185094 -100.62463388991574 617.4
+ endloop
+endfacet
+facet normal 0.8962637115698759 0.44352154324563553 -3.100967044653078e-16
+ outer loop
+ vertex 182.52753457015436 -67.8863479042527 617.4
+ vertex 183.24227030542377 -69.33067842807887 597.4
+ vertex 182.52753457015436 -67.8863479042527 597.4
+ endloop
+endfacet
+facet normal 0.8962637115698759 0.44352154324563553 -3.100967044653078e-16
+ outer loop
+ vertex 183.24227030542377 -69.33067842807887 597.4
+ vertex 182.52753457015436 -67.8863479042527 617.4
+ vertex 183.24227030542377 -69.33067842807887 617.4
+ endloop
+endfacet
+facet normal 0.8956764823140574 -0.444706239026974 -2.4571391698701513e-16
+ outer loop
+ vertex 183.2206078637874 -102.0967272968931 597.4
+ vertex 182.5039629892141 -103.54011149975624 617.4
+ vertex 182.5039629892141 -103.54011149975624 597.4
+ endloop
+endfacet
+facet normal 0.8956764823140574 -0.444706239026974 -2.4571391698701513e-16
+ outer loop
+ vertex 182.5039629892141 -103.54011149975624 617.4
+ vertex 183.2206078637874 -102.0967272968931 597.4
+ vertex 183.2206078637874 -102.0967272968931 617.4
+ endloop
+endfacet
+facet normal 0.57357643635105 -0.819152044288989 -1.1872720193645655e-16
+ outer loop
+ vertex 144.00457108529972 -56.70523109684268 597.4
+ vertex 143.4226637815576 -57.1126869774622 617.4
+ vertex 143.4226637815576 -57.1126869774622 597.4
+ endloop
+endfacet
+facet normal 0.57357643635105 -0.819152044288989 -1.1872720193645655e-16
+ outer loop
+ vertex 143.4226637815576 -57.1126869774622 617.4
+ vertex 144.00457108529972 -56.70523109684268 597.4
+ vertex 144.00457108529972 -56.70523109684268 617.4
+ endloop
+endfacet
+facet normal 0.4226182617406982 -0.9063077870366505 -6.559734023084941e-17
+ outer loop
+ vertex 144.64839188070863 -56.40501252946406 597.4
+ vertex 144.00457108529972 -56.70523109684268 617.4
+ vertex 144.00457108529972 -56.70523109684268 597.4
+ endloop
+endfacet
+facet normal 0.4226182617406982 -0.9063077870366505 -6.559734023084941e-17
+ outer loop
+ vertex 144.00457108529972 -56.70523109684268 617.4
+ vertex 144.64839188070863 -56.40501252946406 597.4
+ vertex 144.64839188070863 -56.40501252946406 617.4
+ endloop
+endfacet
+facet normal 0.9991524752349786 0.04116225494084896 -3.1293258037304154e-16
+ outer loop
+ vertex 186.8144750093717 -83.30022856319225 597.4
+ vertex 186.8808080545158 -84.91036450790281 617.4
+ vertex 186.8808080545158 -84.91036450790281 597.4
+ endloop
+endfacet
+facet normal 0.9991524752349786 0.04116225494084896 -3.1293258037304154e-16
+ outer loop
+ vertex 186.8808080545158 -84.91036450790281 617.4
+ vertex 186.8144750093717 -83.30022856319225 597.4
+ vertex 186.8144750093717 -83.30022856319225 617.4
+ endloop
+endfacet
+facet normal 0.9442980716405378 -0.329091403558285 -2.691538986312246e-16
+ outer loop
+ vertex 185.0001013973305 -97.60466933591321 597.4
+ vertex 184.4697700303989 -99.12640731420498 617.4
+ vertex 184.4697700303989 -99.12640731420498 597.4
+ endloop
+endfacet
+facet normal 0.9442980716405378 -0.329091403558285 -2.691538986312246e-16
+ outer loop
+ vertex 184.4697700303989 -99.12640731420498 617.4
+ vertex 185.0001013973305 -97.60466933591321 597.4
+ vertex 185.0001013973305 -97.60466933591321 617.4
+ endloop
+endfacet
+facet normal 0.9576170825074782 0.28804430785881835 -3.178919571804746e-16
+ outer loop
+ vertex 185.01582266574817 -73.82508539517835 617.4
+ vertex 185.48000656685264 -75.3682869825552 597.4
+ vertex 185.01582266574817 -73.82508539517835 597.4
+ endloop
+endfacet
+facet normal 0.9576170825074782 0.28804430785881835 -3.178919571804746e-16
+ outer loop
+ vertex 185.48000656685264 -75.3682869825552 597.4
+ vertex 185.01582266574817 -73.82508539517835 617.4
+ vertex 185.48000656685264 -75.3682869825552 617.4
+ endloop
+endfacet
+facet normal 0.9688260316082282 0.24774204422796836 -3.1845617538128354e-16
+ outer loop
+ vertex 185.48000656685264 -75.3682869825552 597.4
+ vertex 185.87924330029887 -76.92955181082564 617.4
+ vertex 185.87924330029887 -76.92955181082564 597.4
+ endloop
+endfacet
+facet normal 0.9688260316082282 0.24774204422796836 -3.1845617538128354e-16
+ outer loop
+ vertex 185.87924330029887 -76.92955181082564 617.4
+ vertex 185.48000656685264 -75.3682869825552 597.4
+ vertex 185.48000656685264 -75.3682869825552 617.4
+ endloop
+endfacet
+facet normal 0.7071067811865454 -0.7071067811865499 -1.6824959769008353e-16
+ outer loop
+ vertex 143.4226637815576 -57.1126869774622 597.4
+ vertex 142.9203509284472 -57.6149998305726 617.4
+ vertex 142.9203509284472 -57.614999830572586 597.4
+ endloop
+endfacet
+facet normal 0.7071067811865454 -0.7071067811865499 -1.6824959769008353e-16
+ outer loop
+ vertex 142.9203509284472 -57.6149998305726 617.4
+ vertex 143.4226637815576 -57.1126869774622 597.4
+ vertex 143.4226637815576 -57.1126869774622 617.4
+ endloop
+endfacet
+facet normal 0.9922171154055788 0.12451986145283153 -3.1680613295388643e-16
+ outer loop
+ vertex 186.48019562046042 -80.0953160514068 597.4
+ vertex 186.6808595929021 -81.69427565173788 617.4
+ vertex 186.6808595929021 -81.69427565173788 597.4
+ endloop
+endfacet
+facet normal 0.9922171154055788 0.12451986145283153 -3.1680613295388643e-16
+ outer loop
+ vertex 186.6808595929021 -81.69427565173788 617.4
+ vertex 186.48019562046042 -80.0953160514068 597.4
+ vertex 186.48019562046042 -80.0953160514068 617.4
+ endloop
+endfacet
+facet normal 0.9999997814571896 -0.0006611244764010427 -3.1017246104582265e-16
+ outer loop
+ vertex 186.8808080545158 -84.91036450790281 597.4
+ vertex 186.87974265127679 -86.52186588805827 617.4
+ vertex 186.87974265127679 -86.52186588805827 597.4
+ endloop
+endfacet
+facet normal 0.9999997814571896 -0.0006611244764010427 -3.1017246104582265e-16
+ outer loop
+ vertex 186.87974265127679 -86.52186588805827 617.4
+ vertex 186.8808080545158 -84.91036450790281 597.4
+ vertex 186.8808080545158 -84.91036450790281 617.4
+ endloop
+endfacet
+facet normal 0.8762939397707019 -0.4817768478467404 -2.370216152648601e-16
+ outer loop
+ vertex 182.5039629892141 -103.54011149975624 597.4
+ vertex 181.72757876430893 -104.95226070173368 617.4
+ vertex 181.72757876430893 -104.95226070173368 597.4
+ endloop
+endfacet
+facet normal 0.8762939397707019 -0.4817768478467404 -2.370216152648601e-16
+ outer loop
+ vertex 181.72757876430893 -104.95226070173368 617.4
+ vertex 182.5039629892141 -103.54011149975624 597.4
+ vertex 182.5039629892141 -103.54011149975624 617.4
+ endloop
+endfacet
+facet normal -0.707106781186551 -0.7071067811865441 2.704681784798783e-16
+ outer loop
+ vertex 149.16412596495888 -57.61499983057261 617.4
+ vertex 148.66181311184846 -57.1126869774622 597.4
+ vertex 149.16412596495886 -57.61499983057261 597.4
+ endloop
+endfacet
+facet normal -0.707106781186551 -0.7071067811865441 2.704681784798783e-16
+ outer loop
+ vertex 148.66181311184846 -57.1126869774622 597.4
+ vertex 149.16412596495888 -57.61499983057261 617.4
+ vertex 148.66181311184846 -57.1126869774622 617.4
+ endloop
+endfacet
+facet normal 0.978065050469156 -0.20829968087053663 -2.88359860903562e-16
+ outer loop
+ vertex 186.20330145024204 -92.92519376771138 597.4
+ vertex 185.86762615367383 -94.50134729088126 617.4
+ vertex 185.86762615367383 -94.50134729088126 597.4
+ endloop
+endfacet
+facet normal 0.978065050469156 -0.20829968087053663 -2.88359860903562e-16
+ outer loop
+ vertex 185.86762615367383 -94.50134729088126 617.4
+ vertex 186.20330145024204 -92.92519376771138 597.4
+ vertex 186.20330145024204 -92.92519376771138 617.4
+ endloop
+endfacet
+facet normal 0.8660254037844387 -0.4999999999999999 -2.3251894735637813e-16
+ outer loop
+ vertex 142.51289504782767 -58.19690713431473 597.4
+ vertex 121.6564475239141 -94.32133391112718 617.4
+ vertex 121.65644752391407 -94.32133391112718 597.4
+ endloop
+endfacet
+facet normal 0.8660254037844387 -0.4999999999999999 -2.3251894735637813e-16
+ outer loop
+ vertex 121.6564475239141 -94.32133391112718 617.4
+ vertex 142.51289504782767 -58.19690713431473 597.4
+ vertex 142.51289504782767 -58.19690713431473 617.4
+ endloop
+endfacet
+facet normal 0.7071067811865523 0.7071067811865427 -2.7046817847987866e-16
+ outer loop
+ vertex 122.0363688343796 -99.02626721214719 617.4
+ vertex 122.53868168748998 -99.52858006525759 597.4
+ vertex 122.0363688343796 -99.02626721214719 597.4
+ endloop
+endfacet
+facet normal 0.7071067811865523 0.7071067811865427 -2.7046817847987866e-16
+ outer loop
+ vertex 122.53868168748998 -99.52858006525759 597.4
+ vertex 122.0363688343796 -99.02626721214719 617.4
+ vertex 122.53868168749001 -99.5285800652576 617.4
+ endloop
+endfacet
+facet normal 0.9917151050050453 -0.12845680404257295 -2.9836538446986737e-16
+ outer loop
+ vertex 121.14483512149562 -95.69901809900362 597.4
+ vertex 121.13921260616524 -95.74242516819555 617.4
+ vertex 121.13921260616524 -95.74242516819555 597.4
+ endloop
+endfacet
+facet normal 0.9917151050050453 -0.12845680404257295 -2.9836538446986737e-16
+ outer loop
+ vertex 121.13921260616524 -95.74242516819555 617.4
+ vertex 121.14483512149562 -95.69901809900362 597.4
+ vertex 121.14483512149562 -95.69901809900362 617.4
+ endloop
+endfacet
+facet normal 0.9091671933849138 -0.41643128421457354 -2.519427078479903e-16
+ outer loop
+ vertex 121.62891295376008 -94.36902518559845 597.4
+ vertex 121.335665377625 -95.00925344381999 617.4
+ vertex 121.335665377625 -95.00925344381999 597.4
+ endloop
+endfacet
+facet normal 0.9091671933849138 -0.41643128421457354 -2.519427078479903e-16
+ outer loop
+ vertex 121.335665377625 -95.00925344381999 617.4
+ vertex 121.62891295376008 -94.36902518559845 597.4
+ vertex 121.62891295376008 -94.36902518559845 617.4
+ endloop
+endfacet
+facet normal 0.9964286670416539 -0.08443880326954645 -3.0300922412569886e-16
+ outer loop
+ vertex 121.13921260616524 -95.74242516819555 597.4
+ vertex 121.08292162982879 -96.40669254700175 617.4
+ vertex 121.08292162982879 -96.40669254700175 597.4
+ endloop
+endfacet
+facet normal 0.9964286670416539 -0.08443880326954645 -3.0300922412569886e-16
+ outer loop
+ vertex 121.08292162982879 -96.40669254700175 617.4
+ vertex 121.13921260616524 -95.74242516819555 597.4
+ vertex 121.13921260616524 -95.74242516819555 617.4
+ endloop
+endfacet
+facet normal 0.9932753778753307 0.11577574748892414 -3.1650240770775005e-16
+ outer loop
+ vertex 121.07305832758567 -96.49857203241156 597.4
+ vertex 121.14483512149562 -97.1143669949999 617.4
+ vertex 121.14483512149562 -97.11436699499988 597.4
+ endloop
+endfacet
+facet normal 0.9932753778753307 0.11577574748892414 -3.1650240770775005e-16
+ outer loop
+ vertex 121.14483512149562 -97.1143669949999 617.4
+ vertex 121.07305832758567 -96.49857203241156 597.4
+ vertex 121.07305832758567 -96.49857203241156 617.4
+ endloop
+endfacet
+facet normal -0.0871557427476704 -0.9961946980917445 9.904188843509464e-17
+ outer loop
+ vertex 146.74991289470117 -56.22115326457821 617.4
+ vertex 146.04223844670304 -56.15923977291139 597.4
+ vertex 146.74991289470117 -56.22115326457821 597.4
+ endloop
+endfacet
+facet normal -0.0871557427476704 -0.9961946980917445 9.904188843509464e-17
+ outer loop
+ vertex 146.04223844670304 -56.15923977291139 597.4
+ vertex 146.74991289470117 -56.22115326457821 617.4
+ vertex 146.04223844670304 -56.15923977291139 617.4
+ endloop
+endfacet
+facet normal 0.0871557427476704 0.9961946980917445 -9.904188843509464e-17
+ outer loop
+ vertex 124.4505819046373 -100.42011377814158 617.4
+ vertex 125.15825635263542 -100.4820272698084 597.4
+ vertex 124.4505819046373 -100.42011377814158 597.4
+ endloop
+endfacet
+facet normal 0.0871557427476704 0.9961946980917445 -9.904188843509464e-17
+ outer loop
+ vertex 125.15825635263542 -100.4820272698084 597.4
+ vertex 124.4505819046373 -100.42011377814158 617.4
+ vertex 125.15825635263542 -100.4820272698084 617.4
+ endloop
+endfacet
+facet normal 0.9942872710787393 -0.10673716583643095 -3.0073320617769446e-16
+ outer loop
+ vertex 121.08292162982879 -96.40669254700175 597.4
+ vertex 121.07305832758567 -96.49857203241156 617.4
+ vertex 121.07305832758567 -96.49857203241156 597.4
+ endloop
+endfacet
+facet normal 0.9942872710787393 -0.10673716583643095 -3.0073320617769446e-16
+ outer loop
+ vertex 121.07305832758567 -96.49857203241156 617.4
+ vertex 121.08292162982879 -96.40669254700175 597.4
+ vertex 121.08292162982879 -96.40669254700175 617.4
+ endloop
+endfacet
+facet normal 0.9637952185786789 -0.2666435385395205 -2.7971600712696416e-16
+ outer loop
+ vertex 121.335665377625 -95.00925344381999 597.4
+ vertex 121.14483512149562 -95.69901809900362 617.4
+ vertex 121.14483512149562 -95.69901809900362 597.4
+ endloop
+endfacet
+facet normal 0.9637952185786789 -0.2666435385395205 -2.7971600712696416e-16
+ outer loop
+ vertex 121.14483512149562 -95.69901809900362 617.4
+ vertex 121.335665377625 -95.00925344381999 597.4
+ vertex 121.335665377625 -95.00925344381999 617.4
+ endloop
+endfacet
+facet normal 0.2588190451025147 0.9659258262890701 -1.5010751463383359e-16
+ outer loop
+ vertex 123.76440978664105 -100.23625451325573 617.4
+ vertex 124.4505819046373 -100.42011377814158 597.4
+ vertex 123.76440978664102 -100.23625451325573 597.4
+ endloop
+endfacet
+facet normal 0.2588190451025147 0.9659258262890701 -1.5010751463383359e-16
+ outer loop
+ vertex 124.4505819046373 -100.42011377814158 597.4
+ vertex 123.76440978664105 -100.23625451325573 617.4
+ vertex 124.4505819046373 -100.42011377814158 617.4
+ endloop
+endfacet
+facet normal 0.8660254037843361 -0.5000000000001776 -2.325189473563334e-16
+ outer loop
+ vertex 121.65644752391407 -94.32133391112718 597.4
+ vertex 121.62891295376008 -94.36902518559845 617.4
+ vertex 121.62891295376008 -94.36902518559845 597.4
+ endloop
+endfacet
+facet normal 0.8660254037843361 -0.5000000000001776 -2.325189473563334e-16
+ outer loop
+ vertex 121.62891295376008 -94.36902518559845 617.4
+ vertex 121.65644752391407 -94.32133391112718 597.4
+ vertex 121.6564475239141 -94.32133391112718 617.4
+ endloop
+endfacet
+facet normal -0.5735764363510415 -0.8191520442889951 2.3714292307799455e-16
+ outer loop
+ vertex 148.66181311184846 -57.1126869774622 617.4
+ vertex 148.07990580810633 -56.70523109684268 597.4
+ vertex 148.66181311184846 -57.1126869774622 597.4
+ endloop
+endfacet
+facet normal -0.5735764363510415 -0.8191520442889951 2.3714292307799455e-16
+ outer loop
+ vertex 148.07990580810633 -56.70523109684268 597.4
+ vertex 148.66181311184846 -57.1126869774622 617.4
+ vertex 148.07990580810633 -56.70523109684268 617.4
+ endloop
+endfacet
+facet normal 0.08715574274765725 -0.9961946980917458 4.496692457386032e-17
+ outer loop
+ vertex 146.04223844670304 -56.15923977291139 617.4
+ vertex 145.33456399870488 -56.22115326457819 597.4
+ vertex 146.04223844670304 -56.15923977291139 597.4
+ endloop
+endfacet
+facet normal 0.08715574274765725 -0.9961946980917458 4.496692457386032e-17
+ outer loop
+ vertex 145.33456399870488 -56.22115326457819 597.4
+ vertex 146.04223844670304 -56.15923977291139 617.4
+ vertex 145.3345639987049 -56.2211532645782 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 174.9553679209021 -91.51604350665507 617.4
+ vertex 171.40253457015436 -87.15541313845647 617.4
+ vertex 170.40253457015436 -88.88746394602533 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 164.82694148227208 -83.35899269908619 617.4
+ vertex 168.16311056879687 -82.39837947330525 617.4
+ vertex 166.9703225694756 -80.3324100558224 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 168.16311056879687 -82.39837947330525 617.4
+ vertex 164.82694148227208 -83.35899269908619 617.4
+ vertex 171.40253457015436 -87.15541313845647 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 168.16311056879687 -82.39837947330525 617.4
+ vertex 171.40253457015436 -87.15541313845647 617.4
+ vertex 183.4496386991948 -91.22406060436529 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 183.4496386991948 -91.22406060436529 617.4
+ vertex 171.40253457015436 -87.15541313845647 617.4
+ vertex 175.9553679209021 -89.7839926990862 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 175.9553679209021 -89.7839926990862 617.4
+ vertex 171.40253457015436 -87.15541313845647 617.4
+ vertex 174.9553679209021 -91.51604350665507 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 183.4496386991948 -91.22406060436529 617.4
+ vertex 175.9553679209021 -89.7839926990862 617.4
+ vertex 182.58046225985305 -93.60899269908619 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 135.51562203109634 -29.851270586485427 617.4
+ vertex 134.3609214927171 -31.851270586485423 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 135.51562203109634 -29.851270586485427 617.4
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 135.85382598854787 -29.401780843702255 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 135.85382598854787 -29.401780843702255 617.4
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 136.2476728386652 -29.11921977891656 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 136.2476728386652 -29.11921977891656 617.4
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 136.6703225694756 -29.02284346173925 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 136.6703225694756 -29.02284346173925 617.4
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 137.09297230028596 -29.11921977891657 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 137.09297230028596 -29.11921977891657 617.4
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 137.4868191504033 -29.401780843702266 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 137.4868191504033 -29.401780843702266 617.4
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 137.82502310785486 -29.851270586485448 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 137.82502310785486 -29.851270586485448 617.4
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 165.4703225694756 -77.73433384446909 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 165.4703225694756 -77.73433384446909 617.4
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 149.16412596495888 -57.61499983057261 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 149.16412596495888 -57.61499983057261 617.4
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 148.66181311184846 -57.1126869774622 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 148.66181311184846 -57.1126869774622 617.4
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 148.07990580810633 -56.70523109684268 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 148.07990580810633 -56.70523109684268 617.4
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 147.43608501269742 -56.40501252946406 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 147.43608501269742 -56.40501252946406 617.4
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 146.74991289470117 -56.22115326457821 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 146.74991289470117 -56.22115326457821 617.4
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 146.04223844670304 -56.15923977291139 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 146.04223844670304 -56.15923977291139 617.4
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 145.3345639987049 -56.2211532645782 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 145.3345639987049 -56.2211532645782 617.4
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 144.64839188070863 -56.40501252946406 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 144.64839188070863 -56.40501252946406 617.4
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 144.00457108529972 -56.70523109684268 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 144.00457108529972 -56.70523109684268 617.4
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 143.4226637815576 -57.1126869774622 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 143.4226637815576 -57.1126869774622 617.4
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 142.9203509284472 -57.6149998305726 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 142.9203509284472 -57.6149998305726 617.4
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 142.51289504782767 -58.19690713431473 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 165.4703225694756 -77.73433384446909 617.4
+ vertex 149.16412596495888 -57.61499983057261 617.4
+ vertex 149.57158184557838 -58.19690713431471 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 165.4703225694756 -77.73433384446909 617.4
+ vertex 149.57158184557838 -58.19690713431471 617.4
+ vertex 162.26899907810125 -80.18947890594492 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 165.4703225694756 -77.73433384446909 617.4
+ vertex 162.26899907810125 -80.18947890594492 617.4
+ vertex 150.02753457015436 -104.48202726980841 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 165.4703225694756 -77.73433384446909 617.4
+ vertex 150.02753457015436 -104.48202726980841 617.4
+ vertex 154.57694148227208 -101.11251347666716 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 154.57694148227208 -101.11251347666716 617.4
+ vertex 150.02753457015436 -104.48202726980841 617.4
+ vertex 153.02753457015436 -104.48202726980841 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 153.02753457015436 -104.48202726980841 617.4
+ vertex 150.02753457015436 -104.48202726980841 617.4
+ vertex 150.02753457015436 -121.17248787278366 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 153.02753457015436 -104.48202726980841 617.4
+ vertex 150.02753457015436 -121.17248787278366 617.4
+ vertex 152.85873887103978 -120.92855370792294 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 152.85873887103978 -120.92855370792294 617.4
+ vertex 150.02753457015436 -121.17248787278366 617.4
+ vertex 150.02753457015433 -124.17799915024119 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 152.85873887103978 -120.92855370792294 617.4
+ vertex 150.02753457015433 -124.17799915024119 617.4
+ vertex 151.63572936288375 -124.07481319206396 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 152.85873887103978 -120.92855370792294 617.4
+ vertex 151.63572936288375 -124.07481319206396 617.4
+ vertex 154.3285555435008 -120.70980195331025 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 154.3285555435008 -120.70980195331025 617.4
+ vertex 151.63572936288375 -124.07481319206396 617.4
+ vertex 153.23820152839707 -123.90445829168756 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 154.3285555435008 -120.70980195331025 617.4
+ vertex 153.23820152839707 -123.90445829168756 617.4
+ vertex 155.7879373772224 -120.42976973338911 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 155.7879373772224 -120.42976973338911 617.4
+ vertex 153.23820152839707 -123.90445829168756 617.4
+ vertex 154.83214687982968 -123.66723255536577 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 155.7879373772224 -120.42976973338911 617.4
+ vertex 154.83214687982968 -123.66723255536577 617.4
+ vertex 157.23433058097086 -120.08894708017985 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 157.23433058097086 -120.08894708017985 617.4
+ vertex 154.83214687982968 -123.66723255536577 617.4
+ vertex 156.4147761514999 -123.36355110749699 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 157.23433058097086 -120.08894708017985 617.4
+ vertex 156.4147761514999 -123.36355110749699 617.4
+ vertex 158.66520409248508 -119.68793040367183 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 158.66520409248508 -119.68793040367183 617.4
+ vertex 156.4147761514999 -123.36355110749699 617.4
+ vertex 157.98331987988098 -122.9939453641928 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 158.66520409248508 -119.68793040367183 617.4
+ vertex 157.98331987988098 -122.9939453641928 617.4
+ vertex 160.0780540076148 -119.22742144815797 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 160.0780540076148 -119.22742144815797 617.4
+ vertex 157.98331987988098 -122.9939453641928 617.4
+ vertex 161.4704079619354 -118.70822606424326 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 161.4704079619354 -118.70822606424326 617.4
+ vertex 157.98331987988098 -122.9939453641928 617.4
+ vertex 159.5350332499214 -122.55906210334592 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 161.4704079619354 -118.70822606424326 617.4
+ vertex 159.5350332499214 -122.55906210334592 617.4
+ vertex 162.83982945717034 -118.1312527986763 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 162.83982945717034 -118.1312527986763 617.4
+ vertex 159.5350332499214 -122.55906210334592 617.4
+ vertex 161.06720089823253 -122.05966233282531 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 162.83982945717034 -118.1312527986763 617.4
+ vertex 161.06720089823253 -122.05966233282531 617.4
+ vertex 164.18392212485125 -117.4975113044715 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 164.18392212485125 -117.4975113044715 617.4
+ vertex 161.06720089823253 -122.05966233282531 617.4
+ vertex 162.5771416647378 -121.49661995877848 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 164.18392212485125 -117.4975113044715 617.4
+ vertex 162.5771416647378 -121.49661995877848 617.4
+ vertex 165.5003339197542 -116.80811057410426 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 165.5003339197542 -116.80811057410426 617.4
+ vertex 162.5771416647378 -121.49661995877848 617.4
+ vertex 164.0622132844704 -120.8709202563717 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 165.5003339197542 -116.80811057410426 617.4
+ vertex 164.0622132844704 -120.8709202563717 617.4
+ vertex 166.7867612357742 -116.06425699887052 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 166.7867612357742 -116.06425699887052 617.4
+ vertex 164.0622132844704 -120.8709202563717 617.4
+ vertex 168.04095293703554 -115.26725225780697 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 168.04095293703554 -115.26725225780697 617.4
+ vertex 164.0622132844704 -120.8709202563717 617.4
+ vertex 165.51981701130626 -120.18365814564446 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 168.04095293703554 -115.26725225780697 617.4
+ vertex 165.51981701130626 -120.18365814564446 617.4
+ vertex 169.26071429718348 -114.41849103986607 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 169.26071429718348 -114.41849103986607 617.4
+ vertex 165.51981701130626 -120.18365814564446 617.4
+ vertex 166.94740216554413 -119.43603627549433 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 169.26071429718348 -114.41849103986607 617.4
+ vertex 166.94740216554413 -119.43603627549433 617.4
+ vertex 170.44391083996473 -113.51945860333166 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 170.44391083996473 -113.51945860333166 617.4
+ vertex 166.94740216554413 -119.43603627549433 617.4
+ vertex 168.34247059737297 -118.62936291914635 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 170.44391083996473 -113.51945860333166 617.4
+ vertex 168.34247059737297 -118.62936291914635 617.4
+ vertex 170.69963869919482 -113.30770840086846 617.3999999999999
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 170.69963869919482 -113.30770840086846 617.3999999999999
+ vertex 168.34247059737297 -118.62936291914635 617.4
+ vertex 172.33046225985308 -111.36251347666716 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 172.33046225985308 -111.36251347666716 617.4
+ vertex 168.34247059737297 -118.62936291914635 617.4
+ vertex 182.58046225985305 -93.60899269908619 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 165.4703225694756 -77.73433384446909 617.4
+ vertex 166.9703225694756 -80.3324100558224 617.4
+ vertex 179.92468545251552 -69.38910354298147 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 166.9703225694756 -80.3324100558224 617.4
+ vertex 165.4703225694756 -77.73433384446909 617.4
+ vertex 164.82694148227208 -83.35899269908619 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 164.82694148227208 -83.35899269908619 617.4
+ vertex 165.4703225694756 -77.73433384446909 617.4
+ vertex 154.57694148227208 -101.11251347666716 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 179.92468545251552 -69.38910354298147 617.4
+ vertex 166.9703225694756 -80.3324100558224 617.4
+ vertex 181.12903441933793 -71.96296547328228 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 179.92468545251552 -69.38910354298147 617.4
+ vertex 181.12903441933793 -71.96296547328228 617.4
+ vertex 182.52753457015436 -67.8863479042527 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 182.52753457015436 -67.8863479042527 617.4
+ vertex 181.12903441933793 -71.96296547328228 617.4
+ vertex 183.24227030542377 -69.33067842807887 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 183.24227030542377 -69.33067842807887 617.4
+ vertex 181.12903441933793 -71.96296547328228 617.4
+ vertex 181.6744981789514 -73.3452399278458 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 183.24227030542377 -69.33067842807887 617.4
+ vertex 181.6744981789514 -73.3452399278458 617.4
+ vertex 183.8959747167953 -70.80363748245902 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 183.8959747167953 -70.80363748245902 617.4
+ vertex 181.6744981789514 -73.3452399278458 617.4
+ vertex 182.16167407948237 -74.74911777963077 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 183.8959747167953 -70.80363748245902 617.4
+ vertex 182.16167407948237 -74.74911777963077 617.4
+ vertex 184.48750387842549 -72.30264751720468 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 184.48750387842549 -72.30264751720468 617.4
+ vertex 182.16167407948237 -74.74911777963077 617.4
+ vertex 182.58970960549215 -76.17214236454276 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 184.48750387842549 -72.30264751720468 617.4
+ vertex 182.58970960549215 -76.17214236454276 617.4
+ vertex 185.01582266574817 -73.82508539517835 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.01582266574817 -73.82508539517835 617.4
+ vertex 182.58970960549215 -76.17214236454276 617.4
+ vertex 182.95785573205208 -77.61182351337034 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.01582266574817 -73.82508539517835 617.4
+ vertex 182.95785573205208 -77.61182351337034 617.4
+ vertex 185.48000656685264 -75.3682869825552 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.48000656685264 -75.3682869825552 617.4
+ vertex 182.95785573205208 -77.61182351337034 617.4
+ vertex 183.26546823547173 -79.06564190936429 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.48000656685264 -75.3682869825552 617.4
+ vertex 183.26546823547173 -79.06564190936429 617.4
+ vertex 183.51200882063426 -80.53105349682296 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.48000656685264 -75.3682869825552 617.4
+ vertex 183.51200882063426 -80.53105349682296 617.4
+ vertex 185.87924330029887 -76.92955181082564 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.87924330029887 -76.92955181082564 617.4
+ vertex 183.51200882063426 -80.53105349682296 617.4
+ vertex 183.6970460629663 -82.00549393296838 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.87924330029887 -76.92955181082564 617.4
+ vertex 183.6970460629663 -82.00549393296838 617.4
+ vertex 186.21283423653944 -78.50614780237997 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.21283423653944 -78.50614780237997 617.4
+ vertex 183.6970460629663 -82.00549393296838 617.4
+ vertex 183.8202561633931 -83.48638307532285 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.21283423653944 -78.50614780237997 617.4
+ vertex 183.8202561633931 -83.48638307532285 617.4
+ vertex 186.48019562046042 -80.0953160514068 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.48019562046042 -80.0953160514068 617.4
+ vertex 183.8202561633931 -83.48638307532285 617.4
+ vertex 183.881423514959 -84.97112949673391 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.48019562046042 -80.0953160514068 617.4
+ vertex 183.881423514959 -84.97112949673391 617.4
+ vertex 186.6808595929021 -81.69427565173788 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.6808595929021 -81.69427565173788 617.4
+ vertex 183.881423514959 -84.97112949673391 617.4
+ vertex 183.8804410801207 -86.45713502014634 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.6808595929021 -81.69427565173788 617.4
+ vertex 183.8804410801207 -86.45713502014634 617.4
+ vertex 183.81731057805365 -87.94179926518606 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.6808595929021 -81.69427565173788 617.4
+ vertex 183.81731057805365 -87.94179926518606 617.4
+ vertex 186.8144750093717 -83.30022856319225 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.8144750093717 -83.30022856319225 617.4
+ vertex 183.81731057805365 -87.94179926518606 617.4
+ vertex 183.6921424816438 -89.42252419859929 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.8144750093717 -83.30022856319225 617.4
+ vertex 183.6921424816438 -89.42252419859929 617.4
+ vertex 186.8808080545158 -84.91036450790281 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.8808080545158 -84.91036450790281 617.4
+ vertex 183.6921424816438 -89.42252419859929 617.4
+ vertex 183.5051558241694 -90.896718680585 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.8808080545158 -84.91036450790281 617.4
+ vertex 183.5051558241694 -90.896718680585 617.4
+ vertex 186.87974265127679 -86.52186588805827 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.87974265127679 -86.52186588805827 617.4
+ vertex 183.5051558241694 -90.896718680585 617.4
+ vertex 183.4496386991948 -91.22406060436529 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.87974265127679 -86.52186588805827 617.4
+ vertex 183.4496386991948 -91.22406060436529 617.4
+ vertex 182.58046225985305 -93.60899269908619 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.87974265127679 -86.52186588805827 617.4
+ vertex 182.58046225985305 -93.60899269908619 617.4
+ vertex 168.34247059737297 -118.62936291914635 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.87974265127679 -86.52186588805827 617.4
+ vertex 168.34247059737297 -118.62936291914635 617.4
+ vertex 169.70258105841677 -117.76504968478841 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.87974265127679 -86.52186588805827 617.4
+ vertex 169.70258105841677 -117.76504968478841 617.4
+ vertex 186.81128066401763 -88.13191271645415 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.81128066401763 -88.13191271645415 617.4
+ vertex 169.70258105841677 -117.76504968478841 617.4
+ vertex 171.0253534737069 -116.84460904537998 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.81128066401763 -88.13191271645415 617.4
+ vertex 171.0253534737069 -116.84460904537998 617.4
+ vertex 186.67554189525939 -89.73768755122492 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.67554189525939 -89.73768755122492 617.4
+ vertex 171.0253534737069 -116.84460904537998 617.4
+ vertex 172.30847310660613 -115.8696516919559 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.67554189525939 -89.73768755122492 617.4
+ vertex 172.30847310660613 -115.8696516919559 617.4
+ vertex 186.4727638760373 -91.33638042612223 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.4727638760373 -91.33638042612223 617.4
+ vertex 172.30847310660613 -115.8696516919559 617.4
+ vertex 173.5496946093963 -114.84188371505724 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.4727638760373 -91.33638042612223 617.4
+ vertex 173.5496946093963 -114.84188371505724 617.4
+ vertex 186.20330145024204 -92.92519376771138 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.20330145024204 -92.92519376771138 617.4
+ vertex 173.5496946093963 -114.84188371505724 617.4
+ vertex 174.7468459524417 -113.76310361922131 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.20330145024204 -92.92519376771138 617.4
+ vertex 174.7468459524417 -113.76310361922131 617.4
+ vertex 185.86762615367383 -94.50134729088126 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.86762615367383 -94.50134729088126 617.4
+ vertex 174.7468459524417 -113.76310361922131 617.4
+ vertex 175.89783222505156 -112.6351991757552 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.86762615367383 -94.50134729088126 617.4
+ vertex 175.89783222505156 -112.6351991757552 617.4
+ vertex 185.4663253888957 -96.06208286410167 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.4663253888957 -96.06208286410167 617.4
+ vertex 175.89783222505156 -112.6351991757552 617.4
+ vertex 177.000639301392 -111.46014411930012 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.4663253888957 -96.06208286410167 617.4
+ vertex 177.000639301392 -111.46014411930012 617.4
+ vertex 185.0001013973305 -97.60466933591321 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.0001013973305 -97.60466933591321 617.4
+ vertex 177.000639301392 -111.46014411930012 617.4
+ vertex 178.05333736503042 -110.23999469396776 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.0001013973305 -97.60466933591321 617.4
+ vertex 178.05333736503042 -110.23999469396776 617.4
+ vertex 184.4697700303989 -99.12640731420498 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 184.4697700303989 -99.12640731420498 617.4
+ vertex 178.05333736503042 -110.23999469396776 617.4
+ vertex 179.05408428594694 -108.97688605509174 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 184.4697700303989 -99.12640731420498 617.4
+ vertex 179.05408428594694 -108.97688605509174 617.4
+ vertex 183.87625932185094 -100.62463388991574 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 183.87625932185094 -100.62463388991574 617.4
+ vertex 179.05408428594694 -108.97688605509174 617.4
+ vertex 180.00112884410115 -107.67302853289175 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 183.87625932185094 -100.62463388991574 617.4
+ vertex 180.00112884410115 -107.67302853289175 617.4
+ vertex 183.2206078637874 -102.0967272968931 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 183.2206078637874 -102.0967272968931 617.4
+ vertex 180.00112884410115 -107.67302853289175 617.4
+ vertex 182.5039629892141 -103.54011149975624 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 182.5039629892141 -103.54011149975624 617.4
+ vertex 180.00112884410115 -107.67302853289175 617.4
+ vertex 180.8928137939151 -106.33070376458777 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 182.5039629892141 -103.54011149975624 617.4
+ vertex 180.8928137939151 -106.33070376458777 617.4
+ vertex 181.72757876430893 -104.95226070173368 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 154.57694148227208 -101.11251347666716 617.4
+ vertex 155.41311056879687 -104.48202726980841 617.4
+ vertex 161.15253457015436 -104.90893391603744 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 155.41311056879687 -104.48202726980841 617.4
+ vertex 154.57694148227208 -101.11251347666716 617.4
+ vertex 153.02753457015436 -104.48202726980841 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 161.15253457015436 -104.90893391603744 617.4
+ vertex 155.41311056879687 -104.48202726980841 617.4
+ vertex 170.69963869919482 -113.30770840086846 617.3999999999999
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 161.15253457015436 -104.90893391603744 617.4
+ vertex 170.69963869919482 -113.30770840086846 617.3999999999999
+ vertex 165.70536792090212 -107.53751347666717 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 161.15253457015436 -104.90893391603744 617.4
+ vertex 165.70536792090212 -107.53751347666717 617.4
+ vertex 162.15253457015436 -103.17688310846856 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 165.70536792090212 -107.53751347666717 617.4
+ vertex 170.69963869919482 -113.30770840086846 617.3999999999999
+ vertex 172.33046225985308 -111.36251347666716 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 166.70536792090212 -105.80546266909828 617.4
+ vertex 162.15253457015436 -103.17688310846856 617.4
+ vertex 165.70536792090212 -107.53751347666717 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 93.36206755126861 -102.99966536001341 617.4
+ vertex 94.73693564691287 -100.48202726980837 617.4
+ vertex 93.58223510853362 -102.48202726980837 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 94.73693564691287 -100.48202726980837 617.4
+ vertex 93.36206755126861 -102.99966536001341 617.4
+ vertex 113.13435723985394 -100.4820272698084 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985394 -100.4820272698084 617.4
+ vertex 93.36206755126861 -102.99966536001341 617.4
+ vertex 93.31428591610249 -103.48202726980837 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985394 -100.4820272698084 617.4
+ vertex 93.31428591610249 -103.48202726980837 617.4
+ vertex 93.44214644250894 -103.89624083218146 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985394 -100.4820272698084 617.4
+ vertex 93.44214644250894 -103.89624083218146 617.4
+ vertex 93.73693564691287 -104.21407807737724 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985394 -100.4820272698084 617.4
+ vertex 93.73693564691287 -104.21407807737724 617.4
+ vertex 94.17856413219634 -104.41387892238649 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985394 -100.4820272698084 617.4
+ vertex 94.17856413219634 -104.41387892238649 617.4
+ vertex 94.73693564691287 -104.48202726980836 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985394 -100.4820272698084 617.4
+ vertex 94.73693564691287 -104.48202726980836 617.4
+ vertex 150.02753457015436 -104.48202726980841 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985394 -100.4820272698084 617.4
+ vertex 150.02753457015436 -104.48202726980841 617.4
+ vertex 124.4505819046373 -100.42011377814158 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985394 -100.4820272698084 617.4
+ vertex 124.4505819046373 -100.42011377814158 617.4
+ vertex 123.76440978664105 -100.23625451325573 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985394 -100.4820272698084 617.4
+ vertex 123.76440978664105 -100.23625451325573 617.4
+ vertex 123.12058899123213 -99.93603594587711 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985394 -100.4820272698084 617.4
+ vertex 123.12058899123213 -99.93603594587711 617.4
+ vertex 122.53868168749001 -99.5285800652576 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985394 -100.4820272698084 617.4
+ vertex 122.53868168749001 -99.5285800652576 617.4
+ vertex 122.0363688343796 -99.02626721214719 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985394 -100.4820272698084 617.4
+ vertex 122.0363688343796 -99.02626721214719 617.4
+ vertex 121.62891295376008 -98.44435990840508 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985394 -100.4820272698084 617.4
+ vertex 121.62891295376008 -98.44435990840508 617.4
+ vertex 121.32869438638144 -97.80053911299616 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985394 -100.4820272698084 617.4
+ vertex 121.32869438638144 -97.80053911299616 617.4
+ vertex 121.14483512149562 -97.1143669949999 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985394 -100.4820272698084 617.4
+ vertex 121.14483512149562 -97.1143669949999 617.4
+ vertex 121.07305832758567 -96.49857203241156 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985394 -100.4820272698084 617.4
+ vertex 121.07305832758567 -96.49857203241156 617.4
+ vertex 121.13921260616524 -95.74242516819555 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985394 -100.4820272698084 617.4
+ vertex 121.13921260616524 -95.74242516819555 617.4
+ vertex 121.14483512149562 -95.69901809900362 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985394 -100.4820272698084 617.4
+ vertex 121.14483512149562 -95.69901809900362 617.4
+ vertex 121.335665377625 -95.00925344381999 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985394 -100.4820272698084 617.4
+ vertex 121.335665377625 -95.00925344381999 617.4
+ vertex 121.62891295376008 -94.36902518559845 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985394 -100.4820272698084 617.4
+ vertex 121.62891295376008 -94.36902518559845 617.4
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 121.62891295376008 -94.36902518559845 617.4
+ vertex 142.51289504782767 -58.19690713431473 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 121.13921260616524 -95.74242516819555 617.4
+ vertex 121.07305832758567 -96.49857203241156 617.4
+ vertex 121.08292162982879 -96.40669254700175 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 124.4505819046373 -100.42011377814158 617.4
+ vertex 150.02753457015436 -104.48202726980841 617.4
+ vertex 125.15825635263542 -100.4820272698084 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 125.15825635263542 -100.4820272698084 617.4
+ vertex 150.02753457015436 -104.48202726980841 617.4
+ vertex 150.55309081768115 -100.48202726980841 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 150.55309081768115 -100.48202726980841 617.4
+ vertex 150.02753457015436 -104.48202726980841 617.4
+ vertex 162.26899907810125 -80.18947890594492 617.4
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 121.6564475239141 -94.32133391112718 617.4
+ vertex 142.51289504782767 -58.19690713431473 617.4
+ vertex 121.62891295376008 -94.36902518559845 617.4
+ endloop
+endfacet
+facet normal -0.2588190451025147 -0.9659258262890701 1.5010751463383359e-16
+ outer loop
+ vertex 147.43608501269742 -56.40501252946406 617.4
+ vertex 146.74991289470117 -56.22115326457821 597.4
+ vertex 147.43608501269742 -56.40501252946406 597.4
+ endloop
+endfacet
+facet normal -0.2588190451025147 -0.9659258262890701 1.5010751463383359e-16
+ outer loop
+ vertex 146.74991289470117 -56.22115326457821 597.4
+ vertex 147.43608501269742 -56.40501252946406 617.4
+ vertex 146.74991289470117 -56.22115326457821 617.4
+ endloop
+endfacet
+facet normal -0.819152044288985 -0.5735764363510556 2.9557539514214894e-16
+ outer loop
+ vertex 149.57158184557838 -58.19690713431471 617.4
+ vertex 149.16412596495886 -57.61499983057261 597.4
+ vertex 149.57158184557838 -58.19690713431471 597.4
+ endloop
+endfacet
+facet normal -0.819152044288985 -0.5735764363510556 2.9557539514214894e-16
+ outer loop
+ vertex 149.16412596495886 -57.61499983057261 597.4
+ vertex 149.57158184557838 -58.19690713431471 617.4
+ vertex 149.16412596495888 -57.61499983057261 617.4
+ endloop
+endfacet
+facet normal 0.5735764363510415 0.8191520442889951 -2.3714292307799455e-16
+ outer loop
+ vertex 122.53868168749001 -99.5285800652576 617.4
+ vertex 123.12058899123211 -99.93603594587711 597.4
+ vertex 122.53868168748998 -99.52858006525759 597.4
+ endloop
+endfacet
+facet normal 0.5735764363510415 0.8191520442889951 -2.3714292307799455e-16
+ outer loop
+ vertex 123.12058899123211 -99.93603594587711 597.4
+ vertex 122.53868168749001 -99.5285800652576 617.4
+ vertex 123.12058899123213 -99.93603594587711 617.4
+ endloop
+endfacet
+facet normal 7.771561172376096e-16 1.0 -7.227945163972795e-17
+ outer loop
+ vertex 125.15825635263542 -100.4820272698084 617.4
+ vertex 150.55309081768115 -100.48202726980841 597.4
+ vertex 125.15825635263542 -100.4820272698084 597.4
+ endloop
+endfacet
+facet normal 7.771561172376096e-16 1.0 -7.227945163972795e-17
+ outer loop
+ vertex 150.55309081768115 -100.48202726980841 597.4
+ vertex 125.15825635263542 -100.4820272698084 617.4
+ vertex 150.55309081768115 -100.48202726980841 617.4
+ endloop
+endfacet
+facet normal 0.9063077870366479 0.42261826174070405 -3.1170170299139537e-16
+ outer loop
+ vertex 121.32869438638144 -97.80053911299616 617.4
+ vertex 121.62891295376006 -98.44435990840508 597.4
+ vertex 121.32869438638144 -97.80053911299616 597.4
+ endloop
+endfacet
+facet normal 0.9063077870366479 0.42261826174070405 -3.1170170299139537e-16
+ outer loop
+ vertex 121.62891295376006 -98.44435990840508 597.4
+ vertex 121.32869438638144 -97.80053911299616 617.4
+ vertex 121.62891295376008 -98.44435990840508 617.4
+ endloop
+endfacet
+facet normal 0.9659258262890714 0.2588190451025095 -3.183571123239198e-16
+ outer loop
+ vertex 121.14483512149562 -97.11436699499988 597.4
+ vertex 121.32869438638144 -97.80053911299616 617.4
+ vertex 121.32869438638144 -97.80053911299616 597.4
+ endloop
+endfacet
+facet normal 0.9659258262890714 0.2588190451025095 -3.183571123239198e-16
+ outer loop
+ vertex 121.32869438638144 -97.80053911299616 617.4
+ vertex 121.14483512149562 -97.11436699499988 597.4
+ vertex 121.14483512149562 -97.1143669949999 617.4
+ endloop
+endfacet
+facet normal -0.4226182617407051 -0.9063077870366475 1.9661219995849976e-16
+ outer loop
+ vertex 148.07990580810633 -56.70523109684268 617.4
+ vertex 147.43608501269742 -56.40501252946406 597.4
+ vertex 148.07990580810633 -56.70523109684268 597.4
+ endloop
+endfacet
+facet normal -0.4226182617407051 -0.9063077870366475 1.9661219995849976e-16
+ outer loop
+ vertex 147.43608501269742 -56.40501252946406 597.4
+ vertex 148.07990580810633 -56.70523109684268 617.4
+ vertex 147.43608501269742 -56.40501252946406 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844387 -0.5000000000000003 3.0479839899610575e-16
+ outer loop
+ vertex 162.26899907810125 -80.18947890594492 617.4
+ vertex 149.57158184557838 -58.19690713431471 597.4
+ vertex 162.26899907810125 -80.18947890594492 597.4
+ endloop
+endfacet
+facet normal -0.8660254037844387 -0.5000000000000003 3.0479839899610575e-16
+ outer loop
+ vertex 149.57158184557838 -58.19690713431471 597.4
+ vertex 162.26899907810125 -80.18947890594492 617.4
+ vertex 149.57158184557838 -58.19690713431471 617.4
+ endloop
+endfacet
+facet normal 0.819152044288985 0.5735764363510556 -2.9557539514214894e-16
+ outer loop
+ vertex 121.62891295376008 -98.44435990840508 617.4
+ vertex 122.0363688343796 -99.02626721214719 597.4
+ vertex 121.62891295376006 -98.44435990840508 597.4
+ endloop
+endfacet
+facet normal 0.819152044288985 0.5735764363510556 -2.9557539514214894e-16
+ outer loop
+ vertex 122.0363688343796 -99.02626721214719 597.4
+ vertex 121.62891295376008 -98.44435990840508 617.4
+ vertex 122.0363688343796 -99.02626721214719 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 2.3251894735637803e-16
+ outer loop
+ vertex 162.26899907810125 -80.18947890594492 617.4
+ vertex 150.55309081768115 -100.48202726980841 597.4
+ vertex 150.55309081768115 -100.48202726980841 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 2.3251894735637803e-16
+ outer loop
+ vertex 150.55309081768115 -100.48202726980841 597.4
+ vertex 162.26899907810125 -80.18947890594492 617.4
+ vertex 162.26899907810125 -80.18947890594492 597.4
+ endloop
+endfacet
+facet normal 0.4226182617407051 0.9063077870366475 -1.9661219995849976e-16
+ outer loop
+ vertex 123.12058899123213 -99.93603594587711 617.4
+ vertex 123.76440978664102 -100.23625451325573 597.4
+ vertex 123.12058899123211 -99.93603594587711 597.4
+ endloop
+endfacet
+facet normal 0.4226182617407051 0.9063077870366475 -1.9661219995849976e-16
+ outer loop
+ vertex 123.76440978664102 -100.23625451325573 597.4
+ vertex 123.12058899123213 -99.93603594587711 617.4
+ vertex 123.76440978664105 -100.23625451325573 617.4
+ endloop
+endfacet
+facet normal 0.2223220049061556 0.9749732950878743 -1.3943933742722982e-16
+ outer loop
+ vertex 136.6703225694756 -29.02284346173925 617.4
+ vertex 137.09297230028596 -29.11921977891656 597.4
+ vertex 136.6703225694756 -29.02284346173925 597.4
+ endloop
+endfacet
+facet normal 0.2223220049061556 0.9749732950878743 -1.3943933742722982e-16
+ outer loop
+ vertex 137.09297230028596 -29.11921977891656 597.4
+ vertex 136.6703225694756 -29.02284346173925 617.4
+ vertex 137.09297230028596 -29.11921977891657 617.4
+ endloop
+endfacet
+facet normal -0.7331906391044605 -0.680023151612938 2.76602331194035e-16
+ outer loop
+ vertex 93.73693564691287 -104.21407807737724 617.4
+ vertex 93.44214644250893 -103.89624083218146 597.4
+ vertex 93.73693564691287 -104.21407807737724 597.4
+ endloop
+endfacet
+facet normal -0.7331906391044605 -0.680023151612938 2.76602331194035e-16
+ outer loop
+ vertex 93.44214644250893 -103.89624083218146 597.4
+ vertex 93.73693564691287 -104.21407807737724 617.4
+ vertex 93.44214644250894 -103.89624083218146 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 2.3251894735637803e-16
+ outer loop
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 113.13435723985394 -100.4820272698084 617.4
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 2.3251894735637803e-16
+ outer loop
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 143.55963228918768 -47.78390505010477 617.4
+ vertex 143.55963228918765 -47.783905050104764 597.4
+ endloop
+endfacet
+facet normal -0.582933426294525 0.8125199200687485 1.221092966018723e-16
+ outer loop
+ vertex 136.2476728386652 -29.11921977891656 617.4
+ vertex 135.85382598854787 -29.401780843702255 597.4
+ vertex 135.85382598854787 -29.401780843702255 617.4
+ endloop
+endfacet
+facet normal -0.582933426294525 0.8125199200687485 1.221092966018723e-16
+ outer loop
+ vertex 135.85382598854787 -29.401780843702255 597.4
+ vertex 136.2476728386652 -29.11921977891656 617.4
+ vertex 136.2476728386652 -29.11921977891656 597.4
+ endloop
+endfacet
+facet normal -0.9555126440105887 -0.2949501434749512 3.1773826761945216e-16
+ outer loop
+ vertex 93.44214644250894 -103.89624083218146 617.4
+ vertex 93.31428591610249 -103.48202726980837 597.4
+ vertex 93.44214644250893 -103.89624083218146 597.4
+ endloop
+endfacet
+facet normal -0.9555126440105887 -0.2949501434749512 3.1773826761945216e-16
+ outer loop
+ vertex 93.31428591610249 -103.48202726980837 597.4
+ vertex 93.44214644250894 -103.89624083218146 617.4
+ vertex 93.31428591610249 -103.48202726980837 617.4
+ endloop
+endfacet
+facet normal -0.41219617871316916 -0.9110951159205395 1.9372508358990654e-16
+ outer loop
+ vertex 94.17856413219634 -104.41387892238649 617.4
+ vertex 93.73693564691287 -104.21407807737724 597.4
+ vertex 94.17856413219633 -104.41387892238649 597.4
+ endloop
+endfacet
+facet normal -0.41219617871316916 -0.9110951159205395 1.9372508358990654e-16
+ outer loop
+ vertex 93.73693564691287 -104.21407807737724 597.4
+ vertex 94.17856413219634 -104.41387892238649 617.4
+ vertex 93.73693564691287 -104.21407807737724 617.4
+ endloop
+endfacet
+facet normal -0.1211494213554683 -0.9926342819514321 1.0933007317951958e-16
+ outer loop
+ vertex 94.73693564691287 -104.48202726980836 617.4
+ vertex 94.17856413219633 -104.41387892238649 597.4
+ vertex 94.73693564691287 -104.48202726980836 597.4
+ endloop
+endfacet
+facet normal -0.1211494213554683 -0.9926342819514321 1.0933007317951958e-16
+ outer loop
+ vertex 94.17856413219633 -104.41387892238649 597.4
+ vertex 94.73693564691287 -104.48202726980836 617.4
+ vertex 94.17856413219634 -104.41387892238649 617.4
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 -7.227945163972799e-17
+ outer loop
+ vertex 94.73693564691287 -100.48202726980837 617.4
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 94.73693564691285 -100.48202726980837 597.4
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 -7.227945163972799e-17
+ outer loop
+ vertex 113.13435723985393 -100.4820272698084 597.4
+ vertex 94.73693564691287 -100.48202726980837 617.4
+ vertex 113.13435723985394 -100.4820272698084 617.4
+ endloop
+endfacet
+facet normal -0.22232200490613963 0.9749732950878782 -1.5017328374354188e-18
+ outer loop
+ vertex 136.2476728386652 -29.11921977891656 617.4
+ vertex 136.6703225694756 -29.02284346173925 597.4
+ vertex 136.2476728386652 -29.11921977891656 597.4
+ endloop
+endfacet
+facet normal -0.22232200490613963 0.9749732950878782 -1.5017328374354188e-18
+ outer loop
+ vertex 136.6703225694756 -29.02284346173925 597.4
+ vertex 136.2476728386652 -29.11921977891656 617.4
+ vertex 136.6703225694756 -29.02284346173925 617.4
+ endloop
+endfacet
+facet normal -0.9202212155149952 0.39139866442810534 2.571812341015744e-16
+ outer loop
+ vertex 93.58223510853362 -102.48202726980837 617.4
+ vertex 93.36206755126861 -102.99966536001341 597.4
+ vertex 93.36206755126861 -102.99966536001341 617.4
+ endloop
+endfacet
+facet normal -0.9202212155149952 0.39139866442810534 2.571812341015744e-16
+ outer loop
+ vertex 93.36206755126861 -102.99966536001341 597.4
+ vertex 93.58223510853362 -102.48202726980837 617.4
+ vertex 93.58223510853361 -102.48202726980837 597.4
+ endloop
+endfacet
+facet normal -0.7990717941595372 0.6012356175233284 2.044313225968284e-16
+ outer loop
+ vertex 135.85382598854787 -29.401780843702255 617.4
+ vertex 135.51562203109634 -29.851270586485427 597.4
+ vertex 135.51562203109634 -29.851270586485427 617.4
+ endloop
+endfacet
+facet normal -0.7990717941595372 0.6012356175233284 2.044313225968284e-16
+ outer loop
+ vertex 135.51562203109634 -29.851270586485427 597.4
+ vertex 135.85382598854787 -29.401780843702255 617.4
+ vertex 135.85382598854787 -29.401780843702255 597.4
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015467 -117.88202726980845 599.2000000000002
+ vertex 150.02753457015473 -118.28202726980841 597.8000000000001
+ vertex 150.02753457015473 -117.8820272698084 597.8000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015473 -118.28202726980841 597.8000000000001
+ vertex 150.02753457015467 -117.88202726980845 599.2000000000002
+ vertex 150.0275345701548 -121.86791679764445 598.0545186779377
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015473 -118.28202726980841 597.8000000000001
+ vertex 150.0275345701548 -121.86791679764445 598.0545186779377
+ vertex 150.02753457015484 -122.28202726980847 598.0000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015473 -118.28202726980841 597.8000000000001
+ vertex 150.02753457015484 -122.28202726980847 598.0000000000001
+ vertex 150.0275345701549 -124.34805267359287 597.9000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701548 -121.86791679764445 598.0545186779377
+ vertex 150.02753457015467 -117.88202726980845 599.2000000000002
+ vertex 150.0275345701548 -121.48202726980844 598.214359353945
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701548 -121.48202726980844 598.214359353945
+ vertex 150.02753457015467 -117.88202726980845 599.2000000000002
+ vertex 150.02753457015476 -121.15065641990998 598.4686291501016
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015476 -121.15065641990998 598.4686291501016
+ vertex 150.02753457015467 -117.88202726980845 599.2000000000002
+ vertex 150.02753457015476 -120.89638662375333 598.8000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015476 -120.89638662375333 598.8000000000002
+ vertex 150.02753457015467 -117.88202726980845 599.2000000000002
+ vertex 150.02753457015476 -120.73654594774594 599.1858895278361
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015476 -120.73654594774594 599.1858895278361
+ vertex 150.02753457015467 -117.88202726980845 599.2000000000002
+ vertex 150.02753457015476 -120.08202726980845 599.2000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015476 -120.73654594774594 599.1858895278361
+ vertex 150.02753457015476 -120.08202726980845 599.2000000000002
+ vertex 150.02753457015476 -120.68202726980844 599.6000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015476 -120.68202726980844 599.6000000000001
+ vertex 150.02753457015476 -120.08202726980845 599.2000000000002
+ vertex 150.02753457015461 -120.08202726980845 601.2343145750508
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015476 -120.68202726980844 599.6000000000001
+ vertex 150.02753457015461 -120.08202726980845 601.2343145750508
+ vertex 150.02753457015473 -120.73654594774594 600.0141104721642
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015473 -120.73654594774594 600.0141104721642
+ vertex 150.02753457015461 -120.08202726980845 601.2343145750508
+ vertex 150.02753457015473 -120.89638662375336 600.4000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015473 -120.89638662375336 600.4000000000002
+ vertex 150.02753457015461 -120.08202726980845 601.2343145750508
+ vertex 150.0275345701547 -121.15065641990995 600.7313708498986
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701547 -121.15065641990995 600.7313708498986
+ vertex 150.02753457015461 -120.08202726980845 601.2343145750508
+ vertex 150.02753457015467 -121.48202726980844 600.9856406460553
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015467 -121.48202726980844 600.9856406460553
+ vertex 150.02753457015461 -120.08202726980845 601.2343145750508
+ vertex 150.0275345701547 -121.86791679764438 601.1454813220627
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701547 -121.86791679764438 601.1454813220627
+ vertex 150.02753457015461 -120.08202726980845 601.2343145750508
+ vertex 150.02753457015467 -122.28202726980842 601.2000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015436 -105.22320822470594 597.434074173711
+ vertex 150.02753457015456 -110.68202726980844 597.4000000000001
+ vertex 150.0275345701544 -105.48202726980847 597.4000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015456 -110.68202726980844 597.4000000000001
+ vertex 150.02753457015436 -105.22320822470594 597.434074173711
+ vertex 150.0275345701545 -110.68202726980842 597.8000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701545 -110.68202726980842 597.8000000000001
+ vertex 150.02753457015436 -105.22320822470594 597.434074173711
+ vertex 150.02753457015436 -104.98202726980846 597.5339745962157
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701545 -110.68202726980842 597.8000000000001
+ vertex 150.02753457015436 -104.98202726980846 597.5339745962157
+ vertex 150.02753457015433 -104.77492048862187 597.6928932188135
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701545 -110.68202726980842 597.8000000000001
+ vertex 150.02753457015433 -104.77492048862187 597.6928932188135
+ vertex 150.02753457015433 -104.61600186602396 597.9000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701545 -110.68202726980842 597.8000000000001
+ vertex 150.02753457015433 -104.61600186602396 597.9000000000001
+ vertex 150.02753457015453 -111.08202726980842 597.8000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015453 -111.08202726980842 597.8000000000001
+ vertex 150.02753457015433 -104.61600186602396 597.9000000000001
+ vertex 150.0275345701544 -106.68202726980843 598.0000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015453 -111.08202726980842 597.8000000000001
+ vertex 150.0275345701544 -106.68202726980843 598.0000000000001
+ vertex 150.02753457015436 -107.09613774197248 598.0545186779376
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015453 -111.08202726980842 597.8000000000001
+ vertex 150.02753457015436 -107.09613774197248 598.0545186779376
+ vertex 150.0275345701545 -111.08202726980839 599.2000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701545 -111.08202726980839 599.2000000000002
+ vertex 150.02753457015436 -107.09613774197248 598.0545186779376
+ vertex 150.02753457015444 -107.48202726980843 598.214359353945
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701545 -111.08202726980839 599.2000000000002
+ vertex 150.02753457015444 -107.48202726980843 598.214359353945
+ vertex 150.0275345701544 -107.81339811970692 598.4686291501016
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701545 -111.08202726980839 599.2000000000002
+ vertex 150.0275345701544 -107.81339811970692 598.4686291501016
+ vertex 150.0275345701544 -108.06766791586355 598.8000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701545 -111.08202726980839 599.2000000000002
+ vertex 150.0275345701544 -108.06766791586355 598.8000000000002
+ vertex 150.0275345701544 -108.22750859187094 599.1858895278361
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701545 -111.08202726980839 599.2000000000002
+ vertex 150.0275345701544 -108.22750859187094 599.1858895278361
+ vertex 150.0275345701544 -108.88202726980845 599.2000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701544 -108.88202726980845 599.2000000000002
+ vertex 150.0275345701544 -108.22750859187094 599.1858895278361
+ vertex 150.0275345701544 -108.28202726980844 599.6000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701544 -108.88202726980845 599.2000000000002
+ vertex 150.0275345701544 -108.28202726980844 599.6000000000001
+ vertex 150.02753457015433 -108.88202726980842 601.2343145750509
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015433 -108.88202726980842 601.2343145750509
+ vertex 150.0275345701544 -108.28202726980844 599.6000000000001
+ vertex 150.02753457015436 -108.22750859187094 600.0141104721642
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015433 -108.88202726980842 601.2343145750509
+ vertex 150.02753457015436 -108.22750859187094 600.0141104721642
+ vertex 150.02753457015433 -108.06766791586354 600.4000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015433 -108.88202726980842 601.2343145750509
+ vertex 150.02753457015433 -108.06766791586354 600.4000000000002
+ vertex 150.02753457015433 -107.81339811970689 600.7313708498987
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015433 -108.88202726980842 601.2343145750509
+ vertex 150.02753457015433 -107.81339811970689 600.7313708498987
+ vertex 150.0275345701543 -107.48202726980843 600.9856406460553
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015433 -108.88202726980842 601.2343145750509
+ vertex 150.0275345701543 -107.48202726980843 600.9856406460553
+ vertex 150.02753457015427 -107.09613774197246 601.1454813220627
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015433 -108.88202726980842 601.2343145750509
+ vertex 150.02753457015427 -107.09613774197246 601.1454813220627
+ vertex 150.02753457015424 -106.68202726980843 601.2000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015368 -104.48202726980846 616.4000000000001
+ vertex 150.0275345701539 -104.88202726980843 611.2000000000002
+ vertex 150.02753457015385 -104.48202726980846 611.2000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701539 -104.88202726980843 611.2000000000002
+ vertex 150.02753457015368 -104.48202726980846 616.4000000000001
+ vertex 150.02753457015376 -105.13654594774594 614.785889527836
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701539 -104.88202726980843 611.2000000000002
+ vertex 150.02753457015376 -105.13654594774594 614.785889527836
+ vertex 150.02753457015376 -105.29638662375334 614.4000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701539 -104.88202726980843 611.2000000000002
+ vertex 150.02753457015376 -105.29638662375334 614.4000000000001
+ vertex 150.02753457015382 -106.28202726980847 613.0000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015382 -106.28202726980847 613.0000000000001
+ vertex 150.02753457015376 -105.29638662375334 614.4000000000001
+ vertex 150.02753457015376 -105.55065641990998 614.0686291501016
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015382 -106.28202726980847 613.0000000000001
+ vertex 150.02753457015376 -105.55065641990998 614.0686291501016
+ vertex 150.0275345701538 -105.88202726980848 613.814359353945
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015382 -106.28202726980847 613.0000000000001
+ vertex 150.0275345701538 -105.88202726980848 613.814359353945
+ vertex 150.0275345701538 -106.26791679764442 613.6545186779376
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015382 -106.28202726980847 613.0000000000001
+ vertex 150.0275345701538 -106.26791679764442 613.6545186779376
+ vertex 150.0275345701539 -108.31634184485921 613.0000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701539 -108.31634184485921 613.0000000000001
+ vertex 150.0275345701538 -106.26791679764442 613.6545186779376
+ vertex 150.02753457015382 -106.68202726980847 613.6000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701539 -108.31634184485921 613.0000000000001
+ vertex 150.02753457015382 -106.68202726980847 613.6000000000001
+ vertex 150.0275345701539 -108.88202726980845 613.5656854249494
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015376 -105.13654594774594 614.785889527836
+ vertex 150.02753457015368 -104.48202726980846 616.4000000000001
+ vertex 150.0275345701537 -105.08202726980845 615.2000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701537 -105.08202726980845 615.2000000000002
+ vertex 150.02753457015368 -104.48202726980846 616.4000000000001
+ vertex 150.02753457015373 -105.13654594774594 615.6141104721642
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015373 -105.13654594774594 615.6141104721642
+ vertex 150.02753457015368 -104.48202726980846 616.4000000000001
+ vertex 150.0275345701537 -105.29638662375334 616.0000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701537 -105.29638662375334 616.0000000000001
+ vertex 150.02753457015368 -104.48202726980846 616.4000000000001
+ vertex 150.02753457015368 -105.55065641990996 616.3313708498986
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015368 -105.55065641990996 616.3313708498986
+ vertex 150.02753457015368 -104.48202726980846 616.4000000000001
+ vertex 150.0275345701537 -105.88202726980843 616.5856406460553
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701537 -105.88202726980843 616.5856406460553
+ vertex 150.02753457015368 -104.48202726980846 616.4000000000001
+ vertex 150.02753457015362 -104.51610144351939 616.6588190451026
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701537 -105.88202726980843 616.5856406460553
+ vertex 150.02753457015362 -104.51610144351939 616.6588190451026
+ vertex 150.02753457015368 -106.26791679764439 616.7454813220626
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015368 -106.26791679764439 616.7454813220626
+ vertex 150.02753457015362 -104.51610144351939 616.6588190451026
+ vertex 150.02753457015365 -104.61600186602402 616.9000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015368 -106.26791679764439 616.7454813220626
+ vertex 150.02753457015365 -104.61600186602402 616.9000000000001
+ vertex 150.0275345701537 -106.68202726980843 616.8000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701539 -108.88202726980845 613.5656854249494
+ vertex 150.02753457015382 -108.06766791586355 614.4000000000001
+ vertex 150.0275345701538 -108.88202726980845 615.6000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015382 -108.06766791586355 614.4000000000001
+ vertex 150.0275345701539 -108.88202726980845 613.5656854249494
+ vertex 150.02753457015382 -107.81339811970695 614.0686291501017
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015382 -107.81339811970695 614.0686291501017
+ vertex 150.0275345701539 -108.88202726980845 613.5656854249494
+ vertex 150.02753457015388 -107.48202726980847 613.814359353945
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015388 -107.48202726980847 613.814359353945
+ vertex 150.0275345701539 -108.88202726980845 613.5656854249494
+ vertex 150.02753457015382 -107.0961377419725 613.6545186779376
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015382 -107.0961377419725 613.6545186779376
+ vertex 150.0275345701539 -108.88202726980845 613.5656854249494
+ vertex 150.02753457015382 -106.68202726980847 613.6000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701538 -108.88202726980845 615.6000000000001
+ vertex 150.02753457015382 -108.06766791586355 614.4000000000001
+ vertex 150.02753457015385 -108.22750859187097 614.785889527836
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701538 -108.88202726980845 615.6000000000001
+ vertex 150.02753457015385 -108.22750859187097 614.785889527836
+ vertex 150.02753457015382 -108.28202726980842 615.2000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701538 -108.88202726980845 615.6000000000001
+ vertex 150.02753457015382 -108.28202726980842 615.2000000000002
+ vertex 150.0275345701538 -108.22750859187097 615.6141104721642
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701538 -108.88202726980845 615.6000000000001
+ vertex 150.0275345701538 -108.22750859187097 615.6141104721642
+ vertex 150.0275345701539 -111.08202726980842 615.6000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701539 -111.08202726980842 615.6000000000001
+ vertex 150.0275345701538 -108.22750859187097 615.6141104721642
+ vertex 150.0275345701538 -111.08202726980844 617.0000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701538 -111.08202726980844 617.0000000000002
+ vertex 150.0275345701538 -108.22750859187097 615.6141104721642
+ vertex 150.0275345701538 -108.06766791586355 616.0000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701538 -111.08202726980844 617.0000000000002
+ vertex 150.0275345701538 -108.06766791586355 616.0000000000001
+ vertex 150.02753457015376 -107.81339811970692 616.3313708498987
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701538 -111.08202726980844 617.0000000000002
+ vertex 150.02753457015376 -107.81339811970692 616.3313708498987
+ vertex 150.02753457015373 -107.48202726980844 616.5856406460553
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701538 -111.08202726980844 617.0000000000002
+ vertex 150.02753457015373 -107.48202726980844 616.5856406460553
+ vertex 150.0275345701537 -107.09613774197244 616.7454813220626
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701538 -111.08202726980844 617.0000000000002
+ vertex 150.0275345701537 -107.09613774197244 616.7454813220626
+ vertex 150.0275345701537 -106.68202726980843 616.8000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701538 -111.08202726980844 617.0000000000002
+ vertex 150.0275345701537 -106.68202726980843 616.8000000000002
+ vertex 150.02753457015365 -104.61600186602402 616.9000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701538 -111.08202726980844 617.0000000000002
+ vertex 150.02753457015365 -104.61600186602402 616.9000000000001
+ vertex 150.02753457015382 -110.68202726980846 617.0000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015382 -110.68202726980846 617.0000000000002
+ vertex 150.02753457015365 -104.61600186602402 616.9000000000001
+ vertex 150.0275345701536 -104.7749204886219 617.1071067811868
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015382 -110.68202726980846 617.0000000000002
+ vertex 150.0275345701536 -104.7749204886219 617.1071067811868
+ vertex 150.0275345701538 -110.68202726980844 617.4000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701538 -110.68202726980844 617.4000000000002
+ vertex 150.0275345701536 -104.7749204886219 617.1071067811868
+ vertex 150.02753457015365 -104.98202726980846 617.2660254037846
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701538 -110.68202726980844 617.4000000000002
+ vertex 150.02753457015365 -104.98202726980846 617.2660254037846
+ vertex 150.02753457015365 -105.22320822470594 617.3659258262892
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701538 -110.68202726980844 617.4000000000002
+ vertex 150.02753457015365 -105.22320822470594 617.3659258262892
+ vertex 150.02753457015362 -105.48202726980846 617.4000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015461 -120.08202726980845 601.2343145750508
+ vertex 150.02753457015467 -120.64771269475769 601.8000000000001
+ vertex 150.0275345701547 -122.68202726980844 601.8000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015467 -120.64771269475769 601.8000000000001
+ vertex 150.02753457015461 -120.08202726980845 601.2343145750508
+ vertex 150.02753457015447 -117.61634184485919 603.7000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015467 -120.64771269475769 601.8000000000001
+ vertex 150.02753457015447 -117.61634184485919 603.7000000000002
+ vertex 150.02753457015453 -118.18202726980843 604.2656854249494
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015453 -118.18202726980843 604.2656854249494
+ vertex 150.02753457015447 -117.61634184485919 603.7000000000002
+ vertex 150.0275345701543 -111.3477126947577 603.7000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015453 -118.18202726980843 604.2656854249494
+ vertex 150.0275345701543 -111.3477126947577 603.7000000000002
+ vertex 150.0275345701543 -110.78202726980844 604.2656854249494
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015453 -118.18202726980843 604.2656854249494
+ vertex 150.0275345701543 -110.78202726980844 604.2656854249494
+ vertex 150.0275345701544 -114.48202726980843 604.7000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701544 -114.48202726980843 604.7000000000002
+ vertex 150.0275345701543 -110.78202726980844 604.2656854249494
+ vertex 150.02753457015433 -113.78321584803162 604.7920002690196
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015433 -113.78321584803162 604.7920002690196
+ vertex 150.0275345701543 -110.78202726980844 604.2656854249494
+ vertex 150.0275345701543 -113.13202726980845 605.0617314097822
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701543 -113.13202726980845 605.0617314097822
+ vertex 150.0275345701543 -110.78202726980844 604.2656854249494
+ vertex 150.02753457015427 -112.57283896060474 605.4908116907965
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -112.57283896060474 605.4908116907965
+ vertex 150.0275345701543 -110.78202726980844 604.2656854249494
+ vertex 150.02753457015427 -112.14375867959046 606.0500000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -112.14375867959046 606.0500000000002
+ vertex 150.0275345701543 -110.78202726980844 604.2656854249494
+ vertex 150.02753457015422 -111.87402753882797 606.7011885782233
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -111.87402753882797 606.7011885782233
+ vertex 150.0275345701543 -110.78202726980844 604.2656854249494
+ vertex 150.02753457015405 -110.78202726980844 610.5343145750509
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -111.87402753882797 606.7011885782233
+ vertex 150.02753457015405 -110.78202726980844 610.5343145750509
+ vertex 150.02753457015422 -111.78202726980847 607.4000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -111.78202726980847 607.4000000000001
+ vertex 150.02753457015405 -110.78202726980844 610.5343145750509
+ vertex 150.02753457015416 -111.87402753882795 608.098811421777
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015416 -111.87402753882795 608.098811421777
+ vertex 150.02753457015405 -110.78202726980844 610.5343145750509
+ vertex 150.02753457015416 -112.14375867959048 608.7500000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015416 -112.14375867959048 608.7500000000001
+ vertex 150.02753457015405 -110.78202726980844 610.5343145750509
+ vertex 150.02753457015416 -112.57283896060477 609.3091883092038
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015416 -112.57283896060477 609.3091883092038
+ vertex 150.02753457015405 -110.78202726980844 610.5343145750509
+ vertex 150.02753457015413 -113.13202726980845 609.7382685902181
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015413 -113.13202726980845 609.7382685902181
+ vertex 150.02753457015405 -110.78202726980844 610.5343145750509
+ vertex 150.02753457015416 -113.78321584803162 610.0079997309806
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015416 -113.78321584803162 610.0079997309806
+ vertex 150.02753457015405 -110.78202726980844 610.5343145750509
+ vertex 150.0275345701542 -114.48202726980846 610.1000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015473 -118.28202726980841 597.8000000000001
+ vertex 150.0275345701549 -123.48202726980844 597.4000000000001
+ vertex 150.02753457015476 -118.28202726980841 597.4000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701549 -123.48202726980844 597.4000000000001
+ vertex 150.02753457015473 -118.28202726980841 597.8000000000001
+ vertex 150.0275345701549 -123.74084631491097 597.434074173711
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701549 -123.74084631491097 597.434074173711
+ vertex 150.02753457015473 -118.28202726980841 597.8000000000001
+ vertex 150.02753457015493 -123.98202726980844 597.5339745962157
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015493 -123.98202726980844 597.5339745962157
+ vertex 150.02753457015473 -118.28202726980841 597.8000000000001
+ vertex 150.0275345701549 -124.18913405099497 597.6928932188135
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701549 -124.18913405099497 597.6928932188135
+ vertex 150.02753457015473 -118.28202726980841 597.8000000000001
+ vertex 150.0275345701549 -124.34805267359287 597.9000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015433 -104.51610144351935 598.1411809548977
+ vertex 150.0275345701544 -106.68202726980843 598.0000000000001
+ vertex 150.02753457015433 -104.61600186602396 597.9000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701544 -106.68202726980843 598.0000000000001
+ vertex 150.02753457015433 -104.51610144351935 598.1411809548977
+ vertex 150.02753457015436 -106.26791679764442 598.0545186779376
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015436 -106.26791679764442 598.0545186779376
+ vertex 150.02753457015433 -104.51610144351935 598.1411809548977
+ vertex 150.0275345701544 -105.88202726980843 598.214359353945
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701544 -105.88202726980843 598.214359353945
+ vertex 150.02753457015433 -104.51610144351935 598.1411809548977
+ vertex 150.02753457015433 -104.48202726980843 598.4000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701544 -105.88202726980843 598.214359353945
+ vertex 150.02753457015433 -104.48202726980843 598.4000000000002
+ vertex 150.02753457015433 -105.55065641990996 598.4686291501016
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015433 -105.55065641990996 598.4686291501016
+ vertex 150.02753457015433 -104.48202726980843 598.4000000000002
+ vertex 150.0275345701543 -105.29638662375332 598.8000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701543 -105.29638662375332 598.8000000000001
+ vertex 150.02753457015433 -104.48202726980843 598.4000000000002
+ vertex 150.02753457015433 -105.13654594774593 599.1858895278361
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015433 -105.13654594774593 599.1858895278361
+ vertex 150.02753457015433 -104.48202726980843 598.4000000000002
+ vertex 150.02753457015413 -104.48202726980843 603.6000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015433 -105.13654594774593 599.1858895278361
+ vertex 150.02753457015413 -104.48202726980843 603.6000000000001
+ vertex 150.02753457015427 -105.0820272698084 599.6
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -105.0820272698084 599.6
+ vertex 150.02753457015413 -104.48202726980843 603.6000000000001
+ vertex 150.0275345701543 -105.1365459477459 600.0141104721641
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701543 -105.1365459477459 600.0141104721641
+ vertex 150.02753457015413 -104.48202726980843 603.6000000000001
+ vertex 150.02753457015427 -105.29638662375332 600.4000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -105.29638662375332 600.4000000000002
+ vertex 150.02753457015413 -104.48202726980843 603.6000000000001
+ vertex 150.02753457015422 -105.55065641990996 600.7313708498986
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -105.55065641990996 600.7313708498986
+ vertex 150.02753457015413 -104.48202726980843 603.6000000000001
+ vertex 150.02753457015424 -105.88202726980843 600.9856406460552
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -105.88202726980843 600.9856406460552
+ vertex 150.02753457015413 -104.48202726980843 603.6000000000001
+ vertex 150.02753457015424 -106.26791679764439 601.1454813220627
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -106.26791679764439 601.1454813220627
+ vertex 150.02753457015413 -104.48202726980843 603.6000000000001
+ vertex 150.02753457015424 -106.68202726980843 601.2000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -106.68202726980843 601.2000000000002
+ vertex 150.02753457015413 -104.48202726980843 603.6000000000001
+ vertex 150.02753457015424 -106.28202726980842 601.8000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -106.68202726980843 601.2000000000002
+ vertex 150.02753457015424 -106.28202726980842 601.8000000000001
+ vertex 150.02753457015433 -108.88202726980842 601.2343145750509
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -106.28202726980842 601.8000000000001
+ vertex 150.02753457015413 -104.48202726980843 603.6000000000001
+ vertex 150.02753457015413 -104.88202726980845 603.6000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -106.28202726980842 601.8000000000001
+ vertex 150.02753457015413 -104.88202726980845 603.6000000000001
+ vertex 150.02753457015413 -106.28202726980845 604.0000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015413 -106.28202726980845 604.0000000000001
+ vertex 150.02753457015413 -104.88202726980845 603.6000000000001
+ vertex 150.0275345701541 -104.88202726980843 604.0000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015453 -118.18202726980843 604.2656854249494
+ vertex 150.02753457015436 -117.09002700078892 606.7011885782233
+ vertex 150.02753457015427 -118.18202726980844 610.5343145750509
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015436 -117.09002700078892 606.7011885782233
+ vertex 150.02753457015453 -118.18202726980843 604.2656854249494
+ vertex 150.02753457015442 -116.82029586002643 606.0500000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015442 -116.82029586002643 606.0500000000002
+ vertex 150.02753457015453 -118.18202726980843 604.2656854249494
+ vertex 150.0275345701544 -116.39121557901213 605.4908116907965
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701544 -116.39121557901213 605.4908116907965
+ vertex 150.02753457015453 -118.18202726980843 604.2656854249494
+ vertex 150.0275345701544 -115.83202726980844 605.0617314097822
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701544 -115.83202726980844 605.0617314097822
+ vertex 150.02753457015453 -118.18202726980843 604.2656854249494
+ vertex 150.0275345701544 -115.18083869158524 604.7920002690196
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701544 -115.18083869158524 604.7920002690196
+ vertex 150.02753457015453 -118.18202726980843 604.2656854249494
+ vertex 150.0275345701544 -114.48202726980843 604.7000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -118.18202726980844 610.5343145750509
+ vertex 150.02753457015436 -117.09002700078892 606.7011885782233
+ vertex 150.02753457015436 -117.18202726980846 607.4000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -118.18202726980844 610.5343145750509
+ vertex 150.02753457015436 -117.18202726980846 607.4000000000001
+ vertex 150.0275345701543 -117.09002700078892 608.098811421777
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -118.18202726980844 610.5343145750509
+ vertex 150.0275345701543 -117.09002700078892 608.098811421777
+ vertex 150.0275345701543 -116.82029586002643 608.7500000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -118.18202726980844 610.5343145750509
+ vertex 150.0275345701543 -116.82029586002643 608.7500000000001
+ vertex 150.02753457015424 -116.39121557901214 609.3091883092038
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -118.18202726980844 610.5343145750509
+ vertex 150.02753457015424 -116.39121557901214 609.3091883092038
+ vertex 150.02753457015422 -115.83202726980844 609.7382685902181
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -118.18202726980844 610.5343145750509
+ vertex 150.02753457015422 -115.83202726980844 609.7382685902181
+ vertex 150.02753457015422 -115.18083869158525 610.0079997309806
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -118.18202726980844 610.5343145750509
+ vertex 150.02753457015422 -115.18083869158525 610.0079997309806
+ vertex 150.0275345701542 -114.48202726980846 610.1000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -118.18202726980844 610.5343145750509
+ vertex 150.0275345701542 -114.48202726980846 610.1000000000001
+ vertex 150.02753457015405 -110.78202726980844 610.5343145750509
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -118.18202726980844 610.5343145750509
+ vertex 150.02753457015405 -110.78202726980844 610.5343145750509
+ vertex 150.02753457015402 -111.34771269475767 611.1000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015402 -111.34771269475767 611.1000000000001
+ vertex 150.02753457015405 -110.78202726980844 610.5343145750509
+ vertex 150.0275345701539 -108.31634184485921 613.0000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015402 -111.34771269475767 611.1000000000001
+ vertex 150.0275345701539 -108.31634184485921 613.0000000000001
+ vertex 150.0275345701539 -108.88202726980845 613.5656854249494
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701539 -104.88202726980843 610.8000000000002
+ vertex 150.02753457015382 -106.28202726980847 613.0000000000001
+ vertex 150.0275345701539 -106.28202726980842 610.8000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015382 -106.28202726980847 613.0000000000001
+ vertex 150.0275345701539 -104.88202726980843 610.8000000000002
+ vertex 150.0275345701539 -104.88202726980843 611.2000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -118.18202726980844 610.5343145750509
+ vertex 150.02753457015422 -117.61634184485916 611.1000000000001
+ vertex 150.02753457015422 -120.64771269475773 613.0000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -117.61634184485916 611.1000000000001
+ vertex 150.02753457015427 -118.18202726980844 610.5343145750509
+ vertex 150.02753457015402 -111.34771269475767 611.1000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -120.64771269475773 613.0000000000002
+ vertex 150.02753457015422 -117.61634184485916 611.1000000000001
+ vertex 150.02753457015422 -120.08202726980842 613.5656854249494
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -120.64771269475773 613.0000000000002
+ vertex 150.02753457015422 -120.08202726980842 613.5656854249494
+ vertex 150.02753457015433 -122.68202726980844 613.0000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015402 -117.88202726980849 617.0000000000002
+ vertex 150.02753457015416 -120.08202726980845 615.6000000000001
+ vertex 150.0275345701541 -117.88202726980845 615.6000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015416 -120.08202726980845 615.6000000000001
+ vertex 150.02753457015402 -117.88202726980849 617.0000000000002
+ vertex 150.02753457015416 -120.73654594774594 615.6141104721642
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015416 -120.73654594774594 615.6141104721642
+ vertex 150.02753457015402 -117.88202726980849 617.0000000000002
+ vertex 150.02753457015413 -120.89638662375332 616.0000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015413 -120.89638662375332 616.0000000000001
+ vertex 150.02753457015402 -117.88202726980849 617.0000000000002
+ vertex 150.02753457015413 -121.15065641990995 616.3313708498987
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015413 -121.15065641990995 616.3313708498987
+ vertex 150.02753457015402 -117.88202726980849 617.0000000000002
+ vertex 150.02753457015413 -121.48202726980843 616.5856406460553
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015413 -121.48202726980843 616.5856406460553
+ vertex 150.02753457015402 -117.88202726980849 617.0000000000002
+ vertex 150.0275345701541 -121.86791679764438 616.7454813220626
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701541 -121.86791679764438 616.7454813220626
+ vertex 150.02753457015402 -117.88202726980849 617.0000000000002
+ vertex 150.0275345701542 -122.28202726980844 616.8000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701542 -122.28202726980844 616.8000000000002
+ vertex 150.02753457015402 -117.88202726980849 617.0000000000002
+ vertex 150.02753457015422 -124.34805267359289 616.9000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -124.34805267359289 616.9000000000001
+ vertex 150.02753457015402 -117.88202726980849 617.0000000000002
+ vertex 150.02753457015402 -118.28202726980847 617.0000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -124.34805267359289 616.9000000000001
+ vertex 150.02753457015402 -118.28202726980847 617.0000000000002
+ vertex 150.02753457015422 -124.189134050995 617.1071067811868
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -124.189134050995 617.1071067811868
+ vertex 150.02753457015402 -118.28202726980847 617.0000000000002
+ vertex 150.027534570154 -118.2820272698085 617.4000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -124.189134050995 617.1071067811868
+ vertex 150.027534570154 -118.2820272698085 617.4000000000002
+ vertex 150.02753457015422 -123.98202726980844 617.2660254037846
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -123.98202726980844 617.2660254037846
+ vertex 150.027534570154 -118.2820272698085 617.4000000000002
+ vertex 150.02753457015422 -123.74084631491097 617.3659258262892
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -123.74084631491097 617.3659258262892
+ vertex 150.027534570154 -118.2820272698085 617.4000000000002
+ vertex 150.0275345701542 -123.48202726980846 617.4000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015442 -122.68202726980844 610.8000000000002
+ vertex 150.02753457015444 -124.08202726980846 611.2000000000002
+ vertex 150.02753457015444 -124.08202726980846 610.8000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015444 -124.08202726980846 611.2000000000002
+ vertex 150.02753457015442 -122.68202726980844 610.8000000000002
+ vertex 150.02753457015433 -122.68202726980844 613.0000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015444 -124.08202726980846 611.2000000000002
+ vertex 150.02753457015433 -122.68202726980844 613.0000000000002
+ vertex 150.02753457015444 -124.48202726980846 611.2000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015444 -124.48202726980846 611.2000000000002
+ vertex 150.02753457015433 -122.68202726980844 613.0000000000002
+ vertex 150.0275345701543 -123.66766791586357 614.4000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015444 -124.48202726980846 611.2000000000002
+ vertex 150.0275345701543 -123.66766791586357 614.4000000000001
+ vertex 150.02753457015427 -123.82750859187097 614.7858895278362
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015444 -124.48202726980846 611.2000000000002
+ vertex 150.02753457015427 -123.82750859187097 614.7858895278362
+ vertex 150.02753457015424 -124.48202726980848 616.4000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701543 -123.66766791586357 614.4000000000001
+ vertex 150.02753457015433 -122.68202726980844 613.0000000000002
+ vertex 150.0275345701543 -123.41339811970694 614.0686291501017
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701543 -123.41339811970694 614.0686291501017
+ vertex 150.02753457015433 -122.68202726980844 613.0000000000002
+ vertex 150.0275345701543 -123.08202726980846 613.814359353945
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701543 -123.08202726980846 613.814359353945
+ vertex 150.02753457015433 -122.68202726980844 613.0000000000002
+ vertex 150.0275345701543 -122.69613774197249 613.6545186779376
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701543 -122.69613774197249 613.6545186779376
+ vertex 150.02753457015433 -122.68202726980844 613.0000000000002
+ vertex 150.02753457015427 -122.28202726980847 613.6000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -122.28202726980847 613.6000000000001
+ vertex 150.02753457015433 -122.68202726980844 613.0000000000002
+ vertex 150.02753457015422 -120.08202726980842 613.5656854249494
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -124.48202726980848 616.4000000000001
+ vertex 150.02753457015427 -123.82750859187097 614.7858895278362
+ vertex 150.02753457015427 -123.88202726980846 615.2000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -124.48202726980848 616.4000000000001
+ vertex 150.02753457015427 -123.88202726980846 615.2000000000002
+ vertex 150.02753457015427 -123.82750859187097 615.6141104721642
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -124.48202726980848 616.4000000000001
+ vertex 150.02753457015427 -123.82750859187097 615.6141104721642
+ vertex 150.02753457015424 -123.66766791586355 616.0000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -124.48202726980848 616.4000000000001
+ vertex 150.02753457015424 -123.66766791586355 616.0000000000001
+ vertex 150.0275345701542 -123.41339811970691 616.3313708498987
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -124.48202726980848 616.4000000000001
+ vertex 150.0275345701542 -123.41339811970691 616.3313708498987
+ vertex 150.0275345701542 -123.08202726980844 616.5856406460553
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -124.48202726980848 616.4000000000001
+ vertex 150.0275345701542 -123.08202726980844 616.5856406460553
+ vertex 150.02753457015424 -124.44795309609752 616.6588190451026
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -124.44795309609752 616.6588190451026
+ vertex 150.0275345701542 -123.08202726980844 616.5856406460553
+ vertex 150.02753457015416 -122.69613774197248 616.7454813220627
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -124.44795309609752 616.6588190451026
+ vertex 150.02753457015416 -122.69613774197248 616.7454813220627
+ vertex 150.02753457015422 -124.34805267359289 616.9000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -124.34805267359289 616.9000000000001
+ vertex 150.02753457015416 -122.69613774197248 616.7454813220627
+ vertex 150.0275345701542 -122.28202726980844 616.8000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -120.08202726980842 613.5656854249494
+ vertex 150.02753457015424 -121.86791679764441 613.6545186779376
+ vertex 150.02753457015427 -122.28202726980847 613.6000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -121.86791679764441 613.6545186779376
+ vertex 150.02753457015422 -120.08202726980842 613.5656854249494
+ vertex 150.02753457015424 -121.48202726980847 613.814359353945
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -121.48202726980847 613.814359353945
+ vertex 150.02753457015422 -120.08202726980842 613.5656854249494
+ vertex 150.02753457015422 -121.15065641990998 614.0686291501016
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -121.15065641990998 614.0686291501016
+ vertex 150.02753457015422 -120.08202726980842 613.5656854249494
+ vertex 150.02753457015422 -120.89638662375336 614.4000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -120.89638662375336 614.4000000000001
+ vertex 150.02753457015422 -120.08202726980842 613.5656854249494
+ vertex 150.02753457015416 -120.08202726980845 615.6000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -120.89638662375336 614.4000000000001
+ vertex 150.02753457015416 -120.08202726980845 615.6000000000001
+ vertex 150.0275345701542 -120.73654594774592 614.785889527836
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701542 -120.73654594774592 614.785889527836
+ vertex 150.02753457015416 -120.08202726980845 615.6000000000001
+ vertex 150.0275345701542 -120.68202726980842 615.2000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701542 -120.68202726980842 615.2000000000002
+ vertex 150.02753457015416 -120.08202726980845 615.6000000000001
+ vertex 150.02753457015416 -120.73654594774594 615.6141104721642
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015433 -108.88202726980842 601.2343145750509
+ vertex 150.0275345701543 -108.31634184485917 601.8000000000001
+ vertex 150.0275345701543 -111.3477126947577 603.7000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701543 -108.31634184485917 601.8000000000001
+ vertex 150.02753457015433 -108.88202726980842 601.2343145750509
+ vertex 150.02753457015424 -106.28202726980842 601.8000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701543 -111.3477126947577 603.7000000000002
+ vertex 150.0275345701543 -108.31634184485917 601.8000000000001
+ vertex 150.0275345701543 -110.78202726980844 604.2656854249494
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015464 -122.68202726980844 604.0000000000001
+ vertex 150.02753457015467 -124.08202726980844 603.6
+ vertex 150.0275345701547 -122.68202726980844 601.8000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015467 -124.08202726980844 603.6
+ vertex 150.02753457015464 -122.68202726980844 604.0000000000001
+ vertex 150.02753457015467 -124.08202726980842 604.0000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015484 -122.28202726980847 598.0000000000001
+ vertex 150.02753457015487 -124.4479530960975 598.1411809548977
+ vertex 150.0275345701549 -124.34805267359287 597.9000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015487 -124.4479530960975 598.1411809548977
+ vertex 150.02753457015484 -122.28202726980847 598.0000000000001
+ vertex 150.02753457015484 -122.69613774197249 598.0545186779377
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015487 -124.4479530960975 598.1411809548977
+ vertex 150.02753457015484 -122.69613774197249 598.0545186779377
+ vertex 150.02753457015487 -123.08202726980849 598.214359353945
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015487 -124.4479530960975 598.1411809548977
+ vertex 150.02753457015487 -123.08202726980849 598.214359353945
+ vertex 150.02753457015487 -124.48202726980846 598.4000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015487 -124.48202726980846 598.4000000000002
+ vertex 150.02753457015487 -123.08202726980849 598.214359353945
+ vertex 150.02753457015487 -123.41339811970694 598.4686291501016
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015487 -124.48202726980846 598.4000000000002
+ vertex 150.02753457015487 -123.41339811970694 598.4686291501016
+ vertex 150.02753457015484 -123.66766791586357 598.8000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015487 -124.48202726980846 598.4000000000002
+ vertex 150.02753457015484 -123.66766791586357 598.8000000000002
+ vertex 150.02753457015487 -123.82750859187097 599.1858895278361
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015487 -124.48202726980846 598.4000000000002
+ vertex 150.02753457015487 -123.82750859187097 599.1858895278361
+ vertex 150.0275345701547 -124.48202726980841 603.6
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701547 -124.48202726980841 603.6
+ vertex 150.02753457015487 -123.82750859187097 599.1858895278361
+ vertex 150.0275345701548 -123.88202726980843 599.6000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701547 -124.48202726980841 603.6
+ vertex 150.0275345701548 -123.88202726980843 599.6000000000001
+ vertex 150.0275345701548 -123.82750859187097 600.0141104721642
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701547 -124.48202726980841 603.6
+ vertex 150.0275345701548 -123.82750859187097 600.0141104721642
+ vertex 150.0275345701548 -123.66766791586355 600.4000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701547 -124.48202726980841 603.6
+ vertex 150.0275345701548 -123.66766791586355 600.4000000000002
+ vertex 150.02753457015476 -123.41339811970691 600.7313708498987
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701547 -124.48202726980841 603.6
+ vertex 150.02753457015476 -123.41339811970691 600.7313708498987
+ vertex 150.02753457015476 -123.08202726980844 600.9856406460553
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701547 -124.48202726980841 603.6
+ vertex 150.02753457015476 -123.08202726980844 600.9856406460553
+ vertex 150.0275345701547 -122.69613774197248 601.1454813220627
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701547 -124.48202726980841 603.6
+ vertex 150.0275345701547 -122.69613774197248 601.1454813220627
+ vertex 150.02753457015467 -122.28202726980842 601.2000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701547 -124.48202726980841 603.6
+ vertex 150.02753457015467 -122.28202726980842 601.2000000000002
+ vertex 150.0275345701547 -122.68202726980844 601.8000000000001
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701547 -122.68202726980844 601.8000000000001
+ vertex 150.02753457015467 -122.28202726980842 601.2000000000002
+ vertex 150.02753457015461 -120.08202726980845 601.2343145750508
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701547 -124.48202726980841 603.6
+ vertex 150.0275345701547 -122.68202726980844 601.8000000000001
+ vertex 150.02753457015467 -124.08202726980844 603.6
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex -149.97246542984396 -123.48202726980844 597.4
+ vertex 150.02753457015476 -118.28202726980841 597.4000000000001
+ vertex 150.0275345701549 -123.48202726980844 597.4000000000001
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex 150.02753457015476 -118.28202726980841 597.4000000000001
+ vertex -149.97246542984396 -123.48202726980844 597.4
+ vertex -149.97246542984414 -118.28202726980835 597.4
+ endloop
+endfacet
+facet normal 4.164649241083378e-14 -0.1305261922200722 -0.9914448613738078
+ outer loop
+ vertex -149.97246542984396 -123.74084631491093 597.434074173711
+ vertex 150.0275345701549 -123.48202726980844 597.4000000000001
+ vertex 150.0275345701549 -123.74084631491097 597.434074173711
+ endloop
+endfacet
+facet normal 4.164649241083378e-14 -0.1305261922200722 -0.9914448613738078
+ outer loop
+ vertex 150.0275345701549 -123.48202726980844 597.4000000000001
+ vertex -149.97246542984396 -123.74084631491093 597.434074173711
+ vertex -149.97246542984396 -123.48202726980844 597.4
+ endloop
+endfacet
+facet normal 3.5926213864307125e-14 4.538832183921785e-15 -1.0
+ outer loop
+ vertex -149.97246542984422 -117.61634184485915 603.7
+ vertex 150.0275345701543 -111.3477126947577 603.7000000000002
+ vertex 150.02753457015447 -117.61634184485919 603.7000000000002
+ endloop
+endfacet
+facet normal 3.5926213864307125e-14 4.538832183921785e-15 -1.0
+ outer loop
+ vertex 150.0275345701543 -111.3477126947577 603.7000000000002
+ vertex -149.97246542984422 -117.61634184485915 603.7
+ vertex -149.97246542984445 -111.34771269475767 603.7
+ endloop
+endfacet
+facet normal 5.513731934900517e-14 -0.38268343236508134 -0.9238795325112904
+ outer loop
+ vertex -149.97246542984396 -123.98202726980841 597.5339745962156
+ vertex 150.0275345701549 -123.74084631491097 597.434074173711
+ vertex 150.02753457015493 -123.98202726980844 597.5339745962157
+ endloop
+endfacet
+facet normal 5.513731934900517e-14 -0.38268343236508134 -0.9238795325112904
+ outer loop
+ vertex 150.0275345701549 -123.74084631491097 597.434074173711
+ vertex -149.97246542984396 -123.98202726980841 597.5339745962156
+ vertex -149.97246542984396 -123.74084631491093 597.434074173711
+ endloop
+endfacet
+facet normal 5.200343766171889e-14 -0.6087614290087036 -0.7933533402912483
+ outer loop
+ vertex -149.97246542984396 -124.18913405099494 597.6928932188135
+ vertex 150.02753457015493 -123.98202726980844 597.5339745962157
+ vertex 150.0275345701549 -124.18913405099497 597.6928932188135
+ endloop
+endfacet
+facet normal 5.200343766171889e-14 -0.6087614290087036 -0.7933533402912483
+ outer loop
+ vertex 150.02753457015493 -123.98202726980844 597.5339745962157
+ vertex -149.97246542984396 -124.18913405099494 597.6928932188135
+ vertex -149.97246542984396 -123.98202726980841 597.5339745962156
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 7.797766215937039e-16
+ outer loop
+ vertex -149.9724654298442 -122.68202726980842 601.8000000000001
+ vertex 150.02753457015464 -122.68202726980844 604.0000000000001
+ vertex 150.0275345701547 -122.68202726980844 601.8000000000001
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 7.797766215937039e-16
+ outer loop
+ vertex 150.02753457015464 -122.68202726980844 604.0000000000001
+ vertex -149.9724654298442 -122.68202726980842 601.8000000000001
+ vertex -149.9724654298442 -122.68202726980842 604.0000000000001
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 6.227439144697608e-15
+ outer loop
+ vertex -149.97246542984414 -118.28202726980835 597.4
+ vertex 150.02753457015473 -118.28202726980841 597.8000000000001
+ vertex 150.02753457015476 -118.28202726980841 597.4000000000001
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 6.227439144697608e-15
+ outer loop
+ vertex 150.02753457015473 -118.28202726980841 597.8000000000001
+ vertex -149.97246542984414 -118.28202726980835 597.4
+ vertex -149.972465429844 -118.28202726980834 597.8000000000001
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex -149.9724654298441 -120.0820272698084 599.2
+ vertex 150.02753457015461 -120.08202726980845 601.2343145750508
+ vertex 150.02753457015476 -120.08202726980845 599.2000000000002
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex 150.02753457015461 -120.08202726980845 601.2343145750508
+ vertex -149.9724654298441 -120.0820272698084 599.2
+ vertex -149.9724654298442 -120.08202726980842 601.2343145750508
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex 150.02753457015433 -108.88202726980842 601.2343145750509
+ vertex -149.9724654298445 -108.88202726980838 599.2
+ vertex 150.0275345701544 -108.88202726980845 599.2000000000002
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex -149.9724654298445 -108.88202726980838 599.2
+ vertex 150.02753457015433 -108.88202726980842 601.2343145750509
+ vertex -149.9724654298445 -108.88202726980838 601.2343145750508
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex 150.02753457015467 -120.64771269475769 601.8000000000001
+ vertex -149.9724654298442 -122.68202726980842 601.8000000000001
+ vertex 150.0275345701547 -122.68202726980844 601.8000000000001
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex -149.9724654298442 -122.68202726980842 601.8000000000001
+ vertex 150.02753457015467 -120.64771269475769 601.8000000000001
+ vertex -149.9724654298442 -120.64771269475763 601.8000000000001
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex 150.02753457015467 -117.88202726980845 599.2000000000002
+ vertex -149.9724654298441 -120.0820272698084 599.2
+ vertex 150.02753457015476 -120.08202726980845 599.2000000000002
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex -149.9724654298441 -120.0820272698084 599.2
+ vertex 150.02753457015467 -117.88202726980845 599.2000000000002
+ vertex -149.9724654298442 -117.8820272698084 599.2
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex 150.0275345701545 -110.68202726980842 597.8000000000001
+ vertex -149.97246542984436 -110.68202726980842 597.4
+ vertex 150.02753457015456 -110.68202726980844 597.4000000000001
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex -149.97246542984436 -110.68202726980842 597.4
+ vertex 150.0275345701545 -110.68202726980842 597.8000000000001
+ vertex -149.9724654298443 -110.68202726980837 597.8000000000001
+ endloop
+endfacet
+facet normal 4.6599210313486674e-14 -0.9238795325112916 -0.38268343236507846
+ outer loop
+ vertex 150.02753457015487 -124.4479530960975 598.1411809548977
+ vertex -149.97246542984396 -124.34805267359283 597.9
+ vertex 150.0275345701549 -124.34805267359287 597.9000000000001
+ endloop
+endfacet
+facet normal 4.6599210313486674e-14 -0.9238795325112916 -0.38268343236507846
+ outer loop
+ vertex -149.97246542984396 -124.34805267359283 597.9
+ vertex 150.02753457015487 -124.4479530960975 598.1411809548977
+ vertex -149.972465429844 -124.44795309609748 598.1411809548975
+ endloop
+endfacet
+facet normal 1.2048156260518037e-15 -0.7071067811865512 0.7071067811865439
+ outer loop
+ vertex -149.97246542984436 -118.1820272698084 604.2656854249493
+ vertex 150.02753457015467 -120.64771269475769 601.8000000000001
+ vertex 150.02753457015453 -118.18202726980843 604.2656854249494
+ endloop
+endfacet
+facet normal 1.2048156260518037e-15 -0.7071067811865512 0.7071067811865439
+ outer loop
+ vertex 150.02753457015467 -120.64771269475769 601.8000000000001
+ vertex -149.97246542984436 -118.1820272698084 604.2656854249493
+ vertex -149.9724654298442 -120.64771269475763 601.8000000000001
+ endloop
+endfacet
+facet normal -1.2048156260517146e-15 0.7071067811865481 -0.707106781186547
+ outer loop
+ vertex -149.9724654298442 -120.08202726980842 601.2343145750508
+ vertex 150.02753457015447 -117.61634184485919 603.7000000000002
+ vertex 150.02753457015461 -120.08202726980845 601.2343145750508
+ endloop
+endfacet
+facet normal -1.2048156260517146e-15 0.7071067811865481 -0.707106781186547
+ outer loop
+ vertex 150.02753457015447 -117.61634184485919 603.7000000000002
+ vertex -149.9724654298442 -120.08202726980842 601.2343145750508
+ vertex -149.97246542984422 -117.61634184485915 603.7
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex 150.02753457015467 -124.08202726980844 603.6
+ vertex -149.9724654298442 -124.4820272698084 603.6
+ vertex 150.0275345701547 -124.48202726980841 603.6
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex -149.9724654298442 -124.4820272698084 603.6
+ vertex 150.02753457015467 -124.08202726980844 603.6
+ vertex -149.9724654298442 -124.08202726980839 603.6
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex -149.9724654298443 -111.08202726980838 597.8000000000001
+ vertex 150.0275345701545 -110.68202726980842 597.8000000000001
+ vertex 150.02753457015453 -111.08202726980842 597.8000000000001
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex 150.0275345701545 -110.68202726980842 597.8000000000001
+ vertex -149.9724654298443 -111.08202726980838 597.8000000000001
+ vertex -149.9724654298443 -110.68202726980837 597.8000000000001
+ endloop
+endfacet
+facet normal -3.592621386430645e-14 -1.7054096175908568e-14 1.0
+ outer loop
+ vertex 150.02753457015464 -122.68202726980844 604.0000000000001
+ vertex -149.9724654298442 -124.08202726980836 604.0
+ vertex 150.02753457015467 -124.08202726980842 604.0000000000001
+ endloop
+endfacet
+facet normal -3.592621386430645e-14 -1.7054096175908568e-14 1.0
+ outer loop
+ vertex -149.9724654298442 -124.08202726980836 604.0
+ vertex 150.02753457015464 -122.68202726980844 604.0000000000001
+ vertex -149.9724654298442 -122.68202726980842 604.0000000000001
+ endloop
+endfacet
+facet normal 4.512572649034336e-14 -0.7071067811865448 -0.7071067811865503
+ outer loop
+ vertex -149.97246542984445 -111.34771269475767 603.7
+ vertex 150.02753457015433 -108.88202726980842 601.2343145750509
+ vertex 150.0275345701543 -111.3477126947577 603.7000000000002
+ endloop
+endfacet
+facet normal 4.512572649034336e-14 -0.7071067811865448 -0.7071067811865503
+ outer loop
+ vertex 150.02753457015433 -108.88202726980842 601.2343145750509
+ vertex -149.97246542984445 -111.34771269475767 603.7
+ vertex -149.9724654298445 -108.88202726980838 601.2343145750508
+ endloop
+endfacet
+facet normal 3.1555025696319064e-14 0.13052619222007428 -0.9914448613738074
+ outer loop
+ vertex -149.97246542984445 -105.48202726980838 597.4
+ vertex 150.02753457015436 -105.22320822470594 597.434074173711
+ vertex 150.0275345701544 -105.48202726980847 597.4000000000001
+ endloop
+endfacet
+facet normal 3.1555025696319064e-14 0.13052619222007428 -0.9914448613738074
+ outer loop
+ vertex 150.02753457015436 -105.22320822470594 597.434074173711
+ vertex -149.97246542984445 -105.48202726980838 597.4
+ vertex -149.9724654298445 -105.22320822470584 597.434074173711
+ endloop
+endfacet
+facet normal 2.0504249361719442e-14 0.3826834323650829 -0.9238795325112896
+ outer loop
+ vertex -149.9724654298445 -105.22320822470584 597.434074173711
+ vertex 150.02753457015436 -104.98202726980846 597.5339745962157
+ vertex 150.02753457015436 -105.22320822470594 597.434074173711
+ endloop
+endfacet
+facet normal 2.0504249361719442e-14 0.3826834323650829 -0.9238795325112896
+ outer loop
+ vertex 150.02753457015436 -104.98202726980846 597.5339745962157
+ vertex -149.9724654298445 -105.22320822470584 597.434074173711
+ vertex -149.9724654298445 -104.98202726980841 597.5339745962156
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 2.4387889803801356e-15
+ outer loop
+ vertex -149.9724654298442 -124.4820272698084 603.6
+ vertex 150.02753457015487 -124.48202726980846 598.4000000000002
+ vertex 150.0275345701547 -124.48202726980841 603.6
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 2.4387889803801356e-15
+ outer loop
+ vertex 150.02753457015487 -124.48202726980846 598.4000000000002
+ vertex -149.9724654298442 -124.4820272698084 603.6
+ vertex -149.97246542984396 -124.48202726980837 598.4000000000001
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex -149.972465429844 -118.28202726980834 597.8000000000001
+ vertex 150.02753457015473 -117.8820272698084 597.8000000000001
+ vertex 150.02753457015473 -118.28202726980841 597.8000000000001
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex 150.02753457015473 -117.8820272698084 597.8000000000001
+ vertex -149.972465429844 -118.28202726980834 597.8000000000001
+ vertex -149.97246542984414 -117.88202726980836 597.8000000000001
+ endloop
+endfacet
+facet normal 3.881934011071542e-14 -0.9914448613738096 -0.1305261922200573
+ outer loop
+ vertex -149.97246542984396 -124.48202726980837 598.4000000000001
+ vertex 150.02753457015487 -124.4479530960975 598.1411809548977
+ vertex 150.02753457015487 -124.48202726980846 598.4000000000002
+ endloop
+endfacet
+facet normal 3.881934011071542e-14 -0.9914448613738096 -0.1305261922200573
+ outer loop
+ vertex 150.02753457015487 -124.4479530960975 598.1411809548977
+ vertex -149.97246542984396 -124.48202726980837 598.4000000000001
+ vertex -149.972465429844 -124.44795309609748 598.1411809548975
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex -149.97246542984442 -111.08202726980839 599.2
+ vertex 150.02753457015453 -111.08202726980842 597.8000000000001
+ vertex 150.0275345701545 -111.08202726980839 599.2000000000002
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex 150.02753457015453 -111.08202726980842 597.8000000000001
+ vertex -149.97246542984442 -111.08202726980839 599.2
+ vertex -149.9724654298443 -111.08202726980838 597.8000000000001
+ endloop
+endfacet
+facet normal 1.14378780311469e-14 0.6087614290087051 -0.7933533402912472
+ outer loop
+ vertex -149.9724654298445 -104.98202726980841 597.5339745962156
+ vertex 150.02753457015433 -104.77492048862187 597.6928932188135
+ vertex 150.02753457015436 -104.98202726980846 597.5339745962157
+ endloop
+endfacet
+facet normal 1.14378780311469e-14 0.6087614290087051 -0.7933533402912472
+ outer loop
+ vertex 150.02753457015433 -104.77492048862187 597.6928932188135
+ vertex -149.9724654298445 -104.98202726980841 597.5339745962156
+ vertex -149.9724654298445 -104.77492048862183 597.6928932188135
+ endloop
+endfacet
+facet normal 1.1474086062760138e-15 0.7933533402912367 -0.6087614290087189
+ outer loop
+ vertex 150.02753457015433 -104.77492048862187 597.6928932188135
+ vertex -149.9724654298445 -104.61600186602395 597.9000000000001
+ vertex 150.02753457015433 -104.61600186602396 597.9000000000001
+ endloop
+endfacet
+facet normal 1.1474086062760138e-15 0.7933533402912367 -0.6087614290087189
+ outer loop
+ vertex -149.9724654298445 -104.61600186602395 597.9000000000001
+ vertex 150.02753457015433 -104.77492048862187 597.6928932188135
+ vertex -149.9724654298445 -104.77492048862183 597.6928932188135
+ endloop
+endfacet
+facet normal 3.7893401050872254e-14 -0.7933533402912385 -0.6087614290087162
+ outer loop
+ vertex -149.97246542984396 -124.34805267359283 597.9
+ vertex 150.0275345701549 -124.18913405099497 597.6928932188135
+ vertex 150.0275345701549 -124.34805267359287 597.9000000000001
+ endloop
+endfacet
+facet normal 3.7893401050872254e-14 -0.7933533402912385 -0.6087614290087162
+ outer loop
+ vertex 150.0275345701549 -124.18913405099497 597.6928932188135
+ vertex -149.97246542984396 -124.34805267359283 597.9
+ vertex -149.97246542984396 -124.18913405099494 597.6928932188135
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 4.122523745489034e-14
+ outer loop
+ vertex -149.97246542984414 -117.88202726980836 597.8000000000001
+ vertex 150.02753457015467 -117.88202726980845 599.2000000000002
+ vertex 150.02753457015473 -117.8820272698084 597.8000000000001
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 4.122523745489034e-14
+ outer loop
+ vertex 150.02753457015467 -117.88202726980845 599.2000000000002
+ vertex -149.97246542984414 -117.88202726980836 597.8000000000001
+ vertex -149.9724654298442 -117.8820272698084 599.2
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -6.007129263248553e-15
+ outer loop
+ vertex -149.9724654298442 -124.08202726980836 604.0
+ vertex 150.02753457015467 -124.08202726980844 603.6
+ vertex 150.02753457015467 -124.08202726980842 604.0000000000001
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -6.007129263248553e-15
+ outer loop
+ vertex 150.02753457015467 -124.08202726980844 603.6
+ vertex -149.9724654298442 -124.08202726980836 604.0
+ vertex -149.9724654298442 -124.08202726980839 603.6
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex 150.0275345701544 -108.88202726980845 599.2000000000002
+ vertex -149.97246542984442 -111.08202726980839 599.2
+ vertex 150.0275345701545 -111.08202726980839 599.2000000000002
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex -149.97246542984442 -111.08202726980839 599.2
+ vertex 150.0275345701544 -108.88202726980845 599.2000000000002
+ vertex -149.9724654298445 -108.88202726980838 599.2
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex -149.97246542984436 -110.68202726980842 597.4
+ vertex 150.0275345701544 -105.48202726980847 597.4000000000001
+ vertex 150.02753457015456 -110.68202726980844 597.4000000000001
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex 150.0275345701544 -105.48202726980847 597.4000000000001
+ vertex -149.97246542984436 -110.68202726980842 597.4
+ vertex -149.97246542984445 -105.48202726980838 597.4
+ endloop
+endfacet
+facet normal -4.164649241083345e-14 0.13052619222006093 0.9914448613738092
+ outer loop
+ vertex 150.0275345701544 -106.68202726980843 598.0000000000001
+ vertex -149.97246542984445 -107.09613774197238 598.0545186779375
+ vertex 150.02753457015436 -107.09613774197248 598.0545186779376
+ endloop
+endfacet
+facet normal -4.164649241083345e-14 0.13052619222006093 0.9914448613738092
+ outer loop
+ vertex -149.97246542984445 -107.09613774197238 598.0545186779375
+ vertex 150.0275345701544 -106.68202726980843 598.0000000000001
+ vertex -149.97246542984445 -106.6820272698084 598.0000000000001
+ endloop
+endfacet
+facet normal -3.881934011071544e-14 0.9914448613738105 -0.13052619222005132
+ outer loop
+ vertex -149.9724654298445 -117.18202726980843 607.4
+ vertex 150.0275345701543 -117.09002700078892 608.098811421777
+ vertex 150.02753457015436 -117.18202726980846 607.4000000000001
+ endloop
+endfacet
+facet normal -3.881934011071544e-14 0.9914448613738105 -0.13052619222005132
+ outer loop
+ vertex 150.0275345701543 -117.09002700078892 608.098811421777
+ vertex -149.9724654298445 -117.18202726980843 607.4
+ vertex -149.97246542984442 -117.09002700078888 608.0988114217769
+ endloop
+endfacet
+facet normal -5.200343766171888e-14 0.6087614290087029 0.7933533402912488
+ outer loop
+ vertex 150.0275345701544 -115.83202726980844 605.0617314097822
+ vertex -149.97246542984445 -116.39121557901207 605.4908116907964
+ vertex 150.0275345701544 -116.39121557901213 605.4908116907965
+ endloop
+endfacet
+facet normal -5.200343766171888e-14 0.6087614290087029 0.7933533402912488
+ outer loop
+ vertex -149.97246542984445 -116.39121557901207 605.4908116907964
+ vertex 150.0275345701544 -115.83202726980844 605.0617314097822
+ vertex -149.97246542984445 -115.83202726980839 605.061731409782
+ endloop
+endfacet
+facet normal -7.558400656338414e-15 0.9238795325112905 -0.38268343236508096
+ outer loop
+ vertex 150.0275345701543 -117.09002700078892 608.098811421777
+ vertex -149.97246542984453 -116.82029586002639 608.7500000000001
+ vertex 150.0275345701543 -116.82029586002643 608.7500000000001
+ endloop
+endfacet
+facet normal -7.558400656338414e-15 0.9238795325112905 -0.38268343236508096
+ outer loop
+ vertex -149.97246542984453 -116.82029586002639 608.7500000000001
+ vertex 150.0275345701543 -117.09002700078892 608.098811421777
+ vertex -149.97246542984442 -117.09002700078888 608.0988114217769
+ endloop
+endfacet
+facet normal -1.7318603070625494e-14 0.9238795325112914 -0.38268343236507907
+ outer loop
+ vertex -149.9724654298445 -104.61600186602395 597.9000000000001
+ vertex 150.02753457015433 -104.51610144351935 598.1411809548977
+ vertex 150.02753457015433 -104.61600186602396 597.9000000000001
+ endloop
+endfacet
+facet normal -1.7318603070625494e-14 0.9238795325112914 -0.38268343236507907
+ outer loop
+ vertex 150.02753457015433 -104.51610144351935 598.1411809548977
+ vertex -149.9724654298445 -104.61600186602395 597.9000000000001
+ vertex -149.97246542984453 -104.5161014435193 598.1411809548975
+ endloop
+endfacet
+facet normal 3.3995076299891674e-14 0.1305261922200452 -0.9914448613738114
+ outer loop
+ vertex -149.97246542984468 -115.18083869158521 610.0079997309805
+ vertex 150.0275345701542 -114.48202726980846 610.1000000000001
+ vertex 150.02753457015422 -115.18083869158525 610.0079997309806
+ endloop
+endfacet
+facet normal 3.3995076299891674e-14 0.1305261922200452 -0.9914448613738114
+ outer loop
+ vertex 150.0275345701542 -114.48202726980846 610.1000000000001
+ vertex -149.97246542984468 -115.18083869158521 610.0079997309805
+ vertex -149.97246542984468 -114.48202726980837 610.1
+ endloop
+endfacet
+facet normal 5.200343766171888e-14 -0.6087614290087029 -0.7933533402912488
+ outer loop
+ vertex -149.97246542984473 -113.1320272698084 609.7382685902181
+ vertex 150.02753457015416 -112.57283896060477 609.3091883092038
+ vertex 150.02753457015413 -113.13202726980845 609.7382685902181
+ endloop
+endfacet
+facet normal 5.200343766171888e-14 -0.6087614290087029 -0.7933533402912488
+ outer loop
+ vertex 150.02753457015416 -112.57283896060477 609.3091883092038
+ vertex -149.97246542984473 -113.1320272698084 609.7382685902181
+ vertex -149.97246542984473 -112.57283896060473 609.3091883092037
+ endloop
+endfacet
+facet normal -5.63594127277737e-14 0.9238795325112905 0.382683432365081
+ outer loop
+ vertex -149.97246542984445 -116.8202958600264 606.0500000000001
+ vertex 150.02753457015436 -117.09002700078892 606.7011885782233
+ vertex 150.02753457015442 -116.82029586002643 606.0500000000002
+ endloop
+endfacet
+facet normal -5.63594127277737e-14 0.9238795325112905 0.382683432365081
+ outer loop
+ vertex 150.02753457015436 -117.09002700078892 606.7011885782233
+ vertex -149.97246542984445 -116.8202958600264 606.0500000000001
+ vertex -149.97246542984445 -117.0900270007889 606.7011885782233
+ endloop
+endfacet
+facet normal 2.0504249361718883e-14 0.38268343236510205 -0.9238795325112817
+ outer loop
+ vertex -149.9724654298445 -115.83202726980838 609.738268590218
+ vertex 150.02753457015422 -115.18083869158525 610.0079997309806
+ vertex 150.02753457015422 -115.83202726980844 609.7382685902181
+ endloop
+endfacet
+facet normal 2.0504249361718883e-14 0.38268343236510205 -0.9238795325112817
+ outer loop
+ vertex 150.02753457015422 -115.18083869158525 610.0079997309806
+ vertex -149.9724654298445 -115.83202726980838 609.738268590218
+ vertex -149.97246542984468 -115.18083869158521 610.0079997309805
+ endloop
+endfacet
+facet normal -3.277505099810579e-14 -0.13052619222004544 0.9914448613738113
+ outer loop
+ vertex 150.02753457015433 -113.78321584803162 604.7920002690196
+ vertex -149.97246542984445 -114.48202726980838 604.7
+ vertex 150.0275345701544 -114.48202726980843 604.7000000000002
+ endloop
+endfacet
+facet normal -3.277505099810579e-14 -0.13052619222004544 0.9914448613738113
+ outer loop
+ vertex -149.97246542984445 -114.48202726980838 604.7
+ vertex 150.02753457015433 -113.78321584803162 604.7920002690196
+ vertex -149.9724654298445 -113.78321584803159 604.7920002690196
+ endloop
+endfacet
+facet normal 7.558400656338414e-15 -0.9238795325112905 0.38268343236508096
+ outer loop
+ vertex 150.02753457015422 -111.87402753882797 606.7011885782233
+ vertex -149.9724654298446 -112.14375867959043 606.0500000000001
+ vertex 150.02753457015427 -112.14375867959046 606.0500000000002
+ endloop
+endfacet
+facet normal 7.558400656338414e-15 -0.9238795325112905 0.38268343236508096
+ outer loop
+ vertex -149.9724654298446 -112.14375867959043 606.0500000000001
+ vertex 150.02753457015422 -111.87402753882797 606.7011885782233
+ vertex -149.97246542984465 -111.8740275388279 606.7011885782233
+ endloop
+endfacet
+facet normal 5.02572181418622e-14 -0.3826834323651004 -0.9238795325112824
+ outer loop
+ vertex -149.97246542984473 -113.78321584803159 610.0079997309805
+ vertex 150.02753457015413 -113.13202726980845 609.7382685902181
+ vertex 150.02753457015416 -113.78321584803162 610.0079997309806
+ endloop
+endfacet
+facet normal 5.02572181418622e-14 -0.3826834323651004 -0.9238795325112824
+ outer loop
+ vertex 150.02753457015413 -113.13202726980845 609.7382685902181
+ vertex -149.97246542984473 -113.78321584803159 610.0079997309805
+ vertex -149.97246542984473 -113.1320272698084 609.7382685902181
+ endloop
+endfacet
+facet normal -3.732692600867523e-15 0.7933533402912372 -0.6087614290087182
+ outer loop
+ vertex -149.97246542984453 -116.82029586002639 608.7500000000001
+ vertex 150.02753457015424 -116.39121557901214 609.3091883092038
+ vertex 150.0275345701543 -116.82029586002643 608.7500000000001
+ endloop
+endfacet
+facet normal -3.732692600867523e-15 0.7933533402912372 -0.6087614290087182
+ outer loop
+ vertex 150.02753457015424 -116.39121557901214 609.3091883092038
+ vertex -149.97246542984453 -116.82029586002639 608.7500000000001
+ vertex -149.97246542984465 -116.3912155790121 609.3091883092037
+ endloop
+endfacet
+facet normal -2.905913769642837e-14 0.9914448613738099 0.1305261922200552
+ outer loop
+ vertex 150.02753457015436 -117.09002700078892 606.7011885782233
+ vertex -149.9724654298445 -117.18202726980843 607.4
+ vertex 150.02753457015436 -117.18202726980846 607.4000000000001
+ endloop
+endfacet
+facet normal -2.905913769642837e-14 0.9914448613738099 0.1305261922200552
+ outer loop
+ vertex -149.9724654298445 -117.18202726980843 607.4
+ vertex 150.02753457015436 -117.09002700078892 606.7011885782233
+ vertex -149.97246542984445 -117.0900270007889 606.7011885782233
+ endloop
+endfacet
+facet normal 4.6599210313486503e-14 -0.9238795325112859 -0.3826834323650923
+ outer loop
+ vertex -149.97246542984468 -112.14375867959043 608.7500000000001
+ vertex 150.02753457015416 -111.87402753882795 608.098811421777
+ vertex 150.02753457015416 -112.14375867959048 608.7500000000001
+ endloop
+endfacet
+facet normal 4.6599210313486503e-14 -0.9238795325112859 -0.3826834323650923
+ outer loop
+ vertex 150.02753457015416 -111.87402753882795 608.098811421777
+ vertex -149.97246542984468 -112.14375867959043 608.7500000000001
+ vertex -149.97246542984473 -111.87402753882795 608.0988114217769
+ endloop
+endfacet
+facet normal -3.155502569632095e-14 -0.1305261922200097 0.9914448613738159
+ outer loop
+ vertex 150.02753457015436 -106.26791679764442 598.0545186779376
+ vertex -149.97246542984445 -106.6820272698084 598.0000000000001
+ vertex 150.0275345701544 -106.68202726980843 598.0000000000001
+ endloop
+endfacet
+facet normal -3.155502569632095e-14 -0.1305261922200097 0.9914448613738159
+ outer loop
+ vertex -149.97246542984445 -106.6820272698084 598.0000000000001
+ vertex 150.02753457015436 -106.26791679764442 598.0545186779376
+ vertex -149.97246542984445 -106.26791679764439 598.0545186779375
+ endloop
+endfacet
+facet normal -1.1474086062760311e-15 -0.7933533402912362 0.6087614290087194
+ outer loop
+ vertex -149.9724654298446 -112.14375867959043 606.0500000000001
+ vertex 150.02753457015427 -112.57283896060474 605.4908116907965
+ vertex 150.02753457015427 -112.14375867959046 606.0500000000002
+ endloop
+endfacet
+facet normal -1.1474086062760311e-15 -0.7933533402912362 0.6087614290087194
+ outer loop
+ vertex 150.02753457015427 -112.57283896060474 605.4908116907965
+ vertex -149.9724654298446 -112.14375867959043 606.0500000000001
+ vertex -149.97246542984445 -112.5728389606047 605.4908116907964
+ endloop
+endfacet
+facet normal 6.5577768240034135e-15 0.6087614290087043 -0.7933533402912477
+ outer loop
+ vertex -149.97246542984465 -116.3912155790121 609.3091883092037
+ vertex 150.02753457015422 -115.83202726980844 609.7382685902181
+ vertex 150.02753457015424 -116.39121557901214 609.3091883092038
+ endloop
+endfacet
+facet normal 6.5577768240034135e-15 0.6087614290087043 -0.7933533402912477
+ outer loop
+ vertex 150.02753457015422 -115.83202726980844 609.7382685902181
+ vertex -149.97246542984465 -116.3912155790121 609.3091883092037
+ vertex -149.9724654298445 -115.83202726980838 609.738268590218
+ endloop
+endfacet
+facet normal -4.0426467109047067e-14 0.13052619222004386 0.9914448613738115
+ outer loop
+ vertex 150.0275345701544 -114.48202726980843 604.7000000000002
+ vertex -149.97246542984445 -115.18083869158521 604.7920002690196
+ vertex 150.0275345701544 -115.18083869158524 604.7920002690196
+ endloop
+endfacet
+facet normal -4.0426467109047067e-14 0.13052619222004386 0.9914448613738115
+ outer loop
+ vertex -149.97246542984445 -115.18083869158521 604.7920002690196
+ vertex 150.0275345701544 -114.48202726980843 604.7000000000002
+ vertex -149.97246542984445 -114.48202726980838 604.7
+ endloop
+endfacet
+facet normal 3.789340105087213e-14 -0.793353340291234 -0.6087614290087222
+ outer loop
+ vertex -149.97246542984473 -112.57283896060473 609.3091883092037
+ vertex 150.02753457015416 -112.14375867959048 608.7500000000001
+ vertex 150.02753457015416 -112.57283896060477 609.3091883092038
+ endloop
+endfacet
+facet normal 3.789340105087213e-14 -0.793353340291234 -0.6087614290087222
+ outer loop
+ vertex 150.02753457015416 -112.14375867959048 608.7500000000001
+ vertex -149.97246542984473 -112.57283896060473 609.3091883092037
+ vertex -149.97246542984468 -112.14375867959043 608.7500000000001
+ endloop
+endfacet
+facet normal 3.8819340110715446e-14 -0.9914448613738105 -0.13052619222005105
+ outer loop
+ vertex 150.02753457015416 -111.87402753882795 608.098811421777
+ vertex -149.97246542984465 -111.7820272698084 607.4000000000001
+ vertex 150.02753457015422 -111.78202726980847 607.4000000000001
+ endloop
+endfacet
+facet normal 3.8819340110715446e-14 -0.9914448613738105 -0.13052619222005105
+ outer loop
+ vertex -149.97246542984465 -111.7820272698084 607.4000000000001
+ vertex 150.02753457015416 -111.87402753882795 608.098811421777
+ vertex -149.97246542984473 -111.87402753882795 608.0988114217769
+ endloop
+endfacet
+facet normal 4.0426467109047067e-14 -0.13052619222004386 -0.9914448613738115
+ outer loop
+ vertex -149.97246542984468 -114.48202726980837 610.1
+ vertex 150.02753457015416 -113.78321584803162 610.0079997309806
+ vertex 150.0275345701542 -114.48202726980846 610.1000000000001
+ endloop
+endfacet
+facet normal 4.0426467109047067e-14 -0.13052619222004386 -0.9914448613738115
+ outer loop
+ vertex 150.02753457015416 -113.78321584803162 610.0079997309806
+ vertex -149.97246542984468 -114.48202726980837 610.1
+ vertex -149.97246542984473 -113.78321584803159 610.0079997309805
+ endloop
+endfacet
+facet normal -1.8064198758146943e-14 -0.38268343236510816 0.9238795325112792
+ outer loop
+ vertex 150.0275345701544 -105.88202726980843 598.214359353945
+ vertex -149.97246542984445 -106.26791679764439 598.0545186779375
+ vertex 150.02753457015436 -106.26791679764442 598.0545186779376
+ endloop
+endfacet
+facet normal -1.8064198758146943e-14 -0.38268343236510816 0.9238795325112792
+ outer loop
+ vertex -149.97246542984445 -106.26791679764439 598.0545186779375
+ vertex 150.0275345701544 -105.88202726980843 598.214359353945
+ vertex -149.97246542984442 -105.88202726980838 598.2143593539449
+ endloop
+endfacet
+facet normal -4.277350225801568e-14 0.793353340291235 0.6087614290087209
+ outer loop
+ vertex 150.0275345701544 -116.39121557901213 605.4908116907965
+ vertex -149.97246542984445 -116.8202958600264 606.0500000000001
+ vertex 150.02753457015442 -116.82029586002643 606.0500000000002
+ endloop
+endfacet
+facet normal -4.277350225801568e-14 0.793353340291235 0.6087614290087209
+ outer loop
+ vertex -149.97246542984445 -116.8202958600264 606.0500000000001
+ vertex 150.0275345701544 -116.39121557901213 605.4908116907965
+ vertex -149.97246542984445 -116.39121557901207 605.4908116907964
+ endloop
+endfacet
+facet normal -1.631797923829057e-14 -0.6087614290087004 0.7933533402912507
+ outer loop
+ vertex 150.02753457015433 -105.55065641990996 598.4686291501016
+ vertex -149.97246542984442 -105.88202726980838 598.2143593539449
+ vertex 150.0275345701544 -105.88202726980843 598.214359353945
+ endloop
+endfacet
+facet normal -1.631797923829057e-14 -0.6087614290087004 0.7933533402912507
+ outer loop
+ vertex -149.97246542984442 -105.88202726980838 598.2143593539449
+ vertex 150.02753457015433 -105.55065641990996 598.4686291501016
+ vertex -149.97246542984442 -105.55065641990991 598.4686291501016
+ endloop
+endfacet
+facet normal -4.781716753828934e-14 0.3826834323650628 0.923879532511298
+ outer loop
+ vertex 150.02753457015436 -107.09613774197248 598.0545186779376
+ vertex -149.97246542984445 -107.48202726980838 598.2143593539449
+ vertex 150.02753457015444 -107.48202726980843 598.214359353945
+ endloop
+endfacet
+facet normal -4.781716753828934e-14 0.3826834323650628 0.923879532511298
+ outer loop
+ vertex -149.97246542984445 -107.48202726980838 598.2143593539449
+ vertex 150.02753457015436 -107.09613774197248 598.0545186779376
+ vertex -149.97246542984445 -107.09613774197238 598.0545186779375
+ endloop
+endfacet
+facet normal -6.5577768240034135e-15 -0.6087614290087043 0.7933533402912477
+ outer loop
+ vertex 150.02753457015427 -112.57283896060474 605.4908116907965
+ vertex -149.9724654298445 -113.1320272698084 605.061731409782
+ vertex 150.0275345701543 -113.13202726980845 605.0617314097822
+ endloop
+endfacet
+facet normal -6.5577768240034135e-15 -0.6087614290087043 0.7933533402912477
+ outer loop
+ vertex -149.9724654298445 -113.1320272698084 605.061731409782
+ vertex 150.02753457015427 -112.57283896060474 605.4908116907965
+ vertex -149.97246542984445 -112.5728389606047 605.4908116907964
+ endloop
+endfacet
+facet normal -2.0504249361718883e-14 -0.38268343236510205 0.9238795325112817
+ outer loop
+ vertex 150.0275345701543 -113.13202726980845 605.0617314097822
+ vertex -149.9724654298445 -113.78321584803159 604.7920002690196
+ vertex 150.02753457015433 -113.78321584803162 604.7920002690196
+ endloop
+endfacet
+facet normal -2.0504249361718883e-14 -0.38268343236510205 0.9238795325112817
+ outer loop
+ vertex -149.9724654298445 -113.78321584803159 604.7920002690196
+ vertex 150.0275345701543 -113.13202726980845 605.0617314097822
+ vertex -149.9724654298445 -113.1320272698084 605.061731409782
+ endloop
+endfacet
+facet normal 3.881934011071544e-14 -0.9914448613738105 0.13052619222005132
+ outer loop
+ vertex -149.97246542984465 -111.7820272698084 607.4000000000001
+ vertex 150.02753457015422 -111.87402753882797 606.7011885782233
+ vertex 150.02753457015422 -111.78202726980847 607.4000000000001
+ endloop
+endfacet
+facet normal 3.881934011071544e-14 -0.9914448613738105 0.13052619222005132
+ outer loop
+ vertex 150.02753457015422 -111.87402753882797 606.7011885782233
+ vertex -149.97246542984465 -111.7820272698084 607.4000000000001
+ vertex -149.97246542984465 -111.8740275388279 606.7011885782233
+ endloop
+endfacet
+facet normal -3.8819340110715427e-14 0.9914448613738099 -0.1305261922200554
+ outer loop
+ vertex 150.02753457015433 -104.51610144351935 598.1411809548977
+ vertex -149.9724654298446 -104.48202726980838 598.4000000000001
+ vertex 150.02753457015433 -104.48202726980843 598.4000000000002
+ endloop
+endfacet
+facet normal -3.8819340110715427e-14 0.9914448613738099 -0.1305261922200554
+ outer loop
+ vertex -149.9724654298446 -104.48202726980838 598.4000000000001
+ vertex 150.02753457015433 -104.51610144351935 598.1411809548977
+ vertex -149.97246542984453 -104.5161014435193 598.1411809548975
+ endloop
+endfacet
+facet normal 3.732692600867157e-15 -0.7933533402912247 0.6087614290087344
+ outer loop
+ vertex -149.97246542984453 -105.29638662375329 598.8
+ vertex 150.02753457015433 -105.55065641990996 598.4686291501016
+ vertex 150.0275345701543 -105.29638662375332 598.8000000000001
+ endloop
+endfacet
+facet normal 3.732692600867157e-15 -0.7933533402912247 0.6087614290087344
+ outer loop
+ vertex 150.02753457015433 -105.55065641990996 598.4686291501016
+ vertex -149.97246542984453 -105.29638662375329 598.8
+ vertex -149.97246542984442 -105.55065641990991 598.4686291501016
+ endloop
+endfacet
+facet normal -4.293706633114689e-14 0.3826834323650997 0.9238795325112827
+ outer loop
+ vertex 150.0275345701544 -115.18083869158524 604.7920002690196
+ vertex -149.97246542984445 -115.83202726980839 605.061731409782
+ vertex 150.0275345701544 -115.83202726980844 605.0617314097822
+ endloop
+endfacet
+facet normal -4.293706633114689e-14 0.3826834323650997 0.9238795325112827
+ outer loop
+ vertex -149.97246542984445 -115.83202726980839 605.061731409782
+ vertex 150.0275345701544 -115.18083869158524 604.7920002690196
+ vertex -149.97246542984445 -115.18083869158521 604.7920002690196
+ endloop
+endfacet
+facet normal 1.8064198758146943e-14 0.38268343236510816 -0.9238795325112792
+ outer loop
+ vertex -149.97246542984453 -107.48202726980838 600.9856406460551
+ vertex 150.02753457015427 -107.09613774197246 601.1454813220627
+ vertex 150.0275345701543 -107.48202726980843 600.9856406460553
+ endloop
+endfacet
+facet normal 1.8064198758146943e-14 0.38268343236510816 -0.9238795325112792
+ outer loop
+ vertex 150.02753457015427 -107.09613774197246 601.1454813220627
+ vertex -149.97246542984453 -107.48202726980838 600.9856406460551
+ vertex -149.97246542984445 -107.09613774197238 601.1454813220626
+ endloop
+endfacet
+facet normal 4.04264671090476e-14 -0.13052619222006184 -0.9914448613738092
+ outer loop
+ vertex -149.9724654298445 -106.68202726980836 601.2
+ vertex 150.02753457015424 -106.26791679764439 601.1454813220627
+ vertex 150.02753457015424 -106.68202726980843 601.2000000000002
+ endloop
+endfacet
+facet normal 4.04264671090476e-14 -0.13052619222006184 -0.9914448613738092
+ outer loop
+ vertex 150.02753457015424 -106.26791679764439 601.1454813220627
+ vertex -149.9724654298445 -106.68202726980836 601.2
+ vertex -149.9724654298446 -106.26791679764433 601.1454813220626
+ endloop
+endfacet
+facet normal 2.905913769642842e-14 -0.9914448613738115 -0.13052619222004383
+ outer loop
+ vertex -149.97246542984465 -105.13654594774587 600.014110472164
+ vertex 150.02753457015427 -105.0820272698084 599.6
+ vertex 150.0275345701543 -105.1365459477459 600.0141104721641
+ endloop
+endfacet
+facet normal 2.905913769642842e-14 -0.9914448613738115 -0.13052619222004383
+ outer loop
+ vertex 150.02753457015427 -105.0820272698084 599.6
+ vertex -149.97246542984465 -105.13654594774587 600.014110472164
+ vertex -149.9724654298446 -105.08202726980838 599.6
+ endloop
+endfacet
+facet normal -3.88193401107154e-14 0.991444861373809 -0.13052619222006184
+ outer loop
+ vertex -149.9724654298445 -108.2820272698084 599.6
+ vertex 150.02753457015436 -108.22750859187094 600.0141104721642
+ vertex 150.0275345701544 -108.28202726980844 599.6000000000001
+ endloop
+endfacet
+facet normal -3.88193401107154e-14 0.991444861373809 -0.13052619222006184
+ outer loop
+ vertex 150.02753457015436 -108.22750859187094 600.0141104721642
+ vertex -149.9724654298445 -108.2820272698084 599.6
+ vertex -149.97246542984453 -108.2275085918709 600.0141104721641
+ endloop
+endfacet
+facet normal -4.277350225801563e-14 0.7933533402912334 0.6087614290087231
+ outer loop
+ vertex -149.97246542984445 -107.81339811970685 598.4686291501016
+ vertex 150.0275345701544 -108.06766791586355 598.8000000000002
+ vertex 150.0275345701544 -107.81339811970692 598.4686291501016
+ endloop
+endfacet
+facet normal -4.277350225801563e-14 0.7933533402912334 0.6087614290087231
+ outer loop
+ vertex 150.0275345701544 -108.06766791586355 598.8000000000002
+ vertex -149.97246542984445 -107.81339811970685 598.4686291501016
+ vertex -149.97246542984436 -108.06766791586351 598.8000000000001
+ endloop
+endfacet
+facet normal 2.905913769642855e-14 -0.9914448613738159 -0.13052619222001066
+ outer loop
+ vertex -149.97246542984513 -105.13654594774586 615.6141104721642
+ vertex 150.0275345701537 -105.08202726980845 615.2000000000002
+ vertex 150.02753457015373 -105.13654594774594 615.6141104721642
+ endloop
+endfacet
+facet normal 2.905913769642855e-14 -0.9914448613738159 -0.13052619222001066
+ outer loop
+ vertex 150.0275345701537 -105.08202726980845 615.2000000000002
+ vertex -149.97246542984513 -105.13654594774586 615.6141104721642
+ vertex -149.97246542984504 -105.0820272698084 615.2
+ endloop
+endfacet
+facet normal 6.176364007600701e-14 -0.6087614290087395 -0.7933533402912207
+ outer loop
+ vertex -149.9724654298446 -105.88202726980838 600.9856406460551
+ vertex 150.02753457015422 -105.55065641990996 600.7313708498986
+ vertex 150.02753457015424 -105.88202726980843 600.9856406460552
+ endloop
+endfacet
+facet normal 6.176364007600701e-14 -0.6087614290087395 -0.7933533402912207
+ outer loop
+ vertex 150.02753457015422 -105.55065641990996 600.7313708498986
+ vertex -149.9724654298446 -105.88202726980838 600.9856406460551
+ vertex -149.97246542984465 -105.55065641990988 600.7313708498986
+ endloop
+endfacet
+facet normal 3.277505099810686e-14 0.13052619222000883 -0.991444861373816
+ outer loop
+ vertex -149.97246542984445 -107.09613774197238 601.1454813220626
+ vertex 150.02753457015424 -106.68202726980843 601.2000000000002
+ vertex 150.02753457015427 -107.09613774197246 601.1454813220627
+ endloop
+endfacet
+facet normal 3.277505099810686e-14 0.13052619222000883 -0.991444861373816
+ outer loop
+ vertex 150.02753457015424 -106.68202726980843 601.2000000000002
+ vertex -149.97246542984445 -107.09613774197238 601.1454813220626
+ vertex -149.9724654298445 -106.68202726980836 601.2
+ endloop
+endfacet
+facet normal 3.88193401107154e-14 -0.991444861373809 0.13052619222006184
+ outer loop
+ vertex 150.02753457015427 -105.0820272698084 599.6
+ vertex -149.9724654298446 -105.13654594774586 599.185889527836
+ vertex 150.02753457015433 -105.13654594774593 599.1858895278361
+ endloop
+endfacet
+facet normal 3.88193401107154e-14 -0.991444861373809 0.13052619222006184
+ outer loop
+ vertex -149.9724654298446 -105.13654594774586 599.185889527836
+ vertex 150.02753457015427 -105.0820272698084 599.6
+ vertex -149.9724654298446 -105.08202726980838 599.6
+ endloop
+endfacet
+facet normal 2.050424936172055e-14 0.3826834323650453 -0.9238795325113052
+ outer loop
+ vertex -149.97246542984507 -107.4820272698084 616.5856406460551
+ vertex 150.0275345701537 -107.09613774197244 616.7454813220626
+ vertex 150.02753457015373 -107.48202726980844 616.5856406460553
+ endloop
+endfacet
+facet normal 2.050424936172055e-14 0.3826834323650453 -0.9238795325113052
+ outer loop
+ vertex 150.0275345701537 -107.09613774197244 616.7454813220626
+ vertex -149.97246542984507 -107.4820272698084 616.5856406460551
+ vertex -149.97246542984513 -107.09613774197238 616.7454813220626
+ endloop
+endfacet
+facet normal 4.277350225801563e-14 -0.7933533402912334 -0.6087614290087231
+ outer loop
+ vertex 150.02753457015422 -105.55065641990996 600.7313708498986
+ vertex -149.9724654298446 -105.29638662375328 600.4000000000001
+ vertex 150.02753457015427 -105.29638662375332 600.4000000000002
+ endloop
+endfacet
+facet normal 4.277350225801563e-14 -0.7933533402912334 -0.6087614290087231
+ outer loop
+ vertex -149.9724654298446 -105.29638662375328 600.4000000000001
+ vertex 150.02753457015422 -105.55065641990996 600.7313708498986
+ vertex -149.97246542984465 -105.55065641990988 600.7313708498986
+ endloop
+endfacet
+facet normal 3.789340105087239e-14 -0.7933533402912432 -0.6087614290087103
+ outer loop
+ vertex 150.02753457015368 -105.55065641990996 616.3313708498986
+ vertex -149.97246542984504 -105.29638662375332 616.0
+ vertex 150.0275345701537 -105.29638662375334 616.0000000000001
+ endloop
+endfacet
+facet normal 3.789340105087239e-14 -0.7933533402912432 -0.6087614290087103
+ outer loop
+ vertex -149.97246542984504 -105.29638662375332 616.0
+ vertex 150.02753457015368 -105.55065641990996 616.3313708498986
+ vertex -149.97246542984513 -105.55065641990988 616.3313708498985
+ endloop
+endfacet
+facet normal -3.88193401107154e-14 0.991444861373809 -0.13052619222006184
+ outer loop
+ vertex -149.97246542984496 -108.28202726980842 615.2
+ vertex 150.0275345701538 -108.22750859187097 615.6141104721642
+ vertex 150.02753457015382 -108.28202726980842 615.2000000000002
+ endloop
+endfacet
+facet normal -3.88193401107154e-14 0.991444861373809 -0.13052619222006184
+ outer loop
+ vertex 150.0275345701538 -108.22750859187097 615.6141104721642
+ vertex -149.97246542984496 -108.28202726980842 615.2
+ vertex -149.97246542984504 -108.22750859187089 615.6141104721642
+ endloop
+endfacet
+facet normal 4.5377116934718926e-14 -0.3826834323651088 -0.9238795325112789
+ outer loop
+ vertex -149.9724654298452 -106.26791679764435 616.7454813220626
+ vertex 150.0275345701537 -105.88202726980843 616.5856406460553
+ vertex 150.02753457015368 -106.26791679764439 616.7454813220626
+ endloop
+endfacet
+facet normal 4.5377116934718926e-14 -0.3826834323651088 -0.9238795325112789
+ outer loop
+ vertex 150.0275345701537 -105.88202726980843 616.5856406460553
+ vertex -149.9724654298452 -106.26791679764435 616.7454813220626
+ vertex -149.97246542984513 -105.88202726980838 616.5856406460551
+ endloop
+endfacet
+facet normal 4.659921031348627e-14 -0.9238795325112781 -0.38268343236511065
+ outer loop
+ vertex 150.0275345701537 -105.29638662375334 616.0000000000001
+ vertex -149.97246542984513 -105.13654594774586 615.6141104721642
+ vertex 150.02753457015373 -105.13654594774594 615.6141104721642
+ endloop
+endfacet
+facet normal 4.659921031348627e-14 -0.9238795325112781 -0.38268343236511065
+ outer loop
+ vertex -149.97246542984513 -105.13654594774586 615.6141104721642
+ vertex 150.0275345701537 -105.29638662375334 616.0000000000001
+ vertex -149.97246542984504 -105.29638662375332 616.0
+ endloop
+endfacet
+facet normal 4.7817167538289264e-14 -0.38268343236506036 -0.923879532511299
+ outer loop
+ vertex -149.9724654298446 -106.26791679764433 601.1454813220626
+ vertex 150.02753457015424 -105.88202726980843 600.9856406460552
+ vertex 150.02753457015424 -106.26791679764439 601.1454813220627
+ endloop
+endfacet
+facet normal 4.7817167538289264e-14 -0.38268343236506036 -0.923879532511299
+ outer loop
+ vertex 150.02753457015424 -105.88202726980843 600.9856406460552
+ vertex -149.9724654298446 -106.26791679764433 601.1454813220626
+ vertex -149.9724654298446 -105.88202726980838 600.9856406460551
+ endloop
+endfacet
+facet normal 1.631797923829057e-14 0.6087614290087004 -0.7933533402912507
+ outer loop
+ vertex -149.9724654298445 -107.81339811970687 600.7313708498986
+ vertex 150.0275345701543 -107.48202726980843 600.9856406460553
+ vertex 150.02753457015433 -107.81339811970689 600.7313708498987
+ endloop
+endfacet
+facet normal 1.631797923829057e-14 0.6087614290087004 -0.7933533402912507
+ outer loop
+ vertex 150.0275345701543 -107.48202726980843 600.9856406460553
+ vertex -149.9724654298445 -107.81339811970687 600.7313708498986
+ vertex -149.97246542984453 -107.48202726980838 600.9856406460551
+ endloop
+endfacet
+facet normal 3.88193401107154e-14 -0.991444861373809 0.13052619222006184
+ outer loop
+ vertex 150.0275345701537 -105.08202726980845 615.2000000000002
+ vertex -149.97246542984507 -105.1365459477459 614.785889527836
+ vertex 150.02753457015376 -105.13654594774594 614.785889527836
+ endloop
+endfacet
+facet normal 3.88193401107154e-14 -0.991444861373809 0.13052619222006184
+ outer loop
+ vertex -149.97246542984507 -105.1365459477459 614.785889527836
+ vertex 150.0275345701537 -105.08202726980845 615.2000000000002
+ vertex -149.97246542984504 -105.0820272698084 615.2
+ endloop
+endfacet
+facet normal 6.557776824003234e-15 0.6087614290087102 -0.7933533402912432
+ outer loop
+ vertex -149.97246542984513 -107.81339811970687 616.3313708498986
+ vertex 150.02753457015373 -107.48202726980844 616.5856406460553
+ vertex 150.02753457015376 -107.81339811970692 616.3313708498987
+ endloop
+endfacet
+facet normal 6.557776824003234e-15 0.6087614290087102 -0.7933533402912432
+ outer loop
+ vertex 150.02753457015373 -107.48202726980844 616.5856406460553
+ vertex -149.97246542984513 -107.81339811970687 616.3313708498986
+ vertex -149.97246542984507 -107.4820272698084 616.5856406460551
+ endloop
+endfacet
+facet normal -2.7078805484912748e-14 0.9238795325112981 -0.38268343236506286
+ outer loop
+ vertex -149.97246542984504 -108.22750859187089 615.6141104721642
+ vertex 150.0275345701538 -108.06766791586355 616.0000000000001
+ vertex 150.0275345701538 -108.22750859187097 615.6141104721642
+ endloop
+endfacet
+facet normal -2.7078805484912748e-14 0.9238795325112981 -0.38268343236506286
+ outer loop
+ vertex 150.0275345701538 -108.06766791586355 616.0000000000001
+ vertex -149.97246542984504 -108.22750859187089 615.6141104721642
+ vertex -149.97246542984496 -108.06766791586354 616.0
+ endloop
+endfacet
+facet normal -2.905913769642842e-14 0.9914448613738116 0.13052619222004347
+ outer loop
+ vertex 150.0275345701544 -108.22750859187094 599.1858895278361
+ vertex -149.9724654298445 -108.2820272698084 599.6
+ vertex 150.0275345701544 -108.28202726980844 599.6000000000001
+ endloop
+endfacet
+facet normal -2.905913769642842e-14 0.9914448613738116 0.13052619222004347
+ outer loop
+ vertex -149.9724654298445 -108.2820272698084 599.6
+ vertex 150.0275345701544 -108.22750859187094 599.1858895278361
+ vertex -149.9724654298445 -108.22750859187093 599.185889527836
+ endloop
+endfacet
+facet normal -2.7078805484912322e-14 0.9238795325112836 -0.3826834323650974
+ outer loop
+ vertex -149.97246542984453 -108.2275085918709 600.0141104721641
+ vertex 150.02753457015433 -108.06766791586354 600.4000000000002
+ vertex 150.02753457015436 -108.22750859187094 600.0141104721642
+ endloop
+endfacet
+facet normal -2.7078805484912322e-14 0.9238795325112836 -0.3826834323650974
+ outer loop
+ vertex 150.02753457015433 -108.06766791586354 600.4000000000002
+ vertex -149.97246542984453 -108.2275085918709 600.0141104721641
+ vertex -149.97246542984453 -108.06766791586351 600.4000000000001
+ endloop
+endfacet
+facet normal 5.6359412727773843e-14 -0.9238795325112955 -0.3826834323650685
+ outer loop
+ vertex 150.02753457015427 -105.29638662375332 600.4000000000002
+ vertex -149.97246542984465 -105.13654594774587 600.014110472164
+ vertex 150.0275345701543 -105.1365459477459 600.0141104721641
+ endloop
+endfacet
+facet normal 5.6359412727773843e-14 -0.9238795325112955 -0.3826834323650685
+ outer loop
+ vertex -149.97246542984465 -105.13654594774587 600.014110472164
+ vertex 150.02753457015427 -105.29638662375332 600.4000000000002
+ vertex -149.9724654298446 -105.29638662375328 600.4000000000001
+ endloop
+endfacet
+facet normal 3.1555025696319373e-14 0.1305261922200637 -0.9914448613738089
+ outer loop
+ vertex -149.97246542984513 -107.09613774197238 616.7454813220626
+ vertex 150.0275345701537 -106.68202726980843 616.8000000000002
+ vertex 150.0275345701537 -107.09613774197244 616.7454813220626
+ endloop
+endfacet
+facet normal 3.1555025696319373e-14 0.1305261922200637 -0.9914448613738089
+ outer loop
+ vertex 150.0275345701537 -106.68202726980843 616.8000000000002
+ vertex -149.97246542984513 -107.09613774197238 616.7454813220626
+ vertex -149.97246542984513 -106.68202726980836 616.8000000000001
+ endloop
+endfacet
+facet normal 4.04264671090476e-14 -0.13052619222006184 -0.9914448613738092
+ outer loop
+ vertex -149.97246542984513 -106.68202726980836 616.8000000000001
+ vertex 150.02753457015368 -106.26791679764439 616.7454813220626
+ vertex 150.0275345701537 -106.68202726980843 616.8000000000002
+ endloop
+endfacet
+facet normal 4.04264671090476e-14 -0.13052619222006184 -0.9914448613738092
+ outer loop
+ vertex 150.02753457015368 -106.26791679764439 616.7454813220626
+ vertex -149.97246542984513 -106.68202726980836 616.8000000000001
+ vertex -149.9724654298452 -106.26791679764435 616.7454813220626
+ endloop
+endfacet
+facet normal -4.6599210313486623e-14 0.9238795325112901 0.3826834323650818
+ outer loop
+ vertex -149.97246542984436 -108.06766791586351 598.8000000000001
+ vertex 150.0275345701544 -108.22750859187094 599.1858895278361
+ vertex 150.0275345701544 -108.06766791586355 598.8000000000002
+ endloop
+endfacet
+facet normal -4.6599210313486623e-14 0.9238795325112901 0.3826834323650818
+ outer loop
+ vertex 150.0275345701544 -108.22750859187094 599.1858895278361
+ vertex -149.97246542984436 -108.06766791586351 598.8000000000001
+ vertex -149.9724654298445 -108.22750859187093 599.185889527836
+ endloop
+endfacet
+facet normal -5.200343766171987e-14 0.6087614290087363 0.7933533402912233
+ outer loop
+ vertex 150.02753457015444 -107.48202726980843 598.214359353945
+ vertex -149.97246542984445 -107.81339811970685 598.4686291501016
+ vertex 150.0275345701544 -107.81339811970692 598.4686291501016
+ endloop
+endfacet
+facet normal -5.200343766171987e-14 0.6087614290087363 0.7933533402912233
+ outer loop
+ vertex -149.97246542984445 -107.81339811970685 598.4686291501016
+ vertex 150.02753457015444 -107.48202726980843 598.214359353945
+ vertex -149.97246542984445 -107.48202726980838 598.2143593539449
+ endloop
+endfacet
+facet normal 5.200343766172004e-14 -0.6087614290087426 -0.7933533402912182
+ outer loop
+ vertex -149.97246542984513 -105.88202726980838 616.5856406460551
+ vertex 150.02753457015368 -105.55065641990996 616.3313708498986
+ vertex 150.0275345701537 -105.88202726980843 616.5856406460553
+ endloop
+endfacet
+facet normal 5.200343766172004e-14 -0.6087614290087426 -0.7933533402912182
+ outer loop
+ vertex 150.02753457015368 -105.55065641990996 616.3313708498986
+ vertex -149.97246542984513 -105.88202726980838 616.5856406460551
+ vertex -149.97246542984513 -105.55065641990988 616.3313708498985
+ endloop
+endfacet
+facet normal 2.7078805484912322e-14 -0.9238795325112836 0.3826834323650974
+ outer loop
+ vertex -149.9724654298446 -105.13654594774586 599.185889527836
+ vertex 150.0275345701543 -105.29638662375332 598.8000000000001
+ vertex 150.02753457015433 -105.13654594774593 599.1858895278361
+ endloop
+endfacet
+facet normal 2.7078805484912322e-14 -0.9238795325112836 0.3826834323650974
+ outer loop
+ vertex 150.0275345701543 -105.29638662375332 598.8000000000001
+ vertex -149.9724654298446 -105.13654594774586 599.185889527836
+ vertex -149.97246542984453 -105.29638662375329 598.8
+ endloop
+endfacet
+facet normal 2.7078805484912748e-14 -0.9238795325112981 0.38268343236506286
+ outer loop
+ vertex -149.97246542984507 -105.1365459477459 614.785889527836
+ vertex 150.02753457015376 -105.29638662375334 614.4000000000001
+ vertex 150.02753457015376 -105.13654594774594 614.785889527836
+ endloop
+endfacet
+facet normal 2.7078805484912748e-14 -0.9238795325112981 0.38268343236506286
+ outer loop
+ vertex 150.02753457015376 -105.29638662375334 614.4000000000001
+ vertex -149.97246542984507 -105.1365459477459 614.785889527836
+ vertex -149.972465429845 -105.29638662375329 614.4000000000001
+ endloop
+endfacet
+facet normal -3.732692600867556e-15 0.7933533402912383 -0.6087614290087168
+ outer loop
+ vertex -149.97246542984496 -108.06766791586354 616.0
+ vertex 150.02753457015376 -107.81339811970692 616.3313708498987
+ vertex 150.0275345701538 -108.06766791586355 616.0000000000001
+ endloop
+endfacet
+facet normal -3.732692600867556e-15 0.7933533402912383 -0.6087614290087168
+ outer loop
+ vertex 150.02753457015376 -107.81339811970692 616.3313708498987
+ vertex -149.97246542984496 -108.06766791586354 616.0
+ vertex -149.97246542984513 -107.81339811970687 616.3313708498986
+ endloop
+endfacet
+facet normal -3.732692600867157e-15 0.7933533402912247 -0.6087614290087344
+ outer loop
+ vertex -149.97246542984453 -108.06766791586351 600.4000000000001
+ vertex 150.02753457015433 -107.81339811970689 600.7313708498987
+ vertex 150.02753457015433 -108.06766791586354 600.4000000000002
+ endloop
+endfacet
+facet normal -3.732692600867157e-15 0.7933533402912247 -0.6087614290087344
+ outer loop
+ vertex 150.02753457015433 -107.81339811970689 600.7313708498987
+ vertex -149.97246542984453 -108.06766791586351 600.4000000000001
+ vertex -149.9724654298445 -107.81339811970687 600.7313708498986
+ endloop
+endfacet
+facet normal -3.88193401107154e-14 0.991444861373809 -0.13052619222006184
+ outer loop
+ vertex 150.02753457015427 -123.88202726980846 615.2000000000002
+ vertex -149.9724654298446 -123.82750859187092 615.6141104721642
+ vertex 150.02753457015427 -123.82750859187097 615.6141104721642
+ endloop
+endfacet
+facet normal -3.88193401107154e-14 0.991444861373809 -0.13052619222006184
+ outer loop
+ vertex -149.9724654298446 -123.82750859187092 615.6141104721642
+ vertex 150.02753457015427 -123.88202726980846 615.2000000000002
+ vertex -149.9724654298445 -123.88202726980839 615.2
+ endloop
+endfacet
+facet normal 5.200343766171987e-14 -0.6087614290087363 -0.7933533402912233
+ outer loop
+ vertex -149.97246542984468 -121.48202726980837 616.5856406460551
+ vertex 150.02753457015413 -121.15065641990995 616.3313708498987
+ vertex 150.02753457015413 -121.48202726980843 616.5856406460553
+ endloop
+endfacet
+facet normal 5.200343766171987e-14 -0.6087614290087363 -0.7933533402912233
+ outer loop
+ vertex 150.02753457015413 -121.15065641990995 616.3313708498987
+ vertex -149.97246542984468 -121.48202726980837 616.5856406460551
+ vertex -149.97246542984468 -121.15065641990992 616.3313708498986
+ endloop
+endfacet
+facet normal -4.5377116934718926e-14 0.3826834323651088 0.9238795325112789
+ outer loop
+ vertex 150.02753457015382 -107.0961377419725 613.6545186779376
+ vertex -149.97246542984504 -107.48202726980843 613.814359353945
+ vertex 150.02753457015388 -107.48202726980847 613.814359353945
+ endloop
+endfacet
+facet normal -4.5377116934718926e-14 0.3826834323651088 0.9238795325112789
+ outer loop
+ vertex -149.97246542984504 -107.48202726980843 613.814359353945
+ vertex 150.02753457015382 -107.0961377419725 613.6545186779376
+ vertex -149.9724654298449 -107.09613774197244 613.6545186779375
+ endloop
+endfacet
+facet normal -1.6776756168600079e-15 -0.6087614290087001 0.793353340291251
+ outer loop
+ vertex 150.02753457015422 -121.15065641990998 614.0686291501016
+ vertex -149.9724654298446 -121.4820272698084 613.814359353945
+ vertex 150.02753457015424 -121.48202726980847 613.814359353945
+ endloop
+endfacet
+facet normal -1.6776756168600079e-15 -0.6087614290087001 0.793353340291251
+ outer loop
+ vertex -149.9724654298446 -121.4820272698084 613.814359353945
+ vertex 150.02753457015422 -121.15065641990998 614.0686291501016
+ vertex -149.9724654298446 -121.15065641990992 614.0686291501015
+ endloop
+endfacet
+facet normal -6.557776824002234e-15 -0.6087614290087442 0.7933533402912171
+ outer loop
+ vertex 150.02753457015376 -105.55065641990998 614.0686291501016
+ vertex -149.97246542984504 -105.88202726980838 613.814359353945
+ vertex 150.0275345701538 -105.88202726980848 613.814359353945
+ endloop
+endfacet
+facet normal -6.557776824002234e-15 -0.6087614290087442 0.7933533402912171
+ outer loop
+ vertex -149.97246542984504 -105.88202726980838 613.814359353945
+ vertex 150.02753457015376 -105.55065641990998 614.0686291501016
+ vertex -149.97246542984507 -105.55065641990991 614.0686291501015
+ endloop
+endfacet
+facet normal -3.789340105087239e-14 0.7933533402912432 0.6087614290087103
+ outer loop
+ vertex -149.9724654298449 -107.81339811970689 614.0686291501016
+ vertex 150.02753457015382 -108.06766791586355 614.4000000000001
+ vertex 150.02753457015382 -107.81339811970695 614.0686291501017
+ endloop
+endfacet
+facet normal -3.789340105087239e-14 0.7933533402912432 0.6087614290087103
+ outer loop
+ vertex 150.02753457015382 -108.06766791586355 614.4000000000001
+ vertex -149.9724654298449 -107.81339811970689 614.0686291501016
+ vertex -149.972465429845 -108.06766791586351 614.4000000000001
+ endloop
+endfacet
+facet normal 1.8064198758146943e-14 0.38268343236510816 -0.9238795325112792
+ outer loop
+ vertex -149.97246542984453 -123.08202726980839 616.5856406460551
+ vertex 150.02753457015416 -122.69613774197248 616.7454813220627
+ vertex 150.0275345701542 -123.08202726980844 616.5856406460553
+ endloop
+endfacet
+facet normal 1.8064198758146943e-14 0.38268343236510816 -0.9238795325112792
+ outer loop
+ vertex 150.02753457015416 -122.69613774197248 616.7454813220627
+ vertex -149.97246542984453 -123.08202726980839 616.5856406460551
+ vertex -149.97246542984468 -122.69613774197245 616.7454813220626
+ endloop
+endfacet
+facet normal -3.732692600867157e-15 0.7933533402912247 -0.6087614290087344
+ outer loop
+ vertex -149.9724654298445 -123.6676679158635 616.0
+ vertex 150.0275345701542 -123.41339811970691 616.3313708498987
+ vertex 150.02753457015424 -123.66766791586355 616.0000000000001
+ endloop
+endfacet
+facet normal -3.732692600867157e-15 0.7933533402912247 -0.6087614290087344
+ outer loop
+ vertex 150.0275345701542 -123.41339811970691 616.3313708498987
+ vertex -149.9724654298445 -123.6676679158635 616.0
+ vertex -149.97246542984468 -123.41339811970687 616.3313708498986
+ endloop
+endfacet
+facet normal 4.781716753828934e-14 -0.3826834323650628 -0.923879532511298
+ outer loop
+ vertex -149.9724654298446 -121.86791679764437 616.7454813220626
+ vertex 150.02753457015413 -121.48202726980843 616.5856406460553
+ vertex 150.0275345701541 -121.86791679764438 616.7454813220626
+ endloop
+endfacet
+facet normal 4.781716753828934e-14 -0.3826834323650628 -0.923879532511298
+ outer loop
+ vertex 150.02753457015413 -121.48202726980843 616.5856406460553
+ vertex -149.9724654298446 -121.86791679764437 616.7454813220626
+ vertex -149.97246542984468 -121.48202726980837 616.5856406460551
+ endloop
+endfacet
+facet normal -3.277505099810546e-14 -0.13052619222005668 0.9914448613738097
+ outer loop
+ vertex 150.0275345701538 -106.26791679764442 613.6545186779376
+ vertex -149.97246542984504 -106.68202726980844 613.6
+ vertex 150.02753457015382 -106.68202726980847 613.6000000000001
+ endloop
+endfacet
+facet normal -3.277505099810546e-14 -0.13052619222005668 0.9914448613738097
+ outer loop
+ vertex -149.97246542984504 -106.68202726980844 613.6
+ vertex 150.0275345701538 -106.26791679764442 613.6545186779376
+ vertex -149.97246542984504 -106.26791679764438 613.6545186779375
+ endloop
+endfacet
+facet normal 4.277350225801563e-14 -0.7933533402912334 -0.6087614290087231
+ outer loop
+ vertex 150.02753457015413 -121.15065641990995 616.3313708498987
+ vertex -149.9724654298446 -120.89638662375332 616.0
+ vertex 150.02753457015413 -120.89638662375332 616.0000000000001
+ endloop
+endfacet
+facet normal 4.277350225801563e-14 -0.7933533402912334 -0.6087614290087231
+ outer loop
+ vertex -149.9724654298446 -120.89638662375332 616.0
+ vertex 150.02753457015413 -121.15065641990995 616.3313708498987
+ vertex -149.97246542984468 -121.15065641990992 616.3313708498986
+ endloop
+endfacet
+facet normal 4.6599210313486623e-14 -0.9238795325112901 -0.3826834323650818
+ outer loop
+ vertex 150.02753457015413 -120.89638662375332 616.0000000000001
+ vertex -149.97246542984468 -120.73654594774587 615.6141104721642
+ vertex 150.02753457015416 -120.73654594774594 615.6141104721642
+ endloop
+endfacet
+facet normal 4.6599210313486623e-14 -0.9238795325112901 -0.3826834323650818
+ outer loop
+ vertex -149.97246542984468 -120.73654594774587 615.6141104721642
+ vertex 150.02753457015413 -120.89638662375332 616.0000000000001
+ vertex -149.9724654298446 -120.89638662375332 616.0
+ endloop
+endfacet
+facet normal 2.905913769642842e-14 -0.9914448613738116 -0.13052619222004347
+ outer loop
+ vertex -149.97246542984468 -120.73654594774587 615.6141104721642
+ vertex 150.0275345701542 -120.68202726980842 615.2000000000002
+ vertex 150.02753457015416 -120.73654594774594 615.6141104721642
+ endloop
+endfacet
+facet normal 2.905913769642842e-14 -0.9914448613738116 -0.13052619222004347
+ outer loop
+ vertex 150.0275345701542 -120.68202726980842 615.2000000000002
+ vertex -149.97246542984468 -120.73654594774587 615.6141104721642
+ vertex -149.9724654298446 -120.6820272698084 615.2
+ endloop
+endfacet
+facet normal 3.7326926008669706e-15 -0.7933533402912183 0.6087614290087429
+ outer loop
+ vertex -149.972465429845 -105.29638662375329 614.4000000000001
+ vertex 150.02753457015376 -105.55065641990998 614.0686291501016
+ vertex 150.02753457015376 -105.29638662375334 614.4000000000001
+ endloop
+endfacet
+facet normal 3.7326926008669706e-15 -0.7933533402912183 0.6087614290087429
+ outer loop
+ vertex 150.02753457015376 -105.55065641990998 614.0686291501016
+ vertex -149.972465429845 -105.29638662375329 614.4000000000001
+ vertex -149.97246542984507 -105.55065641990991 614.0686291501015
+ endloop
+endfacet
+facet normal -2.905913769642855e-14 0.9914448613738159 0.13052619222001066
+ outer loop
+ vertex -149.97246542984504 -108.22750859187093 614.785889527836
+ vertex 150.02753457015382 -108.28202726980842 615.2000000000002
+ vertex 150.02753457015385 -108.22750859187097 614.785889527836
+ endloop
+endfacet
+facet normal -2.905913769642855e-14 0.9914448613738159 0.13052619222001066
+ outer loop
+ vertex 150.02753457015382 -108.28202726980842 615.2000000000002
+ vertex -149.97246542984504 -108.22750859187093 614.785889527836
+ vertex -149.97246542984496 -108.28202726980842 615.2
+ endloop
+endfacet
+facet normal -4.7817167538289264e-14 0.38268343236506036 0.923879532511299
+ outer loop
+ vertex 150.0275345701543 -122.69613774197249 613.6545186779376
+ vertex -149.97246542984453 -123.08202726980846 613.814359353945
+ vertex 150.0275345701543 -123.08202726980846 613.814359353945
+ endloop
+endfacet
+facet normal -4.7817167538289264e-14 0.38268343236506036 0.923879532511299
+ outer loop
+ vertex -149.97246542984453 -123.08202726980846 613.814359353945
+ vertex 150.0275345701543 -122.69613774197249 613.6545186779376
+ vertex -149.97246542984453 -122.69613774197245 613.6545186779375
+ endloop
+endfacet
+facet normal -4.277350225801563e-14 0.7933533402912334 0.6087614290087231
+ outer loop
+ vertex -149.97246542984445 -123.41339811970688 614.0686291501016
+ vertex 150.0275345701543 -123.66766791586357 614.4000000000001
+ vertex 150.0275345701543 -123.41339811970694 614.0686291501017
+ endloop
+endfacet
+facet normal -4.277350225801563e-14 0.7933533402912334 0.6087614290087231
+ outer loop
+ vertex 150.0275345701543 -123.66766791586357 614.4000000000001
+ vertex -149.97246542984445 -123.41339811970688 614.0686291501016
+ vertex -149.97246542984453 -123.6676679158635 614.4000000000001
+ endloop
+endfacet
+facet normal 4.164649241083345e-14 -0.13052619222006093 -0.9914448613738092
+ outer loop
+ vertex -149.97246542984468 -122.28202726980842 616.8000000000001
+ vertex 150.0275345701541 -121.86791679764438 616.7454813220626
+ vertex 150.0275345701542 -122.28202726980844 616.8000000000002
+ endloop
+endfacet
+facet normal 4.164649241083345e-14 -0.13052619222006093 -0.9914448613738092
+ outer loop
+ vertex 150.0275345701541 -121.86791679764438 616.7454813220626
+ vertex -149.97246542984468 -122.28202726980842 616.8000000000001
+ vertex -149.9724654298446 -121.86791679764437 616.7454813220626
+ endloop
+endfacet
+facet normal 3.732692600867157e-15 -0.7933533402912247 0.6087614290087344
+ outer loop
+ vertex -149.97246542984465 -120.89638662375329 614.4000000000001
+ vertex 150.02753457015422 -121.15065641990998 614.0686291501016
+ vertex 150.02753457015422 -120.89638662375336 614.4000000000001
+ endloop
+endfacet
+facet normal 3.732692600867157e-15 -0.7933533402912247 0.6087614290087344
+ outer loop
+ vertex 150.02753457015422 -121.15065641990998 614.0686291501016
+ vertex -149.97246542984465 -120.89638662375329 614.4000000000001
+ vertex -149.9724654298446 -121.15065641990992 614.0686291501015
+ endloop
+endfacet
+facet normal -6.176364007600701e-14 0.6087614290087395 0.7933533402912207
+ outer loop
+ vertex 150.0275345701543 -123.08202726980846 613.814359353945
+ vertex -149.97246542984445 -123.41339811970688 614.0686291501016
+ vertex 150.0275345701543 -123.41339811970694 614.0686291501017
+ endloop
+endfacet
+facet normal -6.176364007600701e-14 0.6087614290087395 0.7933533402912207
+ outer loop
+ vertex -149.97246542984445 -123.41339811970688 614.0686291501016
+ vertex 150.0275345701543 -123.08202726980846 613.814359353945
+ vertex -149.97246542984453 -123.08202726980846 613.814359353945
+ endloop
+endfacet
+facet normal -2.294429996529175e-14 -0.38268343236506447 0.9238795325112973
+ outer loop
+ vertex 150.0275345701538 -105.88202726980848 613.814359353945
+ vertex -149.97246542984504 -106.26791679764438 613.6545186779375
+ vertex 150.0275345701538 -106.26791679764442 613.6545186779376
+ endloop
+endfacet
+facet normal -2.294429996529175e-14 -0.38268343236506447 0.9238795325112973
+ outer loop
+ vertex -149.97246542984504 -106.26791679764438 613.6545186779375
+ vertex 150.0275345701538 -105.88202726980848 613.814359353945
+ vertex -149.97246542984504 -105.88202726980838 613.814359353945
+ endloop
+endfacet
+facet normal -5.200343766172004e-14 0.6087614290087426 0.7933533402912182
+ outer loop
+ vertex 150.02753457015388 -107.48202726980847 613.814359353945
+ vertex -149.9724654298449 -107.81339811970689 614.0686291501016
+ vertex 150.02753457015382 -107.81339811970695 614.0686291501017
+ endloop
+endfacet
+facet normal -5.200343766172004e-14 0.6087614290087426 0.7933533402912182
+ outer loop
+ vertex -149.9724654298449 -107.81339811970689 614.0686291501016
+ vertex 150.02753457015388 -107.48202726980847 613.814359353945
+ vertex -149.97246542984504 -107.48202726980843 613.814359353945
+ endloop
+endfacet
+facet normal -2.7078805484912322e-14 0.9238795325112836 -0.3826834323650974
+ outer loop
+ vertex -149.9724654298446 -123.82750859187092 615.6141104721642
+ vertex 150.02753457015424 -123.66766791586355 616.0000000000001
+ vertex 150.02753457015427 -123.82750859187097 615.6141104721642
+ endloop
+endfacet
+facet normal -2.7078805484912322e-14 0.9238795325112836 -0.3826834323650974
+ outer loop
+ vertex 150.02753457015424 -123.66766791586355 616.0000000000001
+ vertex -149.9724654298446 -123.82750859187092 615.6141104721642
+ vertex -149.9724654298445 -123.6676679158635 616.0
+ endloop
+endfacet
+facet normal 3.88193401107154e-14 -0.991444861373809 0.13052619222006184
+ outer loop
+ vertex -149.9724654298446 -120.6820272698084 615.2
+ vertex 150.0275345701542 -120.73654594774592 614.785889527836
+ vertex 150.0275345701542 -120.68202726980842 615.2000000000002
+ endloop
+endfacet
+facet normal 3.88193401107154e-14 -0.991444861373809 0.13052619222006184
+ outer loop
+ vertex 150.0275345701542 -120.73654594774592 614.785889527836
+ vertex -149.9724654298446 -120.6820272698084 615.2
+ vertex -149.97246542984465 -120.7365459477459 614.785889527836
+ endloop
+endfacet
+facet normal 1.631797923829057e-14 0.6087614290087004 -0.7933533402912507
+ outer loop
+ vertex -149.97246542984468 -123.41339811970687 616.3313708498986
+ vertex 150.0275345701542 -123.08202726980844 616.5856406460553
+ vertex 150.0275345701542 -123.41339811970691 616.3313708498987
+ endloop
+endfacet
+facet normal 1.631797923829057e-14 0.6087614290087004 -0.7933533402912507
+ outer loop
+ vertex 150.0275345701542 -123.08202726980844 616.5856406460553
+ vertex -149.97246542984468 -123.41339811970687 616.3313708498986
+ vertex -149.97246542984453 -123.08202726980839 616.5856406460551
+ endloop
+endfacet
+facet normal -4.04264671090476e-14 0.13052619222006184 0.9914448613738092
+ outer loop
+ vertex 150.02753457015427 -122.28202726980847 613.6000000000001
+ vertex -149.97246542984453 -122.69613774197245 613.6545186779375
+ vertex 150.0275345701543 -122.69613774197249 613.6545186779376
+ endloop
+endfacet
+facet normal -4.04264671090476e-14 0.13052619222006184 0.9914448613738092
+ outer loop
+ vertex -149.97246542984453 -122.69613774197245 613.6545186779375
+ vertex 150.02753457015427 -122.28202726980847 613.6000000000001
+ vertex -149.97246542984453 -122.28202726980842 613.6
+ endloop
+endfacet
+facet normal -2.905913769642842e-14 0.9914448613738116 0.130526192220043
+ outer loop
+ vertex -149.97246542984453 -123.8275085918709 614.785889527836
+ vertex 150.02753457015427 -123.88202726980846 615.2000000000002
+ vertex 150.02753457015427 -123.82750859187097 614.7858895278362
+ endloop
+endfacet
+facet normal -2.905913769642842e-14 0.9914448613738116 0.130526192220043
+ outer loop
+ vertex 150.02753457015427 -123.88202726980846 615.2000000000002
+ vertex -149.97246542984453 -123.8275085918709 614.785889527836
+ vertex -149.9724654298445 -123.88202726980839 615.2
+ endloop
+endfacet
+facet normal -4.659921031348627e-14 0.9238795325112781 0.38268343236511065
+ outer loop
+ vertex 150.02753457015382 -108.06766791586355 614.4000000000001
+ vertex -149.97246542984504 -108.22750859187093 614.785889527836
+ vertex 150.02753457015385 -108.22750859187097 614.785889527836
+ endloop
+endfacet
+facet normal -4.659921031348627e-14 0.9238795325112781 0.38268343236511065
+ outer loop
+ vertex -149.97246542984504 -108.22750859187093 614.785889527836
+ vertex 150.02753457015382 -108.06766791586355 614.4000000000001
+ vertex -149.972465429845 -108.06766791586351 614.4000000000001
+ endloop
+endfacet
+facet normal 3.155502569632095e-14 0.1305261922200097 -0.9914448613738159
+ outer loop
+ vertex -149.97246542984468 -122.69613774197245 616.7454813220626
+ vertex 150.0275345701542 -122.28202726980844 616.8000000000002
+ vertex 150.02753457015416 -122.69613774197248 616.7454813220627
+ endloop
+endfacet
+facet normal 3.155502569632095e-14 0.1305261922200097 -0.9914448613738159
+ outer loop
+ vertex 150.0275345701542 -122.28202726980844 616.8000000000002
+ vertex -149.97246542984468 -122.69613774197245 616.7454813220626
+ vertex -149.97246542984468 -122.28202726980842 616.8000000000001
+ endloop
+endfacet
+facet normal -5.6359412727773843e-14 0.9238795325112955 0.3826834323650685
+ outer loop
+ vertex -149.97246542984453 -123.6676679158635 614.4000000000001
+ vertex 150.02753457015427 -123.82750859187097 614.7858895278362
+ vertex 150.0275345701543 -123.66766791586357 614.4000000000001
+ endloop
+endfacet
+facet normal -5.6359412727773843e-14 0.9238795325112955 0.3826834323650685
+ outer loop
+ vertex 150.02753457015427 -123.82750859187097 614.7858895278362
+ vertex -149.97246542984453 -123.6676679158635 614.4000000000001
+ vertex -149.97246542984453 -123.8275085918709 614.785889527836
+ endloop
+endfacet
+facet normal 2.7078805484912322e-14 -0.9238795325112836 0.3826834323650974
+ outer loop
+ vertex -149.97246542984465 -120.7365459477459 614.785889527836
+ vertex 150.02753457015422 -120.89638662375336 614.4000000000001
+ vertex 150.0275345701542 -120.73654594774592 614.785889527836
+ endloop
+endfacet
+facet normal 2.7078805484912322e-14 -0.9238795325112836 0.3826834323650974
+ outer loop
+ vertex 150.02753457015422 -120.89638662375336 614.4000000000001
+ vertex -149.97246542984465 -120.7365459477459 614.785889527836
+ vertex -149.97246542984465 -120.89638662375329 614.4000000000001
+ endloop
+endfacet
+facet normal -4.04264671090476e-14 0.13052619222006184 0.9914448613738092
+ outer loop
+ vertex 150.02753457015382 -106.68202726980847 613.6000000000001
+ vertex -149.9724654298449 -107.09613774197244 613.6545186779375
+ vertex 150.02753457015382 -107.0961377419725 613.6545186779376
+ endloop
+endfacet
+facet normal -4.04264671090476e-14 0.13052619222006184 0.9914448613738092
+ outer loop
+ vertex -149.9724654298449 -107.09613774197244 613.6545186779375
+ vertex 150.02753457015382 -106.68202726980847 613.6000000000001
+ vertex -149.97246542984504 -106.68202726980844 613.6
+ endloop
+endfacet
+facet normal 4.659921031348627e-14 -0.9238795325112781 -0.38268343236511065
+ outer loop
+ vertex -149.97246542984414 -120.89638662375329 600.4000000000001
+ vertex 150.02753457015473 -120.73654594774594 600.0141104721642
+ vertex 150.02753457015473 -120.89638662375336 600.4000000000002
+ endloop
+endfacet
+facet normal 4.659921031348627e-14 -0.9238795325112781 -0.38268343236511065
+ outer loop
+ vertex 150.02753457015473 -120.73654594774594 600.0141104721642
+ vertex -149.97246542984414 -120.89638662375329 600.4000000000001
+ vertex -149.97246542984414 -120.73654594774587 600.0141104721641
+ endloop
+endfacet
+facet normal 2.905913769642855e-14 -0.9914448613738159 -0.13052619222001066
+ outer loop
+ vertex -149.97246542984414 -120.73654594774587 600.0141104721641
+ vertex 150.02753457015476 -120.68202726980844 599.6000000000001
+ vertex 150.02753457015473 -120.73654594774594 600.0141104721642
+ endloop
+endfacet
+facet normal 2.905913769642855e-14 -0.9914448613738159 -0.13052619222001066
+ outer loop
+ vertex 150.02753457015476 -120.68202726980844 599.6000000000001
+ vertex -149.97246542984414 -120.73654594774587 600.0141104721641
+ vertex -149.9724654298441 -120.68202726980837 599.6
+ endloop
+endfacet
+facet normal 2.7078805484912748e-14 -0.9238795325112981 0.38268343236506286
+ outer loop
+ vertex -149.9724654298441 -120.7365459477459 599.185889527836
+ vertex 150.02753457015476 -120.89638662375333 598.8000000000002
+ vertex 150.02753457015476 -120.73654594774594 599.1858895278361
+ endloop
+endfacet
+facet normal 2.7078805484912748e-14 -0.9238795325112981 0.38268343236506286
+ outer loop
+ vertex 150.02753457015476 -120.89638662375333 598.8000000000002
+ vertex -149.9724654298441 -120.7365459477459 599.185889527836
+ vertex -149.97246542984405 -120.89638662375333 598.8000000000001
+ endloop
+endfacet
+facet normal 3.88193401107154e-14 -0.991444861373809 0.13052619222006184
+ outer loop
+ vertex -149.9724654298441 -120.68202726980837 599.6
+ vertex 150.02753457015476 -120.73654594774594 599.1858895278361
+ vertex 150.02753457015476 -120.68202726980844 599.6000000000001
+ endloop
+endfacet
+facet normal 3.88193401107154e-14 -0.991444861373809 0.13052619222006184
+ outer loop
+ vertex 150.02753457015476 -120.73654594774594 599.1858895278361
+ vertex -149.9724654298441 -120.68202726980837 599.6
+ vertex -149.9724654298441 -120.7365459477459 599.185889527836
+ endloop
+endfacet
+facet normal -3.277505099810686e-14 -0.13052619222000883 0.991444861373816
+ outer loop
+ vertex 150.02753457015424 -121.86791679764441 613.6545186779376
+ vertex -149.97246542984453 -122.28202726980842 613.6
+ vertex 150.02753457015427 -122.28202726980847 613.6000000000001
+ endloop
+endfacet
+facet normal -3.277505099810686e-14 -0.13052619222000883 0.991444861373816
+ outer loop
+ vertex -149.97246542984453 -122.28202726980842 613.6
+ vertex 150.02753457015424 -121.86791679764441 613.6545186779376
+ vertex -149.97246542984465 -121.86791679764438 613.6545186779375
+ endloop
+endfacet
+facet normal -3.1555025696319373e-14 -0.1305261922200637 0.9914448613738089
+ outer loop
+ vertex 150.0275345701548 -121.86791679764445 598.0545186779377
+ vertex -149.97246542984405 -122.28202726980844 598.0000000000001
+ vertex 150.02753457015484 -122.28202726980847 598.0000000000001
+ endloop
+endfacet
+facet normal -3.1555025696319373e-14 -0.1305261922200637 0.9914448613738089
+ outer loop
+ vertex -149.97246542984405 -122.28202726980844 598.0000000000001
+ vertex 150.0275345701548 -121.86791679764445 598.0545186779377
+ vertex -149.972465429844 -121.86791679764438 598.0545186779376
+ endloop
+endfacet
+facet normal -2.905913769642855e-14 0.9914448613738158 0.1305261922200104
+ outer loop
+ vertex -149.972465429844 -123.82750859187092 599.185889527836
+ vertex 150.0275345701548 -123.88202726980843 599.6000000000001
+ vertex 150.02753457015487 -123.82750859187097 599.1858895278361
+ endloop
+endfacet
+facet normal -2.905913769642855e-14 0.9914448613738158 0.1305261922200104
+ outer loop
+ vertex 150.0275345701548 -123.88202726980843 599.6000000000001
+ vertex -149.972465429844 -123.82750859187092 599.185889527836
+ vertex -149.9724654298439 -123.88202726980842 599.6
+ endloop
+endfacet
+facet normal 1.1474086062765636e-15 0.793353340291218 -0.6087614290087431
+ outer loop
+ vertex -149.97246542984396 -123.66766791586353 600.4000000000001
+ vertex 150.02753457015476 -123.41339811970691 600.7313708498987
+ vertex 150.0275345701548 -123.66766791586355 600.4000000000002
+ endloop
+endfacet
+facet normal 1.1474086062765636e-15 0.793353340291218 -0.6087614290087431
+ outer loop
+ vertex 150.02753457015476 -123.41339811970691 600.7313708498987
+ vertex -149.97246542984396 -123.66766791586353 600.4000000000001
+ vertex -149.97246542984405 -123.41339811970687 600.7313708498986
+ endloop
+endfacet
+facet normal -2.050424936172055e-14 -0.3826834323650453 0.9238795325113052
+ outer loop
+ vertex 150.0275345701548 -121.48202726980844 598.214359353945
+ vertex -149.972465429844 -121.86791679764438 598.0545186779376
+ vertex 150.0275345701548 -121.86791679764445 598.0545186779377
+ endloop
+endfacet
+facet normal -2.050424936172055e-14 -0.3826834323650453 0.9238795325113052
+ outer loop
+ vertex -149.972465429844 -121.86791679764438 598.0545186779376
+ vertex 150.0275345701548 -121.48202726980844 598.214359353945
+ vertex -149.97246542984405 -121.4820272698084 598.2143593539449
+ endloop
+endfacet
+facet normal 6.557776824002234e-15 0.6087614290087442 -0.7933533402912171
+ outer loop
+ vertex -149.97246542984405 -123.41339811970687 600.7313708498986
+ vertex 150.02753457015476 -123.08202726980844 600.9856406460553
+ vertex 150.02753457015476 -123.41339811970691 600.7313708498987
+ endloop
+endfacet
+facet normal 6.557776824002234e-15 0.6087614290087442 -0.7933533402912171
+ outer loop
+ vertex 150.02753457015476 -123.08202726980844 600.9856406460553
+ vertex -149.97246542984405 -123.41339811970687 600.7313708498986
+ vertex -149.97246542984414 -123.08202726980842 600.9856406460552
+ endloop
+endfacet
+facet normal -5.2003437661719044e-14 0.6087614290087087 0.7933533402912443
+ outer loop
+ vertex 150.02753457015487 -123.08202726980849 598.214359353945
+ vertex -149.9724654298439 -123.41339811970688 598.4686291501016
+ vertex 150.02753457015487 -123.41339811970694 598.4686291501016
+ endloop
+endfacet
+facet normal -5.2003437661719044e-14 0.6087614290087087 0.7933533402912443
+ outer loop
+ vertex -149.9724654298439 -123.41339811970688 598.4686291501016
+ vertex 150.02753457015487 -123.08202726980849 598.214359353945
+ vertex -149.97246542984405 -123.08202726980842 598.2143593539449
+ endloop
+endfacet
+facet normal 3.277505099810546e-14 0.13052619222005668 -0.9914448613738097
+ outer loop
+ vertex -149.972465429844 -122.69613774197245 601.1454813220626
+ vertex 150.02753457015467 -122.28202726980842 601.2000000000002
+ vertex 150.0275345701547 -122.69613774197248 601.1454813220627
+ endloop
+endfacet
+facet normal 3.277505099810546e-14 0.13052619222005668 -0.9914448613738097
+ outer loop
+ vertex 150.02753457015467 -122.28202726980842 601.2000000000002
+ vertex -149.972465429844 -122.69613774197245 601.1454813220626
+ vertex -149.972465429844 -122.28202726980837 601.2
+ endloop
+endfacet
+facet normal 5.200343766172004e-14 -0.6087614290087426 -0.7933533402912182
+ outer loop
+ vertex -149.9724654298442 -121.4820272698084 600.9856406460552
+ vertex 150.0275345701547 -121.15065641990995 600.7313708498986
+ vertex 150.02753457015467 -121.48202726980844 600.9856406460553
+ endloop
+endfacet
+facet normal 5.200343766172004e-14 -0.6087614290087426 -0.7933533402912182
+ outer loop
+ vertex 150.0275345701547 -121.15065641990995 600.7313708498986
+ vertex -149.9724654298442 -121.4820272698084 600.9856406460552
+ vertex -149.97246542984414 -121.15065641990992 600.7313708498986
+ endloop
+endfacet
+facet normal 3.789340105087239e-14 -0.7933533402912432 -0.6087614290087103
+ outer loop
+ vertex 150.0275345701547 -121.15065641990995 600.7313708498986
+ vertex -149.97246542984414 -120.89638662375329 600.4000000000001
+ vertex 150.02753457015473 -120.89638662375336 600.4000000000002
+ endloop
+endfacet
+facet normal 3.789340105087239e-14 -0.7933533402912432 -0.6087614290087103
+ outer loop
+ vertex -149.97246542984414 -120.89638662375329 600.4000000000001
+ vertex 150.0275345701547 -121.15065641990995 600.7313708498986
+ vertex -149.97246542984414 -121.15065641990992 600.7313708498986
+ endloop
+endfacet
+facet normal -5.253370467230355e-14 0.7933533402912631 0.6087614290086841
+ outer loop
+ vertex -149.9724654298439 -123.41339811970688 598.4686291501016
+ vertex 150.02753457015484 -123.66766791586357 598.8000000000002
+ vertex 150.02753457015487 -123.41339811970694 598.4686291501016
+ endloop
+endfacet
+facet normal -5.253370467230355e-14 0.7933533402912631 0.6087614290086841
+ outer loop
+ vertex 150.02753457015484 -123.66766791586357 598.8000000000002
+ vertex -149.9724654298439 -123.41339811970688 598.4686291501016
+ vertex -149.9724654298439 -123.66766791586353 598.8000000000001
+ endloop
+endfacet
+facet normal -4.537711693471893e-14 0.38268343236510904 0.9238795325112787
+ outer loop
+ vertex 150.02753457015484 -122.69613774197249 598.0545186779377
+ vertex -149.97246542984405 -123.08202726980842 598.2143593539449
+ vertex 150.02753457015487 -123.08202726980849 598.214359353945
+ endloop
+endfacet
+facet normal -4.537711693471893e-14 0.38268343236510904 0.9238795325112787
+ outer loop
+ vertex -149.97246542984405 -123.08202726980842 598.2143593539449
+ vertex 150.02753457015484 -122.69613774197249 598.0545186779377
+ vertex -149.972465429844 -122.69613774197245 598.0545186779376
+ endloop
+endfacet
+facet normal -1.677675616859735e-15 -0.6087614290087094 0.7933533402912438
+ outer loop
+ vertex 150.02753457015476 -121.15065641990998 598.4686291501016
+ vertex -149.97246542984405 -121.4820272698084 598.2143593539449
+ vertex 150.0275345701548 -121.48202726980844 598.214359353945
+ endloop
+endfacet
+facet normal -1.677675616859735e-15 -0.6087614290087094 0.7933533402912438
+ outer loop
+ vertex -149.97246542984405 -121.4820272698084 598.2143593539449
+ vertex 150.02753457015476 -121.15065641990998 598.4686291501016
+ vertex -149.97246542984405 -121.15065641990992 598.4686291501016
+ endloop
+endfacet
+facet normal -4.659921031348628e-14 0.9238795325112782 0.38268343236511054
+ outer loop
+ vertex 150.02753457015484 -123.66766791586357 598.8000000000002
+ vertex -149.972465429844 -123.82750859187092 599.185889527836
+ vertex 150.02753457015487 -123.82750859187097 599.1858895278361
+ endloop
+endfacet
+facet normal -4.659921031348628e-14 0.9238795325112782 0.38268343236511054
+ outer loop
+ vertex -149.972465429844 -123.82750859187092 599.185889527836
+ vertex 150.02753457015484 -123.66766791586357 598.8000000000002
+ vertex -149.9724654298439 -123.66766791586353 598.8000000000001
+ endloop
+endfacet
+facet normal -2.7078805484912748e-14 0.9238795325112981 -0.38268343236506286
+ outer loop
+ vertex 150.0275345701548 -123.82750859187097 600.0141104721642
+ vertex -149.97246542984396 -123.66766791586353 600.4000000000001
+ vertex 150.0275345701548 -123.66766791586355 600.4000000000002
+ endloop
+endfacet
+facet normal -2.7078805484912748e-14 0.9238795325112981 -0.38268343236506286
+ outer loop
+ vertex -149.97246542984396 -123.66766791586353 600.4000000000001
+ vertex 150.0275345701548 -123.82750859187097 600.0141104721642
+ vertex -149.9724654298441 -123.82750859187092 600.0141104721641
+ endloop
+endfacet
+facet normal -1.8064198758146943e-14 -0.38268343236510816 0.9238795325112792
+ outer loop
+ vertex 150.02753457015424 -121.48202726980847 613.814359353945
+ vertex -149.97246542984465 -121.86791679764438 613.6545186779375
+ vertex 150.02753457015424 -121.86791679764441 613.6545186779376
+ endloop
+endfacet
+facet normal -1.8064198758146943e-14 -0.38268343236510816 0.9238795325112792
+ outer loop
+ vertex -149.97246542984465 -121.86791679764438 613.6545186779375
+ vertex 150.02753457015424 -121.48202726980847 613.814359353945
+ vertex -149.9724654298446 -121.4820272698084 613.814359353945
+ endloop
+endfacet
+facet normal 3.732692600867556e-15 -0.7933533402912383 0.6087614290087168
+ outer loop
+ vertex -149.97246542984405 -120.89638662375333 598.8000000000001
+ vertex 150.02753457015476 -121.15065641990998 598.4686291501016
+ vertex 150.02753457015476 -120.89638662375333 598.8000000000002
+ endloop
+endfacet
+facet normal 3.732692600867556e-15 -0.7933533402912383 0.6087614290087168
+ outer loop
+ vertex 150.02753457015476 -121.15065641990998 598.4686291501016
+ vertex -149.97246542984405 -120.89638662375333 598.8000000000001
+ vertex -149.97246542984405 -121.15065641990992 598.4686291501016
+ endloop
+endfacet
+facet normal -4.04264671090476e-14 0.13052619222006184 0.9914448613738092
+ outer loop
+ vertex 150.02753457015484 -122.28202726980847 598.0000000000001
+ vertex -149.972465429844 -122.69613774197245 598.0545186779376
+ vertex 150.02753457015484 -122.69613774197249 598.0545186779377
+ endloop
+endfacet
+facet normal -4.04264671090476e-14 0.13052619222006184 0.9914448613738092
+ outer loop
+ vertex -149.972465429844 -122.69613774197245 598.0545186779376
+ vertex 150.02753457015484 -122.28202726980847 598.0000000000001
+ vertex -149.97246542984405 -122.28202726980844 598.0000000000001
+ endloop
+endfacet
+facet normal 2.294429996529175e-14 0.38268343236506447 -0.9238795325112973
+ outer loop
+ vertex -149.97246542984414 -123.08202726980842 600.9856406460552
+ vertex 150.0275345701547 -122.69613774197248 601.1454813220627
+ vertex 150.02753457015476 -123.08202726980844 600.9856406460553
+ endloop
+endfacet
+facet normal 2.294429996529175e-14 0.38268343236506447 -0.9238795325112973
+ outer loop
+ vertex 150.0275345701547 -122.69613774197248 601.1454813220627
+ vertex -149.97246542984414 -123.08202726980842 600.9856406460552
+ vertex -149.972465429844 -122.69613774197245 601.1454813220626
+ endloop
+endfacet
+facet normal 4.5377116934718926e-14 -0.3826834323651088 -0.9238795325112789
+ outer loop
+ vertex -149.9724654298442 -121.86791679764437 601.1454813220626
+ vertex 150.02753457015467 -121.48202726980844 600.9856406460553
+ vertex 150.0275345701547 -121.86791679764438 601.1454813220627
+ endloop
+endfacet
+facet normal 4.5377116934718926e-14 -0.3826834323651088 -0.9238795325112789
+ outer loop
+ vertex 150.02753457015467 -121.48202726980844 600.9856406460553
+ vertex -149.9724654298442 -121.86791679764437 601.1454813220626
+ vertex -149.9724654298442 -121.4820272698084 600.9856406460552
+ endloop
+endfacet
+facet normal -3.88193401107154e-14 0.991444861373809 -0.13052619222006204
+ outer loop
+ vertex 150.0275345701548 -123.88202726980843 599.6000000000001
+ vertex -149.9724654298441 -123.82750859187092 600.0141104721641
+ vertex 150.0275345701548 -123.82750859187097 600.0141104721642
+ endloop
+endfacet
+facet normal -3.88193401107154e-14 0.991444861373809 -0.13052619222006204
+ outer loop
+ vertex -149.9724654298441 -123.82750859187092 600.0141104721641
+ vertex 150.0275345701548 -123.88202726980843 599.6000000000001
+ vertex -149.9724654298439 -123.88202726980842 599.6
+ endloop
+endfacet
+facet normal 4.04264671090476e-14 -0.13052619222006184 -0.9914448613738092
+ outer loop
+ vertex -149.972465429844 -122.28202726980837 601.2
+ vertex 150.0275345701547 -121.86791679764438 601.1454813220627
+ vertex 150.02753457015467 -122.28202726980842 601.2000000000002
+ endloop
+endfacet
+facet normal 4.04264671090476e-14 -0.13052619222006184 -0.9914448613738092
+ outer loop
+ vertex 150.0275345701547 -121.86791679764438 601.1454813220627
+ vertex -149.972465429844 -122.28202726980837 601.2
+ vertex -149.9724654298442 -121.86791679764437 601.1454813220626
+ endloop
+endfacet
+facet normal 3.8819340110715427e-14 -0.9914448613738099 0.1305261922200554
+ outer loop
+ vertex -149.9724654298446 -124.44795309609745 616.6588190451026
+ vertex 150.02753457015424 -124.48202726980848 616.4000000000001
+ vertex 150.02753457015424 -124.44795309609752 616.6588190451026
+ endloop
+endfacet
+facet normal 3.8819340110715427e-14 -0.9914448613738099 0.1305261922200554
+ outer loop
+ vertex 150.02753457015424 -124.48202726980848 616.4000000000001
+ vertex -149.9724654298446 -124.44795309609745 616.6588190451026
+ vertex -149.9724654298446 -124.4820272698084 616.4000000000001
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 1.5003536199769242e-15
+ outer loop
+ vertex 150.02753457015424 -124.48202726980848 616.4000000000001
+ vertex -149.97246542984445 -124.48202726980841 611.2
+ vertex 150.02753457015444 -124.48202726980846 611.2000000000002
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 1.5003536199769242e-15
+ outer loop
+ vertex -149.97246542984445 -124.48202726980841 611.2
+ vertex 150.02753457015424 -124.48202726980848 616.4000000000001
+ vertex -149.9724654298446 -124.4820272698084 616.4000000000001
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -4.4649600931051686e-15
+ outer loop
+ vertex -149.97246542984442 -124.08202726980842 611.2
+ vertex 150.02753457015444 -124.08202726980846 610.8000000000002
+ vertex 150.02753457015444 -124.08202726980846 611.2000000000002
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -4.4649600931051686e-15
+ outer loop
+ vertex 150.02753457015444 -124.08202726980846 610.8000000000002
+ vertex -149.97246542984442 -124.08202726980842 611.2
+ vertex -149.9724654298443 -124.08202726980844 610.8000000000001
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex -149.97246542984445 -122.68202726980842 613.0000000000001
+ vertex 150.02753457015422 -120.64771269475773 613.0000000000002
+ vertex 150.02753457015433 -122.68202726980844 613.0000000000002
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex 150.02753457015422 -120.64771269475773 613.0000000000002
+ vertex -149.97246542984445 -122.68202726980842 613.0000000000001
+ vertex -149.97246542984465 -120.64771269475769 613.0000000000001
+ endloop
+endfacet
+facet normal 2.7078805484912562e-14 -0.9238795325112917 0.3826834323650779
+ outer loop
+ vertex -149.97246542984465 -124.34805267359285 616.9
+ vertex 150.02753457015424 -124.44795309609752 616.6588190451026
+ vertex 150.02753457015422 -124.34805267359289 616.9000000000001
+ endloop
+endfacet
+facet normal 2.7078805484912562e-14 -0.9238795325112917 0.3826834323650779
+ outer loop
+ vertex 150.02753457015424 -124.44795309609752 616.6588190451026
+ vertex -149.97246542984465 -124.34805267359285 616.9
+ vertex -149.9724654298446 -124.44795309609745 616.6588190451026
+ endloop
+endfacet
+facet normal 4.024562528319985e-14 -0.7071067811865452 -0.7071067811865499
+ outer loop
+ vertex -149.97246542984465 -120.64771269475769 613.0000000000001
+ vertex 150.02753457015427 -118.18202726980844 610.5343145750509
+ vertex 150.02753457015422 -120.64771269475773 613.0000000000002
+ endloop
+endfacet
+facet normal 4.024562528319985e-14 -0.7071067811865452 -0.7071067811865499
+ outer loop
+ vertex 150.02753457015427 -118.18202726980844 610.5343145750509
+ vertex -149.97246542984465 -120.64771269475769 613.0000000000001
+ vertex -149.9724654298446 -118.18202726980839 610.5343145750509
+ endloop
+endfacet
+facet normal 3.592621386430645e-14 1.705409617590812e-14 -1.0
+ outer loop
+ vertex -149.9724654298443 -124.08202726980844 610.8000000000001
+ vertex 150.02753457015442 -122.68202726980844 610.8000000000002
+ vertex 150.02753457015444 -124.08202726980846 610.8000000000002
+ endloop
+endfacet
+facet normal 3.592621386430645e-14 1.705409617590812e-14 -1.0
+ outer loop
+ vertex 150.02753457015442 -122.68202726980844 610.8000000000002
+ vertex -149.9724654298443 -124.08202726980844 610.8000000000001
+ vertex -149.97246542984445 -122.6820272698084 610.8000000000001
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex -149.97246542984445 -124.48202726980841 611.2
+ vertex 150.02753457015444 -124.08202726980846 611.2000000000002
+ vertex 150.02753457015444 -124.48202726980846 611.2000000000002
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex 150.02753457015444 -124.08202726980846 611.2000000000002
+ vertex -149.97246542984445 -124.48202726980841 611.2
+ vertex -149.97246542984442 -124.08202726980842 611.2
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex 150.02753457015442 -122.68202726980844 610.8000000000002
+ vertex -149.97246542984445 -122.68202726980842 613.0000000000001
+ vertex 150.02753457015433 -122.68202726980844 613.0000000000002
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex -149.97246542984445 -122.68202726980842 613.0000000000001
+ vertex 150.02753457015442 -122.68202726980844 610.8000000000002
+ vertex -149.97246542984445 -122.6820272698084 610.8000000000001
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -1.052465433482836e-15
+ outer loop
+ vertex 150.02753457015427 -118.18202726980844 610.5343145750509
+ vertex -149.97246542984436 -118.1820272698084 604.2656854249493
+ vertex 150.02753457015453 -118.18202726980843 604.2656854249494
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -1.052465433482836e-15
+ outer loop
+ vertex -149.97246542984436 -118.1820272698084 604.2656854249493
+ vertex 150.02753457015427 -118.18202726980844 610.5343145750509
+ vertex -149.9724654298446 -118.18202726980839 610.5343145750509
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex -149.9724654298446 -104.48202726980838 598.4000000000001
+ vertex 150.02753457015413 -104.48202726980843 603.6000000000001
+ vertex 150.02753457015433 -104.48202726980843 598.4000000000002
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex 150.02753457015413 -104.48202726980843 603.6000000000001
+ vertex -149.9724654298446 -104.48202726980838 598.4000000000001
+ vertex -149.97246542984473 -104.48202726980838 603.6
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex 150.02753457015413 -104.48202726980843 603.6000000000001
+ vertex -149.97246542984476 -104.8820272698084 603.6
+ vertex 150.02753457015413 -104.88202726980845 603.6000000000001
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex -149.97246542984476 -104.8820272698084 603.6
+ vertex 150.02753457015413 -104.48202726980843 603.6000000000001
+ vertex -149.97246542984473 -104.48202726980838 603.6
+ endloop
+endfacet
+facet normal -3.907009026439115e-14 1.0 2.739417086921043e-15
+ outer loop
+ vertex -149.97246542984453 -110.7820272698084 604.2656854249493
+ vertex 150.02753457015405 -110.78202726980844 610.5343145750509
+ vertex 150.0275345701543 -110.78202726980844 604.2656854249494
+ endloop
+endfacet
+facet normal -3.907009026439115e-14 1.0 2.739417086921043e-15
+ outer loop
+ vertex 150.02753457015405 -110.78202726980844 610.5343145750509
+ vertex -149.97246542984453 -110.7820272698084 604.2656854249493
+ vertex -149.97246542984468 -110.7820272698084 610.5343145750508
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex 150.0275345701541 -104.88202726980843 604.0000000000001
+ vertex -149.97246542984468 -106.28202726980838 604.0000000000001
+ vertex 150.02753457015413 -106.28202726980845 604.0000000000001
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex -149.97246542984468 -106.28202726980838 604.0000000000001
+ vertex 150.0275345701541 -104.88202726980843 604.0000000000001
+ vertex -149.97246542984473 -104.8820272698084 604.0000000000001
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex -149.97246542984496 -108.31634184485917 613.0
+ vertex 150.02753457015382 -106.28202726980847 613.0000000000001
+ vertex 150.0275345701539 -108.31634184485921 613.0000000000001
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex 150.02753457015382 -106.28202726980847 613.0000000000001
+ vertex -149.97246542984496 -108.31634184485917 613.0
+ vertex -149.972465429845 -106.28202726980841 613.0
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex -149.972465429845 -106.28202726980841 613.0
+ vertex 150.0275345701539 -106.28202726980842 610.8000000000002
+ vertex 150.02753457015382 -106.28202726980847 613.0000000000001
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex 150.0275345701539 -106.28202726980842 610.8000000000002
+ vertex -149.972465429845 -106.28202726980841 613.0
+ vertex -149.9724654298449 -106.28202726980838 610.8000000000001
+ endloop
+endfacet
+facet normal 3.592621386430645e-14 1.7054096175908306e-14 -1.0
+ outer loop
+ vertex -149.9724654298449 -106.28202726980838 610.8000000000001
+ vertex 150.0275345701539 -104.88202726980843 610.8000000000002
+ vertex 150.0275345701539 -106.28202726980842 610.8000000000002
+ endloop
+endfacet
+facet normal 3.592621386430645e-14 1.7054096175908306e-14 -1.0
+ outer loop
+ vertex 150.0275345701539 -104.88202726980843 610.8000000000002
+ vertex -149.9724654298449 -106.28202726980838 610.8000000000001
+ vertex -149.97246542984496 -104.88202726980839 610.8000000000001
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex 150.02753457015424 -106.28202726980842 601.8000000000001
+ vertex -149.9724654298446 -108.31634184485914 601.8000000000001
+ vertex 150.0275345701543 -108.31634184485917 601.8000000000001
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex -149.9724654298446 -108.31634184485914 601.8000000000001
+ vertex 150.02753457015424 -106.28202726980842 601.8000000000001
+ vertex -149.9724654298446 -106.28202726980841 601.8000000000001
+ endloop
+endfacet
+facet normal -4.024562528319985e-14 0.7071067811865452 0.7071067811865499
+ outer loop
+ vertex 150.0275345701543 -108.31634184485917 601.8000000000001
+ vertex -149.97246542984453 -110.7820272698084 604.2656854249493
+ vertex 150.0275345701543 -110.78202726980844 604.2656854249494
+ endloop
+endfacet
+facet normal -4.024562528319985e-14 0.7071067811865452 0.7071067811865499
+ outer loop
+ vertex -149.97246542984453 -110.7820272698084 604.2656854249493
+ vertex 150.0275345701543 -108.31634184485917 601.8000000000001
+ vertex -149.9724654298446 -108.31634184485914 601.8000000000001
+ endloop
+endfacet
+facet normal -1.2048156260518093e-15 0.7071067811865513 -0.7071067811865437
+ outer loop
+ vertex 150.02753457015405 -110.78202726980844 610.5343145750509
+ vertex -149.97246542984496 -108.31634184485917 613.0
+ vertex 150.0275345701539 -108.31634184485921 613.0000000000001
+ endloop
+endfacet
+facet normal -1.2048156260518093e-15 0.7071067811865513 -0.7071067811865437
+ outer loop
+ vertex -149.97246542984496 -108.31634184485917 613.0
+ vertex 150.02753457015405 -110.78202726980844 610.5343145750509
+ vertex -149.97246542984468 -110.7820272698084 610.5343145750508
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex 150.0275345701539 -104.88202726980843 610.8000000000002
+ vertex -149.972465429845 -104.88202726980839 611.2
+ vertex 150.0275345701539 -104.88202726980843 611.2000000000002
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex -149.972465429845 -104.88202726980839 611.2
+ vertex 150.0275345701539 -104.88202726980843 610.8000000000002
+ vertex -149.97246542984496 -104.88202726980839 610.8000000000001
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex -149.972465429845 -104.88202726980839 611.2
+ vertex 150.02753457015385 -104.48202726980846 611.2000000000002
+ vertex 150.0275345701539 -104.88202726980843 611.2000000000002
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex 150.02753457015385 -104.48202726980846 611.2000000000002
+ vertex -149.972465429845 -104.88202726980839 611.2
+ vertex -149.97246542984504 -104.48202726980843 611.2
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex -149.97246542984476 -104.8820272698084 603.6
+ vertex 150.0275345701541 -104.88202726980843 604.0000000000001
+ vertex 150.02753457015413 -104.88202726980845 603.6000000000001
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex 150.0275345701541 -104.88202726980843 604.0000000000001
+ vertex -149.97246542984476 -104.8820272698084 603.6
+ vertex -149.97246542984473 -104.8820272698084 604.0000000000001
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex 150.02753457015413 -106.28202726980845 604.0000000000001
+ vertex -149.9724654298446 -106.28202726980841 601.8000000000001
+ vertex 150.02753457015424 -106.28202726980842 601.8000000000001
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex -149.9724654298446 -106.28202726980841 601.8000000000001
+ vertex 150.02753457015413 -106.28202726980845 604.0000000000001
+ vertex -149.97246542984468 -106.28202726980838 604.0000000000001
+ endloop
+endfacet
+facet normal -3.789340105087216e-14 0.7933533402912354 0.6087614290087203
+ outer loop
+ vertex -149.9724654298452 -104.61600186602396 616.9
+ vertex 150.0275345701536 -104.7749204886219 617.1071067811868
+ vertex 150.02753457015365 -104.61600186602402 616.9000000000001
+ endloop
+endfacet
+facet normal -3.789340105087216e-14 0.7933533402912354 0.6087614290087203
+ outer loop
+ vertex 150.0275345701536 -104.7749204886219 617.1071067811868
+ vertex -149.9724654298452 -104.61600186602396 616.9
+ vertex -149.97246542984507 -104.77492048862186 617.1071067811866
+ endloop
+endfacet
+facet normal -4.7817167538289876e-14 0.3826834323650812 0.9238795325112903
+ outer loop
+ vertex 150.02753457015365 -104.98202726980846 617.2660254037846
+ vertex -149.9724654298452 -105.2232082247059 617.3659258262891
+ vertex 150.02753457015365 -105.22320822470594 617.3659258262892
+ endloop
+endfacet
+facet normal -4.7817167538289876e-14 0.3826834323650812 0.9238795325112903
+ outer loop
+ vertex -149.9724654298452 -105.2232082247059 617.3659258262891
+ vertex 150.02753457015365 -104.98202726980846 617.2660254037846
+ vertex -149.97246542984522 -104.98202726980843 617.2660254037845
+ endloop
+endfacet
+facet normal -4.1646492410833785e-14 0.13052619222007247 0.9914448613738078
+ outer loop
+ vertex 150.02753457015365 -105.22320822470594 617.3659258262892
+ vertex -149.9724654298452 -105.48202726980843 617.4000000000001
+ vertex 150.02753457015362 -105.48202726980846 617.4000000000002
+ endloop
+endfacet
+facet normal -4.1646492410833785e-14 0.13052619222007247 0.9914448613738078
+ outer loop
+ vertex -149.9724654298452 -105.48202726980843 617.4000000000001
+ vertex 150.02753457015365 -105.22320822470594 617.3659258262892
+ vertex -149.9724654298452 -105.2232082247059 617.3659258262891
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex 150.02753457015362 -105.48202726980846 617.4000000000002
+ vertex -149.97246542984504 -110.68202726980842 617.4000000000001
+ vertex 150.0275345701538 -110.68202726980844 617.4000000000002
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex -149.97246542984504 -110.68202726980842 617.4000000000001
+ vertex 150.02753457015362 -105.48202726980846 617.4000000000002
+ vertex -149.9724654298452 -105.48202726980843 617.4000000000001
+ endloop
+endfacet
+facet normal -5.200343766171889e-14 0.6087614290087036 0.7933533402912483
+ outer loop
+ vertex 150.0275345701536 -104.7749204886219 617.1071067811868
+ vertex -149.97246542984522 -104.98202726980843 617.2660254037845
+ vertex 150.02753457015365 -104.98202726980846 617.2660254037846
+ endloop
+endfacet
+facet normal -5.200343766171889e-14 0.6087614290087036 0.7933533402912483
+ outer loop
+ vertex -149.97246542984522 -104.98202726980843 617.2660254037845
+ vertex 150.0275345701536 -104.7749204886219 617.1071067811868
+ vertex -149.97246542984507 -104.77492048862186 617.1071067811866
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex 150.02753457015385 -104.48202726980846 611.2000000000002
+ vertex -149.97246542984522 -104.48202726980841 616.4000000000001
+ vertex 150.02753457015368 -104.48202726980846 616.4000000000001
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex -149.97246542984522 -104.48202726980841 616.4000000000001
+ vertex 150.02753457015385 -104.48202726980846 611.2000000000002
+ vertex -149.97246542984504 -104.48202726980843 611.2
+ endloop
+endfacet
+facet normal -3.6839007899199586e-14 0.9238795325112905 0.3826834323650808
+ outer loop
+ vertex 150.02753457015362 -104.51610144351939 616.6588190451026
+ vertex -149.9724654298452 -104.61600186602396 616.9
+ vertex 150.02753457015365 -104.61600186602402 616.9000000000001
+ endloop
+endfacet
+facet normal -3.6839007899199586e-14 0.9238795325112905 0.3826834323650808
+ outer loop
+ vertex -149.9724654298452 -104.61600186602396 616.9
+ vertex 150.02753457015362 -104.51610144351939 616.6588190451026
+ vertex -149.97246542984507 -104.5161014435193 616.6588190451026
+ endloop
+endfacet
+facet normal -3.881934011071542e-14 0.9914448613738096 0.1305261922200573
+ outer loop
+ vertex -149.97246542984522 -104.48202726980841 616.4000000000001
+ vertex 150.02753457015362 -104.51610144351939 616.6588190451026
+ vertex 150.02753457015368 -104.48202726980846 616.4000000000001
+ endloop
+endfacet
+facet normal -3.881934011071542e-14 0.9914448613738096 0.1305261922200573
+ outer loop
+ vertex 150.02753457015362 -104.51610144351939 616.6588190451026
+ vertex -149.97246542984522 -104.48202726980841 616.4000000000001
+ vertex -149.97246542984507 -104.5161014435193 616.6588190451026
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex 150.02753457015382 -110.68202726980846 617.0000000000002
+ vertex -149.972465429845 -111.08202726980839 617.0000000000001
+ vertex 150.0275345701538 -111.08202726980844 617.0000000000002
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex -149.972465429845 -111.08202726980839 617.0000000000001
+ vertex 150.02753457015382 -110.68202726980846 617.0000000000002
+ vertex -149.97246542984504 -110.6820272698084 617.0000000000001
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex 150.0275345701538 -108.88202726980845 615.6000000000001
+ vertex -149.97246542984496 -108.88202726980842 613.5656854249493
+ vertex 150.0275345701539 -108.88202726980845 613.5656854249494
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex -149.97246542984496 -108.88202726980842 613.5656854249493
+ vertex 150.0275345701538 -108.88202726980845 615.6000000000001
+ vertex -149.97246542984504 -108.88202726980838 615.6
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex -149.97246542984504 -110.68202726980842 617.4000000000001
+ vertex 150.02753457015382 -110.68202726980846 617.0000000000002
+ vertex 150.0275345701538 -110.68202726980844 617.4000000000002
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex 150.02753457015382 -110.68202726980846 617.0000000000002
+ vertex -149.97246542984504 -110.68202726980842 617.4000000000001
+ vertex -149.97246542984504 -110.6820272698084 617.0000000000001
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex -149.97246542984496 -111.08202726980839 615.6
+ vertex 150.0275345701538 -108.88202726980845 615.6000000000001
+ vertex 150.0275345701539 -111.08202726980842 615.6000000000001
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex 150.0275345701538 -108.88202726980845 615.6000000000001
+ vertex -149.97246542984496 -111.08202726980839 615.6
+ vertex -149.97246542984504 -108.88202726980838 615.6
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex 150.02753457015402 -111.34771269475767 611.1000000000001
+ vertex -149.9724654298446 -117.61634184485911 611.1
+ vertex 150.02753457015422 -117.61634184485916 611.1000000000001
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex -149.9724654298446 -117.61634184485911 611.1
+ vertex 150.02753457015402 -111.34771269475767 611.1000000000001
+ vertex -149.97246542984482 -111.34771269475765 611.1
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -8.997049082914168e-15
+ outer loop
+ vertex 150.0275345701538 -111.08202726980844 617.0000000000002
+ vertex -149.97246542984496 -111.08202726980839 615.6
+ vertex 150.0275345701539 -111.08202726980842 615.6000000000001
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -8.997049082914168e-15
+ outer loop
+ vertex -149.97246542984496 -111.08202726980839 615.6
+ vertex 150.0275345701538 -111.08202726980844 617.0000000000002
+ vertex -149.972465429845 -111.08202726980839 617.0000000000001
+ endloop
+endfacet
+facet normal 1.2048156260517146e-15 -0.7071067811865481 0.707106781186547
+ outer loop
+ vertex 150.0275345701539 -108.88202726980845 613.5656854249494
+ vertex -149.97246542984482 -111.34771269475765 611.1
+ vertex 150.02753457015402 -111.34771269475767 611.1000000000001
+ endloop
+endfacet
+facet normal 1.2048156260517146e-15 -0.7071067811865481 0.707106781186547
+ outer loop
+ vertex -149.97246542984482 -111.34771269475765 611.1
+ vertex 150.0275345701539 -108.88202726980845 613.5656854249494
+ vertex -149.97246542984496 -108.88202726980842 613.5656854249493
+ endloop
+endfacet
+facet normal -5.0005827697486894e-14 0.707106781186545 0.70710678118655
+ outer loop
+ vertex 150.02753457015422 -117.61634184485916 611.1000000000001
+ vertex -149.97246542984465 -120.0820272698084 613.5656854249493
+ vertex 150.02753457015422 -120.08202726980842 613.5656854249494
+ endloop
+endfacet
+facet normal -5.0005827697486894e-14 0.707106781186545 0.70710678118655
+ outer loop
+ vertex -149.97246542984465 -120.0820272698084 613.5656854249493
+ vertex 150.02753457015422 -117.61634184485916 611.1000000000001
+ vertex -149.9724654298446 -117.61634184485911 611.1
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex -149.97246542984468 -120.0820272698084 615.6
+ vertex 150.0275345701541 -117.88202726980845 615.6000000000001
+ vertex 150.02753457015416 -120.08202726980845 615.6000000000001
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex 150.0275345701541 -117.88202726980845 615.6000000000001
+ vertex -149.97246542984468 -120.0820272698084 615.6
+ vertex -149.97246542984482 -117.8820272698084 615.6
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 2.611827415552657e-14
+ outer loop
+ vertex -149.97246542984482 -117.8820272698084 615.6
+ vertex 150.02753457015402 -117.88202726980849 617.0000000000002
+ vertex 150.0275345701541 -117.88202726980845 615.6000000000001
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 2.611827415552657e-14
+ outer loop
+ vertex 150.02753457015402 -117.88202726980849 617.0000000000002
+ vertex -149.97246542984482 -117.8820272698084 615.6
+ vertex -149.97246542984482 -117.88202726980843 617.0000000000001
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex 150.02753457015422 -120.08202726980842 613.5656854249494
+ vertex -149.97246542984468 -120.0820272698084 615.6
+ vertex 150.02753457015416 -120.08202726980845 615.6000000000001
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex -149.97246542984468 -120.0820272698084 615.6
+ vertex 150.02753457015422 -120.08202726980842 613.5656854249494
+ vertex -149.97246542984465 -120.0820272698084 613.5656854249493
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex 150.02753457015402 -117.88202726980849 617.0000000000002
+ vertex -149.97246542984482 -118.28202726980845 617.0000000000001
+ vertex 150.02753457015402 -118.28202726980847 617.0000000000002
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex -149.97246542984482 -118.28202726980845 617.0000000000001
+ vertex 150.02753457015402 -117.88202726980849 617.0000000000002
+ vertex -149.97246542984482 -117.88202726980843 617.0000000000001
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 4.4649600931051686e-15
+ outer loop
+ vertex -149.97246542984482 -118.28202726980845 617.0000000000001
+ vertex 150.027534570154 -118.2820272698085 617.4000000000002
+ vertex 150.02753457015402 -118.28202726980847 617.0000000000002
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 4.4649600931051686e-15
+ outer loop
+ vertex 150.027534570154 -118.2820272698085 617.4000000000002
+ vertex -149.97246542984482 -118.28202726980845 617.0000000000001
+ vertex -149.97246542984482 -118.28202726980842 617.4000000000001
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex 150.027534570154 -118.2820272698085 617.4000000000002
+ vertex -149.97246542984473 -123.48202726980844 617.4
+ vertex 150.0275345701542 -123.48202726980846 617.4000000000002
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex -149.97246542984473 -123.48202726980844 617.4
+ vertex 150.027534570154 -118.2820272698085 617.4000000000002
+ vertex -149.97246542984482 -118.28202726980842 617.4000000000001
+ endloop
+endfacet
+facet normal -3.3995076299890834e-14 -0.13052619222007386 0.9914448613738075
+ outer loop
+ vertex 150.0275345701542 -123.48202726980846 617.4000000000002
+ vertex -149.97246542984468 -123.74084631491095 617.3659258262891
+ vertex 150.02753457015422 -123.74084631491097 617.3659258262892
+ endloop
+endfacet
+facet normal -3.3995076299890834e-14 -0.13052619222007386 0.9914448613738075
+ outer loop
+ vertex -149.97246542984468 -123.74084631491095 617.3659258262891
+ vertex 150.0275345701542 -123.48202726980846 617.4000000000002
+ vertex -149.97246542984473 -123.48202726980844 617.4
+ endloop
+endfacet
+facet normal -2.2944299965291228e-14 -0.3826834323650826 0.9238795325112898
+ outer loop
+ vertex 150.02753457015422 -123.74084631491097 617.3659258262892
+ vertex -149.97246542984453 -123.98202726980841 617.2660254037845
+ vertex 150.02753457015422 -123.98202726980844 617.2660254037846
+ endloop
+endfacet
+facet normal -2.2944299965291228e-14 -0.3826834323650826 0.9238795325112898
+ outer loop
+ vertex -149.97246542984453 -123.98202726980841 617.2660254037845
+ vertex 150.02753457015422 -123.74084631491097 617.3659258262892
+ vertex -149.97246542984468 -123.74084631491095 617.3659258262891
+ endloop
+endfacet
+facet normal -1.1437878031146923e-14 -0.6087614290087044 0.7933533402912476
+ outer loop
+ vertex 150.02753457015422 -123.98202726980844 617.2660254037846
+ vertex -149.97246542984468 -124.18913405099497 617.1071067811866
+ vertex 150.02753457015422 -124.189134050995 617.1071067811868
+ endloop
+endfacet
+facet normal -1.1437878031146923e-14 -0.6087614290087044 0.7933533402912476
+ outer loop
+ vertex -149.97246542984468 -124.18913405099497 617.1071067811866
+ vertex 150.02753457015422 -123.98202726980844 617.2660254037846
+ vertex -149.97246542984453 -123.98202726980841 617.2660254037845
+ endloop
+endfacet
+facet normal -1.1474086062759331e-15 -0.7933533402912396 0.6087614290087152
+ outer loop
+ vertex -149.97246542984468 -124.18913405099497 617.1071067811866
+ vertex 150.02753457015422 -124.34805267359289 616.9000000000001
+ vertex 150.02753457015422 -124.189134050995 617.1071067811868
+ endloop
+endfacet
+facet normal -1.1474086062759331e-15 -0.7933533402912396 0.6087614290087152
+ outer loop
+ vertex 150.02753457015422 -124.34805267359289 616.9000000000001
+ vertex -149.97246542984468 -124.18913405099497 617.1071067811866
+ vertex -149.97246542984465 -124.34805267359285 616.9
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -124.4820272698084 616.4000000000001
+ vertex -149.97246542984442 -124.08202726980842 611.2
+ vertex -149.97246542984445 -124.48202726980841 611.2
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984442 -124.08202726980842 611.2
+ vertex -149.9724654298446 -124.4820272698084 616.4000000000001
+ vertex -149.97246542984453 -123.8275085918709 614.785889527836
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984442 -124.08202726980842 611.2
+ vertex -149.97246542984453 -123.8275085918709 614.785889527836
+ vertex -149.97246542984453 -123.6676679158635 614.4000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984442 -124.08202726980842 611.2
+ vertex -149.97246542984453 -123.6676679158635 614.4000000000001
+ vertex -149.97246542984445 -122.68202726980842 613.0000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984445 -122.68202726980842 613.0000000000001
+ vertex -149.97246542984453 -123.6676679158635 614.4000000000001
+ vertex -149.97246542984445 -123.41339811970688 614.0686291501016
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984445 -122.68202726980842 613.0000000000001
+ vertex -149.97246542984445 -123.41339811970688 614.0686291501016
+ vertex -149.97246542984453 -123.08202726980846 613.814359353945
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984445 -122.68202726980842 613.0000000000001
+ vertex -149.97246542984453 -123.08202726980846 613.814359353945
+ vertex -149.97246542984453 -122.69613774197245 613.6545186779375
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984445 -122.68202726980842 613.0000000000001
+ vertex -149.97246542984453 -122.69613774197245 613.6545186779375
+ vertex -149.97246542984465 -120.64771269475769 613.0000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984465 -120.64771269475769 613.0000000000001
+ vertex -149.97246542984453 -122.69613774197245 613.6545186779375
+ vertex -149.97246542984453 -122.28202726980842 613.6
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984465 -120.64771269475769 613.0000000000001
+ vertex -149.97246542984453 -122.28202726980842 613.6
+ vertex -149.97246542984465 -120.0820272698084 613.5656854249493
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -123.8275085918709 614.785889527836
+ vertex -149.9724654298446 -124.4820272698084 616.4000000000001
+ vertex -149.9724654298445 -123.88202726980839 615.2
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -123.88202726980839 615.2
+ vertex -149.9724654298446 -124.4820272698084 616.4000000000001
+ vertex -149.9724654298446 -123.82750859187092 615.6141104721642
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -123.82750859187092 615.6141104721642
+ vertex -149.9724654298446 -124.4820272698084 616.4000000000001
+ vertex -149.9724654298445 -123.6676679158635 616.0
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -123.6676679158635 616.0
+ vertex -149.9724654298446 -124.4820272698084 616.4000000000001
+ vertex -149.97246542984468 -123.41339811970687 616.3313708498986
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -123.41339811970687 616.3313708498986
+ vertex -149.9724654298446 -124.4820272698084 616.4000000000001
+ vertex -149.97246542984453 -123.08202726980839 616.5856406460551
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -123.08202726980839 616.5856406460551
+ vertex -149.9724654298446 -124.4820272698084 616.4000000000001
+ vertex -149.9724654298446 -124.44795309609745 616.6588190451026
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -123.08202726980839 616.5856406460551
+ vertex -149.9724654298446 -124.44795309609745 616.6588190451026
+ vertex -149.97246542984468 -122.69613774197245 616.7454813220626
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -122.69613774197245 616.7454813220626
+ vertex -149.9724654298446 -124.44795309609745 616.6588190451026
+ vertex -149.97246542984465 -124.34805267359285 616.9
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -122.69613774197245 616.7454813220626
+ vertex -149.97246542984465 -124.34805267359285 616.9
+ vertex -149.97246542984468 -122.28202726980842 616.8000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -124.18913405099497 617.1071067811866
+ vertex -149.97246542984482 -118.28202726980845 617.0000000000001
+ vertex -149.97246542984465 -124.34805267359285 616.9
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984482 -118.28202726980845 617.0000000000001
+ vertex -149.97246542984468 -124.18913405099497 617.1071067811866
+ vertex -149.97246542984482 -118.28202726980842 617.4000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984482 -118.28202726980842 617.4000000000001
+ vertex -149.97246542984468 -124.18913405099497 617.1071067811866
+ vertex -149.97246542984453 -123.98202726980841 617.2660254037845
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984482 -118.28202726980842 617.4000000000001
+ vertex -149.97246542984453 -123.98202726980841 617.2660254037845
+ vertex -149.97246542984468 -123.74084631491095 617.3659258262891
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984482 -118.28202726980842 617.4000000000001
+ vertex -149.97246542984468 -123.74084631491095 617.3659258262891
+ vertex -149.97246542984473 -123.48202726980844 617.4
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984465 -120.0820272698084 613.5656854249493
+ vertex -149.97246542984465 -120.89638662375329 614.4000000000001
+ vertex -149.97246542984468 -120.0820272698084 615.6
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984465 -120.89638662375329 614.4000000000001
+ vertex -149.97246542984465 -120.0820272698084 613.5656854249493
+ vertex -149.9724654298446 -121.15065641990992 614.0686291501015
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -121.15065641990992 614.0686291501015
+ vertex -149.97246542984465 -120.0820272698084 613.5656854249493
+ vertex -149.9724654298446 -121.4820272698084 613.814359353945
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -121.4820272698084 613.814359353945
+ vertex -149.97246542984465 -120.0820272698084 613.5656854249493
+ vertex -149.97246542984465 -121.86791679764438 613.6545186779375
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984465 -121.86791679764438 613.6545186779375
+ vertex -149.97246542984465 -120.0820272698084 613.5656854249493
+ vertex -149.97246542984453 -122.28202726980842 613.6
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -120.0820272698084 615.6
+ vertex -149.97246542984465 -120.89638662375329 614.4000000000001
+ vertex -149.97246542984465 -120.7365459477459 614.785889527836
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -120.0820272698084 615.6
+ vertex -149.97246542984465 -120.7365459477459 614.785889527836
+ vertex -149.9724654298446 -120.6820272698084 615.2
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -120.0820272698084 615.6
+ vertex -149.9724654298446 -120.6820272698084 615.2
+ vertex -149.97246542984468 -120.73654594774587 615.6141104721642
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -120.0820272698084 615.6
+ vertex -149.97246542984468 -120.73654594774587 615.6141104721642
+ vertex -149.97246542984482 -117.8820272698084 615.6
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984482 -117.8820272698084 615.6
+ vertex -149.97246542984468 -120.73654594774587 615.6141104721642
+ vertex -149.97246542984482 -117.88202726980843 617.0000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984482 -117.88202726980843 617.0000000000001
+ vertex -149.97246542984468 -120.73654594774587 615.6141104721642
+ vertex -149.9724654298446 -120.89638662375332 616.0
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984482 -117.88202726980843 617.0000000000001
+ vertex -149.9724654298446 -120.89638662375332 616.0
+ vertex -149.97246542984468 -121.15065641990992 616.3313708498986
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984482 -117.88202726980843 617.0000000000001
+ vertex -149.97246542984468 -121.15065641990992 616.3313708498986
+ vertex -149.97246542984468 -121.48202726980837 616.5856406460551
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984482 -117.88202726980843 617.0000000000001
+ vertex -149.97246542984468 -121.48202726980837 616.5856406460551
+ vertex -149.9724654298446 -121.86791679764437 616.7454813220626
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984482 -117.88202726980843 617.0000000000001
+ vertex -149.9724654298446 -121.86791679764437 616.7454813220626
+ vertex -149.97246542984468 -122.28202726980842 616.8000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984482 -117.88202726980843 617.0000000000001
+ vertex -149.97246542984468 -122.28202726980842 616.8000000000001
+ vertex -149.97246542984465 -124.34805267359285 616.9
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984482 -117.88202726980843 617.0000000000001
+ vertex -149.97246542984465 -124.34805267359285 616.9
+ vertex -149.97246542984482 -118.28202726980845 617.0000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984442 -111.08202726980839 599.2
+ vertex -149.9724654298443 -110.68202726980837 597.8000000000001
+ vertex -149.9724654298443 -111.08202726980838 597.8000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298443 -110.68202726980837 597.8000000000001
+ vertex -149.97246542984442 -111.08202726980839 599.2
+ vertex -149.97246542984445 -107.09613774197238 598.0545186779375
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298443 -110.68202726980837 597.8000000000001
+ vertex -149.97246542984445 -107.09613774197238 598.0545186779375
+ vertex -149.97246542984445 -106.6820272698084 598.0000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298443 -110.68202726980837 597.8000000000001
+ vertex -149.97246542984445 -106.6820272698084 598.0000000000001
+ vertex -149.9724654298445 -104.61600186602395 597.9000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984445 -107.09613774197238 598.0545186779375
+ vertex -149.97246542984442 -111.08202726980839 599.2
+ vertex -149.97246542984445 -107.48202726980838 598.2143593539449
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984445 -107.48202726980838 598.2143593539449
+ vertex -149.97246542984442 -111.08202726980839 599.2
+ vertex -149.97246542984445 -107.81339811970685 598.4686291501016
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984445 -107.81339811970685 598.4686291501016
+ vertex -149.97246542984442 -111.08202726980839 599.2
+ vertex -149.97246542984436 -108.06766791586351 598.8000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984436 -108.06766791586351 598.8000000000001
+ vertex -149.97246542984442 -111.08202726980839 599.2
+ vertex -149.9724654298445 -108.22750859187093 599.185889527836
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -108.22750859187093 599.185889527836
+ vertex -149.97246542984442 -111.08202726980839 599.2
+ vertex -149.9724654298445 -108.88202726980838 599.2
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -108.22750859187093 599.185889527836
+ vertex -149.9724654298445 -108.88202726980838 599.2
+ vertex -149.9724654298445 -108.2820272698084 599.6
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -108.2820272698084 599.6
+ vertex -149.9724654298445 -108.88202726980838 599.2
+ vertex -149.9724654298445 -108.88202726980838 601.2343145750508
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -108.2820272698084 599.6
+ vertex -149.9724654298445 -108.88202726980838 601.2343145750508
+ vertex -149.97246542984453 -108.2275085918709 600.0141104721641
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -108.2275085918709 600.0141104721641
+ vertex -149.9724654298445 -108.88202726980838 601.2343145750508
+ vertex -149.97246542984453 -108.06766791586351 600.4000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -108.06766791586351 600.4000000000001
+ vertex -149.9724654298445 -108.88202726980838 601.2343145750508
+ vertex -149.9724654298445 -107.81339811970687 600.7313708498986
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -107.81339811970687 600.7313708498986
+ vertex -149.9724654298445 -108.88202726980838 601.2343145750508
+ vertex -149.97246542984453 -107.48202726980838 600.9856406460551
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -107.48202726980838 600.9856406460551
+ vertex -149.9724654298445 -108.88202726980838 601.2343145750508
+ vertex -149.97246542984445 -107.09613774197238 601.1454813220626
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984445 -107.09613774197238 601.1454813220626
+ vertex -149.9724654298445 -108.88202726980838 601.2343145750508
+ vertex -149.9724654298445 -106.68202726980836 601.2
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -106.28202726980838 604.0000000000001
+ vertex -149.97246542984476 -104.8820272698084 603.6
+ vertex -149.9724654298446 -106.28202726980841 601.8000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984476 -104.8820272698084 603.6
+ vertex -149.97246542984468 -106.28202726980838 604.0000000000001
+ vertex -149.97246542984473 -104.8820272698084 604.0000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984445 -106.6820272698084 598.0000000000001
+ vertex -149.97246542984453 -104.5161014435193 598.1411809548975
+ vertex -149.9724654298445 -104.61600186602395 597.9000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -104.5161014435193 598.1411809548975
+ vertex -149.97246542984445 -106.6820272698084 598.0000000000001
+ vertex -149.97246542984445 -106.26791679764439 598.0545186779375
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -104.5161014435193 598.1411809548975
+ vertex -149.97246542984445 -106.26791679764439 598.0545186779375
+ vertex -149.97246542984442 -105.88202726980838 598.2143593539449
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -104.5161014435193 598.1411809548975
+ vertex -149.97246542984442 -105.88202726980838 598.2143593539449
+ vertex -149.9724654298446 -104.48202726980838 598.4000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -104.48202726980838 598.4000000000001
+ vertex -149.97246542984442 -105.88202726980838 598.2143593539449
+ vertex -149.97246542984442 -105.55065641990991 598.4686291501016
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -104.48202726980838 598.4000000000001
+ vertex -149.97246542984442 -105.55065641990991 598.4686291501016
+ vertex -149.97246542984453 -105.29638662375329 598.8
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -104.48202726980838 598.4000000000001
+ vertex -149.97246542984453 -105.29638662375329 598.8
+ vertex -149.9724654298446 -105.13654594774586 599.185889527836
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -104.48202726980838 598.4000000000001
+ vertex -149.9724654298446 -105.13654594774586 599.185889527836
+ vertex -149.97246542984473 -104.48202726980838 603.6
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -104.48202726980838 603.6
+ vertex -149.9724654298446 -105.13654594774586 599.185889527836
+ vertex -149.9724654298446 -105.08202726980838 599.6
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -104.48202726980838 603.6
+ vertex -149.9724654298446 -105.08202726980838 599.6
+ vertex -149.97246542984465 -105.13654594774587 600.014110472164
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -104.48202726980838 603.6
+ vertex -149.97246542984465 -105.13654594774587 600.014110472164
+ vertex -149.9724654298446 -105.29638662375328 600.4000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -104.48202726980838 603.6
+ vertex -149.9724654298446 -105.29638662375328 600.4000000000001
+ vertex -149.97246542984465 -105.55065641990988 600.7313708498986
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -104.48202726980838 603.6
+ vertex -149.97246542984465 -105.55065641990988 600.7313708498986
+ vertex -149.9724654298446 -105.88202726980838 600.9856406460551
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -104.48202726980838 603.6
+ vertex -149.9724654298446 -105.88202726980838 600.9856406460551
+ vertex -149.9724654298446 -106.26791679764433 601.1454813220626
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -104.48202726980838 603.6
+ vertex -149.9724654298446 -106.26791679764433 601.1454813220626
+ vertex -149.9724654298445 -106.68202726980836 601.2
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -104.48202726980838 603.6
+ vertex -149.9724654298445 -106.68202726980836 601.2
+ vertex -149.9724654298446 -106.28202726980841 601.8000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -106.28202726980841 601.8000000000001
+ vertex -149.9724654298445 -106.68202726980836 601.2
+ vertex -149.9724654298445 -108.88202726980838 601.2343145750508
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -106.28202726980841 601.8000000000001
+ vertex -149.9724654298445 -108.88202726980838 601.2343145750508
+ vertex -149.9724654298446 -108.31634184485914 601.8000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -104.48202726980838 603.6
+ vertex -149.9724654298446 -106.28202726980841 601.8000000000001
+ vertex -149.97246542984476 -104.8820272698084 603.6
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298441 -120.68202726980837 599.6
+ vertex -149.9724654298441 -120.0820272698084 599.2
+ vertex -149.9724654298441 -120.7365459477459 599.185889527836
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298441 -120.0820272698084 599.2
+ vertex -149.9724654298441 -120.68202726980837 599.6
+ vertex -149.9724654298442 -120.08202726980842 601.2343145750508
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298442 -120.08202726980842 601.2343145750508
+ vertex -149.9724654298441 -120.68202726980837 599.6
+ vertex -149.97246542984414 -120.73654594774587 600.0141104721641
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298442 -120.08202726980842 601.2343145750508
+ vertex -149.97246542984414 -120.73654594774587 600.0141104721641
+ vertex -149.97246542984414 -120.89638662375329 600.4000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298442 -120.08202726980842 601.2343145750508
+ vertex -149.97246542984414 -120.89638662375329 600.4000000000001
+ vertex -149.97246542984414 -121.15065641990992 600.7313708498986
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298442 -120.08202726980842 601.2343145750508
+ vertex -149.97246542984414 -121.15065641990992 600.7313708498986
+ vertex -149.9724654298442 -121.4820272698084 600.9856406460552
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298442 -120.08202726980842 601.2343145750508
+ vertex -149.9724654298442 -121.4820272698084 600.9856406460552
+ vertex -149.9724654298442 -121.86791679764437 601.1454813220626
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298442 -120.08202726980842 601.2343145750508
+ vertex -149.9724654298442 -121.86791679764437 601.1454813220626
+ vertex -149.972465429844 -122.28202726980837 601.2
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984396 -123.74084631491093 597.434074173711
+ vertex -149.97246542984414 -118.28202726980835 597.4
+ vertex -149.97246542984396 -123.48202726980844 597.4
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984414 -118.28202726980835 597.4
+ vertex -149.97246542984396 -123.74084631491093 597.434074173711
+ vertex -149.972465429844 -118.28202726980834 597.8000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429844 -118.28202726980834 597.8000000000001
+ vertex -149.97246542984396 -123.74084631491093 597.434074173711
+ vertex -149.97246542984396 -123.98202726980841 597.5339745962156
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429844 -118.28202726980834 597.8000000000001
+ vertex -149.97246542984396 -123.98202726980841 597.5339745962156
+ vertex -149.97246542984396 -124.18913405099494 597.6928932188135
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429844 -118.28202726980834 597.8000000000001
+ vertex -149.97246542984396 -124.18913405099494 597.6928932188135
+ vertex -149.97246542984396 -124.34805267359283 597.9
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429844 -118.28202726980834 597.8000000000001
+ vertex -149.97246542984396 -124.34805267359283 597.9
+ vertex -149.97246542984414 -117.88202726980836 597.8000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984414 -117.88202726980836 597.8000000000001
+ vertex -149.97246542984396 -124.34805267359283 597.9
+ vertex -149.97246542984405 -122.28202726980844 598.0000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984414 -117.88202726980836 597.8000000000001
+ vertex -149.97246542984405 -122.28202726980844 598.0000000000001
+ vertex -149.972465429844 -121.86791679764438 598.0545186779376
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984414 -117.88202726980836 597.8000000000001
+ vertex -149.972465429844 -121.86791679764438 598.0545186779376
+ vertex -149.9724654298442 -117.8820272698084 599.2
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298442 -117.8820272698084 599.2
+ vertex -149.972465429844 -121.86791679764438 598.0545186779376
+ vertex -149.97246542984405 -121.4820272698084 598.2143593539449
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298442 -117.8820272698084 599.2
+ vertex -149.97246542984405 -121.4820272698084 598.2143593539449
+ vertex -149.97246542984405 -121.15065641990992 598.4686291501016
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298442 -117.8820272698084 599.2
+ vertex -149.97246542984405 -121.15065641990992 598.4686291501016
+ vertex -149.97246542984405 -120.89638662375333 598.8000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298442 -117.8820272698084 599.2
+ vertex -149.97246542984405 -120.89638662375333 598.8000000000001
+ vertex -149.9724654298441 -120.7365459477459 599.185889527836
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298442 -117.8820272698084 599.2
+ vertex -149.9724654298441 -120.7365459477459 599.185889527836
+ vertex -149.9724654298441 -120.0820272698084 599.2
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984436 -110.68202726980842 597.4
+ vertex -149.9724654298445 -105.22320822470584 597.434074173711
+ vertex -149.97246542984445 -105.48202726980838 597.4
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -105.22320822470584 597.434074173711
+ vertex -149.97246542984436 -110.68202726980842 597.4
+ vertex -149.9724654298443 -110.68202726980837 597.8000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -105.22320822470584 597.434074173711
+ vertex -149.9724654298443 -110.68202726980837 597.8000000000001
+ vertex -149.9724654298445 -104.98202726980841 597.5339745962156
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -104.98202726980841 597.5339745962156
+ vertex -149.9724654298443 -110.68202726980837 597.8000000000001
+ vertex -149.9724654298445 -104.77492048862183 597.6928932188135
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -104.77492048862183 597.6928932188135
+ vertex -149.9724654298443 -110.68202726980837 597.8000000000001
+ vertex -149.9724654298445 -104.61600186602395 597.9000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429844 -124.44795309609748 598.1411809548975
+ vertex -149.97246542984405 -122.28202726980844 598.0000000000001
+ vertex -149.97246542984396 -124.34805267359283 597.9
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984405 -122.28202726980844 598.0000000000001
+ vertex -149.972465429844 -124.44795309609748 598.1411809548975
+ vertex -149.972465429844 -122.69613774197245 598.0545186779376
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429844 -122.69613774197245 598.0545186779376
+ vertex -149.972465429844 -124.44795309609748 598.1411809548975
+ vertex -149.97246542984405 -123.08202726980842 598.2143593539449
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984405 -123.08202726980842 598.2143593539449
+ vertex -149.972465429844 -124.44795309609748 598.1411809548975
+ vertex -149.97246542984396 -124.48202726980837 598.4000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984405 -123.08202726980842 598.2143593539449
+ vertex -149.97246542984396 -124.48202726980837 598.4000000000001
+ vertex -149.9724654298439 -123.41339811970688 598.4686291501016
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298439 -123.41339811970688 598.4686291501016
+ vertex -149.97246542984396 -124.48202726980837 598.4000000000001
+ vertex -149.9724654298439 -123.66766791586353 598.8000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298439 -123.66766791586353 598.8000000000001
+ vertex -149.97246542984396 -124.48202726980837 598.4000000000001
+ vertex -149.972465429844 -123.82750859187092 599.185889527836
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429844 -123.82750859187092 599.185889527836
+ vertex -149.97246542984396 -124.48202726980837 598.4000000000001
+ vertex -149.9724654298442 -124.4820272698084 603.6
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429844 -123.82750859187092 599.185889527836
+ vertex -149.9724654298442 -124.4820272698084 603.6
+ vertex -149.9724654298439 -123.88202726980842 599.6
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298439 -123.88202726980842 599.6
+ vertex -149.9724654298442 -124.4820272698084 603.6
+ vertex -149.9724654298441 -123.82750859187092 600.0141104721641
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298441 -123.82750859187092 600.0141104721641
+ vertex -149.9724654298442 -124.4820272698084 603.6
+ vertex -149.97246542984396 -123.66766791586353 600.4000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984396 -123.66766791586353 600.4000000000001
+ vertex -149.9724654298442 -124.4820272698084 603.6
+ vertex -149.97246542984405 -123.41339811970687 600.7313708498986
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984405 -123.41339811970687 600.7313708498986
+ vertex -149.9724654298442 -124.4820272698084 603.6
+ vertex -149.97246542984414 -123.08202726980842 600.9856406460552
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984414 -123.08202726980842 600.9856406460552
+ vertex -149.9724654298442 -124.4820272698084 603.6
+ vertex -149.972465429844 -122.69613774197245 601.1454813220626
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429844 -122.69613774197245 601.1454813220626
+ vertex -149.9724654298442 -124.4820272698084 603.6
+ vertex -149.972465429844 -122.28202726980837 601.2
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429844 -122.28202726980837 601.2
+ vertex -149.9724654298442 -124.4820272698084 603.6
+ vertex -149.9724654298442 -122.68202726980842 601.8000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429844 -122.28202726980837 601.2
+ vertex -149.9724654298442 -122.68202726980842 601.8000000000001
+ vertex -149.9724654298442 -120.08202726980842 601.2343145750508
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298442 -122.68202726980842 601.8000000000001
+ vertex -149.9724654298442 -124.4820272698084 603.6
+ vertex -149.9724654298442 -124.08202726980839 603.6
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298442 -122.68202726980842 601.8000000000001
+ vertex -149.9724654298442 -124.08202726980839 603.6
+ vertex -149.9724654298442 -122.68202726980842 604.0000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298442 -122.68202726980842 604.0000000000001
+ vertex -149.9724654298442 -124.08202726980839 603.6
+ vertex -149.9724654298442 -124.08202726980836 604.0
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -118.18202726980839 610.5343145750509
+ vertex -149.9724654298446 -117.61634184485911 611.1
+ vertex -149.97246542984482 -111.34771269475765 611.1
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -117.61634184485911 611.1
+ vertex -149.9724654298446 -118.18202726980839 610.5343145750509
+ vertex -149.97246542984465 -120.64771269475769 613.0000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -117.61634184485911 611.1
+ vertex -149.97246542984465 -120.64771269475769 613.0000000000001
+ vertex -149.97246542984465 -120.0820272698084 613.5656854249493
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984442 -124.08202726980842 611.2
+ vertex -149.97246542984445 -122.6820272698084 610.8000000000001
+ vertex -149.9724654298443 -124.08202726980844 610.8000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984445 -122.6820272698084 610.8000000000001
+ vertex -149.97246542984442 -124.08202726980842 611.2
+ vertex -149.97246542984445 -122.68202726980842 613.0000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984436 -118.1820272698084 604.2656854249493
+ vertex -149.97246542984445 -115.18083869158521 604.7920002690196
+ vertex -149.97246542984445 -114.48202726980838 604.7
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984445 -115.18083869158521 604.7920002690196
+ vertex -149.97246542984436 -118.1820272698084 604.2656854249493
+ vertex -149.97246542984445 -115.83202726980839 605.061731409782
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984445 -115.83202726980839 605.061731409782
+ vertex -149.97246542984436 -118.1820272698084 604.2656854249493
+ vertex -149.97246542984445 -116.39121557901207 605.4908116907964
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984445 -116.39121557901207 605.4908116907964
+ vertex -149.97246542984436 -118.1820272698084 604.2656854249493
+ vertex -149.97246542984445 -116.8202958600264 606.0500000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984445 -116.8202958600264 606.0500000000001
+ vertex -149.97246542984436 -118.1820272698084 604.2656854249493
+ vertex -149.97246542984445 -117.0900270007889 606.7011885782233
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984445 -117.0900270007889 606.7011885782233
+ vertex -149.97246542984436 -118.1820272698084 604.2656854249493
+ vertex -149.9724654298446 -118.18202726980839 610.5343145750509
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984445 -117.0900270007889 606.7011885782233
+ vertex -149.9724654298446 -118.18202726980839 610.5343145750509
+ vertex -149.9724654298445 -117.18202726980843 607.4
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -117.18202726980843 607.4
+ vertex -149.9724654298446 -118.18202726980839 610.5343145750509
+ vertex -149.97246542984442 -117.09002700078888 608.0988114217769
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984442 -117.09002700078888 608.0988114217769
+ vertex -149.9724654298446 -118.18202726980839 610.5343145750509
+ vertex -149.97246542984453 -116.82029586002639 608.7500000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -116.82029586002639 608.7500000000001
+ vertex -149.9724654298446 -118.18202726980839 610.5343145750509
+ vertex -149.97246542984465 -116.3912155790121 609.3091883092037
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984465 -116.3912155790121 609.3091883092037
+ vertex -149.9724654298446 -118.18202726980839 610.5343145750509
+ vertex -149.9724654298445 -115.83202726980838 609.738268590218
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -115.83202726980838 609.738268590218
+ vertex -149.9724654298446 -118.18202726980839 610.5343145750509
+ vertex -149.97246542984468 -115.18083869158521 610.0079997309805
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -115.18083869158521 610.0079997309805
+ vertex -149.9724654298446 -118.18202726980839 610.5343145750509
+ vertex -149.97246542984468 -114.48202726980837 610.1
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -114.48202726980837 610.1
+ vertex -149.9724654298446 -118.18202726980839 610.5343145750509
+ vertex -149.97246542984468 -110.7820272698084 610.5343145750508
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -110.7820272698084 610.5343145750508
+ vertex -149.9724654298446 -118.18202726980839 610.5343145750509
+ vertex -149.97246542984482 -111.34771269475765 611.1
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -110.7820272698084 610.5343145750508
+ vertex -149.97246542984482 -111.34771269475765 611.1
+ vertex -149.97246542984496 -108.31634184485917 613.0
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984496 -108.31634184485917 613.0
+ vertex -149.97246542984482 -111.34771269475765 611.1
+ vertex -149.97246542984496 -108.88202726980842 613.5656854249493
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984496 -108.31634184485917 613.0
+ vertex -149.97246542984496 -108.88202726980842 613.5656854249493
+ vertex -149.972465429845 -106.28202726980841 613.0
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429845 -111.08202726980839 617.0000000000001
+ vertex -149.97246542984504 -108.88202726980838 615.6
+ vertex -149.97246542984496 -111.08202726980839 615.6
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984504 -108.88202726980838 615.6
+ vertex -149.972465429845 -111.08202726980839 617.0000000000001
+ vertex -149.97246542984504 -108.22750859187089 615.6141104721642
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984504 -108.22750859187089 615.6141104721642
+ vertex -149.972465429845 -111.08202726980839 617.0000000000001
+ vertex -149.97246542984496 -108.06766791586354 616.0
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984496 -108.06766791586354 616.0
+ vertex -149.972465429845 -111.08202726980839 617.0000000000001
+ vertex -149.97246542984513 -107.81339811970687 616.3313708498986
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984513 -107.81339811970687 616.3313708498986
+ vertex -149.972465429845 -111.08202726980839 617.0000000000001
+ vertex -149.97246542984507 -107.4820272698084 616.5856406460551
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984507 -107.4820272698084 616.5856406460551
+ vertex -149.972465429845 -111.08202726980839 617.0000000000001
+ vertex -149.97246542984513 -107.09613774197238 616.7454813220626
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984513 -107.09613774197238 616.7454813220626
+ vertex -149.972465429845 -111.08202726980839 617.0000000000001
+ vertex -149.97246542984513 -106.68202726980836 616.8000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984513 -106.68202726980836 616.8000000000001
+ vertex -149.972465429845 -111.08202726980839 617.0000000000001
+ vertex -149.9724654298452 -104.61600186602396 616.9
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298452 -104.61600186602396 616.9
+ vertex -149.972465429845 -111.08202726980839 617.0000000000001
+ vertex -149.97246542984504 -110.6820272698084 617.0000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298452 -104.61600186602396 616.9
+ vertex -149.97246542984504 -110.6820272698084 617.0000000000001
+ vertex -149.97246542984507 -104.77492048862186 617.1071067811866
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984507 -104.77492048862186 617.1071067811866
+ vertex -149.97246542984504 -110.6820272698084 617.0000000000001
+ vertex -149.97246542984504 -110.68202726980842 617.4000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984507 -104.77492048862186 617.1071067811866
+ vertex -149.97246542984504 -110.68202726980842 617.4000000000001
+ vertex -149.97246542984522 -104.98202726980843 617.2660254037845
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984522 -104.98202726980843 617.2660254037845
+ vertex -149.97246542984504 -110.68202726980842 617.4000000000001
+ vertex -149.9724654298452 -105.2232082247059 617.3659258262891
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298452 -105.2232082247059 617.3659258262891
+ vertex -149.97246542984504 -110.68202726980842 617.4000000000001
+ vertex -149.9724654298452 -105.48202726980843 617.4000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429845 -106.28202726980841 613.0
+ vertex -149.97246542984496 -104.88202726980839 610.8000000000001
+ vertex -149.9724654298449 -106.28202726980838 610.8000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984496 -104.88202726980839 610.8000000000001
+ vertex -149.972465429845 -106.28202726980841 613.0
+ vertex -149.972465429845 -104.88202726980839 611.2
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429845 -104.88202726980839 611.2
+ vertex -149.972465429845 -106.28202726980841 613.0
+ vertex -149.97246542984504 -104.48202726980843 611.2
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984504 -104.48202726980843 611.2
+ vertex -149.972465429845 -106.28202726980841 613.0
+ vertex -149.972465429845 -105.29638662375329 614.4000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984504 -104.48202726980843 611.2
+ vertex -149.972465429845 -105.29638662375329 614.4000000000001
+ vertex -149.97246542984507 -105.1365459477459 614.785889527836
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984504 -104.48202726980843 611.2
+ vertex -149.97246542984507 -105.1365459477459 614.785889527836
+ vertex -149.97246542984522 -104.48202726980841 616.4000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429845 -105.29638662375329 614.4000000000001
+ vertex -149.972465429845 -106.28202726980841 613.0
+ vertex -149.97246542984507 -105.55065641990991 614.0686291501015
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984507 -105.55065641990991 614.0686291501015
+ vertex -149.972465429845 -106.28202726980841 613.0
+ vertex -149.97246542984504 -105.88202726980838 613.814359353945
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984504 -105.88202726980838 613.814359353945
+ vertex -149.972465429845 -106.28202726980841 613.0
+ vertex -149.97246542984504 -106.26791679764438 613.6545186779375
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984504 -106.26791679764438 613.6545186779375
+ vertex -149.972465429845 -106.28202726980841 613.0
+ vertex -149.97246542984504 -106.68202726980844 613.6
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984504 -106.68202726980844 613.6
+ vertex -149.972465429845 -106.28202726980841 613.0
+ vertex -149.97246542984496 -108.88202726980842 613.5656854249493
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984522 -104.48202726980841 616.4000000000001
+ vertex -149.97246542984507 -105.1365459477459 614.785889527836
+ vertex -149.97246542984504 -105.0820272698084 615.2
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984522 -104.48202726980841 616.4000000000001
+ vertex -149.97246542984504 -105.0820272698084 615.2
+ vertex -149.97246542984513 -105.13654594774586 615.6141104721642
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984522 -104.48202726980841 616.4000000000001
+ vertex -149.97246542984513 -105.13654594774586 615.6141104721642
+ vertex -149.97246542984504 -105.29638662375332 616.0
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984522 -104.48202726980841 616.4000000000001
+ vertex -149.97246542984504 -105.29638662375332 616.0
+ vertex -149.97246542984513 -105.55065641990988 616.3313708498985
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984522 -104.48202726980841 616.4000000000001
+ vertex -149.97246542984513 -105.55065641990988 616.3313708498985
+ vertex -149.97246542984513 -105.88202726980838 616.5856406460551
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984522 -104.48202726980841 616.4000000000001
+ vertex -149.97246542984513 -105.88202726980838 616.5856406460551
+ vertex -149.97246542984507 -104.5161014435193 616.6588190451026
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984507 -104.5161014435193 616.6588190451026
+ vertex -149.97246542984513 -105.88202726980838 616.5856406460551
+ vertex -149.9724654298452 -106.26791679764435 616.7454813220626
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984507 -104.5161014435193 616.6588190451026
+ vertex -149.9724654298452 -106.26791679764435 616.7454813220626
+ vertex -149.9724654298452 -104.61600186602396 616.9
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298452 -104.61600186602396 616.9
+ vertex -149.9724654298452 -106.26791679764435 616.7454813220626
+ vertex -149.97246542984513 -106.68202726980836 616.8000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984496 -108.88202726980842 613.5656854249493
+ vertex -149.9724654298449 -107.09613774197244 613.6545186779375
+ vertex -149.97246542984504 -106.68202726980844 613.6
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298449 -107.09613774197244 613.6545186779375
+ vertex -149.97246542984496 -108.88202726980842 613.5656854249493
+ vertex -149.97246542984504 -107.48202726980843 613.814359353945
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984504 -107.48202726980843 613.814359353945
+ vertex -149.97246542984496 -108.88202726980842 613.5656854249493
+ vertex -149.9724654298449 -107.81339811970689 614.0686291501016
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298449 -107.81339811970689 614.0686291501016
+ vertex -149.97246542984496 -108.88202726980842 613.5656854249493
+ vertex -149.972465429845 -108.06766791586351 614.4000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429845 -108.06766791586351 614.4000000000001
+ vertex -149.97246542984496 -108.88202726980842 613.5656854249493
+ vertex -149.97246542984504 -108.88202726980838 615.6
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429845 -108.06766791586351 614.4000000000001
+ vertex -149.97246542984504 -108.88202726980838 615.6
+ vertex -149.97246542984504 -108.22750859187093 614.785889527836
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984504 -108.22750859187093 614.785889527836
+ vertex -149.97246542984504 -108.88202726980838 615.6
+ vertex -149.97246542984496 -108.28202726980842 615.2
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984496 -108.28202726980842 615.2
+ vertex -149.97246542984504 -108.88202726980838 615.6
+ vertex -149.97246542984504 -108.22750859187089 615.6141104721642
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298442 -120.08202726980842 601.2343145750508
+ vertex -149.9724654298442 -120.64771269475763 601.8000000000001
+ vertex -149.97246542984422 -117.61634184485915 603.7
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298442 -120.64771269475763 601.8000000000001
+ vertex -149.9724654298442 -120.08202726980842 601.2343145750508
+ vertex -149.9724654298442 -122.68202726980842 601.8000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984422 -117.61634184485915 603.7
+ vertex -149.9724654298442 -120.64771269475763 601.8000000000001
+ vertex -149.97246542984436 -118.1820272698084 604.2656854249493
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984422 -117.61634184485915 603.7
+ vertex -149.97246542984436 -118.1820272698084 604.2656854249493
+ vertex -149.97246542984445 -111.34771269475767 603.7
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984445 -111.34771269475767 603.7
+ vertex -149.97246542984436 -118.1820272698084 604.2656854249493
+ vertex -149.97246542984453 -110.7820272698084 604.2656854249493
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -110.7820272698084 604.2656854249493
+ vertex -149.97246542984436 -118.1820272698084 604.2656854249493
+ vertex -149.97246542984445 -114.48202726980838 604.7
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -110.7820272698084 604.2656854249493
+ vertex -149.97246542984445 -114.48202726980838 604.7
+ vertex -149.9724654298445 -113.78321584803159 604.7920002690196
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -110.7820272698084 604.2656854249493
+ vertex -149.9724654298445 -113.78321584803159 604.7920002690196
+ vertex -149.9724654298445 -113.1320272698084 605.061731409782
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -110.7820272698084 604.2656854249493
+ vertex -149.9724654298445 -113.1320272698084 605.061731409782
+ vertex -149.97246542984445 -112.5728389606047 605.4908116907964
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -110.7820272698084 604.2656854249493
+ vertex -149.97246542984445 -112.5728389606047 605.4908116907964
+ vertex -149.9724654298446 -112.14375867959043 606.0500000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -110.7820272698084 604.2656854249493
+ vertex -149.9724654298446 -112.14375867959043 606.0500000000001
+ vertex -149.97246542984465 -111.8740275388279 606.7011885782233
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -110.7820272698084 604.2656854249493
+ vertex -149.97246542984465 -111.8740275388279 606.7011885782233
+ vertex -149.97246542984468 -110.7820272698084 610.5343145750508
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -110.7820272698084 610.5343145750508
+ vertex -149.97246542984465 -111.8740275388279 606.7011885782233
+ vertex -149.97246542984465 -111.7820272698084 607.4000000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -110.7820272698084 610.5343145750508
+ vertex -149.97246542984465 -111.7820272698084 607.4000000000001
+ vertex -149.97246542984473 -111.87402753882795 608.0988114217769
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -110.7820272698084 610.5343145750508
+ vertex -149.97246542984473 -111.87402753882795 608.0988114217769
+ vertex -149.97246542984468 -112.14375867959043 608.7500000000001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -110.7820272698084 610.5343145750508
+ vertex -149.97246542984468 -112.14375867959043 608.7500000000001
+ vertex -149.97246542984473 -112.57283896060473 609.3091883092037
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -110.7820272698084 610.5343145750508
+ vertex -149.97246542984473 -112.57283896060473 609.3091883092037
+ vertex -149.97246542984473 -113.1320272698084 609.7382685902181
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -110.7820272698084 610.5343145750508
+ vertex -149.97246542984473 -113.1320272698084 609.7382685902181
+ vertex -149.97246542984473 -113.78321584803159 610.0079997309805
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -110.7820272698084 610.5343145750508
+ vertex -149.97246542984473 -113.78321584803159 610.0079997309805
+ vertex -149.97246542984468 -114.48202726980837 610.1
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984445 -111.34771269475767 603.7
+ vertex -149.9724654298446 -108.31634184485914 601.8000000000001
+ vertex -149.9724654298445 -108.88202726980838 601.2343145750508
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -108.31634184485914 601.8000000000001
+ vertex -149.97246542984445 -111.34771269475767 603.7
+ vertex -149.97246542984453 -110.7820272698084 604.2656854249493
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.0275345701538 -106.26791679764442 613.6545186779376
+ vertex 150.02753457015382 -107.0961377419725 613.6545186779376
+ vertex 150.02753457015382 -106.68202726980847 613.6000000000001
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015382 -107.0961377419725 613.6545186779376
+ vertex 150.0275345701538 -106.26791679764442 613.6545186779376
+ vertex 150.0275345701538 -105.88202726980848 613.814359353945
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015382 -107.0961377419725 613.6545186779376
+ vertex 150.0275345701538 -105.88202726980848 613.814359353945
+ vertex 150.02753457015388 -107.48202726980847 613.814359353945
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015388 -107.48202726980847 613.814359353945
+ vertex 150.0275345701538 -105.88202726980848 613.814359353945
+ vertex 150.02753457015376 -105.55065641990998 614.0686291501016
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015388 -107.48202726980847 613.814359353945
+ vertex 150.02753457015376 -105.55065641990998 614.0686291501016
+ vertex 150.02753457015382 -107.81339811970695 614.0686291501017
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015382 -107.81339811970695 614.0686291501017
+ vertex 150.02753457015376 -105.55065641990998 614.0686291501016
+ vertex 150.02753457015376 -105.29638662375334 614.4000000000001
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015382 -107.81339811970695 614.0686291501017
+ vertex 150.02753457015376 -105.29638662375334 614.4000000000001
+ vertex 150.02753457015382 -108.06766791586355 614.4000000000001
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015382 -108.06766791586355 614.4000000000001
+ vertex 150.02753457015376 -105.29638662375334 614.4000000000001
+ vertex 150.02753457015376 -105.13654594774594 614.785889527836
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015382 -108.06766791586355 614.4000000000001
+ vertex 150.02753457015376 -105.13654594774594 614.785889527836
+ vertex 150.02753457015385 -108.22750859187097 614.785889527836
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015385 -108.22750859187097 614.785889527836
+ vertex 150.02753457015376 -105.13654594774594 614.785889527836
+ vertex 150.0275345701537 -105.08202726980845 615.2000000000002
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015385 -108.22750859187097 614.785889527836
+ vertex 150.0275345701537 -105.08202726980845 615.2000000000002
+ vertex 150.02753457015382 -108.28202726980842 615.2000000000002
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015382 -108.28202726980842 615.2000000000002
+ vertex 150.0275345701537 -105.08202726980845 615.2000000000002
+ vertex 150.02753457015373 -105.13654594774594 615.6141104721642
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015382 -108.28202726980842 615.2000000000002
+ vertex 150.02753457015373 -105.13654594774594 615.6141104721642
+ vertex 150.0275345701538 -108.22750859187097 615.6141104721642
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.0275345701538 -108.22750859187097 615.6141104721642
+ vertex 150.02753457015373 -105.13654594774594 615.6141104721642
+ vertex 150.0275345701537 -105.29638662375334 616.0000000000001
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.0275345701538 -108.22750859187097 615.6141104721642
+ vertex 150.0275345701537 -105.29638662375334 616.0000000000001
+ vertex 150.0275345701538 -108.06766791586355 616.0000000000001
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.0275345701538 -108.06766791586355 616.0000000000001
+ vertex 150.0275345701537 -105.29638662375334 616.0000000000001
+ vertex 150.02753457015368 -105.55065641990996 616.3313708498986
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.0275345701538 -108.06766791586355 616.0000000000001
+ vertex 150.02753457015368 -105.55065641990996 616.3313708498986
+ vertex 150.02753457015376 -107.81339811970692 616.3313708498987
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015376 -107.81339811970692 616.3313708498987
+ vertex 150.02753457015368 -105.55065641990996 616.3313708498986
+ vertex 150.0275345701537 -105.88202726980843 616.5856406460553
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015376 -107.81339811970692 616.3313708498987
+ vertex 150.0275345701537 -105.88202726980843 616.5856406460553
+ vertex 150.02753457015373 -107.48202726980844 616.5856406460553
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015373 -107.48202726980844 616.5856406460553
+ vertex 150.0275345701537 -105.88202726980843 616.5856406460553
+ vertex 150.02753457015368 -106.26791679764439 616.7454813220626
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015373 -107.48202726980844 616.5856406460553
+ vertex 150.02753457015368 -106.26791679764439 616.7454813220626
+ vertex 150.0275345701537 -107.09613774197244 616.7454813220626
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.0275345701537 -107.09613774197244 616.7454813220626
+ vertex 150.02753457015368 -106.26791679764439 616.7454813220626
+ vertex 150.0275345701537 -106.68202726980843 616.8000000000002
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015473 -117.88202726980822 -43.00000000000016
+ vertex 150.02753457015473 -118.28202726980824 -43.00000000000016
+ vertex 150.02753457015467 -117.88202726980829 -44.40000000000016
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015478 -121.8679167976443 -43.254518677937675
+ vertex 150.02753457015467 -117.88202726980829 -44.40000000000016
+ vertex 150.02753457015473 -118.28202726980824 -43.00000000000016
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015484 -122.28202726980831 -43.20000000000018
+ vertex 150.02753457015478 -121.8679167976443 -43.254518677937675
+ vertex 150.02753457015473 -118.28202726980824 -43.00000000000016
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701549 -124.34805267359272 -43.10000000000016
+ vertex 150.02753457015484 -122.28202726980831 -43.20000000000018
+ vertex 150.02753457015473 -118.28202726980824 -43.00000000000016
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701548 -121.48202726980828 -43.41435935394508
+ vertex 150.02753457015467 -117.88202726980829 -44.40000000000016
+ vertex 150.02753457015478 -121.8679167976443 -43.254518677937675
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015476 -121.15065641990981 -43.6686291501017
+ vertex 150.02753457015467 -117.88202726980829 -44.40000000000016
+ vertex 150.0275345701548 -121.48202726980828 -43.41435935394508
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015476 -120.89638662375317 -44.0000000000002
+ vertex 150.02753457015467 -117.88202726980829 -44.40000000000016
+ vertex 150.02753457015476 -121.15065641990981 -43.6686291501017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015476 -120.73654594774578 -44.38588952783616
+ vertex 150.02753457015467 -117.88202726980829 -44.40000000000016
+ vertex 150.02753457015476 -120.89638662375317 -44.0000000000002
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015476 -120.0820272698083 -44.40000000000017
+ vertex 150.02753457015467 -117.88202726980829 -44.40000000000016
+ vertex 150.02753457015476 -120.73654594774578 -44.38588952783616
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015476 -120.68202726980829 -44.800000000000196
+ vertex 150.02753457015476 -120.0820272698083 -44.40000000000017
+ vertex 150.02753457015476 -120.73654594774578 -44.38588952783616
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015461 -120.0820272698083 -46.43431457505091
+ vertex 150.02753457015476 -120.0820272698083 -44.40000000000017
+ vertex 150.02753457015476 -120.68202726980829 -44.800000000000196
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015473 -120.73654594774578 -45.21411047216423
+ vertex 150.02753457015461 -120.0820272698083 -46.43431457505091
+ vertex 150.02753457015476 -120.68202726980829 -44.800000000000196
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015473 -120.8963866237532 -45.60000000000019
+ vertex 150.02753457015461 -120.0820272698083 -46.43431457505091
+ vertex 150.02753457015473 -120.73654594774578 -45.21411047216423
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701547 -121.1506564199098 -45.931370849898656
+ vertex 150.02753457015461 -120.0820272698083 -46.43431457505091
+ vertex 150.02753457015473 -120.8963866237532 -45.60000000000019
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015467 -121.48202726980828 -46.1856406460553
+ vertex 150.02753457015461 -120.0820272698083 -46.43431457505091
+ vertex 150.0275345701547 -121.1506564199098 -45.931370849898656
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701547 -121.86791679764423 -46.3454813220627
+ vertex 150.02753457015461 -120.0820272698083 -46.43431457505091
+ vertex 150.02753457015467 -121.48202726980828 -46.1856406460553
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015467 -122.28202726980827 -46.4000000000002
+ vertex 150.02753457015461 -120.0820272698083 -46.43431457505091
+ vertex 150.0275345701547 -121.86791679764423 -46.3454813220627
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015436 -105.48202726980834 -42.60000000000018
+ vertex 150.02753457015456 -110.68202726980829 -42.60000000000017
+ vertex 150.02753457015436 -105.22320822470579 -42.63407417371111
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701545 -110.68202726980826 -43.00000000000017
+ vertex 150.02753457015436 -105.22320822470579 -42.63407417371111
+ vertex 150.02753457015456 -110.68202726980829 -42.60000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015433 -104.98202726980827 -42.73397459621574
+ vertex 150.02753457015436 -105.22320822470579 -42.63407417371111
+ vertex 150.0275345701545 -110.68202726980826 -43.00000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015433 -104.77492048862172 -42.892893218813626
+ vertex 150.02753457015433 -104.98202726980827 -42.73397459621574
+ vertex 150.0275345701545 -110.68202726980826 -43.00000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015433 -104.61600186602381 -43.10000000000017
+ vertex 150.02753457015433 -104.77492048862172 -42.892893218813626
+ vertex 150.0275345701545 -110.68202726980826 -43.00000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015453 -111.08202726980826 -43.00000000000017
+ vertex 150.02753457015433 -104.61600186602381 -43.10000000000017
+ vertex 150.0275345701545 -110.68202726980826 -43.00000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015436 -106.68202726980829 -43.20000000000017
+ vertex 150.02753457015433 -104.61600186602381 -43.10000000000017
+ vertex 150.02753457015453 -111.08202726980826 -43.00000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015436 -107.09613774197233 -43.25451867793767
+ vertex 150.02753457015436 -106.68202726980829 -43.20000000000017
+ vertex 150.02753457015453 -111.08202726980826 -43.00000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015447 -111.08202726980824 -44.40000000000017
+ vertex 150.02753457015436 -107.09613774197233 -43.25451867793767
+ vertex 150.02753457015453 -111.08202726980826 -43.00000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015442 -107.48202726980827 -43.41435935394507
+ vertex 150.02753457015436 -107.09613774197233 -43.25451867793767
+ vertex 150.02753457015447 -111.08202726980824 -44.40000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701544 -107.81339811970676 -43.668629150101715
+ vertex 150.02753457015442 -107.48202726980827 -43.41435935394507
+ vertex 150.02753457015447 -111.08202726980824 -44.40000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701544 -108.06766791586337 -44.000000000000185
+ vertex 150.0275345701544 -107.81339811970676 -43.668629150101715
+ vertex 150.02753457015447 -111.08202726980824 -44.40000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015436 -108.22750859187079 -44.38588952783615
+ vertex 150.0275345701544 -108.06766791586337 -44.000000000000185
+ vertex 150.02753457015447 -111.08202726980824 -44.40000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701544 -108.88202726980829 -44.40000000000018
+ vertex 150.02753457015436 -108.22750859187079 -44.38588952783615
+ vertex 150.02753457015447 -111.08202726980824 -44.40000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015436 -108.28202726980828 -44.8000000000002
+ vertex 150.02753457015436 -108.22750859187079 -44.38588952783615
+ vertex 150.0275345701544 -108.88202726980829 -44.40000000000018
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701543 -108.88202726980826 -46.43431457505094
+ vertex 150.02753457015436 -108.28202726980828 -44.8000000000002
+ vertex 150.0275345701544 -108.88202726980829 -44.40000000000018
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015433 -108.22750859187079 -45.214110472164236
+ vertex 150.02753457015436 -108.28202726980828 -44.8000000000002
+ vertex 150.0275345701543 -108.88202726980826 -46.43431457505094
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015433 -108.06766791586337 -45.60000000000021
+ vertex 150.02753457015433 -108.22750859187079 -45.214110472164236
+ vertex 150.0275345701543 -108.88202726980826 -46.43431457505094
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701543 -107.81339811970673 -45.93137084989868
+ vertex 150.02753457015433 -108.06766791586337 -45.60000000000021
+ vertex 150.0275345701543 -108.88202726980826 -46.43431457505094
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015427 -107.48202726980827 -46.18564064605529
+ vertex 150.0275345701543 -107.81339811970673 -45.93137084989868
+ vertex 150.0275345701543 -108.88202726980826 -46.43431457505094
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015424 -107.0961377419723 -46.345481322062696
+ vertex 150.02753457015427 -107.48202726980827 -46.18564064605529
+ vertex 150.0275345701543 -108.88202726980826 -46.43431457505094
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015422 -106.68202726980827 -46.40000000000017
+ vertex 150.02753457015424 -107.0961377419723 -46.345481322062696
+ vertex 150.0275345701543 -108.88202726980826 -46.43431457505094
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015385 -104.4820272698083 -56.400000000000205
+ vertex 150.02753457015388 -104.88202726980828 -56.400000000000205
+ vertex 150.02753457015368 -104.4820272698083 -61.60000000000019
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015373 -105.13654594774579 -59.98588952783613
+ vertex 150.02753457015368 -104.4820272698083 -61.60000000000019
+ vertex 150.02753457015388 -104.88202726980828 -56.400000000000205
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015373 -105.29638662375318 -59.600000000000165
+ vertex 150.02753457015373 -105.13654594774579 -59.98588952783613
+ vertex 150.02753457015388 -104.88202726980828 -56.400000000000205
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015382 -106.28202726980831 -58.200000000000166
+ vertex 150.02753457015373 -105.29638662375318 -59.600000000000165
+ vertex 150.02753457015388 -104.88202726980828 -56.400000000000205
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015373 -105.55065641990981 -59.26862915010169
+ vertex 150.02753457015373 -105.29638662375318 -59.600000000000165
+ vertex 150.02753457015382 -106.28202726980831 -58.200000000000166
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701538 -105.88202726980832 -59.01435935394505
+ vertex 150.02753457015373 -105.55065641990981 -59.26862915010169
+ vertex 150.02753457015382 -106.28202726980831 -58.200000000000166
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701538 -106.26791679764426 -58.854518677937655
+ vertex 150.0275345701538 -105.88202726980832 -59.01435935394505
+ vertex 150.02753457015382 -106.28202726980831 -58.200000000000166
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701539 -108.31634184485905 -58.200000000000166
+ vertex 150.0275345701538 -106.26791679764426 -58.854518677937655
+ vertex 150.02753457015382 -106.28202726980831 -58.200000000000166
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701538 -106.68202726980832 -58.80000000000016
+ vertex 150.0275345701538 -106.26791679764426 -58.854518677937655
+ vertex 150.0275345701539 -108.31634184485905 -58.200000000000166
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701539 -108.88202726980829 -58.765685424949424
+ vertex 150.0275345701538 -106.68202726980832 -58.80000000000016
+ vertex 150.0275345701539 -108.31634184485905 -58.200000000000166
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015368 -105.0820272698083 -60.40000000000016
+ vertex 150.02753457015368 -104.4820272698083 -61.60000000000019
+ vertex 150.02753457015373 -105.13654594774579 -59.98588952783613
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701537 -105.13654594774579 -60.814110472164195
+ vertex 150.02753457015368 -104.4820272698083 -61.60000000000019
+ vertex 150.02753457015368 -105.0820272698083 -60.40000000000016
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015368 -105.29638662375318 -61.20000000000016
+ vertex 150.02753457015368 -104.4820272698083 -61.60000000000019
+ vertex 150.0275345701537 -105.13654594774579 -60.814110472164195
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015368 -105.5506564199098 -61.53137084989863
+ vertex 150.02753457015368 -104.4820272698083 -61.60000000000019
+ vertex 150.02753457015368 -105.29638662375318 -61.20000000000016
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015368 -105.88202726980826 -61.78564064605527
+ vertex 150.02753457015368 -104.4820272698083 -61.60000000000019
+ vertex 150.02753457015368 -105.5506564199098 -61.53137084989863
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015362 -104.51610144351923 -61.858819045102706
+ vertex 150.02753457015368 -104.4820272698083 -61.60000000000019
+ vertex 150.02753457015368 -105.88202726980826 -61.78564064605527
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015365 -106.26791679764423 -61.94548132206268
+ vertex 150.02753457015362 -104.51610144351923 -61.858819045102706
+ vertex 150.02753457015368 -105.88202726980826 -61.78564064605527
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015362 -104.61600186602386 -62.10000000000019
+ vertex 150.02753457015362 -104.51610144351923 -61.858819045102706
+ vertex 150.02753457015365 -106.26791679764423 -61.94548132206268
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701537 -106.68202726980827 -62.00000000000018
+ vertex 150.02753457015362 -104.61600186602386 -62.10000000000019
+ vertex 150.02753457015365 -106.26791679764423 -61.94548132206268
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701538 -108.88202726980829 -60.80000000000016
+ vertex 150.02753457015382 -108.0676679158634 -59.600000000000186
+ vertex 150.0275345701539 -108.88202726980829 -58.765685424949424
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015382 -107.81339811970678 -59.26862915010171
+ vertex 150.0275345701539 -108.88202726980829 -58.765685424949424
+ vertex 150.02753457015382 -108.0676679158634 -59.600000000000186
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015385 -107.48202726980831 -59.014359353945075
+ vertex 150.0275345701539 -108.88202726980829 -58.765685424949424
+ vertex 150.02753457015382 -107.81339811970678 -59.26862915010171
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701538 -107.09613774197234 -58.854518677937655
+ vertex 150.0275345701539 -108.88202726980829 -58.765685424949424
+ vertex 150.02753457015385 -107.48202726980831 -59.014359353945075
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701538 -106.68202726980832 -58.80000000000016
+ vertex 150.0275345701539 -108.88202726980829 -58.765685424949424
+ vertex 150.0275345701538 -107.09613774197234 -58.854518677937655
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015382 -108.22750859187082 -59.98588952783615
+ vertex 150.02753457015382 -108.0676679158634 -59.600000000000186
+ vertex 150.0275345701538 -108.88202726980829 -60.80000000000016
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701538 -108.28202726980827 -60.40000000000018
+ vertex 150.02753457015382 -108.22750859187082 -59.98588952783615
+ vertex 150.0275345701538 -108.88202726980829 -60.80000000000016
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701538 -108.22750859187082 -60.81411047216422
+ vertex 150.0275345701538 -108.28202726980827 -60.40000000000018
+ vertex 150.0275345701538 -108.88202726980829 -60.80000000000016
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701539 -111.08202726980826 -60.80000000000016
+ vertex 150.0275345701538 -108.22750859187082 -60.81411047216422
+ vertex 150.0275345701538 -108.88202726980829 -60.80000000000016
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701538 -111.08202726980828 -62.20000000000018
+ vertex 150.0275345701538 -108.22750859187082 -60.81411047216422
+ vertex 150.0275345701539 -111.08202726980826 -60.80000000000016
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701538 -108.0676679158634 -61.20000000000018
+ vertex 150.0275345701538 -108.22750859187082 -60.81411047216422
+ vertex 150.0275345701538 -111.08202726980828 -62.20000000000018
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015373 -107.81339811970676 -61.53137084989868
+ vertex 150.0275345701538 -108.0676679158634 -61.20000000000018
+ vertex 150.0275345701538 -111.08202726980828 -62.20000000000018
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701537 -107.48202726980828 -61.78564064605529
+ vertex 150.02753457015373 -107.81339811970676 -61.53137084989868
+ vertex 150.0275345701538 -111.08202726980828 -62.20000000000018
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701537 -107.09613774197227 -61.94548132206268
+ vertex 150.0275345701537 -107.48202726980828 -61.78564064605529
+ vertex 150.0275345701538 -111.08202726980828 -62.20000000000018
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701537 -106.68202726980827 -62.00000000000018
+ vertex 150.0275345701537 -107.09613774197227 -61.94548132206268
+ vertex 150.0275345701538 -111.08202726980828 -62.20000000000018
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015362 -104.61600186602386 -62.10000000000019
+ vertex 150.0275345701537 -106.68202726980827 -62.00000000000018
+ vertex 150.0275345701538 -111.08202726980828 -62.20000000000018
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701538 -110.6820272698083 -62.2000000000002
+ vertex 150.02753457015362 -104.61600186602386 -62.10000000000019
+ vertex 150.0275345701538 -111.08202726980828 -62.20000000000018
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015356 -104.77492048862175 -62.30710678118674
+ vertex 150.02753457015362 -104.61600186602386 -62.10000000000019
+ vertex 150.0275345701538 -110.6820272698083 -62.2000000000002
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701538 -110.68202726980829 -62.6000000000002
+ vertex 150.02753457015356 -104.77492048862175 -62.30710678118674
+ vertex 150.0275345701538 -110.6820272698083 -62.2000000000002
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015362 -104.9820272698083 -62.46602540378463
+ vertex 150.02753457015356 -104.77492048862175 -62.30710678118674
+ vertex 150.0275345701538 -110.68202726980829 -62.6000000000002
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015362 -105.22320822470579 -62.56592582628924
+ vertex 150.02753457015362 -104.9820272698083 -62.46602540378463
+ vertex 150.0275345701538 -110.68202726980829 -62.6000000000002
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015362 -105.4820272698083 -62.60000000000018
+ vertex 150.02753457015362 -105.22320822470579 -62.56592582628924
+ vertex 150.0275345701538 -110.68202726980829 -62.6000000000002
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701547 -122.68202726980829 -47.00000000000015
+ vertex 150.02753457015467 -120.64771269475752 -47.00000000000017
+ vertex 150.02753457015461 -120.0820272698083 -46.43431457505091
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015447 -117.61634184485904 -48.900000000000155
+ vertex 150.02753457015461 -120.0820272698083 -46.43431457505091
+ vertex 150.02753457015467 -120.64771269475752 -47.00000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015453 -118.18202726980827 -49.465685424949434
+ vertex 150.02753457015447 -117.61634184485904 -48.900000000000155
+ vertex 150.02753457015467 -120.64771269475752 -47.00000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015427 -111.34771269475753 -48.90000000000018
+ vertex 150.02753457015447 -117.61634184485904 -48.900000000000155
+ vertex 150.02753457015453 -118.18202726980827 -49.465685424949434
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015427 -110.78202726980828 -49.46568542494941
+ vertex 150.02753457015427 -111.34771269475753 -48.90000000000018
+ vertex 150.02753457015453 -118.18202726980827 -49.465685424949434
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015436 -114.48202726980827 -49.90000000000019
+ vertex 150.02753457015427 -110.78202726980828 -49.46568542494941
+ vertex 150.02753457015453 -118.18202726980827 -49.465685424949434
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015433 -113.78321584803146 -49.9920002690197
+ vertex 150.02753457015427 -110.78202726980828 -49.46568542494941
+ vertex 150.02753457015436 -114.48202726980827 -49.90000000000019
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701543 -113.13202726980829 -50.2617314097822
+ vertex 150.02753457015427 -110.78202726980828 -49.46568542494941
+ vertex 150.02753457015433 -113.78321584803146 -49.9920002690197
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015424 -112.57283896060459 -50.69081169079649
+ vertex 150.02753457015427 -110.78202726980828 -49.46568542494941
+ vertex 150.0275345701543 -113.13202726980829 -50.2617314097822
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015427 -112.1437586795903 -51.25000000000016
+ vertex 150.02753457015427 -110.78202726980828 -49.46568542494941
+ vertex 150.02753457015424 -112.57283896060459 -50.69081169079649
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701542 -111.87402753882782 -51.901188578223376
+ vertex 150.02753457015427 -110.78202726980828 -49.46568542494941
+ vertex 150.02753457015427 -112.1437586795903 -51.25000000000016
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015402 -110.78202726980828 -55.73431457505091
+ vertex 150.02753457015427 -110.78202726980828 -49.46568542494941
+ vertex 150.0275345701542 -111.87402753882782 -51.901188578223376
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701542 -111.7820272698083 -52.60000000000017
+ vertex 150.02753457015402 -110.78202726980828 -55.73431457505091
+ vertex 150.0275345701542 -111.87402753882782 -51.901188578223376
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015413 -111.87402753882779 -53.298811421776996
+ vertex 150.02753457015402 -110.78202726980828 -55.73431457505091
+ vertex 150.0275345701542 -111.7820272698083 -52.60000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015413 -112.14375867959032 -53.95000000000018
+ vertex 150.02753457015402 -110.78202726980828 -55.73431457505091
+ vertex 150.02753457015413 -111.87402753882779 -53.298811421776996
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015413 -112.57283896060463 -54.509188309203864
+ vertex 150.02753457015402 -110.78202726980828 -55.73431457505091
+ vertex 150.02753457015413 -112.14375867959032 -53.95000000000018
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015413 -113.13202726980829 -54.93826859021815
+ vertex 150.02753457015402 -110.78202726980828 -55.73431457505091
+ vertex 150.02753457015413 -112.57283896060463 -54.509188309203864
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015416 -113.78321584803147 -55.20799973098066
+ vertex 150.02753457015402 -110.78202726980828 -55.73431457505091
+ vertex 150.02753457015413 -113.13202726980829 -54.93826859021815
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701542 -114.4820272698083 -55.30000000000017
+ vertex 150.02753457015402 -110.78202726980828 -55.73431457505091
+ vertex 150.02753457015416 -113.78321584803147 -55.20799973098066
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015476 -118.28202726980824 -42.600000000000165
+ vertex 150.0275345701549 -123.4820272698083 -42.60000000000016
+ vertex 150.02753457015473 -118.28202726980824 -43.00000000000016
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701549 -123.7408463149108 -42.6340741737111
+ vertex 150.02753457015473 -118.28202726980824 -43.00000000000016
+ vertex 150.0275345701549 -123.4820272698083 -42.60000000000016
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015493 -123.98202726980828 -42.733974596215724
+ vertex 150.02753457015473 -118.28202726980824 -43.00000000000016
+ vertex 150.0275345701549 -123.7408463149108 -42.6340741737111
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701549 -124.18913405099481 -42.892893218813605
+ vertex 150.02753457015473 -118.28202726980824 -43.00000000000016
+ vertex 150.02753457015493 -123.98202726980828 -42.733974596215724
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701549 -124.34805267359272 -43.10000000000016
+ vertex 150.02753457015473 -118.28202726980824 -43.00000000000016
+ vertex 150.0275345701549 -124.18913405099481 -42.892893218813605
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015433 -104.61600186602381 -43.10000000000017
+ vertex 150.02753457015436 -106.68202726980829 -43.20000000000017
+ vertex 150.0275345701543 -104.51610144351919 -43.34118095489766
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015433 -106.26791679764423 -43.25451867793765
+ vertex 150.0275345701543 -104.51610144351919 -43.34118095489766
+ vertex 150.02753457015436 -106.68202726980829 -43.20000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015436 -105.88202726980826 -43.414359353945066
+ vertex 150.0275345701543 -104.51610144351919 -43.34118095489766
+ vertex 150.02753457015433 -106.26791679764423 -43.25451867793765
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015433 -104.48202726980827 -43.60000000000017
+ vertex 150.0275345701543 -104.51610144351919 -43.34118095489766
+ vertex 150.02753457015436 -105.88202726980826 -43.414359353945066
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701543 -105.5506564199098 -43.66862915010168
+ vertex 150.02753457015433 -104.48202726980827 -43.60000000000017
+ vertex 150.02753457015436 -105.88202726980826 -43.414359353945066
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701543 -105.29638662375316 -44.00000000000015
+ vertex 150.02753457015433 -104.48202726980827 -43.60000000000017
+ vertex 150.0275345701543 -105.5506564199098 -43.66862915010168
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701543 -105.13654594774576 -44.38588952783612
+ vertex 150.02753457015433 -104.48202726980827 -43.60000000000017
+ vertex 150.0275345701543 -105.29638662375316 -44.00000000000015
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701541 -104.48202726980827 -48.80000000000017
+ vertex 150.02753457015433 -104.48202726980827 -43.60000000000017
+ vertex 150.0275345701543 -105.13654594774576 -44.38588952783612
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015424 -105.08202726980825 -44.800000000000146
+ vertex 150.0275345701541 -104.48202726980827 -48.80000000000017
+ vertex 150.0275345701543 -105.13654594774576 -44.38588952783612
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015427 -105.13654594774574 -45.21411047216418
+ vertex 150.0275345701541 -104.48202726980827 -48.80000000000017
+ vertex 150.02753457015424 -105.08202726980825 -44.800000000000146
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015424 -105.29638662375316 -45.60000000000017
+ vertex 150.0275345701541 -104.48202726980827 -48.80000000000017
+ vertex 150.02753457015427 -105.13654594774574 -45.21411047216418
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015422 -105.5506564199098 -45.93137084989864
+ vertex 150.0275345701541 -104.48202726980827 -48.80000000000017
+ vertex 150.02753457015424 -105.29638662375316 -45.60000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015422 -105.88202726980826 -46.185640646055276
+ vertex 150.0275345701541 -104.48202726980827 -48.80000000000017
+ vertex 150.02753457015422 -105.5506564199098 -45.93137084989864
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015422 -106.26791679764423 -46.345481322062675
+ vertex 150.0275345701541 -104.48202726980827 -48.80000000000017
+ vertex 150.02753457015422 -105.88202726980826 -46.185640646055276
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015422 -106.68202726980827 -46.40000000000017
+ vertex 150.0275345701541 -104.48202726980827 -48.80000000000017
+ vertex 150.02753457015422 -106.26791679764423 -46.345481322062675
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015422 -106.28202726980827 -47.00000000000017
+ vertex 150.0275345701541 -104.48202726980827 -48.80000000000017
+ vertex 150.02753457015422 -106.68202726980827 -46.40000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701543 -108.88202726980826 -46.43431457505094
+ vertex 150.02753457015422 -106.28202726980827 -47.00000000000017
+ vertex 150.02753457015422 -106.68202726980827 -46.40000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701541 -104.88202726980829 -48.80000000000017
+ vertex 150.0275345701541 -104.48202726980827 -48.80000000000017
+ vertex 150.02753457015422 -106.28202726980827 -47.00000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015413 -106.2820272698083 -49.200000000000166
+ vertex 150.0275345701541 -104.88202726980829 -48.80000000000017
+ vertex 150.02753457015422 -106.28202726980827 -47.00000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701541 -104.88202726980828 -49.200000000000166
+ vertex 150.0275345701541 -104.88202726980829 -48.80000000000017
+ vertex 150.02753457015413 -106.2820272698083 -49.200000000000166
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015427 -118.18202726980829 -55.73431457505093
+ vertex 150.02753457015433 -117.09002700078877 -51.901188578223376
+ vertex 150.02753457015453 -118.18202726980827 -49.465685424949434
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701544 -116.82029586002628 -51.25000000000016
+ vertex 150.02753457015453 -118.18202726980827 -49.465685424949434
+ vertex 150.02753457015433 -117.09002700078877 -51.901188578223376
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015436 -116.39121557901197 -50.69081169079648
+ vertex 150.02753457015453 -118.18202726980827 -49.465685424949434
+ vertex 150.0275345701544 -116.82029586002628 -51.25000000000016
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015436 -115.83202726980828 -50.2617314097822
+ vertex 150.02753457015453 -118.18202726980827 -49.465685424949434
+ vertex 150.02753457015436 -116.39121557901197 -50.69081169079648
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701544 -115.18083869158507 -49.99200026901969
+ vertex 150.02753457015453 -118.18202726980827 -49.465685424949434
+ vertex 150.02753457015436 -115.83202726980828 -50.2617314097822
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015436 -114.48202726980827 -49.90000000000019
+ vertex 150.02753457015453 -118.18202726980827 -49.465685424949434
+ vertex 150.0275345701544 -115.18083869158507 -49.99200026901969
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015436 -117.18202726980829 -52.60000000000017
+ vertex 150.02753457015433 -117.09002700078877 -51.901188578223376
+ vertex 150.02753457015427 -118.18202726980829 -55.73431457505093
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015427 -117.09002700078877 -53.29881142177697
+ vertex 150.02753457015436 -117.18202726980829 -52.60000000000017
+ vertex 150.02753457015427 -118.18202726980829 -55.73431457505093
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015427 -116.82029586002625 -53.95000000000018
+ vertex 150.02753457015427 -117.09002700078877 -53.29881142177697
+ vertex 150.02753457015427 -118.18202726980829 -55.73431457505093
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015424 -116.39121557901197 -54.509188309203864
+ vertex 150.02753457015427 -116.82029586002625 -53.95000000000018
+ vertex 150.02753457015427 -118.18202726980829 -55.73431457505093
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015422 -115.83202726980828 -54.93826859021815
+ vertex 150.02753457015424 -116.39121557901197 -54.509188309203864
+ vertex 150.02753457015427 -118.18202726980829 -55.73431457505093
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015422 -115.1808386915851 -55.20799973098066
+ vertex 150.02753457015422 -115.83202726980828 -54.93826859021815
+ vertex 150.02753457015427 -118.18202726980829 -55.73431457505093
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701542 -114.4820272698083 -55.30000000000017
+ vertex 150.02753457015422 -115.1808386915851 -55.20799973098066
+ vertex 150.02753457015427 -118.18202726980829 -55.73431457505093
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015402 -110.78202726980828 -55.73431457505091
+ vertex 150.0275345701542 -114.4820272698083 -55.30000000000017
+ vertex 150.02753457015427 -118.18202726980829 -55.73431457505093
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015402 -111.34771269475752 -56.30000000000017
+ vertex 150.02753457015402 -110.78202726980828 -55.73431457505091
+ vertex 150.02753457015427 -118.18202726980829 -55.73431457505093
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701539 -108.31634184485905 -58.200000000000166
+ vertex 150.02753457015402 -110.78202726980828 -55.73431457505091
+ vertex 150.02753457015402 -111.34771269475752 -56.30000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701539 -108.88202726980829 -58.765685424949424
+ vertex 150.0275345701539 -108.31634184485905 -58.200000000000166
+ vertex 150.02753457015402 -111.34771269475752 -56.30000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701539 -106.2820272698083 -56.00000000000017
+ vertex 150.02753457015382 -106.28202726980831 -58.200000000000166
+ vertex 150.02753457015388 -104.88202726980828 -56.0000000000002
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015388 -104.88202726980828 -56.400000000000205
+ vertex 150.02753457015388 -104.88202726980828 -56.0000000000002
+ vertex 150.02753457015382 -106.28202726980831 -58.200000000000166
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015422 -120.64771269475757 -58.20000000000017
+ vertex 150.02753457015422 -117.61634184485901 -56.30000000000017
+ vertex 150.02753457015427 -118.18202726980829 -55.73431457505093
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015402 -111.34771269475752 -56.30000000000017
+ vertex 150.02753457015427 -118.18202726980829 -55.73431457505093
+ vertex 150.02753457015422 -117.61634184485901 -56.30000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701542 -120.08202726980826 -58.76568542494941
+ vertex 150.02753457015422 -117.61634184485901 -56.30000000000017
+ vertex 150.02753457015422 -120.64771269475757 -58.20000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015433 -122.68202726980829 -58.200000000000195
+ vertex 150.0275345701542 -120.08202726980826 -58.76568542494941
+ vertex 150.02753457015422 -120.64771269475757 -58.20000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701541 -117.88202726980829 -60.80000000000018
+ vertex 150.02753457015416 -120.0820272698083 -60.80000000000017
+ vertex 150.02753457015402 -117.88202726980833 -62.20000000000018
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015416 -120.73654594774578 -60.8141104721642
+ vertex 150.02753457015402 -117.88202726980833 -62.20000000000018
+ vertex 150.02753457015416 -120.0820272698083 -60.80000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015413 -120.89638662375316 -61.20000000000017
+ vertex 150.02753457015402 -117.88202726980833 -62.20000000000018
+ vertex 150.02753457015416 -120.73654594774578 -60.8141104721642
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701541 -121.1506564199098 -61.53137084989864
+ vertex 150.02753457015402 -117.88202726980833 -62.20000000000018
+ vertex 150.02753457015413 -120.89638662375316 -61.20000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015413 -121.48202726980826 -61.78564064605528
+ vertex 150.02753457015402 -117.88202726980833 -62.20000000000018
+ vertex 150.0275345701541 -121.1506564199098 -61.53137084989864
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701541 -121.86791679764423 -61.945481322062676
+ vertex 150.02753457015402 -117.88202726980833 -62.20000000000018
+ vertex 150.02753457015413 -121.48202726980826 -61.78564064605528
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701542 -122.28202726980828 -62.00000000000017
+ vertex 150.02753457015402 -117.88202726980833 -62.20000000000018
+ vertex 150.0275345701541 -121.86791679764423 -61.945481322062676
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015422 -124.34805267359273 -62.10000000000018
+ vertex 150.02753457015402 -117.88202726980833 -62.20000000000018
+ vertex 150.0275345701542 -122.28202726980828 -62.00000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015402 -118.28202726980831 -62.20000000000018
+ vertex 150.02753457015402 -117.88202726980833 -62.20000000000018
+ vertex 150.02753457015422 -124.34805267359273 -62.10000000000018
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015422 -124.18913405099482 -62.30710678118673
+ vertex 150.02753457015402 -118.28202726980831 -62.20000000000018
+ vertex 150.02753457015422 -124.34805267359273 -62.10000000000018
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.027534570154 -118.28202726980834 -62.60000000000018
+ vertex 150.02753457015402 -118.28202726980831 -62.20000000000018
+ vertex 150.02753457015422 -124.18913405099482 -62.30710678118673
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015422 -123.98202726980828 -62.46602540378461
+ vertex 150.027534570154 -118.28202726980834 -62.60000000000018
+ vertex 150.02753457015422 -124.18913405099482 -62.30710678118673
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015422 -123.74084631491081 -62.56592582628924
+ vertex 150.027534570154 -118.28202726980834 -62.60000000000018
+ vertex 150.02753457015422 -123.98202726980828 -62.46602540378461
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701542 -123.4820272698083 -62.60000000000018
+ vertex 150.027534570154 -118.28202726980834 -62.60000000000018
+ vertex 150.02753457015422 -123.74084631491081 -62.56592582628924
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015444 -124.08202726980831 -56.00000000000017
+ vertex 150.02753457015444 -124.08202726980831 -56.40000000000017
+ vertex 150.02753457015442 -122.68202726980829 -56.0000000000002
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015433 -122.68202726980829 -58.200000000000195
+ vertex 150.02753457015442 -122.68202726980829 -56.0000000000002
+ vertex 150.02753457015444 -124.08202726980831 -56.40000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015444 -124.4820272698083 -56.40000000000017
+ vertex 150.02753457015433 -122.68202726980829 -58.200000000000195
+ vertex 150.02753457015444 -124.08202726980831 -56.40000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701543 -123.66766791586342 -59.600000000000186
+ vertex 150.02753457015433 -122.68202726980829 -58.200000000000195
+ vertex 150.02753457015444 -124.4820272698083 -56.40000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015427 -123.82750859187081 -59.98588952783617
+ vertex 150.0275345701543 -123.66766791586342 -59.600000000000186
+ vertex 150.02753457015444 -124.4820272698083 -56.40000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015424 -124.48202726980833 -61.60000000000018
+ vertex 150.02753457015427 -123.82750859187081 -59.98588952783617
+ vertex 150.02753457015444 -124.4820272698083 -56.40000000000017
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701543 -123.41339811970677 -59.26862915010171
+ vertex 150.02753457015433 -122.68202726980829 -58.200000000000195
+ vertex 150.0275345701543 -123.66766791586342 -59.600000000000186
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701543 -123.08202726980831 -59.014359353945075
+ vertex 150.02753457015433 -122.68202726980829 -58.200000000000195
+ vertex 150.0275345701543 -123.41339811970677 -59.26862915010171
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701543 -122.69613774197234 -58.85451867793769
+ vertex 150.02753457015433 -122.68202726980829 -58.200000000000195
+ vertex 150.0275345701543 -123.08202726980831 -59.014359353945075
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015427 -122.28202726980831 -58.800000000000175
+ vertex 150.02753457015433 -122.68202726980829 -58.200000000000195
+ vertex 150.0275345701543 -122.69613774197234 -58.85451867793769
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701542 -120.08202726980826 -58.76568542494941
+ vertex 150.02753457015433 -122.68202726980829 -58.200000000000195
+ vertex 150.02753457015427 -122.28202726980831 -58.800000000000175
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015427 -123.8820272698083 -60.400000000000205
+ vertex 150.02753457015427 -123.82750859187081 -59.98588952783617
+ vertex 150.02753457015424 -124.48202726980833 -61.60000000000018
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015424 -123.82750859187081 -60.81411047216424
+ vertex 150.02753457015427 -123.8820272698083 -60.400000000000205
+ vertex 150.02753457015424 -124.48202726980833 -61.60000000000018
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015424 -123.66766791586339 -61.2000000000002
+ vertex 150.02753457015424 -123.82750859187081 -60.81411047216424
+ vertex 150.02753457015424 -124.48202726980833 -61.60000000000018
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701542 -123.41339811970676 -61.53137084989868
+ vertex 150.02753457015424 -123.66766791586339 -61.2000000000002
+ vertex 150.02753457015424 -124.48202726980833 -61.60000000000018
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701542 -123.08202726980828 -61.78564064605529
+ vertex 150.0275345701542 -123.41339811970676 -61.53137084989868
+ vertex 150.02753457015424 -124.48202726980833 -61.60000000000018
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015424 -124.44795309609736 -61.85881904510269
+ vertex 150.0275345701542 -123.08202726980828 -61.78564064605529
+ vertex 150.02753457015424 -124.48202726980833 -61.60000000000018
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015416 -122.69613774197232 -61.94548132206272
+ vertex 150.0275345701542 -123.08202726980828 -61.78564064605529
+ vertex 150.02753457015424 -124.44795309609736 -61.85881904510269
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015422 -124.34805267359273 -62.10000000000018
+ vertex 150.02753457015416 -122.69613774197232 -61.94548132206272
+ vertex 150.02753457015424 -124.44795309609736 -61.85881904510269
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701542 -122.28202726980828 -62.00000000000017
+ vertex 150.02753457015416 -122.69613774197232 -61.94548132206272
+ vertex 150.02753457015422 -124.34805267359273 -62.10000000000018
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015427 -122.28202726980831 -58.800000000000175
+ vertex 150.02753457015424 -121.86791679764426 -58.85451867793765
+ vertex 150.0275345701542 -120.08202726980826 -58.76568542494941
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015424 -121.48202726980831 -59.01435935394506
+ vertex 150.0275345701542 -120.08202726980826 -58.76568542494941
+ vertex 150.02753457015424 -121.86791679764426 -58.85451867793765
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015422 -121.15065641990981 -59.26862915010168
+ vertex 150.0275345701542 -120.08202726980826 -58.76568542494941
+ vertex 150.02753457015424 -121.48202726980831 -59.01435935394506
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015422 -120.8963866237532 -59.60000000000015
+ vertex 150.0275345701542 -120.08202726980826 -58.76568542494941
+ vertex 150.02753457015422 -121.15065641990981 -59.26862915010168
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015416 -120.0820272698083 -60.80000000000017
+ vertex 150.0275345701542 -120.08202726980826 -58.76568542494941
+ vertex 150.02753457015422 -120.8963866237532 -59.60000000000015
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701542 -120.73654594774575 -59.985889527836115
+ vertex 150.02753457015416 -120.0820272698083 -60.80000000000017
+ vertex 150.02753457015422 -120.8963866237532 -59.60000000000015
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701542 -120.68202726980826 -60.40000000000015
+ vertex 150.02753457015416 -120.0820272698083 -60.80000000000017
+ vertex 150.0275345701542 -120.73654594774575 -59.985889527836115
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015416 -120.73654594774578 -60.8141104721642
+ vertex 150.02753457015416 -120.0820272698083 -60.80000000000017
+ vertex 150.0275345701542 -120.68202726980826 -60.40000000000015
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015427 -111.34771269475753 -48.90000000000018
+ vertex 150.02753457015427 -108.31634184485901 -47.00000000000018
+ vertex 150.0275345701543 -108.88202726980826 -46.43431457505094
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015422 -106.28202726980827 -47.00000000000017
+ vertex 150.0275345701543 -108.88202726980826 -46.43431457505094
+ vertex 150.02753457015427 -108.31634184485901 -47.00000000000018
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015427 -110.78202726980828 -49.46568542494941
+ vertex 150.02753457015427 -108.31634184485901 -47.00000000000018
+ vertex 150.02753457015427 -111.34771269475753 -48.90000000000018
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701547 -122.68202726980829 -47.00000000000015
+ vertex 150.02753457015467 -124.08202726980828 -48.800000000000125
+ vertex 150.02753457015464 -122.68202726980829 -49.200000000000145
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015467 -124.08202726980826 -49.200000000000124
+ vertex 150.02753457015464 -122.68202726980829 -49.200000000000145
+ vertex 150.02753457015467 -124.08202726980828 -48.800000000000125
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701549 -124.34805267359272 -43.10000000000016
+ vertex 150.02753457015487 -124.44795309609734 -43.341180954897645
+ vertex 150.02753457015484 -122.28202726980831 -43.20000000000018
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015484 -122.69613774197234 -43.254518677937675
+ vertex 150.02753457015484 -122.28202726980831 -43.20000000000018
+ vertex 150.02753457015487 -124.44795309609734 -43.341180954897645
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015487 -123.08202726980832 -43.414359353945095
+ vertex 150.02753457015484 -122.69613774197234 -43.254518677937675
+ vertex 150.02753457015487 -124.44795309609734 -43.341180954897645
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015487 -124.4820272698083 -43.60000000000016
+ vertex 150.02753457015487 -123.08202726980832 -43.414359353945095
+ vertex 150.02753457015487 -124.44795309609734 -43.341180954897645
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015487 -123.41339811970677 -43.66862915010171
+ vertex 150.02753457015487 -123.08202726980832 -43.414359353945095
+ vertex 150.02753457015487 -124.4820272698083 -43.60000000000016
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015484 -123.66766791586342 -44.0000000000002
+ vertex 150.02753457015487 -123.41339811970677 -43.66862915010171
+ vertex 150.02753457015487 -124.4820272698083 -43.60000000000016
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015487 -123.82750859187081 -44.38588952783617
+ vertex 150.02753457015484 -123.66766791586342 -44.0000000000002
+ vertex 150.02753457015487 -124.4820272698083 -43.60000000000016
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701547 -124.48202726980826 -48.800000000000125
+ vertex 150.02753457015487 -123.82750859187081 -44.38588952783617
+ vertex 150.02753457015487 -124.4820272698083 -43.60000000000016
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701548 -123.88202726980828 -44.8000000000002
+ vertex 150.02753457015487 -123.82750859187081 -44.38588952783617
+ vertex 150.0275345701547 -124.48202726980826 -48.800000000000125
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701548 -123.82750859187081 -45.21411047216423
+ vertex 150.0275345701548 -123.88202726980828 -44.8000000000002
+ vertex 150.0275345701547 -124.48202726980826 -48.800000000000125
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701548 -123.66766791586339 -45.6000000000002
+ vertex 150.0275345701548 -123.82750859187081 -45.21411047216423
+ vertex 150.0275345701547 -124.48202726980826 -48.800000000000125
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015476 -123.41339811970676 -45.93137084989867
+ vertex 150.0275345701548 -123.66766791586339 -45.6000000000002
+ vertex 150.0275345701547 -124.48202726980826 -48.800000000000125
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015476 -123.08202726980828 -46.185640646055305
+ vertex 150.02753457015476 -123.41339811970676 -45.93137084989867
+ vertex 150.0275345701547 -124.48202726980826 -48.800000000000125
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701547 -122.69613774197232 -46.3454813220627
+ vertex 150.02753457015476 -123.08202726980828 -46.185640646055305
+ vertex 150.0275345701547 -124.48202726980826 -48.800000000000125
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015467 -122.28202726980827 -46.4000000000002
+ vertex 150.0275345701547 -122.69613774197232 -46.3454813220627
+ vertex 150.0275345701547 -124.48202726980826 -48.800000000000125
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.0275345701547 -122.68202726980829 -47.00000000000015
+ vertex 150.02753457015467 -122.28202726980827 -46.4000000000002
+ vertex 150.0275345701547 -124.48202726980826 -48.800000000000125
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015461 -120.0820272698083 -46.43431457505091
+ vertex 150.02753457015467 -122.28202726980827 -46.4000000000002
+ vertex 150.0275345701547 -122.68202726980829 -47.00000000000015
+ endloop
+endfacet
+facet normal 1.0 6.470535773850401e-16 -2.97504977010331e-16
+ outer loop
+ vertex 150.02753457015467 -124.08202726980828 -48.800000000000125
+ vertex 150.0275345701547 -122.68202726980829 -47.00000000000015
+ vertex 150.0275345701547 -124.48202726980826 -48.800000000000125
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899203173e-16 1.0
+ outer loop
+ vertex 150.0275345701549 -123.4820272698083 -42.60000000000016
+ vertex 150.02753457015476 -118.28202726980824 -42.600000000000165
+ vertex -149.97246542984396 -123.48202726980846 -42.600000000000065
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899203173e-16 1.0
+ outer loop
+ vertex -149.97246542984414 -118.28202726980841 -42.60000000000007
+ vertex -149.97246542984396 -123.48202726980846 -42.600000000000065
+ vertex 150.02753457015476 -118.28202726980824 -42.600000000000165
+ endloop
+endfacet
+facet normal 4.174793163957734e-14 -0.1305261922200722 0.9914448613738078
+ outer loop
+ vertex 150.0275345701549 -123.7408463149108 -42.6340741737111
+ vertex 150.0275345701549 -123.4820272698083 -42.60000000000016
+ vertex -149.97246542984396 -123.74084631491097 -42.63407417371101
+ endloop
+endfacet
+facet normal 4.174793163957734e-14 -0.1305261922200722 0.9914448613738078
+ outer loop
+ vertex -149.97246542984396 -123.48202726980846 -42.600000000000065
+ vertex -149.97246542984396 -123.74084631491097 -42.63407417371101
+ vertex 150.0275345701549 -123.4820272698083 -42.60000000000016
+ endloop
+endfacet
+facet normal 3.5926213864307125e-14 4.53883218392181e-15 1.0
+ outer loop
+ vertex 150.02753457015447 -117.61634184485904 -48.900000000000155
+ vertex 150.02753457015427 -111.34771269475753 -48.90000000000018
+ vertex -149.97246542984428 -117.61634184485919 -48.90000000000006
+ endloop
+endfacet
+facet normal 3.5926213864307125e-14 4.53883218392181e-15 1.0
+ outer loop
+ vertex -149.97246542984445 -111.3477126947577 -48.900000000000105
+ vertex -149.97246542984428 -117.61634184485919 -48.90000000000006
+ vertex 150.02753457015427 -111.34771269475753 -48.90000000000018
+ endloop
+endfacet
+facet normal 5.543472411943318e-14 -0.38268343236508134 0.9238795325112904
+ outer loop
+ vertex 150.02753457015493 -123.98202726980828 -42.733974596215724
+ vertex 150.0275345701549 -123.7408463149108 -42.6340741737111
+ vertex -149.97246542984396 -123.98202726980844 -42.73397459621563
+ endloop
+endfacet
+facet normal 5.543472411943318e-14 -0.38268343236508134 0.9238795325112904
+ outer loop
+ vertex -149.97246542984396 -123.74084631491097 -42.63407417371101
+ vertex -149.97246542984396 -123.98202726980844 -42.73397459621563
+ vertex 150.0275345701549 -123.7408463149108 -42.6340741737111
+ endloop
+endfacet
+facet normal 5.247654033021131e-14 -0.6087614290087036 0.7933533402912483
+ outer loop
+ vertex 150.0275345701549 -124.18913405099481 -42.892893218813605
+ vertex 150.02753457015493 -123.98202726980828 -42.733974596215724
+ vertex -149.97246542984396 -124.189134050995 -42.89289321881352
+ endloop
+endfacet
+facet normal 5.247654033021131e-14 -0.6087614290087036 0.7933533402912483
+ outer loop
+ vertex -149.97246542984396 -123.98202726980844 -42.73397459621563
+ vertex -149.97246542984396 -124.189134050995 -42.89289321881352
+ vertex 150.02753457015493 -123.98202726980828 -42.733974596215724
+ endloop
+endfacet
+facet normal -3.9847246381628766e-14 1.0 -7.797766215937043e-16
+ outer loop
+ vertex 150.0275345701547 -122.68202726980829 -47.00000000000015
+ vertex 150.02753457015464 -122.68202726980829 -49.200000000000145
+ vertex -149.9724654298442 -122.68202726980844 -47.00000000000007
+ endloop
+endfacet
+facet normal -3.9847246381628766e-14 1.0 -7.797766215937043e-16
+ outer loop
+ vertex -149.9724654298442 -122.68202726980844 -49.20000000000007
+ vertex -149.9724654298442 -122.68202726980844 -47.00000000000007
+ vertex 150.02753457015464 -122.68202726980829 -49.200000000000145
+ endloop
+endfacet
+facet normal -3.9847246381628766e-14 1.0 -6.227439144697608e-15
+ outer loop
+ vertex 150.02753457015476 -118.28202726980824 -42.600000000000165
+ vertex 150.02753457015473 -118.28202726980824 -43.00000000000016
+ vertex -149.97246542984414 -118.28202726980841 -42.60000000000007
+ endloop
+endfacet
+facet normal -3.9847246381628766e-14 1.0 -6.227439144697608e-15
+ outer loop
+ vertex -149.972465429844 -118.28202726980838 -43.00000000000007
+ vertex -149.97246542984414 -118.28202726980841 -42.60000000000007
+ vertex 150.02753457015473 -118.28202726980824 -43.00000000000016
+ endloop
+endfacet
+facet normal -3.9847246381628766e-14 1.0 -9.400019899202897e-16
+ outer loop
+ vertex 150.02753457015476 -120.0820272698083 -44.40000000000017
+ vertex 150.02753457015461 -120.0820272698083 -46.43431457505091
+ vertex -149.9724654298441 -120.08202726980845 -44.40000000000007
+ endloop
+endfacet
+facet normal -3.9847246381628766e-14 1.0 -9.400019899202897e-16
+ outer loop
+ vertex -149.9724654298442 -120.08202726980846 -46.434314575050806
+ vertex -149.9724654298441 -120.08202726980845 -44.40000000000007
+ vertex 150.02753457015461 -120.0820272698083 -46.43431457505091
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 9.400019899202897e-16
+ outer loop
+ vertex 150.0275345701544 -108.88202726980829 -44.40000000000018
+ vertex -149.9724654298445 -108.88202726980842 -44.40000000000009
+ vertex 150.0275345701543 -108.88202726980826 -46.43431457505094
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 9.400019899202897e-16
+ outer loop
+ vertex -149.9724654298445 -108.88202726980842 -46.434314575050855
+ vertex 150.0275345701543 -108.88202726980826 -46.43431457505094
+ vertex -149.9724654298445 -108.88202726980842 -44.40000000000009
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899203173e-16 -1.0
+ outer loop
+ vertex 150.0275345701547 -122.68202726980829 -47.00000000000015
+ vertex -149.9724654298442 -122.68202726980844 -47.00000000000007
+ vertex 150.02753457015467 -120.64771269475752 -47.00000000000017
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899203173e-16 -1.0
+ outer loop
+ vertex -149.9724654298442 -120.64771269475769 -47.00000000000008
+ vertex 150.02753457015467 -120.64771269475752 -47.00000000000017
+ vertex -149.9724654298442 -122.68202726980844 -47.00000000000007
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899203173e-16 -1.0
+ outer loop
+ vertex 150.02753457015476 -120.0820272698083 -44.40000000000017
+ vertex -149.9724654298441 -120.08202726980845 -44.40000000000007
+ vertex 150.02753457015467 -117.88202726980829 -44.40000000000016
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899203173e-16 -1.0
+ outer loop
+ vertex -149.9724654298442 -117.88202726980845 -44.40000000000007
+ vertex 150.02753457015467 -117.88202726980829 -44.40000000000016
+ vertex -149.9724654298441 -120.08202726980845 -44.40000000000007
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 9.400019899202897e-16
+ outer loop
+ vertex 150.02753457015456 -110.68202726980829 -42.60000000000017
+ vertex -149.97246542984436 -110.68202726980844 -42.600000000000094
+ vertex 150.0275345701545 -110.68202726980826 -43.00000000000017
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 9.400019899202897e-16
+ outer loop
+ vertex -149.97246542984436 -110.68202726980842 -43.00000000000009
+ vertex 150.0275345701545 -110.68202726980826 -43.00000000000017
+ vertex -149.97246542984436 -110.68202726980844 -42.600000000000094
+ endloop
+endfacet
+facet normal 4.7317208943768447e-14 -0.9238795325112916 0.38268343236507846
+ outer loop
+ vertex 150.0275345701549 -124.34805267359272 -43.10000000000016
+ vertex -149.97246542984396 -124.34805267359287 -43.100000000000065
+ vertex 150.02753457015487 -124.44795309609734 -43.341180954897645
+ endloop
+endfacet
+facet normal 4.7317208943768447e-14 -0.9238795325112916 0.38268343236507846
+ outer loop
+ vertex -149.972465429844 -124.44795309609752 -43.34118095489755
+ vertex 150.02753457015487 -124.44795309609734 -43.341180954897645
+ vertex -149.97246542984396 -124.34805267359287 -43.100000000000065
+ endloop
+endfacet
+facet normal 1.7543479865911295e-15 -0.7071067811865512 -0.7071067811865439
+ outer loop
+ vertex 150.02753457015453 -118.18202726980827 -49.465685424949434
+ vertex 150.02753457015467 -120.64771269475752 -47.00000000000017
+ vertex -149.97246542984436 -118.18202726980843 -49.46568542494934
+ endloop
+endfacet
+facet normal 1.7543479865911295e-15 -0.7071067811865512 -0.7071067811865439
+ outer loop
+ vertex -149.9724654298442 -120.64771269475769 -47.00000000000008
+ vertex -149.97246542984436 -118.18202726980843 -49.46568542494934
+ vertex 150.02753457015467 -120.64771269475752 -47.00000000000017
+ endloop
+endfacet
+facet normal -1.7543479865910372e-15 0.7071067811865481 0.707106781186547
+ outer loop
+ vertex 150.02753457015461 -120.0820272698083 -46.43431457505091
+ vertex 150.02753457015447 -117.61634184485904 -48.900000000000155
+ vertex -149.9724654298442 -120.08202726980846 -46.434314575050806
+ endloop
+endfacet
+facet normal -1.7543479865910372e-15 0.7071067811865481 0.707106781186547
+ outer loop
+ vertex -149.97246542984428 -117.61634184485919 -48.90000000000006
+ vertex -149.9724654298442 -120.08202726980846 -46.434314575050806
+ vertex 150.02753457015447 -117.61634184485904 -48.900000000000155
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899203173e-16 -1.0
+ outer loop
+ vertex 150.0275345701547 -124.48202726980826 -48.800000000000125
+ vertex -149.9724654298442 -124.48202726980841 -48.80000000000003
+ vertex 150.02753457015467 -124.08202726980828 -48.800000000000125
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899203173e-16 -1.0
+ outer loop
+ vertex -149.9724654298442 -124.08202726980844 -48.80000000000003
+ vertex 150.02753457015467 -124.08202726980828 -48.800000000000125
+ vertex -149.9724654298442 -124.48202726980841 -48.80000000000003
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899203173e-16 1.0
+ outer loop
+ vertex 150.02753457015453 -111.08202726980826 -43.00000000000017
+ vertex 150.0275345701545 -110.68202726980826 -43.00000000000017
+ vertex -149.9724654298443 -111.08202726980842 -43.00000000000008
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899203173e-16 1.0
+ outer loop
+ vertex -149.97246542984436 -110.68202726980842 -43.00000000000009
+ vertex -149.9724654298443 -111.08202726980842 -43.00000000000008
+ vertex 150.0275345701545 -110.68202726980826 -43.00000000000017
+ endloop
+endfacet
+facet normal -3.592621386430644e-14 -1.7054096175908593e-14 -1.0
+ outer loop
+ vertex 150.02753457015467 -124.08202726980826 -49.200000000000124
+ vertex -149.9724654298442 -124.08202726980842 -49.20000000000003
+ vertex 150.02753457015464 -122.68202726980829 -49.200000000000145
+ endloop
+endfacet
+facet normal -3.592621386430644e-14 -1.7054096175908593e-14 -1.0
+ outer loop
+ vertex -149.9724654298442 -122.68202726980844 -49.20000000000007
+ vertex 150.02753457015464 -122.68202726980829 -49.200000000000145
+ vertex -149.9724654298442 -124.08202726980842 -49.20000000000003
+ endloop
+endfacet
+facet normal 4.5675258850882686e-14 -0.7071067811865448 0.7071067811865503
+ outer loop
+ vertex 150.02753457015427 -111.34771269475753 -48.90000000000018
+ vertex 150.0275345701543 -108.88202726980826 -46.43431457505094
+ vertex -149.97246542984445 -111.3477126947577 -48.900000000000105
+ endloop
+endfacet
+facet normal 4.5675258850882686e-14 -0.7071067811865448 0.7071067811865503
+ outer loop
+ vertex -149.9724654298445 -108.88202726980842 -46.434314575050855
+ vertex -149.97246542984445 -111.3477126947577 -48.900000000000105
+ vertex 150.0275345701543 -108.88202726980826 -46.43431457505094
+ endloop
+endfacet
+facet normal 3.14535864675755e-14 0.13052619222007428 0.9914448613738074
+ outer loop
+ vertex 150.02753457015436 -105.48202726980834 -42.60000000000018
+ vertex 150.02753457015436 -105.22320822470579 -42.63407417371111
+ vertex -149.9724654298445 -105.48202726980843 -42.60000000000009
+ endloop
+endfacet
+facet normal 3.14535864675755e-14 0.13052619222007428 0.9914448613738074
+ outer loop
+ vertex -149.9724654298445 -105.2232082247059 -42.63407417371102
+ vertex -149.9724654298445 -105.48202726980843 -42.60000000000009
+ vertex 150.02753457015436 -105.22320822470579 -42.63407417371111
+ endloop
+endfacet
+facet normal 2.0206844591291433e-14 0.3826834323650829 0.9238795325112896
+ outer loop
+ vertex 150.02753457015436 -105.22320822470579 -42.63407417371111
+ vertex 150.02753457015433 -104.98202726980827 -42.73397459621574
+ vertex -149.9724654298445 -105.2232082247059 -42.63407417371102
+ endloop
+endfacet
+facet normal 2.0206844591291433e-14 0.3826834323650829 0.9238795325112896
+ outer loop
+ vertex -149.9724654298445 -104.98202726980846 -42.73397459621565
+ vertex -149.9724654298445 -105.2232082247059 -42.63407417371102
+ vertex 150.02753457015433 -104.98202726980827 -42.73397459621574
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 -2.4387889803801352e-15
+ outer loop
+ vertex 150.0275345701547 -124.48202726980826 -48.800000000000125
+ vertex 150.02753457015487 -124.4820272698083 -43.60000000000016
+ vertex -149.9724654298442 -124.48202726980841 -48.80000000000003
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 -2.4387889803801352e-15
+ outer loop
+ vertex -149.97246542984396 -124.48202726980841 -43.600000000000065
+ vertex -149.9724654298442 -124.48202726980841 -48.80000000000003
+ vertex 150.02753457015487 -124.4820272698083 -43.60000000000016
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899203173e-16 1.0
+ outer loop
+ vertex 150.02753457015473 -118.28202726980824 -43.00000000000016
+ vertex 150.02753457015473 -117.88202726980822 -43.00000000000016
+ vertex -149.972465429844 -118.28202726980838 -43.00000000000007
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899203173e-16 1.0
+ outer loop
+ vertex -149.97246542984414 -117.88202726980838 -43.00000000000007
+ vertex -149.972465429844 -118.28202726980838 -43.00000000000007
+ vertex 150.02753457015473 -117.88202726980822 -43.00000000000016
+ endloop
+endfacet
+facet normal 3.958984754963587e-14 -0.9914448613738096 0.1305261922200573
+ outer loop
+ vertex 150.02753457015487 -124.4820272698083 -43.60000000000016
+ vertex 150.02753457015487 -124.44795309609734 -43.341180954897645
+ vertex -149.97246542984396 -124.48202726980841 -43.600000000000065
+ endloop
+endfacet
+facet normal 3.958984754963587e-14 -0.9914448613738096 0.1305261922200573
+ outer loop
+ vertex -149.972465429844 -124.44795309609752 -43.34118095489755
+ vertex -149.97246542984396 -124.48202726980841 -43.600000000000065
+ vertex 150.02753457015487 -124.44795309609734 -43.341180954897645
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 9.400019899202897e-16
+ outer loop
+ vertex 150.02753457015447 -111.08202726980824 -44.40000000000017
+ vertex 150.02753457015453 -111.08202726980826 -43.00000000000017
+ vertex -149.97246542984442 -111.08202726980842 -44.40000000000008
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 9.400019899202897e-16
+ outer loop
+ vertex -149.9724654298443 -111.08202726980842 -43.00000000000008
+ vertex -149.97246542984442 -111.08202726980842 -44.40000000000008
+ vertex 150.02753457015453 -111.08202726980826 -43.00000000000017
+ endloop
+endfacet
+facet normal 1.0964775362654477e-14 0.6087614290087051 0.7933533402912472
+ outer loop
+ vertex 150.02753457015433 -104.98202726980827 -42.73397459621574
+ vertex 150.02753457015433 -104.77492048862172 -42.892893218813626
+ vertex -149.9724654298445 -104.98202726980846 -42.73397459621565
+ endloop
+endfacet
+facet normal 1.0964775362654477e-14 0.6087614290087051 0.7933533402912472
+ outer loop
+ vertex -149.9724654298445 -104.77492048862187 -42.89289321881353
+ vertex -149.9724654298445 -104.98202726980846 -42.73397459621565
+ vertex 150.02753457015433 -104.77492048862172 -42.892893218813626
+ endloop
+endfacet
+facet normal 5.308492047377894e-16 0.7933533402912367 0.6087614290087189
+ outer loop
+ vertex 150.02753457015433 -104.61600186602381 -43.10000000000017
+ vertex -149.97246542984453 -104.61600186602399 -43.1000000000001
+ vertex 150.02753457015433 -104.77492048862172 -42.892893218813626
+ endloop
+endfacet
+facet normal 5.308492047377894e-16 0.7933533402912367 0.6087614290087189
+ outer loop
+ vertex -149.9724654298445 -104.77492048862187 -42.89289321881353
+ vertex 150.02753457015433 -104.77492048862172 -42.892893218813626
+ vertex -149.97246542984453 -104.61600186602399 -43.1000000000001
+ endloop
+endfacet
+facet normal 3.850996045241048e-14 -0.7933533402912385 0.6087614290087162
+ outer loop
+ vertex 150.0275345701549 -124.34805267359272 -43.10000000000016
+ vertex 150.0275345701549 -124.18913405099481 -42.892893218813605
+ vertex -149.97246542984396 -124.34805267359287 -43.100000000000065
+ endloop
+endfacet
+facet normal 3.850996045241048e-14 -0.7933533402912385 0.6087614290087162
+ outer loop
+ vertex -149.97246542984396 -124.189134050995 -42.89289321881352
+ vertex -149.97246542984396 -124.34805267359287 -43.100000000000065
+ vertex 150.0275345701549 -124.18913405099481 -42.892893218813605
+ endloop
+endfacet
+facet normal -3.9847246381628766e-14 1.0 -4.122523745489034e-14
+ outer loop
+ vertex 150.02753457015473 -117.88202726980822 -43.00000000000016
+ vertex 150.02753457015467 -117.88202726980829 -44.40000000000016
+ vertex -149.97246542984414 -117.88202726980838 -43.00000000000007
+ endloop
+endfacet
+facet normal -3.9847246381628766e-14 1.0 -4.122523745489034e-14
+ outer loop
+ vertex -149.9724654298442 -117.88202726980845 -44.40000000000007
+ vertex -149.97246542984414 -117.88202726980838 -43.00000000000007
+ vertex 150.02753457015467 -117.88202726980829 -44.40000000000016
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 6.007129263248553e-15
+ outer loop
+ vertex 150.02753457015467 -124.08202726980826 -49.200000000000124
+ vertex 150.02753457015467 -124.08202726980828 -48.800000000000125
+ vertex -149.9724654298442 -124.08202726980842 -49.20000000000003
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 6.007129263248553e-15
+ outer loop
+ vertex -149.9724654298442 -124.08202726980844 -48.80000000000003
+ vertex -149.9724654298442 -124.08202726980842 -49.20000000000003
+ vertex 150.02753457015467 -124.08202726980828 -48.800000000000125
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899203173e-16 -1.0
+ outer loop
+ vertex 150.02753457015447 -111.08202726980824 -44.40000000000017
+ vertex -149.97246542984442 -111.08202726980842 -44.40000000000008
+ vertex 150.0275345701544 -108.88202726980829 -44.40000000000018
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899203173e-16 -1.0
+ outer loop
+ vertex -149.9724654298445 -108.88202726980842 -44.40000000000009
+ vertex 150.0275345701544 -108.88202726980829 -44.40000000000018
+ vertex -149.97246542984442 -111.08202726980842 -44.40000000000008
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899203173e-16 1.0
+ outer loop
+ vertex 150.02753457015456 -110.68202726980829 -42.60000000000017
+ vertex 150.02753457015436 -105.48202726980834 -42.60000000000018
+ vertex -149.97246542984436 -110.68202726980844 -42.600000000000094
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899203173e-16 1.0
+ outer loop
+ vertex -149.9724654298445 -105.48202726980843 -42.60000000000009
+ vertex -149.97246542984436 -110.68202726980844 -42.600000000000094
+ vertex 150.02753457015436 -105.48202726980834 -42.60000000000018
+ endloop
+endfacet
+facet normal -4.1747931639577e-14 0.13052619222006093 -0.9914448613738092
+ outer loop
+ vertex 150.02753457015436 -107.09613774197233 -43.25451867793767
+ vertex -149.97246542984445 -107.09613774197244 -43.25451867793758
+ vertex 150.02753457015436 -106.68202726980829 -43.20000000000017
+ endloop
+endfacet
+facet normal -4.1747931639577e-14 0.13052619222006093 -0.9914448613738092
+ outer loop
+ vertex -149.97246542984445 -106.68202726980844 -43.20000000000008
+ vertex 150.02753457015436 -106.68202726980829 -43.20000000000017
+ vertex -149.97246542984445 -107.09613774197244 -43.25451867793758
+ endloop
+endfacet
+facet normal -3.958984754963589e-14 0.9914448613738105 0.13052619222005132
+ outer loop
+ vertex 150.02753457015436 -117.18202726980829 -52.60000000000017
+ vertex 150.02753457015427 -117.09002700078877 -53.29881142177697
+ vertex -149.9724654298445 -117.18202726980847 -52.60000000000009
+ endloop
+endfacet
+facet normal -3.958984754963589e-14 0.9914448613738105 0.13052619222005132
+ outer loop
+ vertex -149.97246542984442 -117.09002700078892 -53.29881142177688
+ vertex -149.9724654298445 -117.18202726980847 -52.60000000000009
+ vertex 150.02753457015427 -117.09002700078877 -53.29881142177697
+ endloop
+endfacet
+facet normal -5.2476540330211305e-14 0.6087614290087029 -0.7933533402912488
+ outer loop
+ vertex 150.02753457015436 -116.39121557901197 -50.69081169079648
+ vertex -149.97246542984445 -116.39121557901213 -50.690811690796394
+ vertex 150.02753457015436 -115.83202726980828 -50.2617314097822
+ endloop
+endfacet
+facet normal -5.2476540330211305e-14 0.6087614290087029 -0.7933533402912488
+ outer loop
+ vertex -149.97246542984445 -115.83202726980844 -50.26173140978212
+ vertex 150.02753457015436 -115.83202726980828 -50.2617314097822
+ vertex -149.97246542984445 -116.39121557901213 -50.690811690796394
+ endloop
+endfacet
+facet normal -8.276399286620187e-15 0.9238795325112905 0.38268343236508096
+ outer loop
+ vertex 150.02753457015427 -116.82029586002625 -53.95000000000018
+ vertex -149.97246542984453 -116.82029586002643 -53.950000000000095
+ vertex 150.02753457015427 -117.09002700078877 -53.29881142177697
+ endloop
+endfacet
+facet normal -8.276399286620187e-15 0.9238795325112905 0.38268343236508096
+ outer loop
+ vertex -149.97246542984442 -117.09002700078892 -53.29881142177688
+ vertex 150.02753457015427 -117.09002700078877 -53.29881142177697
+ vertex -149.97246542984453 -116.82029586002643 -53.950000000000095
+ endloop
+endfacet
+facet normal -1.8036601700907267e-14 0.9238795325112914 0.38268343236507907
+ outer loop
+ vertex 150.02753457015433 -104.61600186602381 -43.10000000000017
+ vertex 150.0275345701543 -104.51610144351919 -43.34118095489766
+ vertex -149.97246542984453 -104.61600186602399 -43.1000000000001
+ endloop
+endfacet
+facet normal -1.8036601700907267e-14 0.9238795325112914 0.38268343236507907
+ outer loop
+ vertex -149.97246542984453 -104.51610144351935 -43.34118095489759
+ vertex -149.97246542984453 -104.61600186602399 -43.1000000000001
+ vertex 150.0275345701543 -104.51610144351919 -43.34118095489766
+ endloop
+endfacet
+facet normal 3.389363707114814e-14 0.1305261922200452 0.9914448613738114
+ outer loop
+ vertex 150.02753457015422 -115.1808386915851 -55.20799973098066
+ vertex 150.0275345701542 -114.4820272698083 -55.30000000000017
+ vertex -149.97246542984468 -115.18083869158525 -55.20799973098057
+ endloop
+endfacet
+facet normal 3.389363707114814e-14 0.1305261922200452 0.9914448613738114
+ outer loop
+ vertex -149.97246542984468 -114.48202726980841 -55.30000000000008
+ vertex -149.97246542984468 -115.18083869158525 -55.20799973098057
+ vertex 150.0275345701542 -114.4820272698083 -55.30000000000017
+ endloop
+endfacet
+facet normal 5.2476540330211305e-14 -0.6087614290087029 0.7933533402912488
+ outer loop
+ vertex 150.02753457015413 -113.13202726980829 -54.93826859021815
+ vertex 150.02753457015413 -112.57283896060463 -54.509188309203864
+ vertex -149.97246542984473 -113.13202726980845 -54.93826859021808
+ endloop
+endfacet
+facet normal 5.2476540330211305e-14 -0.6087614290087029 0.7933533402912488
+ outer loop
+ vertex -149.97246542984473 -112.57283896060477 -54.50918830920379
+ vertex -149.97246542984473 -113.13202726980845 -54.93826859021808
+ vertex 150.02753457015413 -112.57283896060463 -54.509188309203864
+ endloop
+endfacet
+facet normal -5.707741135805547e-14 0.9238795325112905 -0.382683432365081
+ outer loop
+ vertex 150.0275345701544 -116.82029586002628 -51.25000000000016
+ vertex 150.02753457015433 -117.09002700078877 -51.901188578223376
+ vertex -149.97246542984445 -116.82029586002645 -51.25000000000008
+ endloop
+endfacet
+facet normal -5.707741135805547e-14 0.9238795325112905 -0.382683432365081
+ outer loop
+ vertex -149.97246542984445 -117.09002700078894 -51.901188578223284
+ vertex -149.97246542984445 -116.82029586002645 -51.25000000000008
+ vertex 150.02753457015433 -117.09002700078877 -51.901188578223376
+ endloop
+endfacet
+facet normal 2.0206844591290862e-14 0.38268343236510205 0.9238795325112817
+ outer loop
+ vertex 150.02753457015422 -115.83202726980828 -54.93826859021815
+ vertex 150.02753457015422 -115.1808386915851 -55.20799973098066
+ vertex -149.97246542984453 -115.83202726980842 -54.93826859021806
+ endloop
+endfacet
+facet normal 2.0206844591290862e-14 0.38268343236510205 0.9238795325112817
+ outer loop
+ vertex -149.97246542984468 -115.18083869158525 -55.20799973098057
+ vertex -149.97246542984453 -115.83202726980842 -54.93826859021806
+ vertex 150.02753457015422 -115.1808386915851 -55.20799973098066
+ endloop
+endfacet
+facet normal -3.267361176936225e-14 -0.13052619222004544 -0.9914448613738113
+ outer loop
+ vertex 150.02753457015436 -114.48202726980827 -49.90000000000019
+ vertex -149.97246542984445 -114.48202726980843 -49.90000000000009
+ vertex 150.02753457015433 -113.78321584803146 -49.9920002690197
+ endloop
+endfacet
+facet normal -3.267361176936225e-14 -0.13052619222004544 -0.9914448613738113
+ outer loop
+ vertex -149.9724654298445 -113.78321584803162 -49.9920002690196
+ vertex 150.02753457015433 -113.78321584803146 -49.9920002690197
+ vertex -149.97246542984445 -114.48202726980843 -49.90000000000009
+ endloop
+endfacet
+facet normal 8.276399286620187e-15 -0.9238795325112905 -0.38268343236508096
+ outer loop
+ vertex 150.02753457015427 -112.1437586795903 -51.25000000000016
+ vertex -149.9724654298446 -112.14375867959048 -51.25000000000008
+ vertex 150.0275345701542 -111.87402753882782 -51.901188578223376
+ endloop
+endfacet
+facet normal 8.276399286620187e-15 -0.9238795325112905 -0.38268343236508096
+ outer loop
+ vertex -149.97246542984465 -111.87402753882795 -51.90118857822331
+ vertex 150.0275345701542 -111.87402753882782 -51.901188578223376
+ vertex -149.9724654298446 -112.14375867959048 -51.25000000000008
+ endloop
+endfacet
+facet normal 5.0554622912290226e-14 -0.3826834323651004 0.9238795325112824
+ outer loop
+ vertex 150.02753457015416 -113.78321584803147 -55.20799973098066
+ vertex 150.02753457015413 -113.13202726980829 -54.93826859021815
+ vertex -149.97246542984473 -113.78321584803163 -55.20799973098057
+ endloop
+endfacet
+facet normal 5.0554622912290226e-14 -0.3826834323651004 0.9238795325112824
+ outer loop
+ vertex -149.97246542984473 -113.13202726980845 -54.93826859021808
+ vertex -149.97246542984473 -113.78321584803163 -55.20799973098057
+ vertex 150.02753457015413 -113.13202726980829 -54.93826859021815
+ endloop
+endfacet
+facet normal -4.349252002405747e-15 0.7933533402912372 0.6087614290087182
+ outer loop
+ vertex 150.02753457015427 -116.82029586002625 -53.95000000000018
+ vertex 150.02753457015424 -116.39121557901197 -54.509188309203864
+ vertex -149.97246542984453 -116.82029586002643 -53.950000000000095
+ endloop
+endfacet
+facet normal -4.349252002405747e-15 0.7933533402912372 0.6087614290087182
+ outer loop
+ vertex -149.97246542984465 -116.39121557901213 -54.50918830920377
+ vertex -149.97246542984453 -116.82029586002643 -53.950000000000095
+ vertex 150.02753457015424 -116.39121557901197 -54.509188309203864
+ endloop
+endfacet
+facet normal -2.982964513534882e-14 0.9914448613738099 -0.1305261922200552
+ outer loop
+ vertex 150.02753457015436 -117.18202726980829 -52.60000000000017
+ vertex -149.9724654298445 -117.18202726980847 -52.60000000000009
+ vertex 150.02753457015433 -117.09002700078877 -51.901188578223376
+ endloop
+endfacet
+facet normal -2.982964513534882e-14 0.9914448613738099 -0.1305261922200552
+ outer loop
+ vertex -149.97246542984445 -117.09002700078894 -51.901188578223284
+ vertex 150.02753457015433 -117.09002700078877 -51.901188578223376
+ vertex -149.9724654298445 -117.18202726980847 -52.60000000000009
+ endloop
+endfacet
+facet normal 4.7317208943768276e-14 -0.9238795325112859 0.3826834323650923
+ outer loop
+ vertex 150.02753457015413 -112.14375867959032 -53.95000000000018
+ vertex 150.02753457015413 -111.87402753882779 -53.298811421776996
+ vertex -149.97246542984468 -112.14375867959046 -53.95000000000012
+ endloop
+endfacet
+facet normal 4.7317208943768276e-14 -0.9238795325112859 0.3826834323650923
+ outer loop
+ vertex -149.97246542984473 -111.87402753882799 -53.298811421776925
+ vertex -149.97246542984468 -112.14375867959046 -53.95000000000012
+ vertex 150.02753457015413 -111.87402753882779 -53.298811421776996
+ endloop
+endfacet
+facet normal -3.145358646757744e-14 -0.1305261922200097 -0.9914448613738159
+ outer loop
+ vertex 150.02753457015436 -106.68202726980829 -43.20000000000017
+ vertex -149.97246542984445 -106.68202726980844 -43.20000000000008
+ vertex 150.02753457015433 -106.26791679764423 -43.25451867793765
+ endloop
+endfacet
+facet normal -3.145358646757744e-14 -0.1305261922200097 -0.9914448613738159
+ outer loop
+ vertex -149.9724654298445 -106.26791679764443 -43.254518677937554
+ vertex 150.02753457015433 -106.26791679764423 -43.25451867793765
+ vertex -149.97246542984445 -106.68202726980844 -43.20000000000008
+ endloop
+endfacet
+facet normal -5.308492047378068e-16 -0.7933533402912362 -0.6087614290087194
+ outer loop
+ vertex 150.02753457015427 -112.1437586795903 -51.25000000000016
+ vertex 150.02753457015424 -112.57283896060459 -50.69081169079649
+ vertex -149.9724654298446 -112.14375867959048 -51.25000000000008
+ endloop
+endfacet
+facet normal -5.308492047378068e-16 -0.7933533402912362 -0.6087614290087194
+ outer loop
+ vertex -149.97246542984445 -112.57283896060474 -50.690811690796394
+ vertex -149.9724654298446 -112.14375867959048 -51.25000000000008
+ vertex 150.02753457015424 -112.57283896060459 -50.69081169079649
+ endloop
+endfacet
+facet normal 6.084674155510988e-15 0.6087614290087043 0.7933533402912477
+ outer loop
+ vertex 150.02753457015424 -116.39121557901197 -54.509188309203864
+ vertex 150.02753457015422 -115.83202726980828 -54.93826859021815
+ vertex -149.97246542984465 -116.39121557901213 -54.50918830920377
+ endloop
+endfacet
+facet normal 6.084674155510988e-15 0.6087614290087043 0.7933533402912477
+ outer loop
+ vertex -149.97246542984453 -115.83202726980842 -54.93826859021806
+ vertex -149.97246542984465 -116.39121557901213 -54.50918830920377
+ vertex 150.02753457015422 -115.83202726980828 -54.93826859021815
+ endloop
+endfacet
+facet normal -4.052790633779061e-14 0.13052619222004386 -0.9914448613738115
+ outer loop
+ vertex 150.0275345701544 -115.18083869158507 -49.99200026901969
+ vertex -149.97246542984445 -115.18083869158525 -49.99200026901961
+ vertex 150.02753457015436 -114.48202726980827 -49.90000000000019
+ endloop
+endfacet
+facet normal -4.052790633779061e-14 0.13052619222004386 -0.9914448613738115
+ outer loop
+ vertex -149.97246542984445 -114.48202726980843 -49.90000000000009
+ vertex 150.02753457015436 -114.48202726980827 -49.90000000000019
+ vertex -149.97246542984445 -115.18083869158525 -49.99200026901961
+ endloop
+endfacet
+facet normal 3.850996045241035e-14 -0.793353340291234 0.6087614290087222
+ outer loop
+ vertex 150.02753457015413 -112.57283896060463 -54.509188309203864
+ vertex 150.02753457015413 -112.14375867959032 -53.95000000000018
+ vertex -149.97246542984473 -112.57283896060477 -54.50918830920379
+ endloop
+endfacet
+facet normal 3.850996045241035e-14 -0.793353340291234 0.6087614290087222
+ outer loop
+ vertex -149.97246542984468 -112.14375867959046 -53.95000000000012
+ vertex -149.97246542984473 -112.57283896060477 -54.50918830920379
+ vertex 150.02753457015413 -112.14375867959032 -53.95000000000018
+ endloop
+endfacet
+facet normal 3.9589847549635896e-14 -0.9914448613738105 0.13052619222005105
+ outer loop
+ vertex 150.0275345701542 -111.7820272698083 -52.60000000000017
+ vertex -149.97246542984465 -111.78202726980844 -52.60000000000011
+ vertex 150.02753457015413 -111.87402753882779 -53.298811421776996
+ endloop
+endfacet
+facet normal 3.9589847549635896e-14 -0.9914448613738105 0.13052619222005105
+ outer loop
+ vertex -149.97246542984473 -111.87402753882799 -53.298811421776925
+ vertex 150.02753457015413 -111.87402753882779 -53.298811421776996
+ vertex -149.97246542984465 -111.78202726980844 -52.60000000000011
+ endloop
+endfacet
+facet normal 4.052790633779061e-14 -0.13052619222004386 0.9914448613738115
+ outer loop
+ vertex 150.0275345701542 -114.4820272698083 -55.30000000000017
+ vertex 150.02753457015416 -113.78321584803147 -55.20799973098066
+ vertex -149.97246542984468 -114.48202726980841 -55.30000000000008
+ endloop
+endfacet
+facet normal 4.052790633779061e-14 -0.13052619222004386 0.9914448613738115
+ outer loop
+ vertex -149.97246542984473 -113.78321584803163 -55.20799973098057
+ vertex -149.97246542984468 -114.48202726980841 -55.30000000000008
+ vertex 150.02753457015416 -113.78321584803147 -55.20799973098066
+ endloop
+endfacet
+facet normal -1.7766793987718918e-14 -0.38268343236510816 -0.9238795325112792
+ outer loop
+ vertex 150.02753457015433 -106.26791679764423 -43.25451867793765
+ vertex -149.9724654298445 -106.26791679764443 -43.254518677937554
+ vertex 150.02753457015436 -105.88202726980826 -43.414359353945066
+ endloop
+endfacet
+facet normal -1.7766793987718918e-14 -0.38268343236510816 -0.9238795325112792
+ outer loop
+ vertex -149.97246542984442 -105.88202726980843 -43.414359353944974
+ vertex 150.02753457015436 -105.88202726980826 -43.414359353945066
+ vertex -149.9724654298445 -106.26791679764443 -43.254518677937554
+ endloop
+endfacet
+facet normal -4.3390061659553906e-14 0.793353340291235 -0.6087614290087209
+ outer loop
+ vertex 150.0275345701544 -116.82029586002628 -51.25000000000016
+ vertex -149.97246542984445 -116.82029586002645 -51.25000000000008
+ vertex 150.02753457015436 -116.39121557901197 -50.69081169079648
+ endloop
+endfacet
+facet normal -4.3390061659553906e-14 0.793353340291235 -0.6087614290087209
+ outer loop
+ vertex -149.97246542984445 -116.39121557901213 -50.690811690796394
+ vertex 150.02753457015436 -116.39121557901197 -50.69081169079648
+ vertex -149.97246542984445 -116.82029586002645 -51.25000000000008
+ endloop
+endfacet
+facet normal -1.584487656979815e-14 -0.6087614290087004 -0.7933533402912507
+ outer loop
+ vertex 150.02753457015436 -105.88202726980826 -43.414359353945066
+ vertex -149.97246542984442 -105.88202726980843 -43.414359353944974
+ vertex 150.0275345701543 -105.5506564199098 -43.66862915010168
+ endloop
+endfacet
+facet normal -1.584487656979815e-14 -0.6087614290087004 -0.7933533402912507
+ outer loop
+ vertex -149.97246542984442 -105.55065641990996 -43.66862915010159
+ vertex 150.0275345701543 -105.5506564199098 -43.66862915010168
+ vertex -149.97246542984442 -105.88202726980843 -43.414359353944974
+ endloop
+endfacet
+facet normal -4.811457230871733e-14 0.3826834323650628 -0.923879532511298
+ outer loop
+ vertex 150.02753457015442 -107.48202726980827 -43.41435935394507
+ vertex -149.97246542984445 -107.48202726980843 -43.414359353944974
+ vertex 150.02753457015436 -107.09613774197233 -43.25451867793767
+ endloop
+endfacet
+facet normal -4.811457230871733e-14 0.3826834323650628 -0.923879532511298
+ outer loop
+ vertex -149.97246542984445 -107.09613774197244 -43.25451867793758
+ vertex 150.02753457015436 -107.09613774197233 -43.25451867793767
+ vertex -149.97246542984445 -107.48202726980843 -43.414359353944974
+ endloop
+endfacet
+facet normal -6.084674155510988e-15 -0.6087614290087043 -0.7933533402912477
+ outer loop
+ vertex 150.0275345701543 -113.13202726980829 -50.2617314097822
+ vertex -149.97246542984453 -113.13202726980845 -50.26173140978211
+ vertex 150.02753457015424 -112.57283896060459 -50.69081169079649
+ endloop
+endfacet
+facet normal -6.084674155510988e-15 -0.6087614290087043 -0.7933533402912477
+ outer loop
+ vertex -149.97246542984445 -112.57283896060474 -50.690811690796394
+ vertex 150.02753457015424 -112.57283896060459 -50.69081169079649
+ vertex -149.97246542984453 -113.13202726980845 -50.26173140978211
+ endloop
+endfacet
+facet normal -2.0206844591290862e-14 -0.38268343236510205 -0.9238795325112817
+ outer loop
+ vertex 150.02753457015433 -113.78321584803146 -49.9920002690197
+ vertex -149.9724654298445 -113.78321584803162 -49.9920002690196
+ vertex 150.0275345701543 -113.13202726980829 -50.2617314097822
+ endloop
+endfacet
+facet normal -2.0206844591290862e-14 -0.38268343236510205 -0.9238795325112817
+ outer loop
+ vertex -149.97246542984453 -113.13202726980845 -50.26173140978211
+ vertex 150.0275345701543 -113.13202726980829 -50.2617314097822
+ vertex -149.9724654298445 -113.78321584803162 -49.9920002690196
+ endloop
+endfacet
+facet normal 3.958984754963589e-14 -0.9914448613738105 -0.13052619222005132
+ outer loop
+ vertex 150.0275345701542 -111.7820272698083 -52.60000000000017
+ vertex 150.0275345701542 -111.87402753882782 -51.901188578223376
+ vertex -149.97246542984465 -111.78202726980844 -52.60000000000011
+ endloop
+endfacet
+facet normal 3.958984754963589e-14 -0.9914448613738105 -0.13052619222005132
+ outer loop
+ vertex -149.97246542984465 -111.87402753882795 -51.90118857822331
+ vertex -149.97246542984465 -111.78202726980844 -52.60000000000011
+ vertex 150.0275345701542 -111.87402753882782 -51.901188578223376
+ endloop
+endfacet
+facet normal -3.9589847549635877e-14 0.9914448613738099 0.1305261922200554
+ outer loop
+ vertex 150.02753457015433 -104.48202726980827 -43.60000000000017
+ vertex -149.9724654298446 -104.48202726980843 -43.6000000000001
+ vertex 150.0275345701543 -104.51610144351919 -43.34118095489766
+ endloop
+endfacet
+facet normal -3.9589847549635877e-14 0.9914448613738099 0.1305261922200554
+ outer loop
+ vertex -149.97246542984453 -104.51610144351935 -43.34118095489759
+ vertex 150.0275345701543 -104.51610144351919 -43.34118095489766
+ vertex -149.9724654298446 -104.48202726980843 -43.6000000000001
+ endloop
+endfacet
+facet normal 4.349252002405375e-15 -0.7933533402912247 -0.6087614290087344
+ outer loop
+ vertex 150.0275345701543 -105.29638662375316 -44.00000000000015
+ vertex 150.0275345701543 -105.5506564199098 -43.66862915010168
+ vertex -149.97246542984453 -105.29638662375332 -44.00000000000006
+ endloop
+endfacet
+facet normal 4.349252002405375e-15 -0.7933533402912247 -0.6087614290087344
+ outer loop
+ vertex -149.97246542984442 -105.55065641990996 -43.66862915010159
+ vertex -149.97246542984453 -105.29638662375332 -44.00000000000006
+ vertex 150.0275345701543 -105.5506564199098 -43.66862915010168
+ endloop
+endfacet
+facet normal -4.3234471101574915e-14 0.3826834323650997 -0.9238795325112827
+ outer loop
+ vertex 150.02753457015436 -115.83202726980828 -50.2617314097822
+ vertex -149.97246542984445 -115.83202726980844 -50.26173140978212
+ vertex 150.0275345701544 -115.18083869158507 -49.99200026901969
+ endloop
+endfacet
+facet normal -4.3234471101574915e-14 0.3826834323650997 -0.9238795325112827
+ outer loop
+ vertex -149.97246542984445 -115.18083869158525 -49.99200026901961
+ vertex 150.0275345701544 -115.18083869158507 -49.99200026901969
+ vertex -149.97246542984445 -115.83202726980844 -50.26173140978212
+ endloop
+endfacet
+facet normal 1.7766793987718918e-14 0.38268343236510816 0.9238795325112792
+ outer loop
+ vertex 150.02753457015427 -107.48202726980827 -46.18564064605529
+ vertex 150.02753457015424 -107.0961377419723 -46.345481322062696
+ vertex -149.97246542984453 -107.4820272698084 -46.18564064605519
+ endloop
+endfacet
+facet normal 1.7766793987718918e-14 0.38268343236510816 0.9238795325112792
+ outer loop
+ vertex -149.9724654298445 -107.09613774197244 -46.345481322062604
+ vertex -149.97246542984453 -107.4820272698084 -46.18564064605519
+ vertex 150.02753457015424 -107.0961377419723 -46.345481322062696
+ endloop
+endfacet
+facet normal 4.052790633779115e-14 -0.13052619222006184 0.9914448613738092
+ outer loop
+ vertex 150.02753457015422 -106.68202726980827 -46.40000000000017
+ vertex 150.02753457015422 -106.26791679764423 -46.345481322062675
+ vertex -149.9724654298445 -106.6820272698084 -46.40000000000008
+ endloop
+endfacet
+facet normal 4.052790633779115e-14 -0.13052619222006184 0.9914448613738092
+ outer loop
+ vertex -149.9724654298446 -106.26791679764438 -46.34548132206258
+ vertex -149.9724654298445 -106.6820272698084 -46.40000000000008
+ vertex 150.02753457015422 -106.26791679764423 -46.345481322062675
+ endloop
+endfacet
+facet normal 2.982964513534887e-14 -0.9914448613738115 0.13052619222004383
+ outer loop
+ vertex 150.02753457015427 -105.13654594774574 -45.21411047216418
+ vertex 150.02753457015424 -105.08202726980825 -44.800000000000146
+ vertex -149.97246542984465 -105.13654594774593 -45.214110472164094
+ endloop
+endfacet
+facet normal 2.982964513534887e-14 -0.9914448613738115 0.13052619222004383
+ outer loop
+ vertex -149.97246542984465 -105.08202726980842 -44.80000000000006
+ vertex -149.97246542984465 -105.13654594774593 -45.214110472164094
+ vertex 150.02753457015424 -105.08202726980825 -44.800000000000146
+ endloop
+endfacet
+facet normal -3.958984754963585e-14 0.991444861373809 0.13052619222006184
+ outer loop
+ vertex 150.02753457015436 -108.28202726980828 -44.8000000000002
+ vertex 150.02753457015433 -108.22750859187079 -45.214110472164236
+ vertex -149.97246542984453 -108.28202726980844 -44.800000000000104
+ endloop
+endfacet
+facet normal -3.958984754963585e-14 0.991444861373809 0.13052619222006184
+ outer loop
+ vertex -149.97246542984453 -108.22750859187094 -45.21411047216414
+ vertex -149.97246542984453 -108.28202726980844 -44.800000000000104
+ vertex 150.02753457015433 -108.22750859187079 -45.214110472164236
+ endloop
+endfacet
+facet normal -4.3390061659553855e-14 0.7933533402912334 -0.6087614290087231
+ outer loop
+ vertex 150.0275345701544 -107.81339811970676 -43.668629150101715
+ vertex 150.0275345701544 -108.06766791586337 -44.000000000000185
+ vertex -149.97246542984445 -107.81339811970689 -43.66862915010161
+ endloop
+endfacet
+facet normal -4.3390061659553855e-14 0.7933533402912334 -0.6087614290087231
+ outer loop
+ vertex -149.97246542984436 -108.06766791586355 -44.000000000000085
+ vertex -149.97246542984445 -107.81339811970689 -43.66862915010161
+ vertex 150.0275345701544 -108.06766791586337 -44.000000000000185
+ endloop
+endfacet
+facet normal 2.9829645135349004e-14 -0.9914448613738159 0.13052619222001066
+ outer loop
+ vertex 150.0275345701537 -105.13654594774579 -60.814110472164195
+ vertex 150.02753457015368 -105.0820272698083 -60.40000000000016
+ vertex -149.97246542984513 -105.1365459477459 -60.8141104721641
+ endloop
+endfacet
+facet normal 2.9829645135349004e-14 -0.9914448613738159 0.13052619222001066
+ outer loop
+ vertex -149.97246542984504 -105.08202726980842 -60.40000000000007
+ vertex -149.97246542984513 -105.1365459477459 -60.8141104721641
+ vertex 150.02753457015368 -105.0820272698083 -60.40000000000016
+ endloop
+endfacet
+facet normal 6.223674274449946e-14 -0.6087614290087395 0.7933533402912207
+ outer loop
+ vertex 150.02753457015422 -105.88202726980826 -46.185640646055276
+ vertex 150.02753457015422 -105.5506564199098 -45.93137084989864
+ vertex -149.9724654298446 -105.88202726980843 -46.18564064605519
+ endloop
+endfacet
+facet normal 6.223674274449946e-14 -0.6087614290087395 0.7933533402912207
+ outer loop
+ vertex -149.97246542984465 -105.55065641990993 -45.93137084989855
+ vertex -149.9724654298446 -105.88202726980843 -46.18564064605519
+ vertex 150.02753457015422 -105.5506564199098 -45.93137084989864
+ endloop
+endfacet
+facet normal 3.267361176936335e-14 0.13052619222000883 0.991444861373816
+ outer loop
+ vertex 150.02753457015424 -107.0961377419723 -46.345481322062696
+ vertex 150.02753457015422 -106.68202726980827 -46.40000000000017
+ vertex -149.9724654298445 -107.09613774197244 -46.345481322062604
+ endloop
+endfacet
+facet normal 3.267361176936335e-14 0.13052619222000883 0.991444861373816
+ outer loop
+ vertex -149.9724654298445 -106.6820272698084 -46.40000000000008
+ vertex -149.9724654298445 -107.09613774197244 -46.345481322062604
+ vertex 150.02753457015422 -106.68202726980827 -46.40000000000017
+ endloop
+endfacet
+facet normal 3.958984754963585e-14 -0.991444861373809 -0.13052619222006184
+ outer loop
+ vertex 150.0275345701543 -105.13654594774576 -44.38588952783612
+ vertex -149.9724654298446 -105.1365459477459 -44.38588952783603
+ vertex 150.02753457015424 -105.08202726980825 -44.800000000000146
+ endloop
+endfacet
+facet normal 3.958984754963585e-14 -0.991444861373809 -0.13052619222006184
+ outer loop
+ vertex -149.97246542984465 -105.08202726980842 -44.80000000000006
+ vertex 150.02753457015424 -105.08202726980825 -44.800000000000146
+ vertex -149.9724654298446 -105.1365459477459 -44.38588952783603
+ endloop
+endfacet
+facet normal 2.0206844591292572e-14 0.3826834323650453 0.9238795325113052
+ outer loop
+ vertex 150.0275345701537 -107.48202726980828 -61.78564064605529
+ vertex 150.0275345701537 -107.09613774197227 -61.94548132206268
+ vertex -149.97246542984513 -107.48202726980843 -61.7856406460552
+ endloop
+endfacet
+facet normal 2.0206844591292572e-14 0.3826834323650453 0.9238795325113052
+ outer loop
+ vertex -149.97246542984513 -107.09613774197244 -61.94548132206259
+ vertex -149.97246542984513 -107.48202726980843 -61.7856406460552
+ vertex 150.0275345701537 -107.09613774197227 -61.94548132206268
+ endloop
+endfacet
+facet normal 4.3390061659553855e-14 -0.7933533402912334 0.6087614290087231
+ outer loop
+ vertex 150.02753457015424 -105.29638662375316 -45.60000000000017
+ vertex -149.9724654298446 -105.29638662375329 -45.60000000000008
+ vertex 150.02753457015422 -105.5506564199098 -45.93137084989864
+ endloop
+endfacet
+facet normal 4.3390061659553855e-14 -0.7933533402912334 0.6087614290087231
+ outer loop
+ vertex -149.97246542984465 -105.55065641990993 -45.93137084989855
+ vertex 150.02753457015422 -105.5506564199098 -45.93137084989864
+ vertex -149.9724654298446 -105.29638662375329 -45.60000000000008
+ endloop
+endfacet
+facet normal 3.8509960452410624e-14 -0.7933533402912432 0.6087614290087103
+ outer loop
+ vertex 150.02753457015368 -105.29638662375318 -61.20000000000016
+ vertex -149.97246542984507 -105.29638662375336 -61.20000000000007
+ vertex 150.02753457015368 -105.5506564199098 -61.53137084989863
+ endloop
+endfacet
+facet normal 3.8509960452410624e-14 -0.7933533402912432 0.6087614290087103
+ outer loop
+ vertex -149.9724654298452 -105.55065641990993 -61.531370849898536
+ vertex 150.02753457015368 -105.5506564199098 -61.53137084989863
+ vertex -149.97246542984507 -105.29638662375336 -61.20000000000007
+ endloop
+endfacet
+facet normal -3.958984754963585e-14 0.991444861373809 0.13052619222006184
+ outer loop
+ vertex 150.0275345701538 -108.28202726980827 -60.40000000000018
+ vertex 150.0275345701538 -108.22750859187082 -60.81411047216422
+ vertex -149.97246542984496 -108.28202726980844 -60.40000000000009
+ endloop
+endfacet
+facet normal -3.958984754963585e-14 0.991444861373809 0.13052619222006184
+ outer loop
+ vertex -149.97246542984504 -108.22750859187093 -60.814110472164124
+ vertex -149.97246542984496 -108.28202726980844 -60.40000000000009
+ vertex 150.0275345701538 -108.22750859187082 -60.81411047216422
+ endloop
+endfacet
+facet normal 4.567452170514696e-14 -0.3826834323651088 0.9238795325112789
+ outer loop
+ vertex 150.02753457015365 -106.26791679764423 -61.94548132206268
+ vertex 150.02753457015368 -105.88202726980826 -61.78564064605527
+ vertex -149.97246542984522 -106.26791679764439 -61.94548132206259
+ endloop
+endfacet
+facet normal 4.567452170514696e-14 -0.3826834323651088 0.9238795325112789
+ outer loop
+ vertex -149.9724654298452 -105.88202726980843 -61.78564064605518
+ vertex -149.97246542984522 -106.26791679764439 -61.94548132206259
+ vertex 150.02753457015368 -105.88202726980826 -61.78564064605527
+ endloop
+endfacet
+facet normal 4.7317208943768036e-14 -0.9238795325112781 0.38268343236511065
+ outer loop
+ vertex 150.0275345701537 -105.13654594774579 -60.814110472164195
+ vertex -149.97246542984513 -105.1365459477459 -60.8141104721641
+ vertex 150.02753457015368 -105.29638662375318 -61.20000000000016
+ endloop
+endfacet
+facet normal 4.7317208943768036e-14 -0.9238795325112781 0.38268343236511065
+ outer loop
+ vertex -149.97246542984507 -105.29638662375336 -61.20000000000007
+ vertex 150.02753457015368 -105.29638662375318 -61.20000000000016
+ vertex -149.97246542984513 -105.1365459477459 -60.8141104721641
+ endloop
+endfacet
+facet normal 4.811457230871726e-14 -0.38268343236506036 0.923879532511299
+ outer loop
+ vertex 150.02753457015422 -106.26791679764423 -46.345481322062675
+ vertex 150.02753457015422 -105.88202726980826 -46.185640646055276
+ vertex -149.9724654298446 -106.26791679764438 -46.34548132206258
+ endloop
+endfacet
+facet normal 4.811457230871726e-14 -0.38268343236506036 0.923879532511299
+ outer loop
+ vertex -149.9724654298446 -105.88202726980843 -46.18564064605519
+ vertex -149.9724654298446 -106.26791679764438 -46.34548132206258
+ vertex 150.02753457015422 -105.88202726980826 -46.185640646055276
+ endloop
+endfacet
+facet normal 1.584487656979815e-14 0.6087614290087004 0.7933533402912507
+ outer loop
+ vertex 150.0275345701543 -107.81339811970673 -45.93137084989868
+ vertex 150.02753457015427 -107.48202726980827 -46.18564064605529
+ vertex -149.97246542984453 -107.81339811970692 -45.93137084989857
+ endloop
+endfacet
+facet normal 1.584487656979815e-14 0.6087614290087004 0.7933533402912507
+ outer loop
+ vertex -149.97246542984453 -107.4820272698084 -46.18564064605519
+ vertex -149.97246542984453 -107.81339811970692 -45.93137084989857
+ vertex 150.02753457015427 -107.48202726980827 -46.18564064605529
+ endloop
+endfacet
+facet normal 3.958984754963585e-14 -0.991444861373809 -0.13052619222006184
+ outer loop
+ vertex 150.02753457015373 -105.13654594774579 -59.98588952783613
+ vertex -149.97246542984513 -105.13654594774594 -59.98588952783604
+ vertex 150.02753457015368 -105.0820272698083 -60.40000000000016
+ endloop
+endfacet
+facet normal 3.958984754963585e-14 -0.991444861373809 -0.13052619222006184
+ outer loop
+ vertex -149.97246542984504 -105.08202726980842 -60.40000000000007
+ vertex 150.02753457015368 -105.0820272698083 -60.40000000000016
+ vertex -149.97246542984513 -105.13654594774594 -59.98588952783604
+ endloop
+endfacet
+facet normal 6.084674155510805e-15 0.6087614290087102 0.7933533402912432
+ outer loop
+ vertex 150.02753457015373 -107.81339811970676 -61.53137084989868
+ vertex 150.0275345701537 -107.48202726980828 -61.78564064605529
+ vertex -149.97246542984513 -107.81339811970692 -61.531370849898586
+ endloop
+endfacet
+facet normal 6.084674155510805e-15 0.6087614290087102 0.7933533402912432
+ outer loop
+ vertex -149.97246542984513 -107.48202726980843 -61.7856406460552
+ vertex -149.97246542984513 -107.81339811970692 -61.531370849898586
+ vertex 150.0275345701537 -107.48202726980828 -61.78564064605529
+ endloop
+endfacet
+facet normal -2.7796804115194528e-14 0.9238795325112981 0.38268343236506286
+ outer loop
+ vertex 150.0275345701538 -108.22750859187082 -60.81411047216422
+ vertex 150.0275345701538 -108.0676679158634 -61.20000000000018
+ vertex -149.97246542984504 -108.22750859187093 -60.814110472164124
+ endloop
+endfacet
+facet normal -2.7796804115194528e-14 0.9238795325112981 0.38268343236506286
+ outer loop
+ vertex -149.972465429845 -108.06766791586358 -61.20000000000009
+ vertex -149.97246542984504 -108.22750859187093 -60.814110472164124
+ vertex 150.0275345701538 -108.0676679158634 -61.20000000000018
+ endloop
+endfacet
+facet normal -2.982964513534887e-14 0.9914448613738116 -0.13052619222004347
+ outer loop
+ vertex 150.02753457015436 -108.28202726980828 -44.8000000000002
+ vertex -149.97246542984453 -108.28202726980844 -44.800000000000104
+ vertex 150.02753457015436 -108.22750859187079 -44.38588952783615
+ endloop
+endfacet
+facet normal -2.982964513534887e-14 0.9914448613738116 -0.13052619222004347
+ outer loop
+ vertex -149.9724654298445 -108.22750859187097 -44.38588952783605
+ vertex 150.02753457015436 -108.22750859187079 -44.38588952783615
+ vertex -149.97246542984453 -108.28202726980844 -44.800000000000104
+ endloop
+endfacet
+facet normal -2.779680411519409e-14 0.9238795325112836 0.3826834323650974
+ outer loop
+ vertex 150.02753457015433 -108.22750859187079 -45.214110472164236
+ vertex 150.02753457015433 -108.06766791586337 -45.60000000000021
+ vertex -149.97246542984453 -108.22750859187094 -45.21411047216414
+ endloop
+endfacet
+facet normal -2.779680411519409e-14 0.9238795325112836 0.3826834323650974
+ outer loop
+ vertex -149.97246542984453 -108.06766791586354 -45.6000000000001
+ vertex -149.97246542984453 -108.22750859187094 -45.21411047216414
+ vertex 150.02753457015433 -108.06766791586337 -45.60000000000021
+ endloop
+endfacet
+facet normal 5.707741135805561e-14 -0.9238795325112955 0.3826834323650685
+ outer loop
+ vertex 150.02753457015427 -105.13654594774574 -45.21411047216418
+ vertex -149.97246542984465 -105.13654594774593 -45.214110472164094
+ vertex 150.02753457015424 -105.29638662375316 -45.60000000000017
+ endloop
+endfacet
+facet normal 5.707741135805561e-14 -0.9238795325112955 0.3826834323650685
+ outer loop
+ vertex -149.9724654298446 -105.29638662375329 -45.60000000000008
+ vertex 150.02753457015424 -105.29638662375316 -45.60000000000017
+ vertex -149.97246542984465 -105.13654594774593 -45.214110472164094
+ endloop
+endfacet
+facet normal 3.145358646757582e-14 0.1305261922200637 0.9914448613738089
+ outer loop
+ vertex 150.0275345701537 -107.09613774197227 -61.94548132206268
+ vertex 150.0275345701537 -106.68202726980827 -62.00000000000018
+ vertex -149.97246542984513 -107.09613774197244 -61.94548132206259
+ endloop
+endfacet
+facet normal 3.145358646757582e-14 0.1305261922200637 0.9914448613738089
+ outer loop
+ vertex -149.97246542984513 -106.6820272698084 -62.00000000000009
+ vertex -149.97246542984513 -107.09613774197244 -61.94548132206259
+ vertex 150.0275345701537 -106.68202726980827 -62.00000000000018
+ endloop
+endfacet
+facet normal 4.052790633779115e-14 -0.13052619222006184 0.9914448613738092
+ outer loop
+ vertex 150.0275345701537 -106.68202726980827 -62.00000000000018
+ vertex 150.02753457015365 -106.26791679764423 -61.94548132206268
+ vertex -149.97246542984513 -106.6820272698084 -62.00000000000009
+ endloop
+endfacet
+facet normal 4.052790633779115e-14 -0.13052619222006184 0.9914448613738092
+ outer loop
+ vertex -149.97246542984522 -106.26791679764439 -61.94548132206259
+ vertex -149.97246542984513 -106.6820272698084 -62.00000000000009
+ vertex 150.02753457015365 -106.26791679764423 -61.94548132206268
+ endloop
+endfacet
+facet normal -4.7317208943768396e-14 0.9238795325112901 -0.3826834323650818
+ outer loop
+ vertex 150.0275345701544 -108.06766791586337 -44.000000000000185
+ vertex 150.02753457015436 -108.22750859187079 -44.38588952783615
+ vertex -149.97246542984436 -108.06766791586355 -44.000000000000085
+ endloop
+endfacet
+facet normal -4.7317208943768396e-14 0.9238795325112901 -0.3826834323650818
+ outer loop
+ vertex -149.9724654298445 -108.22750859187097 -44.38588952783605
+ vertex -149.97246542984436 -108.06766791586355 -44.000000000000085
+ vertex 150.02753457015436 -108.22750859187079 -44.38588952783615
+ endloop
+endfacet
+facet normal -5.247654033021232e-14 0.6087614290087363 -0.7933533402912233
+ outer loop
+ vertex 150.0275345701544 -107.81339811970676 -43.668629150101715
+ vertex -149.97246542984445 -107.81339811970689 -43.66862915010161
+ vertex 150.02753457015442 -107.48202726980827 -43.41435935394507
+ endloop
+endfacet
+facet normal -5.247654033021232e-14 0.6087614290087363 -0.7933533402912233
+ outer loop
+ vertex -149.97246542984445 -107.48202726980843 -43.414359353944974
+ vertex 150.02753457015442 -107.48202726980827 -43.41435935394507
+ vertex -149.97246542984445 -107.81339811970689 -43.66862915010161
+ endloop
+endfacet
+facet normal 5.247654033021249e-14 -0.6087614290087426 0.7933533402912182
+ outer loop
+ vertex 150.02753457015368 -105.88202726980826 -61.78564064605527
+ vertex 150.02753457015368 -105.5506564199098 -61.53137084989863
+ vertex -149.9724654298452 -105.88202726980843 -61.78564064605518
+ endloop
+endfacet
+facet normal 5.247654033021249e-14 -0.6087614290087426 0.7933533402912182
+ outer loop
+ vertex -149.9724654298452 -105.55065641990993 -61.531370849898536
+ vertex -149.9724654298452 -105.88202726980843 -61.78564064605518
+ vertex 150.02753457015368 -105.5506564199098 -61.53137084989863
+ endloop
+endfacet
+facet normal 2.779680411519409e-14 -0.9238795325112836 -0.3826834323650974
+ outer loop
+ vertex 150.0275345701543 -105.13654594774576 -44.38588952783612
+ vertex 150.0275345701543 -105.29638662375316 -44.00000000000015
+ vertex -149.9724654298446 -105.1365459477459 -44.38588952783603
+ endloop
+endfacet
+facet normal 2.779680411519409e-14 -0.9238795325112836 -0.3826834323650974
+ outer loop
+ vertex -149.97246542984453 -105.29638662375332 -44.00000000000006
+ vertex -149.9724654298446 -105.1365459477459 -44.38588952783603
+ vertex 150.0275345701543 -105.29638662375316 -44.00000000000015
+ endloop
+endfacet
+facet normal 2.7796804115194528e-14 -0.9238795325112981 -0.38268343236506286
+ outer loop
+ vertex 150.02753457015373 -105.13654594774579 -59.98588952783613
+ vertex 150.02753457015373 -105.29638662375318 -59.600000000000165
+ vertex -149.97246542984513 -105.13654594774594 -59.98588952783604
+ endloop
+endfacet
+facet normal 2.7796804115194528e-14 -0.9238795325112981 -0.38268343236506286
+ outer loop
+ vertex -149.972465429845 -105.29638662375334 -59.60000000000007
+ vertex -149.97246542984513 -105.13654594774594 -59.98588952783604
+ vertex 150.02753457015373 -105.29638662375318 -59.600000000000165
+ endloop
+endfacet
+facet normal -4.3492520024057834e-15 0.7933533402912383 0.6087614290087168
+ outer loop
+ vertex 150.0275345701538 -108.0676679158634 -61.20000000000018
+ vertex 150.02753457015373 -107.81339811970676 -61.53137084989868
+ vertex -149.972465429845 -108.06766791586358 -61.20000000000009
+ endloop
+endfacet
+facet normal -4.3492520024057834e-15 0.7933533402912383 0.6087614290087168
+ outer loop
+ vertex -149.97246542984513 -107.81339811970692 -61.531370849898586
+ vertex -149.972465429845 -108.06766791586358 -61.20000000000009
+ vertex 150.02753457015373 -107.81339811970676 -61.53137084989868
+ endloop
+endfacet
+facet normal -4.349252002405375e-15 0.7933533402912247 0.6087614290087344
+ outer loop
+ vertex 150.02753457015433 -108.06766791586337 -45.60000000000021
+ vertex 150.0275345701543 -107.81339811970673 -45.93137084989868
+ vertex -149.97246542984453 -108.06766791586354 -45.6000000000001
+ endloop
+endfacet
+facet normal -4.349252002405375e-15 0.7933533402912247 0.6087614290087344
+ outer loop
+ vertex -149.97246542984453 -107.81339811970692 -45.93137084989857
+ vertex -149.97246542984453 -108.06766791586354 -45.6000000000001
+ vertex 150.0275345701543 -107.81339811970673 -45.93137084989868
+ endloop
+endfacet
+facet normal -3.958984754963585e-14 0.991444861373809 0.13052619222006184
+ outer loop
+ vertex 150.02753457015424 -123.82750859187081 -60.81411047216424
+ vertex -149.9724654298446 -123.82750859187097 -60.814110472164145
+ vertex 150.02753457015427 -123.8820272698083 -60.400000000000205
+ endloop
+endfacet
+facet normal -3.958984754963585e-14 0.991444861373809 0.13052619222006184
+ outer loop
+ vertex -149.9724654298445 -123.88202726980843 -60.40000000000011
+ vertex 150.02753457015427 -123.8820272698083 -60.400000000000205
+ vertex -149.9724654298446 -123.82750859187097 -60.814110472164145
+ endloop
+endfacet
+facet normal 5.247654033021232e-14 -0.6087614290087363 0.7933533402912233
+ outer loop
+ vertex 150.02753457015413 -121.48202726980826 -61.78564064605528
+ vertex 150.0275345701541 -121.1506564199098 -61.53137084989864
+ vertex -149.97246542984468 -121.48202726980843 -61.785640646055185
+ endloop
+endfacet
+facet normal 5.247654033021232e-14 -0.6087614290087363 0.7933533402912233
+ outer loop
+ vertex -149.97246542984468 -121.15065641990998 -61.53137084989855
+ vertex -149.97246542984468 -121.48202726980843 -61.785640646055185
+ vertex 150.0275345701541 -121.1506564199098 -61.53137084989864
+ endloop
+endfacet
+facet normal -4.567452170514696e-14 0.3826834323651088 -0.9238795325112789
+ outer loop
+ vertex 150.02753457015385 -107.48202726980831 -59.014359353945075
+ vertex -149.97246542984504 -107.48202726980844 -59.01435935394498
+ vertex 150.0275345701538 -107.09613774197234 -58.854518677937655
+ endloop
+endfacet
+facet normal -4.567452170514696e-14 0.3826834323651088 -0.9238795325112789
+ outer loop
+ vertex -149.97246542984496 -107.09613774197248 -58.85451867793757
+ vertex 150.0275345701538 -107.09613774197234 -58.854518677937655
+ vertex -149.97246542984504 -107.48202726980844 -59.01435935394498
+ endloop
+endfacet
+facet normal -1.2045729483675889e-15 -0.6087614290087001 -0.793353340291251
+ outer loop
+ vertex 150.02753457015424 -121.48202726980831 -59.01435935394506
+ vertex -149.9724654298446 -121.48202726980844 -59.014359353944975
+ vertex 150.02753457015422 -121.15065641990981 -59.26862915010168
+ endloop
+endfacet
+facet normal -1.2045729483675889e-15 -0.6087614290087001 -0.793353340291251
+ outer loop
+ vertex -149.9724654298446 -121.15065641990998 -59.26862915010159
+ vertex 150.02753457015422 -121.15065641990981 -59.26862915010168
+ vertex -149.9724654298446 -121.48202726980844 -59.014359353944975
+ endloop
+endfacet
+facet normal -6.0846741555097804e-15 -0.6087614290087442 -0.7933533402912171
+ outer loop
+ vertex 150.0275345701538 -105.88202726980832 -59.01435935394505
+ vertex -149.97246542984504 -105.8820272698084 -59.01435935394496
+ vertex 150.02753457015373 -105.55065641990981 -59.26862915010169
+ endloop
+endfacet
+facet normal -6.0846741555097804e-15 -0.6087614290087442 -0.7933533402912171
+ outer loop
+ vertex -149.97246542984507 -105.55065641990993 -59.2686291501016
+ vertex 150.02753457015373 -105.55065641990981 -59.26862915010169
+ vertex -149.97246542984504 -105.8820272698084 -59.01435935394496
+ endloop
+endfacet
+facet normal -3.8509960452410624e-14 0.7933533402912432 -0.6087614290087103
+ outer loop
+ vertex 150.02753457015382 -107.81339811970678 -59.26862915010171
+ vertex 150.02753457015382 -108.0676679158634 -59.600000000000186
+ vertex -149.9724654298449 -107.81339811970695 -59.268629150101624
+ endloop
+endfacet
+facet normal -3.8509960452410624e-14 0.7933533402912432 -0.6087614290087103
+ outer loop
+ vertex -149.972465429845 -108.06766791586355 -59.600000000000094
+ vertex -149.9724654298449 -107.81339811970695 -59.268629150101624
+ vertex 150.02753457015382 -108.0676679158634 -59.600000000000186
+ endloop
+endfacet
+facet normal 1.7766793987718918e-14 0.38268343236510816 0.9238795325112792
+ outer loop
+ vertex 150.0275345701542 -123.08202726980828 -61.78564064605529
+ vertex 150.02753457015416 -122.69613774197232 -61.94548132206272
+ vertex -149.97246542984453 -123.08202726980842 -61.785640646055185
+ endloop
+endfacet
+facet normal 1.7766793987718918e-14 0.38268343236510816 0.9238795325112792
+ outer loop
+ vertex -149.97246542984468 -122.69613774197248 -61.945481322062605
+ vertex -149.97246542984453 -123.08202726980842 -61.785640646055185
+ vertex 150.02753457015416 -122.69613774197232 -61.94548132206272
+ endloop
+endfacet
+facet normal -4.349252002405375e-15 0.7933533402912247 0.6087614290087344
+ outer loop
+ vertex 150.02753457015424 -123.66766791586339 -61.2000000000002
+ vertex 150.0275345701542 -123.41339811970676 -61.53137084989868
+ vertex -149.9724654298445 -123.66766791586355 -61.20000000000012
+ endloop
+endfacet
+facet normal -4.349252002405375e-15 0.7933533402912247 0.6087614290087344
+ outer loop
+ vertex -149.97246542984468 -123.41339811970691 -61.53137084989857
+ vertex -149.9724654298445 -123.66766791586355 -61.20000000000012
+ vertex 150.0275345701542 -123.41339811970676 -61.53137084989868
+ endloop
+endfacet
+facet normal 4.811457230871733e-14 -0.3826834323650628 0.923879532511298
+ outer loop
+ vertex 150.0275345701541 -121.86791679764423 -61.945481322062676
+ vertex 150.02753457015413 -121.48202726980826 -61.78564064605528
+ vertex -149.9724654298446 -121.86791679764441 -61.945481322062584
+ endloop
+endfacet
+facet normal 4.811457230871733e-14 -0.3826834323650628 0.923879532511298
+ outer loop
+ vertex -149.97246542984468 -121.48202726980843 -61.785640646055185
+ vertex -149.9724654298446 -121.86791679764441 -61.945481322062584
+ vertex 150.02753457015413 -121.48202726980826 -61.78564064605528
+ endloop
+endfacet
+facet normal -3.267361176936191e-14 -0.13052619222005668 -0.9914448613738097
+ outer loop
+ vertex 150.0275345701538 -106.68202726980832 -58.80000000000016
+ vertex -149.97246542984507 -106.68202726980849 -58.800000000000075
+ vertex 150.0275345701538 -106.26791679764426 -58.854518677937655
+ endloop
+endfacet
+facet normal -3.267361176936191e-14 -0.13052619222005668 -0.9914448613738097
+ outer loop
+ vertex -149.97246542984504 -106.26791679764439 -58.85451867793757
+ vertex 150.0275345701538 -106.26791679764426 -58.854518677937655
+ vertex -149.97246542984507 -106.68202726980849 -58.800000000000075
+ endloop
+endfacet
+facet normal 4.3390061659553855e-14 -0.7933533402912334 0.6087614290087231
+ outer loop
+ vertex 150.02753457015413 -120.89638662375316 -61.20000000000017
+ vertex -149.9724654298446 -120.89638662375336 -61.20000000000008
+ vertex 150.0275345701541 -121.1506564199098 -61.53137084989864
+ endloop
+endfacet
+facet normal 4.3390061659553855e-14 -0.7933533402912334 0.6087614290087231
+ outer loop
+ vertex -149.97246542984468 -121.15065641990998 -61.53137084989855
+ vertex 150.0275345701541 -121.1506564199098 -61.53137084989864
+ vertex -149.9724654298446 -120.89638662375336 -61.20000000000008
+ endloop
+endfacet
+facet normal 4.7317208943768396e-14 -0.9238795325112901 0.3826834323650818
+ outer loop
+ vertex 150.02753457015416 -120.73654594774578 -60.8141104721642
+ vertex -149.97246542984468 -120.7365459477459 -60.81411047216411
+ vertex 150.02753457015413 -120.89638662375316 -61.20000000000017
+ endloop
+endfacet
+facet normal 4.7317208943768396e-14 -0.9238795325112901 0.3826834323650818
+ outer loop
+ vertex -149.9724654298446 -120.89638662375336 -61.20000000000008
+ vertex 150.02753457015413 -120.89638662375316 -61.20000000000017
+ vertex -149.97246542984468 -120.7365459477459 -60.81411047216411
+ endloop
+endfacet
+facet normal 2.982964513534887e-14 -0.9914448613738116 0.13052619222004347
+ outer loop
+ vertex 150.02753457015416 -120.73654594774578 -60.8141104721642
+ vertex 150.0275345701542 -120.68202726980826 -60.40000000000015
+ vertex -149.97246542984468 -120.7365459477459 -60.81411047216411
+ endloop
+endfacet
+facet normal 2.982964513534887e-14 -0.9914448613738116 0.13052619222004347
+ outer loop
+ vertex -149.9724654298446 -120.68202726980842 -60.400000000000055
+ vertex -149.97246542984468 -120.7365459477459 -60.81411047216411
+ vertex 150.0275345701542 -120.68202726980826 -60.40000000000015
+ endloop
+endfacet
+facet normal 4.349252002405179e-15 -0.7933533402912183 -0.6087614290087429
+ outer loop
+ vertex 150.02753457015373 -105.29638662375318 -59.600000000000165
+ vertex 150.02753457015373 -105.55065641990981 -59.26862915010169
+ vertex -149.972465429845 -105.29638662375334 -59.60000000000007
+ endloop
+endfacet
+facet normal 4.349252002405179e-15 -0.7933533402912183 -0.6087614290087429
+ outer loop
+ vertex -149.97246542984507 -105.55065641990993 -59.2686291501016
+ vertex -149.972465429845 -105.29638662375334 -59.60000000000007
+ vertex 150.02753457015373 -105.55065641990981 -59.26862915010169
+ endloop
+endfacet
+facet normal -2.9829645135349004e-14 0.9914448613738159 -0.13052619222001066
+ outer loop
+ vertex 150.02753457015382 -108.22750859187082 -59.98588952783615
+ vertex 150.0275345701538 -108.28202726980827 -60.40000000000018
+ vertex -149.97246542984507 -108.22750859187097 -59.98588952783606
+ endloop
+endfacet
+facet normal -2.9829645135349004e-14 0.9914448613738159 -0.13052619222001066
+ outer loop
+ vertex -149.97246542984496 -108.28202726980844 -60.40000000000009
+ vertex -149.97246542984507 -108.22750859187097 -59.98588952783606
+ vertex 150.0275345701538 -108.28202726980827 -60.40000000000018
+ endloop
+endfacet
+facet normal -4.811457230871726e-14 0.38268343236506036 -0.923879532511299
+ outer loop
+ vertex 150.0275345701543 -123.08202726980831 -59.014359353945075
+ vertex -149.97246542984453 -123.08202726980849 -59.014359353944975
+ vertex 150.0275345701543 -122.69613774197234 -58.85451867793769
+ endloop
+endfacet
+facet normal -4.811457230871726e-14 0.38268343236506036 -0.923879532511299
+ outer loop
+ vertex -149.97246542984453 -122.69613774197249 -58.85451867793758
+ vertex 150.0275345701543 -122.69613774197234 -58.85451867793769
+ vertex -149.97246542984453 -123.08202726980849 -59.014359353944975
+ endloop
+endfacet
+facet normal -4.3390061659553855e-14 0.7933533402912334 -0.6087614290087231
+ outer loop
+ vertex 150.0275345701543 -123.41339811970677 -59.26862915010171
+ vertex 150.0275345701543 -123.66766791586342 -59.600000000000186
+ vertex -149.97246542984445 -123.41339811970691 -59.26862915010161
+ endloop
+endfacet
+facet normal -4.3390061659553855e-14 0.7933533402912334 -0.6087614290087231
+ outer loop
+ vertex -149.97246542984453 -123.66766791586355 -59.600000000000094
+ vertex -149.97246542984445 -123.41339811970691 -59.26862915010161
+ vertex 150.0275345701543 -123.66766791586342 -59.600000000000186
+ endloop
+endfacet
+facet normal 4.1747931639577e-14 -0.13052619222006093 0.9914448613738092
+ outer loop
+ vertex 150.0275345701542 -122.28202726980828 -62.00000000000017
+ vertex 150.0275345701541 -121.86791679764423 -61.945481322062676
+ vertex -149.97246542984468 -122.28202726980847 -62.00000000000008
+ endloop
+endfacet
+facet normal 4.1747931639577e-14 -0.13052619222006093 0.9914448613738092
+ outer loop
+ vertex -149.9724654298446 -121.86791679764441 -61.945481322062584
+ vertex -149.97246542984468 -122.28202726980847 -62.00000000000008
+ vertex 150.0275345701541 -121.86791679764423 -61.945481322062676
+ endloop
+endfacet
+facet normal 4.349252002405375e-15 -0.7933533402912247 -0.6087614290087344
+ outer loop
+ vertex 150.02753457015422 -120.8963866237532 -59.60000000000015
+ vertex 150.02753457015422 -121.15065641990981 -59.26862915010168
+ vertex -149.97246542984465 -120.89638662375333 -59.60000000000006
+ endloop
+endfacet
+facet normal 4.349252002405375e-15 -0.7933533402912247 -0.6087614290087344
+ outer loop
+ vertex -149.9724654298446 -121.15065641990998 -59.26862915010159
+ vertex -149.97246542984465 -120.89638662375333 -59.60000000000006
+ vertex 150.02753457015422 -121.15065641990981 -59.26862915010168
+ endloop
+endfacet
+facet normal -6.223674274449946e-14 0.6087614290087395 -0.7933533402912207
+ outer loop
+ vertex 150.0275345701543 -123.41339811970677 -59.26862915010171
+ vertex -149.97246542984445 -123.41339811970691 -59.26862915010161
+ vertex 150.0275345701543 -123.08202726980831 -59.014359353945075
+ endloop
+endfacet
+facet normal -6.223674274449946e-14 0.6087614290087395 -0.7933533402912207
+ outer loop
+ vertex -149.97246542984453 -123.08202726980849 -59.014359353944975
+ vertex 150.0275345701543 -123.08202726980831 -59.014359353945075
+ vertex -149.97246542984445 -123.41339811970691 -59.26862915010161
+ endloop
+endfacet
+facet normal -2.2646895194863756e-14 -0.38268343236506447 -0.9238795325112973
+ outer loop
+ vertex 150.0275345701538 -106.26791679764426 -58.854518677937655
+ vertex -149.97246542984504 -106.26791679764439 -58.85451867793757
+ vertex 150.0275345701538 -105.88202726980832 -59.01435935394505
+ endloop
+endfacet
+facet normal -2.2646895194863756e-14 -0.38268343236506447 -0.9238795325112973
+ outer loop
+ vertex -149.97246542984504 -105.8820272698084 -59.01435935394496
+ vertex 150.0275345701538 -105.88202726980832 -59.01435935394505
+ vertex -149.97246542984504 -106.26791679764439 -58.85451867793757
+ endloop
+endfacet
+facet normal -5.247654033021249e-14 0.6087614290087426 -0.7933533402912182
+ outer loop
+ vertex 150.02753457015382 -107.81339811970678 -59.26862915010171
+ vertex -149.9724654298449 -107.81339811970695 -59.268629150101624
+ vertex 150.02753457015385 -107.48202726980831 -59.014359353945075
+ endloop
+endfacet
+facet normal -5.247654033021249e-14 0.6087614290087426 -0.7933533402912182
+ outer loop
+ vertex -149.97246542984504 -107.48202726980844 -59.01435935394498
+ vertex 150.02753457015385 -107.48202726980831 -59.014359353945075
+ vertex -149.9724654298449 -107.81339811970695 -59.268629150101624
+ endloop
+endfacet
+facet normal -2.779680411519409e-14 0.9238795325112836 0.3826834323650974
+ outer loop
+ vertex 150.02753457015424 -123.82750859187081 -60.81411047216424
+ vertex 150.02753457015424 -123.66766791586339 -61.2000000000002
+ vertex -149.9724654298446 -123.82750859187097 -60.814110472164145
+ endloop
+endfacet
+facet normal -2.779680411519409e-14 0.9238795325112836 0.3826834323650974
+ outer loop
+ vertex -149.9724654298445 -123.66766791586355 -61.20000000000012
+ vertex -149.9724654298446 -123.82750859187097 -60.814110472164145
+ vertex 150.02753457015424 -123.66766791586339 -61.2000000000002
+ endloop
+endfacet
+facet normal 3.958984754963585e-14 -0.991444861373809 -0.13052619222006184
+ outer loop
+ vertex 150.0275345701542 -120.68202726980826 -60.40000000000015
+ vertex 150.0275345701542 -120.73654594774575 -59.985889527836115
+ vertex -149.9724654298446 -120.68202726980842 -60.400000000000055
+ endloop
+endfacet
+facet normal 3.958984754963585e-14 -0.991444861373809 -0.13052619222006184
+ outer loop
+ vertex -149.97246542984465 -120.73654594774592 -59.98588952783603
+ vertex -149.9724654298446 -120.68202726980842 -60.400000000000055
+ vertex 150.0275345701542 -120.73654594774575 -59.985889527836115
+ endloop
+endfacet
+facet normal 1.584487656979815e-14 0.6087614290087004 0.7933533402912507
+ outer loop
+ vertex 150.0275345701542 -123.41339811970676 -61.53137084989868
+ vertex 150.0275345701542 -123.08202726980828 -61.78564064605529
+ vertex -149.97246542984468 -123.41339811970691 -61.53137084989857
+ endloop
+endfacet
+facet normal 1.584487656979815e-14 0.6087614290087004 0.7933533402912507
+ outer loop
+ vertex -149.97246542984453 -123.08202726980842 -61.785640646055185
+ vertex -149.97246542984468 -123.41339811970691 -61.53137084989857
+ vertex 150.0275345701542 -123.08202726980828 -61.78564064605529
+ endloop
+endfacet
+facet normal -4.052790633779115e-14 0.13052619222006184 -0.9914448613738092
+ outer loop
+ vertex 150.0275345701543 -122.69613774197234 -58.85451867793769
+ vertex -149.97246542984453 -122.69613774197249 -58.85451867793758
+ vertex 150.02753457015427 -122.28202726980831 -58.800000000000175
+ endloop
+endfacet
+facet normal -4.052790633779115e-14 0.13052619222006184 -0.9914448613738092
+ outer loop
+ vertex -149.97246542984453 -122.28202726980847 -58.80000000000008
+ vertex 150.02753457015427 -122.28202726980831 -58.800000000000175
+ vertex -149.97246542984453 -122.69613774197249 -58.85451867793758
+ endloop
+endfacet
+facet normal -2.982964513534887e-14 0.9914448613738116 -0.130526192220043
+ outer loop
+ vertex 150.02753457015427 -123.82750859187081 -59.98588952783617
+ vertex 150.02753457015427 -123.8820272698083 -60.400000000000205
+ vertex -149.97246542984453 -123.82750859187094 -59.985889527836086
+ endloop
+endfacet
+facet normal -2.982964513534887e-14 0.9914448613738116 -0.130526192220043
+ outer loop
+ vertex -149.9724654298445 -123.88202726980843 -60.40000000000011
+ vertex -149.97246542984453 -123.82750859187094 -59.985889527836086
+ vertex 150.02753457015427 -123.8820272698083 -60.400000000000205
+ endloop
+endfacet
+facet normal -4.7317208943768036e-14 0.9238795325112781 -0.38268343236511065
+ outer loop
+ vertex 150.02753457015382 -108.22750859187082 -59.98588952783615
+ vertex -149.97246542984507 -108.22750859187097 -59.98588952783606
+ vertex 150.02753457015382 -108.0676679158634 -59.600000000000186
+ endloop
+endfacet
+facet normal -4.7317208943768036e-14 0.9238795325112781 -0.38268343236511065
+ outer loop
+ vertex -149.972465429845 -108.06766791586355 -59.600000000000094
+ vertex 150.02753457015382 -108.0676679158634 -59.600000000000186
+ vertex -149.97246542984507 -108.22750859187097 -59.98588952783606
+ endloop
+endfacet
+facet normal 3.145358646757744e-14 0.1305261922200097 0.9914448613738159
+ outer loop
+ vertex 150.02753457015416 -122.69613774197232 -61.94548132206272
+ vertex 150.0275345701542 -122.28202726980828 -62.00000000000017
+ vertex -149.97246542984468 -122.69613774197248 -61.945481322062605
+ endloop
+endfacet
+facet normal 3.145358646757744e-14 0.1305261922200097 0.9914448613738159
+ outer loop
+ vertex -149.97246542984468 -122.28202726980847 -62.00000000000008
+ vertex -149.97246542984468 -122.69613774197248 -61.945481322062605
+ vertex 150.0275345701542 -122.28202726980828 -62.00000000000017
+ endloop
+endfacet
+facet normal -5.707741135805561e-14 0.9238795325112955 -0.3826834323650685
+ outer loop
+ vertex 150.0275345701543 -123.66766791586342 -59.600000000000186
+ vertex 150.02753457015427 -123.82750859187081 -59.98588952783617
+ vertex -149.97246542984453 -123.66766791586355 -59.600000000000094
+ endloop
+endfacet
+facet normal -5.707741135805561e-14 0.9238795325112955 -0.3826834323650685
+ outer loop
+ vertex -149.97246542984453 -123.82750859187094 -59.985889527836086
+ vertex -149.97246542984453 -123.66766791586355 -59.600000000000094
+ vertex 150.02753457015427 -123.82750859187081 -59.98588952783617
+ endloop
+endfacet
+facet normal 2.779680411519409e-14 -0.9238795325112836 -0.3826834323650974
+ outer loop
+ vertex 150.0275345701542 -120.73654594774575 -59.985889527836115
+ vertex 150.02753457015422 -120.8963866237532 -59.60000000000015
+ vertex -149.97246542984465 -120.73654594774592 -59.98588952783603
+ endloop
+endfacet
+facet normal 2.779680411519409e-14 -0.9238795325112836 -0.3826834323650974
+ outer loop
+ vertex -149.97246542984465 -120.89638662375333 -59.60000000000006
+ vertex -149.97246542984465 -120.73654594774592 -59.98588952783603
+ vertex 150.02753457015422 -120.8963866237532 -59.60000000000015
+ endloop
+endfacet
+facet normal -4.052790633779115e-14 0.13052619222006184 -0.9914448613738092
+ outer loop
+ vertex 150.0275345701538 -107.09613774197234 -58.854518677937655
+ vertex -149.97246542984496 -107.09613774197248 -58.85451867793757
+ vertex 150.0275345701538 -106.68202726980832 -58.80000000000016
+ endloop
+endfacet
+facet normal -4.052790633779115e-14 0.13052619222006184 -0.9914448613738092
+ outer loop
+ vertex -149.97246542984507 -106.68202726980849 -58.800000000000075
+ vertex 150.0275345701538 -106.68202726980832 -58.80000000000016
+ vertex -149.97246542984496 -107.09613774197248 -58.85451867793757
+ endloop
+endfacet
+facet normal 4.7317208943768036e-14 -0.9238795325112781 0.38268343236511065
+ outer loop
+ vertex 150.02753457015473 -120.8963866237532 -45.60000000000019
+ vertex 150.02753457015473 -120.73654594774578 -45.21411047216423
+ vertex -149.97246542984414 -120.89638662375333 -45.6000000000001
+ endloop
+endfacet
+facet normal 4.7317208943768036e-14 -0.9238795325112781 0.38268343236511065
+ outer loop
+ vertex -149.97246542984414 -120.73654594774592 -45.21411047216414
+ vertex -149.97246542984414 -120.89638662375333 -45.6000000000001
+ vertex 150.02753457015473 -120.73654594774578 -45.21411047216423
+ endloop
+endfacet
+facet normal 2.9829645135349004e-14 -0.9914448613738159 0.13052619222001066
+ outer loop
+ vertex 150.02753457015473 -120.73654594774578 -45.21411047216423
+ vertex 150.02753457015476 -120.68202726980829 -44.800000000000196
+ vertex -149.97246542984414 -120.73654594774592 -45.21411047216414
+ endloop
+endfacet
+facet normal 2.9829645135349004e-14 -0.9914448613738159 0.13052619222001066
+ outer loop
+ vertex -149.9724654298441 -120.68202726980842 -44.800000000000104
+ vertex -149.97246542984414 -120.73654594774592 -45.21411047216414
+ vertex 150.02753457015476 -120.68202726980829 -44.800000000000196
+ endloop
+endfacet
+facet normal 2.7796804115194528e-14 -0.9238795325112981 -0.38268343236506286
+ outer loop
+ vertex 150.02753457015476 -120.73654594774578 -44.38588952783616
+ vertex 150.02753457015476 -120.89638662375317 -44.0000000000002
+ vertex -149.9724654298441 -120.73654594774594 -44.38588952783607
+ endloop
+endfacet
+facet normal 2.7796804115194528e-14 -0.9238795325112981 -0.38268343236506286
+ outer loop
+ vertex -149.9724654298441 -120.89638662375336 -44.00000000000011
+ vertex -149.9724654298441 -120.73654594774594 -44.38588952783607
+ vertex 150.02753457015476 -120.89638662375317 -44.0000000000002
+ endloop
+endfacet
+facet normal 3.958984754963585e-14 -0.991444861373809 -0.13052619222006184
+ outer loop
+ vertex 150.02753457015476 -120.68202726980829 -44.800000000000196
+ vertex 150.02753457015476 -120.73654594774578 -44.38588952783616
+ vertex -149.9724654298441 -120.68202726980842 -44.800000000000104
+ endloop
+endfacet
+facet normal 3.958984754963585e-14 -0.991444861373809 -0.13052619222006184
+ outer loop
+ vertex -149.9724654298441 -120.73654594774594 -44.38588952783607
+ vertex -149.9724654298441 -120.68202726980842 -44.800000000000104
+ vertex 150.02753457015476 -120.73654594774578 -44.38588952783616
+ endloop
+endfacet
+facet normal -3.267361176936335e-14 -0.13052619222000883 -0.991444861373816
+ outer loop
+ vertex 150.02753457015427 -122.28202726980831 -58.800000000000175
+ vertex -149.97246542984453 -122.28202726980847 -58.80000000000008
+ vertex 150.02753457015424 -121.86791679764426 -58.85451867793765
+ endloop
+endfacet
+facet normal -3.267361176936335e-14 -0.13052619222000883 -0.991444861373816
+ outer loop
+ vertex -149.97246542984465 -121.86791679764443 -58.854518677937556
+ vertex 150.02753457015424 -121.86791679764426 -58.85451867793765
+ vertex -149.97246542984453 -122.28202726980847 -58.80000000000008
+ endloop
+endfacet
+facet normal -3.145358646757582e-14 -0.1305261922200637 -0.9914448613738089
+ outer loop
+ vertex 150.02753457015484 -122.28202726980831 -43.20000000000018
+ vertex -149.97246542984405 -122.28202726980848 -43.20000000000011
+ vertex 150.02753457015478 -121.8679167976443 -43.254518677937675
+ endloop
+endfacet
+facet normal -3.145358646757582e-14 -0.1305261922200637 -0.9914448613738089
+ outer loop
+ vertex -149.972465429844 -121.86791679764443 -43.254518677937604
+ vertex 150.02753457015478 -121.8679167976443 -43.254518677937675
+ vertex -149.97246542984405 -122.28202726980848 -43.20000000000011
+ endloop
+endfacet
+facet normal -2.982964513534901e-14 0.9914448613738158 -0.1305261922200104
+ outer loop
+ vertex 150.02753457015487 -123.82750859187081 -44.38588952783617
+ vertex 150.0275345701548 -123.88202726980828 -44.8000000000002
+ vertex -149.972465429844 -123.82750859187097 -44.38588952783608
+ endloop
+endfacet
+facet normal -2.982964513534901e-14 0.9914448613738158 -0.1305261922200104
+ outer loop
+ vertex -149.9724654298439 -123.88202726980846 -44.80000000000011
+ vertex -149.972465429844 -123.82750859187097 -44.38588952783608
+ vertex 150.0275345701548 -123.88202726980828 -44.8000000000002
+ endloop
+endfacet
+facet normal 5.30849204738355e-16 0.793353340291218 0.6087614290087431
+ outer loop
+ vertex 150.0275345701548 -123.66766791586339 -45.6000000000002
+ vertex 150.02753457015476 -123.41339811970676 -45.93137084989867
+ vertex -149.97246542984396 -123.66766791586357 -45.60000000000011
+ endloop
+endfacet
+facet normal 5.30849204738355e-16 0.793353340291218 0.6087614290087431
+ outer loop
+ vertex -149.97246542984405 -123.41339811970691 -45.93137084989858
+ vertex -149.97246542984396 -123.66766791586357 -45.60000000000011
+ vertex 150.02753457015476 -123.41339811970676 -45.93137084989867
+ endloop
+endfacet
+facet normal -2.0206844591292572e-14 -0.3826834323650453 -0.9238795325113052
+ outer loop
+ vertex 150.02753457015478 -121.8679167976443 -43.254518677937675
+ vertex -149.972465429844 -121.86791679764443 -43.254518677937604
+ vertex 150.0275345701548 -121.48202726980828 -43.41435935394508
+ endloop
+endfacet
+facet normal -2.0206844591292572e-14 -0.3826834323650453 -0.9238795325113052
+ outer loop
+ vertex -149.97246542984405 -121.48202726980844 -43.414359353944995
+ vertex 150.0275345701548 -121.48202726980828 -43.41435935394508
+ vertex -149.972465429844 -121.86791679764443 -43.254518677937604
+ endloop
+endfacet
+facet normal 6.0846741555097804e-15 0.6087614290087442 0.7933533402912171
+ outer loop
+ vertex 150.02753457015476 -123.41339811970676 -45.93137084989867
+ vertex 150.02753457015476 -123.08202726980828 -46.185640646055305
+ vertex -149.97246542984405 -123.41339811970691 -45.93137084989858
+ endloop
+endfacet
+facet normal 6.0846741555097804e-15 0.6087614290087442 0.7933533402912171
+ outer loop
+ vertex -149.97246542984414 -123.08202726980846 -46.18564064605523
+ vertex -149.97246542984405 -123.41339811970691 -45.93137084989858
+ vertex 150.02753457015476 -123.08202726980828 -46.185640646055305
+ endloop
+endfacet
+facet normal -5.247654033021147e-14 0.6087614290087087 -0.7933533402912443
+ outer loop
+ vertex 150.02753457015487 -123.41339811970677 -43.66862915010171
+ vertex -149.9724654298439 -123.41339811970694 -43.668629150101616
+ vertex 150.02753457015487 -123.08202726980832 -43.414359353945095
+ endloop
+endfacet
+facet normal -5.247654033021147e-14 0.6087614290087087 -0.7933533402912443
+ outer loop
+ vertex -149.97246542984405 -123.08202726980846 -43.414359353945
+ vertex 150.02753457015487 -123.08202726980832 -43.414359353945095
+ vertex -149.9724654298439 -123.41339811970694 -43.668629150101616
+ endloop
+endfacet
+facet normal 3.267361176936191e-14 0.13052619222005668 0.9914448613738097
+ outer loop
+ vertex 150.0275345701547 -122.69613774197232 -46.3454813220627
+ vertex 150.02753457015467 -122.28202726980827 -46.4000000000002
+ vertex -149.972465429844 -122.69613774197249 -46.345481322062625
+ endloop
+endfacet
+facet normal 3.267361176936191e-14 0.13052619222005668 0.9914448613738097
+ outer loop
+ vertex -149.972465429844 -122.2820272698084 -46.40000000000013
+ vertex -149.972465429844 -122.69613774197249 -46.345481322062625
+ vertex 150.02753457015467 -122.28202726980827 -46.4000000000002
+ endloop
+endfacet
+facet normal 5.247654033021249e-14 -0.6087614290087426 0.7933533402912182
+ outer loop
+ vertex 150.02753457015467 -121.48202726980828 -46.1856406460553
+ vertex 150.0275345701547 -121.1506564199098 -45.931370849898656
+ vertex -149.9724654298442 -121.48202726980843 -46.18564064605521
+ endloop
+endfacet
+facet normal 5.247654033021249e-14 -0.6087614290087426 0.7933533402912182
+ outer loop
+ vertex -149.97246542984414 -121.15065641990998 -45.93137084989857
+ vertex -149.9724654298442 -121.48202726980843 -46.18564064605521
+ vertex 150.0275345701547 -121.1506564199098 -45.931370849898656
+ endloop
+endfacet
+facet normal 3.8509960452410624e-14 -0.7933533402912432 0.6087614290087103
+ outer loop
+ vertex 150.02753457015473 -120.8963866237532 -45.60000000000019
+ vertex -149.97246542984414 -120.89638662375333 -45.6000000000001
+ vertex 150.0275345701547 -121.1506564199098 -45.931370849898656
+ endloop
+endfacet
+facet normal 3.8509960452410624e-14 -0.7933533402912432 0.6087614290087103
+ outer loop
+ vertex -149.97246542984414 -121.15065641990998 -45.93137084989857
+ vertex 150.0275345701547 -121.1506564199098 -45.931370849898656
+ vertex -149.97246542984414 -120.89638662375333 -45.6000000000001
+ endloop
+endfacet
+facet normal -5.31502640738418e-14 0.7933533402912631 -0.6087614290086841
+ outer loop
+ vertex 150.02753457015487 -123.41339811970677 -43.66862915010171
+ vertex 150.02753457015484 -123.66766791586342 -44.0000000000002
+ vertex -149.9724654298439 -123.41339811970694 -43.668629150101616
+ endloop
+endfacet
+facet normal -5.31502640738418e-14 0.7933533402912631 -0.6087614290086841
+ outer loop
+ vertex -149.9724654298439 -123.66766791586357 -44.000000000000114
+ vertex -149.9724654298439 -123.41339811970694 -43.668629150101616
+ vertex 150.02753457015484 -123.66766791586342 -44.0000000000002
+ endloop
+endfacet
+facet normal -4.5674521705146963e-14 0.38268343236510904 -0.9238795325112787
+ outer loop
+ vertex 150.02753457015487 -123.08202726980832 -43.414359353945095
+ vertex -149.97246542984405 -123.08202726980846 -43.414359353945
+ vertex 150.02753457015484 -122.69613774197234 -43.254518677937675
+ endloop
+endfacet
+facet normal -4.5674521705146963e-14 0.38268343236510904 -0.9238795325112787
+ outer loop
+ vertex -149.972465429844 -122.69613774197249 -43.2545186779376
+ vertex 150.02753457015484 -122.69613774197234 -43.254518677937675
+ vertex -149.97246542984405 -123.08202726980846 -43.414359353945
+ endloop
+endfacet
+facet normal -1.2045729483673096e-15 -0.6087614290087094 -0.7933533402912438
+ outer loop
+ vertex 150.0275345701548 -121.48202726980828 -43.41435935394508
+ vertex -149.97246542984405 -121.48202726980844 -43.414359353944995
+ vertex 150.02753457015476 -121.15065641990981 -43.6686291501017
+ endloop
+endfacet
+facet normal -1.2045729483673096e-15 -0.6087614290087094 -0.7933533402912438
+ outer loop
+ vertex -149.97246542984405 -121.15065641990998 -43.66862915010161
+ vertex 150.02753457015476 -121.15065641990981 -43.6686291501017
+ vertex -149.97246542984405 -121.48202726980844 -43.414359353944995
+ endloop
+endfacet
+facet normal -4.731720894376804e-14 0.9238795325112782 -0.38268343236511054
+ outer loop
+ vertex 150.02753457015487 -123.82750859187081 -44.38588952783617
+ vertex -149.972465429844 -123.82750859187097 -44.38588952783608
+ vertex 150.02753457015484 -123.66766791586342 -44.0000000000002
+ endloop
+endfacet
+facet normal -4.731720894376804e-14 0.9238795325112782 -0.38268343236511054
+ outer loop
+ vertex -149.9724654298439 -123.66766791586357 -44.000000000000114
+ vertex 150.02753457015484 -123.66766791586342 -44.0000000000002
+ vertex -149.972465429844 -123.82750859187097 -44.38588952783608
+ endloop
+endfacet
+facet normal -2.7796804115194528e-14 0.9238795325112981 0.38268343236506286
+ outer loop
+ vertex 150.0275345701548 -123.66766791586339 -45.6000000000002
+ vertex -149.97246542984396 -123.66766791586357 -45.60000000000011
+ vertex 150.0275345701548 -123.82750859187081 -45.21411047216423
+ endloop
+endfacet
+facet normal -2.7796804115194528e-14 0.9238795325112981 0.38268343236506286
+ outer loop
+ vertex -149.9724654298441 -123.82750859187097 -45.214110472164144
+ vertex 150.0275345701548 -123.82750859187081 -45.21411047216423
+ vertex -149.97246542984396 -123.66766791586357 -45.60000000000011
+ endloop
+endfacet
+facet normal -1.7766793987718918e-14 -0.38268343236510816 -0.9238795325112792
+ outer loop
+ vertex 150.02753457015424 -121.86791679764426 -58.85451867793765
+ vertex -149.97246542984465 -121.86791679764443 -58.854518677937556
+ vertex 150.02753457015424 -121.48202726980831 -59.01435935394506
+ endloop
+endfacet
+facet normal -1.7766793987718918e-14 -0.38268343236510816 -0.9238795325112792
+ outer loop
+ vertex -149.9724654298446 -121.48202726980844 -59.014359353944975
+ vertex 150.02753457015424 -121.48202726980831 -59.01435935394506
+ vertex -149.97246542984465 -121.86791679764443 -58.854518677937556
+ endloop
+endfacet
+facet normal 4.3492520024057834e-15 -0.7933533402912383 -0.6087614290087168
+ outer loop
+ vertex 150.02753457015476 -120.89638662375317 -44.0000000000002
+ vertex 150.02753457015476 -121.15065641990981 -43.6686291501017
+ vertex -149.9724654298441 -120.89638662375336 -44.00000000000011
+ endloop
+endfacet
+facet normal 4.3492520024057834e-15 -0.7933533402912383 -0.6087614290087168
+ outer loop
+ vertex -149.97246542984405 -121.15065641990998 -43.66862915010161
+ vertex -149.9724654298441 -120.89638662375336 -44.00000000000011
+ vertex 150.02753457015476 -121.15065641990981 -43.6686291501017
+ endloop
+endfacet
+facet normal -4.052790633779115e-14 0.13052619222006184 -0.9914448613738092
+ outer loop
+ vertex 150.02753457015484 -122.69613774197234 -43.254518677937675
+ vertex -149.972465429844 -122.69613774197249 -43.2545186779376
+ vertex 150.02753457015484 -122.28202726980831 -43.20000000000018
+ endloop
+endfacet
+facet normal -4.052790633779115e-14 0.13052619222006184 -0.9914448613738092
+ outer loop
+ vertex -149.97246542984405 -122.28202726980848 -43.20000000000011
+ vertex 150.02753457015484 -122.28202726980831 -43.20000000000018
+ vertex -149.972465429844 -122.69613774197249 -43.2545186779376
+ endloop
+endfacet
+facet normal 2.2646895194863756e-14 0.38268343236506447 0.9238795325112973
+ outer loop
+ vertex 150.02753457015476 -123.08202726980828 -46.185640646055305
+ vertex 150.0275345701547 -122.69613774197232 -46.3454813220627
+ vertex -149.97246542984414 -123.08202726980846 -46.18564064605523
+ endloop
+endfacet
+facet normal 2.2646895194863756e-14 0.38268343236506447 0.9238795325112973
+ outer loop
+ vertex -149.972465429844 -122.69613774197249 -46.345481322062625
+ vertex -149.97246542984414 -123.08202726980846 -46.18564064605523
+ vertex 150.0275345701547 -122.69613774197232 -46.3454813220627
+ endloop
+endfacet
+facet normal 4.567452170514696e-14 -0.3826834323651088 0.9238795325112789
+ outer loop
+ vertex 150.0275345701547 -121.86791679764423 -46.3454813220627
+ vertex 150.02753457015467 -121.48202726980828 -46.1856406460553
+ vertex -149.9724654298442 -121.86791679764438 -46.345481322062625
+ endloop
+endfacet
+facet normal 4.567452170514696e-14 -0.3826834323651088 0.9238795325112789
+ outer loop
+ vertex -149.9724654298442 -121.48202726980843 -46.18564064605521
+ vertex -149.9724654298442 -121.86791679764438 -46.345481322062625
+ vertex 150.02753457015467 -121.48202726980828 -46.1856406460553
+ endloop
+endfacet
+facet normal -3.958984754963585e-14 0.991444861373809 0.13052619222006204
+ outer loop
+ vertex 150.0275345701548 -123.82750859187081 -45.21411047216423
+ vertex -149.9724654298441 -123.82750859187097 -45.214110472164144
+ vertex 150.0275345701548 -123.88202726980828 -44.8000000000002
+ endloop
+endfacet
+facet normal -3.958984754963585e-14 0.991444861373809 0.13052619222006204
+ outer loop
+ vertex -149.9724654298439 -123.88202726980846 -44.80000000000011
+ vertex 150.0275345701548 -123.88202726980828 -44.8000000000002
+ vertex -149.9724654298441 -123.82750859187097 -45.214110472164144
+ endloop
+endfacet
+facet normal 4.052790633779115e-14 -0.13052619222006184 0.9914448613738092
+ outer loop
+ vertex 150.02753457015467 -122.28202726980827 -46.4000000000002
+ vertex 150.0275345701547 -121.86791679764423 -46.3454813220627
+ vertex -149.972465429844 -122.2820272698084 -46.40000000000013
+ endloop
+endfacet
+facet normal 4.052790633779115e-14 -0.13052619222006184 0.9914448613738092
+ outer loop
+ vertex -149.9724654298442 -121.86791679764438 -46.345481322062625
+ vertex -149.972465429844 -122.2820272698084 -46.40000000000013
+ vertex 150.0275345701547 -121.86791679764423 -46.3454813220627
+ endloop
+endfacet
+facet normal 3.9589847549635877e-14 -0.9914448613738099 -0.1305261922200554
+ outer loop
+ vertex 150.02753457015424 -124.44795309609736 -61.85881904510269
+ vertex 150.02753457015424 -124.48202726980833 -61.60000000000018
+ vertex -149.9724654298446 -124.4479530960975 -61.8588190451026
+ endloop
+endfacet
+facet normal 3.9589847549635877e-14 -0.9914448613738099 -0.1305261922200554
+ outer loop
+ vertex -149.9724654298446 -124.48202726980844 -61.60000000000009
+ vertex -149.9724654298446 -124.4479530960975 -61.8588190451026
+ vertex 150.02753457015424 -124.48202726980833 -61.60000000000018
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 -1.5003536199769238e-15
+ outer loop
+ vertex 150.02753457015444 -124.4820272698083 -56.40000000000017
+ vertex -149.97246542984445 -124.48202726980846 -56.40000000000008
+ vertex 150.02753457015424 -124.48202726980833 -61.60000000000018
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 -1.5003536199769238e-15
+ outer loop
+ vertex -149.9724654298446 -124.48202726980844 -61.60000000000009
+ vertex 150.02753457015424 -124.48202726980833 -61.60000000000018
+ vertex -149.97246542984445 -124.48202726980846 -56.40000000000008
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 4.4649600931051686e-15
+ outer loop
+ vertex 150.02753457015444 -124.08202726980831 -56.40000000000017
+ vertex 150.02753457015444 -124.08202726980831 -56.00000000000017
+ vertex -149.97246542984442 -124.08202726980844 -56.40000000000008
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 4.4649600931051686e-15
+ outer loop
+ vertex -149.9724654298443 -124.08202726980846 -56.00000000000008
+ vertex -149.97246542984442 -124.08202726980844 -56.40000000000008
+ vertex 150.02753457015444 -124.08202726980831 -56.00000000000017
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899203173e-16 1.0
+ outer loop
+ vertex 150.02753457015433 -122.68202726980829 -58.200000000000195
+ vertex 150.02753457015422 -120.64771269475757 -58.20000000000017
+ vertex -149.97246542984445 -122.68202726980844 -58.20000000000009
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899203173e-16 1.0
+ outer loop
+ vertex -149.97246542984465 -120.6477126947577 -58.20000000000009
+ vertex -149.97246542984445 -122.68202726980844 -58.20000000000009
+ vertex 150.02753457015422 -120.64771269475757 -58.20000000000017
+ endloop
+endfacet
+facet normal 2.7796804115194335e-14 -0.9238795325112917 -0.3826834323650779
+ outer loop
+ vertex 150.02753457015422 -124.34805267359273 -62.10000000000018
+ vertex 150.02753457015424 -124.44795309609736 -61.85881904510269
+ vertex -149.97246542984465 -124.34805267359289 -62.10000000000009
+ endloop
+endfacet
+facet normal 2.7796804115194335e-14 -0.9238795325112917 -0.3826834323650779
+ outer loop
+ vertex -149.9724654298446 -124.4479530960975 -61.8588190451026
+ vertex -149.97246542984465 -124.34805267359289 -62.10000000000009
+ vertex 150.02753457015424 -124.44795309609736 -61.85881904510269
+ endloop
+endfacet
+facet normal 4.079515764373917e-14 -0.7071067811865452 0.7071067811865499
+ outer loop
+ vertex 150.02753457015422 -120.64771269475757 -58.20000000000017
+ vertex 150.02753457015427 -118.18202726980829 -55.73431457505093
+ vertex -149.97246542984465 -120.6477126947577 -58.20000000000009
+ endloop
+endfacet
+facet normal 4.079515764373917e-14 -0.7071067811865452 0.7071067811865499
+ outer loop
+ vertex -149.9724654298446 -118.18202726980843 -55.734314575050846
+ vertex -149.97246542984465 -120.6477126947577 -58.20000000000009
+ vertex 150.02753457015427 -118.18202726980829 -55.73431457505093
+ endloop
+endfacet
+facet normal 3.592621386430644e-14 1.7054096175908145e-14 1.0
+ outer loop
+ vertex 150.02753457015444 -124.08202726980831 -56.00000000000017
+ vertex 150.02753457015442 -122.68202726980829 -56.0000000000002
+ vertex -149.9724654298443 -124.08202726980846 -56.00000000000008
+ endloop
+endfacet
+facet normal 3.592621386430644e-14 1.7054096175908145e-14 1.0
+ outer loop
+ vertex -149.97246542984445 -122.68202726980844 -56.00000000000009
+ vertex -149.9724654298443 -124.08202726980846 -56.00000000000008
+ vertex 150.02753457015442 -122.68202726980829 -56.0000000000002
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899203173e-16 1.0
+ outer loop
+ vertex 150.02753457015444 -124.4820272698083 -56.40000000000017
+ vertex 150.02753457015444 -124.08202726980831 -56.40000000000017
+ vertex -149.97246542984445 -124.48202726980846 -56.40000000000008
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899203173e-16 1.0
+ outer loop
+ vertex -149.97246542984442 -124.08202726980844 -56.40000000000008
+ vertex -149.97246542984445 -124.48202726980846 -56.40000000000008
+ vertex 150.02753457015444 -124.08202726980831 -56.40000000000017
+ endloop
+endfacet
+facet normal -3.9847246381628766e-14 1.0 -9.400019899202897e-16
+ outer loop
+ vertex 150.02753457015433 -122.68202726980829 -58.200000000000195
+ vertex -149.97246542984445 -122.68202726980844 -58.20000000000009
+ vertex 150.02753457015442 -122.68202726980829 -56.0000000000002
+ endloop
+endfacet
+facet normal -3.9847246381628766e-14 1.0 -9.400019899202897e-16
+ outer loop
+ vertex -149.97246542984445 -122.68202726980844 -56.00000000000009
+ vertex 150.02753457015442 -122.68202726980829 -56.0000000000002
+ vertex -149.97246542984445 -122.68202726980844 -58.20000000000009
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 1.0524654334828364e-15
+ outer loop
+ vertex 150.02753457015453 -118.18202726980827 -49.465685424949434
+ vertex -149.97246542984436 -118.18202726980843 -49.46568542494934
+ vertex 150.02753457015427 -118.18202726980829 -55.73431457505093
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 1.0524654334828364e-15
+ outer loop
+ vertex -149.9724654298446 -118.18202726980843 -55.734314575050846
+ vertex 150.02753457015427 -118.18202726980829 -55.73431457505093
+ vertex -149.97246542984436 -118.18202726980843 -49.46568542494934
+ endloop
+endfacet
+facet normal -3.9847246381628766e-14 1.0 -9.400019899202897e-16
+ outer loop
+ vertex 150.02753457015433 -104.48202726980827 -43.60000000000017
+ vertex 150.0275345701541 -104.48202726980827 -48.80000000000017
+ vertex -149.9724654298446 -104.48202726980843 -43.6000000000001
+ endloop
+endfacet
+facet normal -3.9847246381628766e-14 1.0 -9.400019899202897e-16
+ outer loop
+ vertex -149.97246542984473 -104.48202726980843 -48.80000000000009
+ vertex -149.9724654298446 -104.48202726980843 -43.6000000000001
+ vertex 150.0275345701541 -104.48202726980827 -48.80000000000017
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899203173e-16 -1.0
+ outer loop
+ vertex 150.0275345701541 -104.88202726980829 -48.80000000000017
+ vertex -149.97246542984476 -104.88202726980845 -48.80000000000008
+ vertex 150.0275345701541 -104.48202726980827 -48.80000000000017
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899203173e-16 -1.0
+ outer loop
+ vertex -149.97246542984473 -104.48202726980843 -48.80000000000009
+ vertex 150.0275345701541 -104.48202726980827 -48.80000000000017
+ vertex -149.97246542984476 -104.88202726980845 -48.80000000000008
+ endloop
+endfacet
+facet normal -3.984724638162876e-14 1.0 -2.7394170869210435e-15
+ outer loop
+ vertex 150.02753457015427 -110.78202726980828 -49.46568542494941
+ vertex 150.02753457015402 -110.78202726980828 -55.73431457505091
+ vertex -149.9724654298446 -110.78202726980844 -49.465685424949335
+ endloop
+endfacet
+facet normal -3.984724638162876e-14 1.0 -2.7394170869210435e-15
+ outer loop
+ vertex -149.97246542984473 -110.78202726980844 -55.734314575050796
+ vertex -149.9724654298446 -110.78202726980844 -49.465685424949335
+ vertex 150.02753457015402 -110.78202726980828 -55.73431457505091
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899203173e-16 -1.0
+ outer loop
+ vertex 150.02753457015413 -106.2820272698083 -49.200000000000166
+ vertex -149.97246542984468 -106.28202726980842 -49.200000000000074
+ vertex 150.0275345701541 -104.88202726980828 -49.200000000000166
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899203173e-16 -1.0
+ outer loop
+ vertex -149.97246542984473 -104.88202726980845 -49.20000000000008
+ vertex 150.0275345701541 -104.88202726980828 -49.200000000000166
+ vertex -149.97246542984468 -106.28202726980842 -49.200000000000074
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899203173e-16 1.0
+ outer loop
+ vertex 150.0275345701539 -108.31634184485905 -58.200000000000166
+ vertex 150.02753457015382 -106.28202726980831 -58.200000000000166
+ vertex -149.97246542984496 -108.31634184485918 -58.200000000000074
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899203173e-16 1.0
+ outer loop
+ vertex -149.97246542984504 -106.28202726980845 -58.200000000000074
+ vertex -149.97246542984496 -108.31634184485918 -58.200000000000074
+ vertex 150.02753457015382 -106.28202726980831 -58.200000000000166
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 9.400019899202897e-16
+ outer loop
+ vertex 150.02753457015382 -106.28202726980831 -58.200000000000166
+ vertex 150.0275345701539 -106.2820272698083 -56.00000000000017
+ vertex -149.97246542984504 -106.28202726980845 -58.200000000000074
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 9.400019899202897e-16
+ outer loop
+ vertex -149.97246542984496 -106.28202726980842 -56.00000000000008
+ vertex -149.97246542984504 -106.28202726980845 -58.200000000000074
+ vertex 150.0275345701539 -106.2820272698083 -56.00000000000017
+ endloop
+endfacet
+facet normal 3.592621386430644e-14 1.705409617590833e-14 1.0
+ outer loop
+ vertex 150.0275345701539 -106.2820272698083 -56.00000000000017
+ vertex 150.02753457015388 -104.88202726980828 -56.0000000000002
+ vertex -149.97246542984496 -106.28202726980842 -56.00000000000008
+ endloop
+endfacet
+facet normal 3.592621386430644e-14 1.705409617590833e-14 1.0
+ outer loop
+ vertex -149.972465429845 -104.8820272698084 -56.000000000000114
+ vertex -149.97246542984496 -106.28202726980842 -56.00000000000008
+ vertex 150.02753457015388 -104.88202726980828 -56.0000000000002
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899203173e-16 -1.0
+ outer loop
+ vertex 150.02753457015427 -108.31634184485901 -47.00000000000018
+ vertex -149.9724654298446 -108.31634184485917 -47.00000000000008
+ vertex 150.02753457015422 -106.28202726980827 -47.00000000000017
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899203173e-16 -1.0
+ outer loop
+ vertex -149.97246542984465 -106.28202726980845 -47.00000000000008
+ vertex 150.02753457015422 -106.28202726980827 -47.00000000000017
+ vertex -149.9724654298446 -108.31634184485917 -47.00000000000008
+ endloop
+endfacet
+facet normal -4.079515764373917e-14 0.7071067811865452 -0.7071067811865499
+ outer loop
+ vertex 150.02753457015427 -110.78202726980828 -49.46568542494941
+ vertex -149.9724654298446 -110.78202726980844 -49.465685424949335
+ vertex 150.02753457015427 -108.31634184485901 -47.00000000000018
+ endloop
+endfacet
+facet normal -4.079515764373917e-14 0.7071067811865452 -0.7071067811865499
+ outer loop
+ vertex -149.9724654298446 -108.31634184485917 -47.00000000000008
+ vertex 150.02753457015427 -108.31634184485901 -47.00000000000018
+ vertex -149.9724654298446 -110.78202726980844 -49.465685424949335
+ endloop
+endfacet
+facet normal -1.754347986591135e-15 0.7071067811865513 0.7071067811865437
+ outer loop
+ vertex 150.0275345701539 -108.31634184485905 -58.200000000000166
+ vertex -149.97246542984496 -108.31634184485918 -58.200000000000074
+ vertex 150.02753457015402 -110.78202726980828 -55.73431457505091
+ endloop
+endfacet
+facet normal -1.754347986591135e-15 0.7071067811865513 0.7071067811865437
+ outer loop
+ vertex -149.97246542984473 -110.78202726980844 -55.734314575050796
+ vertex 150.02753457015402 -110.78202726980828 -55.73431457505091
+ vertex -149.97246542984496 -108.31634184485918 -58.200000000000074
+ endloop
+endfacet
+facet normal -3.9847246381628766e-14 1.0 -9.400019899202897e-16
+ outer loop
+ vertex 150.02753457015388 -104.88202726980828 -56.400000000000205
+ vertex -149.972465429845 -104.88202726980843 -56.40000000000011
+ vertex 150.02753457015388 -104.88202726980828 -56.0000000000002
+ endloop
+endfacet
+facet normal -3.9847246381628766e-14 1.0 -9.400019899202897e-16
+ outer loop
+ vertex -149.972465429845 -104.8820272698084 -56.000000000000114
+ vertex 150.02753457015388 -104.88202726980828 -56.0000000000002
+ vertex -149.972465429845 -104.88202726980843 -56.40000000000011
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899203173e-16 1.0
+ outer loop
+ vertex 150.02753457015388 -104.88202726980828 -56.400000000000205
+ vertex 150.02753457015385 -104.4820272698083 -56.400000000000205
+ vertex -149.972465429845 -104.88202726980843 -56.40000000000011
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899203173e-16 1.0
+ outer loop
+ vertex -149.97246542984504 -104.48202726980846 -56.40000000000011
+ vertex -149.972465429845 -104.88202726980843 -56.40000000000011
+ vertex 150.02753457015385 -104.4820272698083 -56.400000000000205
+ endloop
+endfacet
+facet normal -3.9847246381628766e-14 1.0 -9.400019899202897e-16
+ outer loop
+ vertex 150.0275345701541 -104.88202726980829 -48.80000000000017
+ vertex 150.0275345701541 -104.88202726980828 -49.200000000000166
+ vertex -149.97246542984476 -104.88202726980845 -48.80000000000008
+ endloop
+endfacet
+facet normal -3.9847246381628766e-14 1.0 -9.400019899202897e-16
+ outer loop
+ vertex -149.97246542984473 -104.88202726980845 -49.20000000000008
+ vertex -149.97246542984476 -104.88202726980845 -48.80000000000008
+ vertex 150.0275345701541 -104.88202726980828 -49.200000000000166
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 9.400019899202897e-16
+ outer loop
+ vertex 150.02753457015422 -106.28202726980827 -47.00000000000017
+ vertex -149.97246542984465 -106.28202726980845 -47.00000000000008
+ vertex 150.02753457015413 -106.2820272698083 -49.200000000000166
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 9.400019899202897e-16
+ outer loop
+ vertex -149.97246542984468 -106.28202726980842 -49.200000000000074
+ vertex 150.02753457015413 -106.2820272698083 -49.200000000000166
+ vertex -149.97246542984465 -106.28202726980845 -47.00000000000008
+ endloop
+endfacet
+facet normal -3.8509960452410384e-14 0.7933533402912354 -0.6087614290087203
+ outer loop
+ vertex 150.02753457015362 -104.61600186602386 -62.10000000000019
+ vertex 150.02753457015356 -104.77492048862175 -62.30710678118674
+ vertex -149.97246542984522 -104.61600186602399 -62.1000000000001
+ endloop
+endfacet
+facet normal -3.8509960452410384e-14 0.7933533402912354 -0.6087614290087203
+ outer loop
+ vertex -149.97246542984513 -104.77492048862187 -62.307106781186654
+ vertex -149.97246542984522 -104.61600186602399 -62.1000000000001
+ vertex 150.02753457015356 -104.77492048862175 -62.30710678118674
+ endloop
+endfacet
+facet normal -4.811457230871788e-14 0.3826834323650812 -0.9238795325112903
+ outer loop
+ vertex 150.02753457015362 -105.22320822470579 -62.56592582628924
+ vertex -149.97246542984522 -105.22320822470594 -62.56592582628915
+ vertex 150.02753457015362 -104.9820272698083 -62.46602540378463
+ endloop
+endfacet
+facet normal -4.811457230871788e-14 0.3826834323650812 -0.9238795325112903
+ outer loop
+ vertex -149.97246542984527 -104.98202726980846 -62.466025403784535
+ vertex 150.02753457015362 -104.9820272698083 -62.46602540378463
+ vertex -149.97246542984522 -105.22320822470594 -62.56592582628915
+ endloop
+endfacet
+facet normal -4.1747931639577346e-14 0.13052619222007247 -0.9914448613738078
+ outer loop
+ vertex 150.02753457015362 -105.4820272698083 -62.60000000000018
+ vertex -149.97246542984522 -105.48202726980847 -62.60000000000009
+ vertex 150.02753457015362 -105.22320822470579 -62.56592582628924
+ endloop
+endfacet
+facet normal -4.1747931639577346e-14 0.13052619222007247 -0.9914448613738078
+ outer loop
+ vertex -149.97246542984522 -105.22320822470594 -62.56592582628915
+ vertex 150.02753457015362 -105.22320822470579 -62.56592582628924
+ vertex -149.97246542984522 -105.48202726980847 -62.60000000000009
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899203173e-16 -1.0
+ outer loop
+ vertex 150.0275345701538 -110.68202726980829 -62.6000000000002
+ vertex -149.97246542984504 -110.68202726980846 -62.60000000000009
+ vertex 150.02753457015362 -105.4820272698083 -62.60000000000018
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899203173e-16 -1.0
+ outer loop
+ vertex -149.97246542984522 -105.48202726980847 -62.60000000000009
+ vertex 150.02753457015362 -105.4820272698083 -62.60000000000018
+ vertex -149.97246542984504 -110.68202726980846 -62.60000000000009
+ endloop
+endfacet
+facet normal -5.247654033021131e-14 0.6087614290087036 -0.7933533402912483
+ outer loop
+ vertex 150.02753457015362 -104.9820272698083 -62.46602540378463
+ vertex -149.97246542984527 -104.98202726980846 -62.466025403784535
+ vertex 150.02753457015356 -104.77492048862175 -62.30710678118674
+ endloop
+endfacet
+facet normal -5.247654033021131e-14 0.6087614290087036 -0.7933533402912483
+ outer loop
+ vertex -149.97246542984513 -104.77492048862187 -62.307106781186654
+ vertex 150.02753457015356 -104.77492048862175 -62.30710678118674
+ vertex -149.97246542984527 -104.98202726980846 -62.466025403784535
+ endloop
+endfacet
+facet normal -3.9847246381628766e-14 1.0 -9.400019899202897e-16
+ outer loop
+ vertex 150.02753457015368 -104.4820272698083 -61.60000000000019
+ vertex -149.97246542984522 -104.48202726980846 -61.6000000000001
+ vertex 150.02753457015385 -104.4820272698083 -56.400000000000205
+ endloop
+endfacet
+facet normal -3.9847246381628766e-14 1.0 -9.400019899202897e-16
+ outer loop
+ vertex -149.97246542984504 -104.48202726980846 -56.40000000000011
+ vertex 150.02753457015385 -104.4820272698083 -56.400000000000205
+ vertex -149.97246542984522 -104.48202726980846 -61.6000000000001
+ endloop
+endfacet
+facet normal -3.755700652948135e-14 0.9238795325112905 -0.3826834323650808
+ outer loop
+ vertex 150.02753457015362 -104.61600186602386 -62.10000000000019
+ vertex -149.97246542984522 -104.61600186602399 -62.1000000000001
+ vertex 150.02753457015362 -104.51610144351923 -61.858819045102706
+ endloop
+endfacet
+facet normal -3.755700652948135e-14 0.9238795325112905 -0.3826834323650808
+ outer loop
+ vertex -149.97246542984513 -104.51610144351935 -61.858819045102614
+ vertex 150.02753457015362 -104.51610144351923 -61.858819045102706
+ vertex -149.97246542984522 -104.61600186602399 -62.1000000000001
+ endloop
+endfacet
+facet normal -3.958984754963587e-14 0.9914448613738096 -0.1305261922200573
+ outer loop
+ vertex 150.02753457015368 -104.4820272698083 -61.60000000000019
+ vertex 150.02753457015362 -104.51610144351923 -61.858819045102706
+ vertex -149.97246542984522 -104.48202726980846 -61.6000000000001
+ endloop
+endfacet
+facet normal -3.958984754963587e-14 0.9914448613738096 -0.1305261922200573
+ outer loop
+ vertex -149.97246542984513 -104.51610144351935 -61.858819045102614
+ vertex -149.97246542984522 -104.48202726980846 -61.6000000000001
+ vertex 150.02753457015362 -104.51610144351923 -61.858819045102706
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899203173e-16 -1.0
+ outer loop
+ vertex 150.0275345701538 -111.08202726980828 -62.20000000000018
+ vertex -149.97246542984504 -111.08202726980844 -62.20000000000008
+ vertex 150.0275345701538 -110.6820272698083 -62.2000000000002
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899203173e-16 -1.0
+ outer loop
+ vertex -149.97246542984504 -110.68202726980842 -62.20000000000009
+ vertex 150.0275345701538 -110.6820272698083 -62.2000000000002
+ vertex -149.97246542984504 -111.08202726980844 -62.20000000000008
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 9.400019899202897e-16
+ outer loop
+ vertex 150.0275345701539 -108.88202726980829 -58.765685424949424
+ vertex -149.97246542984496 -108.88202726980845 -58.76568542494933
+ vertex 150.0275345701538 -108.88202726980829 -60.80000000000016
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 9.400019899202897e-16
+ outer loop
+ vertex -149.97246542984504 -108.8820272698084 -60.80000000000007
+ vertex 150.0275345701538 -108.88202726980829 -60.80000000000016
+ vertex -149.97246542984496 -108.88202726980845 -58.76568542494933
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 9.400019899202897e-16
+ outer loop
+ vertex 150.0275345701538 -110.68202726980829 -62.6000000000002
+ vertex 150.0275345701538 -110.6820272698083 -62.2000000000002
+ vertex -149.97246542984504 -110.68202726980846 -62.60000000000009
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 9.400019899202897e-16
+ outer loop
+ vertex -149.97246542984504 -110.68202726980842 -62.20000000000009
+ vertex -149.97246542984504 -110.68202726980846 -62.60000000000009
+ vertex 150.0275345701538 -110.6820272698083 -62.2000000000002
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899203173e-16 1.0
+ outer loop
+ vertex 150.0275345701539 -111.08202726980826 -60.80000000000016
+ vertex 150.0275345701538 -108.88202726980829 -60.80000000000016
+ vertex -149.97246542984496 -111.08202726980844 -60.80000000000006
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899203173e-16 1.0
+ outer loop
+ vertex -149.97246542984504 -108.8820272698084 -60.80000000000007
+ vertex -149.97246542984496 -111.08202726980844 -60.80000000000006
+ vertex 150.0275345701538 -108.88202726980829 -60.80000000000016
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899203173e-16 -1.0
+ outer loop
+ vertex 150.02753457015422 -117.61634184485901 -56.30000000000017
+ vertex -149.9724654298446 -117.61634184485915 -56.300000000000075
+ vertex 150.02753457015402 -111.34771269475752 -56.30000000000017
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899203173e-16 -1.0
+ outer loop
+ vertex -149.97246542984487 -111.34771269475767 -56.30000000000007
+ vertex 150.02753457015402 -111.34771269475752 -56.30000000000017
+ vertex -149.9724654298446 -117.61634184485915 -56.300000000000075
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 8.99704908291417e-15
+ outer loop
+ vertex 150.0275345701539 -111.08202726980826 -60.80000000000016
+ vertex -149.97246542984496 -111.08202726980844 -60.80000000000006
+ vertex 150.0275345701538 -111.08202726980828 -62.20000000000018
+ endloop
+endfacet
+facet normal 3.9847246381628766e-14 -1.0 8.99704908291417e-15
+ outer loop
+ vertex -149.97246542984504 -111.08202726980844 -62.20000000000008
+ vertex 150.0275345701538 -111.08202726980828 -62.20000000000018
+ vertex -149.97246542984496 -111.08202726980844 -60.80000000000006
+ endloop
+endfacet
+facet normal 1.7543479865910372e-15 -0.7071067811865481 -0.707106781186547
+ outer loop
+ vertex 150.02753457015402 -111.34771269475752 -56.30000000000017
+ vertex -149.97246542984487 -111.34771269475767 -56.30000000000007
+ vertex 150.0275345701539 -108.88202726980829 -58.765685424949424
+ endloop
+endfacet
+facet normal 1.7543479865910372e-15 -0.7071067811865481 -0.707106781186547
+ outer loop
+ vertex -149.97246542984496 -108.88202726980845 -58.76568542494933
+ vertex 150.0275345701539 -108.88202726980829 -58.765685424949424
+ vertex -149.97246542984487 -111.34771269475767 -56.30000000000007
+ endloop
+endfacet
+facet normal -5.055536005802621e-14 0.707106781186545 -0.70710678118655
+ outer loop
+ vertex 150.0275345701542 -120.08202726980826 -58.76568542494941
+ vertex -149.97246542984465 -120.08202726980842 -58.76568542494932
+ vertex 150.02753457015422 -117.61634184485901 -56.30000000000017
+ endloop
+endfacet
+facet normal -5.055536005802621e-14 0.707106781186545 -0.70710678118655
+ outer loop
+ vertex -149.9724654298446 -117.61634184485915 -56.300000000000075
+ vertex 150.02753457015422 -117.61634184485901 -56.30000000000017
+ vertex -149.97246542984465 -120.08202726980842 -58.76568542494932
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899203173e-16 1.0
+ outer loop
+ vertex 150.02753457015416 -120.0820272698083 -60.80000000000017
+ vertex 150.0275345701541 -117.88202726980829 -60.80000000000018
+ vertex -149.97246542984468 -120.08202726980845 -60.80000000000008
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899203173e-16 1.0
+ outer loop
+ vertex -149.97246542984482 -117.88202726980845 -60.80000000000009
+ vertex -149.97246542984468 -120.08202726980845 -60.80000000000008
+ vertex 150.0275345701541 -117.88202726980829 -60.80000000000018
+ endloop
+endfacet
+facet normal -3.9847246381628766e-14 1.0 -2.611827415552657e-14
+ outer loop
+ vertex 150.0275345701541 -117.88202726980829 -60.80000000000018
+ vertex 150.02753457015402 -117.88202726980833 -62.20000000000018
+ vertex -149.97246542984482 -117.88202726980845 -60.80000000000009
+ endloop
+endfacet
+facet normal -3.9847246381628766e-14 1.0 -2.611827415552657e-14
+ outer loop
+ vertex -149.97246542984482 -117.88202726980848 -62.20000000000009
+ vertex -149.97246542984482 -117.88202726980845 -60.80000000000009
+ vertex 150.02753457015402 -117.88202726980833 -62.20000000000018
+ endloop
+endfacet
+facet normal -3.9847246381628766e-14 1.0 -9.400019899202897e-16
+ outer loop
+ vertex 150.02753457015416 -120.0820272698083 -60.80000000000017
+ vertex -149.97246542984468 -120.08202726980845 -60.80000000000008
+ vertex 150.0275345701542 -120.08202726980826 -58.76568542494941
+ endloop
+endfacet
+facet normal -3.9847246381628766e-14 1.0 -9.400019899202897e-16
+ outer loop
+ vertex -149.97246542984465 -120.08202726980842 -58.76568542494932
+ vertex 150.0275345701542 -120.08202726980826 -58.76568542494941
+ vertex -149.97246542984468 -120.08202726980845 -60.80000000000008
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899203173e-16 -1.0
+ outer loop
+ vertex 150.02753457015402 -118.28202726980831 -62.20000000000018
+ vertex -149.97246542984482 -118.2820272698085 -62.20000000000009
+ vertex 150.02753457015402 -117.88202726980833 -62.20000000000018
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899203173e-16 -1.0
+ outer loop
+ vertex -149.97246542984482 -117.88202726980848 -62.20000000000009
+ vertex 150.02753457015402 -117.88202726980833 -62.20000000000018
+ vertex -149.97246542984482 -118.2820272698085 -62.20000000000009
+ endloop
+endfacet
+facet normal -3.9847246381628766e-14 1.0 -4.4649600931051686e-15
+ outer loop
+ vertex 150.02753457015402 -118.28202726980831 -62.20000000000018
+ vertex 150.027534570154 -118.28202726980834 -62.60000000000018
+ vertex -149.97246542984482 -118.2820272698085 -62.20000000000009
+ endloop
+endfacet
+facet normal -3.9847246381628766e-14 1.0 -4.4649600931051686e-15
+ outer loop
+ vertex -149.97246542984482 -118.28202726980847 -62.60000000000009
+ vertex -149.97246542984482 -118.2820272698085 -62.20000000000009
+ vertex 150.027534570154 -118.28202726980834 -62.60000000000018
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899203173e-16 -1.0
+ outer loop
+ vertex 150.0275345701542 -123.4820272698083 -62.60000000000018
+ vertex -149.97246542984473 -123.48202726980846 -62.60000000000008
+ vertex 150.027534570154 -118.28202726980834 -62.60000000000018
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899203173e-16 -1.0
+ outer loop
+ vertex -149.97246542984482 -118.28202726980847 -62.60000000000009
+ vertex 150.027534570154 -118.28202726980834 -62.60000000000018
+ vertex -149.97246542984473 -123.48202726980846 -62.60000000000008
+ endloop
+endfacet
+facet normal -3.389363707114727e-14 -0.13052619222007386 -0.9914448613738075
+ outer loop
+ vertex 150.02753457015422 -123.74084631491081 -62.56592582628924
+ vertex -149.97246542984468 -123.740846314911 -62.56592582628915
+ vertex 150.0275345701542 -123.4820272698083 -62.60000000000018
+ endloop
+endfacet
+facet normal -3.389363707114727e-14 -0.13052619222007386 -0.9914448613738075
+ outer loop
+ vertex -149.97246542984473 -123.48202726980846 -62.60000000000008
+ vertex 150.0275345701542 -123.4820272698083 -62.60000000000018
+ vertex -149.97246542984468 -123.740846314911 -62.56592582628915
+ endloop
+endfacet
+facet normal -2.264689519486322e-14 -0.3826834323650826 -0.9238795325112898
+ outer loop
+ vertex 150.02753457015422 -123.98202726980828 -62.46602540378461
+ vertex -149.97246542984453 -123.98202726980844 -62.46602540378452
+ vertex 150.02753457015422 -123.74084631491081 -62.56592582628924
+ endloop
+endfacet
+facet normal -2.264689519486322e-14 -0.3826834323650826 -0.9238795325112898
+ outer loop
+ vertex -149.97246542984468 -123.740846314911 -62.56592582628915
+ vertex 150.02753457015422 -123.74084631491081 -62.56592582628924
+ vertex -149.97246542984453 -123.98202726980844 -62.46602540378452
+ endloop
+endfacet
+facet normal -1.0964775362654501e-14 -0.6087614290087044 -0.7933533402912476
+ outer loop
+ vertex 150.02753457015422 -124.18913405099482 -62.30710678118673
+ vertex -149.97246542984468 -124.18913405099501 -62.30710678118664
+ vertex 150.02753457015422 -123.98202726980828 -62.46602540378461
+ endloop
+endfacet
+facet normal -1.0964775362654501e-14 -0.6087614290087044 -0.7933533402912476
+ outer loop
+ vertex -149.97246542984453 -123.98202726980844 -62.46602540378452
+ vertex 150.02753457015422 -123.98202726980828 -62.46602540378461
+ vertex -149.97246542984468 -124.18913405099501 -62.30710678118664
+ endloop
+endfacet
+facet normal -5.308492047377087e-16 -0.7933533402912396 -0.6087614290087152
+ outer loop
+ vertex 150.02753457015422 -124.18913405099482 -62.30710678118673
+ vertex 150.02753457015422 -124.34805267359273 -62.10000000000018
+ vertex -149.97246542984468 -124.18913405099501 -62.30710678118664
+ endloop
+endfacet
+facet normal -5.308492047377087e-16 -0.7933533402912396 -0.6087614290087152
+ outer loop
+ vertex -149.97246542984465 -124.34805267359289 -62.10000000000009
+ vertex -149.97246542984468 -124.18913405099501 -62.30710678118664
+ vertex 150.02753457015422 -124.34805267359273 -62.10000000000018
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984445 -124.48202726980846 -56.40000000000008
+ vertex -149.97246542984442 -124.08202726980844 -56.40000000000008
+ vertex -149.9724654298446 -124.48202726980844 -61.60000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984453 -123.82750859187094 -59.985889527836086
+ vertex -149.9724654298446 -124.48202726980844 -61.60000000000009
+ vertex -149.97246542984442 -124.08202726980844 -56.40000000000008
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984453 -123.66766791586355 -59.600000000000094
+ vertex -149.97246542984453 -123.82750859187094 -59.985889527836086
+ vertex -149.97246542984442 -124.08202726980844 -56.40000000000008
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984445 -122.68202726980844 -58.20000000000009
+ vertex -149.97246542984453 -123.66766791586355 -59.600000000000094
+ vertex -149.97246542984442 -124.08202726980844 -56.40000000000008
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984445 -123.41339811970691 -59.26862915010161
+ vertex -149.97246542984453 -123.66766791586355 -59.600000000000094
+ vertex -149.97246542984445 -122.68202726980844 -58.20000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984453 -123.08202726980849 -59.014359353944975
+ vertex -149.97246542984445 -123.41339811970691 -59.26862915010161
+ vertex -149.97246542984445 -122.68202726980844 -58.20000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984453 -122.69613774197249 -58.85451867793758
+ vertex -149.97246542984453 -123.08202726980849 -59.014359353944975
+ vertex -149.97246542984445 -122.68202726980844 -58.20000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984465 -120.6477126947577 -58.20000000000009
+ vertex -149.97246542984453 -122.69613774197249 -58.85451867793758
+ vertex -149.97246542984445 -122.68202726980844 -58.20000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984453 -122.28202726980847 -58.80000000000008
+ vertex -149.97246542984453 -122.69613774197249 -58.85451867793758
+ vertex -149.97246542984465 -120.6477126947577 -58.20000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984465 -120.08202726980842 -58.76568542494932
+ vertex -149.97246542984453 -122.28202726980847 -58.80000000000008
+ vertex -149.97246542984465 -120.6477126947577 -58.20000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298445 -123.88202726980843 -60.40000000000011
+ vertex -149.9724654298446 -124.48202726980844 -61.60000000000009
+ vertex -149.97246542984453 -123.82750859187094 -59.985889527836086
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298446 -123.82750859187097 -60.814110472164145
+ vertex -149.9724654298446 -124.48202726980844 -61.60000000000009
+ vertex -149.9724654298445 -123.88202726980843 -60.40000000000011
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298445 -123.66766791586355 -61.20000000000012
+ vertex -149.9724654298446 -124.48202726980844 -61.60000000000009
+ vertex -149.9724654298446 -123.82750859187097 -60.814110472164145
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984468 -123.41339811970691 -61.53137084989857
+ vertex -149.9724654298446 -124.48202726980844 -61.60000000000009
+ vertex -149.9724654298445 -123.66766791586355 -61.20000000000012
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984453 -123.08202726980842 -61.785640646055185
+ vertex -149.9724654298446 -124.48202726980844 -61.60000000000009
+ vertex -149.97246542984468 -123.41339811970691 -61.53137084989857
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298446 -124.4479530960975 -61.8588190451026
+ vertex -149.9724654298446 -124.48202726980844 -61.60000000000009
+ vertex -149.97246542984453 -123.08202726980842 -61.785640646055185
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984468 -122.69613774197248 -61.945481322062605
+ vertex -149.9724654298446 -124.4479530960975 -61.8588190451026
+ vertex -149.97246542984453 -123.08202726980842 -61.785640646055185
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984465 -124.34805267359289 -62.10000000000009
+ vertex -149.9724654298446 -124.4479530960975 -61.8588190451026
+ vertex -149.97246542984468 -122.69613774197248 -61.945481322062605
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984468 -122.28202726980847 -62.00000000000008
+ vertex -149.97246542984465 -124.34805267359289 -62.10000000000009
+ vertex -149.97246542984468 -122.69613774197248 -61.945481322062605
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984465 -124.34805267359289 -62.10000000000009
+ vertex -149.97246542984482 -118.2820272698085 -62.20000000000009
+ vertex -149.97246542984468 -124.18913405099501 -62.30710678118664
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984482 -118.28202726980847 -62.60000000000009
+ vertex -149.97246542984468 -124.18913405099501 -62.30710678118664
+ vertex -149.97246542984482 -118.2820272698085 -62.20000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984453 -123.98202726980844 -62.46602540378452
+ vertex -149.97246542984468 -124.18913405099501 -62.30710678118664
+ vertex -149.97246542984482 -118.28202726980847 -62.60000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984468 -123.740846314911 -62.56592582628915
+ vertex -149.97246542984453 -123.98202726980844 -62.46602540378452
+ vertex -149.97246542984482 -118.28202726980847 -62.60000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984473 -123.48202726980846 -62.60000000000008
+ vertex -149.97246542984468 -123.740846314911 -62.56592582628915
+ vertex -149.97246542984482 -118.28202726980847 -62.60000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984468 -120.08202726980845 -60.80000000000008
+ vertex -149.97246542984465 -120.89638662375333 -59.60000000000006
+ vertex -149.97246542984465 -120.08202726980842 -58.76568542494932
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298446 -121.15065641990998 -59.26862915010159
+ vertex -149.97246542984465 -120.08202726980842 -58.76568542494932
+ vertex -149.97246542984465 -120.89638662375333 -59.60000000000006
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298446 -121.48202726980844 -59.014359353944975
+ vertex -149.97246542984465 -120.08202726980842 -58.76568542494932
+ vertex -149.9724654298446 -121.15065641990998 -59.26862915010159
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984465 -121.86791679764443 -58.854518677937556
+ vertex -149.97246542984465 -120.08202726980842 -58.76568542494932
+ vertex -149.9724654298446 -121.48202726980844 -59.014359353944975
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984453 -122.28202726980847 -58.80000000000008
+ vertex -149.97246542984465 -120.08202726980842 -58.76568542494932
+ vertex -149.97246542984465 -121.86791679764443 -58.854518677937556
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984465 -120.73654594774592 -59.98588952783603
+ vertex -149.97246542984465 -120.89638662375333 -59.60000000000006
+ vertex -149.97246542984468 -120.08202726980845 -60.80000000000008
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298446 -120.68202726980842 -60.400000000000055
+ vertex -149.97246542984465 -120.73654594774592 -59.98588952783603
+ vertex -149.97246542984468 -120.08202726980845 -60.80000000000008
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984468 -120.7365459477459 -60.81411047216411
+ vertex -149.9724654298446 -120.68202726980842 -60.400000000000055
+ vertex -149.97246542984468 -120.08202726980845 -60.80000000000008
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984482 -117.88202726980845 -60.80000000000009
+ vertex -149.97246542984468 -120.7365459477459 -60.81411047216411
+ vertex -149.97246542984468 -120.08202726980845 -60.80000000000008
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984482 -117.88202726980848 -62.20000000000009
+ vertex -149.97246542984468 -120.7365459477459 -60.81411047216411
+ vertex -149.97246542984482 -117.88202726980845 -60.80000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298446 -120.89638662375336 -61.20000000000008
+ vertex -149.97246542984468 -120.7365459477459 -60.81411047216411
+ vertex -149.97246542984482 -117.88202726980848 -62.20000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984468 -121.15065641990998 -61.53137084989855
+ vertex -149.9724654298446 -120.89638662375336 -61.20000000000008
+ vertex -149.97246542984482 -117.88202726980848 -62.20000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984468 -121.48202726980843 -61.785640646055185
+ vertex -149.97246542984468 -121.15065641990998 -61.53137084989855
+ vertex -149.97246542984482 -117.88202726980848 -62.20000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298446 -121.86791679764441 -61.945481322062584
+ vertex -149.97246542984468 -121.48202726980843 -61.785640646055185
+ vertex -149.97246542984482 -117.88202726980848 -62.20000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984468 -122.28202726980847 -62.00000000000008
+ vertex -149.9724654298446 -121.86791679764441 -61.945481322062584
+ vertex -149.97246542984482 -117.88202726980848 -62.20000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984465 -124.34805267359289 -62.10000000000009
+ vertex -149.97246542984468 -122.28202726980847 -62.00000000000008
+ vertex -149.97246542984482 -117.88202726980848 -62.20000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984482 -118.2820272698085 -62.20000000000009
+ vertex -149.97246542984465 -124.34805267359289 -62.10000000000009
+ vertex -149.97246542984482 -117.88202726980848 -62.20000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298443 -111.08202726980842 -43.00000000000008
+ vertex -149.97246542984436 -110.68202726980842 -43.00000000000009
+ vertex -149.97246542984442 -111.08202726980842 -44.40000000000008
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984445 -107.09613774197244 -43.25451867793758
+ vertex -149.97246542984442 -111.08202726980842 -44.40000000000008
+ vertex -149.97246542984436 -110.68202726980842 -43.00000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984445 -106.68202726980844 -43.20000000000008
+ vertex -149.97246542984445 -107.09613774197244 -43.25451867793758
+ vertex -149.97246542984436 -110.68202726980842 -43.00000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984453 -104.61600186602399 -43.1000000000001
+ vertex -149.97246542984445 -106.68202726980844 -43.20000000000008
+ vertex -149.97246542984436 -110.68202726980842 -43.00000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984445 -107.48202726980843 -43.414359353944974
+ vertex -149.97246542984442 -111.08202726980842 -44.40000000000008
+ vertex -149.97246542984445 -107.09613774197244 -43.25451867793758
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984445 -107.81339811970689 -43.66862915010161
+ vertex -149.97246542984442 -111.08202726980842 -44.40000000000008
+ vertex -149.97246542984445 -107.48202726980843 -43.414359353944974
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984436 -108.06766791586355 -44.000000000000085
+ vertex -149.97246542984442 -111.08202726980842 -44.40000000000008
+ vertex -149.97246542984445 -107.81339811970689 -43.66862915010161
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298445 -108.22750859187097 -44.38588952783605
+ vertex -149.97246542984442 -111.08202726980842 -44.40000000000008
+ vertex -149.97246542984436 -108.06766791586355 -44.000000000000085
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298445 -108.88202726980842 -44.40000000000009
+ vertex -149.97246542984442 -111.08202726980842 -44.40000000000008
+ vertex -149.9724654298445 -108.22750859187097 -44.38588952783605
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984453 -108.28202726980844 -44.800000000000104
+ vertex -149.9724654298445 -108.88202726980842 -44.40000000000009
+ vertex -149.9724654298445 -108.22750859187097 -44.38588952783605
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298445 -108.88202726980842 -46.434314575050855
+ vertex -149.9724654298445 -108.88202726980842 -44.40000000000009
+ vertex -149.97246542984453 -108.28202726980844 -44.800000000000104
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984453 -108.22750859187094 -45.21411047216414
+ vertex -149.9724654298445 -108.88202726980842 -46.434314575050855
+ vertex -149.97246542984453 -108.28202726980844 -44.800000000000104
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984453 -108.06766791586354 -45.6000000000001
+ vertex -149.9724654298445 -108.88202726980842 -46.434314575050855
+ vertex -149.97246542984453 -108.22750859187094 -45.21411047216414
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984453 -107.81339811970692 -45.93137084989857
+ vertex -149.9724654298445 -108.88202726980842 -46.434314575050855
+ vertex -149.97246542984453 -108.06766791586354 -45.6000000000001
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984453 -107.4820272698084 -46.18564064605519
+ vertex -149.9724654298445 -108.88202726980842 -46.434314575050855
+ vertex -149.97246542984453 -107.81339811970692 -45.93137084989857
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298445 -107.09613774197244 -46.345481322062604
+ vertex -149.9724654298445 -108.88202726980842 -46.434314575050855
+ vertex -149.97246542984453 -107.4820272698084 -46.18564064605519
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298445 -106.6820272698084 -46.40000000000008
+ vertex -149.9724654298445 -108.88202726980842 -46.434314575050855
+ vertex -149.9724654298445 -107.09613774197244 -46.345481322062604
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984465 -106.28202726980845 -47.00000000000008
+ vertex -149.97246542984476 -104.88202726980845 -48.80000000000008
+ vertex -149.97246542984468 -106.28202726980842 -49.200000000000074
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984473 -104.88202726980845 -49.20000000000008
+ vertex -149.97246542984468 -106.28202726980842 -49.200000000000074
+ vertex -149.97246542984476 -104.88202726980845 -48.80000000000008
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984453 -104.61600186602399 -43.1000000000001
+ vertex -149.97246542984453 -104.51610144351935 -43.34118095489759
+ vertex -149.97246542984445 -106.68202726980844 -43.20000000000008
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298445 -106.26791679764443 -43.254518677937554
+ vertex -149.97246542984445 -106.68202726980844 -43.20000000000008
+ vertex -149.97246542984453 -104.51610144351935 -43.34118095489759
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984442 -105.88202726980843 -43.414359353944974
+ vertex -149.9724654298445 -106.26791679764443 -43.254518677937554
+ vertex -149.97246542984453 -104.51610144351935 -43.34118095489759
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298446 -104.48202726980843 -43.6000000000001
+ vertex -149.97246542984442 -105.88202726980843 -43.414359353944974
+ vertex -149.97246542984453 -104.51610144351935 -43.34118095489759
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984442 -105.55065641990996 -43.66862915010159
+ vertex -149.97246542984442 -105.88202726980843 -43.414359353944974
+ vertex -149.9724654298446 -104.48202726980843 -43.6000000000001
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984453 -105.29638662375332 -44.00000000000006
+ vertex -149.97246542984442 -105.55065641990996 -43.66862915010159
+ vertex -149.9724654298446 -104.48202726980843 -43.6000000000001
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298446 -105.1365459477459 -44.38588952783603
+ vertex -149.97246542984453 -105.29638662375332 -44.00000000000006
+ vertex -149.9724654298446 -104.48202726980843 -43.6000000000001
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984473 -104.48202726980843 -48.80000000000009
+ vertex -149.9724654298446 -105.1365459477459 -44.38588952783603
+ vertex -149.9724654298446 -104.48202726980843 -43.6000000000001
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984465 -105.08202726980842 -44.80000000000006
+ vertex -149.9724654298446 -105.1365459477459 -44.38588952783603
+ vertex -149.97246542984473 -104.48202726980843 -48.80000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984465 -105.13654594774593 -45.214110472164094
+ vertex -149.97246542984465 -105.08202726980842 -44.80000000000006
+ vertex -149.97246542984473 -104.48202726980843 -48.80000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298446 -105.29638662375329 -45.60000000000008
+ vertex -149.97246542984465 -105.13654594774593 -45.214110472164094
+ vertex -149.97246542984473 -104.48202726980843 -48.80000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984465 -105.55065641990993 -45.93137084989855
+ vertex -149.9724654298446 -105.29638662375329 -45.60000000000008
+ vertex -149.97246542984473 -104.48202726980843 -48.80000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298446 -105.88202726980843 -46.18564064605519
+ vertex -149.97246542984465 -105.55065641990993 -45.93137084989855
+ vertex -149.97246542984473 -104.48202726980843 -48.80000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298446 -106.26791679764438 -46.34548132206258
+ vertex -149.9724654298446 -105.88202726980843 -46.18564064605519
+ vertex -149.97246542984473 -104.48202726980843 -48.80000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298445 -106.6820272698084 -46.40000000000008
+ vertex -149.9724654298446 -106.26791679764438 -46.34548132206258
+ vertex -149.97246542984473 -104.48202726980843 -48.80000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984465 -106.28202726980845 -47.00000000000008
+ vertex -149.9724654298445 -106.6820272698084 -46.40000000000008
+ vertex -149.97246542984473 -104.48202726980843 -48.80000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298445 -108.88202726980842 -46.434314575050855
+ vertex -149.9724654298445 -106.6820272698084 -46.40000000000008
+ vertex -149.97246542984465 -106.28202726980845 -47.00000000000008
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298446 -108.31634184485917 -47.00000000000008
+ vertex -149.9724654298445 -108.88202726980842 -46.434314575050855
+ vertex -149.97246542984465 -106.28202726980845 -47.00000000000008
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984476 -104.88202726980845 -48.80000000000008
+ vertex -149.97246542984465 -106.28202726980845 -47.00000000000008
+ vertex -149.97246542984473 -104.48202726980843 -48.80000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298441 -120.73654594774594 -44.38588952783607
+ vertex -149.9724654298441 -120.08202726980845 -44.40000000000007
+ vertex -149.9724654298441 -120.68202726980842 -44.800000000000104
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298442 -120.08202726980846 -46.434314575050806
+ vertex -149.9724654298441 -120.68202726980842 -44.800000000000104
+ vertex -149.9724654298441 -120.08202726980845 -44.40000000000007
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984414 -120.73654594774592 -45.21411047216414
+ vertex -149.9724654298441 -120.68202726980842 -44.800000000000104
+ vertex -149.9724654298442 -120.08202726980846 -46.434314575050806
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984414 -120.89638662375333 -45.6000000000001
+ vertex -149.97246542984414 -120.73654594774592 -45.21411047216414
+ vertex -149.9724654298442 -120.08202726980846 -46.434314575050806
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984414 -121.15065641990998 -45.93137084989857
+ vertex -149.97246542984414 -120.89638662375333 -45.6000000000001
+ vertex -149.9724654298442 -120.08202726980846 -46.434314575050806
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298442 -121.48202726980843 -46.18564064605521
+ vertex -149.97246542984414 -121.15065641990998 -45.93137084989857
+ vertex -149.9724654298442 -120.08202726980846 -46.434314575050806
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298442 -121.86791679764438 -46.345481322062625
+ vertex -149.9724654298442 -121.48202726980843 -46.18564064605521
+ vertex -149.9724654298442 -120.08202726980846 -46.434314575050806
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.972465429844 -122.2820272698084 -46.40000000000013
+ vertex -149.9724654298442 -121.86791679764438 -46.345481322062625
+ vertex -149.9724654298442 -120.08202726980846 -46.434314575050806
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984396 -123.48202726980846 -42.600000000000065
+ vertex -149.97246542984414 -118.28202726980841 -42.60000000000007
+ vertex -149.97246542984396 -123.74084631491097 -42.63407417371101
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.972465429844 -118.28202726980838 -43.00000000000007
+ vertex -149.97246542984396 -123.74084631491097 -42.63407417371101
+ vertex -149.97246542984414 -118.28202726980841 -42.60000000000007
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984396 -123.98202726980844 -42.73397459621563
+ vertex -149.97246542984396 -123.74084631491097 -42.63407417371101
+ vertex -149.972465429844 -118.28202726980838 -43.00000000000007
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984396 -124.189134050995 -42.89289321881352
+ vertex -149.97246542984396 -123.98202726980844 -42.73397459621563
+ vertex -149.972465429844 -118.28202726980838 -43.00000000000007
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984396 -124.34805267359287 -43.100000000000065
+ vertex -149.97246542984396 -124.189134050995 -42.89289321881352
+ vertex -149.972465429844 -118.28202726980838 -43.00000000000007
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984414 -117.88202726980838 -43.00000000000007
+ vertex -149.97246542984396 -124.34805267359287 -43.100000000000065
+ vertex -149.972465429844 -118.28202726980838 -43.00000000000007
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984405 -122.28202726980848 -43.20000000000011
+ vertex -149.97246542984396 -124.34805267359287 -43.100000000000065
+ vertex -149.97246542984414 -117.88202726980838 -43.00000000000007
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.972465429844 -121.86791679764443 -43.254518677937604
+ vertex -149.97246542984405 -122.28202726980848 -43.20000000000011
+ vertex -149.97246542984414 -117.88202726980838 -43.00000000000007
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298442 -117.88202726980845 -44.40000000000007
+ vertex -149.972465429844 -121.86791679764443 -43.254518677937604
+ vertex -149.97246542984414 -117.88202726980838 -43.00000000000007
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984405 -121.48202726980844 -43.414359353944995
+ vertex -149.972465429844 -121.86791679764443 -43.254518677937604
+ vertex -149.9724654298442 -117.88202726980845 -44.40000000000007
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984405 -121.15065641990998 -43.66862915010161
+ vertex -149.97246542984405 -121.48202726980844 -43.414359353944995
+ vertex -149.9724654298442 -117.88202726980845 -44.40000000000007
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298441 -120.89638662375336 -44.00000000000011
+ vertex -149.97246542984405 -121.15065641990998 -43.66862915010161
+ vertex -149.9724654298442 -117.88202726980845 -44.40000000000007
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298441 -120.73654594774594 -44.38588952783607
+ vertex -149.9724654298441 -120.89638662375336 -44.00000000000011
+ vertex -149.9724654298442 -117.88202726980845 -44.40000000000007
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298441 -120.08202726980845 -44.40000000000007
+ vertex -149.9724654298441 -120.73654594774594 -44.38588952783607
+ vertex -149.9724654298442 -117.88202726980845 -44.40000000000007
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298445 -105.48202726980843 -42.60000000000009
+ vertex -149.9724654298445 -105.2232082247059 -42.63407417371102
+ vertex -149.97246542984436 -110.68202726980844 -42.600000000000094
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984436 -110.68202726980842 -43.00000000000009
+ vertex -149.97246542984436 -110.68202726980844 -42.600000000000094
+ vertex -149.9724654298445 -105.2232082247059 -42.63407417371102
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298445 -104.98202726980846 -42.73397459621565
+ vertex -149.97246542984436 -110.68202726980842 -43.00000000000009
+ vertex -149.9724654298445 -105.2232082247059 -42.63407417371102
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298445 -104.77492048862187 -42.89289321881353
+ vertex -149.97246542984436 -110.68202726980842 -43.00000000000009
+ vertex -149.9724654298445 -104.98202726980846 -42.73397459621565
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984453 -104.61600186602399 -43.1000000000001
+ vertex -149.97246542984436 -110.68202726980842 -43.00000000000009
+ vertex -149.9724654298445 -104.77492048862187 -42.89289321881353
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984396 -124.34805267359287 -43.100000000000065
+ vertex -149.97246542984405 -122.28202726980848 -43.20000000000011
+ vertex -149.972465429844 -124.44795309609752 -43.34118095489755
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.972465429844 -122.69613774197249 -43.2545186779376
+ vertex -149.972465429844 -124.44795309609752 -43.34118095489755
+ vertex -149.97246542984405 -122.28202726980848 -43.20000000000011
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984405 -123.08202726980846 -43.414359353945
+ vertex -149.972465429844 -124.44795309609752 -43.34118095489755
+ vertex -149.972465429844 -122.69613774197249 -43.2545186779376
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984396 -124.48202726980841 -43.600000000000065
+ vertex -149.972465429844 -124.44795309609752 -43.34118095489755
+ vertex -149.97246542984405 -123.08202726980846 -43.414359353945
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298439 -123.41339811970694 -43.668629150101616
+ vertex -149.97246542984396 -124.48202726980841 -43.600000000000065
+ vertex -149.97246542984405 -123.08202726980846 -43.414359353945
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298439 -123.66766791586357 -44.000000000000114
+ vertex -149.97246542984396 -124.48202726980841 -43.600000000000065
+ vertex -149.9724654298439 -123.41339811970694 -43.668629150101616
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.972465429844 -123.82750859187097 -44.38588952783608
+ vertex -149.97246542984396 -124.48202726980841 -43.600000000000065
+ vertex -149.9724654298439 -123.66766791586357 -44.000000000000114
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298442 -124.48202726980841 -48.80000000000003
+ vertex -149.97246542984396 -124.48202726980841 -43.600000000000065
+ vertex -149.972465429844 -123.82750859187097 -44.38588952783608
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298439 -123.88202726980846 -44.80000000000011
+ vertex -149.9724654298442 -124.48202726980841 -48.80000000000003
+ vertex -149.972465429844 -123.82750859187097 -44.38588952783608
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298441 -123.82750859187097 -45.214110472164144
+ vertex -149.9724654298442 -124.48202726980841 -48.80000000000003
+ vertex -149.9724654298439 -123.88202726980846 -44.80000000000011
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984396 -123.66766791586357 -45.60000000000011
+ vertex -149.9724654298442 -124.48202726980841 -48.80000000000003
+ vertex -149.9724654298441 -123.82750859187097 -45.214110472164144
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984405 -123.41339811970691 -45.93137084989858
+ vertex -149.9724654298442 -124.48202726980841 -48.80000000000003
+ vertex -149.97246542984396 -123.66766791586357 -45.60000000000011
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984414 -123.08202726980846 -46.18564064605523
+ vertex -149.9724654298442 -124.48202726980841 -48.80000000000003
+ vertex -149.97246542984405 -123.41339811970691 -45.93137084989858
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.972465429844 -122.69613774197249 -46.345481322062625
+ vertex -149.9724654298442 -124.48202726980841 -48.80000000000003
+ vertex -149.97246542984414 -123.08202726980846 -46.18564064605523
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.972465429844 -122.2820272698084 -46.40000000000013
+ vertex -149.9724654298442 -124.48202726980841 -48.80000000000003
+ vertex -149.972465429844 -122.69613774197249 -46.345481322062625
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298442 -122.68202726980844 -47.00000000000007
+ vertex -149.9724654298442 -124.48202726980841 -48.80000000000003
+ vertex -149.972465429844 -122.2820272698084 -46.40000000000013
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298442 -120.08202726980846 -46.434314575050806
+ vertex -149.9724654298442 -122.68202726980844 -47.00000000000007
+ vertex -149.972465429844 -122.2820272698084 -46.40000000000013
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298442 -124.08202726980844 -48.80000000000003
+ vertex -149.9724654298442 -124.48202726980841 -48.80000000000003
+ vertex -149.9724654298442 -122.68202726980844 -47.00000000000007
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298442 -122.68202726980844 -49.20000000000007
+ vertex -149.9724654298442 -124.08202726980844 -48.80000000000003
+ vertex -149.9724654298442 -122.68202726980844 -47.00000000000007
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298442 -124.08202726980842 -49.20000000000003
+ vertex -149.9724654298442 -124.08202726980844 -48.80000000000003
+ vertex -149.9724654298442 -122.68202726980844 -49.20000000000007
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984487 -111.34771269475767 -56.30000000000007
+ vertex -149.9724654298446 -117.61634184485915 -56.300000000000075
+ vertex -149.9724654298446 -118.18202726980843 -55.734314575050846
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984465 -120.6477126947577 -58.20000000000009
+ vertex -149.9724654298446 -118.18202726980843 -55.734314575050846
+ vertex -149.9724654298446 -117.61634184485915 -56.300000000000075
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984465 -120.08202726980842 -58.76568542494932
+ vertex -149.97246542984465 -120.6477126947577 -58.20000000000009
+ vertex -149.9724654298446 -117.61634184485915 -56.300000000000075
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298443 -124.08202726980846 -56.00000000000008
+ vertex -149.97246542984445 -122.68202726980844 -56.00000000000009
+ vertex -149.97246542984442 -124.08202726980844 -56.40000000000008
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984445 -122.68202726980844 -58.20000000000009
+ vertex -149.97246542984442 -124.08202726980844 -56.40000000000008
+ vertex -149.97246542984445 -122.68202726980844 -56.00000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984445 -114.48202726980843 -49.90000000000009
+ vertex -149.97246542984445 -115.18083869158525 -49.99200026901961
+ vertex -149.97246542984436 -118.18202726980843 -49.46568542494934
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984445 -115.83202726980844 -50.26173140978212
+ vertex -149.97246542984436 -118.18202726980843 -49.46568542494934
+ vertex -149.97246542984445 -115.18083869158525 -49.99200026901961
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984445 -116.39121557901213 -50.690811690796394
+ vertex -149.97246542984436 -118.18202726980843 -49.46568542494934
+ vertex -149.97246542984445 -115.83202726980844 -50.26173140978212
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984445 -116.82029586002645 -51.25000000000008
+ vertex -149.97246542984436 -118.18202726980843 -49.46568542494934
+ vertex -149.97246542984445 -116.39121557901213 -50.690811690796394
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984445 -117.09002700078894 -51.901188578223284
+ vertex -149.97246542984436 -118.18202726980843 -49.46568542494934
+ vertex -149.97246542984445 -116.82029586002645 -51.25000000000008
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298446 -118.18202726980843 -55.734314575050846
+ vertex -149.97246542984436 -118.18202726980843 -49.46568542494934
+ vertex -149.97246542984445 -117.09002700078894 -51.901188578223284
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298445 -117.18202726980847 -52.60000000000009
+ vertex -149.9724654298446 -118.18202726980843 -55.734314575050846
+ vertex -149.97246542984445 -117.09002700078894 -51.901188578223284
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984442 -117.09002700078892 -53.29881142177688
+ vertex -149.9724654298446 -118.18202726980843 -55.734314575050846
+ vertex -149.9724654298445 -117.18202726980847 -52.60000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984453 -116.82029586002643 -53.950000000000095
+ vertex -149.9724654298446 -118.18202726980843 -55.734314575050846
+ vertex -149.97246542984442 -117.09002700078892 -53.29881142177688
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984465 -116.39121557901213 -54.50918830920377
+ vertex -149.9724654298446 -118.18202726980843 -55.734314575050846
+ vertex -149.97246542984453 -116.82029586002643 -53.950000000000095
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984453 -115.83202726980842 -54.93826859021806
+ vertex -149.9724654298446 -118.18202726980843 -55.734314575050846
+ vertex -149.97246542984465 -116.39121557901213 -54.50918830920377
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984468 -115.18083869158525 -55.20799973098057
+ vertex -149.9724654298446 -118.18202726980843 -55.734314575050846
+ vertex -149.97246542984453 -115.83202726980842 -54.93826859021806
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984468 -114.48202726980841 -55.30000000000008
+ vertex -149.9724654298446 -118.18202726980843 -55.734314575050846
+ vertex -149.97246542984468 -115.18083869158525 -55.20799973098057
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984473 -110.78202726980844 -55.734314575050796
+ vertex -149.9724654298446 -118.18202726980843 -55.734314575050846
+ vertex -149.97246542984468 -114.48202726980841 -55.30000000000008
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984487 -111.34771269475767 -56.30000000000007
+ vertex -149.9724654298446 -118.18202726980843 -55.734314575050846
+ vertex -149.97246542984473 -110.78202726980844 -55.734314575050796
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984496 -108.31634184485918 -58.200000000000074
+ vertex -149.97246542984487 -111.34771269475767 -56.30000000000007
+ vertex -149.97246542984473 -110.78202726980844 -55.734314575050796
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984496 -108.88202726980845 -58.76568542494933
+ vertex -149.97246542984487 -111.34771269475767 -56.30000000000007
+ vertex -149.97246542984496 -108.31634184485918 -58.200000000000074
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984504 -106.28202726980845 -58.200000000000074
+ vertex -149.97246542984496 -108.88202726980845 -58.76568542494933
+ vertex -149.97246542984496 -108.31634184485918 -58.200000000000074
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984496 -111.08202726980844 -60.80000000000006
+ vertex -149.97246542984504 -108.8820272698084 -60.80000000000007
+ vertex -149.97246542984504 -111.08202726980844 -62.20000000000008
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984504 -108.22750859187093 -60.814110472164124
+ vertex -149.97246542984504 -111.08202726980844 -62.20000000000008
+ vertex -149.97246542984504 -108.8820272698084 -60.80000000000007
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.972465429845 -108.06766791586358 -61.20000000000009
+ vertex -149.97246542984504 -111.08202726980844 -62.20000000000008
+ vertex -149.97246542984504 -108.22750859187093 -60.814110472164124
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984513 -107.81339811970692 -61.531370849898586
+ vertex -149.97246542984504 -111.08202726980844 -62.20000000000008
+ vertex -149.972465429845 -108.06766791586358 -61.20000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984513 -107.48202726980843 -61.7856406460552
+ vertex -149.97246542984504 -111.08202726980844 -62.20000000000008
+ vertex -149.97246542984513 -107.81339811970692 -61.531370849898586
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984513 -107.09613774197244 -61.94548132206259
+ vertex -149.97246542984504 -111.08202726980844 -62.20000000000008
+ vertex -149.97246542984513 -107.48202726980843 -61.7856406460552
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984513 -106.6820272698084 -62.00000000000009
+ vertex -149.97246542984504 -111.08202726980844 -62.20000000000008
+ vertex -149.97246542984513 -107.09613774197244 -61.94548132206259
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984522 -104.61600186602399 -62.1000000000001
+ vertex -149.97246542984504 -111.08202726980844 -62.20000000000008
+ vertex -149.97246542984513 -106.6820272698084 -62.00000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984504 -110.68202726980842 -62.20000000000009
+ vertex -149.97246542984504 -111.08202726980844 -62.20000000000008
+ vertex -149.97246542984522 -104.61600186602399 -62.1000000000001
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984513 -104.77492048862187 -62.307106781186654
+ vertex -149.97246542984504 -110.68202726980842 -62.20000000000009
+ vertex -149.97246542984522 -104.61600186602399 -62.1000000000001
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984504 -110.68202726980846 -62.60000000000009
+ vertex -149.97246542984504 -110.68202726980842 -62.20000000000009
+ vertex -149.97246542984513 -104.77492048862187 -62.307106781186654
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984527 -104.98202726980846 -62.466025403784535
+ vertex -149.97246542984504 -110.68202726980846 -62.60000000000009
+ vertex -149.97246542984513 -104.77492048862187 -62.307106781186654
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984522 -105.22320822470594 -62.56592582628915
+ vertex -149.97246542984504 -110.68202726980846 -62.60000000000009
+ vertex -149.97246542984527 -104.98202726980846 -62.466025403784535
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984522 -105.48202726980847 -62.60000000000009
+ vertex -149.97246542984504 -110.68202726980846 -62.60000000000009
+ vertex -149.97246542984522 -105.22320822470594 -62.56592582628915
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984496 -106.28202726980842 -56.00000000000008
+ vertex -149.972465429845 -104.8820272698084 -56.000000000000114
+ vertex -149.97246542984504 -106.28202726980845 -58.200000000000074
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.972465429845 -104.88202726980843 -56.40000000000011
+ vertex -149.97246542984504 -106.28202726980845 -58.200000000000074
+ vertex -149.972465429845 -104.8820272698084 -56.000000000000114
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984504 -104.48202726980846 -56.40000000000011
+ vertex -149.97246542984504 -106.28202726980845 -58.200000000000074
+ vertex -149.972465429845 -104.88202726980843 -56.40000000000011
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.972465429845 -105.29638662375334 -59.60000000000007
+ vertex -149.97246542984504 -106.28202726980845 -58.200000000000074
+ vertex -149.97246542984504 -104.48202726980846 -56.40000000000011
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984513 -105.13654594774594 -59.98588952783604
+ vertex -149.972465429845 -105.29638662375334 -59.60000000000007
+ vertex -149.97246542984504 -104.48202726980846 -56.40000000000011
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984522 -104.48202726980846 -61.6000000000001
+ vertex -149.97246542984513 -105.13654594774594 -59.98588952783604
+ vertex -149.97246542984504 -104.48202726980846 -56.40000000000011
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984507 -105.55065641990993 -59.2686291501016
+ vertex -149.97246542984504 -106.28202726980845 -58.200000000000074
+ vertex -149.972465429845 -105.29638662375334 -59.60000000000007
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984504 -105.8820272698084 -59.01435935394496
+ vertex -149.97246542984504 -106.28202726980845 -58.200000000000074
+ vertex -149.97246542984507 -105.55065641990993 -59.2686291501016
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984504 -106.26791679764439 -58.85451867793757
+ vertex -149.97246542984504 -106.28202726980845 -58.200000000000074
+ vertex -149.97246542984504 -105.8820272698084 -59.01435935394496
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984507 -106.68202726980849 -58.800000000000075
+ vertex -149.97246542984504 -106.28202726980845 -58.200000000000074
+ vertex -149.97246542984504 -106.26791679764439 -58.85451867793757
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984496 -108.88202726980845 -58.76568542494933
+ vertex -149.97246542984504 -106.28202726980845 -58.200000000000074
+ vertex -149.97246542984507 -106.68202726980849 -58.800000000000075
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984504 -105.08202726980842 -60.40000000000007
+ vertex -149.97246542984513 -105.13654594774594 -59.98588952783604
+ vertex -149.97246542984522 -104.48202726980846 -61.6000000000001
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984513 -105.1365459477459 -60.8141104721641
+ vertex -149.97246542984504 -105.08202726980842 -60.40000000000007
+ vertex -149.97246542984522 -104.48202726980846 -61.6000000000001
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984507 -105.29638662375336 -61.20000000000007
+ vertex -149.97246542984513 -105.1365459477459 -60.8141104721641
+ vertex -149.97246542984522 -104.48202726980846 -61.6000000000001
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298452 -105.55065641990993 -61.531370849898536
+ vertex -149.97246542984507 -105.29638662375336 -61.20000000000007
+ vertex -149.97246542984522 -104.48202726980846 -61.6000000000001
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298452 -105.88202726980843 -61.78564064605518
+ vertex -149.9724654298452 -105.55065641990993 -61.531370849898536
+ vertex -149.97246542984522 -104.48202726980846 -61.6000000000001
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984513 -104.51610144351935 -61.858819045102614
+ vertex -149.9724654298452 -105.88202726980843 -61.78564064605518
+ vertex -149.97246542984522 -104.48202726980846 -61.6000000000001
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984522 -106.26791679764439 -61.94548132206259
+ vertex -149.9724654298452 -105.88202726980843 -61.78564064605518
+ vertex -149.97246542984513 -104.51610144351935 -61.858819045102614
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984522 -104.61600186602399 -62.1000000000001
+ vertex -149.97246542984522 -106.26791679764439 -61.94548132206259
+ vertex -149.97246542984513 -104.51610144351935 -61.858819045102614
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984513 -106.6820272698084 -62.00000000000009
+ vertex -149.97246542984522 -106.26791679764439 -61.94548132206259
+ vertex -149.97246542984522 -104.61600186602399 -62.1000000000001
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984507 -106.68202726980849 -58.800000000000075
+ vertex -149.97246542984496 -107.09613774197248 -58.85451867793757
+ vertex -149.97246542984496 -108.88202726980845 -58.76568542494933
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984504 -107.48202726980844 -59.01435935394498
+ vertex -149.97246542984496 -108.88202726980845 -58.76568542494933
+ vertex -149.97246542984496 -107.09613774197248 -58.85451867793757
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298449 -107.81339811970695 -59.268629150101624
+ vertex -149.97246542984496 -108.88202726980845 -58.76568542494933
+ vertex -149.97246542984504 -107.48202726980844 -59.01435935394498
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.972465429845 -108.06766791586355 -59.600000000000094
+ vertex -149.97246542984496 -108.88202726980845 -58.76568542494933
+ vertex -149.9724654298449 -107.81339811970695 -59.268629150101624
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984504 -108.8820272698084 -60.80000000000007
+ vertex -149.97246542984496 -108.88202726980845 -58.76568542494933
+ vertex -149.972465429845 -108.06766791586355 -59.600000000000094
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984507 -108.22750859187097 -59.98588952783606
+ vertex -149.97246542984504 -108.8820272698084 -60.80000000000007
+ vertex -149.972465429845 -108.06766791586355 -59.600000000000094
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984496 -108.28202726980844 -60.40000000000009
+ vertex -149.97246542984504 -108.8820272698084 -60.80000000000007
+ vertex -149.97246542984507 -108.22750859187097 -59.98588952783606
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984504 -108.22750859187093 -60.814110472164124
+ vertex -149.97246542984504 -108.8820272698084 -60.80000000000007
+ vertex -149.97246542984496 -108.28202726980844 -60.40000000000009
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984428 -117.61634184485919 -48.90000000000006
+ vertex -149.9724654298442 -120.64771269475769 -47.00000000000008
+ vertex -149.9724654298442 -120.08202726980846 -46.434314575050806
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298442 -122.68202726980844 -47.00000000000007
+ vertex -149.9724654298442 -120.08202726980846 -46.434314575050806
+ vertex -149.9724654298442 -120.64771269475769 -47.00000000000008
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984436 -118.18202726980843 -49.46568542494934
+ vertex -149.9724654298442 -120.64771269475769 -47.00000000000008
+ vertex -149.97246542984428 -117.61634184485919 -48.90000000000006
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984445 -111.3477126947577 -48.900000000000105
+ vertex -149.97246542984436 -118.18202726980843 -49.46568542494934
+ vertex -149.97246542984428 -117.61634184485919 -48.90000000000006
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298446 -110.78202726980844 -49.465685424949335
+ vertex -149.97246542984436 -118.18202726980843 -49.46568542494934
+ vertex -149.97246542984445 -111.3477126947577 -48.900000000000105
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984445 -114.48202726980843 -49.90000000000009
+ vertex -149.97246542984436 -118.18202726980843 -49.46568542494934
+ vertex -149.9724654298446 -110.78202726980844 -49.465685424949335
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298445 -113.78321584803162 -49.9920002690196
+ vertex -149.97246542984445 -114.48202726980843 -49.90000000000009
+ vertex -149.9724654298446 -110.78202726980844 -49.465685424949335
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984453 -113.13202726980845 -50.26173140978211
+ vertex -149.9724654298445 -113.78321584803162 -49.9920002690196
+ vertex -149.9724654298446 -110.78202726980844 -49.465685424949335
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984445 -112.57283896060474 -50.690811690796394
+ vertex -149.97246542984453 -113.13202726980845 -50.26173140978211
+ vertex -149.9724654298446 -110.78202726980844 -49.465685424949335
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298446 -112.14375867959048 -51.25000000000008
+ vertex -149.97246542984445 -112.57283896060474 -50.690811690796394
+ vertex -149.9724654298446 -110.78202726980844 -49.465685424949335
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984465 -111.87402753882795 -51.90118857822331
+ vertex -149.9724654298446 -112.14375867959048 -51.25000000000008
+ vertex -149.9724654298446 -110.78202726980844 -49.465685424949335
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984473 -110.78202726980844 -55.734314575050796
+ vertex -149.97246542984465 -111.87402753882795 -51.90118857822331
+ vertex -149.9724654298446 -110.78202726980844 -49.465685424949335
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984465 -111.78202726980844 -52.60000000000011
+ vertex -149.97246542984465 -111.87402753882795 -51.90118857822331
+ vertex -149.97246542984473 -110.78202726980844 -55.734314575050796
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984473 -111.87402753882799 -53.298811421776925
+ vertex -149.97246542984465 -111.78202726980844 -52.60000000000011
+ vertex -149.97246542984473 -110.78202726980844 -55.734314575050796
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984468 -112.14375867959046 -53.95000000000012
+ vertex -149.97246542984473 -111.87402753882799 -53.298811421776925
+ vertex -149.97246542984473 -110.78202726980844 -55.734314575050796
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984473 -112.57283896060477 -54.50918830920379
+ vertex -149.97246542984468 -112.14375867959046 -53.95000000000012
+ vertex -149.97246542984473 -110.78202726980844 -55.734314575050796
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984473 -113.13202726980845 -54.93826859021808
+ vertex -149.97246542984473 -112.57283896060477 -54.50918830920379
+ vertex -149.97246542984473 -110.78202726980844 -55.734314575050796
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984473 -113.78321584803163 -55.20799973098057
+ vertex -149.97246542984473 -113.13202726980845 -54.93826859021808
+ vertex -149.97246542984473 -110.78202726980844 -55.734314575050796
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.97246542984468 -114.48202726980841 -55.30000000000008
+ vertex -149.97246542984473 -113.78321584803163 -55.20799973098057
+ vertex -149.97246542984473 -110.78202726980844 -55.734314575050796
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298445 -108.88202726980842 -46.434314575050855
+ vertex -149.9724654298446 -108.31634184485917 -47.00000000000008
+ vertex -149.97246542984445 -111.3477126947577 -48.900000000000105
+ endloop
+endfacet
+facet normal -1.0 -6.470535773850401e-16 2.97504977010331e-16
+ outer loop
+ vertex -149.9724654298446 -110.78202726980844 -49.465685424949335
+ vertex -149.97246542984445 -111.3477126947577 -48.900000000000105
+ vertex -149.9724654298446 -108.31634184485917 -47.00000000000008
+ endloop
+endfacet
+facet normal 1.0 6.456745138550019e-16 -2.970018574227154e-16
+ outer loop
+ vertex 150.0275345701538 -106.68202726980832 -58.80000000000016
+ vertex 150.0275345701538 -107.09613774197234 -58.854518677937655
+ vertex 150.0275345701538 -106.26791679764426 -58.854518677937655
+ endloop
+endfacet
+facet normal 1.0 6.456745138550019e-16 -2.970018574227154e-16
+ outer loop
+ vertex 150.0275345701538 -105.88202726980832 -59.01435935394505
+ vertex 150.0275345701538 -106.26791679764426 -58.854518677937655
+ vertex 150.0275345701538 -107.09613774197234 -58.854518677937655
+ endloop
+endfacet
+facet normal 1.0 6.456745138550019e-16 -2.970018574227154e-16
+ outer loop
+ vertex 150.02753457015385 -107.48202726980831 -59.014359353945075
+ vertex 150.0275345701538 -105.88202726980832 -59.01435935394505
+ vertex 150.0275345701538 -107.09613774197234 -58.854518677937655
+ endloop
+endfacet
+facet normal 1.0 6.456745138550019e-16 -2.970018574227154e-16
+ outer loop
+ vertex 150.02753457015373 -105.55065641990981 -59.26862915010169
+ vertex 150.0275345701538 -105.88202726980832 -59.01435935394505
+ vertex 150.02753457015385 -107.48202726980831 -59.014359353945075
+ endloop
+endfacet
+facet normal 1.0 6.456745138550019e-16 -2.970018574227154e-16
+ outer loop
+ vertex 150.02753457015382 -107.81339811970678 -59.26862915010171
+ vertex 150.02753457015373 -105.55065641990981 -59.26862915010169
+ vertex 150.02753457015385 -107.48202726980831 -59.014359353945075
+ endloop
+endfacet
+facet normal 1.0 6.456745138550019e-16 -2.970018574227154e-16
+ outer loop
+ vertex 150.02753457015373 -105.29638662375318 -59.600000000000165
+ vertex 150.02753457015373 -105.55065641990981 -59.26862915010169
+ vertex 150.02753457015382 -107.81339811970678 -59.26862915010171
+ endloop
+endfacet
+facet normal 1.0 6.456745138550019e-16 -2.970018574227154e-16
+ outer loop
+ vertex 150.02753457015382 -108.0676679158634 -59.600000000000186
+ vertex 150.02753457015373 -105.29638662375318 -59.600000000000165
+ vertex 150.02753457015382 -107.81339811970678 -59.26862915010171
+ endloop
+endfacet
+facet normal 1.0 6.456745138550019e-16 -2.970018574227154e-16
+ outer loop
+ vertex 150.02753457015373 -105.13654594774579 -59.98588952783613
+ vertex 150.02753457015373 -105.29638662375318 -59.600000000000165
+ vertex 150.02753457015382 -108.0676679158634 -59.600000000000186
+ endloop
+endfacet
+facet normal 1.0 6.456745138550019e-16 -2.970018574227154e-16
+ outer loop
+ vertex 150.02753457015382 -108.22750859187082 -59.98588952783615
+ vertex 150.02753457015373 -105.13654594774579 -59.98588952783613
+ vertex 150.02753457015382 -108.0676679158634 -59.600000000000186
+ endloop
+endfacet
+facet normal 1.0 6.456745138550019e-16 -2.970018574227154e-16
+ outer loop
+ vertex 150.02753457015368 -105.0820272698083 -60.40000000000016
+ vertex 150.02753457015373 -105.13654594774579 -59.98588952783613
+ vertex 150.02753457015382 -108.22750859187082 -59.98588952783615
+ endloop
+endfacet
+facet normal 1.0 6.456745138550019e-16 -2.970018574227154e-16
+ outer loop
+ vertex 150.0275345701538 -108.28202726980827 -60.40000000000018
+ vertex 150.02753457015368 -105.0820272698083 -60.40000000000016
+ vertex 150.02753457015382 -108.22750859187082 -59.98588952783615
+ endloop
+endfacet
+facet normal 1.0 6.456745138550019e-16 -2.970018574227154e-16
+ outer loop
+ vertex 150.0275345701537 -105.13654594774579 -60.814110472164195
+ vertex 150.02753457015368 -105.0820272698083 -60.40000000000016
+ vertex 150.0275345701538 -108.28202726980827 -60.40000000000018
+ endloop
+endfacet
+facet normal 1.0 6.456745138550019e-16 -2.970018574227154e-16
+ outer loop
+ vertex 150.0275345701538 -108.22750859187082 -60.81411047216422
+ vertex 150.0275345701537 -105.13654594774579 -60.814110472164195
+ vertex 150.0275345701538 -108.28202726980827 -60.40000000000018
+ endloop
+endfacet
+facet normal 1.0 6.456745138550019e-16 -2.970018574227154e-16
+ outer loop
+ vertex 150.02753457015368 -105.29638662375318 -61.20000000000016
+ vertex 150.0275345701537 -105.13654594774579 -60.814110472164195
+ vertex 150.0275345701538 -108.22750859187082 -60.81411047216422
+ endloop
+endfacet
+facet normal 1.0 6.456745138550019e-16 -2.970018574227154e-16
+ outer loop
+ vertex 150.0275345701538 -108.0676679158634 -61.20000000000018
+ vertex 150.02753457015368 -105.29638662375318 -61.20000000000016
+ vertex 150.0275345701538 -108.22750859187082 -60.81411047216422
+ endloop
+endfacet
+facet normal 1.0 6.456745138550019e-16 -2.970018574227154e-16
+ outer loop
+ vertex 150.02753457015368 -105.5506564199098 -61.53137084989863
+ vertex 150.02753457015368 -105.29638662375318 -61.20000000000016
+ vertex 150.0275345701538 -108.0676679158634 -61.20000000000018
+ endloop
+endfacet
+facet normal 1.0 6.456745138550019e-16 -2.970018574227154e-16
+ outer loop
+ vertex 150.02753457015373 -107.81339811970676 -61.53137084989868
+ vertex 150.02753457015368 -105.5506564199098 -61.53137084989863
+ vertex 150.0275345701538 -108.0676679158634 -61.20000000000018
+ endloop
+endfacet
+facet normal 1.0 6.456745138550019e-16 -2.970018574227154e-16
+ outer loop
+ vertex 150.02753457015368 -105.88202726980826 -61.78564064605527
+ vertex 150.02753457015368 -105.5506564199098 -61.53137084989863
+ vertex 150.02753457015373 -107.81339811970676 -61.53137084989868
+ endloop
+endfacet
+facet normal 1.0 6.456745138550019e-16 -2.970018574227154e-16
+ outer loop
+ vertex 150.0275345701537 -107.48202726980828 -61.78564064605529
+ vertex 150.02753457015368 -105.88202726980826 -61.78564064605527
+ vertex 150.02753457015373 -107.81339811970676 -61.53137084989868
+ endloop
+endfacet
+facet normal 1.0 6.456745138550019e-16 -2.970018574227154e-16
+ outer loop
+ vertex 150.02753457015365 -106.26791679764423 -61.94548132206268
+ vertex 150.02753457015368 -105.88202726980826 -61.78564064605527
+ vertex 150.0275345701537 -107.48202726980828 -61.78564064605529
+ endloop
+endfacet
+facet normal 1.0 6.456745138550019e-16 -2.970018574227154e-16
+ outer loop
+ vertex 150.0275345701537 -107.09613774197227 -61.94548132206268
+ vertex 150.02753457015365 -106.26791679764423 -61.94548132206268
+ vertex 150.0275345701537 -107.48202726980828 -61.78564064605529
+ endloop
+endfacet
+facet normal 1.0 6.456745138550019e-16 -2.970018574227154e-16
+ outer loop
+ vertex 150.0275345701537 -106.68202726980827 -62.00000000000018
+ vertex 150.02753457015365 -106.26791679764423 -61.94548132206268
+ vertex 150.0275345701537 -107.09613774197227 -61.94548132206268
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015464 -117.8820272698084 -21.199999999999967
+ vertex 150.02753457015467 -118.28202726980835 -22.599999999999966
+ vertex 150.02753457015467 -117.88202726980836 -22.599999999999966
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015467 -118.28202726980835 -22.599999999999966
+ vertex 150.02753457015464 -117.8820272698084 -21.199999999999967
+ vertex 150.02753457015476 -121.86791679764441 -22.34548132206245
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015467 -118.28202726980835 -22.599999999999966
+ vertex 150.02753457015476 -121.86791679764441 -22.34548132206245
+ vertex 150.02753457015478 -122.28202726980842 -22.399999999999945
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015467 -118.28202726980835 -22.599999999999966
+ vertex 150.02753457015478 -122.28202726980842 -22.399999999999945
+ vertex 150.02753457015487 -124.34805267359283 -22.49999999999997
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015476 -121.86791679764441 -22.34548132206245
+ vertex 150.02753457015464 -117.8820272698084 -21.199999999999967
+ vertex 150.02753457015476 -121.4820272698084 -22.18564064605505
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015476 -121.4820272698084 -22.18564064605505
+ vertex 150.02753457015464 -117.8820272698084 -21.199999999999967
+ vertex 150.02753457015473 -121.15065641990992 -21.93137084989843
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015473 -121.15065641990992 -21.93137084989843
+ vertex 150.02753457015464 -117.8820272698084 -21.199999999999967
+ vertex 150.02753457015473 -120.89638662375329 -21.599999999999934
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015473 -120.89638662375329 -21.599999999999934
+ vertex 150.02753457015464 -117.8820272698084 -21.199999999999967
+ vertex 150.02753457015473 -120.7365459477459 -21.21411047216397
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015473 -120.7365459477459 -21.21411047216397
+ vertex 150.02753457015464 -117.8820272698084 -21.199999999999967
+ vertex 150.0275345701547 -120.0820272698084 -21.199999999999957
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015473 -120.7365459477459 -21.21411047216397
+ vertex 150.0275345701547 -120.0820272698084 -21.199999999999957
+ vertex 150.0275345701547 -120.6820272698084 -20.799999999999937
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701547 -120.6820272698084 -20.799999999999937
+ vertex 150.0275345701547 -120.0820272698084 -21.199999999999957
+ vertex 150.02753457015456 -120.0820272698084 -19.165685424949217
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701547 -120.6820272698084 -20.799999999999937
+ vertex 150.02753457015456 -120.0820272698084 -19.165685424949217
+ vertex 150.02753457015467 -120.7365459477459 -20.385889527835904
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015467 -120.7365459477459 -20.385889527835904
+ vertex 150.02753457015456 -120.0820272698084 -19.165685424949217
+ vertex 150.02753457015467 -120.89638662375332 -19.99999999999994
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015467 -120.89638662375332 -19.99999999999994
+ vertex 150.02753457015456 -120.0820272698084 -19.165685424949217
+ vertex 150.02753457015467 -121.15065641990991 -19.668629150101474
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015467 -121.15065641990991 -19.668629150101474
+ vertex 150.02753457015456 -120.0820272698084 -19.165685424949217
+ vertex 150.02753457015464 -121.4820272698084 -19.414359353944835
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015464 -121.4820272698084 -19.414359353944835
+ vertex 150.02753457015456 -120.0820272698084 -19.165685424949217
+ vertex 150.02753457015467 -121.86791679764434 -19.254518677937423
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015467 -121.86791679764434 -19.254518677937423
+ vertex 150.02753457015456 -120.0820272698084 -19.165685424949217
+ vertex 150.02753457015464 -122.28202726980837 -19.19999999999993
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015433 -105.2232082247059 -22.965925826289016
+ vertex 150.0275345701545 -110.6820272698084 -22.999999999999954
+ vertex 150.02753457015433 -105.48202726980843 -22.999999999999954
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701545 -110.6820272698084 -22.999999999999954
+ vertex 150.02753457015433 -105.2232082247059 -22.965925826289016
+ vertex 150.02753457015444 -110.68202726980837 -22.599999999999955
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015444 -110.68202726980837 -22.599999999999955
+ vertex 150.02753457015433 -105.2232082247059 -22.965925826289016
+ vertex 150.02753457015433 -104.98202726980841 -22.866025403784388
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015444 -110.68202726980837 -22.599999999999955
+ vertex 150.02753457015433 -104.98202726980841 -22.866025403784388
+ vertex 150.0275345701543 -104.77492048862183 -22.7071067811865
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015444 -110.68202726980837 -22.599999999999955
+ vertex 150.0275345701543 -104.77492048862183 -22.7071067811865
+ vertex 150.0275345701543 -104.61600186602392 -22.49999999999995
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015444 -110.68202726980837 -22.599999999999955
+ vertex 150.0275345701543 -104.61600186602392 -22.49999999999995
+ vertex 150.02753457015447 -111.08202726980838 -22.59999999999996
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015447 -111.08202726980838 -22.59999999999996
+ vertex 150.0275345701543 -104.61600186602392 -22.49999999999995
+ vertex 150.02753457015433 -106.68202726980839 -22.399999999999952
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015447 -111.08202726980838 -22.59999999999996
+ vertex 150.02753457015433 -106.68202726980839 -22.399999999999952
+ vertex 150.02753457015433 -107.09613774197244 -22.345481322062458
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015447 -111.08202726980838 -22.59999999999996
+ vertex 150.02753457015433 -107.09613774197244 -22.345481322062458
+ vertex 150.02753457015444 -111.08202726980835 -21.19999999999996
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015444 -111.08202726980835 -21.19999999999996
+ vertex 150.02753457015433 -107.09613774197244 -22.345481322062458
+ vertex 150.0275345701544 -107.48202726980838 -22.185640646055052
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015444 -111.08202726980835 -21.19999999999996
+ vertex 150.0275345701544 -107.48202726980838 -22.185640646055052
+ vertex 150.02753457015433 -107.81339811970687 -21.931370849898414
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015444 -111.08202726980835 -21.19999999999996
+ vertex 150.02753457015433 -107.81339811970687 -21.931370849898414
+ vertex 150.02753457015433 -108.06766791586351 -21.599999999999945
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015444 -111.08202726980835 -21.19999999999996
+ vertex 150.02753457015433 -108.06766791586351 -21.599999999999945
+ vertex 150.02753457015433 -108.2275085918709 -21.21411047216398
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015444 -111.08202726980835 -21.19999999999996
+ vertex 150.02753457015433 -108.2275085918709 -21.21411047216398
+ vertex 150.02753457015433 -108.8820272698084 -21.199999999999946
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015433 -108.8820272698084 -21.199999999999946
+ vertex 150.02753457015433 -108.2275085918709 -21.21411047216398
+ vertex 150.02753457015433 -108.2820272698084 -20.799999999999926
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015433 -108.8820272698084 -21.199999999999946
+ vertex 150.02753457015433 -108.2820272698084 -20.799999999999926
+ vertex 150.02753457015427 -108.88202726980838 -19.165685424949185
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -108.88202726980838 -19.165685424949185
+ vertex 150.02753457015433 -108.2820272698084 -20.799999999999926
+ vertex 150.02753457015433 -108.2275085918709 -20.385889527835893
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -108.88202726980838 -19.165685424949185
+ vertex 150.02753457015433 -108.2275085918709 -20.385889527835893
+ vertex 150.0275345701543 -108.06766791586348 -19.999999999999925
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -108.88202726980838 -19.165685424949185
+ vertex 150.0275345701543 -108.06766791586348 -19.999999999999925
+ vertex 150.02753457015427 -107.81339811970685 -19.668629150101452
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -108.88202726980838 -19.165685424949185
+ vertex 150.02753457015427 -107.81339811970685 -19.668629150101452
+ vertex 150.02753457015424 -107.48202726980838 -19.41435935394484
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -108.88202726980838 -19.165685424949185
+ vertex 150.02753457015424 -107.48202726980838 -19.41435935394484
+ vertex 150.02753457015422 -107.09613774197241 -19.254518677937433
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -108.88202726980838 -19.165685424949185
+ vertex 150.02753457015422 -107.09613774197241 -19.254518677937433
+ vertex 150.02753457015422 -106.68202726980839 -19.19999999999996
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015365 -104.48202726980841 -3.999999999999939
+ vertex 150.02753457015385 -104.88202726980839 -9.19999999999993
+ vertex 150.0275345701538 -104.48202726980841 -9.19999999999993
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015385 -104.88202726980839 -9.19999999999993
+ vertex 150.02753457015365 -104.48202726980841 -3.999999999999939
+ vertex 150.0275345701537 -105.1365459477459 -5.614110472163994
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015385 -104.88202726980839 -9.19999999999993
+ vertex 150.0275345701537 -105.1365459477459 -5.614110472163994
+ vertex 150.0275345701537 -105.29638662375329 -5.999999999999961
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015385 -104.88202726980839 -9.19999999999993
+ vertex 150.0275345701537 -105.29638662375329 -5.999999999999961
+ vertex 150.0275345701538 -106.28202726980842 -7.399999999999959
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701538 -106.28202726980842 -7.399999999999959
+ vertex 150.0275345701537 -105.29638662375329 -5.999999999999961
+ vertex 150.0275345701537 -105.55065641990993 -6.331370849898432
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701538 -106.28202726980842 -7.399999999999959
+ vertex 150.0275345701537 -105.55065641990993 -6.331370849898432
+ vertex 150.02753457015376 -105.88202726980843 -6.58564064605507
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701538 -106.28202726980842 -7.399999999999959
+ vertex 150.02753457015376 -105.88202726980843 -6.58564064605507
+ vertex 150.02753457015376 -106.26791679764438 -6.745481322062464
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701538 -106.28202726980842 -7.399999999999959
+ vertex 150.02753457015376 -106.26791679764438 -6.745481322062464
+ vertex 150.02753457015388 -108.31634184485917 -7.399999999999961
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015388 -108.31634184485917 -7.399999999999961
+ vertex 150.02753457015376 -106.26791679764438 -6.745481322062464
+ vertex 150.0275345701538 -106.68202726980843 -6.799999999999959
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015388 -108.31634184485917 -7.399999999999961
+ vertex 150.0275345701538 -106.68202726980843 -6.799999999999959
+ vertex 150.02753457015385 -108.8820272698084 -6.834314575050704
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701537 -105.1365459477459 -5.614110472163994
+ vertex 150.02753457015365 -104.48202726980841 -3.999999999999939
+ vertex 150.02753457015368 -105.0820272698084 -5.199999999999962
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015368 -105.0820272698084 -5.199999999999962
+ vertex 150.02753457015365 -104.48202726980841 -3.999999999999939
+ vertex 150.02753457015368 -105.1365459477459 -4.785889527835931
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015368 -105.1365459477459 -4.785889527835931
+ vertex 150.02753457015365 -104.48202726980841 -3.999999999999939
+ vertex 150.02753457015368 -105.29638662375329 -4.399999999999964
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015368 -105.29638662375329 -4.399999999999964
+ vertex 150.02753457015365 -104.48202726980841 -3.999999999999939
+ vertex 150.02753457015365 -105.55065641990991 -4.068629150101493
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015365 -105.55065641990991 -4.068629150101493
+ vertex 150.02753457015365 -104.48202726980841 -3.999999999999939
+ vertex 150.02753457015368 -105.88202726980838 -3.8143593539448553
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015368 -105.88202726980838 -3.8143593539448553
+ vertex 150.02753457015365 -104.48202726980841 -3.999999999999939
+ vertex 150.02753457015356 -104.51610144351935 -3.7411809548974277
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015368 -105.88202726980838 -3.8143593539448553
+ vertex 150.02753457015356 -104.51610144351935 -3.7411809548974277
+ vertex 150.02753457015362 -106.26791679764435 -3.654518677937438
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015362 -106.26791679764435 -3.654518677937438
+ vertex 150.02753457015356 -104.51610144351935 -3.7411809548974277
+ vertex 150.0275345701536 -104.61600186602396 -3.49999999999994
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015362 -106.26791679764435 -3.654518677937438
+ vertex 150.0275345701536 -104.61600186602396 -3.49999999999994
+ vertex 150.02753457015368 -106.68202726980839 -3.599999999999943
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015385 -108.8820272698084 -6.834314575050704
+ vertex 150.0275345701538 -108.06766791586351 -5.999999999999941
+ vertex 150.02753457015376 -108.8820272698084 -4.799999999999966
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701538 -108.06766791586351 -5.999999999999941
+ vertex 150.02753457015385 -108.8820272698084 -6.834314575050704
+ vertex 150.0275345701538 -107.81339811970689 -6.331370849898409
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701538 -107.81339811970689 -6.331370849898409
+ vertex 150.02753457015385 -108.8820272698084 -6.834314575050704
+ vertex 150.02753457015382 -107.48202726980843 -6.5856406460550465
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015382 -107.48202726980843 -6.5856406460550465
+ vertex 150.02753457015385 -108.8820272698084 -6.834314575050704
+ vertex 150.0275345701538 -107.09613774197246 -6.745481322062464
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701538 -107.09613774197246 -6.745481322062464
+ vertex 150.02753457015385 -108.8820272698084 -6.834314575050704
+ vertex 150.0275345701538 -106.68202726980843 -6.799999999999959
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015376 -108.8820272698084 -4.799999999999966
+ vertex 150.0275345701538 -108.06766791586351 -5.999999999999941
+ vertex 150.0275345701538 -108.22750859187093 -5.614110472163975
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015376 -108.8820272698084 -4.799999999999966
+ vertex 150.0275345701538 -108.22750859187093 -5.614110472163975
+ vertex 150.0275345701538 -108.28202726980838 -5.1999999999999424
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015376 -108.8820272698084 -4.799999999999966
+ vertex 150.0275345701538 -108.28202726980838 -5.1999999999999424
+ vertex 150.02753457015376 -108.22750859187093 -4.785889527835911
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015376 -108.8820272698084 -4.799999999999966
+ vertex 150.02753457015376 -108.22750859187093 -4.785889527835911
+ vertex 150.02753457015388 -111.08202726980838 -4.799999999999969
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015388 -111.08202726980838 -4.799999999999969
+ vertex 150.02753457015376 -108.22750859187093 -4.785889527835911
+ vertex 150.02753457015376 -111.08202726980839 -3.399999999999949
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015376 -111.08202726980839 -3.399999999999949
+ vertex 150.02753457015376 -108.22750859187093 -4.785889527835911
+ vertex 150.02753457015373 -108.06766791586351 -4.399999999999944
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015376 -111.08202726980839 -3.399999999999949
+ vertex 150.02753457015373 -108.06766791586351 -4.399999999999944
+ vertex 150.0275345701537 -107.81339811970687 -4.068629150101447
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015376 -111.08202726980839 -3.399999999999949
+ vertex 150.0275345701537 -107.81339811970687 -4.068629150101447
+ vertex 150.02753457015368 -107.4820272698084 -3.8143593539448326
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015376 -111.08202726980839 -3.399999999999949
+ vertex 150.02753457015368 -107.4820272698084 -3.8143593539448326
+ vertex 150.02753457015368 -107.09613774197238 -3.654518677937438
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015376 -111.08202726980839 -3.399999999999949
+ vertex 150.02753457015368 -107.09613774197238 -3.654518677937438
+ vertex 150.02753457015368 -106.68202726980839 -3.599999999999943
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015376 -111.08202726980839 -3.399999999999949
+ vertex 150.02753457015368 -106.68202726980839 -3.599999999999943
+ vertex 150.0275345701536 -104.61600186602396 -3.49999999999994
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015376 -111.08202726980839 -3.399999999999949
+ vertex 150.0275345701536 -104.61600186602396 -3.49999999999994
+ vertex 150.0275345701538 -110.68202726980842 -3.399999999999923
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701538 -110.68202726980842 -3.399999999999923
+ vertex 150.0275345701536 -104.61600186602396 -3.49999999999994
+ vertex 150.02753457015356 -104.77492048862186 -3.29289321881339
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701538 -110.68202726980842 -3.399999999999923
+ vertex 150.02753457015356 -104.77492048862186 -3.29289321881339
+ vertex 150.02753457015376 -110.6820272698084 -2.999999999999924
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015376 -110.6820272698084 -2.999999999999924
+ vertex 150.02753457015356 -104.77492048862186 -3.29289321881339
+ vertex 150.0275345701536 -104.98202726980841 -3.1339745962155057
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015376 -110.6820272698084 -2.999999999999924
+ vertex 150.0275345701536 -104.98202726980841 -3.1339745962155057
+ vertex 150.0275345701536 -105.2232082247059 -3.034074173710881
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015376 -110.6820272698084 -2.999999999999924
+ vertex 150.0275345701536 -105.2232082247059 -3.034074173710881
+ vertex 150.02753457015356 -105.4820272698084 -2.9999999999999436
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015456 -120.0820272698084 -19.165685424949217
+ vertex 150.02753457015461 -120.64771269475763 -18.599999999999962
+ vertex 150.02753457015467 -122.6820272698084 -18.599999999999977
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015461 -120.64771269475763 -18.599999999999962
+ vertex 150.02753457015456 -120.0820272698084 -19.165685424949217
+ vertex 150.02753457015444 -117.61634184485915 -16.699999999999974
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015461 -120.64771269475763 -18.599999999999962
+ vertex 150.02753457015444 -117.61634184485915 -16.699999999999974
+ vertex 150.02753457015447 -118.18202726980839 -16.134314575050695
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015447 -118.18202726980839 -16.134314575050695
+ vertex 150.02753457015444 -117.61634184485915 -16.699999999999974
+ vertex 150.02753457015424 -111.34771269475765 -16.699999999999946
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015447 -118.18202726980839 -16.134314575050695
+ vertex 150.02753457015424 -111.34771269475765 -16.699999999999946
+ vertex 150.02753457015424 -110.7820272698084 -16.134314575050713
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015447 -118.18202726980839 -16.134314575050695
+ vertex 150.02753457015424 -110.7820272698084 -16.134314575050713
+ vertex 150.02753457015433 -114.48202726980838 -15.699999999999937
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015433 -114.48202726980838 -15.699999999999937
+ vertex 150.02753457015424 -110.7820272698084 -16.134314575050713
+ vertex 150.0275345701543 -113.78321584803157 -15.607999730980426
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701543 -113.78321584803157 -15.607999730980426
+ vertex 150.02753457015424 -110.7820272698084 -16.134314575050713
+ vertex 150.02753457015424 -113.1320272698084 -15.338268590217929
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -113.1320272698084 -15.338268590217929
+ vertex 150.02753457015424 -110.7820272698084 -16.134314575050713
+ vertex 150.02753457015422 -112.5728389606047 -14.90918830920364
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -112.5728389606047 -14.90918830920364
+ vertex 150.02753457015424 -110.7820272698084 -16.134314575050713
+ vertex 150.02753457015422 -112.14375867959042 -14.349999999999962
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -112.14375867959042 -14.349999999999962
+ vertex 150.02753457015424 -110.7820272698084 -16.134314575050713
+ vertex 150.02753457015416 -111.87402753882793 -13.69881142177675
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015416 -111.87402753882793 -13.69881142177675
+ vertex 150.02753457015424 -110.7820272698084 -16.134314575050713
+ vertex 150.027534570154 -110.7820272698084 -9.865685424949215
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015416 -111.87402753882793 -13.69881142177675
+ vertex 150.027534570154 -110.7820272698084 -9.865685424949215
+ vertex 150.02753457015416 -111.78202726980841 -12.999999999999954
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015416 -111.78202726980841 -12.999999999999954
+ vertex 150.027534570154 -110.7820272698084 -9.865685424949215
+ vertex 150.0275345701541 -111.8740275388279 -12.301188578223135
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701541 -111.8740275388279 -12.301188578223135
+ vertex 150.027534570154 -110.7820272698084 -9.865685424949215
+ vertex 150.0275345701541 -112.14375867959043 -11.649999999999945
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701541 -112.14375867959043 -11.649999999999945
+ vertex 150.027534570154 -110.7820272698084 -9.865685424949215
+ vertex 150.0275345701541 -112.57283896060473 -11.090811690796267
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701541 -112.57283896060473 -11.090811690796267
+ vertex 150.027534570154 -110.7820272698084 -9.865685424949215
+ vertex 150.0275345701541 -113.1320272698084 -10.661731409781979
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701541 -113.1320272698084 -10.661731409781979
+ vertex 150.027534570154 -110.7820272698084 -9.865685424949215
+ vertex 150.0275345701541 -113.78321584803157 -10.392000269019471
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701541 -113.78321584803157 -10.392000269019471
+ vertex 150.027534570154 -110.7820272698084 -9.865685424949215
+ vertex 150.02753457015413 -114.48202726980841 -10.299999999999962
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015467 -118.28202726980835 -22.599999999999966
+ vertex 150.02753457015487 -123.4820272698084 -22.999999999999968
+ vertex 150.02753457015473 -118.28202726980835 -22.999999999999964
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015487 -123.4820272698084 -22.999999999999968
+ vertex 150.02753457015467 -118.28202726980835 -22.599999999999966
+ vertex 150.02753457015487 -123.74084631491093 -22.96592582628903
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015487 -123.74084631491093 -22.96592582628903
+ vertex 150.02753457015467 -118.28202726980835 -22.599999999999966
+ vertex 150.02753457015487 -123.9820272698084 -22.866025403784406
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015487 -123.9820272698084 -22.866025403784406
+ vertex 150.02753457015467 -118.28202726980835 -22.599999999999966
+ vertex 150.02753457015487 -124.18913405099492 -22.70710678118652
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015487 -124.18913405099492 -22.70710678118652
+ vertex 150.02753457015467 -118.28202726980835 -22.599999999999966
+ vertex 150.02753457015487 -124.34805267359283 -22.49999999999997
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -104.5161014435193 -22.258819045102463
+ vertex 150.02753457015433 -106.68202726980839 -22.399999999999952
+ vertex 150.0275345701543 -104.61600186602392 -22.49999999999995
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015433 -106.68202726980839 -22.399999999999952
+ vertex 150.02753457015427 -104.5161014435193 -22.258819045102463
+ vertex 150.02753457015433 -106.26791679764438 -22.34548132206248
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015433 -106.26791679764438 -22.34548132206248
+ vertex 150.02753457015427 -104.5161014435193 -22.258819045102463
+ vertex 150.02753457015433 -105.88202726980838 -22.185640646055063
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015433 -105.88202726980838 -22.185640646055063
+ vertex 150.02753457015427 -104.5161014435193 -22.258819045102463
+ vertex 150.02753457015427 -104.48202726980838 -21.99999999999995
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015433 -105.88202726980838 -22.185640646055063
+ vertex 150.02753457015427 -104.48202726980838 -21.99999999999995
+ vertex 150.02753457015427 -105.55065641990991 -21.93137084989845
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -105.55065641990991 -21.93137084989845
+ vertex 150.02753457015427 -104.48202726980838 -21.99999999999995
+ vertex 150.02753457015424 -105.29638662375328 -21.599999999999977
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -105.29638662375328 -21.599999999999977
+ vertex 150.02753457015427 -104.48202726980838 -21.99999999999995
+ vertex 150.02753457015427 -105.13654594774587 -21.21411047216401
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -105.13654594774587 -21.21411047216401
+ vertex 150.02753457015427 -104.48202726980838 -21.99999999999995
+ vertex 150.0275345701541 -104.48202726980838 -16.79999999999996
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -105.13654594774587 -21.21411047216401
+ vertex 150.0275345701541 -104.48202726980838 -16.79999999999996
+ vertex 150.02753457015422 -105.08202726980836 -20.79999999999998
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -105.08202726980836 -20.79999999999998
+ vertex 150.0275345701541 -104.48202726980838 -16.79999999999996
+ vertex 150.02753457015424 -105.13654594774586 -20.385889527835946
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -105.13654594774586 -20.385889527835946
+ vertex 150.0275345701541 -104.48202726980838 -16.79999999999996
+ vertex 150.02753457015422 -105.29638662375328 -19.999999999999957
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -105.29638662375328 -19.999999999999957
+ vertex 150.0275345701541 -104.48202726980838 -16.79999999999996
+ vertex 150.0275345701542 -105.55065641990991 -19.668629150101488
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701542 -105.55065641990991 -19.668629150101488
+ vertex 150.0275345701541 -104.48202726980838 -16.79999999999996
+ vertex 150.02753457015422 -105.88202726980838 -19.41435935394485
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -105.88202726980838 -19.41435935394485
+ vertex 150.0275345701541 -104.48202726980838 -16.79999999999996
+ vertex 150.02753457015422 -106.26791679764435 -19.254518677937455
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -106.26791679764435 -19.254518677937455
+ vertex 150.0275345701541 -104.48202726980838 -16.79999999999996
+ vertex 150.02753457015422 -106.68202726980839 -19.19999999999996
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -106.68202726980839 -19.19999999999996
+ vertex 150.0275345701541 -104.48202726980838 -16.79999999999996
+ vertex 150.02753457015422 -106.28202726980838 -18.59999999999996
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -106.68202726980839 -19.19999999999996
+ vertex 150.02753457015422 -106.28202726980838 -18.59999999999996
+ vertex 150.02753457015427 -108.88202726980838 -19.165685424949185
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -106.28202726980838 -18.59999999999996
+ vertex 150.0275345701541 -104.48202726980838 -16.79999999999996
+ vertex 150.0275345701541 -104.8820272698084 -16.799999999999965
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -106.28202726980838 -18.59999999999996
+ vertex 150.0275345701541 -104.8820272698084 -16.799999999999965
+ vertex 150.0275345701541 -106.28202726980841 -16.399999999999963
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701541 -106.28202726980841 -16.399999999999963
+ vertex 150.0275345701541 -104.8820272698084 -16.799999999999965
+ vertex 150.02753457015407 -104.88202726980839 -16.399999999999963
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015447 -118.18202726980839 -16.134314575050695
+ vertex 150.02753457015433 -117.09002700078888 -13.698811421776757
+ vertex 150.02753457015422 -118.1820272698084 -9.8656854249492
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015433 -117.09002700078888 -13.698811421776757
+ vertex 150.02753457015447 -118.18202726980839 -16.134314575050695
+ vertex 150.02753457015436 -116.82029586002639 -14.349999999999968
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015436 -116.82029586002639 -14.349999999999968
+ vertex 150.02753457015447 -118.18202726980839 -16.134314575050695
+ vertex 150.02753457015433 -116.39121557901207 -14.909188309203646
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015433 -116.39121557901207 -14.909188309203646
+ vertex 150.02753457015447 -118.18202726980839 -16.134314575050695
+ vertex 150.02753457015433 -115.83202726980839 -15.33826859021793
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015433 -115.83202726980839 -15.33826859021793
+ vertex 150.02753457015447 -118.18202726980839 -16.134314575050695
+ vertex 150.02753457015433 -115.18083869158518 -15.60799973098044
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015433 -115.18083869158518 -15.60799973098044
+ vertex 150.02753457015447 -118.18202726980839 -16.134314575050695
+ vertex 150.02753457015433 -114.48202726980838 -15.699999999999937
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -118.1820272698084 -9.8656854249492
+ vertex 150.02753457015433 -117.09002700078888 -13.698811421776757
+ vertex 150.02753457015433 -117.1820272698084 -12.99999999999996
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -118.1820272698084 -9.8656854249492
+ vertex 150.02753457015433 -117.1820272698084 -12.99999999999996
+ vertex 150.02753457015424 -117.09002700078888 -12.301188578223162
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -118.1820272698084 -9.8656854249492
+ vertex 150.02753457015424 -117.09002700078888 -12.301188578223162
+ vertex 150.02753457015424 -116.82029586002639 -11.649999999999949
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -118.1820272698084 -9.8656854249492
+ vertex 150.02753457015424 -116.82029586002639 -11.649999999999949
+ vertex 150.02753457015422 -116.3912155790121 -11.09081169079627
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -118.1820272698084 -9.8656854249492
+ vertex 150.02753457015422 -116.3912155790121 -11.09081169079627
+ vertex 150.02753457015416 -115.83202726980839 -10.661731409781982
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -118.1820272698084 -9.8656854249492
+ vertex 150.02753457015416 -115.83202726980839 -10.661731409781982
+ vertex 150.02753457015416 -115.18083869158521 -10.392000269019473
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -118.1820272698084 -9.8656854249492
+ vertex 150.02753457015416 -115.18083869158521 -10.392000269019473
+ vertex 150.02753457015413 -114.48202726980841 -10.299999999999962
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -118.1820272698084 -9.8656854249492
+ vertex 150.02753457015413 -114.48202726980841 -10.299999999999962
+ vertex 150.027534570154 -110.7820272698084 -9.865685424949215
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -118.1820272698084 -9.8656854249492
+ vertex 150.027534570154 -110.7820272698084 -9.865685424949215
+ vertex 150.027534570154 -111.34771269475763 -9.29999999999996
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.027534570154 -111.34771269475763 -9.29999999999996
+ vertex 150.027534570154 -110.7820272698084 -9.865685424949215
+ vertex 150.02753457015388 -108.31634184485917 -7.399999999999961
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.027534570154 -111.34771269475763 -9.29999999999996
+ vertex 150.02753457015388 -108.31634184485917 -7.399999999999961
+ vertex 150.02753457015385 -108.8820272698084 -6.834314575050704
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015385 -104.88202726980839 -9.599999999999929
+ vertex 150.0275345701538 -106.28202726980842 -7.399999999999959
+ vertex 150.02753457015388 -106.28202726980838 -9.599999999999953
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701538 -106.28202726980842 -7.399999999999959
+ vertex 150.02753457015385 -104.88202726980839 -9.599999999999929
+ vertex 150.02753457015385 -104.88202726980839 -9.19999999999993
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -118.1820272698084 -9.8656854249492
+ vertex 150.02753457015416 -117.61634184485912 -9.299999999999965
+ vertex 150.0275345701542 -120.64771269475769 -7.39999999999995
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015416 -117.61634184485912 -9.299999999999965
+ vertex 150.02753457015422 -118.1820272698084 -9.8656854249492
+ vertex 150.027534570154 -111.34771269475763 -9.29999999999996
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701542 -120.64771269475769 -7.39999999999995
+ vertex 150.02753457015416 -117.61634184485912 -9.299999999999965
+ vertex 150.02753457015416 -120.08202726980838 -6.834314575050715
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701542 -120.64771269475769 -7.39999999999995
+ vertex 150.02753457015416 -120.08202726980838 -6.834314575050715
+ vertex 150.0275345701543 -122.6820272698084 -7.3999999999999275
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.027534570154 -117.88202726980845 -3.399999999999954
+ vertex 150.0275345701541 -120.0820272698084 -4.7999999999999545
+ vertex 150.02753457015405 -117.8820272698084 -4.799999999999952
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701541 -120.0820272698084 -4.7999999999999545
+ vertex 150.027534570154 -117.88202726980845 -3.399999999999954
+ vertex 150.0275345701541 -120.7365459477459 -4.785889527835922
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701541 -120.7365459477459 -4.785889527835922
+ vertex 150.027534570154 -117.88202726980845 -3.399999999999954
+ vertex 150.0275345701541 -120.89638662375327 -4.399999999999955
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701541 -120.89638662375327 -4.399999999999955
+ vertex 150.027534570154 -117.88202726980845 -3.399999999999954
+ vertex 150.0275345701541 -121.15065641990991 -4.068629150101484
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701541 -121.15065641990991 -4.068629150101484
+ vertex 150.027534570154 -117.88202726980845 -3.399999999999954
+ vertex 150.0275345701541 -121.48202726980837 -3.814359353944847
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701541 -121.48202726980837 -3.814359353944847
+ vertex 150.027534570154 -117.88202726980845 -3.399999999999954
+ vertex 150.02753457015407 -121.86791679764434 -3.654518677937452
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015407 -121.86791679764434 -3.654518677937452
+ vertex 150.027534570154 -117.88202726980845 -3.399999999999954
+ vertex 150.02753457015413 -122.2820272698084 -3.5999999999999566
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015413 -122.2820272698084 -3.5999999999999566
+ vertex 150.027534570154 -117.88202726980845 -3.399999999999954
+ vertex 150.0275345701542 -124.34805267359285 -3.4999999999999485
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701542 -124.34805267359285 -3.4999999999999485
+ vertex 150.027534570154 -117.88202726980845 -3.399999999999954
+ vertex 150.027534570154 -118.28202726980842 -3.399999999999954
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701542 -124.34805267359285 -3.4999999999999485
+ vertex 150.027534570154 -118.28202726980842 -3.399999999999954
+ vertex 150.0275345701542 -124.18913405099494 -3.2928932188133984
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701542 -124.18913405099494 -3.2928932188133984
+ vertex 150.027534570154 -118.28202726980842 -3.399999999999954
+ vertex 150.02753457015396 -118.28202726980845 -2.999999999999955
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701542 -124.18913405099494 -3.2928932188133984
+ vertex 150.02753457015396 -118.28202726980845 -2.999999999999955
+ vertex 150.02753457015416 -123.9820272698084 -3.133974596215514
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015416 -123.9820272698084 -3.133974596215514
+ vertex 150.02753457015396 -118.28202726980845 -2.999999999999955
+ vertex 150.02753457015416 -123.74084631491093 -3.034074173710887
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015416 -123.74084631491093 -3.034074173710887
+ vertex 150.02753457015396 -118.28202726980845 -2.999999999999955
+ vertex 150.02753457015413 -123.48202726980841 -2.9999999999999494
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015436 -122.6820272698084 -9.599999999999923
+ vertex 150.0275345701544 -124.08202726980842 -9.19999999999996
+ vertex 150.0275345701544 -124.08202726980842 -9.59999999999996
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701544 -124.08202726980842 -9.19999999999996
+ vertex 150.02753457015436 -122.6820272698084 -9.599999999999923
+ vertex 150.0275345701543 -122.6820272698084 -7.3999999999999275
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701544 -124.08202726980842 -9.19999999999996
+ vertex 150.0275345701543 -122.6820272698084 -7.3999999999999275
+ vertex 150.02753457015442 -124.48202726980841 -9.19999999999996
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015442 -124.48202726980841 -9.19999999999996
+ vertex 150.0275345701543 -122.6820272698084 -7.3999999999999275
+ vertex 150.02753457015424 -123.66766791586353 -5.999999999999944
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015442 -124.48202726980841 -9.19999999999996
+ vertex 150.02753457015424 -123.66766791586353 -5.999999999999944
+ vertex 150.02753457015422 -123.82750859187092 -5.614110472163954
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015442 -124.48202726980841 -9.19999999999996
+ vertex 150.02753457015422 -123.82750859187092 -5.614110472163954
+ vertex 150.02753457015422 -124.48202726980844 -3.9999999999999476
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -123.66766791586353 -5.999999999999944
+ vertex 150.0275345701543 -122.6820272698084 -7.3999999999999275
+ vertex 150.02753457015424 -123.41339811970688 -6.331370849898415
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -123.41339811970688 -6.331370849898415
+ vertex 150.0275345701543 -122.6820272698084 -7.3999999999999275
+ vertex 150.02753457015424 -123.08202726980842 -6.585640646055053
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -123.08202726980842 -6.585640646055053
+ vertex 150.0275345701543 -122.6820272698084 -7.3999999999999275
+ vertex 150.02753457015424 -122.69613774197245 -6.7454813220624334
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -122.69613774197245 -6.7454813220624334
+ vertex 150.0275345701543 -122.6820272698084 -7.3999999999999275
+ vertex 150.02753457015422 -122.28202726980842 -6.799999999999951
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -122.28202726980842 -6.799999999999951
+ vertex 150.0275345701543 -122.6820272698084 -7.3999999999999275
+ vertex 150.02753457015416 -120.08202726980838 -6.834314575050715
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -124.48202726980844 -3.9999999999999476
+ vertex 150.02753457015422 -123.82750859187092 -5.614110472163954
+ vertex 150.02753457015422 -123.88202726980842 -5.199999999999923
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -124.48202726980844 -3.9999999999999476
+ vertex 150.02753457015422 -123.88202726980842 -5.199999999999923
+ vertex 150.02753457015422 -123.82750859187092 -4.785889527835891
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -124.48202726980844 -3.9999999999999476
+ vertex 150.02753457015422 -123.82750859187092 -4.785889527835891
+ vertex 150.02753457015422 -123.6676679158635 -4.399999999999924
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -124.48202726980844 -3.9999999999999476
+ vertex 150.02753457015422 -123.6676679158635 -4.399999999999924
+ vertex 150.02753457015413 -123.41339811970687 -4.068629150101453
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -124.48202726980844 -3.9999999999999476
+ vertex 150.02753457015413 -123.41339811970687 -4.068629150101453
+ vertex 150.02753457015413 -123.08202726980839 -3.8143593539448384
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -124.48202726980844 -3.9999999999999476
+ vertex 150.02753457015413 -123.08202726980839 -3.8143593539448384
+ vertex 150.02753457015422 -124.44795309609748 -3.741180954897436
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -124.44795309609748 -3.741180954897436
+ vertex 150.02753457015413 -123.08202726980839 -3.8143593539448384
+ vertex 150.0275345701541 -122.69613774197242 -3.654518677937407
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -124.44795309609748 -3.741180954897436
+ vertex 150.0275345701541 -122.69613774197242 -3.654518677937407
+ vertex 150.0275345701542 -124.34805267359285 -3.4999999999999485
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701542 -124.34805267359285 -3.4999999999999485
+ vertex 150.0275345701541 -122.69613774197242 -3.654518677937407
+ vertex 150.02753457015413 -122.2820272698084 -3.5999999999999566
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015416 -120.08202726980838 -6.834314575050715
+ vertex 150.02753457015422 -121.86791679764437 -6.745481322062478
+ vertex 150.02753457015422 -122.28202726980842 -6.799999999999951
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -121.86791679764437 -6.745481322062478
+ vertex 150.02753457015416 -120.08202726980838 -6.834314575050715
+ vertex 150.02753457015422 -121.48202726980843 -6.585640646055061
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015422 -121.48202726980843 -6.585640646055061
+ vertex 150.02753457015416 -120.08202726980838 -6.834314575050715
+ vertex 150.0275345701542 -121.15065641990992 -6.3313708498984465
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701542 -121.15065641990992 -6.3313708498984465
+ vertex 150.02753457015416 -120.08202726980838 -6.834314575050715
+ vertex 150.02753457015416 -120.89638662375332 -5.999999999999975
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015416 -120.89638662375332 -5.999999999999975
+ vertex 150.02753457015416 -120.08202726980838 -6.834314575050715
+ vertex 150.0275345701541 -120.0820272698084 -4.7999999999999545
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015416 -120.89638662375332 -5.999999999999975
+ vertex 150.0275345701541 -120.0820272698084 -4.7999999999999545
+ vertex 150.02753457015413 -120.73654594774587 -5.6141104721640085
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015413 -120.73654594774587 -5.6141104721640085
+ vertex 150.0275345701541 -120.0820272698084 -4.7999999999999545
+ vertex 150.02753457015413 -120.68202726980837 -5.199999999999976
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015413 -120.68202726980837 -5.199999999999976
+ vertex 150.0275345701541 -120.0820272698084 -4.7999999999999545
+ vertex 150.0275345701541 -120.7365459477459 -4.785889527835922
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015427 -108.88202726980838 -19.165685424949185
+ vertex 150.02753457015424 -108.31634184485912 -18.599999999999948
+ vertex 150.02753457015424 -111.34771269475765 -16.699999999999946
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -108.31634184485912 -18.599999999999948
+ vertex 150.02753457015427 -108.88202726980838 -19.165685424949185
+ vertex 150.02753457015422 -106.28202726980838 -18.59999999999996
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015424 -111.34771269475765 -16.699999999999946
+ vertex 150.02753457015424 -108.31634184485912 -18.599999999999948
+ vertex 150.02753457015424 -110.7820272698084 -16.134314575050713
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.0275345701546 -122.6820272698084 -16.39999999999998
+ vertex 150.02753457015464 -124.08202726980839 -16.800000000000004
+ vertex 150.02753457015467 -122.6820272698084 -18.599999999999977
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015464 -124.08202726980839 -16.800000000000004
+ vertex 150.0275345701546 -122.6820272698084 -16.39999999999998
+ vertex 150.02753457015464 -124.08202726980836 -16.400000000000002
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015478 -122.28202726980842 -22.399999999999945
+ vertex 150.02753457015484 -124.44795309609745 -22.25881904510248
+ vertex 150.02753457015487 -124.34805267359283 -22.49999999999997
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015484 -124.44795309609745 -22.25881904510248
+ vertex 150.02753457015478 -122.28202726980842 -22.399999999999945
+ vertex 150.02753457015478 -122.69613774197245 -22.34548132206245
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015484 -124.44795309609745 -22.25881904510248
+ vertex 150.02753457015478 -122.69613774197245 -22.34548132206245
+ vertex 150.02753457015484 -123.08202726980844 -22.185640646055035
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015484 -124.44795309609745 -22.25881904510248
+ vertex 150.02753457015484 -123.08202726980844 -22.185640646055035
+ vertex 150.02753457015484 -124.48202726980841 -21.99999999999997
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015484 -124.48202726980841 -21.99999999999997
+ vertex 150.02753457015484 -123.08202726980844 -22.185640646055035
+ vertex 150.0275345701548 -123.41339811970688 -21.93137084989842
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015484 -124.48202726980841 -21.99999999999997
+ vertex 150.0275345701548 -123.41339811970688 -21.93137084989842
+ vertex 150.02753457015478 -123.66766791586353 -21.599999999999927
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015484 -124.48202726980841 -21.99999999999997
+ vertex 150.02753457015478 -123.66766791586353 -21.599999999999927
+ vertex 150.0275345701548 -123.82750859187092 -21.21411047216396
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015484 -124.48202726980841 -21.99999999999997
+ vertex 150.0275345701548 -123.82750859187092 -21.21411047216396
+ vertex 150.02753457015467 -124.48202726980837 -16.800000000000004
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015467 -124.48202726980837 -16.800000000000004
+ vertex 150.0275345701548 -123.82750859187092 -21.21411047216396
+ vertex 150.02753457015476 -123.88202726980839 -20.79999999999993
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015467 -124.48202726980837 -16.800000000000004
+ vertex 150.02753457015476 -123.88202726980839 -20.79999999999993
+ vertex 150.02753457015476 -123.82750859187092 -20.385889527835896
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015467 -124.48202726980837 -16.800000000000004
+ vertex 150.02753457015476 -123.82750859187092 -20.385889527835896
+ vertex 150.02753457015476 -123.6676679158635 -19.99999999999993
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015467 -124.48202726980837 -16.800000000000004
+ vertex 150.02753457015476 -123.6676679158635 -19.99999999999993
+ vertex 150.0275345701547 -123.41339811970687 -19.66862915010146
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015467 -124.48202726980837 -16.800000000000004
+ vertex 150.0275345701547 -123.41339811970687 -19.66862915010146
+ vertex 150.02753457015473 -123.08202726980839 -19.41435935394482
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015467 -124.48202726980837 -16.800000000000004
+ vertex 150.02753457015473 -123.08202726980839 -19.41435935394482
+ vertex 150.02753457015467 -122.69613774197242 -19.254518677937426
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015467 -124.48202726980837 -16.800000000000004
+ vertex 150.02753457015467 -122.69613774197242 -19.254518677937426
+ vertex 150.02753457015464 -122.28202726980837 -19.19999999999993
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015467 -124.48202726980837 -16.800000000000004
+ vertex 150.02753457015464 -122.28202726980837 -19.19999999999993
+ vertex 150.02753457015467 -122.6820272698084 -18.599999999999977
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015467 -122.6820272698084 -18.599999999999977
+ vertex 150.02753457015464 -122.28202726980837 -19.19999999999993
+ vertex 150.02753457015456 -120.0820272698084 -19.165685424949217
+ endloop
+endfacet
+facet normal 1.0 4.59687843346329e-19 2.9750497701033086e-16
+ outer loop
+ vertex 150.02753457015467 -124.48202726980837 -16.800000000000004
+ vertex 150.02753457015467 -122.6820272698084 -18.599999999999977
+ vertex 150.02753457015464 -124.08202726980839 -16.800000000000004
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex -149.972465429844 -123.4820272698084 -23.000000000000057
+ vertex 150.02753457015473 -118.28202726980835 -22.999999999999964
+ vertex 150.02753457015487 -123.4820272698084 -22.999999999999968
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex 150.02753457015473 -118.28202726980835 -22.999999999999964
+ vertex -149.972465429844 -123.4820272698084 -23.000000000000057
+ vertex -149.9724654298442 -118.28202726980831 -23.000000000000053
+ endloop
+endfacet
+facet normal 4.164649241083378e-14 -0.1305261922200722 -0.9914448613738078
+ outer loop
+ vertex -149.972465429844 -123.74084631491088 -22.96592582628912
+ vertex 150.02753457015487 -123.4820272698084 -22.999999999999968
+ vertex 150.02753457015487 -123.74084631491093 -22.96592582628903
+ endloop
+endfacet
+facet normal 4.164649241083378e-14 -0.1305261922200722 -0.9914448613738078
+ outer loop
+ vertex 150.02753457015487 -123.4820272698084 -22.999999999999968
+ vertex -149.972465429844 -123.74084631491088 -22.96592582628912
+ vertex -149.972465429844 -123.4820272698084 -23.000000000000057
+ endloop
+endfacet
+facet normal 3.5926213864307125e-14 4.538832183921785e-15 -1.0
+ outer loop
+ vertex -149.97246542984428 -117.61634184485911 -16.700000000000063
+ vertex 150.02753457015424 -111.34771269475765 -16.699999999999946
+ vertex 150.02753457015444 -117.61634184485915 -16.699999999999974
+ endloop
+endfacet
+facet normal 3.5926213864307125e-14 4.538832183921785e-15 -1.0
+ outer loop
+ vertex 150.02753457015424 -111.34771269475765 -16.699999999999946
+ vertex -149.97246542984428 -117.61634184485911 -16.700000000000063
+ vertex -149.9724654298445 -111.34771269475763 -16.700000000000028
+ endloop
+endfacet
+facet normal 5.513731934900517e-14 -0.38268343236508134 -0.9238795325112904
+ outer loop
+ vertex -149.972465429844 -123.98202726980837 -22.86602540378449
+ vertex 150.02753457015487 -123.74084631491093 -22.96592582628903
+ vertex 150.02753457015487 -123.9820272698084 -22.866025403784406
+ endloop
+endfacet
+facet normal 5.513731934900517e-14 -0.38268343236508134 -0.9238795325112904
+ outer loop
+ vertex 150.02753457015487 -123.74084631491093 -22.96592582628903
+ vertex -149.972465429844 -123.98202726980837 -22.86602540378449
+ vertex -149.972465429844 -123.74084631491088 -22.96592582628912
+ endloop
+endfacet
+facet normal 5.200343766171889e-14 -0.6087614290087036 -0.7933533402912483
+ outer loop
+ vertex -149.972465429844 -124.1891340509949 -22.70710678118661
+ vertex 150.02753457015487 -123.9820272698084 -22.866025403784406
+ vertex 150.02753457015487 -124.18913405099492 -22.70710678118652
+ endloop
+endfacet
+facet normal 5.200343766171889e-14 -0.6087614290087036 -0.7933533402912483
+ outer loop
+ vertex 150.02753457015487 -123.9820272698084 -22.866025403784406
+ vertex -149.972465429844 -124.1891340509949 -22.70710678118661
+ vertex -149.972465429844 -123.98202726980837 -22.86602540378449
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 7.797766215937039e-16
+ outer loop
+ vertex -149.97246542984422 -122.68202726980837 -18.60000000000006
+ vertex 150.0275345701546 -122.6820272698084 -16.39999999999998
+ vertex 150.02753457015467 -122.6820272698084 -18.599999999999977
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 7.797766215937039e-16
+ outer loop
+ vertex 150.0275345701546 -122.6820272698084 -16.39999999999998
+ vertex -149.97246542984422 -122.68202726980837 -18.60000000000006
+ vertex -149.97246542984422 -122.68202726980837 -16.400000000000063
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 6.227439144697608e-15
+ outer loop
+ vertex -149.9724654298442 -118.28202726980831 -23.000000000000053
+ vertex 150.02753457015467 -118.28202726980835 -22.599999999999966
+ vertex 150.02753457015473 -118.28202726980835 -22.999999999999964
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 6.227439144697608e-15
+ outer loop
+ vertex 150.02753457015467 -118.28202726980835 -22.599999999999966
+ vertex -149.9724654298442 -118.28202726980831 -23.000000000000053
+ vertex -149.97246542984405 -118.2820272698083 -22.600000000000055
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex -149.97246542984414 -120.08202726980835 -21.200000000000056
+ vertex 150.02753457015456 -120.0820272698084 -19.165685424949217
+ vertex 150.0275345701547 -120.0820272698084 -21.199999999999957
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex 150.02753457015456 -120.0820272698084 -19.165685424949217
+ vertex -149.97246542984414 -120.08202726980835 -21.200000000000056
+ vertex -149.97246542984422 -120.08202726980838 -19.16568542494932
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex 150.02753457015427 -108.88202726980838 -19.165685424949185
+ vertex -149.97246542984453 -108.88202726980833 -21.200000000000035
+ vertex 150.02753457015433 -108.8820272698084 -21.199999999999946
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex -149.97246542984453 -108.88202726980833 -21.200000000000035
+ vertex 150.02753457015427 -108.88202726980838 -19.165685424949185
+ vertex -149.97246542984453 -108.88202726980833 -19.165685424949274
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex 150.02753457015461 -120.64771269475763 -18.599999999999962
+ vertex -149.97246542984422 -122.68202726980837 -18.60000000000006
+ vertex 150.02753457015467 -122.6820272698084 -18.599999999999977
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex -149.97246542984422 -122.68202726980837 -18.60000000000006
+ vertex 150.02753457015461 -120.64771269475763 -18.599999999999962
+ vertex -149.97246542984422 -120.64771269475759 -18.60000000000005
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex 150.02753457015464 -117.8820272698084 -21.199999999999967
+ vertex -149.97246542984414 -120.08202726980835 -21.200000000000056
+ vertex 150.0275345701547 -120.0820272698084 -21.199999999999957
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex -149.97246542984414 -120.08202726980835 -21.200000000000056
+ vertex 150.02753457015464 -117.8820272698084 -21.199999999999967
+ vertex -149.97246542984422 -117.88202726980836 -21.200000000000053
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex 150.02753457015444 -110.68202726980837 -22.599999999999955
+ vertex -149.97246542984442 -110.68202726980837 -23.000000000000036
+ vertex 150.0275345701545 -110.6820272698084 -22.999999999999954
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex -149.97246542984442 -110.68202726980837 -23.000000000000036
+ vertex 150.02753457015444 -110.68202726980837 -22.599999999999955
+ vertex -149.97246542984436 -110.68202726980833 -22.60000000000004
+ endloop
+endfacet
+facet normal 4.6599210313486674e-14 -0.9238795325112916 -0.38268343236507846
+ outer loop
+ vertex 150.02753457015484 -124.44795309609745 -22.25881904510248
+ vertex -149.972465429844 -124.34805267359279 -22.50000000000006
+ vertex 150.02753457015487 -124.34805267359283 -22.49999999999997
+ endloop
+endfacet
+facet normal 4.6599210313486674e-14 -0.9238795325112916 -0.38268343236507846
+ outer loop
+ vertex -149.972465429844 -124.34805267359279 -22.50000000000006
+ vertex 150.02753457015484 -124.44795309609745 -22.25881904510248
+ vertex -149.97246542984405 -124.44795309609744 -22.258819045102573
+ endloop
+endfacet
+facet normal 1.2048156260518037e-15 -0.7071067811865512 0.7071067811865439
+ outer loop
+ vertex -149.97246542984442 -118.18202726980836 -16.134314575050784
+ vertex 150.02753457015461 -120.64771269475763 -18.599999999999962
+ vertex 150.02753457015447 -118.18202726980839 -16.134314575050695
+ endloop
+endfacet
+facet normal 1.2048156260518037e-15 -0.7071067811865512 0.7071067811865439
+ outer loop
+ vertex 150.02753457015461 -120.64771269475763 -18.599999999999962
+ vertex -149.97246542984442 -118.18202726980836 -16.134314575050784
+ vertex -149.97246542984422 -120.64771269475759 -18.60000000000005
+ endloop
+endfacet
+facet normal -1.2048156260517146e-15 0.7071067811865481 -0.707106781186547
+ outer loop
+ vertex -149.97246542984422 -120.08202726980838 -19.16568542494932
+ vertex 150.02753457015444 -117.61634184485915 -16.699999999999974
+ vertex 150.02753457015456 -120.0820272698084 -19.165685424949217
+ endloop
+endfacet
+facet normal -1.2048156260517146e-15 0.7071067811865481 -0.707106781186547
+ outer loop
+ vertex 150.02753457015444 -117.61634184485915 -16.699999999999974
+ vertex -149.97246542984422 -120.08202726980838 -19.16568542494932
+ vertex -149.97246542984428 -117.61634184485911 -16.700000000000063
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex 150.02753457015464 -124.08202726980839 -16.800000000000004
+ vertex -149.97246542984422 -124.48202726980834 -16.800000000000093
+ vertex 150.02753457015467 -124.48202726980837 -16.800000000000004
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex -149.97246542984422 -124.48202726980834 -16.800000000000093
+ vertex 150.02753457015464 -124.08202726980839 -16.800000000000004
+ vertex -149.97246542984422 -124.08202726980835 -16.80000000000009
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex -149.97246542984436 -111.08202726980832 -22.600000000000048
+ vertex 150.02753457015444 -110.68202726980837 -22.599999999999955
+ vertex 150.02753457015447 -111.08202726980838 -22.59999999999996
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex 150.02753457015444 -110.68202726980837 -22.599999999999955
+ vertex -149.97246542984436 -111.08202726980832 -22.600000000000048
+ vertex -149.97246542984436 -110.68202726980833 -22.60000000000004
+ endloop
+endfacet
+facet normal -3.592621386430645e-14 -1.7054096175908568e-14 1.0
+ outer loop
+ vertex 150.0275345701546 -122.6820272698084 -16.39999999999998
+ vertex -149.97246542984422 -124.08202726980832 -16.400000000000095
+ vertex 150.02753457015464 -124.08202726980836 -16.400000000000002
+ endloop
+endfacet
+facet normal -3.592621386430645e-14 -1.7054096175908568e-14 1.0
+ outer loop
+ vertex -149.97246542984422 -124.08202726980832 -16.400000000000095
+ vertex 150.0275345701546 -122.6820272698084 -16.39999999999998
+ vertex -149.97246542984422 -122.68202726980837 -16.400000000000063
+ endloop
+endfacet
+facet normal 4.512572649034336e-14 -0.7071067811865448 -0.7071067811865503
+ outer loop
+ vertex -149.9724654298445 -111.34771269475763 -16.700000000000028
+ vertex 150.02753457015427 -108.88202726980838 -19.165685424949185
+ vertex 150.02753457015424 -111.34771269475765 -16.699999999999946
+ endloop
+endfacet
+facet normal 4.512572649034336e-14 -0.7071067811865448 -0.7071067811865503
+ outer loop
+ vertex 150.02753457015427 -108.88202726980838 -19.165685424949185
+ vertex -149.9724654298445 -111.34771269475763 -16.700000000000028
+ vertex -149.97246542984453 -108.88202726980833 -19.165685424949274
+ endloop
+endfacet
+facet normal 3.1555025696319064e-14 0.13052619222007428 -0.9914448613738074
+ outer loop
+ vertex -149.9724654298445 -105.48202726980834 -23.00000000000004
+ vertex 150.02753457015433 -105.2232082247059 -22.965925826289016
+ vertex 150.02753457015433 -105.48202726980843 -22.999999999999954
+ endloop
+endfacet
+facet normal 3.1555025696319064e-14 0.13052619222007428 -0.9914448613738074
+ outer loop
+ vertex 150.02753457015433 -105.2232082247059 -22.965925826289016
+ vertex -149.9724654298445 -105.48202726980834 -23.00000000000004
+ vertex -149.97246542984453 -105.2232082247058 -22.9659258262891
+ endloop
+endfacet
+facet normal 2.0504249361719442e-14 0.3826834323650829 -0.9238795325112896
+ outer loop
+ vertex -149.97246542984453 -105.2232082247058 -22.9659258262891
+ vertex 150.02753457015433 -104.98202726980841 -22.866025403784388
+ vertex 150.02753457015433 -105.2232082247059 -22.965925826289016
+ endloop
+endfacet
+facet normal 2.0504249361719442e-14 0.3826834323650829 -0.9238795325112896
+ outer loop
+ vertex 150.02753457015433 -104.98202726980841 -22.866025403784388
+ vertex -149.97246542984453 -105.2232082247058 -22.9659258262891
+ vertex -149.97246542984453 -104.98202726980836 -22.866025403784477
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 2.4387889803801356e-15
+ outer loop
+ vertex -149.97246542984422 -124.48202726980834 -16.800000000000093
+ vertex 150.02753457015484 -124.48202726980841 -21.99999999999997
+ vertex 150.02753457015467 -124.48202726980837 -16.800000000000004
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 2.4387889803801356e-15
+ outer loop
+ vertex 150.02753457015484 -124.48202726980841 -21.99999999999997
+ vertex -149.97246542984422 -124.48202726980834 -16.800000000000093
+ vertex -149.972465429844 -124.48202726980833 -22.00000000000006
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex -149.97246542984405 -118.2820272698083 -22.600000000000055
+ vertex 150.02753457015467 -117.88202726980836 -22.599999999999966
+ vertex 150.02753457015467 -118.28202726980835 -22.599999999999966
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex 150.02753457015467 -117.88202726980836 -22.599999999999966
+ vertex -149.97246542984405 -118.2820272698083 -22.600000000000055
+ vertex -149.9724654298442 -117.88202726980832 -22.60000000000005
+ endloop
+endfacet
+facet normal 3.881934011071542e-14 -0.9914448613738096 -0.1305261922200573
+ outer loop
+ vertex -149.972465429844 -124.48202726980833 -22.00000000000006
+ vertex 150.02753457015484 -124.44795309609745 -22.25881904510248
+ vertex 150.02753457015484 -124.48202726980841 -21.99999999999997
+ endloop
+endfacet
+facet normal 3.881934011071542e-14 -0.9914448613738096 -0.1305261922200573
+ outer loop
+ vertex 150.02753457015484 -124.44795309609745 -22.25881904510248
+ vertex -149.972465429844 -124.48202726980833 -22.00000000000006
+ vertex -149.97246542984405 -124.44795309609744 -22.258819045102573
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex -149.97246542984445 -111.08202726980835 -21.20000000000005
+ vertex 150.02753457015447 -111.08202726980838 -22.59999999999996
+ vertex 150.02753457015444 -111.08202726980835 -21.19999999999996
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex 150.02753457015447 -111.08202726980838 -22.59999999999996
+ vertex -149.97246542984445 -111.08202726980835 -21.20000000000005
+ vertex -149.97246542984436 -111.08202726980832 -22.600000000000048
+ endloop
+endfacet
+facet normal 1.14378780311469e-14 0.6087614290087051 -0.7933533402912472
+ outer loop
+ vertex -149.97246542984453 -104.98202726980836 -22.866025403784477
+ vertex 150.0275345701543 -104.77492048862183 -22.7071067811865
+ vertex 150.02753457015433 -104.98202726980841 -22.866025403784388
+ endloop
+endfacet
+facet normal 1.14378780311469e-14 0.6087614290087051 -0.7933533402912472
+ outer loop
+ vertex 150.0275345701543 -104.77492048862183 -22.7071067811865
+ vertex -149.97246542984453 -104.98202726980836 -22.866025403784477
+ vertex -149.97246542984453 -104.77492048862179 -22.707106781186592
+ endloop
+endfacet
+facet normal 1.1474086062760138e-15 0.7933533402912367 -0.6087614290087189
+ outer loop
+ vertex 150.0275345701543 -104.77492048862183 -22.7071067811865
+ vertex -149.97246542984453 -104.61600186602391 -22.50000000000003
+ vertex 150.0275345701543 -104.61600186602392 -22.49999999999995
+ endloop
+endfacet
+facet normal 1.1474086062760138e-15 0.7933533402912367 -0.6087614290087189
+ outer loop
+ vertex -149.97246542984453 -104.61600186602391 -22.50000000000003
+ vertex 150.0275345701543 -104.77492048862183 -22.7071067811865
+ vertex -149.97246542984453 -104.77492048862179 -22.707106781186592
+ endloop
+endfacet
+facet normal 3.7893401050872254e-14 -0.7933533402912385 -0.6087614290087162
+ outer loop
+ vertex -149.972465429844 -124.34805267359279 -22.50000000000006
+ vertex 150.02753457015487 -124.18913405099492 -22.70710678118652
+ vertex 150.02753457015487 -124.34805267359283 -22.49999999999997
+ endloop
+endfacet
+facet normal 3.7893401050872254e-14 -0.7933533402912385 -0.6087614290087162
+ outer loop
+ vertex 150.02753457015487 -124.18913405099492 -22.70710678118652
+ vertex -149.972465429844 -124.34805267359279 -22.50000000000006
+ vertex -149.972465429844 -124.1891340509949 -22.70710678118661
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 4.122523745489034e-14
+ outer loop
+ vertex -149.9724654298442 -117.88202726980832 -22.60000000000005
+ vertex 150.02753457015464 -117.8820272698084 -21.199999999999967
+ vertex 150.02753457015467 -117.88202726980836 -22.599999999999966
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 4.122523745489034e-14
+ outer loop
+ vertex 150.02753457015464 -117.8820272698084 -21.199999999999967
+ vertex -149.9724654298442 -117.88202726980832 -22.60000000000005
+ vertex -149.97246542984422 -117.88202726980836 -21.200000000000053
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -6.007129263248553e-15
+ outer loop
+ vertex -149.97246542984422 -124.08202726980832 -16.400000000000095
+ vertex 150.02753457015464 -124.08202726980839 -16.800000000000004
+ vertex 150.02753457015464 -124.08202726980836 -16.400000000000002
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -6.007129263248553e-15
+ outer loop
+ vertex 150.02753457015464 -124.08202726980839 -16.800000000000004
+ vertex -149.97246542984422 -124.08202726980832 -16.400000000000095
+ vertex -149.97246542984422 -124.08202726980835 -16.80000000000009
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex 150.02753457015433 -108.8820272698084 -21.199999999999946
+ vertex -149.97246542984445 -111.08202726980835 -21.20000000000005
+ vertex 150.02753457015444 -111.08202726980835 -21.19999999999996
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex -149.97246542984445 -111.08202726980835 -21.20000000000005
+ vertex 150.02753457015433 -108.8820272698084 -21.199999999999946
+ vertex -149.97246542984453 -108.88202726980833 -21.200000000000035
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex -149.97246542984442 -110.68202726980837 -23.000000000000036
+ vertex 150.02753457015433 -105.48202726980843 -22.999999999999954
+ vertex 150.0275345701545 -110.6820272698084 -22.999999999999954
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex 150.02753457015433 -105.48202726980843 -22.999999999999954
+ vertex -149.97246542984442 -110.68202726980837 -23.000000000000036
+ vertex -149.9724654298445 -105.48202726980834 -23.00000000000004
+ endloop
+endfacet
+facet normal -4.164649241083345e-14 0.13052619222006093 0.9914448613738092
+ outer loop
+ vertex 150.02753457015433 -106.68202726980839 -22.399999999999952
+ vertex -149.9724654298445 -107.09613774197234 -22.345481322062547
+ vertex 150.02753457015433 -107.09613774197244 -22.345481322062458
+ endloop
+endfacet
+facet normal -4.164649241083345e-14 0.13052619222006093 0.9914448613738092
+ outer loop
+ vertex -149.9724654298445 -107.09613774197234 -22.345481322062547
+ vertex 150.02753457015433 -106.68202726980839 -22.399999999999952
+ vertex -149.9724654298445 -106.68202726980836 -22.400000000000045
+ endloop
+endfacet
+facet normal -3.881934011071544e-14 0.9914448613738105 -0.13052619222005132
+ outer loop
+ vertex -149.97246542984453 -117.18202726980839 -13.000000000000046
+ vertex 150.02753457015424 -117.09002700078888 -12.301188578223162
+ vertex 150.02753457015433 -117.1820272698084 -12.99999999999996
+ endloop
+endfacet
+facet normal -3.881934011071544e-14 0.9914448613738105 -0.13052619222005132
+ outer loop
+ vertex 150.02753457015424 -117.09002700078888 -12.301188578223162
+ vertex -149.97246542984453 -117.18202726980839 -13.000000000000046
+ vertex -149.97246542984445 -117.09002700078882 -12.30118857822325
+ endloop
+endfacet
+facet normal -5.200343766171888e-14 0.6087614290087029 0.7933533402912488
+ outer loop
+ vertex 150.02753457015433 -115.83202726980839 -15.33826859021793
+ vertex -149.9724654298445 -116.39121557901203 -14.909188309203735
+ vertex 150.02753457015433 -116.39121557901207 -14.909188309203646
+ endloop
+endfacet
+facet normal -5.200343766171888e-14 0.6087614290087029 0.7933533402912488
+ outer loop
+ vertex -149.9724654298445 -116.39121557901203 -14.909188309203735
+ vertex 150.02753457015433 -115.83202726980839 -15.33826859021793
+ vertex -149.9724654298445 -115.83202726980835 -15.338268590218007
+ endloop
+endfacet
+facet normal -7.558400656338414e-15 0.9238795325112905 -0.38268343236508096
+ outer loop
+ vertex 150.02753457015424 -117.09002700078888 -12.301188578223162
+ vertex -149.9724654298446 -116.82029586002633 -11.650000000000038
+ vertex 150.02753457015424 -116.82029586002639 -11.649999999999949
+ endloop
+endfacet
+facet normal -7.558400656338414e-15 0.9238795325112905 -0.38268343236508096
+ outer loop
+ vertex -149.9724654298446 -116.82029586002633 -11.650000000000038
+ vertex 150.02753457015424 -117.09002700078888 -12.301188578223162
+ vertex -149.97246542984445 -117.09002700078882 -12.30118857822325
+ endloop
+endfacet
+facet normal -1.7318603070625494e-14 0.9238795325112914 -0.38268343236507907
+ outer loop
+ vertex -149.97246542984453 -104.61600186602391 -22.50000000000003
+ vertex 150.02753457015427 -104.5161014435193 -22.258819045102463
+ vertex 150.0275345701543 -104.61600186602392 -22.49999999999995
+ endloop
+endfacet
+facet normal -1.7318603070625494e-14 0.9238795325112914 -0.38268343236507907
+ outer loop
+ vertex 150.02753457015427 -104.5161014435193 -22.258819045102463
+ vertex -149.97246542984453 -104.61600186602391 -22.50000000000003
+ vertex -149.9724654298446 -104.51610144351925 -22.25881904510254
+ endloop
+endfacet
+facet normal 3.3995076299891674e-14 0.1305261922200452 -0.9914448613738114
+ outer loop
+ vertex -149.97246542984473 -115.18083869158517 -10.392000269019562
+ vertex 150.02753457015413 -114.48202726980841 -10.299999999999962
+ vertex 150.02753457015416 -115.18083869158521 -10.392000269019473
+ endloop
+endfacet
+facet normal 3.3995076299891674e-14 0.1305261922200452 -0.9914448613738114
+ outer loop
+ vertex 150.02753457015413 -114.48202726980841 -10.299999999999962
+ vertex -149.97246542984473 -115.18083869158517 -10.392000269019562
+ vertex -149.97246542984473 -114.48202726980833 -10.30000000000005
+ endloop
+endfacet
+facet normal 5.200343766171888e-14 -0.6087614290087029 -0.7933533402912488
+ outer loop
+ vertex -149.97246542984476 -113.13202726980836 -10.661731409782044
+ vertex 150.0275345701541 -112.57283896060473 -11.090811690796267
+ vertex 150.0275345701541 -113.1320272698084 -10.661731409781979
+ endloop
+endfacet
+facet normal 5.200343766171888e-14 -0.6087614290087029 -0.7933533402912488
+ outer loop
+ vertex 150.0275345701541 -112.57283896060473 -11.090811690796267
+ vertex -149.97246542984476 -113.13202726980836 -10.661731409782044
+ vertex -149.97246542984476 -112.57283896060468 -11.090811690796333
+ endloop
+endfacet
+facet normal -5.63594127277737e-14 0.9238795325112905 0.382683432365081
+ outer loop
+ vertex -149.9724654298445 -116.82029586002636 -14.350000000000055
+ vertex 150.02753457015433 -117.09002700078888 -13.698811421776757
+ vertex 150.02753457015436 -116.82029586002639 -14.349999999999968
+ endloop
+endfacet
+facet normal -5.63594127277737e-14 0.9238795325112905 0.382683432365081
+ outer loop
+ vertex 150.02753457015433 -117.09002700078888 -13.698811421776757
+ vertex -149.9724654298445 -116.82029586002636 -14.350000000000055
+ vertex -149.9724654298445 -117.09002700078885 -13.698811421776844
+ endloop
+endfacet
+facet normal 2.0504249361718883e-14 0.38268343236510205 -0.9238795325112817
+ outer loop
+ vertex -149.97246542984453 -115.83202726980834 -10.661731409782071
+ vertex 150.02753457015416 -115.18083869158521 -10.392000269019473
+ vertex 150.02753457015416 -115.83202726980839 -10.661731409781982
+ endloop
+endfacet
+facet normal 2.0504249361718883e-14 0.38268343236510205 -0.9238795325112817
+ outer loop
+ vertex 150.02753457015416 -115.18083869158521 -10.392000269019473
+ vertex -149.97246542984453 -115.83202726980834 -10.661731409782071
+ vertex -149.97246542984473 -115.18083869158517 -10.392000269019562
+ endloop
+endfacet
+facet normal -3.277505099810579e-14 -0.13052619222004544 0.9914448613738113
+ outer loop
+ vertex 150.0275345701543 -113.78321584803157 -15.607999730980426
+ vertex -149.9724654298445 -114.48202726980834 -15.700000000000038
+ vertex 150.02753457015433 -114.48202726980838 -15.699999999999937
+ endloop
+endfacet
+facet normal -3.277505099810579e-14 -0.13052619222004544 0.9914448613738113
+ outer loop
+ vertex -149.9724654298445 -114.48202726980834 -15.700000000000038
+ vertex 150.0275345701543 -113.78321584803157 -15.607999730980426
+ vertex -149.97246542984453 -113.78321584803155 -15.607999730980529
+ endloop
+endfacet
+facet normal 7.558400656338414e-15 -0.9238795325112905 0.38268343236508096
+ outer loop
+ vertex 150.02753457015416 -111.87402753882793 -13.69881142177675
+ vertex -149.97246542984465 -112.14375867959039 -14.350000000000053
+ vertex 150.02753457015422 -112.14375867959042 -14.349999999999962
+ endloop
+endfacet
+facet normal 7.558400656338414e-15 -0.9238795325112905 0.38268343236508096
+ outer loop
+ vertex -149.97246542984465 -112.14375867959039 -14.350000000000053
+ vertex 150.02753457015416 -111.87402753882793 -13.69881142177675
+ vertex -149.97246542984468 -111.87402753882786 -13.698811421776819
+ endloop
+endfacet
+facet normal 5.02572181418622e-14 -0.3826834323651004 -0.9238795325112824
+ outer loop
+ vertex -149.97246542984476 -113.78321584803155 -10.39200026901956
+ vertex 150.0275345701541 -113.1320272698084 -10.661731409781979
+ vertex 150.0275345701541 -113.78321584803157 -10.392000269019471
+ endloop
+endfacet
+facet normal 5.02572181418622e-14 -0.3826834323651004 -0.9238795325112824
+ outer loop
+ vertex 150.0275345701541 -113.1320272698084 -10.661731409781979
+ vertex -149.97246542984476 -113.78321584803155 -10.39200026901956
+ vertex -149.97246542984476 -113.13202726980836 -10.661731409782044
+ endloop
+endfacet
+facet normal -3.732692600867523e-15 0.7933533402912372 -0.6087614290087182
+ outer loop
+ vertex -149.9724654298446 -116.82029586002633 -11.650000000000038
+ vertex 150.02753457015422 -116.3912155790121 -11.09081169079627
+ vertex 150.02753457015424 -116.82029586002639 -11.649999999999949
+ endloop
+endfacet
+facet normal -3.732692600867523e-15 0.7933533402912372 -0.6087614290087182
+ outer loop
+ vertex 150.02753457015422 -116.3912155790121 -11.09081169079627
+ vertex -149.9724654298446 -116.82029586002633 -11.650000000000038
+ vertex -149.97246542984468 -116.39121557901206 -11.09081169079636
+ endloop
+endfacet
+facet normal -2.905913769642837e-14 0.9914448613738099 0.1305261922200552
+ outer loop
+ vertex 150.02753457015433 -117.09002700078888 -13.698811421776757
+ vertex -149.97246542984453 -117.18202726980839 -13.000000000000046
+ vertex 150.02753457015433 -117.1820272698084 -12.99999999999996
+ endloop
+endfacet
+facet normal -2.905913769642837e-14 0.9914448613738099 0.1305261922200552
+ outer loop
+ vertex -149.97246542984453 -117.18202726980839 -13.000000000000046
+ vertex 150.02753457015433 -117.09002700078888 -13.698811421776757
+ vertex -149.9724654298445 -117.09002700078885 -13.698811421776844
+ endloop
+endfacet
+facet normal 4.6599210313486503e-14 -0.9238795325112859 -0.3826834323650923
+ outer loop
+ vertex -149.97246542984473 -112.14375867959039 -11.650000000000011
+ vertex 150.0275345701541 -111.8740275388279 -12.301188578223135
+ vertex 150.0275345701541 -112.14375867959043 -11.649999999999945
+ endloop
+endfacet
+facet normal 4.6599210313486503e-14 -0.9238795325112859 -0.3826834323650923
+ outer loop
+ vertex 150.0275345701541 -111.8740275388279 -12.301188578223135
+ vertex -149.97246542984473 -112.14375867959039 -11.650000000000011
+ vertex -149.97246542984476 -111.8740275388279 -12.3011885782232
+ endloop
+endfacet
+facet normal -3.155502569632095e-14 -0.1305261922200097 0.9914448613738159
+ outer loop
+ vertex 150.02753457015433 -106.26791679764438 -22.34548132206248
+ vertex -149.9724654298445 -106.68202726980836 -22.400000000000045
+ vertex 150.02753457015433 -106.68202726980839 -22.399999999999952
+ endloop
+endfacet
+facet normal -3.155502569632095e-14 -0.1305261922200097 0.9914448613738159
+ outer loop
+ vertex -149.9724654298445 -106.68202726980836 -22.400000000000045
+ vertex 150.02753457015433 -106.26791679764438 -22.34548132206248
+ vertex -149.9724654298445 -106.26791679764435 -22.34548132206257
+ endloop
+endfacet
+facet normal -1.1474086062760311e-15 -0.7933533402912362 0.6087614290087194
+ outer loop
+ vertex -149.97246542984465 -112.14375867959039 -14.350000000000053
+ vertex 150.02753457015422 -112.5728389606047 -14.90918830920364
+ vertex 150.02753457015422 -112.14375867959042 -14.349999999999962
+ endloop
+endfacet
+facet normal -1.1474086062760311e-15 -0.7933533402912362 0.6087614290087194
+ outer loop
+ vertex 150.02753457015422 -112.5728389606047 -14.90918830920364
+ vertex -149.97246542984465 -112.14375867959039 -14.350000000000053
+ vertex -149.9724654298445 -112.57283896060466 -14.909188309203731
+ endloop
+endfacet
+facet normal 6.5577768240034135e-15 0.6087614290087043 -0.7933533402912477
+ outer loop
+ vertex -149.97246542984468 -116.39121557901206 -11.09081169079636
+ vertex 150.02753457015416 -115.83202726980839 -10.661731409781982
+ vertex 150.02753457015422 -116.3912155790121 -11.09081169079627
+ endloop
+endfacet
+facet normal 6.5577768240034135e-15 0.6087614290087043 -0.7933533402912477
+ outer loop
+ vertex 150.02753457015416 -115.83202726980839 -10.661731409781982
+ vertex -149.97246542984468 -116.39121557901206 -11.09081169079636
+ vertex -149.97246542984453 -115.83202726980834 -10.661731409782071
+ endloop
+endfacet
+facet normal -4.0426467109047067e-14 0.13052619222004386 0.9914448613738115
+ outer loop
+ vertex 150.02753457015433 -114.48202726980838 -15.699999999999937
+ vertex -149.9724654298445 -115.18083869158517 -15.607999730980517
+ vertex 150.02753457015433 -115.18083869158518 -15.60799973098044
+ endloop
+endfacet
+facet normal -4.0426467109047067e-14 0.13052619222004386 0.9914448613738115
+ outer loop
+ vertex -149.9724654298445 -115.18083869158517 -15.607999730980517
+ vertex 150.02753457015433 -114.48202726980838 -15.699999999999937
+ vertex -149.9724654298445 -114.48202726980834 -15.700000000000038
+ endloop
+endfacet
+facet normal 3.789340105087213e-14 -0.793353340291234 -0.6087614290087222
+ outer loop
+ vertex -149.97246542984476 -112.57283896060468 -11.090811690796333
+ vertex 150.0275345701541 -112.14375867959043 -11.649999999999945
+ vertex 150.0275345701541 -112.57283896060473 -11.090811690796267
+ endloop
+endfacet
+facet normal 3.789340105087213e-14 -0.793353340291234 -0.6087614290087222
+ outer loop
+ vertex 150.0275345701541 -112.14375867959043 -11.649999999999945
+ vertex -149.97246542984476 -112.57283896060468 -11.090811690796333
+ vertex -149.97246542984473 -112.14375867959039 -11.650000000000011
+ endloop
+endfacet
+facet normal 3.8819340110715446e-14 -0.9914448613738105 -0.13052619222005105
+ outer loop
+ vertex 150.0275345701541 -111.8740275388279 -12.301188578223135
+ vertex -149.97246542984468 -111.78202726980835 -13.000000000000021
+ vertex 150.02753457015416 -111.78202726980841 -12.999999999999954
+ endloop
+endfacet
+facet normal 3.8819340110715446e-14 -0.9914448613738105 -0.13052619222005105
+ outer loop
+ vertex -149.97246542984468 -111.78202726980835 -13.000000000000021
+ vertex 150.0275345701541 -111.8740275388279 -12.301188578223135
+ vertex -149.97246542984476 -111.8740275388279 -12.3011885782232
+ endloop
+endfacet
+facet normal 4.0426467109047067e-14 -0.13052619222004386 -0.9914448613738115
+ outer loop
+ vertex -149.97246542984473 -114.48202726980833 -10.30000000000005
+ vertex 150.0275345701541 -113.78321584803157 -10.392000269019471
+ vertex 150.02753457015413 -114.48202726980841 -10.299999999999962
+ endloop
+endfacet
+facet normal 4.0426467109047067e-14 -0.13052619222004386 -0.9914448613738115
+ outer loop
+ vertex 150.0275345701541 -113.78321584803157 -10.392000269019471
+ vertex -149.97246542984473 -114.48202726980833 -10.30000000000005
+ vertex -149.97246542984476 -113.78321584803155 -10.39200026901956
+ endloop
+endfacet
+facet normal -1.8064198758146943e-14 -0.38268343236510816 0.9238795325112792
+ outer loop
+ vertex 150.02753457015433 -105.88202726980838 -22.185640646055063
+ vertex -149.9724654298445 -106.26791679764435 -22.34548132206257
+ vertex 150.02753457015433 -106.26791679764438 -22.34548132206248
+ endloop
+endfacet
+facet normal -1.8064198758146943e-14 -0.38268343236510816 0.9238795325112792
+ outer loop
+ vertex -149.9724654298445 -106.26791679764435 -22.34548132206257
+ vertex 150.02753457015433 -105.88202726980838 -22.185640646055063
+ vertex -149.97246542984445 -105.88202726980833 -22.185640646055152
+ endloop
+endfacet
+facet normal -4.277350225801568e-14 0.793353340291235 0.6087614290087209
+ outer loop
+ vertex 150.02753457015433 -116.39121557901207 -14.909188309203646
+ vertex -149.9724654298445 -116.82029586002636 -14.350000000000055
+ vertex 150.02753457015436 -116.82029586002639 -14.349999999999968
+ endloop
+endfacet
+facet normal -4.277350225801568e-14 0.793353340291235 0.6087614290087209
+ outer loop
+ vertex -149.9724654298445 -116.82029586002636 -14.350000000000055
+ vertex 150.02753457015433 -116.39121557901207 -14.909188309203646
+ vertex -149.9724654298445 -116.39121557901203 -14.909188309203735
+ endloop
+endfacet
+facet normal -1.631797923829057e-14 -0.6087614290087004 0.7933533402912507
+ outer loop
+ vertex 150.02753457015427 -105.55065641990991 -21.93137084989845
+ vertex -149.97246542984445 -105.88202726980833 -22.185640646055152
+ vertex 150.02753457015433 -105.88202726980838 -22.185640646055063
+ endloop
+endfacet
+facet normal -1.631797923829057e-14 -0.6087614290087004 0.7933533402912507
+ outer loop
+ vertex -149.97246542984445 -105.88202726980833 -22.185640646055152
+ vertex 150.02753457015427 -105.55065641990991 -21.93137084989845
+ vertex -149.97246542984445 -105.55065641990987 -21.931370849898535
+ endloop
+endfacet
+facet normal -4.781716753828934e-14 0.3826834323650628 0.923879532511298
+ outer loop
+ vertex 150.02753457015433 -107.09613774197244 -22.345481322062458
+ vertex -149.9724654298445 -107.48202726980833 -22.185640646055155
+ vertex 150.0275345701544 -107.48202726980838 -22.185640646055052
+ endloop
+endfacet
+facet normal -4.781716753828934e-14 0.3826834323650628 0.923879532511298
+ outer loop
+ vertex -149.9724654298445 -107.48202726980833 -22.185640646055155
+ vertex 150.02753457015433 -107.09613774197244 -22.345481322062458
+ vertex -149.9724654298445 -107.09613774197234 -22.345481322062547
+ endloop
+endfacet
+facet normal -6.5577768240034135e-15 -0.6087614290087043 0.7933533402912477
+ outer loop
+ vertex 150.02753457015422 -112.5728389606047 -14.90918830920364
+ vertex -149.97246542984453 -113.13202726980836 -15.33826859021802
+ vertex 150.02753457015424 -113.1320272698084 -15.338268590217929
+ endloop
+endfacet
+facet normal -6.5577768240034135e-15 -0.6087614290087043 0.7933533402912477
+ outer loop
+ vertex -149.97246542984453 -113.13202726980836 -15.33826859021802
+ vertex 150.02753457015422 -112.5728389606047 -14.90918830920364
+ vertex -149.9724654298445 -112.57283896060466 -14.909188309203731
+ endloop
+endfacet
+facet normal -2.0504249361718883e-14 -0.38268343236510205 0.9238795325112817
+ outer loop
+ vertex 150.02753457015424 -113.1320272698084 -15.338268590217929
+ vertex -149.97246542984453 -113.78321584803155 -15.607999730980529
+ vertex 150.0275345701543 -113.78321584803157 -15.607999730980426
+ endloop
+endfacet
+facet normal -2.0504249361718883e-14 -0.38268343236510205 0.9238795325112817
+ outer loop
+ vertex -149.97246542984453 -113.78321584803155 -15.607999730980529
+ vertex 150.02753457015424 -113.1320272698084 -15.338268590217929
+ vertex -149.97246542984453 -113.13202726980836 -15.33826859021802
+ endloop
+endfacet
+facet normal 3.881934011071544e-14 -0.9914448613738105 0.13052619222005132
+ outer loop
+ vertex -149.97246542984468 -111.78202726980835 -13.000000000000021
+ vertex 150.02753457015416 -111.87402753882793 -13.69881142177675
+ vertex 150.02753457015416 -111.78202726980841 -12.999999999999954
+ endloop
+endfacet
+facet normal 3.881934011071544e-14 -0.9914448613738105 0.13052619222005132
+ outer loop
+ vertex 150.02753457015416 -111.87402753882793 -13.69881142177675
+ vertex -149.97246542984468 -111.78202726980835 -13.000000000000021
+ vertex -149.97246542984468 -111.87402753882786 -13.698811421776819
+ endloop
+endfacet
+facet normal -3.8819340110715427e-14 0.9914448613738099 -0.1305261922200554
+ outer loop
+ vertex 150.02753457015427 -104.5161014435193 -22.258819045102463
+ vertex -149.97246542984465 -104.48202726980834 -22.00000000000003
+ vertex 150.02753457015427 -104.48202726980838 -21.99999999999995
+ endloop
+endfacet
+facet normal -3.8819340110715427e-14 0.9914448613738099 -0.1305261922200554
+ outer loop
+ vertex -149.97246542984465 -104.48202726980834 -22.00000000000003
+ vertex 150.02753457015427 -104.5161014435193 -22.258819045102463
+ vertex -149.9724654298446 -104.51610144351925 -22.25881904510254
+ endloop
+endfacet
+facet normal 3.732692600867157e-15 -0.7933533402912247 0.6087614290087344
+ outer loop
+ vertex -149.9724654298446 -105.29638662375325 -21.600000000000065
+ vertex 150.02753457015427 -105.55065641990991 -21.93137084989845
+ vertex 150.02753457015424 -105.29638662375328 -21.599999999999977
+ endloop
+endfacet
+facet normal 3.732692600867157e-15 -0.7933533402912247 0.6087614290087344
+ outer loop
+ vertex 150.02753457015427 -105.55065641990991 -21.93137084989845
+ vertex -149.9724654298446 -105.29638662375325 -21.600000000000065
+ vertex -149.97246542984445 -105.55065641990987 -21.931370849898535
+ endloop
+endfacet
+facet normal -4.293706633114689e-14 0.3826834323650997 0.9238795325112827
+ outer loop
+ vertex 150.02753457015433 -115.18083869158518 -15.60799973098044
+ vertex -149.9724654298445 -115.83202726980835 -15.338268590218007
+ vertex 150.02753457015433 -115.83202726980839 -15.33826859021793
+ endloop
+endfacet
+facet normal -4.293706633114689e-14 0.3826834323650997 0.9238795325112827
+ outer loop
+ vertex -149.9724654298445 -115.83202726980835 -15.338268590218007
+ vertex 150.02753457015433 -115.18083869158518 -15.60799973098044
+ vertex -149.9724654298445 -115.18083869158517 -15.607999730980517
+ endloop
+endfacet
+facet normal 1.8064198758146943e-14 0.38268343236510816 -0.9238795325112792
+ outer loop
+ vertex -149.9724654298446 -107.48202726980833 -19.41435935394494
+ vertex 150.02753457015422 -107.09613774197241 -19.254518677937433
+ vertex 150.02753457015424 -107.48202726980838 -19.41435935394484
+ endloop
+endfacet
+facet normal 1.8064198758146943e-14 0.38268343236510816 -0.9238795325112792
+ outer loop
+ vertex 150.02753457015422 -107.09613774197241 -19.254518677937433
+ vertex -149.9724654298446 -107.48202726980833 -19.41435935394494
+ vertex -149.9724654298445 -107.09613774197234 -19.254518677937522
+ endloop
+endfacet
+facet normal 4.04264671090476e-14 -0.13052619222006184 -0.9914448613738092
+ outer loop
+ vertex -149.97246542984453 -106.68202726980832 -19.20000000000005
+ vertex 150.02753457015422 -106.26791679764435 -19.254518677937455
+ vertex 150.02753457015422 -106.68202726980839 -19.19999999999996
+ endloop
+endfacet
+facet normal 4.04264671090476e-14 -0.13052619222006184 -0.9914448613738092
+ outer loop
+ vertex 150.02753457015422 -106.26791679764435 -19.254518677937455
+ vertex -149.97246542984453 -106.68202726980832 -19.20000000000005
+ vertex -149.97246542984465 -106.26791679764428 -19.254518677937543
+ endloop
+endfacet
+facet normal 2.905913769642842e-14 -0.9914448613738115 -0.13052619222004383
+ outer loop
+ vertex -149.97246542984468 -105.13654594774583 -20.385889527836035
+ vertex 150.02753457015422 -105.08202726980836 -20.79999999999998
+ vertex 150.02753457015424 -105.13654594774586 -20.385889527835946
+ endloop
+endfacet
+facet normal 2.905913769642842e-14 -0.9914448613738115 -0.13052619222004383
+ outer loop
+ vertex 150.02753457015422 -105.08202726980836 -20.79999999999998
+ vertex -149.97246542984468 -105.13654594774583 -20.385889527836035
+ vertex -149.97246542984465 -105.08202726980834 -20.800000000000065
+ endloop
+endfacet
+facet normal -3.88193401107154e-14 0.991444861373809 -0.13052619222006184
+ outer loop
+ vertex -149.97246542984453 -108.28202726980835 -20.800000000000026
+ vertex 150.02753457015433 -108.2275085918709 -20.385889527835893
+ vertex 150.02753457015433 -108.2820272698084 -20.799999999999926
+ endloop
+endfacet
+facet normal -3.88193401107154e-14 0.991444861373809 -0.13052619222006184
+ outer loop
+ vertex 150.02753457015433 -108.2275085918709 -20.385889527835893
+ vertex -149.97246542984453 -108.28202726980835 -20.800000000000026
+ vertex -149.9724654298446 -108.22750859187086 -20.385889527835992
+ endloop
+endfacet
+facet normal -4.277350225801563e-14 0.7933533402912334 0.6087614290087231
+ outer loop
+ vertex -149.9724654298445 -107.8133981197068 -21.931370849898517
+ vertex 150.02753457015433 -108.06766791586351 -21.599999999999945
+ vertex 150.02753457015433 -107.81339811970687 -21.931370849898414
+ endloop
+endfacet
+facet normal -4.277350225801563e-14 0.7933533402912334 0.6087614290087231
+ outer loop
+ vertex 150.02753457015433 -108.06766791586351 -21.599999999999945
+ vertex -149.9724654298445 -107.8133981197068 -21.931370849898517
+ vertex -149.97246542984442 -108.06766791586347 -21.600000000000044
+ endloop
+endfacet
+facet normal 2.905913769642855e-14 -0.9914448613738159 -0.13052619222001066
+ outer loop
+ vertex -149.9724654298452 -105.13654594774582 -4.78588952783602
+ vertex 150.02753457015368 -105.0820272698084 -5.199999999999962
+ vertex 150.02753457015368 -105.1365459477459 -4.785889527835931
+ endloop
+endfacet
+facet normal 2.905913769642855e-14 -0.9914448613738159 -0.13052619222001066
+ outer loop
+ vertex 150.02753457015368 -105.0820272698084 -5.199999999999962
+ vertex -149.9724654298452 -105.13654594774582 -4.78588952783602
+ vertex -149.97246542984507 -105.08202726980836 -5.200000000000053
+ endloop
+endfacet
+facet normal 6.176364007600701e-14 -0.6087614290087395 -0.7933533402912207
+ outer loop
+ vertex -149.97246542984465 -105.88202726980833 -19.414359353944935
+ vertex 150.0275345701542 -105.55065641990991 -19.668629150101488
+ vertex 150.02753457015422 -105.88202726980838 -19.41435935394485
+ endloop
+endfacet
+facet normal 6.176364007600701e-14 -0.6087614290087395 -0.7933533402912207
+ outer loop
+ vertex 150.0275345701542 -105.55065641990991 -19.668629150101488
+ vertex -149.97246542984465 -105.88202726980833 -19.414359353944935
+ vertex -149.97246542984468 -105.55065641990984 -19.668629150101573
+ endloop
+endfacet
+facet normal 3.277505099810686e-14 0.13052619222000883 -0.991444861373816
+ outer loop
+ vertex -149.9724654298445 -107.09613774197234 -19.254518677937522
+ vertex 150.02753457015422 -106.68202726980839 -19.19999999999996
+ vertex 150.02753457015422 -107.09613774197241 -19.254518677937433
+ endloop
+endfacet
+facet normal 3.277505099810686e-14 0.13052619222000883 -0.991444861373816
+ outer loop
+ vertex 150.02753457015422 -106.68202726980839 -19.19999999999996
+ vertex -149.9724654298445 -107.09613774197234 -19.254518677937522
+ vertex -149.97246542984453 -106.68202726980832 -19.20000000000005
+ endloop
+endfacet
+facet normal 3.88193401107154e-14 -0.991444861373809 0.13052619222006184
+ outer loop
+ vertex 150.02753457015422 -105.08202726980836 -20.79999999999998
+ vertex -149.97246542984465 -105.13654594774582 -21.214110472164098
+ vertex 150.02753457015427 -105.13654594774587 -21.21411047216401
+ endloop
+endfacet
+facet normal 3.88193401107154e-14 -0.991444861373809 0.13052619222006184
+ outer loop
+ vertex -149.97246542984465 -105.13654594774582 -21.214110472164098
+ vertex 150.02753457015422 -105.08202726980836 -20.79999999999998
+ vertex -149.97246542984465 -105.08202726980834 -20.800000000000065
+ endloop
+endfacet
+facet normal 2.050424936172055e-14 0.3826834323650453 -0.9238795325113052
+ outer loop
+ vertex -149.97246542984513 -107.48202726980836 -3.8143593539449228
+ vertex 150.02753457015368 -107.09613774197238 -3.654518677937438
+ vertex 150.02753457015368 -107.4820272698084 -3.8143593539448326
+ endloop
+endfacet
+facet normal 2.050424936172055e-14 0.3826834323650453 -0.9238795325113052
+ outer loop
+ vertex 150.02753457015368 -107.09613774197238 -3.654518677937438
+ vertex -149.97246542984513 -107.48202726980836 -3.8143593539449228
+ vertex -149.9724654298452 -107.09613774197234 -3.6545186779375283
+ endloop
+endfacet
+facet normal 4.277350225801563e-14 -0.7933533402912334 -0.6087614290087231
+ outer loop
+ vertex 150.0275345701542 -105.55065641990991 -19.668629150101488
+ vertex -149.97246542984465 -105.29638662375322 -20.000000000000046
+ vertex 150.02753457015422 -105.29638662375328 -19.999999999999957
+ endloop
+endfacet
+facet normal 4.277350225801563e-14 -0.7933533402912334 -0.6087614290087231
+ outer loop
+ vertex -149.97246542984465 -105.29638662375322 -20.000000000000046
+ vertex 150.0275345701542 -105.55065641990991 -19.668629150101488
+ vertex -149.97246542984468 -105.55065641990984 -19.668629150101573
+ endloop
+endfacet
+facet normal 3.789340105087239e-14 -0.7933533402912432 -0.6087614290087103
+ outer loop
+ vertex 150.02753457015365 -105.55065641990991 -4.068629150101493
+ vertex -149.97246542984507 -105.29638662375328 -4.400000000000054
+ vertex 150.02753457015368 -105.29638662375329 -4.399999999999964
+ endloop
+endfacet
+facet normal 3.789340105087239e-14 -0.7933533402912432 -0.6087614290087103
+ outer loop
+ vertex -149.97246542984507 -105.29638662375328 -4.400000000000054
+ vertex 150.02753457015365 -105.55065641990991 -4.068629150101493
+ vertex -149.9724654298452 -105.55065641990984 -4.068629150101582
+ endloop
+endfacet
+facet normal -3.88193401107154e-14 0.991444861373809 -0.13052619222006184
+ outer loop
+ vertex -149.972465429845 -108.28202726980838 -5.200000000000033
+ vertex 150.02753457015376 -108.22750859187093 -4.785889527835911
+ vertex 150.0275345701538 -108.28202726980838 -5.1999999999999424
+ endloop
+endfacet
+facet normal -3.88193401107154e-14 0.991444861373809 -0.13052619222006184
+ outer loop
+ vertex 150.02753457015376 -108.22750859187093 -4.785889527835911
+ vertex -149.972465429845 -108.28202726980838 -5.200000000000033
+ vertex -149.97246542984507 -108.22750859187083 -4.785889527836001
+ endloop
+endfacet
+facet normal 4.5377116934718926e-14 -0.3826834323651088 -0.9238795325112789
+ outer loop
+ vertex -149.97246542984522 -106.2679167976443 -3.6545186779375283
+ vertex 150.02753457015368 -105.88202726980838 -3.8143593539448553
+ vertex 150.02753457015362 -106.26791679764435 -3.654518677937438
+ endloop
+endfacet
+facet normal 4.5377116934718926e-14 -0.3826834323651088 -0.9238795325112789
+ outer loop
+ vertex 150.02753457015368 -105.88202726980838 -3.8143593539448553
+ vertex -149.97246542984522 -106.2679167976443 -3.6545186779375283
+ vertex -149.9724654298452 -105.88202726980833 -3.8143593539449454
+ endloop
+endfacet
+facet normal 4.659921031348627e-14 -0.9238795325112781 -0.38268343236511065
+ outer loop
+ vertex 150.02753457015368 -105.29638662375329 -4.399999999999964
+ vertex -149.9724654298452 -105.13654594774582 -4.78588952783602
+ vertex 150.02753457015368 -105.1365459477459 -4.785889527835931
+ endloop
+endfacet
+facet normal 4.659921031348627e-14 -0.9238795325112781 -0.38268343236511065
+ outer loop
+ vertex -149.9724654298452 -105.13654594774582 -4.78588952783602
+ vertex 150.02753457015368 -105.29638662375329 -4.399999999999964
+ vertex -149.97246542984507 -105.29638662375328 -4.400000000000054
+ endloop
+endfacet
+facet normal 4.7817167538289264e-14 -0.38268343236506036 -0.923879532511299
+ outer loop
+ vertex -149.97246542984465 -106.26791679764428 -19.254518677937543
+ vertex 150.02753457015422 -105.88202726980838 -19.41435935394485
+ vertex 150.02753457015422 -106.26791679764435 -19.254518677937455
+ endloop
+endfacet
+facet normal 4.7817167538289264e-14 -0.38268343236506036 -0.923879532511299
+ outer loop
+ vertex 150.02753457015422 -105.88202726980838 -19.41435935394485
+ vertex -149.97246542984465 -106.26791679764428 -19.254518677937543
+ vertex -149.97246542984465 -105.88202726980833 -19.414359353944935
+ endloop
+endfacet
+facet normal 1.631797923829057e-14 0.6087614290087004 -0.7933533402912507
+ outer loop
+ vertex -149.97246542984453 -107.81339811970683 -19.668629150101555
+ vertex 150.02753457015424 -107.48202726980838 -19.41435935394484
+ vertex 150.02753457015427 -107.81339811970685 -19.668629150101452
+ endloop
+endfacet
+facet normal 1.631797923829057e-14 0.6087614290087004 -0.7933533402912507
+ outer loop
+ vertex 150.02753457015424 -107.48202726980838 -19.41435935394484
+ vertex -149.97246542984453 -107.81339811970683 -19.668629150101555
+ vertex -149.9724654298446 -107.48202726980833 -19.41435935394494
+ endloop
+endfacet
+facet normal 3.88193401107154e-14 -0.991444861373809 0.13052619222006184
+ outer loop
+ vertex 150.02753457015368 -105.0820272698084 -5.199999999999962
+ vertex -149.97246542984513 -105.13654594774586 -5.614110472164084
+ vertex 150.0275345701537 -105.1365459477459 -5.614110472163994
+ endloop
+endfacet
+facet normal 3.88193401107154e-14 -0.991444861373809 0.13052619222006184
+ outer loop
+ vertex -149.97246542984513 -105.13654594774586 -5.614110472164084
+ vertex 150.02753457015368 -105.0820272698084 -5.199999999999962
+ vertex -149.97246542984507 -105.08202726980836 -5.200000000000053
+ endloop
+endfacet
+facet normal 6.557776824003234e-15 0.6087614290087102 -0.7933533402912432
+ outer loop
+ vertex -149.9724654298452 -107.81339811970683 -4.068629150101538
+ vertex 150.02753457015368 -107.4820272698084 -3.8143593539448326
+ vertex 150.0275345701537 -107.81339811970687 -4.068629150101447
+ endloop
+endfacet
+facet normal 6.557776824003234e-15 0.6087614290087102 -0.7933533402912432
+ outer loop
+ vertex 150.02753457015368 -107.4820272698084 -3.8143593539448326
+ vertex -149.9724654298452 -107.81339811970683 -4.068629150101538
+ vertex -149.97246542984513 -107.48202726980836 -3.8143593539449228
+ endloop
+endfacet
+facet normal -2.7078805484912748e-14 0.9238795325112981 -0.38268343236506286
+ outer loop
+ vertex -149.97246542984507 -108.22750859187083 -4.785889527836001
+ vertex 150.02753457015373 -108.06766791586351 -4.399999999999944
+ vertex 150.02753457015376 -108.22750859187093 -4.785889527835911
+ endloop
+endfacet
+facet normal -2.7078805484912748e-14 0.9238795325112981 -0.38268343236506286
+ outer loop
+ vertex 150.02753457015373 -108.06766791586351 -4.399999999999944
+ vertex -149.97246542984507 -108.22750859187083 -4.785889527836001
+ vertex -149.972465429845 -108.06766791586348 -4.400000000000034
+ endloop
+endfacet
+facet normal -2.905913769642842e-14 0.9914448613738116 0.13052619222004347
+ outer loop
+ vertex 150.02753457015433 -108.2275085918709 -21.21411047216398
+ vertex -149.97246542984453 -108.28202726980835 -20.800000000000026
+ vertex 150.02753457015433 -108.2820272698084 -20.799999999999926
+ endloop
+endfacet
+facet normal -2.905913769642842e-14 0.9914448613738116 0.13052619222004347
+ outer loop
+ vertex -149.97246542984453 -108.28202726980835 -20.800000000000026
+ vertex 150.02753457015433 -108.2275085918709 -21.21411047216398
+ vertex -149.97246542984453 -108.22750859187089 -21.21411047216408
+ endloop
+endfacet
+facet normal -2.7078805484912322e-14 0.9238795325112836 -0.3826834323650974
+ outer loop
+ vertex -149.9724654298446 -108.22750859187086 -20.385889527835992
+ vertex 150.0275345701543 -108.06766791586348 -19.999999999999925
+ vertex 150.02753457015433 -108.2275085918709 -20.385889527835893
+ endloop
+endfacet
+facet normal -2.7078805484912322e-14 0.9238795325112836 -0.3826834323650974
+ outer loop
+ vertex 150.0275345701543 -108.06766791586348 -19.999999999999925
+ vertex -149.9724654298446 -108.22750859187086 -20.385889527835992
+ vertex -149.9724654298446 -108.06766791586347 -20.000000000000025
+ endloop
+endfacet
+facet normal 5.6359412727773843e-14 -0.9238795325112955 -0.3826834323650685
+ outer loop
+ vertex 150.02753457015422 -105.29638662375328 -19.999999999999957
+ vertex -149.97246542984468 -105.13654594774583 -20.385889527836035
+ vertex 150.02753457015424 -105.13654594774586 -20.385889527835946
+ endloop
+endfacet
+facet normal 5.6359412727773843e-14 -0.9238795325112955 -0.3826834323650685
+ outer loop
+ vertex -149.97246542984468 -105.13654594774583 -20.385889527836035
+ vertex 150.02753457015422 -105.29638662375328 -19.999999999999957
+ vertex -149.97246542984465 -105.29638662375322 -20.000000000000046
+ endloop
+endfacet
+facet normal 3.1555025696319373e-14 0.1305261922200637 -0.9914448613738089
+ outer loop
+ vertex -149.9724654298452 -107.09613774197234 -3.6545186779375283
+ vertex 150.02753457015368 -106.68202726980839 -3.599999999999943
+ vertex 150.02753457015368 -107.09613774197238 -3.654518677937438
+ endloop
+endfacet
+facet normal 3.1555025696319373e-14 0.1305261922200637 -0.9914448613738089
+ outer loop
+ vertex 150.02753457015368 -106.68202726980839 -3.599999999999943
+ vertex -149.9724654298452 -107.09613774197234 -3.6545186779375283
+ vertex -149.9724654298452 -106.68202726980832 -3.600000000000033
+ endloop
+endfacet
+facet normal 4.04264671090476e-14 -0.13052619222006184 -0.9914448613738092
+ outer loop
+ vertex -149.9724654298452 -106.68202726980832 -3.600000000000033
+ vertex 150.02753457015362 -106.26791679764435 -3.654518677937438
+ vertex 150.02753457015368 -106.68202726980839 -3.599999999999943
+ endloop
+endfacet
+facet normal 4.04264671090476e-14 -0.13052619222006184 -0.9914448613738092
+ outer loop
+ vertex 150.02753457015362 -106.26791679764435 -3.654518677937438
+ vertex -149.9724654298452 -106.68202726980832 -3.600000000000033
+ vertex -149.97246542984522 -106.2679167976443 -3.6545186779375283
+ endloop
+endfacet
+facet normal -4.6599210313486623e-14 0.9238795325112901 0.3826834323650818
+ outer loop
+ vertex -149.97246542984442 -108.06766791586347 -21.600000000000044
+ vertex 150.02753457015433 -108.2275085918709 -21.21411047216398
+ vertex 150.02753457015433 -108.06766791586351 -21.599999999999945
+ endloop
+endfacet
+facet normal -4.6599210313486623e-14 0.9238795325112901 0.3826834323650818
+ outer loop
+ vertex 150.02753457015433 -108.2275085918709 -21.21411047216398
+ vertex -149.97246542984442 -108.06766791586347 -21.600000000000044
+ vertex -149.97246542984453 -108.22750859187089 -21.21411047216408
+ endloop
+endfacet
+facet normal -5.200343766171987e-14 0.6087614290087363 0.7933533402912233
+ outer loop
+ vertex 150.0275345701544 -107.48202726980838 -22.185640646055052
+ vertex -149.9724654298445 -107.8133981197068 -21.931370849898517
+ vertex 150.02753457015433 -107.81339811970687 -21.931370849898414
+ endloop
+endfacet
+facet normal -5.200343766171987e-14 0.6087614290087363 0.7933533402912233
+ outer loop
+ vertex -149.9724654298445 -107.8133981197068 -21.931370849898517
+ vertex 150.0275345701544 -107.48202726980838 -22.185640646055052
+ vertex -149.9724654298445 -107.48202726980833 -22.185640646055155
+ endloop
+endfacet
+facet normal 5.200343766172004e-14 -0.6087614290087426 -0.7933533402912182
+ outer loop
+ vertex -149.9724654298452 -105.88202726980833 -3.8143593539449454
+ vertex 150.02753457015365 -105.55065641990991 -4.068629150101493
+ vertex 150.02753457015368 -105.88202726980838 -3.8143593539448553
+ endloop
+endfacet
+facet normal 5.200343766172004e-14 -0.6087614290087426 -0.7933533402912182
+ outer loop
+ vertex 150.02753457015365 -105.55065641990991 -4.068629150101493
+ vertex -149.9724654298452 -105.88202726980833 -3.8143593539449454
+ vertex -149.9724654298452 -105.55065641990984 -4.068629150101582
+ endloop
+endfacet
+facet normal 2.7078805484912322e-14 -0.9238795325112836 0.3826834323650974
+ outer loop
+ vertex -149.97246542984465 -105.13654594774582 -21.214110472164098
+ vertex 150.02753457015424 -105.29638662375328 -21.599999999999977
+ vertex 150.02753457015427 -105.13654594774587 -21.21411047216401
+ endloop
+endfacet
+facet normal 2.7078805484912322e-14 -0.9238795325112836 0.3826834323650974
+ outer loop
+ vertex 150.02753457015424 -105.29638662375328 -21.599999999999977
+ vertex -149.97246542984465 -105.13654594774582 -21.214110472164098
+ vertex -149.9724654298446 -105.29638662375325 -21.600000000000065
+ endloop
+endfacet
+facet normal 2.7078805484912748e-14 -0.9238795325112981 0.38268343236506286
+ outer loop
+ vertex -149.97246542984513 -105.13654594774586 -5.614110472164084
+ vertex 150.0275345701537 -105.29638662375329 -5.999999999999961
+ vertex 150.0275345701537 -105.1365459477459 -5.614110472163994
+ endloop
+endfacet
+facet normal 2.7078805484912748e-14 -0.9238795325112981 0.38268343236506286
+ outer loop
+ vertex 150.0275345701537 -105.29638662375329 -5.999999999999961
+ vertex -149.97246542984513 -105.13654594774586 -5.614110472164084
+ vertex -149.97246542984504 -105.29638662375325 -6.000000000000051
+ endloop
+endfacet
+facet normal -3.732692600867556e-15 0.7933533402912383 -0.6087614290087168
+ outer loop
+ vertex -149.972465429845 -108.06766791586348 -4.400000000000034
+ vertex 150.0275345701537 -107.81339811970687 -4.068629150101447
+ vertex 150.02753457015373 -108.06766791586351 -4.399999999999944
+ endloop
+endfacet
+facet normal -3.732692600867556e-15 0.7933533402912383 -0.6087614290087168
+ outer loop
+ vertex 150.0275345701537 -107.81339811970687 -4.068629150101447
+ vertex -149.972465429845 -108.06766791586348 -4.400000000000034
+ vertex -149.9724654298452 -107.81339811970683 -4.068629150101538
+ endloop
+endfacet
+facet normal -3.732692600867157e-15 0.7933533402912247 -0.6087614290087344
+ outer loop
+ vertex -149.9724654298446 -108.06766791586347 -20.000000000000025
+ vertex 150.02753457015427 -107.81339811970685 -19.668629150101452
+ vertex 150.0275345701543 -108.06766791586348 -19.999999999999925
+ endloop
+endfacet
+facet normal -3.732692600867157e-15 0.7933533402912247 -0.6087614290087344
+ outer loop
+ vertex 150.02753457015427 -107.81339811970685 -19.668629150101452
+ vertex -149.9724654298446 -108.06766791586347 -20.000000000000025
+ vertex -149.97246542984453 -107.81339811970683 -19.668629150101555
+ endloop
+endfacet
+facet normal -3.88193401107154e-14 0.991444861373809 -0.13052619222006184
+ outer loop
+ vertex 150.02753457015422 -123.88202726980842 -5.199999999999923
+ vertex -149.97246542984465 -123.82750859187088 -4.785889527835981
+ vertex 150.02753457015422 -123.82750859187092 -4.785889527835891
+ endloop
+endfacet
+facet normal -3.88193401107154e-14 0.991444861373809 -0.13052619222006184
+ outer loop
+ vertex -149.97246542984465 -123.82750859187088 -4.785889527835981
+ vertex 150.02753457015422 -123.88202726980842 -5.199999999999923
+ vertex -149.97246542984453 -123.88202726980835 -5.200000000000013
+ endloop
+endfacet
+facet normal 5.200343766171987e-14 -0.6087614290087363 -0.7933533402912233
+ outer loop
+ vertex -149.97246542984473 -121.48202726980833 -3.814359353944937
+ vertex 150.0275345701541 -121.15065641990991 -4.068629150101484
+ vertex 150.0275345701541 -121.48202726980837 -3.814359353944847
+ endloop
+endfacet
+facet normal 5.200343766171987e-14 -0.6087614290087363 -0.7933533402912233
+ outer loop
+ vertex 150.0275345701541 -121.15065641990991 -4.068629150101484
+ vertex -149.97246542984473 -121.48202726980833 -3.814359353944937
+ vertex -149.97246542984473 -121.15065641990988 -4.068629150101574
+ endloop
+endfacet
+facet normal -4.5377116934718926e-14 0.3826834323651088 0.9238795325112789
+ outer loop
+ vertex 150.0275345701538 -107.09613774197246 -6.745481322062464
+ vertex -149.97246542984507 -107.48202726980838 -6.585640646055137
+ vertex 150.02753457015382 -107.48202726980843 -6.5856406460550465
+ endloop
+endfacet
+facet normal -4.5377116934718926e-14 0.3826834323651088 0.9238795325112789
+ outer loop
+ vertex -149.97246542984507 -107.48202726980838 -6.585640646055137
+ vertex 150.0275345701538 -107.09613774197246 -6.745481322062464
+ vertex -149.97246542984496 -107.09613774197238 -6.745481322062554
+ endloop
+endfacet
+facet normal -1.6776756168600079e-15 -0.6087614290087001 0.793353340291251
+ outer loop
+ vertex 150.0275345701542 -121.15065641990992 -6.3313708498984465
+ vertex -149.97246542984465 -121.48202726980836 -6.585640646055151
+ vertex 150.02753457015422 -121.48202726980843 -6.585640646055061
+ endloop
+endfacet
+facet normal -1.6776756168600079e-15 -0.6087614290087001 0.793353340291251
+ outer loop
+ vertex -149.97246542984465 -121.48202726980836 -6.585640646055151
+ vertex 150.0275345701542 -121.15065641990992 -6.3313708498984465
+ vertex -149.97246542984465 -121.15065641990988 -6.331370849898536
+ endloop
+endfacet
+facet normal -6.557776824002234e-15 -0.6087614290087442 0.7933533402912171
+ outer loop
+ vertex 150.0275345701537 -105.55065641990993 -6.331370849898432
+ vertex -149.97246542984507 -105.88202726980833 -6.585640646055159
+ vertex 150.02753457015376 -105.88202726980843 -6.58564064605507
+ endloop
+endfacet
+facet normal -6.557776824002234e-15 -0.6087614290087442 0.7933533402912171
+ outer loop
+ vertex -149.97246542984507 -105.88202726980833 -6.585640646055159
+ vertex 150.0275345701537 -105.55065641990993 -6.331370849898432
+ vertex -149.97246542984513 -105.55065641990987 -6.331370849898522
+ endloop
+endfacet
+facet normal -3.789340105087239e-14 0.7933533402912432 0.6087614290087103
+ outer loop
+ vertex -149.97246542984496 -107.81339811970685 -6.3313708498985
+ vertex 150.0275345701538 -108.06766791586351 -5.999999999999941
+ vertex 150.0275345701538 -107.81339811970689 -6.331370849898409
+ endloop
+endfacet
+facet normal -3.789340105087239e-14 0.7933533402912432 0.6087614290087103
+ outer loop
+ vertex 150.0275345701538 -108.06766791586351 -5.999999999999941
+ vertex -149.97246542984496 -107.81339811970685 -6.3313708498985
+ vertex -149.97246542984504 -108.06766791586347 -6.000000000000031
+ endloop
+endfacet
+facet normal 1.8064198758146943e-14 0.38268343236510816 -0.9238795325112792
+ outer loop
+ vertex -149.9724654298446 -123.08202726980835 -3.8143593539449396
+ vertex 150.0275345701541 -122.69613774197242 -3.654518677937407
+ vertex 150.02753457015413 -123.08202726980839 -3.8143593539448384
+ endloop
+endfacet
+facet normal 1.8064198758146943e-14 0.38268343236510816 -0.9238795325112792
+ outer loop
+ vertex 150.0275345701541 -122.69613774197242 -3.654518677937407
+ vertex -149.9724654298446 -123.08202726980835 -3.8143593539449396
+ vertex -149.97246542984473 -122.69613774197241 -3.65451867793752
+ endloop
+endfacet
+facet normal -3.732692600867157e-15 0.7933533402912247 -0.6087614290087344
+ outer loop
+ vertex -149.97246542984453 -123.66766791586346 -4.400000000000015
+ vertex 150.02753457015413 -123.41339811970687 -4.068629150101453
+ vertex 150.02753457015422 -123.6676679158635 -4.399999999999924
+ endloop
+endfacet
+facet normal -3.732692600867157e-15 0.7933533402912247 -0.6087614290087344
+ outer loop
+ vertex 150.02753457015413 -123.41339811970687 -4.068629150101453
+ vertex -149.97246542984453 -123.66766791586346 -4.400000000000015
+ vertex -149.97246542984473 -123.41339811970683 -4.068629150101555
+ endloop
+endfacet
+facet normal 4.781716753828934e-14 -0.3826834323650628 -0.923879532511298
+ outer loop
+ vertex -149.97246542984465 -121.86791679764431 -3.6545186779375425
+ vertex 150.0275345701541 -121.48202726980837 -3.814359353944847
+ vertex 150.02753457015407 -121.86791679764434 -3.654518677937452
+ endloop
+endfacet
+facet normal 4.781716753828934e-14 -0.3826834323650628 -0.923879532511298
+ outer loop
+ vertex 150.0275345701541 -121.48202726980837 -3.814359353944847
+ vertex -149.97246542984465 -121.86791679764431 -3.6545186779375425
+ vertex -149.97246542984473 -121.48202726980833 -3.814359353944937
+ endloop
+endfacet
+facet normal -3.277505099810546e-14 -0.13052619222005668 0.9914448613738097
+ outer loop
+ vertex 150.02753457015376 -106.26791679764438 -6.745481322062464
+ vertex -149.97246542984507 -106.6820272698084 -6.80000000000005
+ vertex 150.0275345701538 -106.68202726980843 -6.799999999999959
+ endloop
+endfacet
+facet normal -3.277505099810546e-14 -0.13052619222005668 0.9914448613738097
+ outer loop
+ vertex -149.97246542984507 -106.6820272698084 -6.80000000000005
+ vertex 150.02753457015376 -106.26791679764438 -6.745481322062464
+ vertex -149.97246542984507 -106.26791679764433 -6.745481322062554
+ endloop
+endfacet
+facet normal 4.277350225801563e-14 -0.7933533402912334 -0.6087614290087231
+ outer loop
+ vertex 150.0275345701541 -121.15065641990991 -4.068629150101484
+ vertex -149.97246542984465 -120.89638662375327 -4.400000000000046
+ vertex 150.0275345701541 -120.89638662375327 -4.399999999999955
+ endloop
+endfacet
+facet normal 4.277350225801563e-14 -0.7933533402912334 -0.6087614290087231
+ outer loop
+ vertex -149.97246542984465 -120.89638662375327 -4.400000000000046
+ vertex 150.0275345701541 -121.15065641990991 -4.068629150101484
+ vertex -149.97246542984473 -121.15065641990988 -4.068629150101574
+ endloop
+endfacet
+facet normal 4.6599210313486623e-14 -0.9238795325112901 -0.3826834323650818
+ outer loop
+ vertex 150.0275345701541 -120.89638662375327 -4.399999999999955
+ vertex -149.97246542984473 -120.73654594774582 -4.785889527836012
+ vertex 150.0275345701541 -120.7365459477459 -4.785889527835922
+ endloop
+endfacet
+facet normal 4.6599210313486623e-14 -0.9238795325112901 -0.3826834323650818
+ outer loop
+ vertex -149.97246542984473 -120.73654594774582 -4.785889527836012
+ vertex 150.0275345701541 -120.89638662375327 -4.399999999999955
+ vertex -149.97246542984465 -120.89638662375327 -4.400000000000046
+ endloop
+endfacet
+facet normal 2.905913769642842e-14 -0.9914448613738116 -0.13052619222004347
+ outer loop
+ vertex -149.97246542984473 -120.73654594774582 -4.785889527836012
+ vertex 150.02753457015413 -120.68202726980837 -5.199999999999976
+ vertex 150.0275345701541 -120.7365459477459 -4.785889527835922
+ endloop
+endfacet
+facet normal 2.905913769642842e-14 -0.9914448613738116 -0.13052619222004347
+ outer loop
+ vertex 150.02753457015413 -120.68202726980837 -5.199999999999976
+ vertex -149.97246542984473 -120.73654594774582 -4.785889527836012
+ vertex -149.97246542984465 -120.68202726980836 -5.200000000000067
+ endloop
+endfacet
+facet normal 3.7326926008669706e-15 -0.7933533402912183 0.6087614290087429
+ outer loop
+ vertex -149.97246542984504 -105.29638662375325 -6.000000000000051
+ vertex 150.0275345701537 -105.55065641990993 -6.331370849898432
+ vertex 150.0275345701537 -105.29638662375329 -5.999999999999961
+ endloop
+endfacet
+facet normal 3.7326926008669706e-15 -0.7933533402912183 0.6087614290087429
+ outer loop
+ vertex 150.0275345701537 -105.55065641990993 -6.331370849898432
+ vertex -149.97246542984504 -105.29638662375325 -6.000000000000051
+ vertex -149.97246542984513 -105.55065641990987 -6.331370849898522
+ endloop
+endfacet
+facet normal -2.905913769642855e-14 0.9914448613738159 0.13052619222001066
+ outer loop
+ vertex -149.97246542984507 -108.22750859187089 -5.6141104721640644
+ vertex 150.0275345701538 -108.28202726980838 -5.1999999999999424
+ vertex 150.0275345701538 -108.22750859187093 -5.614110472163975
+ endloop
+endfacet
+facet normal -2.905913769642855e-14 0.9914448613738159 0.13052619222001066
+ outer loop
+ vertex 150.0275345701538 -108.28202726980838 -5.1999999999999424
+ vertex -149.97246542984507 -108.22750859187089 -5.6141104721640644
+ vertex -149.972465429845 -108.28202726980838 -5.200000000000033
+ endloop
+endfacet
+facet normal -4.7817167538289264e-14 0.38268343236506036 0.923879532511299
+ outer loop
+ vertex 150.02753457015424 -122.69613774197245 -6.7454813220624334
+ vertex -149.9724654298446 -123.08202726980842 -6.585640646055154
+ vertex 150.02753457015424 -123.08202726980842 -6.585640646055053
+ endloop
+endfacet
+facet normal -4.7817167538289264e-14 0.38268343236506036 0.923879532511299
+ outer loop
+ vertex -149.9724654298446 -123.08202726980842 -6.585640646055154
+ vertex 150.02753457015424 -122.69613774197245 -6.7454813220624334
+ vertex -149.9724654298446 -122.69613774197241 -6.745481322062546
+ endloop
+endfacet
+facet normal -4.277350225801563e-14 0.7933533402912334 0.6087614290087231
+ outer loop
+ vertex -149.9724654298445 -123.41339811970684 -6.331370849898517
+ vertex 150.02753457015424 -123.66766791586353 -5.999999999999944
+ vertex 150.02753457015424 -123.41339811970688 -6.331370849898415
+ endloop
+endfacet
+facet normal -4.277350225801563e-14 0.7933533402912334 0.6087614290087231
+ outer loop
+ vertex 150.02753457015424 -123.66766791586353 -5.999999999999944
+ vertex -149.9724654298445 -123.41339811970684 -6.331370849898517
+ vertex -149.9724654298446 -123.66766791586346 -6.000000000000034
+ endloop
+endfacet
+facet normal 4.164649241083345e-14 -0.13052619222006093 -0.9914448613738092
+ outer loop
+ vertex -149.97246542984473 -122.28202726980837 -3.600000000000047
+ vertex 150.02753457015407 -121.86791679764434 -3.654518677937452
+ vertex 150.02753457015413 -122.2820272698084 -3.5999999999999566
+ endloop
+endfacet
+facet normal 4.164649241083345e-14 -0.13052619222006093 -0.9914448613738092
+ outer loop
+ vertex 150.02753457015407 -121.86791679764434 -3.654518677937452
+ vertex -149.97246542984473 -122.28202726980837 -3.600000000000047
+ vertex -149.97246542984465 -121.86791679764431 -3.6545186779375425
+ endloop
+endfacet
+facet normal 3.732692600867157e-15 -0.7933533402912247 0.6087614290087344
+ outer loop
+ vertex -149.97246542984468 -120.89638662375324 -6.000000000000065
+ vertex 150.0275345701542 -121.15065641990992 -6.3313708498984465
+ vertex 150.02753457015416 -120.89638662375332 -5.999999999999975
+ endloop
+endfacet
+facet normal 3.732692600867157e-15 -0.7933533402912247 0.6087614290087344
+ outer loop
+ vertex 150.0275345701542 -121.15065641990992 -6.3313708498984465
+ vertex -149.97246542984468 -120.89638662375324 -6.000000000000065
+ vertex -149.97246542984465 -121.15065641990988 -6.331370849898536
+ endloop
+endfacet
+facet normal -6.176364007600701e-14 0.6087614290087395 0.7933533402912207
+ outer loop
+ vertex 150.02753457015424 -123.08202726980842 -6.585640646055053
+ vertex -149.9724654298445 -123.41339811970684 -6.331370849898517
+ vertex 150.02753457015424 -123.41339811970688 -6.331370849898415
+ endloop
+endfacet
+facet normal -6.176364007600701e-14 0.6087614290087395 0.7933533402912207
+ outer loop
+ vertex -149.9724654298445 -123.41339811970684 -6.331370849898517
+ vertex 150.02753457015424 -123.08202726980842 -6.585640646055053
+ vertex -149.9724654298446 -123.08202726980842 -6.585640646055154
+ endloop
+endfacet
+facet normal -2.294429996529175e-14 -0.38268343236506447 0.9238795325112973
+ outer loop
+ vertex 150.02753457015376 -105.88202726980843 -6.58564064605507
+ vertex -149.97246542984507 -106.26791679764433 -6.745481322062554
+ vertex 150.02753457015376 -106.26791679764438 -6.745481322062464
+ endloop
+endfacet
+facet normal -2.294429996529175e-14 -0.38268343236506447 0.9238795325112973
+ outer loop
+ vertex -149.97246542984507 -106.26791679764433 -6.745481322062554
+ vertex 150.02753457015376 -105.88202726980843 -6.58564064605507
+ vertex -149.97246542984507 -105.88202726980833 -6.585640646055159
+ endloop
+endfacet
+facet normal -5.200343766172004e-14 0.6087614290087426 0.7933533402912182
+ outer loop
+ vertex 150.02753457015382 -107.48202726980843 -6.5856406460550465
+ vertex -149.97246542984496 -107.81339811970685 -6.3313708498985
+ vertex 150.0275345701538 -107.81339811970689 -6.331370849898409
+ endloop
+endfacet
+facet normal -5.200343766172004e-14 0.6087614290087426 0.7933533402912182
+ outer loop
+ vertex -149.97246542984496 -107.81339811970685 -6.3313708498985
+ vertex 150.02753457015382 -107.48202726980843 -6.5856406460550465
+ vertex -149.97246542984507 -107.48202726980838 -6.585640646055137
+ endloop
+endfacet
+facet normal -2.7078805484912322e-14 0.9238795325112836 -0.3826834323650974
+ outer loop
+ vertex -149.97246542984465 -123.82750859187088 -4.785889527835981
+ vertex 150.02753457015422 -123.6676679158635 -4.399999999999924
+ vertex 150.02753457015422 -123.82750859187092 -4.785889527835891
+ endloop
+endfacet
+facet normal -2.7078805484912322e-14 0.9238795325112836 -0.3826834323650974
+ outer loop
+ vertex 150.02753457015422 -123.6676679158635 -4.399999999999924
+ vertex -149.97246542984465 -123.82750859187088 -4.785889527835981
+ vertex -149.97246542984453 -123.66766791586346 -4.400000000000015
+ endloop
+endfacet
+facet normal 3.88193401107154e-14 -0.991444861373809 0.13052619222006184
+ outer loop
+ vertex -149.97246542984465 -120.68202726980836 -5.200000000000067
+ vertex 150.02753457015413 -120.73654594774587 -5.6141104721640085
+ vertex 150.02753457015413 -120.68202726980837 -5.199999999999976
+ endloop
+endfacet
+facet normal 3.88193401107154e-14 -0.991444861373809 0.13052619222006184
+ outer loop
+ vertex 150.02753457015413 -120.73654594774587 -5.6141104721640085
+ vertex -149.97246542984465 -120.68202726980836 -5.200000000000067
+ vertex -149.97246542984468 -120.73654594774585 -5.614110472164098
+ endloop
+endfacet
+facet normal 1.631797923829057e-14 0.6087614290087004 -0.7933533402912507
+ outer loop
+ vertex -149.97246542984473 -123.41339811970683 -4.068629150101555
+ vertex 150.02753457015413 -123.08202726980839 -3.8143593539448384
+ vertex 150.02753457015413 -123.41339811970687 -4.068629150101453
+ endloop
+endfacet
+facet normal 1.631797923829057e-14 0.6087614290087004 -0.7933533402912507
+ outer loop
+ vertex 150.02753457015413 -123.08202726980839 -3.8143593539448384
+ vertex -149.97246542984473 -123.41339811970683 -4.068629150101555
+ vertex -149.9724654298446 -123.08202726980835 -3.8143593539449396
+ endloop
+endfacet
+facet normal -4.04264671090476e-14 0.13052619222006184 0.9914448613738092
+ outer loop
+ vertex 150.02753457015422 -122.28202726980842 -6.799999999999951
+ vertex -149.9724654298446 -122.69613774197241 -6.745481322062546
+ vertex 150.02753457015424 -122.69613774197245 -6.7454813220624334
+ endloop
+endfacet
+facet normal -4.04264671090476e-14 0.13052619222006184 0.9914448613738092
+ outer loop
+ vertex -149.9724654298446 -122.69613774197241 -6.745481322062546
+ vertex 150.02753457015422 -122.28202726980842 -6.799999999999951
+ vertex -149.9724654298446 -122.28202726980837 -6.800000000000041
+ endloop
+endfacet
+facet normal -2.905913769642842e-14 0.9914448613738116 0.130526192220043
+ outer loop
+ vertex -149.9724654298446 -123.82750859187085 -5.614110472164045
+ vertex 150.02753457015422 -123.88202726980842 -5.199999999999923
+ vertex 150.02753457015422 -123.82750859187092 -5.614110472163954
+ endloop
+endfacet
+facet normal -2.905913769642842e-14 0.9914448613738116 0.130526192220043
+ outer loop
+ vertex 150.02753457015422 -123.88202726980842 -5.199999999999923
+ vertex -149.9724654298446 -123.82750859187085 -5.614110472164045
+ vertex -149.97246542984453 -123.88202726980835 -5.200000000000013
+ endloop
+endfacet
+facet normal -4.659921031348627e-14 0.9238795325112781 0.38268343236511065
+ outer loop
+ vertex 150.0275345701538 -108.06766791586351 -5.999999999999941
+ vertex -149.97246542984507 -108.22750859187089 -5.6141104721640644
+ vertex 150.0275345701538 -108.22750859187093 -5.614110472163975
+ endloop
+endfacet
+facet normal -4.659921031348627e-14 0.9238795325112781 0.38268343236511065
+ outer loop
+ vertex -149.97246542984507 -108.22750859187089 -5.6141104721640644
+ vertex 150.0275345701538 -108.06766791586351 -5.999999999999941
+ vertex -149.97246542984504 -108.06766791586347 -6.000000000000031
+ endloop
+endfacet
+facet normal 3.155502569632095e-14 0.1305261922200097 -0.9914448613738159
+ outer loop
+ vertex -149.97246542984473 -122.69613774197241 -3.65451867793752
+ vertex 150.02753457015413 -122.2820272698084 -3.5999999999999566
+ vertex 150.0275345701541 -122.69613774197242 -3.654518677937407
+ endloop
+endfacet
+facet normal 3.155502569632095e-14 0.1305261922200097 -0.9914448613738159
+ outer loop
+ vertex 150.02753457015413 -122.2820272698084 -3.5999999999999566
+ vertex -149.97246542984473 -122.69613774197241 -3.65451867793752
+ vertex -149.97246542984473 -122.28202726980837 -3.600000000000047
+ endloop
+endfacet
+facet normal -5.6359412727773843e-14 0.9238795325112955 0.3826834323650685
+ outer loop
+ vertex -149.9724654298446 -123.66766791586346 -6.000000000000034
+ vertex 150.02753457015422 -123.82750859187092 -5.614110472163954
+ vertex 150.02753457015424 -123.66766791586353 -5.999999999999944
+ endloop
+endfacet
+facet normal -5.6359412727773843e-14 0.9238795325112955 0.3826834323650685
+ outer loop
+ vertex 150.02753457015422 -123.82750859187092 -5.614110472163954
+ vertex -149.9724654298446 -123.66766791586346 -6.000000000000034
+ vertex -149.9724654298446 -123.82750859187085 -5.614110472164045
+ endloop
+endfacet
+facet normal 2.7078805484912322e-14 -0.9238795325112836 0.3826834323650974
+ outer loop
+ vertex -149.97246542984468 -120.73654594774585 -5.614110472164098
+ vertex 150.02753457015416 -120.89638662375332 -5.999999999999975
+ vertex 150.02753457015413 -120.73654594774587 -5.6141104721640085
+ endloop
+endfacet
+facet normal 2.7078805484912322e-14 -0.9238795325112836 0.3826834323650974
+ outer loop
+ vertex 150.02753457015416 -120.89638662375332 -5.999999999999975
+ vertex -149.97246542984468 -120.73654594774585 -5.614110472164098
+ vertex -149.97246542984468 -120.89638662375324 -6.000000000000065
+ endloop
+endfacet
+facet normal -4.04264671090476e-14 0.13052619222006184 0.9914448613738092
+ outer loop
+ vertex 150.0275345701538 -106.68202726980843 -6.799999999999959
+ vertex -149.97246542984496 -107.09613774197238 -6.745481322062554
+ vertex 150.0275345701538 -107.09613774197246 -6.745481322062464
+ endloop
+endfacet
+facet normal -4.04264671090476e-14 0.13052619222006184 0.9914448613738092
+ outer loop
+ vertex -149.97246542984496 -107.09613774197238 -6.745481322062554
+ vertex 150.0275345701538 -106.68202726980843 -6.799999999999959
+ vertex -149.97246542984507 -106.6820272698084 -6.80000000000005
+ endloop
+endfacet
+facet normal 4.659921031348627e-14 -0.9238795325112781 -0.38268343236511065
+ outer loop
+ vertex -149.9724654298442 -120.89638662375324 -20.000000000000025
+ vertex 150.02753457015467 -120.7365459477459 -20.385889527835904
+ vertex 150.02753457015467 -120.89638662375332 -19.99999999999994
+ endloop
+endfacet
+facet normal 4.659921031348627e-14 -0.9238795325112781 -0.38268343236511065
+ outer loop
+ vertex 150.02753457015467 -120.7365459477459 -20.385889527835904
+ vertex -149.9724654298442 -120.89638662375324 -20.000000000000025
+ vertex -149.9724654298442 -120.73654594774582 -20.385889527835992
+ endloop
+endfacet
+facet normal 2.905913769642855e-14 -0.9914448613738159 -0.13052619222001066
+ outer loop
+ vertex -149.9724654298442 -120.73654594774582 -20.385889527835992
+ vertex 150.0275345701547 -120.6820272698084 -20.799999999999937
+ vertex 150.02753457015467 -120.7365459477459 -20.385889527835904
+ endloop
+endfacet
+facet normal 2.905913769642855e-14 -0.9914448613738159 -0.13052619222001066
+ outer loop
+ vertex 150.0275345701547 -120.6820272698084 -20.799999999999937
+ vertex -149.9724654298442 -120.73654594774582 -20.385889527835992
+ vertex -149.97246542984414 -120.68202726980833 -20.800000000000026
+ endloop
+endfacet
+facet normal 2.7078805484912748e-14 -0.9238795325112981 0.38268343236506286
+ outer loop
+ vertex -149.97246542984414 -120.73654594774585 -21.214110472164055
+ vertex 150.02753457015473 -120.89638662375329 -21.599999999999934
+ vertex 150.02753457015473 -120.7365459477459 -21.21411047216397
+ endloop
+endfacet
+facet normal 2.7078805484912748e-14 -0.9238795325112981 0.38268343236506286
+ outer loop
+ vertex 150.02753457015473 -120.89638662375329 -21.599999999999934
+ vertex -149.97246542984414 -120.73654594774585 -21.214110472164055
+ vertex -149.9724654298441 -120.89638662375329 -21.600000000000023
+ endloop
+endfacet
+facet normal 3.88193401107154e-14 -0.991444861373809 0.13052619222006184
+ outer loop
+ vertex -149.97246542984414 -120.68202726980833 -20.800000000000026
+ vertex 150.02753457015473 -120.7365459477459 -21.21411047216397
+ vertex 150.0275345701547 -120.6820272698084 -20.799999999999937
+ endloop
+endfacet
+facet normal 3.88193401107154e-14 -0.991444861373809 0.13052619222006184
+ outer loop
+ vertex 150.02753457015473 -120.7365459477459 -21.21411047216397
+ vertex -149.97246542984414 -120.68202726980833 -20.800000000000026
+ vertex -149.97246542984414 -120.73654594774585 -21.214110472164055
+ endloop
+endfacet
+facet normal -3.277505099810686e-14 -0.13052619222000883 0.991444861373816
+ outer loop
+ vertex 150.02753457015422 -121.86791679764437 -6.745481322062478
+ vertex -149.9724654298446 -122.28202726980837 -6.800000000000041
+ vertex 150.02753457015422 -122.28202726980842 -6.799999999999951
+ endloop
+endfacet
+facet normal -3.277505099810686e-14 -0.13052619222000883 0.991444861373816
+ outer loop
+ vertex -149.9724654298446 -122.28202726980837 -6.800000000000041
+ vertex 150.02753457015422 -121.86791679764437 -6.745481322062478
+ vertex -149.97246542984468 -121.86791679764434 -6.7454813220625685
+ endloop
+endfacet
+facet normal -3.1555025696319373e-14 -0.1305261922200637 0.9914448613738089
+ outer loop
+ vertex 150.02753457015476 -121.86791679764441 -22.34548132206245
+ vertex -149.9724654298441 -122.2820272698084 -22.400000000000023
+ vertex 150.02753457015478 -122.28202726980842 -22.399999999999945
+ endloop
+endfacet
+facet normal -3.1555025696319373e-14 -0.1305261922200637 0.9914448613738089
+ outer loop
+ vertex -149.9724654298441 -122.2820272698084 -22.400000000000023
+ vertex 150.02753457015476 -121.86791679764441 -22.34548132206245
+ vertex -149.97246542984405 -121.86791679764434 -22.34548132206253
+ endloop
+endfacet
+facet normal -2.905913769642855e-14 0.9914448613738158 0.1305261922200104
+ outer loop
+ vertex -149.97246542984405 -123.82750859187088 -21.214110472164048
+ vertex 150.02753457015476 -123.88202726980839 -20.79999999999993
+ vertex 150.0275345701548 -123.82750859187092 -21.21411047216396
+ endloop
+endfacet
+facet normal -2.905913769642855e-14 0.9914448613738158 0.1305261922200104
+ outer loop
+ vertex 150.02753457015476 -123.88202726980839 -20.79999999999993
+ vertex -149.97246542984405 -123.82750859187088 -21.214110472164048
+ vertex -149.97246542984396 -123.88202726980838 -20.800000000000015
+ endloop
+endfacet
+facet normal 1.1474086062765636e-15 0.793353340291218 -0.6087614290087431
+ outer loop
+ vertex -149.972465429844 -123.66766791586348 -20.000000000000018
+ vertex 150.0275345701547 -123.41339811970687 -19.66862915010146
+ vertex 150.02753457015476 -123.6676679158635 -19.99999999999993
+ endloop
+endfacet
+facet normal 1.1474086062765636e-15 0.793353340291218 -0.6087614290087431
+ outer loop
+ vertex 150.0275345701547 -123.41339811970687 -19.66862915010146
+ vertex -149.972465429844 -123.66766791586348 -20.000000000000018
+ vertex -149.9724654298441 -123.41339811970683 -19.668629150101545
+ endloop
+endfacet
+facet normal -2.050424936172055e-14 -0.3826834323650453 0.9238795325113052
+ outer loop
+ vertex 150.02753457015476 -121.4820272698084 -22.18564064605505
+ vertex -149.97246542984405 -121.86791679764434 -22.34548132206253
+ vertex 150.02753457015476 -121.86791679764441 -22.34548132206245
+ endloop
+endfacet
+facet normal -2.050424936172055e-14 -0.3826834323650453 0.9238795325113052
+ outer loop
+ vertex -149.97246542984405 -121.86791679764434 -22.34548132206253
+ vertex 150.02753457015476 -121.4820272698084 -22.18564064605505
+ vertex -149.9724654298441 -121.48202726980836 -22.185640646055134
+ endloop
+endfacet
+facet normal 6.557776824002234e-15 0.6087614290087442 -0.7933533402912171
+ outer loop
+ vertex -149.9724654298441 -123.41339811970683 -19.668629150101545
+ vertex 150.02753457015473 -123.08202726980839 -19.41435935394482
+ vertex 150.0275345701547 -123.41339811970687 -19.66862915010146
+ endloop
+endfacet
+facet normal 6.557776824002234e-15 0.6087614290087442 -0.7933533402912171
+ outer loop
+ vertex 150.02753457015473 -123.08202726980839 -19.41435935394482
+ vertex -149.9724654298441 -123.41339811970683 -19.668629150101545
+ vertex -149.9724654298442 -123.08202726980838 -19.414359353944903
+ endloop
+endfacet
+facet normal -5.2003437661719044e-14 0.6087614290087087 0.7933533402912443
+ outer loop
+ vertex 150.02753457015484 -123.08202726980844 -22.185640646055035
+ vertex -149.97246542984396 -123.41339811970684 -21.931370849898506
+ vertex 150.0275345701548 -123.41339811970688 -21.93137084989842
+ endloop
+endfacet
+facet normal -5.2003437661719044e-14 0.6087614290087087 0.7933533402912443
+ outer loop
+ vertex -149.97246542984396 -123.41339811970684 -21.931370849898506
+ vertex 150.02753457015484 -123.08202726980844 -22.185640646055035
+ vertex -149.9724654298441 -123.08202726980838 -22.185640646055123
+ endloop
+endfacet
+facet normal 3.277505099810546e-14 0.13052619222005668 -0.9914448613738097
+ outer loop
+ vertex -149.97246542984405 -122.69613774197241 -19.254518677937508
+ vertex 150.02753457015464 -122.28202726980837 -19.19999999999993
+ vertex 150.02753457015467 -122.69613774197242 -19.254518677937426
+ endloop
+endfacet
+facet normal 3.277505099810546e-14 0.13052619222005668 -0.9914448613738097
+ outer loop
+ vertex 150.02753457015464 -122.28202726980837 -19.19999999999993
+ vertex -149.97246542984405 -122.69613774197241 -19.254518677937508
+ vertex -149.97246542984405 -122.28202726980832 -19.200000000000006
+ endloop
+endfacet
+facet normal 5.200343766172004e-14 -0.6087614290087426 -0.7933533402912182
+ outer loop
+ vertex -149.97246542984422 -121.48202726980836 -19.414359353944917
+ vertex 150.02753457015467 -121.15065641990991 -19.668629150101474
+ vertex 150.02753457015464 -121.4820272698084 -19.414359353944835
+ endloop
+endfacet
+facet normal 5.200343766172004e-14 -0.6087614290087426 -0.7933533402912182
+ outer loop
+ vertex 150.02753457015467 -121.15065641990991 -19.668629150101474
+ vertex -149.97246542984422 -121.48202726980836 -19.414359353944917
+ vertex -149.9724654298442 -121.15065641990988 -19.668629150101555
+ endloop
+endfacet
+facet normal 3.789340105087239e-14 -0.7933533402912432 -0.6087614290087103
+ outer loop
+ vertex 150.02753457015467 -121.15065641990991 -19.668629150101474
+ vertex -149.9724654298442 -120.89638662375324 -20.000000000000025
+ vertex 150.02753457015467 -120.89638662375332 -19.99999999999994
+ endloop
+endfacet
+facet normal 3.789340105087239e-14 -0.7933533402912432 -0.6087614290087103
+ outer loop
+ vertex -149.9724654298442 -120.89638662375324 -20.000000000000025
+ vertex 150.02753457015467 -121.15065641990991 -19.668629150101474
+ vertex -149.9724654298442 -121.15065641990988 -19.668629150101555
+ endloop
+endfacet
+facet normal -5.253370467230355e-14 0.7933533402912631 0.6087614290086841
+ outer loop
+ vertex -149.97246542984396 -123.41339811970684 -21.931370849898506
+ vertex 150.02753457015478 -123.66766791586353 -21.599999999999927
+ vertex 150.0275345701548 -123.41339811970688 -21.93137084989842
+ endloop
+endfacet
+facet normal -5.253370467230355e-14 0.7933533402912631 0.6087614290086841
+ outer loop
+ vertex 150.02753457015478 -123.66766791586353 -21.599999999999927
+ vertex -149.97246542984396 -123.41339811970684 -21.931370849898506
+ vertex -149.97246542984396 -123.66766791586348 -21.600000000000016
+ endloop
+endfacet
+facet normal -4.537711693471893e-14 0.38268343236510904 0.9238795325112787
+ outer loop
+ vertex 150.02753457015478 -122.69613774197245 -22.34548132206245
+ vertex -149.9724654298441 -123.08202726980838 -22.185640646055123
+ vertex 150.02753457015484 -123.08202726980844 -22.185640646055035
+ endloop
+endfacet
+facet normal -4.537711693471893e-14 0.38268343236510904 0.9238795325112787
+ outer loop
+ vertex -149.9724654298441 -123.08202726980838 -22.185640646055123
+ vertex 150.02753457015478 -122.69613774197245 -22.34548132206245
+ vertex -149.97246542984405 -122.69613774197241 -22.345481322062533
+ endloop
+endfacet
+facet normal -1.677675616859735e-15 -0.6087614290087094 0.7933533402912438
+ outer loop
+ vertex 150.02753457015473 -121.15065641990992 -21.93137084989843
+ vertex -149.9724654298441 -121.48202726980836 -22.185640646055134
+ vertex 150.02753457015476 -121.4820272698084 -22.18564064605505
+ endloop
+endfacet
+facet normal -1.677675616859735e-15 -0.6087614290087094 0.7933533402912438
+ outer loop
+ vertex -149.9724654298441 -121.48202726980836 -22.185640646055134
+ vertex 150.02753457015473 -121.15065641990992 -21.93137084989843
+ vertex -149.9724654298441 -121.15065641990988 -21.931370849898517
+ endloop
+endfacet
+facet normal -4.659921031348628e-14 0.9238795325112782 0.38268343236511054
+ outer loop
+ vertex 150.02753457015478 -123.66766791586353 -21.599999999999927
+ vertex -149.97246542984405 -123.82750859187088 -21.214110472164048
+ vertex 150.0275345701548 -123.82750859187092 -21.21411047216396
+ endloop
+endfacet
+facet normal -4.659921031348628e-14 0.9238795325112782 0.38268343236511054
+ outer loop
+ vertex -149.97246542984405 -123.82750859187088 -21.214110472164048
+ vertex 150.02753457015478 -123.66766791586353 -21.599999999999927
+ vertex -149.97246542984396 -123.66766791586348 -21.600000000000016
+ endloop
+endfacet
+facet normal -2.7078805484912748e-14 0.9238795325112981 -0.38268343236506286
+ outer loop
+ vertex 150.02753457015476 -123.82750859187092 -20.385889527835896
+ vertex -149.972465429844 -123.66766791586348 -20.000000000000018
+ vertex 150.02753457015476 -123.6676679158635 -19.99999999999993
+ endloop
+endfacet
+facet normal -2.7078805484912748e-14 0.9238795325112981 -0.38268343236506286
+ outer loop
+ vertex -149.972465429844 -123.66766791586348 -20.000000000000018
+ vertex 150.02753457015476 -123.82750859187092 -20.385889527835896
+ vertex -149.97246542984414 -123.82750859187088 -20.385889527835985
+ endloop
+endfacet
+facet normal -1.8064198758146943e-14 -0.38268343236510816 0.9238795325112792
+ outer loop
+ vertex 150.02753457015422 -121.48202726980843 -6.585640646055061
+ vertex -149.97246542984468 -121.86791679764434 -6.7454813220625685
+ vertex 150.02753457015422 -121.86791679764437 -6.745481322062478
+ endloop
+endfacet
+facet normal -1.8064198758146943e-14 -0.38268343236510816 0.9238795325112792
+ outer loop
+ vertex -149.97246542984468 -121.86791679764434 -6.7454813220625685
+ vertex 150.02753457015422 -121.48202726980843 -6.585640646055061
+ vertex -149.97246542984465 -121.48202726980836 -6.585640646055151
+ endloop
+endfacet
+facet normal 3.732692600867556e-15 -0.7933533402912383 0.6087614290087168
+ outer loop
+ vertex -149.9724654298441 -120.89638662375329 -21.600000000000023
+ vertex 150.02753457015473 -121.15065641990992 -21.93137084989843
+ vertex 150.02753457015473 -120.89638662375329 -21.599999999999934
+ endloop
+endfacet
+facet normal 3.732692600867556e-15 -0.7933533402912383 0.6087614290087168
+ outer loop
+ vertex 150.02753457015473 -121.15065641990992 -21.93137084989843
+ vertex -149.9724654298441 -120.89638662375329 -21.600000000000023
+ vertex -149.9724654298441 -121.15065641990988 -21.931370849898517
+ endloop
+endfacet
+facet normal -4.04264671090476e-14 0.13052619222006184 0.9914448613738092
+ outer loop
+ vertex 150.02753457015478 -122.28202726980842 -22.399999999999945
+ vertex -149.97246542984405 -122.69613774197241 -22.345481322062533
+ vertex 150.02753457015478 -122.69613774197245 -22.34548132206245
+ endloop
+endfacet
+facet normal -4.04264671090476e-14 0.13052619222006184 0.9914448613738092
+ outer loop
+ vertex -149.97246542984405 -122.69613774197241 -22.345481322062533
+ vertex 150.02753457015478 -122.28202726980842 -22.399999999999945
+ vertex -149.9724654298441 -122.2820272698084 -22.400000000000023
+ endloop
+endfacet
+facet normal 2.294429996529175e-14 0.38268343236506447 -0.9238795325112973
+ outer loop
+ vertex -149.9724654298442 -123.08202726980838 -19.414359353944903
+ vertex 150.02753457015467 -122.69613774197242 -19.254518677937426
+ vertex 150.02753457015473 -123.08202726980839 -19.41435935394482
+ endloop
+endfacet
+facet normal 2.294429996529175e-14 0.38268343236506447 -0.9238795325112973
+ outer loop
+ vertex 150.02753457015467 -122.69613774197242 -19.254518677937426
+ vertex -149.9724654298442 -123.08202726980838 -19.414359353944903
+ vertex -149.97246542984405 -122.69613774197241 -19.254518677937508
+ endloop
+endfacet
+facet normal 4.5377116934718926e-14 -0.3826834323651088 -0.9238795325112789
+ outer loop
+ vertex -149.97246542984422 -121.86791679764431 -19.2545186779375
+ vertex 150.02753457015464 -121.4820272698084 -19.414359353944835
+ vertex 150.02753457015467 -121.86791679764434 -19.254518677937423
+ endloop
+endfacet
+facet normal 4.5377116934718926e-14 -0.3826834323651088 -0.9238795325112789
+ outer loop
+ vertex 150.02753457015464 -121.4820272698084 -19.414359353944835
+ vertex -149.97246542984422 -121.86791679764431 -19.2545186779375
+ vertex -149.97246542984422 -121.48202726980836 -19.414359353944917
+ endloop
+endfacet
+facet normal -3.88193401107154e-14 0.991444861373809 -0.13052619222006204
+ outer loop
+ vertex 150.02753457015476 -123.88202726980839 -20.79999999999993
+ vertex -149.97246542984414 -123.82750859187088 -20.385889527835985
+ vertex 150.02753457015476 -123.82750859187092 -20.385889527835896
+ endloop
+endfacet
+facet normal -3.88193401107154e-14 0.991444861373809 -0.13052619222006204
+ outer loop
+ vertex -149.97246542984414 -123.82750859187088 -20.385889527835985
+ vertex 150.02753457015476 -123.88202726980839 -20.79999999999993
+ vertex -149.97246542984396 -123.88202726980838 -20.800000000000015
+ endloop
+endfacet
+facet normal 4.04264671090476e-14 -0.13052619222006184 -0.9914448613738092
+ outer loop
+ vertex -149.97246542984405 -122.28202726980832 -19.200000000000006
+ vertex 150.02753457015467 -121.86791679764434 -19.254518677937423
+ vertex 150.02753457015464 -122.28202726980837 -19.19999999999993
+ endloop
+endfacet
+facet normal 4.04264671090476e-14 -0.13052619222006184 -0.9914448613738092
+ outer loop
+ vertex 150.02753457015467 -121.86791679764434 -19.254518677937423
+ vertex -149.97246542984405 -122.28202726980832 -19.200000000000006
+ vertex -149.97246542984422 -121.86791679764431 -19.2545186779375
+ endloop
+endfacet
+facet normal 3.8819340110715427e-14 -0.9914448613738099 0.1305261922200554
+ outer loop
+ vertex -149.97246542984465 -124.44795309609741 -3.7411809548975263
+ vertex 150.02753457015422 -124.48202726980844 -3.9999999999999476
+ vertex 150.02753457015422 -124.44795309609748 -3.741180954897436
+ endloop
+endfacet
+facet normal 3.8819340110715427e-14 -0.9914448613738099 0.1305261922200554
+ outer loop
+ vertex 150.02753457015422 -124.48202726980844 -3.9999999999999476
+ vertex -149.97246542984465 -124.44795309609741 -3.7411809548975263
+ vertex -149.97246542984465 -124.48202726980834 -4.000000000000038
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 1.5003536199769242e-15
+ outer loop
+ vertex 150.02753457015422 -124.48202726980844 -3.9999999999999476
+ vertex -149.9724654298445 -124.48202726980837 -9.20000000000005
+ vertex 150.02753457015442 -124.48202726980841 -9.19999999999996
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 1.5003536199769242e-15
+ outer loop
+ vertex -149.9724654298445 -124.48202726980837 -9.20000000000005
+ vertex 150.02753457015422 -124.48202726980844 -3.9999999999999476
+ vertex -149.97246542984465 -124.48202726980834 -4.000000000000038
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -4.4649600931051686e-15
+ outer loop
+ vertex -149.97246542984445 -124.08202726980836 -9.20000000000005
+ vertex 150.0275345701544 -124.08202726980842 -9.59999999999996
+ vertex 150.0275345701544 -124.08202726980842 -9.19999999999996
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -4.4649600931051686e-15
+ outer loop
+ vertex 150.0275345701544 -124.08202726980842 -9.59999999999996
+ vertex -149.97246542984445 -124.08202726980836 -9.20000000000005
+ vertex -149.97246542984436 -124.08202726980839 -9.60000000000005
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex -149.9724654298445 -122.68202726980837 -7.40000000000004
+ vertex 150.0275345701542 -120.64771269475769 -7.39999999999995
+ vertex 150.0275345701543 -122.6820272698084 -7.3999999999999275
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex 150.0275345701542 -120.64771269475769 -7.39999999999995
+ vertex -149.9724654298445 -122.68202726980837 -7.40000000000004
+ vertex -149.97246542984468 -120.64771269475763 -7.40000000000004
+ endloop
+endfacet
+facet normal 2.7078805484912562e-14 -0.9238795325112917 0.3826834323650779
+ outer loop
+ vertex -149.97246542984468 -124.3480526735928 -3.5000000000000386
+ vertex 150.02753457015422 -124.44795309609748 -3.741180954897436
+ vertex 150.0275345701542 -124.34805267359285 -3.4999999999999485
+ endloop
+endfacet
+facet normal 2.7078805484912562e-14 -0.9238795325112917 0.3826834323650779
+ outer loop
+ vertex 150.02753457015422 -124.44795309609748 -3.741180954897436
+ vertex -149.97246542984468 -124.3480526735928 -3.5000000000000386
+ vertex -149.97246542984465 -124.44795309609741 -3.7411809548975263
+ endloop
+endfacet
+facet normal 4.024562528319985e-14 -0.7071067811865452 -0.7071067811865499
+ outer loop
+ vertex -149.97246542984468 -120.64771269475763 -7.40000000000004
+ vertex 150.02753457015422 -118.1820272698084 -9.8656854249492
+ vertex 150.0275345701542 -120.64771269475769 -7.39999999999995
+ endloop
+endfacet
+facet normal 4.024562528319985e-14 -0.7071067811865452 -0.7071067811865499
+ outer loop
+ vertex 150.02753457015422 -118.1820272698084 -9.8656854249492
+ vertex -149.97246542984468 -120.64771269475763 -7.40000000000004
+ vertex -149.97246542984465 -118.18202726980833 -9.865685424949291
+ endloop
+endfacet
+facet normal 3.592621386430645e-14 1.705409617590812e-14 -1.0
+ outer loop
+ vertex -149.97246542984436 -124.08202726980839 -9.60000000000005
+ vertex 150.02753457015436 -122.6820272698084 -9.599999999999923
+ vertex 150.0275345701544 -124.08202726980842 -9.59999999999996
+ endloop
+endfacet
+facet normal 3.592621386430645e-14 1.705409617590812e-14 -1.0
+ outer loop
+ vertex 150.02753457015436 -122.6820272698084 -9.599999999999923
+ vertex -149.97246542984436 -124.08202726980839 -9.60000000000005
+ vertex -149.9724654298445 -122.68202726980834 -9.600000000000035
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex -149.9724654298445 -124.48202726980837 -9.20000000000005
+ vertex 150.0275345701544 -124.08202726980842 -9.19999999999996
+ vertex 150.02753457015442 -124.48202726980841 -9.19999999999996
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex 150.0275345701544 -124.08202726980842 -9.19999999999996
+ vertex -149.9724654298445 -124.48202726980837 -9.20000000000005
+ vertex -149.97246542984445 -124.08202726980836 -9.20000000000005
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex 150.02753457015436 -122.6820272698084 -9.599999999999923
+ vertex -149.9724654298445 -122.68202726980837 -7.40000000000004
+ vertex 150.0275345701543 -122.6820272698084 -7.3999999999999275
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex -149.9724654298445 -122.68202726980837 -7.40000000000004
+ vertex 150.02753457015436 -122.6820272698084 -9.599999999999923
+ vertex -149.9724654298445 -122.68202726980834 -9.600000000000035
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -1.052465433482836e-15
+ outer loop
+ vertex 150.02753457015422 -118.1820272698084 -9.8656854249492
+ vertex -149.97246542984442 -118.18202726980836 -16.134314575050784
+ vertex 150.02753457015447 -118.18202726980839 -16.134314575050695
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -1.052465433482836e-15
+ outer loop
+ vertex -149.97246542984442 -118.18202726980836 -16.134314575050784
+ vertex 150.02753457015422 -118.1820272698084 -9.8656854249492
+ vertex -149.97246542984465 -118.18202726980833 -9.865685424949291
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex -149.97246542984465 -104.48202726980834 -22.00000000000003
+ vertex 150.0275345701541 -104.48202726980838 -16.79999999999996
+ vertex 150.02753457015427 -104.48202726980838 -21.99999999999995
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex 150.0275345701541 -104.48202726980838 -16.79999999999996
+ vertex -149.97246542984465 -104.48202726980834 -22.00000000000003
+ vertex -149.97246542984476 -104.48202726980834 -16.80000000000004
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex 150.0275345701541 -104.48202726980838 -16.79999999999996
+ vertex -149.97246542984482 -104.88202726980836 -16.80000000000005
+ vertex 150.0275345701541 -104.8820272698084 -16.799999999999965
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex -149.97246542984482 -104.88202726980836 -16.80000000000005
+ vertex 150.0275345701541 -104.48202726980838 -16.79999999999996
+ vertex -149.97246542984476 -104.48202726980834 -16.80000000000004
+ endloop
+endfacet
+facet normal -3.907009026439115e-14 1.0 2.739417086921043e-15
+ outer loop
+ vertex -149.9724654298446 -110.78202726980835 -16.134314575050794
+ vertex 150.027534570154 -110.7820272698084 -9.865685424949215
+ vertex 150.02753457015424 -110.7820272698084 -16.134314575050713
+ endloop
+endfacet
+facet normal -3.907009026439115e-14 1.0 2.739417086921043e-15
+ outer loop
+ vertex 150.027534570154 -110.7820272698084 -9.865685424949215
+ vertex -149.9724654298446 -110.78202726980835 -16.134314575050794
+ vertex -149.97246542984473 -110.78202726980835 -9.865685424949328
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex 150.02753457015407 -104.88202726980839 -16.399999999999963
+ vertex -149.97246542984473 -106.28202726980834 -16.400000000000055
+ vertex 150.0275345701541 -106.28202726980841 -16.399999999999963
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex -149.97246542984473 -106.28202726980834 -16.400000000000055
+ vertex 150.02753457015407 -104.88202726980839 -16.399999999999963
+ vertex -149.97246542984476 -104.88202726980836 -16.400000000000052
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex -149.972465429845 -108.31634184485912 -7.400000000000051
+ vertex 150.0275345701538 -106.28202726980842 -7.399999999999959
+ vertex 150.02753457015388 -108.31634184485917 -7.399999999999961
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex 150.0275345701538 -106.28202726980842 -7.399999999999959
+ vertex -149.972465429845 -108.31634184485912 -7.400000000000051
+ vertex -149.97246542984504 -106.28202726980835 -7.400000000000048
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex -149.97246542984504 -106.28202726980835 -7.400000000000048
+ vertex 150.02753457015388 -106.28202726980838 -9.599999999999953
+ vertex 150.0275345701538 -106.28202726980842 -7.399999999999959
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex 150.02753457015388 -106.28202726980838 -9.599999999999953
+ vertex -149.97246542984504 -106.28202726980835 -7.400000000000048
+ vertex -149.97246542984496 -106.28202726980834 -9.600000000000044
+ endloop
+endfacet
+facet normal 3.592621386430645e-14 1.7054096175908306e-14 -1.0
+ outer loop
+ vertex -149.97246542984496 -106.28202726980834 -9.600000000000044
+ vertex 150.02753457015385 -104.88202726980839 -9.599999999999929
+ vertex 150.02753457015388 -106.28202726980838 -9.599999999999953
+ endloop
+endfacet
+facet normal 3.592621386430645e-14 1.7054096175908306e-14 -1.0
+ outer loop
+ vertex 150.02753457015385 -104.88202726980839 -9.599999999999929
+ vertex -149.97246542984496 -106.28202726980834 -9.600000000000044
+ vertex -149.972465429845 -104.88202726980833 -9.60000000000002
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex 150.02753457015422 -106.28202726980838 -18.59999999999996
+ vertex -149.97246542984465 -108.3163418448591 -18.60000000000005
+ vertex 150.02753457015424 -108.31634184485912 -18.599999999999948
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex -149.97246542984465 -108.3163418448591 -18.60000000000005
+ vertex 150.02753457015422 -106.28202726980838 -18.59999999999996
+ vertex -149.97246542984465 -106.28202726980835 -18.60000000000005
+ endloop
+endfacet
+facet normal -4.024562528319985e-14 0.7071067811865452 0.7071067811865499
+ outer loop
+ vertex 150.02753457015424 -108.31634184485912 -18.599999999999948
+ vertex -149.9724654298446 -110.78202726980835 -16.134314575050794
+ vertex 150.02753457015424 -110.7820272698084 -16.134314575050713
+ endloop
+endfacet
+facet normal -4.024562528319985e-14 0.7071067811865452 0.7071067811865499
+ outer loop
+ vertex -149.9724654298446 -110.78202726980835 -16.134314575050794
+ vertex 150.02753457015424 -108.31634184485912 -18.599999999999948
+ vertex -149.97246542984465 -108.3163418448591 -18.60000000000005
+ endloop
+endfacet
+facet normal -1.2048156260518093e-15 0.7071067811865513 -0.7071067811865437
+ outer loop
+ vertex 150.027534570154 -110.7820272698084 -9.865685424949215
+ vertex -149.972465429845 -108.31634184485912 -7.400000000000051
+ vertex 150.02753457015388 -108.31634184485917 -7.399999999999961
+ endloop
+endfacet
+facet normal -1.2048156260518093e-15 0.7071067811865513 -0.7071067811865437
+ outer loop
+ vertex -149.972465429845 -108.31634184485912 -7.400000000000051
+ vertex 150.027534570154 -110.7820272698084 -9.865685424949215
+ vertex -149.97246542984473 -110.78202726980835 -9.865685424949328
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex 150.02753457015385 -104.88202726980839 -9.599999999999929
+ vertex -149.97246542984504 -104.88202726980833 -9.20000000000002
+ vertex 150.02753457015385 -104.88202726980839 -9.19999999999993
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex -149.97246542984504 -104.88202726980833 -9.20000000000002
+ vertex 150.02753457015385 -104.88202726980839 -9.599999999999929
+ vertex -149.972465429845 -104.88202726980833 -9.60000000000002
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex -149.97246542984504 -104.88202726980833 -9.20000000000002
+ vertex 150.0275345701538 -104.48202726980841 -9.19999999999993
+ vertex 150.02753457015385 -104.88202726980839 -9.19999999999993
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex 150.0275345701538 -104.48202726980841 -9.19999999999993
+ vertex -149.97246542984504 -104.88202726980833 -9.20000000000002
+ vertex -149.97246542984507 -104.48202726980838 -9.20000000000002
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex -149.97246542984482 -104.88202726980836 -16.80000000000005
+ vertex 150.02753457015407 -104.88202726980839 -16.399999999999963
+ vertex 150.0275345701541 -104.8820272698084 -16.799999999999965
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex 150.02753457015407 -104.88202726980839 -16.399999999999963
+ vertex -149.97246542984482 -104.88202726980836 -16.80000000000005
+ vertex -149.97246542984476 -104.88202726980836 -16.400000000000052
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex 150.0275345701541 -106.28202726980841 -16.399999999999963
+ vertex -149.97246542984465 -106.28202726980835 -18.60000000000005
+ vertex 150.02753457015422 -106.28202726980838 -18.59999999999996
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex -149.97246542984465 -106.28202726980835 -18.60000000000005
+ vertex 150.0275345701541 -106.28202726980841 -16.399999999999963
+ vertex -149.97246542984473 -106.28202726980834 -16.400000000000055
+ endloop
+endfacet
+facet normal -3.789340105087216e-14 0.7933533402912354 0.6087614290087203
+ outer loop
+ vertex -149.97246542984522 -104.61600186602392 -3.50000000000003
+ vertex 150.02753457015356 -104.77492048862186 -3.29289321881339
+ vertex 150.0275345701536 -104.61600186602396 -3.49999999999994
+ endloop
+endfacet
+facet normal -3.789340105087216e-14 0.7933533402912354 0.6087614290087203
+ outer loop
+ vertex 150.02753457015356 -104.77492048862186 -3.29289321881339
+ vertex -149.97246542984522 -104.61600186602392 -3.50000000000003
+ vertex -149.97246542984513 -104.77492048862182 -3.29289321881348
+ endloop
+endfacet
+facet normal -4.7817167538289876e-14 0.3826834323650812 0.9238795325112903
+ outer loop
+ vertex 150.0275345701536 -104.98202726980841 -3.1339745962155057
+ vertex -149.97246542984522 -105.22320822470584 -3.0340741737109713
+ vertex 150.0275345701536 -105.2232082247059 -3.034074173710881
+ endloop
+endfacet
+facet normal -4.7817167538289876e-14 0.3826834323650812 0.9238795325112903
+ outer loop
+ vertex -149.97246542984522 -105.22320822470584 -3.0340741737109713
+ vertex 150.0275345701536 -104.98202726980841 -3.1339745962155057
+ vertex -149.97246542984527 -104.98202726980838 -3.133974596215596
+ endloop
+endfacet
+facet normal -4.1646492410833785e-14 0.13052619222007247 0.9914448613738078
+ outer loop
+ vertex 150.0275345701536 -105.2232082247059 -3.034074173710881
+ vertex -149.97246542984522 -105.48202726980838 -3.000000000000034
+ vertex 150.02753457015356 -105.4820272698084 -2.9999999999999436
+ endloop
+endfacet
+facet normal -4.1646492410833785e-14 0.13052619222007247 0.9914448613738078
+ outer loop
+ vertex -149.97246542984522 -105.48202726980838 -3.000000000000034
+ vertex 150.0275345701536 -105.2232082247059 -3.034074173710881
+ vertex -149.97246542984522 -105.22320822470584 -3.0340741737109713
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex 150.02753457015356 -105.4820272698084 -2.9999999999999436
+ vertex -149.97246542984507 -110.68202726980837 -3.000000000000037
+ vertex 150.02753457015376 -110.6820272698084 -2.999999999999924
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex -149.97246542984507 -110.68202726980837 -3.000000000000037
+ vertex 150.02753457015356 -105.4820272698084 -2.9999999999999436
+ vertex -149.97246542984522 -105.48202726980838 -3.000000000000034
+ endloop
+endfacet
+facet normal -5.200343766171889e-14 0.6087614290087036 0.7933533402912483
+ outer loop
+ vertex 150.02753457015356 -104.77492048862186 -3.29289321881339
+ vertex -149.97246542984527 -104.98202726980838 -3.133974596215596
+ vertex 150.0275345701536 -104.98202726980841 -3.1339745962155057
+ endloop
+endfacet
+facet normal -5.200343766171889e-14 0.6087614290087036 0.7933533402912483
+ outer loop
+ vertex -149.97246542984527 -104.98202726980838 -3.133974596215596
+ vertex 150.02753457015356 -104.77492048862186 -3.29289321881339
+ vertex -149.97246542984513 -104.77492048862182 -3.29289321881348
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex 150.0275345701538 -104.48202726980841 -9.19999999999993
+ vertex -149.97246542984527 -104.48202726980836 -4.000000000000029
+ vertex 150.02753457015365 -104.48202726980841 -3.999999999999939
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex -149.97246542984527 -104.48202726980836 -4.000000000000029
+ vertex 150.0275345701538 -104.48202726980841 -9.19999999999993
+ vertex -149.97246542984507 -104.48202726980838 -9.20000000000002
+ endloop
+endfacet
+facet normal -3.6839007899199586e-14 0.9238795325112905 0.3826834323650808
+ outer loop
+ vertex 150.02753457015356 -104.51610144351935 -3.7411809548974277
+ vertex -149.97246542984522 -104.61600186602392 -3.50000000000003
+ vertex 150.0275345701536 -104.61600186602396 -3.49999999999994
+ endloop
+endfacet
+facet normal -3.6839007899199586e-14 0.9238795325112905 0.3826834323650808
+ outer loop
+ vertex -149.97246542984522 -104.61600186602392 -3.50000000000003
+ vertex 150.02753457015356 -104.51610144351935 -3.7411809548974277
+ vertex -149.97246542984513 -104.51610144351925 -3.741180954897518
+ endloop
+endfacet
+facet normal -3.881934011071542e-14 0.9914448613738096 0.1305261922200573
+ outer loop
+ vertex -149.97246542984527 -104.48202726980836 -4.000000000000029
+ vertex 150.02753457015356 -104.51610144351935 -3.7411809548974277
+ vertex 150.02753457015365 -104.48202726980841 -3.999999999999939
+ endloop
+endfacet
+facet normal -3.881934011071542e-14 0.9914448613738096 0.1305261922200573
+ outer loop
+ vertex 150.02753457015356 -104.51610144351935 -3.7411809548974277
+ vertex -149.97246542984527 -104.48202726980836 -4.000000000000029
+ vertex -149.97246542984513 -104.51610144351925 -3.741180954897518
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex 150.0275345701538 -110.68202726980842 -3.399999999999923
+ vertex -149.97246542984504 -111.08202726980835 -3.40000000000005
+ vertex 150.02753457015376 -111.08202726980839 -3.399999999999949
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex -149.97246542984504 -111.08202726980835 -3.40000000000005
+ vertex 150.0275345701538 -110.68202726980842 -3.399999999999923
+ vertex -149.97246542984507 -110.68202726980834 -3.400000000000036
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex 150.02753457015376 -108.8820272698084 -4.799999999999966
+ vertex -149.972465429845 -108.88202726980838 -6.834314575050794
+ vertex 150.02753457015385 -108.8820272698084 -6.834314575050704
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex -149.972465429845 -108.88202726980838 -6.834314575050794
+ vertex 150.02753457015376 -108.8820272698084 -4.799999999999966
+ vertex -149.97246542984507 -108.88202726980833 -4.800000000000056
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex -149.97246542984507 -110.68202726980837 -3.000000000000037
+ vertex 150.0275345701538 -110.68202726980842 -3.399999999999923
+ vertex 150.02753457015376 -110.6820272698084 -2.999999999999924
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -9.400019899202893e-16
+ outer loop
+ vertex 150.0275345701538 -110.68202726980842 -3.399999999999923
+ vertex -149.97246542984507 -110.68202726980837 -3.000000000000037
+ vertex -149.97246542984507 -110.68202726980834 -3.400000000000036
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex -149.972465429845 -111.08202726980835 -4.80000000000007
+ vertex 150.02753457015376 -108.8820272698084 -4.799999999999966
+ vertex 150.02753457015388 -111.08202726980838 -4.799999999999969
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex 150.02753457015376 -108.8820272698084 -4.799999999999966
+ vertex -149.972465429845 -111.08202726980835 -4.80000000000007
+ vertex -149.97246542984507 -108.88202726980833 -4.800000000000056
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex 150.027534570154 -111.34771269475763 -9.29999999999996
+ vertex -149.97246542984465 -117.61634184485905 -9.300000000000056
+ vertex 150.02753457015416 -117.61634184485912 -9.299999999999965
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex -149.97246542984465 -117.61634184485905 -9.300000000000056
+ vertex 150.027534570154 -111.34771269475763 -9.29999999999996
+ vertex -149.97246542984487 -111.3477126947576 -9.300000000000061
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -8.997049082914168e-15
+ outer loop
+ vertex 150.02753457015376 -111.08202726980839 -3.399999999999949
+ vertex -149.972465429845 -111.08202726980835 -4.80000000000007
+ vertex 150.02753457015388 -111.08202726980838 -4.799999999999969
+ endloop
+endfacet
+facet normal 3.907009026439116e-14 -1.0 -8.997049082914168e-15
+ outer loop
+ vertex -149.972465429845 -111.08202726980835 -4.80000000000007
+ vertex 150.02753457015376 -111.08202726980839 -3.399999999999949
+ vertex -149.97246542984504 -111.08202726980835 -3.40000000000005
+ endloop
+endfacet
+facet normal 1.2048156260517146e-15 -0.7071067811865481 0.707106781186547
+ outer loop
+ vertex 150.02753457015385 -108.8820272698084 -6.834314575050704
+ vertex -149.97246542984487 -111.3477126947576 -9.300000000000061
+ vertex 150.027534570154 -111.34771269475763 -9.29999999999996
+ endloop
+endfacet
+facet normal 1.2048156260517146e-15 -0.7071067811865481 0.707106781186547
+ outer loop
+ vertex -149.97246542984487 -111.3477126947576 -9.300000000000061
+ vertex 150.02753457015385 -108.8820272698084 -6.834314575050704
+ vertex -149.972465429845 -108.88202726980838 -6.834314575050794
+ endloop
+endfacet
+facet normal -5.0005827697486894e-14 0.707106781186545 0.70710678118655
+ outer loop
+ vertex 150.02753457015416 -117.61634184485912 -9.299999999999965
+ vertex -149.97246542984468 -120.08202726980835 -6.834314575050805
+ vertex 150.02753457015416 -120.08202726980838 -6.834314575050715
+ endloop
+endfacet
+facet normal -5.0005827697486894e-14 0.707106781186545 0.70710678118655
+ outer loop
+ vertex -149.97246542984468 -120.08202726980835 -6.834314575050805
+ vertex 150.02753457015416 -117.61634184485912 -9.299999999999965
+ vertex -149.97246542984465 -117.61634184485905 -9.300000000000056
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex -149.97246542984473 -120.08202726980835 -4.800000000000045
+ vertex 150.02753457015405 -117.8820272698084 -4.799999999999952
+ vertex 150.0275345701541 -120.0820272698084 -4.7999999999999545
+ endloop
+endfacet
+facet normal 3.592621386430726e-14 9.400019899202916e-16 -1.0
+ outer loop
+ vertex 150.02753457015405 -117.8820272698084 -4.799999999999952
+ vertex -149.97246542984473 -120.08202726980835 -4.800000000000045
+ vertex -149.97246542984487 -117.88202726980836 -4.800000000000042
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 2.611827415552657e-14
+ outer loop
+ vertex -149.97246542984487 -117.88202726980836 -4.800000000000042
+ vertex 150.027534570154 -117.88202726980845 -3.399999999999954
+ vertex 150.02753457015405 -117.8820272698084 -4.799999999999952
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 2.611827415552657e-14
+ outer loop
+ vertex 150.027534570154 -117.88202726980845 -3.399999999999954
+ vertex -149.97246542984487 -117.88202726980836 -4.800000000000042
+ vertex -149.97246542984487 -117.88202726980838 -3.4000000000000443
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex 150.02753457015416 -120.08202726980838 -6.834314575050715
+ vertex -149.97246542984473 -120.08202726980835 -4.800000000000045
+ vertex 150.0275345701541 -120.0820272698084 -4.7999999999999545
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 9.400019899202893e-16
+ outer loop
+ vertex -149.97246542984473 -120.08202726980835 -4.800000000000045
+ vertex 150.02753457015416 -120.08202726980838 -6.834314575050715
+ vertex -149.97246542984468 -120.08202726980835 -6.834314575050805
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex 150.027534570154 -117.88202726980845 -3.399999999999954
+ vertex -149.97246542984487 -118.28202726980841 -3.4000000000000443
+ vertex 150.027534570154 -118.28202726980842 -3.399999999999954
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex -149.97246542984487 -118.28202726980841 -3.4000000000000443
+ vertex 150.027534570154 -117.88202726980845 -3.399999999999954
+ vertex -149.97246542984487 -117.88202726980838 -3.4000000000000443
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 4.4649600931051686e-15
+ outer loop
+ vertex -149.97246542984487 -118.28202726980841 -3.4000000000000443
+ vertex 150.02753457015396 -118.28202726980845 -2.999999999999955
+ vertex 150.027534570154 -118.28202726980842 -3.399999999999954
+ endloop
+endfacet
+facet normal -3.907009026439116e-14 1.0 4.4649600931051686e-15
+ outer loop
+ vertex 150.02753457015396 -118.28202726980845 -2.999999999999955
+ vertex -149.97246542984487 -118.28202726980841 -3.4000000000000443
+ vertex -149.97246542984487 -118.28202726980838 -3.0000000000000453
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex 150.02753457015396 -118.28202726980845 -2.999999999999955
+ vertex -149.97246542984476 -123.4820272698084 -3.000000000000051
+ vertex 150.02753457015413 -123.48202726980841 -2.9999999999999494
+ endloop
+endfacet
+facet normal -3.592621386430726e-14 -9.400019899202916e-16 1.0
+ outer loop
+ vertex -149.97246542984476 -123.4820272698084 -3.000000000000051
+ vertex 150.02753457015396 -118.28202726980845 -2.999999999999955
+ vertex -149.97246542984487 -118.28202726980838 -3.0000000000000453
+ endloop
+endfacet
+facet normal -3.3995076299890834e-14 -0.13052619222007386 0.9914448613738075
+ outer loop
+ vertex 150.02753457015413 -123.48202726980841 -2.9999999999999494
+ vertex -149.97246542984473 -123.74084631491091 -3.034074173710977
+ vertex 150.02753457015416 -123.74084631491093 -3.034074173710887
+ endloop
+endfacet
+facet normal -3.3995076299890834e-14 -0.13052619222007386 0.9914448613738075
+ outer loop
+ vertex -149.97246542984473 -123.74084631491091 -3.034074173710977
+ vertex 150.02753457015413 -123.48202726980841 -2.9999999999999494
+ vertex -149.97246542984476 -123.4820272698084 -3.000000000000051
+ endloop
+endfacet
+facet normal -2.2944299965291228e-14 -0.3826834323650826 0.9238795325112898
+ outer loop
+ vertex 150.02753457015416 -123.74084631491093 -3.034074173710887
+ vertex -149.9724654298446 -123.98202726980837 -3.1339745962156043
+ vertex 150.02753457015416 -123.9820272698084 -3.133974596215514
+ endloop
+endfacet
+facet normal -2.2944299965291228e-14 -0.3826834323650826 0.9238795325112898
+ outer loop
+ vertex -149.9724654298446 -123.98202726980837 -3.1339745962156043
+ vertex 150.02753457015416 -123.74084631491093 -3.034074173710887
+ vertex -149.97246542984473 -123.74084631491091 -3.034074173710977
+ endloop
+endfacet
+facet normal -1.1437878031146923e-14 -0.6087614290087044 0.7933533402912476
+ outer loop
+ vertex 150.02753457015416 -123.9820272698084 -3.133974596215514
+ vertex -149.97246542984473 -124.18913405099492 -3.2928932188134885
+ vertex 150.0275345701542 -124.18913405099494 -3.2928932188133984
+ endloop
+endfacet
+facet normal -1.1437878031146923e-14 -0.6087614290087044 0.7933533402912476
+ outer loop
+ vertex -149.97246542984473 -124.18913405099492 -3.2928932188134885
+ vertex 150.02753457015416 -123.9820272698084 -3.133974596215514
+ vertex -149.9724654298446 -123.98202726980837 -3.1339745962156043
+ endloop
+endfacet
+facet normal -1.1474086062759331e-15 -0.7933533402912396 0.6087614290087152
+ outer loop
+ vertex -149.97246542984473 -124.18913405099492 -3.2928932188134885
+ vertex 150.0275345701542 -124.34805267359285 -3.4999999999999485
+ vertex 150.0275345701542 -124.18913405099494 -3.2928932188133984
+ endloop
+endfacet
+facet normal -1.1474086062759331e-15 -0.7933533402912396 0.6087614290087152
+ outer loop
+ vertex 150.0275345701542 -124.34805267359285 -3.4999999999999485
+ vertex -149.97246542984473 -124.18913405099492 -3.2928932188134885
+ vertex -149.97246542984468 -124.3480526735928 -3.5000000000000386
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984465 -124.48202726980834 -4.000000000000038
+ vertex -149.97246542984445 -124.08202726980836 -9.20000000000005
+ vertex -149.9724654298445 -124.48202726980837 -9.20000000000005
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984445 -124.08202726980836 -9.20000000000005
+ vertex -149.97246542984465 -124.48202726980834 -4.000000000000038
+ vertex -149.9724654298446 -123.82750859187085 -5.614110472164045
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984445 -124.08202726980836 -9.20000000000005
+ vertex -149.9724654298446 -123.82750859187085 -5.614110472164045
+ vertex -149.9724654298446 -123.66766791586346 -6.000000000000034
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984445 -124.08202726980836 -9.20000000000005
+ vertex -149.9724654298446 -123.66766791586346 -6.000000000000034
+ vertex -149.9724654298445 -122.68202726980837 -7.40000000000004
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -122.68202726980837 -7.40000000000004
+ vertex -149.9724654298446 -123.66766791586346 -6.000000000000034
+ vertex -149.9724654298445 -123.41339811970684 -6.331370849898517
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -122.68202726980837 -7.40000000000004
+ vertex -149.9724654298445 -123.41339811970684 -6.331370849898517
+ vertex -149.9724654298446 -123.08202726980842 -6.585640646055154
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -122.68202726980837 -7.40000000000004
+ vertex -149.9724654298446 -123.08202726980842 -6.585640646055154
+ vertex -149.9724654298446 -122.69613774197241 -6.745481322062546
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -122.68202726980837 -7.40000000000004
+ vertex -149.9724654298446 -122.69613774197241 -6.745481322062546
+ vertex -149.97246542984468 -120.64771269475763 -7.40000000000004
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -120.64771269475763 -7.40000000000004
+ vertex -149.9724654298446 -122.69613774197241 -6.745481322062546
+ vertex -149.9724654298446 -122.28202726980837 -6.800000000000041
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -120.64771269475763 -7.40000000000004
+ vertex -149.9724654298446 -122.28202726980837 -6.800000000000041
+ vertex -149.97246542984468 -120.08202726980835 -6.834314575050805
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -123.82750859187085 -5.614110472164045
+ vertex -149.97246542984465 -124.48202726980834 -4.000000000000038
+ vertex -149.97246542984453 -123.88202726980835 -5.200000000000013
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -123.88202726980835 -5.200000000000013
+ vertex -149.97246542984465 -124.48202726980834 -4.000000000000038
+ vertex -149.97246542984465 -123.82750859187088 -4.785889527835981
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984465 -123.82750859187088 -4.785889527835981
+ vertex -149.97246542984465 -124.48202726980834 -4.000000000000038
+ vertex -149.97246542984453 -123.66766791586346 -4.400000000000015
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -123.66766791586346 -4.400000000000015
+ vertex -149.97246542984465 -124.48202726980834 -4.000000000000038
+ vertex -149.97246542984473 -123.41339811970683 -4.068629150101555
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -123.41339811970683 -4.068629150101555
+ vertex -149.97246542984465 -124.48202726980834 -4.000000000000038
+ vertex -149.9724654298446 -123.08202726980835 -3.8143593539449396
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -123.08202726980835 -3.8143593539449396
+ vertex -149.97246542984465 -124.48202726980834 -4.000000000000038
+ vertex -149.97246542984465 -124.44795309609741 -3.7411809548975263
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -123.08202726980835 -3.8143593539449396
+ vertex -149.97246542984465 -124.44795309609741 -3.7411809548975263
+ vertex -149.97246542984473 -122.69613774197241 -3.65451867793752
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -122.69613774197241 -3.65451867793752
+ vertex -149.97246542984465 -124.44795309609741 -3.7411809548975263
+ vertex -149.97246542984468 -124.3480526735928 -3.5000000000000386
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -122.69613774197241 -3.65451867793752
+ vertex -149.97246542984468 -124.3480526735928 -3.5000000000000386
+ vertex -149.97246542984473 -122.28202726980837 -3.600000000000047
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -124.18913405099492 -3.2928932188134885
+ vertex -149.97246542984487 -118.28202726980841 -3.4000000000000443
+ vertex -149.97246542984468 -124.3480526735928 -3.5000000000000386
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984487 -118.28202726980841 -3.4000000000000443
+ vertex -149.97246542984473 -124.18913405099492 -3.2928932188134885
+ vertex -149.97246542984487 -118.28202726980838 -3.0000000000000453
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984487 -118.28202726980838 -3.0000000000000453
+ vertex -149.97246542984473 -124.18913405099492 -3.2928932188134885
+ vertex -149.9724654298446 -123.98202726980837 -3.1339745962156043
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984487 -118.28202726980838 -3.0000000000000453
+ vertex -149.9724654298446 -123.98202726980837 -3.1339745962156043
+ vertex -149.97246542984473 -123.74084631491091 -3.034074173710977
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984487 -118.28202726980838 -3.0000000000000453
+ vertex -149.97246542984473 -123.74084631491091 -3.034074173710977
+ vertex -149.97246542984476 -123.4820272698084 -3.000000000000051
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -120.08202726980835 -6.834314575050805
+ vertex -149.97246542984468 -120.89638662375324 -6.000000000000065
+ vertex -149.97246542984473 -120.08202726980835 -4.800000000000045
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -120.89638662375324 -6.000000000000065
+ vertex -149.97246542984468 -120.08202726980835 -6.834314575050805
+ vertex -149.97246542984465 -121.15065641990988 -6.331370849898536
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984465 -121.15065641990988 -6.331370849898536
+ vertex -149.97246542984468 -120.08202726980835 -6.834314575050805
+ vertex -149.97246542984465 -121.48202726980836 -6.585640646055151
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984465 -121.48202726980836 -6.585640646055151
+ vertex -149.97246542984468 -120.08202726980835 -6.834314575050805
+ vertex -149.97246542984468 -121.86791679764434 -6.7454813220625685
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -121.86791679764434 -6.7454813220625685
+ vertex -149.97246542984468 -120.08202726980835 -6.834314575050805
+ vertex -149.9724654298446 -122.28202726980837 -6.800000000000041
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -120.08202726980835 -4.800000000000045
+ vertex -149.97246542984468 -120.89638662375324 -6.000000000000065
+ vertex -149.97246542984468 -120.73654594774585 -5.614110472164098
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -120.08202726980835 -4.800000000000045
+ vertex -149.97246542984468 -120.73654594774585 -5.614110472164098
+ vertex -149.97246542984465 -120.68202726980836 -5.200000000000067
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -120.08202726980835 -4.800000000000045
+ vertex -149.97246542984465 -120.68202726980836 -5.200000000000067
+ vertex -149.97246542984473 -120.73654594774582 -4.785889527836012
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -120.08202726980835 -4.800000000000045
+ vertex -149.97246542984473 -120.73654594774582 -4.785889527836012
+ vertex -149.97246542984487 -117.88202726980836 -4.800000000000042
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984487 -117.88202726980836 -4.800000000000042
+ vertex -149.97246542984473 -120.73654594774582 -4.785889527836012
+ vertex -149.97246542984487 -117.88202726980838 -3.4000000000000443
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984487 -117.88202726980838 -3.4000000000000443
+ vertex -149.97246542984473 -120.73654594774582 -4.785889527836012
+ vertex -149.97246542984465 -120.89638662375327 -4.400000000000046
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984487 -117.88202726980838 -3.4000000000000443
+ vertex -149.97246542984465 -120.89638662375327 -4.400000000000046
+ vertex -149.97246542984473 -121.15065641990988 -4.068629150101574
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984487 -117.88202726980838 -3.4000000000000443
+ vertex -149.97246542984473 -121.15065641990988 -4.068629150101574
+ vertex -149.97246542984473 -121.48202726980833 -3.814359353944937
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984487 -117.88202726980838 -3.4000000000000443
+ vertex -149.97246542984473 -121.48202726980833 -3.814359353944937
+ vertex -149.97246542984465 -121.86791679764431 -3.6545186779375425
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984487 -117.88202726980838 -3.4000000000000443
+ vertex -149.97246542984465 -121.86791679764431 -3.6545186779375425
+ vertex -149.97246542984473 -122.28202726980837 -3.600000000000047
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984487 -117.88202726980838 -3.4000000000000443
+ vertex -149.97246542984473 -122.28202726980837 -3.600000000000047
+ vertex -149.97246542984468 -124.3480526735928 -3.5000000000000386
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984487 -117.88202726980838 -3.4000000000000443
+ vertex -149.97246542984468 -124.3480526735928 -3.5000000000000386
+ vertex -149.97246542984487 -118.28202726980841 -3.4000000000000443
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984445 -111.08202726980835 -21.20000000000005
+ vertex -149.97246542984436 -110.68202726980833 -22.60000000000004
+ vertex -149.97246542984436 -111.08202726980832 -22.600000000000048
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984436 -110.68202726980833 -22.60000000000004
+ vertex -149.97246542984445 -111.08202726980835 -21.20000000000005
+ vertex -149.9724654298445 -107.09613774197234 -22.345481322062547
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984436 -110.68202726980833 -22.60000000000004
+ vertex -149.9724654298445 -107.09613774197234 -22.345481322062547
+ vertex -149.9724654298445 -106.68202726980836 -22.400000000000045
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984436 -110.68202726980833 -22.60000000000004
+ vertex -149.9724654298445 -106.68202726980836 -22.400000000000045
+ vertex -149.97246542984453 -104.61600186602391 -22.50000000000003
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -107.09613774197234 -22.345481322062547
+ vertex -149.97246542984445 -111.08202726980835 -21.20000000000005
+ vertex -149.9724654298445 -107.48202726980833 -22.185640646055155
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -107.48202726980833 -22.185640646055155
+ vertex -149.97246542984445 -111.08202726980835 -21.20000000000005
+ vertex -149.9724654298445 -107.8133981197068 -21.931370849898517
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -107.8133981197068 -21.931370849898517
+ vertex -149.97246542984445 -111.08202726980835 -21.20000000000005
+ vertex -149.97246542984442 -108.06766791586347 -21.600000000000044
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984442 -108.06766791586347 -21.600000000000044
+ vertex -149.97246542984445 -111.08202726980835 -21.20000000000005
+ vertex -149.97246542984453 -108.22750859187089 -21.21411047216408
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -108.22750859187089 -21.21411047216408
+ vertex -149.97246542984445 -111.08202726980835 -21.20000000000005
+ vertex -149.97246542984453 -108.88202726980833 -21.200000000000035
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -108.22750859187089 -21.21411047216408
+ vertex -149.97246542984453 -108.88202726980833 -21.200000000000035
+ vertex -149.97246542984453 -108.28202726980835 -20.800000000000026
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -108.28202726980835 -20.800000000000026
+ vertex -149.97246542984453 -108.88202726980833 -21.200000000000035
+ vertex -149.97246542984453 -108.88202726980833 -19.165685424949274
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -108.28202726980835 -20.800000000000026
+ vertex -149.97246542984453 -108.88202726980833 -19.165685424949274
+ vertex -149.9724654298446 -108.22750859187086 -20.385889527835992
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -108.22750859187086 -20.385889527835992
+ vertex -149.97246542984453 -108.88202726980833 -19.165685424949274
+ vertex -149.9724654298446 -108.06766791586347 -20.000000000000025
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -108.06766791586347 -20.000000000000025
+ vertex -149.97246542984453 -108.88202726980833 -19.165685424949274
+ vertex -149.97246542984453 -107.81339811970683 -19.668629150101555
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -107.81339811970683 -19.668629150101555
+ vertex -149.97246542984453 -108.88202726980833 -19.165685424949274
+ vertex -149.9724654298446 -107.48202726980833 -19.41435935394494
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -107.48202726980833 -19.41435935394494
+ vertex -149.97246542984453 -108.88202726980833 -19.165685424949274
+ vertex -149.9724654298445 -107.09613774197234 -19.254518677937522
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -107.09613774197234 -19.254518677937522
+ vertex -149.97246542984453 -108.88202726980833 -19.165685424949274
+ vertex -149.97246542984453 -106.68202726980832 -19.20000000000005
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -106.28202726980834 -16.400000000000055
+ vertex -149.97246542984482 -104.88202726980836 -16.80000000000005
+ vertex -149.97246542984465 -106.28202726980835 -18.60000000000005
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984482 -104.88202726980836 -16.80000000000005
+ vertex -149.97246542984473 -106.28202726980834 -16.400000000000055
+ vertex -149.97246542984476 -104.88202726980836 -16.400000000000052
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -106.68202726980836 -22.400000000000045
+ vertex -149.9724654298446 -104.51610144351925 -22.25881904510254
+ vertex -149.97246542984453 -104.61600186602391 -22.50000000000003
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -104.51610144351925 -22.25881904510254
+ vertex -149.9724654298445 -106.68202726980836 -22.400000000000045
+ vertex -149.9724654298445 -106.26791679764435 -22.34548132206257
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -104.51610144351925 -22.25881904510254
+ vertex -149.9724654298445 -106.26791679764435 -22.34548132206257
+ vertex -149.97246542984445 -105.88202726980833 -22.185640646055152
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -104.51610144351925 -22.25881904510254
+ vertex -149.97246542984445 -105.88202726980833 -22.185640646055152
+ vertex -149.97246542984465 -104.48202726980834 -22.00000000000003
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984465 -104.48202726980834 -22.00000000000003
+ vertex -149.97246542984445 -105.88202726980833 -22.185640646055152
+ vertex -149.97246542984445 -105.55065641990987 -21.931370849898535
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984465 -104.48202726980834 -22.00000000000003
+ vertex -149.97246542984445 -105.55065641990987 -21.931370849898535
+ vertex -149.9724654298446 -105.29638662375325 -21.600000000000065
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984465 -104.48202726980834 -22.00000000000003
+ vertex -149.9724654298446 -105.29638662375325 -21.600000000000065
+ vertex -149.97246542984465 -105.13654594774582 -21.214110472164098
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984465 -104.48202726980834 -22.00000000000003
+ vertex -149.97246542984465 -105.13654594774582 -21.214110472164098
+ vertex -149.97246542984476 -104.48202726980834 -16.80000000000004
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984476 -104.48202726980834 -16.80000000000004
+ vertex -149.97246542984465 -105.13654594774582 -21.214110472164098
+ vertex -149.97246542984465 -105.08202726980834 -20.800000000000065
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984476 -104.48202726980834 -16.80000000000004
+ vertex -149.97246542984465 -105.08202726980834 -20.800000000000065
+ vertex -149.97246542984468 -105.13654594774583 -20.385889527836035
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984476 -104.48202726980834 -16.80000000000004
+ vertex -149.97246542984468 -105.13654594774583 -20.385889527836035
+ vertex -149.97246542984465 -105.29638662375322 -20.000000000000046
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984476 -104.48202726980834 -16.80000000000004
+ vertex -149.97246542984465 -105.29638662375322 -20.000000000000046
+ vertex -149.97246542984468 -105.55065641990984 -19.668629150101573
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984476 -104.48202726980834 -16.80000000000004
+ vertex -149.97246542984468 -105.55065641990984 -19.668629150101573
+ vertex -149.97246542984465 -105.88202726980833 -19.414359353944935
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984476 -104.48202726980834 -16.80000000000004
+ vertex -149.97246542984465 -105.88202726980833 -19.414359353944935
+ vertex -149.97246542984465 -106.26791679764428 -19.254518677937543
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984476 -104.48202726980834 -16.80000000000004
+ vertex -149.97246542984465 -106.26791679764428 -19.254518677937543
+ vertex -149.97246542984453 -106.68202726980832 -19.20000000000005
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984476 -104.48202726980834 -16.80000000000004
+ vertex -149.97246542984453 -106.68202726980832 -19.20000000000005
+ vertex -149.97246542984465 -106.28202726980835 -18.60000000000005
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984465 -106.28202726980835 -18.60000000000005
+ vertex -149.97246542984453 -106.68202726980832 -19.20000000000005
+ vertex -149.97246542984453 -108.88202726980833 -19.165685424949274
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984465 -106.28202726980835 -18.60000000000005
+ vertex -149.97246542984453 -108.88202726980833 -19.165685424949274
+ vertex -149.97246542984465 -108.3163418448591 -18.60000000000005
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984476 -104.48202726980834 -16.80000000000004
+ vertex -149.97246542984465 -106.28202726980835 -18.60000000000005
+ vertex -149.97246542984482 -104.88202726980836 -16.80000000000005
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984414 -120.68202726980833 -20.800000000000026
+ vertex -149.97246542984414 -120.08202726980835 -21.200000000000056
+ vertex -149.97246542984414 -120.73654594774585 -21.214110472164055
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984414 -120.08202726980835 -21.200000000000056
+ vertex -149.97246542984414 -120.68202726980833 -20.800000000000026
+ vertex -149.97246542984422 -120.08202726980838 -19.16568542494932
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984422 -120.08202726980838 -19.16568542494932
+ vertex -149.97246542984414 -120.68202726980833 -20.800000000000026
+ vertex -149.9724654298442 -120.73654594774582 -20.385889527835992
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984422 -120.08202726980838 -19.16568542494932
+ vertex -149.9724654298442 -120.73654594774582 -20.385889527835992
+ vertex -149.9724654298442 -120.89638662375324 -20.000000000000025
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984422 -120.08202726980838 -19.16568542494932
+ vertex -149.9724654298442 -120.89638662375324 -20.000000000000025
+ vertex -149.9724654298442 -121.15065641990988 -19.668629150101555
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984422 -120.08202726980838 -19.16568542494932
+ vertex -149.9724654298442 -121.15065641990988 -19.668629150101555
+ vertex -149.97246542984422 -121.48202726980836 -19.414359353944917
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984422 -120.08202726980838 -19.16568542494932
+ vertex -149.97246542984422 -121.48202726980836 -19.414359353944917
+ vertex -149.97246542984422 -121.86791679764431 -19.2545186779375
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984422 -120.08202726980838 -19.16568542494932
+ vertex -149.97246542984422 -121.86791679764431 -19.2545186779375
+ vertex -149.97246542984405 -122.28202726980832 -19.200000000000006
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429844 -123.74084631491088 -22.96592582628912
+ vertex -149.9724654298442 -118.28202726980831 -23.000000000000053
+ vertex -149.972465429844 -123.4820272698084 -23.000000000000057
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298442 -118.28202726980831 -23.000000000000053
+ vertex -149.972465429844 -123.74084631491088 -22.96592582628912
+ vertex -149.97246542984405 -118.2820272698083 -22.600000000000055
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984405 -118.2820272698083 -22.600000000000055
+ vertex -149.972465429844 -123.74084631491088 -22.96592582628912
+ vertex -149.972465429844 -123.98202726980837 -22.86602540378449
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984405 -118.2820272698083 -22.600000000000055
+ vertex -149.972465429844 -123.98202726980837 -22.86602540378449
+ vertex -149.972465429844 -124.1891340509949 -22.70710678118661
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984405 -118.2820272698083 -22.600000000000055
+ vertex -149.972465429844 -124.1891340509949 -22.70710678118661
+ vertex -149.972465429844 -124.34805267359279 -22.50000000000006
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984405 -118.2820272698083 -22.600000000000055
+ vertex -149.972465429844 -124.34805267359279 -22.50000000000006
+ vertex -149.9724654298442 -117.88202726980832 -22.60000000000005
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298442 -117.88202726980832 -22.60000000000005
+ vertex -149.972465429844 -124.34805267359279 -22.50000000000006
+ vertex -149.9724654298441 -122.2820272698084 -22.400000000000023
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298442 -117.88202726980832 -22.60000000000005
+ vertex -149.9724654298441 -122.2820272698084 -22.400000000000023
+ vertex -149.97246542984405 -121.86791679764434 -22.34548132206253
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298442 -117.88202726980832 -22.60000000000005
+ vertex -149.97246542984405 -121.86791679764434 -22.34548132206253
+ vertex -149.97246542984422 -117.88202726980836 -21.200000000000053
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984422 -117.88202726980836 -21.200000000000053
+ vertex -149.97246542984405 -121.86791679764434 -22.34548132206253
+ vertex -149.9724654298441 -121.48202726980836 -22.185640646055134
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984422 -117.88202726980836 -21.200000000000053
+ vertex -149.9724654298441 -121.48202726980836 -22.185640646055134
+ vertex -149.9724654298441 -121.15065641990988 -21.931370849898517
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984422 -117.88202726980836 -21.200000000000053
+ vertex -149.9724654298441 -121.15065641990988 -21.931370849898517
+ vertex -149.9724654298441 -120.89638662375329 -21.600000000000023
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984422 -117.88202726980836 -21.200000000000053
+ vertex -149.9724654298441 -120.89638662375329 -21.600000000000023
+ vertex -149.97246542984414 -120.73654594774585 -21.214110472164055
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984422 -117.88202726980836 -21.200000000000053
+ vertex -149.97246542984414 -120.73654594774585 -21.214110472164055
+ vertex -149.97246542984414 -120.08202726980835 -21.200000000000056
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984442 -110.68202726980837 -23.000000000000036
+ vertex -149.97246542984453 -105.2232082247058 -22.9659258262891
+ vertex -149.9724654298445 -105.48202726980834 -23.00000000000004
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -105.2232082247058 -22.9659258262891
+ vertex -149.97246542984442 -110.68202726980837 -23.000000000000036
+ vertex -149.97246542984436 -110.68202726980833 -22.60000000000004
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -105.2232082247058 -22.9659258262891
+ vertex -149.97246542984436 -110.68202726980833 -22.60000000000004
+ vertex -149.97246542984453 -104.98202726980836 -22.866025403784477
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -104.98202726980836 -22.866025403784477
+ vertex -149.97246542984436 -110.68202726980833 -22.60000000000004
+ vertex -149.97246542984453 -104.77492048862179 -22.707106781186592
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -104.77492048862179 -22.707106781186592
+ vertex -149.97246542984436 -110.68202726980833 -22.60000000000004
+ vertex -149.97246542984453 -104.61600186602391 -22.50000000000003
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984405 -124.44795309609744 -22.258819045102573
+ vertex -149.9724654298441 -122.2820272698084 -22.400000000000023
+ vertex -149.972465429844 -124.34805267359279 -22.50000000000006
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298441 -122.2820272698084 -22.400000000000023
+ vertex -149.97246542984405 -124.44795309609744 -22.258819045102573
+ vertex -149.97246542984405 -122.69613774197241 -22.345481322062533
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984405 -122.69613774197241 -22.345481322062533
+ vertex -149.97246542984405 -124.44795309609744 -22.258819045102573
+ vertex -149.9724654298441 -123.08202726980838 -22.185640646055123
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298441 -123.08202726980838 -22.185640646055123
+ vertex -149.97246542984405 -124.44795309609744 -22.258819045102573
+ vertex -149.972465429844 -124.48202726980833 -22.00000000000006
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298441 -123.08202726980838 -22.185640646055123
+ vertex -149.972465429844 -124.48202726980833 -22.00000000000006
+ vertex -149.97246542984396 -123.41339811970684 -21.931370849898506
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984396 -123.41339811970684 -21.931370849898506
+ vertex -149.972465429844 -124.48202726980833 -22.00000000000006
+ vertex -149.97246542984396 -123.66766791586348 -21.600000000000016
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984396 -123.66766791586348 -21.600000000000016
+ vertex -149.972465429844 -124.48202726980833 -22.00000000000006
+ vertex -149.97246542984405 -123.82750859187088 -21.214110472164048
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984405 -123.82750859187088 -21.214110472164048
+ vertex -149.972465429844 -124.48202726980833 -22.00000000000006
+ vertex -149.97246542984422 -124.48202726980834 -16.800000000000093
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984405 -123.82750859187088 -21.214110472164048
+ vertex -149.97246542984422 -124.48202726980834 -16.800000000000093
+ vertex -149.97246542984396 -123.88202726980838 -20.800000000000015
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984396 -123.88202726980838 -20.800000000000015
+ vertex -149.97246542984422 -124.48202726980834 -16.800000000000093
+ vertex -149.97246542984414 -123.82750859187088 -20.385889527835985
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984414 -123.82750859187088 -20.385889527835985
+ vertex -149.97246542984422 -124.48202726980834 -16.800000000000093
+ vertex -149.972465429844 -123.66766791586348 -20.000000000000018
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429844 -123.66766791586348 -20.000000000000018
+ vertex -149.97246542984422 -124.48202726980834 -16.800000000000093
+ vertex -149.9724654298441 -123.41339811970683 -19.668629150101545
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298441 -123.41339811970683 -19.668629150101545
+ vertex -149.97246542984422 -124.48202726980834 -16.800000000000093
+ vertex -149.9724654298442 -123.08202726980838 -19.414359353944903
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298442 -123.08202726980838 -19.414359353944903
+ vertex -149.97246542984422 -124.48202726980834 -16.800000000000093
+ vertex -149.97246542984405 -122.69613774197241 -19.254518677937508
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984405 -122.69613774197241 -19.254518677937508
+ vertex -149.97246542984422 -124.48202726980834 -16.800000000000093
+ vertex -149.97246542984405 -122.28202726980832 -19.200000000000006
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984405 -122.28202726980832 -19.200000000000006
+ vertex -149.97246542984422 -124.48202726980834 -16.800000000000093
+ vertex -149.97246542984422 -122.68202726980837 -18.60000000000006
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984405 -122.28202726980832 -19.200000000000006
+ vertex -149.97246542984422 -122.68202726980837 -18.60000000000006
+ vertex -149.97246542984422 -120.08202726980838 -19.16568542494932
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984422 -122.68202726980837 -18.60000000000006
+ vertex -149.97246542984422 -124.48202726980834 -16.800000000000093
+ vertex -149.97246542984422 -124.08202726980835 -16.80000000000009
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984422 -122.68202726980837 -18.60000000000006
+ vertex -149.97246542984422 -124.08202726980835 -16.80000000000009
+ vertex -149.97246542984422 -122.68202726980837 -16.400000000000063
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984422 -122.68202726980837 -16.400000000000063
+ vertex -149.97246542984422 -124.08202726980835 -16.80000000000009
+ vertex -149.97246542984422 -124.08202726980832 -16.400000000000095
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984465 -118.18202726980833 -9.865685424949291
+ vertex -149.97246542984465 -117.61634184485905 -9.300000000000056
+ vertex -149.97246542984487 -111.3477126947576 -9.300000000000061
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984465 -117.61634184485905 -9.300000000000056
+ vertex -149.97246542984465 -118.18202726980833 -9.865685424949291
+ vertex -149.97246542984468 -120.64771269475763 -7.40000000000004
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984465 -117.61634184485905 -9.300000000000056
+ vertex -149.97246542984468 -120.64771269475763 -7.40000000000004
+ vertex -149.97246542984468 -120.08202726980835 -6.834314575050805
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984445 -124.08202726980836 -9.20000000000005
+ vertex -149.9724654298445 -122.68202726980834 -9.600000000000035
+ vertex -149.97246542984436 -124.08202726980839 -9.60000000000005
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -122.68202726980834 -9.600000000000035
+ vertex -149.97246542984445 -124.08202726980836 -9.20000000000005
+ vertex -149.9724654298445 -122.68202726980837 -7.40000000000004
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984442 -118.18202726980836 -16.134314575050784
+ vertex -149.9724654298445 -115.18083869158517 -15.607999730980517
+ vertex -149.9724654298445 -114.48202726980834 -15.700000000000038
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -115.18083869158517 -15.607999730980517
+ vertex -149.97246542984442 -118.18202726980836 -16.134314575050784
+ vertex -149.9724654298445 -115.83202726980835 -15.338268590218007
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -115.83202726980835 -15.338268590218007
+ vertex -149.97246542984442 -118.18202726980836 -16.134314575050784
+ vertex -149.9724654298445 -116.39121557901203 -14.909188309203735
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -116.39121557901203 -14.909188309203735
+ vertex -149.97246542984442 -118.18202726980836 -16.134314575050784
+ vertex -149.9724654298445 -116.82029586002636 -14.350000000000055
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -116.82029586002636 -14.350000000000055
+ vertex -149.97246542984442 -118.18202726980836 -16.134314575050784
+ vertex -149.9724654298445 -117.09002700078885 -13.698811421776844
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -117.09002700078885 -13.698811421776844
+ vertex -149.97246542984442 -118.18202726980836 -16.134314575050784
+ vertex -149.97246542984465 -118.18202726980833 -9.865685424949291
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -117.09002700078885 -13.698811421776844
+ vertex -149.97246542984465 -118.18202726980833 -9.865685424949291
+ vertex -149.97246542984453 -117.18202726980839 -13.000000000000046
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -117.18202726980839 -13.000000000000046
+ vertex -149.97246542984465 -118.18202726980833 -9.865685424949291
+ vertex -149.97246542984445 -117.09002700078882 -12.30118857822325
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984445 -117.09002700078882 -12.30118857822325
+ vertex -149.97246542984465 -118.18202726980833 -9.865685424949291
+ vertex -149.9724654298446 -116.82029586002633 -11.650000000000038
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -116.82029586002633 -11.650000000000038
+ vertex -149.97246542984465 -118.18202726980833 -9.865685424949291
+ vertex -149.97246542984468 -116.39121557901206 -11.09081169079636
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984468 -116.39121557901206 -11.09081169079636
+ vertex -149.97246542984465 -118.18202726980833 -9.865685424949291
+ vertex -149.97246542984453 -115.83202726980834 -10.661731409782071
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984453 -115.83202726980834 -10.661731409782071
+ vertex -149.97246542984465 -118.18202726980833 -9.865685424949291
+ vertex -149.97246542984473 -115.18083869158517 -10.392000269019562
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -115.18083869158517 -10.392000269019562
+ vertex -149.97246542984465 -118.18202726980833 -9.865685424949291
+ vertex -149.97246542984473 -114.48202726980833 -10.30000000000005
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -114.48202726980833 -10.30000000000005
+ vertex -149.97246542984465 -118.18202726980833 -9.865685424949291
+ vertex -149.97246542984473 -110.78202726980835 -9.865685424949328
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -110.78202726980835 -9.865685424949328
+ vertex -149.97246542984465 -118.18202726980833 -9.865685424949291
+ vertex -149.97246542984487 -111.3477126947576 -9.300000000000061
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -110.78202726980835 -9.865685424949328
+ vertex -149.97246542984487 -111.3477126947576 -9.300000000000061
+ vertex -149.972465429845 -108.31634184485912 -7.400000000000051
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429845 -108.31634184485912 -7.400000000000051
+ vertex -149.97246542984487 -111.3477126947576 -9.300000000000061
+ vertex -149.972465429845 -108.88202726980838 -6.834314575050794
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429845 -108.31634184485912 -7.400000000000051
+ vertex -149.972465429845 -108.88202726980838 -6.834314575050794
+ vertex -149.97246542984504 -106.28202726980835 -7.400000000000048
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984504 -111.08202726980835 -3.40000000000005
+ vertex -149.97246542984507 -108.88202726980833 -4.800000000000056
+ vertex -149.972465429845 -111.08202726980835 -4.80000000000007
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984507 -108.88202726980833 -4.800000000000056
+ vertex -149.97246542984504 -111.08202726980835 -3.40000000000005
+ vertex -149.97246542984507 -108.22750859187083 -4.785889527836001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984507 -108.22750859187083 -4.785889527836001
+ vertex -149.97246542984504 -111.08202726980835 -3.40000000000005
+ vertex -149.972465429845 -108.06766791586348 -4.400000000000034
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429845 -108.06766791586348 -4.400000000000034
+ vertex -149.97246542984504 -111.08202726980835 -3.40000000000005
+ vertex -149.9724654298452 -107.81339811970683 -4.068629150101538
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298452 -107.81339811970683 -4.068629150101538
+ vertex -149.97246542984504 -111.08202726980835 -3.40000000000005
+ vertex -149.97246542984513 -107.48202726980836 -3.8143593539449228
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984513 -107.48202726980836 -3.8143593539449228
+ vertex -149.97246542984504 -111.08202726980835 -3.40000000000005
+ vertex -149.9724654298452 -107.09613774197234 -3.6545186779375283
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298452 -107.09613774197234 -3.6545186779375283
+ vertex -149.97246542984504 -111.08202726980835 -3.40000000000005
+ vertex -149.9724654298452 -106.68202726980832 -3.600000000000033
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298452 -106.68202726980832 -3.600000000000033
+ vertex -149.97246542984504 -111.08202726980835 -3.40000000000005
+ vertex -149.97246542984522 -104.61600186602392 -3.50000000000003
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984522 -104.61600186602392 -3.50000000000003
+ vertex -149.97246542984504 -111.08202726980835 -3.40000000000005
+ vertex -149.97246542984507 -110.68202726980834 -3.400000000000036
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984522 -104.61600186602392 -3.50000000000003
+ vertex -149.97246542984507 -110.68202726980834 -3.400000000000036
+ vertex -149.97246542984513 -104.77492048862182 -3.29289321881348
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984513 -104.77492048862182 -3.29289321881348
+ vertex -149.97246542984507 -110.68202726980834 -3.400000000000036
+ vertex -149.97246542984507 -110.68202726980837 -3.000000000000037
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984513 -104.77492048862182 -3.29289321881348
+ vertex -149.97246542984507 -110.68202726980837 -3.000000000000037
+ vertex -149.97246542984527 -104.98202726980838 -3.133974596215596
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984527 -104.98202726980838 -3.133974596215596
+ vertex -149.97246542984507 -110.68202726980837 -3.000000000000037
+ vertex -149.97246542984522 -105.22320822470584 -3.0340741737109713
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984522 -105.22320822470584 -3.0340741737109713
+ vertex -149.97246542984507 -110.68202726980837 -3.000000000000037
+ vertex -149.97246542984522 -105.48202726980838 -3.000000000000034
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984504 -106.28202726980835 -7.400000000000048
+ vertex -149.972465429845 -104.88202726980833 -9.60000000000002
+ vertex -149.97246542984496 -106.28202726980834 -9.600000000000044
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429845 -104.88202726980833 -9.60000000000002
+ vertex -149.97246542984504 -106.28202726980835 -7.400000000000048
+ vertex -149.97246542984504 -104.88202726980833 -9.20000000000002
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984504 -104.88202726980833 -9.20000000000002
+ vertex -149.97246542984504 -106.28202726980835 -7.400000000000048
+ vertex -149.97246542984507 -104.48202726980838 -9.20000000000002
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984507 -104.48202726980838 -9.20000000000002
+ vertex -149.97246542984504 -106.28202726980835 -7.400000000000048
+ vertex -149.97246542984504 -105.29638662375325 -6.000000000000051
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984507 -104.48202726980838 -9.20000000000002
+ vertex -149.97246542984504 -105.29638662375325 -6.000000000000051
+ vertex -149.97246542984513 -105.13654594774586 -5.614110472164084
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984507 -104.48202726980838 -9.20000000000002
+ vertex -149.97246542984513 -105.13654594774586 -5.614110472164084
+ vertex -149.97246542984527 -104.48202726980836 -4.000000000000029
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984504 -105.29638662375325 -6.000000000000051
+ vertex -149.97246542984504 -106.28202726980835 -7.400000000000048
+ vertex -149.97246542984513 -105.55065641990987 -6.331370849898522
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984513 -105.55065641990987 -6.331370849898522
+ vertex -149.97246542984504 -106.28202726980835 -7.400000000000048
+ vertex -149.97246542984507 -105.88202726980833 -6.585640646055159
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984507 -105.88202726980833 -6.585640646055159
+ vertex -149.97246542984504 -106.28202726980835 -7.400000000000048
+ vertex -149.97246542984507 -106.26791679764433 -6.745481322062554
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984507 -106.26791679764433 -6.745481322062554
+ vertex -149.97246542984504 -106.28202726980835 -7.400000000000048
+ vertex -149.97246542984507 -106.6820272698084 -6.80000000000005
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984507 -106.6820272698084 -6.80000000000005
+ vertex -149.97246542984504 -106.28202726980835 -7.400000000000048
+ vertex -149.972465429845 -108.88202726980838 -6.834314575050794
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984527 -104.48202726980836 -4.000000000000029
+ vertex -149.97246542984513 -105.13654594774586 -5.614110472164084
+ vertex -149.97246542984507 -105.08202726980836 -5.200000000000053
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984527 -104.48202726980836 -4.000000000000029
+ vertex -149.97246542984507 -105.08202726980836 -5.200000000000053
+ vertex -149.9724654298452 -105.13654594774582 -4.78588952783602
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984527 -104.48202726980836 -4.000000000000029
+ vertex -149.9724654298452 -105.13654594774582 -4.78588952783602
+ vertex -149.97246542984507 -105.29638662375328 -4.400000000000054
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984527 -104.48202726980836 -4.000000000000029
+ vertex -149.97246542984507 -105.29638662375328 -4.400000000000054
+ vertex -149.9724654298452 -105.55065641990984 -4.068629150101582
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984527 -104.48202726980836 -4.000000000000029
+ vertex -149.9724654298452 -105.55065641990984 -4.068629150101582
+ vertex -149.9724654298452 -105.88202726980833 -3.8143593539449454
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984527 -104.48202726980836 -4.000000000000029
+ vertex -149.9724654298452 -105.88202726980833 -3.8143593539449454
+ vertex -149.97246542984513 -104.51610144351925 -3.741180954897518
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984513 -104.51610144351925 -3.741180954897518
+ vertex -149.9724654298452 -105.88202726980833 -3.8143593539449454
+ vertex -149.97246542984522 -106.2679167976443 -3.6545186779375283
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984513 -104.51610144351925 -3.741180954897518
+ vertex -149.97246542984522 -106.2679167976443 -3.6545186779375283
+ vertex -149.97246542984522 -104.61600186602392 -3.50000000000003
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984522 -104.61600186602392 -3.50000000000003
+ vertex -149.97246542984522 -106.2679167976443 -3.6545186779375283
+ vertex -149.9724654298452 -106.68202726980832 -3.600000000000033
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429845 -108.88202726980838 -6.834314575050794
+ vertex -149.97246542984496 -107.09613774197238 -6.745481322062554
+ vertex -149.97246542984507 -106.6820272698084 -6.80000000000005
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984496 -107.09613774197238 -6.745481322062554
+ vertex -149.972465429845 -108.88202726980838 -6.834314575050794
+ vertex -149.97246542984507 -107.48202726980838 -6.585640646055137
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984507 -107.48202726980838 -6.585640646055137
+ vertex -149.972465429845 -108.88202726980838 -6.834314575050794
+ vertex -149.97246542984496 -107.81339811970685 -6.3313708498985
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984496 -107.81339811970685 -6.3313708498985
+ vertex -149.972465429845 -108.88202726980838 -6.834314575050794
+ vertex -149.97246542984504 -108.06766791586347 -6.000000000000031
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984504 -108.06766791586347 -6.000000000000031
+ vertex -149.972465429845 -108.88202726980838 -6.834314575050794
+ vertex -149.97246542984507 -108.88202726980833 -4.800000000000056
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984504 -108.06766791586347 -6.000000000000031
+ vertex -149.97246542984507 -108.88202726980833 -4.800000000000056
+ vertex -149.97246542984507 -108.22750859187089 -5.6141104721640644
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984507 -108.22750859187089 -5.6141104721640644
+ vertex -149.97246542984507 -108.88202726980833 -4.800000000000056
+ vertex -149.972465429845 -108.28202726980838 -5.200000000000033
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.972465429845 -108.28202726980838 -5.200000000000033
+ vertex -149.97246542984507 -108.88202726980833 -4.800000000000056
+ vertex -149.97246542984507 -108.22750859187083 -4.785889527836001
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984422 -120.08202726980838 -19.16568542494932
+ vertex -149.97246542984422 -120.64771269475759 -18.60000000000005
+ vertex -149.97246542984428 -117.61634184485911 -16.700000000000063
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984422 -120.64771269475759 -18.60000000000005
+ vertex -149.97246542984422 -120.08202726980838 -19.16568542494932
+ vertex -149.97246542984422 -122.68202726980837 -18.60000000000006
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984428 -117.61634184485911 -16.700000000000063
+ vertex -149.97246542984422 -120.64771269475759 -18.60000000000005
+ vertex -149.97246542984442 -118.18202726980836 -16.134314575050784
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984428 -117.61634184485911 -16.700000000000063
+ vertex -149.97246542984442 -118.18202726980836 -16.134314575050784
+ vertex -149.9724654298445 -111.34771269475763 -16.700000000000028
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -111.34771269475763 -16.700000000000028
+ vertex -149.97246542984442 -118.18202726980836 -16.134314575050784
+ vertex -149.9724654298446 -110.78202726980835 -16.134314575050794
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -110.78202726980835 -16.134314575050794
+ vertex -149.97246542984442 -118.18202726980836 -16.134314575050784
+ vertex -149.9724654298445 -114.48202726980834 -15.700000000000038
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -110.78202726980835 -16.134314575050794
+ vertex -149.9724654298445 -114.48202726980834 -15.700000000000038
+ vertex -149.97246542984453 -113.78321584803155 -15.607999730980529
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -110.78202726980835 -16.134314575050794
+ vertex -149.97246542984453 -113.78321584803155 -15.607999730980529
+ vertex -149.97246542984453 -113.13202726980836 -15.33826859021802
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -110.78202726980835 -16.134314575050794
+ vertex -149.97246542984453 -113.13202726980836 -15.33826859021802
+ vertex -149.9724654298445 -112.57283896060466 -14.909188309203731
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -110.78202726980835 -16.134314575050794
+ vertex -149.9724654298445 -112.57283896060466 -14.909188309203731
+ vertex -149.97246542984465 -112.14375867959039 -14.350000000000053
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -110.78202726980835 -16.134314575050794
+ vertex -149.97246542984465 -112.14375867959039 -14.350000000000053
+ vertex -149.97246542984468 -111.87402753882786 -13.698811421776819
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298446 -110.78202726980835 -16.134314575050794
+ vertex -149.97246542984468 -111.87402753882786 -13.698811421776819
+ vertex -149.97246542984473 -110.78202726980835 -9.865685424949328
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -110.78202726980835 -9.865685424949328
+ vertex -149.97246542984468 -111.87402753882786 -13.698811421776819
+ vertex -149.97246542984468 -111.78202726980835 -13.000000000000021
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -110.78202726980835 -9.865685424949328
+ vertex -149.97246542984468 -111.78202726980835 -13.000000000000021
+ vertex -149.97246542984476 -111.8740275388279 -12.3011885782232
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -110.78202726980835 -9.865685424949328
+ vertex -149.97246542984476 -111.8740275388279 -12.3011885782232
+ vertex -149.97246542984473 -112.14375867959039 -11.650000000000011
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -110.78202726980835 -9.865685424949328
+ vertex -149.97246542984473 -112.14375867959039 -11.650000000000011
+ vertex -149.97246542984476 -112.57283896060468 -11.090811690796333
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -110.78202726980835 -9.865685424949328
+ vertex -149.97246542984476 -112.57283896060468 -11.090811690796333
+ vertex -149.97246542984476 -113.13202726980836 -10.661731409782044
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -110.78202726980835 -9.865685424949328
+ vertex -149.97246542984476 -113.13202726980836 -10.661731409782044
+ vertex -149.97246542984476 -113.78321584803155 -10.39200026901956
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984473 -110.78202726980835 -9.865685424949328
+ vertex -149.97246542984476 -113.78321584803155 -10.39200026901956
+ vertex -149.97246542984473 -114.48202726980833 -10.30000000000005
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.9724654298445 -111.34771269475763 -16.700000000000028
+ vertex -149.97246542984465 -108.3163418448591 -18.60000000000005
+ vertex -149.97246542984453 -108.88202726980833 -19.165685424949274
+ endloop
+endfacet
+facet normal -1.0 -4.59687843346329e-19 -2.9750497701033086e-16
+ outer loop
+ vertex -149.97246542984465 -108.3163418448591 -18.60000000000005
+ vertex -149.9724654298445 -111.34771269475763 -16.700000000000028
+ vertex -149.9724654298446 -110.78202726980835 -16.134314575050794
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015376 -106.26791679764438 -6.745481322062464
+ vertex 150.0275345701538 -107.09613774197246 -6.745481322062464
+ vertex 150.0275345701538 -106.68202726980843 -6.799999999999959
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.0275345701538 -107.09613774197246 -6.745481322062464
+ vertex 150.02753457015376 -106.26791679764438 -6.745481322062464
+ vertex 150.02753457015376 -105.88202726980843 -6.58564064605507
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.0275345701538 -107.09613774197246 -6.745481322062464
+ vertex 150.02753457015376 -105.88202726980843 -6.58564064605507
+ vertex 150.02753457015382 -107.48202726980843 -6.5856406460550465
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015382 -107.48202726980843 -6.5856406460550465
+ vertex 150.02753457015376 -105.88202726980843 -6.58564064605507
+ vertex 150.0275345701537 -105.55065641990993 -6.331370849898432
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015382 -107.48202726980843 -6.5856406460550465
+ vertex 150.0275345701537 -105.55065641990993 -6.331370849898432
+ vertex 150.0275345701538 -107.81339811970689 -6.331370849898409
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.0275345701538 -107.81339811970689 -6.331370849898409
+ vertex 150.0275345701537 -105.55065641990993 -6.331370849898432
+ vertex 150.0275345701537 -105.29638662375329 -5.999999999999961
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.0275345701538 -107.81339811970689 -6.331370849898409
+ vertex 150.0275345701537 -105.29638662375329 -5.999999999999961
+ vertex 150.0275345701538 -108.06766791586351 -5.999999999999941
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.0275345701538 -108.06766791586351 -5.999999999999941
+ vertex 150.0275345701537 -105.29638662375329 -5.999999999999961
+ vertex 150.0275345701537 -105.1365459477459 -5.614110472163994
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.0275345701538 -108.06766791586351 -5.999999999999941
+ vertex 150.0275345701537 -105.1365459477459 -5.614110472163994
+ vertex 150.0275345701538 -108.22750859187093 -5.614110472163975
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.0275345701538 -108.22750859187093 -5.614110472163975
+ vertex 150.0275345701537 -105.1365459477459 -5.614110472163994
+ vertex 150.02753457015368 -105.0820272698084 -5.199999999999962
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.0275345701538 -108.22750859187093 -5.614110472163975
+ vertex 150.02753457015368 -105.0820272698084 -5.199999999999962
+ vertex 150.0275345701538 -108.28202726980838 -5.1999999999999424
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.0275345701538 -108.28202726980838 -5.1999999999999424
+ vertex 150.02753457015368 -105.0820272698084 -5.199999999999962
+ vertex 150.02753457015368 -105.1365459477459 -4.785889527835931
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.0275345701538 -108.28202726980838 -5.1999999999999424
+ vertex 150.02753457015368 -105.1365459477459 -4.785889527835931
+ vertex 150.02753457015376 -108.22750859187093 -4.785889527835911
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015376 -108.22750859187093 -4.785889527835911
+ vertex 150.02753457015368 -105.1365459477459 -4.785889527835931
+ vertex 150.02753457015368 -105.29638662375329 -4.399999999999964
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015376 -108.22750859187093 -4.785889527835911
+ vertex 150.02753457015368 -105.29638662375329 -4.399999999999964
+ vertex 150.02753457015373 -108.06766791586351 -4.399999999999944
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015373 -108.06766791586351 -4.399999999999944
+ vertex 150.02753457015368 -105.29638662375329 -4.399999999999964
+ vertex 150.02753457015365 -105.55065641990991 -4.068629150101493
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015373 -108.06766791586351 -4.399999999999944
+ vertex 150.02753457015365 -105.55065641990991 -4.068629150101493
+ vertex 150.0275345701537 -107.81339811970687 -4.068629150101447
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.0275345701537 -107.81339811970687 -4.068629150101447
+ vertex 150.02753457015365 -105.55065641990991 -4.068629150101493
+ vertex 150.02753457015368 -105.88202726980838 -3.8143593539448553
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.0275345701537 -107.81339811970687 -4.068629150101447
+ vertex 150.02753457015368 -105.88202726980838 -3.8143593539448553
+ vertex 150.02753457015368 -107.4820272698084 -3.8143593539448326
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015368 -107.4820272698084 -3.8143593539448326
+ vertex 150.02753457015368 -105.88202726980838 -3.8143593539448553
+ vertex 150.02753457015362 -106.26791679764435 -3.654518677937438
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015368 -107.4820272698084 -3.8143593539448326
+ vertex 150.02753457015362 -106.26791679764435 -3.654518677937438
+ vertex 150.02753457015368 -107.09613774197238 -3.654518677937438
+ endloop
+endfacet
+facet normal 1.0 -9.193756866918206e-19 2.9700185742271525e-16
+ outer loop
+ vertex 150.02753457015368 -107.09613774197238 -3.654518677937438
+ vertex 150.02753457015362 -106.26791679764435 -3.654518677937438
+ vertex 150.02753457015368 -106.68202726980839 -3.599999999999943
+ endloop
+endfacet
+facet normal -0.46392867916165254 0.8858725532780236 1.0458099413404683e-16
+ outer loop
+ vertex 165.50033391975418 -116.80811057410425 -3.000000000000062
+ vertex 164.18392212485122 -117.49751130447146 -62.600000000000065
+ vertex 164.18392212485122 -117.49751130447146 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.46392867916165254 0.8858725532780236 1.0458099413404683e-16
+ outer loop
+ vertex 164.18392212485122 -117.49751130447146 -62.600000000000065
+ vertex 165.50033391975418 -116.80811057410425 -3.000000000000062
+ vertex 165.50033391975418 -116.80811057410422 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.30989713538576374 0.9507700907578538 7.690445521229562e-17
+ outer loop
+ vertex 160.07805400761478 -119.22742144815793 -3.000000000000062
+ vertex 158.66520409248508 -119.68793040367179 -62.600000000000065
+ vertex 158.66520409248508 -119.68793040367179 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.30989713538576374 0.9507700907578538 7.690445521229562e-17
+ outer loop
+ vertex 158.66520409248508 -119.68793040367179 -62.600000000000065
+ vertex 160.07805400761478 -119.22742144815793 -3.000000000000062
+ vertex 160.07805400761478 -119.22742144815793 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9861411980746715 -0.16590821998879884 1.820889389375274e-16
+ outer loop
+ vertex 183.26546823547173 -79.06564190936425 -3.000000000000062
+ vertex 183.51200882063426 -80.53105349682295 -62.600000000000065
+ vertex 183.51200882063426 -80.53105349682295 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9861411980746715 -0.16590821998879884 1.820889389375274e-16
+ outer loop
+ vertex 183.51200882063426 -80.53105349682295 -62.600000000000065
+ vertex 183.26546823547173 -79.06564190936425 -3.000000000000062
+ vertex 183.2654682354717 -79.06564190936425 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.6377703208595134 0.7702266016119889 1.3498487096513938e-16
+ outer loop
+ vertex 170.69963869919482 -113.30770840086842 -3.000000000000085
+ vertex 170.4439108399647 -113.51945860333161 -62.600000000000065
+ vertex 170.4439108399647 -113.51945860333164 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.6377703208595134 0.7702266016119889 1.3498487096513938e-16
+ outer loop
+ vertex 170.4439108399647 -113.51945860333161 -62.600000000000065
+ vertex 170.69963869919482 -113.30770840086842 -3.000000000000085
+ vertex 170.6996386991948 -113.30770840086842 -62.60000000000009
+ endloop
+endfacet
+facet normal -1.5543122344752188e-15 -1.0 -1.9625534153898396e-17
+ outer loop
+ vertex 155.41311056879684 -104.48202726980838 -3.0000000000000733
+ vertex 153.02753457015433 -104.48202726980838 -62.60000000000008
+ vertex 155.41311056879684 -104.48202726980838 -62.60000000000008
+ endloop
+endfacet
+facet normal -1.5543122344752188e-15 -1.0 -1.9625534153898396e-17
+ outer loop
+ vertex 153.02753457015433 -104.48202726980838 -62.60000000000008
+ vertex 155.41311056879684 -104.48202726980838 -3.0000000000000733
+ vertex 153.02753457015433 -104.48202726980838 -3.0000000000000733
+ endloop
+endfacet
+facet normal -0.18844624350994066 0.9820835062798847 5.469233483307139e-17
+ outer loop
+ vertex 154.3285555435008 -120.7098019533102 -3.000000000000062
+ vertex 155.78793737722236 -120.42976973338907 -62.600000000000065
+ vertex 154.32855554350078 -120.7098019533102 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.18844624350994066 0.9820835062798847 5.469233483307139e-17
+ outer loop
+ vertex 155.78793737722236 -120.42976973338907 -62.600000000000065
+ vertex 154.3285555435008 -120.7098019533102 -3.000000000000062
+ vertex 155.78793737722236 -120.42976973338907 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.22935485323248733 0.9733428744788264 6.220955760198345e-17
+ outer loop
+ vertex 155.78793737722236 -120.42976973338907 -3.000000000000062
+ vertex 157.23433058097086 -120.0889470801798 -62.600000000000065
+ vertex 155.78793737722236 -120.42976973338907 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.22935485323248733 0.9733428744788264 6.220955760198345e-17
+ outer loop
+ vertex 157.23433058097086 -120.0889470801798 -62.600000000000065
+ vertex 155.78793737722236 -120.42976973338907 -3.000000000000062
+ vertex 157.23433058097086 -120.0889470801798 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9920516018175776 0.12583171035624832 1.8892534971894315e-16
+ outer loop
+ vertex 183.6921424816438 -89.42252419859925 -3.000000000000062
+ vertex 183.50515582416938 -90.89671868058495 -62.600000000000065
+ vertex 183.5051558241694 -90.89671868058495 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9920516018175776 0.12583171035624832 1.8892534971894315e-16
+ outer loop
+ vertex 183.50515582416938 -90.89671868058495 -62.600000000000065
+ vertex 183.6921424816438 -89.42252419859925 -3.000000000000062
+ vertex 183.6921424816438 -89.42252419859925 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.999097175068117 0.04248334698335731 1.8861380718886244e-16
+ outer loop
+ vertex 183.88044108012068 -86.45713502014631 -3.000000000000062
+ vertex 183.81731057805365 -87.94179926518602 -62.600000000000065
+ vertex 183.81731057805365 -87.94179926518602 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.999097175068117 0.04248334698335731 1.8861380718886244e-16
+ outer loop
+ vertex 183.81731057805365 -87.94179926518602 -62.600000000000065
+ vertex 183.88044108012068 -86.45713502014631 -3.000000000000062
+ vertex 183.88044108012068 -86.4571350201463 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9922171154055783 -0.1245198614528357 1.8404317463084559e-16
+ outer loop
+ vertex 183.51200882063426 -80.53105349682295 -3.000000000000062
+ vertex 183.6970460629663 -82.00549393296835 -62.600000000000065
+ vertex 183.6970460629663 -82.00549393296835 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9922171154055783 -0.1245198614528357 1.8404317463084559e-16
+ outer loop
+ vertex 183.6970460629663 -82.00549393296835 -62.600000000000065
+ vertex 183.51200882063426 -80.53105349682295 -3.000000000000062
+ vertex 183.51200882063426 -80.53105349682295 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.3882711944089143 0.9215451587373649 9.106128389727603e-17
+ outer loop
+ vertex 162.83982945717034 -118.13125279867626 -3.000000000000062
+ vertex 161.47040796193536 -118.70822606424322 -62.600000000000065
+ vertex 161.4704079619354 -118.70822606424322 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.3882711944089143 0.9215451587373649 9.106128389727603e-17
+ outer loop
+ vertex 161.47040796193536 -118.70822606424322 -62.600000000000065
+ vertex 162.83982945717034 -118.13125279867626 -3.000000000000062
+ vertex 162.83982945717034 -118.13125279867626 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.26986211191720677 0.962898977334375 6.961791905771743e-17
+ outer loop
+ vertex 158.66520409248508 -119.68793040367179 -3.000000000000062
+ vertex 157.23433058097086 -120.0889470801798 -62.600000000000065
+ vertex 157.23433058097086 -120.0889470801798 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.26986211191720677 0.962898977334375 6.961791905771743e-17
+ outer loop
+ vertex 157.23433058097086 -120.0889470801798 -62.600000000000065
+ vertex 158.66520409248508 -119.68793040367179 -3.000000000000062
+ vertex 158.66520409248508 -119.68793040367179 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9965567391136532 -0.08291360399332831 1.8567535078147348e-16
+ outer loop
+ vertex 183.6970460629663 -82.00549393296835 -3.000000000000062
+ vertex 183.82025616339308 -83.48638307532282 -62.600000000000065
+ vertex 183.8202561633931 -83.48638307532283 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9965567391136532 -0.08291360399332831 1.8567535078147348e-16
+ outer loop
+ vertex 183.82025616339308 -83.48638307532282 -62.600000000000065
+ vertex 183.6970460629663 -82.00549393296835 -3.000000000000062
+ vertex 183.6970460629663 -82.00549393296835 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.5363402452594229 0.8440018609665869 1.1736899405614502e-16
+ outer loop
+ vertex 168.04095293703554 -115.26725225780693 -3.000000000000062
+ vertex 166.7867612357742 -116.06425699887048 -62.600000000000065
+ vertex 166.7867612357742 -116.06425699887048 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.5363402452594229 0.8440018609665869 1.1736899405614502e-16
+ outer loop
+ vertex 166.7867612357742 -116.06425699887048 -62.600000000000065
+ vertex 168.04095293703554 -115.26725225780693 -3.000000000000062
+ vertex 168.04095293703554 -115.26725225780693 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9576170825074757 -0.2880443078588266 1.7433085302539735e-16
+ outer loop
+ vertex 182.58970960549215 -76.17214236454274 -3.000000000000062
+ vertex 182.16167407948234 -74.74911777963072 -62.600000000000065
+ vertex 182.58970960549215 -76.17214236454272 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9576170825074757 -0.2880443078588266 1.7433085302539735e-16
+ outer loop
+ vertex 182.16167407948234 -74.74911777963072 -62.600000000000065
+ vertex 182.58970960549215 -76.17214236454274 -3.000000000000062
+ vertex 182.16167407948234 -74.74911777963072 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 -7.697865611885077e-17
+ outer loop
+ vertex 165.70536792090212 -107.53751347666713 -3.000000000000062
+ vertex 172.33046225985305 -111.36251347666713 -62.600000000000065
+ vertex 165.7053679209021 -107.53751347666713 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 -7.697865611885077e-17
+ outer loop
+ vertex 172.33046225985305 -111.36251347666713 -62.600000000000065
+ vertex 165.70536792090212 -107.53751347666713 -3.000000000000062
+ vertex 172.33046225985308 -111.36251347666713 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 7.697865611885077e-17
+ outer loop
+ vertex 170.69963869919482 -113.30770840086842 -3.000000000000085
+ vertex 155.41311056879684 -104.48202726980838 -62.60000000000008
+ vertex 170.6996386991948 -113.30770840086842 -62.60000000000009
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 7.697865611885077e-17
+ outer loop
+ vertex 155.41311056879684 -104.48202726980838 -62.60000000000008
+ vertex 170.69963869919482 -113.30770840086842 -3.000000000000085
+ vertex 155.41311056879684 -104.48202726980838 -3.0000000000000733
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 -7.697865611885077e-17
+ outer loop
+ vertex 168.16311056879687 -82.39837947330521 -3.000000000000062
+ vertex 183.4496386991948 -91.22406060436526 -62.600000000000065
+ vertex 168.16311056879684 -82.39837947330521 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 -7.697865611885077e-17
+ outer loop
+ vertex 183.4496386991948 -91.22406060436526 -62.600000000000065
+ vertex 168.16311056879687 -82.39837947330521 -3.000000000000062
+ vertex 183.4496386991948 -91.22406060436526 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.5005724413202224 0.8656946522826121 1.1107217741834888e-16
+ outer loop
+ vertex 166.7867612357742 -116.06425699887048 -3.000000000000062
+ vertex 165.50033391975418 -116.80811057410422 -62.600000000000065
+ vertex 165.50033391975418 -116.80811057410425 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.5005724413202224 0.8656946522826121 1.1107217741834888e-16
+ outer loop
+ vertex 165.50033391975418 -116.80811057410422 -62.600000000000065
+ vertex 166.7867612357742 -116.06425699887048 -3.000000000000062
+ vertex 166.7867612357742 -116.06425699887048 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9999997814571896 0.0006611244763946589 1.879626683638605e-16
+ outer loop
+ vertex 183.88142351495898 -84.9711294967339 -3.000000000000062
+ vertex 183.88044108012068 -86.4571350201463 -62.600000000000065
+ vertex 183.88044108012068 -86.45713502014631 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9999997814571896 0.0006611244763946589 1.879626683638605e-16
+ outer loop
+ vertex 183.88044108012068 -86.4571350201463 -62.600000000000065
+ vertex 183.88142351495898 -84.9711294967339 -3.000000000000062
+ vertex 183.88142351495898 -84.97112949673388 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.5711695004344003 0.8208321398273325 1.2346042516618458e-16
+ outer loop
+ vertex 169.26071429718345 -114.41849103986604 -3.000000000000062
+ vertex 168.04095293703554 -115.26725225780693 -62.600000000000065
+ vertex 168.04095293703554 -115.26725225780693 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.5711695004344003 0.8208321398273325 1.2346042516618458e-16
+ outer loop
+ vertex 168.04095293703554 -115.26725225780693 -62.600000000000065
+ vertex 169.26071429718345 -114.41849103986604 -3.000000000000062
+ vertex 169.26071429718345 -114.41849103986603 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.34938986583038373 0.9369774392454849 8.405641526142139e-17
+ outer loop
+ vertex 161.4704079619354 -118.70822606424322 -3.000000000000062
+ vertex 160.07805400761478 -119.22742144815793 -62.600000000000065
+ vertex 160.07805400761478 -119.22742144815793 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.34938986583038373 0.9369774392454849 8.405641526142139e-17
+ outer loop
+ vertex 160.07805400761478 -119.22742144815793 -62.600000000000065
+ vertex 161.4704079619354 -118.70822606424322 -3.000000000000062
+ vertex 161.47040796193536 -118.70822606424322 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9859209640962927 0.16721199883811244 1.8858520825170104e-16
+ outer loop
+ vertex 183.5051558241694 -90.89671868058495 -3.000000000000062
+ vertex 183.4496386991948 -91.22406060436526 -62.600000000000065
+ vertex 183.4496386991948 -91.22406060436526 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9859209640962927 0.16721199883811244 1.8858520825170104e-16
+ outer loop
+ vertex 183.4496386991948 -91.22406060436526 -62.600000000000065
+ vertex 183.5051558241694 -90.89671868058495 -3.000000000000062
+ vertex 183.50515582416938 -90.89671868058495 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9964462355504118 0.0842312273293781 1.8893488826187043e-16
+ outer loop
+ vertex 183.81731057805365 -87.94179926518602 -3.000000000000062
+ vertex 183.6921424816438 -89.42252419859925 -62.600000000000065
+ vertex 183.6921424816438 -89.42252419859925 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9964462355504118 0.0842312273293781 1.8893488826187043e-16
+ outer loop
+ vertex 183.6921424816438 -89.42252419859925 -62.600000000000065
+ vertex 183.81731057805365 -87.94179926518602 -3.000000000000062
+ vertex 183.81731057805365 -87.94179926518602 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 7.697865611885077e-17
+ outer loop
+ vertex 171.40253457015433 -87.15541313845642 -3.000000000000062
+ vertex 164.82694148227205 -83.35899269908614 -62.600000000000065
+ vertex 171.40253457015433 -87.15541313845642 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 7.697865611885077e-17
+ outer loop
+ vertex 164.82694148227205 -83.35899269908614 -62.600000000000065
+ vertex 171.40253457015433 -87.15541313845642 -3.000000000000062
+ vertex 164.82694148227205 -83.35899269908614 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9447323868310448 -0.3278425190125848 1.7112811674140564e-16
+ outer loop
+ vertex 182.16167407948234 -74.74911777963072 -3.000000000000062
+ vertex 181.67449817895138 -73.34523992784574 -62.600000000000065
+ vertex 182.16167407948234 -74.74911777963072 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9447323868310448 -0.3278425190125848 1.7112811674140564e-16
+ outer loop
+ vertex 181.67449817895138 -73.34523992784574 -62.600000000000065
+ vertex 182.16167407948234 -74.74911777963072 -3.000000000000062
+ vertex 181.67449817895138 -73.34523992784575 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.14720786925726453 0.9891055773923916 4.707940523677942e-17
+ outer loop
+ vertex 152.85873887103978 -120.9285537079229 -3.000000000000062
+ vertex 154.32855554350078 -120.7098019533102 -62.600000000000065
+ vertex 152.85873887103978 -120.9285537079229 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.14720786925726453 0.9891055773923916 4.707940523677942e-17
+ outer loop
+ vertex 154.32855554350078 -120.7098019533102 -62.600000000000065
+ vertex 152.85873887103978 -120.9285537079229 -3.000000000000062
+ vertex 154.3285555435008 -120.7098019533102 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9783396194476177 -0.20700625357483948 1.7981606344395098e-16
+ outer loop
+ vertex 182.95785573205208 -77.6118235133703 -3.000000000000062
+ vertex 183.2654682354717 -79.06564190936425 -62.600000000000065
+ vertex 183.26546823547173 -79.06564190936425 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9783396194476177 -0.20700625357483948 1.7981606344395098e-16
+ outer loop
+ vertex 183.2654682354717 -79.06564190936425 -62.600000000000065
+ vertex 182.95785573205208 -77.6118235133703 -3.000000000000062
+ vertex 182.95785573205208 -77.6118235133703 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.96882603160823 -0.24774204422796148 1.7722852548447616e-16
+ outer loop
+ vertex 182.58970960549215 -76.17214236454274 -3.000000000000062
+ vertex 182.95785573205208 -77.6118235133703 -62.600000000000065
+ vertex 182.95785573205208 -77.6118235133703 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.96882603160823 -0.24774204422796148 1.7722852548447616e-16
+ outer loop
+ vertex 182.95785573205208 -77.6118235133703 -62.600000000000065
+ vertex 182.58970960549215 -76.17214236454274 -3.000000000000062
+ vertex 182.58970960549215 -76.17214236454272 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.4264730821792922 0.904500254381664 9.790680320921968e-17
+ outer loop
+ vertex 164.18392212485122 -117.49751130447146 -3.000000000000062
+ vertex 162.83982945717034 -118.13125279867626 -62.600000000000065
+ vertex 162.83982945717034 -118.13125279867626 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.4264730821792922 0.904500254381664 9.790680320921968e-17
+ outer loop
+ vertex 162.83982945717034 -118.13125279867626 -62.600000000000065
+ vertex 164.18392212485122 -117.49751130447146 -3.000000000000062
+ vertex 164.18392212485122 -117.49751130447146 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.6049992586789347 0.7962260338609506 1.2933581127401296e-16
+ outer loop
+ vertex 170.4439108399647 -113.51945860333164 -3.000000000000062
+ vertex 169.26071429718345 -114.41849103986603 -62.600000000000065
+ vertex 169.26071429718345 -114.41849103986604 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.6049992586789347 0.7962260338609506 1.2933581127401296e-16
+ outer loop
+ vertex 169.26071429718345 -114.41849103986603 -62.600000000000065
+ vertex 170.4439108399647 -113.51945860333164 -3.000000000000062
+ vertex 170.4439108399647 -113.51945860333161 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.8191520442889912 -0.5735764363510468 -1.652161531954164e-16
+ outer loop
+ vertex 142.92035092844716 -57.61499983057255 -62.600000000000065
+ vertex 142.51289504782764 -58.196907134314685 -3.000000000000062
+ vertex 142.51289504782764 -58.196907134314685 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.8191520442889912 -0.5735764363510468 -1.652161531954164e-16
+ outer loop
+ vertex 142.51289504782764 -58.196907134314685 -3.000000000000062
+ vertex 142.92035092844716 -57.61499983057255 -62.600000000000065
+ vertex 142.9203509284472 -57.61499983057255 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 171.40253457015433 -87.15541313845642 -3.000000000000062
+ vertex 170.40253457015433 -88.88746394602529 -62.600000000000065
+ vertex 170.40253457015433 -88.88746394602529 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 170.40253457015433 -88.88746394602529 -62.600000000000065
+ vertex 171.40253457015433 -87.15541313845642 -3.000000000000062
+ vertex 171.40253457015433 -87.15541313845642 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 -7.697865611885078e-17
+ outer loop
+ vertex 162.15253457015433 -103.17688310846853 -62.600000000000065
+ vertex 166.70536792090212 -105.80546266909826 -3.000000000000062
+ vertex 166.7053679209021 -105.80546266909826 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 -7.697865611885078e-17
+ outer loop
+ vertex 166.70536792090212 -105.80546266909826 -3.000000000000062
+ vertex 162.15253457015433 -103.17688310846853 -62.600000000000065
+ vertex 162.15253457015433 -103.17688310846853 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 7.697865611885078e-17
+ outer loop
+ vertex 174.9553679209021 -91.51604350665502 -3.000000000000062
+ vertex 170.40253457015433 -88.88746394602529 -62.600000000000065
+ vertex 174.9553679209021 -91.51604350665501 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 7.697865611885078e-17
+ outer loop
+ vertex 170.40253457015433 -88.88746394602529 -62.600000000000065
+ vertex 174.9553679209021 -91.51604350665502 -3.000000000000062
+ vertex 170.40253457015433 -88.88746394602529 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.4999999999999997 0.8660254037844388 1.629868445721389e-16
+ outer loop
+ vertex 179.9246854525155 -69.38910354298146 -3.000000000000062
+ vertex 165.47032256947557 -77.73433384446905 -62.600000000000065
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.4999999999999997 0.8660254037844388 1.629868445721389e-16
+ outer loop
+ vertex 165.47032256947557 -77.73433384446905 -62.600000000000065
+ vertex 179.9246854525155 -69.38910354298146 -3.000000000000062
+ vertex 179.9246854525155 -69.38910354298145 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.4999999999999997 0.8660254037844388 1.629868445721389e-16
+ outer loop
+ vertex 179.9246854525155 -69.38910354298145 -62.600000000000065
+ vertex 179.9246854525155 -69.38910354298146 -3.000000000000062
+ vertex 182.52753457015436 -67.88634790425267 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.4999999999999997 0.8660254037844388 1.629868445721389e-16
+ outer loop
+ vertex 179.9246854525155 -69.38910354298145 -62.600000000000065
+ vertex 182.52753457015436 -67.88634790425267 -3.000000000000062
+ vertex 182.52753457015436 -67.88634790425266 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 -1.7258201180401962e-16
+ outer loop
+ vertex 175.9553679209021 -89.78399269908614 -62.600000000000065
+ vertex 174.9553679209021 -91.51604350665502 -3.000000000000062
+ vertex 174.9553679209021 -91.51604350665501 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 -1.7258201180401962e-16
+ outer loop
+ vertex 174.9553679209021 -91.51604350665502 -3.000000000000062
+ vertex 175.9553679209021 -89.78399269908614 -62.600000000000065
+ vertex 175.9553679209021 -89.78399269908614 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 -7.697865611885077e-17
+ outer loop
+ vertex 154.57694148227208 -101.11251347666712 -3.000000000000062
+ vertex 161.15253457015433 -104.9089339160374 -62.600000000000065
+ vertex 154.57694148227205 -101.11251347666712 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 -7.697865611885077e-17
+ outer loop
+ vertex 161.15253457015433 -104.9089339160374 -62.600000000000065
+ vertex 154.57694148227208 -101.11251347666712 -3.000000000000062
+ vertex 161.15253457015433 -104.9089339160374 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 -1.7258201180401965e-16
+ outer loop
+ vertex 164.82694148227205 -83.35899269908614 -62.600000000000065
+ vertex 154.57694148227208 -101.11251347666712 -3.000000000000062
+ vertex 154.57694148227205 -101.11251347666712 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 -1.7258201180401965e-16
+ outer loop
+ vertex 154.57694148227208 -101.11251347666712 -3.000000000000062
+ vertex 164.82694148227205 -83.35899269908614 -62.600000000000065
+ vertex 164.82694148227205 -83.35899269908614 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401965e-16
+ outer loop
+ vertex 182.58046225985305 -93.60899269908616 -3.000000000000062
+ vertex 172.33046225985305 -111.36251347666713 -62.600000000000065
+ vertex 172.33046225985308 -111.36251347666713 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401965e-16
+ outer loop
+ vertex 172.33046225985305 -111.36251347666713 -62.600000000000065
+ vertex 182.58046225985305 -93.60899269908616 -3.000000000000062
+ vertex 182.58046225985305 -93.60899269908614 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 121.65644752391404 -94.32133391112714 -62.600000000000065
+ vertex 121.62891295376006 -94.3690251855984 -3.000000000000051
+ vertex 121.62891295376006 -94.3690251855984 -62.600000000000044
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 121.62891295376006 -94.3690251855984 -3.000000000000051
+ vertex 121.65644752391404 -94.32133391112714 -62.600000000000065
+ vertex 121.65644752391407 -94.32133391112714 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 121.65644752391407 -94.32133391112714 -3.000000000000062
+ vertex 121.65644752391404 -94.32133391112714 -62.600000000000065
+ vertex 126.27534904305944 -86.32116180481025 -35.9058285412303
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 126.27534904305944 -86.32116180481025 -35.9058285412303
+ vertex 121.65644752391404 -94.32133391112714 -62.600000000000065
+ vertex 126.52762680572613 -85.88420390225173 -37.39220118838113
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 126.52762680572613 -85.88420390225173 -37.39220118838113
+ vertex 121.65644752391404 -94.32133391112714 -62.600000000000065
+ vertex 126.87475157808723 -85.28296615995656 -38.800000000000054
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 126.87475157808723 -85.28296615995656 -38.800000000000054
+ vertex 121.65644752391404 -94.32133391112714 -62.600000000000065
+ vertex 127.31078395904645 -84.52773592238995 -40.105137148104696
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 127.31078395904645 -84.52773592238995 -40.105137148104696
+ vertex 121.65644752391404 -94.32133391112714 -62.600000000000065
+ vertex 127.82826331367458 -83.63143538830607 -41.28528137423862
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 127.82826331367458 -83.63143538830607 -41.28528137423862
+ vertex 121.65644752391404 -94.32133391112714 -62.600000000000065
+ vertex 128.41833542674155 -82.60940050834459 -42.32024008349487
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 128.41833542674155 -82.60940050834459 -42.32024008349487
+ vertex 121.65644752391404 -94.32133391112714 -62.600000000000065
+ vertex 142.51289504782764 -58.196907134314685 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 121.65644752391407 -94.32133391112714 -3.000000000000062
+ vertex 126.27534904305944 -86.32116180481025 -35.9058285412303
+ vertex 126.12223483255102 -86.58636339677167 -34.36631430664067
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 121.65644752391407 -94.32133391112714 -3.000000000000062
+ vertex 126.12223483255102 -86.58636339677167 -34.36631430664067
+ vertex 126.07090400079386 -86.67527100536981 -32.800000000000054
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 128.41833542674155 -82.60940050834459 -42.32024008349487
+ vertex 142.51289504782764 -58.196907134314685 -62.600000000000065
+ vertex 129.07090400079386 -81.47911858266319 -43.19230484541332
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 129.07090400079386 -81.47911858266319 -43.19230484541332
+ vertex 142.51289504782764 -58.196907134314685 -62.600000000000065
+ vertex 129.77480340660333 -80.25992904838364 -43.8865543901355
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 129.77480340660333 -80.25992904838364 -43.8865543901355
+ vertex 142.51289504782764 -58.196907134314685 -62.600000000000065
+ vertex 130.51798973017873 -78.97269257646072 -44.391109915468874
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 130.51798973017873 -78.97269257646072 -44.391109915468874
+ vertex 142.51289504782764 -58.196907134314685 -62.600000000000065
+ vertex 131.28774684747356 -77.63943413981835 -44.69733833648578
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 131.28774684747356 -77.63943413981835 -44.69733833648578
+ vertex 142.51289504782764 -58.196907134314685 -62.600000000000065
+ vertex 132.07090400079386 -76.28296615995656 -44.800000000000054
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 132.07090400079386 -76.28296615995656 -44.800000000000054
+ vertex 142.51289504782764 -58.196907134314685 -62.600000000000065
+ vertex 132.8540611541142 -74.92649818009477 -44.69733833648578
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 132.8540611541142 -74.92649818009477 -44.69733833648578
+ vertex 142.51289504782764 -58.196907134314685 -62.600000000000065
+ vertex 133.623818271409 -73.5932397434524 -44.391109915468874
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 133.623818271409 -73.5932397434524 -44.391109915468874
+ vertex 142.51289504782764 -58.196907134314685 -62.600000000000065
+ vertex 134.36700459498442 -72.30600327152946 -43.8865543901355
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 134.36700459498442 -72.30600327152946 -43.8865543901355
+ vertex 142.51289504782764 -58.196907134314685 -62.600000000000065
+ vertex 135.07090400079386 -71.08681373724993 -43.192304845413325
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 135.07090400079386 -71.08681373724993 -43.192304845413325
+ vertex 142.51289504782764 -58.196907134314685 -62.600000000000065
+ vertex 135.7234725748462 -69.95653181156851 -42.32024008349488
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 135.7234725748462 -69.95653181156851 -42.32024008349488
+ vertex 142.51289504782764 -58.196907134314685 -62.600000000000065
+ vertex 136.31354468791315 -68.93449693160701 -41.285281374238636
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 136.31354468791315 -68.93449693160701 -41.285281374238636
+ vertex 142.51289504782764 -58.196907134314685 -62.600000000000065
+ vertex 136.8310240425413 -68.03819639752317 -40.10513714810471
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 136.8310240425413 -68.03819639752317 -40.10513714810471
+ vertex 142.51289504782764 -58.196907134314685 -62.600000000000065
+ vertex 137.2670564235005 -67.28296615995654 -38.80000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 137.2670564235005 -67.28296615995654 -38.80000000000006
+ vertex 142.51289504782764 -58.196907134314685 -62.600000000000065
+ vertex 137.6141811958616 -66.68172841766136 -37.392201188381144
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 137.6141811958616 -66.68172841766136 -37.392201188381144
+ vertex 142.51289504782764 -58.196907134314685 -62.600000000000065
+ vertex 137.86645895852828 -66.24477051510286 -35.905828541230306
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 137.86645895852828 -66.24477051510286 -35.905828541230306
+ vertex 142.51289504782764 -58.196907134314685 -62.600000000000065
+ vertex 138.01957316903673 -65.97956892314143 -34.36631430664068
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 138.01957316903673 -65.97956892314143 -34.36631430664068
+ vertex 142.51289504782764 -58.196907134314685 -62.600000000000065
+ vertex 138.07090400079386 -65.89066131454328 -32.800000000000054
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 121.65644752391407 -94.32133391112714 -3.000000000000062
+ vertex 128.41833542674155 -82.60940050834459 -23.279759916505228
+ vertex 142.51289504782764 -58.196907134314685 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 128.41833542674155 -82.60940050834459 -23.279759916505228
+ vertex 121.65644752391407 -94.32133391112714 -3.000000000000062
+ vertex 127.82826331367458 -83.63143538830607 -24.314718625761483
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 127.82826331367458 -83.63143538830607 -24.314718625761483
+ vertex 121.65644752391407 -94.32133391112714 -3.000000000000062
+ vertex 127.31078395904645 -84.52773592238995 -25.4948628518954
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 127.31078395904645 -84.52773592238995 -25.4948628518954
+ vertex 121.65644752391407 -94.32133391112714 -3.000000000000062
+ vertex 126.87475157808723 -85.28296615995656 -26.800000000000054
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 126.87475157808723 -85.28296615995656 -26.800000000000054
+ vertex 121.65644752391407 -94.32133391112714 -3.000000000000062
+ vertex 126.52762680572613 -85.88420390225173 -28.207798811618975
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 126.52762680572613 -85.88420390225173 -28.207798811618975
+ vertex 121.65644752391407 -94.32133391112714 -3.000000000000062
+ vertex 126.27534904305944 -86.32116180481025 -29.6941714587698
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 126.27534904305944 -86.32116180481025 -29.6941714587698
+ vertex 121.65644752391407 -94.32133391112714 -3.000000000000062
+ vertex 126.12223483255102 -86.58636339677167 -31.233685693359433
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 126.12223483255102 -86.58636339677167 -31.233685693359433
+ vertex 121.65644752391407 -94.32133391112714 -3.000000000000062
+ vertex 126.07090400079386 -86.67527100536981 -32.800000000000054
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 142.51289504782764 -58.196907134314685 -3.000000000000062
+ vertex 128.41833542674155 -82.60940050834459 -23.279759916505228
+ vertex 129.07090400079386 -81.47911858266316 -22.40769515458679
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 142.51289504782764 -58.196907134314685 -3.000000000000062
+ vertex 129.07090400079386 -81.47911858266316 -22.40769515458679
+ vertex 129.77480340660333 -80.25992904838364 -21.71344560986461
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 142.51289504782764 -58.196907134314685 -3.000000000000062
+ vertex 129.77480340660333 -80.25992904838364 -21.71344560986461
+ vertex 130.51798973017873 -78.97269257646072 -21.208890084531234
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 142.51289504782764 -58.196907134314685 -3.000000000000062
+ vertex 130.51798973017873 -78.97269257646072 -21.208890084531234
+ vertex 131.28774684747356 -77.63943413981835 -20.90266166351433
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 142.51289504782764 -58.196907134314685 -3.000000000000062
+ vertex 131.28774684747356 -77.63943413981835 -20.90266166351433
+ vertex 132.07090400079386 -76.28296615995656 -20.80000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 142.51289504782764 -58.196907134314685 -3.000000000000062
+ vertex 132.07090400079386 -76.28296615995656 -20.80000000000005
+ vertex 132.8540611541142 -74.92649818009477 -20.90266166351433
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 142.51289504782764 -58.196907134314685 -3.000000000000062
+ vertex 132.8540611541142 -74.92649818009477 -20.90266166351433
+ vertex 133.623818271409 -73.5932397434524 -21.208890084531237
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 142.51289504782764 -58.196907134314685 -3.000000000000062
+ vertex 133.623818271409 -73.5932397434524 -21.208890084531237
+ vertex 134.36700459498442 -72.30600327152945 -21.71344560986461
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 142.51289504782764 -58.196907134314685 -3.000000000000062
+ vertex 134.36700459498442 -72.30600327152945 -21.71344560986461
+ vertex 135.07090400079386 -71.08681373724991 -22.407695154586794
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 142.51289504782764 -58.196907134314685 -3.000000000000062
+ vertex 135.07090400079386 -71.08681373724991 -22.407695154586794
+ vertex 135.7234725748462 -69.95653181156851 -23.279759916505235
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 142.51289504782764 -58.196907134314685 -3.000000000000062
+ vertex 135.7234725748462 -69.95653181156851 -23.279759916505235
+ vertex 136.31354468791315 -68.93449693160701 -24.314718625761483
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 142.51289504782764 -58.196907134314685 -3.000000000000062
+ vertex 136.31354468791315 -68.93449693160701 -24.314718625761483
+ vertex 136.8310240425413 -68.03819639752314 -25.494862851895416
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 142.51289504782764 -58.196907134314685 -3.000000000000062
+ vertex 136.8310240425413 -68.03819639752314 -25.494862851895416
+ vertex 137.2670564235005 -67.28296615995654 -26.800000000000058
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 142.51289504782764 -58.196907134314685 -3.000000000000062
+ vertex 137.2670564235005 -67.28296615995654 -26.800000000000058
+ vertex 137.6141811958616 -66.68172841766136 -28.207798811618986
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 142.51289504782764 -58.196907134314685 -3.000000000000062
+ vertex 137.6141811958616 -66.68172841766136 -28.207798811618986
+ vertex 137.86645895852828 -66.24477051510286 -29.69417145876981
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 142.51289504782764 -58.196907134314685 -3.000000000000062
+ vertex 137.86645895852828 -66.24477051510286 -29.69417145876981
+ vertex 138.01957316903673 -65.97956892314143 -31.233685693359437
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 142.51289504782764 -58.196907134314685 -3.000000000000062
+ vertex 138.01957316903673 -65.97956892314143 -31.233685693359437
+ vertex 138.07090400079386 -65.89066131454328 -32.800000000000054
+ endloop
+endfacet
+facet normal 0.8660254037844386 -0.5 -1.8925949547301314e-16
+ outer loop
+ vertex 142.51289504782764 -58.196907134314685 -3.000000000000062
+ vertex 138.07090400079386 -65.89066131454328 -32.800000000000054
+ vertex 142.51289504782764 -58.196907134314685 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 162.15253457015433 -103.17688310846853 -3.000000000000062
+ vertex 161.15253457015433 -104.9089339160374 -62.600000000000065
+ vertex 161.15253457015433 -104.9089339160374 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 161.15253457015433 -104.9089339160374 -62.600000000000065
+ vertex 162.15253457015433 -103.17688310846853 -3.000000000000062
+ vertex 162.15253457015433 -103.17688310846853 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 7.697865611885077e-17
+ outer loop
+ vertex 182.58046225985305 -93.60899269908616 -3.000000000000062
+ vertex 175.9553679209021 -89.78399269908614 -62.600000000000065
+ vertex 182.58046225985305 -93.60899269908614 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 7.697865611885077e-17
+ outer loop
+ vertex 175.9553679209021 -89.78399269908614 -62.600000000000065
+ vertex 182.58046225985305 -93.60899269908616 -3.000000000000062
+ vertex 175.9553679209021 -89.78399269908614 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 -1.7258201180401962e-16
+ outer loop
+ vertex 166.7053679209021 -105.80546266909826 -62.600000000000065
+ vertex 165.70536792090212 -107.53751347666713 -3.000000000000062
+ vertex 165.7053679209021 -107.53751347666713 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 -1.7258201180401962e-16
+ outer loop
+ vertex 165.70536792090212 -107.53751347666713 -3.000000000000062
+ vertex 166.7053679209021 -105.80546266909826 -62.600000000000065
+ vertex 166.70536792090212 -105.80546266909826 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9991524752349787 -0.04116225494084529 1.8698261122315608e-16
+ outer loop
+ vertex 183.8202561633931 -83.48638307532283 -3.000000000000062
+ vertex 183.88142351495898 -84.97112949673388 -62.600000000000065
+ vertex 183.88142351495898 -84.9711294967339 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9991524752349787 -0.04116225494084529 1.8698261122315608e-16
+ outer loop
+ vertex 183.88142351495898 -84.97112949673388 -62.600000000000065
+ vertex 183.8202561633931 -83.48638307532283 -3.000000000000062
+ vertex 183.82025616339308 -83.48638307532282 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9999473364568807 -0.010262763409046471 -1.881412486327818e-16
+ outer loop
+ vertex 153.02753457015433 -104.48202726980838 -62.60000000000008
+ vertex 152.85873887103978 -120.9285537079229 -3.000000000000062
+ vertex 152.85873887103978 -120.9285537079229 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9999473364568807 -0.010262763409046471 -1.881412486327818e-16
+ outer loop
+ vertex 152.85873887103978 -120.9285537079229 -3.000000000000062
+ vertex 153.02753457015433 -104.48202726980838 -62.60000000000008
+ vertex 153.02753457015433 -104.48202726980838 -3.0000000000000733
+ endloop
+endfacet
+facet normal 0.4226182617406982 -0.9063077870366505 -9.721776452502636e-17
+ outer loop
+ vertex 144.6483918807086 -56.40501252946401 -62.600000000000065
+ vertex 144.0045710852997 -56.70523109684263 -3.000000000000062
+ vertex 144.00457108529966 -56.70523109684263 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.4226182617406982 -0.9063077870366505 -9.721776452502636e-17
+ outer loop
+ vertex 144.0045710852997 -56.70523109684263 -3.000000000000062
+ vertex 144.6483918807086 -56.40501252946401 -62.600000000000065
+ vertex 144.6483918807086 -56.405012529464024 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.6999089239761678 -0.7142321038279666 -1.4556488299553903e-16
+ outer loop
+ vertex 175.89783222505156 -112.63519917575516 -62.600000000000065
+ vertex 174.74684595244167 -113.7631036192213 -3.000000000000062
+ vertex 174.74684595244167 -113.76310361922127 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.6999089239761678 -0.7142321038279666 -1.4556488299553903e-16
+ outer loop
+ vertex 174.74684595244167 -113.7631036192213 -3.000000000000062
+ vertex 175.89783222505156 -112.63519917575516 -62.600000000000065
+ vertex 175.89783222505156 -112.63519917575516 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.6694253404686521 -0.7428793398247319 -1.4039771887661554e-16
+ outer loop
+ vertex 174.74684595244167 -113.76310361922127 -62.600000000000065
+ vertex 173.54969460939628 -114.84188371505721 -3.000000000000062
+ vertex 173.54969460939628 -114.84188371505721 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.6694253404686521 -0.7428793398247319 -1.4039771887661554e-16
+ outer loop
+ vertex 173.54969460939628 -114.84188371505721 -3.000000000000062
+ vertex 174.74684595244167 -113.76310361922127 -62.600000000000065
+ vertex 174.74684595244167 -113.7631036192213 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.5088614820537074 -0.8608484141137188 -1.1253499041091416e-16
+ outer loop
+ vertex 181.1290344193379 -71.96296547328224 -62.600000000000065
+ vertex 166.9703225694756 -80.33241005582238 -3.000000000000062
+ vertex 166.97032256947557 -80.33241005582236 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.5088614820537074 -0.8608484141137188 -1.1253499041091416e-16
+ outer loop
+ vertex 166.9703225694756 -80.33241005582238 -3.000000000000062
+ vertex 181.1290344193379 -71.96296547328224 -62.600000000000065
+ vertex 181.1290344193379 -71.96296547328224 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.14720786925724988 -0.9891055773923938 -4.707940523677671e-17
+ outer loop
+ vertex 154.83214687982968 -123.66723255536573 -3.000000000000062
+ vertex 153.23820152839704 -123.90445829168752 -62.600000000000065
+ vertex 154.83214687982968 -123.66723255536573 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.14720786925724988 -0.9891055773923938 -4.707940523677671e-17
+ outer loop
+ vertex 153.23820152839704 -123.90445829168752 -62.600000000000065
+ vertex 154.83214687982968 -123.66723255536573 -3.000000000000062
+ vertex 153.23820152839704 -123.90445829168753 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 162.26899907810125 -80.1894789059449 -3.000000000000062
+ vertex 150.55309081768112 -100.48202726980837 -62.600000000000065
+ vertex 150.55309081768115 -100.48202726980838 -3.0000000000000733
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 150.55309081768112 -100.48202726980837 -62.600000000000065
+ vertex 162.26899907810125 -80.1894789059449 -3.000000000000062
+ vertex 162.26899907810125 -80.18947890594488 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.8956764823140574 -0.444706239026974 -1.7706975454735825e-16
+ outer loop
+ vertex 183.22060786378736 -102.09672729689305 -62.600000000000065
+ vertex 182.50396298921407 -103.54011149975622 -3.000000000000062
+ vertex 182.50396298921405 -103.5401114997562 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.8956764823140574 -0.444706239026974 -1.7706975454735825e-16
+ outer loop
+ vertex 182.50396298921407 -103.54011149975622 -3.000000000000062
+ vertex 183.22060786378736 -102.09672729689305 -62.600000000000065
+ vertex 183.2206078637874 -102.09672729689308 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.4226182617407051 -0.9063077870366475 6.164421566816344e-17
+ outer loop
+ vertex 148.0799058081063 -56.705231096842645 -3.000000000000062
+ vertex 147.4360850126974 -56.40501252946401 -62.600000000000065
+ vertex 148.0799058081063 -56.70523109684263 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.4226182617407051 -0.9063077870366475 6.164421566816344e-17
+ outer loop
+ vertex 147.4360850126974 -56.40501252946401 -62.600000000000065
+ vertex 148.0799058081063 -56.705231096842645 -3.000000000000062
+ vertex 147.4360850126974 -56.405012529464024 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9859209640962899 -0.1672119988381284 -1.8858520825170085e-16
+ outer loop
+ vertex 186.4727638760373 -91.33638042612219 -62.600000000000065
+ vertex 186.203301450242 -92.92519376771133 -3.000000000000062
+ vertex 186.203301450242 -92.92519376771133 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9859209640962899 -0.1672119988381284 -1.8858520825170085e-16
+ outer loop
+ vertex 186.203301450242 -92.92519376771133 -3.000000000000062
+ vertex 186.4727638760373 -91.33638042612219 -62.600000000000065
+ vertex 186.4727638760373 -91.33638042612219 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.2588190451025147 -0.9659258262890701 2.96881605212334e-17
+ outer loop
+ vertex 147.4360850126974 -56.405012529464024 -3.000000000000062
+ vertex 146.74991289470114 -56.22115326457817 -62.600000000000065
+ vertex 147.4360850126974 -56.40501252946401 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.2588190451025147 -0.9659258262890701 2.96881605212334e-17
+ outer loop
+ vertex 146.74991289470114 -56.22115326457817 -62.600000000000065
+ vertex 147.4360850126974 -56.405012529464024 -3.000000000000062
+ vertex 146.74991289470114 -56.22115326457817 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.978065050469156 -0.20829968087053663 -1.879150590781168e-16
+ outer loop
+ vertex 186.203301450242 -92.92519376771133 -62.600000000000065
+ vertex 185.8676261536738 -94.50134729088121 -3.000000000000062
+ vertex 185.8676261536738 -94.50134729088121 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.978065050469156 -0.20829968087053663 -1.879150590781168e-16
+ outer loop
+ vertex 185.8676261536738 -94.50134729088121 -3.000000000000062
+ vertex 186.203301450242 -92.92519376771133 -62.600000000000065
+ vertex 186.203301450242 -92.92519376771133 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.10571189404139092 -0.9943967998028664 -3.938409077752592e-17
+ outer loop
+ vertex 153.23820152839704 -123.90445829168753 -3.000000000000062
+ vertex 151.63572936288375 -124.07481319206391 -62.600000000000065
+ vertex 153.23820152839704 -123.90445829168752 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.10571189404139092 -0.9943967998028664 -3.938409077752592e-17
+ outer loop
+ vertex 151.63572936288375 -124.07481319206391 -62.600000000000065
+ vertex 153.23820152839704 -123.90445829168753 -3.000000000000062
+ vertex 151.63572936288375 -124.07481319206391 -3.000000000000062
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 94.73693564691283 -100.48202726980833 -62.60000000000003
+ vertex 101.65107743484678 -100.48202726980834 -42.69777747886726
+ vertex 102.42753457015436 -100.48202726980834 -42.800000000000054
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 101.65107743484678 -100.48202726980834 -42.69777747886726
+ vertex 94.73693564691283 -100.48202726980833 -62.60000000000003
+ vertex 100.92753457015435 -100.48202726980836 -42.39807621135338
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 100.92753457015435 -100.48202726980836 -42.39807621135338
+ vertex 94.73693564691283 -100.48202726980833 -62.60000000000003
+ vertex 100.3062142265947 -100.48202726980837 -41.9213203435597
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 100.3062142265947 -100.48202726980837 -41.9213203435597
+ vertex 94.73693564691283 -100.48202726980833 -62.60000000000003
+ vertex 99.82945835880103 -100.48202726980837 -41.30000000000006
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 99.82945835880103 -100.48202726980837 -41.30000000000006
+ vertex 94.73693564691283 -100.48202726980833 -62.60000000000003
+ vertex 99.52975709128715 -100.48202726980837 -40.57645713530762
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 99.52975709128715 -100.48202726980837 -40.57645713530762
+ vertex 94.73693564691283 -100.48202726980833 -62.60000000000003
+ vertex 99.42753457015435 -100.48202726980837 -39.800000000000054
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 99.42753457015435 -100.48202726980837 -39.800000000000054
+ vertex 94.73693564691283 -100.48202726980833 -62.60000000000003
+ vertex 94.73693564691284 -100.48202726980834 -3.0000000000000284
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 99.42753457015435 -100.48202726980837 -39.800000000000054
+ vertex 94.73693564691284 -100.48202726980834 -3.0000000000000284
+ vertex 99.42753457015435 -100.48202726980834 -25.800000000000054
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 99.42753457015435 -100.48202726980834 -25.800000000000054
+ vertex 94.73693564691284 -100.48202726980834 -3.0000000000000284
+ vertex 99.52975709128714 -100.48202726980834 -25.02354286469249
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 99.52975709128714 -100.48202726980834 -25.02354286469249
+ vertex 94.73693564691284 -100.48202726980834 -3.0000000000000284
+ vertex 99.82945835880103 -100.48202726980834 -24.300000000000058
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 99.82945835880103 -100.48202726980834 -24.300000000000058
+ vertex 94.73693564691284 -100.48202726980834 -3.0000000000000284
+ vertex 100.3062142265947 -100.48202726980834 -23.678679656440412
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 100.3062142265947 -100.48202726980834 -23.678679656440412
+ vertex 94.73693564691284 -100.48202726980834 -3.0000000000000284
+ vertex 100.92753457015434 -100.48202726980836 -23.201923788646738
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 100.92753457015434 -100.48202726980836 -23.201923788646738
+ vertex 94.73693564691284 -100.48202726980834 -3.0000000000000284
+ vertex 101.65107743484678 -100.48202726980837 -22.902222521132845
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 101.65107743484678 -100.48202726980837 -22.902222521132845
+ vertex 94.73693564691284 -100.48202726980834 -3.0000000000000284
+ vertex 102.42753457015434 -100.48202726980834 -22.800000000000054
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 102.42753457015434 -100.48202726980834 -22.800000000000054
+ vertex 94.73693564691284 -100.48202726980834 -3.0000000000000284
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 105.32531204902155 -100.48202726980838 -40.576457135307614
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 105.32531204902155 -100.48202726980838 -40.576457135307614
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 105.02561078150767 -100.48202726980838 -41.300000000000054
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 105.02561078150767 -100.48202726980838 -41.300000000000054
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 94.73693564691283 -100.48202726980833 -62.60000000000003
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 105.02561078150767 -100.48202726980838 -41.300000000000054
+ vertex 94.73693564691283 -100.48202726980833 -62.60000000000003
+ vertex 104.54885491371398 -100.48202726980837 -41.9213203435597
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 104.54885491371398 -100.48202726980837 -41.9213203435597
+ vertex 94.73693564691283 -100.48202726980833 -62.60000000000003
+ vertex 103.92753457015436 -100.48202726980837 -42.39807621135337
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 103.92753457015436 -100.48202726980837 -42.39807621135337
+ vertex 94.73693564691283 -100.48202726980833 -62.60000000000003
+ vertex 103.20399170546192 -100.48202726980836 -42.69777747886726
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 103.20399170546192 -100.48202726980836 -42.69777747886726
+ vertex 94.73693564691283 -100.48202726980833 -62.60000000000003
+ vertex 102.42753457015436 -100.48202726980834 -42.800000000000054
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 105.32531204902155 -100.48202726980838 -40.576457135307614
+ vertex 105.42753457015434 -100.48202726980838 -39.800000000000054
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 105.42753457015434 -100.48202726980838 -39.800000000000054
+ vertex 105.42753457015434 -100.48202726980838 -25.800000000000047
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 105.42753457015434 -100.48202726980838 -25.800000000000047
+ vertex 105.32531204902155 -100.48202726980838 -25.02354286469249
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 105.32531204902155 -100.48202726980838 -25.02354286469249
+ vertex 105.02561078150764 -100.48202726980837 -24.30000000000005
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 105.02561078150764 -100.48202726980837 -24.30000000000005
+ vertex 104.54885491371398 -100.48202726980837 -23.678679656440412
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 104.54885491371398 -100.48202726980837 -23.678679656440412
+ vertex 103.92753457015434 -100.48202726980836 -23.201923788646738
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 103.92753457015434 -100.48202726980836 -23.201923788646738
+ vertex 103.2039917054619 -100.48202726980837 -22.902222521132845
+ endloop
+endfacet
+facet normal 9.436895709313829e-16 1.0 1.9625534153898504e-17
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 103.2039917054619 -100.48202726980837 -22.902222521132845
+ vertex 102.42753457015434 -100.48202726980834 -22.800000000000054
+ endloop
+endfacet
+facet normal 7.771561172376096e-16 1.0 1.9625534153898544e-17
+ outer loop
+ vertex 125.1582563526354 -100.48202726980834 -62.60000000000005
+ vertex 150.55309081768115 -100.48202726980838 -3.0000000000000733
+ vertex 150.55309081768112 -100.48202726980837 -62.600000000000065
+ endloop
+endfacet
+facet normal 7.771561172376096e-16 1.0 1.9625534153898544e-17
+ outer loop
+ vertex 150.55309081768115 -100.48202726980838 -3.0000000000000733
+ vertex 125.1582563526354 -100.48202726980834 -62.60000000000005
+ vertex 125.15825635263542 -100.48202726980836 -3.000000000000051
+ endloop
+endfacet
+facet normal 0.2698621119172097 -0.9628989773343741 -6.961791905771798e-17
+ outer loop
+ vertex 159.5350332499214 -122.55906210334588 -62.600000000000065
+ vertex 157.98331987988098 -122.99394536419275 -3.000000000000062
+ vertex 157.98331987988098 -122.99394536419275 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.2698621119172097 -0.9628989773343741 -6.961791905771798e-17
+ outer loop
+ vertex 157.98331987988098 -122.99394536419275 -3.000000000000062
+ vertex 159.5350332499214 -122.55906210334588 -62.600000000000065
+ vertex 159.5350332499214 -122.55906210334588 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.42647308217927365 -0.9045002543816728 -9.790680320921633e-17
+ outer loop
+ vertex 165.51981701130626 -120.18365814564442 -62.600000000000065
+ vertex 164.0622132844704 -120.87092025637168 -3.000000000000062
+ vertex 164.0622132844704 -120.87092025637166 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.42647308217927365 -0.9045002543816728 -9.790680320921633e-17
+ outer loop
+ vertex 164.0622132844704 -120.87092025637168 -3.000000000000062
+ vertex 165.51981701130626 -120.18365814564442 -62.600000000000065
+ vertex 165.51981701130626 -120.18365814564442 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.707106781186551 -0.7071067811865441 1.1902318351521197e-16
+ outer loop
+ vertex 149.16412596495886 -57.614999830572565 -3.000000000000062
+ vertex 148.66181311184843 -57.11268697746215 -62.600000000000065
+ vertex 149.16412596495886 -57.614999830572565 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.707106781186551 -0.7071067811865441 1.1902318351521197e-16
+ outer loop
+ vertex 148.66181311184843 -57.11268697746215 -62.600000000000065
+ vertex 149.16412596495886 -57.614999830572565 -3.000000000000062
+ vertex 148.66181311184843 -57.11268697746215 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.6377703208595341 -0.7702266016119718 -1.3498487096514298e-16
+ outer loop
+ vertex 173.54969460939628 -114.84188371505721 -62.600000000000065
+ vertex 172.3084731066061 -115.86965169195585 -3.000000000000062
+ vertex 172.3084731066061 -115.86965169195585 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.6377703208595341 -0.7702266016119718 -1.3498487096514298e-16
+ outer loop
+ vertex 172.3084731066061 -115.86965169195585 -3.000000000000062
+ vertex 173.54969460939628 -114.84188371505721 -62.600000000000065
+ vertex 173.54969460939628 -114.84188371505721 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9134916689428489 -0.40685743298114696 -1.7967531110889034e-16
+ outer loop
+ vertex 183.8762593218509 -100.62463388991569 -62.600000000000065
+ vertex 183.2206078637874 -102.09672729689308 -3.000000000000062
+ vertex 183.22060786378736 -102.09672729689305 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9134916689428489 -0.40685743298114696 -1.7967531110889034e-16
+ outer loop
+ vertex 183.2206078637874 -102.09672729689308 -3.000000000000062
+ vertex 183.8762593218509 -100.62463388991569 -62.600000000000065
+ vertex 183.8762593218509 -100.6246338899157 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9301944916753204 -0.36706703428242143 1.6762592114233944e-16
+ outer loop
+ vertex 181.67449817895138 -73.34523992784575 -3.000000000000062
+ vertex 181.1290344193379 -71.96296547328224 -62.600000000000065
+ vertex 181.67449817895138 -73.34523992784574 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9301944916753204 -0.36706703428242143 1.6762592114233944e-16
+ outer loop
+ vertex 181.1290344193379 -71.96296547328224 -62.600000000000065
+ vertex 181.67449817895138 -73.34523992784575 -3.000000000000062
+ vertex 181.1290344193379 -71.96296547328224 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.06403093220852701 -0.9979479143324601 -3.1619857586072013e-17
+ outer loop
+ vertex 151.63572936288375 -124.07481319206391 -3.000000000000062
+ vertex 150.02753457015433 -124.17799915024115 -62.600000000000065
+ vertex 151.63572936288375 -124.07481319206391 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.06403093220852701 -0.9979479143324601 -3.1619857586072013e-17
+ outer loop
+ vertex 150.02753457015433 -124.17799915024115 -62.600000000000065
+ vertex 151.63572936288375 -124.07481319206391 -3.000000000000062
+ vertex 150.02753457015433 -124.17799915024115 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.08715574274765725 -0.9961946980917458 -3.5931751782467723e-17
+ outer loop
+ vertex 146.042238446703 -56.159239772911356 -3.000000000000062
+ vertex 145.33456399870488 -56.221153264578156 -62.600000000000065
+ vertex 146.042238446703 -56.15923977291135 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.08715574274765725 -0.9961946980917458 -3.5931751782467723e-17
+ outer loop
+ vertex 145.33456399870488 -56.221153264578156 -62.600000000000065
+ vertex 146.042238446703 -56.159239772911356 -3.000000000000062
+ vertex 145.33456399870488 -56.221153264578156 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.18844624350994654 -0.9820835062798836 -5.46923348330725e-17
+ outer loop
+ vertex 156.4147761514999 -123.36355110749695 -3.000000000000062
+ vertex 154.83214687982968 -123.66723255536573 -62.600000000000065
+ vertex 156.41477615149986 -123.36355110749695 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.18844624350994654 -0.9820835062798836 -5.46923348330725e-17
+ outer loop
+ vertex 154.83214687982968 -123.66723255536573 -62.600000000000065
+ vertex 156.4147761514999 -123.36355110749695 -3.000000000000062
+ vertex 154.83214687982968 -123.66723255536573 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.571169500434386 -0.8208321398273426 -1.2346042516618207e-16
+ outer loop
+ vertex 171.02535347370687 -116.84460904537994 -62.600000000000065
+ vertex 169.70258105841677 -117.76504968478835 -3.000000000000062
+ vertex 169.70258105841674 -117.76504968478835 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.571169500434386 -0.8208321398273426 -1.2346042516618207e-16
+ outer loop
+ vertex 169.70258105841677 -117.76504968478835 -3.000000000000062
+ vertex 171.02535347370687 -116.84460904537994 -62.600000000000065
+ vertex 171.0253534737069 -116.84460904537994 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9920516018175789 -0.12583171035623705 -1.889253497189432e-16
+ outer loop
+ vertex 186.67554189525936 -89.7376875512249 -62.600000000000065
+ vertex 186.4727638760373 -91.33638042612219 -3.000000000000062
+ vertex 186.4727638760373 -91.33638042612219 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9920516018175789 -0.12583171035623705 -1.889253497189432e-16
+ outer loop
+ vertex 186.4727638760373 -91.33638042612219 -3.000000000000062
+ vertex 186.67554189525936 -89.7376875512249 -62.600000000000065
+ vertex 186.67554189525939 -89.7376875512249 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.8925949547301319e-16
+ outer loop
+ vertex 94.73693564691284 -100.48202726980834 -3.0000000000000284
+ vertex 93.58223510853358 -102.48202726980831 -62.60000000000003
+ vertex 93.5822351085336 -102.48202726980831 -3.0000000000000284
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.8925949547301319e-16
+ outer loop
+ vertex 93.58223510853358 -102.48202726980831 -62.60000000000003
+ vertex 94.73693564691284 -100.48202726980834 -3.0000000000000284
+ vertex 94.73693564691283 -100.48202726980833 -62.60000000000003
+ endloop
+endfacet
+facet normal 0.3882711944089259 -0.92154515873736 -9.106128389727811e-17
+ outer loop
+ vertex 164.0622132844704 -120.87092025637166 -62.600000000000065
+ vertex 162.5771416647378 -121.49661995877844 -3.000000000000062
+ vertex 162.5771416647378 -121.49661995877844 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.3882711944089259 -0.92154515873736 -9.106128389727811e-17
+ outer loop
+ vertex 162.5771416647378 -121.49661995877844 -3.000000000000062
+ vertex 164.0622132844704 -120.87092025637166 -62.600000000000065
+ vertex 164.0622132844704 -120.87092025637168 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.6049992586789495 -0.7962260338609393 -1.2933581127401553e-16
+ outer loop
+ vertex 172.3084731066061 -115.86965169195585 -62.600000000000065
+ vertex 171.0253534737069 -116.84460904537994 -3.000000000000062
+ vertex 171.02535347370687 -116.84460904537994 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.6049992586789495 -0.7962260338609393 -1.2933581127401553e-16
+ outer loop
+ vertex 171.0253534737069 -116.84460904537994 -3.000000000000062
+ vertex 172.3084731066061 -115.86965169195585 -62.600000000000065
+ vertex 172.3084731066061 -115.86965169195585 -3.000000000000062
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 1.64546565764282e-16
+ outer loop
+ vertex 150.02753457015433 -121.17248787278362 -3.0000000000000733
+ vertex 150.02753457015433 -124.17799915024115 -62.600000000000065
+ vertex 150.02753457015433 -124.17799915024115 -3.000000000000062
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 1.64546565764282e-16
+ outer loop
+ vertex 150.02753457015433 -124.17799915024115 -62.600000000000065
+ vertex 150.02753457015433 -121.17248787278362 -3.0000000000000733
+ vertex 150.02753457015433 -121.17248787278362 -62.60000000000008
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 1.64546565764282e-16
+ outer loop
+ vertex 150.02753457015433 -121.17248787278362 -62.60000000000008
+ vertex 150.02753457015433 -121.17248787278362 -3.0000000000000733
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 1.64546565764282e-16
+ outer loop
+ vertex 150.02753457015433 -121.17248787278362 -62.60000000000008
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 150.02753457015433 -104.48202726980836 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.866025403784438 0.5000000000000009 -1.5295647765012086e-16
+ outer loop
+ vertex 166.9703225694756 -80.33241005582238 -3.000000000000062
+ vertex 168.16311056879684 -82.39837947330521 -62.600000000000065
+ vertex 166.97032256947557 -80.33241005582236 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.866025403784438 0.5000000000000009 -1.5295647765012086e-16
+ outer loop
+ vertex 168.16311056879684 -82.39837947330521 -62.600000000000065
+ vertex 166.9703225694756 -80.33241005582238 -3.000000000000062
+ vertex 168.16311056879687 -82.39837947330521 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.8553779590758183 -0.518004389100409 -1.7093417315095026e-16
+ outer loop
+ vertex 181.72757876430887 -104.95226070173364 -62.600000000000065
+ vertex 180.8928137939151 -106.33070376458772 -3.000000000000062
+ vertex 180.8928137939151 -106.33070376458772 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.8553779590758183 -0.518004389100409 -1.7093417315095026e-16
+ outer loop
+ vertex 180.8928137939151 -106.33070376458772 -3.000000000000062
+ vertex 181.72757876430887 -104.95226070173364 -62.600000000000065
+ vertex 181.7275787643089 -104.95226070173364 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9684976081015065 -0.2490228565848135 -1.8691607490093722e-16
+ outer loop
+ vertex 185.8676261536738 -94.50134729088121 -62.600000000000065
+ vertex 185.4663253888957 -96.06208286410164 -3.000000000000062
+ vertex 185.46632538889568 -96.06208286410163 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9684976081015065 -0.2490228565848135 -1.8691607490093722e-16
+ outer loop
+ vertex 185.4663253888957 -96.06208286410164 -3.000000000000062
+ vertex 185.8676261536738 -94.50134729088121 -62.600000000000065
+ vertex 185.8676261536738 -94.50134729088121 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.22935485323248694 -0.9733428744788264 -6.220955760198338e-17
+ outer loop
+ vertex 157.98331987988098 -122.99394536419275 -3.000000000000062
+ vertex 156.41477615149986 -123.36355110749695 -62.600000000000065
+ vertex 157.98331987988098 -122.99394536419275 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.22935485323248694 -0.9733428744788264 -6.220955760198338e-17
+ outer loop
+ vertex 156.41477615149986 -123.36355110749695 -62.600000000000065
+ vertex 157.98331987988098 -122.99394536419275 -3.000000000000062
+ vertex 156.4147761514999 -123.36355110749695 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.996446235550411 -0.08423122732938658 -1.8893488826187043e-16
+ outer loop
+ vertex 186.81128066401757 -88.13191271645411 -62.600000000000065
+ vertex 186.67554189525939 -89.7376875512249 -3.000000000000062
+ vertex 186.67554189525936 -89.7376875512249 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.996446235550411 -0.08423122732938658 -1.8893488826187043e-16
+ outer loop
+ vertex 186.67554189525939 -89.7376875512249 -3.000000000000062
+ vertex 186.81128066401757 -88.13191271645411 -62.600000000000065
+ vertex 186.8112806640176 -88.13191271645411 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9659258262890714 0.2588190451025095 -1.7646604060570657e-16
+ outer loop
+ vertex 121.14483512149557 -97.11436699499986 -62.60000000000005
+ vertex 121.32869438638144 -97.80053911299613 -3.000000000000051
+ vertex 121.32869438638143 -97.80053911299612 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9659258262890714 0.2588190451025095 -1.7646604060570657e-16
+ outer loop
+ vertex 121.32869438638144 -97.80053911299613 -3.000000000000051
+ vertex 121.14483512149557 -97.11436699499986 -62.60000000000005
+ vertex 121.14483512149559 -97.11436699499987 -3.000000000000051
+ endloop
+endfacet
+facet normal -0.0871557427476704 -0.9961946980917445 -3.169954360194482e-18
+ outer loop
+ vertex 146.74991289470114 -56.22115326457817 -3.000000000000062
+ vertex 146.042238446703 -56.15923977291135 -62.600000000000065
+ vertex 146.74991289470114 -56.22115326457817 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.0871557427476704 -0.9961946980917445 -3.169954360194482e-18
+ outer loop
+ vertex 146.042238446703 -56.15923977291135 -62.600000000000065
+ vertex 146.74991289470114 -56.22115326457817 -3.000000000000062
+ vertex 146.042238446703 -56.159239772911356 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9964286670416539 -0.08443880326954645 -1.889356600540168e-16
+ outer loop
+ vertex 121.13921260616522 -95.74242516819551 -62.600000000000065
+ vertex 121.08292162982879 -96.40669254700173 -3.000000000000051
+ vertex 121.08292162982877 -96.40669254700171 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9964286670416539 -0.08443880326954645 -1.889356600540168e-16
+ outer loop
+ vertex 121.08292162982879 -96.40669254700173 -3.000000000000051
+ vertex 121.13921260616522 -95.74242516819551 -62.600000000000065
+ vertex 121.13921260616522 -95.74242516819551 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.819152044288985 0.5735764363510556 -1.4270266531245705e-16
+ outer loop
+ vertex 121.62891295376006 -98.44435990840503 -62.60000000000005
+ vertex 122.03636883437957 -99.02626721214715 -3.000000000000051
+ vertex 122.03636883437957 -99.02626721214713 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.819152044288985 0.5735764363510556 -1.4270266531245705e-16
+ outer loop
+ vertex 122.03636883437957 -99.02626721214715 -3.000000000000051
+ vertex 121.62891295376006 -98.44435990840503 -62.60000000000005
+ vertex 121.62891295376006 -98.44435990840505 -3.000000000000051
+ endloop
+endfacet
+facet normal 0.57357643635105 -0.819152044288989 -1.2387983536035098e-16
+ outer loop
+ vertex 144.00457108529966 -56.70523109684263 -62.600000000000065
+ vertex 143.42266378155756 -57.11268697746216 -3.000000000000062
+ vertex 143.42266378155756 -57.11268697746215 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.57357643635105 -0.819152044288989 -1.2387983536035098e-16
+ outer loop
+ vertex 143.42266378155756 -57.11268697746216 -3.000000000000062
+ vertex 144.00457108529966 -56.70523109684263 -62.600000000000065
+ vertex 144.0045710852997 -56.70523109684263 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9063077870366479 0.42261826174070405 -1.6204619883521917e-16
+ outer loop
+ vertex 121.32869438638143 -97.80053911299612 -62.60000000000005
+ vertex 121.62891295376006 -98.44435990840505 -3.000000000000051
+ vertex 121.62891295376006 -98.44435990840503 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9063077870366479 0.42261826174070405 -1.6204619883521917e-16
+ outer loop
+ vertex 121.62891295376006 -98.44435990840505 -3.000000000000051
+ vertex 121.32869438638143 -97.80053911299612 -62.60000000000005
+ vertex 121.32869438638144 -97.80053911299613 -3.000000000000051
+ endloop
+endfacet
+facet normal 0.9091671933849138 -0.41643128421457354 -1.790504190202131e-16
+ outer loop
+ vertex 121.62891295376006 -94.3690251855984 -62.600000000000044
+ vertex 121.33566537762498 -95.00925344381994 -3.000000000000062
+ vertex 121.33566537762498 -95.00925344381994 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9091671933849138 -0.41643128421457354 -1.790504190202131e-16
+ outer loop
+ vertex 121.33566537762498 -95.00925344381994 -3.000000000000062
+ vertex 121.62891295376006 -94.3690251855984 -62.600000000000044
+ vertex 121.62891295376006 -94.3690251855984 -3.000000000000051
+ endloop
+endfacet
+facet normal 0.2588190451025147 0.9659258262890701 -2.96881605212334e-17
+ outer loop
+ vertex 123.764409786641 -100.23625451325569 -62.60000000000005
+ vertex 124.45058190463727 -100.42011377814154 -3.000000000000051
+ vertex 124.45058190463727 -100.42011377814154 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.2588190451025147 0.9659258262890701 -2.96881605212334e-17
+ outer loop
+ vertex 124.45058190463727 -100.42011377814154 -3.000000000000051
+ vertex 123.764409786641 -100.23625451325569 -62.60000000000005
+ vertex 123.76440978664102 -100.2362545132557 -3.000000000000051
+ endloop
+endfacet
+facet normal -0.5735764363510415 -0.8191520442889951 9.172724251549031e-17
+ outer loop
+ vertex 148.66181311184843 -57.11268697746215 -3.000000000000062
+ vertex 148.0799058081063 -56.70523109684263 -62.600000000000065
+ vertex 148.66181311184843 -57.11268697746215 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.5735764363510415 -0.8191520442889951 9.172724251549031e-17
+ outer loop
+ vertex 148.0799058081063 -56.70523109684263 -62.600000000000065
+ vertex 148.66181311184843 -57.11268697746215 -3.000000000000062
+ vertex 148.0799058081063 -56.705231096842645 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9637952185786789 -0.2666435385395205 -1.8637807733403893e-16
+ outer loop
+ vertex 121.33566537762498 -95.00925344381994 -62.600000000000065
+ vertex 121.14483512149559 -95.69901809900358 -3.000000000000051
+ vertex 121.14483512149557 -95.69901809900358 -62.600000000000044
+ endloop
+endfacet
+facet normal 0.9637952185786789 -0.2666435385395205 -1.8637807733403893e-16
+ outer loop
+ vertex 121.14483512149559 -95.69901809900358 -3.000000000000051
+ vertex 121.33566537762498 -95.00925344381994 -62.600000000000065
+ vertex 121.33566537762498 -95.00925344381994 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.4226182617407051 0.9063077870366475 -6.164421566816344e-17
+ outer loop
+ vertex 123.12058899123208 -99.93603594587707 -62.60000000000005
+ vertex 123.76440978664102 -100.2362545132557 -3.000000000000051
+ vertex 123.764409786641 -100.23625451325569 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.4226182617407051 0.9063077870366475 -6.164421566816344e-17
+ outer loop
+ vertex 123.76440978664102 -100.2362545132557 -3.000000000000051
+ vertex 123.12058899123208 -99.93603594587707 -62.60000000000005
+ vertex 123.12058899123211 -99.93603594587707 -3.000000000000051
+ endloop
+endfacet
+facet normal -0.8660254037844387 -0.5000000000000003 1.5295647765012099e-16
+ outer loop
+ vertex 162.26899907810125 -80.1894789059449 -3.000000000000062
+ vertex 149.57158184557838 -58.19690713431467 -62.600000000000065
+ vertex 162.26899907810125 -80.18947890594488 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844387 -0.5000000000000003 1.5295647765012099e-16
+ outer loop
+ vertex 149.57158184557838 -58.19690713431467 -62.600000000000065
+ vertex 162.26899907810125 -80.1894789059449 -3.000000000000062
+ vertex 149.57158184557838 -58.19690713431467 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.7071067811865523 0.7071067811865427 -1.1902318351521227e-16
+ outer loop
+ vertex 122.03636883437957 -99.02626721214713 -62.60000000000005
+ vertex 122.53868168748998 -99.52858006525757 -3.000000000000051
+ vertex 122.53868168748998 -99.52858006525756 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7071067811865523 0.7071067811865427 -1.1902318351521227e-16
+ outer loop
+ vertex 122.53868168748998 -99.52858006525757 -3.000000000000051
+ vertex 122.03636883437957 -99.02626721214713 -62.60000000000005
+ vertex 122.03636883437957 -99.02626721214715 -3.000000000000051
+ endloop
+endfacet
+facet normal 0.9917151050050453 -0.12845680404257295 -1.8891362409815973e-16
+ outer loop
+ vertex 121.14483512149557 -95.69901809900358 -62.600000000000044
+ vertex 121.13921260616522 -95.74242516819551 -3.000000000000062
+ vertex 121.13921260616522 -95.74242516819551 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9917151050050453 -0.12845680404257295 -1.8891362409815973e-16
+ outer loop
+ vertex 121.13921260616522 -95.74242516819551 -3.000000000000062
+ vertex 121.14483512149557 -95.69901809900358 -62.600000000000044
+ vertex 121.14483512149559 -95.69901809900358 -3.000000000000051
+ endloop
+endfacet
+facet normal 0.258819045102526 -0.9659258262890669 -6.760178110917338e-17
+ outer loop
+ vertex 145.33456399870488 -56.221153264578156 -62.600000000000065
+ vertex 144.6483918807086 -56.405012529464024 -3.000000000000062
+ vertex 144.6483918807086 -56.40501252946401 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.258819045102526 -0.9659258262890669 -6.760178110917338e-17
+ outer loop
+ vertex 144.6483918807086 -56.405012529464024 -3.000000000000062
+ vertex 145.33456399870488 -56.221153264578156 -62.600000000000065
+ vertex 145.33456399870488 -56.221153264578156 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.7071067811865454 -0.7071067811865499 -1.4677788008447083e-16
+ outer loop
+ vertex 143.42266378155756 -57.11268697746215 -62.600000000000065
+ vertex 142.9203509284472 -57.61499983057255 -3.000000000000062
+ vertex 142.92035092844716 -57.61499983057255 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.7071067811865454 -0.7071067811865499 -1.4677788008447083e-16
+ outer loop
+ vertex 142.9203509284472 -57.61499983057255 -3.000000000000062
+ vertex 143.42266378155756 -57.11268697746215 -62.600000000000065
+ vertex 143.42266378155756 -57.11268697746216 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.5735764363510415 0.8191520442889951 -9.172724251549031e-17
+ outer loop
+ vertex 122.53868168748998 -99.52858006525756 -62.60000000000005
+ vertex 123.12058899123211 -99.93603594587707 -3.000000000000051
+ vertex 123.12058899123208 -99.93603594587707 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.5735764363510415 0.8191520442889951 -9.172724251549031e-17
+ outer loop
+ vertex 123.12058899123211 -99.93603594587707 -3.000000000000051
+ vertex 122.53868168748998 -99.52858006525756 -62.60000000000005
+ vertex 122.53868168748998 -99.52858006525757 -3.000000000000051
+ endloop
+endfacet
+facet normal 0.9932753778753307 0.11577574748892414 -1.8441368268833016e-16
+ outer loop
+ vertex 121.07305832758563 -96.49857203241152 -62.600000000000065
+ vertex 121.14483512149559 -97.11436699499987 -3.000000000000051
+ vertex 121.14483512149557 -97.11436699499986 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9932753778753307 0.11577574748892414 -1.8441368268833016e-16
+ outer loop
+ vertex 121.14483512149559 -97.11436699499987 -3.000000000000051
+ vertex 121.07305832758563 -96.49857203241152 -62.600000000000065
+ vertex 121.07305832758566 -96.49857203241152 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.0871557427476704 0.9961946980917445 3.169954360194482e-18
+ outer loop
+ vertex 124.45058190463727 -100.42011377814154 -62.60000000000005
+ vertex 125.15825635263542 -100.48202726980836 -3.000000000000051
+ vertex 125.1582563526354 -100.48202726980834 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.0871557427476704 0.9961946980917445 3.169954360194482e-18
+ outer loop
+ vertex 125.15825635263542 -100.48202726980836 -3.000000000000051
+ vertex 124.45058190463727 -100.42011377814154 -62.60000000000005
+ vertex 124.45058190463727 -100.42011377814154 -3.000000000000051
+ endloop
+endfacet
+facet normal 0.9942872710787393 -0.10673716583643095 -1.8897080252742161e-16
+ outer loop
+ vertex 121.08292162982877 -96.40669254700171 -62.60000000000005
+ vertex 121.07305832758566 -96.49857203241152 -3.000000000000062
+ vertex 121.07305832758563 -96.49857203241152 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9942872710787393 -0.10673716583643095 -1.8897080252742161e-16
+ outer loop
+ vertex 121.07305832758566 -96.49857203241152 -3.000000000000062
+ vertex 121.08292162982877 -96.40669254700171 -62.60000000000005
+ vertex 121.08292162982879 -96.40669254700173 -3.000000000000051
+ endloop
+endfacet
+facet normal -0.819152044288985 -0.5735764363510556 1.4270266531245705e-16
+ outer loop
+ vertex 149.57158184557838 -58.19690713431467 -3.000000000000062
+ vertex 149.16412596495886 -57.614999830572565 -62.600000000000065
+ vertex 149.57158184557838 -58.19690713431467 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.819152044288985 -0.5735764363510556 1.4270266531245705e-16
+ outer loop
+ vertex 149.16412596495886 -57.614999830572565 -62.600000000000065
+ vertex 149.57158184557838 -58.19690713431467 -3.000000000000062
+ vertex 149.16412596495886 -57.614999830572565 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.978339619447619 0.2070062535748331 -1.7981606344395135e-16
+ outer loop
+ vertex 185.87924330029884 -76.9295518108256 -62.600000000000065
+ vertex 186.2128342365394 -78.50614780237996 -3.000000000000062
+ vertex 186.2128342365394 -78.50614780237994 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.978339619447619 0.2070062535748331 -1.7981606344395135e-16
+ outer loop
+ vertex 186.2128342365394 -78.50614780237996 -3.000000000000062
+ vertex 185.87924330029884 -76.9295518108256 -62.600000000000065
+ vertex 185.87924330029887 -76.9295518108256 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9301944916753149 0.3670670342824357 -1.676259211423381e-16
+ outer loop
+ vertex 183.89597471679528 -70.80363748245898 -3.000000000000062
+ vertex 184.48750387842546 -72.30264751720463 -62.600000000000065
+ vertex 183.89597471679528 -70.80363748245898 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9301944916753149 0.3670670342824357 -1.676259211423381e-16
+ outer loop
+ vertex 184.48750387842546 -72.30264751720463 -62.600000000000065
+ vertex 183.89597471679528 -70.80363748245898 -3.000000000000062
+ vertex 184.48750387842546 -72.30264751720465 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9688260316082282 0.24774204422796836 -1.7722852548447566e-16
+ outer loop
+ vertex 185.4800065668526 -75.36828698255519 -62.600000000000065
+ vertex 185.87924330029887 -76.9295518108256 -3.000000000000062
+ vertex 185.87924330029884 -76.9295518108256 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9688260316082282 0.24774204422796836 -1.7722852548447566e-16
+ outer loop
+ vertex 185.87924330029887 -76.9295518108256 -3.000000000000062
+ vertex 185.4800065668526 -75.36828698255519 -62.600000000000065
+ vertex 185.4800065668526 -75.36828698255519 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 139.5052590600145 -40.76152462432976 -41.30000000000007
+ vertex 134.36092149271707 -31.851270586485388 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 139.5052590600145 -40.76152462432976 -41.30000000000007
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 139.65510969377144 -41.0210735355432 -40.57645713530763
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 139.65510969377144 -41.0210735355432 -40.57645713530763
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 134.36092149271707 -31.851270586485388 -62.600000000000065
+ vertex 139.5052590600145 -40.76152462432976 -41.30000000000007
+ vertex 139.26688112611765 -40.348641931417156 -41.921320343559714
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 134.36092149271707 -31.851270586485388 -62.600000000000065
+ vertex 139.26688112611765 -40.348641931417156 -41.921320343559714
+ vertex 138.95622095433782 -39.81056273000644 -42.398076211353384
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 134.36092149271707 -31.851270586485388 -62.600000000000065
+ vertex 138.95622095433782 -39.81056273000644 -42.398076211353384
+ vertex 138.5944495219916 -39.18395622845583 -42.69777747886727
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 134.36092149271707 -31.851270586485388 -62.600000000000065
+ vertex 138.5944495219916 -39.18395622845583 -42.69777747886727
+ vertex 138.20622095433785 -38.51152462432976 -42.80000000000007
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 139.65510969377144 -41.0210735355432 -40.57645713530763
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 139.70622095433785 -41.10960083568308 -39.80000000000007
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 139.70622095433785 -41.10960083568308 -39.80000000000007
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 139.70622095433788 -41.109600835683096 -25.800000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 139.70622095433788 -41.109600835683096 -25.800000000000065
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 139.65510969377144 -41.0210735355432 -25.0235428646925
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 139.65510969377144 -41.0210735355432 -25.0235428646925
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 139.5052590600145 -40.76152462432976 -24.30000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 139.5052590600145 -40.76152462432976 -24.30000000000006
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 139.26688112611768 -40.34864193141716 -23.678679656440423
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 139.26688112611768 -40.34864193141716 -23.678679656440423
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 138.95622095433782 -39.81056273000644 -23.20192378864675
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 138.95622095433782 -39.81056273000644 -23.20192378864675
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 138.59444952199163 -39.183956228455806 -22.90222252113286
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 138.59444952199163 -39.183956228455806 -22.90222252113286
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 138.20622095433785 -38.51152462432976 -22.800000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 134.36092149271707 -31.851270586485388 -62.600000000000065
+ vertex 136.70622095433785 -35.913448412976436 -39.80000000000007
+ vertex 134.36092149271707 -31.851270586485402 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 136.70622095433785 -35.913448412976436 -39.80000000000007
+ vertex 134.36092149271707 -31.851270586485388 -62.600000000000065
+ vertex 136.75733221490424 -36.00197571311632 -40.57645713530763
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 136.75733221490424 -36.00197571311632 -40.57645713530763
+ vertex 134.36092149271707 -31.851270586485388 -62.600000000000065
+ vertex 136.90718284866117 -36.261524624329745 -41.30000000000007
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 136.90718284866117 -36.261524624329745 -41.30000000000007
+ vertex 134.36092149271707 -31.851270586485388 -62.600000000000065
+ vertex 137.14556078255802 -36.674407317242355 -41.921320343559714
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 137.14556078255802 -36.674407317242355 -41.921320343559714
+ vertex 134.36092149271707 -31.851270586485388 -62.600000000000065
+ vertex 137.45622095433782 -37.2124865186531 -42.398076211353384
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 137.45622095433782 -37.2124865186531 -42.398076211353384
+ vertex 134.36092149271707 -31.851270586485388 -62.600000000000065
+ vertex 137.81799238668404 -37.83909302020373 -42.69777747886727
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 137.81799238668404 -37.83909302020373 -42.69777747886727
+ vertex 134.36092149271707 -31.851270586485388 -62.600000000000065
+ vertex 138.20622095433785 -38.51152462432976 -42.80000000000007
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 134.36092149271707 -31.851270586485402 -3.000000000000062
+ vertex 136.70622095433785 -35.913448412976436 -39.80000000000007
+ vertex 136.70622095433782 -35.91344841297645 -25.800000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 134.36092149271707 -31.851270586485402 -3.000000000000062
+ vertex 136.70622095433782 -35.91344841297645 -25.800000000000065
+ vertex 136.75733221490424 -36.00197571311634 -25.0235428646925
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 134.36092149271707 -31.851270586485402 -3.000000000000062
+ vertex 136.75733221490424 -36.00197571311634 -25.0235428646925
+ vertex 136.90718284866117 -36.261524624329766 -24.300000000000068
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 134.36092149271707 -31.851270586485402 -3.000000000000062
+ vertex 136.90718284866117 -36.261524624329766 -24.300000000000068
+ vertex 137.14556078255802 -36.674407317242384 -23.678679656440423
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 134.36092149271707 -31.851270586485402 -3.000000000000062
+ vertex 137.14556078255802 -36.674407317242384 -23.678679656440423
+ vertex 137.45622095433782 -37.2124865186531 -23.20192378864675
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 134.36092149271707 -31.851270586485402 -3.000000000000062
+ vertex 137.45622095433782 -37.2124865186531 -23.20192378864675
+ vertex 137.81799238668407 -37.83909302020372 -22.90222252113286
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 134.36092149271707 -31.851270586485402 -3.000000000000062
+ vertex 137.81799238668407 -37.83909302020372 -22.90222252113286
+ vertex 138.20622095433785 -38.51152462432976 -22.800000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844385 -0.5000000000000006 1.5295647765012091e-16
+ outer loop
+ vertex 134.36092149271707 -31.851270586485402 -3.000000000000062
+ vertex 138.20622095433785 -38.51152462432976 -22.800000000000065
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 123.15084234181414 -83.13296615995655 -26.800000000000054
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 123.15084234181414 -83.13296615995655 -26.800000000000054
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 123.58687472277336 -82.37773592238995 -25.4948628518954
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 123.58687472277336 -82.37773592238995 -25.4948628518954
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 124.1043540774015 -81.48143538830607 -24.314718625761483
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 124.1043540774015 -81.48143538830607 -24.314718625761483
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 124.69442619046845 -80.45940050834457 -23.279759916505228
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 124.69442619046845 -80.45940050834457 -23.279759916505228
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 125.34699476452077 -79.32911858266316 -22.40769515458679
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 125.34699476452077 -79.32911858266316 -22.40769515458679
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 123.15084234181414 -83.13296615995655 -26.800000000000054
+ vertex 122.80371756945306 -83.73420390225172 -28.207798811618975
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 122.80371756945306 -83.73420390225172 -28.207798811618975
+ vertex 122.55143980678636 -84.17116180481023 -29.6941714587698
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 122.55143980678636 -84.17116180481023 -29.6941714587698
+ vertex 122.39832559627791 -84.43636339677167 -31.233685693359433
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 122.39832559627791 -84.43636339677167 -31.233685693359433
+ vertex 122.34699476452076 -84.5252710053698 -32.800000000000054
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 125.34699476452077 -79.32911858266316 -22.40769515458679
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 126.05089417033024 -78.10992904838363 -21.71344560986461
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 126.05089417033024 -78.10992904838363 -21.71344560986461
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 126.79408049390564 -76.82269257646071 -21.208890084531234
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 126.79408049390564 -76.82269257646071 -21.208890084531234
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 127.56383761120046 -75.48943413981834 -20.90266166351433
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 127.56383761120046 -75.48943413981834 -20.90266166351433
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 128.34699476452076 -74.13296615995655 -20.80000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 128.34699476452076 -74.13296615995655 -20.80000000000005
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 129.1301519178411 -72.77649818009475 -20.90266166351433
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 129.1301519178411 -72.77649818009475 -20.90266166351433
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 129.89990903513592 -71.4432397434524 -21.208890084531237
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 129.89990903513592 -71.4432397434524 -21.208890084531237
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 130.64309535871132 -70.15600327152943 -21.71344560986461
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 130.64309535871132 -70.15600327152943 -21.71344560986461
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 131.3469947645208 -68.9368137372499 -22.407695154586794
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 131.3469947645208 -68.9368137372499 -22.407695154586794
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 131.9995633385731 -67.8065318115685 -23.279759916505235
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 131.9995633385731 -67.8065318115685 -23.279759916505235
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 132.58963545164005 -66.78449693160701 -24.314718625761483
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 132.58963545164005 -66.78449693160701 -24.314718625761483
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 133.10711480626819 -65.88819639752313 -25.494862851895416
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 133.10711480626819 -65.88819639752313 -25.494862851895416
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 133.5431471872274 -65.13296615995654 -26.800000000000058
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 133.5431471872274 -65.13296615995654 -26.800000000000058
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 133.8902719595885 -64.53172841766136 -28.207798811618986
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 133.8902719595885 -64.53172841766136 -28.207798811618986
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 134.14254972225518 -64.09477051510284 -29.69417145876981
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 134.14254972225518 -64.09477051510284 -29.69417145876981
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 134.29566393276363 -63.829568923141416 -31.233685693359437
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 134.29566393276363 -63.829568923141416 -31.233685693359437
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 134.3469947645208 -63.74066131454328 -32.800000000000054
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 125.34699476452076 -79.32911858266318 -43.19230484541332
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 125.34699476452076 -79.32911858266318 -43.19230484541332
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 124.69442619046845 -80.45940050834457 -42.32024008349487
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 124.69442619046845 -80.45940050834457 -42.32024008349487
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 124.1043540774015 -81.48143538830607 -41.28528137423862
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 124.1043540774015 -81.48143538830607 -41.28528137423862
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 123.58687472277336 -82.37773592238995 -40.105137148104696
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 123.58687472277336 -82.37773592238995 -40.105137148104696
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 123.15084234181414 -83.13296615995655 -38.800000000000054
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 123.15084234181414 -83.13296615995655 -38.800000000000054
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 122.80371756945306 -83.73420390225172 -37.39220118838113
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 122.80371756945306 -83.73420390225172 -37.39220118838113
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 122.55143980678636 -84.17116180481023 -35.9058285412303
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 122.55143980678636 -84.17116180481023 -35.9058285412303
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 122.39832559627791 -84.43636339677167 -34.36631430664067
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 122.39832559627791 -84.43636339677167 -34.36631430664067
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 122.34699476452076 -84.5252710053698 -32.800000000000054
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 125.34699476452076 -79.32911858266318 -43.19230484541332
+ vertex 126.05089417033024 -78.10992904838363 -43.8865543901355
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 126.05089417033024 -78.10992904838363 -43.8865543901355
+ vertex 126.79408049390564 -76.82269257646071 -44.391109915468874
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 126.79408049390564 -76.82269257646071 -44.391109915468874
+ vertex 127.56383761120046 -75.48943413981834 -44.69733833648578
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 127.56383761120046 -75.48943413981834 -44.69733833648578
+ vertex 128.34699476452076 -74.13296615995655 -44.800000000000054
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 128.34699476452076 -74.13296615995655 -44.800000000000054
+ vertex 129.1301519178411 -72.77649818009475 -44.69733833648578
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 129.1301519178411 -72.77649818009475 -44.69733833648578
+ vertex 129.89990903513592 -71.4432397434524 -44.391109915468874
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 129.89990903513592 -71.4432397434524 -44.391109915468874
+ vertex 130.6430953587113 -70.15600327152946 -43.8865543901355
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 130.6430953587113 -70.15600327152946 -43.8865543901355
+ vertex 131.34699476452076 -68.93681373724992 -43.192304845413325
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 131.34699476452076 -68.93681373724992 -43.192304845413325
+ vertex 131.9995633385731 -67.8065318115685 -42.32024008349488
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 131.9995633385731 -67.8065318115685 -42.32024008349488
+ vertex 132.58963545164005 -66.78449693160701 -41.285281374238636
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 132.58963545164005 -66.78449693160701 -41.285281374238636
+ vertex 133.10711480626819 -65.88819639752316 -40.10513714810471
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 133.10711480626819 -65.88819639752316 -40.10513714810471
+ vertex 133.5431471872274 -65.13296615995654 -38.80000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 133.5431471872274 -65.13296615995654 -38.80000000000006
+ vertex 133.8902719595885 -64.53172841766136 -37.392201188381144
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 133.8902719595885 -64.53172841766136 -37.392201188381144
+ vertex 134.14254972225518 -64.09477051510284 -35.905828541230306
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 134.14254972225518 -64.09477051510284 -35.905828541230306
+ vertex 134.29566393276363 -63.829568923141416 -34.36631430664068
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 134.29566393276363 -63.829568923141416 -34.36631430664068
+ vertex 134.3469947645208 -63.74066131454328 -32.800000000000054
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 1.7258201180401962e-16
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 134.3469947645208 -63.74066131454328 -32.800000000000054
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9576170825074782 0.28804430785881835 -1.74330853025398e-16
+ outer loop
+ vertex 185.01582266574817 -73.8250853951783 -3.000000000000062
+ vertex 185.4800065668526 -75.36828698255519 -62.600000000000065
+ vertex 185.01582266574815 -73.8250853951783 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9576170825074782 0.28804430785881835 -1.74330853025398e-16
+ outer loop
+ vertex 185.4800065668526 -75.36828698255519 -62.600000000000065
+ vertex 185.01582266574817 -73.8250853951783 -3.000000000000062
+ vertex 185.4800065668526 -75.36828698255519 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9861411980746715 0.16590821998879904 -1.8208893893752738e-16
+ outer loop
+ vertex 186.2128342365394 -78.50614780237994 -62.600000000000065
+ vertex 186.48019562046042 -80.09531605140675 -3.000000000000062
+ vertex 186.4801956204604 -80.09531605140675 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9861411980746715 0.16590821998879904 -1.8208893893752738e-16
+ outer loop
+ vertex 186.48019562046042 -80.09531605140675 -3.000000000000062
+ vertex 186.2128342365394 -78.50614780237994 -62.600000000000065
+ vertex 186.2128342365394 -78.50614780237996 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9965567391136535 0.08291360399332269 -1.8567535078147368e-16
+ outer loop
+ vertex 186.68085959290207 -81.69427565173784 -62.600000000000065
+ vertex 186.81447500937168 -83.3002285631922 -3.000000000000062
+ vertex 186.81447500937168 -83.3002285631922 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9965567391136535 0.08291360399332269 -1.8567535078147368e-16
+ outer loop
+ vertex 186.81447500937168 -83.3002285631922 -3.000000000000062
+ vertex 186.68085959290207 -81.69427565173784 -62.600000000000065
+ vertex 186.6808595929021 -81.69427565173785 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9447323868310453 0.32784251901258343 -1.711281167414058e-16
+ outer loop
+ vertex 184.48750387842546 -72.30264751720465 -3.000000000000062
+ vertex 185.01582266574815 -73.8250853951783 -62.600000000000065
+ vertex 184.48750387842546 -72.30264751720463 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9447323868310453 0.32784251901258343 -1.711281167414058e-16
+ outer loop
+ vertex 185.01582266574815 -73.8250853951783 -62.600000000000065
+ vertex 184.48750387842546 -72.30264751720465 -3.000000000000062
+ vertex 185.01582266574817 -73.8250853951783 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 137.8250231078548 -29.851270586485416 -62.600000000000065
+ vertex 145.06150352437308 -42.3852223358721 -55.53185165257819
+ vertex 165.47032256947557 -77.73433384446905 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 145.06150352437308 -42.3852223358721 -55.53185165257819
+ vertex 137.8250231078548 -29.851270586485416 -62.600000000000065
+ vertex 144.8203225694756 -41.96748466817171 -55.332050807568926
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 144.8203225694756 -41.96748466817171 -55.332050807568926
+ vertex 137.8250231078548 -29.851270586485416 -62.600000000000065
+ vertex 144.61321578828904 -41.60876520056452 -55.01421356237315
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 144.61321578828904 -41.60876520056452 -55.01421356237315
+ vertex 137.8250231078548 -29.851270586485416 -62.600000000000065
+ vertex 144.45429716569112 -41.33351007195612 -54.600000000000044
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 144.45429716569112 -41.33351007195612 -54.600000000000044
+ vertex 137.8250231078548 -29.851270586485416 -62.600000000000065
+ vertex 140.3712844637989 -34.26152462432978 -41.30000000000007
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 140.3712844637989 -34.26152462432978 -41.30000000000007
+ vertex 137.8250231078548 -29.851270586485416 -62.600000000000065
+ vertex 140.22143383004197 -34.00197571311636 -40.57645713530763
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 140.22143383004197 -34.00197571311636 -40.57645713530763
+ vertex 137.8250231078548 -29.851270586485416 -62.600000000000065
+ vertex 140.1703225694756 -33.913448412976464 -39.80000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 140.1703225694756 -33.913448412976464 -39.80000000000006
+ vertex 137.8250231078548 -29.851270586485416 -62.600000000000065
+ vertex 137.82502310785483 -29.851270586485416 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446905 -62.600000000000065
+ vertex 145.06150352437308 -42.3852223358721 -55.53185165257819
+ vertex 145.3203225694756 -42.83351007195611 -55.60000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446905 -62.600000000000065
+ vertex 145.3203225694756 -42.83351007195611 -55.60000000000006
+ vertex 157.7203225694756 -64.31094008581022 -55.600000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 144.45429716569112 -41.33351007195612 -54.600000000000044
+ vertex 140.3712844637989 -34.26152462432978 -41.30000000000007
+ vertex 144.35439674318653 -41.160477464480515 -54.11763809020509
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 144.35439674318653 -41.160477464480515 -54.11763809020509
+ vertex 140.3712844637989 -34.26152462432978 -41.30000000000007
+ vertex 144.3203225694756 -41.101459264387245 -53.60000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 144.3203225694756 -41.101459264387245 -53.60000000000005
+ vertex 140.3712844637989 -34.26152462432978 -41.30000000000007
+ vertex 144.32032256947562 -41.101459264387245 -51.600000000000044
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 144.32032256947562 -41.101459264387245 -51.600000000000044
+ vertex 140.3712844637989 -34.26152462432978 -41.30000000000007
+ vertex 140.60966239769576 -34.6744073172424 -41.921320343559714
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 144.32032256947562 -41.101459264387245 -51.600000000000044
+ vertex 140.60966239769576 -34.6744073172424 -41.921320343559714
+ vertex 144.35439674318653 -41.16047746448053 -51.082361909795
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 144.35439674318653 -41.16047746448053 -51.082361909795
+ vertex 140.60966239769576 -34.6744073172424 -41.921320343559714
+ vertex 144.45429716569112 -41.33351007195612 -50.60000000000003
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 144.45429716569112 -41.33351007195612 -50.60000000000003
+ vertex 140.60966239769576 -34.6744073172424 -41.921320343559714
+ vertex 144.61321578828907 -41.60876520056452 -50.185786437626945
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 144.61321578828907 -41.60876520056452 -50.185786437626945
+ vertex 140.60966239769576 -34.6744073172424 -41.921320343559714
+ vertex 144.8203225694756 -41.96748466817171 -49.86794919243116
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 144.8203225694756 -41.96748466817171 -49.86794919243116
+ vertex 140.60966239769576 -34.6744073172424 -41.921320343559714
+ vertex 145.06150352437308 -42.38522233587211 -49.6681483474219
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 145.06150352437308 -42.38522233587211 -49.6681483474219
+ vertex 140.60966239769576 -34.6744073172424 -41.921320343559714
+ vertex 145.32032256947562 -42.83351007195611 -49.60000000000003
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 145.32032256947562 -42.83351007195611 -49.60000000000003
+ vertex 140.60966239769576 -34.6744073172424 -41.921320343559714
+ vertex 140.92032256947556 -35.21248651865313 -42.398076211353384
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 145.32032256947562 -42.83351007195611 -49.60000000000003
+ vertex 140.92032256947556 -35.21248651865313 -42.398076211353384
+ vertex 141.28209400182178 -35.83909302020376 -42.697777478867266
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 145.32032256947562 -42.83351007195611 -49.60000000000003
+ vertex 141.28209400182178 -35.83909302020376 -42.697777478867266
+ vertex 141.67032256947556 -36.5115246243298 -42.80000000000007
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 140.1703225694756 -33.913448412976464 -39.80000000000006
+ vertex 137.82502310785483 -29.851270586485416 -3.000000000000062
+ vertex 140.17032256947556 -33.913448412976486 -25.800000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 140.17032256947556 -33.913448412976486 -25.800000000000065
+ vertex 137.82502310785483 -29.851270586485416 -3.000000000000062
+ vertex 140.22143383004195 -34.00197571311637 -25.0235428646925
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 140.22143383004195 -34.00197571311637 -25.0235428646925
+ vertex 137.82502310785483 -29.851270586485416 -3.000000000000062
+ vertex 140.3712844637989 -34.2615246243298 -24.300000000000068
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 140.3712844637989 -34.2615246243298 -24.300000000000068
+ vertex 137.82502310785483 -29.851270586485416 -3.000000000000062
+ vertex 140.60966239769573 -34.67440731724242 -23.678679656440423
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 140.60966239769573 -34.67440731724242 -23.678679656440423
+ vertex 137.82502310785483 -29.851270586485416 -3.000000000000062
+ vertex 140.92032256947556 -35.21248651865314 -23.20192378864675
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 140.92032256947556 -35.21248651865314 -23.20192378864675
+ vertex 137.82502310785483 -29.851270586485416 -3.000000000000062
+ vertex 141.2820940018218 -35.83909302020374 -22.90222252113286
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 141.2820940018218 -35.83909302020374 -22.90222252113286
+ vertex 137.82502310785483 -29.851270586485416 -3.000000000000062
+ vertex 141.6703225694756 -36.5115246243298 -22.800000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 141.6703225694756 -36.5115246243298 -22.800000000000065
+ vertex 137.82502310785483 -29.851270586485416 -3.000000000000062
+ vertex 144.61321578828915 -41.60876520056444 -15.41421356237314
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 141.6703225694756 -36.5115246243298 -22.800000000000065
+ vertex 144.61321578828915 -41.60876520056444 -15.41421356237314
+ vertex 144.82032256947574 -41.96748466817159 -15.732050807568926
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 141.6703225694756 -36.5115246243298 -22.800000000000065
+ vertex 144.82032256947574 -41.96748466817159 -15.732050807568926
+ vertex 145.0615035243732 -42.38522233587199 -15.931851652578185
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 141.6703225694756 -36.5115246243298 -22.800000000000065
+ vertex 145.0615035243732 -42.38522233587199 -15.931851652578185
+ vertex 145.3203225694757 -42.833510071956034 -16.00000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 141.6703225694756 -36.5115246243298 -22.800000000000065
+ vertex 145.3203225694757 -42.833510071956034 -16.00000000000005
+ vertex 157.72032256947568 -64.31094008581013 -16.000000000000068
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 144.61321578828915 -41.60876520056444 -15.41421356237314
+ vertex 137.82502310785483 -29.851270586485416 -3.000000000000062
+ vertex 144.45429716569126 -41.33351007195603 -15.000000000000046
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 144.45429716569126 -41.33351007195603 -15.000000000000046
+ vertex 137.82502310785483 -29.851270586485416 -3.000000000000062
+ vertex 144.35439674318667 -41.160477464480415 -14.517638090205088
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 144.35439674318667 -41.160477464480415 -14.517638090205088
+ vertex 137.82502310785483 -29.851270586485416 -3.000000000000062
+ vertex 144.3203225694757 -41.10145926438716 -14.000000000000048
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 144.3203225694757 -41.10145926438716 -14.000000000000048
+ vertex 137.82502310785483 -29.851270586485416 -3.000000000000062
+ vertex 144.3203225694757 -41.10145926438716 -12.000000000000034
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 144.3203225694757 -41.10145926438716 -12.000000000000034
+ vertex 137.82502310785483 -29.851270586485416 -3.000000000000062
+ vertex 144.35439674318664 -41.160477464480415 -11.482361909795
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 144.35439674318664 -41.160477464480415 -11.482361909795
+ vertex 137.82502310785483 -29.851270586485416 -3.000000000000062
+ vertex 144.45429716569126 -41.33351007195603 -11.000000000000036
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 144.45429716569126 -41.33351007195603 -11.000000000000036
+ vertex 137.82502310785483 -29.851270586485416 -3.000000000000062
+ vertex 144.61321578828915 -41.60876520056444 -10.585786437626947
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 144.61321578828915 -41.60876520056444 -10.585786437626947
+ vertex 137.82502310785483 -29.851270586485416 -3.000000000000062
+ vertex 144.82032256947574 -41.9674846681716 -10.267949192431168
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 144.82032256947574 -41.9674846681716 -10.267949192431168
+ vertex 137.82502310785483 -29.851270586485416 -3.000000000000062
+ vertex 145.06150352437322 -42.38522233587199 -10.068148347421902
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 145.06150352437322 -42.38522233587199 -10.068148347421902
+ vertex 137.82502310785483 -29.851270586485416 -3.000000000000062
+ vertex 145.3203225694757 -42.833510071956034 -10.000000000000037
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446905 -62.600000000000065
+ vertex 158.68624839576464 -65.98397269328585 -54.117638090205105
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 158.68624839576464 -65.98397269328585 -54.117638090205105
+ vertex 165.47032256947557 -77.73433384446905 -62.600000000000065
+ vertex 158.58634797326002 -65.81094008581022 -54.60000000000007
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 158.58634797326002 -65.81094008581022 -54.60000000000007
+ vertex 165.47032256947557 -77.73433384446905 -62.600000000000065
+ vertex 158.42742935066212 -65.53568495720181 -55.01421356237316
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 158.42742935066212 -65.53568495720181 -55.01421356237316
+ vertex 165.47032256947557 -77.73433384446905 -62.600000000000065
+ vertex 158.22032256947557 -65.17696548959468 -55.33205080756895
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 158.22032256947557 -65.17696548959468 -55.33205080756895
+ vertex 165.47032256947557 -77.73433384446905 -62.600000000000065
+ vertex 157.97914161457808 -64.75922782189426 -55.531851652578204
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 157.97914161457808 -64.75922782189426 -55.531851652578204
+ vertex 165.47032256947557 -77.73433384446905 -62.600000000000065
+ vertex 157.7203225694756 -64.31094008581022 -55.600000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 158.68624839576464 -65.98397269328585 -54.117638090205105
+ vertex 158.72032256947557 -66.04299089337911 -53.60000000000007
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 158.72032256947557 -66.04299089337911 -53.60000000000007
+ vertex 158.72032256947557 -66.04299089337911 -51.600000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 158.72032256947557 -66.04299089337911 -51.600000000000065
+ vertex 158.68624839576464 -65.98397269328585 -51.08236190979502
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 158.68624839576464 -65.98397269328585 -51.08236190979502
+ vertex 158.58634797326002 -65.81094008581022 -50.60000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 158.58634797326002 -65.81094008581022 -50.60000000000005
+ vertex 158.42742935066212 -65.53568495720182 -50.185786437626966
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 158.42742935066212 -65.53568495720182 -50.185786437626966
+ vertex 158.2203225694756 -65.17696548959469 -49.86794919243118
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 158.2203225694756 -65.17696548959469 -49.86794919243118
+ vertex 157.97914161457808 -64.75922782189426 -49.66814834742192
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 157.97914161457808 -64.75922782189426 -49.66814834742192
+ vertex 157.7203225694756 -64.31094008581023 -49.60000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 157.7203225694756 -64.31094008581023 -49.60000000000006
+ vertex 145.32032256947562 -42.83351007195611 -49.60000000000003
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 145.32032256947562 -42.83351007195611 -49.60000000000003
+ vertex 158.42742935066224 -65.53568495720172 -15.414213562373158
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 158.42742935066224 -65.53568495720172 -15.414213562373158
+ vertex 145.32032256947562 -42.83351007195611 -49.60000000000003
+ vertex 142.7309827412554 -38.348641931417184 -41.921320343559714
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 142.7309827412554 -38.348641931417184 -41.921320343559714
+ vertex 145.32032256947562 -42.83351007195611 -49.60000000000003
+ vertex 142.42032256947556 -37.81056273000646 -42.39807621135338
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 142.42032256947556 -37.81056273000646 -42.39807621135338
+ vertex 145.32032256947562 -42.83351007195611 -49.60000000000003
+ vertex 142.05855113712934 -37.183956228455855 -42.697777478867266
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 142.05855113712934 -37.183956228455855 -42.697777478867266
+ vertex 145.32032256947562 -42.83351007195611 -49.60000000000003
+ vertex 141.67032256947556 -36.5115246243298 -42.80000000000007
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 158.42742935066224 -65.53568495720172 -15.414213562373158
+ vertex 142.7309827412554 -38.348641931417184 -41.921320343559714
+ vertex 142.96936067515222 -38.761524624329795 -41.30000000000007
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 158.42742935066224 -65.53568495720172 -15.414213562373158
+ vertex 142.96936067515222 -38.761524624329795 -41.30000000000007
+ vertex 143.11921130890917 -39.02107353554322 -40.57645713530763
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 158.42742935066224 -65.53568495720172 -15.414213562373158
+ vertex 143.11921130890917 -39.02107353554322 -40.57645713530763
+ vertex 143.1703225694756 -39.109600835683125 -39.80000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 158.42742935066224 -65.53568495720172 -15.414213562373158
+ vertex 143.1703225694756 -39.109600835683125 -39.80000000000006
+ vertex 158.22032256947568 -65.17696548959455 -15.732050807568942
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 158.22032256947568 -65.17696548959455 -15.732050807568942
+ vertex 143.1703225694756 -39.109600835683125 -39.80000000000006
+ vertex 157.97914161457825 -64.75922782189413 -15.931851652578203
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 157.97914161457825 -64.75922782189413 -15.931851652578203
+ vertex 143.1703225694756 -39.109600835683125 -39.80000000000006
+ vertex 143.1703225694756 -39.109600835683125 -25.800000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 157.97914161457825 -64.75922782189413 -15.931851652578203
+ vertex 143.1703225694756 -39.109600835683125 -25.800000000000065
+ vertex 143.11921130890917 -39.02107353554322 -25.0235428646925
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 157.97914161457825 -64.75922782189413 -15.931851652578203
+ vertex 143.11921130890917 -39.02107353554322 -25.0235428646925
+ vertex 142.96936067515222 -38.761524624329795 -24.30000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 157.97914161457825 -64.75922782189413 -15.931851652578203
+ vertex 142.96936067515222 -38.761524624329795 -24.30000000000006
+ vertex 142.7309827412554 -38.348641931417184 -23.678679656440423
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 157.97914161457825 -64.75922782189413 -15.931851652578203
+ vertex 142.7309827412554 -38.348641931417184 -23.678679656440423
+ vertex 142.42032256947556 -37.810562730006474 -23.20192378864675
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 157.97914161457825 -64.75922782189413 -15.931851652578203
+ vertex 142.42032256947556 -37.810562730006474 -23.20192378864675
+ vertex 142.05855113712937 -37.18395622845585 -22.90222252113286
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 157.97914161457825 -64.75922782189413 -15.931851652578203
+ vertex 142.05855113712937 -37.18395622845585 -22.90222252113286
+ vertex 141.6703225694756 -36.5115246243298 -22.800000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 157.97914161457825 -64.75922782189413 -15.931851652578203
+ vertex 141.6703225694756 -36.5115246243298 -22.800000000000065
+ vertex 157.72032256947568 -64.31094008581013 -16.000000000000068
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 158.42742935066224 -65.53568495720172 -15.414213562373158
+ vertex 158.58634797326016 -65.81094008581013 -15.000000000000062
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 158.58634797326016 -65.81094008581013 -15.000000000000062
+ vertex 158.6862483957648 -65.98397269328572 -14.517638090205104
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 158.6862483957648 -65.98397269328572 -14.517638090205104
+ vertex 158.7203225694757 -66.04299089337901 -14.000000000000064
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 158.7203225694757 -66.04299089337901 -14.000000000000064
+ vertex 158.7203225694757 -66.04299089337901 -12.000000000000052
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 158.7203225694757 -66.04299089337901 -12.000000000000052
+ vertex 158.6862483957648 -65.98397269328572 -11.482361909795022
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 158.6862483957648 -65.98397269328572 -11.482361909795022
+ vertex 158.58634797326016 -65.81094008581013 -11.000000000000048
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 158.58634797326016 -65.81094008581013 -11.000000000000048
+ vertex 158.42742935066227 -65.53568495720174 -10.58578643762697
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 158.42742935066227 -65.53568495720174 -10.58578643762697
+ vertex 158.2203225694757 -65.17696548959456 -10.267949192431178
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 158.2203225694757 -65.17696548959456 -10.267949192431178
+ vertex 157.97914161457825 -64.75922782189413 -10.068148347421925
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 157.97914161457825 -64.75922782189413 -10.068148347421925
+ vertex 157.72032256947568 -64.31094008581013 -10.00000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 157.72032256947568 -64.31094008581013 -10.00000000000005
+ vertex 145.3203225694757 -42.833510071956034 -10.000000000000037
+ endloop
+endfacet
+facet normal 0.8660254037844386 0.5000000000000003 -8.065757021836473e-17
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 145.3203225694757 -42.833510071956034 -10.000000000000037
+ vertex 137.82502310785483 -29.851270586485416 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.8962637115698759 0.44352154324563553 -1.5974817945265773e-16
+ outer loop
+ vertex 182.52753457015436 -67.88634790425267 -3.000000000000062
+ vertex 183.24227030542374 -69.33067842807884 -62.600000000000065
+ vertex 182.52753457015436 -67.88634790425266 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.8962637115698759 0.44352154324563553 -1.5974817945265773e-16
+ outer loop
+ vertex 183.24227030542374 -69.33067842807884 -62.600000000000065
+ vertex 182.52753457015436 -67.88634790425267 -3.000000000000062
+ vertex 183.24227030542374 -69.33067842807885 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9922171154055788 0.12451986145283153 -1.8404317463084578e-16
+ outer loop
+ vertex 186.4801956204604 -80.09531605140675 -62.600000000000065
+ vertex 186.6808595929021 -81.69427565173785 -3.000000000000062
+ vertex 186.68085959290207 -81.69427565173784 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9922171154055788 0.12451986145283153 -1.8404317463084578e-16
+ outer loop
+ vertex 186.6808595929021 -81.69427565173785 -3.000000000000062
+ vertex 186.4801956204604 -80.09531605140675 -62.600000000000065
+ vertex 186.48019562046042 -80.09531605140675 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9140288370919221 0.40564921417942973 -1.6383039476578056e-16
+ outer loop
+ vertex 183.24227030542374 -69.33067842807885 -3.000000000000062
+ vertex 183.89597471679528 -70.80363748245898 -62.600000000000065
+ vertex 183.24227030542374 -69.33067842807884 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9140288370919221 0.40564921417942973 -1.6383039476578056e-16
+ outer loop
+ vertex 183.89597471679528 -70.80363748245898 -62.600000000000065
+ vertex 183.24227030542374 -69.33067842807885 -3.000000000000062
+ vertex 183.89597471679528 -70.80363748245898 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.5363402452594244 -0.844001860966586 -1.1736899405614526e-16
+ outer loop
+ vertex 169.70258105841674 -117.76504968478835 -62.600000000000065
+ vertex 168.34247059737294 -118.62936291914629 -3.000000000000062
+ vertex 168.34247059737294 -118.62936291914629 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.5363402452594244 -0.844001860966586 -1.1736899405614526e-16
+ outer loop
+ vertex 168.34247059737294 -118.62936291914629 -3.000000000000062
+ vertex 169.70258105841674 -117.76504968478835 -62.600000000000065
+ vertex 169.70258105841677 -117.76504968478835 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.7838084275862282 -0.6210026963265172 -1.5950409550416875e-16
+ outer loop
+ vertex 179.0540842859469 -108.97688605509173 -62.600000000000065
+ vertex 178.05333736503042 -110.23999469396773 -3.000000000000062
+ vertex 178.05333736503042 -110.23999469396772 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.7838084275862282 -0.6210026963265172 -1.5950409550416875e-16
+ outer loop
+ vertex 178.05333736503042 -110.23999469396773 -3.000000000000062
+ vertex 179.0540842859469 -108.97688605509173 -62.600000000000065
+ vertex 179.0540842859469 -108.97688605509173 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.46392867916166225 -0.8858725532780185 -1.0458099413404858e-16
+ outer loop
+ vertex 166.9474021655441 -119.43603627549429 -62.600000000000065
+ vertex 165.51981701130626 -120.18365814564442 -3.000000000000062
+ vertex 165.51981701130626 -120.18365814564442 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.46392867916166225 -0.8858725532780185 -1.0458099413404858e-16
+ outer loop
+ vertex 165.51981701130626 -120.18365814564442 -3.000000000000062
+ vertex 166.9474021655441 -119.43603627549429 -62.600000000000065
+ vertex 166.94740216554413 -119.4360362754943 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.8762939397707019 -0.4817768478467404 -1.741543413215502e-16
+ outer loop
+ vertex 182.50396298921405 -103.5401114997562 -62.600000000000065
+ vertex 181.7275787643089 -104.95226070173364 -3.000000000000062
+ vertex 181.72757876430887 -104.95226070173364 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.8762939397707019 -0.4817768478467404 -1.741543413215502e-16
+ outer loop
+ vertex 181.7275787643089 -104.95226070173364 -3.000000000000062
+ vertex 182.50396298921405 -103.5401114997562 -62.600000000000065
+ vertex 182.50396298921407 -103.54011149975622 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9999997814571896 -0.0006611244764010427 -1.8796266836386061e-16
+ outer loop
+ vertex 186.88080805451577 -84.91036450790278 -62.600000000000065
+ vertex 186.87974265127679 -86.52186588805824 -3.000000000000062
+ vertex 186.87974265127676 -86.52186588805824 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9999997814571896 -0.0006611244764010427 -1.8796266836386061e-16
+ outer loop
+ vertex 186.87974265127679 -86.52186588805824 -3.000000000000062
+ vertex 186.88080805451577 -84.91036450790278 -62.600000000000065
+ vertex 186.8808080545158 -84.91036450790278 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9990971750681176 -0.04248334698334532 -1.8861380718886234e-16
+ outer loop
+ vertex 186.87974265127676 -86.52186588805824 -62.600000000000065
+ vertex 186.8112806640176 -88.13191271645411 -3.000000000000062
+ vertex 186.81128066401757 -88.13191271645411 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9990971750681176 -0.04248334698334532 -1.8861380718886234e-16
+ outer loop
+ vertex 186.8112806640176 -88.13191271645411 -3.000000000000062
+ vertex 186.87974265127676 -86.52186588805824 -62.600000000000065
+ vertex 186.87974265127679 -86.52186588805824 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9442980716405378 -0.329091403558285 -1.83939166450922e-16
+ outer loop
+ vertex 185.00010139733044 -97.60466933591319 -62.600000000000065
+ vertex 184.4697700303989 -99.12640731420495 -3.000000000000062
+ vertex 184.46977003039888 -99.12640731420494 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9442980716405378 -0.329091403558285 -1.83939166450922e-16
+ outer loop
+ vertex 184.4697700303989 -99.12640731420495 -3.000000000000062
+ vertex 185.00010139733044 -97.60466933591319 -62.600000000000065
+ vertex 185.00010139733047 -97.60466933591319 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9991524752349786 0.04116225494084896 -1.8698261122315598e-16
+ outer loop
+ vertex 186.81447500937168 -83.3002285631922 -62.600000000000065
+ vertex 186.8808080545158 -84.91036450790278 -3.000000000000062
+ vertex 186.88080805451577 -84.91036450790278 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9991524752349786 0.04116225494084896 -1.8698261122315598e-16
+ outer loop
+ vertex 186.8808080545158 -84.91036450790278 -3.000000000000062
+ vertex 186.81447500937168 -83.3002285631922 -62.600000000000065
+ vertex 186.81447500937168 -83.3002285631922 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.929708324630511 -0.3682966618267512 -1.819664515088639e-16
+ outer loop
+ vertex 184.46977003039888 -99.12640731420494 -62.600000000000065
+ vertex 183.8762593218509 -100.6246338899157 -3.000000000000062
+ vertex 183.8762593218509 -100.62463388991569 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.929708324630511 -0.3682966618267512 -1.819664515088639e-16
+ outer loop
+ vertex 183.8762593218509 -100.6246338899157 -3.000000000000062
+ vertex 184.46977003039888 -99.12640731420494 -62.600000000000065
+ vertex 184.4697700303989 -99.12640731420495 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.3098971353857553 -0.9507700907578567 -7.690445521229407e-17
+ outer loop
+ vertex 161.06720089823247 -122.05966233282527 -62.600000000000065
+ vertex 159.5350332499214 -122.55906210334588 -3.000000000000062
+ vertex 159.5350332499214 -122.55906210334588 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.3098971353857553 -0.9507700907578567 -7.690445521229407e-17
+ outer loop
+ vertex 159.5350332499214 -122.55906210334588 -3.000000000000062
+ vertex 161.06720089823247 -122.05966233282527 -62.600000000000065
+ vertex 161.06720089823247 -122.0596623328253 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.5005724413202272 -0.8656946522826092 -1.1107217741834972e-16
+ outer loop
+ vertex 168.34247059737294 -118.62936291914629 -62.600000000000065
+ vertex 166.94740216554413 -119.4360362754943 -3.000000000000062
+ vertex 166.9474021655441 -119.43603627549429 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.5005724413202272 -0.8656946522826092 -1.1107217741834972e-16
+ outer loop
+ vertex 166.94740216554413 -119.4360362754943 -3.000000000000062
+ vertex 168.34247059737294 -118.62936291914629 -62.600000000000065
+ vertex 168.34247059737294 -118.62936291914629 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.809094707151618 -0.5876782749593841 -1.636026354657304e-16
+ outer loop
+ vertex 180.00112884410115 -107.6730285328917 -62.600000000000065
+ vertex 179.0540842859469 -108.97688605509173 -3.000000000000062
+ vertex 179.0540842859469 -108.97688605509173 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.809094707151618 -0.5876782749593841 -1.636026354657304e-16
+ outer loop
+ vertex 179.0540842859469 -108.97688605509173 -3.000000000000062
+ vertex 180.00112884410115 -107.6730285328917 -62.600000000000065
+ vertex 180.00112884410115 -107.6730285328917 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.8329651413758264 -0.5533254677427648 -1.6741488504968608e-16
+ outer loop
+ vertex 180.8928137939151 -106.33070376458772 -62.600000000000065
+ vertex 180.00112884410115 -107.6730285328917 -3.000000000000062
+ vertex 180.00112884410115 -107.6730285328917 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.8329651413758264 -0.5533254677427648 -1.6741488504968608e-16
+ outer loop
+ vertex 180.00112884410115 -107.6730285328917 -3.000000000000062
+ vertex 180.8928137939151 -106.33070376458772 -62.600000000000065
+ vertex 180.8928137939151 -106.33070376458772 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.3493898658303748 -0.9369774392454884 -8.405641526141975e-17
+ outer loop
+ vertex 162.5771416647378 -121.49661995877844 -62.600000000000065
+ vertex 161.06720089823247 -122.0596623328253 -3.000000000000062
+ vertex 161.06720089823247 -122.05966233282527 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.3493898658303748 -0.9369774392454884 -8.405641526141975e-17
+ outer loop
+ vertex 161.06720089823247 -122.0596623328253 -3.000000000000062
+ vertex 162.5771416647378 -121.49661995877844 -62.600000000000065
+ vertex 162.5771416647378 -121.49661995877844 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.7291677277632 -0.684335023792186 -1.5047732123427997e-16
+ outer loop
+ vertex 177.00063930139194 -111.46014411930008 -62.600000000000065
+ vertex 175.89783222505156 -112.63519917575516 -3.000000000000062
+ vertex 175.89783222505156 -112.63519917575516 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.7291677277632 -0.684335023792186 -1.5047732123427997e-16
+ outer loop
+ vertex 175.89783222505156 -112.63519917575516 -3.000000000000062
+ vertex 177.00063930139194 -111.46014411930008 -62.600000000000065
+ vertex 177.00063930139197 -111.46014411930008 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.7571505514688199 -0.6532404170062215 -1.5512643725333332e-16
+ outer loop
+ vertex 178.05333736503042 -110.23999469396772 -62.600000000000065
+ vertex 177.00063930139197 -111.46014411930008 -3.000000000000062
+ vertex 177.00063930139194 -111.46014411930008 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.7571505514688199 -0.6532404170062215 -1.5512643725333332e-16
+ outer loop
+ vertex 177.00063930139197 -111.46014411930008 -3.000000000000062
+ vertex 178.05333736503042 -110.23999469396772 -62.600000000000065
+ vertex 178.05333736503042 -110.23999469396773 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9572353791850622 -0.2893102639666116 -1.8559000385555484e-16
+ outer loop
+ vertex 185.46632538889568 -96.06208286410163 -62.600000000000065
+ vertex 185.00010139733047 -97.60466933591319 -3.000000000000062
+ vertex 185.00010139733044 -97.60466933591319 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9572353791850622 -0.2893102639666116 -1.8559000385555484e-16
+ outer loop
+ vertex 185.00010139733047 -97.60466933591319 -3.000000000000062
+ vertex 185.46632538889568 -96.06208286410163 -62.600000000000065
+ vertex 185.4663253888957 -96.06208286410164 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.39667667014561375 0.687064146869443 -0.6087614290087314
+ outer loop
+ vertex 144.45429716569112 -41.33351007195612 -54.600000000000044
+ vertex 146.3452665958579 -40.608765200564555 -55.01421356237315
+ vertex 144.61321578828904 -41.60876520056452 -55.01421356237315
+ endloop
+endfacet
+facet normal -0.39667667014561375 0.687064146869443 -0.6087614290087314
+ outer loop
+ vertex 146.3452665958579 -40.608765200564555 -55.01421356237315
+ vertex 144.45429716569112 -41.33351007195612 -54.600000000000044
+ vertex 146.18634797325998 -40.33351007195614 -54.600000000000044
+ endloop
+endfacet
+facet normal 0.3043807145043621 -0.5272028623656732 -0.7933533402912317
+ outer loop
+ vertex 159.9523733770444 -64.1769654895947 -55.33205080756895
+ vertex 158.42742935066212 -65.53568495720181 -55.01421356237316
+ vertex 158.22032256947557 -65.17696548959468 -55.33205080756895
+ endloop
+endfacet
+facet normal 0.3043807145043621 -0.5272028623656732 -0.7933533402912317
+ outer loop
+ vertex 158.42742935066212 -65.53568495720181 -55.01421356237316
+ vertex 159.9523733770444 -64.1769654895947 -55.33205080756895
+ vertex 160.159480158231 -64.53568495720184 -55.01421356237316
+ endloop
+endfacet
+facet normal 0.19134171618254064 -0.3314135740355837 0.9238795325112906
+ outer loop
+ vertex 158.2203225694756 -65.17696548959469 -49.86794919243118
+ vertex 159.71119242214695 -63.75922782189429 -49.66814834742192
+ vertex 157.97914161457808 -64.75922782189426 -49.66814834742192
+ endloop
+endfacet
+facet normal 0.19134171618254064 -0.3314135740355837 0.9238795325112906
+ outer loop
+ vertex 159.71119242214695 -63.75922782189429 -49.66814834742192
+ vertex 158.2203225694756 -65.17696548959469 -49.86794919243118
+ vertex 159.95237337704444 -64.17696548959472 -49.86794919243118
+ endloop
+endfacet
+facet normal -0.19134171618255089 0.3314135740356015 -0.923879532511282
+ outer loop
+ vertex 146.55237337704446 -40.96748466817173 -55.332050807568926
+ vertex 145.06150352437308 -42.3852223358721 -55.53185165257819
+ vertex 144.8203225694756 -41.96748466817171 -55.332050807568926
+ endloop
+endfacet
+facet normal -0.19134171618255089 0.3314135740356015 -0.923879532511282
+ outer loop
+ vertex 145.06150352437308 -42.3852223358721 -55.53185165257819
+ vertex 146.55237337704446 -40.96748466817173 -55.332050807568926
+ vertex 146.79355433194192 -41.385222335872136 -55.53185165257819
+ endloop
+endfacet
+facet normal 0.49999999999999994 -0.8660254037844387 9.325056343474399e-32
+ outer loop
+ vertex 160.45237337704444 -65.04299089337913 -53.60000000000007
+ vertex 158.72032256947557 -66.04299089337911 -51.600000000000065
+ vertex 158.72032256947557 -66.04299089337911 -53.60000000000007
+ endloop
+endfacet
+facet normal 0.49999999999999994 -0.8660254037844387 9.325056343474399e-32
+ outer loop
+ vertex 158.72032256947557 -66.04299089337911 -51.600000000000065
+ vertex 160.45237337704444 -65.04299089337913 -53.60000000000007
+ vertex 160.45237337704444 -65.04299089337913 -51.600000000000065
+ endloop
+endfacet
+facet normal 0.46193976625564037 -0.800103145191261 -0.3826834323651031
+ outer loop
+ vertex 158.58634797326002 -65.81094008581022 -54.60000000000007
+ vertex 160.4182992033335 -64.98397269328588 -54.117638090205105
+ vertex 158.68624839576464 -65.98397269328585 -54.117638090205105
+ endloop
+endfacet
+facet normal 0.46193976625564037 -0.800103145191261 -0.3826834323651031
+ outer loop
+ vertex 160.4182992033335 -64.98397269328588 -54.117638090205105
+ vertex 158.58634797326002 -65.81094008581022 -54.60000000000007
+ vertex 160.3183987808289 -64.81094008581026 -54.60000000000007
+ endloop
+endfacet
+facet normal 0.4619397662556417 -0.8001031451912624 0.3826834323650983
+ outer loop
+ vertex 160.4182992033335 -64.98397269328588 -51.08236190979502
+ vertex 158.58634797326002 -65.81094008581022 -50.60000000000005
+ vertex 158.68624839576464 -65.98397269328585 -51.08236190979502
+ endloop
+endfacet
+facet normal 0.4619397662556417 -0.8001031451912624 0.3826834323650983
+ outer loop
+ vertex 158.58634797326002 -65.81094008581022 -50.60000000000005
+ vertex 160.4182992033335 -64.98397269328588 -51.08236190979502
+ vertex 160.3183987808289 -64.81094008581026 -50.60000000000005
+ endloop
+endfacet
+facet normal -7.64123652963884e-16 3.4662739414040805e-16 -1.0
+ outer loop
+ vertex 147.05237337704446 -41.83351007195615 -55.60000000000006
+ vertex 157.7203225694756 -64.31094008581022 -55.600000000000065
+ vertex 145.3203225694756 -42.83351007195611 -55.60000000000006
+ endloop
+endfacet
+facet normal -7.64123652963884e-16 3.4662739414040805e-16 -1.0
+ outer loop
+ vertex 157.7203225694756 -64.31094008581022 -55.600000000000065
+ vertex 147.05237337704446 -41.83351007195615 -55.60000000000006
+ vertex 159.45237337704444 -63.310940085810245 -55.600000000000065
+ endloop
+endfacet
+facet normal 0.3043807145043701 -0.5272028623656854 0.7933533402912205
+ outer loop
+ vertex 158.42742935066212 -65.53568495720182 -50.185786437626966
+ vertex 159.95237337704444 -64.17696548959472 -49.86794919243118
+ vertex 158.2203225694756 -65.17696548959469 -49.86794919243118
+ endloop
+endfacet
+facet normal 0.3043807145043701 -0.5272028623656854 0.7933533402912205
+ outer loop
+ vertex 159.95237337704444 -64.17696548959472 -49.86794919243118
+ vertex 158.42742935066212 -65.53568495720182 -50.185786437626966
+ vertex 160.159480158231 -64.53568495720185 -50.185786437626966
+ endloop
+endfacet
+facet normal -0.30438071450435455 0.5272028623656586 -0.7933533402912444
+ outer loop
+ vertex 146.3452665958579 -40.608765200564555 -55.01421356237315
+ vertex 144.8203225694756 -41.96748466817171 -55.332050807568926
+ vertex 144.61321578828904 -41.60876520056452 -55.01421356237315
+ endloop
+endfacet
+facet normal -0.30438071450435455 0.5272028623656586 -0.7933533402912444
+ outer loop
+ vertex 144.8203225694756 -41.96748466817171 -55.332050807568926
+ vertex 146.3452665958579 -40.608765200564555 -55.01421356237315
+ vertex 146.55237337704446 -40.96748466817173 -55.332050807568926
+ endloop
+endfacet
+facet normal -0.4619397662556498 0.8001031451912763 -0.38268343236505964
+ outer loop
+ vertex 144.35439674318653 -41.160477464480515 -54.11763809020509
+ vertex 146.18634797325998 -40.33351007195614 -54.600000000000044
+ vertex 144.45429716569112 -41.33351007195612 -54.600000000000044
+ endloop
+endfacet
+facet normal -0.4619397662556498 0.8001031451912763 -0.38268343236505964
+ outer loop
+ vertex 146.18634797325998 -40.33351007195614 -54.600000000000044
+ vertex 144.35439674318653 -41.160477464480515 -54.11763809020509
+ vertex 146.0864475507554 -40.16047746448054 -54.11763809020509
+ endloop
+endfacet
+facet normal 0.06526309611002466 -0.11303899832181444 -0.9914448613738106
+ outer loop
+ vertex 159.45237337704444 -63.310940085810245 -55.600000000000065
+ vertex 157.97914161457808 -64.75922782189426 -55.531851652578204
+ vertex 157.7203225694756 -64.31094008581022 -55.600000000000065
+ endloop
+endfacet
+facet normal 0.06526309611002466 -0.11303899832181444 -0.9914448613738106
+ outer loop
+ vertex 157.97914161457808 -64.75922782189426 -55.531851652578204
+ vertex 159.45237337704444 -63.310940085810245 -55.600000000000065
+ vertex 159.71119242214695 -63.75922782189429 -55.531851652578204
+ endloop
+endfacet
+facet normal -0.46193976625565225 0.8001031451912817 0.38268343236504554
+ outer loop
+ vertex 146.18634797325998 -40.33351007195614 -50.60000000000003
+ vertex 144.35439674318653 -41.16047746448053 -51.082361909795
+ vertex 144.45429716569112 -41.33351007195612 -50.60000000000003
+ endloop
+endfacet
+facet normal -0.46193976625565225 0.8001031451912817 0.38268343236504554
+ outer loop
+ vertex 144.35439674318653 -41.16047746448053 -51.082361909795
+ vertex 146.18634797325998 -40.33351007195614 -50.60000000000003
+ vertex 146.08644755075537 -40.160477464480564 -51.082361909795
+ endloop
+endfacet
+facet normal -0.49999999999999994 0.8660254037844387 2.4421626117071097e-15
+ outer loop
+ vertex 146.05237337704446 -40.10145926438727 -51.600000000000044
+ vertex 144.3203225694756 -41.101459264387245 -53.60000000000005
+ vertex 144.32032256947562 -41.101459264387245 -51.600000000000044
+ endloop
+endfacet
+facet normal -0.49999999999999994 0.8660254037844387 2.4421626117071097e-15
+ outer loop
+ vertex 144.3203225694756 -41.101459264387245 -53.60000000000005
+ vertex 146.05237337704446 -40.10145926438727 -51.600000000000044
+ vertex 146.05237337704446 -40.10145926438727 -53.60000000000005
+ endloop
+endfacet
+facet normal -0.39667667014561114 0.6870641468694398 0.6087614290087366
+ outer loop
+ vertex 146.3452665958579 -40.60876520056457 -50.185786437626945
+ vertex 144.45429716569112 -41.33351007195612 -50.60000000000003
+ vertex 144.61321578828907 -41.60876520056452 -50.185786437626945
+ endloop
+endfacet
+facet normal -0.39667667014561114 0.6870641468694398 0.6087614290087366
+ outer loop
+ vertex 144.45429716569112 -41.33351007195612 -50.60000000000003
+ vertex 146.3452665958579 -40.60876520056457 -50.185786437626945
+ vertex 146.18634797325998 -40.33351007195614 -50.60000000000003
+ endloop
+endfacet
+facet normal 0.0652630961100267 -0.11303899832181608 0.9914448613738104
+ outer loop
+ vertex 157.97914161457808 -64.75922782189426 -49.66814834742192
+ vertex 159.45237337704444 -63.31094008581026 -49.60000000000006
+ vertex 157.7203225694756 -64.31094008581023 -49.60000000000006
+ endloop
+endfacet
+facet normal 0.0652630961100267 -0.11303899832181608 0.9914448613738104
+ outer loop
+ vertex 159.45237337704444 -63.31094008581026 -49.60000000000006
+ vertex 157.97914161457808 -64.75922782189426 -49.66814834742192
+ vertex 159.71119242214695 -63.75922782189429 -49.66814834742192
+ endloop
+endfacet
+facet normal 0.49572243068690414 -0.8586164364012594 -0.13052619222006553
+ outer loop
+ vertex 158.68624839576464 -65.98397269328585 -54.117638090205105
+ vertex 160.45237337704444 -65.04299089337913 -53.60000000000007
+ vertex 158.72032256947557 -66.04299089337911 -53.60000000000007
+ endloop
+endfacet
+facet normal 0.49572243068690414 -0.8586164364012594 -0.13052619222006553
+ outer loop
+ vertex 160.45237337704444 -65.04299089337913 -53.60000000000007
+ vertex 158.68624839576464 -65.98397269328585 -54.117638090205105
+ vertex 160.4182992033335 -64.98397269328588 -54.117638090205105
+ endloop
+endfacet
+facet normal 0.3966766701456253 -0.6870641468694629 0.6087614290087012
+ outer loop
+ vertex 160.3183987808289 -64.81094008581026 -50.60000000000005
+ vertex 158.42742935066212 -65.53568495720182 -50.185786437626966
+ vertex 158.58634797326002 -65.81094008581022 -50.60000000000005
+ endloop
+endfacet
+facet normal 0.3966766701456253 -0.6870641468694629 0.6087614290087012
+ outer loop
+ vertex 158.42742935066212 -65.53568495720182 -50.185786437626966
+ vertex 160.3183987808289 -64.81094008581026 -50.60000000000005
+ vertex 160.159480158231 -64.53568495720185 -50.185786437626966
+ endloop
+endfacet
+facet normal -0.49572243068690375 0.8586164364012588 0.13052619222007125
+ outer loop
+ vertex 146.08644755075537 -40.160477464480564 -51.082361909795
+ vertex 144.32032256947562 -41.101459264387245 -51.600000000000044
+ vertex 144.35439674318653 -41.16047746448053 -51.082361909795
+ endloop
+endfacet
+facet normal -0.49572243068690375 0.8586164364012588 0.13052619222007125
+ outer loop
+ vertex 144.32032256947562 -41.101459264387245 -51.600000000000044
+ vertex 146.08644755075537 -40.160477464480564 -51.082361909795
+ vertex 146.05237337704446 -40.10145926438727 -51.600000000000044
+ endloop
+endfacet
+facet normal -0.30438071450435056 0.5272028623656531 0.7933533402912496
+ outer loop
+ vertex 144.8203225694756 -41.96748466817171 -49.86794919243116
+ vertex 146.3452665958579 -40.60876520056457 -50.185786437626945
+ vertex 144.61321578828907 -41.60876520056452 -50.185786437626945
+ endloop
+endfacet
+facet normal -0.30438071450435056 0.5272028623656531 0.7933533402912496
+ outer loop
+ vertex 146.3452665958579 -40.60876520056457 -50.185786437626945
+ vertex 144.8203225694756 -41.96748466817171 -49.86794919243116
+ vertex 146.55237337704446 -40.96748466817173 -49.86794919243116
+ endloop
+endfacet
+facet normal -0.06526309611002687 0.11303899832181638 -0.9914448613738103
+ outer loop
+ vertex 146.79355433194192 -41.385222335872136 -55.53185165257819
+ vertex 145.3203225694756 -42.83351007195611 -55.60000000000006
+ vertex 145.06150352437308 -42.3852223358721 -55.53185165257819
+ endloop
+endfacet
+facet normal -0.06526309611002687 0.11303899832181638 -0.9914448613738103
+ outer loop
+ vertex 145.3203225694756 -42.83351007195611 -55.60000000000006
+ vertex 146.79355433194192 -41.385222335872136 -55.53185165257819
+ vertex 147.05237337704446 -41.83351007195615 -55.60000000000006
+ endloop
+endfacet
+facet normal -0.1913417161825537 0.33141357403560795 0.9238795325112792
+ outer loop
+ vertex 145.06150352437308 -42.38522233587211 -49.6681483474219
+ vertex 146.55237337704446 -40.96748466817173 -49.86794919243116
+ vertex 144.8203225694756 -41.96748466817171 -49.86794919243116
+ endloop
+endfacet
+facet normal -0.1913417161825537 0.33141357403560795 0.9238795325112792
+ outer loop
+ vertex 146.55237337704446 -40.96748466817173 -49.86794919243116
+ vertex 145.06150352437308 -42.38522233587211 -49.6681483474219
+ vertex 146.79355433194195 -41.385222335872136 -49.6681483474219
+ endloop
+endfacet
+facet normal 0.3966766701456177 -0.687064146869451 -0.6087614290087197
+ outer loop
+ vertex 158.42742935066212 -65.53568495720181 -55.01421356237316
+ vertex 160.3183987808289 -64.81094008581026 -54.60000000000007
+ vertex 158.58634797326002 -65.81094008581022 -54.60000000000007
+ endloop
+endfacet
+facet normal 0.3966766701456177 -0.687064146869451 -0.6087614290087197
+ outer loop
+ vertex 160.3183987808289 -64.81094008581026 -54.60000000000007
+ vertex 158.42742935066212 -65.53568495720181 -55.01421356237316
+ vertex 160.159480158231 -64.53568495720184 -55.01421356237316
+ endloop
+endfacet
+facet normal 7.641236529638839e-16 -3.4662739414040785e-16 1.0
+ outer loop
+ vertex 157.7203225694756 -64.31094008581023 -49.60000000000006
+ vertex 147.05237337704446 -41.83351007195615 -49.60000000000003
+ vertex 145.32032256947562 -42.83351007195611 -49.60000000000003
+ endloop
+endfacet
+facet normal 7.641236529638839e-16 -3.4662739414040785e-16 1.0
+ outer loop
+ vertex 147.05237337704446 -41.83351007195615 -49.60000000000003
+ vertex 157.7203225694756 -64.31094008581023 -49.60000000000006
+ vertex 159.45237337704444 -63.31094008581026 -49.60000000000006
+ endloop
+endfacet
+facet normal 0.19134171618254847 -0.331413574035599 -0.9238795325112834
+ outer loop
+ vertex 159.71119242214695 -63.75922782189429 -55.531851652578204
+ vertex 158.22032256947557 -65.17696548959468 -55.33205080756895
+ vertex 157.97914161457808 -64.75922782189426 -55.531851652578204
+ endloop
+endfacet
+facet normal 0.19134171618254847 -0.331413574035599 -0.9238795325112834
+ outer loop
+ vertex 158.22032256947557 -65.17696548959468 -55.33205080756895
+ vertex 159.71119242214695 -63.75922782189429 -55.531851652578204
+ vertex 159.9523733770444 -64.1769654895947 -55.33205080756895
+ endloop
+endfacet
+facet normal -0.4957224306869047 0.8586164364012601 -0.1305261922200592
+ outer loop
+ vertex 144.3203225694756 -41.101459264387245 -53.60000000000005
+ vertex 146.0864475507554 -40.16047746448054 -54.11763809020509
+ vertex 144.35439674318653 -41.160477464480515 -54.11763809020509
+ endloop
+endfacet
+facet normal -0.4957224306869047 0.8586164364012601 -0.1305261922200592
+ outer loop
+ vertex 146.0864475507554 -40.16047746448054 -54.11763809020509
+ vertex 144.3203225694756 -41.101459264387245 -53.60000000000005
+ vertex 146.05237337704446 -40.10145926438727 -53.60000000000005
+ endloop
+endfacet
+facet normal 0.49572243068690436 -0.8586164364012595 0.13052619222006556
+ outer loop
+ vertex 160.45237337704444 -65.04299089337913 -51.600000000000065
+ vertex 158.68624839576464 -65.98397269328585 -51.08236190979502
+ vertex 158.72032256947557 -66.04299089337911 -51.600000000000065
+ endloop
+endfacet
+facet normal 0.49572243068690436 -0.8586164364012595 0.13052619222006556
+ outer loop
+ vertex 158.68624839576464 -65.98397269328585 -51.08236190979502
+ vertex 160.45237337704444 -65.04299089337913 -51.600000000000065
+ vertex 160.4182992033335 -64.98397269328588 -51.08236190979502
+ endloop
+endfacet
+facet normal -0.06526309611002606 0.11303899832181688 0.9914448613738103
+ outer loop
+ vertex 145.32032256947562 -42.83351007195611 -49.60000000000003
+ vertex 146.79355433194195 -41.385222335872136 -49.6681483474219
+ vertex 145.06150352437308 -42.38522233587211 -49.6681483474219
+ endloop
+endfacet
+facet normal -0.06526309611002606 0.11303899832181688 0.9914448613738103
+ outer loop
+ vertex 146.79355433194195 -41.385222335872136 -49.6681483474219
+ vertex 145.32032256947562 -42.83351007195611 -49.60000000000003
+ vertex 147.05237337704446 -41.83351007195615 -49.60000000000003
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 147.05237337704446 -41.83351007195618 -16.00000000000005
+ vertex 159.711192422147 -63.75922782189427 -15.931851652578203
+ vertex 159.45237337704447 -63.310940085810266 -16.000000000000068
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 159.711192422147 -63.75922782189427 -15.931851652578203
+ vertex 147.05237337704446 -41.83351007195618 -16.00000000000005
+ vertex 146.79355433194198 -41.38522233587212 -15.931851652578185
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 159.711192422147 -63.75922782189427 -15.931851652578203
+ vertex 146.79355433194198 -41.38522233587212 -15.931851652578185
+ vertex 159.95237337704447 -64.17696548959468 -15.732050807568942
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 159.95237337704447 -64.17696548959468 -15.732050807568942
+ vertex 146.79355433194198 -41.38522233587212 -15.931851652578185
+ vertex 146.5523733770445 -40.96748466817174 -15.732050807568926
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 159.95237337704447 -64.17696548959468 -15.732050807568942
+ vertex 146.5523733770445 -40.96748466817174 -15.732050807568926
+ vertex 160.15948015823102 -64.53568495720187 -15.414213562373158
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.15948015823102 -64.53568495720187 -15.414213562373158
+ vertex 146.5523733770445 -40.96748466817174 -15.732050807568926
+ vertex 146.34526659585794 -40.60876520056458 -15.41421356237314
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.15948015823102 -64.53568495720187 -15.414213562373158
+ vertex 146.34526659585794 -40.60876520056458 -15.41421356237314
+ vertex 160.31839878082894 -64.81094008581027 -15.000000000000062
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.31839878082894 -64.81094008581027 -15.000000000000062
+ vertex 146.34526659585794 -40.60876520056458 -15.41421356237314
+ vertex 146.18634797326004 -40.33351007195616 -15.000000000000046
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.31839878082894 -64.81094008581027 -15.000000000000062
+ vertex 146.18634797326004 -40.33351007195616 -15.000000000000046
+ vertex 160.4182992033336 -64.98397269328586 -14.517638090205104
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.4182992033336 -64.98397269328586 -14.517638090205104
+ vertex 146.18634797326004 -40.33351007195616 -15.000000000000046
+ vertex 146.08644755075542 -40.16047746448054 -14.517638090205088
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.4182992033336 -64.98397269328586 -14.517638090205104
+ vertex 146.08644755075542 -40.16047746448054 -14.517638090205088
+ vertex 160.45237337704447 -65.04299089337914 -14.000000000000064
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.45237337704447 -65.04299089337914 -14.000000000000064
+ vertex 146.08644755075542 -40.16047746448054 -14.517638090205088
+ vertex 146.0523733770445 -40.101459264387294 -14.000000000000048
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.45237337704447 -65.04299089337914 -14.000000000000064
+ vertex 146.0523733770445 -40.101459264387294 -14.000000000000048
+ vertex 160.45237337704447 -65.04299089337914 -12.000000000000052
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.45237337704447 -65.04299089337914 -12.000000000000052
+ vertex 146.0523733770445 -40.101459264387294 -14.000000000000048
+ vertex 146.0523733770445 -40.101459264387294 -12.000000000000034
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.45237337704447 -65.04299089337914 -12.000000000000052
+ vertex 146.0523733770445 -40.101459264387294 -12.000000000000034
+ vertex 160.4182992033336 -64.98397269328586 -11.482361909795022
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.4182992033336 -64.98397269328586 -11.482361909795022
+ vertex 146.0523733770445 -40.101459264387294 -12.000000000000034
+ vertex 146.08644755075542 -40.160477464480564 -11.482361909795
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.4182992033336 -64.98397269328586 -11.482361909795022
+ vertex 146.08644755075542 -40.160477464480564 -11.482361909795
+ vertex 160.31839878082894 -64.81094008581027 -11.000000000000048
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.31839878082894 -64.81094008581027 -11.000000000000048
+ vertex 146.08644755075542 -40.160477464480564 -11.482361909795
+ vertex 146.18634797326004 -40.33351007195616 -11.000000000000036
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.31839878082894 -64.81094008581027 -11.000000000000048
+ vertex 146.18634797326004 -40.33351007195616 -11.000000000000036
+ vertex 160.15948015823105 -64.53568495720187 -10.58578643762697
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.15948015823105 -64.53568495720187 -10.58578643762697
+ vertex 146.18634797326004 -40.33351007195616 -11.000000000000036
+ vertex 146.34526659585794 -40.60876520056458 -10.585786437626947
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.15948015823105 -64.53568495720187 -10.58578643762697
+ vertex 146.34526659585794 -40.60876520056458 -10.585786437626947
+ vertex 159.9523733770445 -64.17696548959469 -10.267949192431178
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 159.9523733770445 -64.17696548959469 -10.267949192431178
+ vertex 146.34526659585794 -40.60876520056458 -10.585786437626947
+ vertex 146.5523733770445 -40.96748466817174 -10.267949192431168
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 159.9523733770445 -64.17696548959469 -10.267949192431178
+ vertex 146.5523733770445 -40.96748466817174 -10.267949192431168
+ vertex 159.711192422147 -63.75922782189427 -10.068148347421925
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 159.711192422147 -63.75922782189427 -10.068148347421925
+ vertex 146.5523733770445 -40.96748466817174 -10.267949192431168
+ vertex 146.79355433194198 -41.385222335872136 -10.068148347421902
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 159.711192422147 -63.75922782189427 -10.068148347421925
+ vertex 146.79355433194198 -41.385222335872136 -10.068148347421902
+ vertex 159.45237337704447 -63.310940085810266 -10.00000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 159.45237337704447 -63.310940085810266 -10.00000000000005
+ vertex 146.79355433194198 -41.385222335872136 -10.068148347421902
+ vertex 147.05237337704446 -41.83351007195618 -10.000000000000037
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 147.05237337704446 -41.83351007195615 -55.60000000000006
+ vertex 159.71119242214695 -63.75922782189429 -55.531851652578204
+ vertex 159.45237337704444 -63.310940085810245 -55.600000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 159.71119242214695 -63.75922782189429 -55.531851652578204
+ vertex 147.05237337704446 -41.83351007195615 -55.60000000000006
+ vertex 146.79355433194192 -41.385222335872136 -55.53185165257819
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 159.71119242214695 -63.75922782189429 -55.531851652578204
+ vertex 146.79355433194192 -41.385222335872136 -55.53185165257819
+ vertex 159.9523733770444 -64.1769654895947 -55.33205080756895
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 159.9523733770444 -64.1769654895947 -55.33205080756895
+ vertex 146.79355433194192 -41.385222335872136 -55.53185165257819
+ vertex 146.55237337704446 -40.96748466817173 -55.332050807568926
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 159.9523733770444 -64.1769654895947 -55.33205080756895
+ vertex 146.55237337704446 -40.96748466817173 -55.332050807568926
+ vertex 160.159480158231 -64.53568495720184 -55.01421356237316
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.159480158231 -64.53568495720184 -55.01421356237316
+ vertex 146.55237337704446 -40.96748466817173 -55.332050807568926
+ vertex 146.3452665958579 -40.608765200564555 -55.01421356237315
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.159480158231 -64.53568495720184 -55.01421356237316
+ vertex 146.3452665958579 -40.608765200564555 -55.01421356237315
+ vertex 160.3183987808289 -64.81094008581026 -54.60000000000007
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.3183987808289 -64.81094008581026 -54.60000000000007
+ vertex 146.3452665958579 -40.608765200564555 -55.01421356237315
+ vertex 146.18634797325998 -40.33351007195614 -54.600000000000044
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.3183987808289 -64.81094008581026 -54.60000000000007
+ vertex 146.18634797325998 -40.33351007195614 -54.600000000000044
+ vertex 160.4182992033335 -64.98397269328588 -54.117638090205105
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.4182992033335 -64.98397269328588 -54.117638090205105
+ vertex 146.18634797325998 -40.33351007195614 -54.600000000000044
+ vertex 146.0864475507554 -40.16047746448054 -54.11763809020509
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.4182992033335 -64.98397269328588 -54.117638090205105
+ vertex 146.0864475507554 -40.16047746448054 -54.11763809020509
+ vertex 160.45237337704444 -65.04299089337913 -53.60000000000007
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.45237337704444 -65.04299089337913 -53.60000000000007
+ vertex 146.0864475507554 -40.16047746448054 -54.11763809020509
+ vertex 146.05237337704446 -40.10145926438727 -53.60000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.45237337704444 -65.04299089337913 -53.60000000000007
+ vertex 146.05237337704446 -40.10145926438727 -53.60000000000005
+ vertex 160.45237337704444 -65.04299089337913 -51.600000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.45237337704444 -65.04299089337913 -51.600000000000065
+ vertex 146.05237337704446 -40.10145926438727 -53.60000000000005
+ vertex 146.05237337704446 -40.10145926438727 -51.600000000000044
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.45237337704444 -65.04299089337913 -51.600000000000065
+ vertex 146.05237337704446 -40.10145926438727 -51.600000000000044
+ vertex 160.4182992033335 -64.98397269328588 -51.08236190979502
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.4182992033335 -64.98397269328588 -51.08236190979502
+ vertex 146.05237337704446 -40.10145926438727 -51.600000000000044
+ vertex 146.08644755075537 -40.160477464480564 -51.082361909795
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.4182992033335 -64.98397269328588 -51.08236190979502
+ vertex 146.08644755075537 -40.160477464480564 -51.082361909795
+ vertex 160.3183987808289 -64.81094008581026 -50.60000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.3183987808289 -64.81094008581026 -50.60000000000005
+ vertex 146.08644755075537 -40.160477464480564 -51.082361909795
+ vertex 146.18634797325998 -40.33351007195614 -50.60000000000003
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.3183987808289 -64.81094008581026 -50.60000000000005
+ vertex 146.18634797325998 -40.33351007195614 -50.60000000000003
+ vertex 160.159480158231 -64.53568495720185 -50.185786437626966
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.159480158231 -64.53568495720185 -50.185786437626966
+ vertex 146.18634797325998 -40.33351007195614 -50.60000000000003
+ vertex 146.3452665958579 -40.60876520056457 -50.185786437626945
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 160.159480158231 -64.53568495720185 -50.185786437626966
+ vertex 146.3452665958579 -40.60876520056457 -50.185786437626945
+ vertex 159.95237337704444 -64.17696548959472 -49.86794919243118
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 159.95237337704444 -64.17696548959472 -49.86794919243118
+ vertex 146.3452665958579 -40.60876520056457 -50.185786437626945
+ vertex 146.55237337704446 -40.96748466817173 -49.86794919243116
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 159.95237337704444 -64.17696548959472 -49.86794919243118
+ vertex 146.55237337704446 -40.96748466817173 -49.86794919243116
+ vertex 159.71119242214695 -63.75922782189429 -49.66814834742192
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 159.71119242214695 -63.75922782189429 -49.66814834742192
+ vertex 146.55237337704446 -40.96748466817173 -49.86794919243116
+ vertex 146.79355433194195 -41.385222335872136 -49.6681483474219
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 159.71119242214695 -63.75922782189429 -49.66814834742192
+ vertex 146.79355433194195 -41.385222335872136 -49.6681483474219
+ vertex 159.45237337704444 -63.31094008581026 -49.60000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.4999999999999997 -4.88436798029084e-16
+ outer loop
+ vertex 159.45237337704444 -63.31094008581026 -49.60000000000006
+ vertex 146.79355433194195 -41.385222335872136 -49.6681483474219
+ vertex 147.05237337704446 -41.83351007195615 -49.60000000000003
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 135.04517266035938 -106.48202726980834 -55.531851652578204
+ vertex 109.72753457015432 -106.48202726980834 -55.600000000000065
+ vertex 134.52753457015433 -106.48202726980834 -55.600000000000065
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 109.72753457015432 -106.48202726980834 -55.600000000000065
+ vertex 135.04517266035938 -106.48202726980834 -55.531851652578204
+ vertex 109.20989647994928 -106.48202726980834 -55.531851652578204
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 109.20989647994928 -106.48202726980834 -55.531851652578204
+ vertex 135.04517266035938 -106.48202726980834 -55.531851652578204
+ vertex 135.52753457015433 -106.48202726980831 -55.33205080756894
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 109.20989647994928 -106.48202726980834 -55.531851652578204
+ vertex 135.52753457015433 -106.48202726980831 -55.33205080756894
+ vertex 108.72753457015433 -106.48202726980834 -55.33205080756894
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 108.72753457015433 -106.48202726980834 -55.33205080756894
+ vertex 135.52753457015433 -106.48202726980831 -55.33205080756894
+ vertex 135.94174813252744 -106.48202726980834 -55.01421356237316
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 108.72753457015433 -106.48202726980834 -55.33205080756894
+ vertex 135.94174813252744 -106.48202726980834 -55.01421356237316
+ vertex 108.31332100778123 -106.48202726980834 -55.01421356237316
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 108.31332100778123 -106.48202726980834 -55.01421356237316
+ vertex 135.94174813252744 -106.48202726980834 -55.01421356237316
+ vertex 136.25958537772323 -106.48202726980834 -54.60000000000006
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 108.31332100778123 -106.48202726980834 -55.01421356237316
+ vertex 136.25958537772323 -106.48202726980834 -54.60000000000006
+ vertex 107.99548376258544 -106.48202726980834 -54.60000000000006
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 107.99548376258544 -106.48202726980834 -54.60000000000006
+ vertex 136.25958537772323 -106.48202726980834 -54.60000000000006
+ vertex 136.45938622273246 -106.48202726980834 -54.117638090205105
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 107.99548376258544 -106.48202726980834 -54.60000000000006
+ vertex 136.45938622273246 -106.48202726980834 -54.117638090205105
+ vertex 107.79568291757619 -106.48202726980834 -54.117638090205105
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 107.79568291757619 -106.48202726980834 -54.117638090205105
+ vertex 136.45938622273246 -106.48202726980834 -54.117638090205105
+ vertex 136.52753457015433 -106.48202726980834 -53.60000000000006
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 107.79568291757619 -106.48202726980834 -54.117638090205105
+ vertex 136.52753457015433 -106.48202726980834 -53.60000000000006
+ vertex 107.72753457015433 -106.48202726980834 -53.60000000000006
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 107.72753457015433 -106.48202726980834 -53.60000000000006
+ vertex 136.52753457015433 -106.48202726980834 -53.60000000000006
+ vertex 136.52753457015433 -106.48202726980834 -51.60000000000005
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 107.72753457015433 -106.48202726980834 -53.60000000000006
+ vertex 136.52753457015433 -106.48202726980834 -51.60000000000005
+ vertex 107.72753457015433 -106.48202726980834 -51.60000000000005
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 107.72753457015433 -106.48202726980834 -51.60000000000005
+ vertex 136.52753457015433 -106.48202726980834 -51.60000000000005
+ vertex 136.45938622273246 -106.48202726980834 -51.082361909795004
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 107.72753457015433 -106.48202726980834 -51.60000000000005
+ vertex 136.45938622273246 -106.48202726980834 -51.082361909795004
+ vertex 107.79568291757619 -106.48202726980834 -51.082361909795004
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 107.79568291757619 -106.48202726980834 -51.082361909795004
+ vertex 136.45938622273246 -106.48202726980834 -51.082361909795004
+ vertex 136.25958537772323 -106.48202726980834 -50.600000000000044
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 107.79568291757619 -106.48202726980834 -51.082361909795004
+ vertex 136.25958537772323 -106.48202726980834 -50.600000000000044
+ vertex 107.99548376258544 -106.48202726980834 -50.600000000000044
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 107.99548376258544 -106.48202726980834 -50.600000000000044
+ vertex 136.25958537772323 -106.48202726980834 -50.600000000000044
+ vertex 135.94174813252744 -106.48202726980834 -50.18578643762695
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 107.99548376258544 -106.48202726980834 -50.600000000000044
+ vertex 135.94174813252744 -106.48202726980834 -50.18578643762695
+ vertex 108.31332100778123 -106.48202726980834 -50.18578643762695
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 108.31332100778123 -106.48202726980834 -50.18578643762695
+ vertex 135.94174813252744 -106.48202726980834 -50.18578643762695
+ vertex 135.52753457015436 -106.48202726980834 -49.867949192431176
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 108.31332100778123 -106.48202726980834 -50.18578643762695
+ vertex 135.52753457015436 -106.48202726980834 -49.867949192431176
+ vertex 108.72753457015433 -106.48202726980834 -49.867949192431176
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 108.72753457015433 -106.48202726980834 -49.867949192431176
+ vertex 135.52753457015436 -106.48202726980834 -49.867949192431176
+ vertex 135.04517266035938 -106.48202726980834 -49.668148347421905
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 108.72753457015433 -106.48202726980834 -49.867949192431176
+ vertex 135.04517266035938 -106.48202726980834 -49.668148347421905
+ vertex 109.20989647994928 -106.48202726980834 -49.668148347421905
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 109.20989647994928 -106.48202726980834 -49.668148347421905
+ vertex 135.04517266035938 -106.48202726980834 -49.668148347421905
+ vertex 134.52753457015433 -106.48202726980834 -49.600000000000044
+ endloop
+endfacet
+facet normal 2.220446049250313e-16 -1.0 -1.242990277445663e-16
+ outer loop
+ vertex 109.20989647994928 -106.48202726980834 -49.668148347421905
+ vertex 134.52753457015433 -106.48202726980834 -49.600000000000044
+ vertex 109.72753457015432 -106.48202726980834 -49.600000000000044
+ endloop
+endfacet
+facet normal 6.504153270546949e-16 -1.4967879642209175e-16 1.0
+ outer loop
+ vertex 157.72032256947568 -64.31094008581013 -10.00000000000005
+ vertex 147.05237337704446 -41.83351007195618 -10.000000000000037
+ vertex 145.3203225694757 -42.833510071956034 -10.000000000000037
+ endloop
+endfacet
+facet normal 6.504153270546949e-16 -1.4967879642209175e-16 1.0
+ outer loop
+ vertex 147.05237337704446 -41.83351007195618 -10.000000000000037
+ vertex 157.72032256947568 -64.31094008581013 -10.00000000000005
+ vertex 159.45237337704447 -63.310940085810266 -10.00000000000005
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 135.04517266035938 -106.48202726980836 -15.931851652578198
+ vertex 109.72753457015432 -106.48202726980836 -16.00000000000006
+ vertex 134.52753457015433 -106.48202726980834 -16.00000000000006
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 109.72753457015432 -106.48202726980836 -16.00000000000006
+ vertex 135.04517266035938 -106.48202726980836 -15.931851652578198
+ vertex 109.20989647994928 -106.48202726980836 -15.931851652578198
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 109.20989647994928 -106.48202726980836 -15.931851652578198
+ vertex 135.04517266035938 -106.48202726980836 -15.931851652578198
+ vertex 135.52753457015433 -106.48202726980834 -15.732050807568937
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 109.20989647994928 -106.48202726980836 -15.931851652578198
+ vertex 135.52753457015433 -106.48202726980834 -15.732050807568937
+ vertex 108.72753457015435 -106.48202726980836 -15.732050807568937
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 108.72753457015435 -106.48202726980836 -15.732050807568937
+ vertex 135.52753457015433 -106.48202726980834 -15.732050807568937
+ vertex 135.94174813252744 -106.48202726980836 -15.414213562373153
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 108.72753457015435 -106.48202726980836 -15.732050807568937
+ vertex 135.94174813252744 -106.48202726980836 -15.414213562373153
+ vertex 108.31332100778123 -106.48202726980836 -15.414213562373153
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 108.31332100778123 -106.48202726980836 -15.414213562373153
+ vertex 135.94174813252744 -106.48202726980836 -15.414213562373153
+ vertex 136.25958537772323 -106.48202726980836 -15.000000000000057
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 108.31332100778123 -106.48202726980836 -15.414213562373153
+ vertex 136.25958537772323 -106.48202726980836 -15.000000000000057
+ vertex 107.99548376258544 -106.48202726980834 -15.000000000000057
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 107.99548376258544 -106.48202726980834 -15.000000000000057
+ vertex 136.25958537772323 -106.48202726980836 -15.000000000000057
+ vertex 136.45938622273246 -106.48202726980836 -14.517638090205098
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 107.99548376258544 -106.48202726980834 -15.000000000000057
+ vertex 136.45938622273246 -106.48202726980836 -14.517638090205098
+ vertex 107.7956829175762 -106.48202726980836 -14.517638090205098
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 107.7956829175762 -106.48202726980836 -14.517638090205098
+ vertex 136.45938622273246 -106.48202726980836 -14.517638090205098
+ vertex 136.52753457015433 -106.48202726980836 -14.000000000000059
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 107.7956829175762 -106.48202726980836 -14.517638090205098
+ vertex 136.52753457015433 -106.48202726980836 -14.000000000000059
+ vertex 107.72753457015433 -106.48202726980836 -14.000000000000059
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 107.72753457015433 -106.48202726980836 -14.000000000000059
+ vertex 136.52753457015433 -106.48202726980836 -14.000000000000059
+ vertex 136.52753457015433 -106.48202726980836 -12.000000000000046
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 107.72753457015433 -106.48202726980836 -14.000000000000059
+ vertex 136.52753457015433 -106.48202726980836 -12.000000000000046
+ vertex 107.72753457015433 -106.48202726980836 -12.000000000000046
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 107.72753457015433 -106.48202726980836 -12.000000000000046
+ vertex 136.52753457015433 -106.48202726980836 -12.000000000000046
+ vertex 136.45938622273246 -106.48202726980836 -11.482361909795012
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 107.72753457015433 -106.48202726980836 -12.000000000000046
+ vertex 136.45938622273246 -106.48202726980836 -11.482361909795012
+ vertex 107.7956829175762 -106.48202726980834 -11.482361909795012
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 107.7956829175762 -106.48202726980834 -11.482361909795012
+ vertex 136.45938622273246 -106.48202726980836 -11.482361909795012
+ vertex 136.25958537772323 -106.48202726980836 -11.000000000000048
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 107.7956829175762 -106.48202726980834 -11.482361909795012
+ vertex 136.25958537772323 -106.48202726980836 -11.000000000000048
+ vertex 107.99548376258544 -106.48202726980834 -11.000000000000048
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 107.99548376258544 -106.48202726980834 -11.000000000000048
+ vertex 136.25958537772323 -106.48202726980836 -11.000000000000048
+ vertex 135.94174813252744 -106.48202726980836 -10.58578643762696
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 107.99548376258544 -106.48202726980834 -11.000000000000048
+ vertex 135.94174813252744 -106.48202726980836 -10.58578643762696
+ vertex 108.31332100778123 -106.48202726980836 -10.58578643762696
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 108.31332100778123 -106.48202726980836 -10.58578643762696
+ vertex 135.94174813252744 -106.48202726980836 -10.58578643762696
+ vertex 135.52753457015436 -106.48202726980836 -10.267949192431178
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 108.31332100778123 -106.48202726980836 -10.58578643762696
+ vertex 135.52753457015436 -106.48202726980836 -10.267949192431178
+ vertex 108.72753457015435 -106.48202726980836 -10.267949192431178
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 108.72753457015435 -106.48202726980836 -10.267949192431178
+ vertex 135.52753457015436 -106.48202726980836 -10.267949192431178
+ vertex 135.04517266035938 -106.48202726980836 -10.068148347421912
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 108.72753457015435 -106.48202726980836 -10.267949192431178
+ vertex 135.04517266035938 -106.48202726980836 -10.068148347421912
+ vertex 109.20989647994928 -106.48202726980836 -10.068148347421912
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 109.20989647994928 -106.48202726980836 -10.068148347421912
+ vertex 135.04517266035938 -106.48202726980836 -10.068148347421912
+ vertex 134.52753457015433 -106.48202726980834 -10.00000000000005
+ endloop
+endfacet
+facet normal 1.1102230246251563e-16 -1.0 -2.0134478754370017e-16
+ outer loop
+ vertex 109.20989647994928 -106.48202726980836 -10.068148347421912
+ vertex 134.52753457015433 -106.48202726980834 -10.00000000000005
+ vertex 109.72753457015432 -106.48202726980836 -10.00000000000005
+ endloop
+endfacet
+facet normal -0.46193976625564426 0.8001031451912668 -0.3826834323650861
+ outer loop
+ vertex 144.35439674318667 -41.160477464480415 -14.517638090205088
+ vertex 146.18634797326004 -40.33351007195616 -15.000000000000046
+ vertex 144.45429716569126 -41.33351007195603 -15.000000000000046
+ endloop
+endfacet
+facet normal -0.46193976625564426 0.8001031451912668 -0.3826834323650861
+ outer loop
+ vertex 146.18634797326004 -40.33351007195616 -15.000000000000046
+ vertex 144.35439674318667 -41.160477464480415 -14.517638090205088
+ vertex 146.08644755075542 -40.16047746448054 -14.517638090205088
+ endloop
+endfacet
+facet normal 0.06526309611002626 -0.11303899832181721 -0.9914448613738102
+ outer loop
+ vertex 159.45237337704447 -63.310940085810266 -16.000000000000068
+ vertex 157.97914161457825 -64.75922782189413 -15.931851652578203
+ vertex 157.72032256947568 -64.31094008581013 -16.000000000000068
+ endloop
+endfacet
+facet normal 0.06526309611002626 -0.11303899832181721 -0.9914448613738102
+ outer loop
+ vertex 157.97914161457825 -64.75922782189413 -15.931851652578203
+ vertex 159.45237337704447 -63.310940085810266 -16.000000000000068
+ vertex 159.711192422147 -63.75922782189427 -15.931851652578203
+ endloop
+endfacet
+facet normal 0.19134171618253798 -0.33141357403557914 0.9238795325112927
+ outer loop
+ vertex 158.2203225694757 -65.17696548959456 -10.267949192431178
+ vertex 159.711192422147 -63.75922782189427 -10.068148347421925
+ vertex 157.97914161457825 -64.75922782189413 -10.068148347421925
+ endloop
+endfacet
+facet normal 0.19134171618253798 -0.33141357403557914 0.9238795325112927
+ outer loop
+ vertex 159.711192422147 -63.75922782189427 -10.068148347421925
+ vertex 158.2203225694757 -65.17696548959456 -10.267949192431178
+ vertex 159.9523733770445 -64.17696548959469 -10.267949192431178
+ endloop
+endfacet
+facet normal 0.39667667014561314 -0.6870641468694433 -0.6087614290087314
+ outer loop
+ vertex 158.42742935066224 -65.53568495720172 -15.414213562373158
+ vertex 160.31839878082894 -64.81094008581027 -15.000000000000062
+ vertex 158.58634797326016 -65.81094008581013 -15.000000000000062
+ endloop
+endfacet
+facet normal 0.39667667014561314 -0.6870641468694433 -0.6087614290087314
+ outer loop
+ vertex 160.31839878082894 -64.81094008581027 -15.000000000000062
+ vertex 158.42742935066224 -65.53568495720172 -15.414213562373158
+ vertex 160.15948015823102 -64.53568495720187 -15.414213562373158
+ endloop
+endfacet
+facet normal -7.641236529638842e-16 3.4662739414040825e-16 -1.0
+ outer loop
+ vertex 147.05237337704446 -41.83351007195618 -16.00000000000005
+ vertex 157.72032256947568 -64.31094008581013 -16.000000000000068
+ vertex 145.3203225694757 -42.833510071956034 -16.00000000000005
+ endloop
+endfacet
+facet normal -7.641236529638842e-16 3.4662739414040825e-16 -1.0
+ outer loop
+ vertex 157.72032256947568 -64.31094008581013 -16.000000000000068
+ vertex 147.05237337704446 -41.83351007195618 -16.00000000000005
+ vertex 159.45237337704447 -63.310940085810266 -16.000000000000068
+ endloop
+endfacet
+facet normal -0.4619397662556468 0.8001031451912721 0.38268343236507185
+ outer loop
+ vertex 146.18634797326004 -40.33351007195616 -11.000000000000036
+ vertex 144.35439674318664 -41.160477464480415 -11.482361909795
+ vertex 144.45429716569126 -41.33351007195603 -11.000000000000036
+ endloop
+endfacet
+facet normal -0.4619397662556468 0.8001031451912721 0.38268343236507185
+ outer loop
+ vertex 144.35439674318664 -41.160477464480415 -11.482361909795
+ vertex 146.18634797326004 -40.33351007195616 -11.000000000000036
+ vertex 146.08644755075542 -40.160477464480564 -11.482361909795
+ endloop
+endfacet
+facet normal -0.49572243068690613 0.8586164364012626 -0.130526192220038
+ outer loop
+ vertex 144.3203225694757 -41.10145926438716 -14.000000000000048
+ vertex 146.08644755075542 -40.16047746448054 -14.517638090205088
+ vertex 144.35439674318667 -41.160477464480415 -14.517638090205088
+ endloop
+endfacet
+facet normal -0.49572243068690613 0.8586164364012626 -0.130526192220038
+ outer loop
+ vertex 146.08644755075542 -40.16047746448054 -14.517638090205088
+ vertex 144.3203225694757 -41.10145926438716 -14.000000000000048
+ vertex 146.0523733770445 -40.101459264387294 -14.000000000000048
+ endloop
+endfacet
+facet normal -0.39667667014561336 0.6870641468694437 0.6087614290087308
+ outer loop
+ vertex 146.34526659585794 -40.60876520056458 -10.585786437626947
+ vertex 144.45429716569126 -41.33351007195603 -11.000000000000036
+ vertex 144.61321578828915 -41.60876520056444 -10.585786437626947
+ endloop
+endfacet
+facet normal -0.39667667014561336 0.6870641468694437 0.6087614290087308
+ outer loop
+ vertex 144.45429716569126 -41.33351007195603 -11.000000000000036
+ vertex 146.34526659585794 -40.60876520056458 -10.585786437626947
+ vertex 146.18634797326004 -40.33351007195616 -11.000000000000036
+ endloop
+endfacet
+facet normal -0.3043807145043558 0.5272028623656622 0.7933533402912416
+ outer loop
+ vertex 144.82032256947574 -41.9674846681716 -10.267949192431168
+ vertex 146.34526659585794 -40.60876520056458 -10.585786437626947
+ vertex 144.61321578828915 -41.60876520056444 -10.585786437626947
+ endloop
+endfacet
+facet normal -0.3043807145043558 0.5272028623656622 0.7933533402912416
+ outer loop
+ vertex 146.34526659585794 -40.60876520056458 -10.585786437626947
+ vertex 144.82032256947574 -41.9674846681716 -10.267949192431168
+ vertex 146.5523733770445 -40.96748466817174 -10.267949192431168
+ endloop
+endfacet
+facet normal 0.19134171618254847 -0.331413574035599 -0.9238795325112834
+ outer loop
+ vertex 159.711192422147 -63.75922782189427 -15.931851652578203
+ vertex 158.22032256947568 -65.17696548959455 -15.732050807568942
+ vertex 157.97914161457825 -64.75922782189413 -15.931851652578203
+ endloop
+endfacet
+facet normal 0.19134171618254847 -0.331413574035599 -0.9238795325112834
+ outer loop
+ vertex 158.22032256947568 -65.17696548959455 -15.732050807568942
+ vertex 159.711192422147 -63.75922782189427 -15.931851652578203
+ vertex 159.95237337704447 -64.17696548959468 -15.732050807568942
+ endloop
+endfacet
+facet normal -0.1913417161825537 0.33141357403560795 0.9238795325112792
+ outer loop
+ vertex 145.06150352437322 -42.38522233587199 -10.068148347421902
+ vertex 146.5523733770445 -40.96748466817174 -10.267949192431168
+ vertex 144.82032256947574 -41.9674846681716 -10.267949192431168
+ endloop
+endfacet
+facet normal -0.1913417161825537 0.33141357403560795 0.9238795325112792
+ outer loop
+ vertex 146.5523733770445 -40.96748466817174 -10.267949192431168
+ vertex 145.06150352437322 -42.38522233587199 -10.068148347421902
+ vertex 146.79355433194198 -41.385222335872136 -10.068148347421902
+ endloop
+endfacet
+facet normal -0.06526309611002466 0.11303899832181444 0.9914448613738106
+ outer loop
+ vertex 145.3203225694757 -42.833510071956034 -10.000000000000037
+ vertex 146.79355433194198 -41.385222335872136 -10.068148347421902
+ vertex 145.06150352437322 -42.38522233587199 -10.068148347421902
+ endloop
+endfacet
+facet normal -0.06526309611002466 0.11303899832181444 0.9914448613738106
+ outer loop
+ vertex 146.79355433194198 -41.385222335872136 -10.068148347421902
+ vertex 145.3203225694757 -42.833510071956034 -10.000000000000037
+ vertex 147.05237337704446 -41.83351007195618 -10.000000000000037
+ endloop
+endfacet
+facet normal -0.1913417161825498 0.33141357403559957 -0.9238795325112831
+ outer loop
+ vertex 146.5523733770445 -40.96748466817174 -15.732050807568926
+ vertex 145.0615035243732 -42.38522233587199 -15.931851652578185
+ vertex 144.82032256947574 -41.96748466817159 -15.732050807568926
+ endloop
+endfacet
+facet normal -0.1913417161825498 0.33141357403559957 -0.9238795325112831
+ outer loop
+ vertex 145.0615035243732 -42.38522233587199 -15.931851652578185
+ vertex 146.5523733770445 -40.96748466817174 -15.732050807568926
+ vertex 146.79355433194198 -41.38522233587212 -15.931851652578185
+ endloop
+endfacet
+facet normal -0.49999999999999994 0.8660254037844387 -9.325056343474399e-32
+ outer loop
+ vertex 146.0523733770445 -40.101459264387294 -12.000000000000034
+ vertex 144.3203225694757 -41.10145926438716 -14.000000000000048
+ vertex 144.3203225694757 -41.10145926438716 -12.000000000000034
+ endloop
+endfacet
+facet normal -0.49999999999999994 0.8660254037844387 -9.325056343474399e-32
+ outer loop
+ vertex 144.3203225694757 -41.10145926438716 -14.000000000000048
+ vertex 146.0523733770445 -40.101459264387294 -12.000000000000034
+ vertex 146.0523733770445 -40.101459264387294 -14.000000000000048
+ endloop
+endfacet
+facet normal 0.39667667014561664 -0.6870641468694482 0.6087614290087234
+ outer loop
+ vertex 160.31839878082894 -64.81094008581027 -11.000000000000048
+ vertex 158.42742935066227 -65.53568495720174 -10.58578643762697
+ vertex 158.58634797326016 -65.81094008581013 -11.000000000000048
+ endloop
+endfacet
+facet normal 0.39667667014561664 -0.6870641468694482 0.6087614290087234
+ outer loop
+ vertex 158.42742935066227 -65.53568495720174 -10.58578643762697
+ vertex 160.31839878082894 -64.81094008581027 -11.000000000000048
+ vertex 160.15948015823105 -64.53568495720187 -10.58578643762697
+ endloop
+endfacet
+facet normal -0.3043807145043598 0.5272028623656677 -0.7933533402912364
+ outer loop
+ vertex 146.34526659585794 -40.60876520056458 -15.41421356237314
+ vertex 144.82032256947574 -41.96748466817159 -15.732050807568926
+ vertex 144.61321578828915 -41.60876520056444 -15.41421356237314
+ endloop
+endfacet
+facet normal -0.3043807145043598 0.5272028623656677 -0.7933533402912364
+ outer loop
+ vertex 144.82032256947574 -41.96748466817159 -15.732050807568926
+ vertex 146.34526659585794 -40.60876520056458 -15.41421356237314
+ vertex 146.5523733770445 -40.96748466817174 -15.732050807568926
+ endloop
+endfacet
+facet normal 0.30438071450435567 -0.5272028623656606 0.7933533402912427
+ outer loop
+ vertex 158.42742935066227 -65.53568495720174 -10.58578643762697
+ vertex 159.9523733770445 -64.17696548959469 -10.267949192431178
+ vertex 158.2203225694757 -65.17696548959456 -10.267949192431178
+ endloop
+endfacet
+facet normal 0.30438071450435567 -0.5272028623656606 0.7933533402912427
+ outer loop
+ vertex 159.9523733770445 -64.17696548959469 -10.267949192431178
+ vertex 158.42742935066227 -65.53568495720174 -10.58578643762697
+ vertex 160.15948015823105 -64.53568495720187 -10.58578643762697
+ endloop
+endfacet
+facet normal 0.4619397662556509 -0.8001031451912783 0.3826834323650537
+ outer loop
+ vertex 160.4182992033336 -64.98397269328586 -11.482361909795022
+ vertex 158.58634797326016 -65.81094008581013 -11.000000000000048
+ vertex 158.6862483957648 -65.98397269328572 -11.482361909795022
+ endloop
+endfacet
+facet normal 0.4619397662556509 -0.8001031451912783 0.3826834323650537
+ outer loop
+ vertex 158.58634797326016 -65.81094008581013 -11.000000000000048
+ vertex 160.4182992033336 -64.98397269328586 -11.482361909795022
+ vertex 160.31839878082894 -64.81094008581027 -11.000000000000048
+ endloop
+endfacet
+facet normal 0.46193976625564825 -0.8001031451912746 -0.38268343236506525
+ outer loop
+ vertex 158.58634797326016 -65.81094008581013 -15.000000000000062
+ vertex 160.4182992033336 -64.98397269328586 -14.517638090205104
+ vertex 158.6862483957648 -65.98397269328572 -14.517638090205104
+ endloop
+endfacet
+facet normal 0.46193976625564825 -0.8001031451912746 -0.38268343236506525
+ outer loop
+ vertex 160.4182992033336 -64.98397269328586 -14.517638090205104
+ vertex 158.58634797326016 -65.81094008581013 -15.000000000000062
+ vertex 160.31839878082894 -64.81094008581027 -15.000000000000062
+ endloop
+endfacet
+facet normal 0.49572243068690375 -0.8586164364012588 -0.13052619222007125
+ outer loop
+ vertex 158.6862483957648 -65.98397269328572 -14.517638090205104
+ vertex 160.45237337704447 -65.04299089337914 -14.000000000000064
+ vertex 158.7203225694757 -66.04299089337901 -14.000000000000064
+ endloop
+endfacet
+facet normal 0.49572243068690375 -0.8586164364012588 -0.13052619222007125
+ outer loop
+ vertex 160.45237337704447 -65.04299089337914 -14.000000000000064
+ vertex 158.6862483957648 -65.98397269328572 -14.517638090205104
+ vertex 160.4182992033336 -64.98397269328586 -14.517638090205104
+ endloop
+endfacet
+facet normal -0.4957224306869052 0.8586164364012612 0.13052619222005
+ outer loop
+ vertex 146.08644755075542 -40.160477464480564 -11.482361909795
+ vertex 144.3203225694757 -41.10145926438716 -12.000000000000034
+ vertex 144.35439674318664 -41.160477464480415 -11.482361909795
+ endloop
+endfacet
+facet normal -0.4957224306869052 0.8586164364012612 0.13052619222005
+ outer loop
+ vertex 144.3203225694757 -41.10145926438716 -12.000000000000034
+ vertex 146.08644755075542 -40.160477464480564 -11.482361909795
+ vertex 146.0523733770445 -40.101459264387294 -12.000000000000034
+ endloop
+endfacet
+facet normal -0.39667667014561825 0.6870641468694507 -0.6087614290087197
+ outer loop
+ vertex 144.45429716569126 -41.33351007195603 -15.000000000000046
+ vertex 146.34526659585794 -40.60876520056458 -15.41421356237314
+ vertex 144.61321578828915 -41.60876520056444 -15.41421356237314
+ endloop
+endfacet
+facet normal -0.39667667014561825 0.6870641468694507 -0.6087614290087197
+ outer loop
+ vertex 146.34526659585794 -40.60876520056458 -15.41421356237314
+ vertex 144.45429716569126 -41.33351007195603 -15.000000000000046
+ vertex 146.18634797326004 -40.33351007195616 -15.000000000000046
+ endloop
+endfacet
+facet normal 0.30438071450435167 -0.5272028623656551 -0.7933533402912479
+ outer loop
+ vertex 159.95237337704447 -64.17696548959468 -15.732050807568942
+ vertex 158.42742935066224 -65.53568495720172 -15.414213562373158
+ vertex 158.22032256947568 -65.17696548959455 -15.732050807568942
+ endloop
+endfacet
+facet normal 0.30438071450435167 -0.5272028623656551 -0.7933533402912479
+ outer loop
+ vertex 158.42742935066224 -65.53568495720172 -15.414213562373158
+ vertex 159.95237337704447 -64.17696548959468 -15.732050807568942
+ vertex 160.15948015823102 -64.53568495720187 -15.414213562373158
+ endloop
+endfacet
+facet normal -0.06526309611002548 0.11303899832181395 -0.9914448613738106
+ outer loop
+ vertex 146.79355433194198 -41.38522233587212 -15.931851652578185
+ vertex 145.3203225694757 -42.833510071956034 -16.00000000000005
+ vertex 145.0615035243732 -42.38522233587199 -15.931851652578185
+ endloop
+endfacet
+facet normal -0.06526309611002548 0.11303899832181395 -0.9914448613738106
+ outer loop
+ vertex 145.3203225694757 -42.833510071956034 -16.00000000000005
+ vertex 146.79355433194198 -41.38522233587212 -15.931851652578185
+ vertex 147.05237337704446 -41.83351007195618 -16.00000000000005
+ endloop
+endfacet
+facet normal 0.0652630961100377 -0.11303899832183512 0.9914448613738074
+ outer loop
+ vertex 157.97914161457825 -64.75922782189413 -10.068148347421925
+ vertex 159.45237337704447 -63.310940085810266 -10.00000000000005
+ vertex 157.72032256947568 -64.31094008581013 -10.00000000000005
+ endloop
+endfacet
+facet normal 0.0652630961100377 -0.11303899832183512 0.9914448613738074
+ outer loop
+ vertex 159.45237337704447 -63.310940085810266 -10.00000000000005
+ vertex 157.97914161457825 -64.75922782189413 -10.068148347421925
+ vertex 159.711192422147 -63.75922782189427 -10.068148347421925
+ endloop
+endfacet
+facet normal 0.49999999999999994 -0.8660254037844387 9.325056343474399e-32
+ outer loop
+ vertex 160.45237337704447 -65.04299089337914 -14.000000000000064
+ vertex 158.7203225694757 -66.04299089337901 -12.000000000000052
+ vertex 158.7203225694757 -66.04299089337901 -14.000000000000064
+ endloop
+endfacet
+facet normal 0.49999999999999994 -0.8660254037844387 9.325056343474399e-32
+ outer loop
+ vertex 158.7203225694757 -66.04299089337901 -12.000000000000052
+ vertex 160.45237337704447 -65.04299089337914 -14.000000000000064
+ vertex 160.45237337704447 -65.04299089337914 -12.000000000000052
+ endloop
+endfacet
+facet normal 0.4957224306869038 -0.8586164364012585 0.1305261922200726
+ outer loop
+ vertex 160.45237337704447 -65.04299089337914 -12.000000000000052
+ vertex 158.6862483957648 -65.98397269328572 -11.482361909795022
+ vertex 158.7203225694757 -66.04299089337901 -12.000000000000052
+ endloop
+endfacet
+facet normal 0.4957224306869038 -0.8586164364012585 0.1305261922200726
+ outer loop
+ vertex 158.6862483957648 -65.98397269328572 -11.482361909795022
+ vertex 160.45237337704447 -65.04299089337914 -12.000000000000052
+ vertex 160.4182992033336 -64.98397269328586 -11.482361909795022
+ endloop
+endfacet
+facet normal 0.7933533402912313 5.384581669432008e-15 0.6087614290087258
+ outer loop
+ vertex 136.25958537772323 -106.48202726980834 -50.600000000000044
+ vertex 135.94174813252744 -104.48202726980834 -50.18578643762695
+ vertex 135.94174813252744 -106.48202726980834 -50.18578643762695
+ endloop
+endfacet
+facet normal 0.7933533402912313 5.384581669432008e-15 0.6087614290087258
+ outer loop
+ vertex 135.94174813252744 -104.48202726980834 -50.18578643762695
+ vertex 136.25958537772323 -106.48202726980834 -50.600000000000044
+ vertex 136.25958537772323 -104.48202726980834 -50.600000000000044
+ endloop
+endfacet
+facet normal 1.0 1.67088565206086e-14 -5.933957380480419e-32
+ outer loop
+ vertex 136.52753457015433 -104.48202726980836 -53.60000000000006
+ vertex 136.52753457015433 -106.48202726980834 -51.60000000000005
+ vertex 136.52753457015433 -106.48202726980834 -53.60000000000006
+ endloop
+endfacet
+facet normal 1.0 1.67088565206086e-14 -5.933957380480419e-32
+ outer loop
+ vertex 136.52753457015433 -106.48202726980834 -51.60000000000005
+ vertex 136.52753457015433 -104.48202726980836 -53.60000000000006
+ vertex 136.52753457015433 -104.48202726980836 -51.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222005016 1.7347234759768086e-16 0.9914448613738107
+ outer loop
+ vertex 134.52753457015433 -106.48202726980834 -49.600000000000044
+ vertex 135.04517266035938 -104.48202726980834 -49.668148347421905
+ vertex 134.52753457015433 -104.48202726980836 -49.600000000000044
+ endloop
+endfacet
+facet normal 0.13052619222005016 1.7347234759768086e-16 0.9914448613738107
+ outer loop
+ vertex 135.04517266035938 -104.48202726980834 -49.668148347421905
+ vertex 134.52753457015433 -106.48202726980834 -49.600000000000044
+ vertex 135.04517266035938 -106.48202726980834 -49.668148347421905
+ endloop
+endfacet
+facet normal 0.9238795325112927 -9.436895709313829e-16 -0.3826834323650756
+ outer loop
+ vertex 136.25958537772323 -104.48202726980834 -54.60000000000006
+ vertex 136.45938622273246 -106.48202726980834 -54.117638090205105
+ vertex 136.25958537772323 -106.48202726980834 -54.60000000000006
+ endloop
+endfacet
+facet normal 0.9238795325112927 -9.436895709313829e-16 -0.3826834323650756
+ outer loop
+ vertex 136.45938622273246 -106.48202726980834 -54.117638090205105
+ vertex 136.25958537772323 -104.48202726980834 -54.60000000000006
+ vertex 136.45938622273246 -104.48202726980834 -54.117638090205105
+ endloop
+endfacet
+facet normal 0.9238795325112943 -9.992007221626409e-16 0.3826834323650719
+ outer loop
+ vertex 136.45938622273246 -106.48202726980834 -51.082361909795004
+ vertex 136.25958537772323 -104.48202726980834 -50.600000000000044
+ vertex 136.25958537772323 -106.48202726980834 -50.600000000000044
+ endloop
+endfacet
+facet normal 0.9238795325112943 -9.992007221626409e-16 0.3826834323650719
+ outer loop
+ vertex 136.25958537772323 -104.48202726980834 -50.600000000000044
+ vertex 136.45938622273246 -106.48202726980834 -51.082361909795004
+ vertex 136.45938622273246 -104.48202726980834 -51.082361909795004
+ endloop
+endfacet
+facet normal 0.9914448613738096 8.937295348232509e-15 0.13052619222005787
+ outer loop
+ vertex 136.52753457015433 -106.48202726980834 -51.60000000000005
+ vertex 136.45938622273246 -104.48202726980834 -51.082361909795004
+ vertex 136.45938622273246 -106.48202726980834 -51.082361909795004
+ endloop
+endfacet
+facet normal 0.9914448613738096 8.937295348232509e-15 0.13052619222005787
+ outer loop
+ vertex 136.45938622273246 -104.48202726980834 -51.082361909795004
+ vertex 136.52753457015433 -106.48202726980834 -51.60000000000005
+ vertex 136.52753457015433 -104.48202726980836 -51.60000000000005
+ endloop
+endfacet
+facet normal 0.1305261922200502 1.804112415015878e-16 -0.9914448613738107
+ outer loop
+ vertex 135.04517266035938 -104.48202726980834 -55.531851652578204
+ vertex 134.52753457015433 -106.48202726980834 -55.600000000000065
+ vertex 134.52753457015433 -104.48202726980836 -55.600000000000065
+ endloop
+endfacet
+facet normal 0.1305261922200502 1.804112415015878e-16 -0.9914448613738107
+ outer loop
+ vertex 134.52753457015433 -106.48202726980834 -55.600000000000065
+ vertex 135.04517266035938 -104.48202726980834 -55.531851652578204
+ vertex 135.04517266035938 -106.48202726980834 -55.531851652578204
+ endloop
+endfacet
+facet normal 0.6087614290087273 6.827871601444713e-15 0.7933533402912301
+ outer loop
+ vertex 135.52753457015436 -106.48202726980834 -49.867949192431176
+ vertex 135.94174813252744 -104.48202726980834 -50.18578643762695
+ vertex 135.52753457015436 -104.48202726980831 -49.867949192431176
+ endloop
+endfacet
+facet normal 0.6087614290087273 6.827871601444713e-15 0.7933533402912301
+ outer loop
+ vertex 135.94174813252744 -104.48202726980834 -50.18578643762695
+ vertex 135.52753457015436 -106.48202726980834 -49.867949192431176
+ vertex 135.94174813252744 -106.48202726980834 -50.18578643762695
+ endloop
+endfacet
+facet normal -0.13052619222005168 -1.8041124150158809e-16 -0.9914448613738105
+ outer loop
+ vertex 109.72753457015432 -104.48202726980836 -16.00000000000006
+ vertex 109.20989647994928 -106.48202726980836 -15.931851652578198
+ vertex 109.20989647994928 -104.48202726980836 -15.931851652578198
+ endloop
+endfacet
+facet normal -0.13052619222005168 -1.8041124150158809e-16 -0.9914448613738105
+ outer loop
+ vertex 109.20989647994928 -106.48202726980836 -15.931851652578198
+ vertex 109.72753457015432 -104.48202726980836 -16.00000000000006
+ vertex 109.72753457015432 -106.48202726980836 -16.00000000000006
+ endloop
+endfacet
+facet normal -0.6087614290087192 -7.771561172376097e-16 -0.7933533402912363
+ outer loop
+ vertex 108.72753457015433 -104.48202726980834 -15.732050807568937
+ vertex 108.31332100778123 -106.48202726980836 -15.414213562373153
+ vertex 108.31332100778123 -104.48202726980836 -15.414213562373153
+ endloop
+endfacet
+facet normal -0.6087614290087192 -7.771561172376097e-16 -0.7933533402912363
+ outer loop
+ vertex 108.31332100778123 -106.48202726980836 -15.414213562373153
+ vertex 108.72753457015433 -104.48202726980834 -15.732050807568937
+ vertex 108.72753457015435 -106.48202726980836 -15.732050807568937
+ endloop
+endfacet
+facet normal 0.9914448613738134 9.43689570931383e-16 -0.13052619222003028
+ outer loop
+ vertex 136.4593862227325 -104.48202726980836 -14.517638090205098
+ vertex 136.52753457015433 -106.48202726980836 -14.000000000000059
+ vertex 136.45938622273246 -106.48202726980836 -14.517638090205098
+ endloop
+endfacet
+facet normal 0.9914448613738134 9.43689570931383e-16 -0.13052619222003028
+ outer loop
+ vertex 136.52753457015433 -106.48202726980836 -14.000000000000059
+ vertex 136.4593862227325 -104.48202726980836 -14.517638090205098
+ vertex 136.52753457015433 -104.48202726980836 -14.000000000000059
+ endloop
+endfacet
+facet normal 5.933957380480184e-32 1.4193619471206742e-31 1.0
+ outer loop
+ vertex 109.72753457015432 -106.48202726980836 -10.00000000000005
+ vertex 134.52753457015433 -104.48202726980836 -10.00000000000005
+ vertex 109.72753457015432 -104.48202726980836 -10.00000000000005
+ endloop
+endfacet
+facet normal 5.933957380480184e-32 1.4193619471206742e-31 1.0
+ outer loop
+ vertex 134.52753457015433 -104.48202726980836 -10.00000000000005
+ vertex 109.72753457015432 -106.48202726980836 -10.00000000000005
+ vertex 134.52753457015433 -106.48202726980834 -10.00000000000005
+ endloop
+endfacet
+facet normal -0.923879532511291 3.497202527569243e-15 0.3826834323650798
+ outer loop
+ vertex 107.99548376258544 -106.48202726980834 -11.000000000000048
+ vertex 107.7956829175762 -104.48202726980834 -11.482361909795012
+ vertex 107.7956829175762 -106.48202726980834 -11.482361909795012
+ endloop
+endfacet
+facet normal -0.923879532511291 3.497202527569243e-15 0.3826834323650798
+ outer loop
+ vertex 107.7956829175762 -104.48202726980834 -11.482361909795012
+ vertex 107.99548376258544 -106.48202726980834 -11.000000000000048
+ vertex 107.99548376258547 -104.48202726980834 -11.000000000000048
+ endloop
+endfacet
+facet normal -1.0 -1.443289932012703e-15 5.933957380480203e-32
+ outer loop
+ vertex 107.72753457015433 -104.48202726980836 -12.000000000000046
+ vertex 107.72753457015433 -106.48202726980836 -14.000000000000059
+ vertex 107.72753457015433 -106.48202726980836 -12.000000000000046
+ endloop
+endfacet
+facet normal -1.0 -1.443289932012703e-15 5.933957380480203e-32
+ outer loop
+ vertex 107.72753457015433 -106.48202726980836 -14.000000000000059
+ vertex 107.72753457015433 -104.48202726980836 -12.000000000000046
+ vertex 107.72753457015433 -104.48202726980836 -14.000000000000059
+ endloop
+endfacet
+facet normal -0.38268343236509555 -4.718447854656916e-16 -0.9238795325112844
+ outer loop
+ vertex 109.20989647994928 -104.48202726980836 -15.931851652578198
+ vertex 108.72753457015435 -106.48202726980836 -15.732050807568937
+ vertex 108.72753457015433 -104.48202726980834 -15.732050807568937
+ endloop
+endfacet
+facet normal -0.38268343236509555 -4.718447854656916e-16 -0.9238795325112844
+ outer loop
+ vertex 108.72753457015435 -106.48202726980836 -15.732050807568937
+ vertex 109.20989647994928 -104.48202726980836 -15.931851652578198
+ vertex 109.20989647994928 -106.48202726980836 -15.931851652578198
+ endloop
+endfacet
+facet normal 0.793353340291227 1.221245327087672e-15 -0.6087614290087313
+ outer loop
+ vertex 135.94174813252744 -104.48202726980836 -15.414213562373153
+ vertex 136.25958537772323 -106.48202726980836 -15.000000000000057
+ vertex 135.94174813252744 -106.48202726980836 -15.414213562373153
+ endloop
+endfacet
+facet normal 0.793353340291227 1.221245327087672e-15 -0.6087614290087313
+ outer loop
+ vertex 136.25958537772323 -106.48202726980836 -15.000000000000057
+ vertex 135.94174813252744 -104.48202726980836 -15.414213562373153
+ vertex 136.25958537772323 -104.48202726980836 -15.000000000000057
+ endloop
+endfacet
+facet normal -0.9238795325112887 3.5527136788005e-15 -0.38268343236508484
+ outer loop
+ vertex 107.7956829175762 -104.48202726980836 -14.517638090205098
+ vertex 107.99548376258544 -106.48202726980834 -15.000000000000057
+ vertex 107.7956829175762 -106.48202726980836 -14.517638090205098
+ endloop
+endfacet
+facet normal -0.9238795325112887 3.5527136788005e-15 -0.38268343236508484
+ outer loop
+ vertex 107.99548376258544 -106.48202726980834 -15.000000000000057
+ vertex 107.7956829175762 -104.48202726980836 -14.517638090205098
+ vertex 107.99548376258547 -104.48202726980834 -15.000000000000057
+ endloop
+endfacet
+facet normal -0.6087614290087118 -7.771561172376095e-16 0.793353340291242
+ outer loop
+ vertex 108.31332100778123 -106.48202726980836 -10.58578643762696
+ vertex 108.72753457015433 -104.48202726980834 -10.267949192431178
+ vertex 108.31332100778123 -104.48202726980836 -10.58578643762696
+ endloop
+endfacet
+facet normal -0.6087614290087118 -7.771561172376095e-16 0.793353340291242
+ outer loop
+ vertex 108.72753457015433 -104.48202726980834 -10.267949192431178
+ vertex 108.31332100778123 -106.48202726980836 -10.58578643762696
+ vertex 108.72753457015435 -106.48202726980836 -10.267949192431178
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 134.52753457015433 -104.48202726980836 -16.00000000000006
+ vertex 109.72753457015432 -106.48202726980836 -16.00000000000006
+ vertex 109.72753457015432 -104.48202726980836 -16.00000000000006
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 109.72753457015432 -106.48202726980836 -16.00000000000006
+ vertex 134.52753457015433 -104.48202726980836 -16.00000000000006
+ vertex 134.52753457015433 -106.48202726980834 -16.00000000000006
+ endloop
+endfacet
+facet normal -0.7933533402912346 1.9984014443252818e-15 0.6087614290087214
+ outer loop
+ vertex 108.31332100778123 -106.48202726980836 -10.58578643762696
+ vertex 107.99548376258547 -104.48202726980834 -11.000000000000048
+ vertex 107.99548376258544 -106.48202726980834 -11.000000000000048
+ endloop
+endfacet
+facet normal -0.7933533402912346 1.9984014443252818e-15 0.6087614290087214
+ outer loop
+ vertex 107.99548376258547 -104.48202726980834 -11.000000000000048
+ vertex 108.31332100778123 -106.48202726980836 -10.58578643762696
+ vertex 108.31332100778123 -104.48202726980836 -10.58578643762696
+ endloop
+endfacet
+facet normal -0.99144486137381 1.852639103397051e-32 0.13052619222005532
+ outer loop
+ vertex 107.7956829175762 -106.48202726980834 -11.482361909795012
+ vertex 107.72753457015433 -104.48202726980836 -12.000000000000046
+ vertex 107.72753457015433 -106.48202726980836 -12.000000000000046
+ endloop
+endfacet
+facet normal -0.99144486137381 1.852639103397051e-32 0.13052619222005532
+ outer loop
+ vertex 107.72753457015433 -104.48202726980836 -12.000000000000046
+ vertex 107.7956829175762 -106.48202726980834 -11.482361909795012
+ vertex 107.7956829175762 -104.48202726980834 -11.482361909795012
+ endloop
+endfacet
+facet normal -0.7933533402912387 1.887379141862766e-15 -0.6087614290087162
+ outer loop
+ vertex 107.99548376258547 -104.48202726980834 -15.000000000000057
+ vertex 108.31332100778123 -106.48202726980836 -15.414213562373153
+ vertex 107.99548376258544 -106.48202726980834 -15.000000000000057
+ endloop
+endfacet
+facet normal -0.7933533402912387 1.887379141862766e-15 -0.6087614290087162
+ outer loop
+ vertex 108.31332100778123 -106.48202726980836 -15.414213562373153
+ vertex 107.99548376258547 -104.48202726980834 -15.000000000000057
+ vertex 108.31332100778123 -104.48202726980836 -15.414213562373153
+ endloop
+endfacet
+facet normal 0.6087614290087198 -6.106226635438362e-16 -0.7933533402912359
+ outer loop
+ vertex 135.94174813252744 -104.48202726980836 -15.414213562373153
+ vertex 135.52753457015433 -106.48202726980834 -15.732050807568937
+ vertex 135.52753457015436 -104.48202726980836 -15.732050807568937
+ endloop
+endfacet
+facet normal 0.6087614290087198 -6.106226635438362e-16 -0.7933533402912359
+ outer loop
+ vertex 135.52753457015433 -106.48202726980834 -15.732050807568937
+ vertex 135.94174813252744 -104.48202726980836 -15.414213562373153
+ vertex 135.94174813252744 -106.48202726980836 -15.414213562373153
+ endloop
+endfacet
+facet normal -0.13052619222005152 -1.6653345369377333e-16 0.9914448613738105
+ outer loop
+ vertex 109.20989647994928 -106.48202726980836 -10.068148347421912
+ vertex 109.72753457015432 -104.48202726980836 -10.00000000000005
+ vertex 109.20989647994928 -104.48202726980836 -10.068148347421912
+ endloop
+endfacet
+facet normal -0.13052619222005152 -1.6653345369377333e-16 0.9914448613738105
+ outer loop
+ vertex 109.72753457015432 -104.48202726980836 -10.00000000000005
+ vertex 109.20989647994928 -106.48202726980836 -10.068148347421912
+ vertex 109.72753457015432 -106.48202726980836 -10.00000000000005
+ endloop
+endfacet
+facet normal -0.99144486137381 -1.1102230246251563e-16 -0.13052619222005393
+ outer loop
+ vertex 107.72753457015433 -104.48202726980836 -14.000000000000059
+ vertex 107.7956829175762 -106.48202726980836 -14.517638090205098
+ vertex 107.72753457015433 -106.48202726980836 -14.000000000000059
+ endloop
+endfacet
+facet normal -0.99144486137381 -1.1102230246251563e-16 -0.13052619222005393
+ outer loop
+ vertex 107.7956829175762 -106.48202726980836 -14.517638090205098
+ vertex 107.72753457015433 -104.48202726980836 -14.000000000000059
+ vertex 107.7956829175762 -104.48202726980836 -14.517638090205098
+ endloop
+endfacet
+facet normal -0.3826834323651044 -4.4408920985006247e-16 0.9238795325112809
+ outer loop
+ vertex 108.72753457015435 -106.48202726980836 -10.267949192431178
+ vertex 109.20989647994928 -104.48202726980836 -10.068148347421912
+ vertex 108.72753457015433 -104.48202726980834 -10.267949192431178
+ endloop
+endfacet
+facet normal -0.3826834323651044 -4.4408920985006247e-16 0.9238795325112809
+ outer loop
+ vertex 109.20989647994928 -104.48202726980836 -10.068148347421912
+ vertex 108.72753457015435 -106.48202726980836 -10.267949192431178
+ vertex 109.20989647994928 -106.48202726980836 -10.068148347421912
+ endloop
+endfacet
+facet normal 0.3826834323650936 -1.6653345369377346e-15 0.9238795325112852
+ outer loop
+ vertex 135.04517266035938 -106.48202726980836 -10.068148347421912
+ vertex 135.52753457015436 -104.48202726980834 -10.267949192431178
+ vertex 135.04517266035938 -104.48202726980834 -10.068148347421912
+ endloop
+endfacet
+facet normal 0.3826834323650936 -1.6653345369377346e-15 0.9238795325112852
+ outer loop
+ vertex 135.52753457015436 -104.48202726980834 -10.267949192431178
+ vertex 135.04517266035938 -106.48202726980836 -10.068148347421912
+ vertex 135.52753457015436 -106.48202726980836 -10.267949192431178
+ endloop
+endfacet
+facet normal 0.3826834323650984 -1.4988010832439615e-15 -0.9238795325112833
+ outer loop
+ vertex 135.52753457015436 -104.48202726980836 -15.732050807568937
+ vertex 135.04517266035938 -106.48202726980836 -15.931851652578198
+ vertex 135.04517266035938 -104.48202726980834 -15.931851652578198
+ endloop
+endfacet
+facet normal 0.3826834323650984 -1.4988010832439615e-15 -0.9238795325112833
+ outer loop
+ vertex 135.04517266035938 -106.48202726980836 -15.931851652578198
+ vertex 135.52753457015436 -104.48202726980836 -15.732050807568937
+ vertex 135.52753457015433 -106.48202726980834 -15.732050807568937
+ endloop
+endfacet
+facet normal 0.6087614290087225 2.109423746787797e-15 0.7933533402912337
+ outer loop
+ vertex 135.52753457015436 -106.48202726980836 -10.267949192431178
+ vertex 135.94174813252744 -104.48202726980836 -10.58578643762696
+ vertex 135.52753457015436 -104.48202726980834 -10.267949192431178
+ endloop
+endfacet
+facet normal 0.6087614290087225 2.109423746787797e-15 0.7933533402912337
+ outer loop
+ vertex 135.94174813252744 -104.48202726980836 -10.58578643762696
+ vertex 135.52753457015436 -106.48202726980836 -10.267949192431178
+ vertex 135.94174813252744 -106.48202726980836 -10.58578643762696
+ endloop
+endfacet
+facet normal 0.13052619222004924 -1.8041124150158809e-16 -0.9914448613738107
+ outer loop
+ vertex 135.04517266035938 -104.48202726980834 -15.931851652578198
+ vertex 134.52753457015433 -106.48202726980834 -16.00000000000006
+ vertex 134.52753457015433 -104.48202726980836 -16.00000000000006
+ endloop
+endfacet
+facet normal 0.13052619222004924 -1.8041124150158809e-16 -0.9914448613738107
+ outer loop
+ vertex 134.52753457015433 -106.48202726980834 -16.00000000000006
+ vertex 135.04517266035938 -104.48202726980834 -15.931851652578198
+ vertex 135.04517266035938 -106.48202726980836 -15.931851652578198
+ endloop
+endfacet
+facet normal 0.7933533402912321 4.940492459581946e-15 0.6087614290087248
+ outer loop
+ vertex 136.25958537772323 -106.48202726980836 -11.000000000000048
+ vertex 135.94174813252744 -104.48202726980836 -10.58578643762696
+ vertex 135.94174813252744 -106.48202726980836 -10.58578643762696
+ endloop
+endfacet
+facet normal 0.7933533402912321 4.940492459581946e-15 0.6087614290087248
+ outer loop
+ vertex 135.94174813252744 -104.48202726980836 -10.58578643762696
+ vertex 136.25958537772323 -106.48202726980836 -11.000000000000048
+ vertex 136.25958537772323 -104.48202726980836 -11.000000000000048
+ endloop
+endfacet
+facet normal 0.9914448613738134 9.43689570931383e-16 0.13052619222003028
+ outer loop
+ vertex 136.52753457015433 -106.48202726980836 -12.000000000000046
+ vertex 136.4593862227325 -104.48202726980836 -11.482361909795012
+ vertex 136.45938622273246 -106.48202726980836 -11.482361909795012
+ endloop
+endfacet
+facet normal 0.9914448613738134 9.43689570931383e-16 0.13052619222003028
+ outer loop
+ vertex 136.4593862227325 -104.48202726980836 -11.482361909795012
+ vertex 136.52753457015433 -106.48202726980836 -12.000000000000046
+ vertex 136.52753457015433 -104.48202726980836 -12.000000000000046
+ endloop
+endfacet
+facet normal 0.1305261922200492 -1.804112415015878e-16 0.9914448613738107
+ outer loop
+ vertex 134.52753457015433 -106.48202726980834 -10.00000000000005
+ vertex 135.04517266035938 -104.48202726980834 -10.068148347421912
+ vertex 134.52753457015433 -104.48202726980836 -10.00000000000005
+ endloop
+endfacet
+facet normal 0.1305261922200492 -1.804112415015878e-16 0.9914448613738107
+ outer loop
+ vertex 135.04517266035938 -104.48202726980834 -10.068148347421912
+ vertex 134.52753457015433 -106.48202726980834 -10.00000000000005
+ vertex 135.04517266035938 -106.48202726980836 -10.068148347421912
+ endloop
+endfacet
+facet normal 0.9238795325112855 -1.3322676295501875e-15 -0.3826834323650928
+ outer loop
+ vertex 136.25958537772323 -104.48202726980836 -15.000000000000057
+ vertex 136.45938622273246 -106.48202726980836 -14.517638090205098
+ vertex 136.25958537772323 -106.48202726980836 -15.000000000000057
+ endloop
+endfacet
+facet normal 0.9238795325112855 -1.3322676295501875e-15 -0.3826834323650928
+ outer loop
+ vertex 136.45938622273246 -106.48202726980836 -14.517638090205098
+ vertex 136.25958537772323 -104.48202726980836 -15.000000000000057
+ vertex 136.4593862227325 -104.48202726980836 -14.517638090205098
+ endloop
+endfacet
+facet normal 1.0 6.272760089132133e-15 1.3714293846086423e-29
+ outer loop
+ vertex 136.52753457015433 -104.48202726980836 -14.000000000000059
+ vertex 136.52753457015433 -106.48202726980836 -12.000000000000046
+ vertex 136.52753457015433 -106.48202726980836 -14.000000000000059
+ endloop
+endfacet
+facet normal 1.0 6.272760089132133e-15 1.3714293846086423e-29
+ outer loop
+ vertex 136.52753457015433 -106.48202726980836 -12.000000000000046
+ vertex 136.52753457015433 -104.48202726980836 -14.000000000000059
+ vertex 136.52753457015433 -104.48202726980836 -12.000000000000046
+ endloop
+endfacet
+facet normal 0.923879532511287 -1.2767564783189294e-15 0.38268343236508906
+ outer loop
+ vertex 136.45938622273246 -106.48202726980836 -11.482361909795012
+ vertex 136.25958537772323 -104.48202726980836 -11.000000000000048
+ vertex 136.25958537772323 -106.48202726980836 -11.000000000000048
+ endloop
+endfacet
+facet normal 0.923879532511287 -1.2767564783189294e-15 0.38268343236508906
+ outer loop
+ vertex 136.25958537772323 -104.48202726980836 -11.000000000000048
+ vertex 136.45938622273246 -106.48202726980836 -11.482361909795012
+ vertex 136.4593862227325 -104.48202726980836 -11.482361909795012
+ endloop
+endfacet
+facet normal 5.933957380480184e-32 1.4193619471206742e-31 1.0
+ outer loop
+ vertex 109.72753457015432 -106.48202726980834 -49.600000000000044
+ vertex 134.52753457015433 -104.48202726980836 -49.600000000000044
+ vertex 109.72753457015432 -104.48202726980834 -49.600000000000044
+ endloop
+endfacet
+facet normal 5.933957380480184e-32 1.4193619471206742e-31 1.0
+ outer loop
+ vertex 134.52753457015433 -104.48202726980836 -49.600000000000044
+ vertex 109.72753457015432 -106.48202726980834 -49.600000000000044
+ vertex 134.52753457015433 -106.48202726980834 -49.600000000000044
+ endloop
+endfacet
+facet normal -0.6087614290087187 -7.771561172376097e-16 -0.7933533402912368
+ outer loop
+ vertex 108.72753457015433 -104.48202726980834 -55.33205080756894
+ vertex 108.31332100778123 -106.48202726980834 -55.01421356237316
+ vertex 108.31332100778123 -104.48202726980834 -55.01421356237316
+ endloop
+endfacet
+facet normal -0.6087614290087187 -7.771561172376097e-16 -0.7933533402912368
+ outer loop
+ vertex 108.31332100778123 -106.48202726980834 -55.01421356237316
+ vertex 108.72753457015433 -104.48202726980834 -55.33205080756894
+ vertex 108.72753457015433 -106.48202726980834 -55.33205080756894
+ endloop
+endfacet
+facet normal 0.9914448613738096 8.826273045769993e-15 -0.13052619222005787
+ outer loop
+ vertex 136.45938622273246 -104.48202726980834 -54.117638090205105
+ vertex 136.52753457015433 -106.48202726980834 -53.60000000000006
+ vertex 136.45938622273246 -106.48202726980834 -54.117638090205105
+ endloop
+endfacet
+facet normal 0.9914448613738096 8.826273045769993e-15 -0.13052619222005787
+ outer loop
+ vertex 136.52753457015433 -106.48202726980834 -53.60000000000006
+ vertex 136.45938622273246 -104.48202726980834 -54.117638090205105
+ vertex 136.52753457015433 -104.48202726980836 -53.60000000000006
+ endloop
+endfacet
+facet normal -0.13052619222005155 -2.0122792321330977e-16 -0.9914448613738105
+ outer loop
+ vertex 109.72753457015432 -104.48202726980834 -55.600000000000065
+ vertex 109.20989647994928 -106.48202726980834 -55.531851652578204
+ vertex 109.20989647994928 -104.48202726980836 -55.531851652578204
+ endloop
+endfacet
+facet normal -0.13052619222005155 -2.0122792321330977e-16 -0.9914448613738105
+ outer loop
+ vertex 109.20989647994928 -106.48202726980834 -55.531851652578204
+ vertex 109.72753457015432 -104.48202726980834 -55.600000000000065
+ vertex 109.72753457015432 -106.48202726980834 -55.600000000000065
+ endloop
+endfacet
+facet normal -1.0 -1.443289932012703e-15 5.933957380480203e-32
+ outer loop
+ vertex 107.72753457015433 -104.48202726980834 -51.60000000000005
+ vertex 107.72753457015433 -106.48202726980834 -53.60000000000006
+ vertex 107.72753457015433 -106.48202726980834 -51.60000000000005
+ endloop
+endfacet
+facet normal -1.0 -1.443289932012703e-15 5.933957380480203e-32
+ outer loop
+ vertex 107.72753457015433 -106.48202726980834 -53.60000000000006
+ vertex 107.72753457015433 -104.48202726980834 -51.60000000000005
+ vertex 107.72753457015433 -104.48202726980834 -53.60000000000006
+ endloop
+endfacet
+facet normal -0.7933533402912323 2.997602166487922e-15 0.6087614290087243
+ outer loop
+ vertex 108.31332100778123 -106.48202726980834 -50.18578643762695
+ vertex 107.99548376258547 -104.48202726980834 -50.600000000000044
+ vertex 107.99548376258544 -106.48202726980834 -50.600000000000044
+ endloop
+endfacet
+facet normal -0.7933533402912323 2.997602166487922e-15 0.6087614290087243
+ outer loop
+ vertex 107.99548376258547 -104.48202726980834 -50.600000000000044
+ vertex 108.31332100778123 -106.48202726980834 -50.18578643762695
+ vertex 108.31332100778123 -104.48202726980834 -50.18578643762695
+ endloop
+endfacet
+facet normal 0.793353340291221 -7.771561172376097e-16 -0.6087614290087392
+ outer loop
+ vertex 135.94174813252744 -104.48202726980834 -55.01421356237316
+ vertex 136.25958537772323 -106.48202726980834 -54.60000000000006
+ vertex 135.94174813252744 -106.48202726980834 -55.01421356237316
+ endloop
+endfacet
+facet normal 0.793353340291221 -7.771561172376097e-16 -0.6087614290087392
+ outer loop
+ vertex 136.25958537772323 -106.48202726980834 -54.60000000000006
+ vertex 135.94174813252744 -104.48202726980834 -55.01421356237316
+ vertex 136.25958537772323 -104.48202726980834 -54.60000000000006
+ endloop
+endfacet
+facet normal -0.6087614290087113 -7.216449660063515e-16 0.7933533402912423
+ outer loop
+ vertex 108.31332100778123 -106.48202726980834 -50.18578643762695
+ vertex 108.72753457015433 -104.48202726980834 -49.867949192431176
+ vertex 108.31332100778123 -104.48202726980834 -50.18578643762695
+ endloop
+endfacet
+facet normal -0.6087614290087113 -7.216449660063515e-16 0.7933533402912423
+ outer loop
+ vertex 108.72753457015433 -104.48202726980834 -49.867949192431176
+ vertex 108.31332100778123 -106.48202726980834 -50.18578643762695
+ vertex 108.72753457015433 -106.48202726980834 -49.867949192431176
+ endloop
+endfacet
+facet normal -0.38268343236509555 -4.996003610813205e-16 -0.9238795325112844
+ outer loop
+ vertex 109.20989647994928 -104.48202726980836 -55.531851652578204
+ vertex 108.72753457015433 -106.48202726980834 -55.33205080756894
+ vertex 108.72753457015433 -104.48202726980834 -55.33205080756894
+ endloop
+endfacet
+facet normal -0.38268343236509555 -4.996003610813205e-16 -0.9238795325112844
+ outer loop
+ vertex 108.72753457015433 -106.48202726980834 -55.33205080756894
+ vertex 109.20989647994928 -104.48202726980836 -55.531851652578204
+ vertex 109.20989647994928 -106.48202726980834 -55.531851652578204
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 134.52753457015433 -104.48202726980836 -55.600000000000065
+ vertex 109.72753457015432 -106.48202726980834 -55.600000000000065
+ vertex 109.72753457015432 -104.48202726980834 -55.600000000000065
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 109.72753457015432 -106.48202726980834 -55.600000000000065
+ vertex 134.52753457015433 -104.48202726980836 -55.600000000000065
+ vertex 134.52753457015433 -106.48202726980834 -55.600000000000065
+ endloop
+endfacet
+facet normal -0.9238795325112925 4.7184478546569145e-15 0.38268343236507574
+ outer loop
+ vertex 107.99548376258544 -106.48202726980834 -50.600000000000044
+ vertex 107.7956829175762 -104.48202726980834 -51.082361909795004
+ vertex 107.79568291757619 -106.48202726980834 -51.082361909795004
+ endloop
+endfacet
+facet normal -0.9238795325112925 4.7184478546569145e-15 0.38268343236507574
+ outer loop
+ vertex 107.7956829175762 -104.48202726980834 -51.082361909795004
+ vertex 107.99548376258544 -106.48202726980834 -50.600000000000044
+ vertex 107.99548376258547 -104.48202726980834 -50.600000000000044
+ endloop
+endfacet
+facet normal -0.99144486137381 1.8526391033970518e-32 0.13052619222005538
+ outer loop
+ vertex 107.79568291757619 -106.48202726980834 -51.082361909795004
+ vertex 107.72753457015433 -104.48202726980834 -51.60000000000005
+ vertex 107.72753457015433 -106.48202726980834 -51.60000000000005
+ endloop
+endfacet
+facet normal -0.99144486137381 1.8526391033970518e-32 0.13052619222005538
+ outer loop
+ vertex 107.72753457015433 -104.48202726980834 -51.60000000000005
+ vertex 107.79568291757619 -106.48202726980834 -51.082361909795004
+ vertex 107.7956829175762 -104.48202726980834 -51.082361909795004
+ endloop
+endfacet
+facet normal -0.7933533402912363 2.8310687127941484e-15 -0.6087614290087192
+ outer loop
+ vertex 107.99548376258547 -104.48202726980834 -54.60000000000006
+ vertex 108.31332100778123 -106.48202726980834 -55.01421356237316
+ vertex 107.99548376258544 -106.48202726980834 -54.60000000000006
+ endloop
+endfacet
+facet normal -0.7933533402912363 2.8310687127941484e-15 -0.6087614290087192
+ outer loop
+ vertex 108.31332100778123 -106.48202726980834 -55.01421356237316
+ vertex 107.99548376258547 -104.48202726980834 -54.60000000000006
+ vertex 108.31332100778123 -104.48202726980834 -55.01421356237316
+ endloop
+endfacet
+facet normal -0.1305261922200514 -2.0122792321330948e-16 0.9914448613738105
+ outer loop
+ vertex 109.20989647994928 -106.48202726980834 -49.668148347421905
+ vertex 109.72753457015432 -104.48202726980834 -49.600000000000044
+ vertex 109.20989647994928 -104.48202726980836 -49.668148347421905
+ endloop
+endfacet
+facet normal -0.1305261922200514 -2.0122792321330948e-16 0.9914448613738105
+ outer loop
+ vertex 109.72753457015432 -104.48202726980834 -49.600000000000044
+ vertex 109.20989647994928 -106.48202726980834 -49.668148347421905
+ vertex 109.72753457015432 -106.48202726980834 -49.600000000000044
+ endloop
+endfacet
+facet normal -0.99144486137381 -1.1102230246251563e-16 -0.13052619222005393
+ outer loop
+ vertex 107.72753457015433 -104.48202726980834 -53.60000000000006
+ vertex 107.79568291757619 -106.48202726980834 -54.117638090205105
+ vertex 107.72753457015433 -106.48202726980834 -53.60000000000006
+ endloop
+endfacet
+facet normal -0.99144486137381 -1.1102230246251563e-16 -0.13052619222005393
+ outer loop
+ vertex 107.79568291757619 -106.48202726980834 -54.117638090205105
+ vertex 107.72753457015433 -104.48202726980834 -53.60000000000006
+ vertex 107.7956829175762 -104.48202726980834 -54.117638090205105
+ endloop
+endfacet
+facet normal 0.38268343236509017 1.2767564783189302e-15 0.9238795325112867
+ outer loop
+ vertex 135.04517266035938 -106.48202726980834 -49.668148347421905
+ vertex 135.52753457015436 -104.48202726980831 -49.867949192431176
+ vertex 135.04517266035938 -104.48202726980834 -49.668148347421905
+ endloop
+endfacet
+facet normal 0.38268343236509017 1.2767564783189302e-15 0.9238795325112867
+ outer loop
+ vertex 135.52753457015436 -104.48202726980831 -49.867949192431176
+ vertex 135.04517266035938 -106.48202726980834 -49.668148347421905
+ vertex 135.52753457015436 -106.48202726980834 -49.867949192431176
+ endloop
+endfacet
+facet normal -0.9238795325112904 4.8294701571194286e-15 -0.38268343236508084
+ outer loop
+ vertex 107.7956829175762 -104.48202726980834 -54.117638090205105
+ vertex 107.99548376258544 -106.48202726980834 -54.60000000000006
+ vertex 107.79568291757619 -106.48202726980834 -54.117638090205105
+ endloop
+endfacet
+facet normal -0.9238795325112904 4.8294701571194286e-15 -0.38268343236508084
+ outer loop
+ vertex 107.99548376258544 -106.48202726980834 -54.60000000000006
+ vertex 107.7956829175762 -104.48202726980834 -54.117638090205105
+ vertex 107.99548376258547 -104.48202726980834 -54.60000000000006
+ endloop
+endfacet
+facet normal 0.6087614290087294 -6.106226635438361e-16 -0.7933533402912284
+ outer loop
+ vertex 135.94174813252744 -104.48202726980834 -55.01421356237316
+ vertex 135.52753457015433 -106.48202726980831 -55.33205080756894
+ vertex 135.52753457015436 -104.48202726980834 -55.33205080756894
+ endloop
+endfacet
+facet normal 0.6087614290087294 -6.106226635438361e-16 -0.7933533402912284
+ outer loop
+ vertex 135.52753457015433 -106.48202726980831 -55.33205080756894
+ vertex 135.94174813252744 -104.48202726980834 -55.01421356237316
+ vertex 135.94174813252744 -106.48202726980834 -55.01421356237316
+ endloop
+endfacet
+facet normal -0.3826834323651044 -4.996003610813202e-16 0.9238795325112806
+ outer loop
+ vertex 108.72753457015433 -106.48202726980834 -49.867949192431176
+ vertex 109.20989647994928 -104.48202726980836 -49.668148347421905
+ vertex 108.72753457015433 -104.48202726980834 -49.867949192431176
+ endloop
+endfacet
+facet normal -0.3826834323651044 -4.996003610813202e-16 0.9238795325112806
+ outer loop
+ vertex 109.20989647994928 -104.48202726980836 -49.668148347421905
+ vertex 108.72753457015433 -106.48202726980834 -49.867949192431176
+ vertex 109.20989647994928 -106.48202726980834 -49.668148347421905
+ endloop
+endfacet
+facet normal 0.38268343236509444 -4.1633363423443385e-16 -0.9238795325112849
+ outer loop
+ vertex 135.52753457015436 -104.48202726980834 -55.33205080756894
+ vertex 135.04517266035938 -106.48202726980834 -55.531851652578204
+ vertex 135.04517266035938 -104.48202726980834 -55.531851652578204
+ endloop
+endfacet
+facet normal 0.38268343236509444 -4.1633363423443385e-16 -0.9238795325112849
+ outer loop
+ vertex 135.04517266035938 -106.48202726980834 -55.531851652578204
+ vertex 135.52753457015436 -104.48202726980834 -55.33205080756894
+ vertex 135.52753457015433 -106.48202726980831 -55.33205080756894
+ endloop
+endfacet
+facet normal 0.4999999999999991 -0.8660254037844393 -2.823841496478738e-16
+ outer loop
+ vertex 136.70622095433785 -35.913448412976436 -39.80000000000007
+ vertex 140.17032256947556 -33.913448412976486 -25.800000000000065
+ vertex 136.70622095433782 -35.91344841297645 -25.800000000000065
+ endloop
+endfacet
+facet normal 0.4999999999999991 -0.8660254037844393 -2.823841496478738e-16
+ outer loop
+ vertex 140.17032256947556 -33.913448412976486 -25.800000000000065
+ vertex 136.70622095433785 -35.913448412976436 -39.80000000000007
+ vertex 140.1703225694756 -33.913448412976464 -39.80000000000006
+ endloop
+endfacet
+facet normal 0.4957224306869044 -0.8586164364012618 -0.1305261922200486
+ outer loop
+ vertex 136.70622095433782 -35.91344841297645 -25.800000000000065
+ vertex 140.22143383004195 -34.00197571311637 -25.0235428646925
+ vertex 136.75733221490424 -36.00197571311634 -25.0235428646925
+ endloop
+endfacet
+facet normal 0.4957224306869044 -0.8586164364012618 -0.1305261922200486
+ outer loop
+ vertex 140.22143383004195 -34.00197571311637 -25.0235428646925
+ vertex 136.70622095433782 -35.91344841297645 -25.800000000000065
+ vertex 140.17032256947556 -33.913448412976486 -25.800000000000065
+ endloop
+endfacet
+facet normal 0.4619397662556412 -0.8001031451912637 -0.38268343236509644
+ outer loop
+ vertex 136.75733221490424 -36.00197571311634 -25.0235428646925
+ vertex 140.3712844637989 -34.2615246243298 -24.300000000000068
+ vertex 136.90718284866117 -36.261524624329766 -24.300000000000068
+ endloop
+endfacet
+facet normal 0.4619397662556412 -0.8001031451912637 -0.38268343236509644
+ outer loop
+ vertex 140.3712844637989 -34.2615246243298 -24.300000000000068
+ vertex 136.75733221490424 -36.00197571311634 -25.0235428646925
+ vertex 140.22143383004195 -34.00197571311637 -25.0235428646925
+ endloop
+endfacet
+facet normal 0.3966766701456187 -0.6870641468694537 -0.6087614290087159
+ outer loop
+ vertex 136.90718284866117 -36.261524624329766 -24.300000000000068
+ vertex 140.60966239769573 -34.67440731724242 -23.678679656440423
+ vertex 137.14556078255802 -36.674407317242384 -23.678679656440423
+ endloop
+endfacet
+facet normal 0.3966766701456187 -0.6870641468694537 -0.6087614290087159
+ outer loop
+ vertex 140.60966239769573 -34.67440731724242 -23.678679656440423
+ vertex 136.90718284866117 -36.261524624329766 -24.300000000000068
+ vertex 140.3712844637989 -34.2615246243298 -24.300000000000068
+ endloop
+endfacet
+facet normal 0.30438071450436033 -0.5272028623656704 -0.7933533402912344
+ outer loop
+ vertex 140.60966239769573 -34.67440731724242 -23.678679656440423
+ vertex 137.45622095433782 -37.2124865186531 -23.20192378864675
+ vertex 137.14556078255802 -36.674407317242384 -23.678679656440423
+ endloop
+endfacet
+facet normal 0.30438071450436033 -0.5272028623656704 -0.7933533402912344
+ outer loop
+ vertex 137.45622095433782 -37.2124865186531 -23.20192378864675
+ vertex 140.60966239769573 -34.67440731724242 -23.678679656440423
+ vertex 140.92032256947556 -35.21248651865314 -23.20192378864675
+ endloop
+endfacet
+facet normal 0.19134171618254409 -0.3314135740355912 -0.9238795325112871
+ outer loop
+ vertex 140.92032256947556 -35.21248651865314 -23.20192378864675
+ vertex 137.81799238668407 -37.83909302020372 -22.90222252113286
+ vertex 137.45622095433782 -37.2124865186531 -23.20192378864675
+ endloop
+endfacet
+facet normal 0.19134171618254409 -0.3314135740355912 -0.9238795325112871
+ outer loop
+ vertex 137.81799238668407 -37.83909302020372 -22.90222252113286
+ vertex 140.92032256947556 -35.21248651865314 -23.20192378864675
+ vertex 141.2820940018218 -35.83909302020374 -22.90222252113286
+ endloop
+endfacet
+facet normal 0.06526309611002502 -0.11303899832181424 -0.9914448613738106
+ outer loop
+ vertex 141.2820940018218 -35.83909302020374 -22.90222252113286
+ vertex 138.20622095433785 -38.51152462432976 -22.800000000000065
+ vertex 137.81799238668407 -37.83909302020372 -22.90222252113286
+ endloop
+endfacet
+facet normal 0.06526309611002502 -0.11303899832181424 -0.9914448613738106
+ outer loop
+ vertex 138.20622095433785 -38.51152462432976 -22.800000000000065
+ vertex 141.2820940018218 -35.83909302020374 -22.90222252113286
+ vertex 141.6703225694756 -36.5115246243298 -22.800000000000065
+ endloop
+endfacet
+facet normal -0.06526309611002565 0.11303899832181558 -0.9914448613738105
+ outer loop
+ vertex 141.6703225694756 -36.5115246243298 -22.800000000000065
+ vertex 138.59444952199163 -39.183956228455806 -22.90222252113286
+ vertex 138.20622095433785 -38.51152462432976 -22.800000000000065
+ endloop
+endfacet
+facet normal -0.06526309611002565 0.11303899832181558 -0.9914448613738105
+ outer loop
+ vertex 138.59444952199163 -39.183956228455806 -22.90222252113286
+ vertex 141.6703225694756 -36.5115246243298 -22.800000000000065
+ vertex 142.05855113712937 -37.18395622845585 -22.90222252113286
+ endloop
+endfacet
+facet normal -0.1913417161825425 0.3314135740355887 -0.9238795325112884
+ outer loop
+ vertex 142.05855113712937 -37.18395622845585 -22.90222252113286
+ vertex 138.95622095433782 -39.81056273000644 -23.20192378864675
+ vertex 138.59444952199163 -39.183956228455806 -22.90222252113286
+ endloop
+endfacet
+facet normal -0.1913417161825425 0.3314135740355887 -0.9238795325112884
+ outer loop
+ vertex 138.95622095433782 -39.81056273000644 -23.20192378864675
+ vertex 142.05855113712937 -37.18395622845585 -22.90222252113286
+ vertex 142.42032256947556 -37.810562730006474 -23.20192378864675
+ endloop
+endfacet
+facet normal -0.30438071450436105 0.5272028623656717 -0.7933533402912333
+ outer loop
+ vertex 142.42032256947556 -37.810562730006474 -23.20192378864675
+ vertex 139.26688112611768 -40.34864193141716 -23.678679656440423
+ vertex 138.95622095433782 -39.81056273000644 -23.20192378864675
+ endloop
+endfacet
+facet normal -0.30438071450436105 0.5272028623656717 -0.7933533402912333
+ outer loop
+ vertex 139.26688112611768 -40.34864193141716 -23.678679656440423
+ vertex 142.42032256947556 -37.810562730006474 -23.20192378864675
+ vertex 142.7309827412554 -38.348641931417184 -23.678679656440423
+ endloop
+endfacet
+facet normal -0.396676670145618 0.6870641468694528 -0.6087614290087173
+ outer loop
+ vertex 139.26688112611768 -40.34864193141716 -23.678679656440423
+ vertex 142.96936067515222 -38.761524624329795 -24.30000000000006
+ vertex 139.5052590600145 -40.76152462432976 -24.30000000000006
+ endloop
+endfacet
+facet normal -0.396676670145618 0.6870641468694528 -0.6087614290087173
+ outer loop
+ vertex 142.96936067515222 -38.761524624329795 -24.30000000000006
+ vertex 139.26688112611768 -40.34864193141716 -23.678679656440423
+ vertex 142.7309827412554 -38.348641931417184 -23.678679656440423
+ endloop
+endfacet
+facet normal -0.4619397662556417 0.8001031451912646 -0.38268343236509383
+ outer loop
+ vertex 139.5052590600145 -40.76152462432976 -24.30000000000006
+ vertex 143.11921130890917 -39.02107353554322 -25.0235428646925
+ vertex 139.65510969377144 -41.0210735355432 -25.0235428646925
+ endloop
+endfacet
+facet normal -0.4619397662556417 0.8001031451912646 -0.38268343236509383
+ outer loop
+ vertex 143.11921130890917 -39.02107353554322 -25.0235428646925
+ vertex 139.5052590600145 -40.76152462432976 -24.30000000000006
+ vertex 142.96936067515222 -38.761524624329795 -24.30000000000006
+ endloop
+endfacet
+facet normal -0.49572243068690414 0.8586164364012612 -0.13052619222005474
+ outer loop
+ vertex 139.65510969377144 -41.0210735355432 -25.0235428646925
+ vertex 143.1703225694756 -39.109600835683125 -25.800000000000065
+ vertex 139.70622095433788 -41.109600835683096 -25.800000000000065
+ endloop
+endfacet
+facet normal -0.49572243068690414 0.8586164364012612 -0.13052619222005474
+ outer loop
+ vertex 143.1703225694756 -39.109600835683125 -25.800000000000065
+ vertex 139.65510969377144 -41.0210735355432 -25.0235428646925
+ vertex 143.11921130890917 -39.02107353554322 -25.0235428646925
+ endloop
+endfacet
+facet normal -0.4999999999999991 0.8660254037844393 3.488803731010178e-16
+ outer loop
+ vertex 143.1703225694756 -39.109600835683125 -25.800000000000065
+ vertex 139.70622095433785 -41.10960083568308 -39.80000000000007
+ vertex 139.70622095433788 -41.109600835683096 -25.800000000000065
+ endloop
+endfacet
+facet normal -0.4999999999999991 0.8660254037844393 3.488803731010178e-16
+ outer loop
+ vertex 139.70622095433785 -41.10960083568308 -39.80000000000007
+ vertex 143.1703225694756 -39.109600835683125 -25.800000000000065
+ vertex 143.1703225694756 -39.109600835683125 -39.80000000000006
+ endloop
+endfacet
+facet normal -0.49572243068690447 0.8586164364012617 0.13052619222004905
+ outer loop
+ vertex 143.1703225694756 -39.109600835683125 -39.80000000000006
+ vertex 139.65510969377144 -41.0210735355432 -40.57645713530763
+ vertex 139.70622095433785 -41.10960083568308 -39.80000000000007
+ endloop
+endfacet
+facet normal -0.49572243068690447 0.8586164364012617 0.13052619222004905
+ outer loop
+ vertex 139.65510969377144 -41.0210735355432 -40.57645713530763
+ vertex 143.1703225694756 -39.109600835683125 -39.80000000000006
+ vertex 143.11921130890917 -39.02107353554322 -40.57645713530763
+ endloop
+endfacet
+facet normal -0.4619397662556417 0.8001031451912646 0.38268343236509383
+ outer loop
+ vertex 143.11921130890917 -39.02107353554322 -40.57645713530763
+ vertex 139.5052590600145 -40.76152462432976 -41.30000000000007
+ vertex 139.65510969377144 -41.0210735355432 -40.57645713530763
+ endloop
+endfacet
+facet normal -0.4619397662556417 0.8001031451912646 0.38268343236509383
+ outer loop
+ vertex 139.5052590600145 -40.76152462432976 -41.30000000000007
+ vertex 143.11921130890917 -39.02107353554322 -40.57645713530763
+ vertex 142.96936067515222 -38.761524624329795 -41.30000000000007
+ endloop
+endfacet
+facet normal -0.39667667014561814 0.6870641468694526 0.6087614290087177
+ outer loop
+ vertex 142.96936067515222 -38.761524624329795 -41.30000000000007
+ vertex 139.26688112611765 -40.348641931417156 -41.921320343559714
+ vertex 139.5052590600145 -40.76152462432976 -41.30000000000007
+ endloop
+endfacet
+facet normal -0.39667667014561814 0.6870641468694526 0.6087614290087177
+ outer loop
+ vertex 139.26688112611765 -40.348641931417156 -41.921320343559714
+ vertex 142.96936067515222 -38.761524624329795 -41.30000000000007
+ vertex 142.7309827412554 -38.348641931417184 -41.921320343559714
+ endloop
+endfacet
+facet normal -0.30438071450436 0.5272028623656697 0.7933533402912349
+ outer loop
+ vertex 139.26688112611765 -40.348641931417156 -41.921320343559714
+ vertex 142.42032256947556 -37.81056273000646 -42.39807621135338
+ vertex 138.95622095433782 -39.81056273000644 -42.398076211353384
+ endloop
+endfacet
+facet normal -0.30438071450436 0.5272028623656697 0.7933533402912349
+ outer loop
+ vertex 142.42032256947556 -37.81056273000646 -42.39807621135338
+ vertex 139.26688112611765 -40.348641931417156 -41.921320343559714
+ vertex 142.7309827412554 -38.348641931417184 -41.921320343559714
+ endloop
+endfacet
+facet normal -0.1913417161825457 0.3314135740355939 0.9238795325112859
+ outer loop
+ vertex 138.95622095433782 -39.81056273000644 -42.398076211353384
+ vertex 142.05855113712934 -37.183956228455855 -42.697777478867266
+ vertex 138.5944495219916 -39.18395622845583 -42.69777747886727
+ endloop
+endfacet
+facet normal -0.1913417161825457 0.3314135740355939 0.9238795325112859
+ outer loop
+ vertex 142.05855113712934 -37.183956228455855 -42.697777478867266
+ vertex 138.95622095433782 -39.81056273000644 -42.398076211353384
+ vertex 142.42032256947556 -37.81056273000646 -42.39807621135338
+ endloop
+endfacet
+facet normal -0.06526309611002462 0.11303899832181355 0.9914448613738108
+ outer loop
+ vertex 138.5944495219916 -39.18395622845583 -42.69777747886727
+ vertex 141.67032256947556 -36.5115246243298 -42.80000000000007
+ vertex 138.20622095433785 -38.51152462432976 -42.80000000000007
+ endloop
+endfacet
+facet normal -0.06526309611002462 0.11303899832181355 0.9914448613738108
+ outer loop
+ vertex 141.67032256947556 -36.5115246243298 -42.80000000000007
+ vertex 138.5944495219916 -39.18395622845583 -42.69777747886727
+ vertex 142.05855113712934 -37.183956228455855 -42.697777478867266
+ endloop
+endfacet
+facet normal 0.06526309611002604 -0.11303899832181624 0.9914448613738103
+ outer loop
+ vertex 138.20622095433785 -38.51152462432976 -42.80000000000007
+ vertex 141.28209400182178 -35.83909302020376 -42.697777478867266
+ vertex 137.81799238668404 -37.83909302020373 -42.69777747886727
+ endloop
+endfacet
+facet normal 0.06526309611002604 -0.11303899832181624 0.9914448613738103
+ outer loop
+ vertex 141.28209400182178 -35.83909302020376 -42.697777478867266
+ vertex 138.20622095433785 -38.51152462432976 -42.80000000000007
+ vertex 141.67032256947556 -36.5115246243298 -42.80000000000007
+ endloop
+endfacet
+facet normal 0.1913417161825425 -0.3314135740355887 0.9238795325112884
+ outer loop
+ vertex 137.81799238668404 -37.83909302020373 -42.69777747886727
+ vertex 140.92032256947556 -35.21248651865313 -42.398076211353384
+ vertex 137.45622095433782 -37.2124865186531 -42.398076211353384
+ endloop
+endfacet
+facet normal 0.1913417161825425 -0.3314135740355887 0.9238795325112884
+ outer loop
+ vertex 140.92032256947556 -35.21248651865313 -42.398076211353384
+ vertex 137.81799238668404 -37.83909302020373 -42.69777747886727
+ vertex 141.28209400182178 -35.83909302020376 -42.697777478867266
+ endloop
+endfacet
+facet normal 0.30438071450435833 -0.527202862365667 0.7933533402912374
+ outer loop
+ vertex 137.45622095433782 -37.2124865186531 -42.398076211353384
+ vertex 140.60966239769576 -34.6744073172424 -41.921320343559714
+ vertex 137.14556078255802 -36.674407317242355 -41.921320343559714
+ endloop
+endfacet
+facet normal 0.30438071450435833 -0.527202862365667 0.7933533402912374
+ outer loop
+ vertex 140.60966239769576 -34.6744073172424 -41.921320343559714
+ vertex 137.45622095433782 -37.2124865186531 -42.398076211353384
+ vertex 140.92032256947556 -35.21248651865313 -42.398076211353384
+ endloop
+endfacet
+facet normal 0.3966766701456188 -0.6870641468694539 0.6087614290087157
+ outer loop
+ vertex 140.60966239769576 -34.6744073172424 -41.921320343559714
+ vertex 136.90718284866117 -36.261524624329745 -41.30000000000007
+ vertex 137.14556078255802 -36.674407317242355 -41.921320343559714
+ endloop
+endfacet
+facet normal 0.3966766701456188 -0.6870641468694539 0.6087614290087157
+ outer loop
+ vertex 136.90718284866117 -36.261524624329745 -41.30000000000007
+ vertex 140.60966239769576 -34.6744073172424 -41.921320343559714
+ vertex 140.3712844637989 -34.26152462432978 -41.30000000000007
+ endloop
+endfacet
+facet normal 0.4619397662556419 -0.800103145191265 0.38268343236509245
+ outer loop
+ vertex 140.3712844637989 -34.26152462432978 -41.30000000000007
+ vertex 136.75733221490424 -36.00197571311632 -40.57645713530763
+ vertex 136.90718284866117 -36.261524624329745 -41.30000000000007
+ endloop
+endfacet
+facet normal 0.4619397662556419 -0.800103145191265 0.38268343236509245
+ outer loop
+ vertex 136.75733221490424 -36.00197571311632 -40.57645713530763
+ vertex 140.3712844637989 -34.26152462432978 -41.30000000000007
+ vertex 140.22143383004197 -34.00197571311636 -40.57645713530763
+ endloop
+endfacet
+facet normal 0.4957224306869044 -0.8586164364012618 0.1305261922200486
+ outer loop
+ vertex 140.22143383004197 -34.00197571311636 -40.57645713530763
+ vertex 136.70622095433785 -35.913448412976436 -39.80000000000007
+ vertex 136.75733221490424 -36.00197571311632 -40.57645713530763
+ endloop
+endfacet
+facet normal 0.4957224306869044 -0.8586164364012618 0.1305261922200486
+ outer loop
+ vertex 136.70622095433785 -35.913448412976436 -39.80000000000007
+ vertex 140.22143383004197 -34.00197571311636 -40.57645713530763
+ vertex 140.1703225694756 -33.913448412976464 -39.80000000000006
+ endloop
+endfacet
+facet normal 0.9914448613738109 3.3306690738754686e-16 -0.13052619222004863
+ outer loop
+ vertex 99.42753457015435 -100.48202726980834 -25.800000000000054
+ vertex 99.52975709128714 -104.4820272698083 -25.0235428646925
+ vertex 99.42753457015435 -104.4820272698083 -25.800000000000065
+ endloop
+endfacet
+facet normal 0.9914448613738109 3.3306690738754686e-16 -0.13052619222004863
+ outer loop
+ vertex 99.52975709128714 -104.4820272698083 -25.0235428646925
+ vertex 99.42753457015435 -100.48202726980834 -25.800000000000054
+ vertex 99.52975709128714 -100.48202726980834 -25.02354286469249
+ endloop
+endfacet
+facet normal 1.0 3.885780586188048e-16 4.1537659655416226e-16
+ outer loop
+ vertex 99.42753457015435 -100.48202726980837 -39.800000000000054
+ vertex 99.42753457015435 -104.4820272698083 -25.800000000000065
+ vertex 99.42753457015435 -104.48202726980831 -39.80000000000006
+ endloop
+endfacet
+facet normal 1.0 3.885780586188048e-16 4.1537659655416226e-16
+ outer loop
+ vertex 99.42753457015435 -104.4820272698083 -25.800000000000065
+ vertex 99.42753457015435 -100.48202726980837 -39.800000000000054
+ vertex 99.42753457015435 -100.48202726980834 -25.800000000000054
+ endloop
+endfacet
+facet normal 0.9914448613738109 4.440892098500625e-16 0.13052619222004863
+ outer loop
+ vertex 99.52975709128715 -104.48202726980831 -40.57645713530763
+ vertex 99.42753457015435 -100.48202726980837 -39.800000000000054
+ vertex 99.42753457015435 -104.48202726980831 -39.80000000000006
+ endloop
+endfacet
+facet normal 0.9914448613738109 4.440892098500625e-16 0.13052619222004863
+ outer loop
+ vertex 99.42753457015435 -100.48202726980837 -39.800000000000054
+ vertex 99.52975709128715 -104.48202726980831 -40.57645713530763
+ vertex 99.52975709128715 -100.48202726980837 -40.57645713530762
+ endloop
+endfacet
+facet normal 0.9238795325112846 4.996003610813204e-16 0.3826834323650951
+ outer loop
+ vertex 99.82945835880103 -104.48202726980831 -41.30000000000007
+ vertex 99.52975709128715 -100.48202726980837 -40.57645713530762
+ vertex 99.52975709128715 -104.48202726980831 -40.57645713530763
+ endloop
+endfacet
+facet normal 0.9238795325112846 4.996003610813204e-16 0.3826834323650951
+ outer loop
+ vertex 99.52975709128715 -100.48202726980837 -40.57645713530762
+ vertex 99.82945835880103 -104.48202726980831 -41.30000000000007
+ vertex 99.82945835880103 -100.48202726980837 -41.30000000000006
+ endloop
+endfacet
+facet normal 0.793353340291239 4.996003610813205e-16 0.6087614290087157
+ outer loop
+ vertex 100.30621422659472 -104.48202726980831 -41.921320343559714
+ vertex 99.82945835880103 -100.48202726980837 -41.30000000000006
+ vertex 99.82945835880103 -104.48202726980831 -41.30000000000007
+ endloop
+endfacet
+facet normal 0.793353340291239 4.996003610813205e-16 0.6087614290087157
+ outer loop
+ vertex 99.82945835880103 -100.48202726980837 -41.30000000000006
+ vertex 100.30621422659472 -104.48202726980831 -41.921320343559714
+ vertex 100.3062142265947 -100.48202726980837 -41.9213203435597
+ endloop
+endfacet
+facet normal 0.6087614290087179 6.106226635438362e-16 0.7933533402912374
+ outer loop
+ vertex 100.30621422659472 -104.48202726980831 -41.921320343559714
+ vertex 100.92753457015435 -100.48202726980836 -42.39807621135338
+ vertex 100.3062142265947 -100.48202726980837 -41.9213203435597
+ endloop
+endfacet
+facet normal 0.6087614290087179 6.106226635438362e-16 0.7933533402912374
+ outer loop
+ vertex 100.92753457015435 -100.48202726980836 -42.39807621135338
+ vertex 100.30621422659472 -104.48202726980831 -41.921320343559714
+ vertex 100.92753457015435 -104.48202726980831 -42.398076211353384
+ endloop
+endfacet
+facet normal 0.38268343236508295 5.828670879282073e-16 0.9238795325112897
+ outer loop
+ vertex 100.92753457015435 -104.48202726980831 -42.398076211353384
+ vertex 101.65107743484678 -100.48202726980834 -42.69777747886726
+ vertex 100.92753457015435 -100.48202726980836 -42.39807621135338
+ endloop
+endfacet
+facet normal 0.38268343236508295 5.828670879282073e-16 0.9238795325112897
+ outer loop
+ vertex 101.65107743484678 -100.48202726980834 -42.69777747886726
+ vertex 100.92753457015435 -104.48202726980831 -42.398076211353384
+ vertex 101.6510774348468 -104.4820272698083 -42.697777478867266
+ endloop
+endfacet
+facet normal 0.13052619222005243 4.996003610813205e-16 0.9914448613738103
+ outer loop
+ vertex 101.6510774348468 -104.4820272698083 -42.697777478867266
+ vertex 102.42753457015436 -100.48202726980834 -42.800000000000054
+ vertex 101.65107743484678 -100.48202726980834 -42.69777747886726
+ endloop
+endfacet
+facet normal 0.13052619222005243 4.996003610813205e-16 0.9914448613738103
+ outer loop
+ vertex 102.42753457015436 -100.48202726980834 -42.800000000000054
+ vertex 101.6510774348468 -104.4820272698083 -42.697777478867266
+ vertex 102.42753457015436 -104.4820272698083 -42.80000000000006
+ endloop
+endfacet
+facet normal -0.13052619222004935 4.093947403305266e-16 0.9914448613738107
+ outer loop
+ vertex 102.42753457015436 -104.4820272698083 -42.80000000000006
+ vertex 103.20399170546192 -100.48202726980836 -42.69777747886726
+ vertex 102.42753457015436 -100.48202726980834 -42.800000000000054
+ endloop
+endfacet
+facet normal -0.13052619222004935 4.093947403305266e-16 0.9914448613738107
+ outer loop
+ vertex 103.20399170546192 -100.48202726980836 -42.69777747886726
+ vertex 102.42753457015436 -104.4820272698083 -42.80000000000006
+ vertex 103.20399170546195 -104.4820272698083 -42.697777478867266
+ endloop
+endfacet
+facet normal -0.38268343236509195 3.053113317719182e-16 0.923879532511286
+ outer loop
+ vertex 103.20399170546195 -104.4820272698083 -42.697777478867266
+ vertex 103.92753457015436 -100.48202726980837 -42.39807621135337
+ vertex 103.20399170546192 -100.48202726980836 -42.69777747886726
+ endloop
+endfacet
+facet normal -0.38268343236509195 3.053113317719182e-16 0.923879532511286
+ outer loop
+ vertex 103.92753457015436 -100.48202726980837 -42.39807621135337
+ vertex 103.20399170546195 -104.4820272698083 -42.697777478867266
+ vertex 103.92753457015438 -104.4820272698083 -42.39807621135338
+ endloop
+endfacet
+facet normal -0.608761429008721 1.6653345369377356e-16 0.7933533402912348
+ outer loop
+ vertex 103.92753457015438 -104.4820272698083 -42.39807621135338
+ vertex 104.54885491371398 -100.48202726980837 -41.9213203435597
+ vertex 103.92753457015436 -100.48202726980837 -42.39807621135337
+ endloop
+endfacet
+facet normal -0.608761429008721 1.6653345369377356e-16 0.7933533402912348
+ outer loop
+ vertex 104.54885491371398 -100.48202726980837 -41.9213203435597
+ vertex 103.92753457015438 -104.4820272698083 -42.39807621135338
+ vertex 104.54885491371401 -104.48202726980831 -41.92132034355971
+ endloop
+endfacet
+facet normal -0.7933533402912389 -5.551115123125773e-17 0.6087614290087157
+ outer loop
+ vertex 105.02561078150768 -104.48202726980831 -41.30000000000006
+ vertex 104.54885491371398 -100.48202726980837 -41.9213203435597
+ vertex 104.54885491371401 -104.48202726980831 -41.92132034355971
+ endloop
+endfacet
+facet normal -0.7933533402912389 -5.551115123125773e-17 0.6087614290087157
+ outer loop
+ vertex 104.54885491371398 -100.48202726980837 -41.9213203435597
+ vertex 105.02561078150768 -104.48202726980831 -41.30000000000006
+ vertex 105.02561078150767 -100.48202726980838 -41.300000000000054
+ endloop
+endfacet
+facet normal -0.9238795325112851 -1.1102230246251558e-16 0.38268343236509383
+ outer loop
+ vertex 105.32531204902156 -104.48202726980831 -40.57645713530762
+ vertex 105.02561078150767 -100.48202726980838 -41.300000000000054
+ vertex 105.02561078150768 -104.48202726980831 -41.30000000000006
+ endloop
+endfacet
+facet normal -0.9238795325112851 -1.1102230246251558e-16 0.38268343236509383
+ outer loop
+ vertex 105.02561078150767 -100.48202726980838 -41.300000000000054
+ vertex 105.32531204902156 -104.48202726980831 -40.57645713530762
+ vertex 105.32531204902155 -100.48202726980838 -40.576457135307614
+ endloop
+endfacet
+facet normal -0.9914448613738107 -2.7755575615628904e-16 0.13052619222004905
+ outer loop
+ vertex 105.42753457015438 -104.48202726980831 -39.80000000000006
+ vertex 105.32531204902155 -100.48202726980838 -40.576457135307614
+ vertex 105.32531204902156 -104.48202726980831 -40.57645713530762
+ endloop
+endfacet
+facet normal -0.9914448613738107 -2.7755575615628904e-16 0.13052619222004905
+ outer loop
+ vertex 105.32531204902155 -100.48202726980838 -40.576457135307614
+ vertex 105.42753457015438 -104.48202726980831 -39.80000000000006
+ vertex 105.42753457015434 -100.48202726980838 -39.800000000000054
+ endloop
+endfacet
+facet normal -1.0 -3.3306690738754686e-16 -3.488803731010178e-16
+ outer loop
+ vertex 105.42753457015434 -100.48202726980838 -25.800000000000047
+ vertex 105.42753457015438 -104.48202726980831 -39.80000000000006
+ vertex 105.42753457015435 -104.48202726980831 -25.80000000000006
+ endloop
+endfacet
+facet normal -1.0 -3.3306690738754686e-16 -3.488803731010178e-16
+ outer loop
+ vertex 105.42753457015438 -104.48202726980831 -39.80000000000006
+ vertex 105.42753457015434 -100.48202726980838 -25.800000000000047
+ vertex 105.42753457015434 -100.48202726980838 -39.800000000000054
+ endloop
+endfacet
+facet normal -0.9914448613738099 -3.885780586188047e-16 -0.13052619222005565
+ outer loop
+ vertex 105.32531204902155 -100.48202726980838 -25.02354286469249
+ vertex 105.42753457015435 -104.48202726980831 -25.80000000000006
+ vertex 105.32531204902156 -104.4820272698083 -25.0235428646925
+ endloop
+endfacet
+facet normal -0.9914448613738099 -3.885780586188047e-16 -0.13052619222005565
+ outer loop
+ vertex 105.42753457015435 -104.48202726980831 -25.80000000000006
+ vertex 105.32531204902155 -100.48202726980838 -25.02354286469249
+ vertex 105.42753457015434 -100.48202726980838 -25.800000000000047
+ endloop
+endfacet
+facet normal -0.9238795325112852 -5.551115123125783e-16 -0.38268343236509383
+ outer loop
+ vertex 105.02561078150764 -100.48202726980837 -24.30000000000005
+ vertex 105.32531204902156 -104.4820272698083 -25.0235428646925
+ vertex 105.02561078150767 -104.48202726980831 -24.30000000000006
+ endloop
+endfacet
+facet normal -0.9238795325112852 -5.551115123125783e-16 -0.38268343236509383
+ outer loop
+ vertex 105.32531204902156 -104.4820272698083 -25.0235428646925
+ vertex 105.02561078150764 -100.48202726980837 -24.30000000000005
+ vertex 105.32531204902155 -100.48202726980838 -25.02354286469249
+ endloop
+endfacet
+facet normal -0.7933533402912376 -4.440892098500626e-16 -0.6087614290087173
+ outer loop
+ vertex 104.54885491371398 -100.48202726980837 -23.678679656440412
+ vertex 105.02561078150767 -104.48202726980831 -24.30000000000006
+ vertex 104.54885491371401 -104.4820272698083 -23.678679656440423
+ endloop
+endfacet
+facet normal -0.7933533402912376 -4.440892098500626e-16 -0.6087614290087173
+ outer loop
+ vertex 105.02561078150767 -104.48202726980831 -24.30000000000006
+ vertex 104.54885491371398 -100.48202726980837 -23.678679656440412
+ vertex 105.02561078150764 -100.48202726980837 -24.30000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087233 -6.66133814775094e-16 -0.7933533402912333
+ outer loop
+ vertex 104.54885491371398 -100.48202726980837 -23.678679656440412
+ vertex 103.92753457015436 -104.4820272698083 -23.20192378864675
+ vertex 103.92753457015434 -100.48202726980836 -23.201923788646738
+ endloop
+endfacet
+facet normal -0.6087614290087233 -6.66133814775094e-16 -0.7933533402912333
+ outer loop
+ vertex 103.92753457015436 -104.4820272698083 -23.20192378864675
+ vertex 104.54885491371398 -100.48202726980837 -23.678679656440412
+ vertex 104.54885491371401 -104.4820272698083 -23.678679656440423
+ endloop
+endfacet
+facet normal -0.382683432365091 -5.273559366969495e-16 -0.9238795325112863
+ outer loop
+ vertex 103.92753457015434 -100.48202726980836 -23.201923788646738
+ vertex 103.20399170546192 -104.4820272698083 -22.902222521132856
+ vertex 103.2039917054619 -100.48202726980837 -22.902222521132845
+ endloop
+endfacet
+facet normal -0.382683432365091 -5.273559366969495e-16 -0.9238795325112863
+ outer loop
+ vertex 103.20399170546192 -104.4820272698083 -22.902222521132856
+ vertex 103.92753457015434 -100.48202726980836 -23.201923788646738
+ vertex 103.92753457015436 -104.4820272698083 -23.20192378864675
+ endloop
+endfacet
+facet normal -0.13052619222004494 -4.926614671774133e-16 -0.9914448613738113
+ outer loop
+ vertex 103.2039917054619 -100.48202726980837 -22.902222521132845
+ vertex 102.42753457015436 -104.4820272698083 -22.800000000000065
+ vertex 102.42753457015434 -100.48202726980834 -22.800000000000054
+ endloop
+endfacet
+facet normal -0.13052619222004494 -4.926614671774133e-16 -0.9914448613738113
+ outer loop
+ vertex 102.42753457015436 -104.4820272698083 -22.800000000000065
+ vertex 103.2039917054619 -100.48202726980837 -22.902222521132845
+ vertex 103.20399170546192 -104.4820272698083 -22.902222521132856
+ endloop
+endfacet
+facet normal 0.13052619222004308 -4.093947403305266e-16 -0.9914448613738115
+ outer loop
+ vertex 102.42753457015434 -100.48202726980834 -22.800000000000054
+ vertex 101.65107743484678 -104.48202726980831 -22.902222521132856
+ vertex 101.65107743484678 -100.48202726980837 -22.902222521132845
+ endloop
+endfacet
+facet normal 0.13052619222004308 -4.093947403305266e-16 -0.9914448613738115
+ outer loop
+ vertex 101.65107743484678 -104.48202726980831 -22.902222521132856
+ vertex 102.42753457015434 -100.48202726980834 -22.800000000000054
+ vertex 102.42753457015436 -104.4820272698083 -22.800000000000065
+ endloop
+endfacet
+facet normal 0.38268343236509494 -3.33066907387547e-16 -0.9238795325112845
+ outer loop
+ vertex 101.65107743484678 -100.48202726980837 -22.902222521132845
+ vertex 100.92753457015434 -104.48202726980831 -23.20192378864675
+ vertex 100.92753457015434 -100.48202726980836 -23.201923788646738
+ endloop
+endfacet
+facet normal 0.38268343236509494 -3.33066907387547e-16 -0.9238795325112845
+ outer loop
+ vertex 100.92753457015434 -104.48202726980831 -23.20192378864675
+ vertex 101.65107743484678 -100.48202726980837 -22.902222521132845
+ vertex 101.65107743484678 -104.48202726980831 -22.902222521132856
+ endloop
+endfacet
+facet normal 0.6087614290087218 -1.6653345369377356e-16 -0.7933533402912343
+ outer loop
+ vertex 100.92753457015434 -100.48202726980836 -23.201923788646738
+ vertex 100.3062142265947 -104.4820272698083 -23.678679656440423
+ vertex 100.3062142265947 -100.48202726980834 -23.678679656440412
+ endloop
+endfacet
+facet normal 0.6087614290087218 -1.6653345369377356e-16 -0.7933533402912343
+ outer loop
+ vertex 100.3062142265947 -104.4820272698083 -23.678679656440423
+ vertex 100.92753457015434 -100.48202726980836 -23.201923788646738
+ vertex 100.92753457015434 -104.48202726980831 -23.20192378864675
+ endloop
+endfacet
+facet normal 0.7933533402912387 -8.64052807209775e-32 -0.6087614290087159
+ outer loop
+ vertex 99.82945835880103 -100.48202726980834 -24.300000000000058
+ vertex 100.3062142265947 -104.4820272698083 -23.678679656440423
+ vertex 99.82945835880103 -104.4820272698083 -24.300000000000068
+ endloop
+endfacet
+facet normal 0.7933533402912387 -8.64052807209775e-32 -0.6087614290087159
+ outer loop
+ vertex 100.3062142265947 -104.4820272698083 -23.678679656440423
+ vertex 99.82945835880103 -100.48202726980834 -24.300000000000058
+ vertex 100.3062142265947 -100.48202726980834 -23.678679656440412
+ endloop
+endfacet
+facet normal 0.9238795325112841 5.551115123125776e-17 -0.38268343236509633
+ outer loop
+ vertex 99.52975709128714 -100.48202726980834 -25.02354286469249
+ vertex 99.82945835880103 -104.4820272698083 -24.300000000000068
+ vertex 99.52975709128714 -104.4820272698083 -25.0235428646925
+ endloop
+endfacet
+facet normal 0.9238795325112841 5.551115123125776e-17 -0.38268343236509633
+ outer loop
+ vertex 99.82945835880103 -104.4820272698083 -24.300000000000068
+ vertex 99.52975709128714 -100.48202726980834 -25.02354286469249
+ vertex 99.82945835880103 -100.48202726980834 -24.300000000000058
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 150.02753457015433 -104.48202726980836 -62.600000000000065
+ vertex 135.04517266035938 -104.48202726980834 -55.531851652578204
+ vertex 94.73693564691284 -104.48202726980831 -62.60000000000003
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 135.04517266035938 -104.48202726980834 -55.531851652578204
+ vertex 150.02753457015433 -104.48202726980836 -62.600000000000065
+ vertex 135.52753457015436 -104.48202726980834 -55.33205080756894
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 135.52753457015436 -104.48202726980834 -55.33205080756894
+ vertex 150.02753457015433 -104.48202726980836 -62.600000000000065
+ vertex 135.94174813252744 -104.48202726980834 -55.01421356237316
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 135.94174813252744 -104.48202726980834 -55.01421356237316
+ vertex 150.02753457015433 -104.48202726980836 -62.600000000000065
+ vertex 136.25958537772323 -104.48202726980834 -54.60000000000006
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 136.25958537772323 -104.48202726980834 -54.60000000000006
+ vertex 150.02753457015433 -104.48202726980836 -62.600000000000065
+ vertex 136.45938622273246 -104.48202726980834 -54.117638090205105
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 136.45938622273246 -104.48202726980834 -54.117638090205105
+ vertex 150.02753457015433 -104.48202726980836 -62.600000000000065
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 94.73693564691284 -104.48202726980831 -62.60000000000003
+ vertex 135.04517266035938 -104.48202726980834 -55.531851652578204
+ vertex 134.52753457015433 -104.48202726980836 -55.600000000000065
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 136.45938622273246 -104.48202726980834 -54.117638090205105
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 136.52753457015433 -104.48202726980836 -53.60000000000006
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 136.52753457015433 -104.48202726980836 -53.60000000000006
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 136.52753457015433 -104.48202726980836 -51.60000000000005
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 136.52753457015433 -104.48202726980836 -51.60000000000005
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 136.45938622273246 -104.48202726980834 -51.082361909795004
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 136.45938622273246 -104.48202726980834 -51.082361909795004
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 136.25958537772323 -104.48202726980834 -50.600000000000044
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 136.25958537772323 -104.48202726980834 -50.600000000000044
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 135.94174813252744 -104.48202726980834 -50.18578643762695
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 135.94174813252744 -104.48202726980834 -50.18578643762695
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 135.52753457015436 -104.48202726980831 -49.867949192431176
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 135.52753457015436 -104.48202726980831 -49.867949192431176
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 135.04517266035938 -104.48202726980834 -49.668148347421905
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 135.04517266035938 -104.48202726980834 -49.668148347421905
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 134.52753457015433 -104.48202726980836 -49.600000000000044
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 134.52753457015433 -104.48202726980836 -49.600000000000044
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 109.72753457015432 -104.48202726980834 -49.600000000000044
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 109.72753457015432 -104.48202726980834 -49.600000000000044
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 135.94174813252744 -104.48202726980836 -15.414213562373153
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 109.72753457015432 -104.48202726980834 -49.600000000000044
+ vertex 135.94174813252744 -104.48202726980836 -15.414213562373153
+ vertex 104.54885491371401 -104.48202726980831 -41.92132034355971
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 109.72753457015432 -104.48202726980834 -49.600000000000044
+ vertex 104.54885491371401 -104.48202726980831 -41.92132034355971
+ vertex 103.92753457015438 -104.4820272698083 -42.39807621135338
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 109.72753457015432 -104.48202726980834 -49.600000000000044
+ vertex 103.92753457015438 -104.4820272698083 -42.39807621135338
+ vertex 103.20399170546195 -104.4820272698083 -42.697777478867266
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 109.72753457015432 -104.48202726980834 -49.600000000000044
+ vertex 103.20399170546195 -104.4820272698083 -42.697777478867266
+ vertex 102.42753457015436 -104.4820272698083 -42.80000000000006
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 104.54885491371401 -104.48202726980831 -41.92132034355971
+ vertex 135.94174813252744 -104.48202726980836 -15.414213562373153
+ vertex 105.02561078150768 -104.48202726980831 -41.30000000000006
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 105.02561078150768 -104.48202726980831 -41.30000000000006
+ vertex 135.94174813252744 -104.48202726980836 -15.414213562373153
+ vertex 105.32531204902156 -104.48202726980831 -40.57645713530762
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 105.32531204902156 -104.48202726980831 -40.57645713530762
+ vertex 135.94174813252744 -104.48202726980836 -15.414213562373153
+ vertex 105.42753457015438 -104.48202726980831 -39.80000000000006
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 105.42753457015438 -104.48202726980831 -39.80000000000006
+ vertex 135.94174813252744 -104.48202726980836 -15.414213562373153
+ vertex 135.52753457015436 -104.48202726980836 -15.732050807568937
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 105.42753457015438 -104.48202726980831 -39.80000000000006
+ vertex 135.52753457015436 -104.48202726980836 -15.732050807568937
+ vertex 135.04517266035938 -104.48202726980834 -15.931851652578198
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 105.42753457015438 -104.48202726980831 -39.80000000000006
+ vertex 135.04517266035938 -104.48202726980834 -15.931851652578198
+ vertex 105.42753457015435 -104.48202726980831 -25.80000000000006
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 105.42753457015435 -104.48202726980831 -25.80000000000006
+ vertex 135.04517266035938 -104.48202726980834 -15.931851652578198
+ vertex 105.32531204902156 -104.4820272698083 -25.0235428646925
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 105.32531204902156 -104.4820272698083 -25.0235428646925
+ vertex 135.04517266035938 -104.48202726980834 -15.931851652578198
+ vertex 105.02561078150767 -104.48202726980831 -24.30000000000006
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 105.02561078150767 -104.48202726980831 -24.30000000000006
+ vertex 135.04517266035938 -104.48202726980834 -15.931851652578198
+ vertex 104.54885491371401 -104.4820272698083 -23.678679656440423
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 104.54885491371401 -104.4820272698083 -23.678679656440423
+ vertex 135.04517266035938 -104.48202726980834 -15.931851652578198
+ vertex 103.92753457015436 -104.4820272698083 -23.20192378864675
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 103.92753457015436 -104.4820272698083 -23.20192378864675
+ vertex 135.04517266035938 -104.48202726980834 -15.931851652578198
+ vertex 103.20399170546192 -104.4820272698083 -22.902222521132856
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 103.20399170546192 -104.4820272698083 -22.902222521132856
+ vertex 135.04517266035938 -104.48202726980834 -15.931851652578198
+ vertex 102.42753457015436 -104.4820272698083 -22.800000000000065
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 102.42753457015436 -104.4820272698083 -22.800000000000065
+ vertex 135.04517266035938 -104.48202726980834 -15.931851652578198
+ vertex 134.52753457015433 -104.48202726980836 -16.00000000000006
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 135.94174813252744 -104.48202726980836 -15.414213562373153
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 136.25958537772323 -104.48202726980836 -15.000000000000057
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 136.25958537772323 -104.48202726980836 -15.000000000000057
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 136.4593862227325 -104.48202726980836 -14.517638090205098
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 136.4593862227325 -104.48202726980836 -14.517638090205098
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 136.52753457015433 -104.48202726980836 -14.000000000000059
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 136.52753457015433 -104.48202726980836 -14.000000000000059
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 136.52753457015433 -104.48202726980836 -12.000000000000046
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 136.52753457015433 -104.48202726980836 -12.000000000000046
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 136.4593862227325 -104.48202726980836 -11.482361909795012
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 136.4593862227325 -104.48202726980836 -11.482361909795012
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 136.25958537772323 -104.48202726980836 -11.000000000000048
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 136.25958537772323 -104.48202726980836 -11.000000000000048
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 135.94174813252744 -104.48202726980836 -10.58578643762696
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 135.94174813252744 -104.48202726980836 -10.58578643762696
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 135.52753457015436 -104.48202726980834 -10.267949192431178
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 135.52753457015436 -104.48202726980834 -10.267949192431178
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 135.04517266035938 -104.48202726980834 -10.068148347421912
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 135.04517266035938 -104.48202726980834 -10.068148347421912
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 134.52753457015433 -104.48202726980836 -10.00000000000005
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 134.52753457015433 -104.48202726980836 -10.00000000000005
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 109.72753457015432 -104.48202726980836 -10.00000000000005
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 94.73693564691284 -104.48202726980831 -62.60000000000003
+ vertex 99.42753457015435 -104.48202726980831 -39.80000000000006
+ vertex 94.73693564691285 -104.48202726980834 -3.0000000000000284
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 99.42753457015435 -104.48202726980831 -39.80000000000006
+ vertex 94.73693564691284 -104.48202726980831 -62.60000000000003
+ vertex 99.52975709128715 -104.48202726980831 -40.57645713530763
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 99.52975709128715 -104.48202726980831 -40.57645713530763
+ vertex 94.73693564691284 -104.48202726980831 -62.60000000000003
+ vertex 99.82945835880103 -104.48202726980831 -41.30000000000007
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 99.82945835880103 -104.48202726980831 -41.30000000000007
+ vertex 94.73693564691284 -104.48202726980831 -62.60000000000003
+ vertex 107.99548376258547 -104.48202726980834 -54.60000000000006
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 107.99548376258547 -104.48202726980834 -54.60000000000006
+ vertex 94.73693564691284 -104.48202726980831 -62.60000000000003
+ vertex 108.31332100778123 -104.48202726980834 -55.01421356237316
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 108.31332100778123 -104.48202726980834 -55.01421356237316
+ vertex 94.73693564691284 -104.48202726980831 -62.60000000000003
+ vertex 108.72753457015433 -104.48202726980834 -55.33205080756894
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 108.72753457015433 -104.48202726980834 -55.33205080756894
+ vertex 94.73693564691284 -104.48202726980831 -62.60000000000003
+ vertex 109.20989647994928 -104.48202726980836 -55.531851652578204
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 109.20989647994928 -104.48202726980836 -55.531851652578204
+ vertex 94.73693564691284 -104.48202726980831 -62.60000000000003
+ vertex 109.72753457015432 -104.48202726980834 -55.600000000000065
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 109.72753457015432 -104.48202726980834 -55.600000000000065
+ vertex 94.73693564691284 -104.48202726980831 -62.60000000000003
+ vertex 134.52753457015433 -104.48202726980836 -55.600000000000065
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 99.82945835880103 -104.48202726980831 -41.30000000000007
+ vertex 107.99548376258547 -104.48202726980834 -54.60000000000006
+ vertex 107.7956829175762 -104.48202726980834 -54.117638090205105
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 99.82945835880103 -104.48202726980831 -41.30000000000007
+ vertex 107.7956829175762 -104.48202726980834 -54.117638090205105
+ vertex 107.72753457015433 -104.48202726980834 -53.60000000000006
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 99.82945835880103 -104.48202726980831 -41.30000000000007
+ vertex 107.72753457015433 -104.48202726980834 -53.60000000000006
+ vertex 107.72753457015433 -104.48202726980834 -51.60000000000005
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 99.82945835880103 -104.48202726980831 -41.30000000000007
+ vertex 107.72753457015433 -104.48202726980834 -51.60000000000005
+ vertex 100.30621422659472 -104.48202726980831 -41.921320343559714
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 100.30621422659472 -104.48202726980831 -41.921320343559714
+ vertex 107.72753457015433 -104.48202726980834 -51.60000000000005
+ vertex 107.7956829175762 -104.48202726980834 -51.082361909795004
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 100.30621422659472 -104.48202726980831 -41.921320343559714
+ vertex 107.7956829175762 -104.48202726980834 -51.082361909795004
+ vertex 107.99548376258547 -104.48202726980834 -50.600000000000044
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 100.30621422659472 -104.48202726980831 -41.921320343559714
+ vertex 107.99548376258547 -104.48202726980834 -50.600000000000044
+ vertex 108.31332100778123 -104.48202726980834 -50.18578643762695
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 100.30621422659472 -104.48202726980831 -41.921320343559714
+ vertex 108.31332100778123 -104.48202726980834 -50.18578643762695
+ vertex 108.72753457015433 -104.48202726980834 -49.867949192431176
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 100.30621422659472 -104.48202726980831 -41.921320343559714
+ vertex 108.72753457015433 -104.48202726980834 -49.867949192431176
+ vertex 109.20989647994928 -104.48202726980836 -49.668148347421905
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 100.30621422659472 -104.48202726980831 -41.921320343559714
+ vertex 109.20989647994928 -104.48202726980836 -49.668148347421905
+ vertex 109.72753457015432 -104.48202726980834 -49.600000000000044
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 100.30621422659472 -104.48202726980831 -41.921320343559714
+ vertex 109.72753457015432 -104.48202726980834 -49.600000000000044
+ vertex 100.92753457015435 -104.48202726980831 -42.398076211353384
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 100.92753457015435 -104.48202726980831 -42.398076211353384
+ vertex 109.72753457015432 -104.48202726980834 -49.600000000000044
+ vertex 101.6510774348468 -104.4820272698083 -42.697777478867266
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 101.6510774348468 -104.4820272698083 -42.697777478867266
+ vertex 109.72753457015432 -104.48202726980834 -49.600000000000044
+ vertex 102.42753457015436 -104.4820272698083 -42.80000000000006
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 94.73693564691285 -104.48202726980834 -3.0000000000000284
+ vertex 99.42753457015435 -104.48202726980831 -39.80000000000006
+ vertex 99.42753457015435 -104.4820272698083 -25.800000000000065
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 94.73693564691285 -104.48202726980834 -3.0000000000000284
+ vertex 99.42753457015435 -104.4820272698083 -25.800000000000065
+ vertex 99.52975709128714 -104.4820272698083 -25.0235428646925
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 94.73693564691285 -104.48202726980834 -3.0000000000000284
+ vertex 99.52975709128714 -104.4820272698083 -25.0235428646925
+ vertex 99.82945835880103 -104.4820272698083 -24.300000000000068
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 94.73693564691285 -104.48202726980834 -3.0000000000000284
+ vertex 99.82945835880103 -104.4820272698083 -24.300000000000068
+ vertex 100.3062142265947 -104.4820272698083 -23.678679656440423
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 94.73693564691285 -104.48202726980834 -3.0000000000000284
+ vertex 100.3062142265947 -104.4820272698083 -23.678679656440423
+ vertex 100.92753457015434 -104.48202726980831 -23.20192378864675
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 94.73693564691285 -104.48202726980834 -3.0000000000000284
+ vertex 100.92753457015434 -104.48202726980831 -23.20192378864675
+ vertex 101.65107743484678 -104.48202726980831 -22.902222521132856
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 94.73693564691285 -104.48202726980834 -3.0000000000000284
+ vertex 101.65107743484678 -104.48202726980831 -22.902222521132856
+ vertex 102.42753457015436 -104.4820272698083 -22.800000000000065
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 94.73693564691285 -104.48202726980834 -3.0000000000000284
+ vertex 102.42753457015436 -104.4820272698083 -22.800000000000065
+ vertex 108.31332100778123 -104.48202726980836 -15.414213562373153
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 108.31332100778123 -104.48202726980836 -15.414213562373153
+ vertex 102.42753457015436 -104.4820272698083 -22.800000000000065
+ vertex 108.72753457015433 -104.48202726980834 -15.732050807568937
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 108.72753457015433 -104.48202726980834 -15.732050807568937
+ vertex 102.42753457015436 -104.4820272698083 -22.800000000000065
+ vertex 109.20989647994928 -104.48202726980836 -15.931851652578198
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 109.20989647994928 -104.48202726980836 -15.931851652578198
+ vertex 102.42753457015436 -104.4820272698083 -22.800000000000065
+ vertex 109.72753457015432 -104.48202726980836 -16.00000000000006
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 109.72753457015432 -104.48202726980836 -16.00000000000006
+ vertex 102.42753457015436 -104.4820272698083 -22.800000000000065
+ vertex 134.52753457015433 -104.48202726980836 -16.00000000000006
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 94.73693564691285 -104.48202726980834 -3.0000000000000284
+ vertex 108.31332100778123 -104.48202726980836 -15.414213562373153
+ vertex 107.99548376258547 -104.48202726980834 -15.000000000000057
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 94.73693564691285 -104.48202726980834 -3.0000000000000284
+ vertex 107.99548376258547 -104.48202726980834 -15.000000000000057
+ vertex 107.7956829175762 -104.48202726980836 -14.517638090205098
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 94.73693564691285 -104.48202726980834 -3.0000000000000284
+ vertex 107.7956829175762 -104.48202726980836 -14.517638090205098
+ vertex 107.72753457015433 -104.48202726980836 -14.000000000000059
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 94.73693564691285 -104.48202726980834 -3.0000000000000284
+ vertex 107.72753457015433 -104.48202726980836 -14.000000000000059
+ vertex 107.72753457015433 -104.48202726980836 -12.000000000000046
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 94.73693564691285 -104.48202726980834 -3.0000000000000284
+ vertex 107.72753457015433 -104.48202726980836 -12.000000000000046
+ vertex 107.7956829175762 -104.48202726980834 -11.482361909795012
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 94.73693564691285 -104.48202726980834 -3.0000000000000284
+ vertex 107.7956829175762 -104.48202726980834 -11.482361909795012
+ vertex 107.99548376258547 -104.48202726980834 -11.000000000000048
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 94.73693564691285 -104.48202726980834 -3.0000000000000284
+ vertex 107.99548376258547 -104.48202726980834 -11.000000000000048
+ vertex 108.31332100778123 -104.48202726980836 -10.58578643762696
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 94.73693564691285 -104.48202726980834 -3.0000000000000284
+ vertex 108.31332100778123 -104.48202726980836 -10.58578643762696
+ vertex 108.72753457015433 -104.48202726980834 -10.267949192431178
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 94.73693564691285 -104.48202726980834 -3.0000000000000284
+ vertex 108.72753457015433 -104.48202726980834 -10.267949192431178
+ vertex 109.20989647994928 -104.48202726980836 -10.068148347421912
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 94.73693564691285 -104.48202726980834 -3.0000000000000284
+ vertex 109.20989647994928 -104.48202726980836 -10.068148347421912
+ vertex 109.72753457015432 -104.48202726980836 -10.00000000000005
+ endloop
+endfacet
+facet normal -6.661338147750937e-16 -1.0 -9.79264862752035e-17
+ outer loop
+ vertex 94.73693564691285 -104.48202726980834 -3.0000000000000284
+ vertex 109.72753457015432 -104.48202726980836 -10.00000000000005
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ endloop
+endfacet
+facet normal -0.8660254037844379 0.5000000000000013 1.8925949547301319e-16
+ outer loop
+ vertex 135.51562203109634 -29.851270586485406 -3.000000000000062
+ vertex 134.36092149271707 -31.851270586485388 -62.600000000000065
+ vertex 134.36092149271707 -31.851270586485402 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8660254037844379 0.5000000000000013 1.8925949547301319e-16
+ outer loop
+ vertex 134.36092149271707 -31.851270586485388 -62.600000000000065
+ vertex 135.51562203109634 -29.851270586485406 -3.000000000000062
+ vertex 135.5156220310963 -29.85127058648539 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.7990717941595373 0.6012356175233285 1.8788331711158385e-16
+ outer loop
+ vertex 135.85382598854784 -29.401780843702213 -3.000000000000062
+ vertex 135.5156220310963 -29.85127058648539 -62.600000000000065
+ vertex 135.51562203109634 -29.851270586485406 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.7990717941595373 0.6012356175233285 1.8788331711158385e-16
+ outer loop
+ vertex 135.5156220310963 -29.85127058648539 -62.600000000000065
+ vertex 135.85382598854784 -29.401780843702213 -3.000000000000062
+ vertex 135.85382598854784 -29.401780843702213 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.2223220049061566 0.9749732950878742 4.897386689705081e-17
+ outer loop
+ vertex 136.6703225694756 -29.022843461739203 -3.000000000000062
+ vertex 137.09297230028594 -29.119219778916523 -62.600000000000065
+ vertex 136.67032256947556 -29.022843461739203 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.2223220049061566 0.9749732950878742 4.897386689705081e-17
+ outer loop
+ vertex 137.09297230028594 -29.119219778916523 -62.600000000000065
+ vertex 136.6703225694756 -29.022843461739203 -3.000000000000062
+ vertex 137.09297230028594 -29.119219778916534 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.582933426294525 0.8125199200687485 1.725215534807415e-16
+ outer loop
+ vertex 136.2476728386652 -29.119219778916513 -3.000000000000062
+ vertex 135.85382598854784 -29.401780843702213 -62.600000000000065
+ vertex 135.85382598854784 -29.401780843702213 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.582933426294525 0.8125199200687485 1.725215534807415e-16
+ outer loop
+ vertex 135.85382598854784 -29.401780843702213 -62.600000000000065
+ vertex 136.2476728386652 -29.119219778916513 -3.000000000000062
+ vertex 136.2476728386652 -29.119219778916513 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9202212155149954 0.39139866442810534 1.8784422362071592e-16
+ outer loop
+ vertex 93.5822351085336 -102.48202726980831 -3.0000000000000284
+ vertex 93.36206755126858 -102.99966536001337 -62.60000000000003
+ vertex 93.3620675512686 -102.99966536001337 -3.0000000000000284
+ endloop
+endfacet
+facet normal -0.9202212155149954 0.39139866442810534 1.8784422362071592e-16
+ outer loop
+ vertex 93.36206755126858 -102.99966536001337 -62.60000000000003
+ vertex 93.5822351085336 -102.48202726980831 -3.0000000000000284
+ vertex 93.58223510853358 -102.48202726980831 -62.60000000000003
+ endloop
+endfacet
+facet normal -0.12114942135546836 -0.9926342819514322 -7.411378289433364e-17
+ outer loop
+ vertex 94.73693564691285 -104.48202726980834 -3.0000000000000284
+ vertex 94.17856413219631 -104.41387892238646 -62.60000000000003
+ vertex 94.73693564691284 -104.48202726980831 -62.60000000000003
+ endloop
+endfacet
+facet normal -0.12114942135546836 -0.9926342819514322 -7.411378289433364e-17
+ outer loop
+ vertex 94.17856413219631 -104.41387892238646 -62.60000000000003
+ vertex 94.73693564691285 -104.48202726980834 -3.0000000000000284
+ vertex 94.17856413219633 -104.41387892238646 -3.0000000000000284
+ endloop
+endfacet
+facet normal -0.7331906391044605 -0.680023151612938 5.601884531566151e-17
+ outer loop
+ vertex 93.73693564691285 -104.21407807737721 -3.0000000000000284
+ vertex 93.44214644250891 -103.89624083218142 -62.60000000000003
+ vertex 93.73693564691284 -104.21407807737718 -62.60000000000003
+ endloop
+endfacet
+facet normal -0.7331906391044605 -0.680023151612938 5.601884531566151e-17
+ outer loop
+ vertex 93.44214644250891 -103.89624083218142 -62.60000000000003
+ vertex 93.73693564691285 -104.21407807737721 -3.0000000000000284
+ vertex 93.44214644250893 -103.89624083218142 -3.0000000000000284
+ endloop
+endfacet
+facet normal 0.5829334262945308 0.8125199200687445 -1.1646732101374945e-17
+ outer loop
+ vertex 137.09297230028594 -29.119219778916534 -3.000000000000062
+ vertex 137.4868191504033 -29.401780843702223 -62.600000000000065
+ vertex 137.09297230028594 -29.119219778916523 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.5829334262945308 0.8125199200687445 -1.1646732101374945e-17
+ outer loop
+ vertex 137.4868191504033 -29.401780843702223 -62.600000000000065
+ vertex 137.09297230028594 -29.119219778916534 -3.000000000000062
+ vertex 137.4868191504033 -29.401780843702223 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.41219617871316916 -0.9110951159205395 -1.866582931446986e-17
+ outer loop
+ vertex 94.17856413219633 -104.41387892238646 -3.0000000000000284
+ vertex 93.73693564691284 -104.21407807737718 -62.60000000000003
+ vertex 94.17856413219631 -104.41387892238646 -62.60000000000003
+ endloop
+endfacet
+facet normal -0.41219617871316916 -0.9110951159205395 -1.866582931446986e-17
+ outer loop
+ vertex 93.73693564691284 -104.21407807737718 -62.60000000000003
+ vertex 94.17856413219633 -104.41387892238646 -3.0000000000000284
+ vertex 93.73693564691285 -104.21407807737721 -3.0000000000000284
+ endloop
+endfacet
+facet normal -0.9555126440105886 -0.29495014347495135 1.2888213579542982e-16
+ outer loop
+ vertex 93.44214644250893 -103.89624083218142 -3.0000000000000284
+ vertex 93.31428591610246 -103.48202726980831 -62.60000000000003
+ vertex 93.44214644250891 -103.89624083218142 -62.60000000000003
+ endloop
+endfacet
+facet normal -0.9555126440105886 -0.29495014347495135 1.2888213579542982e-16
+ outer loop
+ vertex 93.31428591610246 -103.48202726980831 -62.60000000000003
+ vertex 93.44214644250893 -103.89624083218142 -3.0000000000000284
+ vertex 93.31428591610248 -103.48202726980831 -3.0000000000000284
+ endloop
+endfacet
+facet normal -0.9951296050077003 0.09857519585178845 1.7252155348074164e-16
+ outer loop
+ vertex 93.3620675512686 -102.99966536001337 -3.0000000000000284
+ vertex 93.31428591610246 -103.48202726980831 -62.60000000000003
+ vertex 93.31428591610248 -103.48202726980831 -3.0000000000000284
+ endloop
+endfacet
+facet normal -0.9951296050077003 0.09857519585178845 1.7252155348074164e-16
+ outer loop
+ vertex 93.31428591610246 -103.48202726980831 -62.60000000000003
+ vertex 93.3620675512686 -102.99966536001337 -3.0000000000000284
+ vertex 93.36206755126858 -102.99966536001337 -62.60000000000003
+ endloop
+endfacet
+facet normal -0.22232200490613963 0.9749732950878782 1.28659506126373e-16
+ outer loop
+ vertex 136.2476728386652 -29.119219778916513 -3.000000000000062
+ vertex 136.67032256947556 -29.022843461739203 -62.600000000000065
+ vertex 136.2476728386652 -29.119219778916513 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.22232200490613963 0.9749732950878782 1.28659506126373e-16
+ outer loop
+ vertex 136.67032256947556 -29.022843461739203 -62.600000000000065
+ vertex 136.2476728386652 -29.119219778916513 -3.000000000000062
+ vertex 136.6703225694756 -29.022843461739203 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.7990717941595427 0.6012356175233213 -3.7118550168378584e-17
+ outer loop
+ vertex 137.4868191504033 -29.401780843702223 -3.000000000000062
+ vertex 137.8250231078548 -29.851270586485416 -62.600000000000065
+ vertex 137.4868191504033 -29.401780843702223 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.7990717941595427 0.6012356175233213 -3.7118550168378584e-17
+ outer loop
+ vertex 137.8250231078548 -29.851270586485416 -62.600000000000065
+ vertex 137.4868191504033 -29.401780843702223 -3.000000000000062
+ vertex 137.82502310785483 -29.851270586485416 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 166.7053679209021 -105.80546266909826 -62.600000000000065
+ vertex 161.15253457015433 -104.9089339160374 -62.600000000000065
+ vertex 162.15253457015433 -103.17688310846853 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 154.57694148227205 -101.11251347666712 -62.600000000000065
+ vertex 155.41311056879684 -104.48202726980838 -62.60000000000008
+ vertex 153.02753457015433 -104.48202726980838 -62.60000000000008
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 155.41311056879684 -104.48202726980838 -62.60000000000008
+ vertex 154.57694148227205 -101.11251347666712 -62.600000000000065
+ vertex 161.15253457015433 -104.9089339160374 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 155.41311056879684 -104.48202726980838 -62.60000000000008
+ vertex 161.15253457015433 -104.9089339160374 -62.600000000000065
+ vertex 170.6996386991948 -113.30770840086842 -62.60000000000009
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 170.6996386991948 -113.30770840086842 -62.60000000000009
+ vertex 161.15253457015433 -104.9089339160374 -62.600000000000065
+ vertex 165.7053679209021 -107.53751347666713 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 165.7053679209021 -107.53751347666713 -62.600000000000065
+ vertex 161.15253457015433 -104.9089339160374 -62.600000000000065
+ vertex 166.7053679209021 -105.80546266909826 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 170.6996386991948 -113.30770840086842 -62.60000000000009
+ vertex 165.7053679209021 -107.53751347666713 -62.600000000000065
+ vertex 172.33046225985305 -111.36251347666713 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 93.58223510853358 -102.48202726980831 -62.60000000000003
+ vertex 94.73693564691283 -100.48202726980833 -62.60000000000003
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 93.58223510853358 -102.48202726980831 -62.60000000000003
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 93.36206755126858 -102.99966536001337 -62.60000000000003
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 93.36206755126858 -102.99966536001337 -62.60000000000003
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 93.31428591610246 -103.48202726980831 -62.60000000000003
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 93.31428591610246 -103.48202726980831 -62.60000000000003
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 93.44214644250891 -103.89624083218142 -62.60000000000003
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 93.44214644250891 -103.89624083218142 -62.60000000000003
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 93.73693564691284 -104.21407807737718 -62.60000000000003
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 93.73693564691284 -104.21407807737718 -62.60000000000003
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 94.17856413219631 -104.41387892238646 -62.60000000000003
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 94.17856413219631 -104.41387892238646 -62.60000000000003
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 94.73693564691284 -104.48202726980831 -62.60000000000003
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 94.73693564691284 -104.48202726980831 -62.60000000000003
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 150.02753457015433 -104.48202726980836 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 150.02753457015433 -104.48202726980836 -62.600000000000065
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 124.45058190463727 -100.42011377814154 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 124.45058190463727 -100.42011377814154 -62.60000000000005
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 123.764409786641 -100.23625451325569 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 123.764409786641 -100.23625451325569 -62.60000000000005
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 123.12058899123208 -99.93603594587707 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 123.12058899123208 -99.93603594587707 -62.60000000000005
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 122.53868168748998 -99.52858006525756 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 122.53868168748998 -99.52858006525756 -62.60000000000005
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 122.03636883437957 -99.02626721214713 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 122.03636883437957 -99.02626721214713 -62.60000000000005
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 121.62891295376006 -98.44435990840503 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 121.62891295376006 -98.44435990840503 -62.60000000000005
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 121.32869438638143 -97.80053911299612 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 121.32869438638143 -97.80053911299612 -62.60000000000005
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 121.14483512149557 -97.11436699499986 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 121.14483512149557 -97.11436699499986 -62.60000000000005
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 121.07305832758563 -96.49857203241152 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 121.07305832758563 -96.49857203241152 -62.600000000000065
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 121.13921260616522 -95.74242516819551 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 121.13921260616522 -95.74242516819551 -62.600000000000065
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 121.14483512149557 -95.69901809900358 -62.600000000000044
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 121.14483512149557 -95.69901809900358 -62.600000000000044
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 121.33566537762498 -95.00925344381994 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 121.33566537762498 -95.00925344381994 -62.600000000000065
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 121.62891295376006 -94.3690251855984 -62.600000000000044
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 121.62891295376006 -94.3690251855984 -62.600000000000044
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ vertex 142.51289504782764 -58.196907134314685 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 121.07305832758563 -96.49857203241152 -62.600000000000065
+ vertex 121.13921260616522 -95.74242516819551 -62.600000000000065
+ vertex 121.08292162982877 -96.40669254700171 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 150.02753457015433 -104.48202726980836 -62.600000000000065
+ vertex 124.45058190463727 -100.42011377814154 -62.60000000000005
+ vertex 125.1582563526354 -100.48202726980834 -62.60000000000005
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 150.02753457015433 -104.48202726980836 -62.600000000000065
+ vertex 125.1582563526354 -100.48202726980834 -62.60000000000005
+ vertex 150.55309081768112 -100.48202726980837 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 150.02753457015433 -104.48202726980836 -62.600000000000065
+ vertex 150.55309081768112 -100.48202726980837 -62.600000000000065
+ vertex 165.47032256947557 -77.73433384446905 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 150.02753457015433 -104.48202726980836 -62.600000000000065
+ vertex 165.47032256947557 -77.73433384446905 -62.600000000000065
+ vertex 164.82694148227205 -83.35899269908614 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 164.82694148227205 -83.35899269908614 -62.600000000000065
+ vertex 165.47032256947557 -77.73433384446905 -62.600000000000065
+ vertex 166.97032256947557 -80.33241005582236 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 166.97032256947557 -80.33241005582236 -62.600000000000065
+ vertex 165.47032256947557 -77.73433384446905 -62.600000000000065
+ vertex 179.9246854525155 -69.38910354298145 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 166.97032256947557 -80.33241005582236 -62.600000000000065
+ vertex 179.9246854525155 -69.38910354298145 -62.600000000000065
+ vertex 181.1290344193379 -71.96296547328224 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 181.1290344193379 -71.96296547328224 -62.600000000000065
+ vertex 179.9246854525155 -69.38910354298145 -62.600000000000065
+ vertex 182.52753457015436 -67.88634790425266 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 181.1290344193379 -71.96296547328224 -62.600000000000065
+ vertex 182.52753457015436 -67.88634790425266 -62.600000000000065
+ vertex 183.24227030542374 -69.33067842807884 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 181.1290344193379 -71.96296547328224 -62.600000000000065
+ vertex 183.24227030542374 -69.33067842807884 -62.600000000000065
+ vertex 181.67449817895138 -73.34523992784574 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 181.67449817895138 -73.34523992784574 -62.600000000000065
+ vertex 183.24227030542374 -69.33067842807884 -62.600000000000065
+ vertex 183.89597471679528 -70.80363748245898 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 181.67449817895138 -73.34523992784574 -62.600000000000065
+ vertex 183.89597471679528 -70.80363748245898 -62.600000000000065
+ vertex 182.16167407948234 -74.74911777963072 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 182.16167407948234 -74.74911777963072 -62.600000000000065
+ vertex 183.89597471679528 -70.80363748245898 -62.600000000000065
+ vertex 184.48750387842546 -72.30264751720463 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 182.16167407948234 -74.74911777963072 -62.600000000000065
+ vertex 184.48750387842546 -72.30264751720463 -62.600000000000065
+ vertex 182.58970960549215 -76.17214236454272 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 182.58970960549215 -76.17214236454272 -62.600000000000065
+ vertex 184.48750387842546 -72.30264751720463 -62.600000000000065
+ vertex 185.01582266574815 -73.8250853951783 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 182.58970960549215 -76.17214236454272 -62.600000000000065
+ vertex 185.01582266574815 -73.8250853951783 -62.600000000000065
+ vertex 182.95785573205208 -77.6118235133703 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 182.95785573205208 -77.6118235133703 -62.600000000000065
+ vertex 185.01582266574815 -73.8250853951783 -62.600000000000065
+ vertex 185.4800065668526 -75.36828698255519 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 182.95785573205208 -77.6118235133703 -62.600000000000065
+ vertex 185.4800065668526 -75.36828698255519 -62.600000000000065
+ vertex 183.2654682354717 -79.06564190936425 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 183.2654682354717 -79.06564190936425 -62.600000000000065
+ vertex 185.4800065668526 -75.36828698255519 -62.600000000000065
+ vertex 183.51200882063426 -80.53105349682295 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 183.51200882063426 -80.53105349682295 -62.600000000000065
+ vertex 185.4800065668526 -75.36828698255519 -62.600000000000065
+ vertex 185.87924330029884 -76.9295518108256 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 183.51200882063426 -80.53105349682295 -62.600000000000065
+ vertex 185.87924330029884 -76.9295518108256 -62.600000000000065
+ vertex 183.6970460629663 -82.00549393296835 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 183.6970460629663 -82.00549393296835 -62.600000000000065
+ vertex 185.87924330029884 -76.9295518108256 -62.600000000000065
+ vertex 186.2128342365394 -78.50614780237994 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 183.6970460629663 -82.00549393296835 -62.600000000000065
+ vertex 186.2128342365394 -78.50614780237994 -62.600000000000065
+ vertex 183.82025616339308 -83.48638307532282 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 183.82025616339308 -83.48638307532282 -62.600000000000065
+ vertex 186.2128342365394 -78.50614780237994 -62.600000000000065
+ vertex 186.4801956204604 -80.09531605140675 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 183.82025616339308 -83.48638307532282 -62.600000000000065
+ vertex 186.4801956204604 -80.09531605140675 -62.600000000000065
+ vertex 183.88142351495898 -84.97112949673388 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 183.88142351495898 -84.97112949673388 -62.600000000000065
+ vertex 186.4801956204604 -80.09531605140675 -62.600000000000065
+ vertex 186.68085959290207 -81.69427565173784 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 183.88142351495898 -84.97112949673388 -62.600000000000065
+ vertex 186.68085959290207 -81.69427565173784 -62.600000000000065
+ vertex 183.88044108012068 -86.4571350201463 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 183.88044108012068 -86.4571350201463 -62.600000000000065
+ vertex 186.68085959290207 -81.69427565173784 -62.600000000000065
+ vertex 183.81731057805365 -87.94179926518602 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 183.81731057805365 -87.94179926518602 -62.600000000000065
+ vertex 186.68085959290207 -81.69427565173784 -62.600000000000065
+ vertex 186.81447500937168 -83.3002285631922 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 183.81731057805365 -87.94179926518602 -62.600000000000065
+ vertex 186.81447500937168 -83.3002285631922 -62.600000000000065
+ vertex 183.6921424816438 -89.42252419859925 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 183.6921424816438 -89.42252419859925 -62.600000000000065
+ vertex 186.81447500937168 -83.3002285631922 -62.600000000000065
+ vertex 186.88080805451577 -84.91036450790278 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 183.6921424816438 -89.42252419859925 -62.600000000000065
+ vertex 186.88080805451577 -84.91036450790278 -62.600000000000065
+ vertex 183.50515582416938 -90.89671868058495 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 183.50515582416938 -90.89671868058495 -62.600000000000065
+ vertex 186.88080805451577 -84.91036450790278 -62.600000000000065
+ vertex 186.87974265127676 -86.52186588805824 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 183.50515582416938 -90.89671868058495 -62.600000000000065
+ vertex 186.87974265127676 -86.52186588805824 -62.600000000000065
+ vertex 183.4496386991948 -91.22406060436526 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 183.4496386991948 -91.22406060436526 -62.600000000000065
+ vertex 186.87974265127676 -86.52186588805824 -62.600000000000065
+ vertex 182.58046225985305 -93.60899269908614 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 182.58046225985305 -93.60899269908614 -62.600000000000065
+ vertex 186.87974265127676 -86.52186588805824 -62.600000000000065
+ vertex 172.33046225985305 -111.36251347666713 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 172.33046225985305 -111.36251347666713 -62.600000000000065
+ vertex 186.87974265127676 -86.52186588805824 -62.600000000000065
+ vertex 168.34247059737294 -118.62936291914629 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 168.34247059737294 -118.62936291914629 -62.600000000000065
+ vertex 186.87974265127676 -86.52186588805824 -62.600000000000065
+ vertex 169.70258105841674 -117.76504968478835 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 169.70258105841674 -117.76504968478835 -62.600000000000065
+ vertex 186.87974265127676 -86.52186588805824 -62.600000000000065
+ vertex 186.81128066401757 -88.13191271645411 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 169.70258105841674 -117.76504968478835 -62.600000000000065
+ vertex 186.81128066401757 -88.13191271645411 -62.600000000000065
+ vertex 171.02535347370687 -116.84460904537994 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 171.02535347370687 -116.84460904537994 -62.600000000000065
+ vertex 186.81128066401757 -88.13191271645411 -62.600000000000065
+ vertex 186.67554189525936 -89.7376875512249 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 171.02535347370687 -116.84460904537994 -62.600000000000065
+ vertex 186.67554189525936 -89.7376875512249 -62.600000000000065
+ vertex 186.4727638760373 -91.33638042612219 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 171.02535347370687 -116.84460904537994 -62.600000000000065
+ vertex 186.4727638760373 -91.33638042612219 -62.600000000000065
+ vertex 172.3084731066061 -115.86965169195585 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 172.3084731066061 -115.86965169195585 -62.600000000000065
+ vertex 186.4727638760373 -91.33638042612219 -62.600000000000065
+ vertex 173.54969460939628 -114.84188371505721 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 173.54969460939628 -114.84188371505721 -62.600000000000065
+ vertex 186.4727638760373 -91.33638042612219 -62.600000000000065
+ vertex 186.203301450242 -92.92519376771133 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 173.54969460939628 -114.84188371505721 -62.600000000000065
+ vertex 186.203301450242 -92.92519376771133 -62.600000000000065
+ vertex 174.74684595244167 -113.76310361922127 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 174.74684595244167 -113.76310361922127 -62.600000000000065
+ vertex 186.203301450242 -92.92519376771133 -62.600000000000065
+ vertex 185.8676261536738 -94.50134729088121 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 174.74684595244167 -113.76310361922127 -62.600000000000065
+ vertex 185.8676261536738 -94.50134729088121 -62.600000000000065
+ vertex 185.46632538889568 -96.06208286410163 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 174.74684595244167 -113.76310361922127 -62.600000000000065
+ vertex 185.46632538889568 -96.06208286410163 -62.600000000000065
+ vertex 175.89783222505156 -112.63519917575516 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 175.89783222505156 -112.63519917575516 -62.600000000000065
+ vertex 185.46632538889568 -96.06208286410163 -62.600000000000065
+ vertex 185.00010139733044 -97.60466933591319 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 175.89783222505156 -112.63519917575516 -62.600000000000065
+ vertex 185.00010139733044 -97.60466933591319 -62.600000000000065
+ vertex 177.00063930139194 -111.46014411930008 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 177.00063930139194 -111.46014411930008 -62.600000000000065
+ vertex 185.00010139733044 -97.60466933591319 -62.600000000000065
+ vertex 184.46977003039888 -99.12640731420494 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 177.00063930139194 -111.46014411930008 -62.600000000000065
+ vertex 184.46977003039888 -99.12640731420494 -62.600000000000065
+ vertex 178.05333736503042 -110.23999469396772 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 178.05333736503042 -110.23999469396772 -62.600000000000065
+ vertex 184.46977003039888 -99.12640731420494 -62.600000000000065
+ vertex 183.8762593218509 -100.62463388991569 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 178.05333736503042 -110.23999469396772 -62.600000000000065
+ vertex 183.8762593218509 -100.62463388991569 -62.600000000000065
+ vertex 179.0540842859469 -108.97688605509173 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 179.0540842859469 -108.97688605509173 -62.600000000000065
+ vertex 183.8762593218509 -100.62463388991569 -62.600000000000065
+ vertex 183.22060786378736 -102.09672729689305 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 179.0540842859469 -108.97688605509173 -62.600000000000065
+ vertex 183.22060786378736 -102.09672729689305 -62.600000000000065
+ vertex 180.00112884410115 -107.6730285328917 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 180.00112884410115 -107.6730285328917 -62.600000000000065
+ vertex 183.22060786378736 -102.09672729689305 -62.600000000000065
+ vertex 182.50396298921405 -103.5401114997562 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 180.00112884410115 -107.6730285328917 -62.600000000000065
+ vertex 182.50396298921405 -103.5401114997562 -62.600000000000065
+ vertex 180.8928137939151 -106.33070376458772 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 180.8928137939151 -106.33070376458772 -62.600000000000065
+ vertex 182.50396298921405 -103.5401114997562 -62.600000000000065
+ vertex 181.72757876430887 -104.95226070173364 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 150.02753457015433 -104.48202726980836 -62.600000000000065
+ vertex 153.02753457015433 -104.48202726980838 -62.60000000000008
+ vertex 150.02753457015433 -121.17248787278362 -62.60000000000008
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 153.02753457015433 -104.48202726980838 -62.60000000000008
+ vertex 150.02753457015433 -104.48202726980836 -62.600000000000065
+ vertex 154.57694148227205 -101.11251347666712 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 154.57694148227205 -101.11251347666712 -62.600000000000065
+ vertex 150.02753457015433 -104.48202726980836 -62.600000000000065
+ vertex 164.82694148227205 -83.35899269908614 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 150.02753457015433 -121.17248787278362 -62.60000000000008
+ vertex 153.02753457015433 -104.48202726980838 -62.60000000000008
+ vertex 152.85873887103978 -120.9285537079229 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 150.02753457015433 -121.17248787278362 -62.60000000000008
+ vertex 152.85873887103978 -120.9285537079229 -62.600000000000065
+ vertex 150.02753457015433 -124.17799915024115 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 150.02753457015433 -124.17799915024115 -62.600000000000065
+ vertex 152.85873887103978 -120.9285537079229 -62.600000000000065
+ vertex 151.63572936288375 -124.07481319206391 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 151.63572936288375 -124.07481319206391 -62.600000000000065
+ vertex 152.85873887103978 -120.9285537079229 -62.600000000000065
+ vertex 154.32855554350078 -120.7098019533102 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 151.63572936288375 -124.07481319206391 -62.600000000000065
+ vertex 154.32855554350078 -120.7098019533102 -62.600000000000065
+ vertex 153.23820152839704 -123.90445829168752 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 153.23820152839704 -123.90445829168752 -62.600000000000065
+ vertex 154.32855554350078 -120.7098019533102 -62.600000000000065
+ vertex 155.78793737722236 -120.42976973338907 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 153.23820152839704 -123.90445829168752 -62.600000000000065
+ vertex 155.78793737722236 -120.42976973338907 -62.600000000000065
+ vertex 154.83214687982968 -123.66723255536573 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 154.83214687982968 -123.66723255536573 -62.600000000000065
+ vertex 155.78793737722236 -120.42976973338907 -62.600000000000065
+ vertex 157.23433058097086 -120.0889470801798 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 154.83214687982968 -123.66723255536573 -62.600000000000065
+ vertex 157.23433058097086 -120.0889470801798 -62.600000000000065
+ vertex 156.41477615149986 -123.36355110749695 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 156.41477615149986 -123.36355110749695 -62.600000000000065
+ vertex 157.23433058097086 -120.0889470801798 -62.600000000000065
+ vertex 158.66520409248508 -119.68793040367179 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 156.41477615149986 -123.36355110749695 -62.600000000000065
+ vertex 158.66520409248508 -119.68793040367179 -62.600000000000065
+ vertex 157.98331987988098 -122.99394536419275 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 157.98331987988098 -122.99394536419275 -62.600000000000065
+ vertex 158.66520409248508 -119.68793040367179 -62.600000000000065
+ vertex 160.07805400761478 -119.22742144815793 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 157.98331987988098 -122.99394536419275 -62.600000000000065
+ vertex 160.07805400761478 -119.22742144815793 -62.600000000000065
+ vertex 161.47040796193536 -118.70822606424322 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 157.98331987988098 -122.99394536419275 -62.600000000000065
+ vertex 161.47040796193536 -118.70822606424322 -62.600000000000065
+ vertex 159.5350332499214 -122.55906210334588 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 159.5350332499214 -122.55906210334588 -62.600000000000065
+ vertex 161.47040796193536 -118.70822606424322 -62.600000000000065
+ vertex 162.83982945717034 -118.13125279867626 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 159.5350332499214 -122.55906210334588 -62.600000000000065
+ vertex 162.83982945717034 -118.13125279867626 -62.600000000000065
+ vertex 161.06720089823247 -122.05966233282527 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 161.06720089823247 -122.05966233282527 -62.600000000000065
+ vertex 162.83982945717034 -118.13125279867626 -62.600000000000065
+ vertex 164.18392212485122 -117.49751130447146 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 161.06720089823247 -122.05966233282527 -62.600000000000065
+ vertex 164.18392212485122 -117.49751130447146 -62.600000000000065
+ vertex 162.5771416647378 -121.49661995877844 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 162.5771416647378 -121.49661995877844 -62.600000000000065
+ vertex 164.18392212485122 -117.49751130447146 -62.600000000000065
+ vertex 165.50033391975418 -116.80811057410422 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 162.5771416647378 -121.49661995877844 -62.600000000000065
+ vertex 165.50033391975418 -116.80811057410422 -62.600000000000065
+ vertex 164.0622132844704 -120.87092025637166 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 164.0622132844704 -120.87092025637166 -62.600000000000065
+ vertex 165.50033391975418 -116.80811057410422 -62.600000000000065
+ vertex 166.7867612357742 -116.06425699887048 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 164.0622132844704 -120.87092025637166 -62.600000000000065
+ vertex 166.7867612357742 -116.06425699887048 -62.600000000000065
+ vertex 168.04095293703554 -115.26725225780693 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 164.0622132844704 -120.87092025637166 -62.600000000000065
+ vertex 168.04095293703554 -115.26725225780693 -62.600000000000065
+ vertex 165.51981701130626 -120.18365814564442 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 165.51981701130626 -120.18365814564442 -62.600000000000065
+ vertex 168.04095293703554 -115.26725225780693 -62.600000000000065
+ vertex 169.26071429718345 -114.41849103986603 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 165.51981701130626 -120.18365814564442 -62.600000000000065
+ vertex 169.26071429718345 -114.41849103986603 -62.600000000000065
+ vertex 166.9474021655441 -119.43603627549429 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 166.9474021655441 -119.43603627549429 -62.600000000000065
+ vertex 169.26071429718345 -114.41849103986603 -62.600000000000065
+ vertex 170.4439108399647 -113.51945860333161 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 166.9474021655441 -119.43603627549429 -62.600000000000065
+ vertex 170.4439108399647 -113.51945860333161 -62.600000000000065
+ vertex 168.34247059737294 -118.62936291914629 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 168.34247059737294 -118.62936291914629 -62.600000000000065
+ vertex 170.4439108399647 -113.51945860333161 -62.600000000000065
+ vertex 170.6996386991948 -113.30770840086842 -62.60000000000009
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 168.34247059737294 -118.62936291914629 -62.600000000000065
+ vertex 170.6996386991948 -113.30770840086842 -62.60000000000009
+ vertex 172.33046225985305 -111.36251347666713 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 164.82694148227205 -83.35899269908614 -62.600000000000065
+ vertex 168.16311056879684 -82.39837947330521 -62.600000000000065
+ vertex 171.40253457015433 -87.15541313845642 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 168.16311056879684 -82.39837947330521 -62.600000000000065
+ vertex 164.82694148227205 -83.35899269908614 -62.600000000000065
+ vertex 166.97032256947557 -80.33241005582236 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 171.40253457015433 -87.15541313845642 -62.600000000000065
+ vertex 168.16311056879684 -82.39837947330521 -62.600000000000065
+ vertex 183.4496386991948 -91.22406060436526 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 171.40253457015433 -87.15541313845642 -62.600000000000065
+ vertex 183.4496386991948 -91.22406060436526 -62.600000000000065
+ vertex 175.9553679209021 -89.78399269908614 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 171.40253457015433 -87.15541313845642 -62.600000000000065
+ vertex 175.9553679209021 -89.78399269908614 -62.600000000000065
+ vertex 170.40253457015433 -88.88746394602529 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 175.9553679209021 -89.78399269908614 -62.600000000000065
+ vertex 183.4496386991948 -91.22406060436526 -62.600000000000065
+ vertex 182.58046225985305 -93.60899269908614 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 174.9553679209021 -91.51604350665501 -62.600000000000065
+ vertex 170.40253457015433 -88.88746394602529 -62.600000000000065
+ vertex 175.9553679209021 -89.78399269908614 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 121.65644752391404 -94.32133391112714 -62.600000000000065
+ vertex 121.62891295376006 -94.3690251855984 -62.600000000000044
+ vertex 142.51289504782764 -58.196907134314685 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 135.5156220310963 -29.85127058648539 -62.600000000000065
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 134.36092149271707 -31.851270586485388 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 135.5156220310963 -29.85127058648539 -62.600000000000065
+ vertex 135.85382598854784 -29.401780843702213 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 135.85382598854784 -29.401780843702213 -62.600000000000065
+ vertex 136.2476728386652 -29.119219778916513 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 136.2476728386652 -29.119219778916513 -62.600000000000065
+ vertex 136.67032256947556 -29.022843461739203 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 136.67032256947556 -29.022843461739203 -62.600000000000065
+ vertex 137.09297230028594 -29.119219778916523 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 137.09297230028594 -29.119219778916523 -62.600000000000065
+ vertex 137.4868191504033 -29.401780843702223 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 137.4868191504033 -29.401780843702223 -62.600000000000065
+ vertex 137.8250231078548 -29.851270586485416 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 137.8250231078548 -29.851270586485416 -62.600000000000065
+ vertex 165.47032256947557 -77.73433384446905 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 165.47032256947557 -77.73433384446905 -62.600000000000065
+ vertex 149.16412596495886 -57.614999830572565 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 149.16412596495886 -57.614999830572565 -62.600000000000065
+ vertex 148.66181311184843 -57.11268697746215 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 148.66181311184843 -57.11268697746215 -62.600000000000065
+ vertex 148.0799058081063 -56.70523109684263 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 148.0799058081063 -56.70523109684263 -62.600000000000065
+ vertex 147.4360850126974 -56.40501252946401 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 147.4360850126974 -56.40501252946401 -62.600000000000065
+ vertex 146.74991289470114 -56.22115326457817 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 146.74991289470114 -56.22115326457817 -62.600000000000065
+ vertex 146.042238446703 -56.15923977291135 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 146.042238446703 -56.15923977291135 -62.600000000000065
+ vertex 145.33456399870488 -56.221153264578156 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 145.33456399870488 -56.221153264578156 -62.600000000000065
+ vertex 144.6483918807086 -56.40501252946401 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 144.6483918807086 -56.40501252946401 -62.600000000000065
+ vertex 144.00457108529966 -56.70523109684263 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 144.00457108529966 -56.70523109684263 -62.600000000000065
+ vertex 143.42266378155756 -57.11268697746215 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 143.42266378155756 -57.11268697746215 -62.600000000000065
+ vertex 142.92035092844716 -57.61499983057255 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 142.92035092844716 -57.61499983057255 -62.600000000000065
+ vertex 142.51289504782764 -58.196907134314685 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 143.55963228918762 -47.78390505010473 -62.600000000000065
+ vertex 142.51289504782764 -58.196907134314685 -62.600000000000065
+ vertex 113.1343572398539 -100.48202726980834 -62.600000000000044
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 149.16412596495886 -57.614999830572565 -62.600000000000065
+ vertex 165.47032256947557 -77.73433384446905 -62.600000000000065
+ vertex 149.57158184557838 -58.19690713431467 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 149.57158184557838 -58.19690713431467 -62.600000000000065
+ vertex 165.47032256947557 -77.73433384446905 -62.600000000000065
+ vertex 162.26899907810125 -80.18947890594488 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.629858328621002e-16 -5.887874950271871e-17 -1.0
+ outer loop
+ vertex 162.26899907810125 -80.18947890594488 -62.600000000000065
+ vertex 165.47032256947557 -77.73433384446905 -62.600000000000065
+ vertex 150.55309081768112 -100.48202726980837 -62.600000000000065
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 174.9553679209021 -91.51604350665502 -3.000000000000062
+ vertex 171.40253457015433 -87.15541313845642 -3.000000000000062
+ vertex 170.40253457015433 -88.88746394602529 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 164.82694148227205 -83.35899269908614 -3.000000000000062
+ vertex 168.16311056879687 -82.39837947330521 -3.000000000000062
+ vertex 166.9703225694756 -80.33241005582238 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 168.16311056879687 -82.39837947330521 -3.000000000000062
+ vertex 164.82694148227205 -83.35899269908614 -3.000000000000062
+ vertex 171.40253457015433 -87.15541313845642 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 168.16311056879687 -82.39837947330521 -3.000000000000062
+ vertex 171.40253457015433 -87.15541313845642 -3.000000000000062
+ vertex 183.4496386991948 -91.22406060436526 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 183.4496386991948 -91.22406060436526 -3.000000000000062
+ vertex 171.40253457015433 -87.15541313845642 -3.000000000000062
+ vertex 175.9553679209021 -89.78399269908614 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 175.9553679209021 -89.78399269908614 -3.000000000000062
+ vertex 171.40253457015433 -87.15541313845642 -3.000000000000062
+ vertex 174.9553679209021 -91.51604350665502 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 183.4496386991948 -91.22406060436526 -3.000000000000062
+ vertex 175.9553679209021 -89.78399269908614 -3.000000000000062
+ vertex 182.58046225985305 -93.60899269908616 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 135.51562203109634 -29.851270586485406 -3.000000000000062
+ vertex 134.36092149271707 -31.851270586485402 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 135.51562203109634 -29.851270586485406 -3.000000000000062
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 135.85382598854784 -29.401780843702213 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 135.85382598854784 -29.401780843702213 -3.000000000000062
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 136.2476728386652 -29.119219778916513 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 136.2476728386652 -29.119219778916513 -3.000000000000062
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 136.6703225694756 -29.022843461739203 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 136.6703225694756 -29.022843461739203 -3.000000000000062
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 137.09297230028594 -29.119219778916534 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 137.09297230028594 -29.119219778916534 -3.000000000000062
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 137.4868191504033 -29.401780843702223 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 137.4868191504033 -29.401780843702223 -3.000000000000062
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 137.82502310785483 -29.851270586485416 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 137.82502310785483 -29.851270586485416 -3.000000000000062
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 149.16412596495886 -57.614999830572565 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 149.16412596495886 -57.614999830572565 -3.000000000000062
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 148.66181311184843 -57.11268697746215 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 148.66181311184843 -57.11268697746215 -3.000000000000062
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 148.0799058081063 -56.705231096842645 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 148.0799058081063 -56.705231096842645 -3.000000000000062
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 147.4360850126974 -56.405012529464024 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 147.4360850126974 -56.405012529464024 -3.000000000000062
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 146.74991289470114 -56.22115326457817 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 146.74991289470114 -56.22115326457817 -3.000000000000062
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 146.042238446703 -56.159239772911356 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 146.042238446703 -56.159239772911356 -3.000000000000062
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 145.33456399870488 -56.221153264578156 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 145.33456399870488 -56.221153264578156 -3.000000000000062
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 144.6483918807086 -56.405012529464024 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 144.6483918807086 -56.405012529464024 -3.000000000000062
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 144.0045710852997 -56.70523109684263 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 144.0045710852997 -56.70523109684263 -3.000000000000062
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 143.42266378155756 -57.11268697746216 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 143.42266378155756 -57.11268697746216 -3.000000000000062
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 142.9203509284472 -57.61499983057255 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 142.9203509284472 -57.61499983057255 -3.000000000000062
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 142.51289504782764 -58.196907134314685 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 149.16412596495886 -57.614999830572565 -3.000000000000062
+ vertex 149.57158184557838 -58.19690713431467 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 149.57158184557838 -58.19690713431467 -3.000000000000062
+ vertex 162.26899907810125 -80.1894789059449 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 162.26899907810125 -80.1894789059449 -3.000000000000062
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 154.57694148227208 -101.11251347666712 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 154.57694148227208 -101.11251347666712 -3.000000000000062
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 153.02753457015433 -104.48202726980838 -3.0000000000000733
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 153.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 150.02753457015433 -121.17248787278362 -3.0000000000000733
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 153.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 150.02753457015433 -121.17248787278362 -3.0000000000000733
+ vertex 152.85873887103978 -120.9285537079229 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 152.85873887103978 -120.9285537079229 -3.000000000000062
+ vertex 150.02753457015433 -121.17248787278362 -3.0000000000000733
+ vertex 150.02753457015433 -124.17799915024115 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 152.85873887103978 -120.9285537079229 -3.000000000000062
+ vertex 150.02753457015433 -124.17799915024115 -3.000000000000062
+ vertex 151.63572936288375 -124.07481319206391 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 152.85873887103978 -120.9285537079229 -3.000000000000062
+ vertex 151.63572936288375 -124.07481319206391 -3.000000000000062
+ vertex 154.3285555435008 -120.7098019533102 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 154.3285555435008 -120.7098019533102 -3.000000000000062
+ vertex 151.63572936288375 -124.07481319206391 -3.000000000000062
+ vertex 153.23820152839704 -123.90445829168753 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 154.3285555435008 -120.7098019533102 -3.000000000000062
+ vertex 153.23820152839704 -123.90445829168753 -3.000000000000062
+ vertex 155.78793737722236 -120.42976973338907 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 155.78793737722236 -120.42976973338907 -3.000000000000062
+ vertex 153.23820152839704 -123.90445829168753 -3.000000000000062
+ vertex 154.83214687982968 -123.66723255536573 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 155.78793737722236 -120.42976973338907 -3.000000000000062
+ vertex 154.83214687982968 -123.66723255536573 -3.000000000000062
+ vertex 157.23433058097086 -120.0889470801798 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 157.23433058097086 -120.0889470801798 -3.000000000000062
+ vertex 154.83214687982968 -123.66723255536573 -3.000000000000062
+ vertex 156.4147761514999 -123.36355110749695 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 157.23433058097086 -120.0889470801798 -3.000000000000062
+ vertex 156.4147761514999 -123.36355110749695 -3.000000000000062
+ vertex 158.66520409248508 -119.68793040367179 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 158.66520409248508 -119.68793040367179 -3.000000000000062
+ vertex 156.4147761514999 -123.36355110749695 -3.000000000000062
+ vertex 157.98331987988098 -122.99394536419275 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 158.66520409248508 -119.68793040367179 -3.000000000000062
+ vertex 157.98331987988098 -122.99394536419275 -3.000000000000062
+ vertex 160.07805400761478 -119.22742144815793 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 160.07805400761478 -119.22742144815793 -3.000000000000062
+ vertex 157.98331987988098 -122.99394536419275 -3.000000000000062
+ vertex 161.4704079619354 -118.70822606424322 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 161.4704079619354 -118.70822606424322 -3.000000000000062
+ vertex 157.98331987988098 -122.99394536419275 -3.000000000000062
+ vertex 159.5350332499214 -122.55906210334588 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 161.4704079619354 -118.70822606424322 -3.000000000000062
+ vertex 159.5350332499214 -122.55906210334588 -3.000000000000062
+ vertex 162.83982945717034 -118.13125279867626 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 162.83982945717034 -118.13125279867626 -3.000000000000062
+ vertex 159.5350332499214 -122.55906210334588 -3.000000000000062
+ vertex 161.06720089823247 -122.0596623328253 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 162.83982945717034 -118.13125279867626 -3.000000000000062
+ vertex 161.06720089823247 -122.0596623328253 -3.000000000000062
+ vertex 164.18392212485122 -117.49751130447146 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 164.18392212485122 -117.49751130447146 -3.000000000000062
+ vertex 161.06720089823247 -122.0596623328253 -3.000000000000062
+ vertex 162.5771416647378 -121.49661995877844 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 164.18392212485122 -117.49751130447146 -3.000000000000062
+ vertex 162.5771416647378 -121.49661995877844 -3.000000000000062
+ vertex 165.50033391975418 -116.80811057410425 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 165.50033391975418 -116.80811057410425 -3.000000000000062
+ vertex 162.5771416647378 -121.49661995877844 -3.000000000000062
+ vertex 164.0622132844704 -120.87092025637168 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 165.50033391975418 -116.80811057410425 -3.000000000000062
+ vertex 164.0622132844704 -120.87092025637168 -3.000000000000062
+ vertex 166.7867612357742 -116.06425699887048 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 166.7867612357742 -116.06425699887048 -3.000000000000062
+ vertex 164.0622132844704 -120.87092025637168 -3.000000000000062
+ vertex 168.04095293703554 -115.26725225780693 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 168.04095293703554 -115.26725225780693 -3.000000000000062
+ vertex 164.0622132844704 -120.87092025637168 -3.000000000000062
+ vertex 165.51981701130626 -120.18365814564442 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 168.04095293703554 -115.26725225780693 -3.000000000000062
+ vertex 165.51981701130626 -120.18365814564442 -3.000000000000062
+ vertex 169.26071429718345 -114.41849103986604 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 169.26071429718345 -114.41849103986604 -3.000000000000062
+ vertex 165.51981701130626 -120.18365814564442 -3.000000000000062
+ vertex 166.94740216554413 -119.4360362754943 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 169.26071429718345 -114.41849103986604 -3.000000000000062
+ vertex 166.94740216554413 -119.4360362754943 -3.000000000000062
+ vertex 170.4439108399647 -113.51945860333164 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 170.4439108399647 -113.51945860333164 -3.000000000000062
+ vertex 166.94740216554413 -119.4360362754943 -3.000000000000062
+ vertex 168.34247059737294 -118.62936291914629 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 170.4439108399647 -113.51945860333164 -3.000000000000062
+ vertex 168.34247059737294 -118.62936291914629 -3.000000000000062
+ vertex 170.69963869919482 -113.30770840086842 -3.000000000000085
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 170.69963869919482 -113.30770840086842 -3.000000000000085
+ vertex 168.34247059737294 -118.62936291914629 -3.000000000000062
+ vertex 172.33046225985308 -111.36251347666713 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 172.33046225985308 -111.36251347666713 -3.000000000000062
+ vertex 168.34247059737294 -118.62936291914629 -3.000000000000062
+ vertex 182.58046225985305 -93.60899269908616 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 166.9703225694756 -80.33241005582238 -3.000000000000062
+ vertex 179.9246854525155 -69.38910354298146 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 166.9703225694756 -80.33241005582238 -3.000000000000062
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 164.82694148227205 -83.35899269908614 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 164.82694148227205 -83.35899269908614 -3.000000000000062
+ vertex 165.47032256947557 -77.73433384446906 -3.000000000000062
+ vertex 154.57694148227208 -101.11251347666712 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 179.9246854525155 -69.38910354298146 -3.000000000000062
+ vertex 166.9703225694756 -80.33241005582238 -3.000000000000062
+ vertex 181.1290344193379 -71.96296547328224 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 179.9246854525155 -69.38910354298146 -3.000000000000062
+ vertex 181.1290344193379 -71.96296547328224 -3.000000000000062
+ vertex 182.52753457015436 -67.88634790425267 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 182.52753457015436 -67.88634790425267 -3.000000000000062
+ vertex 181.1290344193379 -71.96296547328224 -3.000000000000062
+ vertex 183.24227030542374 -69.33067842807885 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 183.24227030542374 -69.33067842807885 -3.000000000000062
+ vertex 181.1290344193379 -71.96296547328224 -3.000000000000062
+ vertex 181.67449817895138 -73.34523992784575 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 183.24227030542374 -69.33067842807885 -3.000000000000062
+ vertex 181.67449817895138 -73.34523992784575 -3.000000000000062
+ vertex 183.89597471679528 -70.80363748245898 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 183.89597471679528 -70.80363748245898 -3.000000000000062
+ vertex 181.67449817895138 -73.34523992784575 -3.000000000000062
+ vertex 182.16167407948234 -74.74911777963072 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 183.89597471679528 -70.80363748245898 -3.000000000000062
+ vertex 182.16167407948234 -74.74911777963072 -3.000000000000062
+ vertex 184.48750387842546 -72.30264751720465 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 184.48750387842546 -72.30264751720465 -3.000000000000062
+ vertex 182.16167407948234 -74.74911777963072 -3.000000000000062
+ vertex 182.58970960549215 -76.17214236454274 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 184.48750387842546 -72.30264751720465 -3.000000000000062
+ vertex 182.58970960549215 -76.17214236454274 -3.000000000000062
+ vertex 185.01582266574817 -73.8250853951783 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.01582266574817 -73.8250853951783 -3.000000000000062
+ vertex 182.58970960549215 -76.17214236454274 -3.000000000000062
+ vertex 182.95785573205208 -77.6118235133703 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.01582266574817 -73.8250853951783 -3.000000000000062
+ vertex 182.95785573205208 -77.6118235133703 -3.000000000000062
+ vertex 185.4800065668526 -75.36828698255519 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.4800065668526 -75.36828698255519 -3.000000000000062
+ vertex 182.95785573205208 -77.6118235133703 -3.000000000000062
+ vertex 183.26546823547173 -79.06564190936425 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.4800065668526 -75.36828698255519 -3.000000000000062
+ vertex 183.26546823547173 -79.06564190936425 -3.000000000000062
+ vertex 183.51200882063426 -80.53105349682295 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.4800065668526 -75.36828698255519 -3.000000000000062
+ vertex 183.51200882063426 -80.53105349682295 -3.000000000000062
+ vertex 185.87924330029887 -76.9295518108256 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.87924330029887 -76.9295518108256 -3.000000000000062
+ vertex 183.51200882063426 -80.53105349682295 -3.000000000000062
+ vertex 183.6970460629663 -82.00549393296835 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.87924330029887 -76.9295518108256 -3.000000000000062
+ vertex 183.6970460629663 -82.00549393296835 -3.000000000000062
+ vertex 186.2128342365394 -78.50614780237996 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.2128342365394 -78.50614780237996 -3.000000000000062
+ vertex 183.6970460629663 -82.00549393296835 -3.000000000000062
+ vertex 183.8202561633931 -83.48638307532283 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.2128342365394 -78.50614780237996 -3.000000000000062
+ vertex 183.8202561633931 -83.48638307532283 -3.000000000000062
+ vertex 186.48019562046042 -80.09531605140675 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.48019562046042 -80.09531605140675 -3.000000000000062
+ vertex 183.8202561633931 -83.48638307532283 -3.000000000000062
+ vertex 183.88142351495898 -84.9711294967339 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.48019562046042 -80.09531605140675 -3.000000000000062
+ vertex 183.88142351495898 -84.9711294967339 -3.000000000000062
+ vertex 186.6808595929021 -81.69427565173785 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.6808595929021 -81.69427565173785 -3.000000000000062
+ vertex 183.88142351495898 -84.9711294967339 -3.000000000000062
+ vertex 183.88044108012068 -86.45713502014631 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.6808595929021 -81.69427565173785 -3.000000000000062
+ vertex 183.88044108012068 -86.45713502014631 -3.000000000000062
+ vertex 183.81731057805365 -87.94179926518602 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.6808595929021 -81.69427565173785 -3.000000000000062
+ vertex 183.81731057805365 -87.94179926518602 -3.000000000000062
+ vertex 186.81447500937168 -83.3002285631922 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.81447500937168 -83.3002285631922 -3.000000000000062
+ vertex 183.81731057805365 -87.94179926518602 -3.000000000000062
+ vertex 183.6921424816438 -89.42252419859925 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.81447500937168 -83.3002285631922 -3.000000000000062
+ vertex 183.6921424816438 -89.42252419859925 -3.000000000000062
+ vertex 186.8808080545158 -84.91036450790278 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.8808080545158 -84.91036450790278 -3.000000000000062
+ vertex 183.6921424816438 -89.42252419859925 -3.000000000000062
+ vertex 183.5051558241694 -90.89671868058495 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.8808080545158 -84.91036450790278 -3.000000000000062
+ vertex 183.5051558241694 -90.89671868058495 -3.000000000000062
+ vertex 186.87974265127679 -86.52186588805824 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.87974265127679 -86.52186588805824 -3.000000000000062
+ vertex 183.5051558241694 -90.89671868058495 -3.000000000000062
+ vertex 183.4496386991948 -91.22406060436526 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.87974265127679 -86.52186588805824 -3.000000000000062
+ vertex 183.4496386991948 -91.22406060436526 -3.000000000000062
+ vertex 182.58046225985305 -93.60899269908616 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.87974265127679 -86.52186588805824 -3.000000000000062
+ vertex 182.58046225985305 -93.60899269908616 -3.000000000000062
+ vertex 168.34247059737294 -118.62936291914629 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.87974265127679 -86.52186588805824 -3.000000000000062
+ vertex 168.34247059737294 -118.62936291914629 -3.000000000000062
+ vertex 169.70258105841677 -117.76504968478835 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.87974265127679 -86.52186588805824 -3.000000000000062
+ vertex 169.70258105841677 -117.76504968478835 -3.000000000000062
+ vertex 186.8112806640176 -88.13191271645411 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.8112806640176 -88.13191271645411 -3.000000000000062
+ vertex 169.70258105841677 -117.76504968478835 -3.000000000000062
+ vertex 171.0253534737069 -116.84460904537994 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.8112806640176 -88.13191271645411 -3.000000000000062
+ vertex 171.0253534737069 -116.84460904537994 -3.000000000000062
+ vertex 186.67554189525939 -89.7376875512249 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.67554189525939 -89.7376875512249 -3.000000000000062
+ vertex 171.0253534737069 -116.84460904537994 -3.000000000000062
+ vertex 172.3084731066061 -115.86965169195585 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.67554189525939 -89.7376875512249 -3.000000000000062
+ vertex 172.3084731066061 -115.86965169195585 -3.000000000000062
+ vertex 186.4727638760373 -91.33638042612219 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.4727638760373 -91.33638042612219 -3.000000000000062
+ vertex 172.3084731066061 -115.86965169195585 -3.000000000000062
+ vertex 173.54969460939628 -114.84188371505721 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.4727638760373 -91.33638042612219 -3.000000000000062
+ vertex 173.54969460939628 -114.84188371505721 -3.000000000000062
+ vertex 186.203301450242 -92.92519376771133 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.203301450242 -92.92519376771133 -3.000000000000062
+ vertex 173.54969460939628 -114.84188371505721 -3.000000000000062
+ vertex 174.74684595244167 -113.7631036192213 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 186.203301450242 -92.92519376771133 -3.000000000000062
+ vertex 174.74684595244167 -113.7631036192213 -3.000000000000062
+ vertex 185.8676261536738 -94.50134729088121 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.8676261536738 -94.50134729088121 -3.000000000000062
+ vertex 174.74684595244167 -113.7631036192213 -3.000000000000062
+ vertex 175.89783222505156 -112.63519917575516 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.8676261536738 -94.50134729088121 -3.000000000000062
+ vertex 175.89783222505156 -112.63519917575516 -3.000000000000062
+ vertex 185.4663253888957 -96.06208286410164 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.4663253888957 -96.06208286410164 -3.000000000000062
+ vertex 175.89783222505156 -112.63519917575516 -3.000000000000062
+ vertex 177.00063930139197 -111.46014411930008 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.4663253888957 -96.06208286410164 -3.000000000000062
+ vertex 177.00063930139197 -111.46014411930008 -3.000000000000062
+ vertex 185.00010139733047 -97.60466933591319 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.00010139733047 -97.60466933591319 -3.000000000000062
+ vertex 177.00063930139197 -111.46014411930008 -3.000000000000062
+ vertex 178.05333736503042 -110.23999469396773 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 185.00010139733047 -97.60466933591319 -3.000000000000062
+ vertex 178.05333736503042 -110.23999469396773 -3.000000000000062
+ vertex 184.4697700303989 -99.12640731420495 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 184.4697700303989 -99.12640731420495 -3.000000000000062
+ vertex 178.05333736503042 -110.23999469396773 -3.000000000000062
+ vertex 179.0540842859469 -108.97688605509173 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 184.4697700303989 -99.12640731420495 -3.000000000000062
+ vertex 179.0540842859469 -108.97688605509173 -3.000000000000062
+ vertex 183.8762593218509 -100.6246338899157 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 183.8762593218509 -100.6246338899157 -3.000000000000062
+ vertex 179.0540842859469 -108.97688605509173 -3.000000000000062
+ vertex 180.00112884410115 -107.6730285328917 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 183.8762593218509 -100.6246338899157 -3.000000000000062
+ vertex 180.00112884410115 -107.6730285328917 -3.000000000000062
+ vertex 183.2206078637874 -102.09672729689308 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 183.2206078637874 -102.09672729689308 -3.000000000000062
+ vertex 180.00112884410115 -107.6730285328917 -3.000000000000062
+ vertex 182.50396298921407 -103.54011149975622 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 182.50396298921407 -103.54011149975622 -3.000000000000062
+ vertex 180.00112884410115 -107.6730285328917 -3.000000000000062
+ vertex 180.8928137939151 -106.33070376458772 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 182.50396298921407 -103.54011149975622 -3.000000000000062
+ vertex 180.8928137939151 -106.33070376458772 -3.000000000000062
+ vertex 181.7275787643089 -104.95226070173364 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 154.57694148227208 -101.11251347666712 -3.000000000000062
+ vertex 155.41311056879684 -104.48202726980838 -3.0000000000000733
+ vertex 161.15253457015433 -104.9089339160374 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 155.41311056879684 -104.48202726980838 -3.0000000000000733
+ vertex 154.57694148227208 -101.11251347666712 -3.000000000000062
+ vertex 153.02753457015433 -104.48202726980838 -3.0000000000000733
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 161.15253457015433 -104.9089339160374 -3.000000000000062
+ vertex 155.41311056879684 -104.48202726980838 -3.0000000000000733
+ vertex 170.69963869919482 -113.30770840086842 -3.000000000000085
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 161.15253457015433 -104.9089339160374 -3.000000000000062
+ vertex 170.69963869919482 -113.30770840086842 -3.000000000000085
+ vertex 165.70536792090212 -107.53751347666713 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 161.15253457015433 -104.9089339160374 -3.000000000000062
+ vertex 165.70536792090212 -107.53751347666713 -3.000000000000062
+ vertex 162.15253457015433 -103.17688310846853 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 165.70536792090212 -107.53751347666713 -3.000000000000062
+ vertex 170.69963869919482 -113.30770840086842 -3.000000000000085
+ vertex 172.33046225985308 -111.36251347666713 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 166.70536792090212 -105.80546266909826 -3.000000000000062
+ vertex 162.15253457015433 -103.17688310846853 -3.000000000000062
+ vertex 165.70536792090212 -107.53751347666713 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 93.3620675512686 -102.99966536001337 -3.0000000000000284
+ vertex 94.73693564691284 -100.48202726980834 -3.0000000000000284
+ vertex 93.5822351085336 -102.48202726980831 -3.0000000000000284
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 94.73693564691284 -100.48202726980834 -3.0000000000000284
+ vertex 93.3620675512686 -102.99966536001337 -3.0000000000000284
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 93.3620675512686 -102.99966536001337 -3.0000000000000284
+ vertex 93.31428591610248 -103.48202726980831 -3.0000000000000284
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 93.31428591610248 -103.48202726980831 -3.0000000000000284
+ vertex 93.44214644250893 -103.89624083218142 -3.0000000000000284
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 93.44214644250893 -103.89624083218142 -3.0000000000000284
+ vertex 93.73693564691285 -104.21407807737721 -3.0000000000000284
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 93.73693564691285 -104.21407807737721 -3.0000000000000284
+ vertex 94.17856413219633 -104.41387892238646 -3.0000000000000284
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 94.17856413219633 -104.41387892238646 -3.0000000000000284
+ vertex 94.73693564691285 -104.48202726980834 -3.0000000000000284
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 94.73693564691285 -104.48202726980834 -3.0000000000000284
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 124.45058190463727 -100.42011377814154 -3.000000000000051
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 124.45058190463727 -100.42011377814154 -3.000000000000051
+ vertex 123.76440978664102 -100.2362545132557 -3.000000000000051
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 123.76440978664102 -100.2362545132557 -3.000000000000051
+ vertex 123.12058899123211 -99.93603594587707 -3.000000000000051
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 123.12058899123211 -99.93603594587707 -3.000000000000051
+ vertex 122.53868168748998 -99.52858006525757 -3.000000000000051
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 122.53868168748998 -99.52858006525757 -3.000000000000051
+ vertex 122.03636883437957 -99.02626721214715 -3.000000000000051
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 122.03636883437957 -99.02626721214715 -3.000000000000051
+ vertex 121.62891295376006 -98.44435990840505 -3.000000000000051
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 121.62891295376006 -98.44435990840505 -3.000000000000051
+ vertex 121.32869438638144 -97.80053911299613 -3.000000000000051
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 121.32869438638144 -97.80053911299613 -3.000000000000051
+ vertex 121.14483512149559 -97.11436699499987 -3.000000000000051
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 121.14483512149559 -97.11436699499987 -3.000000000000051
+ vertex 121.07305832758566 -96.49857203241152 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 121.07305832758566 -96.49857203241152 -3.000000000000062
+ vertex 121.13921260616522 -95.74242516819551 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 121.13921260616522 -95.74242516819551 -3.000000000000062
+ vertex 121.14483512149559 -95.69901809900358 -3.000000000000051
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 121.14483512149559 -95.69901809900358 -3.000000000000051
+ vertex 121.33566537762498 -95.00925344381994 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 121.33566537762498 -95.00925344381994 -3.000000000000062
+ vertex 121.62891295376006 -94.3690251855984 -3.000000000000051
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 113.13435723985393 -100.48202726980836 -3.0000000000000395
+ vertex 121.62891295376006 -94.3690251855984 -3.000000000000051
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 143.55963228918762 -47.78390505010474 -3.000000000000062
+ vertex 121.62891295376006 -94.3690251855984 -3.000000000000051
+ vertex 142.51289504782764 -58.196907134314685 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 121.13921260616522 -95.74242516819551 -3.000000000000062
+ vertex 121.07305832758566 -96.49857203241152 -3.000000000000062
+ vertex 121.08292162982879 -96.40669254700173 -3.000000000000051
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 124.45058190463727 -100.42011377814154 -3.000000000000051
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 125.15825635263542 -100.48202726980836 -3.000000000000051
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 125.15825635263542 -100.48202726980836 -3.000000000000051
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 150.55309081768115 -100.48202726980838 -3.0000000000000733
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 150.55309081768115 -100.48202726980838 -3.0000000000000733
+ vertex 150.02753457015433 -104.48202726980838 -3.0000000000000733
+ vertex 162.26899907810125 -80.1894789059449 -3.000000000000062
+ endloop
+endfacet
+facet normal 3.10220314556862e-16 7.227945163972765e-17 1.0
+ outer loop
+ vertex 121.65644752391407 -94.32133391112714 -3.000000000000062
+ vertex 142.51289504782764 -58.196907134314685 -3.000000000000062
+ vertex 121.62891295376006 -94.3690251855984 -3.000000000000051
+ endloop
+endfacet
+facet normal 0.49892946161930196 0.8641711769176166 -0.0654031292301445
+ outer loop
+ vertex 122.39832559627791 -84.43636339677167 -31.233685693359433
+ vertex 126.07090400079386 -86.67527100536981 -32.800000000000054
+ vertex 122.34699476452076 -84.5252710053698 -32.800000000000054
+ endloop
+endfacet
+facet normal 0.49892946161930196 0.8641711769176166 -0.0654031292301445
+ outer loop
+ vertex 126.07090400079386 -86.67527100536981 -32.800000000000054
+ vertex 122.39832559627791 -84.43636339677167 -31.233685693359433
+ vertex 126.12223483255102 -86.58636339677167 -31.233685693359433
+ endloop
+endfacet
+facet normal 0.4903926402016156 0.8493849684870416 -0.19509032201612717
+ outer loop
+ vertex 122.55143980678636 -84.17116180481023 -29.6941714587698
+ vertex 126.12223483255102 -86.58636339677167 -31.233685693359433
+ vertex 122.39832559627791 -84.43636339677167 -31.233685693359433
+ endloop
+endfacet
+facet normal 0.4903926402016156 0.8493849684870416 -0.19509032201612717
+ outer loop
+ vertex 126.12223483255102 -86.58636339677167 -31.233685693359433
+ vertex 122.55143980678636 -84.17116180481023 -29.6941714587698
+ vertex 126.27534904305944 -86.32116180481025 -29.6941714587698
+ endloop
+endfacet
+facet normal 0.47346506474755257 0.8200655477516486 -0.321439465303165
+ outer loop
+ vertex 122.80371756945306 -83.73420390225172 -28.207798811618975
+ vertex 126.27534904305944 -86.32116180481025 -29.6941714587698
+ vertex 122.55143980678636 -84.17116180481023 -29.6941714587698
+ endloop
+endfacet
+facet normal 0.47346506474755257 0.8200655477516486 -0.321439465303165
+ outer loop
+ vertex 126.27534904305944 -86.32116180481025 -29.6941714587698
+ vertex 122.80371756945306 -83.73420390225172 -28.207798811618975
+ vertex 126.52762680572613 -85.88420390225173 -28.207798811618975
+ endloop
+endfacet
+facet normal 0.44843637076634585 0.7767145781291053 -0.4422886902189955
+ outer loop
+ vertex 123.15084234181414 -83.13296615995655 -26.800000000000054
+ vertex 126.52762680572613 -85.88420390225173 -28.207798811618975
+ vertex 122.80371756945306 -83.73420390225172 -28.207798811618975
+ endloop
+endfacet
+facet normal 0.44843637076634585 0.7767145781291053 -0.4422886902189955
+ outer loop
+ vertex 126.52762680572613 -85.88420390225173 -28.207798811618975
+ vertex 123.15084234181414 -83.13296615995655 -26.800000000000054
+ vertex 126.87475157808723 -85.28296615995656 -26.800000000000054
+ endloop
+endfacet
+facet normal 0.4157348061512734 0.7200738067288033 -0.5555702330196006
+ outer loop
+ vertex 123.58687472277336 -82.37773592238995 -25.4948628518954
+ vertex 126.87475157808723 -85.28296615995656 -26.800000000000054
+ vertex 123.15084234181414 -83.13296615995655 -26.800000000000054
+ endloop
+endfacet
+facet normal 0.4157348061512734 0.7200738067288033 -0.5555702330196006
+ outer loop
+ vertex 126.87475157808723 -85.28296615995656 -26.800000000000054
+ vertex 123.58687472277336 -82.37773592238995 -25.4948628518954
+ vertex 127.31078395904645 -84.52773592238995 -25.4948628518954
+ endloop
+endfacet
+facet normal 0.37591990373948686 0.6511123728531923 -0.6593458151000737
+ outer loop
+ vertex 124.1043540774015 -81.48143538830607 -24.314718625761483
+ vertex 127.31078395904645 -84.52773592238995 -25.4948628518954
+ vertex 123.58687472277336 -82.37773592238995 -25.4948628518954
+ endloop
+endfacet
+facet normal 0.37591990373948686 0.6511123728531923 -0.6593458151000737
+ outer loop
+ vertex 127.31078395904645 -84.52773592238995 -25.4948628518954
+ vertex 124.1043540774015 -81.48143538830607 -24.314718625761483
+ vertex 127.82826331367458 -83.63143538830607 -24.314718625761483
+ endloop
+endfacet
+facet normal 0.3296729075500369 0.5710102257556209 -0.7518398074789735
+ outer loop
+ vertex 128.41833542674155 -82.60940050834459 -23.279759916505228
+ vertex 124.1043540774015 -81.48143538830607 -24.314718625761483
+ vertex 124.69442619046845 -80.45940050834457 -23.279759916505228
+ endloop
+endfacet
+facet normal 0.3296729075500369 0.5710102257556209 -0.7518398074789735
+ outer loop
+ vertex 124.1043540774015 -81.48143538830607 -24.314718625761483
+ vertex 128.41833542674155 -82.60940050834459 -23.279759916505228
+ vertex 127.82826331367458 -83.63143538830607 -24.314718625761483
+ endloop
+endfacet
+facet normal 0.2777851165097979 0.48113793538140986 -0.8314696123025498
+ outer loop
+ vertex 129.07090400079386 -81.47911858266316 -22.40769515458679
+ vertex 124.69442619046845 -80.45940050834457 -23.279759916505228
+ vertex 125.34699476452077 -79.32911858266316 -22.40769515458679
+ endloop
+endfacet
+facet normal 0.2777851165097979 0.48113793538140986 -0.8314696123025498
+ outer loop
+ vertex 124.69442619046845 -80.45940050834457 -23.279759916505228
+ vertex 129.07090400079386 -81.47911858266316 -22.40769515458679
+ vertex 128.41833542674155 -82.60940050834459 -23.279759916505228
+ endloop
+endfacet
+facet normal 0.2211443451095007 0.38303324153620094 -0.8968727415326883
+ outer loop
+ vertex 129.77480340660333 -80.25992904838364 -21.71344560986461
+ vertex 125.34699476452077 -79.32911858266316 -22.40769515458679
+ vertex 126.05089417033024 -78.10992904838363 -21.71344560986461
+ endloop
+endfacet
+facet normal 0.2211443451095007 0.38303324153620094 -0.8968727415326883
+ outer loop
+ vertex 125.34699476452077 -79.32911858266316 -22.40769515458679
+ vertex 129.77480340660333 -80.25992904838364 -21.71344560986461
+ vertex 129.07090400079386 -81.47911858266316 -22.40769515458679
+ endloop
+endfacet
+facet normal 0.16071973265158207 0.2783747427314266 -0.9469301294951049
+ outer loop
+ vertex 130.51798973017873 -78.97269257646072 -21.208890084531234
+ vertex 126.05089417033024 -78.10992904838363 -21.71344560986461
+ vertex 126.79408049390564 -76.82269257646071 -21.208890084531234
+ endloop
+endfacet
+facet normal 0.16071973265158207 0.2783747427314266 -0.9469301294951049
+ outer loop
+ vertex 126.05089417033024 -78.10992904838363 -21.71344560986461
+ vertex 130.51798973017873 -78.97269257646072 -21.208890084531234
+ vertex 129.77480340660333 -80.25992904838364 -21.71344560986461
+ endloop
+endfacet
+facet normal 0.09754516100806396 0.16895317489845324 -0.9807852804032307
+ outer loop
+ vertex 131.28774684747356 -77.63943413981835 -20.90266166351433
+ vertex 126.79408049390564 -76.82269257646071 -21.208890084531234
+ vertex 127.56383761120046 -75.48943413981834 -20.90266166351433
+ endloop
+endfacet
+facet normal 0.09754516100806396 0.16895317489845324 -0.9807852804032307
+ outer loop
+ vertex 126.79408049390564 -76.82269257646071 -21.208890084531234
+ vertex 131.28774684747356 -77.63943413981835 -20.90266166351433
+ vertex 130.51798973017873 -78.97269257646072 -21.208890084531234
+ endloop
+endfacet
+facet normal 0.032701564615072155 0.056640771400301514 -0.9978589232386036
+ outer loop
+ vertex 132.07090400079386 -76.28296615995656 -20.80000000000005
+ vertex 127.56383761120046 -75.48943413981834 -20.90266166351433
+ vertex 128.34699476452076 -74.13296615995655 -20.80000000000005
+ endloop
+endfacet
+facet normal 0.032701564615072155 0.056640771400301514 -0.9978589232386036
+ outer loop
+ vertex 127.56383761120046 -75.48943413981834 -20.90266166351433
+ vertex 132.07090400079386 -76.28296615995656 -20.80000000000005
+ vertex 131.28774684747356 -77.63943413981835 -20.90266166351433
+ endloop
+endfacet
+facet normal -0.032701564615072155 -0.056640771400301514 -0.9978589232386036
+ outer loop
+ vertex 132.8540611541142 -74.92649818009477 -20.90266166351433
+ vertex 128.34699476452076 -74.13296615995655 -20.80000000000005
+ vertex 129.1301519178411 -72.77649818009475 -20.90266166351433
+ endloop
+endfacet
+facet normal -0.032701564615072155 -0.056640771400301514 -0.9978589232386036
+ outer loop
+ vertex 128.34699476452076 -74.13296615995655 -20.80000000000005
+ vertex 132.8540611541142 -74.92649818009477 -20.90266166351433
+ vertex 132.07090400079386 -76.28296615995656 -20.80000000000005
+ endloop
+endfacet
+facet normal -0.0975451610080657 -0.16895317489845627 -0.98078528040323
+ outer loop
+ vertex 133.623818271409 -73.5932397434524 -21.208890084531237
+ vertex 129.1301519178411 -72.77649818009475 -20.90266166351433
+ vertex 129.89990903513592 -71.4432397434524 -21.208890084531237
+ endloop
+endfacet
+facet normal -0.0975451610080657 -0.16895317489845627 -0.98078528040323
+ outer loop
+ vertex 129.1301519178411 -72.77649818009475 -20.90266166351433
+ vertex 133.623818271409 -73.5932397434524 -21.208890084531237
+ vertex 132.8540611541142 -74.92649818009477 -20.90266166351433
+ endloop
+endfacet
+facet normal -0.16071973265157824 -0.27837474273141993 -0.9469301294951075
+ outer loop
+ vertex 134.36700459498442 -72.30600327152945 -21.71344560986461
+ vertex 129.89990903513592 -71.4432397434524 -21.208890084531237
+ vertex 130.64309535871132 -70.15600327152943 -21.71344560986461
+ endloop
+endfacet
+facet normal -0.16071973265157824 -0.27837474273141993 -0.9469301294951075
+ outer loop
+ vertex 129.89990903513592 -71.4432397434524 -21.208890084531237
+ vertex 134.36700459498442 -72.30600327152945 -21.71344560986461
+ vertex 133.623818271409 -73.5932397434524 -21.208890084531237
+ endloop
+endfacet
+facet normal -0.22114434510950218 -0.3830332415362035 -0.8968727415326869
+ outer loop
+ vertex 135.07090400079386 -71.08681373724991 -22.407695154586794
+ vertex 130.64309535871132 -70.15600327152943 -21.71344560986461
+ vertex 131.3469947645208 -68.9368137372499 -22.407695154586794
+ endloop
+endfacet
+facet normal -0.22114434510950218 -0.3830332415362035 -0.8968727415326869
+ outer loop
+ vertex 130.64309535871132 -70.15600327152943 -21.71344560986461
+ vertex 135.07090400079386 -71.08681373724991 -22.407695154586794
+ vertex 134.36700459498442 -72.30600327152945 -21.71344560986461
+ endloop
+endfacet
+facet normal -0.2777851165098012 -0.4811379353814156 -0.8314696123025452
+ outer loop
+ vertex 135.7234725748462 -69.95653181156851 -23.279759916505235
+ vertex 131.3469947645208 -68.9368137372499 -22.407695154586794
+ vertex 131.9995633385731 -67.8065318115685 -23.279759916505235
+ endloop
+endfacet
+facet normal -0.2777851165098012 -0.4811379353814156 -0.8314696123025452
+ outer loop
+ vertex 131.3469947645208 -68.9368137372499 -22.407695154586794
+ vertex 135.7234725748462 -69.95653181156851 -23.279759916505235
+ vertex 135.07090400079386 -71.08681373724991 -22.407695154586794
+ endloop
+endfacet
+facet normal -0.3296729075500358 -0.571010225755619 -0.7518398074789752
+ outer loop
+ vertex 136.31354468791315 -68.93449693160701 -24.314718625761483
+ vertex 131.9995633385731 -67.8065318115685 -23.279759916505235
+ vertex 132.58963545164005 -66.78449693160701 -24.314718625761483
+ endloop
+endfacet
+facet normal -0.3296729075500358 -0.571010225755619 -0.7518398074789752
+ outer loop
+ vertex 131.9995633385731 -67.8065318115685 -23.279759916505235
+ vertex 136.31354468791315 -68.93449693160701 -24.314718625761483
+ vertex 135.7234725748462 -69.95653181156851 -23.279759916505235
+ endloop
+endfacet
+facet normal -0.37591990373948836 -0.651112372853195 -0.6593458151000701
+ outer loop
+ vertex 136.31354468791315 -68.93449693160701 -24.314718625761483
+ vertex 133.10711480626819 -65.88819639752313 -25.494862851895416
+ vertex 136.8310240425413 -68.03819639752314 -25.494862851895416
+ endloop
+endfacet
+facet normal -0.37591990373948836 -0.651112372853195 -0.6593458151000701
+ outer loop
+ vertex 133.10711480626819 -65.88819639752313 -25.494862851895416
+ vertex 136.31354468791315 -68.93449693160701 -24.314718625761483
+ vertex 132.58963545164005 -66.78449693160701 -24.314718625761483
+ endloop
+endfacet
+facet normal -0.4157348061512729 -0.7200738067288024 -0.5555702330196023
+ outer loop
+ vertex 136.8310240425413 -68.03819639752314 -25.494862851895416
+ vertex 133.5431471872274 -65.13296615995654 -26.800000000000058
+ vertex 137.2670564235005 -67.28296615995654 -26.800000000000058
+ endloop
+endfacet
+facet normal -0.4157348061512729 -0.7200738067288024 -0.5555702330196023
+ outer loop
+ vertex 133.5431471872274 -65.13296615995654 -26.800000000000058
+ vertex 136.8310240425413 -68.03819639752314 -25.494862851895416
+ vertex 133.10711480626819 -65.88819639752313 -25.494862851895416
+ endloop
+endfacet
+facet normal -0.4484363707663462 -0.7767145781291058 -0.44228869021899403
+ outer loop
+ vertex 137.2670564235005 -67.28296615995654 -26.800000000000058
+ vertex 133.8902719595885 -64.53172841766136 -28.207798811618986
+ vertex 137.6141811958616 -66.68172841766136 -28.207798811618986
+ endloop
+endfacet
+facet normal -0.4484363707663462 -0.7767145781291058 -0.44228869021899403
+ outer loop
+ vertex 133.8902719595885 -64.53172841766136 -28.207798811618986
+ vertex 137.2670564235005 -67.28296615995654 -26.800000000000058
+ vertex 133.5431471872274 -65.13296615995654 -26.800000000000058
+ endloop
+endfacet
+facet normal -0.4734650647475524 -0.8200655477516484 -0.32143946530316614
+ outer loop
+ vertex 137.6141811958616 -66.68172841766136 -28.207798811618986
+ vertex 134.14254972225518 -64.09477051510284 -29.69417145876981
+ vertex 137.86645895852828 -66.24477051510286 -29.69417145876981
+ endloop
+endfacet
+facet normal -0.4734650647475524 -0.8200655477516484 -0.32143946530316614
+ outer loop
+ vertex 134.14254972225518 -64.09477051510284 -29.69417145876981
+ vertex 137.6141811958616 -66.68172841766136 -28.207798811618986
+ vertex 133.8902719595885 -64.53172841766136 -28.207798811618986
+ endloop
+endfacet
+facet normal -0.4903926402016156 -0.8493849684870416 -0.19509032201612717
+ outer loop
+ vertex 137.86645895852828 -66.24477051510286 -29.69417145876981
+ vertex 134.29566393276363 -63.829568923141416 -31.233685693359437
+ vertex 138.01957316903673 -65.97956892314143 -31.233685693359437
+ endloop
+endfacet
+facet normal -0.4903926402016156 -0.8493849684870416 -0.19509032201612717
+ outer loop
+ vertex 134.29566393276363 -63.829568923141416 -31.233685693359437
+ vertex 137.86645895852828 -66.24477051510286 -29.69417145876981
+ vertex 134.14254972225518 -64.09477051510284 -29.69417145876981
+ endloop
+endfacet
+facet normal -0.4989294616193019 -0.8641711769176165 -0.06540312923014474
+ outer loop
+ vertex 138.01957316903673 -65.97956892314143 -31.233685693359437
+ vertex 134.3469947645208 -63.74066131454328 -32.800000000000054
+ vertex 138.07090400079386 -65.89066131454328 -32.800000000000054
+ endloop
+endfacet
+facet normal -0.4989294616193019 -0.8641711769176165 -0.06540312923014474
+ outer loop
+ vertex 134.3469947645208 -63.74066131454328 -32.800000000000054
+ vertex 138.01957316903673 -65.97956892314143 -31.233685693359437
+ vertex 134.29566393276363 -63.829568923141416 -31.233685693359437
+ endloop
+endfacet
+facet normal -0.49892946161930196 -0.8641711769176166 0.06540312923014403
+ outer loop
+ vertex 138.07090400079386 -65.89066131454328 -32.800000000000054
+ vertex 134.29566393276363 -63.829568923141416 -34.36631430664068
+ vertex 138.01957316903673 -65.97956892314143 -34.36631430664068
+ endloop
+endfacet
+facet normal -0.49892946161930196 -0.8641711769176166 0.06540312923014403
+ outer loop
+ vertex 134.29566393276363 -63.829568923141416 -34.36631430664068
+ vertex 138.07090400079386 -65.89066131454328 -32.800000000000054
+ vertex 134.3469947645208 -63.74066131454328 -32.800000000000054
+ endloop
+endfacet
+facet normal -0.49039264020161555 -0.8493849684870416 0.19509032201612783
+ outer loop
+ vertex 138.01957316903673 -65.97956892314143 -34.36631430664068
+ vertex 134.14254972225518 -64.09477051510284 -35.905828541230306
+ vertex 137.86645895852828 -66.24477051510286 -35.905828541230306
+ endloop
+endfacet
+facet normal -0.49039264020161555 -0.8493849684870416 0.19509032201612783
+ outer loop
+ vertex 134.14254972225518 -64.09477051510284 -35.905828541230306
+ vertex 138.01957316903673 -65.97956892314143 -34.36631430664068
+ vertex 134.29566393276363 -63.829568923141416 -34.36631430664068
+ endloop
+endfacet
+facet normal -0.47346506474755257 -0.8200655477516486 0.321439465303165
+ outer loop
+ vertex 137.86645895852828 -66.24477051510286 -35.905828541230306
+ vertex 133.8902719595885 -64.53172841766136 -37.392201188381144
+ vertex 137.6141811958616 -66.68172841766136 -37.392201188381144
+ endloop
+endfacet
+facet normal -0.47346506474755257 -0.8200655477516486 0.321439465303165
+ outer loop
+ vertex 133.8902719595885 -64.53172841766136 -37.392201188381144
+ vertex 137.86645895852828 -66.24477051510286 -35.905828541230306
+ vertex 134.14254972225518 -64.09477051510284 -35.905828541230306
+ endloop
+endfacet
+facet normal -0.44843637076634585 -0.7767145781291053 0.4422886902189955
+ outer loop
+ vertex 137.6141811958616 -66.68172841766136 -37.392201188381144
+ vertex 133.5431471872274 -65.13296615995654 -38.80000000000006
+ vertex 137.2670564235005 -67.28296615995654 -38.80000000000006
+ endloop
+endfacet
+facet normal -0.44843637076634585 -0.7767145781291053 0.4422886902189955
+ outer loop
+ vertex 133.5431471872274 -65.13296615995654 -38.80000000000006
+ vertex 137.6141811958616 -66.68172841766136 -37.392201188381144
+ vertex 133.8902719595885 -64.53172841766136 -37.392201188381144
+ endloop
+endfacet
+facet normal -0.4157348061512695 -0.7200738067287966 0.5555702330196122
+ outer loop
+ vertex 137.2670564235005 -67.28296615995654 -38.80000000000006
+ vertex 133.10711480626819 -65.88819639752316 -40.10513714810471
+ vertex 136.8310240425413 -68.03819639752317 -40.10513714810471
+ endloop
+endfacet
+facet normal -0.4157348061512695 -0.7200738067287966 0.5555702330196122
+ outer loop
+ vertex 133.10711480626819 -65.88819639752316 -40.10513714810471
+ vertex 137.2670564235005 -67.28296615995654 -38.80000000000006
+ vertex 133.5431471872274 -65.13296615995654 -38.80000000000006
+ endloop
+endfacet
+facet normal -0.3759199037394911 -0.6511123728531998 0.6593458151000637
+ outer loop
+ vertex 136.8310240425413 -68.03819639752317 -40.10513714810471
+ vertex 132.58963545164005 -66.78449693160701 -41.285281374238636
+ vertex 136.31354468791315 -68.93449693160701 -41.285281374238636
+ endloop
+endfacet
+facet normal -0.3759199037394911 -0.6511123728531998 0.6593458151000637
+ outer loop
+ vertex 132.58963545164005 -66.78449693160701 -41.285281374238636
+ vertex 136.8310240425413 -68.03819639752317 -40.10513714810471
+ vertex 133.10711480626819 -65.88819639752316 -40.10513714810471
+ endloop
+endfacet
+facet normal -0.3296729075500358 -0.571010225755619 0.7518398074789752
+ outer loop
+ vertex 135.7234725748462 -69.95653181156851 -42.32024008349488
+ vertex 132.58963545164005 -66.78449693160701 -41.285281374238636
+ vertex 131.9995633385731 -67.8065318115685 -42.32024008349488
+ endloop
+endfacet
+facet normal -0.3296729075500358 -0.571010225755619 0.7518398074789752
+ outer loop
+ vertex 132.58963545164005 -66.78449693160701 -41.285281374238636
+ vertex 135.7234725748462 -69.95653181156851 -42.32024008349488
+ vertex 136.31354468791315 -68.93449693160701 -41.285281374238636
+ endloop
+endfacet
+facet normal -0.2777851165097979 -0.48113793538140986 0.8314696123025498
+ outer loop
+ vertex 135.07090400079386 -71.08681373724993 -43.192304845413325
+ vertex 131.9995633385731 -67.8065318115685 -42.32024008349488
+ vertex 131.34699476452076 -68.93681373724992 -43.192304845413325
+ endloop
+endfacet
+facet normal -0.2777851165097979 -0.48113793538140986 0.8314696123025498
+ outer loop
+ vertex 131.9995633385731 -67.8065318115685 -42.32024008349488
+ vertex 135.07090400079386 -71.08681373724993 -43.192304845413325
+ vertex 135.7234725748462 -69.95653181156851 -42.32024008349488
+ endloop
+endfacet
+facet normal -0.2211443451095007 -0.38303324153620094 0.8968727415326883
+ outer loop
+ vertex 134.36700459498442 -72.30600327152946 -43.8865543901355
+ vertex 131.34699476452076 -68.93681373724992 -43.192304845413325
+ vertex 130.6430953587113 -70.15600327152946 -43.8865543901355
+ endloop
+endfacet
+facet normal -0.2211443451095007 -0.38303324153620094 0.8968727415326883
+ outer loop
+ vertex 131.34699476452076 -68.93681373724992 -43.192304845413325
+ vertex 134.36700459498442 -72.30600327152946 -43.8865543901355
+ vertex 135.07090400079386 -71.08681373724993 -43.192304845413325
+ endloop
+endfacet
+facet normal -0.16071973265158207 -0.2783747427314266 0.9469301294951049
+ outer loop
+ vertex 133.623818271409 -73.5932397434524 -44.391109915468874
+ vertex 130.6430953587113 -70.15600327152946 -43.8865543901355
+ vertex 129.89990903513592 -71.4432397434524 -44.391109915468874
+ endloop
+endfacet
+facet normal -0.16071973265158207 -0.2783747427314266 0.9469301294951049
+ outer loop
+ vertex 130.6430953587113 -70.15600327152946 -43.8865543901355
+ vertex 133.623818271409 -73.5932397434524 -44.391109915468874
+ vertex 134.36700459498442 -72.30600327152946 -43.8865543901355
+ endloop
+endfacet
+facet normal -0.09754516100806396 -0.16895317489845324 0.9807852804032307
+ outer loop
+ vertex 132.8540611541142 -74.92649818009477 -44.69733833648578
+ vertex 129.89990903513592 -71.4432397434524 -44.391109915468874
+ vertex 129.1301519178411 -72.77649818009475 -44.69733833648578
+ endloop
+endfacet
+facet normal -0.09754516100806396 -0.16895317489845324 0.9807852804032307
+ outer loop
+ vertex 129.89990903513592 -71.4432397434524 -44.391109915468874
+ vertex 132.8540611541142 -74.92649818009477 -44.69733833648578
+ vertex 133.623818271409 -73.5932397434524 -44.391109915468874
+ endloop
+endfacet
+facet normal -0.032701564615072155 -0.056640771400301514 0.9978589232386036
+ outer loop
+ vertex 132.07090400079386 -76.28296615995656 -44.800000000000054
+ vertex 129.1301519178411 -72.77649818009475 -44.69733833648578
+ vertex 128.34699476452076 -74.13296615995655 -44.800000000000054
+ endloop
+endfacet
+facet normal -0.032701564615072155 -0.056640771400301514 0.9978589232386036
+ outer loop
+ vertex 129.1301519178411 -72.77649818009475 -44.69733833648578
+ vertex 132.07090400079386 -76.28296615995656 -44.800000000000054
+ vertex 132.8540611541142 -74.92649818009477 -44.69733833648578
+ endloop
+endfacet
+facet normal 0.032701564615072155 0.056640771400301514 0.9978589232386036
+ outer loop
+ vertex 131.28774684747356 -77.63943413981835 -44.69733833648578
+ vertex 128.34699476452076 -74.13296615995655 -44.800000000000054
+ vertex 127.56383761120046 -75.48943413981834 -44.69733833648578
+ endloop
+endfacet
+facet normal 0.032701564615072155 0.056640771400301514 0.9978589232386036
+ outer loop
+ vertex 128.34699476452076 -74.13296615995655 -44.800000000000054
+ vertex 131.28774684747356 -77.63943413981835 -44.69733833648578
+ vertex 132.07090400079386 -76.28296615995656 -44.800000000000054
+ endloop
+endfacet
+facet normal 0.09754516100806396 0.16895317489845324 0.9807852804032307
+ outer loop
+ vertex 130.51798973017873 -78.97269257646072 -44.391109915468874
+ vertex 127.56383761120046 -75.48943413981834 -44.69733833648578
+ vertex 126.79408049390564 -76.82269257646071 -44.391109915468874
+ endloop
+endfacet
+facet normal 0.09754516100806396 0.16895317489845324 0.9807852804032307
+ outer loop
+ vertex 127.56383761120046 -75.48943413981834 -44.69733833648578
+ vertex 130.51798973017873 -78.97269257646072 -44.391109915468874
+ vertex 131.28774684747356 -77.63943413981835 -44.69733833648578
+ endloop
+endfacet
+facet normal 0.16071973265158207 0.2783747427314266 0.9469301294951049
+ outer loop
+ vertex 129.77480340660333 -80.25992904838364 -43.8865543901355
+ vertex 126.79408049390564 -76.82269257646071 -44.391109915468874
+ vertex 126.05089417033024 -78.10992904838363 -43.8865543901355
+ endloop
+endfacet
+facet normal 0.16071973265158207 0.2783747427314266 0.9469301294951049
+ outer loop
+ vertex 126.79408049390564 -76.82269257646071 -44.391109915468874
+ vertex 129.77480340660333 -80.25992904838364 -43.8865543901355
+ vertex 130.51798973017873 -78.97269257646072 -44.391109915468874
+ endloop
+endfacet
+facet normal 0.2211443451094986 0.3830332415361973 0.8968727415326905
+ outer loop
+ vertex 129.07090400079386 -81.47911858266319 -43.19230484541332
+ vertex 126.05089417033024 -78.10992904838363 -43.8865543901355
+ vertex 125.34699476452076 -79.32911858266318 -43.19230484541332
+ endloop
+endfacet
+facet normal 0.2211443451094986 0.3830332415361973 0.8968727415326905
+ outer loop
+ vertex 126.05089417033024 -78.10992904838363 -43.8865543901355
+ vertex 129.07090400079386 -81.47911858266319 -43.19230484541332
+ vertex 129.77480340660333 -80.25992904838364 -43.8865543901355
+ endloop
+endfacet
+facet normal 0.2777851165098018 0.4811379353814166 0.8314696123025443
+ outer loop
+ vertex 128.41833542674155 -82.60940050834459 -42.32024008349487
+ vertex 125.34699476452076 -79.32911858266318 -43.19230484541332
+ vertex 124.69442619046845 -80.45940050834457 -42.32024008349487
+ endloop
+endfacet
+facet normal 0.2777851165098018 0.4811379353814166 0.8314696123025443
+ outer loop
+ vertex 125.34699476452076 -79.32911858266318 -43.19230484541332
+ vertex 128.41833542674155 -82.60940050834459 -42.32024008349487
+ vertex 129.07090400079386 -81.47911858266319 -43.19230484541332
+ endloop
+endfacet
+facet normal 0.3296729075500358 0.571010225755619 0.7518398074789752
+ outer loop
+ vertex 127.82826331367458 -83.63143538830607 -41.28528137423862
+ vertex 124.69442619046845 -80.45940050834457 -42.32024008349487
+ vertex 124.1043540774015 -81.48143538830607 -41.28528137423862
+ endloop
+endfacet
+facet normal 0.3296729075500358 0.571010225755619 0.7518398074789752
+ outer loop
+ vertex 124.69442619046845 -80.45940050834457 -42.32024008349487
+ vertex 127.82826331367458 -83.63143538830607 -41.28528137423862
+ vertex 128.41833542674155 -82.60940050834459 -42.32024008349487
+ endloop
+endfacet
+facet normal 0.3759199037394875 0.6511123728531937 0.6593458151000718
+ outer loop
+ vertex 123.58687472277336 -82.37773592238995 -40.105137148104696
+ vertex 127.82826331367458 -83.63143538830607 -41.28528137423862
+ vertex 124.1043540774015 -81.48143538830607 -41.28528137423862
+ endloop
+endfacet
+facet normal 0.3759199037394875 0.6511123728531937 0.6593458151000718
+ outer loop
+ vertex 127.82826331367458 -83.63143538830607 -41.28528137423862
+ vertex 123.58687472277336 -82.37773592238995 -40.105137148104696
+ vertex 127.31078395904645 -84.52773592238995 -40.105137148104696
+ endloop
+endfacet
+facet normal 0.4157348061512732 0.7200738067288028 0.5555702330196015
+ outer loop
+ vertex 123.15084234181414 -83.13296615995655 -38.800000000000054
+ vertex 127.31078395904645 -84.52773592238995 -40.105137148104696
+ vertex 123.58687472277336 -82.37773592238995 -40.105137148104696
+ endloop
+endfacet
+facet normal 0.4157348061512732 0.7200738067288028 0.5555702330196015
+ outer loop
+ vertex 127.31078395904645 -84.52773592238995 -40.105137148104696
+ vertex 123.15084234181414 -83.13296615995655 -38.800000000000054
+ vertex 126.87475157808723 -85.28296615995656 -38.800000000000054
+ endloop
+endfacet
+facet normal 0.44843637076634596 0.7767145781291055 0.4422886902189947
+ outer loop
+ vertex 122.80371756945306 -83.73420390225172 -37.39220118838113
+ vertex 126.87475157808723 -85.28296615995656 -38.800000000000054
+ vertex 123.15084234181414 -83.13296615995655 -38.800000000000054
+ endloop
+endfacet
+facet normal 0.44843637076634596 0.7767145781291055 0.4422886902189947
+ outer loop
+ vertex 126.87475157808723 -85.28296615995656 -38.800000000000054
+ vertex 122.80371756945306 -83.73420390225172 -37.39220118838113
+ vertex 126.52762680572613 -85.88420390225173 -37.39220118838113
+ endloop
+endfacet
+facet normal 0.47346506474755257 0.8200655477516486 0.321439465303165
+ outer loop
+ vertex 122.55143980678636 -84.17116180481023 -35.9058285412303
+ vertex 126.52762680572613 -85.88420390225173 -37.39220118838113
+ vertex 122.80371756945306 -83.73420390225172 -37.39220118838113
+ endloop
+endfacet
+facet normal 0.47346506474755257 0.8200655477516486 0.321439465303165
+ outer loop
+ vertex 126.52762680572613 -85.88420390225173 -37.39220118838113
+ vertex 122.55143980678636 -84.17116180481023 -35.9058285412303
+ vertex 126.27534904305944 -86.32116180481025 -35.9058285412303
+ endloop
+endfacet
+facet normal 0.4903926402016156 0.8493849684870416 0.19509032201612717
+ outer loop
+ vertex 122.39832559627791 -84.43636339677167 -34.36631430664067
+ vertex 126.27534904305944 -86.32116180481025 -35.9058285412303
+ vertex 122.55143980678636 -84.17116180481023 -35.9058285412303
+ endloop
+endfacet
+facet normal 0.4903926402016156 0.8493849684870416 0.19509032201612717
+ outer loop
+ vertex 126.27534904305944 -86.32116180481025 -35.9058285412303
+ vertex 122.39832559627791 -84.43636339677167 -34.36631430664067
+ vertex 126.12223483255102 -86.58636339677167 -34.36631430664067
+ endloop
+endfacet
+facet normal 0.4989294616193019 0.8641711769176165 0.06540312923014474
+ outer loop
+ vertex 122.34699476452076 -84.5252710053698 -32.800000000000054
+ vertex 126.12223483255102 -86.58636339677167 -34.36631430664067
+ vertex 122.39832559627791 -84.43636339677167 -34.36631430664067
+ endloop
+endfacet
+facet normal 0.4989294616193019 0.8641711769176165 0.06540312923014474
+ outer loop
+ vertex 126.12223483255102 -86.58636339677167 -34.36631430664067
+ vertex 122.34699476452076 -84.5252710053698 -32.800000000000054
+ vertex 126.07090400079386 -86.67527100536981 -32.800000000000054
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 159.75254293449578 -96.19094968042891 -62.60000000000005
+ vertex 158.34010736919757 -95.83735984194263 -62.60000000000005
+ vertex 158.54010736919759 -95.49094968042887 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 158.34010736919757 -95.83735984194263 -62.60000000000005
+ vertex 159.75254293449578 -96.19094968042891 -62.60000000000005
+ vertex 156.7675822461111 -99.07009060718198 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 158.34010736919757 -95.83735984194263 -62.60000000000005
+ vertex 156.7675822461111 -99.07009060718198 -62.60000000000005
+ vertex 156.51331244995444 -99.40146145708046 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 158.34010736919757 -95.83735984194263 -62.60000000000005
+ vertex 156.51331244995444 -99.40146145708046 -62.60000000000005
+ vertex 155.39369720768377 -101.14069194162175 -62.600000000000044
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 156.7675822461111 -99.07009060718198 -62.60000000000005
+ vertex 159.75254293449578 -96.19094968042891 -62.60000000000005
+ vertex 157.09895309600955 -98.81582081102533 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 157.09895309600955 -98.81582081102533 -62.60000000000005
+ vertex 159.75254293449578 -96.19094968042891 -62.60000000000005
+ vertex 157.4848426238455 -98.65598013501793 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 157.4848426238455 -98.65598013501793 -62.60000000000005
+ vertex 159.75254293449578 -96.19094968042891 -62.60000000000005
+ vertex 157.89895309600956 -98.60146145708043 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 157.89895309600956 -98.60146145708043 -62.60000000000005
+ vertex 159.75254293449578 -96.19094968042891 -62.60000000000005
+ vertex 158.3130635681736 -98.65598013501793 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 158.3130635681736 -98.65598013501793 -62.60000000000005
+ vertex 159.75254293449578 -96.19094968042891 -62.60000000000005
+ vertex 158.65254293449578 -98.09620556875467 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 158.3130635681736 -98.65598013501793 -62.60000000000005
+ vertex 158.65254293449578 -98.09620556875467 -62.60000000000005
+ vertex 158.69895309600955 -98.81582081102533 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 158.69895309600955 -98.81582081102533 -62.60000000000005
+ vertex 158.65254293449578 -98.09620556875467 -62.60000000000005
+ vertex 160.41431103577867 -99.11336285628003 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 158.69895309600955 -98.81582081102533 -62.60000000000005
+ vertex 160.41431103577867 -99.11336285628003 -62.60000000000005
+ vertex 159.03032394590804 -99.07009060718195 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 159.03032394590804 -99.07009060718195 -62.60000000000005
+ vertex 160.41431103577867 -99.11336285628003 -62.60000000000005
+ vertex 159.28459374206466 -99.40146145708044 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 159.28459374206466 -99.40146145708044 -62.60000000000005
+ vertex 160.41431103577867 -99.11336285628003 -62.60000000000005
+ vertex 159.4444344180721 -99.78735098491639 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 159.4444344180721 -99.78735098491639 -62.60000000000005
+ vertex 160.41431103577867 -99.11336285628003 -62.60000000000005
+ vertex 159.4989530960096 -100.20146145708043 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 159.4989530960096 -100.20146145708043 -62.60000000000005
+ vertex 160.41431103577867 -99.11336285628003 -62.60000000000005
+ vertex 159.4444344180721 -100.61557192924447 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 159.4444344180721 -100.61557192924447 -62.60000000000005
+ vertex 160.41431103577867 -99.11336285628003 -62.60000000000005
+ vertex 159.2845937420647 -101.00146145708044 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 164.89895309600956 -88.0771058040983 -62.60000000000005
+ vertex 164.25254293449578 -88.39672104636894 -62.60000000000005
+ vertex 164.56758224611107 -87.82283600794166 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 164.25254293449578 -88.39672104636894 -62.60000000000005
+ vertex 164.89895309600956 -88.0771058040983 -62.60000000000005
+ vertex 166.01431103577866 -89.41387833389432 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 166.01431103577866 -89.41387833389432 -62.60000000000005
+ vertex 164.89895309600956 -88.0771058040983 -62.60000000000005
+ vertex 165.28484262384555 -88.2369464801057 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 166.01431103577866 -89.41387833389432 -62.60000000000005
+ vertex 165.28484262384555 -88.2369464801057 -62.60000000000005
+ vertex 165.69895309600957 -88.2914651580432 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 166.01431103577866 -89.41387833389432 -62.60000000000005
+ vertex 165.69895309600957 -88.2914651580432 -62.60000000000005
+ vertex 166.1130635681736 -88.23694648010569 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 166.01431103577866 -89.41387833389432 -62.60000000000005
+ vertex 166.1130635681736 -88.23694648010569 -62.60000000000005
+ vertex 166.49895309600956 -88.07710580409828 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 166.01431103577866 -89.41387833389432 -62.60000000000005
+ vertex 166.49895309600956 -88.07710580409828 -62.60000000000005
+ vertex 166.83032394590805 -87.82283600794165 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 166.01431103577866 -89.41387833389432 -62.60000000000005
+ vertex 166.83032394590805 -87.82283600794165 -62.60000000000005
+ vertex 167.08459374206464 -87.49146515804317 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 164.5526158302817 -84.3451278923153 -62.60000000000005
+ vertex 161.79369720768378 -89.05556677318093 -62.60000000000005
+ vertex 164.39369720768377 -84.55223467350186 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 161.79369720768378 -89.05556677318093 -62.60000000000005
+ vertex 164.5526158302817 -84.3451278923153 -62.60000000000005
+ vertex 162.14010736919758 -89.25556677318093 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 162.14010736919758 -89.25556677318093 -62.60000000000005
+ vertex 164.5526158302817 -84.3451278923153 -62.60000000000005
+ vertex 164.75972261146825 -84.18620926971741 -62.600000000000065
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 162.14010736919758 -89.25556677318093 -62.60000000000005
+ vertex 164.75972261146825 -84.18620926971741 -62.600000000000065
+ vertex 165.0009035663657 -84.08630884721279 -62.600000000000065
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 162.14010736919758 -89.25556677318093 -62.60000000000005
+ vertex 165.0009035663657 -84.08630884721279 -62.600000000000065
+ vertex 165.25972261146822 -84.05223467350184 -62.600000000000065
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 162.14010736919758 -89.25556677318093 -62.60000000000005
+ vertex 165.25972261146822 -84.05223467350184 -62.600000000000065
+ vertex 161.94010736919756 -89.6019769346947 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 161.94010736919756 -89.6019769346947 -62.60000000000005
+ vertex 165.25972261146822 -84.05223467350184 -62.600000000000065
+ vertex 164.31331244995442 -85.89146515804319 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 161.94010736919756 -89.6019769346947 -62.60000000000005
+ vertex 164.31331244995442 -85.89146515804319 -62.60000000000005
+ vertex 164.15347177394705 -86.27735468587916 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 161.94010736919756 -89.6019769346947 -62.60000000000005
+ vertex 164.15347177394705 -86.27735468587916 -62.60000000000005
+ vertex 163.15254293449576 -90.30197693469471 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 163.15254293449576 -90.30197693469471 -62.60000000000005
+ vertex 164.15347177394705 -86.27735468587916 -62.60000000000005
+ vertex 164.09895309600955 -86.69146515804319 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 163.15254293449576 -90.30197693469471 -62.60000000000005
+ vertex 164.09895309600955 -86.69146515804319 -62.60000000000005
+ vertex 164.15347177394705 -87.10557563020723 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 163.15254293449576 -90.30197693469471 -62.60000000000005
+ vertex 164.15347177394705 -87.10557563020723 -62.60000000000005
+ vertex 164.31331244995442 -87.49146515804318 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 163.15254293449576 -90.30197693469471 -62.60000000000005
+ vertex 164.31331244995442 -87.49146515804318 -62.60000000000005
+ vertex 164.56758224611107 -87.82283600794166 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 163.15254293449576 -90.30197693469471 -62.60000000000005
+ vertex 164.56758224611107 -87.82283600794166 -62.60000000000005
+ vertex 164.25254293449578 -88.39672104636894 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 181.34817987958814 -93.18620926971742 -62.60000000000005
+ vertex 176.64484777990907 -90.9326194312312 -62.60000000000005
+ vertex 176.8448477799091 -90.58620926971743 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 176.64484777990907 -90.9326194312312 -62.60000000000005
+ vertex 181.34817987958814 -93.18620926971742 -62.60000000000005
+ vertex 179.62305986721083 -92.94598383598067 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 176.64484777990907 -90.9326194312312 -62.60000000000005
+ vertex 179.62305986721083 -92.94598383598067 -62.60000000000005
+ vertex 179.2089493950468 -92.89146515804318 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 176.64484777990907 -90.9326194312312 -62.60000000000005
+ vertex 179.2089493950468 -92.89146515804318 -62.60000000000005
+ vertex 177.50369350672102 -93.0450549965294 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 177.50369350672102 -93.0450549965294 -62.60000000000005
+ vertex 179.2089493950468 -92.89146515804318 -62.60000000000005
+ vertex 178.79483892288275 -92.94598383598067 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 177.50369350672102 -93.0450549965294 -62.60000000000005
+ vertex 178.79483892288275 -92.94598383598067 -62.60000000000005
+ vertex 178.4089493950468 -93.10582451198808 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 177.50369350672102 -93.0450549965294 -62.60000000000005
+ vertex 178.4089493950468 -93.10582451198808 -62.60000000000005
+ vertex 178.07757854514833 -93.36009430814471 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 177.50369350672102 -93.0450549965294 -62.60000000000005
+ vertex 178.07757854514833 -93.36009430814471 -62.60000000000005
+ vertex 176.48653621919567 -94.8068230978123 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 176.48653621919567 -94.8068230978123 -62.60000000000005
+ vertex 178.07757854514833 -93.36009430814471 -62.60000000000005
+ vertex 177.82330874899168 -93.6914651580432 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 176.48653621919567 -94.8068230978123 -62.60000000000005
+ vertex 177.82330874899168 -93.6914651580432 -62.60000000000005
+ vertex 176.6935914552777 -95.57956375884356 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 179.62305986721083 -92.94598383598067 -62.60000000000005
+ vertex 181.34817987958814 -93.18620926971742 -62.60000000000005
+ vertex 180.00894939504678 -93.10582451198808 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 180.00894939504678 -93.10582451198808 -62.60000000000005
+ vertex 181.34817987958814 -93.18620926971742 -62.60000000000005
+ vertex 180.34032024494527 -93.36009430814468 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 180.34032024494527 -93.36009430814468 -62.60000000000005
+ vertex 181.34817987958814 -93.18620926971742 -62.60000000000005
+ vertex 180.5945900411019 -93.69146515804317 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 180.5945900411019 -93.69146515804317 -62.60000000000005
+ vertex 181.34817987958814 -93.18620926971742 -62.60000000000005
+ vertex 180.7544307171093 -94.07735468587913 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 180.7544307171093 -94.07735468587913 -62.60000000000005
+ vertex 181.34817987958814 -93.18620926971742 -62.60000000000005
+ vertex 180.8089493950468 -94.49146515804317 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 180.8089493950468 -94.49146515804317 -62.60000000000005
+ vertex 181.34817987958814 -93.18620926971742 -62.60000000000005
+ vertex 181.5552866607747 -93.34512789231532 -62.600000000000044
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 180.8089493950468 -94.49146515804317 -62.60000000000005
+ vertex 181.5552866607747 -93.34512789231532 -62.600000000000044
+ vertex 180.7544307171093 -94.9055756302072 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 180.7544307171093 -94.9055756302072 -62.60000000000005
+ vertex 181.5552866607747 -93.34512789231532 -62.600000000000044
+ vertex 181.71420528337256 -93.55223467350186 -62.60000000000003
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 180.7544307171093 -94.9055756302072 -62.60000000000005
+ vertex 181.71420528337256 -93.55223467350186 -62.60000000000003
+ vertex 180.59459004110192 -95.29146515804317 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 181.8141057058772 -93.79341562839934 -62.60000000000003
+ vertex 178.7677951218588 -98.85556677318094 -62.60000000000005
+ vertex 181.71420528337256 -93.55223467350186 -62.60000000000003
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 178.7677951218588 -98.85556677318094 -62.60000000000005
+ vertex 181.8141057058772 -93.79341562839934 -62.60000000000003
+ vertex 179.11420528337257 -99.05556677318094 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 179.11420528337257 -99.05556677318094 -62.60000000000005
+ vertex 181.8141057058772 -93.79341562839934 -62.60000000000003
+ vertex 181.84817987958814 -94.05223467350186 -62.60000000000002
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 179.11420528337257 -99.05556677318094 -62.60000000000005
+ vertex 181.84817987958814 -94.05223467350186 -62.60000000000002
+ vertex 181.81410570587718 -94.31105371860438 -62.60000000000002
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 179.11420528337257 -99.05556677318094 -62.60000000000005
+ vertex 181.81410570587718 -94.31105371860438 -62.60000000000002
+ vertex 181.71420528337256 -94.55223467350186 -62.60000000000002
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 176.6935914552777 -95.57956375884356 -62.60000000000005
+ vertex 177.8233087489917 -95.2914651580432 -62.60000000000005
+ vertex 178.45535955656058 -96.59672104636894 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 177.8233087489917 -95.2914651580432 -62.60000000000005
+ vertex 176.6935914552777 -95.57956375884356 -62.60000000000005
+ vertex 177.6634680729843 -94.90557563020724 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 177.6634680729843 -94.90557563020724 -62.60000000000005
+ vertex 176.6935914552777 -95.57956375884356 -62.60000000000005
+ vertex 177.60894939504678 -94.4914651580432 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 177.60894939504678 -94.4914651580432 -62.60000000000005
+ vertex 176.6935914552777 -95.57956375884356 -62.60000000000005
+ vertex 177.6634680729843 -94.07735468587917 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 177.6634680729843 -94.07735468587917 -62.60000000000005
+ vertex 176.6935914552777 -95.57956375884356 -62.60000000000005
+ vertex 177.82330874899168 -93.6914651580432 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 178.45535955656058 -96.59672104636894 -62.60000000000005
+ vertex 177.8233087489917 -95.2914651580432 -62.60000000000005
+ vertex 178.07757854514833 -95.62283600794169 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 178.45535955656058 -96.59672104636894 -62.60000000000005
+ vertex 178.07757854514833 -95.62283600794169 -62.60000000000005
+ vertex 178.40894939504682 -95.87710580409828 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 178.45535955656058 -96.59672104636894 -62.60000000000005
+ vertex 178.40894939504682 -95.87710580409828 -62.60000000000005
+ vertex 178.79483892288278 -96.03694648010568 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 178.45535955656058 -96.59672104636894 -62.60000000000005
+ vertex 178.79483892288278 -96.03694648010568 -62.60000000000005
+ vertex 177.3553595565606 -98.5019769346947 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 177.3553595565606 -98.5019769346947 -62.60000000000005
+ vertex 178.79483892288278 -96.03694648010568 -62.60000000000005
+ vertex 178.56779512185878 -99.20197693469471 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 178.56779512185878 -99.20197693469471 -62.60000000000005
+ vertex 178.79483892288278 -96.03694648010568 -62.60000000000005
+ vertex 179.2089493950468 -96.09146515804319 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 178.56779512185878 -99.20197693469471 -62.60000000000005
+ vertex 179.2089493950468 -96.09146515804319 -62.60000000000005
+ vertex 179.62305986721086 -96.0369464801057 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 178.56779512185878 -99.20197693469471 -62.60000000000005
+ vertex 179.62305986721086 -96.0369464801057 -62.60000000000005
+ vertex 180.00894939504684 -95.87710580409829 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 178.56779512185878 -99.20197693469471 -62.60000000000005
+ vertex 180.00894939504684 -95.87710580409829 -62.60000000000005
+ vertex 180.3403202449453 -95.62283600794163 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 178.56779512185878 -99.20197693469471 -62.60000000000005
+ vertex 180.3403202449453 -95.62283600794163 -62.60000000000005
+ vertex 180.59459004110192 -95.29146515804317 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 178.56779512185878 -99.20197693469471 -62.60000000000005
+ vertex 180.59459004110192 -95.29146515804317 -62.60000000000005
+ vertex 181.71420528337256 -93.55223467350186 -62.60000000000003
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 178.56779512185878 -99.20197693469471 -62.60000000000005
+ vertex 181.71420528337256 -93.55223467350186 -62.60000000000003
+ vertex 178.7677951218588 -98.85556677318094 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 163.78249996400035 -98.21085935300758 -62.60000000000005
+ vertex 160.6213662718607 -99.8861035173113 -62.60000000000005
+ vertex 160.41431103577867 -99.11336285628003 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 160.6213662718607 -99.8861035173113 -62.60000000000005
+ vertex 163.78249996400035 -98.21085935300758 -62.60000000000005
+ vertex 163.9895552000824 -98.98360001403886 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 163.9895552000824 -98.98360001403886 -62.60000000000005
+ vertex 163.78249996400035 -98.21085935300758 -62.60000000000005
+ vertex 166.91681453905113 -92.78206726211604 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 163.9895552000824 -98.98360001403886 -62.60000000000005
+ vertex 166.91681453905113 -92.78206726211604 -62.60000000000005
+ vertex 167.6895552000824 -92.575012026034 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 163.9895552000824 -98.98360001403886 -62.60000000000005
+ vertex 167.6895552000824 -92.575012026034 -62.60000000000005
+ vertex 166.2156826553102 -95.99646330756181 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 166.2156826553102 -95.99646330756181 -62.60000000000005
+ vertex 167.6895552000824 -92.575012026034 -62.60000000000005
+ vertex 166.6447629363245 -95.43727499835813 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 166.6447629363245 -95.43727499835813 -62.60000000000005
+ vertex 167.6895552000824 -92.575012026034 -62.60000000000005
+ vertex 167.20395124552817 -95.00819471734383 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 167.20395124552817 -95.00819471734383 -62.60000000000005
+ vertex 167.6895552000824 -92.575012026034 -62.60000000000005
+ vertex 167.8551398237514 -94.73846357658132 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 167.8551398237514 -94.73846357658132 -62.60000000000005
+ vertex 167.6895552000824 -92.575012026034 -62.60000000000005
+ vertex 168.55395124552817 -94.6464633075618 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 168.55395124552817 -94.6464633075618 -62.60000000000005
+ vertex 167.6895552000824 -92.575012026034 -62.60000000000005
+ vertex 169.252762667305 -94.73846357658132 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 169.252762667305 -94.73846357658132 -62.60000000000005
+ vertex 167.6895552000824 -92.575012026034 -62.60000000000005
+ vertex 173.1183472909739 -95.70932660108475 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 169.252762667305 -94.73846357658132 -62.60000000000005
+ vertex 173.1183472909739 -95.70932660108475 -62.60000000000005
+ vertex 169.9039512455282 -95.00819471734383 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 169.9039512455282 -95.00819471734383 -62.60000000000005
+ vertex 173.1183472909739 -95.70932660108475 -62.60000000000005
+ vertex 170.46313955473187 -95.43727499835813 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 170.46313955473187 -95.43727499835813 -62.60000000000005
+ vertex 173.1183472909739 -95.70932660108475 -62.60000000000005
+ vertex 170.89221983574618 -95.99646330756181 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 170.89221983574618 -95.99646330756181 -62.60000000000005
+ vertex 173.1183472909739 -95.70932660108475 -62.60000000000005
+ vertex 171.16195097650868 -96.64765188578501 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 171.16195097650868 -96.64765188578501 -62.60000000000005
+ vertex 173.1183472909739 -95.70932660108475 -62.60000000000005
+ vertex 171.25395124552816 -97.3464633075618 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 171.25395124552816 -97.3464633075618 -62.60000000000005
+ vertex 173.1183472909739 -95.70932660108475 -62.60000000000005
+ vertex 171.16195097650865 -98.04527472933862 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 171.16195097650865 -98.04527472933862 -62.60000000000005
+ vertex 173.1183472909739 -95.70932660108475 -62.60000000000005
+ vertex 170.89221983574615 -98.6964633075618 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 158.34010736919757 -95.83735984194263 -62.60000000000005
+ vertex 155.39369720768377 -100.14069194162175 -62.600000000000044
+ vertex 157.9936972076838 -95.63735984194264 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 155.39369720768377 -100.14069194162175 -62.600000000000044
+ vertex 158.34010736919757 -95.83735984194263 -62.60000000000005
+ vertex 155.29379678517915 -100.38187289651923 -62.600000000000044
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 155.29379678517915 -100.38187289651923 -62.600000000000044
+ vertex 158.34010736919757 -95.83735984194263 -62.60000000000005
+ vertex 155.25972261146825 -100.64069194162175 -62.600000000000044
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 155.25972261146825 -100.64069194162175 -62.600000000000044
+ vertex 158.34010736919757 -95.83735984194263 -62.60000000000005
+ vertex 155.29379678517915 -100.89951098672427 -62.600000000000044
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 155.29379678517915 -100.89951098672427 -62.600000000000044
+ vertex 158.34010736919757 -95.83735984194263 -62.60000000000005
+ vertex 155.39369720768377 -101.14069194162175 -62.600000000000044
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 165.51854165657076 -84.08630884721279 -62.60000000000008
+ vertex 164.31331244995442 -85.89146515804319 -62.60000000000005
+ vertex 165.25972261146822 -84.05223467350184 -62.600000000000065
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 164.31331244995442 -85.89146515804319 -62.60000000000005
+ vertex 165.51854165657076 -84.08630884721279 -62.60000000000008
+ vertex 164.56758224611104 -85.5600943081447 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 164.56758224611104 -85.5600943081447 -62.60000000000005
+ vertex 165.51854165657076 -84.08630884721279 -62.60000000000008
+ vertex 164.89895309600954 -85.30582451198808 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 164.89895309600954 -85.30582451198808 -62.60000000000005
+ vertex 165.51854165657076 -84.08630884721279 -62.60000000000008
+ vertex 165.75972261146822 -84.18620926971741 -62.60000000000008
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 164.89895309600954 -85.30582451198808 -62.60000000000005
+ vertex 165.75972261146822 -84.18620926971741 -62.60000000000008
+ vertex 165.2848426238455 -85.14598383598067 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 165.2848426238455 -85.14598383598067 -62.60000000000005
+ vertex 165.75972261146822 -84.18620926971741 -62.60000000000008
+ vertex 165.69895309600955 -85.09146515804318 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 165.69895309600955 -85.09146515804318 -62.60000000000005
+ vertex 165.75972261146822 -84.18620926971741 -62.60000000000008
+ vertex 166.11306356817357 -85.14598383598066 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 166.11306356817357 -85.14598383598066 -62.60000000000005
+ vertex 165.75972261146822 -84.18620926971741 -62.60000000000008
+ vertex 170.2630547111473 -86.7862092697174 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 166.11306356817357 -85.14598383598066 -62.60000000000005
+ vertex 170.2630547111473 -86.7862092697174 -62.60000000000005
+ vertex 166.49895309600953 -85.30582451198806 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 166.49895309600953 -85.30582451198806 -62.60000000000005
+ vertex 170.2630547111473 -86.7862092697174 -62.60000000000005
+ vertex 166.83032394590802 -85.56009430814467 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 166.83032394590802 -85.56009430814467 -62.60000000000005
+ vertex 170.2630547111473 -86.7862092697174 -62.60000000000005
+ vertex 167.08459374206464 -85.89146515804318 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 167.08459374206464 -85.89146515804318 -62.60000000000005
+ vertex 170.2630547111473 -86.7862092697174 -62.60000000000005
+ vertex 167.24443441807207 -86.27735468587913 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 167.24443441807207 -86.27735468587913 -62.60000000000005
+ vertex 170.2630547111473 -86.7862092697174 -62.60000000000005
+ vertex 167.29895309600957 -86.69146515804317 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 167.29895309600957 -86.69146515804317 -62.60000000000005
+ vertex 170.2630547111473 -86.7862092697174 -62.60000000000005
+ vertex 167.24443441807207 -87.1055756302072 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 167.24443441807207 -87.1055756302072 -62.60000000000005
+ vertex 170.2630547111473 -86.7862092697174 -62.60000000000005
+ vertex 167.08459374206464 -87.49146515804317 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 167.08459374206464 -87.49146515804317 -62.60000000000005
+ vertex 170.2630547111473 -86.7862092697174 -62.60000000000005
+ vertex 167.80420898433533 -87.44505499652941 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 167.08459374206464 -87.49146515804317 -62.60000000000005
+ vertex 167.80420898433533 -87.44505499652941 -62.60000000000005
+ vertex 166.01431103577866 -89.41387833389432 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 167.80420898433533 -87.44505499652941 -62.60000000000005
+ vertex 170.2630547111473 -86.7862092697174 -62.60000000000005
+ vertex 170.0630547111473 -87.13261943123119 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 167.80420898433533 -87.44505499652941 -62.60000000000005
+ vertex 170.0630547111473 -87.13261943123119 -62.60000000000005
+ vertex 169.70946487266107 -88.5450549965294 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 169.70946487266107 -88.5450549965294 -62.60000000000005
+ vertex 170.0630547111473 -87.13261943123119 -62.60000000000005
+ vertex 170.4094648726611 -87.3326194312312 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 163.9895552000824 -98.98360001403886 -62.60000000000005
+ vertex 166.6447629363245 -99.25565161676548 -62.60000000000005
+ vertex 169.41834729097397 -102.11791458908962 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 166.6447629363245 -99.25565161676548 -62.60000000000005
+ vertex 163.9895552000824 -98.98360001403886 -62.60000000000005
+ vertex 166.2156826553102 -98.6964633075618 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 166.2156826553102 -98.6964633075618 -62.60000000000005
+ vertex 163.9895552000824 -98.98360001403886 -62.60000000000005
+ vertex 165.9459515145477 -98.0452747293386 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 165.9459515145477 -98.0452747293386 -62.60000000000005
+ vertex 163.9895552000824 -98.98360001403886 -62.60000000000005
+ vertex 165.85395124552818 -97.3464633075618 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 165.85395124552818 -97.3464633075618 -62.60000000000005
+ vertex 163.9895552000824 -98.98360001403886 -62.60000000000005
+ vertex 165.9459515145477 -96.647651885785 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 165.9459515145477 -96.647651885785 -62.60000000000005
+ vertex 163.9895552000824 -98.98360001403886 -62.60000000000005
+ vertex 166.2156826553102 -95.99646330756181 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 169.41834729097397 -102.11791458908962 -62.60000000000005
+ vertex 166.6447629363245 -99.25565161676548 -62.60000000000005
+ vertex 167.20395124552817 -99.6847318977798 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 169.41834729097397 -102.11791458908962 -62.60000000000005
+ vertex 167.20395124552817 -99.6847318977798 -62.60000000000005
+ vertex 167.85513982375136 -99.95446303854229 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 169.41834729097397 -102.11791458908962 -62.60000000000005
+ vertex 167.85513982375136 -99.95446303854229 -62.60000000000005
+ vertex 168.55395124552817 -100.04646330756181 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 169.41834729097397 -102.11791458908962 -62.60000000000005
+ vertex 168.55395124552817 -100.04646330756181 -62.60000000000005
+ vertex 169.252762667305 -99.95446303854229 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 169.41834729097397 -102.11791458908962 -62.60000000000005
+ vertex 169.252762667305 -99.95446303854229 -62.60000000000005
+ vertex 169.9039512455282 -99.68473189777978 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 169.41834729097397 -102.11791458908962 -62.60000000000005
+ vertex 169.9039512455282 -99.68473189777978 -62.60000000000005
+ vertex 170.46313955473187 -99.25565161676548 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 169.41834729097397 -102.11791458908962 -62.60000000000005
+ vertex 170.46313955473187 -99.25565161676548 -62.60000000000005
+ vertex 170.89221983574615 -98.6964633075618 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 169.41834729097397 -102.11791458908962 -62.60000000000005
+ vertex 170.89221983574615 -98.6964633075618 -62.60000000000005
+ vertex 173.1183472909739 -95.70932660108475 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 169.41834729097397 -102.11791458908962 -62.60000000000005
+ vertex 173.1183472909739 -95.70932660108475 -62.60000000000005
+ vertex 173.32540252705599 -96.48206726211602 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 173.32540252705599 -96.48206726211602 -62.60000000000005
+ vertex 173.1183472909739 -95.70932660108475 -62.60000000000005
+ vertex 176.48653621919567 -94.8068230978123 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 173.32540252705599 -96.48206726211602 -62.60000000000005
+ vertex 176.48653621919567 -94.8068230978123 -62.60000000000005
+ vertex 176.6935914552777 -95.57956375884356 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 176.2984376183953 -90.7326194312312 -62.60000000000005
+ vertex 177.50369350672102 -93.0450549965294 -62.60000000000005
+ vertex 175.59843761839528 -91.9450549965294 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 177.50369350672102 -93.0450549965294 -62.60000000000005
+ vertex 176.2984376183953 -90.7326194312312 -62.60000000000005
+ vertex 176.64484777990907 -90.9326194312312 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 169.41834729097397 -102.11791458908962 -62.60000000000005
+ vertex 170.19108795200523 -101.91085935300757 -62.60000000000005
+ vertex 170.3208507942464 -105.48610351731132 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 170.19108795200523 -101.91085935300757 -62.60000000000005
+ vertex 169.41834729097397 -102.11791458908962 -62.60000000000005
+ vertex 173.32540252705599 -96.48206726211602 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 170.3208507942464 -105.48610351731132 -62.60000000000005
+ vertex 170.19108795200523 -101.91085935300757 -62.60000000000005
+ vertex 171.09359145527768 -105.2790482812293 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 170.3208507942464 -105.48610351731132 -62.60000000000005
+ vertex 171.09359145527768 -105.2790482812293 -62.60000000000005
+ vertex 169.30369350672103 -107.2478716185942 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 175.16779512185877 -105.09094968042892 -62.60000000000005
+ vertex 172.8553595565606 -106.29620556875466 -62.60000000000005
+ vertex 173.95535955656058 -104.3909496804289 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 172.8553595565606 -106.29620556875466 -62.60000000000005
+ vertex 175.16779512185877 -105.09094968042892 -62.60000000000005
+ vertex 172.5403202449453 -106.87009060718195 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 172.5403202449453 -106.87009060718195 -62.60000000000005
+ vertex 175.16779512185877 -105.09094968042892 -62.60000000000005
+ vertex 172.7945900411019 -107.20146145708043 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 172.7945900411019 -107.20146145708043 -62.60000000000005
+ vertex 175.16779512185877 -105.09094968042892 -62.60000000000005
+ vertex 172.95443071710932 -107.58735098491637 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 172.95443071710932 -107.58735098491637 -62.60000000000005
+ vertex 175.16779512185877 -105.09094968042892 -62.60000000000005
+ vertex 173.0089493950468 -108.00146145708042 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 173.0089493950468 -108.00146145708042 -62.60000000000005
+ vertex 175.16779512185877 -105.09094968042892 -62.60000000000005
+ vertex 172.95443071710932 -108.41557192924445 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 172.95443071710932 -108.41557192924445 -62.60000000000005
+ vertex 175.16779512185877 -105.09094968042892 -62.60000000000005
+ vertex 172.7945900411019 -108.80146145708042 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 172.7945900411019 -108.80146145708042 -62.60000000000005
+ vertex 175.16779512185877 -105.09094968042892 -62.60000000000005
+ vertex 171.84817987958812 -110.64069194162177 -62.600000000000065
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 171.84817987958812 -110.64069194162177 -62.600000000000065
+ vertex 175.16779512185877 -105.09094968042892 -62.60000000000005
+ vertex 174.96779512185879 -105.43735984194271 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 171.84817987958812 -110.64069194162177 -62.600000000000065
+ vertex 174.96779512185879 -105.43735984194271 -62.60000000000005
+ vertex 172.10699892469066 -110.60661776791083 -62.600000000000065
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 172.10699892469066 -110.60661776791083 -62.600000000000065
+ vertex 174.96779512185879 -105.43735984194271 -62.60000000000005
+ vertex 175.31420528337256 -105.63735984194271 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 172.10699892469066 -110.60661776791083 -62.600000000000065
+ vertex 175.31420528337256 -105.63735984194271 -62.60000000000005
+ vertex 172.34817987958812 -110.5067173454062 -62.60000000000008
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 172.34817987958812 -110.5067173454062 -62.60000000000008
+ vertex 175.31420528337256 -105.63735984194271 -62.60000000000005
+ vertex 172.55528666077467 -110.34779872280829 -62.60000000000008
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 172.55528666077467 -110.34779872280829 -62.60000000000008
+ vertex 175.31420528337256 -105.63735984194271 -62.60000000000005
+ vertex 172.71420528337256 -110.14069194162177 -62.60000000000008
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 167.3984376183953 -106.14787161859421 -62.60000000000005
+ vertex 167.04484777990902 -107.56030718389242 -62.60000000000005
+ vertex 166.69843761839527 -107.36030718389243 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 167.04484777990902 -107.56030718389242 -62.60000000000005
+ vertex 167.3984376183953 -106.14787161859421 -62.60000000000005
+ vertex 169.30369350672103 -107.2478716185942 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 167.04484777990902 -107.56030718389242 -62.60000000000005
+ vertex 169.30369350672103 -107.2478716185942 -62.60000000000005
+ vertex 166.84484777990903 -107.90671734540621 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 166.84484777990903 -107.90671734540621 -62.60000000000005
+ vertex 169.30369350672103 -107.2478716185942 -62.60000000000005
+ vertex 170.0233087489917 -108.80146145708044 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 166.84484777990903 -107.90671734540621 -62.60000000000005
+ vertex 170.0233087489917 -108.80146145708044 -62.60000000000005
+ vertex 170.27757854514834 -109.13283230697894 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 166.84484777990903 -107.90671734540621 -62.60000000000005
+ vertex 170.27757854514834 -109.13283230697894 -62.60000000000005
+ vertex 171.34817987958812 -110.5067173454062 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 170.0233087489917 -108.80146145708044 -62.60000000000005
+ vertex 169.30369350672103 -107.2478716185942 -62.60000000000005
+ vertex 169.8634680729843 -108.41557192924448 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 169.8634680729843 -108.41557192924448 -62.60000000000005
+ vertex 169.30369350672103 -107.2478716185942 -62.60000000000005
+ vertex 169.8089493950468 -108.00146145708044 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 169.8089493950468 -108.00146145708044 -62.60000000000005
+ vertex 169.30369350672103 -107.2478716185942 -62.60000000000005
+ vertex 169.8634680729843 -107.58735098491641 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 169.8634680729843 -107.58735098491641 -62.60000000000005
+ vertex 169.30369350672103 -107.2478716185942 -62.60000000000005
+ vertex 170.0233087489917 -107.20146145708044 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 170.0233087489917 -107.20146145708044 -62.60000000000005
+ vertex 169.30369350672103 -107.2478716185942 -62.60000000000005
+ vertex 171.09359145527768 -105.2790482812293 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 171.34817987958812 -110.5067173454062 -62.60000000000005
+ vertex 170.27757854514834 -109.13283230697894 -62.60000000000005
+ vertex 170.60894939504684 -109.38710210313555 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 171.34817987958812 -110.5067173454062 -62.60000000000005
+ vertex 170.60894939504684 -109.38710210313555 -62.60000000000005
+ vertex 170.9948389228828 -109.54694277914295 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 171.34817987958812 -110.5067173454062 -62.60000000000005
+ vertex 170.9948389228828 -109.54694277914295 -62.60000000000005
+ vertex 171.40894939504682 -109.60146145708045 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 171.34817987958812 -110.5067173454062 -62.60000000000005
+ vertex 171.40894939504682 -109.60146145708045 -62.60000000000005
+ vertex 171.82305986721084 -109.54694277914295 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 171.34817987958812 -110.5067173454062 -62.60000000000005
+ vertex 171.82305986721084 -109.54694277914295 -62.60000000000005
+ vertex 172.20894939504683 -109.38710210313553 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 171.34817987958812 -110.5067173454062 -62.60000000000005
+ vertex 172.20894939504683 -109.38710210313553 -62.60000000000005
+ vertex 171.5893608344856 -110.60661776791083 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 171.5893608344856 -110.60661776791083 -62.60000000000005
+ vertex 172.20894939504683 -109.38710210313553 -62.60000000000005
+ vertex 172.5403202449453 -109.1328323069789 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 171.5893608344856 -110.60661776791083 -62.60000000000005
+ vertex 172.5403202449453 -109.1328323069789 -62.60000000000005
+ vertex 171.84817987958812 -110.64069194162177 -62.600000000000065
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 171.84817987958812 -110.64069194162177 -62.600000000000065
+ vertex 172.5403202449453 -109.1328323069789 -62.60000000000005
+ vertex 172.7945900411019 -108.80146145708042 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 171.09359145527768 -105.2790482812293 -62.60000000000005
+ vertex 170.27757854514832 -106.87009060718195 -62.60000000000005
+ vertex 170.0233087489917 -107.20146145708044 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 170.27757854514832 -106.87009060718195 -62.60000000000005
+ vertex 171.09359145527768 -105.2790482812293 -62.60000000000005
+ vertex 170.6089493950468 -106.61582081102533 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 170.6089493950468 -106.61582081102533 -62.60000000000005
+ vertex 171.09359145527768 -105.2790482812293 -62.60000000000005
+ vertex 170.99483892288274 -106.45598013501792 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 170.99483892288274 -106.45598013501792 -62.60000000000005
+ vertex 171.09359145527768 -105.2790482812293 -62.60000000000005
+ vertex 171.4089493950468 -106.40146145708043 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 171.4089493950468 -106.40146145708043 -62.60000000000005
+ vertex 171.09359145527768 -105.2790482812293 -62.60000000000005
+ vertex 172.8553595565606 -106.29620556875466 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 171.4089493950468 -106.40146145708043 -62.60000000000005
+ vertex 172.8553595565606 -106.29620556875466 -62.60000000000005
+ vertex 171.82305986721084 -106.4559801350179 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 171.82305986721084 -106.4559801350179 -62.60000000000005
+ vertex 172.8553595565606 -106.29620556875466 -62.60000000000005
+ vertex 172.2089493950468 -106.61582081102532 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 172.2089493950468 -106.61582081102532 -62.60000000000005
+ vertex 172.8553595565606 -106.29620556875466 -62.60000000000005
+ vertex 172.5403202449453 -106.87009060718195 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 166.01431103577866 -89.41387833389432 -62.60000000000005
+ vertex 166.78705169680995 -89.20682309781228 -62.60000000000005
+ vertex 166.91681453905113 -92.78206726211604 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 166.78705169680995 -89.20682309781228 -62.60000000000005
+ vertex 166.01431103577866 -89.41387833389432 -62.60000000000005
+ vertex 167.80420898433533 -87.44505499652941 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 166.91681453905113 -92.78206726211604 -62.60000000000005
+ vertex 166.78705169680995 -89.20682309781228 -62.60000000000005
+ vertex 167.6895552000824 -92.575012026034 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 161.50946487266108 -102.74787161859419 -62.60000000000005
+ vertex 160.4630547111473 -103.76030718389238 -62.60000000000005
+ vertex 159.6042089843353 -101.6478716185942 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 160.4630547111473 -103.76030718389238 -62.60000000000005
+ vertex 161.50946487266108 -102.74787161859419 -62.60000000000005
+ vertex 160.80946487266107 -103.96030718389238 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 156.51331244995444 -99.40146145708046 -62.60000000000005
+ vertex 155.5526158302817 -101.34779872280829 -62.600000000000044
+ vertex 155.39369720768377 -101.14069194162175 -62.600000000000044
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 155.5526158302817 -101.34779872280829 -62.600000000000044
+ vertex 156.51331244995444 -99.40146145708046 -62.60000000000005
+ vertex 156.35347177394706 -99.78735098491643 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 155.5526158302817 -101.34779872280829 -62.600000000000044
+ vertex 156.35347177394706 -99.78735098491643 -62.60000000000005
+ vertex 156.29895309600957 -100.20146145708047 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 155.5526158302817 -101.34779872280829 -62.600000000000044
+ vertex 156.29895309600957 -100.20146145708047 -62.60000000000005
+ vertex 155.75972261146822 -101.50671734540619 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 155.75972261146822 -101.50671734540619 -62.60000000000005
+ vertex 156.29895309600957 -100.20146145708047 -62.60000000000005
+ vertex 156.35347177394706 -100.6155719292445 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 155.75972261146822 -101.50671734540619 -62.60000000000005
+ vertex 156.35347177394706 -100.6155719292445 -62.60000000000005
+ vertex 156.51331244995447 -101.00146145708045 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 155.75972261146822 -101.50671734540619 -62.60000000000005
+ vertex 156.51331244995447 -101.00146145708045 -62.60000000000005
+ vertex 156.7675822461111 -101.33283230697894 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 155.75972261146822 -101.50671734540619 -62.60000000000005
+ vertex 156.7675822461111 -101.33283230697894 -62.60000000000005
+ vertex 160.2630547111473 -104.10671734540614 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 160.2630547111473 -104.10671734540614 -62.60000000000005
+ vertex 156.7675822461111 -101.33283230697894 -62.60000000000005
+ vertex 157.09895309600958 -101.58710210313555 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 160.2630547111473 -104.10671734540614 -62.60000000000005
+ vertex 157.09895309600958 -101.58710210313555 -62.60000000000005
+ vertex 157.48484262384554 -101.74694277914296 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 160.2630547111473 -104.10671734540614 -62.60000000000005
+ vertex 157.48484262384554 -101.74694277914296 -62.60000000000005
+ vertex 157.8989530960096 -101.80146145708045 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 160.2630547111473 -104.10671734540614 -62.60000000000005
+ vertex 157.8989530960096 -101.80146145708045 -62.60000000000005
+ vertex 158.31306356817362 -101.74694277914296 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 160.2630547111473 -104.10671734540614 -62.60000000000005
+ vertex 158.31306356817362 -101.74694277914296 -62.60000000000005
+ vertex 158.69895309600957 -101.58710210313555 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 160.2630547111473 -104.10671734540614 -62.60000000000005
+ vertex 158.69895309600957 -101.58710210313555 -62.60000000000005
+ vertex 159.03032394590804 -101.33283230697893 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 160.2630547111473 -104.10671734540614 -62.60000000000005
+ vertex 159.03032394590804 -101.33283230697893 -62.60000000000005
+ vertex 159.2845937420647 -101.00146145708044 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 160.2630547111473 -104.10671734540614 -62.60000000000005
+ vertex 159.2845937420647 -101.00146145708044 -62.60000000000005
+ vertex 159.6042089843353 -101.6478716185942 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 159.6042089843353 -101.6478716185942 -62.60000000000005
+ vertex 159.2845937420647 -101.00146145708044 -62.60000000000005
+ vertex 160.41431103577867 -99.11336285628003 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 159.6042089843353 -101.6478716185942 -62.60000000000005
+ vertex 160.41431103577867 -99.11336285628003 -62.60000000000005
+ vertex 160.6213662718607 -99.8861035173113 -62.60000000000005
+ endloop
+endfacet
+facet normal 3.598955634993343e-19 1.7942835350329497e-19 -1.0
+ outer loop
+ vertex 160.2630547111473 -104.10671734540614 -62.60000000000005
+ vertex 159.6042089843353 -101.6478716185942 -62.60000000000005
+ vertex 160.4630547111473 -103.76030718389238 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 178.07757854514833 -93.36009430814471 -62.60000000000005
+ vertex 177.6634680729843 -94.07735468587917 -62.60000000000005
+ vertex 177.82330874899168 -93.6914651580432 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 177.6634680729843 -94.07735468587917 -62.60000000000005
+ vertex 178.07757854514833 -93.36009430814471 -62.60000000000005
+ vertex 178.4089493950468 -93.10582451198808 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 177.6634680729843 -94.07735468587917 -62.60000000000005
+ vertex 178.4089493950468 -93.10582451198808 -62.60000000000005
+ vertex 177.60894939504678 -94.4914651580432 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 177.60894939504678 -94.4914651580432 -62.60000000000005
+ vertex 178.4089493950468 -93.10582451198808 -62.60000000000005
+ vertex 178.79483892288275 -92.94598383598067 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 177.60894939504678 -94.4914651580432 -62.60000000000005
+ vertex 178.79483892288275 -92.94598383598067 -62.60000000000005
+ vertex 177.6634680729843 -94.90557563020724 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 177.6634680729843 -94.90557563020724 -62.60000000000005
+ vertex 178.79483892288275 -92.94598383598067 -62.60000000000005
+ vertex 179.2089493950468 -92.89146515804318 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 177.6634680729843 -94.90557563020724 -62.60000000000005
+ vertex 179.2089493950468 -92.89146515804318 -62.60000000000005
+ vertex 177.8233087489917 -95.2914651580432 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 177.8233087489917 -95.2914651580432 -62.60000000000005
+ vertex 179.2089493950468 -92.89146515804318 -62.60000000000005
+ vertex 179.62305986721083 -92.94598383598067 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 177.8233087489917 -95.2914651580432 -62.60000000000005
+ vertex 179.62305986721083 -92.94598383598067 -62.60000000000005
+ vertex 178.07757854514833 -95.62283600794169 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 178.07757854514833 -95.62283600794169 -62.60000000000005
+ vertex 179.62305986721083 -92.94598383598067 -62.60000000000005
+ vertex 180.00894939504678 -93.10582451198808 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 178.07757854514833 -95.62283600794169 -62.60000000000005
+ vertex 180.00894939504678 -93.10582451198808 -62.60000000000005
+ vertex 178.40894939504682 -95.87710580409828 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 178.40894939504682 -95.87710580409828 -62.60000000000005
+ vertex 180.00894939504678 -93.10582451198808 -62.60000000000005
+ vertex 180.34032024494527 -93.36009430814468 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 178.40894939504682 -95.87710580409828 -62.60000000000005
+ vertex 180.34032024494527 -93.36009430814468 -62.60000000000005
+ vertex 178.79483892288278 -96.03694648010568 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 178.79483892288278 -96.03694648010568 -62.60000000000005
+ vertex 180.34032024494527 -93.36009430814468 -62.60000000000005
+ vertex 180.5945900411019 -93.69146515804317 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 178.79483892288278 -96.03694648010568 -62.60000000000005
+ vertex 180.5945900411019 -93.69146515804317 -62.60000000000005
+ vertex 179.2089493950468 -96.09146515804319 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 179.2089493950468 -96.09146515804319 -62.60000000000005
+ vertex 180.5945900411019 -93.69146515804317 -62.60000000000005
+ vertex 180.7544307171093 -94.07735468587913 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 179.2089493950468 -96.09146515804319 -62.60000000000005
+ vertex 180.7544307171093 -94.07735468587913 -62.60000000000005
+ vertex 179.62305986721086 -96.0369464801057 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 179.62305986721086 -96.0369464801057 -62.60000000000005
+ vertex 180.7544307171093 -94.07735468587913 -62.60000000000005
+ vertex 180.8089493950468 -94.49146515804317 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 179.62305986721086 -96.0369464801057 -62.60000000000005
+ vertex 180.8089493950468 -94.49146515804317 -62.60000000000005
+ vertex 180.00894939504684 -95.87710580409829 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 180.00894939504684 -95.87710580409829 -62.60000000000005
+ vertex 180.8089493950468 -94.49146515804317 -62.60000000000005
+ vertex 180.7544307171093 -94.9055756302072 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 180.00894939504684 -95.87710580409829 -62.60000000000005
+ vertex 180.7544307171093 -94.9055756302072 -62.60000000000005
+ vertex 180.3403202449453 -95.62283600794163 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 180.3403202449453 -95.62283600794163 -62.60000000000005
+ vertex 180.7544307171093 -94.9055756302072 -62.60000000000005
+ vertex 180.59459004110192 -95.29146515804317 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 -1.3771336778111666e-16
+ outer loop
+ vertex 157.9936972076838 -95.63735984194264 617.3999999999999
+ vertex 155.39369720768377 -100.14069194162175 -62.600000000000044
+ vertex 155.39369720768377 -100.14069194162175 617.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 -1.3771336778111666e-16
+ outer loop
+ vertex 155.39369720768377 -100.14069194162175 -62.600000000000044
+ vertex 157.9936972076838 -95.63735984194264 617.3999999999999
+ vertex 157.9936972076838 -95.63735984194264 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112951 0.38268343236507 -1.6369160198769278e-16
+ outer loop
+ vertex 155.39369720768377 -100.14069194162175 617.3999999999999
+ vertex 155.29379678517915 -100.38187289651923 -62.600000000000044
+ vertex 155.29379678517915 -100.38187289651923 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112951 0.38268343236507 -1.6369160198769278e-16
+ outer loop
+ vertex 155.29379678517915 -100.38187289651923 -62.600000000000044
+ vertex 155.39369720768377 -100.14069194162175 617.3999999999999
+ vertex 155.39369720768377 -100.14069194162175 -62.600000000000044
+ endloop
+endfacet
+facet normal -0.8660254037844367 0.5000000000000033 -1.3771336778111587e-16
+ outer loop
+ vertex 166.91681453905113 -92.78206726211604 617.3999999999999
+ vertex 163.78249996400035 -98.21085935300758 -62.60000000000005
+ vertex 163.78249996400035 -98.21085935300758 617.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844367 0.5000000000000033 -1.3771336778111587e-16
+ outer loop
+ vertex 163.78249996400035 -98.21085935300758 -62.60000000000005
+ vertex 166.91681453905113 -92.78206726211604 617.3999999999999
+ vertex 166.91681453905113 -92.78206726211604 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738093 0.13052619222006007 -2.0684907214262692e-16
+ outer loop
+ vertex 155.29379678517915 -100.38187289651923 617.3999999999999
+ vertex 155.25972261146825 -100.64069194162175 -62.600000000000044
+ vertex 155.25972261146825 -100.64069194162175 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738093 0.13052619222006007 -2.0684907214262692e-16
+ outer loop
+ vertex 155.25972261146825 -100.64069194162175 -62.600000000000044
+ vertex 155.29379678517915 -100.38187289651923 617.3999999999999
+ vertex 155.29379678517915 -100.38187289651923 -62.600000000000044
+ endloop
+endfacet
+facet normal -0.9914448613738132 -0.13052619222003078 -2.3591011986529993e-16
+ outer loop
+ vertex 155.25972261146825 -100.64069194162175 617.3999999999999
+ vertex 155.29379678517915 -100.89951098672427 -62.600000000000044
+ vertex 155.29379678517915 -100.89951098672427 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738132 -0.13052619222003078 -2.3591011986529993e-16
+ outer loop
+ vertex 155.29379678517915 -100.89951098672427 -62.600000000000044
+ vertex 155.25972261146825 -100.64069194162175 617.3999999999999
+ vertex 155.25972261146825 -100.64069194162175 -62.600000000000044
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844386 2.0805319374395364e-16
+ outer loop
+ vertex 159.6042089843353 -101.6478716185942 617.3999999999999
+ vertex 161.50946487266108 -102.74787161859419 -62.60000000000005
+ vertex 159.6042089843353 -101.6478716185942 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000001 0.8660254037844386 2.0805319374395364e-16
+ outer loop
+ vertex 161.50946487266108 -102.74787161859419 -62.60000000000005
+ vertex 159.6042089843353 -101.6478716185942 617.3999999999999
+ vertex 161.50946487266108 -102.74787161859419 617.3999999999999
+ endloop
+endfacet
+facet normal 0.5000000000000049 0.866025403784436 2.0805319374395443e-16
+ outer loop
+ vertex 157.9936972076838 -95.63735984194264 -62.60000000000005
+ vertex 158.34010736919757 -95.83735984194263 617.3999999999999
+ vertex 158.34010736919757 -95.83735984194263 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000049 0.866025403784436 2.0805319374395443e-16
+ outer loop
+ vertex 158.34010736919757 -95.83735984194263 617.3999999999999
+ vertex 157.9936972076838 -95.63735984194264 -62.60000000000005
+ vertex 157.9936972076838 -95.63735984194264 617.3999999999999
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 2.080531937439537e-16
+ outer loop
+ vertex 158.65254293449578 -98.09620556875467 617.3999999999999
+ vertex 160.41431103577867 -99.11336285628003 -62.60000000000005
+ vertex 158.65254293449578 -98.09620556875467 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 2.080531937439537e-16
+ outer loop
+ vertex 160.41431103577867 -99.11336285628003 -62.60000000000005
+ vertex 158.65254293449578 -98.09620556875467 617.3999999999999
+ vertex 160.41431103577867 -99.11336285628003 617.3999999999999
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 -2.080531937439537e-16
+ outer loop
+ vertex 166.01431103577866 -89.41387833389432 617.3999999999999
+ vertex 164.25254293449578 -88.39672104636894 -62.60000000000005
+ vertex 166.01431103577866 -89.41387833389432 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 -2.080531937439537e-16
+ outer loop
+ vertex 164.25254293449578 -88.39672104636894 -62.60000000000005
+ vertex 166.01431103577866 -89.41387833389432 617.3999999999999
+ vertex 164.25254293449578 -88.39672104636894 617.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 1.3771336778111666e-16
+ outer loop
+ vertex 160.6213662718607 -99.8861035173113 -62.60000000000005
+ vertex 159.6042089843353 -101.6478716185942 617.3999999999999
+ vertex 159.6042089843353 -101.6478716185942 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 1.3771336778111666e-16
+ outer loop
+ vertex 159.6042089843353 -101.6478716185942 617.3999999999999
+ vertex 160.6213662718607 -99.8861035173113 -62.60000000000005
+ vertex 160.6213662718607 -99.8861035173113 617.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 1.3771336778111663e-16
+ outer loop
+ vertex 159.75254293449578 -96.19094968042891 -62.60000000000005
+ vertex 158.65254293449578 -98.09620556875467 617.3999999999999
+ vertex 158.65254293449578 -98.09620556875467 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 1.3771336778111663e-16
+ outer loop
+ vertex 158.65254293449578 -98.09620556875467 617.3999999999999
+ vertex 159.75254293449578 -96.19094968042891 -62.60000000000005
+ vertex 159.75254293449578 -96.19094968042891 617.3999999999999
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 -2.080531937439537e-16
+ outer loop
+ vertex 162.14010736919758 -89.25556677318093 617.3999999999999
+ vertex 161.79369720768378 -89.05556677318093 -62.60000000000005
+ vertex 162.14010736919758 -89.25556677318093 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 -2.080531937439537e-16
+ outer loop
+ vertex 161.79369720768378 -89.05556677318093 -62.60000000000005
+ vertex 162.14010736919758 -89.25556677318093 617.3999999999999
+ vertex 161.79369720768378 -89.05556677318093 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912274 -0.6087614290087309 -2.449167116386771e-16
+ outer loop
+ vertex 155.5526158302817 -101.34779872280829 617.3999999999999
+ vertex 155.39369720768377 -101.14069194162175 -62.600000000000044
+ vertex 155.5526158302817 -101.34779872280829 -62.600000000000044
+ endloop
+endfacet
+facet normal -0.7933533402912274 -0.6087614290087309 -2.449167116386771e-16
+ outer loop
+ vertex 155.39369720768377 -101.14069194162175 -62.600000000000044
+ vertex 155.5526158302817 -101.34779872280829 617.3999999999999
+ vertex 155.39369720768377 -101.14069194162175 617.3999999999999
+ endloop
+endfacet
+facet normal 0.2588190451025164 -0.9659258262890695 -4.9737767925804687e-17
+ outer loop
+ vertex 163.9895552000824 -98.98360001403886 617.3999999999999
+ vertex 160.6213662718607 -99.8861035173113 -62.60000000000005
+ vertex 163.9895552000824 -98.98360001403886 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.2588190451025164 -0.9659258262890695 -4.9737767925804687e-17
+ outer loop
+ vertex 160.6213662718607 -99.8861035173113 -62.60000000000005
+ vertex 163.9895552000824 -98.98360001403886 617.3999999999999
+ vertex 160.6213662718607 -99.8861035173113 617.3999999999999
+ endloop
+endfacet
+facet normal -0.2588190451025207 0.9659258262890684 4.9737767925803565e-17
+ outer loop
+ vertex 163.78249996400035 -98.21085935300758 617.3999999999999
+ vertex 160.41431103577867 -99.11336285628003 -62.60000000000005
+ vertex 160.41431103577867 -99.11336285628003 617.3999999999999
+ endloop
+endfacet
+facet normal -0.2588190451025207 0.9659258262890684 4.9737767925803565e-17
+ outer loop
+ vertex 160.41431103577867 -99.11336285628003 -62.60000000000005
+ vertex 163.78249996400035 -98.21085935300758 617.3999999999999
+ vertex 163.78249996400035 -98.21085935300758 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 1.3771336778111663e-16
+ outer loop
+ vertex 160.2630547111473 -104.10671734540614 -62.60000000000005
+ vertex 160.4630547111473 -103.76030718389238 617.3999999999999
+ vertex 160.2630547111473 -104.10671734540614 617.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 1.3771336778111663e-16
+ outer loop
+ vertex 160.4630547111473 -103.76030718389238 617.3999999999999
+ vertex 160.2630547111473 -104.10671734540614 -62.60000000000005
+ vertex 160.4630547111473 -103.76030718389238 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 -1.3771336778111663e-16
+ outer loop
+ vertex 162.14010736919758 -89.25556677318093 617.3999999999999
+ vertex 161.94010736919756 -89.6019769346947 -62.60000000000005
+ vertex 161.94010736919756 -89.6019769346947 617.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 -1.3771336778111663e-16
+ outer loop
+ vertex 161.94010736919756 -89.6019769346947 -62.60000000000005
+ vertex 162.14010736919758 -89.25556677318093 617.3999999999999
+ vertex 162.14010736919758 -89.25556677318093 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844304 -0.5000000000000142 1.377133677811133e-16
+ outer loop
+ vertex 161.50946487266108 -102.74787161859419 -62.60000000000005
+ vertex 160.80946487266107 -103.96030718389238 617.3999999999999
+ vertex 160.80946487266107 -103.96030718389238 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844304 -0.5000000000000142 1.377133677811133e-16
+ outer loop
+ vertex 160.80946487266107 -103.96030718389238 617.3999999999999
+ vertex 161.50946487266108 -102.74787161859419 -62.60000000000005
+ vertex 161.50946487266108 -102.74787161859419 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9659258262890691 -0.25881904510251763 -2.4449388036193263e-16
+ outer loop
+ vertex 166.01431103577866 -89.41387833389432 617.3999999999999
+ vertex 166.91681453905113 -92.78206726211604 -62.60000000000005
+ vertex 166.91681453905113 -92.78206726211604 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9659258262890691 -0.25881904510251763 -2.4449388036193263e-16
+ outer loop
+ vertex 166.91681453905113 -92.78206726211604 -62.60000000000005
+ vertex 166.01431103577866 -89.41387833389432 617.3999999999999
+ vertex 166.01431103577866 -89.41387833389432 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912216 0.6087614290087383 -1.0937881967044587e-16
+ outer loop
+ vertex 164.5526158302817 -84.3451278923153 617.3999999999999
+ vertex 164.39369720768377 -84.55223467350186 -62.60000000000005
+ vertex 164.39369720768377 -84.55223467350186 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912216 0.6087614290087383 -1.0937881967044587e-16
+ outer loop
+ vertex 164.39369720768377 -84.55223467350186 -62.60000000000005
+ vertex 164.5526158302817 -84.3451278923153 617.3999999999999
+ vertex 164.5526158302817 -84.3451278923153 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087271 0.7933533402912302 -4.7612051549719774e-17
+ outer loop
+ vertex 164.75972261146825 -84.18620926971741 617.3999999999999
+ vertex 164.5526158302817 -84.3451278923153 -62.60000000000005
+ vertex 164.5526158302817 -84.3451278923153 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087271 0.7933533402912302 -4.7612051549719774e-17
+ outer loop
+ vertex 164.5526158302817 -84.3451278923153 -62.60000000000005
+ vertex 164.75972261146825 -84.18620926971741 617.3999999999999
+ vertex 164.75972261146825 -84.18620926971741 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.4999999999999974 -0.8660254037844404 -2.0805319374395325e-16
+ outer loop
+ vertex 160.2630547111473 -104.10671734540614 617.3999999999999
+ vertex 155.75972261146822 -101.50671734540619 -62.60000000000005
+ vertex 160.2630547111473 -104.10671734540614 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.4999999999999974 -0.8660254037844404 -2.0805319374395325e-16
+ outer loop
+ vertex 155.75972261146822 -101.50671734540619 -62.60000000000005
+ vertex 160.2630547111473 -104.10671734540614 617.3999999999999
+ vertex 155.75972261146822 -101.50671734540619 617.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 -1.3771336778111663e-16
+ outer loop
+ vertex 158.54010736919759 -95.49094968042887 617.3999999999999
+ vertex 158.34010736919757 -95.83735984194263 -62.60000000000005
+ vertex 158.34010736919757 -95.83735984194263 617.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 -1.3771336778111663e-16
+ outer loop
+ vertex 158.34010736919757 -95.83735984194263 -62.60000000000005
+ vertex 158.54010736919759 -95.49094968042887 617.3999999999999
+ vertex 158.54010736919759 -95.49094968042887 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087248 -0.7933533402912322 -2.242484713441219e-16
+ outer loop
+ vertex 155.75972261146822 -101.50671734540619 617.3999999999999
+ vertex 155.5526158302817 -101.34779872280829 -62.600000000000044
+ vertex 155.75972261146822 -101.50671734540619 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087248 -0.7933533402912322 -2.242484713441219e-16
+ outer loop
+ vertex 155.5526158302817 -101.34779872280829 -62.600000000000044
+ vertex 155.75972261146822 -101.50671734540619 617.3999999999999
+ vertex 155.5526158302817 -101.34779872280829 617.3999999999999
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 -2.080531937439537e-16
+ outer loop
+ vertex 163.15254293449576 -90.30197693469471 617.3999999999999
+ vertex 161.94010736919756 -89.6019769346947 -62.60000000000005
+ vertex 163.15254293449576 -90.30197693469471 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 -2.080531937439537e-16
+ outer loop
+ vertex 161.94010736919756 -89.6019769346947 -62.60000000000005
+ vertex 163.15254293449576 -90.30197693469471 617.3999999999999
+ vertex 161.94010736919756 -89.6019769346947 617.3999999999999
+ endloop
+endfacet
+facet normal -0.38268343236510877 0.9238795325112791 1.7399399201488056e-17
+ outer loop
+ vertex 165.0009035663657 -84.08630884721279 617.3999999999999
+ vertex 164.75972261146825 -84.18620926971741 -62.600000000000065
+ vertex 164.75972261146825 -84.18620926971741 617.3999999999999
+ endloop
+endfacet
+facet normal -0.38268343236510877 0.9238795325112791 1.7399399201488056e-17
+ outer loop
+ vertex 164.75972261146825 -84.18620926971741 -62.600000000000065
+ vertex 165.0009035663657 -84.08630884721279 617.3999999999999
+ vertex 165.0009035663657 -84.08630884721279 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.13052619222005007 0.9914448613738107 8.122510965098939e-17
+ outer loop
+ vertex 165.0009035663657 -84.08630884721279 -62.600000000000065
+ vertex 165.25972261146822 -84.05223467350184 617.3999999999999
+ vertex 165.25972261146822 -84.05223467350184 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.13052619222005007 0.9914448613738107 8.122510965098939e-17
+ outer loop
+ vertex 165.25972261146822 -84.05223467350184 617.3999999999999
+ vertex 165.0009035663657 -84.08630884721279 -62.600000000000065
+ vertex 165.0009035663657 -84.08630884721279 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112845 -0.38268343236509544 -2.4889428277906133e-16
+ outer loop
+ vertex 155.39369720768377 -101.14069194162175 617.3999999999999
+ vertex 155.29379678517915 -100.89951098672427 -62.600000000000044
+ vertex 155.39369720768377 -101.14069194162175 -62.600000000000044
+ endloop
+endfacet
+facet normal -0.9238795325112845 -0.38268343236509544 -2.4889428277906133e-16
+ outer loop
+ vertex 155.29379678517915 -100.89951098672427 -62.600000000000044
+ vertex 155.39369720768377 -101.14069194162175 617.3999999999999
+ vertex 155.29379678517915 -100.89951098672427 617.3999999999999
+ endloop
+endfacet
+facet normal 0.5000000000000351 0.8660254037844184 2.0805319374395916e-16
+ outer loop
+ vertex 158.54010736919759 -95.49094968042887 617.3999999999999
+ vertex 159.75254293449578 -96.19094968042891 -62.60000000000005
+ vertex 158.54010736919759 -95.49094968042887 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000351 0.8660254037844184 2.0805319374395916e-16
+ outer loop
+ vertex 159.75254293449578 -96.19094968042891 -62.60000000000005
+ vertex 158.54010736919759 -95.49094968042887 617.3999999999999
+ vertex 159.75254293449578 -96.19094968042891 617.3999999999999
+ endloop
+endfacet
+facet normal -0.5000000000000047 -0.8660254037844359 -2.0805319374395433e-16
+ outer loop
+ vertex 160.80946487266107 -103.96030718389238 617.3999999999999
+ vertex 160.4630547111473 -103.76030718389238 -62.60000000000005
+ vertex 160.80946487266107 -103.96030718389238 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.5000000000000047 -0.8660254037844359 -2.0805319374395433e-16
+ outer loop
+ vertex 160.4630547111473 -103.76030718389238 -62.60000000000005
+ vertex 160.80946487266107 -103.96030718389238 617.3999999999999
+ vertex 160.4630547111473 -103.76030718389238 617.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 1.3771336778111666e-16
+ outer loop
+ vertex 164.25254293449578 -88.39672104636894 -62.60000000000005
+ vertex 163.15254293449576 -90.30197693469471 617.3999999999999
+ vertex 163.15254293449576 -90.30197693469471 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 1.3771336778111666e-16
+ outer loop
+ vertex 163.15254293449576 -90.30197693469471 617.3999999999999
+ vertex 164.25254293449578 -88.39672104636894 -62.60000000000005
+ vertex 164.25254293449578 -88.39672104636894 617.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 -1.3771336778111666e-16
+ outer loop
+ vertex 164.39369720768377 -84.55223467350186 617.3999999999999
+ vertex 161.79369720768378 -89.05556677318093 -62.60000000000005
+ vertex 161.79369720768378 -89.05556677318093 617.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 -1.3771336778111666e-16
+ outer loop
+ vertex 161.79369720768378 -89.05556677318093 -62.60000000000005
+ vertex 164.39369720768377 -84.55223467350186 617.3999999999999
+ vertex 164.39369720768377 -84.55223467350186 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112906 -0.3826834323650804 1.6369160198769062e-16
+ outer loop
+ vertex 164.31331244995442 -85.89146515804319 -62.60000000000005
+ vertex 164.15347177394705 -86.27735468587916 617.3999999999999
+ vertex 164.15347177394705 -86.27735468587916 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112906 -0.3826834323650804 1.6369160198769062e-16
+ outer loop
+ vertex 164.15347177394705 -86.27735468587916 617.3999999999999
+ vertex 164.31331244995442 -85.89146515804319 -62.60000000000005
+ vertex 164.31331244995442 -85.89146515804319 617.3999999999999
+ endloop
+endfacet
+facet normal 0.38268343236508945 0.923879532511287 1.8829806831558386e-16
+ outer loop
+ vertex 167.20395124552817 -99.6847318977798 617.3999999999999
+ vertex 167.85513982375136 -99.95446303854229 -62.60000000000005
+ vertex 167.20395124552817 -99.6847318977798 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.38268343236508945 0.923879532511287 1.8829806831558386e-16
+ outer loop
+ vertex 167.85513982375136 -99.95446303854229 -62.60000000000005
+ vertex 167.20395124552817 -99.6847318977798 617.3999999999999
+ vertex 167.85513982375136 -99.95446303854229 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738133 0.13052619222003006 2.359101198652999e-16
+ outer loop
+ vertex 165.85395124552818 -97.3464633075618 -62.60000000000005
+ vertex 165.9459515145477 -98.0452747293386 617.3999999999999
+ vertex 165.9459515145477 -98.0452747293386 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738133 0.13052619222003006 2.359101198652999e-16
+ outer loop
+ vertex 165.9459515145477 -98.0452747293386 617.3999999999999
+ vertex 165.85395124552818 -97.3464633075618 -62.60000000000005
+ vertex 165.85395124552818 -97.3464633075618 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222006037 0.9914448613738093 1.3951546310861218e-16
+ outer loop
+ vertex 167.85513982375136 -99.95446303854229 617.3999999999999
+ vertex 168.55395124552817 -100.04646330756181 -62.60000000000005
+ vertex 167.85513982375136 -99.95446303854229 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222006037 0.9914448613738093 1.3951546310861218e-16
+ outer loop
+ vertex 168.55395124552817 -100.04646330756181 -62.60000000000005
+ vertex 167.85513982375136 -99.95446303854229 617.3999999999999
+ vertex 168.55395124552817 -100.04646330756181 617.3999999999999
+ endloop
+endfacet
+facet normal 0.1305261922200625 0.991444861373809 1.395154631086126e-16
+ outer loop
+ vertex 165.25972261146822 -84.05223467350184 -62.600000000000065
+ vertex 165.51854165657076 -84.08630884721279 617.3999999999999
+ vertex 165.51854165657076 -84.08630884721279 -62.60000000000008
+ endloop
+endfacet
+facet normal 0.1305261922200625 0.991444861373809 1.395154631086126e-16
+ outer loop
+ vertex 165.51854165657076 -84.08630884721279 617.3999999999999
+ vertex 165.25972261146822 -84.05223467350184 -62.600000000000065
+ vertex 165.25972261146822 -84.05223467350184 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912395 0.608761429008715 -1.0937881967045245e-16
+ outer loop
+ vertex 170.89221983574615 -98.6964633075618 617.3999999999999
+ vertex 170.46313955473187 -99.25565161676548 -62.60000000000005
+ vertex 170.46313955473187 -99.25565161676548 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912395 0.608761429008715 -1.0937881967045245e-16
+ outer loop
+ vertex 170.46313955473187 -99.25565161676548 -62.60000000000005
+ vertex 170.89221983574615 -98.6964633075618 617.3999999999999
+ vertex 170.89221983574615 -98.6964633075618 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738133 -0.13052619222003006 -2.359101198652999e-16
+ outer loop
+ vertex 171.16195097650868 -96.64765188578501 617.3999999999999
+ vertex 171.25395124552816 -97.3464633075618 -62.60000000000005
+ vertex 171.25395124552816 -97.3464633075618 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738133 -0.13052619222003006 -2.359101198652999e-16
+ outer loop
+ vertex 171.25395124552816 -97.3464633075618 -62.60000000000005
+ vertex 171.16195097650868 -96.64765188578501 617.3999999999999
+ vertex 171.16195097650868 -96.64765188578501 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912292 0.6087614290087288 2.449167116386773e-16
+ outer loop
+ vertex 166.2156826553102 -98.6964633075618 617.3999999999999
+ vertex 166.6447629363245 -99.25565161676548 -62.60000000000005
+ vertex 166.2156826553102 -98.6964633075618 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912292 0.6087614290087288 2.449167116386773e-16
+ outer loop
+ vertex 166.6447629363245 -99.25565161676548 -62.60000000000005
+ vertex 166.2156826553102 -98.6964633075618 617.3999999999999
+ vertex 166.6447629363245 -99.25565161676548 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087108 0.7933533402912428 -4.761205154971471e-17
+ outer loop
+ vertex 170.46313955473187 -99.25565161676548 617.3999999999999
+ vertex 169.9039512455282 -99.68473189777978 -62.60000000000005
+ vertex 169.9039512455282 -99.68473189777978 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087108 0.7933533402912428 -4.761205154971471e-17
+ outer loop
+ vertex 169.9039512455282 -99.68473189777978 -62.60000000000005
+ vertex 170.46313955473187 -99.25565161676548 617.3999999999999
+ vertex 170.46313955473187 -99.25565161676548 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912393 -0.6087614290087152 1.0937881967045242e-16
+ outer loop
+ vertex 166.6447629363245 -95.43727499835813 -62.60000000000005
+ vertex 166.2156826553102 -95.99646330756181 617.3999999999999
+ vertex 166.2156826553102 -95.99646330756181 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912393 -0.6087614290087152 1.0937881967045242e-16
+ outer loop
+ vertex 166.2156826553102 -95.99646330756181 617.3999999999999
+ vertex 166.6447629363245 -95.43727499835813 -62.60000000000005
+ vertex 166.6447629363245 -95.43727499835813 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222006037 -0.9914448613738093 -1.3951546310861218e-16
+ outer loop
+ vertex 169.252762667305 -94.73846357658132 617.3999999999999
+ vertex 168.55395124552817 -94.6464633075618 -62.60000000000005
+ vertex 169.252762667305 -94.73846357658132 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222006037 -0.9914448613738093 -1.3951546310861218e-16
+ outer loop
+ vertex 168.55395124552817 -94.6464633075618 -62.60000000000005
+ vertex 169.252762667305 -94.73846357658132 617.3999999999999
+ vertex 168.55395124552817 -94.6464633075618 617.3999999999999
+ endloop
+endfacet
+facet normal -0.991444861373812 0.13052619222003967 -2.0684907214262986e-16
+ outer loop
+ vertex 171.25395124552816 -97.3464633075618 617.3999999999999
+ vertex 171.16195097650865 -98.04527472933862 -62.60000000000005
+ vertex 171.16195097650865 -98.04527472933862 617.3999999999999
+ endloop
+endfacet
+facet normal -0.991444861373812 0.13052619222003967 -2.0684907214262986e-16
+ outer loop
+ vertex 171.16195097650865 -98.04527472933862 -62.60000000000005
+ vertex 171.25395124552816 -97.3464633075618 617.3999999999999
+ vertex 171.25395124552816 -97.3464633075618 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.1305261922200493 0.9914448613738108 8.122510965098958e-17
+ outer loop
+ vertex 168.55395124552817 -100.04646330756181 617.3999999999999
+ vertex 169.252762667305 -99.95446303854229 -62.60000000000005
+ vertex 168.55395124552817 -100.04646330756181 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.1305261922200493 0.9914448613738108 8.122510965098958e-17
+ outer loop
+ vertex 169.252762667305 -99.95446303854229 -62.60000000000005
+ vertex 168.55395124552817 -100.04646330756181 617.3999999999999
+ vertex 169.252762667305 -99.95446303854229 617.3999999999999
+ endloop
+endfacet
+facet normal 0.608761429008723 0.7933533402912334 2.242484713441216e-16
+ outer loop
+ vertex 166.6447629363245 -99.25565161676548 617.3999999999999
+ vertex 167.20395124552817 -99.6847318977798 -62.60000000000005
+ vertex 166.6447629363245 -99.25565161676548 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.608761429008723 0.7933533402912334 2.242484713441216e-16
+ outer loop
+ vertex 167.20395124552817 -99.6847318977798 -62.60000000000005
+ vertex 166.6447629363245 -99.25565161676548 617.3999999999999
+ vertex 167.20395124552817 -99.6847318977798 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912365 -0.608761429008719 -2.4491671163867783e-16
+ outer loop
+ vertex 170.89221983574618 -95.99646330756181 617.3999999999999
+ vertex 170.46313955473187 -95.43727499835813 -62.60000000000005
+ vertex 170.89221983574618 -95.99646330756181 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912365 -0.608761429008719 -2.4491671163867783e-16
+ outer loop
+ vertex 170.46313955473187 -95.43727499835813 -62.60000000000005
+ vertex 170.89221983574618 -95.99646330756181 617.3999999999999
+ vertex 170.46313955473187 -95.43727499835813 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912613 -0.6087614290086866 1.093788196704605e-16
+ outer loop
+ vertex 164.56758224611104 -85.5600943081447 -62.60000000000005
+ vertex 164.31331244995442 -85.89146515804319 617.3999999999999
+ vertex 164.31331244995442 -85.89146515804319 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912613 -0.6087614290086866 1.093788196704605e-16
+ outer loop
+ vertex 164.31331244995442 -85.89146515804319 617.3999999999999
+ vertex 164.56758224611104 -85.5600943081447 -62.60000000000005
+ vertex 164.56758224611104 -85.5600943081447 617.3999999999999
+ endloop
+endfacet
+facet normal 0.1305261922200507 -0.9914448613738105 -8.122510965098921e-17
+ outer loop
+ vertex 168.55395124552817 -94.6464633075618 617.3999999999999
+ vertex 167.8551398237514 -94.73846357658132 -62.60000000000005
+ vertex 168.55395124552817 -94.6464633075618 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.1305261922200507 -0.9914448613738105 -8.122510965098921e-17
+ outer loop
+ vertex 167.8551398237514 -94.73846357658132 -62.60000000000005
+ vertex 168.55395124552817 -94.6464633075618 617.3999999999999
+ vertex 167.8551398237514 -94.73846357658132 617.3999999999999
+ endloop
+endfacet
+facet normal -0.3826834323651094 0.9238795325112787 1.739939920148787e-17
+ outer loop
+ vertex 169.9039512455282 -99.68473189777978 617.3999999999999
+ vertex 169.252762667305 -99.95446303854229 -62.60000000000005
+ vertex 169.252762667305 -99.95446303854229 617.3999999999999
+ endloop
+endfacet
+facet normal -0.3826834323651094 0.9238795325112787 1.739939920148787e-17
+ outer loop
+ vertex 169.252762667305 -99.95446303854229 -62.60000000000005
+ vertex 169.9039512455282 -99.68473189777978 617.3999999999999
+ vertex 169.9039512455282 -99.68473189777978 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112841 -0.3826834323650964 1.6369160198768739e-16
+ outer loop
+ vertex 166.2156826553102 -95.99646330756181 -62.60000000000005
+ vertex 165.9459515145477 -96.647651885785 617.3999999999999
+ vertex 165.9459515145477 -96.647651885785 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112841 -0.3826834323650964 1.6369160198768739e-16
+ outer loop
+ vertex 165.9459515145477 -96.647651885785 617.3999999999999
+ vertex 166.2156826553102 -95.99646330756181 -62.60000000000005
+ vertex 166.2156826553102 -95.99646330756181 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112874 -0.38268343236508856 -2.4889428277906123e-16
+ outer loop
+ vertex 171.16195097650868 -96.64765188578501 617.3999999999999
+ vertex 170.89221983574618 -95.99646330756181 -62.60000000000005
+ vertex 171.16195097650868 -96.64765188578501 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112874 -0.38268343236508856 -2.4889428277906123e-16
+ outer loop
+ vertex 170.89221983574618 -95.99646330756181 -62.60000000000005
+ vertex 171.16195097650868 -96.64765188578501 617.3999999999999
+ vertex 170.89221983574618 -95.99646330756181 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087198 -0.793353340291236 -2.242484713441212e-16
+ outer loop
+ vertex 170.46313955473187 -95.43727499835813 617.3999999999999
+ vertex 169.9039512455282 -95.00819471734383 -62.60000000000005
+ vertex 170.46313955473187 -95.43727499835813 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087198 -0.793353340291236 -2.242484713441212e-16
+ outer loop
+ vertex 169.9039512455282 -95.00819471734383 -62.60000000000005
+ vertex 170.46313955473187 -95.43727499835813 617.3999999999999
+ vertex 169.9039512455282 -95.00819471734383 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112841 0.3826834323650964 -1.6369160198768739e-16
+ outer loop
+ vertex 171.16195097650865 -98.04527472933862 617.3999999999999
+ vertex 170.89221983574615 -98.6964633075618 -62.60000000000005
+ vertex 170.89221983574615 -98.6964633075618 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112841 0.3826834323650964 -1.6369160198768739e-16
+ outer loop
+ vertex 170.89221983574615 -98.6964633075618 -62.60000000000005
+ vertex 171.16195097650865 -98.04527472933862 617.3999999999999
+ vertex 171.16195097650865 -98.04527472933862 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.6087614290087054 -0.7933533402912468 4.761205154971309e-17
+ outer loop
+ vertex 164.89895309600954 -85.30582451198808 -62.60000000000005
+ vertex 164.56758224611104 -85.5600943081447 617.3999999999999
+ vertex 164.56758224611104 -85.5600943081447 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.6087614290087054 -0.7933533402912468 4.761205154971309e-17
+ outer loop
+ vertex 164.56758224611104 -85.5600943081447 617.3999999999999
+ vertex 164.89895309600954 -85.30582451198808 -62.60000000000005
+ vertex 164.89895309600954 -85.30582451198808 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112867 0.3826834323650901 2.4889428277906123e-16
+ outer loop
+ vertex 165.9459515145477 -98.0452747293386 617.3999999999999
+ vertex 166.2156826553102 -98.6964633075618 -62.60000000000005
+ vertex 165.9459515145477 -98.0452747293386 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112867 0.3826834323650901 2.4889428277906123e-16
+ outer loop
+ vertex 166.2156826553102 -98.6964633075618 -62.60000000000005
+ vertex 165.9459515145477 -98.0452747293386 617.3999999999999
+ vertex 166.2156826553102 -98.6964633075618 617.3999999999999
+ endloop
+endfacet
+facet normal 0.38268343236511393 -0.9238795325112767 -1.739939920148661e-17
+ outer loop
+ vertex 165.2848426238455 -85.14598383598067 -62.60000000000005
+ vertex 164.89895309600954 -85.30582451198808 617.3999999999999
+ vertex 164.89895309600954 -85.30582451198808 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.38268343236511393 -0.9238795325112767 -1.739939920148661e-17
+ outer loop
+ vertex 164.89895309600954 -85.30582451198808 617.3999999999999
+ vertex 165.2848426238455 -85.14598383598067 -62.60000000000005
+ vertex 165.2848426238455 -85.14598383598067 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738067 -0.13052619222007997 2.0684907214262419e-16
+ outer loop
+ vertex 164.15347177394705 -86.27735468587916 -62.60000000000005
+ vertex 164.09895309600955 -86.69146515804319 617.3999999999999
+ vertex 164.09895309600955 -86.69146515804319 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738067 -0.13052619222007997 2.0684907214262419e-16
+ outer loop
+ vertex 164.09895309600955 -86.69146515804319 617.3999999999999
+ vertex 164.15347177394705 -86.27735468587916 -62.60000000000005
+ vertex 164.15347177394705 -86.27735468587916 617.3999999999999
+ endloop
+endfacet
+facet normal 0.3826834323651094 -0.9238795325112787 -1.739939920148787e-17
+ outer loop
+ vertex 167.8551398237514 -94.73846357658132 -62.60000000000005
+ vertex 167.20395124552817 -95.00819471734383 617.3999999999999
+ vertex 167.20395124552817 -95.00819471734383 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.3826834323651094 -0.9238795325112787 -1.739939920148787e-17
+ outer loop
+ vertex 167.20395124552817 -95.00819471734383 617.3999999999999
+ vertex 167.8551398237514 -94.73846357658132 -62.60000000000005
+ vertex 167.8551398237514 -94.73846357658132 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087108 -0.7933533402912428 4.761205154971471e-17
+ outer loop
+ vertex 167.20395124552817 -95.00819471734383 -62.60000000000005
+ vertex 166.6447629363245 -95.43727499835813 617.3999999999999
+ vertex 166.6447629363245 -95.43727499835813 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.6087614290087108 -0.7933533402912428 4.761205154971471e-17
+ outer loop
+ vertex 166.6447629363245 -95.43727499835813 617.3999999999999
+ vertex 167.20395124552817 -95.00819471734383 -62.60000000000005
+ vertex 167.20395124552817 -95.00819471734383 617.3999999999999
+ endloop
+endfacet
+facet normal -0.38268343236508945 -0.923879532511287 -1.8829806831558386e-16
+ outer loop
+ vertex 169.9039512455282 -95.00819471734383 617.3999999999999
+ vertex 169.252762667305 -94.73846357658132 -62.60000000000005
+ vertex 169.9039512455282 -95.00819471734383 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.38268343236508945 -0.923879532511287 -1.8829806831558386e-16
+ outer loop
+ vertex 169.252762667305 -94.73846357658132 -62.60000000000005
+ vertex 169.9039512455282 -95.00819471734383 617.3999999999999
+ vertex 169.252762667305 -94.73846357658132 617.3999999999999
+ endloop
+endfacet
+facet normal 0.3826834323650856 0.9238795325112886 1.8829806831558317e-16
+ outer loop
+ vertex 165.51854165657076 -84.08630884721279 -62.60000000000008
+ vertex 165.75972261146822 -84.18620926971741 617.3999999999999
+ vertex 165.75972261146822 -84.18620926971741 -62.60000000000008
+ endloop
+endfacet
+facet normal 0.3826834323650856 0.9238795325112886 1.8829806831558317e-16
+ outer loop
+ vertex 165.75972261146822 -84.18620926971741 617.3999999999999
+ vertex 165.51854165657076 -84.08630884721279 -62.60000000000008
+ vertex 165.51854165657076 -84.08630884721279 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222006945 -0.9914448613738082 -8.12251096509848e-17
+ outer loop
+ vertex 165.69895309600955 -85.09146515804318 617.3999999999999
+ vertex 165.2848426238455 -85.14598383598067 -62.60000000000005
+ vertex 165.69895309600955 -85.09146515804318 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222006945 -0.9914448613738082 -8.12251096509848e-17
+ outer loop
+ vertex 165.2848426238455 -85.14598383598067 -62.60000000000005
+ vertex 165.69895309600955 -85.09146515804318 617.3999999999999
+ vertex 165.2848426238455 -85.14598383598067 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738119 -0.13052619222004044 2.0684907214262973e-16
+ outer loop
+ vertex 165.9459515145477 -96.647651885785 -62.60000000000005
+ vertex 165.85395124552818 -97.3464633075618 617.3999999999999
+ vertex 165.85395124552818 -97.3464633075618 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738119 -0.13052619222004044 2.0684907214262973e-16
+ outer loop
+ vertex 165.85395124552818 -97.3464633075618 617.3999999999999
+ vertex 165.9459515145477 -96.647651885785 -62.60000000000005
+ vertex 165.9459515145477 -96.647651885785 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087054 0.7933533402912468 -4.761205154971309e-17
+ outer loop
+ vertex 166.83032394590805 -87.82283600794165 617.3999999999999
+ vertex 166.49895309600956 -88.07710580409828 -62.60000000000005
+ vertex 166.49895309600956 -88.07710580409828 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087054 0.7933533402912468 -4.761205154971309e-17
+ outer loop
+ vertex 166.49895309600956 -88.07710580409828 -62.60000000000005
+ vertex 166.83032394590805 -87.82283600794165 617.3999999999999
+ vertex 166.83032394590805 -87.82283600794165 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112911 0.3826834323650796 -1.6369160198769084e-16
+ outer loop
+ vertex 167.24443441807207 -87.1055756302072 617.3999999999999
+ vertex 167.08459374206464 -87.49146515804317 -62.60000000000005
+ vertex 167.08459374206464 -87.49146515804317 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112911 0.3826834323650796 -1.6369160198769084e-16
+ outer loop
+ vertex 167.08459374206464 -87.49146515804317 -62.60000000000005
+ vertex 167.24443441807207 -87.1055756302072 617.3999999999999
+ vertex 167.24443441807207 -87.1055756302072 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087139 -0.7933533402912404 -2.242484713441204e-16
+ outer loop
+ vertex 166.83032394590802 -85.56009430814467 617.3999999999999
+ vertex 166.49895309600953 -85.30582451198806 -62.60000000000005
+ vertex 166.83032394590802 -85.56009430814467 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087139 -0.7933533402912404 -2.242484713441204e-16
+ outer loop
+ vertex 166.49895309600953 -85.30582451198806 -62.60000000000005
+ vertex 166.83032394590802 -85.56009430814467 617.3999999999999
+ vertex 166.49895309600953 -85.30582451198806 617.3999999999999
+ endloop
+endfacet
+facet normal 0.3826834323650796 0.9238795325112911 1.8829806831558214e-16
+ outer loop
+ vertex 164.89895309600956 -88.0771058040983 617.3999999999999
+ vertex 165.28484262384555 -88.2369464801057 -62.60000000000005
+ vertex 164.89895309600956 -88.0771058040983 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.3826834323650796 0.9238795325112911 1.8829806831558214e-16
+ outer loop
+ vertex 165.28484262384555 -88.2369464801057 -62.60000000000005
+ vertex 164.89895309600956 -88.0771058040983 617.3999999999999
+ vertex 165.28484262384555 -88.2369464801057 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112876 0.38268343236508756 2.488942827790612e-16
+ outer loop
+ vertex 164.15347177394705 -87.10557563020723 617.3999999999999
+ vertex 164.31331244995442 -87.49146515804318 -62.60000000000005
+ vertex 164.15347177394705 -87.10557563020723 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112876 0.38268343236508756 2.488942827790612e-16
+ outer loop
+ vertex 164.31331244995442 -87.49146515804318 -62.60000000000005
+ vertex 164.15347177394705 -87.10557563020723 617.3999999999999
+ vertex 164.31331244995442 -87.49146515804318 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290086873 -0.7933533402912608 -2.2424847134411675e-16
+ outer loop
+ vertex 180.34032024494527 -93.36009430814468 617.3999999999999
+ vertex 180.00894939504678 -93.10582451198808 -62.60000000000005
+ vertex 180.34032024494527 -93.36009430814468 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290086873 -0.7933533402912608 -2.2424847134411675e-16
+ outer loop
+ vertex 180.00894939504678 -93.10582451198808 -62.60000000000005
+ vertex 180.34032024494527 -93.36009430814468 617.3999999999999
+ vertex 180.00894939504678 -93.10582451198808 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738074 -0.13052619222007578 -2.3591011986530373e-16
+ outer loop
+ vertex 167.24443441807207 -86.27735468587913 617.3999999999999
+ vertex 167.29895309600957 -86.69146515804317 -62.60000000000005
+ vertex 167.29895309600957 -86.69146515804317 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738074 -0.13052619222007578 -2.3591011986530373e-16
+ outer loop
+ vertex 167.29895309600957 -86.69146515804317 -62.60000000000005
+ vertex 167.24443441807207 -86.27735468587913 617.3999999999999
+ vertex 167.24443441807207 -86.27735468587913 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912617 0.6087614290086859 -1.093788196704607e-16
+ outer loop
+ vertex 167.08459374206464 -87.49146515804317 617.3999999999999
+ vertex 166.83032394590805 -87.82283600794165 -62.60000000000005
+ vertex 166.83032394590805 -87.82283600794165 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912617 0.6087614290086859 -1.093788196704607e-16
+ outer loop
+ vertex 166.83032394590805 -87.82283600794165 -62.60000000000005
+ vertex 167.08459374206464 -87.49146515804317 617.3999999999999
+ vertex 167.08459374206464 -87.49146515804317 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.3826834323650796 -0.9238795325112911 -1.8829806831558214e-16
+ outer loop
+ vertex 166.49895309600953 -85.30582451198806 617.3999999999999
+ vertex 166.11306356817357 -85.14598383598066 -62.60000000000005
+ vertex 166.49895309600953 -85.30582451198806 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.3826834323650796 -0.9238795325112911 -1.8829806831558214e-16
+ outer loop
+ vertex 166.11306356817357 -85.14598383598066 -62.60000000000005
+ vertex 166.49895309600953 -85.30582451198806 617.3999999999999
+ vertex 166.11306356817357 -85.14598383598066 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087593 0.7933533402912054 -4.7612051549729734e-17
+ outer loop
+ vertex 180.3403202449453 -95.62283600794163 617.3999999999999
+ vertex 180.00894939504684 -95.87710580409829 -62.60000000000005
+ vertex 180.00894939504684 -95.87710580409829 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087593 0.7933533402912054 -4.7612051549729734e-17
+ outer loop
+ vertex 180.00894939504684 -95.87710580409829 -62.60000000000005
+ vertex 180.3403202449453 -95.62283600794163 617.3999999999999
+ vertex 180.3403202449453 -95.62283600794163 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112876 -0.38268343236508756 -2.488942827790612e-16
+ outer loop
+ vertex 167.24443441807207 -86.27735468587913 617.3999999999999
+ vertex 167.08459374206464 -85.89146515804318 -62.60000000000005
+ vertex 167.24443441807207 -86.27735468587913 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112876 -0.38268343236508756 -2.488942827790612e-16
+ outer loop
+ vertex 167.08459374206464 -85.89146515804318 -62.60000000000005
+ vertex 167.24443441807207 -86.27735468587913 617.3999999999999
+ vertex 167.08459374206464 -85.89146515804318 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112816 -0.3826834323651024 -2.4889428277906147e-16
+ outer loop
+ vertex 180.7544307171093 -94.07735468587913 617.3999999999999
+ vertex 180.5945900411019 -93.69146515804317 -62.60000000000005
+ vertex 180.7544307171093 -94.07735468587913 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112816 -0.3826834323651024 -2.4889428277906147e-16
+ outer loop
+ vertex 180.5945900411019 -93.69146515804317 -62.60000000000005
+ vertex 180.7544307171093 -94.07735468587913 617.3999999999999
+ vertex 180.5945900411019 -93.69146515804317 617.3999999999999
+ endloop
+endfacet
+facet normal 0.3826834323650796 0.9238795325112911 1.8829806831558214e-16
+ outer loop
+ vertex 178.40894939504682 -95.87710580409828 617.3999999999999
+ vertex 178.79483892288278 -96.03694648010568 -62.60000000000005
+ vertex 178.40894939504682 -95.87710580409828 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.3826834323650796 0.9238795325112911 1.8829806831558214e-16
+ outer loop
+ vertex 178.79483892288278 -96.03694648010568 -62.60000000000005
+ vertex 178.40894939504682 -95.87710580409828 617.3999999999999
+ vertex 178.79483892288278 -96.03694648010568 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738132 0.1305261922200305 -2.0684907214263111e-16
+ outer loop
+ vertex 180.8089493950468 -94.49146515804317 617.3999999999999
+ vertex 180.7544307171093 -94.9055756302072 -62.60000000000005
+ vertex 180.7544307171093 -94.9055756302072 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738132 0.1305261922200305 -2.0684907214263111e-16
+ outer loop
+ vertex 180.7544307171093 -94.9055756302072 -62.60000000000005
+ vertex 180.8089493950468 -94.49146515804317 617.3999999999999
+ vertex 180.8089493950468 -94.49146515804317 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912486 -0.6087614290087032 -2.4491671163867876e-16
+ outer loop
+ vertex 180.5945900411019 -93.69146515804317 617.3999999999999
+ vertex 180.34032024494527 -93.36009430814468 -62.60000000000005
+ vertex 180.5945900411019 -93.69146515804317 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912486 -0.6087614290087032 -2.4491671163867876e-16
+ outer loop
+ vertex 180.34032024494527 -93.36009430814468 -62.60000000000005
+ vertex 180.5945900411019 -93.69146515804317 617.3999999999999
+ vertex 180.34032024494527 -93.36009430814468 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738064 0.13052619222008258 -2.068490721426238e-16
+ outer loop
+ vertex 167.29895309600957 -86.69146515804317 617.3999999999999
+ vertex 167.24443441807207 -87.1055756302072 -62.60000000000005
+ vertex 167.24443441807207 -87.1055756302072 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738064 0.13052619222008258 -2.068490721426238e-16
+ outer loop
+ vertex 167.24443441807207 -87.1055756302072 -62.60000000000005
+ vertex 167.29895309600957 -86.69146515804317 617.3999999999999
+ vertex 167.29895309600957 -86.69146515804317 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.38268343236511393 0.9238795325112767 1.739939920148661e-17
+ outer loop
+ vertex 166.49895309600956 -88.07710580409828 617.3999999999999
+ vertex 166.1130635681736 -88.23694648010569 -62.60000000000005
+ vertex 166.1130635681736 -88.23694648010569 617.3999999999999
+ endloop
+endfacet
+facet normal -0.38268343236511393 0.9238795325112767 1.739939920148661e-17
+ outer loop
+ vertex 166.1130635681736 -88.23694648010569 -62.60000000000005
+ vertex 166.49895309600956 -88.07710580409828 617.3999999999999
+ vertex 166.49895309600956 -88.07710580409828 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.3826834323650796 -0.9238795325112911 -1.8829806831558214e-16
+ outer loop
+ vertex 180.00894939504678 -93.10582451198808 617.3999999999999
+ vertex 179.62305986721083 -92.94598383598067 -62.60000000000005
+ vertex 180.00894939504678 -93.10582451198808 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.3826834323650796 -0.9238795325112911 -1.8829806831558214e-16
+ outer loop
+ vertex 179.62305986721083 -92.94598383598067 -62.60000000000005
+ vertex 180.00894939504678 -93.10582451198808 617.3999999999999
+ vertex 179.62305986721083 -92.94598383598067 617.3999999999999
+ endloop
+endfacet
+facet normal -0.3826834323651025 0.9238795325112814 1.739939920148968e-17
+ outer loop
+ vertex 180.00894939504684 -95.87710580409829 617.3999999999999
+ vertex 179.62305986721086 -96.0369464801057 -62.60000000000005
+ vertex 179.62305986721086 -96.0369464801057 617.3999999999999
+ endloop
+endfacet
+facet normal -0.3826834323651025 0.9238795325112814 1.739939920148968e-17
+ outer loop
+ vertex 179.62305986721086 -96.0369464801057 -62.60000000000005
+ vertex 180.00894939504684 -95.87710580409829 617.3999999999999
+ vertex 180.00894939504684 -95.87710580409829 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222007983 0.9914448613738067 1.3951546310861622e-16
+ outer loop
+ vertex 178.79483892288278 -96.03694648010568 617.3999999999999
+ vertex 179.2089493950468 -96.09146515804319 -62.60000000000005
+ vertex 178.79483892288278 -96.03694648010568 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222007983 0.9914448613738067 1.3951546310861622e-16
+ outer loop
+ vertex 179.2089493950468 -96.09146515804319 -62.60000000000005
+ vertex 178.79483892288278 -96.03694648010568 617.3999999999999
+ vertex 179.2089493950468 -96.09146515804319 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087137 0.7933533402912407 2.242484713441203e-16
+ outer loop
+ vertex 164.56758224611107 -87.82283600794166 617.3999999999999
+ vertex 164.89895309600956 -88.0771058040983 -62.60000000000005
+ vertex 164.56758224611107 -87.82283600794166 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.6087614290087137 0.7933533402912407 2.242484713441203e-16
+ outer loop
+ vertex 164.89895309600956 -88.0771058040983 -62.60000000000005
+ vertex 164.56758224611107 -87.82283600794166 617.3999999999999
+ vertex 164.89895309600956 -88.0771058040983 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222004275 0.9914448613738117 1.3951546310860853e-16
+ outer loop
+ vertex 165.28484262384555 -88.2369464801057 617.3999999999999
+ vertex 165.69895309600957 -88.2914651580432 -62.60000000000005
+ vertex 165.28484262384555 -88.2369464801057 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222004275 0.9914448613738117 1.3951546310860853e-16
+ outer loop
+ vertex 165.69895309600957 -88.2914651580432 -62.60000000000005
+ vertex 165.28484262384555 -88.2369464801057 617.3999999999999
+ vertex 165.69895309600957 -88.2914651580432 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912207 -0.6087614290087394 -2.4491671163867655e-16
+ outer loop
+ vertex 167.08459374206464 -85.89146515804318 617.3999999999999
+ vertex 166.83032394590802 -85.56009430814467 -62.60000000000005
+ vertex 167.08459374206464 -85.89146515804318 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912207 -0.6087614290087394 -2.4491671163867655e-16
+ outer loop
+ vertex 166.83032394590802 -85.56009430814467 -62.60000000000005
+ vertex 167.08459374206464 -85.89146515804318 617.3999999999999
+ vertex 166.83032394590802 -85.56009430814467 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912282 0.6087614290087299 -1.093788196704483e-16
+ outer loop
+ vertex 180.59459004110192 -95.29146515804317 617.3999999999999
+ vertex 180.3403202449453 -95.62283600794163 -62.60000000000005
+ vertex 180.3403202449453 -95.62283600794163 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912282 0.6087614290087299 -1.093788196704483e-16
+ outer loop
+ vertex 180.3403202449453 -95.62283600794163 -62.60000000000005
+ vertex 180.59459004110192 -95.29146515804317 617.3999999999999
+ vertex 180.59459004110192 -95.29146515804317 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112911 0.3826834323650796 -1.6369160198769084e-16
+ outer loop
+ vertex 180.7544307171093 -94.9055756302072 617.3999999999999
+ vertex 180.59459004110192 -95.29146515804317 -62.60000000000005
+ vertex 180.59459004110192 -95.29146515804317 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112911 0.3826834323650796 -1.6369160198769084e-16
+ outer loop
+ vertex 180.59459004110192 -95.29146515804317 -62.60000000000005
+ vertex 180.7544307171093 -94.9055756302072 617.3999999999999
+ vertex 180.7544307171093 -94.9055756302072 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912296 0.608761429008728 2.449167116386773e-16
+ outer loop
+ vertex 164.31331244995442 -87.49146515804318 617.3999999999999
+ vertex 164.56758224611107 -87.82283600794166 -62.60000000000005
+ vertex 164.31331244995442 -87.49146515804318 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912296 0.608761429008728 2.449167116386773e-16
+ outer loop
+ vertex 164.56758224611107 -87.82283600794166 -62.60000000000005
+ vertex 164.31331244995442 -87.49146515804318 617.3999999999999
+ vertex 164.56758224611107 -87.82283600794166 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738078 0.1305261922200717 2.3591011986530333e-16
+ outer loop
+ vertex 164.09895309600955 -86.69146515804319 -62.60000000000005
+ vertex 164.15347177394705 -87.10557563020723 617.3999999999999
+ vertex 164.15347177394705 -87.10557563020723 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738078 0.1305261922200717 2.3591011986530333e-16
+ outer loop
+ vertex 164.15347177394705 -87.10557563020723 617.3999999999999
+ vertex 164.09895309600955 -86.69146515804319 -62.60000000000005
+ vertex 164.09895309600955 -86.69146515804319 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738068 -0.13052619222007983 -2.35910119865304e-16
+ outer loop
+ vertex 180.7544307171093 -94.07735468587913 617.3999999999999
+ vertex 180.8089493950468 -94.49146515804317 -62.60000000000005
+ vertex 180.8089493950468 -94.49146515804317 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738068 -0.13052619222007983 -2.35910119865304e-16
+ outer loop
+ vertex 180.8089493950468 -94.49146515804317 -62.60000000000005
+ vertex 180.7544307171093 -94.07735468587913 617.3999999999999
+ vertex 180.7544307171093 -94.07735468587913 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222004275 -0.9914448613738117 -1.3951546310860853e-16
+ outer loop
+ vertex 166.11306356817357 -85.14598383598066 617.3999999999999
+ vertex 165.69895309600955 -85.09146515804318 -62.60000000000005
+ vertex 166.11306356817357 -85.14598383598066 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222004275 -0.9914448613738117 -1.3951546310860853e-16
+ outer loop
+ vertex 165.69895309600955 -85.09146515804318 -62.60000000000005
+ vertex 166.11306356817357 -85.14598383598066 617.3999999999999
+ vertex 165.69895309600955 -85.09146515804318 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222007983 -0.9914448613738067 -1.3951546310861622e-16
+ outer loop
+ vertex 179.62305986721083 -92.94598383598067 617.3999999999999
+ vertex 179.2089493950468 -92.89146515804318 -62.60000000000005
+ vertex 179.62305986721083 -92.94598383598067 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222007983 -0.9914448613738067 -1.3951546310861622e-16
+ outer loop
+ vertex 179.2089493950468 -92.89146515804318 -62.60000000000005
+ vertex 179.62305986721083 -92.94598383598067 617.3999999999999
+ vertex 179.2089493950468 -92.89146515804318 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222004744 0.9914448613738109 8.122510965099001e-17
+ outer loop
+ vertex 179.2089493950468 -96.09146515804319 617.3999999999999
+ vertex 179.62305986721086 -96.0369464801057 -62.60000000000005
+ vertex 179.2089493950468 -96.09146515804319 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222004744 0.9914448613738109 8.122510965099001e-17
+ outer loop
+ vertex 179.62305986721086 -96.0369464801057 -62.60000000000005
+ vertex 179.2089493950468 -96.09146515804319 617.3999999999999
+ vertex 179.62305986721086 -96.0369464801057 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222006945 0.9914448613738082 8.12251096509848e-17
+ outer loop
+ vertex 165.69895309600957 -88.2914651580432 617.3999999999999
+ vertex 166.1130635681736 -88.23694648010569 -62.60000000000005
+ vertex 165.69895309600957 -88.2914651580432 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222006945 0.9914448613738082 8.12251096509848e-17
+ outer loop
+ vertex 166.1130635681736 -88.23694648010569 -62.60000000000005
+ vertex 165.69895309600957 -88.2914651580432 617.3999999999999
+ vertex 166.1130635681736 -88.23694648010569 617.3999999999999
+ endloop
+endfacet
+facet normal 0.3826834323650796 0.9238795325112911 1.8829806831558214e-16
+ outer loop
+ vertex 170.60894939504684 -109.38710210313555 617.3999999999999
+ vertex 170.9948389228828 -109.54694277914295 -62.60000000000005
+ vertex 170.60894939504684 -109.38710210313555 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.3826834323650796 0.9238795325112911 1.8829806831558214e-16
+ outer loop
+ vertex 170.9948389228828 -109.54694277914295 -62.60000000000005
+ vertex 170.60894939504684 -109.38710210313555 617.3999999999999
+ vertex 170.9948389228828 -109.54694277914295 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738078 -0.1305261922200717 -2.3591011986530333e-16
+ outer loop
+ vertex 172.95443071710932 -107.58735098491637 617.3999999999999
+ vertex 173.0089493950468 -108.00146145708042 -62.60000000000005
+ vertex 173.0089493950468 -108.00146145708042 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738078 -0.1305261922200717 -2.3591011986530333e-16
+ outer loop
+ vertex 173.0089493950468 -108.00146145708042 -62.60000000000005
+ vertex 172.95443071710932 -107.58735098491637 617.3999999999999
+ vertex 172.95443071710932 -107.58735098491637 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738132 -0.1305261922200305 2.0684907214263111e-16
+ outer loop
+ vertex 177.6634680729843 -94.07735468587917 -62.60000000000005
+ vertex 177.60894939504678 -94.4914651580432 617.3999999999999
+ vertex 177.60894939504678 -94.4914651580432 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738132 -0.1305261922200305 2.0684907214263111e-16
+ outer loop
+ vertex 177.60894939504678 -94.4914651580432 617.3999999999999
+ vertex 177.6634680729843 -94.07735468587917 -62.60000000000005
+ vertex 177.6634680729843 -94.07735468587917 617.3999999999999
+ endloop
+endfacet
+facet normal 0.3826834323651145 -0.9238795325112765 -1.739939920148649e-17
+ outer loop
+ vertex 170.99483892288274 -106.45598013501792 -62.60000000000005
+ vertex 170.6089493950468 -106.61582081102533 617.3999999999999
+ vertex 170.6089493950468 -106.61582081102533 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.3826834323651145 -0.9238795325112765 -1.739939920148649e-17
+ outer loop
+ vertex 170.6089493950468 -106.61582081102533 617.3999999999999
+ vertex 170.99483892288274 -106.45598013501792 -62.60000000000005
+ vertex 170.99483892288274 -106.45598013501792 617.3999999999999
+ endloop
+endfacet
+facet normal 0.38268343236506297 -0.9238795325112978 -1.7399399201500355e-17
+ outer loop
+ vertex 178.79483892288275 -92.94598383598067 -62.60000000000005
+ vertex 178.4089493950468 -93.10582451198808 617.3999999999999
+ vertex 178.4089493950468 -93.10582451198808 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.38268343236506297 -0.9238795325112978 -1.7399399201500355e-17
+ outer loop
+ vertex 178.4089493950468 -93.10582451198808 617.3999999999999
+ vertex 178.79483892288275 -92.94598383598067 -62.60000000000005
+ vertex 178.79483892288275 -92.94598383598067 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112816 0.3826834323651024 2.4889428277906147e-16
+ outer loop
+ vertex 177.6634680729843 -94.90557563020724 617.3999999999999
+ vertex 177.8233087489917 -95.2914651580432 -62.60000000000005
+ vertex 177.6634680729843 -94.90557563020724 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112816 0.3826834323651024 2.4889428277906147e-16
+ outer loop
+ vertex 177.8233087489917 -95.2914651580432 -62.60000000000005
+ vertex 177.6634680729843 -94.90557563020724 617.3999999999999
+ vertex 177.8233087489917 -95.2914651580432 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087054 0.7933533402912468 -4.761205154971309e-17
+ outer loop
+ vertex 172.5403202449453 -109.1328323069789 617.3999999999999
+ vertex 172.20894939504683 -109.38710210313553 -62.60000000000005
+ vertex 172.20894939504683 -109.38710210313553 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087054 0.7933533402912468 -4.761205154971309e-17
+ outer loop
+ vertex 172.20894939504683 -109.38710210313553 -62.60000000000005
+ vertex 172.5403202449453 -109.1328323069789 617.3999999999999
+ vertex 172.5403202449453 -109.1328323069789 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222006945 0.9914448613738082 8.12251096509848e-17
+ outer loop
+ vertex 171.40894939504682 -109.60146145708045 617.3999999999999
+ vertex 171.82305986721084 -109.54694277914295 -62.60000000000005
+ vertex 171.40894939504682 -109.60146145708045 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222006945 0.9914448613738082 8.12251096509848e-17
+ outer loop
+ vertex 171.82305986721084 -109.54694277914295 -62.60000000000005
+ vertex 171.40894939504682 -109.60146145708045 617.3999999999999
+ vertex 171.82305986721084 -109.54694277914295 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738067 0.13052619222007997 -2.0684907214262419e-16
+ outer loop
+ vertex 173.0089493950468 -108.00146145708042 617.3999999999999
+ vertex 172.95443071710932 -108.41557192924445 -62.60000000000005
+ vertex 172.95443071710932 -108.41557192924445 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738067 0.13052619222007997 -2.0684907214262419e-16
+ outer loop
+ vertex 172.95443071710932 -108.41557192924445 -62.60000000000005
+ vertex 173.0089493950468 -108.00146145708042 617.3999999999999
+ vertex 173.0089493950468 -108.00146145708042 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912325 -0.6087614290087242 1.0937881967044986e-16
+ outer loop
+ vertex 178.07757854514833 -93.36009430814471 -62.60000000000005
+ vertex 177.82330874899168 -93.6914651580432 617.3999999999999
+ vertex 177.82330874899168 -93.6914651580432 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912325 -0.6087614290087242 1.0937881967044986e-16
+ outer loop
+ vertex 177.82330874899168 -93.6914651580432 617.3999999999999
+ vertex 178.07757854514833 -93.36009430814471 -62.60000000000005
+ vertex 178.07757854514833 -93.36009430814471 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112876 -0.38268343236508756 -2.488942827790612e-16
+ outer loop
+ vertex 172.95443071710932 -107.58735098491637 617.3999999999999
+ vertex 172.7945900411019 -107.20146145708043 -62.60000000000005
+ vertex 172.95443071710932 -107.58735098491637 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112876 -0.38268343236508756 -2.488942827790612e-16
+ outer loop
+ vertex 172.7945900411019 -107.20146145708043 -62.60000000000005
+ vertex 172.95443071710932 -107.58735098491637 617.3999999999999
+ vertex 172.7945900411019 -107.20146145708043 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912296 -0.608761429008728 -2.449167116386773e-16
+ outer loop
+ vertex 172.7945900411019 -107.20146145708043 617.3999999999999
+ vertex 172.5403202449453 -106.87009060718195 -62.60000000000005
+ vertex 172.7945900411019 -107.20146145708043 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912296 -0.608761429008728 -2.449167116386773e-16
+ outer loop
+ vertex 172.5403202449453 -106.87009060718195 -62.60000000000005
+ vertex 172.7945900411019 -107.20146145708043 617.3999999999999
+ vertex 172.5403202449453 -106.87009060718195 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087137 -0.7933533402912407 -2.242484713441203e-16
+ outer loop
+ vertex 172.5403202449453 -106.87009060718195 617.3999999999999
+ vertex 172.2089493950468 -106.61582081102532 -62.60000000000005
+ vertex 172.5403202449453 -106.87009060718195 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087137 -0.7933533402912407 -2.242484713441203e-16
+ outer loop
+ vertex 172.2089493950468 -106.61582081102532 -62.60000000000005
+ vertex 172.5403202449453 -106.87009060718195 617.3999999999999
+ vertex 172.2089493950468 -106.61582081102532 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222008005 -0.9914448613738067 -8.122510965098226e-17
+ outer loop
+ vertex 179.2089493950468 -92.89146515804318 617.3999999999999
+ vertex 178.79483892288275 -92.94598383598067 -62.60000000000005
+ vertex 179.2089493950468 -92.89146515804318 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222008005 -0.9914448613738067 -8.122510965098226e-17
+ outer loop
+ vertex 178.79483892288275 -92.94598383598067 -62.60000000000005
+ vertex 179.2089493950468 -92.89146515804318 617.3999999999999
+ vertex 178.79483892288275 -92.94598383598067 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290086873 0.7933533402912608 2.2424847134411675e-16
+ outer loop
+ vertex 178.07757854514833 -95.62283600794169 617.3999999999999
+ vertex 178.40894939504682 -95.87710580409828 -62.60000000000005
+ vertex 178.07757854514833 -95.62283600794169 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.6087614290086873 0.7933533402912608 2.2424847134411675e-16
+ outer loop
+ vertex 178.40894939504682 -95.87710580409828 -62.60000000000005
+ vertex 178.07757854514833 -95.62283600794169 617.3999999999999
+ vertex 178.40894939504682 -95.87710580409828 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738064 -0.13052619222008258 2.068490721426238e-16
+ outer loop
+ vertex 169.8634680729843 -107.58735098491641 -62.60000000000005
+ vertex 169.8089493950468 -108.00146145708044 617.3999999999999
+ vertex 169.8089493950468 -108.00146145708044 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738064 -0.13052619222008258 2.068490721426238e-16
+ outer loop
+ vertex 169.8089493950468 -108.00146145708044 617.3999999999999
+ vertex 169.8634680729843 -107.58735098491641 -62.60000000000005
+ vertex 169.8634680729843 -107.58735098491641 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112876 0.38268343236508756 2.488942827790612e-16
+ outer loop
+ vertex 169.8634680729843 -108.41557192924448 617.3999999999999
+ vertex 170.0233087489917 -108.80146145708044 -62.60000000000005
+ vertex 169.8634680729843 -108.41557192924448 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112876 0.38268343236508756 2.488942827790612e-16
+ outer loop
+ vertex 170.0233087489917 -108.80146145708044 -62.60000000000005
+ vertex 169.8634680729843 -108.41557192924448 617.3999999999999
+ vertex 170.0233087489917 -108.80146145708044 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112906 0.3826834323650804 -1.6369160198769062e-16
+ outer loop
+ vertex 172.95443071710932 -108.41557192924445 617.3999999999999
+ vertex 172.7945900411019 -108.80146145708042 -62.60000000000005
+ vertex 172.7945900411019 -108.80146145708042 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112906 0.3826834323650804 -1.6369160198769062e-16
+ outer loop
+ vertex 172.7945900411019 -108.80146145708042 -62.60000000000005
+ vertex 172.95443071710932 -108.41557192924445 617.3999999999999
+ vertex 172.95443071710932 -108.41557192924445 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222006945 -0.9914448613738082 -8.12251096509848e-17
+ outer loop
+ vertex 171.4089493950468 -106.40146145708043 617.3999999999999
+ vertex 170.99483892288274 -106.45598013501792 -62.60000000000005
+ vertex 171.4089493950468 -106.40146145708043 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222006945 -0.9914448613738082 -8.12251096509848e-17
+ outer loop
+ vertex 170.99483892288274 -106.45598013501792 -62.60000000000005
+ vertex 171.4089493950468 -106.40146145708043 617.3999999999999
+ vertex 170.99483892288274 -106.45598013501792 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738074 0.13052619222007578 2.3591011986530373e-16
+ outer loop
+ vertex 169.8089493950468 -108.00146145708044 -62.60000000000005
+ vertex 169.8634680729843 -108.41557192924448 617.3999999999999
+ vertex 169.8634680729843 -108.41557192924448 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738074 0.13052619222007578 2.3591011986530373e-16
+ outer loop
+ vertex 169.8634680729843 -108.41557192924448 617.3999999999999
+ vertex 169.8089493950468 -108.00146145708044 -62.60000000000005
+ vertex 169.8089493950468 -108.00146145708044 617.3999999999999
+ endloop
+endfacet
+facet normal 0.608761429008743 -0.7933533402912181 4.761205154972467e-17
+ outer loop
+ vertex 178.4089493950468 -93.10582451198808 -62.60000000000005
+ vertex 178.07757854514833 -93.36009430814471 617.3999999999999
+ vertex 178.07757854514833 -93.36009430814471 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.608761429008743 -0.7933533402912181 4.761205154972467e-17
+ outer loop
+ vertex 178.07757854514833 -93.36009430814471 617.3999999999999
+ vertex 178.4089493950468 -93.10582451198808 -62.60000000000005
+ vertex 178.4089493950468 -93.10582451198808 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738068 0.13052619222007983 2.35910119865304e-16
+ outer loop
+ vertex 177.60894939504678 -94.4914651580432 -62.60000000000005
+ vertex 177.6634680729843 -94.90557563020724 617.3999999999999
+ vertex 177.6634680729843 -94.90557563020724 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738068 0.13052619222007983 2.35910119865304e-16
+ outer loop
+ vertex 177.6634680729843 -94.90557563020724 617.3999999999999
+ vertex 177.60894939504678 -94.4914651580432 -62.60000000000005
+ vertex 177.60894939504678 -94.4914651580432 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222004275 0.9914448613738117 1.3951546310860853e-16
+ outer loop
+ vertex 170.9948389228828 -109.54694277914295 617.3999999999999
+ vertex 171.40894939504682 -109.60146145708045 -62.60000000000005
+ vertex 170.9948389228828 -109.54694277914295 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222004275 0.9914448613738117 1.3951546310860853e-16
+ outer loop
+ vertex 171.40894939504682 -109.60146145708045 -62.60000000000005
+ vertex 170.9948389228828 -109.54694277914295 617.3999999999999
+ vertex 171.40894939504682 -109.60146145708045 617.3999999999999
+ endloop
+endfacet
+facet normal -0.3826834323650796 -0.9238795325112911 -1.8829806831558214e-16
+ outer loop
+ vertex 172.2089493950468 -106.61582081102532 617.3999999999999
+ vertex 171.82305986721084 -106.4559801350179 -62.60000000000005
+ vertex 172.2089493950468 -106.61582081102532 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.3826834323650796 -0.9238795325112911 -1.8829806831558214e-16
+ outer loop
+ vertex 171.82305986721084 -106.4559801350179 -62.60000000000005
+ vertex 172.2089493950468 -106.61582081102532 617.3999999999999
+ vertex 171.82305986721084 -106.4559801350179 617.3999999999999
+ endloop
+endfacet
+facet normal -0.38268343236511393 0.9238795325112767 1.739939920148661e-17
+ outer loop
+ vertex 172.20894939504683 -109.38710210313553 617.3999999999999
+ vertex 171.82305986721084 -109.54694277914295 -62.60000000000005
+ vertex 171.82305986721084 -109.54694277914295 617.3999999999999
+ endloop
+endfacet
+facet normal -0.38268343236511393 0.9238795325112767 1.739939920148661e-17
+ outer loop
+ vertex 171.82305986721084 -109.54694277914295 -62.60000000000005
+ vertex 172.20894939504683 -109.38710210313553 617.3999999999999
+ vertex 172.20894939504683 -109.38710210313553 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112911 -0.3826834323650796 1.6369160198769084e-16
+ outer loop
+ vertex 170.0233087489917 -107.20146145708044 -62.60000000000005
+ vertex 169.8634680729843 -107.58735098491641 617.3999999999999
+ vertex 169.8634680729843 -107.58735098491641 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112911 -0.3826834323650796 1.6369160198769084e-16
+ outer loop
+ vertex 169.8634680729843 -107.58735098491641 617.3999999999999
+ vertex 170.0233087489917 -107.20146145708044 -62.60000000000005
+ vertex 170.0233087489917 -107.20146145708044 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087133 0.7933533402912409 2.242484713441203e-16
+ outer loop
+ vertex 170.27757854514834 -109.13283230697894 617.3999999999999
+ vertex 170.60894939504684 -109.38710210313555 -62.60000000000005
+ vertex 170.27757854514834 -109.13283230697894 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.6087614290087133 0.7933533402912409 2.242484713441203e-16
+ outer loop
+ vertex 170.60894939504684 -109.38710210313555 -62.60000000000005
+ vertex 170.27757854514834 -109.13283230697894 617.3999999999999
+ vertex 170.60894939504684 -109.38710210313555 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912486 0.6087614290087032 2.4491671163867876e-16
+ outer loop
+ vertex 177.8233087489917 -95.2914651580432 617.3999999999999
+ vertex 178.07757854514833 -95.62283600794169 -62.60000000000005
+ vertex 177.8233087489917 -95.2914651580432 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912486 0.6087614290087032 2.4491671163867876e-16
+ outer loop
+ vertex 178.07757854514833 -95.62283600794169 -62.60000000000005
+ vertex 177.8233087489917 -95.2914651580432 617.3999999999999
+ vertex 178.07757854514833 -95.62283600794169 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912613 0.6087614290086866 -1.093788196704605e-16
+ outer loop
+ vertex 172.7945900411019 -108.80146145708042 617.3999999999999
+ vertex 172.5403202449453 -109.1328323069789 -62.60000000000005
+ vertex 172.5403202449453 -109.1328323069789 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912613 0.6087614290086866 -1.093788196704605e-16
+ outer loop
+ vertex 172.5403202449453 -109.1328323069789 -62.60000000000005
+ vertex 172.7945900411019 -108.80146145708042 617.3999999999999
+ vertex 172.7945900411019 -108.80146145708042 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912207 0.6087614290087394 2.4491671163867655e-16
+ outer loop
+ vertex 170.0233087489917 -108.80146145708044 617.3999999999999
+ vertex 170.27757854514834 -109.13283230697894 -62.60000000000005
+ vertex 170.0233087489917 -108.80146145708044 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912207 0.6087614290087394 2.4491671163867655e-16
+ outer loop
+ vertex 170.27757854514834 -109.13283230697894 -62.60000000000005
+ vertex 170.0233087489917 -108.80146145708044 617.3999999999999
+ vertex 170.27757854514834 -109.13283230697894 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222004275 -0.9914448613738117 -1.3951546310860853e-16
+ outer loop
+ vertex 171.82305986721084 -106.4559801350179 617.3999999999999
+ vertex 171.4089493950468 -106.40146145708043 -62.60000000000005
+ vertex 171.82305986721084 -106.4559801350179 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222004275 -0.9914448613738117 -1.3951546310860853e-16
+ outer loop
+ vertex 171.4089493950468 -106.40146145708043 -62.60000000000005
+ vertex 171.82305986721084 -106.4559801350179 617.3999999999999
+ vertex 171.4089493950468 -106.40146145708043 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112911 -0.3826834323650796 1.6369160198769084e-16
+ outer loop
+ vertex 177.82330874899168 -93.6914651580432 -62.60000000000005
+ vertex 177.6634680729843 -94.07735468587917 617.3999999999999
+ vertex 177.6634680729843 -94.07735468587917 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112911 -0.3826834323650796 1.6369160198769084e-16
+ outer loop
+ vertex 177.6634680729843 -94.07735468587917 617.3999999999999
+ vertex 177.82330874899168 -93.6914651580432 -62.60000000000005
+ vertex 177.82330874899168 -93.6914651580432 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912486 -0.6087614290087032 -2.4491671163867876e-16
+ outer loop
+ vertex 159.28459374206466 -99.40146145708044 617.3999999999999
+ vertex 159.03032394590804 -99.07009060718195 -62.60000000000005
+ vertex 159.28459374206466 -99.40146145708044 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912486 -0.6087614290087032 -2.4491671163867876e-16
+ outer loop
+ vertex 159.03032394590804 -99.07009060718195 -62.60000000000005
+ vertex 159.28459374206466 -99.40146145708044 617.3999999999999
+ vertex 159.03032394590804 -99.07009060718195 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290086873 -0.7933533402912608 -2.2424847134411675e-16
+ outer loop
+ vertex 159.03032394590804 -99.07009060718195 617.3999999999999
+ vertex 158.69895309600955 -98.81582081102533 -62.60000000000005
+ vertex 159.03032394590804 -99.07009060718195 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290086873 -0.7933533402912608 -2.2424847134411675e-16
+ outer loop
+ vertex 158.69895309600955 -98.81582081102533 -62.60000000000005
+ vertex 159.03032394590804 -99.07009060718195 617.3999999999999
+ vertex 158.69895309600955 -98.81582081102533 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222007983 -0.9914448613738067 -1.3951546310861622e-16
+ outer loop
+ vertex 158.3130635681736 -98.65598013501793 617.3999999999999
+ vertex 157.89895309600956 -98.60146145708043 -62.60000000000005
+ vertex 158.3130635681736 -98.65598013501793 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222007983 -0.9914448613738067 -1.3951546310861622e-16
+ outer loop
+ vertex 157.89895309600956 -98.60146145708043 -62.60000000000005
+ vertex 158.3130635681736 -98.65598013501793 617.3999999999999
+ vertex 157.89895309600956 -98.60146145708043 617.3999999999999
+ endloop
+endfacet
+facet normal -0.3826834323650796 -0.9238795325112911 -1.8829806831558214e-16
+ outer loop
+ vertex 158.69895309600955 -98.81582081102533 617.3999999999999
+ vertex 158.3130635681736 -98.65598013501793 -62.60000000000005
+ vertex 158.69895309600955 -98.81582081102533 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.3826834323650796 -0.9238795325112911 -1.8829806831558214e-16
+ outer loop
+ vertex 158.3130635681736 -98.65598013501793 -62.60000000000005
+ vertex 158.69895309600955 -98.81582081102533 617.3999999999999
+ vertex 158.3130635681736 -98.65598013501793 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912617 -0.6087614290086859 1.093788196704607e-16
+ outer loop
+ vertex 170.27757854514832 -106.87009060718195 -62.60000000000005
+ vertex 170.0233087489917 -107.20146145708044 617.3999999999999
+ vertex 170.0233087489917 -107.20146145708044 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912617 -0.6087614290086859 1.093788196704607e-16
+ outer loop
+ vertex 170.0233087489917 -107.20146145708044 617.3999999999999
+ vertex 170.27757854514832 -106.87009060718195 -62.60000000000005
+ vertex 170.27757854514832 -106.87009060718195 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912282 -0.6087614290087299 1.093788196704483e-16
+ outer loop
+ vertex 156.7675822461111 -99.07009060718198 -62.60000000000005
+ vertex 156.51331244995444 -99.40146145708046 617.3999999999999
+ vertex 156.51331244995444 -99.40146145708046 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912282 -0.6087614290087299 1.093788196704483e-16
+ outer loop
+ vertex 156.51331244995444 -99.40146145708046 617.3999999999999
+ vertex 156.7675822461111 -99.07009060718198 -62.60000000000005
+ vertex 156.7675822461111 -99.07009060718198 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290086872 0.7933533402912609 2.2424847134411675e-16
+ outer loop
+ vertex 156.7675822461111 -101.33283230697894 617.3999999999999
+ vertex 157.09895309600958 -101.58710210313555 -62.60000000000005
+ vertex 156.7675822461111 -101.33283230697894 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.6087614290086872 0.7933533402912609 2.2424847134411675e-16
+ outer loop
+ vertex 157.09895309600958 -101.58710210313555 -62.60000000000005
+ vertex 156.7675822461111 -101.33283230697894 617.3999999999999
+ vertex 157.09895309600958 -101.58710210313555 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222008038 0.9914448613738067 8.122510965098218e-17
+ outer loop
+ vertex 157.8989530960096 -101.80146145708045 617.3999999999999
+ vertex 158.31306356817362 -101.74694277914296 -62.60000000000005
+ vertex 157.8989530960096 -101.80146145708045 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222008038 0.9914448613738067 8.122510965098218e-17
+ outer loop
+ vertex 158.31306356817362 -101.74694277914296 -62.60000000000005
+ vertex 157.8989530960096 -101.80146145708045 617.3999999999999
+ vertex 158.31306356817362 -101.74694277914296 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087593 -0.7933533402912054 4.7612051549729734e-17
+ outer loop
+ vertex 157.09895309600955 -98.81582081102533 -62.60000000000005
+ vertex 156.7675822461111 -99.07009060718198 617.3999999999999
+ vertex 156.7675822461111 -99.07009060718198 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.6087614290087593 -0.7933533402912054 4.7612051549729734e-17
+ outer loop
+ vertex 156.7675822461111 -99.07009060718198 617.3999999999999
+ vertex 157.09895309600955 -98.81582081102533 -62.60000000000005
+ vertex 157.09895309600955 -98.81582081102533 617.3999999999999
+ endloop
+endfacet
+facet normal -0.38268343236506297 0.9238795325112978 1.7399399201500355e-17
+ outer loop
+ vertex 158.69895309600957 -101.58710210313555 617.3999999999999
+ vertex 158.31306356817362 -101.74694277914296 -62.60000000000005
+ vertex 158.31306356817362 -101.74694277914296 617.3999999999999
+ endloop
+endfacet
+facet normal -0.38268343236506297 0.9238795325112978 1.7399399201500355e-17
+ outer loop
+ vertex 158.31306356817362 -101.74694277914296 -62.60000000000005
+ vertex 158.69895309600957 -101.58710210313555 617.3999999999999
+ vertex 158.69895309600957 -101.58710210313555 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738124 0.13052619222003736 2.3591011986530057e-16
+ outer loop
+ vertex 156.29895309600957 -100.20146145708047 -62.60000000000005
+ vertex 156.35347177394706 -100.6155719292445 617.3999999999999
+ vertex 156.35347177394706 -100.6155719292445 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738124 0.13052619222003736 2.3591011986530057e-16
+ outer loop
+ vertex 156.35347177394706 -100.6155719292445 617.3999999999999
+ vertex 156.29895309600957 -100.20146145708047 -62.60000000000005
+ vertex 156.29895309600957 -100.20146145708047 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912325 0.6087614290087242 -1.0937881967044986e-16
+ outer loop
+ vertex 159.2845937420647 -101.00146145708044 617.3999999999999
+ vertex 159.03032394590804 -101.33283230697893 -62.60000000000005
+ vertex 159.03032394590804 -101.33283230697893 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912325 0.6087614290087242 -1.0937881967044986e-16
+ outer loop
+ vertex 159.03032394590804 -101.33283230697893 -62.60000000000005
+ vertex 159.2845937420647 -101.00146145708044 617.3999999999999
+ vertex 159.2845937420647 -101.00146145708044 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738068 -0.13052619222007983 -2.35910119865304e-16
+ outer loop
+ vertex 159.4444344180721 -99.78735098491639 617.3999999999999
+ vertex 159.4989530960096 -100.20146145708043 -62.60000000000005
+ vertex 159.4989530960096 -100.20146145708043 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738068 -0.13052619222007983 -2.35910119865304e-16
+ outer loop
+ vertex 159.4989530960096 -100.20146145708043 -62.60000000000005
+ vertex 159.4444344180721 -99.78735098491639 617.3999999999999
+ vertex 159.4444344180721 -99.78735098491639 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112816 -0.3826834323651024 -2.4889428277906147e-16
+ outer loop
+ vertex 159.4444344180721 -99.78735098491639 617.3999999999999
+ vertex 159.28459374206466 -99.40146145708044 -62.60000000000005
+ vertex 159.4444344180721 -99.78735098491639 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112816 -0.3826834323651024 -2.4889428277906147e-16
+ outer loop
+ vertex 159.28459374206466 -99.40146145708044 -62.60000000000005
+ vertex 159.4444344180721 -99.78735098491639 617.3999999999999
+ vertex 159.28459374206466 -99.40146145708044 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112689 0.3826834323651328 2.48894282779062e-16
+ outer loop
+ vertex 156.35347177394706 -100.6155719292445 617.3999999999999
+ vertex 156.51331244995447 -101.00146145708045 -62.60000000000005
+ vertex 156.35347177394706 -100.6155719292445 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112689 0.3826834323651328 2.48894282779062e-16
+ outer loop
+ vertex 156.51331244995447 -101.00146145708045 -62.60000000000005
+ vertex 156.35347177394706 -100.6155719292445 617.3999999999999
+ vertex 156.51331244995447 -101.00146145708045 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738134 -0.13052619222003037 2.0684907214263116e-16
+ outer loop
+ vertex 156.35347177394706 -99.78735098491643 -62.60000000000005
+ vertex 156.29895309600957 -100.20146145708047 617.3999999999999
+ vertex 156.29895309600957 -100.20146145708047 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738134 -0.13052619222003037 2.0684907214263116e-16
+ outer loop
+ vertex 156.29895309600957 -100.20146145708047 617.3999999999999
+ vertex 156.35347177394706 -99.78735098491643 -62.60000000000005
+ vertex 156.35347177394706 -99.78735098491643 617.3999999999999
+ endloop
+endfacet
+facet normal 0.38268343236510355 -0.9238795325112811 -1.7399399201489422e-17
+ outer loop
+ vertex 157.4848426238455 -98.65598013501793 -62.60000000000005
+ vertex 157.09895309600955 -98.81582081102533 617.3999999999999
+ vertex 157.09895309600955 -98.81582081102533 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.38268343236510355 -0.9238795325112811 -1.7399399201489422e-17
+ outer loop
+ vertex 157.09895309600955 -98.81582081102533 617.3999999999999
+ vertex 157.4848426238455 -98.65598013501793 -62.60000000000005
+ vertex 157.4848426238455 -98.65598013501793 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912484 0.6087614290087034 2.449167116386787e-16
+ outer loop
+ vertex 156.51331244995447 -101.00146145708045 617.3999999999999
+ vertex 156.7675822461111 -101.33283230697894 -62.60000000000005
+ vertex 156.51331244995447 -101.00146145708045 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912484 0.6087614290087034 2.449167116386787e-16
+ outer loop
+ vertex 156.7675822461111 -101.33283230697894 -62.60000000000005
+ vertex 156.51331244995447 -101.00146145708045 617.3999999999999
+ vertex 156.7675822461111 -101.33283230697894 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222007983 0.9914448613738067 1.3951546310861622e-16
+ outer loop
+ vertex 157.48484262384554 -101.74694277914296 617.3999999999999
+ vertex 157.8989530960096 -101.80146145708045 -62.60000000000005
+ vertex 157.48484262384554 -101.74694277914296 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222007983 0.9914448613738067 1.3951546310861622e-16
+ outer loop
+ vertex 157.8989530960096 -101.80146145708045 -62.60000000000005
+ vertex 157.48484262384554 -101.74694277914296 617.3999999999999
+ vertex 157.8989530960096 -101.80146145708045 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087054 -0.7933533402912468 4.761205154971309e-17
+ outer loop
+ vertex 170.6089493950468 -106.61582081102533 -62.60000000000005
+ vertex 170.27757854514832 -106.87009060718195 617.3999999999999
+ vertex 170.27757854514832 -106.87009060718195 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.6087614290087054 -0.7933533402912468 4.761205154971309e-17
+ outer loop
+ vertex 170.27757854514832 -106.87009060718195 617.3999999999999
+ vertex 170.6089493950468 -106.61582081102533 -62.60000000000005
+ vertex 170.6089493950468 -106.61582081102533 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222004744 -0.9914448613738109 -8.122510965099001e-17
+ outer loop
+ vertex 157.89895309600956 -98.60146145708043 617.3999999999999
+ vertex 157.4848426238455 -98.65598013501793 -62.60000000000005
+ vertex 157.89895309600956 -98.60146145708043 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222004744 -0.9914448613738109 -8.122510965099001e-17
+ outer loop
+ vertex 157.4848426238455 -98.65598013501793 -62.60000000000005
+ vertex 157.89895309600956 -98.60146145708043 617.3999999999999
+ vertex 157.4848426238455 -98.65598013501793 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112911 -0.3826834323650796 1.6369160198769084e-16
+ outer loop
+ vertex 156.51331244995444 -99.40146145708046 -62.60000000000005
+ vertex 156.35347177394706 -99.78735098491643 617.3999999999999
+ vertex 156.35347177394706 -99.78735098491643 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112911 -0.3826834323650796 1.6369160198769084e-16
+ outer loop
+ vertex 156.35347177394706 -99.78735098491643 617.3999999999999
+ vertex 156.51331244995444 -99.40146145708046 -62.60000000000005
+ vertex 156.51331244995444 -99.40146145708046 617.3999999999999
+ endloop
+endfacet
+facet normal -0.608761429008743 0.7933533402912181 -4.761205154972467e-17
+ outer loop
+ vertex 159.03032394590804 -101.33283230697893 617.3999999999999
+ vertex 158.69895309600957 -101.58710210313555 -62.60000000000005
+ vertex 158.69895309600957 -101.58710210313555 617.3999999999999
+ endloop
+endfacet
+facet normal -0.608761429008743 0.7933533402912181 -4.761205154972467e-17
+ outer loop
+ vertex 158.69895309600957 -101.58710210313555 -62.60000000000005
+ vertex 159.03032394590804 -101.33283230697893 617.3999999999999
+ vertex 159.03032394590804 -101.33283230697893 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738132 0.1305261922200305 -2.0684907214263111e-16
+ outer loop
+ vertex 159.4989530960096 -100.20146145708043 617.3999999999999
+ vertex 159.4444344180721 -100.61557192924447 -62.60000000000005
+ vertex 159.4444344180721 -100.61557192924447 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738132 0.1305261922200305 -2.0684907214263111e-16
+ outer loop
+ vertex 159.4444344180721 -100.61557192924447 -62.60000000000005
+ vertex 159.4989530960096 -100.20146145708043 617.3999999999999
+ vertex 159.4989530960096 -100.20146145708043 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.38268343236507946 0.9238795325112912 1.8829806831558211e-16
+ outer loop
+ vertex 157.09895309600958 -101.58710210313555 617.3999999999999
+ vertex 157.48484262384554 -101.74694277914296 -62.60000000000005
+ vertex 157.09895309600958 -101.58710210313555 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.38268343236507946 0.9238795325112912 1.8829806831558211e-16
+ outer loop
+ vertex 157.48484262384554 -101.74694277914296 -62.60000000000005
+ vertex 157.09895309600958 -101.58710210313555 617.3999999999999
+ vertex 157.48484262384554 -101.74694277914296 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112911 0.3826834323650796 -1.6369160198769084e-16
+ outer loop
+ vertex 159.4444344180721 -100.61557192924447 617.3999999999999
+ vertex 159.2845937420647 -101.00146145708044 -62.60000000000005
+ vertex 159.2845937420647 -101.00146145708044 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112911 0.3826834323650796 -1.6369160198769084e-16
+ outer loop
+ vertex 159.2845937420647 -101.00146145708044 -62.60000000000005
+ vertex 159.4444344180721 -100.61557192924447 617.3999999999999
+ vertex 159.4444344180721 -100.61557192924447 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.3826834323650856 -0.9238795325112886 -1.8829806831558317e-16
+ outer loop
+ vertex 171.5893608344856 -110.60661776791083 617.3999999999999
+ vertex 171.34817987958812 -110.5067173454062 -62.60000000000005
+ vertex 171.5893608344856 -110.60661776791083 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.3826834323650856 -0.9238795325112886 -1.8829806831558317e-16
+ outer loop
+ vertex 171.34817987958812 -110.5067173454062 -62.60000000000005
+ vertex 171.5893608344856 -110.60661776791083 617.3999999999999
+ vertex 171.34817987958812 -110.5067173454062 617.3999999999999
+ endloop
+endfacet
+facet normal -0.4999999999999981 -0.8660254037844397 -2.0805319374395335e-16
+ outer loop
+ vertex 171.34817987958812 -110.5067173454062 -62.60000000000005
+ vertex 166.84484777990903 -107.90671734540621 617.3999999999999
+ vertex 166.84484777990903 -107.90671734540621 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.4999999999999981 -0.8660254037844397 -2.0805319374395335e-16
+ outer loop
+ vertex 166.84484777990903 -107.90671734540621 617.3999999999999
+ vertex 171.34817987958812 -110.5067173454062 -62.60000000000005
+ vertex 171.34817987958812 -110.5067173454062 617.3999999999999
+ endloop
+endfacet
+facet normal -0.5000000000000033 -0.8660254037844369 -2.080531937439542e-16
+ outer loop
+ vertex 167.04484777990902 -107.56030718389242 617.3999999999999
+ vertex 166.69843761839527 -107.36030718389243 -62.60000000000005
+ vertex 167.04484777990902 -107.56030718389242 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.5000000000000033 -0.8660254037844369 -2.080531937439542e-16
+ outer loop
+ vertex 166.69843761839527 -107.36030718389243 -62.60000000000005
+ vertex 167.04484777990902 -107.56030718389242 617.3999999999999
+ vertex 166.69843761839527 -107.36030718389243 617.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 -1.3771336778111663e-16
+ outer loop
+ vertex 170.3208507942464 -105.48610351731132 617.3999999999999
+ vertex 169.30369350672103 -107.2478716185942 -62.60000000000005
+ vertex 169.30369350672103 -107.2478716185942 617.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 -1.3771336778111663e-16
+ outer loop
+ vertex 169.30369350672103 -107.2478716185942 -62.60000000000005
+ vertex 170.3208507942464 -105.48610351731132 617.3999999999999
+ vertex 170.3208507942464 -105.48610351731132 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222006367 -0.9914448613738089 -1.3951546310861287e-16
+ outer loop
+ vertex 171.84817987958812 -110.64069194162177 617.3999999999999
+ vertex 171.5893608344856 -110.60661776791083 -62.60000000000005
+ vertex 171.84817987958812 -110.64069194162177 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.13052619222006367 -0.9914448613738089 -1.3951546310861287e-16
+ outer loop
+ vertex 171.5893608344856 -110.60661776791083 -62.60000000000005
+ vertex 171.84817987958812 -110.64069194162177 617.3999999999999
+ vertex 171.5893608344856 -110.60661776791083 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9659258262890691 -0.25881904510251824 -2.444938803619327e-16
+ outer loop
+ vertex 169.41834729097397 -102.11791458908962 617.3999999999999
+ vertex 170.3208507942464 -105.48610351731132 -62.60000000000005
+ vertex 170.3208507942464 -105.48610351731132 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9659258262890691 -0.25881904510251824 -2.444938803619327e-16
+ outer loop
+ vertex 170.3208507942464 -105.48610351731132 -62.60000000000005
+ vertex 169.41834729097397 -102.11791458908962 617.3999999999999
+ vertex 169.41834729097397 -102.11791458908962 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844304 0.5000000000000142 -1.3771336778111328e-16
+ outer loop
+ vertex 167.3984376183953 -106.14787161859421 617.3999999999999
+ vertex 166.69843761839527 -107.36030718389243 -62.60000000000005
+ vertex 166.69843761839527 -107.36030718389243 617.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844304 0.5000000000000142 -1.3771336778111328e-16
+ outer loop
+ vertex 166.69843761839527 -107.36030718389243 -62.60000000000005
+ vertex 167.3984376183953 -106.14787161859421 617.3999999999999
+ vertex 167.3984376183953 -106.14787161859421 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 -1.3771336778111663e-16
+ outer loop
+ vertex 167.04484777990902 -107.56030718389242 617.3999999999999
+ vertex 166.84484777990903 -107.90671734540621 -62.60000000000005
+ vertex 166.84484777990903 -107.90671734540621 617.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 -1.3771336778111663e-16
+ outer loop
+ vertex 166.84484777990903 -107.90671734540621 -62.60000000000005
+ vertex 167.04484777990902 -107.56030718389242 617.3999999999999
+ vertex 167.04484777990902 -107.56030718389242 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 2.080531937439537e-16
+ outer loop
+ vertex 167.3984376183953 -106.14787161859421 617.3999999999999
+ vertex 169.30369350672103 -107.2478716185942 -62.60000000000005
+ vertex 167.3984376183953 -106.14787161859421 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 2.080531937439537e-16
+ outer loop
+ vertex 169.30369350672103 -107.2478716185942 -62.60000000000005
+ vertex 167.3984376183953 -106.14787161859421 617.3999999999999
+ vertex 169.30369350672103 -107.2478716185942 617.3999999999999
+ endloop
+endfacet
+facet normal -0.5000000000000004 -0.8660254037844386 -2.080531937439537e-16
+ outer loop
+ vertex 169.41834729097397 -102.11791458908962 617.3999999999999
+ vertex 163.9895552000824 -98.98360001403886 -62.60000000000005
+ vertex 169.41834729097397 -102.11791458908962 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.5000000000000004 -0.8660254037844386 -2.080531937439537e-16
+ outer loop
+ vertex 163.9895552000824 -98.98360001403886 -62.60000000000005
+ vertex 169.41834729097397 -102.11791458908962 617.3999999999999
+ vertex 163.9895552000824 -98.98360001403886 617.3999999999999
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 2.0805319374395374e-16
+ outer loop
+ vertex 165.75972261146822 -84.18620926971741 617.3999999999999
+ vertex 170.2630547111473 -86.7862092697174 -62.60000000000005
+ vertex 165.75972261146822 -84.18620926971741 -62.60000000000008
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 2.0805319374395374e-16
+ outer loop
+ vertex 170.2630547111473 -86.7862092697174 -62.60000000000005
+ vertex 165.75972261146822 -84.18620926971741 617.3999999999999
+ vertex 170.2630547111473 -86.7862092697174 617.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 1.3771336778111663e-16
+ outer loop
+ vertex 170.2630547111473 -86.7862092697174 -62.60000000000005
+ vertex 170.0630547111473 -87.13261943123119 617.3999999999999
+ vertex 170.0630547111473 -87.13261943123119 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 1.3771336778111663e-16
+ outer loop
+ vertex 170.0630547111473 -87.13261943123119 617.3999999999999
+ vertex 170.2630547111473 -86.7862092697174 -62.60000000000005
+ vertex 170.2630547111473 -86.7862092697174 617.3999999999999
+ endloop
+endfacet
+facet normal 0.5000000000000018 0.8660254037844376 2.0805319374395391e-16
+ outer loop
+ vertex 167.6895552000824 -92.575012026034 617.3999999999999
+ vertex 173.1183472909739 -95.70932660108475 -62.60000000000005
+ vertex 167.6895552000824 -92.575012026034 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000018 0.8660254037844376 2.0805319374395391e-16
+ outer loop
+ vertex 173.1183472909739 -95.70932660108475 -62.60000000000005
+ vertex 167.6895552000824 -92.575012026034 617.3999999999999
+ vertex 173.1183472909739 -95.70932660108475 617.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 1.3771336778111663e-16
+ outer loop
+ vertex 170.4094648726611 -87.3326194312312 -62.60000000000005
+ vertex 169.70946487266107 -88.5450549965294 617.3999999999999
+ vertex 169.70946487266107 -88.5450549965294 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 1.3771336778111663e-16
+ outer loop
+ vertex 169.70946487266107 -88.5450549965294 617.3999999999999
+ vertex 170.4094648726611 -87.3326194312312 -62.60000000000005
+ vertex 170.4094648726611 -87.3326194312312 617.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 -1.3771336778111663e-16
+ outer loop
+ vertex 177.50369350672102 -93.0450549965294 617.3999999999999
+ vertex 176.48653621919567 -94.8068230978123 -62.60000000000005
+ vertex 176.48653621919567 -94.8068230978123 617.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 -1.3771336778111663e-16
+ outer loop
+ vertex 176.48653621919567 -94.8068230978123 -62.60000000000005
+ vertex 177.50369350672102 -93.0450549965294 617.3999999999999
+ vertex 177.50369350672102 -93.0450549965294 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 -2.080531937439537e-16
+ outer loop
+ vertex 177.50369350672102 -93.0450549965294 617.3999999999999
+ vertex 175.59843761839528 -91.9450549965294 -62.60000000000005
+ vertex 177.50369350672102 -93.0450549965294 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 -2.080531937439537e-16
+ outer loop
+ vertex 175.59843761839528 -91.9450549965294 -62.60000000000005
+ vertex 177.50369350672102 -93.0450549965294 617.3999999999999
+ vertex 175.59843761839528 -91.9450549965294 617.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844304 0.5000000000000142 -1.3771336778111328e-16
+ outer loop
+ vertex 176.2984376183953 -90.7326194312312 617.3999999999999
+ vertex 175.59843761839528 -91.9450549965294 -62.60000000000005
+ vertex 175.59843761839528 -91.9450549965294 617.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844304 0.5000000000000142 -1.3771336778111328e-16
+ outer loop
+ vertex 175.59843761839528 -91.9450549965294 -62.60000000000005
+ vertex 176.2984376183953 -90.7326194312312 617.3999999999999
+ vertex 176.2984376183953 -90.7326194312312 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 1.3771336778111663e-16
+ outer loop
+ vertex 167.80420898433533 -87.44505499652941 -62.60000000000005
+ vertex 166.78705169680995 -89.20682309781228 617.3999999999999
+ vertex 166.78705169680995 -89.20682309781228 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 1.3771336778111663e-16
+ outer loop
+ vertex 166.78705169680995 -89.20682309781228 617.3999999999999
+ vertex 167.80420898433533 -87.44505499652941 -62.60000000000005
+ vertex 167.80420898433533 -87.44505499652941 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9659258262890691 0.25881904510251824 2.444938803619327e-16
+ outer loop
+ vertex 166.78705169680995 -89.20682309781228 -62.60000000000005
+ vertex 167.6895552000824 -92.575012026034 617.3999999999999
+ vertex 167.6895552000824 -92.575012026034 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9659258262890691 0.25881904510251824 2.444938803619327e-16
+ outer loop
+ vertex 167.6895552000824 -92.575012026034 617.3999999999999
+ vertex 166.78705169680995 -89.20682309781228 -62.60000000000005
+ vertex 166.78705169680995 -89.20682309781228 617.3999999999999
+ endloop
+endfacet
+facet normal -0.25881904510251624 0.9659258262890696 4.9737767925804736e-17
+ outer loop
+ vertex 173.1183472909739 -95.70932660108475 617.3999999999999
+ vertex 176.48653621919567 -94.8068230978123 -62.60000000000005
+ vertex 173.1183472909739 -95.70932660108475 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.25881904510251624 0.9659258262890696 4.9737767925804736e-17
+ outer loop
+ vertex 176.48653621919567 -94.8068230978123 -62.60000000000005
+ vertex 173.1183472909739 -95.70932660108475 617.3999999999999
+ vertex 176.48653621919567 -94.8068230978123 617.3999999999999
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 2.080531937439537e-16
+ outer loop
+ vertex 176.2984376183953 -90.7326194312312 617.3999999999999
+ vertex 176.64484777990907 -90.9326194312312 -62.60000000000005
+ vertex 176.2984376183953 -90.7326194312312 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 2.080531937439537e-16
+ outer loop
+ vertex 176.64484777990907 -90.9326194312312 -62.60000000000005
+ vertex 176.2984376183953 -90.7326194312312 617.3999999999999
+ vertex 176.64484777990907 -90.9326194312312 617.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 -1.3771336778111663e-16
+ outer loop
+ vertex 176.8448477799091 -90.58620926971743 617.3999999999999
+ vertex 176.64484777990907 -90.9326194312312 -62.60000000000005
+ vertex 176.64484777990907 -90.9326194312312 617.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 -1.3771336778111663e-16
+ outer loop
+ vertex 176.64484777990907 -90.9326194312312 -62.60000000000005
+ vertex 176.8448477799091 -90.58620926971743 617.3999999999999
+ vertex 176.8448477799091 -90.58620926971743 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 2.080531937439537e-16
+ outer loop
+ vertex 170.0630547111473 -87.13261943123119 617.3999999999999
+ vertex 170.4094648726611 -87.3326194312312 -62.60000000000005
+ vertex 170.0630547111473 -87.13261943123119 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 2.080531937439537e-16
+ outer loop
+ vertex 170.4094648726611 -87.3326194312312 -62.60000000000005
+ vertex 170.0630547111473 -87.13261943123119 617.3999999999999
+ vertex 170.4094648726611 -87.3326194312312 617.3999999999999
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 -2.080531937439537e-16
+ outer loop
+ vertex 169.70946487266107 -88.5450549965294 617.3999999999999
+ vertex 167.80420898433533 -87.44505499652941 -62.60000000000005
+ vertex 169.70946487266107 -88.5450549965294 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 -2.080531937439537e-16
+ outer loop
+ vertex 167.80420898433533 -87.44505499652941 -62.60000000000005
+ vertex 169.70946487266107 -88.5450549965294 617.3999999999999
+ vertex 167.80420898433533 -87.44505499652941 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112865 0.3826834323650907 2.488942827790613e-16
+ outer loop
+ vertex 181.71420528337256 -93.55223467350186 617.3999999999999
+ vertex 181.8141057058772 -93.79341562839934 -62.60000000000003
+ vertex 181.71420528337256 -93.55223467350186 -62.60000000000003
+ endloop
+endfacet
+facet normal 0.9238795325112865 0.3826834323650907 2.488942827790613e-16
+ outer loop
+ vertex 181.8141057058772 -93.79341562839934 -62.60000000000003
+ vertex 181.71420528337256 -93.55223467350186 617.3999999999999
+ vertex 181.8141057058772 -93.79341562839934 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738093 -0.1305261922200602 2.0684907214262695e-16
+ outer loop
+ vertex 181.84817987958814 -94.05223467350186 -62.60000000000002
+ vertex 181.81410570587718 -94.31105371860438 617.3999999999999
+ vertex 181.81410570587718 -94.31105371860438 -62.60000000000002
+ endloop
+endfacet
+facet normal 0.9914448613738093 -0.1305261922200602 2.0684907214262695e-16
+ outer loop
+ vertex 181.81410570587718 -94.31105371860438 617.3999999999999
+ vertex 181.84817987958814 -94.05223467350186 -62.60000000000002
+ vertex 181.84817987958814 -94.05223467350186 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112951 -0.3826834323650697 1.636916019876928e-16
+ outer loop
+ vertex 181.81410570587718 -94.31105371860438 -62.60000000000002
+ vertex 181.71420528337256 -94.55223467350186 617.3999999999999
+ vertex 181.71420528337256 -94.55223467350186 -62.60000000000002
+ endloop
+endfacet
+facet normal 0.9238795325112951 -0.3826834323650697 1.636916019876928e-16
+ outer loop
+ vertex 181.71420528337256 -94.55223467350186 617.3999999999999
+ vertex 181.81410570587718 -94.31105371860438 -62.60000000000002
+ vertex 181.81410570587718 -94.31105371860438 617.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 1.3771336778111666e-16
+ outer loop
+ vertex 181.71420528337256 -94.55223467350186 -62.60000000000002
+ vertex 179.11420528337257 -99.05556677318094 617.3999999999999
+ vertex 179.11420528337257 -99.05556677318094 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 1.3771336778111666e-16
+ outer loop
+ vertex 179.11420528337257 -99.05556677318094 617.3999999999999
+ vertex 181.71420528337256 -94.55223467350186 -62.60000000000002
+ vertex 181.71420528337256 -94.55223467350186 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738132 0.13052619222003078 2.3591011986529993e-16
+ outer loop
+ vertex 181.8141057058772 -93.79341562839934 -62.60000000000003
+ vertex 181.84817987958814 -94.05223467350186 617.3999999999999
+ vertex 181.84817987958814 -94.05223467350186 -62.60000000000002
+ endloop
+endfacet
+facet normal 0.9914448613738132 0.13052619222003078 2.3591011986529993e-16
+ outer loop
+ vertex 181.84817987958814 -94.05223467350186 617.3999999999999
+ vertex 181.8141057058772 -93.79341562839934 -62.60000000000003
+ vertex 181.8141057058772 -93.79341562839934 617.3999999999999
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 2.0805319374395374e-16
+ outer loop
+ vertex 176.8448477799091 -90.58620926971743 617.3999999999999
+ vertex 181.34817987958814 -93.18620926971742 -62.60000000000005
+ vertex 176.8448477799091 -90.58620926971743 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 2.0805319374395374e-16
+ outer loop
+ vertex 181.34817987958814 -93.18620926971742 -62.60000000000005
+ vertex 176.8448477799091 -90.58620926971743 617.3999999999999
+ vertex 181.34817987958814 -93.18620926971742 617.3999999999999
+ endloop
+endfacet
+facet normal 0.793353340291229 0.608761429008729 2.4491671163867724e-16
+ outer loop
+ vertex 181.5552866607747 -93.34512789231532 617.3999999999999
+ vertex 181.71420528337256 -93.55223467350186 -62.60000000000003
+ vertex 181.5552866607747 -93.34512789231532 -62.600000000000044
+ endloop
+endfacet
+facet normal 0.793353340291229 0.608761429008729 2.4491671163867724e-16
+ outer loop
+ vertex 181.71420528337256 -93.55223467350186 -62.60000000000003
+ vertex 181.5552866607747 -93.34512789231532 617.3999999999999
+ vertex 181.71420528337256 -93.55223467350186 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087248 0.7933533402912322 2.242484713441219e-16
+ outer loop
+ vertex 181.34817987958814 -93.18620926971742 617.3999999999999
+ vertex 181.5552866607747 -93.34512789231532 -62.600000000000044
+ vertex 181.34817987958814 -93.18620926971742 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.6087614290087248 0.7933533402912322 2.242484713441219e-16
+ outer loop
+ vertex 181.5552866607747 -93.34512789231532 -62.600000000000044
+ vertex 181.34817987958814 -93.18620926971742 617.3999999999999
+ vertex 181.5552866607747 -93.34512789231532 617.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 1.3771336778111663e-16
+ outer loop
+ vertex 178.7677951218588 -98.85556677318094 -62.60000000000005
+ vertex 178.56779512185878 -99.20197693469471 617.3999999999999
+ vertex 178.56779512185878 -99.20197693469471 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 1.3771336778111663e-16
+ outer loop
+ vertex 178.56779512185878 -99.20197693469471 617.3999999999999
+ vertex 178.7677951218588 -98.85556677318094 -62.60000000000005
+ vertex 178.7677951218588 -98.85556677318094 617.3999999999999
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 -2.080531937439537e-16
+ outer loop
+ vertex 178.45535955656058 -96.59672104636894 617.3999999999999
+ vertex 176.6935914552777 -95.57956375884356 -62.60000000000005
+ vertex 178.45535955656058 -96.59672104636894 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 -2.080531937439537e-16
+ outer loop
+ vertex 176.6935914552777 -95.57956375884356 -62.60000000000005
+ vertex 178.45535955656058 -96.59672104636894 617.3999999999999
+ vertex 176.6935914552777 -95.57956375884356 617.3999999999999
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 -2.080531937439537e-16
+ outer loop
+ vertex 179.11420528337257 -99.05556677318094 -62.60000000000005
+ vertex 178.7677951218588 -98.85556677318094 617.3999999999999
+ vertex 178.7677951218588 -98.85556677318094 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.5000000000000003 -0.8660254037844387 -2.080531937439537e-16
+ outer loop
+ vertex 178.7677951218588 -98.85556677318094 617.3999999999999
+ vertex 179.11420528337257 -99.05556677318094 -62.60000000000005
+ vertex 179.11420528337257 -99.05556677318094 617.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 -1.3771336778111666e-16
+ outer loop
+ vertex 178.45535955656058 -96.59672104636894 617.3999999999999
+ vertex 177.3553595565606 -98.5019769346947 -62.60000000000005
+ vertex 177.3553595565606 -98.5019769346947 617.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 -1.3771336778111666e-16
+ outer loop
+ vertex 177.3553595565606 -98.5019769346947 -62.60000000000005
+ vertex 178.45535955656058 -96.59672104636894 617.3999999999999
+ vertex 178.45535955656058 -96.59672104636894 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 1.3771336778111663e-16
+ outer loop
+ vertex 173.32540252705599 -96.48206726211602 -62.60000000000005
+ vertex 170.19108795200523 -101.91085935300757 617.3999999999999
+ vertex 170.19108795200523 -101.91085935300757 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 1.3771336778111663e-16
+ outer loop
+ vertex 170.19108795200523 -101.91085935300757 617.3999999999999
+ vertex 173.32540252705599 -96.48206726211602 -62.60000000000005
+ vertex 173.32540252705599 -96.48206726211602 617.3999999999999
+ endloop
+endfacet
+facet normal -0.5000000000000072 -0.8660254037844345 -2.0805319374395473e-16
+ outer loop
+ vertex 178.56779512185878 -99.20197693469471 617.3999999999999
+ vertex 177.3553595565606 -98.5019769346947 -62.60000000000005
+ vertex 178.56779512185878 -99.20197693469471 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.5000000000000072 -0.8660254037844345 -2.0805319374395473e-16
+ outer loop
+ vertex 177.3553595565606 -98.5019769346947 -62.60000000000005
+ vertex 178.56779512185878 -99.20197693469471 617.3999999999999
+ vertex 177.3553595565606 -98.5019769346947 617.3999999999999
+ endloop
+endfacet
+facet normal 0.25881904510252063 -0.9659258262890684 -4.973776792580361e-17
+ outer loop
+ vertex 176.6935914552777 -95.57956375884356 -62.60000000000005
+ vertex 173.32540252705599 -96.48206726211602 617.3999999999999
+ vertex 173.32540252705599 -96.48206726211602 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.25881904510252063 -0.9659258262890684 -4.973776792580361e-17
+ outer loop
+ vertex 173.32540252705599 -96.48206726211602 617.3999999999999
+ vertex 176.6935914552777 -95.57956375884356 -62.60000000000005
+ vertex 176.6935914552777 -95.57956375884356 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9659258262890691 0.2588190451025179 2.444938803619327e-16
+ outer loop
+ vertex 170.19108795200523 -101.91085935300757 -62.60000000000005
+ vertex 171.09359145527768 -105.2790482812293 617.3999999999999
+ vertex 171.09359145527768 -105.2790482812293 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9659258262890691 0.2588190451025179 2.444938803619327e-16
+ outer loop
+ vertex 171.09359145527768 -105.2790482812293 617.3999999999999
+ vertex 170.19108795200523 -101.91085935300757 -62.60000000000005
+ vertex 170.19108795200523 -101.91085935300757 617.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 -1.3771336778111666e-16
+ outer loop
+ vertex 173.95535955656058 -104.3909496804289 617.3999999999999
+ vertex 172.8553595565606 -106.29620556875466 -62.60000000000005
+ vertex 172.8553595565606 -106.29620556875466 617.3999999999999
+ endloop
+endfacet
+facet normal -0.8660254037844385 0.5000000000000002 -1.3771336778111666e-16
+ outer loop
+ vertex 172.8553595565606 -106.29620556875466 -62.60000000000005
+ vertex 173.95535955656058 -104.3909496804289 617.3999999999999
+ vertex 173.95535955656058 -104.3909496804289 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.500000000000022 0.8660254037844259 2.0805319374395714e-16
+ outer loop
+ vertex 173.95535955656058 -104.3909496804289 617.3999999999999
+ vertex 175.16779512185877 -105.09094968042892 -62.60000000000005
+ vertex 173.95535955656058 -104.3909496804289 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.500000000000022 0.8660254037844259 2.0805319374395714e-16
+ outer loop
+ vertex 175.16779512185877 -105.09094968042892 -62.60000000000005
+ vertex 173.95535955656058 -104.3909496804289 617.3999999999999
+ vertex 175.16779512185877 -105.09094968042892 617.3999999999999
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 2.080531937439537e-16
+ outer loop
+ vertex 171.09359145527768 -105.2790482812293 617.3999999999999
+ vertex 172.8553595565606 -106.29620556875466 -62.60000000000005
+ vertex 171.09359145527768 -105.2790482812293 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000003 0.8660254037844387 2.080531937439537e-16
+ outer loop
+ vertex 172.8553595565606 -106.29620556875466 -62.60000000000005
+ vertex 171.09359145527768 -105.2790482812293 617.3999999999999
+ vertex 172.8553595565606 -106.29620556875466 617.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 1.3771336778111663e-16
+ outer loop
+ vertex 175.16779512185877 -105.09094968042892 -62.60000000000005
+ vertex 174.96779512185879 -105.43735984194271 617.3999999999999
+ vertex 174.96779512185879 -105.43735984194271 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 1.3771336778111663e-16
+ outer loop
+ vertex 174.96779512185879 -105.43735984194271 617.3999999999999
+ vertex 175.16779512185877 -105.09094968042892 -62.60000000000005
+ vertex 175.16779512185877 -105.09094968042892 617.3999999999999
+ endloop
+endfacet
+facet normal 0.5000000000000033 0.8660254037844369 2.080531937439542e-16
+ outer loop
+ vertex 174.96779512185879 -105.43735984194271 617.3999999999999
+ vertex 175.31420528337256 -105.63735984194271 -62.60000000000005
+ vertex 174.96779512185879 -105.43735984194271 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000033 0.8660254037844369 2.080531937439542e-16
+ outer loop
+ vertex 175.31420528337256 -105.63735984194271 -62.60000000000005
+ vertex 174.96779512185879 -105.43735984194271 617.3999999999999
+ vertex 175.31420528337256 -105.63735984194271 617.3999999999999
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 1.3771336778111663e-16
+ outer loop
+ vertex 175.31420528337256 -105.63735984194271 -62.60000000000005
+ vertex 172.71420528337256 -110.14069194162177 617.3999999999999
+ vertex 172.71420528337256 -110.14069194162177 -62.60000000000008
+ endloop
+endfacet
+facet normal 0.8660254037844385 -0.5000000000000002 1.3771336778111663e-16
+ outer loop
+ vertex 172.71420528337256 -110.14069194162177 617.3999999999999
+ vertex 175.31420528337256 -105.63735984194271 -62.60000000000005
+ vertex 175.31420528337256 -105.63735984194271 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912218 -0.608761429008738 1.0937881967044599e-16
+ outer loop
+ vertex 172.71420528337256 -110.14069194162177 -62.60000000000008
+ vertex 172.55528666077467 -110.34779872280829 617.3999999999999
+ vertex 172.55528666077467 -110.34779872280829 -62.60000000000008
+ endloop
+endfacet
+facet normal 0.7933533402912218 -0.608761429008738 1.0937881967044599e-16
+ outer loop
+ vertex 172.55528666077467 -110.34779872280829 617.3999999999999
+ vertex 172.71420528337256 -110.14069194162177 -62.60000000000008
+ vertex 172.71420528337256 -110.14069194162177 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087274 -0.7933533402912301 4.761205154971988e-17
+ outer loop
+ vertex 172.55528666077467 -110.34779872280829 -62.60000000000008
+ vertex 172.34817987958812 -110.5067173454062 617.3999999999999
+ vertex 172.34817987958812 -110.5067173454062 -62.60000000000008
+ endloop
+endfacet
+facet normal 0.6087614290087274 -0.7933533402912301 4.761205154971988e-17
+ outer loop
+ vertex 172.34817987958812 -110.5067173454062 617.3999999999999
+ vertex 172.55528666077467 -110.34779872280829 -62.60000000000008
+ vertex 172.55528666077467 -110.34779872280829 617.3999999999999
+ endloop
+endfacet
+facet normal 0.38268343236510943 -0.9238795325112787 -1.7399399201487847e-17
+ outer loop
+ vertex 172.34817987958812 -110.5067173454062 -62.60000000000008
+ vertex 172.10699892469066 -110.60661776791083 617.3999999999999
+ vertex 172.10699892469066 -110.60661776791083 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.38268343236510943 -0.9238795325112787 -1.7399399201487847e-17
+ outer loop
+ vertex 172.10699892469066 -110.60661776791083 617.3999999999999
+ vertex 172.34817987958812 -110.5067173454062 -62.60000000000008
+ vertex 172.34817987958812 -110.5067173454062 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222004544 -0.9914448613738112 -8.122510965099047e-17
+ outer loop
+ vertex 172.10699892469066 -110.60661776791083 617.3999999999999
+ vertex 171.84817987958812 -110.64069194162177 -62.600000000000065
+ vertex 172.10699892469066 -110.60661776791083 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.13052619222004544 -0.9914448613738112 -8.122510965099047e-17
+ outer loop
+ vertex 171.84817987958812 -110.64069194162177 -62.600000000000065
+ vertex 172.10699892469066 -110.60661776791083 617.3999999999999
+ vertex 171.84817987958812 -110.64069194162177 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 171.34817987958812 -110.5067173454062 617.3999999999999
+ vertex 167.04484777990902 -107.56030718389242 617.3999999999999
+ vertex 166.84484777990903 -107.90671734540621 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 167.04484777990902 -107.56030718389242 617.3999999999999
+ vertex 171.34817987958812 -110.5067173454062 617.3999999999999
+ vertex 170.27757854514834 -109.13283230697894 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 167.04484777990902 -107.56030718389242 617.3999999999999
+ vertex 170.27757854514834 -109.13283230697894 617.3999999999999
+ vertex 170.0233087489917 -108.80146145708044 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 167.04484777990902 -107.56030718389242 617.3999999999999
+ vertex 170.0233087489917 -108.80146145708044 617.3999999999999
+ vertex 169.30369350672103 -107.2478716185942 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 169.30369350672103 -107.2478716185942 617.3999999999999
+ vertex 170.0233087489917 -108.80146145708044 617.3999999999999
+ vertex 169.8634680729843 -108.41557192924448 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 169.30369350672103 -107.2478716185942 617.3999999999999
+ vertex 169.8634680729843 -108.41557192924448 617.3999999999999
+ vertex 169.8089493950468 -108.00146145708044 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 169.30369350672103 -107.2478716185942 617.3999999999999
+ vertex 169.8089493950468 -108.00146145708044 617.3999999999999
+ vertex 169.8634680729843 -107.58735098491641 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 169.30369350672103 -107.2478716185942 617.3999999999999
+ vertex 169.8634680729843 -107.58735098491641 617.3999999999999
+ vertex 170.3208507942464 -105.48610351731132 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 170.3208507942464 -105.48610351731132 617.3999999999999
+ vertex 169.8634680729843 -107.58735098491641 617.3999999999999
+ vertex 170.0233087489917 -107.20146145708044 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 170.3208507942464 -105.48610351731132 617.3999999999999
+ vertex 170.0233087489917 -107.20146145708044 617.3999999999999
+ vertex 171.09359145527768 -105.2790482812293 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 170.27757854514834 -109.13283230697894 617.3999999999999
+ vertex 171.34817987958812 -110.5067173454062 617.3999999999999
+ vertex 170.60894939504684 -109.38710210313555 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 170.60894939504684 -109.38710210313555 617.3999999999999
+ vertex 171.34817987958812 -110.5067173454062 617.3999999999999
+ vertex 170.9948389228828 -109.54694277914295 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 170.9948389228828 -109.54694277914295 617.3999999999999
+ vertex 171.34817987958812 -110.5067173454062 617.3999999999999
+ vertex 171.40894939504682 -109.60146145708045 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 171.40894939504682 -109.60146145708045 617.3999999999999
+ vertex 171.34817987958812 -110.5067173454062 617.3999999999999
+ vertex 171.82305986721084 -109.54694277914295 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 171.82305986721084 -109.54694277914295 617.3999999999999
+ vertex 171.34817987958812 -110.5067173454062 617.3999999999999
+ vertex 172.20894939504683 -109.38710210313553 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 172.20894939504683 -109.38710210313553 617.3999999999999
+ vertex 171.34817987958812 -110.5067173454062 617.3999999999999
+ vertex 171.5893608344856 -110.60661776791083 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 172.20894939504683 -109.38710210313553 617.3999999999999
+ vertex 171.5893608344856 -110.60661776791083 617.3999999999999
+ vertex 172.5403202449453 -109.1328323069789 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 172.5403202449453 -109.1328323069789 617.3999999999999
+ vertex 171.5893608344856 -110.60661776791083 617.3999999999999
+ vertex 171.84817987958812 -110.64069194162177 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 172.5403202449453 -109.1328323069789 617.3999999999999
+ vertex 171.84817987958812 -110.64069194162177 617.3999999999999
+ vertex 172.7945900411019 -108.80146145708042 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 172.10699892469066 -110.60661776791083 617.3999999999999
+ vertex 174.96779512185879 -105.43735984194271 617.3999999999999
+ vertex 171.84817987958812 -110.64069194162177 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 174.96779512185879 -105.43735984194271 617.3999999999999
+ vertex 172.10699892469066 -110.60661776791083 617.3999999999999
+ vertex 175.31420528337256 -105.63735984194271 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 175.31420528337256 -105.63735984194271 617.3999999999999
+ vertex 172.10699892469066 -110.60661776791083 617.3999999999999
+ vertex 172.34817987958812 -110.5067173454062 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 175.31420528337256 -105.63735984194271 617.3999999999999
+ vertex 172.34817987958812 -110.5067173454062 617.3999999999999
+ vertex 172.55528666077467 -110.34779872280829 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 175.31420528337256 -105.63735984194271 617.3999999999999
+ vertex 172.55528666077467 -110.34779872280829 617.3999999999999
+ vertex 172.71420528337256 -110.14069194162177 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 171.09359145527768 -105.2790482812293 617.3999999999999
+ vertex 171.4089493950468 -106.40146145708043 617.3999999999999
+ vertex 172.8553595565606 -106.29620556875466 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 171.4089493950468 -106.40146145708043 617.3999999999999
+ vertex 171.09359145527768 -105.2790482812293 617.3999999999999
+ vertex 170.99483892288274 -106.45598013501792 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 170.99483892288274 -106.45598013501792 617.3999999999999
+ vertex 171.09359145527768 -105.2790482812293 617.3999999999999
+ vertex 170.6089493950468 -106.61582081102533 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 170.6089493950468 -106.61582081102533 617.3999999999999
+ vertex 171.09359145527768 -105.2790482812293 617.3999999999999
+ vertex 170.27757854514832 -106.87009060718195 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 170.27757854514832 -106.87009060718195 617.3999999999999
+ vertex 171.09359145527768 -105.2790482812293 617.3999999999999
+ vertex 170.0233087489917 -107.20146145708044 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 172.8553595565606 -106.29620556875466 617.3999999999999
+ vertex 171.4089493950468 -106.40146145708043 617.3999999999999
+ vertex 171.82305986721084 -106.4559801350179 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 172.8553595565606 -106.29620556875466 617.3999999999999
+ vertex 171.82305986721084 -106.4559801350179 617.3999999999999
+ vertex 172.2089493950468 -106.61582081102532 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 172.8553595565606 -106.29620556875466 617.3999999999999
+ vertex 172.2089493950468 -106.61582081102532 617.3999999999999
+ vertex 172.5403202449453 -106.87009060718195 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 172.8553595565606 -106.29620556875466 617.3999999999999
+ vertex 172.5403202449453 -106.87009060718195 617.3999999999999
+ vertex 173.95535955656058 -104.3909496804289 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 173.95535955656058 -104.3909496804289 617.3999999999999
+ vertex 172.5403202449453 -106.87009060718195 617.3999999999999
+ vertex 175.16779512185877 -105.09094968042892 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 175.16779512185877 -105.09094968042892 617.3999999999999
+ vertex 172.5403202449453 -106.87009060718195 617.3999999999999
+ vertex 172.7945900411019 -107.20146145708043 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 175.16779512185877 -105.09094968042892 617.3999999999999
+ vertex 172.7945900411019 -107.20146145708043 617.3999999999999
+ vertex 172.95443071710932 -107.58735098491637 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 175.16779512185877 -105.09094968042892 617.3999999999999
+ vertex 172.95443071710932 -107.58735098491637 617.3999999999999
+ vertex 173.0089493950468 -108.00146145708042 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 175.16779512185877 -105.09094968042892 617.3999999999999
+ vertex 173.0089493950468 -108.00146145708042 617.3999999999999
+ vertex 172.95443071710932 -108.41557192924445 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 175.16779512185877 -105.09094968042892 617.3999999999999
+ vertex 172.95443071710932 -108.41557192924445 617.3999999999999
+ vertex 172.7945900411019 -108.80146145708042 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 175.16779512185877 -105.09094968042892 617.3999999999999
+ vertex 172.7945900411019 -108.80146145708042 617.3999999999999
+ vertex 171.84817987958812 -110.64069194162177 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 175.16779512185877 -105.09094968042892 617.3999999999999
+ vertex 171.84817987958812 -110.64069194162177 617.3999999999999
+ vertex 174.96779512185879 -105.43735984194271 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 163.15254293449576 -90.30197693469471 617.3999999999999
+ vertex 162.14010736919758 -89.25556677318093 617.3999999999999
+ vertex 161.94010736919756 -89.6019769346947 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 162.14010736919758 -89.25556677318093 617.3999999999999
+ vertex 163.15254293449576 -90.30197693469471 617.3999999999999
+ vertex 164.15347177394705 -86.27735468587916 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 162.14010736919758 -89.25556677318093 617.3999999999999
+ vertex 164.15347177394705 -86.27735468587916 617.3999999999999
+ vertex 164.31331244995442 -85.89146515804319 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 162.14010736919758 -89.25556677318093 617.3999999999999
+ vertex 164.31331244995442 -85.89146515804319 617.3999999999999
+ vertex 165.25972261146822 -84.05223467350184 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 164.15347177394705 -86.27735468587916 617.3999999999999
+ vertex 163.15254293449576 -90.30197693469471 617.3999999999999
+ vertex 164.09895309600955 -86.69146515804319 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 164.09895309600955 -86.69146515804319 617.3999999999999
+ vertex 163.15254293449576 -90.30197693469471 617.3999999999999
+ vertex 164.15347177394705 -87.10557563020723 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 164.15347177394705 -87.10557563020723 617.3999999999999
+ vertex 163.15254293449576 -90.30197693469471 617.3999999999999
+ vertex 164.31331244995442 -87.49146515804318 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 164.31331244995442 -87.49146515804318 617.3999999999999
+ vertex 163.15254293449576 -90.30197693469471 617.3999999999999
+ vertex 164.56758224611107 -87.82283600794166 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 164.56758224611107 -87.82283600794166 617.3999999999999
+ vertex 163.15254293449576 -90.30197693469471 617.3999999999999
+ vertex 164.25254293449578 -88.39672104636894 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 164.56758224611107 -87.82283600794166 617.3999999999999
+ vertex 164.25254293449578 -88.39672104636894 617.3999999999999
+ vertex 164.89895309600956 -88.0771058040983 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 164.89895309600956 -88.0771058040983 617.3999999999999
+ vertex 164.25254293449578 -88.39672104636894 617.3999999999999
+ vertex 166.01431103577866 -89.41387833389432 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 164.89895309600956 -88.0771058040983 617.3999999999999
+ vertex 166.01431103577866 -89.41387833389432 617.3999999999999
+ vertex 165.28484262384555 -88.2369464801057 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 165.28484262384555 -88.2369464801057 617.3999999999999
+ vertex 166.01431103577866 -89.41387833389432 617.3999999999999
+ vertex 165.69895309600957 -88.2914651580432 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 165.69895309600957 -88.2914651580432 617.3999999999999
+ vertex 166.01431103577866 -89.41387833389432 617.3999999999999
+ vertex 166.1130635681736 -88.23694648010569 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 166.1130635681736 -88.23694648010569 617.3999999999999
+ vertex 166.01431103577866 -89.41387833389432 617.3999999999999
+ vertex 166.49895309600956 -88.07710580409828 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 166.49895309600956 -88.07710580409828 617.3999999999999
+ vertex 166.01431103577866 -89.41387833389432 617.3999999999999
+ vertex 166.83032394590805 -87.82283600794165 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 166.83032394590805 -87.82283600794165 617.3999999999999
+ vertex 166.01431103577866 -89.41387833389432 617.3999999999999
+ vertex 167.08459374206464 -87.49146515804317 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 158.69895309600955 -98.81582081102533 617.3999999999999
+ vertex 158.65254293449578 -98.09620556875467 617.3999999999999
+ vertex 158.3130635681736 -98.65598013501793 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 158.65254293449578 -98.09620556875467 617.3999999999999
+ vertex 158.69895309600955 -98.81582081102533 617.3999999999999
+ vertex 160.41431103577867 -99.11336285628003 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 160.41431103577867 -99.11336285628003 617.3999999999999
+ vertex 158.69895309600955 -98.81582081102533 617.3999999999999
+ vertex 159.03032394590804 -99.07009060718195 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 160.41431103577867 -99.11336285628003 617.3999999999999
+ vertex 159.03032394590804 -99.07009060718195 617.3999999999999
+ vertex 159.28459374206466 -99.40146145708044 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 160.41431103577867 -99.11336285628003 617.3999999999999
+ vertex 159.28459374206466 -99.40146145708044 617.3999999999999
+ vertex 159.4444344180721 -99.78735098491639 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 160.41431103577867 -99.11336285628003 617.3999999999999
+ vertex 159.4444344180721 -99.78735098491639 617.3999999999999
+ vertex 159.4989530960096 -100.20146145708043 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 160.41431103577867 -99.11336285628003 617.3999999999999
+ vertex 159.4989530960096 -100.20146145708043 617.3999999999999
+ vertex 159.4444344180721 -100.61557192924447 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 160.41431103577867 -99.11336285628003 617.3999999999999
+ vertex 159.4444344180721 -100.61557192924447 617.3999999999999
+ vertex 159.2845937420647 -101.00146145708044 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 155.29379678517915 -100.38187289651923 617.3999999999999
+ vertex 157.9936972076838 -95.63735984194264 617.3999999999999
+ vertex 155.39369720768377 -100.14069194162175 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 157.9936972076838 -95.63735984194264 617.3999999999999
+ vertex 155.29379678517915 -100.38187289651923 617.3999999999999
+ vertex 158.34010736919757 -95.83735984194263 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 158.34010736919757 -95.83735984194263 617.3999999999999
+ vertex 155.29379678517915 -100.38187289651923 617.3999999999999
+ vertex 155.25972261146825 -100.64069194162175 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 158.34010736919757 -95.83735984194263 617.3999999999999
+ vertex 155.25972261146825 -100.64069194162175 617.3999999999999
+ vertex 155.29379678517915 -100.89951098672427 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 158.34010736919757 -95.83735984194263 617.3999999999999
+ vertex 155.29379678517915 -100.89951098672427 617.3999999999999
+ vertex 155.39369720768377 -101.14069194162175 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 158.34010736919757 -95.83735984194263 617.3999999999999
+ vertex 155.39369720768377 -101.14069194162175 617.3999999999999
+ vertex 158.54010736919759 -95.49094968042887 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 158.54010736919759 -95.49094968042887 617.3999999999999
+ vertex 155.39369720768377 -101.14069194162175 617.3999999999999
+ vertex 156.51331244995444 -99.40146145708046 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 158.54010736919759 -95.49094968042887 617.3999999999999
+ vertex 156.51331244995444 -99.40146145708046 617.3999999999999
+ vertex 156.7675822461111 -99.07009060718198 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 158.54010736919759 -95.49094968042887 617.3999999999999
+ vertex 156.7675822461111 -99.07009060718198 617.3999999999999
+ vertex 159.75254293449578 -96.19094968042891 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 159.75254293449578 -96.19094968042891 617.3999999999999
+ vertex 156.7675822461111 -99.07009060718198 617.3999999999999
+ vertex 157.09895309600955 -98.81582081102533 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 159.75254293449578 -96.19094968042891 617.3999999999999
+ vertex 157.09895309600955 -98.81582081102533 617.3999999999999
+ vertex 157.4848426238455 -98.65598013501793 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 159.75254293449578 -96.19094968042891 617.3999999999999
+ vertex 157.4848426238455 -98.65598013501793 617.3999999999999
+ vertex 157.89895309600956 -98.60146145708043 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 159.75254293449578 -96.19094968042891 617.3999999999999
+ vertex 157.89895309600956 -98.60146145708043 617.3999999999999
+ vertex 158.3130635681736 -98.65598013501793 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 159.75254293449578 -96.19094968042891 617.3999999999999
+ vertex 158.3130635681736 -98.65598013501793 617.3999999999999
+ vertex 158.65254293449578 -98.09620556875467 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 162.14010736919758 -89.25556677318093 617.3999999999999
+ vertex 164.39369720768377 -84.55223467350186 617.3999999999999
+ vertex 161.79369720768378 -89.05556677318093 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 164.39369720768377 -84.55223467350186 617.3999999999999
+ vertex 162.14010736919758 -89.25556677318093 617.3999999999999
+ vertex 164.5526158302817 -84.3451278923153 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 164.5526158302817 -84.3451278923153 617.3999999999999
+ vertex 162.14010736919758 -89.25556677318093 617.3999999999999
+ vertex 164.75972261146825 -84.18620926971741 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 164.75972261146825 -84.18620926971741 617.3999999999999
+ vertex 162.14010736919758 -89.25556677318093 617.3999999999999
+ vertex 165.0009035663657 -84.08630884721279 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 165.0009035663657 -84.08630884721279 617.3999999999999
+ vertex 162.14010736919758 -89.25556677318093 617.3999999999999
+ vertex 165.25972261146822 -84.05223467350184 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 155.5526158302817 -101.34779872280829 617.3999999999999
+ vertex 156.51331244995444 -99.40146145708046 617.3999999999999
+ vertex 155.39369720768377 -101.14069194162175 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 156.51331244995444 -99.40146145708046 617.3999999999999
+ vertex 155.5526158302817 -101.34779872280829 617.3999999999999
+ vertex 156.35347177394706 -99.78735098491643 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 156.35347177394706 -99.78735098491643 617.3999999999999
+ vertex 155.5526158302817 -101.34779872280829 617.3999999999999
+ vertex 156.29895309600957 -100.20146145708047 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 156.29895309600957 -100.20146145708047 617.3999999999999
+ vertex 155.5526158302817 -101.34779872280829 617.3999999999999
+ vertex 155.75972261146822 -101.50671734540619 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 156.29895309600957 -100.20146145708047 617.3999999999999
+ vertex 155.75972261146822 -101.50671734540619 617.3999999999999
+ vertex 156.35347177394706 -100.6155719292445 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 156.35347177394706 -100.6155719292445 617.3999999999999
+ vertex 155.75972261146822 -101.50671734540619 617.3999999999999
+ vertex 156.51331244995447 -101.00146145708045 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 156.51331244995447 -101.00146145708045 617.3999999999999
+ vertex 155.75972261146822 -101.50671734540619 617.3999999999999
+ vertex 156.7675822461111 -101.33283230697894 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 156.7675822461111 -101.33283230697894 617.3999999999999
+ vertex 155.75972261146822 -101.50671734540619 617.3999999999999
+ vertex 160.2630547111473 -104.10671734540614 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 156.7675822461111 -101.33283230697894 617.3999999999999
+ vertex 160.2630547111473 -104.10671734540614 617.3999999999999
+ vertex 157.09895309600958 -101.58710210313555 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 157.09895309600958 -101.58710210313555 617.3999999999999
+ vertex 160.2630547111473 -104.10671734540614 617.3999999999999
+ vertex 157.48484262384554 -101.74694277914296 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 157.48484262384554 -101.74694277914296 617.3999999999999
+ vertex 160.2630547111473 -104.10671734540614 617.3999999999999
+ vertex 157.8989530960096 -101.80146145708045 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 157.8989530960096 -101.80146145708045 617.3999999999999
+ vertex 160.2630547111473 -104.10671734540614 617.3999999999999
+ vertex 158.31306356817362 -101.74694277914296 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 158.31306356817362 -101.74694277914296 617.3999999999999
+ vertex 160.2630547111473 -104.10671734540614 617.3999999999999
+ vertex 158.69895309600957 -101.58710210313555 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 158.69895309600957 -101.58710210313555 617.3999999999999
+ vertex 160.2630547111473 -104.10671734540614 617.3999999999999
+ vertex 159.03032394590804 -101.33283230697893 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 159.03032394590804 -101.33283230697893 617.3999999999999
+ vertex 160.2630547111473 -104.10671734540614 617.3999999999999
+ vertex 159.2845937420647 -101.00146145708044 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 159.2845937420647 -101.00146145708044 617.3999999999999
+ vertex 160.2630547111473 -104.10671734540614 617.3999999999999
+ vertex 159.6042089843353 -101.6478716185942 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 159.2845937420647 -101.00146145708044 617.3999999999999
+ vertex 159.6042089843353 -101.6478716185942 617.3999999999999
+ vertex 160.41431103577867 -99.11336285628003 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 159.6042089843353 -101.6478716185942 617.3999999999999
+ vertex 160.2630547111473 -104.10671734540614 617.3999999999999
+ vertex 160.4630547111473 -103.76030718389238 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 159.6042089843353 -101.6478716185942 617.3999999999999
+ vertex 160.4630547111473 -103.76030718389238 617.3999999999999
+ vertex 161.50946487266108 -102.74787161859419 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 161.50946487266108 -102.74787161859419 617.3999999999999
+ vertex 160.4630547111473 -103.76030718389238 617.3999999999999
+ vertex 160.80946487266107 -103.96030718389238 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 170.3208507942464 -105.48610351731132 617.3999999999999
+ vertex 170.19108795200523 -101.91085935300757 617.3999999999999
+ vertex 169.41834729097397 -102.11791458908962 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 170.19108795200523 -101.91085935300757 617.3999999999999
+ vertex 170.3208507942464 -105.48610351731132 617.3999999999999
+ vertex 171.09359145527768 -105.2790482812293 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 167.04484777990902 -107.56030718389242 617.3999999999999
+ vertex 167.3984376183953 -106.14787161859421 617.3999999999999
+ vertex 166.69843761839527 -107.36030718389243 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 167.3984376183953 -106.14787161859421 617.3999999999999
+ vertex 167.04484777990902 -107.56030718389242 617.3999999999999
+ vertex 169.30369350672103 -107.2478716185942 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 163.9895552000824 -98.98360001403886 617.3999999999999
+ vertex 165.9459515145477 -96.647651885785 617.3999999999999
+ vertex 166.2156826553102 -95.99646330756181 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 165.9459515145477 -96.647651885785 617.3999999999999
+ vertex 163.9895552000824 -98.98360001403886 617.3999999999999
+ vertex 165.85395124552818 -97.3464633075618 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 165.85395124552818 -97.3464633075618 617.3999999999999
+ vertex 163.9895552000824 -98.98360001403886 617.3999999999999
+ vertex 165.9459515145477 -98.0452747293386 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 165.9459515145477 -98.0452747293386 617.3999999999999
+ vertex 163.9895552000824 -98.98360001403886 617.3999999999999
+ vertex 166.2156826553102 -98.6964633075618 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 166.2156826553102 -98.6964633075618 617.3999999999999
+ vertex 163.9895552000824 -98.98360001403886 617.3999999999999
+ vertex 166.6447629363245 -99.25565161676548 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 166.6447629363245 -99.25565161676548 617.3999999999999
+ vertex 163.9895552000824 -98.98360001403886 617.3999999999999
+ vertex 169.41834729097397 -102.11791458908962 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 166.6447629363245 -99.25565161676548 617.3999999999999
+ vertex 169.41834729097397 -102.11791458908962 617.3999999999999
+ vertex 167.20395124552817 -99.6847318977798 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 167.20395124552817 -99.6847318977798 617.3999999999999
+ vertex 169.41834729097397 -102.11791458908962 617.3999999999999
+ vertex 167.85513982375136 -99.95446303854229 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 167.85513982375136 -99.95446303854229 617.3999999999999
+ vertex 169.41834729097397 -102.11791458908962 617.3999999999999
+ vertex 168.55395124552817 -100.04646330756181 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 168.55395124552817 -100.04646330756181 617.3999999999999
+ vertex 169.41834729097397 -102.11791458908962 617.3999999999999
+ vertex 169.252762667305 -99.95446303854229 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 169.252762667305 -99.95446303854229 617.3999999999999
+ vertex 169.41834729097397 -102.11791458908962 617.3999999999999
+ vertex 169.9039512455282 -99.68473189777978 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 169.9039512455282 -99.68473189777978 617.3999999999999
+ vertex 169.41834729097397 -102.11791458908962 617.3999999999999
+ vertex 170.46313955473187 -99.25565161676548 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 170.46313955473187 -99.25565161676548 617.3999999999999
+ vertex 169.41834729097397 -102.11791458908962 617.3999999999999
+ vertex 170.89221983574615 -98.6964633075618 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 170.89221983574615 -98.6964633075618 617.3999999999999
+ vertex 169.41834729097397 -102.11791458908962 617.3999999999999
+ vertex 173.1183472909739 -95.70932660108475 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 173.1183472909739 -95.70932660108475 617.3999999999999
+ vertex 169.41834729097397 -102.11791458908962 617.3999999999999
+ vertex 173.32540252705599 -96.48206726211602 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 173.1183472909739 -95.70932660108475 617.3999999999999
+ vertex 173.32540252705599 -96.48206726211602 617.3999999999999
+ vertex 176.48653621919567 -94.8068230978123 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 173.32540252705599 -96.48206726211602 617.3999999999999
+ vertex 169.41834729097397 -102.11791458908962 617.3999999999999
+ vertex 170.19108795200523 -101.91085935300757 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 176.48653621919567 -94.8068230978123 617.3999999999999
+ vertex 173.32540252705599 -96.48206726211602 617.3999999999999
+ vertex 176.6935914552777 -95.57956375884356 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 176.48653621919567 -94.8068230978123 617.3999999999999
+ vertex 176.6935914552777 -95.57956375884356 617.3999999999999
+ vertex 177.50369350672102 -93.0450549965294 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 178.56779512185878 -99.20197693469471 617.3999999999999
+ vertex 178.45535955656058 -96.59672104636894 617.3999999999999
+ vertex 177.3553595565606 -98.5019769346947 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 178.45535955656058 -96.59672104636894 617.3999999999999
+ vertex 178.56779512185878 -99.20197693469471 617.3999999999999
+ vertex 178.79483892288278 -96.03694648010568 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 178.79483892288278 -96.03694648010568 617.3999999999999
+ vertex 178.56779512185878 -99.20197693469471 617.3999999999999
+ vertex 179.2089493950468 -96.09146515804319 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 179.2089493950468 -96.09146515804319 617.3999999999999
+ vertex 178.56779512185878 -99.20197693469471 617.3999999999999
+ vertex 179.62305986721086 -96.0369464801057 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 179.62305986721086 -96.0369464801057 617.3999999999999
+ vertex 178.56779512185878 -99.20197693469471 617.3999999999999
+ vertex 180.00894939504684 -95.87710580409829 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 180.00894939504684 -95.87710580409829 617.3999999999999
+ vertex 178.56779512185878 -99.20197693469471 617.3999999999999
+ vertex 180.3403202449453 -95.62283600794163 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 180.3403202449453 -95.62283600794163 617.3999999999999
+ vertex 178.56779512185878 -99.20197693469471 617.3999999999999
+ vertex 180.59459004110192 -95.29146515804317 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 180.59459004110192 -95.29146515804317 617.3999999999999
+ vertex 178.56779512185878 -99.20197693469471 617.3999999999999
+ vertex 181.71420528337256 -93.55223467350186 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 181.71420528337256 -93.55223467350186 617.3999999999999
+ vertex 178.56779512185878 -99.20197693469471 617.3999999999999
+ vertex 178.7677951218588 -98.85556677318094 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 181.71420528337256 -93.55223467350186 617.3999999999999
+ vertex 178.7677951218588 -98.85556677318094 617.3999999999999
+ vertex 181.8141057058772 -93.79341562839934 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 181.8141057058772 -93.79341562839934 617.3999999999999
+ vertex 178.7677951218588 -98.85556677318094 617.3999999999999
+ vertex 179.11420528337257 -99.05556677318094 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 181.8141057058772 -93.79341562839934 617.3999999999999
+ vertex 179.11420528337257 -99.05556677318094 617.3999999999999
+ vertex 181.84817987958814 -94.05223467350186 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 181.84817987958814 -94.05223467350186 617.3999999999999
+ vertex 179.11420528337257 -99.05556677318094 617.3999999999999
+ vertex 181.81410570587718 -94.31105371860438 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 181.81410570587718 -94.31105371860438 617.3999999999999
+ vertex 179.11420528337257 -99.05556677318094 617.3999999999999
+ vertex 181.71420528337256 -94.55223467350186 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 177.50369350672102 -93.0450549965294 617.3999999999999
+ vertex 176.2984376183953 -90.7326194312312 617.3999999999999
+ vertex 175.59843761839528 -91.9450549965294 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 176.2984376183953 -90.7326194312312 617.3999999999999
+ vertex 177.50369350672102 -93.0450549965294 617.3999999999999
+ vertex 176.64484777990907 -90.9326194312312 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 176.64484777990907 -90.9326194312312 617.3999999999999
+ vertex 177.50369350672102 -93.0450549965294 617.3999999999999
+ vertex 176.8448477799091 -90.58620926971743 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 176.8448477799091 -90.58620926971743 617.3999999999999
+ vertex 177.50369350672102 -93.0450549965294 617.3999999999999
+ vertex 179.2089493950468 -92.89146515804318 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 176.8448477799091 -90.58620926971743 617.3999999999999
+ vertex 179.2089493950468 -92.89146515804318 617.3999999999999
+ vertex 179.62305986721083 -92.94598383598067 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 176.8448477799091 -90.58620926971743 617.3999999999999
+ vertex 179.62305986721083 -92.94598383598067 617.3999999999999
+ vertex 181.34817987958814 -93.18620926971742 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 179.2089493950468 -92.89146515804318 617.3999999999999
+ vertex 177.50369350672102 -93.0450549965294 617.3999999999999
+ vertex 178.79483892288275 -92.94598383598067 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 178.79483892288275 -92.94598383598067 617.3999999999999
+ vertex 177.50369350672102 -93.0450549965294 617.3999999999999
+ vertex 178.4089493950468 -93.10582451198808 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 178.4089493950468 -93.10582451198808 617.3999999999999
+ vertex 177.50369350672102 -93.0450549965294 617.3999999999999
+ vertex 178.07757854514833 -93.36009430814471 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 178.07757854514833 -93.36009430814471 617.3999999999999
+ vertex 177.50369350672102 -93.0450549965294 617.3999999999999
+ vertex 177.82330874899168 -93.6914651580432 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 177.82330874899168 -93.6914651580432 617.3999999999999
+ vertex 177.50369350672102 -93.0450549965294 617.3999999999999
+ vertex 176.6935914552777 -95.57956375884356 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 181.34817987958814 -93.18620926971742 617.3999999999999
+ vertex 179.62305986721083 -92.94598383598067 617.3999999999999
+ vertex 180.00894939504678 -93.10582451198808 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 181.34817987958814 -93.18620926971742 617.3999999999999
+ vertex 180.00894939504678 -93.10582451198808 617.3999999999999
+ vertex 180.34032024494527 -93.36009430814468 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 181.34817987958814 -93.18620926971742 617.3999999999999
+ vertex 180.34032024494527 -93.36009430814468 617.3999999999999
+ vertex 180.5945900411019 -93.69146515804317 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 181.34817987958814 -93.18620926971742 617.3999999999999
+ vertex 180.5945900411019 -93.69146515804317 617.3999999999999
+ vertex 180.7544307171093 -94.07735468587913 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 181.34817987958814 -93.18620926971742 617.3999999999999
+ vertex 180.7544307171093 -94.07735468587913 617.3999999999999
+ vertex 180.8089493950468 -94.49146515804317 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 181.34817987958814 -93.18620926971742 617.3999999999999
+ vertex 180.8089493950468 -94.49146515804317 617.3999999999999
+ vertex 181.5552866607747 -93.34512789231532 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 181.5552866607747 -93.34512789231532 617.3999999999999
+ vertex 180.8089493950468 -94.49146515804317 617.3999999999999
+ vertex 180.7544307171093 -94.9055756302072 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 181.5552866607747 -93.34512789231532 617.3999999999999
+ vertex 180.7544307171093 -94.9055756302072 617.3999999999999
+ vertex 181.71420528337256 -93.55223467350186 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 181.71420528337256 -93.55223467350186 617.3999999999999
+ vertex 180.7544307171093 -94.9055756302072 617.3999999999999
+ vertex 180.59459004110192 -95.29146515804317 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 176.6935914552777 -95.57956375884356 617.3999999999999
+ vertex 177.6634680729843 -94.07735468587917 617.3999999999999
+ vertex 177.82330874899168 -93.6914651580432 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 177.6634680729843 -94.07735468587917 617.3999999999999
+ vertex 176.6935914552777 -95.57956375884356 617.3999999999999
+ vertex 177.60894939504678 -94.4914651580432 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 177.60894939504678 -94.4914651580432 617.3999999999999
+ vertex 176.6935914552777 -95.57956375884356 617.3999999999999
+ vertex 177.6634680729843 -94.90557563020724 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 177.6634680729843 -94.90557563020724 617.3999999999999
+ vertex 176.6935914552777 -95.57956375884356 617.3999999999999
+ vertex 177.8233087489917 -95.2914651580432 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 177.8233087489917 -95.2914651580432 617.3999999999999
+ vertex 176.6935914552777 -95.57956375884356 617.3999999999999
+ vertex 178.45535955656058 -96.59672104636894 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 177.8233087489917 -95.2914651580432 617.3999999999999
+ vertex 178.45535955656058 -96.59672104636894 617.3999999999999
+ vertex 178.07757854514833 -95.62283600794169 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 178.07757854514833 -95.62283600794169 617.3999999999999
+ vertex 178.45535955656058 -96.59672104636894 617.3999999999999
+ vertex 178.40894939504682 -95.87710580409828 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 178.40894939504682 -95.87710580409828 617.3999999999999
+ vertex 178.45535955656058 -96.59672104636894 617.3999999999999
+ vertex 178.79483892288278 -96.03694648010568 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 160.41431103577867 -99.11336285628003 617.3999999999999
+ vertex 160.6213662718607 -99.8861035173113 617.3999999999999
+ vertex 163.78249996400035 -98.21085935300758 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 160.6213662718607 -99.8861035173113 617.3999999999999
+ vertex 160.41431103577867 -99.11336285628003 617.3999999999999
+ vertex 159.6042089843353 -101.6478716185942 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 163.78249996400035 -98.21085935300758 617.3999999999999
+ vertex 160.6213662718607 -99.8861035173113 617.3999999999999
+ vertex 163.9895552000824 -98.98360001403886 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 163.78249996400035 -98.21085935300758 617.3999999999999
+ vertex 163.9895552000824 -98.98360001403886 617.3999999999999
+ vertex 166.91681453905113 -92.78206726211604 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 166.91681453905113 -92.78206726211604 617.3999999999999
+ vertex 163.9895552000824 -98.98360001403886 617.3999999999999
+ vertex 167.6895552000824 -92.575012026034 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 167.6895552000824 -92.575012026034 617.3999999999999
+ vertex 163.9895552000824 -98.98360001403886 617.3999999999999
+ vertex 166.2156826553102 -95.99646330756181 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 167.6895552000824 -92.575012026034 617.3999999999999
+ vertex 166.2156826553102 -95.99646330756181 617.3999999999999
+ vertex 166.6447629363245 -95.43727499835813 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 167.6895552000824 -92.575012026034 617.3999999999999
+ vertex 166.6447629363245 -95.43727499835813 617.3999999999999
+ vertex 167.20395124552817 -95.00819471734383 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 167.6895552000824 -92.575012026034 617.3999999999999
+ vertex 167.20395124552817 -95.00819471734383 617.3999999999999
+ vertex 167.8551398237514 -94.73846357658132 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 167.6895552000824 -92.575012026034 617.3999999999999
+ vertex 167.8551398237514 -94.73846357658132 617.3999999999999
+ vertex 168.55395124552817 -94.6464633075618 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 167.6895552000824 -92.575012026034 617.3999999999999
+ vertex 168.55395124552817 -94.6464633075618 617.3999999999999
+ vertex 169.252762667305 -94.73846357658132 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 167.6895552000824 -92.575012026034 617.3999999999999
+ vertex 169.252762667305 -94.73846357658132 617.3999999999999
+ vertex 173.1183472909739 -95.70932660108475 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 173.1183472909739 -95.70932660108475 617.3999999999999
+ vertex 169.252762667305 -94.73846357658132 617.3999999999999
+ vertex 169.9039512455282 -95.00819471734383 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 173.1183472909739 -95.70932660108475 617.3999999999999
+ vertex 169.9039512455282 -95.00819471734383 617.3999999999999
+ vertex 170.46313955473187 -95.43727499835813 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 173.1183472909739 -95.70932660108475 617.3999999999999
+ vertex 170.46313955473187 -95.43727499835813 617.3999999999999
+ vertex 170.89221983574618 -95.99646330756181 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 173.1183472909739 -95.70932660108475 617.3999999999999
+ vertex 170.89221983574618 -95.99646330756181 617.3999999999999
+ vertex 171.16195097650868 -96.64765188578501 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 173.1183472909739 -95.70932660108475 617.3999999999999
+ vertex 171.16195097650868 -96.64765188578501 617.3999999999999
+ vertex 171.25395124552816 -97.3464633075618 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 173.1183472909739 -95.70932660108475 617.3999999999999
+ vertex 171.25395124552816 -97.3464633075618 617.3999999999999
+ vertex 171.16195097650865 -98.04527472933862 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 173.1183472909739 -95.70932660108475 617.3999999999999
+ vertex 171.16195097650865 -98.04527472933862 617.3999999999999
+ vertex 170.89221983574615 -98.6964633075618 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 166.91681453905113 -92.78206726211604 617.3999999999999
+ vertex 166.78705169680995 -89.20682309781228 617.3999999999999
+ vertex 166.01431103577866 -89.41387833389432 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 166.78705169680995 -89.20682309781228 617.3999999999999
+ vertex 166.91681453905113 -92.78206726211604 617.3999999999999
+ vertex 167.6895552000824 -92.575012026034 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 169.70946487266107 -88.5450549965294 617.3999999999999
+ vertex 170.0630547111473 -87.13261943123119 617.3999999999999
+ vertex 167.80420898433533 -87.44505499652941 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 170.0630547111473 -87.13261943123119 617.3999999999999
+ vertex 169.70946487266107 -88.5450549965294 617.3999999999999
+ vertex 170.4094648726611 -87.3326194312312 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 164.31331244995442 -85.89146515804319 617.3999999999999
+ vertex 165.51854165657076 -84.08630884721279 617.3999999999999
+ vertex 165.25972261146822 -84.05223467350184 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 165.51854165657076 -84.08630884721279 617.3999999999999
+ vertex 164.31331244995442 -85.89146515804319 617.3999999999999
+ vertex 164.56758224611104 -85.5600943081447 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 165.51854165657076 -84.08630884721279 617.3999999999999
+ vertex 164.56758224611104 -85.5600943081447 617.3999999999999
+ vertex 164.89895309600954 -85.30582451198808 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 165.51854165657076 -84.08630884721279 617.3999999999999
+ vertex 164.89895309600954 -85.30582451198808 617.3999999999999
+ vertex 165.75972261146822 -84.18620926971741 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 165.75972261146822 -84.18620926971741 617.3999999999999
+ vertex 164.89895309600954 -85.30582451198808 617.3999999999999
+ vertex 165.2848426238455 -85.14598383598067 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 165.75972261146822 -84.18620926971741 617.3999999999999
+ vertex 165.2848426238455 -85.14598383598067 617.3999999999999
+ vertex 165.69895309600955 -85.09146515804318 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 165.75972261146822 -84.18620926971741 617.3999999999999
+ vertex 165.69895309600955 -85.09146515804318 617.3999999999999
+ vertex 166.11306356817357 -85.14598383598066 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 165.75972261146822 -84.18620926971741 617.3999999999999
+ vertex 166.11306356817357 -85.14598383598066 617.3999999999999
+ vertex 170.2630547111473 -86.7862092697174 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 170.2630547111473 -86.7862092697174 617.3999999999999
+ vertex 166.11306356817357 -85.14598383598066 617.3999999999999
+ vertex 166.49895309600953 -85.30582451198806 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 170.2630547111473 -86.7862092697174 617.3999999999999
+ vertex 166.49895309600953 -85.30582451198806 617.3999999999999
+ vertex 166.83032394590802 -85.56009430814467 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 170.2630547111473 -86.7862092697174 617.3999999999999
+ vertex 166.83032394590802 -85.56009430814467 617.3999999999999
+ vertex 167.08459374206464 -85.89146515804318 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 170.2630547111473 -86.7862092697174 617.3999999999999
+ vertex 167.08459374206464 -85.89146515804318 617.3999999999999
+ vertex 167.24443441807207 -86.27735468587913 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 170.2630547111473 -86.7862092697174 617.3999999999999
+ vertex 167.24443441807207 -86.27735468587913 617.3999999999999
+ vertex 167.29895309600957 -86.69146515804317 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 170.2630547111473 -86.7862092697174 617.3999999999999
+ vertex 167.29895309600957 -86.69146515804317 617.3999999999999
+ vertex 167.24443441807207 -87.1055756302072 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 170.2630547111473 -86.7862092697174 617.3999999999999
+ vertex 167.24443441807207 -87.1055756302072 617.3999999999999
+ vertex 167.08459374206464 -87.49146515804317 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 170.2630547111473 -86.7862092697174 617.3999999999999
+ vertex 167.08459374206464 -87.49146515804317 617.3999999999999
+ vertex 167.80420898433533 -87.44505499652941 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 167.80420898433533 -87.44505499652941 617.3999999999999
+ vertex 167.08459374206464 -87.49146515804317 617.3999999999999
+ vertex 166.01431103577866 -89.41387833389432 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 167.80420898433533 -87.44505499652941 617.3999999999999
+ vertex 166.01431103577866 -89.41387833389432 617.3999999999999
+ vertex 166.78705169680995 -89.20682309781228 617.3999999999999
+ endloop
+endfacet
+facet normal -3.598955634993343e-19 -1.7942835350329497e-19 1.0
+ outer loop
+ vertex 170.2630547111473 -86.7862092697174 617.3999999999999
+ vertex 167.80420898433533 -87.44505499652941 617.3999999999999
+ vertex 170.0630547111473 -87.13261943123119 617.3999999999999
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 162.61050098361724 -87.02607784958096 76.89991414077534
+ vertex 162.4032635063062 -86.86738434135522 76.89991962967
+ vertex 162.51732844331508 -86.93308942972997 76.89991965080296
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 162.4607480731671 -86.90042414096168 76.8999196506057
+ vertex 162.51732844331508 -86.93308942972997 76.89991965080296
+ vertex 162.4032635063062 -86.86738434135522 76.89991962967
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 156.4054276423766 -97.26079109268794 76.89797173010349
+ vertex 152.56426317563307 -95.04318901294695 76.89797171671195
+ vertex 156.46094137065018 -97.29284058193514 76.89797173029706
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 153.3141810202773 -93.74410347689079 76.89821520675046
+ vertex 156.46094137065018 -97.29284058193514 76.89797173029706
+ vertex 152.56426317563307 -95.04318901294695 76.89797171671195
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 156.51961561508898 -97.32619913097159 76.89797180298153
+ vertex 156.46094137065018 -97.29284058193514 76.89797173029706
+ vertex 153.3141810202773 -93.74410347689079 76.89821520675046
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 156.6468415729909 -97.35982442234221 76.89797740205476
+ vertex 156.51961561508898 -97.32619913097159 76.89797180298153
+ vertex 153.3141810202773 -93.74410347689079 76.89821520675046
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 156.77843527730255 -97.35937545876124 76.8979881457542
+ vertex 156.6468415729909 -97.35982442234221 76.89797740205476
+ vertex 153.3141810202773 -93.74410347689079 76.89821520675046
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 156.90542883454373 -97.32488283635485 76.8980033019159
+ vertex 156.77843527730255 -97.35937545876124 76.8979881457542
+ vertex 153.3141810202773 -93.74410347689079 76.89821520675046
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 157.01916784365534 -97.25869717033821 76.89802183767264
+ vertex 156.90542883454373 -97.32488283635485 76.8980033019159
+ vertex 153.3141810202773 -93.74410347689079 76.89821520675046
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 157.1119011791289 -97.16532890447337 76.89804248984237
+ vertex 157.01916784365534 -97.25869717033821 76.89802183767264
+ vertex 153.3141810202773 -93.74410347689079 76.89821520675046
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 157.1439506683706 -97.10981517620934 76.89805289515205
+ vertex 157.1119011791289 -97.16532890447337 76.89804248984237
+ vertex 153.3141810202773 -93.74410347689079 76.89821520675046
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 157.17730921740113 -97.05114093178078 76.89806385101241
+ vertex 157.1439506683706 -97.10981517620934 76.89805289515205
+ vertex 153.3141810202773 -93.74410347689079 76.89821520675046
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 162.61110819024844 -87.64001380878855 76.89982788353065
+ vertex 157.17730921740113 -97.05114093178078 76.89806385101241
+ vertex 153.3141810202773 -93.74410347689079 76.89821520675046
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 157.8136970683922 -85.94957470403226 76.89967614989769
+ vertex 162.61110819024844 -87.64001380878855 76.89982788353065
+ vertex 153.3141810202773 -93.74410347689079 76.89821520675046
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 156.9476400450679 -85.44962947468112 76.89967613963292
+ vertex 157.8136970683922 -85.94957470403226 76.89967614989769
+ vertex 153.3141810202773 -93.74410347689079 76.89821520675046
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 158.5636412860835 -84.65057741892323 76.89991962967062
+ vertex 162.61110819024844 -87.64001380878855 76.89982788353065
+ vertex 157.8136970683922 -85.94957470403226 76.89967614989769
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 162.64375656697464 -87.58342367446073 76.89983848876892
+ vertex 162.61110819024844 -87.64001380878855 76.89982788353065
+ vertex 158.5636412860835 -84.65057741892323 76.89991962967062
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 162.67681327861195 -87.52594887179937 76.89984925151481
+ vertex 162.64375656697464 -87.58342367446073 76.89983848876892
+ vertex 158.5636412860835 -84.65057741892323 76.89991962967062
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 162.7107573423045 -87.39876487505593 76.89986988593273
+ vertex 162.67681327861195 -87.52594887179937 76.89984925151481
+ vertex 158.5636412860835 -84.65057741892323 76.89991962967062
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 162.71062714948076 -87.26712919775495 76.89988838058375
+ vertex 162.7107573423045 -87.39876487505593 76.89986988593273
+ vertex 158.5636412860835 -84.65057741892323 76.89991962967062
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 162.67643157256637 -87.14001259376604 76.89990347508557
+ vertex 162.71062714948076 -87.26712919775495 76.89988838058375
+ vertex 158.5636412860835 -84.65057741892323 76.89991962967062
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 162.61050098361724 -87.02607784958096 76.89991414077534
+ vertex 162.67643157256637 -87.14001259376604 76.89990347508557
+ vertex 158.5636412860835 -84.65057741892323 76.89991962967062
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 162.4032635063062 -86.86738434135522 76.89991962967
+ vertex 162.61050098361724 -87.02607784958096 76.89991414077534
+ vertex 158.5636412860835 -84.65057741892323 76.89991962967062
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 150.45394434941986 -93.82484820550569 76.8979717093563
+ vertex 150.39869844570052 -93.79295333819499 76.89797170916292
+ vertex 151.69817047976142 -94.5431716405479 76.89797171369364
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 150.3402520232914 -93.75860272109614 76.89797179443248
+ vertex 151.69817047976142 -94.5431716405479 76.89797171369364
+ vertex 150.39869844570052 -93.79295333819499 76.89797170916292
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 152.448123996953 -93.24415824753966 76.8982151964857
+ vertex 151.69817047976142 -94.5431716405479 76.89797171369364
+ vertex 150.3402520232914 -93.75860272109614 76.89797179443248
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 150.2475792622471 -93.66518875755123 76.89797740484721
+ vertex 152.448123996953 -93.24415824753966 76.8982151964857
+ vertex 150.3402520232914 -93.75860272109614 76.89797179443248
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 150.18224156180347 -93.55097232211224 76.8979881582568
+ vertex 152.448123996953 -93.24415824753966 76.8982151964857
+ vertex 150.2475792622471 -93.66518875755123 76.89797740484721
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 150.1486915782698 -93.42373707610298 76.89800332183742
+ vertex 152.448123996953 -93.24415824753966 76.8982151964857
+ vertex 150.18224156180347 -93.55097232211224 76.8979881582568
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 150.14921568758027 -93.2921538912727 76.89802186221276
+ vertex 152.448123996953 -93.24415824753966 76.8982151964857
+ vertex 150.1486915782698 -93.42373707610298 76.89800332183742
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 150.1837781725514 -93.1651899442161 76.8980425158903
+ vertex 152.448123996953 -93.24415824753966 76.8982151964857
+ vertex 150.14921568758027 -93.2921538912727 76.89802186221276
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 150.21567303985657 -93.1099440405062 76.8980528710005
+ vertex 152.448123996953 -93.24415824753966 76.8982151964857
+ vertex 150.1837781725514 -93.1651899442161 76.8980425158903
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 150.2500236569494 -93.05149761810729 76.89806387535346
+ vertex 152.448123996953 -93.24415824753966 76.8982151964857
+ vertex 150.21567303985657 -93.1099440405062 76.8980528710005
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 155.68254233013423 -83.64072484733985 76.89982775414383
+ vertex 152.448123996953 -93.24415824753966 76.8982151964857
+ vertex 150.2500236569494 -93.05149761810729 76.89806387535346
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 153.3141810202773 -93.74410347689079 76.89821520675046
+ vertex 152.448123996953 -93.24415824753966 76.8982151964857
+ vertex 155.68254233013423 -83.64072484733985 76.89982775414383
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 156.9476400450679 -85.44962947468112 76.89967613963292
+ vertex 153.3141810202773 -93.74410347689079 76.89821520675046
+ vertex 155.68254233013423 -83.64072484733985 76.89982775414383
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 157.6975578904644 -84.15054393732176 76.8999196296717
+ vertex 156.9476400450679 -85.44962947468112 76.89967613963292
+ vertex 155.68254233013423 -83.64072484733985 76.89982775414383
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 155.71549585049695 -83.58356230294731 76.89983846461737
+ vertex 157.6975578904644 -84.15054393732176 76.8999196296717
+ vertex 155.68254233013423 -83.64072484733985 76.89982775414383
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 155.74832782414913 -83.52669321370992 76.89984912397219
+ vertex 157.6975578904644 -84.15054393732176 76.8999196296717
+ vertex 155.71549585049695 -83.58356230294731 76.89983846461737
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 155.84138529034598 -83.43357365251846 76.89986976748683
+ vertex 157.6975578904644 -84.15054393732176 76.8999196296717
+ vertex 155.74832782414913 -83.52669321370992 76.89984912397219
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 155.9553730161882 -83.36771210797298 76.89988827786468
+ vertex 157.6975578904644 -84.15054393732176 76.8999196296717
+ vertex 155.84138529034598 -83.43357365251846 76.89986976748683
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 156.0825229265333 -83.33359693549322 76.8999033936534
+ vertex 157.6975578904644 -84.15054393732176 76.8999196296717
+ vertex 155.9553730161882 -83.36771210797298 76.89988827786468
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 156.2141699651163 -83.33355302770552 76.89991408474093
+ vertex 157.6975578904644 -84.15054393732176 76.8999196296717
+ vertex 156.0825229265333 -83.33359693549322 76.8999033936534
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 156.34134260381495 -83.36758337685306 76.899919622544
+ vertex 157.6975578904644 -84.15054393732176 76.8999196296717
+ vertex 156.2141699651163 -83.33355302770552 76.89991408474093
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 156.39850514821737 -83.40053689722153 76.8999196294739
+ vertex 157.6975578904644 -84.15054393732176 76.8999196296717
+ vertex 156.34134260381495 -83.36758337685306 76.899919622544
+ endloop
+endfacet
+facet normal 1.0656126774817588e-06 1.8456953068692433e-06 -0.9999999999977288
+ outer loop
+ vertex 156.4553742374646 -83.43336887087936 76.89991962967134
+ vertex 157.6975578904644 -84.15054393732176 76.8999196296717
+ vertex 156.39850514821737 -83.40053689722153 76.8999196294739
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 150.4534328532921 -93.82573414279042 556.8998883596452
+ vertex 151.69765898363363 -94.54405757783267 556.8998883639817
+ vertex 150.3981869495728 -93.79383927547973 556.8998883594511
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 152.44761250082524 -93.24504418482444 556.9001318467738
+ vertex 150.3981869495728 -93.79383927547973 556.8998883594511
+ vertex 151.69765898363363 -94.54405757783267 556.8998883639817
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 150.33974052716368 -93.75948865838089 556.8998884447207
+ vertex 150.3981869495728 -93.79383927547973 556.8998883594511
+ vertex 152.44761250082524 -93.24504418482444 556.9001318467738
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 150.2470677661193 -93.66607469483597 556.8998940551353
+ vertex 150.33974052716368 -93.75948865838089 556.8998884447207
+ vertex 152.44761250082524 -93.24504418482444 556.9001318467738
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 150.1817300656757 -93.55185825939698 556.899904808545
+ vertex 150.2470677661193 -93.66607469483597 556.8998940551353
+ vertex 152.44761250082524 -93.24504418482444 556.9001318467738
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 150.14818008214203 -93.42462301338776 556.8999199721255
+ vertex 150.1817300656757 -93.55185825939698 556.899904808545
+ vertex 152.44761250082524 -93.24504418482444 556.9001318467738
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 150.1487041914525 -93.29303982855744 556.8999385125009
+ vertex 150.14818008214203 -93.42462301338776 556.8999199721255
+ vertex 152.44761250082524 -93.24504418482444 556.9001318467738
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 150.18326667642364 -93.16607588150083 556.8999591661792
+ vertex 150.1487041914525 -93.29303982855744 556.8999385125009
+ vertex 152.44761250082524 -93.24504418482444 556.9001318467738
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 150.2151615437288 -93.110829977791 556.8999695212887
+ vertex 150.18326667642364 -93.16607588150083 556.8999591661792
+ vertex 152.44761250082524 -93.24504418482444 556.9001318467738
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 150.24951216082167 -93.05238355539204 556.8999805256424
+ vertex 150.2151615437288 -93.110829977791 556.8999695212887
+ vertex 152.44761250082524 -93.24504418482444 556.9001318467738
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 155.68203083400647 -83.6416107846246 556.9017444044335
+ vertex 150.24951216082167 -93.05238355539204 556.8999805256424
+ vertex 152.44761250082524 -93.24504418482444 556.9001318467738
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 153.3136695241495 -93.74498941417556 556.9001318570386
+ vertex 155.68203083400647 -83.6416107846246 556.9017444044335
+ vertex 152.44761250082524 -93.24504418482444 556.9001318467738
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 156.94712854894016 -85.45051541196587 556.9015927899218
+ vertex 155.68203083400647 -83.6416107846246 556.9017444044335
+ vertex 153.3136695241495 -93.74498941417556 556.9001318570386
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 157.69704639433664 -84.1514298746065 556.9018362799605
+ vertex 155.68203083400647 -83.6416107846246 556.9017444044335
+ vertex 156.94712854894016 -85.45051541196587 556.9015927899218
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 155.71498435436922 -83.58444824023205 556.901755114907
+ vertex 155.68203083400647 -83.6416107846246 556.9017444044335
+ vertex 157.69704639433664 -84.1514298746065 556.9018362799605
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 155.7478163280214 -83.52757915099465 556.9017657742611
+ vertex 155.71498435436922 -83.58444824023205 556.901755114907
+ vertex 157.69704639433664 -84.1514298746065 556.9018362799605
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 155.84087379421823 -83.43445958980323 556.9017864177757
+ vertex 155.7478163280214 -83.52757915099465 556.9017657742611
+ vertex 157.69704639433664 -84.1514298746065 556.9018362799605
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 155.95486152006043 -83.36859804525773 556.9018049281536
+ vertex 155.84087379421823 -83.43445958980323 556.9017864177757
+ vertex 157.69704639433664 -84.1514298746065 556.9018362799605
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 156.08201143040554 -83.33448287277795 556.9018200439432
+ vertex 155.95486152006043 -83.36859804525773 556.9018049281536
+ vertex 157.69704639433664 -84.1514298746065 556.9018362799605
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 156.2136584689885 -83.33443896499027 556.9018307350299
+ vertex 156.08201143040554 -83.33448287277795 556.9018200439432
+ vertex 157.69704639433664 -84.1514298746065 556.9018362799605
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 156.3408311076872 -83.36846931413783 556.9018362728336
+ vertex 156.2136584689885 -83.33443896499027 556.9018307350299
+ vertex 157.69704639433664 -84.1514298746065 556.9018362799605
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 156.3979936520896 -83.40142283450628 556.9018362797628
+ vertex 156.3408311076872 -83.36846931413783 556.9018362728336
+ vertex 157.69704639433664 -84.1514298746065 556.9018362799605
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 156.45486274133685 -83.43425480816413 556.9018362799611
+ vertex 156.3979936520896 -83.40142283450628 556.9018362797628
+ vertex 157.69704639433664 -84.1514298746065 556.9018362799605
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 152.56375167950532 -95.0440749502317 556.8998883670008
+ vertex 156.4049161462488 -97.26167702997267 556.8998883803916
+ vertex 153.3136695241495 -93.74498941417556 556.9001318570386
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 156.46042987452242 -97.29372651921987 556.8998883805853
+ vertex 153.3136695241495 -93.74498941417556 556.9001318570386
+ vertex 156.4049161462488 -97.26167702997267 556.8998883803916
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 156.51910411896122 -97.32708506825634 556.8998884532696
+ vertex 153.3136695241495 -93.74498941417556 556.9001318570386
+ vertex 156.46042987452242 -97.29372651921987 556.8998883805853
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 156.64633007686317 -97.36071035962696 556.8998940523436
+ vertex 153.3136695241495 -93.74498941417556 556.9001318570386
+ vertex 156.51910411896122 -97.32708506825634 556.8998884532696
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 156.77792378117482 -97.36026139604598 556.8999047960432
+ vertex 153.3136695241495 -93.74498941417556 556.9001318570386
+ vertex 156.64633007686317 -97.36071035962696 556.8998940523436
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 156.90491733841597 -97.3257687736396 556.8999199522049
+ vertex 153.3136695241495 -93.74498941417556 556.9001318570386
+ vertex 156.77792378117482 -97.36026139604598 556.8999047960432
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 157.01865634752755 -97.25958310762296 556.8999384879608
+ vertex 153.3136695241495 -93.74498941417556 556.9001318570386
+ vertex 156.90491733841597 -97.3257687736396 556.8999199522049
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 157.11138968300114 -97.16621484175813 556.8999591401305
+ vertex 153.3136695241495 -93.74498941417556 556.9001318570386
+ vertex 157.01865634752755 -97.25958310762296 556.8999384879608
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 157.1434391722428 -97.1107011134941 556.899969545441
+ vertex 153.3136695241495 -93.74498941417556 556.9001318570386
+ vertex 157.11138968300114 -97.16621484175813 556.8999591401305
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 157.17679772127335 -97.05202686906556 556.8999805013005
+ vertex 153.3136695241495 -93.74498941417556 556.9001318570386
+ vertex 157.1434391722428 -97.1107011134941 556.899969545441
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 162.61059669412066 -87.64089974607334 556.9017445338203
+ vertex 153.3136695241495 -93.74498941417556 556.9001318570386
+ vertex 157.17679772127335 -97.05202686906556 556.8999805013005
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 157.81318557226444 -85.95046064131701 556.9015928001867
+ vertex 153.3136695241495 -93.74498941417556 556.9001318570386
+ vertex 162.61059669412066 -87.64089974607334 556.9017445338203
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 156.94712854894016 -85.45051541196587 556.9015927899218
+ vertex 153.3136695241495 -93.74498941417556 556.9001318570386
+ vertex 157.81318557226444 -85.95046064131701 556.9015928001867
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 158.56312978995575 -84.65146335620798 556.9018362799603
+ vertex 157.81318557226444 -85.95046064131701 556.9015928001867
+ vertex 162.61059669412066 -87.64089974607334 556.9017445338203
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 162.64324507084686 -87.58430961174551 556.9017551390587
+ vertex 158.56312978995575 -84.65146335620798 556.9018362799603
+ vertex 162.61059669412066 -87.64089974607334 556.9017445338203
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 162.67630178248416 -87.52683480908411 556.9017659018036
+ vertex 158.56312978995575 -84.65146335620798 556.9018362799603
+ vertex 162.64324507084686 -87.58430961174551 556.9017551390587
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 162.71024584617672 -87.39965081234072 556.9017865362224
+ vertex 158.56312978995575 -84.65146335620798 556.9018362799603
+ vertex 162.67630178248416 -87.52683480908411 556.9017659018036
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 162.71011565335297 -87.26801513503972 556.9018050308727
+ vertex 158.56312978995575 -84.65146335620798 556.9018362799603
+ vertex 162.71024584617672 -87.39965081234072 556.9017865362224
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 162.6759200764386 -87.1408985310508 556.9018201253746
+ vertex 158.56312978995575 -84.65146335620798 556.9018362799603
+ vertex 162.71011565335297 -87.26801513503972 556.9018050308727
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 162.60998948748949 -87.0269637868657 556.901830791065
+ vertex 158.56312978995575 -84.65146335620798 556.9018362799603
+ vertex 162.6759200764386 -87.1408985310508 556.9018201253746
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 162.40275201017843 -86.86827027863997 556.901836279959
+ vertex 158.56312978995575 -84.65146335620798 556.9018362799603
+ vertex 162.60998948748949 -87.0269637868657 556.901830791065
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 162.60998948748949 -87.0269637868657 556.901830791065
+ vertex 162.51681694718732 -86.93397536701475 556.9018363010919
+ vertex 162.40275201017843 -86.86827027863997 556.901836279959
+ endloop
+endfacet
+facet normal -1.0656126774817588e-06 -1.8456953068692433e-06 0.9999999999977288
+ outer loop
+ vertex 162.46023657703935 -86.90131007824642 556.9018363008954
+ vertex 162.40275201017843 -86.86827027863997 556.901836279959
+ vertex 162.51681694718732 -86.93397536701475 556.9018363010919
+ endloop
+endfacet
+facet normal -0.4999838853756217 -0.866034692154271 -0.0001623266904071502
+ outer loop
+ vertex 156.4054276423766 -97.26079109268794 76.89797173010349
+ vertex 156.4049161462488 -97.26167702997267 556.8998883803916
+ vertex 152.56426317563307 -95.04318901294695 76.89797171671195
+ endloop
+endfacet
+facet normal -0.4999838853756217 -0.866034692154271 -0.0001623266904071502
+ outer loop
+ vertex 152.56375167950532 -95.0440749502317 556.8998883670008
+ vertex 152.56426317563307 -95.04318901294695 76.89797171671195
+ vertex 156.4049161462488 -97.26167702997267 556.8998883803916
+ endloop
+endfacet
+facet normal -0.8660570233241695 0.499945229351055 -1.0265637493692698e-08
+ outer loop
+ vertex 152.56375167950532 -95.0440749502317 556.8998883670008
+ vertex 153.3136695241495 -93.74498941417556 556.9001318570386
+ vertex 152.56426317563307 -95.04318901294695 76.89797171671195
+ endloop
+endfacet
+facet normal -0.8660570233241695 0.499945229351055 -1.0265637493692698e-08
+ outer loop
+ vertex 153.3141810202773 -93.74410347689079 76.89821520675046
+ vertex 152.56426317563307 -95.04318901294695 76.89797171671195
+ vertex 153.3136695241495 -93.74498941417556 556.9001318570386
+ endloop
+endfacet
+facet normal -0.49994522276429265 -0.8660570119138851 -0.00016232669011062063
+ outer loop
+ vertex 153.3141810202773 -93.74410347689079 76.89821520675046
+ vertex 153.3136695241495 -93.74498941417556 556.9001318570386
+ vertex 152.448123996953 -93.24415824753966 76.8982151964857
+ endloop
+endfacet
+facet normal -0.49994522276429265 -0.8660570119138851 -0.00016232669011062063
+ outer loop
+ vertex 152.44761250082524 -93.24504418482444 556.9001318467738
+ vertex 152.448123996953 -93.24415824753966 76.8982151964857
+ vertex 153.3136695241495 -93.74498941417556 556.9001318570386
+ endloop
+endfacet
+facet normal 0.8660347035643212 -0.4999838919627894 3.018938274624782e-09
+ outer loop
+ vertex 152.44761250082524 -93.24504418482444 556.9001318467738
+ vertex 151.69765898363363 -94.54405757783267 556.8998883639817
+ vertex 152.448123996953 -93.24415824753966 76.8982151964857
+ endloop
+endfacet
+facet normal 0.8660347035643212 -0.4999838919627894 3.018938274624782e-09
+ outer loop
+ vertex 151.69817047976142 -94.5431716405479 76.89797171369364
+ vertex 152.448123996953 -93.24415824753966 76.8982151964857
+ vertex 151.69765898363363 -94.54405757783267 556.8998883639817
+ endloop
+endfacet
+facet normal -0.4999838853755945 -0.8660346921542866 -0.0001623266904071502
+ outer loop
+ vertex 151.69817047976142 -94.5431716405479 76.89797171369364
+ vertex 151.69765898363363 -94.54405757783267 556.8998883639817
+ vertex 150.45394434941986 -93.82484820550569 76.8979717093563
+ endloop
+endfacet
+facet normal -0.4999838853755945 -0.8660346921542866 -0.0001623266904071502
+ outer loop
+ vertex 150.4534328532921 -93.82573414279042 556.8998883596452
+ vertex 150.45394434941986 -93.82484820550569 76.8979717093563
+ vertex 151.69765898363363 -94.54405757783267 556.8998883639817
+ endloop
+endfacet
+facet normal -0.4999838853762343 -0.8660346921539174 -0.0001623266904071502
+ outer loop
+ vertex 150.45394434941986 -93.82484820550569 76.8979717093563
+ vertex 150.4534328532921 -93.82573414279042 556.8998883596452
+ vertex 150.39869844570052 -93.79295333819499 76.89797170916292
+ endloop
+endfacet
+facet normal -0.4999838853762343 -0.8660346921539174 -0.0001623266904071502
+ outer loop
+ vertex 150.3981869495728 -93.79383927547973 556.8998883594511
+ vertex 150.39869844570052 -93.79295333819499 76.89797170916292
+ vertex 150.4534328532921 -93.82573414279042 556.8998883596452
+ endloop
+endfacet
+facet normal -0.5066953613453927 -0.8621251559041121 -0.00016232181740206695
+ outer loop
+ vertex 150.39869844570052 -93.79295333819499 76.89797170916292
+ vertex 150.3981869495728 -93.79383927547973 556.8998883594511
+ vertex 150.3402520232914 -93.75860272109614 76.89797179443248
+ endloop
+endfacet
+facet normal -0.5066953613453927 -0.8621251559041121 -0.00016232181740206695
+ outer loop
+ vertex 150.33974052716368 -93.75948865838089 556.8998884447207
+ vertex 150.3402520232914 -93.75860272109614 76.89797179443248
+ vertex 150.3981869495728 -93.79383927547973 556.8998883594511
+ endloop
+endfacet
+facet normal -0.7099176199017725 -0.7042847069339206 -0.00015662695715857296
+ outer loop
+ vertex 150.3402520232914 -93.75860272109614 76.89797179443248
+ vertex 150.33974052716368 -93.75948865838089 556.8998884447207
+ vertex 150.2475792622471 -93.66518875755123 76.89797740484721
+ endloop
+endfacet
+facet normal -0.7099176199017725 -0.7042847069339206 -0.00015662695715857296
+ outer loop
+ vertex 150.2470677661193 -93.66607469483597 556.8998940551353
+ vertex 150.2475792622471 -93.66518875755123 76.89797740484721
+ vertex 150.33974052716368 -93.75948865838089 556.8998884447207
+ endloop
+endfacet
+facet normal -0.8680100610556941 -0.4965465881815375 -0.00014025464343150009
+ outer loop
+ vertex 150.2475792622471 -93.66518875755123 76.89797740484721
+ vertex 150.2470677661193 -93.66607469483597 556.8998940551353
+ vertex 150.18224156180347 -93.55097232211224 76.8979881582568
+ endloop
+endfacet
+facet normal -0.8680100610556941 -0.4965465881815375 -0.00014025464343150009
+ outer loop
+ vertex 150.1817300656757 -93.55185825939698 556.899904808545
+ vertex 150.18224156180347 -93.55097232211224 76.8979881582568
+ vertex 150.2470677661193 -93.66607469483597 556.8998940551353
+ endloop
+endfacet
+facet normal -0.9669490524484933 -0.25496963917089577 -0.00011432420753334252
+ outer loop
+ vertex 150.14818008214203 -93.42462301338776 556.8999199721255
+ vertex 150.1486915782698 -93.42373707610298 76.89800332183742
+ vertex 150.1817300656757 -93.55185825939698 556.899904808545
+ endloop
+endfacet
+facet normal -0.9669490524484933 -0.25496963917089577 -0.00011432420753334252
+ outer loop
+ vertex 150.18224156180347 -93.55097232211224 76.8979881582568
+ vertex 150.1817300656757 -93.55185825939698 556.899904808545
+ vertex 150.1486915782698 -93.42373707610298 76.89800332183742
+ endloop
+endfacet
+facet normal -0.9999920642927131 0.003983071025302724 -8.060276562570305e-05
+ outer loop
+ vertex 150.14818008214203 -93.42462301338776 556.8999199721255
+ vertex 150.1487041914525 -93.29303982855744 556.8999385125009
+ vertex 150.1486915782698 -93.42373707610298 76.89800332183742
+ endloop
+endfacet
+facet normal -0.9999920642927131 0.003983071025302724 -8.060276562570305e-05
+ outer loop
+ vertex 150.14921568758027 -93.2921538912727 76.89802186221276
+ vertex 150.1486915782698 -93.42373707610298 76.89800332183742
+ vertex 150.1487041914525 -93.29303982855744 556.8999385125009
+ endloop
+endfacet
+facet normal -0.9648872686613165 0.2626643429594258 -4.138837817004134e-05
+ outer loop
+ vertex 150.18326667642364 -93.16607588150083 556.8999591661792
+ vertex 150.1837781725514 -93.1651899442161 76.8980425158903
+ vertex 150.1487041914525 -93.29303982855744 556.8999385125009
+ endloop
+endfacet
+facet normal -0.9648872686613165 0.2626643429594258 -4.138837817004134e-05
+ outer loop
+ vertex 150.14921568758027 -93.2921538912727 76.89802186221276
+ vertex 150.1487041914525 -93.29303982855744 556.8999385125009
+ vertex 150.1837781725514 -93.1651899442161 76.8980425158903
+ endloop
+endfacet
+facet normal -0.866034703564261 0.4999838919628936 -3.018938255093285e-09
+ outer loop
+ vertex 150.18326667642364 -93.16607588150083 556.8999591661792
+ vertex 150.2151615437288 -93.110829977791 556.8999695212887
+ vertex 150.1837781725514 -93.1651899442161 76.8980425158903
+ endloop
+endfacet
+facet normal -0.866034703564261 0.4999838919628936 -3.018938255093285e-09
+ outer loop
+ vertex 150.21567303985657 -93.1099440405062 76.8980528710005
+ vertex 150.1837781725514 -93.1651899442161 76.8980425158903
+ vertex 150.2151615437288 -93.110829977791 556.8999695212887
+ endloop
+endfacet
+facet normal -0.8621251672642727 0.5066953680151102 1.2577849671949682e-06
+ outer loop
+ vertex 150.24951216082167 -93.05238355539204 556.8999805256424
+ vertex 150.2500236569494 -93.05149761810729 76.89806387535346
+ vertex 150.2151615437288 -93.110829977791 556.8999695212887
+ endloop
+endfacet
+facet normal -0.8621251672642727 0.5066953680151102 1.2577849671949682e-06
+ outer loop
+ vertex 150.21567303985657 -93.1099440405062 76.8980528710005
+ vertex 150.2151615437288 -93.110829977791 556.8999695212887
+ vertex 150.2500236569494 -93.05149761810729 76.89806387535346
+ endloop
+endfacet
+facet normal -0.8660570233241901 0.4999452293510194 -1.0265637500369582e-08
+ outer loop
+ vertex 150.24951216082167 -93.05238355539204 556.8999805256424
+ vertex 155.68203083400647 -83.6416107846246 556.9017444044335
+ vertex 150.2500236569494 -93.05149761810729 76.89806387535346
+ endloop
+endfacet
+facet normal -0.8660570233241901 0.4999452293510194 -1.0265637500369582e-08
+ outer loop
+ vertex 155.68254233013423 -83.64072484733985 76.89982775414383
+ vertex 150.2500236569494 -93.05149761810729 76.89806387535346
+ vertex 155.68203083400647 -83.6416107846246 556.9017444044335
+ endloop
+endfacet
+facet normal -0.866348697676614 0.49943962000828895 -1.050169797230436e-07
+ outer loop
+ vertex 155.68203083400647 -83.6416107846246 556.9017444044335
+ vertex 155.71498435436922 -83.58444824023205 556.901755114907
+ vertex 155.68254233013423 -83.64072484733985 76.89982775414383
+ endloop
+endfacet
+facet normal -0.866348697676614 0.49943962000828895 -1.050169797230436e-07
+ outer loop
+ vertex 155.71549585049695 -83.58356230294731 76.89983846461737
+ vertex 155.68254233013423 -83.64072484733985 76.89982775414383
+ vertex 155.71498435436922 -83.58444824023205 556.901755114907
+ endloop
+endfacet
+facet normal -0.866034703564261 0.4999838919628936 -3.018938255093285e-09
+ outer loop
+ vertex 155.71498435436922 -83.58444824023205 556.901755114907
+ vertex 155.7478163280214 -83.52757915099465 556.9017657742611
+ vertex 155.71549585049695 -83.58356230294731 76.89983846461737
+ endloop
+endfacet
+facet normal -0.866034703564261 0.4999838919628936 -3.018938255093285e-09
+ outer loop
+ vertex 155.74832782414913 -83.52669321370992 76.89984912397219
+ vertex 155.71549585049695 -83.58356230294731 76.89983846461737
+ vertex 155.7478163280214 -83.52757915099465 556.9017657742611
+ endloop
+endfacet
+facet normal -0.7073425802169827 0.7068709022524982 4.196094199893686e-05
+ outer loop
+ vertex 155.84087379421823 -83.43445958980323 556.9017864177757
+ vertex 155.84138529034598 -83.43357365251846 76.89986976748683
+ vertex 155.7478163280214 -83.52757915099465 556.9017657742611
+ endloop
+endfacet
+facet normal -0.7073425802169827 0.7068709022524982 4.196094199893686e-05
+ outer loop
+ vertex 155.74832782414913 -83.52669321370992 76.89984912397219
+ vertex 155.7478163280214 -83.52757915099465 556.9017657742611
+ vertex 155.84138529034598 -83.43357365251846 76.89986976748683
+ endloop
+endfacet
+facet normal -0.5002888131569225 0.8658585894071611 8.111645491291906e-05
+ outer loop
+ vertex 155.84087379421823 -83.43445958980323 556.9017864177757
+ vertex 155.95486152006043 -83.36859804525773 556.9018049281536
+ vertex 155.84138529034598 -83.43357365251846 76.89986976748683
+ endloop
+endfacet
+facet normal -0.5002888131569225 0.8658585894071611 8.111645491291906e-05
+ outer loop
+ vertex 155.9553730161882 -83.36771210797298 76.89988827786468
+ vertex 155.84138529034598 -83.43357365251846 76.89986976748683
+ vertex 155.95486152006043 -83.36859804525773 556.9018049281536
+ endloop
+endfacet
+facet normal -0.2591411910844064 0.9658394431359522 0.0001147440152030761
+ outer loop
+ vertex 155.95486152006043 -83.36859804525773 556.9018049281536
+ vertex 156.08201143040554 -83.33448287277795 556.9018200439432
+ vertex 155.9553730161882 -83.36771210797298 76.89988827786468
+ endloop
+endfacet
+facet normal -0.2591411910844064 0.9658394431359522 0.0001147440152030761
+ outer loop
+ vertex 156.0825229265333 -83.33359693549322 76.8999033936534
+ vertex 155.9553730161882 -83.36771210797298 76.89988827786468
+ vertex 156.08201143040554 -83.33448287277795 556.9018200439432
+ endloop
+endfacet
+facet normal -0.0003335267167290832 0.9999999345025357 0.0001405519602870857
+ outer loop
+ vertex 156.2141699651163 -83.33355302770552 76.89991408474093
+ vertex 156.0825229265333 -83.33359693549322 76.8999033936534
+ vertex 156.2136584689885 -83.33443896499027 556.9018307350299
+ endloop
+endfacet
+facet normal -0.0003335267167290832 0.9999999345025357 0.0001405519602870857
+ outer loop
+ vertex 156.08201143040554 -83.33448287277795 556.9018200439432
+ vertex 156.2136584689885 -83.33443896499027 556.9018307350299
+ vertex 156.0825229265333 -83.33359693549322 76.8999033936534
+ endloop
+endfacet
+facet normal 0.25849686548751427 0.9660120837508631 0.00015678152155038615
+ outer loop
+ vertex 156.34134260381495 -83.36758337685306 76.899919622544
+ vertex 156.2141699651163 -83.33355302770552 76.89991408474093
+ vertex 156.3408311076872 -83.36846931413783 556.9018362728336
+ endloop
+endfacet
+facet normal 0.25849686548751427 0.9660120837508631 0.00015678152155038615
+ outer loop
+ vertex 156.2136584689885 -83.33443896499027 556.9018307350299
+ vertex 156.3408311076872 -83.36846931413783 556.9018362728336
+ vertex 156.2141699651163 -83.33355302770552 76.89991408474093
+ endloop
+endfacet
+facet normal 0.49943961342800497 0.8663486862626051 0.0001623266564649421
+ outer loop
+ vertex 156.39850514821737 -83.40053689722153 76.8999196294739
+ vertex 156.34134260381495 -83.36758337685306 76.899919622544
+ vertex 156.3979936520896 -83.40142283450628 556.9018362797628
+ endloop
+endfacet
+facet normal 0.49943961342800497 0.8663486862626051 0.0001623266564649421
+ outer loop
+ vertex 156.3408311076872 -83.36846931413783 556.9018362728336
+ vertex 156.3979936520896 -83.40142283450628 556.9018362797628
+ vertex 156.34134260381495 -83.36758337685306 76.899919622544
+ endloop
+endfacet
+facet normal 0.4999838853756217 0.866034692154271 0.0001623266904071502
+ outer loop
+ vertex 156.4553742374646 -83.43336887087936 76.89991962967134
+ vertex 156.39850514821737 -83.40053689722153 76.8999196294739
+ vertex 156.45486274133685 -83.43425480816413 556.9018362799611
+ endloop
+endfacet
+facet normal 0.4999838853756217 0.866034692154271 0.0001623266904071502
+ outer loop
+ vertex 156.3979936520896 -83.40142283450628 556.9018362797628
+ vertex 156.45486274133685 -83.43425480816413 556.9018362799611
+ vertex 156.39850514821737 -83.40053689722153 76.8999196294739
+ endloop
+endfacet
+facet normal 0.4999999934125135 0.8660253923745724 0.00016232669043522317
+ outer loop
+ vertex 157.6975578904644 -84.15054393732176 76.8999196296717
+ vertex 156.4553742374646 -83.43336887087936 76.89991962967134
+ vertex 157.69704639433664 -84.1514298746065 556.9018362799605
+ endloop
+endfacet
+facet normal 0.4999999934125135 0.8660253923745724 0.00016232669043522317
+ outer loop
+ vertex 156.45486274133685 -83.43425480816413 556.9018362799611
+ vertex 157.69704639433664 -84.1514298746065 556.9018362799605
+ vertex 156.4553742374646 -83.43336887087936 76.89991962967134
+ endloop
+endfacet
+facet normal 0.8660570233241772 -0.49994522935104174 1.026563749618815e-08
+ outer loop
+ vertex 157.69704639433664 -84.1514298746065 556.9018362799605
+ vertex 156.94712854894016 -85.45051541196587 556.9015927899218
+ vertex 157.6975578904644 -84.15054393732176 76.8999196296717
+ endloop
+endfacet
+facet normal 0.8660570233241772 -0.49994522935104174 1.026563749618815e-08
+ outer loop
+ vertex 156.9476400450679 -85.44962947468112 76.89967613963292
+ vertex 157.6975578904644 -84.15054393732176 76.8999196296717
+ vertex 156.94712854894016 -85.45051541196587 556.9015927899218
+ endloop
+endfacet
+facet normal 0.49994522276429265 0.8660570119138851 0.00016232669011062063
+ outer loop
+ vertex 157.8136970683922 -85.94957470403226 76.89967614989769
+ vertex 156.9476400450679 -85.44962947468112 76.89967613963292
+ vertex 157.81318557226444 -85.95046064131701 556.9015928001867
+ endloop
+endfacet
+facet normal 0.49994522276429265 0.8660570119138851 0.00016232669011062063
+ outer loop
+ vertex 156.94712854894016 -85.45051541196587 556.9015927899218
+ vertex 157.81318557226444 -85.95046064131701 556.9015928001867
+ vertex 156.9476400450679 -85.44962947468112 76.89967613963292
+ endloop
+endfacet
+facet normal -0.866034703564261 0.4999838919628936 -3.018938255093285e-09
+ outer loop
+ vertex 158.56312978995575 -84.65146335620798 556.9018362799603
+ vertex 158.5636412860835 -84.65057741892323 76.89991962967062
+ vertex 157.81318557226444 -85.95046064131701 556.9015928001867
+ endloop
+endfacet
+facet normal -0.866034703564261 0.4999838919628936 -3.018938255093285e-09
+ outer loop
+ vertex 157.8136970683922 -85.94957470403226 76.89967614989769
+ vertex 157.81318557226444 -85.95046064131701 556.9015928001867
+ vertex 158.5636412860835 -84.65057741892323 76.89991962967062
+ endloop
+endfacet
+facet normal 0.49999999341251655 0.8660253923745707 0.00016232669043522317
+ outer loop
+ vertex 162.4032635063062 -86.86738434135522 76.89991962967
+ vertex 158.5636412860835 -84.65057741892323 76.89991962967062
+ vertex 162.40275201017843 -86.86827027863997 556.901836279959
+ endloop
+endfacet
+facet normal 0.49999999341251655 0.8660253923745707 0.00016232669043522317
+ outer loop
+ vertex 158.56312978995575 -84.65146335620798 556.9018362799603
+ vertex 162.40275201017843 -86.86827027863997 556.901836279959
+ vertex 158.5636412860835 -84.65057741892323 76.89991962967062
+ endloop
+endfacet
+facet normal 0.49831439203042943 0.8669963900417861 0.00016232638330655633
+ outer loop
+ vertex 162.4607480731671 -86.90042414096168 76.8999196506057
+ vertex 162.4032635063062 -86.86738434135522 76.89991962967
+ vertex 162.46023657703935 -86.90131007824642 556.9018363008954
+ endloop
+endfacet
+facet normal 0.49831439203042943 0.8669963900417861 0.00016232638330655633
+ outer loop
+ vertex 162.40275201017843 -86.86827027863997 556.901836279959
+ vertex 162.46023657703935 -86.90131007824642 556.9018363008954
+ vertex 162.4032635063062 -86.86738434135522 76.89991962967
+ endloop
+endfacet
+facet normal 0.4999838853762198 0.8660346921539257 0.0001623266904071502
+ outer loop
+ vertex 162.51732844331508 -86.93308942972997 76.89991965080296
+ vertex 162.4607480731671 -86.90042414096168 76.8999196506057
+ vertex 162.51681694718732 -86.93397536701475 556.9018363010919
+ endloop
+endfacet
+facet normal 0.4999838853762198 0.8660346921539257 0.0001623266904071502
+ outer loop
+ vertex 162.46023657703935 -86.90131007824642 556.9018363008954
+ vertex 162.51681694718732 -86.93397536701475 556.9018363010919
+ vertex 162.4607480731671 -86.90042414096168 76.8999196506057
+ endloop
+endfacet
+facet normal 0.7064070708677972 0.7078057824220768 0.00015683701866325126
+ outer loop
+ vertex 162.61050098361724 -87.02607784958096 76.89991414077534
+ vertex 162.51732844331508 -86.93308942972997 76.89991965080296
+ vertex 162.60998948748949 -87.0269637868657 556.901830791065
+ endloop
+endfacet
+facet normal 0.7064070708677972 0.7078057824220768 0.00015683701866325126
+ outer loop
+ vertex 162.51681694718732 -86.93397536701475 556.9018363010919
+ vertex 162.60998948748949 -87.0269637868657 556.901830791065
+ vertex 162.51732844331508 -86.93308942972997 76.89991965080296
+ endloop
+endfacet
+facet normal 0.8655304524472672 0.500856282881034 0.00014065924284202788
+ outer loop
+ vertex 162.67643157256637 -87.14001259376604 76.89990347508557
+ vertex 162.61050098361724 -87.02607784958096 76.89991414077534
+ vertex 162.6759200764386 -87.1408985310508 556.9018201253746
+ endloop
+endfacet
+facet normal 0.8655304524472672 0.500856282881034 0.00014065924284202788
+ outer loop
+ vertex 162.60998948748949 -87.0269637868657 556.901830791065
+ vertex 162.6759200764386 -87.1408985310508 556.9018201253746
+ vertex 162.61050098361724 -87.02607784958096 76.89991414077534
+ endloop
+endfacet
+facet normal 0.9656693655093931 0.2597742545281341 0.0001148957720722702
+ outer loop
+ vertex 162.71062714948076 -87.26712919775495 76.89988838058375
+ vertex 162.67643157256637 -87.14001259376604 76.89990347508557
+ vertex 162.71011565335297 -87.26801513503972 556.9018050308727
+ endloop
+endfacet
+facet normal 0.9656693655093931 0.2597742545281341 0.0001148957720722702
+ outer loop
+ vertex 162.6759200764386 -87.1408985310508 556.9018201253746
+ vertex 162.71011565335297 -87.26801513503972 556.9018050308727
+ vertex 162.67643157256637 -87.14001259376604 76.89990347508557
+ endloop
+endfacet
+facet normal 0.999999507596363 0.0009890384018153237 8.13023441173768e-05
+ outer loop
+ vertex 162.71011565335297 -87.26801513503972 556.9018050308727
+ vertex 162.71024584617672 -87.39965081234072 556.9017865362224
+ vertex 162.71062714948076 -87.26712919775495 76.89988838058375
+ endloop
+endfacet
+facet normal 0.999999507596363 0.0009890384018153237 8.13023441173768e-05
+ outer loop
+ vertex 162.7107573423045 -87.39876487505593 76.89986988593273
+ vertex 162.71062714948076 -87.26712919775495 76.89988838058375
+ vertex 162.71024584617672 -87.39965081234072 556.9017865362224
+ endloop
+endfacet
+facet normal 0.9661813349808758 -0.25786358051575975 4.2168295496365976e-05
+ outer loop
+ vertex 162.71024584617672 -87.39965081234072 556.9017865362224
+ vertex 162.67630178248416 -87.52683480908411 556.9017659018036
+ vertex 162.7107573423045 -87.39876487505593 76.89986988593273
+ endloop
+endfacet
+facet normal 0.9661813349808758 -0.25786358051575975 4.2168295496365976e-05
+ outer loop
+ vertex 162.67681327861195 -87.52594887179937 76.89984925151481
+ vertex 162.7107573423045 -87.39876487505593 76.89986988593273
+ vertex 162.67630178248416 -87.52683480908411 556.9017659018036
+ endloop
+endfacet
+facet normal 0.8668495948420497 -0.4985697342620213 2.679591724845893e-07
+ outer loop
+ vertex 162.64324507084686 -87.58430961174551 556.9017551390587
+ vertex 162.64375656697464 -87.58342367446073 76.89983848876892
+ vertex 162.67630178248416 -87.52683480908411 556.9017659018036
+ endloop
+endfacet
+facet normal 0.8668495948420497 -0.4985697342620213 2.679591724845893e-07
+ outer loop
+ vertex 162.67681327861195 -87.52594887179937 76.89984925151481
+ vertex 162.67630178248416 -87.52683480908411 556.9017659018036
+ vertex 162.64375656697464 -87.58342367446073 76.89983848876892
+ endloop
+endfacet
+facet normal 0.8661841131862911 -0.49972500644221907 5.153940097857468e-08
+ outer loop
+ vertex 162.64324507084686 -87.58430961174551 556.9017551390587
+ vertex 162.61059669412066 -87.64089974607334 556.9017445338203
+ vertex 162.64375656697464 -87.58342367446073 76.89983848876892
+ endloop
+endfacet
+facet normal 0.8661841131862911 -0.49972500644221907 5.153940097857468e-08
+ outer loop
+ vertex 162.61110819024844 -87.64001380878855 76.89982788353065
+ vertex 162.64375656697464 -87.58342367446073 76.89983848876892
+ vertex 162.61059669412066 -87.64089974607334 556.9017445338203
+ endloop
+endfacet
+facet normal 0.86601415924229 -0.5000194756125703 -3.6508229560595423e-09
+ outer loop
+ vertex 162.61059669412066 -87.64089974607334 556.9017445338203
+ vertex 157.17679772127335 -97.05202686906556 556.8999805013005
+ vertex 162.61110819024844 -87.64001380878855 76.89982788353065
+ endloop
+endfacet
+facet normal 0.86601415924229 -0.5000194756125703 -3.6508229560595423e-09
+ outer loop
+ vertex 157.17730921740113 -97.05114093178078 76.89806385101241
+ vertex 162.61110819024844 -87.64001380878855 76.89982788353065
+ vertex 157.17679772127335 -97.05202686906556 556.8999805013005
+ endloop
+endfacet
+facet normal 0.869323457685581 -0.4942435896563823 1.0769114124448531e-06
+ outer loop
+ vertex 157.1434391722428 -97.1107011134941 556.899969545441
+ vertex 157.1439506683706 -97.10981517620934 76.89805289515205
+ vertex 157.17679772127335 -97.05202686906556 556.8999805013005
+ endloop
+endfacet
+facet normal 0.869323457685581 -0.4942435896563823 1.0769114124448531e-06
+ outer loop
+ vertex 157.17730921740113 -97.05114093178078 76.89806385101241
+ vertex 157.17679772127335 -97.05202686906556 556.8999805013005
+ vertex 157.1439506683706 -97.10981517620934 76.89805289515205
+ endloop
+endfacet
+facet normal 0.866034703564261 -0.4999838919628936 3.018938255093285e-09
+ outer loop
+ vertex 157.1434391722428 -97.1107011134941 556.899969545441
+ vertex 157.11138968300114 -97.16621484175813 556.8999591401305
+ vertex 157.1439506683706 -97.10981517620934 76.89805289515205
+ endloop
+endfacet
+facet normal 0.866034703564261 -0.4999838919628936 3.018938255093285e-09
+ outer loop
+ vertex 157.1119011791289 -97.16532890447337 76.89804248984237
+ vertex 157.1439506683706 -97.10981517620934 76.89805289515205
+ vertex 157.11138968300114 -97.16621484175813 556.8999591401305
+ endloop
+endfacet
+facet normal 0.7095151162022568 -0.7046902143212075 -4.1478052693903445e-05
+ outer loop
+ vertex 157.11138968300114 -97.16621484175813 556.8999591401305
+ vertex 157.01865634752755 -97.25958310762296 556.8999384879608
+ vertex 157.1119011791289 -97.16532890447337 76.89804248984237
+ endloop
+endfacet
+facet normal 0.7095151162022568 -0.7046902143212075 -4.1478052693903445e-05
+ outer loop
+ vertex 157.01916784365534 -97.25869717033821 76.89802183767264
+ vertex 157.1119011791289 -97.16532890447337 76.89804248984237
+ vertex 157.01865634752755 -97.25958310762296 556.8999384879608
+ endloop
+endfacet
+facet normal 0.5029517253411875 -0.8643145003218068 -8.068325748916705e-05
+ outer loop
+ vertex 157.01865634752755 -97.25958310762296 556.8999384879608
+ vertex 156.90491733841597 -97.3257687736396 556.8999199522049
+ vertex 157.01916784365534 -97.25869717033821 76.89802183767264
+ endloop
+endfacet
+facet normal 0.5029517253411875 -0.8643145003218068 -8.068325748916705e-05
+ outer loop
+ vertex 156.90542883454373 -97.32488283635485 76.8980033019159
+ vertex 157.01916784365534 -97.25869717033821 76.89802183767264
+ vertex 156.90491733841597 -97.3257687736396 556.8999199522049
+ endloop
+endfacet
+facet normal 0.26211300639167023 -0.9650371800066778 -0.00011439003134875239
+ outer loop
+ vertex 156.90491733841597 -97.3257687736396 556.8999199522049
+ vertex 156.77792378117482 -97.36026139604598 556.8999047960432
+ vertex 156.90542883454373 -97.32488283635485 76.8980033019159
+ endloop
+endfacet
+facet normal 0.26211300639167023 -0.9650371800066778 -0.00011439003134875239
+ outer loop
+ vertex 156.77843527730255 -97.35937545876124 76.8979881457542
+ vertex 156.90542883454373 -97.32488283635485 76.8980033019159
+ vertex 156.77792378117482 -97.36026139604598 556.8999047960432
+ endloop
+endfacet
+facet normal 0.0034117208399137996 -0.9999941702212329 -0.00014030131341523824
+ outer loop
+ vertex 156.77843527730255 -97.35937545876124 76.8979881457542
+ vertex 156.77792378117482 -97.36026139604598 556.8999047960432
+ vertex 156.6468415729909 -97.35982442234221 76.89797740205476
+ endloop
+endfacet
+facet normal 0.0034117208399137996 -0.9999941702212329 -0.00014030131341523824
+ outer loop
+ vertex 156.64633007686317 -97.36071035962696 556.8998940523436
+ vertex 156.6468415729909 -97.35982442234221 76.89797740205476
+ vertex 156.77792378117482 -97.36026139604598 556.8999047960432
+ endloop
+endfacet
+facet normal -0.2555220663840057 -0.9668032111299694 -0.0001566512928286133
+ outer loop
+ vertex 156.6468415729909 -97.35982442234221 76.89797740205476
+ vertex 156.64633007686317 -97.36071035962696 556.8998940523436
+ vertex 156.51961561508898 -97.32619913097159 76.89797180298153
+ endloop
+endfacet
+facet normal -0.2555220663840057 -0.9668032111299694 -0.0001566512928286133
+ outer loop
+ vertex 156.51910411896122 -97.32708506825634 556.8998884532696
+ vertex 156.51961561508898 -97.32619913097159 76.89797180298153
+ vertex 156.64633007686317 -97.36071035962696 556.8998940523436
+ endloop
+endfacet
+facet normal -0.49424358314217537 -0.8693234462350529 -0.00016232311816103822
+ outer loop
+ vertex 156.51961561508898 -97.32619913097159 76.89797180298153
+ vertex 156.51910411896122 -97.32708506825634 556.8998884532696
+ vertex 156.46094137065018 -97.29284058193514 76.89797173029706
+ endloop
+endfacet
+facet normal -0.49424358314217537 -0.8693234462350529 -0.00016232311816103822
+ outer loop
+ vertex 156.46042987452242 -97.29372651921987 556.8998883805853
+ vertex 156.46094137065018 -97.29284058193514 76.89797173029706
+ vertex 156.51910411896122 -97.32708506825634 556.8998884532696
+ endloop
+endfacet
+facet normal -0.4999838853756217 -0.866034692154271 -0.0001623266904071502
+ outer loop
+ vertex 156.46094137065018 -97.29284058193514 76.89797173029706
+ vertex 156.46042987452242 -97.29372651921987 556.8998883805853
+ vertex 156.4054276423766 -97.26079109268794 76.89797173010349
+ endloop
+endfacet
+facet normal -0.4999838853756217 -0.866034692154271 -0.0001623266904071502
+ outer loop
+ vertex 156.4049161462488 -97.26167702997267 556.8998883803916
+ vertex 156.4054276423766 -97.26079109268794 76.89797173010349
+ vertex 156.46042987452242 -97.29372651921987 556.8998883805853
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 153.31563935474955 -93.74157756749428 345.08857154516386
+ vertex 151.6996288142336 -94.54064573115143 345.088543645029
+ vertex 152.56572151010528 -95.04066310355044 345.088543645375
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 151.6996288142336 -94.54064573115143 345.088543645029
+ vertex 153.31563935474955 -93.74157756749428 345.08857154516386
+ vertex 152.4495823314252 -93.24163233814332 345.08857154398754
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 164.047929398161 -79.15217023347992 345.0889063601589
+ vertex 158.56509962055554 -84.64805150952668 345.08876684284354
+ vertex 160.29755637867893 -85.64828588518857 345.0887668428436
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 158.56509962055554 -84.64805150952668 345.08876684284354
+ vertex 164.047929398161 -79.15217023347992 345.0889063601589
+ vertex 157.69901622493632 -84.1480180279252 345.08876684284354
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 157.69901622493632 -84.1480180279252 345.08876684284354
+ vertex 164.047929398161 -79.15217023347992 345.0889063601589
+ vertex 155.3450906166828 -75.28248788533665 345.0888877570228
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 155.3450906166828 -75.28248788533665 345.0888877570228
+ vertex 164.047929398161 -79.15217023347992 345.0889063601589
+ vertex 156.7111092121235 -74.9164370738851 345.088906357228
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 154.2977909189598 -96.04063088847272 345.0885436460669
+ vertex 143.2115441314605 -98.29937406607544 345.08840416102845
+ vertex 150.548364317498 -102.53510722567025 345.08840416395924
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 143.2115441314605 -98.29937406607544 345.08840416102845
+ vertex 154.2977909189598 -96.04063088847272 345.0885436460669
+ vertex 142.8454933197726 -96.93335547069806 345.08842276054173
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 142.8454933197726 -96.93335547069806 345.08842276054173
+ vertex 154.2977909189598 -96.04063088847272 345.0885436460669
+ vertex 151.6996288142336 -94.54064573115143 345.088543645029
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 142.8454933197726 -96.93335547069806 345.08842276054173
+ vertex 151.6996288142336 -94.54064573115143 345.088543645029
+ vertex 150.34171035776353 -93.7560768116996 345.0885436542804
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 142.8454933197726 -96.93335547069806 345.08842276054173
+ vertex 150.34171035776353 -93.7560768116996 345.0885436542804
+ vertex 150.24903759671912 -93.6626628481548 345.0885442971377
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 142.8454933197726 -96.93335547069806 345.08842276054173
+ vertex 150.24903759671912 -93.6626628481548 345.0885442971377
+ vertex 150.1836998962755 -93.54844641271563 345.0885455292944
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 142.8454933197726 -96.93335547069806 345.08842276054173
+ vertex 150.1836998962755 -93.54844641271563 345.0885455292944
+ vertex 150.15014991274182 -93.4212111667064 345.08854726678095
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 142.8454933197726 -96.93335547069806 345.08842276054173
+ vertex 150.15014991274182 -93.4212111667064 345.08854726678095
+ vertex 150.15067402205236 -93.2896279818762 345.08854939119055
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 142.8454933197726 -96.93335547069806 345.08842276054173
+ vertex 150.15067402205236 -93.2896279818762 345.08854939119055
+ vertex 150.1852365070235 -93.16266403481956 345.0885517577483
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 142.8454933197726 -96.93335547069806 345.08842276054173
+ vertex 150.1852365070235 -93.16266403481956 345.0885517577483
+ vertex 155.3450906166828 -75.28248788533665 345.0888877570228
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 151.6996288142336 -94.54064573115143 345.088543645029
+ vertex 154.2977909189598 -96.04063088847272 345.0885436460669
+ vertex 152.56572151010528 -95.04066310355044 345.088543645375
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 155.3450906166828 -75.28248788533665 345.0888877570228
+ vertex 150.1852365070235 -93.16266403481956 345.0885517577483
+ vertex 155.7497861586212 -83.52416730431335 345.08875876409775
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 155.3450906166828 -75.28248788533665 345.0888877570228
+ vertex 155.7497861586212 -83.52416730431335 345.08875876409775
+ vertex 155.8428436248181 -83.43104774312178 345.088761129491
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 155.3450906166828 -75.28248788533665 345.0888877570228
+ vertex 155.8428436248181 -83.43104774312178 345.088761129491
+ vertex 155.95683135066037 -83.36518619857638 345.08876325046333
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 155.3450906166828 -75.28248788533665 345.0888877570228
+ vertex 155.95683135066037 -83.36518619857638 345.08876325046333
+ vertex 156.0839812610055 -83.33107102609686 345.08876498247406
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 155.3450906166828 -75.28248788533665 345.0888877570228
+ vertex 156.0839812610055 -83.33107102609686 345.08876498247406
+ vertex 156.21562829958822 -83.33102711830917 345.0887662074895
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 155.3450906166828 -75.28248788533665 345.0888877570228
+ vertex 156.21562829958822 -83.33102711830917 345.0887662074895
+ vertex 156.34280093828696 -83.36505746745658 345.08876684202687
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 155.3450906166828 -75.28248788533665 345.0888877570228
+ vertex 156.34280093828696 -83.36505746745658 345.08876684202687
+ vertex 157.69901622493632 -84.1480180279252 345.08876684284354
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 157.81515540286435 -85.94704879463588 345.088738944231
+ vertex 157.69901622493632 -84.1480180279252 345.08876684284354
+ vertex 156.94909837954006 -85.44710356528462 345.0887389430547
+ endloop
+endfacet
+facet normal -9.299929624683236e-06 -1.610795061521043e-05 0.9999999998270228
+ outer loop
+ vertex 157.69901622493632 -84.1480180279252 345.08876684284354
+ vertex 157.81515540286435 -85.94704879463588 345.088738944231
+ vertex 158.56509962055554 -84.64805150952668 345.08876684284354
+ endloop
+endfacet
+facet normal 0.8660347035642583 -0.4999838919628986 3.459555419915711e-10
+ outer loop
+ vertex 150.54842476704056 -102.53500252399127 338.5884041650836
+ vertex 154.29784206857275 -96.04054229474433 339.5885436470183
+ vertex 150.54841546711094 -102.53501863194187 339.5884041649106
+ endloop
+endfacet
+facet normal 0.8660347035642583 -0.4999838919628986 3.459555419915711e-10
+ outer loop
+ vertex 154.29784206857275 -96.04054229474433 339.5885436470183
+ vertex 150.54842476704056 -102.53500252399127 338.5884041650836
+ vertex 154.29785136850236 -96.04052618679373 338.5885436471913
+ endloop
+endfacet
+facet normal -0.4999838918764072 -0.866034703414457 -1.859985924480166e-05
+ outer loop
+ vertex 150.54842476704056 -102.53500252399127 338.5884041650836
+ vertex 143.21159528107341 -98.29928547234705 339.5884041619798
+ vertex 143.21160458100306 -98.29926936439645 338.58840416215276
+ endloop
+endfacet
+facet normal -0.4999838918764072 -0.866034703414457 -1.859985924480166e-05
+ outer loop
+ vertex 143.21159528107341 -98.29928547234705 339.5884041619798
+ vertex 150.54842476704056 -102.53500252399127 338.5884041650836
+ vertex 150.54841546711094 -102.53501863194187 339.5884041649106
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915711e-10
+ outer loop
+ vertex 155.3451417662957 -75.28239929160826 339.5888877579742
+ vertex 142.8454933197726 -96.93335547069806 345.08842276054173
+ vertex 155.3450906166828 -75.28248788533665 345.0888877570228
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915711e-10
+ outer loop
+ vertex 142.8454933197726 -96.93335547069806 345.08842276054173
+ vertex 155.3451417662957 -75.28239929160826 339.5888877579742
+ vertex 142.84554446938554 -96.93326687696968 339.58842276149306
+ endloop
+endfacet
+facet normal -0.2588370112032979 0.9659210120182565 1.3151841973605112e-05
+ outer loop
+ vertex 156.7111092121235 -74.9164370738851 345.088906357228
+ vertex 155.3451417662957 -75.28239929160826 339.5888877579742
+ vertex 155.3450906166828 -75.28248788533665 345.0888877570228
+ endloop
+endfacet
+facet normal -0.2588370112032979 0.9659210120182565 1.3151841973605112e-05
+ outer loop
+ vertex 155.3451417662957 -75.28239929160826 339.5888877579742
+ vertex 156.7111092121235 -74.9164370738851 345.088906357228
+ vertex 156.71116036173643 -74.91634848015673 339.5889063581794
+ endloop
+endfacet
+facet normal 0.4999838918764072 0.866034703414457 1.859985924480166e-05
+ outer loop
+ vertex 164.047929398161 -79.15217023347992 345.0889063601589
+ vertex 156.71116036173643 -74.91634848015673 339.5889063581794
+ vertex 156.7111092121235 -74.9164370738851 345.088906357228
+ endloop
+endfacet
+facet normal 0.4999838918764072 0.866034703414457 1.859985924480166e-05
+ outer loop
+ vertex 156.71116036173643 -74.91634848015673 339.5889063581794
+ vertex 164.047929398161 -79.15217023347992 345.0889063601589
+ vertex 164.04798054777393 -79.15208163975153 339.5889063611103
+ endloop
+endfacet
+facet normal -0.9659210120630118 -0.25883701103625684 -1.3152331228624575e-05
+ outer loop
+ vertex 143.21160458100306 -98.29926936439645 338.58840416215276
+ vertex 142.84554446938554 -96.93326687696968 339.58842276149306
+ vertex 142.8455537693152 -96.93325076901907 338.58842276166604
+ endloop
+endfacet
+facet normal -0.9659210120630118 -0.25883701103625684 -1.3152331228624575e-05
+ outer loop
+ vertex 142.84554446938554 -96.93326687696968 339.58842276149306
+ vertex 143.21160458100306 -98.29926936439645 338.58840416215276
+ vertex 143.21159528107341 -98.29928547234705 339.5884041619798
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 152.44964278096776 -93.24152763646433 338.5885715451119
+ vertex 152.56578195964784 -95.04055840187145 338.5885436464994
+ vertex 151.69968926377615 -94.54054102947242 338.58854364615337
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 152.56578195964784 -95.04055840187145 338.5885436464994
+ vertex 152.44964278096776 -93.24152763646433 338.5885715451119
+ vertex 153.31569980429214 -93.74147286581528 338.58857154628816
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 142.8455537693152 -96.93325076901907 338.58842276166604
+ vertex 150.54842476704056 -102.53500252399127 338.5884041650836
+ vertex 143.21160458100306 -98.29926936439645 338.58840416215276
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 150.54842476704056 -102.53500252399127 338.5884041650836
+ vertex 142.8455537693152 -96.93325076901907 338.58842276166604
+ vertex 154.29785136850236 -96.04052618679373 338.5885436471913
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 154.29785136850236 -96.04052618679373 338.5885436471913
+ vertex 142.8455537693152 -96.93325076901907 338.58842276166604
+ vertex 151.69968926377615 -94.54054102947242 338.58854364615337
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 154.29785136850236 -96.04052618679373 338.5885436471913
+ vertex 151.69968926377615 -94.54054102947242 338.58854364615337
+ vertex 152.56578195964784 -95.04055840187145 338.5885436464994
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 157.69907667447887 -84.1479133262462 338.5887668439679
+ vertex 157.8152158524069 -85.94694409295687 338.5887389453554
+ vertex 156.94915882908262 -85.44699886360563 338.58873894417906
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 157.8152158524069 -85.94694409295687 338.5887389453554
+ vertex 157.69907667447887 -84.1479133262462 338.5887668439679
+ vertex 158.5651600700981 -84.64794680784767 338.5887668439679
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 142.8455537693152 -96.93325076901907 338.58842276166604
+ vertex 150.3417708073061 -93.7559721100206 338.58854365540475
+ vertex 151.69968926377615 -94.54054102947242 338.58854364615337
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 150.3417708073061 -93.7559721100206 338.58854365540475
+ vertex 142.8455537693152 -96.93325076901907 338.58842276166604
+ vertex 150.24909804626168 -93.66255814647579 338.58854429826204
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 150.24909804626168 -93.66255814647579 338.58854429826204
+ vertex 142.8455537693152 -96.93325076901907 338.58842276166604
+ vertex 150.18376034581806 -93.54834171103664 338.58854553041874
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 150.18376034581806 -93.54834171103664 338.58854553041874
+ vertex 142.8455537693152 -96.93325076901907 338.58842276166604
+ vertex 150.15021036228438 -93.42110646502739 338.5885472679053
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 150.15021036228438 -93.42110646502739 338.5885472679053
+ vertex 142.8455537693152 -96.93325076901907 338.58842276166604
+ vertex 150.15073447159492 -93.2895232801972 338.5885493923149
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 150.15073447159492 -93.2895232801972 338.5885493923149
+ vertex 142.8455537693152 -96.93325076901907 338.58842276166604
+ vertex 150.18529695656605 -93.16255933314055 338.5885517588726
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 150.18529695656605 -93.16255933314055 338.5885517588726
+ vertex 142.8455537693152 -96.93325076901907 338.58842276166604
+ vertex 155.34515106622536 -75.28238318365764 338.58888775814717
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 150.18529695656605 -93.16255933314055 338.5885517588726
+ vertex 155.34515106622536 -75.28238318365764 338.58888775814717
+ vertex 155.74984660816375 -83.52406260263436 338.58875876522217
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 155.74984660816375 -83.52406260263436 338.58875876522217
+ vertex 155.34515106622536 -75.28238318365764 338.58888775814717
+ vertex 155.84290407436066 -83.43094304144279 338.5887611306153
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 155.84290407436066 -83.43094304144279 338.5887611306153
+ vertex 155.34515106622536 -75.28238318365764 338.58888775814717
+ vertex 155.95689180020292 -83.36508149689737 338.5887632515877
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 155.95689180020292 -83.36508149689737 338.5887632515877
+ vertex 155.34515106622536 -75.28238318365764 338.58888775814717
+ vertex 156.08404171054806 -83.33096632441787 338.5887649835984
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 156.08404171054806 -83.33096632441787 338.5887649835984
+ vertex 155.34515106622536 -75.28238318365764 338.58888775814717
+ vertex 156.21568874913078 -83.33092241663016 338.58876620861383
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 156.21568874913078 -83.33092241663016 338.58876620861383
+ vertex 155.34515106622536 -75.28238318365764 338.58888775814717
+ vertex 156.34286138782952 -83.36495276577757 338.5887668431513
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 156.34286138782952 -83.36495276577757 338.5887668431513
+ vertex 155.34515106622536 -75.28238318365764 338.58888775814717
+ vertex 157.69907667447887 -84.1479133262462 338.5887668439679
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 158.5651600700981 -84.64794680784767 338.5887668439679
+ vertex 164.04798984770355 -79.15206553180093 338.5889063612832
+ vertex 160.2976168282215 -85.64818118350956 338.5887668439679
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 164.04798984770355 -79.15206553180093 338.5889063612832
+ vertex 158.5651600700981 -84.64794680784767 338.5887668439679
+ vertex 157.69907667447887 -84.1479133262462 338.5887668439679
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 164.04798984770355 -79.15206553180093 338.5889063612832
+ vertex 157.69907667447887 -84.1479133262462 338.5887668439679
+ vertex 155.34515106622536 -75.28238318365764 338.58888775814717
+ endloop
+endfacet
+facet normal 9.299929624760356e-06 1.610795061516386e-05 -0.9999999998270228
+ outer loop
+ vertex 164.04798984770355 -79.15206553180093 338.5889063612832
+ vertex 155.34515106622536 -75.28238318365764 338.58888775814717
+ vertex 156.71116966166605 -74.9163323722061 338.58890635835235
+ endloop
+endfacet
+facet normal 0.4999838918764072 0.866034703414457 1.859985924480166e-05
+ outer loop
+ vertex 164.04798054777393 -79.15208163975153 339.5889063611103
+ vertex 156.71116966166605 -74.9163323722061 338.58890635835235
+ vertex 156.71116036173643 -74.91634848015673 339.5889063581794
+ endloop
+endfacet
+facet normal 0.4999838918764072 0.866034703414457 1.859985924480166e-05
+ outer loop
+ vertex 156.71116966166605 -74.9163323722061 338.58890635835235
+ vertex 164.04798054777393 -79.15208163975153 339.5889063611103
+ vertex 164.04798984770355 -79.15206553180093 338.5889063612832
+ endloop
+endfacet
+facet normal -0.2588370112032979 0.9659210120182565 1.3151841973605112e-05
+ outer loop
+ vertex 156.71116036173643 -74.91634848015673 339.5889063581794
+ vertex 155.34515106622536 -75.28238318365764 338.58888775814717
+ vertex 155.3451417662957 -75.28239929160826 339.5888877579742
+ endloop
+endfacet
+facet normal -0.2588370112032979 0.9659210120182565 1.3151841973605112e-05
+ outer loop
+ vertex 155.34515106622536 -75.28238318365764 338.58888775814717
+ vertex 156.71116036173643 -74.91634848015673 339.5889063581794
+ vertex 156.71116966166605 -74.9163323722061 338.58890635835235
+ endloop
+endfacet
+facet normal -0.4999838918764072 -0.866034703414457 -1.859985924480166e-05
+ outer loop
+ vertex 150.54841546711094 -102.53501863194187 339.5884041649106
+ vertex 143.2115441314605 -98.29937406607544 345.08840416102845
+ vertex 143.21159528107341 -98.29928547234705 339.5884041619798
+ endloop
+endfacet
+facet normal -0.4999838918764072 -0.866034703414457 -1.859985924480166e-05
+ outer loop
+ vertex 143.2115441314605 -98.29937406607544 345.08840416102845
+ vertex 150.54841546711094 -102.53501863194187 339.5884041649106
+ vertex 150.548364317498 -102.53510722567025 345.08840416395924
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915711e-10
+ outer loop
+ vertex 155.34515106622536 -75.28238318365764 338.58888775814717
+ vertex 142.84554446938554 -96.93326687696968 339.58842276149306
+ vertex 155.3451417662957 -75.28239929160826 339.5888877579742
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915711e-10
+ outer loop
+ vertex 142.84554446938554 -96.93326687696968 339.58842276149306
+ vertex 155.34515106622536 -75.28238318365764 338.58888775814717
+ vertex 142.8455537693152 -96.93325076901907 338.58842276166604
+ endloop
+endfacet
+facet normal -0.9659210120630118 -0.25883701103625684 -1.3152331228624575e-05
+ outer loop
+ vertex 143.21159528107341 -98.29928547234705 339.5884041619798
+ vertex 142.8454933197726 -96.93335547069806 345.08842276054173
+ vertex 142.84554446938554 -96.93326687696968 339.58842276149306
+ endloop
+endfacet
+facet normal -0.9659210120630118 -0.25883701103625684 -1.3152331228624575e-05
+ outer loop
+ vertex 142.8454933197726 -96.93335547069806 345.08842276054173
+ vertex 143.21159528107341 -98.29928547234705 339.5884041619798
+ vertex 143.2115441314605 -98.29937406607544 345.08840416102845
+ endloop
+endfacet
+facet normal -0.4999757178927258 -0.8660394224119932 -1.8599859240707935e-05
+ outer loop
+ vertex 157.69906737454926 -84.14792943419681 339.58876684379493
+ vertex 156.34280093828696 -83.36505746745658 345.08876684202687
+ vertex 156.3428520878999 -83.36496887372819 339.58876684297826
+ endloop
+endfacet
+facet normal -0.4999757178927258 -0.8660394224119932 -1.8599859240707935e-05
+ outer loop
+ vertex 156.34280093828696 -83.36505746745658 345.08876684202687
+ vertex 157.69906737454926 -84.14792943419681 339.58876684379493
+ vertex 157.69901622493632 -84.1480180279252 345.08876684284354
+ endloop
+endfacet
+facet normal -0.25849686862182286 -0.966012095467748 -1.796447781698182e-05
+ outer loop
+ vertex 156.3428520878999 -83.36496887372819 339.58876684297826
+ vertex 156.21562829958822 -83.33102711830917 345.0887662074895
+ vertex 156.2156794492011 -83.33093852458069 339.58876620844086
+ endloop
+endfacet
+facet normal -0.25849686862182286 -0.966012095467748 -1.796447781698182e-05
+ outer loop
+ vertex 156.21562829958822 -83.33102711830917 345.0887662074895
+ vertex 156.3428520878999 -83.36496887372819 339.58876684297826
+ vertex 156.34280093828696 -83.36505746745658 345.08876684202687
+ endloop
+endfacet
+facet normal 0.0003335267201213798 -0.9999999442502788 -1.610484794495737e-05
+ outer loop
+ vertex 156.2156794492011 -83.33093852458069 339.58876620844086
+ vertex 156.0839812610055 -83.33107102609686 345.08876498247406
+ vertex 156.0840324106184 -83.3309824323684 339.5887649834254
+ endloop
+endfacet
+facet normal 0.0003335267201213798 -0.9999999442502788 -1.610484794495737e-05
+ outer loop
+ vertex 156.0839812610055 -83.33107102609686 345.08876498247406
+ vertex 156.2156794492011 -83.33093852458069 339.58876620844086
+ vertex 156.21562829958822 -83.33102711830917 345.0887662074895
+ endloop
+endfacet
+facet normal 0.25914119276608716 -0.9658394494111885 -1.3147699300030627e-05
+ outer loop
+ vertex 155.9568825002733 -83.36509760484799 339.58876325141466
+ vertex 156.0839812610055 -83.33107102609686 345.08876498247406
+ vertex 155.95683135066037 -83.36518619857638 345.08876325046333
+ endloop
+endfacet
+facet normal 0.25914119276608716 -0.9658394494111885 -1.3147699300030627e-05
+ outer loop
+ vertex 156.0839812610055 -83.33107102609686 345.08876498247406
+ vertex 155.9568825002733 -83.36509760484799 339.58876325141466
+ vertex 156.0840324106184 -83.3309824323684 339.5887649834254
+ endloop
+endfacet
+facet normal 0.5002888147805679 -0.8658585922187676 -9.294556675347814e-06
+ outer loop
+ vertex 155.84289477443104 -83.4309591493934 339.5887611304424
+ vertex 155.95683135066037 -83.36518619857638 345.08876325046333
+ vertex 155.8428436248181 -83.43104774312178 345.088761129491
+ endloop
+endfacet
+facet normal 0.5002888147805679 -0.8658585922187676 -9.294556675347814e-06
+ outer loop
+ vertex 155.95683135066037 -83.36518619857638 345.08876325046333
+ vertex 155.84289477443104 -83.4309591493934 339.5887611304424
+ vertex 155.9568825002733 -83.36509760484799 339.58876325141466
+ endloop
+endfacet
+facet normal 0.7073425808317078 -0.7068709028664446 -4.808005373256879e-06
+ outer loop
+ vertex 155.74983730823413 -83.52407871058497 339.58875876504914
+ vertex 155.8428436248181 -83.43104774312178 345.088761129491
+ vertex 155.7497861586212 -83.52416730431335 345.08875876409775
+ endloop
+endfacet
+facet normal 0.7073425808317078 -0.7068709028664446 -4.808005373256879e-06
+ outer loop
+ vertex 155.8428436248181 -83.43104774312178 345.088761129491
+ vertex 155.74983730823413 -83.52407871058497 339.58875876504914
+ vertex 155.84289477443104 -83.4309591493934 339.5887611304424
+ endloop
+endfacet
+facet normal 0.8660347035642624 -0.4999838919628916 3.4595554214238093e-10
+ outer loop
+ vertex 150.18528765663646 -93.16257544109116 339.5885517586996
+ vertex 155.7497861586212 -83.52416730431335 345.08875876409775
+ vertex 150.1852365070235 -93.16266403481956 345.0885517577483
+ endloop
+endfacet
+facet normal 0.8660347035642624 -0.4999838919628916 3.4595554214238093e-10
+ outer loop
+ vertex 155.7497861586212 -83.52416730431335 345.08875876409775
+ vertex 150.18528765663646 -93.16257544109116 339.5885517586996
+ vertex 155.74983730823413 -83.52407871058497 339.58875876504914
+ endloop
+endfacet
+facet normal 0.9648872694768666 -0.2626643431815329 4.742399434363142e-06
+ outer loop
+ vertex 150.15067402205236 -93.2896279818762 345.08854939119055
+ vertex 150.18528765663646 -93.16257544109116 339.5885517586996
+ vertex 150.1852365070235 -93.16266403481956 345.0885517577483
+ endloop
+endfacet
+facet normal 0.9648872694768666 -0.2626643431815329 4.742399434363142e-06
+ outer loop
+ vertex 150.18528765663646 -93.16257544109116 339.5885517586996
+ vertex 150.15067402205236 -93.2896279818762 345.08854939119055
+ vertex 150.15072517166527 -93.28953938814786 339.58854939214194
+ endloop
+endfacet
+facet normal 0.9999920674984399 -0.003983071038499263 9.235696742989527e-06
+ outer loop
+ vertex 150.15020106235477 -93.42112257297802 339.58854726773234
+ vertex 150.15067402205236 -93.2896279818762 345.08854939119055
+ vertex 150.15014991274182 -93.4212111667064 345.08854726678095
+ endloop
+endfacet
+facet normal 0.9999920674984399 -0.003983071038499263 9.235696742989527e-06
+ outer loop
+ vertex 150.15067402205236 -93.2896279818762 345.08854939119055
+ vertex 150.15020106235477 -93.42112257297802 339.58854726773234
+ vertex 150.15072517166527 -93.28953938814786 339.58854939214194
+ endloop
+endfacet
+facet normal 0.966949058684553 0.25496964081524937 1.3099596581315955e-05
+ outer loop
+ vertex 150.1837510458884 -93.5483578189873 339.58854553024577
+ vertex 150.15014991274182 -93.4212111667064 345.08854726678095
+ vertex 150.1836998962755 -93.54844641271563 345.0885455292944
+ endloop
+endfacet
+facet normal 0.966949058684553 0.25496964081524937 1.3099596581315955e-05
+ outer loop
+ vertex 150.15014991274182 -93.4212111667064 345.08854726678095
+ vertex 150.1837510458884 -93.5483578189873 339.58854553024577
+ vertex 150.15020106235477 -93.42112257297802 339.58854726773234
+ endloop
+endfacet
+facet normal 0.8680100694813435 0.4965465930008214 1.607078056068101e-05
+ outer loop
+ vertex 150.24903759671912 -93.6626628481548 345.0885442971377
+ vertex 150.1837510458884 -93.5483578189873 339.58854553024577
+ vertex 150.1836998962755 -93.54844641271563 345.0885455292944
+ endloop
+endfacet
+facet normal 0.8680100694813435 0.4965465930008214 1.607078056068101e-05
+ outer loop
+ vertex 150.1837510458884 -93.5483578189873 339.58854553024577
+ vertex 150.24903759671912 -93.6626628481548 345.0885442971377
+ vertex 150.24908874633206 -93.6625742544264 339.58854429808906
+ endloop
+endfacet
+facet normal 0.7099176284945937 0.7042847154599664 1.7946767403102795e-05
+ outer loop
+ vertex 150.34171035776353 -93.7560768116996 345.0885436542804
+ vertex 150.24908874633206 -93.6625742544264 339.58854429808906
+ vertex 150.24903759671912 -93.6626628481548 345.0885442971377
+ endloop
+endfacet
+facet normal 0.7099176284945937 0.7042847154599664 1.7946767403102795e-05
+ outer loop
+ vertex 150.24908874633206 -93.6625742544264 339.58854429808906
+ vertex 150.34171035776353 -93.7560768116996 345.0885436542804
+ vertex 150.34176150737645 -93.75598821797122 339.5885436552317
+ endloop
+endfacet
+facet normal 0.5002746392317561 0.8658667824761391 1.859985831256328e-05
+ outer loop
+ vertex 151.6996288142336 -94.54064573115143 345.088543645029
+ vertex 150.34176150737645 -93.75598821797122 339.5885436552317
+ vertex 150.34171035776353 -93.7560768116996 345.0885436542804
+ endloop
+endfacet
+facet normal 0.5002746392317561 0.8658667824761391 1.859985831256328e-05
+ outer loop
+ vertex 150.34176150737645 -93.75598821797122 339.5885436552317
+ vertex 151.6996288142336 -94.54064573115143 345.088543645029
+ vertex 151.69967996384653 -94.54055713742304 339.5885436459804
+ endloop
+endfacet
+facet normal -0.8660347035642884 0.4999838919628465 -3.4595554311055867e-10
+ outer loop
+ vertex 152.44963348103815 -93.24154374441493 339.58857154493893
+ vertex 151.6996288142336 -94.54064573115143 345.088543645029
+ vertex 152.4495823314252 -93.24163233814332 345.08857154398754
+ endloop
+endfacet
+facet normal -0.8660347035642884 0.4999838919628465 -3.4595554311055867e-10
+ outer loop
+ vertex 151.6996288142336 -94.54064573115143 345.088543645029
+ vertex 152.44963348103815 -93.24154374441493 339.58857154493893
+ vertex 151.69967996384653 -94.54055713742304 339.5885436459804
+ endloop
+endfacet
+facet normal 0.4999452292644192 0.8660570231744518 1.8599859210822803e-05
+ outer loop
+ vertex 153.31563935474955 -93.74157756749428 345.08857154516386
+ vertex 152.44963348103815 -93.24154374441493 339.58857154493893
+ vertex 152.4495823314252 -93.24163233814332 345.08857154398754
+ endloop
+endfacet
+facet normal 0.4999452292644192 0.8660570231744518 1.8599859210822803e-05
+ outer loop
+ vertex 152.44963348103815 -93.24154374441493 339.58857154493893
+ vertex 153.31563935474955 -93.74157756749428 345.08857154516386
+ vertex 153.3156905043625 -93.7414889737659 339.58857154611525
+ endloop
+endfacet
+facet normal 0.8660570233241365 -0.4999452293511121 1.1763031795558301e-09
+ outer loop
+ vertex 152.56577265971822 -95.04057450982206 339.5885436463264
+ vertex 153.31563935474955 -93.74157756749428 345.08857154516386
+ vertex 152.56572151010528 -95.04066310355044 345.088543645375
+ endloop
+endfacet
+facet normal 0.8660570233241365 -0.4999452293511121 1.1763031795558301e-09
+ outer loop
+ vertex 153.31563935474955 -93.74157756749428 345.08857154516386
+ vertex 152.56577265971822 -95.04057450982206 339.5885436463264
+ vertex 153.3156905043625 -93.7414889737659 339.58857154611525
+ endloop
+endfacet
+facet normal 0.4999838918764072 0.866034703414457 1.859985924480166e-05
+ outer loop
+ vertex 154.2977909189598 -96.04063088847272 345.0885436460669
+ vertex 152.56577265971822 -95.04057450982206 339.5885436463264
+ vertex 152.56572151010528 -95.04066310355044 345.088543645375
+ endloop
+endfacet
+facet normal 0.4999838918764072 0.866034703414457 1.859985924480166e-05
+ outer loop
+ vertex 152.56577265971822 -95.04057450982206 339.5885436463264
+ vertex 154.2977909189598 -96.04063088847272 345.0885436460669
+ vertex 154.29784206857275 -96.04054229474433 339.5885436470183
+ endloop
+endfacet
+facet normal -0.49999597293545345 -0.866027728633691 -1.6908566647105917e-05
+ outer loop
+ vertex 160.2976075282919 -85.64819729146019 339.58876684379493
+ vertex 158.56509962055554 -84.64805150952668 345.08876684284354
+ vertex 158.56514146835886 -84.64797902769725 339.5887668434489
+ endloop
+endfacet
+facet normal -0.49999597293545345 -0.866027728633691 -1.6908566647105917e-05
+ outer loop
+ vertex 158.56509962055554 -84.64805150952668 345.08876684284354
+ vertex 160.2976075282919 -85.64819729146019 339.58876684379493
+ vertex 160.29755637867893 -85.64828588518857 345.0887668428436
+ endloop
+endfacet
+facet normal 0.8660347035643184 -0.4999838919627944 3.459555440260841e-10
+ outer loop
+ vertex 157.8152065524773 -85.9469602009075 339.5887389451824
+ vertex 158.56509962055554 -84.64805150952668 345.08876684284354
+ vertex 157.81515540286435 -85.94704879463588 345.088738944231
+ endloop
+endfacet
+facet normal 0.8660347035643184 -0.4999838919627944 3.459555440260841e-10
+ outer loop
+ vertex 158.56509962055554 -84.64805150952668 345.08876684284354
+ vertex 157.8152065524773 -85.9469602009075 339.5887389451824
+ vertex 158.56514146835886 -84.64797902769725 339.5887668434489
+ endloop
+endfacet
+facet normal -0.49994522926465357 -0.8660570231743162 -1.85998592108228e-05
+ outer loop
+ vertex 157.8152065524773 -85.9469602009075 339.5887389451824
+ vertex 156.94909837954006 -85.44710356528462 345.0887389430547
+ vertex 156.94914952915298 -85.44701497155624 339.5887389440061
+ endloop
+endfacet
+facet normal -0.49994522926465357 -0.8660570231743162 -1.85998592108228e-05
+ outer loop
+ vertex 156.94909837954006 -85.44710356528462 345.0887389430547
+ vertex 157.8152065524773 -85.9469602009075 339.5887389451824
+ vertex 157.81515540286435 -85.94704879463588 345.088738944231
+ endloop
+endfacet
+facet normal -0.8660570233242345 0.49994522935094254 -1.1763031831983162e-09
+ outer loop
+ vertex 157.69906737454926 -84.14792943419681 339.58876684379493
+ vertex 156.94909837954006 -85.44710356528462 345.0887389430547
+ vertex 157.69901622493632 -84.1480180279252 345.08876684284354
+ endloop
+endfacet
+facet normal -0.8660570233242345 0.49994522935094254 -1.1763031831983162e-09
+ outer loop
+ vertex 156.94909837954006 -85.44710356528462 345.0887389430547
+ vertex 157.69906737454926 -84.14792943419681 339.58876684379493
+ vertex 156.94914952915298 -85.44701497155624 339.5887389440061
+ endloop
+endfacet
+facet normal 0.8660347035642463 -0.4999838919629194 3.4595554154404836e-10
+ outer loop
+ vertex 160.2976168282215 -85.64818118350956 338.5887668439679
+ vertex 164.04798054777393 -79.15208163975153 339.5889063611103
+ vertex 160.2976075282919 -85.64819729146019 339.58876684379493
+ endloop
+endfacet
+facet normal 0.8660347035642463 -0.4999838919629194 3.4595554154404836e-10
+ outer loop
+ vertex 164.04798054777393 -79.15208163975153 339.5889063611103
+ vertex 160.2976168282215 -85.64818118350956 338.5887668439679
+ vertex 164.04798984770355 -79.15206553180093 338.5889063612832
+ endloop
+endfacet
+facet normal 0.8660347035642583 -0.4999838919628986 3.459555419915711e-10
+ outer loop
+ vertex 150.54841546711094 -102.53501863194187 339.5884041649106
+ vertex 154.2977909189598 -96.04063088847272 345.0885436460669
+ vertex 150.548364317498 -102.53510722567025 345.08840416395924
+ endloop
+endfacet
+facet normal 0.8660347035642583 -0.4999838919628986 3.459555419915711e-10
+ outer loop
+ vertex 154.2977909189598 -96.04063088847272 345.0885436460669
+ vertex 150.54841546711094 -102.53501863194187 339.5884041649106
+ vertex 154.29784206857275 -96.04054229474433 339.5885436470183
+ endloop
+endfacet
+facet normal 0.8660347035642463 -0.4999838919629194 3.4595554154404836e-10
+ outer loop
+ vertex 160.2976075282919 -85.64819729146019 339.58876684379493
+ vertex 164.047929398161 -79.15217023347992 345.0889063601589
+ vertex 160.29755637867893 -85.64828588518857 345.0887668428436
+ endloop
+endfacet
+facet normal 0.8660347035642463 -0.4999838919629194 3.4595554154404836e-10
+ outer loop
+ vertex 164.047929398161 -79.15217023347992 345.0889063601589
+ vertex 160.2976075282919 -85.64819729146019 339.58876684379493
+ vertex 164.04798054777393 -79.15208163975153 339.5889063611103
+ endloop
+endfacet
+facet normal -0.4999959728122984 -0.8660277284203799 -2.7901968550393905e-05
+ outer loop
+ vertex 160.2976168282215 -85.64818118350956 338.5887668439679
+ vertex 158.56514146835886 -84.64797902769725 339.5887668434489
+ vertex 158.5651600700981 -84.64794680784767 338.5887668439679
+ endloop
+endfacet
+facet normal -0.4999959728122984 -0.8660277284203799 -2.7901968550393905e-05
+ outer loop
+ vertex 158.56514146835886 -84.64797902769725 339.5887668434489
+ vertex 160.2976168282215 -85.64818118350956 338.5887668439679
+ vertex 160.2976075282919 -85.64819729146019 339.58876684379493
+ endloop
+endfacet
+facet normal -0.49994522926465357 -0.8660570231743162 -1.85998592108228e-05
+ outer loop
+ vertex 157.8152158524069 -85.94694409295687 338.5887389453554
+ vertex 156.94914952915298 -85.44701497155624 339.5887389440061
+ vertex 156.94915882908262 -85.44699886360563 338.58873894417906
+ endloop
+endfacet
+facet normal -0.49994522926465357 -0.8660570231743162 -1.85998592108228e-05
+ outer loop
+ vertex 156.94914952915298 -85.44701497155624 339.5887389440061
+ vertex 157.8152158524069 -85.94694409295687 338.5887389453554
+ vertex 157.8152065524773 -85.9469602009075 339.5887389451824
+ endloop
+endfacet
+facet normal -0.4999757178927258 -0.8660394224119932 -1.8599859240707935e-05
+ outer loop
+ vertex 157.69907667447887 -84.1479133262462 338.5887668439679
+ vertex 156.3428520878999 -83.36496887372819 339.58876684297826
+ vertex 156.34286138782952 -83.36495276577757 338.5887668431513
+ endloop
+endfacet
+facet normal -0.4999757178927258 -0.8660394224119932 -1.8599859240707935e-05
+ outer loop
+ vertex 156.3428520878999 -83.36496887372819 339.58876684297826
+ vertex 157.69907667447887 -84.1479133262462 338.5887668439679
+ vertex 157.69906737454926 -84.14792943419681 339.58876684379493
+ endloop
+endfacet
+facet normal 0.8660347035643184 -0.4999838919627944 3.4595554534885843e-10
+ outer loop
+ vertex 157.8152158524069 -85.94694409295687 338.5887389453554
+ vertex 158.56514146835886 -84.64797902769725 339.5887668434489
+ vertex 157.8152065524773 -85.9469602009075 339.5887389451824
+ endloop
+endfacet
+facet normal 0.8660347035643184 -0.4999838919627944 3.4595554534885843e-10
+ outer loop
+ vertex 158.56514146835886 -84.64797902769725 339.5887668434489
+ vertex 157.8152158524069 -85.94694409295687 338.5887389453554
+ vertex 158.5651600700981 -84.64794680784767 338.5887668439679
+ endloop
+endfacet
+facet normal -0.8660570233242345 0.49994522935094254 -1.176303183198729e-09
+ outer loop
+ vertex 157.69907667447887 -84.1479133262462 338.5887668439679
+ vertex 156.94914952915298 -85.44701497155624 339.5887389440061
+ vertex 157.69906737454926 -84.14792943419681 339.58876684379493
+ endloop
+endfacet
+facet normal -0.8660570233242345 0.49994522935094254 -1.176303183198729e-09
+ outer loop
+ vertex 156.94914952915298 -85.44701497155624 339.5887389440061
+ vertex 157.69907667447887 -84.1479133262462 338.5887668439679
+ vertex 156.94915882908262 -85.44699886360563 338.58873894417906
+ endloop
+endfacet
+facet normal -0.25849686862206855 -0.9660120954676824 -1.7964477783502208e-05
+ outer loop
+ vertex 156.21568874913078 -83.33092241663016 338.58876620861383
+ vertex 156.3428520878999 -83.36496887372819 339.58876684297826
+ vertex 156.2156794492011 -83.33093852458069 339.58876620844086
+ endloop
+endfacet
+facet normal -0.25849686862206855 -0.9660120954676824 -1.7964477783502208e-05
+ outer loop
+ vertex 156.3428520878999 -83.36496887372819 339.58876684297826
+ vertex 156.21568874913078 -83.33092241663016 338.58876620861383
+ vertex 156.34286138782952 -83.36495276577757 338.5887668431513
+ endloop
+endfacet
+facet normal 0.0003335267201213798 -0.9999999442502788 -1.610484786074712e-05
+ outer loop
+ vertex 156.08404171054806 -83.33096632441787 338.5887649835984
+ vertex 156.2156794492011 -83.33093852458069 339.58876620844086
+ vertex 156.0840324106184 -83.3309824323684 339.5887649834254
+ endloop
+endfacet
+facet normal 0.0003335267201213798 -0.9999999442502788 -1.610484786074712e-05
+ outer loop
+ vertex 156.2156794492011 -83.33093852458069 339.58876620844086
+ vertex 156.08404171054806 -83.33096632441787 338.5887649835984
+ vertex 156.21568874913078 -83.33092241663016 338.58876620861383
+ endloop
+endfacet
+facet normal 0.2591411927664384 -0.9658394494110942 -1.3147699252164233e-05
+ outer loop
+ vertex 155.95689180020292 -83.36508149689737 338.5887632515877
+ vertex 156.0840324106184 -83.3309824323684 339.5887649834254
+ vertex 155.9568825002733 -83.36509760484799 339.58876325141466
+ endloop
+endfacet
+facet normal 0.2591411927664384 -0.9658394494110942 -1.3147699252164233e-05
+ outer loop
+ vertex 156.0840324106184 -83.3309824323684 339.5887649834254
+ vertex 155.95689180020292 -83.36508149689737 338.5887632515877
+ vertex 156.08404171054806 -83.33096632441787 338.5887649835984
+ endloop
+endfacet
+facet normal 0.5002888147805681 -0.8658585922187676 -9.294556675347814e-06
+ outer loop
+ vertex 155.84290407436066 -83.43094304144279 338.5887611306153
+ vertex 155.9568825002733 -83.36509760484799 339.58876325141466
+ vertex 155.84289477443104 -83.4309591493934 339.5887611304424
+ endloop
+endfacet
+facet normal 0.5002888147805681 -0.8658585922187676 -9.294556675347814e-06
+ outer loop
+ vertex 155.9568825002733 -83.36509760484799 339.58876325141466
+ vertex 155.84290407436066 -83.43094304144279 338.5887611306153
+ vertex 155.95689180020292 -83.36508149689737 338.5887632515877
+ endloop
+endfacet
+facet normal 0.7073425808317078 -0.7068709028664445 -4.808005373256878e-06
+ outer loop
+ vertex 155.74984660816375 -83.52406260263436 338.58875876522217
+ vertex 155.84289477443104 -83.4309591493934 339.5887611304424
+ vertex 155.74983730823413 -83.52407871058497 339.58875876504914
+ endloop
+endfacet
+facet normal 0.7073425808317078 -0.7068709028664445 -4.808005373256878e-06
+ outer loop
+ vertex 155.84289477443104 -83.4309591493934 339.5887611304424
+ vertex 155.74984660816375 -83.52406260263436 338.58875876522217
+ vertex 155.84290407436066 -83.43094304144279 338.5887611306153
+ endloop
+endfacet
+facet normal 0.8660347035642624 -0.4999838919628916 3.4595554214238093e-10
+ outer loop
+ vertex 150.18529695656605 -93.16255933314055 338.5885517588726
+ vertex 155.74983730823413 -83.52407871058497 339.58875876504914
+ vertex 150.18528765663646 -93.16257544109116 339.5885517586996
+ endloop
+endfacet
+facet normal 0.8660347035642624 -0.4999838919628916 3.4595554214238093e-10
+ outer loop
+ vertex 155.74983730823413 -83.52407871058497 339.58875876504914
+ vertex 150.18529695656605 -93.16255933314055 338.5885517588726
+ vertex 155.74984660816375 -83.52406260263436 338.58875876522217
+ endloop
+endfacet
+facet normal 0.9648872694768552 -0.26266434318157506 4.742399440113685e-06
+ outer loop
+ vertex 150.15073447159492 -93.2895232801972 338.5885493923149
+ vertex 150.18528765663646 -93.16257544109116 339.5885517586996
+ vertex 150.15072517166527 -93.28953938814786 339.58854939214194
+ endloop
+endfacet
+facet normal 0.9648872694768552 -0.26266434318157506 4.742399440113685e-06
+ outer loop
+ vertex 150.18528765663646 -93.16257544109116 339.5885517586996
+ vertex 150.15073447159492 -93.2895232801972 338.5885493923149
+ vertex 150.18529695656605 -93.16255933314055 338.5885517588726
+ endloop
+endfacet
+facet normal 0.9999920674984402 -0.003983071038414164 9.235696754194314e-06
+ outer loop
+ vertex 150.15021036228438 -93.42110646502739 338.5885472679053
+ vertex 150.15072517166527 -93.28953938814786 339.58854939214194
+ vertex 150.15020106235477 -93.42112257297802 339.58854726773234
+ endloop
+endfacet
+facet normal 0.9999920674984402 -0.003983071038414164 9.235696754194314e-06
+ outer loop
+ vertex 150.15072517166527 -93.28953938814786 339.58854939214194
+ vertex 150.15021036228438 -93.42110646502739 338.5885472679053
+ vertex 150.15073447159492 -93.2895232801972 338.5885493923149
+ endloop
+endfacet
+facet normal 0.9669490586845839 0.25496964081513257 1.3099596597201569e-05
+ outer loop
+ vertex 150.18376034581806 -93.54834171103664 338.58854553041874
+ vertex 150.15020106235477 -93.42112257297802 339.58854726773234
+ vertex 150.1837510458884 -93.5483578189873 339.58854553024577
+ endloop
+endfacet
+facet normal 0.9669490586845839 0.25496964081513257 1.3099596597201569e-05
+ outer loop
+ vertex 150.15020106235477 -93.42112257297802 339.58854726773234
+ vertex 150.18376034581806 -93.54834171103664 338.58854553041874
+ vertex 150.15021036228438 -93.42110646502739 338.5885472679053
+ endloop
+endfacet
+facet normal 0.8680100694812698 0.49654659300095 1.60707805801751e-05
+ outer loop
+ vertex 150.24908874633206 -93.6625742544264 339.58854429808906
+ vertex 150.18376034581806 -93.54834171103664 338.58854553041874
+ vertex 150.1837510458884 -93.5483578189873 339.58854553024577
+ endloop
+endfacet
+facet normal 0.8680100694812698 0.49654659300095 1.60707805801751e-05
+ outer loop
+ vertex 150.18376034581806 -93.54834171103664 338.58854553041874
+ vertex 150.24908874633206 -93.6625742544264 339.58854429808906
+ vertex 150.24909804626168 -93.66255814647579 338.58854429826204
+ endloop
+endfacet
+facet normal 0.7099176284945936 0.7042847154599665 1.7946767403102792e-05
+ outer loop
+ vertex 150.34176150737645 -93.75598821797122 339.5885436552317
+ vertex 150.24909804626168 -93.66255814647579 338.58854429826204
+ vertex 150.24908874633206 -93.6625742544264 339.58854429808906
+ endloop
+endfacet
+facet normal 0.7099176284945936 0.7042847154599665 1.7946767403102792e-05
+ outer loop
+ vertex 150.24909804626168 -93.66255814647579 338.58854429826204
+ vertex 150.34176150737645 -93.75598821797122 339.5885436552317
+ vertex 150.3417708073061 -93.7559721100206 338.58854365540475
+ endloop
+endfacet
+facet normal 0.5002746392317561 0.8658667824761391 1.8599858312563282e-05
+ outer loop
+ vertex 151.69967996384653 -94.54055713742304 339.5885436459804
+ vertex 150.3417708073061 -93.7559721100206 338.58854365540475
+ vertex 150.34176150737645 -93.75598821797122 339.5885436552317
+ endloop
+endfacet
+facet normal 0.5002746392317561 0.8658667824761391 1.8599858312563282e-05
+ outer loop
+ vertex 150.3417708073061 -93.7559721100206 338.58854365540475
+ vertex 151.69967996384653 -94.54055713742304 339.5885436459804
+ vertex 151.69968926377615 -94.54054102947242 338.58854364615337
+ endloop
+endfacet
+facet normal -0.8660347035642884 0.4999838919628465 -3.4595554311055867e-10
+ outer loop
+ vertex 152.44964278096776 -93.24152763646433 338.5885715451119
+ vertex 151.69967996384653 -94.54055713742304 339.5885436459804
+ vertex 152.44963348103815 -93.24154374441493 339.58857154493893
+ endloop
+endfacet
+facet normal -0.8660347035642884 0.4999838919628465 -3.4595554311055867e-10
+ outer loop
+ vertex 151.69967996384653 -94.54055713742304 339.5885436459804
+ vertex 152.44964278096776 -93.24152763646433 338.5885715451119
+ vertex 151.69968926377615 -94.54054102947242 338.58854364615337
+ endloop
+endfacet
+facet normal 0.4999452292644192 0.8660570231744518 1.8599859210822803e-05
+ outer loop
+ vertex 153.3156905043625 -93.7414889737659 339.58857154611525
+ vertex 152.44964278096776 -93.24152763646433 338.5885715451119
+ vertex 152.44963348103815 -93.24154374441493 339.58857154493893
+ endloop
+endfacet
+facet normal 0.4999452292644192 0.8660570231744518 1.8599859210822803e-05
+ outer loop
+ vertex 152.44964278096776 -93.24152763646433 338.5885715451119
+ vertex 153.3156905043625 -93.7414889737659 339.58857154611525
+ vertex 153.31569980429214 -93.74147286581528 338.58857154628816
+ endloop
+endfacet
+facet normal 0.8660570233241365 -0.4999452293511121 1.1763031795558301e-09
+ outer loop
+ vertex 152.56578195964784 -95.04055840187145 338.5885436464994
+ vertex 153.3156905043625 -93.7414889737659 339.58857154611525
+ vertex 152.56577265971822 -95.04057450982206 339.5885436463264
+ endloop
+endfacet
+facet normal 0.8660570233241365 -0.4999452293511121 1.1763031795558301e-09
+ outer loop
+ vertex 153.3156905043625 -93.7414889737659 339.58857154611525
+ vertex 152.56578195964784 -95.04055840187145 338.5885436464994
+ vertex 153.31569980429214 -93.74147286581528 338.58857154628816
+ endloop
+endfacet
+facet normal 0.4999838918764072 0.866034703414457 1.859985924480166e-05
+ outer loop
+ vertex 154.29784206857275 -96.04054229474433 339.5885436470183
+ vertex 152.56578195964784 -95.04055840187145 338.5885436464994
+ vertex 152.56577265971822 -95.04057450982206 339.5885436463264
+ endloop
+endfacet
+facet normal 0.4999838918764072 0.866034703414457 1.859985924480166e-05
+ outer loop
+ vertex 152.56578195964784 -95.04055840187145 338.5885436464994
+ vertex 154.29784206857275 -96.04054229474433 339.5885436470183
+ vertex 154.29785136850236 -96.04052618679373 338.5885436471913
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 152.44963348103815 -93.24154374441493 339.58857154493893
+ vertex 152.56577265971822 -95.04057450982206 339.5885436463264
+ vertex 151.69967996384653 -94.54055713742304 339.5885436459804
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 152.56577265971822 -95.04057450982206 339.5885436463264
+ vertex 152.44963348103815 -93.24154374441493 339.58857154493893
+ vertex 153.3156905043625 -93.7414889737659 339.58857154611525
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 157.69906737454926 -84.14792943419681 339.58876684379493
+ vertex 157.8152065524773 -85.9469602009075 339.5887389451824
+ vertex 156.94914952915298 -85.44701497155624 339.5887389440061
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 157.8152065524773 -85.9469602009075 339.5887389451824
+ vertex 157.69906737454926 -84.14792943419681 339.58876684379493
+ vertex 158.56514146835886 -84.64797902769725 339.5887668434489
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 142.84554446938554 -96.93326687696968 339.58842276149306
+ vertex 150.34176150737645 -93.75598821797122 339.5885436552317
+ vertex 151.69967996384653 -94.54055713742304 339.5885436459804
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 150.34176150737645 -93.75598821797122 339.5885436552317
+ vertex 142.84554446938554 -96.93326687696968 339.58842276149306
+ vertex 150.24908874633206 -93.6625742544264 339.58854429808906
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 150.24908874633206 -93.6625742544264 339.58854429808906
+ vertex 142.84554446938554 -96.93326687696968 339.58842276149306
+ vertex 150.1837510458884 -93.5483578189873 339.58854553024577
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 150.1837510458884 -93.5483578189873 339.58854553024577
+ vertex 142.84554446938554 -96.93326687696968 339.58842276149306
+ vertex 150.15020106235477 -93.42112257297802 339.58854726773234
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 150.15020106235477 -93.42112257297802 339.58854726773234
+ vertex 142.84554446938554 -96.93326687696968 339.58842276149306
+ vertex 150.15072517166527 -93.28953938814786 339.58854939214194
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 150.15072517166527 -93.28953938814786 339.58854939214194
+ vertex 142.84554446938554 -96.93326687696968 339.58842276149306
+ vertex 150.18528765663646 -93.16257544109116 339.5885517586996
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 150.18528765663646 -93.16257544109116 339.5885517586996
+ vertex 142.84554446938554 -96.93326687696968 339.58842276149306
+ vertex 155.3451417662957 -75.28239929160826 339.5888877579742
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 150.18528765663646 -93.16257544109116 339.5885517586996
+ vertex 155.3451417662957 -75.28239929160826 339.5888877579742
+ vertex 155.74983730823413 -83.52407871058497 339.58875876504914
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 155.74983730823413 -83.52407871058497 339.58875876504914
+ vertex 155.3451417662957 -75.28239929160826 339.5888877579742
+ vertex 155.84289477443104 -83.4309591493934 339.5887611304424
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 155.84289477443104 -83.4309591493934 339.5887611304424
+ vertex 155.3451417662957 -75.28239929160826 339.5888877579742
+ vertex 155.9568825002733 -83.36509760484799 339.58876325141466
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 155.9568825002733 -83.36509760484799 339.58876325141466
+ vertex 155.3451417662957 -75.28239929160826 339.5888877579742
+ vertex 156.0840324106184 -83.3309824323684 339.5887649834254
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 156.0840324106184 -83.3309824323684 339.5887649834254
+ vertex 155.3451417662957 -75.28239929160826 339.5888877579742
+ vertex 156.2156794492011 -83.33093852458069 339.58876620844086
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 156.2156794492011 -83.33093852458069 339.58876620844086
+ vertex 155.3451417662957 -75.28239929160826 339.5888877579742
+ vertex 156.3428520878999 -83.36496887372819 339.58876684297826
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 156.3428520878999 -83.36496887372819 339.58876684297826
+ vertex 155.3451417662957 -75.28239929160826 339.5888877579742
+ vertex 157.69906737454926 -84.14792943419681 339.58876684379493
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 158.56514146835886 -84.64797902769725 339.5887668434489
+ vertex 164.04798054777393 -79.15208163975153 339.5889063611103
+ vertex 160.2976075282919 -85.64819729146019 339.58876684379493
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 164.04798054777393 -79.15208163975153 339.5889063611103
+ vertex 158.56514146835886 -84.64797902769725 339.5887668434489
+ vertex 157.69906737454926 -84.14792943419681 339.58876684379493
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 164.04798054777393 -79.15208163975153 339.5889063611103
+ vertex 157.69906737454926 -84.14792943419681 339.58876684379493
+ vertex 155.3451417662957 -75.28239929160826 339.5888877579742
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 164.04798054777393 -79.15208163975153 339.5889063611103
+ vertex 155.3451417662957 -75.28239929160826 339.5888877579742
+ vertex 156.71116036173643 -74.91634848015673 339.5889063581794
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 142.84554446938554 -96.93326687696968 339.58842276149306
+ vertex 150.54841546711094 -102.53501863194187 339.5884041649106
+ vertex 143.21159528107341 -98.29928547234705 339.5884041619798
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 150.54841546711094 -102.53501863194187 339.5884041649106
+ vertex 142.84554446938554 -96.93326687696968 339.58842276149306
+ vertex 154.29784206857275 -96.04054229474433 339.5885436470183
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 154.29784206857275 -96.04054229474433 339.5885436470183
+ vertex 142.84554446938554 -96.93326687696968 339.58842276149306
+ vertex 151.69967996384653 -94.54055713742304 339.5885436459804
+ endloop
+endfacet
+facet normal 9.299929624683236e-06 1.610795061521043e-05 -0.9999999998270228
+ outer loop
+ vertex 154.29784206857275 -96.04054229474433 339.5885436470183
+ vertex 151.69967996384653 -94.54055713742304 339.5885436459804
+ vertex 152.56577265971822 -95.04057450982206 339.5885436463264
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 152.56541926239248 -95.0411866119454 377.58854363975354
+ vertex 151.6993265665208 -94.54116923954639 377.58854363940753
+ vertex 153.31533710703678 -93.74210107588924 377.5885715395424
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 152.4492800837124 -93.24215584653827 377.58857153836607
+ vertex 153.31533710703678 -93.74210107588924 377.5885715395424
+ vertex 151.6993265665208 -94.54116923954639 377.58854363940753
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 160.29725413096617 -85.64880939358353 377.5887668372221
+ vertex 158.56479737284278 -84.64857501792163 377.58876683722207
+ vertex 164.04762715044822 -79.15269374187487 377.5889063545374
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 157.69871397722355 -84.14854153632015 377.58876683722207
+ vertex 164.04762715044822 -79.15269374187487 377.5889063545374
+ vertex 158.56479737284278 -84.64857501792163 377.58876683722207
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 155.34478836897 -75.2830113937316 377.58888775140133
+ vertex 164.04762715044822 -79.15269374187487 377.5889063545374
+ vertex 157.69871397722355 -84.14854153632015 377.58876683722207
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 156.7108069644107 -74.91696058228007 377.5889063516065
+ vertex 164.04762715044822 -79.15269374187487 377.5889063545374
+ vertex 155.34478836897 -75.2830113937316 377.58888775140133
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 150.5480620697852 -102.53563073406521 377.58840415833777
+ vertex 143.2112418837477 -98.29989757447039 377.588404155407
+ vertex 154.29748867124704 -96.04115439686767 377.58854364044544
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 142.84519107205983 -96.93387897909302 377.58842275492026
+ vertex 154.29748867124704 -96.04115439686767 377.58854364044544
+ vertex 143.2112418837477 -98.29989757447039 377.588404155407
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 151.6993265665208 -94.54116923954639 377.58854363940753
+ vertex 154.29748867124704 -96.04115439686767 377.58854364044544
+ vertex 142.84519107205983 -96.93387897909302 377.58842275492026
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 150.34140811005074 -93.75660032009456 377.5885436486589
+ vertex 151.6993265665208 -94.54116923954639 377.58854363940753
+ vertex 142.84519107205983 -96.93387897909302 377.58842275492026
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 150.24873534900635 -93.66318635654974 377.5885442915162
+ vertex 150.34140811005074 -93.75660032009456 377.5885436486589
+ vertex 142.84519107205983 -96.93387897909302 377.58842275492026
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 150.18339764856273 -93.54896992111058 377.5885455236729
+ vertex 150.24873534900635 -93.66318635654974 377.5885442915162
+ vertex 142.84519107205983 -96.93387897909302 377.58842275492026
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 150.14984766502906 -93.42173467510136 377.5885472611595
+ vertex 150.18339764856273 -93.54896992111058 377.5885455236729
+ vertex 142.84519107205983 -96.93387897909302 377.58842275492026
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 150.15037177433956 -93.29015149027116 377.58854938556914
+ vertex 150.14984766502906 -93.42173467510136 377.5885472611595
+ vertex 142.84519107205983 -96.93387897909302 377.58842275492026
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 150.18493425931072 -93.1631875432145 377.5885517521268
+ vertex 150.15037177433956 -93.29015149027116 377.58854938556914
+ vertex 142.84519107205983 -96.93387897909302 377.58842275492026
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 155.34478836897 -75.2830113937316 377.58888775140133
+ vertex 150.18493425931072 -93.1631875432145 377.5885517521268
+ vertex 142.84519107205983 -96.93387897909302 377.58842275492026
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 152.56541926239248 -95.0411866119454 377.58854363975354
+ vertex 154.29748867124704 -96.04115439686767 377.58854364044544
+ vertex 151.6993265665208 -94.54116923954639 377.58854363940753
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 155.7494839109084 -83.52469081270831 377.58875875847633
+ vertex 150.18493425931072 -93.1631875432145 377.5885517521268
+ vertex 155.34478836897 -75.2830113937316 377.58888775140133
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 155.8425413771053 -83.43157125151674 377.5887611238695
+ vertex 155.7494839109084 -83.52469081270831 377.58875875847633
+ vertex 155.34478836897 -75.2830113937316 377.58888775140133
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 155.9565291029476 -83.36570970697133 377.58876324484186
+ vertex 155.8425413771053 -83.43157125151674 377.5887611238695
+ vertex 155.34478836897 -75.2830113937316 377.58888775140133
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 156.08367901329274 -83.33159453449183 377.5887649768526
+ vertex 155.9565291029476 -83.36570970697133 377.58876324484186
+ vertex 155.34478836897 -75.2830113937316 377.58888775140133
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 156.21532605187542 -83.33155062670411 377.58876620186805
+ vertex 156.08367901329274 -83.33159453449183 377.5887649768526
+ vertex 155.34478836897 -75.2830113937316 377.58888775140133
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 156.3424986905742 -83.36558097585154 377.5887668364054
+ vertex 156.21532605187542 -83.33155062670411 377.58876620186805
+ vertex 155.34478836897 -75.2830113937316 377.58888775140133
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 157.69871397722355 -84.14854153632015 377.58876683722207
+ vertex 156.3424986905742 -83.36558097585154 377.5887668364054
+ vertex 155.34478836897 -75.2830113937316 377.58888775140133
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 156.94879613182727 -85.44762707367958 377.5887389374332
+ vertex 157.69871397722355 -84.14854153632015 377.58876683722207
+ vertex 157.81485315515155 -85.94757230303082 377.58873893860954
+ endloop
+endfacet
+facet normal 9.299929624683234e-06 1.6107950615210427e-05 -0.9999999998270228
+ outer loop
+ vertex 158.56479737284278 -84.64857501792163 377.58876683722207
+ vertex 157.81485315515155 -85.94757230303082 377.58873893860954
+ vertex 157.69871397722355 -84.14854153632015 377.58876683722207
+ endloop
+endfacet
+facet normal 0.8660347035642583 -0.4999838919628986 3.4595554199157153e-10
+ outer loop
+ vertex 150.5480109201723 -102.53571932779359 383.0884041573864
+ vertex 154.2974375216341 -96.04124299059606 383.08854363949405
+ vertex 150.54800162024264 -102.53573543574421 384.0884041572134
+ endloop
+endfacet
+facet normal 0.8660347035642583 -0.4999838919628986 3.4595554199157153e-10
+ outer loop
+ vertex 154.29742822170445 -96.04125909854667 384.08854363932113
+ vertex 150.54800162024264 -102.53573543574421 384.0884041572134
+ vertex 154.2974375216341 -96.04124299059606 383.08854363949405
+ endloop
+endfacet
+facet normal -0.4999838918764072 -0.866034703414457 -1.8599859244801655e-05
+ outer loop
+ vertex 143.21118143420514 -98.3000022761494 384.0884041542826
+ vertex 143.21119073413476 -98.29998616819879 383.0884041544556
+ vertex 150.54800162024264 -102.53573543574421 384.0884041572134
+ endloop
+endfacet
+facet normal -0.4999838918764072 -0.866034703414457 -1.8599859244801655e-05
+ outer loop
+ vertex 150.5480109201723 -102.53571932779359 383.0884041573864
+ vertex 150.54800162024264 -102.53573543574421 384.0884041572134
+ vertex 143.21119073413476 -98.29998616819879 383.0884041544556
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.4595554199157153e-10
+ outer loop
+ vertex 155.34478836897 -75.2830113937316 377.58888775140133
+ vertex 142.84519107205983 -96.93387897909302 377.58842275492026
+ vertex 155.34473721935706 -75.28309998745999 383.08888775044994
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.4595554199157153e-10
+ outer loop
+ vertex 142.8451399224469 -96.9339675728214 383.08842275396887
+ vertex 155.34473721935706 -75.28309998745999 383.08888775044994
+ vertex 142.84519107205983 -96.93387897909302 377.58842275492026
+ endloop
+endfacet
+facet normal -0.2588370112032979 0.9659210120182565 1.3151841973605108e-05
+ outer loop
+ vertex 155.34478836897 -75.2830113937316 377.58888775140133
+ vertex 155.34473721935706 -75.28309998745999 383.08888775044994
+ vertex 156.7108069644107 -74.91696058228007 377.5889063516065
+ endloop
+endfacet
+facet normal -0.2588370112032979 0.9659210120182565 1.3151841973605108e-05
+ outer loop
+ vertex 156.71075581479778 -74.91704917600845 383.0889063506552
+ vertex 156.7108069644107 -74.91696058228007 377.5889063516065
+ vertex 155.34473721935706 -75.28309998745999 383.08888775044994
+ endloop
+endfacet
+facet normal 0.4999838918764072 0.866034703414457 1.8599859244801655e-05
+ outer loop
+ vertex 156.7108069644107 -74.91696058228007 377.5889063516065
+ vertex 156.71075581479778 -74.91704917600845 383.0889063506552
+ vertex 164.04762715044822 -79.15269374187487 377.5889063545374
+ endloop
+endfacet
+facet normal 0.4999838918764072 0.866034703414457 1.8599859244801655e-05
+ outer loop
+ vertex 164.04757600083528 -79.15278233560326 383.088906353586
+ vertex 164.04762715044822 -79.15269374187487 377.5889063545374
+ vertex 156.71075581479778 -74.91704917600845 383.0889063506552
+ endloop
+endfacet
+facet normal -0.9659210120630118 -0.25883701103625684 -1.3152331228624571e-05
+ outer loop
+ vertex 142.84513062251727 -96.93398368077203 384.0884227537959
+ vertex 142.8451399224469 -96.9339675728214 383.08842275396887
+ vertex 143.21118143420514 -98.3000022761494 384.0884041542826
+ endloop
+endfacet
+facet normal -0.9659210120630118 -0.25883701103625684 -1.3152331228624571e-05
+ outer loop
+ vertex 143.21119073413476 -98.29998616819879 383.0884041544556
+ vertex 143.21118143420514 -98.3000022761494 384.0884041542826
+ vertex 142.8451399224469 -96.9339675728214 383.08842275396887
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 151.69926611697824 -94.54127394122538 384.08854363828317
+ vertex 152.56535881284992 -95.0412913136244 384.0885436386292
+ vertex 152.44921963416985 -93.24226054821727 384.0885715372417
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 153.31527665749422 -93.74220577756824 384.088571538418
+ vertex 152.44921963416985 -93.24226054821727 384.0885715372417
+ vertex 152.56535881284992 -95.0412913136244 384.0885436386292
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 143.21118143420514 -98.3000022761494 384.0884041542826
+ vertex 150.54800162024264 -102.53573543574421 384.0884041572134
+ vertex 142.84513062251727 -96.93398368077203 384.0884227537959
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 154.29742822170445 -96.04125909854667 384.08854363932113
+ vertex 142.84513062251727 -96.93398368077203 384.0884227537959
+ vertex 150.54800162024264 -102.53573543574421 384.0884041572134
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 151.69926611697824 -94.54127394122538 384.08854363828317
+ vertex 142.84513062251727 -96.93398368077203 384.0884227537959
+ vertex 154.29742822170445 -96.04125909854667 384.08854363932113
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 152.56535881284992 -95.0412913136244 384.0885436386292
+ vertex 151.69926611697824 -94.54127394122538 384.08854363828317
+ vertex 154.29742822170445 -96.04125909854667 384.08854363932113
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 156.9487356822847 -85.44773177535858 384.0887389363089
+ vertex 157.814792705609 -85.94767700470983 384.08873893748523
+ vertex 157.698653527681 -84.14864623799916 384.08876683609776
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 158.56473692330022 -84.64867971960062 384.08876683609776
+ vertex 157.698653527681 -84.14864623799916 384.08876683609776
+ vertex 157.814792705609 -85.94767700470983 384.08873893748523
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 151.69926611697824 -94.54127394122538 384.08854363828317
+ vertex 150.34134766050818 -93.75670502177356 384.08854364753455
+ vertex 142.84513062251727 -96.93398368077203 384.0884227537959
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 150.2486748994638 -93.66329105822874 384.0885442903919
+ vertex 142.84513062251727 -96.93398368077203 384.0884227537959
+ vertex 150.34134766050818 -93.75670502177356 384.08854364753455
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 150.18333719902014 -93.54907462278959 384.08854552254854
+ vertex 142.84513062251727 -96.93398368077203 384.0884227537959
+ vertex 150.2486748994638 -93.66329105822874 384.0885442903919
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 150.14978721548647 -93.42183937678035 384.0885472600351
+ vertex 142.84513062251727 -96.93398368077203 384.0884227537959
+ vertex 150.18333719902014 -93.54907462278959 384.08854552254854
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 150.150311324797 -93.29025619195016 384.0885493844448
+ vertex 142.84513062251727 -96.93398368077203 384.0884227537959
+ vertex 150.14978721548647 -93.42183937678035 384.0885472600351
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 150.18487380976816 -93.1632922448935 384.08855175100246
+ vertex 142.84513062251727 -96.93398368077203 384.0884227537959
+ vertex 150.150311324797 -93.29025619195016 384.0885493844448
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 155.34472791942744 -75.2831160954106 384.08888775027697
+ vertex 142.84513062251727 -96.93398368077203 384.0884227537959
+ vertex 150.18487380976816 -93.1632922448935 384.08855175100246
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 155.74942346136584 -83.5247955143873 384.08875875735197
+ vertex 155.34472791942744 -75.2831160954106 384.08888775027697
+ vertex 150.18487380976816 -93.1632922448935 384.08855175100246
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 155.84248092756275 -83.43167595319574 384.08876112274515
+ vertex 155.34472791942744 -75.2831160954106 384.08888775027697
+ vertex 155.74942346136584 -83.5247955143873 384.08875875735197
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 155.956468653405 -83.36581440865034 384.0887632437175
+ vertex 155.34472791942744 -75.2831160954106 384.08888775027697
+ vertex 155.84248092756275 -83.43167595319574 384.08876112274515
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 156.08361856375018 -83.33169923617082 384.0887649757282
+ vertex 155.34472791942744 -75.2831160954106 384.08888775027697
+ vertex 155.956468653405 -83.36581440865034 384.0887632437175
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 156.21526560233286 -83.33165532838312 384.08876620074363
+ vertex 155.34472791942744 -75.2831160954106 384.08888775027697
+ vertex 156.08361856375018 -83.33169923617082 384.0887649757282
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 156.3424382410316 -83.36568567753054 384.08876683528104
+ vertex 155.34472791942744 -75.2831160954106 384.08888775027697
+ vertex 156.21526560233286 -83.33165532838312 384.08876620074363
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 157.698653527681 -84.14864623799916 384.08876683609776
+ vertex 155.34472791942744 -75.2831160954106 384.08888775027697
+ vertex 156.3424382410316 -83.36568567753054 384.08876683528104
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 160.29719368142358 -85.64891409526253 384.08876683609776
+ vertex 164.04756670090563 -79.15279844355386 384.08890635341305
+ vertex 158.56473692330022 -84.64867971960062 384.08876683609776
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 157.698653527681 -84.14864623799916 384.08876683609776
+ vertex 158.56473692330022 -84.64867971960062 384.08876683609776
+ vertex 164.04756670090563 -79.15279844355386 384.08890635341305
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 155.34472791942744 -75.2831160954106 384.08888775027697
+ vertex 157.698653527681 -84.14864623799916 384.08876683609776
+ vertex 164.04756670090563 -79.15279844355386 384.08890635341305
+ endloop
+endfacet
+facet normal -9.299929624606113e-06 -1.6107950615256996e-05 0.9999999998270228
+ outer loop
+ vertex 156.71074651486813 -74.91706528395908 384.0889063504822
+ vertex 155.34472791942744 -75.2831160954106 384.08888775027697
+ vertex 164.04756670090563 -79.15279844355386 384.08890635341305
+ endloop
+endfacet
+facet normal 0.4999838918764072 0.866034703414457 1.8599859244801655e-05
+ outer loop
+ vertex 156.71075581479778 -74.91704917600845 383.0889063506552
+ vertex 156.71074651486813 -74.91706528395908 384.0889063504822
+ vertex 164.04757600083528 -79.15278233560326 383.088906353586
+ endloop
+endfacet
+facet normal 0.4999838918764072 0.866034703414457 1.8599859244801655e-05
+ outer loop
+ vertex 164.04756670090563 -79.15279844355386 384.08890635341305
+ vertex 164.04757600083528 -79.15278233560326 383.088906353586
+ vertex 156.71074651486813 -74.91706528395908 384.0889063504822
+ endloop
+endfacet
+facet normal -0.2588370112032979 0.9659210120182565 1.3151841973605108e-05
+ outer loop
+ vertex 155.34473721935706 -75.28309998745999 383.08888775044994
+ vertex 155.34472791942744 -75.2831160954106 384.08888775027697
+ vertex 156.71075581479778 -74.91704917600845 383.0889063506552
+ endloop
+endfacet
+facet normal -0.2588370112032979 0.9659210120182565 1.3151841973605108e-05
+ outer loop
+ vertex 156.71074651486813 -74.91706528395908 384.0889063504822
+ vertex 156.71075581479778 -74.91704917600845 383.0889063506552
+ vertex 155.34472791942744 -75.2831160954106 384.08888775027697
+ endloop
+endfacet
+facet normal -0.4999838918764072 -0.866034703414457 -1.8599859244801655e-05
+ outer loop
+ vertex 143.21119073413476 -98.29998616819879 383.0884041544556
+ vertex 143.2112418837477 -98.29989757447039 377.588404155407
+ vertex 150.5480109201723 -102.53571932779359 383.0884041573864
+ endloop
+endfacet
+facet normal -0.4999838918764072 -0.866034703414457 -1.8599859244801655e-05
+ outer loop
+ vertex 150.5480620697852 -102.53563073406521 377.58840415833777
+ vertex 150.5480109201723 -102.53571932779359 383.0884041573864
+ vertex 143.2112418837477 -98.29989757447039 377.588404155407
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.4595554199157153e-10
+ outer loop
+ vertex 155.34473721935706 -75.28309998745999 383.08888775044994
+ vertex 142.8451399224469 -96.9339675728214 383.08842275396887
+ vertex 155.34472791942744 -75.2831160954106 384.08888775027697
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.4595554199157153e-10
+ outer loop
+ vertex 142.84513062251727 -96.93398368077203 384.0884227537959
+ vertex 155.34472791942744 -75.2831160954106 384.08888775027697
+ vertex 142.8451399224469 -96.9339675728214 383.08842275396887
+ endloop
+endfacet
+facet normal -0.9659210120630118 -0.25883701103625684 -1.3152331228624571e-05
+ outer loop
+ vertex 142.8451399224469 -96.9339675728214 383.08842275396887
+ vertex 142.84519107205983 -96.93387897909302 377.58842275492026
+ vertex 143.21119073413476 -98.29998616819879 383.0884041544556
+ endloop
+endfacet
+facet normal -0.9659210120630118 -0.25883701103625684 -1.3152331228624571e-05
+ outer loop
+ vertex 143.2112418837477 -98.29989757447039 377.588404155407
+ vertex 143.21119073413476 -98.29998616819879 383.0884041544556
+ vertex 142.84519107205983 -96.93387897909302 377.58842275492026
+ endloop
+endfacet
+facet normal -0.4999757178927258 -0.8660394224119932 -1.859985924070793e-05
+ outer loop
+ vertex 156.34244754096125 -83.36566956957992 383.08876683545407
+ vertex 156.3424986905742 -83.36558097585154 377.5887668364054
+ vertex 157.6986628276106 -84.14863013004855 383.08876683627074
+ endloop
+endfacet
+facet normal -0.4999757178927258 -0.8660394224119932 -1.859985924070793e-05
+ outer loop
+ vertex 157.69871397722355 -84.14854153632015 377.58876683722207
+ vertex 157.6986628276106 -84.14863013004855 383.08876683627074
+ vertex 156.3424986905742 -83.36558097585154 377.5887668364054
+ endloop
+endfacet
+facet normal -0.25849686862182286 -0.966012095467748 -1.7964477816981815e-05
+ outer loop
+ vertex 156.21527490226245 -83.33163922043241 383.08876620091667
+ vertex 156.21532605187542 -83.33155062670411 377.58876620186805
+ vertex 156.34244754096125 -83.36566956957992 383.08876683545407
+ endloop
+endfacet
+facet normal -0.25849686862182286 -0.966012095467748 -1.7964477816981815e-05
+ outer loop
+ vertex 156.3424986905742 -83.36558097585154 377.5887668364054
+ vertex 156.34244754096125 -83.36566956957992 383.08876683545407
+ vertex 156.21532605187542 -83.33155062670411 377.58876620186805
+ endloop
+endfacet
+facet normal 0.0003335267201213798 -0.9999999442502788 -1.6104847944957366e-05
+ outer loop
+ vertex 156.08362786367974 -83.33168312822013 383.0887649759012
+ vertex 156.08367901329274 -83.33159453449183 377.5887649768526
+ vertex 156.21527490226245 -83.33163922043241 383.08876620091667
+ endloop
+endfacet
+facet normal 0.0003335267201213798 -0.9999999442502788 -1.6104847944957366e-05
+ outer loop
+ vertex 156.21532605187542 -83.33155062670411 377.58876620186805
+ vertex 156.21527490226245 -83.33163922043241 383.08876620091667
+ vertex 156.08367901329274 -83.33159453449183 377.5887649768526
+ endloop
+endfacet
+facet normal 0.25914119276608716 -0.9658394494111885 -1.3147699300030625e-05
+ outer loop
+ vertex 155.9565291029476 -83.36570970697133 377.58876324484186
+ vertex 156.08367901329274 -83.33159453449183 377.5887649768526
+ vertex 155.95647795333463 -83.36579830069972 383.08876324389047
+ endloop
+endfacet
+facet normal 0.25914119276608716 -0.9658394494111885 -1.3147699300030625e-05
+ outer loop
+ vertex 156.08362786367974 -83.33168312822013 383.0887649759012
+ vertex 155.95647795333463 -83.36579830069972 383.08876324389047
+ vertex 156.08367901329274 -83.33159453449183 377.5887649768526
+ endloop
+endfacet
+facet normal 0.5002888147805679 -0.8658585922187676 -9.294556675347812e-06
+ outer loop
+ vertex 155.8425413771053 -83.43157125151674 377.5887611238695
+ vertex 155.9565291029476 -83.36570970697133 377.58876324484186
+ vertex 155.8424902274924 -83.43165984524512 383.08876112291813
+ endloop
+endfacet
+facet normal 0.5002888147805679 -0.8658585922187676 -9.294556675347812e-06
+ outer loop
+ vertex 155.95647795333463 -83.36579830069972 383.08876324389047
+ vertex 155.8424902274924 -83.43165984524512 383.08876112291813
+ vertex 155.9565291029476 -83.36570970697133 377.58876324484186
+ endloop
+endfacet
+facet normal 0.7073425808317078 -0.7068709028664446 -4.808005373256878e-06
+ outer loop
+ vertex 155.7494839109084 -83.52469081270831 377.58875875847633
+ vertex 155.8425413771053 -83.43157125151674 377.5887611238695
+ vertex 155.74943276129548 -83.5247794064367 383.08875875752494
+ endloop
+endfacet
+facet normal 0.7073425808317078 -0.7068709028664446 -4.808005373256878e-06
+ outer loop
+ vertex 155.8424902274924 -83.43165984524512 383.08876112291813
+ vertex 155.74943276129548 -83.5247794064367 383.08875875752494
+ vertex 155.8425413771053 -83.43157125151674 377.5887611238695
+ endloop
+endfacet
+facet normal 0.8660347035642624 -0.4999838919628916 3.4595554214238134e-10
+ outer loop
+ vertex 150.18493425931072 -93.1631875432145 377.5885517521268
+ vertex 155.7494839109084 -83.52469081270831 377.58875875847633
+ vertex 150.18488310969778 -93.16327613694288 383.08855175117543
+ endloop
+endfacet
+facet normal 0.8660347035642624 -0.4999838919628916 3.4595554214238134e-10
+ outer loop
+ vertex 155.74943276129548 -83.5247794064367 383.08875875752494
+ vertex 150.18488310969778 -93.16327613694288 383.08855175117543
+ vertex 155.7494839109084 -83.52469081270831 377.58875875847633
+ endloop
+endfacet
+facet normal 0.9648872694768666 -0.2626643431815329 4.742399434363141e-06
+ outer loop
+ vertex 150.18493425931072 -93.1631875432145 377.5885517521268
+ vertex 150.18488310969778 -93.16327613694288 383.08855175117543
+ vertex 150.15037177433956 -93.29015149027116 377.58854938556914
+ endloop
+endfacet
+facet normal 0.9648872694768666 -0.2626643431815329 4.742399434363141e-06
+ outer loop
+ vertex 150.15032062472662 -93.29024008399958 383.08854938461775
+ vertex 150.15037177433956 -93.29015149027116 377.58854938556914
+ vertex 150.18488310969778 -93.16327613694288 383.08855175117543
+ endloop
+endfacet
+facet normal 0.9999920674984399 -0.003983071038499263 9.235696742989525e-06
+ outer loop
+ vertex 150.14984766502906 -93.42173467510136 377.5885472611595
+ vertex 150.15037177433956 -93.29015149027116 377.58854938556914
+ vertex 150.1497965154161 -93.42182326882974 383.0885472602081
+ endloop
+endfacet
+facet normal 0.9999920674984399 -0.003983071038499263 9.235696742989525e-06
+ outer loop
+ vertex 150.15032062472662 -93.29024008399958 383.08854938461775
+ vertex 150.1497965154161 -93.42182326882974 383.0885472602081
+ vertex 150.15037177433956 -93.29015149027116 377.58854938556914
+ endloop
+endfacet
+facet normal 0.966949058684553 0.25496964081524937 1.3099596581315954e-05
+ outer loop
+ vertex 150.18339764856273 -93.54896992111058 377.5885455236729
+ vertex 150.14984766502906 -93.42173467510136 377.5885472611595
+ vertex 150.18334649894976 -93.54905851483902 383.0885455227216
+ endloop
+endfacet
+facet normal 0.966949058684553 0.25496964081524937 1.3099596581315954e-05
+ outer loop
+ vertex 150.1497965154161 -93.42182326882974 383.0885472602081
+ vertex 150.18334649894976 -93.54905851483902 383.0885455227216
+ vertex 150.14984766502906 -93.42173467510136 377.5885472611595
+ endloop
+endfacet
+facet normal 0.8680100694813435 0.4965465930008214 1.6070780560681005e-05
+ outer loop
+ vertex 150.18339764856273 -93.54896992111058 377.5885455236729
+ vertex 150.18334649894976 -93.54905851483902 383.0885455227216
+ vertex 150.24873534900635 -93.66318635654974 377.5885442915162
+ endloop
+endfacet
+facet normal 0.8680100694813435 0.4965465930008214 1.6070780560681005e-05
+ outer loop
+ vertex 150.2486841993934 -93.66327495027812 383.08854429056487
+ vertex 150.24873534900635 -93.66318635654974 377.5885442915162
+ vertex 150.18334649894976 -93.54905851483902 383.0885455227216
+ endloop
+endfacet
+facet normal 0.7099176284945937 0.7042847154599664 1.7946767403102792e-05
+ outer loop
+ vertex 150.24873534900635 -93.66318635654974 377.5885442915162
+ vertex 150.2486841993934 -93.66327495027812 383.08854429056487
+ vertex 150.34140811005074 -93.75660032009456 377.5885436486589
+ endloop
+endfacet
+facet normal 0.7099176284945937 0.7042847154599664 1.7946767403102792e-05
+ outer loop
+ vertex 150.3413569604378 -93.75668891382294 383.0885436477075
+ vertex 150.34140811005074 -93.75660032009456 377.5885436486589
+ vertex 150.2486841993934 -93.66327495027812 383.08854429056487
+ endloop
+endfacet
+facet normal 0.5002746392317561 0.8658667824761391 1.8599858312563282e-05
+ outer loop
+ vertex 150.34140811005074 -93.75660032009456 377.5885436486589
+ vertex 150.3413569604378 -93.75668891382294 383.0885436477075
+ vertex 151.6993265665208 -94.54116923954639 377.58854363940753
+ endloop
+endfacet
+facet normal 0.5002746392317561 0.8658667824761391 1.8599858312563282e-05
+ outer loop
+ vertex 151.69927541690788 -94.54125783327477 383.0885436384562
+ vertex 151.6993265665208 -94.54116923954639 377.58854363940753
+ vertex 150.3413569604378 -93.75668891382294 383.0885436477075
+ endloop
+endfacet
+facet normal -0.8660347035642884 0.4999838919628465 -3.459555431105591e-10
+ outer loop
+ vertex 152.4492800837124 -93.24215584653827 377.58857153836607
+ vertex 151.6993265665208 -94.54116923954639 377.58854363940753
+ vertex 152.4492289340995 -93.24224444026666 383.0885715374147
+ endloop
+endfacet
+facet normal -0.8660347035642884 0.4999838919628465 -3.459555431105591e-10
+ outer loop
+ vertex 151.69927541690788 -94.54125783327477 383.0885436384562
+ vertex 152.4492289340995 -93.24224444026666 383.0885715374147
+ vertex 151.6993265665208 -94.54116923954639 377.58854363940753
+ endloop
+endfacet
+facet normal 0.4999452292644192 0.8660570231744518 1.85998592108228e-05
+ outer loop
+ vertex 152.4492800837124 -93.24215584653827 377.58857153836607
+ vertex 152.4492289340995 -93.24224444026666 383.0885715374147
+ vertex 153.31533710703678 -93.74210107588924 377.5885715395424
+ endloop
+endfacet
+facet normal 0.4999452292644192 0.8660570231744518 1.85998592108228e-05
+ outer loop
+ vertex 153.31528595742384 -93.74218966961762 383.088571538591
+ vertex 153.31533710703678 -93.74210107588924 377.5885715395424
+ vertex 152.4492289340995 -93.24224444026666 383.0885715374147
+ endloop
+endfacet
+facet normal 0.8660570233241365 -0.4999452293511121 1.1763031795558303e-09
+ outer loop
+ vertex 152.56541926239248 -95.0411866119454 377.58854363975354
+ vertex 153.31533710703678 -93.74210107588924 377.5885715395424
+ vertex 152.56536811277957 -95.0412752056738 383.08854363880215
+ endloop
+endfacet
+facet normal 0.8660570233241365 -0.4999452293511121 1.1763031795558303e-09
+ outer loop
+ vertex 153.31528595742384 -93.74218966961762 383.088571538591
+ vertex 152.56536811277957 -95.0412752056738 383.08854363880215
+ vertex 153.31533710703678 -93.74210107588924 377.5885715395424
+ endloop
+endfacet
+facet normal 0.4999838918764072 0.866034703414457 1.8599859244801655e-05
+ outer loop
+ vertex 152.56541926239248 -95.0411866119454 377.58854363975354
+ vertex 152.56536811277957 -95.0412752056738 383.08854363880215
+ vertex 154.29748867124704 -96.04115439686767 377.58854364044544
+ endloop
+endfacet
+facet normal 0.4999838918764072 0.866034703414457 1.8599859244801655e-05
+ outer loop
+ vertex 154.2974375216341 -96.04124299059606 383.08854363949405
+ vertex 154.29748867124704 -96.04115439686767 377.58854364044544
+ vertex 152.56536811277957 -95.0412752056738 383.08854363880215
+ endloop
+endfacet
+facet normal -0.4999959729039955 -0.8660277285792044 -2.0291151848476755e-05
+ outer loop
+ vertex 158.5647369214202 -84.64867972354897 383.0887668359247
+ vertex 158.56479737284278 -84.64857501792163 377.58876683722207
+ vertex 160.29720298135322 -85.64889798731191 383.08876683627074
+ endloop
+endfacet
+facet normal -0.4999959729039955 -0.8660277285792044 -2.0291151848476755e-05
+ outer loop
+ vertex 160.29725413096617 -85.64880939358353 377.5887668372221
+ vertex 160.29720298135322 -85.64889798731191 383.08876683627074
+ vertex 158.56479737284278 -84.64857501792163 377.58876683722207
+ endloop
+endfacet
+facet normal 0.8660347035643184 -0.4999838919627944 3.45955544433092e-10
+ outer loop
+ vertex 157.81485315515155 -85.94757230303082 377.58873893860954
+ vertex 158.56479737284278 -84.64857501792163 377.58876683722207
+ vertex 157.81480200553864 -85.94766089675922 383.08873893765815
+ endloop
+endfacet
+facet normal 0.8660347035643184 -0.4999838919627944 3.45955544433092e-10
+ outer loop
+ vertex 158.5647369214202 -84.64867972354897 383.0887668359247
+ vertex 157.81480200553864 -85.94766089675922 383.08873893765815
+ vertex 158.56479737284278 -84.64857501792163 377.58876683722207
+ endloop
+endfacet
+facet normal -0.49994522926465357 -0.8660570231743162 -1.8599859210822796e-05
+ outer loop
+ vertex 156.94874498221435 -85.44771566740796 383.08873893648183
+ vertex 156.94879613182727 -85.44762707367958 377.5887389374332
+ vertex 157.81480200553864 -85.94766089675922 383.08873893765815
+ endloop
+endfacet
+facet normal -0.49994522926465357 -0.8660570231743162 -1.8599859210822796e-05
+ outer loop
+ vertex 157.81485315515155 -85.94757230303082 377.58873893860954
+ vertex 157.81480200553864 -85.94766089675922 383.08873893765815
+ vertex 156.94879613182727 -85.44762707367958 377.5887389374332
+ endloop
+endfacet
+facet normal -0.8660570233242345 0.49994522935094254 -1.1763031831991422e-09
+ outer loop
+ vertex 157.69871397722355 -84.14854153632015 377.58876683722207
+ vertex 156.94879613182727 -85.44762707367958 377.5887389374332
+ vertex 157.6986628276106 -84.14863013004855 383.08876683627074
+ endloop
+endfacet
+facet normal -0.8660570233242345 0.49994522935094254 -1.1763031831991422e-09
+ outer loop
+ vertex 156.94874498221435 -85.44771566740796 383.08873893648183
+ vertex 157.6986628276106 -84.14863013004855 383.08876683627074
+ vertex 156.94879613182727 -85.44762707367958 377.5887389374332
+ endloop
+endfacet
+facet normal 0.8660347035642463 -0.4999838919629194 3.459555415440488e-10
+ outer loop
+ vertex 160.29720298135322 -85.64889798731191 383.08876683627074
+ vertex 164.04757600083528 -79.15278233560326 383.088906353586
+ vertex 160.29719368142358 -85.64891409526253 384.08876683609776
+ endloop
+endfacet
+facet normal 0.8660347035642463 -0.4999838919629194 3.459555415440488e-10
+ outer loop
+ vertex 164.04756670090563 -79.15279844355386 384.08890635341305
+ vertex 160.29719368142358 -85.64891409526253 384.08876683609776
+ vertex 164.04757600083528 -79.15278233560326 383.088906353586
+ endloop
+endfacet
+facet normal 0.8660347035642583 -0.4999838919628986 3.4595554199157153e-10
+ outer loop
+ vertex 150.5480620697852 -102.53563073406521 377.58840415833777
+ vertex 154.29748867124704 -96.04115439686767 377.58854364044544
+ vertex 150.5480109201723 -102.53571932779359 383.0884041573864
+ endloop
+endfacet
+facet normal 0.8660347035642583 -0.4999838919628986 3.4595554199157153e-10
+ outer loop
+ vertex 154.2974375216341 -96.04124299059606 383.08854363949405
+ vertex 150.5480109201723 -102.53571932779359 383.0884041573864
+ vertex 154.29748867124704 -96.04115439686767 377.58854364044544
+ endloop
+endfacet
+facet normal 0.8660347035642463 -0.4999838919629194 3.459555415440488e-10
+ outer loop
+ vertex 160.29725413096617 -85.64880939358353 377.5887668372221
+ vertex 164.04762715044822 -79.15269374187487 377.5889063545374
+ vertex 160.29720298135322 -85.64889798731191 383.08876683627074
+ endloop
+endfacet
+facet normal 0.8660347035642463 -0.4999838919629194 3.459555415440488e-10
+ outer loop
+ vertex 164.04757600083528 -79.15278233560326 383.088906353586
+ vertex 160.29720298135322 -85.64889798731191 383.08876683627074
+ vertex 164.04762715044822 -79.15269374187487 377.5889063545374
+ endloop
+endfacet
+facet normal -0.49999597298531645 -0.866027728720056 -9.297749943632537e-06
+ outer loop
+ vertex 158.56473692330022 -84.64867971960062 384.08876683609776
+ vertex 158.5647369214202 -84.64867972354897 383.0887668359247
+ vertex 160.29719368142358 -85.64891409526253 384.08876683609776
+ endloop
+endfacet
+facet normal -0.49999597298531645 -0.866027728720056 -9.297749943632537e-06
+ outer loop
+ vertex 160.29720298135322 -85.64889798731191 383.08876683627074
+ vertex 160.29719368142358 -85.64891409526253 384.08876683609776
+ vertex 158.5647369214202 -84.64867972354897 383.0887668359247
+ endloop
+endfacet
+facet normal -0.49994522926465357 -0.8660570231743162 -1.8599859210822796e-05
+ outer loop
+ vertex 156.9487356822847 -85.44773177535858 384.0887389363089
+ vertex 156.94874498221435 -85.44771566740796 383.08873893648183
+ vertex 157.814792705609 -85.94767700470983 384.08873893748523
+ endloop
+endfacet
+facet normal -0.49994522926465357 -0.8660570231743162 -1.8599859210822796e-05
+ outer loop
+ vertex 157.81480200553864 -85.94766089675922 383.08873893765815
+ vertex 157.814792705609 -85.94767700470983 384.08873893748523
+ vertex 156.94874498221435 -85.44771566740796 383.08873893648183
+ endloop
+endfacet
+facet normal -0.4999757178927258 -0.8660394224119932 -1.859985924070793e-05
+ outer loop
+ vertex 156.3424382410316 -83.36568567753054 384.08876683528104
+ vertex 156.34244754096125 -83.36566956957992 383.08876683545407
+ vertex 157.698653527681 -84.14864623799916 384.08876683609776
+ endloop
+endfacet
+facet normal -0.4999757178927258 -0.8660394224119932 -1.859985924070793e-05
+ outer loop
+ vertex 157.6986628276106 -84.14863013004855 383.08876683627074
+ vertex 157.698653527681 -84.14864623799916 384.08876683609776
+ vertex 156.34244754096125 -83.36566956957992 383.08876683545407
+ endloop
+endfacet
+facet normal 0.8660347035643184 -0.4999838919627944 3.459555431103176e-10
+ outer loop
+ vertex 157.81480200553864 -85.94766089675922 383.08873893765815
+ vertex 158.5647369214202 -84.64867972354897 383.0887668359247
+ vertex 157.814792705609 -85.94767700470983 384.08873893748523
+ endloop
+endfacet
+facet normal 0.8660347035643184 -0.4999838919627944 3.459555431103176e-10
+ outer loop
+ vertex 158.56473692330022 -84.64867971960062 384.08876683609776
+ vertex 157.814792705609 -85.94767700470983 384.08873893748523
+ vertex 158.5647369214202 -84.64867972354897 383.0887668359247
+ endloop
+endfacet
+facet normal -0.8660570233242345 0.49994522935094254 -1.1763031831987292e-09
+ outer loop
+ vertex 157.6986628276106 -84.14863013004855 383.08876683627074
+ vertex 156.94874498221435 -85.44771566740796 383.08873893648183
+ vertex 157.698653527681 -84.14864623799916 384.08876683609776
+ endloop
+endfacet
+facet normal -0.8660570233242345 0.49994522935094254 -1.1763031831987292e-09
+ outer loop
+ vertex 156.9487356822847 -85.44773177535858 384.0887389363089
+ vertex 157.698653527681 -84.14864623799916 384.08876683609776
+ vertex 156.94874498221435 -85.44771566740796 383.08873893648183
+ endloop
+endfacet
+facet normal -0.25849686862206855 -0.9660120954676824 -1.796447785046388e-05
+ outer loop
+ vertex 156.21527490226245 -83.33163922043241 383.08876620091667
+ vertex 156.34244754096125 -83.36566956957992 383.08876683545407
+ vertex 156.21526560233286 -83.33165532838312 384.08876620074363
+ endloop
+endfacet
+facet normal -0.25849686862206855 -0.9660120954676824 -1.796447785046388e-05
+ outer loop
+ vertex 156.3424382410316 -83.36568567753054 384.08876683528104
+ vertex 156.21526560233286 -83.33165532838312 384.08876620074363
+ vertex 156.34244754096125 -83.36566956957992 383.08876683545407
+ endloop
+endfacet
+facet normal 0.0003335267201213798 -0.9999999442502788 -1.6104848029167617e-05
+ outer loop
+ vertex 156.08362786367974 -83.33168312822013 383.0887649759012
+ vertex 156.21527490226245 -83.33163922043241 383.08876620091667
+ vertex 156.08361856375018 -83.33169923617082 384.0887649757282
+ endloop
+endfacet
+facet normal 0.0003335267201213798 -0.9999999442502788 -1.6104848029167617e-05
+ outer loop
+ vertex 156.21526560233286 -83.33165532838312 384.08876620074363
+ vertex 156.08361856375018 -83.33169923617082 384.0887649757282
+ vertex 156.21527490226245 -83.33163922043241 383.08876620091667
+ endloop
+endfacet
+facet normal 0.2591411927664384 -0.9658394494110942 -1.3147699347887451e-05
+ outer loop
+ vertex 155.95647795333463 -83.36579830069972 383.08876324389047
+ vertex 156.08362786367974 -83.33168312822013 383.0887649759012
+ vertex 155.956468653405 -83.36581440865034 384.0887632437175
+ endloop
+endfacet
+facet normal 0.2591411927664384 -0.9658394494110942 -1.3147699347887451e-05
+ outer loop
+ vertex 156.08361856375018 -83.33169923617082 384.0887649757282
+ vertex 155.956468653405 -83.36581440865034 384.0887632437175
+ vertex 156.08362786367974 -83.33168312822013 383.0887649759012
+ endloop
+endfacet
+facet normal 0.5002888147805681 -0.8658585922187676 -9.294556675347812e-06
+ outer loop
+ vertex 155.8424902274924 -83.43165984524512 383.08876112291813
+ vertex 155.95647795333463 -83.36579830069972 383.08876324389047
+ vertex 155.84248092756275 -83.43167595319574 384.08876112274515
+ endloop
+endfacet
+facet normal 0.5002888147805681 -0.8658585922187676 -9.294556675347812e-06
+ outer loop
+ vertex 155.956468653405 -83.36581440865034 384.0887632437175
+ vertex 155.84248092756275 -83.43167595319574 384.08876112274515
+ vertex 155.95647795333463 -83.36579830069972 383.08876324389047
+ endloop
+endfacet
+facet normal 0.7073425808317078 -0.7068709028664445 -4.8080053732568774e-06
+ outer loop
+ vertex 155.74943276129548 -83.5247794064367 383.08875875752494
+ vertex 155.8424902274924 -83.43165984524512 383.08876112291813
+ vertex 155.74942346136584 -83.5247955143873 384.08875875735197
+ endloop
+endfacet
+facet normal 0.7073425808317078 -0.7068709028664445 -4.8080053732568774e-06
+ outer loop
+ vertex 155.84248092756275 -83.43167595319574 384.08876112274515
+ vertex 155.74942346136584 -83.5247955143873 384.08875875735197
+ vertex 155.8424902274924 -83.43165984524512 383.08876112291813
+ endloop
+endfacet
+facet normal 0.8660347035642624 -0.4999838919628916 3.4595554214238134e-10
+ outer loop
+ vertex 150.18488310969778 -93.16327613694288 383.08855175117543
+ vertex 155.74943276129548 -83.5247794064367 383.08875875752494
+ vertex 150.18487380976816 -93.1632922448935 384.08855175100246
+ endloop
+endfacet
+facet normal 0.8660347035642624 -0.4999838919628916 3.4595554214238134e-10
+ outer loop
+ vertex 155.74942346136584 -83.5247955143873 384.08875875735197
+ vertex 150.18487380976816 -93.1632922448935 384.08855175100246
+ vertex 155.74943276129548 -83.5247794064367 383.08875875752494
+ endloop
+endfacet
+facet normal 0.9648872694768552 -0.26266434318157506 4.7423994286110264e-06
+ outer loop
+ vertex 150.15032062472662 -93.29024008399958 383.08854938461775
+ vertex 150.18488310969778 -93.16327613694288 383.08855175117543
+ vertex 150.150311324797 -93.29025619195016 384.0885493844448
+ endloop
+endfacet
+facet normal 0.9648872694768552 -0.26266434318157506 4.7423994286110264e-06
+ outer loop
+ vertex 150.18487380976816 -93.1632922448935 384.08855175100246
+ vertex 150.150311324797 -93.29025619195016 384.0885493844448
+ vertex 150.18488310969778 -93.16327613694288 383.08855175117543
+ endloop
+endfacet
+facet normal 0.9999920674984402 -0.003983071038414164 9.235696731787482e-06
+ outer loop
+ vertex 150.1497965154161 -93.42182326882974 383.0885472602081
+ vertex 150.15032062472662 -93.29024008399958 383.08854938461775
+ vertex 150.14978721548647 -93.42183937678035 384.0885472600351
+ endloop
+endfacet
+facet normal 0.9999920674984402 -0.003983071038414164 9.235696731787482e-06
+ outer loop
+ vertex 150.150311324797 -93.29025619195016 384.0885493844448
+ vertex 150.14978721548647 -93.42183937678035 384.0885472600351
+ vertex 150.15032062472662 -93.29024008399958 383.08854938461775
+ endloop
+endfacet
+facet normal 0.9669490586845839 0.25496964081513257 1.3099596565427152e-05
+ outer loop
+ vertex 150.18334649894976 -93.54905851483902 383.0885455227216
+ vertex 150.1497965154161 -93.42182326882974 383.0885472602081
+ vertex 150.18333719902014 -93.54907462278959 384.08854552254854
+ endloop
+endfacet
+facet normal 0.9669490586845839 0.25496964081513257 1.3099596565427152e-05
+ outer loop
+ vertex 150.14978721548647 -93.42183937678035 384.0885472600351
+ vertex 150.18333719902014 -93.54907462278959 384.08854552254854
+ vertex 150.1497965154161 -93.42182326882974 383.0885472602081
+ endloop
+endfacet
+facet normal 0.8680100694812698 0.49654659300095 1.6070780541189686e-05
+ outer loop
+ vertex 150.18334649894976 -93.54905851483902 383.0885455227216
+ vertex 150.18333719902014 -93.54907462278959 384.08854552254854
+ vertex 150.2486841993934 -93.66327495027812 383.08854429056487
+ endloop
+endfacet
+facet normal 0.8680100694812698 0.49654659300095 1.6070780541189686e-05
+ outer loop
+ vertex 150.2486748994638 -93.66329105822874 384.0885442903919
+ vertex 150.2486841993934 -93.66327495027812 383.08854429056487
+ vertex 150.18333719902014 -93.54907462278959 384.08854552254854
+ endloop
+endfacet
+facet normal 0.7099176284945936 0.7042847154599665 1.794676740310279e-05
+ outer loop
+ vertex 150.2486841993934 -93.66327495027812 383.08854429056487
+ vertex 150.2486748994638 -93.66329105822874 384.0885442903919
+ vertex 150.3413569604378 -93.75668891382294 383.0885436477075
+ endloop
+endfacet
+facet normal 0.7099176284945936 0.7042847154599665 1.794676740310279e-05
+ outer loop
+ vertex 150.34134766050818 -93.75670502177356 384.08854364753455
+ vertex 150.3413569604378 -93.75668891382294 383.0885436477075
+ vertex 150.2486748994638 -93.66329105822874 384.0885442903919
+ endloop
+endfacet
+facet normal 0.5002746392317561 0.8658667824761391 1.859985831256328e-05
+ outer loop
+ vertex 150.3413569604378 -93.75668891382294 383.0885436477075
+ vertex 150.34134766050818 -93.75670502177356 384.08854364753455
+ vertex 151.69927541690788 -94.54125783327477 383.0885436384562
+ endloop
+endfacet
+facet normal 0.5002746392317561 0.8658667824761391 1.859985831256328e-05
+ outer loop
+ vertex 151.69926611697824 -94.54127394122538 384.08854363828317
+ vertex 151.69927541690788 -94.54125783327477 383.0885436384562
+ vertex 150.34134766050818 -93.75670502177356 384.08854364753455
+ endloop
+endfacet
+facet normal -0.8660347035642884 0.4999838919628465 -3.459555431105591e-10
+ outer loop
+ vertex 152.4492289340995 -93.24224444026666 383.0885715374147
+ vertex 151.69927541690788 -94.54125783327477 383.0885436384562
+ vertex 152.44921963416985 -93.24226054821727 384.0885715372417
+ endloop
+endfacet
+facet normal -0.8660347035642884 0.4999838919628465 -3.459555431105591e-10
+ outer loop
+ vertex 151.69926611697824 -94.54127394122538 384.08854363828317
+ vertex 152.44921963416985 -93.24226054821727 384.0885715372417
+ vertex 151.69927541690788 -94.54125783327477 383.0885436384562
+ endloop
+endfacet
+facet normal 0.4999452292644192 0.8660570231744518 1.85998592108228e-05
+ outer loop
+ vertex 152.4492289340995 -93.24224444026666 383.0885715374147
+ vertex 152.44921963416985 -93.24226054821727 384.0885715372417
+ vertex 153.31528595742384 -93.74218966961762 383.088571538591
+ endloop
+endfacet
+facet normal 0.4999452292644192 0.8660570231744518 1.85998592108228e-05
+ outer loop
+ vertex 153.31527665749422 -93.74220577756824 384.088571538418
+ vertex 153.31528595742384 -93.74218966961762 383.088571538591
+ vertex 152.44921963416985 -93.24226054821727 384.0885715372417
+ endloop
+endfacet
+facet normal 0.8660570233241365 -0.4999452293511121 1.1763031795558303e-09
+ outer loop
+ vertex 152.56536811277957 -95.0412752056738 383.08854363880215
+ vertex 153.31528595742384 -93.74218966961762 383.088571538591
+ vertex 152.56535881284992 -95.0412913136244 384.0885436386292
+ endloop
+endfacet
+facet normal 0.8660570233241365 -0.4999452293511121 1.1763031795558303e-09
+ outer loop
+ vertex 153.31527665749422 -93.74220577756824 384.088571538418
+ vertex 152.56535881284992 -95.0412913136244 384.0885436386292
+ vertex 153.31528595742384 -93.74218966961762 383.088571538591
+ endloop
+endfacet
+facet normal 0.4999838918764072 0.866034703414457 1.8599859244801655e-05
+ outer loop
+ vertex 152.56536811277957 -95.0412752056738 383.08854363880215
+ vertex 152.56535881284992 -95.0412913136244 384.0885436386292
+ vertex 154.2974375216341 -96.04124299059606 383.08854363949405
+ endloop
+endfacet
+facet normal 0.4999838918764072 0.866034703414457 1.8599859244801655e-05
+ outer loop
+ vertex 154.29742822170445 -96.04125909854667 384.08854363932113
+ vertex 154.2974375216341 -96.04124299059606 383.08854363949405
+ vertex 152.56535881284992 -95.0412913136244 384.0885436386292
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 151.69927541690788 -94.54125783327477 383.0885436384562
+ vertex 152.56536811277957 -95.0412752056738 383.08854363880215
+ vertex 152.4492289340995 -93.24224444026666 383.0885715374147
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 153.31528595742384 -93.74218966961762 383.088571538591
+ vertex 152.4492289340995 -93.24224444026666 383.0885715374147
+ vertex 152.56536811277957 -95.0412752056738 383.08854363880215
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 156.94874498221435 -85.44771566740796 383.08873893648183
+ vertex 157.81480200553864 -85.94766089675922 383.08873893765815
+ vertex 157.6986628276106 -84.14863013004855 383.08876683627074
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 158.5647369214202 -84.64867972354897 383.0887668359247
+ vertex 157.6986628276106 -84.14863013004855 383.08876683627074
+ vertex 157.81480200553864 -85.94766089675922 383.08873893765815
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 151.69927541690788 -94.54125783327477 383.0885436384562
+ vertex 150.3413569604378 -93.75668891382294 383.0885436477075
+ vertex 142.8451399224469 -96.9339675728214 383.08842275396887
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 150.2486841993934 -93.66327495027812 383.08854429056487
+ vertex 142.8451399224469 -96.9339675728214 383.08842275396887
+ vertex 150.3413569604378 -93.75668891382294 383.0885436477075
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 150.18334649894976 -93.54905851483902 383.0885455227216
+ vertex 142.8451399224469 -96.9339675728214 383.08842275396887
+ vertex 150.2486841993934 -93.66327495027812 383.08854429056487
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 150.1497965154161 -93.42182326882974 383.0885472602081
+ vertex 142.8451399224469 -96.9339675728214 383.08842275396887
+ vertex 150.18334649894976 -93.54905851483902 383.0885455227216
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 150.15032062472662 -93.29024008399958 383.08854938461775
+ vertex 142.8451399224469 -96.9339675728214 383.08842275396887
+ vertex 150.1497965154161 -93.42182326882974 383.0885472602081
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 150.18488310969778 -93.16327613694288 383.08855175117543
+ vertex 142.8451399224469 -96.9339675728214 383.08842275396887
+ vertex 150.15032062472662 -93.29024008399958 383.08854938461775
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 155.34473721935706 -75.28309998745999 383.08888775044994
+ vertex 142.8451399224469 -96.9339675728214 383.08842275396887
+ vertex 150.18488310969778 -93.16327613694288 383.08855175117543
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 155.74943276129548 -83.5247794064367 383.08875875752494
+ vertex 155.34473721935706 -75.28309998745999 383.08888775044994
+ vertex 150.18488310969778 -93.16327613694288 383.08855175117543
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 155.8424902274924 -83.43165984524512 383.08876112291813
+ vertex 155.34473721935706 -75.28309998745999 383.08888775044994
+ vertex 155.74943276129548 -83.5247794064367 383.08875875752494
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 155.95647795333463 -83.36579830069972 383.08876324389047
+ vertex 155.34473721935706 -75.28309998745999 383.08888775044994
+ vertex 155.8424902274924 -83.43165984524512 383.08876112291813
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 156.08362786367974 -83.33168312822013 383.0887649759012
+ vertex 155.34473721935706 -75.28309998745999 383.08888775044994
+ vertex 155.95647795333463 -83.36579830069972 383.08876324389047
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 156.21527490226245 -83.33163922043241 383.08876620091667
+ vertex 155.34473721935706 -75.28309998745999 383.08888775044994
+ vertex 156.08362786367974 -83.33168312822013 383.0887649759012
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 156.34244754096125 -83.36566956957992 383.08876683545407
+ vertex 155.34473721935706 -75.28309998745999 383.08888775044994
+ vertex 156.21527490226245 -83.33163922043241 383.08876620091667
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 157.6986628276106 -84.14863013004855 383.08876683627074
+ vertex 155.34473721935706 -75.28309998745999 383.08888775044994
+ vertex 156.34244754096125 -83.36566956957992 383.08876683545407
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 160.29720298135322 -85.64889798731191 383.08876683627074
+ vertex 164.04757600083528 -79.15278233560326 383.088906353586
+ vertex 158.5647369214202 -84.64867972354897 383.0887668359247
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 157.6986628276106 -84.14863013004855 383.08876683627074
+ vertex 158.5647369214202 -84.64867972354897 383.0887668359247
+ vertex 164.04757600083528 -79.15278233560326 383.088906353586
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 155.34473721935706 -75.28309998745999 383.08888775044994
+ vertex 157.6986628276106 -84.14863013004855 383.08876683627074
+ vertex 164.04757600083528 -79.15278233560326 383.088906353586
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 156.71075581479778 -74.91704917600845 383.0889063506552
+ vertex 155.34473721935706 -75.28309998745999 383.08888775044994
+ vertex 164.04757600083528 -79.15278233560326 383.088906353586
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 143.21119073413476 -98.29998616819879 383.0884041544556
+ vertex 150.5480109201723 -102.53571932779359 383.0884041573864
+ vertex 142.8451399224469 -96.9339675728214 383.08842275396887
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 154.2974375216341 -96.04124299059606 383.08854363949405
+ vertex 142.8451399224469 -96.9339675728214 383.08842275396887
+ vertex 150.5480109201723 -102.53571932779359 383.0884041573864
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 151.69927541690788 -94.54125783327477 383.0885436384562
+ vertex 142.8451399224469 -96.9339675728214 383.08842275396887
+ vertex 154.2974375216341 -96.04124299059606 383.08854363949405
+ endloop
+endfacet
+facet normal -9.299929624683234e-06 -1.6107950615210427e-05 0.9999999998270228
+ outer loop
+ vertex 152.56536811277957 -95.0412752056738 383.08854363880215
+ vertex 151.69927541690788 -94.54125783327477 383.0885436384562
+ vertex 154.2974375216341 -96.04124299059606 383.08854363949405
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 157.8148531551514 -85.94757230303068 377.58873893860937
+ vertex 158.56479737284266 -84.64857501792149 377.5887668372219
+ vertex 156.94879613182712 -85.44762707367943 377.58873893743305
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 150.54806206978526 -102.53563073406517 377.58840415833754
+ vertex 154.29748867124707 -96.04115439686761 377.58854364044527
+ vertex 141.88771503414267 -97.53579181443617 377.58840415487805
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 152.56541926239237 -95.04118661194525 377.58854363975337
+ vertex 141.88771503414267 -97.53579181443617 377.58840415487805
+ vertex 154.29748867124707 -96.04115439686761 377.58854364044527
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 151.69932656652065 -94.54116923954622 377.58854363940736
+ vertex 141.88771503414267 -97.53579181443617 377.58840415487805
+ vertex 152.56541926239237 -95.04118661194525 377.58854363975337
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 153.31533710703664 -93.7421010758891 377.58857153954216
+ vertex 151.69932656652065 -94.54116923954622 377.58854363940736
+ vertex 152.56541926239237 -95.04118661194525 377.58854363975337
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 150.34140811005062 -93.7566003200944 377.5885436486587
+ vertex 141.88771503414267 -97.53579181443617 377.58840415487805
+ vertex 151.69932656652065 -94.54116923954622 377.58854363940736
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 150.2487353490062 -93.6631863565496 377.58854429151603
+ vertex 141.88771503414267 -97.53579181443617 377.58840415487805
+ vertex 150.34140811005062 -93.7566003200944 377.5885436486587
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 150.18339764856265 -93.54896992111053 377.58854552367274
+ vertex 141.88771503414267 -97.53579181443617 377.58840415487805
+ vertex 150.2487353490062 -93.6631863565496 377.58854429151603
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 150.14984766502894 -93.4217346751012 377.5885472611593
+ vertex 141.88771503414267 -97.53579181443617 377.58840415487805
+ vertex 150.18339764856265 -93.54896992111053 377.58854552367274
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 150.15037177433945 -93.29015149027101 377.5885493855689
+ vertex 141.88771503414267 -97.53579181443617 377.58840415487805
+ vertex 150.14984766502894 -93.4217346751012 377.5885472611593
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 150.18493425931052 -93.16318754321432 377.58855175212665
+ vertex 141.88771503414267 -97.53579181443617 377.58840415487805
+ vertex 150.15037177433945 -93.29015149027101 377.5885493855689
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 155.74948391090828 -83.52469081270817 377.5887587584761
+ vertex 141.88771503414267 -97.53579181443617 377.58840415487805
+ vertex 150.18493425931052 -93.16318754321432 377.58855175212665
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 146.57059546687424 -90.42448878139473 377.58856225385455
+ vertex 141.88771503414267 -97.53579181443617 377.58840415487805
+ vertex 155.74948391090828 -83.52469081270817 377.5887587584761
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 146.13757811509214 -90.17449683541328 377.5885622536816
+ vertex 141.88771503414267 -97.53579181443617 377.58840415487805
+ vertex 146.57059546687424 -90.42448878139473 377.58856225385455
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 164.04762715044825 -79.15269374187481 377.5889063545372
+ vertex 155.38728011480566 -74.15285482224584 377.5889063510776
+ vertex 160.2972541309662 -85.64880939358348 377.5887668372219
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 158.56479737284266 -84.64857501792149 377.5887668372219
+ vertex 160.2972541309662 -85.64880939358348 377.5887668372219
+ vertex 155.38728011480566 -74.15285482224584 377.5889063510776
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 157.6987139772234 -84.14854153632002 377.5887668372219
+ vertex 158.56479737284266 -84.64857501792149 377.5887668372219
+ vertex 155.38728011480566 -74.15285482224584 377.5889063510776
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 156.94879613182712 -85.44762707367943 377.58873893743305
+ vertex 158.56479737284266 -84.64857501792149 377.5887668372219
+ vertex 157.6987139772234 -84.14854153632002 377.5887668372219
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 156.39966123497643 -83.39853449621971 377.5887668371992
+ vertex 157.6987139772234 -84.14854153632002 377.5887668372219
+ vertex 155.38728011480566 -74.15285482224584 377.5889063510776
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 156.34249869057405 -83.36558097585139 377.5887668364052
+ vertex 156.39966123497643 -83.39853449621971 377.5887668371992
+ vertex 155.38728011480566 -74.15285482224584 377.5889063510776
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 156.21532605187525 -83.33155062670389 377.5887662018678
+ vertex 156.34249869057405 -83.36558097585139 377.5887668364052
+ vertex 155.38728011480566 -74.15285482224584 377.5889063510776
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 156.08367901329257 -83.33159453449159 377.58876497685236
+ vertex 156.21532605187525 -83.33155062670389 377.5887662018678
+ vertex 155.38728011480566 -74.15285482224584 377.5889063510776
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 155.9565291029474 -83.3657097069711 377.58876324484163
+ vertex 156.08367901329257 -83.33159453449159 377.58876497685236
+ vertex 155.38728011480566 -74.15285482224584 377.5889063510776
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 155.8425413771052 -83.4315712515166 377.58876112386935
+ vertex 155.9565291029474 -83.3657097069711 377.58876324484163
+ vertex 155.38728011480566 -74.15285482224584 377.5889063510776
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 155.74948391090828 -83.52469081270817 377.5887587584761
+ vertex 155.8425413771052 -83.4315712515166 377.58876112386935
+ vertex 155.38728011480566 -74.15285482224584 377.5889063510776
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 151.5704343856383 -81.76414174725016 377.588748252447
+ vertex 155.74948391090828 -83.52469081270817 377.5887587584761
+ vertex 155.38728011480566 -74.15285482224584 377.5889063510776
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 146.57059546687424 -90.42448878139473 377.58856225385455
+ vertex 155.74948391090828 -83.52469081270817 377.5887587584761
+ vertex 151.5704343856383 -81.76414174725016 377.588748252447
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 151.1374170338562 -81.51414980126874 377.58874825227406
+ vertex 151.5704343856383 -81.76414174725016 377.588748252447
+ vertex 155.38728011480566 -74.15285482224584 377.5889063510776
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 155.7166519372563 -83.58155990194558 377.5887575370966
+ vertex 155.74948391090828 -83.52469081270817 377.5887587584761
+ vertex 150.21682912661578 -93.10794163950449 377.5885529386449
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 150.18493425931052 -93.16318754321432 377.58855175212665
+ vertex 150.21682912661578 -93.10794163950449 377.5885529386449
+ vertex 155.74948391090828 -83.52469081270817 377.5887587584761
+ endloop
+endfacet
+facet normal -9.299929627727398e-06 -1.6107950613497323e-05 0.9999999998270228
+ outer loop
+ vertex 151.69932656652065 -94.54116923954622 377.58854363940736
+ vertex 153.31533710703664 -93.7421010758891 377.58857153954216
+ vertex 152.4492800837123 -93.24215584653813 377.5885715383659
+ endloop
+endfacet
+facet normal 0.8660347035642583 -0.4999838919628986 3.459555419915709e-10
+ outer loop
+ vertex 150.54806206978526 -102.53563073406517 377.58840415833754
+ vertex 150.54836431749806 -102.53510722567016 345.08840416395924
+ vertex 154.29748867124707 -96.04115439686761 377.58854364044527
+ endloop
+endfacet
+facet normal 0.8660347035642583 -0.4999838919628986 3.459555419915709e-10
+ outer loop
+ vertex 154.29779091895986 -96.04063088847262 345.08854364606697
+ vertex 154.29748867124707 -96.04115439686761 377.58854364044527
+ vertex 150.54836431749806 -102.53510722567016 345.08840416395924
+ endloop
+endfacet
+facet normal -0.4999838918764072 -0.866034703414457 -1.859985924480165e-05
+ outer loop
+ vertex 141.8880172818554 -97.53526830604113 345.0884041604997
+ vertex 150.54836431749806 -102.53510722567016 345.08840416395924
+ vertex 141.88771503414267 -97.53579181443617 377.58840415487805
+ endloop
+endfacet
+facet normal -0.4999838918764072 -0.866034703414457 -1.859985924480165e-05
+ outer loop
+ vertex 150.54806206978526 -102.53563073406517 377.58840415833754
+ vertex 141.88771503414267 -97.53579181443617 377.58840415487805
+ vertex 150.54836431749806 -102.53510722567016 345.08840416395924
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 151.1374170338562 -81.51414980126874 377.58874825227406
+ vertex 152.9308919167184 -78.43493313673302 350.9505833566614
+ vertex 151.13771928156893 -81.5136262928737 345.08874825789576
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 153.0057754383743 -78.30512674395735 350.5888147525759
+ vertex 151.13771928156893 -81.5136262928737 345.08874825789576
+ vertex 152.9308919167184 -78.43493313673302 350.9505833566614
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 153.12497264333518 -78.09868347083638 350.27815904985073
+ vertex 151.13771928156893 -81.5136262928737 345.08874825789576
+ vertex 153.0057754383743 -78.30512674395735 350.5888147525759
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 151.13771928156893 -81.5136262928737 345.08874825789576
+ vertex 153.12497264333518 -78.09868347083638 350.27815904985073
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 152.90542526661733 -78.47925655801097 351.3388109295899
+ vertex 152.9308919167184 -78.43493313673302 350.9505833566614
+ vertex 151.1374170338562 -81.51414980126874 377.58874825227406
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 152.90621390605745 -78.48014157712299 371.3388109089005
+ vertex 152.90542526661733 -78.47925655801097 351.3388109295899
+ vertex 151.1374170338562 -81.51414980126874 377.58874825227406
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 153.28036043906553 -77.82967208526959 350.0397869212439
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 153.12497264333518 -78.09868347083638 350.27815904985073
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 153.46134940407686 -77.5164252686211 349.8899430333913
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 153.28036043906553 -77.82967208526959 350.0397869212439
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 153.6556054395021 -77.18029027378067 349.8388389996215
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 153.46134940407686 -77.5164252686211 349.8899430333913
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 153.84989031755023 -76.84417414515728 349.8899574753824
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 153.6556054395021 -77.18029027378067 349.8388389996215
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 154.03096384485326 -76.53098264145854 350.0398148210282
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 153.84989031755023 -76.84417414515728 349.8899574753824
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 154.18648615976355 -76.26205924608799 350.27819850610405
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 154.03096384485326 -76.53098264145854 350.0398148210282
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 154.3058586735329 -76.05573064402324 350.5888630764198
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 154.18648615976355 -76.26205924608799 350.27819850610405
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 154.38094634662016 -75.9260577885209 350.9506372549058
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 154.3058586735329 -76.05573064402324 350.5888630764198
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 154.40663207819276 -75.88187767038883 351.33886672915844
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 154.38094634662016 -75.9260577885209 350.9506372549058
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 154.4054714415677 -75.88163696930143 371.3388667429288
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 154.40663207819276 -75.88187767038883 351.33886672915844
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 155.38728011480566 -74.15285482224584 377.5889063510776
+ vertex 153.12580471743715 -78.09963927300623 372.399479218377
+ vertex 151.1374170338562 -81.51414980126874 377.58874825227406
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 153.00666606816725 -78.30610297743854 372.0888146214888
+ vertex 151.1374170338562 -81.51414980126874 377.58874825227406
+ vertex 153.12580471743715 -78.09963927300623 372.399479218377
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 152.93176773175702 -78.43588522743131 371.72704041352574
+ vertex 151.1374170338562 -81.51414980126874 377.58874825227406
+ vertex 153.00666606816725 -78.30610297743854 372.0888146214888
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 152.90621390605745 -78.48014157712299 371.3388109089005
+ vertex 151.1374170338562 -81.51414980126874 377.58874825227406
+ vertex 152.93176773175702 -78.43588522743131 371.72704041352574
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 153.28106457750485 -77.83056427439412 372.6378629253101
+ vertex 153.12580471743715 -78.09963927300623 372.399479218377
+ vertex 155.38728011480566 -74.15285482224584 377.5889063510776
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 153.46186494548584 -77.51721499809021 372.78772028660813
+ vertex 153.28106457750485 -77.83056427439412 372.6378629253101
+ vertex 155.38728011480566 -74.15285482224584 377.5889063510776
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 153.65588457508898 -77.1809456794404 372.8388387707498
+ vertex 153.46186494548584 -77.51721499809021 372.78772028660813
+ vertex 155.38728011480566 -74.15285482224584 377.5889063510776
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 153.84990134918937 -76.84467251679933 372.78773473751806
+ vertex 153.65588457508898 -77.1809456794404 372.8388387707498
+ vertex 155.38728011480566 -74.15285482224584 377.5889063510776
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 154.03069334525998 -76.53131197048334 372.6378908423243
+ vertex 153.84990134918937 -76.84467251679933 372.78773473751806
+ vertex 155.38728011480566 -74.15285482224584 377.5889063510776
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 154.18593988754148 -76.26221904387116 372.3995186989971
+ vertex 154.03069334525998 -76.53131197048334 372.6378908423243
+ vertex 155.38728011480566 -74.15285482224584 377.5889063510776
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 154.30506118073438 -76.05573197521412 372.08886297517574
+ vertex 154.18593988754148 -76.26221904387116 372.3995186989971
+ vertex 155.38728011480566 -74.15285482224584 377.5889063510776
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 154.37993930556487 -75.92592251700532 371.7270943450557
+ vertex 154.30506118073438 -76.05573197521412 372.08886297517574
+ vertex 155.38728011480566 -74.15285482224584 377.5889063510776
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 154.4054714415677 -75.88163696930143 371.3388667429288
+ vertex 154.37993930556487 -75.92592251700532 371.7270943450557
+ vertex 155.38728011480566 -74.15285482224584 377.5889063510776
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 154.4054714415677 -75.88163696930143 371.3388667429288
+ vertex 155.38728011480566 -74.15285482224584 377.5889063510776
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 152.90621390605745 -78.48014157712299 371.3388109089005
+ vertex 152.93174604206027 -78.4358560294191 370.9505833067736
+ vertex 152.90542526661733 -78.47925655801097 351.3388109295899
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 152.93111099818998 -78.4350764398789 351.7270404038425
+ vertex 152.90542526661733 -78.47925655801097 351.3388109295899
+ vertex 152.93174604206027 -78.4358560294191 370.9505833067736
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 153.00662416689076 -78.3060465712103 370.5888146766536
+ vertex 152.93111099818998 -78.4350764398789 351.7270404038425
+ vertex 152.93174604206027 -78.4358560294191 370.9505833067736
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 153.00619867127725 -78.30540358437658 352.08881458232855
+ vertex 152.93111099818998 -78.4350764398789 351.7270404038425
+ vertex 153.00662416689076 -78.3060465712103 370.5888146766536
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 153.12574546008366 -78.09955950255328 370.27815895283226
+ vertex 153.00619867127725 -78.30540358437658 352.08881458232855
+ vertex 153.00662416689076 -78.3060465712103 370.5888146766536
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 153.1255711850466 -78.09907498231183 352.3994791526443
+ vertex 153.00619867127725 -78.30540358437658 352.08881458232855
+ vertex 153.12574546008366 -78.09955950255328 370.27815895283226
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 153.28109349995685 -77.83015158694128 352.6378628377202
+ vertex 153.1255711850466 -78.09907498231183 352.3994791526443
+ vertex 153.12574546008366 -78.09955950255328 370.27815895283226
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 153.2809920023652 -77.83046657594109 370.039786809505
+ vertex 153.28109349995685 -77.83015158694128 352.6378628377202
+ vertex 153.12574546008366 -78.09955950255328 370.27815895283226
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 153.4621670272599 -77.51696008324254 352.787720183366
+ vertex 153.28109349995685 -77.83015158694128 352.6378628377202
+ vertex 153.2809920023652 -77.83046657594109 370.039786809505
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 153.46178399843578 -77.51710602962508 369.88994291431123
+ vertex 153.4621670272599 -77.51696008324254 352.787720183366
+ vertex 153.2809920023652 -77.83046657594109 370.039786809505
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 153.656451905308 -77.18084395461914 352.83883865912685
+ vertex 153.4621670272599 -77.51696008324254 352.787720183366
+ vertex 153.46178399843578 -77.51710602962508 369.88994291431123
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 153.65580077253614 -77.18083286698402 369.8388388810795
+ vertex 153.656451905308 -77.18084395461914 352.83883865912685
+ vertex 153.46178399843578 -77.51710602962508 369.88994291431123
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 153.85070794073326 -76.8447089597787 352.7877346253571
+ vertex 153.656451905308 -77.18084395461914 352.83883865912685
+ vertex 153.65580077253614 -77.18083286698402 369.8388388810795
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 153.84982040213927 -76.84456354833422 369.88995736522116
+ vertex 153.85070794073326 -76.8447089597787 352.7877346253571
+ vertex 153.65580077253614 -77.18083286698402 369.8388388810795
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 154.03169690574458 -76.53146214313021 352.6378907375045
+ vertex 153.85070794073326 -76.8447089597787 352.7877346253571
+ vertex 153.84982040213927 -76.84456354833422 369.88995736522116
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 154.03062077012032 -76.5312142720303 370.0398147265192
+ vertex 154.03169690574458 -76.53146214313021 352.6378907375045
+ vertex 153.84982040213927 -76.84456354833422 369.88995736522116
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 154.18708470147493 -76.26245075756343 352.3995186088976
+ vertex 154.03169690574458 -76.53146214313021 352.6378907375045
+ vertex 154.03062077012032 -76.5312142720303 370.0398147265192
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 154.185880630188 -76.26213927341817 370.2781984334523
+ vertex 154.18708470147493 -76.26245075756343 352.3995186088976
+ vertex 154.03062077012032 -76.5312142720303 370.0398147265192
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 154.30628190643583 -76.05600748444246 352.08886290617244
+ vertex 154.18708470147493 -76.26245075756343 352.3995186088976
+ vertex 154.185880630188 -76.26213927341817 370.2781984334523
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 154.3050192794579 -76.05567556898588 370.5888630303405
+ vertex 154.30628190643583 -76.05600748444246 352.08886290617244
+ vertex 154.185880630188 -76.26213927341817 370.2781984334523
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 154.38116542809175 -75.92620109166678 351.72709430208687
+ vertex 154.30628190643583 -76.05600748444246 352.08886290617244
+ vertex 154.3050192794579 -76.05567556898588 370.5888630303405
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 154.37991761586812 -75.92589331899306 370.95063723830356
+ vertex 154.38116542809175 -75.92620109166678 351.72709430208687
+ vertex 154.3050192794579 -76.05567556898588 370.5888630303405
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 154.40663207819276 -75.88187767038883 351.33886672915844
+ vertex 154.38116542809175 -75.92620109166678 351.72709430208687
+ vertex 154.37991761586812 -75.92589331899306 370.95063723830356
+ endloop
+endfacet
+facet normal -0.865792965821221 0.5004022651890614 0.00033664246695197866
+ outer loop
+ vertex 154.4054714415677 -75.88163696930143 371.3388667429288
+ vertex 154.40663207819276 -75.88187767038883 351.33886672915844
+ vertex 154.37991761586812 -75.92589331899306 370.95063723830356
+ endloop
+endfacet
+facet normal 0.4999838918764072 0.866034703414457 1.859985924480165e-05
+ outer loop
+ vertex 164.04792939816105 -79.15217023347982 345.0889063601589
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 164.04762715044825 -79.15269374187481 377.5889063545372
+ endloop
+endfacet
+facet normal 0.4999838918764072 0.866034703414457 1.859985924480165e-05
+ outer loop
+ vertex 155.38728011480566 -74.15285482224584 377.5889063510776
+ vertex 164.04762715044825 -79.15269374187481 377.5889063545372
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 153.31563935474946 -93.7415775674941 345.08857154516386
+ vertex 151.69962881423348 -94.54064573115123 345.08854364502906
+ vertex 152.4495823314251 -93.24163233814313 345.08857154398754
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 164.04792939816105 -79.15217023347982 345.0889063601589
+ vertex 160.297556378679 -85.64828588518847 345.0887668428436
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 158.56509962055546 -84.64805150952648 345.0887668428436
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 160.297556378679 -85.64828588518847 345.0887668428436
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 157.6990162249362 -84.14801802792502 345.0887668428436
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 158.56509962055546 -84.64805150952648 345.0887668428436
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 156.94909837953995 -85.44710356528444 345.08873894305475
+ vertex 157.6990162249362 -84.14801802792502 345.0887668428436
+ vertex 158.56509962055546 -84.64805150952648 345.0887668428436
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 156.39996348268926 -83.3980109878247 345.08876684282086
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 157.6990162249362 -84.14801802792502 345.0887668428436
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 156.34280093828684 -83.3650574674564 345.0887668420269
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 156.39996348268926 -83.3980109878247 345.08876684282086
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 156.21562829958805 -83.3310271183089 345.0887662074895
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 156.34280093828684 -83.3650574674564 345.0887668420269
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 156.08398126100536 -83.3310710260966 345.08876498247406
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 156.21562829958805 -83.3310271183089 345.0887662074895
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 155.9568313506602 -83.3651861985761 345.08876325046333
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 156.08398126100536 -83.3310710260966 345.08876498247406
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 155.842843624818 -83.4310477431216 345.088761129491
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 155.9568313506602 -83.3651861985761 345.08876325046333
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 155.74978615862108 -83.52416730431317 345.0887587640978
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 155.842843624818 -83.4310477431216 345.088761129491
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 150.18523650702332 -93.16266403481931 345.0885517577483
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 155.74978615862108 -83.52416730431317 345.0887587640978
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 151.57073663335103 -81.76361823885512 345.08874825806873
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 150.18523650702332 -93.16266403481931 345.0885517577483
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 151.13771928156893 -81.5136262928737 345.08874825789576
+ vertex 155.3875823625184 -74.1523313138508 345.0889063566993
+ vertex 151.57073663335103 -81.76361823885512 345.08874825806873
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 154.29779091895986 -96.04063088847262 345.08854364606697
+ vertex 150.54836431749806 -102.53510722567016 345.08840416395924
+ vertex 152.56572151010516 -95.04066310355026 345.08854364537507
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 141.8880172818554 -97.53526830604113 345.0884041604997
+ vertex 152.56572151010516 -95.04066310355026 345.08854364537507
+ vertex 150.54836431749806 -102.53510722567016 345.08840416395924
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 151.69962881423348 -94.54064573115123 345.08854364502906
+ vertex 152.56572151010516 -95.04066310355026 345.08854364537507
+ vertex 141.8880172818554 -97.53526830604113 345.0884041604997
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 153.31563935474946 -93.7415775674941 345.08857154516386
+ vertex 152.56572151010516 -95.04066310355026 345.08854364537507
+ vertex 151.69962881423348 -94.54064573115123 345.08854364502906
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 150.34171035776342 -93.75607681169942 345.0885436542804
+ vertex 151.69962881423348 -94.54064573115123 345.08854364502906
+ vertex 141.8880172818554 -97.53526830604113 345.0884041604997
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 150.24903759671903 -93.6626628481546 345.08854429713773
+ vertex 150.34171035776342 -93.75607681169942 345.0885436542804
+ vertex 141.8880172818554 -97.53526830604113 345.0884041604997
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 150.18369989627547 -93.54844641271553 345.08854552929444
+ vertex 150.24903759671903 -93.6626628481546 345.08854429713773
+ vertex 141.8880172818554 -97.53526830604113 345.0884041604997
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 150.1501499127417 -93.4212111667062 345.088547266781
+ vertex 150.18369989627547 -93.54844641271553 345.08854552929444
+ vertex 141.8880172818554 -97.53526830604113 345.0884041604997
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 150.15067402205224 -93.28962798187602 345.0885493911906
+ vertex 150.1501499127417 -93.4212111667062 345.088547266781
+ vertex 141.8880172818554 -97.53526830604113 345.0884041604997
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 150.18523650702332 -93.16266403481931 345.0885517577483
+ vertex 150.15067402205224 -93.28962798187602 345.0885493911906
+ vertex 141.8880172818554 -97.53526830604113 345.0884041604997
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 146.57089771458698 -90.42396527299968 345.08856225947625
+ vertex 150.18523650702332 -93.16266403481931 345.0885517577483
+ vertex 141.8880172818554 -97.53526830604113 345.0884041604997
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 151.57073663335103 -81.76361823885512 345.08874825806873
+ vertex 150.18523650702332 -93.16266403481931 345.0885517577483
+ vertex 146.57089771458698 -90.42396527299968 345.08856225947625
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 146.13788036280488 -90.17397332701823 345.0885622593033
+ vertex 146.57089771458698 -90.42396527299968 345.08856225947625
+ vertex 141.8880172818554 -97.53526830604113 345.0884041604997
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 155.71695418496913 -83.58103639355058 345.08875754271827
+ vertex 150.21713137432857 -93.1074181311095 345.0885529442666
+ vertex 155.74978615862108 -83.52416730431317 345.0887587640978
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 150.18523650702332 -93.16266403481931 345.0885517577483
+ vertex 155.74978615862108 -83.52416730431317 345.0887587640978
+ vertex 150.21713137432857 -93.1074181311095 345.0885529442666
+ endloop
+endfacet
+facet normal 9.299929625675227e-06 1.6107950614637687e-05 -0.9999999998270228
+ outer loop
+ vertex 158.56509962055546 -84.64805150952648 345.0887668428436
+ vertex 157.81515540286424 -85.94704879463569 345.08873894423107
+ vertex 156.94909837953995 -85.44710356528444 345.08873894305475
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.4595540321369283e-10
+ outer loop
+ vertex 146.57089771458698 -90.42396527299968 345.08856225947625
+ vertex 146.57059546687424 -90.42448878139473 377.58856225385455
+ vertex 151.57073663335103 -81.76361823885512 345.08874825806873
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.4595540321369283e-10
+ outer loop
+ vertex 151.5704343856383 -81.76414174725016 377.588748252447
+ vertex 151.57073663335103 -81.76361823885512 345.08874825806873
+ vertex 146.57059546687424 -90.42448878139473 377.58856225385455
+ endloop
+endfacet
+facet normal 0.4999838918764072 0.866034703414457 1.859985924480165e-05
+ outer loop
+ vertex 146.57089771458698 -90.42396527299968 345.08856225947625
+ vertex 146.13788036280488 -90.17397332701823 345.0885622593033
+ vertex 146.57059546687424 -90.42448878139473 377.58856225385455
+ endloop
+endfacet
+facet normal 0.4999838918764072 0.866034703414457 1.859985924480165e-05
+ outer loop
+ vertex 146.13757811509214 -90.17449683541328 377.5885622536816
+ vertex 146.57059546687424 -90.42448878139473 377.58856225385455
+ vertex 146.13788036280488 -90.17397332701823 345.0885622593033
+ endloop
+endfacet
+facet normal -0.4999838918764072 -0.866034703414457 -1.859985924480165e-05
+ outer loop
+ vertex 151.13771928156893 -81.5136262928737 345.08874825789576
+ vertex 151.57073663335103 -81.76361823885512 345.08874825806873
+ vertex 151.1374170338562 -81.51414980126874 377.58874825227406
+ endloop
+endfacet
+facet normal -0.4999838918764072 -0.866034703414457 -1.859985924480165e-05
+ outer loop
+ vertex 151.5704343856383 -81.76414174725016 377.588748252447
+ vertex 151.1374170338562 -81.51414980126874 377.58874825227406
+ vertex 151.57073663335103 -81.76361823885512 345.08874825806873
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 142.90486314003053 -95.79944040404149 351.3384390085886
+ vertex 142.9068736887276 -95.80103020487748 371.33843888852067
+ vertex 142.93041433650887 -95.7551825322223 351.7266685268374
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 142.9323915778253 -95.7567364442471 370.950211327374
+ vertex 142.93041433650887 -95.7551825322223 351.7266685268374
+ vertex 142.9068736887276 -95.80103020487748 371.33843888852067
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 143.00533387512593 -95.62541251045653 352.0884427463218
+ vertex 142.93041433650887 -95.7551825322223 351.7266685268374
+ vertex 142.9323915778253 -95.7567364442471 370.950211327374
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 143.00723341839526 -95.62690607390317 370.5884427370222
+ vertex 143.00533387512593 -95.62541251045653 352.0884427463218
+ vertex 142.9323915778253 -95.7567364442471 370.950211327374
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 143.1245161131354 -95.41897395127233 352.3991073518439
+ vertex 143.00533387512593 -95.62541251045653 352.0884427463218
+ vertex 143.00723341839526 -95.62690607390317 370.5884427370222
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 143.1262988626844 -95.42038681902979 370.2777870490468
+ vertex 143.1245161131354 -95.41897395127233 352.3991073518439
+ vertex 143.00723341839526 -95.62690607390317 370.5884427370222
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 143.2798389779749 -95.14993530132229 352.637491063935
+ vertex 143.1245161131354 -95.41897395127233 352.3991073518439
+ vertex 143.1262988626844 -95.42038681902979 370.2777870490468
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 143.28147379742944 -95.1512526255574 370.0394149352006
+ vertex 143.2798389779749 -95.14993530132229 352.637491063935
+ vertex 143.1262988626844 -95.42038681902979 370.2777870490468
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 143.4607174730887 -94.83663109999313 352.7873484265637
+ vertex 143.2798389779749 -95.14993530132229 352.637491063935
+ vertex 143.28147379742944 -95.1512526255574 370.0394149352006
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 143.4621833072663 -94.83784454400585 369.8895710611137
+ vertex 143.4607174730887 -94.83663109999313 352.7873484265637
+ vertex 143.28147379742944 -95.1512526255574 370.0394149352006
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 143.65482502795072 -94.5004125108457 352.838466908118
+ vertex 143.4607174730887 -94.83663109999313 352.7873484265637
+ vertex 143.4621833072663 -94.83784454400585 369.8895710611137
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 143.65611233773603 -94.50152081720148 369.8384670391763
+ vertex 143.65482502795072 -94.5004125108457 352.838466908118
+ vertex 143.4621833072663 -94.83784454400585 369.8895710611137
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 143.848933533475 -94.16419227510298 352.7873628685572
+ vertex 143.65482502795072 -94.5004125108457 352.838466908118
+ vertex 143.65611233773603 -94.50152081720148 369.8384670391763
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 143.85004494589515 -94.16520135132487 369.88958552403017
+ vertex 143.848933533475 -94.16419227510298 352.7873628685572
+ vertex 143.65611233773603 -94.50152081720148 369.8384670391763
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 144.03076494498626 -93.85180576218127 370.0394428754097
+ vertex 143.848933533475 -94.16419227510298 352.7873628685572
+ vertex 143.85004494589515 -94.16520135132487 369.88958552403017
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 144.0298148157895 -93.85088324620058 352.63751896372383
+ vertex 143.848933533475 -94.16419227510298 352.7873628685572
+ vertex 144.03076494498626 -93.85180576218127 370.0394428754097
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 144.18595656572532 -93.58269144126007 370.27782656246944
+ vertex 144.0298148157895 -93.85088324620058 352.63751896372383
+ vertex 144.03076494498626 -93.85180576218127 370.0394428754097
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 144.18514211442496 -93.58183691669058 352.39914680810364
+ vertex 144.0298148157895 -93.85088324620058 352.63751896372383
+ vertex 144.18595656572532 -93.58269144126007 370.27782656246944
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 144.30504375562518 -93.37619808479967 370.5884911308839
+ vertex 144.18514211442496 -93.58183691669058 352.39914680810364
+ vertex 144.18595656572532 -93.58269144126007 370.27782656246944
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 144.3043301306699 -93.37538834930898 352.08849107017363
+ vertex 144.18514211442496 -93.58183691669058 352.39914680810364
+ vertex 144.30504375562518 -93.37619808479967 370.5884911308839
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 144.3799109194952 -93.24639787379643 370.9502653037131
+ vertex 144.3043301306699 -93.37538834930898 352.08849107017363
+ vertex 144.30504375562518 -93.37619808479967 370.5884911308839
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 144.37925639818468 -93.24560667275045 351.72672242509066
+ vertex 144.3043301306699 -93.37538834930898 352.08849107017363
+ vertex 144.3799109194952 -93.24639787379643 370.9502653037131
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 144.40545598384125 -93.20213647812523 371.33849476893886
+ vertex 144.37925639818468 -93.24560667275045 351.72672242509066
+ vertex 144.3799109194952 -93.24639787379643 370.9502653037131
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 144.40481481565976 -93.2013362937981 351.3384948081663
+ vertex 144.37925639818468 -93.24560667275045 351.72672242509066
+ vertex 144.40545598384125 -93.20213647812523 371.33849476893886
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 141.88771503414267 -97.53579181443617 377.58840415487805
+ vertex 142.90486314003053 -95.79944040404149 351.3384390085886
+ vertex 141.8880172818554 -97.53526830604113 345.0884041604997
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 142.93042155750558 -95.75517002508911 350.9502113916642
+ vertex 141.8880172818554 -97.53526830604113 345.0884041604997
+ vertex 142.90486314003053 -95.79944040404149 351.3384390085886
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 143.0053478250204 -95.62538834853059 350.5884427465812
+ vertex 141.8880172818554 -97.53526830604113 345.0884041604997
+ vertex 142.93042155750558 -95.75517002508911 350.9502113916642
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 143.12453584126533 -95.418939781149 350.27778700865116
+ vertex 141.8880172818554 -97.53526830604113 345.0884041604997
+ vertex 143.0053478250204 -95.62538834853059 350.5884427465812
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 146.13788036280488 -90.17397332701823 345.0885622593033
+ vertex 141.8880172818554 -97.53526830604113 345.0884041604997
+ vertex 143.12453584126533 -95.418939781149 350.27778700865116
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 143.27986313990078 -95.14989345163899 350.039414853031
+ vertex 146.13788036280488 -90.17397332701823 345.0885622593033
+ vertex 143.12453584126533 -95.418939781149 350.27778700865116
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 143.4607444222153 -94.8365844227366 349.88957094819773
+ vertex 146.13788036280488 -90.17397332701823 345.0885622593033
+ vertex 143.27986313990078 -95.14989345163899 350.039414853031
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 143.65485292773957 -94.50036418699386 349.83846690863686
+ vertex 146.13788036280488 -90.17397332701823 345.0885622593033
+ vertex 143.4607444222153 -94.8365844227366 349.88957094819773
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 143.8489604826016 -94.16414559784646 349.88958539019114
+ vertex 146.13788036280488 -90.17397332701823 345.0885622593033
+ vertex 143.65485292773957 -94.50036418699386 349.83846690863686
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 144.0298389777154 -93.85084139651728 350.03944275281987
+ vertex 146.13788036280488 -90.17397332701823 345.0885622593033
+ vertex 143.8489604826016 -94.16414559784646 349.88958539019114
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 144.18516184255486 -93.58180274656723 350.27782646491096
+ vertex 146.13788036280488 -90.17397332701823 345.0885622593033
+ vertex 144.0298389777154 -93.85084139651728 350.03944275281987
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 144.30434408056433 -93.37536418738306 350.58849107043307
+ vertex 146.13788036280488 -90.17397332701823 345.0885622593033
+ vertex 144.18516184255486 -93.58180274656723 350.27782646491096
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 144.37926361918142 -93.24559416561726 350.9502652899174
+ vertex 146.13788036280488 -90.17397332701823 345.0885622593033
+ vertex 144.30434408056433 -93.37536418738306 350.58849107043307
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 144.40481481565976 -93.2013362937981 351.3384948081663
+ vertex 146.13788036280488 -90.17397332701823 345.0885622593033
+ vertex 144.37926361918142 -93.24559416561726 350.9502652899174
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 146.13757811509214 -90.17449683541328 377.5885622536816
+ vertex 143.12637310684354 -95.42047524174265 372.3991070949901
+ vertex 141.88771503414267 -97.53579181443617 377.58840415487805
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 143.00728591694366 -95.62696859820304 372.0884425265756
+ vertex 141.88771503414267 -97.53579181443617 377.58840415487805
+ vertex 143.12637310684354 -95.42047524174265 372.3991070949901
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 142.93241875307368 -95.75676880920629 371.7266683537464
+ vertex 141.88771503414267 -97.53579181443617 377.58840415487805
+ vertex 143.00728591694366 -95.62696859820304 372.0884425265756
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 142.9068736887276 -95.80103020487748 371.33843888852067
+ vertex 141.88771503414267 -97.53579181443617 377.58840415487805
+ vertex 142.93241875307368 -95.75676880920629 371.7266683537464
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 142.90486314003053 -95.79944040404149 351.3384390085886
+ vertex 141.88771503414267 -97.53579181443617 377.58840415487805
+ vertex 142.9068736887276 -95.80103020487748 371.33843888852067
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 143.28156472758258 -95.15136092082145 372.6374907820498
+ vertex 143.12637310684354 -95.42047524174265 372.3991070949901
+ vertex 146.13757811509214 -90.17449683541328 377.5885622536816
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 143.46228472667372 -94.83796533167786 372.78734813342936
+ vertex 143.28156472758258 -95.15136092082145 372.6374907820498
+ vertex 146.13757811509214 -90.17449683541328 377.5885622536816
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 143.6562173348328 -94.50164586580122 372.8384666182832
+ vertex 143.46228472667372 -94.83796533167786 372.78734813342936
+ vertex 146.13757811509214 -90.17449683541328 377.5885622536816
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 143.85014636530255 -94.16532213899687 372.7873625963459
+ vertex 143.6562173348328 -94.50164586580122 372.8384666182832
+ vertex 146.13757811509214 -90.17449683541328 377.5885622536816
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 144.0308558751394 -93.85191405744531 372.6375187222589
+ vertex 143.85014636530255 -94.16532213899687 372.7873625963459
+ vertex 146.13757811509214 -90.17449683541328 377.5885622536816
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 144.18603080988447 -93.58277986397292 372.3991466084127
+ vertex 144.0308558751394 -93.85191405744531 372.6375187222589
+ vertex 146.13757811509214 -90.17449683541328 377.5885622536816
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 144.30509625417358 -93.37626060909955 372.0884909204373
+ vertex 144.18603080988447 -93.58277986397292 372.3991466084127
+ vertex 146.13757811509214 -90.17449683541328 377.5885622536816
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 144.37993809474352 -93.24643023875561 371.7267223300855
+ vertex 144.30509625417358 -93.37626060909955 372.0884909204373
+ vertex 146.13757811509214 -90.17449683541328 377.5885622536816
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 144.40545598384125 -93.20213647812523 371.33849476893886
+ vertex 144.37993809474352 -93.24643023875561 371.7267223300855
+ vertex 146.13757811509214 -90.17449683541328 377.5885622536816
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 144.40481481565976 -93.2013362937981 351.3384948081663
+ vertex 144.40545598384125 -93.20213647812523 371.33849476893886
+ vertex 146.13757811509214 -90.17449683541328 377.5885622536816
+ endloop
+endfacet
+facet normal -0.8662980286671272 0.499527499655437 5.1141337947807864e-05
+ outer loop
+ vertex 146.13788036280488 -90.17397332701823 345.0885622593033
+ vertex 144.40481481565976 -93.2013362937981 351.3384948081663
+ vertex 146.13757811509214 -90.17449683541328 377.5885622536816
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915709e-10
+ outer loop
+ vertex 146.36900195428754 -97.79937597189308 351.3384390099724
+ vertex 146.39455315076592 -97.7551181000739 351.7266685282213
+ vertex 146.39456037176262 -97.75510559294071 350.950211393048
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915709e-10
+ outer loop
+ vertex 146.46948663927742 -97.6253239163822 350.588442747965
+ vertex 146.39456037176262 -97.75510559294071 350.950211393048
+ vertex 146.39455315076592 -97.7551181000739 351.7266685282213
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915709e-10
+ outer loop
+ vertex 146.469472689383 -97.62534807830812 352.0884427477056
+ vertex 146.46948663927742 -97.6253239163822 350.588442747965
+ vertex 146.39455315076592 -97.7551181000739 351.7266685282213
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915709e-10
+ outer loop
+ vertex 146.58867465552234 -97.4188753490006 350.27778701003496
+ vertex 146.46948663927742 -97.6253239163822 350.588442747965
+ vertex 146.469472689383 -97.62534807830812 352.0884427477056
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915709e-10
+ outer loop
+ vertex 146.58865492739244 -97.41890951912393 352.3991073532277
+ vertex 146.58867465552234 -97.4188753490006 350.27778701003496
+ vertex 146.469472689383 -97.62534807830812 352.0884427477056
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915709e-10
+ outer loop
+ vertex 146.74400195415782 -97.14982901949058 350.0394148544148
+ vertex 146.58867465552234 -97.4188753490006 350.27778701003496
+ vertex 146.58865492739244 -97.41890951912393 352.3991073532277
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915709e-10
+ outer loop
+ vertex 146.7439777922319 -97.14987086917388 352.6374910653188
+ vertex 146.74400195415782 -97.14982901949058 350.0394148544148
+ vertex 146.58865492739244 -97.41890951912393 352.3991073532277
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915709e-10
+ outer loop
+ vertex 146.92488323647234 -96.83651999058819 349.8895709495815
+ vertex 146.74400195415782 -97.14982901949058 350.0394148544148
+ vertex 146.7439777922319 -97.14987086917388 352.6374910653188
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915709e-10
+ outer loop
+ vertex 146.9248562873457 -96.83656666784472 352.78734842794756
+ vertex 146.92488323647234 -96.83651999058819 349.8895709495815
+ vertex 146.7439777922319 -97.14987086917388 352.6374910653188
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915709e-10
+ outer loop
+ vertex 147.1189917419966 -96.50029975484546 349.8384669100207
+ vertex 146.92488323647234 -96.83651999058819 349.8895709495815
+ vertex 146.9248562873457 -96.83656666784472 352.78734842794756
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915709e-10
+ outer loop
+ vertex 147.11896384220773 -96.5003480786973 352.83846690950185
+ vertex 147.1189917419966 -96.50029975484546 349.8384669100207
+ vertex 146.9248562873457 -96.83656666784472 352.78734842794756
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915709e-10
+ outer loop
+ vertex 147.3130992968586 -96.16408116569804 349.88958539157494
+ vertex 147.1189917419966 -96.50029975484546 349.8384669100207
+ vertex 147.11896384220773 -96.5003480786973 352.83846690950185
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915709e-10
+ outer loop
+ vertex 147.313072347732 -96.16412784295457 352.787362869941
+ vertex 147.3130992968586 -96.16408116569804 349.88958539157494
+ vertex 147.11896384220773 -96.5003480786973 352.83846690950185
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915709e-10
+ outer loop
+ vertex 147.49397779197244 -95.85077696436888 350.0394427542037
+ vertex 147.3130992968586 -96.16408116569804 349.88958539157494
+ vertex 147.313072347732 -96.16412784295457 352.787362869941
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915709e-10
+ outer loop
+ vertex 147.49395363004652 -95.85081881405219 352.63751896510763
+ vertex 147.49397779197244 -95.85077696436888 350.0394427542037
+ vertex 147.313072347732 -96.16412784295457 352.787362869941
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915709e-10
+ outer loop
+ vertex 147.64930065681193 -95.58173831441883 350.27782646629475
+ vertex 147.49397779197244 -95.85077696436888 350.0394427542037
+ vertex 147.49395363004652 -95.85081881405219 352.63751896510763
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915709e-10
+ outer loop
+ vertex 147.649280928682 -95.58177248454216 352.3991468094875
+ vertex 147.64930065681193 -95.58173831441883 350.27782646629475
+ vertex 147.49395363004652 -95.85081881405219 352.63751896510763
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915709e-10
+ outer loop
+ vertex 147.76848289482137 -95.37529975523464 350.58849107181686
+ vertex 147.64930065681193 -95.58173831441883 350.27782646629475
+ vertex 147.649280928682 -95.58177248454216 352.3991468094875
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915709e-10
+ outer loop
+ vertex 147.76846894492692 -95.37532391716057 352.0884910715574
+ vertex 147.76848289482137 -95.37529975523464 350.58849107181686
+ vertex 147.649280928682 -95.58177248454216 352.3991468094875
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915709e-10
+ outer loop
+ vertex 147.84340243343846 -95.24552973346886 350.9502652913012
+ vertex 147.76848289482137 -95.37529975523464 350.58849107181686
+ vertex 147.76846894492692 -95.37532391716057 352.0884910715574
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915709e-10
+ outer loop
+ vertex 147.84339521244175 -95.24554224060205 351.72672242647445
+ vertex 147.84340243343846 -95.24552973346886 350.9502652913012
+ vertex 147.76846894492692 -95.37532391716057 352.0884910715574
+ endloop
+endfacet
+facet normal -0.8660347035642583 0.4999838919628986 -3.459555419915709e-10
+ outer loop
+ vertex 147.86895362991677 -95.20127186164967 351.3384948095501
+ vertex 147.84340243343846 -95.24552973346886 350.9502652913012
+ vertex 147.84339521244175 -95.24554224060205 351.72672242647445
+ endloop
+endfacet
+facet normal -0.39666955215042093 -0.6870813306610472 0.6087466726429224
+ outer loop
+ vertex 144.18516184255486 -93.58180274656723 350.27782646491096
+ vertex 147.64930065681193 -95.58173831441883 350.27782646629475
+ vertex 144.30434408056433 -93.37536418738306 350.58849107043307
+ endloop
+endfacet
+facet normal -0.39666955215042093 -0.6870813306610472 0.6087466726429224
+ outer loop
+ vertex 147.76848289482137 -95.37529975523464 350.58849107181686
+ vertex 144.30434408056433 -93.37536418738306 350.58849107043307
+ vertex 147.64930065681193 -95.58173831441883 350.27782646629475
+ endloop
+endfacet
+facet normal -0.3043782866302378 -0.5272213029181235 0.793342017277137
+ outer loop
+ vertex 147.49397779197244 -95.85077696436888 350.0394427542037
+ vertex 147.64930065681193 -95.58173831441883 350.27782646629475
+ vertex 144.0298389777154 -93.85084139651728 350.03944275281987
+ endloop
+endfacet
+facet normal -0.3043782866302378 -0.5272213029181235 0.793342017277137
+ outer loop
+ vertex 144.18516184255486 -93.58180274656723 350.27782646491096
+ vertex 144.0298389777154 -93.85084139651728 350.03944275281987
+ vertex 147.64930065681193 -95.58173831441883 350.27782646629475
+ endloop
+endfacet
+facet normal -0.19134414388516638 -0.3314320146558334 0.9238724144934886
+ outer loop
+ vertex 147.3130992968586 -96.16408116569804 349.88958539157494
+ vertex 147.49397779197244 -95.85077696436888 350.0394427542037
+ vertex 143.8489604826016 -94.16414559784646 349.88958539019114
+ endloop
+endfacet
+facet normal -0.19134414388516638 -0.3314320146558334 0.9238724144934886
+ outer loop
+ vertex 144.0298389777154 -93.85084139651728 350.03944275281987
+ vertex 143.8489604826016 -94.16414559784646 349.88958539019114
+ vertex 147.49397779197244 -95.85077696436888 350.0394427542037
+ endloop
+endfacet
+facet normal -0.06527021394542022 -0.11305618231196382 0.9914424334335118
+ outer loop
+ vertex 147.1189917419966 -96.50029975484546 349.8384669100207
+ vertex 147.3130992968586 -96.16408116569804 349.88958539157494
+ vertex 143.65485292773957 -94.50036418699386 349.83846690863686
+ endloop
+endfacet
+facet normal -0.06527021394542022 -0.11305618231196382 0.9914424334335118
+ outer loop
+ vertex 143.8489604826016 -94.16414559784646 349.88958539019114
+ vertex 143.65485292773957 -94.50036418699386 349.83846690863686
+ vertex 147.3130992968586 -96.16408116569804 349.88958539157494
+ endloop
+endfacet
+facet normal 0.06525177321054512 0.11302424202223438 0.9914472889711178
+ outer loop
+ vertex 146.92488323647234 -96.83651999058819 349.8895709495815
+ vertex 147.1189917419966 -96.50029975484546 349.8384669100207
+ vertex 143.4607444222153 -94.8365844227366 349.88957094819773
+ endloop
+endfacet
+facet normal 0.06525177321054512 0.11302424202223438 0.9914472889711178
+ outer loop
+ vertex 143.65485292773957 -94.50036418699386 349.83846690863686
+ vertex 143.4607444222153 -94.8365844227366 349.88957094819773
+ vertex 147.1189917419966 -96.50029975484546 349.8384669100207
+ endloop
+endfacet
+facet normal 0.19132695985589823 0.3314022510440651 0.923886650209443
+ outer loop
+ vertex 146.74400195415782 -97.14982901949058 350.0394148544148
+ vertex 146.92488323647234 -96.83651999058819 349.8895709495815
+ vertex 143.27986313990078 -95.14989345163899 350.039414853031
+ endloop
+endfacet
+facet normal 0.19132695985589823 0.3314022510440651 0.923886650209443
+ outer loop
+ vertex 143.4607444222153 -94.8365844227366 349.88957094819773
+ vertex 143.27986313990078 -95.14989345163899 350.039414853031
+ vertex 146.92488323647234 -96.83651999058819 349.8895709495815
+ endloop
+endfacet
+facet normal 0.3043635303697915 0.5271957443253034 0.7933646630308956
+ outer loop
+ vertex 146.58867465552234 -97.4188753490006 350.27778701003496
+ vertex 146.74400195415782 -97.14982901949058 350.0394148544148
+ vertex 143.12453584126533 -95.418939781149 350.27778700865116
+ endloop
+endfacet
+facet normal 0.3043635303697915 0.5271957443253034 0.7933646630308956
+ outer loop
+ vertex 143.27986313990078 -95.14989345163899 350.039414853031
+ vertex 143.12453584126533 -95.418939781149 350.27778700865116
+ vertex 146.74400195415782 -97.14982901949058 350.0394148544148
+ endloop
+endfacet
+facet normal 0.3966582292735144 0.6870617188629587 0.6087761851638719
+ outer loop
+ vertex 146.58867465552234 -97.4188753490006 350.27778701003496
+ vertex 143.12453584126533 -95.418939781149 350.27778700865116
+ vertex 146.46948663927742 -97.6253239163822 350.588442747965
+ endloop
+endfacet
+facet normal 0.3966582292735144 0.6870617188629587 0.6087761851638719
+ outer loop
+ vertex 143.0053478250204 -95.62538834853059 350.5884427465812
+ vertex 146.46948663927742 -97.6253239163822 350.588442747965
+ vertex 143.12453584126533 -95.418939781149 350.27778700865116
+ endloop
+endfacet
+facet normal 0.46192132536096836 0.8001055726832853 0.38270061632811425
+ outer loop
+ vertex 146.46948663927742 -97.6253239163822 350.588442747965
+ vertex 143.0053478250204 -95.62538834853059 350.5884427465812
+ vertex 146.39456037176262 -97.75510559294071 350.950211393048
+ endloop
+endfacet
+facet normal 0.46192132536096836 0.8001055726832853 0.38270061632811425
+ outer loop
+ vertex 142.93042155750558 -95.75517002508911 350.9502113916642
+ vertex 146.39456037176262 -97.75510559294071 350.950211393048
+ vertex 143.0053478250204 -95.62538834853059 350.5884427465812
+ endloop
+endfacet
+facet normal 0.49570524648613756 0.8586235539621913 0.1305446329323946
+ outer loop
+ vertex 146.39456037176262 -97.75510559294071 350.950211393048
+ vertex 142.93042155750558 -95.75517002508911 350.9502113916642
+ vertex 146.36900195428754 -97.79937597189308 351.3384390099724
+ endloop
+endfacet
+facet normal 0.49570524648613756 0.8586235539621913 0.1305446329323946
+ outer loop
+ vertex 142.90486314003053 -95.79944040404149 351.3384390085886
+ vertex 146.36900195428754 -97.79937597189308 351.3384390099724
+ vertex 142.93042155750558 -95.75517002508911 350.9502113916642
+ endloop
+endfacet
+facet normal 0.4957076742549412 0.8586277589811079 -0.13050775146265353
+ outer loop
+ vertex 146.36900195428754 -97.79937597189308 351.3384390099724
+ vertex 142.90486314003053 -95.79944040404149 351.3384390085886
+ vertex 146.39455315076592 -97.7551181000739 351.7266685282213
+ endloop
+endfacet
+facet normal 0.4957076742549412 0.8586277589811079 -0.13050775146265353
+ outer loop
+ vertex 142.93041433650887 -95.7551825322223 351.7266685268374
+ vertex 146.39455315076592 -97.7551181000739 351.7266685282213
+ vertex 142.90486314003053 -95.79944040404149 351.3384390085886
+ endloop
+endfacet
+facet normal 0.4619284432189475 0.8001179011749451 -0.3826662482695866
+ outer loop
+ vertex 146.39455315076592 -97.7551181000739 351.7266685282213
+ vertex 142.93041433650887 -95.7551825322223 351.7266685268374
+ vertex 146.469472689383 -97.62534807830812 352.0884427477056
+ endloop
+endfacet
+facet normal 0.4619284432189475 0.8001179011749451 -0.3826662482695866
+ outer loop
+ vertex 143.00533387512593 -95.62541251045653 352.0884427463218
+ vertex 146.469472689383 -97.62534807830812 352.0884427477056
+ vertex 142.93041433650887 -95.7551825322223 351.7266685268374
+ endloop
+endfacet
+facet normal 0.39666955215042093 0.6870813306610472 -0.6087466726429224
+ outer loop
+ vertex 146.469472689383 -97.62534807830812 352.0884427477056
+ vertex 143.00533387512593 -95.62541251045653 352.0884427463218
+ vertex 146.58865492739244 -97.41890951912393 352.3991073532277
+ endloop
+endfacet
+facet normal 0.39666955215042093 0.6870813306610472 -0.6087466726429224
+ outer loop
+ vertex 143.1245161131354 -95.41897395127233 352.3991073518439
+ vertex 146.58865492739244 -97.41890951912393 352.3991073532277
+ vertex 143.00533387512593 -95.62541251045653 352.0884427463218
+ endloop
+endfacet
+facet normal 0.3043782866302378 0.5272213029181235 -0.793342017277137
+ outer loop
+ vertex 146.7439777922319 -97.14987086917388 352.6374910653188
+ vertex 146.58865492739244 -97.41890951912393 352.3991073532277
+ vertex 143.2798389779749 -95.14993530132229 352.637491063935
+ endloop
+endfacet
+facet normal 0.3043782866302378 0.5272213029181235 -0.793342017277137
+ outer loop
+ vertex 143.1245161131354 -95.41897395127233 352.3991073518439
+ vertex 143.2798389779749 -95.14993530132229 352.637491063935
+ vertex 146.58865492739244 -97.41890951912393 352.3991073532277
+ endloop
+endfacet
+facet normal 0.19134414388516638 0.3314320146558334 -0.9238724144934886
+ outer loop
+ vertex 146.9248562873457 -96.83656666784472 352.78734842794756
+ vertex 146.7439777922319 -97.14987086917388 352.6374910653188
+ vertex 143.4607174730887 -94.83663109999313 352.7873484265637
+ endloop
+endfacet
+facet normal 0.19134414388516638 0.3314320146558334 -0.9238724144934886
+ outer loop
+ vertex 143.2798389779749 -95.14993530132229 352.637491063935
+ vertex 143.4607174730887 -94.83663109999313 352.7873484265637
+ vertex 146.7439777922319 -97.14987086917388 352.6374910653188
+ endloop
+endfacet
+facet normal 0.06527021394542022 0.11305618231196382 -0.9914424334335118
+ outer loop
+ vertex 147.11896384220773 -96.5003480786973 352.83846690950185
+ vertex 146.9248562873457 -96.83656666784472 352.78734842794756
+ vertex 143.65482502795072 -94.5004125108457 352.838466908118
+ endloop
+endfacet
+facet normal 0.06527021394542022 0.11305618231196382 -0.9914424334335118
+ outer loop
+ vertex 143.4607174730887 -94.83663109999313 352.7873484265637
+ vertex 143.65482502795072 -94.5004125108457 352.838466908118
+ vertex 146.9248562873457 -96.83656666784472 352.78734842794756
+ endloop
+endfacet
+facet normal -0.06525177321054512 -0.11302424202223438 -0.9914472889711178
+ outer loop
+ vertex 147.313072347732 -96.16412784295457 352.787362869941
+ vertex 147.11896384220773 -96.5003480786973 352.83846690950185
+ vertex 143.848933533475 -94.16419227510298 352.7873628685572
+ endloop
+endfacet
+facet normal -0.06525177321054512 -0.11302424202223438 -0.9914472889711178
+ outer loop
+ vertex 143.65482502795072 -94.5004125108457 352.838466908118
+ vertex 143.848933533475 -94.16419227510298 352.7873628685572
+ vertex 147.11896384220773 -96.5003480786973 352.83846690950185
+ endloop
+endfacet
+facet normal -0.19132695985589823 -0.3314022510440651 -0.923886650209443
+ outer loop
+ vertex 147.49395363004652 -95.85081881405219 352.63751896510763
+ vertex 147.313072347732 -96.16412784295457 352.787362869941
+ vertex 144.0298148157895 -93.85088324620058 352.63751896372383
+ endloop
+endfacet
+facet normal -0.19132695985589823 -0.3314022510440651 -0.923886650209443
+ outer loop
+ vertex 143.848933533475 -94.16419227510298 352.7873628685572
+ vertex 144.0298148157895 -93.85088324620058 352.63751896372383
+ vertex 147.313072347732 -96.16412784295457 352.787362869941
+ endloop
+endfacet
+facet normal -0.3043635303697915 -0.5271957443253034 -0.7933646630308956
+ outer loop
+ vertex 147.649280928682 -95.58177248454216 352.3991468094875
+ vertex 147.49395363004652 -95.85081881405219 352.63751896510763
+ vertex 144.18514211442496 -93.58183691669058 352.39914680810364
+ endloop
+endfacet
+facet normal -0.3043635303697915 -0.5271957443253034 -0.7933646630308956
+ outer loop
+ vertex 144.0298148157895 -93.85088324620058 352.63751896372383
+ vertex 144.18514211442496 -93.58183691669058 352.39914680810364
+ vertex 147.49395363004652 -95.85081881405219 352.63751896510763
+ endloop
+endfacet
+facet normal -0.3966582292735144 -0.6870617188629587 -0.6087761851638719
+ outer loop
+ vertex 144.3043301306699 -93.37538834930898 352.08849107017363
+ vertex 147.76846894492692 -95.37532391716057 352.0884910715574
+ vertex 144.18514211442496 -93.58183691669058 352.39914680810364
+ endloop
+endfacet
+facet normal -0.3966582292735144 -0.6870617188629587 -0.6087761851638719
+ outer loop
+ vertex 147.649280928682 -95.58177248454216 352.3991468094875
+ vertex 144.18514211442496 -93.58183691669058 352.39914680810364
+ vertex 147.76846894492692 -95.37532391716057 352.0884910715574
+ endloop
+endfacet
+facet normal -0.46192132536096836 -0.8001055726832853 -0.38270061632811425
+ outer loop
+ vertex 144.37925639818468 -93.24560667275045 351.72672242509066
+ vertex 147.84339521244175 -95.24554224060205 351.72672242647445
+ vertex 144.3043301306699 -93.37538834930898 352.08849107017363
+ endloop
+endfacet
+facet normal -0.46192132536096836 -0.8001055726832853 -0.38270061632811425
+ outer loop
+ vertex 147.76846894492692 -95.37532391716057 352.0884910715574
+ vertex 144.3043301306699 -93.37538834930898 352.08849107017363
+ vertex 147.84339521244175 -95.24554224060205 351.72672242647445
+ endloop
+endfacet
+facet normal -0.49570524648613756 -0.8586235539621913 -0.1305446329323946
+ outer loop
+ vertex 144.40481481565976 -93.2013362937981 351.3384948081663
+ vertex 147.86895362991677 -95.20127186164967 351.3384948095501
+ vertex 144.37925639818468 -93.24560667275045 351.72672242509066
+ endloop
+endfacet
+facet normal -0.49570524648613756 -0.8586235539621913 -0.1305446329323946
+ outer loop
+ vertex 147.84339521244175 -95.24554224060205 351.72672242647445
+ vertex 144.37925639818468 -93.24560667275045 351.72672242509066
+ vertex 147.86895362991677 -95.20127186164967 351.3384948095501
+ endloop
+endfacet
+facet normal -0.4957076742549412 -0.8586277589811079 0.13050775146265353
+ outer loop
+ vertex 144.37926361918142 -93.24559416561726 350.9502652899174
+ vertex 147.84340243343846 -95.24552973346886 350.9502652913012
+ vertex 144.40481481565976 -93.2013362937981 351.3384948081663
+ endloop
+endfacet
+facet normal -0.4957076742549412 -0.8586277589811079 0.13050775146265353
+ outer loop
+ vertex 147.86895362991677 -95.20127186164967 351.3384948095501
+ vertex 144.40481481565976 -93.2013362937981 351.3384948081663
+ vertex 147.84340243343846 -95.24552973346886 350.9502652913012
+ endloop
+endfacet
+facet normal -0.4619284432189475 -0.8001179011749451 0.3826662482695866
+ outer loop
+ vertex 144.30434408056433 -93.37536418738306 350.58849107043307
+ vertex 147.76848289482137 -95.37529975523464 350.58849107181686
+ vertex 144.37926361918142 -93.24559416561726 350.9502652899174
+ endloop
+endfacet
+facet normal -0.4619284432189475 -0.8001179011749451 0.3826662482695866
+ outer loop
+ vertex 147.84340243343846 -95.24552973346886 350.9502652913012
+ vertex 144.37926361918142 -93.24559416561726 350.9502652899174
+ vertex 147.76848289482137 -95.37529975523464 350.58849107181686
+ endloop
+endfacet
+facet normal -0.8662980286671544 0.4995274996553899 5.1141337943045235e-05
+ outer loop
+ vertex 146.37206580339617 -97.79914020349905 371.3382343231689
+ vertex 146.39761086774226 -97.75487880782785 371.7264637883946
+ vertex 146.3975836924939 -97.75484644286865 370.9500067620222
+ endloop
+endfacet
+facet normal -0.8662980286671544 0.4995274996553899 5.1141337943045235e-05
+ outer loop
+ vertex 146.47242553306384 -97.62501607252473 370.5882381716704
+ vertex 146.3975836924939 -97.75484644286865 370.9500067620222
+ vertex 146.39761086774226 -97.75487880782785 371.7264637883946
+ endloop
+endfacet
+facet normal -0.8662980286671544 0.4995274996553899 5.1141337943045235e-05
+ outer loop
+ vertex 146.47247803161224 -97.6250785968246 372.0882379612238
+ vertex 146.47242553306384 -97.62501607252473 370.5882381716704
+ vertex 146.39761086774226 -97.75487880782785 371.7264637883946
+ endloop
+endfacet
+facet normal -0.8662980286671544 0.4995274996553899 5.1141337943045235e-05
+ outer loop
+ vertex 146.59149097735295 -97.41849681765136 370.277582483695
+ vertex 146.47242553306384 -97.62501607252473 370.5882381716704
+ vertex 146.47247803161224 -97.6250785968246 372.0882379612238
+ endloop
+endfacet
+facet normal -0.8662980286671544 0.4995274996553899 5.1141337943045235e-05
+ outer loop
+ vertex 146.5915652215121 -97.41858524036421 372.3989025296383
+ vertex 146.59149097735295 -97.41849681765136 370.277582483695
+ vertex 146.47247803161224 -97.6250785968246 372.0882379612238
+ endloop
+endfacet
+facet normal -0.8662980286671544 0.4995274996553899 5.1141337943045235e-05
+ outer loop
+ vertex 146.746665912098 -97.14936262417896 370.03921036984883
+ vertex 146.59149097735295 -97.41849681765136 370.277582483695
+ vertex 146.5915652215121 -97.41858524036421 372.3989025296383
+ endloop
+endfacet
+facet normal -0.8662980286671544 0.4995274996553899 5.1141337943045235e-05
+ outer loop
+ vertex 146.74675684225116 -97.149470919443 372.637286216698
+ vertex 146.746665912098 -97.14936262417896 370.03921036984883
+ vertex 146.5915652215121 -97.41858524036421 372.3989025296383
+ endloop
+endfacet
+facet normal -0.8662980286671544 0.4995274996553899 5.1141337943045235e-05
+ outer loop
+ vertex 146.92737542193487 -96.83595454262742 369.8893664957619
+ vertex 146.746665912098 -97.14936262417896 370.03921036984883
+ vertex 146.74675684225116 -97.149470919443 372.637286216698
+ endloop
+endfacet
+facet normal -0.8662980286671544 0.4995274996553899 5.1141337943045235e-05
+ outer loop
+ vertex 146.9274768413423 -96.83607533029942 372.78714356807757
+ vertex 146.92737542193487 -96.83595454262742 369.8893664957619
+ vertex 146.74675684225116 -97.149470919443 372.637286216698
+ endloop
+endfacet
+facet normal -0.8662980286671544 0.4995274996553899 5.1141337943045235e-05
+ outer loop
+ vertex 147.12130445240462 -96.49963081582305 369.83826247382456
+ vertex 146.92737542193487 -96.83595454262742 369.8893664957619
+ vertex 146.9274768413423 -96.83607533029942 372.78714356807757
+ endloop
+endfacet
+facet normal -0.8662980286671544 0.4995274996553899 5.1141337943045235e-05
+ outer loop
+ vertex 147.1214094495014 -96.49975586442278 372.83826205293144
+ vertex 147.12130445240462 -96.49963081582305 369.83826247382456
+ vertex 146.9274768413423 -96.83607533029942 372.78714356807757
+ endloop
+endfacet
+facet normal -0.8662980286671544 0.4995274996553899 5.1141337943045235e-05
+ outer loop
+ vertex 147.3152370605637 -96.16331134994643 369.8893809586784
+ vertex 147.12130445240462 -96.49963081582305 369.83826247382456
+ vertex 147.1214094495014 -96.49975586442278 372.83826205293144
+ endloop
+endfacet
+facet normal -0.8662980286671544 0.4995274996553899 5.1141337943045235e-05
+ outer loop
+ vertex 147.31533847997113 -96.16343213761843 372.7871580309941
+ vertex 147.3152370605637 -96.16331134994643 369.8893809586784
+ vertex 147.1214094495014 -96.49975586442278 372.83826205293144
+ endloop
+endfacet
+facet normal -0.8662980286671544 0.4995274996553899 5.1141337943045235e-05
+ outer loop
+ vertex 147.49595705965484 -95.84991576080283 370.03923831005795
+ vertex 147.3152370605637 -96.16331134994643 369.8893809586784
+ vertex 147.31533847997113 -96.16343213761843 372.7871580309941
+ endloop
+endfacet
+facet normal -0.8662980286671544 0.4995274996553899 5.1141337943045235e-05
+ outer loop
+ vertex 147.496047989808 -95.85002405606687 372.6373141569071
+ vertex 147.49595705965484 -95.84991576080283 370.03923831005795
+ vertex 147.31533847997113 -96.16343213761843 372.7871580309941
+ endloop
+endfacet
+facet normal -0.8662980286671544 0.4995274996553899 5.1141337943045235e-05
+ outer loop
+ vertex 147.6511486803939 -95.58080143988163 370.2776219971177
+ vertex 147.49595705965484 -95.84991576080283 370.03923831005795
+ vertex 147.496047989808 -95.85002405606687 372.6373141569071
+ endloop
+endfacet
+facet normal -0.8662980286671544 0.4995274996553899 5.1141337943045235e-05
+ outer loop
+ vertex 147.65122292455305 -95.58088986259449 372.39894204306097
+ vertex 147.6511486803939 -95.58080143988163 370.2776219971177
+ vertex 147.496047989808 -95.85002405606687 372.6373141569071
+ endloop
+endfacet
+facet normal -0.8662980286671544 0.4995274996553899 5.1141337943045235e-05
+ outer loop
+ vertex 147.77023587029376 -95.37430808342124 370.58828656553214
+ vertex 147.6511486803939 -95.58080143988163 370.2776219971177
+ vertex 147.65122292455305 -95.58088986259449 372.39894204306097
+ endloop
+endfacet
+facet normal -0.8662980286671544 0.4995274996553899 5.1141337943045235e-05
+ outer loop
+ vertex 147.77028836884216 -95.3743706077211 372.0882863550856
+ vertex 147.77023587029376 -95.37430808342124 370.58828656553214
+ vertex 147.65122292455305 -95.58088986259449 372.39894204306097
+ endloop
+endfacet
+facet normal -0.8662980286671544 0.4995274996553899 5.1141337943045235e-05
+ outer loop
+ vertex 147.84510303416374 -95.244507872418 370.95006073836134
+ vertex 147.77023587029376 -95.37430808342124 370.58828656553214
+ vertex 147.77028836884216 -95.3743706077211 372.0882863550856
+ endloop
+endfacet
+facet normal -0.8662980286671544 0.4995274996553899 5.1141337943045235e-05
+ outer loop
+ vertex 147.8451302094121 -95.24454023737718 371.7265177647338
+ vertex 147.84510303416374 -95.244507872418 370.95006073836134
+ vertex 147.77028836884216 -95.3743706077211 372.0882863550856
+ endloop
+endfacet
+facet normal -0.8662980286671544 0.4995274996553899 5.1141337943045235e-05
+ outer loop
+ vertex 147.87064809850983 -95.20024647674678 371.33829020358706
+ vertex 147.84510303416374 -95.244507872418 370.95006073836134
+ vertex 147.8451302094121 -95.24454023737718 371.7265177647338
+ endloop
+endfacet
+facet normal -0.06523612223638255 -0.11303325680617896 -0.9914472911916944
+ outer loop
+ vertex 147.1214094495014 -96.49975586442278 372.83826205293144
+ vertex 143.6562173348328 -94.50164586580122 372.8384666182832
+ vertex 147.31533847997113 -96.16343213761843 372.7871580309941
+ endloop
+endfacet
+facet normal -0.06523612223638255 -0.11303325680617896 -0.9914472911916944
+ outer loop
+ vertex 143.85014636530255 -94.16532213899687 372.7873625963459
+ vertex 147.31533847997113 -96.16343213761843 372.7871580309941
+ vertex 143.6562173348328 -94.50164586580122 372.8384666182832
+ endloop
+endfacet
+facet normal -0.19119323355555573 -0.33147939330275683 -0.9238866593139048
+ outer loop
+ vertex 147.31533847997113 -96.16343213761843 372.7871580309941
+ vertex 143.85014636530255 -94.16532213899687 372.7873625963459
+ vertex 147.496047989808 -95.85002405606687 372.6373141569071
+ endloop
+endfacet
+facet normal -0.19119323355555573 -0.33147939330275683 -0.9238866593139048
+ outer loop
+ vertex 144.0308558751394 -93.85191405744531 372.6375187222589
+ vertex 147.496047989808 -95.85002405606687 372.6373141569071
+ vertex 143.85014636530255 -94.16532213899687 372.7873625963459
+ endloop
+endfacet
+facet normal -0.304120841969668 -0.527335756941337 -0.7933646783987597
+ outer loop
+ vertex 147.496047989808 -95.85002405606687 372.6373141569071
+ vertex 144.0308558751394 -93.85191405744531 372.6375187222589
+ vertex 147.65122292455305 -95.58088986259449 372.39894204306097
+ endloop
+endfacet
+facet normal -0.304120841969668 -0.527335756941337 -0.7933646783987597
+ outer loop
+ vertex 144.18603080988447 -93.58277986397292 372.3991466084127
+ vertex 147.65122292455305 -95.58088986259449 372.39894204306097
+ vertex 144.0308558751394 -93.85191405744531 372.6375187222589
+ endloop
+endfacet
+facet normal -0.3963231175869931 -0.6872550602078926 -0.6087762057478697
+ outer loop
+ vertex 147.77028836884216 -95.3743706077211 372.0882863550856
+ vertex 147.65122292455305 -95.58088986259449 372.39894204306097
+ vertex 144.30509625417358 -93.37626060909955 372.0884909204373
+ endloop
+endfacet
+facet normal -0.3963231175869931 -0.6872550602078926 -0.6087762057478697
+ outer loop
+ vertex 144.18603080988447 -93.58277986397292 372.3991466084127
+ vertex 144.30509625417358 -93.37626060909955 372.0884909204373
+ vertex 147.65122292455305 -95.58088986259449 372.39894204306097
+ endloop
+endfacet
+facet normal -0.4615166276956668 -0.8003390668639377 -0.38270064072559534
+ outer loop
+ vertex 147.8451302094121 -95.24454023737718 371.7265177647338
+ vertex 147.77028836884216 -95.3743706077211 372.0882863550856
+ vertex 144.37993809474352 -93.24643023875561 371.7267223300855
+ endloop
+endfacet
+facet normal -0.4615166276956668 -0.8003390668639377 -0.38270064072559534
+ outer loop
+ vertex 144.30509625417358 -93.37626060909955 372.0884909204373
+ vertex 144.37993809474352 -93.24643023875561 371.7267223300855
+ vertex 147.77028836884216 -95.3743706077211 372.0882863550856
+ endloop
+endfacet
+facet normal -0.49525854231920413 -0.8588812887361096 -0.13054465948041147
+ outer loop
+ vertex 147.87064809850983 -95.20024647674678 371.33829020358706
+ vertex 147.8451302094121 -95.24454023737718 371.7265177647338
+ vertex 144.40545598384125 -93.20213647812523 371.33849476893886
+ endloop
+endfacet
+facet normal -0.49525854231920413 -0.8588812887361096 -0.13054465948041147
+ outer loop
+ vertex 144.37993809474352 -93.24643023875561 371.7267223300855
+ vertex 144.40545598384125 -93.20213647812523 371.33849476893886
+ vertex 147.8451302094121 -95.24454023737718 371.7265177647338
+ endloop
+endfacet
+facet normal -0.4952494057371125 -0.8588921701493305 0.13050772457295526
+ outer loop
+ vertex 147.84510303416374 -95.244507872418 370.95006073836134
+ vertex 147.87064809850983 -95.20024647674678 371.33829020358706
+ vertex 144.3799109194952 -93.24639787379643 370.9502653037131
+ endloop
+endfacet
+facet normal -0.4952494057371125 -0.8588921701493305 0.13050772457295526
+ outer loop
+ vertex 144.40545598384125 -93.20213647812523 371.33849476893886
+ vertex 144.3799109194952 -93.24639787379643 370.9502653037131
+ vertex 147.87064809850983 -95.20024647674678 371.33829020358706
+ endloop
+endfacet
+facet normal -0.4614898405923627 -0.8003709695532722 0.38266622287104285
+ outer loop
+ vertex 147.77023587029376 -95.37430808342124 370.58828656553214
+ vertex 147.84510303416374 -95.244507872418 370.95006073836134
+ vertex 144.30504375562518 -93.37619808479967 370.5884911308839
+ endloop
+endfacet
+facet normal -0.4614898405923627 -0.8003709695532722 0.38266622287104285
+ outer loop
+ vertex 144.3799109194952 -93.24639787379643 370.9502653037131
+ vertex 144.30504375562518 -93.37619808479967 370.5884911308839
+ vertex 147.84510303416374 -95.244507872418 370.95006073836134
+ endloop
+endfacet
+facet normal -0.39628050545929794 -0.6873058100577827 0.608746650466135
+ outer loop
+ vertex 147.6511486803939 -95.58080143988163 370.2776219971177
+ vertex 147.77023587029376 -95.37430808342124 370.58828656553214
+ vertex 144.18595656572532 -93.58269144126007 370.27782656246944
+ endloop
+endfacet
+facet normal -0.39628050545929794 -0.6873058100577827 0.608746650466135
+ outer loop
+ vertex 144.30504375562518 -93.37619808479967 370.5884911308839
+ vertex 144.18595656572532 -93.58269144126007 370.27782656246944
+ vertex 147.77023587029376 -95.37430808342124 370.58828656553214
+ endloop
+endfacet
+facet normal -0.3040653087636446 -0.5274018954333461 0.7933419998334786
+ outer loop
+ vertex 147.49595705965484 -95.84991576080283 370.03923831005795
+ vertex 147.6511486803939 -95.58080143988163 370.2776219971177
+ vertex 144.03076494498626 -93.85180576218127 370.0394428754097
+ endloop
+endfacet
+facet normal -0.3040653087636446 -0.5274018954333461 0.7933419998334786
+ outer loop
+ vertex 144.18595656572532 -93.58269144126007 370.27782656246944
+ vertex 144.03076494498626 -93.85180576218127 370.0394428754097
+ vertex 147.6511486803939 -95.58080143988163 370.2776219971177
+ endloop
+endfacet
+facet normal -0.19112856376746587 -0.3315564132080306 0.9238724029717585
+ outer loop
+ vertex 147.3152370605637 -96.16331134994643 369.8893809586784
+ vertex 147.49595705965484 -95.84991576080283 370.03923831005795
+ vertex 143.85004494589515 -94.16520135132487 369.88958552403017
+ endloop
+endfacet
+facet normal -0.19112856376746587 -0.3315564132080306 0.9238724029717585
+ outer loop
+ vertex 144.03076494498626 -93.85180576218127 370.0394428754097
+ vertex 143.85004494589515 -94.16520135132487 369.88958552403017
+ vertex 147.49595705965484 -95.84991576080283 370.03923831005795
+ endloop
+endfacet
+facet normal -0.06516672300538406 -0.11311590934540475 0.9914424286188794
+ outer loop
+ vertex 147.12130445240462 -96.49963081582305 369.83826247382456
+ vertex 147.3152370605637 -96.16331134994643 369.8893809586784
+ vertex 143.65611233773603 -94.50152081720148 369.8384670391763
+ endloop
+endfacet
+facet normal -0.06516672300538406 -0.11311590934540475 0.9914424286188794
+ outer loop
+ vertex 143.85004494589515 -94.16520135132487 369.88958552403017
+ vertex 143.65611233773603 -94.50152081720148 369.8384670391763
+ vertex 147.3152370605637 -96.16331134994643 369.8893809586784
+ endloop
+endfacet
+facet normal 0.06523612223638255 0.11303325680617896 0.9914472911916944
+ outer loop
+ vertex 146.92737542193487 -96.83595454262742 369.8893664957619
+ vertex 147.12130445240462 -96.49963081582305 369.83826247382456
+ vertex 143.4621833072663 -94.83784454400585 369.8895710611137
+ endloop
+endfacet
+facet normal 0.06523612223638255 0.11303325680617896 0.9914472911916944
+ outer loop
+ vertex 143.65611233773603 -94.50152081720148 369.8384670391763
+ vertex 143.4621833072663 -94.83784454400585 369.8895710611137
+ vertex 147.12130445240462 -96.49963081582305 369.83826247382456
+ endloop
+endfacet
+facet normal 0.19119323355555573 0.33147939330275683 0.9238866593139048
+ outer loop
+ vertex 146.746665912098 -97.14936262417896 370.03921036984883
+ vertex 146.92737542193487 -96.83595454262742 369.8893664957619
+ vertex 143.28147379742944 -95.1512526255574 370.0394149352006
+ endloop
+endfacet
+facet normal 0.19119323355555573 0.33147939330275683 0.9238866593139048
+ outer loop
+ vertex 143.4621833072663 -94.83784454400585 369.8895710611137
+ vertex 143.28147379742944 -95.1512526255574 370.0394149352006
+ vertex 146.92737542193487 -96.83595454262742 369.8893664957619
+ endloop
+endfacet
+facet normal 0.304120841969668 0.527335756941337 0.7933646783987597
+ outer loop
+ vertex 146.59149097735295 -97.41849681765136 370.277582483695
+ vertex 146.746665912098 -97.14936262417896 370.03921036984883
+ vertex 143.1262988626844 -95.42038681902979 370.2777870490468
+ endloop
+endfacet
+facet normal 0.304120841969668 0.527335756941337 0.7933646783987597
+ outer loop
+ vertex 143.28147379742944 -95.1512526255574 370.0394149352006
+ vertex 143.1262988626844 -95.42038681902979 370.2777870490468
+ vertex 146.746665912098 -97.14936262417896 370.03921036984883
+ endloop
+endfacet
+facet normal 0.3963231175869931 0.6872550602078926 0.6087762057478697
+ outer loop
+ vertex 146.59149097735295 -97.41849681765136 370.277582483695
+ vertex 143.1262988626844 -95.42038681902979 370.2777870490468
+ vertex 146.47242553306384 -97.62501607252473 370.5882381716704
+ endloop
+endfacet
+facet normal 0.3963231175869931 0.6872550602078926 0.6087762057478697
+ outer loop
+ vertex 143.00723341839526 -95.62690607390317 370.5884427370222
+ vertex 146.47242553306384 -97.62501607252473 370.5882381716704
+ vertex 143.1262988626844 -95.42038681902979 370.2777870490468
+ endloop
+endfacet
+facet normal 0.4615166276956668 0.8003390668639377 0.38270064072559534
+ outer loop
+ vertex 146.47242553306384 -97.62501607252473 370.5882381716704
+ vertex 143.00723341839526 -95.62690607390317 370.5884427370222
+ vertex 146.3975836924939 -97.75484644286865 370.9500067620222
+ endloop
+endfacet
+facet normal 0.4615166276956668 0.8003390668639377 0.38270064072559534
+ outer loop
+ vertex 142.9323915778253 -95.7567364442471 370.950211327374
+ vertex 146.3975836924939 -97.75484644286865 370.9500067620222
+ vertex 143.00723341839526 -95.62690607390317 370.5884427370222
+ endloop
+endfacet
+facet normal 0.49525854231920413 0.8588812887361096 0.13054465948041147
+ outer loop
+ vertex 146.3975836924939 -97.75484644286865 370.9500067620222
+ vertex 142.9323915778253 -95.7567364442471 370.950211327374
+ vertex 146.37206580339617 -97.79914020349905 371.3382343231689
+ endloop
+endfacet
+facet normal 0.49525854231920413 0.8588812887361096 0.13054465948041147
+ outer loop
+ vertex 142.9068736887276 -95.80103020487748 371.33843888852067
+ vertex 146.37206580339617 -97.79914020349905 371.3382343231689
+ vertex 142.9323915778253 -95.7567364442471 370.950211327374
+ endloop
+endfacet
+facet normal 0.4952494057371125 0.8588921701493305 -0.13050772457295526
+ outer loop
+ vertex 146.37206580339617 -97.79914020349905 371.3382343231689
+ vertex 142.9068736887276 -95.80103020487748 371.33843888852067
+ vertex 146.39761086774226 -97.75487880782785 371.7264637883946
+ endloop
+endfacet
+facet normal 0.4952494057371125 0.8588921701493305 -0.13050772457295526
+ outer loop
+ vertex 142.93241875307368 -95.75676880920629 371.7266683537464
+ vertex 146.39761086774226 -97.75487880782785 371.7264637883946
+ vertex 142.9068736887276 -95.80103020487748 371.33843888852067
+ endloop
+endfacet
+facet normal 0.4614898405923627 0.8003709695532722 -0.38266622287104285
+ outer loop
+ vertex 146.39761086774226 -97.75487880782785 371.7264637883946
+ vertex 142.93241875307368 -95.75676880920629 371.7266683537464
+ vertex 146.47247803161224 -97.6250785968246 372.0882379612238
+ endloop
+endfacet
+facet normal 0.4614898405923627 0.8003709695532722 -0.38266622287104285
+ outer loop
+ vertex 143.00728591694366 -95.62696859820304 372.0884425265756
+ vertex 146.47247803161224 -97.6250785968246 372.0882379612238
+ vertex 142.93241875307368 -95.75676880920629 371.7266683537464
+ endloop
+endfacet
+facet normal 0.39628050545929794 0.6873058100577827 -0.608746650466135
+ outer loop
+ vertex 146.47247803161224 -97.6250785968246 372.0882379612238
+ vertex 143.00728591694366 -95.62696859820304 372.0884425265756
+ vertex 146.5915652215121 -97.41858524036421 372.3989025296383
+ endloop
+endfacet
+facet normal 0.39628050545929794 0.6873058100577827 -0.608746650466135
+ outer loop
+ vertex 143.12637310684354 -95.42047524174265 372.3991070949901
+ vertex 146.5915652215121 -97.41858524036421 372.3989025296383
+ vertex 143.00728591694366 -95.62696859820304 372.0884425265756
+ endloop
+endfacet
+facet normal 0.30406530876363563 0.5274018954333306 -0.7933419998334927
+ outer loop
+ vertex 146.5915652215121 -97.41858524036421 372.3989025296383
+ vertex 143.12637310684354 -95.42047524174265 372.3991070949901
+ vertex 146.74675684225116 -97.149470919443 372.637286216698
+ endloop
+endfacet
+facet normal 0.30406530876363563 0.5274018954333306 -0.7933419998334927
+ outer loop
+ vertex 143.28156472758258 -95.15136092082145 372.6374907820498
+ vertex 146.74675684225116 -97.149470919443 372.637286216698
+ vertex 143.12637310684354 -95.42047524174265 372.3991070949901
+ endloop
+endfacet
+facet normal 0.19112856376747817 0.3315564132080519 -0.9238724029717484
+ outer loop
+ vertex 146.74675684225116 -97.149470919443 372.637286216698
+ vertex 143.28156472758258 -95.15136092082145 372.6374907820498
+ vertex 146.9274768413423 -96.83607533029942 372.78714356807757
+ endloop
+endfacet
+facet normal 0.19112856376747817 0.3315564132080519 -0.9238724029717484
+ outer loop
+ vertex 143.46228472667372 -94.83796533167786 372.78734813342936
+ vertex 146.9274768413423 -96.83607533029942 372.78714356807757
+ vertex 143.28156472758258 -95.15136092082145 372.6374907820498
+ endloop
+endfacet
+facet normal 0.06516672300538406 0.11311590934540475 -0.9914424286188794
+ outer loop
+ vertex 146.9274768413423 -96.83607533029942 372.78714356807757
+ vertex 143.46228472667372 -94.83796533167786 372.78734813342936
+ vertex 147.1214094495014 -96.49975586442278 372.83826205293144
+ endloop
+endfacet
+facet normal 0.06516672300538406 0.11311590934540475 -0.9914424286188794
+ outer loop
+ vertex 143.6562173348328 -94.50164586580122 372.8384666182832
+ vertex 147.1214094495014 -96.49975586442278 372.83826205293144
+ vertex 143.46228472667372 -94.83796533167786 372.78734813342936
+ endloop
+endfacet
+facet normal -0.8661682332610214 0.499752528599378 4.2988474745472314e-05
+ outer loop
+ vertex 156.37088683910153 -80.47915169152049 371.3386389550015
+ vertex 156.3964406648011 -80.4348953418288 371.72686845962676
+ vertex 156.39641897510435 -80.43486614381659 370.95041135287465
+ endloop
+endfacet
+facet normal -0.8661682332610214 0.499752528599378 4.2988474745472314e-05
+ outer loop
+ vertex 156.47129709993482 -80.3050566856078 370.5886427227546
+ vertex 156.39641897510435 -80.43486614381659 370.95041135287465
+ vertex 156.3964406648011 -80.4348953418288 371.72686845962676
+ endloop
+endfacet
+facet normal -0.8661682332610214 0.499752528599378 4.2988474745472314e-05
+ outer loop
+ vertex 156.47133900121133 -80.30511309183603 372.0886426675898
+ vertex 156.47129709993482 -80.3050566856078 370.5886427227546
+ vertex 156.3964406648011 -80.4348953418288 371.72686845962676
+ endloop
+endfacet
+facet normal -0.8661682332610214 0.499752528599378 4.2988474745472314e-05
+ outer loop
+ vertex 156.59041839312772 -80.09856961695077 370.2779869989332
+ vertex 156.47129709993482 -80.3050566856078 370.5886427227546
+ vertex 156.47133900121133 -80.30511309183603 372.0886426675898
+ endloop
+endfacet
+facet normal -0.8661682332610214 0.499752528599378 4.2988474745472314e-05
+ outer loop
+ vertex 156.59047765048123 -80.09864938740374 372.399307264478
+ vertex 156.59041839312772 -80.09856961695077 370.2779869989332
+ vertex 156.47133900121133 -80.30511309183603 372.0886426675898
+ endloop
+endfacet
+facet normal -0.8661682332610214 0.499752528599378 4.2988474745472314e-05
+ outer loop
+ vertex 156.74566493540925 -79.82947669033857 370.03961485560603
+ vertex 156.59041839312772 -80.09856961695077 370.2779869989332
+ vertex 156.59047765048123 -80.09864938740374 372.399307264478
+ endloop
+endfacet
+facet normal -0.8661682332610214 0.499752528599378 4.2988474745472314e-05
+ outer loop
+ vertex 156.7457375105489 -79.8295743887916 372.6376909714111
+ vertex 156.74566493540925 -79.82947669033857 370.03961485560603
+ vertex 156.59047765048123 -80.09864938740374 372.399307264478
+ endloop
+endfacet
+facet normal -0.8661682332610214 0.499752528599378 4.2988474745472314e-05
+ outer loop
+ vertex 156.92645693147986 -79.51611614402256 369.88977096041225
+ vertex 156.74566493540925 -79.82947669033857 370.03961485560603
+ vertex 156.7457375105489 -79.8295743887916 372.6376909714111
+ endloop
+endfacet
+facet normal -0.8661682332610214 0.499752528599378 4.2988474745472314e-05
+ outer loop
+ vertex 156.92653787852993 -79.51622511248769 372.78754833270915
+ vertex 156.92645693147986 -79.51611614402256 369.88977096041225
+ vertex 156.7457375105489 -79.8295743887916 372.6376909714111
+ endloop
+endfacet
+facet normal -0.8661682332610214 0.499752528599378 4.2988474745472314e-05
+ outer loop
+ vertex 157.12047370558022 -79.17984298138151 369.8386669271805
+ vertex 156.92645693147986 -79.51611614402256 369.88977096041225
+ vertex 156.92653787852993 -79.51622511248769 372.78754833270915
+ endloop
+endfacet
+facet normal -0.8661682332610214 0.499752528599378 4.2988474745472314e-05
+ outer loop
+ vertex 157.12055750813306 -79.17995579383788 372.83866681685083
+ vertex 157.12047370558022 -79.17984298138151 369.8386669271805
+ vertex 156.92653787852993 -79.51622511248769 372.78754833270915
+ endloop
+endfacet
+facet normal -0.8661682332610214 0.499752528599378 4.2988474745472314e-05
+ outer loop
+ vertex 157.31449333518336 -78.84357366273171 369.8897854113221
+ vertex 157.12047370558022 -79.17984298138151 369.8386669271805
+ vertex 157.12055750813306 -79.17995579383788 372.83866681685083
+ endloop
+endfacet
+facet normal -0.8661682332610214 0.499752528599378 4.2988474745472314e-05
+ outer loop
+ vertex 157.31457428223342 -78.84368263119684 372.78756278361914
+ vertex 157.31449333518336 -78.84357366273171 369.8897854113221
+ vertex 157.12055750813306 -79.17995579383788 372.83866681685083
+ endloop
+endfacet
+facet normal -0.8661682332610214 0.499752528599378 4.2988474745472314e-05
+ outer loop
+ vertex 157.49529370316438 -78.53022438642779 370.03964277262025
+ vertex 157.31449333518336 -78.84357366273171 369.8897854113221
+ vertex 157.31457428223342 -78.84368263119684 372.78756278361914
+ endloop
+endfacet
+facet normal -0.8661682332610214 0.499752528599378 4.2988474745472314e-05
+ outer loop
+ vertex 157.49536627830403 -78.53032208488082 372.63771888842524
+ vertex 157.49529370316438 -78.53022438642779 370.03964277262025
+ vertex 157.31457428223342 -78.84368263119684 372.78756278361914
+ endloop
+endfacet
+facet normal -0.8661682332610214 0.499752528599378 4.2988474745472314e-05
+ outer loop
+ vertex 157.65055356323205 -78.26114938781566 370.2780264795533
+ vertex 157.49529370316438 -78.53022438642779 370.03964277262025
+ vertex 157.49536627830403 -78.53032208488082 372.63771888842524
+ endloop
+endfacet
+facet normal -0.8661682332610214 0.499752528599378 4.2988474745472314e-05
+ outer loop
+ vertex 157.65061282058556 -78.26122915826863 372.3993467450981
+ vertex 157.65055356323205 -78.26114938781566 370.2780264795533
+ vertex 157.49536627830403 -78.53032208488082 372.63771888842524
+ endloop
+endfacet
+facet normal -0.8661682332610214 0.499752528599378 4.2988474745472314e-05
+ outer loop
+ vertex 157.76969221250195 -78.05468568338337 370.58869107644153
+ vertex 157.65055356323205 -78.26114938781566 370.2780264795533
+ vertex 157.65061282058556 -78.26122915826863 372.3993467450981
+ endloop
+endfacet
+facet normal -0.8661682332610214 0.499752528599378 4.2988474745472314e-05
+ outer loop
+ vertex 157.76973411377847 -78.05474208961161 372.08869102127676
+ vertex 157.76969221250195 -78.05468568338337 370.58869107644153
+ vertex 157.65061282058556 -78.26122915826863 372.3993467450981
+ endloop
+endfacet
+facet normal -0.8661682332610214 0.499752528599378 4.2988474745472314e-05
+ outer loop
+ vertex 157.8445905489122 -77.92490343339055 370.9504652844046
+ vertex 157.76969221250195 -78.05468568338337 370.58869107644153
+ vertex 157.76973411377847 -78.05474208961161 372.08869102127676
+ endloop
+endfacet
+facet normal -0.8661682332610214 0.499752528599378 4.2988474745472314e-05
+ outer loop
+ vertex 157.84461223860893 -77.9249326314028 371.72692239115673
+ vertex 157.8445905489122 -77.92490343339055 370.9504652844046
+ vertex 157.76973411377847 -78.05474208961161 372.08869102127676
+ endloop
+endfacet
+facet normal -0.8661682332610214 0.499752528599378 4.2988474745472314e-05
+ outer loop
+ vertex 157.87014437461178 -77.88064708369892 371.33869478902983
+ vertex 157.8445905489122 -77.92490343339055 370.9504652844046
+ vertex 157.84461223860893 -77.9249326314028 371.72692239115673
+ endloop
+endfacet
+facet normal 0.49548072364034323 0.8587531358732626 0.13054464419760692
+ outer loop
+ vertex 156.39641897510435 -80.43486614381659 370.95041135287465
+ vertex 152.93174604206027 -78.4358560294191 370.9505833067736
+ vertex 156.37088683910153 -80.47915169152049 371.3386389550015
+ endloop
+endfacet
+facet normal 0.49548072364034323 0.8587531358732626 0.13054464419760692
+ outer loop
+ vertex 152.90621390605745 -78.48014157712299 371.3388109089005
+ vertex 156.37088683910153 -80.47915169152049 371.3386389550015
+ vertex 152.93174604206027 -78.4358560294191 370.9505833067736
+ endloop
+endfacet
+facet normal 0.49547343135466027 0.8587629525271786 -0.13050773995607154
+ outer loop
+ vertex 156.37088683910153 -80.47915169152049 371.3386389550015
+ vertex 152.90621390605745 -78.48014157712299 371.3388109089005
+ vertex 156.3964406648011 -80.4348953418288 371.72686845962676
+ endloop
+endfacet
+facet normal 0.49547343135466027 0.8587629525271786 -0.13050773995607154
+ outer loop
+ vertex 152.93176773175702 -78.43588522743131 371.72704041352574
+ vertex 156.3964406648011 -80.4348953418288 371.72686845962676
+ vertex 152.90621390605745 -78.48014157712299 371.3388109089005
+ endloop
+endfacet
+facet normal 0.46170044353074574 0.800249493139297 -0.38266623730584204
+ outer loop
+ vertex 156.3964406648011 -80.4348953418288 371.72686845962676
+ vertex 152.93176773175702 -78.43588522743131 371.72704041352574
+ vertex 156.47133900121133 -80.30511309183603 372.0886426675898
+ endloop
+endfacet
+facet normal 0.46170044353074574 0.800249493139297 -0.38266623730584204
+ outer loop
+ vertex 153.00666606816725 -78.30610297743854 372.0888146214888
+ vertex 156.47133900121133 -80.30511309183603 372.0886426675898
+ vertex 152.93176773175702 -78.43588522743131 371.72704041352574
+ endloop
+endfacet
+facet normal 0.3964633334762089 0.6872003532686835 -0.6087466629693581
+ outer loop
+ vertex 156.47133900121133 -80.30511309183603 372.0886426675898
+ vertex 153.00666606816725 -78.30610297743854 372.0888146214888
+ vertex 156.59047765048123 -80.09864938740374 372.399307264478
+ endloop
+endfacet
+facet normal 0.3964633334762089 0.6872003532686835 -0.6087466629693581
+ outer loop
+ vertex 153.12580471743715 -78.09963927300623 372.399479218377
+ vertex 156.59047765048123 -80.09864938740374 372.399307264478
+ vertex 153.00666606816725 -78.30610297743854 372.0888146214888
+ endloop
+endfacet
+facet normal 0.30420790243196666 0.5273196449751949 -0.7933420095527387
+ outer loop
+ vertex 156.59047765048123 -80.09864938740374 372.399307264478
+ vertex 153.12580471743715 -78.09963927300623 372.399479218377
+ vertex 156.7457375105489 -79.8295743887916 372.6376909714111
+ endloop
+endfacet
+facet normal 0.30420790243196666 0.5273196449751949 -0.7933420095527387
+ outer loop
+ vertex 153.28106457750485 -77.83056427439412 372.6378629253101
+ vertex 156.7457375105489 -79.8295743887916 372.6376909714111
+ vertex 153.12580471743715 -78.09963927300623 372.399479218377
+ endloop
+endfacet
+facet normal 0.19122120556428934 0.3315029743135194 -0.9238724092448208
+ outer loop
+ vertex 156.7457375105489 -79.8295743887916 372.6376909714111
+ vertex 153.28106457750485 -77.83056427439412 372.6378629253101
+ vertex 156.92653787852993 -79.51622511248769 372.78754833270915
+ endloop
+endfacet
+facet normal 0.19122120556428934 0.3315029743135194 -0.9238724092448208
+ outer loop
+ vertex 153.46186494548584 -77.51721499809021 372.78772028660813
+ vertex 156.92653787852993 -79.51622511248769 372.78754833270915
+ vertex 153.28106457750485 -77.83056427439412 372.6378629253101
+ endloop
+endfacet
+facet normal 0.06520309954540061 0.11309492378696474 -0.9914424310182076
+ outer loop
+ vertex 156.92653787852993 -79.51622511248769 372.78754833270915
+ vertex 153.46186494548584 -77.51721499809021 372.78772028660813
+ vertex 157.12055750813306 -79.17995579383788 372.83866681685083
+ endloop
+endfacet
+facet normal 0.06520309954540061 0.11309492378696474 -0.9914424310182076
+ outer loop
+ vertex 153.65588457508898 -77.1809456794404 372.8388387707498
+ vertex 157.12055750813306 -79.17995579383788 372.83866681685083
+ vertex 153.46186494548584 -77.51721499809021 372.78772028660813
+ endloop
+endfacet
+facet normal -0.06525848995430916 -0.1130203588975056 -0.991447289553793
+ outer loop
+ vertex 157.12055750813306 -79.17995579383788 372.83866681685083
+ vertex 153.65588457508898 -77.1809456794404 372.8388387707498
+ vertex 157.31457428223342 -78.84368263119684 372.78756278361914
+ endloop
+endfacet
+facet normal -0.06525848995430916 -0.1130203588975056 -0.991447289553793
+ outer loop
+ vertex 153.84990134918937 -76.84467251679933 372.78773473751806
+ vertex 157.31457428223342 -78.84368263119684 372.78756278361914
+ vertex 153.65588457508898 -77.1809456794404 372.8388387707498
+ endloop
+endfacet
+facet normal -0.1912728212083556 -0.3314334908980314 -0.923886653750416
+ outer loop
+ vertex 157.31457428223342 -78.84368263119684 372.78756278361914
+ vertex 153.84990134918937 -76.84467251679933 372.78773473751806
+ vertex 157.49536627830403 -78.53032208488082 372.63771888842524
+ endloop
+endfacet
+facet normal -0.1912728212083556 -0.3314334908980314 -0.923886653750416
+ outer loop
+ vertex 154.03069334525998 -76.53131197048334 372.6378908423243
+ vertex 157.49536627830403 -78.53032208488082 372.63771888842524
+ vertex 153.84990134918937 -76.84467251679933 372.78773473751806
+ endloop
+endfacet
+facet normal -0.3042522257903939 -0.5272599782136993 -0.7933646692887706
+ outer loop
+ vertex 157.49536627830403 -78.53032208488082 372.63771888842524
+ vertex 154.03069334525998 -76.53131197048334 372.6378908423243
+ vertex 157.65061282058556 -78.26122915826863 372.3993467450981
+ endloop
+endfacet
+facet normal -0.3042522257903939 -0.5272599782136993 -0.7933646692887706
+ outer loop
+ vertex 154.18593988754148 -76.26221904387116 372.3995186989971
+ vertex 157.65061282058556 -78.26122915826863 372.3993467450981
+ vertex 154.03069334525998 -76.53131197048334 372.6378908423243
+ endloop
+endfacet
+facet normal -0.3964973439853189 -0.6871545693522869 -0.6087761937123207
+ outer loop
+ vertex 157.76973411377847 -78.05474208961161 372.08869102127676
+ vertex 157.65061282058556 -78.26122915826863 372.3993467450981
+ vertex 154.30506118073438 -76.05573197521412 372.08886297517574
+ endloop
+endfacet
+facet normal -0.3964973439853189 -0.6871545693522869 -0.6087761937123207
+ outer loop
+ vertex 154.18593988754148 -76.26221904387116 372.3995186989971
+ vertex 154.30506118073438 -76.05573197521412 372.08886297517574
+ vertex 157.65061282058556 -78.26122915826863 372.3993467450981
+ endloop
+endfacet
+facet normal -0.4617218234305358 -0.8002207121662198 -0.3827006265845002
+ outer loop
+ vertex 157.84461223860893 -77.9249326314028 371.72692239115673
+ vertex 157.76973411377847 -78.05474208961161 372.08869102127676
+ vertex 154.37993930556487 -75.92592251700532 371.7270943450557
+ endloop
+endfacet
+facet normal -0.4617218234305358 -0.8002207121662198 -0.3827006265845002
+ outer loop
+ vertex 154.30506118073438 -76.05573197521412 372.08886297517574
+ vertex 154.37993930556487 -75.92592251700532 371.7270943450557
+ vertex 157.76973411377847 -78.05474208961161 372.08869102127676
+ endloop
+endfacet
+facet normal -0.49548072364034323 -0.8587531358732626 -0.13054464419760692
+ outer loop
+ vertex 157.87014437461178 -77.88064708369892 371.33869478902983
+ vertex 157.84461223860893 -77.9249326314028 371.72692239115673
+ vertex 154.4054714415677 -75.88163696930143 371.3388667429288
+ endloop
+endfacet
+facet normal -0.49548072364034323 -0.8587531358732626 -0.13054464419760692
+ outer loop
+ vertex 154.37993930556487 -75.92592251700532 371.7270943450557
+ vertex 154.4054714415677 -75.88163696930143 371.3388667429288
+ vertex 157.84461223860893 -77.9249326314028 371.72692239115673
+ endloop
+endfacet
+facet normal -0.49547343135466776 -0.8587629525271916 0.1305077399559583
+ outer loop
+ vertex 157.8445905489122 -77.92490343339055 370.9504652844046
+ vertex 157.87014437461178 -77.88064708369892 371.33869478902983
+ vertex 154.37991761586812 -75.92589331899306 370.95063723830356
+ endloop
+endfacet
+facet normal -0.49547343135466776 -0.8587629525271916 0.1305077399559583
+ outer loop
+ vertex 154.4054714415677 -75.88163696930143 371.3388667429288
+ vertex 154.37991761586812 -75.92589331899306 370.95063723830356
+ vertex 157.87014437461178 -77.88064708369892 371.33869478902983
+ endloop
+endfacet
+facet normal -0.46170044353072537 -0.8002494931392617 0.3826662373059404
+ outer loop
+ vertex 157.76969221250195 -78.05468568338337 370.58869107644153
+ vertex 157.8445905489122 -77.92490343339055 370.9504652844046
+ vertex 154.3050192794579 -76.05567556898588 370.5888630303405
+ endloop
+endfacet
+facet normal -0.46170044353072537 -0.8002494931392617 0.3826662373059404
+ outer loop
+ vertex 154.37991761586812 -75.92589331899306 370.95063723830356
+ vertex 154.3050192794579 -76.05567556898588 370.5888630303405
+ vertex 157.8445905489122 -77.92490343339055 370.9504652844046
+ endloop
+endfacet
+facet normal -0.3964633334762089 -0.6872003532686835 0.6087466629693581
+ outer loop
+ vertex 157.65055356323205 -78.26114938781566 370.2780264795533
+ vertex 157.76969221250195 -78.05468568338337 370.58869107644153
+ vertex 154.185880630188 -76.26213927341817 370.2781984334523
+ endloop
+endfacet
+facet normal -0.3964633334762089 -0.6872003532686835 0.6087466629693581
+ outer loop
+ vertex 154.3050192794579 -76.05567556898588 370.5888630303405
+ vertex 154.185880630188 -76.26213927341817 370.2781984334523
+ vertex 157.76969221250195 -78.05468568338337 370.58869107644153
+ endloop
+endfacet
+facet normal -0.30420790243196666 -0.5273196449751949 0.7933420095527387
+ outer loop
+ vertex 157.49529370316438 -78.53022438642779 370.03964277262025
+ vertex 157.65055356323205 -78.26114938781566 370.2780264795533
+ vertex 154.03062077012032 -76.5312142720303 370.0398147265192
+ endloop
+endfacet
+facet normal -0.30420790243196666 -0.5273196449751949 0.7933420095527387
+ outer loop
+ vertex 154.185880630188 -76.26213927341817 370.2781984334523
+ vertex 154.03062077012032 -76.5312142720303 370.0398147265192
+ vertex 157.65055356323205 -78.26114938781566 370.2780264795533
+ endloop
+endfacet
+facet normal -0.19122120556428934 -0.3315029743135194 0.9238724092448208
+ outer loop
+ vertex 157.31449333518336 -78.84357366273171 369.8897854113221
+ vertex 157.49529370316438 -78.53022438642779 370.03964277262025
+ vertex 153.84982040213927 -76.84456354833422 369.88995736522116
+ endloop
+endfacet
+facet normal -0.19122120556428934 -0.3315029743135194 0.9238724092448208
+ outer loop
+ vertex 154.03062077012032 -76.5312142720303 370.0398147265192
+ vertex 153.84982040213927 -76.84456354833422 369.88995736522116
+ vertex 157.49529370316438 -78.53022438642779 370.03964277262025
+ endloop
+endfacet
+facet normal -0.06520309954540061 -0.11309492378696474 0.9914424310182076
+ outer loop
+ vertex 157.12047370558022 -79.17984298138151 369.8386669271805
+ vertex 157.31449333518336 -78.84357366273171 369.8897854113221
+ vertex 153.65580077253614 -77.18083286698402 369.8388388810795
+ endloop
+endfacet
+facet normal -0.06520309954540061 -0.11309492378696474 0.9914424310182076
+ outer loop
+ vertex 153.84982040213927 -76.84456354833422 369.88995736522116
+ vertex 153.65580077253614 -77.18083286698402 369.8388388810795
+ vertex 157.31449333518336 -78.84357366273171 369.8897854113221
+ endloop
+endfacet
+facet normal 0.06525848995430916 0.1130203588975056 0.991447289553793
+ outer loop
+ vertex 156.92645693147986 -79.51611614402256 369.88977096041225
+ vertex 157.12047370558022 -79.17984298138151 369.8386669271805
+ vertex 153.46178399843578 -77.51710602962508 369.88994291431123
+ endloop
+endfacet
+facet normal 0.06525848995430916 0.1130203588975056 0.991447289553793
+ outer loop
+ vertex 153.65580077253614 -77.18083286698402 369.8388388810795
+ vertex 153.46178399843578 -77.51710602962508 369.88994291431123
+ vertex 157.12047370558022 -79.17984298138151 369.8386669271805
+ endloop
+endfacet
+facet normal 0.1912728212083556 0.3314334908980314 0.923886653750416
+ outer loop
+ vertex 156.74566493540925 -79.82947669033857 370.03961485560603
+ vertex 156.92645693147986 -79.51611614402256 369.88977096041225
+ vertex 153.2809920023652 -77.83046657594109 370.039786809505
+ endloop
+endfacet
+facet normal 0.1912728212083556 0.3314334908980314 0.923886653750416
+ outer loop
+ vertex 153.46178399843578 -77.51710602962508 369.88994291431123
+ vertex 153.2809920023652 -77.83046657594109 370.039786809505
+ vertex 156.92645693147986 -79.51611614402256 369.88977096041225
+ endloop
+endfacet
+facet normal 0.3042522257903939 0.5272599782136993 0.7933646692887706
+ outer loop
+ vertex 156.59041839312772 -80.09856961695077 370.2779869989332
+ vertex 156.74566493540925 -79.82947669033857 370.03961485560603
+ vertex 153.12574546008366 -78.09955950255328 370.27815895283226
+ endloop
+endfacet
+facet normal 0.3042522257903939 0.5272599782136993 0.7933646692887706
+ outer loop
+ vertex 153.2809920023652 -77.83046657594109 370.039786809505
+ vertex 153.12574546008366 -78.09955950255328 370.27815895283226
+ vertex 156.74566493540925 -79.82947669033857 370.03961485560603
+ endloop
+endfacet
+facet normal 0.3964973439853189 0.6871545693522869 0.6087761937123207
+ outer loop
+ vertex 156.59041839312772 -80.09856961695077 370.2779869989332
+ vertex 153.12574546008366 -78.09955950255328 370.27815895283226
+ vertex 156.47129709993482 -80.3050566856078 370.5886427227546
+ endloop
+endfacet
+facet normal 0.3964973439853189 0.6871545693522869 0.6087761937123207
+ outer loop
+ vertex 153.00662416689076 -78.3060465712103 370.5888146766536
+ vertex 156.47129709993482 -80.3050566856078 370.5886427227546
+ vertex 153.12574546008366 -78.09955950255328 370.27815895283226
+ endloop
+endfacet
+facet normal 0.4617218234305358 0.8002207121662198 0.3827006265845002
+ outer loop
+ vertex 156.47129709993482 -80.3050566856078 370.5886427227546
+ vertex 153.00662416689076 -78.3060465712103 370.5888146766536
+ vertex 156.39641897510435 -80.43486614381659 370.95041135287465
+ endloop
+endfacet
+facet normal 0.4617218234305358 0.8002207121662198 0.3827006265845002
+ outer loop
+ vertex 152.93174604206027 -78.4358560294191 370.9505833067736
+ vertex 156.39641897510435 -80.43486614381659 370.95041135287465
+ vertex 153.00662416689076 -78.3060465712103 370.5888146766536
+ endloop
+endfacet
+facet normal -0.8657929658212125 0.5004022651890762 0.00033664246698150073
+ outer loop
+ vertex 156.36859712990218 -80.48086561876725 351.33746435972193
+ vertex 156.3942828614748 -80.43668550063518 351.72569383397456
+ vertex 156.39406378000322 -80.4365421974893 350.9492367867935
+ endloop
+endfacet
+facet normal -0.8657929658212125 0.5004022651890762 0.00033664246698150073
+ outer loop
+ vertex 156.46937053456207 -80.30701264513284 352.08746801246065
+ vertex 156.39406378000322 -80.4365421974893 350.9492367867935
+ vertex 156.3942828614748 -80.43668550063518 351.72569383397456
+ endloop
+endfacet
+facet normal -0.8657929658212125 0.5004022651890762 0.00033664246698150073
+ outer loop
+ vertex 156.4689473016591 -80.30673580471363 350.58746818270794
+ vertex 156.39406378000322 -80.4365421974893 350.9492367867935
+ vertex 156.46937053456207 -80.30701264513284 352.08746801246065
+ endloop
+endfacet
+facet normal -0.8657929658212125 0.5004022651890762 0.00033664246698150073
+ outer loop
+ vertex 156.5887430483314 -80.1006840430681 352.3981325827764
+ vertex 156.4689473016591 -80.30673580471363 350.58746818270794
+ vertex 156.46937053456207 -80.30701264513284 352.08746801246065
+ endloop
+endfacet
+facet normal -0.8657929658212125 0.5004022651890762 0.00033664246698150073
+ outer loop
+ vertex 156.58814450662 -80.10029253159266 350.2768124799828
+ vertex 156.4689473016591 -80.30673580471363 350.58746818270794
+ vertex 156.5887430483314 -80.1006840430681 352.3981325827764
+ endloop
+endfacet
+facet normal -0.8657929658212125 0.5004022651890762 0.00033664246698150073
+ outer loop
+ vertex 156.74426536324168 -79.83176064769756 352.63651626785224
+ vertex 156.58814450662 -80.10029253159266 350.2768124799828
+ vertex 156.5887430483314 -80.1006840430681 352.3981325827764
+ endloop
+endfacet
+facet normal -0.8657929658212125 0.5004022651890762 0.00033664246698150073
+ outer loop
+ vertex 156.74353230235036 -79.83128114602587 350.038440351376
+ vertex 156.58814450662 -80.10029253159266 350.2768124799828
+ vertex 156.74426536324168 -79.83176064769756 352.63651626785224
+ endloop
+endfacet
+facet normal -0.8657929658212125 0.5004022651890762 0.00033664246698150073
+ outer loop
+ vertex 156.92533889054474 -79.5185691439988 352.78637361349803
+ vertex 156.74353230235036 -79.83128114602587 350.038440351376
+ vertex 156.74426536324168 -79.83176064769756 352.63651626785224
+ endloop
+endfacet
+facet normal -0.8657929658212125 0.5004022651890762 0.00033664246698150073
+ outer loop
+ vertex 156.92452126736168 -79.51803432937739 349.8885964635234
+ vertex 156.74353230235036 -79.83128114602587 350.038440351376
+ vertex 156.92533889054474 -79.5185691439988 352.78637361349803
+ endloop
+endfacet
+facet normal -0.8657929658212125 0.5004022651890762 0.00033664246698150073
+ outer loop
+ vertex 157.11962376859285 -79.18245301537542 352.83749208925894
+ vertex 156.92452126736168 -79.51803432937739 349.8885964635234
+ vertex 156.92533889054474 -79.5185691439988 352.78637361349803
+ endloop
+endfacet
+facet normal -0.8657929658212125 0.5004022651890762 0.00033664246698150073
+ outer loop
+ vertex 157.11877730278695 -79.18189933453695 349.8374924297536
+ vertex 156.92452126736168 -79.51803432937739 349.8885964635234
+ vertex 157.11962376859285 -79.18245301537542 352.83749208925894
+ endloop
+endfacet
+facet normal -0.8657929658212125 0.5004022651890762 0.00033664246698150073
+ outer loop
+ vertex 157.3138798040181 -78.84631802053498 352.7863880554891
+ vertex 157.11877730278695 -79.18189933453695 349.8374924297536
+ vertex 157.11962376859285 -79.18245301537542 352.83749208925894
+ endloop
+endfacet
+facet normal -0.8657929658212125 0.5004022651890762 0.00033664246698150073
+ outer loop
+ vertex 157.31306218083503 -78.84578320591356 349.88861090551444
+ vertex 157.11877730278695 -79.18189933453695 349.8374924297536
+ vertex 157.3138798040181 -78.84631802053498 352.7863880554891
+ endloop
+endfacet
+facet normal -0.8657929658212125 0.5004022651890762 0.00033664246698150073
+ outer loop
+ vertex 157.4948687690294 -78.53307120388648 352.63654416763654
+ vertex 157.31306218083503 -78.84578320591356 349.88861090551444
+ vertex 157.3138798040181 -78.84631802053498 352.7863880554891
+ endloop
+endfacet
+facet normal -0.8657929658212125 0.5004022651890762 0.00033664246698150073
+ outer loop
+ vertex 157.4941357081381 -78.53259170221482 350.0384682511603
+ vertex 157.31306218083503 -78.84578320591356 349.88861090551444
+ vertex 157.4948687690294 -78.53307120388648 352.63654416763654
+ endloop
+endfacet
+facet normal -0.8657929658212125 0.5004022651890762 0.00033664246698150073
+ outer loop
+ vertex 157.65025656475976 -78.26405981831971 352.3981720390297
+ vertex 157.4941357081381 -78.53259170221482 350.0384682511603
+ vertex 157.4948687690294 -78.53307120388648 352.63654416763654
+ endloop
+endfacet
+facet normal -0.8657929658212125 0.5004022651890762 0.00033664246698150073
+ outer loop
+ vertex 157.64965802304837 -78.26366830684427 350.27685193623614
+ vertex 157.4941357081381 -78.53259170221482 350.0384682511603
+ vertex 157.65025656475976 -78.26405981831971 352.3981720390297
+ endloop
+endfacet
+facet normal -0.8657929658212125 0.5004022651890762 0.00033664246698150073
+ outer loop
+ vertex 157.76945376972066 -78.05761654519874 352.08751633630453
+ vertex 157.64965802304837 -78.26366830684427 350.27685193623614
+ vertex 157.65025656475976 -78.26405981831971 352.3981720390297
+ endloop
+endfacet
+facet normal -0.8657929658212125 0.5004022651890762 0.00033664246698150073
+ outer loop
+ vertex 157.76903053681772 -78.05733970477951 350.5875165065519
+ vertex 157.64965802304837 -78.26366830684427 350.27685193623614
+ vertex 157.76945376972066 -78.05761654519874 352.08751633630453
+ endloop
+endfacet
+facet normal -0.8657929658212125 0.5004022651890762 0.00033664246698150073
+ outer loop
+ vertex 157.84433729137658 -77.92781015242305 351.72574773221896
+ vertex 157.76903053681772 -78.05733970477951 350.5875165065519
+ vertex 157.76945376972066 -78.05761654519874 352.08751633630453
+ endloop
+endfacet
+facet normal -0.8657929658212125 0.5004022651890762 0.00033664246698150073
+ outer loop
+ vertex 157.844118209905 -77.92766684927717 350.9492906850379
+ vertex 157.76903053681772 -78.05733970477951 350.5875165065519
+ vertex 157.84433729137658 -77.92781015242305 351.72574773221896
+ endloop
+endfacet
+facet normal -0.8657929658212125 0.5004022651890762 0.00033664246698150073
+ outer loop
+ vertex 157.8698039414776 -77.88348673114511 351.33752015929053
+ vertex 157.844118209905 -77.92766684927717 350.9492906850379
+ vertex 157.84433729137658 -77.92781015242305 351.72574773221896
+ endloop
+endfacet
+facet normal 0.0650358652437237 0.11319164640563603 -0.9914423772544635
+ outer loop
+ vertex 157.11962376859285 -79.18245301537542 352.83749208925894
+ vertex 156.92533889054474 -79.5185691439988 352.78637361349803
+ vertex 153.656451905308 -77.18084395461914 352.83883865912685
+ endloop
+endfacet
+facet normal 0.0650358652437237 0.11319164640563603 -0.9914423772544635
+ outer loop
+ vertex 153.4621670272599 -77.51696008324254 352.787720183366
+ vertex 153.656451905308 -77.18084395461914 352.83883865912685
+ vertex 156.92533889054474 -79.5185691439988 352.78637361349803
+ endloop
+endfacet
+facet normal -0.06559534805782397 -0.11282568370348313 -0.9914472327915465
+ outer loop
+ vertex 157.3138798040181 -78.84631802053498 352.7863880554891
+ vertex 157.11962376859285 -79.18245301537542 352.83749208925894
+ vertex 153.85070794073326 -76.8447089597787 352.7877346253571
+ endloop
+endfacet
+facet normal -0.06559534805782397 -0.11282568370348313 -0.9914472327915465
+ outer loop
+ vertex 153.656451905308 -77.18084395461914 352.83883865912685
+ vertex 153.85070794073326 -76.8447089597787 352.7877346253571
+ vertex 157.11962376859285 -79.18245301537542 352.83749208925894
+ endloop
+endfacet
+facet normal -0.19175634679065254 -0.33115412992143956 -0.9238865978579176
+ outer loop
+ vertex 157.4948687690294 -78.53307120388648 352.63654416763654
+ vertex 157.3138798040181 -78.84631802053498 352.7863880554891
+ vertex 154.03169690574458 -76.53146214313021 352.6378907375045
+ endloop
+endfacet
+facet normal -0.19175634679065254 -0.33115412992143956 -0.9238865978579176
+ outer loop
+ vertex 153.85070794073326 -76.8447089597787 352.7877346253571
+ vertex 154.03169690574458 -76.53146214313021 352.6378907375045
+ vertex 157.3138798040181 -78.84631802053498 352.7863880554891
+ endloop
+endfacet
+facet normal -0.30484946738208113 -0.5269149694433884 -0.7933646180750279
+ outer loop
+ vertex 157.65025656475976 -78.26405981831971 352.3981720390297
+ vertex 157.4948687690294 -78.53307120388648 352.63654416763654
+ vertex 154.18708470147493 -76.26245075756343 352.3995186088976
+ endloop
+endfacet
+facet normal -0.30484946738208113 -0.5269149694433884 -0.7933646180750279
+ outer loop
+ vertex 154.03169690574458 -76.53146214313021 352.6378907375045
+ vertex 154.18708470147493 -76.26245075756343 352.3995186088976
+ vertex 157.4948687690294 -78.53307120388648 352.63654416763654
+ endloop
+endfacet
+facet normal -0.3971676005589536 -0.6867674245658731 -0.6087761506673871
+ outer loop
+ vertex 157.76945376972066 -78.05761654519874 352.08751633630453
+ vertex 157.65025656475976 -78.26405981831971 352.3981720390297
+ vertex 154.30628190643583 -76.05600748444246 352.08886290617244
+ endloop
+endfacet
+facet normal -0.3971676005589536 -0.6867674245658731 -0.6087761506673871
+ outer loop
+ vertex 154.18708470147493 -76.26245075756343 352.3995186088976
+ vertex 154.30628190643583 -76.05600748444246 352.08886290617244
+ vertex 157.65025656475976 -78.26405981831971 352.3981720390297
+ endloop
+endfacet
+facet normal -0.46241941810824055 -0.7998178146410486 -0.38270059464188616
+ outer loop
+ vertex 157.84433729137658 -77.92781015242305 351.72574773221896
+ vertex 157.76945376972066 -78.05761654519874 352.08751633630453
+ vertex 154.38116542809175 -75.92620109166678 351.72709430208687
+ endloop
+endfacet
+facet normal -0.46241941810824055 -0.7998178146410486 -0.38270059464188616
+ outer loop
+ vertex 154.30628190643583 -76.05600748444246 352.08886290617244
+ vertex 154.38116542809175 -75.92620109166678 351.72709430208687
+ vertex 157.76945376972066 -78.05761654519874 352.08751633630453
+ endloop
+endfacet
+facet normal -0.49615811649766006 -0.858361942409851 -0.13054462553426827
+ outer loop
+ vertex 157.8698039414776 -77.88348673114511 351.33752015929053
+ vertex 157.84433729137658 -77.92781015242305 351.72574773221896
+ vertex 154.40663207819276 -75.88187767038883 351.33886672915844
+ endloop
+endfacet
+facet normal -0.49615811649766006 -0.858361942409851 -0.13054462553426827
+ outer loop
+ vertex 154.38116542809175 -75.92620109166678 351.72709430208687
+ vertex 154.40663207819276 -75.88187767038883 351.33886672915844
+ vertex 157.84433729137658 -77.92781015242305 351.72574773221896
+ endloop
+endfacet
+facet normal -0.4960844591878245 -0.8584101223136098 0.1305077440685319
+ outer loop
+ vertex 157.844118209905 -77.92766684927717 350.9492906850379
+ vertex 157.8698039414776 -77.88348673114511 351.33752015929053
+ vertex 154.38094634662016 -75.9260577885209 350.9506372549058
+ endloop
+endfacet
+facet normal -0.4960844591878245 -0.8584101223136098 0.1305077440685319
+ outer loop
+ vertex 154.40663207819276 -75.88187767038883 351.33886672915844
+ vertex 154.38094634662016 -75.9260577885209 350.9506372549058
+ vertex 157.8698039414776 -77.88348673114511 351.33752015929053
+ endloop
+endfacet
+facet normal -0.46220346580269206 -0.7999590709715347 0.3826662265870075
+ outer loop
+ vertex 157.76903053681772 -78.05733970477951 350.5875165065519
+ vertex 157.844118209905 -77.92766684927717 350.9492906850379
+ vertex 154.3058586735329 -76.05573064402324 350.5888630764198
+ endloop
+endfacet
+facet normal -0.46220346580269206 -0.7999590709715347 0.3826662265870075
+ outer loop
+ vertex 154.38094634662016 -75.9260577885209 350.9506372549058
+ vertex 154.3058586735329 -76.05573064402324 350.5888630764198
+ vertex 157.844118209905 -77.92766684927717 350.9492906850379
+ endloop
+endfacet
+facet normal -0.39682407005039544 -0.6869921309375289 0.6087466381496921
+ outer loop
+ vertex 157.64965802304837 -78.26366830684427 350.27685193623614
+ vertex 157.76903053681772 -78.05733970477951 350.5875165065519
+ vertex 154.18648615976355 -76.26205924608799 350.27819850610405
+ endloop
+endfacet
+facet normal -0.39682407005039544 -0.6869921309375289 0.6087466381496921
+ outer loop
+ vertex 154.3058586735329 -76.05573064402324 350.5888630764198
+ vertex 154.18648615976355 -76.26205924608799 350.27819850610405
+ vertex 157.76903053681772 -78.05733970477951 350.5875165065519
+ endloop
+endfacet
+facet normal -0.30440176970700505 -0.5272078124884072 0.7933419723236834
+ outer loop
+ vertex 157.64965802304837 -78.26366830684427 350.27685193623614
+ vertex 154.18648615976355 -76.26205924608799 350.27819850610405
+ vertex 157.4941357081381 -78.53259170221482 350.0384682511603
+ endloop
+endfacet
+facet normal -0.30440176970700505 -0.5272078124884072 0.7933419723236834
+ outer loop
+ vertex 154.03096384485326 -76.53098264145854 350.0398148210282
+ vertex 157.4941357081381 -78.53259170221482 350.0384682511603
+ vertex 154.18648615976355 -76.26205924608799 350.27819850610405
+ endloop
+endfacet
+facet normal -0.1912349918057851 -0.3314951528702935 0.923872362143463
+ outer loop
+ vertex 157.4941357081381 -78.53259170221482 350.0384682511603
+ vertex 154.03096384485326 -76.53098264145854 350.0398148210282
+ vertex 157.31306218083503 -78.84578320591356 349.88861090551444
+ endloop
+endfacet
+facet normal -0.1912349918057851 -0.3314951528702935 0.923872362143463
+ outer loop
+ vertex 153.84989031755023 -76.84417414515728 349.8899574753824
+ vertex 157.31306218083503 -78.84578320591356 349.88861090551444
+ vertex 154.03096384485326 -76.53098264145854 350.0398148210282
+ endloop
+endfacet
+facet normal -0.06503586524370954 -0.11319164640561152 0.9914423772544672
+ outer loop
+ vertex 157.31306218083503 -78.84578320591356 349.88861090551444
+ vertex 153.84989031755023 -76.84417414515728 349.8899574753824
+ vertex 157.11877730278695 -79.18189933453695 349.8374924297536
+ endloop
+endfacet
+facet normal -0.06503586524370954 -0.11319164640561152 0.9914423772544672
+ outer loop
+ vertex 153.6556054395021 -77.18029027378067 349.8388389996215
+ vertex 157.11877730278695 -79.18189933453695 349.8374924297536
+ vertex 153.84989031755023 -76.84417414515728 349.8899574753824
+ endloop
+endfacet
+facet normal 0.0655953480578098 0.11282568370345863 0.9914472327915501
+ outer loop
+ vertex 157.11877730278695 -79.18189933453695 349.8374924297536
+ vertex 153.6556054395021 -77.18029027378067 349.8388389996215
+ vertex 156.92452126736168 -79.51803432937739 349.8885964635234
+ endloop
+endfacet
+facet normal 0.0655953480578098 0.11282568370345863 0.9914472327915501
+ outer loop
+ vertex 153.46134940407686 -77.5164252686211 349.8899430333913
+ vertex 156.92452126736168 -79.51803432937739 349.8885964635234
+ vertex 153.6556054395021 -77.18029027378067 349.8388389996215
+ endloop
+endfacet
+facet normal 0.19175634679066486 0.33115412992146087 0.9238865978579075
+ outer loop
+ vertex 156.92452126736168 -79.51803432937739 349.8885964635234
+ vertex 153.46134940407686 -77.5164252686211 349.8899430333913
+ vertex 156.74353230235036 -79.83128114602587 350.038440351376
+ endloop
+endfacet
+facet normal 0.19175634679066486 0.33115412992146087 0.9238865978579075
+ outer loop
+ vertex 153.28036043906553 -77.82967208526959 350.0397869212439
+ vertex 156.74353230235036 -79.83128114602587 350.038440351376
+ vertex 153.46134940407686 -77.5164252686211 349.8899430333913
+ endloop
+endfacet
+facet normal 0.30484946738208113 0.5269149694433884 0.7933646180750279
+ outer loop
+ vertex 156.74353230235036 -79.83128114602587 350.038440351376
+ vertex 153.28036043906553 -77.82967208526959 350.0397869212439
+ vertex 156.58814450662 -80.10029253159266 350.2768124799828
+ endloop
+endfacet
+facet normal 0.30484946738208113 0.5269149694433884 0.7933646180750279
+ outer loop
+ vertex 153.12497264333518 -78.09868347083638 350.27815904985073
+ vertex 156.58814450662 -80.10029253159266 350.2768124799828
+ vertex 153.28036043906553 -77.82967208526959 350.0397869212439
+ endloop
+endfacet
+facet normal 0.3971676005589536 0.6867674245658731 0.6087761506673871
+ outer loop
+ vertex 156.58814450662 -80.10029253159266 350.2768124799828
+ vertex 153.12497264333518 -78.09868347083638 350.27815904985073
+ vertex 156.4689473016591 -80.30673580471363 350.58746818270794
+ endloop
+endfacet
+facet normal 0.3971676005589536 0.6867674245658731 0.6087761506673871
+ outer loop
+ vertex 153.0057754383743 -78.30512674395735 350.5888147525759
+ vertex 156.4689473016591 -80.30673580471363 350.58746818270794
+ vertex 153.12497264333518 -78.09868347083638 350.27815904985073
+ endloop
+endfacet
+facet normal 0.46241941810824055 0.7998178146410486 0.38270059464188616
+ outer loop
+ vertex 156.4689473016591 -80.30673580471363 350.58746818270794
+ vertex 153.0057754383743 -78.30512674395735 350.5888147525759
+ vertex 156.39406378000322 -80.4365421974893 350.9492367867935
+ endloop
+endfacet
+facet normal 0.46241941810824055 0.7998178146410486 0.38270059464188616
+ outer loop
+ vertex 152.9308919167184 -78.43493313673302 350.9505833566614
+ vertex 156.39406378000322 -80.4365421974893 350.9492367867935
+ vertex 153.0057754383743 -78.30512674395735 350.5888147525759
+ endloop
+endfacet
+facet normal 0.49615811649766006 0.858361942409851 0.13054462553426827
+ outer loop
+ vertex 156.39406378000322 -80.4365421974893 350.9492367867935
+ vertex 152.9308919167184 -78.43493313673302 350.9505833566614
+ vertex 156.36859712990218 -80.48086561876725 351.33746435972193
+ endloop
+endfacet
+facet normal 0.49615811649766006 0.858361942409851 0.13054462553426827
+ outer loop
+ vertex 152.90542526661733 -78.47925655801097 351.3388109295899
+ vertex 156.36859712990218 -80.48086561876725 351.33746435972193
+ vertex 152.9308919167184 -78.43493313673302 350.9505833566614
+ endloop
+endfacet
+facet normal 0.4960844591878245 0.8584101223136098 -0.1305077440685319
+ outer loop
+ vertex 156.36859712990218 -80.48086561876725 351.33746435972193
+ vertex 152.90542526661733 -78.47925655801097 351.3388109295899
+ vertex 156.3942828614748 -80.43668550063518 351.72569383397456
+ endloop
+endfacet
+facet normal 0.4960844591878245 0.8584101223136098 -0.1305077440685319
+ outer loop
+ vertex 152.93111099818998 -78.4350764398789 351.7270404038425
+ vertex 156.3942828614748 -80.43668550063518 351.72569383397456
+ vertex 152.90542526661733 -78.47925655801097 351.3388109295899
+ endloop
+endfacet
+facet normal 0.46220346580269206 0.7999590709715347 -0.3826662265870075
+ outer loop
+ vertex 156.3942828614748 -80.43668550063518 351.72569383397456
+ vertex 152.93111099818998 -78.4350764398789 351.7270404038425
+ vertex 156.46937053456207 -80.30701264513284 352.08746801246065
+ endloop
+endfacet
+facet normal 0.46220346580269206 0.7999590709715347 -0.3826662265870075
+ outer loop
+ vertex 153.00619867127725 -78.30540358437658 352.08881458232855
+ vertex 156.46937053456207 -80.30701264513284 352.08746801246065
+ vertex 152.93111099818998 -78.4350764398789 351.7270404038425
+ endloop
+endfacet
+facet normal 0.39682407005039544 0.6869921309375289 -0.6087466381496921
+ outer loop
+ vertex 156.46937053456207 -80.30701264513284 352.08746801246065
+ vertex 153.00619867127725 -78.30540358437658 352.08881458232855
+ vertex 156.5887430483314 -80.1006840430681 352.3981325827764
+ endloop
+endfacet
+facet normal 0.39682407005039544 0.6869921309375289 -0.6087466381496921
+ outer loop
+ vertex 153.1255711850466 -78.09907498231183 352.3994791526443
+ vertex 156.5887430483314 -80.1006840430681 352.3981325827764
+ vertex 153.00619867127725 -78.30540358437658 352.08881458232855
+ endloop
+endfacet
+facet normal 0.30440176970700505 0.5272078124884072 -0.7933419723236834
+ outer loop
+ vertex 156.74426536324168 -79.83176064769756 352.63651626785224
+ vertex 156.5887430483314 -80.1006840430681 352.3981325827764
+ vertex 153.28109349995685 -77.83015158694128 352.6378628377202
+ endloop
+endfacet
+facet normal 0.30440176970700505 0.5272078124884072 -0.7933419723236834
+ outer loop
+ vertex 153.1255711850466 -78.09907498231183 352.3994791526443
+ vertex 153.28109349995685 -77.83015158694128 352.6378628377202
+ vertex 156.5887430483314 -80.1006840430681 352.3981325827764
+ endloop
+endfacet
+facet normal 0.1912349918057728 0.33149515287027226 -0.9238723621434733
+ outer loop
+ vertex 156.92533889054474 -79.5185691439988 352.78637361349803
+ vertex 156.74426536324168 -79.83176064769756 352.63651626785224
+ vertex 153.4621670272599 -77.51696008324254 352.787720183366
+ endloop
+endfacet
+facet normal 0.1912349918057728 0.33149515287027226 -0.9238723621434733
+ outer loop
+ vertex 153.28109349995685 -77.83015158694128 352.6378628377202
+ vertex 153.4621670272599 -77.51696008324254 352.787720183366
+ vertex 156.74426536324168 -79.83176064769756 352.63651626785224
+ endloop
+endfacet
+facet normal -0.4999999999135008 -0.866025403634642 -1.859985924801902e-05
+ outer loop
+ vertex 158.56509962055546 -84.64805150952648 345.0887668428436
+ vertex 160.297556378679 -85.64828588518847 345.0887668428436
+ vertex 158.56479737284266 -84.64857501792149 377.5887668372219
+ endloop
+endfacet
+facet normal -0.4999999999135008 -0.866025403634642 -1.859985924801902e-05
+ outer loop
+ vertex 160.2972541309662 -85.64880939358348 377.5887668372219
+ vertex 158.56479737284266 -84.64857501792149 377.5887668372219
+ vertex 160.297556378679 -85.64828588518847 345.0887668428436
+ endloop
+endfacet
+facet normal 0.8660347035643184 -0.4999838919627944 3.459555267187432e-10
+ outer loop
+ vertex 157.8148531551514 -85.94757230303068 377.58873893860937
+ vertex 157.81515540286424 -85.94704879463569 345.08873894423107
+ vertex 158.56479737284266 -84.64857501792149 377.5887668372219
+ endloop
+endfacet
+facet normal 0.8660347035643184 -0.4999838919627944 3.459555267187432e-10
+ outer loop
+ vertex 158.56509962055546 -84.64805150952648 345.0887668428436
+ vertex 158.56479737284266 -84.64857501792149 377.5887668372219
+ vertex 157.81515540286424 -85.94704879463569 345.08873894423107
+ endloop
+endfacet
+facet normal -0.49994522926465357 -0.8660570231743162 -1.859985921082137e-05
+ outer loop
+ vertex 156.94909837953995 -85.44710356528444 345.08873894305475
+ vertex 157.81515540286424 -85.94704879463569 345.08873894423107
+ vertex 156.94879613182712 -85.44762707367943 377.58873893743305
+ endloop
+endfacet
+facet normal -0.49994522926465357 -0.8660570231743162 -1.859985921082137e-05
+ outer loop
+ vertex 157.8148531551514 -85.94757230303068 377.58873893860937
+ vertex 156.94879613182712 -85.44762707367943 377.58873893743305
+ vertex 157.81515540286424 -85.94704879463569 345.08873894423107
+ endloop
+endfacet
+facet normal -0.8660570233242345 0.4999452293509425 -1.176303165687834e-09
+ outer loop
+ vertex 156.94909837953995 -85.44710356528444 345.08873894305475
+ vertex 156.94879613182712 -85.44762707367943 377.58873893743305
+ vertex 157.6990162249362 -84.14801802792502 345.0887668428436
+ endloop
+endfacet
+facet normal -0.8660570233242345 0.4999452293509425 -1.176303165687834e-09
+ outer loop
+ vertex 157.6987139772234 -84.14854153632002 377.5887668372219
+ vertex 157.6990162249362 -84.14801802792502 345.0887668428436
+ vertex 156.94879613182712 -85.44762707367943 377.58873893743305
+ endloop
+endfacet
+facet normal -0.4999992947572106 -0.8660258107564331 -1.859985924801143e-05
+ outer loop
+ vertex 156.39996348268926 -83.3980109878247 345.08876684282086
+ vertex 157.6990162249362 -84.14801802792502 345.0887668428436
+ vertex 156.39966123497643 -83.39853449621971 377.5887668371992
+ endloop
+endfacet
+facet normal -0.4999992947572106 -0.8660258107564331 -1.859985924801143e-05
+ outer loop
+ vertex 157.6987139772234 -84.14854153632002 377.5887668372219
+ vertex 156.39966123497643 -83.39853449621971 377.5887668371992
+ vertex 157.6990162249362 -84.14801802792502 345.0887668428436
+ endloop
+endfacet
+facet normal -0.4994396199205255 -0.8663486975275524 -1.8599855355581055e-05
+ outer loop
+ vertex 156.34280093828684 -83.3650574674564 345.0887668420269
+ vertex 156.39996348268926 -83.3980109878247 345.08876684282086
+ vertex 156.34249869057405 -83.36558097585139 377.5887668364052
+ endloop
+endfacet
+facet normal -0.4994396199205255 -0.8663486975275524 -1.8599855355581055e-05
+ outer loop
+ vertex 156.39966123497643 -83.39853449621971 377.5887668371992
+ vertex 156.34249869057405 -83.36558097585139 377.5887668364052
+ vertex 156.39996348268926 -83.3980109878247 345.08876684282086
+ endloop
+endfacet
+facet normal -0.25849686862231425 -0.9660120954676167 -1.796447781698743e-05
+ outer loop
+ vertex 156.21562829958805 -83.3310271183089 345.0887662074895
+ vertex 156.34280093828684 -83.3650574674564 345.0887668420269
+ vertex 156.21532605187525 -83.33155062670389 377.5887662018678
+ endloop
+endfacet
+facet normal -0.25849686862231425 -0.9660120954676167 -1.796447781698743e-05
+ outer loop
+ vertex 156.34249869057405 -83.36558097585139 377.5887668364052
+ vertex 156.21532605187525 -83.33155062670389 377.5887662018678
+ vertex 156.34280093828684 -83.3650574674564 345.0887668420269
+ endloop
+endfacet
+facet normal 0.0003335267201213798 -0.9999999442502788 -1.6104847944964888e-05
+ outer loop
+ vertex 156.08398126100536 -83.3310710260966 345.08876498247406
+ vertex 156.21562829958805 -83.3310271183089 345.0887662074895
+ vertex 156.08367901329257 -83.33159453449159 377.58876497685236
+ endloop
+endfacet
+facet normal 0.0003335267201213798 -0.9999999442502788 -1.6104847944964888e-05
+ outer loop
+ vertex 156.21532605187525 -83.33155062670389 377.5887662018678
+ vertex 156.08367901329257 -83.33159453449159 377.58876497685236
+ vertex 156.21562829958805 -83.3310271183089 345.0887662074895
+ endloop
+endfacet
+facet normal 0.25914119276608716 -0.9658394494111885 -1.3147699300042003e-05
+ outer loop
+ vertex 155.9565291029474 -83.3657097069711 377.58876324484163
+ vertex 155.9568313506602 -83.3651861985761 345.08876325046333
+ vertex 156.08367901329257 -83.33159453449159 377.58876497685236
+ endloop
+endfacet
+facet normal 0.25914119276608716 -0.9658394494111885 -1.3147699300042003e-05
+ outer loop
+ vertex 156.08398126100536 -83.3310710260966 345.08876498247406
+ vertex 156.08367901329257 -83.33159453449159 377.58876497685236
+ vertex 155.9568313506602 -83.3651861985761 345.08876325046333
+ endloop
+endfacet
+facet normal 0.5002888147812303 -0.8658585922183849 -9.294556675349942e-06
+ outer loop
+ vertex 155.8425413771052 -83.4315712515166 377.58876112386935
+ vertex 155.842843624818 -83.4310477431216 345.088761129491
+ vertex 155.9565291029474 -83.3657097069711 377.58876324484163
+ endloop
+endfacet
+facet normal 0.5002888147812303 -0.8658585922183849 -9.294556675349942e-06
+ outer loop
+ vertex 155.9568313506602 -83.3651861985761 345.08876325046333
+ vertex 155.9565291029474 -83.3657097069711 377.58876324484163
+ vertex 155.842843624818 -83.4310477431216 345.088761129491
+ endloop
+endfacet
+facet normal 0.7073425808317078 -0.7068709028664446 -4.808005373273424e-06
+ outer loop
+ vertex 155.74948391090828 -83.52469081270817 377.5887587584761
+ vertex 155.74978615862108 -83.52416730431317 345.0887587640978
+ vertex 155.8425413771052 -83.4315712515166 377.58876112386935
+ endloop
+endfacet
+facet normal 0.7073425808317078 -0.7068709028664446 -4.808005373273424e-06
+ outer loop
+ vertex 155.842843624818 -83.4310477431216 345.088761129491
+ vertex 155.8425413771052 -83.4315712515166 377.58876112386935
+ vertex 155.74978615862108 -83.52416730431317 345.0887587640978
+ endloop
+endfacet
+facet normal 0.8660347035656324 -0.4999838919605184 3.45955575600947e-10
+ outer loop
+ vertex 155.7166519372563 -83.58155990194558 377.5887575370966
+ vertex 155.71695418496913 -83.58103639355058 345.08875754271827
+ vertex 155.74948391090828 -83.52469081270817 377.5887587584761
+ endloop
+endfacet
+facet normal 0.8660347035656324 -0.4999838919605184 3.45955575600947e-10
+ outer loop
+ vertex 155.74978615862108 -83.52416730431317 345.0887587640978
+ vertex 155.74948391090828 -83.52469081270817 377.5887587584761
+ vertex 155.71695418496913 -83.58103639355058 345.08875754271827
+ endloop
+endfacet
+facet normal 0.8660347035642542 -0.4999838919629057 3.459555243281557e-10
+ outer loop
+ vertex 150.21682912661578 -93.10794163950449 377.5885529386449
+ vertex 150.21713137432857 -93.1074181311095 345.0885529442666
+ vertex 155.7166519372563 -83.58155990194558 377.5887575370966
+ endloop
+endfacet
+facet normal 0.8660347035642542 -0.4999838919629057 3.459555243281557e-10
+ outer loop
+ vertex 155.71695418496913 -83.58103639355058 345.08875754271827
+ vertex 155.7166519372563 -83.58155990194558 377.5887575370966
+ vertex 150.21713137432857 -93.1074181311095 345.0885529442666
+ endloop
+endfacet
+facet normal 0.866034703563551 -0.4999838919641237 3.4595549816965313e-10
+ outer loop
+ vertex 150.18493425931052 -93.16318754321432 377.58855175212665
+ vertex 150.18523650702332 -93.16266403481931 345.0885517577483
+ vertex 150.21682912661578 -93.10794163950449 377.5885529386449
+ endloop
+endfacet
+facet normal 0.866034703563551 -0.4999838919641237 3.4595549816965313e-10
+ outer loop
+ vertex 150.21713137432857 -93.1074181311095 345.0885529442666
+ vertex 150.21682912661578 -93.10794163950449 377.5885529386449
+ vertex 150.18523650702332 -93.16266403481931 345.0885517577483
+ endloop
+endfacet
+facet normal 0.9648872694770408 -0.26266434318089305 4.742399434357771e-06
+ outer loop
+ vertex 150.15037177433945 -93.29015149027101 377.5885493855689
+ vertex 150.15067402205224 -93.28962798187602 345.0885493911906
+ vertex 150.18493425931052 -93.16318754321432 377.58855175212665
+ endloop
+endfacet
+facet normal 0.9648872694770408 -0.26266434318089305 4.742399434357771e-06
+ outer loop
+ vertex 150.18523650702332 -93.16266403481931 345.0885517577483
+ vertex 150.18493425931052 -93.16318754321432 377.58855175212665
+ vertex 150.15067402205224 -93.28962798187602 345.0885493911906
+ endloop
+endfacet
+facet normal 0.9999920674984399 -0.003983071038499263 9.235696742973618e-06
+ outer loop
+ vertex 150.14984766502894 -93.4217346751012 377.5885472611593
+ vertex 150.1501499127417 -93.4212111667062 345.088547266781
+ vertex 150.15037177433945 -93.29015149027101 377.5885493855689
+ endloop
+endfacet
+facet normal 0.9999920674984399 -0.003983071038499263 9.235696742973618e-06
+ outer loop
+ vertex 150.15067402205224 -93.28962798187602 345.0885493911906
+ vertex 150.15037177433945 -93.29015149027101 377.5885493855689
+ vertex 150.1501499127417 -93.4212111667062 345.088547266781
+ endloop
+endfacet
+facet normal 0.9669490586844907 0.2549696408154866 1.309959658130576e-05
+ outer loop
+ vertex 150.18339764856265 -93.54896992111053 377.58854552367274
+ vertex 150.18369989627547 -93.54844641271553 345.08854552929444
+ vertex 150.14984766502894 -93.4217346751012 377.5885472611593
+ endloop
+endfacet
+facet normal 0.9669490586844907 0.2549696408154866 1.309959658130576e-05
+ outer loop
+ vertex 150.1501499127417 -93.4212111667062 345.088547266781
+ vertex 150.14984766502894 -93.4217346751012 377.5885472611593
+ vertex 150.18369989627547 -93.54844641271553 345.08854552929444
+ endloop
+endfacet
+facet normal 0.8680100694813677 0.49654659300077875 1.6070780560670495e-05
+ outer loop
+ vertex 150.24903759671903 -93.6626628481546 345.08854429713773
+ vertex 150.18369989627547 -93.54844641271553 345.08854552929444
+ vertex 150.2487353490062 -93.6631863565496 377.58854429151603
+ endloop
+endfacet
+facet normal 0.8680100694813677 0.49654659300077875 1.6070780560670495e-05
+ outer loop
+ vertex 150.18339764856265 -93.54896992111053 377.58854552367274
+ vertex 150.2487353490062 -93.6631863565496 377.58854429151603
+ vertex 150.18369989627547 -93.54844641271553 345.08854552929444
+ endloop
+endfacet
+facet normal 0.7099176284945937 0.7042847154599664 1.7946767403096812e-05
+ outer loop
+ vertex 150.34171035776342 -93.75607681169942 345.0885436542804
+ vertex 150.24903759671903 -93.6626628481546 345.08854429713773
+ vertex 150.34140811005062 -93.7566003200944 377.5885436486587
+ endloop
+endfacet
+facet normal 0.7099176284945937 0.7042847154599664 1.7946767403096812e-05
+ outer loop
+ vertex 150.2487353490062 -93.6631863565496 377.58854429151603
+ vertex 150.34140811005062 -93.7566003200944 377.5885436486587
+ vertex 150.24903759671903 -93.6626628481546 345.08854429713773
+ endloop
+endfacet
+facet normal 0.5002746392317561 0.8658667824761392 1.859985831256185e-05
+ outer loop
+ vertex 151.69962881423348 -94.54064573115123 345.08854364502906
+ vertex 150.34171035776342 -93.75607681169942 345.0885436542804
+ vertex 151.69932656652065 -94.54116923954622 377.58854363940736
+ endloop
+endfacet
+facet normal 0.5002746392317561 0.8658667824761392 1.859985831256185e-05
+ outer loop
+ vertex 150.34140811005062 -93.7566003200944 377.5885436486587
+ vertex 151.69932656652065 -94.54116923954622 377.58854363940736
+ vertex 150.34171035776342 -93.75607681169942 345.0885436542804
+ endloop
+endfacet
+facet normal -0.8660347035642884 0.4999838919628465 -3.4595552559972795e-10
+ outer loop
+ vertex 151.69962881423348 -94.54064573115123 345.08854364502906
+ vertex 151.69932656652065 -94.54116923954622 377.58854363940736
+ vertex 152.4495823314251 -93.24163233814313 345.08857154398754
+ endloop
+endfacet
+facet normal -0.8660347035642884 0.4999838919628465 -3.4595552559972795e-10
+ outer loop
+ vertex 152.4492800837123 -93.24215584653813 377.5885715383659
+ vertex 152.4495823314251 -93.24163233814313 345.08857154398754
+ vertex 151.69932656652065 -94.54116923954622 377.58854363940736
+ endloop
+endfacet
+facet normal 0.49994522926441914 0.8660570231744517 1.859985921082137e-05
+ outer loop
+ vertex 153.31563935474946 -93.7415775674941 345.08857154516386
+ vertex 152.4495823314251 -93.24163233814313 345.08857154398754
+ vertex 153.31533710703664 -93.7421010758891 377.58857153954216
+ endloop
+endfacet
+facet normal 0.49994522926441914 0.8660570231744517 1.859985921082137e-05
+ outer loop
+ vertex 152.4492800837123 -93.24215584653813 377.5885715383659
+ vertex 153.31533710703664 -93.7421010758891 377.58857153954216
+ vertex 152.4495823314251 -93.24163233814313 345.08857154398754
+ endloop
+endfacet
+facet normal 0.8660570233241365 -0.4999452293511121 1.1763031620449354e-09
+ outer loop
+ vertex 152.56541926239237 -95.04118661194525 377.58854363975337
+ vertex 152.56572151010516 -95.04066310355026 345.08854364537507
+ vertex 153.31533710703664 -93.7421010758891 377.58857153954216
+ endloop
+endfacet
+facet normal 0.8660570233241365 -0.4999452293511121 1.1763031620449354e-09
+ outer loop
+ vertex 153.31563935474946 -93.7415775674941 345.08857154516386
+ vertex 153.31533710703664 -93.7421010758891 377.58857153954216
+ vertex 152.56572151010516 -95.04066310355026 345.08854364537507
+ endloop
+endfacet
+facet normal 0.4999838918764072 0.866034703414457 1.859985924480165e-05
+ outer loop
+ vertex 154.29779091895986 -96.04063088847262 345.08854364606697
+ vertex 152.56572151010516 -95.04066310355026 345.08854364537507
+ vertex 154.29748867124707 -96.04115439686761 377.58854364044527
+ endloop
+endfacet
+facet normal 0.4999838918764072 0.866034703414457 1.859985924480165e-05
+ outer loop
+ vertex 152.56541926239237 -95.04118661194525 377.58854363975337
+ vertex 154.29748867124707 -96.04115439686761 377.58854364044527
+ vertex 152.56572151010516 -95.04066310355026 345.08854364537507
+ endloop
+endfacet
+facet normal 0.8660347035642463 -0.4999838919629194 3.4595554154404816e-10
+ outer loop
+ vertex 160.2972541309662 -85.64880939358348 377.5887668372219
+ vertex 160.297556378679 -85.64828588518847 345.0887668428436
+ vertex 164.04762715044825 -79.15269374187481 377.5889063545372
+ endloop
+endfacet
+facet normal 0.8660347035642463 -0.4999838919629194 3.4595554154404816e-10
+ outer loop
+ vertex 164.04792939816105 -79.15217023347982 345.0889063601589
+ vertex 164.04762715044825 -79.15269374187481 377.5889063545372
+ vertex 160.297556378679 -85.64828588518847 345.0887668428436
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -157.7575276644561 -94.40198758902719 76.8999141407756
+ vertex -157.5164763162614 -94.30186142317248 76.89991962967026
+ vertex -157.63041106045628 -94.36779201211587 76.89991965080323
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -157.57383190548697 -94.33512461859637 76.89991965060597
+ vertex -157.63041106045628 -94.36779201211587 76.89991965080323
+ vertex -157.5164763162614 -94.30186142317248 76.89991962967026
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -163.5185126628154 -83.91087982161369 76.89797173010376
+ vertex -159.67743069290276 -81.69313485317022 76.89797171671222
+ vertex -163.5740251988186 -83.94293137593381 76.89797173029733
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -158.92734853931128 -82.99212552541144 76.89821520675073
+ vertex -163.5740251988186 -83.94293137593381 76.89797173029733
+ vertex -159.67743069290276 -81.69313485317022 76.89797171671222
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -163.63225167193696 -83.97706548764744 76.8979718029818
+ vertex -163.5740251988186 -83.94293137593381 76.89797173029733
+ vertex -158.92734853931128 -82.99212552541144 76.89821520675073
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -163.72498500742452 -84.07043375352602 76.89797740205503
+ vertex -163.63225167193696 -83.97706548764744 76.8979718029818
+ vertex -158.92734853931128 -82.99212552541144 76.89821520675073
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -163.79039304571387 -84.1846217262285 76.89798814575447
+ vertex -163.72498500742452 -84.07043375352602 76.89797740205503
+ vertex -158.92734853931128 -82.99212552541144 76.89821520675073
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -163.82401833708735 -84.3118476841195 76.89800330191619
+ vertex -163.79039304571387 -84.1846217262285 76.89798814575447
+ vertex -158.92734853931128 -82.99212552541144 76.89821520675073
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -163.82356937350636 -84.44344138841973 76.89802183767291
+ vertex -163.82401833708735 -84.3118476841195 76.89800330191619
+ vertex -158.92734853931128 -82.99212552541144 76.89821520675073
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -163.78907675109687 -84.57043494564991 76.89804248984264
+ vertex -163.82356937350636 -84.44344138841973 76.89802183767291
+ vertex -158.92734853931128 -82.99212552541144 76.89821520675073
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -163.75702519678228 -84.62594748164355 76.89805289515232
+ vertex -163.78907675109687 -84.57043494564991 76.89804248984264
+ vertex -158.92734853931128 -82.99212552541144 76.89821520675073
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -163.72289108507456 -84.68417395475166 76.89806385101268
+ vertex -163.75702519678228 -84.62594748164355 76.89805289515232
+ vertex -158.92734853931128 -82.99212552541144 76.89821520675073
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -158.28951540474222 -94.09554546579137 76.89982788353092
+ vertex -163.72289108507456 -84.68417395475166 76.89806385101268
+ vertex -158.92734853931128 -82.99212552541144 76.89821520675073
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -154.4268466355445 -90.78608511424399 76.89967614989796
+ vertex -158.28951540474222 -94.09554546579137 76.89982788353092
+ vertex -158.92734853931128 -82.99212552541144 76.89821520675073
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -153.56085285476345 -90.28603034559481 76.8996761396332
+ vertex -154.4268466355445 -90.78608511424399 76.89967614989796
+ vertex -158.92734853931128 -82.99212552541144 76.89821520675073
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -153.67685409603874 -92.08505450074045 76.89991962967089
+ vertex -158.28951540474222 -94.09554546579137 76.89982788353092
+ vertex -154.4268466355445 -90.78608511424399 76.89967614989796
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -158.25683109917384 -94.15211485659248 76.89983848876919
+ vertex -158.28951540474222 -94.09554546579137 76.89982788353092
+ vertex -153.67685409603874 -92.08505450074045 76.89991962967089
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -158.22358481581026 -94.20948020996663 76.89984925151508
+ vertex -158.25683109917384 -94.15211485659248 76.89983848876919
+ vertex -153.67685409603874 -92.08505450074045 76.89991962967089
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -158.1304122755219 -94.3024686298038 76.89986988593301
+ vertex -158.22358481581026 -94.20948020996663 76.89984925151508
+ vertex -153.67685409603874 -92.08505450074045 76.89991962967089
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -158.016347338523 -94.36817371816151 76.89988838058402
+ vertex -158.1304122755219 -94.3024686298038 76.89986988593301
+ vertex -153.67685409603874 -92.08505450074045 76.89991962967089
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -157.8891633417686 -94.40211778185105 76.89990347508584
+ vertex -158.016347338523 -94.36817371816151 76.89988838058402
+ vertex -153.67685409603874 -92.08505450074045 76.89991962967089
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -157.7575276644561 -94.40198758902719 76.8999141407756
+ vertex -157.8891633417686 -94.40211778185105 76.89990347508584
+ vertex -153.67685409603874 -92.08505450074045 76.89991962967089
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -157.5164763162614 -94.30186142317248 76.89991962967026
+ vertex -157.7575276644561 -94.40198758902719 76.8999141407756
+ vertex -153.67685409603874 -92.08505450074045 76.89991962967089
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -157.56715719008477 -80.47471554330563 76.89797170935657
+ vertex -157.5119124728837 -80.442818620885 76.89797170916319
+ vertex -158.81135659813577 -81.19308526271273 76.8979717136939
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -157.45294075463588 -80.40937784286784 76.89797179443275
+ vertex -158.81135659813577 -81.19308526271273 76.8979717136939
+ vertex -157.5119124728837 -80.442818620885 76.89797170916319
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -158.06135475853026 -82.49207075676226 76.89821519648596
+ vertex -158.81135659813577 -81.19308526271273 76.8979717136939
+ vertex -157.45294075463588 -80.40937784286784 76.89797179443275
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -157.3257055086156 -80.37582785933705 76.89797740484748
+ vertex -158.06135475853026 -82.49207075676226 76.89821519648596
+ vertex -157.45294075463588 -80.40937784286784 76.89797179443275
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -157.1941223237739 -80.37635196864751 76.89798815825706
+ vertex -158.06135475853026 -82.49207075676226 76.89821519648596
+ vertex -157.3257055086156 -80.37582785933705 76.89797740484748
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -157.06715837670635 -80.41091445361543 76.89800332183769
+ vertex -158.06135475853026 -82.49207075676226 76.89821519648596
+ vertex -157.1941223237739 -80.37635196864751 76.89798815825706
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -156.95346605058768 -80.47715993800782 76.89802186221303
+ vertex -158.06135475853026 -82.49207075676226 76.89821519648596
+ vertex -157.06715837670635 -80.41091445361543 76.89800332183769
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -156.86079328955748 -80.57057390153903 76.89804251589057
+ vertex -158.06135475853026 -82.49207075676226 76.89821519648596
+ vertex -156.95346605058768 -80.47715993800782 76.89802186221303
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -156.82889636714228 -80.6258186187306 76.89805287100077
+ vertex -158.06135475853026 -82.49207075676226 76.89821519648596
+ vertex -156.86079328955748 -80.57057390153903 76.89804251589057
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -156.7954555891309 -80.6847903369681 76.89806387535373
+ vertex -158.06135475853026 -82.49207075676226 76.89821519648596
+ vertex -156.82889636714228 -80.6258186187306 76.89805287100077
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -151.36174663699586 -90.09487589986321 76.8998277541441
+ vertex -158.06135475853026 -82.49207075676226 76.89821519648596
+ vertex -156.7954555891309 -80.6847903369681 76.89806387535373
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -158.92734853931128 -82.99212552541144 76.89821520675073
+ vertex -158.06135475853026 -82.49207075676226 76.89821519648596
+ vertex -151.36174663699586 -90.09487589986321 76.8998277541441
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -153.56085285476345 -90.28603034559481 76.8996761396332
+ vertex -158.92734853931128 -82.99212552541144 76.89821520675073
+ vertex -151.36174663699586 -90.09487589986321 76.8998277541441
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -152.8107707004195 -91.58502101913913 76.89991962967197
+ vertex -153.56085285476345 -90.28603034559481 76.8996761396332
+ vertex -151.36174663699586 -90.09487589986321 76.8998277541441
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -151.32871918158833 -90.15199575783775 76.89983846461764
+ vertex -152.8107707004195 -91.58502101913913 76.89991962967197
+ vertex -151.36174663699586 -90.09487589986321 76.8998277541441
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -151.29588509244473 -90.20886362569561 76.89984912397246
+ vertex -152.8107707004195 -91.58502101913913 76.89991962967197
+ vertex -151.32871918158833 -90.15199575783775 76.89983846461764
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -151.2617699199621 -90.33601353602963 76.8998697674871
+ vertex -152.8107707004195 -91.58502101913913 76.89991962967197
+ vertex -151.29588509244473 -90.20886362569561 76.89984912397246
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -151.2617260121743 -90.46766057460133 76.89988827786495
+ vertex -152.8107707004195 -91.58502101913913 76.89991962967197
+ vertex -151.2617699199621 -90.33601353602963 76.8998697674871
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -151.29575636132495 -90.59483321328898 76.89990339365369
+ vertex -152.8107707004195 -91.58502101913913 76.89991962967197
+ vertex -151.2617260121743 -90.46766057460133 76.89988827786495
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -151.36154185535688 -90.70886484692869 76.8999140847412
+ vertex -152.8107707004195 -91.58502101913913 76.89991962967197
+ vertex -151.29575636132495 -90.59483321328898 76.89990339365369
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -151.4545993215676 -90.80198440813426 76.89991962254427
+ vertex -152.8107707004195 -91.58502101913913 76.89991962967197
+ vertex -151.36154185535688 -90.70886484692869 76.8999140847412
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -151.51171917955205 -90.83501186354749 76.89991962947417
+ vertex -152.8107707004195 -91.58502101913913 76.89991962967197
+ vertex -151.4545993215676 -90.80198440813426 76.89991962254427
+ endloop
+endfacet
+facet normal 1.0656126846536056e-06 -1.84569530272859e-06 -0.9999999999977288
+ outer loop
+ vertex -151.56858704741973 -90.86784595269675 76.89991962967161
+ vertex -152.8107707004195 -91.58502101913913 76.89991962967197
+ vertex -151.51171917955205 -90.83501186354749 76.89991962947417
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -157.56766868621563 -80.47382960602269 556.8998883596455
+ vertex -158.81186809426669 -81.19219932542975 556.899888363982
+ vertex -157.51242396901458 -80.44193268360209 556.8998883594513
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -158.06186625466114 -82.49118481947929 556.900131846774
+ vertex -157.51242396901458 -80.44193268360209 556.8998883594513
+ vertex -158.81186809426669 -81.19219932542975 556.899888363982
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -157.45345225076673 -80.40849190558491 556.8998884447209
+ vertex -157.51242396901458 -80.44193268360209 556.8998883594513
+ vertex -158.06186625466114 -82.49118481947929 556.900131846774
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -157.32621700474647 -80.3749419220541 556.8998940551355
+ vertex -157.45345225076673 -80.40849190558491 556.8998884447209
+ vertex -158.06186625466114 -82.49118481947929 556.900131846774
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -157.1946338199048 -80.37546603136458 556.8999048085452
+ vertex -157.32621700474647 -80.3749419220541 556.8998940551355
+ vertex -158.06186625466114 -82.49118481947929 556.900131846774
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -157.06766987283723 -80.41002851633247 556.8999199721258
+ vertex -157.1946338199048 -80.37546603136458 556.8999048085452
+ vertex -158.06186625466114 -82.49118481947929 556.900131846774
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -156.95397754671853 -80.47627400072487 556.8999385125012
+ vertex -157.06766987283723 -80.41002851633247 556.8999199721258
+ vertex -158.06186625466114 -82.49118481947929 556.900131846774
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -156.86130478568833 -80.56968796425609 556.8999591661794
+ vertex -156.95397754671853 -80.47627400072487 556.8999385125012
+ vertex -158.06186625466114 -82.49118481947929 556.900131846774
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -156.8294078632732 -80.62493268144762 556.8999695212889
+ vertex -156.86130478568833 -80.56968796425609 556.8999591661794
+ vertex -158.06186625466114 -82.49118481947929 556.900131846774
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -156.79596708526176 -80.68390439968516 556.8999805256426
+ vertex -156.8294078632732 -80.62493268144762 556.8999695212889
+ vertex -158.06186625466114 -82.49118481947929 556.900131846774
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -151.36225813312674 -90.09398996258028 556.9017444044338
+ vertex -156.79596708526176 -80.68390439968516 556.8999805256426
+ vertex -158.06186625466114 -82.49118481947929 556.900131846774
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -158.92786003544217 -82.99123958812847 556.9001318570389
+ vertex -151.36225813312674 -90.09398996258028 556.9017444044338
+ vertex -158.06186625466114 -82.49118481947929 556.900131846774
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -153.56136435089434 -90.28514440831188 556.9015927899221
+ vertex -151.36225813312674 -90.09398996258028 556.9017444044338
+ vertex -158.92786003544217 -82.99123958812847 556.9001318570389
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -152.8112821965504 -91.58413508185618 556.9018362799609
+ vertex -151.36225813312674 -90.09398996258028 556.9017444044338
+ vertex -153.56136435089434 -90.28514440831188 556.9015927899221
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -151.3292306777192 -90.15110982055481 556.9017551149075
+ vertex -151.36225813312674 -90.09398996258028 556.9017444044338
+ vertex -152.8112821965504 -91.58413508185618 556.9018362799609
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -151.29639658857562 -90.20797768841267 556.9017657742614
+ vertex -151.3292306777192 -90.15110982055481 556.9017551149075
+ vertex -152.8112821965504 -91.58413508185618 556.9018362799609
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -151.262281416093 -90.33512759874668 556.901786417776
+ vertex -151.29639658857562 -90.20797768841267 556.9017657742614
+ vertex -152.8112821965504 -91.58413508185618 556.9018362799609
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -151.26223750830522 -90.46677463731838 556.9018049281539
+ vertex -151.262281416093 -90.33512759874668 556.901786417776
+ vertex -152.8112821965504 -91.58413508185618 556.9018362799609
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -151.2962678574558 -90.59394727600603 556.9018200439434
+ vertex -151.26223750830522 -90.46677463731838 556.9018049281539
+ vertex -152.8112821965504 -91.58413508185618 556.9018362799609
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -151.36205335148773 -90.70797890964575 556.9018307350301
+ vertex -151.2962678574558 -90.59394727600603 556.9018200439434
+ vertex -152.8112821965504 -91.58413508185618 556.9018362799609
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -151.45511081769848 -90.8010984708513 556.901836272834
+ vertex -151.36205335148773 -90.70797890964575 556.9018307350301
+ vertex -152.8112821965504 -91.58413508185618 556.9018362799609
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -151.51223067568293 -90.83412592626453 556.9018362797632
+ vertex -151.45511081769848 -90.8010984708513 556.901836272834
+ vertex -152.8112821965504 -91.58413508185618 556.9018362799609
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -151.5690985435506 -90.86696001541381 556.9018362799613
+ vertex -151.51223067568293 -90.83412592626453 556.9018362797632
+ vertex -152.8112821965504 -91.58413508185618 556.9018362799609
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -159.67794218903362 -81.69224891588726 556.899888367001
+ vertex -163.51902415894628 -83.90999388433075 556.8998883803919
+ vertex -158.92786003544217 -82.99123958812847 556.9001318570389
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -163.57453669494947 -83.94204543865087 556.8998883805855
+ vertex -158.92786003544217 -82.99123958812847 556.9001318570389
+ vertex -163.51902415894628 -83.90999388433075 556.8998883803919
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -163.63276316806784 -83.9761795503645 556.8998884532699
+ vertex -158.92786003544217 -82.99123958812847 556.9001318570389
+ vertex -163.57453669494947 -83.94204543865087 556.8998883805855
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -163.7254965035554 -84.06954781624307 556.8998940523439
+ vertex -158.92786003544217 -82.99123958812847 556.9001318570389
+ vertex -163.63276316806784 -83.9761795503645 556.8998884532699
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -163.79090454184472 -84.18373578894555 556.8999047960434
+ vertex -158.92786003544217 -82.99123958812847 556.9001318570389
+ vertex -163.7254965035554 -84.06954781624307 556.8998940523439
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -163.82452983321824 -84.31096174683654 556.8999199522051
+ vertex -158.92786003544217 -82.99123958812847 556.9001318570389
+ vertex -163.79090454184472 -84.18373578894555 556.8999047960434
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -163.8240808696372 -84.44255545113678 556.8999384879611
+ vertex -158.92786003544217 -82.99123958812847 556.9001318570389
+ vertex -163.82452983321824 -84.31096174683654 556.8999199522051
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -163.78958824722778 -84.56954900836696 556.8999591401308
+ vertex -158.92786003544217 -82.99123958812847 556.9001318570389
+ vertex -163.8240808696372 -84.44255545113678 556.8999384879611
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -163.75753669291316 -84.62506154436058 556.8999695454412
+ vertex -158.92786003544217 -82.99123958812847 556.9001318570389
+ vertex -163.78958824722778 -84.56954900836696 556.8999591401308
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -163.72340258120548 -84.68328801746868 556.8999805013008
+ vertex -158.92786003544217 -82.99123958812847 556.9001318570389
+ vertex -163.75753669291316 -84.62506154436058 556.8999695454412
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -158.29002690087313 -94.09465952850837 556.9017445338206
+ vertex -158.92786003544217 -82.99123958812847 556.9001318570389
+ vertex -163.72340258120548 -84.68328801746868 556.8999805013008
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -154.4273581316754 -90.78519917696103 556.9015928001869
+ vertex -158.92786003544217 -82.99123958812847 556.9001318570389
+ vertex -158.29002690087313 -94.09465952850837 556.9017445338206
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -153.56136435089434 -90.28514440831188 556.9015927899221
+ vertex -158.92786003544217 -82.99123958812847 556.9001318570389
+ vertex -154.4273581316754 -90.78519917696103 556.9015928001869
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -153.67736559216962 -92.0841685634575 556.9018362799605
+ vertex -154.4273581316754 -90.78519917696103 556.9015928001869
+ vertex -158.29002690087313 -94.09465952850837 556.9017445338206
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -158.25734259530475 -94.1512289193095 556.9017551390589
+ vertex -153.67736559216962 -92.0841685634575 556.9018362799605
+ vertex -158.29002690087313 -94.09465952850837 556.9017445338206
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -158.22409631194114 -94.2085942726837 556.901765901804
+ vertex -153.67736559216962 -92.0841685634575 556.9018362799605
+ vertex -158.25734259530475 -94.1512289193095 556.9017551390589
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -158.1309237716528 -94.3015826925208 556.9017865362227
+ vertex -153.67736559216962 -92.0841685634575 556.9018362799605
+ vertex -158.22409631194114 -94.2085942726837 556.901765901804
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -158.01685883465387 -94.36728778087853 556.9018050308729
+ vertex -153.67736559216962 -92.0841685634575 556.9018362799605
+ vertex -158.1309237716528 -94.3015826925208 556.9017865362227
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -157.8896748378995 -94.40123184456809 556.9018201253748
+ vertex -153.67736559216962 -92.0841685634575 556.9018362799605
+ vertex -158.01685883465387 -94.36728778087853 556.9018050308729
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -157.75803916058695 -94.40110165174426 556.9018307910653
+ vertex -153.67736559216962 -92.0841685634575 556.9018362799605
+ vertex -157.8896748378995 -94.40123184456809 556.9018201253748
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -157.51698781239227 -94.30097548588954 556.9018362799592
+ vertex -153.67736559216962 -92.0841685634575 556.9018362799605
+ vertex -157.75803916058695 -94.40110165174426 556.9018307910653
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -157.75803916058695 -94.40110165174426 556.9018307910653
+ vertex -157.63092255658717 -94.3669060748329 556.9018363010921
+ vertex -157.51698781239227 -94.30097548588954 556.9018362799592
+ endloop
+endfacet
+facet normal -1.0656126846536056e-06 1.84569530272859e-06 0.9999999999977288
+ outer loop
+ vertex -157.57434340161785 -94.33423868131341 556.9018363008956
+ vertex -157.51698781239227 -94.30097548588954 556.9018362799592
+ vertex -157.63092255658717 -94.3669060748329 556.9018363010921
+ endloop
+endfacet
+facet normal -0.5000161012764235 0.8660160922952709 -0.00016232669040715017
+ outer loop
+ vertex -163.5185126628154 -83.91087982161369 76.89797173010376
+ vertex -163.51902415894628 -83.90999388433075 556.8998883803919
+ vertex -159.67743069290276 -81.69313485317022 76.89797171671222
+ endloop
+endfacet
+facet normal -0.5000161012764235 0.8660160922952709 -0.00016232669040715017
+ outer loop
+ vertex -159.67794218903362 -81.69224891588726 556.899888367001
+ vertex -159.67743069290276 -81.69313485317022 76.89797171671222
+ vertex -163.51902415894628 -83.90999388433075 556.8998883803919
+ endloop
+endfacet
+facet normal 0.8659937807809363 0.500054768649135 -1.0265637493693751e-08
+ outer loop
+ vertex -159.67794218903362 -81.69224891588726 556.899888367001
+ vertex -158.92786003544217 -82.99123958812847 556.9001318570389
+ vertex -159.67743069290276 -81.69313485317022 76.89797171671222
+ endloop
+endfacet
+facet normal 0.8659937807809363 0.500054768649135 -1.0265637493693751e-08
+ outer loop
+ vertex -158.92734853931128 -82.99212552541144 76.89821520675073
+ vertex -159.67743069290276 -81.69313485317022 76.89797171671222
+ vertex -158.92786003544217 -82.99123958812847 556.9001318570389
+ endloop
+endfacet
+facet normal -0.5000547620609203 0.8659937693714905 -0.00016232669011062063
+ outer loop
+ vertex -158.92734853931128 -82.99212552541144 76.89821520675073
+ vertex -158.92786003544217 -82.99123958812847 556.9001318570389
+ vertex -158.06135475853026 -82.49207075676226 76.89821519648596
+ endloop
+endfacet
+facet normal -0.5000547620609203 0.8659937693714905 -0.00016232669011062063
+ outer loop
+ vertex -158.06186625466114 -82.49118481947929 556.900131846774
+ vertex -158.06135475853026 -82.49207075676226 76.89821519648596
+ vertex -158.92786003544217 -82.99123958812847 556.9001318570389
+ endloop
+endfacet
+facet normal -0.8660161037049507 -0.5000161078642328 3.0189382746258325e-09
+ outer loop
+ vertex -158.06186625466114 -82.49118481947929 556.900131846774
+ vertex -158.81186809426669 -81.19219932542975 556.899888363982
+ vertex -158.06135475853026 -82.49207075676226 76.89821519648596
+ endloop
+endfacet
+facet normal -0.8660161037049507 -0.5000161078642328 3.0189382746258325e-09
+ outer loop
+ vertex -158.81135659813577 -81.19308526271273 76.8979717136939
+ vertex -158.06135475853026 -82.49207075676226 76.89821519648596
+ vertex -158.81186809426669 -81.19219932542975 556.899888363982
+ endloop
+endfacet
+facet normal -0.5000161012764507 0.8660160922952552 -0.00016232669040715017
+ outer loop
+ vertex -158.81135659813577 -81.19308526271273 76.8979717136939
+ vertex -158.81186809426669 -81.19219932542975 556.899888363982
+ vertex -157.56715719008477 -80.47471554330563 76.89797170935657
+ endloop
+endfacet
+facet normal -0.5000161012764507 0.8660160922952552 -0.00016232669040715017
+ outer loop
+ vertex -157.56766868621563 -80.47382960602269 556.8998883596455
+ vertex -157.56715719008477 -80.47471554330563 76.89797170935657
+ vertex -158.81186809426669 -81.19219932542975 556.899888363982
+ endloop
+endfacet
+facet normal -0.500016101275811 0.8660160922956246 -0.00016232669040715017
+ outer loop
+ vertex -157.56715719008477 -80.47471554330563 76.89797170935657
+ vertex -157.56766868621563 -80.47382960602269 556.8998883596455
+ vertex -157.5119124728837 -80.442818620885 76.89797170916319
+ endloop
+endfacet
+facet normal -0.500016101275811 0.8660160922956246 -0.00016232669040715017
+ outer loop
+ vertex -157.51242396901458 -80.44193268360209 556.8998883594513
+ vertex -157.5119124728837 -80.442818620885 76.89797170916319
+ vertex -157.56766868621563 -80.47382960602269 556.8998883596455
+ endloop
+endfacet
+facet normal -0.49327460558188424 0.8698736328569019 -0.00016232181740206692
+ outer loop
+ vertex -157.5119124728837 -80.442818620885 76.89797170916319
+ vertex -157.51242396901458 -80.44193268360209 556.8998883594513
+ vertex -157.45294075463588 -80.40937784286784 76.89797179443275
+ endloop
+endfacet
+facet normal -0.49327460558188424 0.8698736328569019 -0.00016232181740206692
+ outer loop
+ vertex -157.45345225076673 -80.40849190558491 556.8998884447209
+ vertex -157.45294075463588 -80.40937784286784 76.89797179443275
+ vertex -157.51242396901458 -80.44193268360209 556.8998883594513
+ endloop
+endfacet
+facet normal -0.25496963775076736 0.9669490468960807 -0.00015662695715857298
+ outer loop
+ vertex -157.45294075463588 -80.40937784286784 76.89797179443275
+ vertex -157.45345225076673 -80.40849190558491 556.8998884447209
+ vertex -157.3257055086156 -80.37582785933705 76.89797740484748
+ endloop
+endfacet
+facet normal -0.25496963775076736 0.9669490468960807 -0.00015662695715857298
+ outer loop
+ vertex -157.32621700474647 -80.3749419220541 556.8998940551355
+ vertex -157.3257055086156 -80.37582785933705 76.89797740484748
+ vertex -157.45345225076673 -80.40849190558491 556.8998884447209
+ endloop
+endfacet
+facet normal 0.0039830710001457345 0.9999920577054815 -0.00014025464343150009
+ outer loop
+ vertex -157.3257055086156 -80.37582785933705 76.89797740484748
+ vertex -157.32621700474647 -80.3749419220541 556.8998940551355
+ vertex -157.1941223237739 -80.37635196864751 76.89798815825706
+ endloop
+endfacet
+facet normal 0.0039830710001457345 0.9999920577054815 -0.00014025464343150009
+ outer loop
+ vertex -157.1946338199048 -80.37546603136458 556.8999048085452
+ vertex -157.1941223237739 -80.37635196864751 76.89798815825706
+ vertex -157.32621700474647 -80.3749419220541 556.8998940551355
+ endloop
+endfacet
+facet normal 0.26266434150849904 0.9648872631711345 -0.00011432420753334252
+ outer loop
+ vertex -157.06766987283723 -80.41002851633247 556.8999199721258
+ vertex -157.06715837670635 -80.41091445361543 76.89800332183769
+ vertex -157.1946338199048 -80.37546603136458 556.8999048085452
+ endloop
+endfacet
+facet normal 0.26266434150849904 0.9648872631711345 -0.00011432420753334252
+ outer loop
+ vertex -157.1941223237739 -80.37635196864751 76.89798815825706
+ vertex -157.1946338199048 -80.37546603136458 556.8999048085452
+ vertex -157.06715837670635 -80.41091445361543 76.89800332183769
+ endloop
+endfacet
+facet normal 0.5034454728393466 0.8640269957476798 -8.060276562570307e-05
+ outer loop
+ vertex -157.06766987283723 -80.41002851633247 556.8999199721258
+ vertex -156.95397754671853 -80.47627400072487 556.8999385125012
+ vertex -157.06715837670635 -80.41091445361543 76.89800332183769
+ endloop
+endfacet
+facet normal 0.5034454728393466 0.8640269957476798 -8.060276562570307e-05
+ outer loop
+ vertex -156.95346605058768 -80.47715993800782 76.89802186221303
+ vertex -157.06715837670635 -80.41091445361543 76.89800332183769
+ vertex -156.95397754671853 -80.47627400072487 556.8999385125012
+ endloop
+endfacet
+facet normal 0.7099176280018695 0.7042847149691677 -4.138837817004136e-05
+ outer loop
+ vertex -156.86130478568833 -80.56968796425609 556.8999591661794
+ vertex -156.86079328955748 -80.57057390153903 76.89804251589057
+ vertex -156.95397754671853 -80.47627400072487 556.8999385125012
+ endloop
+endfacet
+facet normal 0.7099176280018695 0.7042847149691677 -4.138837817004136e-05
+ outer loop
+ vertex -156.95346605058768 -80.47715993800782 76.89802186221303
+ vertex -156.95397754671853 -80.47627400072487 556.8999385125012
+ vertex -156.86079328955748 -80.57057390153903 76.89804251589057
+ endloop
+endfacet
+facet normal 0.8660161037050109 0.5000161078641286 -3.0189382550943355e-09
+ outer loop
+ vertex -156.86130478568833 -80.56968796425609 556.8999591661794
+ vertex -156.8294078632732 -80.62493268144762 556.8999695212889
+ vertex -156.86079328955748 -80.57057390153903 76.89804251589057
+ endloop
+endfacet
+facet normal 0.8660161037050109 0.5000161078641286 -3.0189382550943355e-09
+ outer loop
+ vertex -156.82889636714228 -80.6258186187306 76.89805287100077
+ vertex -156.86079328955748 -80.57057390153903 76.89804251589057
+ vertex -156.8294078632732 -80.62493268144762 556.8999695212889
+ endloop
+endfacet
+facet normal 0.8698736443131271 0.49327461208521295 1.2577849671949673e-06
+ outer loop
+ vertex -156.79596708526176 -80.68390439968516 556.8999805256426
+ vertex -156.7954555891309 -80.6847903369681 76.89806387535373
+ vertex -156.8294078632732 -80.62493268144762 556.8999695212889
+ endloop
+endfacet
+facet normal 0.8698736443131271 0.49327461208521295 1.2577849671949673e-06
+ outer loop
+ vertex -156.82889636714228 -80.6258186187306 76.89805287100077
+ vertex -156.8294078632732 -80.62493268144762 556.8999695212889
+ vertex -156.7954555891309 -80.6847903369681 76.89806387535373
+ endloop
+endfacet
+facet normal 0.8659937807809156 0.5000547686491705 -1.0265637500370636e-08
+ outer loop
+ vertex -156.79596708526176 -80.68390439968516 556.8999805256426
+ vertex -151.36225813312674 -90.09398996258028 556.9017444044338
+ vertex -156.7954555891309 -80.6847903369681 76.89806387535373
+ endloop
+endfacet
+facet normal 0.8659937807809156 0.5000547686491705 -1.0265637500370636e-08
+ outer loop
+ vertex -151.36174663699586 -90.09487589986321 76.8998277541441
+ vertex -156.7954555891309 -80.6847903369681 76.89806387535373
+ vertex -151.36225813312674 -90.09398996258028 556.9017444044338
+ endloop
+endfacet
+facet normal 0.8657017474219322 0.5005601707193673 -1.0501697972304467e-07
+ outer loop
+ vertex -151.36225813312674 -90.09398996258028 556.9017444044338
+ vertex -151.3292306777192 -90.15110982055481 556.9017551149075
+ vertex -151.36174663699586 -90.09487589986321 76.8998277541441
+ endloop
+endfacet
+facet normal 0.8657017474219322 0.5005601707193673 -1.0501697972304467e-07
+ outer loop
+ vertex -151.32871918158833 -90.15199575783775 76.89983846461764
+ vertex -151.36174663699586 -90.09487589986321 76.8998277541441
+ vertex -151.3292306777192 -90.15110982055481 556.9017551149075
+ endloop
+endfacet
+facet normal 0.8660161037050109 0.5000161078641286 -3.0189382550943355e-09
+ outer loop
+ vertex -151.3292306777192 -90.15110982055481 556.9017551149075
+ vertex -151.29639658857562 -90.20797768841267 556.9017657742614
+ vertex -151.32871918158833 -90.15199575783775 76.89983846461764
+ endloop
+endfacet
+facet normal 0.8660161037050109 0.5000161078641286 -3.0189382550943355e-09
+ outer loop
+ vertex -151.29588509244473 -90.20886362569561 76.89984912397246
+ vertex -151.32871918158833 -90.15199575783775 76.89983846461764
+ vertex -151.29639658857562 -90.20797768841267 556.9017657742614
+ endloop
+endfacet
+facet normal 0.9658394486551818 0.25914119252008944 4.196094199893687e-05
+ outer loop
+ vertex -151.262281416093 -90.33512759874668 556.901786417776
+ vertex -151.2617699199621 -90.33601353602963 76.8998697674871
+ vertex -151.29639658857562 -90.20797768841267 556.9017657742614
+ endloop
+endfacet
+facet normal 0.9658394486551818 0.25914119252008944 4.196094199893687e-05
+ outer loop
+ vertex -151.29588509244473 -90.20886362569561 76.89984912397246
+ vertex -151.29639658857562 -90.20797768841267 556.9017657742614
+ vertex -151.2617699199621 -90.33601353602963 76.8998697674871
+ endloop
+endfacet
+facet normal 0.9999999410900223 0.00033352671948020697 8.111645491291906e-05
+ outer loop
+ vertex -151.262281416093 -90.33512759874668 556.901786417776
+ vertex -151.26223750830522 -90.46677463731838 556.9018049281539
+ vertex -151.2617699199621 -90.33601353602963 76.8998697674871
+ endloop
+endfacet
+facet normal 0.9999999410900223 0.00033352671948020697 8.111645491291906e-05
+ outer loop
+ vertex -151.2617260121743 -90.46766057460133 76.89988827786495
+ vertex -151.2617699199621 -90.33601353602963 76.8998697674871
+ vertex -151.26223750830522 -90.46677463731838 556.9018049281539
+ endloop
+endfacet
+facet normal 0.9660120892749533 -0.2584968669219232 0.0001147440152030761
+ outer loop
+ vertex -151.26223750830522 -90.46677463731838 556.9018049281539
+ vertex -151.2962678574558 -90.59394727600603 556.9018200439434
+ vertex -151.2617260121743 -90.46766057460133 76.89988827786495
+ endloop
+endfacet
+facet normal 0.9660120892749533 -0.2584968669219232 0.0001147440152030761
+ outer loop
+ vertex -151.29575636132495 -90.59483321328898 76.89990339365369
+ vertex -151.2617260121743 -90.46766057460133 76.89988827786495
+ vertex -151.2962678574558 -90.59394727600603 556.9018200439434
+ endloop
+endfacet
+facet normal 0.8661921104203348 -0.4997111246417401 0.00014055196028708565
+ outer loop
+ vertex -151.36154185535688 -90.70886484692869 76.8999140847412
+ vertex -151.29575636132495 -90.59483321328898 76.89990339365369
+ vertex -151.36205335148773 -90.70797890964575 556.9018307350301
+ endloop
+endfacet
+facet normal 0.8661921104203348 -0.4997111246417401 0.00014055196028708565
+ outer loop
+ vertex -151.2962678574558 -90.59394727600603 556.9018200439434
+ vertex -151.36205335148773 -90.70797890964575 556.9018307350301
+ vertex -151.29575636132495 -90.59483321328898 76.89990339365369
+ endloop
+endfacet
+facet normal 0.7073425721472306 -0.7068708941862679 0.00015678152155038607
+ outer loop
+ vertex -151.4545993215676 -90.80198440813426 76.89991962254427
+ vertex -151.36154185535688 -90.70886484692869 76.8999140847412
+ vertex -151.45511081769848 -90.8010984708513 556.901836272834
+ endloop
+endfacet
+facet normal 0.7073425721472306 -0.7068708941862679 0.00015678152155038607
+ outer loop
+ vertex -151.36205335148773 -90.70797890964575 556.9018307350301
+ vertex -151.45511081769848 -90.8010984708513 556.901836272834
+ vertex -151.36154185535688 -90.70886484692869 76.8999140847412
+ endloop
+endfacet
+facet normal 0.5005601641246878 -0.8657017360162346 0.00016232665646494205
+ outer loop
+ vertex -151.51171917955205 -90.83501186354749 76.89991962947417
+ vertex -151.4545993215676 -90.80198440813426 76.89991962254427
+ vertex -151.51223067568293 -90.83412592626453 556.9018362797632
+ endloop
+endfacet
+facet normal 0.5005601641246878 -0.8657017360162346 0.00016232665646494205
+ outer loop
+ vertex -151.45511081769848 -90.8010984708513 556.901836272834
+ vertex -151.51223067568293 -90.83412592626453 556.9018362797632
+ vertex -151.4545993215676 -90.80198440813426 76.89991962254427
+ endloop
+endfacet
+facet normal 0.5000161012764235 -0.8660160922952709 0.00016232669040715017
+ outer loop
+ vertex -151.56858704741973 -90.86784595269675 76.89991962967161
+ vertex -151.51171917955205 -90.83501186354749 76.89991962947417
+ vertex -151.5690985435506 -90.86696001541381 556.9018362799613
+ endloop
+endfacet
+facet normal 0.5000161012764235 -0.8660160922952709 0.00016232669040715017
+ outer loop
+ vertex -151.51223067568293 -90.83412592626453 556.9018362797632
+ vertex -151.5690985435506 -90.86696001541381 556.9018362799613
+ vertex -151.51171917955205 -90.83501186354749 76.89991962947417
+ endloop
+endfacet
+facet normal 0.499999993412509 -0.866025392374575 0.00016232669043522314
+ outer loop
+ vertex -152.8107707004195 -91.58502101913913 76.89991962967197
+ vertex -151.56858704741973 -90.86784595269675 76.89991962967161
+ vertex -152.8112821965504 -91.58413508185618 556.9018362799609
+ endloop
+endfacet
+facet normal 0.499999993412509 -0.866025392374575 0.00016232669043522314
+ outer loop
+ vertex -151.5690985435506 -90.86696001541381 556.9018362799613
+ vertex -152.8112821965504 -91.58413508185618 556.9018362799609
+ vertex -151.56858704741973 -90.86784595269675 76.89991962967161
+ endloop
+endfacet
+facet normal -0.8659937807809285 -0.5000547686491482 1.0265637496189201e-08
+ outer loop
+ vertex -152.8112821965504 -91.58413508185618 556.9018362799609
+ vertex -153.56136435089434 -90.28514440831188 556.9015927899221
+ vertex -152.8107707004195 -91.58502101913913 76.89991962967197
+ endloop
+endfacet
+facet normal -0.8659937807809285 -0.5000547686491482 1.0265637496189201e-08
+ outer loop
+ vertex -153.56085285476345 -90.28603034559481 76.8996761396332
+ vertex -152.8107707004195 -91.58502101913913 76.89991962967197
+ vertex -153.56136435089434 -90.28514440831188 556.9015927899221
+ endloop
+endfacet
+facet normal 0.5000547620609203 -0.8659937693714905 0.00016232669011062063
+ outer loop
+ vertex -154.4268466355445 -90.78608511424399 76.89967614989796
+ vertex -153.56085285476345 -90.28603034559481 76.8996761396332
+ vertex -154.4273581316754 -90.78519917696103 556.9015928001869
+ endloop
+endfacet
+facet normal 0.5000547620609203 -0.8659937693714905 0.00016232669011062063
+ outer loop
+ vertex -153.56136435089434 -90.28514440831188 556.9015927899221
+ vertex -154.4273581316754 -90.78519917696103 556.9015928001869
+ vertex -153.56085285476345 -90.28603034559481 76.8996761396332
+ endloop
+endfacet
+facet normal 0.8660161037050109 0.5000161078641286 -3.0189382550943355e-09
+ outer loop
+ vertex -153.67736559216962 -92.0841685634575 556.9018362799605
+ vertex -153.67685409603874 -92.08505450074045 76.89991962967089
+ vertex -154.4273581316754 -90.78519917696103 556.9015928001869
+ endloop
+endfacet
+facet normal 0.8660161037050109 0.5000161078641286 -3.0189382550943355e-09
+ outer loop
+ vertex -154.4268466355445 -90.78608511424399 76.89967614989796
+ vertex -154.4273581316754 -90.78519917696103 556.9015928001869
+ vertex -153.67685409603874 -92.08505450074045 76.89991962967089
+ endloop
+endfacet
+facet normal 0.49999999341250595 -0.8660253923745768 0.00016232669043522314
+ outer loop
+ vertex -157.5164763162614 -94.30186142317248 76.89991962967026
+ vertex -153.67685409603874 -92.08505450074045 76.89991962967089
+ vertex -157.51698781239227 -94.30097548588954 556.9018362799592
+ endloop
+endfacet
+facet normal 0.49999999341250595 -0.8660253923745768 0.00016232669043522314
+ outer loop
+ vertex -153.67736559216962 -92.0841685634575 556.9018362799605
+ vertex -157.51698781239227 -94.30097548588954 556.9018362799592
+ vertex -153.67685409603874 -92.08505450074045 76.89991962967089
+ endloop
+endfacet
+facet normal 0.5016837027503734 -0.8650511175906428 0.00016232638330655627
+ outer loop
+ vertex -157.57383190548697 -94.33512461859637 76.89991965060597
+ vertex -157.5164763162614 -94.30186142317248 76.89991962967026
+ vertex -157.57434340161785 -94.33423868131341 556.9018363008956
+ endloop
+endfacet
+facet normal 0.5016837027503734 -0.8650511175906428 0.00016232638330655627
+ outer loop
+ vertex -157.51698781239227 -94.30097548588954 556.9018362799592
+ vertex -157.57434340161785 -94.33423868131341 556.9018363008956
+ vertex -157.5164763162614 -94.30186142317248 76.89991962967026
+ endloop
+endfacet
+facet normal 0.5000161012758254 -0.8660160922956163 0.00016232669040715017
+ outer loop
+ vertex -157.63041106045628 -94.36779201211587 76.89991965080323
+ vertex -157.57383190548697 -94.33512461859637 76.89991965060597
+ vertex -157.63092255658717 -94.3669060748329 556.9018363010921
+ endloop
+endfacet
+facet normal 0.5000161012758254 -0.8660160922956163 0.00016232669040715017
+ outer loop
+ vertex -157.57434340161785 -94.33423868131341 556.9018363008956
+ vertex -157.63092255658717 -94.3669060748329 556.9018363010921
+ vertex -157.57383190548697 -94.33512461859637 76.89991965060597
+ endloop
+endfacet
+facet normal 0.259774253089141 -0.9656693599955052 0.00015683701866325126
+ outer loop
+ vertex -157.7575276644561 -94.40198758902719 76.8999141407756
+ vertex -157.63041106045628 -94.36779201211587 76.89991965080323
+ vertex -157.75803916058695 -94.40110165174426 556.9018307910653
+ endloop
+endfacet
+facet normal 0.259774253089141 -0.9656693599955052 0.00015683701866325126
+ outer loop
+ vertex -157.63092255658717 -94.3669060748329 556.9018363010921
+ vertex -157.75803916058695 -94.40110165174426 556.9018307910653
+ vertex -157.63041106045628 -94.36779201211587 76.89991965080323
+ endloop
+endfacet
+facet normal 0.0009890383963867414 -0.9999995010088893 0.00014065924284202783
+ outer loop
+ vertex -157.8891633417686 -94.40211778185105 76.89990347508584
+ vertex -157.7575276644561 -94.40198758902719 76.8999141407756
+ vertex -157.8896748378995 -94.40123184456809 556.9018201253748
+ endloop
+endfacet
+facet normal 0.0009890383963867414 -0.9999995010088893 0.00014065924284202783
+ outer loop
+ vertex -157.75803916058695 -94.40110165174426 556.9018307910653
+ vertex -157.8896748378995 -94.40123184456809 556.9018201253748
+ vertex -157.7575276644561 -94.40198758902719 76.8999141407756
+ endloop
+endfacet
+facet normal -0.25786357908416785 -0.9661813294516018 0.00011489577207227023
+ outer loop
+ vertex -158.016347338523 -94.36817371816151 76.89988838058402
+ vertex -157.8891633417686 -94.40211778185105 76.89990347508584
+ vertex -158.01685883465387 -94.36728778087853 556.9018050308729
+ endloop
+endfacet
+facet normal -0.25786357908416785 -0.9661813294516018 0.00011489577207227023
+ outer loop
+ vertex -157.8896748378995 -94.40123184456809 556.9018201253748
+ vertex -158.01685883465387 -94.36728778087853 556.9018050308729
+ vertex -157.8891633417686 -94.40211778185105 76.89990347508584
+ endloop
+endfacet
+facet normal -0.49914322141689127 -0.8665194965512877 8.130234411737682e-05
+ outer loop
+ vertex -158.01685883465387 -94.36728778087853 556.9018050308729
+ vertex -158.1309237716528 -94.3015826925208 556.9017865362227
+ vertex -158.016347338523 -94.36817371816151 76.89988838058402
+ endloop
+endfacet
+facet normal -0.49914322141689127 -0.8665194965512877 8.130234411737682e-05
+ outer loop
+ vertex -158.1304122755219 -94.3024686298038 76.89986988593301
+ vertex -158.016347338523 -94.36817371816151 76.89988838058402
+ vertex -158.1309237716528 -94.3015826925208 556.9017865362227
+ endloop
+endfacet
+facet normal -0.7064070789279 -0.7078057904979208 4.216829549636598e-05
+ outer loop
+ vertex -158.1309237716528 -94.3015826925208 556.9017865362227
+ vertex -158.22409631194114 -94.2085942726837 556.901765901804
+ vertex -158.1304122755219 -94.3024686298038 76.89986988593301
+ endloop
+endfacet
+facet normal -0.7064070789279 -0.7078057904979208 4.216829549636598e-05
+ outer loop
+ vertex -158.22358481581026 -94.20948020996663 76.89984925151508
+ vertex -158.1304122755219 -94.3024686298038 76.89986988593301
+ vertex -158.22409631194114 -94.2085942726837 556.901765901804
+ endloop
+endfacet
+facet normal -0.8651988528499923 -0.5014289032624523 2.679591724845905e-07
+ outer loop
+ vertex -158.25734259530475 -94.1512289193095 556.9017551390589
+ vertex -158.25683109917384 -94.15211485659248 76.89983848876919
+ vertex -158.22409631194114 -94.2085942726837 556.901765901804
+ endloop
+endfacet
+facet normal -0.8651988528499923 -0.5014289032624523 2.679591724845905e-07
+ outer loop
+ vertex -158.22358481581026 -94.20948020996663 76.89984925151508
+ vertex -158.22409631194114 -94.2085942726837 556.901765901804
+ vertex -158.25683109917384 -94.15211485659248 76.89983848876919
+ endloop
+endfacet
+facet normal -0.8658666070784498 -0.5002749431527138 5.1539400978575745e-08
+ outer loop
+ vertex -158.25734259530475 -94.1512289193095 556.9017551390589
+ vertex -158.29002690087313 -94.09465952850837 556.9017445338206
+ vertex -158.25683109917384 -94.15211485659248 76.89983848876919
+ endloop
+endfacet
+facet normal -0.8658666070784498 -0.5002749431527138 5.1539400978575745e-08
+ outer loop
+ vertex -158.28951540474222 -94.09554546579137 76.89982788353092
+ vertex -158.25683109917384 -94.15211485659248 76.89983848876919
+ vertex -158.29002690087313 -94.09465952850837 556.9017445338206
+ endloop
+endfacet
+facet normal -0.8660366478886046 -0.4999805241345598 -3.650822956058494e-09
+ outer loop
+ vertex -158.29002690087313 -94.09465952850837 556.9017445338206
+ vertex -163.72340258120548 -84.68328801746868 556.8999805013008
+ vertex -158.28951540474222 -94.09554546579137 76.89982788353092
+ endloop
+endfacet
+facet normal -0.8660366478886046 -0.4999805241345598 -3.650822956058494e-09
+ outer loop
+ vertex -163.72289108507456 -84.68417395475166 76.89806385101268
+ vertex -158.28951540474222 -94.09554546579137 76.89982788353092
+ vertex -163.72340258120548 -84.68328801746868 556.8999805013008
+ endloop
+endfacet
+facet normal -0.8626892331428296 -0.5057344036332481 1.0769114124448546e-06
+ outer loop
+ vertex -163.75753669291316 -84.62506154436058 556.8999695454412
+ vertex -163.75702519678228 -84.62594748164355 76.89805289515232
+ vertex -163.72340258120548 -84.68328801746868 556.8999805013008
+ endloop
+endfacet
+facet normal -0.8626892331428296 -0.5057344036332481 1.0769114124448546e-06
+ outer loop
+ vertex -163.72289108507456 -84.68417395475166 76.89806385101268
+ vertex -163.72340258120548 -84.68328801746868 556.8999805013008
+ vertex -163.75702519678228 -84.62594748164355 76.89805289515232
+ endloop
+endfacet
+facet normal -0.8660161037050109 -0.5000161078641286 3.0189382550943355e-09
+ outer loop
+ vertex -163.75753669291316 -84.62506154436058 556.8999695454412
+ vertex -163.78958824722778 -84.56954900836696 556.8999591401308
+ vertex -163.75702519678228 -84.62594748164355 76.89805289515232
+ endloop
+endfacet
+facet normal -0.8660161037050109 -0.5000161078641286 3.0189382550943355e-09
+ outer loop
+ vertex -163.78907675109687 -84.57043494564991 76.89804248984264
+ vertex -163.75702519678228 -84.62594748164355 76.89805289515232
+ vertex -163.78958824722778 -84.56954900836696 556.8999591401308
+ endloop
+endfacet
+facet normal -0.9650371855015948 -0.2621130078396181 -4.147805269390345e-05
+ outer loop
+ vertex -163.78958824722778 -84.56954900836696 556.8999591401308
+ vertex -163.8240808696372 -84.44255545113678 556.8999384879611
+ vertex -163.78907675109687 -84.57043494564991 76.89804248984264
+ endloop
+endfacet
+facet normal -0.9650371855015948 -0.2621130078396181 -4.147805269390345e-05
+ outer loop
+ vertex -163.82356937350636 -84.44344138841973 76.89802183767291
+ vertex -163.78907675109687 -84.57043494564991 76.89804248984264
+ vertex -163.8240808696372 -84.44255545113678 556.8999384879611
+ endloop
+endfacet
+facet normal -0.9999941768085319 -0.0034117208617779654 -8.068325748916707e-05
+ outer loop
+ vertex -163.8240808696372 -84.44255545113678 556.8999384879611
+ vertex -163.82452983321824 -84.31096174683654 556.8999199522051
+ vertex -163.82356937350636 -84.44344138841973 76.89802183767291
+ endloop
+endfacet
+facet normal -0.9999941768085319 -0.0034117208617779654 -8.068325748916707e-05
+ outer loop
+ vertex -163.82401833708735 -84.3118476841195 76.89800330191619
+ vertex -163.82356937350636 -84.44344138841973 76.89802183767291
+ vertex -163.82452983321824 -84.31096174683654 556.8999199522051
+ endloop
+endfacet
+facet normal -0.9668032166781141 0.25552206780584014 -0.00011439003134875238
+ outer loop
+ vertex -163.82452983321824 -84.31096174683654 556.8999199522051
+ vertex -163.79090454184472 -84.18373578894555 556.8999047960434
+ vertex -163.82401833708735 -84.3118476841195 76.89800330191619
+ endloop
+endfacet
+facet normal -0.9668032166781141 0.25552206780584014 -0.00011439003134875238
+ outer loop
+ vertex -163.79039304571387 -84.1846217262285 76.89798814575447
+ vertex -163.82401833708735 -84.3118476841195 76.89800330191619
+ vertex -163.79090454184472 -84.18373578894555 556.8999047960434
+ endloop
+endfacet
+facet normal -0.8677262154678845 0.4970424481926308 -0.0001403013134152382
+ outer loop
+ vertex -163.79039304571387 -84.1846217262285 76.89798814575447
+ vertex -163.79090454184472 -84.18373578894555 556.8999047960434
+ vertex -163.72498500742452 -84.07043375352602 76.89797740205503
+ endloop
+endfacet
+facet normal -0.8677262154678845 0.4970424481926308 -0.0001403013134152382
+ outer loop
+ vertex -163.7254965035554 -84.06954781624307 556.8998940523439
+ vertex -163.72498500742452 -84.07043375352602 76.89797740205503
+ vertex -163.79090454184472 -84.18373578894555 556.8999047960434
+ endloop
+endfacet
+facet normal -0.7095151081069204 0.7046902062810276 -0.00015665129282861325
+ outer loop
+ vertex -163.72498500742452 -84.07043375352602 76.89797740205503
+ vertex -163.7254965035554 -84.06954781624307 556.8998940523439
+ vertex -163.63225167193696 -83.97706548764744 76.8979718029818
+ endloop
+endfacet
+facet normal -0.7095151081069204 0.7046902062810276 -0.00015665129282861325
+ outer loop
+ vertex -163.63276316806784 -83.9761795503645 556.8998884532699
+ vertex -163.63225167193696 -83.97706548764744 76.8979718029818
+ vertex -163.7254965035554 -84.06954781624307 556.8998940523439
+ endloop
+endfacet
+facet normal -0.5057343969739034 0.8626892217760969 -0.00016232311816103822
+ outer loop
+ vertex -163.63225167193696 -83.97706548764744 76.8979718029818
+ vertex -163.63276316806784 -83.9761795503645 556.8998884532699
+ vertex -163.5740251988186 -83.94293137593381 76.89797173029733
+ endloop
+endfacet
+facet normal -0.5057343969739034 0.8626892217760969 -0.00016232311816103822
+ outer loop
+ vertex -163.57453669494947 -83.94204543865087 556.8998883805855
+ vertex -163.5740251988186 -83.94293137593381 76.89797173029733
+ vertex -163.63276316806784 -83.9761795503645 556.8998884532699
+ endloop
+endfacet
+facet normal -0.5000161012764235 0.8660160922952709 -0.00016232669040715017
+ outer loop
+ vertex -163.5740251988186 -83.94293137593381 76.89797173029733
+ vertex -163.57453669494947 -83.94204543865087 556.8998883805855
+ vertex -163.5185126628154 -83.91087982161369 76.89797173010376
+ endloop
+endfacet
+facet normal -0.5000161012764235 0.8660160922952709 -0.00016232669040715017
+ outer loop
+ vertex -163.51902415894628 -83.90999388433075 556.8998883803919
+ vertex -163.5185126628154 -83.91087982161369 76.89797173010376
+ vertex -163.57453669494947 -83.94204543865087 556.8998883805855
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -158.92589020484243 -82.99465143480991 345.0885715451641
+ vertex -158.8098982636669 -81.19561117211109 345.08854364502923
+ vertex -159.67597235843385 -81.69566076256861 345.08854364537524
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -158.8098982636669 -81.19561117211109 345.08854364502923
+ vertex -158.92589020484243 -82.99465143480991 345.0885715451641
+ vertex -158.05989642406146 -82.49459666616058 345.08857154398777
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -151.65723784913268 -99.5837909201942 345.0889063601591
+ vertex -153.6753957615697 -92.08758041013873 345.08876684284377
+ vertex -155.40785251969305 -93.08781478580067 345.0887668428438
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -153.6753957615697 -92.08758041013873 345.08876684284377
+ vertex -151.65723784913268 -99.5837909201942 345.0889063601591
+ vertex -152.80931236595043 -91.58754692853731 345.08876684284377
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -152.80931236595043 -91.58754692853731 345.08876684284377
+ vertex -151.65723784913268 -99.5837909201942 345.0889063601591
+ vertex -143.9545752403253 -93.9817526244653 345.08888775702303
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -143.9545752403253 -93.9817526244653 345.08888775702303
+ vertex -151.65723784913268 -99.5837909201942 345.0889063601591
+ vertex -144.3205752362527 -95.34778483588465 345.0889063572282
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -161.40800456756986 -82.6956929792934 345.08854364606714
+ vertex -157.82101014624894 -71.965350039894 345.0884041610287
+ vertex -165.1576727591289 -76.20135612420354 345.08840416395947
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -157.82101014624894 -71.965350039894 345.0884041610287
+ vertex -161.40800456756986 -82.6956929792934 345.08854364606714
+ vertex -156.45497793476625 -72.33135003558507 345.08842276054196
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -156.45497793476625 -72.33135003558507 345.08842276054196
+ vertex -161.40800456756986 -82.6956929792934 345.08854364606714
+ vertex -158.8098982636669 -81.19561117211109 345.08854364502923
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -156.45497793476625 -72.33135003558507 345.08842276054196
+ vertex -158.8098982636669 -81.19561117211109 345.08854364502923
+ vertex -157.45148242016688 -80.41190375226617 345.0885436542806
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -156.45497793476625 -72.33135003558507 345.08842276054196
+ vertex -157.45148242016688 -80.41190375226617 345.0885436542806
+ vertex -157.32424717414668 -80.3783537687353 345.0885442971379
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -156.45497793476625 -72.33135003558507 345.08842276054196
+ vertex -157.32424717414668 -80.3783537687353 345.0885442971379
+ vertex -157.19266398930486 -80.37887787804584 345.0885455292946
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -156.45497793476625 -72.33135003558507 345.08842276054196
+ vertex -157.19266398930486 -80.37887787804584 345.0885455292946
+ vertex -157.06570004223724 -80.41344036301373 345.0885472667812
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -156.45497793476625 -72.33135003558507 345.08842276054196
+ vertex -157.06570004223724 -80.41344036301373 345.0885472667812
+ vertex -156.95200771611871 -80.47968584740612 345.0885493911908
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -156.45497793476625 -72.33135003558507 345.08842276054196
+ vertex -156.95200771611871 -80.47968584740612 345.0885493911908
+ vertex -156.85933495508849 -80.57309981093738 345.0885517577485
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -156.45497793476625 -72.33135003558507 345.08842276054196
+ vertex -156.85933495508849 -80.57309981093738 345.0885517577485
+ vertex -143.9545752403253 -93.9817526244653 345.08888775702303
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -158.8098982636669 -81.19561117211109 345.08854364502923
+ vertex -161.40800456756986 -82.6956929792934 345.08854364606714
+ vertex -159.67597235843385 -81.69566076256861 345.08854364537524
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -143.9545752403253 -93.9817526244653 345.08888775702303
+ vertex -156.85933495508849 -80.57309981093738 345.0885517577485
+ vertex -151.2944267579757 -90.21138953509391 345.088758764098
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -143.9545752403253 -93.9817526244653 345.08888775702303
+ vertex -151.2944267579757 -90.21138953509391 345.088758764098
+ vertex -151.26031158549299 -90.33853944542804 345.0887611294912
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -143.9545752403253 -93.9817526244653 345.08888775702303
+ vertex -151.26031158549299 -90.33853944542804 345.0887611294912
+ vertex -151.26026767770531 -90.47018648399975 345.08876325046356
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -143.9545752403253 -93.9817526244653 345.08888775702303
+ vertex -151.26026767770531 -90.47018648399975 345.08876325046356
+ vertex -151.29429802685618 -90.59735912268734 345.0887649824743
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -143.9545752403253 -93.9817526244653 345.08888775702303
+ vertex -151.29429802685618 -90.59735912268734 345.0887649824743
+ vertex -151.3600835208879 -90.71139075632678 345.0887662074897
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -143.9545752403253 -93.9817526244653 345.08888775702303
+ vertex -151.3600835208879 -90.71139075632678 345.0887662074897
+ vertex -151.4531409870986 -90.80451031753248 345.0887668420271
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -143.9545752403253 -93.9817526244653 345.08888775702303
+ vertex -151.4531409870986 -90.80451031753248 345.0887668420271
+ vertex -152.80931236595043 -91.58754692853731 345.08876684284377
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -154.42538830107569 -90.78861102364228 345.08873894423124
+ vertex -152.80931236595043 -91.58754692853731 345.08876684284377
+ vertex -153.55939452029452 -90.28855625499315 345.0887389430549
+ endloop
+endfacet
+facet normal -9.299929623335791e-06 1.6107950615988392e-05 0.9999999998270227
+ outer loop
+ vertex -152.80931236595043 -91.58754692853731 345.08876684284377
+ vertex -154.42538830107569 -90.78861102364228 345.08873894423124
+ vertex -153.6753957615697 -92.08758041013873 345.08876684284377
+ endloop
+endfacet
+facet normal -0.8660161037050138 -0.5000161078641236 3.4595554199262024e-10
+ outer loop
+ vertex -165.15761230958637 -76.20146082588255 338.58840416508383
+ vertex -161.40795341795692 -82.69578157302179 339.5885436470185
+ vertex -165.157621609516 -76.20144471793193 339.58840416491086
+ endloop
+endfacet
+facet normal -0.8660161037050138 -0.5000161078641236 3.4595554199262024e-10
+ outer loop
+ vertex -161.40795341795692 -82.69578157302179 339.5885436470185
+ vertex -165.15761230958637 -76.20146082588255 338.58840416508383
+ vertex -161.4079441180273 -82.6957976809724 338.5885436471915
+ endloop
+endfacet
+facet normal -0.5000161077776379 0.8660161035552092 -1.8599859244801665e-05
+ outer loop
+ vertex -165.15761230958637 -76.20146082588255 338.58840416508383
+ vertex -157.820958996636 -71.9654386336224 339.58840416198
+ vertex -157.82094969670638 -71.96545474157301 338.588404162153
+ endloop
+endfacet
+facet normal -0.5000161077776379 0.8660161035552092 -1.8599859244801665e-05
+ outer loop
+ vertex -157.820958996636 -71.9654386336224 339.58840416198
+ vertex -165.15761230958637 -76.20146082588255 338.58840416508383
+ vertex -165.157621609516 -76.20144471793193 339.58840416491086
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262024e-10
+ outer loop
+ vertex -143.95452409071237 -93.98184121819368 339.5888877579744
+ vertex -156.45497793476625 -72.33135003558507 345.08842276054196
+ vertex -143.9545752403253 -93.9817526244653 345.08888775702303
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262024e-10
+ outer loop
+ vertex -156.45497793476625 -72.33135003558507 345.08842276054196
+ vertex -143.95452409071237 -93.98184121819368 339.5888877579744
+ vertex -156.45492678515333 -72.33143862931345 339.5884227614933
+ endloop
+endfacet
+facet normal 0.9659306400586332 -0.2588010788674356 1.3151841973605118e-05
+ outer loop
+ vertex -144.3205752362527 -95.34778483588465 345.0889063572282
+ vertex -143.95452409071237 -93.98184121819368 339.5888877579744
+ vertex -143.9545752403253 -93.9817526244653 345.08888775702303
+ endloop
+endfacet
+facet normal 0.9659306400586332 -0.2588010788674356 1.3151841973605118e-05
+ outer loop
+ vertex -143.95452409071237 -93.98184121819368 339.5888877579744
+ vertex -144.3205752362527 -95.34778483588465 345.0889063572282
+ vertex -144.3205240866398 -95.34787342961305 339.5889063581796
+ endloop
+endfacet
+facet normal 0.5000161077776379 -0.8660161035552092 1.8599859244801665e-05
+ outer loop
+ vertex -151.65723784913268 -99.5837909201942 345.0889063601591
+ vertex -144.3205240866398 -95.34787342961305 339.5889063581796
+ vertex -144.3205752362527 -95.34778483588465 345.0889063572282
+ endloop
+endfacet
+facet normal 0.5000161077776379 -0.8660161035552092 1.8599859244801665e-05
+ outer loop
+ vertex -144.3205240866398 -95.34787342961305 339.5889063581796
+ vertex -151.65723784913268 -99.5837909201942 345.0889063601591
+ vertex -151.65718669951977 -99.58387951392258 339.5889063611105
+ endloop
+endfacet
+facet normal 0.2588010790344744 0.9659306400138717 -1.3152331228624585e-05
+ outer loop
+ vertex -157.82094969670638 -71.96545474157301 338.588404162153
+ vertex -156.45492678515333 -72.33143862931345 339.5884227614933
+ vertex -156.4549174852237 -72.33145473726408 338.58842276166627
+ endloop
+endfacet
+facet normal 0.2588010790344744 0.9659306400138717 -1.3152331228624585e-05
+ outer loop
+ vertex -156.45492678515333 -72.33143862931345 339.5884227614933
+ vertex -157.82094969670638 -71.96545474157301 338.588404162153
+ vertex -157.820958996636 -71.9654386336224 339.58840416198
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -158.05983597451893 -82.49470136783958 338.5885715451121
+ vertex -159.6759119088913 -81.69576546424761 338.5885436464996
+ vertex -158.80983781412434 -81.19571587379009 338.5885436461536
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -159.6759119088913 -81.69576546424761 338.5885436464996
+ vertex -158.05983597451893 -82.49470136783958 338.5885715451121
+ vertex -158.92582975529984 -82.99475613648892 338.5885715462884
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -156.4549174852237 -72.33145473726408 338.58842276166627
+ vertex -165.15761230958637 -76.20146082588255 338.58840416508383
+ vertex -157.82094969670638 -71.96545474157301 338.588404162153
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -165.15761230958637 -76.20146082588255 338.58840416508383
+ vertex -156.4549174852237 -72.33145473726408 338.58842276166627
+ vertex -161.4079441180273 -82.6957976809724 338.5885436471915
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -161.4079441180273 -82.6957976809724 338.5885436471915
+ vertex -156.4549174852237 -72.33145473726408 338.58842276166627
+ vertex -158.80983781412434 -81.19571587379009 338.5885436461536
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -161.4079441180273 -82.6957976809724 338.5885436471915
+ vertex -158.80983781412434 -81.19571587379009 338.5885436461536
+ vertex -159.6759119088913 -81.69576546424761 338.5885436464996
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -152.80925191640787 -91.58765163021631 338.58876684396813
+ vertex -154.42532785153313 -90.78871572532128 338.5887389453556
+ vertex -153.55933407075196 -90.28866095667216 338.5887389441793
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -154.42532785153313 -90.78871572532128 338.5887389453556
+ vertex -152.80925191640787 -91.58765163021631 338.58876684396813
+ vertex -153.67533531202716 -92.08768511181773 338.58876684396813
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -156.4549174852237 -72.33145473726408 338.58842276166627
+ vertex -157.45142197062432 -80.41200845394518 338.588543655405
+ vertex -158.80983781412434 -81.19571587379009 338.5885436461536
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -157.45142197062432 -80.41200845394518 338.588543655405
+ vertex -156.4549174852237 -72.33145473726408 338.58842276166627
+ vertex -157.32418672460412 -80.37845847041429 338.58854429826226
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -157.32418672460412 -80.37845847041429 338.58854429826226
+ vertex -156.4549174852237 -72.33145473726408 338.58842276166627
+ vertex -157.1926035397623 -80.37898257972483 338.58854553041897
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -157.1926035397623 -80.37898257972483 338.58854553041897
+ vertex -156.4549174852237 -72.33145473726408 338.58842276166627
+ vertex -157.0656395926947 -80.41354506469274 338.58854726790554
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -157.0656395926947 -80.41354506469274 338.58854726790554
+ vertex -156.4549174852237 -72.33145473726408 338.58842276166627
+ vertex -156.95194726657616 -80.47979054908512 338.58854939231514
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -156.95194726657616 -80.47979054908512 338.58854939231514
+ vertex -156.4549174852237 -72.33145473726408 338.58842276166627
+ vertex -156.85927450554593 -80.57320451261637 338.5885517588728
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -156.85927450554593 -80.57320451261637 338.5885517588728
+ vertex -156.4549174852237 -72.33145473726408 338.58842276166627
+ vertex -143.95451479078275 -93.98185732614431 338.5888877581474
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -156.85927450554593 -80.57320451261637 338.5885517588728
+ vertex -143.95451479078275 -93.98185732614431 338.5888877581474
+ vertex -151.29436630843315 -90.21149423677292 338.5887587652224
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -151.29436630843315 -90.21149423677292 338.5887587652224
+ vertex -143.95451479078275 -93.98185732614431 338.5888877581474
+ vertex -151.26025113595045 -90.33864414710705 338.5887611306155
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -151.26025113595045 -90.33864414710705 338.5887611306155
+ vertex -143.95451479078275 -93.98185732614431 338.5888877581474
+ vertex -151.26020722816278 -90.47029118567876 338.5887632515879
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -151.26020722816278 -90.47029118567876 338.5887632515879
+ vertex -143.95451479078275 -93.98185732614431 338.5888877581474
+ vertex -151.29423757731362 -90.59746382436634 338.58876498359865
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -151.29423757731362 -90.59746382436634 338.58876498359865
+ vertex -143.95451479078275 -93.98185732614431 338.5888877581474
+ vertex -151.36002307134538 -90.71149545800579 338.58876620861406
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -151.36002307134538 -90.71149545800579 338.58876620861406
+ vertex -143.95451479078275 -93.98185732614431 338.5888877581474
+ vertex -151.45308053755608 -90.80461501921148 338.58876684315146
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -151.45308053755608 -90.80461501921148 338.58876684315146
+ vertex -143.95451479078275 -93.98185732614431 338.5888877581474
+ vertex -152.80925191640787 -91.58765163021631 338.58876684396813
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -153.67533531202716 -92.08768511181773 338.58876684396813
+ vertex -151.65717739959013 -99.58389562187321 338.5889063612834
+ vertex -155.4077920701505 -93.08791948747968 338.58876684396813
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -151.65717739959013 -99.58389562187321 338.5889063612834
+ vertex -153.67533531202716 -92.08768511181773 338.58876684396813
+ vertex -152.80925191640787 -91.58765163021631 338.58876684396813
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -151.65717739959013 -99.58389562187321 338.5889063612834
+ vertex -152.80925191640787 -91.58765163021631 338.58876684396813
+ vertex -143.95451479078275 -93.98185732614431 338.5888877581474
+ endloop
+endfacet
+facet normal 9.2999296232569e-06 -1.6107950616031896e-05 -0.9999999998270227
+ outer loop
+ vertex -151.65717739959013 -99.58389562187321 338.5889063612834
+ vertex -143.95451479078275 -93.98185732614431 338.5888877581474
+ vertex -144.32051478671016 -95.34788953756366 338.5889063583526
+ endloop
+endfacet
+facet normal 0.5000161077776379 -0.8660161035552092 1.8599859244801665e-05
+ outer loop
+ vertex -151.65718669951977 -99.58387951392258 339.5889063611105
+ vertex -144.32051478671016 -95.34788953756366 338.5889063583526
+ vertex -144.3205240866398 -95.34787342961305 339.5889063581796
+ endloop
+endfacet
+facet normal 0.5000161077776379 -0.8660161035552092 1.8599859244801665e-05
+ outer loop
+ vertex -144.32051478671016 -95.34788953756366 338.5889063583526
+ vertex -151.65718669951977 -99.58387951392258 339.5889063611105
+ vertex -151.65717739959013 -99.58389562187321 338.5889063612834
+ endloop
+endfacet
+facet normal 0.9659306400586332 -0.2588010788674356 1.3151841973605118e-05
+ outer loop
+ vertex -144.3205240866398 -95.34787342961305 339.5889063581796
+ vertex -143.95451479078275 -93.98185732614431 338.5888877581474
+ vertex -143.95452409071237 -93.98184121819368 339.5888877579744
+ endloop
+endfacet
+facet normal 0.9659306400586332 -0.2588010788674356 1.3151841973605118e-05
+ outer loop
+ vertex -143.95451479078275 -93.98185732614431 338.5888877581474
+ vertex -144.3205240866398 -95.34787342961305 339.5889063581796
+ vertex -144.32051478671016 -95.34788953756366 338.5889063583526
+ endloop
+endfacet
+facet normal -0.5000161077776379 0.8660161035552092 -1.8599859244801665e-05
+ outer loop
+ vertex -165.157621609516 -76.20144471793193 339.58840416491086
+ vertex -157.82101014624894 -71.965350039894 345.0884041610287
+ vertex -157.820958996636 -71.9654386336224 339.58840416198
+ endloop
+endfacet
+facet normal -0.5000161077776379 0.8660161035552092 -1.8599859244801665e-05
+ outer loop
+ vertex -157.82101014624894 -71.965350039894 345.0884041610287
+ vertex -165.157621609516 -76.20144471793193 339.58840416491086
+ vertex -165.1576727591289 -76.20135612420354 345.08840416395947
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262024e-10
+ outer loop
+ vertex -143.95451479078275 -93.98185732614431 338.5888877581474
+ vertex -156.45492678515333 -72.33143862931345 339.5884227614933
+ vertex -143.95452409071237 -93.98184121819368 339.5888877579744
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262024e-10
+ outer loop
+ vertex -156.45492678515333 -72.33143862931345 339.5884227614933
+ vertex -143.95451479078275 -93.98185732614431 338.5888877581474
+ vertex -156.4549174852237 -72.33145473726408 338.58842276166627
+ endloop
+endfacet
+facet normal 0.2588010790344744 0.9659306400138717 -1.3152331228624585e-05
+ outer loop
+ vertex -157.820958996636 -71.9654386336224 339.58840416198
+ vertex -156.45497793476625 -72.33135003558507 345.08842276054196
+ vertex -156.45492678515333 -72.33143862931345 339.5884227614933
+ endloop
+endfacet
+facet normal 0.2588010790344744 0.9659306400138717 -1.3152331228624585e-05
+ outer loop
+ vertex -156.45497793476625 -72.33135003558507 345.08842276054196
+ vertex -157.820958996636 -71.9654386336224 339.58840416198
+ vertex -157.82101014624894 -71.965350039894 345.0884041610287
+ endloop
+endfacet
+facet normal -0.5000242815412254 0.8660113841764592 -1.859985924070794e-05
+ outer loop
+ vertex -152.8092612163375 -91.5876355222657 339.58876684379516
+ vertex -151.4531409870986 -90.80451031753248 345.0887668420271
+ vertex -151.4530898374857 -90.80459891126087 339.5887668429785
+ endloop
+endfacet
+facet normal -0.5000242815412254 0.8660113841764592 -1.859985924070794e-05
+ outer loop
+ vertex -151.4531409870986 -90.80451031753248 345.0887668420271
+ vertex -152.8092612163375 -91.5876355222657 339.58876684379516
+ vertex -152.80931236595043 -91.58754692853731 345.08876684284377
+ endloop
+endfacet
+facet normal -0.7073425807271966 0.7068709027591015 -1.7964477816981825e-05
+ outer loop
+ vertex -151.4530898374857 -90.80459891126087 339.5887668429785
+ vertex -151.3600835208879 -90.71139075632678 345.0887662074897
+ vertex -151.3600323712749 -90.71147935005517 339.5887662084411
+ endloop
+endfacet
+facet normal -0.7073425807271966 0.7068709027591015 -1.7964477816981825e-05
+ outer loop
+ vertex -151.3600835208879 -90.71139075632678 345.0887662074897
+ vertex -151.4530898374857 -90.80459891126087 339.5887668429785
+ vertex -151.4531409870986 -90.80451031753248 345.0887668420271
+ endloop
+endfacet
+facet normal -0.8661921188638244 0.49971112951267393 -1.6104847944957377e-05
+ outer loop
+ vertex -151.3600323712749 -90.71147935005517 339.5887662084411
+ vertex -151.29429802685618 -90.59735912268734 345.0887649824743
+ vertex -151.29424687724313 -90.59744771641572 339.5887649834256
+ endloop
+endfacet
+facet normal -0.8661921188638244 0.49971112951267393 -1.6104847944957377e-05
+ outer loop
+ vertex -151.29429802685618 -90.59735912268734 345.0887649824743
+ vertex -151.3600323712749 -90.71147935005517 339.5887662084411
+ vertex -151.3600835208879 -90.71139075632678 345.0887662074897
+ endloop
+endfacet
+facet normal -0.9660120955503078 0.2584968686031633 -1.3147699300030635e-05
+ outer loop
+ vertex -151.2602165280924 -90.47027507772815 339.5887632514149
+ vertex -151.29429802685618 -90.59735912268734 345.0887649824743
+ vertex -151.26026767770531 -90.47018648399975 345.08876325046356
+ endloop
+endfacet
+facet normal -0.9660120955503078 0.2584968686031633 -1.3147699300030635e-05
+ outer loop
+ vertex -151.29429802685618 -90.59735912268734 345.0887649824743
+ vertex -151.2602165280924 -90.47027507772815 339.5887632514149
+ vertex -151.29424687724313 -90.59744771641572 339.5887649834256
+ endloop
+endfacet
+facet normal -0.9999999443367676 -0.00033352671979508525 -9.29455667534782e-06
+ outer loop
+ vertex -151.26026043588007 -90.33862803915643 339.5887611304426
+ vertex -151.26026767770531 -90.47018648399975 345.08876325046356
+ vertex -151.26031158549299 -90.33853944542804 345.0887611294912
+ endloop
+endfacet
+facet normal -0.9999999443367676 -0.00033352671979508525 -9.29455667534782e-06
+ outer loop
+ vertex -151.26026767770531 -90.47018648399975 345.08876325046356
+ vertex -151.26026043588007 -90.33862803915643 339.5887611304426
+ vertex -151.2602165280924 -90.47027507772815 339.5887632514149
+ endloop
+endfacet
+facet normal -0.9658394494942373 -0.2591411927454837 -4.808005373256881e-06
+ outer loop
+ vertex -151.29437560836277 -90.21147812882229 339.58875876504936
+ vertex -151.26031158549299 -90.33853944542804 345.0887611294912
+ vertex -151.2944267579757 -90.21138953509391 345.088758764098
+ endloop
+endfacet
+facet normal -0.9658394494942373 -0.2591411927454837 -4.808005373256881e-06
+ outer loop
+ vertex -151.26031158549299 -90.33853944542804 345.0887611294912
+ vertex -151.29437560836277 -90.21147812882229 339.58875876504936
+ vertex -151.26026043588007 -90.33862803915643 339.5887611304426
+ endloop
+endfacet
+facet normal -0.8660161037050097 -0.5000161078641306 3.4595554214343005e-10
+ outer loop
+ vertex -156.85928380547557 -80.57318840466576 339.58855175869985
+ vertex -151.2944267579757 -90.21138953509391 345.088758764098
+ vertex -156.85933495508849 -80.57309981093738 345.0885517577485
+ endloop
+endfacet
+facet normal -0.8660161037050097 -0.5000161078641306 3.4595554214343005e-10
+ outer loop
+ vertex -151.2944267579757 -90.21138953509391 345.088758764098
+ vertex -156.85928380547557 -80.57318840466576 339.58855175869985
+ vertex -151.29437560836277 -90.21147812882229 339.58875876504936
+ endloop
+endfacet
+facet normal -0.709917628601995 -0.7042847155644013 4.742399434363147e-06
+ outer loop
+ vertex -156.95200771611871 -80.47968584740612 345.0885493911908
+ vertex -156.85928380547557 -80.57318840466576 339.58855175869985
+ vertex -156.85933495508849 -80.57309981093738 345.0885517577485
+ endloop
+endfacet
+facet normal -0.709917628601995 -0.7042847155644013 4.742399434363147e-06
+ outer loop
+ vertex -156.85928380547557 -80.57318840466576 339.58855175869985
+ vertex -156.95200771611871 -80.47968584740612 345.0885493911908
+ vertex -156.9519565665058 -80.47977444113447 339.58854939214217
+ endloop
+endfacet
+facet normal -0.5034454744536385 -0.8640269985173223 9.235696742989533e-06
+ outer loop
+ vertex -157.06564889262432 -80.41352895674213 339.58854726773257
+ vertex -156.95200771611871 -80.47968584740612 345.0885493911908
+ vertex -157.06570004223724 -80.41344036301373 345.0885472667812
+ endloop
+endfacet
+facet normal -0.5034454744536385 -0.8640269985173223 9.235696742989533e-06
+ outer loop
+ vertex -156.95200771611871 -80.47968584740612 345.0885493911908
+ vertex -157.06564889262432 -80.41352895674213 339.58854726773257
+ vertex -156.9519565665058 -80.47977444113447 339.58854939214217
+ endloop
+endfacet
+facet normal -0.262664343202477 -0.9648872693938976 1.3099596581315967e-05
+ outer loop
+ vertex -157.19261283969195 -80.37896647177418 339.588545530246
+ vertex -157.06570004223724 -80.41344036301373 345.0885472667812
+ vertex -157.19266398930486 -80.37887787804584 345.0885455292946
+ endloop
+endfacet
+facet normal -0.262664343202477 -0.9648872693938976 1.3099596581315967e-05
+ outer loop
+ vertex -157.06570004223724 -80.41344036301373 345.0885472667812
+ vertex -157.19261283969195 -80.37896647177418 339.588545530246
+ vertex -157.06564889262432 -80.41352895674213 339.58854726773257
+ endloop
+endfacet
+facet normal -0.003983071039348085 -0.9999920674119498 1.6070780560681015e-05
+ outer loop
+ vertex -157.32424717414668 -80.3783537687353 345.0885442971379
+ vertex -157.19261283969195 -80.37896647177418 339.588545530246
+ vertex -157.19266398930486 -80.37887787804584 345.0885455292946
+ endloop
+endfacet
+facet normal -0.003983071039348085 -0.9999920674119498 1.6070780560681015e-05
+ outer loop
+ vertex -157.19261283969195 -80.37896647177418 339.588545530246
+ vertex -157.32424717414668 -80.3783537687353 345.0885442971379
+ vertex -157.32419602453373 -80.37844236246367 339.5885442980893
+ endloop
+endfacet
+facet normal 0.254969640838129 -0.9669490586007048 1.7946767403102802e-05
+ outer loop
+ vertex -157.45148242016688 -80.41190375226617 345.0885436542806
+ vertex -157.32419602453373 -80.37844236246367 339.5885442980893
+ vertex -157.32424717414668 -80.3783537687353 345.0885442971379
+ endloop
+endfacet
+facet normal 0.254969640838129 -0.9669490586007048 1.7946767403102802e-05
+ outer loop
+ vertex -157.32419602453373 -80.37844236246367 339.5885442980893
+ vertex -157.45148242016688 -80.41190375226617 345.0885436542806
+ vertex -157.45143127055394 -80.41199234599456 339.58854365523194
+ endloop
+endfacet
+facet normal 0.499725310301553 -0.8661839376818655 1.8599858312563285e-05
+ outer loop
+ vertex -158.8098982636669 -81.19561117211109 345.08854364502923
+ vertex -157.45143127055394 -80.41199234599456 339.58854365523194
+ vertex -157.45148242016688 -80.41190375226617 345.0885436542806
+ endloop
+endfacet
+facet normal 0.499725310301553 -0.8661839376818655 1.8599858312563285e-05
+ outer loop
+ vertex -157.45143127055394 -80.41199234599456 339.58854365523194
+ vertex -158.8098982636669 -81.19561117211109 345.08854364502923
+ vertex -158.80984711405395 -81.19569976583948 339.5885436459806
+ endloop
+endfacet
+facet normal 0.8660161037049837 0.5000161078641757 -3.459555431116078e-10
+ outer loop
+ vertex -158.05984527444852 -82.49468525988897 339.58857154493916
+ vertex -158.8098982636669 -81.19561117211109 345.08854364502923
+ vertex -158.05989642406146 -82.49459666616058 345.08857154398777
+ endloop
+endfacet
+facet normal 0.8660161037049837 0.5000161078641757 -3.459555431116078e-10
+ outer loop
+ vertex -158.8098982636669 -81.19561117211109 345.08854364502923
+ vertex -158.05984527444852 -82.49468525988897 339.58857154493916
+ vertex -158.80984711405395 -81.19569976583948 339.5885436459806
+ endloop
+endfacet
+facet normal 0.5000547685627937 -0.8659937806310484 1.859985921082281e-05
+ outer loop
+ vertex -158.92589020484243 -82.99465143480991 345.0885715451641
+ vertex -158.05984527444852 -82.49468525988897 339.58857154493916
+ vertex -158.05989642406146 -82.49459666616058 345.08857154398777
+ endloop
+endfacet
+facet normal 0.5000547685627937 -0.8659937806310484 1.859985921082281e-05
+ outer loop
+ vertex -158.05984527444852 -82.49468525988897 339.58857154493916
+ vertex -158.92589020484243 -82.99465143480991 345.0885715451641
+ vertex -158.9258390552295 -82.99474002853829 339.5885715461155
+ endloop
+endfacet
+facet normal -0.8659937807809691 -0.5000547686490778 1.17630317955688e-09
+ outer loop
+ vertex -159.6759212088209 -81.695749356297 339.5885436463266
+ vertex -158.92589020484243 -82.99465143480991 345.0885715451641
+ vertex -159.67597235843385 -81.69566076256861 345.08854364537524
+ endloop
+endfacet
+facet normal -0.8659937807809691 -0.5000547686490778 1.17630317955688e-09
+ outer loop
+ vertex -158.92589020484243 -82.99465143480991 345.0885715451641
+ vertex -159.6759212088209 -81.695749356297 339.5885436463266
+ vertex -158.9258390552295 -82.99474002853829 339.5885715461155
+ endloop
+endfacet
+facet normal 0.5000161077776379 -0.8660161035552092 1.8599859244801665e-05
+ outer loop
+ vertex -161.40800456756986 -82.6956929792934 345.08854364606714
+ vertex -159.6759212088209 -81.695749356297 339.5885436463266
+ vertex -159.67597235843385 -81.69566076256861 345.08854364537524
+ endloop
+endfacet
+facet normal 0.5000161077776379 -0.8660161035552092 1.8599859244801665e-05
+ outer loop
+ vertex -159.6759212088209 -81.695749356297 339.5885436463266
+ vertex -161.40800456756986 -82.6956929792934 345.08854364606714
+ vertex -161.40795341795692 -82.69578157302179 339.5885436470185
+ endloop
+endfacet
+facet normal -0.5000040269107857 0.8660230786688647 -1.6908566647105924e-05
+ outer loop
+ vertex -155.40780137008014 -93.08790337952905 339.58876684379516
+ vertex -153.6753957615697 -92.08758041013873 345.08876684284377
+ vertex -153.67535391436576 -92.08765289231421 339.58876684344915
+ endloop
+endfacet
+facet normal -0.5000040269107857 0.8660230786688647 -1.6908566647105924e-05
+ outer loop
+ vertex -153.6753957615697 -92.08758041013873 345.08876684284377
+ vertex -155.40780137008014 -93.08790337952905 339.58876684379516
+ vertex -155.40785251969305 -93.08781478580067 345.0887668428438
+ endloop
+endfacet
+facet normal -0.8660161037049536 -0.5000161078642279 3.459555440271332e-10
+ outer loop
+ vertex -154.42533715146274 -90.78869961737067 339.5887389451826
+ vertex -153.6753957615697 -92.08758041013873 345.08876684284377
+ vertex -154.42538830107569 -90.78861102364228 345.08873894423124
+ endloop
+endfacet
+facet normal -0.8660161037049536 -0.5000161078642279 3.459555440271332e-10
+ outer loop
+ vertex -153.6753957615697 -92.08758041013873 345.08876684284377
+ vertex -154.42533715146274 -90.78869961737067 339.5887389451826
+ vertex -153.67535391436576 -92.08765289231421 339.58876684344915
+ endloop
+endfacet
+facet normal -0.5000547685625593 0.8659937806311837 -1.859985921082281e-05
+ outer loop
+ vertex -154.42533715146274 -90.78869961737067 339.5887389451826
+ vertex -153.55939452029452 -90.28855625499315 345.0887389430549
+ vertex -153.55934337068157 -90.28864484872153 339.5887389440063
+ endloop
+endfacet
+facet normal -0.5000547685625593 0.8659937806311837 -1.859985921082281e-05
+ outer loop
+ vertex -153.55939452029452 -90.28855625499315 345.0887389430549
+ vertex -154.42533715146274 -90.78869961737067 339.5887389451826
+ vertex -154.42538830107569 -90.78861102364228 345.08873894423124
+ endloop
+endfacet
+facet normal 0.8659937807808712 0.5000547686492475 -1.1763031831993657e-09
+ outer loop
+ vertex -152.8092612163375 -91.5876355222657 339.58876684379516
+ vertex -153.55939452029452 -90.28855625499315 345.0887389430549
+ vertex -152.80931236595043 -91.58754692853731 345.08876684284377
+ endloop
+endfacet
+facet normal 0.8659937807808712 0.5000547686492475 -1.1763031831993657e-09
+ outer loop
+ vertex -153.55939452029452 -90.28855625499315 345.0887389430549
+ vertex -152.8092612163375 -91.5876355222657 339.58876684379516
+ vertex -153.55934337068157 -90.28864484872153 339.5887389440063
+ endloop
+endfacet
+facet normal -0.8660161037050258 -0.5000161078641028 3.459555415450975e-10
+ outer loop
+ vertex -155.4077920701505 -93.08791948747968 338.58876684396813
+ vertex -151.65718669951977 -99.58387951392258 339.5889063611105
+ vertex -155.40780137008014 -93.08790337952905 339.58876684379516
+ endloop
+endfacet
+facet normal -0.8660161037050258 -0.5000161078641028 3.459555415450975e-10
+ outer loop
+ vertex -151.65718669951977 -99.58387951392258 339.5889063611105
+ vertex -155.4077920701505 -93.08791948747968 338.58876684396813
+ vertex -151.65717739959013 -99.58389562187321 338.5889063612834
+ endloop
+endfacet
+facet normal -0.8660161037050138 -0.5000161078641236 3.4595554199262024e-10
+ outer loop
+ vertex -165.157621609516 -76.20144471793193 339.58840416491086
+ vertex -161.40800456756986 -82.6956929792934 345.08854364606714
+ vertex -165.1576727591289 -76.20135612420354 345.08840416395947
+ endloop
+endfacet
+facet normal -0.8660161037050138 -0.5000161078641236 3.4595554199262024e-10
+ outer loop
+ vertex -161.40800456756986 -82.6956929792934 345.08854364606714
+ vertex -165.157621609516 -76.20144471793193 339.58840416491086
+ vertex -161.40795341795692 -82.69578157302179 339.5885436470185
+ endloop
+endfacet
+facet normal -0.8660161037050258 -0.5000161078641028 3.459555415450975e-10
+ outer loop
+ vertex -155.40780137008014 -93.08790337952905 339.58876684379516
+ vertex -151.65723784913268 -99.5837909201942 345.0889063601591
+ vertex -155.40785251969305 -93.08781478580067 345.0887668428438
+ endloop
+endfacet
+facet normal -0.8660161037050258 -0.5000161078641028 3.459555415450975e-10
+ outer loop
+ vertex -151.65723784913268 -99.5837909201942 345.0889063601591
+ vertex -155.40780137008014 -93.08790337952905 339.58876684379516
+ vertex -151.65718669951977 -99.58387951392258 339.5889063611105
+ endloop
+endfacet
+facet normal -0.5000040267876305 0.8660230784555542 -2.7901968550393912e-05
+ outer loop
+ vertex -155.4077920701505 -93.08791948747968 338.58876684396813
+ vertex -153.67535391436576 -92.08765289231421 339.58876684344915
+ vertex -153.67533531202716 -92.08768511181773 338.58876684396813
+ endloop
+endfacet
+facet normal -0.5000040267876305 0.8660230784555542 -2.7901968550393912e-05
+ outer loop
+ vertex -153.67535391436576 -92.08765289231421 339.58876684344915
+ vertex -155.4077920701505 -93.08791948747968 338.58876684396813
+ vertex -155.40780137008014 -93.08790337952905 339.58876684379516
+ endloop
+endfacet
+facet normal -0.5000547685625593 0.8659937806311837 -1.859985921082281e-05
+ outer loop
+ vertex -154.42532785153313 -90.78871572532128 338.5887389453556
+ vertex -153.55934337068157 -90.28864484872153 339.5887389440063
+ vertex -153.55933407075196 -90.28866095667216 338.5887389441793
+ endloop
+endfacet
+facet normal -0.5000547685625593 0.8659937806311837 -1.859985921082281e-05
+ outer loop
+ vertex -153.55934337068157 -90.28864484872153 339.5887389440063
+ vertex -154.42532785153313 -90.78871572532128 338.5887389453556
+ vertex -154.42533715146274 -90.78869961737067 339.5887389451826
+ endloop
+endfacet
+facet normal -0.5000242815412254 0.8660113841764592 -1.859985924070794e-05
+ outer loop
+ vertex -152.80925191640787 -91.58765163021631 338.58876684396813
+ vertex -151.4530898374857 -90.80459891126087 339.5887668429785
+ vertex -151.45308053755608 -90.80461501921148 338.58876684315146
+ endloop
+endfacet
+facet normal -0.5000242815412254 0.8660113841764592 -1.859985924070794e-05
+ outer loop
+ vertex -151.4530898374857 -90.80459891126087 339.5887668429785
+ vertex -152.80925191640787 -91.58765163021631 338.58876684396813
+ vertex -152.8092612163375 -91.5876355222657 339.58876684379516
+ endloop
+endfacet
+facet normal -0.8660161037049536 -0.5000161078642279 3.4595554534990755e-10
+ outer loop
+ vertex -154.42532785153313 -90.78871572532128 338.5887389453556
+ vertex -153.67535391436576 -92.08765289231421 339.58876684344915
+ vertex -154.42533715146274 -90.78869961737067 339.5887389451826
+ endloop
+endfacet
+facet normal -0.8660161037049536 -0.5000161078642279 3.4595554534990755e-10
+ outer loop
+ vertex -153.67535391436576 -92.08765289231421 339.58876684344915
+ vertex -154.42532785153313 -90.78871572532128 338.5887389453556
+ vertex -153.67533531202716 -92.08768511181773 338.58876684396813
+ endloop
+endfacet
+facet normal 0.8659937807808712 0.5000547686492475 -1.1763031831997787e-09
+ outer loop
+ vertex -152.80925191640787 -91.58765163021631 338.58876684396813
+ vertex -153.55934337068157 -90.28864484872153 339.5887389440063
+ vertex -152.8092612163375 -91.5876355222657 339.58876684379516
+ endloop
+endfacet
+facet normal 0.8659937807808712 0.5000547686492475 -1.1763031831997787e-09
+ outer loop
+ vertex -153.55934337068157 -90.28864484872153 339.5887389440063
+ vertex -152.80925191640787 -91.58765163021631 338.58876684396813
+ vertex -153.55933407075196 -90.28866095667216 338.5887389441793
+ endloop
+endfacet
+facet normal -0.7073425807270168 0.7068709027592814 -1.7964477783502214e-05
+ outer loop
+ vertex -151.36002307134538 -90.71149545800579 338.58876620861406
+ vertex -151.4530898374857 -90.80459891126087 339.5887668429785
+ vertex -151.3600323712749 -90.71147935005517 339.5887662084411
+ endloop
+endfacet
+facet normal -0.7073425807270168 0.7068709027592814 -1.7964477783502214e-05
+ outer loop
+ vertex -151.4530898374857 -90.80459891126087 339.5887668429785
+ vertex -151.36002307134538 -90.71149545800579 338.58876620861406
+ vertex -151.45308053755608 -90.80461501921148 338.58876684315146
+ endloop
+endfacet
+facet normal -0.8661921188638244 0.49971112951267393 -1.6104847860747126e-05
+ outer loop
+ vertex -151.29423757731362 -90.59746382436634 338.58876498359865
+ vertex -151.3600323712749 -90.71147935005517 339.5887662084411
+ vertex -151.29424687724313 -90.59744771641572 339.5887649834256
+ endloop
+endfacet
+facet normal -0.8661921188638244 0.49971112951267393 -1.6104847860747126e-05
+ outer loop
+ vertex -151.3600323712749 -90.71147935005517 339.5887662084411
+ vertex -151.29423757731362 -90.59746382436634 338.58876498359865
+ vertex -151.36002307134538 -90.71149545800579 338.58876620861406
+ endloop
+endfacet
+facet normal -0.9660120955504019 0.25849686860281185 -1.314769925216424e-05
+ outer loop
+ vertex -151.26020722816278 -90.47029118567876 338.5887632515879
+ vertex -151.29424687724313 -90.59744771641572 339.5887649834256
+ vertex -151.2602165280924 -90.47027507772815 339.5887632514149
+ endloop
+endfacet
+facet normal -0.9660120955504019 0.25849686860281185 -1.314769925216424e-05
+ outer loop
+ vertex -151.29424687724313 -90.59744771641572 339.5887649834256
+ vertex -151.26020722816278 -90.47029118567876 338.5887632515879
+ vertex -151.29423757731362 -90.59746382436634 338.58876498359865
+ endloop
+endfacet
+facet normal -0.9999999443367676 -0.00033352671979519616 -9.294556675347818e-06
+ outer loop
+ vertex -151.26025113595045 -90.33864414710705 338.5887611306155
+ vertex -151.2602165280924 -90.47027507772815 339.5887632514149
+ vertex -151.26026043588007 -90.33862803915643 339.5887611304426
+ endloop
+endfacet
+facet normal -0.9999999443367676 -0.00033352671979519616 -9.294556675347818e-06
+ outer loop
+ vertex -151.2602165280924 -90.47027507772815 339.5887632514149
+ vertex -151.26025113595045 -90.33864414710705 338.5887611306155
+ vertex -151.26020722816278 -90.47029118567876 338.5887632515879
+ endloop
+endfacet
+facet normal -0.9658394494942373 -0.25914119274548375 -4.80800537325688e-06
+ outer loop
+ vertex -151.29436630843315 -90.21149423677292 338.5887587652224
+ vertex -151.26026043588007 -90.33862803915643 339.5887611304426
+ vertex -151.29437560836277 -90.21147812882229 339.58875876504936
+ endloop
+endfacet
+facet normal -0.9658394494942373 -0.25914119274548375 -4.80800537325688e-06
+ outer loop
+ vertex -151.26026043588007 -90.33862803915643 339.5887611304426
+ vertex -151.29436630843315 -90.21149423677292 338.5887587652224
+ vertex -151.26025113595045 -90.33864414710705 338.5887611306155
+ endloop
+endfacet
+facet normal -0.8660161037050097 -0.5000161078641306 3.4595554214343005e-10
+ outer loop
+ vertex -156.85927450554593 -80.57320451261637 338.5885517588728
+ vertex -151.29437560836277 -90.21147812882229 339.58875876504936
+ vertex -156.85928380547557 -80.57318840466576 339.58855175869985
+ endloop
+endfacet
+facet normal -0.8660161037050097 -0.5000161078641306 3.4595554214343005e-10
+ outer loop
+ vertex -151.29437560836277 -90.21147812882229 339.58875876504936
+ vertex -156.85927450554593 -80.57320451261637 338.5885517588728
+ vertex -151.29436630843315 -90.21149423677292 338.5887587652224
+ endloop
+endfacet
+facet normal -0.7099176286020258 -0.7042847155643703 4.74239944011369e-06
+ outer loop
+ vertex -156.95194726657616 -80.47979054908512 338.58854939231514
+ vertex -156.85928380547557 -80.57318840466576 339.58855175869985
+ vertex -156.9519565665058 -80.47977444113447 339.58854939214217
+ endloop
+endfacet
+facet normal -0.7099176286020258 -0.7042847155643703 4.74239944011369e-06
+ outer loop
+ vertex -156.85928380547557 -80.57318840466576 339.58855175869985
+ vertex -156.95194726657616 -80.47979054908512 338.58854939231514
+ vertex -156.85927450554593 -80.57320451261637 338.5885517588728
+ endloop
+endfacet
+facet normal -0.503445474453565 -0.8640269985173652 9.235696754194322e-06
+ outer loop
+ vertex -157.0656395926947 -80.41354506469274 338.58854726790554
+ vertex -156.9519565665058 -80.47977444113447 339.58854939214217
+ vertex -157.06564889262432 -80.41352895674213 339.58854726773257
+ endloop
+endfacet
+facet normal -0.503445474453565 -0.8640269985173652 9.235696754194322e-06
+ outer loop
+ vertex -156.9519565665058 -80.47977444113447 339.58854939214217
+ vertex -157.0656395926947 -80.41354506469274 338.58854726790554
+ vertex -156.95194726657616 -80.47979054908512 338.58854939231514
+ endloop
+endfacet
+facet normal -0.2626643432025935 -0.964887269393866 1.3099596597201584e-05
+ outer loop
+ vertex -157.1926035397623 -80.37898257972483 338.58854553041897
+ vertex -157.06564889262432 -80.41352895674213 339.58854726773257
+ vertex -157.19261283969195 -80.37896647177418 339.588545530246
+ endloop
+endfacet
+facet normal -0.2626643432025935 -0.964887269393866 1.3099596597201584e-05
+ outer loop
+ vertex -157.06564889262432 -80.41352895674213 339.58854726773257
+ vertex -157.1926035397623 -80.37898257972483 338.58854553041897
+ vertex -157.0656395926947 -80.41354506469274 338.58854726790554
+ endloop
+endfacet
+facet normal -0.00398307103919987 -0.9999920674119505 1.607078058017511e-05
+ outer loop
+ vertex -157.32419602453373 -80.37844236246367 339.5885442980893
+ vertex -157.1926035397623 -80.37898257972483 338.58854553041897
+ vertex -157.19261283969195 -80.37896647177418 339.588545530246
+ endloop
+endfacet
+facet normal -0.00398307103919987 -0.9999920674119505 1.607078058017511e-05
+ outer loop
+ vertex -157.1926035397623 -80.37898257972483 338.58854553041897
+ vertex -157.32419602453373 -80.37844236246367 339.5885442980893
+ vertex -157.32418672460412 -80.37845847041429 338.58854429826226
+ endloop
+endfacet
+facet normal 0.25496964083812906 -0.9669490586007048 1.7946767403102802e-05
+ outer loop
+ vertex -157.45143127055394 -80.41199234599456 339.58854365523194
+ vertex -157.32418672460412 -80.37845847041429 338.58854429826226
+ vertex -157.32419602453373 -80.37844236246367 339.5885442980893
+ endloop
+endfacet
+facet normal 0.25496964083812906 -0.9669490586007048 1.7946767403102802e-05
+ outer loop
+ vertex -157.32418672460412 -80.37845847041429 338.58854429826226
+ vertex -157.45143127055394 -80.41199234599456 339.58854365523194
+ vertex -157.45142197062432 -80.41200845394518 338.588543655405
+ endloop
+endfacet
+facet normal 0.499725310301553 -0.8661839376818655 1.859985831256329e-05
+ outer loop
+ vertex -158.80984711405395 -81.19569976583948 339.5885436459806
+ vertex -157.45142197062432 -80.41200845394518 338.588543655405
+ vertex -157.45143127055394 -80.41199234599456 339.58854365523194
+ endloop
+endfacet
+facet normal 0.499725310301553 -0.8661839376818655 1.859985831256329e-05
+ outer loop
+ vertex -157.45142197062432 -80.41200845394518 338.588543655405
+ vertex -158.80984711405395 -81.19569976583948 339.5885436459806
+ vertex -158.80983781412434 -81.19571587379009 338.5885436461536
+ endloop
+endfacet
+facet normal 0.8660161037049837 0.5000161078641757 -3.459555431116078e-10
+ outer loop
+ vertex -158.05983597451893 -82.49470136783958 338.5885715451121
+ vertex -158.80984711405395 -81.19569976583948 339.5885436459806
+ vertex -158.05984527444852 -82.49468525988897 339.58857154493916
+ endloop
+endfacet
+facet normal 0.8660161037049837 0.5000161078641757 -3.459555431116078e-10
+ outer loop
+ vertex -158.80984711405395 -81.19569976583948 339.5885436459806
+ vertex -158.05983597451893 -82.49470136783958 338.5885715451121
+ vertex -158.80983781412434 -81.19571587379009 338.5885436461536
+ endloop
+endfacet
+facet normal 0.5000547685627937 -0.8659937806310484 1.859985921082281e-05
+ outer loop
+ vertex -158.9258390552295 -82.99474002853829 339.5885715461155
+ vertex -158.05983597451893 -82.49470136783958 338.5885715451121
+ vertex -158.05984527444852 -82.49468525988897 339.58857154493916
+ endloop
+endfacet
+facet normal 0.5000547685627937 -0.8659937806310484 1.859985921082281e-05
+ outer loop
+ vertex -158.05983597451893 -82.49470136783958 338.5885715451121
+ vertex -158.9258390552295 -82.99474002853829 339.5885715461155
+ vertex -158.92582975529984 -82.99475613648892 338.5885715462884
+ endloop
+endfacet
+facet normal -0.8659937807809691 -0.5000547686490778 1.17630317955688e-09
+ outer loop
+ vertex -159.6759119088913 -81.69576546424761 338.5885436464996
+ vertex -158.9258390552295 -82.99474002853829 339.5885715461155
+ vertex -159.6759212088209 -81.695749356297 339.5885436463266
+ endloop
+endfacet
+facet normal -0.8659937807809691 -0.5000547686490778 1.17630317955688e-09
+ outer loop
+ vertex -158.9258390552295 -82.99474002853829 339.5885715461155
+ vertex -159.6759119088913 -81.69576546424761 338.5885436464996
+ vertex -158.92582975529984 -82.99475613648892 338.5885715462884
+ endloop
+endfacet
+facet normal 0.5000161077776379 -0.8660161035552092 1.8599859244801665e-05
+ outer loop
+ vertex -161.40795341795692 -82.69578157302179 339.5885436470185
+ vertex -159.6759119088913 -81.69576546424761 338.5885436464996
+ vertex -159.6759212088209 -81.695749356297 339.5885436463266
+ endloop
+endfacet
+facet normal 0.5000161077776379 -0.8660161035552092 1.8599859244801665e-05
+ outer loop
+ vertex -159.6759119088913 -81.69576546424761 338.5885436464996
+ vertex -161.40795341795692 -82.69578157302179 339.5885436470185
+ vertex -161.4079441180273 -82.6957976809724 338.5885436471915
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -158.05984527444852 -82.49468525988897 339.58857154493916
+ vertex -159.6759212088209 -81.695749356297 339.5885436463266
+ vertex -158.80984711405395 -81.19569976583948 339.5885436459806
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -159.6759212088209 -81.695749356297 339.5885436463266
+ vertex -158.05984527444852 -82.49468525988897 339.58857154493916
+ vertex -158.9258390552295 -82.99474002853829 339.5885715461155
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -152.8092612163375 -91.5876355222657 339.58876684379516
+ vertex -154.42533715146274 -90.78869961737067 339.5887389451826
+ vertex -153.55934337068157 -90.28864484872153 339.5887389440063
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -154.42533715146274 -90.78869961737067 339.5887389451826
+ vertex -152.8092612163375 -91.5876355222657 339.58876684379516
+ vertex -153.67535391436576 -92.08765289231421 339.58876684344915
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -156.45492678515333 -72.33143862931345 339.5884227614933
+ vertex -157.45143127055394 -80.41199234599456 339.58854365523194
+ vertex -158.80984711405395 -81.19569976583948 339.5885436459806
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -157.45143127055394 -80.41199234599456 339.58854365523194
+ vertex -156.45492678515333 -72.33143862931345 339.5884227614933
+ vertex -157.32419602453373 -80.37844236246367 339.5885442980893
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -157.32419602453373 -80.37844236246367 339.5885442980893
+ vertex -156.45492678515333 -72.33143862931345 339.5884227614933
+ vertex -157.19261283969195 -80.37896647177418 339.588545530246
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -157.19261283969195 -80.37896647177418 339.588545530246
+ vertex -156.45492678515333 -72.33143862931345 339.5884227614933
+ vertex -157.06564889262432 -80.41352895674213 339.58854726773257
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -157.06564889262432 -80.41352895674213 339.58854726773257
+ vertex -156.45492678515333 -72.33143862931345 339.5884227614933
+ vertex -156.9519565665058 -80.47977444113447 339.58854939214217
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -156.9519565665058 -80.47977444113447 339.58854939214217
+ vertex -156.45492678515333 -72.33143862931345 339.5884227614933
+ vertex -156.85928380547557 -80.57318840466576 339.58855175869985
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -156.85928380547557 -80.57318840466576 339.58855175869985
+ vertex -156.45492678515333 -72.33143862931345 339.5884227614933
+ vertex -143.95452409071237 -93.98184121819368 339.5888877579744
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -156.85928380547557 -80.57318840466576 339.58855175869985
+ vertex -143.95452409071237 -93.98184121819368 339.5888877579744
+ vertex -151.29437560836277 -90.21147812882229 339.58875876504936
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -151.29437560836277 -90.21147812882229 339.58875876504936
+ vertex -143.95452409071237 -93.98184121819368 339.5888877579744
+ vertex -151.26026043588007 -90.33862803915643 339.5887611304426
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -151.26026043588007 -90.33862803915643 339.5887611304426
+ vertex -143.95452409071237 -93.98184121819368 339.5888877579744
+ vertex -151.2602165280924 -90.47027507772815 339.5887632514149
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -151.2602165280924 -90.47027507772815 339.5887632514149
+ vertex -143.95452409071237 -93.98184121819368 339.5888877579744
+ vertex -151.29424687724313 -90.59744771641572 339.5887649834256
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -151.29424687724313 -90.59744771641572 339.5887649834256
+ vertex -143.95452409071237 -93.98184121819368 339.5888877579744
+ vertex -151.3600323712749 -90.71147935005517 339.5887662084411
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -151.3600323712749 -90.71147935005517 339.5887662084411
+ vertex -143.95452409071237 -93.98184121819368 339.5888877579744
+ vertex -151.4530898374857 -90.80459891126087 339.5887668429785
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -151.4530898374857 -90.80459891126087 339.5887668429785
+ vertex -143.95452409071237 -93.98184121819368 339.5888877579744
+ vertex -152.8092612163375 -91.5876355222657 339.58876684379516
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -153.67535391436576 -92.08765289231421 339.58876684344915
+ vertex -151.65718669951977 -99.58387951392258 339.5889063611105
+ vertex -155.40780137008014 -93.08790337952905 339.58876684379516
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -151.65718669951977 -99.58387951392258 339.5889063611105
+ vertex -153.67535391436576 -92.08765289231421 339.58876684344915
+ vertex -152.8092612163375 -91.5876355222657 339.58876684379516
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -151.65718669951977 -99.58387951392258 339.5889063611105
+ vertex -152.8092612163375 -91.5876355222657 339.58876684379516
+ vertex -143.95452409071237 -93.98184121819368 339.5888877579744
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -151.65718669951977 -99.58387951392258 339.5889063611105
+ vertex -143.95452409071237 -93.98184121819368 339.5888877579744
+ vertex -144.3205240866398 -95.34787342961305 339.5889063581796
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -156.45492678515333 -72.33143862931345 339.5884227614933
+ vertex -165.157621609516 -76.20144471793193 339.58840416491086
+ vertex -157.820958996636 -71.9654386336224 339.58840416198
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -165.157621609516 -76.20144471793193 339.58840416491086
+ vertex -156.45492678515333 -72.33143862931345 339.5884227614933
+ vertex -161.40795341795692 -82.69578157302179 339.5885436470185
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -161.40795341795692 -82.69578157302179 339.5885436470185
+ vertex -156.45492678515333 -72.33143862931345 339.5884227614933
+ vertex -158.80984711405395 -81.19569976583948 339.5885436459806
+ endloop
+endfacet
+facet normal 9.299929623335791e-06 -1.6107950615988392e-05 -0.9999999998270227
+ outer loop
+ vertex -161.40795341795692 -82.69578157302179 339.5885436470185
+ vertex -158.80984711405395 -81.19569976583948 339.5885436459806
+ vertex -159.6759212088209 -81.695749356297 339.5885436463266
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -159.6762746061466 -81.69513725417363 377.58854363975377
+ vertex -158.81020051137963 -81.19508766371611 377.58854363940776
+ vertex -158.92619245255517 -82.99412792641493 377.5885715395426
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -158.0601986717742 -82.4940731577656 377.5885715383663
+ vertex -158.92619245255517 -82.99412792641493 377.5885715395426
+ vertex -158.81020051137963 -81.19508766371611 377.58854363940776
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -155.40815476740582 -93.08729127740568 377.58876683722235
+ vertex -153.67569800928243 -92.08705690174375 377.5887668372223
+ vertex -151.65754009684545 -99.58326741179923 377.58890635453764
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -152.80961461366317 -91.58702342014233 377.5887668372223
+ vertex -151.65754009684545 -99.58326741179923 377.58890635453764
+ vertex -153.67569800928243 -92.08705690174375 377.5887668372223
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -143.95487748803805 -93.98122911607032 377.58888775140156
+ vertex -151.65754009684545 -99.58326741179923 377.58890635453764
+ vertex -152.80961461366317 -91.58702342014233 377.5887668372223
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -144.32087748396546 -95.34726132748968 377.58890635160674
+ vertex -151.65754009684545 -99.58326741179923 377.58890635453764
+ vertex -143.95487748803805 -93.98122911607032 377.58888775140156
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -165.15797500684164 -76.20083261580857 377.588404158338
+ vertex -157.82131239396168 -71.96482653149903 377.5884041554072
+ vertex -161.40830681528257 -82.69516947089842 377.58854364044566
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -156.455280182479 -72.3308265271901 377.5884227549205
+ vertex -161.40830681528257 -82.69516947089842 377.58854364044566
+ vertex -157.82131239396168 -71.96482653149903 377.5884041554072
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -158.81020051137963 -81.19508766371611 377.58854363940776
+ vertex -161.40830681528257 -82.69516947089842 377.58854364044566
+ vertex -156.455280182479 -72.3308265271901 377.5884227549205
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -157.45178466787962 -80.41138024387119 377.58854364865914
+ vertex -158.81020051137963 -81.19508766371611 377.58854363940776
+ vertex -156.455280182479 -72.3308265271901 377.5884227549205
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -157.32454942185942 -80.3778302603403 377.5885442915164
+ vertex -157.45178466787962 -80.41138024387119 377.58854364865914
+ vertex -156.455280182479 -72.3308265271901 377.5884227549205
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -157.1929662370176 -80.37835436965086 377.58854552367313
+ vertex -157.32454942185942 -80.3778302603403 377.5885442915164
+ vertex -156.455280182479 -72.3308265271901 377.5884227549205
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -157.06600228994998 -80.41291685461876 377.5885472611597
+ vertex -157.1929662370176 -80.37835436965086 377.58854552367313
+ vertex -156.455280182479 -72.3308265271901 377.5884227549205
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -156.95230996383145 -80.47916233901113 377.58854938556937
+ vertex -157.06600228994998 -80.41291685461876 377.5885472611597
+ vertex -156.455280182479 -72.3308265271901 377.5884227549205
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -156.85963720280122 -80.5725763025424 377.58855175212705
+ vertex -156.95230996383145 -80.47916233901113 377.58854938556937
+ vertex -156.455280182479 -72.3308265271901 377.5884227549205
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -143.95487748803805 -93.98122911607032 377.58888775140156
+ vertex -156.85963720280122 -80.5725763025424 377.58855175212705
+ vertex -156.455280182479 -72.3308265271901 377.5884227549205
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -159.6762746061466 -81.69513725417363 377.58854363975377
+ vertex -161.40830681528257 -82.69516947089842 377.58854364044566
+ vertex -158.81020051137963 -81.19508766371611 377.58854363940776
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -151.29472900568845 -90.21086602669894 377.5887587584765
+ vertex -156.85963720280122 -80.5725763025424 377.58855175212705
+ vertex -143.95487748803805 -93.98122911607032 377.58888775140156
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -151.26061383320575 -90.33801593703306 377.58876112386974
+ vertex -151.29472900568845 -90.21086602669894 377.5887587584765
+ vertex -143.95487748803805 -93.98122911607032 377.58888775140156
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -151.26056992541805 -90.46966297560478 377.5887632448421
+ vertex -151.26061383320575 -90.33801593703306 377.58876112386974
+ vertex -143.95487748803805 -93.98122911607032 377.58888775140156
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -151.29460027456892 -90.59683561429236 377.5887649768528
+ vertex -151.26056992541805 -90.46966297560478 377.5887632448421
+ vertex -143.95487748803805 -93.98122911607032 377.58888775140156
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -151.36038576860065 -90.7108672479318 377.5887662018683
+ vertex -151.29460027456892 -90.59683561429236 377.5887649768528
+ vertex -143.95487748803805 -93.98122911607032 377.58888775140156
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -151.45344323481135 -90.8039868091375 377.5887668364056
+ vertex -151.36038576860065 -90.7108672479318 377.5887662018683
+ vertex -143.95487748803805 -93.98122911607032 377.58888775140156
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -152.80961461366317 -91.58702342014233 377.5887668372223
+ vertex -151.45344323481135 -90.8039868091375 377.5887668364056
+ vertex -143.95487748803805 -93.98122911607032 377.58888775140156
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -153.55969676800726 -90.28803274659816 377.58873893743345
+ vertex -152.80961461366317 -91.58702342014233 377.5887668372223
+ vertex -154.42569054878842 -90.7880875152473 377.58873893860977
+ endloop
+endfacet
+facet normal 9.29992962333579e-06 -1.610795061598839e-05 -0.9999999998270227
+ outer loop
+ vertex -153.67569800928243 -92.08705690174375 377.5887668372223
+ vertex -154.42569054878842 -90.7880875152473 377.58873893860977
+ vertex -152.80961461366317 -91.58702342014233 377.5887668372223
+ endloop
+endfacet
+facet normal -0.8660161037050138 -0.5000161078641236 3.4595554199262066e-10
+ outer loop
+ vertex -165.15802615645458 -76.20074402208017 383.0884041573866
+ vertex -161.40835796489552 -82.69508087717003 383.0885436394943
+ vertex -165.15803545638423 -76.20072791412956 384.08840415721363
+ endloop
+endfacet
+facet normal -0.8660161037050138 -0.5000161078641236 3.4595554199262066e-10
+ outer loop
+ vertex -161.40836726482513 -82.69506476921941 384.08854363932136
+ vertex -165.15803545638423 -76.20072791412956 384.08840415721363
+ vertex -161.40835796489552 -82.69508087717003 383.0885436394943
+ endloop
+endfacet
+facet normal -0.5000161077776379 0.8660161035552092 -1.8599859244801662e-05
+ outer loop
+ vertex -157.82137284350424 -71.96472182982002 384.08840415428284
+ vertex -157.82136354357462 -71.96473793777064 383.0884041544558
+ vertex -165.15803545638423 -76.20072791412956 384.08840415721363
+ endloop
+endfacet
+facet normal -0.5000161077776379 0.8660161035552092 -1.8599859244801662e-05
+ outer loop
+ vertex -165.15802615645458 -76.20074402208017 383.0884041573866
+ vertex -165.15803545638423 -76.20072791412956 384.08840415721363
+ vertex -157.82136354357462 -71.96473793777064 383.0884041544558
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262066e-10
+ outer loop
+ vertex -143.95487748803805 -93.98122911607032 377.58888775140156
+ vertex -156.455280182479 -72.3308265271901 377.5884227549205
+ vertex -143.95492863765097 -93.98114052234195 383.08888775045017
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262066e-10
+ outer loop
+ vertex -156.45533133209193 -72.33073793346169 383.0884227539691
+ vertex -143.95492863765097 -93.98114052234195 383.08888775045017
+ vertex -156.455280182479 -72.3308265271901 377.5884227549205
+ endloop
+endfacet
+facet normal 0.9659306400586332 -0.2588010788674356 1.3151841973605115e-05
+ outer loop
+ vertex -143.95487748803805 -93.98122911607032 377.58888775140156
+ vertex -143.95492863765097 -93.98114052234195 383.08888775045017
+ vertex -144.32087748396546 -95.34726132748968 377.58890635160674
+ endloop
+endfacet
+facet normal 0.9659306400586332 -0.2588010788674356 1.3151841973605115e-05
+ outer loop
+ vertex -144.32092863357838 -95.34717273376128 383.0889063506554
+ vertex -144.32087748396546 -95.34726132748968 377.58890635160674
+ vertex -143.95492863765097 -93.98114052234195 383.08888775045017
+ endloop
+endfacet
+facet normal 0.5000161077776379 -0.8660161035552092 1.8599859244801662e-05
+ outer loop
+ vertex -144.32087748396546 -95.34726132748968 377.58890635160674
+ vertex -144.32092863357838 -95.34717273376128 383.0889063506554
+ vertex -151.65754009684545 -99.58326741179923 377.58890635453764
+ endloop
+endfacet
+facet normal 0.5000161077776379 -0.8660161035552092 1.8599859244801662e-05
+ outer loop
+ vertex -151.65759124645837 -99.58317881807082 383.08890635358625
+ vertex -151.65754009684545 -99.58326741179923 377.58890635453764
+ vertex -144.32092863357838 -95.34717273376128 383.0889063506554
+ endloop
+endfacet
+facet normal 0.2588010790344744 0.9659306400138717 -1.3152331228624581e-05
+ outer loop
+ vertex -156.45534063202155 -72.33072182551109 384.0884227537961
+ vertex -156.45533133209193 -72.33073793346169 383.0884227539691
+ vertex -157.82137284350424 -71.96472182982002 384.08840415428284
+ endloop
+endfacet
+facet normal 0.2588010790344744 0.9659306400138717 -1.3152331228624581e-05
+ outer loop
+ vertex -157.82136354357462 -71.96473793777064 383.0884041544558
+ vertex -157.82137284350424 -71.96472182982002 384.08840415428284
+ vertex -156.45533133209193 -72.33073793346169 383.0884227539691
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -158.81026096092216 -81.1949829620371 384.0885436382834
+ vertex -159.67633505568912 -81.69503255249462 384.0885436386294
+ vertex -158.06025912131676 -82.4939684560866 384.08857153724193
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -158.9262529020977 -82.99402322473593 384.08857153841825
+ vertex -158.06025912131676 -82.4939684560866 384.08857153724193
+ vertex -159.67633505568912 -81.69503255249462 384.0885436386294
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -157.82137284350424 -71.96472182982002 384.08840415428284
+ vertex -165.15803545638423 -76.20072791412956 384.08840415721363
+ vertex -156.45534063202155 -72.33072182551109 384.0884227537961
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -161.40836726482513 -82.69506476921941 384.08854363932136
+ vertex -156.45534063202155 -72.33072182551109 384.0884227537961
+ vertex -165.15803545638423 -76.20072791412956 384.08840415721363
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -158.81026096092216 -81.1949829620371 384.0885436382834
+ vertex -156.45534063202155 -72.33072182551109 384.0884227537961
+ vertex -161.40836726482513 -82.69506476921941 384.08854363932136
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -159.67633505568912 -81.69503255249462 384.0885436386294
+ vertex -158.81026096092216 -81.1949829620371 384.0885436382834
+ vertex -161.40836726482513 -82.69506476921941 384.08854363932136
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -153.55975721754982 -90.28792804491917 384.08873893630914
+ vertex -154.42575099833098 -90.78798281356829 384.08873893748546
+ vertex -152.80967506320573 -91.58691871846332 384.088766836098
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -153.67575845882502 -92.08695220006474 384.088766836098
+ vertex -152.80967506320573 -91.58691871846332 384.088766836098
+ vertex -154.42575099833098 -90.78798281356829 384.08873893748546
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -158.81026096092216 -81.1949829620371 384.0885436382834
+ vertex -157.45184511742218 -80.41127554219219 384.0885436475348
+ vertex -156.45534063202155 -72.33072182551109 384.0884227537961
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -157.32460987140195 -80.37772555866131 384.0885442903921
+ vertex -156.45534063202155 -72.33072182551109 384.0884227537961
+ vertex -157.45184511742218 -80.41127554219219 384.0885436475348
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -157.19302668656013 -80.37824966797186 384.08854552254877
+ vertex -156.45534063202155 -72.33072182551109 384.0884227537961
+ vertex -157.32460987140195 -80.37772555866131 384.0885442903921
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -157.06606273949254 -80.41281215293975 384.08854726003534
+ vertex -156.45534063202155 -72.33072182551109 384.0884227537961
+ vertex -157.19302668656013 -80.37824966797186 384.08854552254877
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -156.95237041337398 -80.47905763733213 384.088549384445
+ vertex -156.45534063202155 -72.33072182551109 384.0884227537961
+ vertex -157.06606273949254 -80.41281215293975 384.08854726003534
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -156.85969765234378 -80.5724716008634 384.0885517510027
+ vertex -156.45534063202155 -72.33072182551109 384.0884227537961
+ vertex -156.95237041337398 -80.47905763733213 384.088549384445
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -143.95493793758058 -93.98112441439132 384.0888877502772
+ vertex -156.45534063202155 -72.33072182551109 384.0884227537961
+ vertex -156.85969765234378 -80.5724716008634 384.0885517510027
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -151.294789455231 -90.21076132501993 384.0887587573522
+ vertex -143.95493793758058 -93.98112441439132 384.0888877502772
+ vertex -156.85969765234378 -80.5724716008634 384.0885517510027
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -151.2606742827483 -90.33791123535406 384.0887611227454
+ vertex -143.95493793758058 -93.98112441439132 384.0888877502772
+ vertex -151.294789455231 -90.21076132501993 384.0887587573522
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -151.26063037496064 -90.46955827392577 384.0887632437177
+ vertex -143.95493793758058 -93.98112441439132 384.0888877502772
+ vertex -151.2606742827483 -90.33791123535406 384.0887611227454
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -151.29466072411145 -90.59673091261335 384.08876497572845
+ vertex -143.95493793758058 -93.98112441439132 384.0888877502772
+ vertex -151.26063037496064 -90.46955827392577 384.0887632437177
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -151.36044621814324 -90.7107625462528 384.08876620074386
+ vertex -143.95493793758058 -93.98112441439132 384.0888877502772
+ vertex -151.29466072411145 -90.59673091261335 384.08876497572845
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -151.45350368435393 -90.80388210745849 384.08876683528126
+ vertex -143.95493793758058 -93.98112441439132 384.0888877502772
+ vertex -151.36044621814324 -90.7107625462528 384.08876620074386
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -152.80967506320573 -91.58691871846332 384.088766836098
+ vertex -143.95493793758058 -93.98112441439132 384.0888877502772
+ vertex -151.45350368435393 -90.80388210745849 384.08876683528126
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -155.40821521694838 -93.08718657572669 384.088766836098
+ vertex -151.65760054638798 -99.58316271012022 384.0889063534133
+ vertex -153.67575845882502 -92.08695220006474 384.088766836098
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -152.80967506320573 -91.58691871846332 384.088766836098
+ vertex -153.67575845882502 -92.08695220006474 384.088766836098
+ vertex -151.65760054638798 -99.58316271012022 384.0889063534133
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -143.95493793758058 -93.98112441439132 384.0888877502772
+ vertex -152.80967506320573 -91.58691871846332 384.088766836098
+ vertex -151.65760054638798 -99.58316271012022 384.0889063534133
+ endloop
+endfacet
+facet normal -9.29992962341468e-06 1.6107950615944885e-05 0.9999999998270227
+ outer loop
+ vertex -144.32093793350802 -95.34715662581067 384.08890635048243
+ vertex -143.95493793758058 -93.98112441439132 384.0888877502772
+ vertex -151.65760054638798 -99.58316271012022 384.0889063534133
+ endloop
+endfacet
+facet normal 0.5000161077776379 -0.8660161035552092 1.8599859244801662e-05
+ outer loop
+ vertex -144.32092863357838 -95.34717273376128 383.0889063506554
+ vertex -144.32093793350802 -95.34715662581067 384.08890635048243
+ vertex -151.65759124645837 -99.58317881807082 383.08890635358625
+ endloop
+endfacet
+facet normal 0.5000161077776379 -0.8660161035552092 1.8599859244801662e-05
+ outer loop
+ vertex -151.65760054638798 -99.58316271012022 384.0889063534133
+ vertex -151.65759124645837 -99.58317881807082 383.08890635358625
+ vertex -144.32093793350802 -95.34715662581067 384.08890635048243
+ endloop
+endfacet
+facet normal 0.9659306400586332 -0.2588010788674356 1.3151841973605115e-05
+ outer loop
+ vertex -143.95492863765097 -93.98114052234195 383.08888775045017
+ vertex -143.95493793758058 -93.98112441439132 384.0888877502772
+ vertex -144.32092863357838 -95.34717273376128 383.0889063506554
+ endloop
+endfacet
+facet normal 0.9659306400586332 -0.2588010788674356 1.3151841973605115e-05
+ outer loop
+ vertex -144.32093793350802 -95.34715662581067 384.08890635048243
+ vertex -144.32092863357838 -95.34717273376128 383.0889063506554
+ vertex -143.95493793758058 -93.98112441439132 384.0888877502772
+ endloop
+endfacet
+facet normal -0.5000161077776379 0.8660161035552092 -1.8599859244801662e-05
+ outer loop
+ vertex -157.82136354357462 -71.96473793777064 383.0884041544558
+ vertex -157.82131239396168 -71.96482653149903 377.5884041554072
+ vertex -165.15802615645458 -76.20074402208017 383.0884041573866
+ endloop
+endfacet
+facet normal -0.5000161077776379 0.8660161035552092 -1.8599859244801662e-05
+ outer loop
+ vertex -165.15797500684164 -76.20083261580857 377.588404158338
+ vertex -165.15802615645458 -76.20074402208017 383.0884041573866
+ vertex -157.82131239396168 -71.96482653149903 377.5884041554072
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262066e-10
+ outer loop
+ vertex -143.95492863765097 -93.98114052234195 383.08888775045017
+ vertex -156.45533133209193 -72.33073793346169 383.0884227539691
+ vertex -143.95493793758058 -93.98112441439132 384.0888877502772
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262066e-10
+ outer loop
+ vertex -156.45534063202155 -72.33072182551109 384.0884227537961
+ vertex -143.95493793758058 -93.98112441439132 384.0888877502772
+ vertex -156.45533133209193 -72.33073793346169 383.0884227539691
+ endloop
+endfacet
+facet normal 0.2588010790344744 0.9659306400138717 -1.3152331228624581e-05
+ outer loop
+ vertex -156.45533133209193 -72.33073793346169 383.0884227539691
+ vertex -156.455280182479 -72.3308265271901 377.5884227549205
+ vertex -157.82136354357462 -71.96473793777064 383.0884041544558
+ endloop
+endfacet
+facet normal 0.2588010790344744 0.9659306400138717 -1.3152331228624581e-05
+ outer loop
+ vertex -157.82131239396168 -71.96482653149903 377.5884041554072
+ vertex -157.82136354357462 -71.96473793777064 383.0884041544558
+ vertex -156.455280182479 -72.3308265271901 377.5884227549205
+ endloop
+endfacet
+facet normal -0.5000242815412254 0.8660113841764592 -1.8599859240707938e-05
+ outer loop
+ vertex -151.4534943844243 -90.80389821540912 383.0887668354543
+ vertex -151.45344323481135 -90.8039868091375 377.5887668364056
+ vertex -152.8096657632761 -91.58693482641395 383.08876683627096
+ endloop
+endfacet
+facet normal -0.5000242815412254 0.8660113841764592 -1.8599859240707938e-05
+ outer loop
+ vertex -152.80961461366317 -91.58702342014233 377.5887668372223
+ vertex -152.8096657632761 -91.58693482641395 383.08876683627096
+ vertex -151.45344323481135 -90.8039868091375 377.5887668364056
+ endloop
+endfacet
+facet normal -0.7073425807271966 0.7068709027591015 -1.7964477816981822e-05
+ outer loop
+ vertex -151.3604369182135 -90.71077865420341 383.0887662009169
+ vertex -151.36038576860065 -90.7108672479318 377.5887662018683
+ vertex -151.4534943844243 -90.80389821540912 383.0887668354543
+ endloop
+endfacet
+facet normal -0.7073425807271966 0.7068709027591015 -1.7964477816981822e-05
+ outer loop
+ vertex -151.45344323481135 -90.8039868091375 377.5887668364056
+ vertex -151.4534943844243 -90.80389821540912 383.0887668354543
+ vertex -151.36038576860065 -90.7108672479318 377.5887662018683
+ endloop
+endfacet
+facet normal -0.8661921188638244 0.49971112951267393 -1.6104847944957373e-05
+ outer loop
+ vertex -151.29465142418175 -90.59674702056395 383.0887649759014
+ vertex -151.29460027456892 -90.59683561429236 377.5887649768528
+ vertex -151.3604369182135 -90.71077865420341 383.0887662009169
+ endloop
+endfacet
+facet normal -0.8661921188638244 0.49971112951267393 -1.6104847944957373e-05
+ outer loop
+ vertex -151.36038576860065 -90.7108672479318 377.5887662018683
+ vertex -151.3604369182135 -90.71077865420341 383.0887662009169
+ vertex -151.29460027456892 -90.59683561429236 377.5887649768528
+ endloop
+endfacet
+facet normal -0.9660120955503078 0.2584968686031633 -1.3147699300030632e-05
+ outer loop
+ vertex -151.26056992541805 -90.46966297560478 377.5887632448421
+ vertex -151.29460027456892 -90.59683561429236 377.5887649768528
+ vertex -151.260621075031 -90.46957438187637 383.0887632438907
+ endloop
+endfacet
+facet normal -0.9660120955503078 0.2584968686031633 -1.3147699300030632e-05
+ outer loop
+ vertex -151.29465142418175 -90.59674702056395 383.0887649759014
+ vertex -151.260621075031 -90.46957438187637 383.0887632438907
+ vertex -151.29460027456892 -90.59683561429236 377.5887649768528
+ endloop
+endfacet
+facet normal -0.9999999443367676 -0.00033352671979508525 -9.294556675347818e-06
+ outer loop
+ vertex -151.26061383320575 -90.33801593703306 377.58876112386974
+ vertex -151.26056992541805 -90.46966297560478 377.5887632448421
+ vertex -151.26066498281867 -90.33792734330467 383.08876112291836
+ endloop
+endfacet
+facet normal -0.9999999443367676 -0.00033352671979508525 -9.294556675347818e-06
+ outer loop
+ vertex -151.260621075031 -90.46957438187637 383.0887632438907
+ vertex -151.26066498281867 -90.33792734330467 383.08876112291836
+ vertex -151.26056992541805 -90.46966297560478 377.5887632448421
+ endloop
+endfacet
+facet normal -0.9658394494942373 -0.2591411927454837 -4.80800537325688e-06
+ outer loop
+ vertex -151.29472900568845 -90.21086602669894 377.5887587584765
+ vertex -151.26061383320575 -90.33801593703306 377.58876112386974
+ vertex -151.29478015530137 -90.21077743297054 383.08875875752517
+ endloop
+endfacet
+facet normal -0.9658394494942373 -0.2591411927454837 -4.80800537325688e-06
+ outer loop
+ vertex -151.26066498281867 -90.33792734330467 383.08876112291836
+ vertex -151.29478015530137 -90.21077743297054 383.08875875752517
+ vertex -151.26061383320575 -90.33801593703306 377.58876112386974
+ endloop
+endfacet
+facet normal -0.8660161037050097 -0.5000161078641306 3.4595554214343047e-10
+ outer loop
+ vertex -156.85963720280122 -80.5725763025424 377.58855175212705
+ vertex -151.29472900568845 -90.21086602669894 377.5887587584765
+ vertex -156.85968835241414 -80.57248770881401 383.08855175117566
+ endloop
+endfacet
+facet normal -0.8660161037050097 -0.5000161078641306 3.4595554214343047e-10
+ outer loop
+ vertex -151.29478015530137 -90.21077743297054 383.08875875752517
+ vertex -156.85968835241414 -80.57248770881401 383.08855175117566
+ vertex -151.29472900568845 -90.21086602669894 377.5887587584765
+ endloop
+endfacet
+facet normal -0.709917628601995 -0.7042847155644013 4.742399434363146e-06
+ outer loop
+ vertex -156.85963720280122 -80.5725763025424 377.58855175212705
+ vertex -156.85968835241414 -80.57248770881401 383.08855175117566
+ vertex -156.95230996383145 -80.47916233901113 377.58854938556937
+ endloop
+endfacet
+facet normal -0.709917628601995 -0.7042847155644013 4.742399434363146e-06
+ outer loop
+ vertex -156.9523611134444 -80.4790737452827 383.088549384618
+ vertex -156.95230996383145 -80.47916233901113 377.58854938556937
+ vertex -156.85968835241414 -80.57248770881401 383.08855175117566
+ endloop
+endfacet
+facet normal -0.5034454744536385 -0.8640269985173223 9.235696742989532e-06
+ outer loop
+ vertex -157.06600228994998 -80.41291685461876 377.5885472611597
+ vertex -156.95230996383145 -80.47916233901113 377.58854938556937
+ vertex -157.06605343956292 -80.41282826089036 383.0885472602083
+ endloop
+endfacet
+facet normal -0.5034454744536385 -0.8640269985173223 9.235696742989532e-06
+ outer loop
+ vertex -156.9523611134444 -80.4790737452827 383.088549384618
+ vertex -157.06605343956292 -80.41282826089036 383.0885472602083
+ vertex -156.95230996383145 -80.47916233901113 377.58854938556937
+ endloop
+endfacet
+facet normal -0.262664343202477 -0.9648872693938976 1.3099596581315964e-05
+ outer loop
+ vertex -157.1929662370176 -80.37835436965086 377.58854552367313
+ vertex -157.06600228994998 -80.41291685461876 377.5885472611597
+ vertex -157.19301738663054 -80.37826577592243 383.08854552272174
+ endloop
+endfacet
+facet normal -0.262664343202477 -0.9648872693938976 1.3099596581315964e-05
+ outer loop
+ vertex -157.06605343956292 -80.41282826089036 383.0885472602083
+ vertex -157.19301738663054 -80.37826577592243 383.08854552272174
+ vertex -157.06600228994998 -80.41291685461876 377.5885472611597
+ endloop
+endfacet
+facet normal -0.003983071039348085 -0.9999920674119498 1.6070780560681012e-05
+ outer loop
+ vertex -157.1929662370176 -80.37835436965086 377.58854552367313
+ vertex -157.19301738663054 -80.37826577592243 383.08854552272174
+ vertex -157.32454942185942 -80.3778302603403 377.5885442915164
+ endloop
+endfacet
+facet normal -0.003983071039348085 -0.9999920674119498 1.6070780560681012e-05
+ outer loop
+ vertex -157.32460057147236 -80.37774166661191 383.0885442905651
+ vertex -157.32454942185942 -80.3778302603403 377.5885442915164
+ vertex -157.19301738663054 -80.37826577592243 383.08854552272174
+ endloop
+endfacet
+facet normal 0.254969640838129 -0.9669490586007048 1.79467674031028e-05
+ outer loop
+ vertex -157.32454942185942 -80.3778302603403 377.5885442915164
+ vertex -157.32460057147236 -80.37774166661191 383.0885442905651
+ vertex -157.45178466787962 -80.41138024387119 377.58854364865914
+ endloop
+endfacet
+facet normal 0.254969640838129 -0.9669490586007048 1.79467674031028e-05
+ outer loop
+ vertex -157.45183581749254 -80.4112916501428 383.08854364770775
+ vertex -157.45178466787962 -80.41138024387119 377.58854364865914
+ vertex -157.32460057147236 -80.37774166661191 383.0885442905651
+ endloop
+endfacet
+facet normal 0.499725310301553 -0.8661839376818655 1.859985831256329e-05
+ outer loop
+ vertex -157.45178466787962 -80.41138024387119 377.58854364865914
+ vertex -157.45183581749254 -80.4112916501428 383.08854364770775
+ vertex -158.81020051137963 -81.19508766371611 377.58854363940776
+ endloop
+endfacet
+facet normal 0.499725310301553 -0.8661839376818655 1.859985831256329e-05
+ outer loop
+ vertex -158.81025166099258 -81.19499906998772 383.0885436384564
+ vertex -158.81020051137963 -81.19508766371611 377.58854363940776
+ vertex -157.45183581749254 -80.4112916501428 383.08854364770775
+ endloop
+endfacet
+facet normal 0.8660161037049837 0.5000161078641757 -3.459555431116082e-10
+ outer loop
+ vertex -158.0601986717742 -82.4940731577656 377.5885715383663
+ vertex -158.81020051137963 -81.19508766371611 377.58854363940776
+ vertex -158.06024982138715 -82.4939845640372 383.0885715374149
+ endloop
+endfacet
+facet normal 0.8660161037049837 0.5000161078641757 -3.459555431116082e-10
+ outer loop
+ vertex -158.81025166099258 -81.19499906998772 383.0885436384564
+ vertex -158.06024982138715 -82.4939845640372 383.0885715374149
+ vertex -158.81020051137963 -81.19508766371611 377.58854363940776
+ endloop
+endfacet
+facet normal 0.5000547685627937 -0.8659937806310484 1.8599859210822807e-05
+ outer loop
+ vertex -158.0601986717742 -82.4940731577656 377.5885715383663
+ vertex -158.06024982138715 -82.4939845640372 383.0885715374149
+ vertex -158.92619245255517 -82.99412792641493 377.5885715395426
+ endloop
+endfacet
+facet normal 0.5000547685627937 -0.8659937806310484 1.8599859210822807e-05
+ outer loop
+ vertex -158.92624360216809 -82.99403933268654 383.0885715385912
+ vertex -158.92619245255517 -82.99412792641493 377.5885715395426
+ vertex -158.06024982138715 -82.4939845640372 383.0885715374149
+ endloop
+endfacet
+facet normal -0.8659937807809691 -0.5000547686490778 1.1763031795568804e-09
+ outer loop
+ vertex -159.6762746061466 -81.69513725417363 377.58854363975377
+ vertex -158.92619245255517 -82.99412792641493 377.5885715395426
+ vertex -159.6763257557595 -81.69504866044524 383.0885436388024
+ endloop
+endfacet
+facet normal -0.8659937807809691 -0.5000547686490778 1.1763031795568804e-09
+ outer loop
+ vertex -158.92624360216809 -82.99403933268654 383.0885715385912
+ vertex -159.6763257557595 -81.69504866044524 383.0885436388024
+ vertex -158.92619245255517 -82.99412792641493 377.5885715395426
+ endloop
+endfacet
+facet normal 0.5000161077776379 -0.8660161035552092 1.8599859244801662e-05
+ outer loop
+ vertex -159.6762746061466 -81.69513725417363 377.58854363975377
+ vertex -159.6763257557595 -81.69504866044524 383.0885436388024
+ vertex -161.40830681528257 -82.69516947089842 377.58854364044566
+ endloop
+endfacet
+facet normal 0.5000161077776379 -0.8660161035552092 1.8599859244801662e-05
+ outer loop
+ vertex -161.40835796489552 -82.69508087717003 383.0885436394943
+ vertex -161.40830681528257 -82.69516947089842 377.58854364044566
+ vertex -159.6763257557595 -81.69504866044524 383.0885436388024
+ endloop
+endfacet
+facet normal -0.5000040268793279 0.8660230786143782 -2.0291151848476758e-05
+ outer loop
+ vertex -153.67575846130435 -92.08695219646245 383.0887668359249
+ vertex -153.67569800928243 -92.08705690174375 377.5887668372223
+ vertex -155.40820591701873 -93.08720268367729 383.08876683627096
+ endloop
+endfacet
+facet normal -0.5000040268793279 0.8660230786143782 -2.0291151848476758e-05
+ outer loop
+ vertex -155.40815476740582 -93.08729127740568 377.58876683722235
+ vertex -155.40820591701873 -93.08720268367729 383.08876683627096
+ vertex -153.67569800928243 -92.08705690174375 377.5887668372223
+ endloop
+endfacet
+facet normal -0.8660161037049536 -0.5000161078642279 3.459555444341411e-10
+ outer loop
+ vertex -154.42569054878842 -90.7880875152473 377.58873893860977
+ vertex -153.67569800928243 -92.08705690174375 377.5887668372223
+ vertex -154.42574169840134 -90.78799892151892 383.0887389376584
+ endloop
+endfacet
+facet normal -0.8660161037049536 -0.5000161078642279 3.459555444341411e-10
+ outer loop
+ vertex -153.67575846130435 -92.08695219646245 383.0887668359249
+ vertex -154.42574169840134 -90.78799892151892 383.0887389376584
+ vertex -153.67569800928243 -92.08705690174375 377.5887668372223
+ endloop
+endfacet
+facet normal -0.5000547685625593 0.8659937806311837 -1.8599859210822807e-05
+ outer loop
+ vertex -153.5597479176202 -90.28794415286977 383.08873893648206
+ vertex -153.55969676800726 -90.28803274659816 377.58873893743345
+ vertex -154.42574169840134 -90.78799892151892 383.0887389376584
+ endloop
+endfacet
+facet normal -0.5000547685625593 0.8659937806311837 -1.8599859210822807e-05
+ outer loop
+ vertex -154.42569054878842 -90.7880875152473 377.58873893860977
+ vertex -154.42574169840134 -90.78799892151892 383.0887389376584
+ vertex -153.55969676800726 -90.28803274659816 377.58873893743345
+ endloop
+endfacet
+facet normal 0.8659937807808712 0.5000547686492475 -1.1763031832001919e-09
+ outer loop
+ vertex -152.80961461366317 -91.58702342014233 377.5887668372223
+ vertex -153.55969676800726 -90.28803274659816 377.58873893743345
+ vertex -152.8096657632761 -91.58693482641395 383.08876683627096
+ endloop
+endfacet
+facet normal 0.8659937807808712 0.5000547686492475 -1.1763031832001919e-09
+ outer loop
+ vertex -153.5597479176202 -90.28794415286977 383.08873893648206
+ vertex -152.8096657632761 -91.58693482641395 383.08876683627096
+ vertex -153.55969676800726 -90.28803274659816 377.58873893743345
+ endloop
+endfacet
+facet normal -0.8660161037050258 -0.5000161078641028 3.459555415450979e-10
+ outer loop
+ vertex -155.40820591701873 -93.08720268367729 383.08876683627096
+ vertex -151.65759124645837 -99.58317881807082 383.08890635358625
+ vertex -155.40821521694838 -93.08718657572669 384.088766836098
+ endloop
+endfacet
+facet normal -0.8660161037050258 -0.5000161078641028 3.459555415450979e-10
+ outer loop
+ vertex -151.65760054638798 -99.58316271012022 384.0889063534133
+ vertex -155.40821521694838 -93.08718657572669 384.088766836098
+ vertex -151.65759124645837 -99.58317881807082 383.08890635358625
+ endloop
+endfacet
+facet normal -0.8660161037050138 -0.5000161078641236 3.4595554199262066e-10
+ outer loop
+ vertex -165.15797500684164 -76.20083261580857 377.588404158338
+ vertex -161.40830681528257 -82.69516947089842 377.58854364044566
+ vertex -165.15802615645458 -76.20074402208017 383.0884041573866
+ endloop
+endfacet
+facet normal -0.8660161037050138 -0.5000161078641236 3.4595554199262066e-10
+ outer loop
+ vertex -161.40835796489552 -82.69508087717003 383.0885436394943
+ vertex -165.15802615645458 -76.20074402208017 383.0884041573866
+ vertex -161.40830681528257 -82.69516947089842 377.58854364044566
+ endloop
+endfacet
+facet normal -0.8660161037050258 -0.5000161078641028 3.459555415450979e-10
+ outer loop
+ vertex -155.40815476740582 -93.08729127740568 377.58876683722235
+ vertex -151.65754009684545 -99.58326741179923 377.58890635453764
+ vertex -155.40820591701873 -93.08720268367729 383.08876683627096
+ endloop
+endfacet
+facet normal -0.8660161037050258 -0.5000161078641028 3.459555415450979e-10
+ outer loop
+ vertex -151.65759124645837 -99.58317881807082 383.08890635358625
+ vertex -155.40820591701873 -93.08720268367729 383.08876683627096
+ vertex -151.65754009684545 -99.58326741179923 377.58890635453764
+ endloop
+endfacet
+facet normal -0.5000040269606483 0.86602307875523 -9.297749943632543e-06
+ outer loop
+ vertex -153.67575845882502 -92.08695220006474 384.088766836098
+ vertex -153.67575846130435 -92.08695219646245 383.0887668359249
+ vertex -155.40821521694838 -93.08718657572669 384.088766836098
+ endloop
+endfacet
+facet normal -0.5000040269606483 0.86602307875523 -9.297749943632543e-06
+ outer loop
+ vertex -155.40820591701873 -93.08720268367729 383.08876683627096
+ vertex -155.40821521694838 -93.08718657572669 384.088766836098
+ vertex -153.67575846130435 -92.08695219646245 383.0887668359249
+ endloop
+endfacet
+facet normal -0.5000547685625593 0.8659937806311837 -1.8599859210822807e-05
+ outer loop
+ vertex -153.55975721754982 -90.28792804491917 384.08873893630914
+ vertex -153.5597479176202 -90.28794415286977 383.08873893648206
+ vertex -154.42575099833098 -90.78798281356829 384.08873893748546
+ endloop
+endfacet
+facet normal -0.5000547685625593 0.8659937806311837 -1.8599859210822807e-05
+ outer loop
+ vertex -154.42574169840134 -90.78799892151892 383.0887389376584
+ vertex -154.42575099833098 -90.78798281356829 384.08873893748546
+ vertex -153.5597479176202 -90.28794415286977 383.08873893648206
+ endloop
+endfacet
+facet normal -0.5000242815412254 0.8660113841764592 -1.8599859240707938e-05
+ outer loop
+ vertex -151.45350368435393 -90.80388210745849 384.08876683528126
+ vertex -151.4534943844243 -90.80389821540912 383.0887668354543
+ vertex -152.80967506320573 -91.58691871846332 384.088766836098
+ endloop
+endfacet
+facet normal -0.5000242815412254 0.8660113841764592 -1.8599859240707938e-05
+ outer loop
+ vertex -152.8096657632761 -91.58693482641395 383.08876683627096
+ vertex -152.80967506320573 -91.58691871846332 384.088766836098
+ vertex -151.4534943844243 -90.80389821540912 383.0887668354543
+ endloop
+endfacet
+facet normal -0.8660161037049536 -0.5000161078642279 3.459555431113667e-10
+ outer loop
+ vertex -154.42574169840134 -90.78799892151892 383.0887389376584
+ vertex -153.67575846130435 -92.08695219646245 383.0887668359249
+ vertex -154.42575099833098 -90.78798281356829 384.08873893748546
+ endloop
+endfacet
+facet normal -0.8660161037049536 -0.5000161078642279 3.459555431113667e-10
+ outer loop
+ vertex -153.67575845882502 -92.08695220006474 384.088766836098
+ vertex -154.42575099833098 -90.78798281356829 384.08873893748546
+ vertex -153.67575846130435 -92.08695219646245 383.0887668359249
+ endloop
+endfacet
+facet normal 0.8659937807808712 0.5000547686492475 -1.176303183199779e-09
+ outer loop
+ vertex -152.8096657632761 -91.58693482641395 383.08876683627096
+ vertex -153.5597479176202 -90.28794415286977 383.08873893648206
+ vertex -152.80967506320573 -91.58691871846332 384.088766836098
+ endloop
+endfacet
+facet normal 0.8659937807808712 0.5000547686492475 -1.176303183199779e-09
+ outer loop
+ vertex -153.55975721754982 -90.28792804491917 384.08873893630914
+ vertex -152.80967506320573 -91.58691871846332 384.088766836098
+ vertex -153.5597479176202 -90.28794415286977 383.08873893648206
+ endloop
+endfacet
+facet normal -0.7073425807270168 0.7068709027592814 -1.7964477850463886e-05
+ outer loop
+ vertex -151.3604369182135 -90.71077865420341 383.0887662009169
+ vertex -151.4534943844243 -90.80389821540912 383.0887668354543
+ vertex -151.36044621814324 -90.7107625462528 384.08876620074386
+ endloop
+endfacet
+facet normal -0.7073425807270168 0.7068709027592814 -1.7964477850463886e-05
+ outer loop
+ vertex -151.45350368435393 -90.80388210745849 384.08876683528126
+ vertex -151.36044621814324 -90.7107625462528 384.08876620074386
+ vertex -151.4534943844243 -90.80389821540912 383.0887668354543
+ endloop
+endfacet
+facet normal -0.8661921188638244 0.49971112951267393 -1.6104848029167624e-05
+ outer loop
+ vertex -151.29465142418175 -90.59674702056395 383.0887649759014
+ vertex -151.3604369182135 -90.71077865420341 383.0887662009169
+ vertex -151.29466072411145 -90.59673091261335 384.08876497572845
+ endloop
+endfacet
+facet normal -0.8661921188638244 0.49971112951267393 -1.6104848029167624e-05
+ outer loop
+ vertex -151.36044621814324 -90.7107625462528 384.08876620074386
+ vertex -151.29466072411145 -90.59673091261335 384.08876497572845
+ vertex -151.3604369182135 -90.71077865420341 383.0887662009169
+ endloop
+endfacet
+facet normal -0.9660120955504019 0.25849686860281185 -1.3147699347887458e-05
+ outer loop
+ vertex -151.260621075031 -90.46957438187637 383.0887632438907
+ vertex -151.29465142418175 -90.59674702056395 383.0887649759014
+ vertex -151.26063037496064 -90.46955827392577 384.0887632437177
+ endloop
+endfacet
+facet normal -0.9660120955504019 0.25849686860281185 -1.3147699347887458e-05
+ outer loop
+ vertex -151.29466072411145 -90.59673091261335 384.08876497572845
+ vertex -151.26063037496064 -90.46955827392577 384.0887632437177
+ vertex -151.29465142418175 -90.59674702056395 383.0887649759014
+ endloop
+endfacet
+facet normal -0.9999999443367676 -0.00033352671979519616 -9.294556675347816e-06
+ outer loop
+ vertex -151.26066498281867 -90.33792734330467 383.08876112291836
+ vertex -151.260621075031 -90.46957438187637 383.0887632438907
+ vertex -151.2606742827483 -90.33791123535406 384.0887611227454
+ endloop
+endfacet
+facet normal -0.9999999443367676 -0.00033352671979519616 -9.294556675347816e-06
+ outer loop
+ vertex -151.26063037496064 -90.46955827392577 384.0887632437177
+ vertex -151.2606742827483 -90.33791123535406 384.0887611227454
+ vertex -151.260621075031 -90.46957438187637 383.0887632438907
+ endloop
+endfacet
+facet normal -0.9658394494942373 -0.25914119274548375 -4.808005373256879e-06
+ outer loop
+ vertex -151.29478015530137 -90.21077743297054 383.08875875752517
+ vertex -151.26066498281867 -90.33792734330467 383.08876112291836
+ vertex -151.294789455231 -90.21076132501993 384.0887587573522
+ endloop
+endfacet
+facet normal -0.9658394494942373 -0.25914119274548375 -4.808005373256879e-06
+ outer loop
+ vertex -151.2606742827483 -90.33791123535406 384.0887611227454
+ vertex -151.294789455231 -90.21076132501993 384.0887587573522
+ vertex -151.26066498281867 -90.33792734330467 383.08876112291836
+ endloop
+endfacet
+facet normal -0.8660161037050097 -0.5000161078641306 3.4595554214343047e-10
+ outer loop
+ vertex -156.85968835241414 -80.57248770881401 383.08855175117566
+ vertex -151.29478015530137 -90.21077743297054 383.08875875752517
+ vertex -156.85969765234378 -80.5724716008634 384.0885517510027
+ endloop
+endfacet
+facet normal -0.8660161037050097 -0.5000161078641306 3.4595554214343047e-10
+ outer loop
+ vertex -151.294789455231 -90.21076132501993 384.0887587573522
+ vertex -156.85969765234378 -80.5724716008634 384.0885517510027
+ vertex -151.29478015530137 -90.21077743297054 383.08875875752517
+ endloop
+endfacet
+facet normal -0.7099176286020258 -0.7042847155643703 4.742399428611032e-06
+ outer loop
+ vertex -156.9523611134444 -80.4790737452827 383.088549384618
+ vertex -156.85968835241414 -80.57248770881401 383.08855175117566
+ vertex -156.95237041337398 -80.47905763733213 384.088549384445
+ endloop
+endfacet
+facet normal -0.7099176286020258 -0.7042847155643703 4.742399428611032e-06
+ outer loop
+ vertex -156.85969765234378 -80.5724716008634 384.0885517510027
+ vertex -156.95237041337398 -80.47905763733213 384.088549384445
+ vertex -156.85968835241414 -80.57248770881401 383.08855175117566
+ endloop
+endfacet
+facet normal -0.503445474453565 -0.8640269985173652 9.23569673178749e-06
+ outer loop
+ vertex -157.06605343956292 -80.41282826089036 383.0885472602083
+ vertex -156.9523611134444 -80.4790737452827 383.088549384618
+ vertex -157.06606273949254 -80.41281215293975 384.08854726003534
+ endloop
+endfacet
+facet normal -0.503445474453565 -0.8640269985173652 9.23569673178749e-06
+ outer loop
+ vertex -156.95237041337398 -80.47905763733213 384.088549384445
+ vertex -157.06606273949254 -80.41281215293975 384.08854726003534
+ vertex -156.9523611134444 -80.4790737452827 383.088549384618
+ endloop
+endfacet
+facet normal -0.2626643432025935 -0.964887269393866 1.3099596565427166e-05
+ outer loop
+ vertex -157.19301738663054 -80.37826577592243 383.08854552272174
+ vertex -157.06605343956292 -80.41282826089036 383.0885472602083
+ vertex -157.19302668656013 -80.37824966797186 384.08854552254877
+ endloop
+endfacet
+facet normal -0.2626643432025935 -0.964887269393866 1.3099596565427166e-05
+ outer loop
+ vertex -157.06606273949254 -80.41281215293975 384.08854726003534
+ vertex -157.19302668656013 -80.37824966797186 384.08854552254877
+ vertex -157.06605343956292 -80.41282826089036 383.0885472602083
+ endloop
+endfacet
+facet normal -0.00398307103919987 -0.9999920674119505 1.60707805411897e-05
+ outer loop
+ vertex -157.19301738663054 -80.37826577592243 383.08854552272174
+ vertex -157.19302668656013 -80.37824966797186 384.08854552254877
+ vertex -157.32460057147236 -80.37774166661191 383.0885442905651
+ endloop
+endfacet
+facet normal -0.00398307103919987 -0.9999920674119505 1.60707805411897e-05
+ outer loop
+ vertex -157.32460987140195 -80.37772555866131 384.0885442903921
+ vertex -157.32460057147236 -80.37774166661191 383.0885442905651
+ vertex -157.19302668656013 -80.37824966797186 384.08854552254877
+ endloop
+endfacet
+facet normal 0.25496964083812906 -0.9669490586007048 1.79467674031028e-05
+ outer loop
+ vertex -157.32460057147236 -80.37774166661191 383.0885442905651
+ vertex -157.32460987140195 -80.37772555866131 384.0885442903921
+ vertex -157.45183581749254 -80.4112916501428 383.08854364770775
+ endloop
+endfacet
+facet normal 0.25496964083812906 -0.9669490586007048 1.79467674031028e-05
+ outer loop
+ vertex -157.45184511742218 -80.41127554219219 384.0885436475348
+ vertex -157.45183581749254 -80.4112916501428 383.08854364770775
+ vertex -157.32460987140195 -80.37772555866131 384.0885442903921
+ endloop
+endfacet
+facet normal 0.499725310301553 -0.8661839376818655 1.8599858312563285e-05
+ outer loop
+ vertex -157.45183581749254 -80.4112916501428 383.08854364770775
+ vertex -157.45184511742218 -80.41127554219219 384.0885436475348
+ vertex -158.81025166099258 -81.19499906998772 383.0885436384564
+ endloop
+endfacet
+facet normal 0.499725310301553 -0.8661839376818655 1.8599858312563285e-05
+ outer loop
+ vertex -158.81026096092216 -81.1949829620371 384.0885436382834
+ vertex -158.81025166099258 -81.19499906998772 383.0885436384564
+ vertex -157.45184511742218 -80.41127554219219 384.0885436475348
+ endloop
+endfacet
+facet normal 0.8660161037049837 0.5000161078641757 -3.459555431116082e-10
+ outer loop
+ vertex -158.06024982138715 -82.4939845640372 383.0885715374149
+ vertex -158.81025166099258 -81.19499906998772 383.0885436384564
+ vertex -158.06025912131676 -82.4939684560866 384.08857153724193
+ endloop
+endfacet
+facet normal 0.8660161037049837 0.5000161078641757 -3.459555431116082e-10
+ outer loop
+ vertex -158.81026096092216 -81.1949829620371 384.0885436382834
+ vertex -158.06025912131676 -82.4939684560866 384.08857153724193
+ vertex -158.81025166099258 -81.19499906998772 383.0885436384564
+ endloop
+endfacet
+facet normal 0.5000547685627937 -0.8659937806310484 1.8599859210822807e-05
+ outer loop
+ vertex -158.06024982138715 -82.4939845640372 383.0885715374149
+ vertex -158.06025912131676 -82.4939684560866 384.08857153724193
+ vertex -158.92624360216809 -82.99403933268654 383.0885715385912
+ endloop
+endfacet
+facet normal 0.5000547685627937 -0.8659937806310484 1.8599859210822807e-05
+ outer loop
+ vertex -158.9262529020977 -82.99402322473593 384.08857153841825
+ vertex -158.92624360216809 -82.99403933268654 383.0885715385912
+ vertex -158.06025912131676 -82.4939684560866 384.08857153724193
+ endloop
+endfacet
+facet normal -0.8659937807809691 -0.5000547686490778 1.1763031795568804e-09
+ outer loop
+ vertex -159.6763257557595 -81.69504866044524 383.0885436388024
+ vertex -158.92624360216809 -82.99403933268654 383.0885715385912
+ vertex -159.67633505568912 -81.69503255249462 384.0885436386294
+ endloop
+endfacet
+facet normal -0.8659937807809691 -0.5000547686490778 1.1763031795568804e-09
+ outer loop
+ vertex -158.9262529020977 -82.99402322473593 384.08857153841825
+ vertex -159.67633505568912 -81.69503255249462 384.0885436386294
+ vertex -158.92624360216809 -82.99403933268654 383.0885715385912
+ endloop
+endfacet
+facet normal 0.5000161077776379 -0.8660161035552092 1.8599859244801662e-05
+ outer loop
+ vertex -159.6763257557595 -81.69504866044524 383.0885436388024
+ vertex -159.67633505568912 -81.69503255249462 384.0885436386294
+ vertex -161.40835796489552 -82.69508087717003 383.0885436394943
+ endloop
+endfacet
+facet normal 0.5000161077776379 -0.8660161035552092 1.8599859244801662e-05
+ outer loop
+ vertex -161.40836726482513 -82.69506476921941 384.08854363932136
+ vertex -161.40835796489552 -82.69508087717003 383.0885436394943
+ vertex -159.67633505568912 -81.69503255249462 384.0885436386294
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -158.81025166099258 -81.19499906998772 383.0885436384564
+ vertex -159.6763257557595 -81.69504866044524 383.0885436388024
+ vertex -158.06024982138715 -82.4939845640372 383.0885715374149
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -158.92624360216809 -82.99403933268654 383.0885715385912
+ vertex -158.06024982138715 -82.4939845640372 383.0885715374149
+ vertex -159.6763257557595 -81.69504866044524 383.0885436388024
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -153.5597479176202 -90.28794415286977 383.08873893648206
+ vertex -154.42574169840134 -90.78799892151892 383.0887389376584
+ vertex -152.8096657632761 -91.58693482641395 383.08876683627096
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -153.67575846130435 -92.08695219646245 383.0887668359249
+ vertex -152.8096657632761 -91.58693482641395 383.08876683627096
+ vertex -154.42574169840134 -90.78799892151892 383.0887389376584
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -158.81025166099258 -81.19499906998772 383.0885436384564
+ vertex -157.45183581749254 -80.4112916501428 383.08854364770775
+ vertex -156.45533133209193 -72.33073793346169 383.0884227539691
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -157.32460057147236 -80.37774166661191 383.0885442905651
+ vertex -156.45533133209193 -72.33073793346169 383.0884227539691
+ vertex -157.45183581749254 -80.4112916501428 383.08854364770775
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -157.19301738663054 -80.37826577592243 383.08854552272174
+ vertex -156.45533133209193 -72.33073793346169 383.0884227539691
+ vertex -157.32460057147236 -80.37774166661191 383.0885442905651
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -157.06605343956292 -80.41282826089036 383.0885472602083
+ vertex -156.45533133209193 -72.33073793346169 383.0884227539691
+ vertex -157.19301738663054 -80.37826577592243 383.08854552272174
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -156.9523611134444 -80.4790737452827 383.088549384618
+ vertex -156.45533133209193 -72.33073793346169 383.0884227539691
+ vertex -157.06605343956292 -80.41282826089036 383.0885472602083
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -156.85968835241414 -80.57248770881401 383.08855175117566
+ vertex -156.45533133209193 -72.33073793346169 383.0884227539691
+ vertex -156.9523611134444 -80.4790737452827 383.088549384618
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -143.95492863765097 -93.98114052234195 383.08888775045017
+ vertex -156.45533133209193 -72.33073793346169 383.0884227539691
+ vertex -156.85968835241414 -80.57248770881401 383.08855175117566
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -151.29478015530137 -90.21077743297054 383.08875875752517
+ vertex -143.95492863765097 -93.98114052234195 383.08888775045017
+ vertex -156.85968835241414 -80.57248770881401 383.08855175117566
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -151.26066498281867 -90.33792734330467 383.08876112291836
+ vertex -143.95492863765097 -93.98114052234195 383.08888775045017
+ vertex -151.29478015530137 -90.21077743297054 383.08875875752517
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -151.260621075031 -90.46957438187637 383.0887632438907
+ vertex -143.95492863765097 -93.98114052234195 383.08888775045017
+ vertex -151.26066498281867 -90.33792734330467 383.08876112291836
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -151.29465142418175 -90.59674702056395 383.0887649759014
+ vertex -143.95492863765097 -93.98114052234195 383.08888775045017
+ vertex -151.260621075031 -90.46957438187637 383.0887632438907
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -151.3604369182135 -90.71077865420341 383.0887662009169
+ vertex -143.95492863765097 -93.98114052234195 383.08888775045017
+ vertex -151.29465142418175 -90.59674702056395 383.0887649759014
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -151.4534943844243 -90.80389821540912 383.0887668354543
+ vertex -143.95492863765097 -93.98114052234195 383.08888775045017
+ vertex -151.3604369182135 -90.71077865420341 383.0887662009169
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -152.8096657632761 -91.58693482641395 383.08876683627096
+ vertex -143.95492863765097 -93.98114052234195 383.08888775045017
+ vertex -151.4534943844243 -90.80389821540912 383.0887668354543
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -155.40820591701873 -93.08720268367729 383.08876683627096
+ vertex -151.65759124645837 -99.58317881807082 383.08890635358625
+ vertex -153.67575846130435 -92.08695219646245 383.0887668359249
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -152.8096657632761 -91.58693482641395 383.08876683627096
+ vertex -153.67575846130435 -92.08695219646245 383.0887668359249
+ vertex -151.65759124645837 -99.58317881807082 383.08890635358625
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -143.95492863765097 -93.98114052234195 383.08888775045017
+ vertex -152.8096657632761 -91.58693482641395 383.08876683627096
+ vertex -151.65759124645837 -99.58317881807082 383.08890635358625
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -144.32092863357838 -95.34717273376128 383.0889063506554
+ vertex -143.95492863765097 -93.98114052234195 383.08888775045017
+ vertex -151.65759124645837 -99.58317881807082 383.08890635358625
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -157.82136354357462 -71.96473793777064 383.0884041544558
+ vertex -165.15802615645458 -76.20074402208017 383.0884041573866
+ vertex -156.45533133209193 -72.33073793346169 383.0884227539691
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -161.40835796489552 -82.69508087717003 383.0885436394943
+ vertex -156.45533133209193 -72.33073793346169 383.0884227539691
+ vertex -165.15802615645458 -76.20074402208017 383.0884041573866
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -158.81025166099258 -81.19499906998772 383.0885436384564
+ vertex -156.45533133209193 -72.33073793346169 383.0884227539691
+ vertex -161.40835796489552 -82.69508087717003 383.0885436394943
+ endloop
+endfacet
+facet normal -9.29992962333579e-06 1.610795061598839e-05 0.9999999998270227
+ outer loop
+ vertex -159.6763257557595 -81.69504866044524 383.0885436388024
+ vertex -158.81025166099258 -81.19499906998772 383.0885436384564
+ vertex -161.40835796489552 -82.69508087717003 383.0885436394943
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -154.42569054878822 -90.78808751524727 377.5887389386096
+ vertex -153.67569800928226 -92.08705690174371 377.5887668372221
+ vertex -153.5596967680071 -90.28803274659813 377.5887389374333
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -165.15797500684164 -76.20083261580862 377.58840415833777
+ vertex -161.40830681528254 -82.69516947089848 377.5885436404455
+ vertex -156.49781396979148 -71.2006715371674 377.5884041548783
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -159.6762746061464 -81.69513725417359 377.5885436397536
+ vertex -156.49781396979148 -71.2006715371674 377.5884041548783
+ vertex -161.40830681528254 -82.69516947089848 377.5885436404455
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -158.81020051137943 -81.19508766371607 377.5885436394076
+ vertex -156.49781396979148 -71.2006715371674 377.5884041548783
+ vertex -159.6762746061464 -81.69513725417359 377.5885436397536
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -158.92619245255497 -82.99412792641489 377.58857153954244
+ vertex -158.81020051137943 -81.19508766371607 377.5885436394076
+ vertex -159.6762746061464 -81.69513725417359 377.5885436397536
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -157.45178466787942 -80.41138024387115 377.5885436486589
+ vertex -156.49781396979148 -71.2006715371674 377.5884041548783
+ vertex -158.81020051137943 -81.19508766371607 377.5885436394076
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -157.32454942185925 -80.37783026034028 377.58854429151626
+ vertex -156.49781396979148 -71.2006715371674 377.5884041548783
+ vertex -157.45178466787942 -80.41138024387115 377.5885436486589
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -157.19296623701752 -80.37835436965082 377.58854552367296
+ vertex -156.49781396979148 -71.2006715371674 377.5884041548783
+ vertex -157.32454942185925 -80.37783026034028 377.58854429151626
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -157.0660022899498 -80.41291685461871 377.58854726115953
+ vertex -156.49781396979148 -71.2006715371674 377.5884041548783
+ vertex -157.19296623701752 -80.37835436965082 377.58854552367296
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -156.95230996383125 -80.4791623390111 377.58854938556914
+ vertex -156.49781396979148 -71.2006715371674 377.5884041548783
+ vertex -157.0660022899498 -80.41291685461871 377.58854726115953
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -156.85963720280094 -80.5725763025423 377.5885517521269
+ vertex -156.49781396979148 -71.2006715371674 377.5884041548783
+ vertex -156.95230996383125 -80.4791623390111 377.58854938556914
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -151.29472900568828 -90.21086602669891 377.58875875847633
+ vertex -156.49781396979148 -71.2006715371674 377.5884041548783
+ vertex -156.85963720280094 -80.5725763025423 377.5885517521269
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -152.68068510553405 -78.81181647131872 377.5885622538548
+ vertex -156.49781396979148 -71.2006715371674 377.5884041548783
+ vertex -151.29472900568828 -90.21086602669891 377.58875875847633
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -152.24767705368157 -78.56180841738669 377.5885622536818
+ vertex -156.49781396979148 -71.2006715371674 377.5884041548783
+ vertex -152.68068510553405 -78.81181647131872 377.5885622538548
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -151.6575400968454 -99.58326741179927 377.5889063545374
+ vertex -142.9973790597953 -94.58310633315804 377.5889063510778
+ vertex -155.4081547674058 -93.08729127740574 377.5887668372221
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -153.67569800928226 -92.08705690174371 377.5887668372221
+ vertex -155.4081547674058 -93.08729127740574 377.5887668372221
+ vertex -142.9973790597953 -94.58310633315804 377.5889063510778
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -152.809614613663 -91.58702342014229 377.5887668372221
+ vertex -153.67569800928226 -92.08705690174371 377.5887668372221
+ vertex -142.9973790597953 -94.58310633315804 377.5889063510778
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -153.5596967680071 -90.28803274659813 377.5887389374333
+ vertex -153.67569800928226 -92.08705690174371 377.5887668372221
+ vertex -152.809614613663 -91.58702342014229 377.5887668372221
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -151.51056309279548 -90.83701426455075 377.58876683719944
+ vertex -152.809614613663 -91.58702342014229 377.5887668372221
+ vertex -142.9973790597953 -94.58310633315804 377.5889063510778
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -151.45344323481117 -90.80398680913747 377.58876683640545
+ vertex -151.51056309279548 -90.83701426455075 377.58876683719944
+ vertex -142.9973790597953 -94.58310633315804 377.5889063510778
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -151.36038576860037 -90.71086724793176 377.58876620186805
+ vertex -151.45344323481117 -90.80398680913747 377.58876683640545
+ vertex -142.9973790597953 -94.58310633315804 377.5889063510778
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -151.29460027456864 -90.5968356142923 377.5887649768526
+ vertex -151.36038576860037 -90.71086724793176 377.58876620186805
+ vertex -142.9973790597953 -94.58310633315804 377.5889063510778
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -151.26056992541777 -90.46966297560473 377.58876324484186
+ vertex -151.29460027456864 -90.5968356142923 377.5887649768526
+ vertex -142.9973790597953 -94.58310633315804 377.5889063510778
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -151.26061383320555 -90.33801593703302 377.5887611238696
+ vertex -151.26056992541777 -90.46966297560473 377.58876324484186
+ vertex -142.9973790597953 -94.58310633315804 377.5889063510778
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -151.29472900568828 -90.21086602669891 377.58875875847633
+ vertex -151.26061383320555 -90.33801593703302 377.5887611238696
+ vertex -142.9973790597953 -94.58310633315804 377.5889063510778
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -147.68052402775768 -87.4719775068708 377.58874825244726
+ vertex -151.29472900568828 -90.21086602669891 377.58875875847633
+ vertex -142.9973790597953 -94.58310633315804 377.5889063510778
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -152.68068510553405 -78.81181647131872 377.5885622538548
+ vertex -151.29472900568828 -90.21086602669891 377.58875875847633
+ vertex -147.68052402775768 -87.4719775068708 377.58874825244726
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -147.2475159759052 -87.22196945293875 377.5887482522743
+ vertex -147.68052402775768 -87.4719775068708 377.58874825244726
+ vertex -142.9973790597953 -94.58310633315804 377.5889063510778
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -151.32756309483193 -90.1539981588412 377.58875753709685
+ vertex -151.29472900568828 -90.21086602669891 377.58875875847633
+ vertex -156.82774028038585 -80.62782101973391 377.58855293864514
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -156.85963720280094 -80.5725763025423 377.5885517521269
+ vertex -156.82774028038585 -80.62782101973391 377.58855293864514
+ vertex -151.29472900568828 -90.21086602669891 377.58875875847633
+ endloop
+endfacet
+facet normal -9.299929620330117e-06 1.610795061776816e-05 0.9999999998270227
+ outer loop
+ vertex -158.81020051137943 -81.19508766371607 377.5885436394076
+ vertex -158.92619245255497 -82.99412792641489 377.58857153954244
+ vertex -158.06019867177403 -82.49407315776557 377.5885715383661
+ endloop
+endfacet
+facet normal -0.8660161037050138 -0.5000161078641236 3.4595554199262004e-10
+ outer loop
+ vertex -165.15797500684164 -76.20083261580862 377.58840415833777
+ vertex -165.15767275912887 -76.20135612420364 345.08840416395947
+ vertex -161.40830681528254 -82.69516947089848 377.5885436404455
+ endloop
+endfacet
+facet normal -0.8660161037050138 -0.5000161078641236 3.4595554199262004e-10
+ outer loop
+ vertex -161.4080045675698 -82.69569297929348 345.0885436460672
+ vertex -161.40830681528254 -82.69516947089848 377.5885436404455
+ vertex -165.15767275912887 -76.20135612420364 345.08840416395947
+ endloop
+endfacet
+facet normal -0.5000161077776379 0.8660161035552092 -1.8599859244801655e-05
+ outer loop
+ vertex -156.49751172207866 -71.20119504556237 345.0884041604999
+ vertex -165.15767275912887 -76.20135612420364 345.08840416395947
+ vertex -156.49781396979148 -71.2006715371674 377.5884041548783
+ endloop
+endfacet
+facet normal -0.5000161077776379 0.8660161035552092 -1.8599859244801655e-05
+ outer loop
+ vertex -165.15797500684164 -76.20083261580862 377.58840415833777
+ vertex -156.49781396979148 -71.2006715371674 377.5884041548783
+ vertex -165.15767275912887 -76.20135612420364 345.08840416395947
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -147.2475159759052 -87.22196945293875 377.5887482522743
+ vertex -145.477573562092 -90.31477259481457 350.95058335666164
+ vertex -147.24721372819238 -87.22249296133373 345.088748257896
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -145.4025996892026 -90.44452682328128 350.5888147525761
+ vertex -147.24721372819238 -87.22249296133373 345.088748257896
+ vertex -145.477573562092 -90.31477259481457 350.95058335666164
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -145.28341317271986 -90.650976267398 350.27815904985096
+ vertex -147.24721372819238 -87.22249296133373 345.088748257896
+ vertex -145.4025996892026 -90.44452682328128 350.5888147525761
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -147.24721372819238 -87.22249296133373 345.088748257896
+ vertex -145.28341317271986 -90.650976267398 350.27815904985096
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -145.5032254458508 -90.27055611823882 351.3388109295901
+ vertex -145.477573562092 -90.31477259481457 350.95058335666164
+ vertex -147.2475159759052 -87.22196945293875 377.5887482522743
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -145.5043862146047 -90.27079659047236 371.3388109089007
+ vertex -145.5032254458508 -90.27055611823882 351.3388109295901
+ vertex -147.2475159759052 -87.22196945293875 377.5887482522743
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -145.12813637677695 -90.92005173872194 350.0397869212441
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -145.28341317271986 -90.650976267398 350.27815904985096
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.9473511584104 -91.23341618855065 349.88994303339155
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -145.12813637677695 -90.92005173872194 350.0397869212441
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.75337773149027 -91.56971434748758 349.8388389996217
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -144.9473511584104 -91.23341618855065 349.88994303339155
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.5594350645048 -91.9060280517601 349.88995747538263
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -144.75337773149027 -91.56971434748758 349.8388389996217
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.37874002970375 -92.21943807820675 350.0398148210284
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -144.5594350645048 -91.9060280517601 349.88995747538263
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.22360669509604 -92.48858605145969 350.2781985061043
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -144.37874002970375 -92.21943807820675 350.0398148210284
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.10460714106532 -92.69512998192992 350.58886307642
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -144.22360669509604 -92.48858605145969 350.2781985061043
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.02985099056264 -92.82499424208574 350.95063725490604
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -144.10460714106532 -92.69512998192992 350.58886307642
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.0044327517044 -92.86932879720845 351.33886672915867
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -144.02985099056264 -92.82499424208574 350.95063725490604
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.00364398013542 -92.86844400695027 371.33886674292904
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -144.0044327517044 -92.86932879720845 351.33886672915867
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -142.9973790597953 -94.58310633315804 377.5889063510778
+ vertex -145.28465695873095 -90.65121896362321 372.3994792183773
+ vertex -147.2475159759052 -87.22196945293875 377.5887482522743
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -145.4038904470938 -90.44481001456674 372.088814621489
+ vertex -147.2475159759052 -87.22196945293875 377.5887482522743
+ vertex -145.28465695873095 -90.65121896362321 372.3994792183773
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -145.47883600434272 -90.31505502753791 371.72704041352597
+ vertex -147.2475159759052 -87.22196945293875 377.5887482522743
+ vertex -145.4038904470938 -90.44481001456674 372.088814621489
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -145.5043862146047 -90.27079659047236 371.3388109089007
+ vertex -147.2475159759052 -87.22196945293875 377.5887482522743
+ vertex -145.47883600434272 -90.31505502753791 371.72704041352597
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -145.1292611044434 -90.92021544593588 372.63786292531034
+ vertex -145.28465695873095 -90.65121896362321 372.3994792183773
+ vertex -142.9973790597953 -94.58310633315804 377.5889063510778
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.94829285489726 -91.23346779577298 372.7877202866084
+ vertex -145.1292611044434 -90.92021544593588 372.63786292531034
+ vertex -142.9973790597953 -94.58310633315804 377.5889063510778
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.75408489723483 -91.56962838316704 372.8388387707501
+ vertex -144.94829285489726 -91.23346779577298 372.7877202866084
+ vertex -142.9973790597953 -94.58310633315804 377.5889063510778
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.5598721828269 -91.9057884196188 372.7877347375183
+ vertex -144.75408489723483 -91.56962838316704 372.8388387707501
+ vertex -142.9973790597953 -94.58310633315804 377.5889063510778
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.3788899872088 -92.21903915417484 372.6378908423245
+ vertex -144.5598721828269 -91.9057884196188 372.7877347375183
+ vertex -142.9973790597953 -94.58310633315804 377.5889063510778
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.22347194792468 -92.48803306694643 372.39951869899727
+ vertex -144.3788899872088 -92.21903915417484 372.6378908423245
+ vertex -142.9973790597953 -94.58310633315804 377.5889063510778
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.10420954751118 -92.69443866731166 372.08886297517597
+ vertex -144.22347194792468 -92.48803306694643 372.39951869899727
+ vertex -142.9973790597953 -94.58310633315804 377.5889063510778
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.02923032146612 -92.82418975470699 371.72709434505595
+ vertex -144.10420954751118 -92.69443866731166 372.08886297517597
+ vertex -142.9973790597953 -94.58310633315804 377.5889063510778
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.00364398013542 -92.86844400695027 371.33886674292904
+ vertex -144.02923032146612 -92.82418975470699 371.72709434505595
+ vertex -142.9973790597953 -94.58310633315804 377.5889063510778
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -144.00364398013542 -92.86844400695027 371.33886674292904
+ vertex -142.9973790597953 -94.58310633315804 377.5889063510778
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -145.5043862146047 -90.27079659047236 371.3388109089007
+ vertex -145.47879987327406 -90.31505084271564 370.9505833067738
+ vertex -145.5032254458508 -90.27055611823882 351.3388109295901
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -145.47780720699257 -90.31489067336153 351.72704040384275
+ vertex -145.5032254458508 -90.27055611823882 351.3388109295901
+ vertex -145.47879987327406 -90.31505084271564 370.9505833067738
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -145.40382064722897 -90.44480193011097 370.58881467665384
+ vertex -145.47780720699257 -90.31489067336153 351.72704040384275
+ vertex -145.47879987327406 -90.31505084271564 370.9505833067738
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -145.40305105648991 -90.44475493351733 352.0888145823288
+ vertex -145.47780720699257 -90.31489067336153 351.72704040384275
+ vertex -145.40382064722897 -90.44480193011097 370.58881467665384
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -145.28455824681546 -90.6512075304762 370.2781589528325
+ vertex -145.40305105648991 -90.44475493351733 352.0888145823288
+ vertex -145.40382064722897 -90.44480193011097 370.58881467665384
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -145.28405150245916 -90.65129886398756 352.3994791526445
+ vertex -145.40305105648991 -90.44475493351733 352.0888145823288
+ vertex -145.28455824681546 -90.6512075304762 370.2781589528325
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -145.12891816785145 -90.9204468372405 352.63786283772043
+ vertex -145.28405150245916 -90.65129886398756 352.3994791526445
+ vertex -145.28455824681546 -90.6512075304762 370.2781589528325
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -145.12914020753135 -90.92020144324778 370.03978680950524
+ vertex -145.12891816785145 -90.9204468372405 352.63786283772043
+ vertex -145.28455824681546 -90.6512075304762 370.2781589528325
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.9482231330504 -91.23385686368717 352.7877201833662
+ vertex -145.12891816785145 -90.9204468372405 352.63786283772043
+ vertex -145.12914020753135 -90.92020144324778 370.03978680950524
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.94815801191322 -91.23345217780383 369.88994291431146
+ vertex -144.9482231330504 -91.23385686368717 352.7877201833662
+ vertex -145.12914020753135 -90.92020144324778 370.03978680950524
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.75428046606493 -91.57017056795969 352.8388386591271
+ vertex -144.9482231330504 -91.23385686368717 352.7877201833662
+ vertex -144.94815801191322 -91.23345217780383 369.88994291431146
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.7539452975053 -91.56961221425557 369.8388388810797
+ vertex -144.75428046606493 -91.57017056795969 352.8388386591271
+ vertex -144.94815801191322 -91.23345217780383 369.88994291431146
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.5603070391448 -91.90646872689662 352.78773462535725
+ vertex -144.75428046606493 -91.57017056795969 352.8388386591271
+ vertex -144.7539452975053 -91.56961221425557 369.8388388810797
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.55973733984285 -91.90577280164965 369.8899573652214
+ vertex -144.5603070391448 -91.90646872689662 352.78773462535725
+ vertex -144.7539452975053 -91.56961221425557 369.8388388810797
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.37952182077825 -92.21983317672533 352.63789073750473
+ vertex -144.5603070391448 -91.90646872689662 352.78773462535725
+ vertex -144.55973733984285 -91.90577280164965 369.8899573652214
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.37876909029671 -92.21902515148673 370.0398147265194
+ vertex -144.37952182077825 -92.21983317672533 352.63789073750473
+ vertex -144.55973733984285 -91.90577280164965 369.8899573652214
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.22424502483534 -92.48890864804926 352.39951860889784
+ vertex -144.37952182077825 -92.21983317672533 352.63789073750473
+ vertex -144.37876909029671 -92.21902515148673 370.0398147265194
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.2233732360092 -92.48802163379942 370.27819843345253
+ vertex -144.22424502483534 -92.48890864804926 352.39951860889784
+ vertex -144.37876909029671 -92.21902515148673 370.0398147265194
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.1050585083526 -92.69535809216599 352.08886290617266
+ vertex -144.22424502483534 -92.48890864804926 352.39951860889784
+ vertex -144.2233732360092 -92.48802163379942 370.27819843345253
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.10413974764634 -92.69443058285587 370.58886303034075
+ vertex -144.1050585083526 -92.69535809216599 352.08886290617266
+ vertex -144.2233732360092 -92.48802163379942 370.27819843345253
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.03008463546323 -92.82511232063268 351.7270943020871
+ vertex -144.1050585083526 -92.69535809216599 352.08886290617266
+ vertex -144.10413974764634 -92.69443058285587 370.58886303034075
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.02919419039736 -92.82418556988475 370.9506372383038
+ vertex -144.03008463546323 -92.82511232063268 351.7270943020871
+ vertex -144.10413974764634 -92.69443058285587 370.58886303034075
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.0044327517044 -92.86932879720845 351.33886672915867
+ vertex -144.03008463546323 -92.82511232063268 351.7270943020871
+ vertex -144.02919419039736 -92.82418556988475 370.9506372383038
+ endloop
+endfacet
+facet normal 0.8662575566756152 0.49959757022451845 0.0003366424669519788
+ outer loop
+ vertex -144.00364398013542 -92.86844400695027 371.33886674292904
+ vertex -144.0044327517044 -92.86932879720845 351.33886672915867
+ vertex -144.02919419039736 -92.82418556988475 370.9506372383038
+ endloop
+endfacet
+facet normal 0.5000161077776379 -0.8660161035552092 1.8599859244801655e-05
+ outer loop
+ vertex -151.65723784913263 -99.58379092019429 345.0889063601591
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -151.6575400968454 -99.58326741179927 377.5889063545374
+ endloop
+endfacet
+facet normal 0.5000161077776379 -0.8660161035552092 1.8599859244801655e-05
+ outer loop
+ vertex -142.9973790597953 -94.58310633315804 377.5889063510778
+ vertex -151.6575400968454 -99.58326741179927 377.5889063545374
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -158.9258902048422 -82.99465143480991 345.0885715451641
+ vertex -158.8098982636667 -81.19561117211109 345.0885436450293
+ vertex -158.05989642406126 -82.49459666616059 345.08857154398777
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -151.65723784913263 -99.58379092019429 345.0889063601591
+ vertex -155.40785251969302 -93.08781478580076 345.0887668428438
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -153.6753957615695 -92.08758041013873 345.0887668428438
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -155.40785251969302 -93.08781478580076 345.0887668428438
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -152.80931236595023 -91.58754692853732 345.0887668428438
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -153.6753957615695 -92.08758041013873 345.0887668428438
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -153.55939452029432 -90.28855625499315 345.088738943055
+ vertex -152.80931236595023 -91.58754692853732 345.0887668428438
+ vertex -153.6753957615695 -92.08758041013873 345.0887668428438
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -151.5102608450827 -90.83753777294577 345.0887668428211
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -152.80931236595023 -91.58754692853732 345.0887668428438
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -151.4531409870984 -90.80451031753249 345.08876684202716
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -151.5102608450827 -90.83753777294577 345.0887668428211
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -151.36008352088763 -90.71139075632678 345.0887662074897
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -151.4531409870984 -90.80451031753249 345.08876684202716
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -151.29429802685587 -90.59735912268732 345.0887649824743
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -151.36008352088763 -90.71139075632678 345.0887662074897
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -151.260267677705 -90.47018648399975 345.08876325046356
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -151.29429802685587 -90.59735912268732 345.0887649824743
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -151.2603115854928 -90.33853944542805 345.0887611294912
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -151.260267677705 -90.47018648399975 345.08876325046356
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -151.29442675797551 -90.21138953509391 345.08875876409803
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -151.2603115854928 -90.33853944542805 345.0887611294912
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -156.8593349550882 -80.57309981093734 345.0885517577485
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -151.29442675797551 -90.21138953509391 345.08875876409803
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -147.68022178004483 -87.47250101526579 345.08874825806896
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -156.8593349550882 -80.57309981093734 345.0885517577485
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -147.24721372819238 -87.22249296133373 345.088748257896
+ vertex -142.99707681208244 -94.583629841553 345.0889063566995
+ vertex -147.68022178004483 -87.47250101526579 345.08874825806896
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -161.4080045675698 -82.69569297929348 345.0885436460672
+ vertex -165.15767275912887 -76.20135612420364 345.08840416395947
+ vertex -159.67597235843363 -81.69566076256861 345.0885436453753
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -156.49751172207866 -71.20119504556237 345.0884041604999
+ vertex -159.67597235843363 -81.69566076256861 345.0885436453753
+ vertex -165.15767275912887 -76.20135612420364 345.08840416395947
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -158.8098982636667 -81.19561117211109 345.0885436450293
+ vertex -159.67597235843363 -81.69566076256861 345.0885436453753
+ vertex -156.49751172207866 -71.20119504556237 345.0884041604999
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -158.9258902048422 -82.99465143480991 345.0885715451641
+ vertex -159.67597235843363 -81.69566076256861 345.0885436453753
+ vertex -158.8098982636667 -81.19561117211109 345.0885436450293
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -157.45148242016668 -80.41190375226617 345.0885436542806
+ vertex -158.8098982636667 -81.19561117211109 345.0885436450293
+ vertex -156.49751172207866 -71.20119504556237 345.0884041604999
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -157.32424717414648 -80.3783537687353 345.08854429713796
+ vertex -157.45148242016668 -80.41190375226617 345.0885436542806
+ vertex -156.49751172207866 -71.20119504556237 345.0884041604999
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -157.19266398930475 -80.37887787804584 345.08854552929466
+ vertex -157.32424717414648 -80.3783537687353 345.08854429713796
+ vertex -156.49751172207866 -71.20119504556237 345.0884041604999
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -157.06570004223704 -80.41344036301373 345.08854726678123
+ vertex -157.19266398930475 -80.37887787804584 345.08854552929466
+ vertex -156.49751172207866 -71.20119504556237 345.0884041604999
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -156.95200771611852 -80.47968584740612 345.08854939119084
+ vertex -157.06570004223704 -80.41344036301373 345.08854726678123
+ vertex -156.49751172207866 -71.20119504556237 345.0884041604999
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -156.8593349550882 -80.57309981093734 345.0885517577485
+ vertex -156.95200771611852 -80.47968584740612 345.08854939119084
+ vertex -156.49751172207866 -71.20119504556237 345.0884041604999
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -152.68038285782123 -78.81233997971371 345.0885622594765
+ vertex -156.8593349550882 -80.57309981093734 345.0885517577485
+ vertex -156.49751172207866 -71.20119504556237 345.0884041604999
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -147.68022178004483 -87.47250101526579 345.08874825806896
+ vertex -156.8593349550882 -80.57309981093734 345.0885517577485
+ vertex -152.68038285782123 -78.81233997971371 345.0885622594765
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -152.24737480596875 -78.56233192578165 345.0885622593035
+ vertex -152.68038285782123 -78.81233997971371 345.0885622594765
+ vertex -156.49751172207866 -71.20119504556237 345.0884041604999
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -151.3272608471192 -90.15452166723622 345.0887575427185
+ vertex -156.8274380326731 -80.62834452812892 345.08855294426684
+ vertex -151.29442675797551 -90.21138953509391 345.08875876409803
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -156.8593349550882 -80.57309981093734 345.0885517577485
+ vertex -151.29442675797551 -90.21138953509391 345.08875876409803
+ vertex -156.8274380326731 -80.62834452812892 345.08855294426684
+ endloop
+endfacet
+facet normal 9.299929622343787e-06 -1.610795061656111e-05 -0.9999999998270227
+ outer loop
+ vertex -153.6753957615695 -92.08758041013873 345.0887668428438
+ vertex -154.4253883010755 -90.78861102364229 345.0887389442313
+ vertex -153.55939452029432 -90.28855625499315 345.088738943055
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595540321474196e-10
+ outer loop
+ vertex -152.68038285782123 -78.81233997971371 345.0885622594765
+ vertex -152.68068510553405 -78.81181647131872 377.5885622538548
+ vertex -147.68022178004483 -87.47250101526579 345.08874825806896
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595540321474196e-10
+ outer loop
+ vertex -147.68052402775768 -87.4719775068708 377.58874825244726
+ vertex -147.68022178004483 -87.47250101526579 345.08874825806896
+ vertex -152.68068510553405 -78.81181647131872 377.5885622538548
+ endloop
+endfacet
+facet normal 0.5000161077776379 -0.8660161035552092 1.8599859244801655e-05
+ outer loop
+ vertex -152.68038285782123 -78.81233997971371 345.0885622594765
+ vertex -152.24737480596875 -78.56233192578165 345.0885622593035
+ vertex -152.68068510553405 -78.81181647131872 377.5885622538548
+ endloop
+endfacet
+facet normal 0.5000161077776379 -0.8660161035552092 1.8599859244801655e-05
+ outer loop
+ vertex -152.24767705368157 -78.56180841738669 377.5885622536818
+ vertex -152.68068510553405 -78.81181647131872 377.5885622538548
+ vertex -152.24737480596875 -78.56233192578165 345.0885622593035
+ endloop
+endfacet
+facet normal -0.5000161077776379 0.8660161035552092 -1.8599859244801655e-05
+ outer loop
+ vertex -147.24721372819238 -87.22249296133373 345.088748257896
+ vertex -147.68022178004483 -87.47250101526579 345.08874825806896
+ vertex -147.2475159759052 -87.22196945293875 377.5887482522743
+ endloop
+endfacet
+facet normal -0.5000161077776379 0.8660161035552092 -1.8599859244801655e-05
+ outer loop
+ vertex -147.68052402775768 -87.4719775068708 377.58874825244726
+ vertex -147.2475159759052 -87.22196945293875 377.5887482522743
+ vertex -147.68022178004483 -87.47250101526579 345.08874825806896
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -155.5026635914367 -72.94972334147484 351.3384390085888
+ vertex -155.50504567369617 -72.95066962730404 371.3384388885209
+ vertex -155.47711074836303 -72.99398026263177 351.7266685268376
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -155.47944509630995 -72.99491564782882 370.95021132737423
+ vertex -155.47711074836303 -72.99398026263177 351.7266685268376
+ vertex -155.50504567369617 -72.95066962730404 371.3384388885209
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -155.40218638217274 -73.12374749719685 352.088442746322
+ vertex -155.47711074836303 -72.99398026263177 351.7266685268376
+ vertex -155.47944509630995 -72.99491564782882 370.95021132737423
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -155.40442961769435 -73.12464576820034 370.58844273702243
+ vertex -155.40218638217274 -73.12374749719685 352.088442746322
+ vertex -155.47944509630995 -72.99491564782882 370.95021132737423
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -155.2829964646033 -73.33018162258502 352.3991073518441
+ vertex -155.40218638217274 -73.12374749719685 352.088442746322
+ vertex -155.40442961769435 -73.12464576820034 370.58844273702243
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -155.28511141874793 -73.33101909510428 370.27778704904705
+ vertex -155.2829964646033 -73.33018162258502 352.3991073518441
+ vertex -155.40442961769435 -73.12464576820034 370.58844273702243
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -155.12766359156643 -73.5992144942996 352.6374910639352
+ vertex -155.2829964646033 -73.33018162258502 352.3991073518441
+ vertex -155.28511141874793 -73.33101909510428 370.27778704904705
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -155.12962183754632 -73.59997162736029 370.03941493520085
+ vertex -155.12766359156643 -73.5992144942996 352.6374910639352
+ vertex -155.28511141874793 -73.33101909510428 370.27778704904705
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.94677344165987 -73.91251196673105 352.78734842656394
+ vertex -155.12766359156643 -73.5992144942996 352.6374910639352
+ vertex -155.12962183754632 -73.59997162736029 370.03941493520085
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.94855723208974 -73.91317469436022 369.88957106111394
+ vertex -154.94677344165987 -73.91251196673105 352.78734842656394
+ vertex -155.12962183754632 -73.59997162736029 370.03941493520085
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.75265337966465 -74.24872333488173 352.8384669081182
+ vertex -154.94677344165987 -73.91251196673105 352.78734842656394
+ vertex -154.94855723208974 -73.91317469436022 369.88957106111394
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.75425685601658 -74.24928402468048 369.8384670391765
+ vertex -154.75265337966465 -74.24872333488173 352.8384669081182
+ vertex -154.94855723208974 -73.91317469436022 369.88957106111394
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.5585323670072 -74.58493634962777 352.7873628685574
+ vertex -154.75265337966465 -74.24872333488173 352.8384669081182
+ vertex -154.75425685601658 -74.24928402468048 369.8384670391765
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.5599619588598 -74.58539432290675 369.88958552403034
+ vertex -154.5585323670072 -74.58493634962777 352.7873628685574
+ vertex -154.75425685601658 -74.24928402468048 369.8384670391765
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.378913416773 -74.89860022766337 370.0394428754099
+ vertex -154.5585323670072 -74.58493634962777 352.7873628685574
+ vertex -154.5599619588598 -74.58539432290675 369.88958552403034
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.37763942989997 -74.89823864963242 352.63751896372406
+ vertex -154.5585323670072 -74.58493634962777 352.7873628685574
+ vertex -154.378913416773 -74.89860022766337 370.0394428754099
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.22344938870256 -75.16755727413847 370.27782656246967
+ vertex -154.37763942989997 -74.89823864963242 352.63751896372406
+ vertex -154.378913416773 -74.89860022766337 370.0394428754099
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.22230212306707 -75.16727920090698 352.39914680810386
+ vertex -154.37763942989997 -74.89823864963242 352.63751896372406
+ vertex -154.22344938870256 -75.16755727413847 370.27782656246967
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.1041644912451 -75.37393648408727 370.5884911308841
+ vertex -154.22230212306707 -75.16727920090698 352.39914680810386
+ vertex -154.22344938870256 -75.16755727413847 370.27782656246967
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.10310642726216 -75.37372333449257 352.08849107017386
+ vertex -154.22230212306707 -75.16727920090698 352.39914680810386
+ vertex -154.1041644912451 -75.37393648408727 370.5884911308841
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.0291877930347 -75.50367345540958 370.95026530371337
+ vertex -154.10310642726216 -75.37372333449257 352.08849107017386
+ vertex -154.1041644912451 -75.37393648408727 370.5884911308841
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.02817533217413 -75.50350222385038 351.7267224250909
+ vertex -154.10310642726216 -75.37372333449257 352.08849107017386
+ vertex -154.0291877930347 -75.50367345540958 370.95026530371337
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.0036288321495 -75.5479268279102 371.3384947689391
+ vertex -154.02817533217413 -75.50350222385038 351.7267224250909
+ vertex -154.0291877930347 -75.50367345540958 370.95026530371337
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.00261526810377 -75.5477716521405 351.3384948081665
+ vertex -154.02817533217413 -75.50350222385038 351.7267224250909
+ vertex -154.0036288321495 -75.5479268279102 371.3384947689391
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -156.49781396979148 -71.2006715371674 377.5884041548783
+ vertex -155.5026635914367 -72.94972334147484 351.3384390085888
+ vertex -156.49751172207866 -71.20119504556237 345.0884041604999
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -155.47710352736632 -72.99399276976496 350.9502113916644
+ vertex -156.49751172207866 -71.20119504556237 345.0884041604999
+ vertex -155.5026635914367 -72.94972334147484 351.3384390085888
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -155.4021724322783 -73.12377165912278 350.58844274658145
+ vertex -156.49751172207866 -71.20119504556237 345.0884041604999
+ vertex -155.47710352736632 -72.99399276976496 350.9502113916644
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -155.2829767364734 -73.33021579270834 350.2777870086514
+ vertex -156.49751172207866 -71.20119504556237 345.0884041604999
+ vertex -155.4021724322783 -73.12377165912278 350.58844274658145
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -152.24737480596875 -78.56233192578165 345.0885622593035
+ vertex -156.49751172207866 -71.20119504556237 345.0884041604999
+ vertex -155.2829767364734 -73.33021579270834 350.2777870086514
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -155.12763942964048 -73.5992563439829 350.03941485303125
+ vertex -152.24737480596875 -78.56233192578165 345.0885622593035
+ vertex -155.2829767364734 -73.33021579270834 350.2777870086514
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.94674649253326 -73.91255864398757 349.88957094819796
+ vertex -152.24737480596875 -78.56233192578165 345.0885622593035
+ vertex -155.12763942964048 -73.5992563439829 350.03941485303125
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.7526254798758 -74.24877165873359 349.8384669086371
+ vertex -152.24737480596875 -78.56233192578165 345.0885622593035
+ vertex -154.94674649253326 -73.91255864398757 349.88957094819796
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.55850541788058 -74.58498302688429 349.88958539019137
+ vertex -152.24737480596875 -78.56233192578165 345.0885622593035
+ vertex -154.7526254798758 -74.24877165873359 349.8384669086371
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.37761526797402 -74.89828049931573 350.0394427528201
+ vertex -152.24737480596875 -78.56233192578165 345.0885622593035
+ vertex -154.55850541788058 -74.58498302688429 349.88958539019137
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.22228239493717 -75.1673133710303 350.2778264649112
+ vertex -152.24737480596875 -78.56233192578165 345.0885622593035
+ vertex -154.37761526797402 -74.89828049931573 350.0394427528201
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.1030924773677 -75.37374749641849 350.5884910704333
+ vertex -152.24737480596875 -78.56233192578165 345.0885622593035
+ vertex -154.22228239493717 -75.1673133710303 350.2778264649112
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.02816811117742 -75.50351473098357 350.95026528991764
+ vertex -152.24737480596875 -78.56233192578165 345.0885622593035
+ vertex -154.1030924773677 -75.37374749641849 350.5884910704333
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.00261526810377 -75.5477716521405 351.3384948081665
+ vertex -152.24737480596875 -78.56233192578165 345.0885622593035
+ vertex -154.02816811117742 -75.50351473098357 350.95026528991764
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -152.24767705368157 -78.56180841738669 377.5885622536818
+ vertex -155.2852251171431 -73.33103918107577 372.3991070949903
+ vertex -156.49781396979148 -71.2006715371674 377.5884041548783
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -155.4045100146006 -73.12465997112697 372.0884425265758
+ vertex -156.49781396979148 -71.2006715371674 377.5884041548783
+ vertex -155.2852251171431 -73.33103918107577 372.3991070949903
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -155.47948671281097 -72.99492299980464 371.7266683537466
+ vertex -156.49781396979148 -71.2006715371674 377.5884041548783
+ vertex -155.4045100146006 -73.12465997112697 372.0884425265758
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -155.50504567369617 -72.95066962730404 371.3384388885209
+ vertex -156.49781396979148 -71.2006715371674 377.5884041548783
+ vertex -155.47948671281097 -72.99492299980464 371.7266683537466
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -155.5026635914367 -72.94972334147484 351.3384390085888
+ vertex -156.49781396979148 -71.2006715371674 377.5884041548783
+ vertex -155.50504567369617 -72.95066962730404 371.3384388885209
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -155.12976108907267 -73.59999622755086 372.63749078205
+ vertex -155.2852251171431 -73.33103918107577 372.3991070949903
+ vertex -152.24767705368157 -78.56180841738669 377.5885622536818
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.9487125469859 -73.91320213230748 372.7873481334296
+ vertex -155.12976108907267 -73.59999622755086 372.63749078205
+ vertex -152.24767705368157 -78.56180841738669 377.5885622536818
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.75441764982907 -74.24931243053375 372.83846661828346
+ vertex -154.9487125469859 -73.91320213230748 372.7873481334296
+ vertex -152.24767705368157 -78.56180841738669 377.5885622536818
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.5601172737559 -74.58542176085402 372.78736259634604
+ vertex -154.75441764982907 -74.24931243053375 372.83846661828346
+ vertex -152.24767705368157 -78.56180841738669 377.5885622536818
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.37905266829935 -74.89862482785394 372.63751872225913
+ vertex -154.5601172737559 -74.58542176085402 372.78736259634604
+ vertex -152.24767705368157 -78.56180841738669 377.5885622536818
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.22356308709774 -75.16757736010995 372.39914660841293
+ vertex -154.37905266829935 -74.89862482785394 372.63751872225913
+ vertex -152.24767705368157 -78.56180841738669 377.5885622536818
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.10424488815133 -75.37395068701389 372.08849092043755
+ vertex -154.22356308709774 -75.16757736010995 372.39914660841293
+ vertex -152.24767705368157 -78.56180841738669 377.5885622536818
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.02922940953573 -75.50368080738541 371.72672233008575
+ vertex -154.10424488815133 -75.37395068701389 372.08849092043755
+ vertex -152.24767705368157 -78.56180841738669 377.5885622536818
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.0036288321495 -75.5479268279102 371.3384947689391
+ vertex -154.02922940953573 -75.50368080738541 371.72672233008575
+ vertex -152.24767705368157 -78.56180841738669 377.5885622536818
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -154.00261526810377 -75.5477716521405 351.3384948081665
+ vertex -154.0036288321495 -75.5479268279102 371.3384947689391
+ vertex -152.24767705368157 -78.56180841738669 377.5885622536818
+ endloop
+endfacet
+facet normal 0.8657525189240949 0.5004723502463931 5.1141337947807905e-05
+ outer loop
+ vertex -152.24737480596875 -78.56233192578165 345.0885622593035
+ vertex -154.00261526810377 -75.5477716521405 351.3384948081665
+ vertex -152.24767705368157 -78.56180841738669 377.5885622536818
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262004e-10
+ outer loop
+ vertex -158.96672800625674 -74.94978777293132 351.3384390099726
+ vertex -158.9411751631831 -74.99404469408826 351.72666852822147
+ vertex -158.94116794218635 -74.99405720122145 350.9502113930482
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262004e-10
+ outer loop
+ vertex -158.86623684709835 -75.12383609057927 350.58844274796525
+ vertex -158.94116794218635 -74.99405720122145 350.9502113930482
+ vertex -158.9411751631831 -74.99404469408826 351.72666852822147
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262004e-10
+ outer loop
+ vertex -158.86625079699277 -75.12381192865335 352.08844274770587
+ vertex -158.86623684709835 -75.12383609057927 350.58844274796525
+ vertex -158.9411751631831 -74.99404469408826 351.72666852822147
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262004e-10
+ outer loop
+ vertex -158.74704115129344 -75.33028022416484 350.2777870100352
+ vertex -158.86623684709835 -75.12383609057927 350.58844274796525
+ vertex -158.86625079699277 -75.12381192865335 352.08844274770587
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262004e-10
+ outer loop
+ vertex -158.74706087942334 -75.33024605404151 352.3991073532279
+ vertex -158.74704115129344 -75.33028022416484 350.2777870100352
+ vertex -158.86625079699277 -75.12381192865335 352.08844274770587
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262004e-10
+ outer loop
+ vertex -158.59170384446054 -75.5993207754394 350.03941485441504
+ vertex -158.74704115129344 -75.33028022416484 350.2777870100352
+ vertex -158.74706087942334 -75.33024605404151 352.3991073532279
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262004e-10
+ outer loop
+ vertex -158.59172800638646 -75.59927892575608 352.637491065319
+ vertex -158.59170384446054 -75.5993207754394 350.03941485441504
+ vertex -158.74706087942334 -75.33024605404151 352.3991073532279
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262004e-10
+ outer loop
+ vertex -158.4108109073533 -75.91262307544405 349.88957094958175
+ vertex -158.59170384446054 -75.5993207754394 350.03941485441504
+ vertex -158.59172800638646 -75.59927892575608 352.637491065319
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262004e-10
+ outer loop
+ vertex -158.41083785647993 -75.91257639818753 352.7873484279478
+ vertex -158.4108109073533 -75.91262307544405 349.88957094958175
+ vertex -158.59172800638646 -75.59927892575608 352.637491065319
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262004e-10
+ outer loop
+ vertex -158.21668989469583 -76.24883609019008 349.83846691002094
+ vertex -158.4108109073533 -75.91262307544405 349.88957094958175
+ vertex -158.41083785647993 -75.91257639818753 352.7873484279478
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262004e-10
+ outer loop
+ vertex -158.2167177944847 -76.24878776633824 352.8384669095021
+ vertex -158.21668989469583 -76.24883609019008 349.83846691002094
+ vertex -158.41083785647993 -75.91257639818753 352.7873484279478
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262004e-10
+ outer loop
+ vertex -158.02256983270064 -76.58504745834078 349.88958539157517
+ vertex -158.21668989469583 -76.24883609019008 349.83846691002094
+ vertex -158.2167177944847 -76.24878776633824 352.8384669095021
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262004e-10
+ outer loop
+ vertex -158.02259678182725 -76.58500078108426 352.7873628699412
+ vertex -158.02256983270064 -76.58504745834078 349.88958539157517
+ vertex -158.2167177944847 -76.24878776633824 352.8384669095021
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262004e-10
+ outer loop
+ vertex -157.84167968279408 -76.89834493077223 350.03944275420395
+ vertex -158.02256983270064 -76.58504745834078 349.88958539157517
+ vertex -158.02259678182725 -76.58500078108426 352.7873628699412
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262004e-10
+ outer loop
+ vertex -157.84170384472 -76.89830308108891 352.63751896510786
+ vertex -157.84167968279408 -76.89834493077223 350.03944275420395
+ vertex -158.02259678182725 -76.58500078108426 352.7873628699412
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262004e-10
+ outer loop
+ vertex -157.68634680975723 -77.1673778024868 350.277826466295
+ vertex -157.84167968279408 -76.89834493077223 350.03944275420395
+ vertex -157.84170384472 -76.89830308108891 352.63751896510786
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262004e-10
+ outer loop
+ vertex -157.68636653788712 -77.16734363236347 352.3991468094877
+ vertex -157.68634680975723 -77.1673778024868 350.277826466295
+ vertex -157.84170384472 -76.89830308108891 352.63751896510786
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262004e-10
+ outer loop
+ vertex -157.56715689218777 -77.37381192787498 350.5884910718171
+ vertex -157.68634680975723 -77.1673778024868 350.277826466295
+ vertex -157.68636653788712 -77.16734363236347 352.3991468094877
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262004e-10
+ outer loop
+ vertex -157.5671708420822 -77.37378776594905 352.08849107155766
+ vertex -157.56715689218777 -77.37381192787498 350.5884910718171
+ vertex -157.68636653788712 -77.16734363236347 352.3991468094877
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262004e-10
+ outer loop
+ vertex -157.49223252599748 -77.50357916244005 350.95026529130143
+ vertex -157.56715689218777 -77.37381192787498 350.5884910718171
+ vertex -157.5671708420822 -77.37378776594905 352.08849107155766
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262004e-10
+ outer loop
+ vertex -157.4922397469942 -77.50356665530687 351.72672242647474
+ vertex -157.49223252599748 -77.50357916244005 350.95026529130143
+ vertex -157.5671708420822 -77.37378776594905 352.08849107155766
+ endloop
+endfacet
+facet normal 0.8660161037050138 0.5000161078641236 -3.4595554199262004e-10
+ outer loop
+ vertex -157.46667968292383 -77.54783608359699 351.33849480955035
+ vertex -157.49223252599748 -77.50357916244005 350.95026529130143
+ vertex -157.4922397469942 -77.50356665530687 351.72672242647474
+ endloop
+endfacet
+facet normal -0.3966951107432722 0.6870665744005845 0.6087466726429225
+ outer loop
+ vertex -154.22228239493717 -75.1673133710303 350.2778264649112
+ vertex -157.68634680975723 -77.1673778024868 350.277826466295
+ vertex -154.1030924773677 -75.37374749641849 350.5884910704333
+ endloop
+endfacet
+facet normal -0.3966951107432722 0.6870665744005845 0.6087466726429225
+ outer loop
+ vertex -157.56715689218777 -77.37381192787498 350.5884910718171
+ vertex -154.1030924773677 -75.37374749641849 350.5884910704333
+ vertex -157.68634680975723 -77.1673778024868 350.277826466295
+ endloop
+endfacet
+facet normal -0.3043978984283068 0.5272099800412291 0.7933420172771369
+ outer loop
+ vertex -157.84167968279408 -76.89834493077223 350.03944275420395
+ vertex -157.68634680975723 -77.1673778024868 350.277826466295
+ vertex -154.37761526797402 -74.89828049931573 350.0394427528201
+ endloop
+endfacet
+facet normal -0.3043978984283068 0.5272099800412291 0.7933420172771369
+ outer loop
+ vertex -154.22228239493717 -75.1673133710303 350.2778264649112
+ vertex -154.37761526797402 -74.89828049931573 350.0394427528201
+ vertex -157.68634680975723 -77.1673778024868 350.277826466295
+ endloop
+endfacet
+facet normal -0.19135647237682485 0.3314248967978557 0.9238724144934884
+ outer loop
+ vertex -158.02256983270064 -76.58504745834078 349.88958539157517
+ vertex -157.84167968279408 -76.89834493077223 350.03944275420395
+ vertex -154.55850541788058 -74.58498302688429 349.88958539019137
+ endloop
+endfacet
+facet normal -0.19135647237682485 0.3314248967978557 0.9238724144934884
+ outer loop
+ vertex -154.37761526797402 -74.89828049931573 350.0394427528201
+ vertex -154.55850541788058 -74.58498302688429 349.88958539019137
+ vertex -157.84167968279408 -76.89834493077223 350.03944275420395
+ endloop
+endfacet
+facet normal -0.06527441896433545 0.11305375454316116 0.9914424334335117
+ outer loop
+ vertex -158.21668989469583 -76.24883609019008 349.83846691002094
+ vertex -158.02256983270064 -76.58504745834078 349.88958539157517
+ vertex -154.7526254798758 -74.24877165873359 349.8384669086371
+ endloop
+endfacet
+facet normal -0.06527441896433545 0.11305375454316116 0.9914424334335117
+ outer loop
+ vertex -154.55850541788058 -74.58498302688429 349.88958539019137
+ vertex -154.7526254798758 -74.24877165873359 349.8384669086371
+ vertex -158.02256983270064 -76.58504745834078 349.88958539157517
+ endloop
+endfacet
+facet normal 0.06525597822946307 -0.11302181425343016 0.9914472889711177
+ outer loop
+ vertex -158.4108109073533 -75.91262307544405 349.88957094958175
+ vertex -158.21668989469583 -76.24883609019008 349.83846691002094
+ vertex -154.94674649253326 -73.91255864398757 349.88957094819796
+ endloop
+endfacet
+facet normal 0.06525597822946307 -0.11302181425343016 0.9914472889711177
+ outer loop
+ vertex -154.7526254798758 -74.24877165873359 349.8384669086371
+ vertex -154.94674649253326 -73.91255864398757 349.88957094819796
+ vertex -158.21668989469583 -76.24883609019008 349.83846691002094
+ endloop
+endfacet
+facet normal 0.19133928834755926 -0.33139513318608604 0.9238866502094432
+ outer loop
+ vertex -158.59170384446054 -75.5993207754394 350.03941485441504
+ vertex -158.4108109073533 -75.91262307544405 349.88957094958175
+ vertex -155.12763942964048 -73.5992563439829 350.03941485303125
+ endloop
+endfacet
+facet normal 0.19133928834755926 -0.33139513318608604 0.9238866502094432
+ outer loop
+ vertex -154.94674649253326 -73.91255864398757 349.88957094819796
+ vertex -155.12763942964048 -73.5992563439829 350.03941485303125
+ vertex -158.4108109073533 -75.91262307544405 349.88957094958175
+ endloop
+endfacet
+facet normal 0.3043831421678627 -0.5271844214484077 0.7933646630308955
+ outer loop
+ vertex -158.74704115129344 -75.33028022416484 350.2777870100352
+ vertex -158.59170384446054 -75.5993207754394 350.03941485441504
+ vertex -155.2829767364734 -73.33021579270834 350.2777870086514
+ endloop
+endfacet
+facet normal 0.3043831421678627 -0.5271844214484077 0.7933646630308955
+ outer loop
+ vertex -155.12763942964048 -73.5992563439829 350.03941485303125
+ vertex -155.2829767364734 -73.33021579270834 350.2777870086514
+ vertex -158.59170384446054 -75.5993207754394 350.03941485441504
+ endloop
+endfacet
+facet normal 0.396683787866367 -0.6870469626024952 0.6087761851638718
+ outer loop
+ vertex -158.74704115129344 -75.33028022416484 350.2777870100352
+ vertex -155.2829767364734 -73.33021579270834 350.2777870086514
+ vertex -158.86623684709835 -75.12383609057927 350.58844274796525
+ endloop
+endfacet
+facet normal 0.396683787866367 -0.6870469626024952 0.6087761851638718
+ outer loop
+ vertex -155.4021724322783 -73.12377165912278 350.58844274658145
+ vertex -158.86623684709835 -75.12383609057927 350.58844274796525
+ vertex -155.2829767364734 -73.33021579270834 350.2777870086514
+ endloop
+endfacet
+facet normal 0.46195108897273734 -0.8000883886540183 0.3827006163281142
+ outer loop
+ vertex -158.86623684709835 -75.12383609057927 350.58844274796525
+ vertex -155.4021724322783 -73.12377165912278 350.58844274658145
+ vertex -158.94116794218635 -74.99405720122145 350.9502113930482
+ endloop
+endfacet
+facet normal 0.46195108897273734 -0.8000883886540183 0.3827006163281142
+ outer loop
+ vertex -155.47710352736632 -72.99399276976496 350.9502113916644
+ vertex -158.94116794218635 -74.99405720122145 350.9502113930482
+ vertex -155.4021724322783 -73.12377165912278 350.58844274658145
+ endloop
+endfacet
+facet normal 0.4957371867758675 -0.8586051132273177 0.13054463293239457
+ outer loop
+ vertex -158.94116794218635 -74.99405720122145 350.9502113930482
+ vertex -155.47710352736632 -72.99399276976496 350.9502113916644
+ vertex -158.96672800625674 -74.94978777293132 351.3384390099726
+ endloop
+endfacet
+facet normal 0.4957371867758675 -0.8586051132273177 0.13054463293239457
+ outer loop
+ vertex -155.5026635914367 -72.94972334147484 351.3384390085888
+ vertex -158.96672800625674 -74.94978777293132 351.3384390099726
+ vertex -155.47710352736632 -72.99399276976496 350.9502113916644
+ endloop
+endfacet
+facet normal 0.4957396145446709 -0.8586093182462345 -0.13050775146265353
+ outer loop
+ vertex -158.96672800625674 -74.94978777293132 351.3384390099726
+ vertex -155.5026635914367 -72.94972334147484 351.3384390085888
+ vertex -158.9411751631831 -74.99404469408826 351.72666852822147
+ endloop
+endfacet
+facet normal 0.4957396145446709 -0.8586093182462345 -0.13050775146265353
+ outer loop
+ vertex -155.47711074836303 -72.99398026263177 351.7266685268376
+ vertex -158.9411751631831 -74.99404469408826 351.72666852822147
+ vertex -155.5026635914367 -72.94972334147484 351.3384390085888
+ endloop
+endfacet
+facet normal 0.46195820683071537 -0.8001007171456785 -0.38266624826958645
+ outer loop
+ vertex -158.9411751631831 -74.99404469408826 351.72666852822147
+ vertex -155.47711074836303 -72.99398026263177 351.7266685268376
+ vertex -158.86625079699277 -75.12381192865335 352.08844274770587
+ endloop
+endfacet
+facet normal 0.46195820683071537 -0.8001007171456785 -0.38266624826958645
+ outer loop
+ vertex -155.40218638217274 -73.12374749719685 352.088442746322
+ vertex -158.86625079699277 -75.12381192865335 352.08844274770587
+ vertex -155.47711074836303 -72.99398026263177 351.7266685268376
+ endloop
+endfacet
+facet normal 0.3966951107432722 -0.6870665744005845 -0.6087466726429225
+ outer loop
+ vertex -158.86625079699277 -75.12381192865335 352.08844274770587
+ vertex -155.40218638217274 -73.12374749719685 352.088442746322
+ vertex -158.74706087942334 -75.33024605404151 352.3991073532279
+ endloop
+endfacet
+facet normal 0.3966951107432722 -0.6870665744005845 -0.6087466726429225
+ outer loop
+ vertex -155.2829964646033 -73.33018162258502 352.3991073518441
+ vertex -158.74706087942334 -75.33024605404151 352.3991073532279
+ vertex -155.40218638217274 -73.12374749719685 352.088442746322
+ endloop
+endfacet
+facet normal 0.3043978984283068 -0.5272099800412291 -0.7933420172771369
+ outer loop
+ vertex -158.59172800638646 -75.59927892575608 352.637491065319
+ vertex -158.74706087942334 -75.33024605404151 352.3991073532279
+ vertex -155.12766359156643 -73.5992144942996 352.6374910639352
+ endloop
+endfacet
+facet normal 0.3043978984283068 -0.5272099800412291 -0.7933420172771369
+ outer loop
+ vertex -155.2829964646033 -73.33018162258502 352.3991073518441
+ vertex -155.12766359156643 -73.5992144942996 352.6374910639352
+ vertex -158.74706087942334 -75.33024605404151 352.3991073532279
+ endloop
+endfacet
+facet normal 0.19135647237682485 -0.3314248967978557 -0.9238724144934884
+ outer loop
+ vertex -158.41083785647993 -75.91257639818753 352.7873484279478
+ vertex -158.59172800638646 -75.59927892575608 352.637491065319
+ vertex -154.94677344165987 -73.91251196673105 352.78734842656394
+ endloop
+endfacet
+facet normal 0.19135647237682485 -0.3314248967978557 -0.9238724144934884
+ outer loop
+ vertex -155.12766359156643 -73.5992144942996 352.6374910639352
+ vertex -154.94677344165987 -73.91251196673105 352.78734842656394
+ vertex -158.59172800638646 -75.59927892575608 352.637491065319
+ endloop
+endfacet
+facet normal 0.06527441896433545 -0.11305375454316116 -0.9914424334335117
+ outer loop
+ vertex -158.2167177944847 -76.24878776633824 352.8384669095021
+ vertex -158.41083785647993 -75.91257639818753 352.7873484279478
+ vertex -154.75265337966465 -74.24872333488173 352.8384669081182
+ endloop
+endfacet
+facet normal 0.06527441896433545 -0.11305375454316116 -0.9914424334335117
+ outer loop
+ vertex -154.94677344165987 -73.91251196673105 352.78734842656394
+ vertex -154.75265337966465 -74.24872333488173 352.8384669081182
+ vertex -158.41083785647993 -75.91257639818753 352.7873484279478
+ endloop
+endfacet
+facet normal -0.06525597822946307 0.11302181425343016 -0.9914472889711177
+ outer loop
+ vertex -158.02259678182725 -76.58500078108426 352.7873628699412
+ vertex -158.2167177944847 -76.24878776633824 352.8384669095021
+ vertex -154.5585323670072 -74.58493634962777 352.7873628685574
+ endloop
+endfacet
+facet normal -0.06525597822946307 0.11302181425343016 -0.9914472889711177
+ outer loop
+ vertex -154.75265337966465 -74.24872333488173 352.8384669081182
+ vertex -154.5585323670072 -74.58493634962777 352.7873628685574
+ vertex -158.2167177944847 -76.24878776633824 352.8384669095021
+ endloop
+endfacet
+facet normal -0.19133928834755926 0.33139513318608604 -0.9238866502094432
+ outer loop
+ vertex -157.84170384472 -76.89830308108891 352.63751896510786
+ vertex -158.02259678182725 -76.58500078108426 352.7873628699412
+ vertex -154.37763942989997 -74.89823864963242 352.63751896372406
+ endloop
+endfacet
+facet normal -0.19133928834755926 0.33139513318608604 -0.9238866502094432
+ outer loop
+ vertex -154.5585323670072 -74.58493634962777 352.7873628685574
+ vertex -154.37763942989997 -74.89823864963242 352.63751896372406
+ vertex -158.02259678182725 -76.58500078108426 352.7873628699412
+ endloop
+endfacet
+facet normal -0.3043831421678627 0.5271844214484077 -0.7933646630308955
+ outer loop
+ vertex -157.68636653788712 -77.16734363236347 352.3991468094877
+ vertex -157.84170384472 -76.89830308108891 352.63751896510786
+ vertex -154.22230212306707 -75.16727920090698 352.39914680810386
+ endloop
+endfacet
+facet normal -0.3043831421678627 0.5271844214484077 -0.7933646630308955
+ outer loop
+ vertex -154.37763942989997 -74.89823864963242 352.63751896372406
+ vertex -154.22230212306707 -75.16727920090698 352.39914680810386
+ vertex -157.84170384472 -76.89830308108891 352.63751896510786
+ endloop
+endfacet
+facet normal -0.396683787866367 0.6870469626024952 -0.6087761851638718
+ outer loop
+ vertex -154.10310642726216 -75.37372333449257 352.08849107017386
+ vertex -157.5671708420822 -77.37378776594905 352.08849107155766
+ vertex -154.22230212306707 -75.16727920090698 352.39914680810386
+ endloop
+endfacet
+facet normal -0.396683787866367 0.6870469626024952 -0.6087761851638718
+ outer loop
+ vertex -157.68636653788712 -77.16734363236347 352.3991468094877
+ vertex -154.22230212306707 -75.16727920090698 352.39914680810386
+ vertex -157.5671708420822 -77.37378776594905 352.08849107155766
+ endloop
+endfacet
+facet normal -0.46195108897273734 0.8000883886540183 -0.3827006163281142
+ outer loop
+ vertex -154.02817533217413 -75.50350222385038 351.7267224250909
+ vertex -157.4922397469942 -77.50356665530687 351.72672242647474
+ vertex -154.10310642726216 -75.37372333449257 352.08849107017386
+ endloop
+endfacet
+facet normal -0.46195108897273734 0.8000883886540183 -0.3827006163281142
+ outer loop
+ vertex -157.5671708420822 -77.37378776594905 352.08849107155766
+ vertex -154.10310642726216 -75.37372333449257 352.08849107017386
+ vertex -157.4922397469942 -77.50356665530687 351.72672242647474
+ endloop
+endfacet
+facet normal -0.4957371867758675 0.8586051132273177 -0.13054463293239457
+ outer loop
+ vertex -154.00261526810377 -75.5477716521405 351.3384948081665
+ vertex -157.46667968292383 -77.54783608359699 351.33849480955035
+ vertex -154.02817533217413 -75.50350222385038 351.7267224250909
+ endloop
+endfacet
+facet normal -0.4957371867758675 0.8586051132273177 -0.13054463293239457
+ outer loop
+ vertex -157.4922397469942 -77.50356665530687 351.72672242647474
+ vertex -154.02817533217413 -75.50350222385038 351.7267224250909
+ vertex -157.46667968292383 -77.54783608359699 351.33849480955035
+ endloop
+endfacet
+facet normal -0.4957396145446709 0.8586093182462345 0.13050775146265353
+ outer loop
+ vertex -154.02816811117742 -75.50351473098357 350.95026528991764
+ vertex -157.49223252599748 -77.50357916244005 350.95026529130143
+ vertex -154.00261526810377 -75.5477716521405 351.3384948081665
+ endloop
+endfacet
+facet normal -0.4957396145446709 0.8586093182462345 0.13050775146265353
+ outer loop
+ vertex -157.46667968292383 -77.54783608359699 351.33849480955035
+ vertex -154.00261526810377 -75.5477716521405 351.3384948081665
+ vertex -157.49223252599748 -77.50357916244005 350.95026529130143
+ endloop
+endfacet
+facet normal -0.46195820683071537 0.8001007171456785 0.38266624826958645
+ outer loop
+ vertex -154.1030924773677 -75.37374749641849 350.5884910704333
+ vertex -157.56715689218777 -77.37381192787498 350.5884910718171
+ vertex -154.02816811117742 -75.50351473098357 350.95026528991764
+ endloop
+endfacet
+facet normal -0.46195820683071537 0.8001007171456785 0.38266624826958645
+ outer loop
+ vertex -157.49223252599748 -77.50357916244005 350.95026529130143
+ vertex -154.02816811117742 -75.50351473098357 350.95026528991764
+ vertex -157.56715689218777 -77.37381192787498 350.5884910718171
+ endloop
+endfacet
+facet normal 0.8657525189240677 0.5004723502464403 5.1141337943045276e-05
+ outer loop
+ vertex -158.96805574939242 -74.95255902828977 371.3382343231691
+ vertex -158.94249678850724 -74.99681240079038 371.7264637883948
+ vertex -158.94245517200622 -74.99680504881455 370.95000676202244
+ endloop
+endfacet
+facet normal 0.8657525189240677 0.5004723502464403 5.1141337943045276e-05
+ outer loop
+ vertex -158.8674396933906 -75.12653516918607 370.58823817167064
+ vertex -158.94245517200622 -74.99680504881455 370.95000676202244
+ vertex -158.94249678850724 -74.99681240079038 371.7264637883948
+ endloop
+endfacet
+facet normal 0.8657525189240677 0.5004723502464403 5.1141337943045276e-05
+ outer loop
+ vertex -158.86752009029684 -75.1265493721127 372.088237961224
+ vertex -158.8674396933906 -75.12653516918607 370.58823817167064
+ vertex -158.94249678850724 -74.99681240079038 371.7264637883948
+ endloop
+endfacet
+facet normal 0.8657525189240677 0.5004723502464403 5.1141337943045276e-05
+ outer loop
+ vertex -158.74812149444418 -75.33290849609001 370.27758248369526
+ vertex -158.8674396933906 -75.12653516918607 370.58823817167064
+ vertex -158.86752009029684 -75.1265493721127 372.088237961224
+ endloop
+endfacet
+facet normal 0.8657525189240677 0.5004723502464403 5.1141337943045276e-05
+ outer loop
+ vertex -158.74823519283936 -75.33292858206148 372.3989025296385
+ vertex -158.74812149444418 -75.33290849609001 370.27758248369526
+ vertex -158.86752009029684 -75.1265493721127 372.088237961224
+ endloop
+endfacet
+facet normal 0.8657525189240677 0.5004723502464403 5.1141337943045276e-05
+ outer loop
+ vertex -158.59263191324257 -75.60186102834601 370.03921036984906
+ vertex -158.74812149444418 -75.33290849609001 370.27758248369526
+ vertex -158.74823519283936 -75.33292858206148 372.3989025296385
+ endloop
+endfacet
+facet normal 0.8657525189240677 0.5004723502464403 5.1141337943045276e-05
+ outer loop
+ vertex -158.59277116476892 -75.60188562853658 372.6372862166982
+ vertex -158.59263191324257 -75.60186102834601 370.03921036984906
+ vertex -158.74823519283936 -75.33292858206148 372.3989025296385
+ endloop
+endfacet
+facet normal 0.8657525189240677 0.5004723502464403 5.1141337943045276e-05
+ outer loop
+ vertex -158.41156730778602 -75.91506409534595 369.88936649576215
+ vertex -158.59263191324257 -75.60186102834601 370.03921036984906
+ vertex -158.59277116476892 -75.60188562853658 372.6372862166982
+ endloop
+endfacet
+facet normal 0.8657525189240677 0.5004723502464403 5.1141337943045276e-05
+ outer loop
+ vertex -158.41172262268213 -75.91509153329321 372.7871435680778
+ vertex -158.41156730778602 -75.91506409534595 369.88936649576215
+ vertex -158.59277116476892 -75.60188562853658 372.6372862166982
+ endloop
+endfacet
+facet normal 0.8657525189240677 0.5004723502464403 5.1141337943045276e-05
+ outer loop
+ vertex -158.21726693171286 -76.25117342566621 369.8382624738248
+ vertex -158.41156730778602 -75.91506409534595 369.88936649576215
+ vertex -158.41172262268213 -75.91509153329321 372.7871435680778
+ endloop
+endfacet
+facet normal 0.8657525189240677 0.5004723502464403 5.1141337943045276e-05
+ outer loop
+ vertex -158.2174277255253 -76.25120183151947 372.8382620529316
+ vertex -158.21726693171286 -76.25117342566621 369.8382624738248
+ vertex -158.41172262268213 -75.91509153329321 372.7871435680778
+ endloop
+endfacet
+facet normal 0.8657525189240677 0.5004723502464403 5.1141337943045276e-05
+ outer loop
+ vertex -158.02297203455603 -76.58728372389248 369.8893809586786
+ vertex -158.21726693171286 -76.25117342566621 369.8382624738248
+ vertex -158.2174277255253 -76.25120183151947 372.8382620529316
+ endloop
+endfacet
+facet normal 0.8657525189240677 0.5004723502464403 5.1141337943045276e-05
+ outer loop
+ vertex -158.02312734945215 -76.58731116183975 372.7871580309943
+ vertex -158.02297203455603 -76.58728372389248 369.8893809586786
+ vertex -158.2174277255253 -76.25120183151947 372.8382620529316
+ endloop
+endfacet
+facet normal 0.8657525189240677 0.5004723502464403 5.1141337943045276e-05
+ outer loop
+ vertex -157.84192349246928 -76.9004896286491 370.0392383100582
+ vertex -158.02297203455603 -76.58728372389248 369.8893809586786
+ vertex -158.02312734945215 -76.58731116183975 372.7871580309943
+ endloop
+endfacet
+facet normal 0.8657525189240677 0.5004723502464403 5.1141337943045276e-05
+ outer loop
+ vertex -157.8420627439956 -76.90051422883967 372.6373141569074
+ vertex -157.84192349246928 -76.9004896286491 370.0392383100582
+ vertex -158.02312734945215 -76.58731116183975 372.7871580309943
+ endloop
+endfacet
+facet normal 0.8657525189240677 0.5004723502464403 5.1141337943045276e-05
+ outer loop
+ vertex -157.6864594643988 -77.1694466751242 370.27762199711793
+ vertex -157.84192349246928 -76.9004896286491 370.0392383100582
+ vertex -157.8420627439956 -76.90051422883967 372.6373141569074
+ endloop
+endfacet
+facet normal 0.8657525189240677 0.5004723502464403 5.1141337943045276e-05
+ outer loop
+ vertex -157.68657316279402 -77.16946676109566 372.3989420430612
+ vertex -157.6864594643988 -77.1694466751242 370.27762199711793
+ vertex -157.8420627439956 -76.90051422883967 372.6373141569074
+ endloop
+endfacet
+facet normal 0.8657525189240677 0.5004723502464403 5.1141337943045276e-05
+ outer loop
+ vertex -157.56717456694133 -77.37582588507298 370.58828656553237
+ vertex -157.6864594643988 -77.1694466751242 370.27762199711793
+ vertex -157.68657316279402 -77.16946676109566 372.3989420430612
+ endloop
+endfacet
+facet normal 0.8657525189240677 0.5004723502464403 5.1141337943045276e-05
+ outer loop
+ vertex -157.5672549638476 -77.37584008799962 372.0882863550858
+ vertex -157.56717456694133 -77.37582588507298 370.58828656553237
+ vertex -157.68657316279402 -77.16946676109566 372.3989420430612
+ endloop
+endfacet
+facet normal 0.8657525189240677 0.5004723502464403 5.1141337943045276e-05
+ outer loop
+ vertex -157.49219786873095 -77.5055628563953 370.95006073836157
+ vertex -157.56717456694133 -77.37582588507298 370.58828656553237
+ vertex -157.5672549638476 -77.37584008799962 372.0882863550858
+ endloop
+endfacet
+facet normal 0.8657525189240677 0.5004723502464403 5.1141337943045276e-05
+ outer loop
+ vertex -157.49223948523198 -77.50557020837114 371.726517764734
+ vertex -157.49219786873095 -77.5055628563953 370.95006073836157
+ vertex -157.5672549638476 -77.37584008799962 372.0882863550858
+ endloop
+endfacet
+facet normal 0.8657525189240677 0.5004723502464403 5.1141337943045276e-05
+ outer loop
+ vertex -157.46663890784578 -77.54981622889592 371.3382902035873
+ vertex -157.49219786873095 -77.5055628563953 370.95006073836157
+ vertex -157.49223948523198 -77.50557020837114 371.726517764734
+ endloop
+endfacet
+facet normal -0.06527161074844998 0.11301276750418368 -0.9914472911916943
+ outer loop
+ vertex -158.2174277255253 -76.25120183151947 372.8382620529316
+ vertex -154.75441764982907 -74.24931243053375 372.83846661828346
+ vertex -158.02312734945215 -76.58731116183975 372.7871580309943
+ endloop
+endfacet
+facet normal -0.06527161074844998 0.11301276750418368 -0.9914472911916943
+ outer loop
+ vertex -154.5601172737559 -74.58542176085402 372.78736259634604
+ vertex -158.02312734945215 -76.58731116183975 372.7871580309943
+ vertex -154.75441764982907 -74.24931243053375 372.83846661828346
+ endloop
+endfacet
+facet normal -0.19147295865346278 0.3313178939421811 -0.9238866593139047
+ outer loop
+ vertex -158.02312734945215 -76.58731116183975 372.7871580309943
+ vertex -154.5601172737559 -74.58542176085402 372.78736259634604
+ vertex -157.8420627439956 -76.90051422883967 372.6373141569074
+ endloop
+endfacet
+facet normal -0.19147295865346278 0.3313178939421811 -0.9238866593139047
+ outer loop
+ vertex -154.37905266829935 -74.89862482785394 372.63751872225913
+ vertex -157.8420627439956 -76.90051422883967 372.6373141569074
+ vertex -154.5601172737559 -74.58542176085402 372.78736259634604
+ endloop
+endfacet
+facet normal -0.3046257408502599 0.5270442534367137 -0.7933646783987596
+ outer loop
+ vertex -157.8420627439956 -76.90051422883967 372.6373141569074
+ vertex -154.37905266829935 -74.89862482785394 372.63751872225913
+ vertex -157.68657316279402 -77.16946676109566 372.3989420430612
+ endloop
+endfacet
+facet normal -0.3046257408502599 0.5270442534367137 -0.7933646783987596
+ outer loop
+ vertex -154.22356308709774 -75.16757736010995 372.39914660841293
+ vertex -157.68657316279402 -77.16946676109566 372.3989420430612
+ vertex -154.37905266829935 -74.89862482785394 372.63751872225913
+ endloop
+endfacet
+facet normal -0.3970187822259422 0.6868534180413296 -0.6087762057478696
+ outer loop
+ vertex -157.5672549638476 -77.37584008799962 372.0882863550858
+ vertex -157.68657316279402 -77.16946676109566 372.3989420430612
+ vertex -154.10424488815133 -75.37395068701389 372.08849092043755
+ endloop
+endfacet
+facet normal -0.3970187822259422 0.6868534180413296 -0.6087762057478696
+ outer loop
+ vertex -154.22356308709774 -75.16757736010995 372.39914660841293
+ vertex -154.10424488815133 -75.37395068701389 372.08849092043755
+ vertex -157.68657316279402 -77.16946676109566 372.3989420430612
+ endloop
+endfacet
+facet normal -0.4623556496974689 0.799854657285341 -0.3827006407255952
+ outer loop
+ vertex -157.49223948523198 -77.50557020837114 371.726517764734
+ vertex -157.5672549638476 -77.37584008799962 372.0882863550858
+ vertex -154.02922940953573 -75.50368080738541 371.72672233008575
+ endloop
+endfacet
+facet normal -0.4623556496974689 0.799854657285341 -0.3827006407255952
+ outer loop
+ vertex -154.10424488815133 -75.37395068701389 372.08849092043755
+ vertex -154.02922940953573 -75.50368080738541 371.72672233008575
+ vertex -157.5672549638476 -77.37584008799962 372.0882863550858
+ endloop
+endfacet
+facet normal -0.4961837437209861 0.8583471234577362 -0.13054465948041144
+ outer loop
+ vertex -157.46663890784578 -77.54981622889592 371.3382902035873
+ vertex -157.49223948523198 -77.50557020837114 371.726517764734
+ vertex -154.0036288321495 -75.5479268279102 371.3384947689391
+ endloop
+endfacet
+facet normal -0.4961837437209861 0.8583471234577362 -0.13054465948041144
+ outer loop
+ vertex -154.02922940953573 -75.50368080738541 371.72672233008575
+ vertex -154.0036288321495 -75.5479268279102 371.3384947689391
+ vertex -157.49223948523198 -77.50557020837114 371.726517764734
+ endloop
+endfacet
+facet normal -0.4961977355923104 0.8583446516521516 0.13050772457295526
+ outer loop
+ vertex -157.49219786873095 -77.5055628563953 370.95006073836157
+ vertex -157.46663890784578 -77.54981622889592 371.3382902035873
+ vertex -154.0291877930347 -75.50367345540958 370.95026530371337
+ endloop
+endfacet
+facet normal -0.4961977355923104 0.8583446516521516 0.13050772457295526
+ outer loop
+ vertex -154.0036288321495 -75.5479268279102 371.3384947689391
+ vertex -154.0291877930347 -75.50367345540958 370.95026530371337
+ vertex -157.46663890784578 -77.54981622889592 371.3382902035873
+ endloop
+endfacet
+facet normal -0.4623966717885338 0.7998474103180533 0.3826662228710428
+ outer loop
+ vertex -157.56717456694133 -77.37582588507298 370.58828656553237
+ vertex -157.49219786873095 -77.5055628563953 370.95006073836157
+ vertex -154.1041644912451 -75.37393648408727 370.5884911308841
+ endloop
+endfacet
+facet normal -0.4623966717885338 0.7998474103180533 0.3826662228710428
+ outer loop
+ vertex -154.0291877930347 -75.50367345540958 370.95026530371337
+ vertex -154.1041644912451 -75.37393648408727 370.5884911308841
+ vertex -157.49219786873095 -77.5055628563953 370.95006073836157
+ endloop
+endfacet
+facet normal -0.39708403894903277 0.6868418897811813 0.608746650466135
+ outer loop
+ vertex -157.6864594643988 -77.1694466751242 370.27762199711793
+ vertex -157.56717456694133 -77.37582588507298 370.58828656553237
+ vertex -154.22344938870256 -75.16755727413847 370.27782656246967
+ endloop
+endfacet
+facet normal -0.39708403894903277 0.6868418897811813 0.608746650466135
+ outer loop
+ vertex -154.1041644912451 -75.37393648408727 370.5884911308841
+ vertex -154.22344938870256 -75.16755727413847 370.27782656246967
+ vertex -157.56717456694133 -77.37582588507298 370.58828656553237
+ endloop
+endfacet
+facet normal -0.30471078506751953 0.5270292295155485 0.7933419998334785
+ outer loop
+ vertex -157.84192349246928 -76.9004896286491 370.0392383100582
+ vertex -157.6864594643988 -77.1694466751242 370.27762199711793
+ vertex -154.378913416773 -74.89860022766337 370.0394428754099
+ endloop
+endfacet
+facet normal -0.30471078506751953 0.5270292295155485 0.7933419998334785
+ outer loop
+ vertex -154.22344938870256 -75.16755727413847 370.27782656246967
+ vertex -154.378913416773 -74.89860022766337 370.0394428754099
+ vertex -157.6864594643988 -77.1694466751242 370.27762199711793
+ endloop
+endfacet
+facet normal -0.19157199474207193 0.3313003982154749 0.9238724029717587
+ outer loop
+ vertex -158.02297203455603 -76.58728372389248 369.8893809586786
+ vertex -157.84192349246928 -76.9004896286491 370.0392383100582
+ vertex -154.5599619588598 -74.58539432290675 369.88958552403034
+ endloop
+endfacet
+facet normal -0.19157199474207193 0.3313003982154749 0.9238724029717587
+ outer loop
+ vertex -154.378913416773 -74.89860022766337 370.0394428754099
+ vertex -154.5599619588598 -74.58539432290675 369.88958552403034
+ vertex -157.84192349246928 -76.9004896286491 370.0392383100582
+ endloop
+endfacet
+facet normal -0.06537788956260604 0.11299399227674878 0.9914424286188793
+ outer loop
+ vertex -158.21726693171286 -76.25117342566621 369.8382624738248
+ vertex -158.02297203455603 -76.58728372389248 369.8893809586786
+ vertex -154.75425685601658 -74.24928402468048 369.8384670391765
+ endloop
+endfacet
+facet normal -0.06537788956260604 0.11299399227674878 0.9914424286188793
+ outer loop
+ vertex -154.5599619588598 -74.58539432290675 369.88958552403034
+ vertex -154.75425685601658 -74.24928402468048 369.8384670391765
+ vertex -158.02297203455603 -76.58728372389248 369.8893809586786
+ endloop
+endfacet
+facet normal 0.06527161074844998 -0.11301276750418368 0.9914472911916943
+ outer loop
+ vertex -158.41156730778602 -75.91506409534595 369.88936649576215
+ vertex -158.21726693171286 -76.25117342566621 369.8382624738248
+ vertex -154.94855723208974 -73.91317469436022 369.88957106111394
+ endloop
+endfacet
+facet normal 0.06527161074844998 -0.11301276750418368 0.9914472911916943
+ outer loop
+ vertex -154.75425685601658 -74.24928402468048 369.8384670391765
+ vertex -154.94855723208974 -73.91317469436022 369.88957106111394
+ vertex -158.21726693171286 -76.25117342566621 369.8382624738248
+ endloop
+endfacet
+facet normal 0.19147295865346278 -0.3313178939421811 0.9238866593139047
+ outer loop
+ vertex -158.59263191324257 -75.60186102834601 370.03921036984906
+ vertex -158.41156730778602 -75.91506409534595 369.88936649576215
+ vertex -155.12962183754632 -73.59997162736029 370.03941493520085
+ endloop
+endfacet
+facet normal 0.19147295865346278 -0.3313178939421811 0.9238866593139047
+ outer loop
+ vertex -154.94855723208974 -73.91317469436022 369.88957106111394
+ vertex -155.12962183754632 -73.59997162736029 370.03941493520085
+ vertex -158.41156730778602 -75.91506409534595 369.88936649576215
+ endloop
+endfacet
+facet normal 0.3046257408502599 -0.5270442534367137 0.7933646783987596
+ outer loop
+ vertex -158.74812149444418 -75.33290849609001 370.27758248369526
+ vertex -158.59263191324257 -75.60186102834601 370.03921036984906
+ vertex -155.28511141874793 -73.33101909510428 370.27778704904705
+ endloop
+endfacet
+facet normal 0.3046257408502599 -0.5270442534367137 0.7933646783987596
+ outer loop
+ vertex -155.12962183754632 -73.59997162736029 370.03941493520085
+ vertex -155.28511141874793 -73.33101909510428 370.27778704904705
+ vertex -158.59263191324257 -75.60186102834601 370.03921036984906
+ endloop
+endfacet
+facet normal 0.3970187822259422 -0.6868534180413296 0.6087762057478696
+ outer loop
+ vertex -158.74812149444418 -75.33290849609001 370.27758248369526
+ vertex -155.28511141874793 -73.33101909510428 370.27778704904705
+ vertex -158.8674396933906 -75.12653516918607 370.58823817167064
+ endloop
+endfacet
+facet normal 0.3970187822259422 -0.6868534180413296 0.6087762057478696
+ outer loop
+ vertex -155.40442961769435 -73.12464576820034 370.58844273702243
+ vertex -158.8674396933906 -75.12653516918607 370.58823817167064
+ vertex -155.28511141874793 -73.33101909510428 370.27778704904705
+ endloop
+endfacet
+facet normal 0.4623556496974689 -0.799854657285341 0.3827006407255952
+ outer loop
+ vertex -158.8674396933906 -75.12653516918607 370.58823817167064
+ vertex -155.40442961769435 -73.12464576820034 370.58844273702243
+ vertex -158.94245517200622 -74.99680504881455 370.95000676202244
+ endloop
+endfacet
+facet normal 0.4623556496974689 -0.799854657285341 0.3827006407255952
+ outer loop
+ vertex -155.47944509630995 -72.99491564782882 370.95021132737423
+ vertex -158.94245517200622 -74.99680504881455 370.95000676202244
+ vertex -155.40442961769435 -73.12464576820034 370.58844273702243
+ endloop
+endfacet
+facet normal 0.4961837437209861 -0.8583471234577362 0.13054465948041144
+ outer loop
+ vertex -158.94245517200622 -74.99680504881455 370.95000676202244
+ vertex -155.47944509630995 -72.99491564782882 370.95021132737423
+ vertex -158.96805574939242 -74.95255902828977 371.3382343231691
+ endloop
+endfacet
+facet normal 0.4961837437209861 -0.8583471234577362 0.13054465948041144
+ outer loop
+ vertex -155.50504567369617 -72.95066962730404 371.3384388885209
+ vertex -158.96805574939242 -74.95255902828977 371.3382343231691
+ vertex -155.47944509630995 -72.99491564782882 370.95021132737423
+ endloop
+endfacet
+facet normal 0.4961977355923104 -0.8583446516521516 -0.13050772457295526
+ outer loop
+ vertex -158.96805574939242 -74.95255902828977 371.3382343231691
+ vertex -155.50504567369617 -72.95066962730404 371.3384388885209
+ vertex -158.94249678850724 -74.99681240079038 371.7264637883948
+ endloop
+endfacet
+facet normal 0.4961977355923104 -0.8583446516521516 -0.13050772457295526
+ outer loop
+ vertex -155.47948671281097 -72.99492299980464 371.7266683537466
+ vertex -158.94249678850724 -74.99681240079038 371.7264637883948
+ vertex -155.50504567369617 -72.95066962730404 371.3384388885209
+ endloop
+endfacet
+facet normal 0.4623966717885338 -0.7998474103180533 -0.3826662228710428
+ outer loop
+ vertex -158.94249678850724 -74.99681240079038 371.7264637883948
+ vertex -155.47948671281097 -72.99492299980464 371.7266683537466
+ vertex -158.86752009029684 -75.1265493721127 372.088237961224
+ endloop
+endfacet
+facet normal 0.4623966717885338 -0.7998474103180533 -0.3826662228710428
+ outer loop
+ vertex -155.4045100146006 -73.12465997112697 372.0884425265758
+ vertex -158.86752009029684 -75.1265493721127 372.088237961224
+ vertex -155.47948671281097 -72.99492299980464 371.7266683537466
+ endloop
+endfacet
+facet normal 0.39708403894903277 -0.6868418897811813 -0.608746650466135
+ outer loop
+ vertex -158.86752009029684 -75.1265493721127 372.088237961224
+ vertex -155.4045100146006 -73.12465997112697 372.0884425265758
+ vertex -158.74823519283936 -75.33292858206148 372.3989025296385
+ endloop
+endfacet
+facet normal 0.39708403894903277 -0.6868418897811813 -0.608746650466135
+ outer loop
+ vertex -155.2852251171431 -73.33103918107577 372.3991070949903
+ vertex -158.74823519283936 -75.33292858206148 372.3989025296385
+ vertex -155.4045100146006 -73.12465997112697 372.0884425265758
+ endloop
+endfacet
+facet normal 0.3047107850675105 -0.5270292295155329 -0.7933419998334924
+ outer loop
+ vertex -158.74823519283936 -75.33292858206148 372.3989025296385
+ vertex -155.2852251171431 -73.33103918107577 372.3991070949903
+ vertex -158.59277116476892 -75.60188562853658 372.6372862166982
+ endloop
+endfacet
+facet normal 0.3047107850675105 -0.5270292295155329 -0.7933419998334924
+ outer loop
+ vertex -155.12976108907267 -73.59999622755086 372.63749078205
+ vertex -158.59277116476892 -75.60188562853658 372.6372862166982
+ vertex -155.2852251171431 -73.33103918107577 372.3991070949903
+ endloop
+endfacet
+facet normal 0.1915719947420842 -0.3313003982154961 -0.9238724029717483
+ outer loop
+ vertex -158.59277116476892 -75.60188562853658 372.6372862166982
+ vertex -155.12976108907267 -73.59999622755086 372.63749078205
+ vertex -158.41172262268213 -75.91509153329321 372.7871435680778
+ endloop
+endfacet
+facet normal 0.1915719947420842 -0.3313003982154961 -0.9238724029717483
+ outer loop
+ vertex -154.9487125469859 -73.91320213230748 372.7873481334296
+ vertex -158.41172262268213 -75.91509153329321 372.7871435680778
+ vertex -155.12976108907267 -73.59999622755086 372.63749078205
+ endloop
+endfacet
+facet normal 0.06537788956260604 -0.11299399227674878 -0.9914424286188793
+ outer loop
+ vertex -158.41172262268213 -75.91509153329321 372.7871435680778
+ vertex -154.9487125469859 -73.91320213230748 372.7873481334296
+ vertex -158.2174277255253 -76.25120183151947 372.8382620529316
+ endloop
+endfacet
+facet normal 0.06537788956260604 -0.11299399227674878 -0.9914424286188793
+ outer loop
+ vertex -154.75441764982907 -74.24931243053375 372.83846661828346
+ vertex -158.2174277255253 -76.25120183151947 372.8382620529316
+ vertex -154.9487125469859 -73.91320213230748 372.7873481334296
+ endloop
+endfacet
+facet normal 0.8658825020030816 0.5002474296554404 4.2988474745472334e-05
+ outer loop
+ vertex -148.96791622261702 -92.27178630909413 371.3386389550017
+ vertex -148.94236601235505 -92.31604474615968 371.726868459627
+ vertex -148.94232988128635 -92.31604056133739 370.9504113528749
+ endloop
+endfacet
+facet normal 0.8658825020030816 0.5002474296554404 4.2988474745472334e-05
+ outer loop
+ vertex -148.86735065524127 -92.44579164873274 370.58864272275486
+ vertex -148.94232988128635 -92.31604056133739 370.9504113528749
+ vertex -148.94236601235505 -92.31604474615968 371.726868459627
+ endloop
+endfacet
+facet normal 0.8658825020030816 0.5002474296554404 4.2988474745472334e-05
+ outer loop
+ vertex -148.8674204551061 -92.44579973318851 372.08864266759
+ vertex -148.86735065524127 -92.44579164873274 370.58864272275486
+ vertex -148.94236601235505 -92.31604474615968 371.726868459627
+ endloop
+endfacet
+facet normal 0.8658825020030816 0.5002474296554404 4.2988474745472334e-05
+ outer loop
+ vertex -148.74808825482776 -92.65219724909795 370.2779869989335
+ vertex -148.86735065524127 -92.44579164873274 370.58864272275486
+ vertex -148.8674204551061 -92.44579973318851 372.08864266759
+ endloop
+endfacet
+facet normal 0.8658825020030816 0.5002474296554404 4.2988474745472334e-05
+ outer loop
+ vertex -148.74818696674322 -92.65220868224496 372.39930726447824
+ vertex -148.74808825482776 -92.65219724909795 370.2779869989335
+ vertex -148.8674204551061 -92.44579973318851 372.08864266759
+ endloop
+endfacet
+facet normal 0.8658825020030816 0.5002474296554404 4.2988474745472334e-05
+ outer loop
+ vertex -148.59267021554365 -92.92119116186954 370.03961485560626
+ vertex -148.74808825482776 -92.65219724909795 370.2779869989335
+ vertex -148.74818696674322 -92.65220868224496 372.39930726447824
+ endloop
+endfacet
+facet normal 0.8658825020030816 0.5002474296554404 4.2988474745472334e-05
+ outer loop
+ vertex -148.59279111245573 -92.92120516455765 372.63769097141136
+ vertex -148.59267021554365 -92.92119116186954 370.03961485560626
+ vertex -148.74818696674322 -92.65220868224496 372.39930726447824
+ endloop
+endfacet
+facet normal 0.8658825020030816 0.5002474296554404 4.2988474745472334e-05
+ outer loop
+ vertex -148.41168801992552 -93.2344418964256 369.8897709604125
+ vertex -148.59267021554365 -92.92119116186954 370.03961485560626
+ vertex -148.59279111245573 -92.92120516455765 372.63769097141136
+ endloop
+endfacet
+facet normal 0.8658825020030816 0.5002474296554404 4.2988474745472334e-05
+ outer loop
+ vertex -148.41182286290956 -93.23445751439475 372.78754833270943
+ vertex -148.41168801992552 -93.2344418964256 369.8897709604125
+ vertex -148.59279111245573 -92.92120516455765 372.63769097141136
+ endloop
+endfacet
+facet normal 0.8658825020030816 0.5002474296554404 4.2988474745472334e-05
+ outer loop
+ vertex -148.21747530551764 -93.57060193287734 369.8386669271807
+ vertex -148.41168801992552 -93.2344418964256 369.8897709604125
+ vertex -148.41182286290956 -93.23445751439475 372.78754833270943
+ endloop
+endfacet
+facet normal 0.8658825020030816 0.5002474296554404 4.2988474745472334e-05
+ outer loop
+ vertex -148.2176149052471 -93.57061810178881 372.83866681685106
+ vertex -148.21747530551764 -93.57060193287734 369.8386669271807
+ vertex -148.41182286290956 -93.23445751439475 372.78754833270943
+ endloop
+endfacet
+facet normal 0.8658825020030816 0.5002474296554404 4.2988474745472334e-05
+ outer loop
+ vertex -148.02326734785518 -93.9067625202714 369.88978541132235
+ vertex -148.21747530551764 -93.57060193287734 369.8386669271807
+ vertex -148.2176149052471 -93.57061810178881 372.83866681685106
+ endloop
+endfacet
+facet normal 0.8658825020030816 0.5002474296554404 4.2988474745472334e-05
+ outer loop
+ vertex -148.02340219083922 -93.90677813824055 372.78756278361936
+ vertex -148.02326734785518 -93.9067625202714 369.88978541132235
+ vertex -148.2176149052471 -93.57061810178881 372.83866681685106
+ endloop
+endfacet
+facet normal 0.8658825020030816 0.5002474296554404 4.2988474745472334e-05
+ outer loop
+ vertex -147.842299098309 -94.2200148701085 370.0396427726205
+ vertex -148.02326734785518 -93.9067625202714 369.88978541132235
+ vertex -148.02340219083922 -93.90677813824055 372.78756278361936
+ endloop
+endfacet
+facet normal 0.8658825020030816 0.5002474296554404 4.2988474745472334e-05
+ outer loop
+ vertex -147.84241999522106 -94.2200288727966 372.63771888842547
+ vertex -147.842299098309 -94.2200148701085 370.0396427726205
+ vertex -148.02340219083922 -93.90677813824055 372.78756278361936
+ endloop
+endfacet
+facet normal 0.8658825020030816 0.5002474296554404 4.2988474745472334e-05
+ outer loop
+ vertex -147.6869032440215 -94.48901135242119 370.27802647955355
+ vertex -147.842299098309 -94.2200148701085 370.0396427726205
+ vertex -147.84241999522106 -94.2200288727966 372.63771888842547
+ endloop
+endfacet
+facet normal 0.8658825020030816 0.5002474296554404 4.2988474745472334e-05
+ outer loop
+ vertex -147.68700195593698 -94.4890227855682 372.39934674509834
+ vertex -147.6869032440215 -94.48901135242119 370.27802647955355
+ vertex -147.84241999522106 -94.2200288727966 372.63771888842547
+ endloop
+endfacet
+facet normal 0.8658825020030816 0.5002474296554404 4.2988474745472334e-05
+ outer loop
+ vertex -147.56766975565864 -94.69542030147764 370.58869107644176
+ vertex -147.6869032440215 -94.48901135242119 370.27802647955355
+ vertex -147.68700195593698 -94.4890227855682 372.39934674509834
+ endloop
+endfacet
+facet normal 0.8658825020030816 0.5002474296554404 4.2988474745472334e-05
+ outer loop
+ vertex -147.56773955552347 -94.69542838593341 372.088691021277
+ vertex -147.56766975565864 -94.69542030147764 370.58869107644176
+ vertex -147.68700195593698 -94.4890227855682 372.39934674509834
+ endloop
+endfacet
+facet normal 0.8658825020030816 0.5002474296554404 4.2988474745472334e-05
+ outer loop
+ vertex -147.4927241984097 -94.8251752885065 370.9504652844048
+ vertex -147.56766975565864 -94.69542030147764 370.58869107644176
+ vertex -147.56773955552347 -94.69542838593341 372.088691021277
+ endloop
+endfacet
+facet normal 0.8658825020030816 0.5002474296554404 4.2988474745472334e-05
+ outer loop
+ vertex -147.49276032947841 -94.82517947332876 371.72692239115696
+ vertex -147.4927241984097 -94.8251752885065 370.9504652844048
+ vertex -147.56773955552347 -94.69542838593341 372.088691021277
+ endloop
+endfacet
+facet normal 0.8658825020030816 0.5002474296554404 4.2988474745472334e-05
+ outer loop
+ vertex -147.46717398814772 -94.86943372557204 371.33869478903006
+ vertex -147.4927241984097 -94.8251752885065 370.9504652844048
+ vertex -147.49276032947841 -94.82517947332876 371.72692239115696
+ endloop
+endfacet
+facet normal 0.49596166942562336 -0.8584754616946654 0.1305446441976069
+ outer loop
+ vertex -148.94232988128635 -92.31604056133739 370.9504113528749
+ vertex -145.47879987327406 -90.31505084271564 370.9505833067738
+ vertex -148.96791622261702 -92.27178630909413 371.3386389550017
+ endloop
+endfacet
+facet normal 0.49596166942562336 -0.8584754616946654 0.1305446441976069
+ outer loop
+ vertex -145.5043862146047 -90.27079659047236 371.3388109089007
+ vertex -148.96791622261702 -92.27178630909413 371.3386389550017
+ vertex -145.47879987327406 -90.31505084271564 370.9505833067738
+ endloop
+endfacet
+facet normal 0.4959738170401364 -0.8584740547169704 -0.1305077399560715
+ outer loop
+ vertex -148.96791622261702 -92.27178630909413 371.3386389550017
+ vertex -145.5043862146047 -90.27079659047236 371.3388109089007
+ vertex -148.94236601235505 -92.31604474615968 371.726868459627
+ endloop
+endfacet
+facet normal 0.4959738170401364 -0.8584740547169704 -0.1305077399560715
+ outer loop
+ vertex -145.47883600434272 -90.31505502753791 371.72704041352597
+ vertex -148.94236601235505 -92.31604474615968 371.726868459627
+ vertex -145.5043862146047 -90.27079659047236 371.3388109089007
+ endloop
+endfacet
+facet normal 0.46218616865887907 -0.799969059605817 -0.382666237305842
+ outer loop
+ vertex -148.94236601235505 -92.31604474615968 371.726868459627
+ vertex -145.47883600434272 -90.31505502753791 371.72704041352597
+ vertex -148.8674204551061 -92.44579973318851 372.08864266759
+ endloop
+endfacet
+facet normal 0.46218616865887907 -0.799969059605817 -0.382666237305842
+ outer loop
+ vertex -145.4038904470938 -90.44481001456674 372.088814621489
+ vertex -148.8674204551061 -92.44579973318851 372.08864266759
+ vertex -145.47883600434272 -90.31505502753791 371.72704041352597
+ endloop
+endfacet
+facet normal 0.39690129668221596 -0.6869474950938003 -0.6087466629693581
+ outer loop
+ vertex -148.8674204551061 -92.44579973318851 372.08864266759
+ vertex -145.4038904470938 -90.44481001456674 372.088814621489
+ vertex -148.74818696674322 -92.65220868224496 372.39930726447824
+ endloop
+endfacet
+facet normal 0.39690129668221596 -0.6869474950938003 -0.6087466629693581
+ outer loop
+ vertex -145.28465695873095 -90.65121896362321 372.3994792183773
+ vertex -148.74818696674322 -92.65220868224496 372.39930726447824
+ vertex -145.4038904470938 -90.44481001456674 372.088814621489
+ endloop
+endfacet
+facet normal 0.3045682572471265 -0.5271115940256584 -0.7933420095527386
+ outer loop
+ vertex -148.74818696674322 -92.65220868224496 372.39930726447824
+ vertex -145.28465695873095 -90.65121896362321 372.3994792183773
+ vertex -148.59279111245573 -92.92120516455765 372.63769097141136
+ endloop
+endfacet
+facet normal 0.3045682572471265 -0.5271115940256584 -0.7933420095527386
+ outer loop
+ vertex -145.1292611044434 -90.92021544593588 372.63786292531034
+ vertex -148.59279111245573 -92.92120516455765 372.63769097141136
+ vertex -145.28465695873095 -90.65121896362321 372.3994792183773
+ endloop
+endfacet
+facet normal 0.19147939440346326 -0.33135390891772065 -0.923872409244821
+ outer loop
+ vertex -148.59279111245573 -92.92120516455765 372.63769097141136
+ vertex -145.1292611044434 -90.92021544593588 372.63786292531034
+ vertex -148.41182286290956 -93.23445751439475 372.78754833270943
+ endloop
+endfacet
+facet normal 0.19147939440346326 -0.33135390891772065 -0.923872409244821
+ outer loop
+ vertex -144.94829285489726 -91.23346779577298 372.7877202866084
+ vertex -148.41182286290956 -93.23445751439475 372.78754833270943
+ vertex -145.1292611044434 -90.92021544593588 372.63786292531034
+ endloop
+endfacet
+facet normal 0.06534152726587612 -0.11301500250528489 -0.9914424310182075
+ outer loop
+ vertex -148.41182286290956 -93.23445751439475 372.78754833270943
+ vertex -144.94829285489726 -91.23346779577298 372.7877202866084
+ vertex -148.2176149052471 -93.57061810178881 372.83866681685106
+ endloop
+endfacet
+facet normal 0.06534152726587612 -0.11301500250528489 -0.9914424310182075
+ outer loop
+ vertex -144.75408489723483 -91.56962838316704 372.8388387707501
+ vertex -148.2176149052471 -93.57061810178881 372.83866681685106
+ vertex -144.94829285489726 -91.23346779577298 372.7877202866084
+ endloop
+endfacet
+facet normal -0.06524925697291986 0.11302568956179615 -0.9914472895537929
+ outer loop
+ vertex -148.2176149052471 -93.57061810178881 372.83866681685106
+ vertex -144.75408489723483 -91.56962838316704 372.8388387707501
+ vertex -148.02340219083922 -93.90677813824055 372.78756278361936
+ endloop
+endfacet
+facet normal -0.06524925697291986 0.11302568956179615 -0.9914472895537929
+ outer loop
+ vertex -144.5598721828269 -91.9057884196188 372.7877347375183
+ vertex -148.02340219083922 -93.90677813824055 372.78756278361936
+ vertex -144.75408489723483 -91.56962838316704 372.8388387707501
+ endloop
+endfacet
+facet normal -0.19139341217847589 0.3313638676689707 -0.9238866537504159
+ outer loop
+ vertex -148.02340219083922 -93.90677813824055 372.78756278361936
+ vertex -144.5598721828269 -91.9057884196188 372.7877347375183
+ vertex -147.84241999522106 -94.2200288727966 372.63771888842547
+ endloop
+endfacet
+facet normal -0.19139341217847589 0.3313638676689707 -0.9238866537504159
+ outer loop
+ vertex -144.3788899872088 -92.21903915417484 372.6378908423245
+ vertex -147.84241999522106 -94.2200288727966 372.63771888842547
+ vertex -144.5598721828269 -91.9057884196188 372.7877347375183
+ endloop
+endfacet
+facet normal -0.30449442263669624 0.5271201457992898 -0.7933646692887707
+ outer loop
+ vertex -147.84241999522106 -94.2200288727966 372.63771888842547
+ vertex -144.3788899872088 -92.21903915417484 372.6378908423245
+ vertex -147.68700195593698 -94.4890227855682 372.39934674509834
+ endloop
+endfacet
+facet normal -0.30449442263669624 0.5271201457992898 -0.7933646692887707
+ outer loop
+ vertex -144.22347194792468 -92.48803306694643 372.39951869899727
+ vertex -147.68700195593698 -94.4890227855682 372.39934674509834
+ vertex -144.3788899872088 -92.21903915417484 372.6378908423245
+ endloop
+endfacet
+facet normal -0.39684464139297676 0.6869540571004867 -0.6087761937123207
+ outer loop
+ vertex -147.56773955552347 -94.69542838593341 372.088691021277
+ vertex -147.68700195593698 -94.4890227855682 372.39934674509834
+ vertex -144.10420954751118 -92.69443866731166 372.08886297517597
+ endloop
+endfacet
+facet normal -0.39684464139297676 0.6869540571004867 -0.6087761937123207
+ outer loop
+ vertex -144.22347194792468 -92.48803306694643 372.39951869899727
+ vertex -144.10420954751118 -92.69443866731166 372.08886297517597
+ vertex -147.68700195593698 -94.4890227855682 372.39934674509834
+ endloop
+endfacet
+facet normal -0.46215055365515356 0.799973184655627 -0.38270062658450016
+ outer loop
+ vertex -147.49276032947841 -94.82517947332876 371.72692239115696
+ vertex -147.56773955552347 -94.69542838593341 372.088691021277
+ vertex -144.02923032146612 -92.82418975470699 371.72709434505595
+ endloop
+endfacet
+facet normal -0.46215055365515356 0.799973184655627 -0.38270062658450016
+ outer loop
+ vertex -144.10420954751118 -92.69443866731166 372.08886297517597
+ vertex -144.02923032146612 -92.82418975470699 371.72709434505595
+ vertex -147.56773955552347 -94.69542838593341 372.088691021277
+ endloop
+endfacet
+facet normal -0.49596166942562336 0.8584754616946654 -0.1305446441976069
+ outer loop
+ vertex -147.46717398814772 -94.86943372557204 371.33869478903006
+ vertex -147.49276032947841 -94.82517947332876 371.72692239115696
+ vertex -144.00364398013542 -92.86844400695027 371.33886674292904
+ endloop
+endfacet
+facet normal -0.49596166942562336 0.8584754616946654 -0.1305446441976069
+ outer loop
+ vertex -144.02923032146612 -92.82418975470699 371.72709434505595
+ vertex -144.00364398013542 -92.86844400695027 371.33886674292904
+ vertex -147.49276032947841 -94.82517947332876 371.72692239115696
+ endloop
+endfacet
+facet normal -0.49597381704014376 0.8584740547169832 0.13050773995595824
+ outer loop
+ vertex -147.4927241984097 -94.8251752885065 370.9504652844048
+ vertex -147.46717398814772 -94.86943372557204 371.33869478903006
+ vertex -144.02919419039736 -92.82418556988475 370.9506372383038
+ endloop
+endfacet
+facet normal -0.49597381704014376 0.8584740547169832 0.13050773995595824
+ outer loop
+ vertex -144.00364398013542 -92.86844400695027 371.33886674292904
+ vertex -144.02919419039736 -92.82418556988475 370.9506372383038
+ vertex -147.46717398814772 -94.86943372557204 371.33869478903006
+ endloop
+endfacet
+facet normal -0.4621861686588587 0.7999690596057817 0.38266623730594035
+ outer loop
+ vertex -147.56766975565864 -94.69542030147764 370.58869107644176
+ vertex -147.4927241984097 -94.8251752885065 370.9504652844048
+ vertex -144.10413974764634 -92.69443058285587 370.58886303034075
+ endloop
+endfacet
+facet normal -0.4621861686588587 0.7999690596057817 0.38266623730594035
+ outer loop
+ vertex -144.02919419039736 -92.82418556988475 370.9506372383038
+ vertex -144.10413974764634 -92.69443058285587 370.58886303034075
+ vertex -147.4927241984097 -94.8251752885065 370.9504652844048
+ endloop
+endfacet
+facet normal -0.39690129668221596 0.6869474950938003 0.6087466629693581
+ outer loop
+ vertex -147.6869032440215 -94.48901135242119 370.27802647955355
+ vertex -147.56766975565864 -94.69542030147764 370.58869107644176
+ vertex -144.2233732360092 -92.48802163379942 370.27819843345253
+ endloop
+endfacet
+facet normal -0.39690129668221596 0.6869474950938003 0.6087466629693581
+ outer loop
+ vertex -144.10413974764634 -92.69443058285587 370.58886303034075
+ vertex -144.2233732360092 -92.48802163379942 370.27819843345253
+ vertex -147.56766975565864 -94.69542030147764 370.58869107644176
+ endloop
+endfacet
+facet normal -0.3045682572471265 0.5271115940256584 0.7933420095527386
+ outer loop
+ vertex -147.842299098309 -94.2200148701085 370.0396427726205
+ vertex -147.6869032440215 -94.48901135242119 370.27802647955355
+ vertex -144.37876909029671 -92.21902515148673 370.0398147265194
+ endloop
+endfacet
+facet normal -0.3045682572471265 0.5271115940256584 0.7933420095527386
+ outer loop
+ vertex -144.2233732360092 -92.48802163379942 370.27819843345253
+ vertex -144.37876909029671 -92.21902515148673 370.0398147265194
+ vertex -147.6869032440215 -94.48901135242119 370.27802647955355
+ endloop
+endfacet
+facet normal -0.19147939440346326 0.33135390891772065 0.923872409244821
+ outer loop
+ vertex -148.02326734785518 -93.9067625202714 369.88978541132235
+ vertex -147.842299098309 -94.2200148701085 370.0396427726205
+ vertex -144.55973733984285 -91.90577280164965 369.8899573652214
+ endloop
+endfacet
+facet normal -0.19147939440346326 0.33135390891772065 0.923872409244821
+ outer loop
+ vertex -144.37876909029671 -92.21902515148673 370.0398147265194
+ vertex -144.55973733984285 -91.90577280164965 369.8899573652214
+ vertex -147.842299098309 -94.2200148701085 370.0396427726205
+ endloop
+endfacet
+facet normal -0.06534152726587612 0.11301500250528489 0.9914424310182075
+ outer loop
+ vertex -148.21747530551764 -93.57060193287734 369.8386669271807
+ vertex -148.02326734785518 -93.9067625202714 369.88978541132235
+ vertex -144.7539452975053 -91.56961221425557 369.8388388810797
+ endloop
+endfacet
+facet normal -0.06534152726587612 0.11301500250528489 0.9914424310182075
+ outer loop
+ vertex -144.55973733984285 -91.90577280164965 369.8899573652214
+ vertex -144.7539452975053 -91.56961221425557 369.8388388810797
+ vertex -148.02326734785518 -93.9067625202714 369.88978541132235
+ endloop
+endfacet
+facet normal 0.06524925697291986 -0.11302568956179615 0.9914472895537929
+ outer loop
+ vertex -148.41168801992552 -93.2344418964256 369.8897709604125
+ vertex -148.21747530551764 -93.57060193287734 369.8386669271807
+ vertex -144.94815801191322 -91.23345217780383 369.88994291431146
+ endloop
+endfacet
+facet normal 0.06524925697291986 -0.11302568956179615 0.9914472895537929
+ outer loop
+ vertex -144.7539452975053 -91.56961221425557 369.8388388810797
+ vertex -144.94815801191322 -91.23345217780383 369.88994291431146
+ vertex -148.21747530551764 -93.57060193287734 369.8386669271807
+ endloop
+endfacet
+facet normal 0.19139341217847589 -0.3313638676689707 0.9238866537504159
+ outer loop
+ vertex -148.59267021554365 -92.92119116186954 370.03961485560626
+ vertex -148.41168801992552 -93.2344418964256 369.8897709604125
+ vertex -145.12914020753135 -90.92020144324778 370.03978680950524
+ endloop
+endfacet
+facet normal 0.19139341217847589 -0.3313638676689707 0.9238866537504159
+ outer loop
+ vertex -144.94815801191322 -91.23345217780383 369.88994291431146
+ vertex -145.12914020753135 -90.92020144324778 370.03978680950524
+ vertex -148.41168801992552 -93.2344418964256 369.8897709604125
+ endloop
+endfacet
+facet normal 0.30449442263669624 -0.5271201457992898 0.7933646692887707
+ outer loop
+ vertex -148.74808825482776 -92.65219724909795 370.2779869989335
+ vertex -148.59267021554365 -92.92119116186954 370.03961485560626
+ vertex -145.28455824681546 -90.6512075304762 370.2781589528325
+ endloop
+endfacet
+facet normal 0.30449442263669624 -0.5271201457992898 0.7933646692887707
+ outer loop
+ vertex -145.12914020753135 -90.92020144324778 370.03978680950524
+ vertex -145.28455824681546 -90.6512075304762 370.2781589528325
+ vertex -148.59267021554365 -92.92119116186954 370.03961485560626
+ endloop
+endfacet
+facet normal 0.39684464139297676 -0.6869540571004867 0.6087761937123207
+ outer loop
+ vertex -148.74808825482776 -92.65219724909795 370.2779869989335
+ vertex -145.28455824681546 -90.6512075304762 370.2781589528325
+ vertex -148.86735065524127 -92.44579164873274 370.58864272275486
+ endloop
+endfacet
+facet normal 0.39684464139297676 -0.6869540571004867 0.6087761937123207
+ outer loop
+ vertex -145.40382064722897 -90.44480193011097 370.58881467665384
+ vertex -148.86735065524127 -92.44579164873274 370.58864272275486
+ vertex -145.28455824681546 -90.6512075304762 370.2781589528325
+ endloop
+endfacet
+facet normal 0.46215055365515356 -0.799973184655627 0.38270062658450016
+ outer loop
+ vertex -148.86735065524127 -92.44579164873274 370.58864272275486
+ vertex -145.40382064722897 -90.44480193011097 370.58881467665384
+ vertex -148.94232988128635 -92.31604056133739 370.9504113528749
+ endloop
+endfacet
+facet normal 0.46215055365515356 -0.799973184655627 0.38270062658450016
+ outer loop
+ vertex -145.47879987327406 -90.31505084271564 370.9505833067738
+ vertex -148.94232988128635 -92.31604056133739 370.9504113528749
+ vertex -145.40382064722897 -90.44480193011097 370.58881467665384
+ endloop
+endfacet
+facet normal 0.8662575566756238 0.4995975702245037 0.0003366424669815009
+ outer loop
+ vertex -148.96825567255325 -92.26894639913682 351.33746435972216
+ vertex -148.94283743369502 -92.31328095425953 351.7256938339748
+ vertex -148.94260378879446 -92.31316287571259 350.94923678679373
+ endloop
+endfacet
+facet normal 0.8662575566756238 0.4995975702245037 0.0003366424669815009
+ outer loop
+ vertex -148.86808128319237 -92.44314521441534 352.0874680124609
+ vertex -148.94260378879446 -92.31316287571259 350.94923678679373
+ vertex -148.94283743369502 -92.31328095425953 351.7256938339748
+ endloop
+endfacet
+facet normal 0.8662575566756238 0.4995975702245037 0.0003366424669815009
+ outer loop
+ vertex -148.86762991590504 -92.44291710417929 350.58746818270816
+ vertex -148.94260378879446 -92.31316287571259 350.94923678679373
+ vertex -148.86808128319237 -92.44314521441534 352.0874680124609
+ endloop
+endfacet
+facet normal 0.8662575566756238 0.4995975702245037 0.0003366424669815009
+ outer loop
+ vertex -148.74908172916165 -92.64968914488558 352.3981325827766
+ vertex -148.86762991590504 -92.44291710417929 350.58746818270816
+ vertex -148.86808128319237 -92.44314521441534 352.0874680124609
+ endloop
+endfacet
+facet normal 0.8662575566756238 0.4995975702245037 0.0003366424669815009
+ outer loop
+ vertex -148.7484433994223 -92.64936654829602 350.27681247998305
+ vertex -148.86762991590504 -92.44291710417929 350.58746818270816
+ vertex -148.74908172916165 -92.64968914488558 352.3981325827766
+ endloop
+endfacet
+facet normal 0.8662575566756238 0.4995975702245037 0.0003366424669815009
+ outer loop
+ vertex -148.5939483945539 -92.91883711813851 352.63651626785247
+ vertex -148.7484433994223 -92.64936654829602 350.27681247998305
+ vertex -148.74908172916165 -92.64968914488558 352.3981325827766
+ endloop
+endfacet
+facet normal 0.8662575566756238 0.4995975702245037 0.0003366424669815009
+ outer loop
+ vertex -148.5931666034794 -92.91844201961995 350.03844035137615
+ vertex -148.7484433994223 -92.64936654829602 350.27681247998305
+ vertex -148.5939483945539 -92.91883711813851 352.63651626785247
+ endloop
+endfacet
+facet normal 0.8662575566756238 0.4995975702245037 0.0003366424669815009
+ outer loop
+ vertex -148.41325335975284 -93.23224714458517 352.78637361349826
+ vertex -148.5931666034794 -92.91844201961995 350.03844035137615
+ vertex -148.5939483945539 -92.91883711813851 352.63651626785247
+ endloop
+endfacet
+facet normal 0.8662575566756238 0.4995975702245037 0.0003366424669815009
+ outer loop
+ vertex -148.41238138511287 -93.23180646944866 349.88859646352364
+ vertex -148.5931666034794 -92.91844201961995 350.03844035137615
+ vertex -148.41325335975284 -93.23224714458517 352.78637361349826
+ endloop
+endfacet
+facet normal 0.8662575566756238 0.4995975702245037 0.0003366424669815009
+ outer loop
+ vertex -148.2193106927674 -93.5685608488577 352.8374920892592
+ vertex -148.41238138511287 -93.23180646944866 349.88859646352364
+ vertex -148.41325335975284 -93.23224714458517 352.78637361349826
+ endloop
+endfacet
+facet normal 0.8662575566756238 0.4995975702245037 0.0003366424669815009
+ outer loop
+ vertex -148.21840795819273 -93.56810462838558 349.8374924297538
+ vertex -148.41238138511287 -93.23180646944866 349.88859646352364
+ vertex -148.2193106927674 -93.5685608488577 352.8374920892592
+ endloop
+endfacet
+facet normal 0.8662575566756238 0.4995975702245037 0.0003366424669815009
+ outer loop
+ vertex -148.02533726584724 -93.90485900779463 352.78638805548934
+ vertex -148.21840795819273 -93.56810462838558 349.8374924297538
+ vertex -148.2193106927674 -93.5685608488577 352.8374920892592
+ endloop
+endfacet
+facet normal 0.8662575566756238 0.4995975702245037 0.0003366424669815009
+ outer loop
+ vertex -148.02446529120726 -93.9044183326581 349.8886109055147
+ vertex -148.21840795819273 -93.56810462838558 349.8374924297538
+ vertex -148.02533726584724 -93.90485900779463 352.78638805548934
+ endloop
+endfacet
+facet normal 0.8662575566756238 0.4995975702245037 0.0003366424669815009
+ outer loop
+ vertex -147.8445520474807 -94.21822345762334 352.63654416763677
+ vertex -148.02446529120726 -93.9044183326581 349.8886109055147
+ vertex -148.02533726584724 -93.90485900779463 352.78638805548934
+ endloop
+endfacet
+facet normal 0.8662575566756238 0.4995975702245037 0.0003366424669815009
+ outer loop
+ vertex -147.8437702564062 -94.21782835910477 350.0384682511605
+ vertex -148.02446529120726 -93.9044183326581 349.8886109055147
+ vertex -147.8445520474807 -94.21822345762334 352.63654416763677
+ endloop
+endfacet
+facet normal 0.8662575566756238 0.4995975702245037 0.0003366424669815009
+ outer loop
+ vertex -147.68927525153782 -94.48729892894728 352.39817203902993
+ vertex -147.8437702564062 -94.21782835910477 350.0384682511605
+ vertex -147.8445520474807 -94.21822345762334 352.63654416763677
+ endloop
+endfacet
+facet normal 0.8662575566756238 0.4995975702245037 0.0003366424669815009
+ outer loop
+ vertex -147.6886369217985 -94.48697633235771 350.27685193623637
+ vertex -147.8437702564062 -94.21782835910477 350.0384682511605
+ vertex -147.68927525153782 -94.48729892894728 352.39817203902993
+ endloop
+endfacet
+facet normal 0.8662575566756238 0.4995975702245037 0.0003366424669815009
+ outer loop
+ vertex -147.5700887350551 -94.693748373064 352.08751633630476
+ vertex -147.6886369217985 -94.48697633235771 350.27685193623637
+ vertex -147.68927525153782 -94.48729892894728 352.39817203902993
+ endloop
+endfacet
+facet normal 0.8662575566756238 0.4995975702245037 0.0003366424669815009
+ outer loop
+ vertex -147.56963736776774 -94.69352026282795 350.5875165065521
+ vertex -147.6886369217985 -94.48697633235771 350.27685193623637
+ vertex -147.5700887350551 -94.693748373064 352.08751633630476
+ endloop
+endfacet
+facet normal 0.8662575566756238 0.4995975702245037 0.0003366424669815009
+ outer loop
+ vertex -147.49511486216568 -94.82350260153069 351.7257477322192
+ vertex -147.56963736776774 -94.69352026282795 350.5875165065521
+ vertex -147.5700887350551 -94.693748373064 352.08751633630476
+ endloop
+endfacet
+facet normal 0.8662575566756238 0.4995975702245037 0.0003366424669815009
+ outer loop
+ vertex -147.49488121726512 -94.82338452298374 350.94929068503814
+ vertex -147.56963736776774 -94.69352026282795 350.5875165065521
+ vertex -147.49511486216568 -94.82350260153069 351.7257477322192
+ endloop
+endfacet
+facet normal 0.8662575566756238 0.4995975702245037 0.0003366424669815009
+ outer loop
+ vertex -147.46946297840685 -94.86771907810646 351.33752015929076
+ vertex -147.49488121726512 -94.82338452298374 350.94929068503814
+ vertex -147.49511486216568 -94.82350260153069 351.7257477322192
+ endloop
+endfacet
+facet normal 0.06550890866160447 -0.1129185346609842 -0.9914423772544634
+ outer loop
+ vertex -148.2193106927674 -93.5685608488577 352.8374920892592
+ vertex -148.41325335975284 -93.23224714458517 352.78637361349826
+ vertex -144.75428046606493 -91.57017056795969 352.8388386591271
+ endloop
+endfacet
+facet normal 0.06550890866160447 -0.1129185346609842 -0.9914423772544634
+ outer loop
+ vertex -144.9482231330504 -91.23385686368717 352.7877201833662
+ vertex -144.75428046606493 -91.57017056795969 352.8388386591271
+ vertex -148.41325335975284 -93.23224714458517 352.78637361349826
+ endloop
+endfacet
+facet normal -0.06491223425765233 0.11322007963989937 -0.9914472327915463
+ outer loop
+ vertex -148.02533726584724 -93.90485900779463 352.78638805548934
+ vertex -148.2193106927674 -93.5685608488577 352.8374920892592
+ vertex -144.5603070391448 -91.90646872689662 352.78773462535725
+ endloop
+endfacet
+facet normal -0.06491223425765233 0.11322007963989937 -0.9914472327915463
+ outer loop
+ vertex -144.75428046606493 -91.57017056795969 352.8388386591271
+ vertex -144.5603070391448 -91.90646872689662 352.78773462535725
+ vertex -148.2193106927674 -93.5685608488577 352.8374920892592
+ endloop
+endfacet
+facet normal -0.19090971568477283 0.3316429326183235 -0.9238865978579175
+ outer loop
+ vertex -147.8445520474807 -94.21822345762334 352.63654416763677
+ vertex -148.02533726584724 -93.90485900779463 352.78638805548934
+ vertex -144.37952182077825 -92.21983317672533 352.63789073750473
+ endloop
+endfacet
+facet normal -0.19090971568477283 0.3316429326183235 -0.9238865978579175
+ outer loop
+ vertex -144.5603070391448 -91.90646872689662 352.78773462535725
+ vertex -144.37952182077825 -92.21983317672533 352.63789073750473
+ vertex -148.02533726584724 -93.90485900779463 352.78638805548934
+ endloop
+endfacet
+facet normal -0.30389701548123493 0.527464867804732 -0.7933646180750278
+ outer loop
+ vertex -147.68927525153782 -94.48729892894728 352.39817203902993
+ vertex -147.8445520474807 -94.21822345762334 352.63654416763677
+ vertex -144.22424502483534 -92.48890864804926 352.39951860889784
+ endloop
+endfacet
+facet normal -0.30389701548123493 0.527464867804732 -0.7933646180750278
+ outer loop
+ vertex -144.37952182077825 -92.21983317672533 352.63789073750473
+ vertex -144.22424502483534 -92.48890864804926 352.39951860889784
+ vertex -147.8445520474807 -94.21822345762334 352.63654416763677
+ endloop
+endfacet
+facet normal -0.3961742358861824 0.6873409439271011 -0.6087761506673871
+ outer loop
+ vertex -147.5700887350551 -94.693748373064 352.08751633630476
+ vertex -147.68927525153782 -94.48729892894728 352.39817203902993
+ vertex -144.1050585083526 -92.69535809216599 352.08886290617266
+ endloop
+endfacet
+facet normal -0.3961742358861824 0.6873409439271011 -0.6087761506673871
+ outer loop
+ vertex -144.22424502483534 -92.48890864804926 352.39951860889784
+ vertex -144.1050585083526 -92.69535809216599 352.08886290617266
+ vertex -147.68927525153782 -94.48729892894728 352.39817203902993
+ endloop
+endfacet
+facet normal -0.46145283682438104 0.8003758706054787 -0.38270059464188616
+ outer loop
+ vertex -147.49511486216568 -94.82350260153069 351.7257477322192
+ vertex -147.5700887350551 -94.693748373064 352.08751633630476
+ vertex -144.03008463546323 -92.82511232063268 351.7270943020871
+ endloop
+endfacet
+facet normal -0.46145283682438104 0.8003758706054787 -0.38270059464188616
+ outer loop
+ vertex -144.1050585083526 -92.69535809216599 352.08886290617266
+ vertex -144.03008463546323 -92.82511232063268 351.7270943020871
+ vertex -147.5700887350551 -94.693748373064 352.08751633630476
+ endloop
+endfacet
+facet normal -0.49528418951985603 0.8588665043857382 -0.1305446255342682
+ outer loop
+ vertex -147.46946297840685 -94.86771907810646 351.33752015929076
+ vertex -147.49511486216568 -94.82350260153069 351.7257477322192
+ vertex -144.0044327517044 -92.86932879720845 351.33886672915867
+ endloop
+endfacet
+facet normal -0.49528418951985603 0.8588665043857382 -0.1305446255342682
+ outer loop
+ vertex -144.03008463546323 -92.82511232063268 351.7270943020871
+ vertex -144.0044327517044 -92.86932879720845 351.33886672915867
+ vertex -147.49511486216568 -94.82350260153069 351.7257477322192
+ endloop
+endfacet
+facet normal -0.4953627431953809 0.8588268052361255 0.13050774406853188
+ outer loop
+ vertex -147.49488121726512 -94.82338452298374 350.94929068503814
+ vertex -147.46946297840685 -94.86771907810646 351.33752015929076
+ vertex -144.02985099056264 -92.82499424208574 350.95063725490604
+ endloop
+endfacet
+facet normal -0.4953627431953809 0.8588268052361255 0.13050774406853188
+ outer loop
+ vertex -144.0044327517044 -92.86932879720845 351.33886672915867
+ vertex -144.02985099056264 -92.82499424208574 350.95063725490604
+ vertex -147.46946297840685 -94.86771907810646 351.33752015929076
+ endloop
+endfacet
+facet normal -0.46168314454780157 0.8002594785881108 0.38266622658700744
+ outer loop
+ vertex -147.56963736776774 -94.69352026282795 350.5875165065521
+ vertex -147.49488121726512 -94.82338452298374 350.94929068503814
+ vertex -144.10460714106532 -92.69512998192992 350.58886307642
+ endloop
+endfacet
+facet normal -0.46168314454780157 0.8002594785881108 0.38266622658700744
+ outer loop
+ vertex -144.02985099056264 -92.82499424208574 350.95063725490604
+ vertex -144.10460714106532 -92.69512998192992 350.58886307642
+ vertex -147.49488121726512 -94.82338452298374 350.94929068503814
+ endloop
+endfacet
+facet normal -0.39654060256670753 0.6871557909655427 0.6087466381496921
+ outer loop
+ vertex -147.6886369217985 -94.48697633235771 350.27685193623637
+ vertex -147.56963736776774 -94.69352026282795 350.5875165065521
+ vertex -144.22360669509604 -92.48858605145969 350.2781985061043
+ endloop
+endfacet
+facet normal -0.39654060256670753 0.6871557909655427 0.6087466381496921
+ outer loop
+ vertex -144.10460714106532 -92.69512998192992 350.58886307642
+ vertex -144.22360669509604 -92.48858605145969 350.2781985061043
+ vertex -147.56963736776774 -94.69352026282795 350.5875165065521
+ endloop
+endfacet
+facet normal -0.30437447383508076 0.5272235717674104 0.7933419723236833
+ outer loop
+ vertex -147.6886369217985 -94.48697633235771 350.27685193623637
+ vertex -144.22360669509604 -92.48858605145969 350.2781985061043
+ vertex -147.8437702564062 -94.21782835910477 350.0384682511605
+ endloop
+endfacet
+facet normal -0.30437447383508076 0.5272235717674104 0.7933419723236833
+ outer loop
+ vertex -144.37874002970375 -92.21943807820675 350.0398148210284
+ vertex -147.8437702564062 -94.21782835910477 350.0384682511605
+ vertex -144.22360669509604 -92.48858605145969 350.2781985061043
+ endloop
+endfacet
+facet normal -0.19146572771418754 0.3313619374314657 0.9238723621434629
+ outer loop
+ vertex -147.8437702564062 -94.21782835910477 350.0384682511605
+ vertex -144.37874002970375 -92.21943807820675 350.0398148210284
+ vertex -148.02446529120726 -93.9044183326581 349.8886109055147
+ endloop
+endfacet
+facet normal -0.19146572771418754 0.3313619374314657 0.9238723621434629
+ outer loop
+ vertex -144.5594350645048 -91.9060280517601 349.88995747538263
+ vertex -148.02446529120726 -93.9044183326581 349.8886109055147
+ vertex -144.37874002970375 -92.21943807820675 350.0398148210284
+ endloop
+endfacet
+facet normal -0.06550890866159034 0.11291853466095969 0.9914423772544673
+ outer loop
+ vertex -148.02446529120726 -93.9044183326581 349.8886109055147
+ vertex -144.5594350645048 -91.9060280517601 349.88995747538263
+ vertex -148.21840795819273 -93.56810462838558 349.8374924297538
+ endloop
+endfacet
+facet normal -0.06550890866159034 0.11291853466095969 0.9914423772544673
+ outer loop
+ vertex -144.75337773149027 -91.56971434748758 349.8388389996217
+ vertex -148.21840795819273 -93.56810462838558 349.8374924297538
+ vertex -144.5594350645048 -91.9060280517601 349.88995747538263
+ endloop
+endfacet
+facet normal 0.06491223425763819 -0.11322007963987485 0.99144723279155
+ outer loop
+ vertex -148.21840795819273 -93.56810462838558 349.8374924297538
+ vertex -144.75337773149027 -91.56971434748758 349.8388389996217
+ vertex -148.41238138511287 -93.23180646944866 349.88859646352364
+ endloop
+endfacet
+facet normal 0.06491223425763819 -0.11322007963987485 0.99144723279155
+ outer loop
+ vertex -144.9473511584104 -91.23341618855065 349.88994303339155
+ vertex -148.41238138511287 -93.23180646944866 349.88859646352364
+ vertex -144.75337773149027 -91.56971434748758 349.8388389996217
+ endloop
+endfacet
+facet normal 0.19090971568478513 -0.3316429326183448 0.9238865978579074
+ outer loop
+ vertex -148.41238138511287 -93.23180646944866 349.88859646352364
+ vertex -144.9473511584104 -91.23341618855065 349.88994303339155
+ vertex -148.5931666034794 -92.91844201961995 350.03844035137615
+ endloop
+endfacet
+facet normal 0.19090971568478513 -0.3316429326183448 0.9238865978579074
+ outer loop
+ vertex -145.12813637677695 -90.92005173872194 350.0397869212441
+ vertex -148.5931666034794 -92.91844201961995 350.03844035137615
+ vertex -144.9473511584104 -91.23341618855065 349.88994303339155
+ endloop
+endfacet
+facet normal 0.30389701548123493 -0.527464867804732 0.7933646180750278
+ outer loop
+ vertex -148.5931666034794 -92.91844201961995 350.03844035137615
+ vertex -145.12813637677695 -90.92005173872194 350.0397869212441
+ vertex -148.7484433994223 -92.64936654829602 350.27681247998305
+ endloop
+endfacet
+facet normal 0.30389701548123493 -0.527464867804732 0.7933646180750278
+ outer loop
+ vertex -145.28341317271986 -90.650976267398 350.27815904985096
+ vertex -148.7484433994223 -92.64936654829602 350.27681247998305
+ vertex -145.12813637677695 -90.92005173872194 350.0397869212441
+ endloop
+endfacet
+facet normal 0.3961742358861824 -0.6873409439271011 0.6087761506673871
+ outer loop
+ vertex -148.7484433994223 -92.64936654829602 350.27681247998305
+ vertex -145.28341317271986 -90.650976267398 350.27815904985096
+ vertex -148.86762991590504 -92.44291710417929 350.58746818270816
+ endloop
+endfacet
+facet normal 0.3961742358861824 -0.6873409439271011 0.6087761506673871
+ outer loop
+ vertex -145.4025996892026 -90.44452682328128 350.5888147525761
+ vertex -148.86762991590504 -92.44291710417929 350.58746818270816
+ vertex -145.28341317271986 -90.650976267398 350.27815904985096
+ endloop
+endfacet
+facet normal 0.46145283682438104 -0.8003758706054787 0.38270059464188616
+ outer loop
+ vertex -148.86762991590504 -92.44291710417929 350.58746818270816
+ vertex -145.4025996892026 -90.44452682328128 350.5888147525761
+ vertex -148.94260378879446 -92.31316287571259 350.94923678679373
+ endloop
+endfacet
+facet normal 0.46145283682438104 -0.8003758706054787 0.38270059464188616
+ outer loop
+ vertex -145.477573562092 -90.31477259481457 350.95058335666164
+ vertex -148.94260378879446 -92.31316287571259 350.94923678679373
+ vertex -145.4025996892026 -90.44452682328128 350.5888147525761
+ endloop
+endfacet
+facet normal 0.49528418951985603 -0.8588665043857382 0.1305446255342682
+ outer loop
+ vertex -148.94260378879446 -92.31316287571259 350.94923678679373
+ vertex -145.477573562092 -90.31477259481457 350.95058335666164
+ vertex -148.96825567255325 -92.26894639913682 351.33746435972216
+ endloop
+endfacet
+facet normal 0.49528418951985603 -0.8588665043857382 0.1305446255342682
+ outer loop
+ vertex -145.5032254458508 -90.27055611823882 351.3388109295901
+ vertex -148.96825567255325 -92.26894639913682 351.33746435972216
+ vertex -145.477573562092 -90.31477259481457 350.95058335666164
+ endloop
+endfacet
+facet normal 0.4953627431953809 -0.8588268052361255 -0.13050774406853188
+ outer loop
+ vertex -148.96825567255325 -92.26894639913682 351.33746435972216
+ vertex -145.5032254458508 -90.27055611823882 351.3388109295901
+ vertex -148.94283743369502 -92.31328095425953 351.7256938339748
+ endloop
+endfacet
+facet normal 0.4953627431953809 -0.8588268052361255 -0.13050774406853188
+ outer loop
+ vertex -145.47780720699257 -90.31489067336153 351.72704040384275
+ vertex -148.94283743369502 -92.31328095425953 351.7256938339748
+ vertex -145.5032254458508 -90.27055611823882 351.3388109295901
+ endloop
+endfacet
+facet normal 0.46168314454780157 -0.8002594785881108 -0.38266622658700744
+ outer loop
+ vertex -148.94283743369502 -92.31328095425953 351.7256938339748
+ vertex -145.47780720699257 -90.31489067336153 351.72704040384275
+ vertex -148.86808128319237 -92.44314521441534 352.0874680124609
+ endloop
+endfacet
+facet normal 0.46168314454780157 -0.8002594785881108 -0.38266622658700744
+ outer loop
+ vertex -145.40305105648991 -90.44475493351733 352.0888145823288
+ vertex -148.86808128319237 -92.44314521441534 352.0874680124609
+ vertex -145.47780720699257 -90.31489067336153 351.72704040384275
+ endloop
+endfacet
+facet normal 0.39654060256670753 -0.6871557909655427 -0.6087466381496921
+ outer loop
+ vertex -148.86808128319237 -92.44314521441534 352.0874680124609
+ vertex -145.40305105648991 -90.44475493351733 352.0888145823288
+ vertex -148.74908172916165 -92.64968914488558 352.3981325827766
+ endloop
+endfacet
+facet normal 0.39654060256670753 -0.6871557909655427 -0.6087466381496921
+ outer loop
+ vertex -145.28405150245916 -90.65129886398756 352.3994791526445
+ vertex -148.74908172916165 -92.64968914488558 352.3981325827766
+ vertex -145.40305105648991 -90.44475493351733 352.0888145823288
+ endloop
+endfacet
+facet normal 0.30437447383508076 -0.5272235717674104 -0.7933419723236833
+ outer loop
+ vertex -148.5939483945539 -92.91883711813851 352.63651626785247
+ vertex -148.74908172916165 -92.64968914488558 352.3981325827766
+ vertex -145.12891816785145 -90.9204468372405 352.63786283772043
+ endloop
+endfacet
+facet normal 0.30437447383508076 -0.5272235717674104 -0.7933419723236833
+ outer loop
+ vertex -145.28405150245916 -90.65129886398756 352.3994791526445
+ vertex -145.12891816785145 -90.9204468372405 352.63786283772043
+ vertex -148.74908172916165 -92.64968914488558 352.3981325827766
+ endloop
+endfacet
+facet normal 0.19146572771417528 -0.3313619374314444 -0.9238723621434732
+ outer loop
+ vertex -148.41325335975284 -93.23224714458517 352.78637361349826
+ vertex -148.5939483945539 -92.91883711813851 352.63651626785247
+ vertex -144.9482231330504 -91.23385686368717 352.7877201833662
+ endloop
+endfacet
+facet normal 0.19146572771417528 -0.3313619374314444 -0.9238723621434732
+ outer loop
+ vertex -145.12891816785145 -90.9204468372405 352.63786283772043
+ vertex -144.9482231330504 -91.23385686368717 352.7877201833662
+ vertex -148.5939483945539 -92.91883711813851 352.63651626785247
+ endloop
+endfacet
+facet normal -0.4999999999135217 0.8660254036346299 -1.8599859248019025e-05
+ outer loop
+ vertex -153.6753957615695 -92.08758041013873 345.0887668428438
+ vertex -155.40785251969302 -93.08781478580076 345.0887668428438
+ vertex -153.67569800928226 -92.08705690174371 377.5887668372221
+ endloop
+endfacet
+facet normal -0.4999999999135217 0.8660254036346299 -1.8599859248019025e-05
+ outer loop
+ vertex -155.4081547674058 -93.08729127740574 377.5887668372221
+ vertex -153.67569800928226 -92.08705690174371 377.5887668372221
+ vertex -155.40785251969302 -93.08781478580076 345.0887668428438
+ endloop
+endfacet
+facet normal -0.8660161037049536 -0.5000161078642279 3.4595552671979233e-10
+ outer loop
+ vertex -154.42569054878822 -90.78808751524727 377.5887389386096
+ vertex -154.4253883010755 -90.78861102364229 345.0887389442313
+ vertex -153.67569800928226 -92.08705690174371 377.5887668372221
+ endloop
+endfacet
+facet normal -0.8660161037049536 -0.5000161078642279 3.4595552671979233e-10
+ outer loop
+ vertex -153.6753957615695 -92.08758041013873 345.0887668428438
+ vertex -153.67569800928226 -92.08705690174371 377.5887668372221
+ vertex -154.4253883010755 -90.78861102364229 345.0887389442313
+ endloop
+endfacet
+facet normal -0.5000547685625593 0.8659937806311837 -1.859985921082138e-05
+ outer loop
+ vertex -153.55939452029432 -90.28855625499315 345.088738943055
+ vertex -154.4253883010755 -90.78861102364229 345.0887389442313
+ vertex -153.5596967680071 -90.28803274659813 377.5887389374333
+ endloop
+endfacet
+facet normal -0.5000547685625593 0.8659937806311837 -1.859985921082138e-05
+ outer loop
+ vertex -154.42569054878822 -90.78808751524727 377.5887389386096
+ vertex -153.5596967680071 -90.28803274659813 377.5887389374333
+ vertex -154.4253883010755 -90.78861102364229 345.0887389442313
+ endloop
+endfacet
+facet normal 0.8659937807808713 0.5000547686492476 -1.1763031656888842e-09
+ outer loop
+ vertex -153.55939452029432 -90.28855625499315 345.088738943055
+ vertex -153.5596967680071 -90.28803274659813 377.5887389374333
+ vertex -152.80931236595023 -91.58754692853732 345.0887668428438
+ endloop
+endfacet
+facet normal 0.8659937807808713 0.5000547686492476 -1.1763031656888842e-09
+ outer loop
+ vertex -152.809614613663 -91.58702342014229 377.5887668372221
+ vertex -152.80931236595023 -91.58754692853732 345.0887668428438
+ vertex -153.5596967680071 -90.28803274659813 377.5887389374333
+ endloop
+endfacet
+facet normal -0.5000007050694805 0.8660249965122645 -1.8599859248011436e-05
+ outer loop
+ vertex -151.5102608450827 -90.83753777294577 345.0887668428211
+ vertex -152.80931236595023 -91.58754692853732 345.0887668428438
+ vertex -151.51056309279548 -90.83701426455075 377.58876683719944
+ endloop
+endfacet
+facet normal -0.5000007050694805 0.8660249965122645 -1.8599859248011436e-05
+ outer loop
+ vertex -152.809614613663 -91.58702342014229 377.5887668372221
+ vertex -151.51056309279548 -90.83701426455075 377.58876683719944
+ vertex -152.80931236595023 -91.58754692853732 345.0887668428438
+ endloop
+endfacet
+facet normal -0.5005601706341583 0.8657017472713958 -1.859985535558106e-05
+ outer loop
+ vertex -151.4531409870984 -90.80451031753249 345.08876684202716
+ vertex -151.5102608450827 -90.83753777294577 345.0887668428211
+ vertex -151.45344323481117 -90.80398680913747 377.58876683640545
+ endloop
+endfacet
+facet normal -0.5005601706341583 0.8657017472713958 -1.859985535558106e-05
+ outer loop
+ vertex -151.51056309279548 -90.83701426455075 377.58876683719944
+ vertex -151.45344323481117 -90.80398680913747 377.58876683640545
+ vertex -151.5102608450827 -90.83753777294577 345.0887668428211
+ endloop
+endfacet
+facet normal -0.707342580726837 0.7068709027594612 -1.7964477816987433e-05
+ outer loop
+ vertex -151.36008352088763 -90.71139075632678 345.0887662074897
+ vertex -151.4531409870984 -90.80451031753249 345.08876684202716
+ vertex -151.36038576860037 -90.71086724793176 377.58876620186805
+ endloop
+endfacet
+facet normal -0.707342580726837 0.7068709027594612 -1.7964477816987433e-05
+ outer loop
+ vertex -151.45344323481117 -90.80398680913747 377.58876683640545
+ vertex -151.36038576860037 -90.71086724793176 377.58876620186805
+ vertex -151.4531409870984 -90.80451031753249 345.08876684202716
+ endloop
+endfacet
+facet normal -0.8661921188638244 0.49971112951267393 -1.6104847944964898e-05
+ outer loop
+ vertex -151.29429802685587 -90.59735912268732 345.0887649824743
+ vertex -151.36008352088763 -90.71139075632678 345.0887662074897
+ vertex -151.29460027456864 -90.5968356142923 377.5887649768526
+ endloop
+endfacet
+facet normal -0.8661921188638244 0.49971112951267393 -1.6104847944964898e-05
+ outer loop
+ vertex -151.36038576860037 -90.71086724793176 377.58876620186805
+ vertex -151.29460027456864 -90.5968356142923 377.5887649768526
+ vertex -151.36008352088763 -90.71139075632678 345.0887662074897
+ endloop
+endfacet
+facet normal -0.9660120955503078 0.2584968686031633 -1.3147699300042008e-05
+ outer loop
+ vertex -151.26056992541777 -90.46966297560473 377.58876324484186
+ vertex -151.260267677705 -90.47018648399975 345.08876325046356
+ vertex -151.29460027456864 -90.5968356142923 377.5887649768526
+ endloop
+endfacet
+facet normal -0.9660120955503078 0.2584968686031633 -1.3147699300042008e-05
+ outer loop
+ vertex -151.29429802685587 -90.59735912268732 345.0887649824743
+ vertex -151.29460027456864 -90.5968356142923 377.5887649768526
+ vertex -151.260267677705 -90.47018648399975 345.08876325046356
+ endloop
+endfacet
+facet normal -0.9999999443367675 -0.00033352672056013993 -9.294556675349947e-06
+ outer loop
+ vertex -151.26061383320555 -90.33801593703302 377.5887611238696
+ vertex -151.2603115854928 -90.33853944542805 345.0887611294912
+ vertex -151.26056992541777 -90.46966297560473 377.58876324484186
+ endloop
+endfacet
+facet normal -0.9999999443367675 -0.00033352672056013993 -9.294556675349947e-06
+ outer loop
+ vertex -151.260267677705 -90.47018648399975 345.08876325046356
+ vertex -151.26056992541777 -90.46966297560473 377.58876324484186
+ vertex -151.2603115854928 -90.33853944542805 345.0887611294912
+ endloop
+endfacet
+facet normal -0.9658394494942373 -0.2591411927454837 -4.808005373273427e-06
+ outer loop
+ vertex -151.29472900568828 -90.21086602669891 377.58875875847633
+ vertex -151.29442675797551 -90.21138953509391 345.08875876409803
+ vertex -151.26061383320555 -90.33801593703302 377.5887611238696
+ endloop
+endfacet
+facet normal -0.9658394494942373 -0.2591411927454837 -4.808005373273427e-06
+ outer loop
+ vertex -151.2603115854928 -90.33853944542805 345.0887611294912
+ vertex -151.26061383320555 -90.33801593703302 377.5887611238696
+ vertex -151.29442675797551 -90.21138953509391 345.08875876409803
+ endloop
+endfacet
+facet normal -0.8660161037036396 -0.5000161078665039 3.4595557560199615e-10
+ outer loop
+ vertex -151.32756309483193 -90.1539981588412 377.58875753709685
+ vertex -151.3272608471192 -90.15452166723622 345.0887575427185
+ vertex -151.29472900568828 -90.21086602669891 377.58875875847633
+ endloop
+endfacet
+facet normal -0.8660161037036396 -0.5000161078665039 3.4595557560199615e-10
+ outer loop
+ vertex -151.29442675797551 -90.21138953509391 345.08875876409803
+ vertex -151.29472900568828 -90.21086602669891 377.58875875847633
+ vertex -151.3272608471192 -90.15452166723622 345.0887575427185
+ endloop
+endfacet
+facet normal -0.8660161037050179 -0.5000161078641165 3.4595552432920484e-10
+ outer loop
+ vertex -156.82774028038585 -80.62782101973391 377.58855293864514
+ vertex -156.8274380326731 -80.62834452812892 345.08855294426684
+ vertex -151.32756309483193 -90.1539981588412 377.58875753709685
+ endloop
+endfacet
+facet normal -0.8660161037050179 -0.5000161078641165 3.4595552432920484e-10
+ outer loop
+ vertex -151.3272608471192 -90.15452166723622 345.0887575427185
+ vertex -151.32756309483193 -90.1539981588412 377.58875753709685
+ vertex -156.8274380326731 -80.62834452812892 345.08855294426684
+ endloop
+endfacet
+facet normal -0.8660161037057211 -0.5000161078628986 3.4595549817070225e-10
+ outer loop
+ vertex -156.85963720280094 -80.5725763025423 377.5885517521269
+ vertex -156.8593349550882 -80.57309981093734 345.0885517577485
+ vertex -156.82774028038585 -80.62782101973391 377.58855293864514
+ endloop
+endfacet
+facet normal -0.8660161037057211 -0.5000161078628986 3.4595549817070225e-10
+ outer loop
+ vertex -156.8274380326731 -80.62834452812892 345.08855294426684
+ vertex -156.82774028038585 -80.62782101973391 377.58855293864514
+ vertex -156.8593349550882 -80.57309981093734 345.0885517577485
+ endloop
+endfacet
+facet normal -0.709917628601528 -0.7042847155648722 4.7423994343577765e-06
+ outer loop
+ vertex -156.95230996383125 -80.4791623390111 377.58854938556914
+ vertex -156.95200771611852 -80.47968584740612 345.08854939119084
+ vertex -156.85963720280094 -80.5725763025423 377.5885517521269
+ endloop
+endfacet
+facet normal -0.709917628601528 -0.7042847155648722 4.7423994343577765e-06
+ outer loop
+ vertex -156.8593349550882 -80.57309981093734 345.0885517577485
+ vertex -156.85963720280094 -80.5725763025423 377.5885517521269
+ vertex -156.95200771611852 -80.47968584740612 345.08854939119084
+ endloop
+endfacet
+facet normal -0.5034454744536385 -0.8640269985173223 9.235696742973624e-06
+ outer loop
+ vertex -157.0660022899498 -80.41291685461871 377.58854726115953
+ vertex -157.06570004223704 -80.41344036301373 345.08854726678123
+ vertex -156.95230996383125 -80.4791623390111 377.58854938556914
+ endloop
+endfacet
+facet normal -0.5034454744536385 -0.8640269985173223 9.235696742973624e-06
+ outer loop
+ vertex -156.95200771611852 -80.47968584740612 345.08854939119084
+ vertex -156.95230996383125 -80.4791623390111 377.58854938556914
+ vertex -157.06570004223704 -80.41344036301373 345.08854726678123
+ endloop
+endfacet
+facet normal -0.2626643432022402 -0.9648872693939623 1.3099596581305774e-05
+ outer loop
+ vertex -157.19296623701752 -80.37835436965082 377.58854552367296
+ vertex -157.19266398930475 -80.37887787804584 345.08854552929466
+ vertex -157.0660022899498 -80.41291685461871 377.58854726115953
+ endloop
+endfacet
+facet normal -0.2626643432022402 -0.9648872693939623 1.3099596581305774e-05
+ outer loop
+ vertex -157.06570004223704 -80.41344036301373 345.08854726678123
+ vertex -157.0660022899498 -80.41291685461871 377.58854726115953
+ vertex -157.19266398930475 -80.37887787804584 345.08854552929466
+ endloop
+endfacet
+facet normal -0.003983071039397157 -0.9999920674119497 1.6070780560670505e-05
+ outer loop
+ vertex -157.32424717414648 -80.3783537687353 345.08854429713796
+ vertex -157.19266398930475 -80.37887787804584 345.08854552929466
+ vertex -157.32454942185925 -80.37783026034028 377.58854429151626
+ endloop
+endfacet
+facet normal -0.003983071039397157 -0.9999920674119497 1.6070780560670505e-05
+ outer loop
+ vertex -157.19296623701752 -80.37835436965082 377.58854552367296
+ vertex -157.32454942185925 -80.37783026034028 377.58854429151626
+ vertex -157.19266398930475 -80.37887787804584 345.08854552929466
+ endloop
+endfacet
+facet normal 0.254969640838129 -0.9669490586007048 1.794676740309682e-05
+ outer loop
+ vertex -157.45148242016668 -80.41190375226617 345.0885436542806
+ vertex -157.32424717414648 -80.3783537687353 345.08854429713796
+ vertex -157.45178466787942 -80.41138024387115 377.5885436486589
+ endloop
+endfacet
+facet normal 0.254969640838129 -0.9669490586007048 1.794676740309682e-05
+ outer loop
+ vertex -157.32454942185925 -80.37783026034028 377.58854429151626
+ vertex -157.45178466787942 -80.41138024387115 377.5885436486589
+ vertex -157.32424717414648 -80.3783537687353 345.08854429713796
+ endloop
+endfacet
+facet normal 0.49972531030155287 -0.8661839376818655 1.8599858312561852e-05
+ outer loop
+ vertex -158.8098982636667 -81.19561117211109 345.0885436450293
+ vertex -157.45148242016668 -80.41190375226617 345.0885436542806
+ vertex -158.81020051137943 -81.19508766371607 377.5885436394076
+ endloop
+endfacet
+facet normal 0.49972531030155287 -0.8661839376818655 1.8599858312561852e-05
+ outer loop
+ vertex -157.45178466787942 -80.41138024387115 377.5885436486589
+ vertex -158.81020051137943 -81.19508766371607 377.5885436394076
+ vertex -157.45148242016668 -80.41190375226617 345.0885436542806
+ endloop
+endfacet
+facet normal 0.8660161037049837 0.5000161078641757 -3.4595552560077707e-10
+ outer loop
+ vertex -158.8098982636667 -81.19561117211109 345.0885436450293
+ vertex -158.81020051137943 -81.19508766371607 377.5885436394076
+ vertex -158.05989642406126 -82.49459666616059 345.08857154398777
+ endloop
+endfacet
+facet normal 0.8660161037049837 0.5000161078641757 -3.4595552560077707e-10
+ outer loop
+ vertex -158.06019867177403 -82.49407315776557 377.5885715383661
+ vertex -158.05989642406126 -82.49459666616059 345.08857154398777
+ vertex -158.81020051137943 -81.19508766371607 377.5885436394076
+ endloop
+endfacet
+facet normal 0.5000547685627937 -0.8659937806310483 1.8599859210821377e-05
+ outer loop
+ vertex -158.9258902048422 -82.99465143480991 345.0885715451641
+ vertex -158.05989642406126 -82.49459666616059 345.08857154398777
+ vertex -158.92619245255497 -82.99412792641489 377.58857153954244
+ endloop
+endfacet
+facet normal 0.5000547685627937 -0.8659937806310483 1.8599859210821377e-05
+ outer loop
+ vertex -158.06019867177403 -82.49407315776557 377.5885715383661
+ vertex -158.92619245255497 -82.99412792641489 377.58857153954244
+ vertex -158.05989642406126 -82.49459666616059 345.08857154398777
+ endloop
+endfacet
+facet normal -0.8659937807809691 -0.5000547686490778 1.1763031620459855e-09
+ outer loop
+ vertex -159.6762746061464 -81.69513725417359 377.5885436397536
+ vertex -159.67597235843363 -81.69566076256861 345.0885436453753
+ vertex -158.92619245255497 -82.99412792641489 377.58857153954244
+ endloop
+endfacet
+facet normal -0.8659937807809691 -0.5000547686490778 1.1763031620459855e-09
+ outer loop
+ vertex -158.9258902048422 -82.99465143480991 345.0885715451641
+ vertex -158.92619245255497 -82.99412792641489 377.58857153954244
+ vertex -159.67597235843363 -81.69566076256861 345.0885436453753
+ endloop
+endfacet
+facet normal 0.5000161077776379 -0.8660161035552092 1.8599859244801655e-05
+ outer loop
+ vertex -161.4080045675698 -82.69569297929348 345.0885436460672
+ vertex -159.67597235843363 -81.69566076256861 345.0885436453753
+ vertex -161.40830681528254 -82.69516947089848 377.5885436404455
+ endloop
+endfacet
+facet normal 0.5000161077776379 -0.8660161035552092 1.8599859244801655e-05
+ outer loop
+ vertex -159.6762746061464 -81.69513725417359 377.5885436397536
+ vertex -161.40830681528254 -82.69516947089848 377.5885436404455
+ vertex -159.67597235843363 -81.69566076256861 345.0885436453753
+ endloop
+endfacet
+facet normal -0.8660161037050258 -0.5000161078641028 3.459555415450973e-10
+ outer loop
+ vertex -155.4081547674058 -93.08729127740574 377.5887668372221
+ vertex -155.40785251969302 -93.08781478580076 345.0887668428438
+ vertex -151.6575400968454 -99.58326741179927 377.5889063545374
+ endloop
+endfacet
+facet normal -0.8660161037050258 -0.5000161078641028 3.459555415450973e-10
+ outer loop
+ vertex -151.65723784913263 -99.58379092019429 345.0889063601591
+ vertex -151.6575400968454 -99.58326741179927 377.5889063545374
+ vertex -155.40785251969302 -93.08781478580076 345.0887668428438
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -3.961238550800757 186.73281865026806 76.8999141407756
+ vertex -3.9950524216843983 186.47399897618763 76.89991962967026
+ vertex -3.995182614498396 186.60563465350577 76.89991965080323
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -3.9951813993197236 186.54030197121796 76.89991965060597
+ vertex -3.995182614498396 186.60563465350577 76.89991965080323
+ vertex -3.9950524216843983 186.47399897618763 76.89991962967026
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex 8.004819788799246 186.47642412596153 76.89797173010376
+ vertex 8.00490228563008 182.04107707777706 76.89797171671222
+ vertex 8.004818596528835 186.54052516952885 76.89797173029733
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex 6.5049022873944224 182.04098221396214 76.89821520675073
+ vertex 8.004818596528835 186.54052516952885 76.89797173029733
+ vertex 8.00490228563008 182.04107707777706 76.89797171671222
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex 8.004370825208392 186.60801783027892 76.8979718029818
+ vertex 8.004818596528835 186.54052516952885 76.89797173029733
+ vertex 6.5049022873944224 182.04098221396214 76.89821520675073
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex 7.9698782027940425 186.73501138752812 76.89797740205503
+ vertex 8.004370825208392 186.60801783027892 76.8979718029818
+ vertex 6.5049022873944224 182.04098221396214 76.89821520675073
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex 7.903692536771713 186.84875039664965 76.89798814575447
+ vertex 7.9698782027940425 186.73501138752812 76.89797740205503
+ vertex 6.5049022873944224 182.04098221396214 76.89821520675073
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex 7.810324270904046 186.94148373213423 76.89800330191619
+ vertex 7.903692536771713 186.84875039664965 76.89798814575447
+ vertex 6.5049022873944224 182.04098221396214 76.89821520675073
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex 7.696136298211437 187.00689177041784 76.89802183767291
+ vertex 7.810324270904046 186.94148373213423 76.89800330191619
+ vertex 6.5049022873944224 182.04098221396214 76.89821520675073
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex 7.568910340328418 187.0405170617832 76.89804248984264
+ vertex 7.696136298211437 187.00689177041784 76.89802183767291
+ vertex 6.5049022873944224 182.04098221396214 76.89821520675073
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex 7.504809296772143 187.0405158695128 76.89805289515232
+ vertex 7.568910340328418 187.0405170617832 76.89804248984264
+ vertex 6.5049022873944224 182.04098221396214 76.89821520675073
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex 7.437316636033876 187.04006809819236 76.89806385101268
+ vertex 7.504809296772143 187.0405158695128 76.89805289515232
+ vertex 6.5049022873944224 182.04098221396214 76.89821520675073
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -3.429858017145821 187.04031248623983 76.89982788353092
+ vertex 7.437316636033876 187.04006809819236 76.89806385101268
+ vertex 6.5049022873944224 182.04098221396214 76.89821520675073
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -2.4951156644872703 182.04041302993616 76.89967614989796
+ vertex -3.429858017145821 187.04031248623983 76.89982788353092
+ vertex 6.5049022873944224 182.04098221396214 76.89821520675073
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -2.4950524219440524 181.04041303193586 76.8996761396332
+ vertex -2.4951156644872703 182.04041302993616 76.89967614989796
+ vertex 6.5049022873944224 182.04098221396214 76.89821520675073
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -3.995052421684376 182.04038513132357 76.89991962967089
+ vertex -3.429858017145821 187.04031248623983 76.89982788353092
+ vertex -2.4951156644872703 182.04041302993616 76.89967614989796
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -3.4951906994403834 187.04029174271312 76.89983848876919
+ vertex -3.429858017145821 187.04031248623983 76.89982788353092
+ vertex -3.995052421684376 182.04038513132357 76.89991962967089
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -3.5614936944412614 187.04018229342591 76.89984925151508
+ vertex -3.4951906994403834 187.04029174271312 76.89983848876919
+ vertex -3.995052421684376 182.04038513132357 76.89991962967089
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -3.6886102984221987 187.00598671651966 76.89986988593301
+ vertex -3.5614936944412614 187.04018229342591 76.89984925151508
+ vertex -3.995052421684376 182.04038513132357 76.89991962967089
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -3.802545042597342 186.94005612757638 76.89988838058402
+ vertex -3.6886102984221987 187.00598671651966 76.89986988593301
+ vertex -3.995052421684376 182.04038513132357 76.89991962967089
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -3.895533462437352 186.846883587277 76.89990347508584
+ vertex -3.802545042597342 186.94005612757638 76.89988838058402
+ vertex -3.995052421684376 182.04038513132357 76.89991962967089
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -3.961238550800757 186.73281865026806 76.8999141407756
+ vertex -3.895533462437352 186.846883587277 76.89990347508584
+ vertex -3.995052421684376 182.04038513132357 76.89991962967089
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -3.9950524216843983 186.47399897618763 76.89991962967026
+ vertex -3.961238550800757 186.73281865026806 76.8999141407756
+ vertex -3.995052421684376 182.04038513132357 76.89991962967089
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex 8.004947609025319 179.6043169604712 76.89797170935657
+ vertex 8.004948795543585 179.54052517073993 76.89797170916319
+ vertex 8.004920886734789 181.0410101149205 76.8979717136939
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex 8.004423499704865 179.47273377562388 76.89797179443275
+ vertex 8.004920886734789 181.0410101149205 76.8979717136939
+ vertex 8.004948795543585 179.54052517073993 76.89797170916319
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex 6.50496552993764 181.04098221596183 76.89821519648596
+ vertex 8.004920886734789 181.0410101149205 76.8979717136939
+ vertex 8.004423499704865 179.47273377562388 76.89797179443275
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex 7.969861014728949 179.34576982854816 76.89797740484748
+ vertex 6.50496552993764 181.04098221596183 76.89821519648596
+ vertex 8.004423499704865 179.47273377562388 76.89797179443275
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex 7.903615530330879 179.23207750241966 76.89798815825706
+ vertex 6.50496552993764 181.04098221596183 76.89821519648596
+ vertex 7.969861014728949 179.34576982854816 76.89797740484748
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex 7.8102015667969376 179.1394047413783 76.89800332183769
+ vertex 6.50496552993764 181.04098221596183 76.89821519648596
+ vertex 7.903615530330879 179.23207750241966 76.89798815825706
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex 7.695985131367816 179.0740670409404 76.89802186221303
+ vertex 6.50496552993764 181.04098221596183 76.89821519648596
+ vertex 7.8102015667969376 179.1394047413783 76.89800332183769
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex 7.568749885366482 179.04051705741503 76.89804251589057
+ vertex 6.50496552993764 181.04098221596183 76.89821519648596
+ vertex 7.695985131367816 179.0740670409404 76.89802186221303
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex 7.504958095646097 179.0405158708967 76.89805287100077
+ vertex 6.50496552993764 181.04098221596183 76.89821519648596
+ vertex 7.568749885366482 179.04051705741503 76.89804251589057
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex 7.437166700541916 179.0410411667353 76.89806387535373
+ vertex 6.50496552993764 181.04098221596183 76.89821519648596
+ vertex 7.504958095646097 179.0405158708967 76.89805287100077
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -3.429060924777962 179.040353958863 76.8998277541441
+ vertex 6.50496552993764 181.04098221596183 76.89821519648596
+ vertex 7.437166700541916 179.0410411667353 76.89806387535373
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex 6.5049022873944224 182.04098221396214 76.89821520675073
+ vertex 6.50496552993764 181.04098221596183 76.89821519648596
+ vertex -3.429060924777962 179.040353958863 76.8998277541441
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -2.4950524219440524 181.04041303193586 76.8996761396332
+ vertex 6.5049022873944224 182.04098221396214 76.89821520675073
+ vertex -3.429060924777962 179.040353958863 76.8998277541441
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -3.9950524216844676 181.0403181681208 76.89991962967197
+ vertex -2.4950524219440524 181.04041303193586 76.8996761396332
+ vertex -3.429060924777962 179.040353958863 76.8998277541441
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -3.495041900548237 179.040311272445 76.89983846461764
+ vertex -3.9950524216844676 181.0403181681208 76.89991962967197
+ vertex -3.429060924777962 179.040353958863 76.8998277541441
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -3.560707963343993 179.04031005106543 76.89984912397246
+ vertex -3.9950524216844676 181.0403181681208 76.89991962967197
+ vertex -3.495041900548237 179.040311272445 76.89983846461764
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -3.6878806020234753 179.074340400208 76.8998697674871
+ vertex -3.9950524216844676 181.0403181681208 76.89991962967197
+ vertex -3.560707963343993 179.04031005106543 76.89984912397246
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -3.8019122356534525 179.1401258942342 76.89988827786495
+ vertex -3.9950524216844676 181.0403181681208 76.89991962967197
+ vertex -3.6878806020234753 179.074340400208 76.8998697674871
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -3.895031796847954 179.23318336044213 76.89990339365369
+ vertex -3.9950524216844676 181.0403181681208 76.89991962967197
+ vertex -3.8019122356534525 179.1401258942342 76.89988827786495
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -3.9608933413990166 179.34717108629414 76.8999140847412
+ vertex -3.9950524216844676 181.0403181681208 76.89991962967197
+ vertex -3.895031796847954 179.23318336044213 76.89990339365369
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -3.995008513886932 179.47432099664724 76.89991962254427
+ vertex -3.9950524216844676 181.0403181681208 76.89991962967197
+ vertex -3.9608933413990166 179.34717108629414 76.8999140847412
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -3.9950512003049288 179.54030197242892 76.89991962947417
+ vertex -3.9950524216844676 181.0403181681208 76.89991962967197
+ vertex -3.995008513886932 179.47432099664724 76.89991962254427
+ endloop
+endfacet
+facet normal -2.1312253621353532e-06 -4.140663892805014e-15 -0.9999999999977288
+ outer loop
+ vertex -3.9950524216844774 179.60596803523603 76.89991962967161
+ vertex -3.9950524216844676 181.0403181681208 76.89991962967197
+ vertex -3.9950512003049288 179.54030197242892 76.89991962947417
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex 8.005970601283938 179.60431696047303 556.8998883596455
+ vertex 8.005943878993453 181.04101011492233 556.899888363982
+ vertex 8.005971787802203 179.54052517074172 556.8998883594513
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex 6.505988522196304 181.04098221596362 556.900131846774
+ vertex 8.005971787802203 179.54052517074172 556.8998883594513
+ vertex 8.005943878993453 181.04101011492233 556.899888363982
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex 8.005446491963482 179.4727337756257 556.8998884447209
+ vertex 8.005971787802203 179.54052517074172 556.8998883594513
+ vertex 6.505988522196304 181.04098221596362 556.900131846774
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex 7.970884006987567 179.34576982854998 556.8998940551355
+ vertex 8.005446491963482 179.4727337756257 556.8998884447209
+ vertex 6.505988522196304 181.04098221596362 556.900131846774
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex 7.904638522589498 179.23207750242145 556.8999048085452
+ vertex 7.970884006987567 179.34576982854998 556.8998940551355
+ vertex 6.505988522196304 181.04098221596362 556.900131846774
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex 7.811224559055601 179.13940474138013 556.8999199721258
+ vertex 7.904638522589498 179.23207750242145 556.8999048085452
+ vertex 6.505988522196304 181.04098221596362 556.900131846774
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex 7.697008123626435 179.07406704094223 556.8999385125012
+ vertex 7.811224559055601 179.13940474138013 556.8999199721258
+ vertex 6.505988522196304 181.04098221596362 556.900131846774
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex 7.5697728776251 179.04051705741682 556.8999591661794
+ vertex 7.697008123626435 179.07406704094223 556.8999385125012
+ vertex 6.505988522196304 181.04098221596362 556.900131846774
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex 7.505981087904783 179.04051587089853 556.8999695212889
+ vertex 7.5697728776251 179.04051705741682 556.8999591661794
+ vertex 6.505988522196304 181.04098221596362 556.900131846774
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex 7.4381896928005355 179.0410411667371 556.8999805256426
+ vertex 7.505981087904783 179.04051587089853 556.8999695212889
+ vertex 6.505988522196304 181.04098221596362 556.900131846774
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -3.4280379325193433 179.04035395886478 556.9017444044338
+ vertex 7.4381896928005355 179.0410411667371 556.8999805256426
+ vertex 6.505988522196304 181.04098221596362 556.900131846774
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex 6.505925279653086 182.04098221396393 556.9001318570389
+ vertex -3.4280379325193433 179.04035395886478 556.9017444044338
+ vertex 6.505988522196304 181.04098221596362 556.900131846774
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -2.4940294296854337 181.04041303193765 556.9015927899221
+ vertex -3.4280379325193433 179.04035395886478 556.9017444044338
+ vertex 6.505925279653086 182.04098221396393 556.9001318570389
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -3.9940294294258263 181.0403181681226 556.9018362799609
+ vertex -3.4280379325193433 179.04035395886478 556.9017444044338
+ vertex -2.4940294296854337 181.04041303193765 556.9015927899221
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -3.4940189082896183 179.0403112724468 556.9017551149075
+ vertex -3.4280379325193433 179.04035395886478 556.9017444044338
+ vertex -3.9940294294258263 181.0403181681226 556.9018362799609
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -3.5596849710853746 179.04031005106725 556.9017657742614
+ vertex -3.4940189082896183 179.0403112724468 556.9017551149075
+ vertex -3.9940294294258263 181.0403181681226 556.9018362799609
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -3.6868576097648345 179.07434040020982 556.901786417776
+ vertex -3.5596849710853746 179.04031005106725 556.9017657742614
+ vertex -3.9940294294258263 181.0403181681226 556.9018362799609
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -3.800889243394811 179.14012589423604 556.9018049281539
+ vertex -3.6868576097648345 179.07434040020982 556.901786417776
+ vertex -3.9940294294258263 181.0403181681226 556.9018362799609
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -3.894008804589336 179.23318336044392 556.9018200439434
+ vertex -3.800889243394811 179.14012589423604 556.9018049281539
+ vertex -3.9940294294258263 181.0403181681226 556.9018362799609
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -3.9598703491403984 179.34717108629593 556.9018307350301
+ vertex -3.894008804589336 179.23318336044392 556.9018200439434
+ vertex -3.9940294294258263 181.0403181681226 556.9018362799609
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -3.993985521628291 179.47432099664906 556.901836272834
+ vertex -3.9598703491403984 179.34717108629593 556.9018307350301
+ vertex -3.9940294294258263 181.0403181681226 556.9018362799609
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -3.994028208046288 179.54030197243074 556.9018362797632
+ vertex -3.993985521628291 179.47432099664906 556.901836272834
+ vertex -3.9940294294258263 181.0403181681226 556.9018362799609
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -3.9940294294258365 179.60596803523782 556.9018362799613
+ vertex -3.994028208046288 179.54030197243074 556.9018362797632
+ vertex -3.9940294294258263 181.0403181681226 556.9018362799609
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex 8.005925277888721 182.04107707777888 556.899888367001
+ vertex 8.005842781057865 186.47642412596332 556.8998883803919
+ vertex 6.505925279653086 182.04098221396393 556.9001318570389
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex 8.005841588787453 186.54052516953067 556.8998883805855
+ vertex 6.505925279653086 182.04098221396393 556.9001318570389
+ vertex 8.005842781057865 186.47642412596332 556.8998883803919
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex 8.00539381746701 186.60801783028077 556.8998884532699
+ vertex 6.505925279653086 182.04098221396393 556.9001318570389
+ vertex 8.005841588787453 186.54052516953067 556.8998883805855
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex 7.970901195052661 186.73501138752994 556.8998940523439
+ vertex 6.505925279653086 182.04098221396393 556.9001318570389
+ vertex 8.00539381746701 186.60801783028077 556.8998884532699
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex 7.904715529030331 186.84875039665144 556.8999047960434
+ vertex 6.505925279653086 182.04098221396393 556.9001318570389
+ vertex 7.970901195052661 186.73501138752994 556.8998940523439
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex 7.811347263162688 186.94148373213605 556.8999199522051
+ vertex 6.505925279653086 182.04098221396393 556.9001318570389
+ vertex 7.904715529030331 186.84875039665144 556.8999047960434
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex 7.697159290470078 187.00689177041966 556.8999384879611
+ vertex 6.505925279653086 182.04098221396393 556.9001318570389
+ vertex 7.811347263162688 186.94148373213605 556.8999199522051
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex 7.569933332587059 187.04051706178498 556.8999591401308
+ vertex 6.505925279653086 182.04098221396393 556.9001318570389
+ vertex 7.697159290470078 187.00689177041966 556.8999384879611
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex 7.505832289030784 187.0405158695146 556.8999695454412
+ vertex 6.505925279653086 182.04098221396393 556.9001318570389
+ vertex 7.569933332587059 187.04051706178498 556.8999591401308
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex 7.43833962829254 187.04006809819415 556.8999805013008
+ vertex 6.505925279653086 182.04098221396393 556.9001318570389
+ vertex 7.505832289030784 187.0405158695146 556.8999695454412
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -3.4288350248871344 187.04031248624165 556.9017445338206
+ vertex 6.505925279653086 182.04098221396393 556.9001318570389
+ vertex 7.43833962829254 187.04006809819415 556.8999805013008
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -2.4940926722286294 182.04041302993795 556.9015928001869
+ vertex 6.505925279653086 182.04098221396393 556.9001318570389
+ vertex -3.4288350248871344 187.04031248624165 556.9017445338206
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -2.4940294296854337 181.04041303193765 556.9015927899221
+ vertex 6.505925279653086 182.04098221396393 556.9001318570389
+ vertex -2.4940926722286294 182.04041302993795 556.9015928001869
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -3.994029429425735 182.0403851313254 556.9018362799605
+ vertex -2.4940926722286294 182.04041302993795 556.9015928001869
+ vertex -3.4288350248871344 187.04031248624165 556.9017445338206
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -3.49416770718172 187.0402917427149 556.9017551390589
+ vertex -3.994029429425735 182.0403851313254 556.9018362799605
+ vertex -3.4288350248871344 187.04031248624165 556.9017445338206
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -3.5604707021826427 187.0401822934277 556.901765901804
+ vertex -3.994029429425735 182.0403851313254 556.9018362799605
+ vertex -3.49416770718172 187.0402917427149 556.9017551390589
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -3.6875873061635125 187.00598671652142 556.9017865362227
+ vertex -3.994029429425735 182.0403851313254 556.9018362799605
+ vertex -3.5604707021826427 187.0401822934277 556.901765901804
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -3.8015220503386784 186.94005612757817 556.9018050308729
+ vertex -3.994029429425735 182.0403851313254 556.9018362799605
+ vertex -3.6875873061635125 187.00598671652142 556.9017865362227
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -3.894510470178711 186.8468835872788 556.9018201253748
+ vertex -3.994029429425735 182.0403851313254 556.9018362799605
+ vertex -3.8015220503386784 186.94005612757817 556.9018050308729
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -3.9602155585421386 186.73281865026988 556.9018307910653
+ vertex -3.994029429425735 182.0403851313254 556.9018362799605
+ vertex -3.894510470178711 186.8468835872788 556.9018201253748
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -3.9940294294257574 186.47399897618942 556.9018362799592
+ vertex -3.994029429425735 182.0403851313254 556.9018362799605
+ vertex -3.9602155585421386 186.73281865026988 556.9018307910653
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -3.9602155585421386 186.73281865026988 556.9018307910653
+ vertex -3.9941596222397324 186.6056346535076 556.9018363010921
+ vertex -3.9940294294257574 186.47399897618942 556.9018362799592
+ endloop
+endfacet
+facet normal 2.1312253621353532e-06 4.140663892805014e-15 0.9999999999977288
+ outer loop
+ vertex -3.9941584070610827 186.54030197121975 556.9018363008956
+ vertex -3.9940294294257574 186.47399897618942 556.9018362799592
+ vertex -3.9941596222397324 186.6056346535076 556.9018363010921
+ endloop
+endfacet
+facet normal 0.9999999866520455 1.859985899909058e-05 -0.00016232669040715017
+ outer loop
+ vertex 8.004819788799246 186.47642412596153 76.89797173010376
+ vertex 8.005842781057865 186.47642412596332 556.8998883803919
+ vertex 8.00490228563008 182.04107707777706 76.89797171671222
+ endloop
+endfacet
+facet normal 0.9999999866520455 1.859985899909058e-05 -0.00016232669040715017
+ outer loop
+ vertex 8.005925277888721 182.04107707777888 556.899888367001
+ vertex 8.00490228563008 182.04107707777706 76.89797171671222
+ vertex 8.005842781057865 186.47642412596332 556.8998883803919
+ endloop
+endfacet
+facet normal 6.324254323268623e-05 -0.9999999980001903 -1.0265637493691884e-08
+ outer loop
+ vertex 8.005925277888721 182.04107707777888 556.899888367001
+ vertex 6.505925279653086 182.04098221396393 556.9001318570389
+ vertex 8.00490228563008 182.04107707777706 76.89797171671222
+ endloop
+endfacet
+facet normal 6.324254323268623e-05 -0.9999999980001903 -1.0265637493691884e-08
+ outer loop
+ vertex 6.5049022873944224 182.04098221396214 76.89821520675073
+ vertex 8.00490228563008 182.04107707777706 76.89797171671222
+ vertex 6.505925279653086 182.04098221396393 556.9001318570389
+ endloop
+endfacet
+facet normal 0.9999999848252131 6.32425423938018e-05 -0.0001623266901106206
+ outer loop
+ vertex 6.5049022873944224 182.04098221396214 76.89821520675073
+ vertex 6.505925279653086 182.04098221396393 556.9001318570389
+ vertex 6.50496552993764 181.04098221596183 76.89821519648596
+ endloop
+endfacet
+facet normal 0.9999999848252131 6.32425423938018e-05 -0.0001623266901106206
+ outer loop
+ vertex 6.505988522196304 181.04098221596362 556.900131846774
+ vertex 6.50496552993764 181.04098221596183 76.89821519648596
+ vertex 6.505925279653086 182.04098221396393 556.9001318570389
+ endloop
+endfacet
+facet normal -1.859985936989869e-05 0.9999999998270226 3.0189382746239684e-09
+ outer loop
+ vertex 6.505988522196304 181.04098221596362 556.900131846774
+ vertex 8.005943878993453 181.04101011492233 556.899888363982
+ vertex 6.50496552993764 181.04098221596183 76.89821519648596
+ endloop
+endfacet
+facet normal -1.859985936989869e-05 0.9999999998270226 3.0189382746239684e-09
+ outer loop
+ vertex 8.004920886734789 181.0410101149205 76.8979717136939
+ vertex 6.50496552993764 181.04098221596183 76.89821519648596
+ vertex 8.005943878993453 181.04101011492233 556.899888363982
+ endloop
+endfacet
+facet normal 0.9999999866520453 1.8599859030495655e-05 -0.00016232669040715014
+ outer loop
+ vertex 8.004920886734789 181.0410101149205 76.8979717136939
+ vertex 8.005943878993453 181.04101011492233 556.899888363982
+ vertex 8.004947609025319 179.6043169604712 76.89797170935657
+ endloop
+endfacet
+facet normal 0.9999999866520453 1.8599859030495655e-05 -0.00016232669040715014
+ outer loop
+ vertex 8.005970601283938 179.60431696047303 556.8998883596455
+ vertex 8.004947609025319 179.6043169604712 76.89797170935657
+ vertex 8.005943878993453 181.04101011492233 556.899888363982
+ endloop
+endfacet
+facet normal 0.9999999866520455 1.859985829179794e-05 -0.00016232669040715017
+ outer loop
+ vertex 8.004947609025319 179.6043169604712 76.89797170935657
+ vertex 8.005970601283938 179.60431696047303 556.8998883596455
+ vertex 8.004948795543585 179.54052517073993 76.89797170916319
+ endloop
+endfacet
+facet normal 0.9999999866520455 1.859985829179794e-05 -0.00016232669040715017
+ outer loop
+ vertex 8.005971787802203 179.54052517074172 556.8998883594513
+ vertex 8.004948795543585 179.54052517073993 76.89797170916319
+ vertex 8.005970601283938 179.60431696047303 556.8998883596455
+ endloop
+endfacet
+facet normal 0.9999699669272771 -0.007748476952790789 -0.00016232181740206692
+ outer loop
+ vertex 8.004948795543585 179.54052517073993 76.89797170916319
+ vertex 8.005971787802203 179.54052517074172 556.8998883594513
+ vertex 8.004423499704865 179.47273377562388 76.89797179443275
+ endloop
+endfacet
+facet normal 0.9999699669272771 -0.007748476952790789 -0.00016232181740206692
+ outer loop
+ vertex 8.005446491963482 179.4727337756257 556.8998884447209
+ vertex 8.004423499704865 179.47273377562388 76.89797179443275
+ vertex 8.005971787802203 179.54052517074172 556.8998883594513
+ endloop
+endfacet
+facet normal 0.9648872576525398 -0.2626643399621609 -0.00015662695715857293
+ outer loop
+ vertex 8.004423499704865 179.47273377562388 76.89797179443275
+ vertex 8.005446491963482 179.4727337756257 556.8998884447209
+ vertex 7.969861014728949 179.34576982854816 76.89797740484748
+ endloop
+endfacet
+facet normal 0.9648872576525398 -0.2626643399621609 -0.00015662695715857293
+ outer loop
+ vertex 7.970884006987567 179.34576982854998 556.8998940551355
+ vertex 7.969861014728949 179.34576982854816 76.89797740484748
+ vertex 8.005446491963482 179.4727337756257 556.8998884447209
+ endloop
+endfacet
+facet normal 0.8640269900555478 -0.5034454695239448 -0.00014025464343150003
+ outer loop
+ vertex 7.969861014728949 179.34576982854816 76.89797740484748
+ vertex 7.970884006987567 179.34576982854998 556.8998940551355
+ vertex 7.903615530330879 179.23207750241966 76.89798815825706
+ endloop
+endfacet
+facet normal 0.8640269900555478 -0.5034454695239448 -0.00014025464343150003
+ outer loop
+ vertex 7.904638522589498 179.23207750242145 556.8999048085452
+ vertex 7.903615530330879 179.23207750241966 76.89798815825706
+ vertex 7.970884006987567 179.34576982854998 556.8998940551355
+ endloop
+endfacet
+facet normal 0.7042847109399935 -0.7099176240002394 -0.00011432420753334249
+ outer loop
+ vertex 7.811224559055601 179.13940474138013 556.8999199721258
+ vertex 7.8102015667969376 179.1394047413783 76.89800332183769
+ vertex 7.904638522589498 179.23207750242145 556.8999048085452
+ endloop
+endfacet
+facet normal 0.7042847109399935 -0.7099176240002394 -0.00011432420753334249
+ outer loop
+ vertex 7.903615530330879 179.23207750241966 76.89798815825706
+ vertex 7.904638522589498 179.23207750242145 556.8999048085452
+ vertex 7.8102015667969376 179.1394047413783 76.89800332183769
+ endloop
+endfacet
+facet normal 0.49654659145336605 -0.868010066772983 -8.060276562570304e-05
+ outer loop
+ vertex 7.811224559055601 179.13940474138013 556.8999199721258
+ vertex 7.697008123626435 179.07406704094223 556.8999385125012
+ vertex 7.8102015667969376 179.1394047413783 76.89800332183769
+ endloop
+endfacet
+facet normal 0.49654659145336605 -0.868010066772983 -8.060276562570304e-05
+ outer loop
+ vertex 7.695985131367816 179.0740670409404 76.89802186221303
+ vertex 7.8102015667969376 179.1394047413783 76.89800332183769
+ vertex 7.697008123626435 179.07406704094223 556.8999385125012
+ endloop
+endfacet
+facet normal 0.25496964065944644 -0.9669490579285939 -4.1388378170041334e-05
+ outer loop
+ vertex 7.5697728776251 179.04051705741682 556.8999591661794
+ vertex 7.568749885366482 179.04051705741503 76.89804251589057
+ vertex 7.697008123626435 179.07406704094223 556.8999385125012
+ endloop
+endfacet
+facet normal 0.25496964065944644 -0.9669490579285939 -4.1388378170041334e-05
+ outer loop
+ vertex 7.695985131367816 179.0740670409404 76.89802186221303
+ vertex 7.697008123626435 179.07406704094223 556.8999385125012
+ vertex 7.568749885366482 179.04051705741503 76.89804251589057
+ endloop
+endfacet
+facet normal 1.859985924957654e-05 -0.9999999998270226 -3.0189382550924715e-09
+ outer loop
+ vertex 7.5697728776251 179.04051705741682 556.8999591661794
+ vertex 7.505981087904783 179.04051587089853 556.8999695212889
+ vertex 7.568749885366482 179.04051705741503 76.89804251589057
+ endloop
+endfacet
+facet normal 1.859985924957654e-05 -0.9999999998270226 -3.0189382550924715e-09
+ outer loop
+ vertex 7.504958095646097 179.0405158708967 76.89805287100077
+ vertex 7.568749885366482 179.04051705741503 76.89804251589057
+ vertex 7.505981087904783 179.04051587089853 556.8999695212889
+ endloop
+endfacet
+facet normal -0.0077484770488550295 -0.9999699801003236 1.257784967194969e-06
+ outer loop
+ vertex 7.4381896928005355 179.0410411667371 556.8999805256426
+ vertex 7.437166700541916 179.0410411667353 76.89806387535373
+ vertex 7.505981087904783 179.04051587089853 556.8999695212889
+ endloop
+endfacet
+facet normal -0.0077484770488550295 -0.9999699801003236 1.257784967194969e-06
+ outer loop
+ vertex 7.504958095646097 179.0405158708967 76.89805287100077
+ vertex 7.505981087904783 179.04051587089853 556.8999695212889
+ vertex 7.437166700541916 179.0410411667353 76.89806387535373
+ endloop
+endfacet
+facet normal 6.324254327381863e-05 -0.9999999980001905 -1.0265637500368771e-08
+ outer loop
+ vertex 7.4381896928005355 179.0410411667371 556.8999805256426
+ vertex -3.4280379325193433 179.04035395886478 556.9017444044338
+ vertex 7.437166700541916 179.0410411667353 76.89806387535373
+ endloop
+endfacet
+facet normal 6.324254327381863e-05 -0.9999999980001905 -1.0265637500368771e-08
+ outer loop
+ vertex -3.429060924777962 179.040353958863 76.8998277541441
+ vertex 7.437166700541916 179.0410411667353 76.89806387535373
+ vertex -3.4280379325193433 179.04035395886478 556.9017444044338
+ endloop
+endfacet
+facet normal 0.0006469502546810972 -0.9999997907276567 -1.0501697972304278e-07
+ outer loop
+ vertex -3.4280379325193433 179.04035395886478 556.9017444044338
+ vertex -3.4940189082896183 179.0403112724468 556.9017551149075
+ vertex -3.429060924777962 179.040353958863 76.8998277541441
+ endloop
+endfacet
+facet normal 0.0006469502546810972 -0.9999997907276567 -1.0501697972304278e-07
+ outer loop
+ vertex -3.495041900548237 179.040311272445 76.89983846461764
+ vertex -3.429060924777962 179.040353958863 76.8998277541441
+ vertex -3.4940189082896183 179.0403112724468 556.9017551149075
+ endloop
+endfacet
+facet normal 1.859985924957654e-05 -0.9999999998270226 -3.0189382550924715e-09
+ outer loop
+ vertex -3.4940189082896183 179.0403112724468 556.9017551149075
+ vertex -3.5596849710853746 179.04031005106725 556.9017657742614
+ vertex -3.495041900548237 179.040311272445 76.89983846461764
+ endloop
+endfacet
+facet normal 1.859985924957654e-05 -0.9999999998270226 -3.0189382550924715e-09
+ outer loop
+ vertex -3.560707963343993 179.04031005106543 76.89984912397246
+ vertex -3.495041900548237 179.040311272445 76.89983846461764
+ vertex -3.5596849710853746 179.04031005106725 556.9017657742614
+ endloop
+endfacet
+facet normal -0.2584968684381998 -0.966012094772588 4.196094199893686e-05
+ outer loop
+ vertex -3.6868576097648345 179.07434040020982 556.901786417776
+ vertex -3.6878806020234753 179.074340400208 76.8998697674871
+ vertex -3.5596849710853746 179.04031005106725 556.9017657742614
+ endloop
+endfacet
+facet normal -0.2584968684381998 -0.966012094772588 4.196094199893686e-05
+ outer loop
+ vertex -3.560707963343993 179.04031005106543 76.89984912397246
+ vertex -3.5596849710853746 179.04031005106725 556.9017657742614
+ vertex -3.6878806020234753 179.074340400208 76.8998697674871
+ endloop
+endfacet
+facet normal -0.4997111279331008 -0.8661921161266414 8.111645491291908e-05
+ outer loop
+ vertex -3.6868576097648345 179.07434040020982 556.901786417776
+ vertex -3.800889243394811 179.14012589423604 556.9018049281539
+ vertex -3.6878806020234753 179.074340400208 76.8998697674871
+ endloop
+endfacet
+facet normal -0.4997111279331008 -0.8661921161266414 8.111645491291908e-05
+ outer loop
+ vertex -3.8019122356534525 179.1401258942342 76.89988827786495
+ vertex -3.6878806020234753 179.074340400208 76.8998697674871
+ vertex -3.800889243394811 179.14012589423604 556.9018049281539
+ endloop
+endfacet
+facet normal -0.7068708981905478 -0.7073425762140287 0.00011474401520307611
+ outer loop
+ vertex -3.800889243394811 179.14012589423604 556.9018049281539
+ vertex -3.894008804589336 179.23318336044392 556.9018200439434
+ vertex -3.8019122356534525 179.1401258942342 76.89988827786495
+ endloop
+endfacet
+facet normal -0.7068708981905478 -0.7073425762140287 0.00011474401520307611
+ outer loop
+ vertex -3.895031796847954 179.23318336044213 76.89990339365369
+ vertex -3.8019122356534525 179.1401258942342 76.89988827786495
+ vertex -3.894008804589336 179.23318336044392 556.9018200439434
+ endloop
+endfacet
+facet normal -0.8658585837036067 -0.500288809860795 0.0001405519602870857
+ outer loop
+ vertex -3.9608933413990166 179.34717108629414 76.8999140847412
+ vertex -3.895031796847954 179.23318336044213 76.89990339365369
+ vertex -3.9598703491403984 179.34717108629593 556.9018307350301
+ endloop
+endfacet
+facet normal -0.8658585837036067 -0.500288809860795 0.0001405519602870857
+ outer loop
+ vertex -3.894008804589336 179.23318336044392 556.9018200439434
+ vertex -3.9598703491403984 179.34717108629593 556.9018307350301
+ vertex -3.895031796847954 179.23318336044213 76.89990339365369
+ endloop
+endfacet
+facet normal -0.9658394376347457 -0.2591411895645942 0.00015678152155038612
+ outer loop
+ vertex -3.995008513886932 179.47432099664724 76.89991962254427
+ vertex -3.9608933413990166 179.34717108629414 76.8999140847412
+ vertex -3.993985521628291 179.47432099664906 556.901836272834
+ endloop
+endfacet
+facet normal -0.9658394376347457 -0.2591411895645942 0.00015678152155038612
+ outer loop
+ vertex -3.9598703491403984 179.34717108629593 556.9018307350301
+ vertex -3.993985521628291 179.47432099664906 556.901836272834
+ vertex -3.9608933413990166 179.34717108629414 76.8999140847412
+ endloop
+endfacet
+facet normal -0.999999777552693 -0.0006469502463694973 0.00016232665646494202
+ outer loop
+ vertex -3.9950512003049288 179.54030197242892 76.89991962947417
+ vertex -3.995008513886932 179.47432099664724 76.89991962254427
+ vertex -3.994028208046288 179.54030197243074 556.9018362797632
+ endloop
+endfacet
+facet normal -0.999999777552693 -0.0006469502463694973 0.00016232665646494202
+ outer loop
+ vertex -3.993985521628291 179.47432099664906 556.901836272834
+ vertex -3.994028208046288 179.54030197243074 556.9018362797632
+ vertex -3.995008513886932 179.47432099664724 76.89991962254427
+ endloop
+endfacet
+facet normal -0.9999999866520455 -1.859985899909058e-05 0.00016232669040715017
+ outer loop
+ vertex -3.9950524216844774 179.60596803523603 76.89991962967161
+ vertex -3.9950512003049288 179.54030197242892 76.89991962947417
+ vertex -3.9940294294258365 179.60596803523782 556.9018362799613
+ endloop
+endfacet
+facet normal -0.9999999866520455 -1.859985899909058e-05 0.00016232669040715017
+ outer loop
+ vertex -3.994028208046288 179.54030197243074 556.9018362797632
+ vertex -3.9940294294258365 179.60596803523782 556.9018362799613
+ vertex -3.9950512003049288 179.54030197242892 76.89991962947417
+ endloop
+endfacet
+facet normal -0.9999999868250228 3.59775884415742e-15 0.00016232669043522314
+ outer loop
+ vertex -3.9950524216844676 181.0403181681208 76.89991962967197
+ vertex -3.9950524216844774 179.60596803523603 76.89991962967161
+ vertex -3.9940294294258263 181.0403181681226 556.9018362799609
+ endloop
+endfacet
+facet normal -0.9999999868250228 3.59775884415742e-15 0.00016232669043522314
+ outer loop
+ vertex -3.9940294294258365 179.60596803523782 556.9018362799613
+ vertex -3.9940294294258263 181.0403181681226 556.9018362799609
+ vertex -3.9950524216844774 179.60596803523603 76.89991962967161
+ endloop
+endfacet
+facet normal -6.324254324805926e-05 0.9999999980001905 1.0265637496187337e-08
+ outer loop
+ vertex -3.9940294294258263 181.0403181681226 556.9018362799609
+ vertex -2.4940294296854337 181.04041303193765 556.9015927899221
+ vertex -3.9950524216844676 181.0403181681208 76.89991962967197
+ endloop
+endfacet
+facet normal -6.324254324805926e-05 0.9999999980001905 1.0265637496187337e-08
+ outer loop
+ vertex -2.4950524219440524 181.04041303193586 76.8996761396332
+ vertex -3.9950524216844676 181.0403181681208 76.89991962967197
+ vertex -2.4940294296854337 181.04041303193765 556.9015927899221
+ endloop
+endfacet
+facet normal -0.9999999848252131 -6.32425423938018e-05 0.0001623266901106206
+ outer loop
+ vertex -2.4951156644872703 182.04041302993616 76.89967614989796
+ vertex -2.4950524219440524 181.04041303193586 76.8996761396332
+ vertex -2.4940926722286294 182.04041302993795 556.9015928001869
+ endloop
+endfacet
+facet normal -0.9999999848252131 -6.32425423938018e-05 0.0001623266901106206
+ outer loop
+ vertex -2.4940294296854337 181.04041303193765 556.9015927899221
+ vertex -2.4940926722286294 182.04041302993795 556.9015928001869
+ vertex -2.4950524219440524 181.04041303193586 76.8996761396332
+ endloop
+endfacet
+facet normal 1.859985924957654e-05 -0.9999999998270226 -3.0189382550924715e-09
+ outer loop
+ vertex -3.994029429425735 182.0403851313254 556.9018362799605
+ vertex -3.995052421684376 182.04038513132357 76.89991962967089
+ vertex -2.4940926722286294 182.04041302993795 556.9015928001869
+ endloop
+endfacet
+facet normal 1.859985924957654e-05 -0.9999999998270226 -3.0189382550924715e-09
+ outer loop
+ vertex -2.4951156644872703 182.04041302993616 76.89967614989796
+ vertex -2.4940926722286294 182.04041302993795 556.9015928001869
+ vertex -3.995052421684376 182.04038513132357 76.89991962967089
+ endloop
+endfacet
+facet normal -0.9999999868250228 7.0933722924676436e-15 0.00016232669043522314
+ outer loop
+ vertex -3.9950524216843983 186.47399897618763 76.89991962967026
+ vertex -3.995052421684376 182.04038513132357 76.89991962967089
+ vertex -3.9940294294257574 186.47399897618942 556.9018362799592
+ endloop
+endfacet
+facet normal -0.9999999868250228 7.0933722924676436e-15 0.00016232669043522314
+ outer loop
+ vertex -3.994029429425735 182.0403851313254 556.9018362799605
+ vertex -3.9940294294257574 186.47399897618942 556.9018362799592
+ vertex -3.995052421684376 182.04038513132357 76.89991962967089
+ endloop
+endfacet
+facet normal -0.9999980947808033 -0.0019452724511422393 0.0001623263833065563
+ outer loop
+ vertex -3.9951813993197236 186.54030197121796 76.89991965060597
+ vertex -3.9950524216843983 186.47399897618763 76.89991962967026
+ vertex -3.9941584070610827 186.54030197121975 556.9018363008956
+ endloop
+endfacet
+facet normal -0.9999980947808033 -0.0019452724511422393 0.0001623263833065563
+ outer loop
+ vertex -3.9940294294257574 186.47399897618942 556.9018362799592
+ vertex -3.9941584070610827 186.54030197121975 556.9018363008956
+ vertex -3.9950524216843983 186.47399897618763 76.89991962967026
+ endloop
+endfacet
+facet normal -0.9999999866520455 -1.859985830847967e-05 0.00016232669040715017
+ outer loop
+ vertex -3.995182614498396 186.60563465350577 76.89991965080323
+ vertex -3.9951813993197236 186.54030197121796 76.89991965060597
+ vertex -3.9941596222397324 186.6056346535076 556.9018363010921
+ endloop
+endfacet
+facet normal -0.9999999866520455 -1.859985830847967e-05 0.00016232669040715017
+ outer loop
+ vertex -3.9941584070610827 186.54030197121975 556.9018363008956
+ vertex -3.9941596222397324 186.6056346535076 556.9018363010921
+ vertex -3.9951813993197236 186.54030197121796 76.89991965060597
+ endloop
+endfacet
+facet normal -0.966181323956938 0.2578635775734292 0.00015683701866325123
+ outer loop
+ vertex -3.961238550800757 186.73281865026806 76.8999141407756
+ vertex -3.995182614498396 186.60563465350577 76.89991965080323
+ vertex -3.9602155585421386 186.73281865026988 556.9018307910653
+ endloop
+endfacet
+facet normal -0.966181323956938 0.2578635775734292 0.00015683701866325123
+ outer loop
+ vertex -3.9941596222397324 186.6056346535076 556.9018363010921
+ vertex -3.9602155585421386 186.73281865026988 556.9018307910653
+ vertex -3.995182614498396 186.60563465350577 76.89991965080323
+ endloop
+endfacet
+facet normal -0.8665194908436535 0.49914321812785634 0.0001406592428420278
+ outer loop
+ vertex -3.895533462437352 186.846883587277 76.89990347508584
+ vertex -3.961238550800757 186.73281865026806 76.8999141407756
+ vertex -3.894510470178711 186.8468835872788 556.9018201253748
+ endloop
+endfacet
+facet normal -0.8665194908436535 0.49914321812785634 0.0001406592428420278
+ outer loop
+ vertex -3.9602155585421386 186.73281865026988 556.9018307910653
+ vertex -3.894510470178711 186.8468835872788 556.9018201253748
+ vertex -3.961238550800757 186.73281865026806 76.8999141407756
+ endloop
+endfacet
+facet normal -0.7078057864252248 0.7064070749234684 0.00011489577207227019
+ outer loop
+ vertex -3.802545042597342 186.94005612757638 76.89988838058402
+ vertex -3.895533462437352 186.846883587277 76.89990347508584
+ vertex -3.8015220503386784 186.94005612757817 556.9018050308729
+ endloop
+endfacet
+facet normal -0.7078057864252248 0.7064070749234684 0.00011489577207227019
+ outer loop
+ vertex -3.894510470178711 186.8468835872788 556.9018201253748
+ vertex -3.8015220503386784 186.94005612757817 556.9018050308729
+ vertex -3.895533462437352 186.846883587277 76.89990347508584
+ endloop
+endfacet
+facet normal -0.5008562861794713 0.8655304581494729 8.130234411737678e-05
+ outer loop
+ vertex -3.8015220503386784 186.94005612757817 556.9018050308729
+ vertex -3.6875873061635125 187.00598671652142 556.9017865362227
+ vertex -3.802545042597342 186.94005612757638 76.89988838058402
+ endloop
+endfacet
+facet normal -0.5008562861794713 0.8655304581494729 8.130234411737678e-05
+ outer loop
+ vertex -3.6886102984221987 187.00598671651966 76.89986988593301
+ vertex -3.802545042597342 186.94005612757638 76.89988838058402
+ vertex -3.6875873061635125 187.00598671652142 556.9017865362227
+ endloop
+endfacet
+facet normal -0.25977425605297516 0.9656693710136809 4.216829549636597e-05
+ outer loop
+ vertex -3.6875873061635125 187.00598671652142 556.9017865362227
+ vertex -3.5604707021826427 187.0401822934277 556.901765901804
+ vertex -3.6886102984221987 187.00598671651966 76.89986988593301
+ endloop
+endfacet
+facet normal -0.25977425605297516 0.9656693710136809 4.216829549636597e-05
+ outer loop
+ vertex -3.5614936944412614 187.04018229342591 76.89984925151508
+ vertex -3.6886102984221987 187.00598671651966 76.89986988593301
+ vertex -3.5604707021826427 187.0401822934277 556.901765901804
+ endloop
+endfacet
+facet normal -0.001650741992056811 0.9999986375244738 2.679591724845885e-07
+ outer loop
+ vertex -3.49416770718172 187.0402917427149 556.9017551390589
+ vertex -3.4951906994403834 187.04029174271312 76.89983848876919
+ vertex -3.5604707021826427 187.0401822934277 556.901765901804
+ endloop
+endfacet
+facet normal -0.001650741992056811 0.9999986375244738 2.679591724845885e-07
+ outer loop
+ vertex -3.5614936944412614 187.04018229342591 76.89984925151508
+ vertex -3.5604707021826427 187.0401822934277 556.901765901804
+ vertex -3.4951906994403834 187.04029174271312 76.89983848876919
+ endloop
+endfacet
+facet normal -0.0003175061078407272 0.9999999495949331 5.1539400978573866e-08
+ outer loop
+ vertex -3.49416770718172 187.0402917427149 556.9017551390589
+ vertex -3.4288350248871344 187.04031248624165 556.9017445338206
+ vertex -3.4951906994403834 187.04029174271312 76.89983848876919
+ endloop
+endfacet
+facet normal -0.0003175061078407272 0.9999999495949331 5.1539400978573866e-08
+ outer loop
+ vertex -3.429858017145821 187.04031248623983 76.89982788353092
+ vertex -3.4951906994403834 187.04029174271312 76.89983848876919
+ vertex -3.4288350248871344 187.04031248624165 556.9017445338206
+ endloop
+endfacet
+facet normal 2.2488646315319988e-05 0.9999999997471305 -3.6508229560603567e-09
+ outer loop
+ vertex -3.4288350248871344 187.04031248624165 556.9017445338206
+ vertex 7.43833962829254 187.04006809819415 556.8999805013008
+ vertex -3.429858017145821 187.04031248623983 76.89982788353092
+ endloop
+endfacet
+facet normal 2.2488646315319988e-05 0.9999999997471305 -3.6508229560603567e-09
+ outer loop
+ vertex 7.437316636033876 187.04006809819236 76.89806385101268
+ vertex -3.429858017145821 187.04031248623983 76.89982788353092
+ vertex 7.43833962829254 187.04006809819415 556.8999805013008
+ endloop
+endfacet
+facet normal -0.006634224542750717 0.9999779932896307 1.0769114124448523e-06
+ outer loop
+ vertex 7.505832289030784 187.0405158695146 556.8999695454412
+ vertex 7.504809296772143 187.0405158695128 76.89805289515232
+ vertex 7.43833962829254 187.04006809819415 556.8999805013008
+ endloop
+endfacet
+facet normal -0.006634224542750717 0.9999779932896307 1.0769114124448523e-06
+ outer loop
+ vertex 7.437316636033876 187.04006809819236 76.89806385101268
+ vertex 7.43833962829254 187.04006809819415 556.8999805013008
+ vertex 7.504809296772143 187.0405158695128 76.89805289515232
+ endloop
+endfacet
+facet normal -1.859985924957654e-05 0.9999999998270226 3.0189382550924715e-09
+ outer loop
+ vertex 7.505832289030784 187.0405158695146 556.8999695454412
+ vertex 7.569933332587059 187.04051706178498 556.8999591401308
+ vertex 7.504809296772143 187.0405158695128 76.89805289515232
+ endloop
+endfacet
+facet normal -1.859985924957654e-05 0.9999999998270226 3.0189382550924715e-09
+ outer loop
+ vertex 7.568910340328418 187.0405170617832 76.89804248984264
+ vertex 7.504809296772143 187.0405158695128 76.89805289515232
+ vertex 7.569933332587059 187.04051706178498 556.8999591401308
+ endloop
+endfacet
+facet normal 0.2555220692993388 0.9668032221608257 -4.147805269390345e-05
+ outer loop
+ vertex 7.569933332587059 187.04051706178498 556.8999591401308
+ vertex 7.697159290470078 187.00689177041966 556.8999384879611
+ vertex 7.568910340328418 187.0405170617832 76.89804248984264
+ endloop
+endfacet
+facet normal 0.2555220692993388 0.9668032221608257 -4.147805269390345e-05
+ outer loop
+ vertex 7.696136298211437 187.00689177041784 76.89802183767291
+ vertex 7.568910340328418 187.0405170617832 76.89804248984264
+ vertex 7.697159290470078 187.00689177041966 556.8999384879611
+ endloop
+endfacet
+facet normal 0.4970424514673452 0.8677262211835849 -8.068325748916706e-05
+ outer loop
+ vertex 7.697159290470078 187.00689177041966 556.8999384879611
+ vertex 7.811347263162688 186.94148373213605 556.8999199522051
+ vertex 7.696136298211437 187.00689177041784 76.89802183767291
+ endloop
+endfacet
+facet normal 0.4970424514673452 0.8677262211835849 -8.068325748916706e-05
+ outer loop
+ vertex 7.810324270904046 186.94148373213423 76.89800330191619
+ vertex 7.696136298211437 187.00689177041784 76.89802183767291
+ vertex 7.811347263162688 186.94148373213605 556.8999199522051
+ endloop
+endfacet
+facet normal 0.7046902102864447 0.7095151122008374 -0.0001143900313487524
+ outer loop
+ vertex 7.811347263162688 186.94148373213605 556.8999199522051
+ vertex 7.904715529030331 186.84875039665144 556.8999047960434
+ vertex 7.810324270904046 186.94148373213423 76.89800330191619
+ endloop
+endfacet
+facet normal 0.7046902102864447 0.7095151122008374 -0.0001143900313487524
+ outer loop
+ vertex 7.903692536771713 186.84875039664965 76.89798814575447
+ vertex 7.810324270904046 186.94148373213423 76.89800330191619
+ vertex 7.904715529030331 186.84875039665144 556.8999047960434
+ endloop
+endfacet
+facet normal 0.8643144946279716 0.5029517220286015 -0.00014030131341523822
+ outer loop
+ vertex 7.903692536771713 186.84875039664965 76.89798814575447
+ vertex 7.904715529030331 186.84875039665144 556.8999047960434
+ vertex 7.9698782027940425 186.73501138752812 76.89797740205503
+ endloop
+endfacet
+facet normal 0.8643144946279716 0.5029517220286015 -0.00014030131341523822
+ outer loop
+ vertex 7.970901195052661 186.73501138752994 556.8998940523439
+ vertex 7.9698782027940425 186.73501138752812 76.89797740205503
+ vertex 7.904715529030331 186.84875039665144 556.8999047960434
+ endloop
+endfacet
+facet normal 0.9650371744909267 0.2621130048489408 -0.00015665129282861327
+ outer loop
+ vertex 7.9698782027940425 186.73501138752812 76.89797740205503
+ vertex 7.970901195052661 186.73501138752994 556.8998940523439
+ vertex 8.004370825208392 186.60801783027892 76.8979718029818
+ endloop
+endfacet
+facet normal 0.9650371744909267 0.2621130048489408 -0.00015665129282861327
+ outer loop
+ vertex 8.00539381746701 186.60801783028077 556.8998884532699
+ vertex 8.004370825208392 186.60801783027892 76.8979718029818
+ vertex 7.970901195052661 186.73501138752994 556.8998940523439
+ endloop
+endfacet
+facet normal 0.999977980116079 0.00663422445895507 -0.0001623231181610382
+ outer loop
+ vertex 8.004370825208392 186.60801783027892 76.8979718029818
+ vertex 8.00539381746701 186.60801783028077 556.8998884532699
+ vertex 8.004818596528835 186.54052516952885 76.89797173029733
+ endloop
+endfacet
+facet normal 0.999977980116079 0.00663422445895507 -0.0001623231181610382
+ outer loop
+ vertex 8.005841588787453 186.54052516953067 556.8998883805855
+ vertex 8.004818596528835 186.54052516952885 76.89797173029733
+ vertex 8.00539381746701 186.60801783028077 556.8998884532699
+ endloop
+endfacet
+facet normal 0.9999999866520455 1.859985899909058e-05 -0.00016232669040715017
+ outer loop
+ vertex 8.004818596528835 186.54052516952885 76.89797173029733
+ vertex 8.005841588787453 186.54052516953067 556.8998883805855
+ vertex 8.004819788799246 186.47642412596153 76.89797173010376
+ endloop
+endfacet
+facet normal 0.9999999866520455 1.859985899909058e-05 -0.00016232669040715017
+ outer loop
+ vertex 8.005842781057865 186.47642412596332 556.8998883803919
+ vertex 8.004819788799246 186.47642412596153 76.89797173010376
+ vertex 8.005841588787453 186.54052516953067 556.8998883805855
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex 6.5019856184532525 182.04098221396413 345.08857154516414
+ vertex 8.0020042177937 181.04101011492241 345.0885436450293
+ vertex 8.001985616688955 182.04107707777897 345.0885436453753
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex 8.0020042177937 181.04101011492241 345.0885436450293
+ vertex 6.5019856184532525 182.04098221396413 345.08857154516414
+ vertex 6.502048860996644 181.04098221596382 345.0885715439878
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex -11.49895678066791 184.04071436533403 345.08890636015917
+ vertex -3.997969090625468 182.04038513132534 345.0887668428438
+ vertex -3.9979690906254906 184.04085388264915 345.0887668428439
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex -3.997969090625468 182.04038513132534 345.0887668428438
+ vertex -11.49895678066791 184.04071436533403 345.08890636015917
+ vertex -3.9979690906254963 181.04031816812244 345.0887668428438
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex -3.9979690906254963 181.04031816812244 345.0887668428438
+ vertex -11.49895678066791 184.04071436533403 345.08890636015917
+ vertex -10.498780607997107 174.56899372146188 345.0888877570231
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex -10.498780607997107 174.56899372146188 345.0888877570231
+ vertex -11.49895678066791 184.04071436533403 345.08890636015917
+ vertex -11.498799207510396 175.5689751214297 345.08890635722827
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex 8.00194841697043 184.04107707942603 345.0885436460672
+ vertex 15.501200783148828 175.56947731762935 345.0884041610287
+ vertex 15.501043209991312 184.0412165615337 345.0884041639595
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex 15.501200783148828 175.56947731762935 345.0884041610287
+ vertex 8.00194841697043 184.04107707942603 345.0885436460672
+ vertex 14.501219383354027 174.56945871794306 345.08842276054196
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex 14.501219383354027 174.56945871794306 345.08842276054196
+ vertex 8.00194841697043 184.04107707942603 345.0885436460672
+ vertex 8.0020042177937 181.04101011492241 345.0885436450293
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex 14.501219383354027 174.56945871794306 345.08842276054196
+ vertex 8.0020042177937 181.04101011492241 345.0885436450293
+ vertex 8.001506830763743 179.4727337756257 345.0885436542806
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex 14.501219383354027 174.56945871794306 345.08842276054196
+ vertex 8.001506830763743 179.4727337756257 345.0885436542806
+ vertex 7.96694434578794 179.34576982854998 345.08854429713796
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex 14.501219383354027 174.56945871794306 345.08842276054196
+ vertex 7.96694434578794 179.34576982854998 345.08854429713796
+ vertex 7.900698861389737 179.2320775024214 345.08854552929466
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex 14.501219383354027 174.56945871794306 345.08842276054196
+ vertex 7.900698861389737 179.2320775024214 345.08854552929466
+ vertex 7.807284897855816 179.13940474138005 345.08854726678123
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex 14.501219383354027 174.56945871794306 345.08842276054196
+ vertex 7.807284897855816 179.13940474138005 345.08854726678123
+ vertex 7.693068462426739 179.07406704094223 345.08854939119084
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex 14.501219383354027 174.56945871794306 345.08842276054196
+ vertex 7.693068462426739 179.07406704094223 345.08854939119084
+ vertex 7.565833216425362 179.04051705741682 345.0885517577485
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex 14.501219383354027 174.56945871794306 345.08842276054196
+ vertex 7.565833216425362 179.04051705741682 345.0885517577485
+ vertex -10.498780607997107 174.56899372146188 345.0888877570231
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex 8.0020042177937 181.04101011492241 345.0885436450293
+ vertex 8.00194841697043 184.04107707942603 345.0885436460672
+ vertex 8.001985616688955 182.04107707777897 345.0885436453753
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex -10.498780607997107 174.56899372146188 345.0888877570231
+ vertex 7.565833216425362 179.04051705741682 345.0885517577485
+ vertex -3.5636246322851024 179.0403100510672 345.08875876409803
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex -10.498780607997107 174.56899372146188 345.0888877570231
+ vertex -3.5636246322851024 179.0403100510672 345.08875876409803
+ vertex -3.690797270964721 179.07434040020973 345.0887611294913
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex -10.498780607997107 174.56899372146188 345.0888877570231
+ vertex -3.690797270964721 179.07434040020973 345.0887611294913
+ vertex -3.8048289045946544 179.14012589423606 345.08876325046356
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex -10.498780607997107 174.56899372146188 345.0888877570231
+ vertex -3.8048289045946544 179.14012589423606 345.08876325046356
+ vertex -3.897948465788975 179.23318336044414 345.0887649824743
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex -10.498780607997107 174.56899372146188 345.0888877570231
+ vertex -3.897948465788975 179.23318336044414 345.0887649824743
+ vertex -3.9638100103398974 179.34717108629587 345.08876620748975
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex -10.498780607997107 174.56899372146188 345.0888877570231
+ vertex -3.9638100103398974 179.34717108629587 345.08876620748975
+ vertex -3.9979251828279496 179.47432099664897 345.08876684202716
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex -10.498780607997107 174.56899372146188 345.0888877570231
+ vertex -3.9979251828279496 179.47432099664897 345.08876684202716
+ vertex -3.9979690906254963 181.04031816812244 345.0887668428438
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex -2.498032333428271 182.04041302993807 345.0887389442313
+ vertex -3.9979690906254963 181.04031816812244 345.0887668428438
+ vertex -2.497969090885153 181.0404130319377 345.088738943055
+ endloop
+endfacet
+facet normal 1.8599859248019022e-05 -7.779675748010793e-16 0.9999999998270228
+ outer loop
+ vertex -3.9979690906254963 181.04031816812244 345.0887668428438
+ vertex -2.498032333428271 182.04041302993807 345.0887389442313
+ vertex -3.997969090625468 182.04038513132534 345.0887668428438
+ endloop
+endfacet
+facet normal -1.8599859243795255e-05 0.9999999998270226 3.459555419907567e-10
+ outer loop
+ vertex 15.500922310906201 184.04121656153373 338.5884041650839
+ vertex 8.001846117744567 184.04107707942603 339.5885436470185
+ vertex 15.500940910765449 184.0412165615337 339.5884041649109
+ endloop
+endfacet
+facet normal -1.8599859243795255e-05 0.9999999998270226 3.459555419907567e-10
+ outer loop
+ vertex 8.001846117744567 184.04107707942603 339.5885436470185
+ vertex 15.500922310906201 184.04121656153373 338.5884041650839
+ vertex 8.001827517885317 184.04107707942603 338.58854364719156
+ endloop
+endfacet
+facet normal 0.9999999996540453 1.8599859246792857e-05 -1.859985924480164e-05
+ outer loop
+ vertex 15.500922310906201 184.04121656153373 338.5884041650839
+ vertex 15.501098483922965 175.56947731762938 339.58840416198007
+ vertex 15.501079884063715 175.56947731762938 338.58840416215304
+ endloop
+endfacet
+facet normal 0.9999999996540453 1.8599859246792857e-05 -1.859985924480164e-05
+ outer loop
+ vertex 15.501098483922965 175.56947731762938 339.58840416198007
+ vertex 15.500922310906201 184.04121656153373 338.5884041650839
+ vertex 15.500940910765449 184.0412165615337 339.5884041649109
+ endloop
+endfacet
+facet normal 1.8599859243795255e-05 -0.9999999998270226 -3.459555419907567e-10
+ outer loop
+ vertex -10.49888290722297 174.56899372146188 339.5888877579745
+ vertex 14.501219383354027 174.56945871794306 345.08842276054196
+ vertex -10.498780607997107 174.56899372146188 345.0888877570231
+ endloop
+endfacet
+facet normal 1.8599859243795255e-05 -0.9999999998270226 -3.459555419907567e-10
+ outer loop
+ vertex 14.501219383354027 174.56945871794306 345.08842276054196
+ vertex -10.49888290722297 174.56899372146188 339.5888877579745
+ vertex 14.501117084128163 174.56945871794306 339.58842276149335
+ endloop
+endfacet
+facet normal -0.7070936288553363 -0.7071199331508208 1.3151841973605105e-05
+ outer loop
+ vertex -11.498799207510396 175.5689751214297 345.08890635722827
+ vertex -10.49888290722297 174.56899372146188 339.5888877579745
+ vertex -10.498780607997107 174.56899372146188 345.0888877570231
+ endloop
+endfacet
+facet normal -0.7070936288553363 -0.7071199331508208 1.3151841973605105e-05
+ outer loop
+ vertex -10.49888290722297 174.56899372146188 339.5888877579745
+ vertex -11.498799207510396 175.5689751214297 345.08890635722827
+ vertex -11.49890150673626 175.5689751214297 339.58890635817966
+ endloop
+endfacet
+facet normal -0.9999999996540453 -1.8599859246792857e-05 1.859985924480164e-05
+ outer loop
+ vertex -11.49895678066791 184.04071436533403 345.08890636015917
+ vertex -11.49890150673626 175.5689751214297 339.58890635817966
+ vertex -11.498799207510396 175.5689751214297 345.08890635722827
+ endloop
+endfacet
+facet normal -0.9999999996540453 -1.8599859246792857e-05 1.859985924480164e-05
+ outer loop
+ vertex -11.49890150673626 175.5689751214297 339.58890635817966
+ vertex -11.49895678066791 184.04071436533403 345.08890636015917
+ vertex -11.499059079893774 184.04071436533405 339.5889063611105
+ endloop
+endfacet
+facet normal 0.7071199330285369 -0.7070936289776155 -1.3152331228624564e-05
+ outer loop
+ vertex 15.501079884063715 175.56947731762938 338.58840416215304
+ vertex 14.501117084128163 174.56945871794306 339.58842276149335
+ vertex 14.501098484268915 174.56945871794306 338.5884227616663
+ endloop
+endfacet
+facet normal 0.7071199330285369 -0.7070936289776155 -1.3152331228624564e-05
+ outer loop
+ vertex 14.501117084128163 174.56945871794306 339.58842276149335
+ vertex 15.501079884063715 175.56947731762938 338.58840416215304
+ vertex 15.501098483922965 175.56947731762938 339.58840416198007
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex 6.501927961911531 181.04098221596382 338.5885715451122
+ vertex 8.001864717603842 182.04107707777897 338.58854364649966
+ vertex 8.001883318708588 181.04101011492241 338.58854364615365
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex 8.001864717603842 182.04107707777897 338.58854364649966
+ vertex 6.501927961911531 181.04098221596382 338.5885715451122
+ vertex 6.50186471936814 182.04098221396413 338.58857154628845
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex 14.501098484268915 174.56945871794306 338.5884227616663
+ vertex 15.500922310906201 184.04121656153373 338.5884041650839
+ vertex 15.501079884063715 175.56947731762938 338.58840416215304
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex 15.500922310906201 184.04121656153373 338.5884041650839
+ vertex 14.501098484268915 174.56945871794306 338.5884227616663
+ vertex 8.001827517885317 184.04107707942603 338.58854364719156
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex 8.001827517885317 184.04107707942603 338.58854364719156
+ vertex 14.501098484268915 174.56945871794306 338.5884227616663
+ vertex 8.001883318708588 181.04101011492241 338.58854364615365
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex 8.001827517885317 184.04107707942603 338.58854364719156
+ vertex 8.001883318708588 181.04101011492241 338.58854364615365
+ vertex 8.001864717603842 182.04107707777897 338.58854364649966
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex -3.998089989710609 181.04031816812244 338.5887668439682
+ vertex -2.4981532325133835 182.0404130299381 338.58873894535566
+ vertex -2.498089989970266 181.0404130319377 338.58873894417934
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex -2.4981532325133835 182.0404130299381 338.58873894535566
+ vertex -3.998089989710609 181.04031816812244 338.5887668439682
+ vertex -3.998089989710581 182.04038513132534 338.5887668439682
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex 14.501098484268915 174.56945871794306 338.5884227616663
+ vertex 8.001385931678632 179.4727337756257 338.588543655405
+ vertex 8.001883318708588 181.04101011492241 338.58854364615365
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex 8.001385931678632 179.4727337756257 338.588543655405
+ vertex 14.501098484268915 174.56945871794306 338.5884227616663
+ vertex 7.966823446702828 179.34576982855 338.5885442982623
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex 7.966823446702828 179.34576982855 338.5885442982623
+ vertex 14.501098484268915 174.56945871794306 338.5884227616663
+ vertex 7.900577962304624 179.2320775024214 338.588545530419
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex 7.900577962304624 179.2320775024214 338.588545530419
+ vertex 14.501098484268915 174.56945871794306 338.5884227616663
+ vertex 7.807163998770703 179.13940474138005 338.5885472679056
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex 7.807163998770703 179.13940474138005 338.5885472679056
+ vertex 14.501098484268915 174.56945871794306 338.5884227616663
+ vertex 7.692947563341627 179.07406704094223 338.5885493923152
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex 7.692947563341627 179.07406704094223 338.5885493923152
+ vertex 14.501098484268915 174.56945871794306 338.5884227616663
+ vertex 7.565712317340249 179.04051705741682 338.5885517588729
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex 7.565712317340249 179.04051705741682 338.5885517588729
+ vertex 14.501098484268915 174.56945871794306 338.5884227616663
+ vertex -10.49890150708222 174.56899372146188 338.58888775814745
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex 7.565712317340249 179.04051705741682 338.5885517588729
+ vertex -10.49890150708222 174.56899372146188 338.58888775814745
+ vertex -3.563745531370215 179.0403100510672 338.5887587652224
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex -3.563745531370215 179.0403100510672 338.5887587652224
+ vertex -10.49890150708222 174.56899372146188 338.58888775814745
+ vertex -3.690918170049834 179.07434040020973 338.5887611306156
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex -3.690918170049834 179.07434040020973 338.5887611306156
+ vertex -10.49890150708222 174.56899372146188 338.58888775814745
+ vertex -3.8049498036797673 179.14012589423606 338.5887632515879
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex -3.8049498036797673 179.14012589423606 338.5887632515879
+ vertex -10.49890150708222 174.56899372146188 338.58888775814745
+ vertex -3.8980693648740874 179.23318336044414 338.58876498359865
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex -3.8980693648740874 179.23318336044414 338.58876498359865
+ vertex -10.49890150708222 174.56899372146188 338.58888775814745
+ vertex -3.96393090942501 179.34717108629587 338.5887662086141
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex -3.96393090942501 179.34717108629587 338.5887662086141
+ vertex -10.49890150708222 174.56899372146188 338.58888775814745
+ vertex -3.998046081913062 179.47432099664897 338.5887668431515
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex -3.998046081913062 179.47432099664897 338.5887668431515
+ vertex -10.49890150708222 174.56899372146188 338.58888775814745
+ vertex -3.998089989710609 181.04031816812244 338.5887668439682
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex -3.998089989710581 182.04038513132534 338.5887668439682
+ vertex -11.499077679753023 184.04071436533405 338.5889063612835
+ vertex -3.9980899897106035 184.04085388264917 338.5887668439682
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex -11.499077679753023 184.04071436533405 338.5889063612835
+ vertex -3.998089989710581 182.04038513132534 338.5887668439682
+ vertex -3.998089989710609 181.04031816812244 338.5887668439682
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex -11.499077679753023 184.04071436533405 338.5889063612835
+ vertex -3.998089989710609 181.04031816812244 338.5887668439682
+ vertex -10.49890150708222 174.56899372146188 338.58888775814745
+ endloop
+endfacet
+facet normal -1.859985924801725e-05 8.680403714123038e-16 -0.9999999998270228
+ outer loop
+ vertex -11.499077679753023 184.04071436533405 338.5889063612835
+ vertex -10.49890150708222 174.56899372146188 338.58888775814745
+ vertex -11.498920106595508 175.5689751214297 338.58890635835263
+ endloop
+endfacet
+facet normal -0.9999999996540453 -1.8599859246792857e-05 1.859985924480164e-05
+ outer loop
+ vertex -11.499059079893774 184.04071436533405 339.5889063611105
+ vertex -11.498920106595508 175.5689751214297 338.58890635835263
+ vertex -11.49890150673626 175.5689751214297 339.58890635817966
+ endloop
+endfacet
+facet normal -0.9999999996540453 -1.8599859246792857e-05 1.859985924480164e-05
+ outer loop
+ vertex -11.498920106595508 175.5689751214297 338.58890635835263
+ vertex -11.499059079893774 184.04071436533405 339.5889063611105
+ vertex -11.499077679753023 184.04071436533405 338.5889063612835
+ endloop
+endfacet
+facet normal -0.7070936288553363 -0.7071199331508208 1.3151841973605105e-05
+ outer loop
+ vertex -11.49890150673626 175.5689751214297 339.58890635817966
+ vertex -10.49890150708222 174.56899372146188 338.58888775814745
+ vertex -10.49888290722297 174.56899372146188 339.5888877579745
+ endloop
+endfacet
+facet normal -0.7070936288553363 -0.7071199331508208 1.3151841973605105e-05
+ outer loop
+ vertex -10.49890150708222 174.56899372146188 338.58888775814745
+ vertex -11.49890150673626 175.5689751214297 339.58890635817966
+ vertex -11.498920106595508 175.5689751214297 338.58890635835263
+ endloop
+endfacet
+facet normal 0.9999999996540453 1.8599859246792857e-05 -1.859985924480164e-05
+ outer loop
+ vertex 15.500940910765449 184.0412165615337 339.5884041649109
+ vertex 15.501200783148828 175.56947731762935 345.0884041610287
+ vertex 15.501098483922965 175.56947731762938 339.58840416198007
+ endloop
+endfacet
+facet normal 0.9999999996540453 1.8599859246792857e-05 -1.859985924480164e-05
+ outer loop
+ vertex 15.501200783148828 175.56947731762935 345.0884041610287
+ vertex 15.500940910765449 184.0412165615337 339.5884041649109
+ vertex 15.501043209991312 184.0412165615337 345.0884041639595
+ endloop
+endfacet
+facet normal 1.8599859243795255e-05 -0.9999999998270226 -3.459555419907567e-10
+ outer loop
+ vertex -10.49890150708222 174.56899372146188 338.58888775814745
+ vertex 14.501117084128163 174.56945871794306 339.58842276149335
+ vertex -10.49888290722297 174.56899372146188 339.5888877579745
+ endloop
+endfacet
+facet normal 1.8599859243795255e-05 -0.9999999998270226 -3.459555419907567e-10
+ outer loop
+ vertex 14.501117084128163 174.56945871794306 339.58842276149335
+ vertex -10.49890150708222 174.56899372146188 338.58888775814745
+ vertex 14.501098484268915 174.56945871794306 338.5884227616663
+ endloop
+endfacet
+facet normal 0.7071199330285369 -0.7070936289776155 -1.3152331228624564e-05
+ outer loop
+ vertex 15.501098483922965 175.56947731762938 339.58840416198007
+ vertex 14.501219383354027 174.56945871794306 345.08842276054196
+ vertex 14.501117084128163 174.56945871794306 339.58842276149335
+ endloop
+endfacet
+facet normal 0.7071199330285369 -0.7070936289776155 -1.3152331228624564e-05
+ outer loop
+ vertex 14.501219383354027 174.56945871794306 345.08842276054196
+ vertex 15.501098483922965 175.56947731762938 339.58840416198007
+ vertex 15.501200783148828 175.56947731762935 345.0884041610287
+ endloop
+endfacet
+facet normal 0.9999999994339513 2.803823553304438e-05 -1.8599859240707918e-05
+ outer loop
+ vertex -3.99807138985136 181.04031816812244 339.5887668437952
+ vertex -3.9979251828279496 179.47432099664897 345.08876684202716
+ vertex -3.9980274820538133 179.47432099664897 339.58876684297854
+ endloop
+endfacet
+facet normal 0.9999999994339513 2.803823553304438e-05 -1.8599859240707918e-05
+ outer loop
+ vertex -3.9979251828279496 179.47432099664897 345.08876684202716
+ vertex -3.99807138985136 181.04031816812244 339.5887668437952
+ vertex -3.9979690906254963 181.04031816812244 345.0887668428438
+ endloop
+endfacet
+facet normal 0.9658394493490201 0.2591411927086458 -1.7964477816981805e-05
+ outer loop
+ vertex -3.9980274820538133 179.47432099664897 339.58876684297854
+ vertex -3.9638100103398974 179.34717108629587 345.08876620748975
+ vertex -3.9639123095658064 179.3471710862958 339.58876620844114
+ endloop
+endfacet
+facet normal 0.9658394493490201 0.2591411927086458 -1.7964477816981805e-05
+ outer loop
+ vertex -3.9638100103398974 179.34717108629587 345.08876620748975
+ vertex -3.9980274820538133 179.47432099664897 339.58876684297854
+ vertex -3.9979251828279496 179.47432099664897 345.08876684202716
+ endloop
+endfacet
+facet normal 0.865858592143704 0.5002888147376044 -1.610484794495736e-05
+ outer loop
+ vertex -3.9639123095658064 179.3471710862958 339.58876620844114
+ vertex -3.897948465788975 179.23318336044414 345.0887649824743
+ vertex -3.8980507650148835 179.23318336044403 339.5887649834257
+ endloop
+endfacet
+facet normal 0.865858592143704 0.5002888147376044 -1.610484794495736e-05
+ outer loop
+ vertex -3.897948465788975 179.23318336044414 345.0887649824743
+ vertex -3.9639123095658064 179.3471710862958 339.58876620844114
+ vertex -3.9638100103398974 179.34717108629587 345.08876620748975
+ endloop
+endfacet
+facet normal 0.7068709027842218 0.707342580808025 -1.3147699300030624e-05
+ outer loop
+ vertex -3.804931203820518 179.14012589423606 339.58876325141495
+ vertex -3.897948465788975 179.23318336044414 345.0887649824743
+ vertex -3.8048289045946544 179.14012589423606 345.08876325046356
+ endloop
+endfacet
+facet normal 0.7068709027842218 0.707342580808025 -1.3147699300030624e-05
+ outer loop
+ vertex -3.897948465788975 179.23318336044414 345.0887649824743
+ vertex -3.804931203820518 179.14012589423606 339.58876325141495
+ vertex -3.8980507650148835 179.23318336044403 339.5887649834257
+ endloop
+endfacet
+facet normal 0.4997111295562009 0.8661921189385627 -9.29455667534781e-06
+ outer loop
+ vertex -3.690899570190585 179.07434040020973 339.5887611304426
+ vertex -3.8048289045946544 179.14012589423606 345.08876325046356
+ vertex -3.690797270964721 179.07434040020973 345.0887611294913
+ endloop
+endfacet
+facet normal 0.4997111295562009 0.8661921189385627 -9.29455667534781e-06
+ outer loop
+ vertex -3.8048289045946544 179.14012589423606 345.08876325046356
+ vertex -3.690899570190585 179.07434040020973 339.5887611304426
+ vertex -3.804931203820518 179.14012589423606 339.58876325141495
+ endloop
+endfacet
+facet normal 0.2584968686625305 0.9660120956119286 -4.808005373256877e-06
+ outer loop
+ vertex -3.563726931510966 179.0403100510672 339.5887587650494
+ vertex -3.690797270964721 179.07434040020973 345.0887611294913
+ vertex -3.5636246322851024 179.0403100510672 345.08875876409803
+ endloop
+endfacet
+facet normal 0.2584968686625305 0.9660120956119286 -4.808005373256877e-06
+ outer loop
+ vertex -3.690797270964721 179.07434040020973 345.0887611294913
+ vertex -3.563726931510966 179.0403100510672 339.5887587650494
+ vertex -3.690899570190585 179.07434040020973 339.5887611304426
+ endloop
+endfacet
+facet normal -1.859985925190337e-05 0.9999999998270226 3.459555421415665e-10
+ outer loop
+ vertex 7.565730917199498 179.04051705741682 339.5885517586999
+ vertex -3.5636246322851024 179.0403100510672 345.08875876409803
+ vertex 7.565833216425362 179.04051705741682 345.0885517577485
+ endloop
+endfacet
+facet normal -1.859985925190337e-05 0.9999999998270226 3.459555421415665e-10
+ outer loop
+ vertex -3.5636246322851024 179.0403100510672 345.08875876409803
+ vertex 7.565730917199498 179.04051705741682 339.5885517586999
+ vertex -3.563726931510966 179.0403100510672 339.5887587650494
+ endloop
+endfacet
+facet normal -0.25496964087487123 0.9669490587459346 4.742399434363138e-06
+ outer loop
+ vertex 7.693068462426739 179.07406704094223 345.08854939119084
+ vertex 7.565730917199498 179.04051705741682 339.5885517586999
+ vertex 7.565833216425362 179.04051705741682 345.0885517577485
+ endloop
+endfacet
+facet normal -0.25496964087487123 0.9669490587459346 4.742399434363138e-06
+ outer loop
+ vertex 7.565730917199498 179.04051705741682 339.5885517586999
+ vertex 7.693068462426739 179.07406704094223 345.08854939119084
+ vertex 7.6929661632009205 179.07406704094223 339.5885493921422
+ endloop
+endfacet
+facet normal -0.4965465930448009 0.8680100695558219 9.235696742989518e-06
+ outer loop
+ vertex 7.807182598629952 179.13940474138005 339.5885472677326
+ vertex 7.693068462426739 179.07406704094223 345.08854939119084
+ vertex 7.807284897855816 179.13940474138005 345.08854726678123
+ endloop
+endfacet
+facet normal -0.4965465930448009 0.8680100695558219 9.235696742989518e-06
+ outer loop
+ vertex 7.693068462426739 179.07406704094223 345.08854939119084
+ vertex 7.807182598629952 179.13940474138005 339.5885472677326
+ vertex 7.6929661632009205 179.07406704094223 339.5885493921422
+ endloop
+endfacet
+facet normal -0.7042847154820756 0.7099176285786488 1.3099596581315947e-05
+ outer loop
+ vertex 7.900596562163918 179.2320775024214 339.58854553024605
+ vertex 7.807284897855816 179.13940474138005 345.08854726678123
+ vertex 7.900698861389737 179.2320775024214 345.08854552929466
+ endloop
+endfacet
+facet normal -0.7042847154820756 0.7099176285786488 1.3099596581315947e-05
+ outer loop
+ vertex 7.807284897855816 179.13940474138005 345.08854726678123
+ vertex 7.900596562163918 179.2320775024214 339.58854553024605
+ vertex 7.807182598629952 179.13940474138005 339.5885472677326
+ endloop
+endfacet
+facet normal -0.8640269984419949 0.5034454744111291 1.607078056068099e-05
+ outer loop
+ vertex 7.96694434578794 179.34576982854998 345.08854429713796
+ vertex 7.900596562163918 179.2320775024214 339.58854553024605
+ vertex 7.900698861389737 179.2320775024214 345.08854552929466
+ endloop
+endfacet
+facet normal -0.8640269984419949 0.5034454744111291 1.607078056068099e-05
+ outer loop
+ vertex 7.900596562163918 179.2320775024214 339.58854553024605
+ vertex 7.96694434578794 179.34576982854998 345.08854429713796
+ vertex 7.966842046562077 179.34576982855 339.58854429808935
+ endloop
+endfacet
+facet normal -0.9648872693327225 0.2626643431407393 1.794676740310278e-05
+ outer loop
+ vertex 8.001506830763743 179.4727337756257 345.0885436542806
+ vertex 7.966842046562077 179.34576982855 339.58854429808935
+ vertex 7.96694434578794 179.34576982854998 345.08854429713796
+ endloop
+endfacet
+facet normal -0.9648872693327225 0.2626643431407393 1.794676740310278e-05
+ outer loop
+ vertex 7.966842046562077 179.34576982855 339.58854429808935
+ vertex 8.001506830763743 179.4727337756257 345.0885436542806
+ vertex 8.00140453153788 179.4727337756257 339.588543655232
+ endloop
+endfacet
+facet normal -0.9999999495333092 0.00031715520572741504 1.859985831256326e-05
+ outer loop
+ vertex 8.0020042177937 181.04101011492241 345.0885436450293
+ vertex 8.00140453153788 179.4727337756257 339.588543655232
+ vertex 8.001506830763743 179.4727337756257 345.0885436542806
+ endloop
+endfacet
+facet normal -0.9999999495333092 0.00031715520572741504 1.859985831256326e-05
+ outer loop
+ vertex 8.00140453153788 179.4727337756257 339.588543655232
+ vertex 8.0020042177937 181.04101011492241 345.0885436450293
+ vertex 8.001901918567837 181.04101011492241 339.5885436459807
+ endloop
+endfacet
+facet normal 1.859985930395633e-05 -0.9999999998270226 -3.4595554310974425e-10
+ outer loop
+ vertex 6.50194656177078 181.04098221596382 339.5885715449392
+ vertex 8.0020042177937 181.04101011492241 345.0885436450293
+ vertex 6.502048860996644 181.04098221596382 345.0885715439878
+ endloop
+endfacet
+facet normal 1.859985930395633e-05 -0.9999999998270226 -3.4595554310974425e-10
+ outer loop
+ vertex 8.0020042177937 181.04101011492241 345.0885436450293
+ vertex 6.50194656177078 181.04098221596382 339.5885715449392
+ vertex 8.001901918567837 181.04101011492241 339.5885436459807
+ endloop
+endfacet
+facet normal -0.9999999978272129 -6.324254340242607e-05 1.8599859210822783e-05
+ outer loop
+ vertex 6.5019856184532525 182.04098221396413 345.08857154516414
+ vertex 6.50194656177078 181.04098221596382 339.5885715449392
+ vertex 6.502048860996644 181.04098221596382 345.0885715439878
+ endloop
+endfacet
+facet normal -0.9999999978272129 -6.324254340242607e-05 1.8599859210822783e-05
+ outer loop
+ vertex 6.50194656177078 181.04098221596382 339.5885715449392
+ vertex 6.5019856184532525 182.04098221396413 345.08857154516414
+ vertex 6.501883319227389 182.04098221396413 339.58857154611553
+ endloop
+endfacet
+facet normal -6.324254316674299e-05 0.9999999980001905 1.1763031795550156e-09
+ outer loop
+ vertex 8.001883317463092 182.04107707777897 339.5885436463266
+ vertex 6.5019856184532525 182.04098221396413 345.08857154516414
+ vertex 8.001985616688955 182.04107707777897 345.0885436453753
+ endloop
+endfacet
+facet normal -6.324254316674299e-05 0.9999999980001905 1.1763031795550156e-09
+ outer loop
+ vertex 6.5019856184532525 182.04098221396413 345.08857154516414
+ vertex 8.001883317463092 182.04107707777897 339.5885436463266
+ vertex 6.501883319227389 182.04098221396413 339.58857154611553
+ endloop
+endfacet
+facet normal -0.9999999996540453 -1.8599859246792857e-05 1.859985924480164e-05
+ outer loop
+ vertex 8.00194841697043 184.04107707942603 345.0885436460672
+ vertex 8.001883317463092 182.04107707777897 339.5885436463266
+ vertex 8.001985616688955 182.04107707777897 345.0885436453753
+ endloop
+endfacet
+facet normal -0.9999999996540453 -1.8599859246792857e-05 1.859985924480164e-05
+ outer loop
+ vertex 8.001883317463092 182.04107707777897 339.5885436463266
+ vertex 8.00194841697043 184.04107707942603 345.0885436460672
+ vertex 8.001846117744567 184.04107707942603 339.5885436470185
+ endloop
+endfacet
+facet normal 0.9999999998462391 4.649964825186193e-06 -1.6908566647105897e-05
+ outer loop
+ vertex -3.9980713898513542 184.04085388264917 339.5887668437952
+ vertex -3.997969090625468 182.04038513132534 345.0887668428438
+ vertex -3.998052785632725 182.04038513167137 339.5887668434492
+ endloop
+endfacet
+facet normal 0.9999999998462391 4.649964825186193e-06 -1.6908566647105897e-05
+ outer loop
+ vertex -3.997969090625468 182.04038513132534 345.0887668428438
+ vertex -3.9980713898513542 184.04085388264917 339.5887668437952
+ vertex -3.9979690906254906 184.04085388264915 345.0887668428439
+ endloop
+endfacet
+facet normal -1.8599859364119643e-05 0.9999999998270226 3.4595554402526967e-10
+ outer loop
+ vertex -2.4981346326541347 182.0404130299381 339.5887389451826
+ vertex -3.997969090625468 182.04038513132534 345.0887668428438
+ vertex -2.498032333428271 182.04041302993807 345.0887389442313
+ endloop
+endfacet
+facet normal -1.8599859364119643e-05 0.9999999998270226 3.4595554402526967e-10
+ outer loop
+ vertex -3.997969090625468 182.04038513132534 345.0887668428438
+ vertex -2.4981346326541347 182.0404130299381 339.5887389451826
+ vertex -3.998052785632725 182.04038513167137 339.5887668434492
+ endloop
+endfacet
+facet normal 0.9999999978272129 6.324254313170525e-05 -1.8599859210822783e-05
+ outer loop
+ vertex -2.4981346326541347 182.0404130299381 339.5887389451826
+ vertex -2.497969090885153 181.0404130319377 345.088738943055
+ vertex -2.4980713901110168 181.0404130319377 339.58873894400637
+ endloop
+endfacet
+facet normal 0.9999999978272129 6.324254313170525e-05 -1.8599859210822783e-05
+ outer loop
+ vertex -2.497969090885153 181.0404130319377 345.088738943055
+ vertex -2.4981346326541347 182.0404130299381 339.5887389451826
+ vertex -2.498032333428271 182.04041302993807 345.0887389442313
+ endloop
+endfacet
+facet normal 6.324254336259923e-05 -0.9999999980001905 -1.1763031831975013e-09
+ outer loop
+ vertex -3.99807138985136 181.04031816812244 339.5887668437952
+ vertex -2.497969090885153 181.0404130319377 345.088738943055
+ vertex -3.9979690906254963 181.04031816812244 345.0887668428438
+ endloop
+endfacet
+facet normal 6.324254336259923e-05 -0.9999999980001905 -1.1763031831975013e-09
+ outer loop
+ vertex -2.497969090885153 181.0404130319377 345.088738943055
+ vertex -3.99807138985136 181.04031816812244 339.5887668437952
+ vertex -2.4980713901110168 181.0404130319377 339.58873894400637
+ endloop
+endfacet
+facet normal -1.8599859219734708e-05 0.9999999998270226 3.4595554154323395e-10
+ outer loop
+ vertex -3.9980899897106035 184.04085388264917 338.5887668439682
+ vertex -11.499059079893774 184.04071436533405 339.5889063611105
+ vertex -3.9980713898513542 184.04085388264917 339.5887668437952
+ endloop
+endfacet
+facet normal -1.8599859219734708e-05 0.9999999998270226 3.4595554154323395e-10
+ outer loop
+ vertex -11.499059079893774 184.04071436533405 339.5889063611105
+ vertex -3.9980899897106035 184.04085388264917 338.5887668439682
+ vertex -11.499077679753023 184.04071436533405 338.5889063612835
+ endloop
+endfacet
+facet normal -1.8599859243795255e-05 0.9999999998270226 3.459555419907567e-10
+ outer loop
+ vertex 15.500940910765449 184.0412165615337 339.5884041649109
+ vertex 8.00194841697043 184.04107707942603 345.0885436460672
+ vertex 15.501043209991312 184.0412165615337 345.0884041639595
+ endloop
+endfacet
+facet normal -1.8599859243795255e-05 0.9999999998270226 3.459555419907567e-10
+ outer loop
+ vertex 8.00194841697043 184.04107707942603 345.0885436460672
+ vertex 15.500940910765449 184.0412165615337 339.5884041649109
+ vertex 8.001846117744567 184.04107707942603 339.5885436470185
+ endloop
+endfacet
+facet normal -1.8599859219734708e-05 0.9999999998270226 3.4595554154323395e-10
+ outer loop
+ vertex -3.9980713898513542 184.04085388264917 339.5887668437952
+ vertex -11.49895678066791 184.04071436533403 345.08890636015917
+ vertex -3.9979690906254906 184.04085388264915 345.0887668428439
+ endloop
+endfacet
+facet normal -1.8599859219734708e-05 0.9999999998270226 3.4595554154323395e-10
+ outer loop
+ vertex -11.49895678066791 184.04071436533403 345.08890636015917
+ vertex -3.9980713898513542 184.04085388264917 339.5887668437952
+ vertex -11.499059079893774 184.04071436533405 339.5889063611105
+ endloop
+endfacet
+facet normal 0.999999999599929 4.6499648249916704e-06 -2.7901968550393885e-05
+ outer loop
+ vertex -3.9980899897106035 184.04085388264917 338.5887668439682
+ vertex -3.998052785632725 182.04038513167137 339.5887668434492
+ vertex -3.998089989710581 182.04038513132534 338.5887668439682
+ endloop
+endfacet
+facet normal 0.999999999599929 4.6499648249916704e-06 -2.7901968550393885e-05
+ outer loop
+ vertex -3.998052785632725 182.04038513167137 339.5887668434492
+ vertex -3.9980899897106035 184.04085388264917 338.5887668439682
+ vertex -3.9980713898513542 184.04085388264917 339.5887668437952
+ endloop
+endfacet
+facet normal 0.9999999978272129 6.324254313170525e-05 -1.8599859210822783e-05
+ outer loop
+ vertex -2.4981532325133835 182.0404130299381 338.58873894535566
+ vertex -2.4980713901110168 181.0404130319377 339.58873894400637
+ vertex -2.498089989970266 181.0404130319377 338.58873894417934
+ endloop
+endfacet
+facet normal 0.9999999978272129 6.324254313170525e-05 -1.8599859210822783e-05
+ outer loop
+ vertex -2.4980713901110168 181.0404130319377 339.58873894400637
+ vertex -2.4981532325133835 182.0404130299381 338.58873894535566
+ vertex -2.4981346326541347 182.0404130299381 339.5887389451826
+ endloop
+endfacet
+facet normal 0.9999999994339513 2.803823553304438e-05 -1.8599859240707918e-05
+ outer loop
+ vertex -3.998089989710609 181.04031816812244 338.5887668439682
+ vertex -3.9980274820538133 179.47432099664897 339.58876684297854
+ vertex -3.998046081913062 179.47432099664897 338.5887668431515
+ endloop
+endfacet
+facet normal 0.9999999994339513 2.803823553304438e-05 -1.8599859240707918e-05
+ outer loop
+ vertex -3.9980274820538133 179.47432099664897 339.58876684297854
+ vertex -3.998089989710609 181.04031816812244 338.5887668439682
+ vertex -3.99807138985136 181.04031816812244 339.5887668437952
+ endloop
+endfacet
+facet normal -1.8599859364119643e-05 0.9999999998270226 3.45955545348044e-10
+ outer loop
+ vertex -2.4981532325133835 182.0404130299381 338.58873894535566
+ vertex -3.998052785632725 182.04038513167137 339.5887668434492
+ vertex -2.4981346326541347 182.0404130299381 339.5887389451826
+ endloop
+endfacet
+facet normal -1.8599859364119643e-05 0.9999999998270226 3.45955545348044e-10
+ outer loop
+ vertex -3.998052785632725 182.04038513167137 339.5887668434492
+ vertex -2.4981532325133835 182.0404130299381 338.58873894535566
+ vertex -3.998089989710581 182.04038513132534 338.5887668439682
+ endloop
+endfacet
+facet normal 6.324254336259923e-05 -0.9999999980001905 -1.176303183197914e-09
+ outer loop
+ vertex -3.998089989710609 181.04031816812244 338.5887668439682
+ vertex -2.4980713901110168 181.0404130319377 339.58873894400637
+ vertex -3.99807138985136 181.04031816812244 339.5887668437952
+ endloop
+endfacet
+facet normal 6.324254336259923e-05 -0.9999999980001905 -1.176303183197914e-09
+ outer loop
+ vertex -2.4980713901110168 181.0404130319377 339.58873894400637
+ vertex -3.998089989710609 181.04031816812244 338.5887668439682
+ vertex -2.498089989970266 181.0404130319377 338.58873894417934
+ endloop
+endfacet
+facet normal 0.9658394493490858 0.2591411927084001 -1.796447778350219e-05
+ outer loop
+ vertex -3.96393090942501 179.34717108629587 338.5887662086141
+ vertex -3.9980274820538133 179.47432099664897 339.58876684297854
+ vertex -3.9639123095658064 179.3471710862958 339.58876620844114
+ endloop
+endfacet
+facet normal 0.9658394493490858 0.2591411927084001 -1.796447778350219e-05
+ outer loop
+ vertex -3.9980274820538133 179.47432099664897 339.58876684297854
+ vertex -3.96393090942501 179.34717108629587 338.5887662086141
+ vertex -3.998046081913062 179.47432099664897 338.5887668431515
+ endloop
+endfacet
+facet normal 0.865858592143704 0.5002888147376044 -1.610484786074711e-05
+ outer loop
+ vertex -3.8980693648740874 179.23318336044414 338.58876498359865
+ vertex -3.9639123095658064 179.3471710862958 339.58876620844114
+ vertex -3.8980507650148835 179.23318336044403 339.5887649834257
+ endloop
+endfacet
+facet normal 0.865858592143704 0.5002888147376044 -1.610484786074711e-05
+ outer loop
+ vertex -3.9639123095658064 179.3471710862958 339.58876620844114
+ vertex -3.8980693648740874 179.23318336044414 338.58876498359865
+ vertex -3.96393090942501 179.34717108629587 338.5887662086141
+ endloop
+endfacet
+facet normal 0.7068709027839646 0.7073425808082822 -1.3147699252164228e-05
+ outer loop
+ vertex -3.8049498036797673 179.14012589423606 338.5887632515879
+ vertex -3.8980507650148835 179.23318336044403 339.5887649834257
+ vertex -3.804931203820518 179.14012589423606 339.58876325141495
+ endloop
+endfacet
+facet normal 0.7068709027839646 0.7073425808082822 -1.3147699252164228e-05
+ outer loop
+ vertex -3.8980507650148835 179.23318336044403 339.5887649834257
+ vertex -3.8049498036797673 179.14012589423606 338.5887632515879
+ vertex -3.8980693648740874 179.23318336044414 338.58876498359865
+ endloop
+endfacet
+facet normal 0.4997111295562008 0.8661921189385627 -9.294556675347809e-06
+ outer loop
+ vertex -3.690918170049834 179.07434040020973 338.5887611306156
+ vertex -3.804931203820518 179.14012589423606 339.58876325141495
+ vertex -3.690899570190585 179.07434040020973 339.5887611304426
+ endloop
+endfacet
+facet normal 0.4997111295562008 0.8661921189385627 -9.294556675347809e-06
+ outer loop
+ vertex -3.804931203820518 179.14012589423606 339.58876325141495
+ vertex -3.690918170049834 179.07434040020973 338.5887611306156
+ vertex -3.8049498036797673 179.14012589423606 338.5887632515879
+ endloop
+endfacet
+facet normal 0.25849686866253047 0.9660120956119286 -4.808005373256876e-06
+ outer loop
+ vertex -3.563745531370215 179.0403100510672 338.5887587652224
+ vertex -3.690899570190585 179.07434040020973 339.5887611304426
+ vertex -3.563726931510966 179.0403100510672 339.5887587650494
+ endloop
+endfacet
+facet normal 0.25849686866253047 0.9660120956119286 -4.808005373256876e-06
+ outer loop
+ vertex -3.690899570190585 179.07434040020973 339.5887611304426
+ vertex -3.563745531370215 179.0403100510672 338.5887587652224
+ vertex -3.690918170049834 179.07434040020973 338.5887611306156
+ endloop
+endfacet
+facet normal -1.859985925190337e-05 0.9999999998270226 3.459555421415665e-10
+ outer loop
+ vertex 7.565712317340249 179.04051705741682 338.5885517588729
+ vertex -3.563726931510966 179.0403100510672 339.5887587650494
+ vertex 7.565730917199498 179.04051705741682 339.5885517586999
+ endloop
+endfacet
+facet normal -1.859985925190337e-05 0.9999999998270226 3.459555421415665e-10
+ outer loop
+ vertex -3.563726931510966 179.0403100510672 339.5887587650494
+ vertex 7.565712317340249 179.04051705741682 338.5885517588729
+ vertex -3.563745531370215 179.0403100510672 338.5887587652224
+ endloop
+endfacet
+facet normal -0.254969640874829 0.9669490587459457 4.7423994401136805e-06
+ outer loop
+ vertex 7.692947563341627 179.07406704094223 338.5885493923152
+ vertex 7.565730917199498 179.04051705741682 339.5885517586999
+ vertex 7.6929661632009205 179.07406704094223 339.5885493921422
+ endloop
+endfacet
+facet normal -0.254969640874829 0.9669490587459457 4.7423994401136805e-06
+ outer loop
+ vertex 7.565730917199498 179.04051705741682 339.5885517586999
+ vertex 7.692947563341627 179.07406704094223 338.5885493923152
+ vertex 7.565712317340249 179.04051705741682 338.5885517588729
+ endloop
+endfacet
+facet normal -0.4965465930448748 0.8680100695557798 9.235696754194307e-06
+ outer loop
+ vertex 7.807163998770703 179.13940474138005 338.5885472679056
+ vertex 7.6929661632009205 179.07406704094223 339.5885493921422
+ vertex 7.807182598629952 179.13940474138005 339.5885472677326
+ endloop
+endfacet
+facet normal -0.4965465930448748 0.8680100695557798 9.235696754194307e-06
+ outer loop
+ vertex 7.6929661632009205 179.07406704094223 339.5885493921422
+ vertex 7.807163998770703 179.13940474138005 338.5885472679056
+ vertex 7.692947563341627 179.07406704094223 338.5885493923152
+ endloop
+endfacet
+facet normal -0.7042847154819899 0.7099176285787339 1.309959659720156e-05
+ outer loop
+ vertex 7.900577962304624 179.2320775024214 338.588545530419
+ vertex 7.807182598629952 179.13940474138005 339.5885472677326
+ vertex 7.900596562163918 179.2320775024214 339.58854553024605
+ endloop
+endfacet
+facet normal -0.7042847154819899 0.7099176285787339 1.309959659720156e-05
+ outer loop
+ vertex 7.807182598629952 179.13940474138005 339.5885472677326
+ vertex 7.900577962304624 179.2320775024214 338.588545530419
+ vertex 7.807163998770703 179.13940474138005 338.5885472679056
+ endloop
+endfacet
+facet normal -0.8640269984420696 0.5034454744110011 1.6070780580175082e-05
+ outer loop
+ vertex 7.966842046562077 179.34576982855 339.58854429808935
+ vertex 7.900577962304624 179.2320775024214 338.588545530419
+ vertex 7.900596562163918 179.2320775024214 339.58854553024605
+ endloop
+endfacet
+facet normal -0.8640269984420696 0.5034454744110011 1.6070780580175082e-05
+ outer loop
+ vertex 7.900577962304624 179.2320775024214 338.588545530419
+ vertex 7.966842046562077 179.34576982855 339.58854429808935
+ vertex 7.966823446702828 179.34576982855 338.5885442982623
+ endloop
+endfacet
+facet normal -0.9648872693327224 0.2626643431407392 1.7946767403102775e-05
+ outer loop
+ vertex 8.00140453153788 179.4727337756257 339.588543655232
+ vertex 7.966823446702828 179.34576982855 338.5885442982623
+ vertex 7.966842046562077 179.34576982855 339.58854429808935
+ endloop
+endfacet
+facet normal -0.9648872693327224 0.2626643431407392 1.7946767403102775e-05
+ outer loop
+ vertex 7.966823446702828 179.34576982855 338.5885442982623
+ vertex 8.00140453153788 179.4727337756257 339.588543655232
+ vertex 8.001385931678632 179.4727337756257 338.588543655405
+ endloop
+endfacet
+facet normal -0.9999999495333092 0.0003171552057274151 1.8599858312563265e-05
+ outer loop
+ vertex 8.001901918567837 181.04101011492241 339.5885436459807
+ vertex 8.001385931678632 179.4727337756257 338.588543655405
+ vertex 8.00140453153788 179.4727337756257 339.588543655232
+ endloop
+endfacet
+facet normal -0.9999999495333092 0.0003171552057274151 1.8599858312563265e-05
+ outer loop
+ vertex 8.001385931678632 179.4727337756257 338.588543655405
+ vertex 8.001901918567837 181.04101011492241 339.5885436459807
+ vertex 8.001883318708588 181.04101011492241 338.58854364615365
+ endloop
+endfacet
+facet normal 1.859985930395633e-05 -0.9999999998270226 -3.4595554310974425e-10
+ outer loop
+ vertex 6.501927961911531 181.04098221596382 338.5885715451122
+ vertex 8.001901918567837 181.04101011492241 339.5885436459807
+ vertex 6.50194656177078 181.04098221596382 339.5885715449392
+ endloop
+endfacet
+facet normal 1.859985930395633e-05 -0.9999999998270226 -3.4595554310974425e-10
+ outer loop
+ vertex 8.001901918567837 181.04101011492241 339.5885436459807
+ vertex 6.501927961911531 181.04098221596382 338.5885715451122
+ vertex 8.001883318708588 181.04101011492241 338.58854364615365
+ endloop
+endfacet
+facet normal -0.9999999978272129 -6.324254340242607e-05 1.8599859210822783e-05
+ outer loop
+ vertex 6.501883319227389 182.04098221396413 339.58857154611553
+ vertex 6.501927961911531 181.04098221596382 338.5885715451122
+ vertex 6.50194656177078 181.04098221596382 339.5885715449392
+ endloop
+endfacet
+facet normal -0.9999999978272129 -6.324254340242607e-05 1.8599859210822783e-05
+ outer loop
+ vertex 6.501927961911531 181.04098221596382 338.5885715451122
+ vertex 6.501883319227389 182.04098221396413 339.58857154611553
+ vertex 6.50186471936814 182.04098221396413 338.58857154628845
+ endloop
+endfacet
+facet normal -6.324254316674299e-05 0.9999999980001905 1.1763031795550156e-09
+ outer loop
+ vertex 8.001864717603842 182.04107707777897 338.58854364649966
+ vertex 6.501883319227389 182.04098221396413 339.58857154611553
+ vertex 8.001883317463092 182.04107707777897 339.5885436463266
+ endloop
+endfacet
+facet normal -6.324254316674299e-05 0.9999999980001905 1.1763031795550156e-09
+ outer loop
+ vertex 6.501883319227389 182.04098221396413 339.58857154611553
+ vertex 8.001864717603842 182.04107707777897 338.58854364649966
+ vertex 6.50186471936814 182.04098221396413 338.58857154628845
+ endloop
+endfacet
+facet normal -0.9999999996540453 -1.8599859246792857e-05 1.859985924480164e-05
+ outer loop
+ vertex 8.001846117744567 184.04107707942603 339.5885436470185
+ vertex 8.001864717603842 182.04107707777897 338.58854364649966
+ vertex 8.001883317463092 182.04107707777897 339.5885436463266
+ endloop
+endfacet
+facet normal -0.9999999996540453 -1.8599859246792857e-05 1.859985924480164e-05
+ outer loop
+ vertex 8.001864717603842 182.04107707777897 338.58854364649966
+ vertex 8.001846117744567 184.04107707942603 339.5885436470185
+ vertex 8.001827517885317 184.04107707942603 338.58854364719156
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex 6.50194656177078 181.04098221596382 339.5885715449392
+ vertex 8.001883317463092 182.04107707777897 339.5885436463266
+ vertex 8.001901918567837 181.04101011492241 339.5885436459807
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex 8.001883317463092 182.04107707777897 339.5885436463266
+ vertex 6.50194656177078 181.04098221596382 339.5885715449392
+ vertex 6.501883319227389 182.04098221396413 339.58857154611553
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex -3.99807138985136 181.04031816812244 339.5887668437952
+ vertex -2.4981346326541347 182.0404130299381 339.5887389451826
+ vertex -2.4980713901110168 181.0404130319377 339.58873894400637
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex -2.4981346326541347 182.0404130299381 339.5887389451826
+ vertex -3.99807138985136 181.04031816812244 339.5887668437952
+ vertex -3.998052785632725 182.04038513167137 339.5887668434492
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex 14.501117084128163 174.56945871794306 339.58842276149335
+ vertex 8.00140453153788 179.4727337756257 339.588543655232
+ vertex 8.001901918567837 181.04101011492241 339.5885436459807
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex 8.00140453153788 179.4727337756257 339.588543655232
+ vertex 14.501117084128163 174.56945871794306 339.58842276149335
+ vertex 7.966842046562077 179.34576982855 339.58854429808935
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex 7.966842046562077 179.34576982855 339.58854429808935
+ vertex 14.501117084128163 174.56945871794306 339.58842276149335
+ vertex 7.900596562163918 179.2320775024214 339.58854553024605
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex 7.900596562163918 179.2320775024214 339.58854553024605
+ vertex 14.501117084128163 174.56945871794306 339.58842276149335
+ vertex 7.807182598629952 179.13940474138005 339.5885472677326
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex 7.807182598629952 179.13940474138005 339.5885472677326
+ vertex 14.501117084128163 174.56945871794306 339.58842276149335
+ vertex 7.6929661632009205 179.07406704094223 339.5885493921422
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex 7.6929661632009205 179.07406704094223 339.5885493921422
+ vertex 14.501117084128163 174.56945871794306 339.58842276149335
+ vertex 7.565730917199498 179.04051705741682 339.5885517586999
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex 7.565730917199498 179.04051705741682 339.5885517586999
+ vertex 14.501117084128163 174.56945871794306 339.58842276149335
+ vertex -10.49888290722297 174.56899372146188 339.5888877579745
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex 7.565730917199498 179.04051705741682 339.5885517586999
+ vertex -10.49888290722297 174.56899372146188 339.5888877579745
+ vertex -3.563726931510966 179.0403100510672 339.5887587650494
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex -3.563726931510966 179.0403100510672 339.5887587650494
+ vertex -10.49888290722297 174.56899372146188 339.5888877579745
+ vertex -3.690899570190585 179.07434040020973 339.5887611304426
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex -3.690899570190585 179.07434040020973 339.5887611304426
+ vertex -10.49888290722297 174.56899372146188 339.5888877579745
+ vertex -3.804931203820518 179.14012589423606 339.58876325141495
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex -3.804931203820518 179.14012589423606 339.58876325141495
+ vertex -10.49888290722297 174.56899372146188 339.5888877579745
+ vertex -3.8980507650148835 179.23318336044403 339.5887649834257
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex -3.8980507650148835 179.23318336044403 339.5887649834257
+ vertex -10.49888290722297 174.56899372146188 339.5888877579745
+ vertex -3.9639123095658064 179.3471710862958 339.58876620844114
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex -3.9639123095658064 179.3471710862958 339.58876620844114
+ vertex -10.49888290722297 174.56899372146188 339.5888877579745
+ vertex -3.9980274820538133 179.47432099664897 339.58876684297854
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex -3.9980274820538133 179.47432099664897 339.58876684297854
+ vertex -10.49888290722297 174.56899372146188 339.5888877579745
+ vertex -3.99807138985136 181.04031816812244 339.5887668437952
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex -3.998052785632725 182.04038513167137 339.5887668434492
+ vertex -11.499059079893774 184.04071436533405 339.5889063611105
+ vertex -3.9980713898513542 184.04085388264917 339.5887668437952
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex -11.499059079893774 184.04071436533405 339.5889063611105
+ vertex -3.998052785632725 182.04038513167137 339.5887668434492
+ vertex -3.99807138985136 181.04031816812244 339.5887668437952
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex -11.499059079893774 184.04071436533405 339.5889063611105
+ vertex -3.99807138985136 181.04031816812244 339.5887668437952
+ vertex -10.49888290722297 174.56899372146188 339.5888877579745
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex -11.499059079893774 184.04071436533405 339.5889063611105
+ vertex -10.49888290722297 174.56899372146188 339.5888877579745
+ vertex -11.49890150673626 175.5689751214297 339.58890635817966
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex 14.501117084128163 174.56945871794306 339.58842276149335
+ vertex 15.500940910765449 184.0412165615337 339.5884041649109
+ vertex 15.501098483922965 175.56947731762938 339.58840416198007
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex 15.500940910765449 184.0412165615337 339.5884041649109
+ vertex 14.501117084128163 174.56945871794306 339.58842276149335
+ vertex 8.001846117744567 184.04107707942603 339.5885436470185
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex 8.001846117744567 184.04107707942603 339.5885436470185
+ vertex 14.501117084128163 174.56945871794306 339.58842276149335
+ vertex 8.001901918567837 181.04101011492241 339.5885436459807
+ endloop
+endfacet
+facet normal -1.8599859248019022e-05 7.779675748010793e-16 -0.9999999998270228
+ outer loop
+ vertex 8.001846117744567 184.04107707942603 339.5885436470185
+ vertex 8.001901918567837 181.04101011492241 339.5885436459807
+ vertex 8.001883317463092 182.04107707777897 339.5885436463266
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex 8.00259011211447 182.04107707777894 377.5885436397538
+ vertex 8.002608713219216 181.0410101149224 377.5885436394078
+ vertex 6.502590113878768 182.04098221396407 377.58857153954267
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex 6.502653356422159 181.0409822159638 377.58857153836635
+ vertex 6.502590113878768 182.04098221396407 377.58857153954267
+ vertex 8.002608713219216 181.0410101149224 377.5885436394078
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex -3.9973645951999752 184.04085388264912 377.5887668372224
+ vertex -3.9973645951999526 182.0403851313253 377.58876683722235
+ vertex -11.498352285242396 184.040714365334 377.5889063545377
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex -3.997364595199981 181.0403181681224 377.58876683722235
+ vertex -11.498352285242396 184.040714365334 377.5889063545377
+ vertex -3.9973645951999526 182.0403851313253 377.58876683722235
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex -10.498176112571592 174.56899372146185 377.5888877514016
+ vertex -11.498352285242396 184.040714365334 377.5889063545377
+ vertex -3.997364595199981 181.0403181681224 377.58876683722235
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex -11.49819471208488 175.56897512142967 377.5889063516068
+ vertex -11.498352285242396 184.040714365334 377.5889063545377
+ vertex -10.498176112571592 174.56899372146185 377.5888877514016
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex 15.501647705416827 184.04121656153367 377.58840415833805
+ vertex 15.501805278574343 175.56947731762932 377.5884041554072
+ vertex 8.002552912395945 184.041077079426 377.5885436404457
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex 14.501823878779541 174.56945871794304 377.5884227549205
+ vertex 8.002552912395945 184.041077079426 377.5885436404457
+ vertex 15.501805278574343 175.56947731762932 377.5884041554072
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex 8.002608713219216 181.0410101149224 377.5885436394078
+ vertex 8.002552912395945 184.041077079426 377.5885436404457
+ vertex 14.501823878779541 174.56945871794304 377.5884227549205
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex 8.00211132618926 179.47273377562567 377.58854364865914
+ vertex 8.002608713219216 181.0410101149224 377.5885436394078
+ vertex 14.501823878779541 174.56945871794304 377.5884227549205
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex 7.967548841213456 179.34576982854995 377.5885442915165
+ vertex 8.00211132618926 179.47273377562567 377.58854364865914
+ vertex 14.501823878779541 174.56945871794304 377.5884227549205
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex 7.9013033568152515 179.23207750242136 377.5885455236732
+ vertex 7.967548841213456 179.34576982854995 377.5885442915165
+ vertex 14.501823878779541 174.56945871794304 377.5884227549205
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex 7.8078893932813305 179.13940474138002 377.58854726115976
+ vertex 7.9013033568152515 179.23207750242136 377.5885455236732
+ vertex 14.501823878779541 174.56945871794304 377.5884227549205
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex 7.693672957852255 179.0740670409422 377.5885493855694
+ vertex 7.8078893932813305 179.13940474138002 377.58854726115976
+ vertex 14.501823878779541 174.56945871794304 377.5884227549205
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex 7.5664377118508765 179.04051705741682 377.58855175212705
+ vertex 7.693672957852255 179.0740670409422 377.5885493855694
+ vertex 14.501823878779541 174.56945871794304 377.5884227549205
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex -10.498176112571592 174.56899372146185 377.5888877514016
+ vertex 7.5664377118508765 179.04051705741682 377.58855175212705
+ vertex 14.501823878779541 174.56945871794304 377.5884227549205
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex 8.00259011211447 182.04107707777894 377.5885436397538
+ vertex 8.002552912395945 184.041077079426 377.5885436404457
+ vertex 8.002608713219216 181.0410101149224 377.5885436394078
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex -3.5630201368595866 179.04031005106717 377.58875875847656
+ vertex 7.5664377118508765 179.04051705741682 377.58855175212705
+ vertex -10.498176112571592 174.56899372146185 377.5888877514016
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex -3.690192775539206 179.0743404002097 377.5887611238698
+ vertex -3.5630201368595866 179.04031005106717 377.58875875847656
+ vertex -10.498176112571592 174.56899372146185 377.5888877514016
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex -3.804224409169139 179.14012589423604 377.5887632448421
+ vertex -3.690192775539206 179.0743404002097 377.5887611238698
+ vertex -10.498176112571592 174.56899372146185 377.5888877514016
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex -3.897343970363459 179.23318336044412 377.5887649768528
+ vertex -3.804224409169139 179.14012589423604 377.5887632448421
+ vertex -10.498176112571592 174.56899372146185 377.5888877514016
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex -3.963205514914382 179.34717108629584 377.5887662018683
+ vertex -3.897343970363459 179.23318336044412 377.5887649768528
+ vertex -10.498176112571592 174.56899372146185 377.5888877514016
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex -3.9973206874024343 179.47432099664897 377.5887668364057
+ vertex -3.963205514914382 179.34717108629584 377.5887662018683
+ vertex -10.498176112571592 174.56899372146185 377.5888877514016
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex -3.997364595199981 181.0403181681224 377.58876683722235
+ vertex -3.9973206874024343 179.47432099664897 377.5887668364057
+ vertex -10.498176112571592 174.56899372146185 377.5888877514016
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex -2.4973645954596377 181.04041303193767 377.5887389374335
+ vertex -3.997364595199981 181.0403181681224 377.58876683722235
+ vertex -2.4974278380027557 182.04041302993804 377.5887389386098
+ endloop
+endfacet
+facet normal -1.859985924801902e-05 7.77967575122592e-16 -0.9999999998270228
+ outer loop
+ vertex -3.9973645951999526 182.0403851313253 377.58876683722235
+ vertex -2.4974278380027557 182.04041302993804 377.5887389386098
+ vertex -3.997364595199981 181.0403181681224 377.58876683722235
+ endloop
+endfacet
+facet normal -1.859985924379526e-05 0.9999999998270226 3.459555419907571e-10
+ outer loop
+ vertex 15.501750004642695 184.04121656153367 383.08840415738666
+ vertex 8.002655211621809 184.041077079426 383.08854363949433
+ vertex 15.50176860450194 184.04121656153367 384.0884041572137
+ endloop
+endfacet
+facet normal -1.859985924379526e-05 0.9999999998270226 3.459555419907571e-10
+ outer loop
+ vertex 8.002673811481058 184.041077079426 384.08854363932136
+ vertex 15.50176860450194 184.04121656153367 384.0884041572137
+ vertex 8.002655211621809 184.041077079426 383.08854363949433
+ endloop
+endfacet
+facet normal 0.9999999996540453 1.8599859246792864e-05 -1.8599859244801638e-05
+ outer loop
+ vertex 15.501926177659456 175.56947731762932 384.08840415428284
+ vertex 15.501907577800207 175.56947731762932 383.0884041544559
+ vertex 15.50176860450194 184.04121656153367 384.0884041572137
+ endloop
+endfacet
+facet normal 0.9999999996540453 1.8599859246792864e-05 -1.8599859244801638e-05
+ outer loop
+ vertex 15.501750004642695 184.04121656153367 383.08840415738666
+ vertex 15.50176860450194 184.04121656153367 384.0884041572137
+ vertex 15.501907577800207 175.56947731762932 383.0884041544559
+ endloop
+endfacet
+facet normal 1.859985924379526e-05 -0.9999999998270226 -3.459555419907571e-10
+ outer loop
+ vertex -10.498176112571592 174.56899372146185 377.5888877514016
+ vertex 14.501823878779541 174.56945871794304 377.5884227549205
+ vertex -10.498073813345728 174.56899372146185 383.0888877504502
+ endloop
+endfacet
+facet normal 1.859985924379526e-05 -0.9999999998270226 -3.459555419907571e-10
+ outer loop
+ vertex 14.501926178005409 174.569458717943 383.08842275396916
+ vertex -10.498073813345728 174.56899372146185 383.0888877504502
+ vertex 14.501823878779541 174.56945871794304 377.5884227549205
+ endloop
+endfacet
+facet normal -0.7070936288553363 -0.7071199331508208 1.3151841973605101e-05
+ outer loop
+ vertex -10.498176112571592 174.56899372146185 377.5888877514016
+ vertex -10.498073813345728 174.56899372146185 383.0888877504502
+ vertex -11.49819471208488 175.56897512142967 377.5889063516068
+ endloop
+endfacet
+facet normal -0.7070936288553363 -0.7071199331508208 1.3151841973605101e-05
+ outer loop
+ vertex -11.498092412859016 175.56897512142965 383.0889063506554
+ vertex -11.49819471208488 175.56897512142967 377.5889063516068
+ vertex -10.498073813345728 174.56899372146185 383.0888877504502
+ endloop
+endfacet
+facet normal -0.9999999996540453 -1.8599859246792864e-05 1.8599859244801638e-05
+ outer loop
+ vertex -11.49819471208488 175.56897512142967 377.5889063516068
+ vertex -11.498092412859016 175.56897512142965 383.0889063506554
+ vertex -11.498352285242396 184.040714365334 377.5889063545377
+ endloop
+endfacet
+facet normal -0.9999999996540453 -1.8599859246792864e-05 1.8599859244801638e-05
+ outer loop
+ vertex -11.498249986016532 184.040714365334 383.0889063535863
+ vertex -11.498352285242396 184.040714365334 377.5889063545377
+ vertex -11.498092412859016 175.56897512142965 383.0889063506554
+ endloop
+endfacet
+facet normal 0.7071199330285369 -0.7070936289776155 -1.3152331228624561e-05
+ outer loop
+ vertex 14.501944777864654 174.569458717943 384.0884227537961
+ vertex 14.501926178005409 174.569458717943 383.08842275396916
+ vertex 15.501926177659456 175.56947731762932 384.08840415428284
+ endloop
+endfacet
+facet normal 0.7071199330285369 -0.7070936289776155 -1.3152331228624561e-05
+ outer loop
+ vertex 15.501907577800207 175.56947731762932 383.0884041544559
+ vertex 15.501926177659456 175.56947731762932 384.08840415428284
+ vertex 14.501926178005409 174.569458717943 383.08842275396916
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex 8.002729612304329 181.0410101149224 384.08854363828345
+ vertex 8.002711011199583 182.04107707777894 384.0885436386294
+ vertex 6.502774255507272 181.04098221596377 384.088571537242
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex 6.50271101296388 182.04098221396407 384.0885715384183
+ vertex 6.502774255507272 181.04098221596377 384.088571537242
+ vertex 8.002711011199583 182.04107707777894 384.0885436386294
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex 15.501926177659456 175.56947731762932 384.08840415428284
+ vertex 15.50176860450194 184.04121656153367 384.0884041572137
+ vertex 14.501944777864654 174.569458717943 384.0884227537961
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex 8.002673811481058 184.041077079426 384.08854363932136
+ vertex 14.501944777864654 174.569458717943 384.0884227537961
+ vertex 15.50176860450194 184.04121656153367 384.0884041572137
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex 8.002729612304329 181.0410101149224 384.08854363828345
+ vertex 14.501944777864654 174.569458717943 384.0884227537961
+ vertex 8.002673811481058 184.041077079426 384.08854363932136
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex 8.002711011199583 182.04107707777894 384.0885436386294
+ vertex 8.002729612304329 181.0410101149224 384.08854363828345
+ vertex 8.002673811481058 184.041077079426 384.08854363932136
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex -2.4972436963745253 181.04041303193765 384.0887389363092
+ vertex -2.4973069389176428 182.04041302993804 384.08873893748546
+ vertex -3.9972436961148685 181.0403181681224 384.08876683609805
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex -3.99724369611484 182.0403851313253 384.08876683609805
+ vertex -3.9972436961148685 181.0403181681224 384.08876683609805
+ vertex -2.4973069389176428 182.04041302993804 384.08873893748546
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex 8.002729612304329 181.0410101149224 384.08854363828345
+ vertex 8.002232225274373 179.47273377562567 384.0885436475348
+ vertex 14.501944777864654 174.569458717943 384.0884227537961
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex 7.967669740298569 179.34576982854995 384.0885442903922
+ vertex 14.501944777864654 174.569458717943 384.0884227537961
+ vertex 8.002232225274373 179.47273377562567 384.0885436475348
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex 7.9014242559003645 179.23207750242136 384.0885455225488
+ vertex 14.501944777864654 174.569458717943 384.0884227537961
+ vertex 7.967669740298569 179.34576982854995 384.0885442903922
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex 7.808010292366443 179.13940474138002 384.0885472600354
+ vertex 14.501944777864654 174.569458717943 384.0884227537961
+ vertex 7.9014242559003645 179.23207750242136 384.0885455225488
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex 7.693793856937368 179.0740670409422 384.08854938444506
+ vertex 14.501944777864654 174.569458717943 384.0884227537961
+ vertex 7.808010292366443 179.13940474138002 384.0885472600354
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex 7.5665586109359895 179.04051705741682 384.0885517510027
+ vertex 14.501944777864654 174.569458717943 384.0884227537961
+ vertex 7.693793856937368 179.0740670409422 384.08854938444506
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex -10.498055213486479 174.56899372146185 384.08888775027725
+ vertex 14.501944777864654 174.569458717943 384.0884227537961
+ vertex 7.5665586109359895 179.04051705741682 384.0885517510027
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex -3.562899237774474 179.04031005106717 384.08875875735225
+ vertex -10.498055213486479 174.56899372146185 384.08888775027725
+ vertex 7.5665586109359895 179.04051705741682 384.0885517510027
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex -3.6900718764540934 179.0743404002097 384.08876112274544
+ vertex -10.498055213486479 174.56899372146185 384.08888775027725
+ vertex -3.562899237774474 179.04031005106717 384.08875875735225
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex -3.8041035100840266 179.14012589423604 384.0887632437177
+ vertex -10.498055213486479 174.56899372146185 384.08888775027725
+ vertex -3.6900718764540934 179.0743404002097 384.08876112274544
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex -3.8972230712783467 179.2331833604441 384.08876497572845
+ vertex -10.498055213486479 174.56899372146185 384.08888775027725
+ vertex -3.8041035100840266 179.14012589423604 384.0887632437177
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex -3.9630846158292696 179.34717108629582 384.0887662007439
+ vertex -10.498055213486479 174.56899372146185 384.08888775027725
+ vertex -3.8972230712783467 179.2331833604441 384.08876497572845
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex -3.997199788317322 179.47432099664897 384.0887668352813
+ vertex -10.498055213486479 174.56899372146185 384.08888775027725
+ vertex -3.9630846158292696 179.34717108629582 384.0887662007439
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex -3.9972436961148685 181.0403181681224 384.08876683609805
+ vertex -10.498055213486479 174.56899372146185 384.08888775027725
+ vertex -3.997199788317322 179.47432099664897 384.0887668352813
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex -3.9972436961148627 184.04085388264912 384.08876683609805
+ vertex -11.498231386157283 184.040714365334 384.08890635341334
+ vertex -3.99724369611484 182.0403851313253 384.08876683609805
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex -3.9972436961148685 181.0403181681224 384.08876683609805
+ vertex -3.99724369611484 182.0403851313253 384.08876683609805
+ vertex -11.498231386157283 184.040714365334 384.08890635341334
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex -10.498055213486479 174.56899372146185 384.08888775027725
+ vertex -3.9972436961148685 181.0403181681224 384.08876683609805
+ vertex -11.498231386157283 184.040714365334 384.08890635341334
+ endloop
+endfacet
+facet normal 1.859985924802079e-05 -6.878947785113675e-16 0.9999999998270228
+ outer loop
+ vertex -11.498073812999769 175.56897512142965 384.0889063504825
+ vertex -10.498055213486479 174.56899372146185 384.08888775027725
+ vertex -11.498231386157283 184.040714365334 384.08890635341334
+ endloop
+endfacet
+facet normal -0.9999999996540453 -1.8599859246792864e-05 1.8599859244801638e-05
+ outer loop
+ vertex -11.498092412859016 175.56897512142965 383.0889063506554
+ vertex -11.498073812999769 175.56897512142965 384.0889063504825
+ vertex -11.498249986016532 184.040714365334 383.0889063535863
+ endloop
+endfacet
+facet normal -0.9999999996540453 -1.8599859246792864e-05 1.8599859244801638e-05
+ outer loop
+ vertex -11.498231386157283 184.040714365334 384.08890635341334
+ vertex -11.498249986016532 184.040714365334 383.0889063535863
+ vertex -11.498073812999769 175.56897512142965 384.0889063504825
+ endloop
+endfacet
+facet normal -0.7070936288553363 -0.7071199331508208 1.3151841973605101e-05
+ outer loop
+ vertex -10.498073813345728 174.56899372146185 383.0888877504502
+ vertex -10.498055213486479 174.56899372146185 384.08888775027725
+ vertex -11.498092412859016 175.56897512142965 383.0889063506554
+ endloop
+endfacet
+facet normal -0.7070936288553363 -0.7071199331508208 1.3151841973605101e-05
+ outer loop
+ vertex -11.498073812999769 175.56897512142965 384.0889063504825
+ vertex -11.498092412859016 175.56897512142965 383.0889063506554
+ vertex -10.498055213486479 174.56899372146185 384.08888775027725
+ endloop
+endfacet
+facet normal 0.9999999996540453 1.8599859246792864e-05 -1.8599859244801638e-05
+ outer loop
+ vertex 15.501907577800207 175.56947731762932 383.0884041544559
+ vertex 15.501805278574343 175.56947731762932 377.5884041554072
+ vertex 15.501750004642695 184.04121656153367 383.08840415738666
+ endloop
+endfacet
+facet normal 0.9999999996540453 1.8599859246792864e-05 -1.8599859244801638e-05
+ outer loop
+ vertex 15.501647705416827 184.04121656153367 377.58840415833805
+ vertex 15.501750004642695 184.04121656153367 383.08840415738666
+ vertex 15.501805278574343 175.56947731762932 377.5884041554072
+ endloop
+endfacet
+facet normal 1.859985924379526e-05 -0.9999999998270226 -3.459555419907571e-10
+ outer loop
+ vertex -10.498073813345728 174.56899372146185 383.0888877504502
+ vertex 14.501926178005409 174.569458717943 383.08842275396916
+ vertex -10.498055213486479 174.56899372146185 384.08888775027725
+ endloop
+endfacet
+facet normal 1.859985924379526e-05 -0.9999999998270226 -3.459555419907571e-10
+ outer loop
+ vertex 14.501944777864654 174.569458717943 384.0884227537961
+ vertex -10.498055213486479 174.56899372146185 384.08888775027725
+ vertex 14.501926178005409 174.569458717943 383.08842275396916
+ endloop
+endfacet
+facet normal 0.7071199330285369 -0.7070936289776155 -1.3152331228624561e-05
+ outer loop
+ vertex 14.501926178005409 174.569458717943 383.08842275396916
+ vertex 14.501823878779541 174.56945871794304 377.5884227549205
+ vertex 15.501907577800207 175.56947731762932 383.0884041544559
+ endloop
+endfacet
+facet normal 0.7071199330285369 -0.7070936289776155 -1.3152331228624561e-05
+ outer loop
+ vertex 15.501805278574343 175.56947731762932 377.5884041554072
+ vertex 15.501907577800207 175.56947731762932 383.0884041544559
+ vertex 14.501823878779541 174.56945871794304 377.5884227549205
+ endloop
+endfacet
+facet normal 0.9999999994339513 2.8038235533044387e-05 -1.8599859240707915e-05
+ outer loop
+ vertex -3.9972183881765706 179.47432099664897 383.0887668354543
+ vertex -3.9973206874024343 179.47432099664897 377.5887668364057
+ vertex -3.9972622959741173 181.0403181681224 383.088766836271
+ endloop
+endfacet
+facet normal 0.9999999994339513 2.8038235533044387e-05 -1.8599859240707915e-05
+ outer loop
+ vertex -3.997364595199981 181.0403181681224 377.58876683722235
+ vertex -3.9972622959741173 181.0403181681224 383.088766836271
+ vertex -3.9973206874024343 179.47432099664897 377.5887668364057
+ endloop
+endfacet
+facet normal 0.9658394493490201 0.2591411927086458 -1.79644778169818e-05
+ outer loop
+ vertex -3.9631032156885637 179.34717108629573 383.08876620091695
+ vertex -3.963205514914382 179.34717108629584 377.5887662018683
+ vertex -3.9972183881765706 179.47432099664897 383.0887668354543
+ endloop
+endfacet
+facet normal 0.9658394493490201 0.2591411927086458 -1.79644778169818e-05
+ outer loop
+ vertex -3.9973206874024343 179.47432099664897 377.5887668364057
+ vertex -3.9972183881765706 179.47432099664897 383.0887668354543
+ vertex -3.963205514914382 179.34717108629584 377.5887662018683
+ endloop
+endfacet
+facet normal 0.865858592143704 0.5002888147376044 -1.6104847944957356e-05
+ outer loop
+ vertex -3.8972416711376408 179.233183360444 383.0887649759015
+ vertex -3.897343970363459 179.23318336044412 377.5887649768528
+ vertex -3.9631032156885637 179.34717108629573 383.08876620091695
+ endloop
+endfacet
+facet normal 0.865858592143704 0.5002888147376044 -1.6104847944957356e-05
+ outer loop
+ vertex -3.963205514914382 179.34717108629584 377.5887662018683
+ vertex -3.9631032156885637 179.34717108629573 383.08876620091695
+ vertex -3.897343970363459 179.23318336044412 377.5887649768528
+ endloop
+endfacet
+facet normal 0.7068709027842218 0.707342580808025 -1.314769930003062e-05
+ outer loop
+ vertex -3.804224409169139 179.14012589423604 377.5887632448421
+ vertex -3.897343970363459 179.23318336044412 377.5887649768528
+ vertex -3.8041221099432754 179.14012589423604 383.08876324389075
+ endloop
+endfacet
+facet normal 0.7068709027842218 0.707342580808025 -1.314769930003062e-05
+ outer loop
+ vertex -3.8972416711376408 179.233183360444 383.0887649759015
+ vertex -3.8041221099432754 179.14012589423604 383.08876324389075
+ vertex -3.897343970363459 179.23318336044412 377.5887649768528
+ endloop
+endfacet
+facet normal 0.4997111295562009 0.8661921189385627 -9.294556675347809e-06
+ outer loop
+ vertex -3.690192775539206 179.0743404002097 377.5887611238698
+ vertex -3.804224409169139 179.14012589423604 377.5887632448421
+ vertex -3.690090476313342 179.0743404002097 383.0887611229184
+ endloop
+endfacet
+facet normal 0.4997111295562009 0.8661921189385627 -9.294556675347809e-06
+ outer loop
+ vertex -3.8041221099432754 179.14012589423604 383.08876324389075
+ vertex -3.690090476313342 179.0743404002097 383.0887611229184
+ vertex -3.804224409169139 179.14012589423604 377.5887632448421
+ endloop
+endfacet
+facet normal 0.2584968686625305 0.9660120956119286 -4.808005373256876e-06
+ outer loop
+ vertex -3.5630201368595866 179.04031005106717 377.58875875847656
+ vertex -3.690192775539206 179.0743404002097 377.5887611238698
+ vertex -3.562917837633723 179.04031005106717 383.08875875752517
+ endloop
+endfacet
+facet normal 0.2584968686625305 0.9660120956119286 -4.808005373256876e-06
+ outer loop
+ vertex -3.690090476313342 179.0743404002097 383.0887611229184
+ vertex -3.562917837633723 179.04031005106717 383.08875875752517
+ vertex -3.690192775539206 179.0743404002097 377.5887611238698
+ endloop
+endfacet
+facet normal -1.8599859251903376e-05 0.9999999998270226 3.4595554214156693e-10
+ outer loop
+ vertex 7.5664377118508765 179.04051705741682 377.58855175212705
+ vertex -3.5630201368595866 179.04031005106717 377.58875875847656
+ vertex 7.56654001107674 179.04051705741682 383.0885517511757
+ endloop
+endfacet
+facet normal -1.8599859251903376e-05 0.9999999998270226 3.4595554214156693e-10
+ outer loop
+ vertex -3.562917837633723 179.04031005106717 383.08875875752517
+ vertex 7.56654001107674 179.04051705741682 383.0885517511757
+ vertex -3.5630201368595866 179.04031005106717 377.58875875847656
+ endloop
+endfacet
+facet normal -0.25496964087487123 0.9669490587459346 4.742399434363137e-06
+ outer loop
+ vertex 7.5664377118508765 179.04051705741682 377.58855175212705
+ vertex 7.56654001107674 179.04051705741682 383.0885517511757
+ vertex 7.693672957852255 179.0740670409422 377.5885493855694
+ endloop
+endfacet
+facet normal -0.25496964087487123 0.9669490587459346 4.742399434363137e-06
+ outer loop
+ vertex 7.693775257078164 179.0740670409422 383.088549384618
+ vertex 7.693672957852255 179.0740670409422 377.5885493855694
+ vertex 7.56654001107674 179.04051705741682 383.0885517511757
+ endloop
+endfacet
+facet normal -0.4965465930448009 0.8680100695558219 9.235696742989516e-06
+ outer loop
+ vertex 7.8078893932813305 179.13940474138002 377.58854726115976
+ vertex 7.693672957852255 179.0740670409422 377.5885493855694
+ vertex 7.807991692507194 179.13940474138002 383.0885472602084
+ endloop
+endfacet
+facet normal -0.4965465930448009 0.8680100695558219 9.235696742989516e-06
+ outer loop
+ vertex 7.693775257078164 179.0740670409422 383.088549384618
+ vertex 7.807991692507194 179.13940474138002 383.0885472602084
+ vertex 7.693672957852255 179.0740670409422 377.5885493855694
+ endloop
+endfacet
+facet normal -0.7042847154820756 0.7099176285786488 1.3099596581315943e-05
+ outer loop
+ vertex 7.9013033568152515 179.23207750242136 377.5885455236732
+ vertex 7.8078893932813305 179.13940474138002 377.58854726115976
+ vertex 7.9014056560411605 179.23207750242136 383.0885455227218
+ endloop
+endfacet
+facet normal -0.7042847154820756 0.7099176285786488 1.3099596581315943e-05
+ outer loop
+ vertex 7.807991692507194 179.13940474138002 383.0885472602084
+ vertex 7.9014056560411605 179.23207750242136 383.0885455227218
+ vertex 7.8078893932813305 179.13940474138002 377.58854726115976
+ endloop
+endfacet
+facet normal -0.8640269984419949 0.5034454744111291 1.6070780560680985e-05
+ outer loop
+ vertex 7.9013033568152515 179.23207750242136 377.5885455236732
+ vertex 7.9014056560411605 179.23207750242136 383.0885455227218
+ vertex 7.967548841213456 179.34576982854995 377.5885442915165
+ endloop
+endfacet
+facet normal -0.8640269984419949 0.5034454744111291 1.6070780560680985e-05
+ outer loop
+ vertex 7.96765114043932 179.34576982854995 383.0885442905651
+ vertex 7.967548841213456 179.34576982854995 377.5885442915165
+ vertex 7.9014056560411605 179.23207750242136 383.0885455227218
+ endloop
+endfacet
+facet normal -0.9648872693327225 0.2626643431407393 1.7946767403102775e-05
+ outer loop
+ vertex 7.967548841213456 179.34576982854995 377.5885442915165
+ vertex 7.96765114043932 179.34576982854995 383.0885442905651
+ vertex 8.00211132618926 179.47273377562567 377.58854364865914
+ endloop
+endfacet
+facet normal -0.9648872693327225 0.2626643431407393 1.7946767403102775e-05
+ outer loop
+ vertex 8.002213625415123 179.47273377562567 383.0885436477078
+ vertex 8.00211132618926 179.47273377562567 377.58854364865914
+ vertex 7.96765114043932 179.34576982854995 383.0885442905651
+ endloop
+endfacet
+facet normal -0.9999999495333092 0.00031715520572741504 1.8599858312563265e-05
+ outer loop
+ vertex 8.00211132618926 179.47273377562567 377.58854364865914
+ vertex 8.002213625415123 179.47273377562567 383.0885436477078
+ vertex 8.002608713219216 181.0410101149224 377.5885436394078
+ endloop
+endfacet
+facet normal -0.9999999495333092 0.00031715520572741504 1.8599858312563265e-05
+ outer loop
+ vertex 8.00271101244508 181.0410101149224 383.08854363845643
+ vertex 8.002608713219216 181.0410101149224 377.5885436394078
+ vertex 8.002213625415123 179.47273377562567 383.0885436477078
+ endloop
+endfacet
+facet normal 1.8599859303956336e-05 -0.9999999998270226 -3.4595554310974467e-10
+ outer loop
+ vertex 6.502653356422159 181.0409822159638 377.58857153836635
+ vertex 8.002608713219216 181.0410101149224 377.5885436394078
+ vertex 6.502755655648023 181.04098221596377 383.08857153741496
+ endloop
+endfacet
+facet normal 1.8599859303956336e-05 -0.9999999998270226 -3.4595554310974467e-10
+ outer loop
+ vertex 8.00271101244508 181.0410101149224 383.08854363845643
+ vertex 6.502755655648023 181.04098221596377 383.08857153741496
+ vertex 8.002608713219216 181.0410101149224 377.5885436394078
+ endloop
+endfacet
+facet normal -0.9999999978272129 -6.324254340242609e-05 1.859985921082278e-05
+ outer loop
+ vertex 6.502653356422159 181.0409822159638 377.58857153836635
+ vertex 6.502755655648023 181.04098221596377 383.08857153741496
+ vertex 6.502590113878768 182.04098221396407 377.58857153954267
+ endloop
+endfacet
+facet normal -0.9999999978272129 -6.324254340242609e-05 1.859985921082278e-05
+ outer loop
+ vertex 6.502692413104632 182.04098221396407 383.0885715385913
+ vertex 6.502590113878768 182.04098221396407 377.58857153954267
+ vertex 6.502755655648023 181.04098221596377 383.08857153741496
+ endloop
+endfacet
+facet normal -6.324254316674299e-05 0.9999999980001905 1.1763031795550158e-09
+ outer loop
+ vertex 8.00259011211447 182.04107707777894 377.5885436397538
+ vertex 6.502590113878768 182.04098221396407 377.58857153954267
+ vertex 8.002692411340334 182.04107707777894 383.08854363880243
+ endloop
+endfacet
+facet normal -6.324254316674299e-05 0.9999999980001905 1.1763031795550158e-09
+ outer loop
+ vertex 6.502692413104632 182.04098221396407 383.0885715385913
+ vertex 8.002692411340334 182.04107707777894 383.08854363880243
+ vertex 6.502590113878768 182.04098221396407 377.58857153954267
+ endloop
+endfacet
+facet normal -0.9999999996540453 -1.8599859246792864e-05 1.8599859244801638e-05
+ outer loop
+ vertex 8.00259011211447 182.04107707777894 377.5885436397538
+ vertex 8.002692411340334 182.04107707777894 383.08854363880243
+ vertex 8.002552912395945 184.041077079426 377.5885436404457
+ endloop
+endfacet
+facet normal -0.9999999996540453 -1.8599859246792864e-05 1.8599859244801638e-05
+ outer loop
+ vertex 8.002655211621809 184.041077079426 383.08854363949433
+ vertex 8.002552912395945 184.041077079426 377.5885436404457
+ vertex 8.002692411340334 182.04107707777894 383.08854363880243
+ endloop
+endfacet
+facet normal 0.9999999997833237 4.649964825186201e-06 -2.029115184847674e-05
+ outer loop
+ vertex -3.9972436917554823 182.04038513167131 383.08876683592496
+ vertex -3.9973645951999526 182.0403851313253 377.58876683722235
+ vertex -3.9972622959741115 184.04085388264912 383.088766836271
+ endloop
+endfacet
+facet normal 0.9999999997833237 4.649964825186201e-06 -2.029115184847674e-05
+ outer loop
+ vertex -3.9973645951999752 184.04085388264912 377.5887668372224
+ vertex -3.9972622959741115 184.04085388264912 383.088766836271
+ vertex -3.9973645951999526 182.0403851313253 377.58876683722235
+ endloop
+endfacet
+facet normal -1.859985936411965e-05 0.9999999998270226 3.459555444322776e-10
+ outer loop
+ vertex -2.4974278380027557 182.04041302993804 377.5887389386098
+ vertex -3.9973645951999526 182.0403851313253 377.58876683722235
+ vertex -2.497325538776892 182.04041302993804 383.08873893765843
+ endloop
+endfacet
+facet normal -1.859985936411965e-05 0.9999999998270226 3.459555444322776e-10
+ outer loop
+ vertex -3.9972436917554823 182.04038513167131 383.08876683592496
+ vertex -2.497325538776892 182.04041302993804 383.08873893765843
+ vertex -3.9973645951999526 182.0403851313253 377.58876683722235
+ endloop
+endfacet
+facet normal 0.9999999978272129 6.324254313170526e-05 -1.859985921082278e-05
+ outer loop
+ vertex -2.497262296233774 181.04041303193765 383.0887389364821
+ vertex -2.4973645954596377 181.04041303193767 377.5887389374335
+ vertex -2.497325538776892 182.04041302993804 383.08873893765843
+ endloop
+endfacet
+facet normal 0.9999999978272129 6.324254313170526e-05 -1.859985921082278e-05
+ outer loop
+ vertex -2.4974278380027557 182.04041302993804 377.5887389386098
+ vertex -2.497325538776892 182.04041302993804 383.08873893765843
+ vertex -2.4973645954596377 181.04041303193767 377.5887389374335
+ endloop
+endfacet
+facet normal 6.324254336259923e-05 -0.9999999980001905 -1.1763031831983272e-09
+ outer loop
+ vertex -3.997364595199981 181.0403181681224 377.58876683722235
+ vertex -2.4973645954596377 181.04041303193767 377.5887389374335
+ vertex -3.9972622959741173 181.0403181681224 383.088766836271
+ endloop
+endfacet
+facet normal 6.324254336259923e-05 -0.9999999980001905 -1.1763031831983272e-09
+ outer loop
+ vertex -2.497262296233774 181.04041303193765 383.0887389364821
+ vertex -3.9972622959741173 181.0403181681224 383.088766836271
+ vertex -2.4973645954596377 181.04041303193767 377.5887389374335
+ endloop
+endfacet
+facet normal -1.8599859219734715e-05 0.9999999998270226 3.4595554154323437e-10
+ outer loop
+ vertex -3.9972622959741115 184.04085388264912 383.088766836271
+ vertex -11.498249986016532 184.040714365334 383.0889063535863
+ vertex -3.9972436961148627 184.04085388264912 384.08876683609805
+ endloop
+endfacet
+facet normal -1.8599859219734715e-05 0.9999999998270226 3.4595554154323437e-10
+ outer loop
+ vertex -11.498231386157283 184.040714365334 384.08890635341334
+ vertex -3.9972436961148627 184.04085388264912 384.08876683609805
+ vertex -11.498249986016532 184.040714365334 383.0889063535863
+ endloop
+endfacet
+facet normal -1.859985924379526e-05 0.9999999998270226 3.459555419907571e-10
+ outer loop
+ vertex 15.501647705416827 184.04121656153367 377.58840415833805
+ vertex 8.002552912395945 184.041077079426 377.5885436404457
+ vertex 15.501750004642695 184.04121656153367 383.08840415738666
+ endloop
+endfacet
+facet normal -1.859985924379526e-05 0.9999999998270226 3.459555419907571e-10
+ outer loop
+ vertex 8.002655211621809 184.041077079426 383.08854363949433
+ vertex 15.501750004642695 184.04121656153367 383.08840415738666
+ vertex 8.002552912395945 184.041077079426 377.5885436404457
+ endloop
+endfacet
+facet normal -1.8599859219734715e-05 0.9999999998270226 3.4595554154323437e-10
+ outer loop
+ vertex -3.9973645951999752 184.04085388264912 377.5887668372224
+ vertex -11.498352285242396 184.040714365334 377.5889063545377
+ vertex -3.9972622959741115 184.04085388264912 383.088766836271
+ endloop
+endfacet
+facet normal -1.8599859219734715e-05 0.9999999998270226 3.4595554154323437e-10
+ outer loop
+ vertex -11.498249986016532 184.040714365334 383.0889063535863
+ vertex -3.9972622959741115 184.04085388264912 383.088766836271
+ vertex -11.498352285242396 184.040714365334 377.5889063545377
+ endloop
+endfacet
+facet normal 0.9999999999459649 4.649964824991664e-06 -9.29774994363252e-06
+ outer loop
+ vertex -3.99724369611484 182.0403851313253 384.08876683609805
+ vertex -3.9972436917554823 182.04038513167131 383.08876683592496
+ vertex -3.9972436961148627 184.04085388264912 384.08876683609805
+ endloop
+endfacet
+facet normal 0.9999999999459649 4.649964824991664e-06 -9.29774994363252e-06
+ outer loop
+ vertex -3.9972622959741115 184.04085388264912 383.088766836271
+ vertex -3.9972436961148627 184.04085388264912 384.08876683609805
+ vertex -3.9972436917554823 182.04038513167131 383.08876683592496
+ endloop
+endfacet
+facet normal 0.9999999978272129 6.324254313170525e-05 -1.859985921082278e-05
+ outer loop
+ vertex -2.4972436963745253 181.04041303193765 384.0887389363092
+ vertex -2.497262296233774 181.04041303193765 383.0887389364821
+ vertex -2.4973069389176428 182.04041302993804 384.08873893748546
+ endloop
+endfacet
+facet normal 0.9999999978272129 6.324254313170525e-05 -1.859985921082278e-05
+ outer loop
+ vertex -2.497325538776892 182.04041302993804 383.08873893765843
+ vertex -2.4973069389176428 182.04041302993804 384.08873893748546
+ vertex -2.497262296233774 181.04041303193765 383.0887389364821
+ endloop
+endfacet
+facet normal 0.9999999994339513 2.8038235533044387e-05 -1.8599859240707915e-05
+ outer loop
+ vertex -3.997199788317322 179.47432099664897 384.0887668352813
+ vertex -3.9972183881765706 179.47432099664897 383.0887668354543
+ vertex -3.9972436961148685 181.0403181681224 384.08876683609805
+ endloop
+endfacet
+facet normal 0.9999999994339513 2.8038235533044387e-05 -1.8599859240707915e-05
+ outer loop
+ vertex -3.9972622959741173 181.0403181681224 383.088766836271
+ vertex -3.9972436961148685 181.0403181681224 384.08876683609805
+ vertex -3.9972183881765706 179.47432099664897 383.0887668354543
+ endloop
+endfacet
+facet normal -1.859985936411965e-05 0.9999999998270226 3.459555431095032e-10
+ outer loop
+ vertex -2.497325538776892 182.04041302993804 383.08873893765843
+ vertex -3.9972436917554823 182.04038513167131 383.08876683592496
+ vertex -2.4973069389176428 182.04041302993804 384.08873893748546
+ endloop
+endfacet
+facet normal -1.859985936411965e-05 0.9999999998270226 3.459555431095032e-10
+ outer loop
+ vertex -3.99724369611484 182.0403851313253 384.08876683609805
+ vertex -2.4973069389176428 182.04041302993804 384.08873893748546
+ vertex -3.9972436917554823 182.04038513167131 383.08876683592496
+ endloop
+endfacet
+facet normal 6.324254336259923e-05 -0.9999999980001905 -1.1763031831979144e-09
+ outer loop
+ vertex -3.9972622959741173 181.0403181681224 383.088766836271
+ vertex -2.497262296233774 181.04041303193765 383.0887389364821
+ vertex -3.9972436961148685 181.0403181681224 384.08876683609805
+ endloop
+endfacet
+facet normal 6.324254336259923e-05 -0.9999999980001905 -1.1763031831979144e-09
+ outer loop
+ vertex -2.4972436963745253 181.04041303193765 384.0887389363092
+ vertex -3.9972436961148685 181.0403181681224 384.08876683609805
+ vertex -2.497262296233774 181.04041303193765 383.0887389364821
+ endloop
+endfacet
+facet normal 0.9658394493490858 0.2591411927084001 -1.7964477850463862e-05
+ outer loop
+ vertex -3.9631032156885637 179.34717108629573 383.08876620091695
+ vertex -3.9972183881765706 179.47432099664897 383.0887668354543
+ vertex -3.9630846158292696 179.34717108629582 384.0887662007439
+ endloop
+endfacet
+facet normal 0.9658394493490858 0.2591411927084001 -1.7964477850463862e-05
+ outer loop
+ vertex -3.997199788317322 179.47432099664897 384.0887668352813
+ vertex -3.9630846158292696 179.34717108629582 384.0887662007439
+ vertex -3.9972183881765706 179.47432099664897 383.0887668354543
+ endloop
+endfacet
+facet normal 0.865858592143704 0.5002888147376044 -1.6104848029167607e-05
+ outer loop
+ vertex -3.8972416711376408 179.233183360444 383.0887649759015
+ vertex -3.9631032156885637 179.34717108629573 383.08876620091695
+ vertex -3.8972230712783467 179.2331833604441 384.08876497572845
+ endloop
+endfacet
+facet normal 0.865858592143704 0.5002888147376044 -1.6104848029167607e-05
+ outer loop
+ vertex -3.9630846158292696 179.34717108629582 384.0887662007439
+ vertex -3.8972230712783467 179.2331833604441 384.08876497572845
+ vertex -3.9631032156885637 179.34717108629573 383.08876620091695
+ endloop
+endfacet
+facet normal 0.7068709027839646 0.7073425808082822 -1.3147699347887446e-05
+ outer loop
+ vertex -3.8041221099432754 179.14012589423604 383.08876324389075
+ vertex -3.8972416711376408 179.233183360444 383.0887649759015
+ vertex -3.8041035100840266 179.14012589423604 384.0887632437177
+ endloop
+endfacet
+facet normal 0.7068709027839646 0.7073425808082822 -1.3147699347887446e-05
+ outer loop
+ vertex -3.8972230712783467 179.2331833604441 384.08876497572845
+ vertex -3.8041035100840266 179.14012589423604 384.0887632437177
+ vertex -3.8972416711376408 179.233183360444 383.0887649759015
+ endloop
+endfacet
+facet normal 0.4997111295562008 0.8661921189385627 -9.294556675347807e-06
+ outer loop
+ vertex -3.690090476313342 179.0743404002097 383.0887611229184
+ vertex -3.8041221099432754 179.14012589423604 383.08876324389075
+ vertex -3.6900718764540934 179.0743404002097 384.08876112274544
+ endloop
+endfacet
+facet normal 0.4997111295562008 0.8661921189385627 -9.294556675347807e-06
+ outer loop
+ vertex -3.8041035100840266 179.14012589423604 384.0887632437177
+ vertex -3.6900718764540934 179.0743404002097 384.08876112274544
+ vertex -3.8041221099432754 179.14012589423604 383.08876324389075
+ endloop
+endfacet
+facet normal 0.25849686866253047 0.9660120956119286 -4.808005373256875e-06
+ outer loop
+ vertex -3.562917837633723 179.04031005106717 383.08875875752517
+ vertex -3.690090476313342 179.0743404002097 383.0887611229184
+ vertex -3.562899237774474 179.04031005106717 384.08875875735225
+ endloop
+endfacet
+facet normal 0.25849686866253047 0.9660120956119286 -4.808005373256875e-06
+ outer loop
+ vertex -3.6900718764540934 179.0743404002097 384.08876112274544
+ vertex -3.562899237774474 179.04031005106717 384.08875875735225
+ vertex -3.690090476313342 179.0743404002097 383.0887611229184
+ endloop
+endfacet
+facet normal -1.8599859251903376e-05 0.9999999998270226 3.4595554214156693e-10
+ outer loop
+ vertex 7.56654001107674 179.04051705741682 383.0885517511757
+ vertex -3.562917837633723 179.04031005106717 383.08875875752517
+ vertex 7.5665586109359895 179.04051705741682 384.0885517510027
+ endloop
+endfacet
+facet normal -1.8599859251903376e-05 0.9999999998270226 3.4595554214156693e-10
+ outer loop
+ vertex -3.562899237774474 179.04031005106717 384.08875875735225
+ vertex 7.5665586109359895 179.04051705741682 384.0885517510027
+ vertex -3.562917837633723 179.04031005106717 383.08875875752517
+ endloop
+endfacet
+facet normal -0.254969640874829 0.9669490587459457 4.742399428611023e-06
+ outer loop
+ vertex 7.693775257078164 179.0740670409422 383.088549384618
+ vertex 7.56654001107674 179.04051705741682 383.0885517511757
+ vertex 7.693793856937368 179.0740670409422 384.08854938444506
+ endloop
+endfacet
+facet normal -0.254969640874829 0.9669490587459457 4.742399428611023e-06
+ outer loop
+ vertex 7.5665586109359895 179.04051705741682 384.0885517510027
+ vertex 7.693793856937368 179.0740670409422 384.08854938444506
+ vertex 7.56654001107674 179.04051705741682 383.0885517511757
+ endloop
+endfacet
+facet normal -0.4965465930448748 0.8680100695557798 9.235696731787475e-06
+ outer loop
+ vertex 7.807991692507194 179.13940474138002 383.0885472602084
+ vertex 7.693775257078164 179.0740670409422 383.088549384618
+ vertex 7.808010292366443 179.13940474138002 384.0885472600354
+ endloop
+endfacet
+facet normal -0.4965465930448748 0.8680100695557798 9.235696731787475e-06
+ outer loop
+ vertex 7.693793856937368 179.0740670409422 384.08854938444506
+ vertex 7.808010292366443 179.13940474138002 384.0885472600354
+ vertex 7.693775257078164 179.0740670409422 383.088549384618
+ endloop
+endfacet
+facet normal -0.7042847154819899 0.7099176285787339 1.3099596565427142e-05
+ outer loop
+ vertex 7.9014056560411605 179.23207750242136 383.0885455227218
+ vertex 7.807991692507194 179.13940474138002 383.0885472602084
+ vertex 7.9014242559003645 179.23207750242136 384.0885455225488
+ endloop
+endfacet
+facet normal -0.7042847154819899 0.7099176285787339 1.3099596565427142e-05
+ outer loop
+ vertex 7.808010292366443 179.13940474138002 384.0885472600354
+ vertex 7.9014242559003645 179.23207750242136 384.0885455225488
+ vertex 7.807991692507194 179.13940474138002 383.0885472602084
+ endloop
+endfacet
+facet normal -0.8640269984420696 0.5034454744110011 1.6070780541189673e-05
+ outer loop
+ vertex 7.9014056560411605 179.23207750242136 383.0885455227218
+ vertex 7.9014242559003645 179.23207750242136 384.0885455225488
+ vertex 7.96765114043932 179.34576982854995 383.0885442905651
+ endloop
+endfacet
+facet normal -0.8640269984420696 0.5034454744110011 1.6070780541189673e-05
+ outer loop
+ vertex 7.967669740298569 179.34576982854995 384.0885442903922
+ vertex 7.96765114043932 179.34576982854995 383.0885442905651
+ vertex 7.9014242559003645 179.23207750242136 384.0885455225488
+ endloop
+endfacet
+facet normal -0.9648872693327224 0.2626643431407392 1.794676740310277e-05
+ outer loop
+ vertex 7.96765114043932 179.34576982854995 383.0885442905651
+ vertex 7.967669740298569 179.34576982854995 384.0885442903922
+ vertex 8.002213625415123 179.47273377562567 383.0885436477078
+ endloop
+endfacet
+facet normal -0.9648872693327224 0.2626643431407392 1.794676740310277e-05
+ outer loop
+ vertex 8.002232225274373 179.47273377562567 384.0885436475348
+ vertex 8.002213625415123 179.47273377562567 383.0885436477078
+ vertex 7.967669740298569 179.34576982854995 384.0885442903922
+ endloop
+endfacet
+facet normal -0.9999999495333092 0.0003171552057274151 1.859985831256326e-05
+ outer loop
+ vertex 8.002213625415123 179.47273377562567 383.0885436477078
+ vertex 8.002232225274373 179.47273377562567 384.0885436475348
+ vertex 8.00271101244508 181.0410101149224 383.08854363845643
+ endloop
+endfacet
+facet normal -0.9999999495333092 0.0003171552057274151 1.859985831256326e-05
+ outer loop
+ vertex 8.002729612304329 181.0410101149224 384.08854363828345
+ vertex 8.00271101244508 181.0410101149224 383.08854363845643
+ vertex 8.002232225274373 179.47273377562567 384.0885436475348
+ endloop
+endfacet
+facet normal 1.8599859303956336e-05 -0.9999999998270226 -3.4595554310974467e-10
+ outer loop
+ vertex 6.502755655648023 181.04098221596377 383.08857153741496
+ vertex 8.00271101244508 181.0410101149224 383.08854363845643
+ vertex 6.502774255507272 181.04098221596377 384.088571537242
+ endloop
+endfacet
+facet normal 1.8599859303956336e-05 -0.9999999998270226 -3.4595554310974467e-10
+ outer loop
+ vertex 8.002729612304329 181.0410101149224 384.08854363828345
+ vertex 6.502774255507272 181.04098221596377 384.088571537242
+ vertex 8.00271101244508 181.0410101149224 383.08854363845643
+ endloop
+endfacet
+facet normal -0.9999999978272129 -6.324254340242609e-05 1.859985921082278e-05
+ outer loop
+ vertex 6.502755655648023 181.04098221596377 383.08857153741496
+ vertex 6.502774255507272 181.04098221596377 384.088571537242
+ vertex 6.502692413104632 182.04098221396407 383.0885715385913
+ endloop
+endfacet
+facet normal -0.9999999978272129 -6.324254340242609e-05 1.859985921082278e-05
+ outer loop
+ vertex 6.50271101296388 182.04098221396407 384.0885715384183
+ vertex 6.502692413104632 182.04098221396407 383.0885715385913
+ vertex 6.502774255507272 181.04098221596377 384.088571537242
+ endloop
+endfacet
+facet normal -6.324254316674299e-05 0.9999999980001905 1.1763031795550158e-09
+ outer loop
+ vertex 8.002692411340334 182.04107707777894 383.08854363880243
+ vertex 6.502692413104632 182.04098221396407 383.0885715385913
+ vertex 8.002711011199583 182.04107707777894 384.0885436386294
+ endloop
+endfacet
+facet normal -6.324254316674299e-05 0.9999999980001905 1.1763031795550158e-09
+ outer loop
+ vertex 6.50271101296388 182.04098221396407 384.0885715384183
+ vertex 8.002711011199583 182.04107707777894 384.0885436386294
+ vertex 6.502692413104632 182.04098221396407 383.0885715385913
+ endloop
+endfacet
+facet normal -0.9999999996540453 -1.8599859246792864e-05 1.8599859244801638e-05
+ outer loop
+ vertex 8.002692411340334 182.04107707777894 383.08854363880243
+ vertex 8.002711011199583 182.04107707777894 384.0885436386294
+ vertex 8.002655211621809 184.041077079426 383.08854363949433
+ endloop
+endfacet
+facet normal -0.9999999996540453 -1.8599859246792864e-05 1.8599859244801638e-05
+ outer loop
+ vertex 8.002673811481058 184.041077079426 384.08854363932136
+ vertex 8.002655211621809 184.041077079426 383.08854363949433
+ vertex 8.002711011199583 182.04107707777894 384.0885436386294
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex 8.00271101244508 181.0410101149224 383.08854363845643
+ vertex 8.002692411340334 182.04107707777894 383.08854363880243
+ vertex 6.502755655648023 181.04098221596377 383.08857153741496
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex 6.502692413104632 182.04098221396407 383.0885715385913
+ vertex 6.502755655648023 181.04098221596377 383.08857153741496
+ vertex 8.002692411340334 182.04107707777894 383.08854363880243
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex -2.497262296233774 181.04041303193765 383.0887389364821
+ vertex -2.497325538776892 182.04041302993804 383.08873893765843
+ vertex -3.9972622959741173 181.0403181681224 383.088766836271
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex -3.9972436917554823 182.04038513167131 383.08876683592496
+ vertex -3.9972622959741173 181.0403181681224 383.088766836271
+ vertex -2.497325538776892 182.04041302993804 383.08873893765843
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex 8.00271101244508 181.0410101149224 383.08854363845643
+ vertex 8.002213625415123 179.47273377562567 383.0885436477078
+ vertex 14.501926178005409 174.569458717943 383.08842275396916
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex 7.96765114043932 179.34576982854995 383.0885442905651
+ vertex 14.501926178005409 174.569458717943 383.08842275396916
+ vertex 8.002213625415123 179.47273377562567 383.0885436477078
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex 7.9014056560411605 179.23207750242136 383.0885455227218
+ vertex 14.501926178005409 174.569458717943 383.08842275396916
+ vertex 7.96765114043932 179.34576982854995 383.0885442905651
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex 7.807991692507194 179.13940474138002 383.0885472602084
+ vertex 14.501926178005409 174.569458717943 383.08842275396916
+ vertex 7.9014056560411605 179.23207750242136 383.0885455227218
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex 7.693775257078164 179.0740670409422 383.088549384618
+ vertex 14.501926178005409 174.569458717943 383.08842275396916
+ vertex 7.807991692507194 179.13940474138002 383.0885472602084
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex 7.56654001107674 179.04051705741682 383.0885517511757
+ vertex 14.501926178005409 174.569458717943 383.08842275396916
+ vertex 7.693775257078164 179.0740670409422 383.088549384618
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex -10.498073813345728 174.56899372146185 383.0888877504502
+ vertex 14.501926178005409 174.569458717943 383.08842275396916
+ vertex 7.56654001107674 179.04051705741682 383.0885517511757
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex -3.562917837633723 179.04031005106717 383.08875875752517
+ vertex -10.498073813345728 174.56899372146185 383.0888877504502
+ vertex 7.56654001107674 179.04051705741682 383.0885517511757
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex -3.690090476313342 179.0743404002097 383.0887611229184
+ vertex -10.498073813345728 174.56899372146185 383.0888877504502
+ vertex -3.562917837633723 179.04031005106717 383.08875875752517
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex -3.8041221099432754 179.14012589423604 383.08876324389075
+ vertex -10.498073813345728 174.56899372146185 383.0888877504502
+ vertex -3.690090476313342 179.0743404002097 383.0887611229184
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex -3.8972416711376408 179.233183360444 383.0887649759015
+ vertex -10.498073813345728 174.56899372146185 383.0888877504502
+ vertex -3.8041221099432754 179.14012589423604 383.08876324389075
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex -3.9631032156885637 179.34717108629573 383.08876620091695
+ vertex -10.498073813345728 174.56899372146185 383.0888877504502
+ vertex -3.8972416711376408 179.233183360444 383.0887649759015
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex -3.9972183881765706 179.47432099664897 383.0887668354543
+ vertex -10.498073813345728 174.56899372146185 383.0888877504502
+ vertex -3.9631032156885637 179.34717108629573 383.08876620091695
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex -3.9972622959741173 181.0403181681224 383.088766836271
+ vertex -10.498073813345728 174.56899372146185 383.0888877504502
+ vertex -3.9972183881765706 179.47432099664897 383.0887668354543
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex -3.9972622959741115 184.04085388264912 383.088766836271
+ vertex -11.498249986016532 184.040714365334 383.0889063535863
+ vertex -3.9972436917554823 182.04038513167131 383.08876683592496
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex -3.9972622959741173 181.0403181681224 383.088766836271
+ vertex -3.9972436917554823 182.04038513167131 383.08876683592496
+ vertex -11.498249986016532 184.040714365334 383.0889063535863
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex -10.498073813345728 174.56899372146185 383.0888877504502
+ vertex -3.9972622959741173 181.0403181681224 383.088766836271
+ vertex -11.498249986016532 184.040714365334 383.0889063535863
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex -11.498092412859016 175.56897512142965 383.0889063506554
+ vertex -10.498073813345728 174.56899372146185 383.0888877504502
+ vertex -11.498249986016532 184.040714365334 383.0889063535863
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex 15.501907577800207 175.56947731762932 383.0884041544559
+ vertex 15.501750004642695 184.04121656153367 383.08840415738666
+ vertex 14.501926178005409 174.569458717943 383.08842275396916
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex 8.002655211621809 184.041077079426 383.08854363949433
+ vertex 14.501926178005409 174.569458717943 383.08842275396916
+ vertex 15.501750004642695 184.04121656153367 383.08840415738666
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex 8.00271101244508 181.0410101149224 383.08854363845643
+ vertex 14.501926178005409 174.569458717943 383.08842275396916
+ vertex 8.002655211621809 184.041077079426 383.08854363949433
+ endloop
+endfacet
+facet normal 1.859985924801902e-05 -7.77967575122592e-16 0.9999999998270228
+ outer loop
+ vertex 8.002692411340334 182.04107707777894 383.08854363880243
+ vertex 8.00271101244508 181.0410101149224 383.08854363845643
+ vertex 8.002655211621809 184.041077079426 383.08854363949433
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex -2.4974278380028263 182.04041302993787 377.5887389386096
+ vertex -3.997364595200023 182.04038513132514 377.5887668372222
+ vertex -2.4973645954597052 181.04041303193748 377.58873893743333
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex 15.50164770541676 184.04121656153367 377.5884041583378
+ vertex 8.002552912395876 184.041077079426 377.58854364044555
+ vertex 15.501833704009199 174.04121656326348 377.5884041548783
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex 8.002590112114401 182.04107707777877 377.5885436397536
+ vertex 15.501833704009199 174.04121656326348 377.5884041548783
+ vertex 8.002552912395876 184.041077079426 377.58854364044555
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex 8.002608713219148 181.04101011492222 377.58854363940765
+ vertex 15.501833704009199 174.04121656326348 377.5884041548783
+ vertex 8.002590112114401 182.04107707777877 377.5885436397536
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex 6.502590113878699 182.0409822139639 377.58857153954244
+ vertex 8.002608713219148 181.04101011492222 377.58854363940765
+ vertex 8.002590112114401 182.04107707777877 377.5885436397536
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex 8.002111326189192 179.47273377562547 377.58854364865897
+ vertex 15.501833704009199 174.04121656326348 377.5884041548783
+ vertex 8.002608713219148 181.04101011492222 377.58854363940765
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex 7.967548841213389 179.34576982854978 377.5885442915163
+ vertex 15.501833704009199 174.04121656326348 377.5884041548783
+ vertex 8.002111326189192 179.47273377562547 377.58854364865897
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex 7.9013033568152276 179.23207750242128 377.588545523673
+ vertex 15.501833704009199 174.04121656326348 377.5884041548783
+ vertex 7.967548841213389 179.34576982854978 377.5885442915163
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex 7.807889393281262 179.13940474137982 377.5885472611596
+ vertex 15.501833704009199 174.04121656326348 377.5884041548783
+ vertex 7.9013033568152276 179.23207750242128 377.588545523673
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex 7.693672957852187 179.07406704094203 377.5885493855692
+ vertex 15.501833704009199 174.04121656326348 377.5884041548783
+ vertex 7.807889393281262 179.13940474137982 377.5885472611596
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex 7.566437711850807 179.04051705741654 377.5885517521269
+ vertex 15.501833704009199 174.04121656326348 377.5884041548783
+ vertex 7.693672957852187 179.07406704094203 377.5885493855692
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex -3.5630201368596572 179.040310051067 377.5887587584764
+ vertex 15.501833704009199 174.04121656326348 377.5884041548783
+ vertex 7.566437711850807 179.04051705741654 377.5885517521269
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex 7.001824407020182 174.54105846437338 377.58856225385483
+ vertex 15.501833704009199 174.04121656326348 377.5884041548783
+ vertex -3.5630201368596572 179.040310051067 377.5887587584764
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex 7.001833706949803 174.04105846445987 377.58856225368186
+ vertex 15.501833704009199 174.04121656326348 377.5884041548783
+ vertex 7.001824407020182 174.54105846437338 377.58856225385483
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex -11.498352285242461 184.040714365334 377.58890635453747
+ vertex -11.498166286650022 174.0407143670638 377.58890635107787
+ vertex -3.997364595200043 184.04085388264912 377.5887668372222
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex -3.997364595200023 182.04038513132514 377.5887668372222
+ vertex -3.997364595200043 184.04085388264912 377.5887668372222
+ vertex -11.498166286650022 174.0407143670638 377.58890635107787
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex -3.9973645952000485 181.04031816812224 377.5887668372222
+ vertex -3.997364595200023 182.04038513132514 377.5887668372222
+ vertex -11.498166286650022 174.0407143670638 377.58890635107787
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex -2.4973645954597052 181.04041303193748 377.58873893743333
+ vertex -3.997364595200023 182.04038513132514 377.5887668372222
+ vertex -3.9973645952000485 181.04031816812224 377.5887668372222
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex -3.9973633738206127 179.54030197243037 377.5887668371995
+ vertex -3.9973645952000485 181.04031816812224 377.5887668372222
+ vertex -11.498166286650022 174.0407143670638 377.58890635107787
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex -3.997320687402502 179.47432099664877 377.5887668364055
+ vertex -3.9973633738206127 179.54030197243037 377.5887668371995
+ vertex -11.498166286650022 174.0407143670638 377.58890635107787
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex -3.9632055149144976 179.34717108629556 377.5887662018681
+ vertex -3.997320687402502 179.47432099664877 377.5887668364055
+ vertex -11.498166286650022 174.0407143670638 377.58890635107787
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex -3.897343970363572 179.2331833604438 377.5887649768526
+ vertex -3.9632055149144976 179.34717108629556 377.5887662018681
+ vertex -11.498166286650022 174.0407143670638 377.58890635107787
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex -3.804224409169252 179.14012589423575 377.5887632448419
+ vertex -3.897343970363572 179.2331833604438 377.5887649768526
+ vertex -11.498166286650022 174.0407143670638 377.58890635107787
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex -3.6901927755392765 179.07434040020954 377.58876112386963
+ vertex -3.804224409169252 179.14012589423575 377.5887632448419
+ vertex -11.498166286650022 174.0407143670638 377.58890635107787
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex -3.5630201368596572 179.040310051067 377.5887587584764
+ vertex -3.6901927755392765 179.07434040020954 377.58876112386963
+ vertex -11.498166286650022 174.0407143670638 377.58890635107787
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex -2.9981755895202524 174.5408724657809 377.58874825244726
+ vertex -3.5630201368596572 179.040310051067 377.5887587584764
+ vertex -11.498166286650022 174.0407143670638 377.58890635107787
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex 7.001824407020182 174.54105846437338 377.58856225385483
+ vertex -3.5630201368596572 179.040310051067 377.5887587584764
+ vertex -2.9981755895202524 174.5408724657809 377.58874825244726
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex -2.998166289590631 174.0408724658674 377.58874825227434
+ vertex -2.9981755895202524 174.5408724657809 377.58874825244726
+ vertex -11.498166286650022 174.0407143670638 377.58890635107787
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex -3.4973540740639915 179.0403112724467 377.5887575370969
+ vertex -3.5630201368596572 179.040310051067 377.5887587584764
+ vertex 7.502645922130445 179.0405158708983 377.5885529386452
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex 7.566437711850807 179.04051705741654 377.5885517521269
+ vertex 7.502645922130445 179.0405158708983 377.5885529386452
+ vertex -3.5630201368596572 179.040310051067 377.5887587584764
+ endloop
+endfacet
+facet normal 1.859985924805751e-05 -4.270842219112203e-15 0.9999999998270228
+ outer loop
+ vertex 8.002608713219148 181.04101011492222 377.58854363940765
+ vertex 6.502590113878699 182.0409822139639 377.58857153954244
+ vertex 6.5026533564220905 181.0409822159636 377.5885715383662
+ endloop
+endfacet
+facet normal -1.8599859243795248e-05 0.9999999998270226 3.459555419907565e-10
+ outer loop
+ vertex 15.50164770541676 184.04121656153367 377.5884041583378
+ vertex 15.501043209991199 184.0412165615337 345.0884041639595
+ vertex 8.002552912395876 184.041077079426 377.58854364044555
+ endloop
+endfacet
+facet normal -1.8599859243795248e-05 0.9999999998270226 3.459555419907565e-10
+ outer loop
+ vertex 8.001948416970317 184.04107707942603 345.0885436460672
+ vertex 8.002552912395876 184.041077079426 377.58854364044555
+ vertex 15.501043209991199 184.0412165615337 345.0884041639595
+ endloop
+endfacet
+facet normal 0.9999999996540453 1.8599859246792854e-05 -1.859985924480163e-05
+ outer loop
+ vertex 15.501229208583638 174.0412165632634 345.0884041605
+ vertex 15.501043209991199 184.0412165615337 345.0884041639595
+ vertex 15.501833704009199 174.04121656326348 377.5884041548783
+ endloop
+endfacet
+facet normal 0.9999999996540453 1.8599859246792854e-05 -1.859985924480163e-05
+ outer loop
+ vertex 15.50164770541676 184.04121656153367 377.5884041583378
+ vertex 15.501833704009199 174.04121656326348 377.5884041548783
+ vertex 15.501043209991199 184.0412165615337 345.0884041639595
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -2.998166289590631 174.0408724658674 377.58874825227434
+ vertex -6.561583586266025 174.05445894320752 350.9505833566617
+ vertex -2.998770785016191 174.04087246586732 345.088748257896
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -6.711440980811342 174.05440677889854 350.5888147525761
+ vertex -2.998770785016191 174.04087246586732 345.088748257896
+ vertex -6.561583586266025 174.05445894320752 350.9505833566617
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -6.949824702254958 174.05441294989427 350.278159049851
+ vertex -2.998770785016191 174.04087246586732 345.088748257896
+ vertex -6.711440980811342 174.05440677889854 350.5888147525761
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex -2.998770785016191 174.04087246586732 345.088748257896
+ vertex -6.949824702254958 174.05441294989427 350.278159049851
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -6.510465052406163 174.05456588790972 351.3388109295902
+ vertex -6.561583586266025 174.05445894320752 350.9505833566617
+ vertex -2.998166289590631 174.0408724658674 377.58874825227434
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -6.510092923092373 174.05569137925528 371.33881090890077
+ vertex -6.510465052406163 174.05456588790972 351.3388109295902
+ vertex -2.998166289590631 174.0408724658674 377.58874825227434
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -7.260489293928211 174.05447703565144 350.0397869212441
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex -6.949824702254958 174.05441294989427 350.278159049851
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -7.622263477306075 174.05459466883167 349.8899430333916
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex -7.260489293928211 174.05447703565144 350.0397869212441
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -8.010492939651467 174.05475783292815 349.83883899962177
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex -7.622263477306075 174.05459466883167 349.8899430333916
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -8.398720484685057 174.05495540857729 349.8899574753827
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex -8.010492939651467 174.05475783292815 349.83883899962177
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -8.760489046789141 174.0551739313252 350.0398148210285
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex -8.398720484685057 174.05495540857729 349.8899574753827
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -9.071144696307146 174.0553985092076 350.27819850610433
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex -8.760489046789141 174.0551739313252 350.0398148210285
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -9.309516764107213 174.05561383761307 350.58886307642007
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex -9.071144696307146 174.0553985092076 350.27819850610433
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -9.459360587697146 174.05580524226656 350.9506372549061
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex -9.309516764107213 174.05561383761307 350.58886307642007
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -9.510464558128016 174.0559596792572 351.3388667291587
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex -9.459360587697146 174.05580524226656 350.9506372549061
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -9.51009269307189 174.0548341879116 371.3388667429291
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex -9.510464558128016 174.0559596792572 351.3388667291587
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -11.498166286650022 174.0407143670638 377.58890635107787
+ vertex -6.949412990345849 174.05561144828937 372.3994792183773
+ vertex -2.998166289590631 174.0408724658674 377.58874825227434
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -6.711040852713081 174.0556662036652 372.08881462148906
+ vertex -2.998166289590631 174.0408724658674 377.58874825227434
+ vertex -6.949412990345849 174.05561144828937 372.3994792183773
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -6.561196959053923 174.05569346662915 371.727040413526
+ vertex -2.998166289590631 174.0408724658674 377.58874825227434
+ vertex -6.711040852713081 174.0556662036652 372.08881462148906
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -6.510092923092373 174.05569137925528 371.33881090890077
+ vertex -2.998166289590631 174.0408724658674 377.58874825227434
+ vertex -6.561196959053923 174.05569346662915 371.727040413526
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -7.260068704701047 174.05553293198992 372.6378629253104
+ vertex -6.949412990345849 174.05561144828937 372.3994792183773
+ vertex -11.498166286650022 174.0407143670638 377.58890635107787
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -7.621837322228213 174.05543600552312 372.7877202866084
+ vertex -7.260068704701047 174.05553293198992 372.6378629253104
+ vertex -11.498166286650022 174.0407143670638 377.58890635107787
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -8.010064909493801 174.05532727426734 372.8388387707501
+ vertex -7.621837322228213 174.05543600552312 372.7877202866084
+ vertex -11.498166286650022 174.0407143670638 377.58890635107787
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -8.398294398002074 174.05521414807805 372.78773473751835
+ vertex -8.010064909493801 174.05532727426734 372.8388387707501
+ vertex -11.498166286650022 174.0407143670638 377.58890635107787
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -8.760068589690809 174.0551043363181 372.63789084232457
+ vertex -8.398294398002074 174.05521414807805 372.78773473751835
+ vertex -11.498166286650022 174.0407143670638 377.58890635107787
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -9.070733171256427 174.05500532247748 372.3995186989973
+ vertex -8.760068589690809 174.0551043363181 372.63789084232457
+ vertex -11.498166286650022 174.0407143670638 377.58890635107787
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -9.30911686486285 174.0549238541857 372.08886297517597
+ vertex -9.070733171256427 174.05500532247748 372.3995186989973
+ vertex -11.498166286650022 174.0407143670638 377.58890635107787
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -9.458974215738403 174.05486548337223 371.72709434505595
+ vertex -9.30911686486285 174.0549238541857 372.08886297517597
+ vertex -11.498166286650022 174.0407143670638 377.58890635107787
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -9.51009269307189 174.0548341879116 371.3388667429291
+ vertex -9.458974215738403 174.05486548337223 371.72709434505595
+ vertex -11.498166286650022 174.0407143670638 377.58890635107787
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex -9.51009269307189 174.0548341879116 371.3388667429291
+ vertex -11.498166286650022 174.0407143670638 377.58890635107787
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -6.510092923092373 174.05569137925528 371.33881090890077
+ vertex -6.561211400425863 174.05566008379466 370.95058330677386
+ vertex -6.510465052406163 174.05456588790972 351.3388109295902
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -6.5615690228370385 174.05472032490036 351.72704040384275
+ vertex -6.510465052406163 174.05456588790972 351.3388109295902
+ vertex -6.561211400425863 174.05566008379466 370.95058330677386
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -6.711068751301413 174.0556017129812 370.58881467665384
+ vertex -6.5615690228370385 174.05472032490036 351.72704040384275
+ vertex -6.561211400425863 174.05566008379466 370.95058330677386
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -6.71141284642697 174.05491172955382 352.08881458232884
+ vertex -6.5615690228370385 174.05472032490036 351.72704040384275
+ vertex -6.711068751301413 174.0556017129812 370.58881467665384
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -6.94945244490784 174.0555202446894 370.2781589528325
+ vertex -6.71141284642697 174.05491172955382 352.08881458232884
+ vertex -6.711068751301413 174.0556017129812 370.58881467665384
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -6.94978491422704 174.0551270579593 352.3994791526446
+ vertex -6.71141284642697 174.05491172955382 352.08881458232884
+ vertex -6.94945244490784 174.0555202446894 370.2781589528325
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -7.260440563745044 174.0553516358417 352.63786283772043
+ vertex -6.94978491422704 174.0551270579593 352.3994791526446
+ vertex -6.94945244490784 174.0555202446894 370.2781589528325
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -7.2601170264734565 174.0554212308488 370.0397868095053
+ vertex -7.260440563745044 174.0553516358417 352.63786283772043
+ vertex -6.94945244490784 174.0555202446894 370.2781589528325
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -7.622209125849128 174.0555701585896 352.7877201833663
+ vertex -7.260440563745044 174.0553516358417 352.63786283772043
+ vertex -7.2601170264734565 174.0554212308488 370.0397868095053
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -7.621891218162192 174.05531141908884 369.8899429143115
+ vertex -7.622209125849128 174.0555701585896 352.7877201833663
+ vertex -7.2601170264734565 174.0554212308488 370.0397868095053
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -8.01043667088272 174.05576773423874 352.83883865912713
+ vertex -7.622209125849128 174.0555701585896 352.7877201833663
+ vertex -7.621891218162192 174.05531141908884 369.8899429143115
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -8.010120706670465 174.05519829289952 369.83883888107977
+ vertex -8.01043667088272 174.05576773423874 352.83883865912713
+ vertex -7.621891218162192 174.05531141908884 369.8899429143115
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -8.398666133228108 174.05593089833525 352.7877346253573
+ vertex -8.01043667088272 174.05576773423874 352.83883865912713
+ vertex -8.010120706670465 174.05519829289952 369.83883888107977
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -8.398348293936047 174.05508956164377 369.88995736522145
+ vertex -8.398666133228108 174.05593089833525 352.7877346253573
+ vertex -8.010120706670465 174.05519829289952 369.83883888107977
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -8.76044031660597 174.05604853151547 352.6378907375048
+ vertex -8.398666133228108 174.05593089833525 352.7877346253573
+ vertex -8.398348293936047 174.05508956164377 369.88995736522145
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -8.760116911463216 174.05499263517694 370.03981472651947
+ vertex -8.76044031660597 174.05604853151547 352.6378907375048
+ vertex -8.398348293936047 174.05508956164377 369.88995736522145
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -9.071104908279224 174.05611261727262 352.3995186088979
+ vertex -8.76044031660597 174.05604853151547 352.6378907375048
+ vertex -8.760116911463216 174.05499263517694 370.03981472651947
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -9.070772625818417 174.05491411887752 370.2781984334526
+ vertex -9.071104908279224 174.05611261727262 352.3995186088979
+ vertex -8.760116911463216 174.05499263517694 370.03981472651947
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -9.309488629722841 174.05611878826838 352.0888629061727
+ vertex -9.071104908279224 174.05611261727262 352.3995186088979
+ vertex -9.070772625818417 174.05491411887752 370.2781984334526
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -9.309144763451181 174.0548593635017 370.5888630303408
+ vertex -9.309488629722841 174.05611878826838 352.0888629061727
+ vertex -9.070772625818417 174.05491411887752 370.2781984334526
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -9.45934602426816 174.05606662395937 351.72709430208715
+ vertex -9.309488629722841 174.05611878826838 352.0888629061727
+ vertex -9.309144763451181 174.0548593635017 370.5888630303408
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -9.458988657110387 174.05483210053774 370.9506372383038
+ vertex -9.45934602426816 174.05606662395937 351.72709430208715
+ vertex -9.309144763451181 174.0548593635017 370.5888630303408
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -9.510464558128016 174.0559596792572 351.3388667291587
+ vertex -9.45934602426816 174.05606662395937 351.72709430208715
+ vertex -9.458988657110387 174.05483210053774 370.9506372383038
+ endloop
+endfacet
+facet normal -0.00046459085439493953 -0.9999998354135803 0.00033664246695197877
+ outer loop
+ vertex -9.51009269307189 174.0548341879116 371.3388667429291
+ vertex -9.510464558128016 174.0559596792572 351.3388667291587
+ vertex -9.458988657110387 174.05483210053774 370.9506372383038
+ endloop
+endfacet
+facet normal -0.9999999996540453 -1.8599859246792854e-05 1.859985924480163e-05
+ outer loop
+ vertex -11.498956780668024 184.04071436533403 345.08890636015917
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex -11.498352285242461 184.040714365334 377.58890635453747
+ endloop
+endfacet
+facet normal -0.9999999996540453 -1.8599859246792854e-05 1.859985924480163e-05
+ outer loop
+ vertex -11.498166286650022 174.0407143670638 377.58890635107787
+ vertex -11.498352285242461 184.040714365334 377.58890635453747
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex 6.501985618453139 182.04098221396393 345.08857154516414
+ vertex 8.002004217793587 181.04101011492224 345.08854364502935
+ vertex 6.5020488609965295 181.04098221596362 345.0885715439878
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex -11.498956780668024 184.04071436533403 345.08890636015917
+ vertex -3.9979690906256034 184.04085388264915 345.0887668428439
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex -3.997969090625584 182.04038513132514 345.0887668428439
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex -3.9979690906256034 184.04085388264915 345.0887668428439
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex -3.997969090625609 181.04031816812224 345.0887668428439
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex -3.997969090625584 182.04038513132514 345.0887668428439
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex -2.497969090885266 181.0404130319375 345.08873894305503
+ vertex -3.997969090625609 181.04031816812224 345.0887668428439
+ vertex -3.997969090625584 182.04038513132514 345.0887668428439
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex -3.9979678692461733 179.5403019724304 345.08876684282114
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex -3.997969090625609 181.04031816812224 345.0887668428439
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex -3.9979251828280624 179.4743209966488 345.0887668420272
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex -3.9979678692461733 179.5403019724304 345.08876684282114
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex -3.963810010340058 179.3471710862956 345.08876620748975
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex -3.9979251828280624 179.4743209966488 345.0887668420272
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex -3.8979484657891326 179.23318336044383 345.0887649824743
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex -3.963810010340058 179.3471710862956 345.08876620748975
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex -3.8048289045948125 179.14012589423578 345.08876325046356
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex -3.8979484657891326 179.23318336044383 345.0887649824743
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex -3.690797270964837 179.07434040020956 345.0887611294913
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex -3.8048289045948125 179.14012589423578 345.08876325046356
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex -3.563624632285218 179.04031005106702 345.0887587640981
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex -3.690797270964837 179.07434040020956 345.0887611294913
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex 7.565833216425247 179.04051705741657 345.0885517577485
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex -3.563624632285218 179.04031005106702 345.0887587640981
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex -2.998780084945813 174.5408724657808 345.088748258069
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex 7.565833216425247 179.04051705741657 345.0885517577485
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex -2.998770785016191 174.04087246586732 345.088748257896
+ vertex -11.498770782075585 174.0407143670637 345.08890635669957
+ vertex -2.998780084945813 174.5408724657808 345.088748258069
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex 8.001948416970317 184.04107707942603 345.0885436460672
+ vertex 15.501043209991199 184.0412165615337 345.0884041639595
+ vertex 8.00198561668884 182.0410770777788 345.0885436453753
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex 15.501229208583638 174.0412165632634 345.0884041605
+ vertex 8.00198561668884 182.0410770777788 345.0885436453753
+ vertex 15.501043209991199 184.0412165615337 345.0884041639595
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex 8.002004217793587 181.04101011492224 345.08854364502935
+ vertex 8.00198561668884 182.0410770777788 345.0885436453753
+ vertex 15.501229208583638 174.0412165632634 345.0884041605
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex 6.501985618453139 182.04098221396393 345.08857154516414
+ vertex 8.00198561668884 182.0410770777788 345.0885436453753
+ vertex 8.002004217793587 181.04101011492224 345.08854364502935
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex 8.001506830763631 179.4727337756255 345.0885436542806
+ vertex 8.002004217793587 181.04101011492224 345.08854364502935
+ vertex 15.501229208583638 174.0412165632634 345.0884041605
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex 7.9669443457878275 179.3457698285498 345.088544297138
+ vertex 8.001506830763631 179.4727337756255 345.0885436542806
+ vertex 15.501229208583638 174.0412165632634 345.0884041605
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex 7.900698861389667 179.23207750242128 345.0885455292947
+ vertex 7.9669443457878275 179.3457698285498 345.088544297138
+ vertex 15.501229208583638 174.0412165632634 345.0884041605
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex 7.807284897855701 179.13940474137985 345.0885472667813
+ vertex 7.900698861389667 179.23207750242128 345.0885455292947
+ vertex 15.501229208583638 174.0412165632634 345.0884041605
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex 7.693068462426626 179.07406704094205 345.0885493911909
+ vertex 7.807284897855701 179.13940474137985 345.0885472667813
+ vertex 15.501229208583638 174.0412165632634 345.0884041605
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex 7.565833216425247 179.04051705741657 345.0885517577485
+ vertex 7.693068462426626 179.07406704094205 345.0885493911909
+ vertex 15.501229208583638 174.0412165632634 345.0884041605
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex 7.001219911594621 174.54105846437326 345.08856225947653
+ vertex 7.565833216425247 179.04051705741657 345.0885517577485
+ vertex 15.501229208583638 174.0412165632634 345.0884041605
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex -2.998780084945813 174.5408724657808 345.088748258069
+ vertex 7.565833216425247 179.04051705741657 345.0885517577485
+ vertex 7.001219911594621 174.54105846437326 345.08856225947653
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex 7.001229211524243 174.04105846445978 345.08856225930356
+ vertex 7.001219911594621 174.54105846437326 345.08856225947653
+ vertex 15.501229208583638 174.0412165632634 345.0884041605
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex -3.4979585694895516 179.04031127244673 345.08875754271855
+ vertex 7.502041426704885 179.04051587089833 345.08855294426684
+ vertex -3.563624632285218 179.04031005106702 345.0887587640981
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex 7.565833216425247 179.04051705741657 345.0885517577485
+ vertex -3.563624632285218 179.04031005106702 345.0887587640981
+ vertex 7.502041426704885 179.04051587089833 345.08855294426684
+ endloop
+endfacet
+facet normal -1.8599859248019008e-05 1.9234272811349932e-15 -0.9999999998270228
+ outer loop
+ vertex -3.997969090625584 182.04038513132514 345.0887668428439
+ vertex -2.4980323334283865 182.0404130299379 345.0887389442313
+ vertex -2.497969090885266 181.0404130319375 345.08873894305503
+ endloop
+endfacet
+facet normal 1.859985924379525e-05 -0.9999999998270226 -3.459554032128784e-10
+ outer loop
+ vertex 7.001219911594621 174.54105846437326 345.08856225947653
+ vertex 7.001824407020182 174.54105846437338 377.58856225385483
+ vertex -2.998780084945813 174.5408724657808 345.088748258069
+ endloop
+endfacet
+facet normal 1.859985924379525e-05 -0.9999999998270226 -3.459554032128784e-10
+ outer loop
+ vertex -2.9981755895202524 174.5408724657809 377.58874825244726
+ vertex -2.998780084945813 174.5408724657808 345.088748258069
+ vertex 7.001824407020182 174.54105846437338 377.58856225385483
+ endloop
+endfacet
+facet normal -0.9999999996540453 -1.8599859246792854e-05 1.859985924480163e-05
+ outer loop
+ vertex 7.001219911594621 174.54105846437326 345.08856225947653
+ vertex 7.001229211524243 174.04105846445978 345.08856225930356
+ vertex 7.001824407020182 174.54105846437338 377.58856225385483
+ endloop
+endfacet
+facet normal -0.9999999996540453 -1.8599859246792854e-05 1.859985924480163e-05
+ outer loop
+ vertex 7.001833706949803 174.04105846445987 377.58856225368186
+ vertex 7.001824407020182 174.54105846437338 377.58856225385483
+ vertex 7.001229211524243 174.04105846445978 345.08856225930356
+ endloop
+endfacet
+facet normal 0.9999999996540453 1.8599859246792854e-05 -1.859985924480163e-05
+ outer loop
+ vertex -2.998770785016191 174.04087246586732 345.088748257896
+ vertex -2.998780084945813 174.5408724657808 345.088748258069
+ vertex -2.998166289590631 174.0408724658674 377.58874825227434
+ endloop
+endfacet
+facet normal 0.9999999996540453 1.8599859246792854e-05 -1.859985924480163e-05
+ outer loop
+ vertex -2.9981755895202524 174.5408724657809 377.58874825244726
+ vertex -2.998166289590631 174.0408724658674 377.58874825227434
+ vertex -2.998780084945813 174.5408724657808 345.088748258069
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 13.48953521976654 174.05391695717623 351.3384390085888
+ vertex 13.48990675332894 174.05645304384143 371.33843888852095
+ vertex 13.43843118021452 174.053916006514 351.72666852683767
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 13.438788286845012 174.05640530373583 370.9502113273743
+ vertex 13.43843118021452 174.053916006514 351.72666852683767
+ vertex 13.48990675332894 174.05645304384143 371.33843888852095
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 13.288587275407153 174.05391321931327 352.088442746322
+ vertex 13.43843118021452 174.053916006514 351.72666852683767
+ vertex 13.438788286845012 174.05640530373583 370.9502113273743
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 13.288930967659452 174.0563050537634 370.58844273702243
+ vertex 13.288587275407153 174.05391321931327 352.088442746322
+ vertex 13.438788286845012 174.05640530373583 370.9502113273743
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 13.050215119828266 174.05390878551725 352.3991073518442
+ vertex 13.288587275407153 174.05391321931327 352.088442746322
+ vertex 13.288930967659452 174.0563050537634 370.58844273702243
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 13.050547324423915 174.05615912579395 370.27778704904705
+ vertex 13.050215119828266 174.05390878551725 352.3991073518442
+ vertex 13.288930967659452 174.0563050537634 370.58844273702243
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 12.73955938195192 174.0539030072818 352.6374910639353
+ vertex 13.050215119828266 174.05390878551725 352.3991073518442
+ vertex 13.050547324423915 174.05615912579395 370.27778704904705
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 12.739882808477267 174.0559774645776 370.0394149352009
+ vertex 12.73955938195192 174.0539030072818 352.6374910639353
+ vertex 13.050547324423915 174.05615912579395 370.27778704904705
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 12.377790736931564 174.05389627838406 352.787348426564
+ vertex 12.73955938195192 174.0539030072818 352.6374910639353
+ vertex 12.739882808477267 174.0559774645776 370.0394149352009
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 12.378108693183847 174.05577245002596 369.88957106111394
+ vertex 12.377790736931564 174.05389627838406 352.787348426564
+ vertex 12.739882808477267 174.0559774645776 370.0394149352009
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 11.989563120074324 174.05388905738735 352.8384669081183
+ vertex 12.377790736931564 174.05389627838406 352.787348426564
+ vertex 12.378108693183847 174.05577245002596 369.88957106111394
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 11.98987928664094 174.0555580535419 369.8384670391766
+ vertex 11.989563120074324 174.05388905738735 352.8384669081183
+ vertex 12.378108693183847 174.05577245002596 369.88957106111394
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 11.60133360189258 174.05388183639064 352.7873628685574
+ vertex 11.989563120074324 174.05388905738735 352.8384669081183
+ vertex 11.98987928664094 174.0555580535419 369.8384670391766
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 11.601651781325016 174.0553488858915 369.8895855240304
+ vertex 11.60133360189258 174.05388183639064 352.7873628685574
+ vertex 11.98987928664094 174.0555580535419 369.8384670391766
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 11.239883240147114 174.05515920150455 370.03944287541
+ vertex 11.60133360189258 174.05388183639064 352.7873628685574
+ vertex 11.601651781325016 174.0553488858915 369.8895855240304
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 11.239559382470832 174.05387510749293 352.6375189637241
+ vertex 11.60133360189258 174.05388183639064 352.7873628685574
+ vertex 11.239883240147114 174.05515920150455 370.03944287541
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 10.929227591337622 174.0550019270584 370.2778265624697
+ vertex 11.239559382470832 174.05387510749293 352.6375189637241
+ vertex 11.239883240147114 174.05515920150455 370.03944287541
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 10.928894777002451 174.05386932925745 352.3991468081039
+ vertex 11.239559382470832 174.05387510749293 352.6375189637241
+ vertex 10.929227591337622 174.0550019270584 370.2778265624697
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 10.690855503980274 174.05488778054684 370.58849113088417
+ vertex 10.928894777002451 174.05386932925745 352.3991468081039
+ vertex 10.929227591337622 174.0550019270584 370.2778265624697
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 10.690511064952624 174.05386489546143 352.0884910701739
+ vertex 10.928894777002451 174.05386932925745 352.3991468081039
+ vertex 10.690855503980274 174.05488778054684 370.58849113088417
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 10.541011641899885 174.05482454086592 370.95026530371337
+ vertex 10.690511064952624 174.05386489546143 352.0884910701739
+ vertex 10.690855503980274 174.05488778054684 370.58849113088417
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 10.540653702349815 174.05386210826074 351.72672242509094
+ vertex 10.690511064952624 174.05386489546143 352.0884910701739
+ vertex 10.541011641899885 174.05482454086592 370.95026530371337
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 10.489907616668633 174.05481651769531 371.33849476893914
+ vertex 10.540653702349815 174.05386210826074 351.72672242509094
+ vertex 10.541011641899885 174.05482454086592 370.95026530371337
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 10.489535220804365 174.05386115759848 351.33849480816656
+ vertex 10.540653702349815 174.05386210826074 351.72672242509094
+ vertex 10.489907616668633 174.05481651769531 371.33849476893914
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 15.501833704009199 174.04121656326348 377.5884041548783
+ vertex 13.48953521976654 174.05391695717623 351.3384390085888
+ vertex 15.501229208583638 174.0412165632634 345.0884041605
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 13.438416738221092 174.053916006514 350.9502113916644
+ vertex 15.501229208583638 174.0412165632634 345.0884041605
+ vertex 13.48953521976654 174.05391695717623 351.3384390085888
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 13.288559375618282 174.05391321931327 350.5884427465815
+ vertex 15.501229208583638 174.0412165632634 345.0884041605
+ vertex 13.438416738221092 174.053916006514 350.9502113916644
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 13.050175663568455 174.05390878551725 350.27778700865144
+ vertex 15.501229208583638 174.0412165632634 345.0884041605
+ vertex 13.288559375618282 174.05391321931327 350.5884427465815
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 7.001229211524243 174.04105846445978 345.08856225930356
+ vertex 15.501229208583638 174.0412165632634 345.0884041605
+ vertex 13.050175663568455 174.05390878551725 350.27778700865144
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 12.739511058100074 174.0539030072818 350.0394148530313
+ vertex 7.001229211524243 174.04105846445978 345.08856225930356
+ vertex 13.050175663568455 174.05390878551725 350.27778700865144
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 12.377736838678324 174.05389627838406 349.88957094819796
+ vertex 7.001229211524243 174.04105846445978 345.08856225930356
+ vertex 12.739511058100074 174.0539030072818 350.0394148530313
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 11.98950732049658 174.05388905738735 349.83846690863714
+ vertex 7.001229211524243 174.04105846445978 345.08856225930356
+ vertex 12.377736838678324 174.05389627838406 349.88957094819796
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 11.60127970363934 174.05388183639064 349.8895853901914
+ vertex 7.001229211524243 174.04105846445978 345.08856225930356
+ vertex 11.98950732049658 174.05388905738735 349.83846690863714
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 11.239511058618985 174.05387510749293 350.03944275282015
+ vertex 7.001229211524243 174.04105846445978 345.08856225930356
+ vertex 11.60127970363934 174.05388183639064 349.8895853901914
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 10.92885532074264 174.05386932925745 350.27782646491124
+ vertex 7.001229211524243 174.04105846445978 345.08856225930356
+ vertex 11.239511058618985 174.05387510749293 350.03944275282015
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 10.690483165163752 174.05386489546146 350.58849107043335
+ vertex 7.001229211524243 174.04105846445978 345.08856225930356
+ vertex 10.92885532074264 174.05386932925745 350.27782646491124
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 10.540639260356384 174.05386210826074 350.9502652899177
+ vertex 7.001229211524243 174.04105846445978 345.08856225930356
+ vertex 10.690483165163752 174.05386489546146 350.58849107043335
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 10.489535220804365 174.05386115759848 351.33849480816656
+ vertex 7.001229211524243 174.04105846445978 345.08856225930356
+ vertex 10.540639260356384 174.05386210826074 350.9502652899177
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 7.001833706949803 174.04105846445987 377.58856225368186
+ vertex 13.050586778659953 174.05626763447833 372.39910709499037
+ vertex 15.501833704009199 174.04121656326348 377.5884041548783
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 13.2889588660173 174.05638178098994 372.0884425265759
+ vertex 15.501833704009199 174.04121656326348 377.5884041548783
+ vertex 13.050586778659953 174.05626763447833 372.39910709499037
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 13.438802728097686 174.05644502067082 371.7266683537467
+ vertex 15.501833704009199 174.04121656326348 377.5884041548783
+ vertex 13.2889588660173 174.05638178098994 372.0884425265759
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 13.48990675332894 174.05645304384143 371.33843888852095
+ vertex 15.501833704009199 174.04121656326348 377.5884041548783
+ vertex 13.438802728097686 174.05644502067082 371.7266683537467
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 13.48953521976654 174.05391695717623 351.3384390085888
+ vertex 15.501833704009199 174.04121656326348 377.5884041548783
+ vertex 13.48990675332894 174.05645304384143 371.33843888852095
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 12.739931129850461 174.05611036003222 372.63749078205007
+ vertex 13.050586778659953 174.05626763447833 372.39910709499037
+ vertex 7.001833706949803 174.04105846445987 377.58856225368186
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 12.378162588672557 174.05592067564524 372.78734813342965
+ vertex 12.739931129850461 174.05611036003222 372.63749078205007
+ vertex 7.001833706949803 174.04105846445987 377.58856225368186
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 11.989935083356634 174.05571150799486 372.83846661828346
+ vertex 12.378162588672557 174.05592067564524 372.78734813342965
+ vertex 7.001833706949803 174.04105846445987 377.58856225368186
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 11.601705676813728 174.0554971115108 372.7873625963461
+ vertex 11.989935083356634 174.05571150799486 372.83846661828346
+ vertex 7.001833706949803 174.04105846445987 377.58856225368186
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 11.239931561520306 174.05529209695916 372.6375187222592
+ vertex 11.601705676813728 174.0554971115108 372.7873625963461
+ vertex 7.001833706949803 174.04105846445987 377.58856225368186
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 10.929267045573656 174.0551104357428 372.399146608413
+ vertex 11.239931561520306 174.05529209695916 372.6375187222592
+ vertex 7.001833706949803 174.04105846445987 377.58856225368186
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 10.69088340233812 174.05496450777335 372.0884909204376
+ vertex 10.929267045573656 174.0551104357428 372.399146608413
+ vertex 7.001833706949803 174.04105846445987 377.58856225368186
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 10.541026083152563 174.05486425780092 371.7267223300858
+ vertex 10.69088340233812 174.05496450777335 372.0884909204376
+ vertex 7.001833706949803 174.04105846445987 377.58856225368186
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 10.489907616668633 174.05481651769531 371.33849476893914
+ vertex 10.541026083152563 174.05486425780092 371.7267223300858
+ vertex 7.001833706949803 174.04105846445987 377.58856225368186
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 10.489535220804365 174.05386115759848 351.33849480816656
+ vertex 10.489907616668633 174.05481651769531 371.33849476893914
+ vertex 7.001833706949803 174.04105846445987 377.58856225368186
+ endloop
+endfacet
+facet normal 0.0005455097430317843 -0.9999998499018307 5.1141337947807885e-05
+ outer loop
+ vertex 7.001229211524243 174.04105846445978 345.08856225930356
+ vertex 10.489535220804365 174.05386115759848 351.33849480816656
+ vertex 7.001833706949803 174.04105846445987 377.58856225368186
+ endloop
+endfacet
+facet normal 1.8599859243795248e-05 -0.9999999998270226 -3.459555419907565e-10
+ outer loop
+ vertex 13.489460820329567 178.0539169564843 351.33843900997266
+ vertex 13.438356780777545 178.05391600582206 351.7266685282215
+ vertex 13.438342338784116 178.05391600582206 350.9502113930483
+ endloop
+endfacet
+facet normal 1.8599859243795248e-05 -0.9999999998270226 -3.459555419907565e-10
+ outer loop
+ vertex 13.288484976181307 178.05391321862135 350.5884427479653
+ vertex 13.438342338784116 178.05391600582206 350.9502113930483
+ vertex 13.438356780777545 178.05391600582206 351.7266685282215
+ endloop
+endfacet
+facet normal 1.8599859243795248e-05 -0.9999999998270226 -3.459555419907565e-10
+ outer loop
+ vertex 13.288512875970179 178.05391321862135 352.08844274770587
+ vertex 13.288484976181307 178.05391321862135 350.5884427479653
+ vertex 13.438356780777545 178.05391600582206 351.7266685282215
+ endloop
+endfacet
+facet normal 1.8599859243795248e-05 -0.9999999998270226 -3.459555419907565e-10
+ outer loop
+ vertex 13.050101264131477 178.05390878482535 350.27778701003524
+ vertex 13.288484976181307 178.05391321862135 350.5884427479653
+ vertex 13.288512875970179 178.05391321862135 352.08844274770587
+ endloop
+endfacet
+facet normal 1.8599859243795248e-05 -0.9999999998270226 -3.459555419907565e-10
+ outer loop
+ vertex 13.050140720391289 178.05390878482535 352.399107353228
+ vertex 13.050101264131477 178.05390878482535 350.27778701003524
+ vertex 13.288512875970179 178.05391321862135 352.08844274770587
+ endloop
+endfacet
+facet normal 1.8599859243795248e-05 -0.9999999998270226 -3.459555419907565e-10
+ outer loop
+ vertex 12.739436658663099 178.05390300658988 350.0394148544151
+ vertex 13.050101264131477 178.05390878482535 350.27778701003524
+ vertex 13.050140720391289 178.05390878482535 352.399107353228
+ endloop
+endfacet
+facet normal 1.8599859243795248e-05 -0.9999999998270226 -3.459555419907565e-10
+ outer loop
+ vertex 12.739484982514945 178.05390300658988 352.63749106531907
+ vertex 12.739436658663099 178.05390300658988 350.0394148544151
+ vertex 13.050140720391289 178.05390878482535 352.399107353228
+ endloop
+endfacet
+facet normal 1.8599859243795248e-05 -0.9999999998270226 -3.459555419907565e-10
+ outer loop
+ vertex 12.37766243924135 178.05389627769216 349.8895709495818
+ vertex 12.739436658663099 178.05390300658988 350.0394148544151
+ vertex 12.739484982514945 178.05390300658988 352.63749106531907
+ endloop
+endfacet
+facet normal 1.8599859243795248e-05 -0.9999999998270226 -3.459555419907565e-10
+ outer loop
+ vertex 12.377716337494588 178.05389627769216 352.78734842794785
+ vertex 12.37766243924135 178.05389627769216 349.8895709495818
+ vertex 12.739484982514945 178.05390300658988 352.63749106531907
+ endloop
+endfacet
+facet normal 1.8599859243795248e-05 -0.9999999998270226 -3.459555419907565e-10
+ outer loop
+ vertex 11.989432921059606 178.05388905669545 349.838466910021
+ vertex 12.37766243924135 178.05389627769216 349.8895709495818
+ vertex 12.377716337494588 178.05389627769216 352.78734842794785
+ endloop
+endfacet
+facet normal 1.8599859243795248e-05 -0.9999999998270226 -3.459555419907565e-10
+ outer loop
+ vertex 11.98948872063735 178.05388905669545 352.8384669095021
+ vertex 11.989432921059606 178.05388905669545 349.838466910021
+ vertex 12.377716337494588 178.05389627769216 352.78734842794785
+ endloop
+endfacet
+facet normal 1.8599859243795248e-05 -0.9999999998270226 -3.459555419907565e-10
+ outer loop
+ vertex 11.601205304202367 178.05388183569872 349.8895853915752
+ vertex 11.989432921059606 178.05388905669545 349.838466910021
+ vertex 11.98948872063735 178.05388905669545 352.8384669095021
+ endloop
+endfacet
+facet normal 1.8599859243795248e-05 -0.9999999998270226 -3.459555419907565e-10
+ outer loop
+ vertex 11.601259202455605 178.05388183569872 352.78736286994126
+ vertex 11.601205304202367 178.05388183569872 349.8895853915752
+ vertex 11.98948872063735 178.05388905669545 352.8384669095021
+ endloop
+endfacet
+facet normal 1.8599859243795248e-05 -0.9999999998270226 -3.459555419907565e-10
+ outer loop
+ vertex 11.23943665918201 178.053875106801 350.03944275420395
+ vertex 11.601205304202367 178.05388183569872 349.8895853915752
+ vertex 11.601259202455605 178.05388183569872 352.78736286994126
+ endloop
+endfacet
+facet normal 1.8599859243795248e-05 -0.9999999998270226 -3.459555419907565e-10
+ outer loop
+ vertex 11.239484983033856 178.053875106801 352.6375189651079
+ vertex 11.23943665918201 178.053875106801 350.03944275420395
+ vertex 11.601259202455605 178.05388183569872 352.78736286994126
+ endloop
+endfacet
+facet normal 1.8599859243795248e-05 -0.9999999998270226 -3.459555419907565e-10
+ outer loop
+ vertex 10.928780921305668 178.05386932856555 350.27782646629504
+ vertex 11.23943665918201 178.053875106801 350.03944275420395
+ vertex 11.239484983033856 178.053875106801 352.6375189651079
+ endloop
+endfacet
+facet normal 1.8599859243795248e-05 -0.9999999998270226 -3.459555419907565e-10
+ outer loop
+ vertex 10.928820377565476 178.05386932856555 352.3991468094878
+ vertex 10.928780921305668 178.05386932856555 350.27782646629504
+ vertex 11.239484983033856 178.053875106801 352.6375189651079
+ endloop
+endfacet
+facet normal 1.8599859243795248e-05 -0.9999999998270226 -3.459555419907565e-10
+ outer loop
+ vertex 10.690408765726776 178.0538648947695 350.58849107181715
+ vertex 10.928780921305668 178.05386932856555 350.27782646629504
+ vertex 10.928820377565476 178.05386932856555 352.3991468094878
+ endloop
+endfacet
+facet normal 1.8599859243795248e-05 -0.9999999998270226 -3.459555419907565e-10
+ outer loop
+ vertex 10.690436665515648 178.0538648947695 352.0884910715577
+ vertex 10.690408765726776 178.0538648947695 350.58849107181715
+ vertex 10.928820377565476 178.05386932856555 352.3991468094878
+ endloop
+endfacet
+facet normal 1.8599859243795248e-05 -0.9999999998270226 -3.459555419907565e-10
+ outer loop
+ vertex 10.540564860919412 178.05386210756882 350.9502652913015
+ vertex 10.690408765726776 178.0538648947695 350.58849107181715
+ vertex 10.690436665515648 178.0538648947695 352.0884910715577
+ endloop
+endfacet
+facet normal 1.8599859243795248e-05 -0.9999999998270226 -3.459555419907565e-10
+ outer loop
+ vertex 10.540579302912839 178.05386210756882 351.72672242647474
+ vertex 10.540564860919412 178.05386210756882 350.9502652913015
+ vertex 10.690436665515648 178.0538648947695 352.0884910715577
+ endloop
+endfacet
+facet normal 1.8599859243795248e-05 -0.9999999998270226 -3.459555419907565e-10
+ outer loop
+ vertex 10.48946082136739 178.05386115690658 351.3384948095504
+ vertex 10.540564860919412 178.05386210756882 350.9502652913015
+ vertex 10.540579302912839 178.05386210756882 351.72672242647474
+ endloop
+endfacet
+facet normal 0.7933646628936933 1.4756260461916838e-05 0.6087466726429224
+ outer loop
+ vertex 10.92885532074264 174.05386932925745 350.27782646491124
+ vertex 10.928780921305668 178.05386932856555 350.27782646629504
+ vertex 10.690483165163752 174.05386489546146 350.58849107043335
+ endloop
+endfacet
+facet normal 0.7933646628936933 1.4756260461916838e-05 0.6087466726429224
+ outer loop
+ vertex 10.690408765726776 178.0538648947695 350.58849107181715
+ vertex 10.690483165163752 174.05386489546146 350.58849107043335
+ vertex 10.928780921305668 178.05386932856555 350.27782646629504
+ endloop
+endfacet
+facet normal 0.6087761850585447 1.1322876893820822e-05 0.7933420172771368
+ outer loop
+ vertex 11.23943665918201 178.053875106801 350.03944275420395
+ vertex 10.928780921305668 178.05386932856555 350.27782646629504
+ vertex 11.239511058618985 174.05387510749293 350.03944275282015
+ endloop
+endfacet
+facet normal 0.6087761850585447 1.1322876893820822e-05 0.7933420172771368
+ outer loop
+ vertex 10.92885532074264 174.05386932925745 350.27782646491124
+ vertex 11.239511058618985 174.05387510749293 350.03944275282015
+ vertex 10.928780921305668 178.05386932856555 350.27782646629504
+ endloop
+endfacet
+facet normal 0.38270061626199137 7.117857977351976e-06 0.9238724144934886
+ outer loop
+ vertex 11.601205304202367 178.05388183569872 349.8895853915752
+ vertex 11.23943665918201 178.053875106801 350.03944275420395
+ vertex 11.60127970363934 174.05388183639064 349.8895853901914
+ endloop
+endfacet
+facet normal 0.38270061626199137 7.117857977351976e-06 0.9238724144934886
+ outer loop
+ vertex 11.239511058618985 174.05387510749293 350.03944275282015
+ vertex 11.60127970363934 174.05388183639064 349.8895853901914
+ vertex 11.23943665918201 178.053875106801 350.03944275420395
+ endloop
+endfacet
+facet normal 0.13054463290975568 2.4277688025412252e-06 0.9914424334335116
+ outer loop
+ vertex 11.989432921059606 178.05388905669545 349.838466910021
+ vertex 11.601205304202367 178.05388183569872 349.8895853915752
+ vertex 11.98950732049658 174.05388905738735 349.83846690863714
+ endloop
+endfacet
+facet normal 0.13054463290975568 2.4277688025412252e-06 0.9914424334335116
+ outer loop
+ vertex 11.60127970363934 174.05388183639064 349.8895853901914
+ vertex 11.98950732049658 174.05388905738735 349.83846690863714
+ vertex 11.601205304202367 178.05388183569872 349.8895853915752
+ endloop
+endfacet
+facet normal -0.13050775144000823 -2.4277688040838493e-06 0.9914472889711178
+ outer loop
+ vertex 12.37766243924135 178.05389627769216 349.8895709495818
+ vertex 11.989432921059606 178.05388905669545 349.838466910021
+ vertex 12.377736838678324 174.05389627838406 349.88957094819796
+ endloop
+endfacet
+facet normal -0.13050775144000823 -2.4277688040838493e-06 0.9914472889711178
+ outer loop
+ vertex 11.98950732049658 174.05388905738735 349.83846690863714
+ vertex 12.377736838678324 174.05389627838406 349.88957094819796
+ vertex 11.989432921059606 178.05388905669545 349.838466910021
+ endloop
+endfacet
+facet normal -0.3826662482034576 -7.11785797878947e-06 0.923886650209443
+ outer loop
+ vertex 12.739436658663099 178.05390300658988 350.0394148544151
+ vertex 12.37766243924135 178.05389627769216 349.8895709495818
+ vertex 12.739511058100074 174.0539030072818 350.0394148530313
+ endloop
+endfacet
+facet normal -0.3826662482034576 -7.11785797878947e-06 0.923886650209443
+ outer loop
+ vertex 12.377736838678324 174.05389627838406 349.88957094819796
+ vertex 12.739511058100074 174.0539030072818 350.0394148530313
+ vertex 12.37766243924135 178.05389627769216 349.8895709495818
+ endloop
+endfacet
+facet normal -0.6087466725376544 -1.1322876895055904e-05 0.7933646630308954
+ outer loop
+ vertex 13.050101264131477 178.05390878482535 350.27778701003524
+ vertex 12.739436658663099 178.05390300658988 350.0394148544151
+ vertex 13.050175663568455 174.05390878551725 350.27778700865144
+ endloop
+endfacet
+facet normal -0.6087466725376544 -1.1322876895055904e-05 0.7933646630308954
+ outer loop
+ vertex 12.739511058100074 174.0539030072818 350.0394148530313
+ vertex 13.050175663568455 174.05390878551725 350.27778700865144
+ vertex 12.739436658663099 178.05390300658988 350.0394148544151
+ endloop
+endfacet
+facet normal -0.7933420171398816 -1.4756260462863634e-05 0.6087761851638718
+ outer loop
+ vertex 13.050101264131477 178.05390878482535 350.27778701003524
+ vertex 13.050175663568455 174.05390878551725 350.27778700865144
+ vertex 13.288484976181307 178.05391321862135 350.5884427479653
+ endloop
+endfacet
+facet normal -0.7933420171398816 -1.4756260462863634e-05 0.6087761851638718
+ outer loop
+ vertex 13.288559375618282 174.05391321931327 350.5884427465815
+ vertex 13.288484976181307 178.05391321862135 350.5884427479653
+ vertex 13.050175663568455 174.05390878551725 350.27778700865144
+ endloop
+endfacet
+facet normal -0.9238724143337058 -1.7184029266000766e-05 0.38270061632811414
+ outer loop
+ vertex 13.288484976181307 178.05391321862135 350.5884427479653
+ vertex 13.288559375618282 174.05391321931327 350.5884427465815
+ vertex 13.438342338784116 178.05391600582206 350.9502113930483
+ endloop
+endfacet
+facet normal -0.9238724143337058 -1.7184029266000766e-05 0.38270061632811414
+ outer loop
+ vertex 13.438416738221092 174.053916006514 350.9502113916644
+ vertex 13.438342338784116 178.05391600582206 350.9502113930483
+ vertex 13.288559375618282 174.05391321931327 350.5884427465815
+ endloop
+endfacet
+facet normal -0.9914424332620053 -1.8440734872610345e-05 0.13054463293239457
+ outer loop
+ vertex 13.438342338784116 178.05391600582206 350.9502113930483
+ vertex 13.438416738221092 174.053916006514 350.9502113916644
+ vertex 13.489460820329567 178.0539169564843 351.33843900997266
+ endloop
+endfacet
+facet normal -0.9914424332620053 -1.8440734872610345e-05 0.13054463293239457
+ outer loop
+ vertex 13.48953521976654 174.05391695717623 351.3384390085888
+ vertex 13.489460820329567 178.0539169564843 351.33843900997266
+ vertex 13.438416738221092 174.053916006514 350.9502113916644
+ endloop
+endfacet
+facet normal -0.9914472887996122 -1.844073487240726e-05 -0.1305077514626535
+ outer loop
+ vertex 13.489460820329567 178.0539169564843 351.33843900997266
+ vertex 13.48953521976654 174.05391695717623 351.3384390085888
+ vertex 13.438356780777545 178.05391600582206 351.7266685282215
+ endloop
+endfacet
+facet normal -0.9914472887996122 -1.844073487240726e-05 -0.1305077514626535
+ outer loop
+ vertex 13.43843118021452 174.053916006514 351.72666852683767
+ vertex 13.438356780777545 178.05391600582206 351.7266685282215
+ vertex 13.48953521976654 174.05391695717623 351.3384390085888
+ endloop
+endfacet
+facet normal -0.923886650049663 -1.7184029265405336e-05 -0.3826662482695864
+ outer loop
+ vertex 13.438356780777545 178.05391600582206 351.7266685282215
+ vertex 13.43843118021452 174.053916006514 351.72666852683767
+ vertex 13.288512875970179 178.05391321862135 352.08844274770587
+ endloop
+endfacet
+facet normal -0.923886650049663 -1.7184029265405336e-05 -0.3826662482695864
+ outer loop
+ vertex 13.288587275407153 174.05391321931327 352.088442746322
+ vertex 13.288512875970179 178.05391321862135 352.08844274770587
+ vertex 13.43843118021452 174.053916006514 351.72666852683767
+ endloop
+endfacet
+facet normal -0.7933646628936933 -1.4756260461916838e-05 -0.6087466726429224
+ outer loop
+ vertex 13.288512875970179 178.05391321862135 352.08844274770587
+ vertex 13.288587275407153 174.05391321931327 352.088442746322
+ vertex 13.050140720391289 178.05390878482535 352.399107353228
+ endloop
+endfacet
+facet normal -0.7933646628936933 -1.4756260461916838e-05 -0.6087466726429224
+ outer loop
+ vertex 13.050215119828266 174.05390878551725 352.3991073518442
+ vertex 13.050140720391289 178.05390878482535 352.399107353228
+ vertex 13.288587275407153 174.05391321931327 352.088442746322
+ endloop
+endfacet
+facet normal -0.6087761850585447 -1.1322876893820822e-05 -0.7933420172771368
+ outer loop
+ vertex 12.739484982514945 178.05390300658988 352.63749106531907
+ vertex 13.050140720391289 178.05390878482535 352.399107353228
+ vertex 12.73955938195192 174.0539030072818 352.6374910639353
+ endloop
+endfacet
+facet normal -0.6087761850585447 -1.1322876893820822e-05 -0.7933420172771368
+ outer loop
+ vertex 13.050215119828266 174.05390878551725 352.3991073518442
+ vertex 12.73955938195192 174.0539030072818 352.6374910639353
+ vertex 13.050140720391289 178.05390878482535 352.399107353228
+ endloop
+endfacet
+facet normal -0.38270061626199137 -7.117857977351976e-06 -0.9238724144934886
+ outer loop
+ vertex 12.377716337494588 178.05389627769216 352.78734842794785
+ vertex 12.739484982514945 178.05390300658988 352.63749106531907
+ vertex 12.377790736931564 174.05389627838406 352.787348426564
+ endloop
+endfacet
+facet normal -0.38270061626199137 -7.117857977351976e-06 -0.9238724144934886
+ outer loop
+ vertex 12.73955938195192 174.0539030072818 352.6374910639353
+ vertex 12.377790736931564 174.05389627838406 352.787348426564
+ vertex 12.739484982514945 178.05390300658988 352.63749106531907
+ endloop
+endfacet
+facet normal -0.13054463290975568 -2.4277688025412252e-06 -0.9914424334335116
+ outer loop
+ vertex 11.98948872063735 178.05388905669545 352.8384669095021
+ vertex 12.377716337494588 178.05389627769216 352.78734842794785
+ vertex 11.989563120074324 174.05388905738735 352.8384669081183
+ endloop
+endfacet
+facet normal -0.13054463290975568 -2.4277688025412252e-06 -0.9914424334335116
+ outer loop
+ vertex 12.377790736931564 174.05389627838406 352.787348426564
+ vertex 11.989563120074324 174.05388905738735 352.8384669081183
+ vertex 12.377716337494588 178.05389627769216 352.78734842794785
+ endloop
+endfacet
+facet normal 0.13050775144000823 2.4277688040838493e-06 -0.9914472889711178
+ outer loop
+ vertex 11.601259202455605 178.05388183569872 352.78736286994126
+ vertex 11.98948872063735 178.05388905669545 352.8384669095021
+ vertex 11.60133360189258 174.05388183639064 352.7873628685574
+ endloop
+endfacet
+facet normal 0.13050775144000823 2.4277688040838493e-06 -0.9914472889711178
+ outer loop
+ vertex 11.989563120074324 174.05388905738735 352.8384669081183
+ vertex 11.60133360189258 174.05388183639064 352.7873628685574
+ vertex 11.98948872063735 178.05388905669545 352.8384669095021
+ endloop
+endfacet
+facet normal 0.3826662482034576 7.11785797878947e-06 -0.923886650209443
+ outer loop
+ vertex 11.239484983033856 178.053875106801 352.6375189651079
+ vertex 11.601259202455605 178.05388183569872 352.78736286994126
+ vertex 11.239559382470832 174.05387510749293 352.6375189637241
+ endloop
+endfacet
+facet normal 0.3826662482034576 7.11785797878947e-06 -0.923886650209443
+ outer loop
+ vertex 11.60133360189258 174.05388183639064 352.7873628685574
+ vertex 11.239559382470832 174.05387510749293 352.6375189637241
+ vertex 11.601259202455605 178.05388183569872 352.78736286994126
+ endloop
+endfacet
+facet normal 0.6087466725376544 1.1322876895055904e-05 -0.7933646630308954
+ outer loop
+ vertex 10.928820377565476 178.05386932856555 352.3991468094878
+ vertex 11.239484983033856 178.053875106801 352.6375189651079
+ vertex 10.928894777002451 174.05386932925745 352.3991468081039
+ endloop
+endfacet
+facet normal 0.6087466725376544 1.1322876895055904e-05 -0.7933646630308954
+ outer loop
+ vertex 11.239559382470832 174.05387510749293 352.6375189637241
+ vertex 10.928894777002451 174.05386932925745 352.3991468081039
+ vertex 11.239484983033856 178.053875106801 352.6375189651079
+ endloop
+endfacet
+facet normal 0.7933420171398816 1.4756260462863634e-05 -0.6087761851638718
+ outer loop
+ vertex 10.690511064952624 174.05386489546143 352.0884910701739
+ vertex 10.690436665515648 178.0538648947695 352.0884910715577
+ vertex 10.928894777002451 174.05386932925745 352.3991468081039
+ endloop
+endfacet
+facet normal 0.7933420171398816 1.4756260462863634e-05 -0.6087761851638718
+ outer loop
+ vertex 10.928820377565476 178.05386932856555 352.3991468094878
+ vertex 10.928894777002451 174.05386932925745 352.3991468081039
+ vertex 10.690436665515648 178.0538648947695 352.0884910715577
+ endloop
+endfacet
+facet normal 0.9238724143337058 1.7184029266000766e-05 -0.38270061632811414
+ outer loop
+ vertex 10.540653702349815 174.05386210826074 351.72672242509094
+ vertex 10.540579302912839 178.05386210756882 351.72672242647474
+ vertex 10.690511064952624 174.05386489546143 352.0884910701739
+ endloop
+endfacet
+facet normal 0.9238724143337058 1.7184029266000766e-05 -0.38270061632811414
+ outer loop
+ vertex 10.690436665515648 178.0538648947695 352.0884910715577
+ vertex 10.690511064952624 174.05386489546143 352.0884910701739
+ vertex 10.540579302912839 178.05386210756882 351.72672242647474
+ endloop
+endfacet
+facet normal 0.9914424332620053 1.8440734872610345e-05 -0.13054463293239457
+ outer loop
+ vertex 10.489535220804365 174.05386115759848 351.33849480816656
+ vertex 10.48946082136739 178.05386115690658 351.3384948095504
+ vertex 10.540653702349815 174.05386210826074 351.72672242509094
+ endloop
+endfacet
+facet normal 0.9914424332620053 1.8440734872610345e-05 -0.13054463293239457
+ outer loop
+ vertex 10.540579302912839 178.05386210756882 351.72672242647474
+ vertex 10.540653702349815 174.05386210826074 351.72672242509094
+ vertex 10.48946082136739 178.05386115690658 351.3384948095504
+ endloop
+endfacet
+facet normal 0.9914472887996122 1.844073487240726e-05 0.1305077514626535
+ outer loop
+ vertex 10.540639260356384 174.05386210826074 350.9502652899177
+ vertex 10.540564860919412 178.05386210756882 350.9502652913015
+ vertex 10.489535220804365 174.05386115759848 351.33849480816656
+ endloop
+endfacet
+facet normal 0.9914472887996122 1.844073487240726e-05 0.1305077514626535
+ outer loop
+ vertex 10.48946082136739 178.05386115690658 351.3384948095504
+ vertex 10.489535220804365 174.05386115759848 351.33849480816656
+ vertex 10.540564860919412 178.05386210756882 350.9502652913015
+ endloop
+endfacet
+facet normal 0.923886650049663 1.7184029265405336e-05 0.3826662482695864
+ outer loop
+ vertex 10.690483165163752 174.05386489546146 350.58849107043335
+ vertex 10.690408765726776 178.0538648947695 350.58849107181715
+ vertex 10.540639260356384 174.05386210826074 350.9502652899177
+ endloop
+endfacet
+facet normal 0.923886650049663 1.7184029265405336e-05 0.3826662482695864
+ outer loop
+ vertex 10.540564860919412 178.05386210756882 350.9502652913015
+ vertex 10.540639260356384 174.05386210826074 350.9502652899177
+ vertex 10.690408765726776 178.0538648947695 350.58849107181715
+ endloop
+endfacet
+facet normal 0.0005455097430862471 -0.9999998499018307 5.114133794304526e-05
+ outer loop
+ vertex 13.487724714356615 178.05645244344873 371.3382343231691
+ vertex 13.436620689125364 178.05644442027813 371.7264637883949
+ vertex 13.436606247872689 178.0564047033431 370.9500067620225
+ endloop
+endfacet
+facet normal 0.0005455097430862471 -0.9999998499018307 5.114133794304526e-05
+ outer loop
+ vertex 13.28674892868713 178.0563044533707 370.5882381716707
+ vertex 13.436606247872689 178.0564047033431 370.9500067620225
+ vertex 13.436620689125364 178.05644442027813 371.7264637883949
+ endloop
+endfacet
+facet normal 0.0005455097430862471 -0.9999998499018307 5.114133794304526e-05
+ outer loop
+ vertex 13.286776827044978 178.0563811805972 372.0882379612241
+ vertex 13.28674892868713 178.0563044533707 370.5882381716707
+ vertex 13.436620689125364 178.05644442027813 371.7264637883949
+ endloop
+endfacet
+facet normal 0.0005455097430862471 -0.9999998499018307 5.114133794304526e-05
+ outer loop
+ vertex 13.048365285451593 178.05615852540126 370.2775824836953
+ vertex 13.28674892868713 178.0563044533707 370.5882381716707
+ vertex 13.286776827044978 178.0563811805972 372.0882379612241
+ endloop
+endfacet
+facet normal 0.0005455097430862471 -0.9999998499018307 5.114133794304526e-05
+ outer loop
+ vertex 13.048404739687628 178.0562670340856 372.3989025296386
+ vertex 13.048365285451593 178.05615852540126 370.2775824836953
+ vertex 13.286776827044978 178.0563811805972 372.0882379612241
+ endloop
+endfacet
+facet normal 0.0005455097430862471 -0.9999998499018307 5.114133794304526e-05
+ outer loop
+ vertex 12.737700769504942 178.05597686418488 370.0392103698491
+ vertex 13.048365285451593 178.05615852540126 370.2775824836953
+ vertex 13.048404739687628 178.0562670340856 372.3989025296386
+ endloop
+endfacet
+facet normal 0.0005455097430862471 -0.9999998499018307 5.114133794304526e-05
+ outer loop
+ vertex 12.737749090878136 178.0561097596395 372.63728621669827
+ vertex 12.737700769504942 178.05597686418488 370.0392103698491
+ vertex 13.048404739687628 178.0562670340856 372.3989025296386
+ endloop
+endfacet
+facet normal 0.0005455097430862471 -0.9999998499018307 5.114133794304526e-05
+ outer loop
+ vertex 12.375926654211524 178.05577184963326 369.8893664957622
+ vertex 12.737700769504942 178.05597686418488 370.0392103698491
+ vertex 12.737749090878136 178.0561097596395 372.63728621669827
+ endloop
+endfacet
+facet normal 0.0005455097430862471 -0.9999998499018307 5.114133794304526e-05
+ outer loop
+ vertex 12.375980549700234 178.05592007525252 372.78714356807785
+ vertex 12.375926654211524 178.05577184963326 369.8893664957622
+ vertex 12.737749090878136 178.0561097596395 372.63728621669827
+ endloop
+endfacet
+facet normal 0.0005455097430862471 -0.9999998499018307 5.114133794304526e-05
+ outer loop
+ vertex 11.987697247668617 178.05555745314916 369.8382624738248
+ vertex 12.375926654211524 178.05577184963326 369.8893664957622
+ vertex 12.375980549700234 178.05592007525252 372.78714356807785
+ endloop
+endfacet
+facet normal 0.0005455097430862471 -0.9999998499018307 5.114133794304526e-05
+ outer loop
+ vertex 11.987753044384311 178.05571090760216 372.8382620529317
+ vertex 11.987697247668617 178.05555745314916 369.8382624738248
+ vertex 12.375980549700234 178.05592007525252 372.78714356807785
+ endloop
+endfacet
+facet normal 0.0005455097430862471 -0.9999998499018307 5.114133794304526e-05
+ outer loop
+ vertex 11.599469742352692 178.0553482854988 369.88938095867866
+ vertex 11.987697247668617 178.05555745314916 369.8382624738248
+ vertex 11.987753044384311 178.05571090760216 372.8382620529317
+ endloop
+endfacet
+facet normal 0.0005455097430862471 -0.9999998499018307 5.114133794304526e-05
+ outer loop
+ vertex 11.599523637841404 178.05549651111806 372.78715803099436
+ vertex 11.599469742352692 178.0553482854988 369.88938095867866
+ vertex 11.987753044384311 178.05571090760216 372.8382620529317
+ endloop
+endfacet
+facet normal 0.0005455097430862471 -0.9999998499018307 5.114133794304526e-05
+ outer loop
+ vertex 11.237701201174792 178.05515860111183 370.0392383100582
+ vertex 11.599469742352692 178.0553482854988 369.88938095867866
+ vertex 11.599523637841404 178.05549651111806 372.78715803099436
+ endloop
+endfacet
+facet normal 0.0005455097430862471 -0.9999998499018307 5.114133794304526e-05
+ outer loop
+ vertex 11.237749522547983 178.05529149656644 372.6373141569074
+ vertex 11.237701201174792 178.05515860111183 370.0392383100582
+ vertex 11.599523637841404 178.05549651111806 372.78715803099436
+ endloop
+endfacet
+facet normal 0.0005455097430862471 -0.9999998499018307 5.114133794304526e-05
+ outer loop
+ vertex 10.927045552365298 178.05500132666572 370.27762199711793
+ vertex 11.237701201174792 178.05515860111183 370.0392383100582
+ vertex 11.237749522547983 178.05529149656644 372.6373141569074
+ endloop
+endfacet
+facet normal 0.0005455097430862471 -0.9999998499018307 5.114133794304526e-05
+ outer loop
+ vertex 10.927085006601333 178.05510983535007 372.3989420430612
+ vertex 10.927045552365298 178.05500132666572 370.27762199711793
+ vertex 11.237749522547983 178.05529149656644 372.6373141569074
+ endloop
+endfacet
+facet normal 0.0005455097430862471 -0.9999998499018307 5.114133794304526e-05
+ outer loop
+ vertex 10.68867346500795 178.0548871801541 370.58828656553237
+ vertex 10.927045552365298 178.05500132666572 370.27762199711793
+ vertex 10.927085006601333 178.05510983535007 372.3989420430612
+ endloop
+endfacet
+facet normal 0.0005455097430862471 -0.9999998499018307 5.114133794304526e-05
+ outer loop
+ vertex 10.688701363365798 178.05496390738062 372.08828635508587
+ vertex 10.68867346500795 178.0548871801541 370.58828656553237
+ vertex 10.927085006601333 178.05510983535007 372.3989420430612
+ endloop
+endfacet
+facet normal 0.0005455097430862471 -0.9999998499018307 5.114133794304526e-05
+ outer loop
+ vertex 10.538829602927564 178.0548239404732 370.9500607383616
+ vertex 10.68867346500795 178.0548871801541 370.58828656553237
+ vertex 10.688701363365798 178.05496390738062 372.08828635508587
+ endloop
+endfacet
+facet normal 0.0005455097430862471 -0.9999998499018307 5.114133794304526e-05
+ outer loop
+ vertex 10.53884404418024 178.05486365740822 371.726517764734
+ vertex 10.538829602927564 178.0548239404732 370.9500607383616
+ vertex 10.688701363365798 178.05496390738062 372.08828635508587
+ endloop
+endfacet
+facet normal 0.0005455097430862471 -0.9999998499018307 5.114133794304526e-05
+ outer loop
+ vertex 10.48772557769631 178.05481591730262 371.33829020358735
+ vertex 10.538829602927564 178.0548239404732 370.9500607383616
+ vertex 10.53884404418024 178.05486365740822 371.726517764734
+ endloop
+endfacet
+facet normal 0.1305077329848326 2.0489301995151305e-05 -0.9914472911916944
+ outer loop
+ vertex 11.987753044384311 178.05571090760216 372.8382620529317
+ vertex 11.989935083356634 174.05571150799486 372.83846661828346
+ vertex 11.599523637841404 178.05549651111806 372.78715803099436
+ endloop
+endfacet
+facet normal 0.1305077329848326 2.0489301995151305e-05 -0.9914472911916944
+ outer loop
+ vertex 11.601705676813728 174.0554971115108 372.7873625963461
+ vertex 11.599523637841404 178.05549651111806 372.78715803099436
+ vertex 11.989935083356634 174.05571150799486 372.83846661828346
+ endloop
+endfacet
+facet normal 0.3826661922090187 0.00016149936057536487 -0.9238866593139048
+ outer loop
+ vertex 11.599523637841404 178.05549651111806 372.78715803099436
+ vertex 11.601705676813728 174.0554971115108 372.7873625963461
+ vertex 11.237749522547983 178.05529149656644 372.6373141569074
+ endloop
+endfacet
+facet normal 0.3826661922090187 0.00016149936057536487 -0.9238866593139048
+ outer loop
+ vertex 11.239931561520306 174.05529209695916 372.6375187222592
+ vertex 11.237749522547983 178.05529149656644 372.6373141569074
+ vertex 11.601705676813728 174.0554971115108 372.7873625963461
+ endloop
+endfacet
+facet normal 0.6087465828199281 0.00029150350462267197 -0.7933646783987597
+ outer loop
+ vertex 11.237749522547983 178.05529149656644 372.6373141569074
+ vertex 11.239931561520306 174.05529209695916 372.6375187222592
+ vertex 10.927085006601333 178.05510983535007 372.3989420430612
+ endloop
+endfacet
+facet normal 0.6087465828199281 0.00029150350462267197 -0.7933646783987597
+ outer loop
+ vertex 10.929267045573656 174.0551104357428 372.399146608413
+ vertex 10.927085006601333 178.05510983535007 372.3989420430612
+ vertex 11.239931561520306 174.05529209695916 372.6375187222592
+ endloop
+endfacet
+facet normal 0.7933418998129353 0.0004016421665622524 -0.6087762057478695
+ outer loop
+ vertex 10.688701363365798 178.05496390738062 372.08828635508587
+ vertex 10.927085006601333 178.05510983535007 372.3989420430612
+ vertex 10.69088340233812 174.05496450777335 372.0884909204376
+ endloop
+endfacet
+facet normal 0.7933418998129353 0.0004016421665622524 -0.6087762057478695
+ outer loop
+ vertex 10.929267045573656 174.0551104357428 372.399146608413
+ vertex 10.69088340233812 174.05496450777335 372.0884909204376
+ vertex 10.927085006601333 178.05510983535007 372.3989420430612
+ endloop
+endfacet
+facet normal 0.9238722773931358 0.0004844095785956557 -0.3827006407255951
+ outer loop
+ vertex 10.53884404418024 178.05486365740822 371.726517764734
+ vertex 10.688701363365798 178.05496390738062 372.08828635508587
+ vertex 10.541026083152563 174.05486425780092 371.7267223300858
+ endloop
+endfacet
+facet normal 0.9238722773931358 0.0004844095785956557 -0.3827006407255951
+ outer loop
+ vertex 10.69088340233812 174.05496450777335 372.0884909204376
+ vertex 10.541026083152563 174.05486425780092 371.7267223300858
+ vertex 10.688701363365798 178.05496390738062 372.08828635508587
+ endloop
+endfacet
+facet normal 0.9914422860401905 0.0005341652783724907 -0.13054465948041144
+ outer loop
+ vertex 10.48772557769631 178.05481591730262 371.33829020358735
+ vertex 10.53884404418024 178.05486365740822 371.726517764734
+ vertex 10.489907616668633 174.05481651769531 371.33849476893914
+ endloop
+endfacet
+facet normal 0.9914422860401905 0.0005341652783724907 -0.13054465948041144
+ outer loop
+ vertex 10.541026083152563 174.05486425780092 371.7267223300858
+ vertex 10.489907616668633 174.05481651769531 371.33849476893914
+ vertex 10.53884404418024 178.05486365740822 371.726517764734
+ endloop
+endfacet
+facet normal 0.991447141329423 0.0005475184971780771 0.13050772457295523
+ outer loop
+ vertex 10.538829602927564 178.0548239404732 370.9500607383616
+ vertex 10.48772557769631 178.05481591730262 371.33829020358735
+ vertex 10.541011641899885 174.05482454086592 370.95026530371337
+ endloop
+endfacet
+facet normal 0.991447141329423 0.0005475184971780771 0.13050772457295523
+ outer loop
+ vertex 10.489907616668633 174.05481651769531 371.33849476893914
+ vertex 10.541011641899885 174.05482454086592 370.95026530371337
+ vertex 10.48772557769631 178.05481591730262 371.33829020358735
+ endloop
+endfacet
+facet normal 0.9238865123808966 0.000523559235218068 0.38266622287104274
+ outer loop
+ vertex 10.68867346500795 178.0548871801541 370.58828656553237
+ vertex 10.538829602927564 178.0548239404732 370.9500607383616
+ vertex 10.690855503980274 174.05488778054684 370.58849113088417
+ endloop
+endfacet
+facet normal 0.9238865123808966 0.000523559235218068 0.38266622287104274
+ outer loop
+ vertex 10.541011641899885 174.05482454086592 370.95026530371337
+ vertex 10.690855503980274 174.05488778054684 370.58849113088417
+ vertex 10.538829602927564 178.0548239404732 370.9500607383616
+ endloop
+endfacet
+facet normal 0.7933645444083308 0.00046392027660052134 0.6087466504661349
+ outer loop
+ vertex 10.927045552365298 178.05500132666572 370.27762199711793
+ vertex 10.68867346500795 178.0548871801541 370.58828656553237
+ vertex 10.929227591337622 174.0550019270584 370.2778265624697
+ endloop
+endfacet
+facet normal 0.7933645444083308 0.00046392027660052134 0.6087466504661349
+ outer loop
+ vertex 10.690855503980274 174.05488778054684 370.58849113088417
+ vertex 10.929227591337622 174.0550019270584 370.2778265624697
+ vertex 10.68867346500795 178.0548871801541 370.58828656553237
+ endloop
+endfacet
+facet normal 0.6087760938311644 0.00037266591779712096 0.7933419998334786
+ outer loop
+ vertex 11.237701201174792 178.05515860111183 370.0392383100582
+ vertex 10.927045552365298 178.05500132666572 370.27762199711793
+ vertex 11.239883240147114 174.05515920150455 370.03944287541
+ endloop
+endfacet
+facet normal 0.6087760938311644 0.00037266591779712096 0.7933419998334786
+ outer loop
+ vertex 10.929227591337622 174.0550019270584 370.2778265624697
+ vertex 11.239883240147114 174.05515920150455 370.03944287541
+ vertex 10.927045552365298 178.05500132666572 370.27762199711793
+ endloop
+endfacet
+facet normal 0.3827005585095379 0.00025601499255543085 0.9238724029717585
+ outer loop
+ vertex 11.599469742352692 178.0553482854988 369.88938095867866
+ vertex 11.237701201174792 178.05515860111183 370.0392383100582
+ vertex 11.601651781325016 174.0553488858915 369.8895855240304
+ endloop
+endfacet
+facet normal 0.3827005585095379 0.00025601499255543085 0.9238724029717585
+ outer loop
+ vertex 11.239883240147114 174.05515920150455 370.03944287541
+ vertex 11.601651781325016 174.0553488858915 369.8895855240304
+ vertex 11.237701201174792 178.05515860111183 370.0392383100582
+ endloop
+endfacet
+facet normal 0.13054461256799013 0.00012191706865582975 0.9914424286188794
+ outer loop
+ vertex 11.987697247668617 178.05555745314916 369.8382624738248
+ vertex 11.599469742352692 178.0553482854988 369.88938095867866
+ vertex 11.98987928664094 174.0555580535419 369.8384670391766
+ endloop
+endfacet
+facet normal 0.13054461256799013 0.00012191706865582975 0.9914424286188794
+ outer loop
+ vertex 11.601651781325016 174.0553488858915 369.8895855240304
+ vertex 11.98987928664094 174.0555580535419 369.8384670391766
+ vertex 11.599469742352692 178.0553482854988 369.88938095867866
+ endloop
+endfacet
+facet normal -0.1305077329848326 -2.0489301995151305e-05 0.9914472911916944
+ outer loop
+ vertex 12.375926654211524 178.05577184963326 369.8893664957622
+ vertex 11.987697247668617 178.05555745314916 369.8382624738248
+ vertex 12.378108693183847 174.05577245002596 369.88957106111394
+ endloop
+endfacet
+facet normal -0.1305077329848326 -2.0489301995151305e-05 0.9914472911916944
+ outer loop
+ vertex 11.98987928664094 174.0555580535419 369.8384670391766
+ vertex 12.378108693183847 174.05577245002596 369.88957106111394
+ vertex 11.987697247668617 178.05555745314916 369.8382624738248
+ endloop
+endfacet
+facet normal -0.3826661922090187 -0.00016149936057536487 0.9238866593139048
+ outer loop
+ vertex 12.737700769504942 178.05597686418488 370.0392103698491
+ vertex 12.375926654211524 178.05577184963326 369.8893664957622
+ vertex 12.739882808477267 174.0559774645776 370.0394149352009
+ endloop
+endfacet
+facet normal -0.3826661922090187 -0.00016149936057536487 0.9238866593139048
+ outer loop
+ vertex 12.378108693183847 174.05577245002596 369.88957106111394
+ vertex 12.739882808477267 174.0559774645776 370.0394149352009
+ vertex 12.375926654211524 178.05577184963326 369.8893664957622
+ endloop
+endfacet
+facet normal -0.6087465828199281 -0.00029150350462267197 0.7933646783987597
+ outer loop
+ vertex 13.048365285451593 178.05615852540126 370.2775824836953
+ vertex 12.737700769504942 178.05597686418488 370.0392103698491
+ vertex 13.050547324423915 174.05615912579395 370.27778704904705
+ endloop
+endfacet
+facet normal -0.6087465828199281 -0.00029150350462267197 0.7933646783987597
+ outer loop
+ vertex 12.739882808477267 174.0559774645776 370.0394149352009
+ vertex 13.050547324423915 174.05615912579395 370.27778704904705
+ vertex 12.737700769504942 178.05597686418488 370.0392103698491
+ endloop
+endfacet
+facet normal -0.7933418998129353 -0.0004016421665622524 0.6087762057478695
+ outer loop
+ vertex 13.048365285451593 178.05615852540126 370.2775824836953
+ vertex 13.050547324423915 174.05615912579395 370.27778704904705
+ vertex 13.28674892868713 178.0563044533707 370.5882381716707
+ endloop
+endfacet
+facet normal -0.7933418998129353 -0.0004016421665622524 0.6087762057478695
+ outer loop
+ vertex 13.288930967659452 174.0563050537634 370.58844273702243
+ vertex 13.28674892868713 178.0563044533707 370.5882381716707
+ vertex 13.050547324423915 174.05615912579395 370.27778704904705
+ endloop
+endfacet
+facet normal -0.9238722773931358 -0.0004844095785956557 0.3827006407255951
+ outer loop
+ vertex 13.28674892868713 178.0563044533707 370.5882381716707
+ vertex 13.288930967659452 174.0563050537634 370.58844273702243
+ vertex 13.436606247872689 178.0564047033431 370.9500067620225
+ endloop
+endfacet
+facet normal -0.9238722773931358 -0.0004844095785956557 0.3827006407255951
+ outer loop
+ vertex 13.438788286845012 174.05640530373583 370.9502113273743
+ vertex 13.436606247872689 178.0564047033431 370.9500067620225
+ vertex 13.288930967659452 174.0563050537634 370.58844273702243
+ endloop
+endfacet
+facet normal -0.9914422860401905 -0.0005341652783724907 0.13054465948041144
+ outer loop
+ vertex 13.436606247872689 178.0564047033431 370.9500067620225
+ vertex 13.438788286845012 174.05640530373583 370.9502113273743
+ vertex 13.487724714356615 178.05645244344873 371.3382343231691
+ endloop
+endfacet
+facet normal -0.9914422860401905 -0.0005341652783724907 0.13054465948041144
+ outer loop
+ vertex 13.48990675332894 174.05645304384143 371.33843888852095
+ vertex 13.487724714356615 178.05645244344873 371.3382343231691
+ vertex 13.438788286845012 174.05640530373583 370.9502113273743
+ endloop
+endfacet
+facet normal -0.991447141329423 -0.0005475184971780771 -0.13050772457295523
+ outer loop
+ vertex 13.487724714356615 178.05645244344873 371.3382343231691
+ vertex 13.48990675332894 174.05645304384143 371.33843888852095
+ vertex 13.436620689125364 178.05644442027813 371.7264637883949
+ endloop
+endfacet
+facet normal -0.991447141329423 -0.0005475184971780771 -0.13050772457295523
+ outer loop
+ vertex 13.438802728097686 174.05644502067082 371.7266683537467
+ vertex 13.436620689125364 178.05644442027813 371.7264637883949
+ vertex 13.48990675332894 174.05645304384143 371.33843888852095
+ endloop
+endfacet
+facet normal -0.9238865123808966 -0.000523559235218068 -0.38266622287104274
+ outer loop
+ vertex 13.436620689125364 178.05644442027813 371.7264637883949
+ vertex 13.438802728097686 174.05644502067082 371.7266683537467
+ vertex 13.286776827044978 178.0563811805972 372.0882379612241
+ endloop
+endfacet
+facet normal -0.9238865123808966 -0.000523559235218068 -0.38266622287104274
+ outer loop
+ vertex 13.2889588660173 174.05638178098994 372.0884425265759
+ vertex 13.286776827044978 178.0563811805972 372.0882379612241
+ vertex 13.438802728097686 174.05644502067082 371.7266683537467
+ endloop
+endfacet
+facet normal -0.7933645444083308 -0.00046392027660052134 -0.6087466504661349
+ outer loop
+ vertex 13.286776827044978 178.0563811805972 372.0882379612241
+ vertex 13.2889588660173 174.05638178098994 372.0884425265759
+ vertex 13.048404739687628 178.0562670340856 372.3989025296386
+ endloop
+endfacet
+facet normal -0.7933645444083308 -0.00046392027660052134 -0.6087466504661349
+ outer loop
+ vertex 13.050586778659953 174.05626763447833 372.39910709499037
+ vertex 13.048404739687628 178.0562670340856 372.3989025296386
+ vertex 13.2889588660173 174.05638178098994 372.0884425265759
+ endloop
+endfacet
+facet normal -0.6087760938311463 -0.0003726659177971118 -0.7933419998334925
+ outer loop
+ vertex 13.048404739687628 178.0562670340856 372.3989025296386
+ vertex 13.050586778659953 174.05626763447833 372.39910709499037
+ vertex 12.737749090878136 178.0561097596395 372.63728621669827
+ endloop
+endfacet
+facet normal -0.6087760938311463 -0.0003726659177971118 -0.7933419998334925
+ outer loop
+ vertex 12.739931129850461 174.05611036003222 372.63749078205007
+ vertex 12.737749090878136 178.0561097596395 372.63728621669827
+ vertex 13.050586778659953 174.05626763447833 372.39910709499037
+ endloop
+endfacet
+facet normal -0.38270055850956247 -0.0002560149925554438 -0.9238724029717484
+ outer loop
+ vertex 12.737749090878136 178.0561097596395 372.63728621669827
+ vertex 12.739931129850461 174.05611036003222 372.63749078205007
+ vertex 12.375980549700234 178.05592007525252 372.78714356807785
+ endloop
+endfacet
+facet normal -0.38270055850956247 -0.0002560149925554438 -0.9238724029717484
+ outer loop
+ vertex 12.378162588672557 174.05592067564524 372.78734813342965
+ vertex 12.375980549700234 178.05592007525252 372.78714356807785
+ vertex 12.739931129850461 174.05611036003222 372.63749078205007
+ endloop
+endfacet
+facet normal -0.13054461256799013 -0.00012191706865582975 -0.9914424286188794
+ outer loop
+ vertex 12.375980549700234 178.05592007525252 372.78714356807785
+ vertex 12.378162588672557 174.05592067564524 372.78734813342965
+ vertex 11.987753044384311 178.05571090760216 372.8382620529317
+ endloop
+endfacet
+facet normal -0.13054461256799013 -0.00012191706865582975 -0.9914424286188794
+ outer loop
+ vertex 11.989935083356634 174.05571150799486 372.83846661828346
+ vertex 11.987753044384311 178.05571090760216 372.8382620529317
+ vertex 12.378162588672557 174.05592067564524 372.78734813342965
+ endloop
+endfacet
+facet normal 0.000285731257939247 -0.9999999582548189 4.298847474547233e-05
+ outer loop
+ vertex -6.511235848124144 178.05569121227452 371.3386389550018
+ vertex -6.562339884085694 178.0556932996484 371.72686845962704
+ vertex -6.562354325457634 178.05565991681388 370.9504113528749
+ endloop
+endfacet
+facet normal 0.000285731257939247 -0.9999999582548189 4.298847474547233e-05
+ outer loop
+ vertex -6.712211676333184 178.05560154600045 370.5886427227549
+ vertex -6.562354325457634 178.05565991681388 370.9504113528749
+ vertex -6.562339884085694 178.0556932996484 371.72686845962704
+ endloop
+endfacet
+facet normal 0.000285731257939247 -0.9999999582548189 4.298847474547233e-05
+ outer loop
+ vertex -6.712183777744852 178.05566603668444 372.08864266759
+ vertex -6.712211676333184 178.05560154600045 370.5886427227549
+ vertex -6.562339884085694 178.0556932996484 371.72686845962704
+ endloop
+endfacet
+facet normal 0.000285731257939247 -0.9999999582548189 4.298847474547233e-05
+ outer loop
+ vertex -6.950595369939611 178.05552007770865 370.2779869989335
+ vertex -6.712211676333184 178.05560154600045 370.5886427227549
+ vertex -6.712183777744852 178.05566603668444 372.08864266759
+ endloop
+endfacet
+facet normal 0.000285731257939247 -0.9999999582548189 4.298847474547233e-05
+ outer loop
+ vertex -6.9505559153776195 178.0556112813086 372.3993072644783
+ vertex -6.950595369939611 178.05552007770865 370.2779869989335
+ vertex -6.712183777744852 178.05566603668444 372.08864266759
+ endloop
+endfacet
+facet normal 0.000285731257939247 -0.9999999582548189 4.298847474547233e-05
+ outer loop
+ vertex -7.261259951505227 178.05542106386804 370.0396148556063
+ vertex -6.950595369939611 178.05552007770865 370.2779869989335
+ vertex -6.9505559153776195 178.0556112813086 372.3993072644783
+ endloop
+endfacet
+facet normal 0.000285731257939247 -0.9999999582548189 4.298847474547233e-05
+ outer loop
+ vertex -7.261211629732821 178.05553276500916 372.63769097141136
+ vertex -7.261259951505227 178.05542106386804 370.0396148556063
+ vertex -6.9505559153776195 178.0556112813086 372.3993072644783
+ endloop
+endfacet
+facet normal 0.000285731257939247 -0.9999999582548189 4.298847474547233e-05
+ outer loop
+ vertex -7.623034143193963 178.05531125210805 369.88977096041253
+ vertex -7.261259951505227 178.05542106386804 370.0396148556063
+ vertex -7.261211629732821 178.05553276500916 372.63769097141136
+ endloop
+endfacet
+facet normal 0.000285731257939247 -0.9999999582548189 4.298847474547233e-05
+ outer loop
+ vertex -7.622980247259987 178.05543583854237 372.78754833270943
+ vertex -7.623034143193963 178.05531125210805 369.88977096041253
+ vertex -7.261211629732821 178.05553276500916 372.63769097141136
+ endloop
+endfacet
+facet normal 0.000285731257939247 -0.9999999582548189 4.298847474547233e-05
+ outer loop
+ vertex -8.011263631702235 178.05519812591876 369.8386669271808
+ vertex -7.623034143193963 178.05531125210805 369.88977096041253
+ vertex -7.622980247259987 178.05543583854237 372.78754833270943
+ endloop
+endfacet
+facet normal 0.000285731257939247 -0.9999999582548189 4.298847474547233e-05
+ outer loop
+ vertex -8.011207834525573 178.05532710728662 372.8386668168511
+ vertex -8.011263631702235 178.05519812591876 369.8386669271808
+ vertex -7.622980247259987 178.05543583854237 372.78754833270943
+ endloop
+endfacet
+facet normal 0.000285731257939247 -0.9999999582548189 4.298847474547233e-05
+ outer loop
+ vertex -8.399491218967821 178.05508939466304 369.8897854113224
+ vertex -8.011263631702235 178.05519812591876 369.8386669271808
+ vertex -8.011207834525573 178.05532710728662 372.8386668168511
+ endloop
+endfacet
+facet normal 0.000285731257939247 -0.9999999582548189 4.298847474547233e-05
+ outer loop
+ vertex -8.399437323033844 178.05521398109732 372.78756278361936
+ vertex -8.399491218967821 178.05508939466304 369.8897854113224
+ vertex -8.011207834525573 178.05532710728662 372.8386668168511
+ endloop
+endfacet
+facet normal 0.000285731257939247 -0.9999999582548189 4.298847474547233e-05
+ outer loop
+ vertex -8.761259836494986 178.0549924681962 370.0396427726205
+ vertex -8.399491218967821 178.05508939466304 369.8897854113224
+ vertex -8.399437323033844 178.05521398109732 372.78756278361936
+ endloop
+endfacet
+facet normal 0.000285731257939247 -0.9999999582548189 4.298847474547233e-05
+ outer loop
+ vertex -8.761211514722577 178.05510416933737 372.6377188884255
+ vertex -8.761259836494986 178.0549924681962 370.0396427726205
+ vertex -8.399437323033844 178.05521398109732 372.78756278361936
+ endloop
+endfacet
+facet normal 0.000285731257939247 -0.9999999582548189 4.298847474547233e-05
+ outer loop
+ vertex -9.071915550850187 178.05491395189676 370.27802647955355
+ vertex -8.761259836494986 178.0549924681962 370.0396427726205
+ vertex -8.761211514722577 178.05510416933737 372.6377188884255
+ endloop
+endfacet
+facet normal 0.000285731257939247 -0.9999999582548189 4.298847474547233e-05
+ outer loop
+ vertex -9.071876096288197 178.05500515549676 372.39934674509834
+ vertex -9.071915550850187 178.05491395189676 370.27802647955355
+ vertex -8.761211514722577 178.05510416933737 372.6377188884255
+ endloop
+endfacet
+facet normal 0.000285731257939247 -0.9999999582548189 4.298847474547233e-05
+ outer loop
+ vertex -9.310287688482953 178.05485919652094 370.5886910764418
+ vertex -9.071915550850187 178.05491395189676 370.27802647955355
+ vertex -9.071876096288197 178.05500515549676 372.39934674509834
+ endloop
+endfacet
+facet normal 0.000285731257939247 -0.9999999582548189 4.298847474547233e-05
+ outer loop
+ vertex -9.310259789894621 178.05492368720496 372.08869102127704
+ vertex -9.310287688482953 178.05485919652094 370.5886910764418
+ vertex -9.071876096288197 178.05500515549676 372.39934674509834
+ endloop
+endfacet
+facet normal 0.000285731257939247 -0.9999999582548189 4.298847474547233e-05
+ outer loop
+ vertex -9.460131582142155 178.05483193355698 370.95046528440486
+ vertex -9.310287688482953 178.05485919652094 370.5886910764418
+ vertex -9.310259789894621 178.05492368720496 372.08869102127704
+ endloop
+endfacet
+facet normal 0.000285731257939247 -0.9999999582548189 4.298847474547233e-05
+ outer loop
+ vertex -9.460117140770175 178.05486531639147 371.726922391157
+ vertex -9.460131582142155 178.05483193355698 370.95046528440486
+ vertex -9.310259789894621 178.05492368720496 372.08869102127704
+ endloop
+endfacet
+facet normal 0.000285731257939247 -0.9999999582548189 4.298847474547233e-05
+ outer loop
+ vertex -9.51123561810366 178.05483402093088 371.3386947890301
+ vertex -9.460131582142155 178.05483193355698 370.95046528440486
+ vertex -9.460117140770175 178.05486531639147 371.726922391157
+ endloop
+endfacet
+facet normal -0.9914423930659667 -0.0002776741785961315 0.1305446441976069
+ outer loop
+ vertex -6.562354325457634 178.05565991681388 370.9504113528749
+ vertex -6.561211400425863 174.05566008379466 370.95058330677386
+ vertex -6.511235848124144 178.05569121227452 371.3386389550018
+ endloop
+endfacet
+facet normal -0.9914423930659667 -0.0002776741785961315 0.1305446441976069
+ outer loop
+ vertex -6.510092923092373 174.05569137925528 371.33881090890077
+ vertex -6.511235848124144 178.05569121227452 371.3386389550018
+ vertex -6.561211400425863 174.05566008379466 370.95058330677386
+ endloop
+endfacet
+facet normal -0.9914472483947967 -0.0002888978102073141 -0.1305077399560715
+ outer loop
+ vertex -6.511235848124144 178.05569121227452 371.3386389550018
+ vertex -6.510092923092373 174.05569137925528 371.33881090890077
+ vertex -6.562339884085694 178.0556932996484 371.72686845962704
+ endloop
+endfacet
+facet normal -0.9914472483947967 -0.0002888978102073141 -0.1305077399560715
+ outer loop
+ vertex -6.561196959053923 174.05569346662915 371.727040413526
+ vertex -6.562339884085694 178.0556932996484 371.72686845962704
+ vertex -6.510092923092373 174.05569137925528 371.33881090890077
+ endloop
+endfacet
+facet normal -0.923886612189625 -0.0002804335334790834 -0.3826662373058419
+ outer loop
+ vertex -6.562339884085694 178.0556932996484 371.72686845962704
+ vertex -6.561196959053923 174.05569346662915 371.727040413526
+ vertex -6.712183777744852 178.05566603668444 372.08864266759
+ endloop
+endfacet
+facet normal -0.923886612189625 -0.0002804335334790834 -0.3826662373058419
+ outer loop
+ vertex -6.711040852713081 174.0556662036652 372.08881462148906
+ vertex -6.712183777744852 178.05566603668444 372.08864266759
+ vertex -6.561196959053923 174.05569346662915 371.727040413526
+ endloop
+endfacet
+facet normal -0.793364630158425 -0.0002528581748825569 -0.608746662969358
+ outer loop
+ vertex -6.712183777744852 178.05566603668444 372.08864266759
+ vertex -6.711040852713081 174.0556662036652 372.08881462148906
+ vertex -6.9505559153776195 178.0556112813086 372.3993072644783
+ endloop
+endfacet
+facet normal -0.793364630158425 -0.0002528581748825569 -0.608746662969358
+ outer loop
+ vertex -6.949412990345849 174.05561144828937 372.3994792183773
+ vertex -6.9505559153776195 178.0556112813086 372.3993072644783
+ vertex -6.711040852713081 174.0556662036652 372.08881462148906
+ endloop
+endfacet
+facet normal -0.6087761596790934 -0.00020805094953570214 -0.7933420095527387
+ outer loop
+ vertex -6.9505559153776195 178.0556112813086 372.3993072644783
+ vertex -6.949412990345849 174.05561144828937 372.3994792183773
+ vertex -7.261211629732821 178.05553276500916 372.63769097141136
+ endloop
+endfacet
+facet normal -0.6087761596790934 -0.00020805094953570214 -0.7933420095527387
+ outer loop
+ vertex -7.260068704701047 174.05553293198992 372.6378629253104
+ vertex -7.261211629732821 178.05553276500916 372.63769097141136
+ vertex -6.949412990345849 174.05561144828937 372.3994792183773
+ endloop
+endfacet
+facet normal -0.38270059996775274 -0.00014906539579842803 -0.9238724092448208
+ outer loop
+ vertex -7.261211629732821 178.05553276500916 372.63769097141136
+ vertex -7.260068704701047 174.05553293198992 372.6378629253104
+ vertex -7.622980247259987 178.05543583854237 372.78754833270943
+ endloop
+endfacet
+facet normal -0.38270059996775274 -0.00014906539579842803 -0.9238724092448208
+ outer loop
+ vertex -7.621837322228213 174.05543600552312 372.7877202866084
+ vertex -7.622980247259987 178.05543583854237 372.78754833270943
+ vertex -7.260068704701047 174.05553293198992 372.6378629253104
+ endloop
+endfacet
+facet normal -0.13054462681127676 -7.992128167971128e-05 -0.9914424310182076
+ outer loop
+ vertex -7.622980247259987 178.05543583854237 372.78754833270943
+ vertex -7.621837322228213 174.05543600552312 372.7877202866084
+ vertex -8.011207834525573 178.05532710728662 372.8386668168511
+ endloop
+endfacet
+facet normal -0.13054462681127676 -7.992128167971128e-05 -0.9914424310182076
+ outer loop
+ vertex -8.010064909493801 174.05532727426734 372.8388387707501
+ vertex -8.011207834525573 178.05532710728662 372.8386668168511
+ vertex -7.621837322228213 174.05543600552312 372.7877202866084
+ endloop
+endfacet
+facet normal 0.13050774692722905 -5.330664290674419e-06 -0.9914472895537928
+ outer loop
+ vertex -8.011207834525573 178.05532710728662 372.8386668168511
+ vertex -8.010064909493801 174.05532727426734 372.8388387707501
+ vertex -8.399437323033844 178.05521398109732 372.78756278361936
+ endloop
+endfacet
+facet normal 0.13050774692722905 -5.330664290674419e-06 -0.9914472895537928
+ outer loop
+ vertex -8.398294398002074 174.05521414807805 372.78773473751835
+ vertex -8.399437323033844 178.05521398109732 372.78756278361936
+ vertex -8.010064909493801 174.05532727426734 372.8388387707501
+ endloop
+endfacet
+facet normal 0.3826662333868316 6.962322906041436e-05 -0.923886653750416
+ outer loop
+ vertex -8.399437323033844 178.05521398109732 372.78756278361936
+ vertex -8.398294398002074 174.05521414807805 372.78773473751835
+ vertex -8.761211514722577 178.05510416933737 372.6377188884255
+ endloop
+endfacet
+facet normal 0.3826662333868316 6.962322906041436e-05 -0.923886653750416
+ outer loop
+ vertex -8.760068589690809 174.0551043363181 372.63789084232457
+ vertex -8.761211514722577 178.05510416933737 372.6377188884255
+ vertex -8.398294398002074 174.05521414807805 372.78773473751835
+ endloop
+endfacet
+facet normal 0.6087466484270903 0.00013983241440889834 -0.7933646692887706
+ outer loop
+ vertex -8.761211514722577 178.05510416933737 372.6377188884255
+ vertex -8.760068589690809 174.0551043363181 372.63789084232457
+ vertex -9.071876096288197 178.05500515549676 372.39934674509834
+ endloop
+endfacet
+facet normal 0.6087466484270903 0.00013983241440889834 -0.7933646692887706
+ outer loop
+ vertex -9.070733171256427 174.05500532247748 372.3995186989973
+ vertex -9.071876096288197 178.05500515549676 372.39934674509834
+ vertex -8.760068589690809 174.0551043363181 372.63789084232457
+ endloop
+endfacet
+facet normal 0.7933419853782958 0.00020051225179935913 -0.6087761937123206
+ outer loop
+ vertex -9.310259789894621 178.05492368720496 372.08869102127704
+ vertex -9.071876096288197 178.05500515549676 372.39934674509834
+ vertex -9.30911686486285 174.0549238541857 372.08886297517597
+ endloop
+endfacet
+facet normal 0.7933419853782958 0.00020051225179935913 -0.6087761937123206
+ outer loop
+ vertex -9.070733171256427 174.05500532247748 372.3995186989973
+ vertex -9.30911686486285 174.0549238541857 372.08886297517597
+ vertex -9.071876096288197 178.05500515549676 372.39934674509834
+ endloop
+endfacet
+facet normal 0.9238723770856896 0.00024752751059188983 -0.3827006265845001
+ outer loop
+ vertex -9.460117140770175 178.05486531639147 371.726922391157
+ vertex -9.310259789894621 178.05492368720496 372.08869102127704
+ vertex -9.458974215738403 174.05486548337223 371.72709434505595
+ endloop
+endfacet
+facet normal 0.9238723770856896 0.00024752751059188983 -0.3827006265845001
+ outer loop
+ vertex -9.30911686486285 174.0549238541857 372.08886297517597
+ vertex -9.458974215738403 174.05486548337223 371.72709434505595
+ vertex -9.310259789894621 178.05492368720496 372.08869102127704
+ endloop
+endfacet
+facet normal 0.9914423930659667 0.0002776741785961315 -0.1305446441976069
+ outer loop
+ vertex -9.51123561810366 178.05483402093088 371.3386947890301
+ vertex -9.460117140770175 178.05486531639147 371.726922391157
+ vertex -9.51009269307189 174.0548341879116 371.3388667429291
+ endloop
+endfacet
+facet normal 0.9914423930659667 0.0002776741785961315 -0.1305446441976069
+ outer loop
+ vertex -9.458974215738403 174.05486548337223 371.72709434505595
+ vertex -9.51009269307189 174.0548341879116 371.3388667429291
+ vertex -9.460117140770175 178.05486531639147 371.726922391157
+ endloop
+endfacet
+facet normal 0.9914472483948117 0.0002888978102073135 0.13050773995595827
+ outer loop
+ vertex -9.460131582142155 178.05483193355698 370.95046528440486
+ vertex -9.51123561810366 178.05483402093088 371.3386947890301
+ vertex -9.458988657110387 174.05483210053774 370.9506372383038
+ endloop
+endfacet
+facet normal 0.9914472483948117 0.0002888978102073135 0.13050773995595827
+ outer loop
+ vertex -9.51009269307189 174.0548341879116 371.3388667429291
+ vertex -9.458988657110387 174.05483210053774 370.9506372383038
+ vertex -9.51123561810366 178.05483402093088 371.3386947890301
+ endloop
+endfacet
+facet normal 0.9238866121895842 0.000280433533479076 0.3826662373059403
+ outer loop
+ vertex -9.310287688482953 178.05485919652094 370.5886910764418
+ vertex -9.460131582142155 178.05483193355698 370.95046528440486
+ vertex -9.309144763451181 174.0548593635017 370.5888630303408
+ endloop
+endfacet
+facet normal 0.9238866121895842 0.000280433533479076 0.3826662373059403
+ outer loop
+ vertex -9.458988657110387 174.05483210053774 370.9506372383038
+ vertex -9.309144763451181 174.0548593635017 370.5888630303408
+ vertex -9.460131582142155 178.05483193355698 370.95046528440486
+ endloop
+endfacet
+facet normal 0.793364630158425 0.0002528581748825569 0.608746662969358
+ outer loop
+ vertex -9.071915550850187 178.05491395189676 370.27802647955355
+ vertex -9.310287688482953 178.05485919652094 370.5886910764418
+ vertex -9.070772625818417 174.05491411887752 370.2781984334526
+ endloop
+endfacet
+facet normal 0.793364630158425 0.0002528581748825569 0.608746662969358
+ outer loop
+ vertex -9.309144763451181 174.0548593635017 370.5888630303408
+ vertex -9.070772625818417 174.05491411887752 370.2781984334526
+ vertex -9.310287688482953 178.05485919652094 370.5886910764418
+ endloop
+endfacet
+facet normal 0.6087761596790934 0.00020805094953570214 0.7933420095527387
+ outer loop
+ vertex -8.761259836494986 178.0549924681962 370.0396427726205
+ vertex -9.071915550850187 178.05491395189676 370.27802647955355
+ vertex -8.760116911463216 174.05499263517694 370.03981472651947
+ endloop
+endfacet
+facet normal 0.6087761596790934 0.00020805094953570214 0.7933420095527387
+ outer loop
+ vertex -9.070772625818417 174.05491411887752 370.2781984334526
+ vertex -8.760116911463216 174.05499263517694 370.03981472651947
+ vertex -9.071915550850187 178.05491395189676 370.27802647955355
+ endloop
+endfacet
+facet normal 0.38270059996775274 0.00014906539579842803 0.9238724092448208
+ outer loop
+ vertex -8.399491218967821 178.05508939466304 369.8897854113224
+ vertex -8.761259836494986 178.0549924681962 370.0396427726205
+ vertex -8.398348293936047 174.05508956164377 369.88995736522145
+ endloop
+endfacet
+facet normal 0.38270059996775274 0.00014906539579842803 0.9238724092448208
+ outer loop
+ vertex -8.760116911463216 174.05499263517694 370.03981472651947
+ vertex -8.398348293936047 174.05508956164377 369.88995736522145
+ vertex -8.761259836494986 178.0549924681962 370.0396427726205
+ endloop
+endfacet
+facet normal 0.13054462681127676 7.992128167971128e-05 0.9914424310182076
+ outer loop
+ vertex -8.011263631702235 178.05519812591876 369.8386669271808
+ vertex -8.399491218967821 178.05508939466304 369.8897854113224
+ vertex -8.010120706670465 174.05519829289952 369.83883888107977
+ endloop
+endfacet
+facet normal 0.13054462681127676 7.992128167971128e-05 0.9914424310182076
+ outer loop
+ vertex -8.398348293936047 174.05508956164377 369.88995736522145
+ vertex -8.010120706670465 174.05519829289952 369.83883888107977
+ vertex -8.399491218967821 178.05508939466304 369.8897854113224
+ endloop
+endfacet
+facet normal -0.13050774692722905 5.330664290674419e-06 0.9914472895537928
+ outer loop
+ vertex -7.623034143193963 178.05531125210805 369.88977096041253
+ vertex -8.011263631702235 178.05519812591876 369.8386669271808
+ vertex -7.621891218162192 174.05531141908884 369.8899429143115
+ endloop
+endfacet
+facet normal -0.13050774692722905 5.330664290674419e-06 0.9914472895537928
+ outer loop
+ vertex -8.010120706670465 174.05519829289952 369.83883888107977
+ vertex -7.621891218162192 174.05531141908884 369.8899429143115
+ vertex -8.011263631702235 178.05519812591876 369.8386669271808
+ endloop
+endfacet
+facet normal -0.3826662333868316 -6.962322906041436e-05 0.923886653750416
+ outer loop
+ vertex -7.261259951505227 178.05542106386804 370.0396148556063
+ vertex -7.623034143193963 178.05531125210805 369.88977096041253
+ vertex -7.2601170264734565 174.0554212308488 370.0397868095053
+ endloop
+endfacet
+facet normal -0.3826662333868316 -6.962322906041436e-05 0.923886653750416
+ outer loop
+ vertex -7.621891218162192 174.05531141908884 369.8899429143115
+ vertex -7.2601170264734565 174.0554212308488 370.0397868095053
+ vertex -7.623034143193963 178.05531125210805 369.88977096041253
+ endloop
+endfacet
+facet normal -0.6087466484270903 -0.00013983241440889834 0.7933646692887706
+ outer loop
+ vertex -6.950595369939611 178.05552007770865 370.2779869989335
+ vertex -7.261259951505227 178.05542106386804 370.0396148556063
+ vertex -6.94945244490784 174.0555202446894 370.2781589528325
+ endloop
+endfacet
+facet normal -0.6087466484270903 -0.00013983241440889834 0.7933646692887706
+ outer loop
+ vertex -7.2601170264734565 174.0554212308488 370.0397868095053
+ vertex -6.94945244490784 174.0555202446894 370.2781589528325
+ vertex -7.261259951505227 178.05542106386804 370.0396148556063
+ endloop
+endfacet
+facet normal -0.7933419853782958 -0.00020051225179935913 0.6087761937123206
+ outer loop
+ vertex -6.950595369939611 178.05552007770865 370.2779869989335
+ vertex -6.94945244490784 174.0555202446894 370.2781589528325
+ vertex -6.712211676333184 178.05560154600045 370.5886427227549
+ endloop
+endfacet
+facet normal -0.7933419853782958 -0.00020051225179935913 0.6087761937123206
+ outer loop
+ vertex -6.711068751301413 174.0556017129812 370.58881467665384
+ vertex -6.712211676333184 178.05560154600045 370.5886427227549
+ vertex -6.94945244490784 174.0555202446894 370.2781589528325
+ endloop
+endfacet
+facet normal -0.9238723770856896 -0.00024752751059188983 0.3827006265845001
+ outer loop
+ vertex -6.712211676333184 178.05560154600045 370.5886427227549
+ vertex -6.711068751301413 174.0556017129812 370.58881467665384
+ vertex -6.562354325457634 178.05565991681388 370.9504113528749
+ endloop
+endfacet
+facet normal -0.9238723770856896 -0.00024752751059188983 0.3827006265845001
+ outer loop
+ vertex -6.561211400425863 174.05566008379466 370.95058330677386
+ vertex -6.562354325457634 178.05565991681388 370.9504113528749
+ vertex -6.711068751301413 174.0556017129812 370.58881467665384
+ endloop
+endfacet
+facet normal -0.000464590854411996 -0.9999998354135803 0.00033664246698150084
+ outer loop
+ vertex -6.508606688988532 178.054565229564 351.3374643597222
+ vertex -6.559710659419408 178.05471966655466 351.72569383397484
+ vertex -6.559725222848391 178.0544582848618 350.9492367867938
+ endloop
+endfacet
+facet normal -0.000464590854411996 -0.9999998354135803 0.00033664246698150084
+ outer loop
+ vertex -6.709554483009333 178.0549110712081 352.08746801246093
+ vertex -6.559725222848391 178.0544582848618 350.9492367867938
+ vertex -6.559710659419408 178.05471966655466 351.72569383397484
+ endloop
+endfacet
+facet normal -0.000464590854411996 -0.9999998354135803 0.00033664246698150084
+ outer loop
+ vertex -6.709582617393708 178.0544061205528 350.5874681827082
+ vertex -6.559725222848391 178.0544582848618 350.9492367867938
+ vertex -6.709554483009333 178.0549110712081 352.08746801246093
+ endloop
+endfacet
+facet normal -0.000464590854411996 -0.9999998354135803 0.00033664246698150084
+ outer loop
+ vertex -6.9479265508094095 178.05512639961358 352.39813258277667
+ vertex -6.709582617393708 178.0544061205528 350.5874681827082
+ vertex -6.709554483009333 178.0549110712081 352.08746801246093
+ endloop
+endfacet
+facet normal -0.000464590854411996 -0.9999998354135803 0.00033664246698150084
+ outer loop
+ vertex -6.947966338837327 178.05441229154857 350.27681247998305
+ vertex -6.709582617393708 178.0544061205528 350.5874681827082
+ vertex -6.9479265508094095 178.05512639961358 352.39813258277667
+ endloop
+endfacet
+facet normal -0.000464590854411996 -0.9999998354135803 0.00033664246698150084
+ outer loop
+ vertex -7.258582200327414 178.055350977496 352.6365162678525
+ vertex -6.947966338837327 178.05441229154857 350.27681247998305
+ vertex -6.9479265508094095 178.05512639961358 352.39813258277667
+ endloop
+endfacet
+facet normal -0.000464590854411996 -0.9999998354135803 0.00033664246698150084
+ outer loop
+ vertex -7.25863093051058 178.05447637730575 350.0384403513762
+ vertex -6.947966338837327 178.05441229154857 350.27681247998305
+ vertex -7.258582200327414 178.055350977496 352.6365162678525
+ endloop
+endfacet
+facet normal -0.000464590854411996 -0.9999998354135803 0.00033664246698150084
+ outer loop
+ vertex -7.620350762431494 178.0555695002439 352.7863736134983
+ vertex -7.25863093051058 178.05447637730575 350.0384403513762
+ vertex -7.258582200327414 178.055350977496 352.6365162678525
+ endloop
+endfacet
+facet normal -0.000464590854411996 -0.9999998354135803 0.00033664246698150084
+ outer loop
+ vertex -7.620405113888441 178.05459401048597 349.88859646352364
+ vertex -7.25863093051058 178.05447637730575 350.0384403513762
+ vertex -7.620350762431494 178.0555695002439 352.7863736134983
+ endloop
+endfacet
+facet normal -0.000464590854411996 -0.9999998354135803 0.00033664246698150084
+ outer loop
+ vertex -8.008578307465086 178.05576707589302 352.83749208925923
+ vertex -7.620405113888441 178.05459401048597 349.88859646352364
+ vertex -7.620350762431494 178.0555695002439 352.7863736134983
+ endloop
+endfacet
+facet normal -0.000464590854411996 -0.9999998354135803 0.00033664246698150084
+ outer loop
+ vertex -8.008634576233833 178.05475717458245 349.83749242975387
+ vertex -7.620405113888441 178.05459401048597 349.88859646352364
+ vertex -8.008578307465086 178.05576707589302 352.83749208925923
+ endloop
+endfacet
+facet normal -0.000464590854411996 -0.9999998354135803 0.00033664246698150084
+ outer loop
+ vertex -8.396807769810477 178.05593023998952 352.7863880554894
+ vertex -8.008634576233833 178.05475717458245 349.83749242975387
+ vertex -8.008578307465086 178.05576707589302 352.83749208925923
+ endloop
+endfacet
+facet normal -0.000464590854411996 -0.9999998354135803 0.00033664246698150084
+ outer loop
+ vertex -8.396862121267423 178.0549547502316 349.8886109055147
+ vertex -8.008634576233833 178.05475717458245 349.83749242975387
+ vertex -8.396807769810477 178.05593023998952 352.7863880554894
+ endloop
+endfacet
+facet normal -0.000464590854411996 -0.9999998354135803 0.00033664246698150084
+ outer loop
+ vertex -8.75858195318834 178.05604787316975 352.6365441676368
+ vertex -8.396862121267423 178.0549547502316 349.8886109055147
+ vertex -8.396807769810477 178.05593023998952 352.7863880554894
+ endloop
+endfacet
+facet normal -0.000464590854411996 -0.9999998354135803 0.00033664246698150084
+ outer loop
+ vertex -8.758630683371509 178.0551732729795 350.0384682511605
+ vertex -8.396862121267423 178.0549547502316 349.8886109055147
+ vertex -8.75858195318834 178.05604787316975 352.6365441676368
+ endloop
+endfacet
+facet normal -0.000464590854411996 -0.9999998354135803 0.00033664246698150084
+ outer loop
+ vertex -9.069246544861594 178.0561119589269 352.39817203902993
+ vertex -8.758630683371509 178.0551732729795 350.0384682511605
+ vertex -8.75858195318834 178.05604787316975 352.6365441676368
+ endloop
+endfacet
+facet normal -0.000464590854411996 -0.9999998354135803 0.00033664246698150084
+ outer loop
+ vertex -9.069286332889511 178.05539785086188 350.2768519362364
+ vertex -8.758630683371509 178.0551732729795 350.0384682511605
+ vertex -9.069246544861594 178.0561119589269 352.39817203902993
+ endloop
+endfacet
+facet normal -0.000464590854411996 -0.9999998354135803 0.00033664246698150084
+ outer loop
+ vertex -9.307630266305209 178.05611812992265 352.0875163363048
+ vertex -9.069286332889511 178.05539785086188 350.2768519362364
+ vertex -9.069246544861594 178.0561119589269 352.39817203902993
+ endloop
+endfacet
+facet normal -0.000464590854411996 -0.9999998354135803 0.00033664246698150084
+ outer loop
+ vertex -9.307658400689581 178.05561317926737 350.58751650655216
+ vertex -9.069286332889511 178.05539785086188 350.2768519362364
+ vertex -9.307630266305209 178.05611812992265 352.0875163363048
+ endloop
+endfacet
+facet normal -0.000464590854411996 -0.9999998354135803 0.00033664246698150084
+ outer loop
+ vertex -9.457487660850528 178.05606596561367 351.72574773221925
+ vertex -9.307658400689581 178.05561317926737 350.58751650655216
+ vertex -9.307630266305209 178.05611812992265 352.0875163363048
+ endloop
+endfacet
+facet normal -0.000464590854411996 -0.9999998354135803 0.00033664246698150084
+ outer loop
+ vertex -9.45750222427951 178.05580458392083 350.9492906850382
+ vertex -9.307658400689581 178.05561317926737 350.58751650655216
+ vertex -9.457487660850528 178.05606596561367 351.72574773221925
+ endloop
+endfacet
+facet normal -0.000464590854411996 -0.9999998354135803 0.00033664246698150084
+ outer loop
+ vertex -9.508606194710385 178.0559590209115 351.3375201592908
+ vertex -9.45750222427951 178.05580458392083 350.9492906850382
+ vertex -9.457487660850528 178.05606596561367 351.72574773221925
+ endloop
+endfacet
+facet normal -0.1305447739053282 -0.0002731117446517049 -0.9914423772544635
+ outer loop
+ vertex -8.008578307465086 178.05576707589302 352.83749208925923
+ vertex -7.620350762431494 178.0555695002439 352.7863736134983
+ vertex -8.01043667088272 174.05576773423874 352.83883865912713
+ endloop
+endfacet
+facet normal -0.1305447739053282 -0.0002731117446517049 -0.9914423772544635
+ outer loop
+ vertex -7.622209125849128 174.0555701585896 352.7877201833663
+ vertex -8.01043667088272 174.05576773423874 352.83883865912713
+ vertex -7.620350762431494 178.0555695002439 352.7863736134983
+ endloop
+endfacet
+facet normal 0.13050758231547635 -0.00039439593641636363 -0.9914472327915465
+ outer loop
+ vertex -8.396807769810477 178.05593023998952 352.7863880554894
+ vertex -8.008578307465086 178.05576707589302 352.83749208925923
+ vertex -8.398666133228108 174.05593089833525 352.7877346253573
+ endloop
+endfacet
+facet normal 0.13050758231547635 -0.00039439593641636363 -0.9914472327915465
+ outer loop
+ vertex -8.01043667088272 174.05576773423874 352.83883865912713
+ vertex -8.398666133228108 174.05593089833525 352.7877346253573
+ vertex -8.008578307465086 178.05576707589302 352.83749208925923
+ endloop
+endfacet
+facet normal 0.38266606247542545 -0.0004888026968843372 -0.9238865978579174
+ outer loop
+ vertex -8.75858195318834 178.05604787316975 352.6365441676368
+ vertex -8.396807769810477 178.05593023998952 352.7863880554894
+ vertex -8.76044031660597 174.05604853151547 352.6378907375048
+ endloop
+endfacet
+facet normal 0.38266606247542545 -0.0004888026968843372 -0.9238865978579174
+ outer loop
+ vertex -8.398666133228108 174.05593089833525 352.7877346253573
+ vertex -8.76044031660597 174.05604853151547 352.6378907375048
+ vertex -8.396807769810477 178.05593023998952 352.7863880554894
+ endloop
+endfacet
+facet normal 0.6087464828633162 -0.0005498983613443156 -0.7933646180750277
+ outer loop
+ vertex -9.069246544861594 178.0561119589269 352.39817203902993
+ vertex -8.75858195318834 178.05604787316975 352.6365441676368
+ vertex -9.071104908279224 174.05611261727262 352.3995186088979
+ endloop
+endfacet
+facet normal 0.6087464828633162 -0.0005498983613443156 -0.7933646180750277
+ outer loop
+ vertex -8.76044031660597 174.05604853151547 352.6378907375048
+ vertex -9.071104908279224 174.05611261727262 352.3995186088979
+ vertex -8.75858195318834 178.05604787316975 352.6365441676368
+ endloop
+endfacet
+facet normal 0.7933418364451362 -0.0005735193612286716 -0.6087761506673871
+ outer loop
+ vertex -9.307630266305209 178.05611812992265 352.0875163363048
+ vertex -9.069246544861594 178.0561119589269 352.39817203902993
+ vertex -9.309488629722841 174.05611878826838 352.0888629061727
+ endloop
+endfacet
+facet normal 0.7933418364451362 -0.0005735193612286716 -0.6087761506673871
+ outer loop
+ vertex -9.071104908279224 174.05611261727262 352.3995186088979
+ vertex -9.309488629722841 174.05611878826838 352.0888629061727
+ vertex -9.069246544861594 178.0561119589269 352.39817203902993
+ endloop
+endfacet
+facet normal 0.9238722549326219 -0.0005580559644308524 -0.38270059464188616
+ outer loop
+ vertex -9.457487660850528 178.05606596561367 351.72574773221925
+ vertex -9.307630266305209 178.05611812992265 352.0875163363048
+ vertex -9.45934602426816 174.05606662395937 351.72709430208715
+ endloop
+endfacet
+facet normal 0.9238722549326219 -0.0005580559644308524 -0.38270059464188616
+ outer loop
+ vertex -9.309488629722841 174.05611878826838 352.0888629061727
+ vertex -9.45934602426816 174.05606662395937 351.72709430208715
+ vertex -9.307630266305209 178.05611812992265 352.0875163363048
+ endloop
+endfacet
+facet normal 0.9914423060175163 -0.0005045619758881765 -0.1305446255342682
+ outer loop
+ vertex -9.508606194710385 178.0559590209115 351.3375201592908
+ vertex -9.457487660850528 178.05606596561367 351.72574773221925
+ vertex -9.510464558128016 174.0559596792572 351.3388667291587
+ endloop
+endfacet
+facet normal 0.9914423060175163 -0.0005045619758881765 -0.1305446255342682
+ outer loop
+ vertex -9.45934602426816 174.05606662395937 351.72709430208715
+ vertex -9.510464558128016 174.0559596792572 351.3388667291587
+ vertex -9.457487660850528 178.05606596561367 351.72574773221925
+ endloop
+endfacet
+facet normal 0.9914472023832055 -0.0004166829225167438 0.13050774406853188
+ outer loop
+ vertex -9.45750222427951 178.05580458392083 350.9492906850382
+ vertex -9.508606194710385 178.0559590209115 351.3375201592908
+ vertex -9.459360587697146 174.05580524226656 350.9506372549061
+ endloop
+endfacet
+facet normal 0.9914472023832055 -0.0004166829225167438 0.13050774406853188
+ outer loop
+ vertex -9.510464558128016 174.0559596792572 351.3388667291587
+ vertex -9.459360587697146 174.05580524226656 350.9506372549061
+ vertex -9.508606194710385 178.0559590209115 351.3375201592908
+ endloop
+endfacet
+facet normal 0.9238866103504938 -0.0003004076165770036 0.3826662265870074
+ outer loop
+ vertex -9.307658400689581 178.05561317926737 350.58751650655216
+ vertex -9.45750222427951 178.05580458392083 350.9492906850382
+ vertex -9.309516764107213 174.05561383761307 350.58886307642007
+ endloop
+endfacet
+facet normal 0.9238866103504938 -0.0003004076165770036 0.3826662265870074
+ outer loop
+ vertex -9.459360587697146 174.05580524226656 350.9506372549061
+ vertex -9.309516764107213 174.05561383761307 350.58886307642007
+ vertex -9.45750222427951 178.05580458392083 350.9492906850382
+ endloop
+endfacet
+facet normal 0.7933646726171032 -0.00016366002801445844 0.608746638149692
+ outer loop
+ vertex -9.069286332889511 178.05539785086188 350.2768519362364
+ vertex -9.307658400689581 178.05561317926737 350.58751650655216
+ vertex -9.071144696307146 174.0553985092076 350.27819850610433
+ endloop
+endfacet
+facet normal 0.7933646726171032 -0.00016366002801445844 0.608746638149692
+ outer loop
+ vertex -9.309516764107213 174.05561383761307 350.58886307642007
+ vertex -9.071144696307146 174.0553985092076 350.27819850610433
+ vertex -9.307658400689581 178.05561317926737 350.58751650655216
+ endloop
+endfacet
+facet normal 0.608776243542086 -1.5759279003825668e-05 0.7933419723236834
+ outer loop
+ vertex -9.069286332889511 178.05539785086188 350.2768519362364
+ vertex -9.071144696307146 174.0553985092076 350.27819850610433
+ vertex -8.758630683371509 178.0551732729795 350.0384682511605
+ endloop
+endfacet
+facet normal 0.608776243542086 -1.5759279003825668e-05 0.7933419723236834
+ outer loop
+ vertex -8.760489046789141 174.0551739313252 350.0398148210285
+ vertex -8.758630683371509 178.0551732729795 350.0384682511605
+ vertex -9.071144696307146 174.0553985092076 350.27819850610433
+ endloop
+endfacet
+facet normal 0.38270071951997275 0.00013321543882750038 0.923872362143463
+ outer loop
+ vertex -8.758630683371509 178.0551732729795 350.0384682511605
+ vertex -8.760489046789141 174.0551739313252 350.0398148210285
+ vertex -8.396862121267423 178.0549547502316 349.8886109055147
+ endloop
+endfacet
+facet normal 0.38270071951997275 0.00013321543882750038 0.923872362143463
+ outer loop
+ vertex -8.398720484685057 174.05495540857729 349.8899574753827
+ vertex -8.396862121267423 178.0549547502316 349.8886109055147
+ vertex -8.760489046789141 174.0551739313252 350.0398148210285
+ endloop
+endfacet
+facet normal 0.1305447739052999 0.00027311174465171934 0.9914423772544672
+ outer loop
+ vertex -8.396862121267423 178.0549547502316 349.8886109055147
+ vertex -8.398720484685057 174.05495540857729 349.8899574753827
+ vertex -8.008634576233833 178.05475717458245 349.83749242975387
+ endloop
+endfacet
+facet normal 0.1305447739052999 0.00027311174465171934 0.9914423772544672
+ outer loop
+ vertex -8.010492939651467 174.05475783292815 349.83883899962177
+ vertex -8.008634576233833 178.05475717458245 349.83749242975387
+ vertex -8.398720484685057 174.05495540857729 349.8899574753827
+ endloop
+endfacet
+facet normal -0.13050758231544804 0.0003943959364163517 0.9914472327915501
+ outer loop
+ vertex -8.008634576233833 178.05475717458245 349.83749242975387
+ vertex -8.010492939651467 174.05475783292815 349.83883899962177
+ vertex -7.620405113888441 178.05459401048597 349.88859646352364
+ endloop
+endfacet
+facet normal -0.13050758231544804 0.0003943959364163517 0.9914472327915501
+ outer loop
+ vertex -7.622263477306075 174.05459466883167 349.8899430333916
+ vertex -7.620405113888441 178.05459401048597 349.88859646352364
+ vertex -8.010492939651467 174.05475783292815 349.83883899962177
+ endloop
+endfacet
+facet normal -0.3826660624754501 0.0004888026968843452 0.9238865978579073
+ outer loop
+ vertex -7.620405113888441 178.05459401048597 349.88859646352364
+ vertex -7.622263477306075 174.05459466883167 349.8899430333916
+ vertex -7.25863093051058 178.05447637730575 350.0384403513762
+ endloop
+endfacet
+facet normal -0.3826660624754501 0.0004888026968843452 0.9238865978579073
+ outer loop
+ vertex -7.260489293928211 174.05447703565144 350.0397869212441
+ vertex -7.25863093051058 178.05447637730575 350.0384403513762
+ vertex -7.622263477306075 174.05459466883167 349.8899430333916
+ endloop
+endfacet
+facet normal -0.6087464828633162 0.0005498983613443156 0.7933646180750277
+ outer loop
+ vertex -7.25863093051058 178.05447637730575 350.0384403513762
+ vertex -7.260489293928211 174.05447703565144 350.0397869212441
+ vertex -6.947966338837327 178.05441229154857 350.27681247998305
+ endloop
+endfacet
+facet normal -0.6087464828633162 0.0005498983613443156 0.7933646180750277
+ outer loop
+ vertex -6.949824702254958 174.05441294989427 350.278159049851
+ vertex -6.947966338837327 178.05441229154857 350.27681247998305
+ vertex -7.260489293928211 174.05447703565144 350.0397869212441
+ endloop
+endfacet
+facet normal -0.7933418364451362 0.0005735193612286716 0.6087761506673871
+ outer loop
+ vertex -6.947966338837327 178.05441229154857 350.27681247998305
+ vertex -6.949824702254958 174.05441294989427 350.278159049851
+ vertex -6.709582617393708 178.0544061205528 350.5874681827082
+ endloop
+endfacet
+facet normal -0.7933418364451362 0.0005735193612286716 0.6087761506673871
+ outer loop
+ vertex -6.711440980811342 174.05440677889854 350.5888147525761
+ vertex -6.709582617393708 178.0544061205528 350.5874681827082
+ vertex -6.949824702254958 174.05441294989427 350.278159049851
+ endloop
+endfacet
+facet normal -0.9238722549326219 0.0005580559644308524 0.38270059464188616
+ outer loop
+ vertex -6.709582617393708 178.0544061205528 350.5874681827082
+ vertex -6.711440980811342 174.05440677889854 350.5888147525761
+ vertex -6.559725222848391 178.0544582848618 350.9492367867938
+ endloop
+endfacet
+facet normal -0.9238722549326219 0.0005580559644308524 0.38270059464188616
+ outer loop
+ vertex -6.561583586266025 174.05445894320752 350.9505833566617
+ vertex -6.559725222848391 178.0544582848618 350.9492367867938
+ vertex -6.711440980811342 174.05440677889854 350.5888147525761
+ endloop
+endfacet
+facet normal -0.9914423060175163 0.0005045619758881765 0.1305446255342682
+ outer loop
+ vertex -6.559725222848391 178.0544582848618 350.9492367867938
+ vertex -6.561583586266025 174.05445894320752 350.9505833566617
+ vertex -6.508606688988532 178.054565229564 351.3374643597222
+ endloop
+endfacet
+facet normal -0.9914423060175163 0.0005045619758881765 0.1305446255342682
+ outer loop
+ vertex -6.510465052406163 174.05456588790972 351.3388109295902
+ vertex -6.508606688988532 178.054565229564 351.3374643597222
+ vertex -6.561583586266025 174.05445894320752 350.9505833566617
+ endloop
+endfacet
+facet normal -0.9914472023832055 0.0004166829225167438 -0.13050774406853188
+ outer loop
+ vertex -6.508606688988532 178.054565229564 351.3374643597222
+ vertex -6.510465052406163 174.05456588790972 351.3388109295902
+ vertex -6.559710659419408 178.05471966655466 351.72569383397484
+ endloop
+endfacet
+facet normal -0.9914472023832055 0.0004166829225167438 -0.13050774406853188
+ outer loop
+ vertex -6.5615690228370385 174.05472032490036 351.72704040384275
+ vertex -6.559710659419408 178.05471966655466 351.72569383397484
+ vertex -6.510465052406163 174.05456588790972 351.3388109295902
+ endloop
+endfacet
+facet normal -0.9238866103504938 0.0003004076165770036 -0.3826662265870074
+ outer loop
+ vertex -6.559710659419408 178.05471966655466 351.72569383397484
+ vertex -6.5615690228370385 174.05472032490036 351.72704040384275
+ vertex -6.709554483009333 178.0549110712081 352.08746801246093
+ endloop
+endfacet
+facet normal -0.9238866103504938 0.0003004076165770036 -0.3826662265870074
+ outer loop
+ vertex -6.71141284642697 174.05491172955382 352.08881458232884
+ vertex -6.709554483009333 178.0549110712081 352.08746801246093
+ vertex -6.5615690228370385 174.05472032490036 351.72704040384275
+ endloop
+endfacet
+facet normal -0.7933646726171032 0.00016366002801445844 -0.608746638149692
+ outer loop
+ vertex -6.709554483009333 178.0549110712081 352.08746801246093
+ vertex -6.71141284642697 174.05491172955382 352.08881458232884
+ vertex -6.9479265508094095 178.05512639961358 352.39813258277667
+ endloop
+endfacet
+facet normal -0.7933646726171032 0.00016366002801445844 -0.608746638149692
+ outer loop
+ vertex -6.94978491422704 174.0551270579593 352.3994791526446
+ vertex -6.9479265508094095 178.05512639961358 352.39813258277667
+ vertex -6.71141284642697 174.05491172955382 352.08881458232884
+ endloop
+endfacet
+facet normal -0.608776243542086 1.5759279003825668e-05 -0.7933419723236834
+ outer loop
+ vertex -7.258582200327414 178.055350977496 352.6365162678525
+ vertex -6.9479265508094095 178.05512639961358 352.39813258277667
+ vertex -7.260440563745044 174.0553516358417 352.63786283772043
+ endloop
+endfacet
+facet normal -0.608776243542086 1.5759279003825668e-05 -0.7933419723236834
+ outer loop
+ vertex -6.94978491422704 174.0551270579593 352.3994791526446
+ vertex -7.260440563745044 174.0553516358417 352.63786283772043
+ vertex -6.9479265508094095 178.05512639961358 352.39813258277667
+ endloop
+endfacet
+facet normal -0.3827007195199482 -0.00013321543882751526 -0.9238723621434733
+ outer loop
+ vertex -7.620350762431494 178.0555695002439 352.7863736134983
+ vertex -7.258582200327414 178.055350977496 352.6365162678525
+ vertex -7.622209125849128 174.0555701585896 352.7877201833663
+ endloop
+endfacet
+facet normal -0.3827007195199482 -0.00013321543882751526 -0.9238723621434733
+ outer loop
+ vertex -7.260440563745044 174.0553516358417 352.63786283772043
+ vertex -7.622209125849128 174.0555701585896 352.7877201833663
+ vertex -7.258582200327414 178.055350977496 352.6365162678525
+ endloop
+endfacet
+facet normal 0.9999999998270226 1.107962124282345e-14 -1.8599859248019e-05
+ outer loop
+ vertex -3.997969090625584 182.04038513132514 345.0887668428439
+ vertex -3.9979690906256034 184.04085388264915 345.0887668428439
+ vertex -3.997364595200023 182.04038513132514 377.5887668372222
+ endloop
+endfacet
+facet normal 0.9999999998270226 1.107962124282345e-14 -1.8599859248019e-05
+ outer loop
+ vertex -3.997364595200043 184.04085388264912 377.5887668372222
+ vertex -3.997364595200023 182.04038513132514 377.5887668372222
+ vertex -3.9979690906256034 184.04085388264915 345.0887668428439
+ endloop
+endfacet
+facet normal -1.859985936411889e-05 0.9999999998270226 3.459555267179288e-10
+ outer loop
+ vertex -2.4974278380028263 182.04041302993787 377.5887389386096
+ vertex -2.4980323334283865 182.0404130299379 345.0887389442313
+ vertex -3.997364595200023 182.04038513132514 377.5887668372222
+ endloop
+endfacet
+facet normal -1.859985936411889e-05 0.9999999998270226 3.459555267179288e-10
+ outer loop
+ vertex -3.997969090625584 182.04038513132514 345.0887668428439
+ vertex -3.997364595200023 182.04038513132514 377.5887668372222
+ vertex -2.4980323334283865 182.0404130299379 345.0887389442313
+ endloop
+endfacet
+facet normal 0.9999999978272129 6.324254313170525e-05 -1.8599859210821353e-05
+ outer loop
+ vertex -2.497969090885266 181.0404130319375 345.08873894305503
+ vertex -2.4980323334283865 182.0404130299379 345.0887389442313
+ vertex -2.4973645954597052 181.04041303193748 377.58873893743333
+ endloop
+endfacet
+facet normal 0.9999999978272129 6.324254313170525e-05 -1.8599859210821353e-05
+ outer loop
+ vertex -2.4974278380028263 182.04041302993787 377.5887389386096
+ vertex -2.4973645954597052 181.04041303193748 377.58873893743333
+ vertex -2.4980323334283865 182.0404130299379 345.0887389442313
+ endloop
+endfacet
+facet normal 6.324254336259922e-05 -0.9999999980001903 -1.1763031656870195e-09
+ outer loop
+ vertex -2.497969090885266 181.0404130319375 345.08873894305503
+ vertex -2.4973645954597052 181.04041303193748 377.58873893743333
+ vertex -3.997969090625609 181.04031816812224 345.0887668428439
+ endloop
+endfacet
+facet normal 6.324254336259922e-05 -0.9999999980001903 -1.1763031656870195e-09
+ outer loop
+ vertex -3.9973645952000485 181.04031816812224 377.5887668372222
+ vertex -3.997969090625609 181.04031816812224 345.0887668428439
+ vertex -2.4973645954597052 181.04041303193748 377.58873893743333
+ endloop
+endfacet
+facet normal 0.9999999998266912 8.142441676549828e-07 -1.8599859248011412e-05
+ outer loop
+ vertex -3.9979678692461733 179.5403019724304 345.08876684282114
+ vertex -3.997969090625609 181.04031816812224 345.0887668428439
+ vertex -3.9973633738206127 179.54030197243037 377.5887668371995
+ endloop
+endfacet
+facet normal 0.9999999998266912 8.142441676549828e-07 -1.8599859248011412e-05
+ outer loop
+ vertex -3.9973645952000485 181.04031816812224 377.5887668372222
+ vertex -3.9973633738206127 179.54030197243037 377.5887668371995
+ vertex -3.997969090625609 181.04031816812224 345.0887668428439
+ endloop
+endfacet
+facet normal 0.9999997905546839 0.0006469502561555169 -1.8599855355581038e-05
+ outer loop
+ vertex -3.9979251828280624 179.4743209966488 345.0887668420272
+ vertex -3.9979678692461733 179.5403019724304 345.08876684282114
+ vertex -3.997320687402502 179.47432099664877 377.5887668364055
+ endloop
+endfacet
+facet normal 0.9999997905546839 0.0006469502561555169 -1.8599855355581038e-05
+ outer loop
+ vertex -3.9973633738206127 179.54030197243037 377.5887668371995
+ vertex -3.997320687402502 179.47432099664877 377.5887668364055
+ vertex -3.9979678692461733 179.5403019724304 345.08876684282114
+ endloop
+endfacet
+facet normal 0.9658394493491518 0.2591411927081545 -1.7964477816987412e-05
+ outer loop
+ vertex -3.963810010340058 179.3471710862956 345.08876620748975
+ vertex -3.9979251828280624 179.4743209966488 345.0887668420272
+ vertex -3.9632055149144976 179.34717108629556 377.5887662018681
+ endloop
+endfacet
+facet normal 0.9658394493491518 0.2591411927081545 -1.7964477816987412e-05
+ outer loop
+ vertex -3.997320687402502 179.47432099664877 377.5887668364055
+ vertex -3.9632055149144976 179.34717108629556 377.5887662018681
+ vertex -3.9979251828280624 179.4743209966488 345.0887668420272
+ endloop
+endfacet
+facet normal 0.865858592143704 0.5002888147376044 -1.610484794496488e-05
+ outer loop
+ vertex -3.8979484657891326 179.23318336044383 345.0887649824743
+ vertex -3.963810010340058 179.3471710862956 345.08876620748975
+ vertex -3.897343970363572 179.2331833604438 377.5887649768526
+ endloop
+endfacet
+facet normal 0.865858592143704 0.5002888147376044 -1.610484794496488e-05
+ outer loop
+ vertex -3.9632055149144976 179.34717108629556 377.5887662018681
+ vertex -3.897343970363572 179.2331833604438 377.5887649768526
+ vertex -3.963810010340058 179.3471710862956 345.08876620748975
+ endloop
+endfacet
+facet normal 0.7068709027842218 0.707342580808025 -1.3147699300041998e-05
+ outer loop
+ vertex -3.804224409169252 179.14012589423575 377.5887632448419
+ vertex -3.8048289045948125 179.14012589423578 345.08876325046356
+ vertex -3.897343970363572 179.2331833604438 377.5887649768526
+ endloop
+endfacet
+facet normal 0.7068709027842218 0.707342580808025 -1.3147699300041998e-05
+ outer loop
+ vertex -3.8979484657891326 179.23318336044383 345.0887649824743
+ vertex -3.897343970363572 179.2331833604438 377.5887649768526
+ vertex -3.8048289045948125 179.14012589423578 345.08876325046356
+ endloop
+endfacet
+facet normal 0.49971112955553815 0.866192118938945 -9.294556675349937e-06
+ outer loop
+ vertex -3.6901927755392765 179.07434040020954 377.58876112386963
+ vertex -3.690797270964837 179.07434040020956 345.0887611294913
+ vertex -3.804224409169252 179.14012589423575 377.5887632448419
+ endloop
+endfacet
+facet normal 0.49971112955553815 0.866192118938945 -9.294556675349937e-06
+ outer loop
+ vertex -3.8048289045948125 179.14012589423578 345.08876325046356
+ vertex -3.804224409169252 179.14012589423575 377.5887632448419
+ vertex -3.690797270964837 179.07434040020956 345.0887611294913
+ endloop
+endfacet
+facet normal 0.2584968686625305 0.9660120956119286 -4.8080053732734225e-06
+ outer loop
+ vertex -3.5630201368596572 179.040310051067 377.5887587584764
+ vertex -3.563624632285218 179.04031005106702 345.0887587640981
+ vertex -3.6901927755392765 179.07434040020954 377.58876112386963
+ endloop
+endfacet
+facet normal 0.2584968686625305 0.9660120956119286 -4.8080053732734225e-06
+ outer loop
+ vertex -3.690797270964837 179.07434040020956 345.0887611294913
+ vertex -3.6901927755392765 179.07434040020954 377.58876112386963
+ vertex -3.563624632285218 179.04031005106702 345.0887587640981
+ endloop
+endfacet
+facet normal -1.859986199221425e-05 0.9999999998270226 3.459555756001326e-10
+ outer loop
+ vertex -3.4973540740639915 179.0403112724467 377.5887575370969
+ vertex -3.4979585694895516 179.04031127244673 345.08875754271855
+ vertex -3.5630201368596572 179.040310051067 377.5887587584764
+ endloop
+endfacet
+facet normal -1.859986199221425e-05 0.9999999998270226 3.459555756001326e-10
+ outer loop
+ vertex -3.563624632285218 179.04031005106702 345.0887587640981
+ vertex -3.5630201368596572 179.040310051067 377.5887587584764
+ vertex -3.4979585694895516 179.04031127244673 345.08875754271855
+ endloop
+endfacet
+facet normal -1.859985923559171e-05 0.9999999998270226 3.459555243273413e-10
+ outer loop
+ vertex 7.502645922130445 179.0405158708983 377.5885529386452
+ vertex 7.502041426704885 179.04051587089833 345.08855294426684
+ vertex -3.4973540740639915 179.0403112724467 377.5887575370969
+ endloop
+endfacet
+facet normal -1.859985923559171e-05 0.9999999998270226 3.459555243273413e-10
+ outer loop
+ vertex -3.4979585694895516 179.04031127244673 345.08875754271855
+ vertex -3.4973540740639915 179.0403112724467 377.5887575370969
+ vertex 7.502041426704885 179.04051587089833 345.08855294426684
+ endloop
+endfacet
+facet normal -1.8599857829209958e-05 0.9999999998270226 3.459554981688387e-10
+ outer loop
+ vertex 7.566437711850807 179.04051705741654 377.5885517521269
+ vertex 7.565833216425247 179.04051705741657 345.0885517577485
+ vertex 7.502645922130445 179.0405158708983 377.5885529386452
+ endloop
+endfacet
+facet normal -1.8599857829209958e-05 0.9999999998270226 3.459554981688387e-10
+ outer loop
+ vertex 7.502041426704885 179.04051587089833 345.08855294426684
+ vertex 7.502645922130445 179.0405158708983 377.5885529386452
+ vertex 7.565833216425247 179.04051705741657 345.0885517577485
+ endloop
+endfacet
+facet normal -0.25496964087551244 0.9669490587457654 4.742399434357767e-06
+ outer loop
+ vertex 7.693672957852187 179.07406704094203 377.5885493855692
+ vertex 7.693068462426626 179.07406704094205 345.0885493911909
+ vertex 7.566437711850807 179.04051705741654 377.5885517521269
+ endloop
+endfacet
+facet normal -0.25496964087551244 0.9669490587457654 4.742399434357767e-06
+ outer loop
+ vertex 7.565833216425247 179.04051705741657 345.0885517577485
+ vertex 7.566437711850807 179.04051705741654 377.5885517521269
+ vertex 7.693068462426626 179.07406704094205 345.0885493911909
+ endloop
+endfacet
+facet normal -0.4965465930448009 0.8680100695558219 9.235696742973609e-06
+ outer loop
+ vertex 7.807889393281262 179.13940474137982 377.5885472611596
+ vertex 7.807284897855701 179.13940474137985 345.0885472667813
+ vertex 7.693672957852187 179.07406704094203 377.5885493855692
+ endloop
+endfacet
+facet normal -0.4965465930448009 0.8680100695558219 9.235696742973609e-06
+ outer loop
+ vertex 7.693068462426626 179.07406704094205 345.0885493911909
+ vertex 7.693672957852187 179.07406704094203 377.5885493855692
+ vertex 7.807284897855701 179.13940474137985 345.0885472667813
+ endloop
+endfacet
+facet normal -0.7042847154822498 0.709917628578476 1.3099596581305747e-05
+ outer loop
+ vertex 7.9013033568152276 179.23207750242128 377.588545523673
+ vertex 7.900698861389667 179.23207750242128 345.0885455292947
+ vertex 7.807889393281262 179.13940474137982 377.5885472611596
+ endloop
+endfacet
+facet normal -0.7042847154822498 0.709917628578476 1.3099596581305747e-05
+ outer loop
+ vertex 7.807284897855701 179.13940474137985 345.0885472667813
+ vertex 7.807889393281262 179.13940474137982 377.5885472611596
+ vertex 7.900698861389667 179.23207750242128 345.0885455292947
+ endloop
+endfacet
+facet normal -0.8640269984419703 0.5034454744111715 1.607078056067048e-05
+ outer loop
+ vertex 7.9669443457878275 179.3457698285498 345.088544297138
+ vertex 7.900698861389667 179.23207750242128 345.0885455292947
+ vertex 7.967548841213389 179.34576982854978 377.5885442915163
+ endloop
+endfacet
+facet normal -0.8640269984419703 0.5034454744111715 1.607078056067048e-05
+ outer loop
+ vertex 7.9013033568152276 179.23207750242128 377.588545523673
+ vertex 7.967548841213389 179.34576982854978 377.5885442915163
+ vertex 7.900698861389667 179.23207750242128 345.0885455292947
+ endloop
+endfacet
+facet normal -0.9648872693327225 0.2626643431407393 1.7946767403096795e-05
+ outer loop
+ vertex 8.001506830763631 179.4727337756255 345.0885436542806
+ vertex 7.9669443457878275 179.3457698285498 345.088544297138
+ vertex 8.002111326189192 179.47273377562547 377.58854364865897
+ endloop
+endfacet
+facet normal -0.9648872693327225 0.2626643431407393 1.7946767403096795e-05
+ outer loop
+ vertex 7.967548841213389 179.34576982854978 377.5885442915163
+ vertex 8.002111326189192 179.47273377562547 377.58854364865897
+ vertex 7.9669443457878275 179.3457698285498 345.088544297138
+ endloop
+endfacet
+facet normal -0.9999999495333091 0.00031715520572741504 1.859985831256183e-05
+ outer loop
+ vertex 8.002004217793587 181.04101011492224 345.08854364502935
+ vertex 8.001506830763631 179.4727337756255 345.0885436542806
+ vertex 8.002608713219148 181.04101011492222 377.58854363940765
+ endloop
+endfacet
+facet normal -0.9999999495333091 0.00031715520572741504 1.859985831256183e-05
+ outer loop
+ vertex 8.002111326189192 179.47273377562547 377.58854364865897
+ vertex 8.002608713219148 181.04101011492222 377.58854363940765
+ vertex 8.001506830763631 179.4727337756255 345.0885436542806
+ endloop
+endfacet
+facet normal 1.8599859303956322e-05 -0.9999999998270226 -3.4595552559891354e-10
+ outer loop
+ vertex 8.002004217793587 181.04101011492224 345.08854364502935
+ vertex 8.002608713219148 181.04101011492222 377.58854363940765
+ vertex 6.5020488609965295 181.04098221596362 345.0885715439878
+ endloop
+endfacet
+facet normal 1.8599859303956322e-05 -0.9999999998270226 -3.4595552559891354e-10
+ outer loop
+ vertex 6.5026533564220905 181.0409822159636 377.5885715383662
+ vertex 6.5020488609965295 181.04098221596362 345.0885715439878
+ vertex 8.002608713219148 181.04101011492222 377.58854363940765
+ endloop
+endfacet
+facet normal -0.999999997827213 -6.324254340242607e-05 1.8599859210821353e-05
+ outer loop
+ vertex 6.501985618453139 182.04098221396393 345.08857154516414
+ vertex 6.5020488609965295 181.04098221596362 345.0885715439878
+ vertex 6.502590113878699 182.0409822139639 377.58857153954244
+ endloop
+endfacet
+facet normal -0.999999997827213 -6.324254340242607e-05 1.8599859210821353e-05
+ outer loop
+ vertex 6.5026533564220905 181.0409822159636 377.5885715383662
+ vertex 6.502590113878699 182.0409822139639 377.58857153954244
+ vertex 6.5020488609965295 181.04098221596362 345.0885715439878
+ endloop
+endfacet
+facet normal -6.324254316674298e-05 0.9999999980001905 1.1763031620441208e-09
+ outer loop
+ vertex 8.002590112114401 182.04107707777877 377.5885436397536
+ vertex 8.00198561668884 182.0410770777788 345.0885436453753
+ vertex 6.502590113878699 182.0409822139639 377.58857153954244
+ endloop
+endfacet
+facet normal -6.324254316674298e-05 0.9999999980001905 1.1763031620441208e-09
+ outer loop
+ vertex 6.501985618453139 182.04098221396393 345.08857154516414
+ vertex 6.502590113878699 182.0409822139639 377.58857153954244
+ vertex 8.00198561668884 182.0410770777788 345.0885436453753
+ endloop
+endfacet
+facet normal -0.9999999996540453 -1.8599859246792854e-05 1.859985924480163e-05
+ outer loop
+ vertex 8.001948416970317 184.04107707942603 345.0885436460672
+ vertex 8.00198561668884 182.0410770777788 345.0885436453753
+ vertex 8.002552912395876 184.041077079426 377.58854364044555
+ endloop
+endfacet
+facet normal -0.9999999996540453 -1.8599859246792854e-05 1.859985924480163e-05
+ outer loop
+ vertex 8.002590112114401 182.04107707777877 377.5885436397536
+ vertex 8.002552912395876 184.041077079426 377.58854364044555
+ vertex 8.00198561668884 182.0410770777788 345.0885436453753
+ endloop
+endfacet
+facet normal -1.85998592197347e-05 0.9999999998270226 3.4595554154323375e-10
+ outer loop
+ vertex -3.997364595200043 184.04085388264912 377.5887668372222
+ vertex -3.9979690906256034 184.04085388264915 345.0887668428439
+ vertex -11.498352285242461 184.040714365334 377.58890635453747
+ endloop
+endfacet
+facet normal -1.85998592197347e-05 0.9999999998270226 3.4595554154323375e-10
+ outer loop
+ vertex -11.498956780668024 184.04071436533403 345.08890636015917
+ vertex -11.498352285242461 184.040714365334 377.58890635453747
+ vertex -3.9979690906256034 184.04085388264915 345.0887668428439
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 3.455069140308254 186.39754406618027 -62.60000000000005
+ vertex 3.855069140308196 184.99754406618027 -62.60000000000005
+ vertex 3.455069140308196 184.99754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 3.855069140308196 184.99754406618027 -62.60000000000005
+ vertex 3.455069140308254 186.39754406618027 -62.60000000000005
+ vertex 7.440958668144235 185.25206274411778 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 3.855069140308196 184.99754406618027 -62.60000000000005
+ vertex 7.440958668144235 185.25206274411778 -62.60000000000005
+ vertex 7.855069140308268 185.19754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 3.855069140308196 184.99754406618027 -62.60000000000005
+ vertex 7.855069140308268 185.19754406618028 -62.60000000000005
+ vertex 9.921094544092673 185.09754406618026 -62.600000000000044
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 7.440958668144235 185.25206274411778 -62.60000000000005
+ vertex 3.455069140308254 186.39754406618027 -62.60000000000005
+ vertex 7.0550691403082455 185.41190342012518 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 7.0550691403082455 185.41190342012518 -62.60000000000005
+ vertex 3.455069140308254 186.39754406618027 -62.60000000000005
+ vertex 6.723698290409774 185.6661732162818 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 6.723698290409774 185.6661732162818 -62.60000000000005
+ vertex 3.455069140308254 186.39754406618027 -62.60000000000005
+ vertex 6.469428494253137 185.9975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 6.469428494253137 185.9975440661803 -62.60000000000005
+ vertex 3.455069140308254 186.39754406618027 -62.60000000000005
+ vertex 6.309587818245743 186.38343359401625 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 6.309587818245743 186.38343359401625 -62.60000000000005
+ vertex 3.455069140308254 186.39754406618027 -62.60000000000005
+ vertex 5.655069140308249 186.39754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 6.309587818245743 186.38343359401625 -62.60000000000005
+ vertex 5.655069140308249 186.39754406618027 -62.60000000000005
+ vertex 6.255069140308248 186.79754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 6.255069140308248 186.79754406618028 -62.60000000000005
+ vertex 5.655069140308249 186.39754406618027 -62.60000000000005
+ vertex 5.6550691403082505 188.431858641231 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 6.255069140308248 186.79754406618028 -62.60000000000005
+ vertex 5.6550691403082505 188.431858641231 -62.60000000000005
+ vertex 6.309587818245721 187.21165453834433 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 6.309587818245721 187.21165453834433 -62.60000000000005
+ vertex 5.6550691403082505 188.431858641231 -62.60000000000005
+ vertex 6.469428494253139 187.5975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 6.469428494253139 187.5975440661803 -62.60000000000005
+ vertex 5.6550691403082505 188.431858641231 -62.60000000000005
+ vertex 6.723698290409754 187.92891491607875 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 6.723698290409754 187.92891491607875 -62.60000000000005
+ vertex 5.6550691403082505 188.431858641231 -62.60000000000005
+ vertex 7.055069140308225 188.1831847122354 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 7.055069140308225 188.1831847122354 -62.60000000000005
+ vertex 5.6550691403082505 188.431858641231 -62.60000000000005
+ vertex 7.440958668144192 188.3430253882428 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 7.440958668144192 188.3430253882428 -62.60000000000005
+ vertex 5.6550691403082505 188.431858641231 -62.60000000000005
+ vertex 7.855069140308223 188.3975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -6.144930859691763 186.7975440661803 -62.60000000000005
+ vertex -5.544930859691772 186.3975440661803 -62.60000000000005
+ vertex -6.199449537629252 186.38343359401625 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -5.544930859691772 186.3975440661803 -62.60000000000005
+ vertex -6.144930859691763 186.7975440661803 -62.60000000000005
+ vertex -5.544930859691769 188.43185864123106 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -5.544930859691769 188.43185864123106 -62.60000000000005
+ vertex -6.144930859691763 186.7975440661803 -62.60000000000005
+ vertex -6.199449537629255 187.21165453834433 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -5.544930859691769 188.43185864123106 -62.60000000000005
+ vertex -6.199449537629255 187.21165453834433 -62.60000000000005
+ vertex -6.359290213636666 187.59754406618032 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -5.544930859691769 188.43185864123106 -62.60000000000005
+ vertex -6.359290213636666 187.59754406618032 -62.60000000000005
+ vertex -6.613560009793298 187.92891491607878 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -5.544930859691769 188.43185864123106 -62.60000000000005
+ vertex -6.613560009793298 187.92891491607878 -62.60000000000005
+ vertex -6.944930859691778 188.1831847122354 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -5.544930859691769 188.43185864123106 -62.60000000000005
+ vertex -6.944930859691778 188.1831847122354 -62.60000000000005
+ vertex -7.330820387527747 188.3430253882428 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -5.544930859691769 188.43185864123106 -62.60000000000005
+ vertex -7.330820387527747 188.3430253882428 -62.60000000000005
+ vertex -7.7449308596917845 188.39754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -9.203749904794295 184.63161823989122 -62.60000000000005
+ vertex -3.7449308596917725 184.59754406618026 -62.60000000000005
+ vertex -8.944930859691771 184.5975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.7449308596917725 184.59754406618026 -62.60000000000005
+ vertex -9.203749904794295 184.63161823989122 -62.60000000000005
+ vertex -3.7449308596917725 184.99754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.7449308596917725 184.99754406618027 -62.60000000000005
+ vertex -9.203749904794295 184.63161823989122 -62.60000000000005
+ vertex -9.444930859691773 184.73151866239584 -62.600000000000065
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.7449308596917725 184.99754406618027 -62.60000000000005
+ vertex -9.444930859691773 184.73151866239584 -62.600000000000065
+ vertex -9.652037640878321 184.89043728499374 -62.600000000000065
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.7449308596917725 184.99754406618027 -62.60000000000005
+ vertex -9.652037640878321 184.89043728499374 -62.600000000000065
+ vertex -9.810956263476214 185.0975440661803 -62.600000000000065
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.7449308596917725 184.99754406618027 -62.60000000000005
+ vertex -9.810956263476214 185.0975440661803 -62.600000000000065
+ vertex -3.344930859691773 184.99754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.344930859691773 184.99754406618027 -62.60000000000005
+ vertex -9.810956263476214 185.0975440661803 -62.600000000000065
+ vertex -7.744930859691757 185.19754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.344930859691773 184.99754406618027 -62.60000000000005
+ vertex -7.744930859691757 185.19754406618028 -62.60000000000005
+ vertex -7.330820387527722 185.25206274411778 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.344930859691773 184.99754406618027 -62.60000000000005
+ vertex -7.330820387527722 185.25206274411778 -62.60000000000005
+ vertex -3.344930859691773 186.39754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.344930859691773 186.39754406618027 -62.60000000000005
+ vertex -7.330820387527722 185.25206274411778 -62.60000000000005
+ vertex -6.944930859691755 185.41190342012518 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.344930859691773 186.39754406618027 -62.60000000000005
+ vertex -6.944930859691755 185.41190342012518 -62.60000000000005
+ vertex -6.613560009793279 185.6661732162818 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.344930859691773 186.39754406618027 -62.60000000000005
+ vertex -6.613560009793279 185.6661732162818 -62.60000000000005
+ vertex -6.359290213636655 185.9975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.344930859691773 186.39754406618027 -62.60000000000005
+ vertex -6.359290213636655 185.9975440661803 -62.60000000000005
+ vertex -6.199449537629252 186.38343359401625 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.344930859691773 186.39754406618027 -62.60000000000005
+ vertex -6.199449537629252 186.38343359401625 -62.60000000000005
+ vertex -5.544930859691772 186.3975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -9.944930859691764 203.5975440661803 -62.60000000000005
+ vertex -9.544930859691767 198.3975440661803 -62.60000000000005
+ vertex -9.944930859691766 198.3975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -9.544930859691767 198.3975440661803 -62.60000000000005
+ vertex -9.944930859691764 203.5975440661803 -62.60000000000005
+ vertex -9.290412181754272 201.98343359401625 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -9.544930859691767 198.3975440661803 -62.60000000000005
+ vertex -9.290412181754272 201.98343359401625 -62.60000000000005
+ vertex -9.130571505746877 201.5975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -9.544930859691767 198.3975440661803 -62.60000000000005
+ vertex -9.130571505746877 201.5975440661803 -62.60000000000005
+ vertex -8.144930859691767 200.19754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -8.144930859691767 200.19754406618028 -62.60000000000005
+ vertex -9.130571505746877 201.5975440661803 -62.60000000000005
+ vertex -8.876301709590237 201.2661732162818 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -8.144930859691767 200.19754406618028 -62.60000000000005
+ vertex -8.876301709590237 201.2661732162818 -62.60000000000005
+ vertex -8.544930859691766 201.01190342012518 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -8.144930859691767 200.19754406618028 -62.60000000000005
+ vertex -8.544930859691766 201.01190342012518 -62.60000000000005
+ vertex -8.1590413318558 200.85206274411777 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -8.144930859691767 200.19754406618028 -62.60000000000005
+ vertex -8.1590413318558 200.85206274411777 -62.60000000000005
+ vertex -6.110616284641007 200.19754406618026 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -6.110616284641007 200.19754406618026 -62.60000000000005
+ vertex -8.1590413318558 200.85206274411777 -62.60000000000005
+ vertex -7.744930859691745 200.79754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -6.110616284641007 200.19754406618026 -62.60000000000005
+ vertex -7.744930859691745 200.79754406618028 -62.60000000000005
+ vertex -5.544930859691772 200.76322949112952 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -9.290412181754272 201.98343359401625 -62.60000000000005
+ vertex -9.944930859691764 203.5975440661803 -62.60000000000005
+ vertex -9.344930859691765 202.39754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -9.344930859691765 202.39754406618027 -62.60000000000005
+ vertex -9.944930859691764 203.5975440661803 -62.60000000000005
+ vertex -9.290412181754292 202.81165453834433 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -9.290412181754292 202.81165453834433 -62.60000000000005
+ vertex -9.944930859691764 203.5975440661803 -62.60000000000005
+ vertex -9.130571505746875 203.19754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -9.130571505746875 203.19754406618028 -62.60000000000005
+ vertex -9.944930859691764 203.5975440661803 -62.60000000000005
+ vertex -8.876301709590258 203.52891491607872 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -8.876301709590258 203.52891491607872 -62.60000000000005
+ vertex -9.944930859691764 203.5975440661803 -62.60000000000005
+ vertex -8.544930859691787 203.7831847122354 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -8.544930859691787 203.7831847122354 -62.60000000000005
+ vertex -9.944930859691764 203.5975440661803 -62.60000000000005
+ vertex -9.910856685980832 203.8563631112828 -62.600000000000044
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -8.544930859691787 203.7831847122354 -62.60000000000005
+ vertex -9.910856685980832 203.8563631112828 -62.600000000000044
+ vertex -8.15904133185582 203.94302538824277 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -8.15904133185582 203.94302538824277 -62.60000000000005
+ vertex -9.910856685980832 203.8563631112828 -62.600000000000044
+ vertex -9.810956263476202 204.0975440661803 -62.60000000000003
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -8.15904133185582 203.94302538824277 -62.60000000000005
+ vertex -9.810956263476202 204.0975440661803 -62.60000000000003
+ vertex -7.744930859691788 203.9975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -9.652037640878309 204.30465084736684 -62.60000000000003
+ vertex -3.744930859691761 204.1975440661803 -62.60000000000005
+ vertex -9.810956263476202 204.0975440661803 -62.60000000000003
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.744930859691761 204.1975440661803 -62.60000000000005
+ vertex -9.652037640878309 204.30465084736684 -62.60000000000003
+ vertex -3.744930859691761 204.5975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.744930859691761 204.5975440661803 -62.60000000000005
+ vertex -9.652037640878309 204.30465084736684 -62.60000000000003
+ vertex -9.444930859691762 204.46356946996474 -62.60000000000002
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.744930859691761 204.5975440661803 -62.60000000000005
+ vertex -9.444930859691762 204.46356946996474 -62.60000000000002
+ vertex -9.203749904794282 204.56346989246933 -62.60000000000002
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.744930859691761 204.5975440661803 -62.60000000000005
+ vertex -9.203749904794282 204.56346989246933 -62.60000000000002
+ vertex -8.94493085969176 204.5975440661803 -62.60000000000002
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -5.544930859691772 200.76322949112952 -62.60000000000005
+ vertex -6.359290213636661 201.59754406618032 -62.60000000000005
+ vertex -5.544930859691769 202.79754406618025 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -6.359290213636661 201.59754406618032 -62.60000000000005
+ vertex -5.544930859691772 200.76322949112952 -62.60000000000005
+ vertex -6.613560009793275 201.26617321628183 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -6.613560009793275 201.26617321628183 -62.60000000000005
+ vertex -5.544930859691772 200.76322949112952 -62.60000000000005
+ vertex -6.9449308596917465 201.0119034201252 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -6.9449308596917465 201.0119034201252 -62.60000000000005
+ vertex -5.544930859691772 200.76322949112952 -62.60000000000005
+ vertex -7.330820387527713 200.85206274411777 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -7.330820387527713 200.85206274411777 -62.60000000000005
+ vertex -5.544930859691772 200.76322949112952 -62.60000000000005
+ vertex -7.744930859691745 200.79754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -5.544930859691769 202.79754406618025 -62.60000000000005
+ vertex -6.359290213636661 201.59754406618032 -62.60000000000005
+ vertex -6.199449537629244 201.98343359401625 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -5.544930859691769 202.79754406618025 -62.60000000000005
+ vertex -6.199449537629244 201.98343359401625 -62.60000000000005
+ vertex -6.144930859691768 202.3975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -5.544930859691769 202.79754406618025 -62.60000000000005
+ vertex -6.144930859691768 202.3975440661803 -62.60000000000005
+ vertex -6.199449537629263 202.81165453834433 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -5.544930859691769 202.79754406618025 -62.60000000000005
+ vertex -6.199449537629263 202.81165453834433 -62.60000000000005
+ vertex -3.344930859691773 202.79754406618025 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.344930859691773 202.79754406618025 -62.60000000000005
+ vertex -6.199449537629263 202.81165453834433 -62.60000000000005
+ vertex -3.344930859691762 204.1975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.344930859691762 204.1975440661803 -62.60000000000005
+ vertex -6.199449537629263 202.81165453834433 -62.60000000000005
+ vertex -6.359290213636658 203.1975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.344930859691762 204.1975440661803 -62.60000000000005
+ vertex -6.359290213636658 203.1975440661803 -62.60000000000005
+ vertex -6.613560009793296 203.52891491607878 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.344930859691762 204.1975440661803 -62.60000000000005
+ vertex -6.613560009793296 203.52891491607878 -62.60000000000005
+ vertex -6.944930859691767 203.7831847122354 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.344930859691762 204.1975440661803 -62.60000000000005
+ vertex -6.944930859691767 203.7831847122354 -62.60000000000005
+ vertex -7.330820387527756 203.94302538824277 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.344930859691762 204.1975440661803 -62.60000000000005
+ vertex -7.330820387527756 203.94302538824277 -62.60000000000005
+ vertex -7.744930859691788 203.9975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.344930859691762 204.1975440661803 -62.60000000000005
+ vertex -7.744930859691788 203.9975440661803 -62.60000000000005
+ vertex -9.810956263476202 204.0975440661803 -62.60000000000003
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.344930859691762 204.1975440661803 -62.60000000000005
+ vertex -9.810956263476202 204.0975440661803 -62.60000000000003
+ vertex -3.744930859691761 204.1975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 3.189383715358996 190.89754406618025 -62.60000000000005
+ vertex 6.220754565257486 188.99754406618027 -62.60000000000005
+ vertex 5.6550691403082505 188.431858641231 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 6.220754565257486 188.99754406618027 -62.60000000000005
+ vertex 3.189383715358996 190.89754406618025 -62.60000000000005
+ vertex 3.7550691403082315 191.46322949112954 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 3.7550691403082315 191.46322949112954 -62.60000000000005
+ vertex 3.189383715358996 190.89754406618025 -62.60000000000005
+ vertex -3.079245434742501 190.89754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 3.7550691403082315 191.46322949112954 -62.60000000000005
+ vertex -3.079245434742501 190.89754406618027 -62.60000000000005
+ vertex -3.6449308596917698 191.4632294911295 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 3.7550691403082315 191.46322949112954 -62.60000000000005
+ vertex -3.6449308596917698 191.4632294911295 -62.60000000000005
+ vertex 0.055069140308233296 191.89754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 0.055069140308233296 191.89754406618027 -62.60000000000005
+ vertex -3.6449308596917698 191.4632294911295 -62.60000000000005
+ vertex -0.6437422814685734 191.98954433519978 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -0.6437422814685734 191.98954433519978 -62.60000000000005
+ vertex -3.6449308596917698 191.4632294911295 -62.60000000000005
+ vertex -1.294930859691767 192.2592754759623 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -1.294930859691767 192.2592754759623 -62.60000000000005
+ vertex -3.6449308596917698 191.4632294911295 -62.60000000000005
+ vertex -1.854119168895446 192.6883557569766 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -1.854119168895446 192.6883557569766 -62.60000000000005
+ vertex -3.6449308596917698 191.4632294911295 -62.60000000000005
+ vertex -2.2831994499097514 193.24754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -2.2831994499097514 193.24754406618027 -62.60000000000005
+ vertex -3.6449308596917698 191.4632294911295 -62.60000000000005
+ vertex -2.552930590672251 193.89873264440348 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -2.552930590672251 193.89873264440348 -62.60000000000005
+ vertex -3.6449308596917698 191.4632294911295 -62.60000000000005
+ vertex -3.644930859691753 197.73185864123099 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -2.552930590672251 193.89873264440348 -62.60000000000005
+ vertex -3.644930859691753 197.73185864123099 -62.60000000000005
+ vertex -2.644930859691766 194.59754406618026 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -2.644930859691766 194.59754406618026 -62.60000000000005
+ vertex -3.644930859691753 197.73185864123099 -62.60000000000005
+ vertex -2.5529305906722497 195.2963554879571 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -2.5529305906722497 195.2963554879571 -62.60000000000005
+ vertex -3.644930859691753 197.73185864123099 -62.60000000000005
+ vertex -2.28319944990975 195.94754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -2.28319944990975 195.94754406618028 -62.60000000000005
+ vertex -3.644930859691753 197.73185864123099 -62.60000000000005
+ vertex -1.8541191688954417 196.50673237538396 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -1.8541191688954417 196.50673237538396 -62.60000000000005
+ vertex -3.644930859691753 197.73185864123099 -62.60000000000005
+ vertex -1.2949308596917628 196.93581265639824 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -1.2949308596917628 196.93581265639824 -62.60000000000005
+ vertex -3.644930859691753 197.73185864123099 -62.60000000000005
+ vertex -0.6437422814685692 197.20554379716077 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -0.6437422814685692 197.20554379716077 -62.60000000000005
+ vertex -3.644930859691753 197.73185864123099 -62.60000000000005
+ vertex 0.05506914030823612 197.29754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 3.855069140308196 184.99754406618027 -62.60000000000005
+ vertex 9.055069140308234 184.59754406618026 -62.600000000000044
+ vertex 3.855069140308194 184.59754406618026 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 9.055069140308234 184.59754406618026 -62.600000000000044
+ vertex 3.855069140308196 184.99754406618027 -62.60000000000005
+ vertex 9.313888185410756 184.6316182398912 -62.600000000000044
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 9.313888185410756 184.6316182398912 -62.600000000000044
+ vertex 3.855069140308196 184.99754406618027 -62.60000000000005
+ vertex 9.555069140308234 184.73151866239584 -62.600000000000044
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 9.555069140308234 184.73151866239584 -62.600000000000044
+ vertex 3.855069140308196 184.99754406618027 -62.60000000000005
+ vertex 9.762175921494782 184.8904372849937 -62.600000000000044
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 9.762175921494782 184.8904372849937 -62.600000000000044
+ vertex 3.855069140308196 184.99754406618027 -62.60000000000005
+ vertex 9.921094544092673 185.09754406618026 -62.600000000000044
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -9.910856685980843 185.33872502107778 -62.60000000000008
+ vertex -7.744930859691757 185.19754406618028 -62.60000000000005
+ vertex -9.810956263476214 185.0975440661803 -62.600000000000065
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -7.744930859691757 185.19754406618028 -62.60000000000005
+ vertex -9.910856685980843 185.33872502107778 -62.60000000000008
+ vertex -8.159041331855791 185.25206274411775 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -8.159041331855791 185.25206274411775 -62.60000000000005
+ vertex -9.910856685980843 185.33872502107778 -62.60000000000008
+ vertex -8.54493085969176 185.41190342012518 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -8.54493085969176 185.41190342012518 -62.60000000000005
+ vertex -9.910856685980843 185.33872502107778 -62.60000000000008
+ vertex -9.944930859691775 185.5975440661803 -62.60000000000008
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -8.54493085969176 185.41190342012518 -62.60000000000005
+ vertex -9.944930859691775 185.5975440661803 -62.60000000000008
+ vertex -8.87630170959024 185.6661732162818 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -8.87630170959024 185.6661732162818 -62.60000000000005
+ vertex -9.944930859691775 185.5975440661803 -62.60000000000008
+ vertex -9.130571505746875 185.99754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -9.130571505746875 185.99754406618027 -62.60000000000005
+ vertex -9.944930859691775 185.5975440661803 -62.60000000000008
+ vertex -9.290412181754286 186.38343359401622 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -9.290412181754286 186.38343359401622 -62.60000000000005
+ vertex -9.944930859691775 185.5975440661803 -62.60000000000008
+ vertex -9.944930859691773 190.79754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -9.290412181754286 186.38343359401622 -62.60000000000005
+ vertex -9.944930859691773 190.79754406618028 -62.60000000000005
+ vertex -9.344930859691782 186.79754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -9.344930859691782 186.79754406618028 -62.60000000000005
+ vertex -9.944930859691773 190.79754406618028 -62.60000000000005
+ vertex -9.290412181754292 187.2116545383443 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -9.290412181754292 187.2116545383443 -62.60000000000005
+ vertex -9.944930859691773 190.79754406618028 -62.60000000000005
+ vertex -9.130571505746886 187.5975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -9.130571505746886 187.5975440661803 -62.60000000000005
+ vertex -9.944930859691773 190.79754406618028 -62.60000000000005
+ vertex -8.87630170959026 187.92891491607875 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -8.87630170959026 187.92891491607875 -62.60000000000005
+ vertex -9.944930859691773 190.79754406618028 -62.60000000000005
+ vertex -8.544930859691787 188.1831847122354 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -8.544930859691787 188.1831847122354 -62.60000000000005
+ vertex -9.944930859691773 190.79754406618028 -62.60000000000005
+ vertex -8.159041331855816 188.34302538824278 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -8.159041331855816 188.34302538824278 -62.60000000000005
+ vertex -9.944930859691773 190.79754406618028 -62.60000000000005
+ vertex -7.7449308596917845 188.39754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -7.7449308596917845 188.39754406618027 -62.60000000000005
+ vertex -9.944930859691773 190.79754406618028 -62.60000000000005
+ vertex -8.14493085969177 188.9975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -7.7449308596917845 188.39754406618027 -62.60000000000005
+ vertex -8.14493085969177 188.9975440661803 -62.60000000000005
+ vertex -5.544930859691769 188.43185864123106 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -8.14493085969177 188.9975440661803 -62.60000000000005
+ vertex -9.944930859691773 190.79754406618028 -62.60000000000005
+ vertex -9.544930859691773 190.79754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -8.14493085969177 188.9975440661803 -62.60000000000005
+ vertex -9.544930859691773 190.79754406618028 -62.60000000000005
+ vertex -8.14493085969177 191.19754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -8.14493085969177 191.19754406618028 -62.60000000000005
+ vertex -9.544930859691773 190.79754406618028 -62.60000000000005
+ vertex -9.544930859691773 191.19754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 3.7550691403082315 191.46322949112954 -62.60000000000005
+ vertex 2.6630688712887207 193.89873264440348 -62.60000000000005
+ vertex 3.7550691403082355 197.73185864123104 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 2.6630688712887207 193.89873264440348 -62.60000000000005
+ vertex 3.7550691403082315 191.46322949112954 -62.60000000000005
+ vertex 2.39333773052622 193.24754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 2.39333773052622 193.24754406618027 -62.60000000000005
+ vertex 3.7550691403082315 191.46322949112954 -62.60000000000005
+ vertex 1.9642574495119138 192.6883557569766 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 1.9642574495119138 192.6883557569766 -62.60000000000005
+ vertex 3.7550691403082315 191.46322949112954 -62.60000000000005
+ vertex 1.4050691403082352 192.2592754759623 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 1.4050691403082352 192.2592754759623 -62.60000000000005
+ vertex 3.7550691403082315 191.46322949112954 -62.60000000000005
+ vertex 0.75388056208504 191.98954433519978 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 0.75388056208504 191.98954433519978 -62.60000000000005
+ vertex 3.7550691403082315 191.46322949112954 -62.60000000000005
+ vertex 0.055069140308233296 191.89754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 3.7550691403082355 197.73185864123104 -62.60000000000005
+ vertex 2.6630688712887207 193.89873264440348 -62.60000000000005
+ vertex 2.755069140308237 194.59754406618026 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 3.7550691403082355 197.73185864123104 -62.60000000000005
+ vertex 2.755069140308237 194.59754406618026 -62.60000000000005
+ vertex 2.663068871288722 195.29635548795707 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 3.7550691403082355 197.73185864123104 -62.60000000000005
+ vertex 2.663068871288722 195.29635548795707 -62.60000000000005
+ vertex 2.393337730526221 195.94754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 3.7550691403082355 197.73185864123104 -62.60000000000005
+ vertex 2.393337730526221 195.94754406618028 -62.60000000000005
+ vertex 1.964257449511918 196.50673237538396 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 3.7550691403082355 197.73185864123104 -62.60000000000005
+ vertex 1.964257449511918 196.50673237538396 -62.60000000000005
+ vertex 1.4050691403082394 196.93581265639824 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 3.7550691403082355 197.73185864123104 -62.60000000000005
+ vertex 1.4050691403082394 196.93581265639824 -62.60000000000005
+ vertex 0.7538805620850456 197.20554379716077 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 3.7550691403082355 197.73185864123104 -62.60000000000005
+ vertex 0.7538805620850456 197.20554379716077 -62.60000000000005
+ vertex 0.05506914030823612 197.29754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 3.7550691403082355 197.73185864123104 -62.60000000000005
+ vertex 0.05506914030823612 197.29754406618028 -62.60000000000005
+ vertex -3.644930859691753 197.73185864123099 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 3.7550691403082355 197.73185864123104 -62.60000000000005
+ vertex -3.644930859691753 197.73185864123099 -62.60000000000005
+ vertex -3.0792454347425178 198.29754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.0792454347425178 198.29754406618028 -62.60000000000005
+ vertex -3.644930859691753 197.73185864123099 -62.60000000000005
+ vertex -6.110616284641007 200.19754406618026 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.0792454347425178 198.29754406618028 -62.60000000000005
+ vertex -6.110616284641007 200.19754406618026 -62.60000000000005
+ vertex -5.544930859691772 200.76322949112952 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -9.544930859691767 197.99754406618032 -62.60000000000005
+ vertex -8.144930859691767 200.19754406618028 -62.60000000000005
+ vertex -8.144930859691767 197.9975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -8.144930859691767 200.19754406618028 -62.60000000000005
+ vertex -9.544930859691767 197.99754406618032 -62.60000000000005
+ vertex -9.544930859691767 198.3975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 3.7550691403082355 197.73185864123104 -62.60000000000005
+ vertex 3.1893837153589675 198.29754406618028 -62.60000000000005
+ vertex 6.220754565257503 200.19754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 3.1893837153589675 198.29754406618028 -62.60000000000005
+ vertex 3.7550691403082355 197.73185864123104 -62.60000000000005
+ vertex -3.0792454347425178 198.29754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 6.220754565257503 200.19754406618028 -62.60000000000005
+ vertex 3.1893837153589675 198.29754406618028 -62.60000000000005
+ vertex 5.655069140308237 200.76322949112952 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 6.220754565257503 200.19754406618028 -62.60000000000005
+ vertex 5.655069140308237 200.76322949112952 -62.60000000000005
+ vertex 8.255069140308239 200.19754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 3.455069140308275 204.1975440661803 -62.60000000000005
+ vertex 5.655069140308238 202.79754406618028 -62.60000000000005
+ vertex 3.4550691403082383 202.79754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 5.655069140308238 202.79754406618028 -62.60000000000005
+ vertex 3.455069140308275 204.1975440661803 -62.60000000000005
+ vertex 6.309587818245718 202.81165453834433 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 6.309587818245718 202.81165453834433 -62.60000000000005
+ vertex 3.455069140308275 204.1975440661803 -62.60000000000005
+ vertex 6.469428494253122 203.19754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 6.469428494253122 203.19754406618028 -62.60000000000005
+ vertex 3.455069140308275 204.1975440661803 -62.60000000000005
+ vertex 6.723698290409745 203.52891491607878 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 6.723698290409745 203.52891491607878 -62.60000000000005
+ vertex 3.455069140308275 204.1975440661803 -62.60000000000005
+ vertex 7.0550691403082215 203.7831847122354 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 7.0550691403082215 203.7831847122354 -62.60000000000005
+ vertex 3.455069140308275 204.1975440661803 -62.60000000000005
+ vertex 7.440958668144188 203.94302538824277 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 7.440958668144188 203.94302538824277 -62.60000000000005
+ vertex 3.455069140308275 204.1975440661803 -62.60000000000005
+ vertex 7.855069140308223 203.9975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 7.855069140308223 203.9975440661803 -62.60000000000005
+ vertex 3.455069140308275 204.1975440661803 -62.60000000000005
+ vertex 9.921094544092682 204.0975440661803 -62.600000000000065
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 9.921094544092682 204.0975440661803 -62.600000000000065
+ vertex 3.455069140308275 204.1975440661803 -62.60000000000005
+ vertex 3.8550691403082737 204.1975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 9.921094544092682 204.0975440661803 -62.600000000000065
+ vertex 3.8550691403082737 204.1975440661803 -62.60000000000005
+ vertex 9.76217592149479 204.30465084736684 -62.600000000000065
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 9.76217592149479 204.30465084736684 -62.600000000000065
+ vertex 3.8550691403082737 204.1975440661803 -62.60000000000005
+ vertex 3.8550691403082755 204.5975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 9.76217592149479 204.30465084736684 -62.600000000000065
+ vertex 3.8550691403082755 204.5975440661803 -62.60000000000005
+ vertex 9.555069140308243 204.46356946996474 -62.60000000000008
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 9.555069140308243 204.46356946996474 -62.60000000000008
+ vertex 3.8550691403082755 204.5975440661803 -62.60000000000005
+ vertex 9.313888185410763 204.56346989246933 -62.60000000000008
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 9.313888185410763 204.56346989246933 -62.60000000000008
+ vertex 3.8550691403082755 204.5975440661803 -62.60000000000005
+ vertex 9.055069140308243 204.5975440661803 -62.60000000000008
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 8.255069140308237 197.9975440661803 -62.60000000000005
+ vertex 9.655069140308253 198.39754406618027 -62.60000000000005
+ vertex 9.655069140308251 197.99754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 9.655069140308253 198.39754406618027 -62.60000000000005
+ vertex 8.255069140308237 197.9975440661803 -62.60000000000005
+ vertex 8.255069140308239 200.19754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 9.655069140308253 198.39754406618027 -62.60000000000005
+ vertex 8.255069140308239 200.19754406618028 -62.60000000000005
+ vertex 10.055069140308252 198.39754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.055069140308252 198.39754406618027 -62.60000000000005
+ vertex 8.255069140308239 200.19754406618028 -62.60000000000005
+ vertex 9.240709786363354 201.5975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.055069140308252 198.39754406618027 -62.60000000000005
+ vertex 9.240709786363354 201.5975440661803 -62.60000000000005
+ vertex 9.40055046237076 201.98343359401628 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.055069140308252 198.39754406618027 -62.60000000000005
+ vertex 9.40055046237076 201.98343359401628 -62.60000000000005
+ vertex 10.055069140308241 203.59754406618026 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 9.240709786363354 201.5975440661803 -62.60000000000005
+ vertex 8.255069140308239 200.19754406618028 -62.60000000000005
+ vertex 8.98643999020673 201.2661732162818 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 8.98643999020673 201.2661732162818 -62.60000000000005
+ vertex 8.255069140308239 200.19754406618028 -62.60000000000005
+ vertex 8.655069140308255 201.01190342012518 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 8.655069140308255 201.01190342012518 -62.60000000000005
+ vertex 8.255069140308239 200.19754406618028 -62.60000000000005
+ vertex 8.269179612472286 200.85206274411777 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 8.269179612472286 200.85206274411777 -62.60000000000005
+ vertex 8.255069140308239 200.19754406618028 -62.60000000000005
+ vertex 7.855069140308252 200.79754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 7.855069140308252 200.79754406618028 -62.60000000000005
+ vertex 8.255069140308239 200.19754406618028 -62.60000000000005
+ vertex 5.655069140308237 200.76322949112952 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.055069140308241 203.59754406618026 -62.60000000000005
+ vertex 9.40055046237076 201.98343359401628 -62.60000000000005
+ vertex 9.455069140308245 202.3975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.055069140308241 203.59754406618026 -62.60000000000005
+ vertex 9.455069140308245 202.3975440661803 -62.60000000000005
+ vertex 9.40055046237075 202.81165453834433 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.055069140308241 203.59754406618026 -62.60000000000005
+ vertex 9.40055046237075 202.81165453834433 -62.60000000000005
+ vertex 9.24070978636334 203.1975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.055069140308241 203.59754406618026 -62.60000000000005
+ vertex 9.24070978636334 203.1975440661803 -62.60000000000005
+ vertex 8.986439990206707 203.52891491607878 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.055069140308241 203.59754406618026 -62.60000000000005
+ vertex 8.986439990206707 203.52891491607878 -62.60000000000005
+ vertex 8.655069140308228 203.7831847122354 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.055069140308241 203.59754406618026 -62.60000000000005
+ vertex 8.655069140308228 203.7831847122354 -62.60000000000005
+ vertex 10.02099496659731 203.8563631112828 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.02099496659731 203.8563631112828 -62.60000000000005
+ vertex 8.655069140308228 203.7831847122354 -62.60000000000005
+ vertex 8.269179612472257 203.94302538824283 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.02099496659731 203.8563631112828 -62.60000000000005
+ vertex 8.269179612472257 203.94302538824283 -62.60000000000005
+ vertex 9.921094544092682 204.0975440661803 -62.600000000000065
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 9.921094544092682 204.0975440661803 -62.600000000000065
+ vertex 8.269179612472257 203.94302538824283 -62.60000000000005
+ vertex 7.855069140308223 203.9975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 5.655069140308237 200.76322949112952 -62.60000000000005
+ vertex 7.440958668144216 200.85206274411775 -62.60000000000005
+ vertex 7.855069140308252 200.79754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 7.440958668144216 200.85206274411775 -62.60000000000005
+ vertex 5.655069140308237 200.76322949112952 -62.60000000000005
+ vertex 7.0550691403082455 201.01190342012518 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 7.0550691403082455 201.01190342012518 -62.60000000000005
+ vertex 5.655069140308237 200.76322949112952 -62.60000000000005
+ vertex 6.723698290409766 201.2661732162818 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 6.723698290409766 201.2661732162818 -62.60000000000005
+ vertex 5.655069140308237 200.76322949112952 -62.60000000000005
+ vertex 6.469428494253134 201.59754406618026 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 6.469428494253134 201.59754406618026 -62.60000000000005
+ vertex 5.655069140308237 200.76322949112952 -62.60000000000005
+ vertex 5.655069140308238 202.79754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 6.469428494253134 201.59754406618026 -62.60000000000005
+ vertex 5.655069140308238 202.79754406618028 -62.60000000000005
+ vertex 6.309587818245723 201.98343359401622 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 6.309587818245723 201.98343359401622 -62.60000000000005
+ vertex 5.655069140308238 202.79754406618028 -62.60000000000005
+ vertex 6.255069140308228 202.39754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 6.255069140308228 202.39754406618027 -62.60000000000005
+ vertex 5.655069140308238 202.79754406618028 -62.60000000000005
+ vertex 6.309587818245718 202.81165453834433 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -5.544930859691769 188.43185864123106 -62.60000000000005
+ vertex -6.1106162846410355 188.9975440661803 -62.60000000000005
+ vertex -3.079245434742501 190.89754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -6.1106162846410355 188.9975440661803 -62.60000000000005
+ vertex -5.544930859691769 188.43185864123106 -62.60000000000005
+ vertex -8.14493085969177 188.9975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex -3.079245434742501 190.89754406618027 -62.60000000000005
+ vertex -6.1106162846410355 188.9975440661803 -62.60000000000005
+ vertex -3.6449308596917698 191.4632294911295 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 8.255069140308246 191.19754406618026 -62.60000000000005
+ vertex 9.65506914030822 190.79754406618022 -62.60000000000005
+ vertex 8.255069140308246 188.99754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 9.65506914030822 190.79754406618022 -62.60000000000005
+ vertex 8.255069140308246 191.19754406618026 -62.60000000000005
+ vertex 9.655069140308221 191.19754406618023 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 7.855069140308268 185.19754406618028 -62.60000000000005
+ vertex 10.020994966597302 185.33872502107775 -62.600000000000044
+ vertex 9.921094544092673 185.09754406618026 -62.600000000000044
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.020994966597302 185.33872502107775 -62.600000000000044
+ vertex 7.855069140308268 185.19754406618028 -62.60000000000005
+ vertex 8.2691796124723 185.25206274411778 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.020994966597302 185.33872502107775 -62.600000000000044
+ vertex 8.2691796124723 185.25206274411778 -62.60000000000005
+ vertex 8.655069140308266 185.4119034201252 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.020994966597302 185.33872502107775 -62.600000000000044
+ vertex 8.655069140308266 185.4119034201252 -62.60000000000005
+ vertex 10.055069140308234 185.59754406618026 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.055069140308234 185.59754406618026 -62.60000000000005
+ vertex 8.655069140308266 185.4119034201252 -62.60000000000005
+ vertex 8.986439990206739 185.6661732162818 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.055069140308234 185.59754406618026 -62.60000000000005
+ vertex 8.986439990206739 185.6661732162818 -62.60000000000005
+ vertex 9.240709786363354 185.99754406618032 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.055069140308234 185.59754406618026 -62.60000000000005
+ vertex 9.240709786363354 185.99754406618032 -62.60000000000005
+ vertex 9.40055046237077 186.38343359401628 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.055069140308234 185.59754406618026 -62.60000000000005
+ vertex 9.40055046237077 186.38343359401628 -62.60000000000005
+ vertex 10.05506914030822 190.79754406618022 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.05506914030822 190.79754406618022 -62.60000000000005
+ vertex 9.40055046237077 186.38343359401628 -62.60000000000005
+ vertex 9.455069140308243 186.7975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.05506914030822 190.79754406618022 -62.60000000000005
+ vertex 9.455069140308243 186.7975440661803 -62.60000000000005
+ vertex 9.400550462370747 187.21165453834433 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.05506914030822 190.79754406618022 -62.60000000000005
+ vertex 9.400550462370747 187.21165453834433 -62.60000000000005
+ vertex 9.240709786363354 187.59754406618032 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.05506914030822 190.79754406618022 -62.60000000000005
+ vertex 9.240709786363354 187.59754406618032 -62.60000000000005
+ vertex 8.986439990206716 187.92891491607878 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.05506914030822 190.79754406618022 -62.60000000000005
+ vertex 8.986439990206716 187.92891491607878 -62.60000000000005
+ vertex 8.655069140308244 188.18318471223543 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.05506914030822 190.79754406618022 -62.60000000000005
+ vertex 8.655069140308244 188.18318471223543 -62.60000000000005
+ vertex 8.269179612472279 188.3430253882428 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.05506914030822 190.79754406618022 -62.60000000000005
+ vertex 8.269179612472279 188.3430253882428 -62.60000000000005
+ vertex 7.855069140308223 188.3975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.05506914030822 190.79754406618022 -62.60000000000005
+ vertex 7.855069140308223 188.3975440661803 -62.60000000000005
+ vertex 8.255069140308246 188.99754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 8.255069140308246 188.99754406618027 -62.60000000000005
+ vertex 7.855069140308223 188.3975440661803 -62.60000000000005
+ vertex 5.6550691403082505 188.431858641231 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 8.255069140308246 188.99754406618027 -62.60000000000005
+ vertex 5.6550691403082505 188.431858641231 -62.60000000000005
+ vertex 6.220754565257486 188.99754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -3.3533729404294705e-19 2.2196452394793015e-19 -1.0
+ outer loop
+ vertex 10.05506914030822 190.79754406618022 -62.60000000000005
+ vertex 8.255069140308246 188.99754406618027 -62.60000000000005
+ vertex 9.65506914030822 190.79754406618022 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -8.1590413318558 200.85206274411777 -62.60000000000005
+ vertex -7.330820387527713 200.85206274411777 -62.60000000000005
+ vertex -7.744930859691745 200.79754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -7.330820387527713 200.85206274411777 -62.60000000000005
+ vertex -8.1590413318558 200.85206274411777 -62.60000000000005
+ vertex -8.544930859691766 201.01190342012518 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -7.330820387527713 200.85206274411777 -62.60000000000005
+ vertex -8.544930859691766 201.01190342012518 -62.60000000000005
+ vertex -6.9449308596917465 201.0119034201252 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -6.9449308596917465 201.0119034201252 -62.60000000000005
+ vertex -8.544930859691766 201.01190342012518 -62.60000000000005
+ vertex -8.876301709590237 201.2661732162818 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -6.9449308596917465 201.0119034201252 -62.60000000000005
+ vertex -8.876301709590237 201.2661732162818 -62.60000000000005
+ vertex -6.613560009793275 201.26617321628183 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -6.613560009793275 201.26617321628183 -62.60000000000005
+ vertex -8.876301709590237 201.2661732162818 -62.60000000000005
+ vertex -9.130571505746877 201.5975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -6.613560009793275 201.26617321628183 -62.60000000000005
+ vertex -9.130571505746877 201.5975440661803 -62.60000000000005
+ vertex -6.359290213636661 201.59754406618032 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -6.359290213636661 201.59754406618032 -62.60000000000005
+ vertex -9.130571505746877 201.5975440661803 -62.60000000000005
+ vertex -9.290412181754272 201.98343359401625 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -6.359290213636661 201.59754406618032 -62.60000000000005
+ vertex -9.290412181754272 201.98343359401625 -62.60000000000005
+ vertex -6.199449537629244 201.98343359401625 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -6.199449537629244 201.98343359401625 -62.60000000000005
+ vertex -9.290412181754272 201.98343359401625 -62.60000000000005
+ vertex -9.344930859691765 202.39754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -6.199449537629244 201.98343359401625 -62.60000000000005
+ vertex -9.344930859691765 202.39754406618027 -62.60000000000005
+ vertex -6.144930859691768 202.3975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -6.144930859691768 202.3975440661803 -62.60000000000005
+ vertex -9.344930859691765 202.39754406618027 -62.60000000000005
+ vertex -9.290412181754292 202.81165453834433 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -6.144930859691768 202.3975440661803 -62.60000000000005
+ vertex -9.290412181754292 202.81165453834433 -62.60000000000005
+ vertex -6.199449537629263 202.81165453834433 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -6.199449537629263 202.81165453834433 -62.60000000000005
+ vertex -9.290412181754292 202.81165453834433 -62.60000000000005
+ vertex -9.130571505746875 203.19754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -6.199449537629263 202.81165453834433 -62.60000000000005
+ vertex -9.130571505746875 203.19754406618028 -62.60000000000005
+ vertex -6.359290213636658 203.1975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -6.359290213636658 203.1975440661803 -62.60000000000005
+ vertex -9.130571505746875 203.19754406618028 -62.60000000000005
+ vertex -8.876301709590258 203.52891491607872 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -6.359290213636658 203.1975440661803 -62.60000000000005
+ vertex -8.876301709590258 203.52891491607872 -62.60000000000005
+ vertex -6.613560009793296 203.52891491607878 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -6.613560009793296 203.52891491607878 -62.60000000000005
+ vertex -8.876301709590258 203.52891491607872 -62.60000000000005
+ vertex -8.544930859691787 203.7831847122354 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -6.613560009793296 203.52891491607878 -62.60000000000005
+ vertex -8.544930859691787 203.7831847122354 -62.60000000000005
+ vertex -6.944930859691767 203.7831847122354 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -6.944930859691767 203.7831847122354 -62.60000000000005
+ vertex -8.544930859691787 203.7831847122354 -62.60000000000005
+ vertex -8.15904133185582 203.94302538824277 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -6.944930859691767 203.7831847122354 -62.60000000000005
+ vertex -8.15904133185582 203.94302538824277 -62.60000000000005
+ vertex -7.330820387527756 203.94302538824277 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex -7.330820387527756 203.94302538824277 -62.60000000000005
+ vertex -8.15904133185582 203.94302538824277 -62.60000000000005
+ vertex -7.744930859691788 203.9975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 -1.377133677811165e-16
+ outer loop
+ vertex 3.855069140308194 184.59754406618026 617.3999999999999
+ vertex 9.055069140308234 184.59754406618026 -62.600000000000044
+ vertex 9.055069140308234 184.59754406618026 617.3999999999999
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 -1.377133677811165e-16
+ outer loop
+ vertex 9.055069140308234 184.59754406618026 -62.600000000000044
+ vertex 3.855069140308194 184.59754406618026 617.3999999999999
+ vertex 3.855069140308194 184.59754406618026 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222007258 -0.9914448613738076 -1.6369160198769266e-16
+ outer loop
+ vertex 9.055069140308234 184.59754406618026 617.3999999999999
+ vertex 9.313888185410756 184.6316182398912 -62.600000000000044
+ vertex 9.313888185410756 184.6316182398912 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222007258 -0.9914448613738076 -1.6369160198769266e-16
+ outer loop
+ vertex 9.313888185410756 184.6316182398912 -62.600000000000044
+ vertex 9.055069140308234 184.59754406618026 617.3999999999999
+ vertex 9.055069140308234 184.59754406618026 -62.600000000000044
+ endloop
+endfacet
+facet normal -4.153941706314073e-15 -1.0 -1.3771336778111572e-16
+ outer loop
+ vertex -3.079245434742501 190.89754406618027 617.3999999999999
+ vertex 3.189383715358996 190.89754406618025 -62.60000000000005
+ vertex 3.189383715358996 190.89754406618025 617.3999999999999
+ endloop
+endfacet
+facet normal -4.153941706314073e-15 -1.0 -1.3771336778111572e-16
+ outer loop
+ vertex 3.189383715358996 190.89754406618025 -62.60000000000005
+ vertex -3.079245434742501 190.89754406618027 617.3999999999999
+ vertex -3.079245434742501 190.89754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.3826834323650818 -0.9238795325112902 -2.0684907214262692e-16
+ outer loop
+ vertex 9.313888185410756 184.6316182398912 617.3999999999999
+ vertex 9.555069140308234 184.73151866239584 -62.600000000000044
+ vertex 9.555069140308234 184.73151866239584 617.3999999999999
+ endloop
+endfacet
+facet normal 0.3826834323650818 -0.9238795325112902 -2.0684907214262692e-16
+ outer loop
+ vertex 9.555069140308234 184.73151866239584 -62.600000000000044
+ vertex 9.313888185410756 184.6316182398912 617.3999999999999
+ vertex 9.313888185410756 184.6316182398912 -62.600000000000044
+ endloop
+endfacet
+facet normal 0.6087614290087039 -0.7933533402912479 -2.3591011986529993e-16
+ outer loop
+ vertex 9.555069140308234 184.73151866239584 617.3999999999999
+ vertex 9.762175921494782 184.8904372849937 -62.600000000000044
+ vertex 9.762175921494782 184.8904372849937 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087039 -0.7933533402912479 -2.3591011986529993e-16
+ outer loop
+ vertex 9.762175921494782 184.8904372849937 -62.600000000000044
+ vertex 9.555069140308234 184.73151866239584 617.3999999999999
+ vertex 9.555069140308234 184.73151866239584 -62.600000000000044
+ endloop
+endfacet
+facet normal -1.0 6.169307489110241e-16 2.080531937439538e-16
+ outer loop
+ vertex 8.255069140308246 188.99754406618027 617.3999999999999
+ vertex 8.255069140308246 191.19754406618026 -62.60000000000005
+ vertex 8.255069140308246 188.99754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -1.0 6.169307489110241e-16 2.080531937439538e-16
+ outer loop
+ vertex 8.255069140308246 191.19754406618026 -62.60000000000005
+ vertex 8.255069140308246 188.99754406618027 617.3999999999999
+ vertex 8.255069140308246 191.19754406618026 617.3999999999999
+ endloop
+endfacet
+facet normal -1.0 6.0645932720149255e-15 2.0805319374395453e-16
+ outer loop
+ vertex 3.855069140308194 184.59754406618026 -62.60000000000005
+ vertex 3.855069140308196 184.99754406618027 617.3999999999999
+ vertex 3.855069140308196 184.99754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -1.0 6.0645932720149255e-15 2.0805319374395453e-16
+ outer loop
+ vertex 3.855069140308196 184.99754406618027 617.3999999999999
+ vertex 3.855069140308194 184.59754406618026 -62.60000000000005
+ vertex 3.855069140308194 184.59754406618026 617.3999999999999
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 2.080531937439538e-16
+ outer loop
+ vertex 5.655069140308249 186.39754406618027 617.3999999999999
+ vertex 5.6550691403082505 188.431858641231 -62.60000000000005
+ vertex 5.655069140308249 186.39754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 2.080531937439538e-16
+ outer loop
+ vertex 5.6550691403082505 188.431858641231 -62.60000000000005
+ vertex 5.655069140308249 186.39754406618027 617.3999999999999
+ vertex 5.6550691403082505 188.431858641231 617.3999999999999
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 -2.080531937439538e-16
+ outer loop
+ vertex -5.544930859691769 188.43185864123106 617.3999999999999
+ vertex -5.544930859691772 186.3975440661803 -62.60000000000005
+ vertex -5.544930859691769 188.43185864123106 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 -2.080531937439538e-16
+ outer loop
+ vertex -5.544930859691772 186.3975440661803 -62.60000000000005
+ vertex -5.544930859691769 188.43185864123106 617.3999999999999
+ vertex -5.544930859691772 186.3975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 1.377133677811165e-16
+ outer loop
+ vertex 6.220754565257486 188.99754406618027 -62.60000000000005
+ vertex 8.255069140308246 188.99754406618027 617.3999999999999
+ vertex 8.255069140308246 188.99754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 1.377133677811165e-16
+ outer loop
+ vertex 8.255069140308246 188.99754406618027 617.3999999999999
+ vertex 6.220754565257486 188.99754406618027 -62.60000000000005
+ vertex 6.220754565257486 188.99754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 1.3771336778111648e-16
+ outer loop
+ vertex 3.455069140308254 186.39754406618027 -62.60000000000005
+ vertex 5.655069140308249 186.39754406618027 617.3999999999999
+ vertex 5.655069140308249 186.39754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 1.3771336778111648e-16
+ outer loop
+ vertex 5.655069140308249 186.39754406618027 617.3999999999999
+ vertex 3.455069140308254 186.39754406618027 -62.60000000000005
+ vertex 3.455069140308254 186.39754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 -2.080531937439538e-16
+ outer loop
+ vertex -3.7449308596917725 184.99754406618027 617.3999999999999
+ vertex -3.7449308596917725 184.59754406618026 -62.60000000000005
+ vertex -3.7449308596917725 184.99754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 -2.080531937439538e-16
+ outer loop
+ vertex -3.7449308596917725 184.59754406618026 -62.60000000000005
+ vertex -3.7449308596917725 184.99754406618027 617.3999999999999
+ vertex -3.7449308596917725 184.59754406618026 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112916 -0.3826834323650782 -2.449167116386772e-16
+ outer loop
+ vertex 10.020994966597302 185.33872502107775 617.3999999999999
+ vertex 9.921094544092673 185.09754406618026 -62.600000000000044
+ vertex 10.020994966597302 185.33872502107775 -62.600000000000044
+ endloop
+endfacet
+facet normal 0.9238795325112916 -0.3826834323650782 -2.449167116386772e-16
+ outer loop
+ vertex 9.921094544092673 185.09754406618026 -62.600000000000044
+ vertex 10.020994966597302 185.33872502107775 617.3999999999999
+ vertex 9.921094544092673 185.09754406618026 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7071067811865512 0.7071067811865439 -4.973776792580495e-17
+ outer loop
+ vertex 3.7550691403082315 191.46322949112954 617.3999999999999
+ vertex 6.220754565257486 188.99754406618027 -62.60000000000005
+ vertex 3.7550691403082315 191.46322949112954 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7071067811865512 0.7071067811865439 -4.973776792580495e-17
+ outer loop
+ vertex 6.220754565257486 188.99754406618027 -62.60000000000005
+ vertex 3.7550691403082315 191.46322949112954 617.3999999999999
+ vertex 6.220754565257486 188.99754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal -0.707106781186548 -0.707106781186547 4.973776792580383e-17
+ outer loop
+ vertex 3.189383715358996 190.89754406618025 617.3999999999999
+ vertex 5.6550691403082505 188.431858641231 -62.60000000000005
+ vertex 5.6550691403082505 188.431858641231 617.3999999999999
+ endloop
+endfacet
+facet normal -0.707106781186548 -0.707106781186547 4.973776792580383e-17
+ outer loop
+ vertex 5.6550691403082505 188.431858641231 -62.60000000000005
+ vertex 3.189383715358996 190.89754406618025 617.3999999999999
+ vertex 3.189383715358996 190.89754406618025 -62.60000000000005
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 1.3771336778111648e-16
+ outer loop
+ vertex 10.05506914030822 190.79754406618022 -62.60000000000005
+ vertex 9.65506914030822 190.79754406618022 617.3999999999999
+ vertex 10.05506914030822 190.79754406618022 617.3999999999999
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 1.3771336778111648e-16
+ outer loop
+ vertex 9.65506914030822 190.79754406618022 617.3999999999999
+ vertex 10.05506914030822 190.79754406618022 -62.60000000000005
+ vertex 9.65506914030822 190.79754406618022 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 -1.3771336778111648e-16
+ outer loop
+ vertex -3.7449308596917725 184.99754406618027 617.3999999999999
+ vertex -3.344930859691773 184.99754406618027 -62.60000000000005
+ vertex -3.344930859691773 184.99754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 -1.3771336778111648e-16
+ outer loop
+ vertex -3.344930859691773 184.99754406618027 -62.60000000000005
+ vertex -3.7449308596917725 184.99754406618027 617.3999999999999
+ vertex -3.7449308596917725 184.99754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.6669205698300858e-14 1.0 1.3771336778111316e-16
+ outer loop
+ vertex 8.255069140308246 191.19754406618026 -62.60000000000005
+ vertex 9.655069140308221 191.19754406618023 617.3999999999999
+ vertex 9.655069140308221 191.19754406618023 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.6669205698300858e-14 1.0 1.3771336778111316e-16
+ outer loop
+ vertex 9.655069140308221 191.19754406618023 617.3999999999999
+ vertex 8.255069140308246 191.19754406618026 -62.60000000000005
+ vertex 8.255069140308246 191.19754406618026 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7071067811865451 -0.70710678118655 -2.444938803619327e-16
+ outer loop
+ vertex -5.544930859691769 188.43185864123106 617.3999999999999
+ vertex -3.079245434742501 190.89754406618027 -62.60000000000005
+ vertex -3.079245434742501 190.89754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7071067811865451 -0.70710678118655 -2.444938803619327e-16
+ outer loop
+ vertex -3.079245434742501 190.89754406618027 -62.60000000000005
+ vertex -5.544930859691769 188.43185864123106 617.3999999999999
+ vertex -5.544930859691769 188.43185864123106 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.130526192220074 -0.9914448613738076 -1.0937881967044573e-16
+ outer loop
+ vertex -9.203749904794295 184.63161823989122 617.3999999999999
+ vertex -8.944930859691771 184.5975440661803 -62.60000000000005
+ vertex -8.944930859691771 184.5975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal -0.130526192220074 -0.9914448613738076 -1.0937881967044573e-16
+ outer loop
+ vertex -8.944930859691771 184.5975440661803 -62.60000000000005
+ vertex -9.203749904794295 184.63161823989122 617.3999999999999
+ vertex -9.203749904794295 184.63161823989122 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.3826834323650828 -0.9238795325112898 -4.761205154971957e-17
+ outer loop
+ vertex -9.444930859691773 184.73151866239584 617.3999999999999
+ vertex -9.203749904794295 184.63161823989122 -62.60000000000005
+ vertex -9.203749904794295 184.63161823989122 617.3999999999999
+ endloop
+endfacet
+facet normal -0.3826834323650828 -0.9238795325112898 -4.761205154971957e-17
+ outer loop
+ vertex -9.203749904794295 184.63161823989122 -62.60000000000005
+ vertex -9.444930859691773 184.73151866239584 617.3999999999999
+ vertex -9.444930859691773 184.73151866239584 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.0 2.601634853062814e-15 -2.0805319374395335e-16
+ outer loop
+ vertex 10.05506914030822 190.79754406618022 617.3999999999999
+ vertex 10.055069140308234 185.59754406618026 -62.60000000000005
+ vertex 10.05506914030822 190.79754406618022 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.0 2.601634853062814e-15 -2.0805319374395335e-16
+ outer loop
+ vertex 10.055069140308234 185.59754406618026 -62.60000000000005
+ vertex 10.05506914030822 190.79754406618022 617.3999999999999
+ vertex 10.055069140308234 185.59754406618026 617.3999999999999
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 -1.3771336778111648e-16
+ outer loop
+ vertex 3.455069140308196 184.99754406618027 617.3999999999999
+ vertex 3.855069140308196 184.99754406618027 -62.60000000000005
+ vertex 3.855069140308196 184.99754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 -1.3771336778111648e-16
+ outer loop
+ vertex 3.855069140308196 184.99754406618027 -62.60000000000005
+ vertex 3.455069140308196 184.99754406618027 617.3999999999999
+ vertex 3.455069140308196 184.99754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738098 -0.1305261922200571 -2.2424847134412203e-16
+ outer loop
+ vertex 10.055069140308234 185.59754406618026 617.3999999999999
+ vertex 10.020994966597302 185.33872502107775 -62.600000000000044
+ vertex 10.055069140308234 185.59754406618026 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738098 -0.1305261922200571 -2.2424847134412203e-16
+ outer loop
+ vertex 10.020994966597302 185.33872502107775 -62.600000000000044
+ vertex 10.055069140308234 185.59754406618026 617.3999999999999
+ vertex 10.020994966597302 185.33872502107775 617.3999999999999
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 -2.080531937439538e-16
+ outer loop
+ vertex -3.344930859691773 186.39754406618027 617.3999999999999
+ vertex -3.344930859691773 184.99754406618027 -62.60000000000005
+ vertex -3.344930859691773 186.39754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 -2.080531937439538e-16
+ outer loop
+ vertex -3.344930859691773 184.99754406618027 -62.60000000000005
+ vertex -3.344930859691773 186.39754406618027 617.3999999999999
+ vertex -3.344930859691773 184.99754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087049 -0.7933533402912473 1.7399399201488312e-17
+ outer loop
+ vertex -9.652037640878321 184.89043728499374 617.3999999999999
+ vertex -9.444930859691773 184.73151866239584 -62.600000000000065
+ vertex -9.444930859691773 184.73151866239584 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087049 -0.7933533402912473 1.7399399201488312e-17
+ outer loop
+ vertex -9.444930859691773 184.73151866239584 -62.600000000000065
+ vertex -9.652037640878321 184.89043728499374 617.3999999999999
+ vertex -9.652037640878321 184.89043728499374 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.7933533402912366 -0.6087614290087189 8.122510965098966e-17
+ outer loop
+ vertex -9.652037640878321 184.89043728499374 -62.600000000000065
+ vertex -9.810956263476214 185.0975440661803 617.3999999999999
+ vertex -9.810956263476214 185.0975440661803 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.7933533402912366 -0.6087614290087189 8.122510965098966e-17
+ outer loop
+ vertex -9.810956263476214 185.0975440661803 617.3999999999999
+ vertex -9.652037640878321 184.89043728499374 -62.600000000000065
+ vertex -9.652037640878321 184.89043728499374 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912388 -0.608761429008716 -2.4889428277906133e-16
+ outer loop
+ vertex 9.921094544092673 185.09754406618026 617.3999999999999
+ vertex 9.762175921494782 184.8904372849937 -62.600000000000044
+ vertex 9.921094544092673 185.09754406618026 -62.600000000000044
+ endloop
+endfacet
+facet normal 0.7933533402912388 -0.608761429008716 -2.4889428277906133e-16
+ outer loop
+ vertex 9.762175921494782 184.8904372849937 -62.600000000000044
+ vertex 9.921094544092673 185.09754406618026 617.3999999999999
+ vertex 9.762175921494782 184.8904372849937 617.3999999999999
+ endloop
+endfacet
+facet normal -1.0 4.1062391582207636e-14 2.0805319374395931e-16
+ outer loop
+ vertex 3.455069140308196 184.99754406618027 617.3999999999999
+ vertex 3.455069140308254 186.39754406618027 -62.60000000000005
+ vertex 3.455069140308196 184.99754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -1.0 4.1062391582207636e-14 2.0805319374395931e-16
+ outer loop
+ vertex 3.455069140308254 186.39754406618027 -62.60000000000005
+ vertex 3.455069140308196 184.99754406618027 617.3999999999999
+ vertex 3.455069140308254 186.39754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 1.0 -5.844283390565871e-15 -2.0805319374395448e-16
+ outer loop
+ vertex 9.655069140308221 191.19754406618023 617.3999999999999
+ vertex 9.65506914030822 190.79754406618022 -62.60000000000005
+ vertex 9.655069140308221 191.19754406618023 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.0 -5.844283390565871e-15 -2.0805319374395448e-16
+ outer loop
+ vertex 9.65506914030822 190.79754406618022 -62.60000000000005
+ vertex 9.655069140308221 191.19754406618023 617.3999999999999
+ vertex 9.65506914030822 190.79754406618022 617.3999999999999
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 1.377133677811165e-16
+ outer loop
+ vertex -5.544930859691772 186.3975440661803 -62.60000000000005
+ vertex -3.344930859691773 186.39754406618027 617.3999999999999
+ vertex -3.344930859691773 186.39754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 1.377133677811165e-16
+ outer loop
+ vertex -3.344930859691773 186.39754406618027 617.3999999999999
+ vertex -5.544930859691772 186.3975440661803 -62.60000000000005
+ vertex -5.544930859691772 186.3975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 -1.377133677811165e-16
+ outer loop
+ vertex -8.944930859691771 184.5975440661803 617.3999999999999
+ vertex -3.7449308596917725 184.59754406618026 -62.60000000000005
+ vertex -3.7449308596917725 184.59754406618026 617.3999999999999
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 -1.377133677811165e-16
+ outer loop
+ vertex -3.7449308596917725 184.59754406618026 -62.60000000000005
+ vertex -8.944930859691771 184.5975440661803 617.3999999999999
+ vertex -8.944930859691771 184.5975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222006134 0.9914448613738092 1.6369160198769052e-16
+ outer loop
+ vertex -7.744930859691757 185.19754406618028 -62.60000000000005
+ vertex -7.330820387527722 185.25206274411778 617.3999999999999
+ vertex -7.330820387527722 185.25206274411778 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222006134 0.9914448613738092 1.6369160198769052e-16
+ outer loop
+ vertex -7.330820387527722 185.25206274411778 617.3999999999999
+ vertex -7.744930859691757 185.19754406618028 -62.60000000000005
+ vertex -7.744930859691757 185.19754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738104 -0.13052619222005143 1.8829806831558401e-16
+ outer loop
+ vertex 2.755069140308237 194.59754406618026 617.3999999999999
+ vertex 2.663068871288722 195.29635548795707 -62.60000000000005
+ vertex 2.755069140308237 194.59754406618026 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738104 -0.13052619222005143 1.8829806831558401e-16
+ outer loop
+ vertex 2.663068871288722 195.29635548795707 -62.60000000000005
+ vertex 2.755069140308237 194.59754406618026 617.3999999999999
+ vertex 2.663068871288722 195.29635548795707 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087033 0.7933533402912485 2.359101198652999e-16
+ outer loop
+ vertex 1.4050691403082352 192.2592754759623 -62.60000000000005
+ vertex 1.9642574495119138 192.6883557569766 617.3999999999999
+ vertex 1.9642574495119138 192.6883557569766 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087033 0.7933533402912485 2.359101198652999e-16
+ outer loop
+ vertex 1.9642574495119138 192.6883557569766 617.3999999999999
+ vertex 1.4050691403082352 192.2592754759623 -62.60000000000005
+ vertex 1.4050691403082352 192.2592754759623 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112903 -0.38268343236508096 1.3951546310861238e-16
+ outer loop
+ vertex 2.663068871288722 195.29635548795707 617.3999999999999
+ vertex 2.393337730526221 195.94754406618028 -62.60000000000005
+ vertex 2.663068871288722 195.29635548795707 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112903 -0.38268343236508096 1.3951546310861238e-16
+ outer loop
+ vertex 2.393337730526221 195.94754406618028 -62.60000000000005
+ vertex 2.663068871288722 195.29635548795707 617.3999999999999
+ vertex 2.393337730526221 195.94754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112912 -0.382683432365079 1.3951546310861282e-16
+ outer loop
+ vertex -9.810956263476214 185.0975440661803 -62.600000000000065
+ vertex -9.910856685980843 185.33872502107778 617.3999999999999
+ vertex -9.910856685980843 185.33872502107778 -62.60000000000008
+ endloop
+endfacet
+facet normal -0.9238795325112912 -0.382683432365079 1.3951546310861282e-16
+ outer loop
+ vertex -9.910856685980843 185.33872502107778 617.3999999999999
+ vertex -9.810956263476214 185.0975440661803 -62.600000000000065
+ vertex -9.810956263476214 185.0975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222004488 -0.9914448613738114 -1.0937881967045231e-16
+ outer loop
+ vertex 0.05506914030823612 197.29754406618028 617.3999999999999
+ vertex 0.7538805620850456 197.20554379716077 -62.60000000000005
+ vertex 0.7538805620850456 197.20554379716077 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222004488 -0.9914448613738114 -1.0937881967045231e-16
+ outer loop
+ vertex 0.7538805620850456 197.20554379716077 -62.60000000000005
+ vertex 0.05506914030823612 197.29754406618028 617.3999999999999
+ vertex 0.05506914030823612 197.29754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.6087614290087033 -0.7933533402912485 -2.359101198652999e-16
+ outer loop
+ vertex -1.8541191688954417 196.50673237538396 617.3999999999999
+ vertex -1.2949308596917628 196.93581265639824 -62.60000000000005
+ vertex -1.2949308596917628 196.93581265639824 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087033 -0.7933533402912485 -2.359101198652999e-16
+ outer loop
+ vertex -1.2949308596917628 196.93581265639824 -62.60000000000005
+ vertex -1.8541191688954417 196.50673237538396 617.3999999999999
+ vertex -1.8541191688954417 196.50673237538396 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112905 0.3826834323650807 2.4491671163867733e-16
+ outer loop
+ vertex 2.39333773052622 193.24754406618027 617.3999999999999
+ vertex 2.6630688712887207 193.89873264440348 -62.60000000000005
+ vertex 2.39333773052622 193.24754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112905 0.3826834323650807 2.4491671163867733e-16
+ outer loop
+ vertex 2.6630688712887207 193.89873264440348 -62.60000000000005
+ vertex 2.39333773052622 193.24754406618027 617.3999999999999
+ vertex 2.6630688712887207 193.89873264440348 617.3999999999999
+ endloop
+endfacet
+facet normal -0.3826834323651019 -0.9238795325112817 -4.761205154971449e-17
+ outer loop
+ vertex 0.7538805620850456 197.20554379716077 617.3999999999999
+ vertex 1.4050691403082394 196.93581265639824 -62.60000000000005
+ vertex 1.4050691403082394 196.93581265639824 617.3999999999999
+ endloop
+endfacet
+facet normal -0.3826834323651019 -0.9238795325112817 -4.761205154971449e-17
+ outer loop
+ vertex 1.4050691403082394 196.93581265639824 -62.60000000000005
+ vertex 0.7538805620850456 197.20554379716077 617.3999999999999
+ vertex 0.7538805620850456 197.20554379716077 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222004513 0.9914448613738113 1.0937881967045226e-16
+ outer loop
+ vertex -0.6437422814685734 191.98954433519978 -62.60000000000005
+ vertex 0.055069140308233296 191.89754406618027 617.3999999999999
+ vertex 0.055069140308233296 191.89754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222004513 0.9914448613738113 1.0937881967045226e-16
+ outer loop
+ vertex 0.055069140308233296 191.89754406618027 617.3999999999999
+ vertex -0.6437422814685734 191.98954433519978 -62.60000000000005
+ vertex -0.6437422814685734 191.98954433519978 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112903 0.38268343236508096 -1.3951546310861238e-16
+ outer loop
+ vertex -2.552930590672251 193.89873264440348 617.3999999999999
+ vertex -2.2831994499097514 193.24754406618027 -62.60000000000005
+ vertex -2.552930590672251 193.89873264440348 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112903 0.38268343236508096 -1.3951546310861238e-16
+ outer loop
+ vertex -2.2831994499097514 193.24754406618027 -62.60000000000005
+ vertex -2.552930590672251 193.89873264440348 617.3999999999999
+ vertex -2.2831994499097514 193.24754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 0.3826834323651008 -0.9238795325112822 -2.068490721426298e-16
+ outer loop
+ vertex -1.2949308596917628 196.93581265639824 617.3999999999999
+ vertex -0.6437422814685692 197.20554379716077 -62.60000000000005
+ vertex -0.6437422814685692 197.20554379716077 617.3999999999999
+ endloop
+endfacet
+facet normal 0.3826834323651008 -0.9238795325112822 -2.068490721426298e-16
+ outer loop
+ vertex -0.6437422814685692 197.20554379716077 -62.60000000000005
+ vertex -1.2949308596917628 196.93581265639824 617.3999999999999
+ vertex -1.2949308596917628 196.93581265639824 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.793353340291237 -0.6087614290087182 8.122510965098985e-17
+ outer loop
+ vertex 2.393337730526221 195.94754406618028 617.3999999999999
+ vertex 1.964257449511918 196.50673237538396 -62.60000000000005
+ vertex 2.393337730526221 195.94754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.793353340291237 -0.6087614290087182 8.122510965098985e-17
+ outer loop
+ vertex 1.964257449511918 196.50673237538396 -62.60000000000005
+ vertex 2.393337730526221 195.94754406618028 617.3999999999999
+ vertex 1.964257449511918 196.50673237538396 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738099 0.130526192220055 2.2424847134412173e-16
+ outer loop
+ vertex 2.6630688712887207 193.89873264440348 617.3999999999999
+ vertex 2.755069140308237 194.59754406618026 -62.60000000000005
+ vertex 2.6630688712887207 193.89873264440348 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738099 0.130526192220055 2.2424847134412173e-16
+ outer loop
+ vertex 2.755069140308237 194.59754406618026 -62.60000000000005
+ vertex 2.6630688712887207 193.89873264440348 617.3999999999999
+ vertex 2.755069140308237 194.59754406618026 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112859 -0.382683432365092 -2.4491671163867793e-16
+ outer loop
+ vertex -2.28319944990975 195.94754406618028 617.3999999999999
+ vertex -2.5529305906722497 195.2963554879571 -62.60000000000005
+ vertex -2.28319944990975 195.94754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112859 -0.382683432365092 -2.4491671163867793e-16
+ outer loop
+ vertex -2.5529305906722497 195.2963554879571 -62.60000000000005
+ vertex -2.28319944990975 195.94754406618028 617.3999999999999
+ vertex -2.5529305906722497 195.2963554879571 617.3999999999999
+ endloop
+endfacet
+facet normal 0.1305261922200094 0.9914448613738162 1.0937881967046036e-16
+ outer loop
+ vertex -8.159041331855791 185.25206274411775 -62.60000000000005
+ vertex -7.744930859691757 185.19754406618028 617.3999999999999
+ vertex -7.744930859691757 185.19754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.1305261922200094 0.9914448613738162 1.0937881967046036e-16
+ outer loop
+ vertex -7.744930859691757 185.19754406618028 617.3999999999999
+ vertex -8.159041331855791 185.25206274411775 -62.60000000000005
+ vertex -8.159041331855791 185.25206274411775 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912362 0.6087614290087194 -8.122510965098949e-17
+ outer loop
+ vertex -2.2831994499097514 193.24754406618027 617.3999999999999
+ vertex -1.854119168895446 192.6883557569766 -62.60000000000005
+ vertex -2.2831994499097514 193.24754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912362 0.6087614290087194 -8.122510965098949e-17
+ outer loop
+ vertex -1.854119168895446 192.6883557569766 -62.60000000000005
+ vertex -2.2831994499097514 193.24754406618027 617.3999999999999
+ vertex -1.854119168895446 192.6883557569766 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087043 -0.7933533402912478 1.7399399201488127e-17
+ outer loop
+ vertex 1.4050691403082394 196.93581265639824 617.3999999999999
+ vertex 1.964257449511918 196.50673237538396 -62.60000000000005
+ vertex 1.964257449511918 196.50673237538396 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087043 -0.7933533402912478 1.7399399201488127e-17
+ outer loop
+ vertex 1.964257449511918 196.50673237538396 -62.60000000000005
+ vertex 1.4050691403082394 196.93581265639824 617.3999999999999
+ vertex 1.4050691403082394 196.93581265639824 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222004427 0.9914448613738115 1.6369160198768729e-16
+ outer loop
+ vertex 0.055069140308233296 191.89754406618027 -62.60000000000005
+ vertex 0.75388056208504 191.98954433519978 617.3999999999999
+ vertex 0.75388056208504 191.98954433519978 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222004427 0.9914448613738115 1.6369160198768729e-16
+ outer loop
+ vertex 0.75388056208504 191.98954433519978 617.3999999999999
+ vertex 0.055069140308233296 191.89754406618027 -62.60000000000005
+ vertex 0.055069140308233296 191.89754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912342 -0.6087614290087219 -2.488942827790612e-16
+ outer loop
+ vertex -1.8541191688954417 196.50673237538396 617.3999999999999
+ vertex -2.28319944990975 195.94754406618028 -62.60000000000005
+ vertex -1.8541191688954417 196.50673237538396 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912342 -0.6087614290087219 -2.488942827790612e-16
+ outer loop
+ vertex -2.28319944990975 195.94754406618028 -62.60000000000005
+ vertex -1.8541191688954417 196.50673237538396 617.3999999999999
+ vertex -2.28319944990975 195.94754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738105 -0.13052619222005082 -2.242484713441213e-16
+ outer loop
+ vertex -2.5529305906722497 195.2963554879571 617.3999999999999
+ vertex -2.644930859691766 194.59754406618026 -62.60000000000005
+ vertex -2.5529305906722497 195.2963554879571 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738105 -0.13052619222005082 -2.242484713441213e-16
+ outer loop
+ vertex -2.644930859691766 194.59754406618026 -62.60000000000005
+ vertex -2.5529305906722497 195.2963554879571 617.3999999999999
+ vertex -2.644930859691766 194.59754406618026 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222004427 -0.9914448613738115 -1.6369160198768729e-16
+ outer loop
+ vertex -0.6437422814685692 197.20554379716077 617.3999999999999
+ vertex 0.05506914030823612 197.29754406618028 -62.60000000000005
+ vertex 0.05506914030823612 197.29754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222004427 -0.9914448613738115 -1.6369160198768729e-16
+ outer loop
+ vertex 0.05506914030823612 197.29754406618028 -62.60000000000005
+ vertex -0.6437422814685692 197.20554379716077 617.3999999999999
+ vertex -0.6437422814685692 197.20554379716077 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.3826834323651081 0.9238795325112794 4.7612051549712884e-17
+ outer loop
+ vertex -8.54493085969176 185.41190342012518 -62.60000000000005
+ vertex -8.159041331855791 185.25206274411775 617.3999999999999
+ vertex -8.159041331855791 185.25206274411775 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.3826834323651081 0.9238795325112794 4.7612051549712884e-17
+ outer loop
+ vertex -8.159041331855791 185.25206274411775 617.3999999999999
+ vertex -8.54493085969176 185.41190342012518 -62.60000000000005
+ vertex -8.54493085969176 185.41190342012518 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912353 0.6087614290087207 2.4889428277906123e-16
+ outer loop
+ vertex 1.9642574495119138 192.6883557569766 617.3999999999999
+ vertex 2.39333773052622 193.24754406618027 -62.60000000000005
+ vertex 1.9642574495119138 192.6883557569766 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912353 0.6087614290087207 2.4889428277906123e-16
+ outer loop
+ vertex 2.39333773052622 193.24754406618027 -62.60000000000005
+ vertex 1.9642574495119138 192.6883557569766 617.3999999999999
+ vertex 2.39333773052622 193.24754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087003 0.7933533402912508 -1.739939920148687e-17
+ outer loop
+ vertex -8.87630170959024 185.6661732162818 -62.60000000000005
+ vertex -8.54493085969176 185.41190342012518 617.3999999999999
+ vertex -8.54493085969176 185.41190342012518 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.6087614290087003 0.7933533402912508 -1.739939920148687e-17
+ outer loop
+ vertex -8.54493085969176 185.41190342012518 617.3999999999999
+ vertex -8.87630170959024 185.6661732162818 -62.60000000000005
+ vertex -8.87630170959024 185.6661732162818 617.3999999999999
+ endloop
+endfacet
+facet normal -0.3826834323650632 0.9238795325112977 2.0684907214262414e-16
+ outer loop
+ vertex -7.330820387527722 185.25206274411778 -62.60000000000005
+ vertex -6.944930859691755 185.41190342012518 617.3999999999999
+ vertex -6.944930859691755 185.41190342012518 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.3826834323650632 0.9238795325112977 2.0684907214262414e-16
+ outer loop
+ vertex -6.944930859691755 185.41190342012518 617.3999999999999
+ vertex -7.330820387527722 185.25206274411778 -62.60000000000005
+ vertex -7.330820387527722 185.25206274411778 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087043 0.7933533402912478 -1.7399399201488127e-17
+ outer loop
+ vertex -1.854119168895446 192.6883557569766 -62.60000000000005
+ vertex -1.294930859691767 192.2592754759623 617.3999999999999
+ vertex -1.294930859691767 192.2592754759623 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.6087614290087043 0.7933533402912478 -1.7399399201488127e-17
+ outer loop
+ vertex -1.294930859691767 192.2592754759623 617.3999999999999
+ vertex -1.854119168895446 192.6883557569766 -62.60000000000005
+ vertex -1.854119168895446 192.6883557569766 617.3999999999999
+ endloop
+endfacet
+facet normal 0.3826834323651019 0.9238795325112817 4.761205154971449e-17
+ outer loop
+ vertex -1.294930859691767 192.2592754759623 -62.60000000000005
+ vertex -0.6437422814685734 191.98954433519978 617.3999999999999
+ vertex -0.6437422814685734 191.98954433519978 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.3826834323651019 0.9238795325112817 4.761205154971449e-17
+ outer loop
+ vertex -0.6437422814685734 191.98954433519978 617.3999999999999
+ vertex -1.294930859691767 192.2592754759623 -62.60000000000005
+ vertex -1.294930859691767 192.2592754759623 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738104 0.13052619222005143 -1.8829806831558401e-16
+ outer loop
+ vertex -2.644930859691766 194.59754406618026 617.3999999999999
+ vertex -2.552930590672251 193.89873264440348 -62.60000000000005
+ vertex -2.644930859691766 194.59754406618026 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738104 0.13052619222005143 -1.8829806831558401e-16
+ outer loop
+ vertex -2.552930590672251 193.89873264440348 -62.60000000000005
+ vertex -2.644930859691766 194.59754406618026 617.3999999999999
+ vertex -2.552930590672251 193.89873264440348 617.3999999999999
+ endloop
+endfacet
+facet normal -0.99144486137381 -0.13052619222005554 1.8829806831558335e-16
+ outer loop
+ vertex -9.910856685980843 185.33872502107778 -62.60000000000008
+ vertex -9.944930859691775 185.5975440661803 617.3999999999999
+ vertex -9.944930859691775 185.5975440661803 -62.60000000000008
+ endloop
+endfacet
+facet normal -0.99144486137381 -0.13052619222005554 1.8829806831558335e-16
+ outer loop
+ vertex -9.944930859691775 185.5975440661803 617.3999999999999
+ vertex -9.910856685980843 185.33872502107778 -62.60000000000008
+ vertex -9.910856685980843 185.33872502107778 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912247 0.6087614290087344 -8.122510965098507e-17
+ outer loop
+ vertex -9.130571505746875 185.99754406618027 617.3999999999999
+ vertex -8.87630170959024 185.6661732162818 -62.60000000000005
+ vertex -9.130571505746875 185.99754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912247 0.6087614290087344 -8.122510965098507e-17
+ outer loop
+ vertex -8.87630170959024 185.6661732162818 -62.60000000000005
+ vertex -9.130571505746875 185.99754406618027 617.3999999999999
+ vertex -8.87630170959024 185.6661732162818 617.3999999999999
+ endloop
+endfacet
+facet normal -0.38268343236510005 0.9238795325112825 2.0684907214262968e-16
+ outer loop
+ vertex 0.75388056208504 191.98954433519978 -62.60000000000005
+ vertex 1.4050691403082352 192.2592754759623 617.3999999999999
+ vertex 1.4050691403082352 192.2592754759623 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.38268343236510005 0.9238795325112825 2.0684907214262968e-16
+ outer loop
+ vertex 1.4050691403082352 192.2592754759623 617.3999999999999
+ vertex 0.75388056208504 191.98954433519978 -62.60000000000005
+ vertex 0.75388056208504 191.98954433519978 617.3999999999999
+ endloop
+endfacet
+facet normal -0.3826834323651081 -0.9238795325112794 -4.7612051549712884e-17
+ outer loop
+ vertex -7.330820387527747 188.3430253882428 617.3999999999999
+ vertex -6.944930859691778 188.1831847122354 -62.60000000000005
+ vertex -6.944930859691778 188.1831847122354 617.3999999999999
+ endloop
+endfacet
+facet normal -0.3826834323651081 -0.9238795325112794 -4.7612051549712884e-17
+ outer loop
+ vertex -6.944930859691778 188.1831847122354 -62.60000000000005
+ vertex -7.330820387527747 188.3430253882428 617.3999999999999
+ vertex -7.330820387527747 188.3430253882428 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222006226 -0.9914448613738092 -1.6369160198769074e-16
+ outer loop
+ vertex -8.159041331855816 188.34302538824278 617.3999999999999
+ vertex -7.7449308596917845 188.39754406618027 -62.60000000000005
+ vertex -7.7449308596917845 188.39754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222006226 -0.9914448613738092 -1.6369160198769074e-16
+ outer loop
+ vertex -7.7449308596917845 188.39754406618027 -62.60000000000005
+ vertex -8.159041331855816 188.34302538824278 617.3999999999999
+ vertex -8.159041331855816 188.34302538824278 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738115 -0.1305261922200436 -2.2424847134412055e-16
+ outer loop
+ vertex -9.290412181754292 187.2116545383443 617.3999999999999
+ vertex -9.344930859691782 186.79754406618028 -62.60000000000005
+ vertex -9.290412181754292 187.2116545383443 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738115 -0.1305261922200436 -2.2424847134412055e-16
+ outer loop
+ vertex -9.344930859691782 186.79754406618028 -62.60000000000005
+ vertex -9.290412181754292 187.2116545383443 617.3999999999999
+ vertex -9.344930859691782 186.79754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738092 -0.13052619222006198 1.882980683155823e-16
+ outer loop
+ vertex -6.144930859691763 186.7975440661803 617.3999999999999
+ vertex -6.199449537629255 187.21165453834433 -62.60000000000005
+ vertex -6.144930859691763 186.7975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738092 -0.13052619222006198 1.882980683155823e-16
+ outer loop
+ vertex -6.199449537629255 187.21165453834433 -62.60000000000005
+ vertex -6.144930859691763 186.7975440661803 617.3999999999999
+ vertex -6.199449537629255 187.21165453834433 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912336 0.6087614290087228 2.488942827790612e-16
+ outer loop
+ vertex -6.613560009793279 185.6661732162818 617.3999999999999
+ vertex -6.359290213636655 185.9975440661803 -62.60000000000005
+ vertex -6.613560009793279 185.6661732162818 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912336 0.6087614290087228 2.488942827790612e-16
+ outer loop
+ vertex -6.359290213636655 185.9975440661803 -62.60000000000005
+ vertex -6.613560009793279 185.6661732162818 617.3999999999999
+ vertex -6.359290213636655 185.9975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738159 -0.13052619222001044 -2.242484713441169e-16
+ outer loop
+ vertex -9.290412181754292 202.81165453834433 617.3999999999999
+ vertex -9.344930859691765 202.39754406618027 -62.60000000000005
+ vertex -9.290412181754292 202.81165453834433 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738159 -0.13052619222001044 -2.242484713441169e-16
+ outer loop
+ vertex -9.344930859691765 202.39754406618027 -62.60000000000005
+ vertex -9.290412181754292 202.81165453834433 617.3999999999999
+ vertex -9.344930859691765 202.39754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087399 -0.7933533402912204 -2.359101198653037e-16
+ outer loop
+ vertex -8.87630170959026 187.92891491607875 617.3999999999999
+ vertex -8.544930859691787 188.1831847122354 -62.60000000000005
+ vertex -8.544930859691787 188.1831847122354 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087399 -0.7933533402912204 -2.359101198653037e-16
+ outer loop
+ vertex -8.544930859691787 188.1831847122354 -62.60000000000005
+ vertex -8.87630170959026 187.92891491607875 617.3999999999999
+ vertex -8.87630170959026 187.92891491607875 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222000852 -0.9914448613738163 -1.0937881967046056e-16
+ outer loop
+ vertex -7.7449308596917845 188.39754406618027 617.3999999999999
+ vertex -7.330820387527747 188.3430253882428 -62.60000000000005
+ vertex -7.330820387527747 188.3430253882428 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222000852 -0.9914448613738163 -1.0937881967046056e-16
+ outer loop
+ vertex -7.330820387527747 188.3430253882428 -62.60000000000005
+ vertex -7.7449308596917845 188.39754406618027 617.3999999999999
+ vertex -7.7449308596917845 188.39754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738092 0.13052619222006198 -1.882980683155823e-16
+ outer loop
+ vertex -9.344930859691782 186.79754406618028 617.3999999999999
+ vertex -9.290412181754286 186.38343359401622 -62.60000000000005
+ vertex -9.344930859691782 186.79754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738092 0.13052619222006198 -1.882980683155823e-16
+ outer loop
+ vertex -9.290412181754286 186.38343359401622 -62.60000000000005
+ vertex -9.344930859691782 186.79754406618028 617.3999999999999
+ vertex -9.290412181754286 186.38343359401622 617.3999999999999
+ endloop
+endfacet
+facet normal -0.38268343236504526 -0.9238795325113054 -4.761205154972953e-17
+ outer loop
+ vertex -7.330820387527756 203.94302538824277 617.3999999999999
+ vertex -6.944930859691767 203.7831847122354 -62.60000000000005
+ vertex -6.944930859691767 203.7831847122354 617.3999999999999
+ endloop
+endfacet
+facet normal -0.38268343236504526 -0.9238795325113054 -4.761205154972953e-17
+ outer loop
+ vertex -6.944930859691767 203.7831847122354 -62.60000000000005
+ vertex -7.330820387527756 203.94302538824277 617.3999999999999
+ vertex -7.330820387527756 203.94302538824277 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912336 -0.6087614290087228 -2.488942827790612e-16
+ outer loop
+ vertex -8.87630170959026 187.92891491607875 617.3999999999999
+ vertex -9.130571505746886 187.5975440661803 -62.60000000000005
+ vertex -8.87630170959026 187.92891491607875 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912336 -0.6087614290087228 -2.488942827790612e-16
+ outer loop
+ vertex -9.130571505746886 187.5975440661803 -62.60000000000005
+ vertex -8.87630170959026 187.92891491607875 617.3999999999999
+ vertex -9.130571505746886 187.5975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912434 -0.6087614290087101 -2.4889428277906147e-16
+ outer loop
+ vertex -8.876301709590258 203.52891491607872 617.3999999999999
+ vertex -9.130571505746875 203.19754406618028 -62.60000000000005
+ vertex -8.876301709590258 203.52891491607872 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912434 -0.6087614290087101 -2.4889428277906147e-16
+ outer loop
+ vertex -9.130571505746875 203.19754406618028 -62.60000000000005
+ vertex -8.876301709590258 203.52891491607872 617.3999999999999
+ vertex -9.130571505746875 203.19754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738092 -0.13052619222006198 1.882980683155823e-16
+ outer loop
+ vertex -6.144930859691768 202.3975440661803 617.3999999999999
+ vertex -6.199449537629263 202.81165453834433 -62.60000000000005
+ vertex -6.144930859691768 202.3975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738092 -0.13052619222006198 1.882980683155823e-16
+ outer loop
+ vertex -6.199449537629263 202.81165453834433 -62.60000000000005
+ vertex -6.144930859691768 202.3975440661803 617.3999999999999
+ vertex -6.199449537629263 202.81165453834433 617.3999999999999
+ endloop
+endfacet
+facet normal 0.38268343236510927 -0.9238795325112786 -2.0684907214263106e-16
+ outer loop
+ vertex -8.544930859691787 203.7831847122354 617.3999999999999
+ vertex -8.15904133185582 203.94302538824277 -62.60000000000005
+ vertex -8.15904133185582 203.94302538824277 617.3999999999999
+ endloop
+endfacet
+facet normal 0.38268343236510927 -0.9238795325112786 -2.0684907214263106e-16
+ outer loop
+ vertex -8.15904133185582 203.94302538824277 -62.60000000000005
+ vertex -8.544930859691787 203.7831847122354 617.3999999999999
+ vertex -8.544930859691787 203.7831847122354 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112783 -0.3826834323651104 -2.4491671163867886e-16
+ outer loop
+ vertex -9.130571505746875 203.19754406618028 617.3999999999999
+ vertex -9.290412181754292 202.81165453834433 -62.60000000000005
+ vertex -9.130571505746875 203.19754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112783 -0.3826834323651104 -2.4491671163867886e-16
+ outer loop
+ vertex -9.290412181754292 202.81165453834433 -62.60000000000005
+ vertex -9.130571505746875 203.19754406618028 617.3999999999999
+ vertex -9.290412181754292 202.81165453834433 617.3999999999999
+ endloop
+endfacet
+facet normal 0.38268343236506075 -0.9238795325112987 -2.0684907214262374e-16
+ outer loop
+ vertex -8.544930859691787 188.1831847122354 617.3999999999999
+ vertex -8.159041331855816 188.34302538824278 -62.60000000000005
+ vertex -8.159041331855816 188.34302538824278 617.3999999999999
+ endloop
+endfacet
+facet normal 0.38268343236506075 -0.9238795325112987 -2.0684907214262374e-16
+ outer loop
+ vertex -8.159041331855816 188.34302538824278 -62.60000000000005
+ vertex -8.544930859691787 188.1831847122354 617.3999999999999
+ vertex -8.544930859691787 188.1831847122354 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087003 -0.7933533402912508 1.739939920148687e-17
+ outer loop
+ vertex -6.944930859691778 188.1831847122354 617.3999999999999
+ vertex -6.613560009793298 187.92891491607878 -62.60000000000005
+ vertex -6.613560009793298 187.92891491607878 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087003 -0.7933533402912508 1.739939920148687e-17
+ outer loop
+ vertex -6.613560009793298 187.92891491607878 -62.60000000000005
+ vertex -6.944930859691778 188.1831847122354 617.3999999999999
+ vertex -6.944930859691778 188.1831847122354 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738092 0.13052619222006198 -1.882980683155823e-16
+ outer loop
+ vertex -9.344930859691765 202.39754406618027 617.3999999999999
+ vertex -9.290412181754272 201.98343359401625 -62.60000000000005
+ vertex -9.344930859691765 202.39754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738092 0.13052619222006198 -1.882980683155823e-16
+ outer loop
+ vertex -9.290412181754272 201.98343359401625 -62.60000000000005
+ vertex -9.344930859691765 202.39754406618027 617.3999999999999
+ vertex -9.290412181754272 201.98343359401625 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087101 -0.7933533402912433 1.739939920148994e-17
+ outer loop
+ vertex -6.944930859691767 203.7831847122354 617.3999999999999
+ vertex -6.613560009793296 203.52891491607878 -62.60000000000005
+ vertex -6.613560009793296 203.52891491607878 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087101 -0.7933533402912433 1.739939920148994e-17
+ outer loop
+ vertex -6.613560009793296 203.52891491607878 -62.60000000000005
+ vertex -6.944930859691767 203.7831847122354 617.3999999999999
+ vertex -6.944930859691767 203.7831847122354 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112978 -0.38268343236506286 1.3951546310861644e-16
+ outer loop
+ vertex -6.199449537629263 202.81165453834433 617.3999999999999
+ vertex -6.359290213636658 203.1975440661803 -62.60000000000005
+ vertex -6.199449537629263 202.81165453834433 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112978 -0.38268343236506286 1.3951546310861644e-16
+ outer loop
+ vertex -6.359290213636658 203.1975440661803 -62.60000000000005
+ vertex -6.199449537629263 202.81165453834433 617.3999999999999
+ vertex -6.359290213636658 203.1975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738116 0.13052619222004325 2.2424847134412045e-16
+ outer loop
+ vertex -6.199449537629252 186.38343359401625 617.3999999999999
+ vertex -6.144930859691763 186.7975440661803 -62.60000000000005
+ vertex -6.199449537629252 186.38343359401625 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738116 0.13052619222004325 2.2424847134412045e-16
+ outer loop
+ vertex -6.144930859691763 186.7975440661803 -62.60000000000005
+ vertex -6.199449537629252 186.38343359401625 617.3999999999999
+ vertex -6.144930859691763 186.7975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112836 -0.38268343236509744 1.3951546310860875e-16
+ outer loop
+ vertex -6.199449537629255 187.21165453834433 617.3999999999999
+ vertex -6.359290213636666 187.59754406618032 -62.60000000000005
+ vertex -6.199449537629255 187.21165453834433 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112836 -0.38268343236509744 1.3951546310860875e-16
+ outer loop
+ vertex -6.359290213636666 187.59754406618032 -62.60000000000005
+ vertex -6.199449537629255 187.21165453834433 617.3999999999999
+ vertex -6.359290213636666 187.59754406618032 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112956 -0.38268343236506824 -2.4491671163867664e-16
+ outer loop
+ vertex -9.130571505746886 187.5975440661803 617.3999999999999
+ vertex -9.290412181754292 187.2116545383443 -62.60000000000005
+ vertex -9.130571505746886 187.5975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112956 -0.38268343236506824 -2.4491671163867664e-16
+ outer loop
+ vertex -9.290412181754292 187.2116545383443 -62.60000000000005
+ vertex -9.130571505746886 187.5975440661803 617.3999999999999
+ vertex -9.290412181754292 187.2116545383443 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222006337 -0.9914448613738089 -1.0937881967044814e-16
+ outer loop
+ vertex -7.744930859691788 203.9975440661803 617.3999999999999
+ vertex -7.330820387527756 203.94302538824277 -62.60000000000005
+ vertex -7.330820387527756 203.94302538824277 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222006337 -0.9914448613738089 -1.0937881967044814e-16
+ outer loop
+ vertex -7.330820387527756 203.94302538824277 -62.60000000000005
+ vertex -7.744930859691788 203.9975440661803 617.3999999999999
+ vertex -7.744930859691788 203.9975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222006226 -0.9914448613738092 -1.6369160198769074e-16
+ outer loop
+ vertex -8.15904133185582 203.94302538824277 617.3999999999999
+ vertex -7.744930859691788 203.9975440661803 -62.60000000000005
+ vertex -7.744930859691788 203.9975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222006226 -0.9914448613738092 -1.6369160198769074e-16
+ outer loop
+ vertex -7.744930859691788 203.9975440661803 -62.60000000000005
+ vertex -8.15904133185582 203.94302538824277 617.3999999999999
+ vertex -8.15904133185582 203.94302538824277 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112902 0.38268343236508157 2.449167116386774e-16
+ outer loop
+ vertex -6.359290213636655 185.9975440661803 617.3999999999999
+ vertex -6.199449537629252 186.38343359401625 -62.60000000000005
+ vertex -6.359290213636655 185.9975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112902 0.38268343236508157 2.449167116386774e-16
+ outer loop
+ vertex -6.199449537629252 186.38343359401625 -62.60000000000005
+ vertex -6.359290213636655 185.9975440661803 617.3999999999999
+ vertex -6.199449537629252 186.38343359401625 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087366 0.793353340291223 2.3591011986530333e-16
+ outer loop
+ vertex -6.944930859691755 185.41190342012518 -62.60000000000005
+ vertex -6.613560009793279 185.6661732162818 617.3999999999999
+ vertex -6.613560009793279 185.6661732162818 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087366 0.793353340291223 2.3591011986530333e-16
+ outer loop
+ vertex -6.613560009793279 185.6661732162818 617.3999999999999
+ vertex -6.944930859691755 185.41190342012518 -62.60000000000005
+ vertex -6.944930859691755 185.41190342012518 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087431 -0.7933533402912178 -2.3591011986530397e-16
+ outer loop
+ vertex -8.876301709590258 203.52891491607872 617.3999999999999
+ vertex -8.544930859691787 203.7831847122354 -62.60000000000005
+ vertex -8.544930859691787 203.7831847122354 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087431 -0.7933533402912178 -2.3591011986530397e-16
+ outer loop
+ vertex -8.544930859691787 203.7831847122354 -62.60000000000005
+ vertex -8.876301709590258 203.52891491607872 617.3999999999999
+ vertex -8.876301709590258 203.52891491607872 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112836 0.38268343236509744 -1.3951546310860875e-16
+ outer loop
+ vertex -9.290412181754286 186.38343359401622 617.3999999999999
+ vertex -9.130571505746875 185.99754406618027 -62.60000000000005
+ vertex -9.290412181754286 186.38343359401622 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112836 0.38268343236509744 -1.3951546310860875e-16
+ outer loop
+ vertex -9.130571505746875 185.99754406618027 -62.60000000000005
+ vertex -9.290412181754286 186.38343359401622 617.3999999999999
+ vertex -9.130571505746875 185.99754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112978 0.38268343236506286 -1.3951546310861644e-16
+ outer loop
+ vertex -9.290412181754272 201.98343359401625 617.3999999999999
+ vertex -9.130571505746877 201.5975440661803 -62.60000000000005
+ vertex -9.290412181754272 201.98343359401625 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112978 0.38268343236506286 -1.3951546310861644e-16
+ outer loop
+ vertex -9.130571505746877 201.5975440661803 -62.60000000000005
+ vertex -9.290412181754272 201.98343359401625 617.3999999999999
+ vertex -9.130571505746877 201.5975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912383 -0.6087614290087168 8.122510965099029e-17
+ outer loop
+ vertex -6.359290213636658 203.1975440661803 617.3999999999999
+ vertex -6.613560009793296 203.52891491607878 -62.60000000000005
+ vertex -6.359290213636658 203.1975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912383 -0.6087614290087168 8.122510965099029e-17
+ outer loop
+ vertex -6.613560009793296 203.52891491607878 -62.60000000000005
+ vertex -6.359290213636658 203.1975440661803 617.3999999999999
+ vertex -6.613560009793296 203.52891491607878 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912247 -0.6087614290087344 8.122510965098507e-17
+ outer loop
+ vertex -6.359290213636666 187.59754406618032 617.3999999999999
+ vertex -6.613560009793298 187.92891491607878 -62.60000000000005
+ vertex -6.359290213636666 187.59754406618032 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912247 -0.6087614290087344 8.122510965098507e-17
+ outer loop
+ vertex -6.613560009793298 187.92891491607878 -62.60000000000005
+ vertex -6.359290213636666 187.59754406618032 617.3999999999999
+ vertex -6.613560009793298 187.92891491607878 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738092 -0.13052619222006198 1.882980683155823e-16
+ outer loop
+ vertex 9.455069140308245 202.3975440661803 617.3999999999999
+ vertex 9.40055046237075 202.81165453834433 -62.60000000000005
+ vertex 9.455069140308245 202.3975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738092 -0.13052619222006198 1.882980683155823e-16
+ outer loop
+ vertex 9.40055046237075 202.81165453834433 -62.60000000000005
+ vertex 9.455069140308245 202.3975440661803 617.3999999999999
+ vertex 9.40055046237075 202.81165453834433 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087366 -0.793353340291223 -2.3591011986530333e-16
+ outer loop
+ vertex 6.723698290409745 203.52891491607878 617.3999999999999
+ vertex 7.0550691403082215 203.7831847122354 -62.60000000000005
+ vertex 7.0550691403082215 203.7831847122354 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087366 -0.793353340291223 -2.3591011986530333e-16
+ outer loop
+ vertex 7.0550691403082215 203.7831847122354 -62.60000000000005
+ vertex 6.723698290409745 203.52891491607878 617.3999999999999
+ vertex 6.723698290409745 203.52891491607878 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.38268343236510927 0.9238795325112786 2.0684907214263106e-16
+ outer loop
+ vertex -7.330820387527713 200.85206274411777 -62.60000000000005
+ vertex -6.9449308596917465 201.0119034201252 617.3999999999999
+ vertex -6.9449308596917465 201.0119034201252 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.38268343236510927 0.9238795325112786 2.0684907214263106e-16
+ outer loop
+ vertex -6.9449308596917465 201.0119034201252 617.3999999999999
+ vertex -7.330820387527713 200.85206274411777 -62.60000000000005
+ vertex -7.330820387527713 200.85206274411777 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290086999 0.7933533402912512 -1.739939920148675e-17
+ outer loop
+ vertex 6.723698290409766 201.2661732162818 -62.60000000000005
+ vertex 7.0550691403082455 201.01190342012518 617.3999999999999
+ vertex 7.0550691403082455 201.01190342012518 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.6087614290086999 0.7933533402912512 -1.739939920148675e-17
+ outer loop
+ vertex 7.0550691403082455 201.01190342012518 617.3999999999999
+ vertex 6.723698290409766 201.2661732162818 -62.60000000000005
+ vertex 6.723698290409766 201.2661732162818 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087441 0.7933533402912172 -1.7399399201500614e-17
+ outer loop
+ vertex -8.876301709590237 201.2661732162818 -62.60000000000005
+ vertex -8.544930859691766 201.01190342012518 617.3999999999999
+ vertex -8.544930859691766 201.01190342012518 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.6087614290087441 0.7933533402912172 -1.7399399201500614e-17
+ outer loop
+ vertex -8.544930859691766 201.01190342012518 617.3999999999999
+ vertex -8.876301709590237 201.2661732162818 -62.60000000000005
+ vertex -8.876301709590237 201.2661732162818 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912434 0.6087614290087101 2.4889428277906147e-16
+ outer loop
+ vertex -6.613560009793275 201.26617321628183 617.3999999999999
+ vertex -6.359290213636661 201.59754406618032 -62.60000000000005
+ vertex -6.613560009793275 201.26617321628183 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912434 0.6087614290087101 2.4889428277906147e-16
+ outer loop
+ vertex -6.359290213636661 201.59754406618032 -62.60000000000005
+ vertex -6.613560009793275 201.26617321628183 617.3999999999999
+ vertex -6.359290213636661 201.59754406618032 617.3999999999999
+ endloop
+endfacet
+facet normal -0.3826834323651081 -0.9238795325112794 -4.7612051549712884e-17
+ outer loop
+ vertex 8.269179612472257 203.94302538824283 617.3999999999999
+ vertex 8.655069140308228 203.7831847122354 -62.60000000000005
+ vertex 8.655069140308228 203.7831847122354 617.3999999999999
+ endloop
+endfacet
+facet normal -0.3826834323651081 -0.9238795325112794 -4.7612051549712884e-17
+ outer loop
+ vertex 8.655069140308228 203.7831847122354 -62.60000000000005
+ vertex 8.269179612472257 203.94302538824283 617.3999999999999
+ vertex 8.269179612472257 203.94302538824283 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912247 -0.6087614290087344 8.122510965098507e-17
+ outer loop
+ vertex 9.24070978636334 203.1975440661803 617.3999999999999
+ vertex 8.986439990206707 203.52891491607878 -62.60000000000005
+ vertex 9.24070978636334 203.1975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912247 -0.6087614290087344 8.122510965098507e-17
+ outer loop
+ vertex 8.986439990206707 203.52891491607878 -62.60000000000005
+ vertex 9.24070978636334 203.1975440661803 617.3999999999999
+ vertex 8.986439990206707 203.52891491607878 617.3999999999999
+ endloop
+endfacet
+facet normal 0.3826834323650632 -0.9238795325112977 -2.0684907214262414e-16
+ outer loop
+ vertex 7.0550691403082215 203.7831847122354 617.3999999999999
+ vertex 7.440958668144188 203.94302538824277 -62.60000000000005
+ vertex 7.440958668144188 203.94302538824277 617.3999999999999
+ endloop
+endfacet
+facet normal 0.3826834323650632 -0.9238795325112977 -2.0684907214262414e-16
+ outer loop
+ vertex 7.440958668144188 203.94302538824277 -62.60000000000005
+ vertex 7.0550691403082215 203.7831847122354 617.3999999999999
+ vertex 7.0550691403082215 203.7831847122354 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222005638 0.9914448613738099 1.0937881967044973e-16
+ outer loop
+ vertex -8.1590413318558 200.85206274411777 -62.60000000000005
+ vertex -7.744930859691745 200.79754406618028 617.3999999999999
+ vertex -7.744930859691745 200.79754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222005638 0.9914448613738099 1.0937881967044973e-16
+ outer loop
+ vertex -7.744930859691745 200.79754406618028 617.3999999999999
+ vertex -8.1590413318558 200.85206274411777 -62.60000000000005
+ vertex -8.1590413318558 200.85206274411777 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912336 -0.6087614290087228 -2.488942827790612e-16
+ outer loop
+ vertex 6.723698290409745 203.52891491607878 617.3999999999999
+ vertex 6.469428494253122 203.19754406618028 -62.60000000000005
+ vertex 6.723698290409745 203.52891491607878 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912336 -0.6087614290087228 -2.488942827790612e-16
+ outer loop
+ vertex 6.469428494253122 203.19754406618028 -62.60000000000005
+ vertex 6.723698290409745 203.52891491607878 617.3999999999999
+ vertex 6.469428494253122 203.19754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112902 -0.38268343236508157 -2.449167116386774e-16
+ outer loop
+ vertex 6.469428494253122 203.19754406618028 617.3999999999999
+ vertex 6.309587818245718 202.81165453834433 -62.60000000000005
+ vertex 6.469428494253122 203.19754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112902 -0.38268343236508157 -2.449167116386774e-16
+ outer loop
+ vertex 6.309587818245718 202.81165453834433 -62.60000000000005
+ vertex 6.469428494253122 203.19754406618028 617.3999999999999
+ vertex 6.309587818245718 202.81165453834433 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738116 -0.13052619222004325 -2.2424847134412045e-16
+ outer loop
+ vertex 6.309587818245718 202.81165453834433 617.3999999999999
+ vertex 6.255069140308228 202.39754406618027 -62.60000000000005
+ vertex 6.309587818245718 202.81165453834433 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738116 -0.13052619222004325 -2.2424847134412045e-16
+ outer loop
+ vertex 6.255069140308228 202.39754406618027 -62.60000000000005
+ vertex 6.309587818245718 202.81165453834433 617.3999999999999
+ vertex 6.255069140308228 202.39754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912182 0.6087614290087429 -8.122510965098253e-17
+ outer loop
+ vertex -9.130571505746877 201.5975440661803 617.3999999999999
+ vertex -8.876301709590237 201.2661732162818 -62.60000000000005
+ vertex -9.130571505746877 201.5975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912182 0.6087614290087429 -8.122510965098253e-17
+ outer loop
+ vertex -8.876301709590237 201.2661732162818 -62.60000000000005
+ vertex -9.130571505746877 201.5975440661803 617.3999999999999
+ vertex -8.876301709590237 201.2661732162818 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738159 0.13052619222001044 2.242484713441169e-16
+ outer loop
+ vertex -6.199449537629244 201.98343359401625 617.3999999999999
+ vertex -6.144930859691768 202.3975440661803 -62.60000000000005
+ vertex -6.199449537629244 201.98343359401625 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738159 0.13052619222001044 2.242484713441169e-16
+ outer loop
+ vertex -6.144930859691768 202.3975440661803 -62.60000000000005
+ vertex -6.199449537629244 201.98343359401625 617.3999999999999
+ vertex -6.144930859691768 202.3975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal -0.38268343236506075 0.9238795325112987 2.0684907214262374e-16
+ outer loop
+ vertex 8.269179612472286 200.85206274411777 -62.60000000000005
+ vertex 8.655069140308255 201.01190342012518 617.3999999999999
+ vertex 8.655069140308255 201.01190342012518 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.38268343236506075 0.9238795325112987 2.0684907214262374e-16
+ outer loop
+ vertex 8.655069140308255 201.01190342012518 617.3999999999999
+ vertex 8.269179612472286 200.85206274411777 -62.60000000000005
+ vertex 8.269179612472286 200.85206274411777 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912336 0.6087614290087228 2.488942827790612e-16
+ outer loop
+ vertex 8.98643999020673 201.2661732162818 617.3999999999999
+ vertex 9.240709786363354 201.5975440661803 -62.60000000000005
+ vertex 8.98643999020673 201.2661732162818 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912336 0.6087614290087228 2.488942827790612e-16
+ outer loop
+ vertex 9.240709786363354 201.5975440661803 -62.60000000000005
+ vertex 8.98643999020673 201.2661732162818 617.3999999999999
+ vertex 9.240709786363354 201.5975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222006134 -0.9914448613738092 -1.6369160198769052e-16
+ outer loop
+ vertex 7.440958668144188 203.94302538824277 617.3999999999999
+ vertex 7.855069140308223 203.9975440661803 -62.60000000000005
+ vertex 7.855069140308223 203.9975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222006134 -0.9914448613738092 -1.6369160198769052e-16
+ outer loop
+ vertex 7.855069140308223 203.9975440661803 -62.60000000000005
+ vertex 7.440958668144188 203.94302538824277 617.3999999999999
+ vertex 7.440958668144188 203.94302538824277 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912247 0.6087614290087344 -8.122510965098507e-17
+ outer loop
+ vertex 6.469428494253134 201.59754406618026 617.3999999999999
+ vertex 6.723698290409766 201.2661732162818 -62.60000000000005
+ vertex 6.469428494253134 201.59754406618026 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912247 0.6087614290087344 -8.122510965098507e-17
+ outer loop
+ vertex 6.723698290409766 201.2661732162818 -62.60000000000005
+ vertex 6.469428494253134 201.59754406618026 617.3999999999999
+ vertex 6.723698290409766 201.2661732162818 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087399 0.7933533402912204 2.359101198653037e-16
+ outer loop
+ vertex 8.655069140308255 201.01190342012518 -62.60000000000005
+ vertex 8.98643999020673 201.2661732162818 617.3999999999999
+ vertex 8.98643999020673 201.2661732162818 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087399 0.7933533402912204 2.359101198653037e-16
+ outer loop
+ vertex 8.98643999020673 201.2661732162818 617.3999999999999
+ vertex 8.655069140308255 201.01190342012518 -62.60000000000005
+ vertex 8.655069140308255 201.01190342012518 617.3999999999999
+ endloop
+endfacet
+facet normal 0.3826834323650643 0.9238795325112973 4.761205154972445e-17
+ outer loop
+ vertex -8.544930859691766 201.01190342012518 -62.60000000000005
+ vertex -8.1590413318558 200.85206274411777 617.3999999999999
+ vertex -8.1590413318558 200.85206274411777 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.3826834323650643 0.9238795325112973 4.761205154972445e-17
+ outer loop
+ vertex -8.1590413318558 200.85206274411777 617.3999999999999
+ vertex -8.544930859691766 201.01190342012518 -62.60000000000005
+ vertex -8.544930859691766 201.01190342012518 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087431 0.7933533402912178 2.3591011986530397e-16
+ outer loop
+ vertex -6.9449308596917465 201.0119034201252 -62.60000000000005
+ vertex -6.613560009793275 201.26617321628183 617.3999999999999
+ vertex -6.613560009793275 201.26617321628183 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087431 0.7933533402912178 2.3591011986530397e-16
+ outer loop
+ vertex -6.613560009793275 201.26617321628183 617.3999999999999
+ vertex -6.9449308596917465 201.0119034201252 -62.60000000000005
+ vertex -6.9449308596917465 201.0119034201252 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112836 -0.38268343236509744 1.3951546310860875e-16
+ outer loop
+ vertex 9.40055046237075 202.81165453834433 617.3999999999999
+ vertex 9.24070978636334 203.1975440661803 -62.60000000000005
+ vertex 9.40055046237075 202.81165453834433 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112836 -0.38268343236509744 1.3951546310860875e-16
+ outer loop
+ vertex 9.24070978636334 203.1975440661803 -62.60000000000005
+ vertex 9.40055046237075 202.81165453834433 617.3999999999999
+ vertex 9.24070978636334 203.1975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738092 0.13052619222006198 -1.882980683155823e-16
+ outer loop
+ vertex 6.255069140308228 202.39754406618027 617.3999999999999
+ vertex 6.309587818245723 201.98343359401622 -62.60000000000005
+ vertex 6.255069140308228 202.39754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738092 0.13052619222006198 -1.882980683155823e-16
+ outer loop
+ vertex 6.309587818245723 201.98343359401622 -62.60000000000005
+ vertex 6.255069140308228 202.39754406618027 617.3999999999999
+ vertex 6.309587818245723 201.98343359401622 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087003 -0.7933533402912508 1.739939920148687e-17
+ outer loop
+ vertex 8.655069140308228 203.7831847122354 617.3999999999999
+ vertex 8.986439990206707 203.52891491607878 -62.60000000000005
+ vertex 8.986439990206707 203.52891491607878 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087003 -0.7933533402912508 1.739939920148687e-17
+ outer loop
+ vertex 8.986439990206707 203.52891491607878 -62.60000000000005
+ vertex 8.655069140308228 203.7831847122354 617.3999999999999
+ vertex 8.655069140308228 203.7831847122354 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222006226 0.9914448613738092 1.6369160198769074e-16
+ outer loop
+ vertex 7.855069140308252 200.79754406618028 -62.60000000000005
+ vertex 8.269179612472286 200.85206274411777 617.3999999999999
+ vertex 8.269179612472286 200.85206274411777 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222006226 0.9914448613738092 1.6369160198769074e-16
+ outer loop
+ vertex 8.269179612472286 200.85206274411777 617.3999999999999
+ vertex 7.855069140308252 200.79754406618028 -62.60000000000005
+ vertex 7.855069140308252 200.79754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738115 0.13052619222004277 2.242484713441204e-16
+ outer loop
+ vertex 9.40055046237076 201.98343359401628 617.3999999999999
+ vertex 9.455069140308245 202.3975440661803 -62.60000000000005
+ vertex 9.40055046237076 201.98343359401628 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738115 0.13052619222004277 2.242484713441204e-16
+ outer loop
+ vertex 9.455069140308245 202.3975440661803 -62.60000000000005
+ vertex 9.40055046237076 201.98343359401628 617.3999999999999
+ vertex 9.455069140308245 202.3975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112783 0.3826834323651104 2.4491671163867886e-16
+ outer loop
+ vertex -6.359290213636661 201.59754406618032 617.3999999999999
+ vertex -6.199449537629244 201.98343359401625 -62.60000000000005
+ vertex -6.359290213636661 201.59754406618032 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112783 0.3826834323651104 2.4491671163867886e-16
+ outer loop
+ vertex -6.199449537629244 201.98343359401625 -62.60000000000005
+ vertex -6.359290213636661 201.59754406618032 617.3999999999999
+ vertex -6.199449537629244 201.98343359401625 617.3999999999999
+ endloop
+endfacet
+facet normal -0.1305261922200094 -0.9914448613738162 -1.0937881967046036e-16
+ outer loop
+ vertex 7.855069140308223 203.9975440661803 617.3999999999999
+ vertex 8.269179612472257 203.94302538824283 -62.60000000000005
+ vertex 8.269179612472257 203.94302538824283 617.3999999999999
+ endloop
+endfacet
+facet normal -0.1305261922200094 -0.9914448613738162 -1.0937881967046036e-16
+ outer loop
+ vertex 8.269179612472257 203.94302538824283 -62.60000000000005
+ vertex 7.855069140308223 203.9975440661803 617.3999999999999
+ vertex 7.855069140308223 203.9975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112956 0.38268343236506824 2.4491671163867664e-16
+ outer loop
+ vertex 9.240709786363354 201.5975440661803 617.3999999999999
+ vertex 9.40055046237076 201.98343359401628 -62.60000000000005
+ vertex 9.240709786363354 201.5975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112956 0.38268343236506824 2.4491671163867664e-16
+ outer loop
+ vertex 9.40055046237076 201.98343359401628 -62.60000000000005
+ vertex 9.240709786363354 201.5975440661803 617.3999999999999
+ vertex 9.40055046237076 201.98343359401628 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112836 0.38268343236509744 -1.3951546310860875e-16
+ outer loop
+ vertex 6.309587818245723 201.98343359401622 617.3999999999999
+ vertex 6.469428494253134 201.59754406618026 -62.60000000000005
+ vertex 6.309587818245723 201.98343359401622 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112836 0.38268343236509744 -1.3951546310860875e-16
+ outer loop
+ vertex 6.469428494253134 201.59754406618026 -62.60000000000005
+ vertex 6.309587818245723 201.98343359401622 617.3999999999999
+ vertex 6.469428494253134 201.59754406618026 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222006226 0.9914448613738092 1.6369160198769074e-16
+ outer loop
+ vertex -7.744930859691745 200.79754406618028 -62.60000000000005
+ vertex -7.330820387527713 200.85206274411777 617.3999999999999
+ vertex -7.330820387527713 200.85206274411777 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222006226 0.9914448613738092 1.6369160198769074e-16
+ outer loop
+ vertex -7.330820387527713 200.85206274411777 617.3999999999999
+ vertex -7.744930859691745 200.79754406618028 -62.60000000000005
+ vertex -7.744930859691745 200.79754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112783 -0.3826834323651104 -2.4491671163867886e-16
+ outer loop
+ vertex 6.469428494253139 187.5975440661803 617.3999999999999
+ vertex 6.309587818245721 187.21165453834433 -62.60000000000005
+ vertex 6.469428494253139 187.5975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112783 -0.3826834323651104 -2.4491671163867886e-16
+ outer loop
+ vertex 6.309587818245721 187.21165453834433 -62.60000000000005
+ vertex 6.469428494253139 187.5975440661803 617.3999999999999
+ vertex 6.309587818245721 187.21165453834433 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738159 -0.13052619222001044 -2.242484713441169e-16
+ outer loop
+ vertex 6.309587818245721 187.21165453834433 617.3999999999999
+ vertex 6.255069140308248 186.79754406618028 -62.60000000000005
+ vertex 6.309587818245721 187.21165453834433 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738159 -0.13052619222001044 -2.242484713441169e-16
+ outer loop
+ vertex 6.255069140308248 186.79754406618028 -62.60000000000005
+ vertex 6.309587818245721 187.21165453834433 617.3999999999999
+ vertex 6.255069140308248 186.79754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9238795325112978 0.38268343236506286 -1.3951546310861644e-16
+ outer loop
+ vertex 6.309587818245743 186.38343359401625 617.3999999999999
+ vertex 6.469428494253137 185.9975440661803 -62.60000000000005
+ vertex 6.309587818245743 186.38343359401625 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112978 0.38268343236506286 -1.3951546310861644e-16
+ outer loop
+ vertex 6.469428494253137 185.9975440661803 -62.60000000000005
+ vertex 6.309587818245743 186.38343359401625 617.3999999999999
+ vertex 6.469428494253137 185.9975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 0.9914448613738092 0.13052619222006198 -1.882980683155823e-16
+ outer loop
+ vertex 6.255069140308248 186.79754406618028 617.3999999999999
+ vertex 6.309587818245743 186.38343359401625 -62.60000000000005
+ vertex 6.255069140308248 186.79754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9914448613738092 0.13052619222006198 -1.882980683155823e-16
+ outer loop
+ vertex 6.309587818245743 186.38343359401625 -62.60000000000005
+ vertex 6.255069140308248 186.79754406618028 617.3999999999999
+ vertex 6.309587818245743 186.38343359401625 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222000852 0.9914448613738163 1.0937881967046056e-16
+ outer loop
+ vertex 7.440958668144216 200.85206274411775 -62.60000000000005
+ vertex 7.855069140308252 200.79754406618028 617.3999999999999
+ vertex 7.855069140308252 200.79754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222000852 0.9914448613738163 1.0937881967046056e-16
+ outer loop
+ vertex 7.855069140308252 200.79754406618028 617.3999999999999
+ vertex 7.440958668144216 200.85206274411775 -62.60000000000005
+ vertex 7.440958668144216 200.85206274411775 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222006337 0.9914448613738089 1.0937881967044814e-16
+ outer loop
+ vertex 7.440958668144235 185.25206274411778 -62.60000000000005
+ vertex 7.855069140308268 185.19754406618028 617.3999999999999
+ vertex 7.855069140308268 185.19754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.13052619222006337 0.9914448613738089 1.0937881967044814e-16
+ outer loop
+ vertex 7.855069140308268 185.19754406618028 617.3999999999999
+ vertex 7.440958668144235 185.25206274411778 -62.60000000000005
+ vertex 7.440958668144235 185.25206274411778 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738159 0.13052619222001022 2.242484713441169e-16
+ outer loop
+ vertex 9.40055046237077 186.38343359401628 617.3999999999999
+ vertex 9.455069140308243 186.7975440661803 -62.60000000000005
+ vertex 9.40055046237077 186.38343359401628 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738159 0.13052619222001022 2.242484713441169e-16
+ outer loop
+ vertex 9.455069140308243 186.7975440661803 -62.60000000000005
+ vertex 9.40055046237077 186.38343359401628 617.3999999999999
+ vertex 9.455069140308243 186.7975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal -0.793353340291218 -0.6087614290087431 8.122510965098245e-17
+ outer loop
+ vertex 9.240709786363354 187.59754406618032 617.3999999999999
+ vertex 8.986439990206716 187.92891491607878 -62.60000000000005
+ vertex 9.240709786363354 187.59754406618032 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.793353340291218 -0.6087614290087431 8.122510965098245e-17
+ outer loop
+ vertex 8.986439990206716 187.92891491607878 -62.60000000000005
+ vertex 9.240709786363354 187.59754406618032 617.3999999999999
+ vertex 8.986439990206716 187.92891491607878 617.3999999999999
+ endloop
+endfacet
+facet normal 0.38268343236504526 0.9238795325113054 4.761205154972953e-17
+ outer loop
+ vertex 7.0550691403082455 185.41190342012518 -62.60000000000005
+ vertex 7.440958668144235 185.25206274411778 617.3999999999999
+ vertex 7.440958668144235 185.25206274411778 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.38268343236504526 0.9238795325113054 4.761205154972953e-17
+ outer loop
+ vertex 7.440958668144235 185.25206274411778 617.3999999999999
+ vertex 7.0550691403082455 185.41190342012518 -62.60000000000005
+ vertex 7.0550691403082455 185.41190342012518 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087441 -0.7933533402912172 1.7399399201500614e-17
+ outer loop
+ vertex 8.655069140308244 188.18318471223543 617.3999999999999
+ vertex 8.986439990206716 187.92891491607878 -62.60000000000005
+ vertex 8.986439990206716 187.92891491607878 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087441 -0.7933533402912172 1.7399399201500614e-17
+ outer loop
+ vertex 8.986439990206716 187.92891491607878 -62.60000000000005
+ vertex 8.655069140308244 188.18318471223543 617.3999999999999
+ vertex 8.655069140308244 188.18318471223543 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087091 0.7933533402912439 2.359101198653005e-16
+ outer loop
+ vertex 8.655069140308266 185.4119034201252 -62.60000000000005
+ vertex 8.986439990206739 185.6661732162818 617.3999999999999
+ vertex 8.986439990206739 185.6661732162818 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.6087614290087091 0.7933533402912439 2.359101198653005e-16
+ outer loop
+ vertex 8.986439990206739 185.6661732162818 617.3999999999999
+ vertex 8.655069140308266 185.4119034201252 -62.60000000000005
+ vertex 8.655069140308266 185.4119034201252 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222005638 -0.9914448613738099 -1.0937881967044973e-16
+ outer loop
+ vertex 7.855069140308223 188.3975440661803 617.3999999999999
+ vertex 8.269179612472279 188.3430253882428 -62.60000000000005
+ vertex 8.269179612472279 188.3430253882428 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222005638 -0.9914448613738099 -1.0937881967044973e-16
+ outer loop
+ vertex 8.269179612472279 188.3430253882428 -62.60000000000005
+ vertex 7.855069140308223 188.3975440661803 617.3999999999999
+ vertex 7.855069140308223 188.3975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.6087614290087431 -0.7933533402912178 -2.3591011986530397e-16
+ outer loop
+ vertex 6.723698290409754 187.92891491607875 617.3999999999999
+ vertex 7.055069140308225 188.1831847122354 -62.60000000000005
+ vertex 7.055069140308225 188.1831847122354 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087431 -0.7933533402912178 -2.3591011986530397e-16
+ outer loop
+ vertex 7.055069140308225 188.1831847122354 -62.60000000000005
+ vertex 6.723698290409754 187.92891491607875 617.3999999999999
+ vertex 6.723698290409754 187.92891491607875 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912434 -0.6087614290087101 -2.4889428277906147e-16
+ outer loop
+ vertex 6.723698290409754 187.92891491607875 617.3999999999999
+ vertex 6.469428494253139 187.5975440661803 -62.60000000000005
+ vertex 6.723698290409754 187.92891491607875 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912434 -0.6087614290087101 -2.4889428277906147e-16
+ outer loop
+ vertex 6.469428494253139 187.5975440661803 -62.60000000000005
+ vertex 6.723698290409754 187.92891491607875 617.3999999999999
+ vertex 6.469428494253139 187.5975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912635 0.6087614290086838 2.48894282779062e-16
+ outer loop
+ vertex 8.986439990206739 185.6661732162818 617.3999999999999
+ vertex 9.240709786363354 185.99754406618032 -62.60000000000005
+ vertex 8.986439990206739 185.6661732162818 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7933533402912635 0.6087614290086838 2.48894282779062e-16
+ outer loop
+ vertex 9.240709786363354 185.99754406618032 -62.60000000000005
+ vertex 8.986439990206739 185.6661732162818 617.3999999999999
+ vertex 9.240709786363354 185.99754406618032 617.3999999999999
+ endloop
+endfacet
+facet normal -0.38268343236510943 0.9238795325112785 2.0684907214263106e-16
+ outer loop
+ vertex 8.2691796124723 185.25206274411778 -62.60000000000005
+ vertex 8.655069140308266 185.4119034201252 617.3999999999999
+ vertex 8.655069140308266 185.4119034201252 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.38268343236510943 0.9238795325112785 2.0684907214263106e-16
+ outer loop
+ vertex 8.655069140308266 185.4119034201252 617.3999999999999
+ vertex 8.2691796124723 185.25206274411778 -62.60000000000005
+ vertex 8.2691796124723 185.25206274411778 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087093 0.7933533402912439 -1.739939920148968e-17
+ outer loop
+ vertex 6.723698290409774 185.6661732162818 -62.60000000000005
+ vertex 7.0550691403082455 185.41190342012518 617.3999999999999
+ vertex 7.0550691403082455 185.41190342012518 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.6087614290087093 0.7933533402912439 -1.739939920148968e-17
+ outer loop
+ vertex 7.0550691403082455 185.41190342012518 617.3999999999999
+ vertex 6.723698290409774 185.6661732162818 -62.60000000000005
+ vertex 6.723698290409774 185.6661732162818 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112783 0.3826834323651102 2.449167116386788e-16
+ outer loop
+ vertex 9.240709786363354 185.99754406618032 617.3999999999999
+ vertex 9.40055046237077 186.38343359401628 -62.60000000000005
+ vertex 9.240709786363354 185.99754406618032 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112783 0.3826834323651102 2.449167116386788e-16
+ outer loop
+ vertex 9.40055046237077 186.38343359401628 -62.60000000000005
+ vertex 9.240709786363354 185.99754406618032 617.3999999999999
+ vertex 9.40055046237077 186.38343359401628 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112978 -0.38268343236506286 1.3951546310861644e-16
+ outer loop
+ vertex 9.400550462370747 187.21165453834433 617.3999999999999
+ vertex 9.240709786363354 187.59754406618032 -62.60000000000005
+ vertex 9.400550462370747 187.21165453834433 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9238795325112978 -0.38268343236506286 1.3951546310861644e-16
+ outer loop
+ vertex 9.240709786363354 187.59754406618032 -62.60000000000005
+ vertex 9.400550462370747 187.21165453834433 617.3999999999999
+ vertex 9.240709786363354 187.59754406618032 617.3999999999999
+ endloop
+endfacet
+facet normal 0.3826834323651081 0.9238795325112794 4.7612051549712884e-17
+ outer loop
+ vertex 7.0550691403082455 201.01190342012518 -62.60000000000005
+ vertex 7.440958668144216 200.85206274411775 617.3999999999999
+ vertex 7.440958668144216 200.85206274411775 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.3826834323651081 0.9238795325112794 4.7612051549712884e-17
+ outer loop
+ vertex 7.440958668144216 200.85206274411775 617.3999999999999
+ vertex 7.0550691403082455 201.01190342012518 -62.60000000000005
+ vertex 7.0550691403082455 201.01190342012518 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912383 0.6087614290087168 -8.122510965099029e-17
+ outer loop
+ vertex 6.469428494253137 185.9975440661803 617.3999999999999
+ vertex 6.723698290409774 185.6661732162818 -62.60000000000005
+ vertex 6.469428494253137 185.9975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7933533402912383 0.6087614290087168 -8.122510965099029e-17
+ outer loop
+ vertex 6.723698290409774 185.6661732162818 -62.60000000000005
+ vertex 6.469428494253137 185.9975440661803 617.3999999999999
+ vertex 6.723698290409774 185.6661732162818 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222006226 0.9914448613738092 1.6369160198769074e-16
+ outer loop
+ vertex 7.855069140308268 185.19754406618028 -62.60000000000005
+ vertex 8.2691796124723 185.25206274411778 617.3999999999999
+ vertex 8.2691796124723 185.25206274411778 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.13052619222006226 0.9914448613738092 1.6369160198769074e-16
+ outer loop
+ vertex 8.2691796124723 185.25206274411778 617.3999999999999
+ vertex 7.855069140308268 185.19754406618028 -62.60000000000005
+ vertex 7.855069140308268 185.19754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal -0.3826834323650643 -0.9238795325112973 -4.761205154972445e-17
+ outer loop
+ vertex 8.269179612472279 188.3430253882428 617.3999999999999
+ vertex 8.655069140308244 188.18318471223543 -62.60000000000005
+ vertex 8.655069140308244 188.18318471223543 617.3999999999999
+ endloop
+endfacet
+facet normal -0.3826834323650643 -0.9238795325112973 -4.761205154972445e-17
+ outer loop
+ vertex 8.655069140308244 188.18318471223543 -62.60000000000005
+ vertex 8.269179612472279 188.3430253882428 617.3999999999999
+ vertex 8.269179612472279 188.3430253882428 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.38268343236510927 -0.9238795325112786 -2.0684907214263106e-16
+ outer loop
+ vertex 7.055069140308225 188.1831847122354 617.3999999999999
+ vertex 7.440958668144192 188.3430253882428 -62.60000000000005
+ vertex 7.440958668144192 188.3430253882428 617.3999999999999
+ endloop
+endfacet
+facet normal 0.38268343236510927 -0.9238795325112786 -2.0684907214263106e-16
+ outer loop
+ vertex 7.440958668144192 188.3430253882428 -62.60000000000005
+ vertex 7.055069140308225 188.1831847122354 617.3999999999999
+ vertex 7.055069140308225 188.1831847122354 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738092 -0.13052619222006218 1.8829806831558229e-16
+ outer loop
+ vertex 9.455069140308243 186.7975440661803 617.3999999999999
+ vertex 9.400550462370747 187.21165453834433 -62.60000000000005
+ vertex 9.455069140308243 186.7975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738092 -0.13052619222006218 1.8829806831558229e-16
+ outer loop
+ vertex 9.400550462370747 187.21165453834433 -62.60000000000005
+ vertex 9.455069140308243 186.7975440661803 617.3999999999999
+ vertex 9.400550462370747 187.21165453834433 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222006226 -0.9914448613738092 -1.6369160198769074e-16
+ outer loop
+ vertex 7.440958668144192 188.3430253882428 617.3999999999999
+ vertex 7.855069140308223 188.3975440661803 -62.60000000000005
+ vertex 7.855069140308223 188.3975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222006226 -0.9914448613738092 -1.6369160198769074e-16
+ outer loop
+ vertex 7.855069140308223 188.3975440661803 -62.60000000000005
+ vertex 7.440958668144192 188.3430253882428 617.3999999999999
+ vertex 7.440958668144192 188.3430253882428 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.99144486137381 0.13052619222005554 -1.8829806831558335e-16
+ outer loop
+ vertex 10.02099496659731 203.8563631112828 617.3999999999999
+ vertex 10.055069140308241 203.59754406618026 -62.60000000000005
+ vertex 10.02099496659731 203.8563631112828 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.99144486137381 0.13052619222005554 -1.8829806831558335e-16
+ outer loop
+ vertex 10.055069140308241 203.59754406618026 -62.60000000000005
+ vertex 10.02099496659731 203.8563631112828 617.3999999999999
+ vertex 10.055069140308241 203.59754406618026 617.3999999999999
+ endloop
+endfacet
+facet normal 1.0 1.6631994926596031e-15 -2.080531937439535e-16
+ outer loop
+ vertex 10.055069140308241 203.59754406618026 -62.60000000000005
+ vertex 10.055069140308252 198.39754406618027 617.3999999999999
+ vertex 10.055069140308252 198.39754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.0 1.6631994926596031e-15 -2.080531937439535e-16
+ outer loop
+ vertex 10.055069140308252 198.39754406618027 617.3999999999999
+ vertex 10.055069140308241 203.59754406618026 -62.60000000000005
+ vertex 10.055069140308241 203.59754406618026 617.3999999999999
+ endloop
+endfacet
+facet normal 1.0 -4.302114220422487e-15 -2.080531937439543e-16
+ outer loop
+ vertex 9.655069140308253 198.39754406618027 617.3999999999999
+ vertex 9.655069140308251 197.99754406618027 -62.60000000000005
+ vertex 9.655069140308253 198.39754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.0 -4.302114220422487e-15 -2.080531937439543e-16
+ outer loop
+ vertex 9.655069140308251 197.99754406618027 -62.60000000000005
+ vertex 9.655069140308253 198.39754406618027 617.3999999999999
+ vertex 9.655069140308251 197.99754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 -1.3771336778111648e-16
+ outer loop
+ vertex 6.220754565257503 200.19754406618028 617.3999999999999
+ vertex 8.255069140308239 200.19754406618028 -62.60000000000005
+ vertex 8.255069140308239 200.19754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 -1.3771336778111648e-16
+ outer loop
+ vertex 8.255069140308239 200.19754406618028 -62.60000000000005
+ vertex 6.220754565257503 200.19754406618028 617.3999999999999
+ vertex 6.220754565257503 200.19754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.9238795325112917 0.38268343236507796 -1.395154631086131e-16
+ outer loop
+ vertex 9.921094544092682 204.0975440661803 617.3999999999999
+ vertex 10.02099496659731 203.8563631112828 -62.60000000000005
+ vertex 9.921094544092682 204.0975440661803 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9238795325112917 0.38268343236507796 -1.395154631086131e-16
+ outer loop
+ vertex 10.02099496659731 203.8563631112828 -62.60000000000005
+ vertex 9.921094544092682 204.0975440661803 617.3999999999999
+ vertex 10.02099496659731 203.8563631112828 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7071067811865456 -0.7071067811865497 -2.4449388036193273e-16
+ outer loop
+ vertex 3.7550691403082355 197.73185864123104 617.3999999999999
+ vertex 6.220754565257503 200.19754406618028 -62.60000000000005
+ vertex 6.220754565257503 200.19754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7071067811865456 -0.7071067811865497 -2.4449388036193273e-16
+ outer loop
+ vertex 6.220754565257503 200.19754406618028 -62.60000000000005
+ vertex 3.7550691403082355 197.73185864123104 617.3999999999999
+ vertex 3.7550691403082355 197.73185864123104 -62.60000000000005
+ endloop
+endfacet
+facet normal -1.666920569830041e-14 -1.0 -1.3771336778111313e-16
+ outer loop
+ vertex 8.255069140308237 197.9975440661803 617.3999999999999
+ vertex 9.655069140308251 197.99754406618027 -62.60000000000005
+ vertex 9.655069140308251 197.99754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal -1.666920569830041e-14 -1.0 -1.3771336778111313e-16
+ outer loop
+ vertex 9.655069140308251 197.99754406618027 -62.60000000000005
+ vertex 8.255069140308237 197.9975440661803 617.3999999999999
+ vertex 8.255069140308237 197.9975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 -1.3771336778111648e-16
+ outer loop
+ vertex 9.655069140308253 198.39754406618027 617.3999999999999
+ vertex 10.055069140308252 198.39754406618027 -62.60000000000005
+ vertex 10.055069140308252 198.39754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 -1.3771336778111648e-16
+ outer loop
+ vertex 10.055069140308252 198.39754406618027 -62.60000000000005
+ vertex 9.655069140308253 198.39754406618027 617.3999999999999
+ vertex 9.655069140308253 198.39754406618027 -62.60000000000005
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 2.080531937439538e-16
+ outer loop
+ vertex 8.255069140308237 197.9975440661803 617.3999999999999
+ vertex 8.255069140308239 200.19754406618028 -62.60000000000005
+ vertex 8.255069140308237 197.9975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 2.080531937439538e-16
+ outer loop
+ vertex 8.255069140308239 200.19754406618028 -62.60000000000005
+ vertex 8.255069140308237 197.9975440661803 617.3999999999999
+ vertex 8.255069140308239 200.19754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 1.0 -8.896195608001561e-16 -2.080531937439538e-16
+ outer loop
+ vertex 3.7550691403082355 197.73185864123104 617.3999999999999
+ vertex 3.7550691403082315 191.46322949112954 -62.60000000000005
+ vertex 3.7550691403082355 197.73185864123104 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.0 -8.896195608001561e-16 -2.080531937439538e-16
+ outer loop
+ vertex 3.7550691403082315 191.46322949112954 -62.60000000000005
+ vertex 3.7550691403082355 197.73185864123104 617.3999999999999
+ vertex 3.7550691403082315 191.46322949112954 617.3999999999999
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 2.0805319374395384e-16
+ outer loop
+ vertex -9.944930859691775 185.5975440661803 617.3999999999999
+ vertex -9.944930859691773 190.79754406618028 -62.60000000000005
+ vertex -9.944930859691775 185.5975440661803 -62.60000000000008
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 2.0805319374395384e-16
+ outer loop
+ vertex -9.944930859691773 190.79754406618028 -62.60000000000005
+ vertex -9.944930859691775 185.5975440661803 617.3999999999999
+ vertex -9.944930859691773 190.79754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 1.3771336778111648e-16
+ outer loop
+ vertex -9.944930859691773 190.79754406618028 -62.60000000000005
+ vertex -9.544930859691773 190.79754406618028 617.3999999999999
+ vertex -9.544930859691773 190.79754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 1.3771336778111648e-16
+ outer loop
+ vertex -9.544930859691773 190.79754406618028 617.3999999999999
+ vertex -9.944930859691773 190.79754406618028 -62.60000000000005
+ vertex -9.944930859691773 190.79754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal -1.0 2.576571214238363e-15 2.0805319374395406e-16
+ outer loop
+ vertex -3.6449308596917698 191.4632294911295 617.3999999999999
+ vertex -3.644930859691753 197.73185864123099 -62.60000000000005
+ vertex -3.6449308596917698 191.4632294911295 -62.60000000000005
+ endloop
+endfacet
+facet normal -1.0 2.576571214238363e-15 2.0805319374395406e-16
+ outer loop
+ vertex -3.644930859691753 197.73185864123099 -62.60000000000005
+ vertex -3.6449308596917698 191.4632294911295 617.3999999999999
+ vertex -3.644930859691753 197.73185864123099 617.3999999999999
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 1.3771336778111648e-16
+ outer loop
+ vertex -9.544930859691773 191.19754406618028 -62.60000000000005
+ vertex -8.14493085969177 191.19754406618028 617.3999999999999
+ vertex -8.14493085969177 191.19754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 1.3771336778111648e-16
+ outer loop
+ vertex -8.14493085969177 191.19754406618028 617.3999999999999
+ vertex -9.544930859691773 191.19754406618028 -62.60000000000005
+ vertex -9.544930859691773 191.19754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 -1.3771336778111648e-16
+ outer loop
+ vertex -8.144930859691767 200.19754406618028 617.3999999999999
+ vertex -6.110616284641007 200.19754406618026 -62.60000000000005
+ vertex -6.110616284641007 200.19754406618026 617.3999999999999
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 -1.3771336778111648e-16
+ outer loop
+ vertex -6.110616284641007 200.19754406618026 -62.60000000000005
+ vertex -8.144930859691767 200.19754406618028 617.3999999999999
+ vertex -8.144930859691767 200.19754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 -2.080531937439538e-16
+ outer loop
+ vertex -8.144930859691767 200.19754406618028 617.3999999999999
+ vertex -8.144930859691767 197.9975440661803 -62.60000000000005
+ vertex -8.144930859691767 200.19754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 -2.080531937439538e-16
+ outer loop
+ vertex -8.144930859691767 197.9975440661803 -62.60000000000005
+ vertex -8.144930859691767 200.19754406618028 617.3999999999999
+ vertex -8.144930859691767 197.9975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal -1.6669205698300596e-14 -1.0 -1.3771336778111313e-16
+ outer loop
+ vertex -9.544930859691767 197.99754406618032 617.3999999999999
+ vertex -8.144930859691767 197.9975440661803 -62.60000000000005
+ vertex -8.144930859691767 197.9975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal -1.6669205698300596e-14 -1.0 -1.3771336778111313e-16
+ outer loop
+ vertex -8.144930859691767 197.9975440661803 -62.60000000000005
+ vertex -9.544930859691767 197.99754406618032 617.3999999999999
+ vertex -9.544930859691767 197.99754406618032 -62.60000000000005
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 1.3771336778111648e-16
+ outer loop
+ vertex -8.14493085969177 188.9975440661803 -62.60000000000005
+ vertex -6.1106162846410355 188.9975440661803 617.3999999999999
+ vertex -6.1106162846410355 188.9975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 1.3771336778111648e-16
+ outer loop
+ vertex -6.1106162846410355 188.9975440661803 617.3999999999999
+ vertex -8.14493085969177 188.9975440661803 -62.60000000000005
+ vertex -8.14493085969177 188.9975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7071067811865456 0.7071067811865497 2.4449388036193273e-16
+ outer loop
+ vertex -6.1106162846410355 188.9975440661803 -62.60000000000005
+ vertex -3.6449308596917698 191.4632294911295 617.3999999999999
+ vertex -3.6449308596917698 191.4632294911295 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7071067811865456 0.7071067811865497 2.4449388036193273e-16
+ outer loop
+ vertex -3.6449308596917698 191.4632294911295 617.3999999999999
+ vertex -6.1106162846410355 188.9975440661803 -62.60000000000005
+ vertex -6.1106162846410355 188.9975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7071067811865513 -0.7071067811865438 4.9737767925805e-17
+ outer loop
+ vertex -3.644930859691753 197.73185864123099 617.3999999999999
+ vertex -6.110616284641007 200.19754406618026 -62.60000000000005
+ vertex -3.644930859691753 197.73185864123099 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7071067811865513 -0.7071067811865438 4.9737767925805e-17
+ outer loop
+ vertex -6.110616284641007 200.19754406618026 -62.60000000000005
+ vertex -3.644930859691753 197.73185864123099 617.3999999999999
+ vertex -6.110616284641007 200.19754406618026 617.3999999999999
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 2.080531937439538e-16
+ outer loop
+ vertex -9.544930859691767 197.99754406618032 617.3999999999999
+ vertex -9.544930859691767 198.3975440661803 -62.60000000000005
+ vertex -9.544930859691767 197.99754406618032 -62.60000000000005
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 2.080531937439538e-16
+ outer loop
+ vertex -9.544930859691767 198.3975440661803 -62.60000000000005
+ vertex -9.544930859691767 197.99754406618032 617.3999999999999
+ vertex -9.544930859691767 198.3975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 -1.3771336778111648e-16
+ outer loop
+ vertex -9.944930859691766 198.3975440661803 617.3999999999999
+ vertex -9.544930859691767 198.3975440661803 -62.60000000000005
+ vertex -9.544930859691767 198.3975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 -1.3771336778111648e-16
+ outer loop
+ vertex -9.544930859691767 198.3975440661803 -62.60000000000005
+ vertex -9.944930859691766 198.3975440661803 617.3999999999999
+ vertex -9.944930859691766 198.3975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 2.080531937439538e-16
+ outer loop
+ vertex -9.544930859691773 190.79754406618028 617.3999999999999
+ vertex -9.544930859691773 191.19754406618028 -62.60000000000005
+ vertex -9.544930859691773 190.79754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 2.080531937439538e-16
+ outer loop
+ vertex -9.544930859691773 191.19754406618028 -62.60000000000005
+ vertex -9.544930859691773 190.79754406618028 617.3999999999999
+ vertex -9.544930859691773 191.19754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 -2.080531937439538e-16
+ outer loop
+ vertex -8.14493085969177 191.19754406618028 617.3999999999999
+ vertex -8.14493085969177 188.9975440661803 -62.60000000000005
+ vertex -8.14493085969177 191.19754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 -2.080531937439538e-16
+ outer loop
+ vertex -8.14493085969177 188.9975440661803 -62.60000000000005
+ vertex -8.14493085969177 191.19754406618028 617.3999999999999
+ vertex -8.14493085969177 188.9975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7933533402912357 0.6087614290087201 2.488942827790613e-16
+ outer loop
+ vertex -9.810956263476202 204.0975440661803 617.3999999999999
+ vertex -9.652037640878309 204.30465084736684 -62.60000000000003
+ vertex -9.810956263476202 204.0975440661803 -62.60000000000003
+ endloop
+endfacet
+facet normal -0.7933533402912357 0.6087614290087201 2.488942827790613e-16
+ outer loop
+ vertex -9.652037640878309 204.30465084736684 -62.60000000000003
+ vertex -9.810956263476202 204.0975440661803 617.3999999999999
+ vertex -9.652037640878309 204.30465084736684 617.3999999999999
+ endloop
+endfacet
+facet normal -0.38268343236508157 0.9238795325112901 2.068490721426269e-16
+ outer loop
+ vertex -9.444930859691762 204.46356946996474 -62.60000000000002
+ vertex -9.203749904794282 204.56346989246933 617.3999999999999
+ vertex -9.203749904794282 204.56346989246933 -62.60000000000002
+ endloop
+endfacet
+facet normal -0.38268343236508157 0.9238795325112901 2.068490721426269e-16
+ outer loop
+ vertex -9.203749904794282 204.56346989246933 617.3999999999999
+ vertex -9.444930859691762 204.46356946996474 -62.60000000000002
+ vertex -9.444930859691762 204.46356946996474 617.3999999999999
+ endloop
+endfacet
+facet normal -0.13052619222007286 0.9914448613738076 1.6369160198769274e-16
+ outer loop
+ vertex -9.203749904794282 204.56346989246933 -62.60000000000002
+ vertex -8.94493085969176 204.5975440661803 617.3999999999999
+ vertex -8.94493085969176 204.5975440661803 -62.60000000000002
+ endloop
+endfacet
+facet normal -0.13052619222007286 0.9914448613738076 1.6369160198769274e-16
+ outer loop
+ vertex -8.94493085969176 204.5975440661803 617.3999999999999
+ vertex -9.203749904794282 204.56346989246933 -62.60000000000002
+ vertex -9.203749904794282 204.56346989246933 617.3999999999999
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 1.377133677811165e-16
+ outer loop
+ vertex -8.94493085969176 204.5975440661803 -62.60000000000002
+ vertex -3.744930859691761 204.5975440661803 617.3999999999999
+ vertex -3.744930859691761 204.5975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 1.377133677811165e-16
+ outer loop
+ vertex -3.744930859691761 204.5975440661803 617.3999999999999
+ vertex -8.94493085969176 204.5975440661803 -62.60000000000002
+ vertex -8.94493085969176 204.5975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal -0.6087614290087039 0.7933533402912479 2.3591011986529993e-16
+ outer loop
+ vertex -9.652037640878309 204.30465084736684 -62.60000000000003
+ vertex -9.444930859691762 204.46356946996474 617.3999999999999
+ vertex -9.444930859691762 204.46356946996474 -62.60000000000002
+ endloop
+endfacet
+facet normal -0.6087614290087039 0.7933533402912479 2.3591011986529993e-16
+ outer loop
+ vertex -9.444930859691762 204.46356946996474 617.3999999999999
+ vertex -9.652037640878309 204.30465084736684 -62.60000000000003
+ vertex -9.652037640878309 204.30465084736684 617.3999999999999
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 2.0805319374395384e-16
+ outer loop
+ vertex -9.944930859691766 198.3975440661803 617.3999999999999
+ vertex -9.944930859691764 203.5975440661803 -62.60000000000005
+ vertex -9.944930859691766 198.3975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 2.0805319374395384e-16
+ outer loop
+ vertex -9.944930859691764 203.5975440661803 -62.60000000000005
+ vertex -9.944930859691766 198.3975440661803 617.3999999999999
+ vertex -9.944930859691764 203.5975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9238795325112907 0.38268343236508046 2.4491671163867733e-16
+ outer loop
+ vertex -9.910856685980832 203.8563631112828 617.3999999999999
+ vertex -9.810956263476202 204.0975440661803 -62.60000000000003
+ vertex -9.910856685980832 203.8563631112828 -62.600000000000044
+ endloop
+endfacet
+facet normal -0.9238795325112907 0.38268343236508046 2.4491671163867733e-16
+ outer loop
+ vertex -9.810956263476202 204.0975440661803 -62.60000000000003
+ vertex -9.910856685980832 203.8563631112828 617.3999999999999
+ vertex -9.810956263476202 204.0975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal -0.9914448613738098 0.1305261922200571 2.2424847134412203e-16
+ outer loop
+ vertex -9.944930859691764 203.5975440661803 617.3999999999999
+ vertex -9.910856685980832 203.8563631112828 -62.600000000000044
+ vertex -9.944930859691764 203.5975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9914448613738098 0.1305261922200571 2.2424847134412203e-16
+ outer loop
+ vertex -9.910856685980832 203.8563631112828 -62.600000000000044
+ vertex -9.944930859691764 203.5975440661803 617.3999999999999
+ vertex -9.910856685980832 203.8563631112828 617.3999999999999
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 1.3771336778111648e-16
+ outer loop
+ vertex -3.744930859691761 204.1975440661803 -62.60000000000005
+ vertex -3.344930859691762 204.1975440661803 617.3999999999999
+ vertex -3.344930859691762 204.1975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 1.3771336778111648e-16
+ outer loop
+ vertex -3.344930859691762 204.1975440661803 617.3999999999999
+ vertex -3.744930859691761 204.1975440661803 -62.60000000000005
+ vertex -3.744930859691761 204.1975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 -2.080531937439538e-16
+ outer loop
+ vertex -5.544930859691769 202.79754406618025 617.3999999999999
+ vertex -5.544930859691772 200.76322949112952 -62.60000000000005
+ vertex -5.544930859691769 202.79754406618025 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 -2.080531937439538e-16
+ outer loop
+ vertex -5.544930859691772 200.76322949112952 -62.60000000000005
+ vertex -5.544930859691769 202.79754406618025 617.3999999999999
+ vertex -5.544930859691772 200.76322949112952 617.3999999999999
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 -2.080531937439538e-16
+ outer loop
+ vertex -3.744930859691761 204.5975440661803 -62.60000000000005
+ vertex -3.744930859691761 204.1975440661803 617.3999999999999
+ vertex -3.744930859691761 204.1975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 -2.080531937439538e-16
+ outer loop
+ vertex -3.744930859691761 204.1975440661803 617.3999999999999
+ vertex -3.744930859691761 204.5975440661803 -62.60000000000005
+ vertex -3.744930859691761 204.5975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 -1.377133677811165e-16
+ outer loop
+ vertex -5.544930859691769 202.79754406618025 617.3999999999999
+ vertex -3.344930859691773 202.79754406618025 -62.60000000000005
+ vertex -3.344930859691773 202.79754406618025 617.3999999999999
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 -1.377133677811165e-16
+ outer loop
+ vertex -3.344930859691773 202.79754406618025 -62.60000000000005
+ vertex -5.544930859691769 202.79754406618025 617.3999999999999
+ vertex -5.544930859691769 202.79754406618025 -62.60000000000005
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 1.3771336778111648e-16
+ outer loop
+ vertex -3.0792454347425178 198.29754406618028 -62.60000000000005
+ vertex 3.1893837153589675 198.29754406618028 617.3999999999999
+ vertex 3.1893837153589675 198.29754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 1.3771336778111648e-16
+ outer loop
+ vertex 3.1893837153589675 198.29754406618028 617.3999999999999
+ vertex -3.0792454347425178 198.29754406618028 -62.60000000000005
+ vertex -3.0792454347425178 198.29754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 1.0 -8.834203210231486e-15 -2.0805319374395488e-16
+ outer loop
+ vertex -3.344930859691762 204.1975440661803 617.3999999999999
+ vertex -3.344930859691773 202.79754406618025 -62.60000000000005
+ vertex -3.344930859691762 204.1975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.0 -8.834203210231486e-15 -2.0805319374395488e-16
+ outer loop
+ vertex -3.344930859691773 202.79754406618025 -62.60000000000005
+ vertex -3.344930859691762 204.1975440661803 617.3999999999999
+ vertex -3.344930859691773 202.79754406618025 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7071067811865481 0.707106781186547 -4.9737767925803873e-17
+ outer loop
+ vertex -5.544930859691772 200.76322949112952 -62.60000000000005
+ vertex -3.0792454347425178 198.29754406618028 617.3999999999999
+ vertex -3.0792454347425178 198.29754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal 0.7071067811865481 0.707106781186547 -4.9737767925803873e-17
+ outer loop
+ vertex -3.0792454347425178 198.29754406618028 617.3999999999999
+ vertex -5.544930859691772 200.76322949112952 -62.60000000000005
+ vertex -5.544930859691772 200.76322949112952 617.3999999999999
+ endloop
+endfacet
+facet normal -0.7071067811865454 0.7071067811865499 2.4449388036193273e-16
+ outer loop
+ vertex 3.1893837153589675 198.29754406618028 -62.60000000000005
+ vertex 5.655069140308237 200.76322949112952 617.3999999999999
+ vertex 5.655069140308237 200.76322949112952 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7071067811865454 0.7071067811865499 2.4449388036193273e-16
+ outer loop
+ vertex 5.655069140308237 200.76322949112952 617.3999999999999
+ vertex 3.1893837153589675 198.29754406618028 -62.60000000000005
+ vertex 3.1893837153589675 198.29754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 -1.377133677811165e-16
+ outer loop
+ vertex 3.4550691403082383 202.79754406618028 617.3999999999999
+ vertex 5.655069140308238 202.79754406618028 -62.60000000000005
+ vertex 5.655069140308238 202.79754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 -1.377133677811165e-16
+ outer loop
+ vertex 5.655069140308238 202.79754406618028 -62.60000000000005
+ vertex 3.4550691403082383 202.79754406618028 617.3999999999999
+ vertex 3.4550691403082383 202.79754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -1.0 2.5955428282843875e-14 2.080531937439573e-16
+ outer loop
+ vertex 3.4550691403082383 202.79754406618028 617.3999999999999
+ vertex 3.455069140308275 204.1975440661803 -62.60000000000005
+ vertex 3.4550691403082383 202.79754406618028 -62.60000000000005
+ endloop
+endfacet
+facet normal -1.0 2.5955428282843875e-14 2.080531937439573e-16
+ outer loop
+ vertex 3.455069140308275 204.1975440661803 -62.60000000000005
+ vertex 3.4550691403082383 202.79754406618028 617.3999999999999
+ vertex 3.455069140308275 204.1975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 2.080531937439538e-16
+ outer loop
+ vertex 5.655069140308237 200.76322949112952 617.3999999999999
+ vertex 5.655069140308238 202.79754406618028 -62.60000000000005
+ vertex 5.655069140308237 200.76322949112952 -62.60000000000005
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 2.080531937439538e-16
+ outer loop
+ vertex 5.655069140308238 202.79754406618028 -62.60000000000005
+ vertex 5.655069140308237 200.76322949112952 617.3999999999999
+ vertex 5.655069140308238 202.79754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 1.3771336778111648e-16
+ outer loop
+ vertex 3.455069140308275 204.1975440661803 -62.60000000000005
+ vertex 3.8550691403082737 204.1975440661803 617.3999999999999
+ vertex 3.8550691403082737 204.1975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 1.3771336778111648e-16
+ outer loop
+ vertex 3.8550691403082737 204.1975440661803 617.3999999999999
+ vertex 3.455069140308275 204.1975440661803 -62.60000000000005
+ vertex 3.455069140308275 204.1975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal -1.0 4.302114220422487e-15 2.080531937439543e-16
+ outer loop
+ vertex 3.8550691403082737 204.1975440661803 617.3999999999999
+ vertex 3.8550691403082755 204.5975440661803 -62.60000000000005
+ vertex 3.8550691403082737 204.1975440661803 -62.60000000000005
+ endloop
+endfacet
+facet normal -1.0 4.302114220422487e-15 2.080531937439543e-16
+ outer loop
+ vertex 3.8550691403082755 204.5975440661803 -62.60000000000005
+ vertex 3.8550691403082737 204.1975440661803 617.3999999999999
+ vertex 3.8550691403082755 204.5975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 1.3771336778111648e-16
+ outer loop
+ vertex 3.8550691403082755 204.5975440661803 -62.60000000000005
+ vertex 9.055069140308243 204.5975440661803 617.3999999999999
+ vertex 9.055069140308243 204.5975440661803 -62.60000000000008
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 1.3771336778111648e-16
+ outer loop
+ vertex 9.055069140308243 204.5975440661803 617.3999999999999
+ vertex 3.8550691403082755 204.5975440661803 -62.60000000000005
+ vertex 3.8550691403082755 204.5975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 0.13052619222007356 0.9914448613738077 1.0937881967044586e-16
+ outer loop
+ vertex 9.055069140308243 204.5975440661803 -62.60000000000008
+ vertex 9.313888185410763 204.56346989246933 617.3999999999999
+ vertex 9.313888185410763 204.56346989246933 -62.60000000000008
+ endloop
+endfacet
+facet normal 0.13052619222007356 0.9914448613738077 1.0937881967044586e-16
+ outer loop
+ vertex 9.313888185410763 204.56346989246933 617.3999999999999
+ vertex 9.055069140308243 204.5975440661803 -62.60000000000008
+ vertex 9.055069140308243 204.5975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 0.3826834323650824 0.9238795325112898 4.7612051549719663e-17
+ outer loop
+ vertex 9.313888185410763 204.56346989246933 -62.60000000000008
+ vertex 9.555069140308243 204.46356946996474 617.3999999999999
+ vertex 9.555069140308243 204.46356946996474 -62.60000000000008
+ endloop
+endfacet
+facet normal 0.3826834323650824 0.9238795325112898 4.7612051549719663e-17
+ outer loop
+ vertex 9.555069140308243 204.46356946996474 617.3999999999999
+ vertex 9.313888185410763 204.56346989246933 -62.60000000000008
+ vertex 9.313888185410763 204.56346989246933 617.3999999999999
+ endloop
+endfacet
+facet normal 0.6087614290087043 0.7933533402912479 -1.7399399201488106e-17
+ outer loop
+ vertex 9.555069140308243 204.46356946996474 -62.60000000000008
+ vertex 9.76217592149479 204.30465084736684 617.3999999999999
+ vertex 9.76217592149479 204.30465084736684 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.6087614290087043 0.7933533402912479 -1.7399399201488106e-17
+ outer loop
+ vertex 9.76217592149479 204.30465084736684 617.3999999999999
+ vertex 9.555069140308243 204.46356946996474 -62.60000000000008
+ vertex 9.555069140308243 204.46356946996474 617.3999999999999
+ endloop
+endfacet
+facet normal 0.7933533402912394 0.6087614290087152 -8.122510965099075e-17
+ outer loop
+ vertex 9.76217592149479 204.30465084736684 617.3999999999999
+ vertex 9.921094544092682 204.0975440661803 -62.600000000000065
+ vertex 9.76217592149479 204.30465084736684 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.7933533402912394 0.6087614290087152 -8.122510965099075e-17
+ outer loop
+ vertex 9.921094544092682 204.0975440661803 -62.600000000000065
+ vertex 9.76217592149479 204.30465084736684 617.3999999999999
+ vertex 9.921094544092682 204.0975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 10.055069140308241 203.59754406618026 617.3999999999999
+ vertex 9.655069140308253 198.39754406618027 617.3999999999999
+ vertex 10.055069140308252 198.39754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 9.655069140308253 198.39754406618027 617.3999999999999
+ vertex 10.055069140308241 203.59754406618026 617.3999999999999
+ vertex 9.40055046237076 201.98343359401628 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 9.655069140308253 198.39754406618027 617.3999999999999
+ vertex 9.40055046237076 201.98343359401628 617.3999999999999
+ vertex 9.240709786363354 201.5975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 9.655069140308253 198.39754406618027 617.3999999999999
+ vertex 9.240709786363354 201.5975440661803 617.3999999999999
+ vertex 8.255069140308239 200.19754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 8.255069140308239 200.19754406618028 617.3999999999999
+ vertex 9.240709786363354 201.5975440661803 617.3999999999999
+ vertex 8.98643999020673 201.2661732162818 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 8.255069140308239 200.19754406618028 617.3999999999999
+ vertex 8.98643999020673 201.2661732162818 617.3999999999999
+ vertex 8.655069140308255 201.01190342012518 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 8.255069140308239 200.19754406618028 617.3999999999999
+ vertex 8.655069140308255 201.01190342012518 617.3999999999999
+ vertex 8.269179612472286 200.85206274411777 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 8.255069140308239 200.19754406618028 617.3999999999999
+ vertex 8.269179612472286 200.85206274411777 617.3999999999999
+ vertex 6.220754565257503 200.19754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 6.220754565257503 200.19754406618028 617.3999999999999
+ vertex 8.269179612472286 200.85206274411777 617.3999999999999
+ vertex 7.855069140308252 200.79754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 6.220754565257503 200.19754406618028 617.3999999999999
+ vertex 7.855069140308252 200.79754406618028 617.3999999999999
+ vertex 5.655069140308237 200.76322949112952 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 9.40055046237076 201.98343359401628 617.3999999999999
+ vertex 10.055069140308241 203.59754406618026 617.3999999999999
+ vertex 9.455069140308245 202.3975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 9.455069140308245 202.3975440661803 617.3999999999999
+ vertex 10.055069140308241 203.59754406618026 617.3999999999999
+ vertex 9.40055046237075 202.81165453834433 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 9.40055046237075 202.81165453834433 617.3999999999999
+ vertex 10.055069140308241 203.59754406618026 617.3999999999999
+ vertex 9.24070978636334 203.1975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 9.24070978636334 203.1975440661803 617.3999999999999
+ vertex 10.055069140308241 203.59754406618026 617.3999999999999
+ vertex 8.986439990206707 203.52891491607878 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 8.986439990206707 203.52891491607878 617.3999999999999
+ vertex 10.055069140308241 203.59754406618026 617.3999999999999
+ vertex 8.655069140308228 203.7831847122354 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 8.655069140308228 203.7831847122354 617.3999999999999
+ vertex 10.055069140308241 203.59754406618026 617.3999999999999
+ vertex 10.02099496659731 203.8563631112828 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 8.655069140308228 203.7831847122354 617.3999999999999
+ vertex 10.02099496659731 203.8563631112828 617.3999999999999
+ vertex 8.269179612472257 203.94302538824283 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 8.269179612472257 203.94302538824283 617.3999999999999
+ vertex 10.02099496659731 203.8563631112828 617.3999999999999
+ vertex 9.921094544092682 204.0975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 8.269179612472257 203.94302538824283 617.3999999999999
+ vertex 9.921094544092682 204.0975440661803 617.3999999999999
+ vertex 7.855069140308223 203.9975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 9.76217592149479 204.30465084736684 617.3999999999999
+ vertex 3.8550691403082737 204.1975440661803 617.3999999999999
+ vertex 9.921094544092682 204.0975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.8550691403082737 204.1975440661803 617.3999999999999
+ vertex 9.76217592149479 204.30465084736684 617.3999999999999
+ vertex 3.8550691403082755 204.5975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.8550691403082755 204.5975440661803 617.3999999999999
+ vertex 9.76217592149479 204.30465084736684 617.3999999999999
+ vertex 9.555069140308243 204.46356946996474 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.8550691403082755 204.5975440661803 617.3999999999999
+ vertex 9.555069140308243 204.46356946996474 617.3999999999999
+ vertex 9.313888185410763 204.56346989246933 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.8550691403082755 204.5975440661803 617.3999999999999
+ vertex 9.313888185410763 204.56346989246933 617.3999999999999
+ vertex 9.055069140308243 204.5975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 5.655069140308237 200.76322949112952 617.3999999999999
+ vertex 6.469428494253134 201.59754406618026 617.3999999999999
+ vertex 5.655069140308238 202.79754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 6.469428494253134 201.59754406618026 617.3999999999999
+ vertex 5.655069140308237 200.76322949112952 617.3999999999999
+ vertex 6.723698290409766 201.2661732162818 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 6.723698290409766 201.2661732162818 617.3999999999999
+ vertex 5.655069140308237 200.76322949112952 617.3999999999999
+ vertex 7.0550691403082455 201.01190342012518 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 7.0550691403082455 201.01190342012518 617.3999999999999
+ vertex 5.655069140308237 200.76322949112952 617.3999999999999
+ vertex 7.440958668144216 200.85206274411775 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 7.440958668144216 200.85206274411775 617.3999999999999
+ vertex 5.655069140308237 200.76322949112952 617.3999999999999
+ vertex 7.855069140308252 200.79754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 5.655069140308238 202.79754406618028 617.3999999999999
+ vertex 6.469428494253134 201.59754406618026 617.3999999999999
+ vertex 6.309587818245723 201.98343359401622 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 5.655069140308238 202.79754406618028 617.3999999999999
+ vertex 6.309587818245723 201.98343359401622 617.3999999999999
+ vertex 6.255069140308228 202.39754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 5.655069140308238 202.79754406618028 617.3999999999999
+ vertex 6.255069140308228 202.39754406618027 617.3999999999999
+ vertex 6.309587818245718 202.81165453834433 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 5.655069140308238 202.79754406618028 617.3999999999999
+ vertex 6.309587818245718 202.81165453834433 617.3999999999999
+ vertex 3.4550691403082383 202.79754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.4550691403082383 202.79754406618028 617.3999999999999
+ vertex 6.309587818245718 202.81165453834433 617.3999999999999
+ vertex 3.455069140308275 204.1975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.455069140308275 204.1975440661803 617.3999999999999
+ vertex 6.309587818245718 202.81165453834433 617.3999999999999
+ vertex 6.469428494253122 203.19754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.455069140308275 204.1975440661803 617.3999999999999
+ vertex 6.469428494253122 203.19754406618028 617.3999999999999
+ vertex 6.723698290409745 203.52891491607878 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.455069140308275 204.1975440661803 617.3999999999999
+ vertex 6.723698290409745 203.52891491607878 617.3999999999999
+ vertex 7.0550691403082215 203.7831847122354 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.455069140308275 204.1975440661803 617.3999999999999
+ vertex 7.0550691403082215 203.7831847122354 617.3999999999999
+ vertex 7.440958668144188 203.94302538824277 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.455069140308275 204.1975440661803 617.3999999999999
+ vertex 7.440958668144188 203.94302538824277 617.3999999999999
+ vertex 7.855069140308223 203.9975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.455069140308275 204.1975440661803 617.3999999999999
+ vertex 7.855069140308223 203.9975440661803 617.3999999999999
+ vertex 9.921094544092682 204.0975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.455069140308275 204.1975440661803 617.3999999999999
+ vertex 9.921094544092682 204.0975440661803 617.3999999999999
+ vertex 3.8550691403082737 204.1975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.344930859691773 186.39754406618027 617.3999999999999
+ vertex -3.7449308596917725 184.99754406618027 617.3999999999999
+ vertex -3.344930859691773 184.99754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.7449308596917725 184.99754406618027 617.3999999999999
+ vertex -3.344930859691773 186.39754406618027 617.3999999999999
+ vertex -7.330820387527722 185.25206274411778 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.7449308596917725 184.99754406618027 617.3999999999999
+ vertex -7.330820387527722 185.25206274411778 617.3999999999999
+ vertex -7.744930859691757 185.19754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.7449308596917725 184.99754406618027 617.3999999999999
+ vertex -7.744930859691757 185.19754406618028 617.3999999999999
+ vertex -9.810956263476214 185.0975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -7.330820387527722 185.25206274411778 617.3999999999999
+ vertex -3.344930859691773 186.39754406618027 617.3999999999999
+ vertex -6.944930859691755 185.41190342012518 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -6.944930859691755 185.41190342012518 617.3999999999999
+ vertex -3.344930859691773 186.39754406618027 617.3999999999999
+ vertex -6.613560009793279 185.6661732162818 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -6.613560009793279 185.6661732162818 617.3999999999999
+ vertex -3.344930859691773 186.39754406618027 617.3999999999999
+ vertex -6.359290213636655 185.9975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -6.359290213636655 185.9975440661803 617.3999999999999
+ vertex -3.344930859691773 186.39754406618027 617.3999999999999
+ vertex -6.199449537629252 186.38343359401625 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -6.199449537629252 186.38343359401625 617.3999999999999
+ vertex -3.344930859691773 186.39754406618027 617.3999999999999
+ vertex -5.544930859691772 186.3975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -6.199449537629252 186.38343359401625 617.3999999999999
+ vertex -5.544930859691772 186.3975440661803 617.3999999999999
+ vertex -6.144930859691763 186.7975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -6.144930859691763 186.7975440661803 617.3999999999999
+ vertex -5.544930859691772 186.3975440661803 617.3999999999999
+ vertex -5.544930859691769 188.43185864123106 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -6.144930859691763 186.7975440661803 617.3999999999999
+ vertex -5.544930859691769 188.43185864123106 617.3999999999999
+ vertex -6.199449537629255 187.21165453834433 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -6.199449537629255 187.21165453834433 617.3999999999999
+ vertex -5.544930859691769 188.43185864123106 617.3999999999999
+ vertex -6.359290213636666 187.59754406618032 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -6.359290213636666 187.59754406618032 617.3999999999999
+ vertex -5.544930859691769 188.43185864123106 617.3999999999999
+ vertex -6.613560009793298 187.92891491607878 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -6.613560009793298 187.92891491607878 617.3999999999999
+ vertex -5.544930859691769 188.43185864123106 617.3999999999999
+ vertex -6.944930859691778 188.1831847122354 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -6.944930859691778 188.1831847122354 617.3999999999999
+ vertex -5.544930859691769 188.43185864123106 617.3999999999999
+ vertex -7.330820387527747 188.3430253882428 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -7.330820387527747 188.3430253882428 617.3999999999999
+ vertex -5.544930859691769 188.43185864123106 617.3999999999999
+ vertex -7.7449308596917845 188.39754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 6.255069140308248 186.79754406618028 617.3999999999999
+ vertex 5.655069140308249 186.39754406618027 617.3999999999999
+ vertex 6.309587818245743 186.38343359401625 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 5.655069140308249 186.39754406618027 617.3999999999999
+ vertex 6.255069140308248 186.79754406618028 617.3999999999999
+ vertex 5.6550691403082505 188.431858641231 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 5.6550691403082505 188.431858641231 617.3999999999999
+ vertex 6.255069140308248 186.79754406618028 617.3999999999999
+ vertex 6.309587818245721 187.21165453834433 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 5.6550691403082505 188.431858641231 617.3999999999999
+ vertex 6.309587818245721 187.21165453834433 617.3999999999999
+ vertex 6.469428494253139 187.5975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 5.6550691403082505 188.431858641231 617.3999999999999
+ vertex 6.469428494253139 187.5975440661803 617.3999999999999
+ vertex 6.723698290409754 187.92891491607875 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 5.6550691403082505 188.431858641231 617.3999999999999
+ vertex 6.723698290409754 187.92891491607875 617.3999999999999
+ vertex 7.055069140308225 188.1831847122354 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 5.6550691403082505 188.431858641231 617.3999999999999
+ vertex 7.055069140308225 188.1831847122354 617.3999999999999
+ vertex 7.440958668144192 188.3430253882428 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 5.6550691403082505 188.431858641231 617.3999999999999
+ vertex 7.440958668144192 188.3430253882428 617.3999999999999
+ vertex 7.855069140308223 188.3975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 9.313888185410756 184.6316182398912 617.3999999999999
+ vertex 3.855069140308194 184.59754406618026 617.3999999999999
+ vertex 9.055069140308234 184.59754406618026 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.855069140308194 184.59754406618026 617.3999999999999
+ vertex 9.313888185410756 184.6316182398912 617.3999999999999
+ vertex 3.855069140308196 184.99754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.855069140308196 184.99754406618027 617.3999999999999
+ vertex 9.313888185410756 184.6316182398912 617.3999999999999
+ vertex 9.555069140308234 184.73151866239584 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.855069140308196 184.99754406618027 617.3999999999999
+ vertex 9.555069140308234 184.73151866239584 617.3999999999999
+ vertex 9.762175921494782 184.8904372849937 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.855069140308196 184.99754406618027 617.3999999999999
+ vertex 9.762175921494782 184.8904372849937 617.3999999999999
+ vertex 9.921094544092673 185.09754406618026 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.855069140308196 184.99754406618027 617.3999999999999
+ vertex 9.921094544092673 185.09754406618026 617.3999999999999
+ vertex 3.455069140308196 184.99754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.455069140308196 184.99754406618027 617.3999999999999
+ vertex 9.921094544092673 185.09754406618026 617.3999999999999
+ vertex 7.855069140308268 185.19754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.455069140308196 184.99754406618027 617.3999999999999
+ vertex 7.855069140308268 185.19754406618028 617.3999999999999
+ vertex 7.440958668144235 185.25206274411778 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.455069140308196 184.99754406618027 617.3999999999999
+ vertex 7.440958668144235 185.25206274411778 617.3999999999999
+ vertex 3.455069140308254 186.39754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.455069140308254 186.39754406618027 617.3999999999999
+ vertex 7.440958668144235 185.25206274411778 617.3999999999999
+ vertex 7.0550691403082455 185.41190342012518 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.455069140308254 186.39754406618027 617.3999999999999
+ vertex 7.0550691403082455 185.41190342012518 617.3999999999999
+ vertex 6.723698290409774 185.6661732162818 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.455069140308254 186.39754406618027 617.3999999999999
+ vertex 6.723698290409774 185.6661732162818 617.3999999999999
+ vertex 6.469428494253137 185.9975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.455069140308254 186.39754406618027 617.3999999999999
+ vertex 6.469428494253137 185.9975440661803 617.3999999999999
+ vertex 6.309587818245743 186.38343359401625 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.455069140308254 186.39754406618027 617.3999999999999
+ vertex 6.309587818245743 186.38343359401625 617.3999999999999
+ vertex 5.655069140308249 186.39754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.7449308596917725 184.99754406618027 617.3999999999999
+ vertex -8.944930859691771 184.5975440661803 617.3999999999999
+ vertex -3.7449308596917725 184.59754406618026 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -8.944930859691771 184.5975440661803 617.3999999999999
+ vertex -3.7449308596917725 184.99754406618027 617.3999999999999
+ vertex -9.203749904794295 184.63161823989122 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.203749904794295 184.63161823989122 617.3999999999999
+ vertex -3.7449308596917725 184.99754406618027 617.3999999999999
+ vertex -9.444930859691773 184.73151866239584 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.444930859691773 184.73151866239584 617.3999999999999
+ vertex -3.7449308596917725 184.99754406618027 617.3999999999999
+ vertex -9.652037640878321 184.89043728499374 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.652037640878321 184.89043728499374 617.3999999999999
+ vertex -3.7449308596917725 184.99754406618027 617.3999999999999
+ vertex -9.810956263476214 185.0975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 10.020994966597302 185.33872502107775 617.3999999999999
+ vertex 7.855069140308268 185.19754406618028 617.3999999999999
+ vertex 9.921094544092673 185.09754406618026 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 7.855069140308268 185.19754406618028 617.3999999999999
+ vertex 10.020994966597302 185.33872502107775 617.3999999999999
+ vertex 8.2691796124723 185.25206274411778 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 8.2691796124723 185.25206274411778 617.3999999999999
+ vertex 10.020994966597302 185.33872502107775 617.3999999999999
+ vertex 8.655069140308266 185.4119034201252 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 8.655069140308266 185.4119034201252 617.3999999999999
+ vertex 10.020994966597302 185.33872502107775 617.3999999999999
+ vertex 10.055069140308234 185.59754406618026 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 8.655069140308266 185.4119034201252 617.3999999999999
+ vertex 10.055069140308234 185.59754406618026 617.3999999999999
+ vertex 8.986439990206739 185.6661732162818 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 8.986439990206739 185.6661732162818 617.3999999999999
+ vertex 10.055069140308234 185.59754406618026 617.3999999999999
+ vertex 9.240709786363354 185.99754406618032 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 9.240709786363354 185.99754406618032 617.3999999999999
+ vertex 10.055069140308234 185.59754406618026 617.3999999999999
+ vertex 9.40055046237077 186.38343359401628 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 9.40055046237077 186.38343359401628 617.3999999999999
+ vertex 10.055069140308234 185.59754406618026 617.3999999999999
+ vertex 10.05506914030822 190.79754406618022 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 9.40055046237077 186.38343359401628 617.3999999999999
+ vertex 10.05506914030822 190.79754406618022 617.3999999999999
+ vertex 9.455069140308243 186.7975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 9.455069140308243 186.7975440661803 617.3999999999999
+ vertex 10.05506914030822 190.79754406618022 617.3999999999999
+ vertex 9.400550462370747 187.21165453834433 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 9.400550462370747 187.21165453834433 617.3999999999999
+ vertex 10.05506914030822 190.79754406618022 617.3999999999999
+ vertex 9.240709786363354 187.59754406618032 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 9.240709786363354 187.59754406618032 617.3999999999999
+ vertex 10.05506914030822 190.79754406618022 617.3999999999999
+ vertex 8.986439990206716 187.92891491607878 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 8.986439990206716 187.92891491607878 617.3999999999999
+ vertex 10.05506914030822 190.79754406618022 617.3999999999999
+ vertex 8.655069140308244 188.18318471223543 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 8.655069140308244 188.18318471223543 617.3999999999999
+ vertex 10.05506914030822 190.79754406618022 617.3999999999999
+ vertex 8.269179612472279 188.3430253882428 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 8.269179612472279 188.3430253882428 617.3999999999999
+ vertex 10.05506914030822 190.79754406618022 617.3999999999999
+ vertex 7.855069140308223 188.3975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 7.855069140308223 188.3975440661803 617.3999999999999
+ vertex 10.05506914030822 190.79754406618022 617.3999999999999
+ vertex 8.255069140308246 188.99754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 7.855069140308223 188.3975440661803 617.3999999999999
+ vertex 8.255069140308246 188.99754406618027 617.3999999999999
+ vertex 5.6550691403082505 188.431858641231 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 8.255069140308246 188.99754406618027 617.3999999999999
+ vertex 10.05506914030822 190.79754406618022 617.3999999999999
+ vertex 9.65506914030822 190.79754406618022 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 8.255069140308246 188.99754406618027 617.3999999999999
+ vertex 9.65506914030822 190.79754406618022 617.3999999999999
+ vertex 8.255069140308246 191.19754406618026 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 8.255069140308246 191.19754406618026 617.3999999999999
+ vertex 9.65506914030822 190.79754406618022 617.3999999999999
+ vertex 9.655069140308221 191.19754406618023 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 6.220754565257503 200.19754406618028 617.3999999999999
+ vertex 3.1893837153589675 198.29754406618028 617.3999999999999
+ vertex 3.7550691403082355 197.73185864123104 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.1893837153589675 198.29754406618028 617.3999999999999
+ vertex 6.220754565257503 200.19754406618028 617.3999999999999
+ vertex 5.655069140308237 200.76322949112952 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 9.655069140308253 198.39754406618027 617.3999999999999
+ vertex 8.255069140308237 197.9975440661803 617.3999999999999
+ vertex 9.655069140308251 197.99754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 8.255069140308237 197.9975440661803 617.3999999999999
+ vertex 9.655069140308253 198.39754406618027 617.3999999999999
+ vertex 8.255069140308239 200.19754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.7550691403082315 191.46322949112954 617.3999999999999
+ vertex 0.75388056208504 191.98954433519978 617.3999999999999
+ vertex 0.055069140308233296 191.89754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 0.75388056208504 191.98954433519978 617.3999999999999
+ vertex 3.7550691403082315 191.46322949112954 617.3999999999999
+ vertex 1.4050691403082352 192.2592754759623 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 1.4050691403082352 192.2592754759623 617.3999999999999
+ vertex 3.7550691403082315 191.46322949112954 617.3999999999999
+ vertex 1.9642574495119138 192.6883557569766 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 1.9642574495119138 192.6883557569766 617.3999999999999
+ vertex 3.7550691403082315 191.46322949112954 617.3999999999999
+ vertex 2.39333773052622 193.24754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 2.39333773052622 193.24754406618027 617.3999999999999
+ vertex 3.7550691403082315 191.46322949112954 617.3999999999999
+ vertex 2.6630688712887207 193.89873264440348 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 2.6630688712887207 193.89873264440348 617.3999999999999
+ vertex 3.7550691403082315 191.46322949112954 617.3999999999999
+ vertex 3.7550691403082355 197.73185864123104 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 2.6630688712887207 193.89873264440348 617.3999999999999
+ vertex 3.7550691403082355 197.73185864123104 617.3999999999999
+ vertex 2.755069140308237 194.59754406618026 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 2.755069140308237 194.59754406618026 617.3999999999999
+ vertex 3.7550691403082355 197.73185864123104 617.3999999999999
+ vertex 2.663068871288722 195.29635548795707 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 2.663068871288722 195.29635548795707 617.3999999999999
+ vertex 3.7550691403082355 197.73185864123104 617.3999999999999
+ vertex 2.393337730526221 195.94754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 2.393337730526221 195.94754406618028 617.3999999999999
+ vertex 3.7550691403082355 197.73185864123104 617.3999999999999
+ vertex 1.964257449511918 196.50673237538396 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 1.964257449511918 196.50673237538396 617.3999999999999
+ vertex 3.7550691403082355 197.73185864123104 617.3999999999999
+ vertex 1.4050691403082394 196.93581265639824 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 1.4050691403082394 196.93581265639824 617.3999999999999
+ vertex 3.7550691403082355 197.73185864123104 617.3999999999999
+ vertex 0.7538805620850456 197.20554379716077 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 0.7538805620850456 197.20554379716077 617.3999999999999
+ vertex 3.7550691403082355 197.73185864123104 617.3999999999999
+ vertex 0.05506914030823612 197.29754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 0.05506914030823612 197.29754406618028 617.3999999999999
+ vertex 3.7550691403082355 197.73185864123104 617.3999999999999
+ vertex -3.644930859691753 197.73185864123099 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.644930859691753 197.73185864123099 617.3999999999999
+ vertex 3.7550691403082355 197.73185864123104 617.3999999999999
+ vertex -3.0792454347425178 198.29754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.644930859691753 197.73185864123099 617.3999999999999
+ vertex -3.0792454347425178 198.29754406618028 617.3999999999999
+ vertex -6.110616284641007 200.19754406618026 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.0792454347425178 198.29754406618028 617.3999999999999
+ vertex 3.7550691403082355 197.73185864123104 617.3999999999999
+ vertex 3.1893837153589675 198.29754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -6.110616284641007 200.19754406618026 617.3999999999999
+ vertex -3.0792454347425178 198.29754406618028 617.3999999999999
+ vertex -5.544930859691772 200.76322949112952 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -6.110616284641007 200.19754406618026 617.3999999999999
+ vertex -5.544930859691772 200.76322949112952 617.3999999999999
+ vertex -8.144930859691767 200.19754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.344930859691762 204.1975440661803 617.3999999999999
+ vertex -5.544930859691769 202.79754406618025 617.3999999999999
+ vertex -3.344930859691773 202.79754406618025 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -5.544930859691769 202.79754406618025 617.3999999999999
+ vertex -3.344930859691762 204.1975440661803 617.3999999999999
+ vertex -6.199449537629263 202.81165453834433 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -6.199449537629263 202.81165453834433 617.3999999999999
+ vertex -3.344930859691762 204.1975440661803 617.3999999999999
+ vertex -6.359290213636658 203.1975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -6.359290213636658 203.1975440661803 617.3999999999999
+ vertex -3.344930859691762 204.1975440661803 617.3999999999999
+ vertex -6.613560009793296 203.52891491607878 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -6.613560009793296 203.52891491607878 617.3999999999999
+ vertex -3.344930859691762 204.1975440661803 617.3999999999999
+ vertex -6.944930859691767 203.7831847122354 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -6.944930859691767 203.7831847122354 617.3999999999999
+ vertex -3.344930859691762 204.1975440661803 617.3999999999999
+ vertex -7.330820387527756 203.94302538824277 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -7.330820387527756 203.94302538824277 617.3999999999999
+ vertex -3.344930859691762 204.1975440661803 617.3999999999999
+ vertex -7.744930859691788 203.9975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -7.744930859691788 203.9975440661803 617.3999999999999
+ vertex -3.344930859691762 204.1975440661803 617.3999999999999
+ vertex -9.810956263476202 204.0975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.810956263476202 204.0975440661803 617.3999999999999
+ vertex -3.344930859691762 204.1975440661803 617.3999999999999
+ vertex -3.744930859691761 204.1975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.810956263476202 204.0975440661803 617.3999999999999
+ vertex -3.744930859691761 204.1975440661803 617.3999999999999
+ vertex -9.652037640878309 204.30465084736684 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.652037640878309 204.30465084736684 617.3999999999999
+ vertex -3.744930859691761 204.1975440661803 617.3999999999999
+ vertex -3.744930859691761 204.5975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.652037640878309 204.30465084736684 617.3999999999999
+ vertex -3.744930859691761 204.5975440661803 617.3999999999999
+ vertex -9.444930859691762 204.46356946996474 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.444930859691762 204.46356946996474 617.3999999999999
+ vertex -3.744930859691761 204.5975440661803 617.3999999999999
+ vertex -9.203749904794282 204.56346989246933 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.203749904794282 204.56346989246933 617.3999999999999
+ vertex -3.744930859691761 204.5975440661803 617.3999999999999
+ vertex -8.94493085969176 204.5975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -8.144930859691767 200.19754406618028 617.3999999999999
+ vertex -9.544930859691767 197.99754406618032 617.3999999999999
+ vertex -8.144930859691767 197.9975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.544930859691767 197.99754406618032 617.3999999999999
+ vertex -8.144930859691767 200.19754406618028 617.3999999999999
+ vertex -9.544930859691767 198.3975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.544930859691767 198.3975440661803 617.3999999999999
+ vertex -8.144930859691767 200.19754406618028 617.3999999999999
+ vertex -9.944930859691766 198.3975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.944930859691766 198.3975440661803 617.3999999999999
+ vertex -8.144930859691767 200.19754406618028 617.3999999999999
+ vertex -9.130571505746877 201.5975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.944930859691766 198.3975440661803 617.3999999999999
+ vertex -9.130571505746877 201.5975440661803 617.3999999999999
+ vertex -9.290412181754272 201.98343359401625 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.944930859691766 198.3975440661803 617.3999999999999
+ vertex -9.290412181754272 201.98343359401625 617.3999999999999
+ vertex -9.944930859691764 203.5975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.130571505746877 201.5975440661803 617.3999999999999
+ vertex -8.144930859691767 200.19754406618028 617.3999999999999
+ vertex -8.876301709590237 201.2661732162818 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -8.876301709590237 201.2661732162818 617.3999999999999
+ vertex -8.144930859691767 200.19754406618028 617.3999999999999
+ vertex -8.544930859691766 201.01190342012518 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -8.544930859691766 201.01190342012518 617.3999999999999
+ vertex -8.144930859691767 200.19754406618028 617.3999999999999
+ vertex -8.1590413318558 200.85206274411777 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -8.1590413318558 200.85206274411777 617.3999999999999
+ vertex -8.144930859691767 200.19754406618028 617.3999999999999
+ vertex -7.744930859691745 200.79754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -7.744930859691745 200.79754406618028 617.3999999999999
+ vertex -8.144930859691767 200.19754406618028 617.3999999999999
+ vertex -5.544930859691772 200.76322949112952 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.944930859691764 203.5975440661803 617.3999999999999
+ vertex -9.290412181754272 201.98343359401625 617.3999999999999
+ vertex -9.344930859691765 202.39754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.944930859691764 203.5975440661803 617.3999999999999
+ vertex -9.344930859691765 202.39754406618027 617.3999999999999
+ vertex -9.290412181754292 202.81165453834433 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.944930859691764 203.5975440661803 617.3999999999999
+ vertex -9.290412181754292 202.81165453834433 617.3999999999999
+ vertex -9.130571505746875 203.19754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.944930859691764 203.5975440661803 617.3999999999999
+ vertex -9.130571505746875 203.19754406618028 617.3999999999999
+ vertex -8.876301709590258 203.52891491607872 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.944930859691764 203.5975440661803 617.3999999999999
+ vertex -8.876301709590258 203.52891491607872 617.3999999999999
+ vertex -8.544930859691787 203.7831847122354 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.944930859691764 203.5975440661803 617.3999999999999
+ vertex -8.544930859691787 203.7831847122354 617.3999999999999
+ vertex -9.910856685980832 203.8563631112828 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.910856685980832 203.8563631112828 617.3999999999999
+ vertex -8.544930859691787 203.7831847122354 617.3999999999999
+ vertex -8.15904133185582 203.94302538824277 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.910856685980832 203.8563631112828 617.3999999999999
+ vertex -8.15904133185582 203.94302538824277 617.3999999999999
+ vertex -9.810956263476202 204.0975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.810956263476202 204.0975440661803 617.3999999999999
+ vertex -8.15904133185582 203.94302538824277 617.3999999999999
+ vertex -7.744930859691788 203.9975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -5.544930859691772 200.76322949112952 617.3999999999999
+ vertex -7.330820387527713 200.85206274411777 617.3999999999999
+ vertex -7.744930859691745 200.79754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -7.330820387527713 200.85206274411777 617.3999999999999
+ vertex -5.544930859691772 200.76322949112952 617.3999999999999
+ vertex -6.9449308596917465 201.0119034201252 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -6.9449308596917465 201.0119034201252 617.3999999999999
+ vertex -5.544930859691772 200.76322949112952 617.3999999999999
+ vertex -6.613560009793275 201.26617321628183 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -6.613560009793275 201.26617321628183 617.3999999999999
+ vertex -5.544930859691772 200.76322949112952 617.3999999999999
+ vertex -6.359290213636661 201.59754406618032 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -6.359290213636661 201.59754406618032 617.3999999999999
+ vertex -5.544930859691772 200.76322949112952 617.3999999999999
+ vertex -5.544930859691769 202.79754406618025 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -6.359290213636661 201.59754406618032 617.3999999999999
+ vertex -5.544930859691769 202.79754406618025 617.3999999999999
+ vertex -6.199449537629244 201.98343359401625 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -6.199449537629244 201.98343359401625 617.3999999999999
+ vertex -5.544930859691769 202.79754406618025 617.3999999999999
+ vertex -6.144930859691768 202.3975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -6.144930859691768 202.3975440661803 617.3999999999999
+ vertex -5.544930859691769 202.79754406618025 617.3999999999999
+ vertex -6.199449537629263 202.81165453834433 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 5.6550691403082505 188.431858641231 617.3999999999999
+ vertex 6.220754565257486 188.99754406618027 617.3999999999999
+ vertex 3.189383715358996 190.89754406618025 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 6.220754565257486 188.99754406618027 617.3999999999999
+ vertex 5.6550691403082505 188.431858641231 617.3999999999999
+ vertex 8.255069140308246 188.99754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.189383715358996 190.89754406618025 617.3999999999999
+ vertex 6.220754565257486 188.99754406618027 617.3999999999999
+ vertex 3.7550691403082315 191.46322949112954 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex 3.189383715358996 190.89754406618025 617.3999999999999
+ vertex 3.7550691403082315 191.46322949112954 617.3999999999999
+ vertex -3.079245434742501 190.89754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.079245434742501 190.89754406618027 617.3999999999999
+ vertex 3.7550691403082315 191.46322949112954 617.3999999999999
+ vertex -3.6449308596917698 191.4632294911295 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.6449308596917698 191.4632294911295 617.3999999999999
+ vertex 3.7550691403082315 191.46322949112954 617.3999999999999
+ vertex 0.055069140308233296 191.89754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.6449308596917698 191.4632294911295 617.3999999999999
+ vertex 0.055069140308233296 191.89754406618027 617.3999999999999
+ vertex -0.6437422814685734 191.98954433519978 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.6449308596917698 191.4632294911295 617.3999999999999
+ vertex -0.6437422814685734 191.98954433519978 617.3999999999999
+ vertex -1.294930859691767 192.2592754759623 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.6449308596917698 191.4632294911295 617.3999999999999
+ vertex -1.294930859691767 192.2592754759623 617.3999999999999
+ vertex -1.854119168895446 192.6883557569766 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.6449308596917698 191.4632294911295 617.3999999999999
+ vertex -1.854119168895446 192.6883557569766 617.3999999999999
+ vertex -2.2831994499097514 193.24754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.6449308596917698 191.4632294911295 617.3999999999999
+ vertex -2.2831994499097514 193.24754406618027 617.3999999999999
+ vertex -2.552930590672251 193.89873264440348 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.6449308596917698 191.4632294911295 617.3999999999999
+ vertex -2.552930590672251 193.89873264440348 617.3999999999999
+ vertex -3.644930859691753 197.73185864123099 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.644930859691753 197.73185864123099 617.3999999999999
+ vertex -2.552930590672251 193.89873264440348 617.3999999999999
+ vertex -2.644930859691766 194.59754406618026 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.644930859691753 197.73185864123099 617.3999999999999
+ vertex -2.644930859691766 194.59754406618026 617.3999999999999
+ vertex -2.5529305906722497 195.2963554879571 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.644930859691753 197.73185864123099 617.3999999999999
+ vertex -2.5529305906722497 195.2963554879571 617.3999999999999
+ vertex -2.28319944990975 195.94754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.644930859691753 197.73185864123099 617.3999999999999
+ vertex -2.28319944990975 195.94754406618028 617.3999999999999
+ vertex -1.8541191688954417 196.50673237538396 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.644930859691753 197.73185864123099 617.3999999999999
+ vertex -1.8541191688954417 196.50673237538396 617.3999999999999
+ vertex -1.2949308596917628 196.93581265639824 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.644930859691753 197.73185864123099 617.3999999999999
+ vertex -1.2949308596917628 196.93581265639824 617.3999999999999
+ vertex -0.6437422814685692 197.20554379716077 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.644930859691753 197.73185864123099 617.3999999999999
+ vertex -0.6437422814685692 197.20554379716077 617.3999999999999
+ vertex 0.05506914030823612 197.29754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -3.079245434742501 190.89754406618027 617.3999999999999
+ vertex -6.1106162846410355 188.9975440661803 617.3999999999999
+ vertex -5.544930859691769 188.43185864123106 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -6.1106162846410355 188.9975440661803 617.3999999999999
+ vertex -3.079245434742501 190.89754406618027 617.3999999999999
+ vertex -3.6449308596917698 191.4632294911295 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -8.14493085969177 191.19754406618028 617.3999999999999
+ vertex -9.544930859691773 190.79754406618028 617.3999999999999
+ vertex -8.14493085969177 188.9975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.544930859691773 190.79754406618028 617.3999999999999
+ vertex -8.14493085969177 191.19754406618028 617.3999999999999
+ vertex -9.544930859691773 191.19754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -7.744930859691757 185.19754406618028 617.3999999999999
+ vertex -9.910856685980843 185.33872502107778 617.3999999999999
+ vertex -9.810956263476214 185.0975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.910856685980843 185.33872502107778 617.3999999999999
+ vertex -7.744930859691757 185.19754406618028 617.3999999999999
+ vertex -8.159041331855791 185.25206274411775 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.910856685980843 185.33872502107778 617.3999999999999
+ vertex -8.159041331855791 185.25206274411775 617.3999999999999
+ vertex -8.54493085969176 185.41190342012518 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.910856685980843 185.33872502107778 617.3999999999999
+ vertex -8.54493085969176 185.41190342012518 617.3999999999999
+ vertex -9.944930859691775 185.5975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.944930859691775 185.5975440661803 617.3999999999999
+ vertex -8.54493085969176 185.41190342012518 617.3999999999999
+ vertex -8.87630170959024 185.6661732162818 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.944930859691775 185.5975440661803 617.3999999999999
+ vertex -8.87630170959024 185.6661732162818 617.3999999999999
+ vertex -9.130571505746875 185.99754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.944930859691775 185.5975440661803 617.3999999999999
+ vertex -9.130571505746875 185.99754406618027 617.3999999999999
+ vertex -9.290412181754286 186.38343359401622 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.944930859691775 185.5975440661803 617.3999999999999
+ vertex -9.290412181754286 186.38343359401622 617.3999999999999
+ vertex -9.944930859691773 190.79754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.944930859691773 190.79754406618028 617.3999999999999
+ vertex -9.290412181754286 186.38343359401622 617.3999999999999
+ vertex -9.344930859691782 186.79754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.944930859691773 190.79754406618028 617.3999999999999
+ vertex -9.344930859691782 186.79754406618028 617.3999999999999
+ vertex -9.290412181754292 187.2116545383443 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.944930859691773 190.79754406618028 617.3999999999999
+ vertex -9.290412181754292 187.2116545383443 617.3999999999999
+ vertex -9.130571505746886 187.5975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.944930859691773 190.79754406618028 617.3999999999999
+ vertex -9.130571505746886 187.5975440661803 617.3999999999999
+ vertex -8.87630170959026 187.92891491607875 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.944930859691773 190.79754406618028 617.3999999999999
+ vertex -8.87630170959026 187.92891491607875 617.3999999999999
+ vertex -8.544930859691787 188.1831847122354 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.944930859691773 190.79754406618028 617.3999999999999
+ vertex -8.544930859691787 188.1831847122354 617.3999999999999
+ vertex -8.159041331855816 188.34302538824278 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.944930859691773 190.79754406618028 617.3999999999999
+ vertex -8.159041331855816 188.34302538824278 617.3999999999999
+ vertex -7.7449308596917845 188.39754406618027 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.944930859691773 190.79754406618028 617.3999999999999
+ vertex -7.7449308596917845 188.39754406618027 617.3999999999999
+ vertex -8.14493085969177 188.9975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -8.14493085969177 188.9975440661803 617.3999999999999
+ vertex -7.7449308596917845 188.39754406618027 617.3999999999999
+ vertex -5.544930859691769 188.43185864123106 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -8.14493085969177 188.9975440661803 617.3999999999999
+ vertex -5.544930859691769 188.43185864123106 617.3999999999999
+ vertex -6.1106162846410355 188.9975440661803 617.3999999999999
+ endloop
+endfacet
+facet normal 3.3533729404294705e-19 -2.2196452394793015e-19 1.0
+ outer loop
+ vertex -9.944930859691773 190.79754406618028 617.3999999999999
+ vertex -8.14493085969177 188.9975440661803 617.3999999999999
+ vertex -9.544930859691773 190.79754406618028 617.3999999999999
+ endloop
+endfacet
+facet normal -0.5352237960733263 -0.8447102983371629 1.045809941340471e-16
+ outer loop
+ vertex 18.436158735513036 201.68385752189488 -3.000000000000062
+ vertex 19.691403178850077 200.88851183085106 -62.600000000000065
+ vertex 19.691403178850077 200.8885118308511 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.5352237960733263 -0.8447102983371629 1.045809941340471e-16
+ outer loop
+ vertex 19.691403178850077 200.88851183085106 -62.600000000000065
+ vertex 18.436158735513036 201.68385752189488 -3.000000000000062
+ vertex 18.436158735513036 201.68385752189488 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.6684424840618564 -0.7437638371830234 7.69044552122959e-17
+ outer loop
+ vertex 23.24248336816515 198.19768080857895 -3.000000000000062
+ vertex 24.347720779875264 197.20437136809883 -62.600000000000065
+ vertex 24.347720779875264 197.20437136809886 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.6684424840618564 -0.7437638371830234 7.69044552122959e-17
+ outer loop
+ vertex 24.347720779875264 197.20437136809883 -62.600000000000065
+ vertex 23.24248336816515 198.19768080857895 -3.000000000000062
+ vertex 23.24248336816515 198.19768080857895 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.6367513322442926 -0.7710692192566881 1.820889389375274e-16
+ outer loop
+ vertex -23.132345087548707 198.19768080857898 -3.000000000000062
+ vertex -21.986531718390673 199.14389701212295 -62.600000000000065
+ vertex -21.986531718390673 199.14389701212298 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.6367513322442926 -0.7710692192566881 1.820889389375274e-16
+ outer loop
+ vertex -21.986531718390673 199.14389701212295 -62.600000000000065
+ vertex -23.132345087548707 198.19768080857898 -3.000000000000062
+ vertex -23.132345087548707 198.19768080857895 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.34815064323678235 -0.9374386004500854 1.3498487096513963e-16
+ outer loop
+ vertex 12.805069140308262 204.43638645629042 -3.000000000000085
+ vertex 13.116314124512934 204.32079473497333 -62.600000000000065
+ vertex 13.116314124512934 204.32079473497333 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.34815064323678235 -0.9374386004500854 1.3498487096513963e-16
+ outer loop
+ vertex 13.116314124512934 204.32079473497333 -62.600000000000065
+ vertex 12.805069140308262 204.43638645629042 -3.000000000000085
+ vertex 12.805069140308262 204.43638645629036 -62.60000000000009
+ endloop
+endfacet
+facet normal 0.8660254037844397 0.49999999999999806 -1.962553415389866e-17
+ outer loop
+ vertex 12.80506914030825 186.78502419417032 -3.0000000000000733
+ vertex 13.997857139629506 184.71905477668744 -62.60000000000008
+ vertex 12.80506914030825 186.78502419417032 -62.60000000000008
+ endloop
+endfacet
+facet normal 0.8660254037844397 0.49999999999999806 -1.962553415389866e-17
+ outer loop
+ vertex 13.997857139629506 184.71905477668744 -62.60000000000008
+ vertex 12.80506914030825 186.78502419417032 -3.0000000000000733
+ vertex 13.997857139629506 184.71905477668747 -3.0000000000000733
+ endloop
+endfacet
+facet normal -0.7562861433211046 -0.6542409872672988 5.469233483307166e-17
+ outer loop
+ vertex 27.40101177575885 193.95965933221277 -3.000000000000062
+ vertex 26.428805842568213 195.08350496407658 -62.600000000000065
+ vertex 27.40101177575885 193.95965933221274 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.7562861433211046 -0.6542409872672988 5.469233483307166e-17
+ outer loop
+ vertex 26.428805842568213 195.08350496407658 -62.600000000000065
+ vertex 27.40101177575885 193.95965933221277 -3.000000000000062
+ vertex 26.428805842568213 195.08350496407658 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.7282622292749885 -0.6852985666199982 6.220955760198371e-17
+ outer loop
+ vertex 26.428805842568213 195.08350496407658 -3.000000000000062
+ vertex 25.410448164829532 196.1657068957793 -62.600000000000065
+ vertex 26.428805842568213 195.08350496407658 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.7282622292749885 -0.6852985666199982 6.220955760198371e-17
+ outer loop
+ vertex 25.410448164829532 196.1657068957793 -62.600000000000065
+ vertex 26.428805842568213 195.08350496407658 -3.000000000000062
+ vertex 25.410448164829532 196.1657068957793 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.3870523431386321 -0.9220577442171909 1.889253497189432e-16
+ outer loop
+ vertex -14.376359044152096 203.74563268952207 -3.000000000000062
+ vertex -13.00617584389643 204.32079473497333 -62.600000000000065
+ vertex -13.00617584389643 204.32079473497333 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.3870523431386321 -0.9220577442171909 1.889253497189432e-16
+ outer loop
+ vertex -13.00617584389643 204.32079473497333 -62.600000000000065
+ vertex -14.376359044152096 203.74563268952207 -3.000000000000062
+ vertex -14.376359044152096 203.74563268952207 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.462756929808682 -0.8864852079499369 1.8861380718886254e-16
+ outer loop
+ vertex -17.038610704038266 202.4260094700736 -3.000000000000062
+ vertex -15.721288500709916 203.11366897404972 -62.600000000000065
+ vertex -15.721288500709916 203.11366897404974 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.462756929808682 -0.8864852079499369 1.8861380718886254e-16
+ outer loop
+ vertex -15.721288500709916 203.11366897404972 -62.600000000000065
+ vertex -17.038610704038266 202.4260094700736 -3.000000000000062
+ vertex -17.038610704038266 202.42600947007358 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.6039459209966634 -0.7970252972845291 1.8404317463084559e-16
+ outer loop
+ vertex -21.986531718390673 199.14389701212298 -3.000000000000062
+ vertex -20.80214746548775 200.04136418270141 -62.600000000000065
+ vertex -20.80214746548775 200.04136418270141 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.6039459209966634 -0.7970252972845291 1.8404317463084559e-16
+ outer loop
+ vertex -20.80214746548775 200.04136418270141 -62.600000000000065
+ vertex -21.986531718390673 199.14389701212298 -3.000000000000062
+ vertex -21.986531718390673 199.14389701212295 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.6039459209966644 -0.7970252972845284 9.106128389727631e-17
+ outer loop
+ vertex 20.912285746104196 200.04136418270141 -3.000000000000062
+ vertex 22.09666999900712 199.14389701212292 -62.600000000000065
+ vertex 22.09666999900712 199.14389701212295 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.6039459209966644 -0.7970252972845284 9.106128389727631e-17
+ outer loop
+ vertex 22.09666999900712 199.14389701212292 -62.600000000000065
+ vertex 20.912285746104196 200.04136418270141 -3.000000000000062
+ vertex 20.912285746104196 200.04136418270141 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.6989639196910222 -0.7151569331064074 6.96179190577177e-17
+ outer loop
+ vertex 24.347720779875264 197.20437136809886 -3.000000000000062
+ vertex 25.410448164829532 196.1657068957793 -62.600000000000065
+ vertex 25.410448164829532 196.1657068957793 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.6989639196910222 -0.7151569331064074 6.96179190577177e-17
+ outer loop
+ vertex 25.410448164829532 196.1657068957793 -62.600000000000065
+ vertex 24.347720779875264 197.20437136809886 -3.000000000000062
+ vertex 24.347720779875264 197.20437136809883 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.5700836569343717 -0.8215866503883409 1.8567535078147348e-16
+ outer loop
+ vertex -20.80214746548775 200.04136418270141 -3.000000000000062
+ vertex -19.58126489823363 200.8885118308511 -62.600000000000065
+ vertex -19.58126489823363 200.8885118308511 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.5700836569343717 -0.8215866503883409 1.8567535078147348e-16
+ outer loop
+ vertex -19.58126489823363 200.8885118308511 -62.600000000000065
+ vertex -20.80214746548775 200.04136418270141 -3.000000000000062
+ vertex -20.80214746548775 200.04136418270141 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.4627569298086952 -0.8864852079499299 1.1736899405614529e-16
+ outer loop
+ vertex 15.831426781326385 203.11366897404974 -3.000000000000062
+ vertex 17.148748984654713 202.42600947007355 -62.600000000000065
+ vertex 17.148748984654713 202.42600947007358 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.4627569298086952 -0.8864852079499299 1.1736899405614529e-16
+ outer loop
+ vertex 17.148748984654713 202.42600947007355 -62.600000000000065
+ vertex 15.831426781326385 203.11366897404974 -3.000000000000062
+ vertex 15.831426781326385 203.11366897404972 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.7282622292749873 -0.6852985666199997 1.743308530253973e-16
+ outer loop
+ vertex -25.300309884213064 196.16570689577935 -3.000000000000062
+ vertex -26.318667561951766 195.08350496407658 -62.600000000000065
+ vertex -25.300309884213064 196.16570689577932 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.7282622292749873 -0.6852985666199997 1.743308530253973e-16
+ outer loop
+ vertex -26.318667561951766 195.08350496407658 -62.600000000000065
+ vertex -25.300309884213064 196.16570689577935 -3.000000000000062
+ vertex -26.318667561951766 195.08350496407658 -3.000000000000062
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 -7.697865611885053e-17
+ outer loop
+ vertex 10.30506914030826 197.22612362681 -3.000000000000062
+ vertex 10.305069140308266 204.87612362680997 -62.600000000000065
+ vertex 10.30506914030826 197.22612362681 -62.600000000000065
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 -7.697865611885053e-17
+ outer loop
+ vertex 10.305069140308266 204.87612362680997 -62.600000000000065
+ vertex 10.30506914030826 197.22612362681 -3.000000000000062
+ vertex 10.305069140308266 204.87612362680997 -3.000000000000062
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376093e-16 7.697865611885053e-17
+ outer loop
+ vertex 12.805069140308262 204.43638645629042 -3.000000000000085
+ vertex 12.80506914030825 186.78502419417032 -62.60000000000008
+ vertex 12.805069140308262 204.43638645629036 -62.60000000000009
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376093e-16 7.697865611885053e-17
+ outer loop
+ vertex 12.80506914030825 186.78502419417032 -62.60000000000008
+ vertex 12.805069140308262 204.43638645629042 -3.000000000000085
+ vertex 12.80506914030825 186.78502419417032 -3.0000000000000733
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 -7.697865611885053e-17
+ outer loop
+ vertex -12.694930859691725 186.78502419417035 -3.000000000000062
+ vertex -12.694930859691715 204.43638645629042 -62.600000000000065
+ vertex -12.694930859691725 186.78502419417032 -62.600000000000065
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 -7.697865611885053e-17
+ outer loop
+ vertex -12.694930859691715 204.43638645629042 -62.600000000000065
+ vertex -12.694930859691725 186.78502419417035 -3.000000000000062
+ vertex -12.694930859691715 204.43638645629042 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.49942734013696766 -0.8663557767590137 1.1107217741834915e-16
+ outer loop
+ vertex 17.148748984654713 202.42600947007358 -3.000000000000062
+ vertex 18.436158735513036 201.68385752189488 -62.600000000000065
+ vertex 18.436158735513036 201.68385752189488 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.49942734013696766 -0.8663557767590137 1.1107217741834915e-16
+ outer loop
+ vertex 18.436158735513036 201.68385752189488 -62.600000000000065
+ vertex 17.148748984654713 202.42600947007358 -3.000000000000062
+ vertex 17.148748984654713 202.42600947007355 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.4994273401369732 -0.8663557767590104 1.8796266836386054e-16
+ outer loop
+ vertex -18.326020454896568 201.68385752189488 -3.000000000000062
+ vertex -17.038610704038266 202.42600947007358 -62.600000000000065
+ vertex -17.038610704038266 202.4260094700736 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.4994273401369732 -0.8663557767590104 1.8796266836386054e-16
+ outer loop
+ vertex -17.038610704038266 202.42600947007358 -62.600000000000065
+ vertex -18.326020454896568 201.68385752189488 -3.000000000000062
+ vertex -18.326020454896568 201.68385752189488 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.42527673511601083 -0.9050633671567236 1.2346042516618483e-16
+ outer loop
+ vertex 14.486497324768576 203.74563268952207 -3.000000000000062
+ vertex 15.831426781326385 203.11366897404972 -62.600000000000065
+ vertex 15.831426781326385 203.11366897404974 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.42527673511601083 -0.9050633671567236 1.2346042516618483e-16
+ outer loop
+ vertex 15.831426781326385 203.11366897404972 -62.600000000000065
+ vertex 14.486497324768576 203.74563268952207 -3.000000000000062
+ vertex 14.486497324768576 203.74563268952207 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.636751332244289 -0.7710692192566911 8.405641526142167e-17
+ outer loop
+ vertex 22.09666999900712 199.14389701212295 -3.000000000000062
+ vertex 23.24248336816515 198.19768080857895 -62.600000000000065
+ vertex 23.24248336816515 198.19768080857895 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.636751332244289 -0.7710692192566911 8.405641526142167e-17
+ outer loop
+ vertex 23.24248336816515 198.19768080857895 -62.600000000000065
+ vertex 22.09666999900712 199.14389701212295 -3.000000000000062
+ vertex 22.09666999900712 199.14389701212292 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.3481506432367668 -0.9374386004500911 1.8858520825170114e-16
+ outer loop
+ vertex -13.00617584389643 204.32079473497333 -3.000000000000062
+ vertex -12.694930859691715 204.43638645629042 -62.600000000000065
+ vertex -12.694930859691715 204.43638645629042 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.3481506432367668 -0.9374386004500911 1.8858520825170114e-16
+ outer loop
+ vertex -12.694930859691715 204.43638645629042 -62.600000000000065
+ vertex -13.00617584389643 204.32079473497333 -3.000000000000062
+ vertex -13.00617584389643 204.32079473497333 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.42527673511602226 -0.9050633671567184 1.8893488826187048e-16
+ outer loop
+ vertex -15.721288500709916 203.11366897404974 -3.000000000000062
+ vertex -14.376359044152096 203.74563268952207 -62.600000000000065
+ vertex -14.376359044152096 203.74563268952207 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.42527673511602226 -0.9050633671567184 1.8893488826187048e-16
+ outer loop
+ vertex -14.376359044152096 203.74563268952207 -62.600000000000065
+ vertex -15.721288500709916 203.11366897404974 -3.000000000000062
+ vertex -15.721288500709916 203.11366897404972 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 7.697865611885053e-17
+ outer loop
+ vertex -10.194930859691729 191.96896450555056 -3.000000000000062
+ vertex -10.194930859691729 184.37612362681 -62.600000000000065
+ vertex -10.194930859691729 191.96896450555056 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 7.697865611885053e-17
+ outer loop
+ vertex -10.194930859691729 184.37612362681 -62.600000000000065
+ vertex -10.194930859691729 191.96896450555056 -3.000000000000062
+ vertex -10.194930859691729 184.37612362681003 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.7562861433211037 -0.6542409872672998 1.711281167414056e-16
+ outer loop
+ vertex -26.318667561951766 195.08350496407658 -3.000000000000062
+ vertex -27.290873495142403 193.95965933221274 -62.600000000000065
+ vertex -26.318667561951766 195.08350496407658 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.7562861433211037 -0.6542409872672998 1.711281167414056e-16
+ outer loop
+ vertex -27.290873495142403 193.95965933221274 -62.600000000000065
+ vertex -26.318667561951766 195.08350496407658 -3.000000000000062
+ vertex -27.290873495142403 193.95965933221277 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.7829866224180543 -0.6220385431099646 4.7079405236779684e-17
+ outer loop
+ vertex 28.325364688606378 192.79613663226192 -3.000000000000062
+ vertex 27.40101177575885 193.95965933221274 -62.600000000000065
+ vertex 28.325364688606378 192.79613663226192 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.7829866224180543 -0.6220385431099646 4.7079405236779684e-17
+ outer loop
+ vertex 27.40101177575885 193.95965933221274 -62.600000000000065
+ vertex 28.325364688606378 192.79613663226192 -3.000000000000062
+ vertex 27.40101177575885 193.95965933221277 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.6684424840618629 -0.7437638371830175 1.798160634439509e-16
+ outer loop
+ vertex -24.237582499258796 197.2043713680989 -3.000000000000062
+ vertex -23.132345087548707 198.19768080857895 -62.600000000000065
+ vertex -23.132345087548707 198.19768080857898 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.6684424840618629 -0.7437638371830175 1.798160634439509e-16
+ outer loop
+ vertex -23.132345087548707 198.19768080857895 -62.600000000000065
+ vertex -24.237582499258796 197.2043713680989 -3.000000000000062
+ vertex -24.237582499258796 197.20437136809886 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.6989639196910173 -0.7151569331064122 1.7722852548447606e-16
+ outer loop
+ vertex -25.300309884213064 196.16570689577935 -3.000000000000062
+ vertex -24.237582499258796 197.20437136809886 -62.600000000000065
+ vertex -24.237582499258796 197.2043713680989 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.6989639196910173 -0.7151569331064122 1.7722852548447606e-16
+ outer loop
+ vertex -24.237582499258796 197.20437136809886 -62.600000000000065
+ vertex -25.300309884213064 196.16570689577935 -3.000000000000062
+ vertex -25.300309884213064 196.16570689577932 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.5700836569343625 -0.8215866503883473 9.790680320921995e-17
+ outer loop
+ vertex 19.691403178850077 200.8885118308511 -3.000000000000062
+ vertex 20.912285746104196 200.04136418270141 -62.600000000000065
+ vertex 20.912285746104196 200.04136418270141 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.5700836569343625 -0.8215866503883473 9.790680320921995e-17
+ outer loop
+ vertex 20.912285746104196 200.04136418270141 -62.600000000000065
+ vertex 19.691403178850077 200.8885118308511 -3.000000000000062
+ vertex 19.691403178850077 200.88851183085106 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.38705234313864506 -0.9220577442171854 1.293358112740132e-16
+ outer loop
+ vertex 13.116314124512934 204.32079473497333 -3.000000000000062
+ vertex 14.486497324768576 203.74563268952207 -62.600000000000065
+ vertex 14.486497324768576 203.74563268952207 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.38705234313864506 -0.9220577442171854 1.293358112740132e-16
+ outer loop
+ vertex 14.486497324768576 203.74563268952207 -62.600000000000065
+ vertex 13.116314124512934 204.32079473497333 -3.000000000000062
+ vertex 13.116314124512934 204.32079473497333 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.08715574274765935 0.9961946980917455 -1.652161531954166e-16
+ outer loop
+ vertex -21.53658740175749 152.53246326263664 -62.600000000000065
+ vertex -20.828912953759342 152.47054977096985 -3.000000000000062
+ vertex -20.828912953759342 152.47054977096985 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.08715574274765935 0.9961946980917455 -1.652161531954166e-16
+ outer loop
+ vertex -20.828912953759342 152.47054977096985 -3.000000000000062
+ vertex -21.53658740175749 152.53246326263664 -62.600000000000065
+ vertex -21.53658740175749 152.53246326263667 -3.000000000000062
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -10.194930859691729 191.96896450555056 -3.000000000000062
+ vertex -8.194930859691734 191.96896450555056 -62.600000000000065
+ vertex -8.194930859691734 191.96896450555056 -3.000000000000062
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -8.194930859691734 191.96896450555056 -62.600000000000065
+ vertex -10.194930859691729 191.96896450555056 -3.000000000000062
+ vertex -10.194930859691729 191.96896450555056 -62.600000000000065
+ endloop
+endfacet
+facet normal -1.0 7.771561172376093e-16 -7.697865611885055e-17
+ outer loop
+ vertex 8.305069140308264 191.96896450555053 -62.600000000000065
+ vertex 8.305069140308264 197.22612362681 -3.000000000000062
+ vertex 8.305069140308264 197.22612362681 -62.600000000000065
+ endloop
+endfacet
+facet normal -1.0 7.771561172376093e-16 -7.697865611885055e-17
+ outer loop
+ vertex 8.305069140308264 197.22612362681 -3.000000000000062
+ vertex 8.305069140308264 191.96896450555053 -62.600000000000065
+ vertex 8.305069140308264 191.96896450555056 -3.000000000000062
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 7.697865611885055e-17
+ outer loop
+ vertex -8.194930859691734 197.22612362681 -3.000000000000062
+ vertex -8.194930859691734 191.96896450555056 -62.600000000000065
+ vertex -8.194930859691734 197.22612362681 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 7.697865611885055e-17
+ outer loop
+ vertex -8.194930859691734 191.96896450555056 -62.600000000000065
+ vertex -8.194930859691734 197.22612362681 -3.000000000000062
+ vertex -8.194930859691734 191.96896450555056 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.5000000000000008 -0.8660254037844383 1.6298684457213916e-16
+ outer loop
+ vertex -29.842081742052876 190.46620886682183 -3.000000000000062
+ vertex -15.387718859012988 182.12097856533416 -62.600000000000065
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.5000000000000008 -0.8660254037844383 1.6298684457213916e-16
+ outer loop
+ vertex -15.387718859012988 182.12097856533416 -62.600000000000065
+ vertex -29.842081742052876 190.46620886682183 -3.000000000000062
+ vertex -29.842081742052876 190.4662088668218 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.5000000000000008 -0.8660254037844383 1.6298684457213916e-16
+ outer loop
+ vertex -29.842081742052876 190.4662088668218 -62.600000000000065
+ vertex -29.842081742052876 190.46620886682183 -3.000000000000062
+ vertex -32.44493085969176 191.9689645055506 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.5000000000000008 -0.8660254037844383 1.6298684457213916e-16
+ outer loop
+ vertex -29.842081742052876 190.4662088668218 -62.600000000000065
+ vertex -32.44493085969176 191.9689645055506 -3.000000000000062
+ vertex -32.44493085969176 191.9689645055506 -62.600000000000065
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 -1.7258201180401984e-16
+ outer loop
+ vertex -10.194930859691729 197.22612362681 -62.600000000000065
+ vertex -8.194930859691734 197.22612362681 -3.000000000000062
+ vertex -8.194930859691734 197.22612362681 -62.600000000000065
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 -1.7258201180401984e-16
+ outer loop
+ vertex -8.194930859691734 197.22612362681 -3.000000000000062
+ vertex -10.194930859691729 197.22612362681 -62.600000000000065
+ vertex -10.194930859691729 197.22612362681 -3.000000000000062
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 -7.697865611885053e-17
+ outer loop
+ vertex 10.305069140308255 184.37612362681 -3.000000000000062
+ vertex 10.30506914030826 191.96896450555053 -62.600000000000065
+ vertex 10.305069140308255 184.37612362681 -62.600000000000065
+ endloop
+endfacet
+facet normal -1.0 7.771561172376094e-16 -7.697865611885053e-17
+ outer loop
+ vertex 10.30506914030826 191.96896450555053 -62.600000000000065
+ vertex 10.305069140308255 184.37612362681 -3.000000000000062
+ vertex 10.30506914030826 191.96896450555056 -3.000000000000062
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 -1.7258201180401987e-16
+ outer loop
+ vertex -10.194930859691729 184.37612362681 -62.600000000000065
+ vertex 10.305069140308255 184.37612362681 -3.000000000000062
+ vertex 10.305069140308255 184.37612362681 -62.600000000000065
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 -1.7258201180401987e-16
+ outer loop
+ vertex 10.305069140308255 184.37612362681 -3.000000000000062
+ vertex -10.194930859691729 184.37612362681 -62.600000000000065
+ vertex -10.194930859691729 184.37612362681003 -3.000000000000062
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 1.7258201180401987e-16
+ outer loop
+ vertex -10.194930859691718 204.87612362681003 -3.000000000000062
+ vertex 10.305069140308266 204.87612362680997 -62.600000000000065
+ vertex 10.305069140308266 204.87612362680997 -3.000000000000062
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 1.7258201180401987e-16
+ outer loop
+ vertex 10.305069140308266 204.87612362680997 -62.600000000000065
+ vertex -10.194930859691718 204.87612362681003 -3.000000000000062
+ vertex -10.194930859691718 204.87612362681003 -62.600000000000065
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 20.88398209406786 152.47054977096982 -62.600000000000065
+ vertex 20.939051234375828 152.47054977096982 -3.000000000000051
+ vertex 20.939051234375828 152.47054977096982 -62.600000000000044
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 20.939051234375828 152.47054977096982 -3.000000000000051
+ vertex 20.88398209406786 152.47054977096982 -62.600000000000065
+ vertex 20.88398209406786 152.47054977096985 -3.000000000000062
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 20.88398209406786 152.47054977096985 -3.000000000000062
+ vertex 20.88398209406786 152.47054977096982 -62.600000000000065
+ vertex 11.646179055777065 152.47054977096985 -35.9058285412303
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 11.646179055777065 152.47054977096985 -35.9058285412303
+ vertex 20.88398209406786 152.47054977096982 -62.600000000000065
+ vertex 11.141623530443681 152.47054977096985 -37.39220118838113
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 11.141623530443681 152.47054977096985 -37.39220118838113
+ vertex 20.88398209406786 152.47054977096982 -62.600000000000065
+ vertex 10.447373985721516 152.47054977096985 -38.800000000000054
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 10.447373985721516 152.47054977096985 -38.800000000000054
+ vertex 20.88398209406786 152.47054977096982 -62.600000000000065
+ vertex 9.575309223803076 152.47054977096985 -40.105137148104696
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 9.575309223803076 152.47054977096985 -40.105137148104696
+ vertex 20.88398209406786 152.47054977096982 -62.600000000000065
+ vertex 8.540350514546814 152.47054977096985 -41.28528137423862
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 8.540350514546814 152.47054977096985 -41.28528137423862
+ vertex 20.88398209406786 152.47054977096982 -62.600000000000065
+ vertex 7.360206288412901 152.47054977096985 -42.32024008349487
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 7.360206288412901 152.47054977096985 -42.32024008349487
+ vertex 20.88398209406786 152.47054977096982 -62.600000000000065
+ vertex -20.828912953759342 152.47054977096985 -62.600000000000065
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 20.88398209406786 152.47054977096985 -3.000000000000062
+ vertex 11.646179055777065 152.47054977096985 -35.9058285412303
+ vertex 11.952407476793969 152.47054977096985 -34.36631430664067
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 20.88398209406786 152.47054977096985 -3.000000000000062
+ vertex 11.952407476793969 152.47054977096985 -34.36631430664067
+ vertex 12.055069140308246 152.47054977096985 -32.800000000000054
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 7.360206288412901 152.47054977096985 -42.32024008349487
+ vertex -20.828912953759342 152.47054977096985 -62.600000000000065
+ vertex 6.055069140308252 152.47054977096985 -43.19230484541332
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 6.055069140308252 152.47054977096985 -43.19230484541332
+ vertex -20.828912953759342 152.47054977096985 -62.600000000000065
+ vertex 4.6472703286893084 152.47054977096985 -43.8865543901355
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 4.6472703286893084 152.47054977096985 -43.8865543901355
+ vertex -20.828912953759342 152.47054977096985 -62.600000000000065
+ vertex 3.160897681538491 152.47054977096985 -44.391109915468874
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 3.160897681538491 152.47054977096985 -44.391109915468874
+ vertex -20.828912953759342 152.47054977096985 -62.600000000000065
+ vertex 1.621383446948867 152.47054977096985 -44.69733833648578
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 1.621383446948867 152.47054977096985 -44.69733833648578
+ vertex -20.828912953759342 152.47054977096985 -62.600000000000065
+ vertex 0.055069140308240346 152.47054977096985 -44.800000000000054
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 0.055069140308240346 152.47054977096985 -44.800000000000054
+ vertex -20.828912953759342 152.47054977096985 -62.600000000000065
+ vertex -1.5112451663323863 152.47054977096985 -44.69733833648578
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -1.5112451663323863 152.47054977096985 -44.69733833648578
+ vertex -20.828912953759342 152.47054977096985 -62.600000000000065
+ vertex -3.0507594009220105 152.47054977096985 -44.391109915468874
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -3.0507594009220105 152.47054977096985 -44.391109915468874
+ vertex -20.828912953759342 152.47054977096985 -62.600000000000065
+ vertex -4.537132048072828 152.47054977096985 -43.8865543901355
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -4.537132048072828 152.47054977096985 -43.8865543901355
+ vertex -20.828912953759342 152.47054977096985 -62.600000000000065
+ vertex -5.944930859691748 152.47054977096985 -43.192304845413325
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -5.944930859691748 152.47054977096985 -43.192304845413325
+ vertex -20.828912953759342 152.47054977096985 -62.600000000000065
+ vertex -7.250068007796415 152.47054977096985 -42.32024008349488
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -7.250068007796415 152.47054977096985 -42.32024008349488
+ vertex -20.828912953759342 152.47054977096985 -62.600000000000065
+ vertex -8.430212233930328 152.47054977096985 -41.285281374238636
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -8.430212233930328 152.47054977096985 -41.285281374238636
+ vertex -20.828912953759342 152.47054977096985 -62.600000000000065
+ vertex -9.465170943186568 152.47054977096985 -40.10513714810471
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -9.465170943186568 152.47054977096985 -40.10513714810471
+ vertex -20.828912953759342 152.47054977096985 -62.600000000000065
+ vertex -10.33723570510503 152.47054977096985 -38.80000000000006
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -10.33723570510503 152.47054977096985 -38.80000000000006
+ vertex -20.828912953759342 152.47054977096985 -62.600000000000065
+ vertex -11.031485249827195 152.47054977096985 -37.392201188381144
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -11.031485249827195 152.47054977096985 -37.392201188381144
+ vertex -20.828912953759342 152.47054977096985 -62.600000000000065
+ vertex -11.53604077516058 152.47054977096985 -35.905828541230306
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -11.53604077516058 152.47054977096985 -35.905828541230306
+ vertex -20.828912953759342 152.47054977096985 -62.600000000000065
+ vertex -11.842269196177483 152.47054977096985 -34.36631430664068
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -11.842269196177483 152.47054977096985 -34.36631430664068
+ vertex -20.828912953759342 152.47054977096985 -62.600000000000065
+ vertex -11.94493085969176 152.47054977096985 -32.800000000000054
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 20.88398209406786 152.47054977096985 -3.000000000000062
+ vertex 7.360206288412901 152.47054977096985 -23.279759916505228
+ vertex -20.828912953759342 152.47054977096985 -3.000000000000062
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 7.360206288412901 152.47054977096985 -23.279759916505228
+ vertex 20.88398209406786 152.47054977096985 -3.000000000000062
+ vertex 8.540350514546814 152.47054977096985 -24.314718625761483
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 8.540350514546814 152.47054977096985 -24.314718625761483
+ vertex 20.88398209406786 152.47054977096985 -3.000000000000062
+ vertex 9.575309223803076 152.47054977096985 -25.4948628518954
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 9.575309223803076 152.47054977096985 -25.4948628518954
+ vertex 20.88398209406786 152.47054977096985 -3.000000000000062
+ vertex 10.447373985721516 152.47054977096985 -26.800000000000054
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 10.447373985721516 152.47054977096985 -26.800000000000054
+ vertex 20.88398209406786 152.47054977096985 -3.000000000000062
+ vertex 11.141623530443681 152.47054977096985 -28.207798811618975
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 11.141623530443681 152.47054977096985 -28.207798811618975
+ vertex 20.88398209406786 152.47054977096985 -3.000000000000062
+ vertex 11.646179055777065 152.47054977096985 -29.6941714587698
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 11.646179055777065 152.47054977096985 -29.6941714587698
+ vertex 20.88398209406786 152.47054977096985 -3.000000000000062
+ vertex 11.952407476793969 152.47054977096985 -31.233685693359433
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex 11.952407476793969 152.47054977096985 -31.233685693359433
+ vertex 20.88398209406786 152.47054977096985 -3.000000000000062
+ vertex 12.055069140308246 152.47054977096985 -32.800000000000054
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -20.828912953759342 152.47054977096985 -3.000000000000062
+ vertex 7.360206288412901 152.47054977096985 -23.279759916505228
+ vertex 6.0550691403082295 152.47054977096985 -22.40769515458679
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -20.828912953759342 152.47054977096985 -3.000000000000062
+ vertex 6.0550691403082295 152.47054977096985 -22.40769515458679
+ vertex 4.6472703286893084 152.47054977096985 -21.71344560986461
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -20.828912953759342 152.47054977096985 -3.000000000000062
+ vertex 4.6472703286893084 152.47054977096985 -21.71344560986461
+ vertex 3.160897681538491 152.47054977096985 -21.208890084531234
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -20.828912953759342 152.47054977096985 -3.000000000000062
+ vertex 3.160897681538491 152.47054977096985 -21.208890084531234
+ vertex 1.621383446948867 152.47054977096985 -20.90266166351433
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -20.828912953759342 152.47054977096985 -3.000000000000062
+ vertex 1.621383446948867 152.47054977096985 -20.90266166351433
+ vertex 0.055069140308240346 152.47054977096985 -20.80000000000005
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -20.828912953759342 152.47054977096985 -3.000000000000062
+ vertex 0.055069140308240346 152.47054977096985 -20.80000000000005
+ vertex -1.5112451663323863 152.47054977096985 -20.90266166351433
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -20.828912953759342 152.47054977096985 -3.000000000000062
+ vertex -1.5112451663323863 152.47054977096985 -20.90266166351433
+ vertex -3.0507594009220105 152.47054977096985 -21.208890084531237
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -20.828912953759342 152.47054977096985 -3.000000000000062
+ vertex -3.0507594009220105 152.47054977096985 -21.208890084531237
+ vertex -4.53713204807285 152.47054977096985 -21.71344560986461
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -20.828912953759342 152.47054977096985 -3.000000000000062
+ vertex -4.53713204807285 152.47054977096985 -21.71344560986461
+ vertex -5.944930859691771 152.47054977096985 -22.407695154586794
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -20.828912953759342 152.47054977096985 -3.000000000000062
+ vertex -5.944930859691771 152.47054977096985 -22.407695154586794
+ vertex -7.250068007796415 152.47054977096985 -23.279759916505235
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -20.828912953759342 152.47054977096985 -3.000000000000062
+ vertex -7.250068007796415 152.47054977096985 -23.279759916505235
+ vertex -8.430212233930328 152.47054977096985 -24.314718625761483
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -20.828912953759342 152.47054977096985 -3.000000000000062
+ vertex -8.430212233930328 152.47054977096985 -24.314718625761483
+ vertex -9.46517094318659 152.47054977096985 -25.494862851895416
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -20.828912953759342 152.47054977096985 -3.000000000000062
+ vertex -9.46517094318659 152.47054977096985 -25.494862851895416
+ vertex -10.33723570510503 152.47054977096985 -26.800000000000058
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -20.828912953759342 152.47054977096985 -3.000000000000062
+ vertex -10.33723570510503 152.47054977096985 -26.800000000000058
+ vertex -11.031485249827195 152.47054977096985 -28.207798811618986
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -20.828912953759342 152.47054977096985 -3.000000000000062
+ vertex -11.031485249827195 152.47054977096985 -28.207798811618986
+ vertex -11.53604077516058 152.47054977096985 -29.69417145876981
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -20.828912953759342 152.47054977096985 -3.000000000000062
+ vertex -11.53604077516058 152.47054977096985 -29.69417145876981
+ vertex -11.842269196177483 152.47054977096985 -31.233685693359437
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -20.828912953759342 152.47054977096985 -3.000000000000062
+ vertex -11.842269196177483 152.47054977096985 -31.233685693359437
+ vertex -11.94493085969176 152.47054977096985 -32.800000000000054
+ endloop
+endfacet
+facet normal 2.8514088728101677e-16 1.0 -1.8925949547301336e-16
+ outer loop
+ vertex -20.828912953759342 152.47054977096985 -3.000000000000062
+ vertex -11.94493085969176 152.47054977096985 -32.800000000000054
+ vertex -20.828912953759342 152.47054977096985 -62.600000000000065
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 8.305069140308264 191.96896450555056 -3.000000000000062
+ vertex 10.30506914030826 191.96896450555053 -62.600000000000065
+ vertex 10.30506914030826 191.96896450555056 -3.000000000000062
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 10.30506914030826 191.96896450555053 -62.600000000000065
+ vertex 8.305069140308264 191.96896450555056 -3.000000000000062
+ vertex 8.305069140308264 191.96896450555053 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 7.697865611885053e-17
+ outer loop
+ vertex -10.194930859691718 204.87612362681003 -3.000000000000062
+ vertex -10.194930859691729 197.22612362681 -62.600000000000065
+ vertex -10.194930859691718 204.87612362681003 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.0 -7.771561172376094e-16 7.697865611885053e-17
+ outer loop
+ vertex -10.194930859691729 197.22612362681 -62.600000000000065
+ vertex -10.194930859691718 204.87612362681003 -3.000000000000062
+ vertex -10.194930859691729 197.22612362681 -3.000000000000062
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 -1.7258201180401984e-16
+ outer loop
+ vertex 8.305069140308264 197.22612362681 -62.600000000000065
+ vertex 10.30506914030826 197.22612362681 -3.000000000000062
+ vertex 10.30506914030826 197.22612362681 -62.600000000000065
+ endloop
+endfacet
+facet normal 5.551115123125783e-16 1.0 -1.7258201180401984e-16
+ outer loop
+ vertex 10.30506914030826 197.22612362681 -3.000000000000062
+ vertex 8.305069140308264 197.22612362681 -62.600000000000065
+ vertex 8.305069140308264 197.22612362681 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.5352237960733128 -0.8447102983371713 1.869826112231561e-16
+ outer loop
+ vertex -19.58126489823363 200.8885118308511 -3.000000000000062
+ vertex -18.326020454896568 201.68385752189488 -62.600000000000065
+ vertex -18.326020454896568 201.68385752189488 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.5352237960733128 -0.8447102983371713 1.869826112231561e-16
+ outer loop
+ vertex -18.326020454896568 201.68385752189488 -62.600000000000065
+ vertex -19.58126489823363 200.8885118308511 -3.000000000000062
+ vertex -19.58126489823363 200.8885118308511 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.4910858544031766 0.8711111775227673 -1.8814124863278186e-16
+ outer loop
+ vertex 13.997857139629506 184.71905477668744 -62.60000000000008
+ vertex 28.325364688606378 192.79613663226192 -3.000000000000062
+ vertex 28.325364688606378 192.79613663226192 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.4910858544031766 0.8711111775227673 -1.8814124863278186e-16
+ outer loop
+ vertex 28.325364688606378 192.79613663226192 -3.000000000000062
+ vertex 13.997857139629506 184.71905477668744 -62.60000000000008
+ vertex 13.997857139629506 184.71905477668747 -3.0000000000000733
+ endloop
+endfacet
+facet normal 0.5735764363510477 0.8191520442889909 -9.721776452502665e-17
+ outer loop
+ vertex -23.448487618904775 153.42399697552065 -62.600000000000065
+ vertex -22.866580315162654 153.01654109490113 -3.000000000000062
+ vertex -22.866580315162654 153.01654109490113 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.5735764363510477 0.8191520442889909 -9.721776452502665e-17
+ outer loop
+ vertex -22.866580315162654 153.01654109490113 -3.000000000000062
+ vertex -23.448487618904775 153.42399697552065 -62.600000000000065
+ vertex -23.448487618904775 153.42399697552065 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.2685886841253404 0.9632549604127758 -1.4556488299553925e-16
+ outer loop
+ vertex 9.623562304152413 208.60189949091347 -62.600000000000065
+ vertex 11.17584934154037 208.16906836115925 -3.000000000000062
+ vertex 11.17584934154037 208.16906836115925 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.2685886841253404 0.9632549604127758 -1.4556488299553925e-16
+ outer loop
+ vertex 11.17584934154037 208.16906836115925 -3.000000000000062
+ vertex 9.623562304152413 208.60189949091347 -62.600000000000065
+ vertex 9.623562304152413 208.60189949091352 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.30863971000050494 0.9511790206952655 -1.403977188766158e-16
+ outer loop
+ vertex 11.17584934154037 208.16906836115925 -62.600000000000065
+ vertex 12.708675981153974 207.67169493382528 -3.000000000000062
+ vertex 12.708675981153974 207.67169493382528 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.30863971000050494 0.9511790206952655 -1.403977188766158e-16
+ outer loop
+ vertex 12.708675981153974 207.67169493382528 -3.000000000000062
+ vertex 11.17584934154037 208.16906836115925 -62.600000000000065
+ vertex 11.17584934154037 208.16906836115925 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.4910858544031737 0.8711111775227689 -1.125349904109144e-16
+ outer loop
+ vertex -28.21522640798993 192.79613663226192 -62.600000000000065
+ vertex -13.88771885901298 184.7190547766875 -3.000000000000062
+ vertex -13.88771885901298 184.7190547766875 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.4910858544031737 0.8711111775227689 -1.125349904109144e-16
+ outer loop
+ vertex -13.88771885901298 184.7190547766875 -3.000000000000062
+ vertex -28.21522640798993 192.79613663226192 -62.600000000000065
+ vertex -28.21522640798993 192.79613663226195 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.7829866224180636 0.6220385431099531 -4.707940523677698e-17
+ outer loop
+ vertex 29.71042613890401 195.87449752362707 -3.000000000000062
+ vertex 30.712842328706454 194.6127132252032 -62.600000000000065
+ vertex 29.71042613890401 195.87449752362707 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.7829866224180636 0.6220385431099531 -4.707940523677698e-17
+ outer loop
+ vertex 30.712842328706454 194.6127132252032 -62.600000000000065
+ vertex 29.71042613890401 195.87449752362707 -3.000000000000062
+ vertex 30.712842328706454 194.61271322520324 -3.000000000000062
+ endloop
+endfacet
+facet normal -5.551115123125782e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -11.660839120111838 180.57612362681 -3.000000000000062
+ vertex 11.770977400728352 180.57612362681 -62.600000000000065
+ vertex 11.770977400728352 180.57612362681 -3.0000000000000733
+ endloop
+endfacet
+facet normal -5.551115123125782e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 11.770977400728352 180.57612362681 -62.600000000000065
+ vertex -11.660839120111838 180.57612362681 -3.000000000000062
+ vertex -11.660839120111838 180.57612362681 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.06271134093823419 0.9980317067697442 -1.7706975454735845e-16
+ outer loop
+ vertex -3.1644098793779976 209.67437328084148 -62.600000000000065
+ vertex -1.5560800549907094 209.77543271540065 -3.000000000000062
+ vertex -1.5560800549907094 209.77543271540065 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.06271134093823419 0.9980317067697442 -1.7706975454735845e-16
+ outer loop
+ vertex -1.5560800549907094 209.77543271540065 -3.000000000000062
+ vertex -3.1644098793779976 209.67437328084148 -62.600000000000065
+ vertex -3.1644098793779976 209.67437328084154 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9961946980917462 0.08715574274765149 6.164421566816321e-17
+ outer loop
+ vertex -24.90424767656597 156.5458844937765 -3.000000000000062
+ vertex -24.84233418489917 155.83821004577834 -62.600000000000065
+ vertex -24.90424767656597 156.54588449377647 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9961946980917462 0.08715574274765149 6.164421566816321e-17
+ outer loop
+ vertex -24.84233418489917 155.83821004577834 -62.600000000000065
+ vertex -24.90424767656597 156.5458844937765 -3.000000000000062
+ vertex -24.84233418489917 155.83821004577834 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.34815064323675166 0.9374386004500969 -1.88585208251701e-16
+ outer loop
+ vertex -14.10922162912293 207.1106495691348 -62.600000000000065
+ vertex -12.598537700537447 207.6716949338253 -3.000000000000062
+ vertex -12.598537700537447 207.67169493382528 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.34815064323675166 0.9374386004500969 -1.88585208251701e-16
+ outer loop
+ vertex -12.598537700537447 207.6716949338253 -3.000000000000062
+ vertex -14.10922162912293 207.1106495691348 -62.600000000000065
+ vertex -14.10922162912293 207.1106495691348 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9659258262890669 0.2588190451025263 2.968816052123315e-17
+ outer loop
+ vertex -24.84233418489917 155.83821004577834 -3.000000000000062
+ vertex -24.658474920013315 155.15203792778206 -62.600000000000065
+ vertex -24.84233418489917 155.83821004577834 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9659258262890669 0.2588190451025263 2.968816052123315e-17
+ outer loop
+ vertex -24.658474920013315 155.15203792778206 -62.600000000000065
+ vertex -24.84233418489917 155.83821004577834 -3.000000000000062
+ vertex -24.658474920013315 155.1520379277821 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.3086397100005016 0.9511790206952665 -1.879150590781169e-16
+ outer loop
+ vertex -12.598537700537447 207.67169493382528 -62.600000000000065
+ vertex -11.065711060923867 208.16906836115928 -3.000000000000062
+ vertex -11.065711060923867 208.16906836115925 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.3086397100005016 0.9511790206952665 -1.879150590781169e-16
+ outer loop
+ vertex -11.065711060923867 208.16906836115928 -3.000000000000062
+ vertex -12.598537700537447 207.67169493382528 -62.600000000000065
+ vertex -12.598537700537447 207.6716949338253 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.8083169430505359 0.588747585623446 -3.9384090777526184e-17
+ outer loop
+ vertex 30.712842328706454 194.61271322520324 -3.000000000000062
+ vertex 31.66161008284822 193.31010907119943 -62.600000000000065
+ vertex 30.712842328706454 194.6127132252032 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.8083169430505359 0.588747585623446 -3.9384090777526184e-17
+ outer loop
+ vertex 31.66161008284822 193.31010907119943 -62.600000000000065
+ vertex 30.712842328706454 194.61271322520324 -3.000000000000062
+ vertex 31.66161008284822 193.31010907119946 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 39.679054986112455 132.23791530735045 -62.60000000000003
+ vertex 36.22198409214549 138.22573774106883 -42.69777747886726
+ vertex 35.833755524491714 138.89816934519487 -42.800000000000054
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 36.22198409214549 138.22573774106883 -42.69777747886726
+ vertex 39.679054986112455 132.23791530735045 -62.60000000000003
+ vertex 36.58375552449172 137.5991312395182 -42.39807621135338
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 36.58375552449172 137.5991312395182 -42.39807621135338
+ vertex 39.679054986112455 132.23791530735045 -62.60000000000003
+ vertex 36.89441569627156 137.06105203810748 -41.9213203435597
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 36.89441569627156 137.06105203810748 -41.9213203435597
+ vertex 39.679054986112455 132.23791530735045 -62.60000000000003
+ vertex 37.132793630168386 136.64816934519487 -41.30000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 37.132793630168386 136.64816934519487 -41.30000000000006
+ vertex 39.679054986112455 132.23791530735045 -62.60000000000003
+ vertex 37.28264426392534 136.38862043398146 -40.57645713530762
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 37.28264426392534 136.38862043398146 -40.57645713530762
+ vertex 39.679054986112455 132.23791530735045 -62.60000000000003
+ vertex 37.333755524491735 136.30009313384156 -39.800000000000054
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 37.333755524491735 136.30009313384156 -39.800000000000054
+ vertex 39.679054986112455 132.23791530735045 -62.60000000000003
+ vertex 39.679054986112455 132.23791530735048 -3.0000000000000284
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 37.333755524491735 136.30009313384156 -39.800000000000054
+ vertex 39.679054986112455 132.23791530735048 -3.0000000000000284
+ vertex 37.333755524491714 136.30009313384156 -25.800000000000054
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 37.333755524491714 136.30009313384156 -25.800000000000054
+ vertex 39.679054986112455 132.23791530735048 -3.0000000000000284
+ vertex 37.28264426392531 136.38862043398143 -25.02354286469249
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 37.28264426392531 136.38862043398143 -25.02354286469249
+ vertex 39.679054986112455 132.23791530735048 -3.0000000000000284
+ vertex 37.132793630168365 136.64816934519487 -24.300000000000058
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 37.132793630168365 136.64816934519487 -24.300000000000058
+ vertex 39.679054986112455 132.23791530735048 -3.0000000000000284
+ vertex 36.89441569627154 137.06105203810748 -23.678679656440412
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 36.89441569627154 137.06105203810748 -23.678679656440412
+ vertex 39.679054986112455 132.23791530735048 -3.0000000000000284
+ vertex 36.58375552449172 137.5991312395182 -23.201923788646738
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 36.58375552449172 137.5991312395182 -23.201923788646738
+ vertex 39.679054986112455 132.23791530735048 -3.0000000000000284
+ vertex 36.22198409214552 138.22573774106883 -22.902222521132845
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 36.22198409214552 138.22573774106883 -22.902222521132845
+ vertex 39.679054986112455 132.23791530735048 -3.0000000000000284
+ vertex 35.833755524491714 138.89816934519484 -22.800000000000054
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 35.833755524491714 138.89816934519484 -22.800000000000054
+ vertex 39.679054986112455 132.23791530735048 -3.0000000000000284
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 34.38486678505814 141.4077182564083 -40.576457135307614
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 34.38486678505814 141.4077182564083 -40.576457135307614
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 34.534717418815084 141.14816934519484 -41.300000000000054
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 34.534717418815084 141.14816934519484 -41.300000000000054
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 39.679054986112455 132.23791530735045 -62.60000000000003
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 34.534717418815084 141.14816934519484 -41.300000000000054
+ vertex 39.679054986112455 132.23791530735045 -62.60000000000003
+ vertex 34.77309535271191 140.73528665228224 -41.9213203435597
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 34.77309535271191 140.73528665228224 -41.9213203435597
+ vertex 39.679054986112455 132.23791530735045 -62.60000000000003
+ vertex 35.08375552449173 140.19720745087153 -42.39807621135337
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 35.08375552449173 140.19720745087153 -42.39807621135337
+ vertex 39.679054986112455 132.23791530735045 -62.60000000000003
+ vertex 35.44552695683794 139.57060094932092 -42.69777747886726
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 35.44552695683794 139.57060094932092 -42.69777747886726
+ vertex 39.679054986112455 132.23791530735045 -62.60000000000003
+ vertex 35.833755524491714 138.89816934519487 -42.800000000000054
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 34.38486678505814 141.4077182564083 -40.576457135307614
+ vertex 34.33375552449175 141.49624555654816 -39.800000000000054
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 34.33375552449175 141.49624555654816 -39.800000000000054
+ vertex 34.33375552449175 141.49624555654816 -25.800000000000047
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 34.33375552449175 141.49624555654816 -25.800000000000047
+ vertex 34.38486678505814 141.4077182564083 -25.02354286469249
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 34.38486678505814 141.4077182564083 -25.02354286469249
+ vertex 34.534717418815084 141.14816934519484 -24.30000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 34.534717418815084 141.14816934519484 -24.30000000000005
+ vertex 34.77309535271191 140.73528665228224 -23.678679656440412
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 34.77309535271191 140.73528665228224 -23.678679656440412
+ vertex 35.08375552449173 140.19720745087153 -23.201923788646738
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 35.08375552449173 140.19720745087153 -23.201923788646738
+ vertex 35.44552695683796 139.5706009493209 -22.902222521132845
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.49999999999999856 1.962553415389877e-17
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 35.44552695683796 139.5706009493209 -22.902222521132845
+ vertex 35.833755524491714 138.89816934519484 -22.800000000000054
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.4999999999999988 1.962553415389881e-17
+ outer loop
+ vertex 24.468394633251194 158.58355185517976 -62.60000000000005
+ vertex 11.770977400728352 180.57612362681 -3.0000000000000733
+ vertex 11.770977400728352 180.57612362681 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844394 -0.4999999999999988 1.962553415389881e-17
+ outer loop
+ vertex 11.770977400728352 180.57612362681 -3.0000000000000733
+ vertex 24.468394633251194 158.58355185517976 -62.60000000000005
+ vertex 24.468394633251194 158.58355185517976 -3.000000000000051
+ endloop
+endfacet
+facet normal 0.6989639196910199 0.7151569331064095 -6.961791905771825e-17
+ outer loop
+ vertex 26.399279190685665 199.39323136522816 -62.600000000000065
+ vertex 27.551755827279884 198.26684979780464 -3.000000000000062
+ vertex 27.551755827279884 198.2668497978046 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.6989639196910199 0.7151569331064095 -6.961791905771825e-17
+ outer loop
+ vertex 27.551755827279884 198.26684979780464 -3.000000000000062
+ vertex 26.399279190685665 199.39323136522816 -62.600000000000065
+ vertex 26.399279190685665 199.3932313652282 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.5700836569343793 0.8215866503883357 -9.79068032092166e-17
+ outer loop
+ vertex 21.349727138373666 203.3885041598933 -62.600000000000065
+ vertex 22.67371544873991 202.4698133591662 -3.000000000000062
+ vertex 22.67371544873991 202.4698133591662 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.5700836569343793 0.8215866503883357 -9.79068032092166e-17
+ outer loop
+ vertex 22.67371544873991 202.4698133591662 -3.000000000000062
+ vertex 21.349727138373666 203.3885041598933 -62.600000000000065
+ vertex 21.349727138373666 203.38850415989336 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9659258262890671 -0.25881904510252585 1.1902318351521178e-16
+ outer loop
+ vertex -24.658474920013315 157.93973105977088 -3.000000000000062
+ vertex -24.84233418489917 157.2535589417746 -62.600000000000065
+ vertex -24.658474920013315 157.93973105977085 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9659258262890671 -0.25881904510252585 1.1902318351521178e-16
+ outer loop
+ vertex -24.84233418489917 157.2535589417746 -62.600000000000065
+ vertex -24.658474920013315 157.93973105977088 -3.000000000000062
+ vertex -24.84233418489917 157.2535589417746 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.3481506432367572 0.9374386004500948 -1.3498487096514323e-16
+ outer loop
+ vertex 12.708675981153974 207.67169493382528 -62.600000000000065
+ vertex 14.219359909739431 207.1106495691348 -3.000000000000062
+ vertex 14.219359909739431 207.1106495691348 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.3481506432367572 0.9374386004500948 -1.3498487096514323e-16
+ outer loop
+ vertex 14.219359909739431 207.1106495691348 -3.000000000000062
+ vertex 12.708675981153974 207.67169493382528 -62.600000000000065
+ vertex 12.708675981153974 207.67169493382528 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.10439696179122616 0.994535707940525 -1.796753111088905e-16
+ outer loop
+ vertex -4.767105895595756 209.50613739606416 -62.600000000000065
+ vertex -3.1644098793779976 209.67437328084154 -3.000000000000062
+ vertex -3.1644098793779976 209.67437328084148 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.10439696179122616 0.994535707940525 -1.796753111088905e-16
+ outer loop
+ vertex -3.1644098793779976 209.67437328084154 -3.000000000000062
+ vertex -4.767105895595756 209.50613739606416 -62.600000000000065
+ vertex -4.767105895595756 209.50613739606416 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.7829866224180505 -0.6220385431099694 1.6762592114233934e-16
+ outer loop
+ vertex -27.290873495142403 193.95965933221277 -3.000000000000062
+ vertex -28.21522640798993 192.79613663226192 -62.600000000000065
+ vertex -27.290873495142403 193.95965933221274 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.7829866224180505 -0.6220385431099694 1.6762592114233934e-16
+ outer loop
+ vertex -28.21522640798993 192.79613663226192 -62.600000000000065
+ vertex -27.290873495142403 193.95965933221277 -3.000000000000062
+ vertex -28.21522640798993 192.79613663226195 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.832232779361344 0.554426371086813 -3.161985758607227e-17
+ outer loop
+ vertex 31.66161008284822 193.31010907119946 -3.000000000000062
+ vertex 32.55506914030826 191.9689645055505 -62.600000000000065
+ vertex 31.66161008284822 193.31010907119943 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.832232779361344 0.554426371086813 -3.161985758607227e-17
+ outer loop
+ vertex 32.55506914030826 191.9689645055505 -62.600000000000065
+ vertex 31.66161008284822 193.31010907119946 -3.000000000000062
+ vertex 32.55506914030826 191.9689645055505 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.8191520442889927 0.5735764363510447 -3.593175178246798e-17
+ outer loop
+ vertex -24.358256352634704 154.50821713237318 -3.000000000000062
+ vertex -23.95080047201519 153.92630982863105 -62.600000000000065
+ vertex -24.358256352634704 154.50821713237315 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.8191520442889927 0.5735764363510447 -3.593175178246798e-17
+ outer loop
+ vertex -23.95080047201519 153.92630982863105 -62.600000000000065
+ vertex -24.358256352634704 154.50821713237318 -3.000000000000062
+ vertex -23.95080047201519 153.92630982863105 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.7562861433211006 0.6542409872673034 -5.469233483307277e-17
+ outer loop
+ vertex 28.65611565455649 197.09325395373196 -3.000000000000062
+ vertex 29.71042613890401 195.87449752362707 -62.600000000000065
+ vertex 28.65611565455649 197.09325395373193 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.7562861433211006 0.6542409872673034 -5.469233483307277e-17
+ outer loop
+ vertex 29.71042613890401 195.87449752362707 -62.600000000000065
+ vertex 28.65611565455649 197.09325395373196 -3.000000000000062
+ vertex 29.71042613890401 195.87449752362707 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.4252767351160268 0.9050633671567163 -1.234604251661823e-16
+ outer loop
+ vertex 15.705257561860751 206.48691404766154 -62.600000000000065
+ vertex 17.163768745909092 205.80157985229923 -3.000000000000062
+ vertex 17.163768745909092 205.80157985229917 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.4252767351160268 0.9050633671567163 -1.234604251661823e-16
+ outer loop
+ vertex 17.163768745909092 205.80157985229923 -3.000000000000062
+ vertex 15.705257561860751 206.48691404766154 -62.600000000000065
+ vertex 15.705257561860751 206.48691404766154 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.38705234313864256 0.9220577442171864 -1.8892534971894325e-16
+ outer loop
+ vertex -15.595119281244203 206.48691404766154 -62.600000000000065
+ vertex -14.10922162912293 207.1106495691348 -3.000000000000062
+ vertex -14.10922162912293 207.1106495691348 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.38705234313864256 0.9220577442171864 -1.8892534971894325e-16
+ outer loop
+ vertex -14.10922162912293 207.1106495691348 -3.000000000000062
+ vertex -15.595119281244203 206.48691404766154 -62.600000000000065
+ vertex -15.595119281244203 206.4869140476616 -3.000000000000062
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 1.892594954730134e-16
+ outer loop
+ vertex 39.679054986112455 132.23791530735048 -3.0000000000000284
+ vertex 41.98845606287095 132.23791530735045 -62.60000000000003
+ vertex 41.98845606287095 132.23791530735048 -3.0000000000000284
+ endloop
+endfacet
+facet normal -5.551115123125783e-16 -1.0 1.892594954730134e-16
+ outer loop
+ vertex 41.98845606287095 132.23791530735045 -62.60000000000003
+ vertex 39.679054986112455 132.23791530735048 -3.0000000000000284
+ vertex 39.679054986112455 132.23791530735045 -62.60000000000003
+ endloop
+endfacet
+facet normal 0.6039459209966543 0.7970252972845361 -9.106128389727839e-17
+ outer loop
+ vertex 22.67371544873991 202.4698133591662 -62.600000000000065
+ vertex 23.958123096030832 201.4965534612419 -3.000000000000062
+ vertex 23.958123096030832 201.4965534612419 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.6039459209966543 0.7970252972845361 -9.106128389727839e-17
+ outer loop
+ vertex 23.958123096030832 201.4965534612419 -3.000000000000062
+ vertex 22.67371544873991 202.4698133591662 -62.600000000000065
+ vertex 22.67371544873991 202.4698133591662 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.3870523431386278 0.9220577442171928 -1.2933581127401577e-16
+ outer loop
+ vertex 14.219359909739431 207.1106495691348 -62.600000000000065
+ vertex 15.705257561860751 206.48691404766154 -3.000000000000062
+ vertex 15.705257561860751 206.48691404766154 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.3870523431386278 0.9220577442171928 -1.2933581127401577e-16
+ outer loop
+ vertex 15.705257561860751 206.48691404766154 -3.000000000000062
+ vertex 14.219359909739431 207.1106495691348 -62.600000000000065
+ vertex 14.219359909739431 207.1106495691348 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.4999999999999992 -0.8660254037844392 1.6454656576428208e-16
+ outer loop
+ vertex 29.952220022669408 190.46620886682177 -3.0000000000000733
+ vertex 32.55506914030826 191.9689645055505 -62.600000000000065
+ vertex 32.55506914030826 191.9689645055505 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.4999999999999992 -0.8660254037844392 1.6454656576428208e-16
+ outer loop
+ vertex 32.55506914030826 191.9689645055505 -62.600000000000065
+ vertex 29.952220022669408 190.46620886682177 -3.0000000000000733
+ vertex 29.952220022669408 190.46620886682177 -62.60000000000008
+ endloop
+endfacet
+facet normal 0.4999999999999992 -0.8660254037844392 1.6454656576428208e-16
+ outer loop
+ vertex 29.952220022669408 190.46620886682177 -62.60000000000008
+ vertex 29.952220022669408 190.46620886682177 -3.0000000000000733
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ endloop
+endfacet
+facet normal 0.4999999999999992 -0.8660254037844392 1.6454656576428208e-16
+ outer loop
+ vertex 29.952220022669408 190.46620886682177 -62.60000000000008
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 15.497857139629502 182.12097856533416 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844392 0.4999999999999993 -1.5295647765012072e-16
+ outer loop
+ vertex -13.88771885901298 184.7190547766875 -3.000000000000062
+ vertex -12.694930859691725 186.78502419417032 -62.600000000000065
+ vertex -13.88771885901298 184.7190547766875 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844392 0.4999999999999993 -1.5295647765012072e-16
+ outer loop
+ vertex -12.694930859691725 186.78502419417032 -62.600000000000065
+ vertex -13.88771885901298 184.7190547766875 -3.000000000000062
+ vertex -12.694930859691725 186.78502419417035 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.020915980694884383 0.9997812369471489 -1.7093417315095045e-16
+ outer loop
+ vertex 0.05506914030825163 209.809138854524 -62.600000000000065
+ vertex 1.6662183356072127 209.77543271540065 -3.000000000000062
+ vertex 1.6662183356072127 209.77543271540065 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.020915980694884383 0.9997812369471489 -1.7093417315095045e-16
+ outer loop
+ vertex 1.6662183356072127 209.77543271540065 -3.000000000000062
+ vertex 0.05506914030825163 209.809138854524 -62.600000000000065
+ vertex 0.05506914030825163 209.80913885452406 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.26858868412533565 0.9632549604127771 -1.8691607490093737e-16
+ outer loop
+ vertex -11.065711060923867 208.16906836115925 -62.600000000000065
+ vertex -9.513424023535883 208.60189949091352 -3.000000000000062
+ vertex -9.513424023535883 208.60189949091352 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.26858868412533565 0.9632549604127771 -1.8691607490093737e-16
+ outer loop
+ vertex -9.513424023535883 208.60189949091352 -3.000000000000062
+ vertex -11.065711060923867 208.16906836115925 -62.600000000000065
+ vertex -11.065711060923867 208.16906836115928 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.7282622292749887 0.685298566619998 -6.220955760198365e-17
+ outer loop
+ vertex 27.551755827279884 198.26684979780464 -3.000000000000062
+ vertex 28.65611565455649 197.09325395373193 -62.600000000000065
+ vertex 27.551755827279884 198.2668497978046 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.7282622292749887 0.685298566619998 -6.220955760198365e-17
+ outer loop
+ vertex 28.65611565455649 197.09325395373193 -62.600000000000065
+ vertex 27.551755827279884 198.26684979780464 -3.000000000000062
+ vertex 28.65611565455649 197.09325395373196 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.4252767351160145 0.9050633671567219 -1.8893488826187048e-16
+ outer loop
+ vertex -17.053630465292567 205.80157985229923 -62.600000000000065
+ vertex -15.595119281244203 206.4869140476616 -3.000000000000062
+ vertex -15.595119281244203 206.48691404766154 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.4252767351160145 0.9050633671567219 -1.8893488826187048e-16
+ outer loop
+ vertex -15.595119281244203 206.4869140476616 -3.000000000000062
+ vertex -17.053630465292567 205.80157985229923 -62.600000000000065
+ vertex -17.053630465292567 205.80157985229926 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.7071067811865392 0.707106781186556 -1.7646604060570652e-16
+ outer loop
+ vertex 23.55862589952126 153.4239969755206 -62.60000000000005
+ vertex 24.060938752631678 153.92630982863102 -3.000000000000051
+ vertex 24.060938752631678 153.92630982863102 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.7071067811865392 0.707106781186556 -1.7646604060570652e-16
+ outer loop
+ vertex 24.060938752631678 153.92630982863102 -3.000000000000051
+ vertex 23.55862589952126 153.4239969755206 -62.60000000000005
+ vertex 23.55862589952126 153.42399697552062 -3.000000000000051
+ endloop
+endfacet
+facet normal 0.9063077870366554 0.4226182617406877 -3.1699543601947416e-18
+ outer loop
+ vertex -24.658474920013315 155.1520379277821 -3.000000000000062
+ vertex -24.358256352634704 154.50821713237315 -62.600000000000065
+ vertex -24.658474920013315 155.15203792778206 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9063077870366554 0.4226182617406877 -3.1699543601947416e-18
+ outer loop
+ vertex -24.358256352634704 154.50821713237315 -62.600000000000065
+ vertex -24.658474920013315 155.1520379277821 -3.000000000000062
+ vertex -24.358256352634704 154.50821713237318 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.425088184824243 0.9051519403519114 -1.889356600540168e-16
+ outer loop
+ vertex 22.373300682659444 152.73315682100917 -62.600000000000065
+ vertex 22.976718595779143 153.01654109490107 -3.000000000000051
+ vertex 22.976718595779143 153.01654109490107 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.425088184824243 0.9051519403519114 -1.889356600540168e-16
+ outer loop
+ vertex 22.976718595779143 153.01654109490107 -3.000000000000051
+ vertex 22.373300682659444 152.73315682100917 -62.600000000000065
+ vertex 22.373300682659444 152.73315682100917 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9063077870366547 0.42261826174068906 -1.4270266531245688e-16
+ outer loop
+ vertex 24.46839463325119 154.50821713237312 -62.60000000000005
+ vertex 24.768613200629805 155.15203792778206 -3.000000000000051
+ vertex 24.768613200629805 155.15203792778206 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9063077870366547 0.42261826174068906 -1.4270266531245688e-16
+ outer loop
+ vertex 24.768613200629805 155.15203792778206 -3.000000000000051
+ vertex 24.46839463325119 154.50821713237312 -62.60000000000005
+ vertex 24.46839463325119 154.50821713237312 -3.000000000000051
+ endloop
+endfacet
+facet normal 0.42261826174069567 0.9063077870366518 -1.2387983536035123e-16
+ outer loop
+ vertex -22.866580315162654 153.01654109490113 -62.600000000000065
+ vertex -22.22275951975374 152.71632252752252 -3.000000000000062
+ vertex -22.22275951975374 152.7163225275225 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.42261826174069567 0.9063077870366518 -1.2387983536035123e-16
+ outer loop
+ vertex -22.22275951975374 152.71632252752252 -3.000000000000062
+ vertex -22.866580315162654 153.01654109490113 -62.600000000000065
+ vertex -22.866580315162654 153.01654109490113 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8191520442889946 0.5735764363510423 -1.6204619883521905e-16
+ outer loop
+ vertex 24.060938752631678 153.92630982863102 -62.60000000000005
+ vertex 24.46839463325119 154.50821713237312 -3.000000000000051
+ vertex 24.46839463325119 154.50821713237312 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.8191520442889946 0.5735764363510423 -1.6204619883521905e-16
+ outer loop
+ vertex 24.46839463325119 154.50821713237312 -3.000000000000051
+ vertex 24.060938752631678 153.92630982863102 -62.60000000000005
+ vertex 24.060938752631678 153.92630982863102 -3.000000000000051
+ endloop
+endfacet
+facet normal -0.09394352563205821 0.9955775278660216 -1.790504190202133e-16
+ outer loop
+ vertex 20.939051234375828 152.47054977096982 -62.600000000000044
+ vertex 21.640128958283878 152.5367040495494 -3.000000000000062
+ vertex 21.640128958283878 152.5367040495494 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.09394352563205821 0.9955775278660216 -1.790504190202133e-16
+ outer loop
+ vertex 21.640128958283878 152.5367040495494 -3.000000000000062
+ vertex 20.939051234375828 152.47054977096982 -62.600000000000044
+ vertex 20.939051234375828 152.47054977096982 -3.000000000000051
+ endloop
+endfacet
+facet normal -0.9659258262890669 -0.2588190451025263 -2.968816052123315e-17
+ outer loop
+ vertex 24.95247246551566 157.25355894177457 -62.60000000000005
+ vertex 24.768613200629805 157.93973105977085 -3.000000000000051
+ vertex 24.768613200629805 157.93973105977085 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9659258262890669 -0.2588190451025263 -2.968816052123315e-17
+ outer loop
+ vertex 24.768613200629805 157.93973105977085 -3.000000000000051
+ vertex 24.95247246551566 157.25355894177457 -62.60000000000005
+ vertex 24.95247246551566 157.2535589417746 -3.000000000000051
+ endloop
+endfacet
+facet normal 0.996194698091746 -0.08715574274765302 9.172724251549008e-17
+ outer loop
+ vertex -24.84233418489917 157.2535589417746 -3.000000000000062
+ vertex -24.90424767656597 156.54588449377647 -62.600000000000065
+ vertex -24.84233418489917 157.2535589417746 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.996194698091746 -0.08715574274765302 9.172724251549008e-17
+ outer loop
+ vertex -24.90424767656597 156.54588449377647 -62.600000000000065
+ vertex -24.84233418489917 157.2535589417746 -3.000000000000062
+ vertex -24.90424767656597 156.5458844937765 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.25097753115913946 0.9679929126048719 -1.8637807733403903e-16
+ outer loop
+ vertex 21.640128958283878 152.5367040495494 -62.600000000000065
+ vertex 22.332897800370226 152.71632252752246 -3.000000000000051
+ vertex 22.332897800370226 152.71632252752246 -62.600000000000044
+ endloop
+endfacet
+facet normal -0.25097753115913946 0.9679929126048719 -1.8637807733403903e-16
+ outer loop
+ vertex 22.332897800370226 152.71632252752246 -3.000000000000051
+ vertex 21.640128958283878 152.5367040495494 -62.600000000000065
+ vertex 21.640128958283878 152.5367040495494 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9961946980917462 -0.08715574274765149 -6.164421566816321e-17
+ outer loop
+ vertex 25.01438595718246 156.54588449377644 -62.60000000000005
+ vertex 24.95247246551566 157.2535589417746 -3.000000000000051
+ vertex 24.95247246551566 157.25355894177457 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9961946980917462 -0.08715574274765149 -6.164421566816321e-17
+ outer loop
+ vertex 24.95247246551566 157.2535589417746 -3.000000000000051
+ vertex 25.01438595718246 156.54588449377644 -62.60000000000005
+ vertex 25.01438595718246 156.54588449377644 -3.000000000000051
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.5 1.5295647765012081e-16
+ outer loop
+ vertex -11.660839120111838 180.57612362681 -3.000000000000062
+ vertex -24.358256352634704 158.5835518551798 -62.600000000000065
+ vertex -11.660839120111838 180.57612362681 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.5 1.5295647765012081e-16
+ outer loop
+ vertex -24.358256352634704 158.5835518551798 -62.600000000000065
+ vertex -11.660839120111838 180.57612362681 -3.000000000000062
+ vertex -24.358256352634704 158.5835518551798 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9659258262890664 0.2588190451025278 -1.1902318351521207e-16
+ outer loop
+ vertex 24.768613200629805 155.15203792778206 -62.60000000000005
+ vertex 24.95247246551566 155.8382100457783 -3.000000000000051
+ vertex 24.95247246551566 155.8382100457783 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9659258262890664 0.2588190451025278 -1.1902318351521207e-16
+ outer loop
+ vertex 24.95247246551566 155.8382100457783 -3.000000000000051
+ vertex 24.768613200629805 155.15203792778206 -62.60000000000005
+ vertex 24.768613200629805 155.15203792778206 -3.000000000000051
+ endloop
+endfacet
+facet normal -0.3846106969126948 0.9230788762724078 -1.8891362409815978e-16
+ outer loop
+ vertex 22.332897800370226 152.71632252752246 -62.600000000000044
+ vertex 22.373300682659444 152.73315682100917 -3.000000000000062
+ vertex 22.373300682659444 152.73315682100917 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.3846106969126948 0.9230788762724078 -1.8891362409815978e-16
+ outer loop
+ vertex 22.373300682659444 152.73315682100917 -3.000000000000062
+ vertex 22.332897800370226 152.71632252752246 -62.600000000000044
+ vertex 22.332897800370226 152.71632252752246 -3.000000000000051
+ endloop
+endfacet
+facet normal 0.7071067811865441 0.707106781186551 -6.760178110917366e-17
+ outer loop
+ vertex -23.95080047201519 153.92630982863105 -62.600000000000065
+ vertex -23.448487618904775 153.42399697552065 -3.000000000000062
+ vertex -23.448487618904775 153.42399697552065 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.7071067811865441 0.707106781186551 -6.760178110917366e-17
+ outer loop
+ vertex -23.448487618904775 153.42399697552065 -3.000000000000062
+ vertex -23.95080047201519 153.92630982863105 -62.600000000000065
+ vertex -23.95080047201519 153.92630982863105 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.25881904510252435 0.9659258262890675 -1.4677788008447106e-16
+ outer loop
+ vertex -22.22275951975374 152.7163225275225 -62.600000000000065
+ vertex -21.53658740175749 152.53246326263667 -3.000000000000062
+ vertex -21.53658740175749 152.53246326263664 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.25881904510252435 0.9659258262890675 -1.4677788008447106e-16
+ outer loop
+ vertex -21.53658740175749 152.53246326263667 -3.000000000000062
+ vertex -22.22275951975374 152.7163225275225 -62.600000000000065
+ vertex -22.22275951975374 152.71632252752252 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.996194698091746 0.08715574274765302 -9.172724251549008e-17
+ outer loop
+ vertex 24.95247246551566 155.8382100457783 -62.60000000000005
+ vertex 25.01438595718246 156.54588449377644 -3.000000000000051
+ vertex 25.01438595718246 156.54588449377644 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.996194698091746 0.08715574274765302 -9.172724251549008e-17
+ outer loop
+ vertex 25.01438595718246 156.54588449377644 -3.000000000000051
+ vertex 24.95247246551566 155.8382100457783 -62.60000000000005
+ vertex 24.95247246551566 155.8382100457783 -3.000000000000051
+ endloop
+endfacet
+facet normal -0.596902427405206 0.8023138364491621 -1.8441368268833016e-16
+ outer loop
+ vertex 23.06122021535224 153.05393896729822 -62.600000000000065
+ vertex 23.55862589952126 153.42399697552062 -3.000000000000051
+ vertex 23.55862589952126 153.4239969755206 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.596902427405206 0.8023138364491621 -1.8441368268833016e-16
+ outer loop
+ vertex 23.55862589952126 153.42399697552062 -3.000000000000051
+ vertex 23.06122021535224 153.05393896729822 -62.600000000000065
+ vertex 23.06122021535224 153.05393896729822 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9063077870366554 -0.4226182617406877 3.1699543601947416e-18
+ outer loop
+ vertex 24.768613200629805 157.93973105977085 -62.60000000000005
+ vertex 24.468394633251194 158.58355185517976 -3.000000000000051
+ vertex 24.468394633251194 158.58355185517976 -62.60000000000005
+ endloop
+endfacet
+facet normal -0.9063077870366554 -0.4226182617406877 3.1699543601947416e-18
+ outer loop
+ vertex 24.468394633251194 158.58355185517976 -3.000000000000051
+ vertex 24.768613200629805 157.93973105977085 -62.60000000000005
+ vertex 24.768613200629805 157.93973105977085 -3.000000000000051
+ endloop
+endfacet
+facet normal -0.40470653839706777 0.9144466183319083 -1.8897080252742166e-16
+ outer loop
+ vertex 22.976718595779143 153.01654109490107 -62.60000000000005
+ vertex 23.06122021535224 153.05393896729822 -3.000000000000062
+ vertex 23.06122021535224 153.05393896729822 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.40470653839706777 0.9144466183319083 -1.8897080252742166e-16
+ outer loop
+ vertex 23.06122021535224 153.05393896729822 -3.000000000000062
+ vertex 22.976718595779143 153.01654109490107 -62.60000000000005
+ vertex 22.976718595779143 153.01654109490107 -3.000000000000051
+ endloop
+endfacet
+facet normal 0.9063077870366547 -0.42261826174068906 1.4270266531245688e-16
+ outer loop
+ vertex -24.358256352634704 158.5835518551798 -3.000000000000062
+ vertex -24.658474920013315 157.93973105977085 -62.600000000000065
+ vertex -24.358256352634704 158.5835518551798 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.9063077870366547 -0.42261826174068906 1.4270266531245688e-16
+ outer loop
+ vertex -24.658474920013315 157.93973105977085 -62.600000000000065
+ vertex -24.358256352634704 158.5835518551798 -3.000000000000062
+ vertex -24.658474920013315 157.93973105977088 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.6684424840618581 0.743763837183022 -1.7981606344395133e-16
+ outer loop
+ vertex -26.28914091006915 199.39323136522827 -62.600000000000065
+ vertex -25.09056419799865 200.470427586262 -3.000000000000062
+ vertex -25.09056419799865 200.470427586262 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.6684424840618581 0.743763837183022 -1.7981606344395133e-16
+ outer loop
+ vertex -25.09056419799865 200.470427586262 -3.000000000000062
+ vertex -26.28914091006915 199.39323136522827 -62.600000000000065
+ vertex -26.28914091006915 199.39323136522827 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.78298662241806 0.6220385431099575 -1.67625921142338e-16
+ outer loop
+ vertex -30.60270404808994 194.6127132252033 -3.000000000000062
+ vertex -29.600287858287494 195.87449752362713 -62.600000000000065
+ vertex -30.60270404808994 194.61271322520327 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.78298662241806 0.6220385431099575 -1.67625921142338e-16
+ outer loop
+ vertex -29.600287858287494 195.87449752362713 -62.600000000000065
+ vertex -30.60270404808994 194.6127132252033 -3.000000000000062
+ vertex -29.600287858287494 195.87449752362716 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.6989639196910225 0.715156933106407 -1.7722852548447556e-16
+ outer loop
+ vertex -27.44161754666337 198.2668497978047 -62.600000000000065
+ vertex -26.28914091006915 199.39323136522827 -3.000000000000062
+ vertex -26.28914091006915 199.39323136522827 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.6989639196910225 0.715156933106407 -1.7722852548447556e-16
+ outer loop
+ vertex -26.28914091006915 199.39323136522827 -3.000000000000062
+ vertex -27.44161754666337 198.2668497978047 -62.600000000000065
+ vertex -27.44161754666337 198.26684979780472 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -34.42457913819862 141.14816934519493 -41.30000000000007
+ vertex -39.568916705496 132.2379153073505 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -34.42457913819862 141.14816934519493 -41.30000000000007
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -34.27472850444166 141.40771825640834 -40.57645713530763
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -34.27472850444166 141.40771825640834 -40.57645713530763
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -39.568916705496 132.2379153073505 -62.600000000000065
+ vertex -34.42457913819862 141.14816934519493 -41.30000000000007
+ vertex -34.662957072095445 140.7352866522823 -41.921320343559714
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -39.568916705496 132.2379153073505 -62.600000000000065
+ vertex -34.662957072095445 140.7352866522823 -41.921320343559714
+ vertex -34.97361724387526 140.19720745087156 -42.398076211353384
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -39.568916705496 132.2379153073505 -62.600000000000065
+ vertex -34.97361724387526 140.19720745087156 -42.398076211353384
+ vertex -35.33538867622146 139.57060094932095 -42.69777747886727
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -39.568916705496 132.2379153073505 -62.600000000000065
+ vertex -35.33538867622146 139.57060094932095 -42.69777747886727
+ vertex -35.72361724387527 138.8981693451949 -42.80000000000007
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -34.27472850444166 141.40771825640834 -40.57645713530763
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -34.22361724387527 141.49624555654825 -39.80000000000007
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -34.22361724387527 141.49624555654825 -39.80000000000007
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -34.22361724387527 141.49624555654825 -25.800000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -34.22361724387527 141.49624555654825 -25.800000000000065
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -34.27472850444166 141.40771825640834 -25.0235428646925
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -34.27472850444166 141.40771825640834 -25.0235428646925
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -34.42457913819862 141.14816934519493 -24.30000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -34.42457913819862 141.14816934519493 -24.30000000000006
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -34.662957072095445 140.7352866522823 -23.678679656440423
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -34.662957072095445 140.7352866522823 -23.678679656440423
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -34.97361724387526 140.19720745087156 -23.20192378864675
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -34.97361724387526 140.19720745087156 -23.20192378864675
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -35.33538867622149 139.57060094932095 -22.90222252113286
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -35.33538867622149 139.57060094932095 -22.90222252113286
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -35.72361724387527 138.89816934519493 -22.800000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -39.568916705496 132.2379153073505 -62.600000000000065
+ vertex -37.22361724387529 136.30009313384159 -39.80000000000007
+ vertex -39.568916705496 132.2379153073505 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -37.22361724387529 136.30009313384159 -39.80000000000007
+ vertex -39.568916705496 132.2379153073505 -62.600000000000065
+ vertex -37.172505983308895 136.3886204339815 -40.57645713530763
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -37.172505983308895 136.3886204339815 -40.57645713530763
+ vertex -39.568916705496 132.2379153073505 -62.600000000000065
+ vertex -37.02265534955194 136.6481693451949 -41.30000000000007
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -37.02265534955194 136.6481693451949 -41.30000000000007
+ vertex -39.568916705496 132.2379153073505 -62.600000000000065
+ vertex -36.78427741565511 137.06105203810753 -41.921320343559714
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -36.78427741565511 137.06105203810753 -41.921320343559714
+ vertex -39.568916705496 132.2379153073505 -62.600000000000065
+ vertex -36.473617243875275 137.59913123951824 -42.398076211353384
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -36.473617243875275 137.59913123951824 -42.398076211353384
+ vertex -39.568916705496 132.2379153073505 -62.600000000000065
+ vertex -36.111845811529044 138.22573774106888 -42.69777747886727
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -36.111845811529044 138.22573774106888 -42.69777747886727
+ vertex -39.568916705496 132.2379153073505 -62.600000000000065
+ vertex -35.72361724387527 138.8981693451949 -42.80000000000007
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -39.568916705496 132.2379153073505 -3.000000000000062
+ vertex -37.22361724387529 136.30009313384159 -39.80000000000007
+ vertex -37.22361724387527 136.30009313384159 -25.800000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -39.568916705496 132.2379153073505 -3.000000000000062
+ vertex -37.22361724387527 136.30009313384159 -25.800000000000065
+ vertex -37.17250598330887 136.3886204339815 -25.0235428646925
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -39.568916705496 132.2379153073505 -3.000000000000062
+ vertex -37.17250598330887 136.3886204339815 -25.0235428646925
+ vertex -37.02265534955192 136.6481693451949 -24.300000000000068
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -39.568916705496 132.2379153073505 -3.000000000000062
+ vertex -37.02265534955192 136.6481693451949 -24.300000000000068
+ vertex -36.78427741565509 137.06105203810753 -23.678679656440423
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -39.568916705496 132.2379153073505 -3.000000000000062
+ vertex -36.78427741565509 137.06105203810753 -23.678679656440423
+ vertex -36.473617243875275 137.59913123951827 -23.20192378864675
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -39.568916705496 132.2379153073505 -3.000000000000062
+ vertex -36.473617243875275 137.59913123951827 -23.20192378864675
+ vertex -36.111845811529065 138.22573774106888 -22.90222252113286
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -39.568916705496 132.2379153073505 -3.000000000000062
+ vertex -36.111845811529065 138.22573774106888 -22.90222252113286
+ vertex -35.72361724387527 138.89816934519493 -22.800000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844388 -0.4999999999999997 1.5295647765012074e-16
+ outer loop
+ vertex -39.568916705496 132.2379153073505 -3.000000000000062
+ vertex -35.72361724387527 138.89816934519493 -22.800000000000065
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 10.447373985721516 148.1705497709698 -26.800000000000054
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 10.447373985721516 148.1705497709698 -26.800000000000054
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 9.575309223803076 148.1705497709698 -25.4948628518954
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 9.575309223803076 148.1705497709698 -25.4948628518954
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 8.540350514546814 148.1705497709698 -24.314718625761483
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 8.540350514546814 148.1705497709698 -24.314718625761483
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 7.360206288412901 148.1705497709698 -23.279759916505228
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 7.360206288412901 148.1705497709698 -23.279759916505228
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 6.0550691403082295 148.1705497709698 -22.40769515458679
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 6.0550691403082295 148.1705497709698 -22.40769515458679
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 10.447373985721516 148.1705497709698 -26.800000000000054
+ vertex 11.141623530443681 148.1705497709698 -28.207798811618975
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 11.141623530443681 148.1705497709698 -28.207798811618975
+ vertex 11.646179055777065 148.1705497709698 -29.6941714587698
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 11.646179055777065 148.1705497709698 -29.6941714587698
+ vertex 11.952407476793969 148.1705497709698 -31.233685693359433
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 11.952407476793969 148.1705497709698 -31.233685693359433
+ vertex 12.055069140308246 148.1705497709698 -32.800000000000054
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 6.0550691403082295 148.1705497709698 -22.40769515458679
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex 4.6472703286893084 148.1705497709698 -21.71344560986461
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 4.6472703286893084 148.1705497709698 -21.71344560986461
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex 3.160897681538491 148.1705497709698 -21.208890084531234
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 3.160897681538491 148.1705497709698 -21.208890084531234
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex 1.621383446948867 148.1705497709698 -20.90266166351433
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 1.621383446948867 148.1705497709698 -20.90266166351433
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex 0.055069140308240346 148.1705497709698 -20.80000000000005
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 0.055069140308240346 148.1705497709698 -20.80000000000005
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -1.5112451663323863 148.17054977096984 -20.90266166351433
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -1.5112451663323863 148.17054977096984 -20.90266166351433
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -3.0507594009220105 148.17054977096984 -21.208890084531237
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -3.0507594009220105 148.17054977096984 -21.208890084531237
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -4.53713204807285 148.17054977096984 -21.71344560986461
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -4.53713204807285 148.17054977096984 -21.71344560986461
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -5.944930859691771 148.17054977096984 -22.407695154586794
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -5.944930859691771 148.17054977096984 -22.407695154586794
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -7.250068007796415 148.17054977096984 -23.279759916505235
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -7.250068007796415 148.17054977096984 -23.279759916505235
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -8.430212233930328 148.17054977096984 -24.314718625761483
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -8.430212233930328 148.17054977096984 -24.314718625761483
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -9.46517094318659 148.17054977096984 -25.494862851895416
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -9.46517094318659 148.17054977096984 -25.494862851895416
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -10.33723570510503 148.17054977096984 -26.800000000000058
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -10.33723570510503 148.17054977096984 -26.800000000000058
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -11.031485249827195 148.17054977096984 -28.207798811618986
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -11.031485249827195 148.17054977096984 -28.207798811618986
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -11.53604077516058 148.17054977096984 -29.69417145876981
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -11.53604077516058 148.17054977096984 -29.69417145876981
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -11.842269196177483 148.17054977096984 -31.233685693359437
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -11.842269196177483 148.17054977096984 -31.233685693359437
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -11.94493085969176 148.17054977096984 -32.800000000000054
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 6.055069140308252 148.1705497709698 -43.19230484541332
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 6.055069140308252 148.1705497709698 -43.19230484541332
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 7.360206288412901 148.1705497709698 -42.32024008349487
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 7.360206288412901 148.1705497709698 -42.32024008349487
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 8.540350514546814 148.1705497709698 -41.28528137423862
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 8.540350514546814 148.1705497709698 -41.28528137423862
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 9.575309223803076 148.1705497709698 -40.105137148104696
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 9.575309223803076 148.1705497709698 -40.105137148104696
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 10.447373985721516 148.1705497709698 -38.800000000000054
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 10.447373985721516 148.1705497709698 -38.800000000000054
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 11.141623530443681 148.1705497709698 -37.39220118838113
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 11.141623530443681 148.1705497709698 -37.39220118838113
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 11.646179055777065 148.1705497709698 -35.9058285412303
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 11.646179055777065 148.1705497709698 -35.9058285412303
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 11.952407476793969 148.1705497709698 -34.36631430664067
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex 11.952407476793969 148.1705497709698 -34.36631430664067
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 12.055069140308246 148.1705497709698 -32.800000000000054
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex 6.055069140308252 148.1705497709698 -43.19230484541332
+ vertex 4.6472703286893084 148.1705497709698 -43.8865543901355
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex 4.6472703286893084 148.1705497709698 -43.8865543901355
+ vertex 3.160897681538491 148.1705497709698 -44.391109915468874
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex 3.160897681538491 148.1705497709698 -44.391109915468874
+ vertex 1.621383446948867 148.1705497709698 -44.69733833648578
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex 1.621383446948867 148.1705497709698 -44.69733833648578
+ vertex 0.055069140308240346 148.1705497709698 -44.800000000000054
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex 0.055069140308240346 148.1705497709698 -44.800000000000054
+ vertex -1.5112451663323863 148.17054977096984 -44.69733833648578
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -1.5112451663323863 148.17054977096984 -44.69733833648578
+ vertex -3.0507594009220105 148.17054977096984 -44.391109915468874
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -3.0507594009220105 148.17054977096984 -44.391109915468874
+ vertex -4.537132048072828 148.17054977096984 -43.8865543901355
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -4.537132048072828 148.17054977096984 -43.8865543901355
+ vertex -5.944930859691748 148.17054977096984 -43.192304845413325
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -5.944930859691748 148.17054977096984 -43.192304845413325
+ vertex -7.250068007796415 148.17054977096984 -42.32024008349488
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -7.250068007796415 148.17054977096984 -42.32024008349488
+ vertex -8.430212233930328 148.17054977096984 -41.285281374238636
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -8.430212233930328 148.17054977096984 -41.285281374238636
+ vertex -9.465170943186568 148.17054977096984 -40.10513714810471
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -9.465170943186568 148.17054977096984 -40.10513714810471
+ vertex -10.33723570510503 148.17054977096984 -38.80000000000006
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -10.33723570510503 148.17054977096984 -38.80000000000006
+ vertex -11.031485249827195 148.17054977096984 -37.392201188381144
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -11.031485249827195 148.17054977096984 -37.392201188381144
+ vertex -11.53604077516058 148.17054977096984 -35.905828541230306
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -11.53604077516058 148.17054977096984 -35.905828541230306
+ vertex -11.842269196177483 148.17054977096984 -34.36631430664068
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -11.842269196177483 148.17054977096984 -34.36631430664068
+ vertex -11.94493085969176 148.17054977096984 -32.800000000000054
+ endloop
+endfacet
+facet normal -5.551115123125784e-16 -1.0 1.7258201180401984e-16
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -11.94493085969176 148.17054977096984 -32.800000000000054
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.7282622292749814 0.685298566620006 -1.7433085302539796e-16
+ outer loop
+ vertex -28.545977373939976 197.09325395373202 -3.000000000000062
+ vertex -27.44161754666337 198.2668497978047 -62.600000000000065
+ vertex -28.545977373939976 197.09325395373202 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.7282622292749814 0.685298566620006 -1.7433085302539796e-16
+ outer loop
+ vertex -27.44161754666337 198.2668497978047 -62.600000000000065
+ vertex -28.545977373939976 197.09325395373202 -3.000000000000062
+ vertex -27.44161754666337 198.26684979780472 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.6367513322442928 0.7710692192566879 -1.8208893893752738e-16
+ outer loop
+ vertex -25.09056419799865 200.470427586262 -62.600000000000065
+ vertex -23.847984815414293 201.49655346124194 -3.000000000000062
+ vertex -23.847984815414293 201.49655346124194 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.6367513322442928 0.7710692192566879 -1.8208893893752738e-16
+ outer loop
+ vertex -23.847984815414293 201.49655346124194 -3.000000000000062
+ vertex -25.09056419799865 200.470427586262 -62.600000000000065
+ vertex -25.09056419799865 200.470427586262 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.570083656934367 0.821586650388344 -1.8567535078147368e-16
+ outer loop
+ vertex -22.563577168123395 202.46981335916627 -62.600000000000065
+ vertex -21.23958885775712 203.38850415989336 -3.000000000000062
+ vertex -21.23958885775712 203.38850415989336 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.570083656934367 0.821586650388344 -1.8567535078147368e-16
+ outer loop
+ vertex -21.23958885775712 203.38850415989336 -3.000000000000062
+ vertex -22.563577168123395 202.46981335916627 -62.600000000000065
+ vertex -22.563577168123395 202.4698133591663 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.7562861433211027 0.654240987267301 -1.711281167414057e-16
+ outer loop
+ vertex -29.600287858287494 195.87449752362716 -3.000000000000062
+ vertex -28.545977373939976 197.09325395373202 -62.600000000000065
+ vertex -29.600287858287494 195.87449752362713 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.7562861433211027 0.654240987267301 -1.711281167414057e-16
+ outer loop
+ vertex -28.545977373939976 197.09325395373202 -62.600000000000065
+ vertex -29.600287858287494 195.87449752362716 -3.000000000000062
+ vertex -28.545977373939976 197.09325395373202 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -43.03301832063373 134.23791530735053 -62.600000000000065
+ vertex -35.79653790411557 146.77186705673725 -55.53185165257819
+ vertex -15.387718859012988 182.12097856533416 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -35.79653790411557 146.77186705673725 -55.53185165257819
+ vertex -43.03301832063373 134.23791530735053 -62.600000000000065
+ vertex -36.03771885901303 146.35412938903684 -55.332050807568926
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -36.03771885901303 146.35412938903684 -55.332050807568926
+ vertex -43.03301832063373 134.23791530735053 -62.600000000000065
+ vertex -36.2448256401996 145.9954099214297 -55.01421356237315
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -36.2448256401996 145.9954099214297 -55.01421356237315
+ vertex -43.03301832063373 134.23791530735053 -62.600000000000065
+ vertex -36.40374426279749 145.72015479282126 -54.600000000000044
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -36.40374426279749 145.72015479282126 -54.600000000000044
+ vertex -43.03301832063373 134.23791530735053 -62.600000000000065
+ vertex -40.486756964689654 138.6481693451949 -41.30000000000007
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -40.486756964689654 138.6481693451949 -41.30000000000007
+ vertex -43.03301832063373 134.23791530735053 -62.600000000000065
+ vertex -40.6366075984466 138.3886204339815 -40.57645713530763
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -40.6366075984466 138.3886204339815 -40.57645713530763
+ vertex -43.03301832063373 134.23791530735053 -62.600000000000065
+ vertex -40.687718859012996 138.30009313384159 -39.80000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -40.687718859012996 138.30009313384159 -39.80000000000006
+ vertex -43.03301832063373 134.23791530735053 -62.600000000000065
+ vertex -43.03301832063373 134.23791530735053 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533416 -62.600000000000065
+ vertex -35.79653790411557 146.77186705673725 -55.53185165257819
+ vertex -35.537718859013054 147.22015479282126 -55.60000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533416 -62.600000000000065
+ vertex -35.537718859013054 147.22015479282126 -55.60000000000006
+ vertex -23.13771885901301 168.69758480667537 -55.600000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -36.40374426279749 145.72015479282126 -54.600000000000044
+ vertex -40.486756964689654 138.6481693451949 -41.30000000000007
+ vertex -36.50364468530211 145.54712218534567 -54.11763809020509
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -36.50364468530211 145.54712218534567 -54.11763809020509
+ vertex -40.486756964689654 138.6481693451949 -41.30000000000007
+ vertex -36.537718859013054 145.4881039852524 -53.60000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -36.537718859013054 145.4881039852524 -53.60000000000005
+ vertex -40.486756964689654 138.6481693451949 -41.30000000000007
+ vertex -36.537718859013054 145.4881039852524 -51.600000000000044
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -36.537718859013054 145.4881039852524 -51.600000000000044
+ vertex -40.486756964689654 138.6481693451949 -41.30000000000007
+ vertex -40.248379030792826 139.0610520381075 -41.921320343559714
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -36.537718859013054 145.4881039852524 -51.600000000000044
+ vertex -40.248379030792826 139.0610520381075 -41.921320343559714
+ vertex -36.50364468530209 145.54712218534567 -51.082361909795
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -36.50364468530209 145.54712218534567 -51.082361909795
+ vertex -40.248379030792826 139.0610520381075 -41.921320343559714
+ vertex -36.40374426279749 145.72015479282126 -50.60000000000003
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -36.40374426279749 145.72015479282126 -50.60000000000003
+ vertex -40.248379030792826 139.0610520381075 -41.921320343559714
+ vertex -36.2448256401996 145.9954099214297 -50.185786437626945
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -36.2448256401996 145.9954099214297 -50.185786437626945
+ vertex -40.248379030792826 139.0610520381075 -41.921320343559714
+ vertex -36.03771885901303 146.35412938903687 -49.86794919243116
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -36.03771885901303 146.35412938903687 -49.86794919243116
+ vertex -40.248379030792826 139.0610520381075 -41.921320343559714
+ vertex -35.79653790411557 146.77186705673725 -49.6681483474219
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -35.79653790411557 146.77186705673725 -49.6681483474219
+ vertex -40.248379030792826 139.0610520381075 -41.921320343559714
+ vertex -35.537718859013054 147.2201547928213 -49.60000000000003
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -35.537718859013054 147.2201547928213 -49.60000000000003
+ vertex -40.248379030792826 139.0610520381075 -41.921320343559714
+ vertex -39.93771885901299 139.59913123951824 -42.398076211353384
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -35.537718859013054 147.2201547928213 -49.60000000000003
+ vertex -39.93771885901299 139.59913123951824 -42.398076211353384
+ vertex -39.57594742666676 140.22573774106885 -42.697777478867266
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -35.537718859013054 147.2201547928213 -49.60000000000003
+ vertex -39.57594742666676 140.22573774106885 -42.697777478867266
+ vertex -39.18771885901298 140.8981693451949 -42.80000000000007
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -40.687718859012996 138.30009313384159 -39.80000000000006
+ vertex -43.03301832063373 134.23791530735053 -3.000000000000062
+ vertex -40.687718859012975 138.30009313384159 -25.800000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -40.687718859012975 138.30009313384159 -25.800000000000065
+ vertex -43.03301832063373 134.23791530735053 -3.000000000000062
+ vertex -40.63660759844658 138.38862043398146 -25.0235428646925
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -40.63660759844658 138.38862043398146 -25.0235428646925
+ vertex -43.03301832063373 134.23791530735053 -3.000000000000062
+ vertex -40.486756964689626 138.6481693451949 -24.300000000000068
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -40.486756964689626 138.6481693451949 -24.300000000000068
+ vertex -43.03301832063373 134.23791530735053 -3.000000000000062
+ vertex -40.248379030792805 139.0610520381075 -23.678679656440423
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -40.248379030792805 139.0610520381075 -23.678679656440423
+ vertex -43.03301832063373 134.23791530735053 -3.000000000000062
+ vertex -39.93771885901299 139.59913123951824 -23.20192378864675
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -39.93771885901299 139.59913123951824 -23.20192378864675
+ vertex -43.03301832063373 134.23791530735053 -3.000000000000062
+ vertex -39.57594742666678 140.22573774106885 -22.90222252113286
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -39.57594742666678 140.22573774106885 -22.90222252113286
+ vertex -43.03301832063373 134.23791530735053 -3.000000000000062
+ vertex -39.18771885901298 140.8981693451949 -22.800000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -39.18771885901298 140.8981693451949 -22.800000000000065
+ vertex -43.03301832063373 134.23791530735053 -3.000000000000062
+ vertex -36.244825640199736 145.99540992142974 -15.41421356237314
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -39.18771885901298 140.8981693451949 -22.800000000000065
+ vertex -36.244825640199736 145.99540992142974 -15.41421356237314
+ vertex -36.03771885901319 146.3541293890369 -15.732050807568926
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -39.18771885901298 140.8981693451949 -22.800000000000065
+ vertex -36.03771885901319 146.3541293890369 -15.732050807568926
+ vertex -35.79653790411572 146.7718670567373 -15.931851652578185
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -39.18771885901298 140.8981693451949 -22.800000000000065
+ vertex -35.79653790411572 146.7718670567373 -15.931851652578185
+ vertex -35.53771885901319 147.22015479282135 -16.00000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -39.18771885901298 140.8981693451949 -22.800000000000065
+ vertex -35.53771885901319 147.22015479282135 -16.00000000000005
+ vertex -23.137718859013145 168.6975848066754 -16.000000000000068
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -36.244825640199736 145.99540992142974 -15.41421356237314
+ vertex -43.03301832063373 134.23791530735053 -3.000000000000062
+ vertex -36.40374426279762 145.72015479282135 -15.000000000000046
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -36.40374426279762 145.72015479282135 -15.000000000000046
+ vertex -43.03301832063373 134.23791530735053 -3.000000000000062
+ vertex -36.50364468530227 145.54712218534573 -14.517638090205088
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -36.50364468530227 145.54712218534573 -14.517638090205088
+ vertex -43.03301832063373 134.23791530735053 -3.000000000000062
+ vertex -36.53771885901319 145.48810398525248 -14.000000000000048
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -36.53771885901319 145.48810398525248 -14.000000000000048
+ vertex -43.03301832063373 134.23791530735053 -3.000000000000062
+ vertex -36.53771885901319 145.48810398525248 -12.000000000000034
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -36.53771885901319 145.48810398525248 -12.000000000000034
+ vertex -43.03301832063373 134.23791530735053 -3.000000000000062
+ vertex -36.50364468530225 145.54712218534573 -11.482361909795
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -36.50364468530225 145.54712218534573 -11.482361909795
+ vertex -43.03301832063373 134.23791530735053 -3.000000000000062
+ vertex -36.40374426279762 145.72015479282135 -11.000000000000036
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -36.40374426279762 145.72015479282135 -11.000000000000036
+ vertex -43.03301832063373 134.23791530735053 -3.000000000000062
+ vertex -36.244825640199736 145.99540992142974 -10.585786437626947
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -36.244825640199736 145.99540992142974 -10.585786437626947
+ vertex -43.03301832063373 134.23791530735053 -3.000000000000062
+ vertex -36.03771885901319 146.3541293890369 -10.267949192431168
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -36.03771885901319 146.3541293890369 -10.267949192431168
+ vertex -43.03301832063373 134.23791530735053 -3.000000000000062
+ vertex -35.79653790411572 146.77186705673734 -10.068148347421902
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -35.79653790411572 146.77186705673734 -10.068148347421902
+ vertex -43.03301832063373 134.23791530735053 -3.000000000000062
+ vertex -35.53771885901319 147.22015479282135 -10.000000000000037
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533416 -62.600000000000065
+ vertex -22.171793032723926 170.37061741415096 -54.117638090205105
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -22.171793032723926 170.37061741415096 -54.117638090205105
+ vertex -15.387718859012988 182.12097856533416 -62.600000000000065
+ vertex -22.271693455228576 170.19758480667537 -54.60000000000007
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -22.271693455228576 170.19758480667537 -54.60000000000007
+ vertex -15.387718859012988 182.12097856533416 -62.600000000000065
+ vertex -22.43061207782646 169.92232967806692 -55.01421356237316
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -22.43061207782646 169.92232967806692 -55.01421356237316
+ vertex -15.387718859012988 182.12097856533416 -62.600000000000065
+ vertex -22.63771885901299 169.56361021045976 -55.33205080756895
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -22.63771885901299 169.56361021045976 -55.33205080756895
+ vertex -15.387718859012988 182.12097856533416 -62.600000000000065
+ vertex -22.878899813910476 169.14587254275938 -55.531851652578204
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -22.878899813910476 169.14587254275938 -55.531851652578204
+ vertex -15.387718859012988 182.12097856533416 -62.600000000000065
+ vertex -23.13771885901301 168.69758480667537 -55.600000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -22.171793032723926 170.37061741415096 -54.117638090205105
+ vertex -22.13771885901301 170.42963561424423 -53.60000000000007
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -22.13771885901301 170.42963561424423 -53.60000000000007
+ vertex -22.13771885901301 170.42963561424423 -51.600000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -22.13771885901301 170.42963561424423 -51.600000000000065
+ vertex -22.171793032723926 170.37061741415096 -51.08236190979502
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -22.171793032723926 170.37061741415096 -51.08236190979502
+ vertex -22.271693455228576 170.19758480667537 -50.60000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -22.271693455228576 170.19758480667537 -50.60000000000005
+ vertex -22.43061207782646 169.92232967806694 -50.185786437626966
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -22.43061207782646 169.92232967806694 -50.185786437626966
+ vertex -22.63771885901299 169.5636102104598 -49.86794919243118
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -22.63771885901299 169.5636102104598 -49.86794919243118
+ vertex -22.878899813910476 169.14587254275938 -49.66814834742192
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -22.878899813910476 169.14587254275938 -49.66814834742192
+ vertex -23.13771885901301 168.69758480667537 -49.60000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -23.13771885901301 168.69758480667537 -49.60000000000006
+ vertex -35.537718859013054 147.2201547928213 -49.60000000000003
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -35.537718859013054 147.2201547928213 -49.60000000000003
+ vertex -22.430612077826595 169.922329678067 -15.414213562373158
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -22.430612077826595 169.922329678067 -15.414213562373158
+ vertex -35.537718859013054 147.2201547928213 -49.60000000000003
+ vertex -38.127058687233145 142.7352866522823 -41.921320343559714
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -38.127058687233145 142.7352866522823 -41.921320343559714
+ vertex -35.537718859013054 147.2201547928213 -49.60000000000003
+ vertex -38.43771885901297 142.19720745087156 -42.39807621135338
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -38.43771885901297 142.19720745087156 -42.39807621135338
+ vertex -35.537718859013054 147.2201547928213 -49.60000000000003
+ vertex -38.79949029135918 141.57060094932095 -42.697777478867266
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -38.79949029135918 141.57060094932095 -42.697777478867266
+ vertex -35.537718859013054 147.2201547928213 -49.60000000000003
+ vertex -39.18771885901298 140.8981693451949 -42.80000000000007
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -22.430612077826595 169.922329678067 -15.414213562373158
+ vertex -38.127058687233145 142.7352866522823 -41.921320343559714
+ vertex -37.88868075333632 143.1481693451949 -41.30000000000007
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -22.430612077826595 169.922329678067 -15.414213562373158
+ vertex -37.88868075333632 143.1481693451949 -41.30000000000007
+ vertex -37.73883011957936 143.40771825640834 -40.57645713530763
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -22.430612077826595 169.922329678067 -15.414213562373158
+ vertex -37.73883011957936 143.40771825640834 -40.57645713530763
+ vertex -37.68771885901297 143.49624555654822 -39.80000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -22.430612077826595 169.922329678067 -15.414213562373158
+ vertex -37.68771885901297 143.49624555654822 -39.80000000000006
+ vertex -22.637718859013166 169.56361021045984 -15.732050807568942
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -22.637718859013166 169.56361021045984 -15.732050807568942
+ vertex -37.68771885901297 143.49624555654822 -39.80000000000006
+ vertex -22.878899813910653 169.14587254275943 -15.931851652578203
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -22.878899813910653 169.14587254275943 -15.931851652578203
+ vertex -37.68771885901297 143.49624555654822 -39.80000000000006
+ vertex -37.68771885901297 143.49624555654825 -25.800000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -22.878899813910653 169.14587254275943 -15.931851652578203
+ vertex -37.68771885901297 143.49624555654825 -25.800000000000065
+ vertex -37.73883011957936 143.40771825640834 -25.0235428646925
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -22.878899813910653 169.14587254275943 -15.931851652578203
+ vertex -37.73883011957936 143.40771825640834 -25.0235428646925
+ vertex -37.88868075333632 143.1481693451949 -24.30000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -22.878899813910653 169.14587254275943 -15.931851652578203
+ vertex -37.88868075333632 143.1481693451949 -24.30000000000006
+ vertex -38.127058687233145 142.7352866522823 -23.678679656440423
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -22.878899813910653 169.14587254275943 -15.931851652578203
+ vertex -38.127058687233145 142.7352866522823 -23.678679656440423
+ vertex -38.43771885901297 142.19720745087156 -23.20192378864675
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -22.878899813910653 169.14587254275943 -15.931851652578203
+ vertex -38.43771885901297 142.19720745087156 -23.20192378864675
+ vertex -38.7994902913592 141.57060094932095 -22.90222252113286
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -22.878899813910653 169.14587254275943 -15.931851652578203
+ vertex -38.7994902913592 141.57060094932095 -22.90222252113286
+ vertex -39.18771885901298 140.8981693451949 -22.800000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -22.878899813910653 169.14587254275943 -15.931851652578203
+ vertex -39.18771885901298 140.8981693451949 -22.800000000000065
+ vertex -23.137718859013145 168.6975848066754 -16.000000000000068
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -22.430612077826595 169.922329678067 -15.414213562373158
+ vertex -22.27169345522871 170.19758480667542 -15.000000000000062
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -22.27169345522871 170.19758480667542 -15.000000000000062
+ vertex -22.171793032724107 170.37061741415104 -14.517638090205104
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -22.171793032724107 170.37061741415104 -14.517638090205104
+ vertex -22.137718859013145 170.4296356142443 -14.000000000000064
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -22.137718859013145 170.4296356142443 -14.000000000000064
+ vertex -22.137718859013145 170.4296356142443 -12.000000000000052
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -22.137718859013145 170.4296356142443 -12.000000000000052
+ vertex -22.171793032724107 170.37061741415104 -11.482361909795022
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -22.171793032724107 170.37061741415104 -11.482361909795022
+ vertex -22.27169345522871 170.19758480667542 -11.000000000000048
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -22.27169345522871 170.19758480667542 -11.000000000000048
+ vertex -22.430612077826595 169.92232967806703 -10.58578643762697
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -22.430612077826595 169.92232967806703 -10.58578643762697
+ vertex -22.637718859013166 169.56361021045984 -10.267949192431178
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -22.637718859013166 169.56361021045984 -10.267949192431178
+ vertex -22.878899813910653 169.14587254275943 -10.068148347421925
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -22.878899813910653 169.14587254275943 -10.068148347421925
+ vertex -23.137718859013145 168.6975848066754 -10.00000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -23.137718859013145 168.6975848066754 -10.00000000000005
+ vertex -35.53771885901319 147.22015479282135 -10.000000000000037
+ endloop
+endfacet
+facet normal -0.8660254037844387 0.4999999999999999 -8.06575702183646e-17
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -35.53771885901319 147.22015479282135 -10.000000000000037
+ vertex -43.03301832063373 134.23791530735053 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8322327793613368 0.5544263710868239 -1.5974817945265758e-16
+ outer loop
+ vertex -32.44493085969176 191.9689645055506 -3.000000000000062
+ vertex -31.55147180223168 193.3101090711995 -62.600000000000065
+ vertex -32.44493085969176 191.9689645055506 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.8322327793613368 0.5544263710868239 -1.5974817945265758e-16
+ outer loop
+ vertex -31.55147180223168 193.3101090711995 -62.600000000000065
+ vertex -32.44493085969176 191.9689645055506 -3.000000000000062
+ vertex -31.55147180223168 193.31010907119952 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.6039459209966601 0.7970252972845316 -1.8404317463084578e-16
+ outer loop
+ vertex -23.847984815414293 201.49655346124194 -62.600000000000065
+ vertex -22.563577168123395 202.4698133591663 -3.000000000000062
+ vertex -22.563577168123395 202.46981335916627 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.6039459209966601 0.7970252972845316 -1.8404317463084578e-16
+ outer loop
+ vertex -22.563577168123395 202.4698133591663 -3.000000000000062
+ vertex -23.847984815414293 201.49655346124194 -62.600000000000065
+ vertex -23.847984815414293 201.49655346124194 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.8083169430505417 0.588747585623438 -1.638303947657804e-16
+ outer loop
+ vertex -31.55147180223168 193.31010907119952 -3.000000000000062
+ vertex -30.60270404808994 194.61271322520327 -62.600000000000065
+ vertex -31.55147180223168 193.3101090711995 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.8083169430505417 0.588747585623438 -1.638303947657804e-16
+ outer loop
+ vertex -30.60270404808994 194.61271322520327 -62.600000000000065
+ vertex -31.55147180223168 193.31010907119952 -3.000000000000062
+ vertex -30.60270404808994 194.6127132252033 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.46275692980869365 0.8864852079499307 -1.1736899405614553e-16
+ outer loop
+ vertex 17.163768745909092 205.80157985229917 -62.600000000000065
+ vertex 18.592341194212068 205.05584625826125 -3.000000000000062
+ vertex 18.592341194212068 205.05584625826125 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.46275692980869365 0.8864852079499307 -1.1736899405614553e-16
+ outer loop
+ vertex 18.592341194212068 205.05584625826125 -3.000000000000062
+ vertex 17.163768745909092 205.80157985229917 -62.600000000000065
+ vertex 17.163768745909092 205.80157985229923 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.14589989704428336 0.9892993581532677 -1.5950409550416897e-16
+ outer loop
+ vertex 4.877244176212259 209.50613739606416 -62.600000000000065
+ vertex 6.471501805676724 209.27101945922942 -3.000000000000062
+ vertex 6.471501805676724 209.27101945922942 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.14589989704428336 0.9892993581532677 -1.5950409550416897e-16
+ outer loop
+ vertex 6.471501805676724 209.27101945922942 -3.000000000000062
+ vertex 4.877244176212259 209.50613739606416 -62.600000000000065
+ vertex 4.877244176212259 209.50613739606416 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.5352237960733169 0.8447102983371686 -1.0458099413404883e-16
+ outer loop
+ vertex 19.988475029279908 204.2510182344538 -62.600000000000065
+ vertex 21.349727138373666 203.38850415989336 -3.000000000000062
+ vertex 21.349727138373666 203.3885041598933 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.5352237960733169 0.8447102983371686 -1.0458099413404883e-16
+ outer loop
+ vertex 21.349727138373666 203.38850415989336 -3.000000000000062
+ vertex 19.988475029279908 204.2510182344538 -62.600000000000065
+ vertex 19.988475029279908 204.2510182344538 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.020915980694883277 0.9997812369471492 -1.7415434132155044e-16
+ outer loop
+ vertex -1.5560800549907094 209.77543271540065 -62.600000000000065
+ vertex 0.05506914030825163 209.80913885452406 -3.000000000000062
+ vertex 0.05506914030825163 209.809138854524 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.020915980694883277 0.9997812369471492 -1.7415434132155044e-16
+ outer loop
+ vertex 0.05506914030825163 209.80913885452406 -3.000000000000062
+ vertex -1.5560800549907094 209.77543271540065 -62.600000000000065
+ vertex -1.5560800549907094 209.77543271540065 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.49942734013696766 0.8663557767590135 -1.8796266836386066e-16
+ outer loop
+ vertex -19.87833674866336 204.2510182344538 -62.600000000000065
+ vertex -18.48220291359554 205.0558462582613 -3.000000000000062
+ vertex -18.48220291359554 205.05584625826125 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.49942734013696766 0.8663557767590135 -1.8796266836386066e-16
+ outer loop
+ vertex -18.48220291359554 205.0558462582613 -3.000000000000062
+ vertex -19.87833674866336 204.2510182344538 -62.600000000000065
+ vertex -19.87833674866336 204.2510182344538 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.46275692980869254 0.8864852079499311 -1.886138071888624e-16
+ outer loop
+ vertex -18.48220291359554 205.05584625826125 -62.600000000000065
+ vertex -17.053630465292567 205.80157985229926 -3.000000000000062
+ vertex -17.053630465292567 205.80157985229923 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.46275692980869254 0.8864852079499311 -1.886138071888624e-16
+ outer loop
+ vertex -17.053630465292567 205.80157985229926 -3.000000000000062
+ vertex -18.48220291359554 205.05584625826125 -62.600000000000065
+ vertex -18.48220291359554 205.0558462582613 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.18714752017171726 0.9823318205645061 -1.8393916645092217e-16
+ outer loop
+ vertex -7.944392955630252 208.96943090627002 -62.600000000000065
+ vertex -6.361363525060216 209.27101945922942 -3.000000000000062
+ vertex -6.361363525060216 209.27101945922942 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.18714752017171726 0.9823318205645061 -1.8393916645092217e-16
+ outer loop
+ vertex -6.361363525060216 209.27101945922942 -3.000000000000062
+ vertex -7.944392955630252 208.96943090627002 -62.600000000000065
+ vertex -7.944392955630252 208.96943090627002 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.5352237960733159 0.8447102983371693 -1.86982611223156e-16
+ outer loop
+ vertex -21.23958885775712 203.38850415989336 -62.600000000000065
+ vertex -19.87833674866336 204.2510182344538 -3.000000000000062
+ vertex -19.87833674866336 204.2510182344538 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.5352237960733159 0.8447102983371693 -1.86982611223156e-16
+ outer loop
+ vertex -19.87833674866336 204.2510182344538 -3.000000000000062
+ vertex -21.23958885775712 203.38850415989336 -62.600000000000065
+ vertex -21.23958885775712 203.38850415989336 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.14589989704428225 0.989299358153268 -1.8196645150886406e-16
+ outer loop
+ vertex -6.361363525060216 209.27101945922942 -62.600000000000065
+ vertex -4.767105895595756 209.50613739606416 -3.000000000000062
+ vertex -4.767105895595756 209.50613739606416 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.14589989704428225 0.989299358153268 -1.8196645150886406e-16
+ outer loop
+ vertex -4.767105895595756 209.50613739606416 -3.000000000000062
+ vertex -6.361363525060216 209.27101945922942 -62.600000000000065
+ vertex -6.361363525060216 209.27101945922942 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.668442484061863 0.7437638371830175 -7.690445521229434e-17
+ outer loop
+ vertex 25.20070247861516 200.47042758626193 -62.600000000000065
+ vertex 26.399279190685665 199.3932313652282 -3.000000000000062
+ vertex 26.399279190685665 199.39323136522816 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.668442484061863 0.7437638371830175 -7.690445521229434e-17
+ outer loop
+ vertex 26.399279190685665 199.3932313652282 -3.000000000000062
+ vertex 25.20070247861516 200.47042758626193 -62.600000000000065
+ vertex 25.20070247861516 200.47042758626193 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.4994273401369627 0.8663557767590164 -1.1107217741835e-16
+ outer loop
+ vertex 18.592341194212068 205.05584625826125 -62.600000000000065
+ vertex 19.988475029279908 204.2510182344538 -3.000000000000062
+ vertex 19.988475029279908 204.2510182344538 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.4994273401369627 0.8663557767590164 -1.1107217741835e-16
+ outer loop
+ vertex 19.988475029279908 204.2510182344538 -3.000000000000062
+ vertex 18.592341194212068 205.05584625826125 -62.600000000000065
+ vertex 18.592341194212068 205.05584625826125 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.10439696179123423 0.9945357079405243 -1.6360263546573064e-16
+ outer loop
+ vertex 3.274548159994501 209.67437328084154 -62.600000000000065
+ vertex 4.877244176212259 209.50613739606416 -3.000000000000062
+ vertex 4.877244176212259 209.50613739606416 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.10439696179123423 0.9945357079405243 -1.6360263546573064e-16
+ outer loop
+ vertex 4.877244176212259 209.50613739606416 -3.000000000000062
+ vertex 3.274548159994501 209.67437328084154 -62.600000000000065
+ vertex 3.274548159994501 209.67437328084154 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.06271134093822832 0.9980317067697445 -1.6741488504968628e-16
+ outer loop
+ vertex 1.6662183356072127 209.77543271540065 -62.600000000000065
+ vertex 3.274548159994501 209.67437328084154 -3.000000000000062
+ vertex 3.274548159994501 209.67437328084154 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.06271134093822832 0.9980317067697445 -1.6741488504968628e-16
+ outer loop
+ vertex 3.274548159994501 209.67437328084154 -3.000000000000062
+ vertex 1.6662183356072127 209.77543271540065 -62.600000000000065
+ vertex 1.6662183356072127 209.77543271540065 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.6367513322442965 0.771069219256685 -8.405641526142003e-17
+ outer loop
+ vertex 23.958123096030832 201.4965534612419 -62.600000000000065
+ vertex 25.20070247861516 200.47042758626193 -3.000000000000062
+ vertex 25.20070247861516 200.47042758626193 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.6367513322442965 0.771069219256685 -8.405641526142003e-17
+ outer loop
+ vertex 25.20070247861516 200.47042758626193 -3.000000000000062
+ vertex 23.958123096030832 201.4965534612419 -62.600000000000065
+ vertex 23.958123096030832 201.4965534612419 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.22806765142186164 0.9736452877588 -1.5047732123428022e-16
+ outer loop
+ vertex 8.05453123624676 208.96943090626996 -62.600000000000065
+ vertex 9.623562304152413 208.60189949091352 -3.000000000000062
+ vertex 9.623562304152413 208.60189949091347 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.22806765142186164 0.9736452877588 -1.5047732123428022e-16
+ outer loop
+ vertex 9.623562304152413 208.60189949091352 -3.000000000000062
+ vertex 8.05453123624676 208.96943090626996 -62.600000000000065
+ vertex 8.05453123624676 208.96943090627002 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.18714752017171837 0.9823318205645059 -1.5512643725333354e-16
+ outer loop
+ vertex 6.471501805676724 209.27101945922942 -62.600000000000065
+ vertex 8.05453123624676 208.96943090627002 -3.000000000000062
+ vertex 8.05453123624676 208.96943090626996 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.18714752017171837 0.9823318205645059 -1.5512643725333354e-16
+ outer loop
+ vertex 8.05453123624676 208.96943090627002 -3.000000000000062
+ vertex 6.471501805676724 209.27101945922942 -62.600000000000065
+ vertex 6.471501805676724 209.27101945922942 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.2280676514218636 0.9736452877587994 -1.8559000385555494e-16
+ outer loop
+ vertex -9.513424023535883 208.60189949091352 -62.600000000000065
+ vertex -7.944392955630252 208.96943090627002 -3.000000000000062
+ vertex -7.944392955630252 208.96943090627002 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.2280676514218636 0.9736452877587994 -1.8559000385555494e-16
+ outer loop
+ vertex -7.944392955630252 208.96943090627002 -3.000000000000062
+ vertex -9.513424023535883 208.60189949091352 -62.600000000000065
+ vertex -9.513424023535883 208.60189949091352 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.3966766701456137 -0.6870641468694428 -0.6087614290087314
+ outer loop
+ vertex -36.40374426279749 145.72015479282126 -54.600000000000044
+ vertex -37.97687644776845 146.9954099214297 -55.01421356237315
+ vertex -36.2448256401996 145.9954099214297 -55.01421356237315
+ endloop
+endfacet
+facet normal -0.3966766701456137 -0.6870641468694428 -0.6087614290087314
+ outer loop
+ vertex -37.97687644776845 146.9954099214297 -55.01421356237315
+ vertex -36.40374426279749 145.72015479282126 -54.600000000000044
+ vertex -38.13579507036633 146.72015479282126 -54.600000000000044
+ endloop
+endfacet
+facet normal 0.3043807145043631 0.5272028623656725 -0.793353340291232
+ outer loop
+ vertex -24.36976966658183 170.56361021045976 -55.33205080756895
+ vertex -22.43061207782646 169.92232967806692 -55.01421356237316
+ vertex -22.63771885901299 169.56361021045976 -55.33205080756895
+ endloop
+endfacet
+facet normal 0.3043807145043631 0.5272028623656725 -0.793353340291232
+ outer loop
+ vertex -22.43061207782646 169.92232967806692 -55.01421356237316
+ vertex -24.36976966658183 170.56361021045976 -55.33205080756895
+ vertex -24.162662885395303 170.92232967806692 -55.01421356237316
+ endloop
+endfacet
+facet normal 0.19134171618254017 0.3314135740355839 0.9238795325112906
+ outer loop
+ vertex -22.63771885901299 169.5636102104598 -49.86794919243118
+ vertex -24.61095062147932 170.14587254275938 -49.66814834742192
+ vertex -22.878899813910476 169.14587254275938 -49.66814834742192
+ endloop
+endfacet
+facet normal 0.19134171618254017 0.3314135740355839 0.9238795325112906
+ outer loop
+ vertex -24.61095062147932 170.14587254275938 -49.66814834742192
+ vertex -22.63771885901299 169.5636102104598 -49.86794919243118
+ vertex -24.36976966658183 170.5636102104598 -49.86794919243118
+ endloop
+endfacet
+facet normal -0.19134171618255047 -0.33141357403560173 -0.9238795325112822
+ outer loop
+ vertex -37.76976966658187 147.35412938903687 -55.332050807568926
+ vertex -35.79653790411557 146.77186705673725 -55.53185165257819
+ vertex -36.03771885901303 146.35412938903684 -55.332050807568926
+ endloop
+endfacet
+facet normal -0.19134171618255047 -0.33141357403560173 -0.9238795325112822
+ outer loop
+ vertex -35.79653790411557 146.77186705673725 -55.53185165257819
+ vertex -37.76976966658187 147.35412938903687 -55.332050807568926
+ vertex -37.52858871168441 147.77186705673725 -55.53185165257819
+ endloop
+endfacet
+facet normal 0.5000000000000006 0.8660254037844384 -1.525901372395458e-31
+ outer loop
+ vertex -23.869769666581856 171.42963561424423 -53.60000000000007
+ vertex -22.13771885901301 170.42963561424423 -51.600000000000065
+ vertex -22.13771885901301 170.42963561424423 -53.60000000000007
+ endloop
+endfacet
+facet normal 0.5000000000000006 0.8660254037844384 -1.525901372395458e-31
+ outer loop
+ vertex -22.13771885901301 170.42963561424423 -51.600000000000065
+ vertex -23.869769666581856 171.42963561424423 -53.60000000000007
+ vertex -23.869769666581856 171.42963561424423 -51.600000000000065
+ endloop
+endfacet
+facet normal 0.4619397662556413 0.8001031451912602 -0.3826834323651031
+ outer loop
+ vertex -22.271693455228576 170.19758480667537 -54.60000000000007
+ vertex -23.90384384029277 171.37061741415096 -54.117638090205105
+ vertex -22.171793032723926 170.37061741415096 -54.117638090205105
+ endloop
+endfacet
+facet normal 0.4619397662556413 0.8001031451912602 -0.3826834323651031
+ outer loop
+ vertex -23.90384384029277 171.37061741415096 -54.117638090205105
+ vertex -22.271693455228576 170.19758480667537 -54.60000000000007
+ vertex -24.00374426279742 171.19758480667534 -54.60000000000007
+ endloop
+endfacet
+facet normal 0.461939766255642 0.8001031451912624 0.3826834323650984
+ outer loop
+ vertex -23.90384384029277 171.37061741415096 -51.08236190979502
+ vertex -22.271693455228576 170.19758480667537 -50.60000000000005
+ vertex -22.171793032723926 170.37061741415096 -51.08236190979502
+ endloop
+endfacet
+facet normal 0.461939766255642 0.8001031451912624 0.3826834323650984
+ outer loop
+ vertex -22.271693455228576 170.19758480667537 -50.60000000000005
+ vertex -23.90384384029277 171.37061741415096 -51.08236190979502
+ vertex -24.00374426279742 171.19758480667534 -50.60000000000005
+ endloop
+endfacet
+facet normal 8.187369750874694e-17 -8.35064192169492e-16 -1.0
+ outer loop
+ vertex -37.2697696665819 148.22015479282126 -55.60000000000006
+ vertex -23.13771885901301 168.69758480667537 -55.600000000000065
+ vertex -35.537718859013054 147.22015479282126 -55.60000000000006
+ endloop
+endfacet
+facet normal 8.187369750874694e-17 -8.35064192169492e-16 -1.0
+ outer loop
+ vertex -23.13771885901301 168.69758480667537 -55.600000000000065
+ vertex -37.2697696665819 148.22015479282126 -55.60000000000006
+ vertex -24.869769666581853 169.69758480667537 -55.600000000000065
+ endloop
+endfacet
+facet normal 0.30438071450436976 0.5272028623656856 0.7933533402912207
+ outer loop
+ vertex -22.43061207782646 169.92232967806694 -50.185786437626966
+ vertex -24.36976966658183 170.5636102104598 -49.86794919243118
+ vertex -22.63771885901299 169.5636102104598 -49.86794919243118
+ endloop
+endfacet
+facet normal 0.30438071450436976 0.5272028623656856 0.7933533402912207
+ outer loop
+ vertex -24.36976966658183 170.5636102104598 -49.86794919243118
+ vertex -22.43061207782646 169.92232967806694 -50.185786437626966
+ vertex -24.162662885395303 170.92232967806694 -50.185786437626966
+ endloop
+endfacet
+facet normal -0.30438071450435433 -0.5272028623656587 -0.7933533402912446
+ outer loop
+ vertex -37.97687644776845 146.9954099214297 -55.01421356237315
+ vertex -36.03771885901303 146.35412938903684 -55.332050807568926
+ vertex -36.2448256401996 145.9954099214297 -55.01421356237315
+ endloop
+endfacet
+facet normal -0.30438071450435433 -0.5272028623656587 -0.7933533402912446
+ outer loop
+ vertex -36.03771885901303 146.35412938903684 -55.332050807568926
+ vertex -37.97687644776845 146.9954099214297 -55.01421356237315
+ vertex -37.76976966658187 147.35412938903687 -55.332050807568926
+ endloop
+endfacet
+facet normal -0.46193976625565 -0.8001031451912763 -0.38268343236505975
+ outer loop
+ vertex -36.50364468530211 145.54712218534567 -54.11763809020509
+ vertex -38.13579507036633 146.72015479282126 -54.600000000000044
+ vertex -36.40374426279749 145.72015479282126 -54.600000000000044
+ endloop
+endfacet
+facet normal -0.46193976625565 -0.8001031451912763 -0.38268343236505975
+ outer loop
+ vertex -38.13579507036633 146.72015479282126 -54.600000000000044
+ vertex -36.50364468530211 145.54712218534567 -54.11763809020509
+ vertex -38.23569549287096 146.54712218534567 -54.11763809020509
+ endloop
+endfacet
+facet normal 0.06526309611002556 0.1130389983218139 -0.9914448613738106
+ outer loop
+ vertex -24.869769666581853 169.69758480667537 -55.600000000000065
+ vertex -22.878899813910476 169.14587254275938 -55.531851652578204
+ vertex -23.13771885901301 168.69758480667537 -55.600000000000065
+ endloop
+endfacet
+facet normal 0.06526309611002556 0.1130389983218139 -0.9914448613738106
+ outer loop
+ vertex -22.878899813910476 169.14587254275938 -55.531851652578204
+ vertex -24.869769666581853 169.69758480667537 -55.600000000000065
+ vertex -24.61095062147932 170.14587254275938 -55.531851652578204
+ endloop
+endfacet
+facet normal -0.4619397662556533 -0.800103145191281 0.38268343236504554
+ outer loop
+ vertex -38.13579507036633 146.72015479282126 -50.60000000000003
+ vertex -36.50364468530209 145.54712218534567 -51.082361909795
+ vertex -36.40374426279749 145.72015479282126 -50.60000000000003
+ endloop
+endfacet
+facet normal -0.4619397662556533 -0.800103145191281 0.38268343236504554
+ outer loop
+ vertex -36.50364468530209 145.54712218534567 -51.082361909795
+ vertex -38.13579507036633 146.72015479282126 -50.60000000000003
+ vertex -38.23569549287094 146.54712218534567 -51.082361909795
+ endloop
+endfacet
+facet normal -0.5000000000000006 -0.8660254037844384 2.44216261170711e-15
+ outer loop
+ vertex -38.269769666581894 146.48810398525242 -51.600000000000044
+ vertex -36.537718859013054 145.4881039852524 -53.60000000000005
+ vertex -36.537718859013054 145.4881039852524 -51.600000000000044
+ endloop
+endfacet
+facet normal -0.5000000000000006 -0.8660254037844384 2.44216261170711e-15
+ outer loop
+ vertex -36.537718859013054 145.4881039852524 -53.60000000000005
+ vertex -38.269769666581894 146.48810398525242 -51.600000000000044
+ vertex -38.269769666581894 146.4881039852524 -53.60000000000005
+ endloop
+endfacet
+facet normal -0.39667667014561225 -0.6870641468694391 0.6087614290087366
+ outer loop
+ vertex -37.97687644776845 146.9954099214297 -50.185786437626945
+ vertex -36.40374426279749 145.72015479282126 -50.60000000000003
+ vertex -36.2448256401996 145.9954099214297 -50.185786437626945
+ endloop
+endfacet
+facet normal -0.39667667014561225 -0.6870641468694391 0.6087614290087366
+ outer loop
+ vertex -36.40374426279749 145.72015479282126 -50.60000000000003
+ vertex -37.97687644776845 146.9954099214297 -50.185786437626945
+ vertex -38.13579507036633 146.72015479282126 -50.60000000000003
+ endloop
+endfacet
+facet normal 0.06526309611002595 0.11303899832181648 0.9914448613738104
+ outer loop
+ vertex -22.878899813910476 169.14587254275938 -49.66814834742192
+ vertex -24.869769666581853 169.69758480667537 -49.60000000000006
+ vertex -23.13771885901301 168.69758480667537 -49.60000000000006
+ endloop
+endfacet
+facet normal 0.06526309611002595 0.11303899832181648 0.9914448613738104
+ outer loop
+ vertex -24.869769666581853 169.69758480667537 -49.60000000000006
+ vertex -22.878899813910476 169.14587254275938 -49.66814834742192
+ vertex -24.61095062147932 170.14587254275938 -49.66814834742192
+ endloop
+endfacet
+facet normal 0.49572243068690497 0.8586164364012591 -0.13052619222006556
+ outer loop
+ vertex -22.171793032723926 170.37061741415096 -54.117638090205105
+ vertex -23.869769666581856 171.42963561424423 -53.60000000000007
+ vertex -22.13771885901301 170.42963561424423 -53.60000000000007
+ endloop
+endfacet
+facet normal 0.49572243068690497 0.8586164364012591 -0.13052619222006556
+ outer loop
+ vertex -23.869769666581856 171.42963561424423 -53.60000000000007
+ vertex -22.171793032723926 170.37061741415096 -54.117638090205105
+ vertex -23.90384384029277 171.37061741415096 -54.117638090205105
+ endloop
+endfacet
+facet normal 0.39667667014562535 0.6870641468694629 0.6087614290087013
+ outer loop
+ vertex -24.00374426279742 171.19758480667534 -50.60000000000005
+ vertex -22.43061207782646 169.92232967806694 -50.185786437626966
+ vertex -22.271693455228576 170.19758480667537 -50.60000000000005
+ endloop
+endfacet
+facet normal 0.39667667014562535 0.6870641468694629 0.6087614290087013
+ outer loop
+ vertex -22.43061207782646 169.92232967806694 -50.185786437626966
+ vertex -24.00374426279742 171.19758480667534 -50.60000000000005
+ vertex -24.162662885395303 170.92232967806694 -50.185786437626966
+ endloop
+endfacet
+facet normal -0.4957224306869045 -0.8586164364012583 0.13052619222007125
+ outer loop
+ vertex -38.23569549287094 146.54712218534567 -51.082361909795
+ vertex -36.537718859013054 145.4881039852524 -51.600000000000044
+ vertex -36.50364468530209 145.54712218534567 -51.082361909795
+ endloop
+endfacet
+facet normal -0.4957224306869045 -0.8586164364012583 0.13052619222007125
+ outer loop
+ vertex -36.537718859013054 145.4881039852524 -51.600000000000044
+ vertex -38.23569549287094 146.54712218534567 -51.082361909795
+ vertex -38.269769666581894 146.48810398525242 -51.600000000000044
+ endloop
+endfacet
+facet normal -0.30438071450435156 -0.5272028623656525 0.7933533402912498
+ outer loop
+ vertex -36.03771885901303 146.35412938903687 -49.86794919243116
+ vertex -37.97687644776845 146.9954099214297 -50.185786437626945
+ vertex -36.2448256401996 145.9954099214297 -50.185786437626945
+ endloop
+endfacet
+facet normal -0.30438071450435156 -0.5272028623656525 0.7933533402912498
+ outer loop
+ vertex -37.97687644776845 146.9954099214297 -50.185786437626945
+ vertex -36.03771885901303 146.35412938903687 -49.86794919243116
+ vertex -37.76976966658187 147.35412938903687 -49.86794919243116
+ endloop
+endfacet
+facet normal -0.06526309611002613 -0.11303899832181678 -0.9914448613738103
+ outer loop
+ vertex -37.52858871168441 147.77186705673725 -55.53185165257819
+ vertex -35.537718859013054 147.22015479282126 -55.60000000000006
+ vertex -35.79653790411557 146.77186705673725 -55.53185165257819
+ endloop
+endfacet
+facet normal -0.06526309611002613 -0.11303899832181678 -0.9914448613738103
+ outer loop
+ vertex -35.537718859013054 147.22015479282126 -55.60000000000006
+ vertex -37.52858871168441 147.77186705673725 -55.53185165257819
+ vertex -37.2697696665819 148.22015479282126 -55.60000000000006
+ endloop
+endfacet
+facet normal -0.19134171618255466 -0.3314135740356073 0.9238795325112792
+ outer loop
+ vertex -35.79653790411557 146.77186705673725 -49.6681483474219
+ vertex -37.76976966658187 147.35412938903687 -49.86794919243116
+ vertex -36.03771885901303 146.35412938903687 -49.86794919243116
+ endloop
+endfacet
+facet normal -0.19134171618255466 -0.3314135740356073 0.9238795325112792
+ outer loop
+ vertex -37.76976966658187 147.35412938903687 -49.86794919243116
+ vertex -35.79653790411557 146.77186705673725 -49.6681483474219
+ vertex -37.52858871168441 147.77186705673725 -49.6681483474219
+ endloop
+endfacet
+facet normal 0.3966766701456188 0.6870641468694504 -0.6087614290087198
+ outer loop
+ vertex -22.43061207782646 169.92232967806692 -55.01421356237316
+ vertex -24.00374426279742 171.19758480667534 -54.60000000000007
+ vertex -22.271693455228576 170.19758480667537 -54.60000000000007
+ endloop
+endfacet
+facet normal 0.3966766701456188 0.6870641468694504 -0.6087614290087198
+ outer loop
+ vertex -24.00374426279742 171.19758480667534 -54.60000000000007
+ vertex -22.43061207782646 169.92232967806692 -55.01421356237316
+ vertex -24.162662885395303 170.92232967806692 -55.01421356237316
+ endloop
+endfacet
+facet normal -8.187369750874702e-17 8.350641921694918e-16 1.0
+ outer loop
+ vertex -23.13771885901301 168.69758480667537 -49.60000000000006
+ vertex -37.2697696665819 148.2201547928213 -49.60000000000003
+ vertex -35.537718859013054 147.2201547928213 -49.60000000000003
+ endloop
+endfacet
+facet normal -8.187369750874702e-17 8.350641921694918e-16 1.0
+ outer loop
+ vertex -37.2697696665819 148.2201547928213 -49.60000000000003
+ vertex -23.13771885901301 168.69758480667537 -49.60000000000006
+ vertex -24.869769666581853 169.69758480667537 -49.60000000000006
+ endloop
+endfacet
+facet normal 0.1913417161825495 0.33141357403559835 -0.9238795325112834
+ outer loop
+ vertex -24.61095062147932 170.14587254275938 -55.531851652578204
+ vertex -22.63771885901299 169.56361021045976 -55.33205080756895
+ vertex -22.878899813910476 169.14587254275938 -55.531851652578204
+ endloop
+endfacet
+facet normal 0.1913417161825495 0.33141357403559835 -0.9238795325112834
+ outer loop
+ vertex -22.63771885901299 169.56361021045976 -55.33205080756895
+ vertex -24.61095062147932 170.14587254275938 -55.531851652578204
+ vertex -24.36976966658183 170.56361021045976 -55.33205080756895
+ endloop
+endfacet
+facet normal -0.49572243068690525 -0.8586164364012598 -0.13052619222005923
+ outer loop
+ vertex -36.537718859013054 145.4881039852524 -53.60000000000005
+ vertex -38.23569549287096 146.54712218534567 -54.11763809020509
+ vertex -36.50364468530211 145.54712218534567 -54.11763809020509
+ endloop
+endfacet
+facet normal -0.49572243068690525 -0.8586164364012598 -0.13052619222005923
+ outer loop
+ vertex -38.23569549287096 146.54712218534567 -54.11763809020509
+ vertex -36.537718859013054 145.4881039852524 -53.60000000000005
+ vertex -38.269769666581894 146.4881039852524 -53.60000000000005
+ endloop
+endfacet
+facet normal 0.4957224306869049 0.8586164364012593 0.1305261922200656
+ outer loop
+ vertex -23.869769666581856 171.42963561424423 -51.600000000000065
+ vertex -22.171793032723926 170.37061741415096 -51.08236190979502
+ vertex -22.13771885901301 170.42963561424423 -51.600000000000065
+ endloop
+endfacet
+facet normal 0.4957224306869049 0.8586164364012593 0.1305261922200656
+ outer loop
+ vertex -22.171793032723926 170.37061741415096 -51.08236190979502
+ vertex -23.869769666581856 171.42963561424423 -51.600000000000065
+ vertex -23.90384384029277 171.37061741415096 -51.08236190979502
+ endloop
+endfacet
+facet normal -0.06526309611002697 -0.11303899832181633 0.9914448613738103
+ outer loop
+ vertex -35.537718859013054 147.2201547928213 -49.60000000000003
+ vertex -37.52858871168441 147.77186705673725 -49.6681483474219
+ vertex -35.79653790411557 146.77186705673725 -49.6681483474219
+ endloop
+endfacet
+facet normal -0.06526309611002697 -0.11303899832181633 0.9914448613738103
+ outer loop
+ vertex -37.52858871168441 147.77186705673725 -49.6681483474219
+ vertex -35.537718859013054 147.2201547928213 -49.60000000000003
+ vertex -37.2697696665819 148.2201547928213 -49.60000000000003
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -37.2697696665819 148.22015479282132 -16.00000000000005
+ vertex -24.610950621479365 170.1458725427594 -15.931851652578203
+ vertex -24.869769666581853 169.6975848066754 -16.000000000000068
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.610950621479365 170.1458725427594 -15.931851652578203
+ vertex -37.2697696665819 148.22015479282132 -16.00000000000005
+ vertex -37.528588711684435 147.7718670567373 -15.931851652578185
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.610950621479365 170.1458725427594 -15.931851652578203
+ vertex -37.528588711684435 147.7718670567373 -15.931851652578185
+ vertex -24.369769666581877 170.5636102104598 -15.732050807568942
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.369769666581877 170.5636102104598 -15.732050807568942
+ vertex -37.528588711684435 147.7718670567373 -15.931851652578185
+ vertex -37.769769666581894 147.35412938903687 -15.732050807568926
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.369769666581877 170.5636102104598 -15.732050807568942
+ vertex -37.769769666581894 147.35412938903687 -15.732050807568926
+ vertex -24.162662885395303 170.92232967806697 -15.414213562373158
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.162662885395303 170.92232967806697 -15.414213562373158
+ vertex -37.769769666581894 147.35412938903687 -15.732050807568926
+ vertex -37.97687644776845 146.9954099214297 -15.41421356237314
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.162662885395303 170.92232967806697 -15.414213562373158
+ vertex -37.97687644776845 146.9954099214297 -15.41421356237314
+ vertex -24.00374426279742 171.1975848066754 -15.000000000000062
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.00374426279742 171.1975848066754 -15.000000000000062
+ vertex -37.97687644776845 146.9954099214297 -15.41421356237314
+ vertex -38.13579507036633 146.72015479282132 -15.000000000000046
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.00374426279742 171.1975848066754 -15.000000000000062
+ vertex -38.13579507036633 146.72015479282132 -15.000000000000046
+ vertex -23.903843840292815 171.370617414151 -14.517638090205104
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -23.903843840292815 171.370617414151 -14.517638090205104
+ vertex -38.13579507036633 146.72015479282132 -15.000000000000046
+ vertex -38.23569549287098 146.5471221853457 -14.517638090205088
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -23.903843840292815 171.370617414151 -14.517638090205104
+ vertex -38.23569549287098 146.5471221853457 -14.517638090205088
+ vertex -23.869769666581856 171.42963561424426 -14.000000000000064
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -23.869769666581856 171.42963561424426 -14.000000000000064
+ vertex -38.23569549287098 146.5471221853457 -14.517638090205088
+ vertex -38.269769666581894 146.48810398525245 -14.000000000000048
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -23.869769666581856 171.42963561424426 -14.000000000000064
+ vertex -38.269769666581894 146.48810398525245 -14.000000000000048
+ vertex -23.869769666581856 171.42963561424426 -12.000000000000052
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -23.869769666581856 171.42963561424426 -12.000000000000052
+ vertex -38.269769666581894 146.48810398525245 -14.000000000000048
+ vertex -38.269769666581894 146.48810398525245 -12.000000000000034
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -23.869769666581856 171.42963561424426 -12.000000000000052
+ vertex -38.269769666581894 146.48810398525245 -12.000000000000034
+ vertex -23.903843840292815 171.370617414151 -11.482361909795022
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -23.903843840292815 171.370617414151 -11.482361909795022
+ vertex -38.269769666581894 146.48810398525245 -12.000000000000034
+ vertex -38.23569549287096 146.5471221853457 -11.482361909795
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -23.903843840292815 171.370617414151 -11.482361909795022
+ vertex -38.23569549287096 146.5471221853457 -11.482361909795
+ vertex -24.00374426279742 171.1975848066754 -11.000000000000048
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.00374426279742 171.1975848066754 -11.000000000000048
+ vertex -38.23569549287096 146.5471221853457 -11.482361909795
+ vertex -38.13579507036633 146.72015479282132 -11.000000000000036
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.00374426279742 171.1975848066754 -11.000000000000048
+ vertex -38.13579507036633 146.72015479282132 -11.000000000000036
+ vertex -24.162662885395303 170.922329678067 -10.58578643762697
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.162662885395303 170.922329678067 -10.58578643762697
+ vertex -38.13579507036633 146.72015479282132 -11.000000000000036
+ vertex -37.97687644776845 146.99540992142974 -10.585786437626947
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.162662885395303 170.922329678067 -10.58578643762697
+ vertex -37.97687644776845 146.99540992142974 -10.585786437626947
+ vertex -24.369769666581877 170.56361021045984 -10.267949192431178
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.369769666581877 170.56361021045984 -10.267949192431178
+ vertex -37.97687644776845 146.99540992142974 -10.585786437626947
+ vertex -37.769769666581894 147.3541293890369 -10.267949192431168
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.369769666581877 170.56361021045984 -10.267949192431178
+ vertex -37.769769666581894 147.3541293890369 -10.267949192431168
+ vertex -24.610950621479365 170.1458725427594 -10.068148347421925
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.610950621479365 170.1458725427594 -10.068148347421925
+ vertex -37.769769666581894 147.3541293890369 -10.267949192431168
+ vertex -37.528588711684435 147.7718670567373 -10.068148347421902
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.610950621479365 170.1458725427594 -10.068148347421925
+ vertex -37.528588711684435 147.7718670567373 -10.068148347421902
+ vertex -24.869769666581853 169.6975848066754 -10.00000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.869769666581853 169.6975848066754 -10.00000000000005
+ vertex -37.528588711684435 147.7718670567373 -10.068148347421902
+ vertex -37.2697696665819 148.22015479282132 -10.000000000000037
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -37.2697696665819 148.22015479282126 -55.60000000000006
+ vertex -24.61095062147932 170.14587254275938 -55.531851652578204
+ vertex -24.869769666581853 169.69758480667537 -55.600000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.61095062147932 170.14587254275938 -55.531851652578204
+ vertex -37.2697696665819 148.22015479282126 -55.60000000000006
+ vertex -37.52858871168441 147.77186705673725 -55.53185165257819
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.61095062147932 170.14587254275938 -55.531851652578204
+ vertex -37.52858871168441 147.77186705673725 -55.53185165257819
+ vertex -24.36976966658183 170.56361021045976 -55.33205080756895
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.36976966658183 170.56361021045976 -55.33205080756895
+ vertex -37.52858871168441 147.77186705673725 -55.53185165257819
+ vertex -37.76976966658187 147.35412938903687 -55.332050807568926
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.36976966658183 170.56361021045976 -55.33205080756895
+ vertex -37.76976966658187 147.35412938903687 -55.332050807568926
+ vertex -24.162662885395303 170.92232967806692 -55.01421356237316
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.162662885395303 170.92232967806692 -55.01421356237316
+ vertex -37.76976966658187 147.35412938903687 -55.332050807568926
+ vertex -37.97687644776845 146.9954099214297 -55.01421356237315
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.162662885395303 170.92232967806692 -55.01421356237316
+ vertex -37.97687644776845 146.9954099214297 -55.01421356237315
+ vertex -24.00374426279742 171.19758480667534 -54.60000000000007
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.00374426279742 171.19758480667534 -54.60000000000007
+ vertex -37.97687644776845 146.9954099214297 -55.01421356237315
+ vertex -38.13579507036633 146.72015479282126 -54.600000000000044
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.00374426279742 171.19758480667534 -54.60000000000007
+ vertex -38.13579507036633 146.72015479282126 -54.600000000000044
+ vertex -23.90384384029277 171.37061741415096 -54.117638090205105
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -23.90384384029277 171.37061741415096 -54.117638090205105
+ vertex -38.13579507036633 146.72015479282126 -54.600000000000044
+ vertex -38.23569549287096 146.54712218534567 -54.11763809020509
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -23.90384384029277 171.37061741415096 -54.117638090205105
+ vertex -38.23569549287096 146.54712218534567 -54.11763809020509
+ vertex -23.869769666581856 171.42963561424423 -53.60000000000007
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -23.869769666581856 171.42963561424423 -53.60000000000007
+ vertex -38.23569549287096 146.54712218534567 -54.11763809020509
+ vertex -38.269769666581894 146.4881039852524 -53.60000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -23.869769666581856 171.42963561424423 -53.60000000000007
+ vertex -38.269769666581894 146.4881039852524 -53.60000000000005
+ vertex -23.869769666581856 171.42963561424423 -51.600000000000065
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -23.869769666581856 171.42963561424423 -51.600000000000065
+ vertex -38.269769666581894 146.4881039852524 -53.60000000000005
+ vertex -38.269769666581894 146.48810398525242 -51.600000000000044
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -23.869769666581856 171.42963561424423 -51.600000000000065
+ vertex -38.269769666581894 146.48810398525242 -51.600000000000044
+ vertex -23.90384384029277 171.37061741415096 -51.08236190979502
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -23.90384384029277 171.37061741415096 -51.08236190979502
+ vertex -38.269769666581894 146.48810398525242 -51.600000000000044
+ vertex -38.23569549287094 146.54712218534567 -51.082361909795
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -23.90384384029277 171.37061741415096 -51.08236190979502
+ vertex -38.23569549287094 146.54712218534567 -51.082361909795
+ vertex -24.00374426279742 171.19758480667534 -50.60000000000005
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.00374426279742 171.19758480667534 -50.60000000000005
+ vertex -38.23569549287094 146.54712218534567 -51.082361909795
+ vertex -38.13579507036633 146.72015479282126 -50.60000000000003
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.00374426279742 171.19758480667534 -50.60000000000005
+ vertex -38.13579507036633 146.72015479282126 -50.60000000000003
+ vertex -24.162662885395303 170.92232967806694 -50.185786437626966
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.162662885395303 170.92232967806694 -50.185786437626966
+ vertex -38.13579507036633 146.72015479282126 -50.60000000000003
+ vertex -37.97687644776845 146.9954099214297 -50.185786437626945
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.162662885395303 170.92232967806694 -50.185786437626966
+ vertex -37.97687644776845 146.9954099214297 -50.185786437626945
+ vertex -24.36976966658183 170.5636102104598 -49.86794919243118
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.36976966658183 170.5636102104598 -49.86794919243118
+ vertex -37.97687644776845 146.9954099214297 -50.185786437626945
+ vertex -37.76976966658187 147.35412938903687 -49.86794919243116
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.36976966658183 170.5636102104598 -49.86794919243118
+ vertex -37.76976966658187 147.35412938903687 -49.86794919243116
+ vertex -24.61095062147932 170.14587254275938 -49.66814834742192
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.61095062147932 170.14587254275938 -49.66814834742192
+ vertex -37.76976966658187 147.35412938903687 -49.86794919243116
+ vertex -37.52858871168441 147.77186705673725 -49.6681483474219
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.61095062147932 170.14587254275938 -49.66814834742192
+ vertex -37.52858871168441 147.77186705673725 -49.6681483474219
+ vertex -24.869769666581853 169.69758480667537 -49.60000000000006
+ endloop
+endfacet
+facet normal -0.8660254037844384 0.5000000000000006 -4.884367980290838e-16
+ outer loop
+ vertex -24.869769666581853 169.69758480667537 -49.60000000000006
+ vertex -37.52858871168441 147.77186705673725 -49.6681483474219
+ vertex -37.2697696665819 148.2201547928213 -49.60000000000003
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 24.721088902095826 170.14587254275935 -55.531851652578204
+ vertex 37.37990794719835 148.22015479282123 -55.600000000000065
+ vertex 24.97990794719836 169.69758480667534 -55.600000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 37.37990794719835 148.22015479282123 -55.600000000000065
+ vertex 24.721088902095826 170.14587254275935 -55.531851652578204
+ vertex 37.638726992300874 147.77186705673722 -55.531851652578204
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 37.638726992300874 147.77186705673722 -55.531851652578204
+ vertex 24.721088902095826 170.14587254275935 -55.531851652578204
+ vertex 24.47990794719834 170.56361021045973 -55.33205080756894
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 37.638726992300874 147.77186705673722 -55.531851652578204
+ vertex 24.47990794719834 170.56361021045973 -55.33205080756894
+ vertex 37.87990794719835 147.35412938903679 -55.33205080756894
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 37.87990794719835 147.35412938903679 -55.33205080756894
+ vertex 24.47990794719834 170.56361021045973 -55.33205080756894
+ vertex 24.272801166011813 170.92232967806692 -55.01421356237316
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 37.87990794719835 147.35412938903679 -55.33205080756894
+ vertex 24.272801166011813 170.92232967806692 -55.01421356237316
+ vertex 38.0870147283849 146.99540992142965 -55.01421356237316
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 38.0870147283849 146.99540992142965 -55.01421356237316
+ vertex 24.272801166011813 170.92232967806692 -55.01421356237316
+ vertex 24.113882543413904 171.19758480667534 -54.60000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 38.0870147283849 146.99540992142965 -55.01421356237316
+ vertex 24.113882543413904 171.19758480667534 -54.60000000000006
+ vertex 38.24593335098278 146.72015479282123 -54.60000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 38.24593335098278 146.72015479282123 -54.60000000000006
+ vertex 24.113882543413904 171.19758480667534 -54.60000000000006
+ vertex 24.01398212090928 171.37061741415093 -54.117638090205105
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 38.24593335098278 146.72015479282123 -54.60000000000006
+ vertex 24.01398212090928 171.37061741415093 -54.117638090205105
+ vertex 38.34583377348742 146.54712218534561 -54.117638090205105
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 38.34583377348742 146.54712218534561 -54.117638090205105
+ vertex 24.01398212090928 171.37061741415093 -54.117638090205105
+ vertex 23.979907947198342 171.42963561424423 -53.60000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 38.34583377348742 146.54712218534561 -54.117638090205105
+ vertex 23.979907947198342 171.42963561424423 -53.60000000000006
+ vertex 38.37990794719835 146.48810398525237 -53.60000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 38.37990794719835 146.48810398525237 -53.60000000000006
+ vertex 23.979907947198342 171.42963561424423 -53.60000000000006
+ vertex 23.979907947198342 171.42963561424423 -51.60000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 38.37990794719835 146.48810398525237 -53.60000000000006
+ vertex 23.979907947198342 171.42963561424423 -51.60000000000005
+ vertex 38.37990794719835 146.48810398525237 -51.60000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 38.37990794719835 146.48810398525237 -51.60000000000005
+ vertex 23.979907947198342 171.42963561424423 -51.60000000000005
+ vertex 24.01398212090928 171.37061741415093 -51.082361909795004
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 38.37990794719835 146.48810398525237 -51.60000000000005
+ vertex 24.01398212090928 171.37061741415093 -51.082361909795004
+ vertex 38.34583377348741 146.54712218534561 -51.082361909795004
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 38.34583377348741 146.54712218534561 -51.082361909795004
+ vertex 24.01398212090928 171.37061741415093 -51.082361909795004
+ vertex 24.113882543413904 171.19758480667534 -50.600000000000044
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 38.34583377348741 146.54712218534561 -51.082361909795004
+ vertex 24.113882543413904 171.19758480667534 -50.600000000000044
+ vertex 38.24593335098278 146.72015479282123 -50.600000000000044
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 38.24593335098278 146.72015479282123 -50.600000000000044
+ vertex 24.113882543413904 171.19758480667534 -50.600000000000044
+ vertex 24.27280116601179 170.92232967806692 -50.18578643762695
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 38.24593335098278 146.72015479282123 -50.600000000000044
+ vertex 24.27280116601179 170.92232967806692 -50.18578643762695
+ vertex 38.0870147283849 146.99540992142965 -50.18578643762695
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 38.0870147283849 146.99540992142965 -50.18578643762695
+ vertex 24.27280116601179 170.92232967806692 -50.18578643762695
+ vertex 24.47990794719834 170.56361021045979 -49.867949192431176
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 38.0870147283849 146.99540992142965 -50.18578643762695
+ vertex 24.47990794719834 170.56361021045979 -49.867949192431176
+ vertex 37.87990794719835 147.35412938903679 -49.867949192431176
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 37.87990794719835 147.35412938903679 -49.867949192431176
+ vertex 24.47990794719834 170.56361021045979 -49.867949192431176
+ vertex 24.721088902095826 170.14587254275935 -49.668148347421905
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 37.87990794719835 147.35412938903679 -49.867949192431176
+ vertex 24.721088902095826 170.14587254275935 -49.668148347421905
+ vertex 37.638726992300874 147.77186705673722 -49.668148347421905
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 37.638726992300874 147.77186705673722 -49.668148347421905
+ vertex 24.721088902095826 170.14587254275935 -49.668148347421905
+ vertex 24.97990794719836 169.69758480667534 -49.600000000000044
+ endloop
+endfacet
+facet normal 0.8660254037844388 0.49999999999999956 -1.2429902774456655e-16
+ outer loop
+ vertex 37.638726992300874 147.77186705673722 -49.668148347421905
+ vertex 24.97990794719836 169.69758480667534 -49.600000000000044
+ vertex 37.37990794719835 148.22015479282123 -49.600000000000044
+ endloop
+endfacet
+facet normal -1.955820234179363e-16 6.381155944511759e-16 1.0
+ outer loop
+ vertex -23.137718859013145 168.6975848066754 -10.00000000000005
+ vertex -37.2697696665819 148.22015479282132 -10.000000000000037
+ vertex -35.53771885901319 147.22015479282135 -10.000000000000037
+ endloop
+endfacet
+facet normal -1.955820234179363e-16 6.381155944511759e-16 1.0
+ outer loop
+ vertex -37.2697696665819 148.22015479282132 -10.000000000000037
+ vertex -23.137718859013145 168.6975848066754 -10.00000000000005
+ vertex -24.869769666581853 169.6975848066754 -10.00000000000005
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 24.721088902095847 170.14587254275938 -15.931851652578198
+ vertex 37.37990794719836 148.22015479282126 -16.00000000000006
+ vertex 24.97990794719836 169.69758480667534 -16.00000000000006
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 37.37990794719836 148.22015479282126 -16.00000000000006
+ vertex 24.721088902095847 170.14587254275938 -15.931851652578198
+ vertex 37.63872699230088 147.77186705673722 -15.931851652578198
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 37.63872699230088 147.77186705673722 -15.931851652578198
+ vertex 24.721088902095847 170.14587254275938 -15.931851652578198
+ vertex 24.479907947198363 170.56361021045976 -15.732050807568937
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 37.63872699230088 147.77186705673722 -15.931851652578198
+ vertex 24.479907947198363 170.56361021045976 -15.732050807568937
+ vertex 37.87990794719836 147.3541293890368 -15.732050807568937
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 37.87990794719836 147.3541293890368 -15.732050807568937
+ vertex 24.479907947198363 170.56361021045976 -15.732050807568937
+ vertex 24.272801166011813 170.92232967806692 -15.414213562373153
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 37.87990794719836 147.3541293890368 -15.732050807568937
+ vertex 24.272801166011813 170.92232967806692 -15.414213562373153
+ vertex 38.08701472838491 146.99540992142965 -15.414213562373153
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 38.08701472838491 146.99540992142965 -15.414213562373153
+ vertex 24.272801166011813 170.92232967806692 -15.414213562373153
+ vertex 24.11388254341393 171.19758480667534 -15.000000000000057
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 38.08701472838491 146.99540992142965 -15.414213562373153
+ vertex 24.11388254341393 171.19758480667534 -15.000000000000057
+ vertex 38.245933350982796 146.72015479282123 -15.000000000000057
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 38.245933350982796 146.72015479282123 -15.000000000000057
+ vertex 24.11388254341393 171.19758480667534 -15.000000000000057
+ vertex 24.0139821209093 171.37061741415096 -14.517638090205098
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 38.245933350982796 146.72015479282123 -15.000000000000057
+ vertex 24.0139821209093 171.37061741415096 -14.517638090205098
+ vertex 38.345833773487435 146.54712218534564 -14.517638090205098
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 38.345833773487435 146.54712218534564 -14.517638090205098
+ vertex 24.0139821209093 171.37061741415096 -14.517638090205098
+ vertex 23.979907947198363 171.42963561424423 -14.000000000000059
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 38.345833773487435 146.54712218534564 -14.517638090205098
+ vertex 23.979907947198363 171.42963561424423 -14.000000000000059
+ vertex 38.37990794719836 146.4881039852524 -14.000000000000059
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 38.37990794719836 146.4881039852524 -14.000000000000059
+ vertex 23.979907947198363 171.42963561424423 -14.000000000000059
+ vertex 23.979907947198363 171.42963561424423 -12.000000000000046
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 38.37990794719836 146.4881039852524 -14.000000000000059
+ vertex 23.979907947198363 171.42963561424423 -12.000000000000046
+ vertex 38.37990794719836 146.4881039852524 -12.000000000000046
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 38.37990794719836 146.4881039852524 -12.000000000000046
+ vertex 23.979907947198363 171.42963561424423 -12.000000000000046
+ vertex 24.0139821209093 171.37061741415096 -11.482361909795012
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 38.37990794719836 146.4881039852524 -12.000000000000046
+ vertex 24.0139821209093 171.37061741415096 -11.482361909795012
+ vertex 38.34583377348742 146.54712218534564 -11.482361909795012
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 38.34583377348742 146.54712218534564 -11.482361909795012
+ vertex 24.0139821209093 171.37061741415096 -11.482361909795012
+ vertex 24.11388254341393 171.19758480667534 -11.000000000000048
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 38.34583377348742 146.54712218534564 -11.482361909795012
+ vertex 24.11388254341393 171.19758480667534 -11.000000000000048
+ vertex 38.245933350982796 146.72015479282123 -11.000000000000048
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 38.245933350982796 146.72015479282123 -11.000000000000048
+ vertex 24.11388254341393 171.19758480667534 -11.000000000000048
+ vertex 24.272801166011813 170.92232967806694 -10.58578643762696
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 38.245933350982796 146.72015479282123 -11.000000000000048
+ vertex 24.272801166011813 170.92232967806694 -10.58578643762696
+ vertex 38.08701472838491 146.99540992142965 -10.58578643762696
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 38.08701472838491 146.99540992142965 -10.58578643762696
+ vertex 24.272801166011813 170.92232967806694 -10.58578643762696
+ vertex 24.479907947198363 170.56361021045979 -10.267949192431178
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 38.08701472838491 146.99540992142965 -10.58578643762696
+ vertex 24.479907947198363 170.56361021045979 -10.267949192431178
+ vertex 37.87990794719836 147.3541293890368 -10.267949192431178
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 37.87990794719836 147.3541293890368 -10.267949192431178
+ vertex 24.479907947198363 170.56361021045979 -10.267949192431178
+ vertex 24.721088902095847 170.14587254275938 -10.068148347421912
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 37.87990794719836 147.3541293890368 -10.267949192431178
+ vertex 24.721088902095847 170.14587254275938 -10.068148347421912
+ vertex 37.63872699230088 147.77186705673722 -10.068148347421912
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 37.63872699230088 147.77186705673722 -10.068148347421912
+ vertex 24.721088902095847 170.14587254275938 -10.068148347421912
+ vertex 24.97990794719836 169.69758480667534 -10.00000000000005
+ endloop
+endfacet
+facet normal 0.866025403784439 0.49999999999999956 -2.0134478754370044e-16
+ outer loop
+ vertex 37.63872699230088 147.77186705673722 -10.068148347421912
+ vertex 24.97990794719836 169.69758480667534 -10.00000000000005
+ vertex 37.37990794719836 148.22015479282126 -10.00000000000005
+ endloop
+endfacet
+facet normal -0.46193976625564453 -0.8001031451912668 -0.38268343236508623
+ outer loop
+ vertex -36.50364468530227 145.54712218534573 -14.517638090205088
+ vertex -38.13579507036633 146.72015479282132 -15.000000000000046
+ vertex -36.40374426279762 145.72015479282135 -15.000000000000046
+ endloop
+endfacet
+facet normal -0.46193976625564453 -0.8001031451912668 -0.38268343236508623
+ outer loop
+ vertex -38.13579507036633 146.72015479282132 -15.000000000000046
+ vertex -36.50364468530227 145.54712218534573 -14.517638090205088
+ vertex -38.23569549287098 146.5471221853457 -14.517638090205088
+ endloop
+endfacet
+facet normal 0.06526309611002716 0.11303899832181666 -0.9914448613738102
+ outer loop
+ vertex -24.869769666581853 169.6975848066754 -16.000000000000068
+ vertex -22.878899813910653 169.14587254275943 -15.931851652578203
+ vertex -23.137718859013145 168.6975848066754 -16.000000000000068
+ endloop
+endfacet
+facet normal 0.06526309611002716 0.11303899832181666 -0.9914448613738102
+ outer loop
+ vertex -22.878899813910653 169.14587254275943 -15.931851652578203
+ vertex -24.869769666581853 169.6975848066754 -16.000000000000068
+ vertex -24.610950621479365 170.1458725427594 -15.931851652578203
+ endloop
+endfacet
+facet normal 0.19134171618253754 0.3314135740355793 0.9238795325112927
+ outer loop
+ vertex -22.637718859013166 169.56361021045984 -10.267949192431178
+ vertex -24.610950621479365 170.1458725427594 -10.068148347421925
+ vertex -22.878899813910653 169.14587254275943 -10.068148347421925
+ endloop
+endfacet
+facet normal 0.19134171618253754 0.3314135740355793 0.9238795325112927
+ outer loop
+ vertex -24.610950621479365 170.1458725427594 -10.068148347421925
+ vertex -22.637718859013166 169.56361021045984 -10.267949192431178
+ vertex -24.369769666581877 170.56361021045984 -10.267949192431178
+ endloop
+endfacet
+facet normal 0.3966766701456142 0.6870641468694425 -0.6087614290087314
+ outer loop
+ vertex -22.430612077826595 169.922329678067 -15.414213562373158
+ vertex -24.00374426279742 171.1975848066754 -15.000000000000062
+ vertex -22.27169345522871 170.19758480667542 -15.000000000000062
+ endloop
+endfacet
+facet normal 0.3966766701456142 0.6870641468694425 -0.6087614290087314
+ outer loop
+ vertex -24.00374426279742 171.1975848066754 -15.000000000000062
+ vertex -22.430612077826595 169.922329678067 -15.414213562373158
+ vertex -24.162662885395303 170.92232967806697 -15.414213562373158
+ endloop
+endfacet
+facet normal 8.187369750874685e-17 -8.350641921694922e-16 -1.0
+ outer loop
+ vertex -37.2697696665819 148.22015479282132 -16.00000000000005
+ vertex -23.137718859013145 168.6975848066754 -16.000000000000068
+ vertex -35.53771885901319 147.22015479282135 -16.00000000000005
+ endloop
+endfacet
+facet normal 8.187369750874685e-17 -8.350641921694922e-16 -1.0
+ outer loop
+ vertex -23.137718859013145 168.6975848066754 -16.000000000000068
+ vertex -37.2697696665819 148.22015479282132 -16.00000000000005
+ vertex -24.869769666581853 169.6975848066754 -16.000000000000068
+ endloop
+endfacet
+facet normal -0.46193976625564787 -0.8001031451912716 0.38268343236507196
+ outer loop
+ vertex -38.13579507036633 146.72015479282132 -11.000000000000036
+ vertex -36.50364468530225 145.54712218534573 -11.482361909795
+ vertex -36.40374426279762 145.72015479282135 -11.000000000000036
+ endloop
+endfacet
+facet normal -0.46193976625564787 -0.8001031451912716 0.38268343236507196
+ outer loop
+ vertex -36.50364468530225 145.54712218534573 -11.482361909795
+ vertex -38.13579507036633 146.72015479282132 -11.000000000000036
+ vertex -38.23569549287096 146.5471221853457 -11.482361909795
+ endloop
+endfacet
+facet normal -0.4957224306869066 -0.8586164364012622 -0.130526192220038
+ outer loop
+ vertex -36.53771885901319 145.48810398525248 -14.000000000000048
+ vertex -38.23569549287098 146.5471221853457 -14.517638090205088
+ vertex -36.50364468530227 145.54712218534573 -14.517638090205088
+ endloop
+endfacet
+facet normal -0.4957224306869066 -0.8586164364012622 -0.130526192220038
+ outer loop
+ vertex -38.23569549287098 146.5471221853457 -14.517638090205088
+ vertex -36.53771885901319 145.48810398525248 -14.000000000000048
+ vertex -38.269769666581894 146.48810398525245 -14.000000000000048
+ endloop
+endfacet
+facet normal -0.39667667014561453 -0.687064146869443 0.6087614290087309
+ outer loop
+ vertex -37.97687644776845 146.99540992142974 -10.585786437626947
+ vertex -36.40374426279762 145.72015479282135 -11.000000000000036
+ vertex -36.244825640199736 145.99540992142974 -10.585786437626947
+ endloop
+endfacet
+facet normal -0.39667667014561453 -0.687064146869443 0.6087614290087309
+ outer loop
+ vertex -36.40374426279762 145.72015479282135 -11.000000000000036
+ vertex -37.97687644776845 146.99540992142974 -10.585786437626947
+ vertex -38.13579507036633 146.72015479282132 -11.000000000000036
+ endloop
+endfacet
+facet normal -0.3043807145043568 -0.5272028623656615 0.7933533402912416
+ outer loop
+ vertex -36.03771885901319 146.3541293890369 -10.267949192431168
+ vertex -37.97687644776845 146.99540992142974 -10.585786437626947
+ vertex -36.244825640199736 145.99540992142974 -10.585786437626947
+ endloop
+endfacet
+facet normal -0.3043807145043568 -0.5272028623656615 0.7933533402912416
+ outer loop
+ vertex -37.97687644776845 146.99540992142974 -10.585786437626947
+ vertex -36.03771885901319 146.3541293890369 -10.267949192431168
+ vertex -37.769769666581894 147.3541293890369 -10.267949192431168
+ endloop
+endfacet
+facet normal 0.1913417161825495 0.33141357403559835 -0.9238795325112834
+ outer loop
+ vertex -24.610950621479365 170.1458725427594 -15.931851652578203
+ vertex -22.637718859013166 169.56361021045984 -15.732050807568942
+ vertex -22.878899813910653 169.14587254275943 -15.931851652578203
+ endloop
+endfacet
+facet normal 0.1913417161825495 0.33141357403559835 -0.9238795325112834
+ outer loop
+ vertex -22.637718859013166 169.56361021045984 -15.732050807568942
+ vertex -24.610950621479365 170.1458725427594 -15.931851652578203
+ vertex -24.369769666581877 170.5636102104598 -15.732050807568942
+ endloop
+endfacet
+facet normal -0.19134171618255466 -0.3314135740356073 0.9238795325112792
+ outer loop
+ vertex -35.79653790411572 146.77186705673734 -10.068148347421902
+ vertex -37.769769666581894 147.3541293890369 -10.267949192431168
+ vertex -36.03771885901319 146.3541293890369 -10.267949192431168
+ endloop
+endfacet
+facet normal -0.19134171618255466 -0.3314135740356073 0.9238795325112792
+ outer loop
+ vertex -37.769769666581894 147.3541293890369 -10.267949192431168
+ vertex -35.79653790411572 146.77186705673734 -10.068148347421902
+ vertex -37.528588711684435 147.7718670567373 -10.068148347421902
+ endloop
+endfacet
+facet normal -0.06526309611002556 -0.1130389983218139 0.9914448613738106
+ outer loop
+ vertex -35.53771885901319 147.22015479282135 -10.000000000000037
+ vertex -37.528588711684435 147.7718670567373 -10.068148347421902
+ vertex -35.79653790411572 146.77186705673734 -10.068148347421902
+ endloop
+endfacet
+facet normal -0.06526309611002556 -0.1130389983218139 0.9914448613738106
+ outer loop
+ vertex -37.528588711684435 147.7718670567373 -10.068148347421902
+ vertex -35.53771885901319 147.22015479282135 -10.000000000000037
+ vertex -37.2697696665819 148.22015479282132 -10.000000000000037
+ endloop
+endfacet
+facet normal -0.1913417161825493 -0.33141357403559973 -0.9238795325112831
+ outer loop
+ vertex -37.769769666581894 147.35412938903687 -15.732050807568926
+ vertex -35.79653790411572 146.7718670567373 -15.931851652578185
+ vertex -36.03771885901319 146.3541293890369 -15.732050807568926
+ endloop
+endfacet
+facet normal -0.1913417161825493 -0.33141357403559973 -0.9238795325112831
+ outer loop
+ vertex -35.79653790411572 146.7718670567373 -15.931851652578185
+ vertex -37.769769666581894 147.35412938903687 -15.732050807568926
+ vertex -37.528588711684435 147.7718670567373 -15.931851652578185
+ endloop
+endfacet
+facet normal -0.5000000000000006 -0.8660254037844384 1.525901372395458e-31
+ outer loop
+ vertex -38.269769666581894 146.48810398525245 -12.000000000000034
+ vertex -36.53771885901319 145.48810398525248 -14.000000000000048
+ vertex -36.53771885901319 145.48810398525248 -12.000000000000034
+ endloop
+endfacet
+facet normal -0.5000000000000006 -0.8660254037844384 1.525901372395458e-31
+ outer loop
+ vertex -36.53771885901319 145.48810398525248 -14.000000000000048
+ vertex -38.269769666581894 146.48810398525245 -12.000000000000034
+ vertex -38.269769666581894 146.48810398525245 -14.000000000000048
+ endloop
+endfacet
+facet normal 0.3966766701456168 0.6870641468694481 0.6087614290087235
+ outer loop
+ vertex -24.00374426279742 171.1975848066754 -11.000000000000048
+ vertex -22.430612077826595 169.92232967806703 -10.58578643762697
+ vertex -22.27169345522871 170.19758480667542 -11.000000000000048
+ endloop
+endfacet
+facet normal 0.3966766701456168 0.6870641468694481 0.6087614290087235
+ outer loop
+ vertex -22.430612077826595 169.92232967806703 -10.58578643762697
+ vertex -24.00374426279742 171.1975848066754 -11.000000000000048
+ vertex -24.162662885395303 170.922329678067 -10.58578643762697
+ endloop
+endfacet
+facet normal -0.3043807145043595 -0.5272028623656677 -0.7933533402912364
+ outer loop
+ vertex -37.97687644776845 146.9954099214297 -15.41421356237314
+ vertex -36.03771885901319 146.3541293890369 -15.732050807568926
+ vertex -36.244825640199736 145.99540992142974 -15.41421356237314
+ endloop
+endfacet
+facet normal -0.3043807145043595 -0.5272028623656677 -0.7933533402912364
+ outer loop
+ vertex -36.03771885901319 146.3541293890369 -15.732050807568926
+ vertex -37.97687644776845 146.9954099214297 -15.41421356237314
+ vertex -37.769769666581894 147.35412938903687 -15.732050807568926
+ endloop
+endfacet
+facet normal 0.3043807145043554 0.5272028623656606 0.7933533402912427
+ outer loop
+ vertex -22.430612077826595 169.92232967806703 -10.58578643762697
+ vertex -24.369769666581877 170.56361021045984 -10.267949192431178
+ vertex -22.637718859013166 169.56361021045984 -10.267949192431178
+ endloop
+endfacet
+facet normal 0.3043807145043554 0.5272028623656606 0.7933533402912427
+ outer loop
+ vertex -24.369769666581877 170.56361021045984 -10.267949192431178
+ vertex -22.430612077826595 169.92232967806703 -10.58578643762697
+ vertex -24.162662885395303 170.922329678067 -10.58578643762697
+ endloop
+endfacet
+facet normal 0.4619397662556512 0.8001031451912782 0.3826834323650538
+ outer loop
+ vertex -23.903843840292815 171.370617414151 -11.482361909795022
+ vertex -22.27169345522871 170.19758480667542 -11.000000000000048
+ vertex -22.171793032724107 170.37061741415104 -11.482361909795022
+ endloop
+endfacet
+facet normal 0.4619397662556512 0.8001031451912782 0.3826834323650538
+ outer loop
+ vertex -22.27169345522871 170.19758480667542 -11.000000000000048
+ vertex -23.903843840292815 171.370617414151 -11.482361909795022
+ vertex -24.00374426279742 171.1975848066754 -11.000000000000048
+ endloop
+endfacet
+facet normal 0.46193976625564925 0.8001031451912741 -0.38268343236506536
+ outer loop
+ vertex -22.27169345522871 170.19758480667542 -15.000000000000062
+ vertex -23.903843840292815 171.370617414151 -14.517638090205104
+ vertex -22.171793032724107 170.37061741415104 -14.517638090205104
+ endloop
+endfacet
+facet normal 0.46193976625564925 0.8001031451912741 -0.38268343236506536
+ outer loop
+ vertex -23.903843840292815 171.370617414151 -14.517638090205104
+ vertex -22.27169345522871 170.19758480667542 -15.000000000000062
+ vertex -24.00374426279742 171.1975848066754 -15.000000000000062
+ endloop
+endfacet
+facet normal 0.4957224306869045 0.8586164364012583 -0.13052619222007125
+ outer loop
+ vertex -22.171793032724107 170.37061741415104 -14.517638090205104
+ vertex -23.869769666581856 171.42963561424426 -14.000000000000064
+ vertex -22.137718859013145 170.4296356142443 -14.000000000000064
+ endloop
+endfacet
+facet normal 0.4957224306869045 0.8586164364012583 -0.13052619222007125
+ outer loop
+ vertex -23.869769666581856 171.42963561424426 -14.000000000000064
+ vertex -22.171793032724107 170.37061741415104 -14.517638090205104
+ vertex -23.903843840292815 171.370617414151 -14.517638090205104
+ endloop
+endfacet
+facet normal -0.49572243068690597 -0.8586164364012608 0.13052619222005002
+ outer loop
+ vertex -38.23569549287096 146.5471221853457 -11.482361909795
+ vertex -36.53771885901319 145.48810398525248 -12.000000000000034
+ vertex -36.50364468530225 145.54712218534573 -11.482361909795
+ endloop
+endfacet
+facet normal -0.49572243068690597 -0.8586164364012608 0.13052619222005002
+ outer loop
+ vertex -36.53771885901319 145.48810398525248 -12.000000000000034
+ vertex -38.23569549287096 146.5471221853457 -11.482361909795
+ vertex -38.269769666581894 146.48810398525245 -12.000000000000034
+ endloop
+endfacet
+facet normal -0.3966766701456182 -0.6870641468694506 -0.6087614290087197
+ outer loop
+ vertex -36.40374426279762 145.72015479282135 -15.000000000000046
+ vertex -37.97687644776845 146.9954099214297 -15.41421356237314
+ vertex -36.244825640199736 145.99540992142974 -15.41421356237314
+ endloop
+endfacet
+facet normal -0.3966766701456182 -0.6870641468694506 -0.6087614290087197
+ outer loop
+ vertex -37.97687644776845 146.9954099214297 -15.41421356237314
+ vertex -36.40374426279762 145.72015479282135 -15.000000000000046
+ vertex -38.13579507036633 146.72015479282132 -15.000000000000046
+ endloop
+endfacet
+facet normal 0.30438071450435267 0.5272028623656544 -0.7933533402912479
+ outer loop
+ vertex -24.369769666581877 170.5636102104598 -15.732050807568942
+ vertex -22.430612077826595 169.922329678067 -15.414213562373158
+ vertex -22.637718859013166 169.56361021045984 -15.732050807568942
+ endloop
+endfacet
+facet normal 0.30438071450435267 0.5272028623656544 -0.7933533402912479
+ outer loop
+ vertex -22.430612077826595 169.922329678067 -15.414213562373158
+ vertex -24.369769666581877 170.5636102104598 -15.732050807568942
+ vertex -24.162662885395303 170.92232967806697 -15.414213562373158
+ endloop
+endfacet
+facet normal -0.06526309611002473 -0.11303899832181435 -0.9914448613738106
+ outer loop
+ vertex -37.528588711684435 147.7718670567373 -15.931851652578185
+ vertex -35.53771885901319 147.22015479282135 -16.00000000000005
+ vertex -35.79653790411572 146.7718670567373 -15.931851652578185
+ endloop
+endfacet
+facet normal -0.06526309611002473 -0.11303899832181435 -0.9914448613738106
+ outer loop
+ vertex -35.53771885901319 147.22015479282135 -16.00000000000005
+ vertex -37.528588711684435 147.7718670567373 -15.931851652578185
+ vertex -37.2697696665819 148.22015479282132 -16.00000000000005
+ endloop
+endfacet
+facet normal 0.06526309611003694 0.11303899832183552 0.9914448613738074
+ outer loop
+ vertex -22.878899813910653 169.14587254275943 -10.068148347421925
+ vertex -24.869769666581853 169.6975848066754 -10.00000000000005
+ vertex -23.137718859013145 168.6975848066754 -10.00000000000005
+ endloop
+endfacet
+facet normal 0.06526309611003694 0.11303899832183552 0.9914448613738074
+ outer loop
+ vertex -24.869769666581853 169.6975848066754 -10.00000000000005
+ vertex -22.878899813910653 169.14587254275943 -10.068148347421925
+ vertex -24.610950621479365 170.1458725427594 -10.068148347421925
+ endloop
+endfacet
+facet normal 0.5000000000000006 0.8660254037844384 -1.525901372395458e-31
+ outer loop
+ vertex -23.869769666581856 171.42963561424426 -14.000000000000064
+ vertex -22.137718859013145 170.4296356142443 -12.000000000000052
+ vertex -22.137718859013145 170.4296356142443 -14.000000000000064
+ endloop
+endfacet
+facet normal 0.5000000000000006 0.8660254037844384 -1.525901372395458e-31
+ outer loop
+ vertex -22.137718859013145 170.4296356142443 -12.000000000000052
+ vertex -23.869769666581856 171.42963561424426 -14.000000000000064
+ vertex -23.869769666581856 171.42963561424426 -12.000000000000052
+ endloop
+endfacet
+facet normal 0.4957224306869044 0.8586164364012585 0.13052619222007267
+ outer loop
+ vertex -23.869769666581856 171.42963561424426 -12.000000000000052
+ vertex -22.171793032724107 170.37061741415104 -11.482361909795022
+ vertex -22.137718859013145 170.4296356142443 -12.000000000000052
+ endloop
+endfacet
+facet normal 0.4957224306869044 0.8586164364012585 0.13052619222007267
+ outer loop
+ vertex -22.171793032724107 170.37061741415104 -11.482361909795022
+ vertex -23.869769666581856 171.42963561424426 -12.000000000000052
+ vertex -23.903843840292815 171.370617414151 -11.482361909795022
+ endloop
+endfacet
+facet normal -0.3966766701456202 0.6870641468694442 0.6087614290087258
+ outer loop
+ vertex 24.113882543413904 171.19758480667534 -50.600000000000044
+ vertex 22.540750358442942 169.92232967806692 -50.18578643762695
+ vertex 24.27280116601179 170.92232967806692 -50.18578643762695
+ endloop
+endfacet
+facet normal -0.3966766701456202 0.6870641468694442 0.6087614290087258
+ outer loop
+ vertex 22.540750358442942 169.92232967806692 -50.18578643762695
+ vertex 24.113882543413904 171.19758480667534 -50.600000000000044
+ vertex 22.381831735845036 170.19758480667534 -50.600000000000044
+ endloop
+endfacet
+facet normal -0.5000000000000143 0.8660254037844303 -9.325056343474193e-32
+ outer loop
+ vertex 22.247857139629495 170.4296356142442 -53.60000000000006
+ vertex 23.979907947198342 171.42963561424423 -51.60000000000005
+ vertex 23.979907947198342 171.42963561424423 -53.60000000000006
+ endloop
+endfacet
+facet normal -0.5000000000000143 0.8660254037844303 -9.325056343474193e-32
+ outer loop
+ vertex 23.979907947198342 171.42963561424423 -51.60000000000005
+ vertex 22.247857139629495 170.4296356142442 -53.60000000000006
+ vertex 22.247857139629495 170.4296356142442 -51.60000000000005
+ endloop
+endfacet
+facet normal -0.0652630961100252 0.11303899832181412 0.9914448613738107
+ outer loop
+ vertex 24.97990794719836 169.69758480667534 -49.600000000000044
+ vertex 22.989038094526958 169.14587254275935 -49.668148347421905
+ vertex 23.24785713962949 168.69758480667534 -49.600000000000044
+ endloop
+endfacet
+facet normal -0.0652630961100252 0.11303899832181412 0.9914448613738107
+ outer loop
+ vertex 22.989038094526958 169.14587254275935 -49.668148347421905
+ vertex 24.97990794719836 169.69758480667534 -49.600000000000044
+ vertex 24.721088902095826 170.14587254275935 -49.668148347421905
+ endloop
+endfacet
+facet normal -0.4619397662556454 0.8001031451912711 -0.3826834323650756
+ outer loop
+ vertex 22.381831735845036 170.19758480667534 -54.60000000000006
+ vertex 24.01398212090928 171.37061741415093 -54.117638090205105
+ vertex 24.113882543413904 171.19758480667534 -54.60000000000006
+ endloop
+endfacet
+facet normal -0.4619397662556454 0.8001031451912711 -0.3826834323650756
+ outer loop
+ vertex 24.01398212090928 171.37061741415093 -54.117638090205105
+ vertex 22.381831735845036 170.19758480667534 -54.60000000000006
+ vertex 22.28193131334041 170.37061741415096 -54.117638090205105
+ endloop
+endfacet
+facet normal -0.4619397662556462 0.8001031451912726 0.3826834323650719
+ outer loop
+ vertex 24.01398212090928 171.37061741415093 -51.082361909795004
+ vertex 22.381831735845036 170.19758480667534 -50.600000000000044
+ vertex 24.113882543413904 171.19758480667534 -50.600000000000044
+ endloop
+endfacet
+facet normal -0.4619397662556462 0.8001031451912726 0.3826834323650719
+ outer loop
+ vertex 22.381831735845036 170.19758480667534 -50.600000000000044
+ vertex 24.01398212090928 171.37061741415093 -51.082361909795004
+ vertex 22.28193131334041 170.37061741415096 -51.082361909795004
+ endloop
+endfacet
+facet normal -0.4957224306869124 0.8586164364012558 0.13052619222005787
+ outer loop
+ vertex 23.979907947198342 171.42963561424423 -51.60000000000005
+ vertex 22.28193131334041 170.37061741415096 -51.082361909795004
+ vertex 24.01398212090928 171.37061741415093 -51.082361909795004
+ endloop
+endfacet
+facet normal -0.4957224306869124 0.8586164364012558 0.13052619222005787
+ outer loop
+ vertex 22.28193131334041 170.37061741415096 -51.082361909795004
+ vertex 23.979907947198342 171.42963561424423 -51.60000000000005
+ vertex 22.247857139629495 170.4296356142442 -51.60000000000005
+ endloop
+endfacet
+facet normal -0.06526309611002525 0.11303899832181417 -0.9914448613738107
+ outer loop
+ vertex 22.989038094526958 169.14587254275935 -55.531851652578204
+ vertex 24.97990794719836 169.69758480667534 -55.600000000000065
+ vertex 23.24785713962949 168.69758480667534 -55.600000000000065
+ endloop
+endfacet
+facet normal -0.06526309611002525 0.11303899832181417 -0.9914448613738107
+ outer loop
+ vertex 24.97990794719836 169.69758480667534 -55.600000000000065
+ vertex 22.989038094526958 169.14587254275935 -55.531851652578204
+ vertex 24.721088902095826 170.14587254275935 -55.531851652578204
+ endloop
+endfacet
+facet normal -0.3043807145043695 0.5272028623656716 0.7933533402912301
+ outer loop
+ vertex 24.47990794719834 170.56361021045979 -49.867949192431176
+ vertex 22.540750358442942 169.92232967806692 -50.18578643762695
+ vertex 22.74785713962945 169.56361021045976 -49.867949192431176
+ endloop
+endfacet
+facet normal -0.3043807145043695 0.5272028623656716 0.7933533402912301
+ outer loop
+ vertex 22.540750358442942 169.92232967806692 -50.18578643762695
+ vertex 24.47990794719834 170.56361021045979 -49.867949192431176
+ vertex 24.27280116601179 170.92232967806692 -50.18578643762695
+ endloop
+endfacet
+facet normal 0.06526309611002598 -0.11303899832181545 -0.9914448613738105
+ outer loop
+ vertex 35.647857139629494 147.22015479282126 -16.00000000000006
+ vertex 37.63872699230088 147.77186705673722 -15.931851652578198
+ vertex 35.906676184732014 146.77186705673722 -15.931851652578198
+ endloop
+endfacet
+facet normal 0.06526309611002598 -0.11303899832181545 -0.9914448613738105
+ outer loop
+ vertex 37.63872699230088 147.77186705673722 -15.931851652578198
+ vertex 35.647857139629494 147.22015479282126 -16.00000000000006
+ vertex 37.37990794719836 148.22015479282126 -16.00000000000006
+ endloop
+endfacet
+facet normal 0.3043807145043602 -0.5272028623656676 -0.7933533402912363
+ outer loop
+ vertex 36.14785713962948 146.3541293890368 -15.732050807568937
+ vertex 38.08701472838491 146.99540992142965 -15.414213562373153
+ vertex 36.35496392081605 145.99540992142965 -15.414213562373153
+ endloop
+endfacet
+facet normal 0.3043807145043602 -0.5272028623656676 -0.7933533402912363
+ outer loop
+ vertex 38.08701472838491 146.99540992142965 -15.414213562373153
+ vertex 36.14785713962948 146.3541293890368 -15.732050807568937
+ vertex 37.87990794719836 147.3541293890368 -15.732050807568937
+ endloop
+endfacet
+facet normal -0.49572243068690736 0.8586164364012631 -0.13052619222003028
+ outer loop
+ vertex 22.28193131334041 170.37061741415096 -14.517638090205098
+ vertex 23.979907947198363 171.42963561424423 -14.000000000000059
+ vertex 24.0139821209093 171.37061741415096 -14.517638090205098
+ endloop
+endfacet
+facet normal -0.49572243068690736 0.8586164364012631 -0.13052619222003028
+ outer loop
+ vertex 23.979907947198363 171.42963561424423 -14.000000000000059
+ vertex 22.28193131334041 170.37061741415096 -14.517638090205098
+ vertex 22.247857139629495 170.4296356142442 -14.000000000000059
+ endloop
+endfacet
+facet normal 5.933957380480184e-32 1.4193619471206742e-31 1.0
+ outer loop
+ vertex 37.37990794719836 148.22015479282126 -10.00000000000005
+ vertex 23.24785713962949 168.69758480667534 -10.00000000000005
+ vertex 35.647857139629494 147.22015479282126 -10.00000000000005
+ endloop
+endfacet
+facet normal 5.933957380480184e-32 1.4193619471206742e-31 1.0
+ outer loop
+ vertex 23.24785713962949 168.69758480667534 -10.00000000000005
+ vertex 37.37990794719836 148.22015479282126 -10.00000000000005
+ vertex 24.97990794719836 169.69758480667534 -10.00000000000005
+ endloop
+endfacet
+facet normal 0.46193976625564237 -0.800103145191271 0.3826834323650798
+ outer loop
+ vertex 38.245933350982796 146.72015479282123 -11.000000000000048
+ vertex 36.613782965918546 145.54712218534564 -11.482361909795012
+ vertex 38.34583377348742 146.54712218534564 -11.482361909795012
+ endloop
+endfacet
+facet normal 0.46193976625564237 -0.800103145191271 0.3826834323650798
+ outer loop
+ vertex 36.613782965918546 145.54712218534564 -11.482361909795012
+ vertex 38.245933350982796 146.72015479282123 -11.000000000000048
+ vertex 36.513882543413914 145.72015479282126 -11.000000000000048
+ endloop
+endfacet
+facet normal 0.5000000000000011 -0.8660254037844379 9.32505634347438e-32
+ outer loop
+ vertex 36.647857139629494 145.4881039852524 -12.000000000000046
+ vertex 38.37990794719836 146.4881039852524 -14.000000000000059
+ vertex 38.37990794719836 146.4881039852524 -12.000000000000046
+ endloop
+endfacet
+facet normal 0.5000000000000011 -0.8660254037844379 9.32505634347438e-32
+ outer loop
+ vertex 38.37990794719836 146.4881039852524 -14.000000000000059
+ vertex 36.647857139629494 145.4881039852524 -12.000000000000046
+ vertex 36.647857139629494 145.4881039852524 -14.000000000000059
+ endloop
+endfacet
+facet normal 0.1913417161825481 -0.33141357403559657 -0.9238795325112844
+ outer loop
+ vertex 35.906676184732014 146.77186705673722 -15.931851652578198
+ vertex 37.87990794719836 147.3541293890368 -15.732050807568937
+ vertex 36.14785713962948 146.3541293890368 -15.732050807568937
+ endloop
+endfacet
+facet normal 0.1913417161825481 -0.33141357403559657 -0.9238795325112844
+ outer loop
+ vertex 37.87990794719836 147.3541293890368 -15.732050807568937
+ vertex 35.906676184732014 146.77186705673722 -15.931851652578198
+ vertex 37.63872699230088 147.77186705673722 -15.931851652578198
+ endloop
+endfacet
+facet normal -0.3966766701456144 0.6870641468694425 -0.6087614290087313
+ outer loop
+ vertex 22.540750358442942 169.92232967806692 -15.414213562373153
+ vertex 24.11388254341393 171.19758480667534 -15.000000000000057
+ vertex 24.272801166011813 170.92232967806692 -15.414213562373153
+ endloop
+endfacet
+facet normal -0.3966766701456144 0.6870641468694425 -0.6087614290087313
+ outer loop
+ vertex 24.11388254341393 171.19758480667534 -15.000000000000057
+ vertex 22.540750358442942 169.92232967806692 -15.414213562373153
+ vertex 22.381831735845058 170.19758480667537 -15.000000000000057
+ endloop
+endfacet
+facet normal 0.46193976625564126 -0.8001031451912691 -0.38268343236508495
+ outer loop
+ vertex 36.61378296591855 145.54712218534564 -14.517638090205098
+ vertex 38.245933350982796 146.72015479282123 -15.000000000000057
+ vertex 38.345833773487435 146.54712218534564 -14.517638090205098
+ endloop
+endfacet
+facet normal 0.46193976625564126 -0.8001031451912691 -0.38268343236508495
+ outer loop
+ vertex 38.245933350982796 146.72015479282123 -15.000000000000057
+ vertex 36.61378296591855 145.54712218534564 -14.517638090205098
+ vertex 36.513882543413914 145.72015479282126 -15.000000000000057
+ endloop
+endfacet
+facet normal 0.3043807145043565 -0.5272028623656612 0.793353340291242
+ outer loop
+ vertex 38.08701472838491 146.99540992142965 -10.58578643762696
+ vertex 36.14785713962948 146.3541293890368 -10.267949192431178
+ vertex 36.35496392081605 145.99540992142965 -10.58578643762696
+ endloop
+endfacet
+facet normal 0.3043807145043565 -0.5272028623656612 0.793353340291242
+ outer loop
+ vertex 36.14785713962948 146.3541293890368 -10.267949192431178
+ vertex 38.08701472838491 146.99540992142965 -10.58578643762696
+ vertex 37.87990794719836 147.3541293890368 -10.267949192431178
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 23.24785713962949 168.69758480667534 -16.00000000000006
+ vertex 37.37990794719836 148.22015479282126 -16.00000000000006
+ vertex 35.647857139629494 147.22015479282126 -16.00000000000006
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 37.37990794719836 148.22015479282126 -16.00000000000006
+ vertex 23.24785713962949 168.69758480667534 -16.00000000000006
+ vertex 24.97990794719836 169.69758480667534 -16.00000000000006
+ endloop
+endfacet
+facet normal 0.39667667014561553 -0.6870641468694507 0.6087614290087214
+ outer loop
+ vertex 38.08701472838491 146.99540992142965 -10.58578643762696
+ vertex 36.513882543413914 145.72015479282126 -11.000000000000048
+ vertex 38.245933350982796 146.72015479282123 -11.000000000000048
+ endloop
+endfacet
+facet normal 0.39667667014561553 -0.6870641468694507 0.6087614290087214
+ outer loop
+ vertex 36.513882543413914 145.72015479282126 -11.000000000000048
+ vertex 38.08701472838491 146.99540992142965 -10.58578643762696
+ vertex 36.35496392081605 145.99540992142965 -10.58578643762696
+ endloop
+endfacet
+facet normal 0.49572243068690486 -0.8586164364012606 0.13052619222005532
+ outer loop
+ vertex 38.34583377348742 146.54712218534564 -11.482361909795012
+ vertex 36.647857139629494 145.4881039852524 -12.000000000000046
+ vertex 38.37990794719836 146.4881039852524 -12.000000000000046
+ endloop
+endfacet
+facet normal 0.49572243068690486 -0.8586164364012606 0.13052619222005532
+ outer loop
+ vertex 36.647857139629494 145.4881039852524 -12.000000000000046
+ vertex 38.34583377348742 146.54712218534564 -11.482361909795012
+ vertex 36.613782965918546 145.54712218534564 -11.482361909795012
+ endloop
+endfacet
+facet normal 0.39667667014561764 -0.6870641468694542 -0.6087614290087162
+ outer loop
+ vertex 36.513882543413914 145.72015479282126 -15.000000000000057
+ vertex 38.08701472838491 146.99540992142965 -15.414213562373153
+ vertex 38.245933350982796 146.72015479282123 -15.000000000000057
+ endloop
+endfacet
+facet normal 0.39667667014561764 -0.6870641468694542 -0.6087614290087162
+ outer loop
+ vertex 38.08701472838491 146.99540992142965 -15.414213562373153
+ vertex 36.513882543413914 145.72015479282126 -15.000000000000057
+ vertex 36.35496392081605 145.99540992142965 -15.414213562373153
+ endloop
+endfacet
+facet normal -0.30438071450435933 0.5272028623656688 -0.7933533402912359
+ outer loop
+ vertex 22.540750358442942 169.92232967806692 -15.414213562373153
+ vertex 24.479907947198363 170.56361021045976 -15.732050807568937
+ vertex 22.74785713962949 169.56361021045976 -15.732050807568937
+ endloop
+endfacet
+facet normal -0.30438071450435933 0.5272028623656688 -0.7933533402912359
+ outer loop
+ vertex 24.479907947198363 170.56361021045976 -15.732050807568937
+ vertex 22.540750358442942 169.92232967806692 -15.414213562373153
+ vertex 24.272801166011813 170.92232967806692 -15.414213562373153
+ endloop
+endfacet
+facet normal 0.06526309611002587 -0.11303899832181528 0.9914448613738105
+ outer loop
+ vertex 37.63872699230088 147.77186705673722 -10.068148347421912
+ vertex 35.647857139629494 147.22015479282126 -10.00000000000005
+ vertex 35.906676184732014 146.77186705673722 -10.068148347421912
+ endloop
+endfacet
+facet normal 0.06526309611002587 -0.11303899832181528 0.9914448613738105
+ outer loop
+ vertex 35.647857139629494 147.22015479282126 -10.00000000000005
+ vertex 37.63872699230088 147.77186705673722 -10.068148347421912
+ vertex 37.37990794719836 148.22015479282126 -10.00000000000005
+ endloop
+endfacet
+facet normal 0.4957224306869051 -0.8586164364012607 -0.13052619222005396
+ outer loop
+ vertex 36.647857139629494 145.4881039852524 -14.000000000000059
+ vertex 38.345833773487435 146.54712218534564 -14.517638090205098
+ vertex 38.37990794719836 146.4881039852524 -14.000000000000059
+ endloop
+endfacet
+facet normal 0.4957224306869051 -0.8586164364012607 -0.13052619222005396
+ outer loop
+ vertex 38.345833773487435 146.54712218534564 -14.517638090205098
+ vertex 36.647857139629494 145.4881039852524 -14.000000000000059
+ vertex 36.61378296591855 145.54712218534564 -14.517638090205098
+ endloop
+endfacet
+facet normal 0.19134171618255252 -0.33141357403560423 0.9238795325112809
+ outer loop
+ vertex 37.87990794719836 147.3541293890368 -10.267949192431178
+ vertex 35.906676184732014 146.77186705673722 -10.068148347421912
+ vertex 36.14785713962948 146.3541293890368 -10.267949192431178
+ endloop
+endfacet
+facet normal 0.19134171618255252 -0.33141357403560423 0.9238795325112809
+ outer loop
+ vertex 35.906676184732014 146.77186705673722 -10.068148347421912
+ vertex 37.87990794719836 147.3541293890368 -10.267949192431178
+ vertex 37.63872699230088 147.77186705673722 -10.068148347421912
+ endloop
+endfacet
+facet normal -0.1913417161825453 0.33141357403559596 0.9238795325112852
+ outer loop
+ vertex 24.721088902095847 170.14587254275938 -10.068148347421912
+ vertex 22.74785713962947 169.56361021045979 -10.267949192431178
+ vertex 22.989038094526958 169.14587254275938 -10.068148347421912
+ endloop
+endfacet
+facet normal -0.1913417161825453 0.33141357403559596 0.9238795325112852
+ outer loop
+ vertex 22.74785713962947 169.56361021045979 -10.267949192431178
+ vertex 24.721088902095847 170.14587254275938 -10.068148347421912
+ vertex 24.479907947198363 170.56361021045979 -10.267949192431178
+ endloop
+endfacet
+facet normal -0.19134171618254786 0.33141357403560007 -0.9238795325112833
+ outer loop
+ vertex 22.74785713962949 169.56361021045976 -15.732050807568937
+ vertex 24.721088902095847 170.14587254275938 -15.931851652578198
+ vertex 22.989038094526958 169.14587254275938 -15.931851652578198
+ endloop
+endfacet
+facet normal -0.19134171618254786 0.33141357403560007 -0.9238795325112833
+ outer loop
+ vertex 24.721088902095847 170.14587254275938 -15.931851652578198
+ vertex 22.74785713962949 169.56361021045976 -15.732050807568937
+ vertex 24.479907947198363 170.56361021045976 -15.732050807568937
+ endloop
+endfacet
+facet normal -0.30438071450436305 0.5272028623656698 0.7933533402912337
+ outer loop
+ vertex 24.479907947198363 170.56361021045979 -10.267949192431178
+ vertex 22.540750358442942 169.92232967806692 -10.58578643762696
+ vertex 22.74785713962947 169.56361021045979 -10.267949192431178
+ endloop
+endfacet
+facet normal -0.30438071450436305 0.5272028623656698 0.7933533402912337
+ outer loop
+ vertex 22.540750358442942 169.92232967806692 -10.58578643762696
+ vertex 24.479907947198363 170.56361021045979 -10.267949192431178
+ vertex 24.272801166011813 170.92232967806694 -10.58578643762696
+ endloop
+endfacet
+facet normal -0.06526309611002444 0.11303899832181351 -0.9914448613738107
+ outer loop
+ vertex 22.989038094526958 169.14587254275938 -15.931851652578198
+ vertex 24.97990794719836 169.69758480667534 -16.00000000000006
+ vertex 23.24785713962949 168.69758480667534 -16.00000000000006
+ endloop
+endfacet
+facet normal -0.06526309611002444 0.11303899832181351 -0.9914448613738107
+ outer loop
+ vertex 24.97990794719836 169.69758480667534 -16.00000000000006
+ vertex 22.989038094526958 169.14587254275938 -15.931851652578198
+ vertex 24.721088902095847 170.14587254275938 -15.931851652578198
+ endloop
+endfacet
+facet normal -0.3966766701456202 0.6870641468694451 0.6087614290087248
+ outer loop
+ vertex 24.11388254341393 171.19758480667534 -11.000000000000048
+ vertex 22.540750358442942 169.92232967806692 -10.58578643762696
+ vertex 24.272801166011813 170.92232967806694 -10.58578643762696
+ endloop
+endfacet
+facet normal -0.3966766701456202 0.6870641468694451 0.6087614290087248
+ outer loop
+ vertex 22.540750358442942 169.92232967806692 -10.58578643762696
+ vertex 24.11388254341393 171.19758480667534 -11.000000000000048
+ vertex 22.381831735845058 170.19758480667537 -11.000000000000048
+ endloop
+endfacet
+facet normal -0.49572243068690736 0.8586164364012631 0.13052619222003028
+ outer loop
+ vertex 23.979907947198363 171.42963561424423 -12.000000000000046
+ vertex 22.28193131334041 170.37061741415096 -11.482361909795012
+ vertex 24.0139821209093 171.37061741415096 -11.482361909795012
+ endloop
+endfacet
+facet normal -0.49572243068690736 0.8586164364012631 0.13052619222003028
+ outer loop
+ vertex 22.28193131334041 170.37061741415096 -11.482361909795012
+ vertex 23.979907947198363 171.42963561424423 -12.000000000000046
+ vertex 22.247857139629495 170.4296356142442 -12.000000000000046
+ endloop
+endfacet
+facet normal -0.06526309611002441 0.11303899832181347 0.9914448613738107
+ outer loop
+ vertex 24.97990794719836 169.69758480667534 -10.00000000000005
+ vertex 22.989038094526958 169.14587254275938 -10.068148347421912
+ vertex 23.24785713962949 168.69758480667534 -10.00000000000005
+ endloop
+endfacet
+facet normal -0.06526309611002441 0.11303899832181347 0.9914448613738107
+ outer loop
+ vertex 22.989038094526958 169.14587254275938 -10.068148347421912
+ vertex 24.97990794719836 169.69758480667534 -10.00000000000005
+ vertex 24.721088902095847 170.14587254275938 -10.068148347421912
+ endloop
+endfacet
+facet normal -0.4619397662556415 0.8001031451912651 -0.3826834323650928
+ outer loop
+ vertex 22.381831735845058 170.19758480667537 -15.000000000000057
+ vertex 24.0139821209093 171.37061741415096 -14.517638090205098
+ vertex 24.11388254341393 171.19758480667534 -15.000000000000057
+ endloop
+endfacet
+facet normal -0.4619397662556415 0.8001031451912651 -0.3826834323650928
+ outer loop
+ vertex 24.0139821209093 171.37061741415096 -14.517638090205098
+ vertex 22.381831735845058 170.19758480667537 -15.000000000000057
+ vertex 22.28193131334041 170.37061741415096 -14.517638090205098
+ endloop
+endfacet
+facet normal -0.5000000000000053 0.8660254037844356 1.3680382856456483e-29
+ outer loop
+ vertex 22.247857139629495 170.4296356142442 -14.000000000000059
+ vertex 23.979907947198363 171.42963561424423 -12.000000000000046
+ vertex 23.979907947198363 171.42963561424423 -14.000000000000059
+ endloop
+endfacet
+facet normal -0.5000000000000053 0.8660254037844356 1.3680382856456483e-29
+ outer loop
+ vertex 23.979907947198363 171.42963561424423 -12.000000000000046
+ vertex 22.247857139629495 170.4296356142442 -14.000000000000059
+ vertex 22.247857139629495 170.4296356142442 -12.000000000000046
+ endloop
+endfacet
+facet normal -0.46193976625564237 0.8001031451912665 0.3826834323650891
+ outer loop
+ vertex 24.0139821209093 171.37061741415096 -11.482361909795012
+ vertex 22.381831735845058 170.19758480667537 -11.000000000000048
+ vertex 24.11388254341393 171.19758480667534 -11.000000000000048
+ endloop
+endfacet
+facet normal -0.46193976625564237 0.8001031451912665 0.3826834323650891
+ outer loop
+ vertex 22.381831735845058 170.19758480667537 -11.000000000000048
+ vertex 24.0139821209093 171.37061741415096 -11.482361909795012
+ vertex 22.28193131334041 170.37061741415096 -11.482361909795012
+ endloop
+endfacet
+facet normal 5.933957380480184e-32 1.4193619471206742e-31 1.0
+ outer loop
+ vertex 37.37990794719835 148.22015479282123 -49.600000000000044
+ vertex 23.24785713962949 168.69758480667534 -49.600000000000044
+ vertex 35.64785713962948 147.22015479282123 -49.600000000000044
+ endloop
+endfacet
+facet normal 5.933957380480184e-32 1.4193619471206742e-31 1.0
+ outer loop
+ vertex 23.24785713962949 168.69758480667534 -49.600000000000044
+ vertex 37.37990794719835 148.22015479282123 -49.600000000000044
+ vertex 24.97990794719836 169.69758480667534 -49.600000000000044
+ endloop
+endfacet
+facet normal 0.3043807145043599 -0.527202862365667 -0.7933533402912368
+ outer loop
+ vertex 36.14785713962947 146.35412938903679 -55.33205080756894
+ vertex 38.0870147283849 146.99540992142965 -55.01421356237316
+ vertex 36.35496392081603 145.99540992142965 -55.01421356237316
+ endloop
+endfacet
+facet normal 0.3043807145043599 -0.527202862365667 -0.7933533402912368
+ outer loop
+ vertex 38.0870147283849 146.99540992142965 -55.01421356237316
+ vertex 36.14785713962947 146.35412938903679 -55.33205080756894
+ vertex 37.87990794719835 147.35412938903679 -55.33205080756894
+ endloop
+endfacet
+facet normal -0.4957224306869123 0.8586164364012558 -0.13052619222005787
+ outer loop
+ vertex 22.28193131334041 170.37061741415096 -54.117638090205105
+ vertex 23.979907947198342 171.42963561424423 -53.60000000000006
+ vertex 24.01398212090928 171.37061741415093 -54.117638090205105
+ endloop
+endfacet
+facet normal -0.4957224306869123 0.8586164364012558 -0.13052619222005787
+ outer loop
+ vertex 23.979907947198342 171.42963561424423 -53.60000000000006
+ vertex 22.28193131334041 170.37061741415096 -54.117638090205105
+ vertex 22.247857139629495 170.4296356142442 -53.60000000000006
+ endloop
+endfacet
+facet normal 0.06526309611002591 -0.1130389983218153 -0.9914448613738105
+ outer loop
+ vertex 35.64785713962948 147.22015479282123 -55.600000000000065
+ vertex 37.638726992300874 147.77186705673722 -55.531851652578204
+ vertex 35.906676184732014 146.77186705673722 -55.531851652578204
+ endloop
+endfacet
+facet normal 0.06526309611002591 -0.1130389983218153 -0.9914448613738105
+ outer loop
+ vertex 37.638726992300874 147.77186705673722 -55.531851652578204
+ vertex 35.64785713962948 147.22015479282123 -55.600000000000065
+ vertex 37.37990794719835 148.22015479282123 -55.600000000000065
+ endloop
+endfacet
+facet normal 0.5000000000000011 -0.8660254037844379 9.32505634347438e-32
+ outer loop
+ vertex 36.64785713962948 145.48810398525237 -51.60000000000005
+ vertex 38.37990794719835 146.48810398525237 -53.60000000000006
+ vertex 38.37990794719835 146.48810398525237 -51.60000000000005
+ endloop
+endfacet
+facet normal 0.5000000000000011 -0.8660254037844379 9.32505634347438e-32
+ outer loop
+ vertex 38.37990794719835 146.48810398525237 -53.60000000000006
+ vertex 36.64785713962948 145.48810398525237 -51.60000000000005
+ vertex 36.64785713962948 145.48810398525237 -53.60000000000006
+ endloop
+endfacet
+facet normal 0.3966766701456135 -0.6870641468694493 0.6087614290087243
+ outer loop
+ vertex 38.0870147283849 146.99540992142965 -50.18578643762695
+ vertex 36.51388254341391 145.72015479282123 -50.600000000000044
+ vertex 38.24593335098278 146.72015479282123 -50.600000000000044
+ endloop
+endfacet
+facet normal 0.3966766701456135 -0.6870641468694493 0.6087614290087243
+ outer loop
+ vertex 36.51388254341391 145.72015479282123 -50.600000000000044
+ vertex 38.0870147283849 146.99540992142965 -50.18578643762695
+ vertex 36.35496392081603 145.99540992142965 -50.18578643762695
+ endloop
+endfacet
+facet normal -0.39667667014560976 0.6870641468694383 -0.6087614290087392
+ outer loop
+ vertex 22.540750358442942 169.92232967806692 -55.01421356237316
+ vertex 24.113882543413904 171.19758480667534 -54.60000000000006
+ vertex 24.272801166011813 170.92232967806692 -55.01421356237316
+ endloop
+endfacet
+facet normal -0.39667667014560976 0.6870641468694383 -0.6087614290087392
+ outer loop
+ vertex 24.113882543413904 171.19758480667534 -54.60000000000006
+ vertex 22.540750358442942 169.92232967806692 -55.01421356237316
+ vertex 22.381831735845036 170.19758480667534 -54.60000000000006
+ endloop
+endfacet
+facet normal 0.3043807145043562 -0.5272028623656608 0.7933533402912423
+ outer loop
+ vertex 38.0870147283849 146.99540992142965 -50.18578643762695
+ vertex 36.14785713962947 146.35412938903679 -49.867949192431176
+ vertex 36.35496392081603 145.99540992142965 -50.18578643762695
+ endloop
+endfacet
+facet normal 0.3043807145043562 -0.5272028623656608 0.7933533402912423
+ outer loop
+ vertex 36.14785713962947 146.35412938903679 -49.867949192431176
+ vertex 38.0870147283849 146.99540992142965 -50.18578643762695
+ vertex 37.87990794719835 147.35412938903679 -49.867949192431176
+ endloop
+endfacet
+facet normal 0.19134171618254817 -0.33141357403559657 -0.9238795325112844
+ outer loop
+ vertex 35.906676184732014 146.77186705673722 -55.531851652578204
+ vertex 37.87990794719835 147.35412938903679 -55.33205080756894
+ vertex 36.14785713962947 146.35412938903679 -55.33205080756894
+ endloop
+endfacet
+facet normal 0.19134171618254817 -0.33141357403559657 -0.9238795325112844
+ outer loop
+ vertex 37.87990794719835 147.35412938903679 -55.33205080756894
+ vertex 35.906676184732014 146.77186705673722 -55.531851652578204
+ vertex 37.638726992300874 147.77186705673722 -55.531851652578204
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 23.24785713962949 168.69758480667534 -55.600000000000065
+ vertex 37.37990794719835 148.22015479282123 -55.600000000000065
+ vertex 35.64785713962948 147.22015479282123 -55.600000000000065
+ endloop
+endfacet
+facet normal -5.933957380480184e-32 -1.4193619471206742e-31 -1.0
+ outer loop
+ vertex 37.37990794719835 148.22015479282123 -55.600000000000065
+ vertex 23.24785713962949 168.69758480667534 -55.600000000000065
+ vertex 24.97990794719836 169.69758480667534 -55.600000000000065
+ endloop
+endfacet
+facet normal 0.46193976625564215 -0.800103145191273 0.38268343236507585
+ outer loop
+ vertex 38.24593335098278 146.72015479282123 -50.600000000000044
+ vertex 36.61378296591853 145.54712218534561 -51.082361909795004
+ vertex 38.34583377348741 146.54712218534561 -51.082361909795004
+ endloop
+endfacet
+facet normal 0.46193976625564215 -0.800103145191273 0.38268343236507585
+ outer loop
+ vertex 36.61378296591853 145.54712218534561 -51.082361909795004
+ vertex 38.24593335098278 146.72015479282123 -50.600000000000044
+ vertex 36.51388254341391 145.72015479282123 -50.600000000000044
+ endloop
+endfacet
+facet normal 0.49572243068690486 -0.8586164364012606 0.13052619222005538
+ outer loop
+ vertex 38.34583377348741 146.54712218534561 -51.082361909795004
+ vertex 36.64785713962948 145.48810398525237 -51.60000000000005
+ vertex 38.37990794719835 146.48810398525237 -51.60000000000005
+ endloop
+endfacet
+facet normal 0.49572243068690486 -0.8586164364012606 0.13052619222005538
+ outer loop
+ vertex 36.64785713962948 145.48810398525237 -51.60000000000005
+ vertex 38.34583377348741 146.54712218534561 -51.082361909795004
+ vertex 36.61378296591853 145.54712218534561 -51.082361909795004
+ endloop
+endfacet
+facet normal 0.3966766701456156 -0.6870641468694526 -0.6087614290087192
+ outer loop
+ vertex 36.51388254341391 145.72015479282123 -54.60000000000006
+ vertex 38.0870147283849 146.99540992142965 -55.01421356237316
+ vertex 38.24593335098278 146.72015479282123 -54.60000000000006
+ endloop
+endfacet
+facet normal 0.3966766701456156 -0.6870641468694526 -0.6087614290087192
+ outer loop
+ vertex 38.0870147283849 146.99540992142965 -55.01421356237316
+ vertex 36.51388254341391 145.72015479282123 -54.60000000000006
+ vertex 36.35496392081603 145.99540992142965 -55.01421356237316
+ endloop
+endfacet
+facet normal 0.06526309611002586 -0.1130389983218152 0.9914448613738105
+ outer loop
+ vertex 37.638726992300874 147.77186705673722 -49.668148347421905
+ vertex 35.64785713962948 147.22015479282123 -49.600000000000044
+ vertex 35.906676184732014 146.77186705673722 -49.668148347421905
+ endloop
+endfacet
+facet normal 0.06526309611002586 -0.1130389983218152 0.9914448613738105
+ outer loop
+ vertex 35.64785713962948 147.22015479282123 -49.600000000000044
+ vertex 37.638726992300874 147.77186705673722 -49.668148347421905
+ vertex 37.37990794719835 148.22015479282123 -49.600000000000044
+ endloop
+endfacet
+facet normal 0.4957224306869051 -0.8586164364012607 -0.13052619222005396
+ outer loop
+ vertex 36.64785713962948 145.48810398525237 -53.60000000000006
+ vertex 38.34583377348742 146.54712218534561 -54.117638090205105
+ vertex 38.37990794719835 146.48810398525237 -53.60000000000006
+ endloop
+endfacet
+facet normal 0.4957224306869051 -0.8586164364012607 -0.13052619222005396
+ outer loop
+ vertex 38.34583377348742 146.54712218534561 -54.117638090205105
+ vertex 36.64785713962948 145.48810398525237 -53.60000000000006
+ vertex 36.613782965918546 145.54712218534561 -54.117638090205105
+ endloop
+endfacet
+facet normal -0.19134171618254614 0.3314135740355915 0.9238795325112867
+ outer loop
+ vertex 24.721088902095826 170.14587254275935 -49.668148347421905
+ vertex 22.74785713962945 169.56361021045976 -49.867949192431176
+ vertex 22.989038094526958 169.14587254275935 -49.668148347421905
+ endloop
+endfacet
+facet normal -0.19134171618254614 0.3314135740355915 0.9238795325112867
+ outer loop
+ vertex 22.74785713962945 169.56361021045976 -49.867949192431176
+ vertex 24.721088902095826 170.14587254275935 -49.668148347421905
+ vertex 24.47990794719834 170.56361021045979 -49.867949192431176
+ endloop
+endfacet
+facet normal 0.461939766255641 -0.8001031451912712 -0.3826834323650809
+ outer loop
+ vertex 36.613782965918546 145.54712218534561 -54.117638090205105
+ vertex 38.24593335098278 146.72015479282123 -54.60000000000006
+ vertex 38.34583377348742 146.54712218534561 -54.117638090205105
+ endloop
+endfacet
+facet normal 0.461939766255641 -0.8001031451912712 -0.3826834323650809
+ outer loop
+ vertex 38.24593335098278 146.72015479282123 -54.60000000000006
+ vertex 36.613782965918546 145.54712218534561 -54.117638090205105
+ vertex 36.51388254341391 145.72015479282123 -54.60000000000006
+ endloop
+endfacet
+facet normal -0.30438071450436416 0.5272028623656773 -0.7933533402912286
+ outer loop
+ vertex 22.540750358442942 169.92232967806692 -55.01421356237316
+ vertex 24.47990794719834 170.56361021045973 -55.33205080756894
+ vertex 22.74785713962947 169.56361021045976 -55.33205080756894
+ endloop
+endfacet
+facet normal -0.30438071450436416 0.5272028623656773 -0.7933533402912286
+ outer loop
+ vertex 24.47990794719834 170.56361021045973 -55.33205080756894
+ vertex 22.540750358442942 169.92232967806692 -55.01421356237316
+ vertex 24.272801166011813 170.92232967806692 -55.01421356237316
+ endloop
+endfacet
+facet normal 0.19134171618255263 -0.33141357403560434 0.9238795325112809
+ outer loop
+ vertex 37.87990794719835 147.35412938903679 -49.867949192431176
+ vertex 35.906676184732014 146.77186705673722 -49.668148347421905
+ vertex 36.14785713962947 146.35412938903679 -49.867949192431176
+ endloop
+endfacet
+facet normal 0.19134171618255263 -0.33141357403560434 0.9238795325112809
+ outer loop
+ vertex 35.906676184732014 146.77186705673722 -49.668148347421905
+ vertex 37.87990794719835 147.35412938903679 -49.867949192431176
+ vertex 37.638726992300874 147.77186705673722 -49.668148347421905
+ endloop
+endfacet
+facet normal -0.1913417161825468 0.33141357403559607 -0.9238795325112849
+ outer loop
+ vertex 22.74785713962947 169.56361021045976 -55.33205080756894
+ vertex 24.721088902095826 170.14587254275935 -55.531851652578204
+ vertex 22.989038094526958 169.14587254275935 -55.531851652578204
+ endloop
+endfacet
+facet normal -0.1913417161825468 0.33141357403559607 -0.9238795325112849
+ outer loop
+ vertex 24.721088902095826 170.14587254275935 -55.531851652578204
+ vertex 22.74785713962947 169.56361021045976 -55.33205080756894
+ vertex 24.47990794719834 170.56361021045973 -55.33205080756894
+ endloop
+endfacet
+facet normal 0.5000000000000014 0.8660254037844379 -2.823841496478741e-16
+ outer loop
+ vertex -37.22361724387529 136.30009313384159 -39.80000000000007
+ vertex -40.687718859012975 138.30009313384159 -25.800000000000065
+ vertex -37.22361724387527 136.30009313384159 -25.800000000000065
+ endloop
+endfacet
+facet normal 0.5000000000000014 0.8660254037844379 -2.823841496478741e-16
+ outer loop
+ vertex -40.687718859012975 138.30009313384159 -25.800000000000065
+ vertex -37.22361724387529 136.30009313384159 -39.80000000000007
+ vertex -40.687718859012996 138.30009313384159 -39.80000000000006
+ endloop
+endfacet
+facet normal 0.49572243068690686 0.8586164364012605 -0.13052619222004863
+ outer loop
+ vertex -37.22361724387527 136.30009313384159 -25.800000000000065
+ vertex -40.63660759844658 138.38862043398146 -25.0235428646925
+ vertex -37.17250598330887 136.3886204339815 -25.0235428646925
+ endloop
+endfacet
+facet normal 0.49572243068690686 0.8586164364012605 -0.13052619222004863
+ outer loop
+ vertex -40.63660759844658 138.38862043398146 -25.0235428646925
+ vertex -37.22361724387527 136.30009313384159 -25.800000000000065
+ vertex -40.687718859012975 138.30009313384159 -25.800000000000065
+ endloop
+endfacet
+facet normal 0.46193976625564326 0.8001031451912624 -0.38268343236509644
+ outer loop
+ vertex -37.17250598330887 136.3886204339815 -25.0235428646925
+ vertex -40.486756964689626 138.6481693451949 -24.300000000000068
+ vertex -37.02265534955192 136.6481693451949 -24.300000000000068
+ endloop
+endfacet
+facet normal 0.46193976625564326 0.8001031451912624 -0.38268343236509644
+ outer loop
+ vertex -40.486756964689626 138.6481693451949 -24.300000000000068
+ vertex -37.17250598330887 136.3886204339815 -25.0235428646925
+ vertex -40.63660759844658 138.38862043398146 -25.0235428646925
+ endloop
+endfacet
+facet normal 0.3966766701456205 0.6870641468694526 -0.608761429008716
+ outer loop
+ vertex -37.02265534955192 136.6481693451949 -24.300000000000068
+ vertex -40.248379030792805 139.0610520381075 -23.678679656440423
+ vertex -36.78427741565509 137.06105203810753 -23.678679656440423
+ endloop
+endfacet
+facet normal 0.3966766701456205 0.6870641468694526 -0.608761429008716
+ outer loop
+ vertex -40.248379030792805 139.0610520381075 -23.678679656440423
+ vertex -37.02265534955192 136.6481693451949 -24.300000000000068
+ vertex -40.486756964689626 138.6481693451949 -24.300000000000068
+ endloop
+endfacet
+facet normal 0.3043807145043616 0.5272028623656696 -0.7933533402912344
+ outer loop
+ vertex -40.248379030792805 139.0610520381075 -23.678679656440423
+ vertex -36.473617243875275 137.59913123951827 -23.20192378864675
+ vertex -36.78427741565509 137.06105203810753 -23.678679656440423
+ endloop
+endfacet
+facet normal 0.3043807145043616 0.5272028623656696 -0.7933533402912344
+ outer loop
+ vertex -36.473617243875275 137.59913123951827 -23.20192378864675
+ vertex -40.248379030792805 139.0610520381075 -23.678679656440423
+ vertex -39.93771885901299 139.59913123951824 -23.20192378864675
+ endloop
+endfacet
+facet normal 0.19134171618254497 0.3314135740355907 -0.9238795325112873
+ outer loop
+ vertex -39.93771885901299 139.59913123951824 -23.20192378864675
+ vertex -36.111845811529065 138.22573774106888 -22.90222252113286
+ vertex -36.473617243875275 137.59913123951827 -23.20192378864675
+ endloop
+endfacet
+facet normal 0.19134171618254497 0.3314135740355907 -0.9238795325112873
+ outer loop
+ vertex -36.111845811529065 138.22573774106888 -22.90222252113286
+ vertex -39.93771885901299 139.59913123951824 -23.20192378864675
+ vertex -39.57594742666678 140.22573774106885 -22.90222252113286
+ endloop
+endfacet
+facet normal 0.0652630961100252 0.1130389983218141 -0.9914448613738106
+ outer loop
+ vertex -39.57594742666678 140.22573774106885 -22.90222252113286
+ vertex -35.72361724387527 138.89816934519493 -22.800000000000065
+ vertex -36.111845811529065 138.22573774106888 -22.90222252113286
+ endloop
+endfacet
+facet normal 0.0652630961100252 0.1130389983218141 -0.9914448613738106
+ outer loop
+ vertex -35.72361724387527 138.89816934519493 -22.800000000000065
+ vertex -39.57594742666678 140.22573774106885 -22.90222252113286
+ vertex -39.18771885901298 140.8981693451949 -22.800000000000065
+ endloop
+endfacet
+facet normal -0.06526309611002605 -0.11303899832181531 -0.9914448613738105
+ outer loop
+ vertex -39.18771885901298 140.8981693451949 -22.800000000000065
+ vertex -35.33538867622149 139.57060094932095 -22.90222252113286
+ vertex -35.72361724387527 138.89816934519493 -22.800000000000065
+ endloop
+endfacet
+facet normal -0.06526309611002605 -0.11303899832181531 -0.9914448613738105
+ outer loop
+ vertex -35.33538867622149 139.57060094932095 -22.90222252113286
+ vertex -39.18771885901298 140.8981693451949 -22.800000000000065
+ vertex -38.7994902913592 141.57060094932095 -22.90222252113286
+ endloop
+endfacet
+facet normal -0.1913417161825436 -0.331413574035588 -0.9238795325112884
+ outer loop
+ vertex -38.7994902913592 141.57060094932095 -22.90222252113286
+ vertex -34.97361724387526 140.19720745087156 -23.20192378864675
+ vertex -35.33538867622149 139.57060094932095 -22.90222252113286
+ endloop
+endfacet
+facet normal -0.1913417161825436 -0.331413574035588 -0.9238795325112884
+ outer loop
+ vertex -34.97361724387526 140.19720745087156 -23.20192378864675
+ vertex -38.7994902913592 141.57060094932095 -22.90222252113286
+ vertex -38.43771885901297 142.19720745087156 -23.20192378864675
+ endloop
+endfacet
+facet normal -0.30438071450436244 -0.5272028623656708 -0.7933533402912333
+ outer loop
+ vertex -38.43771885901297 142.19720745087156 -23.20192378864675
+ vertex -34.662957072095445 140.7352866522823 -23.678679656440423
+ vertex -34.97361724387526 140.19720745087156 -23.20192378864675
+ endloop
+endfacet
+facet normal -0.30438071450436244 -0.5272028623656708 -0.7933533402912333
+ outer loop
+ vertex -34.662957072095445 140.7352866522823 -23.678679656440423
+ vertex -38.43771885901297 142.19720745087156 -23.20192378864675
+ vertex -38.127058687233145 142.7352866522823 -23.678679656440423
+ endloop
+endfacet
+facet normal -0.3966766701456201 -0.6870641468694516 -0.6087614290087174
+ outer loop
+ vertex -34.662957072095445 140.7352866522823 -23.678679656440423
+ vertex -37.88868075333632 143.1481693451949 -24.30000000000006
+ vertex -34.42457913819862 141.14816934519493 -24.30000000000006
+ endloop
+endfacet
+facet normal -0.3966766701456201 -0.6870641468694516 -0.6087614290087174
+ outer loop
+ vertex -37.88868075333632 143.1481693451949 -24.30000000000006
+ vertex -34.662957072095445 140.7352866522823 -23.678679656440423
+ vertex -38.127058687233145 142.7352866522823 -23.678679656440423
+ endloop
+endfacet
+facet normal -0.46193976625564387 -0.8001031451912634 -0.38268343236509395
+ outer loop
+ vertex -34.42457913819862 141.14816934519493 -24.30000000000006
+ vertex -37.73883011957936 143.40771825640834 -25.0235428646925
+ vertex -34.27472850444166 141.40771825640834 -25.0235428646925
+ endloop
+endfacet
+facet normal -0.46193976625564387 -0.8001031451912634 -0.38268343236509395
+ outer loop
+ vertex -37.73883011957936 143.40771825640834 -25.0235428646925
+ vertex -34.42457913819862 141.14816934519493 -24.30000000000006
+ vertex -37.88868075333632 143.1481693451949 -24.30000000000006
+ endloop
+endfacet
+facet normal -0.4957224306869065 -0.85861643640126 -0.13052619222005477
+ outer loop
+ vertex -34.27472850444166 141.40771825640834 -25.0235428646925
+ vertex -37.68771885901297 143.49624555654825 -25.800000000000065
+ vertex -34.22361724387527 141.49624555654825 -25.800000000000065
+ endloop
+endfacet
+facet normal -0.4957224306869065 -0.85861643640126 -0.13052619222005477
+ outer loop
+ vertex -37.68771885901297 143.49624555654825 -25.800000000000065
+ vertex -34.27472850444166 141.40771825640834 -25.0235428646925
+ vertex -37.73883011957936 143.40771825640834 -25.0235428646925
+ endloop
+endfacet
+facet normal -0.5000000000000014 -0.8660254037844379 3.4888037310101813e-16
+ outer loop
+ vertex -37.68771885901297 143.49624555654825 -25.800000000000065
+ vertex -34.22361724387527 141.49624555654825 -39.80000000000007
+ vertex -34.22361724387527 141.49624555654825 -25.800000000000065
+ endloop
+endfacet
+facet normal -0.5000000000000014 -0.8660254037844379 3.4888037310101813e-16
+ outer loop
+ vertex -34.22361724387527 141.49624555654825 -39.80000000000007
+ vertex -37.68771885901297 143.49624555654825 -25.800000000000065
+ vertex -37.68771885901297 143.49624555654822 -39.80000000000006
+ endloop
+endfacet
+facet normal -0.4957224306869068 -0.8586164364012605 0.13052619222004908
+ outer loop
+ vertex -37.68771885901297 143.49624555654822 -39.80000000000006
+ vertex -34.27472850444166 141.40771825640834 -40.57645713530763
+ vertex -34.22361724387527 141.49624555654825 -39.80000000000007
+ endloop
+endfacet
+facet normal -0.4957224306869068 -0.8586164364012605 0.13052619222004908
+ outer loop
+ vertex -34.27472850444166 141.40771825640834 -40.57645713530763
+ vertex -37.68771885901297 143.49624555654822 -39.80000000000006
+ vertex -37.73883011957936 143.40771825640834 -40.57645713530763
+ endloop
+endfacet
+facet normal -0.46193976625564387 -0.8001031451912634 0.38268343236509395
+ outer loop
+ vertex -37.73883011957936 143.40771825640834 -40.57645713530763
+ vertex -34.42457913819862 141.14816934519493 -41.30000000000007
+ vertex -34.27472850444166 141.40771825640834 -40.57645713530763
+ endloop
+endfacet
+facet normal -0.46193976625564387 -0.8001031451912634 0.38268343236509395
+ outer loop
+ vertex -34.42457913819862 141.14816934519493 -41.30000000000007
+ vertex -37.73883011957936 143.40771825640834 -40.57645713530763
+ vertex -37.88868075333632 143.1481693451949 -41.30000000000007
+ endloop
+endfacet
+facet normal -0.39667667014561997 -0.6870641468694515 0.6087614290087178
+ outer loop
+ vertex -37.88868075333632 143.1481693451949 -41.30000000000007
+ vertex -34.662957072095445 140.7352866522823 -41.921320343559714
+ vertex -34.42457913819862 141.14816934519493 -41.30000000000007
+ endloop
+endfacet
+facet normal -0.39667667014561997 -0.6870641468694515 0.6087614290087178
+ outer loop
+ vertex -34.662957072095445 140.7352866522823 -41.921320343559714
+ vertex -37.88868075333632 143.1481693451949 -41.30000000000007
+ vertex -38.127058687233145 142.7352866522823 -41.921320343559714
+ endloop
+endfacet
+facet normal -0.3043807145043612 -0.5272028623656689 0.7933533402912349
+ outer loop
+ vertex -34.662957072095445 140.7352866522823 -41.921320343559714
+ vertex -38.43771885901297 142.19720745087156 -42.39807621135338
+ vertex -34.97361724387526 140.19720745087156 -42.398076211353384
+ endloop
+endfacet
+facet normal -0.3043807145043612 -0.5272028623656689 0.7933533402912349
+ outer loop
+ vertex -38.43771885901297 142.19720745087156 -42.39807621135338
+ vertex -34.662957072095445 140.7352866522823 -41.921320343559714
+ vertex -38.127058687233145 142.7352866522823 -41.921320343559714
+ endloop
+endfacet
+facet normal -0.19134171618254645 -0.33141357403559335 0.9238795325112859
+ outer loop
+ vertex -34.97361724387526 140.19720745087156 -42.398076211353384
+ vertex -38.79949029135918 141.57060094932095 -42.697777478867266
+ vertex -35.33538867622146 139.57060094932095 -42.69777747886727
+ endloop
+endfacet
+facet normal -0.19134171618254645 -0.33141357403559335 0.9238795325112859
+ outer loop
+ vertex -38.79949029135918 141.57060094932095 -42.697777478867266
+ vertex -34.97361724387526 140.19720745087156 -42.398076211353384
+ vertex -38.43771885901297 142.19720745087156 -42.39807621135338
+ endloop
+endfacet
+facet normal -0.06526309611002482 -0.11303899832181341 0.9914448613738108
+ outer loop
+ vertex -35.33538867622146 139.57060094932095 -42.69777747886727
+ vertex -39.18771885901298 140.8981693451949 -42.80000000000007
+ vertex -35.72361724387527 138.8981693451949 -42.80000000000007
+ endloop
+endfacet
+facet normal -0.06526309611002482 -0.11303899832181341 0.9914448613738108
+ outer loop
+ vertex -39.18771885901298 140.8981693451949 -42.80000000000007
+ vertex -35.33538867622146 139.57060094932095 -42.69777747886727
+ vertex -38.79949029135918 141.57060094932095 -42.697777478867266
+ endloop
+endfacet
+facet normal 0.06526309611002645 0.113038998321816 0.9914448613738105
+ outer loop
+ vertex -35.72361724387527 138.8981693451949 -42.80000000000007
+ vertex -39.57594742666676 140.22573774106885 -42.697777478867266
+ vertex -36.111845811529044 138.22573774106888 -42.69777747886727
+ endloop
+endfacet
+facet normal 0.06526309611002645 0.113038998321816 0.9914448613738105
+ outer loop
+ vertex -39.57594742666676 140.22573774106885 -42.697777478867266
+ vertex -35.72361724387527 138.8981693451949 -42.80000000000007
+ vertex -39.18771885901298 140.8981693451949 -42.80000000000007
+ endloop
+endfacet
+facet normal 0.1913417161825436 0.331413574035588 0.9238795325112884
+ outer loop
+ vertex -36.111845811529044 138.22573774106888 -42.69777747886727
+ vertex -39.93771885901299 139.59913123951824 -42.398076211353384
+ vertex -36.473617243875275 137.59913123951824 -42.398076211353384
+ endloop
+endfacet
+facet normal 0.1913417161825436 0.331413574035588 0.9238795325112884
+ outer loop
+ vertex -39.93771885901299 139.59913123951824 -42.398076211353384
+ vertex -36.111845811529044 138.22573774106888 -42.69777747886727
+ vertex -39.57594742666676 140.22573774106885 -42.697777478867266
+ endloop
+endfacet
+facet normal 0.3043807145043597 0.5272028623656662 0.7933533402912374
+ outer loop
+ vertex -36.473617243875275 137.59913123951824 -42.398076211353384
+ vertex -40.248379030792826 139.0610520381075 -41.921320343559714
+ vertex -36.78427741565511 137.06105203810753 -41.921320343559714
+ endloop
+endfacet
+facet normal 0.3043807145043597 0.5272028623656662 0.7933533402912374
+ outer loop
+ vertex -40.248379030792826 139.0610520381075 -41.921320343559714
+ vertex -36.473617243875275 137.59913123951824 -42.398076211353384
+ vertex -39.93771885901299 139.59913123951824 -42.398076211353384
+ endloop
+endfacet
+facet normal 0.39667667014562064 0.6870641468694527 0.6087614290087157
+ outer loop
+ vertex -40.248379030792826 139.0610520381075 -41.921320343559714
+ vertex -37.02265534955194 136.6481693451949 -41.30000000000007
+ vertex -36.78427741565511 137.06105203810753 -41.921320343559714
+ endloop
+endfacet
+facet normal 0.39667667014562064 0.6870641468694527 0.6087614290087157
+ outer loop
+ vertex -37.02265534955194 136.6481693451949 -41.30000000000007
+ vertex -40.248379030792826 139.0610520381075 -41.921320343559714
+ vertex -40.486756964689654 138.6481693451949 -41.30000000000007
+ endloop
+endfacet
+facet normal 0.4619397662556442 0.8001031451912639 0.38268343236509256
+ outer loop
+ vertex -40.486756964689654 138.6481693451949 -41.30000000000007
+ vertex -37.172505983308895 136.3886204339815 -40.57645713530763
+ vertex -37.02265534955194 136.6481693451949 -41.30000000000007
+ endloop
+endfacet
+facet normal 0.4619397662556442 0.8001031451912639 0.38268343236509256
+ outer loop
+ vertex -37.172505983308895 136.3886204339815 -40.57645713530763
+ vertex -40.486756964689654 138.6481693451949 -41.30000000000007
+ vertex -40.6366075984466 138.3886204339815 -40.57645713530763
+ endloop
+endfacet
+facet normal 0.49572243068690686 0.8586164364012605 0.13052619222004863
+ outer loop
+ vertex -40.6366075984466 138.3886204339815 -40.57645713530763
+ vertex -37.22361724387529 136.30009313384159 -39.80000000000007
+ vertex -37.172505983308895 136.3886204339815 -40.57645713530763
+ endloop
+endfacet
+facet normal 0.49572243068690686 0.8586164364012605 0.13052619222004863
+ outer loop
+ vertex -37.22361724387529 136.30009313384159 -39.80000000000007
+ vertex -40.6366075984466 138.3886204339815 -40.57645713530763
+ vertex -40.687718859012996 138.30009313384159 -39.80000000000006
+ endloop
+endfacet
+facet normal -0.4957224306869056 0.8586164364012612 -0.13052619222004863
+ outer loop
+ vertex 37.333755524491714 136.30009313384156 -25.800000000000054
+ vertex 40.74674587906303 138.3886204339814 -25.0235428646925
+ vertex 40.79785713962942 138.30009313384153 -25.800000000000065
+ endloop
+endfacet
+facet normal -0.4957224306869056 0.8586164364012612 -0.13052619222004863
+ outer loop
+ vertex 40.74674587906303 138.3886204339814 -25.0235428646925
+ vertex 37.333755524491714 136.30009313384156 -25.800000000000054
+ vertex 37.28264426392531 136.38862043398143 -25.02354286469249
+ endloop
+endfacet
+facet normal -0.5000000000000002 0.8660254037844385 4.153765965541621e-16
+ outer loop
+ vertex 37.333755524491735 136.30009313384156 -39.800000000000054
+ vertex 40.79785713962942 138.30009313384153 -25.800000000000065
+ vertex 40.79785713962944 138.30009313384156 -39.80000000000006
+ endloop
+endfacet
+facet normal -0.5000000000000002 0.8660254037844385 4.153765965541621e-16
+ outer loop
+ vertex 40.79785713962942 138.30009313384153 -25.800000000000065
+ vertex 37.333755524491735 136.30009313384156 -39.800000000000054
+ vertex 37.333755524491714 136.30009313384156 -25.800000000000054
+ endloop
+endfacet
+facet normal -0.4957224306869057 0.8586164364012612 0.13052619222004863
+ outer loop
+ vertex 40.74674587906305 138.38862043398143 -40.57645713530763
+ vertex 37.333755524491735 136.30009313384156 -39.800000000000054
+ vertex 40.79785713962944 138.30009313384156 -39.80000000000006
+ endloop
+endfacet
+facet normal -0.4957224306869057 0.8586164364012612 0.13052619222004863
+ outer loop
+ vertex 37.333755524491735 136.30009313384156 -39.800000000000054
+ vertex 40.74674587906305 138.38862043398143 -40.57645713530763
+ vertex 37.28264426392534 136.38862043398146 -40.57645713530762
+ endloop
+endfacet
+facet normal -0.46193976625564265 0.8001031451912635 0.3826834323650951
+ outer loop
+ vertex 40.5968952453061 138.64816934519487 -41.30000000000007
+ vertex 37.28264426392534 136.38862043398146 -40.57645713530762
+ vertex 40.74674587906305 138.38862043398143 -40.57645713530763
+ endloop
+endfacet
+facet normal -0.46193976625564265 0.8001031451912635 0.3826834323650951
+ outer loop
+ vertex 37.28264426392534 136.38862043398146 -40.57645713530762
+ vertex 40.5968952453061 138.64816934519487 -41.30000000000007
+ vertex 37.132793630168386 136.64816934519487 -41.30000000000006
+ endloop
+endfacet
+facet normal -0.39667667014561986 0.6870641468694533 0.6087614290087157
+ outer loop
+ vertex 40.35851731140927 139.06105203810748 -41.921320343559714
+ vertex 37.132793630168386 136.64816934519487 -41.30000000000006
+ vertex 40.5968952453061 138.64816934519487 -41.30000000000007
+ endloop
+endfacet
+facet normal -0.39667667014561986 0.6870641468694533 0.6087614290087157
+ outer loop
+ vertex 37.132793630168386 136.64816934519487 -41.30000000000006
+ vertex 40.35851731140927 139.06105203810748 -41.921320343559714
+ vertex 36.89441569627156 137.06105203810748 -41.9213203435597
+ endloop
+endfacet
+facet normal -0.3043807145043594 0.5272028623656665 0.7933533402912374
+ outer loop
+ vertex 40.35851731140927 139.06105203810748 -41.921320343559714
+ vertex 36.58375552449172 137.5991312395182 -42.39807621135338
+ vertex 36.89441569627156 137.06105203810748 -41.9213203435597
+ endloop
+endfacet
+facet normal -0.3043807145043594 0.5272028623656665 0.7933533402912374
+ outer loop
+ vertex 36.58375552449172 137.5991312395182 -42.39807621135338
+ vertex 40.35851731140927 139.06105203810748 -41.921320343559714
+ vertex 40.04785713962944 139.5991312395182 -42.398076211353384
+ endloop
+endfacet
+facet normal -0.19134171618254192 0.33141357403558563 0.9238795325112897
+ outer loop
+ vertex 40.04785713962944 139.5991312395182 -42.398076211353384
+ vertex 36.22198409214549 138.22573774106883 -42.69777747886726
+ vertex 36.58375552449172 137.5991312395182 -42.39807621135338
+ endloop
+endfacet
+facet normal -0.19134171618254192 0.33141357403558563 0.9238795325112897
+ outer loop
+ vertex 36.22198409214549 138.22573774106883 -42.69777747886726
+ vertex 40.04785713962944 139.5991312395182 -42.398076211353384
+ vertex 39.68608570728321 140.2257377410688 -42.697777478867266
+ endloop
+endfacet
+facet normal -0.06526309611002662 0.11303899832181592 0.9914448613738103
+ outer loop
+ vertex 39.68608570728321 140.2257377410688 -42.697777478867266
+ vertex 35.833755524491714 138.89816934519487 -42.800000000000054
+ vertex 36.22198409214549 138.22573774106883 -42.69777747886726
+ endloop
+endfacet
+facet normal -0.06526309611002662 0.11303899832181592 0.9914448613738103
+ outer loop
+ vertex 35.833755524491714 138.89816934519487 -42.800000000000054
+ vertex 39.68608570728321 140.2257377410688 -42.697777478867266
+ vertex 39.29785713962943 140.89816934519484 -42.80000000000006
+ endloop
+endfacet
+facet normal 0.06526309611002429 -0.1130389983218137 0.9914448613738107
+ outer loop
+ vertex 39.29785713962943 140.89816934519484 -42.80000000000006
+ vertex 35.44552695683794 139.57060094932092 -42.69777747886726
+ vertex 35.833755524491714 138.89816934519487 -42.800000000000054
+ endloop
+endfacet
+facet normal 0.06526309611002429 -0.1130389983218137 0.9914448613738107
+ outer loop
+ vertex 35.44552695683794 139.57060094932092 -42.69777747886726
+ vertex 39.29785713962943 140.89816934519484 -42.80000000000006
+ vertex 38.90962857197563 141.5706009493209 -42.697777478867266
+ endloop
+endfacet
+facet normal 0.19134171618254567 -0.33141357403559385 0.923879532511286
+ outer loop
+ vertex 38.90962857197563 141.5706009493209 -42.697777478867266
+ vertex 35.08375552449173 140.19720745087153 -42.39807621135337
+ vertex 35.44552695683794 139.57060094932092 -42.69777747886726
+ endloop
+endfacet
+facet normal 0.19134171618254567 -0.33141357403559385 0.923879532511286
+ outer loop
+ vertex 35.08375552449173 140.19720745087153 -42.39807621135337
+ vertex 38.90962857197563 141.5706009493209 -42.697777478867266
+ vertex 38.54785713962942 142.19720745087153 -42.39807621135338
+ endloop
+endfacet
+facet normal 0.30438071450436033 -0.5272028623656697 0.793353340291235
+ outer loop
+ vertex 38.54785713962942 142.19720745087153 -42.39807621135338
+ vertex 34.77309535271191 140.73528665228224 -41.9213203435597
+ vertex 35.08375552449173 140.19720745087153 -42.39807621135337
+ endloop
+endfacet
+facet normal 0.30438071450436033 -0.5272028623656697 0.793353340291235
+ outer loop
+ vertex 34.77309535271191 140.73528665228224 -41.9213203435597
+ vertex 38.54785713962942 142.19720745087153 -42.39807621135338
+ vertex 38.237196967849606 142.73528665228224 -41.92132034355971
+ endloop
+endfacet
+facet normal 0.3966766701456194 -0.6870641468694535 0.6087614290087157
+ outer loop
+ vertex 37.99881903395278 143.14816934519484 -41.30000000000006
+ vertex 34.77309535271191 140.73528665228224 -41.9213203435597
+ vertex 38.237196967849606 142.73528665228224 -41.92132034355971
+ endloop
+endfacet
+facet normal 0.3966766701456194 -0.6870641468694535 0.6087614290087157
+ outer loop
+ vertex 34.77309535271191 140.73528665228224 -41.9213203435597
+ vertex 37.99881903395278 143.14816934519484 -41.30000000000006
+ vertex 34.534717418815084 141.14816934519484 -41.300000000000054
+ endloop
+endfacet
+facet normal 0.46193976625564254 -0.800103145191264 0.38268343236509383
+ outer loop
+ vertex 37.84896840019583 143.40771825640826 -40.57645713530762
+ vertex 34.534717418815084 141.14816934519484 -41.300000000000054
+ vertex 37.99881903395278 143.14816934519484 -41.30000000000006
+ endloop
+endfacet
+facet normal 0.46193976625564254 -0.800103145191264 0.38268343236509383
+ outer loop
+ vertex 34.534717418815084 141.14816934519484 -41.300000000000054
+ vertex 37.84896840019583 143.40771825640826 -40.57645713530762
+ vertex 34.38486678505814 141.4077182564083 -40.576457135307614
+ endloop
+endfacet
+facet normal 0.4957224306869055 -0.8586164364012612 0.13052619222004908
+ outer loop
+ vertex 37.797857139629436 143.49624555654816 -39.80000000000006
+ vertex 34.38486678505814 141.4077182564083 -40.576457135307614
+ vertex 37.84896840019583 143.40771825640826 -40.57645713530762
+ endloop
+endfacet
+facet normal 0.4957224306869055 -0.8586164364012612 0.13052619222004908
+ outer loop
+ vertex 34.38486678505814 141.4077182564083 -40.576457135307614
+ vertex 37.797857139629436 143.49624555654816 -39.80000000000006
+ vertex 34.33375552449175 141.49624555654816 -39.800000000000054
+ endloop
+endfacet
+facet normal 0.5000000000000002 -0.8660254037844386 -3.4888037310101773e-16
+ outer loop
+ vertex 34.33375552449175 141.49624555654816 -25.800000000000047
+ vertex 37.797857139629436 143.49624555654816 -39.80000000000006
+ vertex 37.797857139629436 143.49624555654816 -25.80000000000006
+ endloop
+endfacet
+facet normal 0.5000000000000002 -0.8660254037844386 -3.4888037310101773e-16
+ outer loop
+ vertex 37.797857139629436 143.49624555654816 -39.80000000000006
+ vertex 34.33375552449175 141.49624555654816 -25.800000000000047
+ vertex 34.33375552449175 141.49624555654816 -39.800000000000054
+ endloop
+endfacet
+facet normal 0.49572243068690514 -0.8586164364012603 -0.13052619222005565
+ outer loop
+ vertex 34.38486678505814 141.4077182564083 -25.02354286469249
+ vertex 37.797857139629436 143.49624555654816 -25.80000000000006
+ vertex 37.84896840019583 143.40771825640826 -25.0235428646925
+ endloop
+endfacet
+facet normal 0.49572243068690514 -0.8586164364012603 -0.13052619222005565
+ outer loop
+ vertex 37.797857139629436 143.49624555654816 -25.80000000000006
+ vertex 34.38486678505814 141.4077182564083 -25.02354286469249
+ vertex 34.33375552449175 141.49624555654816 -25.800000000000047
+ endloop
+endfacet
+facet normal 0.4619397662556429 -0.8001031451912638 -0.38268343236509383
+ outer loop
+ vertex 34.534717418815084 141.14816934519484 -24.30000000000005
+ vertex 37.84896840019583 143.40771825640826 -25.0235428646925
+ vertex 37.99881903395278 143.14816934519484 -24.30000000000006
+ endloop
+endfacet
+facet normal 0.4619397662556429 -0.8001031451912638 -0.38268343236509383
+ outer loop
+ vertex 37.84896840019583 143.40771825640826 -25.0235428646925
+ vertex 34.534717418815084 141.14816934519484 -24.30000000000005
+ vertex 34.38486678505814 141.4077182564083 -25.02354286469249
+ endloop
+endfacet
+facet normal 0.39667667014561914 -0.6870641468694522 -0.6087614290087173
+ outer loop
+ vertex 34.77309535271191 140.73528665228224 -23.678679656440412
+ vertex 37.99881903395278 143.14816934519484 -24.30000000000006
+ vertex 38.237196967849606 142.7352866522822 -23.678679656440423
+ endloop
+endfacet
+facet normal 0.39667667014561914 -0.6870641468694522 -0.6087614290087173
+ outer loop
+ vertex 37.99881903395278 143.14816934519484 -24.30000000000006
+ vertex 34.77309535271191 140.73528665228224 -23.678679656440412
+ vertex 34.534717418815084 141.14816934519484 -24.30000000000005
+ endloop
+endfacet
+facet normal 0.3043807145043621 -0.5272028623656712 -0.7933533402912333
+ outer loop
+ vertex 34.77309535271191 140.73528665228224 -23.678679656440412
+ vertex 38.54785713962942 142.1972074508715 -23.20192378864675
+ vertex 35.08375552449173 140.19720745087153 -23.201923788646738
+ endloop
+endfacet
+facet normal 0.3043807145043621 -0.5272028623656712 -0.7933533402912333
+ outer loop
+ vertex 38.54785713962942 142.1972074508715 -23.20192378864675
+ vertex 34.77309535271191 140.73528665228224 -23.678679656440412
+ vertex 38.237196967849606 142.7352866522822 -23.678679656440423
+ endloop
+endfacet
+facet normal 0.19134171618254592 -0.33141357403559263 -0.9238795325112863
+ outer loop
+ vertex 35.08375552449173 140.19720745087153 -23.201923788646738
+ vertex 38.90962857197565 141.5706009493209 -22.902222521132856
+ vertex 35.44552695683796 139.5706009493209 -22.902222521132845
+ endloop
+endfacet
+facet normal 0.19134171618254592 -0.33141357403559263 -0.9238795325112863
+ outer loop
+ vertex 38.90962857197565 141.5706009493209 -22.902222521132856
+ vertex 35.08375552449173 140.19720745087153 -23.201923788646738
+ vertex 38.54785713962942 142.1972074508715 -23.20192378864675
+ endloop
+endfacet
+facet normal 0.06526309611002287 -0.11303899832180944 -0.9914448613738113
+ outer loop
+ vertex 35.44552695683796 139.5706009493209 -22.902222521132845
+ vertex 39.29785713962943 140.89816934519484 -22.800000000000065
+ vertex 35.833755524491714 138.89816934519484 -22.800000000000054
+ endloop
+endfacet
+facet normal 0.06526309611002287 -0.11303899832180944 -0.9914448613738113
+ outer loop
+ vertex 39.29785713962943 140.89816934519484 -22.800000000000065
+ vertex 35.44552695683796 139.5706009493209 -22.902222521132845
+ vertex 38.90962857197565 141.5706009493209 -22.902222521132856
+ endloop
+endfacet
+facet normal -0.06526309611002117 0.11303899832180829 -0.9914448613738115
+ outer loop
+ vertex 35.833755524491714 138.89816934519484 -22.800000000000054
+ vertex 39.68608570728323 140.2257377410688 -22.902222521132856
+ vertex 36.22198409214552 138.22573774106883 -22.902222521132845
+ endloop
+endfacet
+facet normal -0.06526309611002117 0.11303899832180829 -0.9914448613738115
+ outer loop
+ vertex 39.68608570728323 140.2257377410688 -22.902222521132856
+ vertex 35.833755524491714 138.89816934519484 -22.800000000000054
+ vertex 39.29785713962943 140.89816934519484 -22.800000000000065
+ endloop
+endfacet
+facet normal -0.19134171618254714 0.3314135740355965 -0.9238795325112845
+ outer loop
+ vertex 36.22198409214552 138.22573774106883 -22.902222521132845
+ vertex 40.04785713962944 139.59913123951816 -23.20192378864675
+ vertex 36.58375552449172 137.5991312395182 -23.201923788646738
+ endloop
+endfacet
+facet normal -0.19134171618254714 0.3314135740355965 -0.9238795325112845
+ outer loop
+ vertex 40.04785713962944 139.59913123951816 -23.20192378864675
+ vertex 36.22198409214552 138.22573774106883 -22.902222521132845
+ vertex 39.68608570728323 140.2257377410688 -22.902222521132856
+ endloop
+endfacet
+facet normal -0.30438071450436066 0.5272028623656703 -0.7933533402912343
+ outer loop
+ vertex 36.58375552449172 137.5991312395182 -23.201923788646738
+ vertex 40.35851731140925 139.06105203810745 -23.678679656440423
+ vertex 36.89441569627154 137.06105203810748 -23.678679656440412
+ endloop
+endfacet
+facet normal -0.30438071450436066 0.5272028623656703 -0.7933533402912343
+ outer loop
+ vertex 40.35851731140925 139.06105203810745 -23.678679656440423
+ vertex 36.58375552449172 137.5991312395182 -23.201923788646738
+ vertex 40.04785713962944 139.59913123951816 -23.20192378864675
+ endloop
+endfacet
+facet normal -0.39667667014561925 0.6870641468694533 -0.6087614290087159
+ outer loop
+ vertex 37.132793630168365 136.64816934519487 -24.300000000000058
+ vertex 40.35851731140925 139.06105203810745 -23.678679656440423
+ vertex 40.59689524530608 138.64816934519484 -24.300000000000068
+ endloop
+endfacet
+facet normal -0.39667667014561925 0.6870641468694533 -0.6087614290087159
+ outer loop
+ vertex 40.35851731140925 139.06105203810745 -23.678679656440423
+ vertex 37.132793630168365 136.64816934519487 -24.300000000000058
+ vertex 36.89441569627154 137.06105203810748 -23.678679656440412
+ endloop
+endfacet
+facet normal -0.461939766255642 0.8001031451912631 -0.38268343236509633
+ outer loop
+ vertex 37.28264426392531 136.38862043398143 -25.02354286469249
+ vertex 40.59689524530608 138.64816934519484 -24.300000000000068
+ vertex 40.74674587906303 138.3886204339814 -25.0235428646925
+ endloop
+endfacet
+facet normal -0.461939766255642 0.8001031451912631 -0.38268343236509633
+ outer loop
+ vertex 40.59689524530608 138.64816934519484 -24.300000000000068
+ vertex 37.28264426392531 136.38862043398143 -25.02354286469249
+ vertex 37.132793630168365 136.64816934519487 -24.300000000000058
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 15.497857139629502 182.12097856533416 -62.600000000000065
+ vertex 22.989038094526958 169.14587254275935 -55.531851652578204
+ vertex 43.143156601250205 134.23791530735045 -62.60000000000003
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 22.989038094526958 169.14587254275935 -55.531851652578204
+ vertex 15.497857139629502 182.12097856533416 -62.600000000000065
+ vertex 22.74785713962947 169.56361021045976 -55.33205080756894
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 22.74785713962947 169.56361021045976 -55.33205080756894
+ vertex 15.497857139629502 182.12097856533416 -62.600000000000065
+ vertex 22.540750358442942 169.92232967806692 -55.01421356237316
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 22.540750358442942 169.92232967806692 -55.01421356237316
+ vertex 15.497857139629502 182.12097856533416 -62.600000000000065
+ vertex 22.381831735845036 170.19758480667534 -54.60000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 22.381831735845036 170.19758480667534 -54.60000000000006
+ vertex 15.497857139629502 182.12097856533416 -62.600000000000065
+ vertex 22.28193131334041 170.37061741415096 -54.117638090205105
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 22.28193131334041 170.37061741415096 -54.117638090205105
+ vertex 15.497857139629502 182.12097856533416 -62.600000000000065
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 43.143156601250205 134.23791530735045 -62.60000000000003
+ vertex 22.989038094526958 169.14587254275935 -55.531851652578204
+ vertex 23.24785713962949 168.69758480667534 -55.600000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 22.28193131334041 170.37061741415096 -54.117638090205105
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 22.247857139629495 170.4296356142442 -53.60000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 22.247857139629495 170.4296356142442 -53.60000000000006
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 22.247857139629495 170.4296356142442 -51.60000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 22.247857139629495 170.4296356142442 -51.60000000000005
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 22.28193131334041 170.37061741415096 -51.082361909795004
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 22.28193131334041 170.37061741415096 -51.082361909795004
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 22.381831735845036 170.19758480667534 -50.600000000000044
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 22.381831735845036 170.19758480667534 -50.600000000000044
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 22.540750358442942 169.92232967806692 -50.18578643762695
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 22.540750358442942 169.92232967806692 -50.18578643762695
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 22.74785713962945 169.56361021045976 -49.867949192431176
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 22.74785713962945 169.56361021045976 -49.867949192431176
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 22.989038094526958 169.14587254275935 -49.668148347421905
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 22.989038094526958 169.14587254275935 -49.668148347421905
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 23.24785713962949 168.69758480667534 -49.600000000000044
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 23.24785713962949 168.69758480667534 -49.600000000000044
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 35.64785713962948 147.22015479282123 -49.600000000000044
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 35.64785713962948 147.22015479282123 -49.600000000000044
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 22.540750358442942 169.92232967806692 -15.414213562373153
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 35.64785713962948 147.22015479282123 -49.600000000000044
+ vertex 22.540750358442942 169.92232967806692 -15.414213562373153
+ vertex 38.237196967849606 142.73528665228224 -41.92132034355971
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 35.64785713962948 147.22015479282123 -49.600000000000044
+ vertex 38.237196967849606 142.73528665228224 -41.92132034355971
+ vertex 38.54785713962942 142.19720745087153 -42.39807621135338
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 35.64785713962948 147.22015479282123 -49.600000000000044
+ vertex 38.54785713962942 142.19720745087153 -42.39807621135338
+ vertex 38.90962857197563 141.5706009493209 -42.697777478867266
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 35.64785713962948 147.22015479282123 -49.600000000000044
+ vertex 38.90962857197563 141.5706009493209 -42.697777478867266
+ vertex 39.29785713962943 140.89816934519484 -42.80000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 38.237196967849606 142.73528665228224 -41.92132034355971
+ vertex 22.540750358442942 169.92232967806692 -15.414213562373153
+ vertex 37.99881903395278 143.14816934519484 -41.30000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 37.99881903395278 143.14816934519484 -41.30000000000006
+ vertex 22.540750358442942 169.92232967806692 -15.414213562373153
+ vertex 37.84896840019583 143.40771825640826 -40.57645713530762
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 37.84896840019583 143.40771825640826 -40.57645713530762
+ vertex 22.540750358442942 169.92232967806692 -15.414213562373153
+ vertex 37.797857139629436 143.49624555654816 -39.80000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 37.797857139629436 143.49624555654816 -39.80000000000006
+ vertex 22.540750358442942 169.92232967806692 -15.414213562373153
+ vertex 22.74785713962949 169.56361021045976 -15.732050807568937
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 37.797857139629436 143.49624555654816 -39.80000000000006
+ vertex 22.74785713962949 169.56361021045976 -15.732050807568937
+ vertex 22.989038094526958 169.14587254275938 -15.931851652578198
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 37.797857139629436 143.49624555654816 -39.80000000000006
+ vertex 22.989038094526958 169.14587254275938 -15.931851652578198
+ vertex 37.797857139629436 143.49624555654816 -25.80000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 37.797857139629436 143.49624555654816 -25.80000000000006
+ vertex 22.989038094526958 169.14587254275938 -15.931851652578198
+ vertex 37.84896840019583 143.40771825640826 -25.0235428646925
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 37.84896840019583 143.40771825640826 -25.0235428646925
+ vertex 22.989038094526958 169.14587254275938 -15.931851652578198
+ vertex 37.99881903395278 143.14816934519484 -24.30000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 37.99881903395278 143.14816934519484 -24.30000000000006
+ vertex 22.989038094526958 169.14587254275938 -15.931851652578198
+ vertex 38.237196967849606 142.7352866522822 -23.678679656440423
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 38.237196967849606 142.7352866522822 -23.678679656440423
+ vertex 22.989038094526958 169.14587254275938 -15.931851652578198
+ vertex 38.54785713962942 142.1972074508715 -23.20192378864675
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 38.54785713962942 142.1972074508715 -23.20192378864675
+ vertex 22.989038094526958 169.14587254275938 -15.931851652578198
+ vertex 38.90962857197565 141.5706009493209 -22.902222521132856
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 38.90962857197565 141.5706009493209 -22.902222521132856
+ vertex 22.989038094526958 169.14587254275938 -15.931851652578198
+ vertex 39.29785713962943 140.89816934519484 -22.800000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 39.29785713962943 140.89816934519484 -22.800000000000065
+ vertex 22.989038094526958 169.14587254275938 -15.931851652578198
+ vertex 23.24785713962949 168.69758480667534 -16.00000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 22.540750358442942 169.92232967806692 -15.414213562373153
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 22.381831735845058 170.19758480667537 -15.000000000000057
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 22.381831735845058 170.19758480667537 -15.000000000000057
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 22.28193131334041 170.37061741415096 -14.517638090205098
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 22.28193131334041 170.37061741415096 -14.517638090205098
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 22.247857139629495 170.4296356142442 -14.000000000000059
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 22.247857139629495 170.4296356142442 -14.000000000000059
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 22.247857139629495 170.4296356142442 -12.000000000000046
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 22.247857139629495 170.4296356142442 -12.000000000000046
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 22.28193131334041 170.37061741415096 -11.482361909795012
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 22.28193131334041 170.37061741415096 -11.482361909795012
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 22.381831735845058 170.19758480667537 -11.000000000000048
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 22.381831735845058 170.19758480667537 -11.000000000000048
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 22.540750358442942 169.92232967806692 -10.58578643762696
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 22.540750358442942 169.92232967806692 -10.58578643762696
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 22.74785713962947 169.56361021045979 -10.267949192431178
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 22.74785713962947 169.56361021045979 -10.267949192431178
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 22.989038094526958 169.14587254275938 -10.068148347421912
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 22.989038094526958 169.14587254275938 -10.068148347421912
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 23.24785713962949 168.69758480667534 -10.00000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 23.24785713962949 168.69758480667534 -10.00000000000005
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 35.647857139629494 147.22015479282126 -10.00000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 43.143156601250205 134.23791530735045 -62.60000000000003
+ vertex 40.79785713962944 138.30009313384156 -39.80000000000006
+ vertex 43.143156601250205 134.23791530735045 -3.0000000000000284
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 40.79785713962944 138.30009313384156 -39.80000000000006
+ vertex 43.143156601250205 134.23791530735045 -62.60000000000003
+ vertex 40.74674587906305 138.38862043398143 -40.57645713530763
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 40.74674587906305 138.38862043398143 -40.57645713530763
+ vertex 43.143156601250205 134.23791530735045 -62.60000000000003
+ vertex 40.5968952453061 138.64816934519487 -41.30000000000007
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 40.5968952453061 138.64816934519487 -41.30000000000007
+ vertex 43.143156601250205 134.23791530735045 -62.60000000000003
+ vertex 36.51388254341391 145.72015479282123 -54.60000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 36.51388254341391 145.72015479282123 -54.60000000000006
+ vertex 43.143156601250205 134.23791530735045 -62.60000000000003
+ vertex 36.35496392081603 145.99540992142965 -55.01421356237316
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 36.35496392081603 145.99540992142965 -55.01421356237316
+ vertex 43.143156601250205 134.23791530735045 -62.60000000000003
+ vertex 36.14785713962947 146.35412938903679 -55.33205080756894
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 36.14785713962947 146.35412938903679 -55.33205080756894
+ vertex 43.143156601250205 134.23791530735045 -62.60000000000003
+ vertex 35.906676184732014 146.77186705673722 -55.531851652578204
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 35.906676184732014 146.77186705673722 -55.531851652578204
+ vertex 43.143156601250205 134.23791530735045 -62.60000000000003
+ vertex 35.64785713962948 147.22015479282123 -55.600000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 35.64785713962948 147.22015479282123 -55.600000000000065
+ vertex 43.143156601250205 134.23791530735045 -62.60000000000003
+ vertex 23.24785713962949 168.69758480667534 -55.600000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 40.5968952453061 138.64816934519487 -41.30000000000007
+ vertex 36.51388254341391 145.72015479282123 -54.60000000000006
+ vertex 36.613782965918546 145.54712218534561 -54.117638090205105
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 40.5968952453061 138.64816934519487 -41.30000000000007
+ vertex 36.613782965918546 145.54712218534561 -54.117638090205105
+ vertex 36.64785713962948 145.48810398525237 -53.60000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 40.5968952453061 138.64816934519487 -41.30000000000007
+ vertex 36.64785713962948 145.48810398525237 -53.60000000000006
+ vertex 36.64785713962948 145.48810398525237 -51.60000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 40.5968952453061 138.64816934519487 -41.30000000000007
+ vertex 36.64785713962948 145.48810398525237 -51.60000000000005
+ vertex 40.35851731140927 139.06105203810748 -41.921320343559714
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 40.35851731140927 139.06105203810748 -41.921320343559714
+ vertex 36.64785713962948 145.48810398525237 -51.60000000000005
+ vertex 36.61378296591853 145.54712218534561 -51.082361909795004
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 40.35851731140927 139.06105203810748 -41.921320343559714
+ vertex 36.61378296591853 145.54712218534561 -51.082361909795004
+ vertex 36.51388254341391 145.72015479282123 -50.600000000000044
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 40.35851731140927 139.06105203810748 -41.921320343559714
+ vertex 36.51388254341391 145.72015479282123 -50.600000000000044
+ vertex 36.35496392081603 145.99540992142965 -50.18578643762695
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 40.35851731140927 139.06105203810748 -41.921320343559714
+ vertex 36.35496392081603 145.99540992142965 -50.18578643762695
+ vertex 36.14785713962947 146.35412938903679 -49.867949192431176
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 40.35851731140927 139.06105203810748 -41.921320343559714
+ vertex 36.14785713962947 146.35412938903679 -49.867949192431176
+ vertex 35.906676184732014 146.77186705673722 -49.668148347421905
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 40.35851731140927 139.06105203810748 -41.921320343559714
+ vertex 35.906676184732014 146.77186705673722 -49.668148347421905
+ vertex 35.64785713962948 147.22015479282123 -49.600000000000044
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 40.35851731140927 139.06105203810748 -41.921320343559714
+ vertex 35.64785713962948 147.22015479282123 -49.600000000000044
+ vertex 40.04785713962944 139.5991312395182 -42.398076211353384
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 40.04785713962944 139.5991312395182 -42.398076211353384
+ vertex 35.64785713962948 147.22015479282123 -49.600000000000044
+ vertex 39.68608570728321 140.2257377410688 -42.697777478867266
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 39.68608570728321 140.2257377410688 -42.697777478867266
+ vertex 35.64785713962948 147.22015479282123 -49.600000000000044
+ vertex 39.29785713962943 140.89816934519484 -42.80000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 43.143156601250205 134.23791530735045 -3.0000000000000284
+ vertex 40.79785713962944 138.30009313384156 -39.80000000000006
+ vertex 40.79785713962942 138.30009313384153 -25.800000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 43.143156601250205 134.23791530735045 -3.0000000000000284
+ vertex 40.79785713962942 138.30009313384153 -25.800000000000065
+ vertex 40.74674587906303 138.3886204339814 -25.0235428646925
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 43.143156601250205 134.23791530735045 -3.0000000000000284
+ vertex 40.74674587906303 138.3886204339814 -25.0235428646925
+ vertex 40.59689524530608 138.64816934519484 -24.300000000000068
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 43.143156601250205 134.23791530735045 -3.0000000000000284
+ vertex 40.59689524530608 138.64816934519484 -24.300000000000068
+ vertex 40.35851731140925 139.06105203810745 -23.678679656440423
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 43.143156601250205 134.23791530735045 -3.0000000000000284
+ vertex 40.35851731140925 139.06105203810745 -23.678679656440423
+ vertex 40.04785713962944 139.59913123951816 -23.20192378864675
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 43.143156601250205 134.23791530735045 -3.0000000000000284
+ vertex 40.04785713962944 139.59913123951816 -23.20192378864675
+ vertex 39.68608570728323 140.2257377410688 -22.902222521132856
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 43.143156601250205 134.23791530735045 -3.0000000000000284
+ vertex 39.68608570728323 140.2257377410688 -22.902222521132856
+ vertex 39.29785713962943 140.89816934519484 -22.800000000000065
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 43.143156601250205 134.23791530735045 -3.0000000000000284
+ vertex 39.29785713962943 140.89816934519484 -22.800000000000065
+ vertex 36.35496392081605 145.99540992142965 -15.414213562373153
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 36.35496392081605 145.99540992142965 -15.414213562373153
+ vertex 39.29785713962943 140.89816934519484 -22.800000000000065
+ vertex 36.14785713962948 146.3541293890368 -15.732050807568937
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 36.14785713962948 146.3541293890368 -15.732050807568937
+ vertex 39.29785713962943 140.89816934519484 -22.800000000000065
+ vertex 35.906676184732014 146.77186705673722 -15.931851652578198
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 35.906676184732014 146.77186705673722 -15.931851652578198
+ vertex 39.29785713962943 140.89816934519484 -22.800000000000065
+ vertex 35.647857139629494 147.22015479282126 -16.00000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 35.647857139629494 147.22015479282126 -16.00000000000006
+ vertex 39.29785713962943 140.89816934519484 -22.800000000000065
+ vertex 23.24785713962949 168.69758480667534 -16.00000000000006
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 43.143156601250205 134.23791530735045 -3.0000000000000284
+ vertex 36.35496392081605 145.99540992142965 -15.414213562373153
+ vertex 36.513882543413914 145.72015479282126 -15.000000000000057
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 43.143156601250205 134.23791530735045 -3.0000000000000284
+ vertex 36.513882543413914 145.72015479282126 -15.000000000000057
+ vertex 36.61378296591855 145.54712218534564 -14.517638090205098
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 43.143156601250205 134.23791530735045 -3.0000000000000284
+ vertex 36.61378296591855 145.54712218534564 -14.517638090205098
+ vertex 36.647857139629494 145.4881039852524 -14.000000000000059
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 43.143156601250205 134.23791530735045 -3.0000000000000284
+ vertex 36.647857139629494 145.4881039852524 -14.000000000000059
+ vertex 36.647857139629494 145.4881039852524 -12.000000000000046
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 43.143156601250205 134.23791530735045 -3.0000000000000284
+ vertex 36.647857139629494 145.4881039852524 -12.000000000000046
+ vertex 36.613782965918546 145.54712218534564 -11.482361909795012
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 43.143156601250205 134.23791530735045 -3.0000000000000284
+ vertex 36.613782965918546 145.54712218534564 -11.482361909795012
+ vertex 36.513882543413914 145.72015479282126 -11.000000000000048
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 43.143156601250205 134.23791530735045 -3.0000000000000284
+ vertex 36.513882543413914 145.72015479282126 -11.000000000000048
+ vertex 36.35496392081605 145.99540992142965 -10.58578643762696
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 43.143156601250205 134.23791530735045 -3.0000000000000284
+ vertex 36.35496392081605 145.99540992142965 -10.58578643762696
+ vertex 36.14785713962948 146.3541293890368 -10.267949192431178
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 43.143156601250205 134.23791530735045 -3.0000000000000284
+ vertex 36.14785713962948 146.3541293890368 -10.267949192431178
+ vertex 35.906676184732014 146.77186705673722 -10.068148347421912
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 43.143156601250205 134.23791530735045 -3.0000000000000284
+ vertex 35.906676184732014 146.77186705673722 -10.068148347421912
+ vertex 35.647857139629494 147.22015479282126 -10.00000000000005
+ endloop
+endfacet
+facet normal 0.8660254037844393 0.49999999999999883 -9.792648627520377e-17
+ outer loop
+ vertex 43.143156601250205 134.23791530735045 -3.0000000000000284
+ vertex 35.647857139629494 147.22015479282126 -10.00000000000005
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ endloop
+endfacet
+facet normal -1.7761928181661448e-15 -1.0 1.892594954730134e-16
+ outer loop
+ vertex -41.8783177822545 132.23791530735053 -3.000000000000062
+ vertex -39.568916705496 132.2379153073505 -62.600000000000065
+ vertex -39.568916705496 132.2379153073505 -3.000000000000062
+ endloop
+endfacet
+facet normal -1.7761928181661448e-15 -1.0 1.892594954730134e-16
+ outer loop
+ vertex -39.568916705496 132.2379153073505 -62.600000000000065
+ vertex -41.8783177822545 132.23791530735053 -3.000000000000062
+ vertex -41.8783177822545 132.2379153073505 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.1211494213554586 -0.9926342819514333 1.878833171115841e-16
+ outer loop
+ vertex -42.436689296971025 132.30606365477237 -3.000000000000062
+ vertex -41.8783177822545 132.2379153073505 -62.600000000000065
+ vertex -41.8783177822545 132.23791530735053 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.1211494213554586 -0.9926342819514333 1.878833171115841e-16
+ outer loop
+ vertex -41.8783177822545 132.2379153073505 -62.600000000000065
+ vertex -42.436689296971025 132.30606365477237 -3.000000000000062
+ vertex -42.436689296971025 132.30606365477237 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9555126440105993 -0.2949501434749163 4.897386689705105e-17
+ outer loop
+ vertex -43.173106986658425 132.82370174497743 -3.000000000000062
+ vertex -43.30096751306486 133.2379153073505 -62.600000000000065
+ vertex -43.173106986658425 132.82370174497743 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9555126440105993 -0.2949501434749163 4.897386689705105e-17
+ outer loop
+ vertex -43.30096751306486 133.2379153073505 -62.600000000000065
+ vertex -43.173106986658425 132.82370174497743 -3.000000000000062
+ vertex -43.30096751306486 133.23791530735053 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.41219617871317576 -0.9110951159205364 1.7252155348074176e-16
+ outer loop
+ vertex -42.87831778225449 132.50586449978164 -3.000000000000062
+ vertex -42.436689296971025 132.30606365477237 -62.600000000000065
+ vertex -42.436689296971025 132.30606365477237 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.41219617871317576 -0.9110951159205364 1.7252155348074176e-16
+ outer loop
+ vertex -42.436689296971025 132.30606365477237 -62.600000000000065
+ vertex -42.87831778225449 132.50586449978164 -3.000000000000062
+ vertex -42.87831778225449 132.50586449978164 -62.600000000000065
+ endloop
+endfacet
+facet normal 0.12114942135545749 -0.9926342819514336 1.878442236207161e-16
+ outer loop
+ vertex 41.98845606287095 132.23791530735048 -3.0000000000000284
+ vertex 42.546827577587486 132.30606365477232 -62.60000000000003
+ vertex 42.546827577587486 132.30606365477232 -3.0000000000000284
+ endloop
+endfacet
+facet normal 0.12114942135545749 -0.9926342819514336 1.878442236207161e-16
+ outer loop
+ vertex 42.546827577587486 132.30606365477232 -62.60000000000003
+ vertex 41.98845606287095 132.23791530735048 -3.0000000000000284
+ vertex 41.98845606287095 132.23791530735045 -62.60000000000003
+ endloop
+endfacet
+facet normal 0.9202212155149997 0.39139866442809484 -7.411378289433389e-17
+ outer loop
+ vertex 43.143156601250205 134.23791530735045 -3.0000000000000284
+ vertex 43.3633241585152 133.72027721714542 -62.60000000000003
+ vertex 43.143156601250205 134.23791530735045 -62.60000000000003
+ endloop
+endfacet
+facet normal 0.9202212155149997 0.39139866442809484 -7.411378289433389e-17
+ outer loop
+ vertex 43.3633241585152 133.72027721714542 -62.60000000000003
+ vertex 43.143156601250205 134.23791530735045 -3.0000000000000284
+ vertex 43.3633241585152 133.72027721714542 -3.0000000000000284
+ endloop
+endfacet
+facet normal 0.9555126440105912 -0.29495014347494236 5.601884531566134e-17
+ outer loop
+ vertex 43.41110579368132 133.23791530735048 -3.0000000000000284
+ vertex 43.28324526727487 132.82370174497737 -62.60000000000003
+ vertex 43.41110579368132 133.23791530735045 -62.60000000000003
+ endloop
+endfacet
+facet normal 0.9555126440105912 -0.29495014347494236 5.601884531566134e-17
+ outer loop
+ vertex 43.28324526727487 132.82370174497737 -62.60000000000003
+ vertex 43.41110579368132 133.23791530735048 -3.0000000000000284
+ vertex 43.28324526727487 132.82370174497737 -3.0000000000000284
+ endloop
+endfacet
+facet normal -0.9951296050076995 0.09857519585179557 -1.1646732101374746e-17
+ outer loop
+ vertex -43.30096751306486 133.23791530735053 -3.000000000000062
+ vertex -43.253185877898744 133.72027721714548 -62.600000000000065
+ vertex -43.30096751306486 133.2379153073505 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9951296050076995 0.09857519585179557 -1.1646732101374746e-17
+ outer loop
+ vertex -43.253185877898744 133.72027721714548 -62.600000000000065
+ vertex -43.30096751306486 133.23791530735053 -3.000000000000062
+ vertex -43.253185877898744 133.72027721714548 -3.000000000000062
+ endloop
+endfacet
+facet normal 0.9951296050076998 0.09857519585179428 -1.8665829314470085e-17
+ outer loop
+ vertex 43.3633241585152 133.72027721714542 -3.0000000000000284
+ vertex 43.41110579368132 133.23791530735045 -62.60000000000003
+ vertex 43.3633241585152 133.72027721714542 -62.60000000000003
+ endloop
+endfacet
+facet normal 0.9951296050076998 0.09857519585179428 -1.8665829314470085e-17
+ outer loop
+ vertex 43.41110579368132 133.23791530735045 -62.60000000000003
+ vertex 43.3633241585152 133.72027721714542 -3.0000000000000284
+ vertex 43.41110579368132 133.23791530735048 -3.0000000000000284
+ endloop
+endfacet
+facet normal 0.733190639104467 -0.680023151612931 1.2888213579542975e-16
+ outer loop
+ vertex 43.28324526727487 132.82370174497737 -3.0000000000000284
+ vertex 42.98845606287095 132.50586449978158 -62.60000000000003
+ vertex 43.28324526727487 132.82370174497737 -62.60000000000003
+ endloop
+endfacet
+facet normal 0.733190639104467 -0.680023151612931 1.2888213579542975e-16
+ outer loop
+ vertex 42.98845606287095 132.50586449978158 -62.60000000000003
+ vertex 43.28324526727487 132.82370174497737 -3.0000000000000284
+ vertex 42.98845606287095 132.50586449978158 -3.0000000000000284
+ endloop
+endfacet
+facet normal 0.41219617871317477 -0.9110951159205368 1.725215534807417e-16
+ outer loop
+ vertex 42.546827577587486 132.30606365477232 -3.0000000000000284
+ vertex 42.98845606287095 132.50586449978158 -62.60000000000003
+ vertex 42.98845606287095 132.50586449978158 -3.0000000000000284
+ endloop
+endfacet
+facet normal 0.41219617871317477 -0.9110951159205368 1.725215534807417e-16
+ outer loop
+ vertex 42.98845606287095 132.50586449978158 -62.60000000000003
+ vertex 42.546827577587486 132.30606365477232 -3.0000000000000284
+ vertex 42.546827577587486 132.30606365477232 -62.60000000000003
+ endloop
+endfacet
+facet normal -0.7331906391044548 -0.6800231516129441 1.2865950612637326e-16
+ outer loop
+ vertex -42.87831778225449 132.50586449978164 -3.000000000000062
+ vertex -43.173106986658425 132.82370174497743 -62.600000000000065
+ vertex -42.87831778225449 132.50586449978164 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.7331906391044548 -0.6800231516129441 1.2865950612637326e-16
+ outer loop
+ vertex -43.173106986658425 132.82370174497743 -62.600000000000065
+ vertex -42.87831778225449 132.50586449978164 -3.000000000000062
+ vertex -43.173106986658425 132.82370174497743 -3.000000000000062
+ endloop
+endfacet
+facet normal -0.9202212155149919 0.39139866442811333 -3.711855016837844e-17
+ outer loop
+ vertex -43.253185877898744 133.72027721714548 -3.000000000000062
+ vertex -43.03301832063373 134.23791530735053 -62.600000000000065
+ vertex -43.253185877898744 133.72027721714548 -62.600000000000065
+ endloop
+endfacet
+facet normal -0.9202212155149919 0.39139866442811333 -3.711855016837844e-17
+ outer loop
+ vertex -43.03301832063373 134.23791530735053 -62.600000000000065
+ vertex -43.253185877898744 133.72027721714548 -3.000000000000062
+ vertex -43.03301832063373 134.23791530735053 -3.000000000000062
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 8.305069140308264 197.22612362681 -62.600000000000065
+ vertex 10.30506914030826 191.96896450555053 -62.600000000000065
+ vertex 8.305069140308264 191.96896450555053 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 10.305069140308255 184.37612362681 -62.600000000000065
+ vertex 12.80506914030825 186.78502419417032 -62.60000000000008
+ vertex 13.997857139629506 184.71905477668744 -62.60000000000008
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 12.80506914030825 186.78502419417032 -62.60000000000008
+ vertex 10.305069140308255 184.37612362681 -62.600000000000065
+ vertex 10.30506914030826 191.96896450555053 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 12.80506914030825 186.78502419417032 -62.60000000000008
+ vertex 10.30506914030826 191.96896450555053 -62.600000000000065
+ vertex 12.805069140308262 204.43638645629036 -62.60000000000009
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 12.805069140308262 204.43638645629036 -62.60000000000009
+ vertex 10.30506914030826 191.96896450555053 -62.600000000000065
+ vertex 10.30506914030826 197.22612362681 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 10.30506914030826 197.22612362681 -62.600000000000065
+ vertex 10.30506914030826 191.96896450555053 -62.600000000000065
+ vertex 8.305069140308264 197.22612362681 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 12.805069140308262 204.43638645629036 -62.60000000000009
+ vertex 10.30506914030826 197.22612362681 -62.600000000000065
+ vertex 10.305069140308266 204.87612362680997 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 41.98845606287095 132.23791530735045 -62.60000000000003
+ vertex 39.679054986112455 132.23791530735045 -62.60000000000003
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 41.98845606287095 132.23791530735045 -62.60000000000003
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 42.546827577587486 132.30606365477232 -62.60000000000003
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 42.546827577587486 132.30606365477232 -62.60000000000003
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 42.98845606287095 132.50586449978158 -62.60000000000003
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 42.98845606287095 132.50586449978158 -62.60000000000003
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 43.28324526727487 132.82370174497737 -62.60000000000003
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 43.28324526727487 132.82370174497737 -62.60000000000003
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 43.41110579368132 133.23791530735045 -62.60000000000003
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 43.41110579368132 133.23791530735045 -62.60000000000003
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 43.3633241585152 133.72027721714542 -62.60000000000003
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 43.3633241585152 133.72027721714542 -62.60000000000003
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 43.143156601250205 134.23791530735045 -62.60000000000003
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 43.143156601250205 134.23791530735045 -62.60000000000003
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 15.497857139629502 182.12097856533416 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 15.497857139629502 182.12097856533416 -62.600000000000065
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 24.768613200629805 157.93973105977085 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 24.768613200629805 157.93973105977085 -62.60000000000005
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 24.95247246551566 157.25355894177457 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 24.95247246551566 157.25355894177457 -62.60000000000005
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 25.01438595718246 156.54588449377644 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 25.01438595718246 156.54588449377644 -62.60000000000005
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 24.95247246551566 155.8382100457783 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 24.95247246551566 155.8382100457783 -62.60000000000005
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 24.768613200629805 155.15203792778206 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 24.768613200629805 155.15203792778206 -62.60000000000005
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 24.46839463325119 154.50821713237312 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 24.46839463325119 154.50821713237312 -62.60000000000005
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 24.060938752631678 153.92630982863102 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 24.060938752631678 153.92630982863102 -62.60000000000005
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 23.55862589952126 153.4239969755206 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 23.55862589952126 153.4239969755206 -62.60000000000005
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 23.06122021535224 153.05393896729822 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 23.06122021535224 153.05393896729822 -62.600000000000065
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 22.373300682659444 152.73315682100917 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 22.373300682659444 152.73315682100917 -62.600000000000065
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 22.332897800370226 152.71632252752246 -62.600000000000044
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 22.332897800370226 152.71632252752246 -62.600000000000044
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 21.640128958283878 152.5367040495494 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 21.640128958283878 152.5367040495494 -62.600000000000065
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex 20.939051234375828 152.47054977096982 -62.600000000000044
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 20.939051234375828 152.47054977096982 -62.600000000000044
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ vertex -20.828912953759342 152.47054977096985 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 23.06122021535224 153.05393896729822 -62.600000000000065
+ vertex 22.373300682659444 152.73315682100917 -62.600000000000065
+ vertex 22.976718595779143 153.01654109490107 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 15.497857139629502 182.12097856533416 -62.600000000000065
+ vertex 24.768613200629805 157.93973105977085 -62.60000000000005
+ vertex 24.468394633251194 158.58355185517976 -62.60000000000005
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 15.497857139629502 182.12097856533416 -62.600000000000065
+ vertex 24.468394633251194 158.58355185517976 -62.60000000000005
+ vertex 11.770977400728352 180.57612362681 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 15.497857139629502 182.12097856533416 -62.600000000000065
+ vertex 11.770977400728352 180.57612362681 -62.600000000000065
+ vertex -15.387718859012988 182.12097856533416 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 15.497857139629502 182.12097856533416 -62.600000000000065
+ vertex -15.387718859012988 182.12097856533416 -62.600000000000065
+ vertex -10.194930859691729 184.37612362681 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -10.194930859691729 184.37612362681 -62.600000000000065
+ vertex -15.387718859012988 182.12097856533416 -62.600000000000065
+ vertex -13.88771885901298 184.7190547766875 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -13.88771885901298 184.7190547766875 -62.600000000000065
+ vertex -15.387718859012988 182.12097856533416 -62.600000000000065
+ vertex -29.842081742052876 190.4662088668218 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -13.88771885901298 184.7190547766875 -62.600000000000065
+ vertex -29.842081742052876 190.4662088668218 -62.600000000000065
+ vertex -28.21522640798993 192.79613663226192 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -28.21522640798993 192.79613663226192 -62.600000000000065
+ vertex -29.842081742052876 190.4662088668218 -62.600000000000065
+ vertex -32.44493085969176 191.9689645055506 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -28.21522640798993 192.79613663226192 -62.600000000000065
+ vertex -32.44493085969176 191.9689645055506 -62.600000000000065
+ vertex -31.55147180223168 193.3101090711995 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -28.21522640798993 192.79613663226192 -62.600000000000065
+ vertex -31.55147180223168 193.3101090711995 -62.600000000000065
+ vertex -27.290873495142403 193.95965933221274 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -27.290873495142403 193.95965933221274 -62.600000000000065
+ vertex -31.55147180223168 193.3101090711995 -62.600000000000065
+ vertex -30.60270404808994 194.61271322520327 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -27.290873495142403 193.95965933221274 -62.600000000000065
+ vertex -30.60270404808994 194.61271322520327 -62.600000000000065
+ vertex -26.318667561951766 195.08350496407658 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -26.318667561951766 195.08350496407658 -62.600000000000065
+ vertex -30.60270404808994 194.61271322520327 -62.600000000000065
+ vertex -29.600287858287494 195.87449752362713 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -26.318667561951766 195.08350496407658 -62.600000000000065
+ vertex -29.600287858287494 195.87449752362713 -62.600000000000065
+ vertex -25.300309884213064 196.16570689577932 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -25.300309884213064 196.16570689577932 -62.600000000000065
+ vertex -29.600287858287494 195.87449752362713 -62.600000000000065
+ vertex -28.545977373939976 197.09325395373202 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -25.300309884213064 196.16570689577932 -62.600000000000065
+ vertex -28.545977373939976 197.09325395373202 -62.600000000000065
+ vertex -24.237582499258796 197.20437136809886 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -24.237582499258796 197.20437136809886 -62.600000000000065
+ vertex -28.545977373939976 197.09325395373202 -62.600000000000065
+ vertex -27.44161754666337 198.2668497978047 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -24.237582499258796 197.20437136809886 -62.600000000000065
+ vertex -27.44161754666337 198.2668497978047 -62.600000000000065
+ vertex -23.132345087548707 198.19768080857895 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -23.132345087548707 198.19768080857895 -62.600000000000065
+ vertex -27.44161754666337 198.2668497978047 -62.600000000000065
+ vertex -21.986531718390673 199.14389701212295 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -21.986531718390673 199.14389701212295 -62.600000000000065
+ vertex -27.44161754666337 198.2668497978047 -62.600000000000065
+ vertex -26.28914091006915 199.39323136522827 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -21.986531718390673 199.14389701212295 -62.600000000000065
+ vertex -26.28914091006915 199.39323136522827 -62.600000000000065
+ vertex -20.80214746548775 200.04136418270141 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -20.80214746548775 200.04136418270141 -62.600000000000065
+ vertex -26.28914091006915 199.39323136522827 -62.600000000000065
+ vertex -25.09056419799865 200.470427586262 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -20.80214746548775 200.04136418270141 -62.600000000000065
+ vertex -25.09056419799865 200.470427586262 -62.600000000000065
+ vertex -19.58126489823363 200.8885118308511 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -19.58126489823363 200.8885118308511 -62.600000000000065
+ vertex -25.09056419799865 200.470427586262 -62.600000000000065
+ vertex -23.847984815414293 201.49655346124194 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -19.58126489823363 200.8885118308511 -62.600000000000065
+ vertex -23.847984815414293 201.49655346124194 -62.600000000000065
+ vertex -18.326020454896568 201.68385752189488 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -18.326020454896568 201.68385752189488 -62.600000000000065
+ vertex -23.847984815414293 201.49655346124194 -62.600000000000065
+ vertex -22.563577168123395 202.46981335916627 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -18.326020454896568 201.68385752189488 -62.600000000000065
+ vertex -22.563577168123395 202.46981335916627 -62.600000000000065
+ vertex -17.038610704038266 202.42600947007358 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -17.038610704038266 202.42600947007358 -62.600000000000065
+ vertex -22.563577168123395 202.46981335916627 -62.600000000000065
+ vertex -15.721288500709916 203.11366897404972 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -15.721288500709916 203.11366897404972 -62.600000000000065
+ vertex -22.563577168123395 202.46981335916627 -62.600000000000065
+ vertex -21.23958885775712 203.38850415989336 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -15.721288500709916 203.11366897404972 -62.600000000000065
+ vertex -21.23958885775712 203.38850415989336 -62.600000000000065
+ vertex -14.376359044152096 203.74563268952207 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -14.376359044152096 203.74563268952207 -62.600000000000065
+ vertex -21.23958885775712 203.38850415989336 -62.600000000000065
+ vertex -19.87833674866336 204.2510182344538 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -14.376359044152096 203.74563268952207 -62.600000000000065
+ vertex -19.87833674866336 204.2510182344538 -62.600000000000065
+ vertex -13.00617584389643 204.32079473497333 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -13.00617584389643 204.32079473497333 -62.600000000000065
+ vertex -19.87833674866336 204.2510182344538 -62.600000000000065
+ vertex -18.48220291359554 205.05584625826125 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -13.00617584389643 204.32079473497333 -62.600000000000065
+ vertex -18.48220291359554 205.05584625826125 -62.600000000000065
+ vertex -12.694930859691715 204.43638645629042 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -12.694930859691715 204.43638645629042 -62.600000000000065
+ vertex -18.48220291359554 205.05584625826125 -62.600000000000065
+ vertex -10.194930859691718 204.87612362681003 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -10.194930859691718 204.87612362681003 -62.600000000000065
+ vertex -18.48220291359554 205.05584625826125 -62.600000000000065
+ vertex 10.305069140308266 204.87612362680997 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 10.305069140308266 204.87612362680997 -62.600000000000065
+ vertex -18.48220291359554 205.05584625826125 -62.600000000000065
+ vertex 18.592341194212068 205.05584625826125 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 18.592341194212068 205.05584625826125 -62.600000000000065
+ vertex -18.48220291359554 205.05584625826125 -62.600000000000065
+ vertex 17.163768745909092 205.80157985229917 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 17.163768745909092 205.80157985229917 -62.600000000000065
+ vertex -18.48220291359554 205.05584625826125 -62.600000000000065
+ vertex -17.053630465292567 205.80157985229923 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 17.163768745909092 205.80157985229917 -62.600000000000065
+ vertex -17.053630465292567 205.80157985229923 -62.600000000000065
+ vertex 15.705257561860751 206.48691404766154 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 15.705257561860751 206.48691404766154 -62.600000000000065
+ vertex -17.053630465292567 205.80157985229923 -62.600000000000065
+ vertex -15.595119281244203 206.48691404766154 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 15.705257561860751 206.48691404766154 -62.600000000000065
+ vertex -15.595119281244203 206.48691404766154 -62.600000000000065
+ vertex -14.10922162912293 207.1106495691348 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 15.705257561860751 206.48691404766154 -62.600000000000065
+ vertex -14.10922162912293 207.1106495691348 -62.600000000000065
+ vertex 14.219359909739431 207.1106495691348 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 14.219359909739431 207.1106495691348 -62.600000000000065
+ vertex -14.10922162912293 207.1106495691348 -62.600000000000065
+ vertex 12.708675981153974 207.67169493382528 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 12.708675981153974 207.67169493382528 -62.600000000000065
+ vertex -14.10922162912293 207.1106495691348 -62.600000000000065
+ vertex -12.598537700537447 207.67169493382528 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 12.708675981153974 207.67169493382528 -62.600000000000065
+ vertex -12.598537700537447 207.67169493382528 -62.600000000000065
+ vertex 11.17584934154037 208.16906836115925 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 11.17584934154037 208.16906836115925 -62.600000000000065
+ vertex -12.598537700537447 207.67169493382528 -62.600000000000065
+ vertex -11.065711060923867 208.16906836115925 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 11.17584934154037 208.16906836115925 -62.600000000000065
+ vertex -11.065711060923867 208.16906836115925 -62.600000000000065
+ vertex -9.513424023535883 208.60189949091352 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 11.17584934154037 208.16906836115925 -62.600000000000065
+ vertex -9.513424023535883 208.60189949091352 -62.600000000000065
+ vertex 9.623562304152413 208.60189949091347 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 9.623562304152413 208.60189949091347 -62.600000000000065
+ vertex -9.513424023535883 208.60189949091352 -62.600000000000065
+ vertex -7.944392955630252 208.96943090627002 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 9.623562304152413 208.60189949091347 -62.600000000000065
+ vertex -7.944392955630252 208.96943090627002 -62.600000000000065
+ vertex 8.05453123624676 208.96943090626996 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 8.05453123624676 208.96943090626996 -62.600000000000065
+ vertex -7.944392955630252 208.96943090627002 -62.600000000000065
+ vertex -6.361363525060216 209.27101945922942 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 8.05453123624676 208.96943090626996 -62.600000000000065
+ vertex -6.361363525060216 209.27101945922942 -62.600000000000065
+ vertex 6.471501805676724 209.27101945922942 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 6.471501805676724 209.27101945922942 -62.600000000000065
+ vertex -6.361363525060216 209.27101945922942 -62.600000000000065
+ vertex -4.767105895595756 209.50613739606416 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 6.471501805676724 209.27101945922942 -62.600000000000065
+ vertex -4.767105895595756 209.50613739606416 -62.600000000000065
+ vertex 4.877244176212259 209.50613739606416 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 4.877244176212259 209.50613739606416 -62.600000000000065
+ vertex -4.767105895595756 209.50613739606416 -62.600000000000065
+ vertex -3.1644098793779976 209.67437328084148 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 4.877244176212259 209.50613739606416 -62.600000000000065
+ vertex -3.1644098793779976 209.67437328084148 -62.600000000000065
+ vertex 3.274548159994501 209.67437328084154 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 3.274548159994501 209.67437328084154 -62.600000000000065
+ vertex -3.1644098793779976 209.67437328084148 -62.600000000000065
+ vertex -1.5560800549907094 209.77543271540065 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 3.274548159994501 209.67437328084154 -62.600000000000065
+ vertex -1.5560800549907094 209.77543271540065 -62.600000000000065
+ vertex 1.6662183356072127 209.77543271540065 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 1.6662183356072127 209.77543271540065 -62.600000000000065
+ vertex -1.5560800549907094 209.77543271540065 -62.600000000000065
+ vertex 0.05506914030825163 209.809138854524 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 15.497857139629502 182.12097856533416 -62.600000000000065
+ vertex 13.997857139629506 184.71905477668744 -62.60000000000008
+ vertex 29.952220022669408 190.46620886682177 -62.60000000000008
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 13.997857139629506 184.71905477668744 -62.60000000000008
+ vertex 15.497857139629502 182.12097856533416 -62.600000000000065
+ vertex 10.305069140308255 184.37612362681 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 10.305069140308255 184.37612362681 -62.600000000000065
+ vertex 15.497857139629502 182.12097856533416 -62.600000000000065
+ vertex -10.194930859691729 184.37612362681 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 29.952220022669408 190.46620886682177 -62.60000000000008
+ vertex 13.997857139629506 184.71905477668744 -62.60000000000008
+ vertex 28.325364688606378 192.79613663226192 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 29.952220022669408 190.46620886682177 -62.60000000000008
+ vertex 28.325364688606378 192.79613663226192 -62.600000000000065
+ vertex 32.55506914030826 191.9689645055505 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 32.55506914030826 191.9689645055505 -62.600000000000065
+ vertex 28.325364688606378 192.79613663226192 -62.600000000000065
+ vertex 31.66161008284822 193.31010907119943 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 31.66161008284822 193.31010907119943 -62.600000000000065
+ vertex 28.325364688606378 192.79613663226192 -62.600000000000065
+ vertex 27.40101177575885 193.95965933221274 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 31.66161008284822 193.31010907119943 -62.600000000000065
+ vertex 27.40101177575885 193.95965933221274 -62.600000000000065
+ vertex 30.712842328706454 194.6127132252032 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 30.712842328706454 194.6127132252032 -62.600000000000065
+ vertex 27.40101177575885 193.95965933221274 -62.600000000000065
+ vertex 26.428805842568213 195.08350496407658 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 30.712842328706454 194.6127132252032 -62.600000000000065
+ vertex 26.428805842568213 195.08350496407658 -62.600000000000065
+ vertex 29.71042613890401 195.87449752362707 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 29.71042613890401 195.87449752362707 -62.600000000000065
+ vertex 26.428805842568213 195.08350496407658 -62.600000000000065
+ vertex 25.410448164829532 196.1657068957793 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 29.71042613890401 195.87449752362707 -62.600000000000065
+ vertex 25.410448164829532 196.1657068957793 -62.600000000000065
+ vertex 28.65611565455649 197.09325395373193 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 28.65611565455649 197.09325395373193 -62.600000000000065
+ vertex 25.410448164829532 196.1657068957793 -62.600000000000065
+ vertex 24.347720779875264 197.20437136809883 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 28.65611565455649 197.09325395373193 -62.600000000000065
+ vertex 24.347720779875264 197.20437136809883 -62.600000000000065
+ vertex 27.551755827279884 198.2668497978046 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 27.551755827279884 198.2668497978046 -62.600000000000065
+ vertex 24.347720779875264 197.20437136809883 -62.600000000000065
+ vertex 23.24248336816515 198.19768080857895 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 27.551755827279884 198.2668497978046 -62.600000000000065
+ vertex 23.24248336816515 198.19768080857895 -62.600000000000065
+ vertex 22.09666999900712 199.14389701212292 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 27.551755827279884 198.2668497978046 -62.600000000000065
+ vertex 22.09666999900712 199.14389701212292 -62.600000000000065
+ vertex 26.399279190685665 199.39323136522816 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 26.399279190685665 199.39323136522816 -62.600000000000065
+ vertex 22.09666999900712 199.14389701212292 -62.600000000000065
+ vertex 20.912285746104196 200.04136418270141 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 26.399279190685665 199.39323136522816 -62.600000000000065
+ vertex 20.912285746104196 200.04136418270141 -62.600000000000065
+ vertex 25.20070247861516 200.47042758626193 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 25.20070247861516 200.47042758626193 -62.600000000000065
+ vertex 20.912285746104196 200.04136418270141 -62.600000000000065
+ vertex 19.691403178850077 200.88851183085106 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 25.20070247861516 200.47042758626193 -62.600000000000065
+ vertex 19.691403178850077 200.88851183085106 -62.600000000000065
+ vertex 23.958123096030832 201.4965534612419 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 23.958123096030832 201.4965534612419 -62.600000000000065
+ vertex 19.691403178850077 200.88851183085106 -62.600000000000065
+ vertex 18.436158735513036 201.68385752189488 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 23.958123096030832 201.4965534612419 -62.600000000000065
+ vertex 18.436158735513036 201.68385752189488 -62.600000000000065
+ vertex 22.67371544873991 202.4698133591662 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 22.67371544873991 202.4698133591662 -62.600000000000065
+ vertex 18.436158735513036 201.68385752189488 -62.600000000000065
+ vertex 17.148748984654713 202.42600947007355 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 22.67371544873991 202.4698133591662 -62.600000000000065
+ vertex 17.148748984654713 202.42600947007355 -62.600000000000065
+ vertex 15.831426781326385 203.11366897404972 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 22.67371544873991 202.4698133591662 -62.600000000000065
+ vertex 15.831426781326385 203.11366897404972 -62.600000000000065
+ vertex 21.349727138373666 203.3885041598933 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 21.349727138373666 203.3885041598933 -62.600000000000065
+ vertex 15.831426781326385 203.11366897404972 -62.600000000000065
+ vertex 14.486497324768576 203.74563268952207 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 21.349727138373666 203.3885041598933 -62.600000000000065
+ vertex 14.486497324768576 203.74563268952207 -62.600000000000065
+ vertex 19.988475029279908 204.2510182344538 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 19.988475029279908 204.2510182344538 -62.600000000000065
+ vertex 14.486497324768576 203.74563268952207 -62.600000000000065
+ vertex 13.116314124512934 204.32079473497333 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 19.988475029279908 204.2510182344538 -62.600000000000065
+ vertex 13.116314124512934 204.32079473497333 -62.600000000000065
+ vertex 18.592341194212068 205.05584625826125 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 18.592341194212068 205.05584625826125 -62.600000000000065
+ vertex 13.116314124512934 204.32079473497333 -62.600000000000065
+ vertex 12.805069140308262 204.43638645629036 -62.60000000000009
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 18.592341194212068 205.05584625826125 -62.600000000000065
+ vertex 12.805069140308262 204.43638645629036 -62.60000000000009
+ vertex 10.305069140308266 204.87612362680997 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -10.194930859691729 184.37612362681 -62.600000000000065
+ vertex -12.694930859691725 186.78502419417032 -62.600000000000065
+ vertex -10.194930859691729 191.96896450555056 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -12.694930859691725 186.78502419417032 -62.600000000000065
+ vertex -10.194930859691729 184.37612362681 -62.600000000000065
+ vertex -13.88771885901298 184.7190547766875 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -10.194930859691729 191.96896450555056 -62.600000000000065
+ vertex -12.694930859691725 186.78502419417032 -62.600000000000065
+ vertex -12.694930859691715 204.43638645629042 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -10.194930859691729 191.96896450555056 -62.600000000000065
+ vertex -12.694930859691715 204.43638645629042 -62.600000000000065
+ vertex -10.194930859691729 197.22612362681 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -10.194930859691729 191.96896450555056 -62.600000000000065
+ vertex -10.194930859691729 197.22612362681 -62.600000000000065
+ vertex -8.194930859691734 191.96896450555056 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -10.194930859691729 197.22612362681 -62.600000000000065
+ vertex -12.694930859691715 204.43638645629042 -62.600000000000065
+ vertex -10.194930859691718 204.87612362681003 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -8.194930859691734 197.22612362681 -62.600000000000065
+ vertex -8.194930859691734 191.96896450555056 -62.600000000000065
+ vertex -10.194930859691729 197.22612362681 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex 20.88398209406786 152.47054977096982 -62.600000000000065
+ vertex 20.939051234375828 152.47054977096982 -62.600000000000044
+ vertex -20.828912953759342 152.47054977096985 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -41.8783177822545 132.2379153073505 -62.600000000000065
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -39.568916705496 132.2379153073505 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -41.8783177822545 132.2379153073505 -62.600000000000065
+ vertex -42.436689296971025 132.30606365477237 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -42.436689296971025 132.30606365477237 -62.600000000000065
+ vertex -42.87831778225449 132.50586449978164 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -42.87831778225449 132.50586449978164 -62.600000000000065
+ vertex -43.173106986658425 132.82370174497743 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -43.173106986658425 132.82370174497743 -62.600000000000065
+ vertex -43.30096751306486 133.2379153073505 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -43.30096751306486 133.2379153073505 -62.600000000000065
+ vertex -43.253185877898744 133.72027721714548 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -43.253185877898744 133.72027721714548 -62.600000000000065
+ vertex -43.03301832063373 134.23791530735053 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -43.03301832063373 134.23791530735053 -62.600000000000065
+ vertex -15.387718859012988 182.12097856533416 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -15.387718859012988 182.12097856533416 -62.600000000000065
+ vertex -24.658474920013315 157.93973105977085 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -24.658474920013315 157.93973105977085 -62.600000000000065
+ vertex -24.84233418489917 157.2535589417746 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -24.84233418489917 157.2535589417746 -62.600000000000065
+ vertex -24.90424767656597 156.54588449377647 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -24.90424767656597 156.54588449377647 -62.600000000000065
+ vertex -24.84233418489917 155.83821004577834 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -24.84233418489917 155.83821004577834 -62.600000000000065
+ vertex -24.658474920013315 155.15203792778206 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -24.658474920013315 155.15203792778206 -62.600000000000065
+ vertex -24.358256352634704 154.50821713237315 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -24.358256352634704 154.50821713237315 -62.600000000000065
+ vertex -23.95080047201519 153.92630982863105 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -23.95080047201519 153.92630982863105 -62.600000000000065
+ vertex -23.448487618904775 153.42399697552065 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -23.448487618904775 153.42399697552065 -62.600000000000065
+ vertex -22.866580315162654 153.01654109490113 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -22.866580315162654 153.01654109490113 -62.600000000000065
+ vertex -22.22275951975374 152.7163225275225 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -22.22275951975374 152.7163225275225 -62.600000000000065
+ vertex -21.53658740175749 152.53246326263664 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -21.53658740175749 152.53246326263664 -62.600000000000065
+ vertex -20.828912953759342 152.47054977096985 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096984 -62.600000000000065
+ vertex -20.828912953759342 152.47054977096985 -62.600000000000065
+ vertex 30.48034418964194 148.1705497709698 -62.600000000000044
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -24.658474920013315 157.93973105977085 -62.600000000000065
+ vertex -15.387718859012988 182.12097856533416 -62.600000000000065
+ vertex -24.358256352634704 158.5835518551798 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -24.358256352634704 158.5835518551798 -62.600000000000065
+ vertex -15.387718859012988 182.12097856533416 -62.600000000000065
+ vertex -11.660839120111838 180.57612362681 -62.600000000000065
+ endloop
+endfacet
+facet normal 1.8248340924346468e-16 -1.983130373426281e-16 -1.0
+ outer loop
+ vertex -11.660839120111838 180.57612362681 -62.600000000000065
+ vertex -15.387718859012988 182.12097856533416 -62.600000000000065
+ vertex 11.770977400728352 180.57612362681 -62.600000000000065
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -8.194930859691734 197.22612362681 -3.000000000000062
+ vertex -10.194930859691729 191.96896450555056 -3.000000000000062
+ vertex -8.194930859691734 191.96896450555056 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -10.194930859691729 184.37612362681003 -3.000000000000062
+ vertex -12.694930859691725 186.78502419417035 -3.000000000000062
+ vertex -13.88771885901298 184.7190547766875 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -12.694930859691725 186.78502419417035 -3.000000000000062
+ vertex -10.194930859691729 184.37612362681003 -3.000000000000062
+ vertex -10.194930859691729 191.96896450555056 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -12.694930859691725 186.78502419417035 -3.000000000000062
+ vertex -10.194930859691729 191.96896450555056 -3.000000000000062
+ vertex -12.694930859691715 204.43638645629042 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -12.694930859691715 204.43638645629042 -3.000000000000062
+ vertex -10.194930859691729 191.96896450555056 -3.000000000000062
+ vertex -10.194930859691729 197.22612362681 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -10.194930859691729 197.22612362681 -3.000000000000062
+ vertex -10.194930859691729 191.96896450555056 -3.000000000000062
+ vertex -8.194930859691734 197.22612362681 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -12.694930859691715 204.43638645629042 -3.000000000000062
+ vertex -10.194930859691729 197.22612362681 -3.000000000000062
+ vertex -10.194930859691718 204.87612362681003 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -41.8783177822545 132.23791530735053 -3.000000000000062
+ vertex -39.568916705496 132.2379153073505 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -41.8783177822545 132.23791530735053 -3.000000000000062
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -42.436689296971025 132.30606365477237 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -42.436689296971025 132.30606365477237 -3.000000000000062
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -42.87831778225449 132.50586449978164 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -42.87831778225449 132.50586449978164 -3.000000000000062
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -43.173106986658425 132.82370174497743 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -43.173106986658425 132.82370174497743 -3.000000000000062
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -43.30096751306486 133.23791530735053 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -43.30096751306486 133.23791530735053 -3.000000000000062
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -43.253185877898744 133.72027721714548 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -43.253185877898744 133.72027721714548 -3.000000000000062
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -43.03301832063373 134.23791530735053 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -43.03301832063373 134.23791530735053 -3.000000000000062
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -24.658474920013315 157.93973105977088 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -24.658474920013315 157.93973105977088 -3.000000000000062
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -24.84233418489917 157.2535589417746 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -24.84233418489917 157.2535589417746 -3.000000000000062
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -24.90424767656597 156.5458844937765 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -24.90424767656597 156.5458844937765 -3.000000000000062
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -24.84233418489917 155.83821004577834 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -24.84233418489917 155.83821004577834 -3.000000000000062
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -24.658474920013315 155.1520379277821 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -24.658474920013315 155.1520379277821 -3.000000000000062
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -24.358256352634704 154.50821713237318 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -24.358256352634704 154.50821713237318 -3.000000000000062
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -23.95080047201519 153.92630982863105 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -23.95080047201519 153.92630982863105 -3.000000000000062
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -23.448487618904775 153.42399697552065 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -23.448487618904775 153.42399697552065 -3.000000000000062
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -22.866580315162654 153.01654109490113 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -22.866580315162654 153.01654109490113 -3.000000000000062
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -22.22275951975374 152.71632252752252 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -22.22275951975374 152.71632252752252 -3.000000000000062
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -21.53658740175749 152.53246326263667 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -21.53658740175749 152.53246326263667 -3.000000000000062
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex -20.828912953759342 152.47054977096985 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -24.658474920013315 157.93973105977088 -3.000000000000062
+ vertex -24.358256352634704 158.5835518551798 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -24.358256352634704 158.5835518551798 -3.000000000000062
+ vertex -11.660839120111838 180.57612362681 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -11.660839120111838 180.57612362681 -3.000000000000062
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 10.305069140308255 184.37612362681 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 10.305069140308255 184.37612362681 -3.000000000000062
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 13.997857139629506 184.71905477668747 -3.0000000000000733
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 13.997857139629506 184.71905477668747 -3.0000000000000733
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 29.952220022669408 190.46620886682177 -3.0000000000000733
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 13.997857139629506 184.71905477668747 -3.0000000000000733
+ vertex 29.952220022669408 190.46620886682177 -3.0000000000000733
+ vertex 28.325364688606378 192.79613663226192 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 28.325364688606378 192.79613663226192 -3.000000000000062
+ vertex 29.952220022669408 190.46620886682177 -3.0000000000000733
+ vertex 32.55506914030826 191.9689645055505 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 28.325364688606378 192.79613663226192 -3.000000000000062
+ vertex 32.55506914030826 191.9689645055505 -3.000000000000062
+ vertex 31.66161008284822 193.31010907119946 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 28.325364688606378 192.79613663226192 -3.000000000000062
+ vertex 31.66161008284822 193.31010907119946 -3.000000000000062
+ vertex 27.40101177575885 193.95965933221277 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 27.40101177575885 193.95965933221277 -3.000000000000062
+ vertex 31.66161008284822 193.31010907119946 -3.000000000000062
+ vertex 30.712842328706454 194.61271322520324 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 27.40101177575885 193.95965933221277 -3.000000000000062
+ vertex 30.712842328706454 194.61271322520324 -3.000000000000062
+ vertex 26.428805842568213 195.08350496407658 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 26.428805842568213 195.08350496407658 -3.000000000000062
+ vertex 30.712842328706454 194.61271322520324 -3.000000000000062
+ vertex 29.71042613890401 195.87449752362707 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 26.428805842568213 195.08350496407658 -3.000000000000062
+ vertex 29.71042613890401 195.87449752362707 -3.000000000000062
+ vertex 25.410448164829532 196.1657068957793 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 25.410448164829532 196.1657068957793 -3.000000000000062
+ vertex 29.71042613890401 195.87449752362707 -3.000000000000062
+ vertex 28.65611565455649 197.09325395373196 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 25.410448164829532 196.1657068957793 -3.000000000000062
+ vertex 28.65611565455649 197.09325395373196 -3.000000000000062
+ vertex 24.347720779875264 197.20437136809886 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 24.347720779875264 197.20437136809886 -3.000000000000062
+ vertex 28.65611565455649 197.09325395373196 -3.000000000000062
+ vertex 27.551755827279884 198.26684979780464 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 24.347720779875264 197.20437136809886 -3.000000000000062
+ vertex 27.551755827279884 198.26684979780464 -3.000000000000062
+ vertex 23.24248336816515 198.19768080857895 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 23.24248336816515 198.19768080857895 -3.000000000000062
+ vertex 27.551755827279884 198.26684979780464 -3.000000000000062
+ vertex 22.09666999900712 199.14389701212295 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 22.09666999900712 199.14389701212295 -3.000000000000062
+ vertex 27.551755827279884 198.26684979780464 -3.000000000000062
+ vertex 26.399279190685665 199.3932313652282 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 22.09666999900712 199.14389701212295 -3.000000000000062
+ vertex 26.399279190685665 199.3932313652282 -3.000000000000062
+ vertex 20.912285746104196 200.04136418270141 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 20.912285746104196 200.04136418270141 -3.000000000000062
+ vertex 26.399279190685665 199.3932313652282 -3.000000000000062
+ vertex 25.20070247861516 200.47042758626193 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 20.912285746104196 200.04136418270141 -3.000000000000062
+ vertex 25.20070247861516 200.47042758626193 -3.000000000000062
+ vertex 19.691403178850077 200.8885118308511 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 19.691403178850077 200.8885118308511 -3.000000000000062
+ vertex 25.20070247861516 200.47042758626193 -3.000000000000062
+ vertex 23.958123096030832 201.4965534612419 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 19.691403178850077 200.8885118308511 -3.000000000000062
+ vertex 23.958123096030832 201.4965534612419 -3.000000000000062
+ vertex 18.436158735513036 201.68385752189488 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 18.436158735513036 201.68385752189488 -3.000000000000062
+ vertex 23.958123096030832 201.4965534612419 -3.000000000000062
+ vertex 22.67371544873991 202.4698133591662 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 18.436158735513036 201.68385752189488 -3.000000000000062
+ vertex 22.67371544873991 202.4698133591662 -3.000000000000062
+ vertex 17.148748984654713 202.42600947007358 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 17.148748984654713 202.42600947007358 -3.000000000000062
+ vertex 22.67371544873991 202.4698133591662 -3.000000000000062
+ vertex 15.831426781326385 203.11366897404974 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 15.831426781326385 203.11366897404974 -3.000000000000062
+ vertex 22.67371544873991 202.4698133591662 -3.000000000000062
+ vertex 21.349727138373666 203.38850415989336 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 15.831426781326385 203.11366897404974 -3.000000000000062
+ vertex 21.349727138373666 203.38850415989336 -3.000000000000062
+ vertex 14.486497324768576 203.74563268952207 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 14.486497324768576 203.74563268952207 -3.000000000000062
+ vertex 21.349727138373666 203.38850415989336 -3.000000000000062
+ vertex 19.988475029279908 204.2510182344538 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 14.486497324768576 203.74563268952207 -3.000000000000062
+ vertex 19.988475029279908 204.2510182344538 -3.000000000000062
+ vertex 13.116314124512934 204.32079473497333 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 13.116314124512934 204.32079473497333 -3.000000000000062
+ vertex 19.988475029279908 204.2510182344538 -3.000000000000062
+ vertex 18.592341194212068 205.05584625826125 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 13.116314124512934 204.32079473497333 -3.000000000000062
+ vertex 18.592341194212068 205.05584625826125 -3.000000000000062
+ vertex 12.805069140308262 204.43638645629042 -3.000000000000085
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 12.805069140308262 204.43638645629042 -3.000000000000085
+ vertex 18.592341194212068 205.05584625826125 -3.000000000000062
+ vertex 10.305069140308266 204.87612362680997 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 10.305069140308266 204.87612362680997 -3.000000000000062
+ vertex 18.592341194212068 205.05584625826125 -3.000000000000062
+ vertex -10.194930859691718 204.87612362681003 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -13.88771885901298 184.7190547766875 -3.000000000000062
+ vertex -29.842081742052876 190.46620886682183 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -13.88771885901298 184.7190547766875 -3.000000000000062
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex -10.194930859691729 184.37612362681003 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -10.194930859691729 184.37612362681003 -3.000000000000062
+ vertex -15.387718859012988 182.12097856533418 -3.000000000000062
+ vertex 10.305069140308255 184.37612362681 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -29.842081742052876 190.46620886682183 -3.000000000000062
+ vertex -13.88771885901298 184.7190547766875 -3.000000000000062
+ vertex -28.21522640798993 192.79613663226195 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -29.842081742052876 190.46620886682183 -3.000000000000062
+ vertex -28.21522640798993 192.79613663226195 -3.000000000000062
+ vertex -32.44493085969176 191.9689645055506 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -32.44493085969176 191.9689645055506 -3.000000000000062
+ vertex -28.21522640798993 192.79613663226195 -3.000000000000062
+ vertex -31.55147180223168 193.31010907119952 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -31.55147180223168 193.31010907119952 -3.000000000000062
+ vertex -28.21522640798993 192.79613663226195 -3.000000000000062
+ vertex -27.290873495142403 193.95965933221277 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -31.55147180223168 193.31010907119952 -3.000000000000062
+ vertex -27.290873495142403 193.95965933221277 -3.000000000000062
+ vertex -30.60270404808994 194.6127132252033 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -30.60270404808994 194.6127132252033 -3.000000000000062
+ vertex -27.290873495142403 193.95965933221277 -3.000000000000062
+ vertex -26.318667561951766 195.08350496407658 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -30.60270404808994 194.6127132252033 -3.000000000000062
+ vertex -26.318667561951766 195.08350496407658 -3.000000000000062
+ vertex -29.600287858287494 195.87449752362716 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -29.600287858287494 195.87449752362716 -3.000000000000062
+ vertex -26.318667561951766 195.08350496407658 -3.000000000000062
+ vertex -25.300309884213064 196.16570689577935 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -29.600287858287494 195.87449752362716 -3.000000000000062
+ vertex -25.300309884213064 196.16570689577935 -3.000000000000062
+ vertex -28.545977373939976 197.09325395373202 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -28.545977373939976 197.09325395373202 -3.000000000000062
+ vertex -25.300309884213064 196.16570689577935 -3.000000000000062
+ vertex -24.237582499258796 197.2043713680989 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -28.545977373939976 197.09325395373202 -3.000000000000062
+ vertex -24.237582499258796 197.2043713680989 -3.000000000000062
+ vertex -27.44161754666337 198.26684979780472 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -27.44161754666337 198.26684979780472 -3.000000000000062
+ vertex -24.237582499258796 197.2043713680989 -3.000000000000062
+ vertex -23.132345087548707 198.19768080857898 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -27.44161754666337 198.26684979780472 -3.000000000000062
+ vertex -23.132345087548707 198.19768080857898 -3.000000000000062
+ vertex -21.986531718390673 199.14389701212298 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -27.44161754666337 198.26684979780472 -3.000000000000062
+ vertex -21.986531718390673 199.14389701212298 -3.000000000000062
+ vertex -26.28914091006915 199.39323136522827 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -26.28914091006915 199.39323136522827 -3.000000000000062
+ vertex -21.986531718390673 199.14389701212298 -3.000000000000062
+ vertex -20.80214746548775 200.04136418270141 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -26.28914091006915 199.39323136522827 -3.000000000000062
+ vertex -20.80214746548775 200.04136418270141 -3.000000000000062
+ vertex -25.09056419799865 200.470427586262 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -25.09056419799865 200.470427586262 -3.000000000000062
+ vertex -20.80214746548775 200.04136418270141 -3.000000000000062
+ vertex -19.58126489823363 200.8885118308511 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -25.09056419799865 200.470427586262 -3.000000000000062
+ vertex -19.58126489823363 200.8885118308511 -3.000000000000062
+ vertex -23.847984815414293 201.49655346124194 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -23.847984815414293 201.49655346124194 -3.000000000000062
+ vertex -19.58126489823363 200.8885118308511 -3.000000000000062
+ vertex -18.326020454896568 201.68385752189488 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -23.847984815414293 201.49655346124194 -3.000000000000062
+ vertex -18.326020454896568 201.68385752189488 -3.000000000000062
+ vertex -22.563577168123395 202.4698133591663 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -22.563577168123395 202.4698133591663 -3.000000000000062
+ vertex -18.326020454896568 201.68385752189488 -3.000000000000062
+ vertex -17.038610704038266 202.4260094700736 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -22.563577168123395 202.4698133591663 -3.000000000000062
+ vertex -17.038610704038266 202.4260094700736 -3.000000000000062
+ vertex -15.721288500709916 203.11366897404974 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -22.563577168123395 202.4698133591663 -3.000000000000062
+ vertex -15.721288500709916 203.11366897404974 -3.000000000000062
+ vertex -21.23958885775712 203.38850415989336 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -21.23958885775712 203.38850415989336 -3.000000000000062
+ vertex -15.721288500709916 203.11366897404974 -3.000000000000062
+ vertex -14.376359044152096 203.74563268952207 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -21.23958885775712 203.38850415989336 -3.000000000000062
+ vertex -14.376359044152096 203.74563268952207 -3.000000000000062
+ vertex -19.87833674866336 204.2510182344538 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -19.87833674866336 204.2510182344538 -3.000000000000062
+ vertex -14.376359044152096 203.74563268952207 -3.000000000000062
+ vertex -13.00617584389643 204.32079473497333 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -19.87833674866336 204.2510182344538 -3.000000000000062
+ vertex -13.00617584389643 204.32079473497333 -3.000000000000062
+ vertex -18.48220291359554 205.0558462582613 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -18.48220291359554 205.0558462582613 -3.000000000000062
+ vertex -13.00617584389643 204.32079473497333 -3.000000000000062
+ vertex -12.694930859691715 204.43638645629042 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -18.48220291359554 205.0558462582613 -3.000000000000062
+ vertex -12.694930859691715 204.43638645629042 -3.000000000000062
+ vertex -10.194930859691718 204.87612362681003 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -18.48220291359554 205.0558462582613 -3.000000000000062
+ vertex -10.194930859691718 204.87612362681003 -3.000000000000062
+ vertex 18.592341194212068 205.05584625826125 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -18.48220291359554 205.0558462582613 -3.000000000000062
+ vertex 18.592341194212068 205.05584625826125 -3.000000000000062
+ vertex 17.163768745909092 205.80157985229923 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -18.48220291359554 205.0558462582613 -3.000000000000062
+ vertex 17.163768745909092 205.80157985229923 -3.000000000000062
+ vertex -17.053630465292567 205.80157985229926 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -17.053630465292567 205.80157985229926 -3.000000000000062
+ vertex 17.163768745909092 205.80157985229923 -3.000000000000062
+ vertex 15.705257561860751 206.48691404766154 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -17.053630465292567 205.80157985229926 -3.000000000000062
+ vertex 15.705257561860751 206.48691404766154 -3.000000000000062
+ vertex -15.595119281244203 206.4869140476616 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -15.595119281244203 206.4869140476616 -3.000000000000062
+ vertex 15.705257561860751 206.48691404766154 -3.000000000000062
+ vertex 14.219359909739431 207.1106495691348 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -15.595119281244203 206.4869140476616 -3.000000000000062
+ vertex 14.219359909739431 207.1106495691348 -3.000000000000062
+ vertex -14.10922162912293 207.1106495691348 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -14.10922162912293 207.1106495691348 -3.000000000000062
+ vertex 14.219359909739431 207.1106495691348 -3.000000000000062
+ vertex 12.708675981153974 207.67169493382528 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -14.10922162912293 207.1106495691348 -3.000000000000062
+ vertex 12.708675981153974 207.67169493382528 -3.000000000000062
+ vertex -12.598537700537447 207.6716949338253 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -12.598537700537447 207.6716949338253 -3.000000000000062
+ vertex 12.708675981153974 207.67169493382528 -3.000000000000062
+ vertex 11.17584934154037 208.16906836115925 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -12.598537700537447 207.6716949338253 -3.000000000000062
+ vertex 11.17584934154037 208.16906836115925 -3.000000000000062
+ vertex -11.065711060923867 208.16906836115928 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -11.065711060923867 208.16906836115928 -3.000000000000062
+ vertex 11.17584934154037 208.16906836115925 -3.000000000000062
+ vertex 9.623562304152413 208.60189949091352 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -11.065711060923867 208.16906836115928 -3.000000000000062
+ vertex 9.623562304152413 208.60189949091352 -3.000000000000062
+ vertex -9.513424023535883 208.60189949091352 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -9.513424023535883 208.60189949091352 -3.000000000000062
+ vertex 9.623562304152413 208.60189949091352 -3.000000000000062
+ vertex 8.05453123624676 208.96943090627002 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -9.513424023535883 208.60189949091352 -3.000000000000062
+ vertex 8.05453123624676 208.96943090627002 -3.000000000000062
+ vertex -7.944392955630252 208.96943090627002 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -7.944392955630252 208.96943090627002 -3.000000000000062
+ vertex 8.05453123624676 208.96943090627002 -3.000000000000062
+ vertex 6.471501805676724 209.27101945922942 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -7.944392955630252 208.96943090627002 -3.000000000000062
+ vertex 6.471501805676724 209.27101945922942 -3.000000000000062
+ vertex -6.361363525060216 209.27101945922942 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -6.361363525060216 209.27101945922942 -3.000000000000062
+ vertex 6.471501805676724 209.27101945922942 -3.000000000000062
+ vertex 4.877244176212259 209.50613739606416 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -6.361363525060216 209.27101945922942 -3.000000000000062
+ vertex 4.877244176212259 209.50613739606416 -3.000000000000062
+ vertex -4.767105895595756 209.50613739606416 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -4.767105895595756 209.50613739606416 -3.000000000000062
+ vertex 4.877244176212259 209.50613739606416 -3.000000000000062
+ vertex 3.274548159994501 209.67437328084154 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -4.767105895595756 209.50613739606416 -3.000000000000062
+ vertex 3.274548159994501 209.67437328084154 -3.000000000000062
+ vertex -3.1644098793779976 209.67437328084154 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -3.1644098793779976 209.67437328084154 -3.000000000000062
+ vertex 3.274548159994501 209.67437328084154 -3.000000000000062
+ vertex -1.5560800549907094 209.77543271540065 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -1.5560800549907094 209.77543271540065 -3.000000000000062
+ vertex 3.274548159994501 209.67437328084154 -3.000000000000062
+ vertex 1.6662183356072127 209.77543271540065 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -1.5560800549907094 209.77543271540065 -3.000000000000062
+ vertex 1.6662183356072127 209.77543271540065 -3.000000000000062
+ vertex 0.05506914030825163 209.80913885452406 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 10.305069140308255 184.37612362681 -3.000000000000062
+ vertex 12.80506914030825 186.78502419417032 -3.0000000000000733
+ vertex 10.30506914030826 191.96896450555056 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 12.80506914030825 186.78502419417032 -3.0000000000000733
+ vertex 10.305069140308255 184.37612362681 -3.000000000000062
+ vertex 13.997857139629506 184.71905477668747 -3.0000000000000733
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 10.30506914030826 191.96896450555056 -3.000000000000062
+ vertex 12.80506914030825 186.78502419417032 -3.0000000000000733
+ vertex 12.805069140308262 204.43638645629042 -3.000000000000085
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 10.30506914030826 191.96896450555056 -3.000000000000062
+ vertex 12.805069140308262 204.43638645629042 -3.000000000000085
+ vertex 10.30506914030826 197.22612362681 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 10.30506914030826 191.96896450555056 -3.000000000000062
+ vertex 10.30506914030826 197.22612362681 -3.000000000000062
+ vertex 8.305069140308264 191.96896450555056 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 10.30506914030826 197.22612362681 -3.000000000000062
+ vertex 12.805069140308262 204.43638645629042 -3.000000000000085
+ vertex 10.305069140308266 204.87612362680997 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 8.305069140308264 197.22612362681 -3.000000000000062
+ vertex 8.305069140308264 191.96896450555056 -3.000000000000062
+ vertex 10.30506914030826 197.22612362681 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 42.546827577587486 132.30606365477232 -3.0000000000000284
+ vertex 39.679054986112455 132.23791530735048 -3.0000000000000284
+ vertex 41.98845606287095 132.23791530735048 -3.0000000000000284
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 39.679054986112455 132.23791530735048 -3.0000000000000284
+ vertex 42.546827577587486 132.30606365477232 -3.0000000000000284
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 42.546827577587486 132.30606365477232 -3.0000000000000284
+ vertex 42.98845606287095 132.50586449978158 -3.0000000000000284
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 42.98845606287095 132.50586449978158 -3.0000000000000284
+ vertex 43.28324526727487 132.82370174497737 -3.0000000000000284
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 43.28324526727487 132.82370174497737 -3.0000000000000284
+ vertex 43.41110579368132 133.23791530735048 -3.0000000000000284
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 43.41110579368132 133.23791530735048 -3.0000000000000284
+ vertex 43.3633241585152 133.72027721714542 -3.0000000000000284
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 43.3633241585152 133.72027721714542 -3.0000000000000284
+ vertex 43.143156601250205 134.23791530735045 -3.0000000000000284
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 43.143156601250205 134.23791530735045 -3.0000000000000284
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 24.768613200629805 157.93973105977085 -3.000000000000051
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 24.768613200629805 157.93973105977085 -3.000000000000051
+ vertex 24.95247246551566 157.2535589417746 -3.000000000000051
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 24.95247246551566 157.2535589417746 -3.000000000000051
+ vertex 25.01438595718246 156.54588449377644 -3.000000000000051
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 25.01438595718246 156.54588449377644 -3.000000000000051
+ vertex 24.95247246551566 155.8382100457783 -3.000000000000051
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 24.95247246551566 155.8382100457783 -3.000000000000051
+ vertex 24.768613200629805 155.15203792778206 -3.000000000000051
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 24.768613200629805 155.15203792778206 -3.000000000000051
+ vertex 24.46839463325119 154.50821713237312 -3.000000000000051
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 24.46839463325119 154.50821713237312 -3.000000000000051
+ vertex 24.060938752631678 153.92630982863102 -3.000000000000051
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 24.060938752631678 153.92630982863102 -3.000000000000051
+ vertex 23.55862589952126 153.42399697552062 -3.000000000000051
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 23.55862589952126 153.42399697552062 -3.000000000000051
+ vertex 23.06122021535224 153.05393896729822 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 23.06122021535224 153.05393896729822 -3.000000000000062
+ vertex 22.373300682659444 152.73315682100917 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 22.373300682659444 152.73315682100917 -3.000000000000062
+ vertex 22.332897800370226 152.71632252752246 -3.000000000000051
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 22.332897800370226 152.71632252752246 -3.000000000000051
+ vertex 21.640128958283878 152.5367040495494 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 21.640128958283878 152.5367040495494 -3.000000000000062
+ vertex 20.939051234375828 152.47054977096982 -3.000000000000051
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 30.48034418964194 148.1705497709698 -3.0000000000000395
+ vertex 20.939051234375828 152.47054977096982 -3.000000000000051
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex -30.37020590902545 148.17054977096987 -3.000000000000062
+ vertex 20.939051234375828 152.47054977096982 -3.000000000000051
+ vertex -20.828912953759342 152.47054977096985 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 22.373300682659444 152.73315682100917 -3.000000000000062
+ vertex 23.06122021535224 153.05393896729822 -3.000000000000062
+ vertex 22.976718595779143 153.01654109490107 -3.000000000000051
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 24.768613200629805 157.93973105977085 -3.000000000000051
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 24.468394633251194 158.58355185517976 -3.000000000000051
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 24.468394633251194 158.58355185517976 -3.000000000000051
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex 11.770977400728352 180.57612362681 -3.0000000000000733
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 11.770977400728352 180.57612362681 -3.0000000000000733
+ vertex 15.497857139629502 182.12097856533416 -3.0000000000000733
+ vertex -11.660839120111838 180.57612362681 -3.000000000000062
+ endloop
+endfacet
+facet normal -2.1770599857004374e-16 2.325189473563784e-16 1.0
+ outer loop
+ vertex 20.88398209406786 152.47054977096985 -3.000000000000062
+ vertex -20.828912953759342 152.47054977096985 -3.000000000000062
+ vertex 20.939051234375828 152.47054977096982 -3.000000000000051
+ endloop
+endfacet
+facet normal -0.9978589232386035 7.754921663350148e-16 -0.06540312923014449
+ outer loop
+ vertex 11.952407476793969 148.1705497709698 -31.233685693359433
+ vertex 12.055069140308246 152.47054977096985 -32.800000000000054
+ vertex 12.055069140308246 148.1705497709698 -32.800000000000054
+ endloop
+endfacet
+facet normal -0.9978589232386035 7.754921663350148e-16 -0.06540312923014449
+ outer loop
+ vertex 12.055069140308246 152.47054977096985 -32.800000000000054
+ vertex 11.952407476793969 148.1705497709698 -31.233685693359433
+ vertex 11.952407476793969 152.47054977096985 -31.233685693359433
+ endloop
+endfacet
+facet normal -0.9807852804032308 7.622232803619748e-16 -0.1950903220161271
+ outer loop
+ vertex 11.646179055777065 148.1705497709698 -29.6941714587698
+ vertex 11.952407476793969 152.47054977096985 -31.233685693359433
+ vertex 11.952407476793969 148.1705497709698 -31.233685693359433
+ endloop
+endfacet
+facet normal -0.9807852804032308 7.622232803619748e-16 -0.1950903220161271
+ outer loop
+ vertex 11.952407476793969 152.47054977096985 -31.233685693359433
+ vertex 11.646179055777065 148.1705497709698 -29.6941714587698
+ vertex 11.646179055777065 152.47054977096985 -29.6941714587698
+ endloop
+endfacet
+facet normal -0.9469301294951047 7.359125427337222e-16 -0.3214394653031649
+ outer loop
+ vertex 11.141623530443681 148.1705497709698 -28.207798811618975
+ vertex 11.646179055777065 152.47054977096985 -29.6941714587698
+ vertex 11.646179055777065 148.1705497709698 -29.6941714587698
+ endloop
+endfacet
+facet normal -0.9469301294951047 7.359125427337222e-16 -0.3214394653031649
+ outer loop
+ vertex 11.646179055777065 152.47054977096985 -29.6941714587698
+ vertex 11.141623530443681 148.1705497709698 -28.207798811618975
+ vertex 11.141623530443681 152.47054977096985 -28.207798811618975
+ endloop
+endfacet
+facet normal -0.8968727415326913 6.970101374657962e-16 -0.44228869021899536
+ outer loop
+ vertex 10.447373985721516 148.1705497709698 -26.800000000000054
+ vertex 11.141623530443681 152.47054977096985 -28.207798811618975
+ vertex 11.141623530443681 148.1705497709698 -28.207798811618975
+ endloop
+endfacet
+facet normal -0.8968727415326913 6.970101374657962e-16 -0.44228869021899536
+ outer loop
+ vertex 11.141623530443681 152.47054977096985 -28.207798811618975
+ vertex 10.447373985721516 148.1705497709698 -26.800000000000054
+ vertex 10.447373985721516 152.47054977096985 -26.800000000000054
+ endloop
+endfacet
+facet normal -0.8314696123025465 6.461816954981074e-16 -0.5555702330196005
+ outer loop
+ vertex 9.575309223803076 148.1705497709698 -25.4948628518954
+ vertex 10.447373985721516 152.47054977096985 -26.800000000000054
+ vertex 10.447373985721516 148.1705497709698 -26.800000000000054
+ endloop
+endfacet
+facet normal -0.8314696123025465 6.461816954981074e-16 -0.5555702330196005
+ outer loop
+ vertex 10.447373985721516 152.47054977096985 -26.800000000000054
+ vertex 9.575309223803076 148.1705497709698 -25.4948628518954
+ vertex 9.575309223803076 152.47054977096985 -25.4948628518954
+ endloop
+endfacet
+facet normal -0.7518398074789734 5.842969055650306e-16 -0.6593458151000736
+ outer loop
+ vertex 8.540350514546814 148.1705497709698 -24.314718625761483
+ vertex 9.575309223803076 152.47054977096985 -25.4948628518954
+ vertex 9.575309223803076 148.1705497709698 -25.4948628518954
+ endloop
+endfacet
+facet normal -0.7518398074789734 5.842969055650306e-16 -0.6593458151000736
+ outer loop
+ vertex 9.575309223803076 152.47054977096985 -25.4948628518954
+ vertex 8.540350514546814 148.1705497709698 -24.314718625761483
+ vertex 8.540350514546814 152.47054977096985 -24.314718625761483
+ endloop
+endfacet
+facet normal -0.6593458151000735 5.124146335800398e-16 -0.7518398074789733
+ outer loop
+ vertex 7.360206288412901 152.47054977096985 -23.279759916505228
+ vertex 8.540350514546814 148.1705497709698 -24.314718625761483
+ vertex 7.360206288412901 148.1705497709698 -23.279759916505228
+ endloop
+endfacet
+facet normal -0.6593458151000735 5.124146335800398e-16 -0.7518398074789733
+ outer loop
+ vertex 8.540350514546814 148.1705497709698 -24.314718625761483
+ vertex 7.360206288412901 152.47054977096985 -23.279759916505228
+ vertex 8.540350514546814 152.47054977096985 -24.314718625761483
+ endloop
+endfacet
+facet normal -0.5555702330195956 4.317648051463027e-16 -0.8314696123025496
+ outer loop
+ vertex 6.0550691403082295 152.47054977096985 -22.40769515458679
+ vertex 7.360206288412901 148.1705497709698 -23.279759916505228
+ vertex 6.0550691403082295 148.1705497709698 -22.40769515458679
+ endloop
+endfacet
+facet normal -0.5555702330195956 4.317648051463027e-16 -0.8314696123025496
+ outer loop
+ vertex 7.360206288412901 148.1705497709698 -23.279759916505228
+ vertex 6.0550691403082295 152.47054977096985 -22.40769515458679
+ vertex 7.360206288412901 152.47054977096985 -23.279759916505228
+ endloop
+endfacet
+facet normal -0.4422886902190014 3.437273611887068e-16 -0.8968727415326885
+ outer loop
+ vertex 4.6472703286893084 152.47054977096985 -21.71344560986461
+ vertex 6.0550691403082295 148.1705497709698 -22.40769515458679
+ vertex 4.6472703286893084 148.1705497709698 -21.71344560986461
+ endloop
+endfacet
+facet normal -0.4422886902190014 3.437273611887068e-16 -0.8968727415326885
+ outer loop
+ vertex 6.0550691403082295 148.1705497709698 -22.40769515458679
+ vertex 4.6472703286893084 152.47054977096985 -21.71344560986461
+ vertex 6.0550691403082295 152.47054977096985 -22.40769515458679
+ endloop
+endfacet
+facet normal -0.32143946530316403 2.4980864678194006e-16 -0.9469301294951049
+ outer loop
+ vertex 3.160897681538491 152.47054977096985 -21.208890084531234
+ vertex 4.6472703286893084 148.1705497709698 -21.71344560986461
+ vertex 3.160897681538491 148.1705497709698 -21.208890084531234
+ endloop
+endfacet
+facet normal -0.32143946530316403 2.4980864678194006e-16 -0.9469301294951049
+ outer loop
+ vertex 4.6472703286893084 148.1705497709698 -21.71344560986461
+ vertex 3.160897681538491 152.47054977096985 -21.208890084531234
+ vertex 4.6472703286893084 152.47054977096985 -21.71344560986461
+ endloop
+endfacet
+facet normal -0.1950903220161279 1.5161563716868863e-16 -0.9807852804032307
+ outer loop
+ vertex 1.621383446948867 152.47054977096985 -20.90266166351433
+ vertex 3.160897681538491 148.1705497709698 -21.208890084531234
+ vertex 1.621383446948867 148.1705497709698 -20.90266166351433
+ endloop
+endfacet
+facet normal -0.1950903220161279 1.5161563716868863e-16 -0.9807852804032307
+ outer loop
+ vertex 3.160897681538491 148.1705497709698 -21.208890084531234
+ vertex 1.621383446948867 152.47054977096985 -20.90266166351433
+ vertex 3.160897681538491 152.47054977096985 -21.208890084531234
+ endloop
+endfacet
+facet normal -0.0654031292301443 5.0828441967688317e-17 -0.9978589232386036
+ outer loop
+ vertex 0.055069140308240346 152.47054977096985 -20.80000000000005
+ vertex 1.621383446948867 148.1705497709698 -20.90266166351433
+ vertex 0.055069140308240346 148.1705497709698 -20.80000000000005
+ endloop
+endfacet
+facet normal -0.0654031292301443 5.0828441967688317e-17 -0.9978589232386036
+ outer loop
+ vertex 1.621383446948867 148.1705497709698 -20.90266166351433
+ vertex 0.055069140308240346 152.47054977096985 -20.80000000000005
+ vertex 1.621383446948867 152.47054977096985 -20.90266166351433
+ endloop
+endfacet
+facet normal 0.0654031292301443 -5.0828441967688767e-17 -0.9978589232386036
+ outer loop
+ vertex -1.5112451663323863 152.47054977096985 -20.90266166351433
+ vertex 0.055069140308240346 148.1705497709698 -20.80000000000005
+ vertex -1.5112451663323863 148.17054977096984 -20.90266166351433
+ endloop
+endfacet
+facet normal 0.0654031292301443 -5.0828441967688767e-17 -0.9978589232386036
+ outer loop
+ vertex 0.055069140308240346 148.1705497709698 -20.80000000000005
+ vertex -1.5112451663323863 152.47054977096985 -20.90266166351433
+ vertex 0.055069140308240346 152.47054977096985 -20.80000000000005
+ endloop
+endfacet
+facet normal 0.19509032201613138 -1.5161563716869181e-16 -0.98078528040323
+ outer loop
+ vertex -3.0507594009220105 152.47054977096985 -21.208890084531237
+ vertex -1.5112451663323863 148.17054977096984 -20.90266166351433
+ vertex -3.0507594009220105 148.17054977096984 -21.208890084531237
+ endloop
+endfacet
+facet normal 0.19509032201613138 -1.5161563716869181e-16 -0.98078528040323
+ outer loop
+ vertex -1.5112451663323863 148.17054977096984 -20.90266166351433
+ vertex -3.0507594009220105 152.47054977096985 -21.208890084531237
+ vertex -1.5112451663323863 152.47054977096985 -20.90266166351433
+ endloop
+endfacet
+facet normal 0.32143946530315637 -2.4980864678193454e-16 -0.9469301294951075
+ outer loop
+ vertex -4.53713204807285 152.47054977096985 -21.71344560986461
+ vertex -3.0507594009220105 148.17054977096984 -21.208890084531237
+ vertex -4.53713204807285 148.17054977096984 -21.71344560986461
+ endloop
+endfacet
+facet normal 0.32143946530315637 -2.4980864678193454e-16 -0.9469301294951075
+ outer loop
+ vertex -3.0507594009220105 148.17054977096984 -21.208890084531237
+ vertex -4.53713204807285 152.47054977096985 -21.71344560986461
+ vertex -3.0507594009220105 152.47054977096985 -21.208890084531237
+ endloop
+endfacet
+facet normal 0.44228869021900424 -3.437273611887094e-16 -0.8968727415326869
+ outer loop
+ vertex -5.944930859691771 152.47054977096985 -22.407695154586794
+ vertex -4.53713204807285 148.17054977096984 -21.71344560986461
+ vertex -5.944930859691771 148.17054977096984 -22.407695154586794
+ endloop
+endfacet
+facet normal 0.44228869021900424 -3.437273611887094e-16 -0.8968727415326869
+ outer loop
+ vertex -4.53713204807285 148.17054977096984 -21.71344560986461
+ vertex -5.944930859691771 152.47054977096985 -22.407695154586794
+ vertex -4.53713204807285 152.47054977096985 -21.71344560986461
+ endloop
+endfacet
+facet normal 0.5555702330196023 -4.317648051463082e-16 -0.8314696123025452
+ outer loop
+ vertex -7.250068007796415 152.47054977096985 -23.279759916505235
+ vertex -5.944930859691771 148.17054977096984 -22.407695154586794
+ vertex -7.250068007796415 148.17054977096984 -23.279759916505235
+ endloop
+endfacet
+facet normal 0.5555702330196023 -4.317648051463082e-16 -0.8314696123025452
+ outer loop
+ vertex -5.944930859691771 148.17054977096984 -22.407695154586794
+ vertex -7.250068007796415 152.47054977096985 -23.279759916505235
+ vertex -5.944930859691771 152.47054977096985 -22.407695154586794
+ endloop
+endfacet
+facet normal 0.6593458151000714 -5.124146335800385e-16 -0.7518398074789752
+ outer loop
+ vertex -8.430212233930328 152.47054977096985 -24.314718625761483
+ vertex -7.250068007796415 148.17054977096984 -23.279759916505235
+ vertex -8.430212233930328 148.17054977096984 -24.314718625761483
+ endloop
+endfacet
+facet normal 0.6593458151000714 -5.124146335800385e-16 -0.7518398074789752
+ outer loop
+ vertex -7.250068007796415 148.17054977096984 -23.279759916505235
+ vertex -8.430212233930328 152.47054977096985 -24.314718625761483
+ vertex -7.250068007796415 152.47054977096985 -23.279759916505235
+ endloop
+endfacet
+facet normal 0.7518398074789764 -5.842969055650333e-16 -0.65934581510007
+ outer loop
+ vertex -8.430212233930328 152.47054977096985 -24.314718625761483
+ vertex -9.46517094318659 148.17054977096984 -25.494862851895416
+ vertex -9.46517094318659 152.47054977096985 -25.494862851895416
+ endloop
+endfacet
+facet normal 0.7518398074789764 -5.842969055650333e-16 -0.65934581510007
+ outer loop
+ vertex -9.46517094318659 148.17054977096984 -25.494862851895416
+ vertex -8.430212233930328 152.47054977096985 -24.314718625761483
+ vertex -8.430212233930328 148.17054977096984 -24.314718625761483
+ endloop
+endfacet
+facet normal 0.8314696123025452 -6.461816954981068e-16 -0.5555702330196021
+ outer loop
+ vertex -9.46517094318659 152.47054977096985 -25.494862851895416
+ vertex -10.33723570510503 148.17054977096984 -26.800000000000058
+ vertex -10.33723570510503 152.47054977096985 -26.800000000000058
+ endloop
+endfacet
+facet normal 0.8314696123025452 -6.461816954981068e-16 -0.5555702330196021
+ outer loop
+ vertex -10.33723570510503 148.17054977096984 -26.800000000000058
+ vertex -9.46517094318659 152.47054977096985 -25.494862851895416
+ vertex -9.46517094318659 148.17054977096984 -25.494862851895416
+ endloop
+endfacet
+facet normal 0.8968727415326919 -6.97010137465797e-16 -0.4422886902189939
+ outer loop
+ vertex -10.33723570510503 152.47054977096985 -26.800000000000058
+ vertex -11.031485249827195 148.17054977096984 -28.207798811618986
+ vertex -11.031485249827195 152.47054977096985 -28.207798811618986
+ endloop
+endfacet
+facet normal 0.8968727415326919 -6.97010137465797e-16 -0.4422886902189939
+ outer loop
+ vertex -11.031485249827195 148.17054977096984 -28.207798811618986
+ vertex -10.33723570510503 152.47054977096985 -26.800000000000058
+ vertex -10.33723570510503 148.17054977096984 -26.800000000000058
+ endloop
+endfacet
+facet normal 0.9469301294951041 -7.359125427337218e-16 -0.321439465303166
+ outer loop
+ vertex -11.031485249827195 152.47054977096985 -28.207798811618986
+ vertex -11.53604077516058 148.17054977096984 -29.69417145876981
+ vertex -11.53604077516058 152.47054977096985 -29.69417145876981
+ endloop
+endfacet
+facet normal 0.9469301294951041 -7.359125427337218e-16 -0.321439465303166
+ outer loop
+ vertex -11.53604077516058 148.17054977096984 -29.69417145876981
+ vertex -11.031485249827195 152.47054977096985 -28.207798811618986
+ vertex -11.031485249827195 148.17054977096984 -28.207798811618986
+ endloop
+endfacet
+facet normal 0.9807852804032308 -7.622232803619749e-16 -0.1950903220161271
+ outer loop
+ vertex -11.53604077516058 152.47054977096985 -29.69417145876981
+ vertex -11.842269196177483 148.17054977096984 -31.233685693359437
+ vertex -11.842269196177483 152.47054977096985 -31.233685693359437
+ endloop
+endfacet
+facet normal 0.9807852804032308 -7.622232803619749e-16 -0.1950903220161271
+ outer loop
+ vertex -11.842269196177483 148.17054977096984 -31.233685693359437
+ vertex -11.53604077516058 152.47054977096985 -29.69417145876981
+ vertex -11.53604077516058 148.17054977096984 -29.69417145876981
+ endloop
+endfacet
+facet normal 0.9978589232386034 -7.754921663350147e-16 -0.06540312923014473
+ outer loop
+ vertex -11.842269196177483 152.47054977096985 -31.233685693359437
+ vertex -11.94493085969176 148.17054977096984 -32.800000000000054
+ vertex -11.94493085969176 152.47054977096985 -32.800000000000054
+ endloop
+endfacet
+facet normal 0.9978589232386034 -7.754921663350147e-16 -0.06540312923014473
+ outer loop
+ vertex -11.94493085969176 148.17054977096984 -32.800000000000054
+ vertex -11.842269196177483 152.47054977096985 -31.233685693359437
+ vertex -11.842269196177483 148.17054977096984 -31.233685693359437
+ endloop
+endfacet
+facet normal 0.9978589232386035 -7.754921663350148e-16 0.06540312923014402
+ outer loop
+ vertex -11.94493085969176 152.47054977096985 -32.800000000000054
+ vertex -11.842269196177483 148.17054977096984 -34.36631430664068
+ vertex -11.842269196177483 152.47054977096985 -34.36631430664068
+ endloop
+endfacet
+facet normal 0.9978589232386035 -7.754921663350148e-16 0.06540312923014402
+ outer loop
+ vertex -11.842269196177483 148.17054977096984 -34.36631430664068
+ vertex -11.94493085969176 152.47054977096985 -32.800000000000054
+ vertex -11.94493085969176 148.17054977096984 -32.800000000000054
+ endloop
+endfacet
+facet normal 0.9807852804032307 -7.622232803619747e-16 0.19509032201612778
+ outer loop
+ vertex -11.842269196177483 152.47054977096985 -34.36631430664068
+ vertex -11.53604077516058 148.17054977096984 -35.905828541230306
+ vertex -11.53604077516058 152.47054977096985 -35.905828541230306
+ endloop
+endfacet
+facet normal 0.9807852804032307 -7.622232803619747e-16 0.19509032201612778
+ outer loop
+ vertex -11.53604077516058 148.17054977096984 -35.905828541230306
+ vertex -11.842269196177483 152.47054977096985 -34.36631430664068
+ vertex -11.842269196177483 148.17054977096984 -34.36631430664068
+ endloop
+endfacet
+facet normal 0.9469301294951047 -7.359125427337222e-16 0.3214394653031649
+ outer loop
+ vertex -11.53604077516058 152.47054977096985 -35.905828541230306
+ vertex -11.031485249827195 148.17054977096984 -37.392201188381144
+ vertex -11.031485249827195 152.47054977096985 -37.392201188381144
+ endloop
+endfacet
+facet normal 0.9469301294951047 -7.359125427337222e-16 0.3214394653031649
+ outer loop
+ vertex -11.031485249827195 148.17054977096984 -37.392201188381144
+ vertex -11.53604077516058 152.47054977096985 -35.905828541230306
+ vertex -11.53604077516058 148.17054977096984 -35.905828541230306
+ endloop
+endfacet
+facet normal 0.8968727415326913 -6.970101374657962e-16 0.44228869021899536
+ outer loop
+ vertex -11.031485249827195 152.47054977096985 -37.392201188381144
+ vertex -10.33723570510503 148.17054977096984 -38.80000000000006
+ vertex -10.33723570510503 152.47054977096985 -38.80000000000006
+ endloop
+endfacet
+facet normal 0.8968727415326913 -6.970101374657962e-16 0.44228869021899536
+ outer loop
+ vertex -10.33723570510503 148.17054977096984 -38.80000000000006
+ vertex -11.031485249827195 152.47054977096985 -37.392201188381144
+ vertex -11.031485249827195 148.17054977096984 -37.392201188381144
+ endloop
+endfacet
+facet normal 0.8314696123025387 -6.461816954981013e-16 0.5555702330196121
+ outer loop
+ vertex -10.33723570510503 152.47054977096985 -38.80000000000006
+ vertex -9.465170943186568 148.17054977096984 -40.10513714810471
+ vertex -9.465170943186568 152.47054977096985 -40.10513714810471
+ endloop
+endfacet
+facet normal 0.8314696123025387 -6.461816954981013e-16 0.5555702330196121
+ outer loop
+ vertex -9.465170943186568 148.17054977096984 -40.10513714810471
+ vertex -10.33723570510503 152.47054977096985 -38.80000000000006
+ vertex -10.33723570510503 148.17054977096984 -38.80000000000006
+ endloop
+endfacet
+facet normal 0.751839807478982 -5.842969055650374e-16 0.6593458151000637
+ outer loop
+ vertex -9.465170943186568 152.47054977096985 -40.10513714810471
+ vertex -8.430212233930328 148.17054977096984 -41.285281374238636
+ vertex -8.430212233930328 152.47054977096985 -41.285281374238636
+ endloop
+endfacet
+facet normal 0.751839807478982 -5.842969055650374e-16 0.6593458151000637
+ outer loop
+ vertex -8.430212233930328 148.17054977096984 -41.285281374238636
+ vertex -9.465170943186568 152.47054977096985 -40.10513714810471
+ vertex -9.465170943186568 148.17054977096984 -40.10513714810471
+ endloop
+endfacet
+facet normal 0.6593458151000714 -5.124146335800382e-16 0.7518398074789752
+ outer loop
+ vertex -7.250068007796415 152.47054977096985 -42.32024008349488
+ vertex -8.430212233930328 148.17054977096984 -41.285281374238636
+ vertex -7.250068007796415 148.17054977096984 -42.32024008349488
+ endloop
+endfacet
+facet normal 0.6593458151000714 -5.124146335800382e-16 0.7518398074789752
+ outer loop
+ vertex -8.430212233930328 148.17054977096984 -41.285281374238636
+ vertex -7.250068007796415 152.47054977096985 -42.32024008349488
+ vertex -8.430212233930328 152.47054977096985 -41.285281374238636
+ endloop
+endfacet
+facet normal 0.5555702330195956 -4.317648051463027e-16 0.8314696123025496
+ outer loop
+ vertex -5.944930859691748 152.47054977096985 -43.192304845413325
+ vertex -7.250068007796415 148.17054977096984 -42.32024008349488
+ vertex -5.944930859691748 148.17054977096984 -43.192304845413325
+ endloop
+endfacet
+facet normal 0.5555702330195956 -4.317648051463027e-16 0.8314696123025496
+ outer loop
+ vertex -7.250068007796415 148.17054977096984 -42.32024008349488
+ vertex -5.944930859691748 152.47054977096985 -43.192304845413325
+ vertex -7.250068007796415 152.47054977096985 -42.32024008349488
+ endloop
+endfacet
+facet normal 0.4422886902190014 -3.437273611887068e-16 0.8968727415326885
+ outer loop
+ vertex -4.537132048072828 152.47054977096985 -43.8865543901355
+ vertex -5.944930859691748 148.17054977096984 -43.192304845413325
+ vertex -4.537132048072828 148.17054977096984 -43.8865543901355
+ endloop
+endfacet
+facet normal 0.4422886902190014 -3.437273611887068e-16 0.8968727415326885
+ outer loop
+ vertex -5.944930859691748 148.17054977096984 -43.192304845413325
+ vertex -4.537132048072828 152.47054977096985 -43.8865543901355
+ vertex -5.944930859691748 152.47054977096985 -43.192304845413325
+ endloop
+endfacet
+facet normal 0.32143946530316403 -2.4980864678194006e-16 0.9469301294951049
+ outer loop
+ vertex -3.0507594009220105 152.47054977096985 -44.391109915468874
+ vertex -4.537132048072828 148.17054977096984 -43.8865543901355
+ vertex -3.0507594009220105 148.17054977096984 -44.391109915468874
+ endloop
+endfacet
+facet normal 0.32143946530316403 -2.4980864678194006e-16 0.9469301294951049
+ outer loop
+ vertex -4.537132048072828 148.17054977096984 -43.8865543901355
+ vertex -3.0507594009220105 152.47054977096985 -44.391109915468874
+ vertex -4.537132048072828 152.47054977096985 -43.8865543901355
+ endloop
+endfacet
+facet normal 0.1950903220161279 -1.5161563716868863e-16 0.9807852804032307
+ outer loop
+ vertex -1.5112451663323863 152.47054977096985 -44.69733833648578
+ vertex -3.0507594009220105 148.17054977096984 -44.391109915468874
+ vertex -1.5112451663323863 148.17054977096984 -44.69733833648578
+ endloop
+endfacet
+facet normal 0.1950903220161279 -1.5161563716868863e-16 0.9807852804032307
+ outer loop
+ vertex -3.0507594009220105 148.17054977096984 -44.391109915468874
+ vertex -1.5112451663323863 152.47054977096985 -44.69733833648578
+ vertex -3.0507594009220105 152.47054977096985 -44.391109915468874
+ endloop
+endfacet
+facet normal 0.0654031292301443 -5.0828441967688317e-17 0.9978589232386036
+ outer loop
+ vertex 0.055069140308240346 152.47054977096985 -44.800000000000054
+ vertex -1.5112451663323863 148.17054977096984 -44.69733833648578
+ vertex 0.055069140308240346 148.1705497709698 -44.800000000000054
+ endloop
+endfacet
+facet normal 0.0654031292301443 -5.0828441967688317e-17 0.9978589232386036
+ outer loop
+ vertex -1.5112451663323863 148.17054977096984 -44.69733833648578
+ vertex 0.055069140308240346 152.47054977096985 -44.800000000000054
+ vertex -1.5112451663323863 152.47054977096985 -44.69733833648578
+ endloop
+endfacet
+facet normal -0.0654031292301443 5.0828441967688767e-17 0.9978589232386036
+ outer loop
+ vertex 1.621383446948867 152.47054977096985 -44.69733833648578
+ vertex 0.055069140308240346 148.1705497709698 -44.800000000000054
+ vertex 1.621383446948867 148.1705497709698 -44.69733833648578
+ endloop
+endfacet
+facet normal -0.0654031292301443 5.0828441967688767e-17 0.9978589232386036
+ outer loop
+ vertex 0.055069140308240346 148.1705497709698 -44.800000000000054
+ vertex 1.621383446948867 152.47054977096985 -44.69733833648578
+ vertex 0.055069140308240346 152.47054977096985 -44.800000000000054
+ endloop
+endfacet
+facet normal -0.1950903220161279 1.516156371686891e-16 0.9807852804032307
+ outer loop
+ vertex 3.160897681538491 152.47054977096985 -44.391109915468874
+ vertex 1.621383446948867 148.1705497709698 -44.69733833648578
+ vertex 3.160897681538491 148.1705497709698 -44.391109915468874
+ endloop
+endfacet
+facet normal -0.1950903220161279 1.516156371686891e-16 0.9807852804032307
+ outer loop
+ vertex 1.621383446948867 148.1705497709698 -44.69733833648578
+ vertex 3.160897681538491 152.47054977096985 -44.391109915468874
+ vertex 1.621383446948867 152.47054977096985 -44.69733833648578
+ endloop
+endfacet
+facet normal -0.32143946530316403 2.498086467819405e-16 0.9469301294951049
+ outer loop
+ vertex 4.6472703286893084 152.47054977096985 -43.8865543901355
+ vertex 3.160897681538491 148.1705497709698 -44.391109915468874
+ vertex 4.6472703286893084 148.1705497709698 -43.8865543901355
+ endloop
+endfacet
+facet normal -0.32143946530316403 2.498086467819405e-16 0.9469301294951049
+ outer loop
+ vertex 3.160897681538491 148.1705497709698 -44.391109915468874
+ vertex 4.6472703286893084 152.47054977096985 -43.8865543901355
+ vertex 3.160897681538491 152.47054977096985 -44.391109915468874
+ endloop
+endfacet
+facet normal -0.4422886902189971 3.4372736118870383e-16 0.8968727415326905
+ outer loop
+ vertex 6.055069140308252 152.47054977096985 -43.19230484541332
+ vertex 4.6472703286893084 148.1705497709698 -43.8865543901355
+ vertex 6.055069140308252 148.1705497709698 -43.19230484541332
+ endloop
+endfacet
+facet normal -0.4422886902189971 3.4372736118870383e-16 0.8968727415326905
+ outer loop
+ vertex 4.6472703286893084 148.1705497709698 -43.8865543901355
+ vertex 6.055069140308252 152.47054977096985 -43.19230484541332
+ vertex 4.6472703286893084 152.47054977096985 -43.8865543901355
+ endloop
+endfacet
+facet normal -0.5555702330196036 4.3176480514630925e-16 0.8314696123025446
+ outer loop
+ vertex 7.360206288412901 152.47054977096985 -42.32024008349487
+ vertex 6.055069140308252 148.1705497709698 -43.19230484541332
+ vertex 7.360206288412901 148.1705497709698 -42.32024008349487
+ endloop
+endfacet
+facet normal -0.5555702330196036 4.3176480514630925e-16 0.8314696123025446
+ outer loop
+ vertex 6.055069140308252 148.1705497709698 -43.19230484541332
+ vertex 7.360206288412901 152.47054977096985 -42.32024008349487
+ vertex 6.055069140308252 152.47054977096985 -43.19230484541332
+ endloop
+endfacet
+facet normal -0.6593458151000714 5.124146335800385e-16 0.7518398074789752
+ outer loop
+ vertex 8.540350514546814 152.47054977096985 -41.28528137423862
+ vertex 7.360206288412901 148.1705497709698 -42.32024008349487
+ vertex 8.540350514546814 148.1705497709698 -41.28528137423862
+ endloop
+endfacet
+facet normal -0.6593458151000714 5.124146335800385e-16 0.7518398074789752
+ outer loop
+ vertex 7.360206288412901 148.1705497709698 -42.32024008349487
+ vertex 8.540350514546814 152.47054977096985 -41.28528137423862
+ vertex 7.360206288412901 152.47054977096985 -42.32024008349487
+ endloop
+endfacet
+facet normal -0.7518398074789749 5.842969055650321e-16 0.6593458151000718
+ outer loop
+ vertex 9.575309223803076 148.1705497709698 -40.105137148104696
+ vertex 8.540350514546814 152.47054977096985 -41.28528137423862
+ vertex 8.540350514546814 148.1705497709698 -41.28528137423862
+ endloop
+endfacet
+facet normal -0.7518398074789749 5.842969055650321e-16 0.6593458151000718
+ outer loop
+ vertex 8.540350514546814 152.47054977096985 -41.28528137423862
+ vertex 9.575309223803076 148.1705497709698 -40.105137148104696
+ vertex 9.575309223803076 152.47054977096985 -40.105137148104696
+ endloop
+endfacet
+facet normal -0.8314696123025458 6.461816954981072e-16 0.5555702330196013
+ outer loop
+ vertex 10.447373985721516 148.1705497709698 -38.800000000000054
+ vertex 9.575309223803076 152.47054977096985 -40.105137148104696
+ vertex 9.575309223803076 148.1705497709698 -40.105137148104696
+ endloop
+endfacet
+facet normal -0.8314696123025458 6.461816954981072e-16 0.5555702330196013
+ outer loop
+ vertex 9.575309223803076 152.47054977096985 -40.105137148104696
+ vertex 10.447373985721516 148.1705497709698 -38.800000000000054
+ vertex 10.447373985721516 152.47054977096985 -38.800000000000054
+ endloop
+endfacet
+facet normal -0.8968727415326917 6.970101374657969e-16 0.4422886902189947
+ outer loop
+ vertex 11.141623530443681 148.1705497709698 -37.39220118838113
+ vertex 10.447373985721516 152.47054977096985 -38.800000000000054
+ vertex 10.447373985721516 148.1705497709698 -38.800000000000054
+ endloop
+endfacet
+facet normal -0.8968727415326917 6.970101374657969e-16 0.4422886902189947
+ outer loop
+ vertex 10.447373985721516 152.47054977096985 -38.800000000000054
+ vertex 11.141623530443681 148.1705497709698 -37.39220118838113
+ vertex 11.141623530443681 152.47054977096985 -37.39220118838113
+ endloop
+endfacet
+facet normal -0.9469301294951047 7.359125427337223e-16 0.3214394653031649
+ outer loop
+ vertex 11.646179055777065 148.1705497709698 -35.9058285412303
+ vertex 11.141623530443681 152.47054977096985 -37.39220118838113
+ vertex 11.141623530443681 148.1705497709698 -37.39220118838113
+ endloop
+endfacet
+facet normal -0.9469301294951047 7.359125427337223e-16 0.3214394653031649
+ outer loop
+ vertex 11.141623530443681 152.47054977096985 -37.39220118838113
+ vertex 11.646179055777065 148.1705497709698 -35.9058285412303
+ vertex 11.646179055777065 152.47054977096985 -35.9058285412303
+ endloop
+endfacet
+facet normal -0.9807852804032308 7.622232803619749e-16 0.1950903220161271
+ outer loop
+ vertex 11.952407476793969 148.1705497709698 -34.36631430664067
+ vertex 11.646179055777065 152.47054977096985 -35.9058285412303
+ vertex 11.646179055777065 148.1705497709698 -35.9058285412303
+ endloop
+endfacet
+facet normal -0.9807852804032308 7.622232803619749e-16 0.1950903220161271
+ outer loop
+ vertex 11.646179055777065 152.47054977096985 -35.9058285412303
+ vertex 11.952407476793969 148.1705497709698 -34.36631430664067
+ vertex 11.952407476793969 152.47054977096985 -34.36631430664067
+ endloop
+endfacet
+facet normal -0.9978589232386034 7.754921663350147e-16 0.06540312923014473
+ outer loop
+ vertex 12.055069140308246 148.1705497709698 -32.800000000000054
+ vertex 11.952407476793969 152.47054977096985 -34.36631430664067
+ vertex 11.952407476793969 148.1705497709698 -34.36631430664067
+ endloop
+endfacet
+facet normal -0.9978589232386034 7.754921663350147e-16 0.06540312923014473
+ outer loop
+ vertex 11.952407476793969 152.47054977096985 -34.36631430664067
+ vertex 12.055069140308246 148.1705497709698 -32.800000000000054
+ vertex 12.055069140308246 152.47054977096985 -32.800000000000054
+ endloop
+endfacet
+endsolid Anycubic lineal plus cerramiento
diff --git a/resources/profiles/Anycubic/AKLP_thumbnail.png b/resources/profiles/Anycubic/AKLP_thumbnail.png
new file mode 100644
index 000000000..e2ae5c03a
--- /dev/null
+++ b/resources/profiles/Anycubic/AKLP_thumbnail.png
Binary files differ
diff --git a/resources/profiles/Anycubic/AK_Bed.stl b/resources/profiles/Anycubic/AK_Bed.stl
new file mode 100644
index 000000000..31daa1150
--- /dev/null
+++ b/resources/profiles/Anycubic/AK_Bed.stl
Binary files differ
diff --git a/resources/profiles/Anycubic/AK_thumbnail.png b/resources/profiles/Anycubic/AK_thumbnail.png
new file mode 100644
index 000000000..9d09428bc
--- /dev/null
+++ b/resources/profiles/Anycubic/AK_thumbnail.png
Binary files differ
diff --git a/resources/profiles/Anycubic/I3MEGAS_thumbnail.png b/resources/profiles/Anycubic/I3MEGAS_thumbnail.png
new file mode 100644
index 000000000..c51de42ed
--- /dev/null
+++ b/resources/profiles/Anycubic/I3MEGAS_thumbnail.png
Binary files differ
diff --git a/resources/profiles/Anycubic/I3MEGA_thumbnail.png b/resources/profiles/Anycubic/I3MEGA_thumbnail.png
new file mode 100644
index 000000000..464354c84
--- /dev/null
+++ b/resources/profiles/Anycubic/I3MEGA_thumbnail.png
Binary files differ
diff --git a/resources/profiles/Anycubic/MEGA0_thumbnail.png b/resources/profiles/Anycubic/MEGA0_thumbnail.png
new file mode 100644
index 000000000..ca206123c
--- /dev/null
+++ b/resources/profiles/Anycubic/MEGA0_thumbnail.png
Binary files differ
diff --git a/resources/profiles/Anycubic/PREDATOR_thumbnail.png b/resources/profiles/Anycubic/PREDATOR_thumbnail.png
new file mode 100644
index 000000000..cd651a202
--- /dev/null
+++ b/resources/profiles/Anycubic/PREDATOR_thumbnail.png
Binary files differ
diff --git a/resources/profiles/Anycubic/mega0.svg b/resources/profiles/Anycubic/mega0.svg
new file mode 100644
index 000000000..09d018a44
--- /dev/null
+++ b/resources/profiles/Anycubic/mega0.svg
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="utf-8"?>
+<svg id="Layer_1" data-name="Layer 1" width="220.5mm" height="220.5mm" viewBox="0 0 625.1 625.1" xmlns="http://www.w3.org/2000/svg" xmlns:bx="https://boxy-svg.com">
+ <defs>
+ <style bx:fonts="Saira Stencil One">@font-face { font-family: "Saira Stencil One"; font-style: normal; font-weight: 400; font-stretch: normal; font-variant: normal; font-feature-settings: normal; src: url("data:font/ttf;base64,AAEAAAARAQAABAAQR0RFRkzITecAAVUUAAABEEdQT1MGCHYWAAFWJAAAIf5HU1VCUVMjAQABeCQAABPiT1MvMmG0oH4AARsYAAAAYGNtYXD8c1mNAAEbeAAAB1RjdnQgDAQXxAABMbAAAAB+ZnBnbZ42FNAAASLMAAAOFWdhc3AAAAAQAAFVDAAAAAhnbHlmlTw6BwAAARwAAQWCaGVhZBNr8vsAAQ1sAAAANmhoZWEGggZAAAEa9AAAACRobXR4fjT+SwABDaQAAA1ObG9jYa7ZbAwAAQbAAAAGqm1heHAEtQ9hAAEGoAAAACBuYW1ldtadkgABMjAAAATYcG9zdC4cczsAATcIAAAeBHByZXBGGmhvAAEw5AAAAMsABAAAAAAB9AK8AAMABwAvADMAWkBXJgEFBAFMAAUEBwQFB4AABwgEBwh+AAAAAgYAAmcABgAEBQYEaQAIAAkDCAlnCgEDAQEDVwoBAwMBXwABAwFPBAQzMjEwLy4iIBgXExEEBwQHEhEQCwYZKxEhESElESERNzQ2NzY2NTQnJiMiBwYVFSMmNSY1NDY3NjMyFxYXFxQHBgcGBhUVIwczFSMB9P4MAcL+cLMbGxwcDxczOxgPMQMBCg0mWlclDgMCFg8eFhY1BDw8Arz9RDICWP2o5B0mFhcpIh4YISkZIhwPBAMJDy4WQD8ZFRoqJRgaEh4WNS5GAAACAAIAAAKtArAABAAMACdAJAIBAwABTAADAAIBAwJoBAEAACtNBQEBASwBThERERESEAYJHCsTMxMDIyUjNzMDMxMj3RFPc8gBvKcqUHa328wCsP7u/mJ6mgGc/VD//wACAAACrQOCACIABAAAAAMC7gIxAAD//wACAAACrQOGACIABAAAAAMC8wH9AAD//wACAAACrQQnACIABAAAAAMDHwH9AAD//wAC/zoCrQOGACIABAAAACMCzgHEAAAAAwLzAf0AAP//AAIAAAKtBCcAIgAEAAAAAwMgAf0AAP//AAIAAAKtBGcAIgAEAAAAAwL0Af0AAP//AAIAAAKtBEAAIgAEAAAAAwMhAf0AAP//AAIAAAKtA4EAIgAEAAAAAwLyAf0AAP//AAIAAAKtA4EAIgAEAAAAAwLwAf0AAP//AAIAAAKtBA4AIgAEAAAAAwMiAf0AAP//AAL/OgKtA4EAIgAEAAAAIwLOAcQAAAADAvAB/QAA//8AAgAAAq0EDgAiAAQAAAADAyMB/AAA//8AAgAAAq0EWQAiAAQAAAADAvEB/QAA//8AAgAAAq0EHgAiAAQAAAADAyQB/QAA//8AAgAAAq0DZgAiAAQAAAADAvsB/QAA//8AAgAAAq0DZgAiAAQAAAADAuYCHAAA//8AAv86Aq0CsAAiAAQAAAADAs4BxAAA//8AAgAAAq0DggAiAAQAAAADAu0BrgAA//8AAgAAAq0D+wAiAAQAAAADAvoB5wAA//8AAgAAAq0DhgAiAAQAAAADAvwB/QAA//8AAgAAAq0DhAAiAAQAAAADAvkB8gAAAAIAAv84Aq4CsAAEACEAOEA1BwECBwFMGQEAAUsABQAEAAUEaAYBAQErTQMBAAAsTQAHBwJhAAICMAJOJxERERY0EREICR4rAQMjEzMANxUHBiMiJyY1NDY3IycjNzMDMxMGBwYVFBYzMwE9c8jbEQG+AhgeFUghHB8YNCOnKlB2t9sXEhYUGwsBnv5iArD85AFZAgIaFigYPhp6mgGc/VAMFBYUEBIA//8AAgAAAq0D4gAiAAQAAAADAvUB7wAA//8AAgAAAq0EiwAiAAQAAAADAvYB7wAA//8AAgAAAq0DkwAiAAQAAAADAvcCMQAAAAT/7AAAA5wCsAALAA8AEwAXAEFAPggBBwYBTAAHAAgJBwhnAAMAAgEDAmgABgYAXwUBAAArTQAJCQFfCgQCAQEsAU4XFhUUERERERMREREQCwkfKwEhEyMnIzczJyMDIwEhFSEXMxUjFzMVIwEoARFVww2qQFoZBd3HAngBOP7bDujVDvbjArD9UHqa+v3yArCZb5l2mQD////sAAADnAOCACIAHgAAAAMC7gNKAAAAAgBBAAACdAKwAAMAMAAzQDAnAQMEAUwABAADAgQDaQAFBQBfBgEAACtNAAICAV8HAQEBLAFOKyEqISkhERAICR4rEzMRIzczMjY3NjY1NCYnJiMjNTMyNjc2NjU0JicmJiMjNTMyFRQGBxUWFxYVFAYjI0HIyPIpHB0HBwUFBww0KSMcHQcHBQUHBx0cI3LJOT5BHCBibHMCsP1QmQMGBhYVFhYGCpkDBgYVExQVBgYDma1JSg8EDyAmUFxcAAIAL//4AhICuAAPACwA00uwGFBYQBEbBwADAQAnDwIDASgBBQMDTBtLsC5QWEARGwcAAwIAJw8CAwEoAQUDA0wbQBEbBwADAgAnDwIEASgBBQMDTFlZS7AYUFhAGQIBAQEAYQAAADFNBAEDAwVhBwYCBQUsBU4bS7AuUFhAIAABAgMCAQOAAAICAGEAAAAxTQQBAwMFYQcGAgUFLAVOG0AqAAECBAIBBIAABAMCBAN+AAICAGEAAAAxTQAFBSxNAAMDBmEHAQYGMgZOWVlAEhAQECwQKyopJiUkIiIUMQgJGSsBNjMzMhcWFxUmJyYjIgYHAiYnJiY1NDY3NjY3ERQXFhYXFjMyNzY3FQYHBiMBJQgRGkNAIRIPIy8jJy8PMXUeHRUPFBVRQwICGx0cNzkoEBcxPiIpArcBCgUFjwEEBQUG/eQjKSeBbF92KCktCP6lODQoKAUGBQEEkQsEA///AC//+AISA4IAIgAhAAAAAwLuAhQAAP//AC//+AISA4EAIgAhAAAAAwLyAeAAAAACAC//QwISArgADwAvARhLsBhQWEAVJQwFAwABEQQCBQASAQMFGQEEAwRMG0uwLlBYQBUlDAUDAAERBAIFAhIBAwUZAQQDBEwbQBUlDAUDAAERBAIGAhIBAwUZAQQDBExZWUuwGFBYQB0CAQAAAWEAAQExTQcGAgUFA2EAAwMsTQAEBDAEThtLsC5QWEAkAAIABQACBYAAAAABYQABATFNBwYCBQUDYQADAyxNAAQEMAROG0uwMVBYQCoAAgAGAAIGgAcBBgUABgV+AAAAAWEAAQExTQAFBQNhAAMDLE0ABAQwBE4bQCoAAgAGAAIGgAcBBgUABgV+AAQDBIYAAAABYQABATFNAAUFA2EAAwMsA05ZWVlAEBAQEC8QLy4sEhUUNCAICRsrACMiBgc1NjMzMhcWFxUmJxI3FQYPAiM1NyYmJyYmNTQ2NzY2NxEUFxYWFxYzMjcBrSMnLw8IERpDQCESDyMfFzE+CyCtS0ZWGR0VDxQVUUMCAhsdHDc5KAIfBQajAQoFBY8BBP59BJELBAG3BbIFIyIngWxfdigpLQj+pTg0KCgFBgUA//8AL//4AhIDgQAiACEAAAADAvAB4AAA//8AL//4AhIDZgAiACEAAAADAusBlwAAAAIAQQAAAnkCsAADACkAJEAhAAMDAGEEAQAAK00AAgIBYQUBAQEsAU4oJyIcIREQBgkbKxMzESM3MzI2NzY3NjU0JyYmJyYjIzUzMhYXFhYXFhYVFAYHBgYHBgYjI0HIyPIIMSkKCwECAgIVFxcrCAhQayMiKAkIBQUICSgiI2tQCAKw/VCZCRESJzI6OTQnJAQDmQ4PDzQnI19PUF4jJzQPDw7//wBBAAAE6gOBACIAJwAAACMA1AKoAAAAAwLyBI4AAAAC//8AAAJ5ArAACwAxADtAOAQBAgoFAgEHAgFnAAgIA2EJAQMDK00ABwcAYQYBAAAsAE4AACwqKCcbGRcWAAsACxERERERCwkbKwERIxEjNTMRMxEzFSQWFRQGBwYGBwYGIyM1MzI2NzY3NjU0JyYmJyYjIzUzMhYXFhYXAQnIQkLIXwEMBQUICSgiI2tQCAgxKQoLAQICAhUXFysICFBrIyIoCQER/u8BEZUBCv72lfVfT1BeIyc0Dw8OmQkREicyOjk0JyQEA5kODw80JwD//wBBAAACeQOBACIAJwAAAAMC8gHsAAD/////AAACeQKwAAIAKQAA//8AQQAABJEC5wAiACcAAAADAbYCqAAAAAQAQQAAAjECsAADAAcACwAPAC1AKgAEAAUGBAVnAAMDAF8CAQAAK00ABgYBXwcBAQEsAU4REREREREREAgJHisTMxEjEzMVIxUzFSMVMxUjQcjI8v7+z8/+/gKw/VACsJlvmXaZ//8AQQAAAjEDggAiAC0AAAADAu4CHgAA//8AQQAAAjEDhgAiAC0AAAADAvMB6gAA//8AQQAAAjEDgQAiAC0AAAADAvIB6gAA//8AQQAAAjEDgQAiAC0AAAADAvAB6gAA//8AQQAAAjEEDgAiAC0AAAADAyIB6gAA//8AQf86AjEDgQAiAC0AAAAjAs4BrwAAAAMC8AHqAAD//wBBAAACMQQOACIALQAAAAMDIwHpAAD//wBBAAACMQRZACIALQAAAAMC8QHqAAD//wBBAAACMQQeACIALQAAAAMDJAHqAAD//wA8AAACMQNmACIALQAAAAMC+wHqAAD//wBBAAACMQNmACIALQAAAAMC5gIJAAD//wBBAAACMQNmACIALQAAAAMC6wGhAAD//wBB/zoCMQKwACIALQAAAAMCzgGvAAD//wBBAAACMQOCACIALQAAAAMC7QGbAAD//wBBAAACMQP7ACIALQAAAAMC+gHUAAD//wBBAAACMQOGACIALQAAAAMC/AHqAAD//wBBAAACMQOEACIALQAAAAMC+QHfAAAABABB/zgCMgKwAAMABwALACQARUBCDgEGCQFMHAEBAUsABQAECAUEZwACAgBfAwEAACtNAAgIAV8HAQEBLE0ACQkGYQAGBjAGTiQiERY0EREREREQCgkfKxMzESMBIzUzAyM1MxI3FQcGIyInJjU0NjcjNTMVBgcGFRQWMzNByMgB8P7+L8/PLgIYHhVIIRwfGGb+FxIWFBsLArD9UAIXmf5fmf3sAVkCAhoWKBg+GpmZDBQWFBAS//8AQQAAAjEDkwAiAC0AAAADAvcCHgAAAAMAQQAAAh0CsAADAAcACwAlQCIABAAFAQQFZwADAwBfAgEAACtNAAEBLAFOEREREREQBgkcKxMzESMTMxUjFTMVI0HIyPLq6sXFArD9UAKwmYOZAAMAL//4AlgCuAAQACUALgCUS7AmUFhAEBwGAgEAEAcCBgEqAQQDA0wbQBAcBgICABAHAgYBKgEEAwNMWUuwJlBYQCAABgAFAwYFZwIBAQEAYQAAADFNAAMDBGEHCAIEBDIEThtAJwABAgYCAQaAAAYABQMGBWcAAgIAYQAAADFNAAMDBGEHCAIEBDIETllAFBERLi0pKCcmESURJCMiMRYwCQkZKwE2MzIXFhcVJicmJyYjIgYHAiYnJiY1NDY3NjY3ERQWFxYWMxUjEyM1IREGBwYHASUoGlpLJiMqFREmJgw9ORIidyEhGxIWF04/CAsMLSoKNEcBBC9GIiYCtgIMBAiPBAMBBAIFCv3oHiYmhnBfeicoKgj+pkdLFBUQlQEQkf54CwYFAf//AC//+AJYA4YAIgBCAAAAAwLzAgwAAP//AC//+AJYA4EAIgBCAAAAAwLyAgwAAP//AC//+AJYA4EAIgBCAAAAAwLwAgwAAP//AC/+oQJYArgAIgBCAAAAAwLQAcgAAP//AC//+AJYA2YAIgBCAAAAAwLrAcMAAAACAEEAAAKLArAAAwALACFAHgADAAIBAwJnBAEAACtNBQEBASwBThEREREREAYJHCsTMxEjASM1MxEzESNByMgBgpCQyMgCsP1QAQmgAQf9UAAAAQAdAAACsgKwABcANkAzCwkCBwYEAgADBwBnAAMAAgEDAmcKAQgIK00FAQEBLAFOFxYVFBMSEREREREREREQDAkfKwEjESMRIzUzNSMRIxEjNTM1MxUzNTMVMwKyJ8iQkLrIJCTIusgnAd3+IwEJoDT+IwHdlT4+Pj4A//8AQQAAAosDgQAiAEgAAAADAvACDQAA//8AQf86AosCsAAiAEgAAAADAs4B0gAAAAEAQQAAAQkCsAADABNAEAAAACtNAAEBLAFOERACCRgrEzMRI0HIyAKw/VD//wBBAAACtQKwACIATAAAAAMAXAFKAAD//wBBAAABbQOCACIATAAAAAMC7gGBAAD//wAGAAABQwOGACIATAAAAAMC8wFNAAD////yAAABVwOBACIATAAAAAMC8gFNAAD////yAAABVwOBACIATAAAAAMC8AFNAAD///+fAAABOQNmACIATAAAAAMC+wFNAAD////vAAABWANmACIATAAAAAMC5gFsAAD//wBBAAABCQNmACIATAAAAAMC6wEEAAD//wBB/zoBCQKwACIATAAAAAMCzgEVAAD////bAAABCQOCACIATAAAAAMC7QD+AAD//wBBAAABIwP7ACIATAAAAAMC+gE3AAD//wAGAAABQwOGACIATAAAAAMC/AFNAAD//wAWAAABMwOEACIATAAAAAMC+QFCAAAAAQA6/zgBCgKwABgAKkAnAgEAAwFMEAEBAUsAAgIrTQABASxNAAMDAGEAAAAwAE4nERYzBAkaKwQ3FQcGIyInJjU0NjcjETMRBgcGFRQWMzMBCAIYHhVJIBwfGDDIFxIWFBsLbAFZAgIaFigYPhoCsP1QDBQWFBASAP///9oAAAFtA5MAIgBMAAAAAwL3AYEAAAABABQAAAFrArAAEwAfQBwFAQABAUwAAQErTQAAAAJiAAICLAJOKBcQAwkZKzcyNzY2NzY1ETMRFAYHBgYHBgYjFDYdHRsCAsgGCgsrJiNpX5EDAxkYICIBpv6eYGYiJSkKCQX//wAUAAABuAOBACIAXAAAAAMC8AGuAAAAAgBBAAACrgKwAAMACgAfQBwIBQQDAQABTAIBAAArTQMBAQEsAU4SExEQBAkaKxMzESM3NTczAxMjQcjI8p7a7fDgArD9UPHX6P68/pT//wBB/qECrgKwACIAXgAAAAMC0AHFAAAAAgBBAAACCQKwAAMABwAbQBgAAAArTQACAgFfAwEBASwBThERERAECRorEzMRIzczFSNByMjy1tYCsP1QoaEA//8AQQAAA4gCsAAiAGAAAAADAFwCHQAA//8AQQAAAgkDggAiAGAAAAADAu4BgAAA//8AQQAAAgsCsAAiAGAAAAEHAr8CWP+LAAmxAgG4/4uwNSsA//8AQf6hAgkCsAAiAGAAAAADAtABigAA//8AQQAAAgsCsAAiAGAAAAEHAkMBAQBeAAixAgGwXrA1K///AEH/OQMPAucAIgBgAAAAAwE8Ah0AAAAC//gAAAIJArAACwAPAC5AKwsKCQYFBAMACAMBAUwAAQErTQQBAwMAXwIBAAAsAE4MDAwPDA8VFREFCRkrAREjNQc1NxEzFTcVFxUjNQEJyElJyFio1gFm/pr3KJUoASS1MZX2oaEAAAMAQQAAAzQCsAAFAA0AEQAlQCIPDgkIBgMABwEAAUwCAQAAK00EAwIBASwBThMRFRIRBQkbKxM1MwEHIwEjBycTMxEjARMVI0G4ASAhggEABENWnb6+/cu4uAKSHv2cTAEhorgBef1QAi/+eKcAAwBBAAACiwKwAAUACQANACJAHwsKCQYDAAYBAAFMAgEAACtNAwEBASwBThQSEhEECRorEzUzARUjEzUzEQETFSNByAGCxwm+/ba+vgKUHP1tHQG1+/3AAdH+u/wA//8AQQAABDcCsAAiAGkAAAADAFwCzAAA//8AQQAAAosDggAiAGkAAAADAu4CRAAA//8AQQAAAosDgQAiAGkAAAADAvICEAAA//8AQf6hAosCsAAiAGkAAAADAtAB0QAAAAMAQf85AosCsAATABcAGwA+QDsZGBYVEgEGBAIBTBEBBAFLBgMFAwICK00ABAQsTQABAQBiAAAAMABOFBQAABsaFBcUFwATABMRFwcJGCsBARUGBgcGBiM1Mjc2Njc2NTUBNSERAzUFExUjAQkBggEWGhxsXhsREBACAv59Akq+/nS+vgKw/W0dPk4WFg+CAwMMCgwLEgKUHP3AAUX7b/67/AAAA//x/zkCiwKwAAUACQAaACxAKRMSCQYDAAYBAAFMAgEAACtNAAEBLE0AAwMEYgAEBDAETh4SEhIRBQkbKxM1MwEVIxM1MxEFMjc2Njc2NRETFRQGBwYGI0HIAYLHCb79ZhsREBACAr4VHBxkXQKUHP1tHQG1+/3AtQMDDAoMCwJT/rvXVVsXFg///wBB/zkDvgLnACIAaQAAAAMBPALMAAD//wBBAAACiwOTACIAaQAAAAMC9wJEAAAAAgAv//gCiwK4ABkANQA3QDQnCgIAATEJAgIAMhkCAwIDTAAAAAFhAAEBMU0AAgIDYQQBAwMyA04aGho1GjMwLjMmBQkYKwE0JyYmJyYjIgc1NjMzMhYXFhYVFAYHBgYHBicmJicmJjU0Njc2NjcRFBcWFhcWMzI3FQYjIwG/AQISFBQlKw0JEh1wexwaDQkSFFNK9EAhJgkIBAkSFFJLAgIRFBEoKQ8JEh0BWFcbKSUEAwScASMoJXh4aXElKiwHBCAQNigjW1RpcCYpLAj+pDs2KSYDBAObAf//AC//+AKLA4IAIgByAAAAAwLuAjcAAP//AC//+AKLA4YAIgByAAAAAwLzAgMAAP//AC//+AKLA4EAIgByAAAAAwLyAgMAAP//AC//+AKLA4EAIgByAAAAAwLwAgMAAP//AC//+AKLBA4AIgByAAAAAwMiAgMAAP//AC//OgKLA4EAIgByAAAAIwLOAc4AAAADAvACAwAA//8AL//4AosEDgAiAHIAAAADAyMCAgAA//8AL//4AosEWQAiAHIAAAADAvECAwAA//8AL//4AosEHgAiAHIAAAADAyQCAwAA//8AL//4AosDZgAiAHIAAAADAvsCAwAA//8AL//4AosDZgAiAHIAAAADAuYCIgAA//8AL//4AosECgAiAHIAAAADAuoCIgAA//8AL//4AosECgAiAHIAAAADAuwCIgAA//8AL/86AosCuAAiAHIAAAADAs4BzgAA//8AL//4AosDggAiAHIAAAADAu0BtAAA//8AL//4AosD+wAiAHIAAAADAvoB7QAAAAIAL//4ArkC5QAkAEAAj0uwHlBYQBI6GQUDAAEoGAIEACkOAgUEA0wbQBU6GQICAQUBAAIoGAIEACkOAgUEBExZS7AeUFhAHAYBAwMtTQAAAAFhAgEBATFNAAQEBWEABQUyBU4bQCAGAQMDLU0AAgIrTQAAAAFhAAEBMU0ABAQFYQAFBTIFTllAEwAALSonJQAkACQgHh0aFxUHCRYrARQGBwYHFhYVFAYHBgYHETQnJiYnJiMiBzU2MzMyFzMyNzY2NQAzMjcVBiMjIicmJicmJjU0Njc2NjcRFBcWFhcCuQwQEhwSCgkSFFNKAQISFBQlKw0JEh1JODwkDQUC/uMoKQ8JEh2SQCEmCQgECRIUUksCAhEUAuUlNBMVCiVya2lxJSosBwFcVxspJQQDBJwBCA8GEQ/9rAObASAQNigjW1RpcCYpLAj+pDs2KSYD//8AL//4ArkDggAiAIMAAAADAu4CNwAA//8AL/86ArkC5QAiAIMAAAADAs4BzgAA//8AL//4ArkDggAiAIMAAAADAu0BtAAA//8AL//4ArkD+wAiAIMAAAADAvoB7QAA//8AL//4ArkDkwAiAIMAAAADAvcCNwAA//8AL//4AosDZgAiAHIAAAADAu8CcwAA//8AL//4AosDhgAiAHIAAAADAvwCAwAA//8AL//4AosDhAAiAHIAAAADAvkB+AAAAAIAL/88AosCuAAZAEkARUBCRhgCAAE8GQIFADsJAgQFLgEDAgRMAAAAAWEAAQExTQAFBQRhAAQEMk0AAgIDYQADAzADTj89OjgyLyspFxQgBgkXKwAjIgcGBgcGFREmJicmJjU0Njc2NjMzMhcVNhYVFAYHBgYHBgcGBhUUFjMzMjcVBwYjIicmNTQ2NyMiJzUWMzI3NjY3NjURFhYXAYgrJhMUEgIBSlMUEgkNGhx7cB0SCe0JBAgJJiEOEiYtFBsLBAIYHhVIIRwZFBkSCQ8pKBEUEQICS1IUAh8DBCUpG1f+pAcsKiVxaXh4JSgjAZwWcGlUWyMoNhAHBg0sGBASAVkCAhoWKBY2GAGbAwQDJik2OwFcCCwpAAIAL//HAowC5QAdADsARkBDNR0aFQQAASEUAgMAKiciCgQEAwNMAAUEBYYAAgItTQAAAAFhAAEBMU0AAwMEYQAEBDIETikoJiMgHhwbGRYTEQYJFisAFxYWFRQGBwYGBxE0JyYmJyYjIgc1NjMzMhc3MwcAMzI3FQYjIyInByM3JicmJjU0Njc2NjcRFBcWFhcCXQcaDQkSFFNKAQISFBQlKw0JEh1CMByhOP7hKCkPCRIdPi8goDohDggECRIUUksCAhEUAncKJXh4aXElKiwHAVxXGyklBAMEnAEGM2X+EQObAQY3Zx46I1tUaXAmKSwI/qQ7NikmA///AC//xwKMA4IAIgCNAAAAAwLuAjcAAP//AC//+AKLA5MAIgByAAAAAwL3AjcAAP//AC//+AKLBDUAIgByAAAAAwL4AjcAAAAFAC8AAAPQArAAGQAfADkAQgBIAE9ATCsKAgABCQEGADUBBAcZAQUEBEwABgAHBAYHZwMBAAABYQIBAQErTQgBBAQFYQkKAgUFLAVOICBIR0ZFQkFAPyA5IDY0MhEeMyYLCRorATQnJiYnJiMiBzU2MzMyFhcWFhUUBgcGBgcSJichFSEAJicmJjU0Njc2NjcRFBcWFhcWMzI3FQYjIwA9AjQnMxUjBjY3IRUhAb8BAhIUFCUnEQkSHW98HBoNCRIUU0rmJiUBdv7e/kB7HBoOCRITU0sCAhEUESgpDwUMJwFYAe3tNCUJASL+igFYUxonJAQDBJwBIigkdHZnbSUpKwcCTUkWmf3pIigkdnRnbSUoKwj+rDoyKCQDBAObAQEaGCYpGg2Z+Ug7mQACAEEAAAJsArAAAwAhACVAIgACAAUBAgVnAAMDAF8EAQAAK00AAQEsAU4qISohERAGCRwrEzMRIxMzMjY3NjY1NCYnJiYjIzUzMhYXFhYVFAYHBgYjI0HIyPIYIB8JCQUFCQkgHxhTSl0YFxAPFhldS1MCsP1QAW8FCQgfHx8fCQgFmR0eHFVBPlIcICEAAgBBAAACbAKwAAMAIQAnQCQABAADAgQDaQACAAUBAgVnAAAAK00AAQEsAU4qISohERAGCRwrEzMRIxMzMjY3NjY1NCYnJiYjIzUzMhYXFhYVFAYHBgYjI0HIyPIYIB8JCQUFCQkgHxhTSl0YFxAPFhldS1MCsP1QAQwFCQgfHx8fCQgFmR0eHFVBPlIcICEAAgAv/40C4AK4ABoANQA9QDooCwIAATIKAgMAFwACBAMDTAACBAKGAAAAAWEAAQExTQADAwRhBQEEBDIEThsbGzUbMzEvKTMnBgkZKwURNCcmJicmIyIHNTYzMzIWFxYWFRQGBxcVIyQnJiYnJiY1NDY3NjY3ERQXFhYXFjMyNxUGIwG/AQISFBQlKw0JEh1wexwaDREehOD+y0AhJgkIBAkSFFJLAgIRFBEoKQ8mEgIBWlcbKSUEAwScASMoJXh4bX0psgZrIBA2KCNbVGlwJiksCP6kOzYpJgMEA5oCAAACAEEAAAKFArAAAwAiAC1AKiABAgMBTAADAAIBAwJnAAQEAF8FAQAAK00GAQEBLAFOGiEqIREREAcJHSsTMxEjJSM1MzI2NzY2NTQmJyYmIyM1MzIWFxYWFRQHBgcTI0HIyAEaKCIfIAkIBgYICB8hImdHWBgWDw8VNWjSArD9UOqZBQcHHBsbHQcHBJkcHRtQP1EsOBf+/wD//wBBAAAChQOCACIAlQAAAAMC7gInAAD//wBBAAAChQOBACIAlQAAAAMC8gHzAAD//wBB/qEChQKwACIAlQAAAAMC0AG7AAD//wBBAAAChQNmACIAlQAAAAMC+wHzAAD//wBBAAAChQOGACIAlQAAAAMC/AHzAAAAAwAm//gCPgK4AAwALQA6AD5AOxsLAgABMgwCAwAxAQIDA0w4AQMBSwAAAAFhAAEBMU0AAwMCYQUEAgICMgJOLi4uOi45NzMtLCFBBgkYKwAnJiMiBzUzMhcWFxUDNCYmJycmJyYmNTQ3NjcVFBYXFhYXFxYWFxYVFAcGBgcGJyYnNRYXFjMyNxUjAfpTLhwkIBlSWBwjpQYOEXttJhEMOS5iAgMDDg6KKzYTLTgZRzCZVjMaO0wwFDYRCwIWBwICmwsEB5D+uRUTBwIPDDsZSDRvMSgHyQ0SBQYFAREGEhMveH8zFxUDAQkFBZIFBQIDnP//ACb/+AI+A4IAIgCbAAAAAwLuAhMAAP//ACb/+AI+A4EAIgCbAAAAAwLyAd8AAP//ACb/FgI+ArgAIgCbAAABBwLRAaT/0wAJsQMBuP/TsDUrAP//ACb/+AI+A4EAIgCbAAAAAwLwAd8AAP//ACb+oQI+ArgAIgCbAAAAAwLQAZAAAP//ACb/OgI+ArgAIgCbAAAAAwLOAZAAAAADADv/+ALWArgADgAgACoAnkuwHlBYQBoXBgIBABkYFQMDASgkAgQDIwECBARMIAECSRtAGhcGAgEAGRgVAwMBKCQCBAMjAQIEIAEFAgVMWUuwHlBYQB8AAwEEAQMEgAABAQBhAAAAMU0ABAQCYQYFAgICLAJOG0AjAAMBBAEDBIAAAQEAYQAAADFNAAICLE0ABAQFYQYBBQUyBU5ZQA8hISEqISknJSQUIiMHCRorEzQ2NjMyFwcjIgYGFREjJTQmJiMjNRMXFQceAhUUBgcGJic1FjMyNxUjOyl9hlJjfhNDMw3NAc0NISJc82WJPEolW3NXUB0+KyUNDgFInZU+DI4bUGv+uM4eGwmDARMRgpoGKFBDWF0JAg0JkAwCnAACAC//+AKLArgAGQAvADxAORMBAAESAQUAIgEDAiMIAgQDBEwABQACAwUCZwAAAAFhAAEBMU0AAwMEYQAEBDIEThczJBMzLwYJHCsAFhUUBgcGBgcRNCcmJicmJyIHNTYzMzIWFwMjFhYXFjMyNxUGIyMiJyYmJyYmNSECfg0JEhRTSgEBExQbbmpYS58ocHsczZoCEhMRKCkPCRIdkkAhJgkIBAFoAkh4eGlxJSosBwFcVxsoJQUGAgiJEyMo/nYnJAMEA5sBIBA2KCNjVgAAAgAJAAACPAKwAAMABwA+S7AWUFhAFQABAQBfAAAAK00AAgIuTQADAywDThtAFQABAQBfAAAAK00AAgIDXwADAywDTlm2EREREAQJGisTIRUhFzMRIwkCM/3NtcjIArCgKP4YAAIACQAAAjwCsAADAA8AZEuwFlBYQCAGAQIFAQMEAgNnAAAAAV8IAQEBK00ABwcuTQAEBCwEThtAIAYBAgUBAwQCA2cAAAABXwgBAQErTQAHBwRfAAQELAROWUAWAAAPDg0MCwoJCAcGBQQAAwADEQkJFysBFSE1ATMVIxUjNSM1MzUzAjz9zQF9UFDIUVHIArCgoP6/ldralXkA//8ACQAAAjwDgQAiAKQAAAADAvIBywAA//8ACf8bAjwCsAAiAKQAAAEHAtEBcv/YAAmxAgG4/9iwNSsA//8ACf6hAjwCsAAiAKQAAAADAtABjwAA//8ACf86AjwCsAAiAKQAAAADAs4BjwAAAAIAPv/4AnQCsAAWAB8ALUAqEgoCAQAfAQIBAkwDAQAAK00AAQECYgQBAgIyAk4AABgXABYAEycWBQkYKxYmJyYmNREzERQXFhYXFjMzMjcVBiMjEzMRFAYHBgYH8HIbGQzIAgIOEQ8hFwgKBw0VU8gIEhRSSAgiJiNsawF2/mIlIhsYAwQCmgECuP6KYmQiJyoGAP//AD7/+AJ0A4IAIgCqAAAAAwLuAjYAAP//AD7/+AJ0A4YAIgCqAAAAAwLzAgIAAP//AD7/+AJ0A4EAIgCqAAAAAwLyAgIAAP//AD7/+AJ0A4EAIgCqAAAAAwLwAgIAAP//AD7/+AJ0A2YAIgCqAAAAAwL7AgIAAP//AD7/+AJ0A2YAIgCqAAAAAwLmAiEAAP//AD7/+AJ0BBwAIgCqAAAAAwLoAiEAAP//AD7/+AJ0BB0AIgCqAAAAAwLpAiEAAP//AD7/+AJ0BBwAIgCqAAAAAwLnAiEAAP//AD7/+AJ0BAoAIgCqAAAAAwLqAiEAAP//AD7/OgJ0ArAAIgCqAAAAAwLOAc4AAP//AD7/+AJ0A4IAIgCqAAAAAwLtAbMAAP//AD7/+AJ0A/sAIgCqAAAAAwL6AewAAAACAD7/+AMQAuUAFAArAEBAPSYXAgUADQEDBQJMBgECAi1NAAAAAV8EAQEBK00HAQUFA2IAAwMyA04VFQAAFSsVKiMiHBgAFAAUKBUICRgrARQGBwYGIxEUBgcGBgcRMzI3NjY1ATI3FQYjIyImJyYmNREzERQXFhYXFjMDEAwQEz0wCBIUUkjFJA0FAv7HCAoHDRVpchsZDMgCAg4RDyEC5SU0ExYV/uxiZCInKgYCtQ8GEQ/9rAKaASImI2xrAXb+YiUiGxgDBAD//wA+//gDEAOCACIAuAAAAAMC7gI2AAD//wA+/zoDEALlACIAuAAAAAMCzgHOAAD//wA+//gDEAOCACIAuAAAAAMC7QGzAAD//wA+//gDEAP7ACIAuAAAAAMC+gHsAAD//wA+//gDEAOTACIAuAAAAAMC9wI2AAD//wA+//gCdANmACIAqgAAAAMC7wJyAAD//wA+//gCdAOGACIAqgAAAAMC/AICAAD//wA+//gCdAOEACIAqgAAAAMC+QH3AAAAAgA+/zwCdAKwAAgAMgBAQD0vJwIEAAIBAwQZAQIBA0wGBQIAACtNAAQEA2EAAwMyTQABAQJiAAICMAJOCQkJMgkyKyglIx0aFhQQBwkXKxMzESYmJyYmNQERFAYHBgcGBhUUFjMzMjcVBwYjIicmNTQ2NyMiJzUWMzMyNzY2NzY1ET7ISFIUEggCNgwZFyglLxQbCwQCGB4VSCEcGRQVDQcKCBchDxEOAgICsP1LBionImRiAXb+imtsIyAQDTAZEBIBWQICGhYoFjYYAZoCBAMYGyIlAZ7//wA+//gCdAPiACIAqgAAAAMC9QH0AAD//wA+//gCdAOTACIAqgAAAAMC9wI2AAAAAgAFAAACkgKwAAsAFgAXQBQCAQAAK00DAQEBLAFOFxIRGAQJGis3JicnJicmJwMzEyMTEzMDBwYHBgcHI8gNCiAQCQgFZsy7u5RlyGYlEg8KDQkOHSgmbjYbHg8BWf1QATEBf/6nfjo0JigdAAADAAoAAAPaArAACAAbACUAI0AgEgEBAAFMBQICAAArTQYEAwMBASwBThYSHRESERUHCR0rNyYvAgMzEyMTEzMTIy8CJicjBwcGBg8CIwETMwMHBg8CI6YHCxseUceOspZLzaSrCBUeExEGIgsFCQQUCAsBTjzHUh4TBxMHDB0cMm5+AVn9UAFYAVj9UCFXf01KlzMVJhFXIQFeAVL+p35NIU4d//8ACgAAA9oDggAiAMUAAAADAu4CzAAA//8ACgAAA9oDgQAiAMUAAAADAvACmAAA//8ACgAAA9oDZgAiAMUAAAADAuYCtwAA//8ACgAAA9oDggAiAMUAAAADAu0CSQAAAAMABQAAAqECsAADAAcACwAeQBsJBwIBAAFMAgEAACtNAwEBASwBThQSERAECRorEzMBIwM3MwMFFwcjCeMBteRGTNu+/uVoTdsCsP1QAiSM/s5GpZMAAv/7AAACfgKwAAsAEgAdQBoSCQADAQABTAIBAAArTQABASwBThISFwMJGSs3LwImLwIzExUjEzczDwPYCRoZBAYpbszZyIFdyE4hPxnjFDM1Bw5V5/4y4gHb1aJEgzT////7AAACfgOCACIAywAAAAMC7gIjAAD////7AAACfgOBACIAywAAAAMC8AHvAAD////7AAACfgNmACIAywAAAAMC5gIOAAD////7/zoCfgKwACIAywAAAAMCzgGlAAD////7AAACfgOCACIAywAAAAMC7QGgAAD////7AAACfgP7ACIAywAAAAMC+gHZAAD////7AAACfgOEACIAywAAAAMC+QHkAAD////7AAACfgOTACIAywAAAAMC9wIjAAAAAwAoAAACQgKwAAQACQANAFxACgIBAQAFAQMEAkxLsCBQWEAbAAEBAF8AAAArTQACAi5NAAQEA2AFAQMDLANOG0AeAAIBBAECBIAAAQEAXwAAACtNAAQEA2AFAQMDLANOWUAJEREREhIQBgkcKxMhFQchAwEzASMlMxUhMwIPCP35CwEC8v6QhAEq8P6eArCOC/58AVz+EZmZ//8AKAAAAkIDggAiANQAAAADAu4CGgAA//8AKAAAAkIDgQAiANQAAAADAvIB5gAA//8AKAAAAkIDZgAiANQAAAADAusBnQAA////+wAAAn4DggAiAMsAAAADAu4CIwAA////+wAAAn4DgQAiAMsAAAADAvAB7wAA////+wAAAn4DZgAiAMsAAAADAuYCDgAA////+wAAAn4DggAiAMsAAAADAu0BoAAA////+wAAAn4DhAAiAMsAAAADAvkB5AAA////+wAAAn4DkwAiAMsAAAADAvcCIwAA//8AL//4AhIDogAiACEAAAADAxQB5gAA//8AQQAAAosDggAiAGkAAAADAu4CRAAA//8AL//4AosDogAiAHIAAAADAxQCCQAA//8AJv/4Aj4DogAiAJsAAAADAxQB5QAA//8AKAAAAkIDggAiANQAAAADAu4CGgAAAAIAI//5AfcCBgAVADMAq0AKCwEAAjABAwYCTEuwIlBYQCMABgUDBQYDgAAEAAUGBAVpAQEAAAJhAAICNE0IBwIDAywDThtLsC5QWEAnAAYFAwUGA4AABAAFBgQFaQEBAAACYQACAjRNAAMDLE0IAQcHMgdOG0AuAAEABAABBIAABgUDBQYDgAAEAAUGBAVpAAAAAmEAAgI0TQADAyxNCAEHBzIHTllZQBAWFhYzFjIrISgWIhE1CQkdKwE0JicmJyYjIgcHNTYzMhYXFhYVESMGJjU0Njc2NjMXFSMiBwYHBhUUFhcWFxYzMxUGBiMBPgQKCRkPMjApNV5tVF8YFQ252UIOERE8MVQKFwcUAQEDBAUKDhAKFjEjATwaFgUFAgEEA4ISGBoYSkL+0AdNTjA7ERIPAlkBARIGEw8QBQcBAmYRCwD//wAj//kB9wLnACIA4wAAAAMCvQH5AAD//wAj//kB9wLnACIA4wAAAAMCwgHFAAD//wAj//kB9wOIACIA4wAAAAMDFwHFAAD//wAj/zoB9wLnACIA4wAAACMCzgF5AAAAAwLCAcUAAP//ACP/+QH3A4gAIgDjAAAAAwMYAcUAAP//ACP/+QH3A8gAIgDjAAAAAwMZAcUAAP//ACP/+QH3A6EAIgDjAAAAAwMaAcUAAP//ACP/+QH3AucAIgDjAAAAAwLBAdgAAP//ACP/+QH3AucAIgDjAAAAAwLAAdgAAP//ACP/+QH3A3QAIgDjAAAAAwMbAcUAAP//ACP/OgH3AucAIgDjAAAAIwLOAXkAAAADAsAB2AAA//8AI//5AfcDdAAiAOMAAAADAxwBxAAA//8AI//5AfcDvwAiAOMAAAADAx0BxQAA//8AI//5AfcDhAAiAOMAAAADAx4BxQAA//8AF//5AfcC2gAiAOMAAAADAskBxQAA//8AI//5AfcC2gAiAOMAAAADArUB5AAA//8AI/86AfcCBgAiAOMAAAADAs4BeQAA//8AI//5AfcC5wAiAOMAAAADArwBfwAA//8AI//5AfcDRgAiAOMAAAADAsgBrwAA//8AI//5AfcC5wAiAOMAAAADAsoBxQAA//8AI//5AfcC5gAiAOMAAAADAscBxQAAAAIAI/84AfgCBgAqAEgAzUATGQECBD8BAQgCAQAFA0wiAQEBS0uwIlBYQCwACAcBBwgBgAAGAAcIBgdpAwECAgRhAAQENE0JAQEBLE0ABQUAYQAAADAAThtLsC5QWEAwAAgHAQcIAYAABgAHCAYHaQMBAgIEYQAEBDRNAAEBLE0ACQkyTQAFBQBhAAAAMABOG0A3AAMCBgIDBoAACAcBBwgBgAAGAAcIBgdpAAICBGEABAQ0TQABASxNAAkJMk0ABQUAYQAAADAATllZQA5DQSshIiwiETYWMwoJHysENxUHBiMiJyY1NDY3IxE0JicmJyYjIgcHNTYzMhYXFhYVEQYHBhUUFjMzADYzFxUjIgcGBwYVFBYXFhcWMzMVBgYjIiY1NDY3AfYCGB4VSSAcHxghBAoJGQ8yMCk1Xm1UXxgVDRcSFhQbC/5hPDFUChcHFAEBAwQFCg4QChYxI0VCDhFsAVkCAhoWKBg+GgE8GhYFBQIBBAOCEhgaGEpC/tAMFBYUEBIBjg8CWQEBEgYTDxAFBwECZhELTU4wOxEA//8AI//5AfcDQwAiAOMAAAADAsMBtwAA//8AI//5AfcD7AAiAOMAAAADAsQBtwAA//8AI//5AfcC5wAiAOMAAAADAsUB+gAAAAMAI//4AxUCBgAmADgAWAFqS7ARUFhAEhYUEAMAAiEBAwkiBAIDBAMDTBtLsBZQWEASFhQQAwcCIQEDCSIEAgMEAwNMG0ASFhQQAwcCIQEDCSIEAgMEDANMWVlLsBFQWEAnCgEGCwEJAwYJaQcBAgAAAmEIAQICNE0MAQMDBGEPDQ4FBAQELAROG0uwFlBYQDEKAQYLAQkDBglpAAcHAmEIAQICNE0BAQAAAmEIAQICNE0MAQMDBGEPDQ4FBAQELAROG0uwLlBYQD4KAQYLAQkDBglpAAcHAmEIAQICNE0BAQAAAmEIAQICNE0AAwMEYQ8NDgUEBAQsTQAMDARhDw0OBQQEBCwEThtASAABAAYAAQaACgEGCwEJAwYJaQAHBwJhCAECAjRNAAAAAmEIAQICNE0AAwMFYQ8NDgMFBTJNAAQELE0ADAwFYQ8NDgMFBTIFTllZWUAiOTkAADlYOVZVU0hGRUM4NzEvLiwoJwAmACUUSCIROhAJGysEJicGBxE0JicmJyYjIgcHNTYzMhc2NxEUFhcWFxYzMjc3FQYHBiMDMzQnJiYjIzUzMhYXFhYVFSMEJicmJjU0Njc2NjMXFSMiBwYHBhUUFhcWFxYzMxUGIwH9XR4gJAQKCRkPMjApNV5tZTIgNgYLDBkgJEAdMyhGIi4iRgsGFBMODlZdFhQJ9P6KSxYVEg4RETwxVAoXBxQBAQMEBQoOEAoeEAgSEhUHATwaFgUFAgEEA4ISHRII/tMiHQcIAQIDBIEMBAMBOTgQCQV/HCAcWFgo3hETEjosMDsREg8CWQEBEgYTDxAFBwECgQIA//8AI//4AxUC5wAiAP0AAAADAr0CfAAAAAIAOf/5AhgC5wADACQAbkAKGAEDBAYBAQICTEuwIlBYQCEAAwQCBAMCgAACAQQCAX4AAAAtTQAEBDRNBgUCAQEsAU4bQCUAAwQCBAMCgAACAQQCAX4AAAAtTQAEBDRNAAEBLE0GAQUFMgVOWUAOBAQEJAQjIywkERAHCRsrEzMRIwQmJzUzMjY3Njc2NTQnJiYnJiMjNTY2MzIXFhUUBwYGIzm5uQEoMRQLFhMFBQEBAQEJCw4RCxQuJFAjIyMSOSgC5/0ZBwwPfwUJCxUPLy8PFhQCAn8QCzo8kpM6HRoAAgAq//gBpwIGAAgAIQA3QDQUBwIAAR4IBAMCAB8BAwIDTAAAAAFhAAEBNE0AAgIDYQQBAwMyA04JCQkhCSAcGhIhBQkYKwEmIyIHNRYXFQImJyYmNTQ2NzY2NxEUFhcWFjMyNzcVBiMBhBkvHw1HTOhcFhQLChATTUIFCAkhHzUUIkpUAXUEBJEBEYL+hiYlIFZFP1QgJSkF/vssLAwMCgMEghIA//8AKv/4Ab4C5wAiAQAAAAADAr0B2wAA//8AKv/4AbAC5wAiAQAAAAADAsEBugAAAAIAKv9DAacCBgAIACQAX0ASGgYCAAEkBwMDBAAPCQICBANMS7AxUFhAGgAAAAFhAAEBNE0ABAQCYQACAjJNAAMDMANOG0AaAAMCA4YAAAABYQABATRNAAQEAmEAAgIyAk5ZQAkiIBEVEiAFCRorACMiBzUWFxUnEwYHByM1NyYnJiY1NDY3NjY3ERQWFxYWMzI3NwFrLx8NR0wfIzkwIK1NVCEUCwoQE01CBQgJIR81FCIBeQSRARGCA/6VDQO3BbYONyBWRT9UICUpBf77LCwMDAoDBP//ACr/+AGwAucAIgEAAAAAAwLAAboAAP//ACr/+AGnAtoAIgEAAAAAAwK6AV0AAAACACr/+QIJAucAAwAlAG5AChABAwIiAQEEAkxLsCJQWEAhAAMCBAIDBIAABAECBAF+AAAALU0AAgI0TQYFAgEBLAFOG0AlAAMCBAIDBIAABAECBAF+AAAALU0AAgI0TQABASxNBgEFBTIFTllADgQEBCUEJCwjKREQBwkbKwEzESMGJicmJjU0NzYzMhYXFSMiBgcGBwYVFBcWFhcWMzMVBgYjAVC5ubg5ERMRJCJQJC4UCxYTBQUBAQEBCgsOEAsUMSEC5/0ZBxodHmRLkzs6CxB/BQkLFQ8vLw8VFQICfw8MAAACACr/+AISAucAIwA7AD9APBoZGBcREA8OCAMBCwkCAAMCTAADAzRNAAAAAV8AAQEtTQAEBAJiBgUCAgIsAk4kJCQ7JDonKx0rJgcJGyslNCcmJicmIyM1Fhc3JicHNTcmJzUzFhc3FQcWFhUUBgcGBgcGJicmJjU0Njc2NjMzERQXFhYXFjMzFSMBVgEBCgsMFQ4WEQIPD4RCHCfDExyBPSIkCRETTEOPYhgWDQsREkU7DgEBCgwKFg4O/jMRGBkDA4kCBAMnHBJoCSAiBA8eEmgJP6p0T1ccHx8EAhofHFxVSlwfIiH++DMQGBgDA40A//8AKv/5AuMC5wAiAQYAAAEHAr8DMP/CAAmxAgG4/8KwNSsAAAIAKv/5AkAC5wALAC0AhEAKEAEHBiIBAQgCTEuwIlBYQCwABwYIBgcIgAAIAQYIAX4ABAQtTQIBAAADXwUBAwMrTQAGBjRNCQEBASwBThtAMAAHBggGBwiAAAgBBggBfgAEBC1NAgEAAANfBQEDAytNAAYGNE0AAQEsTQAJCTIJTllADiYkLCMhEREREREQCgkfKwEjESMRIzUzNTMVMwQzMhYXFSMiBgcGBwYVFBcWFhcWMzMVBgYjIiYnJiY1NDcCQDe5eXm5N/4wUCQuFAsWEwUFAQEBAQoLDhALFDEhKDkRExEkAhr95gIalTg4qgsQfwUJCxUPLy8PFRUCAn8PDBodHmRLkzv//wAq//kEKwLnACIBBgAAAAMBtgJCAAAAAgAq//gCAAIGABEALQBxQA4dAQECKAEEAykBBQQDTEuwLlBYQB8AAAADBAADZwABAQJhAAICNE0ABAQFYQcGAgUFLAVOG0AjAAAAAwQAA2cAAQECYQACAjRNAAUFLE0ABAQGYQcBBgYyBk5ZQBESEhItEiwrKiYiFiEkEAgJGisBMzQnJiYjIzUzMhYXFhYVFSMGJicmJjU0Njc2NjcRFBYXFhcWMzI3NxUGBwYjAQxGCwYUEw4OVl0WFAn0OmkaFw4KEBJLQQYLDBkgJEAdMyhGIi4BMTgQCQV/HCAcWFgo3h8iHllOSFUeISUF/tIiHQcIAQIDBIEMBAP//wAq//gCAALnACIBCwAAAAMCvQH/AAD//wAq//gCAALnACIBCwAAAAMCwgHLAAD//wAq//gCAALnACIBCwAAAAMCwQHeAAD//wAq//gCAALnACIBCwAAAAMCwAHeAAD//wAq//gCAAN0ACIBCwAAAAMDGwHLAAD//wAq/zoCAALnACIBCwAAACMCzgGJAAAAAwLAAd4AAP//ACr/+AIAA3QAIgELAAAAAwMcAcoAAP//ACr/+AIAA78AIgELAAAAAwMdAcsAAP//ACr/+AIAA4QAIgELAAAAAwMeAcsAAP//AB3/+AIAAtoAIgELAAAAAwLJAcsAAP//ACr/+AIAAtoAIgELAAAAAwK1AeoAAP//ACr/+AIAAtoAIgELAAAAAwK6AYEAAP//ACr/OgIAAgYAIgELAAAAAwLOAYkAAP//ACr/+AIAAucAIgELAAAAAwK8AYUAAP//ACr/+AIAA0YAIgELAAAAAwLIAbUAAP//ACr/+AIAAucAIgELAAAAAwLKAcsAAP//ACr/+AIAAuYAIgELAAAAAwLHAcsAAAACACr/QwIAAgYAEQA/AIBAEiwBAgM3AQYAOAEFBhUBBAcETEuwLlBYQCgAAQAABgEAZwACAgNhAAMDNE0ABgYFYQAFBTJNCAEHBwRhAAQEMAROG0AlAAEAAAYBAGcIAQcABAcEZQACAgNhAAMDNE0ABgYFYQAFBTIFTllAERISEj8SPjUxJjchJBETCQkcKwAWFRUjNTM0JyYmIyM1MzIWFxMyNxUHBiMiJyY1NDY3IyImJyYmNTQ2NzY2NxEUFhcWFxYzMjc3FQYHBhUUFjMB9wn0RgsGFBMODlZdFgQEAhgeFUkgHBUSFlxpGhcOChASS0EGCwwZICRAHTMXEhYUGwGuWFgoWzgQCQV/HCD91QFZAgIaFigUMRgfIh5ZTkhVHiElBf7SIh0HCAECAwSBDBQWFBASAP//ACr/+AIAAucAIgELAAAAAwLFAgAAAAACAC3/+AIDAgYAGwAtAHVADhcBAAEWAQYACwEFBANMS7AuUFhAHwAGAAMEBgNnAAAAAWEHAgIBAS5NAAQEBWEABQUyBU4bQCMABgADBAYDZwABAS5NAAAAAmEHAQICNE0ABAQFYQAFBTIFTllAFQAALSwmJCMhHRwAGwAaGRgUEAgJFisAFhcWFhUUBgcGBgcRNCYnJicmIyIHBzU2NzYzEyMUFxYWMzMVIyImJyYmNTUzAVtpGhcOChASS0EGCwwZICRAHTMoRiIuIkYLBhQTDg5WXRYUCfQCBh8iHllOSFUeISUFAS4iHQcIAQIDBIEMBAP+xzcRCQV/HCAcWFgoAAACABIAAAGjAucAFAAYAC1AKgACAgFhAAEBLU0ABAQAXwMBAAAuTQAFBQZfAAYGLAZOERERFTEWEAcJHSsTMzU0Njc2NjMVIgcGBgcGFRUzFSEXMxEjEl4YIB5qczQQGBkCA3r+b165uQH+C1VYFBMKgAEBDAwMFi2NKP63AAACACr/MgIJAgUAIQA2AKdLsCJQWEATDAEBABcTAgIBHgEDAiQBBgQETBtAEwwBAQUXEwICAR4BAwIkAQYEBExZS7AiUFhAJwABAAIAAQKAAAIDAAIDfgUBAAA0TQcBAwMsTQAEBAZiCAEGBjYGThtAKwABBQIFAQKAAAIDBQIDfgAAADRNAAUFLk0HAQMDLE0ABAQGYggBBgY2Bk5ZQBYiIgAAIjYiNS8uKCUAIQAgLCMoCQkZKzYmJyY1NDc2NjMyFhcVIyIGBwYHBhUUFxYWFxYzMxUGBiMWJyc1MzI3NjY3NjURMxEUBgcGBiOYOBIkJBI4KCIwFAsWEwUFAQEBAQoLDhALFC4kEUY8hiQiGRcDArkOFxprXAMbHjqQkTgcGgwQfgUICxQOLS0OFRMCAn8QC9EGBoECAg8SGBsB5/46TlkeISD//wAq/zICCQLnACIBIQAAAAMCwgHMAAD//wAq/zICCQLnACIBIQAAAAMCwQHfAAD//wAq/zICCQLnACIBIQAAAAMCwAHfAAD//wAq/zICCQNlACIBIQAAAAMCywGNAAD//wAq/zICCQLaACIBIQAAAAMCugGCAAAAAgA5AAACEwLnAAMAFgAuQCsNAQIDBgEBAgJMAAIDAQMCAYAAAAAtTQADAzRNBAEBASwBThUiJxEQBQkbKxMzESMlNCcmJyYmIyM1NjMyFxYWFREjObm5ASEBAgMEFBYKKD5aHw4KuQLn/RnxNREcCQoFeiA3GEUy/sEAAAL//AAAAhMC5wALAB4AR0BEGgEHCBMBAAcCTAAHCAAIBwCAAAMDLU0JBQIBAQJfBAECAitNAAgINE0GAQAALABOAAAdGxkXEA8ACwALEREREREKCRsrExEjESM1MzUzFTMVFhYVESM1NCcmJyYmIyM1NjMyF/K5PT25c6QKuQECAwQUFgooPlofAh/94QIflTMzlWlFMv7B8TURHAkKBXogNwD////dAAACEwO/ACIBJwAAAQcC8AE4AD4ACLECAbA+sDUr//8AOf86AhMC5wAiAScAAAADAs4BkgAAAAIAOQAAAPIC5wADAAcAH0AcAAEBAF8AAAAtTQACAi5NAAMDLANOEREREAQJGisTMxUjFTMRIzm5ubm5AueQWf4CAAEAOQAAAPIB/gADABNAEAAAAC5NAAEBLAFOERACCRgrEzMRIzm5uQH+/gL//wA5AAABVQLnACIBLAAAAAMCvQFyAAD////3AAABNALnACIBLAAAAAMCwgE+AAD////iAAABRwLnACIBLAAAAAMCwQFRAAD////iAAABRwLnACIBLAAAAAMCwAFRAAD///+QAAABKgLaACIBLAAAAAMCyQE+AAD////gAAABSQLaACIBLAAAAAMCtQFdAAD//wA5AAAA8gLaACIBLAAAAAMCugD0AAD//wA5/zoA8gLnACIBKwAAAAMCzgEDAAD////VAAAA8gLnACIBLAAAAAMCvAD4AAD//wA5AAABFANGACIBLAAAAAMCyAEoAAD////3AAABNALnACIBLAAAAAMCygE+AAD//wA5/zkCHQLnACIBKwAAAAMBPAErAAD//wAHAAABJALmACIBLAAAAAMCxwE+AAAAAgAj/zgA8wLnAAMAHAA2QDMGAQIFAUwUAQMBSwAAAAFfAAEBLU0ABAQuTQADAyxNAAUFAmEAAgIwAk4nERY0ERAGCRwrEyM1MwI3FQcGIyInJjU0NjcjETMRBgcGFRQWMzPyubkBAhgeFUghHB8YIbkXEhYUGwsCV5D8rQFZAgIaFigYPhoB/v4CDBQWFBASAP///8wAAAFfAucAIgEsAAAAAwLFAXMAAAAC/+f/OQDyAucAAwAUACVAIgABAQBfAAAALU0AAwMuTQACAgRiAAQEMAROFhcRERAFCRsrEzMVIwMyNzY2NzY1ETMRFAYHBgYjObm5Uh0REBACArkVHBxiXALnkP1kAwMMCgwLAhD+J1VbFxcOAAH/5/85APIB/gAQABlAFgABAS5NAAAAAmIAAgIwAk4WFxADCRkrBzI3NjY3NjURMxEUBgcGBiMZHREQEAICuRUcHGJcRQMDDAoMCwIQ/idVWxcXDgD////f/zkBRALnACIBPQAAAAMCwAFOAAAAAgA5AAACOQLnAAMACgAjQCAIBQQDAQIBTAAAAC1NAAICLk0DAQEBLAFOEhMREAQJGisTMxEjNzU3MwcTIzm5ueNXw5aZygLn/RmS1Jjy/vQA//8AOf6hAjkC5wAiAT8AAAADAtABjwAAAAIAOQAAAjkB/gADAAoAH0AcCAUEAwEAAUwCAQAALk0DAQEBLAFOEhMREAQJGisTMxEjNzU3MwcTIzm5ueNXw5aZygH+/gKS1Jjy/vQAAAEAOQAAAPIC5wADABNAEAAAAC1NAAEBLAFOERACCRgrEzMRIzm5uQLn/Rn//wA5AAABXgPAACIBQgAAAQcC7gFyAD4ACLEBAbA+sDUr//8AOQAAAboC6AAiAUIAAAEHAr8CB//EAAmxAQG4/8SwNSsA//8AOf6hAPIC5wAiAUIAAAADAtABAAAA//8AOQAAAdoC5wAiAUIAAAEGAkREJQAIsQEBsCWwNSv//wA5/zkCHQLnACIBQgAAAAMBPAErAAAAAf/fAAABSALnAAsAIEAdCwoHBgUEAQAIAAEBTAABAS1NAAAALABOFRICCRgrAQcRIzUHNTcRMxU3AUhWuVpauVYBijD+pvQylTIBXvgwAAADADkAAAMgAgUAEAAkACgAXkuwIlBYthsHAgABAUwbthsHAgAGAUxZS7AiUFhAFQMBAAABYQYEAgEBNE0HBQICAiwCThtAGQAGBi5NAwEAAAFhBAEBATRNBwUCAgIsAk5ZQAsRERUmFRUjFAgJHisBNCcmJiMjNTYzMhYXFhURIwE0JyYmIyMmJyYnNjMyFxYWFREjATMRIwFQBQQRFQUnRR8uECS5ARcFBBEVBQIECAkqTlUfDgq5/dK5uQE3GA0KBX0dDxMseP7BATcYDQoFGhwoEio3GEUy/sEB/v4CAAIAOQAAAhMCBQASABYAYkuwIlBYQAoJAQABAgECAAJMG0AKCQEAAwIBAgACTFlLsCJQWEAVAAABAgEAAoADAQEBNE0EAQICLAJOG0AZAAADAgMAAoAAAQE0TQADAy5NBAECAiwCTlm3EREVIiYFCRsrJTQnJicmJiMjNTYzMhcWFhURIwEzESMBWgECAwQUFgonP1ofDgq5/t+5ufE1ERwJCgV9HTcYRTL+wQH+/gL//wA5AAACEwLnACIBSgAAAAMCvQIHAAD//wAXAAACEwM8ACICXc4AAAIBSgAA//8AOQAAAhMC5wAiAUoAAAADAsEB5gAA//8AOf6hAhMCBQAiAUoAAAADAtABkAAAAAIAOf85AhMCBQAfACMAdkuwIlBYQAoRAQECCgEFAQJMG0AKEQEBBAoBBQECTFlLsCJQWEAeAAECBQIBBYAEAQICNE0ABQUsTQAAAANiAAMDMANOG0AiAAEEBQQBBYAAAgI0TQAEBC5NAAUFLE0AAAADYgADAzADTllACRERGiItEAYJHCsFMjc2Njc2NRE0JyYnJiYjIzU2MzIXFhYVEQYGBwYGIwMzESMBCB4QEBACAgECAwQUFgonP1ofDgoCFhkcYlzPublFAwMMCgwLAQM1ERwJCgV9HTcYRTL+wUJMFBcOAsX+AgAC/+f/OQITAgUAEgAjAHZLsCJQWEAKCQEAAQIBAgACTBtACgkBAAQCAQIAAkxZS7AiUFhAHgAAAQIBAAKABAEBATRNAAICLE0AAwMFYgAFBTAFThtAIgAABAIEAAKAAAEBNE0ABAQuTQACAixNAAMDBWIABQUwBU5ZQAkWFxEVIiYGCRwrJTQnJicmJiMjNTYzMhcWFhURIwUyNzY2NzY1ETMRFAYHBgYjAVoBAgMEFBYKJz9aHw4Kuf6NHREQEAICuRUcHGJc8TURHAkKBX0dNxhFMv7BRQMDDAoMCwIQ/idVWxcXDgD//wA5/zkDPgLnACIBSgAAAAMBPAJMAAD//wA5AAACEwLnACIBSgAAAAMCxQIIAAAAAgAq//gCEgIGABYALQApQCYAAAABYQMBAQE0TQAEBAJiBgUCAgIsAk4XFxctFywnGxohJgcJGyslNCcmJicmIyM1MzIWFxYWFRQGBwYGBwYmJyYmNTQ2NzY2NxEUFxYWFxYzMxUjAVYBAQoLDBUODldiGBYNCRETTEOPYhgWDQoREkxDAQEKDAoWDg7+MxEYGQMDjRsfHF1VT1ccHx8EAhofHFxVTlgdIB8E/vozEBgYAwONAP//ACr/+AISAucAIgFTAAAAAwK9Af8AAP//ACr/+AISAucAIgFTAAAAAwLCAcsAAP//ACr/+AISAucAIgFTAAAAAwLBAd4AAP//ACr/+AISAucAIgFTAAAAAwLAAd4AAP//ACr/+AISA3QAIgFTAAAAAwMbAcsAAP//ACr/OgISAucAIgFTAAAAIwLOAYwAAAADAsAB3gAA//8AKv/4AhIDdAAiAVMAAAADAxwBygAA//8AKv/4AhIDvwAiAVMAAAADAx0BywAA//8AKv/4AhIDhAAiAVMAAAADAx4BywAA//8AHf/4AhIC2gAiAVMAAAADAskBywAA//8AKv/4AhIC2gAiAVMAAAADArUB6gAA//8AKv/4AhIDfgAiAVMAAAADArkB6gAA//8AKv/4AhIDfgAiAVMAAAADArsB6gAA//8AKv86AhICBgAiAVMAAAADAs4BjAAA//8AKv/4AhIC5wAiAVMAAAADArwBhQAA//8AKv/4AhIDRgAiAVMAAAADAsgBtQAAAAIAKv/4AlsCMwAhADgAdkuwHlBYtQUBAQIBTBu1BQEBAwFMWUuwHlBYQB4IAQQCBIUAAQECYQcDAgICNE0ABQUAYgYBAAAsAE4bQCIIAQQCBIUHAQMDLk0AAQECYQACAjRNAAUFAGIGAQAALABOWUATAAAyMSclJCIAIQAhISEnHQkJGisBFAYHBgcWFhUUBgcGBgcRNCcmJicmIyM1MzIXMzI3NjY1AjMzFSMiJicmJjU0Njc2NjcRFBcWFhcCWwwQFiUIBgkRE0xDAQEKCwwVDg4/MC8kDQUC7BYODldiGBYNChESTEMBAQoMAjMlNBMZChxOPE9XHB8fBAEEMxEYGQMDjQgPBhEP/lKNGh8cXFVOWB0gHwT++jMQGBgD//8AKv/4AlsC5wAiAWQAAAADAr0B/wAA//8AKv86AlsCMwAiAWQAAAADAs4BjAAA//8AKv/4AlsC5wAiAWQAAAADArwBhQAA//8AKv/4AlsDRgAiAWQAAAADAsgBtQAA//8AKv/4AlsC5wAiAWQAAAADAsUCAAAA//8AKv/4AicC2gAiAVMAAAADAr4COwAA//8AKv/4AhIC5wAiAVMAAAADAsoBywAA//8AKv/4AhIC5gAiAVMAAAADAscBywAAAAIAKv88AhICBgAWAD4APkA7MQEDACcBBAMCTAAFAgACBQCAAAICAWEGAQEBNE0AAAAsTQADAwRiAAQEMAROPDs0MisoJCIhKhAHCRkrFyYmJyYmNTQ2NzY2MzMVIyIHBgYHBhUkFhUUBgcGBwYVFBYzMzI3FQcGIyInJjU0Njc1MzI3NjY3NjURFhYX5kNMExEJDRYYYlcODhUMCwoBAQEiCg0WER5NFBsLBAIYHhVIIRwZFA4WCgwKAQFDTBIGBB8fHFdPVV0cHxuNAwMZGBEzplhOVVwcFg0mLhASAVkCAhoWKBY2GYwDAxgYEDMBBgQfIAACABz/xAIUAkEAGgA0AHRAChoBAQIkAQAEAkxLsBZQWEAoAAYAAAZxAAMDAGEFAQAALE0AAQECYQcBAgI0TQAEBABiBQEAACwAThtAJwAGAAaGAAMDAGEFAQAALE0AAQECYQcBAgI0TQAEBABiBQEAACwATllACxoRMSIRMScZCAkeKwAXFhYVFAYHBgYHETQnJiYnJiMjNTMyFzczBwIzMxUjIicHIzcnJiY1NDY3NjY3ERQXFhYXAegHFg0JERNMQwEBCgsMFQ4OJBAhoTfVFg4OGygfoDgHFg0KERJMQwEBCgwB1wscXVVPVxwfHwQBBDMRGBkDA40BPGP+p40CNmUIHFxVTlgdIB8E/vozEBgYA///ABz/xAIUAucAIgFuAAAAAwK9Af8AAP//ACr/+AISAucAIgFTAAAAAwLFAgAAAP//ACr/+AISA4kAIgFTAAAAAwLGAgAAAAADACr/+AMwAgYAIgA0AEsBD0uwEVBYQBQSEAIAAR0BAggeAQIDAgNMAwEDSRtLsC5QWEAUEhACBgEdAQIIHgECAwIDTAMBA0kbQBQSEAIGAR0BAggeAQIDAgMBBAMETFlZS7ARUFhAJQAFAAgCBQhnBgEAAAFhCQcCAQE0TQoBAgIDYg0LDAQEAwMsA04bS7AuUFhAMAAFAAgCBQhnAAYGAWEJBwIBATRNAAAAAWEJBwIBATRNCgECAgNiDQsMBAQDAywDThtANAAFAAgCBQhnAAYGAWEJBwIBATRNAAAAAWEJBwIBATRNAAMDLE0KAQICBGINCwwDBAQyBE5ZWUAfNTUAADVLNUpJR0A/NDMtKyooJCMAIgAhFEghKg4JGisEJwYHETQnJiYnJiMjNTMyFzY3ERQWFxYXFjMyNzcVBgcGIwMzNCcmJiMjNTMyFhcWFhUVIwQmJyYmNTQ2NzY2NxEUFxYWFxYzMxUjAfk8J0ABAQoLDBUODmc0JjMGCwwZICRAHTMoRiMtIkYLBhQTDg5WXRYUCfT+i2IYFg0KERJMQwEBCgwKFg4OCB8WBgEDMxEYGQMDjR4TB/7UIh0HCAECAwSBDAQDATk4EAkFfxwgHFhYKN4aHxxcVU5YHSAfBP76MxAYGAMDjQACADn/OQIYAgUAIAAkAINLsCJQWEAKFAEBAgIBAwACTBtAChQBAQQCAQMAAkxZS7AiUFhAIQABAgACAQCAAAADAgADfgQBAgI0TQYBAwMyTQAFBTAFThtAJQABBAAEAQCAAAADBAADfgACAjRNAAQELk0GAQMDMk0ABQUwBU5ZQBAAACQjIiEAIAAfIywjBwkZKwQmJzUzMjY3Njc2NTQnJiYnJiMjNTY2MzIWFxYVFAcGIwEzESMBXi4UCxYTBQUBAQEBCQsOEQsUMSEoORIjIyNQ/re5uQcLEH8FCQsVDy8vDxYUAgJ/DwwaHTqTkjw6AgX9OwACADn/QwIYAucAAwAkAHJAChgBAwQGAQUCAkxLsDFQWEAlAAMEAgQDAoAAAgUEAgV+AAAALU0ABAQ0TQYBBQUyTQABATABThtAJQADBAIEAwKAAAIFBAIFfgAEBDRNBgEFBTJNAAEBAF8AAAAtAU5ZQA4EBAQkBCMjLCQREAcJGysTMxEjJCYnNTMyNjc2NzY1NCcmJicmIyM1NjYzMhYXFhUUBwYjObm5ASUuFAsWEwUFAQEBAQkLDhELEzAjKDkSIyMjUALn/Fy2CxB/BQkLFQ8vLw8WFAICfBENGh06k5I8OgACACr/OQIJAgUAIQAlAINLsCJQWEAKDAEBAB4BAwICTBtACgwBAQQeAQMCAkxZS7AiUFhAIQABAAIAAQKAAAIDAAIDfgQBAAA0TQYBAwMyTQAFBTAFThtAJQABBAIEAQKAAAIDBAIDfgAAADRNAAQELk0GAQMDMk0ABQUwBU5ZQBAAACUkIyIAIQAgLCMoBwkZKxYnJjU0Njc2NjMyFhcVIyIGBwYHBhUUFxYWFxYzMxUGBiMTMxEjcCIkERMROSghMRQLFhMFBQEBAQEKCw4QCxQuJJC5uQc6O5NLZB4dGgwPfwUJCxUPLy8PFRUCAn8QCwIF/TsAAAIAOQAAAZQCBgAHAAsAWUuwHlBYQAoAAQEABwEDAQJMG0AKAAEBAgcBAwECTFlLsB5QWEARAAEBAGECAQAANE0AAwMsA04bQBUAAgIuTQABAQBhAAAANE0AAwMsA05ZthETERIECRorATY2MxUiBgcnMxEjARwVOSotORLjubkB4RQRpwwPuv4C//8AOQAAAZgC5wAiAXYAAAADAr0BtQAA//8AJQAAAZQC5wAiAXYAAAADAsEBlAAA//8AOf6hAZQCBgAiAXYAAAADAtAA/wAA////0wAAAZQC2gAiAXYAAAADAskBgQAA//8AOQAAAZQC5wAiAXYAAAADAsoBgQAAAAMAI//4Ac8CBgAJACYAMACHS7AWUFhADggBAAEqAQUAKQEEBQNMG0AOCAEAASoBBQIpAQQFA0xZS7AWUFhAGgcCAgAAAWEDAQEBNE0ABQUEYggGAgQEMgROG0AhBwECAAUAAgWAAAAAAWEDAQEBNE0ABQUEYggGAgQEMgROWUAXJycAACcwJzAvKyYlGBcACQAJESIJCRgrACcmIyM1MhcXFQc0JicnJiYnJiY1NDc2NxUUFhcXFhYXFhUUBwYHIicnNRYXFjMzFQGgIT4mIUdAMpEKEGwoMQwMCDEpUwgVeBomDR0xK1F6PDkoRCYQIwF0BAaICgmA2A8IAg8GGhYTNihSJh4FnQ8JAxADDw8gW2AmIAIJCYAEBAKJAP//ACP/+AHPAucAIgF8AAAAAwK9AdIAAP//ACP/+AHPAucAIgF8AAAAAwLBAbEAAP//ACP/GwHPAgYAIgF8AAABBwLRAVj/2AAJsQMBuP/YsDUrAP//ACP/+AHPAucAIgF8AAAAAwLAAbEAAP//ACP+oQHPAgYAIgF8AAAAAwLQAV8AAAACADkAAAIpAu4ANQA9ADdANDsBAwQpAQECAkwAAgABAAIBaQADAwRhAAQELU0AAAAFYQYBBQUsBU49PDUzIikhLCAHCRsrJTMyNjc2NzY1NCcmJicmIyM1MzI2NzY2NTQnJiYjIgc1MzIXFhYVFAYHFRYXFhUUBgcGBiMjAzQ3NjY3ESMBHgwaFwYHAwIDAw4OCRoKChcXBgUCCwYUEQ0DEIk6GhY4PEAdIBIYGV1LIOUoFkc1uo0ECAgVGh0lExMSAgGNBQcHFhstDAYFAY00GEUvQkcLBAsnK1hAUhobGgInXS4YHAX9FQACABIAAAGjAucAEgAWACtAKAACAgFhAAEBLU0AAwMAXwAAAC5NAAQEBV8ABQUsBU4RERUxFhAGCRwrEzM1NDY3NjYzFSIHBgYHBhUVIRczESMSXhggHmpzNBAYGQID/uleubkB/gtVWBQTCoABAQwMDBa6KP63AAACABIAAAGZApIABwALAE5LsAlQWEAcAAEAAAFwAAMDAF8CAQAALk0ABAQFXwAFBSwFThtAGwABAAGFAAMDAF8CAQAALk0ABAQFXwAFBSwFTllACREREREREAYJHCsTMzUzFTMVIRczESMSXrlw/nleubkB/pSUjSj+twAAAgASAAABmQKSAAcAEwBzS7AJUFhAJwACAQECcAgBBAcBBQYEBWcAAAABXwoDAgEBLk0ACQkGXwAGBiwGThtAJgACAQKFCAEEBwEFBgQFZwAAAAFfCgMCAQEuTQAJCQZfAAYGLAZOWUAYAAATEhEQDw4NDAsKCQgABwAHERERCwkZKwEVITUzNTMVFTMVIxUjNSM1MzUzAZn+eV65WVm5V1e5Af6NjZSU9pVzc5VBAP//ABIAAAITAyQAIgGEAAAAAwK/AmAAAP//ABL/GwGZApIAIgGEAAABBwLRASX/2AAJsQIBuP/YsDUrAP//ABL+oQGZApIAIgGEAAAAAwLQATsAAP//ABL/OgGZApIAIgGEAAAAAwLOATsAAAACADf/+QIRAf4AEgAWAGxLsCJQWEAKCQEBABABAgECTBtACgkBAQAQAQQBAkxZS7AiUFhAFgABAAIAAQKAAwEAAC5NBAUCAgIyAk4bQBoAAQAEAAEEgAMBAAAuTQAEBCxNBQECAjICTllADwAAFhUUEwASABEnFQYJGCsWJyYmNREzFRQXFhcWFjMzFQYjEzMRI24fDgq5AQIEBBIXCic/kLm5BzcYRTIBP/E1ERkLCwV9HQIF/gL//wA3//kCEQLnACIBigAAAAMCvQIDAAD//wA3//kCEQLnACIBigAAAAMCwgHPAAD//wA3//kCEQLnACIBigAAAAMCwQHiAAD//wA3//kCEQLnACIBigAAAAMCwAHiAAD//wAh//kCEQLaACIBigAAAAMCyQHPAAD//wA3//kCEQLaACIBigAAAAMCtQHuAAD//wA3//kCEQOQACIBigAAAAMCtwHuAAD//wA3//kCEQORACIBigAAAAMCuAHuAAD//wA3//kCEQOQACIBigAAAAMCtgHuAAD//wA3//kCEQN+ACIBigAAAAMCuQHuAAD//wA3/zoCEQH+ACIBigAAAAMCzgGWAAD//wA3//kCEQLnACIBigAAAAMCvAGJAAD//wA3//kCEQNGACIBigAAAAMCyAG5AAAAAgA3//kCuQIzABAAIwBwQAohAQQAFQEBBAJMS7AiUFhAIAcBAwIDhQAEAAEABAGAAAAAAl8GAQICLk0FAQEBLAFOG0AkBwEDAgOFAAQAAQAEAYAAAAACXwYBAgIuTQABASxNAAUFMgVOWUASAAAeHRgWFBIAEAAQIRElCAkZKwEUBgcGBiMjESMRMzI3NjY1ABYzMxUGIyInJiY1ETMVFBcWFwK5DBATPjIJucIkDQUC/qkSFwonP1ofDgq5AQIEAjMlNBMWFf5kAf4PBhEP/mUFfR03GEUyAT/xNREZC///ADf/+QK5AucAIgGYAAAAAwK9AgMAAP//ADf/OgK5AjMAIgGYAAAAAwLOAZYAAP//ADf/+QK5AucAIgGYAAAAAwK8AYkAAP//ADf/+QK5A0YAIgGYAAAAAwLIAbkAAP//ADf/+QK5AucAIgGYAAAAAwLFAgQAAP//ADf/+QIrAtoAIgGKAAAAAwK+Aj8AAP//ADf/+QIRAucAIgGKAAAAAwLKAc8AAP//ADf/+QIRAuYAIgGKAAAAAwLHAc8AAAACADf/OAISAf4AEgArAIdLsCJQWEAPEAEAAiMEAgEAFQEDBgNMG0ATEAEAAgQBBAAVAQMGA0wjAQQBS1lLsCJQWEAfAAACAQIAAYAFAQICLk0EAQEBMk0ABgYDYQADAzADThtAIwAAAgQCAASABQECAi5NAAQELE0AAQEyTQAGBgNhAAMDMANOWUAKJxEWORUiIQcJHSs2FjMzFQYjIicmJjURMxUUFxYXADcVBwYjIicmNTQ2NyMRMxEGBwYVFBYzM/sSFwonP1ofDgq5AQIEARkCGB4VSCEcHxghuRcSFhQbC5gFfR03GEUyAT/xNREZC/7xAVkCAhoWKBg+GgH+/gIMFBYUEBIA//8AN//5AhEDQwAiAYoAAAADAsMBwQAA//8AN//5AhEC5wAiAYoAAAADAsUCBAAAAAIACgAAAh0B/gADAAgAF0AUAgEAAC5NAwEBASwBThESERAECRorEzMTIxM3MwMjCr2JsZQ0tpUMAf7+AgEO8P4CAAMADgAAA0AB/gADAAwAEQAjQCAABAQAXwYCAgAALk0HBQMDAQEsAU4REhERERIREAgJHisTMxMjEzczEyMnIwcjEzczAyMOtXmljD6VlKM7CjAL/SmzfwsB/v4CAR3h/gLj4wEb4/4CAP//AA4AAANAAucAIgGlAAAAAwK9AoIAAP//AA4AAANAAucAIgGlAAAAAwLAAmEAAP//AA4AAANAAtoAIgGlAAAAAwK1Am0AAP//AA4AAANAAucAIgGlAAAAAwK8AggAAAADAAcAAAIvAf4AAwAHAAsAHkAbCQcCAQABTAIBAAAuTQMBAQEsAU4UEhEQBAkaKxMzASMDNzMHBRcHIw3KAVjKJSq+if73XzC+Af7+AgGuUN06jVoAAAIAOf8yAhMB/gASACcARkBDCQEBABABAgEVAQUDA0wAAQACAAECgAQBAAAuTQYBAgIsTQADAwViBwEFBTYFThMTAAATJxMmIB8ZFgASABEnFQgJGCs2JyYmNREzFRQXFhcWFjMzFQYjFicnNTMyNzY2NzY1ETMRFAYHBgYjcB8OCrkBAgQEEhcKKD4RRjqGJCIYFwICuQ0XGmpcAzcYRTIBNec1ERoKCwV8HtEGBoECAg8SGBsB5/46UFgdISAA//8AOf8yAhMC5wAiAasAAAADAr0CCQAA//8AOf8yAhMC5wAiAasAAAADAsAB6AAA//8AOf8yAhMC2gAiAasAAAADArUB9AAA//8AOf6eAhMB/gAiAasAAAEHAs4Bn/9kAAmxAgG4/2SwNSsA//8AOf8yAhMC5wAiAasAAAADArwBjwAA//8AOf8yAhMDRgAiAasAAAADAsgBvwAA//8AOf8yAhMC5gAiAasAAAADAscB1QAA//8AOf8yAhMC5wAiAasAAAADAsUCCgAAAAIALQAAAekB/gAHAAsAK0AoBQEAAQABAgMCTAAAAAFfAAEBLk0AAwMCXwQBAgIsAk4RERIREQUJGys3NyM1IRUBIyUzFSEt1MgBrv6uaAEenv7kheyNhf6HjY3//wAtAAAB6QLnACIBtAAAAAMCvQHmAAD//wAtAAAB6QLnACIBtAAAAAMCwQHFAAD//wAtAAAB6QLaACIBtAAAAAMCugFoAAD//wA5/zICEwLnACIBqwAAAAMCvQIJAAD//wA5/zICEwLnACIBqwAAAAMCwAHoAAD//wA5/zICEwLaACIBqwAAAAMCtQH0AAD//wA5/zICEwLnACIBqwAAAAMCvAGPAAD//wA5/zICEwLmACIBqwAAAAMCxwHVAAD//wA5/zICEwLnACIBqwAAAAMCxQIKAAD//wAq//gBpwMHACIBAAAAAAMDFQGtAAD//wA5AAACEwMHACIBSgAAAAMDFQHZAAD//wAq//gCEgLnACIBUwAAAAMCvQH/AAD//wAj//gBzwMHACIBfAAAAAMDFQGkAAD//wAtAAAB6QMHACIBtAAAAAMDFQG4AAAAAwASAAADIQLnACUAKQAtAEFAPgoBCAEJAQgJgAsBCQmEBgEDBwEEAAMEaQUCAgABAQBXBQICAAABXwABAAFPLSwrKikoEzEWFTEWERESDAYfKwAVFTMVITUzNTQ2NzY2MxUiBwYGBwYVFTM1NDY3NjYzFSIHBgYHATMRIwEzESMCp3r88V4YIB5qczQQGBkCA8UYIB5qczQQGBkC/ca5uQF+ubkCQRYtjY0LVVgUEwqAAQEMDAwWLQtVWBQTCoABAQwM/vz+twFJ/rf//wASAAAEJQLnACIBwwAAAAMBKwMzAAD//wASAAAEJQLnACIBwwAAAAMBQgMzAAAABAASAAACpwLnABQAGAAcACAAcEuwEVBYQCQGAQICAWEFAQEBLU0ABAQAXwcDAgAALk0ACQkIXwoBCAgsCE4bQC4AAgIBYQUBAQEtTQAGBgFhBQEBAS1NAAQEAF8HAwIAAC5NAAkJCF8KAQgILAhOWUAQIB8eHRERERERFTEWEAsJHysTMzU0Njc2NjMVIgcGBgcGFRUzFSEBMxUjFTMRIwEzESMSXhggHmpzNBAYGQIDev5vAdy5ubm5/oK5uQH+C1VYFBMKgAEBDAwMFi2NAXaQWf4CAUn+twADABIAAAKnAucAFAAYABwAMUAuAAICAWEFAQEBLU0ABAQAXwMBAAAuTQAHBwZfCAEGBiwGThERERERFTEWEAkJHysTMzU0Njc2NjMVIgcGBgcGFRUzFSEBMxEjATMRIxJeGCAeanM0EBgZAgN6/m8B3Lm5/oK5uQH+C1VYFBMKgAEBDAwMFi2NAXb9GQFJ/rcAAAIAIwE4AXkCuAAWADAAe0AKDAEAAS0BAgUCTEuwLlBYQCYABQQCBAUCgAcGAgIChAABAAADAQBnAAMEBANZAAMDBGEABAMEURtALAAFBAIEBQKAAAIGBAIGfgcBBgaEAAEAAAMBAGcAAwQEA1kAAwMEYQAEAwRRWUAPFxcXMBcvGBE4FiJWCAocKxM0JicmJyYjIg8CNTYzMhYXFhYVFSMGJjU0Njc2NjMyFxUiBwYVBhUUFhYzFQYGI/IDBwUUCyUKHhknQVQ7RxIQCYefMAsMDCwkESYRBRABBBATECAXAiQTEAQDAgECAQJfDRMTETcv3gU3OiQtDAwKAkABAgsFDhAMBk4KBwAAAgAqATkBjgK5ABQAKwAyQC8jAQQAAUwDAQEAAAQBAGkABAICBFkABAQCYgYFAgIEAlIVFRUrFSoXGxoiFAcKGysBJiYnJiMjNTMyFhcWFhUUBgcGBgcGJicmJjU0Njc2NjcVFBcUFhcWMzMVIwEFAQgIDAwEBEBHEhAJBwwOODBpRxERCQgMDjYxAQgJCg0EBAIpEhIDAmcUFxVDPjo+FRcXAwEUFhVCPjhAFRcYA78lCxISAgJnAAIAMgEIAbkClQAUABgAZEuwLlBYtQoBAAEBTBu1CgEAAwFMWUuwLlBYQBsAAAECAQACgAMBAQACAVkDAQEBAl8EAQIBAk8bQB8AAAMCAwACgAABAwIBWQADAAIDVwADAwJfBAECAwJPWbcRERUkFwUKGysBNCc0JicmJiMjNTY2MzIXFhYVFSMDMxEjARwBAgIEDxAIETYXRBkLB53qnZ0BtykNBBMFCARqCgwqEzMo9QGI/ngAAgACAAACrQKwAAQACgAjQCACAQIAAUwDAQAAF00AAgIBXwQBAQEYAU4RERESEAUHGysTMxMDIyUzAzMTId0RT3PIAR2Vmbfb/kgCsP7u/mKaAhb9UAACAC8AAAKLArgAHgAzADVAMisBAAENAQIAMSEZAAQDAgNMAAAAAWEAAQEXTQQBAgIDXwUBAwMYA04zMhERGjIqBgcbKyU2Njc2NTQmJyYmIyIHNTYzMhYXFhYVFAYHFTczFSElMxc1JiY1NDY3NjY3ERQXFhYXFSEBiRAUBgwECAknJigQIhZneR8dEklAeRD+/v6mEHlBSA0UFVJEDAYUEP7+lAQUFS1+Rz0REQ0GnQIjJyNvXGWCHQclmpolBx2BZlBmIyYsCP65fi0VFASUAAACADf/QwIRAf4ADwATADJALwQBAQALAQQBDQECBANMAAEABAABBIADAQAAGU0ABAQYTQACAhsCThERFCcQBQcbKxMzFRQXFhcWFjMzFQYHFSMBMxEjN7kBAgQEEhcKGCa5ASG5uQH+8TURGQsLBX4TBboCu/4CAAADADkAAAIVAf4AAwAHAAsAJkAjBAECAQMBAgOAAAEBAF8AAAAZTQUBAwMYA04RERERERAGBxwrEyEVIRUzESMBMxEjOQHc/iS5uQEjubkB/o0o/rcBSf63AP//ADL/WwG5AOgBBwHKAAD+UwAJsQACuP5TsDUrAAACAC//+AJlArgAGQA0ADVAMiUBAAEwCQICABkBAwIDTAAAAAFhAAEBMU0AAgIDYQQBAwMyA04aGho0GjEuLEImBQkYKwE0JyYnJiYjIgc1NjMzMhYXFhYVFAYHBgYHBiYnJiY1NDY3NjY3ERQXFhcWFjMzMjcVBiMjAZkBAgYHHSIPFgYME2lyGxkMCRIUU0q3cxsZDAkSFFNKAQIHBxwiFAcKBgwTAVhXGyoREQkCmgEjKCV4eGxwJiorBgMjKSV2eWxwJiorBv6jVhsoFBEJApoBAAEACgAAAVECsAAGABtAGAIBAAMBAAFMAAAAK00AAQEsAU4REwIJGCsTBzU3MxEjiX/ChcgB5zCcXf1QAAMALwAAAjUCuwAIACkALQAyQC8AAQEACAMCBAECTAABAQBhAgEAADFNAAQEA2AFAQMDLANOLSwrKikoGBciEQYJGCsTNhcVJiMiBwcDNDY3NjY3NzY2NzY2NTUWFhcWFRQHBgcHBgYHBgYVFSM3IRUhPX+HEzwxSD4OCA0OMyx1FiAGBwQwRRk6IB5EjhIXBQUCwesBG/7lAp8cA5wDCAj+VkFQHR8tEi8JDwcHExLMAxETLW9gLy0ZNwcMBgYUF56cnAADAC//+AIzArgACgApADQAS0BIGgQAAwEACgUCAwEgAQIDLQEEAjIsKQMFBAVMAAMAAgQDAmcAAQEAYQAAADFNAAQEBWEGAQUFMgVOKioqNCozMS4hJjMhBwkaKxM2MzIXFSYjIgcHATQmJyYjIzUzMjY3NjY1NRYWFRQGBxUWFxYVFAcGBwYmJzUWMzI3FQYjM3ZsFwsYKRkufAE0BwkPNG5uGh4ICAVsYDk+QRwgKC52g44neV8WIAoYAqAYAZsDAgz+vhYZBwqZBAYGFRbRC1dPSUoPBA8gJlBUKzEMBA8Jjw4CmgEAAgAeAAACdQKwAAQAEAAvQCwAAQEDAUwFAQMGAgIBBwMBaAAAACtNAAQEB18ABwcsB04REREREREREQgJHisTEzMBIyEjNzM3MxUzFSMVIx7g2v7JgwE/jFY3S3hUVMQBDQGj/dWZiYmZhQAAAwBB//gCRQKwABsAHwAqAEJAPw0BAAInIwoDBQAiGwIGBQNMAAIAAAUCAGoABAQBXwMBAQErTQAFBQZhBwEGBjIGTiAgICogKCURGzIUJQgJHCslNCYnJiYjIgcGBxEzFTc2MzIXFhYVFAYHBgYHAzMVIwImJzUWMzI3FQYjAXkHCwsmJEJKLw6pIUUddzEWEhIWFlE9Xfb2Oncqc1UvFxAg1xobBwcFBgQBAZz+AwM5Gks0O1AcHCEGArSb/eMOCo8NApsBAAADAC//+AJnArgADAAoAEAAS0BIGgsCAAEMBQIFADIBBAUxJAICBEABAwIFTAAFAAQCBQRpAAAAAWEAAQExTQACAgNhBgEDAzIDTg0NNTMwLg0oDSUiIDMhBwkYKwEmIyIGBzU2MzIWFxUAJicmJicmNTQ2NzY2NxEUFhcWFjMzMjcVBiMjNzQmJyYmIyIHNTYzMhYXFhYVFAYHBgYHAglnHyQsDg8fPYEw/tJVHiIrDBgSFhZOQAkKCRscGQgMBgwTTwgJCR8eGBEsPjpMGhwcEhQWTDoCFgkFCKUBDgqP/ecICwwwJkmiYH0nKCgH/isdHggHAwKaAd8ZHQcHBAOHFQ0UFlRDPlQcHCAFAAACAB8AAAIiArAABAAIAEi1AgEBAAFMS7AcUFhAFQABAQBfAAAAK00AAgIuTQADAywDThtAGAACAQMBAgOAAAEBAF8AAAArTQADAywDTlm2ERESEAQJGisTIRUHIQUzAyMfAgMG/gMBG9DW2wKwjQ4o/hMAAAEAL//4AnUCuABWAEtASBABAQImAQABMggCAwBSAQQDPAEFBAVMAAAAAwQAA2kAAQECYQACAjFNAAQEBWEGAQUFMgVOAAAAVgBTUE5EQisnJCIYFgcJFisWJyYmNTQ3Njc1JiY1NDc2NxUUFhcWFjMyNjc2NjU0JicmJiMjIgc1NjMzMhcWFhUUBgcVFhcWFRQGBwYHNTQmJyYmIyIGBwYGFRQWFxYWMzMyNxUGIyOqQh8aIBxBPjksMm4FCQgeHR0eCQgFBQgIHh4VCAoGDRSgQSAcOT5BHCATFjBzCAkJHx4eHwkJCAcKCSAdGQgMBw8XCDMYRTBQJiAPBA9KSVIoLQrRGRkGBgUFBgYZGRgaBwcEApIBLhdBL0lKDwQPICZQKT8XMgvTGR0HBwQEBwcdGRgbBwcFApIBAAADAC//+AJnArgAGQAxADwAUEBNJQEAAS4JAgIALwEDAjs1AgQDNBkCBQQFTAACBgEDBAIDaQAAAAFhAAEBMU0ABAQFYQcBBQUyBU4yMhoaMjwyPDk3GjEaMC0rQyUICRgrATQmJyYmIyMiBzU2MzMyFhcWFhUUBgcGBgcmJicmJjU0Njc2NjcVFBYXFhYzMjcVBiMSJic1FhYzMjY3FQGbCQoJGR4ZCAwGDBNjax8gGhEWFk9AzkwZHB0SFRVKPAgJCSAdGRAsPh+YOTBzGyQsDgHSHR8IBwICmgEVISOLfGF7JygpB/sOFBZTQz5VHBwfBdwZHAcHBQOHFf8ADQuPBQkFCKX//wAv//gCZQK4AAIB0AAA//8ACgAAAVECsAACAdEAAP//AC8AAAI1ArsAAgHSAAD//wAv//gCMwK4AAIB0wAA//8AHgAAAnUCsAACAdQAAP//AEH/+AJFArAAAgHVAAD//wAv//gCZwK4AAIB1gAA//8AHwAAAiICsAACAdcAAP//AC//+AJ1ArgAAgHYAAD//wAv//gCZwK4AAIB2QAAAAIAL//4AmUCDAAYADIAOEA1IwEAAS4JAgIAGAEDAgNMAAEAAAIBAGkAAgMDAlkAAgIDYQQBAwIDURkZGTIZLywqQiYFBhgrJTQnJicmJiMiBzU2MzMyFhcWFhUUBwYGBwYmJyYmNTQ3NjY3FRQXFhcWFjMzMjcVBiMjAZkBAgYHHSIPFgYME2lyGxcOGxRTSrdzGxgNGxRTSgECBwccIhQHCgYME+kaGyoREQkCmgEjKCNkOHM5KisGAyMpI2I5czkqKwbvGBsoFBEJApoBAAABAAoAAAFRAgQACAAZQBYCAQADAQABTAAAAQCFAAEBdhEVAgYYKxMHNTY2NzMRI4l/KosNhcgBOzCcFUMF/fwAAwAvAAACFwIMAAwAJwArADVAMgABAQAMAwIEAQJMAgEAAAEEAAFpAAQDAwRXAAQEA18FAQMEA08rKikoJyYaGTIRBgYYKxM2MxUmJiMiBgcHBgcDNDY3Nz4CNzY2NTUyFhUUBgYHBw4CFRUjNzMVIz19awwaFRYyCR4YJg45SVcHIBEEBwRjZRg3M4QQDgPB6/PzAfMZnAIBBAEDAgb+8lFdICUDDgkFBxMSeENANUMuEzEGEB8lRH19AAADAC//dAILAgwADAAsADgATEBJHAACAQAMBAIDASIBAgMwAQQCLywCBQQFTAAAAAEDAAFnAAMAAgQDAmcABAUFBFkABAQFYQYBBQQFUS0tLTgtNTQxISkyEgcGGisTNjYXFSYjIgcGBgcHATQmJyYjIzUzMjY3NjY1NRYWFRQGBxUWFxYWFRQHBgcGJic1FjMyNxUGIyMzM3cyGBUZLhofCSYBDAcJDzRaWhoeCAgFbGA4P0EcEg4oLnaMUzFXUxYmBw0VAfQLDQGbAwICBAEF/tIWGQcKmQQGBhUWvQtXT0E+DwQPIBUmJ1QrMQwECw2PDgKaAQACAB7/ewJNAisABAAQADdANAABAQMBTAAABACFAAQDBIUABwEHhgUBAwEBA1cFAQMDAV8GAgIBAwFPEREREREREREIBh4rNxMzASMhIzczNzMVMxUjFSMezNr+3YMBF2RRGUZ4VFTEiAGj/dWZiYmZhQADAEH/dAIdAgQAGwAfACsAqkARDAEAAicjCQMGACIbAgcGA0xLsAlQWEAjBAEBAAUCAQVnAwECAAAGAgBpAAYHBwZZAAYGB2EIAQcGB1EbS7AKUFhAKgADBQIFAwKABAEBAAUDAQVnAAIAAAYCAGkABgcHBlkABgYHYQgBBwYHURtAIwQBAQAFAgEFZwMBAgAABgIAaQAGBwcGWQAGBgdhCAEHBgdRWVlAECAgICsgKCURGyESFCQJBh0rJTQmJyYjIgcGBxEzFTcyNjMyFxYWFRQGBwYGBwMzFSMCJic1FjMyNxUGIyMBUQcLEi8uSi8OlSEKJh53MRcREhYWUT1J6+spdSlkUR8SBw0BPxobBwwGBAEBiOoDAzkbOTE7UBwcIQYCjJv+Cw4Kjw4DmwEAAwAv//cCPwKTAAsAJAA8AEtASB4KAgABCwQCBAA2NQ4DAgQtDwIDAgRMAAQAAgAEAoAAAQAABAEAaQUBAgMDAlkFAQICA2EAAwIDUQ0MOjgSEAwkDSMyIQYGGCsAJiMiBzU2MzIWFxUDMjcVBiMiJyYnJiY1NDY3NjY3ERQWFxYzNhYVFAYHBgYHNTQmJyYmIwc1NjYzMhYXAfh4JSMTDxUpei3aCAwSFE44ShYMDBIWFk5ACQoNH+saERUVTToICQkoAhQQLhgsRxkB8QkNpQEOCo/+pQKaAhQaSCheQGB9JygoB/5QHR4ICspBQTxEHRwgBbcZHQcHBAOHCQwOEwAAAgAf/3oB+gIEAAQACAAsQCkCAQEAAUwAAgEDAQIDgAADA4QAAAEBAFcAAAABXwABAAFPERESEAQGGisTIRUHIRczAyMfAdsG/ivz0J7bAgSNDij+OQABAC//+AJNApAAOgBKQEcdDAIBAhwBAAElBQIDADcBBAMsAQUEBUwAAgABAAIBaQAAAAMEAANpAAQFBQRZAAQEBWEGAQUEBVEAAAA6ADgjLyMoLwcGGysWJjU0Njc1JiY1NDY3FRQWMzI2NjU0JicmJiMiBzU2MzIWFRQGBxUWFhUUBgc1NCYjIgYVFDMyNxUGI76POkM9OmZmFyYaGQoFCAgQDhILCR5xhDo9QjtnZRopKBssJQsHDwhQZj5ODwQOSUFPTwnHIxYIGBkWEgcHBAKSAVFaQUkOBA9NP1ZSCsklGRgmPAKSAQADAC//cAI/AgwAGAAwADwAREBBLBICAAEdHBEDAgA8NQIDAjsIAgQDBEwAAgADAAIDgAABAAACAQBpAAMEBANZAAMDBGEABAMEUTk2NDIqIz0FBhkrABYVFAYHBgYHETQmJyYjIyIHNTYzMhcWFwQWMzcVBgYjIiYnJiY1NDY3NjY3FRQWFwIWMzI3FQYjIiYnNQIzDBIWFk5ACQoNHwUIDBIUTjhKFv7kKAIUEC4YLEcZHhoRFRVNOggJjHglIxMPFSl6LQFuXUFgfScoKAcBsB0eCAoCmgIUGkiJBAOHCQwOExdBQTxEHRwgBbcZHQf+/gkNpQEOCo///wA5//gCbwK4AAIB0AoAAAIAXwAAAl0CsAAHAAsALEApAgEAAwEAAUwAAAEAhQABAgGFAAIDAwJXAAICA18AAwIDTxERERQEBhorAQc1NzczESMHIRUhAQGevSSFyKIB/v4CAecwmVEP/hEomf//AE4AAAJUArsAAgHSHwD//wBN//gCUQK4AAIB0x4A//8AKwAAAoICsAACAdQNAP//AF3/+AJhArAAAgHVHAD//wA3//gCbwK4AAIB1ggA//8AUgAAAlUCsAACAdczAP//ADH/+AJ3ArgAAgHYAgD//wA2//gCbgK4AAIB2QcAAAEAL//4AmUCDAAwAD5AOyABBAUpAQMEEQEBAAcBAgEETAAFAAQDBQRpAAMAAAEDAGcAAQICAVkAAQECYQACAQJRQiQbQyQYBgYcKwAWFRQHBgYHNSMWFxYWMzMyNxUGIyMiJicmJjU0NzY2NxUzJicmJiMiBzU2MzMyFhcCVw4bFFNKmgIEBxwiFAcKBgwTaHMbGA0bFFNKmgEEBx0iDxYGDBNpchsBnmQ4czkqKwbLEAsRCQKaASMpI2I5czkqKwbGCwsRCQKaASMo//8AOf/4Am8CDAACAeQKAAACAGYAAAJZAgQABgAKACxAKQIBAAMBAAFMAAABAIUAAQIBhQACAwMCVwACAgNfAAMCA08RERETBAYaKwEHNTczESMHIRUhAQSe4YXIngHz/g0BRTCZVv6pKIUA//8AYgAAAkoCDAACAeYzAP//AGX/dAJBAgwAAgHnNgD//wA7/3sCagIrAAIB6B0A//8AbP90AkgCBAACAekrAP//AEv/9wJbApMAAgHqHAD//wBh/3oCPAIEAAIB60IA//8ARf/4AmMCkAACAewWAP//AE3/cAJdAgwAAgHtHgAAAQA0//gCYAK4ADUAQUA+CwEBAhUOAgABJQEFBANMAAIAAQACAWkAAAADBAADZwAEBQUEWQAEBAVhBgEFBAVRAAAANQAyNhxCJRwHBhsrFiYnJiY1NDY3NjY3ETMnJiYnJiMiBzU2MzMyFhcWFhUUBgcGBgcRIxQXFhYXFjMzMjcVBiMj5HEaGQwJEhRSS5QDAxAOEhQQEAULEGZxGxgMCRIUUkuUAwMQDg4YEQoFBQsQCCQoJXZ5bHEmKioG/utIGRkDAgKaASMoJXh4bHEmKioGARQtGhkZAgMBmQH//wAe/zwBWwDBAQcCIgAA/agACbEAArj9qLA1KwD//wAe/0YA2wC8AQcCIwAA/agACbEAAbj9qLA1KwD//wAm/0YBSQDEAQcCJAAA/agACbEAA7j9qLA1KwD//wAt/z4BUADEAQcCJQAA/agACbEAA7j9qLA1KwD//wAT/0ABYwC8AQcCJgAA/agACbEAArj9qLA1KwD//wAp/zwBSgC8AQcCJwAA/agACbEAA7j9qLA1KwD//wAe/zwBYADBAQcCKAAA/agACbEAA7j9qLA1KwD//wAT/0ABNAC8AQcCKQAA/agACbEAArj9qLA1KwD//wAd/zwBZwDBAQcCKgAA/agACbEAAbj9qLA1KwD//wAa/zwBXADBAQcCKwAA/agACbEAA7j9qLA1KwD//wAe//YBWwF7AQcCIgAA/mIACbEAArj+YrA1KwD//wAeAAAA2wF2AQcCIwAA/mIACbEAAbj+YrA1KwD//wAmAAABSQF+AQcCJAAA/mIACbEAA7j+YrA1KwD//wAt//gBUAF+AQcCJQAA/mIACbEAA7j+YrA1KwD//wATAAABYwF8AQcCJgAA/mgACbEAArj+aLA1KwD//wAp//YBSgF2AQcCJwAA/mIACbEAA7j+YrA1KwD//wAe//YBYAF7AQcCKAAA/mIACbEAA7j+YrA1KwD//wATAAABNAF8AQcCKQAA/mgACbEAArj+aLA1KwD//wAd//YBZwF7AQcCKgAA/mIACbEAAbj+YrA1KwD//wAa//YBXAF7AQcCKwAA/mIACbEAA7j+YrA1KwD//wAeATABWwK1AQYCIgCcAAmxAAK4/5ywNSsA//8AHgE6ANsCsAEGAiMAnAAJsQABuP+csDUrAP//ACYBOgFJArgBBgIkAJwACbEAA7j/nLA1KwD//wAtATIBUAK4AQYCJQCcAAmxAAO4/5ywNSsA//8AEwE0AWMCsAEGAiYAnAAJsQACuP+csDUrAP//ACkBMAFKArABBgInAJwACbEAA7j/nLA1KwD//wAeATABYAK1AQYCKACcAAmxAAO4/5ywNSsA//8AEwE0ATQCsAEGAikAnAAJsQACuP+csDUrAP//AB0BMAFnArUBBgIqAJwACbEAAbj/nLA1KwD//wAaATABXAK1AQYCKwCcAAmxAAO4/5ywNSsAAAIAHgGUAVsDGQAPAB8AKUAmAAAAAWEDAQEBPU0ABAQCYgYFAgICPgJOEBAQHxAeFBcWIhMHChsrEzQmJiMjNTMyFhYVFAYGBwYmJjU0NjY3FRQWFjMzFSPlBA8WAwNMPxQPMTZ1PxMPMDcEDxUEBAJXOSgKVxpMXFRMIAIBGkxdVEsfA8E7KApWAAEAHgGeANsDFAAGABtAGAIBAAMBAAFMAAAAO00AAQE8AU4REwIKGCsTBzU3MxEjYUNuT3oClhljNP6KAAMAJgGeAUkDHAAYACIAJgAtQCoZAQMAIgEEAwJMAAMDAGECAQAAPU0ABAQBYAUBAQE8AU4RFCETGxsGChwrEzQ2NzY2Nzc2NjU1FhcWFRQGBwcGBhUVIxM2NzcVIyIHBgcXMxUjJgUHCBwaPhYLPBsjIydLDwh3Bx8uMBMjIxgMlYeHAdsiLRASGQkYCAsPdAISGEM1NQwXBQoOZQFxBQUDYQUEAa5lAAMALQGWAVADHAAIACEAKwBLQEgAAQEACAEDARkBAgMmAQQCJSECBQQFTBMBAEoAAwACBAMCaQABAQBhAAAAPU0ABAQFYQYBBQU+BU4iIiIrIisqKCElISEHChorEzY3NxUjIgcHFzQmIyM1MzI2NTUWFhUUBgcVFhYVFAcGBwYnJic1FxYzMxUvMB4uDS8cJKQMGENDFgtDORodHR4ZHEhOMBkPKiAtCgMPCAIDYQQEnxQKUQkTfAUyLyMoDAQJKCUyGRwGAQYEA1wEBGEAAgATAZgBYwMUAAQAEABbtQABAQMBTEuwEVBYQB0ABAADAwRyBQEDBgICAQcDAWgAAAA7TQAHBzwHThtAHgAEAAMABAOABQEDBgICAQcDAWgAAAA7TQAHBzwHTllACxERERERERERCAoeKxM3MwMjMyM3MzczFTMVIxUjE3h9rkeyQTEUJEosLHICLOj+zFZMTFZIAAMAKQGUAUoDFAARABUAHgBCQD8JAQACHBgGAwUAFxECBgUDTAACAAAFAgBqAAQEAV8DAQEBO00ABQUGYQcBBgY+Bk4WFhYeFh0kERYiEiMIChwrEzQmJiMiBzUzFTYzMhYVFAYHAzMVIwInNRYzMjcVI9UJGBo2N2QeJUMzMUQfeHhKQ0gpFwgPAhEREAUF4owDOTs/PAYBflf+1wxQBgFXAAMAHgGUAWADGQAJABsAKQBGQEMTCAIAAQkDAgUAIQEEBSkBAwIETAAFAAQCBQRpAAAAAWEAAQE9TQACAgNhBgEDAz4DTgoKJCIgHgobChoZFyIgBwoYKxIjIgc1MzIWFxUCJicmNTQ3NjY3ERQWFjMzFSM3NCYjIzU2MzIWFRQGB/sdEhQRGUgeyUMRDQ4LMioJERQLBywRHwkSG0A7L0ACwgJZBgZS/tkZKSBgUScgIwX+/BQSBFR7Gg5PBS5EQDwHAAACABMBmAE0AxQAAwAHAB9AHAABAQBfAAAAO00AAgIDXwADAzwDThERERAEChorEyEVIRczAyMTASH+35d3boADFFcl/wAAAQAdAZQBZwMZADQAQ0BADAEBAiAFAgMAJwEFBANMAAAAAwQAA2kAAQECYQACAj1NAAQEBWEGAQUFPgVOAAAANAAzMjAsKhsZFxYSEAcKFisSJjU0Njc1JiY1NDY3FRQWFjMyNjU0JiMjNTMyFhUUBgcVFhYVFAYHNTQmIyIGFRQWMzMVI2NGIiQiITVABhIVHg8PHggIWkcgIiQiM0IRHx8REh4MDAGUNDYrKAgDByooLTAFdhEPBQwZGQ1SMDQoKgcDCCgrLzMGdhoODhoZDVIAAwAaAZQBXAMZABEAHwApAEtASBcBAAEdAQMCJyMCBAMiEQIFBARMAAIGAQMEAgNpAAAAAWEAAQE9TQAEBAVhBwEFBT4FTiAgEhIgKSAoJiQSHxIeHBohIwgKGCsTNCYmIyM1MzIWFxYVFAcGBgcmJjU0NjcVFBYzMxUGIxYmJzUWMzI3FSPnCREUCwdGQxENDgsyKpI7L0ARHwkSGwNIHk0dEhQRApsUEgRUGSkgYFEnICMFiy5EQDwHeRoOTwWOBgZSBwJZAAAB/8QAAAH6ArAAAwATQBAAAAArTQABASwBThEQAgkYKwEzASMBhXX+P3UCsP1QAAAFAB4AAAL+ArAABgAKACMALQAxAE2xBmREQEICAQADBAAkAQEELQEIBwNMAgEAAAEHAAFnBgEEAAcIBAdqAAgDAwhXAAgIA2AJBQIDCANQMTAUIRMbHBERERMKCR8rsQYARBMHNTczESMBMwEjJTQ2NzY2Nzc2NjU1FhcWFRQGBwcGBhUVIxM2NzcVIyIHBgcXMxUjYUNuT3oBq3X+P3UBkAUHCBwaPhcKPBsjIydLDwh3Bx8uMBMjIxgMlYeHAjIZYzT+igF2/VA9Ii0QEhkJGAkKD3QCEhlCNTUMFwUKDmUBcQUFA2EFBAGuZQAABAAeAAAC2AKwAAYACgAPABsAVLEGZERASQIBAAMEAAsBBQcCTAAEAQUEVwIBAAABCAABZwAIBwMIVwkBBwoGAgUDBwVnAAgIA18LAQMIA08bGhkYFxYREREREhERERMMCR8rsQYARBMHNTczESMBMwEjJTczAyMzIzczNzMVMxUjFSNhQ25PegGrdf4/dQE+e4a9RKo9OxAwOi0teAIyGWM0/ooBdv1QleX+yWFJSWFDAAYALQAAAyUCuAAIACEAJQAvADQAQAFpsQZkREuwClBYQB8AAQEACAEDARkBAgMqAQYCKSECBwYwAQkLBkwTAQBKG0uwJlBYQB8AAQEACAEDARkBAgMqAQYCKSECBwgwAQkLBkwTAQBKG0AfAAEBBAgBAwEZAQIDKgEGAikhAgcIMAEJCwZMEwEASllZS7AKUFhANwQBAAABAwABaQADAAIGAwJpCAEGEAEHDAYHagAMCwUMVw0BCw4KAgkFCwlnAAwMBV8PAQUMBU8bS7AmUFhAPAQBAAABAwABaQADAAIGAwJpAAgHCQhXAAYQAQcMBgdpAAwLBQxXDQELDgoCCQULCWcADAwFXw8BBQwFTxtAQwAEAAEABAGAAAAAAQMAAWkAAwACBgMCaQAIBwkIVwAGEAEHDAYHaQAMCwUMVw0BCw4KAgkFCwlnAAwMBV8PAQUMBU9ZWUAjJiZAPz49PDs6OTg3NjU0MzIxJi8mLy4sJSQjIiElIRIRCRorsQYARBM2NzcVIyIHBxc0JiMjNTMyNjU1FhYVFAYHFRYWFRQHBgcBMwEjAicmJzUXFjMzFQU3MwMjMyM3MzczFTMVIxUjLyEtLg0vHCSkDBhDQxYLQzkaHR0eGRxIAYZ1/j91EzAZDyogLQoBKHuGvUSqPTsQMDotLXgCqwYEA2EEBJ8UClEJE3wFMi8jKAwECSglMhkcBgF9/VABMgYEA1wEBGGd5f7JYUlJYUMAAQBAAAABCgCjAAMAE0AQAAAAAV8AAQEsAU4REAIJGCs3MxUjQMrKo6MAAQBA/2MBCgCjABEAHEAZAAAAAwADZQACAgFfAAEBLAFOFhEWEAQJGisXMjY3NjY1NSM1MxUUBgcGBiNAGB0HBwVIyg0UFU9FVAcICBgWD6N7P0cVFhQAAAIAQAAAAQoB/gADAAcAH0AcAAEBAF8AAAAuTQACAgNfAAMDLANOEREREAQJGisTMxUjFTMVI0DKysrKAf6juKMAAAIAQP9jAQoB/gADABUAKEAlAAIABQIFZQABAQBfAAAALk0ABAQDXwADAywDThYRFhEREAYJHCsTMxUjETI2NzY2NTUjNTMVFAYHBgYjQMrKGB0HBwVIyg0UFU9FAf6j/lEHCAgYFg+jez9HFRYUAAADAEAAAAOeAKMAAwAHAAsAG0AYBAICAAABXwUDAgEBLAFOEREREREQBgkcKzczFSMlMxUjJTMVI0DKygFKysoBSsrKo6Ojo6OjAAIAUAAAAS8CsAAOABIAJkAjCQUCAQABTAABAQBfAAAAK00AAgIDXwADAywDThERFhYECRorEyYvAzUzFQ8EIwczFSNkAwQHBALfAQUGCBSPHsrKAb8YNUQ1HA8PHDVETclTowACADz/TgEbAf4AAwASAEO2DwQCAwIBTEuwGFBYQBUAAQEAXwAAAC5NAAICA18AAwMwA04bQBIAAgADAgNjAAEBAF8AAAAuAU5ZthYXERAECRorEzMVIwM/AjY3NzMfBBUjRsrKCgIEBwQDFI8UCAYFAd8B/qP+Ahw1RTIayclMRTUcDwADACMAAAHXArgAIAArAC8AOkA3IQEDACscAgEDAkwAAQMEAwEEgAADAwBhAgEAADFNAAQEBV8ABQUsBU4vLi0sKSUkIyAfHAYJFysTNDc2Njc2Njc2NjU1FhYXFhUUBwYGBwcGBgcGFQYVFSMDNjc3FSYjIyIHBxMzFSODGgsbGBAXBQUDLUYaOxoLIBcyDAoCAwGqYDBFTQULFCs+NVHKygE3QBwLDAgFCgYGEA7NAQ8TLGtRJRATCBEEBgYHCwgZEwGtCgYEmQEGBv6QowAAAwAy/0YB5gH+AAMAIQAsAGdACygSAgQCKQEDBAJMS7AmUFhAHwACAQQBAgSAAAEBAF8AAAAuTQAEBANiBQYCAwMwA04bQBwAAgEEAQIEgAAEBQYCAwQDZgABAQBfAAAALgFOWUARBAQsKyYiBCEEIRQTERAHCRgrEzMVIxImJyY1NDc2Njc3NjY3NzUzFRQHBgYHBgYHBgYVFTcWMzMyNzcVBwYHy8rKAUUZPBoLIBcyDAoDA6oaCxsYEBcFBQMqBQwTPyk2OU47Af6j/ewPEyxrUSUQEwgRBQYGEjNBQRoLDQgFCgYGEA7NmgEEBJAHCQEAAAEAQADaAQoBfQADABhAFQAAAQEAVwAAAAFfAAEAAU8REAIJGCsTMxUjQMrKAX2jAAEASwDZAUgB1gAXAB5AGwAAAQEAWQAAAAFhAgEBAAFRAAAAFwAWKgMJFys2JicmJjU0Njc2NjMyFhcWFhUUBgcGBiOaMQwMBgYMDDAvMDMMCwYGCww0L9kKDAwsLzAuDA0JCQ0MLjAvLAwMCgAAAQAqAUABnAKwABEAJUAiDw4NDAsKCQYFBAMCAQ0BAAFMAAEBAF8AAAArAU4YFwIJGCsTByc3JzcXJzMHNxcHFwcnFyPAZy9yci9nDF4MZy9zcy9nDF4Bu0lSMzVSSXt6SFI1M1JJewACAC8AAAKNArAAEwAnAJ5LsCBQWEA2CQEHAAwAB3IOAQwLCwxwDw0CCxIQAgoRCwpoBAECAitNCAYCAAABXwUDAgEBLk0TARERLBFOG0A4CQEHAAwABwyADgEMCwAMC34PDQILEhACChELCmgEAQICK00IBgIAAAFfBQMCAQEuTRMBEREsEU5ZQCInJiUkIyIhIB8eHRwbGhkYFxYVFBMSEREREREREREQFAkfKxMjNTM3MwczNzMHMxUjByM3IwcjByM1MzczBzM3MwczFSMHIzcjByO5ZYAnfSdsJ30nU24JfQlsCX0tVG8JfQlsCX0JZH8nfSdsJ30BlHKqqqqqcigoKMJyKCgoKHKqqqoAAAH/9f/JAbgC5wADABNAEAABAAGGAAAALQBOERACCRgrATMBIwEXof7doALn/OIAAAH/9f/JAbgC5wADABNAEAABAAGGAAAALQBOERACCRgrAzMBIwuhASKgAuf84gACAFAAAAEvArAADgASACtAKAkFAgEAAUwAAAEAhQABAgGFAAIDAwJXAAICA18AAwIDTxERFhYEBhorEyYvAzUzFQ8EIwczFSNkAwQHBALfAQUGCBSPHsrKAb8YNUQ1HA8PHDVETclTowAAAgA8AAABGwKwAAMAEgAtQCoPBAIDAgFMAAIBAwECA4AAAwOEAAABAQBXAAAAAV8AAQABTxYXERAEBhorEzMVIwM/AjY3NzMfBBUjRsrKCgIEBwQDFI8UCAYFAd8CsKP+Ahw1RTIayclMRTUcDwADACMAAAHXArgAIAArAC8APUA6IQEDACscAgEDAkwAAQMEAwEEgAIBAAADAQADaQAEBQUEVwAEBAVfAAUEBU8vLi0sKSUkIyAfHAYGFysTNDc2Njc2Njc2NjU1FhYXFhUUBwYGBwcGBgcGFQYVFSMDNjc3FSYjIyIHBxMzFSODGgsbGBAXBQUDLUYaOxoLIBcyDAoCAwGqYDBFTQULFCs+NVHKygE3QBwLDAgFCgYGEA7NAQ8TLGtRJRATCBEEBgYHCwgZEwGtCgYEmQEGBv6QowADADL/+AHmArAAAwAhACwAQUA+KBICBAIpAQMEAkwAAgEEAQIEgAAAAAECAAFnAAQDAwRZAAQEA2EFBgIDBANRBAQsKyYiBCEEIRQTERAHBhgrEzMVIxImJyY1NDc2Njc3NjY3NzUzFRQHBgYHBgYHBgYVFTcWMzMyNzcVBwYHy8rKAUUZPBoLIBcyDAoDA6oaCxsYEBcFBQMqBQwTPyk2OU47ArCj/ewPEyxrUSUQEwgRBQYGEjNBQRoLDQgFCgYGEA7NmgEEBJAHCQEAAAEAQADaAQoBfQADABhAFQAAAQEAVwAAAAFfAAEAAU8REAIGGCsTMxUjQMrKAX2jAAEAzADuAZYBkQADABhAFQAAAQEAVwAAAAFfAAEAAU8REAIGGCsTMxUjzMrKAZGjAAIAOv9qAWEC5wAOAB8AHEAZAAIAAwIDYwABAQBfAAAALQFOFxgXFQQJGisSNjc2NjczBgYHBgcGFSMTJiYnJicmNTMWFxYXFhYXIzsTFBM8NXsSIwsdCg+xnRktDycPErEBDgodCyMSewGZeS4qSjMYMBQ2Q1d+/j0bMxU5QUh2iE5ENBUwGAACABX/agE8AucADQAcABxAGQACAAMCA2MAAQEAXwAAAC0BThcWFhUECRorEiYnJiYnMxYWFxYWFyMCNjc2NjczFAcGBwYGByOKEA8NJSR7NTwTFBMBsVIlDRAPAbESECcRNR17AaOFLic6MDVJKS55XP5dOicuhWd2SEI4GDwfAAIAFv9qAWkC5wASACYALkArAAEBABwBAwICTAABAAIAAQKAAAIDAAIDfgADAwBfAAAALQNOFxsXGQQJGisTNjc2NTU0NzY3MwYHBhUVFAcjEiYnJjU1NCcmJzUzFhUVFBcWFyMWLxMORB0nezAbDkuvsTcVFQ4ULrBKLBMaewFPBh4YLG1VPhwULEAhInteJP5DNCQkM2ksGR8GEyRbez49GxkAAgAU/2oBZwLnABMAJgAuQCsRAQEAHAEDAgJMAAEAAgABAoAAAgMAAgN+AAMDAF8AAAAtA04aFxsWBAkaKxI1NTQnJiczFhYXFhUVFBcWFxUjAjc2NTU0NzMVBgcGFRUUBwYHI20tFBh7JzcVFQ8SL691HA5KsC8SD0QdJ3sBX157PD8eFhQ0JCUybSwYHwUU/lw/ISJ7WyQTBSAZLGlVPhwUAAACAEH/agFiAucABQALAC1AKgACAQMBAgOAAAMEAQMEfgAEAAUEBWQAAQEAXwAAAC0BThEREREREAYJHCsTIRUHESMVMxEXFSFBASF3qqp3/t8C53EE/sko/swEcQAAAgAt/2oBTgLnAAUACwAtQCoAAgAEAAIEgAAEAwAEA34AAwAFAwVkAAAAAV8AAQEtAE4RERERERAGCRwrEyc1IREjAzcRMxEhpHcBIap3d6r+3wJyBHH+VP6gBAE0/lcAAQAvANIBTAFnAAMAGEAVAAABAQBXAAAAAV8AAQABTxEQAgkYKxMhFSEvAR3+4wFnlf//AC8A0gFMAWcAAgJLAAAAAQAoAO4BuAFzAAMAGEAVAAABAQBXAAAAAV8AAQABTxEQAgkYKxMhFSEoAZD+cAFzhQABACgA7gNIAXMAAwAYQBUAAAEBAFcAAAABXwABAAFPERACCRgrEyEVISgDIPzgAXOF//8ALwDSAUwBZwACAksAAP//AC8A0gFMAWcAAgJLAAAAAQAA/0IBkP/HAAMAILEGZERAFQAAAQEAVwAAAAFfAAEAAU8REAIJGCuxBgBEFSEVIQGQ/nA5hf//AC8BBAFMAZkBBgJLADIACLEAAbAysDUr//8ALwEEAUwBmQEGAksAMgAIsQABsDKwNSv//wAoASABuAGlAQYCTQAyAAixAAGwMrA1K///ACgBIANIAaUBBgJOADIACLEAAbAysDUr//8ALwEEAUwBmQACAlIAAAABAEH/bAD/AJkAEAAcQBkAAAADAANlAAICAV8AAQEsAU4WERUQBAkaKxcyNzY2NTUjNTMVFAYHBgYjQS0PBwVIvgwSE0xBTw8HGBQNmXQ8QhQVEgACAEH/bAH0AJkAEAAhACRAIQQBAAcBAwADZQYBAgIBXwUBAQEsAU4WERURFhEVEAgJHisXMjc2NjU1IzUzFRQGBwYGIzcyNzY2NTUjNTMVFAYHBgYjQS0PBwVIvgwSE0xB9S0PBwVIvgwSE0xBTw8HGBQNmXQ8QhQVEkUPBxgUDZl0PEIUFRIAAgBBAYMB9AKwABAAIQAkQCEGAQIHAQMCA2MFAQEBAGEEAQAAKwFOERURFhEVERUICR4rEzQ2NzY2MxUiBwYGFRUzFSM3NDY3NjYzFSIHBgYVFTMVI0ENEhNMQC4OBwVIvvUNEhNMQC4OBwVIvgH3O0MUFRJFDgcZFA2ZdDtDFBUSRQ4HGRQNmQAAAgBBAYMB9AKwABAAIQAkQCEEAQAHAQMAA2UFAQEBAl8GAQICKwFOFhEVERYRFRAICR4rEzI3NjY1NSM1MxUUBgcGBiM3Mjc2NjU1IzUzFRQGBwYGI0EtDwcFSL4MEhNMQfUtDwcFSL4MEhNMQQHIDwcYFA2ZdDxCFBUSRQ8HGBQNmXQ8QhQVEgAAAQBBAYMA/wKwABAAHEAZAAIAAwIDYwABAQBhAAAAKwFOERURFQQJGisTNDY3NjYzFSIHBgYVFTMVI0ENEhNMQC4OBwVIvgH3O0MUFRJFDgcZFA2ZAAABAEEBgwD/ArAAEAAcQBkAAAADAANlAAEBAl8AAgIrAU4WERUQBAkaKxMyNzY2NTUjNTMVFAYHBgYjQS0PBwVIvgwSE0xBAcgPBxgUDZl0PEIUFRIAAAEASQIaAQEDPAAQACJAHwACAAEAAgFnAAADAwBZAAAAA2EAAwADURYRFRAECRorEzI3NjY1NSM1MxUUBgcGBiNJKg0GBUK4DBITSD8CXA4HFhQNlG84QhMVEQAAAgAOAGMB1gH+AAUACwAeQBsJAwIBAAFMAwEBAQBfAgEAAC4BThISEhEECRorEzczBxcjNzczBxcjDoR5ZWV5R4R5ZWV5ATDOzs3Nzs7NAAACAC0AYwH1Af4ABQALAB5AGwkDAgEAAUwDAQEBAF8CAQAALgFOEhISEQQJGisTJzMXByMlJzMXByOSZXmEhHkBMGV5hIR5ATDOzs3Nzs7NAAEADgBjAQsB/gAFABlAFgMBAQABTAABAQBfAAAALgFOEhECCRgrEzczBxcjDoR5ZWV5ATDOzs0AAQAtAGMBKgH+AAUAGUAWAwEBAAFMAAEBAF8AAAAuAU4SEQIJGCsTJzMXByOSZXmEhHkBMM7OzQACAEEBqAHMArAABQALACBAHQkGAwAEAQABTAMBAQEAXwIBAAArAU4SEhIRBAkaKxM1MxUHIzc1MxUHI0GqFILNqhSCAn8xMdfXMTHXAAABAEEBqADrArAABQAaQBcDAAIBAAFMAAEBAF8AAAArAU4SEQIJGCsTNTMVByNBqhSCAn8xMdcAAAEAN/99AcoCqAAFABdAFAMBAQABTAAAAQCFAAEBdhIRAgYYKxMBMwMTIzcBGnn7+3kBEgGW/mr+awABADf/fQHKAqgABQAeQBsEAQIBAAFMAAABAIUCAQEBdgAAAAUABRIDBhcrFxMDMwEBN/v7eQEa/uaDAZUBlv5q/msAAAIALf/4AagCuAAKACIASkBHBwUCAQQMCAEDBQEVDQICBQNMBwEFAAIDBQJpBgEBAQBfAAAAK00ABAQDXwADAywDTgsLAAALIgshHRwTEhAOAAoACRMICRcrAAc3NzMHFhcVJiMSNxUGIyInByMnNy4CNTQ2NjcVFBYWMwEeDyAeMBcpFSo8LjxbQx4YFS8BFzI0EyNQSgogKwHZBXNxVQYGhQf++giFEgNPAVYOQGZSaXIyBNJiShUAAAMALf/4AagCuAAQABsAJgA4QDUaGAwDAgAhHBsVBAQCJCIAAwEEA0wAAgIAXwMBAAArTQAEBAFfBQEBASwBThYmEiIRHQYJHCs3JiYnJiY1NDY3NjY3NTMRIxMmIyIHNTMVFhcVBxYzMjc3FQYHFSO+MzsPDQcHDQ87My8vyBkrHg0vLjCNERozEyA0Li9KCTAmIE8+PVEgJTALVP1AAdsEBOVQBAyI9gMDBIgNBE0AAwAt//gBtQK4AAwAFwAmAEBAPRMBAAEfGRcQBAUDJCABAwYFA0wABQAGAgUGaQADAwFfBAEBAStNAAAAAl8HAQICLAJOEiMqEiERERcICR4rFzcmJjU0NjY3NzMDIwAjIgc3MwcWFhcVARMeAjMyNxUGIyInByNIGyAWG1NWFTC+LwEkHR0NNy8VFx4F/u5GAhUqKjMyRUghKBEvB2YdbmNtcTkFT/1AAfQBzVECCQF1/hMBBiQiCwh4DQU+AAIAJf//AoQCsQAbADYASEBFMzIwGBYUEwcCAyYBAAIjIR8eCwoIBwEAA0wxFQIDSiAJAgFJAAMAAgADAmkAAAEBAFkAAAABYQABAAFRLy0sKyETBAkYKyQWFxYzFSMiJwcnNyYnJiY1NDY3JzcXNjcRFBckBgcXBycGBxE0JzU0JicmIzUzMhc3FwcWFhUBGg0RESIYTTJSXEUGAgcDBwtGXVclGAIBNQYLSF5WGScBEBERIhhQMVRcSAsG7B8DA38LU11FEgoeO0FCVB5HXlcIAv70HC4JUx5IX1cHAwEMJQsaISADA34KVF1IHlRCAAMALv/4Ae0CuAAlADEAPQBLQEgwLRADAgA2MQIFAjUBBAUjAQEEBEwTAQIAAQUCSwAFAAQBBQRqAAICAF8DAQAAK00GAQEBLAFOPTw7NzMyLCsqJyUkEhEHCRYrJTY2NTQmJycmJyYmNTQ3Njc1MxUGBhUUFhcXFhYXFhUUBwYHFSMSJyYjIzUzFRYXFxUBJicnNRYXFjMzFSMBJA0HChFxTxoMCSwnSi8PCAkVfRwnDh4rJkkvdzQmEA0vNCgh/vs7Kic7NSgREi/WAgoNEAkCDwsuFTkoUSYhCFDcAgoNDggDEQMPECRdXCkkBk8B3wQC208EBweG/nYEBweGBgMC3AAAAwAq/2sCQALnAAsALQAxAKZAChgBBwYqAQEIAkxLsCJQWEA1AAcGCAYHCIAACAEGCAF+AAoACwoLZAAEBC1NAgEAAANfDAUCAwMrTQAGBjRNDQkCAQEsAU4bQDkABwYIBgcIgAAIAQYIAX4ACgALCgtkAAQELU0CAQAAA18MBQIDAytNAAYGNE0AAQEsTQ0BCQkyCU5ZQB4MDAAAMTAvLgwtDCwpJxsZFhQACwALEREREREOCRsrARUjESMRIzUzNTMVACYnJiY1NDc2MzIWFxUjIgYHBgcGFRQXFhYXFjMzFQYGIwchFSECQDe5eXm5/o85ERMRJCJQJC4UCxYTBQUBAQEBCgsOEAsUMSGDAc3+MwKvlf3mAhqVODj9ShodHmRLkzs6CxB/BQkLFQ8vLw8VFQICfw8MN1cAAAIAHv/4AjkCuAAZADMBB0uwGFBYQA4LAQIBLgEJBi8BCwkDTBtLsC5QWEAOCwEDAS4BCQYvAQsJA0wbQA4LAQMBLgEKBi8BCwkDTFlZS7AYUFhAKwQBAAAFBwAFZwAHCAEGCQcGZwMBAgIBYQABATFNCgEJCQthDQwCCwssC04bS7AuUFhAMgACAwADAgCABAEAAAUHAAVnAAcIAQYJBwZnAAMDAWEAAQExTQoBCQkLYQ0MAgsLLAtOG0A9AAIDAAMCAIAACgYJBgoJgAQBAAAFBwAFZwAHCAEGCgcGZwADAwFhAAEBMU0ACwssTQAJCQxhDQEMDDIMTllZQBgaGhozGjIxMC0sKykRERYRFSIUJRAOCR8rEzM2Njc2NjMyFxYXFSYnJiMiBgcGBgczFSEAJicmJicjNSEVIxYWFxYWMzI3NjcVBgcGIx5GBiEgIWlPQj4fEhMdLSIoLw4PEAPV/hoBFmghICEGRgHm1gMQDw4uKjUoDxcwPCInAc5EWBsbGAoFBY8BBAUFCAkfHGH+ixkbG1hFYWEcIQgIBgUBBJELBAMAAv+k/zsCFwLmABcAKAA2QDMABgQFBAYFgAACAgFhAAEBLU0ABAQAXwMBAAAuTQAFBQdhAAcHMAdOFhUxERUxKBAICR4rEzM3NjY3NjY3NjYzByIHBgYHBgcHMwchAzI3NjY3NjcTMwMGBgcGBiNVXgYKGRERMCQgVFEbNBAYGwUHBAl6Hv5veDMRGBoGBwNHukUQKSQibXEB/h4zRBYWGQYFA4ABAQwMDhQsjf5KAQEMDBIQAVL+vE1PExIJAAQAAAAAAh0CsAAHAAsADwATAD1AOgAGAAcDBgdnCAEDCQECAQMCZwAEBABfCgUCAAArTQABASwBTggIExIREA8ODQwICwgLEhERERALCRsrEzMRIzUjNTMBFSM1ETMVIxUzFSNByMhBQQHc6sXFnZ0CsP1QZT8CDJmZ/uSZVz8AAwAw//gCOAK4ABUAHgAtAElARh0bCAMEAR4LAggEAkwJAQACAwIAA4AACAAHAggHZwAEBAFfBQEBAStNBgECAgNgCgEDAywDTi0sKyoRExURIREYGBALCR8rNy4CNTQ2Njc1MxUOAhUUFhYXFSMSIyM1MxUWFxUHNjY1NSM1IRUUBgYHFSP5VVYeIlZRMBUUBQcTFTGxNiAvUUnKFQk4AP8UTVQwSwY3bGRibjcHUuQEGC8xNzASAeYB3+FRBg+I6wERIBBobk5QLgVSAAACAAUAAAKuArAABwARAC9ALAsBAwAKAQECAkwGAQMHAQIBAwJoBQEAACtNBAEBASwBThERExEREREQCAkeKxMzESMRIzUzASMnNTczAzMVI0HIyDw8Am3gm57azLurArD9UAEid/5n8dfo/ul3AAIAKQAAAjkCuAAUACAARUBCCAECAQkBAAICTAMBAAAEBwAEZwAHCAEGBQcGZwACAgFhAAEBMU0JAQUFCl8ACgosCk4gHx4dEREREREVJCMQCwkfKxMzPgIzMhYXFSYjIgYHBgYHMxUhFTM1IzUhFSMVMxUhKUwEM3RoKl4eTCknKQsNDQKg/kdKSgG5ofj98AHOV2UuCgiRCQYICSAZYNRKYWFKmgADAAr//gJIArAACQARAB4APkA7ERAKCAcGAwIBCQQADw4NAwMEAkwFAQQAAwAEA4AAAAArTQADAwFhAgEBASwBThISEh4SHhEbFhQGCRorAQU1NxEzFTcVBxURIzUHNSUVFxQGBwYGIzUyNzY2NQEL/v9ByHR0yEEBfcEUGx9pVDsXCAQBx5U6JQEfrEM5Q3P+qOUmOts5oDxZICQkpBoKHRgAAAIALwAAAosCuAATABwAK0AoFgEBBAFMAAQAAQIEAWkAAgIDXwADAytNBQEAACwAThYREREWEwYJHCsAFhURIxE0JicmJicRIxEzFRYWFyQ2NxEjETQ2NwJ5EswECAceGzAwXW8d/glSRMwNFAH9b1z+zgEeRz0RDw0B/scCIU4CJCQRLAj9mwEyUGYjAAAFAAoAAALWArAABQAMABEAGAAdAFxAWQ8EAgQBCQECBBIBCAkbAQIACARMBQ0CBAYBAgkEAmgLAQkKAQgACQhnAwwCAQErTQcBAAAsAE4GBgAAHRwaGRgXFhUUExEQDg0GDAYMCwoIBwAFAAUSDgkXKwEBFSMBNQUVIyc1MxUhMzUXIwUVIzUjNTMFIxUnMwETAYLH/n0Ci9Ypvv11QXu8AP++QdcB9UF6uwKw/W0dApQc4mBH++Jz03L84WBgcdEAAAMABQAAArsCsAAWABoAIgBEQEEACggHClcABAQCXwUBAgIrTQAAAAFfCwYDAwEBLk0JAQcHCF8ACAgsCE4AACIgHBsaGRgXABYAFiEkEREREQwJHCsBFSE1MzUzFTMmJyYmIyM1MzIWFxYWFwUzESMTIQYHBgYjIwK7/UpLyJUDCAkgHxhTSl0YERIC/dfIyPIBMwYZGV1LUwH9bW2zsw8ICAWPHR4WOiiZ/pwBZCwhICEAAAQABQAAArsCsAAFABUAGwAsAE5ASw4GAgIDAQEJAgFoDQEJCgEICwkIZwAMAAsHDAtnAAQEAF8FAQAAK00ABwcsB04GBiwrJiQjIR0cGxoZGBcWBhUGFSEkEhEREA8JHCsTMxUhNTMhFSEmJyYmIyM1MzIWFxYXASMRIzUhBSMGBwYGIyM1MzI2NzY2NyFQyP7tSwJr/vUBDQkgHxhTSl0YEwn+qMhLARMBo0oKERldS1MYIB8JBwYBAQsCsNRgYCENCAWZHR4XIv3EAU9gYCMVICGZBQkHFhUABAAAAAACbAKwAAUAIwApAC0AQkA/AAQCAQRZAAIDAQEJAgFoCwEIBwkIVwAFBQBfBgEAACtNCgEJCQdfAAcHLAdOLSwrKikoERMhKiEoEREQDAkfKxMzESE1MwAWFRQGBwYGIyM1MzI2NzY2NTQmJyYmIyM1MzIWFwEjNSM1ITMzFSNByP73QQIbEA8WGV1LUxggHwkJBQUJCSAfGFNKXRj+xMhBAQkqnZ0CsP4mPwFEVUE+UhwgIZkFCQgfHx8fCQgFmR0e/YtlPz8AAgAQAAACUAKwABAAGgBEQEEWEwIGBwFMAAcBBgEHBoAABgaEAAQIBQIDAAQDZwIBAAEBAFcCAQAAAV8AAQABTwAAGBcVFAAQABARJBEREgkGGysBFhczFSE1ISYnJiYjIzUhFQIGBxMjJzUhBgcB6woBWv3AAR4BDAgfIckCQG80KobSgAE/AwgCUBgVYGAYCgcEYGD+4ysH/v/qmRsYAAMAKAAAAjsCuAAOABoAIgDSS7AYUFhACxYNAgABBQEDAAJMG0ALFg0CAAEFAQIAAkxZS7AOUFhAKAAHBQYGB3IEAQMABQcDBWcKAgIAAAFhAAEBMU0IAQYGCWAACQksCU4bS7AYUFhAKQAHBQYFBwaABAEDAAUHAwVnCgICAAABYQABATFNCAEGBglgAAkJLAlOG0AwCgECAAMAAgOAAAcFBgUHBoAEAQMABQcDBWcAAAABYQABATFNCAEGBglgAAkJLAlOWVlAGQAAIiEgHx4dHBsaGRgXEA8ADgAOQiILCRgrACcmIyIHNTYzMzIXFhcVBTM0Njc2NjcRMxUhFTM1MxUhFSECHxsqHz4YBQwTPzogDv34SxMWF0w8qf5ESskBAP3tAhYEBQmhAQoGBI9oQl0fICMG/vmVf1dXmQAABQAFAAAD6QKwAAUAGAAgACoANABXQFQNAQIAFwELAgJMEAgCAAYBAgsAAmgOAQsMAQoDCwpnBw8FAwEBK00NCQQDAwMsA04ZGQYGNDMyMSwrKikoJyIhGSAZIB0cGxoGGAYYHRIRERARCRsrEzMnMxMhARMjLwImJyMHBwYGDwIjAxMFFSETMwcGBwEjJyYvAiM1IQUjBwYPAiMDIQU/NcdD/uwCW6SrCBUeExEGIgsFCQQUCAtGSwJW/vY5xyAGEP27sgcHCxsCdwEdAsd4AhMHEwcMTAEGAc7i/r4BQv1QIVd/TUqXMxUmEVchAVgBWOJgAUKGFkb+Mh0cMm4IYGAITSFOHQFBAAACAA8AAAJqArAADQAVADNAMAYBBAABTAMBAAAEBgAEaAAGBwEFCAYFZwIBAQErTQAICCwIThERERERERMTEAkJHysTMycmJzMTMxMzBzMVIRcjNSEVIxUjKVInJx7MYAdgyG1S/dqvrwImr8gBv1dURv70AQzxYYlhYdX//wCkANoBbgF9AAICOWQA//8AMv/dAjIC+wAmAj1eFAAnAjD/8gIyAQMCMAEoAAAAEbEAAbAUsDUrsQEBuAIysDUrAP///8QAAAH6ArAAAgIsAAAAAQBGADUB1gHFAAsAJkAjAAIBBQJXAwEBBAEABQEAZwACAgVfAAUCBU8RERERERAGCRwrNyM1MzUzFTMVIxUjy4WFhoWFhrqGhYWGhQAAAQBGALoB1gFAAAMAGEAVAAABAQBXAAAAAV8AAQABTxEQAgYYKxMhFSFGAZD+cAFAhgABAEYAQAHAAboACwAGswkDATIrNzcnNxc3FwcXBycHRl5eX15eX15eX15en15eX15eX15eX15eAAMARgAQAdYB6gADAAcACwB4S7AYUFhAHQACAAMEAgNnAAEBAF8AAAAuTQAEBAVfAAUFLAVOG0uwHlBYQBsAAAABAgABZwACAAMEAgNnAAQEBV8ABQUsBU4bQCAAAAABAgABZwACAAMEAgNnAAQFBQRXAAQEBV8ABQQFT1lZQAkRERERERAGCRwrEzMVIwchFSEXMxUjy4aGhQGQ/nCFhoYB6m48hjxuAAIARgBWAdYBpAADAAcAIkAfAAAAAQIAAWcAAgMDAlcAAgIDXwADAgNPEREREAQJGisTIRUhFSEVIUYBkP5wAZD+cAGkhkKGAAEARgAAAdYB/gATAJ1LsA5QWEApAAQDAwRwAAkAAAlxBQEDBgECAQMCaAcBAQAAAVcHAQEBAF8IAQABAE8bS7APUFhAKAAEAwSFAAkAAAlxBQEDBgECAQMCaAcBAQAAAVcHAQEBAF8IAQABAE8bQCcABAMEhQAJAAmGBQEDBgECAQMCaAcBAQAAAVcHAQEBAF8IAQABAE9ZWUAOExIRERERERERERAKBh8rNyM1MzcjNTM3MwczFSMHMxUjByODPXsfmtkqcSpGhR+k4ihxVoZChlpahkKGVgAAAQBGAC0B1gHNABIABrMSAwEyKzc3JzUFFQcHBgYHBgYHBg8DRuvrAZATLAYMBQgVDAojHDSUs0pKho6EBw8DAwIDBwUEDAoTNAABAEcALQHXAc0ADAAGswwIATIrJScmLwM1JRUHFxUBQzQZByptEQGQ6+thEwkCDycGhI6GSkqGAAIARgAAAdcCTgARABUAJEAhEQUEAwIBAAcASgAAAQEAVwAAAAFfAAEAAU8VFBMSAgYWKxM3JzUFFQcHBgYHBgYHBg8CFSEVIUbs7AGREywGDAUIFQwKIxzJAZH+bwE0SkqGjoQHDwMDAgMHBQQMCkcohgAAAgBGAAAB1gJOAAwAEAAiQB8MCwoJCAcGBwBKAAABAQBXAAAAAV8AAQABTxEdAgYYKyUnJi8DNSUVBxcVBSEVIQFCNBkHKm0RAZDr6/5wAZD+cOITCQIPJwaEjoZKSoYohgACAEYAAAHWAkgACwAPACtAKAMBAQQBAAUBAGcAAgAFBgIFZwAGBgdfAAcHLAdOERERERERERAICR4rEyM1MzUzFTMVIxUjByEVIcuFhYaFhYaFAZD+cAE9hoWFhoUyhgACAC8ATgHCAa0AHAA5AKJLsCBQWEBBAAIAAQJwAAUDCAQFcgAIBgcIcAALCQoLcQAAAAQDAARpAAEAAwUBA2oABwoJB1kABgAKCQYKaQAHBwliAAkHCVIbQEEAAgAChQAFAwgDBQiAAAgGAwgGfgALCQuGAAAABAMABGkAAQADBQEDagAHCgkHWQAGAAoJBgppAAcHCWIACQcJUllAEjk4NjQwLhIjJBIkJBIjIwwGHysSNjc2MzIXFxYzMjY1MxQGBwYjIicWJyYjIgYVIxQ2NzYzMhcXFjMyNjUzFAYHBiMiJxYnJiMiBhUjLwQJEkUnQi4XDRAHXQQIFEQnQgQyExEQB10ECRJFJ0IuFw0QB10ECBREJ0IEMhMREAddATcwEigOCQUQGC0wEikOAQsEDxmNMBIoDgkFEBgtMBIpDgELBA8ZAAEALwDeAcIBggAcAJSxBmRES7AVUFhAIAABAAQAAXIABAMDBHACAQABAwBaAgEAAANhBQEDAANRG0uwIFBYQCUAAQAEAgFyAAQDBQRwAAABBQBaAAIAAwUCA2kAAAAFXwAFAAVPG0AnAAEABAABBIAABAMABAN+AAABBQBaAAIAAwUCA2kAAAAFXwAFAAVPWVlACRIkJBIjIwYJHCuxBgBEEjY3NjMyFxcWMzI2NTMUBgcGIyInFicmIyIGFSMvBAkSRSdCLhcNEAddBAgURCdCBDITERAHXQEMMBIoDgkFEBgtMBIpDgELBA8ZAAABAEYANQHVAUAABQA+S7AJUFhAFgACAAACcQABAAABVwABAQBfAAABAE8bQBUAAgAChgABAAABVwABAQBfAAABAE9ZtREREAMJGSslITUhESMBT/73AY+Guob+9QAAAQAFAbwBpQLtAAoAIbEGZERAFggBAQABTAAAAQCFAgEBAXYSFRADCRkrsQYARBMzFhcWFxcjJwcjk4QTAxMeR4ZKSoYC7SkHKz2ZubkAAQAuACED3wHfAEsAUUBOIQECAzkTAgUARwEIAQNMAAACBQIABYAABQECBQF+BAEDBgECAAMCaQcBAQgIAVkHAQEBCGEKCQIIAQhRAAAASwBKIyglFyYjKCUXCwYfKzYmJyYmNTQ3MwYVFBcWMzI3NjY3JiYnJiMjNjc2MzIXFhc2NzYzMhYXFhYVFAcjNjU0JyYjIgcGBgcWFhcWMzMGBwYjIicmJwYHBiPVXBsaFgONChgXQ0MpEBULDBUPKETtEjM5ZVw8NB8fNT1bR1scGRUDjQoWGEJEKBAWCgoWEClD6xEyN2dYQDQgIDM+WiEdHRtROR4bFCU2FRYfDB8XFyAMHkAdISUgNjYgJR0dG1E5HxoTJjYWFR4MIRYWIAwfQB4gJR44OB4lAAIAJgAAAoQCsQAXADAAQUA+LRcVAwABCwECACMiIAgEAwIDTBYBAUohAQNJAAEAAAIBAGkAAgMDAlkAAgIDYQADAgNRHx0cGxQSERAEBhYrARYWFRQGBwYHETQnNTQmJyYjNTMyFzcXABYXFjMVIyInByc3JicmJjU0Njc2NxEUFwI8CwYIDh+IARARESIYUDFUXP6WDRERIhhNMlJcRQYCBwMIDhyLAgIMHlRCSFkeQgsBDCULGiEgAwN+ClRd/pgfAwN/C1NdRRIKHjtBSFgfPg/+9BwuAAEAKP9CAa0CuAAiAChAJQYBAAIBTAABAAIAAQJpAAADAwBZAAAAA2EAAwADUR8RLRAEBhorFzI3NjY1NScDJjU0Njc2NjMVIgcGBhUVFBcTFhUUBgcGBiMoThYNCgEoAx8kIWpoTRYNCwEoAx8kImpnPgYDEBALCAHcIRs8QRAOB4AGBBEPCAcD/iQhGzxBDw4IAP//AC8AAAKLArgAAgHMAAD//wACAAACrQKwAAIBywAAAAMAQf9DAosCsAADAAcACwAqQCcEAQIBAwECA4AFAQMDhAAAAQEAVwAAAAFfAAEAAU8RERERERAGBhwrEyEVIRUzESMBMxEjQQJK/bbIyAGCyMgCsJko/VQCrP1UAAADAEH/QwKLArAABAALAA8APEA5AAEBAAkGAgQCBQEDBANMAAIBBAECBIAAAAABAgABZwAEAwMEVwAEBANfBQEDBANPERESExERBgYcKxM1IRUFAwEnMxcBIyUhFSFBAkr9ugQBCuHq4f5tYQEnASP+UAIblZkB/cIBIfX1/kqZmQAAAgAf/5YC1wMCAAMACQAaQBcHBgUDBAEAAUwAAAEAhQABAXYWEQIGGCslEzMDAQcnNxMjAY6lpOD+hz0iyea1dwKL/KEBKxpXW/4wAAIAKv/4AhIC5wAcADQAnrYLCQIAAwFMS7AKUFhAKAABAwGFAAMAA4UAAAQAhQACBAUEAgWAAAQCBQRZAAQEBWEGAQUEBVEbS7ALUFhAIQABAwGFAAMAA4UAAAQAhQAEAgIEWQAEBAJhBgUCAgQCURtAKAABAwGFAAMAA4UAAAQAhQACBAUEAgWAAAQCBQRZAAQEBWEGAQUEBVFZWUAOHR0dNB0zJysaJyYHBhsrJTQnJiYnJiMjNRYXNyYmJzUzFhYXFhUUBgcGBgcGJicmJjU0Njc2NjMzERQXFhYXFjMzFSMBVgEBCgsMFQ4WEQIZUTnDLEIYMwkRE0xDj2IYFg0LERJFOw4BAQoMChYODv4zERgZAwOJAgQDSGwwBCZVNnm/T1ccHx8EAhofHFxVSlwfIiH++DMQGBgDA40A//8AN/9DAhEB/gACAc0AAAAFAC//+ANTArgAFAArAC8ARABbAQpLsA5QWEAXIAEAAQABAgBQFAIDAjABCAMETEQBBUkbS7AeUFhAFyABAAEAAQIAUBQCAwcwAQgGBExEAQVJG0AXIAEEAQABAgBQFAIDBzABCAZEAQkFBUxZWUuwDlBYQCMHAQIGCgIDCAIDagAAAAFhBAEBATFNAAgIBWELCQIFBSwFThtLsB5QWEApAAIKAQMGAgNpAAcABggHBmoAAAABYQQBAQExTQAICAVhCwkCBQUsBU4bQDEAAgoBAwYCA2kABwAGCAcGagAEBCtNAAAAAWEAAQExTQAFBSxNAAgICWELAQkJMglOWVlAHUVFFRVFW0VaWFc5NzU0Ly4tLBUrFSooJyIUDAkYKxMmJyYmIyM1MzIWFxYWFRQGBwYGBwYmJyYmNTQ2NzY2NxUUFxQXFhYzMxUjATMBIyUmJyYmIyM1MzIWFxYWFRQGBwYGBwYmJyYmNTQ2NzY2NxUUFxQXFhYzMxUj9QIDBBATBgY6Pg8OBgUJCy0pZT4PDgYFCgssKQEEAxESBwcBnnX+P3UCPgIDBBATBgY6Pg8OBgUJCy0pZT4PDgYFCgssKQEEAxESBwcCNhkICgRTExYUQUM8PBQXGAMCExcUQEI5PxUXGAO/Lw8XCQoFUwF5/VD3GQgKBFMTFhRBQzw8FBcYAwITFxRAQjk/FRcYA78vDxcJCgVTAAcAL//4A+wCuAASACcAKwA+AFEAZgB7AOZLsB5QWEAgHgEAASEAAgIAEgEDAnJdAgYHdWA/LAQKBgVMUT4CBUkbQCAeAQQBIQACAgASAQMCcl0CBgd1YD8sBAoGUT4CCwUGTFlLsB5QWEAuAAIOAQMHAgNpCQEHCAEGCgcGagAAAAFhBAEBATFNDAEKCgVhEA0PCwQFBSwFThtANgACDgEDBwIDaQkBBwgBBgoHBmoABAQrTQAAAAFhAAEBMU0ABQUsTQwBCgoLYRANDwMLCzILTllAKWdnUlITE2d7Z3t6eVJmUmZlZEZFREMzMjEwKyopKBMnEycmJREUEQkYKxMmJyYmIzUyFhcWFhUUBgcGBgcGJicmJjU0Njc2NjcVFBcUFxYWMxUBMwEjJSYnJiYjNTIWFxYWFRQGBwYGByUmJyYmIzUyFhcWFhUUBgcGBgcEJicmJjU0Njc2NjcVFBcUFxYWMxUgJicmJjU0Njc2NjcVFBcUFxYWMxXcAgMEDhAyNw0MBgUICSgjVzcNDAYFCAknJAEEAw4RAWh1/jN1AgUCAwQOEDI3DQwGBQgJKCMBNAIDBA4QMjcNDAYFCAkoI/51Nw0MBgUICSckAQQDDhEBAjcNDAYFCAknJAEEAw4RAkcVBwgFSBETEjo4MTcSFBYDAREUEjo3MTgSFBQDpioNFQgIBEgBSP1Q1xUHCAVIERMSOjgxNxIUFgPeFQcIBUgRExI6ODE3EhQWAwERFBI6NzE4EhQUA6YqDRUICARIERQSOjcxOBIUFAOmKg0VCAgESAACACAAAAH8ArAADgAUAB1AGhIREA4IAQYBAAFMAAABAIUAAQF2FBMSAgYXKyU3AzMXFxYXFwcGBwcGBwETFwcTIwElWKZ6GhsKFlY9EAkaHwv+vpk9V6V5oLgBWDY3FSqseyIRM0EUATYBNX+2/qgABABG/5QDagK4ACUATABpAIUA+kuwLlBYQBIyAQQGQQEMC2YBCQeBAQ8JBEwbQBIyAQQGQQEMC2YBCQeBAQ8NBExZS7AuUFhASQMBAQoICgEIgA4BCAsKCAt+AAwLBwsMB4AACgALDAoLaQAHEQ0CCQ8HCWkADxIBEA8QZAACAgBhAAAAMU0FAQQEBmEABgY0BE4bQFADAQEKCAoBCIAOAQgLCggLfgAMCwcLDAeAEQENCQ8JDQ+AAAoACwwKC2kABwAJDQcJZwAPEgEQDxBkAAICAGEAAAAxTQUBBAQGYQAGBjQETllAJGpqTU1qhWqCgHpzck1pTWhkY1pYV1RMShYmIlEVF0cYJxMJHysSNjc2Njc2NjMyFhcWFhcWFhUjNCYnJiYnJiYjIgYHBgYHBgYVIyU0JicmJyYjIg8CNTYzMhYXFhYVFTMyNjc2NzY1MwYHBgYHBiMjBiY1NDY3NjYzMhcVIwYVBhUUFhcWFxYzMxUGBiMGJicmJicmJjUzFBYXFhYXFhYzMzI3MjcVBiMjRggMDTQtKoFlZIErLTMODAhNBgkKKCQhZFtbZCEkKQoJBU0BvwQIChQNLA0kHTBYXEpUFRMMPhISBgYDAk0BCAggGxkm2sA6DQ8PNSscLiMTAQIEBggMDwgTKx8QgSotNA0MCE0FCQopJCFkWzQrSCALNiV3AZh0KCo0Dg4KCg4ONConcmFWYyEjJgkIBQUICSYjIGFZHxYSBQUBAQIBAm8PFBcVQDe/BgsMGyIoSSkoJwMDBUBFKDMPDw0CTQEPBRELEAQGAQJVEAmyCg4ONCsndF5ZYSAjJgkIBQIBRgIAAAMAL//4As8CuAAMADYAPwBQQE0dCwUDAAEMBAICABUBAwI7AQUEBEwGAQIHAQMEAgNpAAAAAWEAAQExTQAEBAVhCAkCBQUyBU4NDT8+Ojk4Nw02DTU0MigmJSMjMAoJGCsBJiMiBzU2MzIXFhcVACcmJjU0NzY3NSYmNTQ3NjcVFBYXFhYzMxUjIgYHBgYVFBYXFhYzMxUjEyEVIxEGBwYHAdo0HUcjIilcUSkl/kVEIBcgHEE+OScrbgYHBxwZMzMbHQgJBgoNDS8pGxtFAR9mLkQhJgIlAgaUAwwFB4f93zMXRDJQJiAPBA9KSU4nLQ3PFhkHBgWNBAcHGxkYGgcHBpEBqo3++woGBAIAAAIAKv9wAlACsAASABYAI0AgAAAAAV8DAQEBK00EAQICAV8DAQEBKwJOERERLRAFCRsrJSImJyYmJyYmNTQ2NzY2MzMRIxMzESMBHj5PGhseCAcFDRYXX1t4eLp4eN4GCQkgGhhGOFZUFxgR/MADQPzAAAQAIv9VAo4CuAAOAC4ATwBaAFZAUw0BAAEYAQMAVEhFRDsuFwcGA1MBBQYETAAGCQcCBQYFZQgCAgAAAWEEAQEBMU0AAwMBYQQBAQExA05QUAAAUFpQWllVT04hIBYTAA4ADhFRCgkYKwAnIicmIyM1MhcXFhYXFQMmJicnIyciByc2NjcmNTQ3NjcVFBYWFxcWFhcWFRQHBTQmJycmJicmNTU0NxcWFh8CMzI3FwYGBxYVFAcGBgcGJyYnNRYzFjMzFQImGhEuFSwoRlEVCBIJWgIQE8sCAgsCrAonJAU3LFsDEA3CICUOHwP+7AgZwiAlDh8CswIQFMsCAgoDqwknJQY2GEIuekgjFCk9FC0oAhoCAgGZCQMBAgKN/t0UEAY7ARsxHiIMGjReKB8FsAsIBgQ8ChMQJ1whGr0OBgk8ChMRJV0hChI0FRIFOwEeMh8jDCEtXigSEAIBCAUEjQQBmQAABABL//gCpwK4ACIAMABMAGwA7LEGZERLsC5QWEAUPC8CBAUqAQEERz8CBwlIAQgHBEwbQBQ8LwIEBSoBBgRHPwIHCUgBCAcETFlLsC5QWEA9AwEBBAkEAQmACwEJBwQJB34AAAACBQACaQAFDQYCBAEFBGkABw4BCAoHCGkACgwMClkACgoMYQ8BDAoMURtAQw0BBgQBBAYBgAMBAQkEAQl+CwEJBwQJB34AAAACBQACaQAFAAQGBQRpAAcOAQgKBwhpAAoMDApZAAoKDGEPAQwKDFFZQCNNTTExIyNNbE1rZmVeWlNSMUwxS0VDIzAjMCMkF0cYJBAJHCuxBgBEEjY3NjYzMhYXFhYXFhYVIzQmJyYmJyYmIyIGBwYGBwYGFSMkJicmIyMiBzUzMhcXFQImJyYmNTQ2NzY2NxUUFxYWFxYzMjc3FQYHBiMGJicmJjUzFBYXFhYXFhYzMjY3NjY3NjY1MxQGBwYGI0sSHB1zcEtgICEnCwoGSQUGBx0ZFkNEQ0MXGhwHBwRJAZMYCQgMFQYKCiIiG5M8ERALCAsLKyQBAQ4PDxwYGhQSCiAlhHQdHBJJBAcHHBoXQ0NDRBYZHQcGBUkSHB10bwHlfCAhFgkLDS0lImRTRVYcHSAIBwQEBwggHRtTSVICAQECVAYFTP7fFBcVRTcyPhUWGQW5LA4VFQMDAgNNBAEFpBchIHt5SVMbHSAIBwQEBwggHRxVRnl7ICEXAAAEAEv/+AKnArgAIgAmAD4AXgBssQZkREBhPAEFCgFMAAYHAQcGAYADAQEKBwEKfgwBCgUHCgV+AAAAAgQAAmkABwYEB1kIAQQJAQULBAVnAAsNDQtZAAsLDWIOAQ0LDVI/Pz9eP11YV1BMRUQ+PSEXExERF0cYJA8JHyuxBgBEEjY3NjYzMhYXFhYXFhYVIzQmJyYmJyYmIyIGBwYGBwYGFSM3MxEjNyM1MjY2NTQmJyYjNTMyFxYWFRQGBxcjBiYnJiY1MxQWFxYWFxYWMzI2NzY2NzY2NTMUBgcGBiNLEhwdc3BLYCAhJwsKBkkFBgcdGRZDRENDFxocBwcESZpra5YGFxQGAwUIISlIGAsJExw3cKB0HRwSSQQHBxwaF0NDQ0QWGR0HBgVJEhwddG8B5XwgIRYJCw0tJSJkU0VWHB0gCAcEBAcIIB0bU0mj/pF9UQUQEw4QAwZSHg8sICw0DYmoFyEge3lJUxsdIAgHBAQHCCAdHFVGeXsgIRcABABL//gCpwK4ACIAJgA9AF0AYUBeAwEBBwYHAQaADAEKBgkGCgmAAAUJCwkFC4AAAAACBAACaQgBBAAHAQQHaQAGAAkFBglpAAsNDQtZAAsLDWEOAQ0LDVE+Pj5dPlxXVk9LREM9OyEWERERF0cYJA8GHysSNjc2NjMyFhcWFhcWFhUjNCYnJiYnJiYjIgYHBgYHBgYVIzczESM3MjY2NTQnJiM1MzIXFhYVFAYHBgYjIwImJyYmNTMUFhcWFhcWFjMyNjc2Njc2NjUzFAYHBgYjSxIcHXNwS2AgIScLCgZJBQYHHRkWQ0RDQxcaHAcHBEmma2uQFxQGCAghKUgYCwkREA8rIx93dB0cEkkEBwccGhdDQ0NEFhkdBwYFSRIcHXRvAeV8ICEWCQsNLSUiZFNFVhwdIAgHBAQHCCAdG1NJo/6RxAYRFiAGBlIeDy0kLDINDAf+5RchIHt5SVMbHSAIBwQEBwggHRxVRnl7ICEXAAUAQQGEAvMCsAADAAkAEQAVABkAO0A4EgQCAQATDQwKBwUDBwJMBAICAAABBwABZwAHAwMHVwAHBwNfCAYFAwMHA08RERMRFRISERAJBh8rEyEVISU1MxMHIzcjByc3MxEjJRcVIyczFSNBARf+6QE8W48RQIAEICtOXl3+51tb4mNjArBURw3+9SF+R1Gk/tT0q0nExAAAAgAvAY0BYAK4ABMAJwA7sQZkREAwHwEAARMBAwICTAABAAACAQBpAAIDAwJZAAICA2EEAQMCA1EUFBQnFCcmJREVBQkYK7EGAEQTNCYnJiYjNTIWFxYWFRQGBwYGBwYmJyYmNTQ2NzY2NxUUFhcWFjMV8gIDBBEROD4PDQcFCQsuJ2I+Dg4HBQoLLCgCAwQSEAIiFR8ICAVNERIQNC8tLhASFAMBEBIQMzArMBASFAOUFR8HBwZN//8AAAGsAMICygEGArQAsAAJsQABuP+wsDUrAP///8EBngFxAsQBBgKyAKYACbEAArj/prA1KwAAAQBG/18A6wLnAAMAE0AQAAEBAF8AAAAtAU4REAIJGCsTMxEjRqWlAuf8eAACAEb/XwDrAucAAwAHABxAGQACAAMCA2MAAQEAXwAAAC0BThERERAECRorEzMRIxUzESNGpaWlpQLn/p/G/p8AAgBGAAAB1gKwAAkADQAqQCcHBgUCAQAGAQABTAABAQBfAAAAK00AAgIDXwADAywDThERFBMECRorEzU3NzMXFxUHIxczAyNGhQpyCoWFhgGECXIBpnIKjo4Kcgoo/owAAgAZ//cCQAL0ABAAJQCNQA8cGhgEAwUEABkSAgIEAkxLsAlQWEAbAwEBAAAEAQBpBQEEAgIEVwUBBAQCYQACBAJRG0uwClBYQCIAAwEAAQMAgAABAAAEAQBpBQEEAgIEVwUBBAQCYQACBAJRG0AbAwEBAAAEAQBpBQEEAgIEVwUBBAQCYQACBAJRWVlADRERESURJBk1EhoGBhorAAYHBzU2NjU0JiYjIzUWFhUDFwYGIyImJwcnNjcRNDY3AxUUFjMCQFxnJx4XBBMVCHdyXggviCRJTgIyKz4fT2kBEh8B2Zk8FqoXNSUnJBSMAVFm/kR5BwlOPhaAHhABJlJcA/30JCIgAAIARgAAAdYCsAAJABUANUAyBwYFAgEABgEAExIREA0MCwoIAwICTAABAQBfAAAAK00AAgIDXwADAywDThUVFBMECRorEzU3NzMXFxUHIxEnNTc1MxUXFQcHI0aFCnIKhYWGhYWGhYUKcgGmcgqOjgpyCv7yCnIKYGAKcgqOAAYAQQAABC8CsAAFAAkADQAiADkAPQDTQBUKAAIFADEGAggECwEGCAkDAgEKBExLsApQWEAyAgEABQCFAAcFBAUHBIAABQAECAUEaQAIDAkCBgoIBmkACgEBClcACgoBXwsDAgEKAU8bS7ALUFhAKwIBAAUAhQcBBQAECAUEaQAIDAkCBgoIBmkACgEBClcACgoBXwsDAgEKAU8bQDICAQAFAIUABwUEBQcEgAAFAAQIBQRpAAgMCQIGCggGaQAKAQEKVwAKCgFfCwMCAQoBT1lZQBYjIz08OzojOSM4FxsaIhUUEhIRDQYfKxM1MwEVIxM1MxEBExUjASYmJyYjIzUzMhYXFhYVFAYHBgYHBiYnJiY1NDY3NjY3FRQXFBYXFjMzFSMHIRUhQcgBbscJvv3Kvr4DZQEICAwMBARARxIQCQcMDjgwaUcREQkIDA42MQEICQoNBASlAU/+sQKUHP1tHQHJ5/3AAdH+p+gBpBISAwJnFBcVQz46PhUXFwMBFBYVQj44QBUXGAO/JQsSEgICZzKBAAACAEb/9AI/AgwAEQAhAEhARR4LAgIDCgEBAhUUAgUAA0wRAQEBSwADAAIBAwJpAAEAAAUBAGcGAQUEBAVZBgEFBQRhAAQFBFESEhIhEiAoIyMREQcGGysBFSE1MzU0JiMiBzU2MzIWFhcCNjcXBiMiJiY1NDY3AxQzAj/+yKY2MiYYHiA/bUcGt1ItFlWCSXNDTUMBdgEoLCxmLiMILwYzZ0r++Co1FnU+eVVcfhz+fFIAAwBIAAADAQK6AAMAGQAnADpANwAAAAIEAAJpAAQHAQUDBAVpBgEDAQEDWQYBAwMBXwABAwFPGhoEBBonGiYhHwQZBBgrERAIBhkrEyERISQ2NzY1NTQmJyYmIyIHBgYVFRQXFjMmJjU1NDYzMhYVFRQGI0gCuf1HAYtKGjMaGRpKLVo3GRw1N1oaJCQaGiMjGgK6/UaHHBkyTkIlQxgZHDUZQiVCTTM1XyMZdhkjIxl2GSP//wAAAhoAuAM8AAICXbcAAAL/wQH4AXEDHgAFAAsACLULCAUCAjIrEzc3FwcHJTc3FwcHmyUMpQ1L/qgSCKgJOQIZ1TAtL8oa1zEeMND//wAAAlEBHQLmAAIC4uYAAAEAAAH8AMIDGgAFAAazBQIBMisRNzcXBwcSCKgJOQIS1zEeMND///6DAmP/7ALaAAMC3v5vAAD///6DAmP/7QOQAAMDRf5vAAD///6DAmP/7QOQAAMDQP5vAAD///6DAmP/7AORAAMDQv5vAAD///6DAmP/7AN+AAMDR/5vAAD///9TAmP/7ALaAAMC3/8/AAD///6DAmP/7AN+AAMDSf5vAAD///7dAlT/7ALnAAMC4P7JAAD///7UAlT/4wLnAAMC2f7AAAD///5SAmP/7ALaAAMC4f4+AAAAAf8EAg3/swMkABEAIkAfAAIAAQACAWcAAAMDAFkAAAADYQADAANRFhEWEAQJGisDMjY3NjY1NSM1MxUUBgcGBiP8FRgHBgQ+rwsRE0Q8Ak0GBwcUFA2Oazc+EhQR///+kQJU//YC5wADAt3+hwAA///+kQJU//YC5wADAtv+hwAA///+uQJQ//YC5wADAtr+rwAA///+zAJQ//0DQwADAuT+yQAA///+zAJQABgD7AADA1D+yQAA///+WQJD/+wC5wADAuX+RQAA///+WQJD/+wDiQADA1L+RQAA///+yQJR/+YC5gADAuL+rwAA////QQI6/+wDRgADA03/LQAA///+UgJj/+wC2gADAz7+PgAA///+uQJQ//YC5wADAyj+rwAA////PAJU/+wDZQADAzv/KAAA////PAJU/+wDZQADAz3/KAAA///+9gGc/9gCMwADA0z+rwAA////Rv86/9//sQADA0v/KAAA///+g/88/+z/swADA0T+bwAA////PP6h/+z/sgADAzz/KAAA////Hf9D/+wACAADAtz/CQAA////Gf88/+kAEQADAuP/CQAA///+uf8c//b/swADAyr+rwAA///+z/8d/+z/sgADA0/+uwAAAAH+VQDn/74BfAADACCxBmREQBUAAAEBAFcAAAABXwABAAFPERACCRgrsQYARAEhFSH+VQFp/pcBfJUAAAH9WwDn//ABfAADACCxBmREQBUAAAEBAFcAAAABXwABAAFPERACCRgrsQYARAEhFSH9WwKV/WsBfJUAAAH+ZQCD/84B4AADAAazAwEBMisBJRUF/mUBaf6XARjIlcgAAAL9pwA4/58CtQADAAcAKrEGZERAHwAAAAECAAFnAAIDAwJXAAICA18AAwIDTxERERAECRorsQYARAEzByMDMwcj/v6hOaDmojugArVn/lBmAAABABQCVAEjAucABQAgsQZkREAVAAABAQBXAAAAAV8AAQABTxIRAgkYK7EGAEQTNzMVByMUWLeHiAJZjgWOAAEACgJQAUcC5wAXAC6xBmREQCMCAQABAIUAAQMDAVkAAQEDYQQBAwEDUQAAABcAFhQkFQUJGSuxBgBEEiYnJiY1MxQWFxYzMjc2NjUzFAYHBgYjdj4SEAxnAgUMJCQNBQJnDBATPjICUBUWEzQlDxEGDw8GEQ8lNBMWFQABAAoCVAFvAucACAApsQZkREAeAwECAAFMAQEAAgIAVwEBAAACXwACAAJPEhIgAwkZK7EGAEQTNTMXNzMVByMKezc4e1uvAt8IS0sIiwABABT/QwDjAAgABQAgsQZkREAVAAABAQBXAAAAAV8AAQABTxIRAgkYK7EGAEQXNzMVByMUUX4irbjABcAAAAEACgJUAW8C5wAIACixBmREQB0GAQEAAUwAAAEBAFcAAAABXwIBAQABTxIhEQMJGSuxBgBEEzczFxUjJwcjCluvW3s4N3sCXIuLCEtLAAIAFAJjAX0C2gADAAcAJbEGZERAGgIBAAEBAFcCAQAAAV8DAQEAAU8REREQBAkaK7EGAEQTMxUjNzMVIxSZmdCZmQLad3d3AAEAFAJjAK0C2gADACCxBmREQBUAAAEBAFcAAAABXwABAAFPERACCRgrsQYARBMzFSMUmZkC2ncAAQAUAlQBIwLnAAUAILEGZERAFQAAAQEAVwAAAAFfAAEAAU8hIAIJGCuxBgBEEzUzFxUjFLdYiALiBY4FAAACABQCYwGuAtoABQALACWxBmREQBoCAQABAQBXAgEAAAFfAwEBAAFPEhISEQQJGiuxBgBEEzczFQcjNzczFQcjFEeVbm6+SJRtbwJncwRzBHMEcwABABoCUQE3AuYAAwAgsQZkREAVAAABAQBXAAAAAV8AAQABTxEQAgkYK7EGAEQTIRUhGgEd/uMC5pUAAQAQ/zwA4AARABUAMbEGZERAJhIBAQABTAcGAgBKAAABAQBZAAAAAWECAQEAAVEAAAAVABMtAwkXK7EGAEQWJyY1NDY3FwYHBhUUFjMzMjcVBwYjTCAcKByLFxIWFBsLBAIYHhXEGhYoHEcaDQwUFhQQEgFZAgIAAgADAlABNANDABYALQA7sQZkREAwIgEAARYBAwICTAABAAACAQBpAAIDAwJZAAICA2EEAQMCA1EXFxctFywrKSEmBQkYK7EGAEQTNCYnJicmIyM1MzIWFxYWFRQGBwYGBwYmJyYmNTQ2NzY2NxUUFhcWFxYzMxUj0gIFBQsOEgwMNj4PDggFCQooImw+Dw4IBQkKKCICBQULDhENDQLJEREFBQMCSQ8PDiokHyUODxIEAg8PDiojHyUODxIEdxEQBQYCAkkAAQAUAkMBpwLnAB4AjrEGZERLsBVQWEAcAAEABAABcgIBAAAEAwAEaQIBAAADYQUBAwADURtLsCBQWEAlAAEABAIBcgAFAwQFcQACAAMCVwAAAAQDAARpAAICA2EAAwIDURtAJQABAAQAAQSAAAUDBYYAAgADAlcAAAAEAwAEaQACAgNhAAMCA1FZWUAJEiMkEiUkBgkcK7EGAEQSNjc2NjMyFxYWFxYzMjY1MxQGBwYjIicnJiMiBhUjFAQJCikkLzoOFwkXDRAHXQQIE0UvOi4TERAHXQJxMBIUFA4DBAIFEBgtMBIpDgoEDxkA///+gwLv/+wDZgADAwz+bwAA///+gwLv/+0EHAADA0b+bwAA///+gwLv/+0EHAADA0H+bwAA///+gwLv/+wEHQADA0P+bwAA///+gwLv/+wECgADA0j+bwAA////UwLv/+wDZgADAw3/PwAA///+gwLv/+wECgADA0r+bwAA///+3QLv/+wDggADAw7+yQAA///+3QLv/+wDggADAwj+yQAA///+UgLv/+wDZgADAw/+PgAA///+pQLuAAoDgQADAwv+rwAA///+pQLuAAoEWQADAzj+rwAA///+pQLuAAoDgQADAwr+rwAA///+uQLv//YDhgADAwn+rwAA///+uQLv//YEZwADAzD+rwAA///+zALv//0D4gADAxL+yQAA///+zALvABgEiwADA1H+yQAA///+WQLv/+wDkwADAxP+RQAA///+WQLv/+wENQADA1P+RQAA///+1ALv//EDhAADAxH+xQAA////QQLv/+wD+wADA07/LQAA///+UgLv/+wDZgADAz/+PgAA///+uQLv//YDhgADAyn+rwAA////PAJU/+wDZQADAzv/KAAAAAH+9gJO/9gC5QAOAB5AGwABAAGFAAACAgBZAAAAAmEAAgACUSUUIAMGGSsBMzI3NjY1MxQGBwYGIyP+9kMkDQUCZwwQEz4yQwKwDwYRDyU0ExYV////Rv86/9//sQADA0v/KAAA///+g/88/+z/swADA0T+bwAA////PP6h/+z/sgADAzz/KAAA////Hf9D/+wACAADAtz/CQAA////Gf88/+kAEQADAuP/CQAA///+uf8c//b/swADAyr+rwAA///+z/8d/+z/sgADA0/+uwAAAAH+ZQCD/84B4AADAAazAwEBMisBJRUF/mUBaf6XARjIlcgAAAL9df/J/9EC5wADAAcAIkAfAAAAAQIAAWcAAgMDAlcAAgIDXwADAgNPEREREAQGGisDMwcjATMHI9ChW6D+8qNWoALnpf4blAAAAQAUAu8BIwOCAAUAGEAVAAABAQBXAAAAAV8AAQABTxIRAgYYKxM3MxUHIxRYt4eIAvSOBY4AAQAKAu8BRwOGABcAJkAjAgEAAQCFAAEDAwFZAAEBA2EEAQMBA1EAAAAXABYUJBUFBhkrEiYnJiY1MxQWFxYzMjc2NjUzFAYHBgYjdj4SEAxnAgUMJCQNBQJnDBATPjIC7xUWEzQlDxEGDw8GEQ8lNBMWFQAB//YC7gFbA4EACABhtQMBAgABTEuwClBYQBYAAQAAAXAAAAICAFcAAAACYAACAAJQG0uwC1BYQBIBAQACAgBXAQEAAAJfAAIAAk8bQBYAAQAAAXAAAAICAFcAAAACYAACAAJQWVm1EhIgAwYZKwM1Mxc3MxUHIwp7Nzh7W68DeQhLSwiLAAH/9gLuAVsDgQAIAGC1BgEBAAFMS7AKUFhAFgACAQECcQAAAQEAVwAAAAFfAAEAAU8bS7ALUFhAEQAAAQEAVwAAAAFfAgEBAAFPG0AWAAIBAQJxAAABAQBXAAAAAV8AAQABT1lZtRIhEQMGGSsDNzMXFSMnByMKW69bezc4ewL2i4sIS0sAAgAUAu8BfQNmAAMABwAdQBoCAQABAQBXAgEAAAFfAwEBAAFPEREREAQGGisTMxUjNzMVIxSZmdCZmQNmd3d3AAEAFALvAK0DZgADABhAFQAAAQEAVwAAAAFfAAEAAU8REAIGGCsTMxUjFJmZA2Z3AAEAFALvASMDggAFABhAFQAAAQEAVwAAAAFfAAEAAU8hIAIGGCsTNTMXFSMUt1iIA30FjgUAAAIAFALvAa4DZgAFAAsAHUAaAgEAAQEAVwIBAAABXwMBAQABTxISEhEEBhorEzczFQcjNzczFQcjFEeVbm6+SJRtbwLzcwRzBHMEcwABABQC7wDhA6IABQAYQBUAAAEBAFcAAAABXwABAAFPEhECBhgrEzczFQcjFCGsTIEC9K4FrgABAA8C7wEsA4QAAwAYQBUAAAEBAFcAAAABXwABAAFPERACBhgrEyEVIQ8BHf7jA4SVAAIAAwLvATQD4gAWAC0AM0AwIgEAARYBAwICTAABAAACAQBpAAIDAwJZAAICA2EEAQMCA1EXFxctFywrKSEmBQYYKxM0JicmJyYjIzUzMhYXFhYVFAYHBgYHBiYnJiY1NDY3NjY3FRQWFxYXFjMzFSPSAgUFCw4SDAw2Pg8OCAUJCigibD4PDggFCQooIgIFBQsOEQ0NA2gREQUFAwJJDw8OKiQfJQ4PEgQCDw8OKiMfJQ4PEgR3ERAFBgICSQABABQC7wGnA5MAHgBdS7AgUFhAJAACAAECcAAFAwQFcQABBAMBWQAAAAQDAARpAAEBA2IAAwEDUhtAIgACAAKFAAUDBYYAAQQDAVkAAAAEAwAEaQABAQNiAAMBA1JZQAkSIyQSJSQGBhwrEjY3NjYzMhcWFhcWMzI2NTMUBgcGIyInJyYjIgYVIxQECQopJC86DhcJFw0QB10ECBNFLzouExEQB10DHTASFBQOAwQCBRAYLTASKQ4KBA8Z////HwLv/+wDogADAxD/CwAA////HwJU/+wDBwADAxb/CwAAAAEAFAJUAOEDBwAFABhAFQAAAQEAVwAAAAFfAAEAAU8SEQIGGCsTNzMVByMUIaxMgQJZrgWu///+uQJQAAsDiAADAyv+rwAA///+owJQ//UDiAADAy3+rwAA///+uQJQ//YDyAADAy/+rwAA///+uQJQ//gDoQADAzH+rwAA///+pAJUAAsDdAADAzP+rwAA///+pAJUAAsDdAADAzX+rwAA///+pQJUAAoDvwADAzf+rwAA///+pAJUAAkDhAADAzn+rwAA///+uQLvAAsEJwADAyz+rwAA///+owLv//UEJwADAy7+rwAA///+uQLv//gEQAADAzL+rwAA///+pALuAAsEDgADAzT+rwAA///+pALuAAsEDgADAzb+rwAA///+pALuAAkEHgADAzr+rwAAAAEACgJQAUcC5wAXACixBmREQB0DAQECAYYAAAICAFkAAAACYQACAAJRFCQVJAQJGiuxBgBEEjY3NjYzMhYXFhYVIzQmJyYjIgcGBhUjCgwQEz4yMj4SEAxnAgUMJCQNBQJnAnU0ExYVFRYTNCUPEQYPDwYRDwABAAoC7wFHA4YAFwAgQB0DAQECAYYAAAICAFkAAAACYQACAAJRFCQVJAQGGisSNjc2NjMyFhcWFhUjNCYnJiMiBwYGFSMKDBATPjIyPhIQDGcCBQwkJA0FAmcDFDQTFhUVFhM0JQ8RBg8PBhEPAAEACv8cAUf/swAXAC6xBmREQCMCAQABAIUAAQMDAVkAAQEDYQQBAwEDUQAAABcAFhQkFQUJGSuxBgBEFiYnJiY1MxQWFxYzMjc2NjUzFAYHBgYjdj4SEAxnAgUMJCQNBQJnDBATPjLkFRYTNCUPEQYPDwYRDyU0ExYVAAACAAoCUAFcA4gABQAdADNAMAQBAgEDAQIDgAAAAAECAAFnAAMFBQNZAAMDBWEGAQUDBVEGBgYdBhwUJBYSEQcGGysTNzMVByMWJicmJjUzFBYXFjMyNzY2NTMUBgcGBiNfS7J/fhc+EhAMZwIFDCQkDQUCZwwQEz4yAw56BXq5FRYTNCUPEQYPDwYRDyU0ExYV//8ACgLvAVwEJwEHAysAAACfAAixAAKwn7A1KwAC//QCUAFGA4gABQAdADNAMAQBAgEDAQIDgAAAAAECAAFnAAMFBQNZAAMDBWEGAQUDBVEGBgYdBhwUJBYhIAcGGysDNTMXFSMWJicmJjUzFBYXFjMyNzY2NTMUBgcGBiMMskt+Az4TEAxnAgUNJCQMBQJnDBASPjIDgwV6BbkVFhM0JQ8RBg8PBhEPJTQTFhUA////9ALvAUYEJwEHAy0AAACfAAixAAKwn7A1KwACAAoCUAFHA8gAGgAyAG5LsApQWEAoAAIAAwACcgUBAwQAAwR+AAEAAAIBAGkABAYGBFkABAQGYQcBBgQGURtAKQACAAMAAgOABQEDBAADBH4AAQAAAgEAaQAEBgYEWQAEBAZhBwEGBAZRWUAPGxsbMhsxFCQWHREZCAYcKxM0NjY3NjY1NCYjNTYXFhYVFAcGBgcGBhUVIwYmJyYmNTMUFhcWMzI3NjY1MxQGBwYGI4EJEgQJBhUkPhwXFgoDEQUFCUsLPhIQDGcCBQwkJA0FAmcMEBM+MgMgDQ4OAwgJCw8HSAIJBx8dJhEGDQQECgcbrhUWEzQlDxEGDw8GEQ8lNBMWFQAAAgAKAu8BRwRnABoAMgBuS7AKUFhAKAACAAMAAnIFAQMEAAMEfgABAAACAQBpAAQGBgRZAAQEBmEHAQYEBlEbQCkAAgADAAIDgAUBAwQAAwR+AAEAAAIBAGkABAYGBFkABAQGYQcBBgQGUVlADxsbGzIbMRQkFh0RGQgGHCsTNDY2NzY2NTQmIzU2FxYWFRQHBgYHBgYVFSMGJicmJjUzFBYXFjMyNzY2NTMUBgcGBiOBCRIECQYVJD4cFxYKAxEFBQlLCz4SEAxnAgUMJCQNBQJnDBATPjIDvw0ODgMICQsPB0gCCQcfHSYRBg0EBAoHG64VFhM0JQ8RBg8PBhEPJTQTFhUAAAIACgJQAUkDoQAfADcAk7UGAQEAAUxLsCZQWEA2AAIAAQJwAAUDBgQFcggBBgcDBgd+AAAABAMABGkAAQADBQEDagAHCQkHWQAHBwlhCgEJBwlRG0A2AAIAAoUABQMGAwUGgAgBBgcDBgd+AAAABAMABGkAAQADBQEDagAHCQkHWQAHBwlhCgEJBwlRWUASICAgNyA2FCQWEiYkEiQjCwYfKxI2NzYzMhcmFxYzMjY1MxQGBwYjIiYnJiYnJiMiBhUjFiYnJiY1MxQWFxYzMjc2NjUzFAYHBgYjCgMHDzkeMgcmEA4NBk0DBw86EykUCQ4IFggNBkxsPhIQDGcCBQwkJA0FAmcMEBM+MgM/KQ4hCwIKBA0UJSgPIgcFAgQCBA0UyhUWEzQlDxEGDw8GEQ8lNBMWFQACAAoC7wFJBEAAHwA3AJO1BgEBAAFMS7AmUFhANgACAAECcAAFAwYEBXIIAQYHAwYHfgAAAAQDAARpAAEAAwUBA2oABwkJB1kABwcJYQoBCQcJURtANgACAAKFAAUDBgMFBoAIAQYHAwYHfgAAAAQDAARpAAEAAwUBA2oABwkJB1kABwcJYQoBCQcJUVlAEiAgIDcgNhQkFhImJBIkIwsGHysSNjc2MzIXJhcWMzI2NTMUBgcGIyImJyYmJyYjIgYVIxYmJyYmNTMUFhcWMzI3NjY1MxQGBwYGIwoDBw85HjIHJhAODQZNAwcPOhMpFAkOCBYIDQZMbD4SEAxnAgUMJCQNBQJnDBATPjID3ikOIQsCCgQNFCUoDyIHBQIEAgQNFMoVFhM0JQ8RBg8PBhEPJTQTFhUAAv/1AlQBXAN0AAUADgB6tQwBAwIBTEuwClBYQB4ABAMDBHEAAAABAgABZwACAwMCVwACAgNfAAMCA08bS7ALUFhAGQAAAAECAAFnAAIDAwJXAAICA18EAQMCA08bQB4ABAMDBHEAAAABAgABZwACAwMCVwACAgNfAAMCA09ZWbcSIRISEQUGGysTNzMVByMHNzMXFSMnByNfS7J/fmpbr1uAMzKAAvp6BXqZd3cINzcAAAL/9QLuAVwEDgAFAA4AerUMAQMCAUxLsApQWEAeAAQDAwRxAAAAAQIAAWcAAgMDAlcAAgIDXwADAgNPG0uwC1BYQBkAAAABAgABZwACAwMCVwACAgNfBAEDAgNPG0AeAAQDAwRxAAAAAQIAAWcAAgMDAlcAAgIDXwADAgNPWVm3EiESEhEFBhsrEzczFQcjBzczFxUjJwcjX0uyf35qW69bgDMygAOUegV6mXd3CDc3AAAC//UCVAFcA3QABQAOAHq1DAEDAgFMS7AKUFhAHgAEAwMEcQAAAAECAAFnAAIDAwJXAAICA18AAwIDTxtLsAtQWEAZAAAAAQIAAWcAAgMDAlcAAgIDXwQBAwIDTxtAHgAEAwMEcQAAAAECAAFnAAIDAwJXAAICA18AAwIDT1lZtxIhEiEgBQYbKwM1MxcVIwc3MxcVIycHIwuyS359W69bgDIzgANvBXoFmXd3CDc3AAL/9QLuAVwEDgAFAA4AerUMAQMCAUxLsApQWEAeAAQDAwRxAAAAAQIAAWcAAgMDAlcAAgIDXwADAgNPG0uwC1BYQBkAAAABAgABZwACAwMCVwACAgNfBAEDAgNPG0AeAAQDAwRxAAAAAQIAAWcAAgMDAlcAAgIDXwADAgNPWVm3EiESISAFBhsrAzUzFxUjBzczFxUjJwcjC7JLfn1br1uAMjOABAkFegWZd3cINzcAAv/2AlQBWwO/ABoAIwCTtSEBBAMBTEuwClBYQCUAAgADAAJyAAUEBAVxAAEAAAIBAGkAAwQEA1cAAwMEXwAEAwRPG0uwC1BYQCEAAgADAAIDgAABAAACAQBpAAMEBANXAAMDBF8FAQQDBE8bQCYAAgADAAIDgAAFBAQFcQABAAACAQBpAAMEBANXAAMDBF8ABAMET1lZQAkSIRIdERkGBhwrEzQ2Njc2NjU0JiM1NhcWFhUUBwYGBwYGFRUjBzczFxUjJwcjgQkSBAkGFSQ+HBcWCgMRBQUJS4tbr1uAMjOAAxcNDg4DCAkLDwdIAgkHHx0mEQYNBAQKBxuZd3cINzcAAv/2Au4BWwRZABoAIwCTtSEBBAMBTEuwClBYQCUAAgADAAJyAAUEBAVxAAEAAAIBAGkAAwQEA1cAAwMEXwAEAwRPG0uwC1BYQCEAAgADAAIDgAABAAACAQBpAAMEBANXAAMDBF8FAQQDBE8bQCYAAgADAAIDgAAFBAQFcQABAAACAQBpAAMEBANXAAMDBF8ABAMET1lZQAkSIRIdERkGBhwrEzQ2Njc2NjU0JiM1NhcWFhUUBwYGBwYGFRUjBzczFxUjJwcjgQkSBAkGFSQ+HBcWCgMRBQUJS4tbr1uAMjOAA7ENDg4DCAkLDwdIAgkHHx0mEQYNBAQKBxuZd3cINzcAAv/1AlQBWgOEAB8AKAD/QAoGAQEAJgEHBgJMS7AKUFhAMwACAAECcAAFAwYEBXIACAcHCHEAAAAEAwAEaQABAAMFAQNqAAYHBwZXAAYGB18ABwYHTxtLsAtQWEAuAAIAAQJwAAUDBgQFcgAAAAQDAARpAAEAAwUBA2oABgcHBlcABgYHXwgBBwYHTxtLsCZQWEAzAAIAAQJwAAUDBgQFcgAIBwcIcQAAAAQDAARpAAEAAwUBA2oABgcHBlcABgYHXwAHBgdPG0AzAAIAAoUABQMGAwUGgAAIBwcIcQAAAAQDAARpAAEAAwUBA2oABgcHBlcABgYHXwAHBgdPWVlZQAwSIRISJiQSJCMJBh8rEjY3NjMyFyYXFjMyNjUzFAYHBiMiJicmJicmIyIGFSMHNzMXFSMnByMMAwcPOR4yByYQDg0GTQMHDzoTKRQJDggWCA0GTBdbr1uAMzKAAyIpDiELAgoEDRQlKA8iBwUCBAIEDRShd3cINzcAAv/1Au4BWgQeAB8AKAD6tSYBBwYBTEuwClBYQDMAAgABAnAABQMGBAVyAAgHBwhxAAAABAMABGkAAQADBQEDagAGBwcGVwAGBgdfAAcGB08bS7ALUFhALgACAAECcAAFAwYEBXIAAAAEAwAEaQABAAMFAQNqAAYHBwZXAAYGB18IAQcGB08bS7AmUFhAMwACAAECcAAFAwYEBXIACAcHCHEAAAAEAwAEaQABAAMFAQNqAAYHBwZXAAYGB18ABwYHTxtAMwACAAKFAAUDBgMFBoAACAcHCHEAAAAEAwAEaQABAAMFAQNqAAYHBwZXAAYGB18ABwYHT1lZWUAMEiESEiYkEiQjCQYfKxI2NzYzMhcmFxYzMjY1MxQGBwYjIiYnJiYnJiMiBhUjBzczFxUjJwcjDAMHDzkfMQcmEA4NBk0DBw86EykUCQ4IFggNBkwXW69bgDMygAO8KQ4hCwEJBA0UJSgPIgcFAgQCBA0UoXd3CDc3AAABABQCVADEA2UAEAAqsQZkREAfAAAAAQIAAWkAAgMDAlcAAgIDXwADAgNPERURFQQJGiuxBgBEEzQ2NzY2MxUiBwYGFRUzFSMUDBESRTwoDAYFP7ACujY/EhMRPw0HFhINiQAAAQAU/qEAxP+yABAAKrEGZERAHwACAAEAAgFnAAADAwBZAAAAA2EAAwADURYRFRAECRorsQYARBMyNzY2NTUjNTMVFAYHBgYjFCgMBgU/sAwREkU8/uANBxYSDYlmNj8SExEAAAEAFAJUAMQDZQAQACqxBmREQB8AAgABAAIBZwAAAwMAWQAAAANhAAMAA1EWERUQBAkaK7EGAEQTMjc2NjU1IzUzFRQGBwYGIxQoDAYFP7AMERJFPAKTDQcWEg2JZjY/EhMRAAACABQCYwGuAtoABQALACWxBmREQBoCAQABAQBXAgEAAAFfAwEBAAFPISEhIAQJGiuxBgBEEzUzFxUjNzUzFxUjFJRIb1GVR24C1gRzBHMEcwQAAgAUAu8BrgNmAAUACwAdQBoCAQABAQBXAgEAAAFfAwEBAAFPISEhIAQGGisTNTMXFSM3NTMXFSMUlEhvUZVHbgNiBHMEcwRzBAADABQCYwF+A5AABQAJAA0AJ0AkAAAAAQIAAWcEAQIDAwJXBAECAgNfBQEDAgNPERERERIRBgYcKxM3MxUHIwczFSM3MxUjgUuyf35tmZnQmZkDFnoFejd3d3cAAAMAFALvAX4EHAAFAAkADQAnQCQAAAABAgABZwQBAgMDAlcEAQICA18FAQMCA08REREREhEGBhwrEzczFQcjBzMVIzczFSOBS7J/fm2ZmdCZmQOiegV6N3d3dwAAAwAUAmMBfQORAAgADAAQAIa1AwECAAFMS7AKUFhAIQABAAABcAAAAAIDAAJoBQEDBAQDVwUBAwMEXwYBBAMETxtLsAtQWEAcAQEAAAIDAAJnBQEDBAQDVwUBAwMEXwYBBAMETxtAIQABAAABcAAAAAIDAAJoBQEDBAQDVwUBAwMEXwYBBAMET1lZQAoREREREhIgBwYdKxM1Mxc3MxUHIwczFSM3MxUjFoAzMoBbr12ZmdCZmQOJCDc3CHc4d3d3AAADABQC7wF9BB0ACAAMABAAhrUDAQIAAUxLsApQWEAhAAEAAAFwAAAAAgMAAmgFAQMEBANXBQEDAwRfBgEEAwRPG0uwC1BYQBwBAQAAAgMAAmcFAQMEBANXBQEDAwRfBgEEAwRPG0AhAAEAAAFwAAAAAgMAAmgFAQMEBANXBQEDAwRfBgEEAwRPWVlAChERERESEiAHBh0rEzUzFzczFQcjBzMVIzczFSMWgDMygFuvXZmZ0JmZBBUINzcIdzh3d3cAAAIAFP88AX3/swADAAcAJbEGZERAGgIBAAEBAFcCAQAAAV8DAQEAAU8REREQBAkaK7EGAEQXMxUjNzMVIxSZmdCZmU13d3cAAAMAFAJjAX4DkAAFAAkADQAnQCQAAAABAgABZwQBAgMDAlcEAQICA18FAQMCA08RERERISAGBhwrEzUzFxUjBzMVIzczFSMUskt+fpmZ0JmZA4sFegU3d3d3AAMAFALvAX4EHAAFAAkADQAnQCQAAAABAgABZwQBAgMDAlcEAQICA18FAQMCA08RERERISAGBhwrEzUzFxUjBzMVIzczFSMUskt+fpmZ0JmZBBcFegU3d3d3AAMAFAJjAX0DfgADAAcACwAnQCQAAAABAgABZwQBAgMDAlcEAQICA18FAQMCA08RERERERAGBhwrEyEVIRUzFSM3MxUjFAFp/peZmdCZmQN+dy13d3cAAwAUAu8BfQQKAAMABwALACdAJAAAAAECAAFnBAECAwMCVwQBAgIDXwUBAwIDTxEREREREAYGHCsTIRUhFTMVIzczFSMUAWn+l5mZ0JmZBAp3LXd3dwACABQCYwF9A34AAwAHACJAHwAAAAECAAFnAAIDAwJXAAICA18AAwIDTxERERAEBhorEyEVIRczFSMUAWn+l2mZmQN+dy13AAACABQC7wF9BAoAAwAHACJAHwAAAAECAAFnAAIDAwJXAAICA18AAwIDTxERERAEBhorEyEVIRczFSMUAWn+l2mZmQQKdy13AAABAB7/OgC3/7EAAwAgsQZkREAVAAABAQBXAAAAAV8AAQABTxEQAgkYK7EGAEQXMxUjHpmZT3cAAAEARwGcASkCMwAOACaxBmREQBsAAQABhQAAAgIAWQAAAAJhAAIAAlElFCADCRkrsQYARBMzMjc2NjUzFAYHBgYjI0dDJA0FAmcMEBM+MkMB/g8GEQ8lNBMWFQAAAQAUAjoAvwNGABsAJrEGZERAGwACAAKGAAEAAAFZAAEBAGEAAAEAUR4RGQMJGSuxBgBEEzQ2NzY2NTQmJiM1NhcWFRQGBwYGBw4CFRUjIg4ZDAgMHSBQIjkGBwYVBAELBl8CZRIRFAkNDhAOBGICCxJKICALCBIDAQkLBiIAAQAUAu8AvwP7ABsAHkAbAAIAAoYAAQAAAVkAAQEAYQAAAQBRHhEZAwYZKxM0Njc2NjU0JiYjNTYXFhUUBgcGBgcOAhUVIyIOGQwIDB0gUCI5BgcGFQQBCwZfAxoSERQJDQ4QDgRiAgsSSiAgCwgSAwEJCwYiAAEAFP8dATH/sgADACCxBmREQBUAAAEBAFcAAAABXwABAAFPERACCRgrsQYARBchFSEUAR3+406VAAADAAMCUAFPA+wABQAcADMAPUA6KAECAxwBBQQCTAAAAAEDAAFnAAMAAgQDAmkABAUFBFkABAQFYQYBBQQFUR0dHTMdMjEvIScSEQcGGisTNzMVByMXNCYnJicmIyM1MzIWFxYWFRQGBwYGBwYmJyYmNTQ2NzY2NxUUFhcWFxYzMxUjUkuyf36AAgUFCw4SDAw2Pg8OCAUJCigibD4PDggFCQooIgIFBQsOEQ0NA3J6BXqkEREFBQMCSQ8PDiokHyUODxIEAg8PDiojHyUODxIEdxEQBQYCAkkAAAMAAwLvAU8EiwAFABwAMwA9QDooAQIDHAEFBAJMAAAAAQMAAWcAAwACBAMCaQAEBQUEWQAEBAVhBgEFBAVRHR0dMx0yMS8hJxIRBwYaKxM3MxUHIxc0JicmJyYjIzUzMhYXFhYVFAYHBgYHBiYnJiY1NDY3NjY3FRQWFxYXFjMzFSNSS7J/foACBQULDhIMDDY+Dw4IBQkKKCJsPg8OCAUJCigiAgUFCw4RDQ0EEXoFeqQREQUFAwJJDw8OKiQfJQ4PEgQCDw8OKiMfJQ4PEgR3ERAFBgICSQAAAgAUAkMBpwOJAAMAIgBzS7AgUFhALQAEAQIDBHIABwUGB3EAAAABBAABZwADBgUDWQACAAYFAgZpAAMDBWIABQMFUhtALQAEAQIBBAKAAAcFB4YAAAABBAABZwADBgUDWQACAAYFAgZpAAMDBWIABQMFUllACxIjJBIlJREQCAYeKxMhFSEGNjc2NjMyFxYWFxYzMjY1MxQGBwYjIicnJiMiBhUjKQFp/pcVBAkKKSQvOg4XCRcNEAddBAgTRS86LhMREAddA4l3oTASFBQOAwQCBRAYLTASKQ4KBA8ZAAACABQC7wGnBDUAAwAiAHNLsCBQWEAtAAQBAgMEcgAHBQYHcQAAAAEEAAFnAAMGBQNZAAIABgUCBmkAAwMFYgAFAwVSG0AtAAQBAgEEAoAABwUHhgAAAAEEAAFnAAMGBQNZAAIABgUCBmkAAwMFYgAFAwVSWUALEiMkEiUlERAIBh4rEyEVIQY2NzY2MzIXFhYXFjMyNjUzFAYHBiMiJycmIyIGFSMpAWn+lxUECQopJC86DhcJFw0QB10ECBNFLzouExEQB10ENXehMBIUFA4DBAIFEBgtMBIpDgoEDxkAAAAAAQAAA1QAhgAHAGwABgACACgAVACNAAAAmg4VAAQABAAAAHwAfAB8AHwAqwC3AMMAzwDfAOsA9wEDAQ8BGwEnATcBQwFPAVsBZwFzAX8BiwGXAaMBrwIDAg8CGwInAnMCfwLeA44DmgOmBHwEiASUBOYE9gVeBWoFcgV+BbEFvQXJBdUF4QXtBf0GCQYVBiEGLQY5BkUGUQZdBmkGdQaBBt0G6QcTB6gHtAfAB8wH2AfkCA0ISwhXCGMIeQiFCJEInQipCLUIwQjNCNkI5QjxCP0JCQkVCVIJXgmQCZwJwwnPCe8J+woHChkKJQo2CkIKdgqtCtwK6Ar0CwALDAteC6MLrwu7DCgMNAxADEwMWAxkDHQMgAyMDJgMpAywDLwMyAzUDOAM7A2UDaANrA24DcQN0A3cDegN9A6BDv4PCg8WDyIPuA//EEcQtxEEERARHBEoETQRQBG5EcUR0RHjEe8R+xIHEpcS/xMxE38TixOdE6kTtRP/FAsUFxQjFC8UOxRHFFMUXxRrFHcUgxSPFJsVABUMFRgVJBUwFTwVSBVUFWAVzBXYFeQWGxZtFnkWhRaRFp0WyBb4FwQXEBccFygXNBdAF0wXWBelF7EXvRfJF9UX4RftF/kYBRgRGB0YKRg1GEEYTRjwGPwZCBkUGSQZMBk8GUgZVBlgGWwZfBmIGZQZoBmsGbgZxBnQGdwZ6Bn0GsMazxrbGuccHBwoHJgc6xz3HQMdbh16HYYd+B5xHoMfCB8UH5Ifnh+qH7Yfwh/OH94f6h/2IAIgDiAaICYgMiA+IEogViBiIP4hCiGLIcoibiJ6IoYikiKeIqoi6CM6I0sjVyN4I44jmiOmI7IjviPKI9Yj4iPuI/okBiQSJB4kKiRzJH8ktiThJO0lFiUiJUklXyVwJYIljiWeJaol0iZCJpompiaxJr0mySc9J7EnvSfJKCQoMCg8KEgoVChgKHAofCiIKJQooCisKLgoxCjQKNwo6Cl4KYQpkCmcKagptCnAKcwp2CpSKtwq6Cr0KwAr9ixxLOMtXy2kLbAtvC3ILdQt4C5vLnsuhy6ZLqUusS8mL2IvoC/4MAQwFjAiMC4wijCWMKIwrjC6MMYw0jDeMOow9jECMQ4xGjEmMZYxojGuMboxxjHSMd4x6jH2MnsyhzKTMrQy6TL1MwEzDTMZM0QzpDOwM7wzyDPaM+Yz8jP+NAo0ODRENFA0XDRoNHQ0gDSMNJg0pDSwNLw0yDTUNOA1RjVSNV41yzYUNpk29TdQN3s35DggOE04XDjGOOQ5Rjm6OfA6VDrbOxU7szw2PD48RjxOPFY8XjxmPG48djx+PIY87j0OPWw95z4gPrg/OT9kP9lAVkBeQI1AlUCdQKVArUC1QL1AxUDNQTNBO0FpQXFBeUGBQYlBkUGZQaFBqUIYQidCNkJFQlRCY0JyQoFCkEKfQq5CvULMQttC6kL5QwhDF0MmQzVDRENSQ2BDbkN8Q4pDmEOmQ7RDwkPQRBVEM0SHRO5FOEWJRetGDkZ3RttG80dqR8NI2EjtSRlJOklySZdJyUoLSnNK7UsFSzxLcEv4TBBMJ0xcTJNM/E1jTXtNk03XThdOaU67TupPGk8zTztPVE9tT3VPfU+ZT6ZPs0/AT81P1U//UENQiFDNUPhRI1FRUXlRoVG9UdlSAFIcUjlSW1JbUltSW1K4UxBTb1PnVGlVB1XaVjlWeVbgVxdXale8WANYZFi+WStZkVnhWoFbBltEW0xbZltuW5VbrlvKXB5cQlyvXNRc8F0qXVtdi14uXqVe1F77X5Bf/GBGYE5gVmCFYMZg7GGLYZNin2PKZAJlPGXDZfxmrmfDaIJpO2mHaeNp8Wn/ahVqNWplauhrJ2vybEtspWytbMxs1GznbPBs+W0CbQttFG0dbSZtL204bUFtcG15bYJti22UbZ1tpm2vbbhtwW3KbdNt3G3lbe5t924AbgluEm4bbiRuLW5Lbmlue26kbsNvAW8ob0dvbm+Sb65vzW/3cBRwUHCzcSpxM3E8cUVxTnFXcWBxaXFycXtxhHGNcZZxn3GocbFxunHDccxx1XHecedx8HH5cgJyLHI1cj5yR3JQcllyYnJrcn1yonK9cvdzOnN9c51ztXPQc/Z0EXQqdIl053TwdPl1FHUddSZ1L3U4dUF1SnVTdVx1ZXVudXd1gHWJdZJ1knWSdZJ1zXYEdkJ2i3aZduJ28Hdzd/Z4kXkseYV53no2eo57D3uQfE19CH06fWx9nn3Hfex+Gn5Ifql/Cn8uf1t/iH+zf96AAoAmgEKAcICvgOqBB4F0geGCUYLBAAAAAQAAAAEBBjzXOcNfDzz1AA8D6AAAAADZCOCeAAAAANkvzUr9Jv6eBOoEiwAAAAcAAgAAAAAAAAH0AAAAAAAAAQQAAAEEAAACrwACAq8AAgKvAAICrwACAq8AAgKvAAICrwACAq8AAgKvAAICrwACAq8AAgKvAAICrwACAq8AAgKvAAICrwACAq8AAgKvAAICrwACAq8AAgKvAAICrwACAq8AAgKvAAICrwACAq8AAgPT/+wD0//sAp4AQQI4AC8COAAvAjgALwI4AC8COAAvAjgALwKoAEEFEgBBAqj//wKoAEECqP//BL4AQQJoAEECaABBAmgAQQJoAEECaABBAmgAQQJoAEECaABBAmgAQQJoAEECaAA8AmgAQQJoAEECaABBAmgAQQJoAEECaABBAmgAQQJoAEECaABBAkAAQQKUAC8ClAAvApQALwKUAC8ClAAvApQALwLMAEECzAAdAswAQQLMAEEBSgBBAvMAQQFKAEEBSgAGAUr/8gFK//IBSv+fAUr/7wFKAEEBSgBBAUr/2wFKAEEBSgAGAUoAFgFKADoBSv/aAakAFAGpABQCqwBBAqsAQQIdAEEDxgBBAh0AQQIdAEECHQBBAh0AQQNIAEECHf/4A3UAQQLMAEEEdQBBAswAQQLMAEECzABBAswAQQLM//ED9wBBAswAQQK6AC8CugAvAroALwK6AC8CugAvAroALwK6AC8CugAvAroALwK6AC8CugAvAroALwK6AC8CugAvAroALwK6AC8CugAvAroALwK6AC8CugAvAroALwK6AC8CugAvAroALwK6AC8CugAvAroALwK6AC8CugAvAroALwK6AC8EBwAvAoUAQQKFAEECugAvAqIAQQKiAEECogBBAqIAQQKiAEECogBBAmQAJgJkACYCZAAmAmQAJgJkACYCZAAmAmQAJgMCADsCugAvAkUACQJFAAkCRQAJAkUACQJFAAkCRQAJArIAPgKyAD4CsgA+ArIAPgKyAD4CsgA+ArIAPgKyAD4CsgA+ArIAPgKyAD4CsgA+ArIAPgKyAD4CsgA+ArIAPgKyAD4CsgA+ArIAPgKyAD4CsgA+ArIAPgKyAD4CsgA+ArIAPgKyAD4ClwAFA+QACgPkAAoD5AAKA+QACgPkAAoCpgAFAnn/+wJ5//sCef/7Ann/+wJ5//sCef/7Ann/+wJ5//sCef/7AmoAKAJqACgCagAoAmoAKAJ5//sCef/7Ann/+wJ5//sCef/7Ann/+wI4AC8CzABBAroALwJkACYCagAoAi4AIwIuACMCLgAjAi4AIwIuACMCLgAjAi4AIwIuACMCLgAjAi4AIwIuACMCLgAjAi4AIwIuACMCLgAjAi4AFwIuACMCLgAjAi4AIwIuACMCLgAjAi4AIwIuACMCLgAjAi4AIwIuACMDQgAjA0IAIwJCADkB0QAqAdEAKgHRACoB0QAqAdEAKgHRACoCQgAqAkQAKgKyACoCQgAqBFgAKgItACoCLQAqAi0AKgItACoCLQAqAi0AKgItACoCLQAqAi0AKgItACoCLQAdAi0AKgItACoCLQAqAi0AKgItACoCLQAqAi0AKgItACoCLQAqAi0ALQG1ABICQgAqAkIAKgJCACoCQgAqAkIAKgJCACoCTAA5Akz//AJM/90CTAA5ASsAOQErADkBKwA5ASv/9wEr/+IBK//iASv/kAEr/+ABKwA5ASsAOQEr/9UBKwA5ASv/9wJWADkBKwAHASsAIwEr/8wBK//nASv/5wEr/98CQAA5AkAAOQJAADkBKwA5ASsAOQGaADkBKwA5AcEAOQJWADkBK//fA1kAOQJMADkCTAA5AlgAFwJMADkCTAA5AkwAOQJM/+cDdwA5AkwAOQI8ACoCPAAqAjwAKgI8ACoCPAAqAjwAKgI8ACoCPAAqAjwAKgI8ACoCPAAdAjwAKgI8ACoCPAAqAjwAKgI8ACoCPAAqAjwAKgI8ACoCPAAqAjwAKgI8ACoCPAAqAjwAKgI8ACoCPAAqAjwAKgI8ABwCPAAcAjwAKgI8ACoDXQAqAkIAOQJCADkCQgAqAakAOQGpADkBqQAlAakAOQGp/9MBqQA5AfIAIwHyACMB8gAjAfIAIwHyACMB8gAjAlMAOQG1ABIBqwASAasAEgGrABIBqwASAasAEgGrABICSgA3AkoANwJKADcCSgA3AkoANwJKACECSgA3AkoANwJKADcCSgA3AkoANwJKADcCSgA3AkoANwJKADcCSgA3AkoANwJKADcCSgA3AkoANwJKADcCSgA3AkoANwJKADcCSgA3AkoANwInAAoDTgAOA04ADgNOAA4DTgAOA04ADgI2AAcCTAA5AkwAOQJMADkCTAA5AkwAOQJMADkCTAA5AkwAOQJMADkCFgAtAhYALQIWAC0CFgAtAkwAOQJMADkCTAA5AkwAOQJMADkCTAA5AdEAKgJMADkCPAAqAfIAIwIWAC0DMwASBF4AEgReABIC4AASAuAAEgGmACMBuAAqAeEAMgKvAAICugAvAkoANwJOADkB4QAyApQALwGSAAoCZgAvAmIALwKOAB4CdABBApYALwJAAB8CpAAvApYALwKUAC8BkgAKAmYALwJiAC8CjgAeAnQAQQKWAC8CQAAfAqQALwKWAC8ClAAvAZIACgJIAC8COgAvAmYAHgJMAEECbgAvAhgAHwJ8AC8CbgAvAqgAOQKoAF8CqABOAqgATQKoACsCqABdAqgANwKoAFICqAAxAqgANgKUAC8CqAA5AqgAZgKoAGICqABlAqgAOwKoAGwCqABLAqgAYQKoAEUCqABNApQANAF4AB4BCAAeAW8AJgF9AC0BcgATAWcAKQF6AB4BSAATAYQAHQF6ABoBeAAeAQgAHgFvACYBfQAtAXIAEwFnACkBegAeAUgAEwGEAB0BegAaAXgAHgEIAB4BbwAmAX0ALQFyABMBZwApAXoAHgFIABMBhAAdAXoAGgF4AB4BCAAeAW8AJgF9AC0BcgATAWcAKQF6AB4BSAATAYQAHQF6ABoBvv/EAysAHgMFAB4DUgAtAUoAQAFKAEABSgBAAUoAQAPeAEABawBQAVcAPAIJACMB0gAyAUoAQAGTAEsBxgAqArwALwGt//UBrf/1AWsAUAFhADwCCQAjAgkAMgJYAEACWADMAXYAOgF2ABUBfQAWAX0AFAGPAEEBjwAtAXsALwF7AC8B4AAoA3AAKAJYAC8BewAvAZAAAAF7AC8BewAvAeAAKANwACgBewAvAUAAQQI1AEECNQBBAjUAQQFAAEEBQABBAUoASQIDAA4CAwAtATgADgE4AC0CDQBBASwAQQIBADcCAQA3AQQAAACgAAAAAAAAAdUALQHVAC0B4gAtAqkAJQIbAC4CQgAqAl8AHgIh/6QCQAAAAmwAMAKrAAUCYAApAlwACgK6AC8C4AAKAsAABQLAAAUChQAAAmAAEAJhACgD7gAFAnkADwISAKQCZAAyAb7/xAIcAEYCHABGAgYARgIcAEYCHABGAhwARgIdAEYCHQBHAh0ARgIdAEYCHABGAfEALwHxAC8CHABGAaoABQQNAC4CqQAmAdUAKAK6AC8CrwACAswAQQLMAEEDBgAfAjwAKgJKADcDggAvBBoALwIcACADsABGAuMALwKRACoCsQAiAvIASwLyAEsC8gBLAzQAQQGPAC8BLAAAAhL/wQExAEYBMQBGAhwARgJ3ABkCHABGBF4AQQKFAEYDSQBIALgAAAGw/8EBHQAAAMIAAAAA/oMAAP6DAAD+gwAA/oMAAP6DAAD/UwAA/oMAAP7dAAD+1AAA/lIAAP8EAAD+kQAA/pEAAP65AAD+zAAA/swAAP5ZAAD+WQAA/skAAP9BAAD+UgAA/rkAAP88AAD/PAAA/vYAAP9GAAD+gwAA/zwAAP8dAAD/GQAA/rkAAP7PAAD+VQAA/VsAAP5lAAD9pwE3ABQBUQAKAXkACgD3ABQBeQAKAZEAFADBABQBNwAUAcIAFAFRABoA9wAQATcAAwG7ABQAAP6DAAD+gwAA/oMAAP6DAAD+gwAA/1MAAP6DAAD+3QAA/t0AAP5SAAD+pQAA/qUAAP6lAAD+uQAA/rkAAP7MAAD+zAAA/lkAAP5ZAAD+1AAA/0EAAP5SAAD+uQAA/zwAAP72AAD/RgAA/oMAAP88AAD/HQAA/xkAAP65AAD+zwAA/mUAAP11ATcAFAFRAAoBUf/2AVH/9gGRABQAwQAUATcAFAHCABQA9QAUATsADwE3AAMBuwAUAAD/HwAA/x8A9QAUAAD+uQAA/qMAAP65AAD+uQAA/qQAAP6kAAD+pQAA/qQAAP65AAD+owAA/rkAAP6kAAD+pAAA/qQCWAAAAlgAAAJYAAABUQAKAVEACgFRAAoBUQAKAVEACgFR//QBUf/0AVEACgFRAAoBUQAKAVEACgFR//UBUf/1AVH/9QFR//UBUf/2AVH/9gFR//UBUf/1ANgAFADYABQA2AAUAcIAFAHCABQBkQAUAZEAFAGRABQBkQAUAZEAFAGRABQBkQAUAZEAFAGRABQBkQAUAZEAFADYAB4BUQBHANMAFADTABQBRQAUATcAAwE3AAMBuwAUABQAAAABAAAEb/5JAAAFEv0m/5EE6gABAAAAAAAAAAAAAAAAAAADUwAEAjQBkAAFAAACigJYAAAASwKKAlgAAAFeAFABMgAAAAAFAAAAAAAAACAAAA8AAAABAAAAAAAAAABPTU5JAMAAAP7/BG/+SQAABIsBaCAAAZMAAAAAAf4CsAAAACAAAwAAAAIAAAADAAAAFAADAAEAAAAUAAQHQAAAAMAAgAAGAEAAAAANAC8AOQB+AX8BjwGSAZ0BoQGwAdwB5wHrAhsCLQIzAjcCWQJyAroCvALHAskC3QMEAwwDDwMTAxsDJAMoAy4DMQM4A5QDqQO8A8AeJR5iHm0ehR6eHvkgCSARIBQgGiAeICIgJiAwIDMgOiBEIFIgcCB5IH8giSCZIKEgpCCnIKkgrSCyILUguiC9IRMhFyEiISYhLiICIgYiDyISIhUiGiIeIisiSCJgImUlyifp4P/v/fAA+P/7Av7///8AAAAAAA0AIAAwADoAoAGPAZIBnQGgAa8BxAHmAeoB+gIqAjACNwJZAnICuQK8AsYCyQLYAwADBgMPAxEDGwMjAyYDLgMxAzUDlAOpA7wDwB4kHmIebB6AHp4eoCAJIBAgEyAYIBwgICAmIDAgMiA5IEQgUiBwIHQgfyCAIJkgoSCjIKYgqSCrILEgtSC5ILwhEyEWISIhJiEuIgIiBSIPIhEiFSIZIh4iKyJIImAiZCXKJ+jg/+/98AD4//sB/v///wAB//UAAAGgAAAAAP8UAN7+0gAAAAAAAAAAAAAAAAAAAAD/Bv7G/t4AAP/1AAD/6gAAAAAAAP+6/7n/sv+r/6r/pf+j/6D+N/4j/hH+DgAA4j8AAAAA4gQAAOJe4j/iOgAAAAAAAOIO4mzideIn4ejiLuGy4bLhS+GE4TbhygAA4dHh1AAAAADhtAAAAADhmQAA4YPhbuGB4JcAAOCHAADgbAAA4HPgaOBF4CcAANzT2nwiJhMpEycJsQbFA2kAAQAAAAAAvAAAANgBYAAAAAAAAAMYAxoDHANMA04DUAOSA5gAAAAAAAADmAAAA5gAAAOYA6IDqgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAOeAAADngOgAAADqAAAAAAAAARUBFgEXAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARIAAAAAARGBEoAAARKBEwAAARMAAAAAAAAAAAERgAABEYAAARGAAAAAAAAAAAEQAAAAAAAAAAAAAAAAAAAAAAAAAADAjUCYgI8Am0CmwKfAmMCRQJGAjsCggIxAksCMAI9AjICMwKJAoYCiAI3Ap4ABAAgACEAJwAtAEEAQgBIAEwAXABeAGAAaABpAHIAkgCUAJUAmwCkAKoAxADFAMoAywDUAkkCPgJKApACUQLgAOMA/wEAAQYBCwEgASEBJwErATwBPwFCAUkBSgFTAXMBdQF2AXwBhAGKAaQBpQGqAasBtAJHAqkCSAKOAmYCNgJqAnwCbAJ+AqoCoQLeAqIByAJeAo8CTAKjAuICpgKMAiQCJQLZApoCoAI5AtwCIwHJAl8CLgItAi8COAAWAAUADQAdABQAGwAeACQAOwAuADEAOABWAE4AUQBTACkAcQCBAHMAdgCPAH0ChACNALYAqwCuALAAzACTAYIA9QDkAOwA/ADzAPoA/QEDARkBDAEPARYBNQEtATABMgEHAVIBYgFUAVcBcAFeAoUBbgGWAYsBjgGQAawBdAGuABkA+AAGAOUAGgD5ACIBAQAlAQQAJgEFACMBAgAqAQgAKwEJAD4BHAAvAQ0AOQEXAD8BHQAwAQ4ARQEkAEMBIgBHASYARgElAEoBKQBJASgAWwE7AFkBOQBPAS4AWgE6AFQBLABNATgAXQE+AF8BQAFBAGIBQwBkAUUAYwFEAGUBRgBnAUgAawFLAG0BTgBsAU0BTABuAU8AiwFsAHQBVQCJAWoAkQFyAJYBdwCYAXkAlwF4AJwBfQCfAYAAngF/AJ0BfgCnAYcApgGGAKUBhQDDAaMAwAGgAKwBjADCAaIAvgGeAMEBoQDHAacAzQGtAM4A1QG1ANcBtwDWAbYBgwCDAWQAuAGYACgALAEKAGEAZgFHAGoAcAFRAAwA6wBQAS8AdQFWAK0BjQC0AZQAsQGRALIBkgCzAZMARAEjAIwBbQAcAPsAHwD+AI4BbwATAPIAGAD3ADcBFQA9ARsAUgExAFgBNwB8AV0AigFrAJkBegCaAXsArwGPAL8BnwCgAYEAqAGIAH4BXwCQAXEAfwFgANIBsgK0ArIC3QLbAtoC3wLkAuMC5QLhArwCvQLAAsUCxwLCAroCtQLIAsMCvgLBAEsBKgCpAYkAyQGpAMYBpgDIAagAFQD0ABcA9gAOAO0AEADvABEA8AASAPEADwDuAAcA5gAJAOgACgDpAAsA6gAIAOcAOgEYADwBGgBAAR4AMgEQADQBEgA1ARMANgEUADMBEQBXATYAVQE0AIABYQCCAWMAdwFYAHkBWgB6AVsAewFcAHgBWQCEAWUAhgFnAIcBaACIAWkAhQFmALUBlQC3AZcAuQGZALsBmwC8AZwAvQGdALoBmgDQAbAAzwGvANEBsQDTAbMCWwJcAlcCWQJaAlgCqwKtAjoCcQJ0Am4CbwJzAnkCcgJ7AnUCdgJ6Aq4CpAKSApUClwKDAn8CmAKLAoqwACwgsABVWEVZICBLuAAOUUuwBlNaWLA0G7AoWWBmIIpVWLACJWG5CAAIAGNjI2IbISGwAFmwAEMjRLIAAQBDYEItsAEssCBgZi2wAiwjISMhLbADLCBkswMUFQBCQ7ATQyBgYEKxAhRDQrElA0OwAkNUeCCwDCOwAkNDYWSwBFB4sgICAkNgQrAhZRwhsAJDQ7IOFQFCHCCwAkMjQrITARNDYEIjsABQWGVZshYBAkNgQi2wBCywAyuwFUNYIyEjIbAWQ0MjsABQWGVZGyBkILDAULAEJlqyKAENQ0VjRbAGRVghsAMlWVJbWCEjIRuKWCCwUFBYIbBAWRsgsDhQWCGwOFlZILEBDUNFY0VhZLAoUFghsQENQ0VjRSCwMFBYIbAwWRsgsMBQWCBmIIqKYSCwClBYYBsgsCBQWCGwCmAbILA2UFghsDZgG2BZWVkbsAIlsAxDY7AAUliwAEuwClBYIbAMQxtLsB5QWCGwHkthuBAAY7AMQ2O4BQBiWVlkYVmwAStZWSOwAFBYZVlZIGSwFkMjQlktsAUsIEUgsAQlYWQgsAdDUFiwByNCsAgjQhshIVmwAWAtsAYsIyEjIbADKyBksQdiQiCwCCNCsAZFWBuxAQ1DRWOxAQ1DsARgRWOwBSohILAIQyCKIIqwASuxMAUlsAQmUVhgUBthUllYI1khWSCwQFNYsAErGyGwQFkjsABQWGVZLbAHLLAJQyuyAAIAQ2BCLbAILLAJI0IjILAAI0JhsAJiZrABY7ABYLAHKi2wCSwgIEUgsA5DY7gEAGIgsABQWLBAYFlmsAFjYESwAWAtsAossgkOAENFQiohsgABAENgQi2wCyywAEMjRLIAAQBDYEItsAwsICBFILABKyOwAEOwBCVgIEWKI2EgZCCwIFBYIbAAG7AwUFiwIBuwQFlZI7AAUFhlWbADJSNhRESwAWAtsA0sICBFILABKyOwAEOwBCVgIEWKI2EgZLAkUFiwABuwQFkjsABQWGVZsAMlI2FERLABYC2wDiwgsAAjQrMNDAADRVBYIRsjIVkqIS2wDyyxAgJFsGRhRC2wECywAWAgILAPQ0qwAFBYILAPI0JZsBBDSrAAUlggsBAjQlktsBEsILAQYmawAWMguAQAY4ojYbARQ2AgimAgsBEjQiMtsBIsS1RYsQRkRFkksA1lI3gtsBMsS1FYS1NYsQRkRFkbIVkksBNlI3gtsBQssQASQ1VYsRISQ7ABYUKwEStZsABDsAIlQrEPAiVCsRACJUKwARYjILADJVBYsQEAQ2CwBCVCioogiiNhsBAqISOwAWEgiiNhsBAqIRuxAQBDYLACJUKwAiVhsBAqIVmwD0NHsBBDR2CwAmIgsABQWLBAYFlmsAFjILAOQ2O4BABiILAAUFiwQGBZZrABY2CxAAATI0SwAUOwAD6yAQEBQ2BCLbAVLACxAAJFVFiwEiNCIEWwDiNCsA0jsARgQiCwFCNCIGCwAWG3GBgBABEAEwBCQkKKYCCwFENgsBQjQrEUCCuwiysbIlktsBYssQAVKy2wFyyxARUrLbAYLLECFSstsBkssQMVKy2wGiyxBBUrLbAbLLEFFSstsBwssQYVKy2wHSyxBxUrLbAeLLEIFSstsB8ssQkVKy2wKywjILAQYmawAWOwBmBLVFgjIC6wAV0bISFZLbAsLCMgsBBiZrABY7AWYEtUWCMgLrABcRshIVktsC0sIyCwEGJmsAFjsCZgS1RYIyAusAFyGyEhWS2wICwAsA8rsQACRVRYsBIjQiBFsA4jQrANI7AEYEIgYLABYbUYGAEAEQBCQopgsRQIK7CLKxsiWS2wISyxACArLbAiLLEBICstsCMssQIgKy2wJCyxAyArLbAlLLEEICstsCYssQUgKy2wJyyxBiArLbAoLLEHICstsCkssQggKy2wKiyxCSArLbAuLCA8sAFgLbAvLCBgsBhgIEMjsAFgQ7ACJWGwAWCwLiohLbAwLLAvK7AvKi2wMSwgIEcgILAOQ2O4BABiILAAUFiwQGBZZrABY2AjYTgjIIpVWCBHICCwDkNjuAQAYiCwAFBYsEBgWWawAWNgI2E4GyFZLbAyLACxAAJFVFixDgZFQrABFrAxKrEFARVFWDBZGyJZLbAzLACwDyuxAAJFVFixDgZFQrABFrAxKrEFARVFWDBZGyJZLbA0LCA1sAFgLbA1LACxDgZFQrABRWO4BABiILAAUFiwQGBZZrABY7ABK7AOQ2O4BABiILAAUFiwQGBZZrABY7ABK7AAFrQAAAAAAEQ+IzixNAEVKiEtsDYsIDwgRyCwDkNjuAQAYiCwAFBYsEBgWWawAWNgsABDYTgtsDcsLhc8LbA4LCA8IEcgsA5DY7gEAGIgsABQWLBAYFlmsAFjYLAAQ2GwAUNjOC2wOSyxAgAWJSAuIEewACNCsAIlSYqKRyNHI2EgWGIbIVmwASNCsjgBARUUKi2wOiywABawFyNCsAQlsAQlRyNHI2GxDABCsAtDK2WKLiMgIDyKOC2wOyywABawFyNCsAQlsAQlIC5HI0cjYSCwBiNCsQwAQrALQysgsGBQWCCwQFFYswQgBSAbswQmBRpZQkIjILAKQyCKI0cjRyNhI0ZgsAZDsAJiILAAUFiwQGBZZrABY2AgsAErIIqKYSCwBENgZCOwBUNhZFBYsARDYRuwBUNgWbADJbACYiCwAFBYsEBgWWawAWNhIyAgsAQmI0ZhOBsjsApDRrACJbAKQ0cjRyNhYCCwBkOwAmIgsABQWLBAYFlmsAFjYCMgsAErI7AGQ2CwASuwBSVhsAUlsAJiILAAUFiwQGBZZrABY7AEJmEgsAQlYGQjsAMlYGRQWCEbIyFZIyAgsAQmI0ZhOFktsDwssAAWsBcjQiAgILAFJiAuRyNHI2EjPDgtsD0ssAAWsBcjQiCwCiNCICAgRiNHsAErI2E4LbA+LLAAFrAXI0KwAyWwAiVHI0cjYbAAVFguIDwjIRuwAiWwAiVHI0cjYSCwBSWwBCVHI0cjYbAGJbAFJUmwAiVhuQgACABjYyMgWGIbIVljuAQAYiCwAFBYsEBgWWawAWNgIy4jICA8ijgjIVktsD8ssAAWsBcjQiCwCkMgLkcjRyNhIGCwIGBmsAJiILAAUFiwQGBZZrABYyMgIDyKOC2wQCwjIC5GsAIlRrAXQ1hQG1JZWCA8WS6xMAEUKy2wQSwjIC5GsAIlRrAXQ1hSG1BZWCA8WS6xMAEUKy2wQiwjIC5GsAIlRrAXQ1hQG1JZWCA8WSMgLkawAiVGsBdDWFIbUFlYIDxZLrEwARQrLbBDLLA6KyMgLkawAiVGsBdDWFAbUllYIDxZLrEwARQrLbBELLA7K4ogIDywBiNCijgjIC5GsAIlRrAXQ1hQG1JZWCA8WS6xMAEUK7AGQy6wMCstsEUssAAWsAQlsAQmICAgRiNHYbAMI0IuRyNHI2GwC0MrIyA8IC4jOLEwARQrLbBGLLEKBCVCsAAWsAQlsAQlIC5HI0cjYSCwBiNCsQwAQrALQysgsGBQWCCwQFFYswQgBSAbswQmBRpZQkIjIEewBkOwAmIgsABQWLBAYFlmsAFjYCCwASsgiophILAEQ2BkI7AFQ2FkUFiwBENhG7AFQ2BZsAMlsAJiILAAUFiwQGBZZrABY2GwAiVGYTgjIDwjOBshICBGI0ewASsjYTghWbEwARQrLbBHLLEAOisusTABFCstsEgssQA7KyEjICA8sAYjQiM4sTABFCuwBkMusDArLbBJLLAAFSBHsAAjQrIAAQEVFBMusDYqLbBKLLAAFSBHsAAjQrIAAQEVFBMusDYqLbBLLLEAARQTsDcqLbBMLLA5Ki2wTSywABZFIyAuIEaKI2E4sTABFCstsE4ssAojQrBNKy2wTyyyAABGKy2wUCyyAAFGKy2wUSyyAQBGKy2wUiyyAQFGKy2wUyyyAABHKy2wVCyyAAFHKy2wVSyyAQBHKy2wViyyAQFHKy2wVyyzAAAAQystsFgsswABAEMrLbBZLLMBAABDKy2wWiyzAQEAQystsFssswAAAUMrLbBcLLMAAQFDKy2wXSyzAQABQystsF4sswEBAUMrLbBfLLIAAEUrLbBgLLIAAUUrLbBhLLIBAEUrLbBiLLIBAUUrLbBjLLIAAEgrLbBkLLIAAUgrLbBlLLIBAEgrLbBmLLIBAUgrLbBnLLMAAABEKy2waCyzAAEARCstsGksswEAAEQrLbBqLLMBAQBEKy2wayyzAAABRCstsGwsswABAUQrLbBtLLMBAAFEKy2wbiyzAQEBRCstsG8ssQA8Ky6xMAEUKy2wcCyxADwrsEArLbBxLLEAPCuwQSstsHIssAAWsQA8K7BCKy2wcyyxATwrsEArLbB0LLEBPCuwQSstsHUssAAWsQE8K7BCKy2wdiyxAD0rLrEwARQrLbB3LLEAPSuwQCstsHgssQA9K7BBKy2weSyxAD0rsEIrLbB6LLEBPSuwQCstsHsssQE9K7BBKy2wfCyxAT0rsEIrLbB9LLEAPisusTABFCstsH4ssQA+K7BAKy2wfyyxAD4rsEErLbCALLEAPiuwQistsIEssQE+K7BAKy2wgiyxAT4rsEErLbCDLLEBPiuwQistsIQssQA/Ky6xMAEUKy2whSyxAD8rsEArLbCGLLEAPyuwQSstsIcssQA/K7BCKy2wiCyxAT8rsEArLbCJLLEBPyuwQSstsIossQE/K7BCKy2wiyyyCwADRVBYsAYbsgQCA0VYIyEbIVlZQiuwCGWwAyRQeLEFARVFWDBZLQAAAABLuADIUlixAQGOWbABuQgACABjcLEAB0K1ADQAHgQAKrEAB0JACjkEKQgjAhUHBAoqsQAHQkAKPQIxBiYAHAUECiqxAAtCvQ6ACoAJAAWAAAQACyqxAA9CvQBAAEAAQABAAAQACyq5AAMAAESxJAGIUViwQIhYuQADAGREsSgBiFFYuAgAiFi5AAMAAERZG7EnAYhRWLoIgAABBECIY1RYuQADAABEWVlZWVlACjsCKwYlARcFBA4quAH/hbAEjbECAESzBWQGAEREAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABgAGAAYABgCuAAAAf4AAP9DArgAAAH+AAD/QwB2AHYAVgBW/1v/WwC9AL0AjQCNArAAAALnAf4AAP85Arj/+ALnAgb/+P8yAHYAdgBWAFYDFAGeAxwBlgAAAAAADgCuAAMAAQQJAAAAsAAAAAMAAQQJAAEAIgCwAAMAAQQJAAIADgDSAAMAAQQJAAMARADgAAMAAQQJAAQAMgEkAAMAAQQJAAUAGgFWAAMAAQQJAAYALgFwAAMAAQQJAAcAWgGeAAMAAQQJAAgAGAH4AAMAAQQJAAkAcAIQAAMAAQQJAAsAVgKAAAMAAQQJAAwAVgKAAAMAAQQJAA0BIALWAAMAAQQJAA4ANAP2AEMAbwBwAHkAcgBpAGcAaAB0ACAAMgAwADEAOQAgAFQAaABlACAAUwBhAGkAcgBhACAAUwB0AGUAbgBjAGkAbAAgAFAAcgBvAGoAZQBjAHQAIABBAHUAdABoAG8AcgBzACAAKABoAHQAdABwAHMAOgAvAC8AZwBpAHQAaAB1AGIALgBjAG8AbQAvAE8AbQBuAGkAYgB1AHMALQBUAHkAcABlAC8AUwBhAGkAcgBhACkAUwBhAGkAcgBhACAAUwB0AGUAbgBjAGkAbAAgAE8AbgBlAFIAZQBnAHUAbABhAHIAMQAuADAAMAA0ADsATwBNAE4ASQA7AFMAYQBpAHIAYQBTAHQAZQBuAGMAaQBsAE8AbgBlAC0AUgBlAGcAdQBsAGEAcgBTAGEAaQByAGEAIABTAHQAZQBuAGMAaQBsACAATwBuAGUAIABSAGUAZwB1AGwAYQByAFYAZQByAHMAaQBvAG4AIAAxAC4AMAAwADQAUwBhAGkAcgBhAFMAdABlAG4AYwBpAGwATwBuAGUALQBSAGUAZwB1AGwAYQByAFMAYQBpAHIAYQAgAFMAdABlAG4AYwBpAGwAIABpAHMAIABhACAAdAByAGEAZABlAG0AYQByAGsAIABvAGYAIABPAG0AbgBpAGIAdQBzAC0AVAB5AHAAZQAuAE8AbQBuAGkAYgB1AHMALQBUAHkAcABlAEgAZQBjAHQAbwByACAARwBhAHQAdABpACAAdwBpAHQAaAAgAGMAbwBsAGwAYQBiAG8AcgBhAHQAaQBvAG4AIABvAGYAIAB0AGgAZQAgAE8AbQBuAGkAYgB1AHMALQBUAHkAcABlACAAdABlAGEAbQBoAHQAdABwADoALwAvAHcAdwB3AC4AbwBtAG4AaQBiAHUAcwAtAHQAeQBwAGUALgBjAG8AbQAvAGYAbwBuAHQAcwAvAHMAYQBpAHIAYQAuAHAAaABwAFQAaABpAHMAIABGAG8AbgB0ACAAUwBvAGYAdAB3AGEAcgBlACAAaQBzACAAbABpAGMAZQBuAHMAZQBkACAAdQBuAGQAZQByACAAdABoAGUAIABTAEkATAAgAE8AcABlAG4AIABGAG8AbgB0ACAATABpAGMAZQBuAHMAZQAsACAAVgBlAHIAcwBpAG8AbgAgADEALgAxAC4AIABUAGgAaQBzACAAbABpAGMAZQBuAHMAZQAgAGkAcwAgAGEAdgBhAGkAbABhAGIAbABlACAAdwBpAHQAaAAgAGEAIABGAEEAUQAgAGEAdAA6ACAAaAB0AHQAcAA6AC8ALwBzAGMAcgBpAHAAdABzAC4AcwBpAGwALgBvAHIAZwAvAE8ARgBMAGgAdAB0AHAAOgAvAC8AcwBjAHIAaQBwAHQAcwAuAHMAaQBsAC4AbwByAGcALwBPAEYATAACAAAAAAAA/6EAUAAAAAAAAAAAAAAAAAAAAAAAAAAAA1QAAAECAAIAAwAkAMkBAwEEAQUBBgEHAQgBCQDHAQoBCwEMAQ0BDgEPAGIBEACtAREBEgETARQAYwEVAK4AkAEWACUAJgD9AP8AZAEXARgAJwEZAOkBGgEbARwAKABlAR0BHgDIAR8BIAEhASIBIwEkAMoBJQEmAMsBJwEoASkBKgErACkAKgD4ASwBLQEuAS8AKwEwATEBMgAsATMAzAE0ATUAzQE2AM4A+gE3AM8BOAE5AToBOwE8AC0BPQAuAT4ALwE/AUABQQFCAUMBRADiADAAMQFFAUYBRwFIAUkBSgFLAGYAMgDQAUwBTQDRAU4BTwFQAVEBUgFTAGcBVAFVAVYA0wFXAVgBWQFaAVsBXAFdAV4BXwFgAWEAkQFiAK8BYwCwADMA7QA0ADUBZAFlAWYBZwFoADYBaQDkAPsBagFrAWwBbQFuADcBbwFwAXEBcgFzADgA1AF0AXUA1QF2AGgBdwF4AXkBegF7ANYBfAF9AX4BfwGAAYEBggGDAYQBhQGGAYcBiAA5ADoBiQGKAYsBjAA7ADwA6wGNALsBjgGPAZABkQGSAD0BkwDmAZQBlQGWAZcBmAGZAZoBmwGcAZ0BngGfAEQAaQGgAaEBogGjAaQBpQGmAGsBpwGoAakBqgGrAawAbAGtAGoBrgGvAbABsQBuAbIAbQCgAbMARQBGAP4BAABvAbQBtQBHAOoBtgEBAbcASABwAbgBuQByAboBuwG8Ab0BvgG/AHMBwAHBAHEBwgHDAcQBxQHGAccASQBKAPkByAHJAcoBywBLAcwBzQHOAEwA1wB0Ac8B0AB2AdEAdwHSAdMAdQHUAdUB1gHXAdgB2QBNAdoB2wBOAdwB3QBPAd4B3wHgAeEB4gDjAFAAUQHjAeQB5QHmAecB6AHpAHgAUgB5AeoB6wB7AewB7QHuAe8B8AHxAHwB8gHzAfQAegH1AfYB9wH4AfkB+gH7AfwB/QH+Af8AoQIAAH0CAQCxAFMA7gBUAFUCAgIDAgQCBQIGAFYCBwDlAPwCCAIJAIkCCgBXAgsCDAINAg4CDwBYAH4CEAIRAIACEgCBAhMCFAIVAhYCFwB/AhgCGQIaAhsCHAIdAh4CHwIgAiECIgIjAiQAWQBaAiUCJgInAigAWwBcAOwCKQC6AioCKwIsAi0CLgBdAi8A5wIwAjECMgIzAjQCNQI2AjcCOAI5AjoCOwI8Aj0CPgDAAMEAnQCeAj8CQAJBAkIAmwJDABMAFAAVABYAFwAYABkAGgAbABwCRAJFAkYCRwJIAkkCSgJLAkwCTQJOAk8CUAJRAlICUwJUAlUCVgJXAlgCWQJaAlsCXAJdAl4CXwJgAmECYgJjAmQCZQJmAmcCaAJpAmoCawJsAm0CbgJvAnACcQJyAnMCdAJ1AnYCdwJ4AnkCegJ7AnwCfQJ+An8CgAKBAoICgwKEAoUChgKHAogCiQKKAosCjAKNAo4CjwKQApECkgKTApQClQC8APQA9QD2ABEADwAdAB4AqwAEAKMAIgCiAMMAhwANAAYAEgA/ApYClwKYApkCmgKbAAsADABeAGAAPgBAABACnACyALMCnQKeAEICnwKgAqECogKjAMQAxQC0ALUAtgC3AqQAqQCqAL4AvwAFAAoCpQKmAqcCqAKpAqoAhAKrAL0ABwKsAq0ApgD3Aq4CrwKwArECsgKzArQCtQK2ArcAhQK4AJYCuQK6ArsADgDvAPAAuAAgAI8AIQAfAJUAlACTAKcAYQCkAEEAkgK8AJwCvQK+AJoAmQClAJgCvwAIAMYAuQAjAAkAiACGAIsAigLAAIwAgwLBAsIAXwDoAIICwwDCAsQCxQLGAscCyALJAsoCywLMAs0CzgLPAtAC0QLSAtMC1ALVAtYC1wLYAtkC2gLbAtwC3QLeAt8C4ALhAuIC4wLkAuUC5gLnAugC6QLqAusC7ALtAu4AjQDbAOEA3gDYAI4A3ABDAN8A2gDgAN0A2QLvAvAC8QLyAvMC9AL1AvYC9wL4AvkC+gL7AvwC/QL+Av8DAAMBAwIDAwMEAwUDBgMHAwgDCQMKAwsDDAMNAw4DDwMQAxEDEgMTAxQDFQMWAxcDGAMZAxoDGwMcAx0DHgMfAyADIQMiAyMDJAMlAyYDJwMoAykDKgMrAywDLQMuAy8DMAMxAzIDMwM0AzUDNgM3AzgDOQM6AzsDPAM9Az4DPwNAA0EDQgNDA0QDRQNGA0cDSANJA0oDSwNMA00DTgNPA1ADUQNSA1MDVANVA1YDVwNYA1kDWgNbA1wETlVMTAZBYnJldmUHdW5pMUVBRQd1bmkxRUI2B3VuaTFFQjAHdW5pMUVCMgd1bmkxRUI0B3VuaTAxQ0QHdW5pMUVBNAd1bmkxRUFDB3VuaTFFQTYHdW5pMUVBOAd1bmkxRUFBB3VuaTAyMDAHdW5pMUVBMAd1bmkxRUEyB3VuaTAyMDIHQW1hY3JvbgdBb2dvbmVrCkFyaW5nYWN1dGUHQUVhY3V0ZQtDY2lyY3VtZmxleApDZG90YWNjZW50B3VuaTAxQzQGRGNhcm9uBkRjcm9hdAd1bmkwMUM1BkVicmV2ZQZFY2Fyb24HdW5pMUVCRQd1bmkxRUM2B3VuaTFFQzAHdW5pMUVDMgd1bmkxRUM0B3VuaTAyMDQKRWRvdGFjY2VudAd1bmkxRUI4B3VuaTFFQkEHdW5pMDIwNgdFbWFjcm9uB0VvZ29uZWsHdW5pMUVCQwZHY2Fyb24LR2NpcmN1bWZsZXgHdW5pMDEyMgpHZG90YWNjZW50BEhiYXILSGNpcmN1bWZsZXgHdW5pMUUyNAJJSgZJYnJldmUHdW5pMDFDRgd1bmkwMjA4B3VuaTFFQ0EHdW5pMUVDOAd1bmkwMjBBB0ltYWNyb24HSW9nb25lawZJdGlsZGULSmNpcmN1bWZsZXgHdW5pMDEzNgd1bmkwMUM3BkxhY3V0ZQZMY2Fyb24HdW5pMDEzQgRMZG90B3VuaTAxQzgHdW5pMDFDQQZOYWN1dGUGTmNhcm9uB3VuaTAxNDUDRW5nB3VuaTAxOUQHdW5pMDFDQgZPYnJldmUHdW5pMDFEMQd1bmkxRUQwB3VuaTFFRDgHdW5pMUVEMgd1bmkxRUQ0B3VuaTFFRDYHdW5pMDIwQwd1bmkwMjJBB3VuaTAyMzAHdW5pMUVDQwd1bmkxRUNFBU9ob3JuB3VuaTFFREEHdW5pMUVFMgd1bmkxRURDB3VuaTFFREUHdW5pMUVFMA1PaHVuZ2FydW1sYXV0B3VuaTAyMEUHT21hY3Jvbgd1bmkwMUVBC09zbGFzaGFjdXRlB3VuaTAyMkMGUmFjdXRlBlJjYXJvbgd1bmkwMTU2B3VuaTAyMTAHdW5pMDIxMgZTYWN1dGULU2NpcmN1bWZsZXgHdW5pMDIxOAd1bmkxRTYyB3VuaTFFOUUHdW5pMDE4RgRUYmFyBlRjYXJvbgd1bmkwMTYyB3VuaTAyMUEHdW5pMUU2QwZVYnJldmUHdW5pMDFEMwd1bmkwMjE0B3VuaTAxRDcHdW5pMDFEOQd1bmkwMURCB3VuaTAxRDUHdW5pMUVFNAd1bmkxRUU2BVVob3JuB3VuaTFFRTgHdW5pMUVGMAd1bmkxRUVBB3VuaTFFRUMHdW5pMUVFRQ1VaHVuZ2FydW1sYXV0B3VuaTAyMTYHVW1hY3JvbgdVb2dvbmVrBVVyaW5nBlV0aWxkZQZXYWN1dGULV2NpcmN1bWZsZXgJV2RpZXJlc2lzBldncmF2ZQtZY2lyY3VtZmxleAd1bmkxRUY0BllncmF2ZQd1bmkxRUY2B3VuaTAyMzIHdW5pMUVGOAZaYWN1dGUKWmRvdGFjY2VudA5ZYWN1dGUubG9jbEdVQRNZY2lyY3VtZmxleC5sb2NsR1VBEVlkaWVyZXNpcy5sb2NsR1VBDllncmF2ZS5sb2NsR1VBD3VuaTAyMzIubG9jbEdVQQ91bmkxRUY4LmxvY2xHVUEOQ2FjdXRlLmxvY2xQTEsOTmFjdXRlLmxvY2xQTEsOT2FjdXRlLmxvY2xQTEsOU2FjdXRlLmxvY2xQTEsOWmFjdXRlLmxvY2xQTEsGYWJyZXZlB3VuaTFFQUYHdW5pMUVCNwd1bmkxRUIxB3VuaTFFQjMHdW5pMUVCNQd1bmkwMUNFB3VuaTFFQTUHdW5pMUVBRAd1bmkxRUE3B3VuaTFFQTkHdW5pMUVBQgd1bmkwMjAxB3VuaTFFQTEHdW5pMUVBMwd1bmkwMjAzB2FtYWNyb24HYW9nb25lawphcmluZ2FjdXRlB2FlYWN1dGULY2NpcmN1bWZsZXgKY2RvdGFjY2VudAZkY2Fyb24HdW5pMDFDNgZlYnJldmUGZWNhcm9uB3VuaTFFQkYHdW5pMUVDNwd1bmkxRUMxB3VuaTFFQzMHdW5pMUVDNQd1bmkwMjA1CmVkb3RhY2NlbnQHdW5pMUVCOQd1bmkxRUJCB3VuaTAyMDcHZW1hY3Jvbgdlb2dvbmVrB3VuaTFFQkQHdW5pMDI1OQZnY2Fyb24LZ2NpcmN1bWZsZXgHdW5pMDEyMwpnZG90YWNjZW50BGhiYXILaGNpcmN1bWZsZXgHdW5pMUUyNQZpYnJldmUHdW5pMDFEMAd1bmkwMjA5CWkubG9jbFRSSwd1bmkxRUNCB3VuaTFFQzkHdW5pMDIwQgJpagdpbWFjcm9uB2lvZ29uZWsGaXRpbGRlB3VuaTAyMzcLamNpcmN1bWZsZXgHdW5pMDEzNwxrZ3JlZW5sYW5kaWMGbGFjdXRlBmxjYXJvbgd1bmkwMTNDBGxkb3QHdW5pMDFDOQZuYWN1dGULbmFwb3N0cm9waGUGbmNhcm9uB3VuaTAxNDYDZW5nB3VuaTAyNzIHdW5pMDFDQwZvYnJldmUHdW5pMDFEMgd1bmkxRUQxB3VuaTFFRDkHdW5pMUVEMwd1bmkxRUQ1B3VuaTFFRDcHdW5pMDIwRAd1bmkwMjJCB3VuaTAyMzEHdW5pMUVDRAd1bmkxRUNGBW9ob3JuB3VuaTFFREIHdW5pMUVFMwd1bmkxRUREB3VuaTFFREYHdW5pMUVFMQ1vaHVuZ2FydW1sYXV0B3VuaTAyMEYHb21hY3Jvbgd1bmkwMUVCC29zbGFzaGFjdXRlB3VuaTAyMkQGcmFjdXRlBnJjYXJvbgd1bmkwMTU3B3VuaTAyMTEHdW5pMDIxMwZzYWN1dGULc2NpcmN1bWZsZXgHdW5pMDIxOQVsb25ncwR0YmFyBnRjYXJvbgd1bmkwMTYzB3VuaTAyMUIHdW5pMUU2RAZ1YnJldmUHdW5pMDFENAd1bmkwMjE1B3VuaTAxRDgHdW5pMDFEQQd1bmkwMURDB3VuaTAxRDYHdW5pMUVFNQd1bmkxRUU3BXVob3JuB3VuaTFFRTkHdW5pMUVGMQd1bmkxRUVCB3VuaTFFRUQHdW5pMUVFRg11aHVuZ2FydW1sYXV0B3VuaTAyMTcHdW1hY3Jvbgd1b2dvbmVrBXVyaW5nBnV0aWxkZQZ3YWN1dGULd2NpcmN1bWZsZXgJd2RpZXJlc2lzBndncmF2ZQt5Y2lyY3VtZmxleAd1bmkxRUY1BnlncmF2ZQd1bmkxRUY3B3VuaTAyMzMHdW5pMUVGOQZ6YWN1dGUKemRvdGFjY2VudA55YWN1dGUubG9jbEdVQRN5Y2lyY3VtZmxleC5sb2NsR1VBEXlkaWVyZXNpcy5sb2NsR1VBDnlncmF2ZS5sb2NsR1VBD3VuaTAyMzMubG9jbEdVQQ91bmkxRUY5LmxvY2xHVUEOY2FjdXRlLmxvY2xQTEsObmFjdXRlLmxvY2xQTEsOb2FjdXRlLmxvY2xQTEsOc2FjdXRlLmxvY2xQTEsOemFjdXRlLmxvY2xQTEsDZl9mBWZfZl9pBWZfZl9sB3VuaTIwN0YHdW5pMDM5NAd1bmkwM0E5B3VuaTAzQkMHdW5pMjA5OQd6ZXJvLmxmBm9uZS5sZgZ0d28ubGYIdGhyZWUubGYHZm91ci5sZgdmaXZlLmxmBnNpeC5sZghzZXZlbi5sZghlaWdodC5sZgduaW5lLmxmCHplcm8ub3NmB29uZS5vc2YHdHdvLm9zZgl0aHJlZS5vc2YIZm91ci5vc2YIZml2ZS5vc2YHc2l4Lm9zZglzZXZlbi5vc2YJZWlnaHQub3NmCG5pbmUub3NmB3plcm8udGYGb25lLnRmBnR3by50Zgh0aHJlZS50Zgdmb3VyLnRmB2ZpdmUudGYGc2l4LnRmCHNldmVuLnRmCGVpZ2h0LnRmB25pbmUudGYMemVyby50Zi56ZXJvCXplcm8udG9zZghvbmUudG9zZgh0d28udG9zZgp0aHJlZS50b3NmCWZvdXIudG9zZglmaXZlLnRvc2YIc2l4LnRvc2YKc2V2ZW4udG9zZgplaWdodC50b3NmCW5pbmUudG9zZgl6ZXJvLnplcm8HdW5pMjA4MAd1bmkyMDgxB3VuaTIwODIHdW5pMjA4Mwd1bmkyMDg0B3VuaTIwODUHdW5pMjA4Ngd1bmkyMDg3B3VuaTIwODgHdW5pMjA4OQl6ZXJvLmRub20Ib25lLmRub20IdHdvLmRub20KdGhyZWUuZG5vbQlmb3VyLmRub20JZml2ZS5kbm9tCHNpeC5kbm9tCnNldmVuLmRub20KZWlnaHQuZG5vbQluaW5lLmRub20JemVyby5udW1yCG9uZS5udW1yCHR3by5udW1yCnRocmVlLm51bXIJZm91ci5udW1yCWZpdmUubnVtcghzaXgubnVtcgpzZXZlbi5udW1yCmVpZ2h0Lm51bXIJbmluZS5udW1yB3VuaTIwNzAHdW5pMDBCOQd1bmkwMEIyB3VuaTAwQjMHdW5pMjA3NAd1bmkyMDc1B3VuaTIwNzYHdW5pMjA3Nwd1bmkyMDc4B3VuaTIwNzkLZXhjbGFtLmNhc2UPZXhjbGFtZG93bi5jYXNlDXF1ZXN0aW9uLmNhc2URcXVlc3Rpb25kb3duLmNhc2UbcGVyaW9kY2VudGVyZWQubG9jbENBVC5jYXNlFnBlcmlvZGNlbnRlcmVkLmxvY2xDQVQHdW5pMDBBRAd1bmkyMDEwB3VuaTIwMTELaHlwaGVuLmNhc2UMdW5pMDBBRC5jYXNlC2VuZGFzaC5jYXNlC2VtZGFzaC5jYXNlDHVuaTIwMTEuY2FzZQphcG9zdHJvcGhlB3VuaTI3RTgHdW5pMjdFOQd1bmkwMEEwB3VuaTIwMDkHdW5pRkVGRgd1bmkyMEI1DWNvbG9ubW9uZXRhcnkEZG9uZwRFdXJvB3VuaTIwQjIHdW5pMjBBRARsaXJhB3VuaTIwQkEHdW5pMjBCQwd1bmkyMEE2BnBlc2V0YQd1bmkyMEIxB3VuaTIwQkQHdW5pMjBCOQd1bmkyMEE5B3VuaTIyMTkHdW5pMjA1Mgd1bmkyMjE1CGVtcHR5c2V0B3VuaTIxMjYHdW5pMjIwNgd1bmkwMEI1B3VuaTIxMTcGbWludXRlBnNlY29uZAd1bmkyMTEzB3VuaTIxMTYJZXN0aW1hdGVkB3VuaUY4RkYHdW5pMDJCQwd1bmkwMkJBB3VuaTAyQzkHdW5pMDJCOQd1bmkwMzA4C3VuaTAzMDgwMzAwC3VuaTAzMDgwMzAxC3VuaTAzMDgwMzBDC3VuaTAzMDgwMzA0B3VuaTAzMDcLdW5pMDMwNzAzMDQJZ3JhdmVjb21iCWFjdXRlY29tYgd1bmkwMzBCC3VuaTAzMEMuYWx0B3VuaTAzMDIHdW5pMDMwQwd1bmkwMzA2B3VuaTAzMEELdW5pMDMwQTAzMDEJdGlsZGVjb21iC3VuaTAzMDMwMzA0B3VuaTAzMDQNaG9va2Fib3ZlY29tYgd1bmkwMzBGB3VuaTAzMTEHdW5pMDMxMgd1bmkwMzEzB3VuaTAzMUIMZG90YmVsb3djb21iB3VuaTAzMjQHdW5pMDMyNgd1bmkwMzI3B3VuaTAzMjgHdW5pMDMyRQd1bmkwMzMxB3VuaTAzMzUHdW5pMDMzNgd1bmkwMzM3B3VuaTAzMzgMdW5pMDMwOC5jYXNlEHVuaTAzMDgwMzAwLmNhc2UQdW5pMDMwODAzMDEuY2FzZRB1bmkwMzA4MDMwQy5jYXNlEHVuaTAzMDgwMzA0LmNhc2UMdW5pMDMwNy5jYXNlEHVuaTAzMDcwMzA0LmNhc2UOZ3JhdmVjb21iLmNhc2UOYWN1dGVjb21iLmNhc2UMdW5pMDMwQi5jYXNlDHVuaTAzMDIuY2FzZRxjaXJjdW1mbGV4Y29tYl9ob29rY29tYi5jYXNlDHVuaTAzMEMuY2FzZQx1bmkwMzA2LmNhc2UXYnJldmVjb21iX2hvb2tjb21iLmNhc2UMdW5pMDMwQS5jYXNlEHVuaTAzMEEwMzAxLmNhc2UOdGlsZGVjb21iLmNhc2UQdW5pMDMwMzAzMDQuY2FzZQx1bmkwMzA0LmNhc2USaG9va2Fib3ZlY29tYi5jYXNlDHVuaTAzMEYuY2FzZQx1bmkwMzExLmNhc2UMdW5pMDMxMi5jYXNlDHVuaTAzMUIuY2FzZRFkb3RiZWxvd2NvbWIuY2FzZQx1bmkwMzI0LmNhc2UMdW5pMDMyNi5jYXNlDHVuaTAzMjcuY2FzZQx1bmkwMzI4LmNhc2UMdW5pMDMyRS5jYXNlDHVuaTAzMzEuY2FzZQx1bmkwMzM3LmNhc2UMdW5pMDMzOC5jYXNlCmFjdXRlLmNhc2UKYnJldmUuY2FzZQpjYXJvbi5jYXNlD2NpcmN1bWZsZXguY2FzZQ1kaWVyZXNpcy5jYXNlDmRvdGFjY2VudC5jYXNlCmdyYXZlLmNhc2URaHVuZ2FydW1sYXV0LmNhc2USYWN1dGUubG9jbFBMSy5jYXNlC21hY3Jvbi5jYXNlCXJpbmcuY2FzZQp0aWxkZS5jYXNlF2FjdXRlLmxvY2xQTEsuY2FzZS5jb21iEmFjdXRlLmxvY2xQTEsuY29tYg1hY3V0ZS5sb2NsUExLC3VuaTAzMDYwMzAxC3VuaTAzMDYwMzAwC3VuaTAzMDYwMzA5C3VuaTAzMDYwMzAzC3VuaTAzMDIwMzAxC3VuaTAzMDIwMzAwC3VuaTAzMDIwMzA5C3VuaTAzMDIwMzAzEHVuaTAzMDYwMzAxLmNhc2UQdW5pMDMwNjAzMDAuY2FzZRB1bmkwMzA2MDMwMy5jYXNlEHVuaTAzMDIwMzAxLmNhc2UQdW5pMDMwMjAzMDAuY2FzZRB1bmkwMzAyMDMwMy5jYXNlB3VuaUUwRkYHdW5pRUZGRAd1bmlGMDAwDWJyZXZlaW52ZXJ0ZWQSYnJldmVpbnZlcnRlZC5jYXNlCmJyZXZlYmVsb3cKYnJldmVhY3V0ZQ9icmV2ZWFjdXRlLmNhc2UKYnJldmVncmF2ZQ9icmV2ZWdyYXZlLmNhc2UJYnJldmVob29rDmJyZXZlaG9vay5jYXNlCmJyZXZldGlsZGUPYnJldmV0aWxkZS5jYXNlD2NpcmN1bWZsZXhhY3V0ZRRjaXJjdW1mbGV4YWN1dGUuY2FzZQ9jaXJjdW1mbGV4Z3JhdmUUY2lyY3VtZmxleGdyYXZlLmNhc2UOY2lyY3VtZmxleGhvb2sTY2lyY3VtZmxleGhvb2suY2FzZQ9jaXJjdW1mbGV4dGlsZGUUY2lyY3VtZmxleHRpbGRlLmNhc2UQY29tbWF0dXJuZWRhYm92ZQpjb21tYWJlbG93CmNvbW1hYWJvdmUIZGJsZ3JhdmUNZGJsZ3JhdmUuY2FzZQ1kaWVyZXNpc2FjdXRlEmRpZXJlc2lzYWN1dGUuY2FzZQ1kaWVyZXNpc2Nhcm9uEmRpZXJlc2lzY2Fyb24uY2FzZQ1kaWVyZXNpc2JlbG93DWRpZXJlc2lzZ3JhdmUSZGllcmVzaXNncmF2ZS5jYXNlDmRpZXJlc2lzbWFjcm9uE2RpZXJlc2lzbWFjcm9uLmNhc2UPZG90YWNjZW50bWFjcm9uFGRvdGFjY2VudG1hY3Jvbi5jYXNlCGRvdGJlbG93BGhvcm4EaG9vawlob29rLmNhc2ULbWFjcm9uYmVsb3cJcmluZ2FjdXRlDnJpbmdhY3V0ZS5jYXNlC3RpbGRlbWFjcm9uEHRpbGRlbWFjcm9uLmNhc2UAAQAB//8ADwABAAAADAAAAAAAygACAB8ABAAfAAEAIQBAAAEAQgBnAAEAaQBtAAEAcACLAAEAjQCQAAEAlQChAAEApADAAAEAwgDDAAEAxQDJAAEAywD+AAEBAAEGAAEBCAEfAAEBIQE7AAEBPQFIAAEBSgFOAAEBUQFsAAEBbgFxAAEBdgGBAAEBhAGjAAEBpQGpAAEBqwHCAAEBwwHHAAICRAJEAAECbgJuAAECtQK+AAMCwALYAAMC5gLwAAMC8gLzAAMC9QMHAAMDFwMkAAMAAgALArUCvgACAsACzAACAs4CzgABAtAC0QABAtQC1AABAuYC8AACAvIC8wACAvUC/QACAv8DAgABAwQDBQABAxcDJAACAAEAAAAKAE4AngADREZMVAAUY3lybAAkbGF0bgA0AAQAAAAA//8AAwAAAAMABgAEAAAAAP//AAMAAQAEAAcABAAAAAD//wADAAIABQAIAAlrZXJuADhrZXJuADhrZXJuADhtYXJrAEBtYXJrAEBtYXJrAEBta21rAEhta21rAEhta21rAEgAAAACAAAAAQAAAAIAAgADAAAAAgAEAAUABgAOAE4IVAn+HtYfnAACAAgAAQAIAAEAEAAEAAAAAwAaACwAMgABAAMB1wIwAksABAIw/4ECMf+BAlf/gQJY/4EAAQJG/84AAQHX/9EAAgAIAAQADgTcBpwHlgABAGAABAAAACsAugDMAY4BjgDaAOQBIgFcAXIBgAGOAaQBtgG8AfICIAJiApAC4gLsA3QDdAN0AvoDVgMwA1YDYANmA3QDdAOGA7wDxgQEBCIESARmBGwEggSMBK4EtAABACsABAAeACAAJwAtAEEAXgBgAHIAkgCUAJUAmwCkAMQAxQDKAMsA4wDkAP0A/wELASABJwE/AUkBSgFTAXIBcwF2AXwBhAGkAaUBqgI4AkUCWQJaAlsCXAAEAKT/0wDF/9gBpf/xAlr/ugADATwACgGk//YBpf/2AAIBPAAKAaX/9gAPAAT/0wBc/+IA4//2AOT/9gEA//EBBv/xAQv/8QEh//EBU//xAXL/8QF1//ECMP/OAjH/zgJX/84CWP/OAA4AIf/sAEL/7ABy/+wAkf/sAJT/7ADj/+wA5P/sAQD/3QEG/90BC//dASH/3QFT/90Bcv/dAXX/3QAFAMT/1wDF/9cAy/+wAlr/nAJc/5wAAwDF//YAyv/sAkb/3QADAAT/3QBc/90Ay//7AAUAxP/2AMX/9gDK/+wAy//xAkb/3QAEAMT/+wDF//sAy//vATwACgABAYT/9gANAAP/8QAE/9MBAP/iAQb/4gEL/+IBIf/iAVP/4gFy/+IBdf/iAXz/4gGK/+wBq//sAjD/ugALACH/9gBC//YAkf/2AJT/9gDk/+wBAP/iAQb/4gEL/+IBIf/iAXL/4gF1/+IAEAAE/9gAIf/2AEL/9gBy//YAkf/2AJT/9gDj/+wA5P/sAQD/4gEG/+IBC//iASH/4gFT/+IBcv/iAXX/4gF8/+YACwAh/+wAQv/sAJH/7ACU/+wA5P/sAQD/3QEG/90BC//dASH/3QFy/90Bdf/dABQAA//xACH/8QBC//EAkf/xAJT/8QDk/8kBAP+/AQb/vwEL/78BIf+/AUn/4gFy/78Bc//iAXX/vwF2/+IBqv/2Aav/4gIw/5wCV/+cAlj/nAACAYT/+wGl//YAAwGE//sBpP/2AaX/9gANAOP/9gDk//YBAP/7AQb/+wEL//sBIf/7AVP/+wFy//sBdf/7AjD/zgIx/84CV//OAlj/zgAJAQD/9gEG//YBC//2ASH/9gE8AA0BU//2AXL/9gF1//YBfP/2AAICWv/sAlz/7AABAlr/7AADAYT/+wGl//YBqv/2AAQBhP/7AaT/9gGl//YBqv/2AA0A4//2AOT/9gEA//sBBv/7AQv/+wEh//sBU//7AXL/+wF1//sCMP/EAjH/xAJX/8QCWP/EAAIBhP/7Aar/9gAPAOP/9gDk//YBAP/7AQb/+wEL//sBIf/7AVP/+wFy//sBdf/7AjD/zgIx/84CV//OAlj/zgJaAAoCXAAKAAcA5P/2AQD/9gEG//YBC//2ASH/9gFy//YBdf/2AAkA4//2AOT/9gEA//YBBv/2AQv/9gEh//YBU//2AXL/9gF1//YABwEA//YBBv/2AQv/9gEh//YBPAANAXL/9gF1//YAAQE8AF8ABQAh/90AQv/dAHL/3QCR/90AlP/dAAIABP+6AFz/oAAIAQD/7AEG/+wBC//sASH/7AFT/+wBcv/sAXX/7AF8/+wAAQBc/6AABgEA/+wBBv/sAQv/7AEh/+wBcv/sAXX/7AACALgABAAAANQBFAAGAA4AAP/Y/7r/uv/xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAAAAAAAAAAAA//b/8QAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/9j/9v/s/+L/5gAAAAAAAAAAAAAAAAAAAAAAAAAA/+z/7P/dAAAAAAAAAAAAAAAAAAAAAAAAAAD/uv/x/8n/v/+///H/4v+c/+IAAQAMAAQAHgAgACcALQBeAHIAlADEAMUAygDLAAIACgAeAB4AAQAgACAAAgAnACcAAgAtAC0AAQBeAF4ABAByAHIAAgCUAJQAAgDEAMUAAwDKAMoABADLAMsABQACABwABAAEAAUAIQAhAAYAQgBCAAYAcgByAAYAkQCRAAYAlACUAAYAmwCbAAoAxADFAAEAywDLAAIA4wDkAAcBAAEAAAgBBgEGAAgBCwELAAgBIQEhAAgBSQFKAAsBUwFTAAgBcgFyAAgBcwFzAAsBdQF1AAgBdgF2AAsBfAF8AAkBigGKAA0BpAGlAAQBqwGrAA0CMAIxAAwCVwJYAAwCWgJaAAMCXAJcAAMAAgBMAAQAAABuAK4ABQAGAAD/9gAAAAAAAAAAAAD/9gAAAAAAAAAAAAAAAP/sAAAAAAAAAAAAAAAA//b/9gAAAAAAAAAAAAD/9v/2AAEADwDjAOQA/QD/AQsBJwE/AUkBSgFTAXIBcwGkAaUBqgACAAoA/QD9AAEA/wD/AAEBCwELAAEBJwEnAAIBPwE/AAQBSQFKAAIBUwFTAAEBcgFzAAEBpAGlAAMBqgGqAAQAAgAMAOMA5AADAQABAAAEAQYBBgAEAQsBCwAEASEBIQAEAVMBUwAEAXIBcgAEAXUBdQAEAXwBfAAFAaQBpQABAloCWgACAlwCXAACAAIAIAAEAAAAKgA2AAIABAAA/7oAAAAAAAAAAP/s/+cAAgABAlkCXAAAAAECWgADAAEAAAABAAIACQAEAAQAAQEAAQAAAgEGAQYAAgELAQsAAgEhASEAAgFTAVMAAgFyAXIAAgF1AXUAAgF8AXwAAwAEAAAAAQAIAAEADABMAAQAVAGKAAIACgK1Ar4AAALAAswACgLOAs4AFwLQAtIAGALUAtgAGwLmAvAAIALyAvMAKwL1Av0ALQL/AwcANgMXAyQAPwABAAICRAJuAE0AAxgiAAMYIgADGCIAAxgiAAMYIgADGBwAAxgiAAMYKAADGC4AAxg0AAMYOgADGDoAAxiUAAMYQAADGEAAAxhGAAMYRgADGJQAAxhMAAMYlAADGJQAAxhSAAMYUgABFpQAARaUAAEWoAACA2IAARaOAAADaAAAA24AAAOGAAADdAADGF4AAxheAAMYXgADGF4AAxheAAMYWAADGF4AAxhkAAMYdgADGGoAAxigAAMYoAADGKAAAxhwAAMYcAADGHYAAxh2AAMYfAADGIIAAxigAAMYoAADGIgAARaUAAEWwgABFpoAARagAAIDgAABFqYAARasAAADhgAAA4wAAxiUAAMYlAADGJQAAxiUAAMYlAADGI4AAxiUAAMYlAADGKAAAxigAAMYoAADGKAAAxiaAAMYoAACABIAAAAAAAAT4gAAAAAAAAABAJMBSQAEAAAAAQAIAAEADABAAAUAyAI8AAIACAK1Ar4AAALAAs4ACgLQAtIAGQLUAtgAHALmAvAAIQLyAvMALAL1AwcALgMXAyQAQQACABYABAAfAAAAIQBAABwAQgBnADwAaQBtAGIAcACLAGcAjQCQAIMAlQChAIcApADAAJQAwgDDALEAxQDJALMAywD+ALgBAAEGAOwBCAEfAPMBIQE7AQsBPQFIASYBSgFOATIBUQFsATcBbgFxAVMBdgGBAVcBhAGjAWMBpQGpAYMBqwHCAYgATwACFgQAAhYEAAIWBAACFgQAAhYEAAIV/gACFgQAAhYKAAIWEAACFhYAAhYcAAIWHAACFnYAAhYiAAIWIgACFigAAhYoAAIWdgACFi4AAhZ2AAIWdgACFjQAAhY0AAQBPgAAFHYAABR2AAAUggABAUQAABRwAAMBSgADAVAAAwFoAAMBVgACFkAAAhZAAAIWQAACFkAAAhZAAAIWOgACFkAAAhZGAAIWWAACFkwAAhaCAAIWggACFoIAAhZSAAIWUgACFlgAAhZYAAIWXgACFmQAAhaCAAIWggACFmoABAFcAAAUdgAAFKQAABR8AAAUggABAWIAABSIAAAUjgADAWgAAwFuAAIWdgACFnYAAhZ2AAIWdgACFnYAAhZwAAIWdgACFnYAAhaCAAIWggACFoIAAhaCAAIWfAACFoIAAf7FAf4AAf+QAAAAAf8QATIAAf6mATIAAf6oAVsAAf7FArAAAf/oAAAAAf8dATIAAf6eAVEBoBBCEEgQTgAAAAAQQhBIEE4AAAAAEEIQSBBOAAAAABBCEEgQTgAAAAAQQhBIEE4AAAAAEEIQSBBOAAAAABBCEEgQTgAAAAAQQhBIEE4AAAAAEEIQSBBOAAAAABBCEEgQTgAAAAAQQhBIEE4AAAAAEEIQSBBOAAAAABBCEEgQTgAAAAAQQhBIEE4AAAAAEEIQSBBOAAAAABBCEEgQTgAAAAAQQhBIEE4AAAAAEEIQSBBOAAAAABBCEEgQTgAAAAAQQhBIEE4AAAAAEEIQSBBOAAAAABBCEEgQTgAAAAAQQhBIEE4AAAAAEEIQSBBOAAAAABBCEEgQTgAAAAAQQhBIEE4AAAAAAAAAABBUAAAAAAAAAAAQVAAAAAARJgAAESwAAAAAESYAABEsAAAAABEmAAARLAAAAAARJgAAAAAAAAAAESYAABEsAAAAABEmAAARLAAAAAAAAAAAEGAQbAAAAAAAABBaEGwAAAAAAAAQYBBsAAAAAAAAEGAQbAAAAAAAABBgEGwAAAAAAAAQZhBsAAAQchB4EH4AAAAAEHIQeBB+AAAAABByEHgQfgAAAAAQchB4EH4AAAAAEHIQeBB+AAAAABByEHgQfgAAAAAQchB4EH4AAAAAEHIQeBB+AAAAABByEHgQfgAAAAAQchB4EH4AAAAAEHIQeBB+AAAAABByEHgQfgAAAAAQchB4EH4AAAAAEHIQeBB+AAAAABByEHgQfgAAAAAQchB4EH4AAAAAEHIQeBB+AAAAABByEHgQfgAAAAAQchB4EH4AAAAAEHIQeBB+AAAAABCEAAAQigAAAAAQhAAAEIoAAAAAEIQAABCKAAAAABCEAAAQigAAAAAQhAAAEIoAAAAAEIQAABCKAAAAABCQAAAQlhCcAAAQkAAAEJYQnAAAEJAAABCWEJwAABCQAAAQlhCcAAAQqBCuELQAAAAAEKgQrhCiAAAAABCoEK4QtAAAAAAQqBCuELQAAAAAEKgQrhC0AAAAABCoEK4QtAAAAAAQqBCuELQAAAAAEKgQrhC0AAAAABCoEK4QtAAAAAAQqBCuELQAAAAAEKgQrhC0AAAAABCoEK4QtAAAAAAQqBCuELQAAAAAEKgQrhC0AAAAABCoEK4QtAAAAAAQqBCuELQAAAAAAAAAABC6AAAAAAAAAAAQugAAAAAQwAAAAAAAAAAAEMAAAAAAAAAAABDMAAAQ0hDYEN4QzAAAEMYQ2BDeEMwAABDSENgQ3hDMAAAQ0hDYEN4QzAAAENIQ2BDeEMwAABDSENgQ3hDMAAAQ0hDYEN4QzAAAENIQ2BDeETIAABE4AAAAABEyAAAQ5AAAAAARMgAAETgAAAAAETIAABE4AAAAABEyAAAROAAAAAARMgAAETgAAAAAETIAABE4AAAAABE+EUQRShFQEVYRPhFEEUoRUBFWET4RRBFKEVARVhE+EUQRShFQEVYRPhFEEUoRUBFWET4RRBFKEVARVhE+EUQRShFQEVYRPhFEEUoRUBFWET4RRBFKEVARVhE+EUQRShFQEVYRPhFEEUoRUBFWET4RRBFKEVARVhE+EUQRShFQEVYRPhFEEUoRUBFWET4RRBFKEVARVhE+EUQRShFQEVYRPhFEEUoRUBFWET4RRBFKEVARVhE+EUQRShFQEVYRPhFEEUoRUBFWET4RRBFKEVARVhE+EUQRShFQEVYRPhFEEUoRUBFWET4RRBFKEVARVhE+EUQRShFQEVYRPhFEEUoRUBFWET4RRBFKEVARVhE+EUQRShFQEVYRPhFEEUoRUBFWET4RRBFKEVARVhDqAAAQ8AAAAAAQ6gAAEPAAAAAAEOoAABDwAAAAABDqAAAQ8AAAAAAQ6gAAEPAAAAAAEOoAABDwAAAAABJYAAARXAAAAAASWAAAEVwAAAAAElgAABFcAAAAABJYAAARXAAAAAASWAAAEVwAAAAAElgAABFcAAAAABJYAAARXAAAAAAR5gAAEPYQ/AAAEeYAABD2EPwAABHmAAAQ9hD8AAAR5gAAEPYQ/AAAEeYAABD2EPwAABHmAAAQ9hD8AAARPhECEQgAABEOET4RAhEIAAARDhE+EQIRCAAAEQ4RPhECEQgAABEOET4RAhEIAAARDhE+EQIRCAAAEQ4RPhECEQgAABEOET4RAhEIAAARDhE+EQIRCAAAEQ4RPhECEQgAABEOET4RAhEIAAARDhE+EQIRCAAAEQ4RPhECEQgAABEOET4RAhEIAAARDhE+EQIRCAAAEQ4RPhECEQgAABEOET4RAhEIAAARDhE+EQIRCAAAEQ4RPhECEQgAABEOET4RAhEIAAARDhE+EQIRCAAAEQ4RPhECEQgAABEOET4RAhEIAAARDhE+EQIRCAAAEQ4RPhECEQgAABEOAAAAABEUAAAAAAAAAAARFAAAAAAAAAAAERQAAAAAAAAAABEUAAAAAAAAAAARFAAAAAARGgAAESAAAAAAERoAABEgAAAAABEaAAARIAAAAAARGgAAESAAAAAAERoAABEgAAAAABEaAAARIAAAAAARGgAAESAAAAAAERoAABEgAAAAABEaAAARIAAAAAAAAAAAEWIAAAAAAAAAABFiAAAAAAAAAAARYgAAAAAAAAAAEWIAAAAAERoAABEgAAAAABEaAAARIAAAAAARGgAAESAAAAAAERoAABEgAAAAABEaAAARIAAAAAARGgAAESAAAAAAESYAABEsAAAAABEyAAAROAAAAAARPhFEEUoRUBFWElgAABFcAAAAAAAAAAARYgAAAAARaBFuEXQAAAAAEWgRbhF0AAAAABFoEW4RdAAAAAARaBFuEXQAAAAAEWgRbhF0AAAAABFoEW4RdAAAAAARaBFuEXQAAAAAEWgRbhF0AAAAABFoEW4RdAAAAAARaBFuEXQAAAAAEWgRbhF0AAAAABFoEW4RdAAAAAARaBFuEXQAAAAAEWgRbhF0AAAAABFoEW4RdAAAAAARaBFuEXQAAAAAEWgRbhF0AAAAABFoEW4RdAAAAAARaBFuEXQAAAAAEWgRbhF0AAAAABFoEW4RdAAAAAARaBFuEXQAAAAAEWgRbhF0AAAAABFoEW4RdAAAAAARaBFuEXQAAAAAEWgRbhF0AAAAAAAAAAARegAAAAAAAAAAEXoAAAAAEkwAABJSAAAAABJMAAASUgAAAAASTAAAElIAAAAAEkwAAAAAAAAAABJMAAASUgAAAAASTAAAElIAAAAAAAAAAAAAEYYAAAAAAAAAABGGAAAAAAAAAAARhgAAAAAAABGAEYYAABGMEZIScAAAAAARjBGSEnAAAAAAEYwRkhJwAAAAABGMEZIScAAAAAARjBGSEnAAAAAAEYwRkhJwAAAAABGMEZIScAAAAAARjBGSEnAAAAAAEYwRkhJwAAAAABGMEZIScAAAAAARjBGSEnAAAAAAEYwRkhJwAAAAABGMEZIScAAAAAARjBGSEnAAAAAAEYwRkhJwAAAAABGMEZIScAAAAAARjBGSEnAAAAAAEYwRkhJwAAAAABGMEZIScAAAAAARjBGSEnAAAAAAEZgRnhGkAAAAABGqAAARsAAAAAARqgAAEbAAAAAAEaoAABGwAAAAABGqAAARsAAAAAARqgAAEbAAAAAAEaoAABGwAAAAABG2AAARvBHCAAARtgAAEbwRwgAAEbYAABG8EcIAABG2AAARvBHCAAARyBHOAAAAAAAAEdQAABHaAAAAABHUAAAR2gAAAAAR1AAAEdoAAAAAEdQAABHaAAAAABHUAAAR2gAAAAAR1AAAEdoAAAAAEdQAABHaAAAAABHUAAAR2gAAAAARyBHOAAAAAAAAEdQAABHaAAAAABHUAAAR2gAAAAAR1AAAEdoAAAAAEcgRzgAAAAAAABHUAAAR2gAAAAARyBHOAAAAAAAAEdQAABHaAAAAAAAAAAAR4AAAAAAAAAAAEeAAAAAAEeYAAAAAAAAAABHmAAAAAAAAAAAR5gAAAAAAAAAAEfIAABH4Ef4AABHyAAAR+BH+AAAR8gAAEfgR/gAAEfIAABH4Ef4AABHyAAAR+BHsAAAR8gAAEfgR/gAAEfIAABH4Ef4AABJYAAASXgAAAAASWAAAEl4AAAAAElgAABJeAAAAABJYAAASXgAAAAASWAAAEl4AAAAAElgAABJeAAAAABJYAAASXgAAAAASZBJqEnASdhJ8EmQSahJwEnYSfBJkEmoScBJ2EnwSZBJqEnASdhJ8EmQSahJwEnYSfBJkEmoScBJ2EnwSZBJqEnASdhJ8EmQSahJwEnYSfBJkEmoScBJ2EnwSZBJqEnASdhJ8EmQSahJwEnYSfBJkEmoScBJ2EnwSZBJqEnASdhJ8EmQSahJwEnYSfBJkEmoScBJ2EnwSZBJqEnASdhJ8EmQSahJwEnYSfBJkEmoScBJ2EnwSZBJqEnASdhJ8EmQSahJwEnYSfBJkEmoScBJ2EnwSZBJqEnASdhJ8EmQSahJwEnYSfBJkEmoScBJ2EnwSZBJqEnASdhJ8EmQSahJwEnYSfBJkEmoScBJ2EnwSZBJqEnASdhJ8EmQSahJwEnYSfBJkEmoScBJ2EnwSBAAAEgoAAAAAEgQAABIKAAAAABIEAAASCgAAAAASBAAAEgoAAAAAEgQAABIKAAAAABIEAAASCgAAAAASggAAEogAAAAAEoIAABKIAAAAABKCAAASiAAAAAASggAAEogAAAAAEoIAABKIAAAAABKCAAASiAAAAAASEAAAAAASFhIcEhAAAAAAEhYSHBIQAAAAABIWEhwSEAAAAAASFhIcEhAAAAAAEhYSHBIQAAAAABIWEhwSIhIoEi4AABI0EiISKBIuAAASNBIiEigSLgAAEjQSIhIoEi4AABI0EiISKBIuAAASNBIiEigSLgAAEjQSIhIoEi4AABI0EiISKBIuAAASNBIiEigSLgAAEjQSIhIoEi4AABI0EiISKBIuAAASNBIiEigSLgAAEjQSIhIoEi4AABI0EiISKBIuAAASNBIiEigSLgAAEjQSIhIoEi4AABI0EiISKBIuAAASNBIiEigSLgAAEjQSIhIoEi4AABI0EiISKBIuAAASNBIiEigSLgAAEjQSIhIoEi4AABI0EiISKBIuAAASNBIiEigSLgAAEjQSIhIoEi4AABI0EiISKBIuAAASNAAAAAASOgAAAAAAAAAAEjoAAAAAAAAAABI6AAAAAAAAAAASOgAAAAAAAAAAEjoAAAAAEkAAABJGAAAAABJAAAASRgAAAAASQAAAEkYAAAAAEkAAABJGAAAAABJAAAASRgAAAAASQAAAEkYAAAAAEkAAABJGAAAAABJAAAASRgAAAAASQAAAEkYAAAAAAAAAABKOAAAAAAAAAAASjgAAAAAAAAAAEo4AAAAAAAAAABKOAAAAABJAAAASRgAAAAASQAAAEkYAAAAAEkAAABJGAAAAABJAAAASRgAAAAASQAAAEkYAAAAAEkAAABJGAAAAABJMAAASUgAAAAASWAAAEl4AAAAAEmQSahJwEnYSfBKCAAASiAAAAAAAAAAAEo4AAAAAAAEBVwAAAAECVf/8AAEBVAKwAAECbQKwAAED5QKwAAEBQwKwAAEDsQH+AAEAugFcAAEBQgAAAAEB2f/8AAEBQQKwAAEBWwAAAAEBYwKwAAEBZQAAAAEBZAKwAAEBaAIoAAECTwKwAAEAqAAAAAEAsf/8AAEApAKwAAEBBQKwAAEBWAAAAAEDIgKwAAEBHQAAAAEAowKwAAEAsAF+AAEAsgJcAAED0QKwAAEBTgAAAAEBSgKwAAEBIgKwAAEBKAElAAEBKv/1AAEBWQKwAAEB/QKwAAEB7wKwAAEBOAAAAAEBRgKwAAEBLQAAAAEBNwKwAAEBZAAAAAEBZwKwAAEBYQAAAAEBPf/1AAEBWgKwAAEBWQFPAAEBpgKwAAEBNgKwAAEBPQKwAAEBDAAAAAEBn//8AAEBHAH+AAEBnwH+AAEDSwH+AAEBkgJlAAEBHAAAAAEBlAAHAAEBCwAAAAEAmQH3AAEBEQH+AAEBJ/9gAAEBIwH+AAEBJQAAAAEAjwLuAAEAtwJqAAEAlgAAAAEAmv/8AAEAlAAAAAEAlQH+AAEAkgH+AAEBIgAAAAEA1wFuAAEAkwAAAAEAlQLuAAEAlwFxAAEAkgAAAAEA2AH+AAEAzgAAAAEA1AC+AAEAZgH+AAEBKQAAAAEBuf/8AAEBJgH+AAEBpgH+AAEBpQH+AAEBMv9kAAEBLAH+AAEA0wAAAAEA/gH+AAEBIwAAAAEBKgH+AAEBHwAAAAEA1P/0AAEBIgH+AAEBHQDnAAEBSAH+AAEA8gAAAAEA9QH+AAEBCQH+AAYBAAABAAgAAQAMACQAAQA2AIQAAQAKAs4C0ALRAtQC/wMAAwEDAgMEAwUAAQAHAs8C0wL/AwADAQMEAwUACgAAADAAAAAwAAAAPAAAACoAAAAwAAAAXgAAADYAAAA8AAAAQgAAAEgAAf9cAAAAAf+TAAAAAf+UAAAAAf9/AAAAAf9YAAAAAf9eAAAABwAQABYAHAAiACgALgA0AAH/OAAAAAH/VwAAAAH/k/86AAH/OP88AAH/lP6hAAH/WP8cAAH/Xv8dAAYCAAABAAgAAQAMADQAAQA6AbIAAgAGArUCvgAAAsACzAAKAuYC8AAXAvIC8wAiAvUC/QAkAxcDJAAtAAEAAQL9ADsAAAD0AAAA9AAAAPQAAAD0AAAA9AAAAO4AAAD0AAAA+gAAAQAAAAEGAAABDAAAAQwAAAFmAAABEgAAARIAAAEYAAABGAAAAWYAAAEeAAABZgAAAWYAAAEkAAABJAAAATAAAAEwAAABMAAAATAAAAEwAAABKgAAATAAAAE2AAABSAAAATwAAAFyAAABcgAAAXIAAAFCAAABQgAAAUgAAAFIAAABTgAAAVQAAAFyAAABcgAAAVoAAAFmAAABZgAAAWYAAAFmAAABZgAAAWAAAAFmAAABZgAAAXIAAAFyAAABcgAAAXIAAAFsAAABcgAB/6EB/gAB/zgB/gAB/50B/gAB/yMB/gAB/ucB/gAB/0QB/gAB/2UB/gAB/yIB/gAB/20B/gAB/5YB/gAB/6ACsAAB/zgCsAAB/6YCsAAB/ucCsAAB/2UCsAAB/yMCsAAB/2ICsAAB/20CsAAB/5QCsAAB/1gB/gAB/1cB/gAB/1gCsAAB/1cCsAABAAQAAf+UA2UAAAABAAAACgJoCDIAA0RGTFQAFGN5cmwAPmxhdG4AlgAEAAAAAP//ABAAAAANABoAJwA0AEEATgBlAHIAfwCMAJkApgCzAMAAzQAKAAFUQVQgADAAAP//ABAAAQAOABsAKAA1AEIATwBmAHMAgACNAJoApwC0AMEAzgAA//8AEQACAA8AHAApADYAQwBQAFsAZwB0AIEAjgCbAKgAtQDCAM8AOgAJQVpFIABgQ0FUIACIQ1JUIACwR1VBIADYS0FaIAEATU9MIAEoUExLIAFQUk9NIAF4VFJLIAGgAAD//wAQAAMAEAAdACoANwBEAFEAaAB1AIIAjwCcAKkAtgDDANAAAP//ABEABAARAB4AKwA4AEUAUgBcAGkAdgCDAJAAnQCqALcAxADRAAD//wARAAUAEgAfACwAOQBGAFMAXQBqAHcAhACRAJ4AqwC4AMUA0gAA//8AEQAGABMAIAAtADoARwBUAF4AawB4AIUAkgCfAKwAuQDGANMAAP//ABEABwAUACEALgA7AEgAVQBfAGwAeQCGAJMAoACtALoAxwDUAAD//wARAAgAFQAiAC8APABJAFYAYABtAHoAhwCUAKEArgC7AMgA1QAA//8AEQAJABYAIwAwAD0ASgBXAGEAbgB7AIgAlQCiAK8AvADJANYAAP//ABEACgAXACQAMQA+AEsAWABiAG8AfACJAJYAowCwAL0AygDXAAD//wARAAsAGAAlADIAPwBMAFkAYwBwAH0AigCXAKQAsQC+AMsA2AAA//8AEQAMABkAJgAzAEAATQBaAGQAcQB+AIsAmAClALIAvwDMANkA2mFhbHQFHmFhbHQFHmFhbHQFHmFhbHQFHmFhbHQFHmFhbHQFHmFhbHQFHmFhbHQFHmFhbHQFHmFhbHQFHmFhbHQFHmFhbHQFHmFhbHQFHmNhc2UFJmNhc2UFJmNhc2UFJmNhc2UFJmNhc2UFJmNhc2UFJmNhc2UFJmNhc2UFJmNhc2UFJmNhc2UFJmNhc2UFJmNhc2UFJmNhc2UFJmNjbXAFLGNjbXAFLGNjbXAFLGNjbXAFLGNjbXAFLGNjbXAFLGNjbXAFLGNjbXAFLGNjbXAFLGNjbXAFLGNjbXAFLGNjbXAFLGNjbXAFLGRub20FOGRub20FOGRub20FOGRub20FOGRub20FOGRub20FOGRub20FOGRub20FOGRub20FOGRub20FOGRub20FOGRub20FOGRub20FOGZyYWMFPmZyYWMFPmZyYWMFPmZyYWMFPmZyYWMFPmZyYWMFPmZyYWMFPmZyYWMFPmZyYWMFPmZyYWMFPmZyYWMFPmZyYWMFPmZyYWMFPmxpZ2EFSGxpZ2EFSGxpZ2EFSGxpZ2EFSGxpZ2EFSGxpZ2EFSGxpZ2EFSGxpZ2EFSGxpZ2EFSGxpZ2EFSGxpZ2EFSGxpZ2EFSGxpZ2EFSGxudW0FTmxudW0FTmxudW0FTmxudW0FTmxudW0FTmxudW0FTmxudW0FTmxudW0FTmxudW0FTmxudW0FTmxudW0FTmxudW0FTmxudW0FTmxvY2wFVmxvY2wFXGxvY2wFYmxvY2wFaGxvY2wFbmxvY2wFdGxvY2wFemxvY2wFgGxvY2wFhmxvY2wFjG51bXIFkm51bXIFkm51bXIFkm51bXIFkm51bXIFkm51bXIFkm51bXIFkm51bXIFkm51bXIFkm51bXIFkm51bXIFkm51bXIFkm51bXIFkm9udW0FmG9udW0FmG9udW0FmG9udW0FmG9udW0FmG9udW0FmG9udW0FmG9udW0FmG9udW0FmG9udW0FmG9udW0FmG9udW0FmG9udW0FmG9yZG4Fnm9yZG4Fnm9yZG4Fnm9yZG4Fnm9yZG4Fnm9yZG4Fnm9yZG4Fnm9yZG4Fnm9yZG4Fnm9yZG4Fnm9yZG4Fnm9yZG4Fnm9yZG4FnnBudW0FpnBudW0FpnBudW0FpnBudW0FpnBudW0FpnBudW0FpnBudW0FpnBudW0FpnBudW0FpnBudW0FpnBudW0FpnBudW0FpnBudW0FpnNpbmYFrHNpbmYFrHNpbmYFrHNpbmYFrHNpbmYFrHNpbmYFrHNpbmYFrHNpbmYFrHNpbmYFrHNpbmYFrHNpbmYFrHNpbmYFrHNpbmYFrHN1YnMFsnN1YnMFsnN1YnMFsnN1YnMFsnN1YnMFsnN1YnMFsnN1YnMFsnN1YnMFsnN1YnMFsnN1YnMFsnN1YnMFsnN1YnMFsnN1YnMFsnN1cHMFuHN1cHMFuHN1cHMFuHN1cHMFuHN1cHMFuHN1cHMFuHN1cHMFuHN1cHMFuHN1cHMFuHN1cHMFuHN1cHMFuHN1cHMFuHN1cHMFuHRudW0FvnRudW0FvnRudW0FvnRudW0FvnRudW0FvnRudW0FvnRudW0FvnRudW0FvnRudW0FvnRudW0FvnRudW0FvnRudW0FvnRudW0Fvnplcm8FxHplcm8FxHplcm8FxHplcm8FxHplcm8FxHplcm8FxHplcm8FxHplcm8FxHplcm8FxHplcm8FxHplcm8FxHplcm8FxHplcm8FxAAAAAIAAAABAAAAAQAfAAAABAACAAMABAAFAAAAAQAUAAAAAwAVABYAFwAAAAEAIAAAAAIAGgAbAAAAAQAPAAAAAQAHAAAAAQAKAAAAAQAJAAAAAQAIAAAAAQALAAAAAQAMAAAAAQAOAAAAAQANAAAAAQAGAAAAAQATAAAAAQAeAAAAAgAYABkAAAABABwAAAABABEAAAABABAAAAABABIAAAABAB0AAAABACEAJwBQAfoDrgRSBNYFiAcCBwIGIgcCBmQHAgaiBqIGxAcCBxYHFgdKB3oHWAdmB3oHiAfGCA4IMAgwCEgIjgjUCRoKOgp+CpgLVAtiC3YLjgABAAAAAQAIAAIA0gBmAcgA3gDfAckA4ADhAKAAqADYANkA2gDbANwA3QDiAcgBvgEzAc8BvwHJAcABwQGBAYgBuAG5AboBuwG8Ab0BwgIOAg8CEAIRAhICEwIUAhUCFgIXAj8CQAJBAkICLAJDAlICUwJUAlUCVgLmAucC6ALpAuoC6wLsAu0C7gLvAvAC8gLzAvUC9gL3AvgC+QL6AvsC/AL9Av4C/wMAAwEDAgMDAwQDBQMGAwcDCQMKAwsDDAMNAw4DDwMRAxIDEwMQAx8DIAMhAyIDIwMkAAEAZgAEACIAawByAHMAnACeAKcAzADNAM4A0ADSANMA1QDjAQEBKwFKAUsBUwFUAX0BfwGHAawBrQGuAbABsgGzAbUCGAIZAhoCGwIcAh0CHgIfAiACIQI1AjYCNwI4Aj0CRAJLAkwCTQJOAlACtQK2ArcCuAK5AroCuwK8Ar0CvgLAAsECwgLDAsQCxQLGAscCyALJAsoCywLNAs4CzwLQAtEC0gLTAtQC1wLYAtoC2wLdAt4C3wLgAuEC4gLkAuUDFgMXAxgDGgMbAxwDHgADAAAAAQAIAAEBigAqAFoAagB4AIYAlACiALAAvgDMANoA6AD6AQIBCgESARoBIgEqATIBOgDwAPoBAgEKARIBGgEiASoBMgE6AUIBSAFOAVQBWgFgAWYBbAFyAXgBfgGEAAcCBAIiAhgCDgHuAeQCAwAGAgUCIwIZAg8B7wHlAAYCBgIkAhoCEAHwAeYABgIHAiUCGwIRAfEB5wAGAggCJgIcAhIB8gHoAAYCCQInAh0CEwHzAekABgIKAigCHgIUAfQB6gAGAgsCKQIfAhUB9QHrAAYCDAIqAiACFgH2AewABgINAisCIQIXAfcB7QADAdAB+QHaAAQB0AH5AdoB+AADAdEB+gHbAAMB0gH7AdwAAwHTAfwB3QADAdQB/QHeAAMB1QH+Ad8AAwHWAf8B4AADAdcCAAHhAAMB2AIBAeIAAwHZAgIB4wACAeQB2gACAeUB2wACAeYB3AACAecB3QACAegB3gACAekB3wACAeoB4AACAesB4QACAewB4gACAe0B4wACAkQCQwACAxYDCAACAAUB0AHZAAAB5AH3AAoB+QICAB4COQI5ACgC2QLZACkABgAAAAQADgAgAHAAggADAAAAAQAmAAEAPgABAAAAIgADAAAAAQAUAAIAHAAsAAEAAAAiAAEAAgErATwAAgACAs0CzwAAAtEC2AADAAEAEAK1AroCvAK9Ar4CwALBAsICwwLFAscCyALJAsoCywLMAAMAAQB+AAEAfgAAAAEAAAAiAAMAAQASAAEAbAAAAAEAAAAiAAIAAgAEAOIAAAHLAcwA3wAGAAAAAgAKABwAAwAAAAEAQAABACQAAQAAACIAAwABABIAAQAuAAAAAQAAACIAAgAEAuYC8AAAAvIC8wALAvUDEwANAx8DJAAsAAIACQK1Ar4AAALAAssACgLNAtQAFgLXAtsAHgLdAuIAIwLkAuUAKQMWAxgAKwMaAxwALgMeAx4AMQAEAAAAAQAIAAEAlgAIABYAOABCAEwAVgB4AIIAjAAEAAoAEAAWABwCtgACArwCtwACAr0CuAACAsECuQACAscAAQAEArsAAgLHAAEABALEAAICvQABAAQCxgACAscABAAKABAAFgAcAucAAgLtAugAAgLuAukAAgLyAuoAAgL5AAEABALsAAIC+QABAAQC9gACAu4AAQAEAvgAAgL5AAEACAK1AroCwwLFAuYC6wL1AvcABAAAAAEACAABAIYABAAOADAAUgBsAAQACgAQABYAHAMcAAICvAMbAAICvQMeAAICxQMdAAICyAAEAAoAEAAWABwDGAACArwDFwACAr0DGgACAsUDGQACAsgAAwAIAA4AFAMjAAIC7QMiAAIC7gMkAAIC9wADAAgADgAUAyAAAgLtAx8AAgLuAyEAAgL3AAEABALAAsIC8ALzAAEAAAABAAgAAgAeAAwA2ADZANoA2wDcAN0BuAG5AboBuwG8Ab0AAQAMAMwAzQDOANAA0gDTAawBrQGuAbABsgGzAAYAAAACAAoAJAADAAEAFAABBQIAAQAUAAEAAAAjAAEAAQFCAAMAAQAUAAEE6AABABQAAQAAACQAAQABAGAAAQAAAAEACAACAA4ABACgAKgBgQGIAAEABACeAKcBfwGHAAEAAAABAAgAAgAcAAsA3gDfAOAA4QDiAb4BvwHAAcEBwgMWAAEACwAiAGsAcwCcANUBAQFLAVQBfQG1AtkAAQAAAAEACAABAAYACAABAAEBKwABAAAAAQAIAAIAHAALAc8CBAIFAgYCBwIIAgkCCgILAgwCDQACAAIBSgFKAAAB0AHZAAEAAQAAAAEACAABAKoAUgABAAAAAQAIAAEAnAA+AAEAAAABAAgAAQAG/+8AAQABAj0AAQAAAAEACAABAHoASAAGAAAAAgAKACIAAwABABIAAQPyAAAAAQAAACUAAQABAiwAAwABABIAAQPaAAAAAQAAACUAAgABAg4CFwAAAAYAAAACAAoAJAADAAEALAABABIAAAABAAAAJgABAAIABADjAAMAAQASAAEAHAAAAAEAAAAmAAIAAQHQAdkAAAABAAIAcgFTAAQAAAABAAgAAQAUAAEACAABAAQCrgADAVMCMAABAAEAaQABAAAAAQAIAAEABv/sAAIAAQHkAe0AAAABAAAAAQAIAAIALgAUAdAB0QHSAdMB1AHVAdYB1wHYAdkB5AHlAeYB5wHoAekB6gHrAewB7QACAAIB7gH3AAAB+QICAAoAAQAAAAEACAACAC4AFAHuAe8B8AHxAfIB8wH0AfUB9gH3AfkB+gH7AfwB/QH+Af8CAAIBAgIAAgACAdAB2QAAAeQB7QAKAAEAAAABAAgAAgAuABQB5AHlAeYB5wHoAekB6gHrAewB7QH5AfoB+wH8Af0B/gH/AgACAQICAAIAAgHQAdkAAAHuAfcACgABAAAAAQAIAAIAugBaAdoB2wHcAd0B3gHfAeAB4QHiAeMB2gHbAdwB3QHeAd8B4AHhAeIB4wHaAdsB3AHdAd4B3wHgAeEB4gHjAj8CQAJBAkICQwJSAlMCVAJVAlYC5gLnAugC6QLqAusC7ALtAu4C7wLwAvIC8wL1AvYC9wL4AvkC+gL7AvwC/QL+Av8DAAMBAwIDAwMEAwUDBgMHAwgDCQMKAwsDDAMNAw4DDwMRAxIDEwMQAx8DIAMhAyIDIwMkAAIADwHkAfcAAAH5AgIAFAI1AjgAHgJEAkQAIgJLAk4AIwJQAlAAJwK1Ar4AKALAAssAMgLNAtQAPgLXAtsARgLdAuIASwLkAuUAUQMWAxgAUwMaAxwAVgMeAx4AWQAEAAAAAQAIAAEANgABAAgABQAMABQAHAAiACgBxAADASABKwHFAAMBIAFCAcMAAgEgAcYAAgErAccAAgFCAAEAAQEgAAEAAAABAAgAAgAKAAICAwH4AAEAAgHQAe4AAQAAAAEACAACAG4ANAEsAT0C5gLnAugC6QLqAusC7ALtAu4C7wLwAvIC8wL1AvYC9wL4AvkC+gL7AvwC/QL+Av8DAAMBAwIDAwMEAwUDBgMHAwgDCQMKAwsDDAMNAw4DDwMRAxIDEwMQAx8DIAMhAyIDIwMkAAIACwErASsAAAE8ATwAAQK1Ar4AAgLAAssADALNAtQAGALXAtsAIALdAuIAJQLkAuUAKwMWAxgALQMaAxwAMAMeAx4AMwABAAAAAQAIAAEAFAALAAEAAAABAAgAAQAGAAoAAQABAjkAAQAAAAEACAABAAb/9gACAAECGAIhAAAAAQAAAAEACAACAA4ABAHIAckByAHJAAEABAAEAHIA4wFTAAA="); }</style>
+ </defs>
+ <title>ender3_bed_texture</title>
+ <path d="M567.7,567.8" style="fill: none;stroke: #fff;stroke-linecap: round;stroke-linejoin: round;stroke-width: 1.5px"/>
+ <path d="M.8,624.4" style="fill: none;stroke: #fff;stroke-linecap: round;stroke-linejoin: round;stroke-width: 1.5px"/>
+ <line x1="624.4" y1="624.4" x2="624.4" y2="0.8" style="fill: none;stroke: #fff;stroke-linecap: round;stroke-linejoin: round;stroke-width: 1.5px"/>
+ <path d="M57.4,57.3" style="fill: none;stroke: #fff;stroke-linecap: round;stroke-linejoin: round;stroke-width: 1.5px"/>
+ <path d="M624.4.8" style="fill: none;stroke: #fff;stroke-linecap: round;stroke-linejoin: round;stroke-width: 1.5px"/>
+ <line x1="0.8" y1="0.8" x2="0.8" y2="624.4" style="fill: none;stroke: #fff;stroke-linecap: round;stroke-linejoin: round;stroke-width: 1.5px"/>
+ <line x1="0.8" y1="624.4" x2="0.8" y2="0.8" style="fill: none;stroke: #fff;stroke-linecap: round;stroke-linejoin: round;stroke-width: 1.5px"/>
+ <line x1="624.4" y1="0.8" x2="624.4" y2="624.4" style="fill: none;stroke: #fff;stroke-linecap: round;stroke-linejoin: round;stroke-width: 1.5px"/>
+ <line x1="0.8" y1="624.4" x2="624.4" y2="624.4" style="fill: none;stroke: #fff;stroke-linecap: round;stroke-linejoin: round;stroke-width: 1.5px"/>
+ <line x1="0.8" y1="0.8" x2="624.4" y2="0.8" style="fill: none;stroke: #fff;stroke-linecap: round;stroke-linejoin: round;stroke-width: 1.5px"/>
+ <g>
+ <path d="M567.7,440.2" style="fill: none"/>
+ <path d="M57.4,440.2" style="fill: none"/>
+ <path d="M567.7,312.6" style="fill: none"/>
+ <path d="M57.4,312.6" style="fill: none"/>
+ <path d="M57.4,184.9" style="fill: none"/>
+ <path d="M567.7,184.9" style="fill: none"/>
+ <path d="M185,57.3" style="fill: none"/>
+ <path d="M185,567.8" style="fill: none"/>
+ <path d="M312.6,567.8" style="fill: none"/>
+ <path d="M312.6,57.3" style="fill: none"/>
+ <path d="M440.1,57.3" style="fill: none"/>
+ <path d="M440.1,541.3" style="fill: none"/>
+ </g>
+ <text style="fill: rgb(255, 255, 255); font-family: &quot;Saira Stencil One&quot;; font-size: 34px; white-space: pre;" x="405.655" y="584.929" bx:origin="0.5 0.57">MEGA ZERO</text>
+</svg> \ No newline at end of file
diff --git a/resources/profiles/Anycubic/mega0_bed.stl b/resources/profiles/Anycubic/mega0_bed.stl
new file mode 100644
index 000000000..fb8f86d09
--- /dev/null
+++ b/resources/profiles/Anycubic/mega0_bed.stl
Binary files differ
diff --git a/resources/profiles/BIBO.idx b/resources/profiles/BIBO.idx
index f8ad05323..08676caf3 100644
--- a/resources/profiles/BIBO.idx
+++ b/resources/profiles/BIBO.idx
@@ -1,4 +1,7 @@
+min_slic3r_version = 2.3.0-beta2
+0.0.3 Removed obsolete host keys.
min_slic3r_version = 2.2.0-alpha3
+0.0.2 General print quality improvements
0.0.1 Multiple Print models were unified into a single one.
0.0.1-beta2 Bed model and textures added. Materials all use the BOBO2 identifier. deretract speed set to 0 to use retract speed.
0.0.1-beta1 Added new printer profiles for ditto printing. New retraction settings, new materials. Removed some settings which do not apply. More start gcode improvements.
diff --git a/resources/profiles/BIBO.ini b/resources/profiles/BIBO.ini
index 8247a34a7..db8504c2e 100644
--- a/resources/profiles/BIBO.ini
+++ b/resources/profiles/BIBO.ini
@@ -1,858 +1,853 @@
-# Print profiles for the BIBO printers.
-
-[vendor]
-# Vendor name will be shown by the Config Wizard.
-name = BIBO
-# Configuration version of this file. Config file will only be installed, if the config_version differs.
-# This means, the server may force the PrusaSlicer configuration to be downgraded.
-config_version = 0.0.1
-# Where to get the updates from?
-config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/BIBO/
-
-# The printer models will be shown by the Configuration Wizard in this order,
-# also the first model installed & the first nozzle installed will be activated after install.
-# Printer model name will be shown by the installation wizard.
-
-[printer_model:BIBO2]
-name = BIBO2 Touch
-variants = 0.4
-technology = FFF
-family = BIBO2
-bed_model = BIBO2_bed.stl
-bed_texture = BIBO2.svg
-default_materials = Generic PLA @BIBO2; Generic PETG @BIBO2; Generic ABS @BIBO2; Prusament PLA @BIBO2; Prusament PETG @BIBO2
-
-# All presets starting with asterisk, for example *common*, are intermediate and they will
-# not make it into the user interface.
-
-# Common print preset
-[print:*common*]
-avoid_crossing_perimeters = 0
-bottom_fill_pattern = rectilinear
-bridge_angle = 0
-bridge_flow_ratio = 0.95
-bridge_speed = 25
-brim_width = 0
-clip_multipart_objects = 1
-compatible_printers =
-complete_objects = 0
-dont_support_bridges = 1
-elefant_foot_compensation = 0
-ensure_vertical_shell_thickness = 1
-external_fill_pattern = rectilinear
-external_perimeters_first = 0
-external_perimeter_extrusion_width = 0.45
-extra_perimeters = 0
-extruder_clearance_height = 12
-extruder_clearance_radius = 45
-extrusion_width = 0.45
-fill_angle = 45
-fill_density = 20%
-fill_pattern = grid
-first_layer_extrusion_width = 0.42
-first_layer_height = 0.2
-first_layer_speed = 20
-gap_fill_speed = 30
-gcode_comments = 0
-infill_every_layers = 1
-infill_extruder = 1
-infill_extrusion_width = 0.45
-infill_first = 0
-infill_only_where_needed = 0
-infill_overlap = 25%
-interface_shells = 0
-max_print_speed = 60
-max_volumetric_extrusion_rate_slope_negative = 0
-max_volumetric_extrusion_rate_slope_positive = 0
-max_volumetric_speed = 0
-min_skirt_length = 4
-notes =
-overhangs = 1
-only_retract_when_crossing_perimeters = 0
-ooze_prevention = 0
-output_filename_format = {input_filename_base}_{layer_height}mm_{if num_extruders==1}{filament_type[0]}{else}E1{filament_type[0]}_E2{filament_type[1]}{endif}_{printer_model}_{print_time}.gcode
-perimeters = 2
-perimeter_extruder = 1
-perimeter_extrusion_width = 0.45
-post_process =
-print_settings_id =
-raft_layers = 0
-resolution = 0
-seam_position = aligned
-single_extruder_multi_material_priming = 0
-skirts = 3
-skirt_distance = 2
-skirt_height = 1
-small_perimeter_speed = 25
-solid_infill_below_area = 0
-solid_infill_every_layers = 0
-solid_infill_extruder = 1
-solid_infill_extrusion_width = 0.45
-spiral_vase = 0
-standby_temperature_delta = -5
-support_material = 0
-support_material_extruder = 0
-support_material_extrusion_width = 0.4
-support_material_interface_extruder = 0
-support_material_angle = 0
-support_material_buildplate_only = 0
-support_material_enforce_layers = 0
-support_material_contact_distance = 0.15
-support_material_interface_contact_loops = 0
-support_material_interface_layers = 2
-support_material_interface_spacing = 0.2
-support_material_interface_speed = 100%
-support_material_pattern = rectilinear
-support_material_spacing = 2
-support_material_speed = 40
-support_material_synchronize_layers = 0
-support_material_threshold = 45
-support_material_with_sheath = 0
-support_material_xy_spacing = 60%
-thin_walls = 0
-top_infill_extrusion_width = 0.45
-top_solid_infill_speed = 40
-travel_speed = 130
-wipe_tower = 0
-wipe_tower_bridging = 10
-wipe_tower_rotation_angle = 0
-wipe_tower_width = 60
-wipe_tower_x = 50
-wipe_tower_y = 50
-xy_size_compensation = 0
-
-[print:*0.05mm*]
-inherits = *common*
-bottom_solid_layers = 10
-bridge_acceleration = 300
-bridge_flow_ratio = 0.7
-default_acceleration = 500
-external_perimeter_speed = 20
-fill_density = 20%
-first_layer_acceleration = 250
-gap_fill_speed = 20
-infill_acceleration = 800
-infill_speed = 30
-max_print_speed = 60
-small_perimeter_speed = 20
-solid_infill_speed = 30
-support_material_extrusion_width = 0.3
-support_material_spacing = 1.5
-layer_height = 0.05
-perimeter_acceleration = 300
-perimeter_speed = 30
-perimeters = 3
-support_material_speed = 30
-top_solid_infill_speed = 20
-top_solid_layers = 15
-
-[print:*0.07mm*]
-inherits = *common*
-bottom_solid_layers = 8
-bridge_acceleration = 300
-bridge_flow_ratio = 0.7
-bridge_speed = 20
-default_acceleration = 1000
-external_perimeter_speed = 20
-fill_density = 15%
-first_layer_acceleration = 500
-gap_fill_speed = 20
-infill_acceleration = 800
-infill_speed = 40
-max_print_speed = 60
-small_perimeter_speed = 20
-solid_infill_speed = 40
-support_material_extrusion_width = 0.3
-support_material_spacing = 1.5
-layer_height = 0.07
-perimeter_acceleration = 300
-perimeter_speed = 30
-perimeters = 3
-support_material_speed = 40
-top_solid_infill_speed = 30
-top_solid_layers = 11
-
-[print:*0.10mm*]
-inherits = *common*
-bottom_solid_layers = 7
-bridge_flow_ratio = 0.7
-layer_height = 0.1
-perimeter_acceleration = 800
-top_solid_layers = 9
-
-[print:*0.12mm*]
-inherits = *common*
-perimeter_speed = 40
-external_perimeter_speed = 25
-infill_speed = 50
-solid_infill_speed = 40
-layer_height = 0.12
-perimeters = 3
-top_infill_extrusion_width = 0.4
-bottom_solid_layers = 6
-top_solid_layers = 7
-
-[print:*0.15mm*]
-inherits = *common*
-external_perimeter_speed = 40
-infill_acceleration = 1100
-infill_speed = 50
-layer_height = 0.15
-perimeter_acceleration = 800
-perimeter_speed = 40
-solid_infill_speed = 40
-top_infill_extrusion_width = 0.4
-bottom_solid_layers = 5
-top_solid_layers = 7
-
-[print:*0.20mm*]
-inherits = *common*
-perimeter_speed = 40
-external_perimeter_speed = 25
-infill_speed = 50
-solid_infill_speed = 40
-layer_height = 0.20
-top_infill_extrusion_width = 0.4
-bottom_solid_layers = 4
-top_solid_layers = 5
-
-[print:*0.24mm*]
-inherits = *common*
-perimeter_speed = 40
-external_perimeter_speed = 25
-infill_speed = 50
-solid_infill_speed = 40
-layer_height = 0.24
-top_infill_extrusion_width = 0.45
-bottom_solid_layers = 3
-top_solid_layers = 4
-
-[print:*0.28mm*]
-inherits = *common*
-perimeter_speed = 40
-external_perimeter_speed = 25
-infill_speed = 50
-solid_infill_speed = 40
-layer_height = 0.28
-top_infill_extrusion_width = 0.45
-bottom_solid_layers = 3
-top_solid_layers = 4
-
-[print:*0.30mm*]
-inherits = *common*
-bottom_solid_layers = 4
-bridge_flow_ratio = 0.95
-external_perimeter_speed = 40
-infill_acceleration = 1100
-infill_speed = 60
-layer_height = 0.3
-perimeter_acceleration = 800
-perimeter_speed = 50
-solid_infill_speed = 50
-top_infill_extrusion_width = 0.4
-top_solid_layers = 4
-
-[print:*soluble_support*]
-inherits = *common*
-overhangs = 1
-skirts = 0
-support_material = 1
-support_material_contact_distance = 0
-support_material_extruder = 2
-support_material_extrusion_width = 0.45
-support_material_interface_extruder = 2
-support_material_interface_layers = 3
-support_material_interface_spacing = 0.1
-support_material_synchronize_layers = 1
-support_material_threshold = 80
-support_material_with_sheath = 1
-wipe_tower_bridging = 6
-support_material_interface_speed = 80%
-perimeter_speed = 40
-solid_infill_speed = 40
-top_infill_extrusion_width = 0.45
-top_solid_infill_speed = 30
-
-[print:0.05mm ULTRADETAIL @BIBO2]
-inherits = *0.05mm*
-# alias = 0.05mm ULTRADETAIL
-infill_extrusion_width = 0.5
-
-[print:0.07mm SUPERDETAIL @BIBO2]
-inherits = *0.07mm*
-# alias = 0.07mm SUPERDETAIL
-infill_extrusion_width = 0.5
-
-[print:0.10mm HIGHDETAIL @BIBO2]
-inherits = *0.10mm*
-# alias = 0.10mm HIGHDETAIL
-infill_extrusion_width = 0.5
-
-[print:0.12mm DETAIL @BIBO2]
-inherits = *0.12mm*
-# alias = 0.12mm DETAIL
-travel_speed = 130
-infill_speed = 50
-solid_infill_speed = 40
-top_solid_infill_speed = 30
-support_material_extrusion_width = 0.38
-
-[print:0.15mm OPTIMAL @BIBO2]
-inherits = *0.15mm*
-# alias = 0.15mm OPTIMAL
-top_infill_extrusion_width = 0.45
-
-[print:0.20mm NORMAL @BIBO2]
-inherits = *0.20mm*
-# alias = 0.20mm NORMAL
-travel_speed = 130
-infill_speed = 50
-solid_infill_speed = 40
-top_solid_infill_speed = 30
-support_material_extrusion_width = 0.38
-
-[print:0.24mm DRAFT @BIBO2]
-inherits = *0.24mm*
-# alias = 0.24mm DRAFT
-travel_speed = 130
-infill_speed = 50
-solid_infill_speed = 40
-top_solid_infill_speed = 30
-support_material_extrusion_width = 0.38
-
-[print:0.28mm SUPERDRAFT @BIBO2]
-inherits = *0.28mm*
-# alias = 0.28mm SUPERDRAFT
-travel_speed = 130
-infill_speed = 50
-solid_infill_speed = 40
-top_solid_infill_speed = 30
-support_material_extrusion_width = 0.38
-
-[print:0.30mm ULTRADRAFT @BIBO2]
-inherits = *0.30mm*
-# alias = 0.30mm ULTRADRAFT
-bottom_solid_layers = 3
-bridge_speed = 30
-external_perimeter_speed = 35
-infill_acceleration = 1100
-infill_speed = 55
-max_print_speed = 60
-perimeter_speed = 50
-small_perimeter_speed = 30
-solid_infill_speed = 50
-top_solid_infill_speed = 40
-support_material_speed = 45
-external_perimeter_extrusion_width = 0.6
-extrusion_width = 0.5
-first_layer_extrusion_width = 0.42
-infill_extrusion_width = 0.5
-perimeter_extrusion_width = 0.5
-solid_infill_extrusion_width = 0.5
-top_infill_extrusion_width = 0.45
-support_material_extrusion_width = 0.38
-
-# Soluble Supports Profiles for dual extrusion #
-[print:0.15mm OPTIMAL SOLUBLE FULL @BIBO2]
-inherits = 0.15mm OPTIMAL @BIBO2; *soluble_support*
-compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_BIBO.*/ and num_extruders==2
-external_perimeter_speed = 25
-notes = Set your soluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder
-support_material_extruder = 2
-perimeter_speed = 40
-solid_infill_speed = 40
-top_infill_extrusion_width = 0.45
-top_solid_infill_speed = 30
-
-[print:0.15mm OPTIMAL SOLUBLE INTERFACE @BIBO2]
-inherits = 0.15mm OPTIMAL SOLUBLE FULL @BIBO2
-notes = Set your soluble extruder in Multiple Extruders > Support material/raft interface extruder
-support_material_interface_layers = 3
-support_material_with_sheath = 0
-support_material_xy_spacing = 80%
-
-[print:0.20mm NORMAL SOLUBLE FULL @BIBO2]
-inherits = 0.20mm NORMAL @BIBO2; *soluble_support*
-compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_BIBO.*/ and num_extruders==2
-external_perimeter_speed = 30
-notes = Set your soluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder
-support_material_extruder = 2
-perimeter_speed = 40
-solid_infill_speed = 40
-top_solid_infill_speed = 30
-
-[print:0.20mm NORMAL SOLUBLE INTERFACE @BIBO2]
-inherits = 0.20mm NORMAL SOLUBLE FULL @BIBO2
-notes = Set your soluble extruder in Multiple Extruders > Support material/raft interface extruder
-support_material_interface_layers = 3
-support_material_with_sheath = 0
-support_material_xy_spacing = 80%
-
-# Common filament preset
-[filament:*common*]
-cooling = 0
-compatible_printers =
-extrusion_multiplier = 1
-filament_ramming_parameters = "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6"
-filament_minimal_purge_on_wipe_tower = 15
-filament_cost = 0
-filament_density = 0
-filament_diameter = 1.75
-filament_notes = ""
-filament_settings_id = ""
-filament_soluble = 0
-min_print_speed = 15
-slowdown_below_layer_time = 20
-compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_BIBO.*/
-
-[filament:*PLA*]
-inherits = *common*
-bed_temperature = 60
-fan_below_layer_time = 100
-filament_colour = #FF3232
-filament_max_volumetric_speed = 15
-filament_type = PLA
-filament_density = 1.24
-filament_cost = 20
-first_layer_bed_temperature = 60
-first_layer_temperature = 215
-fan_always_on = 1
-cooling = 1
-max_fan_speed = 100
-min_fan_speed = 100
-bridge_fan_speed = 100
-disable_fan_first_layers = 3
-temperature = 200
-
-[filament:*PET*]
-inherits = *common*
-bed_temperature = 70
-cooling = 1
-disable_fan_first_layers = 3
-fan_below_layer_time = 20
-filament_colour = #FF8000
-filament_max_volumetric_speed = 8
-filament_type = PETG
-filament_density = 1.27
-filament_cost = 30
-first_layer_bed_temperature =70
-first_layer_temperature = 240
-fan_always_on = 1
-max_fan_speed = 50
-min_fan_speed = 20
-bridge_fan_speed = 100
-temperature = 240
-
-[filament:*ABS*]
-inherits = *common*
-bed_temperature = 100
-cooling = 0
-disable_fan_first_layers = 3
-fan_below_layer_time = 20
-filament_colour = #FFF2EC
-filament_max_volumetric_speed = 11
-filament_ramming_parameters = "120 100 5.70968 6.03226 7 8.25806 9 9.19355 9.3871 9.77419 10.129 10.3226 10.4516 10.5161| 0.05 5.69677 0.45 6.15484 0.95 8.76774 1.45 9.20323 1.95 9.95806 2.45 10.3871 2.95 10.5677 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6"
-filament_type = ABS
-filament_density = 1.04
-filament_cost = 20
-first_layer_bed_temperature = 100
-first_layer_temperature = 245
-fan_always_on = 0
-max_fan_speed = 0
-min_fan_speed = 0
-bridge_fan_speed = 25
-top_fan_speed = 0
-temperature = 245
-
-[filament:*FLEX*]
-inherits = *common*
-bed_temperature = 50
-bridge_fan_speed = 80
-# For now, all but selected filaments are disabled for the MMU 2.0
-cooling = 0
-disable_fan_first_layers = 3
-extrusion_multiplier = 1.2
-fan_always_on = 0
-fan_below_layer_time = 100
-filament_colour = #008000
-filament_max_volumetric_speed = 1.5
-filament_type = FLEX
-first_layer_bed_temperature = 50
-first_layer_temperature = 240
-max_fan_speed = 90
-min_fan_speed = 70
-#start_filament_gcode = "M900 K0"; Filament gcode"
-temperature = 240
-filament_retract_length = 0.8
-filament_deretract_speed = 15
-filament_retract_lift = 0
-filament_wipe = 0
-
-[filament:Generic PLA @BIBO2]
-inherits = *PLA*
-filament_vendor = Generic
-filament_notes = "List of materials which typically use standard PLA print settings:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladec PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH"
-
-[filament:Generic PETG @BIBO2]
-inherits = *PET*
-filament_vendor = Generic
-
-[filament:Generic ABS @BIBO2]
-inherits = *ABS*
-first_layer_bed_temperature = 90
-bed_temperature = 90
-filament_vendor = Generic
-filament_cost = 27.82
-filament_density = 1.08
-fan_always_on = 0
-cooling = 0
-min_fan_speed = 15
-max_fan_speed = 15
-slowdown_below_layer_time = 20
-disable_fan_first_layers = 4
-fan_below_layer_time = 20
-bridge_fan_speed = 25
-
-[filament:Esun ABS @BIBO2]
-inherits = Generic ABS @BIBO2
-filament_vendor = Esun
-filament_cost = 27.82
-filament_density = 1.08
-fan_always_on = 0
-cooling = 0
-min_fan_speed = 15
-max_fan_speed = 15
-slowdown_below_layer_time = 20
-disable_fan_first_layers = 4
-fan_below_layer_time = 20
-bridge_fan_speed = 25
-
-[filament:Hatchbox ABS @BIBO2]
-inherits = Generic ABS @BIBO2
-filament_vendor = Hatchbox
-filament_cost = 27.82
-filament_density = 1.08
-fan_always_on = 0
-cooling = 0
-min_fan_speed = 15
-max_fan_speed = 15
-slowdown_below_layer_time = 20
-disable_fan_first_layers = 4
-fan_below_layer_time = 20
-bridge_fan_speed = 25
-
-[filament:Generic HIPS @BIBO2]
-inherits = *ABS*
-filament_vendor = Generic
-filament_cost = 27.3
-filament_density = 1.04
-bridge_fan_speed = 50
-cooling = 1
-extrusion_multiplier = 1
-fan_always_on = 1
-fan_below_layer_time = 10
-filament_colour = #FFFFD7
-filament_soluble = 1
-filament_type = HIPS
-first_layer_temperature = 230
-max_fan_speed = 20
-min_fan_speed = 20
-temperature = 230
-compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_BIBO.*/ and num_extruders==2
-
-[filament:AMOLEN bronze PLA @BIBO2]
-inherits = *PLA*
-filament_vendor = AMOLEN
-temperature = 205
-bed_temperature = 65
-filament_colour = #808040
-first_layer_bed_temperature = 65
-first_layer_temperature = 215
-filament_cost = 25.99
-filament_density = 1.24
-
-[filament:Prusament PLA @BIBO2]
-inherits = *PLA*
-filament_vendor = Prusa Polymers
-temperature = 215
-bed_temperature = 60
-first_layer_temperature = 215
-first_layer_bed_temperature = 60
-filament_cost = 24.99
-filament_density = 1.24
-
-[filament:Prusament PETG @BIBO2]
-inherits = *PET*
-filament_vendor = Prusa Polymers
-temperature = 245
-bed_temperature = 70
-first_layer_temperature = 245
-first_layer_bed_temperature =70
-filament_cost = 24.99
-filament_density = 1.27
-
-[filament:PrimaSelect PVA+ @BIBO2]
-inherits = *PLA*
-filament_vendor = PrimaSelect
-filament_cost = 108
-filament_density = 1.23
-cooling = 0
-fan_always_on = 0
-filament_colour = #FFFFD7
-filament_max_volumetric_speed = 3.8
-filament_ramming_parameters = "120 100 8.3871 8.6129 8.93548 9.22581 9.48387 9.70968 9.87097 10.0323 10.2258 10.4194 10.6452 10.8065| 0.05 8.34193 0.45 8.73548 0.95 9.34836 1.45 9.78385 1.95 10.0871 2.45 10.5161 2.95 10.8903 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6"
-filament_soluble = 1
-filament_type = PVA
-first_layer_temperature = 195
-temperature = 195
-compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_BIBO.*/ and num_extruders==2
-
-[filament:No Filament - standby only @BIBO2]
-first_layer_temperature = 170
-temperature = 170
-compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_BIBO.*/ and num_extruders==2
-
-[filament:Generic FLEX @BIBO2]
-inherits = *FLEX*
-filament_vendor = Generic
-filament_cost = 82
-filament_density = 1.22
-filament_max_volumetric_speed = 1.2
-filament_retract_length = 0
-filament_retract_speed = nil
-filament_retract_lift = nil
-
-[filament:Overture TPU @BIBO2]
-inherits = *FLEX*
-filament_vendor = Overture
-filament_max_volumetric_speed = 1.5
-first_layer_temperature = 235
-first_layer_bed_temperature = 50
-temperature = 235
-bed_temperature = 50
-bridge_fan_speed = 100
-max_fan_speed = 80
-min_fan_speed = 80
-filament_retract_before_travel = 3
-filament_cost = 23.99
-filament_density = 1.21
-
-[filament:SainSmart TPU @BIBO2]
-inherits = *FLEX*
-filament_vendor = SainSmart
-fan_always_on = 1
-filament_max_volumetric_speed = 2.5
-extrusion_multiplier = 1.15
-first_layer_temperature = 230
-first_layer_bed_temperature = 50
-temperature = 230
-bed_temperature = 50
-bridge_fan_speed = 100
-max_fan_speed = 80
-min_fan_speed = 80
-filament_retract_before_travel = 3
-filament_cost = 32.99
-filament_density = 1.21
-filament_retract_length = 0.5
-filament_retract_speed = nil
-filament_deretract_speed = 15
-filament_retract_lift = 0
-filament_wipe = 0
-disable_fan_first_layers = 3
-min_print_speed = 15
-slowdown_below_layer_time = 10
-cooling = 1
-
-[filament:Filatech FilaFlex40 @BIBO2]
-inherits = *FLEX*
-filament_vendor = Filatech
-fan_always_on = 1
-filament_max_volumetric_speed = 2.5
-extrusion_multiplier = 1.15
-first_layer_temperature = 230
-first_layer_bed_temperature = 50
-temperature = 230
-bed_temperature = 50
-bridge_fan_speed = 100
-max_fan_speed = 50
-min_fan_speed = 50
-filament_retract_before_travel = 3
-filament_cost = 51.45
-filament_density = 1.22
-filament_retract_length = 0.5
-filament_retract_speed = 20
-filament_deretract_speed = 15
-filament_retract_lift = 0
-filament_wipe = 0
-disable_fan_first_layers = 3
-min_print_speed = 15
-slowdown_below_layer_time = 10
-cooling = 1
-
-# Common printer preset
-[printer:*common*]
-printer_technology = FFF
-bed_shape = -107x-93,107x-93,107x93,-107x93
-before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;[layer_z]\n\n
-between_objects_gcode =
-deretract_speed = 0 # By setting this value to 0 deretract used the retract_speed
-extruder_colour = #FFFF00
-extruder_offset = 0x0
-gcode_flavor = marlin
-silent_mode = 0
-remaining_times = 0
-machine_max_acceleration_e = 1100
-machine_max_acceleration_extruding = 5000
-machine_max_acceleration_retracting = 1100
-machine_max_acceleration_x = 500
-machine_max_acceleration_y = 500
-machine_max_acceleration_z = 100
-machine_max_feedrate_e = 20
-machine_max_feedrate_x = 350
-machine_max_feedrate_y = 350
-machine_max_feedrate_z = 2
-machine_max_jerk_e = 5
-machine_max_jerk_x = 8
-machine_max_jerk_y = 8
-machine_max_jerk_z = 0.3
-machine_min_extruding_rate = 0
-machine_min_travel_rate = 0
-layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z]
-max_layer_height = 0.30
-min_layer_height = 0.05
-max_print_height = 160
-octoprint_apikey =
-octoprint_host =
-printer_notes =
-printer_settings_id =
-printer_vendor = BIBO
-printhost_apikey =
-printhost_cafile =
-retract_before_travel = 1
-retract_before_wipe = 100%
-retract_layer_change = 1
-retract_length = 1.5
-retract_length_toolchange = 1.5
-retract_lift = 0
-retract_lift_above = 0
-retract_lift_below = 0
-retract_restart_extra = 0
-retract_restart_extra_toolchange = 0
-retract_speed = 20
-serial_port =
-serial_speed = 250000
-single_extruder_multi_material = 0
-toolchange_gcode =
-use_firmware_retraction = 0
-use_relative_e_distances = 1
-use_volumetric_e = 0
-variable_layer_height = 1
-wipe = 1
-z_offset = 0
-printer_model =
-default_print_profile =
-default_filament_profile =
-
-[printer:BIBO2 Touch Dual extrusion]
-inherits = *common*
-printer_model = BIBO2
-between_objects_gcode =
-default_filament_profile = Generic PLA @BIBO2
-default_print_profile = 0.20mm NORMAL @BIBO2
-deretract_speed = 0,0 # Setting this value to 0 uses the retract speed
-extruder_colour = #FFFF00;#229403
-extruder_offset = 0x0,0x0
-layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z]
-max_layer_height = 0.3,0.3
-min_layer_height = 0.05,0.05
-printer_notes = Do not 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_BIBO\nPRINTER_MODEL_BIBO2
-printer_settings_id =
-printer_variant = 0.4
-nozzle_diameter = 0.4,0.4
-remaining_times = 0
-retract_before_travel = 1,1
-retract_before_wipe = 100%,100%
-retract_layer_change = 1,1
-retract_length = 1.5,1.5
-retract_length_toolchange = 1.5,1.5
-retract_lift = 0,0
-retract_lift_above = 0,0
-retract_lift_below = 0,0
-retract_restart_extra = 0,0
-retract_restart_extra_toolchange = 0,0
-retract_speed = 20,20
-start_gcode = ;Start code PrusaSlicer BIBO 2 printers\nG21 ; set units to metric\nG90 ; absolute positioning\nM107 ; start with the fan off\nM190 S{max(first_layer_bed_temperature[0] - 5, first_layer_bed_temperature[1] - 5)} ; wait for bed temp\nM140 S{max(first_layer_bed_temperature[0], first_layer_bed_temperature[1])} ; continue bed heating to full temp while other things are happening\nM104 S{first_layer_temperature[0]} T0; set 1st nozzle heater to first layer temperature\nM104 S{first_layer_temperature[1]} T1; set 2nd nozzle heater to first layer temperature\nM105 ; Report Temperatures\nM109 S{first_layer_temperature[0]} T0; wait for 1st nozzle heat to first layer temperature\nM109 S{first_layer_temperature[1]} T1; wait for 2nd nozzle heat to first layer temperature\nM105 ; Report Temperatures\nG28 X0 Y0 ; move X/Y to min endstops\nG28 Z0 ; move Z to min endstops\nG1 Z2.0 F400 ; move the platform down 2mm\nT[initial_tool]; switch to initial tool position\nG92 E0.0 ; reset extruder\nG28 ; Home all axis\nG1 Y0 F1200 E0 ; move Y to min endstop and extrude 0 filament\nG92 E0.0 ; reset extruder and zero the current extruder coordinate before printing\nM117 BIBO now Printing... ; Put now printing message on screen
-end_gcode = ;BIBO End GCode\nM107 ; turn fans off\nG91 ; Relative positioning\nG1 Z1 F100\nM140 S0 ; Disable heated bed\nM104 T0 S0 ; extruder T0 heater off\nM104 T1 S0 ; extruder T1 heater off\nG1 Z+0.5 X-20 Y-20 F300 ; move Z down then move print head a bit out of the way\nG28 X0 Y0 ; move X/Y to min endstops, so the head is out of the way\nG90 ; Absolute positioning\nG92 E0.0 ; Reset extruder position\nM84 ; Turn steppers off\nM117 BIBO Print complete ; Put print complete message on screen
-thumbnails =
-toolchange_gcode =
-use_relative_e_distances = 1
-wipe = 1,1
-z_offset = 0
-
-[printer:BIBO2 Touch E1 right only extrusion]
-inherits = *common*
-printer_model = BIBO2
-printer_variant = 0.4
-extruder_colour = #FFFF00
-printer_notes = Do not 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_BIBO\nPRINTER_MODEL_BIBO2
-nozzle_diameter = 0.4
-retract_before_travel = 1
-retract_length = 1.5
-retract_speed = 20
-deretract_speed = 0 # Setting this value to 0 uses the retract speed
-retract_before_wipe = 100%
-default_print_profile = 0.20mm NORMAL @BIBO2
-default_filament_profile = Generic PLA @BIBO2
-start_gcode = ;Start code PrusaSlicer BIBO 2 printers E1 only (i.e. T0)\nG21 ; set units to metric\nG90 ; absolute positioning\nM107 ; start with the fan off\nM190 S{first_layer_bed_temperature[0] - 5} ; wait for bed temp\nM140 S{first_layer_bed_temperature[0]} ; continue bed heating to full temp while other things are happening\nM104 S{first_layer_temperature[0]} T0 ; set 1st nozzle heater to first layer temperature\nM104 S{first_layer_temperature[0] * 0.791} T1 ; set 2nd nozzle heater to 79.1 percent standby temp\nM105 ; Report Temperatures\nM109 S{first_layer_temperature[0]} T0 ; wait for 1st nozzle heat to first layer temperature\nM109 S{first_layer_temperature[0] * 0.791} T1 ; wait for 2nd nozzle heat to 79.1 percent standby temp\nM105 ; Report Temperatures\nG28 X0 Y0 ; move X/Y to min endstops\nG28 Z0 ; move Z to min endstops\nG1 Y0 F1200 E0 ; move Y to min endstop and extrude 0 filament\nT[initial_tool] ; switch to initial tool position\nG92 E0.0 ; reset extruder\nG28 ; Home all axis\nG1 Y0 F1200 E0 ; move Y to min endstop and reset extruder\nG92 E0.0 ; zero the current extruder coordinate\nM117 Cleaning... ; Put Cleaning message on screen, Attempt Nozzle Wipe (for ooze free startup)\nG1 X-15.0 Y-92.9 Z0.3 F2400.0 ; move to start-line position\nG1 X15.0 Y-92.9 Z0.3 F1000.0 E2 ; draw 1st line\nG1 X15.0 Y-92.6 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92.6 Z0.3 F1000.0 E4 ; draw 2nd line\nG1 X-15.0 Y-92.3 Z0.3 F3000.0 ; move to side a little\nG1 X15.0 Y-92.3 Z0.3 F1000.0 E6 ; draw 3rd line\nG1 X15.0 Y-92 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92 Z0.3 F1000.0 E8 ; draw 4th line\nG92 E0.0 ; reset extruder and zero the current extruder coordinate before printing\nM117 BIBO E1 now Printing... ; Put now printing message on screen
-end_gcode = ;BIBO End GCode\nM107 ; turn fans off\nG91 ; Relative positioning\nG1 Z1 F100\nM140 S0 ; Disable heated bed\nM104 T0 S0 ; extruder T0 heater off\nM104 T1 S0 ; extruder T1 heater off\nG1 Z+0.5 X-20 Y-20 F300 ; move Z down then move print head a bit out of the way\nG28 X0 Y0 ; move X/Y to min endstops, so the head is out of the way\nG90 ; Absolute positioning\nG92 E0.0 ; Reset extruder position\nM84 ; Turn steppers off\nM117 BIBO Print complete ; Put print complete message on screen
-thumbnails =
-toolchange_gcode =
-use_relative_e_distances = 1
-wipe = 1
-z_offset = 0
-
-
-[printer:BIBO2 Touch E2 left only extrusion]
-inherits = *common*
-printer_model = BIBO2
-printer_variant = 0.4
-extruder_colour = #229403
-printer_notes = Do not 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_BIBO\nPRINTER_MODEL_BIBO2
-nozzle_diameter = 0.4
-retract_before_travel = 1
-retract_length = 1.5
-retract_speed = 20
-deretract_speed = 0 # Setting this value to 0 uses the retract speed
-retract_before_wipe = 100%
-default_print_profile = 0.20mm NORMAL @BIBO2
-default_filament_profile = Generic PLA @BIBO2
-start_gcode = ;Start code PrusaSlicer BIBO 2 printers E2 only (i.e. T1)\nG21 ; set units to metric\nG90 ; absolute positioning\nM107 ; start with the fan off\nM140 S{first_layer_bed_temperature[0] - 5} ; set bed temp\nM105 ; Report Temperatures\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp\nM104 S{first_layer_temperature[0] * 0.791} T0 ; set 1st nozzle heater to 79.1 percent standby temp\nM104 S{first_layer_temperature[0]} T1 ; set 2nd nozzle heater to first layer temperature\nM105 ; Report Temperatures\nM109 S{first_layer_temperature[0] * 0.791} T0 ; set 1st nozzle heater to 79.1 percent standby temp\nM109 S{first_layer_temperature[0]} T1 ; Wait for 2nd nozzle heater to first layer temperature\nM105 ; Report Temperatures\nG28 X0 Y0 ; move X/Y to min endstops\nG28 Z0 ; move Z to min endstops\nG1 Z2 F400 ; move the print bed down 2mm\nT0 ; switch to tool position T0\nG90 ; absolute positioning\nG92 E0.0 ; zero the current extruder coordinate\nG28 ; Home all axis\nG1 Y0 F1200 E0 ; move Y to min endstop and reset extruder\nG92 E0.0 ; zero the current extruder coordinate\nT1 ; switch to tool position T1\nG92 E0.0 ; zero the current extruder coordinate\nM117 E2 nozzle wipe... ; Put Nozzle wipe message on screen, Attempt Nozzle Wipe (for ooze free startup)\nG1 X-15.0 Y-92.9 Z0.3 F2400.0 ; move to start-line position\nG1 X15.0 Y-92.9 Z0.3 F1000.0 E2 ; draw 1st line\nG1 X15.0 Y-92.6 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92.6 Z0.3 F1000.0 E4 ; draw 2nd line\nG1 X-15.0 Y-92.3 Z0.3 F3000.0 ; move to side a little\nG1 X15.0 Y-92.3 Z0.3 F1000.0 E6 ; draw 3rd line\nG1 X15.0 Y-92 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92 Z0.3 F1000.0 E8 ; draw 4th line\nG92 E0.0 ; reset extruder coordinate to zero before printing\nM117 BIBO Now Printing from E2... ; Put now printing message on screen
-end_gcode = ;BIBO End GCode\nM107 ; turn fans off\nG91 ; Relative positioning\nG1 Z1 F100\nM140 S0 ; Disable heated bed\nM104 T0 S0 ; extruder T0 heater off\nM104 T1 S0 ; extruder T1 heater off\nG1 Z+0.5 X-20 Y-20 F300 ; move Z down then move print head a bit out of the way\nG28 X0 Y0 ; move X/Y to min endstops, so the head is out of the way\nG90 ; Absolute positioning\nG92 E0.0 ; Reset extruder position\nM84 ; Turn steppers off\nM117 BIBO Print complete ; Put print complete message on screen
-thumbnails =
-toolchange_gcode =
-use_relative_e_distances = 1
-wipe = 1
-z_offset = 0
-
-# Ditto Printing options with custom beds and special start end gcode for print duplication from one nozzle to the other
-[printer:BIBO2 E1 right E2 Ditto]
-inherits = BIBO2 Touch E1 right only extrusion
-printer_model = BIBO2
-printer_notes = Do not 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_BIBO\nPRINTER_MODEL_BIBO2
-bed_shape = 0x-93,33x-93,33x93,0x93
-#bed_model = BIBO2_bed.stl
-#bed_texture = BIBO2.svg
-before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;[layer_z]\nM104 S{temperature[0]} T1 ; set 2nd nozzle heater to print temperature\n
-start_gcode = ;Start code PrusaSlicer BIBO 2 printers E1 only (i.e. T0)\nM420 S1 ; Turn on Ditto Printing\nG21 ; set units to metric\nG90 ; absolute positioning\nM107 ; start with the fan off\nM190 S{first_layer_bed_temperature[0] - 5} ; wait for bed temp\nM140 S{first_layer_bed_temperature[0]} ; continue bed heating to full temp while other things are happening\nM104 S{first_layer_temperature[0]} T0 ; set 1st nozzle heater to first layer temperature\nM104 S{first_layer_temperature[0]} T1 ; set 2nd nozzle heater to same first layer temperature\nM105 ; Report Temperatures\nM109 S{first_layer_temperature[0]} T0 ; wait for 1st nozzle heat to first layer temperature\nM109 S{first_layer_temperature[0]} T1 ; wait for 2nd nozzle heat to same first layer temperature\nM105 ; Report Temperatures\nG28 X0 Y0 ; move X/Y to min endstops\nG28 Z0 ; move Z to min endstops\nG1 Y0 F1200 E0 ; move Y to min endstop and extrude 0 filament\nT[initial_tool] ; switch to initial tool position\nG92 E0.0 ; reset extruder\nG28 ; Home all axis\nG1 Y0 F1200 E0 ; move Y to min endstop and reset extruder\nG92 E0.0 ; zero the current extruder coordinate\nM117 Cleaning... ; Put Cleaning message on screen, Attempt Nozzle Wipe (for ooze free startup)\nG1 X-15.0 Y-92.9 Z0.3 F2400.0 ; move to start-line position\nG1 X15.0 Y-92.9 Z0.3 F1000.0 E2 ; draw 1st line\nG1 X15.0 Y-92.6 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92.6 Z0.3 F1000.0 E4 ; draw 2nd line\nG1 X-15.0 Y-92.3 Z0.3 F3000.0 ; move to side a little\nG1 X15.0 Y-92.3 Z0.3 F1000.0 E6 ; draw 3rd line\nG1 X15.0 Y-92 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92 Z0.3 F1000.0 E8 ; draw 4th line\nG92 E0.0 ; reset extruder and zero the current extruder coordinate before printing\nM117 BIBO E1 now Printing... ; Put now printing message on screen
-end_gcode = ;BIBO End GCode\nM107 ; turn fans off\nG91 ; Relative positioning\nG1 Z1 F100\nM140 S0 ; Disable heated bed\nM104 T0 S0 ; extruder T0 heater off\nM104 T1 S0 ; extruder T1 heater off\nG1 Z+0.5 X-20 Y-20 F300 ; move Z down then move print head a bit out of the way\nG28 X0 Y0 ; move X/Y to min endstops, so the head is out of the way\nG90 ; Absolute positioning\nG92 E0.0 ; Reset extruder position\nM84 ; Turn steppers off\nM420 S0 ; Turn off Ditto Printing function\nM117 BIBO Print complete ; Put print complete message on screen
-
-[printer:BIBO2 E2 left E1 Ditto]
-inherits = BIBO2 Touch E2 left only extrusion
-printer_model = BIBO2
-printer_notes = Do not 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_BIBO\nPRINTER_MODEL_BIBO2
-bed_shape = -33x-93,0x-93,0x93,-33x93
-#bed_model = BIBO2_bed.stl
-#bed_texture = BIBO2.svg
-before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;[layer_z]\nM104 S{temperature[0]} T0 ; set 1st nozzle heater to print temperature\n
-start_gcode = ;Start code PrusaSlicer BIBO 2 printers E2 only (i.e. T1)\nM420 S1 ; Turn on Ditto Printing\nG21 ; set units to metric\nG90 ; absolute positioning\nM107 ; start with the fan off\nM140 S{first_layer_bed_temperature[0] - 5} ; set bed temp\nM105 ; Report Temperatures\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp\nM104 S{first_layer_temperature[0]} T0 ; set 1st nozzle heater to ditto print temperature\nM104 S{first_layer_temperature[0]} T1 ; set 2nd nozzle heater to first layer temperature\nM105 ; Report Temperatures\nM109 S{first_layer_temperature[0]} T0 ; set 1st nozzle heater to ditto printing temperature\nM109 S{first_layer_temperature[0]} T1 ; Wait for 2nd nozzle heater to first layer temperature\nM105 ; Report Temperatures\nG28 X0 Y0 ; move X/Y to min endstops\nG28 Z0 ; move Z to min endstops\nG1 Z2 F400 ; move the print bed down 2mm\nT0 ; switch to tool position T0\nG90 ; absolute positioning\nG92 E0.0 ; zero the current extruder coordinate\nG28 ; Home all axis\nG1 Y0 F1200 E0 ; move Y to min endstop and reset extruder\nG92 E0.0 ; zero the current extruder coordinate\nT1 ; switch to tool position T1\nG92 E0.0 ; zero the current extruder coordinate\nM117 E2 nozzle wipe... ; Put Nozzle wipe message on screen, Attempt Nozzle Wipe (for ooze free startup)\nG1 X-15.0 Y-92.9 Z0.3 F2400.0 ; move to start-line position\nG1 X15.0 Y-92.9 Z0.3 F1000.0 E2 ; draw 1st line\nG1 X15.0 Y-92.6 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92.6 Z0.3 F1000.0 E4 ; draw 2nd line\nG1 X-15.0 Y-92.3 Z0.3 F3000.0 ; move to side a little\nG1 X15.0 Y-92.3 Z0.3 F1000.0 E6 ; draw 3rd line\nG1 X15.0 Y-92 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92 Z0.3 F1000.0 E8 ; draw 4th line\nG92 E0.0 ; reset extruder coordinate to zero before printing\nM117 BIBO Now Printing from E2... ; Put now printing message on screen
+# Print profiles for the BIBO printers.
+
+[vendor]
+# Vendor name will be shown by the Config Wizard.
+name = BIBO
+# Configuration version of this file. Config file will only be installed, if the config_version differs.
+# This means, the server may force the PrusaSlicer configuration to be downgraded.
+config_version = 0.0.3
+# Where to get the updates from?
+config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/BIBO/
+
+# The printer models will be shown by the Configuration Wizard in this order,
+# also the first model installed & the first nozzle installed will be activated after install.
+# Printer model name will be shown by the installation wizard.
+
+[printer_model:BIBO2]
+name = BIBO2 Touch
+variants = 0.4
+technology = FFF
+family = BIBO2
+bed_model = BIBO2_bed.stl
+bed_texture = BIBO2.svg
+default_materials = Generic PLA @BIBO2; Generic PETG @BIBO2; Generic ABS @BIBO2; Prusament PLA @BIBO2; Prusament PETG @BIBO2
+
+# All presets starting with asterisk, for example *common*, are intermediate and they will
+# not make it into the user interface.
+
+# Common print preset
+[print:*common*]
+avoid_crossing_perimeters = 0
+bottom_fill_pattern = rectilinear
+bridge_angle = 0
+bridge_flow_ratio = 0.95
+bridge_speed = 20
+brim_width = 0
+clip_multipart_objects = 1
+compatible_printers =
+complete_objects = 0
+dont_support_bridges = 1
+elefant_foot_compensation = 0
+ensure_vertical_shell_thickness = 1
+external_fill_pattern = rectilinear
+external_perimeters_first = 0
+external_perimeter_extrusion_width = 0.40
+external_perimeter_speed = 25
+extra_perimeters = 0
+extruder_clearance_height = 12
+extruder_clearance_radius = 45
+extrusion_width = 0.45
+fill_angle = 45
+fill_density = 20%
+fill_pattern = grid
+first_layer_extrusion_width = 0.42
+first_layer_height = 0.2
+first_layer_speed = 20
+gap_fill_speed = 15
+gcode_comments = 0
+infill_every_layers = 1
+infill_extruder = 1
+infill_extrusion_width = 0.45
+infill_first = 0
+infill_only_where_needed = 0
+infill_overlap = 20%
+interface_shells = 0
+max_print_speed = 60
+max_volumetric_extrusion_rate_slope_negative = 0
+max_volumetric_extrusion_rate_slope_positive = 0
+max_volumetric_speed = 0
+min_skirt_length = 4
+notes =
+overhangs = 1
+only_retract_when_crossing_perimeters = 0
+ooze_prevention = 0
+output_filename_format = {input_filename_base}_{layer_height}mm_{if num_extruders==1}{filament_type[0]}{else}E1{filament_type[0]}_E2{filament_type[1]}{endif}_{printer_model}_{print_time}.gcode
+perimeters = 2
+perimeter_extruder = 1
+perimeter_extrusion_width = 0.45
+post_process =
+print_settings_id =
+raft_layers = 0
+resolution = 0
+seam_position = aligned
+single_extruder_multi_material_priming = 0
+skirts = 3
+skirt_distance = 2
+skirt_height = 1
+small_perimeter_speed = 15
+solid_infill_below_area = 0
+solid_infill_every_layers = 0
+solid_infill_extruder = 1
+solid_infill_extrusion_width = 0.45
+spiral_vase = 0
+standby_temperature_delta = -5
+support_material = 0
+support_material_extruder = 0
+support_material_extrusion_width = 0.40
+support_material_interface_extruder = 0
+support_material_angle = 0
+support_material_buildplate_only = 0
+support_material_enforce_layers = 0
+support_material_contact_distance = 0.15
+support_material_interface_contact_loops = 0
+support_material_interface_layers = 2
+support_material_interface_spacing = 0.2
+support_material_interface_speed = 100%
+support_material_pattern = rectilinear
+support_material_spacing = 2
+support_material_speed = 40
+support_material_synchronize_layers = 0
+support_material_threshold = 45
+support_material_with_sheath = 0
+support_material_xy_spacing = 60%
+thin_walls = 0
+top_infill_extrusion_width = 0.40
+top_solid_infill_speed = 20
+travel_speed = 130
+wipe_tower = 0
+wipe_tower_bridging = 10
+wipe_tower_rotation_angle = 0
+wipe_tower_width = 60
+wipe_tower_x = 50
+wipe_tower_y = 50
+xy_size_compensation = 0
+
+[print:*0.05mm*]
+inherits = *common*
+bottom_solid_layers = 10
+bridge_acceleration = 300
+bridge_flow_ratio = 0.7
+default_acceleration = 500
+external_perimeter_speed = 20
+fill_density = 20%
+first_layer_acceleration = 250
+gap_fill_speed = 20
+infill_acceleration = 800
+infill_speed = 30
+max_print_speed = 60
+small_perimeter_speed = 20
+solid_infill_speed = 30
+support_material_extrusion_width = 0.3
+support_material_spacing = 1.5
+layer_height = 0.05
+perimeter_acceleration = 300
+perimeter_speed = 30
+perimeters = 3
+support_material_speed = 30
+top_solid_infill_speed = 20
+top_solid_layers = 15
+
+[print:*0.07mm*]
+inherits = *common*
+bottom_solid_layers = 8
+bridge_acceleration = 300
+bridge_flow_ratio = 0.7
+bridge_speed = 20
+default_acceleration = 1000
+external_perimeter_speed = 20
+fill_density = 15%
+first_layer_acceleration = 500
+gap_fill_speed = 20
+infill_acceleration = 800
+infill_speed = 40
+max_print_speed = 60
+small_perimeter_speed = 20
+solid_infill_speed = 40
+support_material_extrusion_width = 0.3
+support_material_spacing = 1.5
+layer_height = 0.07
+perimeter_acceleration = 300
+perimeter_speed = 30
+perimeters = 3
+support_material_speed = 40
+top_solid_infill_speed = 30
+top_solid_layers = 11
+
+[print:*0.10mm*]
+inherits = *common*
+bottom_solid_layers = 7
+bridge_flow_ratio = 0.7
+layer_height = 0.1
+perimeter_acceleration = 800
+top_solid_layers = 9
+
+[print:*0.12mm*]
+inherits = *common*
+perimeter_speed = 40
+external_perimeter_speed = 25
+infill_speed = 50
+solid_infill_speed = 40
+layer_height = 0.12
+perimeters = 3
+top_infill_extrusion_width = 0.4
+bottom_solid_layers = 6
+top_solid_layers = 7
+
+[print:*0.15mm*]
+inherits = *common*
+external_perimeter_speed = 25
+infill_acceleration = 1100
+infill_speed = 50
+layer_height = 0.15
+perimeter_acceleration = 800
+perimeter_speed = 40
+solid_infill_speed = 40
+top_infill_extrusion_width = 0.4
+bottom_solid_layers = 5
+top_solid_layers = 7
+
+[print:*0.20mm*]
+inherits = *common*
+perimeter_speed = 40
+external_perimeter_speed = 25
+infill_speed = 50
+solid_infill_speed = 40
+layer_height = 0.20
+top_infill_extrusion_width = 0.4
+bottom_solid_layers = 4
+top_solid_layers = 5
+
+[print:*0.24mm*]
+inherits = *common*
+perimeter_speed = 40
+external_perimeter_speed = 25
+infill_speed = 50
+solid_infill_speed = 40
+layer_height = 0.24
+top_infill_extrusion_width = 0.45
+bottom_solid_layers = 3
+top_solid_layers = 4
+
+[print:*0.28mm*]
+inherits = *common*
+perimeter_speed = 40
+external_perimeter_speed = 25
+infill_speed = 50
+solid_infill_speed = 40
+layer_height = 0.28
+top_infill_extrusion_width = 0.45
+bottom_solid_layers = 3
+top_solid_layers = 4
+
+[print:*0.30mm*]
+inherits = *common*
+bottom_solid_layers = 4
+bridge_flow_ratio = 0.95
+external_perimeter_speed = 25
+infill_acceleration = 1100
+infill_speed = 60
+layer_height = 0.3
+perimeter_acceleration = 800
+perimeter_speed = 50
+solid_infill_speed = 50
+top_infill_extrusion_width = 0.4
+top_solid_layers = 4
+
+[print:*soluble_support*]
+inherits = *common*
+overhangs = 1
+skirts = 0
+support_material = 1
+support_material_contact_distance = 0
+support_material_extruder = 2
+support_material_extrusion_width = 0.45
+support_material_interface_extruder = 2
+support_material_interface_layers = 3
+support_material_interface_spacing = 0.1
+support_material_synchronize_layers = 1
+support_material_threshold = 80
+support_material_with_sheath = 1
+wipe_tower_bridging = 6
+support_material_interface_speed = 80%
+perimeter_speed = 40
+solid_infill_speed = 40
+top_infill_extrusion_width = 0.45
+top_solid_infill_speed = 30
+
+[print:0.05mm ULTRADETAIL @BIBO2]
+inherits = *0.05mm*
+# alias = 0.05mm ULTRADETAIL
+infill_extrusion_width = 0.5
+
+[print:0.07mm SUPERDETAIL @BIBO2]
+inherits = *0.07mm*
+# alias = 0.07mm SUPERDETAIL
+infill_extrusion_width = 0.5
+
+[print:0.10mm HIGHDETAIL @BIBO2]
+inherits = *0.10mm*
+# alias = 0.10mm HIGHDETAIL
+infill_extrusion_width = 0.5
+
+[print:0.12mm DETAIL @BIBO2]
+inherits = *0.12mm*
+# alias = 0.12mm DETAIL
+travel_speed = 130
+infill_speed = 50
+solid_infill_speed = 40
+top_solid_infill_speed = 30
+support_material_extrusion_width = 0.38
+
+[print:0.15mm OPTIMAL @BIBO2]
+inherits = *0.15mm*
+# alias = 0.15mm OPTIMAL
+top_infill_extrusion_width = 0.45
+
+[print:0.20mm NORMAL @BIBO2]
+inherits = *0.20mm*
+# alias = 0.20mm NORMAL
+travel_speed = 130
+infill_speed = 50
+solid_infill_speed = 40
+top_solid_infill_speed = 30
+support_material_extrusion_width = 0.38
+
+[print:0.24mm DRAFT @BIBO2]
+inherits = *0.24mm*
+# alias = 0.24mm DRAFT
+travel_speed = 130
+infill_speed = 50
+solid_infill_speed = 40
+top_solid_infill_speed = 30
+support_material_extrusion_width = 0.38
+
+[print:0.28mm SUPERDRAFT @BIBO2]
+inherits = *0.28mm*
+# alias = 0.28mm SUPERDRAFT
+travel_speed = 130
+infill_speed = 50
+solid_infill_speed = 40
+top_solid_infill_speed = 30
+support_material_extrusion_width = 0.38
+
+[print:0.30mm ULTRADRAFT @BIBO2]
+inherits = *0.30mm*
+# alias = 0.30mm ULTRADRAFT
+bottom_solid_layers = 3
+bridge_speed = 30
+external_perimeter_speed = 30
+infill_acceleration = 1100
+infill_speed = 55
+max_print_speed = 60
+perimeter_speed = 50
+small_perimeter_speed = 30
+solid_infill_speed = 50
+top_solid_infill_speed = 40
+support_material_speed = 45
+external_perimeter_extrusion_width = 0.6
+extrusion_width = 0.5
+first_layer_extrusion_width = 0.42
+infill_extrusion_width = 0.5
+perimeter_extrusion_width = 0.5
+solid_infill_extrusion_width = 0.5
+top_infill_extrusion_width = 0.45
+support_material_extrusion_width = 0.38
+
+# Soluble Supports Profiles for dual extrusion #
+[print:0.15mm OPTIMAL SOLUBLE FULL @BIBO2]
+inherits = 0.15mm OPTIMAL @BIBO2; *soluble_support*
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_BIBO.*/ and num_extruders==2
+external_perimeter_speed = 25
+notes = Set your soluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder
+support_material_extruder = 2
+perimeter_speed = 40
+solid_infill_speed = 40
+top_infill_extrusion_width = 0.45
+top_solid_infill_speed = 30
+
+[print:0.15mm OPTIMAL SOLUBLE INTERFACE @BIBO2]
+inherits = 0.15mm OPTIMAL SOLUBLE FULL @BIBO2
+notes = Set your soluble extruder in Multiple Extruders > Support material/raft interface extruder
+support_material_interface_layers = 3
+support_material_with_sheath = 0
+support_material_xy_spacing = 80%
+
+[print:0.20mm NORMAL SOLUBLE FULL @BIBO2]
+inherits = 0.20mm NORMAL @BIBO2; *soluble_support*
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_BIBO.*/ and num_extruders==2
+external_perimeter_speed = 30
+notes = Set your soluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder
+support_material_extruder = 2
+perimeter_speed = 40
+solid_infill_speed = 40
+top_solid_infill_speed = 30
+
+[print:0.20mm NORMAL SOLUBLE INTERFACE @BIBO2]
+inherits = 0.20mm NORMAL SOLUBLE FULL @BIBO2
+notes = Set your soluble extruder in Multiple Extruders > Support material/raft interface extruder
+support_material_interface_layers = 3
+support_material_with_sheath = 0
+support_material_xy_spacing = 80%
+
+# Common filament preset
+[filament:*common*]
+cooling = 0
+compatible_printers =
+extrusion_multiplier = 1
+filament_ramming_parameters = "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6"
+filament_minimal_purge_on_wipe_tower = 15
+filament_cost = 0
+filament_density = 0
+filament_diameter = 1.75
+filament_notes = ""
+filament_settings_id = ""
+filament_soluble = 0
+min_print_speed = 15
+slowdown_below_layer_time = 20
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_BIBO.*/
+
+[filament:*PLA*]
+inherits = *common*
+bed_temperature = 60
+fan_below_layer_time = 100
+filament_colour = #FF3232
+filament_max_volumetric_speed = 15
+filament_type = PLA
+filament_density = 1.24
+filament_cost = 20
+first_layer_bed_temperature = 60
+first_layer_temperature = 215
+fan_always_on = 1
+cooling = 1
+max_fan_speed = 100
+min_fan_speed = 100
+bridge_fan_speed = 100
+disable_fan_first_layers = 3
+temperature = 200
+
+[filament:*PET*]
+inherits = *common*
+bed_temperature = 70
+cooling = 1
+disable_fan_first_layers = 3
+fan_below_layer_time = 20
+filament_colour = #FF8000
+filament_max_volumetric_speed = 8
+filament_type = PETG
+filament_density = 1.27
+filament_cost = 30
+first_layer_bed_temperature =70
+first_layer_temperature = 240
+fan_always_on = 1
+max_fan_speed = 50
+min_fan_speed = 20
+bridge_fan_speed = 100
+temperature = 240
+
+[filament:*ABS*]
+inherits = *common*
+bed_temperature = 100
+cooling = 0
+disable_fan_first_layers = 3
+fan_below_layer_time = 20
+filament_colour = #FFF2EC
+filament_max_volumetric_speed = 11
+filament_ramming_parameters = "120 100 5.70968 6.03226 7 8.25806 9 9.19355 9.3871 9.77419 10.129 10.3226 10.4516 10.5161| 0.05 5.69677 0.45 6.15484 0.95 8.76774 1.45 9.20323 1.95 9.95806 2.45 10.3871 2.95 10.5677 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6"
+filament_type = ABS
+filament_density = 1.04
+filament_cost = 20
+first_layer_bed_temperature = 100
+first_layer_temperature = 245
+fan_always_on = 0
+max_fan_speed = 0
+min_fan_speed = 0
+bridge_fan_speed = 25
+top_fan_speed = 0
+temperature = 245
+
+[filament:*FLEX*]
+inherits = *common*
+bed_temperature = 50
+bridge_fan_speed = 80
+# For now, all but selected filaments are disabled for the MMU 2.0
+cooling = 0
+disable_fan_first_layers = 3
+extrusion_multiplier = 1.2
+fan_always_on = 0
+fan_below_layer_time = 100
+filament_colour = #008000
+filament_max_volumetric_speed = 1.5
+filament_type = FLEX
+first_layer_bed_temperature = 50
+first_layer_temperature = 240
+max_fan_speed = 90
+min_fan_speed = 70
+#start_filament_gcode = "M900 K0"; Filament gcode"
+temperature = 240
+filament_retract_length = 0.8
+filament_deretract_speed = 15
+filament_retract_lift = 0
+filament_wipe = 0
+
+[filament:Generic PLA @BIBO2]
+inherits = *PLA*
+filament_vendor = Generic
+filament_notes = "List of materials which typically use standard PLA print settings:\n\nDas Filament\nEsun PLA\nEUMAKERS PLA\nFiberlogy HD-PLA\nFillamentum PLA\nFloreon3D\nHatchbox PLA\nPlasty Mladec PLA\nPrimavalue PLA\nProto pasta Matte Fiber\nVerbatim PLA\nVerbatim BVOH"
+
+[filament:Generic PETG @BIBO2]
+inherits = *PET*
+filament_vendor = Generic
+
+[filament:Generic ABS @BIBO2]
+inherits = *ABS*
+first_layer_bed_temperature = 90
+bed_temperature = 90
+filament_vendor = Generic
+filament_cost = 27.82
+filament_density = 1.08
+fan_always_on = 0
+cooling = 0
+min_fan_speed = 15
+max_fan_speed = 15
+slowdown_below_layer_time = 20
+disable_fan_first_layers = 4
+fan_below_layer_time = 20
+bridge_fan_speed = 25
+
+[filament:Esun ABS @BIBO2]
+inherits = Generic ABS @BIBO2
+filament_vendor = Esun
+filament_cost = 27.82
+filament_density = 1.08
+fan_always_on = 0
+cooling = 0
+min_fan_speed = 15
+max_fan_speed = 15
+slowdown_below_layer_time = 20
+disable_fan_first_layers = 4
+fan_below_layer_time = 20
+bridge_fan_speed = 25
+
+[filament:Hatchbox ABS @BIBO2]
+inherits = Generic ABS @BIBO2
+filament_vendor = Hatchbox
+filament_cost = 27.82
+filament_density = 1.08
+fan_always_on = 0
+cooling = 0
+min_fan_speed = 15
+max_fan_speed = 15
+slowdown_below_layer_time = 20
+disable_fan_first_layers = 4
+fan_below_layer_time = 20
+bridge_fan_speed = 25
+
+[filament:Generic HIPS @BIBO2]
+inherits = *ABS*
+filament_vendor = Generic
+filament_cost = 27.3
+filament_density = 1.04
+bridge_fan_speed = 50
+cooling = 1
+extrusion_multiplier = 1
+fan_always_on = 1
+fan_below_layer_time = 10
+filament_colour = #FFFFD7
+filament_soluble = 1
+filament_type = HIPS
+first_layer_temperature = 230
+max_fan_speed = 20
+min_fan_speed = 20
+temperature = 230
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_BIBO.*/ and num_extruders==2
+
+[filament:AMOLEN bronze PLA @BIBO2]
+inherits = *PLA*
+filament_vendor = AMOLEN
+temperature = 205
+bed_temperature = 65
+filament_colour = #808040
+first_layer_bed_temperature = 65
+first_layer_temperature = 215
+filament_cost = 25.99
+filament_density = 1.24
+
+[filament:Prusament PLA @BIBO2]
+inherits = *PLA*
+filament_vendor = Prusa Polymers
+temperature = 215
+bed_temperature = 60
+first_layer_temperature = 215
+first_layer_bed_temperature = 60
+filament_cost = 24.99
+filament_density = 1.24
+
+[filament:Prusament PETG @BIBO2]
+inherits = *PET*
+filament_vendor = Prusa Polymers
+temperature = 245
+bed_temperature = 70
+first_layer_temperature = 245
+first_layer_bed_temperature =70
+filament_cost = 24.99
+filament_density = 1.27
+
+[filament:PrimaSelect PVA+ @BIBO2]
+inherits = *PLA*
+filament_vendor = PrimaSelect
+filament_cost = 108
+filament_density = 1.23
+cooling = 0
+fan_always_on = 0
+filament_colour = #FFFFD7
+filament_max_volumetric_speed = 3.8
+filament_ramming_parameters = "120 100 8.3871 8.6129 8.93548 9.22581 9.48387 9.70968 9.87097 10.0323 10.2258 10.4194 10.6452 10.8065| 0.05 8.34193 0.45 8.73548 0.95 9.34836 1.45 9.78385 1.95 10.0871 2.45 10.5161 2.95 10.8903 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6"
+filament_soluble = 1
+filament_type = PVA
+first_layer_temperature = 195
+temperature = 195
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_BIBO.*/ and num_extruders==2
+
+[filament:No Filament - standby only @BIBO2]
+first_layer_temperature = 170
+temperature = 170
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_BIBO.*/ and num_extruders==2
+
+[filament:Generic FLEX @BIBO2]
+inherits = *FLEX*
+filament_vendor = Generic
+filament_cost = 82
+filament_density = 1.22
+filament_max_volumetric_speed = 1.2
+filament_retract_length = 0
+filament_retract_speed = nil
+filament_retract_lift = nil
+
+[filament:Overture TPU @BIBO2]
+inherits = *FLEX*
+filament_vendor = Overture
+filament_max_volumetric_speed = 1.5
+first_layer_temperature = 235
+first_layer_bed_temperature = 50
+temperature = 235
+bed_temperature = 50
+bridge_fan_speed = 100
+max_fan_speed = 80
+min_fan_speed = 80
+filament_retract_before_travel = 3
+filament_cost = 23.99
+filament_density = 1.21
+
+[filament:SainSmart TPU @BIBO2]
+inherits = *FLEX*
+filament_vendor = SainSmart
+fan_always_on = 1
+filament_max_volumetric_speed = 2.5
+extrusion_multiplier = 1.15
+first_layer_temperature = 230
+first_layer_bed_temperature = 50
+temperature = 230
+bed_temperature = 50
+bridge_fan_speed = 100
+max_fan_speed = 80
+min_fan_speed = 80
+filament_retract_before_travel = 3
+filament_cost = 32.99
+filament_density = 1.21
+filament_retract_length = 0.5
+filament_retract_speed = nil
+filament_deretract_speed = 15
+filament_retract_lift = 0
+filament_wipe = 0
+disable_fan_first_layers = 3
+min_print_speed = 15
+slowdown_below_layer_time = 10
+cooling = 1
+
+[filament:Filatech FilaFlex40 @BIBO2]
+inherits = *FLEX*
+filament_vendor = Filatech
+fan_always_on = 1
+filament_max_volumetric_speed = 2.5
+extrusion_multiplier = 1.15
+first_layer_temperature = 230
+first_layer_bed_temperature = 50
+temperature = 230
+bed_temperature = 50
+bridge_fan_speed = 100
+max_fan_speed = 50
+min_fan_speed = 50
+filament_retract_before_travel = 3
+filament_cost = 51.45
+filament_density = 1.22
+filament_retract_length = 0.5
+filament_retract_speed = 20
+filament_deretract_speed = 15
+filament_retract_lift = 0
+filament_wipe = 0
+disable_fan_first_layers = 3
+min_print_speed = 15
+slowdown_below_layer_time = 10
+cooling = 1
+
+# Common printer preset
+[printer:*common*]
+printer_technology = FFF
+bed_shape = -107x-93,107x-93,107x93,-107x93
+before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;[layer_z]\n\n
+between_objects_gcode =
+deretract_speed = 0 # By setting this value to 0 deretract used the retract_speed
+extruder_colour = #FFFF00
+extruder_offset = 0x0
+gcode_flavor = marlin
+silent_mode = 0
+remaining_times = 0
+machine_max_acceleration_e = 1100
+machine_max_acceleration_extruding = 5000
+machine_max_acceleration_retracting = 1100
+machine_max_acceleration_x = 500
+machine_max_acceleration_y = 500
+machine_max_acceleration_z = 100
+machine_max_feedrate_e = 20
+machine_max_feedrate_x = 350
+machine_max_feedrate_y = 350
+machine_max_feedrate_z = 2
+machine_max_jerk_e = 5
+machine_max_jerk_x = 8
+machine_max_jerk_y = 8
+machine_max_jerk_z = 0.3
+machine_min_extruding_rate = 0
+machine_min_travel_rate = 0
+layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z]
+max_layer_height = 0.30
+min_layer_height = 0.05
+max_print_height = 160
+printer_notes =
+printer_settings_id =
+printer_vendor = BIBO
+retract_before_travel = 1
+retract_before_wipe = 100%
+retract_layer_change = 1
+retract_length = 1.5
+retract_length_toolchange = 1.5
+retract_lift = 0
+retract_lift_above = 0
+retract_lift_below = 0
+retract_restart_extra = 0
+retract_restart_extra_toolchange = 0
+retract_speed = 20
+single_extruder_multi_material = 0
+toolchange_gcode =
+use_firmware_retraction = 0
+use_relative_e_distances = 1
+use_volumetric_e = 0
+variable_layer_height = 1
+wipe = 1
+z_offset = 0
+printer_model =
+default_print_profile =
+default_filament_profile =
+
+[printer:BIBO2 Touch Dual extrusion]
+inherits = *common*
+printer_model = BIBO2
+between_objects_gcode =
+default_filament_profile = Generic PLA @BIBO2
+default_print_profile = 0.20mm NORMAL @BIBO2
+deretract_speed = 0,0 # Setting this value to 0 uses the retract speed
+extruder_colour = #FFFF00;#229403
+extruder_offset = 0x0,0x0
+layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z]
+max_layer_height = 0.3,0.3
+min_layer_height = 0.05,0.05
+printer_notes = Do not 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_BIBO\nPRINTER_MODEL_BIBO2
+printer_settings_id =
+printer_variant = 0.4
+nozzle_diameter = 0.4,0.4
+remaining_times = 0
+retract_before_travel = 1,1
+retract_before_wipe = 100%,100%
+retract_layer_change = 1,1
+retract_length = 1.5,1.5
+retract_length_toolchange = 1.5,1.5
+retract_lift = 0,0
+retract_lift_above = 0,0
+retract_lift_below = 0,0
+retract_restart_extra = 0,0
+retract_restart_extra_toolchange = 0,0
+retract_speed = 20,20
+start_gcode = ;Start code PrusaSlicer BIBO 2 printers\nG21 ; set units to metric\nG90 ; absolute positioning\nM107 ; start with the fan off\nM190 S{max(first_layer_bed_temperature[0] - 5, first_layer_bed_temperature[1] - 5)} ; wait for bed temp\nM140 S{max(first_layer_bed_temperature[0], first_layer_bed_temperature[1])} ; continue bed heating to full temp while other things are happening\nM104 S{first_layer_temperature[0]} T0; set 1st nozzle heater to first layer temperature\nM104 S{first_layer_temperature[1]} T1; set 2nd nozzle heater to first layer temperature\nM105 ; Report Temperatures\nM109 S{first_layer_temperature[0]} T0; wait for 1st nozzle heat to first layer temperature\nM109 S{first_layer_temperature[1]} T1; wait for 2nd nozzle heat to first layer temperature\nM105 ; Report Temperatures\nG28 X0 Y0 ; move X/Y to min endstops\nG28 Z0 ; move Z to min endstops\nG1 Z2.0 F400 ; move the platform down 2mm\nT[initial_tool]; switch to initial tool position\nG92 E0.0 ; reset extruder\nG28 ; Home all axis\nG1 Y0 F1200 E0 ; move Y to min endstop and extrude 0 filament\nG92 E0.0 ; reset extruder and zero the current extruder coordinate before printing\nM117 BIBO now Printing... ; Put now printing message on screen
+end_gcode = ;BIBO End GCode\nM107 ; turn fans off\nG91 ; Relative positioning\nG1 Z1 F100\nM140 S0 ; Disable heated bed\nM104 T0 S0 ; extruder T0 heater off\nM104 T1 S0 ; extruder T1 heater off\nG1 Z+0.5 X-20 Y-20 F300 ; move Z down then move print head a bit out of the way\nG28 X0 Y0 ; move X/Y to min endstops, so the head is out of the way\nG90 ; Absolute positioning\nG92 E0.0 ; Reset extruder position\nM84 ; Turn steppers off\nM117 BIBO Print complete ; Put print complete message on screen
+thumbnails =
+toolchange_gcode =
+use_relative_e_distances = 1
+wipe = 1,1
+z_offset = 0
+
+[printer:BIBO2 Touch E1 right only extrusion]
+inherits = *common*
+printer_model = BIBO2
+printer_variant = 0.4
+extruder_colour = #FFFF00
+printer_notes = Do not 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_BIBO\nPRINTER_MODEL_BIBO2
+nozzle_diameter = 0.4
+retract_before_travel = 1
+retract_length = 1.5
+retract_speed = 20
+deretract_speed = 0 # Setting this value to 0 uses the retract speed
+retract_before_wipe = 100%
+default_print_profile = 0.20mm NORMAL @BIBO2
+default_filament_profile = Generic PLA @BIBO2
+start_gcode = ;Start code PrusaSlicer BIBO 2 printers E1 only (i.e. T0)\nG21 ; set units to metric\nG90 ; absolute positioning\nM107 ; start with the fan off\nM190 S{first_layer_bed_temperature[0] - 5} ; wait for bed temp\nM140 S{first_layer_bed_temperature[0]} ; continue bed heating to full temp while other things are happening\nM104 S{first_layer_temperature[0]} T0 ; set 1st nozzle heater to first layer temperature\nM104 S{first_layer_temperature[0] * 0.791} T1 ; set 2nd nozzle heater to 79.1 percent standby temp\nM105 ; Report Temperatures\nM109 S{first_layer_temperature[0]} T0 ; wait for 1st nozzle heat to first layer temperature\nM109 S{first_layer_temperature[0] * 0.791} T1 ; wait for 2nd nozzle heat to 79.1 percent standby temp\nM105 ; Report Temperatures\nG28 X0 Y0 ; move X/Y to min endstops\nG28 Z0 ; move Z to min endstops\nG1 Y0 F1200 E0 ; move Y to min endstop and extrude 0 filament\nT[initial_tool] ; switch to initial tool position\nG92 E0.0 ; reset extruder\nG28 ; Home all axis\nG1 Y0 F1200 E0 ; move Y to min endstop and reset extruder\nG92 E0.0 ; zero the current extruder coordinate\nM117 Cleaning... ; Put Cleaning message on screen, Attempt Nozzle Wipe (for ooze free startup)\nG1 X-15.0 Y-92.9 Z0.3 F2400.0 ; move to start-line position\nG1 X15.0 Y-92.9 Z0.3 F1000.0 E2 ; draw 1st line\nG1 X15.0 Y-92.6 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92.6 Z0.3 F1000.0 E4 ; draw 2nd line\nG1 X-15.0 Y-92.3 Z0.3 F3000.0 ; move to side a little\nG1 X15.0 Y-92.3 Z0.3 F1000.0 E6 ; draw 3rd line\nG1 X15.0 Y-92 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92 Z0.3 F1000.0 E8 ; draw 4th line\nG92 E0.0 ; reset extruder and zero the current extruder coordinate before printing\nM117 BIBO E1 now Printing... ; Put now printing message on screen
+end_gcode = ;BIBO End GCode\nM107 ; turn fans off\nG91 ; Relative positioning\nG1 Z1 F100\nM140 S0 ; Disable heated bed\nM104 T0 S0 ; extruder T0 heater off\nM104 T1 S0 ; extruder T1 heater off\nG1 Z+0.5 X-20 Y-20 F300 ; move Z down then move print head a bit out of the way\nG28 X0 Y0 ; move X/Y to min endstops, so the head is out of the way\nG90 ; Absolute positioning\nG92 E0.0 ; Reset extruder position\nM84 ; Turn steppers off\nM117 BIBO Print complete ; Put print complete message on screen
+thumbnails =
+toolchange_gcode =
+use_relative_e_distances = 1
+wipe = 1
+z_offset = 0
+
+
+[printer:BIBO2 Touch E2 left only extrusion]
+inherits = *common*
+printer_model = BIBO2
+printer_variant = 0.4
+extruder_colour = #229403
+printer_notes = Do not 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_BIBO\nPRINTER_MODEL_BIBO2
+nozzle_diameter = 0.4
+retract_before_travel = 1
+retract_length = 1.5
+retract_speed = 20
+deretract_speed = 0 # Setting this value to 0 uses the retract speed
+retract_before_wipe = 100%
+default_print_profile = 0.20mm NORMAL @BIBO2
+default_filament_profile = Generic PLA @BIBO2
+start_gcode = ;Start code PrusaSlicer BIBO 2 printers E2 only (i.e. T1)\nG21 ; set units to metric\nG90 ; absolute positioning\nM107 ; start with the fan off\nM140 S{first_layer_bed_temperature[0] - 5} ; set bed temp\nM105 ; Report Temperatures\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp\nM104 S{first_layer_temperature[0] * 0.791} T0 ; set 1st nozzle heater to 79.1 percent standby temp\nM104 S{first_layer_temperature[0]} T1 ; set 2nd nozzle heater to first layer temperature\nM105 ; Report Temperatures\nM109 S{first_layer_temperature[0] * 0.791} T0 ; set 1st nozzle heater to 79.1 percent standby temp\nM109 S{first_layer_temperature[0]} T1 ; Wait for 2nd nozzle heater to first layer temperature\nM105 ; Report Temperatures\nG28 X0 Y0 ; move X/Y to min endstops\nG28 Z0 ; move Z to min endstops\nG1 Z2 F400 ; move the print bed down 2mm\nT0 ; switch to tool position T0\nG90 ; absolute positioning\nG92 E0.0 ; zero the current extruder coordinate\nG28 ; Home all axis\nG1 Y0 F1200 E0 ; move Y to min endstop and reset extruder\nG92 E0.0 ; zero the current extruder coordinate\nT1 ; switch to tool position T1\nG92 E0.0 ; zero the current extruder coordinate\nM117 E2 nozzle wipe... ; Put Nozzle wipe message on screen, Attempt Nozzle Wipe (for ooze free startup)\nG1 X-15.0 Y-92.9 Z0.3 F2400.0 ; move to start-line position\nG1 X15.0 Y-92.9 Z0.3 F1000.0 E2 ; draw 1st line\nG1 X15.0 Y-92.6 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92.6 Z0.3 F1000.0 E4 ; draw 2nd line\nG1 X-15.0 Y-92.3 Z0.3 F3000.0 ; move to side a little\nG1 X15.0 Y-92.3 Z0.3 F1000.0 E6 ; draw 3rd line\nG1 X15.0 Y-92 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92 Z0.3 F1000.0 E8 ; draw 4th line\nG92 E0.0 ; reset extruder coordinate to zero before printing\nM117 BIBO Now Printing from E2... ; Put now printing message on screen
+end_gcode = ;BIBO End GCode\nM107 ; turn fans off\nG91 ; Relative positioning\nG1 Z1 F100\nM140 S0 ; Disable heated bed\nM104 T0 S0 ; extruder T0 heater off\nM104 T1 S0 ; extruder T1 heater off\nG1 Z+0.5 X-20 Y-20 F300 ; move Z down then move print head a bit out of the way\nG28 X0 Y0 ; move X/Y to min endstops, so the head is out of the way\nG90 ; Absolute positioning\nG92 E0.0 ; Reset extruder position\nM84 ; Turn steppers off\nM117 BIBO Print complete ; Put print complete message on screen
+thumbnails =
+toolchange_gcode =
+use_relative_e_distances = 1
+wipe = 1
+z_offset = 0
+
+# Ditto Printing options with custom beds and special start end gcode for print duplication from one nozzle to the other
+[printer:BIBO2 E1 right E2 Ditto]
+inherits = BIBO2 Touch E1 right only extrusion
+printer_model = BIBO2
+printer_notes = Do not 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_BIBO\nPRINTER_MODEL_BIBO2
+bed_shape = 0x-93,33x-93,33x93,0x93
+#bed_model = BIBO2_bed.stl
+#bed_texture = BIBO2.svg
+before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;[layer_z]\nM104 S{temperature[0]} T1 ; set 2nd nozzle heater to print temperature\n
+start_gcode = ;Start code PrusaSlicer BIBO 2 printers E1 only (i.e. T0)\nM420 S1 ; Turn on Ditto Printing\nG21 ; set units to metric\nG90 ; absolute positioning\nM107 ; start with the fan off\nM190 S{first_layer_bed_temperature[0] - 5} ; wait for bed temp\nM140 S{first_layer_bed_temperature[0]} ; continue bed heating to full temp while other things are happening\nM104 S{first_layer_temperature[0]} T0 ; set 1st nozzle heater to first layer temperature\nM104 S{first_layer_temperature[0]} T1 ; set 2nd nozzle heater to same first layer temperature\nM105 ; Report Temperatures\nM109 S{first_layer_temperature[0]} T0 ; wait for 1st nozzle heat to first layer temperature\nM109 S{first_layer_temperature[0]} T1 ; wait for 2nd nozzle heat to same first layer temperature\nM105 ; Report Temperatures\nG28 X0 Y0 ; move X/Y to min endstops\nG28 Z0 ; move Z to min endstops\nG1 Y0 F1200 E0 ; move Y to min endstop and extrude 0 filament\nT[initial_tool] ; switch to initial tool position\nG92 E0.0 ; reset extruder\nG28 ; Home all axis\nG1 Y0 F1200 E0 ; move Y to min endstop and reset extruder\nG92 E0.0 ; zero the current extruder coordinate\nM117 Cleaning... ; Put Cleaning message on screen, Attempt Nozzle Wipe (for ooze free startup)\nG1 X-15.0 Y-92.9 Z0.3 F2400.0 ; move to start-line position\nG1 X15.0 Y-92.9 Z0.3 F1000.0 E2 ; draw 1st line\nG1 X15.0 Y-92.6 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92.6 Z0.3 F1000.0 E4 ; draw 2nd line\nG1 X-15.0 Y-92.3 Z0.3 F3000.0 ; move to side a little\nG1 X15.0 Y-92.3 Z0.3 F1000.0 E6 ; draw 3rd line\nG1 X15.0 Y-92 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92 Z0.3 F1000.0 E8 ; draw 4th line\nG92 E0.0 ; reset extruder and zero the current extruder coordinate before printing\nM117 BIBO E1 now Printing... ; Put now printing message on screen
+end_gcode = ;BIBO End GCode\nM107 ; turn fans off\nG91 ; Relative positioning\nG1 Z1 F100\nM140 S0 ; Disable heated bed\nM104 T0 S0 ; extruder T0 heater off\nM104 T1 S0 ; extruder T1 heater off\nG1 Z+0.5 X-20 Y-20 F300 ; move Z down then move print head a bit out of the way\nG28 X0 Y0 ; move X/Y to min endstops, so the head is out of the way\nG90 ; Absolute positioning\nG92 E0.0 ; Reset extruder position\nM84 ; Turn steppers off\nM420 S0 ; Turn off Ditto Printing function\nM117 BIBO Print complete ; Put print complete message on screen
+
+[printer:BIBO2 E2 left E1 Ditto]
+inherits = BIBO2 Touch E2 left only extrusion
+printer_model = BIBO2
+printer_notes = Do not 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_BIBO\nPRINTER_MODEL_BIBO2
+bed_shape = -33x-93,0x-93,0x93,-33x93
+#bed_model = BIBO2_bed.stl
+#bed_texture = BIBO2.svg
+before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;[layer_z]\nM104 S{temperature[0]} T0 ; set 1st nozzle heater to print temperature\n
+start_gcode = ;Start code PrusaSlicer BIBO 2 printers E2 only (i.e. T1)\nM420 S1 ; Turn on Ditto Printing\nG21 ; set units to metric\nG90 ; absolute positioning\nM107 ; start with the fan off\nM140 S{first_layer_bed_temperature[0] - 5} ; set bed temp\nM105 ; Report Temperatures\nM190 S{first_layer_bed_temperature[0]} ; wait for bed temp\nM104 S{first_layer_temperature[0]} T0 ; set 1st nozzle heater to ditto print temperature\nM104 S{first_layer_temperature[0]} T1 ; set 2nd nozzle heater to first layer temperature\nM105 ; Report Temperatures\nM109 S{first_layer_temperature[0]} T0 ; set 1st nozzle heater to ditto printing temperature\nM109 S{first_layer_temperature[0]} T1 ; Wait for 2nd nozzle heater to first layer temperature\nM105 ; Report Temperatures\nG28 X0 Y0 ; move X/Y to min endstops\nG28 Z0 ; move Z to min endstops\nG1 Z2 F400 ; move the print bed down 2mm\nT0 ; switch to tool position T0\nG90 ; absolute positioning\nG92 E0.0 ; zero the current extruder coordinate\nG28 ; Home all axis\nG1 Y0 F1200 E0 ; move Y to min endstop and reset extruder\nG92 E0.0 ; zero the current extruder coordinate\nT1 ; switch to tool position T1\nG92 E0.0 ; zero the current extruder coordinate\nM117 E2 nozzle wipe... ; Put Nozzle wipe message on screen, Attempt Nozzle Wipe (for ooze free startup)\nG1 X-15.0 Y-92.9 Z0.3 F2400.0 ; move to start-line position\nG1 X15.0 Y-92.9 Z0.3 F1000.0 E2 ; draw 1st line\nG1 X15.0 Y-92.6 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92.6 Z0.3 F1000.0 E4 ; draw 2nd line\nG1 X-15.0 Y-92.3 Z0.3 F3000.0 ; move to side a little\nG1 X15.0 Y-92.3 Z0.3 F1000.0 E6 ; draw 3rd line\nG1 X15.0 Y-92 Z0.3 F3000.0 ; move to side a little\nG1 X-15.0 Y-92 Z0.3 F1000.0 E8 ; draw 4th line\nG92 E0.0 ; reset extruder coordinate to zero before printing\nM117 BIBO Now Printing from E2... ; Put now printing message on screen
end_gcode = ;BIBO End GCode\nM107 ; turn fans off\nG91 ; Relative positioning\nG1 Z1 F100\nM140 S0 ; Disable heated bed\nM104 T0 S0 ; extruder T0 heater off\nM104 T1 S0 ; extruder T1 heater off\nG1 Z+0.5 X-20 Y-20 F300 ; move Z down then move print head a bit out of the way\nG28 X0 Y0 ; move X/Y to min endstops, so the head is out of the way\nG90 ; Absolute positioning\nG92 E0.0 ; Reset extruder position\nM84 ; Turn steppers off\nM420 S0 ; Turn off Ditto Printing function\nM117 BIBO Print complete ; Put print complete message on screen \ No newline at end of file
diff --git a/resources/profiles/BIBO/BIBO2_thumbnail.png b/resources/profiles/BIBO/BIBO2_thumbnail.png
index 3d99c7ee8..2bfa0bc7b 100644
--- a/resources/profiles/BIBO/BIBO2_thumbnail.png
+++ b/resources/profiles/BIBO/BIBO2_thumbnail.png
Binary files differ
diff --git a/resources/profiles/Creality.idx b/resources/profiles/Creality.idx
index 6db20df5b..a96a348d9 100644
--- a/resources/profiles/Creality.idx
+++ b/resources/profiles/Creality.idx
@@ -1,3 +1,17 @@
+min_slic3r_version = 2.3.0-rc2
+0.0.12 Added Ender-3V2 and filament profiles.
+min_slic3r_version = 2.3.0-beta2
+0.0.11 Updated machine limits for Ender 5 and Ender 5 Plus.
+0.0.10 Parameter consistency improvements. Enabled conservative elephant foot compensation.
+0.0.9 Fixed end g-code for Ender 5.
+0.0.8 Slight end g-code improvements and spool weights.
+min_slic3r_version = 2.3.0-alpha2
+0.0.7 Updated start g-code for Creality printers.
+0.0.6 Added filament profiles, adjusted temperatures, updated start g-code for some models.
+0.0.5 Added 0.08mm SUPERDETAIL and 0.28mm SUPERDRAFT print profiles. Updated OPTIMAL print profile.
+0.0.4 Added initial CR-10 profile, end g-code improvements.
+min_slic3r_version = 2.3.0-alpha0
+0.0.3 Added Ender-2, Ender-3 BLTouch, updated Ender-3 bed texture.
min_slic3r_version = 2.2.0-alpha3
0.0.2 Updated for PrusaSlicer 2.2.0-rc
0.0.2-beta Update for PrusaSlicer 2.2.0-beta
diff --git a/resources/profiles/Creality.ini b/resources/profiles/Creality.ini
index 93006cc56..c983e7b88 100644
--- a/resources/profiles/Creality.ini
+++ b/resources/profiles/Creality.ini
@@ -5,10 +5,10 @@
name = Creality
# Configuration version of this file. Config file will only be installed, if the config_version differs.
# This means, the server may force the PrusaSlicer configuration to be downgraded.
-config_version = 0.0.2
+config_version = 0.0.12
# Where to get the updates from?
-config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Creality/
-# changelog_url = http://files.prusa3d.com/?latest=slicer-profiles&lng=%1%
+config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/Creality/
+# changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1%
# The printer models will be shown by the Configuration Wizard in this order,
# also the first model installed & the first nozzle installed will be activated after install.
@@ -18,9 +18,154 @@ config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/Prusa
name = Creality Ender-3
variants = 0.4
technology = FFF
+family = ENDER
bed_model = ender3_bed.stl
bed_texture = ender3.svg
-default_materials = Generic PLA @ENDER3; Generic PETG @ENDER3; Generic ABS @ENDER3; Prusament PLA @ENDER3; Prusament PETG @ENDER3
+default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY
+
+[printer_model:ENDER3V2]
+name = Creality Ender-3V2
+variants = 0.4
+technology = FFF
+family = ENDER
+bed_model = ender3_bed.stl
+bed_texture = ender3.svg
+default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY
+
+[printer_model:ENDER3BLTOUCH]
+name = Creality Ender-3 BLTouch
+variants = 0.4
+technology = FFF
+family = ENDER
+bed_model = ender3_bed.stl
+bed_texture = ender3.svg
+default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY
+
+[printer_model:ENDER5]
+name = Creality Ender-5
+variants = 0.4
+technology = FFF
+family = ENDER
+bed_model = ender3_bed.stl
+bed_texture = ender3.svg
+default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY
+
+[printer_model:ENDER5PLUS]
+name = Creality Ender-5 Plus
+variants = 0.4
+technology = FFF
+family = ENDER
+bed_model = ender5plus_bed.stl
+bed_texture = ender5plus.svg
+default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY
+
+[printer_model:ENDER2]
+name = Creality Ender-2
+variants = 0.4
+technology = FFF
+family = ENDER
+bed_model = ender2_bed.stl
+bed_texture = ender2.svg
+default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY
+
+[printer_model:CR10MINI]
+name = Creality CR-10 Mini
+variants = 0.4
+technology = FFF
+family = CR
+bed_model = cr10mini_bed.stl
+bed_texture = cr10mini.svg
+default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY
+
+[printer_model:CR10]
+name = Creality CR-10
+variants = 0.4
+technology = FFF
+family = CR
+bed_model = cr10_bed.stl
+bed_texture = cr10.svg
+default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY
+
+[printer_model:CR10V2]
+name = Creality CR-10 V2
+variants = 0.4
+technology = FFF
+family = CR
+bed_model = cr10v2_bed.stl
+bed_texture = cr10.svg
+default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY
+
+[printer_model:CR10V3]
+name = Creality CR-10 V3
+variants = 0.4
+technology = FFF
+family = CR
+bed_model = cr10v2_bed.stl
+bed_texture = cr10.svg
+default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY
+
+[printer_model:CR10S]
+name = Creality CR-10 S
+variants = 0.4
+technology = FFF
+family = CR
+bed_model = cr10_bed.stl
+bed_texture = cr10.svg
+default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY
+
+[printer_model:CR10SPRO]
+name = Creality CR-10 S Pro
+variants = 0.4
+technology = FFF
+family = CR
+bed_model = cr10v2_bed.stl
+bed_texture = cr10.svg
+default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY
+
+[printer_model:CR10SPROV2]
+name = Creality CR-10 S Pro V2
+variants = 0.4
+technology = FFF
+family = CR
+bed_model = cr10v2_bed.stl
+bed_texture = cr10.svg
+default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY
+
+[printer_model:CR10S4]
+name = Creality CR-10 S4
+variants = 0.4
+technology = FFF
+family = CR
+bed_model = cr10s4_bed.stl
+bed_texture = cr10s4.svg
+default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY
+
+[printer_model:CR10S5]
+name = Creality CR-10 S5
+variants = 0.4
+technology = FFF
+family = CR
+bed_model = cr10s5_bed.stl
+bed_texture = cr10s5.svg
+default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY
+
+[printer_model:CR20]
+name = Creality CR-20
+variants = 0.4
+technology = FFF
+family = CR
+bed_model = ender3_bed.stl
+bed_texture = cr20.svg
+default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY
+
+[printer_model:CR20PRO]
+name = Creality CR-20 Pro
+variants = 0.4
+technology = FFF
+family = CR
+bed_model = ender3_bed.stl
+bed_texture = cr20.svg
+default_materials = Creality PLA @CREALITY; Generic PLA @CREALITY; Generic PETG @CREALITY; Generic ABS @CREALITY; Prusament PLA @CREALITY; Prusament PETG @CREALITY
# All presets starting with asterisk, for example *common*, are intermediate and they will
# not make it into the user interface.
@@ -36,11 +181,12 @@ clip_multipart_objects = 1
compatible_printers =
complete_objects = 0
dont_support_bridges = 1
-elefant_foot_compensation = 0
+elefant_foot_compensation = 0.1
ensure_vertical_shell_thickness = 1
external_fill_pattern = rectilinear
external_perimeters_first = 0
external_perimeter_extrusion_width = 0.45
+external_perimeter_speed = 25
extra_perimeters = 0
extruder_clearance_height = 25
extruder_clearance_radius = 45
@@ -59,6 +205,7 @@ infill_extrusion_width = 0.45
infill_first = 0
infill_only_where_needed = 0
infill_overlap = 25%
+infill_speed = 50
interface_shells = 0
max_print_speed = 100
max_volumetric_extrusion_rate_slope_negative = 0
@@ -73,6 +220,7 @@ output_filename_format = {input_filename_base}_{layer_height}mm_{filament_type[0
perimeters = 2
perimeter_extruder = 1
perimeter_extrusion_width = 0.45
+perimeter_speed = 40
post_process =
print_settings_id =
raft_layers = 0
@@ -87,11 +235,12 @@ solid_infill_below_area = 0
solid_infill_every_layers = 0
solid_infill_extruder = 1
solid_infill_extrusion_width = 0.45
+solid_infill_speed = 40
spiral_vase = 0
standby_temperature_delta = -5
support_material = 0
support_material_extruder = 0
-support_material_extrusion_width = 0.4
+support_material_extrusion_width = 0.38
support_material_interface_extruder = 0
support_material_angle = 0
support_material_buildplate_only = 0
@@ -109,9 +258,9 @@ support_material_threshold = 45
support_material_with_sheath = 0
support_material_xy_spacing = 60%
thin_walls = 0
-top_infill_extrusion_width = 0.45
-top_solid_infill_speed = 40
-travel_speed = 100
+top_infill_extrusion_width = 0.4
+top_solid_infill_speed = 30
+travel_speed = 150
wipe_tower = 0
wipe_tower_bridging = 10
wipe_tower_rotation_angle = 0
@@ -120,69 +269,85 @@ wipe_tower_x = 170
wipe_tower_y = 140
xy_size_compensation = 0
+[print:*0.08mm*]
+inherits = *common*
+layer_height = 0.08
+perimeters = 3
+bottom_solid_layers = 9
+top_solid_layers = 11
+
+[print:*0.10mm*]
+inherits = *common*
+layer_height = 0.1
+perimeters = 3
+bottom_solid_layers = 7
+top_solid_layers = 9
+
[print:*0.12mm*]
inherits = *common*
-perimeter_speed = 40
-external_perimeter_speed = 25
-infill_speed = 50
-solid_infill_speed = 40
layer_height = 0.12
perimeters = 3
-top_infill_extrusion_width = 0.4
bottom_solid_layers = 6
top_solid_layers = 7
+[print:*0.16mm*]
+inherits = *common*
+layer_height = 0.16
+bottom_solid_layers = 5
+top_solid_layers = 7
+
[print:*0.20mm*]
inherits = *common*
-perimeter_speed = 40
-external_perimeter_speed = 25
-infill_speed = 50
-solid_infill_speed = 40
layer_height = 0.20
-top_infill_extrusion_width = 0.4
bottom_solid_layers = 4
top_solid_layers = 5
[print:*0.24mm*]
inherits = *common*
-perimeter_speed = 40
-external_perimeter_speed = 25
-infill_speed = 50
-solid_infill_speed = 40
layer_height = 0.24
top_infill_extrusion_width = 0.45
bottom_solid_layers = 3
top_solid_layers = 4
-[print:0.12mm DETAIL @ENDER3]
+[print:*0.28mm*]
+inherits = *common*
+layer_height = 0.28
+top_infill_extrusion_width = 0.45
+bottom_solid_layers = 3
+top_solid_layers = 4
+
+[print:0.08mm SUPERDETAIL @CREALITY]
+inherits = *0.08mm*
+compatible_printers_condition = printer_model=~/(ENDER|CR).*/ and nozzle_diameter[0]==0.4
+
+[print:0.10mm HIGHDETAIL @CREALITY]
+inherits = *0.10mm*
+renamed_from = "0.10mm HIGHDETAIL @ENDER3"
+compatible_printers_condition = printer_model=~/(ENDER|CR).*/ and nozzle_diameter[0]==0.4
+
+[print:0.12mm DETAIL @CREALITY]
inherits = *0.12mm*
-# alias = 0.12mm DETAIL
-travel_speed = 150
-infill_speed = 50
-solid_infill_speed = 40
-top_solid_infill_speed = 30
-support_material_extrusion_width = 0.38
-compatible_printers_condition = printer_model=="ENDER3" and nozzle_diameter[0]==0.4
+renamed_from = "0.12mm DETAIL @ENDER3"
+compatible_printers_condition = printer_model=~/(ENDER|CR).*/ and nozzle_diameter[0]==0.4
-[print:0.20mm NORMAL @ENDER3]
+[print:0.16mm OPTIMAL @CREALITY]
+inherits = *0.16mm*
+renamed_from = "0.15mm OPTIMAL @ENDER3"; "0.15mm OPTIMAL @CREALITY"
+compatible_printers_condition = printer_model=~/(ENDER|CR).*/ and nozzle_diameter[0]==0.4
+
+[print:0.20mm NORMAL @CREALITY]
inherits = *0.20mm*
-# alias = 0.20mm NORMAL
-travel_speed = 150
-infill_speed = 50
-solid_infill_speed = 40
-top_solid_infill_speed = 30
-support_material_extrusion_width = 0.38
-compatible_printers_condition = printer_model=="ENDER3" and nozzle_diameter[0]==0.4
+renamed_from = "0.20mm NORMAL @ENDER3"
+compatible_printers_condition = printer_model=~/(ENDER|CR).*/ and nozzle_diameter[0]==0.4
-[print:0.24mm DRAFT @ENDER3]
+[print:0.24mm DRAFT @CREALITY]
inherits = *0.24mm*
-# alias = 0.24mm DRAFT
-travel_speed = 150
-infill_speed = 50
-solid_infill_speed = 40
-top_solid_infill_speed = 30
-support_material_extrusion_width = 0.38
-compatible_printers_condition = printer_model=="ENDER3" and nozzle_diameter[0]==0.4
+renamed_from = "0.24mm DRAFT @ENDER3"
+compatible_printers_condition = printer_model=~/(ENDER|CR).*/ and nozzle_diameter[0]==0.4
+
+[print:0.28mm SUPERDRAFT @CREALITY]
+inherits = *0.28mm*
+compatible_printers_condition = printer_model=~/(ENDER|CR).*/ and nozzle_diameter[0]==0.4
# Common filament preset
[filament:*common*]
@@ -201,22 +366,22 @@ compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_CREALITY.*/
[filament:*PLA*]
inherits = *common*
-bed_temperature = 40
+bed_temperature = 60
fan_below_layer_time = 100
-filament_colour = #FF3232
+filament_colour = #DDDDDD
filament_max_volumetric_speed = 15
filament_type = PLA
filament_density = 1.24
filament_cost = 20
-first_layer_bed_temperature = 40
-first_layer_temperature = 215
+first_layer_bed_temperature = 60
+first_layer_temperature = 210
fan_always_on = 1
cooling = 1
max_fan_speed = 100
min_fan_speed = 100
bridge_fan_speed = 100
disable_fan_first_layers = 1
-temperature = 210
+temperature = 205
[filament:*PET*]
inherits = *common*
@@ -224,12 +389,12 @@ bed_temperature = 70
cooling = 1
disable_fan_first_layers = 3
fan_below_layer_time = 20
-filament_colour = #FF8000
+filament_colour = #DDDDDD
filament_max_volumetric_speed = 8
filament_type = PETG
filament_density = 1.27
filament_cost = 30
-first_layer_bed_temperature =70
+first_layer_bed_temperature = 70
first_layer_temperature = 240
fan_always_on = 1
max_fan_speed = 50
@@ -243,7 +408,7 @@ bed_temperature = 100
cooling = 0
disable_fan_first_layers = 3
fan_below_layer_time = 20
-filament_colour = #3A80CA
+filament_colour = #DDDDDD
filament_max_volumetric_speed = 11
filament_type = ABS
filament_density = 1.04
@@ -257,108 +422,222 @@ bridge_fan_speed = 30
top_fan_speed = 0
temperature = 245
-[filament:Generic PLA @ENDER3]
+[filament:Generic PLA @CREALITY]
inherits = *PLA*
-# alias = Generic PLA
+renamed_from = "Generic PLA @ENDER3"
filament_vendor = Generic
-[filament:Generic PETG @ENDER3]
+[filament:Generic PETG @CREALITY]
inherits = *PET*
+renamed_from = "Generic PETG @ENDER3"
filament_vendor = Generic
-[filament:Generic ABS @ENDER3]
+[filament:Generic ABS @CREALITY]
inherits = *ABS*
-# alias = Generic ABS
-first_layer_bed_temperature = 90
+renamed_from = "Generic ABS @ENDER3"
+first_layer_bed_temperature = 90
bed_temperature = 90
filament_vendor = Generic
-[filament:Creality PLA @ENDER3]
+[filament:Creality PLA @CREALITY]
inherits = *PLA*
-# alias = Creality PLA
+renamed_from = "Creality PLA @ENDER3"
filament_vendor = Creality
-temperature = 205
-bed_temperature = 40
-first_layer_temperature = 210
-first_layer_bed_temperature =40
+temperature = 200
+bed_temperature = 60
+first_layer_temperature = 205
+first_layer_bed_temperature = 60
+filament_colour = #42BDD8
-[filament:Creality PETG @ENDER3]
+[filament:Creality PETG @CREALITY]
inherits = *PET*
-# alias = Creality PETG
+renamed_from = "Creality PETG @ENDER3"
filament_vendor = Creality
temperature = 240
bed_temperature = 70
first_layer_temperature = 240
-first_layer_bed_temperature =70
+first_layer_bed_temperature = 70
max_fan_speed = 40
min_fan_speed = 20
+filament_colour = #42BDD8
-[filament:Creality ABS @ENDER3]
+[filament:Creality ABS @CREALITY]
inherits = *ABS*
-# alias = Creality ABS
+renamed_from = "Creality ABS @ENDER3"
filament_vendor = Creality
temperature = 240
bed_temperature = 90
first_layer_temperature = 240
-first_layer_bed_temperature =90
+first_layer_bed_temperature = 90
+filament_colour = #42BDD8
-[filament:Prusament PLA @ENDER3]
+[filament:Prusament PLA @CREALITY]
inherits = *PLA*
-# alias = Prusament PLA
+renamed_from = "Prusament PLA @ENDER3"
filament_vendor = Prusa Polymers
-temperature = 215
-bed_temperature = 40
+temperature = 210
+bed_temperature = 60
first_layer_temperature = 215
-first_layer_bed_temperature =40
+first_layer_bed_temperature = 60
filament_cost = 24.99
filament_density = 1.24
+filament_colour = #F94D0C
-[filament:Prusament PETG @ENDER3]
+[filament:Prusament PETG @CREALITY]
inherits = *PET*
-# alias = Prusament PETG
+renamed_from = "Prusament PETG @ENDER3"
filament_vendor = Prusa Polymers
temperature = 245
bed_temperature = 70
first_layer_temperature = 245
-first_layer_bed_temperature =70
+first_layer_bed_temperature = 70
filament_cost = 24.99
filament_density = 1.27
+filament_colour = #F94D0C
+
+[filament:AzureFilm PLA @CREALITY]
+inherits = *PLA*
+filament_vendor = AzureFilm
+temperature = 210
+bed_temperature = 60
+first_layer_temperature = 215
+first_layer_bed_temperature = 60
+filament_cost = 19.97
+filament_density = 1.24
+filament_colour = #006AA6
+
+[filament:Devil Design PLA @CREALITY]
+inherits = *PLA*
+filament_vendor = Devil Design
+temperature = 215
+bed_temperature = 60
+first_layer_temperature = 215
+first_layer_bed_temperature = 60
+filament_cost = 19.00
+filament_density = 1.24
+filament_colour = #FF0000
+
+[filament:Devil Design PLA (Galaxy) @CREALITY]
+inherits = *PLA*
+filament_vendor = Devil Design
+temperature = 225
+bed_temperature = 65
+first_layer_temperature = 225
+first_layer_bed_temperature = 65
+filament_cost = 19.00
+filament_density = 1.24
+filament_colour = #FF0000
+
+[filament:Extrudr PLA NX2 @CREALITY]
+inherits = *PLA*
+filament_vendor = Extrudr
+temperature = 200
+bed_temperature = 60
+first_layer_temperature = 205
+first_layer_bed_temperature = 60
+filament_cost = 23.63
+filament_density = 1.3
+filament_colour = #3C4547
+filament_spool_weight = 256
+
+[filament:Real Filament PLA @CREALITY]
+inherits = *PLA*
+filament_vendor = Real Filament
+temperature = 195
+bed_temperature = 60
+first_layer_temperature = 200
+first_layer_bed_temperature = 60
+filament_cost = 24.99
+filament_density = 1.24
+filament_colour = #007ABF
+
+[filament:Velleman PLA @CREALITY]
+inherits = *PLA*
+filament_vendor = Velleman
+temperature = 200
+bed_temperature = 60
+first_layer_temperature = 205
+first_layer_bed_temperature = 60
+filament_cost = 27.99
+filament_density = 1.24
+filament_colour = #7EA60D
+
+[filament:3DJAKE ecoPLA @CREALITY]
+inherits = *PLA*
+filament_vendor = 3DJAKE
+temperature = 200
+bed_temperature = 60
+first_layer_temperature = 205
+first_layer_bed_temperature = 60
+filament_cost = 21.99
+filament_density = 1.24
+filament_colour = #125467
+filament_spool_weight = 238
+
+[filament:123-3D Jupiter PLA @CREALITY]
+inherits = *PLA*
+filament_vendor = 123-3D
+temperature = 200
+bed_temperature = 60
+first_layer_temperature = 205
+first_layer_bed_temperature = 60
+filament_cost = 19.50
+filament_density = 1.24
+filament_colour = #FFE200
+
+[filament:Das Filament PLA @CREALITY]
+inherits = *PLA*
+filament_vendor = Das Filament
+temperature = 215
+bed_temperature = 50
+first_layer_temperature = 215
+first_layer_bed_temperature = 50
+filament_cost = 20.56
+filament_density = 1.24
+
+[filament:Das Filament PETG @CREALITY]
+inherits = *PET*
+filament_vendor = Das Filament
+temperature = 240
+bed_temperature = 70
+first_layer_temperature = 240
+first_layer_bed_temperature = 70
+filament_cost = 27.44
+filament_density = 1.29
# Common printer preset
[printer:*common*]
printer_technology = FFF
-bed_shape = 0x0,200x0,200x200,0x200
-before_layer_gcode = ;BEFORE_LAYER_CHANGE\n;[layer_z]\n\n
+before_layer_gcode = ;BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z]\n\n
between_objects_gcode =
+pause_print_gcode =
deretract_speed = 0
extruder_colour = #FFFF00
extruder_offset = 0x0
gcode_flavor = marlin
silent_mode = 0
remaining_times = 0
-machine_max_acceleration_e = 10000
-machine_max_acceleration_extruding = 2000
-machine_max_acceleration_retracting = 1500
-machine_max_acceleration_x = 3000
-machine_max_acceleration_y = 3000
-machine_max_acceleration_z = 500
-machine_max_feedrate_e = 120
+machine_max_acceleration_e = 5000
+machine_max_acceleration_extruding = 500
+machine_max_acceleration_retracting = 1000
+machine_max_acceleration_x = 500
+machine_max_acceleration_y = 500
+machine_max_acceleration_z = 100
+machine_max_feedrate_e = 60
machine_max_feedrate_x = 500
machine_max_feedrate_y = 500
-machine_max_feedrate_z = 12
-machine_max_jerk_e = 2.5
-machine_max_jerk_x = 20
-machine_max_jerk_y = 20
+machine_max_feedrate_z = 10
+machine_max_jerk_e = 5
+machine_max_jerk_x = 8
+machine_max_jerk_y = 8
machine_max_jerk_z = 0.4
machine_min_extruding_rate = 0
machine_min_travel_rate = 0
layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z]
max_layer_height = 0.3
min_layer_height = 0.07
-max_print_height = 200
+max_print_height = 250
nozzle_diameter = 0.4
-octoprint_apikey =
-octoprint_host =
printer_notes =
printer_settings_id =
retract_before_travel = 1
@@ -372,11 +651,7 @@ retract_lift_below = 0
retract_restart_extra = 0
retract_restart_extra_toolchange = 0
retract_speed = 35
-serial_port =
-serial_speed = 250000
single_extruder_multi_material = 0
-start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home all\nG92 E0.0\nG1 Z0.15 F240\nG1 X60.0 E9.0 F800.0 ; intro line\nG1 X100.0 E12.5 F800 ; intro line\nG92 E0.0
-end_gcode = M104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 F3000 ; home X axis\nM84 ; disable motors
toolchange_gcode =
use_firmware_retraction = 0
use_relative_e_distances = 1
@@ -385,17 +660,18 @@ variable_layer_height = 1
wipe = 1
z_offset = 0
printer_model =
-default_print_profile =
-default_filament_profile =
+default_print_profile = 0.16mm OPTIMAL @CREALITY
+default_filament_profile = Generic PLA @CREALITY
-[printer:Creality ENDER-3]
+[printer:Creality Ender-3]
inherits = *common*
+renamed_from = "Creality ENDER-3"
printer_model = ENDER3
printer_variant = 0.4
-max_layer_height = 0.25
-min_layer_height = 0.1
-printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER3
-bed_shape = 0x0,220x0,220x220,0x220
+max_layer_height = 0.28
+min_layer_height = 0.08
+printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER3\nPRINTER_HAS_BOWDEN
+bed_shape = 3x3,228x3,228x228,3x228
max_print_height = 250
machine_max_acceleration_e = 5000
machine_max_acceleration_extruding = 500
@@ -412,14 +688,147 @@ machine_max_jerk_x = 8
machine_max_jerk_y = 8
machine_max_jerk_z = 0.4
machine_min_extruding_rate = 0
-machine_min_travel_rate = 0
+machine_min_travel_rate = 0
nozzle_diameter = 0.4
retract_before_travel = 2
retract_length = 5
retract_speed = 60
deretract_speed = 40
retract_before_wipe = 70%
-default_print_profile = 0.20mm NORMAL
-default_filament_profile = Creality PLA
-start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home all\nG1 Z2 F240\nG1 X2 Y10 F3000\nG1 Z0.28 F240\nG92 E0.0\nG1 Y190 E15.0 F1500.0 ; intro line\nG1 X2.3 F5000\nG1 Y10 E30 F1200.0 ; intro line\nG92 E0.0
-end_gcode = M104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+10, max_print_height)} F600{endif} ; Move print head up\nG1 X0 Y200 F3000 ; present print\nM84 X Y E ; disable motors
+start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home all\nG1 Z2 F240\nG1 X2 Y10 F3000\nG1 Z0.28 F240\nG92 E0\nG1 Y190 E15 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E15 F1200 ; intro line\nG92 E0
+end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600{endif} ; Move print head up\nG1 X5 Y170 F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+70, max_print_height-10)} F600{endif} ; Move print head further up\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors
+
+[printer:Creality Ender-3V2]
+inherits = Creality Ender-3
+printer_model = ENDER3V2
+printer_variant = 0.4
+bed_shape = 0x0,220x0,220x220,0x220
+
+[printer:*fastabl*]
+start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S150 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nG28 ; home all\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y190 E15 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E15 F1200 ; intro line\nG92 E0
+
+[printer:*slowabl*]
+start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S150 ; set extruder temp for auto bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all\nG29 ; auto bed levelling\nG1 Z50 F240\nG1 X2 Y10 F3000\nM104 S[first_layer_temperature] ; set extruder temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG1 Z0.28 F240\nG92 E0\nG1 Y190 E15 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E15 F1200 ; intro line\nG92 E0
+
+[printer:*invertedz*]
+end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600{endif} ; Move print bed down\nG1 X50 Y50 F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+max_print_height-10} F600{endif} ; Move print bed down further down\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors
+
+[printer:Creality Ender-3 BLTouch]
+inherits = Creality Ender-3; *fastabl*
+renamed_from = "Creality ENDER-3 BLTouch"
+printer_model = ENDER3BLTOUCH
+
+[printer:Creality Ender-5]
+inherits = Creality Ender-3; *invertedz*
+retract_length = 6
+bed_shape = 5x2.5,225x2.5,225x222.5,5x222.5
+printer_model = ENDER5
+printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER5\nPRINTER_HAS_BOWDEN
+max_print_height = 300
+machine_max_acceleration_e = 1000
+machine_max_feedrate_z = 5
+
+[printer:Creality Ender-5 Plus]
+inherits = Creality Ender-3; *slowabl*; *invertedz*
+retract_length = 6
+bed_shape = 5x5,355x5,355x355,5x355
+printer_model = ENDER5PLUS
+printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER5PLUS\nPRINTER_HAS_BOWDEN
+max_print_height = 400
+machine_max_acceleration_e = 1000
+machine_max_feedrate_z = 5
+machine_max_feedrate_x = 300
+machine_max_feedrate_y = 300
+
+[printer:Creality Ender-2]
+inherits = Creality Ender-3
+renamed_from = "Creality ENDER-2"
+bed_shape = 0x0,150x0,150x150,0x150
+printer_model = ENDER2
+printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_ENDER2\nPRINTER_HAS_BOWDEN
+max_print_height = 200
+start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 ; home all\nG1 Z2 F240\nG1 X2 Y10 F3000\nG1 Z0.28 F240\nG92 E0\nG1 X15 Y135 E15 F1500 ; intro line\nG1 X2.3 F5000\nG92 E0\nG1 Y10 E15 F1200 ; intro line\nG92 E0
+end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)} F600{endif} ; Move print head up\nG1 X5 Y140 F{travel_speed*60} ; present print\n{if max_layer_z < max_print_height-10}G1 Z{z_offset+min(max_layer_z+30, max_print_height-10)} F600{endif} ; Move print head further up\nM140 S0 ; turn off heatbed\nM104 S0 ; turn off temperature\nM107 ; turn off fan\nM84 X Y E ; disable motors
+
+[printer:Creality CR-10 Mini]
+inherits = Creality Ender-3
+retract_length = 6
+bed_shape = 2.5x5,2.5x225,302.5x225,302.5x5
+printer_model = CR10MINI
+printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_CR10MINI\nPRINTER_HAS_BOWDEN
+max_print_height = 300
+
+[printer:Creality CR-10]
+inherits = Creality Ender-3
+retract_length = 6
+bed_shape = 5x5,305x5,305x305,5x305
+printer_model = CR10
+printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_CR10\nPRINTER_HAS_BOWDEN
+max_print_height = 400
+
+[printer:Creality CR-10 V2]
+inherits = Creality Ender-3
+retract_length = 6
+bed_shape = 5x5,305x5,305x305,5x305
+printer_model = CR10V2
+printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_CR10V2\nPRINTER_HAS_BOWDEN
+max_print_height = 400
+
+[printer:Creality CR-10 V3]
+inherits = Creality Ender-3
+retract_length = 1
+bed_shape = 5x5,305x5,305x305,5x305
+printer_model = CR10V3
+printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_CR10V3
+max_print_height = 400
+
+[printer:Creality CR-10 S]
+inherits = Creality Ender-3
+retract_length = 6
+bed_shape = 5x5,305x5,305x305,5x305
+printer_model = CR10S
+printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_CR10S\nPRINTER_HAS_BOWDEN
+max_print_height = 400
+
+[printer:Creality CR-10 S Pro]
+inherits = Creality Ender-3; *slowabl*
+retract_length = 6
+bed_shape = 0x0,300x0,300x300,0x300
+printer_model = CR10SPRO
+printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_CR10SPRO\nPRINTER_HAS_BOWDEN
+max_print_height = 400
+
+[printer:Creality CR-10 S Pro V2]
+inherits = Creality Ender-3; *slowabl*
+retract_length = 6
+bed_shape = 5x5,305x5,305x305,5x305
+printer_model = CR10SPROV2
+printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_CR10SPROV2\nPRINTER_HAS_BOWDEN
+max_print_height = 400
+
+[printer:Creality CR-10 S4]
+inherits = Creality Ender-3
+retract_length = 6
+bed_shape = 5x5,405x5,405x405,5x405
+printer_model = CR10S4
+printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_CR10S4\nPRINTER_HAS_BOWDEN
+max_print_height = 400
+
+[printer:Creality CR-10 S5]
+inherits = Creality Ender-3
+retract_length = 6
+bed_shape = 5x5,505x5,505x505,5x505
+printer_model = CR10S5
+printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_CR10S5\nPRINTER_HAS_BOWDEN
+max_print_height = 500
+
+[printer:Creality CR-20]
+inherits = Creality Ender-3
+printer_model = CR20
+printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_CR20\nPRINTER_HAS_BOWDEN
+
+[printer:Creality CR-20 Pro]
+inherits = Creality Ender-3; *fastabl*
+retract_length = 4
+printer_model = CR20PRO
+printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_CREALITY\nPRINTER_MODEL_CR20PRO\nPRINTER_HAS_BOWDEN
diff --git a/resources/profiles/Creality/CR10MINI_thumbnail.png b/resources/profiles/Creality/CR10MINI_thumbnail.png
new file mode 100644
index 000000000..ecb9c97ab
--- /dev/null
+++ b/resources/profiles/Creality/CR10MINI_thumbnail.png
Binary files differ
diff --git a/resources/profiles/Creality/CR10S4_thumbnail.png b/resources/profiles/Creality/CR10S4_thumbnail.png
new file mode 100644
index 000000000..ff01823c3
--- /dev/null
+++ b/resources/profiles/Creality/CR10S4_thumbnail.png
Binary files differ
diff --git a/resources/profiles/Creality/CR10S5_thumbnail.png b/resources/profiles/Creality/CR10S5_thumbnail.png
new file mode 100644
index 000000000..ff01823c3
--- /dev/null
+++ b/resources/profiles/Creality/CR10S5_thumbnail.png
Binary files differ
diff --git a/resources/profiles/Creality/CR10SPROV2_thumbnail.png b/resources/profiles/Creality/CR10SPROV2_thumbnail.png
new file mode 100644
index 000000000..e7d297725
--- /dev/null
+++ b/resources/profiles/Creality/CR10SPROV2_thumbnail.png
Binary files differ
diff --git a/resources/profiles/Creality/CR10SPRO_thumbnail.png b/resources/profiles/Creality/CR10SPRO_thumbnail.png
new file mode 100644
index 000000000..84e9b6c82
--- /dev/null
+++ b/resources/profiles/Creality/CR10SPRO_thumbnail.png
Binary files differ
diff --git a/resources/profiles/Creality/CR10S_thumbnail.png b/resources/profiles/Creality/CR10S_thumbnail.png
new file mode 100644
index 000000000..1a8f0eb02
--- /dev/null
+++ b/resources/profiles/Creality/CR10S_thumbnail.png
Binary files differ
diff --git a/resources/profiles/Creality/CR10V2_thumbnail.png b/resources/profiles/Creality/CR10V2_thumbnail.png
new file mode 100644
index 000000000..325e58a62
--- /dev/null
+++ b/resources/profiles/Creality/CR10V2_thumbnail.png
Binary files differ
diff --git a/resources/profiles/Creality/CR10V3_thumbnail.png b/resources/profiles/Creality/CR10V3_thumbnail.png
new file mode 100644
index 000000000..2019ec28c
--- /dev/null
+++ b/resources/profiles/Creality/CR10V3_thumbnail.png
Binary files differ
diff --git a/resources/profiles/Creality/CR10_thumbnail.png b/resources/profiles/Creality/CR10_thumbnail.png
new file mode 100644
index 000000000..53cdac9d5
--- /dev/null
+++ b/resources/profiles/Creality/CR10_thumbnail.png
Binary files differ
diff --git a/resources/profiles/Creality/CR20PRO_thumbnail.png b/resources/profiles/Creality/CR20PRO_thumbnail.png
new file mode 100644
index 000000000..d420c6c65
--- /dev/null
+++ b/resources/profiles/Creality/CR20PRO_thumbnail.png
Binary files differ
diff --git a/resources/profiles/Creality/CR20_thumbnail.png b/resources/profiles/Creality/CR20_thumbnail.png
new file mode 100644
index 000000000..d8dfdf5dc
--- /dev/null
+++ b/resources/profiles/Creality/CR20_thumbnail.png
Binary files differ
diff --git a/resources/profiles/Creality/ENDER2_thumbnail.png b/resources/profiles/Creality/ENDER2_thumbnail.png
new file mode 100644
index 000000000..f4bcd8dc5
--- /dev/null
+++ b/resources/profiles/Creality/ENDER2_thumbnail.png
Binary files differ
diff --git a/resources/profiles/Creality/ENDER3BLTOUCH_thumbnail.png b/resources/profiles/Creality/ENDER3BLTOUCH_thumbnail.png
new file mode 100644
index 000000000..4234b2dde
--- /dev/null
+++ b/resources/profiles/Creality/ENDER3BLTOUCH_thumbnail.png
Binary files differ
diff --git a/resources/profiles/Creality/ENDER3V2_thumbnail.png b/resources/profiles/Creality/ENDER3V2_thumbnail.png
new file mode 100644
index 000000000..6fa241272
--- /dev/null
+++ b/resources/profiles/Creality/ENDER3V2_thumbnail.png
Binary files differ
diff --git a/resources/profiles/Creality/ENDER3_thumbnail.png b/resources/profiles/Creality/ENDER3_thumbnail.png
index 8b1ca5889..4234b2dde 100644
--- a/resources/profiles/Creality/ENDER3_thumbnail.png
+++ b/resources/profiles/Creality/ENDER3_thumbnail.png
Binary files differ
diff --git a/resources/profiles/Creality/ENDER5PLUS_thumbnail.png b/resources/profiles/Creality/ENDER5PLUS_thumbnail.png
new file mode 100644
index 000000000..c76667e01
--- /dev/null
+++ b/resources/profiles/Creality/ENDER5PLUS_thumbnail.png
Binary files differ
diff --git a/resources/profiles/Creality/ENDER5_thumbnail.png b/resources/profiles/Creality/ENDER5_thumbnail.png
new file mode 100644
index 000000000..51a7b3149
--- /dev/null
+++ b/resources/profiles/Creality/ENDER5_thumbnail.png
Binary files 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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="300mm" height="300mm" version="1.1" viewBox="0 0 300 300" xmlns="http://www.w3.org/2000/svg">
+ <rect x=".25" y=".25" width="299.5" height="299.5" fill="none" stroke="#fff" stroke-width=".5"/>
+</svg>
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="300mm" height="220mm" version="1.1" viewBox="0 0 300 220" xmlns="http://www.w3.org/2000/svg">
+ <rect x=".25" y=".25" width="299.5" height="219.5" fill="none" stroke="#fff" stroke-width=".5"/>
+</svg>
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="400mm" height="400mm" version="1.1" viewBox="0 0 400 400" xmlns="http://www.w3.org/2000/svg">
+ <rect x=".25" y=".25" width="399.5" height="399.5" fill="none" stroke="#fff" stroke-width=".5"/>
+</svg>
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="500mm" height="500mm" version="1.1" viewBox="0 0 500 500" xmlns="http://www.w3.org/2000/svg">
+ <rect x=".25" y=".25" width="499.5" height="499.5" fill="none" stroke="#fff" stroke-width=".5"/>
+</svg>
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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="225mm" height="225mm" version="1.1" viewBox="0 0 225 225" xmlns="http://www.w3.org/2000/svg">
+ <rect x=".25" y=".25" width="224.5" height="224.5" fill="none" stroke="#fff" stroke-width=".5"/>
+</svg>
diff --git a/resources/profiles/Creality/ender2.svg b/resources/profiles/Creality/ender2.svg
new file mode 100644
index 000000000..7a5e63cb2
--- /dev/null
+++ b/resources/profiles/Creality/ender2.svg
@@ -0,0 +1,560 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ sodipodi:docname="ender2.svg"
+ inkscape:version="1.0 (4035a4fb49, 2020-05-01)"
+ id="svg1883"
+ version="1.1"
+ viewBox="0 0 150 150"
+ height="150mm"
+ width="150mm">
+ <defs
+ id="defs1877" />
+ <sodipodi:namedview
+ inkscape:snap-page="false"
+ inkscape:window-maximized="1"
+ inkscape:window-y="-8"
+ inkscape:window-x="85"
+ inkscape:window-height="1177"
+ inkscape:window-width="1827"
+ borderlayer="false"
+ showgrid="false"
+ inkscape:document-rotation="0"
+ inkscape:current-layer="layer1"
+ inkscape:document-units="mm"
+ inkscape:cy="318.48593"
+ inkscape:cx="251.26164"
+ inkscape:zoom="1.4142136"
+ inkscape:pageshadow="2"
+ inkscape:pageopacity="0"
+ borderopacity="1"
+ bordercolor="#f14bac"
+ pagecolor="#5d5d5d"
+ id="base">
+ <inkscape:grid
+ id="grid2446"
+ type="xygrid" />
+ </sodipodi:namedview>
+ <metadata
+ id="metadata1880">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title />
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <g
+ inkscape:label="Layer 2"
+ id="layer2"
+ inkscape:groupmode="layer">
+ <path
+ sodipodi:nodetypes="cccccscsccsssccscsscscccccccssssccsscssccsscsccscscsccscsscscscsssccsssccccsccsscsccscscsccscsscscscscccccssscccc"
+ d="m 104.83464,129.87598 -2.1e-4,10.24981 h 35.29136 v -10.25 z m 8.12259,2.01941 c 0.66867,0 1.17978,0.20044 1.53295,0.60064 0.35605,0.40018 0.53409,0.97529 0.53409,1.72563 v 3.84905 h -1.76328 v -3.84905 c 0,-0.36782 -0.12846,-0.5519 -0.38609,-0.5519 -0.24896,0 -0.37361,0.18408 -0.37361,0.5519 v 3.84905 h -1.76274 v -3.91101 c 0,-0.68562 0.20102,-1.23423 0.60339,-1.6462 0.40526,-0.41196 0.94369,-0.61811 1.61529,-0.61811 z m 23.39139,0 c 0.57318,0 1.0595,0.20486 1.45898,0.61388 0.40236,0.409 0.60339,0.90595 0.60339,1.49151 0,0.33547 -0.0737,0.64755 -0.22145,0.93592 l -0.70343,1.39037 h 0.99 v 1.74364 h -3.82978 l 1.90186,-3.62818 0.0651,-0.12394 c 0.0521,-0.097 0.0781,-0.19239 0.0781,-0.28655 0,-0.23835 -0.13768,-0.35752 -0.41267,-0.35752 -0.10711,0 -0.20084,0.041 -0.28189,0.12342 -0.0781,0.0795 -0.11724,0.17343 -0.11724,0.28231 0,0.12357 0.0521,0.23575 0.15631,0.33579 l -0.76022,1.37712 c -0.31842,-0.2001 -0.56285,-0.4548 -0.73365,-0.76376 -0.1708,-0.30897 -0.25637,-0.65013 -0.25637,-1.02384 0,-0.57969 0.20154,-1.07586 0.60391,-1.48782 0.40238,-0.4149 0.8887,-0.62235 1.45896,-0.62235 z m -28.03768,0.15042 h 1.53295 v 1.72988 h -1.12444 c -0.30395,0 -0.45593,0.10023 -0.45593,0.30031 0,0.11771 0.036,0.20027 0.10838,0.24736 0.0723,0.0442 0.20136,0.0662 0.38662,0.0662 h 0.97282 v 1.34164 h -1.15101 c -0.15631,0 -0.26742,0.0233 -0.334,0.0705 -0.0636,0.0471 -0.0958,0.12652 -0.0958,0.23834 0,0.12654 0.0335,0.2104 0.10005,0.2516 0.0665,0.0383 0.20243,0.0577 0.408,0.0577 h 1.1854 v 1.7214 h -1.38497 c -0.65132,0 -1.14941,-0.15761 -1.49388,-0.47246 -0.34448,-0.3178 -0.51689,-0.77554 -0.51689,-1.37289 v -2.36122 c 0,-0.57674 0.16245,-1.02384 0.48667,-1.34163 0.32711,-0.3178 0.78558,-0.4767 1.37612,-0.4767 z m 7.79453,0 h 2.29683 c 1.00739,0 1.79639,0.23211 2.36665,0.69704 0.67738,0.55614 1.01606,1.31091 1.01606,2.26429 0,0.91221 -0.28965,1.65685 -0.8686,2.23359 -0.57895,0.57674 -1.32453,0.86494 -2.23638,0.86494 -0.10712,0 -0.28208,-0.006 -0.52523,-0.0175 v -1.77012 h 0.28241 c 1.02764,0 1.54129,-0.43697 1.54129,-1.31092 0,-0.82097 -0.50497,-1.23145 -1.51523,-1.23145 h -0.59506 v 4.29502 h -1.76274 z m 8.25463,0 h 1.53242 v 1.72988 h -1.12444 c -0.30395,0 -0.45592,0.10023 -0.45592,0.30031 0,0.11771 0.036,0.20027 0.10837,0.24736 0.0723,0.0442 0.20136,0.0662 0.38663,0.0662 h 0.97231 v 1.34164 h -1.1505 c -0.15633,0 -0.26795,0.0233 -0.33453,0.0705 -0.0636,0.0471 -0.0953,0.12652 -0.0953,0.23834 0,0.12654 0.0334,0.2104 0.10006,0.2516 0.0666,0.0383 0.2025,0.0577 0.40799,0.0577 h 1.1854 v 1.7214 h -1.38497 c -0.65133,0 -1.1494,-0.15761 -1.49388,-0.47246 -0.34447,-0.3178 -0.51636,-0.77554 -0.51636,-1.37289 v -2.36122 c 0,-0.57674 0.16194,-1.02384 0.48615,-1.34163 0.32711,-0.3178 0.78609,-0.4767 1.37664,-0.4767 z m 2.54849,0 h 2.26245 c 0.68895,0 1.22304,0.17344 1.60225,0.52066 0.42265,0.38842 0.63361,0.88147 0.63361,1.47882 0,0.60911 -0.2618,1.1224 -0.78576,1.54025 l 1.01608,2.48517 h -1.84978 l -0.85557,-1.94227 v -1.54926 h 0.13913 c 0.37052,0 0.55596,-0.16201 0.55596,-0.4857 0,-0.28541 -0.21456,-0.42796 -0.64299,-0.42796 h -0.31263 v 4.40519 h -1.76275 z"
+ style="display:inline;fill:#ffffff;stroke:#fdfdfd;stroke-width:0;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0"
+ id="rect205" />
+ </g>
+ <g
+ id="layer1"
+ inkscape:groupmode="layer"
+ inkscape:label="Layer 1"
+ style="display:inline">
+ <path
+ id="path2643"
+ d="M 0,0 H 150 V 150 H 0 Z"
+ style="fill:none;stroke:#ffffff;stroke-width:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ id="path2645"
+ d="M 75,0 V 150"
+ style="fill:none;stroke:#ffffff;stroke-width:0.75;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ id="path2647"
+ d="M 0,75 H 150"
+ style="fill:none;stroke:#ffffff;stroke-width:0.75;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ id="path2649"
+ d="M 25,0 V 150"
+ style="fill:none;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ id="path2651"
+ d="M 50,0 V 150"
+ style="fill:none;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ id="path2653"
+ d="M 100,0 V 150"
+ style="fill:none;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
+ <path
+ id="path2655"
+ d="m 125,0 0,130"
+ style="fill:none;stroke:#ffffff;stroke-width:0.5;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#ffffff;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 150,25 H 2.0000005e-6"
+ id="path2649-5" />
+ <path
+ style="fill:none;stroke:#ffffff;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 150,50 H 2.0000005e-6"
+ id="path2651-4" />
+ <path
+ style="fill:none;stroke:#ffffff;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 150,100 H 2.0000005e-6"
+ id="path2653-9" />
+ <path
+ style="fill:none;stroke:#ffffff;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="M 150,125 H 2.0000005e-6"
+ id="path2655-5" />
+ <path
+ id="path2681"
+ d="M 4.9735417,-0.26458333 V 150.26458"
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.5, 0.25;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ id="path2683"
+ d="M 9.9911806,150.26458 V -0.26458333"
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.5, 0.25;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ id="path2685"
+ d="M 15.008819,-0.26458333 V 150.26458"
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.5, 0.25;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ id="path2687"
+ d="M 20.026458,150.26458 V -0.26458333"
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.5, 0.25;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 29.982361,-0.52917 V 150"
+ id="path2681-2" />
+ <path
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 35,150 V -0.52917"
+ id="path2683-1" />
+ <path
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 40.017638,-0.52917 V 150"
+ id="path2685-5" />
+ <path
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 45.035278,150 V -0.52917"
+ id="path2687-4" />
+ <path
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 54.964723,0 V 150.52917"
+ id="path2681-9" />
+ <path
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 59.982362,150.52917 V 0"
+ id="path2683-8" />
+ <path
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 65,0 V 150.52917"
+ id="path2685-4" />
+ <path
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 70.01764,150.52917 V 0"
+ id="path2687-7" />
+ <path
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 80,-0.52917033 V 150"
+ id="path2681-3" />
+ <path
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 85.017639,150 V -0.52917033"
+ id="path2683-6" />
+ <path
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 90.035277,-0.52917033 V 150"
+ id="path2685-3" />
+ <path
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 95.052918,150 V -0.52917033"
+ id="path2687-44" />
+ <path
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 104.96472,0 V 150.52917"
+ id="path2681-36" />
+ <path
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 110,130 109.98236,0"
+ id="path2683-5"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 115,0 0,130"
+ id="path2685-7"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 120,130 120.01764,0"
+ id="path2687-48"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 129.96472,0 130,130"
+ id="path2681-0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 135,130 V 0"
+ id="path2683-0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 140,0 0,150"
+ id="path2685-2"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 145.01764,150.52917 V 0"
+ id="path2687-47" />
+ <path
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 149.73541,4.955902 0,5"
+ id="path2681-39"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 0,10 149.73541,9.973541"
+ id="path2683-3"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 149.73541,14.991179 0,15"
+ id="path2685-51"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 0,20 149.73541,0.0088"
+ id="path2687-486"
+ sodipodi:nodetypes="cc" />
+ <path
+ id="path2681-2-1"
+ d="M 150,30 H 0"
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:nodetypes="cc" />
+ <path
+ id="path2683-1-9"
+ d="M 0,35 150,34.98236"
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:nodetypes="cc" />
+ <path
+ id="path2685-5-4"
+ d="M 150,40 H 0"
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:nodetypes="cc" />
+ <path
+ id="path2687-4-9"
+ d="m 0,45 150,0.01764"
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:nodetypes="cc" />
+ <path
+ id="path2681-9-6"
+ d="M 149.47083,54.94708 0,55"
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:nodetypes="cc" />
+ <path
+ id="path2683-8-0"
+ d="M 0,60 149.47083,59.96472"
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:nodetypes="cc" />
+ <path
+ id="path2685-4-7"
+ d="M 149.47083,64.98236 0,65"
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:nodetypes="cc" />
+ <path
+ id="path2681-3-7"
+ d="M 150,79.98236 0,80"
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:nodetypes="cc" />
+ <path
+ id="path2683-6-0"
+ d="M 0,85 H 150"
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:nodetypes="cc" />
+ <path
+ id="path2685-3-3"
+ d="M 150,90.01764 H -0.529169"
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ id="path2687-44-3"
+ d="m 0,95 150,0.03528"
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:nodetypes="cc" />
+ <path
+ id="path2681-36-5"
+ d="M 149.47083,104.94708 0,105"
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:nodetypes="cc" />
+ <path
+ id="path2683-5-1"
+ d="m 0,110 149.47083,-0.0353"
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:nodetypes="cc" />
+ <path
+ id="path2685-7-5"
+ d="M 149.47083,114.98236 0,115"
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:nodetypes="cc" />
+ <path
+ id="path2687-48-9"
+ d="M 0,120 H 149.47083"
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:nodetypes="cc" />
+ <path
+ id="path2681-0-8"
+ d="M 150,130 0,130"
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:nodetypes="cc" />
+ <path
+ id="path2683-0-5"
+ d="M 0,135 H 105"
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:nodetypes="cc" />
+ <path
+ id="path2685-2-7"
+ d="M 150,140 H 0"
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:nodetypes="cc" />
+ <path
+ id="path2687-47-6"
+ d="M 0,145 H 149.47083"
+ style="fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ id="path2683-5-5"
+ d="m 110,150 0,-10"
+ style="display:inline;fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1" />
+ <path
+ style="display:inline;fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 115,150 V 140"
+ id="path2683-5-5-6"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="display:inline;fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 120,150 V 140"
+ id="path2683-5-5-0"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="display:inline;fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 130,150 V 140"
+ id="path2683-5-5-9"
+ sodipodi:nodetypes="cc" />
+ <path
+ style="display:inline;fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 135,150 V 140"
+ id="path2683-5-5-2"
+ sodipodi:nodetypes="cc" />
+ <path
+ sodipodi:nodetypes="cc"
+ style="display:inline;fill:none;stroke:#ffffff;stroke-width:0.499999;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
+ d="m 125,140 0,10"
+ id="path2655-0" />
+ <g
+ transform="translate(0.04335936,147.09955)"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:1.76389px;line-height:1.25;font-family:Consolas;-inkscape-font-specification:'Consolas, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ id="text966-0-4"
+ aria-label="125">
+ <path
+ id="path188"
+ d="M 121.63635,2.0732279 V 1.8863313 h 0.2868 V 1.1628608 l -0.24977,0.1378039 -0.0689,-0.1713936 0.35743,-0.18861909 h 0.17656 V 1.8863313 h 0.24718 v 0.1868966 z" />
+ <path
+ id="path190"
+ d="M 122.58805,2.0732279 V 1.9181985 l 0.26614,-0.2661338 q 0.0749,-0.074931 0.11972,-0.1291912 0.0456,-0.05426 0.0698,-0.096463 0.025,-0.043064 0.0327,-0.079237 0.008,-0.036174 0.008,-0.074931 0,-0.031867 -0.0103,-0.060289 -0.0103,-0.029283 -0.0301,-0.049954 -0.0198,-0.021532 -0.05,-0.03359 -0.0301,-0.012919 -0.0689,-0.012919 -0.0663,0 -0.12316,0.029283 -0.0568,0.028422 -0.10766,0.076654 l -0.1111,-0.1429716 q 0.0732,-0.068041 0.1645,-0.10852056 0.0922,-0.0413412 0.19895,-0.0413412 0.0827,0 0.14987,0.0215319 0.0672,0.0206706 0.11455,0.0620118 0.0482,0.041341 0.0741,0.1033529 0.0267,0.062012 0.0267,0.1429716 0,0.067179 -0.0181,0.125746 -0.0181,0.057705 -0.0525,0.112827 -0.0344,0.055122 -0.0853,0.1102431 -0.0499,0.055122 -0.11455,0.1162721 l -0.16364,0.1558906 h 0.47456 v 0.1937868 z" />
+ <path
+ id="path192"
+ d="m 124.31491,1.7132152 q 0,0.090434 -0.0379,0.1610583 -0.0379,0.069763 -0.10507,0.1179946 -0.0672,0.048231 -0.15848,0.073208 -0.0913,0.024977 -0.19809,0.024977 -0.0267,0 -0.0568,-0.00172 -0.0301,-0.00172 -0.0611,-0.00431 -0.031,-0.00258 -0.0603,-0.00689 -0.0293,-0.00345 -0.0543,-0.00775 V 1.8863313 q 0.0491,0.012058 0.11282,0.019809 0.0637,0.00689 0.13006,0.00689 0.12919,0 0.19637,-0.049093 0.068,-0.049954 0.068,-0.1378039 0,-0.091295 -0.0629,-0.1352201 -0.0629,-0.044786 -0.20326,-0.044786 H 123.6035 V 0.94754221 h 0.6494 V 1.1456353 h -0.45303 v 0.229099 h 0.081 q 0.0861,0 0.1645,0.015503 0.0784,0.015503 0.1378,0.05426 0.0603,0.037896 0.0956,0.1033529 0.0362,0.065457 0.0362,0.1653647 z" />
+ </g>
+ <g
+ transform="translate(0.04335936,147.09955)"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:1.76389px;line-height:1.25;font-family:Consolas;-inkscape-font-specification:'Consolas, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ id="text966-0-9"
+ aria-label="100">
+ <path
+ id="path181"
+ d="M 96.636346,2.0732279 V 1.8863313 H 96.92315 V 1.1628608 l -0.249769,0.1378039 -0.0689,-0.1713936 0.357429,-0.18861909 h 0.176561 V 1.8863313 h 0.247186 v 0.1868966 z" />
+ <path
+ id="path183"
+ d="m 98.401097,1.505648 q 0,0.1386652 -0.03014,0.2480471 -0.03015,0.1093818 -0.08871,0.185174 -0.0577,0.074931 -0.141249,0.1145495 -0.08354,0.039619 -0.191203,0.039619 -0.09302,0 -0.171393,-0.032728 -0.07838,-0.032729 -0.13522,-0.1024917 -0.05684,-0.070624 -0.08871,-0.1800063 -0.03187,-0.1093819 -0.03187,-0.2618275 0,-0.1386652 0.03014,-0.248047 0.03101,-0.1093819 0.08871,-0.1843127 0.0577,-0.075792 0.14211,-0.11541081 0.08441,-0.0396186 0.191203,-0.0396186 0.09302,0 0.171394,0.0327284 0.07838,0.0327284 0.134359,0.10249171 0.05684,0.069763 0.08871,0.179145 0.03187,0.1093819 0.03187,0.2626887 z m -0.666626,0.00345 q 0,0.017225 0,0.032728 0,0.014642 0.0017,0.030145 l 0.422047,-0.304896 q -0.03015,-0.085266 -0.0801,-0.125746 -0.04909,-0.041341 -0.116272,-0.041341 -0.04823,0 -0.08957,0.024977 -0.04134,0.024116 -0.07235,0.074931 -0.03014,0.050815 -0.04823,0.1274686 -0.01722,0.076653 -0.01722,0.1817289 z m 0.454753,0.00345 q 0,-0.014642 -8.62e-4,-0.029283 -8.61e-4,-0.015503 -8.61e-4,-0.029283 L 97.76806,1.7571402 q 0.02756,0.083544 0.07751,0.1240235 0.04995,0.04048 0.116272,0.04048 0.04823,0 0.08957,-0.024977 0.0422,-0.024977 0.07235,-0.074931 0.03101,-0.050815 0.04823,-0.1274686 0.01723,-0.077515 0.01723,-0.1817289 z" />
+ <path
+ id="path185"
+ d="m 99.372615,1.505648 q 0,0.1386652 -0.03014,0.2480471 -0.03014,0.1093818 -0.08871,0.185174 -0.05771,0.074931 -0.141249,0.1145495 -0.08354,0.039619 -0.191203,0.039619 -0.09302,0 -0.171394,-0.032728 -0.07838,-0.032729 -0.13522,-0.1024917 -0.05684,-0.070624 -0.08871,-0.1800063 -0.03187,-0.1093819 -0.03187,-0.2618275 0,-0.1386652 0.03014,-0.248047 0.03101,-0.1093819 0.08871,-0.1843127 0.0577,-0.075792 0.14211,-0.11541081 0.0844,-0.0396186 0.191203,-0.0396186 0.09302,0 0.171393,0.0327284 0.07838,0.0327284 0.134359,0.10249171 0.05684,0.069763 0.08871,0.179145 0.03187,0.1093819 0.03187,0.2626887 z m -0.666627,0.00345 q 0,0.017225 0,0.032728 0,0.014642 0.0017,0.030145 l 0.422047,-0.304896 q -0.03014,-0.085266 -0.0801,-0.125746 -0.04909,-0.041341 -0.116272,-0.041341 -0.04823,0 -0.08957,0.024977 -0.04134,0.024116 -0.07235,0.074931 -0.03014,0.050815 -0.04823,0.1274686 -0.01723,0.076653 -0.01723,0.1817289 z m 0.454753,0.00345 q 0,-0.014642 -8.61e-4,-0.029283 -8.61e-4,-0.015503 -8.61e-4,-0.029283 l -0.419441,0.3031686 q 0.02756,0.083544 0.07752,0.1240235 0.04995,0.04048 0.116272,0.04048 0.04823,0 0.08957,-0.024977 0.0422,-0.024977 0.07235,-0.074931 0.03101,-0.050815 0.04823,-0.1274686 0.01722,-0.077515 0.01722,-0.1817289 z" />
+ </g>
+ <g
+ transform="translate(0.04335936,147.09955)"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:1.76389px;line-height:1.25;font-family:Consolas;-inkscape-font-specification:'Consolas, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ id="text966-0-99"
+ aria-label="25">
+ <path
+ id="path166"
+ style="stroke-width:0.264583"
+ d="M 22.616538,2.0732279 V 1.9181985 l 0.266134,-0.2661338 q 0.07493,-0.074931 0.119717,-0.1291912 0.04565,-0.05426 0.06976,-0.096463 0.02498,-0.043064 0.03273,-0.079237 0.0078,-0.036174 0.0078,-0.074931 0,-0.031867 -0.01034,-0.060289 -0.01034,-0.029283 -0.03014,-0.049954 -0.01981,-0.021532 -0.04995,-0.03359 -0.03015,-0.012919 -0.0689,-0.012919 -0.06632,0 -0.123163,0.029283 -0.05684,0.028422 -0.107659,0.076654 L 22.611371,1.0784559 q 0.07321,-0.068041 0.164503,-0.10852056 0.09216,-0.0413412 0.198955,-0.0413412 0.08268,0 0.149861,0.0215319 0.06718,0.0206706 0.11455,0.0620118 0.04823,0.041341 0.07407,0.1033529 0.0267,0.062012 0.0267,0.1429716 0,0.067179 -0.01809,0.125746 -0.01809,0.057705 -0.05254,0.112827 -0.03445,0.055122 -0.08527,0.1102431 -0.04995,0.055122 -0.114549,0.1162721 l -0.163642,0.1558906 h 0.474562 v 0.1937868 z" />
+ <path
+ id="path168"
+ style="stroke-width:0.264583"
+ d="m 24.343394,1.7132152 q 0,0.090434 -0.0379,0.1610583 -0.0379,0.069763 -0.105076,0.1179946 -0.06718,0.048231 -0.158474,0.073208 -0.0913,0.024977 -0.198093,0.024977 -0.0267,0 -0.05685,-0.00172 -0.03014,-0.00172 -0.06115,-0.00431 -0.03101,-0.00258 -0.06029,-0.00689 -0.02928,-0.00345 -0.05426,-0.00775 V 1.8863313 q 0.04909,0.012058 0.112827,0.019809 0.06374,0.00689 0.130053,0.00689 0.129191,0 0.19637,-0.049093 0.06804,-0.049954 0.06804,-0.1378039 0,-0.091295 -0.06287,-0.1352201 -0.06287,-0.044786 -0.203261,-0.044786 H 23.631981 V 0.94754221 h 0.649401 V 1.1456353 h -0.45303 v 0.229099 h 0.08096 q 0.08613,0 0.164504,0.015503 0.07838,0.015503 0.137804,0.05426 0.06029,0.037896 0.0956,0.1033529 0.03617,0.065457 0.03617,0.1653647 z" />
+ </g>
+ <g
+ transform="translate(0.04335936,147.09955)"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:1.76389px;line-height:1.25;font-family:Consolas;-inkscape-font-specification:'Consolas, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ id="text966-0-3"
+ aria-label="50">
+ <path
+ id="path171"
+ style="stroke-width:0.264583"
+ d="m 48.371874,1.7132152 q 0,0.090434 -0.0379,0.1610583 -0.0379,0.069763 -0.105075,0.1179946 -0.06718,0.048231 -0.158475,0.073208 -0.0913,0.024977 -0.198093,0.024977 -0.0267,0 -0.05684,-0.00172 -0.03015,-0.00172 -0.06115,-0.00431 -0.03101,-0.00258 -0.06029,-0.00689 -0.02928,-0.00345 -0.05426,-0.00775 V 1.8863313 q 0.04909,0.012058 0.112827,0.019809 0.06373,0.00689 0.130052,0.00689 0.129191,0 0.196371,-0.049093 0.06804,-0.049954 0.06804,-0.1378039 0,-0.091295 -0.06287,-0.1352201 -0.06287,-0.044786 -0.203261,-0.044786 H 47.660462 V 0.94754221 h 0.6494 V 1.1456353 h -0.45303 v 0.229099 h 0.08096 q 0.08613,0 0.164503,0.015503 0.07838,0.015503 0.137804,0.05426 0.06029,0.037896 0.0956,0.1033529 0.03617,0.065457 0.03617,0.1653647 z" />
+ <path
+ id="path173"
+ style="stroke-width:0.264583"
+ d="m 49.401097,1.505648 q 0,0.1386652 -0.03014,0.2480471 -0.03014,0.1093818 -0.08871,0.185174 -0.0577,0.074931 -0.141249,0.1145495 -0.08354,0.039619 -0.191203,0.039619 -0.09302,0 -0.171393,-0.032728 -0.07838,-0.032729 -0.13522,-0.1024917 -0.05684,-0.070624 -0.08871,-0.1800063 -0.03187,-0.1093819 -0.03187,-0.2618275 0,-0.1386652 0.03015,-0.248047 0.03101,-0.1093819 0.08871,-0.1843127 0.0577,-0.075792 0.14211,-0.11541081 0.0844,-0.0396186 0.191203,-0.0396186 0.09302,0 0.171394,0.0327284 0.07838,0.0327284 0.134359,0.10249171 0.05684,0.069763 0.08871,0.179145 0.03187,0.1093819 0.03187,0.2626887 z m -0.666626,0.00345 q 0,0.017225 0,0.032728 0,0.014642 0.0017,0.030145 l 0.422047,-0.304896 q -0.03014,-0.085266 -0.0801,-0.125746 -0.04909,-0.041341 -0.116272,-0.041341 -0.04823,0 -0.08957,0.024977 -0.04134,0.024116 -0.07235,0.074931 -0.03015,0.050815 -0.04823,0.1274686 -0.01723,0.076653 -0.01723,0.1817289 z m 0.454753,0.00345 q 0,-0.014642 -8.62e-4,-0.029283 -8.61e-4,-0.015503 -8.61e-4,-0.029283 L 48.76806,1.7571402 q 0.02756,0.083544 0.07751,0.1240235 0.04995,0.04048 0.116272,0.04048 0.04823,0 0.08957,-0.024977 0.0422,-0.024977 0.07235,-0.074931 0.03101,-0.050815 0.04823,-0.1274686 0.01723,-0.077515 0.01723,-0.1817289 z" />
+ </g>
+ <g
+ transform="translate(0.04335936,147.09955)"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:1.76389px;line-height:1.25;font-family:Consolas;-inkscape-font-specification:'Consolas, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ id="text966-0-7"
+ aria-label="75">
+ <path
+ id="path176"
+ style="stroke-width:0.264583"
+ d="M 72.926595,2.0732279 H 72.688884 L 73.136746,1.150803 H 72.596727 V 0.94754221 h 0.782037 V 1.1309937 Z" />
+ <path
+ id="path178"
+ style="stroke-width:0.264583"
+ d="m 74.343392,1.7132152 q 0,0.090434 -0.0379,0.1610583 -0.0379,0.069763 -0.105076,0.1179946 -0.06718,0.048231 -0.158474,0.073208 -0.0913,0.024977 -0.198093,0.024977 -0.0267,0 -0.05684,-0.00172 -0.03014,-0.00172 -0.06115,-0.00431 -0.03101,-0.00258 -0.06029,-0.00689 -0.02928,-0.00345 -0.05426,-0.00775 V 1.8863313 q 0.04909,0.012058 0.112826,0.019809 0.06373,0.00689 0.130053,0.00689 0.129191,0 0.19637,-0.049093 0.06804,-0.049954 0.06804,-0.1378039 0,-0.091295 -0.06287,-0.1352201 -0.06287,-0.044786 -0.203261,-0.044786 H 73.631979 V 0.94754221 H 74.28138 V 1.1456353 h -0.45303 v 0.229099 h 0.08096 q 0.08613,0 0.164504,0.015503 0.07838,0.015503 0.137804,0.05426 0.06029,0.037896 0.0956,0.1033529 0.03617,0.065457 0.03617,0.1653647 z" />
+ </g>
+ <g
+ transform="translate(0.04335936,147.09955)"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:1.76389px;line-height:1.25;font-family:Consolas;-inkscape-font-specification:'Consolas, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ id="text966-0-5-1"
+ aria-label="150">
+ <path
+ id="path195"
+ style="stroke-width:0.264583"
+ d="M 146.47099,2.0732279 V 1.8863313 h 0.2868 V 1.1628608 l -0.24977,0.1378039 -0.0689,-0.1713936 0.35743,-0.18861909 h 0.17656 V 1.8863313 h 0.24719 v 0.1868966 z" />
+ <path
+ id="path197"
+ style="stroke-width:0.264583"
+ d="m 148.17803,1.7132152 q 0,0.090434 -0.0379,0.1610583 -0.0379,0.069763 -0.10508,0.1179946 -0.0672,0.048231 -0.15847,0.073208 -0.0913,0.024977 -0.1981,0.024977 -0.0267,0 -0.0568,-0.00172 -0.0301,-0.00172 -0.0611,-0.00431 -0.031,-0.00258 -0.0603,-0.00689 -0.0293,-0.00345 -0.0543,-0.00775 V 1.8863313 q 0.0491,0.012058 0.11283,0.019809 0.0637,0.00689 0.13005,0.00689 0.12919,0 0.19637,-0.049093 0.068,-0.049954 0.068,-0.1378039 0,-0.091295 -0.0629,-0.1352201 -0.0629,-0.044786 -0.20326,-0.044786 h -0.22049 V 0.94754221 h 0.6494 V 1.1456353 h -0.45303 v 0.229099 h 0.081 q 0.0861,0 0.1645,0.015503 0.0784,0.015503 0.13781,0.05426 0.0603,0.037896 0.0956,0.1033529 0.0362,0.065457 0.0362,0.1653647 z" />
+ <path
+ id="path199"
+ style="stroke-width:0.264583"
+ d="m 149.20726,1.505648 q 0,0.1386652 -0.0301,0.2480471 -0.0301,0.1093818 -0.0887,0.185174 -0.0577,0.074931 -0.14125,0.1145495 -0.0835,0.039619 -0.1912,0.039619 -0.093,0 -0.1714,-0.032728 -0.0784,-0.032729 -0.13522,-0.1024917 -0.0568,-0.070624 -0.0887,-0.1800063 -0.0319,-0.1093819 -0.0319,-0.2618275 0,-0.1386652 0.0301,-0.248047 0.031,-0.1093819 0.0887,-0.1843127 0.0577,-0.075792 0.14211,-0.11541081 0.0844,-0.0396186 0.1912,-0.0396186 0.093,0 0.1714,0.0327284 0.0784,0.0327284 0.13436,0.10249171 0.0568,0.069763 0.0887,0.179145 0.0319,0.1093819 0.0319,0.2626879 z m -0.66663,0.00345 q 0,0.017225 0,0.032728 0,0.014642 0.002,0.030145 l 0.42203,-0.3048912 q -0.0301,-0.085266 -0.0801,-0.125746 -0.0491,-0.041341 -0.11627,-0.041341 -0.0482,0 -0.0896,0.024977 -0.0413,0.024116 -0.0723,0.074931 -0.0301,0.050815 -0.0482,0.1274686 -0.0172,0.076653 -0.0172,0.1817289 z m 0.45475,0.00345 q 0,-0.014642 -8.6e-4,-0.029283 -8.6e-4,-0.015503 -8.6e-4,-0.029283 l -0.41944,0.3031686 q 0.0276,0.083544 0.0775,0.1240235 0.05,0.04048 0.11628,0.04048 0.0482,0 0.0896,-0.024977 0.0422,-0.024977 0.0723,-0.074931 0.031,-0.050815 0.0482,-0.1274686 0.0172,-0.077515 0.0172,-0.1817289 z" />
+ </g>
+ <path
+ sodipodi:nodetypes="cc"
+ style="display:inline;fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="M 150,70 0.52917,70.01764"
+ id="path2685-4-7-5" />
+ <path
+ sodipodi:nodetypes="cc"
+ style="display:inline;fill:none;stroke:#fdfdfd;stroke-width:0.25;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:0.499999, 0.25;stroke-dashoffset:0;stroke-opacity:1"
+ d="m 140,135 h 10"
+ id="path2683-0-5-5" />
+ <g
+ style="font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:8.81944px;line-height:1.25;font-family:'Bauhaus 93';-inkscape-font-specification:'Bauhaus 93, Normal';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;display:inline;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ id="text893"
+ aria-label="ENDER 2">
+ <g
+ id="g220" />
+ </g>
+ <g
+ aria-label="125"
+ id="text966-0-4-0"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:1.76389px;line-height:1.25;font-family:Consolas;-inkscape-font-specification:'Consolas, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ transform="translate(-120.58115,24.81636)">
+ <path
+ d="M 121.63635,2.0732279 V 1.8863313 h 0.2868 V 1.1628608 l -0.24977,0.1378039 -0.0689,-0.1713936 0.35743,-0.18861909 h 0.17656 V 1.8863313 h 0.24718 v 0.1868966 z"
+ id="path188-1" />
+ <path
+ d="M 122.58805,2.0732279 V 1.9181985 l 0.26614,-0.2661338 q 0.0749,-0.074931 0.11972,-0.1291912 0.0456,-0.05426 0.0698,-0.096463 0.025,-0.043064 0.0327,-0.079237 0.008,-0.036174 0.008,-0.074931 0,-0.031867 -0.0103,-0.060289 -0.0103,-0.029283 -0.0301,-0.049954 -0.0198,-0.021532 -0.05,-0.03359 -0.0301,-0.012919 -0.0689,-0.012919 -0.0663,0 -0.12316,0.029283 -0.0568,0.028422 -0.10766,0.076654 l -0.1111,-0.1429716 q 0.0732,-0.068041 0.1645,-0.10852056 0.0922,-0.0413412 0.19895,-0.0413412 0.0827,0 0.14987,0.0215319 0.0672,0.0206706 0.11455,0.0620118 0.0482,0.041341 0.0741,0.1033529 0.0267,0.062012 0.0267,0.1429716 0,0.067179 -0.0181,0.125746 -0.0181,0.057705 -0.0525,0.112827 -0.0344,0.055122 -0.0853,0.1102431 -0.0499,0.055122 -0.11455,0.1162721 l -0.16364,0.1558906 h 0.47456 v 0.1937868 z"
+ id="path190-2" />
+ <path
+ d="m 124.31491,1.7132152 q 0,0.090434 -0.0379,0.1610583 -0.0379,0.069763 -0.10507,0.1179946 -0.0672,0.048231 -0.15848,0.073208 -0.0913,0.024977 -0.19809,0.024977 -0.0267,0 -0.0568,-0.00172 -0.0301,-0.00172 -0.0611,-0.00431 -0.031,-0.00258 -0.0603,-0.00689 -0.0293,-0.00345 -0.0543,-0.00775 V 1.8863313 q 0.0491,0.012058 0.11282,0.019809 0.0637,0.00689 0.13006,0.00689 0.12919,0 0.19637,-0.049093 0.068,-0.049954 0.068,-0.1378039 0,-0.091295 -0.0629,-0.1352201 -0.0629,-0.044786 -0.20326,-0.044786 H 123.6035 V 0.94754221 h 0.6494 V 1.1456353 h -0.45303 v 0.229099 h 0.081 q 0.0861,0 0.1645,0.015503 0.0784,0.015503 0.1378,0.05426 0.0603,0.037896 0.0956,0.1033529 0.0362,0.065457 0.0362,0.1653647 z"
+ id="path192-3" />
+ </g>
+ <g
+ aria-label="100"
+ id="text966-0-9-0"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:1.76389px;line-height:1.25;font-family:Consolas;-inkscape-font-specification:'Consolas, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ transform="translate(-95.765044,49.636453)">
+ <path
+ d="M 96.636346,2.0732279 V 1.8863313 H 96.92315 V 1.1628608 l -0.249769,0.1378039 -0.0689,-0.1713936 0.357429,-0.18861909 h 0.176561 V 1.8863313 h 0.247186 v 0.1868966 z"
+ id="path181-5" />
+ <path
+ d="m 98.401097,1.505648 q 0,0.1386652 -0.03014,0.2480471 -0.03015,0.1093818 -0.08871,0.185174 -0.0577,0.074931 -0.141249,0.1145495 -0.08354,0.039619 -0.191203,0.039619 -0.09302,0 -0.171393,-0.032728 -0.07838,-0.032729 -0.13522,-0.1024917 -0.05684,-0.070624 -0.08871,-0.1800063 -0.03187,-0.1093819 -0.03187,-0.2618275 0,-0.1386652 0.03014,-0.248047 0.03101,-0.1093819 0.08871,-0.1843127 0.0577,-0.075792 0.14211,-0.11541081 0.08441,-0.0396186 0.191203,-0.0396186 0.09302,0 0.171394,0.0327284 0.07838,0.0327284 0.134359,0.10249171 0.05684,0.069763 0.08871,0.179145 0.03187,0.1093819 0.03187,0.2626887 z m -0.666626,0.00345 q 0,0.017225 0,0.032728 0,0.014642 0.0017,0.030145 l 0.422047,-0.304896 q -0.03015,-0.085266 -0.0801,-0.125746 -0.04909,-0.041341 -0.116272,-0.041341 -0.04823,0 -0.08957,0.024977 -0.04134,0.024116 -0.07235,0.074931 -0.03014,0.050815 -0.04823,0.1274686 -0.01722,0.076653 -0.01722,0.1817289 z m 0.454753,0.00345 q 0,-0.014642 -8.62e-4,-0.029283 -8.61e-4,-0.015503 -8.61e-4,-0.029283 L 97.76806,1.7571402 q 0.02756,0.083544 0.07751,0.1240235 0.04995,0.04048 0.116272,0.04048 0.04823,0 0.08957,-0.024977 0.0422,-0.024977 0.07235,-0.074931 0.03101,-0.050815 0.04823,-0.1274686 0.01723,-0.077515 0.01723,-0.1817289 z"
+ id="path183-5" />
+ <path
+ d="m 99.372615,1.505648 q 0,0.1386652 -0.03014,0.2480471 -0.03014,0.1093818 -0.08871,0.185174 -0.05771,0.074931 -0.141249,0.1145495 -0.08354,0.039619 -0.191203,0.039619 -0.09302,0 -0.171394,-0.032728 -0.07838,-0.032729 -0.13522,-0.1024917 -0.05684,-0.070624 -0.08871,-0.1800063 -0.03187,-0.1093819 -0.03187,-0.2618275 0,-0.1386652 0.03014,-0.248047 0.03101,-0.1093819 0.08871,-0.1843127 0.0577,-0.075792 0.14211,-0.11541081 0.0844,-0.0396186 0.191203,-0.0396186 0.09302,0 0.171393,0.0327284 0.07838,0.0327284 0.134359,0.10249171 0.05684,0.069763 0.08871,0.179145 0.03187,0.1093819 0.03187,0.2626887 z m -0.666627,0.00345 q 0,0.017225 0,0.032728 0,0.014642 0.0017,0.030145 l 0.422047,-0.304896 q -0.03014,-0.085266 -0.0801,-0.125746 -0.04909,-0.041341 -0.116272,-0.041341 -0.04823,0 -0.08957,0.024977 -0.04134,0.024116 -0.07235,0.074931 -0.03014,0.050815 -0.04823,0.1274686 -0.01723,0.076653 -0.01723,0.1817289 z m 0.454753,0.00345 q 0,-0.014642 -8.61e-4,-0.029283 -8.61e-4,-0.015503 -8.61e-4,-0.029283 l -0.419441,0.3031686 q 0.02756,0.083544 0.07752,0.1240235 0.04995,0.04048 0.116272,0.04048 0.04823,0 0.08957,-0.024977 0.0422,-0.024977 0.07235,-0.074931 0.03101,-0.050815 0.04823,-0.1274686 0.01722,-0.077515 0.01722,-0.1817289 z"
+ id="path185-2" />
+ </g>
+ <g
+ aria-label="25"
+ id="text966-0-99-1"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:1.76389px;line-height:1.25;font-family:Consolas;-inkscape-font-specification:'Consolas, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ transform="translate(-21.665685,124.65487)">
+ <path
+ d="M 22.616538,2.0732279 V 1.9181985 l 0.266134,-0.2661338 q 0.07493,-0.074931 0.119717,-0.1291912 0.04565,-0.05426 0.06976,-0.096463 0.02498,-0.043064 0.03273,-0.079237 0.0078,-0.036174 0.0078,-0.074931 0,-0.031867 -0.01034,-0.060289 -0.01034,-0.029283 -0.03014,-0.049954 -0.01981,-0.021532 -0.04995,-0.03359 -0.03015,-0.012919 -0.0689,-0.012919 -0.06632,0 -0.123163,0.029283 -0.05684,0.028422 -0.107659,0.076654 L 22.611371,1.0784559 q 0.07321,-0.068041 0.164503,-0.10852056 0.09216,-0.0413412 0.198955,-0.0413412 0.08268,0 0.149861,0.0215319 0.06718,0.0206706 0.11455,0.0620118 0.04823,0.041341 0.07407,0.1033529 0.0267,0.062012 0.0267,0.1429716 0,0.067179 -0.01809,0.125746 -0.01809,0.057705 -0.05254,0.112827 -0.03445,0.055122 -0.08527,0.1102431 -0.04995,0.055122 -0.114549,0.1162721 l -0.163642,0.1558906 h 0.474562 v 0.1937868 z"
+ style="stroke-width:0.264583"
+ id="path166-8" />
+ <path
+ d="m 24.343394,1.7132152 q 0,0.090434 -0.0379,0.1610583 -0.0379,0.069763 -0.105076,0.1179946 -0.06718,0.048231 -0.158474,0.073208 -0.0913,0.024977 -0.198093,0.024977 -0.0267,0 -0.05685,-0.00172 -0.03014,-0.00172 -0.06115,-0.00431 -0.03101,-0.00258 -0.06029,-0.00689 -0.02928,-0.00345 -0.05426,-0.00775 V 1.8863313 q 0.04909,0.012058 0.112827,0.019809 0.06374,0.00689 0.130053,0.00689 0.129191,0 0.19637,-0.049093 0.06804,-0.049954 0.06804,-0.1378039 0,-0.091295 -0.06287,-0.1352201 -0.06287,-0.044786 -0.203261,-0.044786 H 23.631981 V 0.94754221 h 0.649401 V 1.1456353 h -0.45303 v 0.229099 h 0.08096 q 0.08613,0 0.164504,0.015503 0.07838,0.015503 0.137804,0.05426 0.06029,0.037896 0.0956,0.1033529 0.03617,0.065457 0.03617,0.1653647 z"
+ style="stroke-width:0.264583"
+ id="path168-6" />
+ </g>
+ <g
+ aria-label="50"
+ id="text966-0-3-4"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:1.76389px;line-height:1.25;font-family:Consolas;-inkscape-font-specification:'Consolas, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ transform="translate(-46.758479,99.60519)">
+ <path
+ d="m 48.371874,1.7132152 q 0,0.090434 -0.0379,0.1610583 -0.0379,0.069763 -0.105075,0.1179946 -0.06718,0.048231 -0.158475,0.073208 -0.0913,0.024977 -0.198093,0.024977 -0.0267,0 -0.05684,-0.00172 -0.03015,-0.00172 -0.06115,-0.00431 -0.03101,-0.00258 -0.06029,-0.00689 -0.02928,-0.00345 -0.05426,-0.00775 V 1.8863313 q 0.04909,0.012058 0.112827,0.019809 0.06373,0.00689 0.130052,0.00689 0.129191,0 0.196371,-0.049093 0.06804,-0.049954 0.06804,-0.1378039 0,-0.091295 -0.06287,-0.1352201 -0.06287,-0.044786 -0.203261,-0.044786 H 47.660462 V 0.94754221 h 0.6494 V 1.1456353 h -0.45303 v 0.229099 h 0.08096 q 0.08613,0 0.164503,0.015503 0.07838,0.015503 0.137804,0.05426 0.06029,0.037896 0.0956,0.1033529 0.03617,0.065457 0.03617,0.1653647 z"
+ style="stroke-width:0.264583"
+ id="path171-2" />
+ <path
+ d="m 49.401097,1.505648 q 0,0.1386652 -0.03014,0.2480471 -0.03014,0.1093818 -0.08871,0.185174 -0.0577,0.074931 -0.141249,0.1145495 -0.08354,0.039619 -0.191203,0.039619 -0.09302,0 -0.171393,-0.032728 -0.07838,-0.032729 -0.13522,-0.1024917 -0.05684,-0.070624 -0.08871,-0.1800063 -0.03187,-0.1093819 -0.03187,-0.2618275 0,-0.1386652 0.03015,-0.248047 0.03101,-0.1093819 0.08871,-0.1843127 0.0577,-0.075792 0.14211,-0.11541081 0.0844,-0.0396186 0.191203,-0.0396186 0.09302,0 0.171394,0.0327284 0.07838,0.0327284 0.134359,0.10249171 0.05684,0.069763 0.08871,0.179145 0.03187,0.1093819 0.03187,0.2626887 z m -0.666626,0.00345 q 0,0.017225 0,0.032728 0,0.014642 0.0017,0.030145 l 0.422047,-0.304896 q -0.03014,-0.085266 -0.0801,-0.125746 -0.04909,-0.041341 -0.116272,-0.041341 -0.04823,0 -0.08957,0.024977 -0.04134,0.024116 -0.07235,0.074931 -0.03015,0.050815 -0.04823,0.1274686 -0.01723,0.076653 -0.01723,0.1817289 z m 0.454753,0.00345 q 0,-0.014642 -8.62e-4,-0.029283 -8.61e-4,-0.015503 -8.61e-4,-0.029283 L 48.76806,1.7571402 q 0.02756,0.083544 0.07751,0.1240235 0.04995,0.04048 0.116272,0.04048 0.04823,0 0.08957,-0.024977 0.0422,-0.024977 0.07235,-0.074931 0.03101,-0.050815 0.04823,-0.1274686 0.01723,-0.077515 0.01723,-0.1817289 z"
+ style="stroke-width:0.264583"
+ id="path173-7" />
+ </g>
+ <g
+ aria-label="75"
+ id="text966-0-7-6"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:1.76389px;line-height:1.25;font-family:Consolas;-inkscape-font-specification:'Consolas, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ transform="translate(-71.57512,75.04448)">
+ <path
+ d="M 72.926595,2.0732279 H 72.688884 L 73.136746,1.150803 H 72.596727 V 0.94754221 h 0.782037 V 1.1309937 Z"
+ style="stroke-width:0.264583"
+ id="path176-3" />
+ <path
+ d="m 74.343392,1.7132152 q 0,0.090434 -0.0379,0.1610583 -0.0379,0.069763 -0.105076,0.1179946 -0.06718,0.048231 -0.158474,0.073208 -0.0913,0.024977 -0.198093,0.024977 -0.0267,0 -0.05684,-0.00172 -0.03014,-0.00172 -0.06115,-0.00431 -0.03101,-0.00258 -0.06029,-0.00689 -0.02928,-0.00345 -0.05426,-0.00775 V 1.8863313 q 0.04909,0.012058 0.112826,0.019809 0.06373,0.00689 0.130053,0.00689 0.129191,0 0.19637,-0.049093 0.06804,-0.049954 0.06804,-0.1378039 0,-0.091295 -0.06287,-0.1352201 -0.06287,-0.044786 -0.203261,-0.044786 H 73.631979 V 0.94754221 H 74.28138 V 1.1456353 h -0.45303 v 0.229099 h 0.08096 q 0.08613,0 0.164504,0.015503 0.07838,0.015503 0.137804,0.05426 0.06029,0.037896 0.0956,0.1033529 0.03617,0.065457 0.03617,0.1653647 z"
+ style="stroke-width:0.264583"
+ id="path178-3" />
+ </g>
+ <g
+ aria-label="150"
+ id="text966-0-5-1-6"
+ style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:1.76389px;line-height:1.25;font-family:Consolas;-inkscape-font-specification:'Consolas, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-east-asian:normal;display:inline;fill:#ffffff;fill-opacity:1;stroke:none;stroke-width:0.264583"
+ transform="translate(-145.49952,-0.01156767)">
+ <path
+ d="M 146.47099,2.0732279 V 1.8863313 h 0.2868 V 1.1628608 l -0.24977,0.1378039 -0.0689,-0.1713936 0.35743,-0.18861909 h 0.17656 V 1.8863313 h 0.24719 v 0.1868966 z"
+ style="stroke-width:0.264583"
+ id="path195-7" />
+ <path
+ d="m 148.17803,1.7132152 q 0,0.090434 -0.0379,0.1610583 -0.0379,0.069763 -0.10508,0.1179946 -0.0672,0.048231 -0.15847,0.073208 -0.0913,0.024977 -0.1981,0.024977 -0.0267,0 -0.0568,-0.00172 -0.0301,-0.00172 -0.0611,-0.00431 -0.031,-0.00258 -0.0603,-0.00689 -0.0293,-0.00345 -0.0543,-0.00775 V 1.8863313 q 0.0491,0.012058 0.11283,0.019809 0.0637,0.00689 0.13005,0.00689 0.12919,0 0.19637,-0.049093 0.068,-0.049954 0.068,-0.1378039 0,-0.091295 -0.0629,-0.1352201 -0.0629,-0.044786 -0.20326,-0.044786 h -0.22049 V 0.94754221 h 0.6494 V 1.1456353 h -0.45303 v 0.229099 h 0.081 q 0.0861,0 0.1645,0.015503 0.0784,0.015503 0.13781,0.05426 0.0603,0.037896 0.0956,0.1033529 0.0362,0.065457 0.0362,0.1653647 z"
+ style="stroke-width:0.264583"
+ id="path197-7" />
+ <path
+ d="m 149.20726,1.505648 q 0,0.1386652 -0.0301,0.2480471 -0.0301,0.1093818 -0.0887,0.185174 -0.0577,0.074931 -0.14125,0.1145495 -0.0835,0.039619 -0.1912,0.039619 -0.093,0 -0.1714,-0.032728 -0.0784,-0.032729 -0.13522,-0.1024917 -0.0568,-0.070624 -0.0887,-0.1800063 -0.0319,-0.1093819 -0.0319,-0.2618275 0,-0.1386652 0.0301,-0.248047 0.031,-0.1093819 0.0887,-0.1843127 0.0577,-0.075792 0.14211,-0.11541081 0.0844,-0.0396186 0.1912,-0.0396186 0.093,0 0.1714,0.0327284 0.0784,0.0327284 0.13436,0.10249171 0.0568,0.069763 0.0887,0.179145 0.0319,0.1093819 0.0319,0.2626879 z m -0.66663,0.00345 q 0,0.017225 0,0.032728 0,0.014642 0.002,0.030145 l 0.42203,-0.3048912 q -0.0301,-0.085266 -0.0801,-0.125746 -0.0491,-0.041341 -0.11627,-0.041341 -0.0482,0 -0.0896,0.024977 -0.0413,0.024116 -0.0723,0.074931 -0.0301,0.050815 -0.0482,0.1274686 -0.0172,0.076653 -0.0172,0.1817289 z m 0.45475,0.00345 q 0,-0.014642 -8.6e-4,-0.029283 -8.6e-4,-0.015503 -8.6e-4,-0.029283 l -0.41944,0.3031686 q 0.0276,0.083544 0.0775,0.1240235 0.05,0.04048 0.11628,0.04048 0.0482,0 0.0896,-0.024977 0.0422,-0.024977 0.0723,-0.074931 0.031,-0.050815 0.0482,-0.1274686 0.0172,-0.077515 0.0172,-0.1817289 z"
+ style="stroke-width:0.264583"
+ id="path199-0" />
+ </g>
+ </g>
+</svg>
diff --git a/resources/profiles/Creality/ender2_bed.stl b/resources/profiles/Creality/ender2_bed.stl
new file mode 100644
index 000000000..b2a419fab
--- /dev/null
+++ b/resources/profiles/Creality/ender2_bed.stl
@@ -0,0 +1,2774 @@
+solid OpenSCAD_Model
+ facet normal 0 0 -1
+ outer loop
+ vertex 79.6047 -82.4982 -3
+ vertex 79.5018 -82.4982 -3
+ vertex 79.8136 -82.4836 -3
+ endloop
+ endfacet
+ facet normal -0 0 -1
+ outer loop
+ vertex 79.8136 -82.4836 -3
+ vertex 79.5018 -82.4982 -3
+ vertex 80.0209 -82.4544 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex 82.5 79.5 -3
+ vertex 79.5018 82.4982 -3
+ vertex 82.4927 79.7093 -3
+ endloop
+ endfacet
+ facet normal -0 0 -1
+ outer loop
+ vertex 80.0209 -82.4544 -3
+ vertex 79.5018 -82.4982 -3
+ vertex 80.2258 -82.4109 -3
+ endloop
+ endfacet
+ facet normal -0 0 -1
+ outer loop
+ vertex 80.2258 -82.4109 -3
+ vertex 79.5018 -82.4982 -3
+ vertex 80.427 -82.3532 -3
+ endloop
+ endfacet
+ facet normal -0 0 -1
+ outer loop
+ vertex 80.427 -82.3532 -3
+ vertex 79.5018 -82.4982 -3
+ vertex 80.6238 -82.2815 -3
+ endloop
+ endfacet
+ facet normal -0 0 -1
+ outer loop
+ vertex 80.6238 -82.2815 -3
+ vertex 79.5018 -82.4982 -3
+ vertex 80.8151 -82.1964 -3
+ endloop
+ endfacet
+ facet normal -0 0 -1
+ outer loop
+ vertex 80.8151 -82.1964 -3
+ vertex 79.5018 -82.4982 -3
+ vertex 81 -82.0981 -3
+ endloop
+ endfacet
+ facet normal -0 0 -1
+ outer loop
+ vertex 81 -82.0981 -3
+ vertex 79.5018 -82.4982 -3
+ vertex 81.1776 -81.9871 -3
+ endloop
+ endfacet
+ facet normal -0 0 -1
+ outer loop
+ vertex 81.1776 -81.9871 -3
+ vertex 79.5018 -82.4982 -3
+ vertex 81.347 -81.864 -3
+ endloop
+ endfacet
+ facet normal -0 0 -1
+ outer loop
+ vertex 81.347 -81.864 -3
+ vertex 79.5018 -82.4982 -3
+ vertex 81.5074 -81.7294 -3
+ endloop
+ endfacet
+ facet normal -0 0 -1
+ outer loop
+ vertex 81.5074 -81.7294 -3
+ vertex 79.5018 -82.4982 -3
+ vertex 81.658 -81.584 -3
+ endloop
+ endfacet
+ facet normal -0 0 -1
+ outer loop
+ vertex 81.658 -81.584 -3
+ vertex 79.5018 -82.4982 -3
+ vertex 81.7981 -81.4284 -3
+ endloop
+ endfacet
+ facet normal -0 0 -1
+ outer loop
+ vertex 81.7981 -81.4284 -3
+ vertex 79.5018 -82.4982 -3
+ vertex 81.927 -81.2634 -3
+ endloop
+ endfacet
+ facet normal -0 0 -1
+ outer loop
+ vertex 81.927 -81.2634 -3
+ vertex 79.5018 -82.4982 -3
+ vertex 82.0441 -81.0898 -3
+ endloop
+ endfacet
+ facet normal -0 0 -1
+ outer loop
+ vertex 82.0441 -81.0898 -3
+ vertex 79.5018 -82.4982 -3
+ vertex 82.1488 -80.9084 -3
+ endloop
+ endfacet
+ facet normal -0 0 -1
+ outer loop
+ vertex 82.1488 -80.9084 -3
+ vertex 79.5018 -82.4982 -3
+ vertex 82.2406 -80.7202 -3
+ endloop
+ endfacet
+ facet normal -0 0 -1
+ outer loop
+ vertex 82.2406 -80.7202 -3
+ vertex 79.5018 -82.4982 -3
+ vertex 82.3191 -80.526 -3
+ endloop
+ endfacet
+ facet normal -0 0 -1
+ outer loop
+ vertex 82.3191 -80.526 -3
+ vertex 79.5018 -82.4982 -3
+ vertex 82.3838 -80.3269 -3
+ endloop
+ endfacet
+ facet normal -0 0 -1
+ outer loop
+ vertex 82.3838 -80.3269 -3
+ vertex 79.5018 -82.4982 -3
+ vertex 82.4344 -80.1237 -3
+ endloop
+ endfacet
+ facet normal -0 0 -1
+ outer loop
+ vertex 82.4344 -80.1237 -3
+ vertex 79.5018 -82.4982 -3
+ vertex 82.4708 -79.9175 -3
+ endloop
+ endfacet
+ facet normal -0 0 -1
+ outer loop
+ vertex 82.4708 -79.9175 -3
+ vertex 79.5018 -82.4982 -3
+ vertex 82.4927 -79.7093 -3
+ endloop
+ endfacet
+ facet normal -0 0 -1
+ outer loop
+ vertex 82.4927 -79.7093 -3
+ vertex 79.5018 -82.4982 -3
+ vertex 82.5 -79.5 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex 82.5 -79.5 -3
+ vertex 79.5018 82.4982 -3
+ vertex 82.5 79.5 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex 79.5018 82.4982 -3
+ vertex 82.4708 79.9175 -3
+ vertex 82.4927 79.7093 -3
+ endloop
+ endfacet
+ facet normal -0 -0 -1
+ outer loop
+ vertex 82.3838 80.3269 -3
+ vertex 82.4344 80.1237 -3
+ vertex 79.5018 82.4982 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex 82.2406 80.7202 -3
+ vertex 79.5018 82.4982 -3
+ vertex 82.1488 80.9084 -3
+ endloop
+ endfacet
+ facet normal -0 -0 -1
+ outer loop
+ vertex 82.2406 80.7202 -3
+ vertex 82.3191 80.526 -3
+ vertex 79.5018 82.4982 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex 79.5018 82.4982 -3
+ vertex 81.5074 81.7294 -3
+ vertex 81.658 81.584 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex 81.927 81.2634 -3
+ vertex 79.5018 82.4982 -3
+ vertex 81.7981 81.4284 -3
+ endloop
+ endfacet
+ facet normal -0 -0 -1
+ outer loop
+ vertex 81.927 81.2634 -3
+ vertex 82.0441 81.0898 -3
+ vertex 79.5018 82.4982 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex 81.7981 81.4284 -3
+ vertex 79.5018 82.4982 -3
+ vertex 81.658 81.584 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex 79.5018 82.4982 -3
+ vertex 80.427 82.3532 -3
+ vertex 80.6238 82.2815 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex 81.347 81.864 -3
+ vertex 79.5018 82.4982 -3
+ vertex 81.1776 81.9871 -3
+ endloop
+ endfacet
+ facet normal -0 -0 -1
+ outer loop
+ vertex 81.347 81.864 -3
+ vertex 81.5074 81.7294 -3
+ vertex 79.5018 82.4982 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex 81.1776 81.9871 -3
+ vertex 79.5018 82.4982 -3
+ vertex 81 82.0981 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex 81 82.0981 -3
+ vertex 79.5018 82.4982 -3
+ vertex 80.8151 82.1964 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex 80.8151 82.1964 -3
+ vertex 79.5018 82.4982 -3
+ vertex 80.6238 82.2815 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex 82.1488 80.9084 -3
+ vertex 79.5018 82.4982 -3
+ vertex 82.0441 81.0898 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex 80.2258 82.4109 -3
+ vertex 79.5018 82.4982 -3
+ vertex 80.0209 82.4544 -3
+ endloop
+ endfacet
+ facet normal -0 -0 -1
+ outer loop
+ vertex 80.2258 82.4109 -3
+ vertex 80.427 82.3532 -3
+ vertex 79.5018 82.4982 -3
+ endloop
+ endfacet
+ facet normal -0 -0 -1
+ outer loop
+ vertex 82.3191 80.526 -3
+ vertex 82.3838 80.3269 -3
+ vertex 79.5018 82.4982 -3
+ endloop
+ endfacet
+ facet normal -0 -0 -1
+ outer loop
+ vertex 79.8136 82.4836 -3
+ vertex 80.0209 82.4544 -3
+ vertex 79.5018 82.4982 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex 79.5018 82.4982 -3
+ vertex 82.4344 80.1237 -3
+ vertex 82.4708 79.9175 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex 79.5018 82.4982 -3
+ vertex 79.6047 82.4982 -3
+ vertex 79.8136 82.4836 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex 79.5018 -82.4982 -3
+ vertex 79.5018 82.4982 -3
+ vertex 82.5 -79.5 -3
+ endloop
+ endfacet
+ facet normal 0 -0 -1
+ outer loop
+ vertex -79.5 82.5 -3
+ vertex 79.5 82.5 -3
+ vertex -79.5018 82.4982 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex 79.5 82.5 -3
+ vertex 79.5018 82.4982 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex 79.5018 -82.4982 -3
+ vertex -79.5018 82.4982 -3
+ vertex 79.5018 82.4982 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -82.5 -79.5 -3
+ vertex -82.5 79.5 -3
+ vertex -79.5018 -82.4982 -3
+ endloop
+ endfacet
+ facet normal -0 0 -1
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex -79.8136 82.4836 -3
+ vertex -79.6047 82.4982 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex -80.0209 82.4544 -3
+ vertex -79.8136 82.4836 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex -80.2258 82.4109 -3
+ vertex -80.0209 82.4544 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex -80.427 82.3532 -3
+ vertex -80.2258 82.4109 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex -80.6238 82.2815 -3
+ vertex -80.427 82.3532 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex -80.8151 82.1964 -3
+ vertex -80.6238 82.2815 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex -81 82.0981 -3
+ vertex -80.8151 82.1964 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex -81.1776 81.9871 -3
+ vertex -81 82.0981 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex -81.347 81.864 -3
+ vertex -81.1776 81.9871 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex -81.5074 81.7294 -3
+ vertex -81.347 81.864 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex -81.658 81.584 -3
+ vertex -81.5074 81.7294 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex -81.7981 81.4284 -3
+ vertex -81.658 81.584 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex -81.927 81.2634 -3
+ vertex -81.7981 81.4284 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex -82.0441 81.0898 -3
+ vertex -81.927 81.2634 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex -82.1488 80.9084 -3
+ vertex -82.0441 81.0898 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex -82.2406 80.7202 -3
+ vertex -82.1488 80.9084 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex -82.3191 80.526 -3
+ vertex -82.2406 80.7202 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex -82.3838 80.3269 -3
+ vertex -82.3191 80.526 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex -82.4344 80.1237 -3
+ vertex -82.3838 80.3269 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex -82.4708 79.9175 -3
+ vertex -82.4344 80.1237 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex -82.4927 79.7093 -3
+ vertex -82.4708 79.9175 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex -82.5 79.5 -3
+ vertex -82.4927 79.7093 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 -82.4982 -3
+ vertex -82.5 79.5 -3
+ vertex -79.5018 82.4982 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 -82.4982 -3
+ vertex -82.4708 -79.9175 -3
+ vertex -82.4927 -79.7093 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -82.3838 -80.3269 -3
+ vertex -82.4344 -80.1237 -3
+ vertex -79.5018 -82.4982 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -82.2406 -80.7202 -3
+ vertex -79.5018 -82.4982 -3
+ vertex -82.1488 -80.9084 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -82.2406 -80.7202 -3
+ vertex -82.3191 -80.526 -3
+ vertex -79.5018 -82.4982 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 -82.4982 -3
+ vertex -81.5074 -81.7294 -3
+ vertex -81.658 -81.584 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -81.927 -81.2634 -3
+ vertex -79.5018 -82.4982 -3
+ vertex -81.7981 -81.4284 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -81.927 -81.2634 -3
+ vertex -82.0441 -81.0898 -3
+ vertex -79.5018 -82.4982 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -81.7981 -81.4284 -3
+ vertex -79.5018 -82.4982 -3
+ vertex -81.658 -81.584 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 -82.4982 -3
+ vertex -80.427 -82.3532 -3
+ vertex -80.6238 -82.2815 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -81.347 -81.864 -3
+ vertex -79.5018 -82.4982 -3
+ vertex -81.1776 -81.9871 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -81.347 -81.864 -3
+ vertex -81.5074 -81.7294 -3
+ vertex -79.5018 -82.4982 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -81.1776 -81.9871 -3
+ vertex -79.5018 -82.4982 -3
+ vertex -81 -82.0981 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -81 -82.0981 -3
+ vertex -79.5018 -82.4982 -3
+ vertex -80.8151 -82.1964 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -80.8151 -82.1964 -3
+ vertex -79.5018 -82.4982 -3
+ vertex -80.6238 -82.2815 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -82.1488 -80.9084 -3
+ vertex -79.5018 -82.4982 -3
+ vertex -82.0441 -81.0898 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -80.2258 -82.4109 -3
+ vertex -79.5018 -82.4982 -3
+ vertex -80.0209 -82.4544 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -80.2258 -82.4109 -3
+ vertex -80.427 -82.3532 -3
+ vertex -79.5018 -82.4982 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -82.3191 -80.526 -3
+ vertex -82.3838 -80.3269 -3
+ vertex -79.5018 -82.4982 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.8136 -82.4836 -3
+ vertex -80.0209 -82.4544 -3
+ vertex -79.5018 -82.4982 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 -82.4982 -3
+ vertex -82.4344 -80.1237 -3
+ vertex -82.4708 -79.9175 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 -82.4982 -3
+ vertex -79.6047 -82.4982 -3
+ vertex -79.8136 -82.4836 -3
+ endloop
+ endfacet
+ facet normal -0 0 -1
+ outer loop
+ vertex 79.5018 -82.4982 -3
+ vertex 79.5 -82.5 -3
+ vertex -79.5018 -82.4982 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 -82.4982 -3
+ vertex 79.5 -82.5 -3
+ vertex -79.5 -82.5 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex 79.5018 -82.4982 -3
+ vertex -79.5018 -82.4982 -3
+ vertex -79.5018 82.4982 -3
+ endloop
+ endfacet
+ facet normal 0 0 -1
+ outer loop
+ vertex -79.5018 -82.4982 -3
+ vertex -82.4927 -79.7093 -3
+ vertex -82.5 -79.5 -3
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 79.8136 -82.4836 0
+ vertex 79.5018 -82.4982 0
+ vertex 79.6047 -82.4982 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 80.0209 -82.4544 0
+ vertex 79.5018 -82.4982 0
+ vertex 79.8136 -82.4836 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 82.4927 79.7093 0
+ vertex 79.5018 82.4982 0
+ vertex 82.5 79.5 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 80.2258 -82.4109 0
+ vertex 79.5018 -82.4982 0
+ vertex 80.0209 -82.4544 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 80.427 -82.3532 0
+ vertex 79.5018 -82.4982 0
+ vertex 80.2258 -82.4109 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 80.6238 -82.2815 0
+ vertex 79.5018 -82.4982 0
+ vertex 80.427 -82.3532 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 80.8151 -82.1964 0
+ vertex 79.5018 -82.4982 0
+ vertex 80.6238 -82.2815 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 81 -82.0981 0
+ vertex 79.5018 -82.4982 0
+ vertex 80.8151 -82.1964 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 81.1776 -81.9871 0
+ vertex 79.5018 -82.4982 0
+ vertex 81 -82.0981 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 81.347 -81.864 0
+ vertex 79.5018 -82.4982 0
+ vertex 81.1776 -81.9871 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 81.5074 -81.7294 0
+ vertex 79.5018 -82.4982 0
+ vertex 81.347 -81.864 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 81.658 -81.584 0
+ vertex 79.5018 -82.4982 0
+ vertex 81.5074 -81.7294 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 81.7981 -81.4284 0
+ vertex 79.5018 -82.4982 0
+ vertex 81.658 -81.584 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 81.927 -81.2634 0
+ vertex 79.5018 -82.4982 0
+ vertex 81.7981 -81.4284 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 82.0441 -81.0898 0
+ vertex 79.5018 -82.4982 0
+ vertex 81.927 -81.2634 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 82.1488 -80.9084 0
+ vertex 79.5018 -82.4982 0
+ vertex 82.0441 -81.0898 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 82.2406 -80.7202 0
+ vertex 79.5018 -82.4982 0
+ vertex 82.1488 -80.9084 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 82.3191 -80.526 0
+ vertex 79.5018 -82.4982 0
+ vertex 82.2406 -80.7202 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 82.3838 -80.3269 0
+ vertex 79.5018 -82.4982 0
+ vertex 82.3191 -80.526 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 82.4344 -80.1237 0
+ vertex 79.5018 -82.4982 0
+ vertex 82.3838 -80.3269 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 82.4708 -79.9175 0
+ vertex 79.5018 -82.4982 0
+ vertex 82.4344 -80.1237 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 82.4927 -79.7093 0
+ vertex 79.5018 -82.4982 0
+ vertex 82.4708 -79.9175 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 82.5 -79.5 0
+ vertex 79.5018 -82.4982 0
+ vertex 82.4927 -79.7093 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 82.5 79.5 0
+ vertex 79.5018 82.4982 0
+ vertex 82.5 -79.5 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 82.4927 79.7093 0
+ vertex 82.4708 79.9175 0
+ vertex 79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 79.5018 82.4982 0
+ vertex 82.4344 80.1237 0
+ vertex 82.3838 80.3269 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 82.1488 80.9084 0
+ vertex 79.5018 82.4982 0
+ vertex 82.2406 80.7202 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 79.5018 82.4982 0
+ vertex 82.3191 80.526 0
+ vertex 82.2406 80.7202 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 81.658 81.584 0
+ vertex 81.5074 81.7294 0
+ vertex 79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 81.7981 81.4284 0
+ vertex 79.5018 82.4982 0
+ vertex 81.927 81.2634 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 79.5018 82.4982 0
+ vertex 82.0441 81.0898 0
+ vertex 81.927 81.2634 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 81.658 81.584 0
+ vertex 79.5018 82.4982 0
+ vertex 81.7981 81.4284 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 80.6238 82.2815 0
+ vertex 80.427 82.3532 0
+ vertex 79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 81.1776 81.9871 0
+ vertex 79.5018 82.4982 0
+ vertex 81.347 81.864 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 79.5018 82.4982 0
+ vertex 81.5074 81.7294 0
+ vertex 81.347 81.864 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 81 82.0981 0
+ vertex 79.5018 82.4982 0
+ vertex 81.1776 81.9871 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 80.8151 82.1964 0
+ vertex 79.5018 82.4982 0
+ vertex 81 82.0981 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 80.6238 82.2815 0
+ vertex 79.5018 82.4982 0
+ vertex 80.8151 82.1964 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 82.0441 81.0898 0
+ vertex 79.5018 82.4982 0
+ vertex 82.1488 80.9084 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 80.0209 82.4544 0
+ vertex 79.5018 82.4982 0
+ vertex 80.2258 82.4109 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 79.5018 82.4982 0
+ vertex 80.427 82.3532 0
+ vertex 80.2258 82.4109 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 79.5018 82.4982 0
+ vertex 82.3838 80.3269 0
+ vertex 82.3191 80.526 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 79.5018 82.4982 0
+ vertex 80.0209 82.4544 0
+ vertex 79.8136 82.4836 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 82.4708 79.9175 0
+ vertex 82.4344 80.1237 0
+ vertex 79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 79.8136 82.4836 0
+ vertex 79.6047 82.4982 0
+ vertex 79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 82.5 -79.5 0
+ vertex 79.5018 82.4982 0
+ vertex 79.5018 -82.4982 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex -79.5018 82.4982 0
+ vertex 79.5 82.5 0
+ vertex -79.5 82.5 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 79.5018 82.4982 0
+ vertex 79.5 82.5 0
+ vertex -79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex 79.5018 82.4982 0
+ vertex -79.5018 82.4982 0
+ vertex 79.5018 -82.4982 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex -79.5018 -82.4982 0
+ vertex -82.5 79.5 0
+ vertex -82.5 -79.5 0
+ endloop
+ endfacet
+ facet normal -0 0 1
+ outer loop
+ vertex -79.6047 82.4982 0
+ vertex -79.8136 82.4836 0
+ vertex -79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal -0 0 1
+ outer loop
+ vertex -79.8136 82.4836 0
+ vertex -80.0209 82.4544 0
+ vertex -79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal -0 0 1
+ outer loop
+ vertex -80.0209 82.4544 0
+ vertex -80.2258 82.4109 0
+ vertex -79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal -0 0 1
+ outer loop
+ vertex -80.2258 82.4109 0
+ vertex -80.427 82.3532 0
+ vertex -79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal -0 0 1
+ outer loop
+ vertex -80.427 82.3532 0
+ vertex -80.6238 82.2815 0
+ vertex -79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal -0 0 1
+ outer loop
+ vertex -80.6238 82.2815 0
+ vertex -80.8151 82.1964 0
+ vertex -79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal -0 0 1
+ outer loop
+ vertex -80.8151 82.1964 0
+ vertex -81 82.0981 0
+ vertex -79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal -0 0 1
+ outer loop
+ vertex -81 82.0981 0
+ vertex -81.1776 81.9871 0
+ vertex -79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal -0 0 1
+ outer loop
+ vertex -81.1776 81.9871 0
+ vertex -81.347 81.864 0
+ vertex -79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal -0 0 1
+ outer loop
+ vertex -81.347 81.864 0
+ vertex -81.5074 81.7294 0
+ vertex -79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal -0 0 1
+ outer loop
+ vertex -81.5074 81.7294 0
+ vertex -81.658 81.584 0
+ vertex -79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal -0 0 1
+ outer loop
+ vertex -81.658 81.584 0
+ vertex -81.7981 81.4284 0
+ vertex -79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal -0 0 1
+ outer loop
+ vertex -81.7981 81.4284 0
+ vertex -81.927 81.2634 0
+ vertex -79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal -0 0 1
+ outer loop
+ vertex -81.927 81.2634 0
+ vertex -82.0441 81.0898 0
+ vertex -79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal -0 0 1
+ outer loop
+ vertex -82.0441 81.0898 0
+ vertex -82.1488 80.9084 0
+ vertex -79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal -0 0 1
+ outer loop
+ vertex -82.1488 80.9084 0
+ vertex -82.2406 80.7202 0
+ vertex -79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal -0 0 1
+ outer loop
+ vertex -82.2406 80.7202 0
+ vertex -82.3191 80.526 0
+ vertex -79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal -0 0 1
+ outer loop
+ vertex -82.3191 80.526 0
+ vertex -82.3838 80.3269 0
+ vertex -79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal -0 0 1
+ outer loop
+ vertex -82.3838 80.3269 0
+ vertex -82.4344 80.1237 0
+ vertex -79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal -0 0 1
+ outer loop
+ vertex -82.4344 80.1237 0
+ vertex -82.4708 79.9175 0
+ vertex -79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal -0 0 1
+ outer loop
+ vertex -82.4708 79.9175 0
+ vertex -82.4927 79.7093 0
+ vertex -79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal -0 0 1
+ outer loop
+ vertex -82.4927 79.7093 0
+ vertex -82.5 79.5 0
+ vertex -79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex -79.5018 82.4982 0
+ vertex -82.5 79.5 0
+ vertex -79.5018 -82.4982 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex -82.4927 -79.7093 0
+ vertex -82.4708 -79.9175 0
+ vertex -79.5018 -82.4982 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex -79.5018 -82.4982 0
+ vertex -82.4344 -80.1237 0
+ vertex -82.3838 -80.3269 0
+ endloop
+ endfacet
+ facet normal -0 -0 1
+ outer loop
+ vertex -82.1488 -80.9084 0
+ vertex -79.5018 -82.4982 0
+ vertex -82.2406 -80.7202 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex -79.5018 -82.4982 0
+ vertex -82.3191 -80.526 0
+ vertex -82.2406 -80.7202 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex -81.658 -81.584 0
+ vertex -81.5074 -81.7294 0
+ vertex -79.5018 -82.4982 0
+ endloop
+ endfacet
+ facet normal -0 -0 1
+ outer loop
+ vertex -81.7981 -81.4284 0
+ vertex -79.5018 -82.4982 0
+ vertex -81.927 -81.2634 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex -79.5018 -82.4982 0
+ vertex -82.0441 -81.0898 0
+ vertex -81.927 -81.2634 0
+ endloop
+ endfacet
+ facet normal -0 -0 1
+ outer loop
+ vertex -81.658 -81.584 0
+ vertex -79.5018 -82.4982 0
+ vertex -81.7981 -81.4284 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex -80.6238 -82.2815 0
+ vertex -80.427 -82.3532 0
+ vertex -79.5018 -82.4982 0
+ endloop
+ endfacet
+ facet normal -0 -0 1
+ outer loop
+ vertex -81.1776 -81.9871 0
+ vertex -79.5018 -82.4982 0
+ vertex -81.347 -81.864 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex -79.5018 -82.4982 0
+ vertex -81.5074 -81.7294 0
+ vertex -81.347 -81.864 0
+ endloop
+ endfacet
+ facet normal -0 -0 1
+ outer loop
+ vertex -81 -82.0981 0
+ vertex -79.5018 -82.4982 0
+ vertex -81.1776 -81.9871 0
+ endloop
+ endfacet
+ facet normal -0 -0 1
+ outer loop
+ vertex -80.8151 -82.1964 0
+ vertex -79.5018 -82.4982 0
+ vertex -81 -82.0981 0
+ endloop
+ endfacet
+ facet normal -0 -0 1
+ outer loop
+ vertex -80.6238 -82.2815 0
+ vertex -79.5018 -82.4982 0
+ vertex -80.8151 -82.1964 0
+ endloop
+ endfacet
+ facet normal -0 -0 1
+ outer loop
+ vertex -82.0441 -81.0898 0
+ vertex -79.5018 -82.4982 0
+ vertex -82.1488 -80.9084 0
+ endloop
+ endfacet
+ facet normal -0 -0 1
+ outer loop
+ vertex -80.0209 -82.4544 0
+ vertex -79.5018 -82.4982 0
+ vertex -80.2258 -82.4109 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex -79.5018 -82.4982 0
+ vertex -80.427 -82.3532 0
+ vertex -80.2258 -82.4109 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex -79.5018 -82.4982 0
+ vertex -82.3838 -80.3269 0
+ vertex -82.3191 -80.526 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex -79.5018 -82.4982 0
+ vertex -80.0209 -82.4544 0
+ vertex -79.8136 -82.4836 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex -82.4708 -79.9175 0
+ vertex -82.4344 -80.1237 0
+ vertex -79.5018 -82.4982 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex -79.8136 -82.4836 0
+ vertex -79.6047 -82.4982 0
+ vertex -79.5018 -82.4982 0
+ endloop
+ endfacet
+ facet normal -0 0 1
+ outer loop
+ vertex -79.5018 -82.4982 0
+ vertex 79.5 -82.5 0
+ vertex 79.5018 -82.4982 0
+ endloop
+ endfacet
+ facet normal 0 -0 1
+ outer loop
+ vertex -79.5 -82.5 0
+ vertex 79.5 -82.5 0
+ vertex -79.5018 -82.4982 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex -79.5018 82.4982 0
+ vertex -79.5018 -82.4982 0
+ vertex 79.5018 -82.4982 0
+ endloop
+ endfacet
+ facet normal 0 0 1
+ outer loop
+ vertex -82.5 -79.5 0
+ vertex -82.4927 -79.7093 0
+ vertex -79.5018 -82.4982 0
+ endloop
+ endfacet
+ facet normal 0 -1 0
+ outer loop
+ vertex 79.6047 -82.4982 -3
+ vertex 79.5018 -82.4982 0
+ vertex 79.5018 -82.4982 -3
+ endloop
+ endfacet
+ facet normal 0 -1 0
+ outer loop
+ vertex 79.6047 -82.4982 -3
+ vertex 79.6047 -82.4982 0
+ vertex 79.5018 -82.4982 0
+ endloop
+ endfacet
+ facet normal 0.0697198 -0.997567 0
+ outer loop
+ vertex 79.8136 -82.4836 -3
+ vertex 79.6047 -82.4982 0
+ vertex 79.6047 -82.4982 -3
+ endloop
+ endfacet
+ facet normal 0.0697198 -0.997567 0
+ outer loop
+ vertex 79.8136 -82.4836 -3
+ vertex 79.8136 -82.4836 0
+ vertex 79.6047 -82.4982 0
+ endloop
+ endfacet
+ facet normal 0.139482 -0.990225 0
+ outer loop
+ vertex 80.0209 -82.4544 -3
+ vertex 79.8136 -82.4836 0
+ vertex 79.8136 -82.4836 -3
+ endloop
+ endfacet
+ facet normal 0.139482 -0.990225 0
+ outer loop
+ vertex 80.0209 -82.4544 -3
+ vertex 80.0209 -82.4544 0
+ vertex 79.8136 -82.4836 0
+ endloop
+ endfacet
+ facet normal 0.20767 -0.978199 0
+ outer loop
+ vertex 80.2258 -82.4109 -3
+ vertex 80.0209 -82.4544 0
+ vertex 80.0209 -82.4544 -3
+ endloop
+ endfacet
+ facet normal 0.20767 -0.978199 0
+ outer loop
+ vertex 80.2258 -82.4109 -3
+ vertex 80.2258 -82.4109 0
+ vertex 80.0209 -82.4544 0
+ endloop
+ endfacet
+ facet normal 0.275668 -0.961253 0
+ outer loop
+ vertex 80.427 -82.3532 -3
+ vertex 80.2258 -82.4109 0
+ vertex 80.2258 -82.4109 -3
+ endloop
+ endfacet
+ facet normal 0.275668 -0.961253 0
+ outer loop
+ vertex 80.427 -82.3532 -3
+ vertex 80.427 -82.3532 0
+ vertex 80.2258 -82.4109 0
+ endloop
+ endfacet
+ facet normal 0.342318 -0.939584 0
+ outer loop
+ vertex 80.6238 -82.2815 -3
+ vertex 80.427 -82.3532 0
+ vertex 80.427 -82.3532 -3
+ endloop
+ endfacet
+ facet normal 0.342318 -0.939584 0
+ outer loop
+ vertex 80.6238 -82.2815 -3
+ vertex 80.6238 -82.2815 0
+ vertex 80.427 -82.3532 0
+ endloop
+ endfacet
+ facet normal 0.406449 -0.913674 0
+ outer loop
+ vertex 80.8151 -82.1964 -3
+ vertex 80.6238 -82.2815 0
+ vertex 80.6238 -82.2815 -3
+ endloop
+ endfacet
+ facet normal 0.406449 -0.913674 0
+ outer loop
+ vertex 80.8151 -82.1964 -3
+ vertex 80.8151 -82.1964 0
+ vertex 80.6238 -82.2815 0
+ endloop
+ endfacet
+ facet normal 0.469423 -0.882973 0
+ outer loop
+ vertex 81 -82.0981 -3
+ vertex 80.8151 -82.1964 0
+ vertex 80.8151 -82.1964 -3
+ endloop
+ endfacet
+ facet normal 0.469423 -0.882973 0
+ outer loop
+ vertex 81 -82.0981 -3
+ vertex 81 -82.0981 0
+ vertex 80.8151 -82.1964 0
+ endloop
+ endfacet
+ facet normal 0.529999 -0.847998 0
+ outer loop
+ vertex 81.1776 -81.9871 -3
+ vertex 81 -82.0981 0
+ vertex 81 -82.0981 -3
+ endloop
+ endfacet
+ facet normal 0.529999 -0.847998 0
+ outer loop
+ vertex 81.1776 -81.9871 -3
+ vertex 81.1776 -81.9871 0
+ vertex 81 -82.0981 0
+ endloop
+ endfacet
+ facet normal 0.587859 -0.808963 0
+ outer loop
+ vertex 81.347 -81.864 -3
+ vertex 81.1776 -81.9871 0
+ vertex 81.1776 -81.9871 -3
+ endloop
+ endfacet
+ facet normal 0.587859 -0.808963 0
+ outer loop
+ vertex 81.347 -81.864 -3
+ vertex 81.347 -81.864 0
+ vertex 81.1776 -81.9871 0
+ endloop
+ endfacet
+ facet normal 0.642811 -0.766025 0
+ outer loop
+ vertex 81.5074 -81.7294 -3
+ vertex 81.347 -81.864 0
+ vertex 81.347 -81.864 -3
+ endloop
+ endfacet
+ facet normal 0.642811 -0.766025 0
+ outer loop
+ vertex 81.5074 -81.7294 -3
+ vertex 81.5074 -81.7294 0
+ vertex 81.347 -81.864 0
+ endloop
+ endfacet
+ facet normal 0.694577 -0.719418 0
+ outer loop
+ vertex 81.658 -81.584 -3
+ vertex 81.5074 -81.7294 0
+ vertex 81.5074 -81.7294 -3
+ endloop
+ endfacet
+ facet normal 0.694577 -0.719418 0
+ outer loop
+ vertex 81.658 -81.584 -3
+ vertex 81.658 -81.584 0
+ vertex 81.5074 -81.7294 0
+ endloop
+ endfacet
+ facet normal 0.743152 -0.669123 0
+ outer loop
+ vertex 81.7981 -81.4284 -3
+ vertex 81.658 -81.584 0
+ vertex 81.658 -81.584 -3
+ endloop
+ endfacet
+ facet normal 0.743152 -0.669123 0
+ outer loop
+ vertex 81.7981 -81.4284 -3
+ vertex 81.7981 -81.4284 0
+ vertex 81.658 -81.584 0
+ endloop
+ endfacet
+ facet normal 0.788039 -0.615626 0
+ outer loop
+ vertex 81.927 -81.2634 -3
+ vertex 81.7981 -81.4284 0
+ vertex 81.7981 -81.4284 -3
+ endloop
+ endfacet
+ facet normal 0.788039 -0.615626 0
+ outer loop
+ vertex 81.927 -81.2634 -3
+ vertex 81.927 -81.2634 0
+ vertex 81.7981 -81.4284 0
+ endloop
+ endfacet
+ facet normal 0.829026 -0.55921 0
+ outer loop
+ vertex 82.0441 -81.0898 -3
+ vertex 81.927 -81.2634 0
+ vertex 81.927 -81.2634 -3
+ endloop
+ endfacet
+ facet normal 0.829026 -0.55921 0
+ outer loop
+ vertex 82.0441 -81.0898 -3
+ vertex 82.0441 -81.0898 0
+ vertex 81.927 -81.2634 0
+ endloop
+ endfacet
+ facet normal 0.86609 -0.499888 0
+ outer loop
+ vertex 82.1488 -80.9084 -3
+ vertex 82.0441 -81.0898 0
+ vertex 82.0441 -81.0898 -3
+ endloop
+ endfacet
+ facet normal 0.86609 -0.499888 0
+ outer loop
+ vertex 82.1488 -80.9084 -3
+ vertex 82.1488 -80.9084 0
+ vertex 82.0441 -81.0898 0
+ endloop
+ endfacet
+ facet normal 0.898778 -0.438405 0
+ outer loop
+ vertex 82.2406 -80.7202 -3
+ vertex 82.1488 -80.9084 0
+ vertex 82.1488 -80.9084 -3
+ endloop
+ endfacet
+ facet normal 0.898778 -0.438405 0
+ outer loop
+ vertex 82.2406 -80.7202 -3
+ vertex 82.2406 -80.7202 0
+ vertex 82.1488 -80.9084 0
+ endloop
+ endfacet
+ facet normal 0.927121 -0.374763 0
+ outer loop
+ vertex 82.3191 -80.526 -3
+ vertex 82.2406 -80.7202 0
+ vertex 82.2406 -80.7202 -3
+ endloop
+ endfacet
+ facet normal 0.927121 -0.374763 0
+ outer loop
+ vertex 82.3191 -80.526 -3
+ vertex 82.3191 -80.526 0
+ vertex 82.2406 -80.7202 0
+ endloop
+ endfacet
+ facet normal 0.951045 -0.309054 0
+ outer loop
+ vertex 82.3838 -80.3269 -3
+ vertex 82.3191 -80.526 0
+ vertex 82.3191 -80.526 -3
+ endloop
+ endfacet
+ facet normal 0.951045 -0.309054 0
+ outer loop
+ vertex 82.3838 -80.3269 -3
+ vertex 82.3838 -80.3269 0
+ vertex 82.3191 -80.526 0
+ endloop
+ endfacet
+ facet normal 0.970367 -0.241637 0
+ outer loop
+ vertex 82.4344 -80.1237 -3
+ vertex 82.3838 -80.3269 0
+ vertex 82.3838 -80.3269 -3
+ endloop
+ endfacet
+ facet normal 0.970367 -0.241637 0
+ outer loop
+ vertex 82.4344 -80.1237 -3
+ vertex 82.4344 -80.1237 0
+ vertex 82.3838 -80.3269 0
+ endloop
+ endfacet
+ facet normal 0.984774 -0.17384 0
+ outer loop
+ vertex 82.4708 -79.9175 -3
+ vertex 82.4344 -80.1237 0
+ vertex 82.4344 -80.1237 -3
+ endloop
+ endfacet
+ facet normal 0.984774 -0.17384 0
+ outer loop
+ vertex 82.4708 -79.9175 -3
+ vertex 82.4708 -79.9175 0
+ vertex 82.4344 -80.1237 0
+ endloop
+ endfacet
+ facet normal 0.994513 -0.10461 0
+ outer loop
+ vertex 82.4927 -79.7093 -3
+ vertex 82.4708 -79.9175 0
+ vertex 82.4708 -79.9175 -3
+ endloop
+ endfacet
+ facet normal 0.994513 -0.10461 0
+ outer loop
+ vertex 82.4927 -79.7093 -3
+ vertex 82.4927 -79.7093 0
+ vertex 82.4708 -79.9175 0
+ endloop
+ endfacet
+ facet normal 0.999392 -0.034857 0
+ outer loop
+ vertex 82.5 -79.5 -3
+ vertex 82.4927 -79.7093 0
+ vertex 82.4927 -79.7093 -3
+ endloop
+ endfacet
+ facet normal 0.999392 -0.034857 0
+ outer loop
+ vertex 82.5 -79.5 -3
+ vertex 82.5 -79.5 0
+ vertex 82.4927 -79.7093 0
+ endloop
+ endfacet
+ facet normal 1 0 0
+ outer loop
+ vertex 82.5 79.5 -3
+ vertex 82.5 -79.5 0
+ vertex 82.5 -79.5 -3
+ endloop
+ endfacet
+ facet normal 1 0 -0
+ outer loop
+ vertex 82.5 79.5 -3
+ vertex 82.5 79.5 0
+ vertex 82.5 -79.5 0
+ endloop
+ endfacet
+ facet normal 0.999392 0.034857 0
+ outer loop
+ vertex 82.4927 79.7093 -3
+ vertex 82.5 79.5 0
+ vertex 82.5 79.5 -3
+ endloop
+ endfacet
+ facet normal 0.999392 0.034857 -0
+ outer loop
+ vertex 82.4927 79.7093 -3
+ vertex 82.4927 79.7093 0
+ vertex 82.5 79.5 0
+ endloop
+ endfacet
+ facet normal 0.994513 0.10461 0
+ outer loop
+ vertex 82.4708 79.9175 -3
+ vertex 82.4927 79.7093 0
+ vertex 82.4927 79.7093 -3
+ endloop
+ endfacet
+ facet normal 0.994513 0.10461 -0
+ outer loop
+ vertex 82.4708 79.9175 -3
+ vertex 82.4708 79.9175 0
+ vertex 82.4927 79.7093 0
+ endloop
+ endfacet
+ facet normal 0.984774 0.17384 0
+ outer loop
+ vertex 82.4344 80.1237 -3
+ vertex 82.4708 79.9175 0
+ vertex 82.4708 79.9175 -3
+ endloop
+ endfacet
+ facet normal 0.984774 0.17384 -0
+ outer loop
+ vertex 82.4344 80.1237 -3
+ vertex 82.4344 80.1237 0
+ vertex 82.4708 79.9175 0
+ endloop
+ endfacet
+ facet normal 0.970367 0.241637 0
+ outer loop
+ vertex 82.3838 80.3269 -3
+ vertex 82.4344 80.1237 0
+ vertex 82.4344 80.1237 -3
+ endloop
+ endfacet
+ facet normal 0.970367 0.241637 -0
+ outer loop
+ vertex 82.3838 80.3269 -3
+ vertex 82.3838 80.3269 0
+ vertex 82.4344 80.1237 0
+ endloop
+ endfacet
+ facet normal 0.951045 0.309054 0
+ outer loop
+ vertex 82.3191 80.526 -3
+ vertex 82.3838 80.3269 0
+ vertex 82.3838 80.3269 -3
+ endloop
+ endfacet
+ facet normal 0.951045 0.309054 -0
+ outer loop
+ vertex 82.3191 80.526 -3
+ vertex 82.3191 80.526 0
+ vertex 82.3838 80.3269 0
+ endloop
+ endfacet
+ facet normal 0.927121 0.374763 0
+ outer loop
+ vertex 82.2406 80.7202 -3
+ vertex 82.3191 80.526 0
+ vertex 82.3191 80.526 -3
+ endloop
+ endfacet
+ facet normal 0.927121 0.374763 -0
+ outer loop
+ vertex 82.2406 80.7202 -3
+ vertex 82.2406 80.7202 0
+ vertex 82.3191 80.526 0
+ endloop
+ endfacet
+ facet normal 0.898778 0.438405 0
+ outer loop
+ vertex 82.1488 80.9084 -3
+ vertex 82.2406 80.7202 0
+ vertex 82.2406 80.7202 -3
+ endloop
+ endfacet
+ facet normal 0.898778 0.438405 -0
+ outer loop
+ vertex 82.1488 80.9084 -3
+ vertex 82.1488 80.9084 0
+ vertex 82.2406 80.7202 0
+ endloop
+ endfacet
+ facet normal 0.86609 0.499888 0
+ outer loop
+ vertex 82.0441 81.0898 -3
+ vertex 82.1488 80.9084 0
+ vertex 82.1488 80.9084 -3
+ endloop
+ endfacet
+ facet normal 0.86609 0.499888 -0
+ outer loop
+ vertex 82.0441 81.0898 -3
+ vertex 82.0441 81.0898 0
+ vertex 82.1488 80.9084 0
+ endloop
+ endfacet
+ facet normal 0.829026 0.55921 0
+ outer loop
+ vertex 81.927 81.2634 -3
+ vertex 82.0441 81.0898 0
+ vertex 82.0441 81.0898 -3
+ endloop
+ endfacet
+ facet normal 0.829026 0.55921 -0
+ outer loop
+ vertex 81.927 81.2634 -3
+ vertex 81.927 81.2634 0
+ vertex 82.0441 81.0898 0
+ endloop
+ endfacet
+ facet normal 0.788039 0.615626 0
+ outer loop
+ vertex 81.7981 81.4284 -3
+ vertex 81.927 81.2634 0
+ vertex 81.927 81.2634 -3
+ endloop
+ endfacet
+ facet normal 0.788039 0.615626 -0
+ outer loop
+ vertex 81.7981 81.4284 -3
+ vertex 81.7981 81.4284 0
+ vertex 81.927 81.2634 0
+ endloop
+ endfacet
+ facet normal 0.743152 0.669123 0
+ outer loop
+ vertex 81.658 81.584 -3
+ vertex 81.7981 81.4284 0
+ vertex 81.7981 81.4284 -3
+ endloop
+ endfacet
+ facet normal 0.743152 0.669123 -0
+ outer loop
+ vertex 81.658 81.584 -3
+ vertex 81.658 81.584 0
+ vertex 81.7981 81.4284 0
+ endloop
+ endfacet
+ facet normal 0.694577 0.719418 0
+ outer loop
+ vertex 81.5074 81.7294 -3
+ vertex 81.658 81.584 0
+ vertex 81.658 81.584 -3
+ endloop
+ endfacet
+ facet normal 0.694577 0.719418 -0
+ outer loop
+ vertex 81.5074 81.7294 -3
+ vertex 81.5074 81.7294 0
+ vertex 81.658 81.584 0
+ endloop
+ endfacet
+ facet normal 0.642811 0.766025 0
+ outer loop
+ vertex 81.347 81.864 -3
+ vertex 81.5074 81.7294 0
+ vertex 81.5074 81.7294 -3
+ endloop
+ endfacet
+ facet normal 0.642811 0.766025 -0
+ outer loop
+ vertex 81.347 81.864 -3
+ vertex 81.347 81.864 0
+ vertex 81.5074 81.7294 0
+ endloop
+ endfacet
+ facet normal 0.587859 0.808963 0
+ outer loop
+ vertex 81.1776 81.9871 -3
+ vertex 81.347 81.864 0
+ vertex 81.347 81.864 -3
+ endloop
+ endfacet
+ facet normal 0.587859 0.808963 -0
+ outer loop
+ vertex 81.1776 81.9871 -3
+ vertex 81.1776 81.9871 0
+ vertex 81.347 81.864 0
+ endloop
+ endfacet
+ facet normal 0.529999 0.847998 0
+ outer loop
+ vertex 81 82.0981 -3
+ vertex 81.1776 81.9871 0
+ vertex 81.1776 81.9871 -3
+ endloop
+ endfacet
+ facet normal 0.529999 0.847998 -0
+ outer loop
+ vertex 81 82.0981 -3
+ vertex 81 82.0981 0
+ vertex 81.1776 81.9871 0
+ endloop
+ endfacet
+ facet normal 0.469423 0.882973 0
+ outer loop
+ vertex 80.8151 82.1964 -3
+ vertex 81 82.0981 0
+ vertex 81 82.0981 -3
+ endloop
+ endfacet
+ facet normal 0.469423 0.882973 -0
+ outer loop
+ vertex 80.8151 82.1964 -3
+ vertex 80.8151 82.1964 0
+ vertex 81 82.0981 0
+ endloop
+ endfacet
+ facet normal 0.406449 0.913674 0
+ outer loop
+ vertex 80.6238 82.2815 -3
+ vertex 80.8151 82.1964 0
+ vertex 80.8151 82.1964 -3
+ endloop
+ endfacet
+ facet normal 0.406449 0.913674 -0
+ outer loop
+ vertex 80.6238 82.2815 -3
+ vertex 80.6238 82.2815 0
+ vertex 80.8151 82.1964 0
+ endloop
+ endfacet
+ facet normal 0.342318 0.939584 0
+ outer loop
+ vertex 80.427 82.3532 -3
+ vertex 80.6238 82.2815 0
+ vertex 80.6238 82.2815 -3
+ endloop
+ endfacet
+ facet normal 0.342318 0.939584 -0
+ outer loop
+ vertex 80.427 82.3532 -3
+ vertex 80.427 82.3532 0
+ vertex 80.6238 82.2815 0
+ endloop
+ endfacet
+ facet normal 0.275668 0.961253 0
+ outer loop
+ vertex 80.2258 82.4109 -3
+ vertex 80.427 82.3532 0
+ vertex 80.427 82.3532 -3
+ endloop
+ endfacet
+ facet normal 0.275668 0.961253 -0
+ outer loop
+ vertex 80.2258 82.4109 -3
+ vertex 80.2258 82.4109 0
+ vertex 80.427 82.3532 0
+ endloop
+ endfacet
+ facet normal 0.20767 0.978199 0
+ outer loop
+ vertex 80.0209 82.4544 -3
+ vertex 80.2258 82.4109 0
+ vertex 80.2258 82.4109 -3
+ endloop
+ endfacet
+ facet normal 0.20767 0.978199 -0
+ outer loop
+ vertex 80.0209 82.4544 -3
+ vertex 80.0209 82.4544 0
+ vertex 80.2258 82.4109 0
+ endloop
+ endfacet
+ facet normal 0.139482 0.990225 0
+ outer loop
+ vertex 79.8136 82.4836 -3
+ vertex 80.0209 82.4544 0
+ vertex 80.0209 82.4544 -3
+ endloop
+ endfacet
+ facet normal 0.139482 0.990225 -0
+ outer loop
+ vertex 79.8136 82.4836 -3
+ vertex 79.8136 82.4836 0
+ vertex 80.0209 82.4544 0
+ endloop
+ endfacet
+ facet normal 0.0697198 0.997567 0
+ outer loop
+ vertex 79.6047 82.4982 -3
+ vertex 79.8136 82.4836 0
+ vertex 79.8136 82.4836 -3
+ endloop
+ endfacet
+ facet normal 0.0697198 0.997567 -0
+ outer loop
+ vertex 79.6047 82.4982 -3
+ vertex 79.6047 82.4982 0
+ vertex 79.8136 82.4836 0
+ endloop
+ endfacet
+ facet normal 0 1 0
+ outer loop
+ vertex 79.5018 82.4982 -3
+ vertex 79.6047 82.4982 0
+ vertex 79.6047 82.4982 -3
+ endloop
+ endfacet
+ facet normal 0 1 0
+ outer loop
+ vertex 79.5018 82.4982 -3
+ vertex 79.5018 82.4982 0
+ vertex 79.6047 82.4982 0
+ endloop
+ endfacet
+ facet normal 0.707107 0.707107 0
+ outer loop
+ vertex 79.5 82.5 -3
+ vertex 79.5018 82.4982 0
+ vertex 79.5018 82.4982 -3
+ endloop
+ endfacet
+ facet normal 0.707107 0.707107 -0
+ outer loop
+ vertex 79.5 82.5 -3
+ vertex 79.5 82.5 0
+ vertex 79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal 0 1 0
+ outer loop
+ vertex -79.5 82.5 -3
+ vertex 79.5 82.5 0
+ vertex 79.5 82.5 -3
+ endloop
+ endfacet
+ facet normal 0 1 0
+ outer loop
+ vertex -79.5 82.5 -3
+ vertex -79.5 82.5 0
+ vertex 79.5 82.5 0
+ endloop
+ endfacet
+ facet normal -0.707107 0.707107 0
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex -79.5 82.5 0
+ vertex -79.5 82.5 -3
+ endloop
+ endfacet
+ facet normal -0.707107 0.707107 0
+ outer loop
+ vertex -79.5018 82.4982 -3
+ vertex -79.5018 82.4982 0
+ vertex -79.5 82.5 0
+ endloop
+ endfacet
+ facet normal 0 1 0
+ outer loop
+ vertex -79.6047 82.4982 -3
+ vertex -79.5018 82.4982 0
+ vertex -79.5018 82.4982 -3
+ endloop
+ endfacet
+ facet normal 0 1 0
+ outer loop
+ vertex -79.6047 82.4982 -3
+ vertex -79.6047 82.4982 0
+ vertex -79.5018 82.4982 0
+ endloop
+ endfacet
+ facet normal -0.0697198 0.997567 0
+ outer loop
+ vertex -79.8136 82.4836 -3
+ vertex -79.6047 82.4982 0
+ vertex -79.6047 82.4982 -3
+ endloop
+ endfacet
+ facet normal -0.0697198 0.997567 0
+ outer loop
+ vertex -79.8136 82.4836 -3
+ vertex -79.8136 82.4836 0
+ vertex -79.6047 82.4982 0
+ endloop
+ endfacet
+ facet normal -0.139482 0.990225 0
+ outer loop
+ vertex -80.0209 82.4544 -3
+ vertex -79.8136 82.4836 0
+ vertex -79.8136 82.4836 -3
+ endloop
+ endfacet
+ facet normal -0.139482 0.990225 0
+ outer loop
+ vertex -80.0209 82.4544 -3
+ vertex -80.0209 82.4544 0
+ vertex -79.8136 82.4836 0
+ endloop
+ endfacet
+ facet normal -0.20767 0.978199 0
+ outer loop
+ vertex -80.2258 82.4109 -3
+ vertex -80.0209 82.4544 0
+ vertex -80.0209 82.4544 -3
+ endloop
+ endfacet
+ facet normal -0.20767 0.978199 0
+ outer loop
+ vertex -80.2258 82.4109 -3
+ vertex -80.2258 82.4109 0
+ vertex -80.0209 82.4544 0
+ endloop
+ endfacet
+ facet normal -0.275668 0.961253 0
+ outer loop
+ vertex -80.427 82.3532 -3
+ vertex -80.2258 82.4109 0
+ vertex -80.2258 82.4109 -3
+ endloop
+ endfacet
+ facet normal -0.275668 0.961253 0
+ outer loop
+ vertex -80.427 82.3532 -3
+ vertex -80.427 82.3532 0
+ vertex -80.2258 82.4109 0
+ endloop
+ endfacet
+ facet normal -0.342318 0.939584 0
+ outer loop
+ vertex -80.6238 82.2815 -3
+ vertex -80.427 82.3532 0
+ vertex -80.427 82.3532 -3
+ endloop
+ endfacet
+ facet normal -0.342318 0.939584 0
+ outer loop
+ vertex -80.6238 82.2815 -3
+ vertex -80.6238 82.2815 0
+ vertex -80.427 82.3532 0
+ endloop
+ endfacet
+ facet normal -0.406449 0.913674 0
+ outer loop
+ vertex -80.8151 82.1964 -3
+ vertex -80.6238 82.2815 0
+ vertex -80.6238 82.2815 -3
+ endloop
+ endfacet
+ facet normal -0.406449 0.913674 0
+ outer loop
+ vertex -80.8151 82.1964 -3
+ vertex -80.8151 82.1964 0
+ vertex -80.6238 82.2815 0
+ endloop
+ endfacet
+ facet normal -0.469423 0.882973 0
+ outer loop
+ vertex -81 82.0981 -3
+ vertex -80.8151 82.1964 0
+ vertex -80.8151 82.1964 -3
+ endloop
+ endfacet
+ facet normal -0.469423 0.882973 0
+ outer loop
+ vertex -81 82.0981 -3
+ vertex -81 82.0981 0
+ vertex -80.8151 82.1964 0
+ endloop
+ endfacet
+ facet normal -0.529999 0.847998 0
+ outer loop
+ vertex -81.1776 81.9871 -3
+ vertex -81 82.0981 0
+ vertex -81 82.0981 -3
+ endloop
+ endfacet
+ facet normal -0.529999 0.847998 0
+ outer loop
+ vertex -81.1776 81.9871 -3
+ vertex -81.1776 81.9871 0
+ vertex -81 82.0981 0
+ endloop
+ endfacet
+ facet normal -0.587859 0.808963 0
+ outer loop
+ vertex -81.347 81.864 -3
+ vertex -81.1776 81.9871 0
+ vertex -81.1776 81.9871 -3
+ endloop
+ endfacet
+ facet normal -0.587859 0.808963 0
+ outer loop
+ vertex -81.347 81.864 -3
+ vertex -81.347 81.864 0
+ vertex -81.1776 81.9871 0
+ endloop
+ endfacet
+ facet normal -0.642811 0.766025 0
+ outer loop
+ vertex -81.5074 81.7294 -3
+ vertex -81.347 81.864 0
+ vertex -81.347 81.864 -3
+ endloop
+ endfacet
+ facet normal -0.642811 0.766025 0
+ outer loop
+ vertex -81.5074 81.7294 -3
+ vertex -81.5074 81.7294 0
+ vertex -81.347 81.864 0
+ endloop
+ endfacet
+ facet normal -0.694577 0.719418 0
+ outer loop
+ vertex -81.658 81.584 -3
+ vertex -81.5074 81.7294 0
+ vertex -81.5074 81.7294 -3
+ endloop
+ endfacet
+ facet normal -0.694577 0.719418 0
+ outer loop
+ vertex -81.658 81.584 -3
+ vertex -81.658 81.584 0
+ vertex -81.5074 81.7294 0
+ endloop
+ endfacet
+ facet normal -0.743152 0.669123 0
+ outer loop
+ vertex -81.7981 81.4284 -3
+ vertex -81.658 81.584 0
+ vertex -81.658 81.584 -3
+ endloop
+ endfacet
+ facet normal -0.743152 0.669123 0
+ outer loop
+ vertex -81.7981 81.4284 -3
+ vertex -81.7981 81.4284 0
+ vertex -81.658 81.584 0
+ endloop
+ endfacet
+ facet normal -0.788039 0.615626 0
+ outer loop
+ vertex -81.927 81.2634 -3
+ vertex -81.7981 81.4284 0
+ vertex -81.7981 81.4284 -3
+ endloop
+ endfacet
+ facet normal -0.788039 0.615626 0
+ outer loop
+ vertex -81.927 81.2634 -3
+ vertex -81.927 81.2634 0
+ vertex -81.7981 81.4284 0
+ endloop
+ endfacet
+ facet normal -0.829026 0.55921 0
+ outer loop
+ vertex -82.0441 81.0898 -3
+ vertex -81.927 81.2634 0
+ vertex -81.927 81.2634 -3
+ endloop
+ endfacet
+ facet normal -0.829026 0.55921 0
+ outer loop
+ vertex -82.0441 81.0898 -3
+ vertex -82.0441 81.0898 0
+ vertex -81.927 81.2634 0
+ endloop
+ endfacet
+ facet normal -0.86609 0.499888 0
+ outer loop
+ vertex -82.1488 80.9084 -3
+ vertex -82.0441 81.0898 0
+ vertex -82.0441 81.0898 -3
+ endloop
+ endfacet
+ facet normal -0.86609 0.499888 0
+ outer loop
+ vertex -82.1488 80.9084 -3
+ vertex -82.1488 80.9084 0
+ vertex -82.0441 81.0898 0
+ endloop
+ endfacet
+ facet normal -0.898778 0.438405 0
+ outer loop
+ vertex -82.2406 80.7202 -3
+ vertex -82.1488 80.9084 0
+ vertex -82.1488 80.9084 -3
+ endloop
+ endfacet
+ facet normal -0.898778 0.438405 0
+ outer loop
+ vertex -82.2406 80.7202 -3
+ vertex -82.2406 80.7202 0
+ vertex -82.1488 80.9084 0
+ endloop
+ endfacet
+ facet normal -0.927121 0.374763 0
+ outer loop
+ vertex -82.3191 80.526 -3
+ vertex -82.2406 80.7202 0
+ vertex -82.2406 80.7202 -3
+ endloop
+ endfacet
+ facet normal -0.927121 0.374763 0
+ outer loop
+ vertex -82.3191 80.526 -3
+ vertex -82.3191 80.526 0
+ vertex -82.2406 80.7202 0
+ endloop
+ endfacet
+ facet normal -0.951045 0.309054 0
+ outer loop
+ vertex -82.3838 80.3269 -3
+ vertex -82.3191 80.526 0
+ vertex -82.3191 80.526 -3
+ endloop
+ endfacet
+ facet normal -0.951045 0.309054 0
+ outer loop
+ vertex -82.3838 80.3269 -3
+ vertex -82.3838 80.3269 0
+ vertex -82.3191 80.526 0
+ endloop
+ endfacet
+ facet normal -0.970367 0.241637 0
+ outer loop
+ vertex -82.4344 80.1237 -3
+ vertex -82.3838 80.3269 0
+ vertex -82.3838 80.3269 -3
+ endloop
+ endfacet
+ facet normal -0.970367 0.241637 0
+ outer loop
+ vertex -82.4344 80.1237 -3
+ vertex -82.4344 80.1237 0
+ vertex -82.3838 80.3269 0
+ endloop
+ endfacet
+ facet normal -0.984774 0.17384 0
+ outer loop
+ vertex -82.4708 79.9175 -3
+ vertex -82.4344 80.1237 0
+ vertex -82.4344 80.1237 -3
+ endloop
+ endfacet
+ facet normal -0.984774 0.17384 0
+ outer loop
+ vertex -82.4708 79.9175 -3
+ vertex -82.4708 79.9175 0
+ vertex -82.4344 80.1237 0
+ endloop
+ endfacet
+ facet normal -0.994513 0.10461 0
+ outer loop
+ vertex -82.4927 79.7093 -3
+ vertex -82.4708 79.9175 0
+ vertex -82.4708 79.9175 -3
+ endloop
+ endfacet
+ facet normal -0.994513 0.10461 0
+ outer loop
+ vertex -82.4927 79.7093 -3
+ vertex -82.4927 79.7093 0
+ vertex -82.4708 79.9175 0
+ endloop
+ endfacet
+ facet normal -0.999392 0.034857 0
+ outer loop
+ vertex -82.5 79.5 -3
+ vertex -82.4927 79.7093 0
+ vertex -82.4927 79.7093 -3
+ endloop
+ endfacet
+ facet normal -0.999392 0.034857 0
+ outer loop
+ vertex -82.5 79.5 -3
+ vertex -82.5 79.5 0
+ vertex -82.4927 79.7093 0
+ endloop
+ endfacet
+ facet normal -1 0 0
+ outer loop
+ vertex -82.5 -79.5 -3
+ vertex -82.5 79.5 0
+ vertex -82.5 79.5 -3
+ endloop
+ endfacet
+ facet normal -1 0 0
+ outer loop
+ vertex -82.5 -79.5 -3
+ vertex -82.5 -79.5 0
+ vertex -82.5 79.5 0
+ endloop
+ endfacet
+ facet normal -0.999392 -0.034857 0
+ outer loop
+ vertex -82.4927 -79.7093 -3
+ vertex -82.5 -79.5 0
+ vertex -82.5 -79.5 -3
+ endloop
+ endfacet
+ facet normal -0.999392 -0.034857 0
+ outer loop
+ vertex -82.4927 -79.7093 -3
+ vertex -82.4927 -79.7093 0
+ vertex -82.5 -79.5 0
+ endloop
+ endfacet
+ facet normal -0.994513 -0.10461 0
+ outer loop
+ vertex -82.4708 -79.9175 -3
+ vertex -82.4927 -79.7093 0
+ vertex -82.4927 -79.7093 -3
+ endloop
+ endfacet
+ facet normal -0.994513 -0.10461 0
+ outer loop
+ vertex -82.4708 -79.9175 -3
+ vertex -82.4708 -79.9175 0
+ vertex -82.4927 -79.7093 0
+ endloop
+ endfacet
+ facet normal -0.984774 -0.17384 0
+ outer loop
+ vertex -82.4344 -80.1237 -3
+ vertex -82.4708 -79.9175 0
+ vertex -82.4708 -79.9175 -3
+ endloop
+ endfacet
+ facet normal -0.984774 -0.17384 0
+ outer loop
+ vertex -82.4344 -80.1237 -3
+ vertex -82.4344 -80.1237 0
+ vertex -82.4708 -79.9175 0
+ endloop
+ endfacet
+ facet normal -0.970367 -0.241637 0
+ outer loop
+ vertex -82.3838 -80.3269 -3
+ vertex -82.4344 -80.1237 0
+ vertex -82.4344 -80.1237 -3
+ endloop
+ endfacet
+ facet normal -0.970367 -0.241637 0
+ outer loop
+ vertex -82.3838 -80.3269 -3
+ vertex -82.3838 -80.3269 0
+ vertex -82.4344 -80.1237 0
+ endloop
+ endfacet
+ facet normal -0.951045 -0.309054 0
+ outer loop
+ vertex -82.3191 -80.526 -3
+ vertex -82.3838 -80.3269 0
+ vertex -82.3838 -80.3269 -3
+ endloop
+ endfacet
+ facet normal -0.951045 -0.309054 0
+ outer loop
+ vertex -82.3191 -80.526 -3
+ vertex -82.3191 -80.526 0
+ vertex -82.3838 -80.3269 0
+ endloop
+ endfacet
+ facet normal -0.927121 -0.374763 0
+ outer loop
+ vertex -82.2406 -80.7202 -3
+ vertex -82.3191 -80.526 0
+ vertex -82.3191 -80.526 -3
+ endloop
+ endfacet
+ facet normal -0.927121 -0.374763 0
+ outer loop
+ vertex -82.2406 -80.7202 -3
+ vertex -82.2406 -80.7202 0
+ vertex -82.3191 -80.526 0
+ endloop
+ endfacet
+ facet normal -0.898778 -0.438405 0
+ outer loop
+ vertex -82.1488 -80.9084 -3
+ vertex -82.2406 -80.7202 0
+ vertex -82.2406 -80.7202 -3
+ endloop
+ endfacet
+ facet normal -0.898778 -0.438405 0
+ outer loop
+ vertex -82.1488 -80.9084 -3
+ vertex -82.1488 -80.9084 0
+ vertex -82.2406 -80.7202 0
+ endloop
+ endfacet
+ facet normal -0.86609 -0.499888 0
+ outer loop
+ vertex -82.0441 -81.0898 -3
+ vertex -82.1488 -80.9084 0
+ vertex -82.1488 -80.9084 -3
+ endloop
+ endfacet
+ facet normal -0.86609 -0.499888 0
+ outer loop
+ vertex -82.0441 -81.0898 -3
+ vertex -82.0441 -81.0898 0
+ vertex -82.1488 -80.9084 0
+ endloop
+ endfacet
+ facet normal -0.829026 -0.55921 0
+ outer loop
+ vertex -81.927 -81.2634 -3
+ vertex -82.0441 -81.0898 0
+ vertex -82.0441 -81.0898 -3
+ endloop
+ endfacet
+ facet normal -0.829026 -0.55921 0
+ outer loop
+ vertex -81.927 -81.2634 -3
+ vertex -81.927 -81.2634 0
+ vertex -82.0441 -81.0898 0
+ endloop
+ endfacet
+ facet normal -0.788039 -0.615626 0
+ outer loop
+ vertex -81.7981 -81.4284 -3
+ vertex -81.927 -81.2634 0
+ vertex -81.927 -81.2634 -3
+ endloop
+ endfacet
+ facet normal -0.788039 -0.615626 0
+ outer loop
+ vertex -81.7981 -81.4284 -3
+ vertex -81.7981 -81.4284 0
+ vertex -81.927 -81.2634 0
+ endloop
+ endfacet
+ facet normal -0.743152 -0.669123 0
+ outer loop
+ vertex -81.658 -81.584 -3
+ vertex -81.7981 -81.4284 0
+ vertex -81.7981 -81.4284 -3
+ endloop
+ endfacet
+ facet normal -0.743152 -0.669123 0
+ outer loop
+ vertex -81.658 -81.584 -3
+ vertex -81.658 -81.584 0
+ vertex -81.7981 -81.4284 0
+ endloop
+ endfacet
+ facet normal -0.694577 -0.719418 0
+ outer loop
+ vertex -81.5074 -81.7294 -3
+ vertex -81.658 -81.584 0
+ vertex -81.658 -81.584 -3
+ endloop
+ endfacet
+ facet normal -0.694577 -0.719418 0
+ outer loop
+ vertex -81.5074 -81.7294 -3
+ vertex -81.5074 -81.7294 0
+ vertex -81.658 -81.584 0
+ endloop
+ endfacet
+ facet normal -0.642811 -0.766025 0
+ outer loop
+ vertex -81.347 -81.864 -3
+ vertex -81.5074 -81.7294 0
+ vertex -81.5074 -81.7294 -3
+ endloop
+ endfacet
+ facet normal -0.642811 -0.766025 0
+ outer loop
+ vertex -81.347 -81.864 -3
+ vertex -81.347 -81.864 0
+ vertex -81.5074 -81.7294 0
+ endloop
+ endfacet
+ facet normal -0.587859 -0.808963 0
+ outer loop
+ vertex -81.1776 -81.9871 -3
+ vertex -81.347 -81.864 0
+ vertex -81.347 -81.864 -3
+ endloop
+ endfacet
+ facet normal -0.587859 -0.808963 0
+ outer loop
+ vertex -81.1776 -81.9871 -3
+ vertex -81.1776 -81.9871 0
+ vertex -81.347 -81.864 0
+ endloop
+ endfacet
+ facet normal -0.529999 -0.847998 0
+ outer loop
+ vertex -81 -82.0981 -3
+ vertex -81.1776 -81.9871 0
+ vertex -81.1776 -81.9871 -3
+ endloop
+ endfacet
+ facet normal -0.529999 -0.847998 0
+ outer loop
+ vertex -81 -82.0981 -3
+ vertex -81 -82.0981 0
+ vertex -81.1776 -81.9871 0
+ endloop
+ endfacet
+ facet normal -0.469423 -0.882973 0
+ outer loop
+ vertex -80.8151 -82.1964 -3
+ vertex -81 -82.0981 0
+ vertex -81 -82.0981 -3
+ endloop
+ endfacet
+ facet normal -0.469423 -0.882973 0
+ outer loop
+ vertex -80.8151 -82.1964 -3
+ vertex -80.8151 -82.1964 0
+ vertex -81 -82.0981 0
+ endloop
+ endfacet
+ facet normal -0.406449 -0.913674 0
+ outer loop
+ vertex -80.6238 -82.2815 -3
+ vertex -80.8151 -82.1964 0
+ vertex -80.8151 -82.1964 -3
+ endloop
+ endfacet
+ facet normal -0.406449 -0.913674 0
+ outer loop
+ vertex -80.6238 -82.2815 -3
+ vertex -80.6238 -82.2815 0
+ vertex -80.8151 -82.1964 0
+ endloop
+ endfacet
+ facet normal -0.342318 -0.939584 0
+ outer loop
+ vertex -80.427 -82.3532 -3
+ vertex -80.6238 -82.2815 0
+ vertex -80.6238 -82.2815 -3
+ endloop
+ endfacet
+ facet normal -0.342318 -0.939584 0
+ outer loop
+ vertex -80.427 -82.3532 -3
+ vertex -80.427 -82.3532 0
+ vertex -80.6238 -82.2815 0
+ endloop
+ endfacet
+ facet normal -0.275668 -0.961253 0
+ outer loop
+ vertex -80.2258 -82.4109 -3
+ vertex -80.427 -82.3532 0
+ vertex -80.427 -82.3532 -3
+ endloop
+ endfacet
+ facet normal -0.275668 -0.961253 0
+ outer loop
+ vertex -80.2258 -82.4109 -3
+ vertex -80.2258 -82.4109 0
+ vertex -80.427 -82.3532 0
+ endloop
+ endfacet
+ facet normal -0.20767 -0.978199 0
+ outer loop
+ vertex -80.0209 -82.4544 -3
+ vertex -80.2258 -82.4109 0
+ vertex -80.2258 -82.4109 -3
+ endloop
+ endfacet
+ facet normal -0.20767 -0.978199 0
+ outer loop
+ vertex -80.0209 -82.4544 -3
+ vertex -80.0209 -82.4544 0
+ vertex -80.2258 -82.4109 0
+ endloop
+ endfacet
+ facet normal -0.139482 -0.990225 0
+ outer loop
+ vertex -79.8136 -82.4836 -3
+ vertex -80.0209 -82.4544 0
+ vertex -80.0209 -82.4544 -3
+ endloop
+ endfacet
+ facet normal -0.139482 -0.990225 0
+ outer loop
+ vertex -79.8136 -82.4836 -3
+ vertex -79.8136 -82.4836 0
+ vertex -80.0209 -82.4544 0
+ endloop
+ endfacet
+ facet normal -0.0697198 -0.997567 0
+ outer loop
+ vertex -79.6047 -82.4982 -3
+ vertex -79.8136 -82.4836 0
+ vertex -79.8136 -82.4836 -3
+ endloop
+ endfacet
+ facet normal -0.0697198 -0.997567 0
+ outer loop
+ vertex -79.6047 -82.4982 -3
+ vertex -79.6047 -82.4982 0
+ vertex -79.8136 -82.4836 0
+ endloop
+ endfacet
+ facet normal 0 -1 0
+ outer loop
+ vertex -79.5018 -82.4982 -3
+ vertex -79.6047 -82.4982 0
+ vertex -79.6047 -82.4982 -3
+ endloop
+ endfacet
+ facet normal 0 -1 0
+ outer loop
+ vertex -79.5018 -82.4982 -3
+ vertex -79.5018 -82.4982 0
+ vertex -79.6047 -82.4982 0
+ endloop
+ endfacet
+ facet normal -0.707107 -0.707107 0
+ outer loop
+ vertex -79.5 -82.5 -3
+ vertex -79.5018 -82.4982 0
+ vertex -79.5018 -82.4982 -3
+ endloop
+ endfacet
+ facet normal -0.707107 -0.707107 0
+ outer loop
+ vertex -79.5 -82.5 -3
+ vertex -79.5 -82.5 0
+ vertex -79.5018 -82.4982 0
+ endloop
+ endfacet
+ facet normal 0 -1 0
+ outer loop
+ vertex 79.5 -82.5 -3
+ vertex -79.5 -82.5 0
+ vertex -79.5 -82.5 -3
+ endloop
+ endfacet
+ facet normal 0 -1 0
+ outer loop
+ vertex 79.5 -82.5 -3
+ vertex 79.5 -82.5 0
+ vertex -79.5 -82.5 0
+ endloop
+ endfacet
+ facet normal 0.707107 -0.707107 0
+ outer loop
+ vertex 79.5018 -82.4982 -3
+ vertex 79.5 -82.5 0
+ vertex 79.5 -82.5 -3
+ endloop
+ endfacet
+ facet normal 0.707107 -0.707107 0
+ outer loop
+ vertex 79.5018 -82.4982 -3
+ vertex 79.5018 -82.4982 0
+ vertex 79.5 -82.5 0
+ endloop
+ endfacet
+endsolid OpenSCAD_Model
diff --git a/resources/profiles/Creality/ender3.svg b/resources/profiles/Creality/ender3.svg
index 06910afdf..9dac7a62e 100644
--- a/resources/profiles/Creality/ender3.svg
+++ b/resources/profiles/Creality/ender3.svg
@@ -1,13 +1,5 @@
<svg id="Layer_1" data-name="Layer 1" xmlns="http://www.w3.org/2000/svg" width="220.5mm" height="220.5mm" viewBox="0 0 625.1 625.1">
<title>ender3_bed_texture</title>
- <g>
- <path d="M522.6,597.9h-8.1V583.2h8.1v1.5h-6.4v4.8h6V591h-6v5.3h6.4Z" style="fill: #fff"/>
- <path d="M533.1,597.9v-7.1a2.8,2.8,0,0,0-.6-2,2.2,2.2,0,0,0-1.9-.7,3.2,3.2,0,0,0-2.5.9,4.6,4.6,0,0,0-.8,3.1v5.8h-1.7v-11H527l.2,1.5h.1a3.8,3.8,0,0,1,1.5-1.3,4.2,4.2,0,0,1,2-.4,4,4,0,0,1,3,1,3.8,3.8,0,0,1,1,3v7.2Z" style="fill: #fff"/>
- <path d="M545.7,596.4h-.1a4.4,4.4,0,0,1-6.8.2,8,8,0,0,1,0-8.4,4,4,0,0,1,3.3-1.5,4.1,4.1,0,0,1,3.5,1.6h.1v-6h1.6v15.6h-1.3Zm-3.4.3a2.8,2.8,0,0,0,2.5-1,4.6,4.6,0,0,0,.8-2.9v-.4a5.5,5.5,0,0,0-.8-3.3,2.8,2.8,0,0,0-2.5-1,2.5,2.5,0,0,0-2.2,1.1,6.1,6.1,0,0,0-.8,3.2,5.6,5.6,0,0,0,.8,3.2A2.5,2.5,0,0,0,542.3,596.7Z" style="fill: #fff"/>
- <path d="M555.4,598.1a4.9,4.9,0,0,1-3.8-1.5,5.5,5.5,0,0,1-1.4-4.1,6,6,0,0,1,1.3-4.2,4.1,4.1,0,0,1,3.5-1.6,3.9,3.9,0,0,1,3.2,1.4,5,5,0,0,1,1.2,3.5v1.1h-7.5a4.2,4.2,0,0,0,.9,2.9,3.5,3.5,0,0,0,2.7,1,9.1,9.1,0,0,0,3.5-.7v1.5l-1.7.5Zm-.5-10a3.2,3.2,0,0,0-2.1.8,4.3,4.3,0,0,0-.9,2.4h5.7a3.6,3.6,0,0,0-.7-2.4A2.5,2.5,0,0,0,554.9,588.1Z" style="fill: #fff"/>
- <path d="M567.3,586.7h1.3l-.3,1.6-1.2-.2a2.9,2.9,0,0,0-2.2,1.1,3.6,3.6,0,0,0-1,2.7v5.9h-1.6v-11h1.3l.2,2h.1a4.6,4.6,0,0,1,1.5-1.6A3.1,3.1,0,0,1,567.3,586.7Z" style="fill: #fff"/>
- <path d="M584.3,586.7a3.6,3.6,0,0,1-.8,2.3,4,4,0,0,1-2.2,1.2h0a4.9,4.9,0,0,1,2.6,1.2,3.4,3.4,0,0,1,.8,2.3,3.9,3.9,0,0,1-1.4,3.2,6.6,6.6,0,0,1-4.2,1.2l-2.1-.2a7,7,0,0,1-1.9-.6v-1.6l2.1.7,2,.3c2.5,0,3.8-1,3.8-3s-1.4-2.7-4.2-2.7h-1.4v-1.4h1.4a4.1,4.1,0,0,0,2.7-.8,2.4,2.4,0,0,0,1-2.1,1.9,1.9,0,0,0-.7-1.6,2.6,2.6,0,0,0-2-.7,5.7,5.7,0,0,0-1.8.3,7,7,0,0,0-1.9,1l-.9-1.2a10.3,10.3,0,0,1,2.1-1.1,10.1,10.1,0,0,1,2.5-.4,4.8,4.8,0,0,1,3.3,1A3.2,3.2,0,0,1,584.3,586.7Z" style="fill: #fff"/>
- </g>
<path d="M567.7,567.8" style="fill: none;stroke: #fff;stroke-linecap: round;stroke-linejoin: round;stroke-width: 1.5px"/>
<path d="M.8,624.4" style="fill: none;stroke: #fff;stroke-linecap: round;stroke-linejoin: round;stroke-width: 1.5px"/>
<line x1="624.4" y1="624.4" x2="624.4" y2="0.8" style="fill: none;stroke: #fff;stroke-linecap: round;stroke-linejoin: round;stroke-width: 1.5px"/>
diff --git a/resources/profiles/Creality/ender3_bed.stl b/resources/profiles/Creality/ender3_bed.stl
index fb8f86d09..724d8905e 100644
--- a/resources/profiles/Creality/ender3_bed.stl
+++ b/resources/profiles/Creality/ender3_bed.stl
Binary files 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 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="350mm" height="350mm" version="1.1" viewBox="0 0 350 350" xmlns="http://www.w3.org/2000/svg">
+ <rect x=".25" y=".25" width="349.5" height="349.5" fill="none" stroke="#fff" stroke-width=".5"/>
+</svg>
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/FLSun.idx b/resources/profiles/FLSun.idx
new file mode 100644
index 000000000..598ff0fd8
--- /dev/null
+++ b/resources/profiles/FLSun.idx
@@ -0,0 +1,2 @@
+min_slic3r_version = 2.3.0-rc2
+0.0.1 Initial Version
diff --git a/resources/profiles/FLSun.ini b/resources/profiles/FLSun.ini
new file mode 100644
index 000000000..9b755884d
--- /dev/null
+++ b/resources/profiles/FLSun.ini
@@ -0,0 +1,842 @@
+# Print profiles for the FLSun Delta printers.
+##
+# Author: https://github.com/Foxies-CSTL/PrusaSlicer
+## Initial PR: https://github.com/prusa3d/PrusaSlicer/pull/5582
+[vendor]
+# Vendor name will be shown by the Config Wizard.
+name = FLSun
+# 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
+# Where to get the updates from?
+config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/FLSun/
+# 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.
+# Printer model name will be shown by the installation wizard.
+
+[printer_model:QQSP]
+name = FLSun QQS Pro
+variants = 0.4; 0.6
+technology = FFF
+bed_model = QQSP_bed.stl
+bed_texture = QQSP.svg
+default_materials = Generic PLA @FLSUN; Generic PETG @FLSUN; Generic ABS @FLSUN; Generic SPLA @FLSUN; Generic FLEX @FLSUN
+
+[printer_model:Q5]
+name = FLSun Q5
+variants = 0.4; 0.6
+technology = FFF
+bed_model = Q5_bed.stl
+bed_texture = Q5.svg
+default_materials = Generic PLA @FLSUN; Generic PETG @FLSUN; Generic ABS @FLSUN; Generic SPLA @FLSUN; Generic FLEX @FLSUN
+
+#########################################
+###### begin Common print presets #######
+#########################################
+
+# Common print preset
+[print:*common_flsunq*]
+avoid_crossing_perimeters = 1
+avoid_crossing_perimeters_max_detour = 0
+bottom_solid_min_thickness = 0.5
+bridge_acceleration = 800
+bridge_angle = 0
+bridge_flow_ratio = 0.8
+bridge_speed = 30
+brim_width = 0
+clip_multipart_objects = 1
+compatible_printers =
+complete_objects = 0
+default_acceleration = 800
+dont_support_bridges = 1
+elefant_foot_compensation = 0.2
+ensure_vertical_shell_thickness = 1
+external_fill_pattern = rectilinear
+external_perimeters_first = 0
+external_perimeter_extrusion_width = 0.45
+extra_perimeters = 0
+extruder_clearance_height = 45
+extruder_clearance_radius = 45
+extrusion_width = 0.45
+fill_angle = 45
+fill_density = 15%
+fill_pattern = gyroid
+first_layer_acceleration = 800
+first_layer_extrusion_width = 0.42
+first_layer_height = 0.2
+first_layer_speed = 20
+gap_fill_speed = 40
+gcode_comments = 0
+infill_acceleration = 800
+infill_every_layers = 1
+infill_extruder = 1
+infill_extrusion_width = 0.45
+infill_first = 0
+infill_only_where_needed = 0
+infill_overlap = 25%
+interface_shells = 0
+ironing = 0
+ironing_flowrate = 15%
+ironing_spacing = 0.1
+ironing_speed = 15
+ironing_type = top
+max_print_speed = 200
+max_volumetric_extrusion_rate_slope_negative = 0
+max_volumetric_extrusion_rate_slope_positive = 0
+max_volumetric_speed = 0
+min_skirt_length = 4
+notes =
+overhangs = 1
+only_retract_when_crossing_perimeters = 0
+ooze_prevention = 0
+output_filename_format = {input_filename_base}_{filament_type[0]}_{print_time}.gco
+perimeters = 3
+perimeter_acceleration = 800
+perimeter_extruder = 1
+perimeter_extrusion_width = 0.45
+perimeter_speed = 45
+post_process =
+print_settings_id =
+raft_layers = 0
+resolution = 0
+seam_position = nearest
+single_extruder_multi_material_priming = 0
+skirts = 2
+skirt_distance = 5
+skirt_height = 1
+small_perimeter_speed = 25
+solid_infill_below_area = 0
+solid_infill_every_layers = 0
+solid_infill_extruder = 1
+solid_infill_extrusion_width = 0.45
+spiral_vase = 0
+standby_temperature_delta = -5
+support_material = 1
+support_material_auto = 0
+support_material_extruder = 1
+support_material_extrusion_width = 0.38
+support_material_interface_extruder = 0
+support_material_angle = 0
+support_material_buildplate_only = 0
+support_material_enforce_layers = 0
+support_material_contact_distance = 0.2
+support_material_interface_contact_loops = 0
+support_material_interface_layers = 2
+support_material_interface_spacing = 0.2
+support_material_interface_speed = 100%
+support_material_pattern = rectilinear
+support_material_spacing = 2.5
+support_material_speed = 60
+support_material_synchronize_layers = 0
+support_material_threshold = 45
+support_material_with_sheath = 0
+support_material_xy_spacing = 60%
+thin_walls = 0
+top_infill_extrusion_width = 0.4
+top_solid_infill_speed = 40
+top_solid_min_thickness = 0.6
+travel_speed = 150
+wipe_tower = 0
+wipe_tower_bridging = 10
+wipe_tower_rotation_angle = 0
+wipe_tower_width = 60
+wipe_tower_x = 170
+wipe_tower_y = 140
+xy_size_compensation = 0
+
+## QQS
+
+[print:*QQSP*]
+bridge_acceleration = 1000
+default_acceleration = 1500
+first_layer_acceleration = 1000
+infill_acceleration = 800
+max_print_speed = 200
+perimeter_acceleration = 800
+
+## Q5
+
+[print:*Q5*]
+bridge_acceleration = 1000
+default_acceleration = 800
+first_layer_acceleration = 800
+infill_acceleration = 1000
+max_print_speed = 150
+perimeter_acceleration = 800
+
+# Print parameters common to a 0.6mm diameter nozzle.
+
+[print:*0.6nozzleFLSUN*]
+bridge_acceleration = 1000
+bridge_flow_ratio = 0.95
+bridge_speed = 25
+default_acceleration = 1000
+external_perimeter_extrusion_width = 0.65
+extrusion_width = 0.65
+first_layer_acceleration = 1000
+first_layer_extrusion_width = 0.65
+fill_density = 15%
+fill_pattern = gyroid
+infill_acceleration = 1000
+infill_extrusion_width = 0.68
+perimeter_acceleration = 800
+perimeter_extrusion_width = 0.65
+solid_infill_extrusion_width = 0.68
+support_material_speed = 40
+support_material_contact_distance = 0.15
+support_material_extrusion_width = 0.55
+support_material_xy_spacing = 80%
+top_infill_extrusion_width = 0.6
+travel_speed = 150
+output_filename_format = {input_filename_base}_{nozzle_diameter[0]}n_{filament_type[0]}_{print_time}.gco
+
+
+# XXXXXXXXXXXXXXXXXXXX
+# XXX--- 0.08mm ---XXX
+# XXXXXXXXXXXXXXXXXXXX
+
+[print:*0.08mm_flsunq*]
+inherits = *common_flsunq*
+bottom_solid_layers = 10
+bridge_flow_ratio = 0.7
+layer_height = 0.08
+support_material_contact_distance = 0.06
+support_material_spacing = 1.5
+top_solid_layers = 12
+
+[print:0.08mm DETAIL @FLSUN]
+inherits = *0.08mm_flsunq*; *QQSP*
+compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_Q(QSP|5).*/ and nozzle_diameter[0]==0.4
+bridge_acceleration = 200
+bridge_speed = 20
+external_perimeter_speed = 70%
+first_layer_acceleration = 500
+first_layer_speed = 40%
+gap_fill_speed = 20
+infill_acceleration = 800
+infill_speed = 40
+max_print_speed = 80
+perimeter_acceleration = 300
+perimeter_speed = 30
+small_perimeter_speed = 70%
+solid_infill_speed = 95%
+support_material_speed = 40
+top_solid_infill_speed = 60%
+
+# XXXXXXXXXXXXXXXXXXXX
+# XXX--- 0.15mm ---XXX
+# XXXXXXXXXXXXXXXXXXXX
+
+[print:*0.15mm_vase_flsunq*]
+inherits = *common_flsunq*
+avoid_crossing_perimeters = 1
+bottom_solid_min_thickness = 0.5
+bridge_flow_ratio = 0.9
+elefant_foot_compensation = 0.15
+ensure_vertical_shell_thickness = 1
+external_perimeter_extrusion_width = 0.9
+extra_perimeters = 1
+extrusion_width = 0.9
+first_layer_acceleration = 1000
+first_layer_height = 0.3
+first_layer_extrusion_width = 0.9
+first_layer_speed = 20
+fill_density = 0%
+infill_extrusion_width = 0.9
+ironing = 0
+layer_height = 0.15
+min_skirt_length = 4
+max_print_speed = 100
+only_retract_when_crossing_perimeters = 0
+perimeters = 1
+perimeter_extrusion_width = 0.9
+seam_position = aligned
+slice_closing_radius = 0.049
+solid_infill_extrusion_width = 0.6
+spiral_vase = 1
+support_material = 0
+top_solid_infill_speed = 40%
+top_solid_min_thickness = 0.6
+thin_walls = 0
+top_fill_pattern = rectilinear
+top_solid_layers = 0
+
+[print:0.15mm VASE @FLSUN]
+inherits = *0.15mm_vase_flsunq*
+compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_Q(QSP|5).*/ and nozzle_diameter[0]==0.4
+bottom_solid_layers = 5
+external_perimeter_speed = 50%
+gap_fill_speed = 40
+infill_speed = 100
+perimeter_speed = 80
+small_perimeter_speed = 25%
+solid_infill_speed = 33%
+
+[print:0.15mm VASE SPEED @FLSUN]
+inherits = *0.15mm_vase_flsunq*
+compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_Q(QSP|5).*/ and nozzle_diameter[0]==0.4
+bridge_speed = 80
+bottom_solid_layers = 3
+external_perimeter_speed = 60%
+gap_fill_speed = 30
+infill_speed = 80
+perimeter_speed = 90
+small_perimeter_speed = 50%
+solid_infill_speed = 80%
+
+# XXXXXXXXXXXXXXXXXXXX
+# XXX--- 0.16mm ---XXX
+# XXXXXXXXXXXXXXXXXXXX
+
+[print:*0.16mm_flsunq*]
+inherits = *common_flsunq*
+bottom_solid_layers = 5
+bridge_flow_ratio = 0.9
+layer_height = 0.16
+support_material_contact_distance = 0.12
+top_solid_layers = 6
+
+[print:0.16mm QUALITY @FLSUN]
+inherits = *0.16mm_flsunq*; *QQSP*
+compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_Q(QSP|5).*/ and nozzle_diameter[0]==0.4
+external_perimeter_speed = 50%
+fill_density = 15%
+fill_pattern = gyroid
+infill_speed = 80
+ironing = 0
+perimeter_speed = 90
+small_perimeter_speed = 25%
+solid_infill_speed = 50%
+top_solid_infill_speed = 30%
+
+[print:0.16mm SPEED @FLSUN]
+inherits = *0.16mm_flsunq*; *QQSP*
+compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_Q(QSP|5).*/ and nozzle_diameter[0]==0.4
+external_perimeter_speed = 50%
+infill_speed = 120
+perimeter_speed = 60
+small_perimeter_speed = 25%
+solid_infill_speed = 85%
+top_solid_infill_speed = 30%
+
+[print:0.16mm DETAIL @0.6 nozzle FLSUN]
+inherits = *0.16mm_flsunq*; *0.6nozzleFLSUN*
+# alias = 0.16mm DETAIL
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_FLSun.*/ and printer_notes=~/.*PRINTER_MODEL_Q(QSP|5).*/ and nozzle_diameter[0]==0.6
+external_perimeter_speed = 35
+infill_speed = 70
+max_print_speed = 80
+perimeter_speed = 40
+solid_infill_speed = 60
+top_solid_infill_speed = 45
+infill_extrusion_width = 0.65
+solid_infill_extrusion_width = 0.65
+
+# XXXXXXXXXXXXXXXXXXXX
+# XXX--- 0.20mm ---XXX
+# XXXXXXXXXXXXXXXXXXXX
+
+[print:*0.20mm_flsunq*]
+inherits = *common_flsunq*
+bottom_solid_layers = 4
+bridge_flow_ratio = 0.95
+layer_height = 0.20
+support_material_contact_distance = 0.2
+top_solid_layers = 5
+
+[print:0.20mm QUALITY @FLSUN]
+inherits = *0.20mm_flsunq*; *QQSP*
+avoid_crossing_perimeters = 1
+bridge_speed = 60
+compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_Q(QSP|5).*/ and nozzle_diameter[0]==0.4
+external_perimeter_speed = 50%
+fill_density = 15%
+gap_fill_speed = 30
+infill_speed = 80
+ironing = 0
+ironing_speed = 20
+perimeter_speed = 50
+small_perimeter_speed = 85%
+solid_infill_speed = 90%
+thin_walls = 0
+top_solid_infill_speed = 50%
+
+[print:0.20mm DETAIL @0.6 nozzle FLSUN]
+inherits = *0.20mm_flsunq*; *0.6nozzleFLSUN*
+# alias = 0.20mm DETAIL
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_FLSun.*/ and printer_notes=~/.*PRINTER_MODEL_Q(QSP|5).*/ and nozzle_diameter[0]==0.6
+external_perimeter_speed = 35
+infill_speed = 70
+max_print_speed = 80
+perimeter_speed = 45
+solid_infill_speed = 60
+top_solid_infill_speed = 45
+infill_extrusion_width = 0.65
+solid_infill_extrusion_width = 0.65
+
+[print:0.20mm SPEED @FLSUN]
+inherits = *0.20mm_flsunq*; *QQSP*
+compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_Q(QSP|5).*/ and nozzle_diameter[0]==0.4
+external_perimeter_speed = 50
+extra_perimeters = 1
+first_layer_speed = 35
+infill_speed = 90
+perimeter_speed = 60
+small_perimeter_speed = 50%
+solid_infill_speed = 85%
+top_solid_infill_speed = 40%
+
+# XXXXXXXXXXXXXXXXXXXX
+# XXX--- 0.24mm ---XXX
+# XXXXXXXXXXXXXXXXXXXX
+
+[print:*0.24mm_flsunq*]
+inherits = *common_flsunq*
+bottom_solid_layers = 4
+bridge_flow_ratio = 0.95
+layer_height = 0.24
+support_material_contact_distance = 0.18
+top_solid_layers = 4
+
+[print:0.24mm DRAFT @FLSUN]
+inherits = *0.24mm_flsunq*; *QQSP*
+compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_Q(QSP|5).*/ and nozzle_diameter[0]==0.4
+external_perimeter_speed = 50%
+first_layer_speed = 20%
+infill_speed = 120
+perimeter_speed = 60
+small_perimeter_speed = 50%
+solid_infill_speed = 95%
+top_solid_infill_speed = 50%
+
+# XXXXXXXXXXXXXXXXXXXX
+# XXX--- 0.30mm ---XXX
+# XXXXXXXXXXXXXXXXXXXX
+
+[print:*0.30mm_flsunq*]
+inherits = *common_flsunq*
+bottom_solid_layers = 3
+bridge_flow_ratio = 0.95
+external_perimeter_extrusion_width = 0.6
+extrusion_width = 0.5
+infill_extrusion_width = 0.5
+layer_height = 0.30
+perimeter_extrusion_width = 0.5
+solid_infill_extrusion_width = 0.5
+support_material_contact_distance = 0.22
+top_infill_extrusion_width = 0.45
+top_solid_layers = 4
+
+[print:0.30mm QUALITY @0.6 nozzle FLSUN]
+inherits = *0.30mm_flsunq*; *0.6nozzleFLSUN*
+# alias = 0.30mm QUALITY
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_FLSun.*/ and printer_notes=~/.*PRINTER_MODEL_Q(QSP|5).*/ and nozzle_diameter[0]==0.6
+external_perimeter_speed = 35
+infill_speed = 90
+max_print_speed = 100
+perimeter_speed = 45
+solid_infill_speed = 65
+top_solid_infill_speed = 45
+external_perimeter_extrusion_width = 0.68
+perimeter_extrusion_width = 0.68
+
+[print:0.30mm SPEED @FLSUN]
+inherits = *0.30mm_flsunq*; *QQSP*
+compatible_printers_condition = printer_notes=~/.*PRINTER_MODEL_Q(QSP|5).*/ and nozzle_diameter[0]==0.4
+external_perimeter_speed = 50%
+first_layer_speed = 20%
+infill_speed = 120
+perimeter_speed = 80
+small_perimeter_speed = 50%
+solid_infill_speed = 85%
+top_solid_infill_speed = 50%
+
+# XXXXXXXXXXXXXXXXXXXX
+# XXX--- 0.35mm ---XXX
+# XXXXXXXXXXXXXXXXXXXX
+
+[print:*0.35mm_flsunq*]
+inherits = *common_flsunq*
+bottom_solid_layers = 3
+external_perimeter_extrusion_width = 0.6
+external_perimeter_speed = 40
+first_layer_extrusion_width = 0.75
+layer_height = 0.35
+perimeter_extrusion_width = 0.65
+solid_infill_extrusion_width = 0.65
+solid_infill_speed = 60
+top_solid_infill_speed = 50
+top_solid_layers = 4
+
+[print:0.35mm SPEED @0.6 nozzle FLSUN]
+inherits = *0.35mm_flsunq*; *0.6nozzleFLSUN*
+# alias = 0.35mm SPEED
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_FLSun.*/ and printer_notes=~/.*PRINTER_MODEL_Q(QSP|5).*/ and nozzle_diameter[0]==0.6
+external_perimeter_speed = 45
+infill_speed = 100
+max_print_speed = 120
+perimeter_speed = 65
+solid_infill_speed = 60
+top_solid_infill_speed = 45
+external_perimeter_extrusion_width = 0.68
+perimeter_extrusion_width = 0.68
+
+# XXXXXXXXXXXXXXXXXXXX
+# XXX--- 0.40mm ---XXX
+# XXXXXXXXXXXXXXXXXXXX
+
+[print:*0.40mm_flsunq*]
+inherits = *common_flsunq*
+bottom_solid_layers = 3
+external_perimeter_extrusion_width = 0.6
+external_perimeter_speed = 40
+first_layer_extrusion_width = 0.65
+infill_acceleration = 2000
+infill_speed = 60
+layer_height = 0.4
+perimeter_acceleration = 800
+perimeter_extrusion_width = 0.65
+perimeter_speed = 50
+solid_infill_extrusion_width = 0.65
+solid_infill_speed = 60
+top_solid_infill_speed = 40
+top_solid_layers = 4
+
+[print:0.40mm DRAFT @0.6 nozzle FLSUN]
+inherits = *0.40mm_flsunq*; *0.6nozzleFLSUN*
+# alias = 0.40mm DRAFT
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_FLSun.*/ and printer_notes=~/.*PRINTER_MODEL_Q(QSP|5).*/ and nozzle_diameter[0]==0.6
+external_perimeter_speed = 60
+infill_speed = 100
+max_print_speed = 120
+perimeter_speed = 60
+solid_infill_speed = 60
+top_solid_infill_speed = 60
+external_perimeter_extrusion_width = 0.68
+perimeter_extrusion_width = 0.68
+infill_extrusion_width = 0.68
+solid_infill_extrusion_width = 0.68
+
+#########################################
+########### end print presets ###########
+#########################################
+
+#########################################
+######## begin filament presets #########
+#########################################
+
+# Common filament preset
+[filament:*common_flsunq*]
+cooling = 0
+compatible_printers =
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_FLSun.*/ and printer_notes=~/.*PRINTER_MODEL_Q(QSP|5).*/
+end_filament_gcode = "; Filament-specific end gcode"
+extrusion_multiplier = 1
+filament_cost = 0
+filament_density = 0
+filament_diameter = 1.75
+filament_notes = ""
+filament_settings_id = ""
+filament_soluble = 0
+min_fan_speed = 20
+min_print_speed = 15
+slowdown_below_layer_time = 15
+start_filament_gcode = "; Filament gcode\n;M900 K{if nozzle_diameter[0]==0.6}0.12{else}0.22{endif} ; Linear Advance 1.5\n"
+
+[filament:*PLA_flsunq*]
+inherits = *common_flsunq*
+bed_temperature = 60
+bridge_fan_speed = 95
+cooling = 1
+disable_fan_first_layers = 1
+fan_always_on = 1
+fan_below_layer_time = 100
+filament_colour = #FF3232
+filament_density = 1.24
+filament_deretract_speed = 30
+filament_retract_length = 3
+filament_retract_lift = nil
+filament_retract_speed = 30
+filament_max_volumetric_speed = 10
+filament_type = PLA
+filament_wipe = nil
+first_layer_bed_temperature = 60
+first_layer_temperature = 205
+max_fan_speed = 90
+min_fan_speed = 50
+temperature = 200
+
+[filament:*PLA_VASE_flsunq*]
+inherits = *PLA_flsunq*
+bridge_fan_speed = 100
+disable_fan_first_layers = 3
+fan_below_layer_time = 60
+max_fan_speed = 100
+min_fan_speed = 35
+min_print_speed = 10
+slowdown_below_layer_time = 5
+
+[filament:*SPLA_flsunq*]
+inherits = *common_flsunq*
+bed_temperature = 80
+bridge_fan_speed = 100
+cooling = 1
+disable_fan_first_layers = 1
+fan_always_on = 1
+fan_below_layer_time = 100
+filament_colour = #008000
+filament_density = 1.24
+filament_deretract_speed = 70
+filament_max_volumetric_speed = 8
+filament_retract_length = 7.5
+filament_retract_lift = nil
+filament_retract_speed = 70
+filament_type = PLA
+filament_wipe = nil
+first_layer_bed_temperature = 80
+first_layer_temperature = 230
+max_fan_speed = 70
+min_fan_speed = 50
+temperature = 215
+
+[filament:*PET_flsunq*]
+inherits = *common_flsunq*
+bed_temperature = 80
+bridge_fan_speed = 100
+cooling = 1
+disable_fan_first_layers = 3
+fan_always_on = 1
+fan_below_layer_time = 20
+filament_colour = #FFFFFF
+filament_density = 1.27
+filament_deretract_speed = 25
+filament_max_volumetric_speed = 8
+filament_retract_length = 4
+filament_retract_lift = 0.2
+filament_retract_speed = 45
+filament_type = PETG
+filament_wipe = 1
+first_layer_bed_temperature =80
+first_layer_temperature = 240
+max_fan_speed = 50
+min_fan_speed = 20
+temperature = 230
+
+[filament:*FLEX_flsunq*]
+inherits = *common_flsunq*
+bed_temperature = 50
+bridge_fan_speed = 80
+compatible_printers_condition = nozzle_diameter[0]>0.35
+cooling = 1
+disable_fan_first_layers = 3
+extrusion_multiplier = 1.15
+fan_always_on = 0
+fan_below_layer_time = 100
+filament_colour = #0000FF
+filament_density = 1.22
+filament_deretract_speed = 25
+filament_max_volumetric_speed = 1.35
+filament_retract_length = 0.8
+filament_retract_lift = nil
+filament_retract_speed = nil
+filament_type = FLEX
+filament_wipe = 0
+first_layer_bed_temperature = 50
+first_layer_temperature = 240
+slowdown_below_layer_time = 10
+start_filament_gcode = "; Filament gcode\n;M900 K0; Disable Linear Advance 1.5\n"
+temperature = 240
+
+[filament:*ABS_flsunq*]
+inherits = *common_flsunq*
+bed_temperature = 90
+bridge_fan_speed = 30
+cooling = 0
+disable_fan_first_layers = 3
+fan_always_on = 0
+fan_below_layer_time = 20
+filament_colour = #FF8000
+filament_density = 1.04
+filament_deretract_speed = nil
+filament_retract_length = 5
+filament_retract_lift = nil
+filament_retract_speed = 50
+filament_max_volumetric_speed = 10
+filament_type = ABS
+filament_wipe = nil
+first_layer_bed_temperature = 90
+first_layer_temperature = 245
+max_fan_speed = 0
+min_fan_speed = 0
+slowdown_below_layer_time = 20
+temperature = 245
+top_fan_speed = 0
+
+[filament:Generic PLA @FLSUN]
+inherits = *PLA_flsunq*
+filament_vendor = Generic
+
+[filament:Generic PLA VASE @FLSUN]
+inherits = *PLA_VASE_flsunq*
+filament_vendor = Generic
+
+[filament:Generic PETG @FLSUN]
+inherits = *PET_flsunq*
+filament_vendor = Generic
+
+[filament:Generic ABS @FLSUN]
+inherits = *ABS_flsunq*
+filament_vendor = Generic
+
+[filament:Generic FLEX @FLSUN]
+inherits = *FLEX_flsunq*
+filament_vendor = Generic
+
+[filament:Generic SPLA @FLSUN]
+inherits = *SPLA_flsunq*
+filament_vendor = Generic
+
+#########################################
+######### end filament presets ##########
+#########################################
+
+#########################################
+######### begin printer presets #########
+#########################################
+
+# Common printer preset
+[printer:*common_flsunq*]
+printer_technology = FFF
+before_layer_gcode = ;BEFORE_LAYER_CHANGE\nG92 E0.0\n;[layer_z]\n\n
+between_objects_gcode =
+deretract_speed = 40
+end_gcode =
+extruder_colour = ""
+extruder_offset = 0x0
+gcode_flavor = marlin
+layer_gcode = ;AFTER_LAYER_CHANGE\n;[layer_z]
+machine_min_extruding_rate = 0,0
+machine_min_travel_rate = 0,0
+max_layer_height = 0.32
+min_layer_height = 0.08
+nozzle_diameter = 0.4
+printer_notes =
+printer_settings_id =
+remaining_times = 0
+retract_before_travel = 2
+retract_before_wipe = 70%
+retract_layer_change = 0
+retract_length = 0
+retract_length_toolchange = 1
+retract_lift = 0
+retract_lift_above = 0
+retract_lift_below = 0
+retract_restart_extra = 0
+retract_restart_extra_toolchange = 0
+silent_mode = 0
+single_extruder_multi_material = 0
+start_gcode =
+toolchange_gcode =
+use_firmware_retraction = 0
+use_relative_e_distances = 1
+variable_layer_height = 1
+wipe = 1
+z_offset = 0
+default_print_profile = 0.20mm QUALITY @FLSUN
+default_filament_profile = Generic PLA @FLSUN
+
+[printer:FLSun QQS Pro]
+inherits = *common_flsunq*
+bed_shape = 129.505x11.3302,128.025x22.5743,125.57x33.6465,122.16x44.4626,117.82x54.9404,112.583x65,106.49x74.5649,99.5858x83.5624,91.9239x91.9239,83.5624x99.5858,74.5649x106.49,65x112.583,54.9404x117.82,44.4626x122.16,33.6465x125.57,22.5743x128.025,11.3302x129.505,7.9602e-15x130,-11.3302x129.505,-22.5743x128.025,-33.6465x125.57,-44.4626x122.16,-54.9404x117.82,-65x112.583,-74.5649x106.49,-83.5624x99.5858,-91.9239x91.9239,-99.5858x83.5624,-106.49x74.5649,-112.583x65,-117.82x54.9404,-122.16x44.4626,-125.57x33.6465,-128.025x22.5743,-129.505x11.3302,-130x1.59204e-14,-129.505x-11.3302,-128.025x-22.5743,-125.57x-33.6465,-122.16x-44.4626,-117.82x-54.9404,-112.583x-65,-106.49x-74.5649,-99.5858x-83.5624,-91.9239x-91.9239,-83.5624x-99.5858,-74.5649x-106.49,-65x-112.583,-54.9404x-117.82,-44.4626x-122.16,-33.6465x-125.57,-22.5743x-128.025,-11.3302x-129.505,-2.38806e-14x-130,11.3302x-129.505,22.5743x-128.025,33.6465x-125.57,44.4626x-122.16,54.9404x-117.82,65x-112.583,74.5649x-106.49,83.5624x-99.5858,91.9239x-91.9239,99.5858x-83.5624,106.49x-74.5649,112.583x-65,117.82x-54.9404,122.16x-44.4626,125.57x-33.6465,128.025x-22.5743,129.505x-11.3302,130x-3.18408e-14
+end_gcode = ; printing object ENDGCODE\nG92 E0.0 ; prepare to retract\nG1 E-6 F3000; retract to avoid stringing\n; Anti-stringing end wiggle\n{if layer_z < max_print_height}G1 Z{min(layer_z+100, max_print_height)}{endif} F4000 ; Move print head up\nG1 X0 Y120 F3000 ; present print\n; Reset print setting overrides\nG92 E0\nM200 D0 ; disable volumetric e\nM220 S100 ; reset speed factor to 100%\nM221 S100 ; reset extruder factor to 100%\n;M900 K0 ; reset linear acceleration(Marlin)\n; Shut down printer\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM18 S180 ;disable motors after 180s\nM300 S40 P10 ; Bip\nM117 Print finish.
+machine_max_acceleration_e = 3000,800
+machine_max_acceleration_extruding = 1500,800
+machine_max_acceleration_retracting = 2000,800
+machine_max_acceleration_x = 1500,800
+machine_max_acceleration_y = 1500,800
+machine_max_acceleration_z = 1500,800
+machine_max_feedrate_e = 60,30
+machine_max_feedrate_x = 200,150
+machine_max_feedrate_y = 200,150
+machine_max_feedrate_z = 200,150
+machine_max_jerk_e = 5,5
+machine_max_jerk_x = 5,10
+machine_max_jerk_y = 5,10
+machine_max_jerk_z = 5,10
+max_print_height = 360
+nozzle_diameter = 0.4
+printer_model = QQSP
+printer_variant = 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_FLSun\nPRINTER_MODEL_QQSP\nPRINTER_HAS_BOWDEN\n
+retract_length = 5
+retract_speed = 30
+retract_lift = 0.4
+silent_mode = 1
+start_gcode = ;STARTGCODE\nM117 Initializing\n; Set coordinate modes\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\n; Reset speed and extrusion rates\nM200 D0 ; disable volumetric E\nM220 S100 ; reset speed\n; Set initial warmup temps\nM117 Nozzle preheat\nM104 S100 ; preheat extruder to no ooze temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed final temp\nM300 S40 P10 ; Bip\n; Home\nM117 Homing\nG28 ; home all with default mesh bed level\n; For ABL users put G29 for a leveling request\n; Final warmup routine\nM117 Final warmup\nM104 S[first_layer_temperature] ; set extruder final temp\nM109 S[first_layer_temperature] ; wait for extruder final temp\nM190 S[first_layer_bed_temperature] ; wait for bed final temp\nM300 S440 P200 ; 1st beep for printer ready and allow some time to clean nozzle\nM300 S0 P250 ; wait between dual beep\nM300 S440 P200 ; 2nd beep for printer ready\nG4 S10 ; wait to clean the nozzle\nM300 S440 P200 ; 3rd beep for ready to start printing\n; Prime line routine\nM117 Printing prime line\n;M900 K0; Disable Linear Advance (Marlin) for prime line\nG92 E0.0; reset extrusion distance\nG1 X-54.672 Y-95.203 Z0.3 F4000; go outside print area\nG92 E0.0; reset extrusion distance\nG1 E2 F1000 ; de-retract and push ooze\nG3 X38.904 Y-102.668 I54.672 J95.105 E20.999\nG3 X54.671 Y-95.203 I-38.815 J102.373 E5.45800\nG92 E0.0\nG1 E-5 F3000 ; retract 5mm\nG1 X52.931 Y-96.185 F1000 ; wipe\nG1 X50.985 Y-97.231 F1000 ; wipe\nG1 X49.018 Y-98.238 F1000 ; wipe\nG1 X0 Y-109.798 F1000\nG1 E4.8 F1500; de-retract\nG92 E0.0 ; reset extrusion distance\n; Final print adjustments\nM117 Preparing to print\n;M82 ; extruder absolute mode\nM221 S{if layer_height<0.075}100{else}95{endif}\nM300 S40 P10 ; chirp\nM117 Print [input_filename]; Display: Printing started...
+thumbnails = 16x16,260x260
+use_relative_e_distances = 1
+use_volumetric_e = 0
+
+[printer:FLSun QQS Pro 0.6 nozzle]
+inherits = FLSun QQS Pro
+printer_variant = 0.6
+nozzle_diameter = 0.6
+max_layer_height = 0.40
+min_layer_height = 0.15
+default_print_profile = 0.30mm QUALITY @0.6 nozzle FLSUN
+retract_length = 3.5
+retract_lift = 0.4
+retract_speed = 30
+deretract_speed = 40
+retract_before_wipe = 70%
+retract_before_travel = 1
+
+[printer:FLSun Q5]
+inherits = *common_flsunq*
+bed_shape = 99.6195x8.71557,98.4808x17.3648,96.5926x25.8819,93.9693x34.202,90.6308x42.2618,86.6025x50,81.9152x57.3576,76.6044x64.2788,70.7107x70.7107,64.2788x76.6044,57.3576x81.9152,50x86.6025,42.2618x90.6308,34.202x93.9693,25.8819x96.5926,17.3648x98.4808,8.71557x99.6195,6.12323e-15x100,-8.71557x99.6195,-17.3648x98.4808,-25.8819x96.5926,-34.202x93.9693,-42.2618x90.6308,-50x86.6025,-57.3576x81.9152,-64.2788x76.6044,-70.7107x70.7107,-76.6044x64.2788,-81.9152x57.3576,-86.6025x50,-90.6308x42.2618,-93.9693x34.202,-96.5926x25.8819,-98.4808x17.3648,-99.6195x8.71557,-100x1.22465e-14,-99.6195x-8.71557,-98.4808x-17.3648,-96.5926x-25.8819,-93.9693x-34.202,-90.6308x-42.2618,-86.6025x-50,-81.9152x-57.3576,-76.6044x-64.2788,-70.7107x-70.7107,-64.2788x-76.6044,-57.3576x-81.9152,-50x-86.6025,-42.2618x-90.6308,-34.202x-93.9693,-25.8819x-96.5926,-17.3648x-98.4808,-8.71557x-99.6195,-1.83697e-14x-100,8.71557x-99.6195,17.3648x-98.4808,25.8819x-96.5926,34.202x-93.9693,42.2618x-90.6308,50x-86.6025,57.3576x-81.9152,64.2788x-76.6044,70.7107x-70.7107,76.6044x-64.2788,81.9152x-57.3576,86.6025x-50,90.6308x-42.2618,93.9693x-34.202,96.5926x-25.8819,98.4808x-17.3648,99.6195x-8.71557,100x-2.44929e-14
+end_gcode = M107\nM104 S0\nM140 S0\nG92 E1\nG1 E-1 F300\nG28 X0 Y0\n;M84\nM18 S180 ;disable motors after 180s\n
+machine_max_acceleration_e = 3000
+machine_max_acceleration_extruding = 1500
+machine_max_acceleration_retracting = 2000
+machine_max_acceleration_x = 1500
+machine_max_acceleration_y = 1500
+machine_max_acceleration_z = 1500
+machine_max_feedrate_e = 60
+machine_max_feedrate_x = 200
+machine_max_feedrate_y = 200
+machine_max_feedrate_z = 200
+machine_max_jerk_e = 5
+machine_max_jerk_x = 5
+machine_max_jerk_y = 5
+machine_max_jerk_z = 5
+max_print_height = 200
+nozzle_diameter = 0.4
+printer_model = Q5
+printer_variant = 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_FLSun\nPRINTER_MODEL_Q5\nPRINTER_HAS_BOWDEN\n
+retract_length = 3
+retract_lift = 0.3
+start_gcode = ;STARTGCODE\nM117 Initializing\n; G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM107\nG28 ;Home\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM104 S[first_layer_temperature] ; set extruder temp\nM109 S[first_layer_temperature] ; wait for extruder temp\n\nG92 E0\nG1 X-98 Y0 Z0.2 F4000 ; move to arc start\nG3 X0 Y-98 I98 Z0.2 E40 F400 ; lay arc stripe 90deg\nG0 Z1 \nG92 E0.0\n
+thumbnails = 16x16,200x200
+use_relative_e_distances = 1
+use_volumetric_e = 0
+
+[printer:FLSun Q5 0.6 nozzle]
+inherits = FLSun Q5
+printer_variant = 0.6
+nozzle_diameter = 0.6
+max_layer_height = 0.40
+min_layer_height = 0.15
+default_print_profile = 0.30mm QUALITY @0.6 nozzle FLSUN
+retract_length = 3
+retract_lift = 0.4
+retract_speed = 50
+deretract_speed = 40
+retract_before_wipe = 0
+retract_before_travel = 1
+
+#########################################
+####### end common print presets ########
+#########################################
diff --git a/resources/profiles/FLSun/Q5.svg b/resources/profiles/FLSun/Q5.svg
new file mode 100644
index 000000000..160ab7de4
--- /dev/null
+++ b/resources/profiles/FLSun/Q5.svg
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="svg10"
+ width="2666.6667"
+ height="2666.6667"
+ viewBox="0 0 2666.6667 2666.6667"
+ sodipodi:docname="textura3.svg"
+ inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)">
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1663"
+ inkscape:window-height="1280"
+ id="namedview64"
+ showgrid="false"
+ inkscape:zoom="0.37799999"
+ inkscape:cx="846.56087"
+ inkscape:cy="1333.3334"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg10" />
+ <metadata
+ id="metadata16">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs14" />
+ <g
+ id="g18"
+ transform="matrix(0.9,0,0,0.9,133.51373,249.58775)">
+ <path
+ style="fill:#ffffff;stroke-width:1.33333"
+ d="m 736.00001,2399.1318 c -2.56667,-0.255 -7.866,-0.8132 -11.77631,-1.2407 l -7.10964,-0.7771 -2.45808,-2.458 -2.45806,-2.4581 0.74568,-2.8515 c 0.41012,-1.5682 2.06538,-3.7161 3.67838,-4.773 5.97655,-3.916 29.43186,-8.602 62.71136,-12.5287 17.2392,-2.034 62.35572,-6.5152 73.4462,-7.2949 5.19542,-0.3654 10.29542,-0.9624 11.33334,-1.3268 1.03792,-0.3644 12.08713,-1.5918 24.5538,-2.7275 12.46666,-1.1359 28.06666,-2.6515 34.66666,-3.3681 48.09681,-5.2226 69.69526,-8.0527 79.33336,-10.3952 3.3,-0.8022 8.2667,-1.8203 11.037,-2.2627 l 5.0371,-0.8043 -0.7824,-1.2658 -0.7824,-1.266 -15.588,0.013 c -23.31789,0.019 -70.35022,2.6089 -108.92132,6.0001 -3.66667,0.3224 -17.16667,1.4792 -30,2.5706 -21.27866,1.8097 -43.15159,3.7517 -83.33334,7.399 -34.85161,3.1635 -79.97028,4.9459 -87.83801,3.4699 l -4.95137,-0.9289 -1.468,-3.2219 -1.468,-3.222 1.71304,-2.064 c 4.85429,-5.8491 24.06004,-9.9324 75.34568,-16.0193 15.4,-1.8278 30.23033,-3.6284 32.95629,-4.0015 2.72596,-0.3731 19.52596,-2.1564 37.33333,-3.9629 17.80738,-1.8067 38.37704,-3.8956 45.71038,-4.6424 7.33333,-0.7467 16.03333,-1.6248 19.33333,-1.9512 8.07387,-0.7988 39.46086,-4.415 52.66667,-6.0679 5.86667,-0.7343 13.36667,-1.6183 16.66667,-1.9644 3.3,-0.346 7.8,-1.1585 10,-1.8053 l 4,-1.1763 -10,-0.93 c -12.61362,-1.1731 -28.08191,-1.7216 -99.2397,-3.5196 -31.48184,-0.7955 -57.80041,-1.7929 -58.48571,-2.2164 -0.6853,-0.4236 -0.94528,-3.0123 -0.57772,-5.7527 l 0.66831,-4.9825 -15.79221,-17.178 -15.7922,-17.1779 -0.84714,-4.2001 c -0.46592,-2.3101 -0.63337,-5.3101 -0.37212,-6.6667 l 0.475,-2.4665 h 37.31508 37.31507 l 0.3892,4 0.3892,4 -9.72253,12.0119 c -9.74695,12.042 -11.91019,14.6634 -18.72254,22.6878 -2.01666,2.3755 -3.66666,4.8976 -3.66666,5.605 v 1.2858 l 41.66666,0.9088 c 95.33237,2.0795 125.93701,4.9306 134.66667,12.5454 7.79209,6.7969 -5.58553,12.1109 -39.50324,15.6918 -2.28988,0.2418 -14.66342,1.7086 -27.49676,3.2594 -12.83333,1.5509 -29.03333,3.3506 -36,3.9994 -31.76296,2.9579 -44.92221,4.3278 -76.66667,7.981 -13.2,1.519 -29.7,3.3545 -36.66666,4.0786 -16.44847,1.7099 -42.86454,5.0524 -51.33334,6.4955 l -6.66666,1.136 6.66666,0.1481 c 3.66667,0.081 17.16667,-0.7234 30,-1.7886 43.52271,-3.6127 71.28839,-5.9928 86,-7.3723 8.06667,-0.7564 22.46667,-1.9645 32,-2.6848 9.53334,-0.7204 23.93334,-1.906 32,-2.6349 30.18418,-2.7274 59.43375,-4.1036 84.00001,-3.9524 l 25.33335,0.1561 5.2,1.7995 c 5.7288,1.9825 7.4155,3.8428 7.4462,8.2128 l 0.02,2.9032 -3.5434,2.7873 c -3.3191,2.6108 -13.0262,6.0524 -21.3054,7.5537 -1.997,0.3622 -4.1252,0.9639 -4.7294,1.3372 -0.6041,0.3734 -5.14611,1.1726 -10.09339,1.7759 -4.94727,0.6035 -18.29504,2.3424 -29.66171,3.8645 -22.38103,2.9971 -63.94175,7.5912 -80,8.8432 -5.5,0.4288 -11.8,1.0671 -14,1.4184 -2.2,0.3514 -10.3,1.2099 -18,1.908 -31.13576,2.8227 -68.66898,6.9366 -91.82078,10.064 -13.46809,1.8195 -25.01809,3.308 -25.66666,3.308 -0.64858,0 -1.17923,0.6766 -1.17923,1.5036 v 1.5035 L 826,2390.4342 918.66666,2389.86 v 2.2407 c 0,1.2324 -0.8093,2.9124 -1.79846,3.7333 l -1.79846,1.4926 -24.73036,1.2885 C 867.60932,2399.7995 746.79009,2400.205 736,2399.133 Z m 305.33329,-176.4304 v -85.368 H 1128 h 86.6667 v 18.588 18.588 l -1.6667,1.0309 c -0.9167,0.5671 -30.4667,1.3525 -65.6667,1.7455 l -64,0.7142 -0.3852,11.6667 -0.3852,11.6667 h 38.7515 38.7516 l 1.3388,3.5212 1.3387,3.5212 -0.3717,16.8121 L 1162,2242 l -39.643,0.3532 -39.643,0.3531 -0.357,32.3136 -0.357,32.3135 -20.3333,0.368 -20.3334,0.3681 z m 194.2223,84.4097 c -0.4889,-0.4888 -0.8889,-38.8888 -0.8889,-85.3333 v -84.4444 h 21.9873 21.9873 l 0.346,65 0.346,65 47.7772,0.2216 c 26.2774,0.1213 48.0221,0.4665 48.3214,0.7658 0.4371,0.437 0.9681,31.51 0.6497,38.0126 l -0.081,1.6666 h -69.7778 c -38.3778,0 -70.1778,-0.4 -70.6667,-0.8889 z m 162.076,-19.1883 0.3684,-20.1889 86.1972,0.1519 86.1971,0.1518 3.3388,-1.2694 3.3389,-1.2695 1.569,-4.7539 1.5689,-4.754 -0.92,-4.3288 c -0.506,-2.3808 -1.8461,-5.3786 -2.9783,-6.662 l -2.0582,-2.3333 h -62.8891 -62.8892 l -6.5709,-2.1996 c -15.4386,-5.1681 -27.9792,-17.8657 -33.1803,-33.5957 l -2.3571,-7.1288 0.5942,-12.8712 0.594,-12.8714 3.3722,-7.3333 c 4.5178,-9.8237 12.926,-19.0048 22.5955,-24.6719 l 7.9536,-4.6614 H 1504.7382 1568 v 20 20 h -56.4118 -56.4118 l -2.429,1.7761 -2.4291,1.7763 -0.66,6.8688 -0.66,6.8688 2.1591,3.2952 2.159,3.2952 64.3419,0.4596 64.3417,0.4596 5.8783,2.3332 c 16.996,6.746 27.3629,17.498 32.5748,33.7844 l 2.2136,6.9172 v 10.1656 10.1656 l -2.1992,6.9172 c -1.2095,3.8044 -3.0095,7.8644 -4,9.0221 -0.9904,1.1577 -1.8008,2.7792 -1.8008,3.6032 0,2.9703 -13.3643,14.7779 -20.9323,18.494 l -7.7344,3.7979 -94.3684,0.3892 -94.3682,0.3892 z m 272.9692,18.2612 c -14.5482,-3.9236 -29.0184,-18.8126 -33.8889,-34.8697 l -2.0164,-6.6476 -0.015,-63.6997 -0.015,-63.6996 21.6666,0.3662 21.6667,0.3664 0.3463,62.8475 0.3462,62.8475 2.19,1.8192 2.1899,1.8192 47.4639,0.4162 c 26.105,0.2291 50.0176,0.041 53.139,-0.4162 l 5.6754,-0.8327 1.9913,-3.8508 1.9913,-3.8508 v -19.3995 c 0,-10.6698 0.45,-19.3945 1,-19.3884 0.9072,0.013 26.9279,21.4928 37.2355,30.7416 l 4.2355,3.8004 -0.6151,7.1724 c -1.1775,13.7322 -8.2167,26.8158 -19.3085,35.889 l -5.8807,4.8104 -8.2913,2.7874 -8.2912,2.7876 -58.3755,-0.091 -58.3753,-0.089 -6.0659,-1.636 z m 258.5816,-4.5764 c -3.2169,-3.5157 -7.9453,-8.7657 -10.5073,-11.6666 -2.5621,-2.9008 -11.49,-12.7743 -19.8399,-21.941 -21.4714,-23.572 -35.0646,-38.5461 -49.5742,-54.6105 l -12.5943,-13.944 -0.7173,14.8835 c -0.3944,8.1858 -1.1168,15.2829 -1.6052,15.7713 -0.7047,0.7048 -9.9155,-5.4772 -13.0108,-8.7325 -1.3115,-1.3792 -16.7727,-14.2023 -22.3334,-18.5226 l -5.6666,-4.4026 v -30.5546 -30.5546 l 21,0.043 21,0.043 2.0216,1.6243 c 1.1118,0.8933 7.0501,7.3242 13.196,14.2909 6.146,6.9667 15.2484,17.206 20.2276,22.7543 4.9792,5.5481 13.441,15.1901 18.804,21.4268 8.8668,10.3112 25.5845,29.2545 36.3176,41.1522 22.5325,24.9776 59.4332,67.5391 59.4332,68.5507 0,0.4304 -11.3179,0.7827 -25.151,0.7827 h -25.1508 l -5.8492,-6.3924 z m 18.6983,-78.6008 c -19.9936,-23.287 -38.796,-45.1118 -41.7831,-48.4994 -2.9869,-3.3876 -6.8746,-7.8876 -8.6392,-10 -1.7644,-2.1124 -7.3144,-8.4946 -12.3333,-14.1824 -5.0188,-5.688 -9.1251,-10.938 -9.1251,-11.6667 v -1.3249 h 55.3334 55.3333 v 63.2546 63.2547 l -1.2169,0.7521 c -0.6694,0.4136 -17.5755,-18.3009 -37.5691,-41.588 z M 766.59932,2239.4 l -1.26598,-1.2666 v -18.9799 c 0,-10.4389 0.58148,-20.5093 1.29218,-22.3785 l 1.29217,-3.3987 47.31592,0.013 47.31593,0.013 0.72884,1.1793 c 0.40087,0.6487 1.12144,11.134 1.6013,23.3008 l 0.87244,22.1215 -1.20939,0.013 c -0.66516,0 -22.68971,0.1549 -48.94341,0.3333 l -47.73404,0.3243 -1.26596,-1.2667 z m 2.40069,-52.355 -3.66667,-0.5554 v -4.5944 -4.5942 l 49.57954,0.3494 49.57952,0.3496 0.47514,4.1635 0.47515,4.1636 -3.05467,0.8183 c -3.33229,0.8926 -87.42966,0.8022 -93.38801,-0.1 z m -2,-15.928 c -1.8656,-0.7528 -2.19449,-5.5544 -0.55712,-8.1339 l 1.06871,-1.6835 48.46137,0.3502 48.46137,0.3502 0.20675,4 c 0.11373,2.2 -0.434,4.4408 -1.21716,4.9796 -1.57253,1.0819 -93.75785,1.2132 -96.42392,0.1374 z m -0.1068,-16.282 -1.77343,-1.1243 0.4401,-3.8553 0.4401,-3.8554 48.84628,-0.3496 48.84628,-0.3496 0.65043,4.3496 0.65043,4.3496 -1.49671,0.9796 c -2.09409,1.3706 -94.43143,1.2323 -96.60348,-0.1446 z m 0.69735,-15.8039 -2.40943,-0.5892 0.40943,-4.2209 0.40942,-4.221 48.58311,-0.3502 48.58311,-0.3502 1.10022,1.1002 c 0.60512,0.6052 0.71938,3.0045 0.25391,5.3318 l -0.84633,4.2316 -46.837,-0.1714 c -25.76036,-0.095 -47.92126,-0.4366 -49.24644,-0.7607 z m -6.25722,-17.9843 c -15.90178,-4.5921 -26.6179,-8.6264 -30.8633,-11.6188 -17.14899,-12.0877 -35.81222,-25.7585 -39.7691,-29.1306 l -4.6324,-3.9479 7.54414,-4.8259 c 4.14928,-2.6542 7.91926,-5.4329 8.37776,-6.1748 0.45849,-0.7418 1.96266,-1.3488 3.34261,-1.3488 h 2.50899 l 7.74565,9.5452 c 7.66839,9.45 15.91217,19.1728 23.19011,27.3506 l 3.76369,4.2289 7.0626,-2.7067 c 3.88443,-1.4886 15.46259,-5.6044 25.72925,-9.1461 l 18.66667,-6.4393 25.00879,-0.044 25.0088,-0.044 14.9912,5.1832 c 8.24517,2.8506 18.57641,6.4858 22.9583,8.0781 l 7.96711,2.8951 4.03289,-4.5167 c 2.21811,-2.4841 9.93131,-11.556 17.14048,-20.1596 l 13.10756,-15.6429 4.22578,2.5218 c 2.32416,1.387 6.77576,3.9164 9.89243,5.6211 l 5.66666,3.0993 -0.0443,2.0878 -0.0443,2.0878 -11.62247,8.4038 c -6.39235,4.6221 -17.28405,12.5117 -24.20379,17.5326 l -12.58134,9.1288 -12.08532,3.5636 c -6.64694,1.9602 -13.46356,4.1204 -15.14807,4.8008 l -3.06275,1.2371 -49.60392,-0.1361 -49.60393,-0.1362 -4.66667,-1.3476 z m 105.10006,-10.2922 c 6.10504,-1.3806 11.37428,-2.7844 11.70942,-3.1196 0.66572,-0.6658 -0.44424,-1.1139 -20.25024,-8.1759 l -13.44074,-4.7924 H 819.4433 794.43477 l -14.88405,5.1923 c -19.18192,6.6916 -23.18408,8.3513 -21.55071,8.937 0.73333,0.263 4.63333,1.352 8.66667,2.42 l 7.33333,1.9419 40.66667,0.053 40.66666,0.053 11.10006,-2.5104 z m -129.74644,-23.0928 c -3.65552,-4.5807 -7.03351,-8.6284 -7.50664,-8.9951 -2.90264,-2.2495 -17.1007,-20.9023 -16.74591,-22 1.53501,-4.7495 37.80824,-27.3333 43.90165,-27.3333 1.10226,0 2.61398,-0.75 3.35938,-1.6667 L 761.0507,2026 747.21809,2016 c -7.60793,-5.5 -13.84433,-10.6981 -13.85868,-11.5514 -0.0248,-1.477 17.61908,-12.4486 20.01919,-12.4486 0.6294,0 6.99221,6.9223 14.13961,15.383 l 12.99527,15.3828 4.0766,-1.002 c 5.82714,-1.4323 46.2252,-0.7036 58.0766,1.0476 l 10,1.4777 6.4768,-7.1445 c 3.56224,-3.9295 9.7378,-11.1946 13.72345,-16.1446 3.98567,-4.95 7.98479,-9 8.88695,-9 0.90214,0 4.82896,2.1 8.72625,4.6667 3.89728,2.5667 7.56013,4.6667 8.13967,4.6667 0.57953,0 1.75477,0.8448 2.61165,1.8772 l 1.55795,1.8772 -16.10263,11.7841 -16.10264,11.7841 4.37461,1.874 c 11.84091,5.0723 27.0335,12.9318 31.44575,16.2675 10.43075,7.8857 12.26219,9.4364 12.26219,10.3825 0,1.121 -28.56319,35.52 -30.47516,36.7016 -0.69388,0.429 -5.67083,-1.0169 -11.05988,-3.213 -5.38907,-2.196 -10.3983,-3.9986 -11.13163,-4.0055 -0.73333,-0.013 -2.85969,-0.8095 -4.72524,-1.7829 -5.67225,-2.9603 -11.46963,-3.5824 -40.60593,-4.3576 l -28.00216,-0.7451 -13.33334,4.8404 c -16.26178,5.9036 -32.86352,11.3439 -34.66666,11.3601 -0.73334,0 -4.32422,-3.7357 -7.97972,-8.3162 z m 27.04638,-34.5951 c 2.45968,-2.4597 1.90292,-6.144 -1.17758,-7.7927 l -2.77758,-1.4865 -2.55576,2.3129 c -3.18038,2.8782 -3.2578,5.3582 -0.22241,7.1262 3.10359,1.8077 4.80623,1.7672 6.73333,-0.1599 z m 106.88023,-0.336 1.60676,-1.936 -0.82759,-2.6075 c -0.45517,-1.4341 -1.84948,-2.9996 -3.09848,-3.4789 l -2.2709,-0.8715 -2.37947,2.9386 -2.37947,2.9385 2.24111,2.4764 c 2.69407,2.9769 4.94395,3.148 7.10804,0.5404 z"
+ id="path22" />
+ </g>
+</svg>
diff --git a/resources/profiles/FLSun/Q5_bed.stl b/resources/profiles/FLSun/Q5_bed.stl
new file mode 100644
index 000000000..5702cb464
--- /dev/null
+++ b/resources/profiles/FLSun/Q5_bed.stl
Binary files differ
diff --git a/resources/profiles/FLSun/Q5_thumbnail.png b/resources/profiles/FLSun/Q5_thumbnail.png
new file mode 100644
index 000000000..b70f45f71
--- /dev/null
+++ b/resources/profiles/FLSun/Q5_thumbnail.png
Binary files differ
diff --git a/resources/profiles/FLSun/QQSP.svg b/resources/profiles/FLSun/QQSP.svg
new file mode 100644
index 000000000..160ab7de4
--- /dev/null
+++ b/resources/profiles/FLSun/QQSP.svg
@@ -0,0 +1,59 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+ xmlns:dc="http://purl.org/dc/elements/1.1/"
+ xmlns:cc="http://creativecommons.org/ns#"
+ xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+ xmlns:svg="http://www.w3.org/2000/svg"
+ xmlns="http://www.w3.org/2000/svg"
+ xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+ version="1.1"
+ id="svg10"
+ width="2666.6667"
+ height="2666.6667"
+ viewBox="0 0 2666.6667 2666.6667"
+ sodipodi:docname="textura3.svg"
+ inkscape:version="1.0.1 (3bc2e813f5, 2020-09-07)">
+ <sodipodi:namedview
+ pagecolor="#ffffff"
+ bordercolor="#666666"
+ borderopacity="1"
+ objecttolerance="10"
+ gridtolerance="10"
+ guidetolerance="10"
+ inkscape:pageopacity="0"
+ inkscape:pageshadow="2"
+ inkscape:window-width="1663"
+ inkscape:window-height="1280"
+ id="namedview64"
+ showgrid="false"
+ inkscape:zoom="0.37799999"
+ inkscape:cx="846.56087"
+ inkscape:cy="1333.3334"
+ inkscape:window-x="0"
+ inkscape:window-y="0"
+ inkscape:window-maximized="0"
+ inkscape:current-layer="svg10" />
+ <metadata
+ id="metadata16">
+ <rdf:RDF>
+ <cc:Work
+ rdf:about="">
+ <dc:format>image/svg+xml</dc:format>
+ <dc:type
+ rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
+ <dc:title></dc:title>
+ </cc:Work>
+ </rdf:RDF>
+ </metadata>
+ <defs
+ id="defs14" />
+ <g
+ id="g18"
+ transform="matrix(0.9,0,0,0.9,133.51373,249.58775)">
+ <path
+ style="fill:#ffffff;stroke-width:1.33333"
+ d="m 736.00001,2399.1318 c -2.56667,-0.255 -7.866,-0.8132 -11.77631,-1.2407 l -7.10964,-0.7771 -2.45808,-2.458 -2.45806,-2.4581 0.74568,-2.8515 c 0.41012,-1.5682 2.06538,-3.7161 3.67838,-4.773 5.97655,-3.916 29.43186,-8.602 62.71136,-12.5287 17.2392,-2.034 62.35572,-6.5152 73.4462,-7.2949 5.19542,-0.3654 10.29542,-0.9624 11.33334,-1.3268 1.03792,-0.3644 12.08713,-1.5918 24.5538,-2.7275 12.46666,-1.1359 28.06666,-2.6515 34.66666,-3.3681 48.09681,-5.2226 69.69526,-8.0527 79.33336,-10.3952 3.3,-0.8022 8.2667,-1.8203 11.037,-2.2627 l 5.0371,-0.8043 -0.7824,-1.2658 -0.7824,-1.266 -15.588,0.013 c -23.31789,0.019 -70.35022,2.6089 -108.92132,6.0001 -3.66667,0.3224 -17.16667,1.4792 -30,2.5706 -21.27866,1.8097 -43.15159,3.7517 -83.33334,7.399 -34.85161,3.1635 -79.97028,4.9459 -87.83801,3.4699 l -4.95137,-0.9289 -1.468,-3.2219 -1.468,-3.222 1.71304,-2.064 c 4.85429,-5.8491 24.06004,-9.9324 75.34568,-16.0193 15.4,-1.8278 30.23033,-3.6284 32.95629,-4.0015 2.72596,-0.3731 19.52596,-2.1564 37.33333,-3.9629 17.80738,-1.8067 38.37704,-3.8956 45.71038,-4.6424 7.33333,-0.7467 16.03333,-1.6248 19.33333,-1.9512 8.07387,-0.7988 39.46086,-4.415 52.66667,-6.0679 5.86667,-0.7343 13.36667,-1.6183 16.66667,-1.9644 3.3,-0.346 7.8,-1.1585 10,-1.8053 l 4,-1.1763 -10,-0.93 c -12.61362,-1.1731 -28.08191,-1.7216 -99.2397,-3.5196 -31.48184,-0.7955 -57.80041,-1.7929 -58.48571,-2.2164 -0.6853,-0.4236 -0.94528,-3.0123 -0.57772,-5.7527 l 0.66831,-4.9825 -15.79221,-17.178 -15.7922,-17.1779 -0.84714,-4.2001 c -0.46592,-2.3101 -0.63337,-5.3101 -0.37212,-6.6667 l 0.475,-2.4665 h 37.31508 37.31507 l 0.3892,4 0.3892,4 -9.72253,12.0119 c -9.74695,12.042 -11.91019,14.6634 -18.72254,22.6878 -2.01666,2.3755 -3.66666,4.8976 -3.66666,5.605 v 1.2858 l 41.66666,0.9088 c 95.33237,2.0795 125.93701,4.9306 134.66667,12.5454 7.79209,6.7969 -5.58553,12.1109 -39.50324,15.6918 -2.28988,0.2418 -14.66342,1.7086 -27.49676,3.2594 -12.83333,1.5509 -29.03333,3.3506 -36,3.9994 -31.76296,2.9579 -44.92221,4.3278 -76.66667,7.981 -13.2,1.519 -29.7,3.3545 -36.66666,4.0786 -16.44847,1.7099 -42.86454,5.0524 -51.33334,6.4955 l -6.66666,1.136 6.66666,0.1481 c 3.66667,0.081 17.16667,-0.7234 30,-1.7886 43.52271,-3.6127 71.28839,-5.9928 86,-7.3723 8.06667,-0.7564 22.46667,-1.9645 32,-2.6848 9.53334,-0.7204 23.93334,-1.906 32,-2.6349 30.18418,-2.7274 59.43375,-4.1036 84.00001,-3.9524 l 25.33335,0.1561 5.2,1.7995 c 5.7288,1.9825 7.4155,3.8428 7.4462,8.2128 l 0.02,2.9032 -3.5434,2.7873 c -3.3191,2.6108 -13.0262,6.0524 -21.3054,7.5537 -1.997,0.3622 -4.1252,0.9639 -4.7294,1.3372 -0.6041,0.3734 -5.14611,1.1726 -10.09339,1.7759 -4.94727,0.6035 -18.29504,2.3424 -29.66171,3.8645 -22.38103,2.9971 -63.94175,7.5912 -80,8.8432 -5.5,0.4288 -11.8,1.0671 -14,1.4184 -2.2,0.3514 -10.3,1.2099 -18,1.908 -31.13576,2.8227 -68.66898,6.9366 -91.82078,10.064 -13.46809,1.8195 -25.01809,3.308 -25.66666,3.308 -0.64858,0 -1.17923,0.6766 -1.17923,1.5036 v 1.5035 L 826,2390.4342 918.66666,2389.86 v 2.2407 c 0,1.2324 -0.8093,2.9124 -1.79846,3.7333 l -1.79846,1.4926 -24.73036,1.2885 C 867.60932,2399.7995 746.79009,2400.205 736,2399.133 Z m 305.33329,-176.4304 v -85.368 H 1128 h 86.6667 v 18.588 18.588 l -1.6667,1.0309 c -0.9167,0.5671 -30.4667,1.3525 -65.6667,1.7455 l -64,0.7142 -0.3852,11.6667 -0.3852,11.6667 h 38.7515 38.7516 l 1.3388,3.5212 1.3387,3.5212 -0.3717,16.8121 L 1162,2242 l -39.643,0.3532 -39.643,0.3531 -0.357,32.3136 -0.357,32.3135 -20.3333,0.368 -20.3334,0.3681 z m 194.2223,84.4097 c -0.4889,-0.4888 -0.8889,-38.8888 -0.8889,-85.3333 v -84.4444 h 21.9873 21.9873 l 0.346,65 0.346,65 47.7772,0.2216 c 26.2774,0.1213 48.0221,0.4665 48.3214,0.7658 0.4371,0.437 0.9681,31.51 0.6497,38.0126 l -0.081,1.6666 h -69.7778 c -38.3778,0 -70.1778,-0.4 -70.6667,-0.8889 z m 162.076,-19.1883 0.3684,-20.1889 86.1972,0.1519 86.1971,0.1518 3.3388,-1.2694 3.3389,-1.2695 1.569,-4.7539 1.5689,-4.754 -0.92,-4.3288 c -0.506,-2.3808 -1.8461,-5.3786 -2.9783,-6.662 l -2.0582,-2.3333 h -62.8891 -62.8892 l -6.5709,-2.1996 c -15.4386,-5.1681 -27.9792,-17.8657 -33.1803,-33.5957 l -2.3571,-7.1288 0.5942,-12.8712 0.594,-12.8714 3.3722,-7.3333 c 4.5178,-9.8237 12.926,-19.0048 22.5955,-24.6719 l 7.9536,-4.6614 H 1504.7382 1568 v 20 20 h -56.4118 -56.4118 l -2.429,1.7761 -2.4291,1.7763 -0.66,6.8688 -0.66,6.8688 2.1591,3.2952 2.159,3.2952 64.3419,0.4596 64.3417,0.4596 5.8783,2.3332 c 16.996,6.746 27.3629,17.498 32.5748,33.7844 l 2.2136,6.9172 v 10.1656 10.1656 l -2.1992,6.9172 c -1.2095,3.8044 -3.0095,7.8644 -4,9.0221 -0.9904,1.1577 -1.8008,2.7792 -1.8008,3.6032 0,2.9703 -13.3643,14.7779 -20.9323,18.494 l -7.7344,3.7979 -94.3684,0.3892 -94.3682,0.3892 z m 272.9692,18.2612 c -14.5482,-3.9236 -29.0184,-18.8126 -33.8889,-34.8697 l -2.0164,-6.6476 -0.015,-63.6997 -0.015,-63.6996 21.6666,0.3662 21.6667,0.3664 0.3463,62.8475 0.3462,62.8475 2.19,1.8192 2.1899,1.8192 47.4639,0.4162 c 26.105,0.2291 50.0176,0.041 53.139,-0.4162 l 5.6754,-0.8327 1.9913,-3.8508 1.9913,-3.8508 v -19.3995 c 0,-10.6698 0.45,-19.3945 1,-19.3884 0.9072,0.013 26.9279,21.4928 37.2355,30.7416 l 4.2355,3.8004 -0.6151,7.1724 c -1.1775,13.7322 -8.2167,26.8158 -19.3085,35.889 l -5.8807,4.8104 -8.2913,2.7874 -8.2912,2.7876 -58.3755,-0.091 -58.3753,-0.089 -6.0659,-1.636 z m 258.5816,-4.5764 c -3.2169,-3.5157 -7.9453,-8.7657 -10.5073,-11.6666 -2.5621,-2.9008 -11.49,-12.7743 -19.8399,-21.941 -21.4714,-23.572 -35.0646,-38.5461 -49.5742,-54.6105 l -12.5943,-13.944 -0.7173,14.8835 c -0.3944,8.1858 -1.1168,15.2829 -1.6052,15.7713 -0.7047,0.7048 -9.9155,-5.4772 -13.0108,-8.7325 -1.3115,-1.3792 -16.7727,-14.2023 -22.3334,-18.5226 l -5.6666,-4.4026 v -30.5546 -30.5546 l 21,0.043 21,0.043 2.0216,1.6243 c 1.1118,0.8933 7.0501,7.3242 13.196,14.2909 6.146,6.9667 15.2484,17.206 20.2276,22.7543 4.9792,5.5481 13.441,15.1901 18.804,21.4268 8.8668,10.3112 25.5845,29.2545 36.3176,41.1522 22.5325,24.9776 59.4332,67.5391 59.4332,68.5507 0,0.4304 -11.3179,0.7827 -25.151,0.7827 h -25.1508 l -5.8492,-6.3924 z m 18.6983,-78.6008 c -19.9936,-23.287 -38.796,-45.1118 -41.7831,-48.4994 -2.9869,-3.3876 -6.8746,-7.8876 -8.6392,-10 -1.7644,-2.1124 -7.3144,-8.4946 -12.3333,-14.1824 -5.0188,-5.688 -9.1251,-10.938 -9.1251,-11.6667 v -1.3249 h 55.3334 55.3333 v 63.2546 63.2547 l -1.2169,0.7521 c -0.6694,0.4136 -17.5755,-18.3009 -37.5691,-41.588 z M 766.59932,2239.4 l -1.26598,-1.2666 v -18.9799 c 0,-10.4389 0.58148,-20.5093 1.29218,-22.3785 l 1.29217,-3.3987 47.31592,0.013 47.31593,0.013 0.72884,1.1793 c 0.40087,0.6487 1.12144,11.134 1.6013,23.3008 l 0.87244,22.1215 -1.20939,0.013 c -0.66516,0 -22.68971,0.1549 -48.94341,0.3333 l -47.73404,0.3243 -1.26596,-1.2667 z m 2.40069,-52.355 -3.66667,-0.5554 v -4.5944 -4.5942 l 49.57954,0.3494 49.57952,0.3496 0.47514,4.1635 0.47515,4.1636 -3.05467,0.8183 c -3.33229,0.8926 -87.42966,0.8022 -93.38801,-0.1 z m -2,-15.928 c -1.8656,-0.7528 -2.19449,-5.5544 -0.55712,-8.1339 l 1.06871,-1.6835 48.46137,0.3502 48.46137,0.3502 0.20675,4 c 0.11373,2.2 -0.434,4.4408 -1.21716,4.9796 -1.57253,1.0819 -93.75785,1.2132 -96.42392,0.1374 z m -0.1068,-16.282 -1.77343,-1.1243 0.4401,-3.8553 0.4401,-3.8554 48.84628,-0.3496 48.84628,-0.3496 0.65043,4.3496 0.65043,4.3496 -1.49671,0.9796 c -2.09409,1.3706 -94.43143,1.2323 -96.60348,-0.1446 z m 0.69735,-15.8039 -2.40943,-0.5892 0.40943,-4.2209 0.40942,-4.221 48.58311,-0.3502 48.58311,-0.3502 1.10022,1.1002 c 0.60512,0.6052 0.71938,3.0045 0.25391,5.3318 l -0.84633,4.2316 -46.837,-0.1714 c -25.76036,-0.095 -47.92126,-0.4366 -49.24644,-0.7607 z m -6.25722,-17.9843 c -15.90178,-4.5921 -26.6179,-8.6264 -30.8633,-11.6188 -17.14899,-12.0877 -35.81222,-25.7585 -39.7691,-29.1306 l -4.6324,-3.9479 7.54414,-4.8259 c 4.14928,-2.6542 7.91926,-5.4329 8.37776,-6.1748 0.45849,-0.7418 1.96266,-1.3488 3.34261,-1.3488 h 2.50899 l 7.74565,9.5452 c 7.66839,9.45 15.91217,19.1728 23.19011,27.3506 l 3.76369,4.2289 7.0626,-2.7067 c 3.88443,-1.4886 15.46259,-5.6044 25.72925,-9.1461 l 18.66667,-6.4393 25.00879,-0.044 25.0088,-0.044 14.9912,5.1832 c 8.24517,2.8506 18.57641,6.4858 22.9583,8.0781 l 7.96711,2.8951 4.03289,-4.5167 c 2.21811,-2.4841 9.93131,-11.556 17.14048,-20.1596 l 13.10756,-15.6429 4.22578,2.5218 c 2.32416,1.387 6.77576,3.9164 9.89243,5.6211 l 5.66666,3.0993 -0.0443,2.0878 -0.0443,2.0878 -11.62247,8.4038 c -6.39235,4.6221 -17.28405,12.5117 -24.20379,17.5326 l -12.58134,9.1288 -12.08532,3.5636 c -6.64694,1.9602 -13.46356,4.1204 -15.14807,4.8008 l -3.06275,1.2371 -49.60392,-0.1361 -49.60393,-0.1362 -4.66667,-1.3476 z m 105.10006,-10.2922 c 6.10504,-1.3806 11.37428,-2.7844 11.70942,-3.1196 0.66572,-0.6658 -0.44424,-1.1139 -20.25024,-8.1759 l -13.44074,-4.7924 H 819.4433 794.43477 l -14.88405,5.1923 c -19.18192,6.6916 -23.18408,8.3513 -21.55071,8.937 0.73333,0.263 4.63333,1.352 8.66667,2.42 l 7.33333,1.9419 40.66667,0.053 40.66666,0.053 11.10006,-2.5104 z m -129.74644,-23.0928 c -3.65552,-4.5807 -7.03351,-8.6284 -7.50664,-8.9951 -2.90264,-2.2495 -17.1007,-20.9023 -16.74591,-22 1.53501,-4.7495 37.80824,-27.3333 43.90165,-27.3333 1.10226,0 2.61398,-0.75 3.35938,-1.6667 L 761.0507,2026 747.21809,2016 c -7.60793,-5.5 -13.84433,-10.6981 -13.85868,-11.5514 -0.0248,-1.477 17.61908,-12.4486 20.01919,-12.4486 0.6294,0 6.99221,6.9223 14.13961,15.383 l 12.99527,15.3828 4.0766,-1.002 c 5.82714,-1.4323 46.2252,-0.7036 58.0766,1.0476 l 10,1.4777 6.4768,-7.1445 c 3.56224,-3.9295 9.7378,-11.1946 13.72345,-16.1446 3.98567,-4.95 7.98479,-9 8.88695,-9 0.90214,0 4.82896,2.1 8.72625,4.6667 3.89728,2.5667 7.56013,4.6667 8.13967,4.6667 0.57953,0 1.75477,0.8448 2.61165,1.8772 l 1.55795,1.8772 -16.10263,11.7841 -16.10264,11.7841 4.37461,1.874 c 11.84091,5.0723 27.0335,12.9318 31.44575,16.2675 10.43075,7.8857 12.26219,9.4364 12.26219,10.3825 0,1.121 -28.56319,35.52 -30.47516,36.7016 -0.69388,0.429 -5.67083,-1.0169 -11.05988,-3.213 -5.38907,-2.196 -10.3983,-3.9986 -11.13163,-4.0055 -0.73333,-0.013 -2.85969,-0.8095 -4.72524,-1.7829 -5.67225,-2.9603 -11.46963,-3.5824 -40.60593,-4.3576 l -28.00216,-0.7451 -13.33334,4.8404 c -16.26178,5.9036 -32.86352,11.3439 -34.66666,11.3601 -0.73334,0 -4.32422,-3.7357 -7.97972,-8.3162 z m 27.04638,-34.5951 c 2.45968,-2.4597 1.90292,-6.144 -1.17758,-7.7927 l -2.77758,-1.4865 -2.55576,2.3129 c -3.18038,2.8782 -3.2578,5.3582 -0.22241,7.1262 3.10359,1.8077 4.80623,1.7672 6.73333,-0.1599 z m 106.88023,-0.336 1.60676,-1.936 -0.82759,-2.6075 c -0.45517,-1.4341 -1.84948,-2.9996 -3.09848,-3.4789 l -2.2709,-0.8715 -2.37947,2.9386 -2.37947,2.9385 2.24111,2.4764 c 2.69407,2.9769 4.94395,3.148 7.10804,0.5404 z"
+ id="path22" />
+ </g>
+</svg>
diff --git a/resources/profiles/FLSun/QQSP_bed.stl b/resources/profiles/FLSun/QQSP_bed.stl
new file mode 100644
index 000000000..3aea220f0
--- /dev/null
+++ b/resources/profiles/FLSun/QQSP_bed.stl
Binary files differ
diff --git a/resources/profiles/FLSun/QQSP_thumbnail.png b/resources/profiles/FLSun/QQSP_thumbnail.png
new file mode 100644
index 000000000..3b8d329ba
--- /dev/null
+++ b/resources/profiles/FLSun/QQSP_thumbnail.png
Binary files differ
diff --git a/resources/profiles/LulzBot.idx b/resources/profiles/LulzBot.idx
index 4d6436f82..8638bdbbe 100644
--- a/resources/profiles/LulzBot.idx
+++ b/resources/profiles/LulzBot.idx
@@ -1,2 +1,4 @@
+min_slic3r_version = 2.3.0-beta2
+0.0.2 Removed obsolete host keys
min_slic3r_version = 2.2.0-alpha3
0.0.1 Initial version
diff --git a/resources/profiles/LulzBot.ini b/resources/profiles/LulzBot.ini
index 53151d819..2338beaee 100644
--- a/resources/profiles/LulzBot.ini
+++ b/resources/profiles/LulzBot.ini
@@ -3,8 +3,8 @@
[vendor]
# Vendor name will be shown by the Config Wizard.
name = LulzBot
-config_version = 0.0.1
-config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/LulzBot/
+config_version = 0.0.2
+config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/LulzBot/
[printer_model:MINI_AERO]
name = Mini Aero
@@ -257,7 +257,6 @@ extruder_colour = ""
extruder_offset = 0x0
gcode_flavor = marlin
high_current_on_filament_swap = 0
-host_type = octoprint
inherits =
layer_gcode =
machine_max_acceleration_e = 10000,5000
@@ -281,10 +280,7 @@ max_print_height = 158
min_layer_height = 0.07
nozzle_diameter = 0.5
parking_pos_retraction = 92
-print_host =
printer_notes = LulzBot Mini w/ Aerostruder profile for Delaware Library System, Rt9 Library and Innovation Center.
-printhost_apikey =
-printhost_cafile =
remaining_times = 0
retract_before_travel = 2
retract_before_wipe = 0%
@@ -297,8 +293,6 @@ retract_lift_below = 0
retract_restart_extra = 0
retract_restart_extra_toolchange = 0
retract_speed = 40
-serial_port =
-serial_speed = 250000
silent_mode = 0
single_extruder_multi_material = 0
start_gcode = ;This G-Code has been generated specifically for the LulzBot Mini with Aerosturder\nM73 P0 ; clear GLCD progress bar\nM75 ; start GLCD timer\nG26 ; clear potential 'probe fail' condition\nM107 ; disable fans\nM420 S0 ; disable leveling matrix\nG90 ; absolute positioning\nM82 ; set extruder to absolute mode\nG92 E0 ; set extruder position to 0\nM140 S{first_layer_bed_temperature[0]} ; start bed heating up\nG28; home all axes\nG0 X0 Y187 Z156 F200 ; move away from endstops\nM109 R{first_layer_temperature[0] - 60} ; soften filament before retraction\n;G1 E-15 F75 ; retract filament (LulzBot Cura is apparently trying to cold pull, might be a contributing factor to hob gear filling with filament)\nM109 R{first_layer_temperature[0] - 60} ; wait for extruder to reach wiping temp\nG1 X45 Y173 F11520 ; move above wiper pad\nG1 Z0 F1200 ; push nozzle into wiper\nG1 X42 Y173 Z-.5 F4000 ; wiping\nG1 X52 Y171 Z-.5 F4000 ; wiping\nG1 X42 Y173 Z0 F4000 ; wiping\nG1 X52 Y171 F4000 ; wiping\nG1 X42 Y173 F4000 ; wiping\nG1 X52 Y171 F4000 ; wiping\nG1 X42 Y173 F4000 ; wiping\nG1 X52 Y171 F4000 ; wiping\nG1 X57 Y173 F4000 ; wiping\nG1 X77 Y171 F4000 ; wiping\nG1 X57 Y173 F4000 ; wiping\nG1 X77 Y171 F4000 ; wiping\nG1 X57 Y173 F4000 ; wiping\nG1 X87 Y171 F4000 ; wiping\nG1 X77 Y173 F4000 ; wiping\nG1 X97 Y171 F4000 ; wiping\nG1 X77 Y173 F4000 ; wiping\nG1 X97 Y171 F4000 ; wiping\nG1 X77 Y173 F4000 ; wiping\nG1 X97 Y171 F4000 ; wiping\nG1 X107 Y173 F4000 ; wiping\nG1 X97 Y171 F4000 ; wiping\nG1 X107 Y173 F4000 ; wiping\nG1 X97 Y171 F4000 ; wiping\nG1 X107 Y173 F4000 ; wiping\nG1 X112 Y171 Z-0.5 F1000 ; wiping\nG1 Z10 ; raise extruder\nG28 X0 Y0 ; home X and Y\nG0 X0 Y187 F200 ; move away from endstops\nM109 R{first_layer_temperature[0] - 60} ; wait for extruder to reach probe temp\nM204 S300 ; set probing acceleration\nG29 ; start auto-leveling sequence\nM420 S1 ; enable leveling matrix\nM425 Z ; use measured Z backlash for compensation\nM425 Z F0 ; turn off measured Z backlash compensation. (if activated in the quality settings, this command will automatically be ignored)\nM204 S2000 ; restore standard acceleration\nG28 X0 Y0 ; re-home to account for build variance of earlier mini builds\nG0 X0 Y187 F200 ; move away from endstops\nG0 Y152 F4000 ; move in front of wiper pad\nG4 S1 ; pause\nM400 ; wait for moves to finish\nM117 Heating... ; progress indicator message on LCD\nM109 R{first_layer_temperature[0]} ; wait for extruder to reach printing temp\nM190 R{first_layer_bed_temperature[0]} ; wait for bed to reach printing temp\nG1 Z2 E0 F75 ; prime tiny bit of filament into the nozzle\nM117 Mini Printing... ; progress indicator message on LCD\nM221 S74 ; Printer specific extrusion modifier.
@@ -328,7 +322,6 @@ extruder_colour = ""
extruder_offset = 0x0
gcode_flavor = marlin
high_current_on_filament_swap = 0
-host_type = octoprint
inherits =
layer_gcode =
machine_max_acceleration_e = 1000,5000
@@ -352,11 +345,8 @@ max_print_height = 250
min_layer_height = 0.07
nozzle_diameter = 0.5
parking_pos_retraction = 92
-print_host =
printer_notes = LulzBot Taz 6 w/ Aerostruder profile for Delaware Library System, Rt9 Library and Innovation Center.
printer_technology = FFF
-printhost_apikey =
-printhost_cafile =
remaining_times = 0
retract_before_travel = 2
retract_before_wipe = 0%
@@ -369,8 +359,6 @@ retract_lift_below = 0
retract_restart_extra = 0
retract_restart_extra_toolchange = 0
retract_speed = 40
-serial_port =
-serial_speed = 250000
silent_mode = 0
single_extruder_multi_material = 0
start_gcode = ;This G-Code has been generated specifically for the LulzBot TAZ 6 with Aerosturder\nM73 P0 ; clear GLCD progress bar\nM75 ; start GLCD timer\nG26 ; clear potential 'probe fail' condition\nM107 ; disable fans\nM420 S0 ; disable leveling matrix\nG90 ; absolute positioning\nM82 ; set extruder to absolute mode\nG92 E0 ; set extruder position to 0\nM140 S{first_layer_bed_temperature[0]} ; start bed heating up\nG28 XY ; home X and Y\nG1 X-19 Y258 F1000 ; move to safe homing position\nM109 R{first_layer_temperature[0] - 60} ; soften filament before homing Z\nG28 Z ; home Z\nG1 E-15 F100 ; retract filament\nM109 R{first_layer_temperature[0] - 60} ; wait for extruder to reach wiping temp\nG1 X-15 Y100 F3000 ; move above wiper pad\nG1 Z1 ; push nozzle into wiper\nG1 X-17 Y95 F1000 ; slow wipe\nG1 X-17 Y90 F1000 ; slow wipe\nG1 X-17 Y85 F1000 ; slow wipe\nG1 X-15 Y90 F1000 ; slow wipe\nG1 X-17 Y80 F1000 ; slow wipe\nG1 X-15 Y95 F1000 ; slow wipe\nG1 X-17 Y75 F2000 ; fast wipe\nG1 X-15 Y65 F2000 ; fast wipe\nG1 X-17 Y70 F2000 ; fast wipe\nG1 X-15 Y60 F2000 ; fast wipe\nG1 X-17 Y55 F2000 ; fast wipe\nG1 X-15 Y50 F2000 ; fast wipe\nG1 X-17 Y40 F2000 ; fast wipe\nG1 X-15 Y45 F2000 ; fast wipe\nG1 X-17 Y35 F2000 ; fast wipe\nG1 X-15 Y40 F2000 ; fast wipe\nG1 X-17 Y70 F2000 ; fast wipe\nG1 X-15 Y30 Z2 F2000 ; fast wipe\nG1 X-17 Y35 F2000 ; fast wipe\nG1 X-15 Y25 F2000 ; fast wipe\nG1 X-17 Y30 F2000 ; fast wipe\nG1 X-15 Y25 Z1.5 F1000 ; slow wipe\nG1 X-17 Y23 F1000 ; slow wipe\nG1 Z10 ; raise extruder\nM109 R{first_layer_temperature[0] - 60} ; wait for extruder to reach probe temp\nG1 X-9 Y-9 ; move above first probe point\nM204 S100 ; set probing acceleration\nG29 ; start auto-leveling sequence\nM420 S1 ; enable leveling matrix\nM425 Z ; use measured Z backlash for compensation\nM425 Z F0 ; turn off measured Z backlash compensation. (if activated in the quality settings, this command will automatically be ignored)\nM204 S500 ; restore standard acceleration\nG1 X0 Y0 Z15 F5000 ; move up off last probe point\nG4 S1 ; pause\nM400 ; wait for moves to finish\nM117 Heating... ; progress indicator message on LCD\nM109 R{first_layer_temperature[0]} ; wait for extruder to reach printing temp\nM190 R{first_layer_bed_temperature[0]} ; wait for bed to reach printing temp\nG1 Z2 E0 F75 ; prime tiny bit of filament into the nozzle\nM117 TAZ 6 Printing... ; progress indicator message on LCD\n
diff --git a/resources/profiles/LulzBot/MINI_AERO_thumbnail.png b/resources/profiles/LulzBot/MINI_AERO_thumbnail.png
index ded4eb673..a25947a1d 100644
--- a/resources/profiles/LulzBot/MINI_AERO_thumbnail.png
+++ b/resources/profiles/LulzBot/MINI_AERO_thumbnail.png
Binary files differ
diff --git a/resources/profiles/LulzBot/TAZ6_AERO_thumbnail.png b/resources/profiles/LulzBot/TAZ6_AERO_thumbnail.png
index ac6d48a69..79ffb907f 100644
--- a/resources/profiles/LulzBot/TAZ6_AERO_thumbnail.png
+++ b/resources/profiles/LulzBot/TAZ6_AERO_thumbnail.png
Binary files differ
diff --git a/resources/profiles/PrusaResearch.idx b/resources/profiles/PrusaResearch.idx
index 3990bdd78..b3077932c 100644
--- a/resources/profiles/PrusaResearch.idx
+++ b/resources/profiles/PrusaResearch.idx
@@ -1,4 +1,25 @@
+min_slic3r_version = 2.3.0-rc1
+1.2.2 Added Prusament PVB filament profile. Added 0.8mm nozzle profiles.
+1.2.1 Updated FW version for MK2.5 family printers.
+1.2.0 Added full_fan_speed_layer value for PETG. Increased support interface spacing for 0.6mm nozzle profiles. Updated firmware version.
+min_slic3r_version = 2.3.0-beta2
+1.2.0-beta1 Updated end g-code. Added full_fan_speed_layer values.
+min_slic3r_version = 2.3.0-beta0
+1.2.0-beta0 Adjusted infill anchor limits. Added filament spool weights.
+min_slic3r_version = 2.3.0-alpha4
+1.2.0-alpha1 Renamed MK3S and MINI printer profiles. Updated end g-code (MINI). Added new SLA materials and filament profiles.
+1.2.0-alpha0 Added filament spool weights
min_slic3r_version = 2.2.0-alpha3
+1.1.12 Added Prusament PVB filament profile. Added 0.8mm nozzle profiles.
+1.1.11 Renamed MK3S and MINI printer profiles. Updated end g-code (MINI). Added new SLA materials and filament profiles.
+1.1.10 Updated firmware version.
+1.1.9 Updated K values in filament profiles (linear advance). Added new filament profiles and SLA materials.
+1.1.8 Updated start/end g-code scripts for MK3 family printer profiles (reduced extruder motor current for some print profiles). Added new filament and SLA material profiles.
+1.1.7 Updated end g-code for MMU2 Single printer profiles. Added/updated filament and SLA material profiles.
+1.1.6 Updated firmware version for MK2.5/S and MK3/S.
+1.1.5 Updated MMU1 specific retraction settings for Prusament PC Blend
+1.1.4 Added Prusament PC Blend filament profile.
+1.1.3 Added SLA material and filament profile
1.1.2 Added renamed_from fields for PETG filaments to indicate that they were renamed from PET.
1.1.1 Added Verbatim and Fiberlogy PETG filament profiles. Updated auto cooling settings for ABS.
1.1.1-beta Updated for PrusaSlicer 2.2.0-beta
@@ -11,6 +32,8 @@ min_slic3r_version = 2.2.0-alpha0
1.1.1-alpha2 Bumped up config version, so our in house customer will get updated profiles.
1.1.0 Filament aliases, Creality profiles and other goodies for PrusaSlicer 2.2.0-alpha0
min_slic3r_version = 2.1.1-beta0
+1.0.10 Updated firmware version for MK2.5/S and MK3/S.
+1.0.9 Updated firmware version for MK2.5/S and MK3/S.
1.0.8 Various changes in FFF profiles, new filaments/materials added. See changelog.
1.0.7 Updated layer height limits for MINI
1.0.6 Added Prusa MINI profiles
@@ -27,6 +50,8 @@ min_slic3r_version = 2.1.0-alpha0
1.0.0-alpha1 Added Prusament ASA profile
1.0.0-alpha0 Filament specific retract for PET and similar copolymers, and for FLEX
min_slic3r_version = 1.42.0-alpha6
+0.8.9 Updated firmware version for MK2.5/S and MK3/S.
+0.8.8 Updated firmware version for MK2.5/S and MK3/S.
0.8.7 Updated firmware version
0.8.6 Updated firmware version for MK2.5/S and MK3/S
0.8.5 Updated SL1 printer and material settings
@@ -53,6 +78,8 @@ min_slic3r_version = 1.42.0-alpha
0.4.0-alpha3 Update of SLA profiles
0.4.0-alpha2 First SLA profiles
min_slic3r_version = 1.41.3-alpha
+0.4.12 Updated firmware version for MK2.5/S and MK3/S.
+0.4.11 Updated firmware version for MK2.5/S and MK3/S.
0.4.10 Updated firmware version
0.4.9 Updated firmware version for MK2.5/S and MK3/S
0.4.8 MK2.5/3/S FW update
@@ -65,6 +92,7 @@ min_slic3r_version = 1.41.3-alpha
0.4.1 New MK2.5S and MK3S FW versions
0.4.0 Changelog: https://github.com/prusa3d/Slic3r-settings/blob/master/live/PrusaResearch/changelog.txt
min_slic3r_version = 1.41.1
+0.3.11 Updated firmware version for MK2.5/S and MK3/S.
0.3.10 Updated firmware version
0.3.9 Updated firmware version for MK2.5/S and MK3/S
0.3.8 MK2.5/3/S FW update
@@ -123,4 +151,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 b2896c0b0..2226d1ded 100644
--- a/resources/profiles/PrusaResearch.ini
+++ b/resources/profiles/PrusaResearch.ini
@@ -5,10 +5,10 @@
name = Prusa Research
# Configuration version of this file. Config file will only be installed, if the config_version differs.
# This means, the server may force the PrusaSlicer configuration to be downgraded.
-config_version = 1.1.2
+config_version = 1.2.2
# Where to get the updates from?
-config_update_url = http://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/PrusaResearch/
-changelog_url = http://files.prusa3d.com/?latest=slicer-profiles&lng=%1%
+config_update_url = https://files.prusa3d.com/wp-content/uploads/repository/PrusaSlicer-settings-master/live/PrusaResearch/
+changelog_url = https://files.prusa3d.com/?latest=slicer-profiles&lng=%1%
# The printer models will be shown by the Configuration Wizard in this order,
# also the first model installed & the first nozzle installed will be activated after install.
@@ -18,85 +18,85 @@ changelog_url = http://files.prusa3d.com/?latest=slicer-profiles&lng=%1%
[printer_model:MINI]
-name = Original Prusa MINI
-variants = 0.4; 0.25; 0.6
+name = Original Prusa MINI && MINI+
+variants = 0.4; 0.25; 0.6; 0.8
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; Prusament PVB
[printer_model:MK3S]
-name = Original Prusa i3 MK3S
-variants = 0.4; 0.25; 0.6
+name = Original Prusa i3 MK3S && MK3S+
+variants = 0.4; 0.25; 0.6; 0.8
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; Prusament PVB
[printer_model:MK3]
name = Original Prusa i3 MK3
-variants = 0.4; 0.25; 0.6
+variants = 0.4; 0.25; 0.6; 0.8
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; Prusament PVB
[printer_model:MK3SMMU2S]
-name = Original Prusa i3 MK3S MMU2S
-variants = 0.4; 0.25; 0.6
+name = Original Prusa i3 MK3S && MK3S+ MMU2S
+variants = 0.4; 0.25; 0.6; 0.8
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; Prusament PVB @MMU2
[printer_model:MK3MMU2]
name = Original Prusa i3 MK3 MMU2
-variants = 0.4; 0.25; 0.6
+variants = 0.4; 0.25; 0.6; 0.8
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; Prusament PVB @MMU2
[printer_model:MK2.5S]
name = Original Prusa i3 MK2.5S
-variants = 0.4; 0.25; 0.6
+variants = 0.4; 0.25; 0.6; 0.8
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; Prusament PVB
[printer_model:MK2.5]
name = Original Prusa i3 MK2.5
-variants = 0.4; 0.25; 0.6
+variants = 0.4; 0.25; 0.6; 0.8
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; Prusament PVB
[printer_model:MK2.5SMMU2S]
name = Original Prusa i3 MK2.5S MMU2S
-variants = 0.4; 0.25; 0.6
+variants = 0.4; 0.25; 0.6; 0.8
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; Prusament PVB @MMU2
[printer_model:MK2.5MMU2]
name = Original Prusa i3 MK2.5 MMU2
-variants = 0.4; 0.25; 0.6
+variants = 0.4; 0.25; 0.6; 0.8
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; Prusament PVB @MMU2
[printer_model:MK2S]
name = Original Prusa i3 MK2S
@@ -105,7 +105,7 @@ technology = FFF
family = MK2
bed_model = mk2_bed.stl
bed_texture = mk2.svg
-default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA
+default_materials = Generic PLA; Generic ABS; Generic PETG; Prusament PLA; Prusament PETG; Prusament ASA; Prusament PC Blend; Prusament PVB
[printer_model:MK2SMM]
name = Original Prusa i3 MK2S MMU1
@@ -114,7 +114,7 @@ technology = FFF
family = MK2
bed_model = mk2_bed.stl
bed_texture = mk2.svg
-default_materials = Generic PLA; Generic ABS; Generic PETG @MMU1; Prusament PLA; Prusament PETG @MMU1; Prusament ASA
+default_materials = Generic PLA; Generic ABS; Generic PETG @MMU1; Prusament PLA; Prusament PETG @MMU1; Prusament ASA; Prusament PC Blend; Prusament PVB
[printer_model:SL1]
name = Original Prusa SL1
@@ -226,8 +226,11 @@ wipe_tower_width = 60
wipe_tower_x = 170
wipe_tower_y = 140
xy_size_compensation = 0
-top_solid_min_thickness = 0.6
+top_solid_min_thickness = 0.7
bottom_solid_min_thickness = 0.5
+gcode_label_objects = 1
+infill_anchor = 2.5
+infill_anchor_max = 12
[print:*MK3*]
fill_pattern = grid
@@ -277,19 +280,7 @@ support_material_xy_spacing = 150%
output_filename_format = {input_filename_base}_{nozzle_diameter[0]}n_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode
[print:*0.25nozzleMK3*]
-elefant_foot_compensation = 0
-external_perimeter_extrusion_width = 0.25
-extrusion_width = 0.25
-first_layer_extrusion_width = 0.3
-infill_extrusion_width = 0.25
-perimeter_extrusion_width = 0.25
-solid_infill_extrusion_width = 0.25
-top_infill_extrusion_width = 0.25
-support_material_extrusion_width = 0.2
-support_material_interface_layers = 0
-support_material_interface_spacing = 0.15
-support_material_spacing = 1
-support_material_xy_spacing = 150%
+inherits = *0.25nozzle*
perimeter_speed = 30
external_perimeter_speed = 20
small_perimeter_speed = 20
@@ -308,40 +299,13 @@ max_print_speed = 80
perimeters = 3
fill_pattern = grid
fill_density = 20%
-output_filename_format = {input_filename_base}_{nozzle_diameter[0]}n_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode
[print:*0.25nozzleMINI*]
-elefant_foot_compensation = 0
-external_perimeter_extrusion_width = 0.25
-extrusion_width = 0.25
-first_layer_extrusion_width = 0.3
-infill_extrusion_width = 0.25
-perimeter_extrusion_width = 0.25
-solid_infill_extrusion_width = 0.25
-top_infill_extrusion_width = 0.25
-support_material_extrusion_width = 0.2
-support_material_interface_layers = 0
-support_material_interface_spacing = 0.15
-support_material_spacing = 1
-support_material_xy_spacing = 150%
-perimeter_speed = 30
-external_perimeter_speed = 20
-small_perimeter_speed = 20
+inherits = *0.25nozzleMK3*
infill_speed = 40
solid_infill_speed = 40
-top_solid_infill_speed = 30
-support_material_speed = 40
-bridge_speed = 20
-gap_fill_speed = 30
-perimeter_acceleration = 500
infill_acceleration = 800
-bridge_acceleration = 500
first_layer_acceleration = 500
-max_print_speed = 80
-perimeters = 3
-fill_pattern = grid
-fill_density = 20%
-output_filename_format = {input_filename_base}_{nozzle_diameter[0]}n_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode
# Print parameters common to a 0.6mm diameter nozzle.
[print:*0.6nozzle*]
@@ -355,22 +319,55 @@ top_infill_extrusion_width = 0.6
support_material_extrusion_width = 0.55
support_material_contact_distance = 0.15
support_material_xy_spacing = 80%
+support_material_interface_spacing = 0.3
output_filename_format = {input_filename_base}_{nozzle_diameter[0]}n_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode
+infill_anchor_max = 15
+top_solid_min_thickness = 0.9
+bottom_solid_min_thickness = 0.6
+
+[print:*0.8nozzle*]
+external_perimeter_extrusion_width = 0.9
+extrusion_width = 0.9
+first_layer_extrusion_width = 0.9
+infill_extrusion_width = 0.9
+perimeter_extrusion_width = 0.9
+solid_infill_extrusion_width = 0.9
+top_infill_extrusion_width = 0.8
+support_material_extrusion_width = 0.7
+support_material_contact_distance = 0.25
+support_material_interface_spacing = 0.4
+support_material_spacing = 2
+support_material_xy_spacing = 80%
+support_material_threshold = 50
+output_filename_format = {input_filename_base}_{nozzle_diameter[0]}n_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode
+fill_pattern = gyroid
+fill_density = 15%
+infill_anchor_max = 20
+top_solid_layers = 4
+bottom_solid_layers = 3
+skirt_distance = 3
+skirt_height = 2
+first_layer_height = 0.3
+infill_overlap = 30%
+bridge_speed = 22
+gap_fill_speed = 30
+bridge_flow_ratio = 0.9
+perimeter_acceleration = 800
+infill_acceleration = 1000
+bridge_acceleration = 1000
+first_layer_acceleration = 1000
+default_acceleration = 1000
+top_solid_min_thickness = 1.2
+bottom_solid_min_thickness = 0.8
+single_extruder_multi_material_priming = 0
[print:*0.6nozzleMK3*]
+inherits = *0.6nozzle*
external_perimeter_extrusion_width = 0.65
extrusion_width = 0.65
-first_layer_extrusion_width = 0.65
infill_extrusion_width = 0.65
-perimeter_extrusion_width = 0.65
-solid_infill_extrusion_width = 0.65
-top_infill_extrusion_width = 0.6
-support_material_extrusion_width = 0.55
bridge_flow_ratio = 0.95
bridge_speed = 25
-support_material_contact_distance = 0.15
-support_material_xy_spacing = 80%
-output_filename_format = {input_filename_base}_{nozzle_diameter[0]}n_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode
[print:*0.6nozzleMINI*]
external_perimeter_extrusion_width = 0.65
@@ -395,6 +392,10 @@ first_layer_acceleration = 1000
default_acceleration = 1250
support_material_speed = 40
output_filename_format = {input_filename_base}_{nozzle_diameter[0]}n_{layer_height}mm_{filament_type[0]}_{printer_model}_{print_time}.gcode
+infill_anchor_max = 15
+support_material_interface_spacing = 0.3
+top_solid_min_thickness = 0.9
+bottom_solid_min_thickness = 0.6
[print:*soluble_support*]
overhangs = 1
@@ -555,7 +556,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
@@ -682,15 +683,16 @@ top_solid_infill_speed = 50
# MK3 MMU #
[print:0.15mm SOLUBLE FULL @MK3]
inherits = 0.15mm SPEED @MK3; *soluble_support*
-# alias = 0.15mm SOLUBLE FULL
compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK3.*/ and nozzle_diameter[0]==0.4 and num_extruders>1
notes = Set your soluble extruder in Multiple Extruders > Support material/raft/skirt extruder & Support material/raft interface extruder
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
+support_material_speed = 45
# MK3 MMU #
[print:0.15mm SOLUBLE INTERFACE @MK3]
@@ -814,8 +816,10 @@ 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
+support_material_speed = 45
# MK3 MMU #
[print:0.20mm SOLUBLE INTERFACE @MK3]
@@ -1073,10 +1077,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
@@ -1096,6 +1100,12 @@ compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and
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
# alias = 0.15mm OPTIMAL SOLUBLE FULL
@@ -1175,6 +1185,53 @@ support_material_interface_layers = 3
support_material_with_sheath = 0
support_material_xy_spacing = 80%
+## 0.8mm nozzle print profiles
+
+[print:0.30mm DETAIL @0.8 nozzle]
+inherits = *common*; *0.8nozzle*
+layer_height = 0.30
+## Only for MMU2 Single mode at the moment
+compatible_printers_condition = printer_model=~/(MK3|MK2.5).*/ and nozzle_diameter[0]==0.8 and num_extruders==1
+perimeter_speed = 35
+external_perimeter_speed = 25
+infill_acceleration = 1000
+infill_speed = 50
+max_print_speed = 80
+solid_infill_speed = 50
+top_solid_infill_speed = 35
+support_material_speed = 40
+
+[print:0.40mm QUALITY @0.8 nozzle]
+inherits = *common*; *0.8nozzle*
+layer_height = 0.4
+## Only for MMU2 Single mode at the moment
+compatible_printers_condition = printer_model=~/(MK3|MK2.5).*/ and nozzle_diameter[0]==0.8 and num_extruders==1
+perimeter_speed = 35
+external_perimeter_speed = 25
+infill_acceleration = 1000
+infill_speed = 50
+max_print_speed = 50
+solid_infill_speed = 45
+top_solid_infill_speed = 35
+support_material_speed = 40
+
+[print:0.55mm DRAFT @0.8 nozzle]
+inherits = *common*; *0.8nozzle*
+layer_height = 0.55
+## Only for MMU2 Single mode at the moment
+compatible_printers_condition = printer_model=~/(MK3|MK2.5).*/ and nozzle_diameter[0]==0.8 and num_extruders==1
+perimeter_speed = 30
+external_perimeter_speed = 25
+infill_acceleration = 1000
+infill_speed = 50
+max_print_speed = 50
+solid_infill_speed = 40
+support_material_speed = 35
+support_material_contact_distance = 0.25
+top_solid_infill_speed = 30
+external_perimeter_extrusion_width = 1
+perimeter_extrusion_width = 1
+
## MINI print profiles
# 0.4mm nozzle
@@ -1326,7 +1383,7 @@ compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and
fill_pattern = grid
fill_density = 20%
-# 0.6mm nozzle
+# 0.6mm nozzle MINI
[print:0.15mm DETAIL @0.6 nozzle MINI]
inherits = *0.15mm*; *0.6nozzleMINI*
@@ -1356,7 +1413,6 @@ solid_infill_extrusion_width = 0.65
[print:0.30mm QUALITY @0.6 nozzle MINI]
inherits = *0.30mm*; *0.6nozzleMINI*
-# alias = 0.30mm QUALITY
compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6
external_perimeter_speed = 35
infill_speed = 65
@@ -1369,7 +1425,6 @@ perimeter_extrusion_width = 0.68
[print:0.35mm SPEED @0.6 nozzle MINI]
inherits = *0.35mm*; *0.6nozzleMINI*
-# alias = 0.35mm SPEED
compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6
external_perimeter_speed = 35
infill_speed = 60
@@ -1382,7 +1437,6 @@ perimeter_extrusion_width = 0.68
[print:0.40mm DRAFT @0.6 nozzle MINI]
inherits = *0.40mm*; *0.6nozzleMINI*
-# alias = 0.40mm DRAFT
compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MINI.*/ and nozzle_diameter[0]==0.6
external_perimeter_speed = 35
infill_speed = 50
@@ -1395,6 +1449,44 @@ perimeter_extrusion_width = 0.68
infill_extrusion_width = 0.68
solid_infill_extrusion_width = 0.68
+# 0.8mm nozzle MINI
+
+[print:0.30mm DETAIL @0.8 nozzle MINI]
+inherits = 0.30mm DETAIL @0.8 nozzle
+compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]==0.8
+perimeter_speed = 35
+external_perimeter_speed = 25
+infill_acceleration = 1000
+infill_speed = 50
+max_print_speed = 80
+solid_infill_speed = 45
+top_solid_infill_speed = 35
+support_material_speed = 40
+travel_speed = 150
+
+[print:0.40mm QUALITY @0.8 nozzle MINI]
+inherits = 0.40mm QUALITY @0.8 nozzle
+compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]==0.8
+infill_speed = 40
+max_print_speed = 50
+solid_infill_speed = 40
+top_solid_infill_speed = 30
+support_material_speed = 40
+travel_speed = 150
+
+[print:0.55mm DRAFT @0.8 nozzle MINI]
+inherits = 0.55mm DRAFT @0.8 nozzle
+compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]==0.8
+infill_acceleration = 1000
+infill_speed = 40
+solid_infill_speed = 40
+support_material_speed = 35
+support_material_contact_distance = 0.25
+top_solid_infill_speed = 28
+external_perimeter_extrusion_width = 1
+perimeter_extrusion_width = 1
+travel_speed = 150
+
# XXXXXXxxXXXXXXXXXXXXXX
# XXX--- filament ---XXX
# XXXXXXXXxxXXXXXXXXXXXX
@@ -1425,7 +1517,7 @@ filament_notes = ""
filament_settings_id = ""
filament_soluble = 0
min_print_speed = 15
-slowdown_below_layer_time = 20
+slowdown_below_layer_time = 15
start_filament_gcode = "M900 K{if printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif printer_notes=~/.*PRINTER_HAS_BOWDEN.*/}200{else}30{endif} ; Filament gcode"
[filament:*PLA*]
@@ -1433,6 +1525,7 @@ inherits = *common*
bed_temperature = 60
bridge_fan_speed = 100
disable_fan_first_layers = 1
+full_fan_speed_layer = 4
fan_always_on = 1
fan_below_layer_time = 100
filament_colour = #FF8000
@@ -1443,13 +1536,14 @@ 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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{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{elsif nozzle_diameter[0]==0.8};{else}M900 K30{endif} ; Filament gcode LA 1.0"
[filament:*PET*]
inherits = *common*
bed_temperature = 90
bridge_fan_speed = 50
disable_fan_first_layers = 3
+full_fan_speed_layer = 5
fan_always_on = 1
fan_below_layer_time = 20
filament_colour = #FF8000
@@ -1459,7 +1553,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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.02{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{elsif nozzle_diameter[0]==0.8};{else}M900 K45{endif} ; Filament gcode LA 1.0"
temperature = 240
filament_retract_length = 1.4
filament_retract_lift = 0.2
@@ -1486,7 +1580,7 @@ filament_retract_lift = nil
filament_retract_before_travel = 1
filament_max_volumetric_speed = 7
compatible_printers_condition = printer_model=="MINI"
-start_filament_gcode = "M900 K{if nozzle_diameter[0]==0.6}0.12{else}0.2{endif} ; Filament gcode"
+start_filament_gcode = "M900 K{if nozzle_diameter[0]==0.6}0.12{elsif nozzle_diameter[0]==0.8}0.06{else}0.2{endif} ; Filament gcode"
[filament:*PETMINI06*]
inherits = *PET*
@@ -1509,8 +1603,9 @@ filament_retract_lift = nil
filament_retract_before_travel = 3
filament_wipe = 0
filament_max_volumetric_speed = 10
+slowdown_below_layer_time = 20
compatible_printers_condition = printer_model=="MINI"
-start_filament_gcode = "M900 K{if nozzle_diameter[0]==0.6}0.12{else}0.2{endif} ; Filament gcode"
+start_filament_gcode = "M900 K{if nozzle_diameter[0]==0.6}0.12{elsif nozzle_diameter[0]==0.8}0.06{else}0.2{endif} ; Filament gcode"
[filament:*FLEXMINI*]
inherits = *FLEX*
@@ -1530,6 +1625,7 @@ min_fan_speed = 50
filament_max_volumetric_speed = 1.35
compatible_printers_condition = nozzle_diameter[0]>0.35 and printer_model=="MINI"
disable_fan_first_layers = 4
+full_fan_speed_layer = 6
extrusion_multiplier = 1.15
filament_density = 1.22
filament_colour = #F2F200
@@ -1552,7 +1648,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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{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{elsif nozzle_diameter[0]==0.8};{else}M900 K20{endif} ; Filament gcode LA 1.0"
compatible_printers_condition = printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
[filament:*ABSC*]
@@ -1562,7 +1658,7 @@ bridge_fan_speed = 25
cooling = 1
disable_fan_first_layers = 4
fan_always_on = 0
-fan_below_layer_time = 20
+fan_below_layer_time = 30
slowdown_below_layer_time = 20
filament_colour = #FFF2EC
filament_max_volumetric_speed = 11
@@ -1574,7 +1670,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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{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{elsif nozzle_diameter[0]==0.8};{else}M900 K20{endif} ; Filament gcode LA 1.0"
compatible_printers_condition = printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
[filament:*FLEX*]
@@ -1607,8 +1703,9 @@ 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_spool_weight = 236
filament_colour = #804040
filament_max_volumetric_speed = 9
@@ -1617,8 +1714,9 @@ 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_spool_weight = 236
filament_colour = #808080
filament_max_volumetric_speed = 8
@@ -1629,6 +1727,7 @@ compatible_printers_condition = nozzle_diameter[0]>0.35 and ! (printer_notes=~/.
extrusion_multiplier = 1.2
filament_cost = 72.89
filament_density = 3.9
+filament_spool_weight = 236
filament_colour = #82603E
filament_max_volumetric_speed = 9
@@ -1643,11 +1742,11 @@ fan_always_on = 0
fan_below_layer_time = 10
filament_cost = 65.66
filament_density = 1.18
+filament_spool_weight = 236
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"
temperature = 270
[filament:ColorFabb PLA-PHA]
@@ -1655,18 +1754,20 @@ inherits = *PLA*
filament_vendor = ColorFabb
filament_cost = 52.46
filament_density = 1.24
+filament_spool_weight = 236
[filament:ColorFabb woodFill]
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_spool_weight = 236
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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{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{elsif nozzle_diameter[0]==0.8};{else}M900 K20{endif} ; Filament gcode LA 1.0"
temperature = 200
filament_retract_lift = 0.2
@@ -1675,20 +1776,22 @@ 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_spool_weight = 236
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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{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{elsif nozzle_diameter[0]==0.8};{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
+filament_spool_weight = 236
first_layer_bed_temperature = 90
first_layer_temperature = 260
temperature = 270
@@ -1696,23 +1799,26 @@ 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_spool_weight = 236
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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{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{elsif nozzle_diameter[0]==0.8};{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
+compatible_printers_condition = nozzle_diameter[0]>=0.4 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)
[filament:ColorFabb nGen]
inherits = *PET*
filament_vendor = ColorFabb
filament_cost = 52.46
filament_density = 1.2
+filament_spool_weight = 236
bridge_fan_speed = 40
fan_always_on = 0
fan_below_layer_time = 10
@@ -1726,6 +1832,7 @@ inherits = *FLEX*
filament_vendor = ColorFabb
filament_cost = 58.30
filament_density = 1
+filament_spool_weight = 236
bed_temperature = 85
bridge_fan_speed = 40
cooling = 1
@@ -1742,6 +1849,38 @@ 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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{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{elsif nozzle_diameter[0]==0.8};{else}M900 K30{endif} ; Filament gcode LA 1.0"
+compatible_printers_condition = nozzle_diameter[0]>=0.4 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)
+
+[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
+compatible_printers_condition = nozzle_diameter[0]>=0.4 and printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
+
+[filament:Kimya ABS Kevlar]
+inherits = Kimya ABS Carbon
+filament_vendor = Kimya
+filament_density = 1.037
+
[filament:E3D Edge]
inherits = *PET*
filament_vendor = E3D
@@ -1762,14 +1901,16 @@ temperature = 270
[filament:Fillamentum PLA]
inherits = *PLA*
filament_vendor = Fillamentum
-filament_cost = 25.4
+filament_cost = 21.99
filament_density = 1.24
+filament_spool_weight = 230
[filament:Fillamentum ABS]
inherits = *ABSC*
filament_vendor = Fillamentum
filament_cost = 32.4
filament_density = 1.04
+filament_spool_weight = 230
first_layer_temperature = 240
temperature = 240
@@ -1778,6 +1919,7 @@ inherits = *ABS*
filament_vendor = Fillamentum
filament_cost = 38.7
filament_density = 1.07
+filament_spool_weight = 230
fan_always_on = 1
cooling = 1
min_fan_speed = 20
@@ -1793,6 +1935,7 @@ inherits = *ABS*
filament_vendor = Prusa Polymers
filament_cost = 35.28
filament_density = 1.07
+filament_spool_weight = 201
fan_always_on = 1
first_layer_temperature = 260
first_layer_bed_temperature = 105
@@ -1801,24 +1944,91 @@ 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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{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{elsif nozzle_diameter[0]==0.8};{else}M900 K20{endif} ; Filament gcode LA 1.0"
+compatible_printers_condition = nozzle_diameter[0]!=0.8 and printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
+
+[filament:Prusament PC Blend]
+inherits = *ABS*
+filament_vendor = Prusa Polymers
+filament_cost = 49.99
+filament_density = 1.22
+filament_spool_weight = 201
+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 nozzle_diameter[0]!=0.8 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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.02{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{elsif nozzle_diameter[0]==0.8};{else}M900 K45{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
+filament_spool_weight = 201
+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 = nozzle_diameter[0]!=0.8 and 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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.02{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{elsif nozzle_diameter[0]==0.8};{else}M900 K45{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_spool_weight = 230
filament_type = CPE
first_layer_bed_temperature = 90
first_layer_temperature = 275
max_fan_speed = 50
min_fan_speed = 50
+disable_fan_first_layers = 3
+full_fan_speed_layer = 5
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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.02{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{elsif nozzle_diameter[0]==0.8};{else}M900 K45{endif} ; Filament gcode LA 1.0"
[filament:Fillamentum Timberfill]
inherits = *PLA*
@@ -1827,10 +2037,11 @@ compatible_printers_condition = nozzle_diameter[0]>0.35 and ! (printer_notes=~/.
extrusion_multiplier = 1.1
filament_cost = 68
filament_density = 1.15
+filament_spool_weight = 230
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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{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{elsif nozzle_diameter[0]==0.8};{else}M900 K20{endif} ; Filament gcode LA 1.0"
temperature = 190
filament_retract_lift = 0.2
@@ -1844,7 +2055,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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{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{elsif nozzle_diameter[0]==0.8};{else}M900 K20{endif} ; Filament gcode LA 1.0"
temperature = 220
filament_retract_lift = 0.2
@@ -1853,24 +2064,36 @@ inherits = *ABSC*
filament_vendor = Generic
filament_cost = 27.82
filament_density = 1.04
+compatible_printers_condition = nozzle_diameter[0]!=0.8 and printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
[filament:Esun ABS]
inherits = *ABSC*
filament_vendor = Esun
filament_cost = 27.82
filament_density = 1.04
+filament_spool_weight = 265
[filament:Hatchbox ABS]
inherits = *ABSC*
filament_vendor = Hatchbox
filament_cost = 27.82
filament_density = 1.04
+filament_spool_weight = 245
[filament:Plasty Mladec ABS]
inherits = *ABSC*
filament_vendor = Plasty Mladec
filament_cost = 27.82
-filament_density = 1.04
+filament_density = 1.08
+filament_spool_weight = 230
+
+[filament:Verbatim ABS]
+inherits = *ABSC*
+filament_vendor = Verbatim
+filament_cost = 25.87
+filament_density = 1.05
+filament_spool_weight = 235
+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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{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{elsif nozzle_diameter[0]==0.8};{else}M900 K20{endif} ; Filament gcode LA 1.0"
[filament:Generic PETG]
inherits = *PET*
@@ -1878,18 +2101,46 @@ renamed_from = "Generic PET"
filament_vendor = Generic
filament_cost = 27.82
filament_density = 1.27
+compatible_printers_condition = nozzle_diameter[0]!=0.8 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)
[filament:Plasty Mladec PETG]
inherits = *PET*
filament_vendor = Plasty Mladec
filament_cost = 27.82
filament_density = 1.27
+filament_spool_weight = 230
+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)
[filament:Generic PLA]
inherits = *PLA*
filament_vendor = Generic
filament_cost = 25.4
filament_density = 1.24
+compatible_printers_condition = nozzle_diameter[0]!=0.8 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
+
+[filament:Devil Design PLA]
+inherits = *PLA*
+filament_vendor = Devil Design
+filament_cost = 20.99
+filament_density = 1.24
+filament_spool_weight = 250
+
+[filament:Devil Design PETG]
+inherits = *PET*
+filament_vendor = Devil Design
+filament_cost = 20.99
+filament_density = 1.23
+filament_spool_weight = 250
+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*
@@ -1900,6 +2151,24 @@ filament_max_volumetric_speed = 1.2
filament_retract_length = 0
filament_retract_speed = nil
filament_retract_lift = nil
+compatible_printers_condition = nozzle_diameter[0]>0.35 and nozzle_diameter[0]!=0.8 and printer_model!="MK2SMM" 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:Fillamentum Flexfill 92A]
+inherits = *FLEX*
+filament_vendor = Fillamentum
+filament_cost = 33.99
+filament_density = 1.20
+filament_spool_weight = 230
+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 = 4
+full_fan_speed_layer = 6
[filament:SainSmart TPU]
inherits = *FLEX*
@@ -1922,7 +2191,8 @@ filament_retract_speed = nil
filament_deretract_speed = 25
filament_retract_lift = 0
filament_wipe = 0
-disable_fan_first_layers = 3
+disable_fan_first_layers = 4
+full_fan_speed_layer = 6
min_print_speed = 15
slowdown_below_layer_time = 10
cooling = 1
@@ -1941,14 +2211,15 @@ 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
filament_deretract_speed = 25
filament_retract_lift = 0
filament_wipe = 0
-disable_fan_first_layers = 3
+disable_fan_first_layers = 4
+full_fan_speed_layer = 6
min_print_speed = 15
slowdown_below_layer_time = 10
cooling = 1
@@ -1970,7 +2241,7 @@ filament_max_volumetric_speed = 8
[filament:PrimaSelect PVA+]
inherits = *PLA*
filament_vendor = PrimaSelect
-filament_cost = 108
+filament_cost = 45.01
filament_density = 1.23
cooling = 0
fan_always_on = 0
@@ -1980,18 +2251,20 @@ 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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{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{elsif nozzle_diameter[0]==0.8};{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_spool_weight = 230
+compatible_printers_condition = nozzle_diameter[0]!=0.8 and printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
[filament:*ABS MMU2*]
inherits = Prusa ABS
-compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material
+compatible_printers_condition = nozzle_diameter[0]!=0.8 and printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material
filament_cooling_final_speed = 50
filament_cooling_initial_speed = 10
filament_cooling_moves = 5
@@ -2006,11 +2279,38 @@ 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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{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{elsif nozzle_diameter[0]==0.8};{else}M900 K20{endif} ; Filament gcode LA 1.0"
+
[filament:Prusament ASA @MMU2]
inherits = *ABS MMU2*
filament_vendor = Prusa Polymers
filament_cost = 35.28
filament_density = 1.07
+filament_spool_weight = 201
fan_always_on = 1
first_layer_temperature = 260
first_layer_bed_temperature = 105
@@ -2019,6 +2319,7 @@ bed_temperature = 110
cooling = 1
min_fan_speed = 20
max_fan_speed = 20
+bridge_fan_speed = 30
min_print_speed = 15
slowdown_below_layer_time = 15
disable_fan_first_layers = 4
@@ -2027,21 +2328,56 @@ 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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{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{elsif nozzle_diameter[0]==0.8};{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
+filament_spool_weight = 201
+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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.02{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 K22{elsif nozzle_diameter[0]==0.8};{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_spool_weight = 230
[filament:Plasty Mladec ABS @MMU2]
inherits = *ABS MMU2*
filament_vendor = Plasty Mladec
+filament_density = 1.08
+filament_spool_weight = 230
[filament:Prusa HIPS]
inherits = *ABS*
filament_vendor = Made for Prusa
filament_cost = 27.3
filament_density = 1.04
+filament_spool_weight = 230
bridge_fan_speed = 50
cooling = 1
extrusion_multiplier = 1
@@ -2053,8 +2389,9 @@ 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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{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{elsif nozzle_diameter[0]==0.8};{else}M900 K20{endif} ; Filament gcode LA 1.0"
temperature = 220
+compatible_printers_condition = nozzle_diameter[0]!=0.8 and printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
[filament:Generic HIPS]
inherits = *ABS*
@@ -2072,22 +2409,25 @@ 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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{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{elsif nozzle_diameter[0]==0.8};{else}M900 K20{endif} ; Filament gcode LA 1.0"
temperature = 230
+compatible_printers_condition = nozzle_diameter[0]!=0.8 and printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
[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)
+filament_spool_weight = 230
+compatible_printers_condition = nozzle_diameter[0]!=0.6 and nozzle_diameter[0]!=0.8 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)
[filament:Verbatim PETG]
inherits = *PET*
filament_vendor = Verbatim
filament_cost = 27.90
filament_density = 1.27
+filament_spool_weight = 235
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)
[filament:Fiberlogy PETG]
@@ -2102,25 +2442,28 @@ 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_spool_weight = 201
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)
+compatible_printers_condition = nozzle_diameter[0]!=0.8 and 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)
[filament:Prusa PETG @0.6 nozzle]
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_spool_weight = 230
[filament:Prusament PETG @0.6 nozzle]
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_spool_weight = 201
filament_type = PETG
[filament:Plasty Mladec PETG @0.6 nozzle]
@@ -2130,6 +2473,19 @@ first_layer_temperature = 230
temperature = 240
filament_cost = 27.92
filament_density = 1.27
+filament_spool_weight = 230
+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_spool_weight = 250
filament_type = PETG
[filament:Verbatim PETG @0.6 nozzle]
@@ -2139,6 +2495,7 @@ first_layer_temperature = 230
temperature = 240
filament_cost = 27.90
filament_density = 1.27
+filament_spool_weight = 235
filament_type = PETG
[filament:Fiberlogy PETG @0.6 nozzle]
@@ -2152,7 +2509,7 @@ filament_type = PETG
[filament:*PET MMU2*]
inherits = Prusa PETG
-compatible_printers_condition = nozzle_diameter[0]!=0.6 and printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material
+compatible_printers_condition = nozzle_diameter[0]!=0.8 and nozzle_diameter[0]!=0.6 and printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material
temperature = 230
first_layer_temperature = 230
filament_cooling_final_speed = 1
@@ -2181,16 +2538,22 @@ filament_vendor = Generic
[filament:Plasty Mladec PETG @MMU2]
inherits = *PET MMU2*
filament_vendor = Plasty Mladec
+filament_spool_weight = 230
[filament:Prusa PETG @MMU2]
inherits = *PET MMU2*
renamed_from = "Prusa PET MMU2"; "Prusa PETG MMU2"
filament_vendor = Made for Prusa
+filament_cost = 22.99
+filament_spool_weight = 230
[filament:Prusament PETG @MMU2]
inherits = *PET MMU2*
filament_type = PETG
filament_vendor = Prusa Polymers
+filament_cost = 29.99
+filament_density = 1.27
+filament_spool_weight = 201
[filament:Generic PETG @MMU2 0.6 nozzle]
inherits = *PET MMU2 06*
@@ -2201,22 +2564,29 @@ filament_vendor = Generic
inherits = *PET MMU2 06*
renamed_from = "Prusa PET MMU2 0.6 nozzle"; "Prusa PETG MMU2 0.6 nozzle"
filament_vendor = Made for Prusa
+filament_spool_weight = 230
[filament:Prusament PETG @MMU2 0.6 nozzle]
inherits = *PET MMU2 06*
filament_type = PETG
filament_vendor = Prusa Polymers
+filament_cost = 29.99
+filament_density = 1.27
+filament_spool_weight = 201
[filament:Plasty Mladec PETG @MMU2 0.6 nozzle]
inherits = *PET MMU2 06*
filament_type = PETG
filament_vendor = Plasty Mladec
+filament_spool_weight = 230
[filament:Prusa PLA]
inherits = *PLA*
filament_vendor = Made for Prusa
-filament_cost = 25.4
+filament_cost = 20.99
filament_density = 1.24
+filament_spool_weight = 230
+compatible_printers_condition = nozzle_diameter[0]!=0.8 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
[filament:Fiberlogy PLA]
inherits = *PLA*
@@ -2229,6 +2599,7 @@ inherits = *PLA*
filament_vendor = Plasty Mladec
filament_cost = 25.4
filament_density = 1.24
+filament_spool_weight = 230
[filament:AmazonBasics PLA]
inherits = *PLA*
@@ -2236,17 +2607,26 @@ filament_vendor = AmazonBasics
filament_cost = 25.4
filament_density = 1.24
+[filament:Overture PLA]
+inherits = *PLA*
+filament_vendor = Overture
+filament_cost = 22
+filament_density = 1.24
+filament_spool_weight = 235
+
[filament:Hatchbox PLA]
inherits = *PLA*
filament_vendor = Hatchbox
filament_cost = 25.4
filament_density = 1.24
+filament_spool_weight = 245
[filament:Esun PLA]
inherits = *PLA*
filament_vendor = Esun
filament_cost = 25.4
filament_density = 1.24
+filament_spool_weight = 265
[filament:Das Filament PLA]
inherits = *PLA*
@@ -2272,11 +2652,30 @@ filament_vendor = Prusa Polymers
temperature = 215
filament_cost = 24.99
filament_density = 1.24
+filament_spool_weight = 201
filament_notes = "Affordable filament for everyday printing in premium quality manufactured in-house by Josef Prusa"
+compatible_printers_condition = nozzle_diameter[0]!=0.8 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
+
+[filament:Prusament PVB]
+inherits = *PLA*
+filament_vendor = Prusa Polymers
+temperature = 215
+bed_temperature = 75
+first_layer_bed_temperature = 75
+filament_cost = 49.98
+filament_density = 1.09
+filament_spool_weight = 201
+filament_max_volumetric_speed = 8
+filament_type = PVB
+filament_soluble = 1
+filament_colour = #FFFF6F
+compatible_printers_condition = nozzle_diameter[0]!=0.8 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
+slowdown_below_layer_time = 20
+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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.02{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{elsif nozzle_diameter[0]==0.8};{else}M900 K45{endif} ; Filament gcode LA 1.0"
[filament:*PLA MMU2*]
inherits = Prusa PLA
-compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material
+compatible_printers_condition = nozzle_diameter[0]!=0.8 and printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material
temperature = 205
filament_cooling_final_speed = 2
filament_cooling_initial_speed = 3
@@ -2289,6 +2688,7 @@ filament_unloading_speed = 20
filament_loading_speed_start = 19
filament_minimal_purge_on_wipe_tower = 15
filament_unloading_speed_start = 100
+full_fan_speed_layer = 4
[filament:Generic PLA @MMU2]
inherits = *PLA MMU2*
@@ -2297,18 +2697,58 @@ filament_vendor = Generic
[filament:Prusa PLA @MMU2]
inherits = *PLA MMU2*
filament_vendor = Made for Prusa
+filament_cost = 20.99
+filament_spool_weight = 230
[filament:Prusament PLA @MMU2]
inherits = *PLA MMU2*
filament_vendor = Prusa Polymers
+filament_cost = 24.99
+filament_density = 1.24
+filament_spool_weight = 201
+
+[filament:Prusament PVB @MMU2]
+inherits = *PLA MMU2*
+filament_vendor = Prusa Polymers
+filament_cost = 49.98
+filament_density = 1.09
+filament_max_volumetric_speed = 8
+filament_soluble = 1
+filament_type = PVB
+filament_colour = #FFFF6F
+filament_spool_weight = 201
+slowdown_below_layer_time = 20
+filament_ramming_parameters = "120 110 1.74194 1.90323 2.16129 2.48387 2.83871 3.25806 3.83871 4.6129 5.41935 5.96774| 0.05 1.69677 0.45 1.96128 0.95 2.63872 1.45 3.46129 1.95 4.99031 2.45 6.12908 2.95 8.30974 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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.02{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{elsif nozzle_diameter[0]==0.8};{else}M900 K45{endif} ; Filament gcode LA 1.0"
+
+[filament:Fillamentum PLA @MMU2]
+inherits = *PLA MMU2*
+filament_vendor = Fillamentum
+filament_cost = 21.99
+filament_density = 1.24
+filament_spool_weight = 230
[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_spool_weight = 230
+filament_max_volumetric_speed = 1.35
+fan_always_on = 1
+cooling = 0
+max_fan_speed = 50
+min_fan_speed = 50
+disable_fan_first_layers = 4
+full_fan_speed_layer = 6
+
[filament:Taulman Bridge]
inherits = *common*
filament_vendor = Taulman
@@ -2321,16 +2761,110 @@ 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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.02{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{elsif nozzle_diameter[0]==0.8};{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
+filament_spool_weight = 230
+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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.02{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{elsif nozzle_diameter[0]==0.8};{else}M900 K48{endif} ; Filament gcode LA 1.0"
+temperature = 250
+
+[filament:Fiberthree F3 PA Pure Pro]
+inherits = *common*
+filament_vendor = Fiberthree
+filament_cost = 165.98
+filament_density = 1.2
+bed_temperature = 70
+first_layer_bed_temperature = 75
+first_layer_temperature = 270
+temperature = 270
+bridge_fan_speed = 30
+cooling = 1
+disable_fan_first_layers = 3
+fan_always_on = 1
+fan_below_layer_time = 20
+min_print_speed = 15
+slowdown_below_layer_time = 10
+filament_colour = #DEE0E6
+filament_max_volumetric_speed = 5
+filament_soluble = 0
+filament_type = NYLON
+max_fan_speed = 20
+min_fan_speed = 20
+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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{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{elsif nozzle_diameter[0]==0.8};{else}M900 K30{endif} ; Filament gcode LA 1.0"
+filament_retract_length = 2
+filament_retract_speed = 40
+filament_retract_lift = nil
+filament_retract_before_travel = 1.5
+filament_wipe = 0
+compatible_printers_condition = 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)
+
+[filament:Fiberthree F3 PA-CF Pro]
+inherits = *common*
+filament_vendor = Fiberthree
+filament_cost = 171.98
+filament_density = 1.25
+bed_temperature = 70
+first_layer_bed_temperature = 75
+first_layer_temperature = 275
+temperature = 275
+bridge_fan_speed = 30
+cooling = 1
+disable_fan_first_layers = 3
+fan_always_on = 0
+fan_below_layer_time = 20
+min_print_speed = 15
+slowdown_below_layer_time = 10
+filament_colour = #DEE0E6
+filament_max_volumetric_speed = 5
+filament_soluble = 0
+filament_type = NYLON
+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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{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{elsif nozzle_diameter[0]==0.8};{else}M900 K30{endif} ; Filament gcode LA 1.0"
+filament_retract_length = 2
+filament_retract_speed = 40
+filament_retract_lift = nil
+filament_retract_before_travel = 1.5
+filament_wipe = 0
+compatible_printers_condition = nozzle_diameter[0]>=0.4 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)
+
+[filament:Fiberthree F3 PA-GF Pro]
+inherits = Fiberthree F3 PA-CF Pro
+filament_vendor = Fiberthree
+filament_cost = 169.98
+filament_density = 1.27
+fan_always_on = 1
+max_fan_speed = 15
+min_fan_speed = 15
+
[filament:Taulman T-Glase]
inherits = *PET*
filament_vendor = Taulman
@@ -2343,19 +2877,21 @@ 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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.02{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{elsif nozzle_diameter[0]==0.8};{else}M900 K45{endif} ; Filament gcode LA 1.0"
[filament:Verbatim PLA]
inherits = *PLA*
filament_vendor = Verbatim
filament_cost = 42.99
filament_density = 1.24
+filament_spool_weight = 235
[filament:Verbatim BVOH]
inherits = *common*
filament_vendor = Verbatim
-filament_cost = 218
+filament_cost = 79.99
filament_density = 1.23
+filament_spool_weight = 235
bed_temperature = 60
bridge_fan_speed = 100
cooling = 0
@@ -2371,13 +2907,13 @@ 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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{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{elsif nozzle_diameter[0]==0.8};{else}M900 K20{endif} ; Filament gcode LA 1.0"
temperature = 210
[filament:Verbatim BVOH @MMU2]
inherits = Verbatim BVOH
filament_vendor = Verbatim
-compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material
+compatible_printers_condition = nozzle_diameter[0]!=0.8 and printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material
temperature = 195
fan_always_on = 1
first_layer_temperature = 200
@@ -2408,7 +2944,7 @@ filament_colour = #FFFFD7
filament_cooling_final_speed = 2
filament_cooling_initial_speed = 4
filament_cooling_moves = 2
-filament_cost = 25.4
+filament_cost = 45.01
filament_density = 1.24
filament_diameter = 1.75
filament_load_time = 15
@@ -2429,7 +2965,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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{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{elsif nozzle_diameter[0]==0.8};{else}M900 K20{endif} ; Filament gcode LA 1.0"
temperature = 195
[filament:Verbatim PP]
@@ -2437,6 +2973,7 @@ inherits = *common*
filament_vendor = Verbatim
filament_cost = 72
filament_density = 0.89
+filament_spool_weight = 235
bed_temperature = 100
bridge_fan_speed = 100
cooling = 1
@@ -2451,7 +2988,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
@@ -2467,6 +3004,7 @@ fan_always_on = 0
fan_below_layer_time = 10
filament_cost = 58.66
filament_density = 1.18
+filament_spool_weight = 236
first_layer_bed_temperature = 105
first_layer_temperature = 270
max_fan_speed = 20
@@ -2478,8 +3016,9 @@ temperature = 270
inherits = *PETMMU1*
filament_vendor = ColorFabb
filament_type = PETG
-filament_cost = 62.9
+filament_cost = 38.99
filament_density = 1.27
+filament_spool_weight = 236
first_layer_bed_temperature = 90
first_layer_temperature = 260
temperature = 270
@@ -2487,12 +3026,13 @@ temperature = 270
[filament:ColorFabb XT-CF20 @MMU1]
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
+compatible_printers_condition = nozzle_diameter[0]>=0.4 and printer_model=="MK2SMM"
+extrusion_multiplier = 1.05
+filament_cost = 49.99
filament_density = 1.35
+filament_spool_weight = 236
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"
@@ -2503,6 +3043,7 @@ inherits = *PETMMU1*
filament_vendor = ColorFabb
filament_cost = 21.2
filament_density = 1.2
+filament_spool_weight = 236
bridge_fan_speed = 40
fan_always_on = 0
fan_below_layer_time = 10
@@ -2521,13 +3062,16 @@ 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_spool_weight = 230
filament_type = CPE
first_layer_bed_temperature = 90
first_layer_temperature = 275
max_fan_speed = 50
min_fan_speed = 50
+disable_fan_first_layers = 3
+full_fan_speed_layer = 5
temperature = 275
[filament:Generic PETG @MMU1]
@@ -2537,17 +3081,30 @@ 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
+filament_spool_weight = 250
+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
filament_cost = 27.82
filament_density = 1.27
+filament_spool_weight = 230
[filament:Verbatim PETG @MMU1]
inherits = *PETMMU1*
filament_vendor = Verbatim
filament_cost = 27.90
filament_density = 1.27
+filament_spool_weight = 235
[filament:Fiberlogy PETG @MMU1]
inherits = *PETMMU1*
@@ -2559,16 +3116,18 @@ 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_spool_weight = 230
[filament:Prusament PETG @MMU1]
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_spool_weight = 201
filament_type = PETG
[filament:Taulman T-Glase @MMU1]
@@ -2585,6 +3144,65 @@ 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"
+[filament:Fiberthree F3 PA Pure Pro @MMU1]
+inherits = *common*
+filament_vendor = Fiberthree
+filament_cost = 165.98
+filament_density = 1.2
+bed_temperature = 70
+first_layer_bed_temperature = 75
+first_layer_temperature = 270
+temperature = 270
+bridge_fan_speed = 30
+cooling = 1
+disable_fan_first_layers = 3
+fan_always_on = 1
+fan_below_layer_time = 20
+min_print_speed = 15
+slowdown_below_layer_time = 10
+filament_colour = #DEE0E6
+filament_max_volumetric_speed = 4
+filament_soluble = 0
+filament_type = NYLON
+max_fan_speed = 20
+min_fan_speed = 20
+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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{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{elsif nozzle_diameter[0]==0.8};{else}M900 K30{endif} ; Filament gcode LA 1.0"
+compatible_printers_condition = printer_model=="MK2SMM"
+
+[filament:Fiberthree F3 PA-CF Pro @MMU1]
+inherits = *common*
+filament_vendor = Fiberthree
+filament_cost = 171.98
+filament_density = 1.25
+bed_temperature = 70
+first_layer_bed_temperature = 75
+first_layer_temperature = 275
+temperature = 275
+bridge_fan_speed = 30
+cooling = 1
+disable_fan_first_layers = 3
+fan_always_on = 0
+fan_below_layer_time = 20
+min_print_speed = 15
+slowdown_below_layer_time = 10
+filament_colour = #DEE0E6
+filament_max_volumetric_speed = 4
+filament_soluble = 0
+filament_type = NYLON
+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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{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{elsif nozzle_diameter[0]==0.8};{else}M900 K30{endif} ; Filament gcode LA 1.0"
+compatible_printers_condition = nozzle_diameter[0]>=0.4 and printer_model=="MK2SMM"
+
+[filament:Fiberthree F3 PA-GF Pro @MMU1]
+inherits = Fiberthree F3 PA-CF Pro @MMU1
+filament_vendor = Fiberthree
+filament_cost = 169.98
+filament_density = 1.27
+fan_always_on = 1
+max_fan_speed = 15
+min_fan_speed = 15
+
[filament:SemiFlex or Flexfill 98A @MMU1]
inherits = *FLEX*
filament_vendor = Generic
@@ -2615,6 +3233,18 @@ renamed_from = "Generic PET MINI"; "Generic PETG MINI"
filament_vendor = Generic
filament_cost = 27.82
filament_density = 1.27
+compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.8 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
+filament_spool_weight = 250
+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]
@@ -2622,6 +3252,7 @@ inherits = Generic PETG; *PETMINI*
filament_vendor = Plasty Mladec
filament_cost = 27.82
filament_density = 1.27
+filament_spool_weight = 230
compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.6
[filament:Verbatim PETG @MINI]
@@ -2629,6 +3260,7 @@ inherits = Generic PETG; *PETMINI*
filament_vendor = Verbatim
filament_cost = 27.90
filament_density = 1.27
+filament_spool_weight = 235
compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.6
[filament:Fiberlogy PETG @MINI]
@@ -2647,23 +3279,98 @@ 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 = 20
+fan_below_layer_time = 30
bridge_fan_speed = 25
+compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.8
+
+[filament:Fiberthree F3 PA Pure Pro @MINI]
+inherits = *common*
+filament_vendor = Fiberthree
+filament_cost = 165.98
+filament_density = 1.2
+bed_temperature = 70
+first_layer_bed_temperature = 75
+first_layer_temperature = 270
+temperature = 270
+bridge_fan_speed = 30
+cooling = 1
+disable_fan_first_layers = 3
+fan_always_on = 1
+fan_below_layer_time = 20
+min_print_speed = 15
+slowdown_below_layer_time = 10
+filament_colour = #DEE0E6
+filament_max_volumetric_speed = 4
+filament_soluble = 0
+filament_type = NYLON
+max_fan_speed = 20
+min_fan_speed = 20
+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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{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{elsif nozzle_diameter[0]==0.8};{else}M900 K30{endif} ; Filament gcode LA 1.0"
+compatible_printers_condition = printer_model=="MINI"
+
+[filament:Fiberthree F3 PA-CF Pro @MINI]
+inherits = *common*
+filament_vendor = Fiberthree
+filament_cost = 171.98
+filament_density = 1.25
+bed_temperature = 70
+first_layer_bed_temperature = 75
+first_layer_temperature = 275
+temperature = 275
+bridge_fan_speed = 30
+cooling = 1
+disable_fan_first_layers = 3
+fan_always_on = 0
+fan_below_layer_time = 20
+min_print_speed = 15
+slowdown_below_layer_time = 10
+filament_colour = #DEE0E6
+filament_max_volumetric_speed = 4
+filament_soluble = 0
+filament_type = NYLON
+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.*/ and nozzle_diameter[0]==0.8}0.06{elsif printer_notes=~/.*PRINTER_MODEL_MINI.*/}0.2{elsif nozzle_diameter[0]==0.8}0.01{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{elsif nozzle_diameter[0]==0.8};{else}M900 K30{endif} ; Filament gcode LA 1.0"
+compatible_printers_condition = nozzle_diameter[0]>=0.4 and printer_model=="MINI"
+
+[filament:Fiberthree F3 PA-GF Pro @MINI]
+inherits = Fiberthree F3 PA-CF Pro @MINI
+filament_vendor = Fiberthree
+filament_cost = 169.98
+filament_density = 1.27
+fan_always_on = 1
+max_fan_speed = 15
+min_fan_speed = 15
+
+[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
+compatible_printers_condition = nozzle_diameter[0]>=0.4 and printer_model=="MINI"
+
+[filament:Kimya ABS Kevlar @MINI]
+inherits = Kimya ABS Carbon @MINI
+filament_vendor = Kimya
+filament_density = 1.037
[filament:Esun ABS @MINI]
inherits = Generic ABS; *ABSMINI*
filament_vendor = Esun
filament_cost = 27.82
filament_density = 1.08
+filament_spool_weight = 265
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 = 20
+fan_below_layer_time = 30
bridge_fan_speed = 25
[filament:Hatchbox ABS @MINI]
@@ -2671,13 +3378,13 @@ inherits = Generic ABS; *ABSMINI*
filament_vendor = Hatchbox
filament_cost = 27.82
filament_density = 1.08
+filament_spool_weight = 245
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 = 20
+fan_below_layer_time = 30
bridge_fan_speed = 25
[filament:Plasty Mladec ABS @MINI]
@@ -2685,13 +3392,27 @@ inherits = Generic ABS; *ABSMINI*
filament_vendor = Plasty Mladec
filament_cost = 27.82
filament_density = 1.08
+filament_spool_weight = 230
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 = 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
+filament_spool_weight = 235
+fan_always_on = 0
+cooling = 1
+min_fan_speed = 15
+max_fan_speed = 15
+disable_fan_first_layers = 4
+fan_below_layer_time = 30
bridge_fan_speed = 25
[filament:Prusament PETG @MINI]
@@ -2700,27 +3421,57 @@ filament_vendor = Prusa Polymers
first_layer_temperature = 240
temperature = 250
filament_density = 1.27
-filament_cost = 24.99
-compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.6
+filament_spool_weight = 201
+filament_cost = 29.99
+compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.8 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
+compatible_printers_condition = nozzle_diameter[0]>=0.4 and printer_model=="MINI"
[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_spool_weight = 201
+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_spool_weight = 250
+
[filament:Plasty Mladec PETG @0.6 nozzle MINI]
inherits = Generic PETG; *PETMINI06*
filament_vendor = Plasty Mladec
+filament_spool_weight = 230
[filament:Verbatim PETG @0.6 nozzle MINI]
inherits = Generic PETG; *PETMINI06*
filament_vendor = Verbatim
+filament_spool_weight = 235
[filament:Fiberlogy PETG @0.6 nozzle MINI]
inherits = Generic PETG; *PETMINI06*
@@ -2736,6 +3487,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
@@ -2743,6 +3495,8 @@ filament_type = ASA
filament_colour = #FFF2EC
filament_cost = 35.28
filament_density = 1.07
+filament_spool_weight = 201
+compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.8
[filament:Fillamentum Flexfill 98A @MINI]
inherits = SemiFlex or Flexfill 98A; *FLEXMINI*
@@ -2750,6 +3504,8 @@ filament_vendor = Fillamentum
first_layer_temperature = 240
temperature = 240
filament_max_volumetric_speed = 1.35
+filament_cost = 33.99
+filament_spool_weight = 230
[filament:Generic FLEX @MINI]
inherits = SemiFlex or Flexfill 98A; *FLEXMINI*
@@ -2760,6 +3516,8 @@ first_layer_temperature = 240
temperature = 240
filament_retract_length = 3
filament_max_volumetric_speed = 1.35
+compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.8
+
[filament:AmazonBasics TPU @MINI]
inherits = *FLEXMINI*
@@ -2811,7 +3569,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*
@@ -2825,6 +3583,7 @@ filament_retract_lift = 0
filament_retract_before_travel = 7
filament_wipe = 0
filament_density = 1.20
+filament_spool_weight = 230
filament_cost = 33.95
bridge_fan_speed = 70
fan_always_on = 1
@@ -2843,13 +3602,17 @@ 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_spool_weight = 230
+disable_fan_first_layers = 3
+full_fan_speed_layer = 5
[filament:ColorFabb nGen @MINI]
inherits = ColorFabb nGen; *PETMINI*
filament_cost = 52.46
filament_density = 1.2
+filament_spool_weight = 236
[filament:E3D PC-ABS @MINI]
inherits = E3D PC-ABS; *ABSMINI*
@@ -2860,13 +3623,13 @@ filament_cost = 28.80
inherits = Fillamentum ABS; *ABSMINI*
filament_cost = 32.4
filament_density = 1.04
+filament_spool_weight = 230
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 = 20
+fan_below_layer_time = 30
bridge_fan_speed = 25
[filament:Fillamentum ASA @MINI]
@@ -2886,6 +3649,7 @@ filament_type = ASA
filament_colour = #FFF2EC
filament_cost = 38.7
filament_density = 1.07
+filament_spool_weight = 230
[filament:Polymaker PC-Max @MINI]
inherits = Polymaker PC-Max; *ABSMINI*
@@ -2900,19 +3664,49 @@ bridge_fan_speed = 0
filament_cost = 77.3
filament_density = 1.20
+[filament:Prusament PC Blend @MINI]
+inherits = *ABSMINI*
+filament_vendor = Prusa Polymers
+filament_cost = 49.99
+filament_density = 1.22
+filament_spool_weight = 201
+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
+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
+compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.8
+
[filament:Prusa ABS @MINI]
inherits = *ABSMINI*
filament_vendor = Made for Prusa
-filament_cost = 27.82
+filament_cost = 22.99
filament_density = 1.08
+filament_spool_weight = 230
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 = 20
+fan_below_layer_time = 30
bridge_fan_speed = 25
+compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.8
[filament:Generic HIPS @MINI]
inherits = *ABSMINI*
@@ -2943,6 +3737,7 @@ fan_always_on = 0
fan_below_layer_time = 10
filament_cost = 58.66
filament_density = 1.18
+filament_spool_weight = 236
first_layer_bed_temperature = 100
first_layer_temperature = 270
max_fan_speed = 20
@@ -2953,8 +3748,9 @@ temperature = 270
inherits = *PETMINI*
filament_vendor = ColorFabb
filament_type = PETG
-filament_cost = 62.9
+filament_cost = 38.99
filament_density = 1.27
+filament_spool_weight = 236
first_layer_bed_temperature = 90
first_layer_temperature = 260
temperature = 270
@@ -2962,12 +3758,13 @@ temperature = 270
[filament:ColorFabb XT-CF20 @MINI]
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
+compatible_printers_condition = nozzle_diameter[0]>=0.4 and printer_model=="MINI"
+extrusion_multiplier = 1.05
+filament_cost = 49.99
filament_density = 1.35
+filament_spool_weight = 236
filament_colour = #804040
-filament_max_volumetric_speed = 1
+filament_max_volumetric_speed = 2
first_layer_bed_temperature = 90
first_layer_temperature = 260
temperature = 260
@@ -2996,16 +3793,263 @@ 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
+filament_spool_weight = 230
+compatible_printers_condition = printer_model=="MINI" and nozzle_diameter[0]!=0.8 and nozzle_diameter[0]!=0.6
[filament:Prusa PETG @0.6 nozzle MINI]
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
+filament_spool_weight = 230
+
+## Filaments 0.8 nozzle
+
+[filament:Generic PLA @0.8 nozzle]
+inherits = Generic PLA
+first_layer_temperature = 220
+temperature = 220
+filament_max_volumetric_speed = 15
+slowdown_below_layer_time = 20
+compatible_printers_condition = nozzle_diameter[0]==0.8 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
+
+[filament:Generic ABS @0.8 nozzle]
+inherits = Generic ABS
+first_layer_temperature = 265
+temperature = 265
+filament_max_volumetric_speed = 15
+compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
+
+[filament:Generic PETG @0.8 nozzle]
+inherits = Generic PETG
+first_layer_temperature = 240
+temperature = 250
+filament_max_volumetric_speed = 20
+filament_retract_lift = 0.2
+slowdown_below_layer_time = 20
+compatible_printers_condition = nozzle_diameter[0]==0.8 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)
+
+[filament:Prusa PLA @0.8 nozzle]
+inherits = Prusa PLA
+first_layer_temperature = 220
+temperature = 220
+filament_max_volumetric_speed = 15
+slowdown_below_layer_time = 20
+compatible_printers_condition = nozzle_diameter[0]==0.8 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
+
+[filament:Prusa PETG @0.8 nozzle]
+inherits = Prusa PETG
+first_layer_temperature = 240
+temperature = 250
+filament_max_volumetric_speed = 20
+slowdown_below_layer_time = 20
+compatible_printers_condition = nozzle_diameter[0]==0.8 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)
+
+[filament:Prusa ABS @0.8 nozzle]
+inherits = Prusa ABS
+first_layer_temperature = 265
+temperature = 265
+filament_max_volumetric_speed = 15
+compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
+
+[filament:Generic FLEX @0.8 nozzle]
+inherits = Generic FLEX
+filament_max_volumetric_speed = 4.3
+compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_model!="MK2SMM" 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:Generic HIPS @0.8 nozzle]
+inherits = Generic HIPS
+first_layer_temperature = 240
+temperature = 240
+filament_max_volumetric_speed = 15
+compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
+
+[filament:Prusament PLA @0.8 nozzle]
+inherits = Prusament PLA
+first_layer_temperature = 225
+temperature = 225
+filament_max_volumetric_speed = 15
+slowdown_below_layer_time = 20
+compatible_printers_condition = nozzle_diameter[0]==0.8 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
+
+[filament:Prusament PETG @0.8 nozzle]
+inherits = Prusament PETG
+first_layer_temperature = 250
+temperature = 260
+filament_max_volumetric_speed = 20
+filament_retract_lift = 0.2
+slowdown_below_layer_time = 20
+compatible_printers_condition = nozzle_diameter[0]==0.8 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)
+
+[filament:Prusament ASA @0.8 nozzle]
+inherits = Prusament ASA
+first_layer_temperature = 265
+temperature = 265
+filament_max_volumetric_speed = 15
+slowdown_below_layer_time = 20
+compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_model!="MINI" and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
+
+[filament:Prusament PC Blend @0.8 nozzle]
+inherits = Prusament PC Blend
+filament_max_volumetric_speed = 13
+filament_retract_lift = 0.25
+compatible_printers_condition = printer_notes!~/.*PRINTER_MODEL_MK(2|2.5).*/ and nozzle_diameter[0]==0.8 and printer_model!="MINI" and ! single_extruder_multi_material
+
+[filament:Prusament PC Blend @0.8 nozzle MK2]
+inherits = Prusament PC Blend @MK2
+filament_max_volumetric_speed = 13
+filament_retract_lift = 0.25
+compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_model!="MK2SMM" and printer_notes=~/.*PRINTER_MODEL_MK(2|2.5).*/ and ! (printer_notes=~/.*PRINTER_MODEL_MK2.5.*/ and single_extruder_multi_material)
+
+[filament:Prusament PVB @0.8 nozzle]
+inherits = Prusament PVB
+first_layer_temperature = 225
+temperature = 225
+filament_max_volumetric_speed = 15
+compatible_printers_condition = nozzle_diameter[0]==0.8 and ! (printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material)
+slowdown_below_layer_time = 20
+
+## Filaments 0.8 nozzle MMU2
+
+[filament:Generic HIPS @MMU2 0.8 nozzle]
+inherits = Generic HIPS @MMU2
+compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material
+
+[filament:Prusament ASA @MMU2 0.8 nozzle]
+inherits = Prusament ASA @MMU2
+compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material
+slowdown_below_layer_time = 20
+filament_max_volumetric_speed = 14
+
+[filament:Prusament PC Blend @MMU2 0.8 nozzle]
+inherits = Prusament PC Blend @MMU2
+compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material
+filament_max_volumetric_speed = 12
+
+[filament:Generic PETG @MMU2 0.8 nozzle]
+inherits = Generic PETG @MMU2
+compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material
+filament_max_volumetric_speed = 18
+first_layer_temperature = 240
+temperature = 240
+slowdown_below_layer_time = 20
+filament_ramming_parameters = "120 140 5.51613 5.6129 5.70968 5.77419 5.77419 5.74194 5.80645 5.93548 6.06452 6.19355 6.3871 6.74194 7.25806 7.87097 8.54839 9.22581 10 10.8387| 0.05 5.5032 0.45 5.63868 0.95 5.8 1.45 5.7839 1.95 6.02257 2.45 6.25811 2.95 7.08395 3.45 8.43875 3.95 9.92258 4.45 11.3419 4.95 7.6"
+
+[filament:Prusament PETG @MMU2 0.8 nozzle]
+inherits = Prusament PETG @MMU2
+compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material
+filament_max_volumetric_speed = 18
+first_layer_temperature = 240
+temperature = 240
+slowdown_below_layer_time = 20
+filament_ramming_parameters = "120 140 5.51613 5.6129 5.70968 5.77419 5.77419 5.74194 5.80645 5.93548 6.06452 6.19355 6.3871 6.74194 7.25806 7.87097 8.54839 9.22581 10 10.8387| 0.05 5.5032 0.45 5.63868 0.95 5.8 1.45 5.7839 1.95 6.02257 2.45 6.25811 2.95 7.08395 3.45 8.43875 3.95 9.92258 4.45 11.3419 4.95 7.6"
+
+[filament:Generic PLA @MMU2 0.8 nozzle]
+inherits = Generic PLA @MMU2
+compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material
+filament_max_volumetric_speed = 14
+first_layer_temperature = 215
+temperature = 210
+
+[filament:Prusament PLA @MMU2 0.8 nozzle]
+inherits = Prusament PLA @MMU2
+compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material
+filament_max_volumetric_speed = 14
+first_layer_temperature = 215
+temperature = 210
+
+[filament:Verbatim BVOH @MMU2 0.8 nozzle]
+inherits = Verbatim BVOH @MMU2
+compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material
+filament_max_volumetric_speed = 8
+
+[filament:PrimaSelect PVA+ @MMU2 0.8 nozzle]
+inherits = PrimaSelect PVA+ @MMU2
+compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_MK(2.5|3).*/ and single_extruder_multi_material
+filament_max_volumetric_speed = 8
+
+## Filaments 0.8 nozzle MINI
+
+[filament:Generic ABS @0.8 nozzle MINI]
+inherits = Generic ABS @MINI
+first_layer_temperature = 265
+temperature = 265
+filament_max_volumetric_speed = 13
+filament_retract_length = 3.2
+filament_wipe = nil
+filament_retract_speed = nil
+filament_deretract_speed = nil
+filament_retract_lift = nil
+filament_retract_before_travel = 2
+compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_model=="MINI"
+
+[filament:Generic PETG @0.8 nozzle MINI]
+inherits = Generic PETG @MINI
+first_layer_temperature = 240
+temperature = 250
+filament_max_volumetric_speed = 15
+slowdown_below_layer_time = 20
+compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_model=="MINI"
+
+[filament:Prusa PETG @0.8 nozzle MINI]
+inherits = Prusa PETG @MINI
+first_layer_temperature = 240
+temperature = 250
+filament_max_volumetric_speed = 15
+slowdown_below_layer_time = 20
+compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_model=="MINI"
+
+[filament:Prusa ABS @0.8 nozzle MINI]
+inherits = Prusa ABS @MINI
+first_layer_temperature = 265
+temperature = 265
+filament_max_volumetric_speed = 13
+slowdown_below_layer_time = 20
+filament_retract_length = 3.2
+filament_wipe = nil
+filament_retract_speed = nil
+filament_deretract_speed = nil
+filament_retract_lift = nil
+filament_retract_before_travel = 2
+compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_model=="MINI"
+
+[filament:Generic FLEX @0.8 nozzle MINI]
+inherits = Generic FLEX @MINI
+filament_max_volumetric_speed = 4.3
+compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_model=="MINI"
+
+[filament:Prusament PETG @0.8 nozzle MINI]
+inherits = Prusament PETG @MINI
+first_layer_temperature = 245
+temperature = 255
+filament_max_volumetric_speed = 15
+filament_retract_lift = 0.25
+slowdown_below_layer_time = 20
+compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_model=="MINI"
+
+[filament:Prusament ASA @0.8 nozzle MINI]
+inherits = Prusament ASA @MINI
+first_layer_temperature = 265
+temperature = 265
+filament_max_volumetric_speed = 13
+slowdown_below_layer_time = 20
+filament_retract_length = 3.2
+filament_wipe = nil
+filament_retract_speed = nil
+filament_deretract_speed = nil
+filament_retract_lift = nil
+filament_retract_before_travel = 2
+compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_model=="MINI"
+
+[filament:Prusament PC Blend @0.8 nozzle MINI]
+inherits = Prusament PC Blend @MINI
+filament_max_volumetric_speed = 11
+filament_retract_lift = 0.25
+slowdown_below_layer_time = 20
+compatible_printers_condition = nozzle_diameter[0]==0.8 and printer_model=="MINI"
[sla_print:*common*]
compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_PRUSA3D.*/ and printer_notes=~/.*PRINTER_MODEL_SL1.*/
@@ -3033,6 +4077,7 @@ support_pillar_diameter = 1
support_pillar_connection_mode = zigzag
support_pillar_widening_factor = 0
supports_enable = 1
+support_small_pillar_diameter_percent = 60%
[sla_print:0.025 UltraDetail]
inherits = *common*
@@ -3109,6 +4154,13 @@ initial_exposure_time = 30
material_type = Tough
material_vendor = 3DM
+[sla_material:3DM-HR Red Wine 0.025]
+inherits = *common 0.025*
+exposure_time = 14
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = 3DM
+
[sla_material:BlueCast Phrozen Wax @0.025]
inherits = *common 0.025*
exposure_time = 15
@@ -3116,6 +4168,13 @@ initial_exposure_time = 50
material_type = Tough
material_vendor = BlueCast
+[sla_material:BlueCast Castable Wax @0.025]
+inherits = *common 0.025*
+exposure_time = 8
+initial_exposure_time = 35
+material_type = Casting
+material_vendor = BlueCast
+
[sla_material:BlueCast EcoGray @0.025]
inherits = *common 0.025*
exposure_time = 6
@@ -3130,6 +4189,13 @@ initial_exposure_time = 45
material_type = Dental
material_vendor = BlueCast
+[sla_material:BlueCast Model Dental Gray @0.025]
+inherits = *common 0.025*
+exposure_time = 6
+initial_exposure_time = 35
+material_type = Dental
+material_vendor = BlueCast
+
[sla_material:BlueCast X10 @0.025]
inherits = *common 0.025*
exposure_time = 4
@@ -3137,6 +4203,13 @@ initial_exposure_time = 100
material_type = Tough
material_vendor = BlueCast
+[sla_material:DruckWege Type D High Temp @0.025]
+inherits = *common 0.025*
+exposure_time = 6
+initial_exposure_time = 20
+material_type = Tough
+material_vendor = DruckWege
+
[sla_material:Esun Bio-Photopolymer Resin White @0.025]
inherits = *common 0.025*
exposure_time = 5
@@ -3144,6 +4217,48 @@ initial_exposure_time = 30
material_type = Tough
material_vendor = Esun
+[sla_material:FunToDo Castable Blend Red @0.025]
+inherits = *common 0.025*
+exposure_time = 10
+initial_exposure_time = 35
+material_type = Casting
+material_vendor = FunToDo
+
+[sla_material:FunToDo Snow White @0.025]
+inherits = *common 0.025*
+exposure_time = 7
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = FunToDo
+
+[sla_material:Harz Labs Basic Resin Red @0.025]
+inherits = *common 0.025*
+exposure_time = 10
+initial_exposure_time = 20
+material_type = Tough
+material_vendor = Harz Labs
+
+[sla_material:Harz Labs Model Resin Cherry @0.025]
+inherits = *common 0.025*
+exposure_time = 10
+initial_exposure_time = 20
+material_type = Tough
+material_vendor = Harz Labs
+
+[sla_material:Harz Labs Model Resin Black @0.025]
+inherits = *common 0.025*
+exposure_time = 10
+initial_exposure_time = 20
+material_type = Tough
+material_vendor = Harz Labs
+
+[sla_material:Harz Labs Dental Cast Red @0.025]
+inherits = *common 0.025*
+exposure_time = 10
+initial_exposure_time = 20
+material_type = Dental
+material_vendor = Harz Labs
+
[sla_material:Esun Standard Resin Black @0.025]
inherits = *common 0.025*
exposure_time = 6
@@ -3171,6 +4286,20 @@ exposure_time = 17
initial_exposure_time = 30
material_type = Tough
material_vendor = Resinworks 3D
+
+[sla_material:Monocure 3D Black Rapid Resin @0.025]
+inherits = *common 0.025*
+exposure_time = 4
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = Monocure
+
+[sla_material:Monocure 3D Blue Rapid Resin @0.025]
+inherits = *common 0.025*
+exposure_time = 4
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = Monocure
## Prusa
[sla_material:Prusa Orange Tough @0.025]
@@ -3194,6 +4323,12 @@ initial_exposure_time = 35
material_type = Tough
material_vendor = Made for Prusa
+## [sla_material:Prusa Blue Tough @0.025]
+## inherits = *common 0.025*
+## exposure_time = 5
+## initial_exposure_time = 35
+## material_type = Tough
+## material_vendor = Made for Prusa
[sla_material:Prusa Maroon Tough @0.025]
inherits = *common 0.025*
@@ -3251,10 +4386,12 @@ initial_exposure_time = 30
material_type = Tough
material_vendor = Made for Prusa
-## [sla_material:Prusa ABS like White @0.025]
-## inherits = *common 0.025*
-## exposure_time = 6
-## initial_exposure_time = 30
+[sla_material:Prusa White ABS like @0.025]
+inherits = *common 0.025*
+exposure_time = 5
+initial_exposure_time = 30
+material_type = Tough
+material_vendor = Made for Prusa
[sla_material:Prusa Grey High Tenacity @0.025]
inherits = *common 0.025*
@@ -3291,6 +4428,138 @@ 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:Prusa Rich Black 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 Deep Blue Transparent 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 Yellow Jewelry Casting @0.025]
+inherits = *common 0.025*
+exposure_time = 8
+initial_exposure_time = 45
+material_type = Casting
+material_vendor = Made for Prusa
+
+[sla_material:Siraya Tech Simple Clear @0.025]
+inherits = *common 0.025*
+exposure_time = 8
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = Siraya Tech
+
+[sla_material:Siraya Tech Blu Clear V2 @0.025]
+inherits = *common 0.025*
+exposure_time = 9
+initial_exposure_time = 30
+material_type = Tough
+material_vendor = Siraya Tech
+
+[sla_material:Siraya Tech Blu Blue @0.025]
+inherits = *common 0.025*
+exposure_time = 6
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = Siraya Tech
+
+[sla_material:Siraya Tech Fast Grey @0.025]
+inherits = *common 0.025*
+exposure_time = 6
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = Siraya Tech
+
+[sla_material:Siraya Tech Tenacious @0.025]
+inherits = *common 0.025*
+exposure_time = 6
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = Siraya Tech
+
+[sla_material:Siraya Tech Easy @0.025]
+inherits = *common 0.025*
+exposure_time = 11
+initial_exposure_time = 15
+material_type = Tough
+material_vendor = Siraya Tech
+
+[sla_material:Siraya Tech Sculpt @0.025]
+inherits = *common 0.025*
+exposure_time = 7
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = Siraya Tech
+
+[sla_material:Siraya Tech Fast Black @0.025]
+inherits = *common 0.025*
+exposure_time = 6
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = Siraya Tech
+
+[sla_material:NextDent Model 2.0 Grey @0.025]
+inherits = *common 0.025*
+exposure_time = 14
+initial_exposure_time = 35
+material_type = Dental
+material_vendor = NextDent
+
+[sla_material:NextDent Surgical Guide @0.025]
+inherits = *common 0.025*
+exposure_time = 6
+initial_exposure_time = 35
+material_type = Dental
+material_vendor = NextDent
+
+[sla_material:NextDent Cast Purple @0.025]
+inherits = *common 0.025*
+exposure_time = 7
+initial_exposure_time = 20
+material_type = Casting
+material_vendor = NextDent
+
+[sla_material:MakerJuice Labs Standard Red @0.025]
+inherits = *common 0.025*
+exposure_time = 9
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = MakerJuice Labs
+
+[sla_material:3DJake High Precision Grey @0.025]
+inherits = *common 0.025*
+exposure_time = 8.5
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = 3DJake
+
+[sla_material:3DJake High Precision Blue @0.025]
+inherits = *common 0.025*
+exposure_time = 6.5
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = 3DJake
+
+[sla_material:Zortrax Black @0.025]
+inherits = *common 0.025*
+exposure_time = 4
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = Zortrax
########### Materials 0.05
@@ -3301,6 +4570,13 @@ initial_exposure_time = 30
material_type = Dental
material_vendor = Asiga
+[sla_material:Asiga PlasGRAY @0.05]
+inherits = *common 0.05*
+exposure_time = 29
+initial_exposure_time = 60
+material_type = Tough
+material_vendor = Asiga
+
[sla_material:Ameralabs AMD 3 LED @0.05]
inherits = *common 0.05*
exposure_time = 5
@@ -3322,6 +4598,13 @@ initial_exposure_time = 50
material_type = Dental
material_vendor = BlueCast
+[sla_material:BlueCast Model Dental Gray @0.05]
+inherits = *common 0.05*
+exposure_time = 8
+initial_exposure_time = 35
+material_type = Dental
+material_vendor = BlueCast
+
[sla_material:BlueCast LCD-DLP Original @0.05]
inherits = *common 0.05*
exposure_time = 10
@@ -3336,6 +4619,13 @@ initial_exposure_time = 50
material_type = Tough
material_vendor = BlueCast
+[sla_material:BlueCast Castable Wax @0.05]
+inherits = *common 0.05*
+exposure_time = 11
+initial_exposure_time = 35
+material_type = Casting
+material_vendor = BlueCast
+
[sla_material:BlueCast S+ @0.05]
inherits = *common 0.05*
exposure_time = 9
@@ -3364,17 +4654,24 @@ initial_exposure_time = 50
material_type = Tough
material_vendor = BlueCast
+[sla_material:DruckWege Type D High Temp @0.05]
+inherits = *common 0.05*
+exposure_time = 10
+initial_exposure_time = 20
+material_type = Tough
+material_vendor = DruckWege
+
[sla_material:Monocure 3D Black Rapid Resin @0.05]
inherits = *common 0.05*
exposure_time = 6
-initial_exposure_time = 40
+initial_exposure_time = 35
material_type = Tough
material_vendor = Monocure
[sla_material:Monocure 3D Blue Rapid Resin @0.05]
inherits = *common 0.05*
exposure_time = 7
-initial_exposure_time = 40
+initial_exposure_time = 35
material_type = Tough
material_vendor = Monocure
@@ -3394,8 +4691,8 @@ material_vendor = Monocure
[sla_material:Monocure 3D White Rapid Resin @0.05]
inherits = *common 0.05*
-exposure_time = 7
-initial_exposure_time = 40
+exposure_time = 10
+initial_exposure_time = 35
material_type = Tough
material_vendor = Monocure
@@ -3420,6 +4717,27 @@ initial_exposure_time = 30
material_type = Tough
material_vendor = Esun
+[sla_material:FunToDo Castable Blend Red @0.05]
+inherits = *common 0.05*
+exposure_time = 15
+initial_exposure_time = 35
+material_type = Casting
+material_vendor = FunToDo
+
+[sla_material:FunToDo Industrial Blend Unpigmented @0.05]
+inherits = *common 0.05*
+exposure_time = 4
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = FunToDo
+
+[sla_material:FunToDo Snow White @0.05]
+inherits = *common 0.05*
+exposure_time = 10
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = FunToDo
+
[sla_material:3DM-ABS @0.05]
inherits = *common 0.05*
exposure_time = 13
@@ -3450,7 +4768,7 @@ material_vendor = 3DM
[sla_material:3DM-HR Red Wine @0.05]
inherits = *common 0.05*
-exposure_time = 9
+exposure_time = 18
initial_exposure_time = 35
material_type = Tough
material_vendor = 3DM
@@ -3476,20 +4794,41 @@ initial_exposure_time = 30
material_type = Tough
material_vendor = 3DM
-[sla_material:FTD Ash Grey @0.05]
+[sla_material:FunToDo Ash Grey @0.05]
inherits = *common 0.05*
exposure_time = 9
initial_exposure_time = 40
material_type = Tough
-material_vendor = FTD
+material_vendor = FunToDo
[sla_material:Harz Labs Model Resin Cherry @0.05]
inherits = *common 0.05*
-exposure_time = 8
-initial_exposure_time = 45
+exposure_time = 13
+initial_exposure_time = 20
+material_type = Tough
+material_vendor = Harz Labs
+
+[sla_material:Harz Labs Basic Resin Red @0.05]
+inherits = *common 0.05*
+exposure_time = 13
+initial_exposure_time = 20
+material_type = Tough
+material_vendor = Harz Labs
+
+[sla_material:Harz Labs Model Resin Black @0.05]
+inherits = *common 0.05*
+exposure_time = 13
+initial_exposure_time = 20
material_type = Tough
material_vendor = Harz Labs
+[sla_material:Harz Labs Dental Cast Red @0.05]
+inherits = *common 0.05*
+exposure_time = 13
+initial_exposure_time = 20
+material_type = Dental
+material_vendor = Harz Labs
+
[sla_material:Resinworks 3D Violet @0.05]
inherits = *common 0.05*
exposure_time = 17
@@ -3518,6 +4857,139 @@ initial_exposure_time = 30
material_type = Tough
material_vendor = Photocentric
+[sla_material:Siraya Tech Simple Clear @0.05]
+inherits = *common 0.05*
+exposure_time = 10
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = Siraya Tech
+
+[sla_material:Siraya Tech Blu Clear V2 @0.05]
+inherits = *common 0.05*
+exposure_time = 10
+initial_exposure_time = 30
+material_type = Tough
+material_vendor = Siraya Tech
+
+[sla_material:Siraya Tech Blu Blue @0.05]
+inherits = *common 0.05*
+exposure_time = 12
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = Siraya Tech
+
+[sla_material:Siraya Tech Fast Grey @0.05]
+inherits = *common 0.05*
+exposure_time = 10
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = Siraya Tech
+
+[sla_material:Siraya Tech Tenacious @0.05]
+inherits = *common 0.05*
+exposure_time = 8
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = Siraya Tech
+
+[sla_material:Siraya Tech Easy @0.05]
+inherits = *common 0.05*
+exposure_time = 12
+initial_exposure_time = 15
+material_type = Tough
+material_vendor = Siraya Tech
+
+[sla_material:Siraya Tech Sculpt @0.05]
+inherits = *common 0.05*
+exposure_time = 8
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = Siraya Tech
+
+[sla_material:Siraya Tech Fast Black @0.05]
+inherits = *common 0.05*
+exposure_time = 9
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = Siraya Tech
+
+[sla_material:NextDent Model 2.0 Grey @0.05]
+inherits = *common 0.05*
+exposure_time = 12
+initial_exposure_time = 35
+material_type = Dental
+material_vendor = NextDent
+
+[sla_material:NextDent Surgical Guide @0.05]
+inherits = *common 0.05*
+exposure_time = 7
+initial_exposure_time = 35
+material_type = Dental
+material_vendor = NextDent
+
+[sla_material:NextDent Cast Purple @0.05]
+inherits = *common 0.05*
+exposure_time = 9
+initial_exposure_time = 20
+material_type = Casting
+material_vendor = NextDent
+
+[sla_material:NextDent Crown Bridge @0.05]
+inherits = *common 0.05*
+exposure_time = 11
+initial_exposure_time = 35
+material_type = Dental
+material_vendor = NextDent
+
+[sla_material:MakerJuice Labs Standard Red @0.05]
+inherits = *common 0.05*
+exposure_time = 10
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = MakerJuice Labs
+
+[sla_material:3DJake High Precision Grey @0.05]
+inherits = *common 0.05*
+exposure_time = 9
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = 3DJake
+
+[sla_material:3DJake High Precision Blue @0.05]
+inherits = *common 0.05*
+exposure_time = 7
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = 3DJake
+
+[sla_material:Dragon Resin Metalshine Metal Grey @0.05]
+inherits = *common 0.05*
+exposure_time = 30
+initial_exposure_time = 50
+material_type = Tough
+material_vendor = Dragon Resin
+
+[sla_material:Dragon Resin Metalshine Dark Brass @0.05]
+inherits = *common 0.05*
+exposure_time = 30
+initial_exposure_time = 50
+material_type = Tough
+material_vendor = Dragon Resin
+
+[sla_material:Dragon Resin Metalshine Brass @0.05]
+inherits = *common 0.05*
+exposure_time = 30
+initial_exposure_time = 50
+material_type = Tough
+material_vendor = Dragon Resin
+
+[sla_material:Zortrax Black @0.05]
+inherits = *common 0.05*
+exposure_time = 7
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = Zortrax
+
## Prusa
[sla_material:Prusa Beige Tough @0.05]
@@ -3658,6 +5130,13 @@ initial_exposure_time = 35
material_type = Tough
material_vendor = Made for Prusa
+## [sla_material:Prusa Blue Tough @0.05]
+## inherits = *common 0.05*
+## exposure_time = 8
+## initial_exposure_time = 35
+## material_type = Tough
+## material_vendor = Made for Prusa
+
[sla_material:Prusa Transparent Tough @0.05]
inherits = *common 0.05*
exposure_time = 7
@@ -3706,10 +5185,12 @@ initial_exposure_time = 30
material_type = Tough
material_vendor = Made for Prusa
-## [sla_material:Prusa ABS like White @0.05]
-## inherits = *common 0.05*
-## exposure_time = 8
-## initial_exposure_time = 30
+[sla_material:Prusa White ABS like @0.05]
+inherits = *common 0.05*
+exposure_time = 8
+initial_exposure_time = 30
+material_type = Tough
+material_vendor = Made for Prusa
[sla_material:Prusa Yellow Jewelry Casting @0.05]
inherits = *common 0.05*
@@ -3725,6 +5206,27 @@ 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
+
+[sla_material:Prusa Rich Black 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 Deep Blue Transparent Tough @0.05]
+inherits = *common 0.05*
+exposure_time = 8
+initial_exposure_time = 35
+material_type = Tough
+material_vendor = Made for Prusa
+
########### Materials 0.035
[sla_material:Prusa Orange Tough @0.035]
@@ -3822,13 +5324,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 max_layer_z < max_print_height}G1 Z{z_offset+min(max_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
@@ -3863,7 +5372,7 @@ retract_before_wipe = 0%
retract_layer_change = 1
retract_length = 0.8
retract_length_toolchange = 4
-retract_lift = 0.6
+retract_lift = 0.4
retract_lift_above = 0
retract_lift_below = 199
retract_restart_extra = 0
@@ -3907,7 +5416,7 @@ printer_model = MK2SMM
[printer:*mm-single*]
inherits = *multimaterial*
-end_gcode = G1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM84 ; disable motors\n\n
+end_gcode = G1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\nM107 ; turn off fan\n{if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+30, max_print_height)}{endif} ; Move print head up\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors\n\n
printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2\nPRINTER_HAS_BOWDEN
start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.2.3 ; tell printer latest fw version\nM204 S[machine_max_acceleration_extruding] T[machine_max_acceleration_retracting] ; MK2 firmware only supports the old M204 format\n; Start G-Code sequence START\nT?\nM104 S[first_layer_temperature]\nM140 S[first_layer_bed_temperature]\nM109 S[first_layer_temperature]\nM190 S[first_layer_bed_temperature]\nG90 ; use absolute coordinates\nM83 ; use relative distances for extrusion\nG28 W\nG80\nG92 E0.0\nM203 E100\nM92 E140\nG1 Z0.250 F7200.000\nG1 X50.0 E80.0 F1000.0\nG1 X160.0 E20.0 F1000.0\nG1 Z0.200 F7200.000\nG1 X220.0 E13 F1000.0\nG1 X240.0 E0 F1000.0\nG92 E0.0
default_print_profile = 0.15mm OPTIMAL
@@ -3915,7 +5424,7 @@ default_print_profile = 0.15mm OPTIMAL
[printer:*mm-multi*]
inherits = *multimaterial*
high_current_on_filament_swap = 1
-end_gcode = {if not has_wipe_tower}\n; Pull the filament into the cooling tubes.\nG1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\n{endif}\nM107 ; turn off fan\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM84 ; disable motors
+end_gcode = {if not has_wipe_tower}\n; Pull the filament into the cooling tubes.\nG1 E-4 F2100.00000\nG91\nG1 Z1 F7200.000\nG90\nG1 X245 Y1\nG1 X240 E4\nG1 F4000\nG1 X190 E2.7 \nG1 F4600\nG1 X110 E2.8\nG1 F5200\nG1 X40 E3 \nG1 E-15.0000 F5000\nG1 E-50.0000 F5400\nG1 E-15.0000 F3000\nG1 E-12.0000 F2000\nG1 F1600\nG1 X0 Y1 E3.0000\nG1 X50 Y1 E-5.0000\nG1 F2000\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-5.0000\nG1 F2400\nG1 X0 Y1 E5.0000\nG1 X50 Y1 E-3.0000\nG4 S0\n{endif}\nM107 ; turn off fan\n{if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+30, max_print_height)}{endif} ; Move print head up\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nG28 X0 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors
extruder_colour = #FFAA55;#E37BA0;#4ECDD3;#FB7259
nozzle_diameter = 0.4,0.4,0.4,0.4
printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2\nPRINTER_HAS_BOWDEN
@@ -3989,21 +5498,35 @@ inherits = Original Prusa i3 MK2S
printer_model = MK2.5
remaining_times = 1
machine_max_jerk_e = 4.5
-start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0
[printer:Original Prusa i3 MK2.5 0.25 nozzle]
inherits = Original Prusa i3 MK2S 0.25 nozzle
printer_model = MK2.5
remaining_times = 1
machine_max_jerk_e = 4.5
-start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0
[printer:Original Prusa i3 MK2.5 0.6 nozzle]
inherits = Original Prusa i3 MK2S 0.6 nozzle
printer_model = MK2.5
remaining_times = 1
machine_max_jerk_e = 4.5
-start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0
+
+[printer:Original Prusa i3 MK2.5 0.8 nozzle]
+inherits = Original Prusa i3 MK2S 0.6 nozzle
+printer_model = MK2.5
+nozzle_diameter = 0.8
+printer_variant = 0.8
+max_layer_height = 0.6
+min_layer_height = 0.2
+retract_length = 1
+remaining_times = 1
+machine_max_jerk_e = 4.5
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0
+default_print_profile = 0.40mm QUALITY @0.8 nozzle
+default_filament_profile = Prusament PLA @0.8 nozzle
[printer:Original Prusa i3 MK2.5 MMU2 Single]
inherits = Original Prusa i3 MK2.5; *mm2*
@@ -4032,8 +5555,12 @@ machine_min_travel_rate = 0
default_print_profile = 0.15mm OPTIMAL @MK2.5
default_filament_profile = Prusament PLA
printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2.5\n
-start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\n; select extruder\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; load to nozzle\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n
-end_gcode = G1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\n; select extruder\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; load to nozzle\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n
+end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_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.8 nozzle]
+inherits = Original Prusa i3 MK2.5S MMU2S Single 0.8 nozzle
+printer_model = MK2.5MMU2
[printer:Original Prusa i3 MK2.5 MMU2 Single 0.6 nozzle]
inherits = Original Prusa i3 MK2.5S MMU2S Single 0.6 nozzle
@@ -4074,23 +5601,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] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG92 E0.0\n
-end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors\n
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG92 E0.0\n
+end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM900 K0 ; reset LA\nM84 ; disable motors\n
[printer:Original Prusa i3 MK2.5S]
inherits = Original Prusa i3 MK2.5
printer_model = MK2.5S
-start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0
[printer:Original Prusa i3 MK2.5S 0.25 nozzle]
inherits = Original Prusa i3 MK2.5 0.25 nozzle
printer_model = MK2.5S
-start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0
[printer:Original Prusa i3 MK2.5S 0.6 nozzle]
inherits = Original Prusa i3 MK2.5 0.6 nozzle
printer_model = MK2.5S
-start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0
+
+[printer:Original Prusa i3 MK2.5S 0.8 nozzle]
+inherits = Original Prusa i3 MK2.5 0.8 nozzle
+printer_model = MK2.5S
[printer:Original Prusa i3 MK2.5S MMU2S Single]
inherits = Original Prusa i3 MK2.5; *mm2s*
@@ -4119,8 +5650,20 @@ machine_min_travel_rate = 0
default_print_profile = 0.15mm OPTIMAL @MK2.5
default_filament_profile = Prusament PLA
printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK2.5\n
-start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n
-end_gcode = G1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n
+end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_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.8 nozzle]
+inherits = Original Prusa i3 MK2.5S MMU2S Single
+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\n
+max_layer_height = 0.6
+min_layer_height = 0.2
+nozzle_diameter = 0.8
+printer_variant = 0.8
+retract_length = 1
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n
+default_print_profile = 0.40mm QUALITY @0.8 nozzle
+default_filament_profile = Prusament PLA @0.8 nozzle
[printer:Original Prusa i3 MK2.5S MMU2S Single 0.6 nozzle]
inherits = Original Prusa i3 MK2.5S MMU2S Single
@@ -4140,7 +5683,7 @@ nozzle_diameter = 0.25
printer_variant = 0.25
retract_lift = 0.15
default_print_profile = 0.10mm DETAIL 0.25 nozzle
-start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n
[printer:Original Prusa i3 MK2.5S MMU2S]
inherits = Original Prusa i3 MK2.5; *mm2s*
@@ -4173,8 +5716,8 @@ single_extruder_multi_material = 1
# to be defined explicitely.
nozzle_diameter = 0.4,0.4,0.4,0.4,0.4
extruder_colour = #FF8000;#DB5182;#00FFFF;#FF4F4F;#9FFF9F
-start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG92 E0.0\n
-end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors\n
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG92 E0.0\n
+end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if max_layer_z < max_print_height}G1 Z{z_offset+min(max_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
@@ -4192,19 +5735,41 @@ min_layer_height = 0.15
printer_variant = 0.6
default_print_profile = 0.20mm NORMAL @0.6 nozzle
+## For later use. 0.8mm nozzle profiles are only available for MMU2 Single mode at the moment.
+
+## [printer:Original Prusa i3 MK2.5S MMU2S 0.8 nozzle]
+## inherits = Original Prusa i3 MK2.5S MMU2S
+## nozzle_diameter = 0.8,0.8,0.8,0.8,0.8
+## max_layer_height = 0.6
+## min_layer_height = 0.2
+## printer_variant = 0.8
+## retract_length = 1
+## default_print_profile = 0.40mm QUALITY @0.8 nozzle
+## start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG92 E0.0\n
+
+## [printer:Original Prusa i3 MK2.5 MMU2 0.8 nozzle]
+## inherits = Original Prusa i3 MK2.5 MMU2
+## nozzle_diameter = 0.8,0.8,0.8,0.8,0.8
+## max_layer_height = 0.6
+## min_layer_height = 0.2
+## printer_variant = 0.8
+## retract_length = 1
+## default_print_profile = 0.40mm QUALITY @0.8 nozzle
+## start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM115 U3.9.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\nG92 E0.0\n
+
# XXXXXXXXXXXXXXXXX
# XXX--- MK3 ---XXX
# XXXXXXXXXXXXXXXXX
[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 max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors
machine_max_acceleration_e = 5000,5000
machine_max_acceleration_extruding = 1250,1250
machine_max_acceleration_retracting = 1250,1250
machine_max_acceleration_x = 1000,960
machine_max_acceleration_y = 1000,960
-machine_max_acceleration_z = 1000,1000
+machine_max_acceleration_z = 200,200
machine_max_feedrate_e = 120,120
machine_max_feedrate_x = 200,100
machine_max_feedrate_y = 200,100
@@ -4220,7 +5785,7 @@ remaining_times = 1
printer_notes = Don't remove the following keywords! These keywords are used in the "compatible printer" condition of the print and filament profiles to link the particular print and filament profiles to this printer profile.\nPRINTER_VENDOR_PRUSA3D\nPRINTER_MODEL_MK3\n
retract_lift_below = 209
max_print_height = 210
-start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.2 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif}
printer_model = MK3
default_print_profile = 0.15mm QUALITY @MK3
@@ -4231,7 +5796,7 @@ max_layer_height = 0.15
min_layer_height = 0.05
printer_variant = 0.25
retract_lift = 0.15
-start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E8.0 F700.0 ; intro line\nG1 X100.0 E12.5 F700.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.2 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E8.0 F700.0 ; intro line\nG1 X100.0 E12.5 F700.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}\n\n; Don't change E value below. Excessive value can damage the printer.\n{if print_settings_id=~/.*@0.25 nozzle MK3.*/}M907 E430 ; set extruder motor current{endif}
default_print_profile = 0.10mm DETAIL @0.25 nozzle MK3
[printer:Original Prusa i3 MK3 0.6 nozzle]
@@ -4240,22 +5805,40 @@ 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.2 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}
default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3
-[printer:Original Prusa i3 MK3S]
+[printer:Original Prusa i3 MK3 0.8 nozzle]
+inherits = Original Prusa i3 MK3
+nozzle_diameter = 0.8
+max_layer_height = 0.6
+min_layer_height = 0.2
+printer_variant = 0.8
+retract_length = 1
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM115 U3.9.2 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}
+default_print_profile = 0.40mm QUALITY @0.8 nozzle
+default_filament_profile = Prusament PLA @0.8 nozzle
+
+[printer:Original Prusa i3 MK3S & MK3S+]
inherits = Original Prusa i3 MK3
+renamed_from = "Original Prusa i3 MK3S"
printer_model = MK3S
-start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.2 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif}
-[printer:Original Prusa i3 MK3S 0.25 nozzle]
+[printer:Original Prusa i3 MK3S & MK3S+ 0.25 nozzle]
inherits = Original Prusa i3 MK3 0.25 nozzle
+renamed_from = "Original Prusa i3 MK3S 0.25 nozzle"
printer_model = MK3S
-start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E8.0 F700.0 ; intro line\nG1 X100.0 E12.5 F700.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.2 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E8.0 F700.0 ; intro line\nG1 X100.0 E12.5 F700.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}\n\n; Don't change E value below. Excessive value can damage the printer.\n{if print_settings_id=~/.*@0.25 nozzle MK3.*/}M907 E430 ; set extruder motor current{endif}
-[printer:Original Prusa i3 MK3S 0.6 nozzle]
+[printer:Original Prusa i3 MK3S & MK3S+ 0.6 nozzle]
inherits = Original Prusa i3 MK3 0.6 nozzle
+renamed_from = "Original Prusa i3 MK3S 0.6 nozzle"
+printer_model = MK3S
+
+[printer:Original Prusa i3 MK3S & MK3S+ 0.8 nozzle]
+inherits = Original Prusa i3 MK3 0.8 nozzle
printer_model = MK3S
-start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\nG1 Y-3.0 F1000.0 ; go outside print area\nG92 E0.0\nG1 X60.0 E9.0 F1000.0 ; intro line\nG1 X100.0 E12.5 F1000.0 ; intro line\nG92 E0.0\nM221 S{if layer_height<0.075}100{else}95{endif}
[printer:*mm2*]
inherits = Original Prusa i3 MK3
@@ -4285,8 +5868,8 @@ default_filament_profile = Prusament PLA @MMU2
inherits = *mm2*
single_extruder_multi_material = 0
default_filament_profile = Prusament PLA
-start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n
-end_gcode = G1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.2 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif}
+end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+10, max_print_height)}{endif} F720 ; Move print head up\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM702 C\nG4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nM84 ; disable motors
[printer:Original Prusa i3 MK3 MMU2 Single 0.6 nozzle]
inherits = Original Prusa i3 MK3 MMU2 Single
@@ -4295,8 +5878,21 @@ 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.2 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0
default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3
+[printer:Original Prusa i3 MK3 MMU2 Single 0.8 nozzle]
+inherits = Original Prusa i3 MK3 MMU2 Single 0.6 nozzle
+single_extruder_multi_material = 0
+nozzle_diameter = 0.8
+max_layer_height = 0.6
+min_layer_height = 0.2
+printer_variant = 0.8
+retract_length = 1
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM115 U3.9.2 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0
+default_print_profile = 0.40mm QUALITY @0.8 nozzle
+default_filament_profile = Prusament PLA @0.8 nozzle
+
[printer:Original Prusa i3 MK3 MMU2 Single 0.25 nozzle]
inherits = Original Prusa i3 MK3 MMU2 Single
single_extruder_multi_material = 0
@@ -4305,7 +5901,7 @@ max_layer_height = 0.15
min_layer_height = 0.05
printer_variant = 0.25
retract_lift = 0.15
-start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F1000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.2 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 E8.0 F1000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E value below. Excessive value can damage the printer.\n{if print_settings_id=~/.*@0.25 nozzle MK3.*/}M907 E430 ; set extruder motor current{endif}
default_print_profile = 0.10mm DETAIL @0.25 nozzle MK3
[printer:Original Prusa i3 MK3 MMU2]
@@ -4316,52 +5912,71 @@ inherits = *mm2*
machine_max_acceleration_e = 8000,8000
nozzle_diameter = 0.4,0.4,0.4,0.4,0.4
extruder_colour = #FF8000;#DB5182;#00FFFF;#FF4F4F;#9FFF9F
-start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n
-end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors\n
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.2 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|SOLUBLE).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif}
+end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|SOLUBLE|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if max_layer_z < max_print_height}G1 Z{z_offset+min(max_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]
+[printer:Original Prusa i3 MK3S & MK3S+ MMU2S Single]
inherits = *mm2s*
+renamed_from = "Original Prusa i3 MK3S MMU2S Single"
single_extruder_multi_material = 0
default_filament_profile = Prusament PLA
-start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n
-end_gcode = G1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.2 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif}
+end_gcode = {if max_layer_z < max_print_height}G1 Z{z_offset+min(max_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
+[printer:Original Prusa i3 MK3S & MK3S+ MMU2S Single 0.6 nozzle]
+inherits = Original Prusa i3 MK3S & MK3S+ MMU2S Single
+renamed_from = "Original Prusa i3 MK3S MMU2S Single 0.6 nozzle"
single_extruder_multi_material = 0
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.2 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0
default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3
-[printer:Original Prusa i3 MK3S MMU2S Single 0.25 nozzle]
-inherits = Original Prusa i3 MK3S MMU2S Single
+[printer:Original Prusa i3 MK3S & MK3S+ MMU2S Single 0.8 nozzle]
+inherits = Original Prusa i3 MK3S & MK3S+ MMU2S Single 0.6 nozzle
+single_extruder_multi_material = 0
+nozzle_diameter = 0.8
+max_layer_height = 0.6
+min_layer_height = 0.2
+printer_variant = 0.8
+retract_length = 1
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM115 U3.9.2 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0
+default_print_profile = 0.40mm QUALITY @0.8 nozzle
+default_filament_profile = Prusament PLA @0.8 nozzle
+
+[printer:Original Prusa i3 MK3S & MK3S+ MMU2S Single 0.25 nozzle]
+inherits = Original Prusa i3 MK3S & MK3S+ MMU2S Single
+renamed_from = "Original Prusa i3 MK3S MMU2S Single 0.25 nozzle"
single_extruder_multi_material = 0
nozzle_diameter = 0.25
max_layer_height = 0.15
min_layer_height = 0.05
printer_variant = 0.25
retract_lift = 0.15
-start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.2 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nTx\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nTc\n; purge line\nG1 X55.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F1400.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E value below. Excessive value can damage the printer.\n{if print_settings_id=~/.*@0.25 nozzle MK3.*/}M907 E430 ; set extruder motor current{endif}
default_print_profile = 0.10mm DETAIL @0.25 nozzle MK3
-[printer:Original Prusa i3 MK3S MMU2S]
+[printer:Original Prusa i3 MK3S & MK3S+ MMU2S]
inherits = *mm2s*
+renamed_from = "Original Prusa i3 MK3S MMU2S"
machine_max_acceleration_e = 8000,8000
nozzle_diameter = 0.4,0.4,0.4,0.4,0.4
extruder_colour = #FF8000;#DB5182;#00FFFF;#FF4F4F;#9FFF9F
-start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.8.1 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n
-end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+30, max_print_height)}{endif} ; Move print head up\nG1 X0 Y200 F3000 ; home X axis\nM84 ; disable motors\n
+start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM862.1 P[nozzle_diameter] ; nozzle diameter check\nM115 U3.9.2 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0\n\n; Don't change E values below. Excessive value can damage the printer.\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|SOLUBLE).*/}M907 E430 ; set extruder motor current{endif}\n{if print_settings_id=~/.*(SPEED @MK3|DRAFT @MK3).*/}M907 E538 ; set extruder motor current{endif}
+end_gcode = {if has_wipe_tower}\nG1 E-15.0000 F3000\n{else}\nG1 X0 Y210 F7200\nG1 E2 F5000\nG1 E2 F5500\nG1 E2 F6000\nG1 E-15.0000 F5800\nG1 E-20.0000 F5500\nG1 E10.0000 F3000\nG1 E-10.0000 F3100\nG1 E10.0000 F3150\nG1 E-10.0000 F3250\nG1 E10.0000 F3300\n{endif}\n\n; Unload filament\nM702 C\n\nG4 ; wait\nM221 S100 ; reset flow\nM900 K0 ; reset LA\n{if print_settings_id=~/.*(DETAIL @MK3|QUALITY @MK3|SOLUBLE|@0.25 nozzle MK3).*/}M907 E538 ; reset extruder motor current{endif}\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\n; Lift print head a bit\n{if max_layer_z < max_print_height}G1 Z{z_offset+min(max_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
-[printer:Original Prusa i3 MK3S MMU2S 0.6 nozzle]
-inherits = Original Prusa i3 MK3S MMU2S
+[printer:Original Prusa i3 MK3S & MK3S+ MMU2S 0.6 nozzle]
+inherits = Original Prusa i3 MK3S & MK3S+ MMU2S
+renamed_from = "Original Prusa i3 MK3S MMU2S 0.6 nozzle"
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.2 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0
default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3
[printer:Original Prusa i3 MK3 MMU2 0.6 nozzle]
@@ -4370,12 +5985,36 @@ 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.2 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0
default_print_profile = 0.30mm QUALITY @0.6 nozzle MK3
+## 0.8mm nozzle MMU2/S printer profiles
+
+## For later use. 0.8mm nozzle profiles are only available for MMU2 Single mode at the moment.
+
+## [printer:Original Prusa i3 MK3 MMU2 0.8 nozzle]
+## inherits = Original Prusa i3 MK3 MMU2
+## nozzle_diameter = 0.8,0.8,0.8,0.8,0.8
+## max_layer_height = 0.6
+## min_layer_height = 0.2
+## printer_variant = 0.8
+## start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM115 U3.9.2 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E32.0 F1073.0\nG1 X5.0 E32.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0
+## default_print_profile = 0.40mm QUALITY @0.8 nozzle
+
+## [printer:Original Prusa i3 MK3S & MK3S+ MMU2S 0.8 nozzle]
+## inherits = Original Prusa i3 MK3S & MK3S+ MMU2S
+## nozzle_diameter = 0.8,0.8,0.8,0.8,0.8
+## max_layer_height = 0.6
+## min_layer_height = 0.2
+## printer_variant = 0.8
+## start_gcode = M862.3 P \"[printer_model]\" ; printer model check\nM115 U3.9.2 ; tell printer latest fw version\nG90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S[first_layer_temperature] ; set extruder temp\nM140 S[first_layer_bed_temperature] ; set bed temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nM109 S[first_layer_temperature] ; wait for extruder temp\nG28 W ; home all without mesh bed level\nG80 ; mesh bed leveling\n\n; Send the filament type to the MMU2.0 unit.\n; E stands for extruder number, F stands for filament type (0: default; 1:flex; 2: PVA)\nM403 E0 F{"" + ((filament_type[0]=="FLEX") ? 1 : ((filament_type[0]=="PVA") ? 2 : 0))}\nM403 E1 F{"" + ((filament_type[1]=="FLEX") ? 1 : ((filament_type[1]=="PVA") ? 2 : 0))}\nM403 E2 F{"" + ((filament_type[2]=="FLEX") ? 1 : ((filament_type[2]=="PVA") ? 2 : 0))}\nM403 E3 F{"" + ((filament_type[3]=="FLEX") ? 1 : ((filament_type[3]=="PVA") ? 2 : 0))}\nM403 E4 F{"" + ((filament_type[4]=="FLEX") ? 1 : ((filament_type[4]=="PVA") ? 2 : 0))}\n\n{if not has_single_extruder_multi_material_priming}\n;go outside print area\nG1 Y-3.0 F1000.0\nG1 Z0.4 F1000.0\n; select extruder\nT[initial_tool]\n; initial load\nG1 X55.0 E29.0 F1073.0\nG1 X5.0 E29.0 F1800.0\nG1 X55.0 E8.0 F2000.0\nG1 Z0.3 F1000.0\nG92 E0.0\nG1 X240.0 E25.0 F2200.0\nG1 Y-2.0 F1000.0\nG1 X55.0 E25 F1400.0\nG1 Z0.20 F1000.0\nG1 X5.0 E4.0 F1000.0\nG92 E0.0\n{endif}\n\nM221 S{if layer_height<0.075}100{else}95{endif}\nG92 E0.0
+## default_print_profile = 0.40mm QUALITY @0.8 nozzle
+
## MINI
-[printer:Original Prusa MINI]
+[printer:Original Prusa MINI & MINI+]
inherits = *common*
+renamed_from = "Original Prusa MINI"
printer_model = MINI
printer_technology = FFF
printer_variant = 0.4
@@ -4418,12 +6057,13 @@ retract_layer_change = 0
silent_mode = 0
remaining_times = 1
start_gcode = G90 ; use absolute coordinates\nM83 ; extruder relative mode\nM104 S170 ; set extruder temp for bed leveling\nM140 S[first_layer_bed_temperature] ; set bed temp\nM109 R170 ; wait for bed leveling temp\nM190 S[first_layer_bed_temperature] ; wait for bed temp\nG28 ; home all without mesh bed level\nG29 ; mesh bed leveling \nM104 S[first_layer_temperature] ; set extruder temp\nG92 E0.0\nG1 Y-2.0 X179 F2400\nG1 Z3 F720\nM109 S[first_layer_temperature] ; wait for extruder temp\n\n; intro line\nG1 X170 F1000\nG1 Z0.2 F720\nG1 X110.0 E8.0 F900\nG1 X40.0 E10.0 F700\nG92 E0.0\n\nM221 S95 ; set flow
-end_gcode = G1 E-1 F2100 ; retract\n{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+5, max_print_height)}{endif} F720 ; Move print head up\nG1 X178 Y180 F4200 ; park print head\nG4 ; wait\nM104 S0 ; turn off temperature\nM140 S0 ; turn off heatbed\nM107 ; turn off fan\nM221 S100 ; reset flow\nM84 ; disable motors
+end_gcode = G1 E-1 F2100 ; retract\n{if max_layer_z < max_print_height}G1 Z{z_offset+min(max_layer_z+2, max_print_height)}{endif} F720 ; Move print head up\nG1 X178 Y178 F4200 ; park print head\n{if max_layer_z < max_print_height}G1 Z{z_offset+min(max_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 =
-[printer:Original Prusa MINI 0.25 nozzle]
-inherits = Original Prusa MINI
+[printer:Original Prusa MINI & MINI+ 0.25 nozzle]
+inherits = Original Prusa MINI & MINI+
+renamed_from = "Original Prusa MINI 0.25 nozzle"
printer_variant = 0.25
nozzle_diameter = 0.25
max_layer_height = 0.15
@@ -4431,33 +6071,36 @@ min_layer_height = 0.05
default_print_profile = 0.10mm DETAIL @0.25 nozzle MINI
retract_length = 3
retract_lift = 0.15
-retract_speed = 70
-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] ; 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
-[printer:Original Prusa MINI 0.6 nozzle]
-inherits = Original Prusa MINI
+[printer:Original Prusa MINI & MINI+ 0.6 nozzle]
+inherits = Original Prusa MINI & MINI+
+renamed_from = "Original Prusa MINI 0.6 nozzle"
printer_variant = 0.6
nozzle_diameter = 0.6
max_layer_height = 0.40
min_layer_height = 0.15
default_print_profile = 0.30mm QUALITY @0.6 nozzle MINI
retract_length = 3.5
-retract_lift = 0.2
-retract_speed = 70
-deretract_speed = 40
-wipe = 1
-retract_before_wipe = 70%
+retract_before_travel = 1.5
+
+[printer:Original Prusa MINI & MINI+ 0.8 nozzle]
+inherits = Original Prusa MINI & MINI+
+printer_variant = 0.8
+nozzle_diameter = 0.8
+max_layer_height = 0.55
+min_layer_height = 0.2
+default_print_profile = 0.40mm QUALITY @0.8 nozzle MINI
+default_filament_profile = Prusament PLA @0.8 nozzle
+retract_length = 3.5
retract_before_travel = 1.5
[printer:Original Prusa SL1]
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
new file mode 100644
index 000000000..4a097ed6a
--- /dev/null
+++ b/resources/profiles/TriLAB.idx
@@ -0,0 +1,8 @@
+min_slic3r_version = 2.3.0-alpha3
+0.0.6 Added material TPU 93A (SMARTFIL)
+0.0.5 Removed obsolete host keys.
+0.0.4 Added PLA, PETG profiles for 0.8 nozzle, update print materials
+0.0.3 Added DeltiQ 2, DeltiQ 2 Plus printers, 0.10mm, 0.20mm FLEX print profiles, updated print materials, flexprint extension support
+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
new file mode 100644
index 000000000..d31461510
--- /dev/null
+++ b/resources/profiles/TriLAB.ini
@@ -0,0 +1,893 @@
+# Print profiles for the TriLAB printers
+# based on https://github.com/trilab3d/PrusaSlicer-settings/tree/master/live/TriLAB
+
+[vendor]
+# Vendor name will be shown by the Config Wizard.
+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.6
+# Where to get the updates from?
+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.
+# Printer model name will be shown by the installation wizard.
+
+[printer_model:DQ2]
+name = DeltiQ 2
+variants = 0.4; 0.8
+technology = FFF
+family = DeltiQ 2
+bed_model = dq2_bed.stl
+bed_texture = dq2_bed_texture.svg
+default_materials = DeltiQ - PLA - Generic; DeltiQ - PETG - Generic; DeltiQ - ABS - Generic; DeltiQ - PLA - ExtraFill (Fillamentum); DeltiQ - PETG (Devil Design); DeltiQ - ABS - ExtraFill (Fillamentum); DeltiQ - ASA - ExtraFill (Fillamentum); DeltiQ - CPE - HG100 (Fillamentum); DeltiQ FP2 - PLA - Generic; DeltiQ FP2 - PETG - Generic; DeltiQ FP2 - ABS - Generic; DeltiQ FP2 - PLA - ExtraFill (Fillamentum); DeltiQ FP2 - PETG (Devil Design); DeltiQ FP2 - ABS - ExtraFill (Fillamentum); DeltiQ FP2 - ASA - ExtraFill (Fillamentum); DeltiQ FP2 - CPE - HG100 (Fillamentum); DeltiQ FP2 - FLEX - Generic; DeltiQ FP2 - TPU 92A - FlexFill (Fillamentum); DeltiQ FP2 - TPU 98A - FlexFill (Fillamentum); DeltiQ FP2 - TPU 93A (SMARTFIL); DeltiQ - PLA - ExtraFill (Fillamentum) @0.8 nozzle
+
+[printer_model:DQ2P]
+name = DeltiQ 2 Plus
+variants = 0.4; 0.8
+technology = FFF
+family = DeltiQ 2
+bed_model = dq2_bed.stl
+bed_texture = dq2_bed_texture.svg
+default_materials = DeltiQ - PLA - Generic; DeltiQ - PETG - Generic; DeltiQ - ABS - Generic; DeltiQ - PLA - ExtraFill (Fillamentum); DeltiQ - PETG (Devil Design); DeltiQ - ABS - ExtraFill (Fillamentum); DeltiQ - ASA - ExtraFill (Fillamentum); DeltiQ - CPE - HG100 (Fillamentum); DeltiQ - PLA - ExtraFill (Fillamentum) @0.8 nozzle
+
+[printer_model:DQ2+FP2]
+name = DeltiQ 2 + FlexPrint 2
+variants = 0.4
+technology = FFF
+family = DeltiQ 2
+bed_model = dq2_bed.stl
+bed_texture = dq2_bed_texture.svg
+default_materials = DeltiQ FP2 - PLA - Generic; DeltiQ FP2 - PETG - Generic; DeltiQ FP2 - ABS - Generic; DeltiQ FP2 - PLA - ExtraFill (Fillamentum); DeltiQ FP2 - PETG (Devil Design); DeltiQ FP2 - ABS - ExtraFill (Fillamentum); DeltiQ FP2 - ASA - ExtraFill (Fillamentum); DeltiQ FP2 - CPE - HG100 (Fillamentum); DeltiQ FP2 - FLEX - Generic; DeltiQ FP2 - TPU 92A - FlexFill (Fillamentum); DeltiQ FP2 - TPU 98A - FlexFill (Fillamentum); DeltiQ FP2 - TPU 93A (SMARTFIL)
+
+[printer_model:DQ2P+FP2]
+name = DeltiQ 2 Plus + FlexPrint 2
+variants = 0.4
+technology = FFF
+family = DeltiQ 2
+bed_model = dq2_bed.stl
+bed_texture = dq2_bed_texture.svg
+default_materials = DeltiQ FP2 - PLA - Generic; DeltiQ FP2 - PETG - Generic; DeltiQ FP2 - ABS - Generic; DeltiQ FP2 - PLA - ExtraFill (Fillamentum); DeltiQ FP2 - PETG (Devil Design); DeltiQ FP2 - ABS - ExtraFill (Fillamentum); DeltiQ FP2 - ASA - ExtraFill (Fillamentum); DeltiQ FP2 - CPE - HG100 (Fillamentum); DeltiQ FP2 - FLEX - Generic; DeltiQ FP2 - TPU 92A - FlexFill (Fillamentum); DeltiQ FP2 - TPU 98A - FlexFill (Fillamentum); DeltiQ FP2 - TPU 93A (SMARTFIL)
+
+[printer_model:DQ2+FP]
+name = DeltiQ 2 + FlexPrint
+variants = 0.4
+technology = FFF
+family = DeltiQ 2
+bed_model = dq2_bed.stl
+bed_texture = dq2_bed_texture.svg
+default_materials = DeltiQ FP - PLA - Generic; DeltiQ FP - PETG - Generic; DeltiQ FP - ABS - Generic; DeltiQ FP - PLA - ExtraFill (Fillamentum); DeltiQ FP - PETG (Devil Design); DeltiQ FP - ABS - ExtraFill (Fillamentum); DeltiQ FP - ASA - ExtraFill (Fillamentum); DeltiQ FP - CPE - HG100 (Fillamentum); DeltiQ FP - FLEX - Generic;
+
+[printer_model:DQ2P+FP]
+name = DeltiQ 2 Plus + FlexPrint
+variants = 0.4
+technology = FFF
+family = DeltiQ 2
+bed_model = dq2_bed.stl
+bed_texture = dq2_bed_texture.svg
+default_materials = DeltiQ FP - PLA - Generic; DeltiQ FP - PETG - Generic; DeltiQ FP - ABS - Generic; DeltiQ FP - PLA - ExtraFill (Fillamentum); DeltiQ FP - PETG (Devil Design); DeltiQ FP - ABS - ExtraFill (Fillamentum); DeltiQ FP - ASA - ExtraFill (Fillamentum); DeltiQ FP - CPE - HG100 (Fillamentum); DeltiQ FP - FLEX - Generic
+
+[printer_model:DQM]
+name = DeltiQ M
+variants = 0.4
+technology = FFF
+family = DeltiQ
+default_materials = DeltiQ PLA; DeltiQ ASA; DeltiQ PET; DeltiQ ABS; DeltiQ CPE
+
+[printer_model:DQL]
+name = DeltiQ L
+variants = 0.4
+technology = FFF
+family = DeltiQ
+default_materials = DeltiQ PLA; DeltiQ ASA; DeltiQ PET; DeltiQ ABS; DeltiQ CPE
+
+[printer_model:DQXL]
+name = DeltiQ XL
+variants = 0.4
+technology = FFF
+family = DeltiQ
+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.20mm Normal]
+avoid_crossing_perimeters = 0
+bottom_fill_pattern = rectilinear
+bottom_solid_layers = 4
+bottom_solid_min_thickness = 0.7
+bridge_acceleration = 1000
+bridge_angle = 0
+bridge_flow_ratio = 0.95
+bridge_speed = 30
+brim_width = 0
+clip_multipart_objects = 1
+compatible_printers =
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and nozzle_diameter[0]==0.4
+complete_objects = 0
+default_acceleration = 2000
+dont_support_bridges = 0
+draft_shield = 0
+elefant_foot_compensation = 0.2
+ensure_vertical_shell_thickness = 0
+external_perimeter_extrusion_width = 0.45
+external_perimeter_speed = 30
+external_perimeters_first = 0
+extra_perimeters = 0
+extruder_clearance_height = 60
+extruder_clearance_radius = 45
+extrusion_width = 0.45
+fill_angle = 45
+fill_density = 20%
+fill_pattern = grid
+first_layer_acceleration = 1000
+first_layer_extrusion_width = 0.42
+first_layer_height = 0.2
+first_layer_speed = 20
+gap_fill_speed = 40
+gcode_comments = 0
+gcode_label_objects = 0
+infill_acceleration = 2000
+infill_every_layers = 1
+infill_extruder = 1
+infill_extrusion_width = 0.45
+infill_first = 0
+infill_only_where_needed = 0
+infill_overlap = 25%
+infill_speed = 60
+interface_shells = 0
+ironing = 0
+ironing_flowrate = 15%
+ironing_spacing = 0.1
+ironing_speed = 15
+ironing_type = top
+layer_height = 0.2
+max_print_speed = 60
+max_volumetric_speed = 0
+min_skirt_length = 4
+notes =
+only_retract_when_crossing_perimeters = 1
+ooze_prevention = 0
+output_filename_format = {input_filename_base}_{printer_model}_{filament_type[0]}_{layer_height}mm_{print_time}.gcode
+overhangs = 1
+perimeter_acceleration = 1500
+perimeter_extruder = 1
+perimeter_extrusion_width = 0.45
+perimeter_speed = 45
+perimeters = 2
+post_process =
+print_settings_id =
+raft_layers = 0
+resolution = 0
+seam_position = nearest
+single_extruder_multi_material_priming = 0
+skirt_distance = 3
+skirt_height = 2
+skirts = 1
+slice_closing_radius = 0.049
+small_perimeter_speed = 20
+solid_infill_below_area = 70
+solid_infill_every_layers = 0
+solid_infill_extruder = 1
+solid_infill_extrusion_width = 0.45
+solid_infill_speed = 60
+spiral_vase = 0
+standby_temperature_delta = -5
+support_material = 0
+support_material_angle = 30
+support_material_auto = 1
+support_material_buildplate_only = 0
+support_material_contact_distance = 0.1
+support_material_enforce_layers = 0
+support_material_extruder = 0
+support_material_extrusion_width = 0.35
+support_material_interface_contact_loops = 0
+support_material_interface_extruder = 0
+support_material_interface_layers = 4
+support_material_interface_spacing = 0.4
+support_material_interface_speed = 100%
+support_material_pattern = rectilinear
+support_material_spacing = 2
+support_material_speed = 50
+support_material_synchronize_layers = 0
+support_material_threshold = 40
+support_material_with_sheath = 0
+support_material_xy_spacing = 0.6
+thin_walls = 0
+threads = 12
+top_fill_pattern = monotonic
+top_infill_extrusion_width = 0.4
+top_solid_infill_speed = 40
+top_solid_layers = 5
+top_solid_min_thickness = 0.7
+travel_speed = 150
+wipe_tower = 0
+wipe_tower_bridging = 10
+wipe_tower_no_sparse_layers = 0
+wipe_tower_rotation_angle = 0
+wipe_tower_width = 60
+wipe_tower_x = 180
+wipe_tower_y = 140
+xy_size_compensation = 0
+
+[print:DeltiQ 0.10mm Normal]
+inherits = DeltiQ 0.20mm Normal
+bottom_solid_layers = 7
+bottom_solid_min_thickness = 0.7
+bridge_flow_ratio = 0.7
+bridge_speed = 30
+ensure_vertical_shell_thickness = 1
+layer_height = 0.1
+first_layer_height = 0.2
+top_solid_layers = 9
+top_solid_min_thickness = 0.7
+top_infill_extrusion_width = 0.4
+fill_pattern = grid
+fill_density = 20%
+
+[print:DeltiQ 0.15mm Normal]
+inherits = DeltiQ 0.20mm Normal
+bottom_solid_layers = 5
+bottom_solid_min_thickness = 0.7
+bridge_flow_ratio = 0.7
+bridge_speed = 30
+ensure_vertical_shell_thickness = 1
+layer_height = 0.15
+first_layer_height = 0.2
+top_solid_layers = 7
+top_solid_min_thickness = 0.7
+fill_pattern = grid
+fill_density = 20%
+
+[print:DeltiQ 0.20mm Vase]
+inherits = DeltiQ 0.20mm Normal
+perimeters = 1
+top_solid_layers = 0
+fill_density = 0
+support_material = 0
+spiral_vase = 1
+ensure_vertical_shell_thickness = 1
+thin_walls = 0
+
+[print:DeltiQ 0.20mm FLEX]
+inherits = DeltiQ 0.20mm Normal
+avoid_crossing_perimeters = 0
+bridge_flow_ratio = 0.80
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*FLEXPRINT.*/ and nozzle_diameter[0]==0.4
+extra_perimeters = 1
+only_retract_when_crossing_perimeters = 1
+extrusion_width = 0.40
+overhangs = 0
+seam_position = nearest
+thin_walls = 0
+bridge_speed = 20
+external_perimeter_speed = 20
+first_layer_speed = 20
+gap_fill_speed = 25
+infill_extrusion_width = 0.55
+infill_speed = 40
+infill_overlap = 27%
+perimeter_speed = 25
+small_perimeter_speed = 20
+solid_infill_speed = 30
+solid_infill_extrusion_width = 0.45
+support_material_contact_distance = 0.3
+support_material_speed = 30
+top_solid_infill_speed = 20
+top_fill_pattern = rectilinear
+fill_pattern = grid
+fill_density = 25%
+travel_speed = 200
+max_print_speed = 40
+complete_objects = 1
+
+[print:DeltiQ 0.40mm Normal @0.8 nozzle]
+inherits = DeltiQ 0.20mm Normal
+bottom_solid_layers = 3
+bottom_solid_min_thickness = 1.2
+bridge_flow_ratio = 0.90
+bridge_speed = 20
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and nozzle_diameter[0]==0.8
+elefant_foot_compensation = 0.2
+external_perimeter_extrusion_width = 0.80
+external_perimeter_speed = 30
+extrusion_width = 0.80
+first_layer_extrusion_width = 0.80
+first_layer_height = 0.4
+first_layer_speed = 20
+gap_fill_speed = 40
+infill_extrusion_width = 0.9
+infill_overlap = 28%
+infill_speed = 60
+layer_height = 0.4
+max_print_speed = 80
+max_volumetric_speed = 40
+overhangs = 1
+perimeter_extrusion_width = 0.80
+perimeter_speed = 45
+perimeters = 2
+small_perimeter_speed = 20
+solid_infill_extrusion_width = 0.8
+solid_infill_speed = 60
+top_infill_extrusion_width = 0.8
+top_solid_infill_speed = 40
+top_solid_layers = 4
+top_solid_min_thickness = 1.2
+
+[print:DeltiQ 0.40mm Vase @0.8 nozzle]
+inherits = DeltiQ 0.40mm Normal @0.8 nozzle
+bottom_solid_layers = 4
+perimeters = 1
+top_solid_layers = 0
+fill_density = 0
+support_material = 0
+spiral_vase = 1
+ensure_vertical_shell_thickness = 1
+thin_walls = 0
+
+
+[filament:*DeltiQ common*]
+compatible_printers =
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and !(printer_notes=~/.*FLEXPRINT.*/) and nozzle_diameter[0]==0.4
+disable_fan_first_layers = 3
+extrusion_multiplier = 1
+filament_colour = #FF0000
+filament_diameter = 1.75
+filament_minimal_purge_on_wipe_tower = 15
+filament_notes = ""
+filament_ramming_parameters = "120 100 6.6 6.8 7.2 7.6 7.9 8.2 8.7 9.4 9.9 10.0| 0.05 6.6 0.45 6.8 0.95 7.8 1.45 8.3 1.95 9.7 2.45 10 2.95 7.6 3.45 7.6 3.95 7.6 4.45 7.6 4.95 7.6"
+filament_settings_id = ""
+filament_soluble = 0
+filament_toolchange_delay = 0
+start_filament_gcode = "; FILAMENT_START_GCODE"
+end_filament_gcode = "; FILAMENT_END_GCODE"
+
+
+# DeltiQ Filaments #
+
+[filament:DeltiQ - PLA - Generic]
+inherits = *DeltiQ common*
+bed_temperature = 55
+bridge_fan_speed = 100
+cooling = 1
+fan_always_on = 1
+fan_below_layer_time = 100
+filament_vendor = Fillamentum
+filament_cost = 767
+filament_density = 1.24
+filament_max_volumetric_speed = 8
+filament_retract_before_travel = 2
+filament_retract_before_wipe = 90%
+filament_retract_layer_change = 1
+filament_retract_length = 4.0
+filament_retract_lift = 0.2
+filament_retract_speed = 30
+filament_type = PLA
+filament_wipe = 1
+first_layer_bed_temperature = 55
+first_layer_temperature = 220
+max_fan_speed = 100
+min_fan_speed = 100
+min_print_speed = 10
+slowdown_below_layer_time = 4
+temperature = 215
+
+[filament:DeltiQ - PETG - Generic]
+inherits = *DeltiQ common*
+bed_temperature = 80
+bridge_fan_speed = 50
+cooling = 1
+fan_always_on = 1
+fan_below_layer_time = 20
+filament_vendor = DevilDesign
+filament_cost = 480
+filament_density = 1.27
+filament_deretract_speed = 25
+filament_max_volumetric_speed = 8
+filament_retract_before_travel = 2
+filament_retract_before_wipe = 70%
+filament_retract_layer_change = 1
+filament_retract_length = 4.1
+filament_retract_lift = 0.2
+filament_retract_speed = 45
+filament_type = PET
+filament_wipe = 1
+first_layer_bed_temperature = 80
+first_layer_temperature = 240
+max_fan_speed = 50
+min_fan_speed = 30
+min_print_speed = 10
+slowdown_below_layer_time = 5
+temperature = 245
+
+[filament:DeltiQ - ABS - Generic]
+inherits = *DeltiQ common*
+bed_temperature = 100
+bridge_fan_speed = 25
+cooling = 1
+fan_always_on = 1
+fan_below_layer_time = 20
+filament_vendor = Fillamentum
+filament_cost = 774
+filament_density = 1.08
+filament_max_volumetric_speed = 4
+filament_retract_before_travel = 3
+filament_retract_before_wipe = 70%
+filament_retract_layer_change = 1
+filament_retract_length = 4.1
+filament_retract_lift = 0.2
+filament_retract_speed = 25
+filament_type = ABS
+filament_wipe = 1
+first_layer_bed_temperature = 100
+first_layer_temperature = 255
+max_fan_speed = 15
+min_fan_speed = 5
+min_print_speed = 10
+slowdown_below_layer_time = 15
+temperature = 255
+
+[filament:DeltiQ - PLA - ExtraFill (Fillamentum)]
+inherits = DeltiQ - PLA - Generic
+
+[filament:DeltiQ - PETG (Devil Design)]
+inherits = DeltiQ - PETG - Generic
+
+[filament:DeltiQ - ABS - ExtraFill (Fillamentum)]
+inherits = DeltiQ - ABS - Generic
+
+[filament:DeltiQ - ASA - ExtraFill (Fillamentum)]
+inherits = DeltiQ - ABS - Generic
+filament_density = 1.07
+filament_type = ASA
+filament_vendor = Fillamentum
+first_layer_temperature = 265
+temperature = 265
+
+[filament:DeltiQ - CPE - HG100 (Fillamentum)]
+inherits = *DeltiQ common*
+bed_temperature = 90
+bridge_fan_speed = 50
+cooling = 1
+fan_always_on = 1
+fan_below_layer_time = 20
+filament_vendor = Fillamentum
+filament_cost = 1214
+filament_density = 1.25
+filament_deretract_speed = 25
+filament_max_volumetric_speed = 8
+filament_retract_before_travel = 2
+filament_retract_before_wipe = 70%
+filament_retract_layer_change = 0
+filament_retract_length = 4.3
+filament_retract_lift = 0.2
+filament_retract_speed = 45
+filament_type = CPE
+filament_wipe = 1
+first_layer_bed_temperature = 90
+first_layer_temperature = 265
+max_fan_speed = 50
+min_fan_speed = 30
+min_print_speed = 10
+slowdown_below_layer_time = 5
+temperature = 260
+
+[filament:DeltiQ - PLA - ExtraFill (Fillamentum) @0.8 nozzle]
+inherits = DeltiQ - PLA - ExtraFill (Fillamentum)
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and !(printer_notes=~/.*FLEXPRINT.*/) and nozzle_diameter[0]==0.8
+disable_fan_first_layers = 1
+filament_max_volumetric_speed = 40
+first_layer_temperature = 230
+slowdown_below_layer_time = 8
+temperature = 230
+filament_retract_layer_change = 0
+filament_retract_length = 4.1
+filament_retract_speed = 45
+filament_deretract_speed = 25
+
+[filament:DeltiQ - PETG (Devil Design) @0.8 nozzle]
+inherits = DeltiQ - PETG (Devil Design)
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and !(printer_notes=~/.*FLEXPRINT.*/) and nozzle_diameter[0]==0.8
+filament_max_volumetric_speed = 40
+first_layer_temperature = 240
+slowdown_below_layer_time = 8
+temperature = 240
+filament_retract_layer_change = 0
+filament_retract_length = 4.3
+filament_retract_speed = 45
+filament_deretract_speed = 25
+filament_retract_before_wipe = 80%
+filament_wipe = 1
+
+
+# DeltiQ FlexPrint Filaments #
+
+[filament:DeltiQ FP - PLA - Generic]
+inherits = DeltiQ - PLA - Generic
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT1.*/ and nozzle_diameter[0]==0.4
+filament_retract_length = 0.7
+filament_retract_speed = 28
+
+[filament:DeltiQ FP - PETG - Generic]
+inherits = DeltiQ - PETG - Generic
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT1.*/ and nozzle_diameter[0]==0.4
+filament_retract_length = 0.7
+filament_retract_speed = 25
+
+[filament:DeltiQ FP - ABS - Generic]
+inherits = DeltiQ - ABS - Generic
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT1.*/ and nozzle_diameter[0]==0.4
+filament_retract_length = 0.7
+filament_retract_speed = 25
+
+[filament:DeltiQ FP - FLEX - Generic]
+inherits = *DeltiQ common*
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT1.*/ and nozzle_diameter[0]==0.4
+bed_temperature = 50
+bridge_fan_speed = 80
+cooling = 1
+disable_fan_first_layers = 1
+extrusion_multiplier = 1.07
+fan_always_on = 1
+fan_below_layer_time = 20
+filament_vendor = Generic
+filament_cost = 1870
+filament_density = 1.22
+filament_deretract_speed = nil
+filament_max_volumetric_speed = 0.7
+filament_retract_before_travel = 2
+filament_retract_before_wipe = 70%
+filament_retract_layer_change = 0
+filament_retract_length = 2.5
+filament_retract_lift = 0.2
+filament_retract_restart_extra = nil
+filament_retract_speed = 20
+filament_type = FLEX
+filament_wipe = 1
+first_layer_bed_temperature = 50
+first_layer_temperature = 240
+max_fan_speed = 50
+min_fan_speed = 30
+min_print_speed = 5
+slowdown_below_layer_time = 4
+temperature = 240
+
+[filament:DeltiQ FP - PLA - ExtraFill (Fillamentum)]
+inherits = DeltiQ FP - PLA - Generic
+
+[filament:DeltiQ FP - PETG (Devil Design)]
+inherits = DeltiQ FP - PETG - Generic
+
+[filament:DeltiQ FP - ABS - ExtraFill (Fillamentum)]
+inherits = DeltiQ FP - ABS - Generic
+
+[filament:DeltiQ FP - ASA - ExtraFill (Fillamentum)]
+inherits = DeltiQ - ASA - ExtraFill (Fillamentum)
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT1.*/ and nozzle_diameter[0]==0.4
+filament_retract_length = 0.7
+filament_retract_speed = 25
+
+[filament:DeltiQ FP - CPE - HG100 (Fillamentum)]
+inherits = DeltiQ - CPE - HG100 (Fillamentum)
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT1.*/ and nozzle_diameter[0]==0.4
+filament_retract_length = 0.7
+filament_retract_speed = 25
+filament_deretract_speed = 0
+filament_retract_before_wipe = 0%
+
+
+# DeltiQ FlexPrint 2 Filaments #
+
+[filament:DeltiQ FP2 - PLA - Generic]
+inherits = DeltiQ FP - PLA - Generic
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT2.*/ and nozzle_diameter[0]==0.4
+filament_retract_length = 1.2
+filament_retract_speed = 28
+
+[filament:DeltiQ FP2 - PETG - Generic]
+inherits = DeltiQ FP - PETG - Generic
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT2.*/ and nozzle_diameter[0]==0.4
+filament_retract_length = 1.4
+filament_retract_speed = 35
+filament_retract_before_wipe = 0%
+
+[filament:DeltiQ FP2 - ABS - Generic]
+inherits = DeltiQ FP - ABS - Generic
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT2.*/ and nozzle_diameter[0]==0.4
+filament_retract_length = 0.8
+filament_retract_speed = 25
+
+[filament:DeltiQ FP2 - PLA - ExtraFill (Fillamentum)]
+inherits = DeltiQ FP2 - PLA - Generic
+
+[filament:DeltiQ FP2 - PETG (Devil Design)]
+inherits = DeltiQ FP2 - PETG - Generic
+
+[filament:DeltiQ FP2 - ABS - ExtraFill (Fillamentum)]
+inherits = DeltiQ FP2 - ABS - Generic
+
+[filament:DeltiQ FP2 - ASA - ExtraFill (Fillamentum)]
+inherits = DeltiQ FP - ASA - ExtraFill (Fillamentum)
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT2.*/ and nozzle_diameter[0]==0.4
+
+[filament:DeltiQ FP2 - CPE - HG100 (Fillamentum)]
+inherits = DeltiQ FP - CPE - HG100 (Fillamentum)
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT2.*/ and nozzle_diameter[0]==0.4
+filament_retract_length = 0.8
+filament_retract_speed = 35
+filament_deretract_speed = 0
+filament_retract_before_wipe = 0%
+
+[filament:DeltiQ FP2 - FLEX - Generic]
+inherits = DeltiQ FP - FLEX - Generic
+compatible_printers_condition = printer_notes=~/.*PRINTER_VENDOR_TRILAB.*/ and printer_notes=~/.*PRINTER_FAMILY_DQ.*/ and printer_notes=~/.*FLEXPRINT2.*/ and nozzle_diameter[0]==0.4
+bed_temperature = 50
+bridge_fan_speed = 80
+cooling = 1
+disable_fan_first_layers = 1
+extrusion_multiplier = 1.07
+fan_always_on = 1
+fan_below_layer_time = 20
+filament_vendor = Fillamentum
+filament_cost = 1870
+filament_density = 1.22
+filament_deretract_speed = nil
+filament_max_volumetric_speed = 2.9
+filament_retract_before_travel = 2
+filament_retract_before_wipe = 70%
+filament_retract_layer_change = 0
+filament_retract_length = 2.5
+filament_retract_lift = 0.2
+filament_retract_restart_extra = nil
+filament_retract_speed = 20
+filament_type = FLEX
+filament_wipe = 1
+first_layer_bed_temperature = 50
+first_layer_temperature = 225
+max_fan_speed = 50
+min_fan_speed = 30
+min_print_speed = 5
+slowdown_below_layer_time = 4
+temperature = 225
+
+[filament:DeltiQ FP2 - TPU 92A - FlexFill (Fillamentum)]
+inherits = DeltiQ FP2 - FLEX - Generic
+bed_temperature = 50
+bridge_fan_speed = 80
+cooling = 1
+disable_fan_first_layers = 1
+extrusion_multiplier = 1.10
+fan_always_on = 1
+fan_below_layer_time = 20
+filament_vendor = Fillamentum
+filament_cost = 1870
+filament_density = 1.22
+filament_deretract_speed = nil
+filament_max_volumetric_speed = 2.9
+filament_retract_before_travel = 2
+filament_retract_before_wipe = 70%
+filament_retract_layer_change = 0
+filament_retract_length = 2.5
+filament_retract_lift = 0.2
+filament_retract_restart_extra = nil
+filament_retract_speed = 20
+filament_type = TPU92A
+filament_wipe = 1
+first_layer_bed_temperature = 50
+first_layer_temperature = 230
+max_fan_speed = 70
+min_fan_speed = 50
+min_print_speed = 5
+slowdown_below_layer_time = 4
+temperature = 230
+
+[filament:DeltiQ FP2 - TPU 98A - FlexFill (Fillamentum)]
+inherits = DeltiQ FP2 - TPU 92A - FlexFill (Fillamentum)
+extrusion_multiplier = 1.10
+filament_cost = 1870
+filament_density = 1.23
+filament_deretract_speed = nil
+filament_max_volumetric_speed = 2.9
+filament_retract_before_wipe = 70%
+filament_retract_length = 2.5
+filament_retract_speed = 20
+filament_type = TPU98A
+
+[filament:DeltiQ FP2 - TPU 93A (SMARTFIL)]
+inherits = DeltiQ FP2 - FLEX - Generic
+bed_temperature = 50
+bridge_fan_speed = 80
+cooling = 1
+disable_fan_first_layers = 3
+extrusion_multiplier = 1.00
+fan_always_on = 1
+fan_below_layer_time = 10
+filament_vendor = Smartfil
+filament_cost = 1209
+filament_density = 1.21
+filament_deretract_speed = nil
+filament_max_volumetric_speed = 2.5
+filament_retract_before_travel = 2
+filament_retract_before_wipe = nil
+filament_retract_layer_change = 0
+filament_retract_length = 2.9
+filament_retract_lift = 0.2
+filament_retract_restart_extra = nil
+filament_retract_speed = 35
+filament_type = TPU93A
+filament_wipe = 0
+first_layer_bed_temperature = 50
+first_layer_temperature = 235
+max_fan_speed = 70
+min_fan_speed = 30
+min_print_speed = 10
+slowdown_below_layer_time = 4
+temperature = 235
+
+
+# DeltiQ Printer #
+
+[printer:*DeltiQ*]
+inherits =
+bed_shape = 124.315x13.0661,122.268x25.989,118.882x38.6271,114.193x50.8421,108.253x62.5,101.127x73.4732,92.8931x83.6413,83.6413x92.8931,73.4732x101.127,62.5x108.253,50.8421x114.193,38.6271x118.882,25.989x122.268,13.0661x124.315,3.54096e-014x125,-13.0661x124.315,-25.989x122.268,-38.6271x118.882,-50.8421x114.193,-62.5x108.253,-73.4732x101.127,-83.6413x92.8931,-92.8931x83.6413,-101.127x73.4732,-108.253x62.5,-114.193x50.8421,-118.882x38.6271,-122.268x25.989,-124.315x13.0661,-125x7.08192e-014,-124.315x-13.0661,-122.268x-25.989,-118.882x-38.6271,-114.193x-50.8421,-108.253x-62.5,-101.127x-73.4732,-92.8931x-83.6413,-83.6413x-92.8931,-73.4732x-101.127,-62.5x-108.253,-50.8421x-114.193,-38.6271x-118.882,-25.989x-122.268,-13.0661x-124.315,-2.29621e-014x-125,13.0661x-124.315,25.989x-122.268,38.6271x-118.882,50.8421x-114.193,62.5x-108.253,73.4732x-101.127,83.6413x-92.8931,92.8931x-83.6413,101.127x-73.4732,108.253x-62.5,114.193x-50.8421,118.882x-38.6271,122.268x-25.989,124.315x-13.0661,125x-1.41638e-013
+before_layer_gcode = ;BEFORE_LAYER_CHANGE\nG92 E0\n;[layer_z]
+between_objects_gcode =
+cooling_tube_length = 5
+cooling_tube_retraction = 91.5
+default_filament_profile = "DeltiQ PLA"
+default_print_profile = DeltiQ 0.20mm Normal
+deretract_speed = 0
+end_gcode = ;END\nM104 S0 ; Turn extruder heater off\nM140 S0 ; Turn bed heater off\nG28 ; Home all axes\nM84 S5 ; Stop all axes and hold inidle for 5 seconds\nG90 ; Absolute positioning
+extra_loading_move = -2
+extruder_colour = #FF0000
+extruder_offset = 0x0
+gcode_flavor = repetier
+layer_gcode = ;AFTER_LAYER_CHANGE\nM117 layer [layer_num] at [layer_z]mm\n;[layer_z]\n
+max_layer_height = 0.25
+max_print_height = 320
+min_layer_height = 0.15
+nozzle_diameter = 0.4
+parking_pos_retraction = 92
+printer_model =
+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_TRILAB\nPRINTER_FAMILY_DQ\nPRINTER_MODEL_DQL
+printer_settings_id =
+printer_variant =
+printer_vendor = TriLAB Group s.r.o.
+remaining_times = 0
+retract_before_travel = 3
+retract_before_wipe = 100%
+retract_layer_change = 1
+retract_length = 4.0
+retract_length_toolchange = 10
+retract_lift = 0.2
+retract_lift_above = 0
+retract_lift_below = 319
+retract_restart_extra = 0
+retract_restart_extra_toolchange = 0
+retract_speed = 30
+silent_mode = 0
+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
+thumbnails =
+toolchange_gcode =
+use_firmware_retraction = 0
+use_relative_e_distances = 1
+use_volumetric_e = 0
+variable_layer_height = 0
+wipe = 1
+z_offset = 0
+
+[printer:DeltiQ L]
+inherits = *DeltiQ*
+printer_model = DQL
+printer_variant = 0.4
+bed_shape = 124.315x13.0661,122.268x25.989,118.882x38.6271,114.193x50.8421,108.253x62.5,101.127x73.4732,92.8931x83.6413,83.6413x92.8931,73.4732x101.127,62.5x108.253,50.8421x114.193,38.6271x118.882,25.989x122.268,13.0661x124.315,3.54096e-014x125,-13.0661x124.315,-25.989x122.268,-38.6271x118.882,-50.8421x114.193,-62.5x108.253,-73.4732x101.127,-83.6413x92.8931,-92.8931x83.6413,-101.127x73.4732,-108.253x62.5,-114.193x50.8421,-118.882x38.6271,-122.268x25.989,-124.315x13.0661,-125x7.08192e-014,-124.315x-13.0661,-122.268x-25.989,-118.882x-38.6271,-114.193x-50.8421,-108.253x-62.5,-101.127x-73.4732,-92.8931x-83.6413,-83.6413x-92.8931,-73.4732x-101.127,-62.5x-108.253,-50.8421x-114.193,-38.6271x-118.882,-25.989x-122.268,-13.0661x-124.315,-2.29621e-014x-125,13.0661x-124.315,25.989x-122.268,38.6271x-118.882,50.8421x-114.193,62.5x-108.253,73.4732x-101.127,83.6413x-92.8931,92.8931x-83.6413,101.127x-73.4732,108.253x-62.5,114.193x-50.8421,118.882x-38.6271,122.268x-25.989,124.315x-13.0661,125x-1.41638e-013
+max_print_height = 320
+
+[printer:DeltiQ M]
+inherits = *DeltiQ*
+printer_variant = 0.4
+bed_shape = 89.507x9.40756,88.0333x18.7121,85.5951x27.8115,82.2191x36.6063,77.9423x45,72.8115x52.9007,66.883x60.2218,60.2218x66.883,52.9007x72.8115,45x77.9423,36.6063x82.2191,27.8115x85.5951,18.7121x88.0333,9.40756x89.507,2.54949e-014x90,-9.40756x89.507,-18.7121x88.0333,-27.8115x85.5951,-36.6063x82.2191,-45x77.9423,-52.9007x72.8115,-60.2218x66.883,-66.883x60.2218,-72.8115x52.9007,-77.9423x45,-82.2191x36.6063,-85.5951x27.8115,-88.0333x18.7121,-89.507x9.40756,-90x5.09899e-014,-89.507x-9.40756,-88.0333x-18.7121,-85.5951x-27.8115,-82.2191x-36.6063,-77.9423x-45,-72.8115x-52.9007,-66.883x-60.2218,-60.2218x-66.883,-52.9007x-72.8115,-45x-77.9423,-36.6063x-82.2191,-27.8115x-85.5951,-18.7121x-88.0333,-9.40756x-89.507,-1.65327e-014x-90,9.40756x-89.507,18.7121x-88.0333,27.8115x-85.5951,36.6063x-82.2191,45x-77.9423,52.9007x-72.8115,60.2218x-66.883,66.883x-60.2218,72.8115x-52.9007,77.9423x-45,82.2191x-36.6063,85.5951x-27.8115,88.0333x-18.7121,89.507x-9.40756,90x-1.0198e-013
+max_print_height = 230
+printer_model = DQM
+retract_length = 3.7
+retract_length_toolchange = 10
+retract_speed = 30
+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-45 Y-77 Z0.3 F6000 ; Go to purge position start\nG92 E0 ; Zero extruder\nM109 S[first_layer_temperature] ; Set Extruder Temperature and Wait\nG3 X45 Y-77 I45 J77 E10 F200 ; Go ARC to purge end\nG92 E0 ; Zero extruder
+
+[printer:DeltiQ XL]
+inherits = *DeltiQ*
+printer_model = DQXL
+printer_variant = 0.4
+bed_shape = 124.315x13.0661,122.268x25.989,118.882x38.6271,114.193x50.8421,108.253x62.5,101.127x73.4732,92.8931x83.6413,83.6413x92.8931,73.4732x101.127,62.5x108.253,50.8421x114.193,38.6271x118.882,25.989x122.268,13.0661x124.315,3.54096e-014x125,-13.0661x124.315,-25.989x122.268,-38.6271x118.882,-50.8421x114.193,-62.5x108.253,-73.4732x101.127,-83.6413x92.8931,-92.8931x83.6413,-101.127x73.4732,-108.253x62.5,-114.193x50.8421,-118.882x38.6271,-122.268x25.989,-124.315x13.0661,-125x7.08192e-014,-124.315x-13.0661,-122.268x-25.989,-118.882x-38.6271,-114.193x-50.8421,-108.253x-62.5,-101.127x-73.4732,-92.8931x-83.6413,-83.6413x-92.8931,-73.4732x-101.127,-62.5x-108.253,-50.8421x-114.193,-38.6271x-118.882,-25.989x-122.268,-13.0661x-124.315,-2.29621e-014x-125,13.0661x-124.315,25.989x-122.268,38.6271x-118.882,50.8421x-114.193,62.5x-108.253,73.4732x-101.127,83.6413x-92.8931,92.8931x-83.6413,101.127x-73.4732,108.253x-62.5,114.193x-50.8421,118.882x-38.6271,122.268x-25.989,124.315x-13.0661,125x-1.41638e-013
+max_print_height = 500
+retract_length = 4.5
+retract_speed = 35
+
+[printer:*DeltiQ 2*]
+inherits = *DeltiQ*
+before_layer_gcode = ; BEFORE_LAYER_CHANGE\n;[layer_z]\nG92 E0\n
+end_gcode = ; END_GCODE\n\nM140 S0 ; Turn off bed\n\nG28 ; Home\n\nM104 S0 ; Turn off extruder\nM107 ; Turn off fan\n\nG90 ; Absolute positioning\nM220 S100 ; Feedmultiply back to 100percent\n\nM84 S5; Disable motors
+gcode_flavor = reprap
+layer_gcode = ; AFTER_LAYER_CHANGE\n;[layer_z]
+pause_print_gcode = M0
+start_gcode = ; START_GCODE\n\nM220 S100 ; Set feedmultiply back to 100percent\n\nT0 ; Select Titan extruder\n\nG90 ; Absolute positioning\nM83; Relative Extruder\n\nM190 S[first_layer_bed_temperature] ; Set and wait - bed temperature\nM104 S[first_layer_temperature]\n\nG28 ; Home all axes\nG32 ; Probe Z and calculate Z plane\n\nG29 ; Mesh bed probe\n\nG1009 ; Go ARC to purge end\n\nG92 E0 ; Zero extruder
+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_TRILAB\nPRINTER_FAMILY_DQ\nPRINTER_MODEL_DQ2
+
+[printer:DeltiQ 2]
+inherits = *DeltiQ 2*
+printer_model = DQ2
+printer_variant = 0.4
+max_print_height = 320
+
+[printer:DeltiQ 2 - 0.8 nozzle]
+inherits = DeltiQ 2
+printer_variant = 0.8
+max_layer_height = 0.4
+min_layer_height = 0.4
+nozzle_diameter = 0.8
+default_filament_profile = "DeltiQ - PLA - ExtraFill (Fillamentum) @0.8 nozzle"
+default_print_profile = DeltiQ 0.40mm Normal @0.8 nozzle
+
+[printer:DeltiQ 2 Plus]
+inherits = *DeltiQ 2*
+printer_model = DQ2P
+printer_variant = 0.4
+max_print_height = 500
+
+[printer:DeltiQ 2 Plus - 0.8 nozzle]
+inherits = DeltiQ 2 Plus
+printer_variant = 0.8
+max_layer_height = 0.4
+min_layer_height = 0.4
+nozzle_diameter = 0.8
+default_filament_profile = "DeltiQ - PLA - ExtraFill (Fillamentum) @0.8 nozzle"
+default_print_profile = DeltiQ 0.40mm Normal @0.8 nozzle
+
+[printer:*DeltiQ 2 FlexPrint*]
+inherits = *DeltiQ 2*
+start_gcode = ; START_GCODE\n\nM220 S100 ; Set feedmultiply back to 100percent\n\nT1 ; Select FlexPrint extruder\n\nG90 ; Absolute positioning\nM83; Relative Extruder\n\nM190 S[first_layer_bed_temperature] ; Set and wait - bed temperature\nM104 S[first_layer_temperature]\n\nG28 ; Home all axes\nG32 ; Probe Z and calculate Z plane\n\nG29 ; Mesh bed probe\n\nG1009 ; Go ARC to purge end\n\nG92 E0 ; Zero extruder
+default_print_profile = DeltiQ 0.20mm FLEX
+default_filament_profile = "DeltiQ FP2 - FLEX - Generic"
+retract_length = 0.7
+retract_speed = 25
+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_TRILAB\nPRINTER_FAMILY_DQ\nPRINTER_MODEL_DQ2+FP\nFLEXPRINT1
+
+[printer:DeltiQ 2 + FlexPrint]
+inherits = *DeltiQ 2 FlexPrint*
+printer_model = DQ2+FP
+printer_variant = 0.4
+max_print_height = 320
+
+[printer:DeltiQ 2 Plus + FlexPrint]
+inherits = *DeltiQ 2 FlexPrint*
+printer_model = DQ2P+FP
+printer_variant = 0.4
+max_print_height = 500
+
+[printer:*DeltiQ 2 FlexPrint 2*]
+inherits = *DeltiQ 2 FlexPrint*
+default_filament_profile = "DeltiQ FP2 - FLEX - Generic"
+retract_length = 0.8
+retract_speed = 25
+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_TRILAB\nPRINTER_FAMILY_DQ\nPRINTER_MODEL_DQ2+FP\nFLEXPRINT2
+
+[printer:DeltiQ 2 + FlexPrint 2]
+inherits = *DeltiQ 2 FlexPrint 2*
+printer_model = DQ2+FP2
+printer_variant = 0.4
+max_print_height = 320
+
+[printer:DeltiQ 2 Plus + FlexPrint 2]
+inherits = *DeltiQ 2 FlexPrint 2*
+printer_model = DQ2P+FP2
+printer_variant = 0.4
+max_print_height = 500
+
+
+[presets]
+print = DeltiQ 0.20mm Normal
+printer = DeltiQ 2
+filament = DeltiQ - PLA - Generic \ No newline at end of file
diff --git a/resources/profiles/TriLAB/DQ2+FP2_thumbnail.png b/resources/profiles/TriLAB/DQ2+FP2_thumbnail.png
new file mode 100644
index 000000000..a33919fc7
--- /dev/null
+++ b/resources/profiles/TriLAB/DQ2+FP2_thumbnail.png
Binary files differ
diff --git a/resources/profiles/TriLAB/DQ2+FP_thumbnail.png b/resources/profiles/TriLAB/DQ2+FP_thumbnail.png
new file mode 100644
index 000000000..a33919fc7
--- /dev/null
+++ b/resources/profiles/TriLAB/DQ2+FP_thumbnail.png
Binary files differ
diff --git a/resources/profiles/TriLAB/DQ2P+FP2_thumbnail.png b/resources/profiles/TriLAB/DQ2P+FP2_thumbnail.png
new file mode 100644
index 000000000..27853b29c
--- /dev/null
+++ b/resources/profiles/TriLAB/DQ2P+FP2_thumbnail.png
Binary files differ
diff --git a/resources/profiles/TriLAB/DQ2P+FP_thumbnail.png b/resources/profiles/TriLAB/DQ2P+FP_thumbnail.png
new file mode 100644
index 000000000..27853b29c
--- /dev/null
+++ b/resources/profiles/TriLAB/DQ2P+FP_thumbnail.png
Binary files differ
diff --git a/resources/profiles/TriLAB/DQ2P_thumbnail.png b/resources/profiles/TriLAB/DQ2P_thumbnail.png
new file mode 100644
index 000000000..27853b29c
--- /dev/null
+++ b/resources/profiles/TriLAB/DQ2P_thumbnail.png
Binary files differ
diff --git a/resources/profiles/TriLAB/DQ2_thumbnail.png b/resources/profiles/TriLAB/DQ2_thumbnail.png
new file mode 100644
index 000000000..a33919fc7
--- /dev/null
+++ b/resources/profiles/TriLAB/DQ2_thumbnail.png
Binary files differ
diff --git a/resources/profiles/TriLAB/DQL_thumbnail.png b/resources/profiles/TriLAB/DQL_thumbnail.png
new file mode 100644
index 000000000..44386db05
--- /dev/null
+++ b/resources/profiles/TriLAB/DQL_thumbnail.png
Binary files differ
diff --git a/resources/profiles/TriLAB/DQM_thumbnail.png b/resources/profiles/TriLAB/DQM_thumbnail.png
new file mode 100644
index 000000000..27210f9bb
--- /dev/null
+++ b/resources/profiles/TriLAB/DQM_thumbnail.png
Binary files differ
diff --git a/resources/profiles/TriLAB/DQXL_thumbnail.png b/resources/profiles/TriLAB/DQXL_thumbnail.png
new file mode 100644
index 000000000..4de802df7
--- /dev/null
+++ b/resources/profiles/TriLAB/DQXL_thumbnail.png
Binary files differ
diff --git a/resources/profiles/TriLAB/dq2_bed.stl b/resources/profiles/TriLAB/dq2_bed.stl
new file mode 100644
index 000000000..6b8f20caa
--- /dev/null
+++ b/resources/profiles/TriLAB/dq2_bed.stl
Binary files differ
diff --git a/resources/shaders/gouraud.fs b/resources/shaders/gouraud.fs
index 09003f407..40182a14b 100644
--- a/resources/shaders/gouraud.fs
+++ b/resources/shaders/gouraud.fs
@@ -1,6 +1,25 @@
#version 110
const vec3 ZERO = vec3(0.0, 0.0, 0.0);
+const vec3 GREEN = vec3(0.0, 0.7, 0.0);
+const vec3 YELLOW = vec3(0.5, 0.7, 0.0);
+const vec3 RED = vec3(0.7, 0.0, 0.0);
+const float EPSILON = 0.0001;
+
+struct SlopeDetection
+{
+ bool actived;
+ float normal_z;
+ mat3 volume_world_normal_matrix;
+};
+
+uniform vec4 uniform_color;
+uniform SlopeDetection slope;
+
+#ifdef ENABLE_ENVIRONMENT_MAP
+ uniform sampler2D environment_tex;
+ uniform bool use_environment_tex;
+#endif // ENABLE_ENVIRONMENT_MAP
varying vec3 clipping_planes_dots;
@@ -10,14 +29,25 @@ varying vec2 intensity;
varying vec3 delta_box_min;
varying vec3 delta_box_max;
-uniform vec4 uniform_color;
+varying float world_normal_z;
+varying vec3 eye_normal;
+vec3 slope_color()
+{
+ return (world_normal_z > slope.normal_z - EPSILON) ? GREEN : RED;
+}
void main()
{
if (any(lessThan(clipping_planes_dots, ZERO)))
discard;
+ vec3 color = slope.actived ? slope_color() : uniform_color.rgb;
// if the fragment is outside the print volume -> use darker color
- vec3 color = (any(lessThan(delta_box_min, ZERO)) || any(greaterThan(delta_box_max, ZERO))) ? mix(uniform_color.rgb, ZERO, 0.3333) : uniform_color.rgb;
- gl_FragColor = vec4(vec3(intensity.y, intensity.y, intensity.y) + color * intensity.x, uniform_color.a);
+ color = (any(lessThan(delta_box_min, ZERO)) || any(greaterThan(delta_box_max, ZERO))) ? mix(color, ZERO, 0.3333) : color;
+#ifdef ENABLE_ENVIRONMENT_MAP
+ if (use_environment_tex)
+ gl_FragColor = vec4(0.45 * texture2D(environment_tex, normalize(eye_normal).xy * 0.5 + 0.5).xyz + 0.8 * color * intensity.x, uniform_color.a);
+ else
+#endif
+ gl_FragColor = vec4(vec3(intensity.y) + color * intensity.x, uniform_color.a);
}
diff --git a/resources/shaders/gouraud.vs b/resources/shaders/gouraud.vs
index cc54c1c44..ed7e3f56b 100644
--- a/resources/shaders/gouraud.vs
+++ b/resources/shaders/gouraud.vs
@@ -20,13 +20,21 @@ const vec3 ZERO = vec3(0.0, 0.0, 0.0);
struct PrintBoxDetection
{
+ bool actived;
vec3 min;
vec3 max;
- bool volume_detection;
mat4 volume_world_matrix;
};
+struct SlopeDetection
+{
+ bool actived;
+ float normal_z;
+ mat3 volume_world_normal_matrix;
+};
+
uniform PrintBoxDetection print_box;
+uniform SlopeDetection slope;
// Clipping plane, x = min z, y = max z. Used by the FFF and SLA previews to clip with a top / bottom plane.
uniform vec2 z_range;
@@ -41,27 +49,28 @@ varying vec3 delta_box_max;
varying vec3 clipping_planes_dots;
+varying float world_normal_z;
+varying vec3 eye_normal;
+
void main()
{
// First transform the normal into camera space and normalize the result.
- vec3 normal = normalize(gl_NormalMatrix * gl_Normal);
+ eye_normal = normalize(gl_NormalMatrix * gl_Normal);
// Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex.
// Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range.
- float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0);
+ float NdotL = max(dot(eye_normal, LIGHT_TOP_DIR), 0.0);
intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE;
- intensity.y = 0.0;
-
- if (NdotL > 0.0)
- intensity.y += LIGHT_TOP_SPECULAR * pow(max(dot(normal, reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS);
+ vec3 position = (gl_ModelViewMatrix * gl_Vertex).xyz;
+ intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, eye_normal)), 0.0), LIGHT_TOP_SHININESS);
// Perform the same lighting calculation for the 2nd light source (no specular applied).
- NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0);
+ NdotL = max(dot(eye_normal, LIGHT_FRONT_DIR), 0.0);
intensity.x += NdotL * LIGHT_FRONT_DIFFUSE;
// compute deltas for out of print volume detection (world coordinates)
- if (print_box.volume_detection)
+ if (print_box.actived)
{
vec3 v = (print_box.volume_world_matrix * gl_Vertex).xyz;
delta_box_min = v - print_box.min;
@@ -73,6 +82,9 @@ void main()
delta_box_max = ZERO;
}
+ // z component of normal vector in world coordinate used for slope shading
+ world_normal_z = slope.actived ? (normalize(slope.volume_world_normal_matrix * gl_Normal)).z : 0.0;
+
gl_Position = ftransform();
// Point in homogenous coordinates.
vec4 world_pos = print_box.volume_world_matrix * gl_Vertex;
diff --git a/resources/shaders/gouraud_light.fs b/resources/shaders/gouraud_light.fs
new file mode 100644
index 000000000..1a58abc85
--- /dev/null
+++ b/resources/shaders/gouraud_light.fs
@@ -0,0 +1,11 @@
+#version 110
+
+uniform vec4 uniform_color;
+
+// x = tainted, y = specular;
+varying vec2 intensity;
+
+void main()
+{
+ gl_FragColor = vec4(vec3(intensity.y, intensity.y, intensity.y) + uniform_color.rgb * intensity.x, uniform_color.a);
+}
diff --git a/resources/shaders/gouraud_light.vs b/resources/shaders/gouraud_light.vs
new file mode 100644
index 000000000..d4f71938a
--- /dev/null
+++ b/resources/shaders/gouraud_light.vs
@@ -0,0 +1,38 @@
+#version 110
+
+#define INTENSITY_CORRECTION 0.6
+
+// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31)
+const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929);
+#define LIGHT_TOP_DIFFUSE (0.8 * INTENSITY_CORRECTION)
+#define LIGHT_TOP_SPECULAR (0.125 * INTENSITY_CORRECTION)
+#define LIGHT_TOP_SHININESS 20.0
+
+// normalized values for (1./1.43, 0.2/1.43, 1./1.43)
+const vec3 LIGHT_FRONT_DIR = vec3(0.6985074, 0.1397015, 0.6985074);
+#define LIGHT_FRONT_DIFFUSE (0.3 * INTENSITY_CORRECTION)
+
+#define INTENSITY_AMBIENT 0.3
+
+// x = tainted, y = specular;
+varying vec2 intensity;
+
+void main()
+{
+ // First transform the normal into camera space and normalize the result.
+ vec3 normal = normalize(gl_NormalMatrix * gl_Normal);
+
+ // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex.
+ // Since these two are normalized the cosine is the dot product. We also need to clamp the result to the [0,1] range.
+ float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0);
+
+ intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE;
+ vec3 position = (gl_ModelViewMatrix * gl_Vertex).xyz;
+ intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS);
+
+ // Perform the same lighting calculation for the 2nd light source (no specular applied).
+ NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0);
+ intensity.x += NdotL * LIGHT_FRONT_DIFFUSE;
+
+ gl_Position = ftransform();
+}
diff --git a/resources/shaders/options_110.fs b/resources/shaders/options_110.fs
new file mode 100644
index 000000000..ab656998d
--- /dev/null
+++ b/resources/shaders/options_110.fs
@@ -0,0 +1,8 @@
+#version 110
+
+uniform vec4 uniform_color;
+
+void main()
+{
+ gl_FragColor = uniform_color;
+}
diff --git a/resources/shaders/options_110.vs b/resources/shaders/options_110.vs
new file mode 100644
index 000000000..5f2ab2350
--- /dev/null
+++ b/resources/shaders/options_110.vs
@@ -0,0 +1,22 @@
+#version 110
+
+uniform bool use_fixed_screen_size;
+uniform float zoom;
+uniform float point_size;
+uniform float near_plane_height;
+
+float fixed_screen_size()
+{
+ return point_size;
+}
+
+float fixed_world_size()
+{
+ return (gl_Position.w == 1.0) ? zoom * near_plane_height * point_size : near_plane_height * point_size / gl_Position.w;
+}
+
+void main()
+{
+ gl_Position = ftransform();
+ gl_PointSize = use_fixed_screen_size ? fixed_screen_size() : fixed_world_size();
+}
diff --git a/resources/shaders/options_120.fs b/resources/shaders/options_120.fs
new file mode 100644
index 000000000..e9b61304f
--- /dev/null
+++ b/resources/shaders/options_120.fs
@@ -0,0 +1,22 @@
+// version 120 is needed for gl_PointCoord
+#version 120
+
+uniform vec4 uniform_color;
+uniform float percent_outline_radius;
+uniform float percent_center_radius;
+
+vec4 calc_color(float radius, vec4 color)
+{
+ return ((radius < percent_center_radius) || (radius > 1.0 - percent_outline_radius)) ?
+ vec4(0.5 * color.rgb, color.a) : color;
+}
+
+void main()
+{
+ vec2 pos = (gl_PointCoord - 0.5) * 2.0;
+ float radius = length(pos);
+ if (radius > 1.0)
+ discard;
+
+ gl_FragColor = calc_color(radius, uniform_color);
+}
diff --git a/resources/shaders/options_120.vs b/resources/shaders/options_120.vs
new file mode 100644
index 000000000..edb503fb2
--- /dev/null
+++ b/resources/shaders/options_120.vs
@@ -0,0 +1,22 @@
+#version 120
+
+uniform bool use_fixed_screen_size;
+uniform float zoom;
+uniform float point_size;
+uniform float near_plane_height;
+
+float fixed_screen_size()
+{
+ return point_size;
+}
+
+float fixed_world_size()
+{
+ return (gl_Position.w == 1.0) ? zoom * near_plane_height * point_size : near_plane_height * point_size / gl_Position.w;
+}
+
+void main()
+{
+ gl_Position = ftransform();
+ gl_PointSize = use_fixed_screen_size ? fixed_screen_size() : fixed_world_size();
+}
diff --git a/resources/shaders/toolpaths_lines.fs b/resources/shaders/toolpaths_lines.fs
new file mode 100644
index 000000000..31151cdc1
--- /dev/null
+++ b/resources/shaders/toolpaths_lines.fs
@@ -0,0 +1,28 @@
+#version 110
+
+// normalized values for (-0.6/1.31, 0.6/1.31, 1./1.31)
+const vec3 LIGHT_TOP_DIR = vec3(-0.4574957, 0.4574957, 0.7624929);
+const vec3 LIGHT_FRONT_DIR = vec3(0.0, 0.0, 1.0);
+
+// x = ambient, y = top diffuse, z = front diffuse, w = global
+uniform vec4 light_intensity;
+uniform vec4 uniform_color;
+
+varying vec3 eye_normal;
+
+void main()
+{
+ vec3 normal = normalize(eye_normal);
+
+ // Compute the cos of the angle between the normal and lights direction. The light is directional so the direction is constant for every vertex.
+ // Since these two are normalized the cosine is the dot product. Take the abs value to light the lines no matter in which direction the normal points.
+ float NdotL = abs(dot(normal, LIGHT_TOP_DIR));
+
+ float intensity = light_intensity.x + NdotL * light_intensity.y;
+
+ // Perform the same lighting calculation for the 2nd light source.
+ NdotL = abs(dot(normal, LIGHT_FRONT_DIR));
+ intensity += NdotL * light_intensity.z;
+
+ gl_FragColor = vec4(uniform_color.rgb * light_intensity.w * intensity, uniform_color.a);
+}
diff --git a/resources/shaders/toolpaths_lines.vs b/resources/shaders/toolpaths_lines.vs
new file mode 100644
index 000000000..85d5c641f
--- /dev/null
+++ b/resources/shaders/toolpaths_lines.vs
@@ -0,0 +1,19 @@
+#version 110
+
+varying vec3 eye_normal;
+
+vec3 world_normal()
+{
+ // the world normal is always parallel to the world XY plane
+ // the x component is stored into gl_Vertex.w
+ float x = gl_Vertex.w;
+ float y = sqrt(1.0 - x * x);
+ return vec3(x, y, 0.0);
+}
+
+void main()
+{
+ vec4 world_position = vec4(gl_Vertex.xyz, 1.0);
+ gl_Position = gl_ModelViewProjectionMatrix * world_position;
+ eye_normal = gl_NormalMatrix * world_normal();
+}
diff --git a/resources/shaders/variable_layer_height.vs b/resources/shaders/variable_layer_height.vs
index 4f98dfa56..0e966b081 100644
--- a/resources/shaders/variable_layer_height.vs
+++ b/resources/shaders/variable_layer_height.vs
@@ -32,10 +32,8 @@ void main()
float NdotL = max(dot(normal, LIGHT_TOP_DIR), 0.0);
intensity.x = INTENSITY_AMBIENT + NdotL * LIGHT_TOP_DIFFUSE;
- intensity.y = 0.0;
-
- if (NdotL > 0.0)
- intensity.y += LIGHT_TOP_SPECULAR * pow(max(dot(normal, reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS);
+ vec3 position = (gl_ModelViewMatrix * gl_Vertex).xyz;
+ intensity.y = LIGHT_TOP_SPECULAR * pow(max(dot(-normalize(position), reflect(-LIGHT_TOP_DIR, normal)), 0.0), LIGHT_TOP_SHININESS);
// Perform the same lighting calculation for the 2nd light source (no specular)
NdotL = max(dot(normal, LIGHT_FRONT_DIR), 0.0);
diff --git a/sandboxes/CMakeLists.txt b/sandboxes/CMakeLists.txt
index a2bd13bb0..23c15f089 100644
--- a/sandboxes/CMakeLists.txt
+++ b/sandboxes/CMakeLists.txt
@@ -2,3 +2,4 @@
#add_subdirectory(openvdb)
add_subdirectory(meshboolean)
add_subdirectory(opencsg)
+#add_subdirectory(aabb-evaluation) \ No newline at end of file
diff --git a/sandboxes/aabb-evaluation/CMakeLists.txt b/sandboxes/aabb-evaluation/CMakeLists.txt
new file mode 100644
index 000000000..20011e345
--- /dev/null
+++ b/sandboxes/aabb-evaluation/CMakeLists.txt
@@ -0,0 +1,2 @@
+add_executable(aabb-evaluation aabb-evaluation.cpp)
+target_link_libraries(aabb-evaluation libslic3r ${Boost_LIBRARIES} ${TBB_LIBRARIES} ${Boost_LIBRARIES} ${CMAKE_DL_LIBS})
diff --git a/sandboxes/aabb-evaluation/aabb-evaluation.cpp b/sandboxes/aabb-evaluation/aabb-evaluation.cpp
new file mode 100644
index 000000000..9ec7451e5
--- /dev/null
+++ b/sandboxes/aabb-evaluation/aabb-evaluation.cpp
@@ -0,0 +1,224 @@
+#include <iostream>
+#include <fstream>
+#include <string>
+
+#include <libslic3r/TriangleMesh.hpp>
+#include <libslic3r/AABBTreeIndirect.hpp>
+#include <libslic3r/SLA/EigenMesh3D.hpp>
+
+#include <Shiny/Shiny.h>
+
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable: 4244)
+#pragma warning(disable: 4267)
+#endif
+#include <igl/ray_mesh_intersect.h>
+#include <igl/point_mesh_squared_distance.h>
+#include <igl/remove_duplicate_vertices.h>
+#include <igl/signed_distance.h>
+#include <igl/random_dir.h>
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+const std::string USAGE_STR = {
+ "Usage: aabb-evaluation stlfilename.stl"
+};
+
+using namespace Slic3r;
+
+void profile(const TriangleMesh &mesh)
+{
+ Eigen::MatrixXd V;
+ Eigen::MatrixXi F;
+ Eigen::MatrixXd vertex_normals;
+ sla::to_eigen_mesh(mesh, V, F);
+ igl::per_vertex_normals(V, F, vertex_normals);
+
+ static constexpr int num_samples = 100;
+ const int num_vertices = std::min(10000, int(mesh.its.vertices.size()));
+ const Eigen::MatrixXd dirs = igl::random_dir_stratified(num_samples).cast<double>();
+
+ Eigen::MatrixXd occlusion_output0;
+ {
+ AABBTreeIndirect::Tree3f tree;
+ {
+ PROFILE_BLOCK(AABBIndirect_Init);
+ tree = AABBTreeIndirect::build_aabb_tree_over_indexed_triangle_set(mesh.its.vertices, mesh.its.indices);
+ }
+ {
+ PROFILE_BLOCK(EigenMesh3D_AABBIndirectF_AmbientOcclusion);
+ occlusion_output0.resize(num_vertices, 1);
+ for (int ivertex = 0; ivertex < num_vertices; ++ ivertex) {
+ const Eigen::Vector3d origin = mesh.its.vertices[ivertex].template cast<double>();
+ const Eigen::Vector3d normal = vertex_normals.row(ivertex).template cast<double>();
+ int num_hits = 0;
+ for (int s = 0; s < num_samples; s++) {
+ Eigen::Vector3d d = dirs.row(s);
+ if(d.dot(normal) < 0) {
+ // reverse ray
+ d *= -1;
+ }
+ igl::Hit hit;
+ if (AABBTreeIndirect::intersect_ray_first_hit(mesh.its.vertices, mesh.its.indices, tree, (origin + 1e-4 * d).eval(), d, hit))
+ ++ num_hits;
+ }
+ occlusion_output0(ivertex) = (double)num_hits/(double)num_samples;
+ }
+ }
+
+ {
+ PROFILE_BLOCK(EigenMesh3D_AABBIndirectFF_AmbientOcclusion);
+ occlusion_output0.resize(num_vertices, 1);
+ for (int ivertex = 0; ivertex < num_vertices; ++ ivertex) {
+ const Eigen::Vector3d origin = mesh.its.vertices[ivertex].template cast<double>();
+ const Eigen::Vector3d normal = vertex_normals.row(ivertex).template cast<double>();
+ int num_hits = 0;
+ for (int s = 0; s < num_samples; s++) {
+ Eigen::Vector3d d = dirs.row(s);
+ if(d.dot(normal) < 0) {
+ // reverse ray
+ d *= -1;
+ }
+ igl::Hit hit;
+ if (AABBTreeIndirect::intersect_ray_first_hit(mesh.its.vertices, mesh.its.indices, tree,
+ Eigen::Vector3f((origin + 1e-4 * d).template cast<float>()),
+ Eigen::Vector3f(d.template cast<float>()), hit))
+ ++ num_hits;
+ }
+ occlusion_output0(ivertex) = (double)num_hits/(double)num_samples;
+ }
+ }
+ }
+
+ Eigen::MatrixXd occlusion_output1;
+ {
+ std::vector<Vec3d> vertices;
+ std::vector<Vec3i> triangles;
+ for (int i = 0; i < V.rows(); ++ i)
+ vertices.emplace_back(V.row(i).transpose());
+ for (int i = 0; i < F.rows(); ++ i)
+ triangles.emplace_back(F.row(i).transpose());
+ AABBTreeIndirect::Tree3d tree;
+ {
+ PROFILE_BLOCK(AABBIndirectD_Init);
+ tree = AABBTreeIndirect::build_aabb_tree_over_indexed_triangle_set(vertices, triangles);
+ }
+
+ {
+ PROFILE_BLOCK(EigenMesh3D_AABBIndirectD_AmbientOcclusion);
+ occlusion_output1.resize(num_vertices, 1);
+ for (int ivertex = 0; ivertex < num_vertices; ++ ivertex) {
+ const Eigen::Vector3d origin = V.row(ivertex).template cast<double>();
+ const Eigen::Vector3d normal = vertex_normals.row(ivertex).template cast<double>();
+ int num_hits = 0;
+ for (int s = 0; s < num_samples; s++) {
+ Eigen::Vector3d d = dirs.row(s);
+ if(d.dot(normal) < 0) {
+ // reverse ray
+ d *= -1;
+ }
+ igl::Hit hit;
+ if (AABBTreeIndirect::intersect_ray_first_hit(vertices, triangles, tree, Eigen::Vector3d(origin + 1e-4 * d), d, hit))
+ ++ num_hits;
+ }
+ occlusion_output1(ivertex) = (double)num_hits/(double)num_samples;
+ }
+ }
+ }
+
+ // Build the AABB accelaration tree
+
+ Eigen::MatrixXd occlusion_output2;
+ {
+ igl::AABB<Eigen::MatrixXd, 3> AABB;
+ {
+ PROFILE_BLOCK(EigenMesh3D_AABB_Init);
+ AABB.init(V, F);
+ }
+ {
+ PROFILE_BLOCK(EigenMesh3D_AABB_AmbientOcclusion);
+ occlusion_output2.resize(num_vertices, 1);
+ for (int ivertex = 0; ivertex < num_vertices; ++ ivertex) {
+ const Eigen::Vector3d origin = V.row(ivertex).template cast<double>();
+ const Eigen::Vector3d normal = vertex_normals.row(ivertex).template cast<double>();
+ int num_hits = 0;
+ for (int s = 0; s < num_samples; s++) {
+ Eigen::Vector3d d = dirs.row(s);
+ if(d.dot(normal) < 0) {
+ // reverse ray
+ d *= -1;
+ }
+ igl::Hit hit;
+ if (AABB.intersect_ray(V, F, origin + 1e-4 * d, d, hit))
+ ++ num_hits;
+ }
+ occlusion_output2(ivertex) = (double)num_hits/(double)num_samples;
+ }
+ }
+ }
+
+ Eigen::MatrixXd occlusion_output3;
+ {
+ typedef Eigen::Map<const Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor | Eigen::DontAlign>> MapMatrixXfUnaligned;
+ typedef Eigen::Map<const Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor | Eigen::DontAlign>> MapMatrixXiUnaligned;
+ igl::AABB<MapMatrixXfUnaligned, 3> AABB;
+ auto vertices = MapMatrixXfUnaligned(mesh.its.vertices.front().data(), mesh.its.vertices.size(), 3);
+ auto faces = MapMatrixXiUnaligned(mesh.its.indices.front().data(), mesh.its.indices.size(), 3);
+ {
+ PROFILE_BLOCK(EigenMesh3D_AABBf_Init);
+ AABB.init(
+ vertices,
+ faces);
+ }
+
+ {
+ PROFILE_BLOCK(EigenMesh3D_AABBf_AmbientOcclusion);
+ occlusion_output3.resize(num_vertices, 1);
+ for (int ivertex = 0; ivertex < num_vertices; ++ ivertex) {
+ const Eigen::Vector3d origin = mesh.its.vertices[ivertex].template cast<double>();
+ const Eigen::Vector3d normal = vertex_normals.row(ivertex).template cast<double>();
+ int num_hits = 0;
+ for (int s = 0; s < num_samples; s++) {
+ Eigen::Vector3d d = dirs.row(s);
+ if(d.dot(normal) < 0) {
+ // reverse ray
+ d *= -1;
+ }
+ igl::Hit hit;
+ if (AABB.intersect_ray(vertices, faces, (origin + 1e-4 * d).eval().template cast<float>(), d.template cast<float>(), hit))
+ ++ num_hits;
+ }
+ occlusion_output3(ivertex) = (double)num_hits/(double)num_samples;
+ }
+ }
+ }
+
+ PROFILE_UPDATE();
+ PROFILE_OUTPUT(nullptr);
+}
+
+int main(const int argc, const char *argv[])
+{
+ if(argc < 2) {
+ std::cout << USAGE_STR << std::endl;
+ return EXIT_SUCCESS;
+ }
+
+ TriangleMesh mesh;
+ if (! mesh.ReadSTLFile(argv[1])) {
+ std::cerr << "Error loading " << argv[1] << std::endl;
+ return -1;
+ }
+
+ mesh.repair();
+ if (mesh.facets_count() == 0) {
+ std::cerr << "Error loading " << argv[1] << " . It is empty." << std::endl;
+ return -1;
+ }
+
+ profile(mesh);
+
+ return EXIT_SUCCESS;
+}
diff --git a/sandboxes/opencsg/CMakeLists.txt b/sandboxes/opencsg/CMakeLists.txt
index ec1f4cae9..ace8f4d53 100644
--- a/sandboxes/opencsg/CMakeLists.txt
+++ b/sandboxes/opencsg/CMakeLists.txt
@@ -6,6 +6,7 @@ add_executable(opencsg_example WIN32
main.cpp
Engine.hpp Engine.cpp
ShaderCSGDisplay.hpp ShaderCSGDisplay.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/../../src/slic3r/GUI/Jobs/Job.cpp
${CMAKE_CURRENT_SOURCE_DIR}/../../src/slic3r/GUI/ProgressStatusBar.cpp
${CMAKE_CURRENT_SOURCE_DIR}/../../src/slic3r/GUI/I18N.hpp
${CMAKE_CURRENT_SOURCE_DIR}/../../src/slic3r/GUI/I18N.cpp)
diff --git a/sandboxes/opencsg/main.cpp b/sandboxes/opencsg/main.cpp
index adf9cc457..f5fb12493 100644
--- a/sandboxes/opencsg/main.cpp
+++ b/sandboxes/opencsg/main.cpp
@@ -26,7 +26,7 @@
#include "libslic3r/Format/3mf.hpp"
#include "libslic3r/SLAPrint.hpp"
-#include "slic3r/GUI/Job.hpp"
+#include "slic3r/GUI/Jobs/Job.hpp"
#include "slic3r/GUI/ProgressStatusBar.hpp"
using namespace Slic3r::GL;
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index b0eab9bcc..acd8d465c 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.8)
+cmake_minimum_required(VERSION 3.13)
project(PrusaSlicer-native)
add_subdirectory(build-utils)
@@ -59,6 +59,29 @@ if (SLIC3R_GUI)
include(${wxWidgets_USE_FILE})
+ string(REGEX MATCH "wxpng" WX_PNG_BUILTIN ${wxWidgets_LIBRARIES})
+ if (PNG_FOUND AND NOT WX_PNG_BUILTIN)
+ list(FILTER wxWidgets_LIBRARIES EXCLUDE REGEX png)
+ list(APPEND wxWidgets_LIBRARIES ${PNG_LIBRARIES})
+ endif ()
+
+ string(REGEX MATCH "wxexpat" WX_EXPAT_BUILTIN ${wxWidgets_LIBRARIES})
+ if (EXPAT_FOUND AND NOT WX_EXPAT_BUILTIN)
+ list(FILTER wxWidgets_LIBRARIES EXCLUDE REGEX expat)
+ list(APPEND wxWidgets_LIBRARIES ${EXPAT_LIBRARIES})
+ endif ()
+
+ # This is an issue in the new wxWidgets cmake build, doesn't deal with librt
+ find_library(LIBRT rt)
+ if(LIBRT)
+ list(APPEND wxWidgets_LIBRARIES ${LIBRT})
+ endif()
+
+ # This fixes a OpenGL linking issue on OSX. wxWidgets cmake build includes
+ # wrong libs for opengl in the link line and it does not link to it by himself.
+ # libslic3r_gui will link to opengl anyway, so lets override wx
+ list(FILTER wxWidgets_LIBRARIES EXCLUDE REGEX OpenGL)
+
# list(REMOVE_ITEM wxWidgets_LIBRARIES oleacc)
message(STATUS "wx libs: ${wxWidgets_LIBRARIES}")
@@ -69,6 +92,7 @@ endif()
# Create a slic3r executable
# Process mainfests for various platforms.
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/platform/msw/PrusaSlicer.rc.in ${CMAKE_CURRENT_BINARY_DIR}/PrusaSlicer.rc @ONLY)
+configure_file(${CMAKE_CURRENT_SOURCE_DIR}/platform/msw/PrusaSlicer-gcodeviewer.rc.in ${CMAKE_CURRENT_BINARY_DIR}/PrusaSlicer-gcodeviewer.rc @ONLY)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/platform/msw/PrusaSlicer.manifest.in ${CMAKE_CURRENT_BINARY_DIR}/PrusaSlicer.manifest @ONLY)
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/platform/osx/Info.plist.in ${CMAKE_CURRENT_BINARY_DIR}/Info.plist @ONLY)
if (WIN32)
@@ -82,9 +106,9 @@ if (MINGW)
set_target_properties(PrusaSlicer PROPERTIES PREFIX "")
endif (MINGW)
-if (NOT WIN32)
- # Binary name on unix like systems (OSX, Linux)
- set_target_properties(PrusaSlicer PROPERTIES OUTPUT_NAME "prusa-slicer")
+if (NOT WIN32 AND NOT APPLE)
+ # Binary name on unix like systems (Linux, Unix)
+ set_target_properties(PrusaSlicer PROPERTIES OUTPUT_NAME "prusa-slicer")
endif ()
target_link_libraries(PrusaSlicer libslic3r cereal)
@@ -138,12 +162,22 @@ if (WIN32)
add_executable(PrusaSlicer_app_console PrusaSlicer_app_msvc.cpp ${CMAKE_CURRENT_BINARY_DIR}/PrusaSlicer.rc)
# Generate debug symbols even in release mode.
if (MSVC)
- target_link_options(PrusaSlicer_app_console PUBLIC "$<$<CONFIG:RELEASE>:/DEBUG>")
+ target_link_options(PrusaSlicer_app_console PUBLIC "$<$<CONFIG:RELEASE>:/DEBUG>")
endif ()
target_compile_definitions(PrusaSlicer_app_console PRIVATE -DSLIC3R_WRAPPER_CONSOLE)
add_dependencies(PrusaSlicer_app_console PrusaSlicer)
set_target_properties(PrusaSlicer_app_console PROPERTIES OUTPUT_NAME "prusa-slicer-console")
target_link_libraries(PrusaSlicer_app_console PRIVATE boost_headeronly)
+
+ add_executable(PrusaSlicer_app_gcodeviewer WIN32 PrusaSlicer_app_msvc.cpp ${CMAKE_CURRENT_BINARY_DIR}/PrusaSlicer-gcodeviewer.rc)
+ # Generate debug symbols even in release mode.
+ if (MSVC)
+ target_link_options(PrusaSlicer_app_gcodeviewer PUBLIC "$<$<CONFIG:RELEASE>:/DEBUG>")
+ endif ()
+ target_compile_definitions(PrusaSlicer_app_gcodeviewer PRIVATE -DSLIC3R_WRAPPER_NOCONSOLE -DSLIC3R_WRAPPER_GCODEVIEWER)
+ add_dependencies(PrusaSlicer_app_gcodeviewer PrusaSlicer)
+ set_target_properties(PrusaSlicer_app_gcodeviewer PROPERTIES OUTPUT_NAME "prusa-gcodeviewer")
+ target_link_libraries(PrusaSlicer_app_gcodeviewer PRIVATE boost_headeronly)
endif ()
# Link the resources dir to where Slic3r GUI expects it
@@ -170,25 +204,39 @@ if (WIN32)
VERBATIM
)
endif ()
-
+
# This has to be a separate target due to the windows command line lenght limits
add_custom_target(PrusaSlicerDllsCopy ALL DEPENDS PrusaSlicer)
prusaslicer_copy_dlls(PrusaSlicerDllsCopy)
-
-elseif (XCODE)
- # Because of Debug/Release/etc. configurations (similar to MSVC) the slic3r binary is located in an extra level
- add_custom_command(TARGET PrusaSlicer POST_BUILD
- COMMAND ln -sf "${SLIC3R_RESOURCES_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/resources"
- COMMENT "Symlinking the resources directory into the build tree"
- VERBATIM
- )
+
else ()
+ if (APPLE)
+ # On OSX, the name of the binary matches the name of the Application.
+ add_custom_command(TARGET PrusaSlicer POST_BUILD
+ COMMAND ln -sf PrusaSlicer prusa-slicer
+ COMMAND ln -sf PrusaSlicer prusa-gcodeviewer
+ COMMAND ln -sf PrusaSlicer PrusaGCodeViewer
+ WORKING_DIRECTORY "$<TARGET_FILE_DIR:PrusaSlicer>"
+ COMMENT "Symlinking the G-code viewer to PrusaSlicer, symlinking to prusa-slicer and prusa-gcodeviewer"
+ VERBATIM)
+ else ()
+ add_custom_command(TARGET PrusaSlicer POST_BUILD
+ COMMAND ln -sf prusa-slicer prusa-gcodeviewer
+ WORKING_DIRECTORY "$<TARGET_FILE_DIR:PrusaSlicer>"
+ COMMENT "Symlinking the G-code viewer to PrusaSlicer"
+ VERBATIM)
+ endif ()
+ if (XCODE)
+ # Because of Debug/Release/etc. configurations (similar to MSVC) the slic3r binary is located in an extra level
+ set(BIN_RESOURCES_DIR "${CMAKE_CURRENT_BINARY_DIR}/resources")
+ else ()
+ set(BIN_RESOURCES_DIR "${CMAKE_CURRENT_BINARY_DIR}/../resources")
+ endif ()
add_custom_command(TARGET PrusaSlicer POST_BUILD
- COMMAND ln -sf "${SLIC3R_RESOURCES_DIR}" "${CMAKE_CURRENT_BINARY_DIR}/../resources"
+ COMMAND ln -sfn "${SLIC3R_RESOURCES_DIR}" "${BIN_RESOURCES_DIR}"
COMMENT "Symlinking the resources directory into the build tree"
- VERBATIM
- )
-endif()
+ VERBATIM)
+endif ()
# Slic3r binary install target
if (WIN32)
@@ -199,4 +247,7 @@ if (WIN32)
endif ()
else ()
install(TARGETS PrusaSlicer RUNTIME DESTINATION "${CMAKE_INSTALL_BINDIR}")
+
+ # Install the symlink for gcodeviewer
+ install(CODE "execute_process(COMMAND ${CMAKE_COMMAND} -E create_symlink prusa-slicer prusa-gcodeviewer WORKING_DIRECTORY \$ENV{DESTDIR}/${CMAKE_INSTALL_PREFIX}/${CMAKE_INSTALL_BINDIR})")
endif ()
diff --git a/src/PrusaSlicer.cpp b/src/PrusaSlicer.cpp
index 048aea886..60f3a1321 100644
--- a/src/PrusaSlicer.cpp
+++ b/src/PrusaSlicer.cpp
@@ -22,6 +22,7 @@
#include <cstring>
#include <iostream>
#include <math.h>
+#include <boost/algorithm/string/predicate.hpp>
#include <boost/filesystem.hpp>
#include <boost/nowide/args.hpp>
#include <boost/nowide/cenv.hpp>
@@ -33,7 +34,9 @@
#include "libslic3r/libslic3r.h"
#include "libslic3r/Config.hpp"
#include "libslic3r/Geometry.hpp"
+#include "libslic3r/GCode/PostProcessor.hpp"
#include "libslic3r/Model.hpp"
+#include "libslic3r/ModelArrange.hpp"
#include "libslic3r/Print.hpp"
#include "libslic3r/SLAPrint.hpp"
#include "libslic3r/TriangleMesh.hpp"
@@ -41,26 +44,30 @@
#include "libslic3r/Format/3mf.hpp"
#include "libslic3r/Format/STL.hpp"
#include "libslic3r/Format/OBJ.hpp"
+#include "libslic3r/Format/SL1.hpp"
#include "libslic3r/Utils.hpp"
+#include "libslic3r/Thread.hpp"
#include "PrusaSlicer.hpp"
#ifdef SLIC3R_GUI
- #include "slic3r/GUI/GUI.hpp"
- #include "slic3r/GUI/GUI_App.hpp"
- #include "slic3r/GUI/3DScene.hpp"
+ #include "slic3r/GUI/GUI_Init.hpp"
#endif /* SLIC3R_GUI */
using namespace Slic3r;
-PrinterTechnology get_printer_technology(const DynamicConfig &config)
-{
- const ConfigOptionEnum<PrinterTechnology> *opt = config.option<ConfigOptionEnum<PrinterTechnology>>("printer_technology");
- return (opt == nullptr) ? ptUnknown : opt->value;
-}
-
int CLI::run(int argc, char **argv)
{
+ // Mark the main thread for the debugger and for runtime checks.
+ set_current_thread_name("slic3r_main");
+
+#ifdef __WXGTK__
+ // On Linux, wxGTK has no support for Wayland, and the app crashes on
+ // startup if gtk3 is used. This env var has to be set explicitly to
+ // instruct the window manager to fall back to X server mode.
+ ::setenv("GDK_BACKEND", "x11", /* replace */ true);
+#endif
+
// Switch boost::filesystem to utf8.
try {
boost::nowide::nowide_filesystem();
@@ -85,14 +92,23 @@ int CLI::run(int argc, char **argv)
return 1;
m_extra_config.apply(m_config, true);
- m_extra_config.normalize();
+ m_extra_config.normalize_fdm();
+
+ PrinterTechnology printer_technology = Slic3r::printer_technology(m_config);
bool start_gui = m_actions.empty() &&
// cutting transformations are setting an "export" action.
std::find(m_transforms.begin(), m_transforms.end(), "cut") == m_transforms.end() &&
std::find(m_transforms.begin(), m_transforms.end(), "cut_x") == m_transforms.end() &&
std::find(m_transforms.begin(), m_transforms.end(), "cut_y") == m_transforms.end();
- PrinterTechnology printer_technology = get_printer_technology(m_extra_config);
+ bool start_as_gcodeviewer =
+#ifdef _WIN32
+ false;
+#else
+ // On Unix systems, the prusa-slicer binary may be symlinked to give the application a different meaning.
+ boost::algorithm::iends_with(boost::filesystem::path(argv[0]).filename().string(), "gcodeviewer");
+#endif // _WIN32
+
const std::vector<std::string> &load_configs = m_config.option<ConfigOptionStrings>("load", true)->values;
// load config files supplied via --load
@@ -112,8 +128,8 @@ int CLI::run(int argc, char **argv)
boost::nowide::cerr << "Error while reading config file: " << ex.what() << std::endl;
return 1;
}
- config.normalize();
- PrinterTechnology other_printer_technology = get_printer_technology(config);
+ config.normalize_fdm();
+ PrinterTechnology other_printer_technology = Slic3r::printer_technology(config);
if (printer_technology == ptUnknown) {
printer_technology = other_printer_technology;
} else if (printer_technology != other_printer_technology && other_printer_technology != ptUnknown) {
@@ -123,42 +139,62 @@ int CLI::run(int argc, char **argv)
m_print_config.apply(config);
}
+ // are we starting as gcodeviewer ?
+ for (auto it = m_actions.begin(); it != m_actions.end(); ++it) {
+ if (*it == "gcodeviewer") {
+ start_gui = true;
+ start_as_gcodeviewer = true;
+ m_actions.erase(it);
+ break;
+ }
+ }
+
// Read input file(s) if any.
- for (const std::string &file : m_input_files) {
- if (! boost::filesystem::exists(file)) {
- boost::nowide::cerr << "No such file: " << file << std::endl;
- exit(1);
+ for (const std::string& file : m_input_files)
+ if (is_gcode_file(file) && boost::filesystem::exists(file)) {
+ start_as_gcodeviewer = true;
+ break;
}
- Model model;
- try {
- // When loading an AMF or 3MF, config is imported as well, including the printer technology.
- model = Model::read_from_file(file, &m_print_config, true);
- PrinterTechnology other_printer_technology = get_printer_technology(m_print_config);
- if (printer_technology == ptUnknown) {
- printer_technology = other_printer_technology;
- } else if (printer_technology != other_printer_technology && other_printer_technology != ptUnknown) {
- boost::nowide::cerr << "Mixing configurations for FFF and SLA technologies" << std::endl;
+ if (!start_as_gcodeviewer) {
+ for (const std::string& file : m_input_files) {
+ if (!boost::filesystem::exists(file)) {
+ boost::nowide::cerr << "No such file: " << file << std::endl;
+ exit(1);
+ }
+ Model model;
+ try {
+ // When loading an AMF or 3MF, config is imported as well, including the printer technology.
+ DynamicPrintConfig config;
+ model = Model::read_from_file(file, &config, true);
+ PrinterTechnology other_printer_technology = Slic3r::printer_technology(config);
+ if (printer_technology == ptUnknown) {
+ printer_technology = other_printer_technology;
+ }
+ else if (printer_technology != other_printer_technology && other_printer_technology != ptUnknown) {
+ boost::nowide::cerr << "Mixing configurations for FFF and SLA technologies" << std::endl;
+ return 1;
+ }
+ // config is applied to m_print_config before the current m_config values.
+ config += std::move(m_print_config);
+ m_print_config = std::move(config);
+ }
+ catch (std::exception& e) {
+ boost::nowide::cerr << file << ": " << e.what() << std::endl;
return 1;
}
- } catch (std::exception &e) {
- boost::nowide::cerr << file << ": " << e.what() << std::endl;
- return 1;
- }
- if (model.objects.empty()) {
- boost::nowide::cerr << "Error: file is empty: " << file << std::endl;
- continue;
+ if (model.objects.empty()) {
+ boost::nowide::cerr << "Error: file is empty: " << file << std::endl;
+ continue;
+ }
+ m_models.push_back(model);
}
- m_models.push_back(model);
}
// Apply command line options to a more specific DynamicPrintConfig which provides normalize()
// (command line options override --load files)
m_print_config.apply(m_extra_config, true);
// Normalizing after importing the 3MFs / AMFs
- m_print_config.normalize();
-
- if (printer_technology == ptUnknown)
- printer_technology = std::find(m_actions.begin(), m_actions.end(), "export_sla") == m_actions.end() ? ptFFF : ptSLA;
+ m_print_config.normalize_fdm();
// Initialize full print configs for both the FFF and SLA technologies.
FullPrintConfig fff_print_config;
@@ -170,6 +206,7 @@ int CLI::run(int argc, char **argv)
m_print_config.apply(fff_print_config, true);
} else if (printer_technology == ptSLA) {
// The default value has to be different from the one in fff mode.
+ sla_print_config.printer_technology.value = ptSLA;
sla_print_config.output_filename_format.value = "[input_filename_base].sl1";
// The default bed shape should reflect the default display parameters
@@ -182,8 +219,18 @@ int CLI::run(int argc, char **argv)
m_print_config.apply(sla_print_config, true);
}
+ std::string validity = m_print_config.validate();
+ if (!validity.empty()) {
+ boost::nowide::cerr << "error: " << validity << std::endl;
+ return 1;
+ }
+
// Loop through transform options.
bool user_center_specified = false;
+ Points bed = get_bed_shape(m_print_config);
+ ArrangeParams arrange_cfg;
+ arrange_cfg.min_obj_distance = scaled(min_object_distance(m_print_config));
+
for (auto const &opt_key : m_transforms) {
if (opt_key == "merge") {
Model m;
@@ -193,29 +240,33 @@ int CLI::run(int argc, char **argv)
// Rearrange instances unless --dont-arrange is supplied
if (! m_config.opt_bool("dont_arrange")) {
m.add_default_instances();
- const BoundingBoxf &bb = fff_print_config.bed_shape.values;
- m.arrange_objects(
- fff_print_config.min_object_distance(),
- // If we are going to use the merged model for printing, honor
- // the configured print bed for arranging, otherwise do it freely.
- this->has_print_action() ? &bb : nullptr
- );
+ if (this->has_print_action())
+ arrange_objects(m, bed, arrange_cfg);
+ else
+ arrange_objects(m, InfiniteBed{}, arrange_cfg);
}
m_models.clear();
m_models.emplace_back(std::move(m));
} else if (opt_key == "duplicate") {
- const BoundingBoxf &bb = fff_print_config.bed_shape.values;
for (auto &model : m_models) {
const bool all_objects_have_instances = std::none_of(
model.objects.begin(), model.objects.end(),
[](ModelObject* o){ return o->instances.empty(); }
);
- if (all_objects_have_instances) {
- // if all input objects have defined position(s) apply duplication to the whole model
- model.duplicate(m_config.opt_int("duplicate"), fff_print_config.min_object_distance(), &bb);
- } else {
- model.add_default_instances();
- model.duplicate_objects(m_config.opt_int("duplicate"), fff_print_config.min_object_distance(), &bb);
+
+ int dups = m_config.opt_int("duplicate");
+ if (!all_objects_have_instances) model.add_default_instances();
+
+ try {
+ if (dups > 1) {
+ // if all input objects have defined position(s) apply duplication to the whole model
+ duplicate(model, size_t(dups), bed, arrange_cfg);
+ } else {
+ arrange_objects(model, bed, arrange_cfg);
+ }
+ } catch (std::exception &ex) {
+ boost::nowide::cerr << "error: " << ex.what() << std::endl;
+ return 1;
}
}
} else if (opt_key == "duplicate_grid") {
@@ -409,7 +460,8 @@ int CLI::run(int argc, char **argv)
std::string outfile = m_config.opt_string("output");
Print fff_print;
SLAPrint sla_print;
-
+ SL1Archive sla_archive(sla_print.printer_config());
+ sla_print.set_printer(&sla_archive);
sla_print.set_status_callback(
[](const PrintBase::SlicingStatus& s)
{
@@ -419,15 +471,21 @@ int CLI::run(int argc, char **argv)
PrintBase *print = (printer_technology == ptFFF) ? static_cast<PrintBase*>(&fff_print) : static_cast<PrintBase*>(&sla_print);
if (! m_config.opt_bool("dont_arrange")) {
- //FIXME make the min_object_distance configurable.
- model.arrange_objects(fff_print.config().min_object_distance());
- model.center_instances_around_point((! user_center_specified && m_print_config.has("bed_shape")) ?
- BoundingBoxf(m_print_config.opt<ConfigOptionPoints>("bed_shape")->values).center() :
- m_config.option<ConfigOptionPoint>("center")->value);
+ if (user_center_specified) {
+ Vec2d c = m_config.option<ConfigOptionPoint>("center")->value;
+ arrange_objects(model, InfiniteBed{scaled(c)}, arrange_cfg);
+ } else
+ arrange_objects(model, bed, arrange_cfg);
}
if (printer_technology == ptFFF) {
for (auto* mo : model.objects)
fff_print.auto_assign_extruders(mo);
+ } else {
+ // The default for "output_filename_format" is good for FDM: "[input_filename_base].gcode"
+ // Replace it with a reasonable SLA default.
+ std::string &format = m_print_config.opt_string("output_filename_format", true);
+ if (format == static_cast<const ConfigOptionString*>(m_print_config.def()->get("output_filename_format")->default_value.get())->value)
+ format = "[input_filename_base].SL1";
}
print->apply(model, m_print_config);
std::string err = print->validate();
@@ -443,18 +501,23 @@ int CLI::run(int argc, char **argv)
print->process();
if (printer_technology == ptFFF) {
// The outfile is processed by a PlaceholderParser.
- outfile = fff_print.export_gcode(outfile, nullptr);
+ outfile = fff_print.export_gcode(outfile, nullptr, nullptr);
outfile_final = fff_print.print_statistics().finalize_output_path(outfile);
} else {
outfile = sla_print.output_filepath(outfile);
// We need to finalize the filename beforehand because the export function sets the filename inside the zip metadata
outfile_final = sla_print.print_statistics().finalize_output_path(outfile);
- sla_print.export_raster(outfile_final);
+ sla_archive.export_print(outfile_final, sla_print);
}
- if (outfile != outfile_final && Slic3r::rename_file(outfile, outfile_final)) {
- boost::nowide::cerr << "Renaming file " << outfile << " to " << outfile_final << " failed" << std::endl;
- return 1;
+ if (outfile != outfile_final) {
+ if (Slic3r::rename_file(outfile, outfile_final)) {
+ boost::nowide::cerr << "Renaming file " << outfile << " to " << outfile_final << " failed" << std::endl;
+ return 1;
+ }
+ outfile = outfile_final;
}
+ // Run the post-processing scripts if defined.
+ run_post_process_scripts(outfile, fff_print.full_print_config());
boost::nowide::cout << "Slicing result exported to " << outfile << std::endl;
} catch (const std::exception &ex) {
boost::nowide::cerr << ex.what() << std::endl;
@@ -499,43 +562,20 @@ int CLI::run(int argc, char **argv)
if (start_gui) {
#ifdef SLIC3R_GUI
-// #ifdef USE_WX
- GUI::GUI_App *gui = new GUI::GUI_App();
-// gui->autosave = m_config.opt_string("autosave");
- GUI::GUI_App::SetInstance(gui);
- gui->CallAfter([gui, this, &load_configs] {
- if (!gui->initialized()) {
- return;
- }
-#if 0
- // Load the cummulative config over the currently active profiles.
- //FIXME if multiple configs are loaded, only the last one will have an effect.
- // We need to decide what to do about loading of separate presets (just print preset, just filament preset etc).
- // As of now only the full configs are supported here.
- if (!m_print_config.empty())
- gui->mainframe->load_config(m_print_config);
-#endif
- if (! load_configs.empty())
- // Load the last config to give it a name at the UI. The name of the preset may be later
- // changed by loading an AMF or 3MF.
- //FIXME this is not strictly correct, as one may pass a print/filament/printer profile here instead of a full config.
- gui->mainframe->load_config_file(load_configs.back());
- // If loading a 3MF file, the config is loaded from the last one.
- if (! m_input_files.empty())
- gui->plater()->load_files(m_input_files, true, true);
- if (! m_extra_config.empty())
- gui->mainframe->load_config(m_extra_config);
- });
- int result = wxEntry(argc, argv);
- //FIXME this is a workaround for the PrusaSlicer 2.1 release.
- _3DScene::destroy();
- return result;
-#else /* SLIC3R_GUI */
+ Slic3r::GUI::GUI_InitParams params;
+ params.argc = argc;
+ params.argv = argv;
+ params.load_configs = load_configs;
+ params.extra_config = std::move(m_extra_config);
+ params.input_files = std::move(m_input_files);
+ params.start_as_gcodeviewer = start_as_gcodeviewer;
+ return Slic3r::GUI::GUI_Run(params);
+#else // SLIC3R_GUI
// No GUI support. Just print out a help.
this->print_help(false);
// If started without a parameter, consider it to be OK, otherwise report an error code (no action etc).
return (argc == 0) ? 0 : 1;
-#endif /* SLIC3R_GUI */
+#endif // SLIC3R_GUI
}
return 0;
@@ -560,7 +600,7 @@ bool CLI::setup(int argc, char **argv)
#ifdef __APPLE__
// The application is packed in the .dmg archive as 'Slic3r.app/Contents/MacOS/Slic3r'
// The resources are packed to 'Slic3r.app/Contents/Resources'
- boost::filesystem::path path_resources = path_to_binary.parent_path() / "../Resources";
+ boost::filesystem::path path_resources = boost::filesystem::canonical(path_to_binary).parent_path() / "../Resources";
#elif defined _WIN32
// The application is packed in the .zip archive in the root,
// The resources are packed to 'resources'
@@ -574,7 +614,7 @@ bool CLI::setup(int argc, char **argv)
// The application is packed in the .tar.bz archive (or in AppImage) as 'bin/slic3r',
// The resources are packed to 'resources'
// Path from Slic3r binary to resources:
- boost::filesystem::path path_resources = path_to_binary.parent_path() / "../resources";
+ boost::filesystem::path path_resources = boost::filesystem::canonical(path_to_binary).parent_path() / "../resources";
#endif
set_resources_dir(path_resources.string());
@@ -603,6 +643,8 @@ bool CLI::setup(int argc, char **argv)
if (opt_loglevel != 0)
set_logging_level(opt_loglevel->value);
}
+
+ std::string validity = m_config.validate();
// Initialize with defaults.
for (const t_optiondef_map *options : { &cli_actions_config_def.options, &cli_transform_config_def.options, &cli_misc_config_def.options })
@@ -610,6 +652,11 @@ bool CLI::setup(int argc, char **argv)
m_config.option(optdef.first, true);
set_data_dir(m_config.opt_string("datadir"));
+
+ if (!validity.empty()) {
+ boost::nowide::cerr << "error: " << validity << std::endl;
+ return false;
+ }
return true;
}
@@ -640,6 +687,14 @@ void CLI::print_help(bool include_print_options, PrinterTechnology printer_techn
<< "Other options:" << std::endl;
cli_misc_config_def.print_cli_help(boost::nowide::cout, false);
+ boost::nowide::cout
+ << std::endl
+ << "Print options are processed in the following order:" << std::endl
+ << "\t1) Config keys from the command line, for example --fill-pattern=stars" << std::endl
+ << "\t (highest priority, overwrites everything below)" << std::endl
+ << "\t2) Config files loaded with --load" << std::endl
+ << "\t3) Config values loaded from amf or 3mf files" << std::endl;
+
if (include_print_options) {
boost::nowide::cout << std::endl;
print_config_def.print_cli_help(boost::nowide::cout, true, [printer_technology](const ConfigOptionDef &def)
diff --git a/src/PrusaSlicer_app_msvc.cpp b/src/PrusaSlicer_app_msvc.cpp
index b3d1e8bb4..5f12c9147 100644
--- a/src/PrusaSlicer_app_msvc.cpp
+++ b/src/PrusaSlicer_app_msvc.cpp
@@ -7,6 +7,8 @@
#include <shellapi.h>
#include <wchar.h>
+
+
#ifdef SLIC3R_GUI
extern "C"
{
@@ -216,10 +218,14 @@ int APIENTRY wWinMain(HINSTANCE /* hInstance */, HINSTANCE /* hPrevInstance */,
int wmain(int argc, wchar_t **argv)
{
#endif
-
std::vector<wchar_t*> argv_extended;
argv_extended.emplace_back(argv[0]);
+#ifdef SLIC3R_WRAPPER_GCODEVIEWER
+ wchar_t gcodeviewer_param[] = L"--gcodeviewer";
+ argv_extended.emplace_back(gcodeviewer_param);
+#endif /* SLIC3R_WRAPPER_GCODEVIEWER */
+
#ifdef SLIC3R_GUI
// Here one may push some additional parameters based on the wrapper type.
bool force_mesa = false;
diff --git a/src/Shiny/ShinyOutput.c b/src/Shiny/ShinyOutput.c
index ad02ea003..c2c624d58 100644
--- a/src/Shiny/ShinyOutput.c
+++ b/src/Shiny/ShinyOutput.c
@@ -40,8 +40,8 @@ THE SOFTWARE.
/*---------------------------------------------------------------------------*/
#define OUTPUT_WIDTH_CALL 6
-#define OUTPUT_WIDTH_TIME 6
-#define OUTPUT_WIDTH_PERC 4
+#define OUTPUT_WIDTH_TIME (6+3)
+#define OUTPUT_WIDTH_PERC (4+3)
#define OUTPUT_WIDTH_SUM 120
#define OUTPUT_WIDTH_DATA (1+OUTPUT_WIDTH_CALL + 1 + 2*(OUTPUT_WIDTH_TIME+4+OUTPUT_WIDTH_PERC+1) + 1)
@@ -70,7 +70,7 @@ SHINY_INLINE char* printData(char *output, const ShinyData *a_data, float a_tope
const ShinyTimeUnit *totalUnit = ShinyGetTimeUnit(totalTicksAvg);
snprintf(output, OUTPUT_WIDTH_DATA + TRAILING,
- " %*.1f %*.0f %-2s %*.0f%% %*.0f %-2s %*.0f%%",
+ " %*.1f %*.2f %-2s %*.2f%% %*.2f %-2s %*.2f%%",
OUTPUT_WIDTH_CALL, a_data->entryCount.avg,
OUTPUT_WIDTH_TIME, a_data->selfTicks.avg * selfUnit->invTickFreq, selfUnit->suffix,
OUTPUT_WIDTH_PERC, a_data->selfTicks.avg * a_topercent,
diff --git a/src/admesh/stl.h b/src/admesh/stl.h
index 9224b0459..e0f2865f0 100644
--- a/src/admesh/stl.h
+++ b/src/admesh/stl.h
@@ -255,18 +255,24 @@ extern void its_transform(indexed_triangle_set &its, T *trafo3x4)
}
template<typename T>
-inline void its_transform(indexed_triangle_set &its, const Eigen::Transform<T, 3, Eigen::Affine, Eigen::DontAlign>& t)
+inline void its_transform(indexed_triangle_set &its, const Eigen::Transform<T, 3, Eigen::Affine, Eigen::DontAlign>& t, bool fix_left_handed = false)
{
//const Eigen::Matrix<double, 3, 3, Eigen::DontAlign> r = t.matrix().template block<3, 3>(0, 0);
for (stl_vertex &v : its.vertices)
v = (t * v.template cast<T>()).template cast<float>().eval();
+ if (fix_left_handed && t.matrix().block(0, 0, 3, 3).determinant() < 0.)
+ for (stl_triangle_vertex_indices &i : its.indices)
+ std::swap(i[0], i[1]);
}
template<typename T>
-inline void its_transform(indexed_triangle_set &its, const Eigen::Matrix<T, 3, 3, Eigen::DontAlign>& m)
+inline void its_transform(indexed_triangle_set &its, const Eigen::Matrix<T, 3, 3, Eigen::DontAlign>& m, bool fix_left_handed = false)
{
- for (stl_vertex &v : its.vertices)
+ for (stl_vertex &v : its.vertices)
v = (m * v.template cast<T>()).template cast<float>().eval();
+ if (fix_left_handed && m.determinant() < 0.)
+ for (stl_triangle_vertex_indices &i : its.indices)
+ std::swap(i[0], i[1]);
}
extern void its_rotate_x(indexed_triangle_set &its, float angle);
diff --git a/src/admesh/stlinit.cpp b/src/admesh/stlinit.cpp
index 390fe56a4..6aa2c4417 100644
--- a/src/admesh/stlinit.cpp
+++ b/src/admesh/stlinit.cpp
@@ -28,7 +28,7 @@
#include <boost/log/trivial.hpp>
#include <boost/nowide/cstdio.hpp>
-#include <boost/detail/endian.hpp>
+#include <boost/predef/other/endian.h>
#include "stl.h"
@@ -36,9 +36,9 @@
#error "SEEK_SET not defined"
#endif
-#ifndef BOOST_LITTLE_ENDIAN
+#if BOOST_ENDIAN_BIG_BYTE
extern void stl_internal_reverse_quads(char *buf, size_t cnt);
-#endif /* BOOST_LITTLE_ENDIAN */
+#endif /* BOOST_ENDIAN_BIG_BYTE */
static FILE* stl_open_count_facets(stl_file *stl, const char *file)
{
@@ -89,10 +89,10 @@ static FILE* stl_open_count_facets(stl_file *stl, const char *file)
// Read the int following the header. This should contain # of facets.
uint32_t header_num_facets;
bool header_num_faces_read = fread(&header_num_facets, sizeof(uint32_t), 1, fp) != 0;
-#ifndef BOOST_LITTLE_ENDIAN
+#if BOOST_ENDIAN_BIG_BYTE
// Convert from little endian to big endian.
stl_internal_reverse_quads((char*)&header_num_facets, 4);
-#endif /* BOOST_LITTLE_ENDIAN */
+#endif /* BOOST_ENDIAN_BIG_BYTE */
if (! header_num_faces_read || num_facets != header_num_facets)
BOOST_LOG_TRIVIAL(info) << "stl_open_count_facets: Warning: File size doesn't match number of facets in the header: " << file;
}
@@ -158,10 +158,10 @@ static bool stl_read(stl_file *stl, FILE *fp, int first_facet, bool first)
// Read a single facet from a binary .STL file. We assume little-endian architecture!
if (fread(&facet, 1, SIZEOF_STL_FACET, fp) != SIZEOF_STL_FACET)
return false;
-#ifndef BOOST_LITTLE_ENDIAN
+#if BOOST_ENDIAN_BIG_BYTE
// Convert the loaded little endian data to big endian.
stl_internal_reverse_quads((char*)&facet, 48);
-#endif /* BOOST_LITTLE_ENDIAN */
+#endif /* BOOST_ENDIAN_BIG_BYTE */
} else {
// Read a single facet from an ASCII .STL file
// skip solid/endsolid
diff --git a/src/clipper/CMakeLists.txt b/src/clipper/CMakeLists.txt
index 412ab53c7..8a4e92852 100644
--- a/src/clipper/CMakeLists.txt
+++ b/src/clipper/CMakeLists.txt
@@ -7,3 +7,7 @@ add_library(clipper STATIC
clipper_z.cpp
clipper_z.hpp
)
+
+if(SLIC3R_PROFILE)
+ target_link_libraries(clipper Shiny)
+endif()
diff --git a/src/clipper/clipper.cpp b/src/clipper/clipper.cpp
index b85cf9025..be4cb4a6a 100644
--- a/src/clipper/clipper.cpp
+++ b/src/clipper/clipper.cpp
@@ -48,9 +48,19 @@
#include <ostream>
#include <functional>
#include <assert.h>
-#include <Shiny/Shiny.h>
#include <libslic3r/Int128.hpp>
+// Profiling support using the Shiny intrusive profiler
+//#define CLIPPERLIB_PROFILE
+#if defined(SLIC3R_PROFILE) && defined(CLIPPERLIB_PROFILE)
+ #include <Shiny/Shiny.h>
+ #define CLIPPERLIB_PROFILE_FUNC() PROFILE_FUNC()
+ #define CLIPPERLIB_PROFILE_BLOCK(name) PROFILE_BLOCK(name)
+#else
+ #define CLIPPERLIB_PROFILE_FUNC()
+ #define CLIPPERLIB_PROFILE_BLOCK(name)
+#endif
+
#ifdef use_xyz
namespace ClipperLib_Z {
#else /* use_xyz */
@@ -263,7 +273,7 @@ int PointInPolygon (const IntPoint &pt, OutPt *op)
// This is potentially very expensive! O(n^2)!
bool Poly2ContainsPoly1(OutPt *OutPt1, OutPt *OutPt2)
{
- PROFILE_FUNC();
+ CLIPPERLIB_PROFILE_FUNC();
OutPt* op = OutPt1;
do
{
@@ -714,7 +724,7 @@ TEdge* ClipperBase::ProcessBound(TEdge* E, bool NextIsForward)
bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed)
{
- PROFILE_FUNC();
+ CLIPPERLIB_PROFILE_FUNC();
// Remove duplicate end point from a closed input path.
// Remove duplicate points from the end of the input path.
int highI = (int)pg.size() -1;
@@ -738,7 +748,7 @@ bool ClipperBase::AddPath(const Path &pg, PolyType PolyTyp, bool Closed)
bool ClipperBase::AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed)
{
- PROFILE_FUNC();
+ CLIPPERLIB_PROFILE_FUNC();
std::vector<int> num_edges(ppg.size(), 0);
int num_edges_total = 0;
for (size_t i = 0; i < ppg.size(); ++ i) {
@@ -780,7 +790,7 @@ bool ClipperBase::AddPaths(const Paths &ppg, PolyType PolyTyp, bool Closed)
bool ClipperBase::AddPathInternal(const Path &pg, int highI, PolyType PolyTyp, bool Closed, TEdge* edges)
{
- PROFILE_FUNC();
+ CLIPPERLIB_PROFILE_FUNC();
#ifdef use_lines
if (!Closed && PolyTyp == ptClip)
throw clipperException("AddPath: Open paths must be subject.");
@@ -954,7 +964,7 @@ bool ClipperBase::AddPathInternal(const Path &pg, int highI, PolyType PolyTyp, b
void ClipperBase::Clear()
{
- PROFILE_FUNC();
+ CLIPPERLIB_PROFILE_FUNC();
m_MinimaList.clear();
m_edges.clear();
m_UseFullRange = false;
@@ -966,7 +976,7 @@ void ClipperBase::Clear()
// Sort the LML entries, initialize the left / right bound edges of each Local Minima.
void ClipperBase::Reset()
{
- PROFILE_FUNC();
+ CLIPPERLIB_PROFILE_FUNC();
if (m_MinimaList.empty()) return; //ie nothing to process
std::sort(m_MinimaList.begin(), m_MinimaList.end(), [](const LocalMinimum& lm1, const LocalMinimum& lm2){ return lm1.Y < lm2.Y; });
@@ -995,7 +1005,7 @@ void ClipperBase::Reset()
// Returns (0,0,0,0) for an empty rectangle.
IntRect ClipperBase::GetBounds()
{
- PROFILE_FUNC();
+ CLIPPERLIB_PROFILE_FUNC();
IntRect result;
auto lm = m_MinimaList.begin();
if (lm == m_MinimaList.end())
@@ -1056,7 +1066,7 @@ Clipper::Clipper(int initOptions) :
void Clipper::Reset()
{
- PROFILE_FUNC();
+ CLIPPERLIB_PROFILE_FUNC();
ClipperBase::Reset();
m_Scanbeam = std::priority_queue<cInt>();
m_Maxima.clear();
@@ -1071,7 +1081,7 @@ void Clipper::Reset()
bool Clipper::Execute(ClipType clipType, Paths &solution,
PolyFillType subjFillType, PolyFillType clipFillType)
{
- PROFILE_FUNC();
+ CLIPPERLIB_PROFILE_FUNC();
if (m_HasOpenPaths)
throw clipperException("Error: PolyTree struct is needed for open path clipping.");
solution.resize(0);
@@ -1089,7 +1099,7 @@ bool Clipper::Execute(ClipType clipType, Paths &solution,
bool Clipper::Execute(ClipType clipType, PolyTree& polytree,
PolyFillType subjFillType, PolyFillType clipFillType)
{
- PROFILE_FUNC();
+ CLIPPERLIB_PROFILE_FUNC();
m_SubjFillType = subjFillType;
m_ClipFillType = clipFillType;
m_ClipType = clipType;
@@ -1103,10 +1113,10 @@ bool Clipper::Execute(ClipType clipType, PolyTree& polytree,
bool Clipper::ExecuteInternal()
{
- PROFILE_FUNC();
+ CLIPPERLIB_PROFILE_FUNC();
bool succeeded = true;
try {
- PROFILE_BLOCK(Clipper_ExecuteInternal_Process);
+ CLIPPERLIB_PROFILE_BLOCK(Clipper_ExecuteInternal_Process);
Reset();
if (m_MinimaList.empty()) return true;
cInt botY = m_Scanbeam.top();
@@ -1131,13 +1141,13 @@ bool Clipper::ExecuteInternal()
if (succeeded)
{
- PROFILE_BLOCK(Clipper_ExecuteInternal_Fix);
+ CLIPPERLIB_PROFILE_BLOCK(Clipper_ExecuteInternal_Fix);
//fix orientations ...
//FIXME Vojtech: Does it not invalidate the loop hierarchy maintained as OutRec::FirstLeft pointers?
//FIXME Vojtech: The area is calculated with floats, it may not be numerically stable!
{
- PROFILE_BLOCK(Clipper_ExecuteInternal_Fix_orientations);
+ CLIPPERLIB_PROFILE_BLOCK(Clipper_ExecuteInternal_Fix_orientations);
for (OutRec *outRec : m_PolyOuts)
if (outRec->Pts && !outRec->IsOpen && (outRec->IsHole ^ m_ReverseOutput) == (Area(*outRec) > 0))
ReversePolyPtLinks(outRec->Pts);
@@ -1147,7 +1157,7 @@ bool Clipper::ExecuteInternal()
//unfortunately FixupOutPolygon() must be done after JoinCommonEdges()
{
- PROFILE_BLOCK(Clipper_ExecuteInternal_Fix_fixup);
+ CLIPPERLIB_PROFILE_BLOCK(Clipper_ExecuteInternal_Fix_fixup);
for (OutRec *outRec : m_PolyOuts)
if (outRec->Pts) {
if (outRec->IsOpen)
@@ -1401,7 +1411,7 @@ bool Clipper::IsContributing(const TEdge& edge) const
// Called from Clipper::InsertLocalMinimaIntoAEL() and Clipper::IntersectEdges().
OutPt* Clipper::AddLocalMinPoly(TEdge *e1, TEdge *e2, const IntPoint &Pt)
{
- PROFILE_FUNC();
+ CLIPPERLIB_PROFILE_FUNC();
OutPt* result;
TEdge *e, *prevE;
if (IsHorizontal(*e2) || ( e1->Dx > e2->Dx ))
@@ -1493,7 +1503,7 @@ void Clipper::CopyAELToSEL()
// Called from Clipper::ExecuteInternal()
void Clipper::InsertLocalMinimaIntoAEL(const cInt botY)
{
- PROFILE_FUNC();
+ CLIPPERLIB_PROFILE_FUNC();
while (!m_MinimaList.empty() && m_MinimaList.back().Y == botY)
{
TEdge* lb = m_MinimaList.back().LeftBound;
@@ -2043,7 +2053,7 @@ OutPt* Clipper::GetLastOutPt(TEdge *e)
void Clipper::ProcessHorizontals()
{
- PROFILE_FUNC();
+ CLIPPERLIB_PROFILE_FUNC();
TEdge* horzEdge = m_SortedEdges;
while(horzEdge)
{
@@ -2414,7 +2424,7 @@ void Clipper::UpdateEdgeIntoAEL(TEdge *&e)
bool Clipper::ProcessIntersections(const cInt topY)
{
- PROFILE_FUNC();
+ CLIPPERLIB_PROFILE_FUNC();
if( !m_ActiveEdges ) return true;
try {
BuildIntersectList(topY);
@@ -2569,7 +2579,7 @@ void Clipper::DoMaxima(TEdge *e)
void Clipper::ProcessEdgesAtTopOfScanbeam(const cInt topY)
{
- PROFILE_FUNC();
+ CLIPPERLIB_PROFILE_FUNC();
TEdge* e = m_ActiveEdges;
while( e )
{
@@ -3177,7 +3187,7 @@ bool Clipper::JoinPoints(Join *j, OutRec* outRec1, OutRec* outRec2)
// This is potentially very expensive! O(n^3)!
void Clipper::FixupFirstLefts1(OutRec* OldOutRec, OutRec* NewOutRec) const
{
- PROFILE_FUNC();
+ CLIPPERLIB_PROFILE_FUNC();
//tests if NewOutRec contains the polygon before reassigning FirstLeft
for (OutRec *outRec : m_PolyOuts)
{
@@ -3201,7 +3211,7 @@ void Clipper::FixupFirstLefts2(OutRec* OldOutRec, OutRec* NewOutRec) const
void Clipper::JoinCommonEdges()
{
- PROFILE_FUNC();
+ CLIPPERLIB_PROFILE_FUNC();
for (Join &join : m_Joins)
{
OutRec *outRec1 = GetOutRec(join.OutPt1->Idx);
@@ -3771,7 +3781,7 @@ void ClipperOffset::DoRound(int j, int k)
// http://www.angusj.com/delphi/clipper/documentation/Docs/Units/ClipperLib/Classes/Clipper/Properties/StrictlySimple.htm
void Clipper::DoSimplePolygons()
{
- PROFILE_FUNC();
+ CLIPPERLIB_PROFILE_FUNC();
size_t i = 0;
while (i < m_PolyOuts.size())
{
diff --git a/src/hidapi/linux/hid.c b/src/hidapi/linux/hid.c
index d68354fe1..5f486c0a9 100644
--- a/src/hidapi/linux/hid.c
+++ b/src/hidapi/linux/hid.c
@@ -42,10 +42,16 @@
#include <linux/hidraw.h>
#include <linux/version.h>
#include <linux/input.h>
-#include <libudev.h>
#include "hidapi.h"
+// Declare udev structures needed in this module. They are passed by pointers
+// to udev functions and not used directly.
+struct udev_device;
+struct udev_list_entry;
+struct udev_enumerate;
+struct udev;
+
typedef const char* (*hid_wrapper_udev_device_get_devnode_type)(struct udev_device *udev_device);
typedef struct udev_device* (*hid_wrapper_udev_device_get_parent_with_subsystem_devtype_type)(struct udev_device *udev_device, const char *subsystem, const char *devtype);
typedef const char* (*hid_wrapper_udev_device_get_sysattr_value_type)(struct udev_device *udev_device, const char *sysattr);
diff --git a/src/imgui/README.md b/src/imgui/README.md
index 7420f14e2..26e344474 100644
--- a/src/imgui/README.md
+++ b/src/imgui/README.md
@@ -2,4 +2,11 @@
For more information go to https://github.com/ocornut/imgui
-THIS DIRECTORY CONTAINS THE imgui-1.66 da3c433 SOURCE DISTRIBUTION.
+THIS DIRECTORY CONTAINS THE imgui-1.75 58b3e02 SOURCE DISTRIBUTION.
+
+Customized with the following commits:
+042880ba2df913916b2cc77f7bb677e07bfd2c58
+67c55c74901f1d337ef08f2090a87cfb4263bb0f
+a94c952b40d36b1505fb77b87c0dd739e1034659
+3ca3a544a87cc569b69351a77996c287763388a5
+6586a46ea23e86d54d228c55c63ca55680d25d56
diff --git a/src/imgui/imconfig.h b/src/imgui/imconfig.h
index 50b7f471c..d52294acd 100644
--- a/src/imgui/imconfig.h
+++ b/src/imgui/imconfig.h
@@ -3,10 +3,10 @@
// Runtime options (clipboard callbacks, enabling various features, etc.) can generally be set via the ImGuiIO structure.
// You can use ImGui::SetAllocatorFunctions() before calling ImGui::CreateContext() to rewire memory allocation functions.
//-----------------------------------------------------------------------------
-// A) You may edit imconfig.h (and not overwrite it when updating imgui, or maintain a patch/branch with your modifications to imconfig.h)
+// A) You may edit imconfig.h (and not overwrite it when updating Dear ImGui, or maintain a patch/branch with your modifications to imconfig.h)
// B) or add configuration directives in your own file and compile with #define IMGUI_USER_CONFIG "myfilename.h"
-// If you do so you need to make sure that configuration settings are defined consistently _everywhere_ dear imgui is used, which include
-// the imgui*.cpp files but also _any_ of your code that uses imgui. This is because some compile-time options have an affect on data structures.
+// If you do so you need to make sure that configuration settings are defined consistently _everywhere_ Dear ImGui is used, which include
+// the imgui*.cpp files but also _any_ of your code that uses Dear ImGui. This is because some compile-time options have an affect on data structures.
// Defining those options in imconfig.h will ensure every compilation unit gets to see the same data structure layouts.
// Call IMGUI_CHECKVERSION() from your .cpp files to verify that the data structures your files are using are matching the ones imgui.cpp is using.
//-----------------------------------------------------------------------------
@@ -14,25 +14,32 @@
#pragma once
//---- Define assertion handler. Defaults to calling assert().
+// If your macro uses multiple statements, make sure is enclosed in a 'do { .. } while (0)' block so it can be used as a single statement.
//#define IM_ASSERT(_EXPR) MyAssert(_EXPR)
//#define IM_ASSERT(_EXPR) ((void)(_EXPR)) // Disable asserts
-//---- Define attributes of all API symbols declarations, e.g. for DLL under Windows.
+//---- Define attributes of all API symbols declarations, e.g. for DLL under Windows
+// Using dear imgui via a shared library is not recommended, because of function call overhead and because we don't guarantee backward nor forward ABI compatibility.
//#define IMGUI_API __declspec( dllexport )
//#define IMGUI_API __declspec( dllimport )
-//---- Don't define obsolete functions/enums names. Consider enabling from time to time after updating to avoid using soon-to-be obsolete function/names.
+//---- Don't define obsolete functions/enums/behaviors. Consider enabling from time to time after updating to avoid using soon-to-be obsolete function/names.
//#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS
-//---- Don't implement demo windows functionality (ShowDemoWindow()/ShowStyleEditor()/ShowUserGuide() methods will be empty)
-//---- It is very strongly recommended to NOT disable the demo windows during development. Please read the comments in imgui_demo.cpp.
-//#define IMGUI_DISABLE_DEMO_WINDOWS
+//---- Disable all of Dear ImGui or don't implement standard windows.
+// It is very strongly recommended to NOT disable the demo windows during development. Please read comments in imgui_demo.cpp.
+//#define IMGUI_DISABLE // Disable everything: all headers and source files will be empty.
+//#define IMGUI_DISABLE_DEMO_WINDOWS // Disable demo windows: ShowDemoWindow()/ShowStyleEditor() will be empty. Not recommended.
+//#define IMGUI_DISABLE_METRICS_WINDOW // Disable debug/metrics window: ShowMetricsWindow() will be empty.
//---- Don't implement some functions to reduce linkage requirements.
//#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS // [Win32] Don't implement default clipboard handler. Won't use and link with OpenClipboard/GetClipboardData/CloseClipboard etc.
//#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS // [Win32] Don't implement default IME handler. Won't use and link with ImmGetContext/ImmSetCompositionWindow.
-//#define IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS // Don't implement ImFormatString/ImFormatStringV so you can implement them yourself if you don't want to link with vsnprintf.
-//#define IMGUI_DISABLE_MATH_FUNCTIONS // Don't implement ImFabs/ImSqrt/ImPow/ImFmod/ImCos/ImSin/ImAcos/ImAtan2 wrapper so you can implement them yourself. Declare your prototypes in imconfig.h.
+//#define IMGUI_DISABLE_WIN32_FUNCTIONS // [Win32] Won't use and link with any Win32 function (clipboard, ime).
+//#define IMGUI_ENABLE_OSX_DEFAULT_CLIPBOARD_FUNCTIONS // [OSX] Implement default OSX clipboard handler (need to link with '-framework ApplicationServices', this is why this is not the default).
+//#define IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS // Don't implement ImFormatString/ImFormatStringV so you can implement them yourself (e.g. if you don't want to link with vsnprintf)
+//#define IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS // Don't implement ImFabs/ImSqrt/ImPow/ImFmod/ImCos/ImSin/ImAcos/ImAtan2 so you can implement them yourself.
+//#define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS // Don't implement ImFileOpen/ImFileClose/ImFileRead/ImFileWrite so you can implement them yourself if you don't want to link with fopen/fclose/fread/fwrite. This will also disable the LogToTTY() function.
//#define IMGUI_DISABLE_DEFAULT_ALLOCATORS // Don't implement default allocators calling malloc()/free() to avoid linking with them. You will need to call ImGui::SetAllocatorFunctions().
//---- Include imgui_user.h at the end of imgui.h as a convenience
@@ -48,6 +55,10 @@
//#define IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION
//#define IMGUI_DISABLE_STB_RECT_PACK_IMPLEMENTATION
+//---- Unless IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS is defined, use the much faster STB sprintf library implementation of vsnprintf instead of the one from the default C library.
+// Note that stb_sprintf.h is meant to be provided by the user and available in the include path at compile time. Also, the compatibility checks of the arguments and formats done by clang and GCC will be disabled in order to support the extra formats provided by STB sprintf.
+// #define IMGUI_USE_STB_SPRINTF
+
//---- Define constructor and implicit cast operators to convert back<>forth between your math types and ImVec2/ImVec4.
// This will be inlined as part of ImVec2 and ImVec4 class declarations.
/*
@@ -60,13 +71,59 @@
operator MyVec4() const { return MyVec4(x,y,z,w); }
*/
-//---- Use 32-bit vertex indices (default is 16-bit) to allow meshes with more than 64K vertices. Render function needs to support it.
+//---- Use 32-bit vertex indices (default is 16-bit) is one way to allow large meshes with more than 64K vertices.
+// Your renderer back-end will need to support it (most example renderer back-ends support both 16/32-bit indices).
+// Another way to allow large meshes while keeping 16-bit indices is to handle ImDrawCmd::VtxOffset in your renderer.
+// Read about ImGuiBackendFlags_RendererHasVtxOffset for details.
//#define ImDrawIdx unsigned int
+//---- Override ImDrawCallback signature (will need to modify renderer back-ends accordingly)
+//struct ImDrawList;
+//struct ImDrawCmd;
+//typedef void (*MyImDrawCallback)(const ImDrawList* draw_list, const ImDrawCmd* cmd, void* my_renderer_user_data);
+//#define ImDrawCallback MyImDrawCallback
+
+//---- Debug Tools: Macro to break in Debugger
+// (use 'Metrics->Tools->Item Picker' to pick widgets with the mouse and break into them for easy debugging.)
+//#define IM_DEBUG_BREAK IM_ASSERT(0)
+//#define IM_DEBUG_BREAK __debugbreak()
+
+//---- Debug Tools: Have the Item Picker break in the ItemAdd() function instead of ItemHoverable(),
+// (which comes earlier in the code, will catch a few extra items, allow picking items other than Hovered one.)
+// This adds a small runtime cost which is why it is not enabled by default.
+//#define IMGUI_DEBUG_TOOL_ITEM_PICKER_EX
+
+//---- Debug Tools: Enable slower asserts
+//#define IMGUI_DEBUG_PARANOID
+
//---- Tip: You can add extra functions within the ImGui:: namespace, here or in your own headers files.
-/*
+
namespace ImGui
{
- void MyFunction(const char* name, const MyMatrix44& v);
+ // Special ASCII character is used here as markup symbols for tokens to be highlighted as a for hovered item
+ const char ColorMarkerHovered = 0x1; // STX
+
+ // Special ASCII characters STX and ETX are used here as markup symbols for tokens to be highlighted.
+ const char ColorMarkerStart = 0x2; // STX
+ const char ColorMarkerEnd = 0x3; // ETX
+
+ // Special ASCII characters are used here as an ikons markers
+ const char PrintIconMarker = 0x4;
+ const char PrinterIconMarker = 0x5;
+ const char PrinterSlaIconMarker = 0x6;
+ const char FilamentIconMarker = 0x7;
+ const char MaterialIconMarker = 0x8;
+ const char CloseNotifButton = 0xB;
+ const char CloseNotifHoverButton = 0xC;
+// const char TimerDotMarker = 0xE;
+// const char TimerDotEmptyMarker = 0xF;
+ const char MinimalizeButton = 0xE;
+ const char MinimalizeHoverButton = 0xF;
+ const char WarningMarker = 0x10;
+ const char ErrorMarker = 0x11;
+ const char EjectButton = 0x12;
+ const char EjectHoverButton = 0x13;
+// void MyFunction(const char* name, const MyMatrix44& v);
+
}
-*/
+
diff --git a/src/imgui/imgui.cpp b/src/imgui/imgui.cpp
index 2822e3e23..1b78dd83c 100644
--- a/src/imgui/imgui.cpp
+++ b/src/imgui/imgui.cpp
@@ -1,15 +1,25 @@
-// dear imgui, v1.66 WIP
+// dear imgui, v1.75
// (main code and documentation)
-// Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp for demo code.
-// Newcomers, read 'Programmer guide' below for notes on how to setup Dear ImGui in your codebase.
-// Get latest version at https://github.com/ocornut/imgui
-// Releases change-log at https://github.com/ocornut/imgui/releases
-// Technical Support for Getting Started https://discourse.dearimgui.org/c/getting-started
-// Gallery (please post your screenshots/video there!): https://github.com/ocornut/imgui/issues/1269
+// Help:
+// - Read FAQ at http://dearimgui.org/faq
+// - Newcomers, read 'Programmer guide' below for notes on how to setup Dear ImGui in your codebase.
+// - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp for demo code. All applications in examples/ are doing that.
+
+// Resources:
+// - FAQ http://dearimgui.org/faq
+// - Homepage & latest https://github.com/ocornut/imgui
+// - Releases & changelog https://github.com/ocornut/imgui/releases
+// - Gallery https://github.com/ocornut/imgui/issues/2847 (please post your screenshots/video there!)
+// - Glossary https://github.com/ocornut/imgui/wiki/Glossary
+// - Wiki https://github.com/ocornut/imgui/wiki
+// - Issues & support https://github.com/ocornut/imgui/issues
+
// Developed by Omar Cornut and every direct or indirect contributors to the GitHub.
+// See LICENSE.txt for copyright and licensing details (standard MIT License).
// This library is free but I need your support to sustain development and maintenance.
-// If you work for a company, please consider financial support, see README. For individuals: https://www.patreon.com/imgui
+// Businesses: you can support continued development via invoiced technical support, maintenance and sponsoring contracts. Please reach out to "contact AT dearimgui.org".
+// Individuals: you can support continued development via donations. See docs/README or web page.
// It is recommended that you don't modify imgui.cpp! It will become difficult for you to update the library.
// Note that 'ImGui::' being a namespace, you can add functions into the namespace from your own source files, without
@@ -25,47 +35,39 @@ DOCUMENTATION
- MISSION STATEMENT
- END-USER GUIDE
-- PROGRAMMER GUIDE (read me!)
- - Read first
- - How to update to a newer version of Dear ImGui
- - Getting started with integrating Dear ImGui in your code/engine
- - This is how a simple application may look like (2 variations)
- - This is how a simple rendering function may look like
- - Using gamepad/keyboard navigation controls
+- PROGRAMMER GUIDE
+ - READ FIRST
+ - HOW TO UPDATE TO A NEWER VERSION OF DEAR IMGUI
+ - GETTING STARTED WITH INTEGRATING DEAR IMGUI IN YOUR CODE/ENGINE
+ - HOW A SIMPLE APPLICATION MAY LOOK LIKE (2 variations)
+ - HOW A SIMPLE RENDERING FUNCTION MAY LOOK LIKE
+ - USING GAMEPAD/KEYBOARD NAVIGATION CONTROLS
- API BREAKING CHANGES (read me when you update!)
-- FREQUENTLY ASKED QUESTIONS (FAQ), TIPS
- - How can I tell whether to dispatch mouse/keyboard to imgui or to my application?
- - How can I display an image? What is ImTextureID, how does it works?
- - How can I have multiple widgets with the same label or without a label? A primer on labels and the ID Stack.
- - How can I use my own math types instead of ImVec2/ImVec4?
- - How can I load a different font than the default?
- - How can I easily use icons in my application?
- - How can I load multiple fonts?
- - How can I display and input non-latin characters such as Chinese, Japanese, Korean, Cyrillic?
- - How can I use the drawing facilities without an ImGui window? (using ImDrawList API)
- - I integrated Dear ImGui in my engine and the text or lines are blurry..
- - I integrated Dear ImGui in my engine and some elements are clipping or disappearing when I move windows around..
- - How can I help?
-
-CODE
+- FREQUENTLY ASKED QUESTIONS (FAQ)
+ - Read all answers online: https://www.dearimgui.org/faq, or in docs/FAQ.md (with a Markdown viewer)
+
+CODE
(search for "[SECTION]" in the code to find them)
// [SECTION] FORWARD DECLARATIONS
// [SECTION] CONTEXT AND MEMORY ALLOCATORS
// [SECTION] MAIN USER FACING STRUCTURES (ImGuiStyle, ImGuiIO)
-// [SECTION] MISC HELPER/UTILITIES (Maths, String, Format, Hash, File functions)
-// [SECTION] MISC HELPER/UTILITIES (ImText* functions)
-// [SECTION] MISC HELPER/UTILITIES (Color functions)
+// [SECTION] MISC HELPERS/UTILITIES (Geometry functions)
+// [SECTION] MISC HELPERS/UTILITIES (String, Format, Hash functions)
+// [SECTION] MISC HELPERS/UTILITIES (File functions)
+// [SECTION] MISC HELPERS/UTILITIES (ImText* functions)
+// [SECTION] MISC HELPERS/UTILITIES (Color functions)
// [SECTION] ImGuiStorage
// [SECTION] ImGuiTextFilter
// [SECTION] ImGuiTextBuffer
// [SECTION] ImGuiListClipper
// [SECTION] RENDER HELPERS
// [SECTION] MAIN CODE (most of the code! lots of stuff, needs tidying up!)
+// [SECTION] ERROR CHECKING
+// [SECTION] SCROLLING
// [SECTION] TOOLTIPS
// [SECTION] POPUPS
// [SECTION] KEYBOARD/GAMEPAD NAVIGATION
-// [SECTION] COLUMNS
// [SECTION] DRAG AND DROP
// [SECTION] LOGGING/CAPTURING
// [SECTION] SETTINGS
@@ -83,19 +85,19 @@ CODE
MISSION STATEMENT
=================
- - Easy to use to create code-driven and data-driven tools
- - Easy to use to create ad hoc short-lived tools and long-lived, more elaborate tools
- - Easy to hack and improve
- - Minimize screen real-estate usage
- - Minimize setup and maintenance
- - Minimize state storage on user side
- - Portable, minimize dependencies, run on target (consoles, phones, etc.)
- - Efficient runtime and memory consumption (NB- we do allocate when "growing" content e.g. creating a window,
- opening a tree node for the first time, etc. but a typical frame should not allocate anything)
+ - Easy to use to create code-driven and data-driven tools.
+ - Easy to use to create ad hoc short-lived tools and long-lived, more elaborate tools.
+ - Easy to hack and improve.
+ - Minimize screen real-estate usage.
+ - Minimize setup and maintenance.
+ - Minimize state storage on user side.
+ - Portable, minimize dependencies, run on target (consoles, phones, etc.).
+ - Efficient runtime and memory consumption (NB- we do allocate when "growing" content e.g. creating a window,.
+ opening a tree node for the first time, etc. but a typical frame should not allocate anything).
Designed for developers and content-creators, not the typical end-user! Some of the weaknesses includes:
- - Doesn't look fancy, doesn't animate
- - Limited layout features, intricate layouts are typically crafted in code
+ - Doesn't look fancy, doesn't animate.
+ - Limited layout features, intricate layouts are typically crafted in code.
END-USER GUIDE
@@ -126,16 +128,29 @@ CODE
================
READ FIRST
-
- - Read the FAQ below this section!
+ ----------
+ - Remember to read the FAQ (https://www.dearimgui.org/faq)
- Your code creates the UI, if your code doesn't run the UI is gone! The UI can be highly dynamic, there are no construction
or destruction steps, less superfluous data retention on your side, less state duplication, less state synchronization, less bugs.
- Call and read ImGui::ShowDemoWindow() for demo code demonstrating most features.
- - You can learn about immediate-mode GUI principles at http://www.johno.se/book/imgui.html or watch http://mollyrocket.com/861
- See README.md for more links describing the IMGUI paradigm. Dear ImGui is an implementation of the IMGUI paradigm.
+ - The library is designed to be built from sources. Avoid pre-compiled binaries and packaged versions. See imconfig.h to configure your build.
+ - Dear ImGui is an implementation of the IMGUI paradigm (immediate-mode graphical user interface, a term coined by Casey Muratori).
+ You can learn about IMGUI principles at http://www.johno.se/book/imgui.html, http://mollyrocket.com/861 & more links docs/README.md.
+ - Dear ImGui is a "single pass" rasterizing implementation of the IMGUI paradigm, aimed at ease of use and high-performances.
+ For every application frame your UI code will be called only once. This is in contrast to e.g. Unity's own implementation of an IMGUI,
+ where the UI code is called multiple times ("multiple passes") from a single entry point. There are pros and cons to both approaches.
+ - Our origin are on the top-left. In axis aligned bounding boxes, Min = top-left, Max = bottom-right.
+ - This codebase is also optimized to yield decent performances with typical "Debug" builds settings.
+ - Please make sure you have asserts enabled (IM_ASSERT redirects to assert() by default, but can be redirected).
+ If you get an assert, read the messages and comments around the assert.
+ - C++: this is a very C-ish codebase: we don't rely on C++11, we don't include any C++ headers, and ImGui:: is a namespace.
+ - C++: ImVec2/ImVec4 do not expose math operators by default, because it is expected that you use your own math types.
+ See FAQ "How can I use my own math types instead of ImVec2/ImVec4?" for details about setting up imconfig.h for that.
+ However, imgui_internal.h can optionally export math operators for ImVec2/ImVec4, which we use in this codebase.
+ - C++: pay attention that ImVector<> manipulates plain-old-data and does not honor construction/destruction (avoid using it in your code!).
HOW TO UPDATE TO A NEWER VERSION OF DEAR IMGUI
-
+ ----------------------------------------------
- Overwrite all the sources files except for imconfig.h (if you have made modification to your copy of imconfig.h)
- Or maintain your own branch where you have imconfig.h modified.
- Read the "API BREAKING CHANGES" section (below). This is where we list occasional API breaking changes.
@@ -145,20 +160,22 @@ CODE
- Try to keep your copy of dear imgui reasonably up to date.
GETTING STARTED WITH INTEGRATING DEAR IMGUI IN YOUR CODE/ENGINE
-
+ ---------------------------------------------------------------
- Run and study the examples and demo in imgui_demo.cpp to get acquainted with the library.
+ - In the majority of cases you should be able to use unmodified back-ends files available in the examples/ folder.
- Add the Dear ImGui source files to your projects or using your preferred build system.
- It is recommended you build and statically link the .cpp files as part of your project and not as shared library (DLL).
- - You can later customize the imconfig.h file to tweak some compile-time behavior, such as integrating imgui types with your own maths types.
+ It is recommended you build and statically link the .cpp files as part of your project and NOT as shared library (DLL).
+ - You can later customize the imconfig.h file to tweak some compile-time behavior, such as integrating Dear ImGui types with your own maths types.
- When using Dear ImGui, your programming IDE is your friend: follow the declaration of variables, functions and types to find comments about them.
- Dear ImGui never touches or knows about your GPU state. The only function that knows about GPU is the draw function that you provide.
Effectively it means you can create widgets at any time in your code, regardless of considerations of being in "update" vs "render"
- phases of your own application. All rendering informatioe are stored into command-lists that you will retrieve after calling ImGui::Render().
+ phases of your own application. All rendering information are stored into command-lists that you will retrieve after calling ImGui::Render().
- Refer to the bindings and demo applications in the examples/ folder for instruction on how to setup your code.
- If you are running over a standard OS with a common graphics API, you should be able to use unmodified imgui_impl_*** files from the examples/ folder.
HOW A SIMPLE APPLICATION MAY LOOK LIKE
- EXHIBIT 1: USING THE EXAMPLE BINDINGS (imgui_impl_XXX.cpp files from the examples/ folder)
+ --------------------------------------
+ EXHIBIT 1: USING THE EXAMPLE BINDINGS (imgui_impl_XXX.cpp files from the examples/ folder).
// Application init: create a dear imgui context, setup some options, load fonts
ImGui::CreateContext();
@@ -167,7 +184,7 @@ CODE
// TODO: Fill optional fields of the io structure later.
// TODO: Load TTF/OTF fonts if you don't want to use the default font.
- // Initialize helper Platform and Renderer bindings (here we are using imgui_impl_win32 and imgui_impl_dx11)
+ // Initialize helper Platform and Renderer bindings (here we are using imgui_impl_win32.cpp and imgui_impl_dx11.cpp)
ImGui_ImplWin32_Init(hwnd);
ImGui_ImplDX11_Init(g_pd3dDevice, g_pd3dDeviceContext);
@@ -187,13 +204,12 @@ CODE
ImGui_ImplDX11_RenderDrawData(ImGui::GetDrawData());
g_pSwapChain->Present(1, 0);
}
-
+
// Shutdown
ImGui_ImplDX11_Shutdown();
ImGui_ImplWin32_Shutdown();
ImGui::DestroyContext();
- HOW A SIMPLE APPLICATION MAY LOOK LIKE
EXHIBIT 2: IMPLEMENTING CUSTOM BINDING / CUSTOM ENGINE
// Application init: create a dear imgui context, setup some options, load fonts
@@ -211,7 +227,7 @@ CODE
// At this point you've got the texture data and you need to upload that your your graphic system:
// After we have created the texture, store its pointer/identifier (_in whichever format your engine uses_) in 'io.Fonts->TexID'.
- // This will be passed back to your via the renderer. Basically ImTextureID == void*. Read FAQ below for details about ImTextureID.
+ // This will be passed back to your via the renderer. Basically ImTextureID == void*. Read FAQ for details about ImTextureID.
MyTexture* texture = MyEngine::CreateTextureFromMemoryPixels(pixels, width, height, TEXTURE_TYPE_RGBA32)
io.Fonts->TexID = (void*)texture;
@@ -228,16 +244,16 @@ CODE
io.MouseDown[1] = my_mouse_buttons[1];
// Call NewFrame(), after this point you can use ImGui::* functions anytime
- // (So you want to try calling NewFrame() as early as you can in your mainloop to be able to use imgui everywhere)
+ // (So you want to try calling NewFrame() as early as you can in your mainloop to be able to use Dear ImGui everywhere)
ImGui::NewFrame();
// Most of your application code here
ImGui::Text("Hello, world!");
- MyGameUpdate(); // may use any ImGui functions, e.g. ImGui::Begin("My window"); ImGui::Text("Hello, world!"); ImGui::End();
- MyGameRender(); // may use any ImGui functions as well!
+ MyGameUpdate(); // may use any Dear ImGui functions, e.g. ImGui::Begin("My window"); ImGui::Text("Hello, world!"); ImGui::End();
+ MyGameRender(); // may use any Dear ImGui functions as well!
- // Render imgui, swap buffers
- // (You want to try calling EndFrame/Render as late as you can, to be able to use imgui in your own game rendering code)
+ // Render dear imgui, swap buffers
+ // (You want to try calling EndFrame/Render as late as you can, to be able to use Dear ImGui in your own game rendering code)
ImGui::EndFrame();
ImGui::Render();
ImDrawData* draw_data = ImGui::GetDrawData();
@@ -249,17 +265,18 @@ CODE
ImGui::DestroyContext();
HOW A SIMPLE RENDERING FUNCTION MAY LOOK LIKE
-
+ ---------------------------------------------
void void MyImGuiRenderFunction(ImDrawData* draw_data)
{
// TODO: Setup render state: alpha-blending enabled, no face culling, no depth testing, scissor enabled
- // TODO: Setup viewport using draw_data->DisplaySize
+ // TODO: Setup viewport covering draw_data->DisplayPos to draw_data->DisplayPos + draw_data->DisplaySize
// TODO: Setup orthographic projection matrix cover draw_data->DisplayPos to draw_data->DisplayPos + draw_data->DisplaySize
// TODO: Setup shader: vertex { float2 pos, float2 uv, u32 color }, fragment shader sample color from 1 texture, multiply by vertex color.
for (int n = 0; n < draw_data->CmdListsCount; n++)
{
- const ImDrawVert* vtx_buffer = cmd_list->VtxBuffer.Data; // vertex buffer generated by ImGui
- const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data; // index buffer generated by ImGui
+ const ImDrawList* cmd_list = draw_data->CmdLists[n];
+ const ImDrawVert* vtx_buffer = cmd_list->VtxBuffer.Data; // vertex buffer generated by Dear ImGui
+ const ImDrawIdx* idx_buffer = cmd_list->IdxBuffer.Data; // index buffer generated by Dear ImGui
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
{
const ImDrawCmd* pcmd = &cmd_list->CmdBuffer[cmd_i];
@@ -270,7 +287,7 @@ CODE
else
{
// The texture for the draw call is specified by pcmd->TextureId.
- // The vast majority of draw calls will use the imgui texture atlas, which value you have set yourself during initialization.
+ // The vast majority of draw calls will use the Dear ImGui texture atlas, which value you have set yourself during initialization.
MyEngineBindTexture((MyTexture*)pcmd->TextureId);
// We are using scissoring to clip some objects. All low-level graphics API should supports it.
@@ -278,14 +295,14 @@ CODE
// (some elements visible outside their bounds) but you can fix that once everything else works!
// - Clipping coordinates are provided in imgui coordinates space (from draw_data->DisplayPos to draw_data->DisplayPos + draw_data->DisplaySize)
// In a single viewport application, draw_data->DisplayPos will always be (0,0) and draw_data->DisplaySize will always be == io.DisplaySize.
- // However, in the interest of supporting multi-viewport applications in the future (see 'viewport' branch on github),
+ // However, in the interest of supporting multi-viewport applications in the future (see 'viewport' branch on github),
// always subtract draw_data->DisplayPos from clipping bounds to convert them to your viewport space.
// - Note that pcmd->ClipRect contains Min+Max bounds. Some graphics API may use Min+Max, other may use Min+Size (size being Max-Min)
ImVec2 pos = draw_data->DisplayPos;
MyEngineScissor((int)(pcmd->ClipRect.x - pos.x), (int)(pcmd->ClipRect.y - pos.y), (int)(pcmd->ClipRect.z - pos.x), (int)(pcmd->ClipRect.w - pos.y));
// Render 'pcmd->ElemCount/3' indexed triangles.
- // By default the indices ImDrawIdx are 16-bits, you can change them to 32-bits in imconfig.h if your engine doesn't support 16-bits indices.
+ // By default the indices ImDrawIdx are 16-bit, you can change them to 32-bit in imconfig.h if your engine doesn't support 16-bit indices.
MyEngineDrawIndexedTriangles(pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer, vtx_buffer);
}
idx_buffer += pcmd->ElemCount;
@@ -295,16 +312,25 @@ CODE
- The examples/ folders contains many actual implementation of the pseudo-codes above.
- When calling NewFrame(), the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags are updated.
- They tell you if Dear ImGui intends to use your inputs. When a flag is set you want to hide the corresponding inputs
- from the rest of your application. In every cases you need to pass on the inputs to imgui. Refer to the FAQ for more information.
- - Please read the FAQ below!. Amusingly, it is called a FAQ because people frequently run into the same issues!
+ They tell you if Dear ImGui intends to use your inputs. When a flag is set you want to hide the corresponding inputs from the
+ rest of your application. In every cases you need to pass on the inputs to Dear ImGui.
+ - Refer to the FAQ for more information. Amusingly, it is called a FAQ because people frequently run into the same issues!
USING GAMEPAD/KEYBOARD NAVIGATION CONTROLS
-
- - The gamepad/keyboard navigation is fairly functional and keeps being improved.
- - Gamepad support is particularly useful to use dear imgui on a console system (e.g. PS4, Switch, XB1) without a mouse!
+ ------------------------------------------
+ - The gamepad/keyboard navigation is fairly functional and keeps being improved.
+ - Gamepad support is particularly useful to use Dear ImGui on a console system (e.g. PS4, Switch, XB1) without a mouse!
- You can ask questions and report issues at https://github.com/ocornut/imgui/issues/787
- The initial focus was to support game controllers, but keyboard is becoming increasingly and decently usable.
+ - Keyboard:
+ - Set io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard to enable.
+ NewFrame() will automatically fill io.NavInputs[] based on your io.KeysDown[] + io.KeyMap[] arrays.
+ - When keyboard navigation is active (io.NavActive + ImGuiConfigFlags_NavEnableKeyboard), the io.WantCaptureKeyboard flag
+ will be set. For more advanced uses, you may want to read from:
+ - io.NavActive: true when a window is focused and it doesn't have the ImGuiWindowFlags_NoNavInputs flag set.
+ - io.NavVisible: true when the navigation cursor is visible (and usually goes false when mouse is used).
+ - or query focus information with e.g. IsWindowFocused(ImGuiFocusedFlags_AnyWindow), IsItemFocused() etc. functions.
+ Please reach out if you think the game vs navigation input sharing could be improved.
- Gamepad:
- Set io.ConfigFlags |= ImGuiConfigFlags_NavEnableGamepad to enable.
- Backend: Set io.BackendFlags |= ImGuiBackendFlags_HasGamepad + fill the io.NavInputs[] fields before calling NewFrame().
@@ -316,15 +342,6 @@ CODE
- You can download PNG/PSD files depicting the gamepad controls for common controllers at: http://goo.gl/9LgVZW.
- If you need to share inputs between your game and the imgui parts, the easiest approach is to go all-or-nothing, with a buttons combo
to toggle the target. Please reach out if you think the game vs navigation input sharing could be improved.
- - Keyboard:
- - Set io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard to enable.
- NewFrame() will automatically fill io.NavInputs[] based on your io.KeysDown[] + io.KeyMap[] arrays.
- - When keyboard navigation is active (io.NavActive + ImGuiConfigFlags_NavEnableKeyboard), the io.WantCaptureKeyboard flag
- will be set. For more advanced uses, you may want to read from:
- - io.NavActive: true when a window is focused and it doesn't have the ImGuiWindowFlags_NoNavInputs flag set.
- - io.NavVisible: true when the navigation cursor is visible (and usually goes false when mouse is used).
- - or query focus information with e.g. IsWindowFocused(ImGuiFocusedFlags_AnyWindow), IsItemFocused() etc. functions.
- Please reach out if you think the game vs navigation input sharing could be improved.
- Mouse:
- PS4 users: Consider emulating a mouse cursor with DualShock4 touch pad or a spare analog stick as a mouse-emulation fallback.
- Consoles/Tablet/Phone users: Consider using a Synergy 1.x server (on your PC) + uSynergy.c (on your console/tablet/phone app) to share your PC mouse/keyboard.
@@ -345,9 +362,56 @@ CODE
When you are not sure about a old symbol or function name, try using the Search/Find function of your IDE to look for comments or references in all imgui files.
You can read releases logs https://github.com/ocornut/imgui/releases for more details.
- - 2018/10/12 (1.66) - Renamed misc/stl/imgui_stl.* to misc/cpp/imgui_stdlib.* in prevision for other C++ helper files.
+ - 2020/01/22 (1.75) - ImDrawList::AddCircle()/AddCircleFilled() functions don't accept negative radius any more.
+ - 2019/12/17 (1.75) - made Columns() limited to 64 columns by asserting above that limit. While the current code technically supports it, future code may not so we're putting the restriction ahead.
+ - 2019/12/13 (1.75) - [imgui_internal.h] changed ImRect() default constructor initializes all fields to 0.0f instead of (FLT_MAX,FLT_MAX,-FLT_MAX,-FLT_MAX). If you used ImRect::Add() to create bounding boxes by adding multiple points into it, you may need to fix your initial value.
+ - 2019/12/08 (1.75) - removed redirecting functions/enums that were marked obsolete in 1.53 (December 2017):
+ - ShowTestWindow() -> use ShowDemoWindow()
+ - IsRootWindowFocused() -> use IsWindowFocused(ImGuiFocusedFlags_RootWindow)
+ - IsRootWindowOrAnyChildFocused() -> use IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows)
+ - SetNextWindowContentWidth(w) -> use SetNextWindowContentSize(ImVec2(w, 0.0f)
+ - GetItemsLineHeightWithSpacing() -> use GetFrameHeightWithSpacing()
+ - ImGuiCol_ChildWindowBg -> use ImGuiCol_ChildBg
+ - ImGuiStyleVar_ChildWindowRounding -> use ImGuiStyleVar_ChildRounding
+ - ImGuiTreeNodeFlags_AllowOverlapMode -> use ImGuiTreeNodeFlags_AllowItemOverlap
+ - IMGUI_DISABLE_TEST_WINDOWS -> use IMGUI_DISABLE_DEMO_WINDOWS
+ - 2019/12/08 (1.75) - obsoleted calling ImDrawList::PrimReserve() with a negative count (which was the vaguely documented and rarely if ever used). Instead we added an explicit PrimUnreserve() API.
+ - 2019/12/06 (1.75) - removed implicit default parameter to IsMouseDragging(int button = 0) to be consistent with other mouse functions (none of the other functions have it).
+ - 2019/11/21 (1.74) - ImFontAtlas::AddCustomRectRegular() now requires an ID larger than 0x110000 (instead of 0x10000) to conform with supporting Unicode planes 1-16 in a future update. ID below 0x110000 will now assert.
+ - 2019/11/19 (1.74) - renamed IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS to IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS for consistency.
+ - 2019/11/19 (1.74) - renamed IMGUI_DISABLE_MATH_FUNCTIONS to IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS for consistency.
+ - 2019/10/22 (1.74) - removed redirecting functions/enums that were marked obsolete in 1.52 (October 2017):
+ - Begin() [old 5 args version] -> use Begin() [3 args], use SetNextWindowSize() SetNextWindowBgAlpha() if needed
+ - IsRootWindowOrAnyChildHovered() -> use IsWindowHovered(ImGuiHoveredFlags_RootAndChildWindows)
+ - AlignFirstTextHeightToWidgets() -> use AlignTextToFramePadding()
+ - SetNextWindowPosCenter() -> use SetNextWindowPos() with a pivot of (0.5f, 0.5f)
+ - ImFont::Glyph -> use ImFontGlyph
+ - 2019/10/14 (1.74) - inputs: Fixed a miscalculation in the keyboard/mouse "typematic" repeat delay/rate calculation, used by keys and e.g. repeating mouse buttons as well as the GetKeyPressedAmount() function.
+ if you were using a non-default value for io.KeyRepeatRate (previous default was 0.250), you can add +io.KeyRepeatDelay to it to compensate for the fix.
+ The function was triggering on: 0.0 and (delay+rate*N) where (N>=1). Fixed formula responds to (N>=0). Effectively it made io.KeyRepeatRate behave like it was set to (io.KeyRepeatRate + io.KeyRepeatDelay).
+ If you never altered io.KeyRepeatRate nor used GetKeyPressedAmount() this won't affect you.
+ - 2019/07/15 (1.72) - removed TreeAdvanceToLabelPos() which is rarely used and only does SetCursorPosX(GetCursorPosX() + GetTreeNodeToLabelSpacing()). Kept redirection function (will obsolete).
+ - 2019/07/12 (1.72) - renamed ImFontAtlas::CustomRect to ImFontAtlasCustomRect. Kept redirection typedef (will obsolete).
+ - 2019/06/14 (1.72) - removed redirecting functions/enums names that were marked obsolete in 1.51 (June 2017): ImGuiCol_Column*, ImGuiSetCond_*, IsItemHoveredRect(), IsPosHoveringAnyWindow(), IsMouseHoveringAnyWindow(), IsMouseHoveringWindow(), IMGUI_ONCE_UPON_A_FRAME. Grep this log for details and new names, or see how they were implemented until 1.71.
+ - 2019/06/07 (1.71) - rendering of child window outer decorations (bg color, border, scrollbars) is now performed as part of the parent window. If you have
+ overlapping child windows in a same parent, and relied on their relative z-order to be mapped to their submission order, this will affect your rendering.
+ This optimization is disabled if the parent window has no visual output, because it appears to be the most common situation leading to the creation of overlapping child windows.
+ Please reach out if you are affected.
+ - 2019/05/13 (1.71) - renamed SetNextTreeNodeOpen() to SetNextItemOpen(). Kept inline redirection function (will obsolete).
+ - 2019/05/11 (1.71) - changed io.AddInputCharacter(unsigned short c) signature to io.AddInputCharacter(unsigned int c).
+ - 2019/04/29 (1.70) - improved ImDrawList thick strokes (>1.0f) preserving correct thickness up to 90 degrees angles (e.g. rectangles). If you have custom rendering using thick lines, they will appear thicker now.
+ - 2019/04/29 (1.70) - removed GetContentRegionAvailWidth(), use GetContentRegionAvail().x instead. Kept inline redirection function (will obsolete).
+ - 2019/03/04 (1.69) - renamed GetOverlayDrawList() to GetForegroundDrawList(). Kept redirection function (will obsolete).
+ - 2019/02/26 (1.69) - renamed ImGuiColorEditFlags_RGB/ImGuiColorEditFlags_HSV/ImGuiColorEditFlags_HEX to ImGuiColorEditFlags_DisplayRGB/ImGuiColorEditFlags_DisplayHSV/ImGuiColorEditFlags_DisplayHex. Kept redirection enums (will obsolete).
+ - 2019/02/14 (1.68) - made it illegal/assert when io.DisplayTime == 0.0f (with an exception for the first frame). If for some reason your time step calculation gives you a zero value, replace it with a dummy small value!
+ - 2019/02/01 (1.68) - removed io.DisplayVisibleMin/DisplayVisibleMax (which were marked obsolete and removed from viewport/docking branch already).
+ - 2019/01/06 (1.67) - renamed io.InputCharacters[], marked internal as was always intended. Please don't access directly, and use AddInputCharacter() instead!
+ - 2019/01/06 (1.67) - renamed ImFontAtlas::GlyphRangesBuilder to ImFontGlyphRangesBuilder. Kept redirection typedef (will obsolete).
+ - 2018/12/20 (1.67) - made it illegal to call Begin("") with an empty string. This somehow half-worked before but had various undesirable side-effects.
+ - 2018/12/10 (1.67) - renamed io.ConfigResizeWindowsFromEdges to io.ConfigWindowsResizeFromEdges as we are doing a large pass on configuration flags.
+ - 2018/10/12 (1.66) - renamed misc/stl/imgui_stl.* to misc/cpp/imgui_stdlib.* in prevision for other C++ helper files.
- 2018/09/28 (1.66) - renamed SetScrollHere() to SetScrollHereY(). Kept redirection function (will obsolete).
- - 2018/09/06 (1.65) - renamed stb_truetype.h to imstb_truetype.h, stb_textedit.h to imstb_textedit.h, and stb_rect_pack.h to imstb_rectpack.h.
+ - 2018/09/06 (1.65) - renamed stb_truetype.h to imstb_truetype.h, stb_textedit.h to imstb_textedit.h, and stb_rect_pack.h to imstb_rectpack.h.
If you were conveniently using the imgui copy of those STB headers in your project you will have to update your include paths.
- 2018/09/05 (1.65) - renamed io.OptCursorBlink/io.ConfigCursorBlink to io.ConfigInputTextCursorBlink. (#1427)
- 2018/08/31 (1.64) - added imgui_widgets.cpp file, extracted and moved widgets code out of imgui.cpp into imgui_widgets.cpp. Re-ordered some of the code remaining in imgui.cpp.
@@ -356,12 +420,16 @@ CODE
- 2018/08/22 (1.63) - renamed IsItemDeactivatedAfterChange() to IsItemDeactivatedAfterEdit() for consistency with new IsItemEdited() API. Kept redirection function (will obsolete soonish as IsItemDeactivatedAfterChange() is very recent).
- 2018/08/21 (1.63) - renamed ImGuiTextEditCallback to ImGuiInputTextCallback, ImGuiTextEditCallbackData to ImGuiInputTextCallbackData for consistency. Kept redirection types (will obsolete).
- 2018/08/21 (1.63) - removed ImGuiInputTextCallbackData::ReadOnly since it is a duplication of (ImGuiInputTextCallbackData::Flags & ImGuiInputTextFlags_ReadOnly).
- - 2018/08/01 (1.63) - removed per-window ImGuiWindowFlags_ResizeFromAnySide beta flag in favor of a global io.ConfigResizeWindowsFromEdges to enable the feature.
+ - 2018/08/01 (1.63) - removed per-window ImGuiWindowFlags_ResizeFromAnySide beta flag in favor of a global io.ConfigResizeWindowsFromEdges [update 1.67 renamed to ConfigWindowsResizeFromEdges] to enable the feature.
- 2018/08/01 (1.63) - renamed io.OptCursorBlink to io.ConfigCursorBlink [-> io.ConfigInputTextCursorBlink in 1.65], io.OptMacOSXBehaviors to ConfigMacOSXBehaviors for consistency.
- 2018/07/22 (1.63) - changed ImGui::GetTime() return value from float to double to avoid accumulating floating point imprecisions over time.
- 2018/07/08 (1.63) - style: renamed ImGuiCol_ModalWindowDarkening to ImGuiCol_ModalWindowDimBg for consistency with other features. Kept redirection enum (will obsolete).
+ - 2018/06/08 (1.62) - examples: the imgui_impl_xxx files have been split to separate platform (Win32, Glfw, SDL2, etc.) from renderer (DX11, OpenGL, Vulkan, etc.).
+ old bindings will still work as is, however prefer using the separated bindings as they will be updated to support multi-viewports.
+ when adopting new bindings follow the main.cpp code of your preferred examples/ folder to know which functions to call.
+ in particular, note that old bindings called ImGui::NewFrame() at the end of their ImGui_ImplXXXX_NewFrame() function.
- 2018/06/06 (1.62) - renamed GetGlyphRangesChinese() to GetGlyphRangesChineseFull() to distinguish other variants and discourage using the full set.
- - 2018/06/06 (1.62) - TreeNodeEx()/TreeNodeBehavior(): the ImGuiTreeNodeFlags_CollapsingHeader helper now include the ImGuiTreeNodeFlags_NoTreePushOnOpen flag. See Changelog for details.
+ - 2018/06/06 (1.62) - TreeNodeEx()/TreeNodeBehavior(): the ImGuiTreeNodeFlags_CollapsingHeader helper now include the ImGuiTreeNodeFlags_NoTreePushOnOpen flag. See Changelog for details.
- 2018/05/03 (1.61) - DragInt(): the default compile-time format string has been changed from "%.0f" to "%d", as we are not using integers internally any more.
If you used DragInt() with custom format strings, make sure you change them to use %d or an integer-compatible format.
To honor backward-compatibility, the DragInt() code will currently parse and modify format strings to replace %*f with %d, giving time to users to upgrade their code.
@@ -406,8 +474,12 @@ CODE
- 2017/10/20 (1.52) - changed IsWindowHovered() default parameters behavior to return false if an item is active in another window (e.g. click-dragging item from another window to this window). You can use the newly introduced IsWindowHovered() flags to requests this specific behavior if you need it.
- 2017/10/20 (1.52) - marked IsItemHoveredRect()/IsMouseHoveringWindow() as obsolete, in favor of using the newly introduced flags for IsItemHovered() and IsWindowHovered(). See https://github.com/ocornut/imgui/issues/1382 for details.
removed the IsItemRectHovered()/IsWindowRectHovered() names introduced in 1.51 since they were merely more consistent names for the two functions we are now obsoleting.
+ IsItemHoveredRect() --> IsItemHovered(ImGuiHoveredFlags_RectOnly)
+ IsMouseHoveringAnyWindow() --> IsWindowHovered(ImGuiHoveredFlags_AnyWindow)
+ IsMouseHoveringWindow() --> IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem) [weird, old behavior]
- 2017/10/17 (1.52) - marked the old 5-parameters version of Begin() as obsolete (still available). Use SetNextWindowSize()+Begin() instead!
- 2017/10/11 (1.52) - renamed AlignFirstTextHeightToWidgets() to AlignTextToFramePadding(). Kept inline redirection function (will obsolete).
+ - 2017/09/26 (1.52) - renamed ImFont::Glyph to ImFontGlyph. Kept redirection typedef (will obsolete).
- 2017/09/25 (1.52) - removed SetNextWindowPosCenter() because SetNextWindowPos() now has the optional pivot information to do the same and more. Kept redirection function (will obsolete).
- 2017/08/25 (1.52) - io.MousePos needs to be set to ImVec2(-FLT_MAX,-FLT_MAX) when mouse is unavailable/missing. Previously ImVec2(-1,-1) was enough but we now accept negative mouse coordinates. In your binding if you need to support unavailable mouse, make sure to replace "io.MousePos = ImVec2(-1,-1)" with "io.MousePos = ImVec2(-FLT_MAX,-FLT_MAX)".
- 2017/08/22 (1.51) - renamed IsItemHoveredRect() to IsItemRectHovered(). Kept inline redirection function (will obsolete). -> (1.52) use IsItemHovered(ImGuiHoveredFlags_RectOnly)!
@@ -415,10 +487,10 @@ CODE
- renamed IsMouseHoveringWindow() to IsWindowRectHovered() for consistency. Kept inline redirection function (will obsolete).
- 2017/08/20 (1.51) - renamed GetStyleColName() to GetStyleColorName() for consistency.
- 2017/08/20 (1.51) - added PushStyleColor(ImGuiCol idx, ImU32 col) overload, which _might_ cause an "ambiguous call" compilation error if you are using ImColor() with implicit cast. Cast to ImU32 or ImVec4 explicily to fix.
- - 2017/08/15 (1.51) - marked the weird IMGUI_ONCE_UPON_A_FRAME helper macro as obsolete. prefer using the more explicit ImGuiOnceUponAFrame.
+ - 2017/08/15 (1.51) - marked the weird IMGUI_ONCE_UPON_A_FRAME helper macro as obsolete. prefer using the more explicit ImGuiOnceUponAFrame type.
- 2017/08/15 (1.51) - changed parameter order for BeginPopupContextWindow() from (const char*,int buttons,bool also_over_items) to (const char*,int buttons,bool also_over_items). Note that most calls relied on default parameters completely.
- - 2017/08/13 (1.51) - renamed ImGuiCol_Columns*** to ImGuiCol_Separator***. Kept redirection enums (will obsolete).
- - 2017/08/11 (1.51) - renamed ImGuiSetCond_*** types and flags to ImGuiCond_***. Kept redirection enums (will obsolete).
+ - 2017/08/13 (1.51) - renamed ImGuiCol_Column to ImGuiCol_Separator, ImGuiCol_ColumnHovered to ImGuiCol_SeparatorHovered, ImGuiCol_ColumnActive to ImGuiCol_SeparatorActive. Kept redirection enums (will obsolete).
+ - 2017/08/11 (1.51) - renamed ImGuiSetCond_Always to ImGuiCond_Always, ImGuiSetCond_Once to ImGuiCond_Once, ImGuiSetCond_FirstUseEver to ImGuiCond_FirstUseEver, ImGuiSetCond_Appearing to ImGuiCond_Appearing. Kept redirection enums (will obsolete).
- 2017/08/09 (1.51) - removed ValueColor() helpers, they are equivalent to calling Text(label) + SameLine() + ColorButton().
- 2017/08/08 (1.51) - removed ColorEditMode() and ImGuiColorEditMode in favor of ImGuiColorEditFlags and parameters to the various Color*() functions. The SetColorEditOptions() allows to initialize default but the user can still change them with right-click context menu.
- changed prototype of 'ColorEdit4(const char* label, float col[4], bool show_alpha = true)' to 'ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flags = 0)', where passing flags = 0x01 is a safe no-op (hello dodgy backward compatibility!). - check and run the demo window, under "Color/Picker Widgets", to understand the various new options.
@@ -431,14 +503,9 @@ CODE
- 2016/09/25 (1.50) - style.WindowTitleAlign is now a ImVec2 (ImGuiAlign enum was removed). set to (0.5f,0.5f) for horizontal+vertical centering, (0.0f,0.0f) for upper-left, etc.
- 2016/07/30 (1.50) - SameLine(x) with x>0.0f is now relative to left of column/group if any, and not always to left of window. This was sort of always the intent and hopefully breakage should be minimal.
- 2016/05/12 (1.49) - title bar (using ImGuiCol_TitleBg/ImGuiCol_TitleBgActive colors) isn't rendered over a window background (ImGuiCol_WindowBg color) anymore.
- If your TitleBg/TitleBgActive alpha was 1.0f or you are using the default theme it will not affect you.
- If your TitleBg/TitleBgActive alpha was <1.0f you need to tweak your custom theme to readjust for the fact that we don't draw a WindowBg background behind the title bar.
- This helper function will convert an old TitleBg/TitleBgActive color into a new one with the same visual output, given the OLD color and the OLD WindowBg color.
- ImVec4 ConvertTitleBgCol(const ImVec4& win_bg_col, const ImVec4& title_bg_col)
- {
- float new_a = 1.0f - ((1.0f - win_bg_col.w) * (1.0f - title_bg_col.w)), k = title_bg_col.w / new_a;
- return ImVec4((win_bg_col.x * win_bg_col.w + title_bg_col.x) * k, (win_bg_col.y * win_bg_col.w + title_bg_col.y) * k, (win_bg_col.z * win_bg_col.w + title_bg_col.z) * k, new_a);
- }
+ If your TitleBg/TitleBgActive alpha was 1.0f or you are using the default theme it will not affect you, otherwise if <1.0f you need tweak your custom theme to readjust for the fact that we don't draw a WindowBg background behind the title bar.
+ This helper function will convert an old TitleBg/TitleBgActive color into a new one with the same visual output, given the OLD color and the OLD WindowBg color:
+ ImVec4 ConvertTitleBgCol(const ImVec4& win_bg_col, const ImVec4& title_bg_col) { float new_a = 1.0f - ((1.0f - win_bg_col.w) * (1.0f - title_bg_col.w)), k = title_bg_col.w / new_a; return ImVec4((win_bg_col.x * win_bg_col.w + title_bg_col.x) * k, (win_bg_col.y * win_bg_col.w + title_bg_col.y) * k, (win_bg_col.z * win_bg_col.w + title_bg_col.z) * k, new_a); }
If this is confusing, pick the RGB value from title bar from an old screenshot and apply this as TitleBg/TitleBgActive. Or you may just create TitleBgActive from a tweaked TitleBg color.
- 2016/05/07 (1.49) - removed confusing set of GetInternalState(), GetInternalStateSize(), SetInternalState() functions. Now using CreateContext(), DestroyContext(), GetCurrentContext(), SetCurrentContext().
- 2016/05/02 (1.49) - renamed SetNextTreeNodeOpened() to SetNextTreeNodeOpen(), no redirection.
@@ -465,7 +532,7 @@ CODE
- the signature of the io.RenderDrawListsFn handler has changed!
old: ImGui_XXXX_RenderDrawLists(ImDrawList** const cmd_lists, int cmd_lists_count)
new: ImGui_XXXX_RenderDrawLists(ImDrawData* draw_data).
- argument: 'cmd_lists' becomes 'draw_data->CmdLists', 'cmd_lists_count' becomes 'draw_data->CmdListsCount'
+ parameters: 'cmd_lists' becomes 'draw_data->CmdLists', 'cmd_lists_count' becomes 'draw_data->CmdListsCount'
ImDrawList: 'commands' becomes 'CmdBuffer', 'vtx_buffer' becomes 'VtxBuffer', 'IdxBuffer' is new.
ImDrawCmd: 'vtx_count' becomes 'ElemCount', 'clip_rect' becomes 'ClipRect', 'user_callback' becomes 'UserCallback', 'texture_id' becomes 'TextureId'.
- each ImDrawList now contains both a vertex buffer and an index buffer. For each command, render ElemCount/3 triangles using indices from the index buffer.
@@ -497,14 +564,13 @@ CODE
- 2015/02/01 (1.31) - removed IO.MemReallocFn (unused)
- 2015/01/19 (1.30) - renamed ImGuiStorage::GetIntPtr()/GetFloatPtr() to GetIntRef()/GetIntRef() because Ptr was conflicting with actual pointer storage functions.
- 2015/01/11 (1.30) - big font/image API change! now loads TTF file. allow for multiple fonts. no need for a PNG loader.
- (1.30) - removed GetDefaultFontData(). uses io.Fonts->GetTextureData*() API to retrieve uncompressed pixels.
- font init: const void* png_data; unsigned int png_size; ImGui::GetDefaultFontData(NULL, NULL, &png_data, &png_size); <..Upload texture to GPU..>
- became: unsigned char* pixels; int width, height; io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); <..Upload texture to GPU>; io.Fonts->TexId = YourTextureIdentifier;
- you now more flexibility to load multiple TTF fonts and manage the texture buffer for internal needs.
- it is now recommended that you sample the font texture with bilinear interpolation.
- (1.30) - added texture identifier in ImDrawCmd passed to your render function (we can now render images). make sure to set io.Fonts->TexID.
- (1.30) - removed IO.PixelCenterOffset (unnecessary, can be handled in user projection matrix)
- (1.30) - removed ImGui::IsItemFocused() in favor of ImGui::IsItemActive() which handles all widgets
+ - 2015/01/11 (1.30) - removed GetDefaultFontData(). uses io.Fonts->GetTextureData*() API to retrieve uncompressed pixels.
+ - old: const void* png_data; unsigned int png_size; ImGui::GetDefaultFontData(NULL, NULL, &png_data, &png_size); [..Upload texture to GPU..];
+ - new: unsigned char* pixels; int width, height; io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); [..Upload texture to GPU..]; io.Fonts->TexId = YourTexIdentifier;
+ you now have more flexibility to load multiple TTF fonts and manage the texture buffer for internal needs. It is now recommended that you sample the font texture with bilinear interpolation.
+ - 2015/01/11 (1.30) - added texture identifier in ImDrawCmd passed to your render function (we can now render images). make sure to set io.Fonts->TexID.
+ - 2015/01/11 (1.30) - removed IO.PixelCenterOffset (unnecessary, can be handled in user projection matrix)
+ - 2015/01/11 (1.30) - removed ImGui::IsItemFocused() in favor of ImGui::IsItemActive() which handles all widgets
- 2014/12/10 (1.18) - removed SetNewWindowDefaultPos() in favor of new generic API SetNextWindowPos(pos, ImGuiSetCondition_FirstUseEver)
- 2014/11/28 (1.17) - moved IO.Font*** options to inside the IO.Font-> structure (FontYOffset, FontTexUvForWhite, FontBaseScale, FontFallbackGlyph)
- 2014/11/26 (1.17) - reworked syntax of IMGUI_ONCE_UPON_A_FRAME helper macro to increase compiler compatibility
@@ -518,117 +584,56 @@ CODE
- 2014/08/28 (1.09) - changed the behavior of IO.PixelCenterOffset following various rendering fixes
- FREQUENTLY ASKED QUESTIONS (FAQ), TIPS
- ======================================
-
- Q: How can I tell whether to dispatch mouse/keyboard to imgui or to my application?
- A: You can read the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags from the ImGuiIO structure (e.g. if (ImGui::GetIO().WantCaptureMouse) { ... } )
- - When 'io.WantCaptureMouse' is set, imgui wants to use your mouse state, and you may want to discard/hide the inputs from the rest of your application.
- - When 'io.WantCaptureKeyboard' is set, imgui wants to use your keyboard state, and you may want to discard/hide the inputs from the rest of your application.
- - When 'io.WantTextInput' is set to may want to notify your OS to popup an on-screen keyboard, if available (e.g. on a mobile phone, or console OS).
- Note: you should always pass your mouse/keyboard inputs to imgui, even when the io.WantCaptureXXX flag are set false.
- This is because imgui needs to detect that you clicked in the void to unfocus its own windows.
- Note: The 'io.WantCaptureMouse' is more accurate that any attempt to "check if the mouse is hovering a window" (don't do that!).
- It handle mouse dragging correctly (both dragging that started over your application or over an imgui window) and handle e.g. modal windows blocking inputs.
- Those flags are updated by ImGui::NewFrame(). Preferably read the flags after calling NewFrame() if you can afford it, but reading them before is also
- perfectly fine, as the bool toggle fairly rarely. If you have on a touch device, you might find use for an early call to UpdateHoveredWindowAndCaptureFlags().
- Note: Text input widget releases focus on "Return KeyDown", so the subsequent "Return KeyUp" event that your application receive will typically
- have 'io.WantCaptureKeyboard=false'. Depending on your application logic it may or not be inconvenient. You might want to track which key-downs
- were targeted for Dear ImGui, e.g. with an array of bool, and filter out the corresponding key-ups.)
+ FREQUENTLY ASKED QUESTIONS (FAQ)
+ ================================
- Q: How can I display an image? What is ImTextureID, how does it works?
- A: Short explanation:
- - You may use functions such as ImGui::Image(), ImGui::ImageButton() or lower-level ImDrawList::AddImage() to emit draw calls that will use your own textures.
- - Actual textures are identified in a way that is up to the user/engine. Those identifiers are stored and passed as ImTextureID (void*) value.
- - Loading image files from the disk and turning them into a texture is not within the scope of Dear ImGui (for a good reason).
- Please read documentations or tutorials on your graphics API to understand how to display textures on the screen before moving onward.
-
- Long explanation:
- - Dear ImGui's job is to create "meshes", defined in a renderer-agnostic format made of draw commands and vertices.
- At the end of the frame those meshes (ImDrawList) will be displayed by your rendering function. They are made up of textured polygons and the code
- to render them is generally fairly short (a few dozen lines). In the examples/ folder we provide functions for popular graphics API (OpenGL, DirectX, etc.).
- - Each rendering function decides on a data type to represent "textures". The concept of what is a "texture" is entirely tied to your underlying engine/graphics API.
- We carry the information to identify a "texture" in the ImTextureID type.
- ImTextureID is nothing more that a void*, aka 4/8 bytes worth of data: just enough to store 1 pointer or 1 integer of your choice.
- Dear ImGui doesn't know or understand what you are storing in ImTextureID, it merely pass ImTextureID values until they reach your rendering function.
- - In the examples/ bindings, for each graphics API binding we decided on a type that is likely to be a good representation for specifying
- an image from the end-user perspective. This is what the _examples_ rendering functions are using:
-
- OpenGL: ImTextureID = GLuint (see ImGui_ImplGlfwGL3_RenderDrawData() function in imgui_impl_glfw_gl3.cpp)
- DirectX9: ImTextureID = LPDIRECT3DTEXTURE9 (see ImGui_ImplDX9_RenderDrawData() function in imgui_impl_dx9.cpp)
- DirectX11: ImTextureID = ID3D11ShaderResourceView* (see ImGui_ImplDX11_RenderDrawData() function in imgui_impl_dx11.cpp)
- DirectX12: ImTextureID = D3D12_GPU_DESCRIPTOR_HANDLE (see ImGui_ImplDX12_RenderDrawData() function in imgui_impl_dx12.cpp)
-
- For example, in the OpenGL example binding we store raw OpenGL texture identifier (GLuint) inside ImTextureID.
- Whereas in the DirectX11 example binding we store a pointer to ID3D11ShaderResourceView inside ImTextureID, which is a higher-level structure
- tying together both the texture and information about its format and how to read it.
- - If you have a custom engine built over e.g. OpenGL, instead of passing GLuint around you may decide to use a high-level data type to carry information about
- the texture as well as how to display it (shaders, etc.). The decision of what to use as ImTextureID can always be made better knowing how your codebase
- is designed. If your engine has high-level data types for "textures" and "material" then you may want to use them.
- If you are starting with OpenGL or DirectX or Vulkan and haven't built much of a rendering engine over them, keeping the default ImTextureID
- representation suggested by the example bindings is probably the best choice.
- (Advanced users may also decide to keep a low-level type in ImTextureID, and use ImDrawList callback and pass information to their renderer)
-
- User code may do:
-
- // Cast our texture type to ImTextureID / void*
- MyTexture* texture = g_CoffeeTableTexture;
- ImGui::Image((void*)texture, ImVec2(texture->Width, texture->Height));
-
- The renderer function called after ImGui::Render() will receive that same value that the user code passed:
-
- // Cast ImTextureID / void* stored in the draw command as our texture type
- MyTexture* texture = (MyTexture*)pcmd->TextureId;
- MyEngineBindTexture2D(texture);
-
- Once you understand this design you will understand that loading image files and turning them into displayable textures is not within the scope of Dear ImGui.
- This is by design and is actually a good thing, because it means your code has full control over your data types and how you display them.
- If you want to display an image file (e.g. PNG file) into the screen, please refer to documentation and tutorials for the graphics API you are using.
-
- Here's a simplified OpenGL example using stb_image.h:
-
- // Use stb_image.h to load a PNG from disk and turn it into raw RGBA pixel data:
- #define STB_IMAGE_IMPLEMENTATION
- #include <stb_image.h>
- [...]
- int my_image_width, my_image_height;
- unsigned char* my_image_data = stbi_load("my_image.png", &my_image_width, &my_image_height, NULL, 4);
-
- // Turn the RGBA pixel data into an OpenGL texture:
- GLuint my_opengl_texture;
- glGenTextures(1, &my_opengl_texture);
- glBindTexture(GL_TEXTURE_2D, my_opengl_texture);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
- glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
- glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);
- glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, image_width, image_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image_data);
-
- // Now that we have an OpenGL texture, assuming our imgui rendering function (imgui_impl_xxx.cpp file) takes GLuint as ImTextureID, we can display it:
- ImGui::Image((void*)(intptr_t)my_opengl_texture, ImVec2(my_image_width, my_image_height));
-
- C/C++ tip: a void* is pointer-sized storage. You may safely store any pointer or integer into it by casting your value to ImTexture / void*, and vice-versa.
- Because both end-points (user code and rendering function) are under your control, you know exactly what is stored inside the ImTexture / void*.
- Examples:
-
- GLuint my_tex = XXX;
- void* my_void_ptr;
- my_void_ptr = (void*)(intptr_t)my_tex; // cast a GLuint into a void* (we don't take its address! we literally store the value inside the pointer)
- my_tex = (GLuint)(intptr_t)my_void_ptr; // cast a void* into a GLuint
-
- ID3D11ShaderResourceView* my_dx11_srv = XXX;
- void* my_void_ptr;
- my_void_ptr = (void*)my_dx11_srv; // cast a ID3D11ShaderResourceView* into an opaque void*
- my_dx11_srv = (ID3D11ShaderResourceView*)my_void_ptr; // cast a void* into a ID3D11ShaderResourceView*
-
- Finally, you may call ImGui::ShowMetricsWindow() to explore/visualize/understand how the ImDrawList are generated.
-
- Q: How can I have multiple widgets with the same label or without a label?
- Q: I have multiple widgets with the same label, and only the first one works. Why is that?
+ Read all answers online: https://www.dearimgui.org/faq, or in docs/FAQ.md (with a Markdown viewer)
+ Some answers are copied down here to facilitate searching in code.
+
+ Q&A: Basics
+ ===========
+
+ Q: Where is the documentation?
+ A: This library is poorly documented at the moment and expects of the user to be acquainted with C/C++.
+ - Run the examples/ and explore them.
+ - See demo code in imgui_demo.cpp and particularly the ImGui::ShowDemoWindow() function.
+ - The demo covers most features of Dear ImGui, so you can read the code and see its output.
+ - See documentation and comments at the top of imgui.cpp + effectively imgui.h.
+ - Dozens of standalone example applications using e.g. OpenGL/DirectX are provided in the
+ examples/ folder to explain how to integrate Dear ImGui with your own engine/application.
+ - The Wiki (https://github.com/ocornut/imgui/wiki) has many resources and links.
+ - The Glossary (https://github.com/ocornut/imgui/wiki/Glossary) page also may be useful.
+ - Your programming IDE is your friend, find the type or function declaration to find comments
+ associated to it.
+
+ Q: What is this library called?
+ Q: Which version should I get?
+ >> This library is called "Dear ImGui", please don't call it "ImGui" :)
+ >> See https://www.dearimgui.org/faq
+
+ Q&A: Integration
+ ================
+
+ Q: How can I tell whether to dispatch mouse/keyboard to Dear ImGui or to my application?
+ A: You should read the 'io.WantCaptureMouse', 'io.WantCaptureKeyboard' and 'io.WantTextInput' flags!
+ >> See https://www.dearimgui.org/faq for fully detailed answer. You really want to read this.
+
+ Q. How can I enable keyboard controls?
+ Q: How can I use this without a mouse, without a keyboard or without a screen? (gamepad, input share, remote display)
+ Q: I integrated Dear ImGui in my engine and the text or lines are blurry..
+ Q: I integrated Dear ImGui in my engine and some elements are clipping or disappearing when I move windows around..
+ >> See https://www.dearimgui.org/faq
+
+ Q&A: Usage
+ ----------
+
+ Q: Why are multiple widgets reacting when I interact with a single one?
+ Q: How can I have multiple widgets with the same label or with an empty label?
A: A primer on labels and the ID Stack...
Dear ImGui internally need to uniquely identify UI elements.
Elements that are typically not clickable (such as calls to the Text functions) don't need an ID.
- Interactive widgets (such as calls to Button buttons) need a unique ID.
+ Interactive widgets (such as calls to Button buttons) need a unique ID.
Unique ID are used internally to track active widgets and occasionally associate state to widgets.
Unique ID are implicitly built from the hash of multiple elements that identify the "path" to the UI element.
@@ -644,6 +649,9 @@ CODE
Begin("MyWindow");
Button("OK"); // Label = "OK", ID = hash of ("MyWindow", "OK")
End();
+ Begin("MyOtherWindow");
+ Button("OK"); // Label = "OK", ID = hash of ("MyOtherWindow", "OK")
+ End();
- If you have a same ID twice in the same location, you'll have a conflict:
@@ -672,8 +680,8 @@ CODE
you to animate labels. For example you may want to include varying information in a window title bar,
but windows are uniquely identified by their ID. Use "###" to pass a label that isn't part of ID:
- Button("Hello###ID"; // Label = "Hello", ID = hash of (..., "ID")
- Button("World###ID"; // Label = "World", ID = hash of (..., "ID") // Same as above, even though the label looks different
+ Button("Hello###ID"); // Label = "Hello", ID = hash of (..., "###ID")
+ Button("World###ID"); // Label = "World", ID = hash of (..., "###ID") // Same as above, even though the label looks different
sprintf(buf, "My game (%f FPS)###MyGame", fps);
Begin(buf); // Variable title, ID = hash of "MyGame"
@@ -683,47 +691,48 @@ CODE
within the same window. This is the most convenient way of distinguishing ID when iterating and
creating many UI elements programmatically.
You can push a pointer, a string or an integer value into the ID stack.
- Remember that ID are formed from the concatenation of _everything_ in the ID stack!
+ Remember that ID are formed from the concatenation of _everything_ pushed into the ID stack.
+ At each level of the stack we store the seed used for items at this level of the ID stack.
- Begin("Window");
+ Begin("Window");
for (int i = 0; i < 100; i++)
{
- PushID(i); // Push i to the id tack
- Button("Click"); // Label = "Click", ID = Hash of ("Window", i, "Click")
+ PushID(i); // Push i to the id tack
+ Button("Click"); // Label = "Click", ID = hash of ("Window", i, "Click")
PopID();
}
for (int i = 0; i < 100; i++)
{
MyObject* obj = Objects[i];
PushID(obj);
- Button("Click"); // Label = "Click", ID = Hash of ("Window", obj pointer, "Click")
+ Button("Click"); // Label = "Click", ID = hash of ("Window", obj pointer, "Click")
PopID();
}
for (int i = 0; i < 100; i++)
{
MyObject* obj = Objects[i];
PushID(obj->Name);
- Button("Click"); // Label = "Click", ID = Hash of ("Window", obj->Name, "Click")
+ Button("Click"); // Label = "Click", ID = hash of ("Window", obj->Name, "Click")
PopID();
}
End();
- - More example showing that you can stack multiple prefixes into the ID stack:
+ - You can stack multiple prefixes into the ID stack:
- Button("Click"); // Label = "Click", ID = hash of (..., "Click")
+ Button("Click"); // Label = "Click", ID = hash of (..., "Click")
PushID("node");
- Button("Click"); // Label = "Click", ID = hash of (..., "node", "Click")
+ Button("Click"); // Label = "Click", ID = hash of (..., "node", "Click")
PushID(my_ptr);
- Button("Click"); // Label = "Click", ID = hash of (..., "node", my_ptr, "Click")
+ Button("Click"); // Label = "Click", ID = hash of (..., "node", my_ptr, "Click")
PopID();
PopID();
- Tree nodes implicitly creates a scope for you by calling PushID().
- Button("Click"); // Label = "Click", ID = hash of (..., "Click")
- if (TreeNode("node"))
+ Button("Click"); // Label = "Click", ID = hash of (..., "Click")
+ if (TreeNode("node")) // <-- this function call will do a PushID() for you (unless instructed not to, with a special flag)
{
- Button("Click"); // Label = "Click", ID = hash of (..., "node", "Click")
+ Button("Click"); // Label = "Click", ID = hash of (..., "node", "Click")
TreePop();
}
@@ -734,116 +743,47 @@ CODE
e.g. when displaying a list of objects, using indices or pointers as ID will preserve the
node open/closed state differently. See what makes more sense in your situation!
- Q: How can I use my own math types instead of ImVec2/ImVec4?
- A: You can edit imconfig.h and setup the IM_VEC2_CLASS_EXTRA/IM_VEC4_CLASS_EXTRA macros to add implicit type conversions.
- This way you'll be able to use your own types everywhere, e.g. passsing glm::vec2 to ImGui functions instead of ImVec2.
+ Q: How can I display an image? What is ImTextureID, how does it works?
+ >> See https://www.dearimgui.org/faq and https://github.com/ocornut/imgui/wiki/Image-Loading-and-Displaying-Examples
- Q: How can I load a different font than the default?
- A: Use the font atlas to load the TTF/OTF file you want:
- ImGuiIO& io = ImGui::GetIO();
- io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels);
- io.Fonts->GetTexDataAsRGBA32() or GetTexDataAsAlpha8()
- Default is ProggyClean.ttf, rendered at size 13, embedded in dear imgui's source code.
- (Read the 'misc/fonts/README.txt' file for more details about font loading.)
-
- New programmers: remember that in C/C++ and most programming languages if you want to use a
- backslash \ within a string literal, you need to write it double backslash "\\":
- io.Fonts->AddFontFromFileTTF("MyDataFolder\MyFontFile.ttf", size_in_pixels); // WRONG (you are escape the M here!)
- io.Fonts->AddFontFromFileTTF("MyDataFolder\\MyFontFile.ttf", size_in_pixels); // CORRECT
- io.Fonts->AddFontFromFileTTF("MyDataFolder/MyFontFile.ttf", size_in_pixels); // ALSO CORRECT
+ Q: How can I use my own math types instead of ImVec2/ImVec4?
+ Q: How can I interact with standard C++ types (such as std::string and std::vector)?
+ Q: How can I display custom shapes? (using low-level ImDrawList API)
+ >> See https://www.dearimgui.org/faq
- Q: How can I easily use icons in my application?
- A: The most convenient and practical way is to merge an icon font such as FontAwesome inside you
- main font. Then you can refer to icons within your strings.
- (Read the 'misc/fonts/README.txt' file for more details about icons font loading.)
+ Q&A: Fonts, Text
+ ================
+ Q: How can I load a different font than the default?
+ Q: How can I easily use icons in my application?
Q: How can I load multiple fonts?
- A: Use the font atlas to pack them into a single texture:
- (Read the 'misc/fonts/README.txt' file and the code in ImFontAtlas for more details.)
-
- ImGuiIO& io = ImGui::GetIO();
- ImFont* font0 = io.Fonts->AddFontDefault();
- ImFont* font1 = io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels);
- ImFont* font2 = io.Fonts->AddFontFromFileTTF("myfontfile2.ttf", size_in_pixels);
- io.Fonts->GetTexDataAsRGBA32() or GetTexDataAsAlpha8()
- // the first loaded font gets used by default
- // use ImGui::PushFont()/ImGui::PopFont() to change the font at runtime
-
- // Options
- ImFontConfig config;
- config.OversampleH = 3;
- config.OversampleV = 1;
- config.GlyphOffset.y -= 2.0f; // Move everything by 2 pixels up
- config.GlyphExtraSpacing.x = 1.0f; // Increase spacing between characters
- io.Fonts->LoadFromFileTTF("myfontfile.ttf", size_pixels, &config);
-
- // Combine multiple fonts into one (e.g. for icon fonts)
- static ImWchar ranges[] = { 0xf000, 0xf3ff, 0 };
- ImFontConfig config;
- config.MergeMode = true;
- io.Fonts->AddFontDefault();
- io.Fonts->LoadFromFileTTF("fontawesome-webfont.ttf", 16.0f, &config, ranges); // Merge icon font
- io.Fonts->LoadFromFileTTF("myfontfile.ttf", size_pixels, NULL, &config, io.Fonts->GetGlyphRangesJapanese()); // Merge japanese glyphs
-
Q: How can I display and input non-Latin characters such as Chinese, Japanese, Korean, Cyrillic?
- A: When loading a font, pass custom Unicode ranges to specify the glyphs to load.
-
- // Add default Japanese ranges
- io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels, NULL, io.Fonts->GetGlyphRangesJapanese());
-
- // Or create your own custom ranges (e.g. for a game you can feed your entire game script and only build the characters the game need)
- ImVector<ImWchar> ranges;
- ImFontAtlas::GlyphRangesBuilder builder;
- builder.AddText("Hello world"); // Add a string (here "Hello world" contains 7 unique characters)
- builder.AddChar(0x7262); // Add a specific character
- builder.AddRanges(io.Fonts->GetGlyphRangesJapanese()); // Add one of the default ranges
- builder.BuildRanges(&ranges); // Build the final result (ordered ranges with all the unique characters submitted)
- io.Fonts->AddFontFromFileTTF("myfontfile.ttf", size_in_pixels, NULL, ranges.Data);
-
- All your strings needs to use UTF-8 encoding. In C++11 you can encode a string literal in UTF-8
- by using the u8"hello" syntax. Specifying literal in your source code using a local code page
- (such as CP-923 for Japanese or CP-1251 for Cyrillic) will NOT work!
- Otherwise you can convert yourself to UTF-8 or load text data from file already saved as UTF-8.
-
- Text input: it is up to your application to pass the right character code by calling io.AddInputCharacter().
- The applications in examples/ are doing that.
- Windows: you can use the WM_CHAR or WM_UNICHAR or WM_IME_CHAR message (depending if your app is built using Unicode or MultiByte mode).
- You may also use MultiByteToWideChar() or ToUnicode() to retrieve Unicode codepoints from MultiByte characters or keyboard state.
- Windows: if your language is relying on an Input Method Editor (IME), you copy the HWND of your window to io.ImeWindowHandle in order for
- the default implementation of io.ImeSetInputScreenPosFn() to set your Microsoft IME position correctly.
-
- Q: How can I use the drawing facilities without an ImGui window? (using ImDrawList API)
- A: - You can create a dummy window. Call Begin() with the NoBackground | NoDecoration | NoSavedSettings | NoInputs flags.
- (The ImGuiWindowFlags_NoDecoration flag itself is a shortcut for NoTitleBar | NoResize | NoScrollbar | NoCollapse)
- Then you can retrieve the ImDrawList* via GetWindowDrawList() and draw to it in any way you like.
- - You can call ImGui::GetOverlayDrawList() and use this draw list to display contents over every other imgui windows.
- - You can create your own ImDrawList instance. You'll need to initialize them ImGui::GetDrawListSharedData(), or create your own ImDrawListSharedData,
- and then call your rendered code with your own ImDrawList or ImDrawData data.
+ >> See https://www.dearimgui.org/faq and docs/FONTS.txt
- Q: I integrated Dear ImGui in my engine and the text or lines are blurry..
- A: In your Render function, try translating your projection matrix by (0.5f,0.5f) or (0.375f,0.375f).
- Also make sure your orthographic projection matrix and io.DisplaySize matches your actual framebuffer dimension.
+ Q&A: Concerns
+ =============
- Q: I integrated Dear ImGui in my engine and some elements are clipping or disappearing when I move windows around..
- A: You are probably mishandling the clipping rectangles in your render function.
- Rectangles provided by ImGui are defined as (x1=left,y1=top,x2=right,y2=bottom) and NOT as (x1,y1,width,height).
+ Q: Who uses Dear ImGui?
+ Q: Can you create elaborate/serious tools with Dear ImGui?
+ Q: Can you reskin the look of Dear ImGui?
+ Q: Why using C++ (as opposed to C)?
+ >> See https://www.dearimgui.org/faq
+
+ Q&A: Community
+ ==============
Q: How can I help?
- A: - If you are experienced with Dear ImGui and C++, look at the github issues, or docs/TODO.txt and see how you want/can help!
- - Convince your company to sponsor/fund development! Individual users: you can also become a Patron (patreon.com/imgui) or donate on PayPal! See README.
- - Disclose your usage of dear imgui via a dev blog post, a tweet, a screenshot, a mention somewhere etc.
- You may post screenshot or links in the gallery threads (github.com/ocornut/imgui/issues/1269). Visuals are ideal as they inspire other programmers.
+ A: - Businesses: please reach out to "contact AT dearimgui.org" if you work in a place using Dear ImGui!
+ We can discuss ways for your company to fund development via invoiced technical support, maintenance or sponsoring contacts.
+ This is among the most useful thing you can do for Dear ImGui. With increased funding we can hire more people working on this project.
+ - Individuals: you can support continued development via PayPal donations. See README.
+ - If you are experienced with Dear ImGui and C++, look at the github issues, look at the Wiki, read docs/TODO.txt
+ and see how you want to help and can help!
+ - Disclose your usage of Dear ImGui via a dev blog post, a tweet, a screenshot, a mention somewhere etc.
+ You may post screenshot or links in the gallery threads (github.com/ocornut/imgui/issues/2847). Visuals are ideal as they inspire other programmers.
But even without visuals, disclosing your use of dear imgui help the library grow credibility, and help other teams and programmers with taking decisions.
- If you have issues or if you need to hack into the library, even if you don't expect any support it is useful that you share your issues (on github or privately).
- - tip: you can call Begin() multiple times with the same name during the same frame, it will keep appending to the same window.
- this is also useful to set yourself in the context of another window (to get/set other settings)
- - tip: you can create widgets without a Begin()/End() block, they will go in an implicit window called "Debug".
- - tip: the ImGuiOnceUponAFrame helper will allow run the block of code only once a frame. You can use it to quickly add custom UI in the middle
- of a deep nested inner loop in your code.
- - tip: you can call Render() multiple times (e.g for VR renders).
- - tip: call and read the ShowDemoWindow() code in imgui_demo.cpp for more example of how to use ImGui!
-
*/
#if defined(_MSC_VER) && !defined(_CRT_SECURE_NO_WARNINGS)
@@ -851,12 +791,14 @@ CODE
#endif
#include "imgui.h"
+#ifndef IMGUI_DISABLE
+
#ifndef IMGUI_DEFINE_MATH_OPERATORS
#define IMGUI_DEFINE_MATH_OPERATORS
#endif
#include "imgui_internal.h"
-#include <ctype.h> // toupper, isprint
+#include <ctype.h> // toupper
#include <stdio.h> // vsnprintf, sscanf, printf
#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier
#include <stddef.h> // intptr_t
@@ -865,27 +807,39 @@ CODE
#endif
// Debug options
-#define IMGUI_DEBUG_NAV_SCORING 0
-#define IMGUI_DEBUG_NAV_RECTS 0
+#define IMGUI_DEBUG_NAV_SCORING 0 // Display navigation scoring preview when hovering items. Display last moving direction matches when holding CTRL
+#define IMGUI_DEBUG_NAV_RECTS 0 // Display the reference navigation rectangle for each window
+#define IMGUI_DEBUG_INI_SETTINGS 0 // Save additional comments in .ini file (particularly helps for Docking, but makes saving slower)
// Visual Studio warnings
#ifdef _MSC_VER
#pragma warning (disable: 4127) // condition expression is constant
#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen
+#if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later
+#pragma warning (disable: 5054) // operator '|': deprecated between enumerations of different types
+#endif
#endif
// Clang/GCC warnings with -Weverything
-#ifdef __clang__
+#if defined(__clang__)
#pragma clang diagnostic ignored "-Wunknown-pragmas" // warning : unknown warning group '-Wformat-pedantic *' // not all warnings are known by all clang versions.. so ignoring warnings triggers new warnings on some configuration. great!
#pragma clang diagnostic ignored "-Wold-style-cast" // warning : use of old-style cast // yes, they are more terse.
#pragma clang diagnostic ignored "-Wfloat-equal" // warning : comparing floating point with == or != is unsafe // storing and comparing against same constants (typically 0.0f) is ok.
#pragma clang diagnostic ignored "-Wformat-nonliteral" // warning : format string is not a string literal // passing non-literal to vsnformat(). yes, user passing incorrect format strings can crash the code.
#pragma clang diagnostic ignored "-Wexit-time-destructors" // warning : declaration requires an exit-time destructor // exit-time destruction order is undefined. if MemFree() leads to users code that has been disabled before exit it might cause problems. ImGui coding style welcomes static/globals.
-#pragma clang diagnostic ignored "-Wglobal-constructors" // warning : declaration requires a global destructor // similar to above, not sure what the exact difference it.
+#pragma clang diagnostic ignored "-Wglobal-constructors" // warning : declaration requires a global destructor // similar to above, not sure what the exact difference is.
#pragma clang diagnostic ignored "-Wsign-conversion" // warning : implicit conversion changes signedness //
#pragma clang diagnostic ignored "-Wformat-pedantic" // warning : format specifies type 'void *' but the argument has type 'xxxx *' // unreasonable, would lead to casting every %p arg to void*. probably enabled by -pedantic.
-#pragma clang diagnostic ignored "-Wint-to-void-pointer-cast" // warning : cast to 'void *' from smaller integer type 'int'
+#pragma clang diagnostic ignored "-Wint-to-void-pointer-cast" // warning : cast to 'void *' from smaller integer type 'int'
+#if __has_warning("-Wzero-as-null-pointer-constant")
+#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning : zero as null pointer constant // some standard header variations use #define NULL 0
+#endif
+#if __has_warning("-Wdouble-promotion")
+#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double.
+#endif
#elif defined(__GNUC__)
+// We disable -Wpragmas because GCC doesn't provide an has_warning equivalent and some forks/patches may not following the warning/version association.
+#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
#pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used
#pragma GCC diagnostic ignored "-Wint-to-pointer-cast" // warning: cast to pointer from integer of different size
#pragma GCC diagnostic ignored "-Wformat" // warning: format '%p' expects argument of type 'void*', but argument 6 has type 'ImGuiWindow*'
@@ -893,42 +847,36 @@ CODE
#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value
#pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked
#pragma GCC diagnostic ignored "-Wstrict-overflow" // warning: assuming signed overflow does not occur when assuming that (X - c) > X is always false
-#if __GNUC__ >= 8
-#pragma GCC diagnostic ignored "-Wclass-memaccess" // warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
-#endif
+#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
#endif
// When using CTRL+TAB (or Gamepad Square+L/R) we delay the visual a little in order to reduce visual noise doing a fast switch.
static const float NAV_WINDOWING_HIGHLIGHT_DELAY = 0.20f; // Time before the highlight and screen dimming starts fading in
static const float NAV_WINDOWING_LIST_APPEAR_DELAY = 0.15f; // Time before the window list starts to appear
-// Window resizing from edges (when io.ConfigResizeWindowsFromEdges = true)
-static const float RESIZE_WINDOWS_FROM_EDGES_HALF_THICKNESS = 4.0f; // Extend outside and inside windows. Affect FindHoveredWindow().
-static const float RESIZE_WINDOWS_FROM_EDGES_FEEDBACK_TIMER = 0.04f; // Reduce visual noise by only highlighting the border after a certain time.
+// Window resizing from edges (when io.ConfigWindowsResizeFromEdges = true and ImGuiBackendFlags_HasMouseCursors is set in io.BackendFlags by back-end)
+static const float WINDOWS_RESIZE_FROM_EDGES_HALF_THICKNESS = 4.0f; // Extend outside and inside windows. Affect FindHoveredWindow().
+static const float WINDOWS_RESIZE_FROM_EDGES_FEEDBACK_TIMER = 0.04f; // Reduce visual noise by only highlighting the border after a certain time.
+static const float WINDOWS_MOUSE_WHEEL_SCROLL_LOCK_TIMER = 2.00f; // Lock scrolled window (so it doesn't pick child windows that are scrolling through) for a certaint time, unless mouse moved.
//-------------------------------------------------------------------------
// [SECTION] FORWARD DECLARATIONS
//-------------------------------------------------------------------------
static void SetCurrentWindow(ImGuiWindow* window);
-static void SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond);
-static void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond);
-static void SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond);
static void FindHoveredWindow();
static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFlags flags);
-static void CheckStacksSize(ImGuiWindow* window, bool write);
static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window, bool snap_on_edges);
static void AddDrawListToDrawData(ImVector<ImDrawList*>* out_list, ImDrawList* draw_list);
-static void AddWindowToDrawData(ImVector<ImDrawList*>* out_list, ImGuiWindow* window);
static void AddWindowToSortBuffer(ImVector<ImGuiWindow*>* out_sorted_windows, ImGuiWindow* window);
static ImRect GetViewportRect();
// Settings
-static void* SettingsHandlerWindow_ReadOpen(ImGuiContext*, ImGuiSettingsHandler*, const char* name);
-static void SettingsHandlerWindow_ReadLine(ImGuiContext*, ImGuiSettingsHandler*, void* entry, const char* line);
-static void SettingsHandlerWindow_WriteAll(ImGuiContext* imgui_ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* buf);
+static void* WindowSettingsHandler_ReadOpen(ImGuiContext*, ImGuiSettingsHandler*, const char* name);
+static void WindowSettingsHandler_ReadLine(ImGuiContext*, ImGuiSettingsHandler*, void* entry, const char* line);
+static void WindowSettingsHandler_WriteAll(ImGuiContext*, ImGuiSettingsHandler*, ImGuiTextBuffer* buf);
// Platform Dependents default implementation for IO functions
static const char* GetClipboardTextFn_DefaultImpl(void* user_data);
@@ -937,44 +885,53 @@ static void ImeSetInputScreenPosFn_DefaultImpl(int x, int y);
namespace ImGui
{
-static bool BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags);
-
// Navigation
static void NavUpdate();
static void NavUpdateWindowing();
-static void NavUpdateWindowingList();
+static void NavUpdateWindowingOverlay();
static void NavUpdateMoveResult();
-static float NavUpdatePageUpPageDown(int allowed_dir_flags);
+static float NavUpdatePageUpPageDown();
static inline void NavUpdateAnyRequestFlag();
-static void NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, const ImGuiID id);
+static bool NavScoreItem(ImGuiNavMoveResult* result, ImRect cand);
+static void NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, ImGuiID id);
static ImVec2 NavCalcPreferredRefPos();
-static void NavSaveLastChildNavWindow(ImGuiWindow* nav_window);
+static void NavSaveLastChildNavWindowIntoParent(ImGuiWindow* nav_window);
static ImGuiWindow* NavRestoreLastChildNavWindow(ImGuiWindow* window);
+static int FindWindowFocusIndex(ImGuiWindow* window);
+
+// Error Checking
+static void ErrorCheckEndFrame();
+static void ErrorCheckBeginEndCompareStacksSize(ImGuiWindow* window, bool write);
// Misc
static void UpdateMouseInputs();
static void UpdateMouseWheel();
-static void UpdateManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4]);
-}
+static bool UpdateManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4]);
+static void UpdateDebugToolItemPicker();
+static void RenderWindowOuterBorders(ImGuiWindow* window);
+static void RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar_rect, bool title_bar_is_highlight, int resize_grip_count, const ImU32 resize_grip_col[4], float resize_grip_draw_size);
+static void RenderWindowTitleBarContents(ImGuiWindow* window, const ImRect& title_bar_rect, const char* name, bool* p_open);
-// Test engine hooks (imgui-test)
-//#define IMGUI_ENABLE_TEST_ENGINE_HOOKS
-#ifdef IMGUI_ENABLE_TEST_ENGINE_HOOKS
-extern void ImGuiTestEngineHook_PreNewFrame();
-extern void ImGuiTestEngineHook_PostNewFrame();
-extern void ImGuiTestEngineHook_ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg);
-#endif
+}
//-----------------------------------------------------------------------------
// [SECTION] CONTEXT AND MEMORY ALLOCATORS
//-----------------------------------------------------------------------------
// Current context pointer. Implicitly used by all Dear ImGui functions. Always assumed to be != NULL.
-// CreateContext() will automatically set this pointer if it is NULL. Change to a different context by calling ImGui::SetCurrentContext().
-// If you use DLL hotreloading you might need to call SetCurrentContext() after reloading code from this file.
-// ImGui functions are not thread-safe because of this pointer. If you want thread-safety to allow N threads to access N different contexts, you can:
-// - Change this variable to use thread local storage. You may #define GImGui in imconfig.h for that purpose. Future development aim to make this context pointer explicit to all calls. Also read https://github.com/ocornut/imgui/issues/586
-// - Having multiple instances of the ImGui code compiled inside different namespace (easiest/safest, if you have a finite number of contexts)
+// ImGui::CreateContext() will automatically set this pointer if it is NULL. Change to a different context by calling ImGui::SetCurrentContext().
+// 1) Important: globals are not shared across DLL boundaries! If you use DLLs or any form of hot-reloading: you will need to call
+// SetCurrentContext() (with the pointer you got from CreateContext) from each unique static/DLL boundary, and after each hot-reloading.
+// In your debugger, add GImGui to your watch window and notice how its value changes depending on which location you are currently stepping into.
+// 2) Important: Dear ImGui functions are not thread-safe because of this pointer.
+// If you want thread-safety to allow N threads to access N different contexts, you can:
+// - Change this variable to use thread local storage so each thread can refer to a different context, in imconfig.h:
+// struct ImGuiContext;
+// extern thread_local ImGuiContext* MyImGuiTLS;
+// #define GImGui MyImGuiTLS
+// And then define MyImGuiTLS in one of your cpp file. Note that thread_local is a C++11 keyword, earlier C++ uses compiler-specific keyword.
+// - Future development aim to make this context pointer explicit to all calls. Also read https://github.com/ocornut/imgui/issues/586
+// - If you need a finite number of contexts, you may compile and use multiple instances of the ImGui code from different namespace.
#ifndef GImGui
ImGuiContext* GImGui = NULL;
#endif
@@ -983,11 +940,11 @@ ImGuiContext* GImGui = NULL;
// If you use DLL hotreloading you might need to call SetAllocatorFunctions() after reloading code from this file.
// Otherwise, you probably don't want to modify them mid-program, and if you use global/static e.g. ImVector<> instances you may need to keep them accessible during program destruction.
#ifndef IMGUI_DISABLE_DEFAULT_ALLOCATORS
-static void* MallocWrapper(size_t size, void* user_data) { (void)user_data; return malloc(size); }
-static void FreeWrapper(void* ptr, void* user_data) { (void)user_data; free(ptr); }
+static void* MallocWrapper(size_t size, void* user_data) { IM_UNUSED(user_data); return malloc(size); }
+static void FreeWrapper(void* ptr, void* user_data) { IM_UNUSED(user_data); free(ptr); }
#else
-static void* MallocWrapper(size_t size, void* user_data) { (void)user_data; (void)size; IM_ASSERT(0); return NULL; }
-static void FreeWrapper(void* ptr, void* user_data) { (void)user_data; (void)ptr; IM_ASSERT(0); }
+static void* MallocWrapper(size_t size, void* user_data) { IM_UNUSED(user_data); IM_UNUSED(size); IM_ASSERT(0); return NULL; }
+static void FreeWrapper(void* ptr, void* user_data) { IM_UNUSED(user_data); IM_UNUSED(ptr); IM_ASSERT(0); }
#endif
static void* (*GImAllocatorAllocFunc)(size_t size, void* user_data) = MallocWrapper;
@@ -1006,6 +963,7 @@ ImGuiStyle::ImGuiStyle()
WindowBorderSize = 1.0f; // Thickness of border around windows. Generally set to 0.0f or 1.0f. Other values not well tested.
WindowMinSize = ImVec2(32,32); // Minimum window size
WindowTitleAlign = ImVec2(0.0f,0.5f);// Alignment for title bar text
+ WindowMenuButtonPosition= ImGuiDir_Left; // Position of the collapsing/docking button in the title bar (left/right). Defaults to ImGuiDir_Left.
ChildRounding = 0.0f; // Radius of child window corners rounding. Set to 0.0f to have rectangular child windows
ChildBorderSize = 1.0f; // Thickness of border around child windows. Generally set to 0.0f or 1.0f. Other values not well tested.
PopupRounding = 0.0f; // Radius of popup window corners rounding. Set to 0.0f to have rectangular child windows
@@ -1017,18 +975,23 @@ ImGuiStyle::ImGuiStyle()
ItemInnerSpacing = ImVec2(4,4); // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label)
TouchExtraPadding = ImVec2(0,0); // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much!
IndentSpacing = 21.0f; // Horizontal spacing when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2).
- ColumnsMinSpacing = 6.0f; // Minimum horizontal spacing between two columns
- ScrollbarSize = 16.0f; // Width of the vertical scrollbar, Height of the horizontal scrollbar
+ ColumnsMinSpacing = 6.0f; // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1).
+ ScrollbarSize = 14.0f; // Width of the vertical scrollbar, Height of the horizontal scrollbar
ScrollbarRounding = 9.0f; // Radius of grab corners rounding for scrollbar
GrabMinSize = 10.0f; // Minimum width/height of a grab box for slider/scrollbar
GrabRounding = 0.0f; // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs.
+ TabRounding = 4.0f; // Radius of upper corners of a tab. Set to 0.0f to have rectangular tabs.
+ TabBorderSize = 0.0f; // Thickness of border around tabs.
+ ColorButtonPosition = ImGuiDir_Right; // Side of the color button in the ColorEdit4 widget (left/right). Defaults to ImGuiDir_Right.
ButtonTextAlign = ImVec2(0.5f,0.5f);// Alignment of button text when button is larger than text.
- DisplayWindowPadding = ImVec2(20,20); // Window position are clamped to be visible within the display area by at least this amount. Only applies to regular windows.
+ SelectableTextAlign = ImVec2(0.0f,0.0f);// Alignment of selectable text when button is larger than text.
+ DisplayWindowPadding = ImVec2(19,19); // Window position are clamped to be visible within the display area or monitors by at least this amount. Only applies to regular windows.
DisplaySafeAreaPadding = ImVec2(3,3); // If you cannot see the edge of your screen (e.g. on a TV) increase the safe area padding. Covers popups/tooltips as well regular windows.
MouseCursorScale = 1.0f; // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later.
AntiAliasedLines = true; // Enable anti-aliasing on lines/borders. Disable if you are really short on CPU/GPU.
AntiAliasedFill = true; // Enable anti-aliasing on filled shapes (rounded rectangles, circles, etc.)
CurveTessellationTol = 1.25f; // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality.
+ CircleSegmentMaxError = 1.60f; // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry.
// Default theme
ImGui::StyleColorsDark(this);
@@ -1054,6 +1017,7 @@ void ImGuiStyle::ScaleAllSizes(float scale_factor)
ScrollbarRounding = ImFloor(ScrollbarRounding * scale_factor);
GrabMinSize = ImFloor(GrabMinSize * scale_factor);
GrabRounding = ImFloor(GrabRounding * scale_factor);
+ TabRounding = ImFloor(TabRounding * scale_factor);
DisplayWindowPadding = ImFloor(DisplayWindowPadding * scale_factor);
DisplaySafeAreaPadding = ImFloor(DisplaySafeAreaPadding * scale_factor);
MouseCursorScale = ImFloor(MouseCursorScale * scale_factor);
@@ -1063,10 +1027,11 @@ ImGuiIO::ImGuiIO()
{
// Most fields are initialized with zero
memset(this, 0, sizeof(*this));
+ IM_ASSERT(IM_ARRAYSIZE(ImGuiIO::MouseDown) == ImGuiMouseButton_COUNT && IM_ARRAYSIZE(ImGuiIO::MouseClicked) == ImGuiMouseButton_COUNT); // Our pre-C++11 IM_STATIC_ASSERT() macros triggers warning on modern compilers so we don't use it here.
// Settings
- ConfigFlags = 0x00;
- BackendFlags = 0x00;
+ ConfigFlags = ImGuiConfigFlags_None;
+ BackendFlags = ImGuiBackendFlags_None;
DisplaySize = ImVec2(-1.0f, -1.0f);
DeltaTime = 1.0f/60.0f;
IniSavingRate = 5.0f;
@@ -1076,7 +1041,7 @@ ImGuiIO::ImGuiIO()
MouseDoubleClickMaxDist = 6.0f;
for (int i = 0; i < ImGuiKey_COUNT; i++)
KeyMap[i] = -1;
- KeyRepeatDelay = 0.250f;
+ KeyRepeatDelay = 0.275f;
KeyRepeatRate = 0.050f;
UserData = NULL;
@@ -1085,18 +1050,22 @@ ImGuiIO::ImGuiIO()
FontDefault = NULL;
FontAllowUserScaling = false;
DisplayFramebufferScale = ImVec2(1.0f, 1.0f);
- DisplayVisibleMin = DisplayVisibleMax = ImVec2(0.0f, 0.0f);
- // Miscellaneous configuration options
+ // Miscellaneous options
+ MouseDrawCursor = false;
#ifdef __APPLE__
ConfigMacOSXBehaviors = true; // Set Mac OS X style defaults based on __APPLE__ compile time flag
#else
ConfigMacOSXBehaviors = false;
#endif
ConfigInputTextCursorBlink = true;
- ConfigResizeWindowsFromEdges = false;
+ ConfigWindowsResizeFromEdges = true;
+ ConfigWindowsMoveFromTitleBarOnly = false;
+ ConfigWindowsMemoryCompactTimer = 60.0f;
- // Settings (User Functions)
+ // Platform Functions
+ BackendPlatformName = BackendRendererName = NULL;
+ BackendPlatformUserData = BackendRendererUserData = BackendLanguageUserData = NULL;
GetClipboardTextFn = GetClipboardTextFn_DefaultImpl; // Platform dependent default implementations
SetClipboardTextFn = SetClipboardTextFn_DefaultImpl;
ClipboardUserData = NULL;
@@ -1107,7 +1076,7 @@ ImGuiIO::ImGuiIO()
RenderDrawListsFn = NULL;
#endif
- // Input (NB: we already have memset zero the entire structure)
+ // Input (NB: we already have memset zero the entire structure!)
MousePos = ImVec2(-FLT_MAX, -FLT_MAX);
MousePosPrev = ImVec2(-FLT_MAX, -FLT_MAX);
MouseDragThreshold = 6.0f;
@@ -1119,30 +1088,100 @@ ImGuiIO::ImGuiIO()
// Pass in translated ASCII characters for text input.
// - with glfw you can get those from the callback set in glfwSetCharCallback()
// - on Windows you can get those using ToAscii+keyboard state, or via the WM_CHAR message
-void ImGuiIO::AddInputCharacter(ImWchar c)
+void ImGuiIO::AddInputCharacter(unsigned int c)
+{
+ if (c > 0 && c <= IM_UNICODE_CODEPOINT_MAX)
+ InputQueueCharacters.push_back((ImWchar)c);
+}
+
+void ImGuiIO::AddInputCharactersUTF8(const char* utf8_chars)
{
- const int n = ImStrlenW(InputCharacters);
- if (n + 1 < IM_ARRAYSIZE(InputCharacters))
+ while (*utf8_chars != 0)
{
- InputCharacters[n] = c;
- InputCharacters[n+1] = '\0';
+ unsigned int c = 0;
+ utf8_chars += ImTextCharFromUtf8(&c, utf8_chars, NULL);
+ if (c > 0 && c <= IM_UNICODE_CODEPOINT_MAX)
+ InputQueueCharacters.push_back((ImWchar)c);
}
}
-void ImGuiIO::AddInputCharactersUTF8(const char* utf8_chars)
+void ImGuiIO::ClearInputCharacters()
{
- // We can't pass more wchars than ImGuiIO::InputCharacters[] can hold so don't convert more
- const int wchars_buf_len = sizeof(ImGuiIO::InputCharacters) / sizeof(ImWchar);
- ImWchar wchars[wchars_buf_len];
- ImTextStrFromUtf8(wchars, wchars_buf_len, utf8_chars, NULL);
- for (int i = 0; i < wchars_buf_len && wchars[i] != 0; i++)
- AddInputCharacter(wchars[i]);
+ InputQueueCharacters.resize(0);
}
//-----------------------------------------------------------------------------
-// [SECTION] MISC HELPER/UTILITIES (Maths, String, Format, Hash, File functions)
+// [SECTION] MISC HELPERS/UTILITIES (Geometry functions)
//-----------------------------------------------------------------------------
+ImVec2 ImBezierClosestPoint(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, int num_segments)
+{
+ IM_ASSERT(num_segments > 0); // Use ImBezierClosestPointCasteljau()
+ ImVec2 p_last = p1;
+ ImVec2 p_closest;
+ float p_closest_dist2 = FLT_MAX;
+ float t_step = 1.0f / (float)num_segments;
+ for (int i_step = 1; i_step <= num_segments; i_step++)
+ {
+ ImVec2 p_current = ImBezierCalc(p1, p2, p3, p4, t_step * i_step);
+ ImVec2 p_line = ImLineClosestPoint(p_last, p_current, p);
+ float dist2 = ImLengthSqr(p - p_line);
+ if (dist2 < p_closest_dist2)
+ {
+ p_closest = p_line;
+ p_closest_dist2 = dist2;
+ }
+ p_last = p_current;
+ }
+ return p_closest;
+}
+
+// Closely mimics PathBezierToCasteljau() in imgui_draw.cpp
+static void BezierClosestPointCasteljauStep(const ImVec2& p, ImVec2& p_closest, ImVec2& p_last, float& p_closest_dist2, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, float tess_tol, int level)
+{
+ float dx = x4 - x1;
+ float dy = y4 - y1;
+ float d2 = ((x2 - x4) * dy - (y2 - y4) * dx);
+ float d3 = ((x3 - x4) * dy - (y3 - y4) * dx);
+ d2 = (d2 >= 0) ? d2 : -d2;
+ d3 = (d3 >= 0) ? d3 : -d3;
+ if ((d2+d3) * (d2+d3) < tess_tol * (dx*dx + dy*dy))
+ {
+ ImVec2 p_current(x4, y4);
+ ImVec2 p_line = ImLineClosestPoint(p_last, p_current, p);
+ float dist2 = ImLengthSqr(p - p_line);
+ if (dist2 < p_closest_dist2)
+ {
+ p_closest = p_line;
+ p_closest_dist2 = dist2;
+ }
+ p_last = p_current;
+ }
+ else if (level < 10)
+ {
+ float x12 = (x1+x2)*0.5f, y12 = (y1+y2)*0.5f;
+ float x23 = (x2+x3)*0.5f, y23 = (y2+y3)*0.5f;
+ float x34 = (x3+x4)*0.5f, y34 = (y3+y4)*0.5f;
+ float x123 = (x12+x23)*0.5f, y123 = (y12+y23)*0.5f;
+ float x234 = (x23+x34)*0.5f, y234 = (y23+y34)*0.5f;
+ float x1234 = (x123+x234)*0.5f, y1234 = (y123+y234)*0.5f;
+ BezierClosestPointCasteljauStep(p, p_closest, p_last, p_closest_dist2, x1, y1, x12, y12, x123, y123, x1234, y1234, tess_tol, level + 1);
+ BezierClosestPointCasteljauStep(p, p_closest, p_last, p_closest_dist2, x1234, y1234, x234, y234, x34, y34, x4, y4, tess_tol, level + 1);
+ }
+}
+
+// tess_tol is generally the same value you would find in ImGui::GetStyle().CurveTessellationTol
+// Because those ImXXX functions are lower-level than ImGui:: we cannot access this value automatically.
+ImVec2 ImBezierClosestPointCasteljau(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, float tess_tol)
+{
+ IM_ASSERT(tess_tol > 0.0f);
+ ImVec2 p_last = p1;
+ ImVec2 p_closest;
+ float p_closest_dist2 = FLT_MAX;
+ BezierClosestPointCasteljauStep(p, p_closest, p_last, p_closest_dist2, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, p4.x, p4.y, tess_tol, 0);
+ return p_closest;
+}
+
ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p)
{
ImVec2 ap = p - a;
@@ -1191,6 +1230,11 @@ ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c,
return proj_ca;
}
+//-----------------------------------------------------------------------------
+// [SECTION] MISC HELPERS/UTILITIES (String, Format, Hash functions)
+//-----------------------------------------------------------------------------
+
+// Consider using _stricmp/_strnicmp under Windows or strcasecmp/strncasecmp. We don't actually use either ImStricmp/ImStrnicmp in the codebase any more.
int ImStricmp(const char* str1, const char* str2)
{
int d;
@@ -1207,16 +1251,32 @@ int ImStrnicmp(const char* str1, const char* str2, size_t count)
void ImStrncpy(char* dst, const char* src, size_t count)
{
- if (count < 1) return;
- strncpy(dst, src, count);
- dst[count-1] = 0;
+ if (count < 1)
+ return;
+ if (count > 1)
+ strncpy(dst, src, count - 1);
+ dst[count - 1] = 0;
+}
+
+char* ImStrdup(const char* str)
+{
+ size_t len = strlen(str);
+ void* buf = IM_ALLOC(len + 1);
+ return (char*)memcpy(buf, (const void*)str, len + 1);
}
-char* ImStrdup(const char *str)
+char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* src)
{
- size_t len = strlen(str) + 1;
- void* buf = ImGui::MemAlloc(len);
- return (char*)memcpy(buf, (const void*)str, len);
+ size_t dst_buf_size = p_dst_size ? *p_dst_size : strlen(dst) + 1;
+ size_t src_size = strlen(src) + 1;
+ if (dst_buf_size < src_size)
+ {
+ IM_FREE(dst);
+ dst = (char*)IM_ALLOC(src_size);
+ if (p_dst_size)
+ *p_dst_size = src_size;
+ }
+ return (char*)memcpy(dst, (const void*)src, src_size);
}
const char* ImStrchrRange(const char* str, const char* str_end, char c)
@@ -1227,7 +1287,7 @@ const char* ImStrchrRange(const char* str, const char* str_end, char c)
int ImStrlenW(const ImWchar* str)
{
- //return (int)wcslen((const wchar_t*)str); // FIXME-OPT: Could use this when wchar_t are 16-bits
+ //return (int)wcslen((const wchar_t*)str); // FIXME-OPT: Could use this when wchar_t are 16-bit
int n = 0;
while (*str++) n++;
return n;
@@ -1285,10 +1345,26 @@ void ImStrTrimBlanks(char* buf)
buf[p - p_start] = 0; // Zero terminate
}
+const char* ImStrSkipBlank(const char* str)
+{
+ while (str[0] == ' ' || str[0] == '\t')
+ str++;
+ return str;
+}
+
// A) MSVC version appears to return -1 on overflow, whereas glibc appears to return total count (which may be >= buf_size).
// Ideally we would test for only one of those limits at runtime depending on the behavior the vsnprintf(), but trying to deduct it at compile time sounds like a pandora can of worm.
// B) When buf==NULL vsnprintf() will return the output size.
-#ifndef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS
+#ifndef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS
+
+// We support stb_sprintf which is much faster (see: https://github.com/nothings/stb/blob/master/stb_sprintf.h)
+// You may set IMGUI_USE_STB_SPRINTF to use our default wrapper, or set IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS
+// and setup the wrapper yourself. (FIXME-OPT: Some of our high-level operations such as ImGuiTextBuffer::appendfv() are
+// designed using two-passes worst case, which probably could be improved using the stbsp_vsprintfcb() function.)
+#ifdef IMGUI_USE_STB_SPRINTF
+#define STB_SPRINTF_IMPLEMENTATION
+#include "stb_sprintf.h"
+#endif
#if defined(_MSC_VER) && !defined(vsnprintf)
#define vsnprintf _vsnprintf
@@ -1298,7 +1374,11 @@ int ImFormatString(char* buf, size_t buf_size, const char* fmt, ...)
{
va_list args;
va_start(args, fmt);
+#ifdef IMGUI_USE_STB_SPRINTF
+ int w = stbsp_vsnprintf(buf, (int)buf_size, fmt, args);
+#else
int w = vsnprintf(buf, buf_size, fmt, args);
+#endif
va_end(args);
if (buf == NULL)
return w;
@@ -1310,7 +1390,11 @@ int ImFormatString(char* buf, size_t buf_size, const char* fmt, ...)
int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args)
{
+#ifdef IMGUI_USE_STB_SPRINTF
+ int w = stbsp_vsnprintf(buf, (int)buf_size, fmt, args);
+#else
int w = vsnprintf(buf, buf_size, fmt, args);
+#endif
if (buf == NULL)
return w;
if (w == -1 || w >= (int)buf_size)
@@ -1318,45 +1402,71 @@ int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args)
buf[w] = 0;
return w;
}
-#endif // #ifdef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS
+#endif // #ifdef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS
+
+// CRC32 needs a 1KB lookup table (not cache friendly)
+// Although the code to generate the table is simple and shorter than the table itself, using a const table allows us to easily:
+// - avoid an unnecessary branch/memory tap, - keep the ImHashXXX functions usable by static constructors, - make it thread-safe.
+static const ImU32 GCrc32LookupTable[256] =
+{
+ 0x00000000,0x77073096,0xEE0E612C,0x990951BA,0x076DC419,0x706AF48F,0xE963A535,0x9E6495A3,0x0EDB8832,0x79DCB8A4,0xE0D5E91E,0x97D2D988,0x09B64C2B,0x7EB17CBD,0xE7B82D07,0x90BF1D91,
+ 0x1DB71064,0x6AB020F2,0xF3B97148,0x84BE41DE,0x1ADAD47D,0x6DDDE4EB,0xF4D4B551,0x83D385C7,0x136C9856,0x646BA8C0,0xFD62F97A,0x8A65C9EC,0x14015C4F,0x63066CD9,0xFA0F3D63,0x8D080DF5,
+ 0x3B6E20C8,0x4C69105E,0xD56041E4,0xA2677172,0x3C03E4D1,0x4B04D447,0xD20D85FD,0xA50AB56B,0x35B5A8FA,0x42B2986C,0xDBBBC9D6,0xACBCF940,0x32D86CE3,0x45DF5C75,0xDCD60DCF,0xABD13D59,
+ 0x26D930AC,0x51DE003A,0xC8D75180,0xBFD06116,0x21B4F4B5,0x56B3C423,0xCFBA9599,0xB8BDA50F,0x2802B89E,0x5F058808,0xC60CD9B2,0xB10BE924,0x2F6F7C87,0x58684C11,0xC1611DAB,0xB6662D3D,
+ 0x76DC4190,0x01DB7106,0x98D220BC,0xEFD5102A,0x71B18589,0x06B6B51F,0x9FBFE4A5,0xE8B8D433,0x7807C9A2,0x0F00F934,0x9609A88E,0xE10E9818,0x7F6A0DBB,0x086D3D2D,0x91646C97,0xE6635C01,
+ 0x6B6B51F4,0x1C6C6162,0x856530D8,0xF262004E,0x6C0695ED,0x1B01A57B,0x8208F4C1,0xF50FC457,0x65B0D9C6,0x12B7E950,0x8BBEB8EA,0xFCB9887C,0x62DD1DDF,0x15DA2D49,0x8CD37CF3,0xFBD44C65,
+ 0x4DB26158,0x3AB551CE,0xA3BC0074,0xD4BB30E2,0x4ADFA541,0x3DD895D7,0xA4D1C46D,0xD3D6F4FB,0x4369E96A,0x346ED9FC,0xAD678846,0xDA60B8D0,0x44042D73,0x33031DE5,0xAA0A4C5F,0xDD0D7CC9,
+ 0x5005713C,0x270241AA,0xBE0B1010,0xC90C2086,0x5768B525,0x206F85B3,0xB966D409,0xCE61E49F,0x5EDEF90E,0x29D9C998,0xB0D09822,0xC7D7A8B4,0x59B33D17,0x2EB40D81,0xB7BD5C3B,0xC0BA6CAD,
+ 0xEDB88320,0x9ABFB3B6,0x03B6E20C,0x74B1D29A,0xEAD54739,0x9DD277AF,0x04DB2615,0x73DC1683,0xE3630B12,0x94643B84,0x0D6D6A3E,0x7A6A5AA8,0xE40ECF0B,0x9309FF9D,0x0A00AE27,0x7D079EB1,
+ 0xF00F9344,0x8708A3D2,0x1E01F268,0x6906C2FE,0xF762575D,0x806567CB,0x196C3671,0x6E6B06E7,0xFED41B76,0x89D32BE0,0x10DA7A5A,0x67DD4ACC,0xF9B9DF6F,0x8EBEEFF9,0x17B7BE43,0x60B08ED5,
+ 0xD6D6A3E8,0xA1D1937E,0x38D8C2C4,0x4FDFF252,0xD1BB67F1,0xA6BC5767,0x3FB506DD,0x48B2364B,0xD80D2BDA,0xAF0A1B4C,0x36034AF6,0x41047A60,0xDF60EFC3,0xA867DF55,0x316E8EEF,0x4669BE79,
+ 0xCB61B38C,0xBC66831A,0x256FD2A0,0x5268E236,0xCC0C7795,0xBB0B4703,0x220216B9,0x5505262F,0xC5BA3BBE,0xB2BD0B28,0x2BB45A92,0x5CB36A04,0xC2D7FFA7,0xB5D0CF31,0x2CD99E8B,0x5BDEAE1D,
+ 0x9B64C2B0,0xEC63F226,0x756AA39C,0x026D930A,0x9C0906A9,0xEB0E363F,0x72076785,0x05005713,0x95BF4A82,0xE2B87A14,0x7BB12BAE,0x0CB61B38,0x92D28E9B,0xE5D5BE0D,0x7CDCEFB7,0x0BDBDF21,
+ 0x86D3D2D4,0xF1D4E242,0x68DDB3F8,0x1FDA836E,0x81BE16CD,0xF6B9265B,0x6FB077E1,0x18B74777,0x88085AE6,0xFF0F6A70,0x66063BCA,0x11010B5C,0x8F659EFF,0xF862AE69,0x616BFFD3,0x166CCF45,
+ 0xA00AE278,0xD70DD2EE,0x4E048354,0x3903B3C2,0xA7672661,0xD06016F7,0x4969474D,0x3E6E77DB,0xAED16A4A,0xD9D65ADC,0x40DF0B66,0x37D83BF0,0xA9BCAE53,0xDEBB9EC5,0x47B2CF7F,0x30B5FFE9,
+ 0xBDBDF21C,0xCABAC28A,0x53B39330,0x24B4A3A6,0xBAD03605,0xCDD70693,0x54DE5729,0x23D967BF,0xB3667A2E,0xC4614AB8,0x5D681B02,0x2A6F2B94,0xB40BBE37,0xC30C8EA1,0x5A05DF1B,0x2D02EF8D,
+};
-// Pass data_size==0 for zero-terminated strings
+// Known size hash
+// It is ok to call ImHashData on a string with known length but the ### operator won't be supported.
// FIXME-OPT: Replace with e.g. FNV1a hash? CRC32 pretty much randomly access 1KB. Need to do proper measurements.
-ImU32 ImHash(const void* data, int data_size, ImU32 seed)
+ImU32 ImHashData(const void* data_p, size_t data_size, ImU32 seed)
{
- static ImU32 crc32_lut[256] = { 0 };
- if (!crc32_lut[1])
- {
- const ImU32 polynomial = 0xEDB88320;
- for (ImU32 i = 0; i < 256; i++)
- {
- ImU32 crc = i;
- for (ImU32 j = 0; j < 8; j++)
- crc = (crc >> 1) ^ (ImU32(-int(crc & 1)) & polynomial);
- crc32_lut[i] = crc;
- }
- }
+ ImU32 crc = ~seed;
+ const unsigned char* data = (const unsigned char*)data_p;
+ const ImU32* crc32_lut = GCrc32LookupTable;
+ while (data_size-- != 0)
+ crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ *data++];
+ return ~crc;
+}
+// Zero-terminated string hash, with support for ### to reset back to seed value
+// We support a syntax of "label###id" where only "###id" is included in the hash, and only "label" gets displayed.
+// Because this syntax is rarely used we are optimizing for the common case.
+// - If we reach ### in the string we discard the hash so far and reset to the seed.
+// - We don't do 'current += 2; continue;' after handling ### to keep the code smaller/faster (measured ~10% diff in Debug build)
+// FIXME-OPT: Replace with e.g. FNV1a hash? CRC32 pretty much randomly access 1KB. Need to do proper measurements.
+ImU32 ImHashStr(const char* data_p, size_t data_size, ImU32 seed)
+{
seed = ~seed;
ImU32 crc = seed;
- const unsigned char* current = (const unsigned char*)data;
-
- if (data_size > 0)
+ const unsigned char* data = (const unsigned char*)data_p;
+ const ImU32* crc32_lut = GCrc32LookupTable;
+ if (data_size != 0)
{
- // Known size
- while (data_size--)
- crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ *current++];
+ while (data_size-- != 0)
+ {
+ unsigned char c = *data++;
+ if (c == '#' && data_size >= 2 && data[0] == '#' && data[1] == '#')
+ crc = seed;
+ crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ c];
+ }
}
else
{
- // Zero-terminated string
- while (unsigned char c = *current++)
+ while (unsigned char c = *data++)
{
- // We support a syntax of "label###id" where only "###id" is included in the hash, and only "label" gets displayed.
- // Because this syntax is rarely used we are optimizing for the common case.
- // - If we reach ### in the string we discard the hash so far and reset to the seed.
- // - We don't do 'current += 2; continue;' after handling ### to keep the code smaller.
- if (c == '#' && current[0] == '#' && current[1] == '#')
+ if (c == '#' && data[0] == '#' && data[1] == '#')
crc = seed;
crc = (crc >> 8) ^ crc32_lut[(crc & 0xFF) ^ c];
}
@@ -1364,10 +1474,16 @@ ImU32 ImHash(const void* data, int data_size, ImU32 seed)
return ~crc;
}
-FILE* ImFileOpen(const char* filename, const char* mode)
+//-----------------------------------------------------------------------------
+// [SECTION] MISC HELPERS/UTILITIES (File functions)
+//-----------------------------------------------------------------------------
+
+// Default file functions
+#ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS
+ImFileHandle ImFileOpen(const char* filename, const char* mode)
{
-#if defined(_WIN32) && !defined(__CYGWIN__) && !defined(__GNUC__)
- // We need a fopen() wrapper because MSVC/Windows fopen doesn't handle UTF-8 filenames. Converting both strings from UTF-8 to wchar format (using a single allocation, because we can)
+#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) && !defined(__CYGWIN__) && !defined(__GNUC__)
+ // We need a fopen() wrapper because MSVC/Windows fopen doesn't handle UTF-8 filenames.
const int filename_wsize = ImTextCountCharsFromUtf8(filename, NULL) + 1;
const int mode_wsize = ImTextCountCharsFromUtf8(mode, NULL) + 1;
ImVector<ImWchar> buf;
@@ -1380,42 +1496,48 @@ FILE* ImFileOpen(const char* filename, const char* mode)
#endif
}
-// Load file content into memory
-// Memory allocated with ImGui::MemAlloc(), must be freed by user using ImGui::MemFree()
-void* ImFileLoadToMemory(const char* filename, const char* file_open_mode, size_t* out_file_size, int padding_bytes)
+// We should in theory be using fseeko()/ftello() with off_t and _fseeki64()/_ftelli64() with __int64, waiting for the PR that does that in a very portable pre-C++11 zero-warnings way.
+bool ImFileClose(ImFileHandle f) { return fclose(f) == 0; }
+ImU64 ImFileGetSize(ImFileHandle f) { long off = 0, sz = 0; return ((off = ftell(f)) != -1 && !fseek(f, 0, SEEK_END) && (sz = ftell(f)) != -1 && !fseek(f, off, SEEK_SET)) ? (ImU64)sz : (ImU64)-1; }
+ImU64 ImFileRead(void* data, ImU64 sz, ImU64 count, ImFileHandle f) { return fread(data, (size_t)sz, (size_t)count, f); }
+ImU64 ImFileWrite(const void* data, ImU64 sz, ImU64 count, ImFileHandle f) { return fwrite(data, (size_t)sz, (size_t)count, f); }
+#endif // #ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS
+
+// Helper: Load file content into memory
+// Memory allocated with IM_ALLOC(), must be freed by user using IM_FREE() == ImGui::MemFree()
+void* ImFileLoadToMemory(const char* filename, const char* mode, size_t* out_file_size, int padding_bytes)
{
- IM_ASSERT(filename && file_open_mode);
+ IM_ASSERT(filename && mode);
if (out_file_size)
*out_file_size = 0;
- FILE* f;
- if ((f = ImFileOpen(filename, file_open_mode)) == NULL)
+ ImFileHandle f;
+ if ((f = ImFileOpen(filename, mode)) == NULL)
return NULL;
- long file_size_signed;
- if (fseek(f, 0, SEEK_END) || (file_size_signed = ftell(f)) == -1 || fseek(f, 0, SEEK_SET))
+ size_t file_size = (size_t)ImFileGetSize(f);
+ if (file_size == (size_t)-1)
{
- fclose(f);
+ ImFileClose(f);
return NULL;
}
- size_t file_size = (size_t)file_size_signed;
- void* file_data = ImGui::MemAlloc(file_size + padding_bytes);
+ void* file_data = IM_ALLOC(file_size + padding_bytes);
if (file_data == NULL)
{
- fclose(f);
+ ImFileClose(f);
return NULL;
}
- if (fread(file_data, 1, file_size, f) != file_size)
+ if (ImFileRead(file_data, 1, file_size, f) != file_size)
{
- fclose(f);
- ImGui::MemFree(file_data);
+ ImFileClose(f);
+ IM_FREE(file_data);
return NULL;
}
if (padding_bytes > 0)
memset((void*)(((char*)file_data) + file_size), 0, (size_t)padding_bytes);
- fclose(f);
+ ImFileClose(f);
if (out_file_size)
*out_file_size = file_size;
@@ -1426,7 +1548,7 @@ void* ImFileLoadToMemory(const char* filename, const char* file_open_mode, size_
// [SECTION] MISC HELPERS/UTILITIES (ImText* functions)
//-----------------------------------------------------------------------------
-// Convert UTF-8 to 32-bits character, process single character input.
+// Convert UTF-8 to 32-bit character, process single character input.
// Based on stb_from_utf8() from github.com/nothings/stb/
// We handle UTF-8 decoding error by skipping forward.
int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char* in_text_end)
@@ -1441,7 +1563,7 @@ int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char*
}
if ((*str & 0xe0) == 0xc0)
{
- *out_char = 0xFFFD; // will be invalid but not end of string
+ *out_char = IM_UNICODE_CODEPOINT_INVALID; // will be invalid but not end of string
if (in_text_end && in_text_end - (const char*)str < 2) return 1;
if (*str < 0xc2) return 2;
c = (unsigned int)((*str++ & 0x1f) << 6);
@@ -1452,7 +1574,7 @@ int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char*
}
if ((*str & 0xf0) == 0xe0)
{
- *out_char = 0xFFFD; // will be invalid but not end of string
+ *out_char = IM_UNICODE_CODEPOINT_INVALID; // will be invalid but not end of string
if (in_text_end && in_text_end - (const char*)str < 3) return 1;
if (*str == 0xe0 && (str[1] < 0xa0 || str[1] > 0xbf)) return 3;
if (*str == 0xed && str[1] > 0x9f) return 3; // str[1] < 0x80 is checked below
@@ -1466,7 +1588,7 @@ int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char*
}
if ((*str & 0xf8) == 0xf0)
{
- *out_char = 0xFFFD; // will be invalid but not end of string
+ *out_char = IM_UNICODE_CODEPOINT_INVALID; // will be invalid but not end of string
if (in_text_end && in_text_end - (const char*)str < 4) return 1;
if (*str > 0xf4) return 4;
if (*str == 0xf0 && (str[1] < 0x90 || str[1] > 0xbf)) return 4;
@@ -1497,7 +1619,7 @@ int ImTextStrFromUtf8(ImWchar* buf, int buf_size, const char* in_text, const cha
in_text += ImTextCharFromUtf8(&c, in_text, in_text_end);
if (c == 0)
break;
- if (c < 0x10000) // FIXME: Losing characters that don't fit in 2 bytes
+ if (c <= IM_UNICODE_CODEPOINT_MAX) // FIXME: Losing characters that don't fit in 2 bytes
*buf_out++ = (ImWchar)c;
}
*buf_out = 0;
@@ -1515,7 +1637,7 @@ int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end)
in_text += ImTextCharFromUtf8(&c, in_text, in_text_end);
if (c == 0)
break;
- if (c < 0x10000)
+ if (c <= IM_UNICODE_CODEPOINT_MAX)
char_count++;
}
return char_count;
@@ -1606,7 +1728,7 @@ int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_e
}
//-----------------------------------------------------------------------------
-// [SECTION] MISC HELPER/UTILTIES (Color functions)
+// [SECTION] MISC HELPERS/UTILTIES (Color functions)
// Note: The Convert functions are early design which are not consistent with other API.
//-----------------------------------------------------------------------------
@@ -1681,53 +1803,21 @@ void ImGui::ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float&
}
}
-ImU32 ImGui::GetColorU32(ImGuiCol idx, float alpha_mul)
-{
- ImGuiStyle& style = GImGui->Style;
- ImVec4 c = style.Colors[idx];
- c.w *= style.Alpha * alpha_mul;
- return ColorConvertFloat4ToU32(c);
-}
-
-ImU32 ImGui::GetColorU32(const ImVec4& col)
-{
- ImGuiStyle& style = GImGui->Style;
- ImVec4 c = col;
- c.w *= style.Alpha;
- return ColorConvertFloat4ToU32(c);
-}
-
-const ImVec4& ImGui::GetStyleColorVec4(ImGuiCol idx)
-{
- ImGuiStyle& style = GImGui->Style;
- return style.Colors[idx];
-}
-
-ImU32 ImGui::GetColorU32(ImU32 col)
-{
- float style_alpha = GImGui->Style.Alpha;
- if (style_alpha >= 1.0f)
- return col;
- ImU32 a = (col & IM_COL32_A_MASK) >> IM_COL32_A_SHIFT;
- a = (ImU32)(a * style_alpha); // We don't need to clamp 0..255 because Style.Alpha is in 0..1 range.
- return (col & ~IM_COL32_A_MASK) | (a << IM_COL32_A_SHIFT);
-}
-
//-----------------------------------------------------------------------------
// [SECTION] ImGuiStorage
// Helper: Key->value storage
//-----------------------------------------------------------------------------
// std::lower_bound but without the bullshit
-static ImVector<ImGuiStorage::Pair>::iterator LowerBound(ImVector<ImGuiStorage::Pair>& data, ImGuiID key)
+static ImGuiStorage::ImGuiStoragePair* LowerBound(ImVector<ImGuiStorage::ImGuiStoragePair>& data, ImGuiID key)
{
- ImVector<ImGuiStorage::Pair>::iterator first = data.begin();
- ImVector<ImGuiStorage::Pair>::iterator last = data.end();
+ ImGuiStorage::ImGuiStoragePair* first = data.Data;
+ ImGuiStorage::ImGuiStoragePair* last = data.Data + data.Size;
size_t count = (size_t)(last - first);
while (count > 0)
{
size_t count2 = count >> 1;
- ImVector<ImGuiStorage::Pair>::iterator mid = first + count2;
+ ImGuiStorage::ImGuiStoragePair* mid = first + count2;
if (mid->key < key)
{
first = ++mid;
@@ -1749,18 +1839,18 @@ void ImGuiStorage::BuildSortByKey()
static int IMGUI_CDECL PairCompareByID(const void* lhs, const void* rhs)
{
// We can't just do a subtraction because qsort uses signed integers and subtracting our ID doesn't play well with that.
- if (((const Pair*)lhs)->key > ((const Pair*)rhs)->key) return +1;
- if (((const Pair*)lhs)->key < ((const Pair*)rhs)->key) return -1;
+ if (((const ImGuiStoragePair*)lhs)->key > ((const ImGuiStoragePair*)rhs)->key) return +1;
+ if (((const ImGuiStoragePair*)lhs)->key < ((const ImGuiStoragePair*)rhs)->key) return -1;
return 0;
}
};
if (Data.Size > 1)
- ImQsort(Data.Data, (size_t)Data.Size, sizeof(Pair), StaticFunc::PairCompareByID);
+ ImQsort(Data.Data, (size_t)Data.Size, sizeof(ImGuiStoragePair), StaticFunc::PairCompareByID);
}
int ImGuiStorage::GetInt(ImGuiID key, int default_val) const
{
- ImVector<Pair>::iterator it = LowerBound(const_cast<ImVector<ImGuiStorage::Pair>&>(Data), key);
+ ImGuiStoragePair* it = LowerBound(const_cast<ImVector<ImGuiStoragePair>&>(Data), key);
if (it == Data.end() || it->key != key)
return default_val;
return it->val_i;
@@ -1773,7 +1863,7 @@ bool ImGuiStorage::GetBool(ImGuiID key, bool default_val) const
float ImGuiStorage::GetFloat(ImGuiID key, float default_val) const
{
- ImVector<Pair>::iterator it = LowerBound(const_cast<ImVector<ImGuiStorage::Pair>&>(Data), key);
+ ImGuiStoragePair* it = LowerBound(const_cast<ImVector<ImGuiStoragePair>&>(Data), key);
if (it == Data.end() || it->key != key)
return default_val;
return it->val_f;
@@ -1781,7 +1871,7 @@ float ImGuiStorage::GetFloat(ImGuiID key, float default_val) const
void* ImGuiStorage::GetVoidPtr(ImGuiID key) const
{
- ImVector<Pair>::iterator it = LowerBound(const_cast<ImVector<ImGuiStorage::Pair>&>(Data), key);
+ ImGuiStoragePair* it = LowerBound(const_cast<ImVector<ImGuiStoragePair>&>(Data), key);
if (it == Data.end() || it->key != key)
return NULL;
return it->val_p;
@@ -1790,9 +1880,9 @@ void* ImGuiStorage::GetVoidPtr(ImGuiID key) const
// References are only valid until a new value is added to the storage. Calling a Set***() function or a Get***Ref() function invalidates the pointer.
int* ImGuiStorage::GetIntRef(ImGuiID key, int default_val)
{
- ImVector<Pair>::iterator it = LowerBound(Data, key);
+ ImGuiStoragePair* it = LowerBound(Data, key);
if (it == Data.end() || it->key != key)
- it = Data.insert(it, Pair(key, default_val));
+ it = Data.insert(it, ImGuiStoragePair(key, default_val));
return &it->val_i;
}
@@ -1803,27 +1893,27 @@ bool* ImGuiStorage::GetBoolRef(ImGuiID key, bool default_val)
float* ImGuiStorage::GetFloatRef(ImGuiID key, float default_val)
{
- ImVector<Pair>::iterator it = LowerBound(Data, key);
+ ImGuiStoragePair* it = LowerBound(Data, key);
if (it == Data.end() || it->key != key)
- it = Data.insert(it, Pair(key, default_val));
+ it = Data.insert(it, ImGuiStoragePair(key, default_val));
return &it->val_f;
}
void** ImGuiStorage::GetVoidPtrRef(ImGuiID key, void* default_val)
{
- ImVector<Pair>::iterator it = LowerBound(Data, key);
+ ImGuiStoragePair* it = LowerBound(Data, key);
if (it == Data.end() || it->key != key)
- it = Data.insert(it, Pair(key, default_val));
+ it = Data.insert(it, ImGuiStoragePair(key, default_val));
return &it->val_p;
}
// FIXME-OPT: Need a way to reuse the result of lower_bound when doing GetInt()/SetInt() - not too bad because it only happens on explicit interaction (maximum one a frame)
void ImGuiStorage::SetInt(ImGuiID key, int val)
{
- ImVector<Pair>::iterator it = LowerBound(Data, key);
+ ImGuiStoragePair* it = LowerBound(Data, key);
if (it == Data.end() || it->key != key)
{
- Data.insert(it, Pair(key, val));
+ Data.insert(it, ImGuiStoragePair(key, val));
return;
}
it->val_i = val;
@@ -1836,10 +1926,10 @@ void ImGuiStorage::SetBool(ImGuiID key, bool val)
void ImGuiStorage::SetFloat(ImGuiID key, float val)
{
- ImVector<Pair>::iterator it = LowerBound(Data, key);
+ ImGuiStoragePair* it = LowerBound(Data, key);
if (it == Data.end() || it->key != key)
{
- Data.insert(it, Pair(key, val));
+ Data.insert(it, ImGuiStoragePair(key, val));
return;
}
it->val_f = val;
@@ -1847,10 +1937,10 @@ void ImGuiStorage::SetFloat(ImGuiID key, float val)
void ImGuiStorage::SetVoidPtr(ImGuiID key, void* val)
{
- ImVector<Pair>::iterator it = LowerBound(Data, key);
+ ImGuiStoragePair* it = LowerBound(Data, key);
if (it == Data.end() || it->key != key)
{
- Data.insert(it, Pair(key, val));
+ Data.insert(it, ImGuiStoragePair(key, val));
return;
}
it->val_p = val;
@@ -1884,16 +1974,14 @@ ImGuiTextFilter::ImGuiTextFilter(const char* default_filter)
bool ImGuiTextFilter::Draw(const char* label, float width)
{
if (width != 0.0f)
- ImGui::PushItemWidth(width);
+ ImGui::SetNextItemWidth(width);
bool value_changed = ImGui::InputText(label, InputBuf, IM_ARRAYSIZE(InputBuf));
- if (width != 0.0f)
- ImGui::PopItemWidth();
if (value_changed)
Build();
return value_changed;
}
-void ImGuiTextFilter::TextRange::split(char separator, ImVector<TextRange>* out) const
+void ImGuiTextFilter::ImGuiTextRange::split(char separator, ImVector<ImGuiTextRange>* out) const
{
out->resize(0);
const char* wb = b;
@@ -1902,25 +1990,25 @@ void ImGuiTextFilter::TextRange::split(char separator, ImVector<TextRange>* out)
{
if (*we == separator)
{
- out->push_back(TextRange(wb, we));
+ out->push_back(ImGuiTextRange(wb, we));
wb = we + 1;
}
we++;
}
if (wb != we)
- out->push_back(TextRange(wb, we));
+ out->push_back(ImGuiTextRange(wb, we));
}
void ImGuiTextFilter::Build()
{
Filters.resize(0);
- TextRange input_range(InputBuf, InputBuf+strlen(InputBuf));
+ ImGuiTextRange input_range(InputBuf, InputBuf+strlen(InputBuf));
input_range.split(',', &Filters);
CountGrep = 0;
for (int i = 0; i != Filters.Size; i++)
{
- TextRange& f = Filters[i];
+ ImGuiTextRange& f = Filters[i];
while (f.b < f.e && ImCharIsBlankA(f.b[0]))
f.b++;
while (f.e > f.b && ImCharIsBlankA(f.e[-1]))
@@ -1942,19 +2030,19 @@ bool ImGuiTextFilter::PassFilter(const char* text, const char* text_end) const
for (int i = 0; i != Filters.Size; i++)
{
- const TextRange& f = Filters[i];
+ const ImGuiTextRange& f = Filters[i];
if (f.empty())
continue;
if (f.b[0] == '-')
{
// Subtract
- if (ImStristr(text, text_end, f.begin()+1, f.end()) != NULL)
+ if (ImStristr(text, text_end, f.b + 1, f.e) != NULL)
return false;
}
else
{
// Grep
- if (ImStristr(text, text_end, f.begin(), f.end()) != NULL)
+ if (ImStristr(text, text_end, f.b, f.e) != NULL)
return true;
}
}
@@ -1982,6 +2070,32 @@ bool ImGuiTextFilter::PassFilter(const char* text, const char* text_end) const
char ImGuiTextBuffer::EmptyString[1] = { 0 };
+void ImGuiTextBuffer::append(const char* str, const char* str_end)
+{
+ int len = str_end ? (int)(str_end - str) : (int)strlen(str);
+
+ // Add zero-terminator the first time
+ const int write_off = (Buf.Size != 0) ? Buf.Size : 1;
+ const int needed_sz = write_off + len;
+ if (write_off + len >= Buf.Capacity)
+ {
+ int new_capacity = Buf.Capacity * 2;
+ Buf.reserve(needed_sz > new_capacity ? needed_sz : new_capacity);
+ }
+
+ Buf.resize(needed_sz);
+ memcpy(&Buf[write_off - 1], str, (size_t)len);
+ Buf[write_off - 1 + len] = 0;
+}
+
+void ImGuiTextBuffer::appendf(const char* fmt, ...)
+{
+ va_list args;
+ va_start(args, fmt);
+ appendfv(fmt, args);
+ va_end(args);
+}
+
// Helper: Text buffer for logging/accumulating text
void ImGuiTextBuffer::appendfv(const char* fmt, va_list args)
{
@@ -2000,8 +2114,8 @@ void ImGuiTextBuffer::appendfv(const char* fmt, va_list args)
const int needed_sz = write_off + len;
if (write_off + len >= Buf.Capacity)
{
- int double_capacity = Buf.Capacity * 2;
- Buf.reserve(needed_sz > double_capacity ? needed_sz : double_capacity);
+ int new_capacity = Buf.Capacity * 2;
+ Buf.reserve(needed_sz > new_capacity ? needed_sz : new_capacity);
}
Buf.resize(needed_sz);
@@ -2009,30 +2123,66 @@ void ImGuiTextBuffer::appendfv(const char* fmt, va_list args)
va_end(args_copy);
}
-void ImGuiTextBuffer::appendf(const char* fmt, ...)
-{
- va_list args;
- va_start(args, fmt);
- appendfv(fmt, args);
- va_end(args);
-}
-
//-----------------------------------------------------------------------------
// [SECTION] ImGuiListClipper
-// This is currently not as flexible/powerful as it should be, needs some rework (see TODO)
+// This is currently not as flexible/powerful as it should be and really confusing/spaghetti, mostly because we changed
+// the API mid-way through development and support two ways to using the clipper, needs some rework (see TODO)
//-----------------------------------------------------------------------------
+// Helper to calculate coarse clipping of large list of evenly sized items.
+// NB: Prefer using the ImGuiListClipper higher-level helper if you can! Read comments and instructions there on how those use this sort of pattern.
+// NB: 'items_count' is only used to clamp the result, if you don't know your count you can use INT_MAX
+void ImGui::CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ if (g.LogEnabled)
+ {
+ // If logging is active, do not perform any clipping
+ *out_items_display_start = 0;
+ *out_items_display_end = items_count;
+ return;
+ }
+ if (window->SkipItems)
+ {
+ *out_items_display_start = *out_items_display_end = 0;
+ return;
+ }
+
+ // We create the union of the ClipRect and the NavScoringRect which at worst should be 1 page away from ClipRect
+ ImRect unclipped_rect = window->ClipRect;
+ if (g.NavMoveRequest)
+ unclipped_rect.Add(g.NavScoringRectScreen);
+
+ const ImVec2 pos = window->DC.CursorPos;
+ int start = (int)((unclipped_rect.Min.y - pos.y) / items_height);
+ int end = (int)((unclipped_rect.Max.y - pos.y) / items_height);
+
+ // When performing a navigation request, ensure we have one item extra in the direction we are moving to
+ if (g.NavMoveRequest && g.NavMoveClipDir == ImGuiDir_Up)
+ start--;
+ if (g.NavMoveRequest && g.NavMoveClipDir == ImGuiDir_Down)
+ end++;
+
+ start = ImClamp(start, 0, items_count);
+ end = ImClamp(end + 1, start, items_count);
+ *out_items_display_start = start;
+ *out_items_display_end = end;
+}
+
static void SetCursorPosYAndSetupDummyPrevLine(float pos_y, float line_height)
{
// Set cursor position and a few other things so that SetScrollHereY() and Columns() can work when seeking cursor.
// FIXME: It is problematic that we have to do that here, because custom/equivalent end-user code would stumble on the same issue.
// The clipper should probably have a 4th step to display the last item in a regular manner.
- ImGui::SetCursorPosY(pos_y);
- ImGuiWindow* window = ImGui::GetCurrentWindow();
- window->DC.CursorPosPrevLine.y = window->DC.CursorPos.y - line_height; // Setting those fields so that SetScrollHereY() can properly function after the end of our clipper usage.
- window->DC.PrevLineSize.y = (line_height - GImGui->Style.ItemSpacing.y); // If we end up needing more accurate data (to e.g. use SameLine) we may as well make the clipper have a fourth step to let user process and display the last item in their list.
- if (window->DC.ColumnsSet)
- window->DC.ColumnsSet->LineMinY = window->DC.CursorPos.y; // Setting this so that cell Y position are set properly
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ window->DC.CursorPos.y = pos_y;
+ window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, pos_y);
+ window->DC.CursorPosPrevLine.y = window->DC.CursorPos.y - line_height; // Setting those fields so that SetScrollHereY() can properly function after the end of our clipper usage.
+ window->DC.PrevLineSize.y = (line_height - g.Style.ItemSpacing.y); // If we end up needing more accurate data (to e.g. use SameLine) we may as well make the clipper have a fourth step to let user process and display the last item in their list.
+ if (ImGuiColumns* columns = window->DC.CurrentColumns)
+ columns->LineMinY = window->DC.CursorPos.y; // Setting this so that cell Y position are set properly
}
// Use case A: Begin() called from constructor with items_height<0, then called again from Sync() in StepNo 1
@@ -2040,7 +2190,10 @@ static void SetCursorPosYAndSetupDummyPrevLine(float pos_y, float line_height)
// FIXME-LEGACY: Ideally we should remove the Begin/End functions but they are part of the legacy API we still support. This is why some of the code in Step() calling Begin() and reassign some fields, spaghetti style.
void ImGuiListClipper::Begin(int count, float items_height)
{
- StartPosY = ImGui::GetCursorPosY();
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+
+ StartPosY = window->DC.CursorPos.y;
ItemsHeight = items_height;
ItemsCount = count;
StepNo = 0;
@@ -2067,7 +2220,10 @@ void ImGuiListClipper::End()
bool ImGuiListClipper::Step()
{
- if (ItemsCount == 0 || ImGui::GetCurrentWindowRead()->SkipItems)
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+
+ if (ItemsCount == 0 || window->SkipItems)
{
ItemsCount = -1;
return false;
@@ -2076,16 +2232,16 @@ bool ImGuiListClipper::Step()
{
DisplayStart = 0;
DisplayEnd = 1;
- StartPosY = ImGui::GetCursorPosY();
+ StartPosY = window->DC.CursorPos.y;
StepNo = 1;
return true;
}
if (StepNo == 1) // Step 1: the clipper infer height from first element, calculate the actual range of elements to display, and position the cursor before the first element.
{
if (ItemsCount == 1) { ItemsCount = -1; return false; }
- float items_height = ImGui::GetCursorPosY() - StartPosY;
+ float items_height = window->DC.CursorPos.y - StartPosY;
IM_ASSERT(items_height > 0.0f); // If this triggers, it means Item 0 hasn't moved the cursor vertically
- Begin(ItemsCount-1, items_height);
+ Begin(ItemsCount - 1, items_height);
DisplayStart++;
DisplayEnd++;
StepNo = 3;
@@ -2104,10 +2260,42 @@ bool ImGuiListClipper::Step()
//-----------------------------------------------------------------------------
// [SECTION] RENDER HELPERS
-// Those (internal) functions are currently quite a legacy mess - their signature and behavior will change.
+// Some of those (internal) functions are currently quite a legacy mess - their signature and behavior will change.
// Also see imgui_draw.cpp for some more which have been reworked to not rely on ImGui:: state.
//-----------------------------------------------------------------------------
+ImU32 ImGui::GetColorU32(ImGuiCol idx, float alpha_mul)
+{
+ ImGuiStyle& style = GImGui->Style;
+ ImVec4 c = style.Colors[idx];
+ c.w *= style.Alpha * alpha_mul;
+ return ColorConvertFloat4ToU32(c);
+}
+
+ImU32 ImGui::GetColorU32(const ImVec4& col)
+{
+ ImGuiStyle& style = GImGui->Style;
+ ImVec4 c = col;
+ c.w *= style.Alpha;
+ return ColorConvertFloat4ToU32(c);
+}
+
+const ImVec4& ImGui::GetStyleColorVec4(ImGuiCol idx)
+{
+ ImGuiStyle& style = GImGui->Style;
+ return style.Colors[idx];
+}
+
+ImU32 ImGui::GetColorU32(ImU32 col)
+{
+ ImGuiStyle& style = GImGui->Style;
+ if (style.Alpha >= 1.0f)
+ return col;
+ ImU32 a = (col & IM_COL32_A_MASK) >> IM_COL32_A_SHIFT;
+ a = (ImU32)(a * style.Alpha); // We don't need to clamp 0..255 because Style.Alpha is in 0..1 range.
+ return (col & ~IM_COL32_A_MASK) | (a << IM_COL32_A_SHIFT);
+}
+
const char* ImGui::FindRenderedTextEnd(const char* text, const char* text_end)
{
const char* text_display_end = text;
@@ -2165,17 +2353,8 @@ void ImGui::RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end
// Default clip_rect uses (pos_min,pos_max)
// Handle clipping on CPU immediately (vs typically let the GPU clip the triangles that are overlapping the clipping rectangle edges)
-void ImGui::RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align, const ImRect* clip_rect)
+void ImGui::RenderTextClippedEx(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_display_end, const ImVec2* text_size_if_known, const ImVec2& align, const ImRect* clip_rect)
{
- // Hide anything after a '##' string
- const char* text_display_end = FindRenderedTextEnd(text, text_end);
- const int text_len = (int)(text_display_end - text);
- if (text_len == 0)
- return;
-
- ImGuiContext& g = *GImGui;
- ImGuiWindow* window = g.CurrentWindow;
-
// Perform CPU side clipping for single clipped element to avoid using scissor state
ImVec2 pos = pos_min;
const ImVec2 text_size = text_size_if_known ? *text_size_if_known : CalcTextSize(text, text_display_end, false, 0.0f);
@@ -2194,14 +2373,108 @@ void ImGui::RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, cons
if (need_clipping)
{
ImVec4 fine_clip_rect(clip_min->x, clip_min->y, clip_max->x, clip_max->y);
- window->DrawList->AddText(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_display_end, 0.0f, &fine_clip_rect);
+ draw_list->AddText(NULL, 0.0f, pos, GetColorU32(ImGuiCol_Text), text, text_display_end, 0.0f, &fine_clip_rect);
+ }
+ else
+ {
+ draw_list->AddText(NULL, 0.0f, pos, GetColorU32(ImGuiCol_Text), text, text_display_end, 0.0f, NULL);
+ }
+}
+
+void ImGui::RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align, const ImRect* clip_rect)
+{
+ // Hide anything after a '##' string
+ const char* text_display_end = FindRenderedTextEnd(text, text_end);
+ const int text_len = (int)(text_display_end - text);
+ if (text_len == 0)
+ return;
+
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ RenderTextClippedEx(window->DrawList, pos_min, pos_max, text, text_display_end, text_size_if_known, align, clip_rect);
+ if (g.LogEnabled)
+ LogRenderedText(&pos_min, text, text_display_end);
+}
+
+
+// Another overly complex function until we reorganize everything into a nice all-in-one helper.
+// This is made more complex because we have dissociated the layout rectangle (pos_min..pos_max) which define _where_ the ellipsis is, from actual clipping of text and limit of the ellipsis display.
+// This is because in the context of tabs we selectively hide part of the text when the Close Button appears, but we don't want the ellipsis to move.
+void ImGui::RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, float clip_max_x, float ellipsis_max_x, const char* text, const char* text_end_full, const ImVec2* text_size_if_known)
+{
+ ImGuiContext& g = *GImGui;
+ if (text_end_full == NULL)
+ text_end_full = FindRenderedTextEnd(text);
+ const ImVec2 text_size = text_size_if_known ? *text_size_if_known : CalcTextSize(text, text_end_full, false, 0.0f);
+
+ //draw_list->AddLine(ImVec2(pos_max.x, pos_min.y - 4), ImVec2(pos_max.x, pos_max.y + 4), IM_COL32(0, 0, 255, 255));
+ //draw_list->AddLine(ImVec2(ellipsis_max_x, pos_min.y-2), ImVec2(ellipsis_max_x, pos_max.y+2), IM_COL32(0, 255, 0, 255));
+ //draw_list->AddLine(ImVec2(clip_max_x, pos_min.y), ImVec2(clip_max_x, pos_max.y), IM_COL32(255, 0, 0, 255));
+ // FIXME: We could technically remove (last_glyph->AdvanceX - last_glyph->X1) from text_size.x here and save a few pixels.
+ if (text_size.x > pos_max.x - pos_min.x)
+ {
+ // Hello wo...
+ // | | |
+ // min max ellipsis_max
+ // <-> this is generally some padding value
+
+ const ImFont* font = draw_list->_Data->Font;
+ const float font_size = draw_list->_Data->FontSize;
+ const char* text_end_ellipsis = NULL;
+
+ ImWchar ellipsis_char = font->EllipsisChar;
+ int ellipsis_char_count = 1;
+ if (ellipsis_char == (ImWchar)-1)
+ {
+ ellipsis_char = (ImWchar)'.';
+ ellipsis_char_count = 3;
+ }
+ const ImFontGlyph* glyph = font->FindGlyph(ellipsis_char);
+
+ float ellipsis_glyph_width = glyph->X1; // Width of the glyph with no padding on either side
+ float ellipsis_total_width = ellipsis_glyph_width; // Full width of entire ellipsis
+
+ if (ellipsis_char_count > 1)
+ {
+ // Full ellipsis size without free spacing after it.
+ const float spacing_between_dots = 1.0f * (draw_list->_Data->FontSize / font->FontSize);
+ ellipsis_glyph_width = glyph->X1 - glyph->X0 + spacing_between_dots;
+ ellipsis_total_width = ellipsis_glyph_width * (float)ellipsis_char_count - spacing_between_dots;
+ }
+
+ // We can now claim the space between pos_max.x and ellipsis_max.x
+ const float text_avail_width = ImMax((ImMax(pos_max.x, ellipsis_max_x) - ellipsis_total_width) - pos_min.x, 1.0f);
+ float text_size_clipped_x = font->CalcTextSizeA(font_size, text_avail_width, 0.0f, text, text_end_full, &text_end_ellipsis).x;
+ if (text == text_end_ellipsis && text_end_ellipsis < text_end_full)
+ {
+ // Always display at least 1 character if there's no room for character + ellipsis
+ text_end_ellipsis = text + ImTextCountUtf8BytesFromChar(text, text_end_full);
+ text_size_clipped_x = font->CalcTextSizeA(font_size, FLT_MAX, 0.0f, text, text_end_ellipsis).x;
+ }
+ while (text_end_ellipsis > text && ImCharIsBlankA(text_end_ellipsis[-1]))
+ {
+ // Trim trailing space before ellipsis (FIXME: Supporting non-ascii blanks would be nice, for this we need a function to backtrack in UTF-8 text)
+ text_end_ellipsis--;
+ text_size_clipped_x -= font->CalcTextSizeA(font_size, FLT_MAX, 0.0f, text_end_ellipsis, text_end_ellipsis + 1).x; // Ascii blanks are always 1 byte
+ }
+
+ // Render text, render ellipsis
+ RenderTextClippedEx(draw_list, pos_min, ImVec2(clip_max_x, pos_max.y), text, text_end_ellipsis, &text_size, ImVec2(0.0f, 0.0f));
+ float ellipsis_x = pos_min.x + text_size_clipped_x;
+ if (ellipsis_x + ellipsis_total_width <= ellipsis_max_x)
+ for (int i = 0; i < ellipsis_char_count; i++)
+ {
+ font->RenderChar(draw_list, font_size, ImVec2(ellipsis_x, pos_min.y), GetColorU32(ImGuiCol_Text), ellipsis_char);
+ ellipsis_x += ellipsis_glyph_width;
+ }
}
else
{
- window->DrawList->AddText(g.Font, g.FontSize, pos, GetColorU32(ImGuiCol_Text), text, text_display_end, 0.0f, NULL);
+ RenderTextClippedEx(draw_list, pos_min, ImVec2(clip_max_x, pos_max.y), text, text_end_full, &text_size, ImVec2(0.0f, 0.0f));
}
+
if (g.LogEnabled)
- LogRenderedText(&pos, text, text_display_end);
+ LogRenderedText(&pos_min, text, text_end_full);
}
// Render a rectangle shaped with optional rounding and borders
@@ -2231,13 +2504,11 @@ void ImGui::RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding)
}
// Render an arrow aimed to be aligned with text (p_min is a position in the same space text would be positioned). To e.g. denote expanded/collapsed state
-void ImGui::RenderArrow(ImVec2 p_min, ImGuiDir dir, float scale)
+void ImGui::RenderArrow(ImDrawList* draw_list, ImVec2 pos, ImU32 col, ImGuiDir dir, float scale)
{
- ImGuiContext& g = *GImGui;
-
- const float h = g.FontSize * 1.00f;
+ const float h = draw_list->_Data->FontSize * 1.00f;
float r = h * 0.40f * scale;
- ImVec2 center = p_min + ImVec2(h * 0.50f, h * 0.50f * scale);
+ ImVec2 center = pos + ImVec2(h * 0.50f, h * 0.50f * scale);
ImVec2 a, b, c;
switch (dir)
@@ -2261,15 +2532,12 @@ void ImGui::RenderArrow(ImVec2 p_min, ImGuiDir dir, float scale)
IM_ASSERT(0);
break;
}
-
- g.CurrentWindow->DrawList->AddTriangleFilled(center + a, center + b, center + c, GetColorU32(ImGuiCol_Text));
+ draw_list->AddTriangleFilled(center + a, center + b, center + c, col);
}
-void ImGui::RenderBullet(ImVec2 pos)
+void ImGui::RenderBullet(ImDrawList* draw_list, ImVec2 pos, ImU32 col)
{
- ImGuiContext& g = *GImGui;
- ImGuiWindow* window = g.CurrentWindow;
- window->DrawList->AddCircleFilled(pos, g.FontSize*0.20f, GetColorU32(ImGuiCol_Text), 8);
+ draw_list->AddCircleFilled(pos, draw_list->_Data->FontSize * 0.20f, col, 8);
}
void ImGui::RenderCheckMark(ImVec2 pos, ImU32 col, float sz)
@@ -2297,7 +2565,7 @@ void ImGui::RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFl
return;
if (g.NavDisableHighlight && !(flags & ImGuiNavHighlightFlags_AlwaysDraw))
return;
- ImGuiWindow* window = ImGui::GetCurrentWindow();
+ ImGuiWindow* window = g.CurrentWindow;
if (window->DC.NavHideHighlightOneFrame)
return;
@@ -2331,15 +2599,16 @@ ImGuiWindow::ImGuiWindow(ImGuiContext* context, const char* name)
: DrawListInst(&context->DrawListSharedData)
{
Name = ImStrdup(name);
- ID = ImHash(name, 0);
+ ID = ImHashStr(name);
IDStack.push_back(ID);
- Flags = 0;
+ Flags = ImGuiWindowFlags_None;
Pos = ImVec2(0.0f, 0.0f);
Size = SizeFull = ImVec2(0.0f, 0.0f);
- SizeContents = SizeContentsExplicit = ImVec2(0.0f, 0.0f);
+ ContentSize = ContentSizeExplicit = ImVec2(0.0f, 0.0f);
WindowPadding = ImVec2(0.0f, 0.0f);
WindowRounding = 0.0f;
WindowBorderSize = 0.0f;
+ NameBufLen = (int)strlen(name) + 1;
MoveId = GetID("#MOVE");
ChildId = 0;
Scroll = ImVec2(0.0f, 0.0f);
@@ -2354,23 +2623,28 @@ ImGuiWindow::ImGuiWindow(ImGuiContext* context, const char* name)
SkipItems = false;
Appearing = false;
Hidden = false;
+ IsFallbackWindow = false;
HasCloseButton = false;
+ ResizeBorderHeld = -1;
BeginCount = 0;
BeginOrderWithinParent = -1;
BeginOrderWithinContext = -1;
PopupId = 0;
AutoFitFramesX = AutoFitFramesY = -1;
- AutoFitOnlyGrows = false;
AutoFitChildAxises = 0x00;
+ AutoFitOnlyGrows = false;
AutoPosLastDirection = ImGuiDir_None;
- HiddenFramesRegular = HiddenFramesForResize = 0;
+ HiddenFramesCanSkipItems = HiddenFramesCannotSkipItems = 0;
SetWindowPosAllowFlags = SetWindowSizeAllowFlags = SetWindowCollapsedAllowFlags = ImGuiCond_Always | ImGuiCond_Once | ImGuiCond_FirstUseEver | ImGuiCond_Appearing;
SetWindowPosVal = SetWindowPosPivot = ImVec2(FLT_MAX, FLT_MAX);
+ InnerRect = ImRect(0.0f, 0.0f, 0.0f, 0.0f); // Clear so the InnerRect.GetSize() code in Begin() doesn't lead to overflow even if the result isn't used.
+
LastFrameActive = -1;
+ LastTimeActive = -1.0f;
ItemWidthDefault = 0.0f;
FontWindowScale = 1.0f;
- SettingsIdx = -1;
+ SettingsOffset = -1;
DrawList = &DrawListInst;
DrawList->_OwnerName = Name;
@@ -2383,9 +2657,8 @@ ImGuiWindow::ImGuiWindow(ImGuiContext* context, const char* name)
NavRectRel[0] = NavRectRel[1] = ImRect();
NavLastChildNavWindow = NULL;
- FocusIdxAllCounter = FocusIdxTabCounter = -1;
- FocusIdxAllRequestCurrent = FocusIdxTabRequestCurrent = INT_MAX;
- FocusIdxAllRequestNext = FocusIdxTabRequestNext = INT_MAX;
+ MemoryCompacted = false;
+ MemoryDrawListIdxCapacity = MemoryDrawListVtxCapacity = 0;
}
ImGuiWindow::~ImGuiWindow()
@@ -2393,13 +2666,13 @@ ImGuiWindow::~ImGuiWindow()
IM_ASSERT(DrawList == &DrawListInst);
IM_DELETE(Name);
for (int i = 0; i != ColumnsStorage.Size; i++)
- ColumnsStorage[i].~ImGuiColumnsSet();
+ ColumnsStorage[i].~ImGuiColumns();
}
ImGuiID ImGuiWindow::GetID(const char* str, const char* str_end)
{
ImGuiID seed = IDStack.back();
- ImGuiID id = ImHash(str, str_end ? (int)(str_end - str) : 0, seed);
+ ImGuiID id = ImHashStr(str, str_end ? (str_end - str) : 0, seed);
ImGui::KeepAliveID(id);
return id;
}
@@ -2407,7 +2680,15 @@ ImGuiID ImGuiWindow::GetID(const char* str, const char* str_end)
ImGuiID ImGuiWindow::GetID(const void* ptr)
{
ImGuiID seed = IDStack.back();
- ImGuiID id = ImHash(&ptr, sizeof(void*), seed);
+ ImGuiID id = ImHashData(&ptr, sizeof(void*), seed);
+ ImGui::KeepAliveID(id);
+ return id;
+}
+
+ImGuiID ImGuiWindow::GetID(int n)
+{
+ ImGuiID seed = IDStack.back();
+ ImGuiID id = ImHashData(&n, sizeof(n), seed);
ImGui::KeepAliveID(id);
return id;
}
@@ -2415,13 +2696,19 @@ ImGuiID ImGuiWindow::GetID(const void* ptr)
ImGuiID ImGuiWindow::GetIDNoKeepAlive(const char* str, const char* str_end)
{
ImGuiID seed = IDStack.back();
- return ImHash(str, str_end ? (int)(str_end - str) : 0, seed);
+ return ImHashStr(str, str_end ? (str_end - str) : 0, seed);
}
ImGuiID ImGuiWindow::GetIDNoKeepAlive(const void* ptr)
{
ImGuiID seed = IDStack.back();
- return ImHash(&ptr, sizeof(void*), seed);
+ return ImHashData(&ptr, sizeof(void*), seed);
+}
+
+ImGuiID ImGuiWindow::GetIDNoKeepAlive(int n)
+{
+ ImGuiID seed = IDStack.back();
+ return ImHashData(&n, sizeof(n), seed);
}
// This is only used in rare/specific situations to manufacture an ID out of nowhere.
@@ -2429,7 +2716,7 @@ ImGuiID ImGuiWindow::GetIDFromRectangle(const ImRect& r_abs)
{
ImGuiID seed = IDStack.back();
const int r_rel[4] = { (int)(r_abs.Min.x - Pos.x), (int)(r_abs.Min.y - Pos.y), (int)(r_abs.Max.x - Pos.x), (int)(r_abs.Max.y - Pos.y) };
- ImGuiID id = ImHash(&r_rel, sizeof(r_rel), seed);
+ ImGuiID id = ImHashData(&r_rel, sizeof(r_rel), seed);
ImGui::KeepAliveID(id);
return id;
}
@@ -2442,23 +2729,34 @@ static void SetCurrentWindow(ImGuiWindow* window)
g.FontSize = g.DrawListSharedData.FontSize = window->CalcFontSize();
}
-void ImGui::SetNavID(ImGuiID id, int nav_layer)
+// Free up/compact internal window buffers, we can use this when a window becomes unused.
+// This is currently unused by the library, but you may call this yourself for easy GC.
+// Not freed:
+// - ImGuiWindow, ImGuiWindowSettings, Name
+// - StateStorage, ColumnsStorage (may hold useful data)
+// This should have no noticeable visual effect. When the window reappear however, expect new allocation/buffer growth/copy cost.
+void ImGui::GcCompactTransientWindowBuffers(ImGuiWindow* window)
{
- ImGuiContext& g = *GImGui;
- IM_ASSERT(g.NavWindow);
- IM_ASSERT(nav_layer == 0 || nav_layer == 1);
- g.NavId = id;
- g.NavWindow->NavLastIds[nav_layer] = id;
+ window->MemoryCompacted = true;
+ window->MemoryDrawListIdxCapacity = window->DrawList->IdxBuffer.Capacity;
+ window->MemoryDrawListVtxCapacity = window->DrawList->VtxBuffer.Capacity;
+ window->IDStack.clear();
+ window->DrawList->ClearFreeMemory();
+ window->DC.ChildWindows.clear();
+ window->DC.ItemFlagsStack.clear();
+ window->DC.ItemWidthStack.clear();
+ window->DC.TextWrapPosStack.clear();
+ window->DC.GroupStack.clear();
}
-void ImGui::SetNavIDWithRectRel(ImGuiID id, int nav_layer, const ImRect& rect_rel)
+void ImGui::GcAwakeTransientWindowBuffers(ImGuiWindow* window)
{
- ImGuiContext& g = *GImGui;
- SetNavID(id, nav_layer);
- g.NavWindow->NavRectRel[nav_layer] = rect_rel;
- g.NavMousePosDirty = true;
- g.NavDisableHighlight = false;
- g.NavDisableMouseHover = true;
+ // We stored capacity of the ImDrawList buffer to reduce growth-caused allocation/copy when awakening.
+ // The other buffers tends to amortize much faster.
+ window->MemoryCompacted = false;
+ window->DrawList->IdxBuffer.reserve(window->MemoryDrawListIdxCapacity);
+ window->DrawList->VtxBuffer.reserve(window->MemoryDrawListVtxCapacity);
+ window->MemoryDrawListIdxCapacity = window->MemoryDrawListVtxCapacity = 0;
}
void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window)
@@ -2468,7 +2766,8 @@ void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window)
if (g.ActiveIdIsJustActivated)
{
g.ActiveIdTimer = 0.0f;
- g.ActiveIdHasBeenEdited = false;
+ g.ActiveIdHasBeenPressedBefore = false;
+ g.ActiveIdHasBeenEditedBefore = false;
if (id != 0)
{
g.LastActiveId = id;
@@ -2476,36 +2775,20 @@ void ImGui::SetActiveID(ImGuiID id, ImGuiWindow* window)
}
}
g.ActiveId = id;
- g.ActiveIdAllowNavDirFlags = 0;
g.ActiveIdAllowOverlap = false;
g.ActiveIdWindow = window;
+ g.ActiveIdHasBeenEditedThisFrame = false;
if (id)
{
g.ActiveIdIsAlive = id;
g.ActiveIdSource = (g.NavActivateId == id || g.NavInputId == id || g.NavJustTabbedId == id || g.NavJustMovedToId == id) ? ImGuiInputSource_Nav : ImGuiInputSource_Mouse;
}
-}
-void ImGui::SetFocusID(ImGuiID id, ImGuiWindow* window)
-{
- ImGuiContext& g = *GImGui;
- IM_ASSERT(id != 0);
-
- // Assume that SetFocusID() is called in the context where its NavLayer is the current layer, which is the case everywhere we call it.
- const int nav_layer = window->DC.NavLayerCurrent;
- if (g.NavWindow != window)
- g.NavInitRequest = false;
- g.NavId = id;
- g.NavWindow = window;
- g.NavLayer = nav_layer;
- window->NavLastIds[nav_layer] = id;
- if (window->DC.LastItemId == id)
- window->NavRectRel[nav_layer] = ImRect(window->DC.LastItemRect.Min - window->Pos, window->DC.LastItemRect.Max - window->Pos);
-
- if (g.ActiveIdSource == ImGuiInputSource_Nav)
- g.NavDisableMouseHover = true;
- else
- g.NavDisableHighlight = true;
+ // Clear declaration of inputs claimed by the widget
+ // (Please note that this is WIP and not all keys/inputs are thoroughly declared by all widgets yet)
+ g.ActiveIdUsingNavDirMask = 0x00;
+ g.ActiveIdUsingNavInputMask = 0x00;
+ g.ActiveIdUsingKeyInputMask = 0x00;
}
void ImGui::ClearActiveID()
@@ -2541,11 +2824,12 @@ void ImGui::MarkItemEdited(ImGuiID id)
{
// This marking is solely to be able to provide info for IsItemDeactivatedAfterEdit().
// ActiveId might have been released by the time we call this (as in the typical press/release button behavior) but still need need to fill the data.
- (void)id; // Avoid unused variable warnings when asserts are compiled out.
ImGuiContext& g = *GImGui;
IM_ASSERT(g.ActiveId == id || g.ActiveId == 0 || g.DragDropActive);
+ IM_UNUSED(id); // Avoid unused variable warnings when asserts are compiled out.
//IM_ASSERT(g.CurrentWindow->DC.LastItemId == id);
- g.ActiveIdHasBeenEdited = true;
+ g.ActiveIdHasBeenEditedThisFrame = true;
+ g.ActiveIdHasBeenEditedBefore = true;
g.CurrentWindow->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_Edited;
}
@@ -2565,40 +2849,46 @@ static inline bool IsWindowContentHoverable(ImGuiWindow* window, ImGuiHoveredFla
if ((focused_root_window->Flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiHoveredFlags_AllowWhenBlockedByPopup))
return false;
}
-
return true;
}
// Advance cursor given item size for layout.
-void ImGui::ItemSize(const ImVec2& size, float text_offset_y)
+void ImGui::ItemSize(const ImVec2& size, float text_baseline_y)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
if (window->SkipItems)
return;
+ // We increase the height in this function to accommodate for baseline offset.
+ // In theory we should be offsetting the starting position (window->DC.CursorPos), that will be the topic of a larger refactor,
+ // but since ItemSize() is not yet an API that moves the cursor (to handle e.g. wrapping) enlarging the height has the same effect.
+ const float offset_to_match_baseline_y = (text_baseline_y >= 0) ? ImMax(0.0f, window->DC.CurrLineTextBaseOffset - text_baseline_y) : 0.0f;
+ const float line_height = ImMax(window->DC.CurrLineSize.y, size.y + offset_to_match_baseline_y);
+
// Always align ourselves on pixel boundaries
- const float line_height = ImMax(window->DC.CurrentLineSize.y, size.y);
- const float text_base_offset = ImMax(window->DC.CurrentLineTextBaseOffset, text_offset_y);
//if (g.IO.KeyAlt) window->DrawList->AddRect(window->DC.CursorPos, window->DC.CursorPos + ImVec2(size.x, line_height), IM_COL32(255,0,0,200)); // [DEBUG]
- window->DC.CursorPosPrevLine = ImVec2(window->DC.CursorPos.x + size.x, window->DC.CursorPos.y);
- window->DC.CursorPos = ImVec2((float)(int)(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x), (float)(int)(window->DC.CursorPos.y + line_height + g.Style.ItemSpacing.y));
+ window->DC.CursorPosPrevLine.x = window->DC.CursorPos.x + size.x;
+ window->DC.CursorPosPrevLine.y = window->DC.CursorPos.y;
+ window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x); // Next line
+ window->DC.CursorPos.y = IM_FLOOR(window->DC.CursorPos.y + line_height + g.Style.ItemSpacing.y); // Next line
window->DC.CursorMaxPos.x = ImMax(window->DC.CursorMaxPos.x, window->DC.CursorPosPrevLine.x);
window->DC.CursorMaxPos.y = ImMax(window->DC.CursorMaxPos.y, window->DC.CursorPos.y - g.Style.ItemSpacing.y);
//if (g.IO.KeyAlt) window->DrawList->AddCircle(window->DC.CursorMaxPos, 3.0f, IM_COL32(255,0,0,255), 4); // [DEBUG]
window->DC.PrevLineSize.y = line_height;
- window->DC.PrevLineTextBaseOffset = text_base_offset;
- window->DC.CurrentLineSize.y = window->DC.CurrentLineTextBaseOffset = 0.0f;
+ window->DC.CurrLineSize.y = 0.0f;
+ window->DC.PrevLineTextBaseOffset = ImMax(window->DC.CurrLineTextBaseOffset, text_baseline_y);
+ window->DC.CurrLineTextBaseOffset = 0.0f;
// Horizontal layout mode
if (window->DC.LayoutType == ImGuiLayoutType_Horizontal)
SameLine();
}
-void ImGui::ItemSize(const ImRect& bb, float text_offset_y)
+void ImGui::ItemSize(const ImRect& bb, float text_baseline_y)
{
- ItemSize(bb.GetSize(), text_offset_y);
+ ItemSize(bb.GetSize(), text_baseline_y);
}
// Declare item bounding box for clipping and interaction.
@@ -2606,10 +2896,6 @@ void ImGui::ItemSize(const ImRect& bb, float text_offset_y)
// declare their minimum size requirement to ItemSize() and then use a larger region for drawing/interaction, which is passed to ItemAdd().
bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg)
{
-#ifdef IMGUI_ENABLE_TEST_ENGINE_HOOKS
- ImGuiTestEngineHook_ItemAdd(bb, id, nav_bb_arg);
-#endif
-
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
@@ -2617,19 +2903,38 @@ bool ImGui::ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb_arg)
{
// Navigation processing runs prior to clipping early-out
// (a) So that NavInitRequest can be honored, for newly opened windows to select a default widget
- // (b) So that we can scroll up/down past clipped items. This adds a small O(N) cost to regular navigation requests unfortunately, but it is still limited to one window.
- // it may not scale very well for windows with ten of thousands of item, but at least NavMoveRequest is only set on user interaction, aka maximum once a frame.
- // We could early out with "if (is_clipped && !g.NavInitRequest) return false;" but when we wouldn't be able to reach unclipped widgets. This would work if user had explicit scrolling control (e.g. mapped on a stick)
+ // (b) So that we can scroll up/down past clipped items. This adds a small O(N) cost to regular navigation requests
+ // unfortunately, but it is still limited to one window. It may not scale very well for windows with ten of
+ // thousands of item, but at least NavMoveRequest is only set on user interaction, aka maximum once a frame.
+ // We could early out with "if (is_clipped && !g.NavInitRequest) return false;" but when we wouldn't be able
+ // to reach unclipped widgets. This would work if user had explicit scrolling control (e.g. mapped on a stick).
+ // We intentionally don't check if g.NavWindow != NULL because g.NavAnyRequest should only be set when it is non null.
+ // If we crash on a NULL g.NavWindow we need to fix the bug elsewhere.
window->DC.NavLayerActiveMaskNext |= window->DC.NavLayerCurrentMask;
if (g.NavId == id || g.NavAnyRequest)
if (g.NavWindow->RootWindowForNav == window->RootWindowForNav)
if (window == g.NavWindow || ((window->Flags | g.NavWindow->Flags) & ImGuiWindowFlags_NavFlattened))
NavProcessItem(window, nav_bb_arg ? *nav_bb_arg : bb, id);
+
+ // [DEBUG] Item Picker tool, when enabling the "extended" version we perform the check in ItemAdd()
+#ifdef IMGUI_DEBUG_TOOL_ITEM_PICKER_EX
+ if (id == g.DebugItemPickerBreakId)
+ {
+ IM_DEBUG_BREAK();
+ g.DebugItemPickerBreakId = 0;
+ }
+#endif
}
window->DC.LastItemId = id;
window->DC.LastItemRect = bb;
- window->DC.LastItemStatusFlags = 0;
+ window->DC.LastItemStatusFlags = ImGuiItemStatusFlags_None;
+ g.NextItemData.Flags = ImGuiNextItemDataFlags_None;
+
+#ifdef IMGUI_ENABLE_TEST_ENGINE
+ if (id != 0)
+ IMGUI_TEST_ENGINE_ITEM_ADD(nav_bb_arg ? *nav_bb_arg : bb, id);
+#endif
// Clipping test
const bool is_clipped = IsClippedEx(bb, id, false);
@@ -2671,7 +2976,8 @@ bool ImGui::IsItemHovered(ImGuiHoveredFlags flags)
if (g.ActiveId != 0 && g.ActiveId != window->DC.LastItemId && !g.ActiveIdAllowOverlap && g.ActiveId != window->MoveId)
return false;
- // Test if interactions on this window are blocked by an active popup or modal
+ // Test if interactions on this window are blocked by an active popup or modal.
+ // The ImGuiHoveredFlags_AllowWhenBlockedByPopup flag will be tested here.
if (!IsWindowContentHoverable(window, flags))
return false;
@@ -2679,7 +2985,8 @@ bool ImGui::IsItemHovered(ImGuiHoveredFlags flags)
if ((window->DC.ItemFlags & ImGuiItemFlags_Disabled) && !(flags & ImGuiHoveredFlags_AllowWhenDisabled))
return false;
- // Special handling for the 1st item after Begin() which represent the title bar. When the window is collapsed (SkipItems==true) that last item will never be overwritten so we need to detect tht case.
+ // Special handling for the dummy item after Begin() which represent the title bar or tab.
+ // When the window is collapsed (SkipItems==true) that last item will never be overwritten so we need to detect the case.
if (window->DC.LastItemId == window->MoveId && window->WriteAccessed)
return false;
return true;
@@ -2705,6 +3012,17 @@ bool ImGui::ItemHoverable(const ImRect& bb, ImGuiID id)
return false;
SetHoveredID(id);
+
+ // [DEBUG] Item Picker tool!
+ // We perform the check here because SetHoveredID() is not frequently called (1~ time a frame), making
+ // the cost of this tool near-zero. We can get slightly better call-stack and support picking non-hovered
+ // items if we perform the test in ItemAdd(), but that would incur a small runtime cost.
+ // #define IMGUI_DEBUG_TOOL_ITEM_PICKER_EX in imconfig.h if you want this check to also be performed in ItemAdd().
+ if (g.DebugItemPickerActive && g.HoveredIdPreviousFrame == id)
+ GetForegroundDrawList()->AddRect(bb.Min, bb.Max, IM_COL32(255, 255, 0, 255));
+ if (g.DebugItemPickerBreakId == id)
+ IM_DEBUG_BREAK();
+
return true;
}
@@ -2719,26 +3037,39 @@ bool ImGui::IsClippedEx(const ImRect& bb, ImGuiID id, bool clip_even_when_logged
return false;
}
-bool ImGui::FocusableItemRegister(ImGuiWindow* window, ImGuiID id, bool tab_stop)
+// Process TAB/Shift+TAB. Be mindful that this function may _clear_ the ActiveID when tabbing out.
+bool ImGui::FocusableItemRegister(ImGuiWindow* window, ImGuiID id)
{
ImGuiContext& g = *GImGui;
+ // Increment counters
const bool is_tab_stop = (window->DC.ItemFlags & (ImGuiItemFlags_NoTabStop | ImGuiItemFlags_Disabled)) == 0;
- window->FocusIdxAllCounter++;
+ window->DC.FocusCounterRegular++;
if (is_tab_stop)
- window->FocusIdxTabCounter++;
+ window->DC.FocusCounterTabStop++;
- // Process keyboard input at this point: TAB/Shift-TAB to tab out of the currently focused item.
- // Note that we can always TAB out of a widget that doesn't allow tabbing in.
- if (tab_stop && (g.ActiveId == id) && window->FocusIdxAllRequestNext == INT_MAX && window->FocusIdxTabRequestNext == INT_MAX && !g.IO.KeyCtrl && IsKeyPressedMap(ImGuiKey_Tab))
- window->FocusIdxTabRequestNext = window->FocusIdxTabCounter + (g.IO.KeyShift ? (is_tab_stop ? -1 : 0) : +1); // Modulo on index will be applied at the end of frame once we've got the total counter of items.
+ // Process TAB/Shift-TAB to tab *OUT* of the currently focused item.
+ // (Note that we can always TAB out of a widget that doesn't allow tabbing in)
+ if (g.ActiveId == id && g.FocusTabPressed && !IsActiveIdUsingKey(ImGuiKey_Tab) && g.FocusRequestNextWindow == NULL)
+ {
+ g.FocusRequestNextWindow = window;
+ g.FocusRequestNextCounterTabStop = window->DC.FocusCounterTabStop + (g.IO.KeyShift ? (is_tab_stop ? -1 : 0) : +1); // Modulo on index will be applied at the end of frame once we've got the total counter of items.
+ }
- if (window->FocusIdxAllCounter == window->FocusIdxAllRequestCurrent)
- return true;
- if (is_tab_stop && window->FocusIdxTabCounter == window->FocusIdxTabRequestCurrent)
+ // Handle focus requests
+ if (g.FocusRequestCurrWindow == window)
{
- g.NavJustTabbedId = id;
- return true;
+ if (window->DC.FocusCounterRegular == g.FocusRequestCurrCounterRegular)
+ return true;
+ if (is_tab_stop && window->DC.FocusCounterTabStop == g.FocusRequestCurrCounterTabStop)
+ {
+ g.NavJustTabbedId = id;
+ return true;
+ }
+
+ // If another item is about to be focused, we clear our own active id
+ if (g.ActiveId == id)
+ ClearActiveID();
}
return false;
@@ -2746,21 +3077,8 @@ bool ImGui::FocusableItemRegister(ImGuiWindow* window, ImGuiID id, bool tab_stop
void ImGui::FocusableItemUnregister(ImGuiWindow* window)
{
- window->FocusIdxAllCounter--;
- window->FocusIdxTabCounter--;
-}
-
-ImVec2 ImGui::CalcItemSize(ImVec2 size, float default_x, float default_y)
-{
- ImGuiContext& g = *GImGui;
- ImVec2 content_max;
- if (size.x < 0.0f || size.y < 0.0f)
- content_max = g.CurrentWindow->Pos + GetContentRegionMax();
- if (size.x <= 0.0f)
- size.x = (size.x == 0.0f) ? default_x : ImMax(content_max.x - g.CurrentWindow->DC.CursorPos.x, 4.0f) + size.x;
- if (size.y <= 0.0f)
- size.y = (size.y == 0.0f) ? default_y : ImMax(content_max.y - g.CurrentWindow->DC.CursorPos.y, 4.0f) + size.y;
- return size;
+ window->DC.FocusCounterRegular--;
+ window->DC.FocusCounterTabStop--;
}
float ImGui::CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x)
@@ -2768,15 +3086,16 @@ float ImGui::CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x)
if (wrap_pos_x < 0.0f)
return 0.0f;
- ImGuiWindow* window = GetCurrentWindowRead();
+ ImGuiWindow* window = GImGui->CurrentWindow;
if (wrap_pos_x == 0.0f)
- wrap_pos_x = GetContentRegionMax().x + window->Pos.x;
+ wrap_pos_x = window->WorkRect.Max.x;
else if (wrap_pos_x > 0.0f)
wrap_pos_x += window->Pos.x - window->Scroll.x; // wrap_pos_x is provided is window local space
return ImMax(wrap_pos_x - pos.x, 1.0f);
}
+// IM_ALLOC() == ImGui::MemAlloc()
void* ImGui::MemAlloc(size_t size)
{
if (ImGuiContext* ctx = GImGui)
@@ -2784,9 +3103,10 @@ void* ImGui::MemAlloc(size_t size)
return GImAllocatorAllocFunc(size, GImAllocatorUserData);
}
+// IM_FREE() == ImGui::MemFree()
void ImGui::MemFree(void* ptr)
{
- if (ptr)
+ if (ptr)
if (ImGuiContext* ctx = GImGui)
ctx->IO.MetricsActiveAllocations--;
return GImAllocatorFreeFunc(ptr, GImAllocatorUserData);
@@ -2794,13 +3114,15 @@ void ImGui::MemFree(void* ptr)
const char* ImGui::GetClipboardText()
{
- return GImGui->IO.GetClipboardTextFn ? GImGui->IO.GetClipboardTextFn(GImGui->IO.ClipboardUserData) : "";
+ ImGuiContext& g = *GImGui;
+ return g.IO.GetClipboardTextFn ? g.IO.GetClipboardTextFn(g.IO.ClipboardUserData) : "";
}
void ImGui::SetClipboardText(const char* text)
{
- if (GImGui->IO.SetClipboardTextFn)
- GImGui->IO.SetClipboardTextFn(GImGui->IO.ClipboardUserData, text);
+ ImGuiContext& g = *GImGui;
+ if (g.IO.SetClipboardTextFn)
+ g.IO.SetClipboardTextFn(g.IO.ClipboardUserData, text);
}
const char* ImGui::GetVersion()
@@ -2808,7 +3130,7 @@ const char* ImGui::GetVersion()
return IMGUI_VERSION;
}
-// Internal state access - if you want to share ImGui state between modules (e.g. DLL) or allocate it yourself
+// Internal state access - if you want to share Dear ImGui state between modules (e.g. DLL) or allocate it yourself
// Note that we still point to some static data and members (such as GFontAtlas), so the state instance you end up using will point to the static data within its module
ImGuiContext* ImGui::GetCurrentContext()
{
@@ -2824,9 +3146,12 @@ void ImGui::SetCurrentContext(ImGuiContext* ctx)
#endif
}
-// Helper function to verify that the type sizes are matching between the calling file's compilation unit and imgui.cpp's compilation unit
-// If the user has inconsistent compilation settings, imgui configuration #define, packing pragma, etc. you may see different structures from what imgui.cpp sees which is highly problematic.
-bool ImGui::DebugCheckVersionAndDataLayout(const char* version, size_t sz_io, size_t sz_style, size_t sz_vec2, size_t sz_vec4, size_t sz_vert)
+// Helper function to verify ABI compatibility between caller code and compiled version of Dear ImGui.
+// Verify that the type sizes are matching between the calling file's compilation unit and imgui.cpp's compilation unit
+// If the user has inconsistent compilation settings, imgui configuration #define, packing pragma, etc. your user code
+// may see different structures than what imgui.cpp sees, which is problematic.
+// We usually require settings to be in imconfig.h to make sure that they are accessible to all compilation units involved with Dear ImGui.
+bool ImGui::DebugCheckVersionAndDataLayout(const char* version, size_t sz_io, size_t sz_style, size_t sz_vec2, size_t sz_vec4, size_t sz_vert, size_t sz_idx)
{
bool error = false;
if (strcmp(version, IMGUI_VERSION)!=0) { error = true; IM_ASSERT(strcmp(version,IMGUI_VERSION)==0 && "Mismatched version string!"); }
@@ -2835,10 +3160,11 @@ bool ImGui::DebugCheckVersionAndDataLayout(const char* version, size_t sz_io, si
if (sz_vec2 != sizeof(ImVec2)) { error = true; IM_ASSERT(sz_vec2 == sizeof(ImVec2) && "Mismatched struct layout!"); }
if (sz_vec4 != sizeof(ImVec4)) { error = true; IM_ASSERT(sz_vec4 == sizeof(ImVec4) && "Mismatched struct layout!"); }
if (sz_vert != sizeof(ImDrawVert)) { error = true; IM_ASSERT(sz_vert == sizeof(ImDrawVert) && "Mismatched struct layout!"); }
+ if (sz_idx != sizeof(ImDrawIdx)) { error = true; IM_ASSERT(sz_idx == sizeof(ImDrawIdx) && "Mismatched struct layout!"); }
return !error;
}
-void ImGui::SetAllocatorFunctions(void* (*alloc_func)(size_t sz, void* user_data), void(*free_func)(void* ptr, void* user_data), void* user_data)
+void ImGui::SetAllocatorFunctions(void* (*alloc_func)(size_t sz, void* user_data), void (*free_func)(void* ptr, void* user_data), void* user_data)
{
GImAllocatorAllocFunc = alloc_func;
GImAllocatorFreeFunc = free_func;
@@ -2866,13 +3192,13 @@ void ImGui::DestroyContext(ImGuiContext* ctx)
ImGuiIO& ImGui::GetIO()
{
- IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() or ImGui::SetCurrentContext()?");
+ IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?");
return GImGui->IO;
}
ImGuiStyle& ImGui::GetStyle()
{
- IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() or ImGui::SetCurrentContext()?");
+ IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?");
return GImGui->Style;
}
@@ -2893,9 +3219,14 @@ int ImGui::GetFrameCount()
return GImGui->FrameCount;
}
-ImDrawList* ImGui::GetOverlayDrawList()
+ImDrawList* ImGui::GetBackgroundDrawList()
+{
+ return &GImGui->BackgroundDrawList;
+}
+
+ImDrawList* ImGui::GetForegroundDrawList()
{
- return &GImGui->OverlayDrawList;
+ return &GImGui->ForegroundDrawList;
}
ImDrawListSharedData* ImGui::GetDrawListSharedData()
@@ -2906,18 +3237,24 @@ ImDrawListSharedData* ImGui::GetDrawListSharedData()
void ImGui::StartMouseMovingWindow(ImGuiWindow* window)
{
// Set ActiveId even if the _NoMove flag is set. Without it, dragging away from a window with _NoMove would activate hover on other windows.
+ // We _also_ call this when clicking in a window empty space when io.ConfigWindowsMoveFromTitleBarOnly is set, but clear g.MovingWindow afterward.
+ // This is because we want ActiveId to be set even when the window is not permitted to move.
ImGuiContext& g = *GImGui;
FocusWindow(window);
SetActiveID(window->MoveId, window);
g.NavDisableHighlight = true;
g.ActiveIdClickOffset = g.IO.MousePos - window->RootWindow->Pos;
- if (!(window->Flags & ImGuiWindowFlags_NoMove) && !(window->RootWindow->Flags & ImGuiWindowFlags_NoMove))
+
+ bool can_move_window = true;
+ if ((window->Flags & ImGuiWindowFlags_NoMove) || (window->RootWindow->Flags & ImGuiWindowFlags_NoMove))
+ can_move_window = false;
+ if (can_move_window)
g.MovingWindow = window;
}
// Handle mouse moving window
// Note: moving window with the navigation keys (Square + d-pad / CTRL+TAB + Arrows) are processed in NavUpdateWindowing()
-void ImGui::UpdateMouseMovingWindow()
+void ImGui::UpdateMouseMovingWindowNewFrame()
{
ImGuiContext& g = *GImGui;
if (g.MovingWindow != NULL)
@@ -2955,6 +3292,58 @@ void ImGui::UpdateMouseMovingWindow()
}
}
+// Initiate moving window when clicking on empty space or title bar.
+// Handle left-click and right-click focus.
+void ImGui::UpdateMouseMovingWindowEndFrame()
+{
+ ImGuiContext& g = *GImGui;
+ if (g.ActiveId != 0 || g.HoveredId != 0)
+ return;
+
+ // Unless we just made a window/popup appear
+ if (g.NavWindow && g.NavWindow->Appearing)
+ return;
+
+ // Click to focus window and start moving (after we're done with all our widgets)
+ if (g.IO.MouseClicked[0])
+ {
+ if (g.HoveredRootWindow != NULL)
+ {
+ StartMouseMovingWindow(g.HoveredWindow);
+ if (g.IO.ConfigWindowsMoveFromTitleBarOnly && !(g.HoveredRootWindow->Flags & ImGuiWindowFlags_NoTitleBar))
+ if (!g.HoveredRootWindow->TitleBarRect().Contains(g.IO.MouseClickedPos[0]))
+ g.MovingWindow = NULL;
+ }
+ else if (g.NavWindow != NULL && GetTopMostPopupModal() == NULL)
+ {
+ // Clicking on void disable focus
+ FocusWindow(NULL);
+ }
+ }
+
+ // With right mouse button we close popups without changing focus based on where the mouse is aimed
+ // Instead, focus will be restored to the window under the bottom-most closed popup.
+ // (The left mouse button path calls FocusWindow on the hovered window, which will lead NewFrame->ClosePopupsOverWindow to trigger)
+ if (g.IO.MouseClicked[1])
+ {
+ // Find the top-most window between HoveredWindow and the top-most Modal Window.
+ // This is where we can trim the popup stack.
+ ImGuiWindow* modal = GetTopMostPopupModal();
+ bool hovered_window_above_modal = false;
+ if (modal == NULL)
+ hovered_window_above_modal = true;
+ for (int i = g.Windows.Size - 1; i >= 0 && hovered_window_above_modal == false; i--)
+ {
+ ImGuiWindow* window = g.Windows[i];
+ if (window == modal)
+ break;
+ if (window == g.HoveredWindow)
+ hovered_window_above_modal = true;
+ }
+ ClosePopupsOverWindow(hovered_window_above_modal ? g.HoveredWindow : modal, true);
+ }
+}
+
static bool IsWindowActiveAndVisible(ImGuiWindow* window)
{
return (window->Active) && (!window->Hidden);
@@ -2966,7 +3355,7 @@ static void ImGui::UpdateMouseInputs()
// Round mouse position to avoid spreading non-rounded position (e.g. UpdateManualResize doesn't support them well)
if (IsMousePosValid(&g.IO.MousePos))
- g.IO.MousePos = ImFloor(g.IO.MousePos);
+ g.IO.MousePos = g.LastValidMousePos = ImFloor(g.IO.MousePos);
// If mouse just appeared or disappeared (usually denoted by -FLT_MAX components) we cancel out movement in MouseDelta
if (IsMousePosValid(&g.IO.MousePos) && IsMousePosValid(&g.IO.MousePosPrev))
@@ -2998,6 +3387,7 @@ static void ImGui::UpdateMouseInputs()
g.IO.MouseClickedTime[i] = g.Time;
}
g.IO.MouseClickedPos[i] = g.IO.MousePos;
+ g.IO.MouseDownWasDoubleClick[i] = g.IO.MouseDoubleClicked[i];
g.IO.MouseDragMaxDistanceAbs[i] = ImVec2(0.0f, 0.0f);
g.IO.MouseDragMaxDistanceSqr[i] = 0.0f;
}
@@ -3009,53 +3399,96 @@ static void ImGui::UpdateMouseInputs()
g.IO.MouseDragMaxDistanceAbs[i].x = ImMax(g.IO.MouseDragMaxDistanceAbs[i].x, delta_from_click_pos.x < 0.0f ? -delta_from_click_pos.x : delta_from_click_pos.x);
g.IO.MouseDragMaxDistanceAbs[i].y = ImMax(g.IO.MouseDragMaxDistanceAbs[i].y, delta_from_click_pos.y < 0.0f ? -delta_from_click_pos.y : delta_from_click_pos.y);
}
+ if (!g.IO.MouseDown[i] && !g.IO.MouseReleased[i])
+ g.IO.MouseDownWasDoubleClick[i] = false;
if (g.IO.MouseClicked[i]) // Clicking any mouse button reactivate mouse hovering which may have been deactivated by gamepad/keyboard navigation
g.NavDisableMouseHover = false;
}
}
-void ImGui::UpdateMouseWheel()
+static void StartLockWheelingWindow(ImGuiWindow* window)
{
ImGuiContext& g = *GImGui;
- if (!g.HoveredWindow || g.HoveredWindow->Collapsed)
+ if (g.WheelingWindow == window)
return;
+ g.WheelingWindow = window;
+ g.WheelingWindowRefMousePos = g.IO.MousePos;
+ g.WheelingWindowTimer = WINDOWS_MOUSE_WHEEL_SCROLL_LOCK_TIMER;
+}
+
+void ImGui::UpdateMouseWheel()
+{
+ ImGuiContext& g = *GImGui;
+
+ // Reset the locked window if we move the mouse or after the timer elapses
+ if (g.WheelingWindow != NULL)
+ {
+ g.WheelingWindowTimer -= g.IO.DeltaTime;
+ if (IsMousePosValid() && ImLengthSqr(g.IO.MousePos - g.WheelingWindowRefMousePos) > g.IO.MouseDragThreshold * g.IO.MouseDragThreshold)
+ g.WheelingWindowTimer = 0.0f;
+ if (g.WheelingWindowTimer <= 0.0f)
+ {
+ g.WheelingWindow = NULL;
+ g.WheelingWindowTimer = 0.0f;
+ }
+ }
+
if (g.IO.MouseWheel == 0.0f && g.IO.MouseWheelH == 0.0f)
return;
- // If a child window has the ImGuiWindowFlags_NoScrollWithMouse flag, we give a chance to scroll its parent (unless either ImGuiWindowFlags_NoInputs or ImGuiWindowFlags_NoScrollbar are also set).
- ImGuiWindow* window = g.HoveredWindow;
- ImGuiWindow* scroll_window = window;
- while ((scroll_window->Flags & ImGuiWindowFlags_ChildWindow) && (scroll_window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(scroll_window->Flags & ImGuiWindowFlags_NoScrollbar) && !(scroll_window->Flags & ImGuiWindowFlags_NoMouseInputs) && scroll_window->ParentWindow)
- scroll_window = scroll_window->ParentWindow;
- const bool scroll_allowed = !(scroll_window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(scroll_window->Flags & ImGuiWindowFlags_NoMouseInputs);
+ ImGuiWindow* window = g.WheelingWindow ? g.WheelingWindow : g.HoveredWindow;
+ if (!window || window->Collapsed)
+ return;
- if (g.IO.MouseWheel != 0.0f)
+ // Zoom / Scale window
+ // FIXME-OBSOLETE: This is an old feature, it still works but pretty much nobody is using it and may be best redesigned.
+ if (g.IO.MouseWheel != 0.0f && g.IO.KeyCtrl && g.IO.FontAllowUserScaling)
{
- if (g.IO.KeyCtrl && g.IO.FontAllowUserScaling)
+ StartLockWheelingWindow(window);
+ const float new_font_scale = ImClamp(window->FontWindowScale + g.IO.MouseWheel * 0.10f, 0.50f, 2.50f);
+ const float scale = new_font_scale / window->FontWindowScale;
+ window->FontWindowScale = new_font_scale;
+ if (!(window->Flags & ImGuiWindowFlags_ChildWindow))
{
- // Zoom / Scale window
- const float new_font_scale = ImClamp(window->FontWindowScale + g.IO.MouseWheel * 0.10f, 0.50f, 2.50f);
- const float scale = new_font_scale / window->FontWindowScale;
- window->FontWindowScale = new_font_scale;
-
const ImVec2 offset = window->Size * (1.0f - scale) * (g.IO.MousePos - window->Pos) / window->Size;
- window->Pos += offset;
- window->Size *= scale;
- window->SizeFull *= scale;
+ SetWindowPos(window, window->Pos + offset, 0);
+ window->Size = ImFloor(window->Size * scale);
+ window->SizeFull = ImFloor(window->SizeFull * scale);
}
- else if (!g.IO.KeyCtrl && scroll_allowed)
+ return;
+ }
+
+ // Mouse wheel scrolling
+ // If a child window has the ImGuiWindowFlags_NoScrollWithMouse flag, we give a chance to scroll its parent
+
+ // Vertical Mouse Wheel scrolling
+ const float wheel_y = (g.IO.MouseWheel != 0.0f && !g.IO.KeyShift) ? g.IO.MouseWheel : 0.0f;
+ if (wheel_y != 0.0f && !g.IO.KeyCtrl)
+ {
+ StartLockWheelingWindow(window);
+ while ((window->Flags & ImGuiWindowFlags_ChildWindow) && ((window->ScrollMax.y == 0.0f) || ((window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs))))
+ window = window->ParentWindow;
+ if (!(window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs))
{
- // Mouse wheel vertical scrolling
- float scroll_amount = 5 * scroll_window->CalcFontSize();
- scroll_amount = (float)(int)ImMin(scroll_amount, (scroll_window->ContentsRegionRect.GetHeight() + scroll_window->WindowPadding.y * 2.0f) * 0.67f);
- SetWindowScrollY(scroll_window, scroll_window->Scroll.y - g.IO.MouseWheel * scroll_amount);
+ float max_step = window->InnerRect.GetHeight() * 0.67f;
+ float scroll_step = ImFloor(ImMin(5 * window->CalcFontSize(), max_step));
+ SetScrollY(window, window->Scroll.y - wheel_y * scroll_step);
}
}
- if (g.IO.MouseWheelH != 0.0f && scroll_allowed && !g.IO.KeyCtrl)
+
+ // Horizontal Mouse Wheel scrolling, or Vertical Mouse Wheel w/ Shift held
+ const float wheel_x = (g.IO.MouseWheelH != 0.0f && !g.IO.KeyShift) ? g.IO.MouseWheelH : (g.IO.MouseWheel != 0.0f && g.IO.KeyShift) ? g.IO.MouseWheel : 0.0f;
+ if (wheel_x != 0.0f && !g.IO.KeyCtrl)
{
- // Mouse wheel horizontal scrolling (for hardware that supports it)
- float scroll_amount = scroll_window->CalcFontSize();
- SetWindowScrollX(scroll_window, scroll_window->Scroll.x - g.IO.MouseWheelH * scroll_amount);
+ StartLockWheelingWindow(window);
+ while ((window->Flags & ImGuiWindowFlags_ChildWindow) && ((window->ScrollMax.x == 0.0f) || ((window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs))))
+ window = window->ParentWindow;
+ if (!(window->Flags & ImGuiWindowFlags_NoScrollWithMouse) && !(window->Flags & ImGuiWindowFlags_NoMouseInputs))
+ {
+ float max_step = window->InnerRect.GetWidth() * 0.67f;
+ float scroll_step = ImFloor(ImMin(2 * window->CalcFontSize(), max_step));
+ SetScrollX(window, window->Scroll.x - wheel_x * scroll_step);
+ }
}
}
@@ -3071,7 +3504,7 @@ void ImGui::UpdateHoveredWindowAndCaptureFlags()
FindHoveredWindow();
// Modal windows prevents cursor from hovering behind them.
- ImGuiWindow* modal_window = GetFrontMostPopupModal();
+ ImGuiWindow* modal_window = GetTopMostPopupModal();
if (modal_window)
if (g.HoveredRootWindow && !IsWindowChildOf(g.HoveredRootWindow, modal_window))
g.HoveredRootWindow = g.HoveredWindow = NULL;
@@ -3100,13 +3533,13 @@ void ImGui::UpdateHoveredWindowAndCaptureFlags()
if (!mouse_avail_to_imgui && !mouse_dragging_extern_payload)
g.HoveredWindow = g.HoveredRootWindow = NULL;
- // Update io.WantCaptureMouse for the user application (true = dispatch mouse info to imgui, false = dispatch mouse info to imgui + app)
+ // Update io.WantCaptureMouse for the user application (true = dispatch mouse info to imgui, false = dispatch mouse info to Dear ImGui + app)
if (g.WantCaptureMouseNextFrame != -1)
g.IO.WantCaptureMouse = (g.WantCaptureMouseNextFrame != 0);
else
g.IO.WantCaptureMouse = (mouse_avail_to_imgui && (g.HoveredWindow != NULL || mouse_any_down)) || (!g.OpenPopupStack.empty());
- // Update io.WantCaptureKeyboard for the user application (true = dispatch keyboard info to imgui, false = dispatch keyboard info to imgui + app)
+ // Update io.WantCaptureKeyboard for the user application (true = dispatch keyboard info to imgui, false = dispatch keyboard info to Dear ImGui + app)
if (g.WantCaptureKeyboardNextFrame != -1)
g.IO.WantCaptureKeyboard = (g.WantCaptureKeyboardNextFrame != 0);
else
@@ -3118,25 +3551,23 @@ void ImGui::UpdateHoveredWindowAndCaptureFlags()
g.IO.WantTextInput = (g.WantTextInputNextFrame != -1) ? (g.WantTextInputNextFrame != 0) : false;
}
-void ImGui::NewFrame()
+static void NewFrameSanityChecks()
{
- IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() or ImGui::SetCurrentContext()?");
ImGuiContext& g = *GImGui;
-#ifdef IMGUI_ENABLE_TEST_ENGINE_HOOKS
- ImGuiTestEngineHook_PreNewFrame();
-#endif
-
// Check user data
// (We pass an error message in the assert expression to make it visible to programmers who are not using a debugger, as most assert handlers display their argument)
IM_ASSERT(g.Initialized);
- IM_ASSERT(g.IO.DeltaTime >= 0.0f && "Need a positive DeltaTime (zero is tolerated but will cause some timing issues)");
- IM_ASSERT(g.IO.DisplaySize.x >= 0.0f && g.IO.DisplaySize.y >= 0.0f && "Invalid DisplaySize value");
+ IM_ASSERT((g.IO.DeltaTime > 0.0f || g.FrameCount == 0) && "Need a positive DeltaTime!");
+ IM_ASSERT((g.FrameCount == 0 || g.FrameCountEnded == g.FrameCount) && "Forgot to call Render() or EndFrame() at the end of the previous frame?");
+ IM_ASSERT(g.IO.DisplaySize.x >= 0.0f && g.IO.DisplaySize.y >= 0.0f && "Invalid DisplaySize value!");
IM_ASSERT(g.IO.Fonts->Fonts.Size > 0 && "Font Atlas not built. Did you call io.Fonts->GetTexDataAsRGBA32() / GetTexDataAsAlpha8() ?");
IM_ASSERT(g.IO.Fonts->Fonts[0]->IsLoaded() && "Font Atlas not built. Did you call io.Fonts->GetTexDataAsRGBA32() / GetTexDataAsAlpha8() ?");
- IM_ASSERT(g.Style.CurveTessellationTol > 0.0f && "Invalid style setting");
- IM_ASSERT(g.Style.Alpha >= 0.0f && g.Style.Alpha <= 1.0f && "Invalid style setting. Alpha cannot be negative (allows us to avoid a few clamps in color computations)");
- IM_ASSERT((g.FrameCount == 0 || g.FrameCountEnded == g.FrameCount) && "Forgot to call Render() or EndFrame() at the end of the previous frame?");
+ IM_ASSERT(g.Style.CurveTessellationTol > 0.0f && "Invalid style setting!");
+ IM_ASSERT(g.Style.CircleSegmentMaxError > 0.0f && "Invalid style setting!");
+ IM_ASSERT(g.Style.Alpha >= 0.0f && g.Style.Alpha <= 1.0f && "Invalid style setting. Alpha cannot be negative (allows us to avoid a few clamps in color computations)!");
+ IM_ASSERT(g.Style.WindowMinSize.x >= 1.0f && g.Style.WindowMinSize.y >= 1.0f && "Invalid style setting.");
+ IM_ASSERT(g.Style.WindowMenuButtonPosition == ImGuiDir_None || g.Style.WindowMenuButtonPosition == ImGuiDir_Left || g.Style.WindowMenuButtonPosition == ImGuiDir_Right);
for (int n = 0; n < ImGuiKey_COUNT; n++)
IM_ASSERT(g.IO.KeyMap[n] >= -1 && g.IO.KeyMap[n] < IM_ARRAYSIZE(g.IO.KeysDown) && "io.KeyMap[] contains an out of bound value (need to be 0..512, or -1 for unmapped key)");
@@ -3144,9 +3575,22 @@ void ImGui::NewFrame()
if (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard)
IM_ASSERT(g.IO.KeyMap[ImGuiKey_Space] != -1 && "ImGuiKey_Space is not mapped, required for keyboard navigation.");
- // Perform simple check: the beta io.ConfigResizeWindowsFromEdges option requires back-end to honor mouse cursor changes and set the ImGuiBackendFlags_HasMouseCursors flag accordingly.
- if (g.IO.ConfigResizeWindowsFromEdges && !(g.IO.BackendFlags & ImGuiBackendFlags_HasMouseCursors))
- g.IO.ConfigResizeWindowsFromEdges = false;
+ // Perform simple check: the beta io.ConfigWindowsResizeFromEdges option requires back-end to honor mouse cursor changes and set the ImGuiBackendFlags_HasMouseCursors flag accordingly.
+ if (g.IO.ConfigWindowsResizeFromEdges && !(g.IO.BackendFlags & ImGuiBackendFlags_HasMouseCursors))
+ g.IO.ConfigWindowsResizeFromEdges = false;
+}
+
+void ImGui::NewFrame()
+{
+ IM_ASSERT(GImGui != NULL && "No current context. Did you call ImGui::CreateContext() and ImGui::SetCurrentContext() ?");
+ ImGuiContext& g = *GImGui;
+
+#ifdef IMGUI_ENABLE_TEST_ENGINE
+ ImGuiTestEngineHook_PreNewFrame(&g);
+#endif
+
+ // Check and assert for various common IO and Configuration mistakes
+ NewFrameSanityChecks();
// Load settings on first frame (if not explicitly loaded manually before)
if (!g.SettingsLoaded)
@@ -3172,24 +3616,35 @@ void ImGui::NewFrame()
}
g.Time += g.IO.DeltaTime;
- g.FrameScopeActive = true;
+ g.WithinFrameScope = true;
g.FrameCount += 1;
g.TooltipOverrideCount = 0;
g.WindowsActiveCount = 0;
- // Setup current font and draw list
+ // Setup current font and draw list shared data
g.IO.Fonts->Locked = true;
SetCurrentFont(GetDefaultFont());
IM_ASSERT(g.Font->IsLoaded());
g.DrawListSharedData.ClipRectFullscreen = ImVec4(0.0f, 0.0f, g.IO.DisplaySize.x, g.IO.DisplaySize.y);
g.DrawListSharedData.CurveTessellationTol = g.Style.CurveTessellationTol;
-
- g.OverlayDrawList.Clear();
- g.OverlayDrawList.PushTextureID(g.IO.Fonts->TexID);
- g.OverlayDrawList.PushClipRectFullScreen();
- g.OverlayDrawList.Flags = (g.Style.AntiAliasedLines ? ImDrawListFlags_AntiAliasedLines : 0) | (g.Style.AntiAliasedFill ? ImDrawListFlags_AntiAliasedFill : 0);
-
- // Mark rendering data as invalid to prevent user who may have a handle on it to use it
+ g.DrawListSharedData.SetCircleSegmentMaxError(g.Style.CircleSegmentMaxError);
+ g.DrawListSharedData.InitialFlags = ImDrawListFlags_None;
+ if (g.Style.AntiAliasedLines)
+ g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedLines;
+ if (g.Style.AntiAliasedFill)
+ g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AntiAliasedFill;
+ if (g.IO.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset)
+ g.DrawListSharedData.InitialFlags |= ImDrawListFlags_AllowVtxOffset;
+
+ g.BackgroundDrawList.Clear();
+ g.BackgroundDrawList.PushTextureID(g.IO.Fonts->TexID);
+ g.BackgroundDrawList.PushClipRectFullScreen();
+
+ g.ForegroundDrawList.Clear();
+ g.ForegroundDrawList.PushTextureID(g.IO.Fonts->TexID);
+ g.ForegroundDrawList.PushClipRectFullScreen();
+
+ // Mark rendering data as invalid to prevent user who may have a handle on it to use it.
g.DrawData.Clear();
// Drag and drop keep the source ID alive so even if the source disappear our state is consistent
@@ -3215,12 +3670,18 @@ void ImGui::NewFrame()
g.LastActiveIdTimer += g.IO.DeltaTime;
g.ActiveIdPreviousFrame = g.ActiveId;
g.ActiveIdPreviousFrameWindow = g.ActiveIdWindow;
- g.ActiveIdPreviousFrameHasBeenEdited = g.ActiveIdHasBeenEdited;
+ g.ActiveIdPreviousFrameHasBeenEditedBefore = g.ActiveIdHasBeenEditedBefore;
g.ActiveIdIsAlive = 0;
+ g.ActiveIdHasBeenEditedThisFrame = false;
g.ActiveIdPreviousFrameIsAlive = false;
g.ActiveIdIsJustActivated = false;
- if (g.ScalarAsInputTextId && g.ActiveId != g.ScalarAsInputTextId)
- g.ScalarAsInputTextId = 0;
+ if (g.TempInputTextId != 0 && g.ActiveId != g.TempInputTextId)
+ g.TempInputTextId = 0;
+ if (g.ActiveId == 0)
+ {
+ g.ActiveIdUsingNavDirMask = g.ActiveIdUsingNavInputMask = 0;
+ g.ActiveIdUsingKeyInputMask = 0;
+ }
// Drag and drop
g.DragDropAcceptIdPrev = g.DragDropAcceptIdCurr;
@@ -3245,12 +3706,15 @@ void ImGui::NewFrame()
g.FramerateSecPerFrameIdx = (g.FramerateSecPerFrameIdx + 1) % IM_ARRAYSIZE(g.FramerateSecPerFrame);
g.IO.Framerate = (g.FramerateSecPerFrameAccum > 0.0f) ? (1.0f / (g.FramerateSecPerFrameAccum / (float)IM_ARRAYSIZE(g.FramerateSecPerFrame))) : FLT_MAX;
- // Handle user moving window with mouse (at the beginning of the frame to avoid input lag or sheering)
- UpdateMouseMovingWindow();
+ // Find hovered window
+ // (needs to be before UpdateMouseMovingWindowNewFrame so we fill g.HoveredWindowUnderMovingWindow on the mouse release frame)
UpdateHoveredWindowAndCaptureFlags();
+ // Handle user moving window with mouse (at the beginning of the frame to avoid input lag or sheering)
+ UpdateMouseMovingWindowNewFrame();
+
// Background darkening/whitening
- if (GetFrontMostPopupModal() != NULL || (g.NavWindowingTarget != NULL && g.NavWindowingHighlightAlpha > 0.0f))
+ if (GetTopMostPopupModal() != NULL || (g.NavWindowingTarget != NULL && g.NavWindowingHighlightAlpha > 0.0f))
g.DimBgRatio = ImMin(g.DimBgRatio + g.IO.DeltaTime * 6.0f, 1.0f);
else
g.DimBgRatio = ImMax(g.DimBgRatio - g.IO.DeltaTime * 10.0f, 0.0f);
@@ -3263,58 +3727,134 @@ void ImGui::NewFrame()
UpdateMouseWheel();
// Pressing TAB activate widget focus
- if (g.ActiveId == 0 && g.NavWindow != NULL && g.NavWindow->Active && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs) && !g.IO.KeyCtrl && IsKeyPressedMap(ImGuiKey_Tab, false))
+ g.FocusTabPressed = (g.NavWindow && g.NavWindow->Active && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs) && !g.IO.KeyCtrl && IsKeyPressedMap(ImGuiKey_Tab));
+ if (g.ActiveId == 0 && g.FocusTabPressed)
{
+ // Note that SetKeyboardFocusHere() sets the Next fields mid-frame. To be consistent we also
+ // manipulate the Next fields even, even though they will be turned into Curr fields by the code below.
+ g.FocusRequestNextWindow = g.NavWindow;
+ g.FocusRequestNextCounterRegular = INT_MAX;
if (g.NavId != 0 && g.NavIdTabCounter != INT_MAX)
- g.NavWindow->FocusIdxTabRequestNext = g.NavIdTabCounter + 1 + (g.IO.KeyShift ? -1 : 1);
+ g.FocusRequestNextCounterTabStop = g.NavIdTabCounter + 1 + (g.IO.KeyShift ? -1 : 1);
else
- g.NavWindow->FocusIdxTabRequestNext = g.IO.KeyShift ? -1 : 0;
+ g.FocusRequestNextCounterTabStop = g.IO.KeyShift ? -1 : 0;
+ }
+
+ // Turn queued focus request into current one
+ g.FocusRequestCurrWindow = NULL;
+ g.FocusRequestCurrCounterRegular = g.FocusRequestCurrCounterTabStop = INT_MAX;
+ if (g.FocusRequestNextWindow != NULL)
+ {
+ ImGuiWindow* window = g.FocusRequestNextWindow;
+ g.FocusRequestCurrWindow = window;
+ if (g.FocusRequestNextCounterRegular != INT_MAX && window->DC.FocusCounterRegular != -1)
+ g.FocusRequestCurrCounterRegular = ImModPositive(g.FocusRequestNextCounterRegular, window->DC.FocusCounterRegular + 1);
+ if (g.FocusRequestNextCounterTabStop != INT_MAX && window->DC.FocusCounterTabStop != -1)
+ g.FocusRequestCurrCounterTabStop = ImModPositive(g.FocusRequestNextCounterTabStop, window->DC.FocusCounterTabStop + 1);
+ g.FocusRequestNextWindow = NULL;
+ g.FocusRequestNextCounterRegular = g.FocusRequestNextCounterTabStop = INT_MAX;
}
+
g.NavIdTabCounter = INT_MAX;
- // Mark all windows as not visible
+ // Mark all windows as not visible and compact unused memory.
IM_ASSERT(g.WindowsFocusOrder.Size == g.Windows.Size);
+ const float memory_compact_start_time = (g.IO.ConfigWindowsMemoryCompactTimer >= 0.0f) ? (float)g.Time - g.IO.ConfigWindowsMemoryCompactTimer : FLT_MAX;
for (int i = 0; i != g.Windows.Size; i++)
{
ImGuiWindow* window = g.Windows[i];
window->WasActive = window->Active;
+ window->BeginCount = 0;
window->Active = false;
window->WriteAccessed = false;
+
+ // Garbage collect transient buffers of recently unused windows
+ if (!window->WasActive && !window->MemoryCompacted && window->LastTimeActive < memory_compact_start_time)
+ GcCompactTransientWindowBuffers(window);
}
// Closing the focused window restore focus to the first active root window in descending z-order
if (g.NavWindow && !g.NavWindow->WasActive)
- FocusPreviousWindowIgnoringOne(NULL);
+ FocusTopMostWindowUnderOne(NULL, NULL);
// No window should be open at the beginning of the frame.
// But in order to allow the user to call NewFrame() multiple times without calling Render(), we are doing an explicit clear.
g.CurrentWindowStack.resize(0);
- g.CurrentPopupStack.resize(0);
- ClosePopupsOverWindow(g.NavWindow);
+ g.BeginPopupStack.resize(0);
+ ClosePopupsOverWindow(g.NavWindow, false);
- // Create implicit window - we will only render it if the user has added something to it.
+ // [DEBUG] Item picker tool - start with DebugStartItemPicker() - useful to visually select an item and break into its call-stack.
+ UpdateDebugToolItemPicker();
+
+ // Create implicit/fallback window - which we will only render it if the user has added something to it.
// We don't use "Debug" to avoid colliding with user trying to create a "Debug" window with custom flags.
+ // This fallback is particularly important as it avoid ImGui:: calls from crashing.
+ g.WithinFrameScopeWithImplicitWindow = true;
SetNextWindowSize(ImVec2(400,400), ImGuiCond_FirstUseEver);
Begin("Debug##Default");
+ IM_ASSERT(g.CurrentWindow->IsFallbackWindow == true);
-#ifdef IMGUI_ENABLE_TEST_ENGINE_HOOKS
- ImGuiTestEngineHook_PostNewFrame();
+#ifdef IMGUI_ENABLE_TEST_ENGINE
+ ImGuiTestEngineHook_PostNewFrame(&g);
#endif
}
+// [DEBUG] Item picker tool - start with DebugStartItemPicker() - useful to visually select an item and break into its call-stack.
+void ImGui::UpdateDebugToolItemPicker()
+{
+ ImGuiContext& g = *GImGui;
+ g.DebugItemPickerBreakId = 0;
+ if (g.DebugItemPickerActive)
+ {
+ const ImGuiID hovered_id = g.HoveredIdPreviousFrame;
+ ImGui::SetMouseCursor(ImGuiMouseCursor_Hand);
+ if (ImGui::IsKeyPressedMap(ImGuiKey_Escape))
+ g.DebugItemPickerActive = false;
+ if (ImGui::IsMouseClicked(0) && hovered_id)
+ {
+ g.DebugItemPickerBreakId = hovered_id;
+ g.DebugItemPickerActive = false;
+ }
+ ImGui::SetNextWindowBgAlpha(0.60f);
+ ImGui::BeginTooltip();
+ ImGui::Text("HoveredId: 0x%08X", hovered_id);
+ ImGui::Text("Press ESC to abort picking.");
+ ImGui::TextColored(GetStyleColorVec4(hovered_id ? ImGuiCol_Text : ImGuiCol_TextDisabled), "Click to break in debugger!");
+ ImGui::EndTooltip();
+ }
+}
+
void ImGui::Initialize(ImGuiContext* context)
{
ImGuiContext& g = *context;
IM_ASSERT(!g.Initialized && !g.SettingsLoaded);
// Add .ini handle for ImGuiWindow type
- ImGuiSettingsHandler ini_handler;
- ini_handler.TypeName = "Window";
- ini_handler.TypeHash = ImHash("Window", 0, 0);
- ini_handler.ReadOpenFn = SettingsHandlerWindow_ReadOpen;
- ini_handler.ReadLineFn = SettingsHandlerWindow_ReadLine;
- ini_handler.WriteAllFn = SettingsHandlerWindow_WriteAll;
- g.SettingsHandlers.push_front(ini_handler);
+ {
+ ImGuiSettingsHandler ini_handler;
+ ini_handler.TypeName = "Window";
+ ini_handler.TypeHash = ImHashStr("Window");
+ ini_handler.ReadOpenFn = WindowSettingsHandler_ReadOpen;
+ ini_handler.ReadLineFn = WindowSettingsHandler_ReadLine;
+ ini_handler.WriteAllFn = WindowSettingsHandler_WriteAll;
+ g.SettingsHandlers.push_back(ini_handler);
+ }
+
+#ifdef IMGUI_HAS_TABLE
+ // Add .ini handle for ImGuiTable type
+ {
+ ImGuiSettingsHandler ini_handler;
+ ini_handler.TypeName = "Table";
+ ini_handler.TypeHash = ImHashStr("Table");
+ ini_handler.ReadOpenFn = TableSettingsHandler_ReadOpen;
+ ini_handler.ReadLineFn = TableSettingsHandler_ReadLine;
+ ini_handler.WriteAllFn = TableSettingsHandler_WriteAll;
+ g.SettingsHandlers.push_back(ini_handler);
+ }
+#endif // #ifdef IMGUI_HAS_TABLE
+
+#ifdef IMGUI_HAS_DOCK
+#endif // #ifdef IMGUI_HAS_DOCK
g.Initialized = true;
}
@@ -3331,7 +3871,7 @@ void ImGui::Shutdown(ImGuiContext* context)
}
g.IO.Fonts = NULL;
- // Cleanup of other data are conditional on actually having initialized ImGui.
+ // Cleanup of other data are conditional on actually having initialized Dear ImGui.
if (!g.Initialized)
return;
@@ -3349,38 +3889,42 @@ void ImGui::Shutdown(ImGuiContext* context)
IM_DELETE(g.Windows[i]);
g.Windows.clear();
g.WindowsFocusOrder.clear();
- g.WindowsSortBuffer.clear();
+ g.WindowsTempSortBuffer.clear();
g.CurrentWindow = NULL;
g.CurrentWindowStack.clear();
g.WindowsById.Clear();
g.NavWindow = NULL;
- g.HoveredWindow = NULL;
- g.HoveredRootWindow = NULL;
+ g.HoveredWindow = g.HoveredRootWindow = NULL;
g.ActiveIdWindow = g.ActiveIdPreviousFrameWindow = NULL;
g.MovingWindow = NULL;
g.ColorModifiers.clear();
g.StyleModifiers.clear();
g.FontStack.clear();
g.OpenPopupStack.clear();
- g.CurrentPopupStack.clear();
+ g.BeginPopupStack.clear();
g.DrawDataBuilder.ClearFreeMemory();
- g.OverlayDrawList.ClearFreeMemory();
+ g.BackgroundDrawList.ClearFreeMemory();
+ g.ForegroundDrawList.ClearFreeMemory();
+
+ g.TabBars.Clear();
+ g.CurrentTabBarStack.clear();
+ g.ShrinkWidthBuffer.clear();
+
g.PrivateClipboard.clear();
- g.InputTextState.TextW.clear();
- g.InputTextState.InitialText.clear();
- g.InputTextState.TempBuffer.clear();
+ g.InputTextState.ClearFreeMemory();
- for (int i = 0; i < g.SettingsWindows.Size; i++)
- IM_DELETE(g.SettingsWindows[i].Name);
g.SettingsWindows.clear();
g.SettingsHandlers.clear();
- if (g.LogFile && g.LogFile != stdout)
+ if (g.LogFile)
{
- fclose(g.LogFile);
+#ifndef IMGUI_DISABLE_TTY_FUNCTIONS
+ if (g.LogFile != stdout)
+#endif
+ ImFileClose(g.LogFile);
g.LogFile = NULL;
}
- g.LogClipboard.clear();
+ g.LogBuffer.clear();
g.Initialized = false;
}
@@ -3404,7 +3948,7 @@ static void AddWindowToSortBuffer(ImVector<ImGuiWindow*>* out_sorted_windows, Im
{
int count = window->DC.ChildWindows.Size;
if (count > 1)
- ImQsort(window->DC.ChildWindows.begin(), (size_t)count, sizeof(ImGuiWindow*), ChildWindowComparer);
+ ImQsort(window->DC.ChildWindows.Data, (size_t)count, sizeof(ImGuiWindow*), ChildWindowComparer);
for (int i = 0; i < count; i++)
{
ImGuiWindow* child = window->DC.ChildWindows[i];
@@ -3428,19 +3972,28 @@ static void AddDrawListToDrawData(ImVector<ImDrawList*>* out_list, ImDrawList* d
return;
}
- // Draw list sanity check. Detect mismatch between PrimReserve() calls and incrementing _VtxCurrentIdx, _VtxWritePtr etc. May trigger for you if you are using PrimXXX functions incorrectly.
+ // Draw list sanity check. Detect mismatch between PrimReserve() calls and incrementing _VtxCurrentIdx, _VtxWritePtr etc.
+ // May trigger for you if you are using PrimXXX functions incorrectly.
IM_ASSERT(draw_list->VtxBuffer.Size == 0 || draw_list->_VtxWritePtr == draw_list->VtxBuffer.Data + draw_list->VtxBuffer.Size);
IM_ASSERT(draw_list->IdxBuffer.Size == 0 || draw_list->_IdxWritePtr == draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size);
- IM_ASSERT((int)draw_list->_VtxCurrentIdx == draw_list->VtxBuffer.Size);
+ if (!(draw_list->Flags & ImDrawListFlags_AllowVtxOffset))
+ IM_ASSERT((int)draw_list->_VtxCurrentIdx == draw_list->VtxBuffer.Size);
// Check that draw_list doesn't use more vertices than indexable (default ImDrawIdx = unsigned short = 2 bytes = 64K vertices per ImDrawList = per window)
// If this assert triggers because you are drawing lots of stuff manually:
- // A) Make sure you are coarse clipping, because ImDrawList let all your vertices pass. You can use the Metrics window to inspect draw list contents.
- // B) If you need/want meshes with more than 64K vertices, uncomment the '#define ImDrawIdx unsigned int' line in imconfig.h to set the index size to 4 bytes.
- // You'll need to handle the 4-bytes indices to your renderer. For example, the OpenGL example code detect index size at compile-time by doing:
- // glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset);
- // Your own engine or render API may use different parameters or function calls to specify index sizes. 2 and 4 bytes indices are generally supported by most API.
- // C) If for some reason you cannot use 4 bytes indices or don't want to, a workaround is to call BeginChild()/EndChild() before reaching the 64K limit to split your draw commands in multiple draw lists.
+ // - First, make sure you are coarse clipping yourself and not trying to draw many things outside visible bounds.
+ // Be mindful that the ImDrawList API doesn't filter vertices. Use the Metrics window to inspect draw list contents.
+ // - If you want large meshes with more than 64K vertices, you can either:
+ // (A) Handle the ImDrawCmd::VtxOffset value in your renderer back-end, and set 'io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset'.
+ // Most example back-ends already support this from 1.71. Pre-1.71 back-ends won't.
+ // Some graphics API such as GL ES 1/2 don't have a way to offset the starting vertex so it is not supported for them.
+ // (B) Or handle 32-bit indices in your renderer back-end, and uncomment '#define ImDrawIdx unsigned int' line in imconfig.h.
+ // Most example back-ends already support this. For example, the OpenGL example code detect index size at compile-time:
+ // glDrawElements(GL_TRIANGLES, (GLsizei)pcmd->ElemCount, sizeof(ImDrawIdx) == 2 ? GL_UNSIGNED_SHORT : GL_UNSIGNED_INT, idx_buffer_offset);
+ // Your own engine or render API may use different parameters or function calls to specify index sizes.
+ // 2 and 4 bytes indices are generally supported by most graphics API.
+ // - If for some reason neither of those solutions works for you, a workaround is to call BeginChild()/EndChild() before reaching
+ // the 64K limit to split your draw commands in multiple draw lists.
if (sizeof(ImDrawIdx) == 2)
IM_ASSERT(draw_list->_VtxCurrentIdx < (1 << 16) && "Too many vertices in ImDrawList using 16-bit indices. Read comment above");
@@ -3460,13 +4013,12 @@ static void AddWindowToDrawData(ImVector<ImDrawList*>* out_render_list, ImGuiWin
}
}
-static void AddWindowToDrawDataSelectLayer(ImGuiWindow* window)
+// Layer is locked for the root window, however child windows may use a different viewport (e.g. extruding menu)
+static void AddRootWindowToDrawData(ImGuiWindow* window)
{
ImGuiContext& g = *GImGui;
- if (window->Flags & ImGuiWindowFlags_Tooltip)
- AddWindowToDrawData(&g.DrawDataBuilder.Layers[1], window);
- else
- AddWindowToDrawData(&g.DrawDataBuilder.Layers[0], window);
+ int layer = (window->Flags & ImGuiWindowFlags_Tooltip) ? 1 : 0;
+ AddWindowToDrawData(&g.DrawDataBuilder.Layers[layer], window);
}
void ImDrawDataBuilder::FlattenIntoSingleLayer()
@@ -3496,6 +4048,7 @@ static void SetupDrawData(ImVector<ImDrawList*>* draw_lists, ImDrawData* draw_da
draw_data->TotalVtxCount = draw_data->TotalIdxCount = 0;
draw_data->DisplayPos = ImVec2(0.0f, 0.0f);
draw_data->DisplaySize = io.DisplaySize;
+ draw_data->FramebufferScale = io.DisplayFramebufferScale;
for (int n = 0; n < draw_lists->Size; n++)
{
draw_data->TotalVtxCount += draw_lists->Data[n]->VtxBuffer.Size;
@@ -3525,24 +4078,26 @@ void ImGui::EndFrame()
IM_ASSERT(g.Initialized);
if (g.FrameCountEnded == g.FrameCount) // Don't process EndFrame() multiple times.
return;
- IM_ASSERT(g.FrameScopeActive && "Forgot to call ImGui::NewFrame()");
+ IM_ASSERT(g.WithinFrameScope && "Forgot to call ImGui::NewFrame()?");
// Notify OS when our Input Method Editor cursor has moved (e.g. CJK inputs using Microsoft IME)
- if (g.IO.ImeSetInputScreenPosFn && ImLengthSqr(g.PlatformImeLastPos - g.PlatformImePos) > 0.0001f)
+ if (g.IO.ImeSetInputScreenPosFn && (g.PlatformImeLastPos.x == FLT_MAX || ImLengthSqr(g.PlatformImeLastPos - g.PlatformImePos) > 0.0001f))
{
g.IO.ImeSetInputScreenPosFn((int)g.PlatformImePos.x, (int)g.PlatformImePos.y);
g.PlatformImeLastPos = g.PlatformImePos;
}
- // Hide implicit "Debug" window if it hasn't been used
- IM_ASSERT(g.CurrentWindowStack.Size == 1); // Mismatched Begin()/End() calls, did you forget to call end on g.CurrentWindow->Name?
+ ErrorCheckEndFrame();
+
+ // Hide implicit/fallback "Debug" window if it hasn't been used
+ g.WithinFrameScopeWithImplicitWindow = false;
if (g.CurrentWindow && !g.CurrentWindow->WriteAccessed)
g.CurrentWindow->Active = false;
End();
- // Show CTRL+TAB list
- if (g.NavWindowingTarget)
- NavUpdateWindowingList();
+ // Show CTRL+TAB list window
+ if (g.NavWindowingTarget != NULL)
+ NavUpdateWindowingOverlay();
// Drag and Drop: Elapse payload (if delivered, or if source stops being submitted)
if (g.DragDropActive)
@@ -3561,57 +4116,28 @@ void ImGui::EndFrame()
g.DragDropWithinSourceOrTarget = false;
}
- // Initiate moving window
- if (g.ActiveId == 0 && g.HoveredId == 0)
- {
- if (!g.NavWindow || !g.NavWindow->Appearing) // Unless we just made a window/popup appear
- {
- // Click to focus window and start moving (after we're done with all our widgets)
- if (g.IO.MouseClicked[0])
- {
- if (g.HoveredRootWindow != NULL)
- StartMouseMovingWindow(g.HoveredWindow);
- else if (g.NavWindow != NULL && GetFrontMostPopupModal() == NULL)
- FocusWindow(NULL); // Clicking on void disable focus
- }
+ // End frame
+ g.WithinFrameScope = false;
+ g.FrameCountEnded = g.FrameCount;
- // With right mouse button we close popups without changing focus
- // (The left mouse button path calls FocusWindow which will lead NewFrame->ClosePopupsOverWindow to trigger)
- if (g.IO.MouseClicked[1])
- {
- // Find the top-most window between HoveredWindow and the front most Modal Window.
- // This is where we can trim the popup stack.
- ImGuiWindow* modal = GetFrontMostPopupModal();
- bool hovered_window_above_modal = false;
- if (modal == NULL)
- hovered_window_above_modal = true;
- for (int i = g.Windows.Size - 1; i >= 0 && hovered_window_above_modal == false; i--)
- {
- ImGuiWindow* window = g.Windows[i];
- if (window == modal)
- break;
- if (window == g.HoveredWindow)
- hovered_window_above_modal = true;
- }
- ClosePopupsOverWindow(hovered_window_above_modal ? g.HoveredWindow : modal);
- }
- }
- }
+ // Initiate moving window + handle left-click and right-click focus
+ UpdateMouseMovingWindowEndFrame();
// Sort the window list so that all child windows are after their parent
// We cannot do that on FocusWindow() because childs may not exist yet
- g.WindowsSortBuffer.resize(0);
- g.WindowsSortBuffer.reserve(g.Windows.Size);
+ g.WindowsTempSortBuffer.resize(0);
+ g.WindowsTempSortBuffer.reserve(g.Windows.Size);
for (int i = 0; i != g.Windows.Size; i++)
{
ImGuiWindow* window = g.Windows[i];
if (window->Active && (window->Flags & ImGuiWindowFlags_ChildWindow)) // if a child is active its parent will add it
continue;
- AddWindowToSortBuffer(&g.WindowsSortBuffer, window);
+ AddWindowToSortBuffer(&g.WindowsTempSortBuffer, window);
}
- IM_ASSERT(g.Windows.Size == g.WindowsSortBuffer.Size); // we done something wrong
- g.Windows.swap(g.WindowsSortBuffer);
+ // This usually assert if there is a mismatch between the ImGuiWindowFlags_ChildWindow / ParentWindow values and DC.ChildWindows[] in parents, aka we've done something wrong.
+ IM_ASSERT(g.Windows.Size == g.WindowsTempSortBuffer.Size);
+ g.Windows.swap(g.WindowsTempSortBuffer);
g.IO.MetricsActiveWindows = g.WindowsActiveCount;
// Unlock font atlas
@@ -3619,11 +4145,8 @@ void ImGui::EndFrame()
// Clear Input data for next frame
g.IO.MouseWheel = g.IO.MouseWheelH = 0.0f;
- memset(g.IO.InputCharacters, 0, sizeof(g.IO.InputCharacters));
+ g.IO.InputQueueCharacters.resize(0);
memset(g.IO.NavInputs, 0, sizeof(g.IO.NavInputs));
-
- g.FrameScopeActive = false;
- g.FrameCountEnded = g.FrameCount;
}
void ImGui::Render()
@@ -3632,39 +4155,44 @@ void ImGui::Render()
IM_ASSERT(g.Initialized);
if (g.FrameCountEnded != g.FrameCount)
- ImGui::EndFrame();
+ EndFrame();
g.FrameCountRendered = g.FrameCount;
-
- // Gather ImDrawList to render (for each active window)
- g.IO.MetricsRenderVertices = g.IO.MetricsRenderIndices = g.IO.MetricsRenderWindows = 0;
+ g.IO.MetricsRenderWindows = 0;
g.DrawDataBuilder.Clear();
- ImGuiWindow* windows_to_render_front_most[2];
- windows_to_render_front_most[0] = (g.NavWindowingTarget && !(g.NavWindowingTarget->Flags & ImGuiWindowFlags_NoBringToFrontOnFocus)) ? g.NavWindowingTarget->RootWindow : NULL;
- windows_to_render_front_most[1] = g.NavWindowingTarget ? g.NavWindowingList : NULL;
+
+ // Add background ImDrawList
+ if (!g.BackgroundDrawList.VtxBuffer.empty())
+ AddDrawListToDrawData(&g.DrawDataBuilder.Layers[0], &g.BackgroundDrawList);
+
+ // Add ImDrawList to render
+ ImGuiWindow* windows_to_render_top_most[2];
+ windows_to_render_top_most[0] = (g.NavWindowingTarget && !(g.NavWindowingTarget->Flags & ImGuiWindowFlags_NoBringToFrontOnFocus)) ? g.NavWindowingTarget->RootWindow : NULL;
+ windows_to_render_top_most[1] = (g.NavWindowingTarget ? g.NavWindowingList : NULL);
for (int n = 0; n != g.Windows.Size; n++)
{
ImGuiWindow* window = g.Windows[n];
- if (IsWindowActiveAndVisible(window) && (window->Flags & ImGuiWindowFlags_ChildWindow) == 0 && window != windows_to_render_front_most[0] && window != windows_to_render_front_most[1])
- AddWindowToDrawDataSelectLayer(window);
+ if (IsWindowActiveAndVisible(window) && (window->Flags & ImGuiWindowFlags_ChildWindow) == 0 && window != windows_to_render_top_most[0] && window != windows_to_render_top_most[1])
+ AddRootWindowToDrawData(window);
}
- for (int n = 0; n < IM_ARRAYSIZE(windows_to_render_front_most); n++)
- if (windows_to_render_front_most[n] && IsWindowActiveAndVisible(windows_to_render_front_most[n])) // NavWindowingTarget is always temporarily displayed as the front-most window
- AddWindowToDrawDataSelectLayer(windows_to_render_front_most[n]);
+ for (int n = 0; n < IM_ARRAYSIZE(windows_to_render_top_most); n++)
+ if (windows_to_render_top_most[n] && IsWindowActiveAndVisible(windows_to_render_top_most[n])) // NavWindowingTarget is always temporarily displayed as the top-most window
+ AddRootWindowToDrawData(windows_to_render_top_most[n]);
g.DrawDataBuilder.FlattenIntoSingleLayer();
// Draw software mouse cursor if requested
if (g.IO.MouseDrawCursor)
- RenderMouseCursor(&g.OverlayDrawList, g.IO.MousePos, g.Style.MouseCursorScale, g.MouseCursor);
+ RenderMouseCursor(&g.ForegroundDrawList, g.IO.MousePos, g.Style.MouseCursorScale, g.MouseCursor, IM_COL32_WHITE, IM_COL32_BLACK, IM_COL32(0, 0, 0, 48));
- if (!g.OverlayDrawList.VtxBuffer.empty())
- AddDrawListToDrawData(&g.DrawDataBuilder.Layers[0], &g.OverlayDrawList);
+ // Add foreground ImDrawList
+ if (!g.ForegroundDrawList.VtxBuffer.empty())
+ AddDrawListToDrawData(&g.DrawDataBuilder.Layers[0], &g.ForegroundDrawList);
// Setup ImDrawData structure for end-user
SetupDrawData(&g.DrawDataBuilder.Layers[0], &g.DrawData);
g.IO.MetricsRenderVertices = g.DrawData.TotalVtxCount;
g.IO.MetricsRenderIndices = g.DrawData.TotalIdxCount;
- // Render. If user hasn't set a callback then they may retrieve the draw data via GetDrawData()
+ // (Legacy) Call the Render callback function. The current prefer way is to let the user retrieve GetDrawData() and call the render function themselves.
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
if (g.DrawData.CmdListsCount > 0 && g.IO.RenderDrawListsFn != NULL)
g.IO.RenderDrawListsFn(&g.DrawData);
@@ -3672,7 +4200,7 @@ void ImGui::Render()
}
// Calculate text size. Text can be multi-line. Optionally ignore text after a ## marker.
-// CalcTextSize("") should return ImVec2(0.0f, GImGui->FontSize)
+// CalcTextSize("") should return ImVec2(0.0f, g.FontSize)
ImVec2 ImGui::CalcTextSize(const char* text, const char* text_end, bool hide_text_after_double_hash, float wrap_width)
{
ImGuiContext& g = *GImGui;
@@ -3689,60 +4217,15 @@ ImVec2 ImGui::CalcTextSize(const char* text, const char* text_end, bool hide_tex
return ImVec2(0.0f, font_size);
ImVec2 text_size = font->CalcTextSizeA(font_size, FLT_MAX, wrap_width, text, text_display_end, NULL);
- // Cancel out character spacing for the last character of a line (it is baked into glyph->AdvanceX field)
- const float font_scale = font_size / font->FontSize;
- const float character_spacing_x = 1.0f * font_scale;
- if (text_size.x > 0.0f)
- text_size.x -= character_spacing_x;
- text_size.x = (float)(int)(text_size.x + 0.95f);
+ // Round
+ text_size.x = IM_FLOOR(text_size.x + 0.95f);
return text_size;
}
-// Helper to calculate coarse clipping of large list of evenly sized items.
-// NB: Prefer using the ImGuiListClipper higher-level helper if you can! Read comments and instructions there on how those use this sort of pattern.
-// NB: 'items_count' is only used to clamp the result, if you don't know your count you can use INT_MAX
-void ImGui::CalcListClipping(int items_count, float items_height, int* out_items_display_start, int* out_items_display_end)
-{
- ImGuiContext& g = *GImGui;
- ImGuiWindow* window = g.CurrentWindow;
- if (g.LogEnabled)
- {
- // If logging is active, do not perform any clipping
- *out_items_display_start = 0;
- *out_items_display_end = items_count;
- return;
- }
- if (window->SkipItems)
- {
- *out_items_display_start = *out_items_display_end = 0;
- return;
- }
-
- // We create the union of the ClipRect and the NavScoringRect which at worst should be 1 page away from ClipRect
- ImRect unclipped_rect = window->ClipRect;
- if (g.NavMoveRequest)
- unclipped_rect.Add(g.NavScoringRectScreen);
-
- const ImVec2 pos = window->DC.CursorPos;
- int start = (int)((unclipped_rect.Min.y - pos.y) / items_height);
- int end = (int)((unclipped_rect.Max.y - pos.y) / items_height);
-
- // When performing a navigation request, ensure we have one item extra in the direction we are moving to
- if (g.NavMoveRequest && g.NavMoveClipDir == ImGuiDir_Up)
- start--;
- if (g.NavMoveRequest && g.NavMoveClipDir == ImGuiDir_Down)
- end++;
-
- start = ImClamp(start, 0, items_count);
- end = ImClamp(end + 1, start, items_count);
- *out_items_display_start = start;
- *out_items_display_end = end;
-}
-
// Find window given position, search front-to-back
-// FIXME: Note that we have an inconsequential lag here: OuterRectClipped is updated in Begin(), so windows moved programatically
-// with SetWindowPos() and not SetNextWindowPos() will have that rectangle lagging by a frame at the time FindHoveredWindow() is
+// FIXME: Note that we have an inconsequential lag here: OuterRectClipped is updated in Begin(), so windows moved programatically
+// with SetWindowPos() and not SetNextWindowPos() will have that rectangle lagging by a frame at the time FindHoveredWindow() is
// called, aka before the next Begin(). Moving window isn't affected.
static void FindHoveredWindow()
{
@@ -3753,8 +4236,8 @@ static void FindHoveredWindow()
hovered_window = g.MovingWindow;
ImVec2 padding_regular = g.Style.TouchExtraPadding;
- ImVec2 padding_for_resize_from_edges = g.IO.ConfigResizeWindowsFromEdges ? ImMax(g.Style.TouchExtraPadding, ImVec2(RESIZE_WINDOWS_FROM_EDGES_HALF_THICKNESS, RESIZE_WINDOWS_FROM_EDGES_HALF_THICKNESS)) : padding_regular;
- for (int i = g.Windows.Size - 1; i >= 0 && hovered_window == NULL; i--)
+ ImVec2 padding_for_resize_from_edges = g.IO.ConfigWindowsResizeFromEdges ? ImMax(g.Style.TouchExtraPadding, ImVec2(WINDOWS_RESIZE_FROM_EDGES_HALF_THICKNESS, WINDOWS_RESIZE_FROM_EDGES_HALF_THICKNESS)) : padding_regular;
+ for (int i = g.Windows.Size - 1; i >= 0; i--)
{
ImGuiWindow* window = g.Windows[i];
if (!window->Active || window->Hidden)
@@ -3764,7 +4247,7 @@ static void FindHoveredWindow()
// Using the clipped AABB, a child window will typically be clipped by its parent (not always)
ImRect bb(window->OuterRectClipped);
- if ((window->Flags & ImGuiWindowFlags_ChildWindow) || (window->Flags & ImGuiWindowFlags_NoResize))
+ if (window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize))
bb.Expand(padding_regular);
else
bb.Expand(padding_for_resize_from_edges);
@@ -3805,40 +4288,54 @@ bool ImGui::IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool c
int ImGui::GetKeyIndex(ImGuiKey imgui_key)
{
IM_ASSERT(imgui_key >= 0 && imgui_key < ImGuiKey_COUNT);
- return GImGui->IO.KeyMap[imgui_key];
+ ImGuiContext& g = *GImGui;
+ return g.IO.KeyMap[imgui_key];
}
-// Note that imgui doesn't know the semantic of each entry of io.KeysDown[]. Use your own indices/enums according to how your back-end/engine stored them into io.KeysDown[]!
+// Note that dear imgui doesn't know the semantic of each entry of io.KeysDown[]!
+// Use your own indices/enums according to how your back-end/engine stored them into io.KeysDown[]!
bool ImGui::IsKeyDown(int user_key_index)
{
- if (user_key_index < 0) return false;
- IM_ASSERT(user_key_index >= 0 && user_key_index < IM_ARRAYSIZE(GImGui->IO.KeysDown));
- return GImGui->IO.KeysDown[user_key_index];
+ if (user_key_index < 0)
+ return false;
+ ImGuiContext& g = *GImGui;
+ IM_ASSERT(user_key_index >= 0 && user_key_index < IM_ARRAYSIZE(g.IO.KeysDown));
+ return g.IO.KeysDown[user_key_index];
}
-int ImGui::CalcTypematicPressedRepeatAmount(float t, float t_prev, float repeat_delay, float repeat_rate)
+// t0 = previous time (e.g.: g.Time - g.IO.DeltaTime)
+// t1 = current time (e.g.: g.Time)
+// An event is triggered at:
+// t = 0.0f t = repeat_delay, t = repeat_delay + repeat_rate*N
+int ImGui::CalcTypematicRepeatAmount(float t0, float t1, float repeat_delay, float repeat_rate)
{
- if (t == 0.0f)
+ if (t1 == 0.0f)
return 1;
- if (t <= repeat_delay || repeat_rate <= 0.0f)
+ if (t0 >= t1)
return 0;
- const int count = (int)((t - repeat_delay) / repeat_rate) - (int)((t_prev - repeat_delay) / repeat_rate);
- return (count > 0) ? count : 0;
+ if (repeat_rate <= 0.0f)
+ return (t0 < repeat_delay) && (t1 >= repeat_delay);
+ const int count_t0 = (t0 < repeat_delay) ? -1 : (int)((t0 - repeat_delay) / repeat_rate);
+ const int count_t1 = (t1 < repeat_delay) ? -1 : (int)((t1 - repeat_delay) / repeat_rate);
+ const int count = count_t1 - count_t0;
+ return count;
}
int ImGui::GetKeyPressedAmount(int key_index, float repeat_delay, float repeat_rate)
{
ImGuiContext& g = *GImGui;
- if (key_index < 0) return false;
+ if (key_index < 0)
+ return 0;
IM_ASSERT(key_index >= 0 && key_index < IM_ARRAYSIZE(g.IO.KeysDown));
const float t = g.IO.KeysDownDuration[key_index];
- return CalcTypematicPressedRepeatAmount(t, t - g.IO.DeltaTime, repeat_delay, repeat_rate);
+ return CalcTypematicRepeatAmount(t - g.IO.DeltaTime, t, repeat_delay, repeat_rate);
}
bool ImGui::IsKeyPressed(int user_key_index, bool repeat)
{
ImGuiContext& g = *GImGui;
- if (user_key_index < 0) return false;
+ if (user_key_index < 0)
+ return false;
IM_ASSERT(user_key_index >= 0 && user_key_index < IM_ARRAYSIZE(g.IO.KeysDown));
const float t = g.IO.KeysDownDuration[user_key_index];
if (t == 0.0f)
@@ -3856,23 +4353,14 @@ bool ImGui::IsKeyReleased(int user_key_index)
return g.IO.KeysDownDurationPrev[user_key_index] >= 0.0f && !g.IO.KeysDown[user_key_index];
}
-bool ImGui::IsMouseDown(int button)
+bool ImGui::IsMouseDown(ImGuiMouseButton button)
{
ImGuiContext& g = *GImGui;
IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown));
return g.IO.MouseDown[button];
}
-bool ImGui::IsAnyMouseDown()
-{
- ImGuiContext& g = *GImGui;
- for (int n = 0; n < IM_ARRAYSIZE(g.IO.MouseDown); n++)
- if (g.IO.MouseDown[n])
- return true;
- return false;
-}
-
-bool ImGui::IsMouseClicked(int button, bool repeat)
+bool ImGui::IsMouseClicked(ImGuiMouseButton button, bool repeat)
{
ImGuiContext& g = *GImGui;
IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown));
@@ -3882,76 +4370,99 @@ bool ImGui::IsMouseClicked(int button, bool repeat)
if (repeat && t > g.IO.KeyRepeatDelay)
{
- float delay = g.IO.KeyRepeatDelay, rate = g.IO.KeyRepeatRate;
- if ((ImFmod(t - delay, rate) > rate*0.5f) != (ImFmod(t - delay - g.IO.DeltaTime, rate) > rate*0.5f))
+ // FIXME: 2019/05/03: Our old repeat code was wrong here and led to doubling the repeat rate, which made it an ok rate for repeat on mouse hold.
+ int amount = CalcTypematicRepeatAmount(t - g.IO.DeltaTime, t, g.IO.KeyRepeatDelay, g.IO.KeyRepeatRate * 0.50f);
+ if (amount > 0)
return true;
}
-
return false;
}
-bool ImGui::IsMouseReleased(int button)
+bool ImGui::IsMouseReleased(ImGuiMouseButton button)
{
ImGuiContext& g = *GImGui;
IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown));
return g.IO.MouseReleased[button];
}
-bool ImGui::IsMouseDoubleClicked(int button)
+bool ImGui::IsMouseDoubleClicked(ImGuiMouseButton button)
{
ImGuiContext& g = *GImGui;
IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown));
return g.IO.MouseDoubleClicked[button];
}
-bool ImGui::IsMouseDragging(int button, float lock_threshold)
+// [Internal] This doesn't test if the button is pressed
+bool ImGui::IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold)
{
ImGuiContext& g = *GImGui;
IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown));
- if (!g.IO.MouseDown[button])
- return false;
if (lock_threshold < 0.0f)
lock_threshold = g.IO.MouseDragThreshold;
return g.IO.MouseDragMaxDistanceSqr[button] >= lock_threshold * lock_threshold;
}
+bool ImGui::IsMouseDragging(ImGuiMouseButton button, float lock_threshold)
+{
+ ImGuiContext& g = *GImGui;
+ IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown));
+ if (!g.IO.MouseDown[button])
+ return false;
+ return IsMouseDragPastThreshold(button, lock_threshold);
+}
+
ImVec2 ImGui::GetMousePos()
{
- return GImGui->IO.MousePos;
+ ImGuiContext& g = *GImGui;
+ return g.IO.MousePos;
}
// NB: prefer to call right after BeginPopup(). At the time Selectable/MenuItem is activated, the popup is already closed!
ImVec2 ImGui::GetMousePosOnOpeningCurrentPopup()
{
ImGuiContext& g = *GImGui;
- if (g.CurrentPopupStack.Size > 0)
- return g.OpenPopupStack[g.CurrentPopupStack.Size-1].OpenMousePos;
+ if (g.BeginPopupStack.Size > 0)
+ return g.OpenPopupStack[g.BeginPopupStack.Size-1].OpenMousePos;
return g.IO.MousePos;
}
-// We typically use ImVec2(-FLT_MAX,-FLT_MAX) to denote an invalid mouse position
+// We typically use ImVec2(-FLT_MAX,-FLT_MAX) to denote an invalid mouse position.
bool ImGui::IsMousePosValid(const ImVec2* mouse_pos)
{
- if (mouse_pos == NULL)
- mouse_pos = &GImGui->IO.MousePos;
+ // The assert is only to silence a false-positive in XCode Static Analysis.
+ // Because GImGui is not dereferenced in every code path, the static analyzer assume that it may be NULL (which it doesn't for other functions).
+ IM_ASSERT(GImGui != NULL);
const float MOUSE_INVALID = -256000.0f;
- return mouse_pos->x >= MOUSE_INVALID && mouse_pos->y >= MOUSE_INVALID;
+ ImVec2 p = mouse_pos ? *mouse_pos : GImGui->IO.MousePos;
+ return p.x >= MOUSE_INVALID && p.y >= MOUSE_INVALID;
+}
+
+bool ImGui::IsAnyMouseDown()
+{
+ ImGuiContext& g = *GImGui;
+ for (int n = 0; n < IM_ARRAYSIZE(g.IO.MouseDown); n++)
+ if (g.IO.MouseDown[n])
+ return true;
+ return false;
}
+// Return the delta from the initial clicking position while the mouse button is clicked or was just released.
+// This is locked and return 0.0f until the mouse moves past a distance threshold at least once.
// NB: This is only valid if IsMousePosValid(). Back-ends in theory should always keep mouse position valid when dragging even outside the client window.
-ImVec2 ImGui::GetMouseDragDelta(int button, float lock_threshold)
+ImVec2 ImGui::GetMouseDragDelta(ImGuiMouseButton button, float lock_threshold)
{
ImGuiContext& g = *GImGui;
IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown));
if (lock_threshold < 0.0f)
lock_threshold = g.IO.MouseDragThreshold;
- if (g.IO.MouseDown[button])
+ if (g.IO.MouseDown[button] || g.IO.MouseReleased[button])
if (g.IO.MouseDragMaxDistanceSqr[button] >= lock_threshold * lock_threshold)
- return g.IO.MousePos - g.IO.MouseClickedPos[button]; // Assume we can only get active with left-mouse button (at the moment).
+ if (IsMousePosValid(&g.IO.MousePos) && IsMousePosValid(&g.IO.MouseClickedPos[button]))
+ return g.IO.MousePos - g.IO.MouseClickedPos[button];
return ImVec2(0.0f, 0.0f);
}
-void ImGui::ResetMouseDragDelta(int button)
+void ImGui::ResetMouseDragDelta(ImGuiMouseButton button)
{
ImGuiContext& g = *GImGui;
IM_ASSERT(button >= 0 && button < IM_ARRAYSIZE(g.IO.MouseDown));
@@ -3990,30 +4501,60 @@ bool ImGui::IsItemActive()
return false;
}
+bool ImGui::IsItemActivated()
+{
+ ImGuiContext& g = *GImGui;
+ if (g.ActiveId)
+ {
+ ImGuiWindow* window = g.CurrentWindow;
+ if (g.ActiveId == window->DC.LastItemId && g.ActiveIdPreviousFrame != window->DC.LastItemId)
+ return true;
+ }
+ return false;
+}
+
bool ImGui::IsItemDeactivated()
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
+ if (window->DC.LastItemStatusFlags & ImGuiItemStatusFlags_HasDeactivated)
+ return (window->DC.LastItemStatusFlags & ImGuiItemStatusFlags_Deactivated) != 0;
return (g.ActiveIdPreviousFrame == window->DC.LastItemId && g.ActiveIdPreviousFrame != 0 && g.ActiveId != window->DC.LastItemId);
}
bool ImGui::IsItemDeactivatedAfterEdit()
{
ImGuiContext& g = *GImGui;
- return IsItemDeactivated() && (g.ActiveIdPreviousFrameHasBeenEdited || (g.ActiveId == 0 && g.ActiveIdHasBeenEdited));
+ return IsItemDeactivated() && (g.ActiveIdPreviousFrameHasBeenEditedBefore || (g.ActiveId == 0 && g.ActiveIdHasBeenEditedBefore));
}
bool ImGui::IsItemFocused()
{
ImGuiContext& g = *GImGui;
- return g.NavId && !g.NavDisableHighlight && g.NavId == g.CurrentWindow->DC.LastItemId;
+ ImGuiWindow* window = g.CurrentWindow;
+
+ if (g.NavId == 0 || g.NavDisableHighlight || g.NavId != window->DC.LastItemId)
+ return false;
+ return true;
}
-bool ImGui::IsItemClicked(int mouse_button)
+bool ImGui::IsItemClicked(ImGuiMouseButton mouse_button)
{
return IsMouseClicked(mouse_button) && IsItemHovered(ImGuiHoveredFlags_None);
}
+bool ImGui::IsItemToggledOpen()
+{
+ ImGuiContext& g = *GImGui;
+ return (g.CurrentWindow->DC.LastItemStatusFlags & ImGuiItemStatusFlags_ToggledOpen) ? true : false;
+}
+
+bool ImGui::IsItemToggledSelection()
+{
+ ImGuiContext& g = *GImGui;
+ return (g.CurrentWindow->DC.LastItemStatusFlags & ImGuiItemStatusFlags_ToggledSelection) ? true : false;
+}
+
bool ImGui::IsAnyItemHovered()
{
ImGuiContext& g = *GImGui;
@@ -4075,12 +4616,10 @@ ImVec2 ImGui::GetItemRectSize()
static ImRect GetViewportRect()
{
ImGuiContext& g = *GImGui;
- if (g.IO.DisplayVisibleMin.x != g.IO.DisplayVisibleMax.x && g.IO.DisplayVisibleMin.y != g.IO.DisplayVisibleMax.y)
- return ImRect(g.IO.DisplayVisibleMin, g.IO.DisplayVisibleMax);
return ImRect(0.0f, 0.0f, g.IO.DisplaySize.x, g.IO.DisplaySize.y);
}
-static bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags)
+bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* parent_window = g.CurrentWindow;
@@ -4113,7 +4652,12 @@ static bool ImGui::BeginChildEx(const char* name, ImGuiID id, const ImVec2& size
ImGuiWindow* child_window = g.CurrentWindow;
child_window->ChildId = id;
- child_window->AutoFitChildAxises = auto_fit_axises;
+ child_window->AutoFitChildAxises = (ImS8)auto_fit_axises;
+
+ // Set the cursor to handle case where the user called SetNextWindowPos()+BeginChild() manually.
+ // While this is not really documented/defined, it seems that the expected thing to do.
+ if (child_window->BeginCount == 1)
+ parent_window->DC.CursorPos = child_window->Pos;
// Process navigation-in immediately so NavInit can run on first frame
if (g.NavActivateId == id && !(flags & ImGuiWindowFlags_NavFlattened) && (child_window->DC.NavLayerActiveMask != 0 || child_window->DC.NavHasScroll))
@@ -4143,7 +4687,10 @@ void ImGui::EndChild()
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
- IM_ASSERT(window->Flags & ImGuiWindowFlags_ChildWindow); // Mismatched BeginChild()/EndChild() callss
+ IM_ASSERT(g.WithinEndChild == false);
+ IM_ASSERT(window->Flags & ImGuiWindowFlags_ChildWindow); // Mismatched BeginChild()/EndChild() calls
+
+ g.WithinEndChild = true;
if (window->BeginCount > 1)
{
End();
@@ -4175,6 +4722,7 @@ void ImGui::EndChild()
ItemAdd(bb, 0);
}
}
+ g.WithinEndChild = false;
}
// Helper to create a child window / scrolling region that looks like a normal widget frame.
@@ -4197,22 +4745,6 @@ void ImGui::EndChildFrame()
EndChild();
}
-// Save and compare stack sizes on Begin()/End() to detect usage errors
-static void CheckStacksSize(ImGuiWindow* window, bool write)
-{
- // NOT checking: DC.ItemWidth, DC.AllowKeyboardFocus, DC.ButtonRepeat, DC.TextWrapPos (per window) to allow user to conveniently push once and not pop (they are cleared on Begin)
- ImGuiContext& g = *GImGui;
- int* p_backup = &window->DC.StackSizesBackup[0];
- { int current = window->IDStack.Size; if (write) *p_backup = current; else IM_ASSERT(*p_backup == current && "PushID/PopID or TreeNode/TreePop Mismatch!"); p_backup++; } // Too few or too many PopID()/TreePop()
- { int current = window->DC.GroupStack.Size; if (write) *p_backup = current; else IM_ASSERT(*p_backup == current && "BeginGroup/EndGroup Mismatch!"); p_backup++; } // Too few or too many EndGroup()
- { int current = g.CurrentPopupStack.Size; if (write) *p_backup = current; else IM_ASSERT(*p_backup == current && "BeginMenu/EndMenu or BeginPopup/EndPopup Mismatch"); p_backup++;}// Too few or too many EndMenu()/EndPopup()
- // For color, style and font stacks there is an incentive to use Push/Begin/Pop/.../End patterns, so we relax our checks a little to allow them.
- { int current = g.ColorModifiers.Size; if (write) *p_backup = current; else IM_ASSERT(*p_backup >= current && "PushStyleColor/PopStyleColor Mismatch!"); p_backup++; } // Too few or too many PopStyleColor()
- { int current = g.StyleModifiers.Size; if (write) *p_backup = current; else IM_ASSERT(*p_backup >= current && "PushStyleVar/PopStyleVar Mismatch!"); p_backup++; } // Too few or too many PopStyleVar()
- { int current = g.FontStack.Size; if (write) *p_backup = current; else IM_ASSERT(*p_backup >= current && "PushFont/PopFont Mismatch!"); p_backup++; } // Too few or too many PopFont()
- IM_ASSERT(p_backup == window->DC.StackSizesBackup + IM_ARRAYSIZE(window->DC.StackSizesBackup));
-}
-
static void SetWindowConditionAllowFlags(ImGuiWindow* window, ImGuiCond flags, bool enabled)
{
window->SetWindowPosAllowFlags = enabled ? (window->SetWindowPosAllowFlags | flags) : (window->SetWindowPosAllowFlags & ~flags);
@@ -4220,16 +4752,22 @@ static void SetWindowConditionAllowFlags(ImGuiWindow* window, ImGuiCond flags, b
window->SetWindowCollapsedAllowFlags = enabled ? (window->SetWindowCollapsedAllowFlags | flags) : (window->SetWindowCollapsedAllowFlags & ~flags);
}
-ImGuiWindow* ImGui::FindWindowByName(const char* name)
+ImGuiWindow* ImGui::FindWindowByID(ImGuiID id)
{
ImGuiContext& g = *GImGui;
- ImGuiID id = ImHash(name, 0);
return (ImGuiWindow*)g.WindowsById.GetVoidPtr(id);
}
+ImGuiWindow* ImGui::FindWindowByName(const char* name)
+{
+ ImGuiID id = ImHashStr(name);
+ return FindWindowByID(id);
+}
+
static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFlags flags)
{
ImGuiContext& g = *GImGui;
+ //IMGUI_DEBUG_LOG("CreateNewWindow '%s', flags = 0x%08X\n", name, flags);
// Create window the first time
ImGuiWindow* window = IM_NEW(ImGuiWindow)(&g, name);
@@ -4244,15 +4782,15 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFl
if (ImGuiWindowSettings* settings = ImGui::FindWindowSettings(window->ID))
{
// Retrieve settings from .ini file
- window->SettingsIdx = g.SettingsWindows.index_from_pointer(settings);
+ window->SettingsOffset = g.SettingsWindows.offset_from_ptr(settings);
SetWindowConditionAllowFlags(window, ImGuiCond_FirstUseEver, false);
- window->Pos = ImFloor(settings->Pos);
+ window->Pos = ImVec2(settings->Pos.x, settings->Pos.y);
window->Collapsed = settings->Collapsed;
- if (ImLengthSqr(settings->Size) > 0.00001f)
- size = ImFloor(settings->Size);
+ if (settings->Size.x > 0 && settings->Size.y > 0)
+ size = ImVec2(settings->Size.x, settings->Size.y);
}
- window->Size = window->SizeFull = window->SizeFullAtLastBegin = ImFloor(size);
- window->DC.CursorMaxPos = window->Pos; // So first call to CalcSizeContents() doesn't return crazy values
+ window->Size = window->SizeFull = ImFloor(size);
+ window->DC.CursorStartPos = window->DC.CursorMaxPos = window->Pos; // So first call to CalcContentSize() doesn't return crazy values
if ((flags & ImGuiWindowFlags_AlwaysAutoResize) != 0)
{
@@ -4276,10 +4814,10 @@ static ImGuiWindow* CreateNewWindow(const char* name, ImVec2 size, ImGuiWindowFl
return window;
}
-static ImVec2 CalcSizeAfterConstraint(ImGuiWindow* window, ImVec2 new_size)
+static ImVec2 CalcWindowSizeAfterConstraint(ImGuiWindow* window, ImVec2 new_size)
{
ImGuiContext& g = *GImGui;
- if (g.NextWindowData.SizeConstraintCond != 0)
+ if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSizeConstraint)
{
// Using -1,-1 on either X/Y axis to preserve the current size.
ImRect cr = g.NextWindowData.SizeConstraintRect;
@@ -4295,47 +4833,64 @@ static ImVec2 CalcSizeAfterConstraint(ImGuiWindow* window, ImVec2 new_size)
g.NextWindowData.SizeCallback(&data);
new_size = data.DesiredSize;
}
+ new_size.x = IM_FLOOR(new_size.x);
+ new_size.y = IM_FLOOR(new_size.y);
}
// Minimum size
if (!(window->Flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_AlwaysAutoResize)))
{
+ ImGuiWindow* window_for_height = window;
new_size = ImMax(new_size, g.Style.WindowMinSize);
- new_size.y = ImMax(new_size.y, window->TitleBarHeight() + window->MenuBarHeight() + ImMax(0.0f, g.Style.WindowRounding - 1.0f)); // Reduce artifacts with very small windows
+ new_size.y = ImMax(new_size.y, window_for_height->TitleBarHeight() + window_for_height->MenuBarHeight() + ImMax(0.0f, g.Style.WindowRounding - 1.0f)); // Reduce artifacts with very small windows
}
return new_size;
}
-static ImVec2 CalcSizeContents(ImGuiWindow* window)
+static ImVec2 CalcWindowContentSize(ImGuiWindow* window)
{
+ if (window->Collapsed)
+ if (window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0)
+ return window->ContentSize;
+ if (window->Hidden && window->HiddenFramesCannotSkipItems == 0 && window->HiddenFramesCanSkipItems > 0)
+ return window->ContentSize;
+
ImVec2 sz;
- sz.x = (float)(int)((window->SizeContentsExplicit.x != 0.0f) ? window->SizeContentsExplicit.x : (window->DC.CursorMaxPos.x - window->Pos.x + window->Scroll.x));
- sz.y = (float)(int)((window->SizeContentsExplicit.y != 0.0f) ? window->SizeContentsExplicit.y : (window->DC.CursorMaxPos.y - window->Pos.y + window->Scroll.y));
- return sz + window->WindowPadding;
+ sz.x = IM_FLOOR((window->ContentSizeExplicit.x != 0.0f) ? window->ContentSizeExplicit.x : window->DC.CursorMaxPos.x - window->DC.CursorStartPos.x);
+ sz.y = IM_FLOOR((window->ContentSizeExplicit.y != 0.0f) ? window->ContentSizeExplicit.y : window->DC.CursorMaxPos.y - window->DC.CursorStartPos.y);
+ return sz;
}
-static ImVec2 CalcSizeAutoFit(ImGuiWindow* window, const ImVec2& size_contents)
+static ImVec2 CalcWindowAutoFitSize(ImGuiWindow* window, const ImVec2& size_contents)
{
ImGuiContext& g = *GImGui;
ImGuiStyle& style = g.Style;
+ ImVec2 size_decorations = ImVec2(0.0f, window->TitleBarHeight() + window->MenuBarHeight());
+ ImVec2 size_pad = window->WindowPadding * 2.0f;
+ ImVec2 size_desired = size_contents + size_pad + size_decorations;
if (window->Flags & ImGuiWindowFlags_Tooltip)
{
// Tooltip always resize
- return size_contents;
+ return size_desired;
}
else
{
- // When the window cannot fit all contents (either because of constraints, either because screen is too small): we are growing the size on the other axis to compensate for expected scrollbar. FIXME: Might turn bigger than DisplaySize-WindowPadding.
+ // Maximum window size is determined by the viewport size or monitor size
const bool is_popup = (window->Flags & ImGuiWindowFlags_Popup) != 0;
const bool is_menu = (window->Flags & ImGuiWindowFlags_ChildMenu) != 0;
ImVec2 size_min = style.WindowMinSize;
if (is_popup || is_menu) // Popups and menus bypass style.WindowMinSize by default, but we give then a non-zero minimum size to facilitate understanding problematic cases (e.g. empty popups)
size_min = ImMin(size_min, ImVec2(4.0f, 4.0f));
- ImVec2 size_auto_fit = ImClamp(size_contents, size_min, ImMax(size_min, g.IO.DisplaySize - style.DisplaySafeAreaPadding * 2.0f));
- ImVec2 size_auto_fit_after_constraint = CalcSizeAfterConstraint(window, size_auto_fit);
- if (size_auto_fit_after_constraint.x < size_contents.x && !(window->Flags & ImGuiWindowFlags_NoScrollbar) && (window->Flags & ImGuiWindowFlags_HorizontalScrollbar))
+ ImVec2 size_auto_fit = ImClamp(size_desired, size_min, ImMax(size_min, g.IO.DisplaySize - style.DisplaySafeAreaPadding * 2.0f));
+
+ // When the window cannot fit all contents (either because of constraints, either because screen is too small),
+ // we are growing the size on the other axis to compensate for expected scrollbar. FIXME: Might turn bigger than ViewportSize-WindowPadding.
+ ImVec2 size_auto_fit_after_constraint = CalcWindowSizeAfterConstraint(window, size_auto_fit);
+ bool will_have_scrollbar_x = (size_auto_fit_after_constraint.x - size_pad.x - size_decorations.x < size_contents.x && !(window->Flags & ImGuiWindowFlags_NoScrollbar) && (window->Flags & ImGuiWindowFlags_HorizontalScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar);
+ bool will_have_scrollbar_y = (size_auto_fit_after_constraint.y - size_pad.y - size_decorations.y < size_contents.y && !(window->Flags & ImGuiWindowFlags_NoScrollbar)) || (window->Flags & ImGuiWindowFlags_AlwaysVerticalScrollbar);
+ if (will_have_scrollbar_x)
size_auto_fit.y += style.ScrollbarSize;
- if (size_auto_fit_after_constraint.y < size_contents.y && !(window->Flags & ImGuiWindowFlags_NoScrollbar))
+ if (will_have_scrollbar_y)
size_auto_fit.x += style.ScrollbarSize;
return size_auto_fit;
}
@@ -4343,47 +4898,10 @@ static ImVec2 CalcSizeAutoFit(ImGuiWindow* window, const ImVec2& size_contents)
ImVec2 ImGui::CalcWindowExpectedSize(ImGuiWindow* window)
{
- ImVec2 size_contents = CalcSizeContents(window);
- return CalcSizeAfterConstraint(window, CalcSizeAutoFit(window, size_contents));
-}
-
-float ImGui::GetWindowScrollMaxX(ImGuiWindow* window)
-{
- return ImMax(0.0f, window->SizeContents.x - (window->SizeFull.x - window->ScrollbarSizes.x));
-}
-
-float ImGui::GetWindowScrollMaxY(ImGuiWindow* window)
-{
- return ImMax(0.0f, window->SizeContents.y - (window->SizeFull.y - window->ScrollbarSizes.y));
-}
-
-static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window, bool snap_on_edges)
-{
- ImGuiContext& g = *GImGui;
- ImVec2 scroll = window->Scroll;
- if (window->ScrollTarget.x < FLT_MAX)
- {
- float cr_x = window->ScrollTargetCenterRatio.x;
- scroll.x = window->ScrollTarget.x - cr_x * (window->SizeFull.x - window->ScrollbarSizes.x);
- }
- if (window->ScrollTarget.y < FLT_MAX)
- {
- // 'snap_on_edges' allows for a discontinuity at the edge of scrolling limits to take account of WindowPadding so that scrolling to make the last item visible scroll far enough to see the padding.
- float cr_y = window->ScrollTargetCenterRatio.y;
- float target_y = window->ScrollTarget.y;
- if (snap_on_edges && cr_y <= 0.0f && target_y <= window->WindowPadding.y)
- target_y = 0.0f;
- if (snap_on_edges && cr_y >= 1.0f && target_y >= window->SizeContents.y - window->WindowPadding.y + g.Style.ItemSpacing.y)
- target_y = window->SizeContents.y;
- scroll.y = target_y - (1.0f - cr_y) * (window->TitleBarHeight() + window->MenuBarHeight()) - cr_y * (window->SizeFull.y - window->ScrollbarSizes.y);
- }
- scroll = ImMax(scroll, ImVec2(0.0f, 0.0f));
- if (!window->Collapsed && !window->SkipItems)
- {
- scroll.x = ImMin(scroll.x, ImGui::GetWindowScrollMaxX(window));
- scroll.y = ImMin(scroll.y, ImGui::GetWindowScrollMaxY(window));
- }
- return scroll;
+ ImVec2 size_contents = CalcWindowContentSize(window);
+ ImVec2 size_auto_fit = CalcWindowAutoFitSize(window, size_contents);
+ ImVec2 size_final = CalcWindowSizeAfterConstraint(window, size_auto_fit);
+ return size_final;
}
static ImGuiCol GetWindowBgColorIdxFromFlags(ImGuiWindowFlags flags)
@@ -4400,7 +4918,7 @@ static void CalcResizePosSizeFromAnyCorner(ImGuiWindow* window, const ImVec2& co
ImVec2 pos_min = ImLerp(corner_target, window->Pos, corner_norm); // Expected window upper-left
ImVec2 pos_max = ImLerp(window->Pos + window->Size, corner_target, corner_norm); // Expected window lower-right
ImVec2 size_expected = pos_max - pos_min;
- ImVec2 size_constrained = CalcSizeAfterConstraint(window, size_expected);
+ ImVec2 size_constrained = CalcWindowSizeAfterConstraint(window, size_expected);
*out_pos = pos_min;
if (corner_norm.x == 0.0f)
out_pos->x -= (size_constrained.x - size_expected.x);
@@ -4411,78 +4929,97 @@ static void CalcResizePosSizeFromAnyCorner(ImGuiWindow* window, const ImVec2& co
struct ImGuiResizeGripDef
{
- ImVec2 CornerPos;
+ ImVec2 CornerPosN;
ImVec2 InnerDir;
int AngleMin12, AngleMax12;
};
-const ImGuiResizeGripDef resize_grip_def[4] =
+static const ImGuiResizeGripDef resize_grip_def[4] =
{
- { ImVec2(1,1), ImVec2(-1,-1), 0, 3 }, // Lower right
- { ImVec2(0,1), ImVec2(+1,-1), 3, 6 }, // Lower left
- { ImVec2(0,0), ImVec2(+1,+1), 6, 9 }, // Upper left
- { ImVec2(1,0), ImVec2(-1,+1), 9,12 }, // Upper right
+ { ImVec2(1,1), ImVec2(-1,-1), 0, 3 }, // Lower-right
+ { ImVec2(0,1), ImVec2(+1,-1), 3, 6 }, // Lower-left
+ { ImVec2(0,0), ImVec2(+1,+1), 6, 9 }, // Upper-left (Unused)
+ { ImVec2(1,0), ImVec2(-1,+1), 9,12 }, // Upper-right (Unused)
};
static ImRect GetResizeBorderRect(ImGuiWindow* window, int border_n, float perp_padding, float thickness)
{
ImRect rect = window->Rect();
if (thickness == 0.0f) rect.Max -= ImVec2(1,1);
- if (border_n == 0) return ImRect(rect.Min.x + perp_padding, rect.Min.y - thickness, rect.Max.x - perp_padding, rect.Min.y + thickness);
- if (border_n == 1) return ImRect(rect.Max.x - thickness, rect.Min.y + perp_padding, rect.Max.x + thickness, rect.Max.y - perp_padding);
- if (border_n == 2) return ImRect(rect.Min.x + perp_padding, rect.Max.y - thickness, rect.Max.x - perp_padding, rect.Max.y + thickness);
- if (border_n == 3) return ImRect(rect.Min.x - thickness, rect.Min.y + perp_padding, rect.Min.x + thickness, rect.Max.y - perp_padding);
+ if (border_n == 0) return ImRect(rect.Min.x + perp_padding, rect.Min.y - thickness, rect.Max.x - perp_padding, rect.Min.y + thickness); // Top
+ if (border_n == 1) return ImRect(rect.Max.x - thickness, rect.Min.y + perp_padding, rect.Max.x + thickness, rect.Max.y - perp_padding); // Right
+ if (border_n == 2) return ImRect(rect.Min.x + perp_padding, rect.Max.y - thickness, rect.Max.x - perp_padding, rect.Max.y + thickness); // Bottom
+ if (border_n == 3) return ImRect(rect.Min.x - thickness, rect.Min.y + perp_padding, rect.Min.x + thickness, rect.Max.y - perp_padding); // Left
IM_ASSERT(0);
return ImRect();
}
+// 0..3: corners (Lower-right, Lower-left, Unused, Unused)
+// 4..7: borders (Top, Right, Bottom, Left)
+ImGuiID ImGui::GetWindowResizeID(ImGuiWindow* window, int n)
+{
+ IM_ASSERT(n >= 0 && n <= 7);
+ ImGuiID id = window->ID;
+ id = ImHashStr("#RESIZE", 0, id);
+ id = ImHashData(&n, sizeof(int), id);
+ return id;
+}
+
// Handle resize for: Resize Grips, Borders, Gamepad
-static void ImGui::UpdateManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4])
+// Return true when using auto-fit (double click on resize grip)
+static bool ImGui::UpdateManualResize(ImGuiWindow* window, const ImVec2& size_auto_fit, int* border_held, int resize_grip_count, ImU32 resize_grip_col[4])
{
ImGuiContext& g = *GImGui;
ImGuiWindowFlags flags = window->Flags;
+
if ((flags & ImGuiWindowFlags_NoResize) || (flags & ImGuiWindowFlags_AlwaysAutoResize) || window->AutoFitFramesX > 0 || window->AutoFitFramesY > 0)
- return;
- if (window->WasActive == false) // Early out to avoid running this code for e.g. an hidden implicit Debug window.
- return;
+ return false;
+ if (window->WasActive == false) // Early out to avoid running this code for e.g. an hidden implicit/fallback Debug window.
+ return false;
- const int resize_border_count = g.IO.ConfigResizeWindowsFromEdges ? 4 : 0;
- const float grip_draw_size = (float)(int)ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f);
- const float grip_hover_inner_size = (float)(int)(grip_draw_size * 0.75f);
- const float grip_hover_outer_size = g.IO.ConfigResizeWindowsFromEdges ? RESIZE_WINDOWS_FROM_EDGES_HALF_THICKNESS : 0.0f;
+ bool ret_auto_fit = false;
+ const int resize_border_count = g.IO.ConfigWindowsResizeFromEdges ? 4 : 0;
+ const float grip_draw_size = IM_FLOOR(ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f));
+ const float grip_hover_inner_size = IM_FLOOR(grip_draw_size * 0.75f);
+ const float grip_hover_outer_size = g.IO.ConfigWindowsResizeFromEdges ? WINDOWS_RESIZE_FROM_EDGES_HALF_THICKNESS : 0.0f;
ImVec2 pos_target(FLT_MAX, FLT_MAX);
ImVec2 size_target(FLT_MAX, FLT_MAX);
+ // Resize grips and borders are on layer 1
+ window->DC.NavLayerCurrent = ImGuiNavLayer_Menu;
+ window->DC.NavLayerCurrentMask = (1 << ImGuiNavLayer_Menu);
+
// Manual resize grips
PushID("#RESIZE");
for (int resize_grip_n = 0; resize_grip_n < resize_grip_count; resize_grip_n++)
{
const ImGuiResizeGripDef& grip = resize_grip_def[resize_grip_n];
- const ImVec2 corner = ImLerp(window->Pos, window->Pos + window->Size, grip.CornerPos);
+ const ImVec2 corner = ImLerp(window->Pos, window->Pos + window->Size, grip.CornerPosN);
// Using the FlattenChilds button flag we make the resize button accessible even if we are hovering over a child window
ImRect resize_rect(corner - grip.InnerDir * grip_hover_outer_size, corner + grip.InnerDir * grip_hover_inner_size);
if (resize_rect.Min.x > resize_rect.Max.x) ImSwap(resize_rect.Min.x, resize_rect.Max.x);
if (resize_rect.Min.y > resize_rect.Max.y) ImSwap(resize_rect.Min.y, resize_rect.Max.y);
bool hovered, held;
- ButtonBehavior(resize_rect, window->GetID((void*)(intptr_t)resize_grip_n), &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_NoNavFocus);
- //GetOverlayDrawList()->AddRect(resize_rect.Min, resize_rect.Max, IM_COL32(255, 255, 0, 255));
+ ButtonBehavior(resize_rect, window->GetID(resize_grip_n), &hovered, &held, ImGuiButtonFlags_FlattenChildren | ImGuiButtonFlags_NoNavFocus);
+ //GetForegroundDrawList(window)->AddRect(resize_rect.Min, resize_rect.Max, IM_COL32(255, 255, 0, 255));
if (hovered || held)
g.MouseCursor = (resize_grip_n & 1) ? ImGuiMouseCursor_ResizeNESW : ImGuiMouseCursor_ResizeNWSE;
if (held && g.IO.MouseDoubleClicked[0] && resize_grip_n == 0)
{
// Manual auto-fit when double-clicking
- size_target = CalcSizeAfterConstraint(window, size_auto_fit);
+ size_target = CalcWindowSizeAfterConstraint(window, size_auto_fit);
+ ret_auto_fit = true;
ClearActiveID();
}
else if (held)
{
// Resize from any of the four corners
// We don't use an incremental MouseDelta but rather compute an absolute target size based on mouse position
- ImVec2 corner_target = g.IO.MousePos - g.ActiveIdClickOffset + ImLerp(grip.InnerDir * grip_hover_outer_size, grip.InnerDir * -grip_hover_inner_size, grip.CornerPos); // Corner of the window corresponding to our corner grip
- CalcResizePosSizeFromAnyCorner(window, corner_target, grip.CornerPos, &pos_target, &size_target);
+ ImVec2 corner_target = g.IO.MousePos - g.ActiveIdClickOffset + ImLerp(grip.InnerDir * grip_hover_outer_size, grip.InnerDir * -grip_hover_inner_size, grip.CornerPosN); // Corner of the window corresponding to our corner grip
+ CalcResizePosSizeFromAnyCorner(window, corner_target, grip.CornerPosN, &pos_target, &size_target);
}
if (resize_grip_n == 0 || held || hovered)
resize_grip_col[resize_grip_n] = GetColorU32(held ? ImGuiCol_ResizeGripActive : hovered ? ImGuiCol_ResizeGripHovered : ImGuiCol_ResizeGrip);
@@ -4490,27 +5027,32 @@ static void ImGui::UpdateManualResize(ImGuiWindow* window, const ImVec2& size_au
for (int border_n = 0; border_n < resize_border_count; border_n++)
{
bool hovered, held;
- ImRect border_rect = GetResizeBorderRect(window, border_n, grip_hover_inner_size, RESIZE_WINDOWS_FROM_EDGES_HALF_THICKNESS);
- ButtonBehavior(border_rect, window->GetID((void*)(intptr_t)(border_n + 4)), &hovered, &held, ImGuiButtonFlags_FlattenChildren);
- //GetOverlayDrawList()->AddRect(border_rect.Min, border_rect.Max, IM_COL32(255, 255, 0, 255));
- if ((hovered && g.HoveredIdTimer > RESIZE_WINDOWS_FROM_EDGES_FEEDBACK_TIMER) || held)
+ ImRect border_rect = GetResizeBorderRect(window, border_n, grip_hover_inner_size, WINDOWS_RESIZE_FROM_EDGES_HALF_THICKNESS);
+ ButtonBehavior(border_rect, window->GetID(border_n + 4), &hovered, &held, ImGuiButtonFlags_FlattenChildren);
+ //GetForegroundDrawLists(window)->AddRect(border_rect.Min, border_rect.Max, IM_COL32(255, 255, 0, 255));
+ if ((hovered && g.HoveredIdTimer > WINDOWS_RESIZE_FROM_EDGES_FEEDBACK_TIMER) || held)
{
g.MouseCursor = (border_n & 1) ? ImGuiMouseCursor_ResizeEW : ImGuiMouseCursor_ResizeNS;
- if (held) *border_held = border_n;
+ if (held)
+ *border_held = border_n;
}
if (held)
{
ImVec2 border_target = window->Pos;
ImVec2 border_posn;
- if (border_n == 0) { border_posn = ImVec2(0, 0); border_target.y = (g.IO.MousePos.y - g.ActiveIdClickOffset.y + RESIZE_WINDOWS_FROM_EDGES_HALF_THICKNESS); }
- if (border_n == 1) { border_posn = ImVec2(1, 0); border_target.x = (g.IO.MousePos.x - g.ActiveIdClickOffset.x + RESIZE_WINDOWS_FROM_EDGES_HALF_THICKNESS); }
- if (border_n == 2) { border_posn = ImVec2(0, 1); border_target.y = (g.IO.MousePos.y - g.ActiveIdClickOffset.y + RESIZE_WINDOWS_FROM_EDGES_HALF_THICKNESS); }
- if (border_n == 3) { border_posn = ImVec2(0, 0); border_target.x = (g.IO.MousePos.x - g.ActiveIdClickOffset.x + RESIZE_WINDOWS_FROM_EDGES_HALF_THICKNESS); }
+ if (border_n == 0) { border_posn = ImVec2(0, 0); border_target.y = (g.IO.MousePos.y - g.ActiveIdClickOffset.y + WINDOWS_RESIZE_FROM_EDGES_HALF_THICKNESS); } // Top
+ if (border_n == 1) { border_posn = ImVec2(1, 0); border_target.x = (g.IO.MousePos.x - g.ActiveIdClickOffset.x + WINDOWS_RESIZE_FROM_EDGES_HALF_THICKNESS); } // Right
+ if (border_n == 2) { border_posn = ImVec2(0, 1); border_target.y = (g.IO.MousePos.y - g.ActiveIdClickOffset.y + WINDOWS_RESIZE_FROM_EDGES_HALF_THICKNESS); } // Bottom
+ if (border_n == 3) { border_posn = ImVec2(0, 0); border_target.x = (g.IO.MousePos.x - g.ActiveIdClickOffset.x + WINDOWS_RESIZE_FROM_EDGES_HALF_THICKNESS); } // Left
CalcResizePosSizeFromAnyCorner(window, border_target, border_posn, &pos_target, &size_target);
}
}
PopID();
+ // Restore nav layer
+ window->DC.NavLayerCurrent = ImGuiNavLayer_Main;
+ window->DC.NavLayerCurrentMask = (1 << ImGuiNavLayer_Main);
+
// Navigation resize (keyboard/gamepad)
if (g.NavWindowingTarget && g.NavWindowingTarget->RootWindow == window)
{
@@ -4527,7 +5069,7 @@ static void ImGui::UpdateManualResize(ImGuiWindow* window, const ImVec2& size_au
g.NavDisableMouseHover = true;
resize_grip_col[0] = GetColorU32(ImGuiCol_ResizeGripActive);
// FIXME-NAV: Should store and accumulate into a separate size buffer to handle sizing constraints properly, right now a constraint will make us stuck.
- size_target = CalcSizeAfterConstraint(window, window->SizeFull + nav_resize_delta);
+ size_target = CalcWindowSizeAfterConstraint(window, window->SizeFull + nav_resize_delta);
}
}
@@ -4544,6 +5086,220 @@ static void ImGui::UpdateManualResize(ImGuiWindow* window, const ImVec2& size_au
}
window->Size = window->SizeFull;
+ return ret_auto_fit;
+}
+
+static inline void ClampWindowRect(ImGuiWindow* window, const ImRect& rect, const ImVec2& padding)
+{
+ ImGuiContext& g = *GImGui;
+ ImVec2 size_for_clamping = (g.IO.ConfigWindowsMoveFromTitleBarOnly && !(window->Flags & ImGuiWindowFlags_NoTitleBar)) ? ImVec2(window->Size.x, window->TitleBarHeight()) : window->Size;
+ window->Pos = ImMin(rect.Max - padding, ImMax(window->Pos + size_for_clamping, rect.Min + padding) - size_for_clamping);
+}
+
+static void ImGui::RenderWindowOuterBorders(ImGuiWindow* window)
+{
+ ImGuiContext& g = *GImGui;
+ float rounding = window->WindowRounding;
+ float border_size = window->WindowBorderSize;
+ if (border_size > 0.0f && !(window->Flags & ImGuiWindowFlags_NoBackground))
+ window->DrawList->AddRect(window->Pos, window->Pos + window->Size, GetColorU32(ImGuiCol_Border), rounding, ImDrawCornerFlags_All, border_size);
+
+ int border_held = window->ResizeBorderHeld;
+ if (border_held != -1)
+ {
+ struct ImGuiResizeBorderDef
+ {
+ ImVec2 InnerDir;
+ ImVec2 CornerPosN1, CornerPosN2;
+ float OuterAngle;
+ };
+ static const ImGuiResizeBorderDef resize_border_def[4] =
+ {
+ { ImVec2(0,+1), ImVec2(0,0), ImVec2(1,0), IM_PI*1.50f }, // Top
+ { ImVec2(-1,0), ImVec2(1,0), ImVec2(1,1), IM_PI*0.00f }, // Right
+ { ImVec2(0,-1), ImVec2(1,1), ImVec2(0,1), IM_PI*0.50f }, // Bottom
+ { ImVec2(+1,0), ImVec2(0,1), ImVec2(0,0), IM_PI*1.00f } // Left
+ };
+ const ImGuiResizeBorderDef& def = resize_border_def[border_held];
+ ImRect border_r = GetResizeBorderRect(window, border_held, rounding, 0.0f);
+ window->DrawList->PathArcTo(ImLerp(border_r.Min, border_r.Max, def.CornerPosN1) + ImVec2(0.5f, 0.5f) + def.InnerDir * rounding, rounding, def.OuterAngle - IM_PI*0.25f, def.OuterAngle);
+ window->DrawList->PathArcTo(ImLerp(border_r.Min, border_r.Max, def.CornerPosN2) + ImVec2(0.5f, 0.5f) + def.InnerDir * rounding, rounding, def.OuterAngle, def.OuterAngle + IM_PI*0.25f);
+ window->DrawList->PathStroke(GetColorU32(ImGuiCol_SeparatorActive), false, ImMax(2.0f, border_size)); // Thicker than usual
+ }
+ if (g.Style.FrameBorderSize > 0 && !(window->Flags & ImGuiWindowFlags_NoTitleBar))
+ {
+ float y = window->Pos.y + window->TitleBarHeight() - 1;
+ window->DrawList->AddLine(ImVec2(window->Pos.x + border_size, y), ImVec2(window->Pos.x + window->Size.x - border_size, y), GetColorU32(ImGuiCol_Border), g.Style.FrameBorderSize);
+ }
+}
+
+// Draw background and borders
+// Draw and handle scrollbars
+void ImGui::RenderWindowDecorations(ImGuiWindow* window, const ImRect& title_bar_rect, bool title_bar_is_highlight, int resize_grip_count, const ImU32 resize_grip_col[4], float resize_grip_draw_size)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiStyle& style = g.Style;
+ ImGuiWindowFlags flags = window->Flags;
+
+ // Ensure that ScrollBar doesn't read last frame's SkipItems
+ window->SkipItems = false;
+
+ // Draw window + handle manual resize
+ // As we highlight the title bar when want_focus is set, multiple reappearing windows will have have their title bar highlighted on their reappearing frame.
+ const float window_rounding = window->WindowRounding;
+ const float window_border_size = window->WindowBorderSize;
+ if (window->Collapsed)
+ {
+ // Title bar only
+ float backup_border_size = style.FrameBorderSize;
+ g.Style.FrameBorderSize = window->WindowBorderSize;
+ ImU32 title_bar_col = GetColorU32((title_bar_is_highlight && !g.NavDisableHighlight) ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBgCollapsed);
+ RenderFrame(title_bar_rect.Min, title_bar_rect.Max, title_bar_col, true, window_rounding);
+ g.Style.FrameBorderSize = backup_border_size;
+ }
+ else
+ {
+ // Window background
+ if (!(flags & ImGuiWindowFlags_NoBackground))
+ {
+ ImU32 bg_col = GetColorU32(GetWindowBgColorIdxFromFlags(flags));
+ bool override_alpha = false;
+ float alpha = 1.0f;
+ if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasBgAlpha)
+ {
+ alpha = g.NextWindowData.BgAlphaVal;
+ override_alpha = true;
+ }
+ if (override_alpha)
+ bg_col = (bg_col & ~IM_COL32_A_MASK) | (IM_F32_TO_INT8_SAT(alpha) << IM_COL32_A_SHIFT);
+ window->DrawList->AddRectFilled(window->Pos + ImVec2(0, window->TitleBarHeight()), window->Pos + window->Size, bg_col, window_rounding, (flags & ImGuiWindowFlags_NoTitleBar) ? ImDrawCornerFlags_All : ImDrawCornerFlags_Bot);
+ }
+
+ // Title bar
+ if (!(flags & ImGuiWindowFlags_NoTitleBar))
+ {
+ ImU32 title_bar_col = GetColorU32(title_bar_is_highlight ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBg);
+ window->DrawList->AddRectFilled(title_bar_rect.Min, title_bar_rect.Max, title_bar_col, window_rounding, ImDrawCornerFlags_Top);
+ }
+
+ // Menu bar
+ if (flags & ImGuiWindowFlags_MenuBar)
+ {
+ ImRect menu_bar_rect = window->MenuBarRect();
+ menu_bar_rect.ClipWith(window->Rect()); // Soft clipping, in particular child window don't have minimum size covering the menu bar so this is useful for them.
+ window->DrawList->AddRectFilled(menu_bar_rect.Min + ImVec2(window_border_size, 0), menu_bar_rect.Max - ImVec2(window_border_size, 0), GetColorU32(ImGuiCol_MenuBarBg), (flags & ImGuiWindowFlags_NoTitleBar) ? window_rounding : 0.0f, ImDrawCornerFlags_Top);
+ if (style.FrameBorderSize > 0.0f && menu_bar_rect.Max.y < window->Pos.y + window->Size.y)
+ window->DrawList->AddLine(menu_bar_rect.GetBL(), menu_bar_rect.GetBR(), GetColorU32(ImGuiCol_Border), style.FrameBorderSize);
+ }
+
+ // Scrollbars
+ if (window->ScrollbarX)
+ Scrollbar(ImGuiAxis_X);
+ if (window->ScrollbarY)
+ Scrollbar(ImGuiAxis_Y);
+
+ // Render resize grips (after their input handling so we don't have a frame of latency)
+ if (!(flags & ImGuiWindowFlags_NoResize))
+ {
+ for (int resize_grip_n = 0; resize_grip_n < resize_grip_count; resize_grip_n++)
+ {
+ const ImGuiResizeGripDef& grip = resize_grip_def[resize_grip_n];
+ const ImVec2 corner = ImLerp(window->Pos, window->Pos + window->Size, grip.CornerPosN);
+ window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(window_border_size, resize_grip_draw_size) : ImVec2(resize_grip_draw_size, window_border_size)));
+ window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(resize_grip_draw_size, window_border_size) : ImVec2(window_border_size, resize_grip_draw_size)));
+ window->DrawList->PathArcToFast(ImVec2(corner.x + grip.InnerDir.x * (window_rounding + window_border_size), corner.y + grip.InnerDir.y * (window_rounding + window_border_size)), window_rounding, grip.AngleMin12, grip.AngleMax12);
+ window->DrawList->PathFillConvex(resize_grip_col[resize_grip_n]);
+ }
+ }
+
+ // Borders
+ RenderWindowOuterBorders(window);
+ }
+}
+
+// Render title text, collapse button, close button
+void ImGui::RenderWindowTitleBarContents(ImGuiWindow* window, const ImRect& title_bar_rect, const char* name, bool* p_open)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiStyle& style = g.Style;
+ ImGuiWindowFlags flags = window->Flags;
+
+ const bool has_close_button = (p_open != NULL);
+ const bool has_collapse_button = !(flags & ImGuiWindowFlags_NoCollapse) && (style.WindowMenuButtonPosition != ImGuiDir_None);
+
+ // Close & Collapse button are on the Menu NavLayer and don't default focus (unless there's nothing else on that layer)
+ const ImGuiItemFlags item_flags_backup = window->DC.ItemFlags;
+ window->DC.ItemFlags |= ImGuiItemFlags_NoNavDefaultFocus;
+ window->DC.NavLayerCurrent = ImGuiNavLayer_Menu;
+ window->DC.NavLayerCurrentMask = (1 << ImGuiNavLayer_Menu);
+
+ // Layout buttons
+ // FIXME: Would be nice to generalize the subtleties expressed here into reusable code.
+ float pad_l = style.FramePadding.x;
+ float pad_r = style.FramePadding.x;
+ float button_sz = g.FontSize;
+ ImVec2 close_button_pos;
+ ImVec2 collapse_button_pos;
+ if (has_close_button)
+ {
+ pad_r += button_sz;
+ close_button_pos = ImVec2(title_bar_rect.Max.x - pad_r - style.FramePadding.x, title_bar_rect.Min.y);
+ }
+ if (has_collapse_button && style.WindowMenuButtonPosition == ImGuiDir_Right)
+ {
+ pad_r += button_sz;
+ collapse_button_pos = ImVec2(title_bar_rect.Max.x - pad_r - style.FramePadding.x, title_bar_rect.Min.y);
+ }
+ if (has_collapse_button && style.WindowMenuButtonPosition == ImGuiDir_Left)
+ {
+ collapse_button_pos = ImVec2(title_bar_rect.Min.x + pad_l - style.FramePadding.x, title_bar_rect.Min.y);
+ pad_l += button_sz;
+ }
+
+ // Collapse button (submitting first so it gets priority when choosing a navigation init fallback)
+ if (has_collapse_button)
+ if (CollapseButton(window->GetID("#COLLAPSE"), collapse_button_pos))
+ window->WantCollapseToggle = true; // Defer actual collapsing to next frame as we are too far in the Begin() function
+
+ // Close button
+ if (has_close_button)
+ if (CloseButton(window->GetID("#CLOSE"), close_button_pos))
+ *p_open = false;
+
+ window->DC.NavLayerCurrent = ImGuiNavLayer_Main;
+ window->DC.NavLayerCurrentMask = (1 << ImGuiNavLayer_Main);
+ window->DC.ItemFlags = item_flags_backup;
+
+ // Title bar text (with: horizontal alignment, avoiding collapse/close button, optional "unsaved document" marker)
+ // FIXME: Refactor text alignment facilities along with RenderText helpers, this is WAY too much messy code..
+ const char* UNSAVED_DOCUMENT_MARKER = "*";
+ const float marker_size_x = (flags & ImGuiWindowFlags_UnsavedDocument) ? CalcTextSize(UNSAVED_DOCUMENT_MARKER, NULL, false).x : 0.0f;
+ const ImVec2 text_size = CalcTextSize(name, NULL, true) + ImVec2(marker_size_x, 0.0f);
+
+ // As a nice touch we try to ensure that centered title text doesn't get affected by visibility of Close/Collapse button,
+ // while uncentered title text will still reach edges correct.
+ if (pad_l > style.FramePadding.x)
+ pad_l += g.Style.ItemInnerSpacing.x;
+ if (pad_r > style.FramePadding.x)
+ pad_r += g.Style.ItemInnerSpacing.x;
+ if (style.WindowTitleAlign.x > 0.0f && style.WindowTitleAlign.x < 1.0f)
+ {
+ float centerness = ImSaturate(1.0f - ImFabs(style.WindowTitleAlign.x - 0.5f) * 2.0f); // 0.0f on either edges, 1.0f on center
+ float pad_extend = ImMin(ImMax(pad_l, pad_r), title_bar_rect.GetWidth() - pad_l - pad_r - text_size.x);
+ pad_l = ImMax(pad_l, pad_extend * centerness);
+ pad_r = ImMax(pad_r, pad_extend * centerness);
+ }
+
+ ImRect layout_r(title_bar_rect.Min.x + pad_l, title_bar_rect.Min.y, title_bar_rect.Max.x - pad_r, title_bar_rect.Max.y);
+ ImRect clip_r(layout_r.Min.x, layout_r.Min.y, layout_r.Max.x + g.Style.ItemInnerSpacing.x, layout_r.Max.y);
+ //if (g.IO.KeyCtrl) window->DrawList->AddRect(layout_r.Min, layout_r.Max, IM_COL32(255, 128, 0, 255)); // [DEBUG]
+ RenderTextClipped(layout_r.Min, layout_r.Max, name, NULL, &text_size, style.WindowTitleAlign, &clip_r);
+ if (flags & ImGuiWindowFlags_UnsavedDocument)
+ {
+ ImVec2 marker_pos = ImVec2(ImMax(layout_r.Min.x, layout_r.Min.x + (layout_r.GetWidth() - text_size.x) * style.WindowTitleAlign.x) + text_size.x, layout_r.Min.y) + ImVec2(2 - marker_size_x, 0.0f);
+ ImVec2 off = ImVec2(0.0f, IM_FLOOR(-g.FontSize * 0.25f));
+ RenderTextClipped(marker_pos + off, layout_r.Max + off, UNSAVED_DOCUMENT_MARKER, NULL, NULL, ImVec2(0, style.WindowTitleAlign.y), &clip_r);
+ }
}
void ImGui::UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window)
@@ -4555,10 +5311,13 @@ void ImGui::UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags
if (parent_window && !(flags & ImGuiWindowFlags_Modal) && (flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup)))
window->RootWindowForTitleBarHighlight = parent_window->RootWindowForTitleBarHighlight;
while (window->RootWindowForNav->Flags & ImGuiWindowFlags_NavFlattened)
+ {
+ IM_ASSERT(window->RootWindowForNav->ParentWindow != NULL);
window->RootWindowForNav = window->RootWindowForNav->ParentWindow;
+ }
}
-// Push a new ImGui window to add widgets to.
+// Push a new Dear ImGui window to add widgets to.
// - A default window called "Debug" is automatically stacked at the beginning of every frame so you can use widgets without explicitly calling a Begin/End pair.
// - Begin/End can be called multiple times during the frame with the same window name to append content.
// - The window name is used as a unique identifier to preserve window information across frames (and save rudimentary information to the .ini file).
@@ -4569,8 +5328,8 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
{
ImGuiContext& g = *GImGui;
const ImGuiStyle& style = g.Style;
- IM_ASSERT(name != NULL); // Window name required
- IM_ASSERT(g.FrameScopeActive); // Forgot to call ImGui::NewFrame()
+ IM_ASSERT(name != NULL && name[0] != '\0'); // Window name required
+ IM_ASSERT(g.WithinFrameScope); // Forgot to call ImGui::NewFrame()
IM_ASSERT(g.FrameCountEnded != g.FrameCount); // Called ImGui::Render() or ImGui::EndFrame() and haven't called ImGui::NewFrame() again yet
// Find or create
@@ -4578,7 +5337,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
const bool window_just_created = (window == NULL);
if (window_just_created)
{
- ImVec2 size_on_first_use = (g.NextWindowData.SizeCond != 0) ? g.NextWindowData.SizeVal : ImVec2(0.0f, 0.0f); // Any condition flag will do since we are creating a new window here.
+ ImVec2 size_on_first_use = (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSize) ? g.NextWindowData.SizeVal : ImVec2(0.0f, 0.0f); // Any condition flag will do since we are creating a new window here.
window = CreateNewWindow(name, size_on_first_use, flags);
}
@@ -4591,23 +5350,14 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
const int current_frame = g.FrameCount;
const bool first_begin_of_the_frame = (window->LastFrameActive != current_frame);
- if (first_begin_of_the_frame)
- window->Flags = (ImGuiWindowFlags)flags;
- else
- flags = window->Flags;
-
- // Parent window is latched only on the first call to Begin() of the frame, so further append-calls can be done from a different window stack
- ImGuiWindow* parent_window_in_stack = g.CurrentWindowStack.empty() ? NULL : g.CurrentWindowStack.back();
- ImGuiWindow* parent_window = first_begin_of_the_frame ? ((flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup)) ? parent_window_in_stack : NULL) : window->ParentWindow;
- IM_ASSERT(parent_window != NULL || !(flags & ImGuiWindowFlags_ChildWindow));
- window->HasCloseButton = (p_open != NULL);
+ window->IsFallbackWindow = (g.CurrentWindowStack.Size == 0 && g.WithinFrameScopeWithImplicitWindow);
// Update the Appearing flag
bool window_just_activated_by_user = (window->LastFrameActive < current_frame - 1); // Not using !WasActive because the implicit "Debug" window would always toggle off->on
- const bool window_just_appearing_after_hidden_for_resize = (window->HiddenFramesForResize > 0);
+ const bool window_just_appearing_after_hidden_for_resize = (window->HiddenFramesCannotSkipItems > 0);
if (flags & ImGuiWindowFlags_Popup)
{
- ImGuiPopupRef& popup_ref = g.OpenPopupStack[g.CurrentPopupStack.Size];
+ ImGuiPopupData& popup_ref = g.OpenPopupStack[g.BeginPopupStack.Size];
window_just_activated_by_user |= (window->PopupId != popup_ref.PopupId); // We recycle popups so treat window as activated if popup id changed
window_just_activated_by_user |= (window != popup_ref.Window);
}
@@ -4615,25 +5365,53 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
if (window->Appearing)
SetWindowConditionAllowFlags(window, ImGuiCond_Appearing, true);
+ // Update Flags, LastFrameActive, BeginOrderXXX fields
+ if (first_begin_of_the_frame)
+ {
+ window->Flags = (ImGuiWindowFlags)flags;
+ window->LastFrameActive = current_frame;
+ window->LastTimeActive = (float)g.Time;
+ window->BeginOrderWithinParent = 0;
+ window->BeginOrderWithinContext = (short)(g.WindowsActiveCount++);
+ }
+ else
+ {
+ flags = window->Flags;
+ }
+
+ // Parent window is latched only on the first call to Begin() of the frame, so further append-calls can be done from a different window stack
+ ImGuiWindow* parent_window_in_stack = g.CurrentWindowStack.empty() ? NULL : g.CurrentWindowStack.back();
+ ImGuiWindow* parent_window = first_begin_of_the_frame ? ((flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup)) ? parent_window_in_stack : NULL) : window->ParentWindow;
+ IM_ASSERT(parent_window != NULL || !(flags & ImGuiWindowFlags_ChildWindow));
+
+ // We allow window memory to be compacted so recreate the base stack when needed.
+ if (window->IDStack.Size == 0)
+ window->IDStack.push_back(window->ID);
+
// Add to stack
+ // We intentionally set g.CurrentWindow to NULL to prevent usage until when the viewport is set, then will call SetCurrentWindow()
g.CurrentWindowStack.push_back(window);
- SetCurrentWindow(window);
- CheckStacksSize(window, true);
+ g.CurrentWindow = NULL;
+ ErrorCheckBeginEndCompareStacksSize(window, true);
if (flags & ImGuiWindowFlags_Popup)
{
- ImGuiPopupRef& popup_ref = g.OpenPopupStack[g.CurrentPopupStack.Size];
+ ImGuiPopupData& popup_ref = g.OpenPopupStack[g.BeginPopupStack.Size];
popup_ref.Window = window;
- g.CurrentPopupStack.push_back(popup_ref);
+ g.BeginPopupStack.push_back(popup_ref);
window->PopupId = popup_ref.PopupId;
}
if (window_just_appearing_after_hidden_for_resize && !(flags & ImGuiWindowFlags_ChildWindow))
window->NavLastIds[0] = 0;
+ // Update ->RootWindow and others pointers (before any possible call to FocusWindow)
+ if (first_begin_of_the_frame)
+ UpdateWindowParentAndRootLinks(window, flags, parent_window);
+
// Process SetNextWindow***() calls
bool window_pos_set_by_api = false;
bool window_size_x_set_by_api = false, window_size_y_set_by_api = false;
- if (g.NextWindowData.PosCond)
+ if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasPos)
{
window_pos_set_by_api = (window->SetWindowPosAllowFlags & g.NextWindowData.PosCond) != 0;
if (window_pos_set_by_api && ImLengthSqr(g.NextWindowData.PosPivotVal) > 0.00001f)
@@ -4649,26 +5427,19 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
SetWindowPos(window, g.NextWindowData.PosVal, g.NextWindowData.PosCond);
}
}
- if (g.NextWindowData.SizeCond)
+ if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSize)
{
window_size_x_set_by_api = (window->SetWindowSizeAllowFlags & g.NextWindowData.SizeCond) != 0 && (g.NextWindowData.SizeVal.x > 0.0f);
window_size_y_set_by_api = (window->SetWindowSizeAllowFlags & g.NextWindowData.SizeCond) != 0 && (g.NextWindowData.SizeVal.y > 0.0f);
SetWindowSize(window, g.NextWindowData.SizeVal, g.NextWindowData.SizeCond);
}
- if (g.NextWindowData.ContentSizeCond)
- {
- // Adjust passed "client size" to become a "window size"
- window->SizeContentsExplicit = g.NextWindowData.ContentSizeVal;
- if (window->SizeContentsExplicit.y != 0.0f)
- window->SizeContentsExplicit.y += window->TitleBarHeight() + window->MenuBarHeight();
- }
+ if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasContentSize)
+ window->ContentSizeExplicit = g.NextWindowData.ContentSizeVal;
else if (first_begin_of_the_frame)
- {
- window->SizeContentsExplicit = ImVec2(0.0f, 0.0f);
- }
- if (g.NextWindowData.CollapsedCond)
+ window->ContentSizeExplicit = ImVec2(0.0f, 0.0f);
+ if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasCollapsed)
SetWindowCollapsed(window, g.NextWindowData.CollapsedVal, g.NextWindowData.CollapsedCond);
- if (g.NextWindowData.FocusCond)
+ if (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasFocus)
FocusWindow(window);
if (window->Appearing)
SetWindowConditionAllowFlags(window, ImGuiCond_Appearing, false);
@@ -4678,53 +5449,68 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
{
// Initialize
const bool window_is_child_tooltip = (flags & ImGuiWindowFlags_ChildWindow) && (flags & ImGuiWindowFlags_Tooltip); // FIXME-WIP: Undocumented behavior of Child+Tooltip for pinned tooltip (#1345)
- UpdateWindowParentAndRootLinks(window, flags, parent_window);
-
window->Active = true;
- window->BeginOrderWithinParent = 0;
- window->BeginOrderWithinContext = g.WindowsActiveCount++;
- window->BeginCount = 0;
+ window->HasCloseButton = (p_open != NULL);
window->ClipRect = ImVec4(-FLT_MAX,-FLT_MAX,+FLT_MAX,+FLT_MAX);
- window->LastFrameActive = current_frame;
window->IDStack.resize(1);
+ // Restore buffer capacity when woken from a compacted state, to avoid
+ if (window->MemoryCompacted)
+ GcAwakeTransientWindowBuffers(window);
+
+ // Update stored window name when it changes (which can _only_ happen with the "###" operator, so the ID would stay unchanged).
+ // The title bar always display the 'name' parameter, so we only update the string storage if it needs to be visible to the end-user elsewhere.
+ bool window_title_visible_elsewhere = false;
+ if (g.NavWindowingList != NULL && (window->Flags & ImGuiWindowFlags_NoNavFocus) == 0) // Window titles visible when using CTRL+TAB
+ window_title_visible_elsewhere = true;
+ if (window_title_visible_elsewhere && !window_just_created && strcmp(name, window->Name) != 0)
+ {
+ size_t buf_len = (size_t)window->NameBufLen;
+ window->Name = ImStrdupcpy(window->Name, &buf_len, name);
+ window->NameBufLen = (int)buf_len;
+ }
+
// UPDATE CONTENTS SIZE, UPDATE HIDDEN STATUS
// Update contents size from last frame for auto-fitting (or use explicit size)
- window->SizeContents = CalcSizeContents(window);
- if (window->HiddenFramesRegular > 0)
- window->HiddenFramesRegular--;
- if (window->HiddenFramesForResize > 0)
- window->HiddenFramesForResize--;
+ window->ContentSize = CalcWindowContentSize(window);
+ if (window->HiddenFramesCanSkipItems > 0)
+ window->HiddenFramesCanSkipItems--;
+ if (window->HiddenFramesCannotSkipItems > 0)
+ window->HiddenFramesCannotSkipItems--;
// Hide new windows for one frame until they calculate their size
if (window_just_created && (!window_size_x_set_by_api || !window_size_y_set_by_api))
- window->HiddenFramesForResize = 1;
+ window->HiddenFramesCannotSkipItems = 1;
// Hide popup/tooltip window when re-opening while we measure size (because we recycle the windows)
- // We reset Size/SizeContents for reappearing popups/tooltips early in this function, so further code won't be tempted to use the old size.
+ // We reset Size/ContentSize for reappearing popups/tooltips early in this function, so further code won't be tempted to use the old size.
if (window_just_activated_by_user && (flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_Tooltip)) != 0)
{
- window->HiddenFramesForResize = 1;
+ window->HiddenFramesCannotSkipItems = 1;
if (flags & ImGuiWindowFlags_AlwaysAutoResize)
{
if (!window_size_x_set_by_api)
window->Size.x = window->SizeFull.x = 0.f;
if (!window_size_y_set_by_api)
window->Size.y = window->SizeFull.y = 0.f;
- window->SizeContents = ImVec2(0.f, 0.f);
+ window->ContentSize = ImVec2(0.f, 0.f);
}
}
+ // SELECT VIEWPORT
+ // FIXME-VIEWPORT: In the docking/viewport branch, this is the point where we select the current viewport (which may affect the style)
SetCurrentWindow(window);
- // Lock border size and padding for the frame (so that altering them doesn't cause inconsistencies)
- window->WindowBorderSize = (flags & ImGuiWindowFlags_ChildWindow) ? style.ChildBorderSize : ((flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_Tooltip)) && !(flags & ImGuiWindowFlags_Modal)) ? style.PopupBorderSize : style.WindowBorderSize;
+ // LOCK BORDER SIZE AND PADDING FOR THE FRAME (so that altering them doesn't cause inconsistencies)
+
+ if (flags & ImGuiWindowFlags_ChildWindow)
+ window->WindowBorderSize = style.ChildBorderSize;
+ else
+ window->WindowBorderSize = ((flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_Tooltip)) && !(flags & ImGuiWindowFlags_Modal)) ? style.PopupBorderSize : style.WindowBorderSize;
window->WindowPadding = style.WindowPadding;
if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & (ImGuiWindowFlags_AlwaysUseWindowPadding | ImGuiWindowFlags_Popup)) && window->WindowBorderSize == 0.0f)
window->WindowPadding = ImVec2(0.0f, (flags & ImGuiWindowFlags_MenuBar) ? style.WindowPadding.y : 0.0f);
- window->DC.MenuBarOffset.x = ImMax(ImMax(window->WindowPadding.x, style.ItemSpacing.x), g.NextWindowData.MenuBarOffsetMinVal.x);
- window->DC.MenuBarOffset.y = g.NextWindowData.MenuBarOffsetMinVal.y;
// Collapse window by double-clicking on title bar
// At this point we don't have a clipping rectangle setup yet, so we can use the title bar area for hit detection and drawing
@@ -4750,46 +5536,47 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
// SIZE
// Calculate auto-fit size, handle automatic resize
- const ImVec2 size_auto_fit = CalcSizeAutoFit(window, window->SizeContents);
- ImVec2 size_full_modified(FLT_MAX, FLT_MAX);
+ const ImVec2 size_auto_fit = CalcWindowAutoFitSize(window, window->ContentSize);
+ bool use_current_size_for_scrollbar_x = window_just_created;
+ bool use_current_size_for_scrollbar_y = window_just_created;
if ((flags & ImGuiWindowFlags_AlwaysAutoResize) && !window->Collapsed)
{
// Using SetNextWindowSize() overrides ImGuiWindowFlags_AlwaysAutoResize, so it can be used on tooltips/popups, etc.
if (!window_size_x_set_by_api)
- window->SizeFull.x = size_full_modified.x = size_auto_fit.x;
+ {
+ window->SizeFull.x = size_auto_fit.x;
+ use_current_size_for_scrollbar_x = true;
+ }
if (!window_size_y_set_by_api)
- window->SizeFull.y = size_full_modified.y = size_auto_fit.y;
+ {
+ window->SizeFull.y = size_auto_fit.y;
+ use_current_size_for_scrollbar_y = true;
+ }
}
else if (window->AutoFitFramesX > 0 || window->AutoFitFramesY > 0)
{
// Auto-fit may only grow window during the first few frames
// We still process initial auto-fit on collapsed windows to get a window width, but otherwise don't honor ImGuiWindowFlags_AlwaysAutoResize when collapsed.
if (!window_size_x_set_by_api && window->AutoFitFramesX > 0)
- window->SizeFull.x = size_full_modified.x = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.x, size_auto_fit.x) : size_auto_fit.x;
+ {
+ window->SizeFull.x = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.x, size_auto_fit.x) : size_auto_fit.x;
+ use_current_size_for_scrollbar_x = true;
+ }
if (!window_size_y_set_by_api && window->AutoFitFramesY > 0)
- window->SizeFull.y = size_full_modified.y = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.y, size_auto_fit.y) : size_auto_fit.y;
+ {
+ window->SizeFull.y = window->AutoFitOnlyGrows ? ImMax(window->SizeFull.y, size_auto_fit.y) : size_auto_fit.y;
+ use_current_size_for_scrollbar_y = true;
+ }
if (!window->Collapsed)
MarkIniSettingsDirty(window);
}
// Apply minimum/maximum window size constraints and final size
- window->SizeFull = CalcSizeAfterConstraint(window, window->SizeFull);
+ window->SizeFull = CalcWindowSizeAfterConstraint(window, window->SizeFull);
window->Size = window->Collapsed && !(flags & ImGuiWindowFlags_ChildWindow) ? window->TitleBarRect().GetSize() : window->SizeFull;
- // SCROLLBAR STATUS
-
- // Update scrollbar status (based on the Size that was effective during last frame or the auto-resized Size).
- if (!window->Collapsed)
- {
- // When reading the current size we need to read it after size constraints have been applied
- float size_x_for_scrollbars = size_full_modified.x != FLT_MAX ? window->SizeFull.x : window->SizeFullAtLastBegin.x;
- float size_y_for_scrollbars = size_full_modified.y != FLT_MAX ? window->SizeFull.y : window->SizeFullAtLastBegin.y;
- window->ScrollbarY = (flags & ImGuiWindowFlags_AlwaysVerticalScrollbar) || ((window->SizeContents.y > size_y_for_scrollbars) && !(flags & ImGuiWindowFlags_NoScrollbar));
- window->ScrollbarX = (flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar) || ((window->SizeContents.x > size_x_for_scrollbars - (window->ScrollbarY ? style.ScrollbarSize : 0.0f)) && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar));
- if (window->ScrollbarX && !window->ScrollbarY)
- window->ScrollbarY = (window->SizeContents.y > size_y_for_scrollbars - style.ScrollbarSize) && !(flags & ImGuiWindowFlags_NoScrollbar);
- window->ScrollbarSizes = ImVec2(window->ScrollbarY ? style.ScrollbarSize : 0.0f, window->ScrollbarX ? style.ScrollbarSize : 0.0f);
- }
+ // Decoration size
+ const float decoration_up_height = window->TitleBarHeight() + window->MenuBarHeight();
// POSITION
@@ -4798,21 +5585,22 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
{
window->AutoPosLastDirection = ImGuiDir_None;
if ((flags & ImGuiWindowFlags_Popup) != 0 && !window_pos_set_by_api)
- window->Pos = g.CurrentPopupStack.back().OpenPopupPos;
+ window->Pos = g.BeginPopupStack.back().OpenPopupPos;
}
// Position child window
if (flags & ImGuiWindowFlags_ChildWindow)
{
- window->BeginOrderWithinParent = parent_window->DC.ChildWindows.Size;
+ IM_ASSERT(parent_window && parent_window->Active);
+ window->BeginOrderWithinParent = (short)parent_window->DC.ChildWindows.Size;
parent_window->DC.ChildWindows.push_back(window);
if (!(flags & ImGuiWindowFlags_Popup) && !window_pos_set_by_api && !window_is_child_tooltip)
window->Pos = parent_window->DC.CursorPos;
}
- const bool window_pos_with_pivot = (window->SetWindowPosVal.x != FLT_MAX && window->HiddenFramesForResize == 0);
+ const bool window_pos_with_pivot = (window->SetWindowPosVal.x != FLT_MAX && window->HiddenFramesCannotSkipItems == 0);
if (window_pos_with_pivot)
- SetWindowPos(window, ImMax(style.DisplaySafeAreaPadding, window->SetWindowPosVal - window->SizeFull * window->SetWindowPosPivot), 0); // Position given a pivot (e.g. for centering)
+ SetWindowPos(window, window->SetWindowPosVal - window->SizeFull * window->SetWindowPosPivot, 0); // Position given a pivot (e.g. for centering)
else if ((flags & ImGuiWindowFlags_ChildMenu) != 0)
window->Pos = FindBestWindowPosForPopup(window);
else if ((flags & ImGuiWindowFlags_Popup) != 0 && !window_pos_set_by_api && window_just_appearing_after_hidden_for_resize)
@@ -4820,14 +5608,15 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
else if ((flags & ImGuiWindowFlags_Tooltip) != 0 && !window_pos_set_by_api && !window_is_child_tooltip)
window->Pos = FindBestWindowPosForPopup(window);
- // Clamp position so it stays visible
- if (!(flags & ImGuiWindowFlags_ChildWindow))
+ // Clamp position/size so window stays visible within its viewport or monitor
+ // Ignore zero-sized display explicitly to avoid losing positions if a window manager reports zero-sized window when initializing or minimizing.
+ ImRect viewport_rect(GetViewportRect());
+ if (!window_pos_set_by_api && !(flags & ImGuiWindowFlags_ChildWindow) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0)
{
- if (!window_pos_set_by_api && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0 && g.IO.DisplaySize.x > 0.0f && g.IO.DisplaySize.y > 0.0f) // Ignore zero-sized display explicitly to avoid losing positions if a window manager reports zero-sized window when initializing or minimizing.
+ ImVec2 clamp_padding = ImMax(style.DisplayWindowPadding, style.DisplaySafeAreaPadding);
+ if (viewport_rect.GetWidth() > 0 && viewport_rect.GetHeight() > 0.0f)
{
- ImVec2 padding = ImMax(style.DisplayWindowPadding, style.DisplaySafeAreaPadding);
- window->Pos = ImMax(window->Pos + window->Size, padding) - window->Size;
- window->Pos = ImMin(window->Pos, g.IO.DisplaySize - padding);
+ ClampWindowRect(window, viewport_rect, clamp_padding);
}
}
window->Pos = ImFloor(window->Pos);
@@ -4835,50 +5624,113 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
// Lock window rounding for the frame (so that altering them doesn't cause inconsistencies)
window->WindowRounding = (flags & ImGuiWindowFlags_ChildWindow) ? style.ChildRounding : ((flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiWindowFlags_Modal)) ? style.PopupRounding : style.WindowRounding;
- // Prepare for item focus requests
- window->FocusIdxAllRequestCurrent = (window->FocusIdxAllRequestNext == INT_MAX || window->FocusIdxAllCounter == -1) ? INT_MAX : (window->FocusIdxAllRequestNext + (window->FocusIdxAllCounter+1)) % (window->FocusIdxAllCounter+1);
- window->FocusIdxTabRequestCurrent = (window->FocusIdxTabRequestNext == INT_MAX || window->FocusIdxTabCounter == -1) ? INT_MAX : (window->FocusIdxTabRequestNext + (window->FocusIdxTabCounter+1)) % (window->FocusIdxTabCounter+1);
- window->FocusIdxAllCounter = window->FocusIdxTabCounter = -1;
- window->FocusIdxAllRequestNext = window->FocusIdxTabRequestNext = INT_MAX;
-
- // Apply scrolling
- window->Scroll = CalcNextScrollFromScrollTargetAndClamp(window, true);
- window->ScrollTarget = ImVec2(FLT_MAX, FLT_MAX);
-
// Apply window focus (new and reactivated windows are moved to front)
bool want_focus = false;
if (window_just_activated_by_user && !(flags & ImGuiWindowFlags_NoFocusOnAppearing))
- if (!(flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Tooltip)) || (flags & ImGuiWindowFlags_Popup))
+ {
+ if (flags & ImGuiWindowFlags_Popup)
+ want_focus = true;
+ else if ((flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Tooltip)) == 0)
want_focus = true;
+ }
// Handle manual resize: Resize Grips, Borders, Gamepad
int border_held = -1;
- ImU32 resize_grip_col[4] = { 0 };
- const int resize_grip_count = g.IO.ConfigResizeWindowsFromEdges ? 2 : 1; // 4
- const float grip_draw_size = (float)(int)ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f);
+ ImU32 resize_grip_col[4] = {};
+ const int resize_grip_count = g.IO.ConfigWindowsResizeFromEdges ? 2 : 1; // Allow resize from lower-left if we have the mouse cursor feedback for it.
+ const float resize_grip_draw_size = IM_FLOOR(ImMax(g.FontSize * 1.35f, window->WindowRounding + 1.0f + g.FontSize * 0.2f));
if (!window->Collapsed)
- UpdateManualResize(window, size_auto_fit, &border_held, resize_grip_count, &resize_grip_col[0]);
+ if (UpdateManualResize(window, size_auto_fit, &border_held, resize_grip_count, &resize_grip_col[0]))
+ use_current_size_for_scrollbar_x = use_current_size_for_scrollbar_y = true;
+ window->ResizeBorderHeld = (signed char)border_held;
+
+ // SCROLLBAR VISIBILITY
+
+ // Update scrollbar visibility (based on the Size that was effective during last frame or the auto-resized Size).
+ if (!window->Collapsed)
+ {
+ // When reading the current size we need to read it after size constraints have been applied.
+ // When we use InnerRect here we are intentionally reading last frame size, same for ScrollbarSizes values before we set them again.
+ ImVec2 avail_size_from_current_frame = ImVec2(window->SizeFull.x, window->SizeFull.y - decoration_up_height);
+ ImVec2 avail_size_from_last_frame = window->InnerRect.GetSize() + window->ScrollbarSizes;
+ ImVec2 needed_size_from_last_frame = window_just_created ? ImVec2(0, 0) : window->ContentSize + window->WindowPadding * 2.0f;
+ float size_x_for_scrollbars = use_current_size_for_scrollbar_x ? avail_size_from_current_frame.x : avail_size_from_last_frame.x;
+ float size_y_for_scrollbars = use_current_size_for_scrollbar_y ? avail_size_from_current_frame.y : avail_size_from_last_frame.y;
+ //bool scrollbar_y_from_last_frame = window->ScrollbarY; // FIXME: May want to use that in the ScrollbarX expression? How many pros vs cons?
+ window->ScrollbarY = (flags & ImGuiWindowFlags_AlwaysVerticalScrollbar) || ((needed_size_from_last_frame.y > size_y_for_scrollbars) && !(flags & ImGuiWindowFlags_NoScrollbar));
+ window->ScrollbarX = (flags & ImGuiWindowFlags_AlwaysHorizontalScrollbar) || ((needed_size_from_last_frame.x > size_x_for_scrollbars - (window->ScrollbarY ? style.ScrollbarSize : 0.0f)) && !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar));
+ if (window->ScrollbarX && !window->ScrollbarY)
+ window->ScrollbarY = (needed_size_from_last_frame.y > size_y_for_scrollbars) && !(flags & ImGuiWindowFlags_NoScrollbar);
+ window->ScrollbarSizes = ImVec2(window->ScrollbarY ? style.ScrollbarSize : 0.0f, window->ScrollbarX ? style.ScrollbarSize : 0.0f);
+ }
+
+ // UPDATE RECTANGLES (1- THOSE NOT AFFECTED BY SCROLLING)
+ // Update various regions. Variables they depends on should be set above in this function.
+ // We set this up after processing the resize grip so that our rectangles doesn't lag by a frame.
+
+ // Outer rectangle
+ // Not affected by window border size. Used by:
+ // - FindHoveredWindow() (w/ extra padding when border resize is enabled)
+ // - Begin() initial clipping rect for drawing window background and borders.
+ // - Begin() clipping whole child
+ const ImRect host_rect = ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup) && !window_is_child_tooltip) ? parent_window->ClipRect : viewport_rect;
+ const ImRect outer_rect = window->Rect();
+ const ImRect title_bar_rect = window->TitleBarRect();
+ window->OuterRectClipped = outer_rect;
+ window->OuterRectClipped.ClipWith(host_rect);
+
+ // Inner rectangle
+ // Not affected by window border size. Used by:
+ // - InnerClipRect
+ // - ScrollToBringRectIntoView()
+ // - NavUpdatePageUpPageDown()
+ // - Scrollbar()
+ window->InnerRect.Min.x = window->Pos.x;
+ window->InnerRect.Min.y = window->Pos.y + decoration_up_height;
+ window->InnerRect.Max.x = window->Pos.x + window->Size.x - window->ScrollbarSizes.x;
+ window->InnerRect.Max.y = window->Pos.y + window->Size.y - window->ScrollbarSizes.y;
+
+ // Inner clipping rectangle.
+ // Will extend a little bit outside the normal work region.
+ // This is to allow e.g. Selectable or CollapsingHeader or some separators to cover that space.
+ // Force round operator last to ensure that e.g. (int)(max.x-min.x) in user's render code produce correct result.
+ // Note that if our window is collapsed we will end up with an inverted (~null) clipping rectangle which is the correct behavior.
+ // Affected by window/frame border size. Used by:
+ // - Begin() initial clip rect
+ float top_border_size = (((flags & ImGuiWindowFlags_MenuBar) || !(flags & ImGuiWindowFlags_NoTitleBar)) ? style.FrameBorderSize : window->WindowBorderSize);
+ window->InnerClipRect.Min.x = ImFloor(0.5f + window->InnerRect.Min.x + ImMax(ImFloor(window->WindowPadding.x * 0.5f), window->WindowBorderSize));
+ window->InnerClipRect.Min.y = ImFloor(0.5f + window->InnerRect.Min.y + top_border_size);
+ window->InnerClipRect.Max.x = ImFloor(0.5f + window->InnerRect.Max.x - ImMax(ImFloor(window->WindowPadding.x * 0.5f), window->WindowBorderSize));
+ window->InnerClipRect.Max.y = ImFloor(0.5f + window->InnerRect.Max.y - window->WindowBorderSize);
+ window->InnerClipRect.ClipWithFull(host_rect);
// Default item width. Make it proportional to window size if window manually resizes
if (window->Size.x > 0.0f && !(flags & ImGuiWindowFlags_Tooltip) && !(flags & ImGuiWindowFlags_AlwaysAutoResize))
- window->ItemWidthDefault = (float)(int)(window->Size.x * 0.65f);
+ window->ItemWidthDefault = ImFloor(window->Size.x * 0.65f);
else
- window->ItemWidthDefault = (float)(int)(g.FontSize * 16.0f);
+ window->ItemWidthDefault = ImFloor(g.FontSize * 16.0f);
+
+ // SCROLLING
+
+ // Lock down maximum scrolling
+ // The value of ScrollMax are ahead from ScrollbarX/ScrollbarY which is intentionally using InnerRect from previous rect in order to accommodate
+ // for right/bottom aligned items without creating a scrollbar.
+ window->ScrollMax.x = ImMax(0.0f, window->ContentSize.x + window->WindowPadding.x * 2.0f - window->InnerRect.GetWidth());
+ window->ScrollMax.y = ImMax(0.0f, window->ContentSize.y + window->WindowPadding.y * 2.0f - window->InnerRect.GetHeight());
+
+ // Apply scrolling
+ window->Scroll = CalcNextScrollFromScrollTargetAndClamp(window, true);
+ window->ScrollTarget = ImVec2(FLT_MAX, FLT_MAX);
// DRAWING
// Setup draw list and outer clipping rectangle
window->DrawList->Clear();
- window->DrawList->Flags = (g.Style.AntiAliasedLines ? ImDrawListFlags_AntiAliasedLines : 0) | (g.Style.AntiAliasedFill ? ImDrawListFlags_AntiAliasedFill : 0);
window->DrawList->PushTextureID(g.Font->ContainerAtlas->TexID);
- ImRect viewport_rect(GetViewportRect());
- if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup) && !window_is_child_tooltip)
- PushClipRect(parent_window->ClipRect.Min, parent_window->ClipRect.Max, true);
- else
- PushClipRect(viewport_rect.Min, viewport_rect.Max, true);
+ PushClipRect(host_rect.Min, host_rect.Max, false);
// Draw modal window background (darkens what is behind them, all viewports)
- const bool dim_bg_for_modal = (flags & ImGuiWindowFlags_Modal) && window == GetFrontMostPopupModal() && window->HiddenFramesForResize <= 0;
+ const bool dim_bg_for_modal = (flags & ImGuiWindowFlags_Modal) && window == GetTopMostPopupModal() && window->HiddenFramesCannotSkipItems <= 0;
const bool dim_bg_for_window_list = g.NavWindowingTargetAnim && (window == g.NavWindowingTargetAnim->RootWindow);
if (dim_bg_for_modal || dim_bg_for_window_list)
{
@@ -4895,78 +5747,26 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
window->DrawList->AddRectFilled(bb.Min, bb.Max, GetColorU32(ImGuiCol_NavWindowingHighlight, g.NavWindowingHighlightAlpha * 0.25f), g.Style.WindowRounding);
}
- // Draw window + handle manual resize
- const float window_rounding = window->WindowRounding;
- const float window_border_size = window->WindowBorderSize;
- const ImGuiWindow* window_to_highlight = g.NavWindowingTarget ? g.NavWindowingTarget : g.NavWindow;
- const bool title_bar_is_highlight = want_focus || (window_to_highlight && window->RootWindowForTitleBarHighlight == window_to_highlight->RootWindowForTitleBarHighlight);
- const ImRect title_bar_rect = window->TitleBarRect();
- if (window->Collapsed)
+ // Since 1.71, child window can render their decoration (bg color, border, scrollbars, etc.) within their parent to save a draw call.
+ // When using overlapping child windows, this will break the assumption that child z-order is mapped to submission order.
+ // We disable this when the parent window has zero vertices, which is a common pattern leading to laying out multiple overlapping child.
+ // We also disabled this when we have dimming overlay behind this specific one child.
+ // FIXME: More code may rely on explicit sorting of overlapping child window and would need to disable this somehow. Please get in contact if you are affected.
{
- // Title bar only
- float backup_border_size = style.FrameBorderSize;
- g.Style.FrameBorderSize = window->WindowBorderSize;
- ImU32 title_bar_col = GetColorU32((title_bar_is_highlight && !g.NavDisableHighlight) ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBgCollapsed);
- RenderFrame(title_bar_rect.Min, title_bar_rect.Max, title_bar_col, true, window_rounding);
- g.Style.FrameBorderSize = backup_border_size;
- }
- else
- {
- // Window background
- if (!(flags & ImGuiWindowFlags_NoBackground))
- {
- ImU32 bg_col = GetColorU32(GetWindowBgColorIdxFromFlags(flags));
- if (g.NextWindowData.BgAlphaCond != 0)
- bg_col = (bg_col & ~IM_COL32_A_MASK) | (IM_F32_TO_INT8_SAT(g.NextWindowData.BgAlphaVal) << IM_COL32_A_SHIFT);
- window->DrawList->AddRectFilled(window->Pos + ImVec2(0, window->TitleBarHeight()), window->Pos + window->Size, bg_col, window_rounding, (flags & ImGuiWindowFlags_NoTitleBar) ? ImDrawCornerFlags_All : ImDrawCornerFlags_Bot);
- }
- g.NextWindowData.BgAlphaCond = 0;
-
- // Title bar
- ImU32 title_bar_col = GetColorU32(window->Collapsed ? ImGuiCol_TitleBgCollapsed : title_bar_is_highlight ? ImGuiCol_TitleBgActive : ImGuiCol_TitleBg);
- if (!(flags & ImGuiWindowFlags_NoTitleBar))
- window->DrawList->AddRectFilled(title_bar_rect.Min, title_bar_rect.Max, title_bar_col, window_rounding, ImDrawCornerFlags_Top);
-
- // Menu bar
- if (flags & ImGuiWindowFlags_MenuBar)
- {
- ImRect menu_bar_rect = window->MenuBarRect();
- menu_bar_rect.ClipWith(window->Rect()); // Soft clipping, in particular child window don't have minimum size covering the menu bar so this is useful for them.
- window->DrawList->AddRectFilled(menu_bar_rect.Min, menu_bar_rect.Max, GetColorU32(ImGuiCol_MenuBarBg), (flags & ImGuiWindowFlags_NoTitleBar) ? window_rounding : 0.0f, ImDrawCornerFlags_Top);
- if (style.FrameBorderSize > 0.0f && menu_bar_rect.Max.y < window->Pos.y + window->Size.y)
- window->DrawList->AddLine(menu_bar_rect.GetBL(), menu_bar_rect.GetBR(), GetColorU32(ImGuiCol_Border), style.FrameBorderSize);
- }
-
- // Scrollbars
- if (window->ScrollbarX)
- Scrollbar(ImGuiLayoutType_Horizontal);
- if (window->ScrollbarY)
- Scrollbar(ImGuiLayoutType_Vertical);
-
- // Render resize grips (after their input handling so we don't have a frame of latency)
- if (!(flags & ImGuiWindowFlags_NoResize))
- {
- for (int resize_grip_n = 0; resize_grip_n < resize_grip_count; resize_grip_n++)
- {
- const ImGuiResizeGripDef& grip = resize_grip_def[resize_grip_n];
- const ImVec2 corner = ImLerp(window->Pos, window->Pos + window->Size, grip.CornerPos);
- window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(window_border_size, grip_draw_size) : ImVec2(grip_draw_size, window_border_size)));
- window->DrawList->PathLineTo(corner + grip.InnerDir * ((resize_grip_n & 1) ? ImVec2(grip_draw_size, window_border_size) : ImVec2(window_border_size, grip_draw_size)));
- window->DrawList->PathArcToFast(ImVec2(corner.x + grip.InnerDir.x * (window_rounding + window_border_size), corner.y + grip.InnerDir.y * (window_rounding + window_border_size)), window_rounding, grip.AngleMin12, grip.AngleMax12);
- window->DrawList->PathFillConvex(resize_grip_col[resize_grip_n]);
- }
- }
-
- // Borders
- if (window_border_size > 0.0f && !(flags & ImGuiWindowFlags_NoBackground))
- window->DrawList->AddRect(window->Pos, window->Pos + window->Size, GetColorU32(ImGuiCol_Border), window_rounding, ImDrawCornerFlags_All, window_border_size);
- if (border_held != -1)
- {
- ImRect border = GetResizeBorderRect(window, border_held, grip_draw_size, 0.0f);
- window->DrawList->AddLine(border.Min, border.Max, GetColorU32(ImGuiCol_SeparatorActive), ImMax(1.0f, window_border_size));
- }
- if (style.FrameBorderSize > 0 && !(flags & ImGuiWindowFlags_NoTitleBar))
- window->DrawList->AddLine(title_bar_rect.GetBL() + ImVec2(style.WindowBorderSize, -1), title_bar_rect.GetBR() + ImVec2(-style.WindowBorderSize, -1), GetColorU32(ImGuiCol_Border), style.FrameBorderSize);
+ bool render_decorations_in_parent = false;
+ if ((flags & ImGuiWindowFlags_ChildWindow) && !(flags & ImGuiWindowFlags_Popup) && !window_is_child_tooltip)
+ if (window->DrawList->CmdBuffer.back().ElemCount == 0 && parent_window->DrawList->VtxBuffer.Size > 0)
+ render_decorations_in_parent = true;
+ if (render_decorations_in_parent)
+ window->DrawList = parent_window->DrawList;
+
+ // Handle title bar, scrollbar, resize grips and resize borders
+ const ImGuiWindow* window_to_highlight = g.NavWindowingTarget ? g.NavWindowingTarget : g.NavWindow;
+ const bool title_bar_is_highlight = want_focus || (window_to_highlight && window->RootWindowForTitleBarHighlight == window_to_highlight->RootWindowForTitleBarHighlight);
+ RenderWindowDecorations(window, title_bar_rect, title_bar_is_highlight, resize_grip_count, resize_grip_col, resize_grip_draw_size);
+
+ if (render_decorations_in_parent)
+ window->DrawList = &window->DrawListInst;
}
// Draw navigation selection/windowing rectangle border
@@ -4983,48 +5783,71 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
window->DrawList->AddRect(bb.Min, bb.Max, GetColorU32(ImGuiCol_NavWindowingHighlight, g.NavWindowingHighlightAlpha), rounding, ~0, 3.0f);
}
- // Store a backup of SizeFull which we will use next frame to decide if we need scrollbars.
- window->SizeFullAtLastBegin = window->SizeFull;
-
- // Update various regions. Variables they depends on are set above in this function.
- // FIXME: window->ContentsRegionRect.Max is currently very misleading / partly faulty, but some BeginChild() patterns relies on it.
- window->ContentsRegionRect.Min.x = window->Pos.x - window->Scroll.x + window->WindowPadding.x;
- window->ContentsRegionRect.Min.y = window->Pos.y - window->Scroll.y + window->WindowPadding.y + window->TitleBarHeight() + window->MenuBarHeight();
- window->ContentsRegionRect.Max.x = window->Pos.x - window->Scroll.x - window->WindowPadding.x + (window->SizeContentsExplicit.x != 0.0f ? window->SizeContentsExplicit.x : (window->Size.x - window->ScrollbarSizes.x));
- window->ContentsRegionRect.Max.y = window->Pos.y - window->Scroll.y - window->WindowPadding.y + (window->SizeContentsExplicit.y != 0.0f ? window->SizeContentsExplicit.y : (window->Size.y - window->ScrollbarSizes.y));
+ // UPDATE RECTANGLES (2- THOSE AFFECTED BY SCROLLING)
+
+ // Work rectangle.
+ // Affected by window padding and border size. Used by:
+ // - Columns() for right-most edge
+ // - TreeNode(), CollapsingHeader() for right-most edge
+ // - BeginTabBar() for right-most edge
+ const bool allow_scrollbar_x = !(flags & ImGuiWindowFlags_NoScrollbar) && (flags & ImGuiWindowFlags_HorizontalScrollbar);
+ const bool allow_scrollbar_y = !(flags & ImGuiWindowFlags_NoScrollbar);
+ const float work_rect_size_x = (window->ContentSizeExplicit.x != 0.0f ? window->ContentSizeExplicit.x : ImMax(allow_scrollbar_x ? window->ContentSize.x : 0.0f, window->Size.x - window->WindowPadding.x * 2.0f - window->ScrollbarSizes.x));
+ const float work_rect_size_y = (window->ContentSizeExplicit.y != 0.0f ? window->ContentSizeExplicit.y : ImMax(allow_scrollbar_y ? window->ContentSize.y : 0.0f, window->Size.y - window->WindowPadding.y * 2.0f - decoration_up_height - window->ScrollbarSizes.y));
+ window->WorkRect.Min.x = ImFloor(window->InnerRect.Min.x - window->Scroll.x + ImMax(window->WindowPadding.x, window->WindowBorderSize));
+ window->WorkRect.Min.y = ImFloor(window->InnerRect.Min.y - window->Scroll.y + ImMax(window->WindowPadding.y, window->WindowBorderSize));
+ window->WorkRect.Max.x = window->WorkRect.Min.x + work_rect_size_x;
+ window->WorkRect.Max.y = window->WorkRect.Min.y + work_rect_size_y;
+
+ // [LEGACY] Content Region
+ // FIXME-OBSOLETE: window->ContentRegionRect.Max is currently very misleading / partly faulty, but some BeginChild() patterns relies on it.
+ // Used by:
+ // - Mouse wheel scrolling + many other things
+ window->ContentRegionRect.Min.x = window->Pos.x - window->Scroll.x + window->WindowPadding.x;
+ window->ContentRegionRect.Min.y = window->Pos.y - window->Scroll.y + window->WindowPadding.y + decoration_up_height;
+ window->ContentRegionRect.Max.x = window->ContentRegionRect.Min.x + (window->ContentSizeExplicit.x != 0.0f ? window->ContentSizeExplicit.x : (window->Size.x - window->WindowPadding.x * 2.0f - window->ScrollbarSizes.x));
+ window->ContentRegionRect.Max.y = window->ContentRegionRect.Min.y + (window->ContentSizeExplicit.y != 0.0f ? window->ContentSizeExplicit.y : (window->Size.y - window->WindowPadding.y * 2.0f - decoration_up_height - window->ScrollbarSizes.y));
// Setup drawing context
// (NB: That term "drawing context / DC" lost its meaning a long time ago. Initially was meant to hold transient data only. Nowadays difference between window-> and window->DC-> is dubious.)
window->DC.Indent.x = 0.0f + window->WindowPadding.x - window->Scroll.x;
window->DC.GroupOffset.x = 0.0f;
window->DC.ColumnsOffset.x = 0.0f;
- window->DC.CursorStartPos = window->Pos + ImVec2(window->DC.Indent.x + window->DC.ColumnsOffset.x, window->TitleBarHeight() + window->MenuBarHeight() + window->WindowPadding.y - window->Scroll.y);
+ window->DC.CursorStartPos = window->Pos + ImVec2(window->DC.Indent.x + window->DC.ColumnsOffset.x, decoration_up_height + window->WindowPadding.y - window->Scroll.y);
window->DC.CursorPos = window->DC.CursorStartPos;
window->DC.CursorPosPrevLine = window->DC.CursorPos;
window->DC.CursorMaxPos = window->DC.CursorStartPos;
- window->DC.CurrentLineSize = window->DC.PrevLineSize = ImVec2(0.0f, 0.0f);
- window->DC.CurrentLineTextBaseOffset = window->DC.PrevLineTextBaseOffset = 0.0f;
- window->DC.NavHideHighlightOneFrame = false;
- window->DC.NavHasScroll = (GetScrollMaxY() > 0.0f);
+ window->DC.CurrLineSize = window->DC.PrevLineSize = ImVec2(0.0f, 0.0f);
+ window->DC.CurrLineTextBaseOffset = window->DC.PrevLineTextBaseOffset = 0.0f;
+
+ window->DC.NavLayerCurrent = ImGuiNavLayer_Main;
+ window->DC.NavLayerCurrentMask = (1 << ImGuiNavLayer_Main);
window->DC.NavLayerActiveMask = window->DC.NavLayerActiveMaskNext;
window->DC.NavLayerActiveMaskNext = 0x00;
+ window->DC.NavFocusScopeIdCurrent = 0;
+ window->DC.NavHideHighlightOneFrame = false;
+ window->DC.NavHasScroll = (window->ScrollMax.y > 0.0f);
+
window->DC.MenuBarAppending = false;
- window->DC.LogLinePosY = window->DC.CursorPos.y - 9999.0f;
+ window->DC.MenuBarOffset.x = ImMax(ImMax(window->WindowPadding.x, style.ItemSpacing.x), g.NextWindowData.MenuBarOffsetMinVal.x);
+ window->DC.MenuBarOffset.y = g.NextWindowData.MenuBarOffsetMinVal.y;
+ window->DC.MenuColumns.Update(3, style.ItemSpacing.x, window_just_activated_by_user);
+ window->DC.TreeDepth = 0;
+ window->DC.TreeJumpToParentOnPopMask = 0x00;
window->DC.ChildWindows.resize(0);
+ window->DC.StateStorage = &window->StateStorage;
+ window->DC.CurrentColumns = NULL;
window->DC.LayoutType = ImGuiLayoutType_Vertical;
window->DC.ParentLayoutType = parent_window ? parent_window->DC.LayoutType : ImGuiLayoutType_Vertical;
+ window->DC.FocusCounterRegular = window->DC.FocusCounterTabStop = -1;
+
window->DC.ItemFlags = parent_window ? parent_window->DC.ItemFlags : ImGuiItemFlags_Default_;
window->DC.ItemWidth = window->ItemWidthDefault;
window->DC.TextWrapPos = -1.0f; // disabled
window->DC.ItemFlagsStack.resize(0);
window->DC.ItemWidthStack.resize(0);
window->DC.TextWrapPosStack.resize(0);
- window->DC.ColumnsSet = NULL;
- window->DC.TreeDepth = 0;
- window->DC.TreeDepthMayJumpToParentOnPop = 0x00;
- window->DC.StateStorage = &window->StateStorage;
window->DC.GroupStack.resize(0);
- window->MenuColumns.Update(3, style.ItemSpacing.x, window_just_activated_by_user);
if ((flags & ImGuiWindowFlags_ChildWindow) && (window->DC.ItemFlags != parent_window->DC.ItemFlags))
{
@@ -5046,48 +5869,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
// Title bar
if (!(flags & ImGuiWindowFlags_NoTitleBar))
- {
- // Close & collapse button are on layer 1 (same as menus) and don't default focus
- const ImGuiItemFlags item_flags_backup = window->DC.ItemFlags;
- window->DC.ItemFlags |= ImGuiItemFlags_NoNavDefaultFocus;
- window->DC.NavLayerCurrent++;
- window->DC.NavLayerCurrentMask <<= 1;
-
- // Collapse button
- if (!(flags & ImGuiWindowFlags_NoCollapse))
- if (CollapseButton(window->GetID("#COLLAPSE"), window->Pos))
- window->WantCollapseToggle = true; // Defer collapsing to next frame as we are too far in the Begin() function
-
- // Close button
- if (p_open != NULL)
- {
- const float pad = style.FramePadding.y;
- const float rad = g.FontSize * 0.5f;
- if (CloseButton(window->GetID("#CLOSE"), window->Rect().GetTR() + ImVec2(-pad - rad, pad + rad), rad + 1))
- *p_open = false;
- }
-
- window->DC.NavLayerCurrent--;
- window->DC.NavLayerCurrentMask >>= 1;
- window->DC.ItemFlags = item_flags_backup;
-
- // Title text (FIXME: refactor text alignment facilities along with RenderText helpers, this is too much code for what it does.)
- ImVec2 text_size = CalcTextSize(name, NULL, true);
- ImRect text_r = title_bar_rect;
- float pad_left = (flags & ImGuiWindowFlags_NoCollapse) ? style.FramePadding.x : (style.FramePadding.x + g.FontSize + style.ItemInnerSpacing.x);
- float pad_right = (p_open == NULL) ? style.FramePadding.x : (style.FramePadding.x + g.FontSize + style.ItemInnerSpacing.x);
- if (style.WindowTitleAlign.x > 0.0f)
- pad_right = ImLerp(pad_right, pad_left, style.WindowTitleAlign.x);
- text_r.Min.x += pad_left;
- text_r.Max.x -= pad_right;
- ImRect clip_rect = text_r;
- clip_rect.Max.x = window->Pos.x + window->Size.x - (p_open ? title_bar_rect.GetHeight() - 3 : style.FramePadding.x); // Match the size of CloseButton()
- RenderTextClipped(text_r.Min, text_r.Max, name, NULL, &text_size, style.WindowTitleAlign, &clip_rect);
- }
-
- // Save clipped aabb so we can access it in constant-time in FindHoveredWindow()
- window->OuterRectClipped = window->Rect();
- window->OuterRectClipped.ClipWith(window->ClipRect);
+ RenderWindowTitleBarContents(window, title_bar_rect, name, p_open);
// Pressing CTRL+C while holding on a window copy its content to the clipboard
// This works but 1. doesn't handle multiple Begin/End pairs, 2. recursing into another Begin/End pair - so we need to work that out and add better logging scope.
@@ -5095,29 +5877,23 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
/*
if (g.ActiveId == move_id)
if (g.IO.KeyCtrl && IsKeyPressedMap(ImGuiKey_C))
- ImGui::LogToClipboard();
+ LogToClipboard();
*/
- // Inner rectangle
- // We set this up after processing the resize grip so that our clip rectangle doesn't lag by a frame
- // Note that if our window is collapsed we will end up with an inverted (~null) clipping rectangle which is the correct behavior.
- window->InnerMainRect.Min.x = title_bar_rect.Min.x + window->WindowBorderSize;
- window->InnerMainRect.Min.y = title_bar_rect.Max.y + window->MenuBarHeight() + (((flags & ImGuiWindowFlags_MenuBar) || !(flags & ImGuiWindowFlags_NoTitleBar)) ? style.FrameBorderSize : window->WindowBorderSize);
- window->InnerMainRect.Max.x = window->Pos.x + window->Size.x - window->ScrollbarSizes.x - window->WindowBorderSize;
- window->InnerMainRect.Max.y = window->Pos.y + window->Size.y - window->ScrollbarSizes.y - window->WindowBorderSize;
- //window->DrawList->AddRect(window->InnerRect.Min, window->InnerRect.Max, IM_COL32_WHITE);
-
- // Inner clipping rectangle
- // Force round operator last to ensure that e.g. (int)(max.x-min.x) in user's render code produce correct result.
- window->InnerClipRect.Min.x = ImFloor(0.5f + window->InnerMainRect.Min.x + ImMax(0.0f, ImFloor(window->WindowPadding.x*0.5f - window->WindowBorderSize)));
- window->InnerClipRect.Min.y = ImFloor(0.5f + window->InnerMainRect.Min.y);
- window->InnerClipRect.Max.x = ImFloor(0.5f + window->InnerMainRect.Max.x - ImMax(0.0f, ImFloor(window->WindowPadding.x*0.5f - window->WindowBorderSize)));
- window->InnerClipRect.Max.y = ImFloor(0.5f + window->InnerMainRect.Max.y);
-
- // After Begin() we fill the last item / hovered data based on title bar data. It is a standard behavior (to allow creation of context menus on title bar only, etc.).
+ // We fill last item data based on Title Bar/Tab, in order for IsItemHovered() and IsItemActive() to be usable after Begin().
+ // This is useful to allow creating context menus on title bar only, etc.
window->DC.LastItemId = window->MoveId;
window->DC.LastItemStatusFlags = IsMouseHoveringRect(title_bar_rect.Min, title_bar_rect.Max, false) ? ImGuiItemStatusFlags_HoveredRect : 0;
window->DC.LastItemRect = title_bar_rect;
+#ifdef IMGUI_ENABLE_TEST_ENGINE
+ if (!(window->Flags & ImGuiWindowFlags_NoTitleBar))
+ IMGUI_TEST_ENGINE_ITEM_ADD(window->DC.LastItemRect, window->DC.LastItemId);
+#endif
+ }
+ else
+ {
+ // Append
+ SetCurrentWindow(window);
}
PushClipRect(window->InnerClipRect.Min, window->InnerClipRect.Max, true);
@@ -5127,58 +5903,60 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
window->WriteAccessed = false;
window->BeginCount++;
- g.NextWindowData.Clear();
+ g.NextWindowData.ClearFlags();
if (flags & ImGuiWindowFlags_ChildWindow)
{
// Child window can be out of sight and have "negative" clip windows.
// Mark them as collapsed so commands are skipped earlier (we can't manually collapse them because they have no title bar).
IM_ASSERT((flags & ImGuiWindowFlags_NoTitleBar) != 0);
-
if (!(flags & ImGuiWindowFlags_AlwaysAutoResize) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0)
if (window->OuterRectClipped.Min.x >= window->OuterRectClipped.Max.x || window->OuterRectClipped.Min.y >= window->OuterRectClipped.Max.y)
- window->HiddenFramesRegular = 1;
+ window->HiddenFramesCanSkipItems = 1;
- // Completely hide along with parent or if parent is collapsed
- if (parent_window && (parent_window->Collapsed || parent_window->Hidden))
- window->HiddenFramesRegular = 1;
+ // Hide along with parent or if parent is collapsed
+ if (parent_window && (parent_window->Collapsed || parent_window->HiddenFramesCanSkipItems > 0))
+ window->HiddenFramesCanSkipItems = 1;
+ if (parent_window && (parent_window->Collapsed || parent_window->HiddenFramesCannotSkipItems > 0))
+ window->HiddenFramesCannotSkipItems = 1;
}
// Don't render if style alpha is 0.0 at the time of Begin(). This is arbitrary and inconsistent but has been there for a long while (may remove at some point)
if (style.Alpha <= 0.0f)
- window->HiddenFramesRegular = 1;
+ window->HiddenFramesCanSkipItems = 1;
// Update the Hidden flag
- window->Hidden = (window->HiddenFramesRegular > 0) || (window->HiddenFramesForResize);
+ window->Hidden = (window->HiddenFramesCanSkipItems > 0) || (window->HiddenFramesCannotSkipItems > 0);
- // Return false if we don't intend to display anything to allow user to perform an early out optimization
- window->SkipItems = (window->Collapsed || !window->Active || window->Hidden) && window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0 && window->HiddenFramesForResize <= 0;
+ // Update the SkipItems flag, used to early out of all items functions (no layout required)
+ bool skip_items = false;
+ if (window->Collapsed || !window->Active || window->Hidden)
+ if (window->AutoFitFramesX <= 0 && window->AutoFitFramesY <= 0 && window->HiddenFramesCannotSkipItems <= 0)
+ skip_items = true;
+ window->SkipItems = skip_items;
- return !window->SkipItems;
+ return !skip_items;
}
-// Old Begin() API with 5 parameters, avoid calling this version directly! Use SetNextWindowSize()/SetNextWindowBgAlpha() + Begin() instead.
-#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
-bool ImGui::Begin(const char* name, bool* p_open, const ImVec2& size_first_use, float bg_alpha_override, ImGuiWindowFlags flags)
-{
- // Old API feature: we could pass the initial window size as a parameter. This was misleading because it only had an effect if the window didn't have data in the .ini file.
- if (size_first_use.x != 0.0f || size_first_use.y != 0.0f)
- ImGui::SetNextWindowSize(size_first_use, ImGuiCond_FirstUseEver);
-
- // Old API feature: override the window background alpha with a parameter.
- if (bg_alpha_override >= 0.0f)
- ImGui::SetNextWindowBgAlpha(bg_alpha_override);
-
- return ImGui::Begin(name, p_open, flags);
-}
-#endif // IMGUI_DISABLE_OBSOLETE_FUNCTIONS
-
void ImGui::End()
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
- if (window->DC.ColumnsSet != NULL)
+ // Error checking: verify that user hasn't called End() too many times!
+ if (g.CurrentWindowStack.Size <= 1 && g.WithinFrameScopeWithImplicitWindow)
+ {
+ IM_ASSERT_USER_ERROR(g.CurrentWindowStack.Size > 1, "Calling End() too many times!");
+ return;
+ }
+ IM_ASSERT(g.CurrentWindowStack.Size > 0);
+
+ // Error checking: verify that user doesn't directly call End() on a child window.
+ if (window->Flags & ImGuiWindowFlags_ChildWindow)
+ IM_ASSERT_USER_ERROR(g.WithinEndChild, "Must call EndChild() and not End()!");
+
+ // Close anything that is open
+ if (window->DC.CurrentColumns)
EndColumns();
PopClipRect(); // Inner window clip rectangle
@@ -5189,8 +5967,8 @@ void ImGui::End()
// Pop from window stack
g.CurrentWindowStack.pop_back();
if (window->Flags & ImGuiWindowFlags_Popup)
- g.CurrentPopupStack.pop_back();
- CheckStacksSize(window, false);
+ g.BeginPopupStack.pop_back();
+ ErrorCheckBeginEndCompareStacksSize(window, false);
SetCurrentWindow(g.CurrentWindowStack.empty() ? NULL : g.CurrentWindowStack.back());
}
@@ -5199,7 +5977,7 @@ void ImGui::BringWindowToFocusFront(ImGuiWindow* window)
ImGuiContext& g = *GImGui;
if (g.WindowsFocusOrder.back() == window)
return;
- for (int i = g.WindowsFocusOrder.Size - 2; i >= 0; i--) // We can ignore the front most window
+ for (int i = g.WindowsFocusOrder.Size - 2; i >= 0; i--) // We can ignore the top-most window
if (g.WindowsFocusOrder[i] == window)
{
memmove(&g.WindowsFocusOrder[i], &g.WindowsFocusOrder[i + 1], (size_t)(g.WindowsFocusOrder.Size - i - 1) * sizeof(ImGuiWindow*));
@@ -5214,7 +5992,7 @@ void ImGui::BringWindowToDisplayFront(ImGuiWindow* window)
ImGuiWindow* current_front_window = g.Windows.back();
if (current_front_window == window || current_front_window->RootWindow == window)
return;
- for (int i = g.Windows.Size - 2; i >= 0; i--) // We can ignore the front most window
+ for (int i = g.Windows.Size - 2; i >= 0; i--) // We can ignore the top-most window
if (g.Windows[i] == window)
{
memmove(&g.Windows[i], &g.Windows[i + 1], (size_t)(g.Windows.Size - i - 1) * sizeof(ImGuiWindow*));
@@ -5249,64 +6027,89 @@ void ImGui::FocusWindow(ImGuiWindow* window)
g.NavMousePosDirty = true;
g.NavInitRequest = false;
g.NavId = window ? window->NavLastIds[0] : 0; // Restore NavId
+ g.NavFocusScopeId = 0;
g.NavIdIsAlive = false;
- g.NavLayer = 0;
- //printf("[%05d] FocusWindow(\"%s\")\n", g.FrameCount, window ? window->Name : NULL);
+ g.NavLayer = ImGuiNavLayer_Main;
+ //IMGUI_DEBUG_LOG("FocusWindow(\"%s\")\n", window ? window->Name : NULL);
}
+ // Close popups if any
+ ClosePopupsOverWindow(window, false);
+
// Passing NULL allow to disable keyboard focus
if (!window)
return;
// Move the root window to the top of the pile
- if (window->RootWindow)
- window = window->RootWindow;
+ IM_ASSERT(window->RootWindow != NULL);
+ ImGuiWindow* focus_front_window = window->RootWindow; // NB: In docking branch this is window->RootWindowDockStop
+ ImGuiWindow* display_front_window = window->RootWindow;
// Steal focus on active widgets
- if (window->Flags & ImGuiWindowFlags_Popup) // FIXME: This statement should be unnecessary. Need further testing before removing it..
- if (g.ActiveId != 0 && g.ActiveIdWindow && g.ActiveIdWindow->RootWindow != window)
+ if (focus_front_window->Flags & ImGuiWindowFlags_Popup) // FIXME: This statement may be unnecessary? Need further testing before removing it..
+ if (g.ActiveId != 0 && g.ActiveIdWindow && g.ActiveIdWindow->RootWindow != focus_front_window)
ClearActiveID();
// Bring to front
- BringWindowToFocusFront(window);
- if (!(window->Flags & ImGuiWindowFlags_NoBringToFrontOnFocus))
- BringWindowToDisplayFront(window);
+ BringWindowToFocusFront(focus_front_window);
+ if (((window->Flags | display_front_window->Flags) & ImGuiWindowFlags_NoBringToFrontOnFocus) == 0)
+ BringWindowToDisplayFront(display_front_window);
}
-void ImGui::FocusPreviousWindowIgnoringOne(ImGuiWindow* ignore_window)
+void ImGui::FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window)
{
ImGuiContext& g = *GImGui;
- for (int i = g.WindowsFocusOrder.Size - 1; i >= 0; i--)
+
+ int start_idx = g.WindowsFocusOrder.Size - 1;
+ if (under_this_window != NULL)
{
+ int under_this_window_idx = FindWindowFocusIndex(under_this_window);
+ if (under_this_window_idx != -1)
+ start_idx = under_this_window_idx - 1;
+ }
+ for (int i = start_idx; i >= 0; i--)
+ {
+ // We may later decide to test for different NoXXXInputs based on the active navigation input (mouse vs nav) but that may feel more confusing to the user.
ImGuiWindow* window = g.WindowsFocusOrder[i];
if (window != ignore_window && window->WasActive && !(window->Flags & ImGuiWindowFlags_ChildWindow))
- {
- ImGuiWindow* focus_window = NavRestoreLastChildNavWindow(window);
- FocusWindow(focus_window);
- return;
- }
+ if ((window->Flags & (ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs)) != (ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs))
+ {
+ ImGuiWindow* focus_window = NavRestoreLastChildNavWindow(window);
+ FocusWindow(focus_window);
+ return;
+ }
}
+ FocusWindow(NULL);
+}
+
+void ImGui::SetNextItemWidth(float item_width)
+{
+ ImGuiContext& g = *GImGui;
+ g.NextItemData.Flags |= ImGuiNextItemDataFlags_HasWidth;
+ g.NextItemData.Width = item_width;
}
void ImGui::PushItemWidth(float item_width)
{
- ImGuiWindow* window = GetCurrentWindow();
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
window->DC.ItemWidth = (item_width == 0.0f ? window->ItemWidthDefault : item_width);
window->DC.ItemWidthStack.push_back(window->DC.ItemWidth);
+ g.NextItemData.Flags &= ~ImGuiNextItemDataFlags_HasWidth;
}
void ImGui::PushMultiItemsWidths(int components, float w_full)
{
- ImGuiWindow* window = GetCurrentWindow();
- const ImGuiStyle& style = GImGui->Style;
- if (w_full <= 0.0f)
- w_full = CalcItemWidth();
- const float w_item_one = ImMax(1.0f, (float)(int)((w_full - (style.ItemInnerSpacing.x) * (components-1)) / (float)components));
- const float w_item_last = ImMax(1.0f, (float)(int)(w_full - (w_item_one + style.ItemInnerSpacing.x) * (components-1)));
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ const ImGuiStyle& style = g.Style;
+ const float w_item_one = ImMax(1.0f, IM_FLOOR((w_full - (style.ItemInnerSpacing.x) * (components-1)) / (float)components));
+ const float w_item_last = ImMax(1.0f, IM_FLOOR(w_full - (w_item_one + style.ItemInnerSpacing.x) * (components-1)));
window->DC.ItemWidthStack.push_back(w_item_last);
for (int i = 0; i < components-1; i++)
window->DC.ItemWidthStack.push_back(w_item_one);
window->DC.ItemWidth = window->DC.ItemWidthStack.back();
+ g.NextItemData.Flags &= ~ImGuiNextItemDataFlags_HasWidth;
}
void ImGui::PopItemWidth()
@@ -5316,27 +6119,58 @@ void ImGui::PopItemWidth()
window->DC.ItemWidth = window->DC.ItemWidthStack.empty() ? window->ItemWidthDefault : window->DC.ItemWidthStack.back();
}
+// Calculate default item width given value passed to PushItemWidth() or SetNextItemWidth().
+// The SetNextItemWidth() data is generally cleared/consumed by ItemAdd() or NextItemData.ClearFlags()
float ImGui::CalcItemWidth()
{
- ImGuiWindow* window = GetCurrentWindowRead();
- float w = window->DC.ItemWidth;
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ float w;
+ if (g.NextItemData.Flags & ImGuiNextItemDataFlags_HasWidth)
+ w = g.NextItemData.Width;
+ else
+ w = window->DC.ItemWidth;
if (w < 0.0f)
{
- // Align to a right-side limit. We include 1 frame padding in the calculation because this is how the width is always used (we add 2 frame padding to it), but we could move that responsibility to the widget as well.
- float width_to_right_edge = GetContentRegionAvail().x;
- w = ImMax(1.0f, width_to_right_edge + w);
+ float region_max_x = GetContentRegionMaxAbs().x;
+ w = ImMax(1.0f, region_max_x - window->DC.CursorPos.x + w);
}
- w = (float)(int)w;
+ w = IM_FLOOR(w);
return w;
}
+// [Internal] Calculate full item size given user provided 'size' parameter and default width/height. Default width is often == CalcItemWidth().
+// Those two functions CalcItemWidth vs CalcItemSize are awkwardly named because they are not fully symmetrical.
+// Note that only CalcItemWidth() is publicly exposed.
+// The 4.0f here may be changed to match CalcItemWidth() and/or BeginChild() (right now we have a mismatch which is harmless but undesirable)
+ImVec2 ImGui::CalcItemSize(ImVec2 size, float default_w, float default_h)
+{
+ ImGuiWindow* window = GImGui->CurrentWindow;
+
+ ImVec2 region_max;
+ if (size.x < 0.0f || size.y < 0.0f)
+ region_max = GetContentRegionMaxAbs();
+
+ if (size.x == 0.0f)
+ size.x = default_w;
+ else if (size.x < 0.0f)
+ size.x = ImMax(4.0f, region_max.x - window->DC.CursorPos.x + size.x);
+
+ if (size.y == 0.0f)
+ size.y = default_h;
+ else if (size.y < 0.0f)
+ size.y = ImMax(4.0f, region_max.y - window->DC.CursorPos.y + size.y);
+
+ return size;
+}
+
void ImGui::SetCurrentFont(ImFont* font)
{
ImGuiContext& g = *GImGui;
IM_ASSERT(font && font->IsLoaded()); // Font Atlas not created. Did you call io.Fonts->GetTexDataAsRGBA32 / GetTexDataAsAlpha8 ?
IM_ASSERT(font->Scale > 0.0f);
g.Font = font;
- g.FontBaseSize = g.IO.FontGlobalScale * g.Font->FontSize * g.Font->Scale;
+ g.FontBaseSize = ImMax(1.0f, g.IO.FontGlobalScale * g.Font->FontSize * g.Font->Scale);
g.FontSize = g.CurrentWindow ? g.CurrentWindow->CalcFontSize() : 0.0f;
ImFontAtlas* atlas = g.Font->ContainerAtlas;
@@ -5458,27 +6292,29 @@ struct ImGuiStyleVarInfo
static const ImGuiStyleVarInfo GStyleVarInfo[] =
{
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, Alpha) }, // ImGuiStyleVar_Alpha
- { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowPadding) }, // ImGuiStyleVar_WindowPadding
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowRounding) }, // ImGuiStyleVar_WindowRounding
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowBorderSize) }, // ImGuiStyleVar_WindowBorderSize
- { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowMinSize) }, // ImGuiStyleVar_WindowMinSize
- { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowTitleAlign) }, // ImGuiStyleVar_WindowTitleAlign
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildRounding) }, // ImGuiStyleVar_ChildRounding
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildBorderSize) }, // ImGuiStyleVar_ChildBorderSize
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupRounding) }, // ImGuiStyleVar_PopupRounding
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupBorderSize) }, // ImGuiStyleVar_PopupBorderSize
- { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, FramePadding) }, // ImGuiStyleVar_FramePadding
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameRounding) }, // ImGuiStyleVar_FrameRounding
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameBorderSize) }, // ImGuiStyleVar_FrameBorderSize
- { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemSpacing) }, // ImGuiStyleVar_ItemSpacing
- { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemInnerSpacing) }, // ImGuiStyleVar_ItemInnerSpacing
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, IndentSpacing) }, // ImGuiStyleVar_IndentSpacing
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarSize) }, // ImGuiStyleVar_ScrollbarSize
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarRounding) }, // ImGuiStyleVar_ScrollbarRounding
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabMinSize) }, // ImGuiStyleVar_GrabMinSize
- { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabRounding) }, // ImGuiStyleVar_GrabRounding
- { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ButtonTextAlign) }, // ImGuiStyleVar_ButtonTextAlign
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, Alpha) }, // ImGuiStyleVar_Alpha
+ { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowPadding) }, // ImGuiStyleVar_WindowPadding
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowRounding) }, // ImGuiStyleVar_WindowRounding
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowBorderSize) }, // ImGuiStyleVar_WindowBorderSize
+ { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowMinSize) }, // ImGuiStyleVar_WindowMinSize
+ { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, WindowTitleAlign) }, // ImGuiStyleVar_WindowTitleAlign
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildRounding) }, // ImGuiStyleVar_ChildRounding
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ChildBorderSize) }, // ImGuiStyleVar_ChildBorderSize
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupRounding) }, // ImGuiStyleVar_PopupRounding
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, PopupBorderSize) }, // ImGuiStyleVar_PopupBorderSize
+ { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, FramePadding) }, // ImGuiStyleVar_FramePadding
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameRounding) }, // ImGuiStyleVar_FrameRounding
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, FrameBorderSize) }, // ImGuiStyleVar_FrameBorderSize
+ { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemSpacing) }, // ImGuiStyleVar_ItemSpacing
+ { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ItemInnerSpacing) }, // ImGuiStyleVar_ItemInnerSpacing
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, IndentSpacing) }, // ImGuiStyleVar_IndentSpacing
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarSize) }, // ImGuiStyleVar_ScrollbarSize
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, ScrollbarRounding) }, // ImGuiStyleVar_ScrollbarRounding
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabMinSize) }, // ImGuiStyleVar_GrabMinSize
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, GrabRounding) }, // ImGuiStyleVar_GrabRounding
+ { ImGuiDataType_Float, 1, (ImU32)IM_OFFSETOF(ImGuiStyle, TabRounding) }, // ImGuiStyleVar_TabRounding
+ { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, ButtonTextAlign) }, // ImGuiStyleVar_ButtonTextAlign
+ { ImGuiDataType_Float, 2, (ImU32)IM_OFFSETOF(ImGuiStyle, SelectableTextAlign) }, // ImGuiStyleVar_SelectableTextAlign
};
static const ImGuiStyleVarInfo* GetStyleVarInfo(ImGuiStyleVar idx)
@@ -5499,7 +6335,7 @@ void ImGui::PushStyleVar(ImGuiStyleVar idx, float val)
*pvar = val;
return;
}
- IM_ASSERT(0); // Called function with wrong-type? Variable is not a float.
+ IM_ASSERT(0 && "Called PushStyleVar() float variant but variable is not a float!");
}
void ImGui::PushStyleVar(ImGuiStyleVar idx, const ImVec2& val)
@@ -5513,7 +6349,7 @@ void ImGui::PushStyleVar(ImGuiStyleVar idx, const ImVec2& val)
*pvar = val;
return;
}
- IM_ASSERT(0); // Called function with wrong-type? Variable is not a ImVec2.
+ IM_ASSERT(0 && "Called PushStyleVar() ImVec2 variant but variable is not a ImVec2!");
}
void ImGui::PopStyleVar(int count)
@@ -5570,6 +6406,11 @@ const char* ImGui::GetStyleColorName(ImGuiCol idx)
case ImGuiCol_ResizeGrip: return "ResizeGrip";
case ImGuiCol_ResizeGripHovered: return "ResizeGripHovered";
case ImGuiCol_ResizeGripActive: return "ResizeGripActive";
+ case ImGuiCol_Tab: return "Tab";
+ case ImGuiCol_TabHovered: return "TabHovered";
+ case ImGuiCol_TabActive: return "TabActive";
+ case ImGuiCol_TabUnfocused: return "TabUnfocused";
+ case ImGuiCol_TabUnfocusedActive: return "TabUnfocusedActive";
case ImGuiCol_PlotLines: return "PlotLines";
case ImGuiCol_PlotLinesHovered: return "PlotLinesHovered";
case ImGuiCol_PlotHistogram: return "PlotHistogram";
@@ -5631,7 +6472,7 @@ bool ImGui::IsWindowHovered(ImGuiHoveredFlags flags)
}
}
- if (!IsWindowContentHoverable(g.HoveredRootWindow, flags))
+ if (!IsWindowContentHoverable(g.HoveredWindow, flags))
return false;
if (!(flags & ImGuiHoveredFlags_AllowWhenBlockedByActiveItem))
if (g.ActiveId != 0 && !g.ActiveIdAllowOverlap && g.ActiveId != g.HoveredWindow->MoveId)
@@ -5642,11 +6483,11 @@ bool ImGui::IsWindowHovered(ImGuiHoveredFlags flags)
bool ImGui::IsWindowFocused(ImGuiFocusedFlags flags)
{
ImGuiContext& g = *GImGui;
- IM_ASSERT(g.CurrentWindow); // Not inside a Begin()/End()
if (flags & ImGuiFocusedFlags_AnyWindow)
return g.NavWindow != NULL;
+ IM_ASSERT(g.CurrentWindow); // Not inside a Begin()/End()
switch (flags & (ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_ChildWindows))
{
case ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_ChildWindows:
@@ -5661,6 +6502,8 @@ bool ImGui::IsWindowFocused(ImGuiFocusedFlags flags)
}
// Can we focus this window with CTRL+TAB (or PadMenu + PadFocusPrev/PadFocusNext)
+// Note that NoNavFocus makes the window not reachable with CTRL+TAB but it can still be focused with mouse or programmaticaly.
+// If you want a window to never be focused, you may use the e.g. NoInputs flag.
bool ImGui::IsWindowNavFocusable(ImGuiWindow* window)
{
return window->Active && window == window->RootWindow && !(window->Flags & ImGuiWindowFlags_NoNavFocus);
@@ -5685,21 +6528,7 @@ ImVec2 ImGui::GetWindowPos()
return window->Pos;
}
-void ImGui::SetWindowScrollX(ImGuiWindow* window, float new_scroll_x)
-{
- window->DC.CursorMaxPos.x += window->Scroll.x; // SizeContents is generally computed based on CursorMaxPos which is affected by scroll position, so we need to apply our change to it.
- window->Scroll.x = new_scroll_x;
- window->DC.CursorMaxPos.x -= window->Scroll.x;
-}
-
-void ImGui::SetWindowScrollY(ImGuiWindow* window, float new_scroll_y)
-{
- window->DC.CursorMaxPos.y += window->Scroll.y; // SizeContents is generally computed based on CursorMaxPos which is affected by scroll position, so we need to apply our change to it.
- window->Scroll.y = new_scroll_y;
- window->DC.CursorMaxPos.y -= window->Scroll.y;
-}
-
-static void SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond)
+void ImGui::SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond)
{
// Test condition (NB: bit 0 is always true) and clear flags for next time
if (cond && (window->SetWindowPosAllowFlags & cond) == 0)
@@ -5712,8 +6541,10 @@ static void SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond)
// Set
const ImVec2 old_pos = window->Pos;
window->Pos = ImFloor(pos);
- window->DC.CursorPos += (window->Pos - old_pos); // As we happen to move the window while it is being appended to (which is a bad idea - will smear) let's at least offset the cursor
- window->DC.CursorMaxPos += (window->Pos - old_pos); // And more importantly we need to adjust this so size calculation doesn't get affected.
+ ImVec2 offset = window->Pos - old_pos;
+ window->DC.CursorPos += offset; // As we happen to move the window while it is being appended to (which is a bad idea - will smear) let's at least offset the cursor
+ window->DC.CursorMaxPos += offset; // And more importantly we need to offset CursorMaxPos/CursorStartPos this so ContentSize calculation doesn't get affected.
+ window->DC.CursorStartPos += offset;
}
void ImGui::SetWindowPos(const ImVec2& pos, ImGuiCond cond)
@@ -5734,7 +6565,7 @@ ImVec2 ImGui::GetWindowSize()
return window->Size;
}
-static void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond)
+void ImGui::SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond)
{
// Test condition (NB: bit 0 is always true) and clear flags for next time
if (cond && (window->SetWindowSizeAllowFlags & cond) == 0)
@@ -5747,7 +6578,7 @@ static void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond con
if (size.x > 0.0f)
{
window->AutoFitFramesX = 0;
- window->SizeFull.x = ImFloor(size.x);
+ window->SizeFull.x = IM_FLOOR(size.x);
}
else
{
@@ -5757,7 +6588,7 @@ static void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond con
if (size.y > 0.0f)
{
window->AutoFitFramesY = 0;
- window->SizeFull.y = ImFloor(size.y);
+ window->SizeFull.y = IM_FLOOR(size.y);
}
else
{
@@ -5777,7 +6608,7 @@ void ImGui::SetWindowSize(const char* name, const ImVec2& size, ImGuiCond cond)
SetWindowSize(window, size, cond);
}
-static void SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond)
+void ImGui::SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond)
{
// Test condition (NB: bit 0 is always true) and clear flags for next time
if (cond && (window->SetWindowCollapsedAllowFlags & cond) == 0)
@@ -5833,6 +6664,7 @@ void ImGui::SetNextWindowPos(const ImVec2& pos, ImGuiCond cond, const ImVec2& pi
{
ImGuiContext& g = *GImGui;
IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags.
+ g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasPos;
g.NextWindowData.PosVal = pos;
g.NextWindowData.PosPivotVal = pivot;
g.NextWindowData.PosCond = cond ? cond : ImGuiCond_Always;
@@ -5842,6 +6674,7 @@ void ImGui::SetNextWindowSize(const ImVec2& size, ImGuiCond cond)
{
ImGuiContext& g = *GImGui;
IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags.
+ g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasSize;
g.NextWindowData.SizeVal = size;
g.NextWindowData.SizeCond = cond ? cond : ImGuiCond_Always;
}
@@ -5849,23 +6682,26 @@ void ImGui::SetNextWindowSize(const ImVec2& size, ImGuiCond cond)
void ImGui::SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeCallback custom_callback, void* custom_callback_user_data)
{
ImGuiContext& g = *GImGui;
- g.NextWindowData.SizeConstraintCond = ImGuiCond_Always;
+ g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasSizeConstraint;
g.NextWindowData.SizeConstraintRect = ImRect(size_min, size_max);
g.NextWindowData.SizeCallback = custom_callback;
g.NextWindowData.SizeCallbackUserData = custom_callback_user_data;
}
+// Content size = inner scrollable rectangle, padded with WindowPadding.
+// SetNextWindowContentSize(ImVec2(100,100) + ImGuiWindowFlags_AlwaysAutoResize will always allow submitting a 100x100 item.
void ImGui::SetNextWindowContentSize(const ImVec2& size)
{
ImGuiContext& g = *GImGui;
- g.NextWindowData.ContentSizeVal = size; // In Begin() we will add the size of window decorations (title bar, menu etc.) to that to form a SizeContents value.
- g.NextWindowData.ContentSizeCond = ImGuiCond_Always;
+ g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasContentSize;
+ g.NextWindowData.ContentSizeVal = size;
}
void ImGui::SetNextWindowCollapsed(bool collapsed, ImGuiCond cond)
{
ImGuiContext& g = *GImGui;
IM_ASSERT(cond == 0 || ImIsPowerOfTwo(cond)); // Make sure the user doesn't attempt to combine multiple condition flags.
+ g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasCollapsed;
g.NextWindowData.CollapsedVal = collapsed;
g.NextWindowData.CollapsedCond = cond ? cond : ImGuiCond_Always;
}
@@ -5873,54 +6709,61 @@ void ImGui::SetNextWindowCollapsed(bool collapsed, ImGuiCond cond)
void ImGui::SetNextWindowFocus()
{
ImGuiContext& g = *GImGui;
- g.NextWindowData.FocusCond = ImGuiCond_Always; // Using a Cond member for consistency (may transition all of them to single flag set for fast Clear() op)
+ g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasFocus;
}
void ImGui::SetNextWindowBgAlpha(float alpha)
{
ImGuiContext& g = *GImGui;
+ g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasBgAlpha;
g.NextWindowData.BgAlphaVal = alpha;
- g.NextWindowData.BgAlphaCond = ImGuiCond_Always; // Using a Cond member for consistency (may transition all of them to single flag set for fast Clear() op)
}
-// In window space (not screen space!)
+// FIXME: This is in window space (not screen space!). We should try to obsolete all those functions.
ImVec2 ImGui::GetContentRegionMax()
{
- ImGuiWindow* window = GetCurrentWindowRead();
- ImVec2 mx = window->ContentsRegionRect.Max - window->Pos;
- if (window->DC.ColumnsSet)
- mx.x = GetColumnOffset(window->DC.ColumnsSet->Current + 1) - window->WindowPadding.x;
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ ImVec2 mx = window->ContentRegionRect.Max - window->Pos;
+ if (window->DC.CurrentColumns)
+ mx.x = window->WorkRect.Max.x - window->Pos.x;
return mx;
}
-ImVec2 ImGui::GetContentRegionAvail()
+// [Internal] Absolute coordinate. Saner. This is not exposed until we finishing refactoring work rect features.
+ImVec2 ImGui::GetContentRegionMaxAbs()
{
- ImGuiWindow* window = GetCurrentWindowRead();
- return GetContentRegionMax() - (window->DC.CursorPos - window->Pos);
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ ImVec2 mx = window->ContentRegionRect.Max;
+ if (window->DC.CurrentColumns)
+ mx.x = window->WorkRect.Max.x;
+ return mx;
}
-float ImGui::GetContentRegionAvailWidth()
+ImVec2 ImGui::GetContentRegionAvail()
{
- return GetContentRegionAvail().x;
+ ImGuiWindow* window = GImGui->CurrentWindow;
+ return GetContentRegionMaxAbs() - window->DC.CursorPos;
}
// In window space (not screen space!)
ImVec2 ImGui::GetWindowContentRegionMin()
{
- ImGuiWindow* window = GetCurrentWindowRead();
- return window->ContentsRegionRect.Min - window->Pos;
+ ImGuiWindow* window = GImGui->CurrentWindow;
+ return window->ContentRegionRect.Min - window->Pos;
}
ImVec2 ImGui::GetWindowContentRegionMax()
{
- ImGuiWindow* window = GetCurrentWindowRead();
- return window->ContentsRegionRect.Max - window->Pos;
+ ImGuiWindow* window = GImGui->CurrentWindow;
+ return window->ContentRegionRect.Max - window->Pos;
}
float ImGui::GetWindowContentRegionWidth()
{
- ImGuiWindow* window = GetCurrentWindowRead();
- return window->ContentsRegionRect.GetWidth();
+ ImGuiWindow* window = GImGui->CurrentWindow;
+ return window->ContentRegionRect.GetWidth();
}
float ImGui::GetTextLineHeight()
@@ -6029,77 +6872,43 @@ ImVec2 ImGui::GetCursorScreenPos()
return window->DC.CursorPos;
}
-void ImGui::SetCursorScreenPos(const ImVec2& screen_pos)
+void ImGui::SetCursorScreenPos(const ImVec2& pos)
{
ImGuiWindow* window = GetCurrentWindow();
- window->DC.CursorPos = screen_pos;
+ window->DC.CursorPos = pos;
window->DC.CursorMaxPos = ImMax(window->DC.CursorMaxPos, window->DC.CursorPos);
}
-float ImGui::GetScrollX()
-{
- return GImGui->CurrentWindow->Scroll.x;
-}
-
-float ImGui::GetScrollY()
-{
- return GImGui->CurrentWindow->Scroll.y;
-}
-
-float ImGui::GetScrollMaxX()
-{
- return GetWindowScrollMaxX(GImGui->CurrentWindow);
-}
-
-float ImGui::GetScrollMaxY()
-{
- return GetWindowScrollMaxY(GImGui->CurrentWindow);
-}
-
-void ImGui::SetScrollX(float scroll_x)
-{
- ImGuiWindow* window = GetCurrentWindow();
- window->ScrollTarget.x = scroll_x;
- window->ScrollTargetCenterRatio.x = 0.0f;
-}
-
-void ImGui::SetScrollY(float scroll_y)
-{
- ImGuiWindow* window = GetCurrentWindow();
- window->ScrollTarget.y = scroll_y + window->TitleBarHeight() + window->MenuBarHeight(); // title bar height canceled out when using ScrollTargetRelY
- window->ScrollTargetCenterRatio.y = 0.0f;
-}
-
-void ImGui::SetScrollFromPosY(float pos_y, float center_y_ratio)
+void ImGui::ActivateItem(ImGuiID id)
{
- // We store a target position so centering can occur on the next frame when we are guaranteed to have a known window size
- ImGuiWindow* window = GetCurrentWindow();
- IM_ASSERT(center_y_ratio >= 0.0f && center_y_ratio <= 1.0f);
- window->ScrollTarget.y = (float)(int)(pos_y + window->Scroll.y);
- window->ScrollTargetCenterRatio.y = center_y_ratio;
+ ImGuiContext& g = *GImGui;
+ g.NavNextActivateId = id;
}
-// center_y_ratio: 0.0f top of last item, 0.5f vertical center of last item, 1.0f bottom of last item.
-void ImGui::SetScrollHereY(float center_y_ratio)
+void ImGui::PushFocusScope(ImGuiID id)
{
- ImGuiWindow* window = GetCurrentWindow();
- float target_y = window->DC.CursorPosPrevLine.y - window->Pos.y; // Top of last item, in window space
- target_y += (window->DC.PrevLineSize.y * center_y_ratio) + (GImGui->Style.ItemSpacing.y * (center_y_ratio - 0.5f) * 2.0f); // Precisely aim above, in the middle or below the last line.
- SetScrollFromPosY(target_y, center_y_ratio);
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ window->IDStack.push_back(window->DC.NavFocusScopeIdCurrent);
+ window->DC.NavFocusScopeIdCurrent = id;
}
-void ImGui::ActivateItem(ImGuiID id)
+void ImGui::PopFocusScope()
{
ImGuiContext& g = *GImGui;
- g.NavNextActivateId = id;
+ ImGuiWindow* window = g.CurrentWindow;
+ window->DC.NavFocusScopeIdCurrent = window->IDStack.back();
+ window->IDStack.pop_back();
}
void ImGui::SetKeyboardFocusHere(int offset)
{
IM_ASSERT(offset >= -1); // -1 is allowed but not below
- ImGuiWindow* window = GetCurrentWindow();
- window->FocusIdxAllRequestNext = window->FocusIdxAllCounter + 1 + offset;
- window->FocusIdxTabRequestNext = INT_MAX;
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ g.FocusRequestNextWindow = window;
+ g.FocusRequestNextCounterRegular = window->DC.FocusCounterRegular + 1 + offset;
+ g.FocusRequestNextCounterTabStop = INT_MAX;
}
void ImGui::SetItemDefaultFocus()
@@ -6121,71 +6930,80 @@ void ImGui::SetItemDefaultFocus()
void ImGui::SetStateStorage(ImGuiStorage* tree)
{
- ImGuiWindow* window = GetCurrentWindow();
+ ImGuiWindow* window = GImGui->CurrentWindow;
window->DC.StateStorage = tree ? tree : &window->StateStorage;
}
ImGuiStorage* ImGui::GetStateStorage()
{
- ImGuiWindow* window = GetCurrentWindowRead();
+ ImGuiWindow* window = GImGui->CurrentWindow;
return window->DC.StateStorage;
}
void ImGui::PushID(const char* str_id)
{
- ImGuiWindow* window = GetCurrentWindowRead();
+ ImGuiWindow* window = GImGui->CurrentWindow;
window->IDStack.push_back(window->GetIDNoKeepAlive(str_id));
}
void ImGui::PushID(const char* str_id_begin, const char* str_id_end)
{
- ImGuiWindow* window = GetCurrentWindowRead();
+ ImGuiWindow* window = GImGui->CurrentWindow;
window->IDStack.push_back(window->GetIDNoKeepAlive(str_id_begin, str_id_end));
}
void ImGui::PushID(const void* ptr_id)
{
- ImGuiWindow* window = GetCurrentWindowRead();
+ ImGuiWindow* window = GImGui->CurrentWindow;
window->IDStack.push_back(window->GetIDNoKeepAlive(ptr_id));
}
void ImGui::PushID(int int_id)
{
- const void* ptr_id = (void*)(intptr_t)int_id;
- ImGuiWindow* window = GetCurrentWindowRead();
- window->IDStack.push_back(window->GetIDNoKeepAlive(ptr_id));
+ ImGuiWindow* window = GImGui->CurrentWindow;
+ window->IDStack.push_back(window->GetIDNoKeepAlive(int_id));
+}
+
+// Push a given id value ignoring the ID stack as a seed.
+void ImGui::PushOverrideID(ImGuiID id)
+{
+ ImGuiWindow* window = GImGui->CurrentWindow;
+ window->IDStack.push_back(id);
}
void ImGui::PopID()
{
- ImGuiWindow* window = GetCurrentWindowRead();
+ ImGuiWindow* window = GImGui->CurrentWindow;
window->IDStack.pop_back();
}
ImGuiID ImGui::GetID(const char* str_id)
{
- return GImGui->CurrentWindow->GetID(str_id);
+ ImGuiWindow* window = GImGui->CurrentWindow;
+ return window->GetID(str_id);
}
ImGuiID ImGui::GetID(const char* str_id_begin, const char* str_id_end)
{
- return GImGui->CurrentWindow->GetID(str_id_begin, str_id_end);
+ ImGuiWindow* window = GImGui->CurrentWindow;
+ return window->GetID(str_id_begin, str_id_end);
}
ImGuiID ImGui::GetID(const void* ptr_id)
{
- return GImGui->CurrentWindow->GetID(ptr_id);
+ ImGuiWindow* window = GImGui->CurrentWindow;
+ return window->GetID(ptr_id);
}
bool ImGui::IsRectVisible(const ImVec2& size)
{
- ImGuiWindow* window = GetCurrentWindowRead();
+ ImGuiWindow* window = GImGui->CurrentWindow;
return window->ClipRect.Overlaps(ImRect(window->DC.CursorPos, window->DC.CursorPos + size));
}
bool ImGui::IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max)
{
- ImGuiWindow* window = GetCurrentWindowRead();
+ ImGuiWindow* window = GImGui->CurrentWindow;
return window->ClipRect.Overlaps(ImRect(rect_min, rect_max));
}
@@ -6201,76 +7019,90 @@ void ImGui::BeginGroup()
group_data.BackupCursorMaxPos = window->DC.CursorMaxPos;
group_data.BackupIndent = window->DC.Indent;
group_data.BackupGroupOffset = window->DC.GroupOffset;
- group_data.BackupCurrentLineSize = window->DC.CurrentLineSize;
- group_data.BackupCurrentLineTextBaseOffset = window->DC.CurrentLineTextBaseOffset;
- group_data.BackupLogLinePosY = window->DC.LogLinePosY;
+ group_data.BackupCurrLineSize = window->DC.CurrLineSize;
+ group_data.BackupCurrLineTextBaseOffset = window->DC.CurrLineTextBaseOffset;
group_data.BackupActiveIdIsAlive = g.ActiveIdIsAlive;
group_data.BackupActiveIdPreviousFrameIsAlive = g.ActiveIdPreviousFrameIsAlive;
- group_data.AdvanceCursor = true;
+ group_data.EmitItem = true;
window->DC.GroupOffset.x = window->DC.CursorPos.x - window->Pos.x - window->DC.ColumnsOffset.x;
window->DC.Indent = window->DC.GroupOffset;
window->DC.CursorMaxPos = window->DC.CursorPos;
- window->DC.CurrentLineSize = ImVec2(0.0f, 0.0f);
- window->DC.LogLinePosY = window->DC.CursorPos.y - 9999.0f; // To enforce Log carriage return
+ window->DC.CurrLineSize = ImVec2(0.0f, 0.0f);
+ if (g.LogEnabled)
+ g.LogLinePosY = -FLT_MAX; // To enforce Log carriage return
}
void ImGui::EndGroup()
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = GetCurrentWindow();
- IM_ASSERT(!window->DC.GroupStack.empty()); // Mismatched BeginGroup()/EndGroup() calls
+ IM_ASSERT(!window->DC.GroupStack.empty()); // Mismatched BeginGroup()/EndGroup() calls
ImGuiGroupData& group_data = window->DC.GroupStack.back();
- ImRect group_bb(group_data.BackupCursorPos, window->DC.CursorMaxPos);
- group_bb.Max = ImMax(group_bb.Min, group_bb.Max);
+ ImRect group_bb(group_data.BackupCursorPos, ImMax(window->DC.CursorMaxPos, group_data.BackupCursorPos));
window->DC.CursorPos = group_data.BackupCursorPos;
window->DC.CursorMaxPos = ImMax(group_data.BackupCursorMaxPos, window->DC.CursorMaxPos);
window->DC.Indent = group_data.BackupIndent;
window->DC.GroupOffset = group_data.BackupGroupOffset;
- window->DC.CurrentLineSize = group_data.BackupCurrentLineSize;
- window->DC.CurrentLineTextBaseOffset = group_data.BackupCurrentLineTextBaseOffset;
- window->DC.LogLinePosY = window->DC.CursorPos.y - 9999.0f; // To enforce Log carriage return
+ window->DC.CurrLineSize = group_data.BackupCurrLineSize;
+ window->DC.CurrLineTextBaseOffset = group_data.BackupCurrLineTextBaseOffset;
+ if (g.LogEnabled)
+ g.LogLinePosY = -FLT_MAX; // To enforce Log carriage return
- if (group_data.AdvanceCursor)
+ if (!group_data.EmitItem)
{
- window->DC.CurrentLineTextBaseOffset = ImMax(window->DC.PrevLineTextBaseOffset, group_data.BackupCurrentLineTextBaseOffset); // FIXME: Incorrect, we should grab the base offset from the *first line* of the group but it is hard to obtain now.
- ItemSize(group_bb.GetSize(), group_data.BackupCurrentLineTextBaseOffset);
- ItemAdd(group_bb, 0);
+ window->DC.GroupStack.pop_back();
+ return;
}
+ window->DC.CurrLineTextBaseOffset = ImMax(window->DC.PrevLineTextBaseOffset, group_data.BackupCurrLineTextBaseOffset); // FIXME: Incorrect, we should grab the base offset from the *first line* of the group but it is hard to obtain now.
+ ItemSize(group_bb.GetSize());
+ ItemAdd(group_bb, 0);
+
// If the current ActiveId was declared within the boundary of our group, we copy it to LastItemId so IsItemActive(), IsItemDeactivated() etc. will be functional on the entire group.
// It would be be neater if we replaced window.DC.LastItemId by e.g. 'bool LastItemIsActive', but would put a little more burden on individual widgets.
- // (and if you grep for LastItemId you'll notice it is only used in that context.
- if ((group_data.BackupActiveIdIsAlive != g.ActiveId) && (g.ActiveIdIsAlive == g.ActiveId) && g.ActiveId) // && g.ActiveIdWindow->RootWindow == window->RootWindow)
+ // Also if you grep for LastItemId you'll notice it is only used in that context.
+ // (The tests not symmetrical because ActiveIdIsAlive is an ID itself, in order to be able to handle ActiveId being overwritten during the frame.)
+ const bool group_contains_curr_active_id = (group_data.BackupActiveIdIsAlive != g.ActiveId) && (g.ActiveIdIsAlive == g.ActiveId) && g.ActiveId;
+ const bool group_contains_prev_active_id = !group_data.BackupActiveIdPreviousFrameIsAlive && g.ActiveIdPreviousFrameIsAlive;
+ if (group_contains_curr_active_id)
window->DC.LastItemId = g.ActiveId;
- else if (!group_data.BackupActiveIdPreviousFrameIsAlive && g.ActiveIdPreviousFrameIsAlive) // && g.ActiveIdPreviousFrameWindow->RootWindow == window->RootWindow)
+ else if (group_contains_prev_active_id)
window->DC.LastItemId = g.ActiveIdPreviousFrame;
window->DC.LastItemRect = group_bb;
- window->DC.GroupStack.pop_back();
+ // Forward Edited flag
+ if (group_contains_curr_active_id && g.ActiveIdHasBeenEditedThisFrame)
+ window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_Edited;
+ // Forward Deactivated flag
+ window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_HasDeactivated;
+ if (group_contains_prev_active_id && g.ActiveId != g.ActiveIdPreviousFrame)
+ window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_Deactivated;
+
+ window->DC.GroupStack.pop_back();
//window->DrawList->AddRect(group_bb.Min, group_bb.Max, IM_COL32(255,0,255,255)); // [Debug]
}
// Gets back to previous line and continue with horizontal layout
-// pos_x == 0 : follow right after previous item
-// pos_x != 0 : align to specified x position (relative to window/group left)
-// spacing_w < 0 : use default spacing if pos_x == 0, no spacing if pos_x != 0
-// spacing_w >= 0 : enforce spacing amount
-void ImGui::SameLine(float pos_x, float spacing_w)
+// offset_from_start_x == 0 : follow right after previous item
+// offset_from_start_x != 0 : align to specified x position (relative to window/group left)
+// spacing_w < 0 : use default spacing if pos_x == 0, no spacing if pos_x != 0
+// spacing_w >= 0 : enforce spacing amount
+void ImGui::SameLine(float offset_from_start_x, float spacing_w)
{
ImGuiWindow* window = GetCurrentWindow();
if (window->SkipItems)
return;
ImGuiContext& g = *GImGui;
- if (pos_x != 0.0f)
+ if (offset_from_start_x != 0.0f)
{
if (spacing_w < 0.0f) spacing_w = 0.0f;
- window->DC.CursorPos.x = window->Pos.x - window->Scroll.x + pos_x + spacing_w + window->DC.GroupOffset.x + window->DC.ColumnsOffset.x;
+ window->DC.CursorPos.x = window->Pos.x - window->Scroll.x + offset_from_start_x + spacing_w + window->DC.GroupOffset.x + window->DC.ColumnsOffset.x;
window->DC.CursorPos.y = window->DC.CursorPosPrevLine.y;
}
else
@@ -6279,8 +7111,8 @@ void ImGui::SameLine(float pos_x, float spacing_w)
window->DC.CursorPos.x = window->DC.CursorPosPrevLine.x + spacing_w;
window->DC.CursorPos.y = window->DC.CursorPosPrevLine.y;
}
- window->DC.CurrentLineSize = window->DC.PrevLineSize;
- window->DC.CurrentLineTextBaseOffset = window->DC.PrevLineTextBaseOffset;
+ window->DC.CurrLineSize = window->DC.PrevLineSize;
+ window->DC.CurrLineTextBaseOffset = window->DC.PrevLineTextBaseOffset;
}
void ImGui::Indent(float indent_w)
@@ -6299,13 +7131,239 @@ void ImGui::Unindent(float indent_w)
window->DC.CursorPos.x = window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x;
}
+
+//-----------------------------------------------------------------------------
+// [SECTION] ERROR CHECKING
+//-----------------------------------------------------------------------------
+
+static void ImGui::ErrorCheckEndFrame()
+{
+ // Report when there is a mismatch of Begin/BeginChild vs End/EndChild calls. Important: Remember that the Begin/BeginChild API requires you
+ // to always call End/EndChild even if Begin/BeginChild returns false! (this is unfortunately inconsistent with most other Begin* API).
+ ImGuiContext& g = *GImGui;
+ if (g.CurrentWindowStack.Size != 1)
+ {
+ if (g.CurrentWindowStack.Size > 1)
+ {
+ IM_ASSERT_USER_ERROR(g.CurrentWindowStack.Size == 1, "Mismatched Begin/BeginChild vs End/EndChild calls: did you forget to call End/EndChild?");
+ while (g.CurrentWindowStack.Size > 1)
+ End();
+ }
+ else
+ {
+ IM_ASSERT_USER_ERROR(g.CurrentWindowStack.Size == 1, "Mismatched Begin/BeginChild vs End/EndChild calls: did you call End/EndChild too much?");
+ }
+ }
+
+}
+
+// Save and compare stack sizes on Begin()/End() to detect usage errors
+// Begin() calls this with write=true
+// End() calls this with write=false
+static void ImGui::ErrorCheckBeginEndCompareStacksSize(ImGuiWindow* window, bool write)
+{
+ ImGuiContext& g = *GImGui;
+ short* p = &window->DC.StackSizesBackup[0];
+
+ // Window stacks
+ // NOT checking: DC.ItemWidth, DC.AllowKeyboardFocus, DC.ButtonRepeat, DC.TextWrapPos (per window) to allow user to conveniently push once and not pop (they are cleared on Begin)
+ { int n = window->IDStack.Size; if (write) *p = (short)n; else IM_ASSERT(*p == n && "PushID/PopID or TreeNode/TreePop Mismatch!"); p++; } // Too few or too many PopID()/TreePop()
+ { int n = window->DC.GroupStack.Size; if (write) *p = (short)n; else IM_ASSERT(*p == n && "BeginGroup/EndGroup Mismatch!"); p++; } // Too few or too many EndGroup()
+
+ // Global stacks
+ // For color, style and font stacks there is an incentive to use Push/Begin/Pop/.../End patterns, so we relax our checks a little to allow them.
+ { int n = g.BeginPopupStack.Size; if (write) *p = (short)n; else IM_ASSERT(*p == n && "BeginMenu/EndMenu or BeginPopup/EndPopup Mismatch!"); p++; }// Too few or too many EndMenu()/EndPopup()
+ { int n = g.ColorModifiers.Size; if (write) *p = (short)n; else IM_ASSERT(*p >= n && "PushStyleColor/PopStyleColor Mismatch!"); p++; } // Too few or too many PopStyleColor()
+ { int n = g.StyleModifiers.Size; if (write) *p = (short)n; else IM_ASSERT(*p >= n && "PushStyleVar/PopStyleVar Mismatch!"); p++; } // Too few or too many PopStyleVar()
+ { int n = g.FontStack.Size; if (write) *p = (short)n; else IM_ASSERT(*p >= n && "PushFont/PopFont Mismatch!"); p++; } // Too few or too many PopFont()
+ IM_ASSERT(p == window->DC.StackSizesBackup + IM_ARRAYSIZE(window->DC.StackSizesBackup));
+}
+
+
+//-----------------------------------------------------------------------------
+// [SECTION] SCROLLING
+//-----------------------------------------------------------------------------
+
+static ImVec2 CalcNextScrollFromScrollTargetAndClamp(ImGuiWindow* window, bool snap_on_edges)
+{
+ ImGuiContext& g = *GImGui;
+ ImVec2 scroll = window->Scroll;
+ if (window->ScrollTarget.x < FLT_MAX)
+ {
+ float cr_x = window->ScrollTargetCenterRatio.x;
+ float target_x = window->ScrollTarget.x;
+ if (snap_on_edges && cr_x <= 0.0f && target_x <= window->WindowPadding.x)
+ target_x = 0.0f;
+ else if (snap_on_edges && cr_x >= 1.0f && target_x >= window->ContentSize.x + window->WindowPadding.x + g.Style.ItemSpacing.x)
+ target_x = window->ContentSize.x + window->WindowPadding.x * 2.0f;
+ scroll.x = target_x - cr_x * (window->SizeFull.x - window->ScrollbarSizes.x);
+ }
+ if (window->ScrollTarget.y < FLT_MAX)
+ {
+ // 'snap_on_edges' allows for a discontinuity at the edge of scrolling limits to take account of WindowPadding so that scrolling to make the last item visible scroll far enough to see the padding.
+ float decoration_up_height = window->TitleBarHeight() + window->MenuBarHeight();
+ float cr_y = window->ScrollTargetCenterRatio.y;
+ float target_y = window->ScrollTarget.y;
+ if (snap_on_edges && cr_y <= 0.0f && target_y <= window->WindowPadding.y)
+ target_y = 0.0f;
+ if (snap_on_edges && cr_y >= 1.0f && target_y >= window->ContentSize.y + window->WindowPadding.y + g.Style.ItemSpacing.y)
+ target_y = window->ContentSize.y + window->WindowPadding.y * 2.0f;
+ scroll.y = target_y - cr_y * (window->SizeFull.y - window->ScrollbarSizes.y - decoration_up_height);
+ }
+ scroll = ImMax(scroll, ImVec2(0.0f, 0.0f));
+ if (!window->Collapsed && !window->SkipItems)
+ {
+ scroll.x = ImMin(scroll.x, window->ScrollMax.x);
+ scroll.y = ImMin(scroll.y, window->ScrollMax.y);
+ }
+ return scroll;
+}
+
+// Scroll to keep newly navigated item fully into view
+ImVec2 ImGui::ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& item_rect)
+{
+ ImGuiContext& g = *GImGui;
+ ImRect window_rect(window->InnerRect.Min - ImVec2(1, 1), window->InnerRect.Max + ImVec2(1, 1));
+ //GetForegroundDrawList(window)->AddRect(window_rect.Min, window_rect.Max, IM_COL32_WHITE); // [DEBUG]
+
+ ImVec2 delta_scroll;
+ if (!window_rect.Contains(item_rect))
+ {
+ if (window->ScrollbarX && item_rect.Min.x < window_rect.Min.x)
+ SetScrollFromPosX(window, item_rect.Min.x - window->Pos.x + g.Style.ItemSpacing.x, 0.0f);
+ else if (window->ScrollbarX && item_rect.Max.x >= window_rect.Max.x)
+ SetScrollFromPosX(window, item_rect.Max.x - window->Pos.x + g.Style.ItemSpacing.x, 1.0f);
+ if (item_rect.Min.y < window_rect.Min.y)
+ SetScrollFromPosY(window, item_rect.Min.y - window->Pos.y - g.Style.ItemSpacing.y, 0.0f);
+ else if (item_rect.Max.y >= window_rect.Max.y)
+ SetScrollFromPosY(window, item_rect.Max.y - window->Pos.y + g.Style.ItemSpacing.y, 1.0f);
+
+ ImVec2 next_scroll = CalcNextScrollFromScrollTargetAndClamp(window, false);
+ delta_scroll = next_scroll - window->Scroll;
+ }
+
+ // Also scroll parent window to keep us into view if necessary
+ if (window->Flags & ImGuiWindowFlags_ChildWindow)
+ delta_scroll += ScrollToBringRectIntoView(window->ParentWindow, ImRect(item_rect.Min - delta_scroll, item_rect.Max - delta_scroll));
+
+ return delta_scroll;
+}
+
+float ImGui::GetScrollX()
+{
+ ImGuiWindow* window = GImGui->CurrentWindow;
+ return window->Scroll.x;
+}
+
+float ImGui::GetScrollY()
+{
+ ImGuiWindow* window = GImGui->CurrentWindow;
+ return window->Scroll.y;
+}
+
+float ImGui::GetScrollMaxX()
+{
+ ImGuiWindow* window = GImGui->CurrentWindow;
+ return window->ScrollMax.x;
+}
+
+float ImGui::GetScrollMaxY()
+{
+ ImGuiWindow* window = GImGui->CurrentWindow;
+ return window->ScrollMax.y;
+}
+
+void ImGui::SetScrollX(float scroll_x)
+{
+ ImGuiWindow* window = GetCurrentWindow();
+ window->ScrollTarget.x = scroll_x;
+ window->ScrollTargetCenterRatio.x = 0.0f;
+}
+
+void ImGui::SetScrollY(float scroll_y)
+{
+ ImGuiWindow* window = GetCurrentWindow();
+ window->ScrollTarget.y = scroll_y;
+ window->ScrollTargetCenterRatio.y = 0.0f;
+}
+
+void ImGui::SetScrollX(ImGuiWindow* window, float new_scroll_x)
+{
+ window->ScrollTarget.x = new_scroll_x;
+ window->ScrollTargetCenterRatio.x = 0.0f;
+}
+
+void ImGui::SetScrollY(ImGuiWindow* window, float new_scroll_y)
+{
+ window->ScrollTarget.y = new_scroll_y;
+ window->ScrollTargetCenterRatio.y = 0.0f;
+}
+
+
+void ImGui::SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio)
+{
+ // We store a target position so centering can occur on the next frame when we are guaranteed to have a known window size
+ IM_ASSERT(center_x_ratio >= 0.0f && center_x_ratio <= 1.0f);
+ window->ScrollTarget.x = IM_FLOOR(local_x + window->Scroll.x);
+ window->ScrollTargetCenterRatio.x = center_x_ratio;
+}
+
+void ImGui::SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio)
+{
+ // We store a target position so centering can occur on the next frame when we are guaranteed to have a known window size
+ IM_ASSERT(center_y_ratio >= 0.0f && center_y_ratio <= 1.0f);
+ const float decoration_up_height = window->TitleBarHeight() + window->MenuBarHeight();
+ local_y -= decoration_up_height;
+ window->ScrollTarget.y = IM_FLOOR(local_y + window->Scroll.y);
+ window->ScrollTargetCenterRatio.y = center_y_ratio;
+}
+
+void ImGui::SetScrollFromPosX(float local_x, float center_x_ratio)
+{
+ ImGuiContext& g = *GImGui;
+ SetScrollFromPosX(g.CurrentWindow, local_x, center_x_ratio);
+}
+
+void ImGui::SetScrollFromPosY(float local_y, float center_y_ratio)
+{
+ ImGuiContext& g = *GImGui;
+ SetScrollFromPosY(g.CurrentWindow, local_y, center_y_ratio);
+}
+
+// center_x_ratio: 0.0f left of last item, 0.5f horizontal center of last item, 1.0f right of last item.
+void ImGui::SetScrollHereX(float center_x_ratio)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ float target_x = window->DC.LastItemRect.Min.x - window->Pos.x; // Left of last item, in window space
+ float last_item_width = window->DC.LastItemRect.GetWidth();
+ target_x += (last_item_width * center_x_ratio) + (g.Style.ItemSpacing.x * (center_x_ratio - 0.5f) * 2.0f); // Precisely aim before, in the middle or after the last item.
+ SetScrollFromPosX(target_x, center_x_ratio);
+}
+
+// center_y_ratio: 0.0f top of last item, 0.5f vertical center of last item, 1.0f bottom of last item.
+void ImGui::SetScrollHereY(float center_y_ratio)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ float target_y = window->DC.CursorPosPrevLine.y - window->Pos.y; // Top of last item, in window space
+ target_y += (window->DC.PrevLineSize.y * center_y_ratio) + (g.Style.ItemSpacing.y * (center_y_ratio - 0.5f) * 2.0f); // Precisely aim above, in the middle or below the last line.
+ SetScrollFromPosY(target_y, center_y_ratio);
+}
+
//-----------------------------------------------------------------------------
// [SECTION] TOOLTIPS
//-----------------------------------------------------------------------------
void ImGui::BeginTooltip()
{
+ BeginTooltipEx(ImGuiWindowFlags_None, ImGuiTooltipFlags_None);
+}
+
+void ImGui::BeginTooltipEx(ImGuiWindowFlags extra_flags, ImGuiTooltipFlags tooltip_flags)
+{
ImGuiContext& g = *GImGui;
+
if (g.DragDropWithinSourceOrTarget)
{
// The default tooltip position is a little offset to give space to see the context menu (it's also clamped within the current viewport/monitor)
@@ -6316,27 +7374,18 @@ void ImGui::BeginTooltip()
SetNextWindowPos(tooltip_pos);
SetNextWindowBgAlpha(g.Style.Colors[ImGuiCol_PopupBg].w * 0.60f);
//PushStyleVar(ImGuiStyleVar_Alpha, g.Style.Alpha * 0.60f); // This would be nice but e.g ColorButton with checkboard has issue with transparent colors :(
- BeginTooltipEx(0, true);
- }
- else
- {
- BeginTooltipEx(0, false);
+ tooltip_flags |= ImGuiTooltipFlags_OverridePreviousTooltip;
}
-}
-// Not exposed publicly as BeginTooltip() because bool parameters are evil. Let's see if other needs arise first.
-void ImGui::BeginTooltipEx(ImGuiWindowFlags extra_flags, bool override_previous_tooltip)
-{
- ImGuiContext& g = *GImGui;
char window_name[16];
ImFormatString(window_name, IM_ARRAYSIZE(window_name), "##Tooltip_%02d", g.TooltipOverrideCount);
- if (override_previous_tooltip)
+ if (tooltip_flags & ImGuiTooltipFlags_OverridePreviousTooltip)
if (ImGuiWindow* window = FindWindowByName(window_name))
if (window->Active)
{
// Hide previous tooltip from being displayed. We can't easily "reset" the content of a window so we create a new one.
window->Hidden = true;
- window->HiddenFramesRegular = 1;
+ window->HiddenFramesCanSkipItems = 1;
ImFormatString(window_name, IM_ARRAYSIZE(window_name), "##Tooltip_%02d", ++g.TooltipOverrideCount);
}
ImGuiWindowFlags flags = ImGuiWindowFlags_Tooltip|ImGuiWindowFlags_NoInputs|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoMove|ImGuiWindowFlags_NoResize|ImGuiWindowFlags_NoSavedSettings|ImGuiWindowFlags_AlwaysAutoResize;
@@ -6351,11 +7400,7 @@ void ImGui::EndTooltip()
void ImGui::SetTooltipV(const char* fmt, va_list args)
{
- ImGuiContext& g = *GImGui;
- if (g.DragDropWithinSourceOrTarget)
- BeginTooltip();
- else
- BeginTooltipEx(0, true);
+ BeginTooltipEx(0, ImGuiTooltipFlags_OverridePreviousTooltip);
TextV(fmt, args);
EndTooltip();
}
@@ -6375,16 +7420,16 @@ void ImGui::SetTooltip(const char* fmt, ...)
bool ImGui::IsPopupOpen(ImGuiID id)
{
ImGuiContext& g = *GImGui;
- return g.OpenPopupStack.Size > g.CurrentPopupStack.Size && g.OpenPopupStack[g.CurrentPopupStack.Size].PopupId == id;
+ return g.OpenPopupStack.Size > g.BeginPopupStack.Size && g.OpenPopupStack[g.BeginPopupStack.Size].PopupId == id;
}
bool ImGui::IsPopupOpen(const char* str_id)
{
ImGuiContext& g = *GImGui;
- return g.OpenPopupStack.Size > g.CurrentPopupStack.Size && g.OpenPopupStack[g.CurrentPopupStack.Size].PopupId == g.CurrentWindow->GetID(str_id);
+ return g.OpenPopupStack.Size > g.BeginPopupStack.Size && g.OpenPopupStack[g.BeginPopupStack.Size].PopupId == g.CurrentWindow->GetID(str_id);
}
-ImGuiWindow* ImGui::GetFrontMostPopupModal()
+ImGuiWindow* ImGui::GetTopMostPopupModal()
{
ImGuiContext& g = *GImGui;
for (int n = g.OpenPopupStack.Size-1; n >= 0; n--)
@@ -6408,17 +7453,17 @@ void ImGui::OpenPopupEx(ImGuiID id)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* parent_window = g.CurrentWindow;
- int current_stack_size = g.CurrentPopupStack.Size;
- ImGuiPopupRef popup_ref; // Tagged as new ref as Window will be set back to NULL if we write this into OpenPopupStack.
+ int current_stack_size = g.BeginPopupStack.Size;
+ ImGuiPopupData popup_ref; // Tagged as new ref as Window will be set back to NULL if we write this into OpenPopupStack.
popup_ref.PopupId = id;
popup_ref.Window = NULL;
- popup_ref.ParentWindow = parent_window;
+ popup_ref.SourceWindow = g.NavWindow;
popup_ref.OpenFrameCount = g.FrameCount;
popup_ref.OpenParentId = parent_window->IDStack.back();
- popup_ref.OpenMousePos = g.IO.MousePos;
popup_ref.OpenPopupPos = NavCalcPreferredRefPos();
+ popup_ref.OpenMousePos = IsMousePosValid(&g.IO.MousePos) ? g.IO.MousePos : popup_ref.OpenPopupPos;
- //printf("[%05d] OpenPopupEx(0x%08X)\n", g.FrameCount, id);
+ //IMGUI_DEBUG_LOG("OpenPopupEx(0x%08X)\n", g.FrameCount, id);
if (g.OpenPopupStack.Size < current_stack_size + 1)
{
g.OpenPopupStack.push_back(popup_ref);
@@ -6446,20 +7491,7 @@ void ImGui::OpenPopupEx(ImGuiID id)
}
}
-bool ImGui::OpenPopupOnItemClick(const char* str_id, int mouse_button)
-{
- ImGuiWindow* window = GImGui->CurrentWindow;
- if (IsMouseReleased(mouse_button) && IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup))
- {
- ImGuiID id = str_id ? window->GetID(str_id) : window->DC.LastItemId; // If user hasn't passed an ID, we can use the LastItemID. Using LastItemID as a Popup ID won't conflict!
- IM_ASSERT(id != 0); // You cannot pass a NULL str_id if the last item has no identifier (e.g. a Text() item)
- OpenPopupEx(id);
- return true;
- }
- return false;
-}
-
-void ImGui::ClosePopupsOverWindow(ImGuiWindow* ref_window)
+void ImGui::ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup)
{
ImGuiContext& g = *GImGui;
if (g.OpenPopupStack.empty())
@@ -6467,78 +7499,108 @@ void ImGui::ClosePopupsOverWindow(ImGuiWindow* ref_window)
// When popups are stacked, clicking on a lower level popups puts focus back to it and close popups above it.
// Don't close our own child popup windows.
- int n = 0;
+ int popup_count_to_keep = 0;
if (ref_window)
{
- for (n = 0; n < g.OpenPopupStack.Size; n++)
+ // Find the highest popup which is a descendant of the reference window (generally reference window = NavWindow)
+ for (; popup_count_to_keep < g.OpenPopupStack.Size; popup_count_to_keep++)
{
- ImGuiPopupRef& popup = g.OpenPopupStack[n];
+ ImGuiPopupData& popup = g.OpenPopupStack[popup_count_to_keep];
if (!popup.Window)
continue;
IM_ASSERT((popup.Window->Flags & ImGuiWindowFlags_Popup) != 0);
if (popup.Window->Flags & ImGuiWindowFlags_ChildWindow)
continue;
- // Trim the stack if popups are not direct descendant of the reference window (which is often the NavWindow)
- bool has_focus = false;
- for (int m = n; m < g.OpenPopupStack.Size && !has_focus; m++)
- has_focus = (g.OpenPopupStack[m].Window && g.OpenPopupStack[m].Window->RootWindow == ref_window->RootWindow);
- if (!has_focus)
+ // Trim the stack when popups are not direct descendant of the reference window (the reference window is often the NavWindow)
+ bool popup_or_descendent_is_ref_window = false;
+ for (int m = popup_count_to_keep; m < g.OpenPopupStack.Size && !popup_or_descendent_is_ref_window; m++)
+ if (ImGuiWindow* popup_window = g.OpenPopupStack[m].Window)
+ if (popup_window->RootWindow == ref_window->RootWindow)
+ popup_or_descendent_is_ref_window = true;
+ if (!popup_or_descendent_is_ref_window)
break;
}
}
- if (n < g.OpenPopupStack.Size) // This test is not required but it allows to set a convenient breakpoint on the block below
- ClosePopupToLevel(n);
+ if (popup_count_to_keep < g.OpenPopupStack.Size) // This test is not required but it allows to set a convenient breakpoint on the statement below
+ {
+ //IMGUI_DEBUG_LOG("ClosePopupsOverWindow(%s) -> ClosePopupToLevel(%d)\n", ref_window->Name, popup_count_to_keep);
+ ClosePopupToLevel(popup_count_to_keep, restore_focus_to_window_under_popup);
+ }
}
-void ImGui::ClosePopupToLevel(int remaining)
+void ImGui::ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup)
{
- IM_ASSERT(remaining >= 0);
ImGuiContext& g = *GImGui;
- ImGuiWindow* focus_window = (remaining > 0) ? g.OpenPopupStack[remaining-1].Window : g.OpenPopupStack[0].ParentWindow;
- if (g.NavLayer == 0)
- focus_window = NavRestoreLastChildNavWindow(focus_window);
- FocusWindow(focus_window);
- focus_window->DC.NavHideHighlightOneFrame = true;
+ IM_ASSERT(remaining >= 0 && remaining < g.OpenPopupStack.Size);
+ ImGuiWindow* focus_window = g.OpenPopupStack[remaining].SourceWindow;
+ ImGuiWindow* popup_window = g.OpenPopupStack[remaining].Window;
g.OpenPopupStack.resize(remaining);
-}
-void ImGui::ClosePopup(ImGuiID id)
-{
- if (!IsPopupOpen(id))
- return;
- ImGuiContext& g = *GImGui;
- ClosePopupToLevel(g.OpenPopupStack.Size - 1);
+ if (restore_focus_to_window_under_popup)
+ {
+ if (focus_window && !focus_window->WasActive && popup_window)
+ {
+ // Fallback
+ FocusTopMostWindowUnderOne(popup_window, NULL);
+ }
+ else
+ {
+ if (g.NavLayer == 0 && focus_window)
+ focus_window = NavRestoreLastChildNavWindow(focus_window);
+ FocusWindow(focus_window);
+ }
+ }
}
// Close the popup we have begin-ed into.
void ImGui::CloseCurrentPopup()
{
ImGuiContext& g = *GImGui;
- int popup_idx = g.CurrentPopupStack.Size - 1;
- if (popup_idx < 0 || popup_idx >= g.OpenPopupStack.Size || g.CurrentPopupStack[popup_idx].PopupId != g.OpenPopupStack[popup_idx].PopupId)
+ int popup_idx = g.BeginPopupStack.Size - 1;
+ if (popup_idx < 0 || popup_idx >= g.OpenPopupStack.Size || g.BeginPopupStack[popup_idx].PopupId != g.OpenPopupStack[popup_idx].PopupId)
return;
- while (popup_idx > 0 && g.OpenPopupStack[popup_idx].Window && (g.OpenPopupStack[popup_idx].Window->Flags & ImGuiWindowFlags_ChildMenu))
+
+ // Closing a menu closes its top-most parent popup (unless a modal)
+ while (popup_idx > 0)
+ {
+ ImGuiWindow* popup_window = g.OpenPopupStack[popup_idx].Window;
+ ImGuiWindow* parent_popup_window = g.OpenPopupStack[popup_idx - 1].Window;
+ bool close_parent = false;
+ if (popup_window && (popup_window->Flags & ImGuiWindowFlags_ChildMenu))
+ if (parent_popup_window == NULL || !(parent_popup_window->Flags & ImGuiWindowFlags_Modal))
+ close_parent = true;
+ if (!close_parent)
+ break;
popup_idx--;
- ClosePopupToLevel(popup_idx);
+ }
+ //IMGUI_DEBUG_LOG("CloseCurrentPopup %d -> %d\n", g.BeginPopupStack.Size - 1, popup_idx);
+ ClosePopupToLevel(popup_idx, true);
+
+ // A common pattern is to close a popup when selecting a menu item/selectable that will open another window.
+ // To improve this usage pattern, we avoid nav highlight for a single frame in the parent window.
+ // Similarly, we could avoid mouse hover highlight in this window but it is less visually problematic.
+ if (ImGuiWindow* window = g.NavWindow)
+ window->DC.NavHideHighlightOneFrame = true;
}
-bool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags)
+bool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags flags)
{
ImGuiContext& g = *GImGui;
if (!IsPopupOpen(id))
{
- g.NextWindowData.Clear(); // We behave like Begin() and need to consume those values
+ g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values
return false;
}
char name[20];
- if (extra_flags & ImGuiWindowFlags_ChildMenu)
- ImFormatString(name, IM_ARRAYSIZE(name), "##Menu_%02d", g.CurrentPopupStack.Size); // Recycle windows based on depth
+ if (flags & ImGuiWindowFlags_ChildMenu)
+ ImFormatString(name, IM_ARRAYSIZE(name), "##Menu_%02d", g.BeginPopupStack.Size); // Recycle windows based on depth
else
ImFormatString(name, IM_ARRAYSIZE(name), "##Popup_%08x", id); // Not recycling, so we can close/open during the same frame
- bool is_open = Begin(name, NULL, extra_flags | ImGuiWindowFlags_Popup);
+ flags |= ImGuiWindowFlags_Popup;
+ bool is_open = Begin(name, NULL, flags);
if (!is_open) // NB: Begin can return false when the popup is completely clipped (e.g. zero size display)
EndPopup();
@@ -6548,14 +7610,17 @@ bool ImGui::BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags)
bool ImGui::BeginPopup(const char* str_id, ImGuiWindowFlags flags)
{
ImGuiContext& g = *GImGui;
- if (g.OpenPopupStack.Size <= g.CurrentPopupStack.Size) // Early out for performance
+ if (g.OpenPopupStack.Size <= g.BeginPopupStack.Size) // Early out for performance
{
- g.NextWindowData.Clear(); // We behave like Begin() and need to consume those values
+ g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values
return false;
}
- return BeginPopupEx(g.CurrentWindow->GetID(str_id), flags|ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoSavedSettings);
+ flags |= ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoSavedSettings;
+ return BeginPopupEx(g.CurrentWindow->GetID(str_id), flags);
}
+// If 'p_open' is specified for a modal popup window, the popup will have a regular close button which will close the popup.
+// Note that popup visibility status is owned by Dear ImGui (and manipulated with e.g. OpenPopup) so the actual value of *p_open is meaningless here.
bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags flags)
{
ImGuiContext& g = *GImGui;
@@ -6563,21 +7628,22 @@ bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags fla
const ImGuiID id = window->GetID(name);
if (!IsPopupOpen(id))
{
- g.NextWindowData.Clear(); // We behave like Begin() and need to consume those values
+ g.NextWindowData.ClearFlags(); // We behave like Begin() and need to consume those values
return false;
}
// Center modal windows by default
// FIXME: Should test for (PosCond & window->SetWindowPosAllowFlags) with the upcoming window.
- if (g.NextWindowData.PosCond == 0)
+ if ((g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasPos) == 0)
SetNextWindowPos(g.IO.DisplaySize * 0.5f, ImGuiCond_Appearing, ImVec2(0.5f, 0.5f));
- bool is_open = Begin(name, p_open, flags | ImGuiWindowFlags_Popup | ImGuiWindowFlags_Modal | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoSavedSettings);
+ flags |= ImGuiWindowFlags_Popup | ImGuiWindowFlags_Modal | ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoSavedSettings;
+ const bool is_open = Begin(name, p_open, flags);
if (!is_open || (p_open && !*p_open)) // NB: is_open can be 'false' when the popup is completely clipped (e.g. zero size display)
{
EndPopup();
if (is_open)
- ClosePopup(id);
+ ClosePopupToLevel(g.BeginPopupStack.Size, true);
return false;
}
return is_open;
@@ -6585,22 +7651,43 @@ bool ImGui::BeginPopupModal(const char* name, bool* p_open, ImGuiWindowFlags fla
void ImGui::EndPopup()
{
- ImGuiContext& g = *GImGui; (void)g;
- IM_ASSERT(g.CurrentWindow->Flags & ImGuiWindowFlags_Popup); // Mismatched BeginPopup()/EndPopup() calls
- IM_ASSERT(g.CurrentPopupStack.Size > 0);
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ IM_ASSERT(window->Flags & ImGuiWindowFlags_Popup); // Mismatched BeginPopup()/EndPopup() calls
+ IM_ASSERT(g.BeginPopupStack.Size > 0);
// Make all menus and popups wrap around for now, may need to expose that policy.
- NavMoveRequestTryWrapping(g.CurrentWindow, ImGuiNavMoveFlags_LoopY);
+ NavMoveRequestTryWrapping(window, ImGuiNavMoveFlags_LoopY);
+ // Child-popups don't need to be layed out
+ IM_ASSERT(g.WithinEndChild == false);
+ if (window->Flags & ImGuiWindowFlags_ChildWindow)
+ g.WithinEndChild = true;
End();
+ g.WithinEndChild = false;
+}
+
+bool ImGui::OpenPopupOnItemClick(const char* str_id, ImGuiMouseButton mouse_button)
+{
+ ImGuiWindow* window = GImGui->CurrentWindow;
+ if (IsMouseReleased(mouse_button) && IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup))
+ {
+ ImGuiID id = str_id ? window->GetID(str_id) : window->DC.LastItemId; // If user hasn't passed an ID, we can use the LastItemID. Using LastItemID as a Popup ID won't conflict!
+ IM_ASSERT(id != 0); // You cannot pass a NULL str_id if the last item has no identifier (e.g. a Text() item)
+ OpenPopupEx(id);
+ return true;
+ }
+ return false;
}
// This is a helper to handle the simplest case of associating one named popup to one given widget.
// You may want to handle this on user side if you have specific needs (e.g. tweaking IsItemHovered() parameters).
// You can pass a NULL str_id to use the identifier of the last item.
-bool ImGui::BeginPopupContextItem(const char* str_id, int mouse_button)
+bool ImGui::BeginPopupContextItem(const char* str_id, ImGuiMouseButton mouse_button)
{
ImGuiWindow* window = GImGui->CurrentWindow;
+ if (window->SkipItems)
+ return false;
ImGuiID id = str_id ? window->GetID(str_id) : window->DC.LastItemId; // If user hasn't passed an ID, we can use the LastItemID. Using LastItemID as a Popup ID won't conflict!
IM_ASSERT(id != 0); // You cannot pass a NULL str_id if the last item has no identifier (e.g. a Text() item)
if (IsMouseReleased(mouse_button) && IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup))
@@ -6608,7 +7695,7 @@ bool ImGui::BeginPopupContextItem(const char* str_id, int mouse_button)
return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoSavedSettings);
}
-bool ImGui::BeginPopupContextWindow(const char* str_id, int mouse_button, bool also_over_items)
+bool ImGui::BeginPopupContextWindow(const char* str_id, ImGuiMouseButton mouse_button, bool also_over_items)
{
if (!str_id)
str_id = "window_context";
@@ -6619,7 +7706,7 @@ bool ImGui::BeginPopupContextWindow(const char* str_id, int mouse_button, bool a
return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoSavedSettings);
}
-bool ImGui::BeginPopupContextVoid(const char* str_id, int mouse_button)
+bool ImGui::BeginPopupContextVoid(const char* str_id, ImGuiMouseButton mouse_button)
{
if (!str_id)
str_id = "void_context";
@@ -6629,21 +7716,13 @@ bool ImGui::BeginPopupContextVoid(const char* str_id, int mouse_button)
return BeginPopupEx(id, ImGuiWindowFlags_AlwaysAutoResize|ImGuiWindowFlags_NoTitleBar|ImGuiWindowFlags_NoSavedSettings);
}
-ImRect ImGui::GetWindowAllowedExtentRect(ImGuiWindow*)
-{
- ImVec2 padding = GImGui->Style.DisplaySafeAreaPadding;
- ImRect r_screen = GetViewportRect();
- r_screen.Expand(ImVec2((r_screen.GetWidth() > padding.x * 2) ? -padding.x : 0.0f, (r_screen.GetHeight() > padding.y * 2) ? -padding.y : 0.0f));
- return r_screen;
-}
-
// r_avoid = the rectangle to avoid (e.g. for tooltip it is a rectangle around the mouse cursor which we want to avoid. for popups it's a small point around the cursor.)
// r_outer = the visible area rectangle, minus safe area padding. If our popup size won't fit because of safe area padding we ignore it.
ImVec2 ImGui::FindBestWindowPosForPopupEx(const ImVec2& ref_pos, const ImVec2& size, ImGuiDir* last_dir, const ImRect& r_outer, const ImRect& r_avoid, ImGuiPopupPositionPolicy policy)
{
ImVec2 base_pos_clamped = ImClamp(ref_pos, r_outer.Min, r_outer.Max - size);
- //GImGui->OverlayDrawList.AddRect(r_avoid.Min, r_avoid.Max, IM_COL32(255,0,0,255));
- //GImGui->OverlayDrawList.AddRect(r_outer.Min, r_outer.Max, IM_COL32(0,255,0,255));
+ //GetForegroundDrawList()->AddRect(r_avoid.Min, r_avoid.Max, IM_COL32(255,0,0,255));
+ //GetForegroundDrawList()->AddRect(r_outer.Min, r_outer.Max, IM_COL32(0,255,0,255));
// Combo Box policy (we want a connecting edge)
if (policy == ImGuiPopupPositionPolicy_ComboBox)
@@ -6692,6 +7771,15 @@ ImVec2 ImGui::FindBestWindowPosForPopupEx(const ImVec2& ref_pos, const ImVec2& s
return pos;
}
+ImRect ImGui::GetWindowAllowedExtentRect(ImGuiWindow* window)
+{
+ IM_UNUSED(window);
+ ImVec2 padding = GImGui->Style.DisplaySafeAreaPadding;
+ ImRect r_screen = GetViewportRect();
+ r_screen.Expand(ImVec2((r_screen.GetWidth() > padding.x * 2) ? -padding.x : 0.0f, (r_screen.GetHeight() > padding.y * 2) ? -padding.y : 0.0f));
+ return r_screen;
+}
+
ImVec2 ImGui::FindBestWindowPosForPopup(ImGuiWindow* window)
{
ImGuiContext& g = *GImGui;
@@ -6699,11 +7787,11 @@ ImVec2 ImGui::FindBestWindowPosForPopup(ImGuiWindow* window)
ImRect r_outer = GetWindowAllowedExtentRect(window);
if (window->Flags & ImGuiWindowFlags_ChildMenu)
{
- // Child menus typically request _any_ position within the parent menu item, and then our FindBestWindowPosForPopup() function will move the new menu outside the parent bounds.
+ // Child menus typically request _any_ position within the parent menu item, and then we move the new menu outside the parent bounds.
// This is how we end up with child menus appearing (most-commonly) on the right of the parent menu.
IM_ASSERT(g.CurrentWindow == window);
ImGuiWindow* parent_window = g.CurrentWindowStack[g.CurrentWindowStack.Size - 2];
- float horizontal_overlap = g.Style.ItemSpacing.x; // We want some overlap to convey the relative depth of each menu (currently the amount of overlap is hard-coded to style.ItemSpacing.x).
+ float horizontal_overlap = g.Style.ItemInnerSpacing.x; // We want some overlap to convey the relative depth of each menu (currently the amount of overlap is hard-coded to style.ItemSpacing.x).
ImRect r_avoid;
if (parent_window->DC.MenuBarAppending)
r_avoid = ImRect(-FLT_MAX, parent_window->Pos.y + parent_window->TitleBarHeight(), FLT_MAX, parent_window->Pos.y + parent_window->TitleBarHeight() + parent_window->MenuBarHeight());
@@ -6735,10 +7823,57 @@ ImVec2 ImGui::FindBestWindowPosForPopup(ImGuiWindow* window)
return window->Pos;
}
+
//-----------------------------------------------------------------------------
// [SECTION] KEYBOARD/GAMEPAD NAVIGATION
//-----------------------------------------------------------------------------
+// FIXME-NAV: The existence of SetNavID vs SetNavIDWithRectRel vs SetFocusID is incredibly messy and confusing,
+// and needs some explanation or serious refactoring.
+void ImGui::SetNavID(ImGuiID id, int nav_layer, ImGuiID focus_scope_id)
+{
+ ImGuiContext& g = *GImGui;
+ IM_ASSERT(g.NavWindow);
+ IM_ASSERT(nav_layer == 0 || nav_layer == 1);
+ g.NavId = id;
+ g.NavFocusScopeId = focus_scope_id;
+ g.NavWindow->NavLastIds[nav_layer] = id;
+}
+
+void ImGui::SetNavIDWithRectRel(ImGuiID id, int nav_layer, ImGuiID focus_scope_id, const ImRect& rect_rel)
+{
+ ImGuiContext& g = *GImGui;
+ SetNavID(id, nav_layer, focus_scope_id);
+ g.NavWindow->NavRectRel[nav_layer] = rect_rel;
+ g.NavMousePosDirty = true;
+ g.NavDisableHighlight = false;
+ g.NavDisableMouseHover = true;
+}
+
+void ImGui::SetFocusID(ImGuiID id, ImGuiWindow* window)
+{
+ ImGuiContext& g = *GImGui;
+ IM_ASSERT(id != 0);
+
+ // Assume that SetFocusID() is called in the context where its window->DC.NavLayerCurrent and window->DC.NavFocusScopeIdCurrent are valid.
+ // Note that window may be != g.CurrentWindow (e.g. SetFocusID call in InputTextEx for multi-line text)
+ const ImGuiNavLayer nav_layer = window->DC.NavLayerCurrent;
+ if (g.NavWindow != window)
+ g.NavInitRequest = false;
+ g.NavWindow = window;
+ g.NavId = id;
+ g.NavLayer = nav_layer;
+ g.NavFocusScopeId = window->DC.NavFocusScopeIdCurrent;
+ window->NavLastIds[nav_layer] = id;
+ if (window->DC.LastItemId == id)
+ window->NavRectRel[nav_layer] = ImRect(window->DC.LastItemRect.Min - window->Pos, window->DC.LastItemRect.Max - window->Pos);
+
+ if (g.ActiveIdSource == ImGuiInputSource_Nav)
+ g.NavDisableMouseHover = true;
+ else
+ g.NavDisableHighlight = true;
+}
+
ImGuiDir ImGetDirQuadrantFromDelta(float dx, float dy)
{
if (ImFabs(dx) > ImFabs(dy))
@@ -6770,7 +7905,7 @@ static void inline NavClampRectToVisibleAreaForMoveDir(ImGuiDir move_dir, ImRect
}
// Scoring function for directional navigation. Based on https://gist.github.com/rygorous/6981057
-static bool NavScoreItem(ImGuiNavMoveResult* result, ImRect cand)
+static bool ImGui::NavScoreItem(ImGuiNavMoveResult* result, ImRect cand)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
@@ -6784,7 +7919,7 @@ static bool NavScoreItem(ImGuiNavMoveResult* result, ImRect cand)
if (window->ParentWindow == g.NavWindow)
{
IM_ASSERT((window->Flags | g.NavWindow->Flags) & ImGuiWindowFlags_NavFlattened);
- if (!window->ClipRect.Contains(cand))
+ if (!window->ClipRect.Overlaps(cand))
return false;
cand.ClipWithFull(window->ClipRect); // This allows the scored item to not overlap other candidates in the parent window
}
@@ -6833,13 +7968,13 @@ static bool NavScoreItem(ImGuiNavMoveResult* result, ImRect cand)
#if IMGUI_DEBUG_NAV_SCORING
char buf[128];
- if (ImGui::IsMouseHoveringRect(cand.Min, cand.Max))
+ if (IsMouseHoveringRect(cand.Min, cand.Max))
{
ImFormatString(buf, IM_ARRAYSIZE(buf), "dbox (%.2f,%.2f->%.4f)\ndcen (%.2f,%.2f->%.4f)\nd (%.2f,%.2f->%.4f)\nnav %c, quadrant %c", dbx, dby, dist_box, dcx, dcy, dist_center, dax, day, dist_axial, "WENS"[g.NavMoveDir], "WENS"[quadrant]);
- ImDrawList* draw_list = ImGui::GetOverlayDrawList();
+ ImDrawList* draw_list = GetForegroundDrawList(window);
draw_list->AddRect(curr.Min, curr.Max, IM_COL32(255,200,0,100));
draw_list->AddRect(cand.Min, cand.Max, IM_COL32(255,255,0,200));
- draw_list->AddRectFilled(cand.Max-ImVec2(4,4), cand.Max+ImGui::CalcTextSize(buf)+ImVec2(4,4), IM_COL32(40,0,0,150));
+ draw_list->AddRectFilled(cand.Max - ImVec2(4,4), cand.Max + CalcTextSize(buf) + ImVec2(4,4), IM_COL32(40,0,0,150));
draw_list->AddText(g.IO.FontDefault, 13.0f, cand.Max, ~0U, buf);
}
else if (g.IO.KeyCtrl) // Hold to preview score in matching quadrant. Press C to rotate.
@@ -6848,7 +7983,7 @@ static bool NavScoreItem(ImGuiNavMoveResult* result, ImRect cand)
if (quadrant == g.NavMoveDir)
{
ImFormatString(buf, IM_ARRAYSIZE(buf), "%.0f/%.0f", dist_box, dist_center);
- ImDrawList* draw_list = ImGui::GetOverlayDrawList();
+ ImDrawList* draw_list = GetForegroundDrawList(window);
draw_list->AddRectFilled(cand.Min, cand.Max, IM_COL32(255, 0, 0, 200));
draw_list->AddText(g.IO.FontDefault, 13.0f, cand.Min, IM_COL32(255, 255, 255, 255), buf);
}
@@ -6929,7 +8064,7 @@ static void ImGui::NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, con
// Process Move Request (scoring for navigation)
// FIXME-NAV: Consider policy for double scoring (scoring from NavScoringRectScreen + scoring from a rect wrapped according to current wrapping policy)
- if ((g.NavId != id || (g.NavMoveRequestFlags & ImGuiNavMoveFlags_AllowCurrentNavId)) && !(item_flags & ImGuiItemFlags_NoNav))
+ if ((g.NavId != id || (g.NavMoveRequestFlags & ImGuiNavMoveFlags_AllowCurrentNavId)) && !(item_flags & (ImGuiItemFlags_Disabled|ImGuiItemFlags_NoNav)))
{
ImGuiNavMoveResult* result = (window == g.NavWindow) ? &g.NavMoveResultLocal : &g.NavMoveResultOther;
#if IMGUI_DEBUG_NAV_SCORING
@@ -6942,19 +8077,22 @@ static void ImGui::NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, con
#endif
if (new_best)
{
- result->ID = id;
result->Window = window;
+ result->ID = id;
+ result->FocusScopeId = window->DC.NavFocusScopeIdCurrent;
result->RectRel = nav_bb_rel;
}
+ // Features like PageUp/PageDown need to maintain a separate score for the visible set of items.
const float VISIBLE_RATIO = 0.70f;
if ((g.NavMoveRequestFlags & ImGuiNavMoveFlags_AlsoScoreVisibleSet) && window->ClipRect.Overlaps(nav_bb))
if (ImClamp(nav_bb.Max.y, window->ClipRect.Min.y, window->ClipRect.Max.y) - ImClamp(nav_bb.Min.y, window->ClipRect.Min.y, window->ClipRect.Max.y) >= (nav_bb.Max.y - nav_bb.Min.y) * VISIBLE_RATIO)
if (NavScoreItem(&g.NavMoveResultLocalVisibleSet, nav_bb))
{
result = &g.NavMoveResultLocalVisibleSet;
- result->ID = id;
result->Window = window;
+ result->ID = id;
+ result->FocusScopeId = window->DC.NavFocusScopeIdCurrent;
result->RectRel = nav_bb_rel;
}
}
@@ -6964,8 +8102,9 @@ static void ImGui::NavProcessItem(ImGuiWindow* window, const ImRect& nav_bb, con
{
g.NavWindow = window; // Always refresh g.NavWindow, because some operations such as FocusItem() don't have a window.
g.NavLayer = window->DC.NavLayerCurrent;
+ g.NavFocusScopeId = window->DC.NavFocusScopeIdCurrent;
g.NavIdIsAlive = true;
- g.NavIdTabCounter = window->FocusIdxTabCounter;
+ g.NavIdTabCounter = window->DC.FocusCounterTabStop;
window->NavRectRel[window->DC.NavLayerCurrent] = nav_bb_rel; // Store item bounding box (relative to window position)
}
}
@@ -6987,7 +8126,7 @@ void ImGui::NavMoveRequestForward(ImGuiDir move_dir, ImGuiDir clip_dir, const Im
{
ImGuiContext& g = *GImGui;
IM_ASSERT(g.NavMoveRequestForward == ImGuiNavForward_None);
- ImGui::NavMoveRequestCancel();
+ NavMoveRequestCancel();
g.NavMoveDir = move_dir;
g.NavMoveClipDir = clip_dir;
g.NavMoveRequestForward = ImGuiNavForward_ForwardQueued;
@@ -7006,7 +8145,7 @@ void ImGui::NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags mov
ImGuiDir clip_dir = g.NavMoveDir;
if (g.NavMoveDir == ImGuiDir_Left && (move_flags & (ImGuiNavMoveFlags_WrapX | ImGuiNavMoveFlags_LoopX)))
{
- bb_rel.Min.x = bb_rel.Max.x = ImMax(window->SizeFull.x, window->SizeContents.x) - window->Scroll.x;
+ bb_rel.Min.x = bb_rel.Max.x = ImMax(window->SizeFull.x, window->ContentSize.x + window->WindowPadding.x * 2.0f) - window->Scroll.x;
if (move_flags & ImGuiNavMoveFlags_WrapX) { bb_rel.TranslateY(-bb_rel.GetHeight()); clip_dir = ImGuiDir_Up; }
NavMoveRequestForward(g.NavMoveDir, clip_dir, bb_rel, move_flags);
}
@@ -7018,7 +8157,7 @@ void ImGui::NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags mov
}
if (g.NavMoveDir == ImGuiDir_Up && (move_flags & (ImGuiNavMoveFlags_WrapY | ImGuiNavMoveFlags_LoopY)))
{
- bb_rel.Min.y = bb_rel.Max.y = ImMax(window->SizeFull.y, window->SizeContents.y) - window->Scroll.y;
+ bb_rel.Min.y = bb_rel.Max.y = ImMax(window->SizeFull.y, window->ContentSize.y + window->WindowPadding.y * 2.0f) - window->Scroll.y;
if (move_flags & ImGuiNavMoveFlags_WrapY) { bb_rel.TranslateX(-bb_rel.GetWidth()); clip_dir = ImGuiDir_Left; }
NavMoveRequestForward(g.NavMoveDir, clip_dir, bb_rel, move_flags);
}
@@ -7030,7 +8169,9 @@ void ImGui::NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags mov
}
}
-static void ImGui::NavSaveLastChildNavWindow(ImGuiWindow* nav_window)
+// FIXME: This could be replaced by updating a frame number in each window when (window == NavWindow) and (NavLayer == 0).
+// This way we could find the last focused window among our children. It would be much less confusing this way?
+static void ImGui::NavSaveLastChildNavWindowIntoParent(ImGuiWindow* nav_window)
{
ImGuiWindow* parent_window = nav_window;
while (parent_window && (parent_window->Flags & ImGuiWindowFlags_ChildWindow) != 0 && (parent_window->Flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_ChildMenu)) == 0)
@@ -7039,22 +8180,24 @@ static void ImGui::NavSaveLastChildNavWindow(ImGuiWindow* nav_window)
parent_window->NavLastChildNavWindow = nav_window;
}
-// Call when we are expected to land on Layer 0 after FocusWindow()
+// Restore the last focused child.
+// Call when we are expected to land on the Main Layer (0) after FocusWindow()
static ImGuiWindow* ImGui::NavRestoreLastChildNavWindow(ImGuiWindow* window)
{
return window->NavLastChildNavWindow ? window->NavLastChildNavWindow : window;
}
-static void NavRestoreLayer(int layer)
+static void NavRestoreLayer(ImGuiNavLayer layer)
{
ImGuiContext& g = *GImGui;
g.NavLayer = layer;
if (layer == 0)
g.NavWindow = ImGui::NavRestoreLastChildNavWindow(g.NavWindow);
- if (layer == 0 && g.NavWindow->NavLastIds[0] != 0)
- ImGui::SetNavIDWithRectRel(g.NavWindow->NavLastIds[0], layer, g.NavWindow->NavRectRel[0]);
+ ImGuiWindow* window = g.NavWindow;
+ if (layer == 0 && window->NavLastIds[0] != 0)
+ ImGui::SetNavIDWithRectRel(window->NavLastIds[0], layer, 0, window->NavRectRel[0]);
else
- ImGui::NavInitWindow(g.NavWindow, true);
+ ImGui::NavInitWindow(window, true);
}
static inline void ImGui::NavUpdateAnyRequestFlag()
@@ -7074,9 +8217,10 @@ void ImGui::NavInitWindow(ImGuiWindow* window, bool force_reinit)
if (!(window->Flags & ImGuiWindowFlags_NoNavInputs))
if (!(window->Flags & ImGuiWindowFlags_ChildWindow) || (window->Flags & ImGuiWindowFlags_Popup) || (window->NavLastIds[0] == 0) || force_reinit)
init_for_nav = true;
+ //IMGUI_DEBUG_LOG("[Nav] NavInitWindow() init_for_nav=%d, window=\"%s\", layer=%d\n", init_for_nav, window->Name, g.NavLayer);
if (init_for_nav)
{
- SetNavID(0, g.NavLayer);
+ SetNavID(0, g.NavLayer, 0);
g.NavInitRequest = true;
g.NavInitRequestFromMove = false;
g.NavInitResultId = 0;
@@ -7086,6 +8230,7 @@ void ImGui::NavInitWindow(ImGuiWindow* window, bool force_reinit)
else
{
g.NavId = window->NavLastIds[0];
+ g.NavFocusScopeId = 0;
}
}
@@ -7093,13 +8238,20 @@ static ImVec2 ImGui::NavCalcPreferredRefPos()
{
ImGuiContext& g = *GImGui;
if (g.NavDisableHighlight || !g.NavDisableMouseHover || !g.NavWindow)
- return ImFloor(g.IO.MousePos);
-
- // When navigation is active and mouse is disabled, decide on an arbitrary position around the bottom left of the currently navigated item
- const ImRect& rect_rel = g.NavWindow->NavRectRel[g.NavLayer];
- ImVec2 pos = g.NavWindow->Pos + ImVec2(rect_rel.Min.x + ImMin(g.Style.FramePadding.x*4, rect_rel.GetWidth()), rect_rel.Max.y - ImMin(g.Style.FramePadding.y, rect_rel.GetHeight()));
- ImRect visible_rect = GetViewportRect();
- return ImFloor(ImClamp(pos, visible_rect.Min, visible_rect.Max)); // ImFloor() is important because non-integer mouse position application in back-end might be lossy and result in undesirable non-zero delta.
+ {
+ // Mouse (we need a fallback in case the mouse becomes invalid after being used)
+ if (IsMousePosValid(&g.IO.MousePos))
+ return g.IO.MousePos;
+ return g.LastValidMousePos;
+ }
+ else
+ {
+ // When navigation is active and mouse is disabled, decide on an arbitrary position around the bottom left of the currently navigated item.
+ const ImRect& rect_rel = g.NavWindow->NavRectRel[g.NavLayer];
+ ImVec2 pos = g.NavWindow->Pos + ImVec2(rect_rel.Min.x + ImMin(g.Style.FramePadding.x * 4, rect_rel.GetWidth()), rect_rel.Max.y - ImMin(g.Style.FramePadding.y, rect_rel.GetHeight()));
+ ImRect visible_rect = GetViewportRect();
+ return ImFloor(ImClamp(pos, visible_rect.Min, visible_rect.Max)); // ImFloor() is important because non-integer mouse position application in back-end might be lossy and result in undesirable non-zero delta.
+ }
}
float ImGui::GetNavInputAmount(ImGuiNavInput n, ImGuiInputReadMode mode)
@@ -7116,11 +8268,11 @@ float ImGui::GetNavInputAmount(ImGuiNavInput n, ImGuiInputReadMode mode)
if (mode == ImGuiInputReadMode_Pressed) // Return 1.0f when just pressed, no repeat, ignore analog input.
return (t == 0.0f) ? 1.0f : 0.0f;
if (mode == ImGuiInputReadMode_Repeat)
- return (float)CalcTypematicPressedRepeatAmount(t, t - g.IO.DeltaTime, g.IO.KeyRepeatDelay * 0.80f, g.IO.KeyRepeatRate * 0.80f);
+ return (float)CalcTypematicRepeatAmount(t - g.IO.DeltaTime, t, g.IO.KeyRepeatDelay * 0.72f, g.IO.KeyRepeatRate * 0.80f);
if (mode == ImGuiInputReadMode_RepeatSlow)
- return (float)CalcTypematicPressedRepeatAmount(t, t - g.IO.DeltaTime, g.IO.KeyRepeatDelay * 1.00f, g.IO.KeyRepeatRate * 2.00f);
+ return (float)CalcTypematicRepeatAmount(t - g.IO.DeltaTime, t, g.IO.KeyRepeatDelay * 1.25f, g.IO.KeyRepeatRate * 2.00f);
if (mode == ImGuiInputReadMode_RepeatFast)
- return (float)CalcTypematicPressedRepeatAmount(t, t - g.IO.DeltaTime, g.IO.KeyRepeatDelay * 0.80f, g.IO.KeyRepeatRate * 0.30f);
+ return (float)CalcTypematicRepeatAmount(t - g.IO.DeltaTime, t, g.IO.KeyRepeatDelay * 0.72f, g.IO.KeyRepeatRate * 0.30f);
return 0.0f;
}
@@ -7140,47 +8292,16 @@ ImVec2 ImGui::GetNavInputAmount2d(ImGuiNavDirSourceFlags dir_sources, ImGuiInput
return delta;
}
-// Scroll to keep newly navigated item fully into view
-// NB: We modify rect_rel by the amount we scrolled for, so it is immediately updated.
-static void NavScrollToBringItemIntoView(ImGuiWindow* window, const ImRect& item_rect)
-{
- ImRect window_rect(window->InnerMainRect.Min - ImVec2(1, 1), window->InnerMainRect.Max + ImVec2(1, 1));
- //g.OverlayDrawList.AddRect(window_rect.Min, window_rect.Max, IM_COL32_WHITE); // [DEBUG]
- if (window_rect.Contains(item_rect))
- return;
-
- ImGuiContext& g = *GImGui;
- if (window->ScrollbarX && item_rect.Min.x < window_rect.Min.x)
- {
- window->ScrollTarget.x = item_rect.Min.x - window->Pos.x + window->Scroll.x - g.Style.ItemSpacing.x;
- window->ScrollTargetCenterRatio.x = 0.0f;
- }
- else if (window->ScrollbarX && item_rect.Max.x >= window_rect.Max.x)
- {
- window->ScrollTarget.x = item_rect.Max.x - window->Pos.x + window->Scroll.x + g.Style.ItemSpacing.x;
- window->ScrollTargetCenterRatio.x = 1.0f;
- }
- if (item_rect.Min.y < window_rect.Min.y)
- {
- window->ScrollTarget.y = item_rect.Min.y - window->Pos.y + window->Scroll.y - g.Style.ItemSpacing.y;
- window->ScrollTargetCenterRatio.y = 0.0f;
- }
- else if (item_rect.Max.y >= window_rect.Max.y)
- {
- window->ScrollTarget.y = item_rect.Max.y - window->Pos.y + window->Scroll.y + g.Style.ItemSpacing.y;
- window->ScrollTargetCenterRatio.y = 1.0f;
- }
-}
-
static void ImGui::NavUpdate()
{
ImGuiContext& g = *GImGui;
g.IO.WantSetMousePos = false;
#if 0
- if (g.NavScoringCount > 0) printf("[%05d] NavScoringCount %d for '%s' layer %d (Init:%d, Move:%d)\n", g.FrameCount, g.NavScoringCount, g.NavWindow ? g.NavWindow->Name : "NULL", g.NavLayer, g.NavInitRequest || g.NavInitResultId != 0, g.NavMoveRequest);
+ if (g.NavScoringCount > 0) IMGUI_DEBUG_LOG("NavScoringCount %d for '%s' layer %d (Init:%d, Move:%d)\n", g.FrameCount, g.NavScoringCount, g.NavWindow ? g.NavWindow->Name : "NULL", g.NavLayer, g.NavInitRequest || g.NavInitResultId != 0, g.NavMoveRequest);
#endif
- // Set input source as Gamepad when buttons are pressed before we map Keyboard (some features differs when used with Gamepad vs Keyboard)
+ // Set input source as Gamepad when buttons are pressed (as some features differs when used with Gamepad vs Keyboard)
+ // (do it before we map Keyboard input!)
bool nav_keyboard_active = (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) != 0;
bool nav_gamepad_active = (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) != 0 && (g.IO.BackendFlags & ImGuiBackendFlags_HasGamepad) != 0;
if (nav_gamepad_active)
@@ -7190,7 +8311,7 @@ static void ImGui::NavUpdate()
// Update Keyboard->Nav inputs mapping
if (nav_keyboard_active)
{
- #define NAV_MAP_KEY(_KEY, _NAV_INPUT) if (IsKeyDown(g.IO.KeyMap[_KEY])) { g.IO.NavInputs[_NAV_INPUT] = 1.0f; g.NavInputSource = ImGuiInputSource_NavKeyboard; }
+ #define NAV_MAP_KEY(_KEY, _NAV_INPUT) do { if (IsKeyDown(g.IO.KeyMap[_KEY])) { g.IO.NavInputs[_NAV_INPUT] = 1.0f; g.NavInputSource = ImGuiInputSource_NavKeyboard; } } while (0)
NAV_MAP_KEY(ImGuiKey_Space, ImGuiNavInput_Activate );
NAV_MAP_KEY(ImGuiKey_Enter, ImGuiNavInput_Input );
NAV_MAP_KEY(ImGuiKey_Escape, ImGuiNavInput_Cancel );
@@ -7198,9 +8319,12 @@ static void ImGui::NavUpdate()
NAV_MAP_KEY(ImGuiKey_RightArrow,ImGuiNavInput_KeyRight_);
NAV_MAP_KEY(ImGuiKey_UpArrow, ImGuiNavInput_KeyUp_ );
NAV_MAP_KEY(ImGuiKey_DownArrow, ImGuiNavInput_KeyDown_ );
- if (g.IO.KeyCtrl) g.IO.NavInputs[ImGuiNavInput_TweakSlow] = 1.0f;
- if (g.IO.KeyShift) g.IO.NavInputs[ImGuiNavInput_TweakFast] = 1.0f;
- if (g.IO.KeyAlt) g.IO.NavInputs[ImGuiNavInput_KeyMenu_] = 1.0f;
+ if (g.IO.KeyCtrl)
+ g.IO.NavInputs[ImGuiNavInput_TweakSlow] = 1.0f;
+ if (g.IO.KeyShift)
+ g.IO.NavInputs[ImGuiNavInput_TweakFast] = 1.0f;
+ if (g.IO.KeyAlt && !g.IO.KeyCtrl) // AltGR is Alt+Ctrl, also even on keyboards without AltGR we don't want Alt+Ctrl to open menu.
+ g.IO.NavInputs[ImGuiNavInput_KeyMenu_] = 1.0f;
#undef NAV_MAP_KEY
}
memcpy(g.IO.NavInputsDownDurationPrev, g.IO.NavInputsDownDuration, sizeof(g.IO.NavInputsDownDuration));
@@ -7208,14 +8332,15 @@ static void ImGui::NavUpdate()
g.IO.NavInputsDownDuration[i] = (g.IO.NavInputs[i] > 0.0f) ? (g.IO.NavInputsDownDuration[i] < 0.0f ? 0.0f : g.IO.NavInputsDownDuration[i] + g.IO.DeltaTime) : -1.0f;
// Process navigation init request (select first/default focus)
- if (g.NavInitResultId != 0 && (!g.NavDisableHighlight || g.NavInitRequestFromMove))
+ // In very rare cases g.NavWindow may be null (e.g. clearing focus after requesting an init request, which does happen when releasing Alt while clicking on void)
+ if (g.NavInitResultId != 0 && (!g.NavDisableHighlight || g.NavInitRequestFromMove) && g.NavWindow)
{
// Apply result from previous navigation init request (will typically select the first item, unless SetItemDefaultFocus() has been called)
- IM_ASSERT(g.NavWindow);
+ //IMGUI_DEBUG_LOG("[Nav] Apply NavInitRequest result: 0x%08X Layer %d in \"%s\"\n", g.NavInitResultId, g.NavLayer, g.NavWindow->Name);
if (g.NavInitRequestFromMove)
- SetNavIDWithRectRel(g.NavInitResultId, g.NavLayer, g.NavInitResultRectRel);
+ SetNavIDWithRectRel(g.NavInitResultId, g.NavLayer, 0, g.NavInitResultRectRel);
else
- SetNavID(g.NavInitResultId, g.NavLayer);
+ SetNavID(g.NavInitResultId, g.NavLayer, 0);
g.NavWindow->NavRectRel[g.NavLayer] = g.NavInitResultRectRel;
}
g.NavInitRequest = false;
@@ -7224,7 +8349,7 @@ static void ImGui::NavUpdate()
g.NavJustMovedToId = 0;
// Process navigation move request
- if (g.NavMoveRequest && (g.NavMoveResultLocal.ID != 0 || g.NavMoveResultOther.ID != 0))
+ if (g.NavMoveRequest)
NavUpdateMoveResult();
// When a forwarded move request failed, we restore the highlight that we disabled during the forward frame
@@ -7256,7 +8381,7 @@ static void ImGui::NavUpdate()
// Store our return window (for returning from Layer 1 to Layer 0) and clear it as soon as we step back in our own Layer 0
if (g.NavWindow)
- NavSaveLastChildNavWindow(g.NavWindow);
+ NavSaveLastChildNavWindowIntoParent(g.NavWindow);
if (g.NavWindow && g.NavWindow->NavLastChildNavWindow != NULL && g.NavLayer == 0)
g.NavWindow->NavLastChildNavWindow = NULL;
@@ -7265,14 +8390,15 @@ static void ImGui::NavUpdate()
// Set output flags for user application
g.IO.NavActive = (nav_keyboard_active || nav_gamepad_active) && g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs);
- g.IO.NavVisible = (g.IO.NavActive && g.NavId != 0 && !g.NavDisableHighlight) || (g.NavWindowingTarget != NULL) || g.NavInitRequest;
+ g.IO.NavVisible = (g.IO.NavActive && g.NavId != 0 && !g.NavDisableHighlight) || (g.NavWindowingTarget != NULL);
// Process NavCancel input (to close a popup, get back to parent, clear focus)
- if (IsNavInputPressed(ImGuiNavInput_Cancel, ImGuiInputReadMode_Pressed))
+ if (IsNavInputTest(ImGuiNavInput_Cancel, ImGuiInputReadMode_Pressed))
{
if (g.ActiveId != 0)
{
- ClearActiveID();
+ if (!IsActiveIdUsingNavInput(ImGuiNavInput_Cancel))
+ ClearActiveID();
}
else if (g.NavWindow && (g.NavWindow->Flags & ImGuiWindowFlags_ChildWindow) && !(g.NavWindow->Flags & ImGuiWindowFlags_Popup) && g.NavWindow->ParentWindow)
{
@@ -7281,8 +8407,9 @@ static void ImGui::NavUpdate()
ImGuiWindow* parent_window = g.NavWindow->ParentWindow;
IM_ASSERT(child_window->ChildId != 0);
FocusWindow(parent_window);
- SetNavID(child_window->ChildId, 0);
- g.NavIdIsAlive = false;
+ SetNavID(child_window->ChildId, 0, 0);
+ // Reassigning with same value, we're being explicit here.
+ g.NavIdIsAlive = false; // -V1048
if (g.NavDisableMouseHover)
g.NavMousePosDirty = true;
}
@@ -7290,19 +8417,19 @@ static void ImGui::NavUpdate()
{
// Close open popup/menu
if (!(g.OpenPopupStack.back().Window->Flags & ImGuiWindowFlags_Modal))
- ClosePopupToLevel(g.OpenPopupStack.Size - 1);
+ ClosePopupToLevel(g.OpenPopupStack.Size - 1, true);
}
else if (g.NavLayer != 0)
{
// Leave the "menu" layer
- NavRestoreLayer(0);
+ NavRestoreLayer(ImGuiNavLayer_Main);
}
else
{
// Clear NavLastId for popups but keep it for regular child window so we can leave one and come back where we were
if (g.NavWindow && ((g.NavWindow->Flags & ImGuiWindowFlags_Popup) || !(g.NavWindow->Flags & ImGuiWindowFlags_ChildWindow)))
g.NavWindow->NavLastIds[0] = 0;
- g.NavId = 0;
+ g.NavId = g.NavFocusScopeId = 0;
}
}
@@ -7311,14 +8438,14 @@ static void ImGui::NavUpdate()
if (g.NavId != 0 && !g.NavDisableHighlight && !g.NavWindowingTarget && g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs))
{
bool activate_down = IsNavInputDown(ImGuiNavInput_Activate);
- bool activate_pressed = activate_down && IsNavInputPressed(ImGuiNavInput_Activate, ImGuiInputReadMode_Pressed);
+ bool activate_pressed = activate_down && IsNavInputTest(ImGuiNavInput_Activate, ImGuiInputReadMode_Pressed);
if (g.ActiveId == 0 && activate_pressed)
g.NavActivateId = g.NavId;
if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && activate_down)
g.NavActivateDownId = g.NavId;
if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && activate_pressed)
g.NavActivatePressedId = g.NavId;
- if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && IsNavInputPressed(ImGuiNavInput_Input, ImGuiInputReadMode_Pressed))
+ if ((g.ActiveId == 0 || g.ActiveId == g.NavId) && IsNavInputTest(ImGuiNavInput_Input, ImGuiInputReadMode_Pressed))
g.NavInputId = g.NavId;
}
if (g.NavWindow && (g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs))
@@ -7333,17 +8460,17 @@ static void ImGui::NavUpdate()
g.NavNextActivateId = 0;
// Initiate directional inputs request
- const int allowed_dir_flags = (g.ActiveId == 0) ? ~0 : g.ActiveIdAllowNavDirFlags;
if (g.NavMoveRequestForward == ImGuiNavForward_None)
{
g.NavMoveDir = ImGuiDir_None;
- g.NavMoveRequestFlags = 0;
- if (g.NavWindow && !g.NavWindowingTarget && allowed_dir_flags && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs))
+ g.NavMoveRequestFlags = ImGuiNavMoveFlags_None;
+ if (g.NavWindow && !g.NavWindowingTarget && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs))
{
- if ((allowed_dir_flags & (1<<ImGuiDir_Left)) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadLeft, ImGuiNavInput_KeyLeft_, ImGuiInputReadMode_Repeat)) g.NavMoveDir = ImGuiDir_Left;
- if ((allowed_dir_flags & (1<<ImGuiDir_Right)) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadRight,ImGuiNavInput_KeyRight_,ImGuiInputReadMode_Repeat)) g.NavMoveDir = ImGuiDir_Right;
- if ((allowed_dir_flags & (1<<ImGuiDir_Up)) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadUp, ImGuiNavInput_KeyUp_, ImGuiInputReadMode_Repeat)) g.NavMoveDir = ImGuiDir_Up;
- if ((allowed_dir_flags & (1<<ImGuiDir_Down)) && IsNavInputPressedAnyOfTwo(ImGuiNavInput_DpadDown, ImGuiNavInput_KeyDown_, ImGuiInputReadMode_Repeat)) g.NavMoveDir = ImGuiDir_Down;
+ const ImGuiInputReadMode read_mode = ImGuiInputReadMode_Repeat;
+ if (!IsActiveIdUsingNavDir(ImGuiDir_Left) && (IsNavInputTest(ImGuiNavInput_DpadLeft, read_mode) || IsNavInputTest(ImGuiNavInput_KeyLeft_, read_mode))) { g.NavMoveDir = ImGuiDir_Left; }
+ if (!IsActiveIdUsingNavDir(ImGuiDir_Right) && (IsNavInputTest(ImGuiNavInput_DpadRight, read_mode) || IsNavInputTest(ImGuiNavInput_KeyRight_, read_mode))) { g.NavMoveDir = ImGuiDir_Right; }
+ if (!IsActiveIdUsingNavDir(ImGuiDir_Up) && (IsNavInputTest(ImGuiNavInput_DpadUp, read_mode) || IsNavInputTest(ImGuiNavInput_KeyUp_, read_mode))) { g.NavMoveDir = ImGuiDir_Up; }
+ if (!IsActiveIdUsingNavDir(ImGuiDir_Down) && (IsNavInputTest(ImGuiNavInput_DpadDown, read_mode) || IsNavInputTest(ImGuiNavInput_KeyDown_, read_mode))) { g.NavMoveDir = ImGuiDir_Down; }
}
g.NavMoveClipDir = g.NavMoveDir;
}
@@ -7356,10 +8483,11 @@ static void ImGui::NavUpdate()
g.NavMoveRequestForward = ImGuiNavForward_ForwardActive;
}
- // Update PageUp/PageDown scroll
+ // Update PageUp/PageDown/Home/End scroll
+ // FIXME-NAV: Consider enabling those keys even without the master ImGuiConfigFlags_NavEnableKeyboard flag?
float nav_scoring_rect_offset_y = 0.0f;
if (nav_keyboard_active)
- nav_scoring_rect_offset_y = NavUpdatePageUpPageDown(allowed_dir_flags);
+ nav_scoring_rect_offset_y = NavUpdatePageUpPageDown();
// If we initiate a movement request and have no current NavId, we initiate a InitDefautRequest that will be used as a fallback if the direction fails to find a match
if (g.NavMoveDir != ImGuiDir_None)
@@ -7369,8 +8497,10 @@ static void ImGui::NavUpdate()
}
if (g.NavMoveRequest && g.NavId == 0)
{
+ //IMGUI_DEBUG_LOG("[Nav] NavInitRequest from move, window \"%s\", layer=%d\n", g.NavWindow->Name, g.NavLayer);
g.NavInitRequest = g.NavInitRequestFromMove = true;
- g.NavInitResultId = 0;
+ // Reassigning with same value, we're being explicit here.
+ g.NavInitResultId = 0; // -V1048
g.NavDisableHighlight = false;
}
NavUpdateAnyRequestFlag();
@@ -7380,13 +8510,13 @@ static void ImGui::NavUpdate()
{
// *Fallback* manual-scroll with Nav directional keys when window has no navigable item
ImGuiWindow* window = g.NavWindow;
- const float scroll_speed = ImFloor(window->CalcFontSize() * 100 * g.IO.DeltaTime + 0.5f); // We need round the scrolling speed because sub-pixel scroll isn't reliably supported.
+ const float scroll_speed = IM_ROUND(window->CalcFontSize() * 100 * g.IO.DeltaTime); // We need round the scrolling speed because sub-pixel scroll isn't reliably supported.
if (window->DC.NavLayerActiveMask == 0x00 && window->DC.NavHasScroll && g.NavMoveRequest)
{
if (g.NavMoveDir == ImGuiDir_Left || g.NavMoveDir == ImGuiDir_Right)
- SetWindowScrollX(window, ImFloor(window->Scroll.x + ((g.NavMoveDir == ImGuiDir_Left) ? -1.0f : +1.0f) * scroll_speed));
+ SetScrollX(window, ImFloor(window->Scroll.x + ((g.NavMoveDir == ImGuiDir_Left) ? -1.0f : +1.0f) * scroll_speed));
if (g.NavMoveDir == ImGuiDir_Up || g.NavMoveDir == ImGuiDir_Down)
- SetWindowScrollY(window, ImFloor(window->Scroll.y + ((g.NavMoveDir == ImGuiDir_Up) ? -1.0f : +1.0f) * scroll_speed));
+ SetScrollY(window, ImFloor(window->Scroll.y + ((g.NavMoveDir == ImGuiDir_Up) ? -1.0f : +1.0f) * scroll_speed));
}
// *Normal* Manual scroll with NavScrollXXX keys
@@ -7394,12 +8524,12 @@ static void ImGui::NavUpdate()
ImVec2 scroll_dir = GetNavInputAmount2d(ImGuiNavDirSourceFlags_PadLStick, ImGuiInputReadMode_Down, 1.0f/10.0f, 10.0f);
if (scroll_dir.x != 0.0f && window->ScrollbarX)
{
- SetWindowScrollX(window, ImFloor(window->Scroll.x + scroll_dir.x * scroll_speed));
+ SetScrollX(window, ImFloor(window->Scroll.x + scroll_dir.x * scroll_speed));
g.NavMoveFromClampedRefRect = true;
}
if (scroll_dir.y != 0.0f)
{
- SetWindowScrollY(window, ImFloor(window->Scroll.y + scroll_dir.y * scroll_speed));
+ SetScrollY(window, ImFloor(window->Scroll.y + scroll_dir.y * scroll_speed));
g.NavMoveFromClampedRefRect = true;
}
}
@@ -7413,13 +8543,13 @@ static void ImGui::NavUpdate()
if (g.NavMoveRequest && g.NavMoveFromClampedRefRect && g.NavLayer == 0)
{
ImGuiWindow* window = g.NavWindow;
- ImRect window_rect_rel(window->InnerMainRect.Min - window->Pos - ImVec2(1,1), window->InnerMainRect.Max - window->Pos + ImVec2(1,1));
+ ImRect window_rect_rel(window->InnerRect.Min - window->Pos - ImVec2(1,1), window->InnerRect.Max - window->Pos + ImVec2(1,1));
if (!window_rect_rel.Contains(window->NavRectRel[g.NavLayer]))
{
float pad = window->CalcFontSize() * 0.5f;
window_rect_rel.Expand(ImVec2(-ImMin(window_rect_rel.GetWidth(), pad), -ImMin(window_rect_rel.GetHeight(), pad))); // Terrible approximation for the intent of starting navigation from first fully visible item
window->NavRectRel[g.NavLayer].ClipWith(window_rect_rel);
- g.NavId = 0;
+ g.NavId = g.NavFocusScopeId = 0;
}
g.NavMoveFromClampedRefRect = false;
}
@@ -7431,18 +8561,34 @@ static void ImGui::NavUpdate()
g.NavScoringRectScreen.Min.x = ImMin(g.NavScoringRectScreen.Min.x + 1.0f, g.NavScoringRectScreen.Max.x);
g.NavScoringRectScreen.Max.x = g.NavScoringRectScreen.Min.x;
IM_ASSERT(!g.NavScoringRectScreen.IsInverted()); // Ensure if we have a finite, non-inverted bounding box here will allows us to remove extraneous ImFabs() calls in NavScoreItem().
- //g.OverlayDrawList.AddRect(g.NavScoringRectScreen.Min, g.NavScoringRectScreen.Max, IM_COL32(255,200,0,255)); // [DEBUG]
+ //GetForegroundDrawList()->AddRect(g.NavScoringRectScreen.Min, g.NavScoringRectScreen.Max, IM_COL32(255,200,0,255)); // [DEBUG]
g.NavScoringCount = 0;
#if IMGUI_DEBUG_NAV_RECTS
- if (g.NavWindow) { for (int layer = 0; layer < 2; layer++) GetOverlayDrawList()->AddRect(g.NavWindow->Pos + g.NavWindow->NavRectRel[layer].Min, g.NavWindow->Pos + g.NavWindow->NavRectRel[layer].Max, IM_COL32(255,200,0,255)); } // [DEBUG]
- if (g.NavWindow) { ImU32 col = (g.NavWindow->HiddenFrames == 0) ? IM_COL32(255,0,255,255) : IM_COL32(255,0,0,255); ImVec2 p = NavCalcPreferredRefPos(); char buf[32]; ImFormatString(buf, 32, "%d", g.NavLayer); g.OverlayDrawList.AddCircleFilled(p, 3.0f, col); g.OverlayDrawList.AddText(NULL, 13.0f, p + ImVec2(8,-4), col, buf); }
+ if (g.NavWindow)
+ {
+ ImDrawList* draw_list = GetForegroundDrawList(g.NavWindow);
+ if (1) { for (int layer = 0; layer < 2; layer++) draw_list->AddRect(g.NavWindow->Pos + g.NavWindow->NavRectRel[layer].Min, g.NavWindow->Pos + g.NavWindow->NavRectRel[layer].Max, IM_COL32(255,200,0,255)); } // [DEBUG]
+ if (1) { ImU32 col = (!g.NavWindow->Hidden) ? IM_COL32(255,0,255,255) : IM_COL32(255,0,0,255); ImVec2 p = NavCalcPreferredRefPos(); char buf[32]; ImFormatString(buf, 32, "%d", g.NavLayer); draw_list->AddCircleFilled(p, 3.0f, col); draw_list->AddText(NULL, 13.0f, p + ImVec2(8,-4), col, buf); }
+ }
#endif
}
+// Apply result from previous frame navigation directional move request
static void ImGui::NavUpdateMoveResult()
{
- // Select which result to use
ImGuiContext& g = *GImGui;
+ if (g.NavMoveResultLocal.ID == 0 && g.NavMoveResultOther.ID == 0)
+ {
+ // In a situation when there is no results but NavId != 0, re-enable the Navigation highlight (because g.NavId is not considered as a possible result)
+ if (g.NavId != 0)
+ {
+ g.NavDisableHighlight = false;
+ g.NavDisableMouseHover = true;
+ }
+ return;
+ }
+
+ // Select which result to use
ImGuiNavMoveResult* result = (g.NavMoveResultLocal.ID != 0) ? &g.NavMoveResultLocal : &g.NavMoveResultOther;
// PageUp/PageDown behavior first jumps to the bottom/top mostly visible item, _otherwise_ use the result from the previous/next page.
@@ -7459,72 +8605,110 @@ static void ImGui::NavUpdateMoveResult()
// Scroll to keep newly navigated item fully into view.
if (g.NavLayer == 0)
{
- ImRect rect_abs = ImRect(result->RectRel.Min + result->Window->Pos, result->RectRel.Max + result->Window->Pos);
- NavScrollToBringItemIntoView(result->Window, rect_abs);
-
- // Estimate upcoming scroll so we can offset our result position so mouse position can be applied immediately after in NavUpdate()
- ImVec2 next_scroll = CalcNextScrollFromScrollTargetAndClamp(result->Window, false);
- ImVec2 delta_scroll = result->Window->Scroll - next_scroll;
- result->RectRel.Translate(delta_scroll);
+ ImVec2 delta_scroll;
+ if (g.NavMoveRequestFlags & ImGuiNavMoveFlags_ScrollToEdge)
+ {
+ float scroll_target = (g.NavMoveDir == ImGuiDir_Up) ? result->Window->ScrollMax.y : 0.0f;
+ delta_scroll.y = result->Window->Scroll.y - scroll_target;
+ SetScrollY(result->Window, scroll_target);
+ }
+ else
+ {
+ ImRect rect_abs = ImRect(result->RectRel.Min + result->Window->Pos, result->RectRel.Max + result->Window->Pos);
+ delta_scroll = ScrollToBringRectIntoView(result->Window, rect_abs);
+ }
- // Also scroll parent window to keep us into view if necessary (we could/should technically recurse back the whole the parent hierarchy).
- if (result->Window->Flags & ImGuiWindowFlags_ChildWindow)
- NavScrollToBringItemIntoView(result->Window->ParentWindow, ImRect(rect_abs.Min + delta_scroll, rect_abs.Max + delta_scroll));
+ // Offset our result position so mouse position can be applied immediately after in NavUpdate()
+ result->RectRel.TranslateX(-delta_scroll.x);
+ result->RectRel.TranslateY(-delta_scroll.y);
}
- // Apply result from previous frame navigation directional move request
ClearActiveID();
g.NavWindow = result->Window;
- SetNavIDWithRectRel(result->ID, g.NavLayer, result->RectRel);
- g.NavJustMovedToId = result->ID;
+ if (g.NavId != result->ID)
+ {
+ // Don't set NavJustMovedToId if just landed on the same spot (which may happen with ImGuiNavMoveFlags_AllowCurrentNavId)
+ g.NavJustMovedToId = result->ID;
+ g.NavJustMovedToFocusScopeId = result->FocusScopeId;
+
+ }
+ SetNavIDWithRectRel(result->ID, g.NavLayer, result->FocusScopeId, result->RectRel);
g.NavMoveFromClampedRefRect = false;
}
-static float ImGui::NavUpdatePageUpPageDown(int allowed_dir_flags)
+// Handle PageUp/PageDown/Home/End keys
+static float ImGui::NavUpdatePageUpPageDown()
{
ImGuiContext& g = *GImGui;
- if (g.NavMoveDir == ImGuiDir_None && g.NavWindow && !(g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs) && !g.NavWindowingTarget && g.NavLayer == 0)
+ if (g.NavMoveDir != ImGuiDir_None || g.NavWindow == NULL)
+ return 0.0f;
+ if ((g.NavWindow->Flags & ImGuiWindowFlags_NoNavInputs) || g.NavWindowingTarget != NULL || g.NavLayer != 0)
+ return 0.0f;
+
+ ImGuiWindow* window = g.NavWindow;
+ const bool page_up_held = IsKeyDown(g.IO.KeyMap[ImGuiKey_PageUp]) && !IsActiveIdUsingKey(ImGuiKey_PageUp);
+ const bool page_down_held = IsKeyDown(g.IO.KeyMap[ImGuiKey_PageDown]) && !IsActiveIdUsingKey(ImGuiKey_PageDown);
+ const bool home_pressed = IsKeyPressed(g.IO.KeyMap[ImGuiKey_Home]) && !IsActiveIdUsingKey(ImGuiKey_Home);
+ const bool end_pressed = IsKeyPressed(g.IO.KeyMap[ImGuiKey_End]) && !IsActiveIdUsingKey(ImGuiKey_End);
+ if (page_up_held != page_down_held || home_pressed != end_pressed) // If either (not both) are pressed
{
- ImGuiWindow* window = g.NavWindow;
- bool page_up_held = IsKeyDown(g.IO.KeyMap[ImGuiKey_PageUp]) && (allowed_dir_flags & (1 << ImGuiDir_Up));
- bool page_down_held = IsKeyDown(g.IO.KeyMap[ImGuiKey_PageDown]) && (allowed_dir_flags & (1 << ImGuiDir_Down));
- if ((page_up_held && !page_down_held) || (page_down_held && !page_up_held))
+ if (window->DC.NavLayerActiveMask == 0x00 && window->DC.NavHasScroll)
+ {
+ // Fallback manual-scroll when window has no navigable item
+ if (IsKeyPressed(g.IO.KeyMap[ImGuiKey_PageUp], true))
+ SetScrollY(window, window->Scroll.y - window->InnerRect.GetHeight());
+ else if (IsKeyPressed(g.IO.KeyMap[ImGuiKey_PageDown], true))
+ SetScrollY(window, window->Scroll.y + window->InnerRect.GetHeight());
+ else if (home_pressed)
+ SetScrollY(window, 0.0f);
+ else if (end_pressed)
+ SetScrollY(window, window->ScrollMax.y);
+ }
+ else
{
- if (window->DC.NavLayerActiveMask == 0x00 && window->DC.NavHasScroll)
+ ImRect& nav_rect_rel = window->NavRectRel[g.NavLayer];
+ const float page_offset_y = ImMax(0.0f, window->InnerRect.GetHeight() - window->CalcFontSize() * 1.0f + nav_rect_rel.GetHeight());
+ float nav_scoring_rect_offset_y = 0.0f;
+ if (IsKeyPressed(g.IO.KeyMap[ImGuiKey_PageUp], true))
{
- // Fallback manual-scroll when window has no navigable item
- if (IsKeyPressed(g.IO.KeyMap[ImGuiKey_PageUp], true))
- SetWindowScrollY(window, window->Scroll.y - window->InnerClipRect.GetHeight());
- else if (IsKeyPressed(g.IO.KeyMap[ImGuiKey_PageDown], true))
- SetWindowScrollY(window, window->Scroll.y + window->InnerClipRect.GetHeight());
+ nav_scoring_rect_offset_y = -page_offset_y;
+ g.NavMoveDir = ImGuiDir_Down; // Because our scoring rect is offset up, we request the down direction (so we can always land on the last item)
+ g.NavMoveClipDir = ImGuiDir_Up;
+ g.NavMoveRequestFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet;
}
- else
+ else if (IsKeyPressed(g.IO.KeyMap[ImGuiKey_PageDown], true))
{
- const ImRect& nav_rect_rel = window->NavRectRel[g.NavLayer];
- const float page_offset_y = ImMax(0.0f, window->InnerClipRect.GetHeight() - window->CalcFontSize() * 1.0f + nav_rect_rel.GetHeight());
- float nav_scoring_rect_offset_y = 0.0f;
- if (IsKeyPressed(g.IO.KeyMap[ImGuiKey_PageUp], true))
- {
- nav_scoring_rect_offset_y = -page_offset_y;
- g.NavMoveDir = ImGuiDir_Down; // Because our scoring rect is offset, we intentionally request the opposite direction (so we can always land on the last item)
- g.NavMoveClipDir = ImGuiDir_Up;
- g.NavMoveRequestFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet;
- }
- else if (IsKeyPressed(g.IO.KeyMap[ImGuiKey_PageDown], true))
- {
- nav_scoring_rect_offset_y = +page_offset_y;
- g.NavMoveDir = ImGuiDir_Up; // Because our scoring rect is offset, we intentionally request the opposite direction (so we can always land on the last item)
- g.NavMoveClipDir = ImGuiDir_Down;
- g.NavMoveRequestFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet;
- }
- return nav_scoring_rect_offset_y;
+ nav_scoring_rect_offset_y = +page_offset_y;
+ g.NavMoveDir = ImGuiDir_Up; // Because our scoring rect is offset down, we request the up direction (so we can always land on the last item)
+ g.NavMoveClipDir = ImGuiDir_Down;
+ g.NavMoveRequestFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_AlsoScoreVisibleSet;
+ }
+ else if (home_pressed)
+ {
+ // FIXME-NAV: handling of Home/End is assuming that the top/bottom most item will be visible with Scroll.y == 0/ScrollMax.y
+ // Scrolling will be handled via the ImGuiNavMoveFlags_ScrollToEdge flag, we don't scroll immediately to avoid scrolling happening before nav result.
+ // Preserve current horizontal position if we have any.
+ nav_rect_rel.Min.y = nav_rect_rel.Max.y = -window->Scroll.y;
+ if (nav_rect_rel.IsInverted())
+ nav_rect_rel.Min.x = nav_rect_rel.Max.x = 0.0f;
+ g.NavMoveDir = ImGuiDir_Down;
+ g.NavMoveRequestFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_ScrollToEdge;
+ }
+ else if (end_pressed)
+ {
+ nav_rect_rel.Min.y = nav_rect_rel.Max.y = window->ScrollMax.y + window->SizeFull.y - window->Scroll.y;
+ if (nav_rect_rel.IsInverted())
+ nav_rect_rel.Min.x = nav_rect_rel.Max.x = 0.0f;
+ g.NavMoveDir = ImGuiDir_Up;
+ g.NavMoveRequestFlags = ImGuiNavMoveFlags_AllowCurrentNavId | ImGuiNavMoveFlags_ScrollToEdge;
}
+ return nav_scoring_rect_offset_y;
}
}
return 0.0f;
}
-static int FindWindowFocusIndex(ImGuiWindow* window) // FIXME-OPT O(N)
+static int ImGui::FindWindowFocusIndex(ImGuiWindow* window) // FIXME-OPT O(N)
{
ImGuiContext& g = *GImGui;
for (int i = g.WindowsFocusOrder.Size-1; i >= 0; i--)
@@ -7549,7 +8733,7 @@ static void NavUpdateWindowingHighlightWindow(int focus_change_dir)
if (g.NavWindowingTarget->Flags & ImGuiWindowFlags_Modal)
return;
- const int i_current = FindWindowFocusIndex(g.NavWindowingTarget);
+ const int i_current = ImGui::FindWindowFocusIndex(g.NavWindowingTarget);
ImGuiWindow* window_target = FindWindowNavFocusable(i_current + focus_change_dir, -INT_MAX, focus_change_dir);
if (!window_target)
window_target = FindWindowNavFocusable((focus_change_dir < 0) ? (g.WindowsFocusOrder.Size - 1) : 0, i_current, focus_change_dir);
@@ -7558,14 +8742,16 @@ static void NavUpdateWindowingHighlightWindow(int focus_change_dir)
g.NavWindowingToggleLayer = false;
}
-// Window management mode (hold to: change focus/move/resize, tap to: toggle menu layer)
+// Windowing management mode
+// Keyboard: CTRL+Tab (change focus/move/resize), Alt (toggle menu layer)
+// Gamepad: Hold Menu/Square (change focus/move/resize), Tap Menu/Square (toggle menu layer)
static void ImGui::NavUpdateWindowing()
{
ImGuiContext& g = *GImGui;
ImGuiWindow* apply_focus_window = NULL;
bool apply_toggle_layer = false;
- ImGuiWindow* modal_window = GetFrontMostPopupModal();
+ ImGuiWindow* modal_window = GetTopMostPopupModal();
if (modal_window != NULL)
{
g.NavWindowingTarget = NULL;
@@ -7581,12 +8767,12 @@ static void ImGui::NavUpdateWindowing()
}
// Start CTRL-TAB or Square+L/R window selection
- bool start_windowing_with_gamepad = !g.NavWindowingTarget && IsNavInputPressed(ImGuiNavInput_Menu, ImGuiInputReadMode_Pressed);
+ bool start_windowing_with_gamepad = !g.NavWindowingTarget && IsNavInputTest(ImGuiNavInput_Menu, ImGuiInputReadMode_Pressed);
bool start_windowing_with_keyboard = !g.NavWindowingTarget && g.IO.KeyCtrl && IsKeyPressedMap(ImGuiKey_Tab) && (g.IO.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard);
if (start_windowing_with_gamepad || start_windowing_with_keyboard)
if (ImGuiWindow* window = g.NavWindow ? g.NavWindow : FindWindowNavFocusable(g.WindowsFocusOrder.Size - 1, -INT_MAX, -1))
{
- g.NavWindowingTarget = g.NavWindowingTargetAnim = window;
+ g.NavWindowingTarget = g.NavWindowingTargetAnim = window->RootWindow; // FIXME-DOCK: Will need to use RootWindowDockStop
g.NavWindowingTimer = g.NavWindowingHighlightAlpha = 0.0f;
g.NavWindowingToggleLayer = start_windowing_with_keyboard ? false : true;
g.NavInputSource = start_windowing_with_keyboard ? ImGuiInputSource_NavKeyboard : ImGuiInputSource_NavGamepad;
@@ -7600,14 +8786,14 @@ static void ImGui::NavUpdateWindowing()
g.NavWindowingHighlightAlpha = ImMax(g.NavWindowingHighlightAlpha, ImSaturate((g.NavWindowingTimer - NAV_WINDOWING_HIGHLIGHT_DELAY) / 0.05f));
// Select window to focus
- const int focus_change_dir = (int)IsNavInputPressed(ImGuiNavInput_FocusPrev, ImGuiInputReadMode_RepeatSlow) - (int)IsNavInputPressed(ImGuiNavInput_FocusNext, ImGuiInputReadMode_RepeatSlow);
+ const int focus_change_dir = (int)IsNavInputTest(ImGuiNavInput_FocusPrev, ImGuiInputReadMode_RepeatSlow) - (int)IsNavInputTest(ImGuiNavInput_FocusNext, ImGuiInputReadMode_RepeatSlow);
if (focus_change_dir != 0)
{
NavUpdateWindowingHighlightWindow(focus_change_dir);
g.NavWindowingHighlightAlpha = 1.0f;
}
- // Single press toggles NavLayer, long press with L/R apply actual focus on release (until then the window was merely rendered front-most)
+ // Single press toggles NavLayer, long press with L/R apply actual focus on release (until then the window was merely rendered top-most)
if (!IsNavInputDown(ImGuiNavInput_Menu))
{
g.NavWindowingToggleLayer &= (g.NavWindowingHighlightAlpha < 1.0f); // Once button was held long enough we don't consider it a tap-to-toggle-layer press anymore.
@@ -7632,7 +8818,9 @@ static void ImGui::NavUpdateWindowing()
// Keyboard: Press and Release ALT to toggle menu layer
// FIXME: We lack an explicit IO variable for "is the imgui window focused", so compare mouse validity to detect the common case of back-end clearing releases all keys on ALT-TAB
- if ((g.ActiveId == 0 || g.ActiveIdAllowOverlap) && IsNavInputPressed(ImGuiNavInput_KeyMenu_, ImGuiInputReadMode_Released))
+ if (IsNavInputTest(ImGuiNavInput_KeyMenu_, ImGuiInputReadMode_Pressed))
+ g.NavWindowingToggleLayer = true;
+ if ((g.ActiveId == 0 || g.ActiveIdAllowOverlap) && g.NavWindowingToggleLayer && IsNavInputTest(ImGuiNavInput_KeyMenu_, ImGuiInputReadMode_Released))
if (IsMousePosValid(&g.IO.MousePos) == IsMousePosValid(&g.IO.MousePosPrev))
apply_toggle_layer = true;
@@ -7648,7 +8836,7 @@ static void ImGui::NavUpdateWindowing()
{
const float NAV_MOVE_SPEED = 800.0f;
const float move_speed = ImFloor(NAV_MOVE_SPEED * g.IO.DeltaTime * ImMin(g.IO.DisplayFramebufferScale.x, g.IO.DisplayFramebufferScale.y)); // FIXME: Doesn't code variable framerate very well
- g.NavWindowingTarget->RootWindow->Pos += move_delta * move_speed;
+ SetWindowPos(g.NavWindowingTarget->RootWindow, g.NavWindowingTarget->RootWindow->Pos + move_delta * move_speed, ImGuiCond_Always);
g.NavDisableMouseHover = true;
MarkIniSettingsDirty(g.NavWindowingTarget);
}
@@ -7657,17 +8845,18 @@ static void ImGui::NavUpdateWindowing()
// Apply final focus
if (apply_focus_window && (g.NavWindow == NULL || apply_focus_window != g.NavWindow->RootWindow))
{
+ ClearActiveID();
g.NavDisableHighlight = false;
g.NavDisableMouseHover = true;
apply_focus_window = NavRestoreLastChildNavWindow(apply_focus_window);
- ClosePopupsOverWindow(apply_focus_window);
+ ClosePopupsOverWindow(apply_focus_window, false);
FocusWindow(apply_focus_window);
if (apply_focus_window->NavLastIds[0] == 0)
NavInitWindow(apply_focus_window, false);
// If the window only has a menu layer, select it directly
- if (apply_focus_window->DC.NavLayerActiveMask == (1 << 1))
- g.NavLayer = 1;
+ if (apply_focus_window->DC.NavLayerActiveMask == (1 << ImGuiNavLayer_Menu))
+ g.NavLayer = ImGuiNavLayer_Menu;
}
if (apply_focus_window)
g.NavWindowingTarget = NULL;
@@ -7677,7 +8866,10 @@ static void ImGui::NavUpdateWindowing()
{
// Move to parent menu if necessary
ImGuiWindow* new_nav_window = g.NavWindow;
- while ((new_nav_window->DC.NavLayerActiveMask & (1 << 1)) == 0 && (new_nav_window->Flags & ImGuiWindowFlags_ChildWindow) != 0 && (new_nav_window->Flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_ChildMenu)) == 0)
+ while (new_nav_window->ParentWindow
+ && (new_nav_window->DC.NavLayerActiveMask & (1 << ImGuiNavLayer_Menu)) == 0
+ && (new_nav_window->Flags & ImGuiWindowFlags_ChildWindow) != 0
+ && (new_nav_window->Flags & (ImGuiWindowFlags_Popup | ImGuiWindowFlags_ChildMenu)) == 0)
new_nav_window = new_nav_window->ParentWindow;
if (new_nav_window != g.NavWindow)
{
@@ -7687,7 +8879,10 @@ static void ImGui::NavUpdateWindowing()
}
g.NavDisableHighlight = false;
g.NavDisableMouseHover = true;
- NavRestoreLayer((g.NavWindow->DC.NavLayerActiveMask & (1 << 1)) ? (g.NavLayer ^ 1) : 0);
+
+ // When entering a regular menu bar with the Alt key, we always reinitialize the navigation ID.
+ const ImGuiNavLayer new_nav_layer = (g.NavWindow->DC.NavLayerActiveMask & (1 << ImGuiNavLayer_Menu)) ? (ImGuiNavLayer)((int)g.NavLayer ^ 1) : ImGuiNavLayer_Main;
+ NavRestoreLayer(new_nav_layer);
}
}
@@ -7702,7 +8897,7 @@ static const char* GetFallbackWindowNameForWindowingList(ImGuiWindow* window)
}
// Overlay displayed when using CTRL+TAB. Called by EndFrame().
-void ImGui::NavUpdateWindowingList()
+void ImGui::NavUpdateWindowingOverlay()
{
ImGuiContext& g = *GImGui;
IM_ASSERT(g.NavWindowingTarget != NULL);
@@ -7730,328 +8925,6 @@ void ImGui::NavUpdateWindowingList()
PopStyleVar();
}
-//-----------------------------------------------------------------------------
-// [SECTION] COLUMNS
-// In the current version, Columns are very weak. Needs to be replaced with a more full-featured system.
-//-----------------------------------------------------------------------------
-
-void ImGui::NextColumn()
-{
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems || window->DC.ColumnsSet == NULL)
- return;
-
- ImGuiContext& g = *GImGui;
- PopItemWidth();
- PopClipRect();
-
- ImGuiColumnsSet* columns = window->DC.ColumnsSet;
- columns->LineMaxY = ImMax(columns->LineMaxY, window->DC.CursorPos.y);
- if (++columns->Current < columns->Count)
- {
- // Columns 1+ cancel out IndentX
- window->DC.ColumnsOffset.x = GetColumnOffset(columns->Current) - window->DC.Indent.x + g.Style.ItemSpacing.x;
- window->DrawList->ChannelsSetCurrent(columns->Current);
- }
- else
- {
- window->DC.ColumnsOffset.x = 0.0f;
- window->DrawList->ChannelsSetCurrent(0);
- columns->Current = 0;
- columns->LineMinY = columns->LineMaxY;
- }
- window->DC.CursorPos.x = (float)(int)(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x);
- window->DC.CursorPos.y = columns->LineMinY;
- window->DC.CurrentLineSize = ImVec2(0.0f, 0.0f);
- window->DC.CurrentLineTextBaseOffset = 0.0f;
-
- PushColumnClipRect();
- PushItemWidth(GetColumnWidth() * 0.65f); // FIXME: Move on columns setup
-}
-
-int ImGui::GetColumnIndex()
-{
- ImGuiWindow* window = GetCurrentWindowRead();
- return window->DC.ColumnsSet ? window->DC.ColumnsSet->Current : 0;
-}
-
-int ImGui::GetColumnsCount()
-{
- ImGuiWindow* window = GetCurrentWindowRead();
- return window->DC.ColumnsSet ? window->DC.ColumnsSet->Count : 1;
-}
-
-static float OffsetNormToPixels(const ImGuiColumnsSet* columns, float offset_norm)
-{
- return offset_norm * (columns->MaxX - columns->MinX);
-}
-
-static float PixelsToOffsetNorm(const ImGuiColumnsSet* columns, float offset)
-{
- return offset / (columns->MaxX - columns->MinX);
-}
-
-static inline float GetColumnsRectHalfWidth() { return 4.0f; }
-
-static float GetDraggedColumnOffset(ImGuiColumnsSet* columns, int column_index)
-{
- // Active (dragged) column always follow mouse. The reason we need this is that dragging a column to the right edge of an auto-resizing
- // window creates a feedback loop because we store normalized positions. So while dragging we enforce absolute positioning.
- ImGuiContext& g = *GImGui;
- ImGuiWindow* window = g.CurrentWindow;
- IM_ASSERT(column_index > 0); // We are not supposed to drag column 0.
- IM_ASSERT(g.ActiveId == columns->ID + ImGuiID(column_index));
-
- float x = g.IO.MousePos.x - g.ActiveIdClickOffset.x + GetColumnsRectHalfWidth() - window->Pos.x;
- x = ImMax(x, ImGui::GetColumnOffset(column_index - 1) + g.Style.ColumnsMinSpacing);
- if ((columns->Flags & ImGuiColumnsFlags_NoPreserveWidths))
- x = ImMin(x, ImGui::GetColumnOffset(column_index + 1) - g.Style.ColumnsMinSpacing);
-
- return x;
-}
-
-float ImGui::GetColumnOffset(int column_index)
-{
- ImGuiWindow* window = GetCurrentWindowRead();
- ImGuiColumnsSet* columns = window->DC.ColumnsSet;
- IM_ASSERT(columns != NULL);
-
- if (column_index < 0)
- column_index = columns->Current;
- IM_ASSERT(column_index < columns->Columns.Size);
-
- const float t = columns->Columns[column_index].OffsetNorm;
- const float x_offset = ImLerp(columns->MinX, columns->MaxX, t);
- return x_offset;
-}
-
-static float GetColumnWidthEx(ImGuiColumnsSet* columns, int column_index, bool before_resize = false)
-{
- if (column_index < 0)
- column_index = columns->Current;
-
- float offset_norm;
- if (before_resize)
- offset_norm = columns->Columns[column_index + 1].OffsetNormBeforeResize - columns->Columns[column_index].OffsetNormBeforeResize;
- else
- offset_norm = columns->Columns[column_index + 1].OffsetNorm - columns->Columns[column_index].OffsetNorm;
- return OffsetNormToPixels(columns, offset_norm);
-}
-
-float ImGui::GetColumnWidth(int column_index)
-{
- ImGuiWindow* window = GetCurrentWindowRead();
- ImGuiColumnsSet* columns = window->DC.ColumnsSet;
- IM_ASSERT(columns != NULL);
-
- if (column_index < 0)
- column_index = columns->Current;
- return OffsetNormToPixels(columns, columns->Columns[column_index + 1].OffsetNorm - columns->Columns[column_index].OffsetNorm);
-}
-
-void ImGui::SetColumnOffset(int column_index, float offset)
-{
- ImGuiContext& g = *GImGui;
- ImGuiWindow* window = g.CurrentWindow;
- ImGuiColumnsSet* columns = window->DC.ColumnsSet;
- IM_ASSERT(columns != NULL);
-
- if (column_index < 0)
- column_index = columns->Current;
- IM_ASSERT(column_index < columns->Columns.Size);
-
- const bool preserve_width = !(columns->Flags & ImGuiColumnsFlags_NoPreserveWidths) && (column_index < columns->Count-1);
- const float width = preserve_width ? GetColumnWidthEx(columns, column_index, columns->IsBeingResized) : 0.0f;
-
- if (!(columns->Flags & ImGuiColumnsFlags_NoForceWithinWindow))
- offset = ImMin(offset, columns->MaxX - g.Style.ColumnsMinSpacing * (columns->Count - column_index));
- columns->Columns[column_index].OffsetNorm = PixelsToOffsetNorm(columns, offset - columns->MinX);
-
- if (preserve_width)
- SetColumnOffset(column_index + 1, offset + ImMax(g.Style.ColumnsMinSpacing, width));
-}
-
-void ImGui::SetColumnWidth(int column_index, float width)
-{
- ImGuiWindow* window = GetCurrentWindowRead();
- ImGuiColumnsSet* columns = window->DC.ColumnsSet;
- IM_ASSERT(columns != NULL);
-
- if (column_index < 0)
- column_index = columns->Current;
- SetColumnOffset(column_index + 1, GetColumnOffset(column_index) + width);
-}
-
-void ImGui::PushColumnClipRect(int column_index)
-{
- ImGuiWindow* window = GetCurrentWindowRead();
- ImGuiColumnsSet* columns = window->DC.ColumnsSet;
- if (column_index < 0)
- column_index = columns->Current;
-
- PushClipRect(columns->Columns[column_index].ClipRect.Min, columns->Columns[column_index].ClipRect.Max, false);
-}
-
-static ImGuiColumnsSet* FindOrAddColumnsSet(ImGuiWindow* window, ImGuiID id)
-{
- for (int n = 0; n < window->ColumnsStorage.Size; n++)
- if (window->ColumnsStorage[n].ID == id)
- return &window->ColumnsStorage[n];
-
- window->ColumnsStorage.push_back(ImGuiColumnsSet());
- ImGuiColumnsSet* columns = &window->ColumnsStorage.back();
- columns->ID = id;
- return columns;
-}
-
-void ImGui::BeginColumns(const char* str_id, int columns_count, ImGuiColumnsFlags flags)
-{
- ImGuiContext& g = *GImGui;
- ImGuiWindow* window = GetCurrentWindow();
-
- IM_ASSERT(columns_count > 1);
- IM_ASSERT(window->DC.ColumnsSet == NULL); // Nested columns are currently not supported
-
- // Differentiate column ID with an arbitrary prefix for cases where users name their columns set the same as another widget.
- // In addition, when an identifier isn't explicitly provided we include the number of columns in the hash to make it uniquer.
- PushID(0x11223347 + (str_id ? 0 : columns_count));
- ImGuiID id = window->GetID(str_id ? str_id : "columns");
- PopID();
-
- // Acquire storage for the columns set
- ImGuiColumnsSet* columns = FindOrAddColumnsSet(window, id);
- IM_ASSERT(columns->ID == id);
- columns->Current = 0;
- columns->Count = columns_count;
- columns->Flags = flags;
- window->DC.ColumnsSet = columns;
-
- // Set state for first column
- const float content_region_width = (window->SizeContentsExplicit.x != 0.0f) ? (window->SizeContentsExplicit.x) : (window->InnerClipRect.Max.x - window->Pos.x);
- columns->MinX = window->DC.Indent.x - g.Style.ItemSpacing.x; // Lock our horizontal range
- columns->MaxX = ImMax(content_region_width - window->Scroll.x, columns->MinX + 1.0f);
- columns->StartPosY = window->DC.CursorPos.y;
- columns->StartMaxPosX = window->DC.CursorMaxPos.x;
- columns->LineMinY = columns->LineMaxY = window->DC.CursorPos.y;
- window->DC.ColumnsOffset.x = 0.0f;
- window->DC.CursorPos.x = (float)(int)(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x);
-
- // Clear data if columns count changed
- if (columns->Columns.Size != 0 && columns->Columns.Size != columns_count + 1)
- columns->Columns.resize(0);
-
- // Initialize defaults
- columns->IsFirstFrame = (columns->Columns.Size == 0);
- if (columns->Columns.Size == 0)
- {
- columns->Columns.reserve(columns_count + 1);
- for (int n = 0; n < columns_count + 1; n++)
- {
- ImGuiColumnData column;
- column.OffsetNorm = n / (float)columns_count;
- columns->Columns.push_back(column);
- }
- }
-
- for (int n = 0; n < columns_count; n++)
- {
- // Compute clipping rectangle
- ImGuiColumnData* column = &columns->Columns[n];
- float clip_x1 = ImFloor(0.5f + window->Pos.x + GetColumnOffset(n) - 1.0f);
- float clip_x2 = ImFloor(0.5f + window->Pos.x + GetColumnOffset(n + 1) - 1.0f);
- column->ClipRect = ImRect(clip_x1, -FLT_MAX, clip_x2, +FLT_MAX);
- column->ClipRect.ClipWith(window->ClipRect);
- }
-
- window->DrawList->ChannelsSplit(columns->Count);
- PushColumnClipRect();
- PushItemWidth(GetColumnWidth() * 0.65f);
-}
-
-void ImGui::EndColumns()
-{
- ImGuiContext& g = *GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- ImGuiColumnsSet* columns = window->DC.ColumnsSet;
- IM_ASSERT(columns != NULL);
-
- PopItemWidth();
- PopClipRect();
- window->DrawList->ChannelsMerge();
-
- columns->LineMaxY = ImMax(columns->LineMaxY, window->DC.CursorPos.y);
- window->DC.CursorPos.y = columns->LineMaxY;
- if (!(columns->Flags & ImGuiColumnsFlags_GrowParentContentsSize))
- window->DC.CursorMaxPos.x = columns->StartMaxPosX; // Restore cursor max pos, as columns don't grow parent
-
- // Draw columns borders and handle resize
- bool is_being_resized = false;
- if (!(columns->Flags & ImGuiColumnsFlags_NoBorder) && !window->SkipItems)
- {
- const float y1 = columns->StartPosY;
- const float y2 = window->DC.CursorPos.y;
- int dragging_column = -1;
- for (int n = 1; n < columns->Count; n++)
- {
- float x = window->Pos.x + GetColumnOffset(n);
- const ImGuiID column_id = columns->ID + ImGuiID(n);
- const float column_hw = GetColumnsRectHalfWidth(); // Half-width for interaction
- const ImRect column_rect(ImVec2(x - column_hw, y1), ImVec2(x + column_hw, y2));
- KeepAliveID(column_id);
- if (IsClippedEx(column_rect, column_id, false))
- continue;
-
- bool hovered = false, held = false;
- if (!(columns->Flags & ImGuiColumnsFlags_NoResize))
- {
- ButtonBehavior(column_rect, column_id, &hovered, &held);
- if (hovered || held)
- g.MouseCursor = ImGuiMouseCursor_ResizeEW;
- if (held && !(columns->Columns[n].Flags & ImGuiColumnsFlags_NoResize))
- dragging_column = n;
- }
-
- // Draw column (we clip the Y boundaries CPU side because very long triangles are mishandled by some GPU drivers.)
- const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : hovered ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator);
- const float xi = (float)(int)x;
- window->DrawList->AddLine(ImVec2(xi, ImMax(y1 + 1.0f, window->ClipRect.Min.y)), ImVec2(xi, ImMin(y2, window->ClipRect.Max.y)), col);
- }
-
- // Apply dragging after drawing the column lines, so our rendered lines are in sync with how items were displayed during the frame.
- if (dragging_column != -1)
- {
- if (!columns->IsBeingResized)
- for (int n = 0; n < columns->Count + 1; n++)
- columns->Columns[n].OffsetNormBeforeResize = columns->Columns[n].OffsetNorm;
- columns->IsBeingResized = is_being_resized = true;
- float x = GetDraggedColumnOffset(columns, dragging_column);
- SetColumnOffset(dragging_column, x);
- }
- }
- columns->IsBeingResized = is_being_resized;
-
- window->DC.ColumnsSet = NULL;
- window->DC.ColumnsOffset.x = 0.0f;
- window->DC.CursorPos.x = (float)(int)(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x);
-}
-
-// [2018-03: This is currently the only public API, while we are working on making BeginColumns/EndColumns user-facing]
-void ImGui::Columns(int columns_count, const char* id, bool border)
-{
- ImGuiWindow* window = GetCurrentWindow();
- IM_ASSERT(columns_count >= 1);
-
- ImGuiColumnsFlags flags = (border ? 0 : ImGuiColumnsFlags_NoBorder);
- //flags |= ImGuiColumnsFlags_NoPreserveWidths; // NB: Legacy behavior
- if (window->DC.ColumnsSet != NULL && window->DC.ColumnsSet->Count == columns_count && window->DC.ColumnsSet->Flags == flags)
- return;
-
- if (window->DC.ColumnsSet != NULL)
- EndColumns();
-
- if (columns_count != 1)
- BeginColumns(id, columns_count, flags);
-}
//-----------------------------------------------------------------------------
// [SECTION] DRAG AND DROP
@@ -8062,7 +8935,7 @@ void ImGui::ClearDragDrop()
ImGuiContext& g = *GImGui;
g.DragDropActive = false;
g.DragDropPayload.Clear();
- g.DragDropAcceptFlags = 0;
+ g.DragDropAcceptFlags = ImGuiDragDropFlags_None;
g.DragDropAcceptIdCurr = g.DragDropAcceptIdPrev = 0;
g.DragDropAcceptIdCurrRectSurface = FLT_MAX;
g.DragDropAcceptFrameCount = -1;
@@ -8081,7 +8954,7 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags)
bool source_drag_active = false;
ImGuiID source_id = 0;
ImGuiID source_parent_id = 0;
- int mouse_button = 0;
+ ImGuiMouseButton mouse_button = ImGuiMouseButton_Left;
if (!(flags & ImGuiDragDropFlags_SourceExtern))
{
source_id = window->DC.LastItemId;
@@ -8100,16 +8973,16 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags)
return false;
}
+ // Early out
+ if ((window->DC.LastItemStatusFlags & ImGuiItemStatusFlags_HoveredRect) == 0 && (g.ActiveId == 0 || g.ActiveIdWindow != window))
+ return false;
+
// Magic fallback (=somehow reprehensible) to handle items with no assigned ID, e.g. Text(), Image()
// We build a throwaway ID based on current ID stack + relative AABB of items in window.
// THE IDENTIFIER WON'T SURVIVE ANY REPOSITIONING OF THE WIDGET, so if your widget moves your dragging operation will be canceled.
// We don't need to maintain/call ClearActiveID() as releasing the button will early out this function and trigger !ActiveIdIsAlive.
- bool is_hovered = (window->DC.LastItemStatusFlags & ImGuiItemStatusFlags_HoveredRect) != 0;
- if (!is_hovered && (g.ActiveId == 0 || g.ActiveIdWindow != window))
- return false;
source_id = window->DC.LastItemId = window->GetIDFromRectangle(window->DC.LastItemRect);
- if (is_hovered)
- SetHoveredID(source_id);
+ bool is_hovered = ItemHoverable(window->DC.LastItemRect, source_id);
if (is_hovered && g.IO.MouseClicked[mouse_button])
{
SetActiveID(source_id, window);
@@ -8130,7 +9003,7 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags)
else
{
window = NULL;
- source_id = ImHash("#SourceExtern", 0);
+ source_id = ImHashStr("#SourceExtern");
source_drag_active = true;
}
@@ -8153,13 +9026,13 @@ bool ImGui::BeginDragDropSource(ImGuiDragDropFlags flags)
if (!(flags & ImGuiDragDropFlags_SourceNoPreviewTooltip))
{
// Target can request the Source to not display its tooltip (we use a dedicated flag to make this request explicit)
- // We unfortunately can't just modify the source flags and skip the call to BeginTooltip, as caller may be emitting contents.
+ // We unfortunately can't just modify the source flags and skip the call to BeginTooltip, as caller may be emitting contents.
BeginTooltip();
- if (g.DragDropActive && g.DragDropAcceptIdPrev && (g.DragDropAcceptFlags & ImGuiDragDropFlags_AcceptNoPreviewTooltip))
+ if (g.DragDropAcceptIdPrev && (g.DragDropAcceptFlags & ImGuiDragDropFlags_AcceptNoPreviewTooltip))
{
ImGuiWindow* tooltip_window = g.CurrentWindow;
tooltip_window->SkipItems = true;
- tooltip_window->HiddenFramesRegular = 1;
+ tooltip_window->HiddenFramesCanSkipItems = 1;
}
}
@@ -8346,9 +9219,13 @@ void ImGui::EndDragDropTarget()
g.DragDropWithinSourceOrTarget = false;
}
+
//-----------------------------------------------------------------------------
// [SECTION] LOGGING/CAPTURING
//-----------------------------------------------------------------------------
+// All text output from the interface can be captured into tty/file/clipboard.
+// By default, tree nodes are automatically opened during logging.
+//-----------------------------------------------------------------------------
// Pass text data straight to log (without being displayed)
void ImGui::LogText(const char* fmt, ...)
@@ -8360,9 +9237,15 @@ void ImGui::LogText(const char* fmt, ...)
va_list args;
va_start(args, fmt);
if (g.LogFile)
- vfprintf(g.LogFile, fmt, args);
+ {
+ g.LogBuffer.Buf.resize(0);
+ g.LogBuffer.appendfv(fmt, args);
+ ImFileWrite(g.LogBuffer.c_str(), sizeof(char), (ImU64)g.LogBuffer.size(), g.LogFile);
+ }
else
- g.LogClipboard.appendfv(fmt, args);
+ {
+ g.LogBuffer.appendfv(fmt, args);
+ }
va_end(args);
}
@@ -8376,17 +9259,20 @@ void ImGui::LogRenderedText(const ImVec2* ref_pos, const char* text, const char*
if (!text_end)
text_end = FindRenderedTextEnd(text, text_end);
- const bool log_new_line = ref_pos && (ref_pos->y > window->DC.LogLinePosY + 1);
+ const bool log_new_line = ref_pos && (ref_pos->y > g.LogLinePosY + 1);
if (ref_pos)
- window->DC.LogLinePosY = ref_pos->y;
+ g.LogLinePosY = ref_pos->y;
+ if (log_new_line)
+ g.LogLineFirstItem = true;
const char* text_remaining = text;
- if (g.LogStartDepth > window->DC.TreeDepth) // Re-adjust padding if we have popped out of our starting depth
- g.LogStartDepth = window->DC.TreeDepth;
- const int tree_depth = (window->DC.TreeDepth - g.LogStartDepth);
+ if (g.LogDepthRef > window->DC.TreeDepth) // Re-adjust padding if we have popped out of our starting depth
+ g.LogDepthRef = window->DC.TreeDepth;
+ const int tree_depth = (window->DC.TreeDepth - g.LogDepthRef);
for (;;)
{
// Split the string. Each new line (after a '\n') is followed by spacing corresponding to the current depth of our log entry.
+ // We don't add a trailing \n to allow a subsequent item on the same line to be captured.
const char* line_start = text_remaining;
const char* line_end = ImStreolRange(line_start, text_end);
const bool is_first_line = (line_start == text);
@@ -8395,9 +9281,18 @@ void ImGui::LogRenderedText(const ImVec2* ref_pos, const char* text, const char*
{
const int char_count = (int)(line_end - line_start);
if (log_new_line || !is_first_line)
- LogText(IM_NEWLINE "%*s%.*s", tree_depth*4, "", char_count, line_start);
+ LogText(IM_NEWLINE "%*s%.*s", tree_depth * 4, "", char_count, line_start);
+ else if (g.LogLineFirstItem)
+ LogText("%*s%.*s", tree_depth * 4, "", char_count, line_start);
else
LogText(" %.*s", char_count, line_start);
+ g.LogLineFirstItem = false;
+ }
+ else if (log_new_line)
+ {
+ // An empty "" string at a different Y position should output a carriage return.
+ LogText(IM_NEWLINE);
+ break;
}
if (is_last_line)
@@ -8406,64 +9301,74 @@ void ImGui::LogRenderedText(const ImVec2* ref_pos, const char* text, const char*
}
}
-// Start logging ImGui output to TTY
-void ImGui::LogToTTY(int max_depth)
+// Start logging/capturing text output
+void ImGui::LogBegin(ImGuiLogType type, int auto_open_depth)
{
ImGuiContext& g = *GImGui;
- if (g.LogEnabled)
- return;
ImGuiWindow* window = g.CurrentWindow;
-
+ IM_ASSERT(g.LogEnabled == false);
IM_ASSERT(g.LogFile == NULL);
- g.LogFile = stdout;
+ IM_ASSERT(g.LogBuffer.empty());
g.LogEnabled = true;
- g.LogStartDepth = window->DC.TreeDepth;
- if (max_depth >= 0)
- g.LogAutoExpandMaxDepth = max_depth;
+ g.LogType = type;
+ g.LogDepthRef = window->DC.TreeDepth;
+ g.LogDepthToExpand = ((auto_open_depth >= 0) ? auto_open_depth : g.LogDepthToExpandDefault);
+ g.LogLinePosY = FLT_MAX;
+ g.LogLineFirstItem = true;
}
-// Start logging ImGui output to given file
-void ImGui::LogToFile(int max_depth, const char* filename)
+void ImGui::LogToTTY(int auto_open_depth)
{
ImGuiContext& g = *GImGui;
if (g.LogEnabled)
return;
- ImGuiWindow* window = g.CurrentWindow;
+ IM_UNUSED(auto_open_depth);
+#ifndef IMGUI_DISABLE_TTY_FUNCTIONS
+ LogBegin(ImGuiLogType_TTY, auto_open_depth);
+ g.LogFile = stdout;
+#endif
+}
+// Start logging/capturing text output to given file
+void ImGui::LogToFile(int auto_open_depth, const char* filename)
+{
+ ImGuiContext& g = *GImGui;
+ if (g.LogEnabled)
+ return;
+
+ // FIXME: We could probably open the file in text mode "at", however note that clipboard/buffer logging will still
+ // be subject to outputting OS-incompatible carriage return if within strings the user doesn't use IM_NEWLINE.
+ // By opening the file in binary mode "ab" we have consistent output everywhere.
if (!filename)
- {
filename = g.IO.LogFilename;
- if (!filename)
- return;
- }
-
- IM_ASSERT(g.LogFile == NULL);
- g.LogFile = ImFileOpen(filename, "ab");
- if (!g.LogFile)
+ if (!filename || !filename[0])
+ return;
+ ImFileHandle f = ImFileOpen(filename, "ab");
+ if (!f)
{
- IM_ASSERT(g.LogFile != NULL); // Consider this an error
+ IM_ASSERT(0);
return;
}
- g.LogEnabled = true;
- g.LogStartDepth = window->DC.TreeDepth;
- if (max_depth >= 0)
- g.LogAutoExpandMaxDepth = max_depth;
+
+ LogBegin(ImGuiLogType_File, auto_open_depth);
+ g.LogFile = f;
}
-// Start logging ImGui output to clipboard
-void ImGui::LogToClipboard(int max_depth)
+// Start logging/capturing text output to clipboard
+void ImGui::LogToClipboard(int auto_open_depth)
{
ImGuiContext& g = *GImGui;
if (g.LogEnabled)
return;
- ImGuiWindow* window = g.CurrentWindow;
+ LogBegin(ImGuiLogType_Clipboard, auto_open_depth);
+}
- IM_ASSERT(g.LogFile == NULL);
- g.LogFile = NULL;
- g.LogEnabled = true;
- g.LogStartDepth = window->DC.TreeDepth;
- if (max_depth >= 0)
- g.LogAutoExpandMaxDepth = max_depth;
+void ImGui::LogToBuffer(int auto_open_depth)
+{
+ ImGuiContext& g = *GImGui;
+ if (g.LogEnabled)
+ return;
+ LogBegin(ImGuiLogType_Buffer, auto_open_depth);
}
void ImGui::LogFinish()
@@ -8473,45 +9378,60 @@ void ImGui::LogFinish()
return;
LogText(IM_NEWLINE);
- if (g.LogFile != NULL)
+ switch (g.LogType)
{
- if (g.LogFile == stdout)
- fflush(g.LogFile);
- else
- fclose(g.LogFile);
- g.LogFile = NULL;
- }
- if (g.LogClipboard.size() > 1)
- {
- SetClipboardText(g.LogClipboard.begin());
- g.LogClipboard.clear();
+ case ImGuiLogType_TTY:
+#ifndef IMGUI_DISABLE_TTY_FUNCTIONS
+ fflush(g.LogFile);
+#endif
+ break;
+ case ImGuiLogType_File:
+ ImFileClose(g.LogFile);
+ break;
+ case ImGuiLogType_Buffer:
+ break;
+ case ImGuiLogType_Clipboard:
+ if (!g.LogBuffer.empty())
+ SetClipboardText(g.LogBuffer.begin());
+ break;
+ case ImGuiLogType_None:
+ IM_ASSERT(0);
+ break;
}
+
g.LogEnabled = false;
+ g.LogType = ImGuiLogType_None;
+ g.LogFile = NULL;
+ g.LogBuffer.clear();
}
// Helper to display logging buttons
+// FIXME-OBSOLETE: We should probably obsolete this and let the user have their own helper (this is one of the oldest function alive!)
void ImGui::LogButtons()
{
ImGuiContext& g = *GImGui;
PushID("LogButtons");
+#ifndef IMGUI_DISABLE_TTY_FUNCTIONS
const bool log_to_tty = Button("Log To TTY"); SameLine();
+#else
+ const bool log_to_tty = false;
+#endif
const bool log_to_file = Button("Log To File"); SameLine();
const bool log_to_clipboard = Button("Log To Clipboard"); SameLine();
- PushItemWidth(80.0f);
PushAllowKeyboardFocus(false);
- SliderInt("Depth", &g.LogAutoExpandMaxDepth, 0, 9, NULL);
+ SetNextItemWidth(80.0f);
+ SliderInt("Default Depth", &g.LogDepthToExpandDefault, 0, 9, NULL);
PopAllowKeyboardFocus();
- PopItemWidth();
PopID();
// Start logging at the end of the function so that the buttons don't appear in the log
if (log_to_tty)
- LogToTTY(g.LogAutoExpandMaxDepth);
+ LogToTTY();
if (log_to_file)
- LogToFile(g.LogAutoExpandMaxDepth, g.IO.LogFilename);
+ LogToFile();
if (log_to_clipboard)
- LogToClipboard(g.LogAutoExpandMaxDepth);
+ LogToClipboard();
}
//-----------------------------------------------------------------------------
@@ -8536,22 +9456,41 @@ void ImGui::MarkIniSettingsDirty(ImGuiWindow* window)
ImGuiWindowSettings* ImGui::CreateNewWindowSettings(const char* name)
{
ImGuiContext& g = *GImGui;
- g.SettingsWindows.push_back(ImGuiWindowSettings());
- ImGuiWindowSettings* settings = &g.SettingsWindows.back();
- settings->Name = ImStrdup(name);
- settings->ID = ImHash(name, 0);
+
+#if !IMGUI_DEBUG_INI_SETTINGS
+ // Skip to the "###" marker if any. We don't skip past to match the behavior of GetID()
+ // Preserve the full string when IMGUI_DEBUG_INI_SETTINGS is set to make .ini inspection easier.
+ if (const char* p = strstr(name, "###"))
+ name = p;
+#endif
+ const size_t name_len = strlen(name);
+
+ // Allocate chunk
+ const size_t chunk_size = sizeof(ImGuiWindowSettings) + name_len + 1;
+ ImGuiWindowSettings* settings = g.SettingsWindows.alloc_chunk(chunk_size);
+ IM_PLACEMENT_NEW(settings) ImGuiWindowSettings();
+ settings->ID = ImHashStr(name, name_len);
+ memcpy(settings->GetName(), name, name_len + 1); // Store with zero terminator
+
return settings;
}
ImGuiWindowSettings* ImGui::FindWindowSettings(ImGuiID id)
{
ImGuiContext& g = *GImGui;
- for (int i = 0; i != g.SettingsWindows.Size; i++)
- if (g.SettingsWindows[i].ID == id)
- return &g.SettingsWindows[i];
+ for (ImGuiWindowSettings* settings = g.SettingsWindows.begin(); settings != NULL; settings = g.SettingsWindows.next_chunk(settings))
+ if (settings->ID == id)
+ return settings;
return NULL;
}
+ImGuiWindowSettings* ImGui::FindOrCreateWindowSettings(const char* name)
+{
+ if (ImGuiWindowSettings* settings = FindWindowSettings(ImHashStr(name)))
+ return settings;
+ return CreateNewWindowSettings(name);
+}
+
void ImGui::LoadIniSettingsFromDisk(const char* ini_filename)
{
size_t file_data_size = 0;
@@ -8559,13 +9498,13 @@ void ImGui::LoadIniSettingsFromDisk(const char* ini_filename)
if (!file_data)
return;
LoadIniSettingsFromMemory(file_data, (size_t)file_data_size);
- ImGui::MemFree(file_data);
+ IM_FREE(file_data);
}
ImGuiSettingsHandler* ImGui::FindSettingsHandler(const char* type_name)
{
ImGuiContext& g = *GImGui;
- const ImGuiID type_hash = ImHash(type_name, 0, 0);
+ const ImGuiID type_hash = ImHashStr(type_name);
for (int handler_n = 0; handler_n < g.SettingsHandlers.Size; handler_n++)
if (g.SettingsHandlers[handler_n].TypeHash == type_hash)
return &g.SettingsHandlers[handler_n];
@@ -8583,7 +9522,7 @@ void ImGui::LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size)
// For our convenience and to make the code simpler, we'll also write zero-terminators within the buffer. So let's create a writable copy..
if (ini_size == 0)
ini_size = strlen(ini_data);
- char* buf = (char*)ImGui::MemAlloc(ini_size + 1);
+ char* buf = (char*)IM_ALLOC(ini_size + 1);
char* buf_end = buf + ini_size;
memcpy(buf, ini_data, ini_size);
buf[ini_size] = 0;
@@ -8609,18 +9548,12 @@ void ImGui::LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size)
line_end[-1] = 0;
const char* name_end = line_end - 1;
const char* type_start = line + 1;
- char* type_end = (char*)(intptr_t)ImStrchrRange(type_start, name_end, ']');
+ char* type_end = (char*)(void*)ImStrchrRange(type_start, name_end, ']');
const char* name_start = type_end ? ImStrchrRange(type_end + 1, name_end, '[') : NULL;
if (!type_end || !name_start)
- {
- name_start = type_start; // Import legacy entries that have no type
- type_start = "Window";
- }
- else
- {
- *type_end = 0; // Overwrite first ']'
- name_start++; // Skip second '['
- }
+ continue;
+ *type_end = 0; // Overwrite first ']'
+ name_start++; // Skip second '['
entry_handler = FindSettingsHandler(type_start);
entry_data = entry_handler ? entry_handler->ReadOpenFn(&g, entry_handler, name_start) : NULL;
}
@@ -8630,7 +9563,7 @@ void ImGui::LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size)
entry_handler->ReadLineFn(&g, entry_handler, entry_data, line);
}
}
- ImGui::MemFree(buf);
+ IM_FREE(buf);
g.SettingsLoaded = true;
}
@@ -8643,11 +9576,11 @@ void ImGui::SaveIniSettingsToDisk(const char* ini_filename)
size_t ini_data_size = 0;
const char* ini_data = SaveIniSettingsToMemory(&ini_data_size);
- FILE* f = ImFileOpen(ini_filename, "wt");
+ ImFileHandle f = ImFileOpen(ini_filename, "wt");
if (!f)
return;
- fwrite(ini_data, sizeof(char), ini_data_size, f);
- fclose(f);
+ ImFileWrite(ini_data, sizeof(char), ini_data_size, f);
+ ImFileClose(f);
}
// Call registered handlers (e.g. SettingsHandlerWindow_WriteAll() + custom handlers) to write their stuff into a text buffer
@@ -8667,70 +9600,80 @@ const char* ImGui::SaveIniSettingsToMemory(size_t* out_size)
return g.SettingsIniData.c_str();
}
-static void* SettingsHandlerWindow_ReadOpen(ImGuiContext*, ImGuiSettingsHandler*, const char* name)
+static void* WindowSettingsHandler_ReadOpen(ImGuiContext*, ImGuiSettingsHandler*, const char* name)
{
- ImGuiWindowSettings* settings = ImGui::FindWindowSettings(ImHash(name, 0));
+ ImGuiWindowSettings* settings = ImGui::FindWindowSettings(ImHashStr(name));
if (!settings)
settings = ImGui::CreateNewWindowSettings(name);
return (void*)settings;
}
-static void SettingsHandlerWindow_ReadLine(ImGuiContext*, ImGuiSettingsHandler*, void* entry, const char* line)
+static void WindowSettingsHandler_ReadLine(ImGuiContext*, ImGuiSettingsHandler*, void* entry, const char* line)
{
ImGuiWindowSettings* settings = (ImGuiWindowSettings*)entry;
- float x, y;
+ int x, y;
int i;
- if (sscanf(line, "Pos=%f,%f", &x, &y) == 2) settings->Pos = ImVec2(x, y);
- else if (sscanf(line, "Size=%f,%f", &x, &y) == 2) settings->Size = ImMax(ImVec2(x, y), GImGui->Style.WindowMinSize);
+ if (sscanf(line, "Pos=%i,%i", &x, &y) == 2) settings->Pos = ImVec2ih((short)x, (short)y);
+ else if (sscanf(line, "Size=%i,%i", &x, &y) == 2) settings->Size = ImVec2ih((short)x, (short)y);
else if (sscanf(line, "Collapsed=%d", &i) == 1) settings->Collapsed = (i != 0);
}
-static void SettingsHandlerWindow_WriteAll(ImGuiContext* imgui_ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* buf)
+static void WindowSettingsHandler_WriteAll(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* buf)
{
// Gather data from windows that were active during this session
// (if a window wasn't opened in this session we preserve its settings)
- ImGuiContext& g = *imgui_ctx;
+ ImGuiContext& g = *ctx;
for (int i = 0; i != g.Windows.Size; i++)
{
ImGuiWindow* window = g.Windows[i];
if (window->Flags & ImGuiWindowFlags_NoSavedSettings)
continue;
- ImGuiWindowSettings* settings = (window->SettingsIdx != -1) ? &g.SettingsWindows[window->SettingsIdx] : ImGui::FindWindowSettings(window->ID);
+ ImGuiWindowSettings* settings = (window->SettingsOffset != -1) ? g.SettingsWindows.ptr_from_offset(window->SettingsOffset) : ImGui::FindWindowSettings(window->ID);
if (!settings)
{
settings = ImGui::CreateNewWindowSettings(window->Name);
- window->SettingsIdx = g.SettingsWindows.index_from_pointer(settings);
+ window->SettingsOffset = g.SettingsWindows.offset_from_ptr(settings);
}
IM_ASSERT(settings->ID == window->ID);
- settings->Pos = window->Pos;
- settings->Size = window->SizeFull;
+ settings->Pos = ImVec2ih((short)window->Pos.x, (short)window->Pos.y);
+ settings->Size = ImVec2ih((short)window->SizeFull.x, (short)window->SizeFull.y);
settings->Collapsed = window->Collapsed;
}
// Write to text buffer
- buf->reserve(buf->size() + g.SettingsWindows.Size * 96); // ballpark reserve
- for (int i = 0; i != g.SettingsWindows.Size; i++)
+ buf->reserve(buf->size() + g.SettingsWindows.size() * 6); // ballpark reserve
+ for (ImGuiWindowSettings* settings = g.SettingsWindows.begin(); settings != NULL; settings = g.SettingsWindows.next_chunk(settings))
{
- const ImGuiWindowSettings* settings = &g.SettingsWindows[i];
- if (settings->Pos.x == FLT_MAX)
- continue;
- const char* name = settings->Name;
- if (const char* p = strstr(name, "###")) // Skip to the "###" marker if any. We don't skip past to match the behavior of GetID()
- name = p;
- buf->appendf("[%s][%s]\n", handler->TypeName, name);
- buf->appendf("Pos=%d,%d\n", (int)settings->Pos.x, (int)settings->Pos.y);
- buf->appendf("Size=%d,%d\n", (int)settings->Size.x, (int)settings->Size.y);
+ const char* settings_name = settings->GetName();
+ buf->appendf("[%s][%s]\n", handler->TypeName, settings_name);
+ buf->appendf("Pos=%d,%d\n", settings->Pos.x, settings->Pos.y);
+ buf->appendf("Size=%d,%d\n", settings->Size.x, settings->Size.y);
buf->appendf("Collapsed=%d\n", settings->Collapsed);
- buf->appendf("\n");
+ buf->append("\n");
}
}
+
+//-----------------------------------------------------------------------------
+// [SECTION] VIEWPORTS, PLATFORM WINDOWS
+//-----------------------------------------------------------------------------
+
+// (this section is filled in the 'docking' branch)
+
+
+//-----------------------------------------------------------------------------
+// [SECTION] DOCKING
+//-----------------------------------------------------------------------------
+
+// (this section is filled in the 'docking' branch)
+
+
//-----------------------------------------------------------------------------
// [SECTION] PLATFORM DEPENDENT HELPERS
//-----------------------------------------------------------------------------
-#if defined(_WIN32) && !defined(_WINDOWS_) && (!defined(IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS) || !defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS))
+#if defined(_WIN32) && !defined(_WINDOWS_) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) && (!defined(IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS) || !defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS))
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
@@ -8739,15 +9682,21 @@ static void SettingsHandlerWindow_WriteAll(ImGuiContext* imgui_ctx, ImGuiSetting
#else
#include <windows.h>
#endif
+#if defined(WINAPI_FAMILY) && (WINAPI_FAMILY == WINAPI_FAMILY_APP) // UWP doesn't have Win32 functions
+#define IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS
+#define IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS
+#endif
+#elif defined(__APPLE__)
+#include <TargetConditionals.h>
#endif
-// Win32 API clipboard implementation
-#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS)
+#if defined(_WIN32) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS)
#ifdef _MSC_VER
#pragma comment(lib, "user32")
#endif
+// Win32 clipboard implementation
static const char* GetClipboardTextFn_DefaultImpl(void*)
{
static ImVector<char> buf_local;
@@ -8791,16 +9740,67 @@ static void SetClipboardTextFn_DefaultImpl(void*, const char* text)
::CloseClipboard();
}
+#elif defined(__APPLE__) && TARGET_OS_OSX && defined(IMGUI_ENABLE_OSX_DEFAULT_CLIPBOARD_FUNCTIONS)
+
+#include <Carbon/Carbon.h> // Use old API to avoid need for separate .mm file
+static PasteboardRef main_clipboard = 0;
+
+// OSX clipboard implementation
+// If you enable this you will need to add '-framework ApplicationServices' to your linker command-line!
+static void SetClipboardTextFn_DefaultImpl(void*, const char* text)
+{
+ if (!main_clipboard)
+ PasteboardCreate(kPasteboardClipboard, &main_clipboard);
+ PasteboardClear(main_clipboard);
+ CFDataRef cf_data = CFDataCreate(kCFAllocatorDefault, (const UInt8*)text, strlen(text));
+ if (cf_data)
+ {
+ PasteboardPutItemFlavor(main_clipboard, (PasteboardItemID)1, CFSTR("public.utf8-plain-text"), cf_data, 0);
+ CFRelease(cf_data);
+ }
+}
+
+static const char* GetClipboardTextFn_DefaultImpl(void*)
+{
+ if (!main_clipboard)
+ PasteboardCreate(kPasteboardClipboard, &main_clipboard);
+ PasteboardSynchronize(main_clipboard);
+
+ ItemCount item_count = 0;
+ PasteboardGetItemCount(main_clipboard, &item_count);
+ for (ItemCount i = 0; i < item_count; i++)
+ {
+ PasteboardItemID item_id = 0;
+ PasteboardGetItemIdentifier(main_clipboard, i + 1, &item_id);
+ CFArrayRef flavor_type_array = 0;
+ PasteboardCopyItemFlavors(main_clipboard, item_id, &flavor_type_array);
+ for (CFIndex j = 0, nj = CFArrayGetCount(flavor_type_array); j < nj; j++)
+ {
+ CFDataRef cf_data;
+ if (PasteboardCopyItemFlavorData(main_clipboard, item_id, CFSTR("public.utf8-plain-text"), &cf_data) == noErr)
+ {
+ static ImVector<char> clipboard_text;
+ int length = (int)CFDataGetLength(cf_data);
+ clipboard_text.resize(length + 1);
+ CFDataGetBytes(cf_data, CFRangeMake(0, length), (UInt8*)clipboard_text.Data);
+ clipboard_text[length] = 0;
+ CFRelease(cf_data);
+ return clipboard_text.Data;
+ }
+ }
+ }
+ return NULL;
+}
+
#else
-// Local ImGui-only clipboard implementation, if user hasn't defined better clipboard handlers
+// Local Dear ImGui-only clipboard implementation, if user hasn't defined better clipboard handlers.
static const char* GetClipboardTextFn_DefaultImpl(void*)
{
ImGuiContext& g = *GImGui;
return g.PrivateClipboard.empty() ? NULL : g.PrivateClipboard.begin();
}
-// Local ImGui-only clipboard implementation, if user hasn't defined better clipboard handlers
static void SetClipboardTextFn_DefaultImpl(void*, const char* text)
{
ImGuiContext& g = *GImGui;
@@ -8814,7 +9814,7 @@ static void SetClipboardTextFn_DefaultImpl(void*, const char* text)
#endif
// Win32 API IME support (for Asian languages, etc.)
-#if defined(_WIN32) && !defined(__GNUC__) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS)
+#if defined(_WIN32) && !defined(__GNUC__) && !defined(IMGUI_DISABLE_WIN32_FUNCTIONS) && !defined(IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS)
#include <imm.h>
#ifdef _MSC_VER
@@ -8824,7 +9824,8 @@ static void SetClipboardTextFn_DefaultImpl(void*, const char* text)
static void ImeSetInputScreenPosFn_DefaultImpl(int x, int y)
{
// Notify OS Input Method Editor of text input position
- if (HWND hwnd = (HWND)GImGui->IO.ImeWindowHandle)
+ ImGuiIO& io = ImGui::GetIO();
+ if (HWND hwnd = (HWND)io.ImeWindowHandle)
if (HIMC himc = ::ImmGetContext(hwnd))
{
COMPOSITIONFORM cf;
@@ -8846,46 +9847,96 @@ static void ImeSetInputScreenPosFn_DefaultImpl(int, int) {}
// [SECTION] METRICS/DEBUG WINDOW
//-----------------------------------------------------------------------------
+#ifndef IMGUI_DISABLE_METRICS_WINDOW
+// Avoid naming collision with imgui_demo.cpp's HelpMarker() for unity builds.
+static void MetricsHelpMarker(const char* desc)
+{
+ ImGui::TextDisabled("(?)");
+ if (ImGui::IsItemHovered())
+ {
+ ImGui::BeginTooltip();
+ ImGui::PushTextWrapPos(ImGui::GetFontSize() * 35.0f);
+ ImGui::TextUnformatted(desc);
+ ImGui::PopTextWrapPos();
+ ImGui::EndTooltip();
+ }
+}
+
void ImGui::ShowMetricsWindow(bool* p_open)
{
- if (!ImGui::Begin("ImGui Metrics", p_open))
+ if (!ImGui::Begin("Dear ImGui Metrics", p_open))
{
ImGui::End();
return;
}
- static bool show_draw_cmd_clip_rects = true;
- static bool show_window_begin_order = false;
+
+ // Debugging enums
+ enum { WRT_OuterRect, WRT_OuterRectClipped, WRT_InnerRect, WRT_InnerClipRect, WRT_WorkRect, WRT_Content, WRT_ContentRegionRect, WRT_Count }; // Windows Rect Type
+ const char* wrt_rects_names[WRT_Count] = { "OuterRect", "OuterRectClipped", "InnerRect", "InnerClipRect", "WorkRect", "Content", "ContentRegionRect" };
+ enum { TRT_OuterRect, TRT_WorkRect, TRT_HostClipRect, TRT_InnerClipRect, TRT_BackgroundClipRect, TRT_ColumnsRect, TRT_ColumnsClipRect, TRT_ColumnsContentHeadersUsed, TRT_ColumnsContentHeadersDesired, TRT_ColumnsContentRowsFrozen, TRT_ColumnsContentRowsUnfrozen, TRT_Count }; // Tables Rect Type
+ const char* trt_rects_names[TRT_Count] = { "OuterRect", "WorkRect", "HostClipRect", "InnerClipRect", "BackgroundClipRect", "ColumnsRect", "ColumnsClipRect", "ColumnsContentHeadersUsed", "ColumnsContentHeadersDesired", "ColumnsContentRowsFrozen", "ColumnsContentRowsUnfrozen" };
+
+ // State
+ static bool show_windows_rects = false;
+ static int show_windows_rect_type = WRT_WorkRect;
+ static bool show_windows_begin_order = false;
+ static bool show_tables_rects = false;
+ static int show_tables_rect_type = TRT_WorkRect;
+ static bool show_drawcmd_details = true;
+
+ // Basic info
+ ImGuiContext& g = *GImGui;
ImGuiIO& io = ImGui::GetIO();
ImGui::Text("Dear ImGui %s", ImGui::GetVersion());
ImGui::Text("Application average %.3f ms/frame (%.1f FPS)", 1000.0f / io.Framerate, io.Framerate);
ImGui::Text("%d vertices, %d indices (%d triangles)", io.MetricsRenderVertices, io.MetricsRenderIndices, io.MetricsRenderIndices / 3);
ImGui::Text("%d active windows (%d visible)", io.MetricsActiveWindows, io.MetricsRenderWindows);
- ImGui::Text("%d allocations", io.MetricsActiveAllocations);
- ImGui::Checkbox("Show clipping rectangles when hovering draw commands", &show_draw_cmd_clip_rects);
- ImGui::Checkbox("Ctrl shows window begin order", &show_window_begin_order);
-
+ ImGui::Text("%d active allocations", io.MetricsActiveAllocations);
ImGui::Separator();
+ // Helper functions to display common structures:
+ // - NodeDrawList()
+ // - NodeColumns()
+ // - NodeWindow()
+ // - NodeWindows()
+ // - NodeTabBar()
+ // - NodeStorage()
struct Funcs
{
+ static ImRect GetWindowRect(ImGuiWindow* window, int rect_type)
+ {
+ if (rect_type == WRT_OuterRect) { return window->Rect(); }
+ else if (rect_type == WRT_OuterRectClipped) { return window->OuterRectClipped; }
+ else if (rect_type == WRT_InnerRect) { return window->InnerRect; }
+ else if (rect_type == WRT_InnerClipRect) { return window->InnerClipRect; }
+ else if (rect_type == WRT_WorkRect) { return window->WorkRect; }
+ else if (rect_type == WRT_Content) { ImVec2 min = window->InnerRect.Min - window->Scroll + window->WindowPadding; return ImRect(min, min + window->ContentSize); }
+ else if (rect_type == WRT_ContentRegionRect) { return window->ContentRegionRect; }
+ IM_ASSERT(0);
+ return ImRect();
+ }
+
static void NodeDrawList(ImGuiWindow* window, ImDrawList* draw_list, const char* label)
{
bool node_open = ImGui::TreeNode(draw_list, "%s: '%s' %d vtx, %d indices, %d cmds", label, draw_list->_OwnerName ? draw_list->_OwnerName : "", draw_list->VtxBuffer.Size, draw_list->IdxBuffer.Size, draw_list->CmdBuffer.Size);
if (draw_list == ImGui::GetWindowDrawList())
{
ImGui::SameLine();
- ImGui::TextColored(ImColor(255,100,100), "CURRENTLY APPENDING"); // Can't display stats for active draw list! (we don't have the data double-buffered)
+ ImGui::TextColored(ImVec4(1.0f,0.4f,0.4f,1.0f), "CURRENTLY APPENDING"); // Can't display stats for active draw list! (we don't have the data double-buffered)
if (node_open) ImGui::TreePop();
return;
}
- ImDrawList* overlay_draw_list = GetOverlayDrawList(); // Render additional visuals into the top-most draw list
+ ImDrawList* fg_draw_list = GetForegroundDrawList(window); // Render additional visuals into the top-most draw list
if (window && IsItemHovered())
- overlay_draw_list->AddRect(window->Pos, window->Pos + window->Size, IM_COL32(255, 255, 0, 255));
+ fg_draw_list->AddRect(window->Pos, window->Pos + window->Size, IM_COL32(255, 255, 0, 255));
if (!node_open)
return;
- int elem_offset = 0;
+ if (window && !window->WasActive)
+ ImGui::TextDisabled("Warning: owning Window is inactive. This DrawList is not being rendered!");
+
+ unsigned int elem_offset = 0;
for (const ImDrawCmd* pcmd = draw_list->CmdBuffer.begin(); pcmd < draw_list->CmdBuffer.end(); elem_offset += pcmd->ElemCount, pcmd++)
{
if (pcmd->UserCallback == NULL && pcmd->ElemCount == 0)
@@ -8895,41 +9946,78 @@ void ImGui::ShowMetricsWindow(bool* p_open)
ImGui::BulletText("Callback %p, user_data %p", pcmd->UserCallback, pcmd->UserCallbackData);
continue;
}
+
ImDrawIdx* idx_buffer = (draw_list->IdxBuffer.Size > 0) ? draw_list->IdxBuffer.Data : NULL;
- bool pcmd_node_open = ImGui::TreeNode((void*)(pcmd - draw_list->CmdBuffer.begin()), "Draw %4d %s vtx, tex 0x%p, clip_rect (%4.0f,%4.0f)-(%4.0f,%4.0f)", pcmd->ElemCount, draw_list->IdxBuffer.Size > 0 ? "indexed" : "non-indexed", pcmd->TextureId, pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w);
- if (show_draw_cmd_clip_rects && ImGui::IsItemHovered())
+ char buf[300];
+ ImFormatString(buf, IM_ARRAYSIZE(buf), "DrawCmd: %4d triangles, Tex 0x%p, ClipRect (%4.0f,%4.0f)-(%4.0f,%4.0f)",
+ pcmd->ElemCount/3, (void*)(intptr_t)pcmd->TextureId,
+ pcmd->ClipRect.x, pcmd->ClipRect.y, pcmd->ClipRect.z, pcmd->ClipRect.w);
+ bool pcmd_node_open = ImGui::TreeNode((void*)(pcmd - draw_list->CmdBuffer.begin()), "%s", buf);
+ if (show_drawcmd_details && fg_draw_list && ImGui::IsItemHovered())
{
ImRect clip_rect = pcmd->ClipRect;
- ImRect vtxs_rect;
- for (int i = elem_offset; i < elem_offset + (int)pcmd->ElemCount; i++)
+ ImRect vtxs_rect(FLT_MAX, FLT_MAX, -FLT_MAX, -FLT_MAX);
+ for (unsigned int i = elem_offset; i < elem_offset + (int)pcmd->ElemCount; i++)
vtxs_rect.Add(draw_list->VtxBuffer[idx_buffer ? idx_buffer[i] : i].pos);
- clip_rect.Floor(); overlay_draw_list->AddRect(clip_rect.Min, clip_rect.Max, IM_COL32(255,255,0,255));
- vtxs_rect.Floor(); overlay_draw_list->AddRect(vtxs_rect.Min, vtxs_rect.Max, IM_COL32(255,0,255,255));
+ fg_draw_list->AddRect(ImFloor(clip_rect.Min), ImFloor(clip_rect.Max), IM_COL32(255,0,255,255));
+ fg_draw_list->AddRect(ImFloor(vtxs_rect.Min), ImFloor(vtxs_rect.Max), IM_COL32(255,255,0,255));
}
if (!pcmd_node_open)
continue;
+ // Calculate approximate coverage area (touched pixel count)
+ // This will be in pixels squared as long there's no post-scaling happening to the renderer output.
+ float total_area = 0.0f;
+ for (unsigned int base_idx = elem_offset; base_idx < (elem_offset + pcmd->ElemCount); base_idx += 3)
+ {
+ ImVec2 triangle[3];
+ for (int n = 0; n < 3; n++)
+ triangle[n] = draw_list->VtxBuffer[idx_buffer ? idx_buffer[base_idx + n] : (base_idx + n)].pos;
+ total_area += ImTriangleArea(triangle[0], triangle[1], triangle[2]);
+ }
+
+ // Display vertex information summary. Hover to get all triangles drawn in wire-frame
+ ImFormatString(buf, IM_ARRAYSIZE(buf), "Mesh: ElemCount: %d, VtxOffset: +%d, IdxOffset: +%d, Area: ~%0.f px", pcmd->ElemCount, pcmd->VtxOffset, pcmd->IdxOffset, total_area);
+ ImGui::Selectable(buf);
+ if (fg_draw_list && ImGui::IsItemHovered() && show_drawcmd_details)
+ {
+ // Draw wire-frame version of everything
+ ImDrawListFlags backup_flags = fg_draw_list->Flags;
+ fg_draw_list->Flags &= ~ImDrawListFlags_AntiAliasedLines; // Disable AA on triangle outlines is more readable for very large and thin triangles.
+ ImRect clip_rect = pcmd->ClipRect;
+ fg_draw_list->AddRect(ImFloor(clip_rect.Min), ImFloor(clip_rect.Max), IM_COL32(255, 0, 255, 255));
+ for (unsigned int base_idx = elem_offset; base_idx < (elem_offset + pcmd->ElemCount); base_idx += 3)
+ {
+ ImVec2 triangle[3];
+ for (int n = 0; n < 3; n++)
+ triangle[n] = draw_list->VtxBuffer[idx_buffer ? idx_buffer[base_idx + n] : (base_idx + n)].pos;
+ fg_draw_list->AddPolyline(triangle, 3, IM_COL32(255, 255, 0, 255), true, 1.0f);
+ }
+ fg_draw_list->Flags = backup_flags;
+ }
+
// Display individual triangles/vertices. Hover on to get the corresponding triangle highlighted.
ImGuiListClipper clipper(pcmd->ElemCount/3); // Manually coarse clip our print out of individual vertices to save CPU, only items that may be visible.
while (clipper.Step())
- for (int prim = clipper.DisplayStart, vtx_i = elem_offset + clipper.DisplayStart*3; prim < clipper.DisplayEnd; prim++)
+ for (int prim = clipper.DisplayStart, idx_i = elem_offset + clipper.DisplayStart*3; prim < clipper.DisplayEnd; prim++)
{
- char buf[300];
char *buf_p = buf, *buf_end = buf + IM_ARRAYSIZE(buf);
- ImVec2 triangles_pos[3];
- for (int n = 0; n < 3; n++, vtx_i++)
+ ImVec2 triangle[3];
+ for (int n = 0; n < 3; n++, idx_i++)
{
- ImDrawVert& v = draw_list->VtxBuffer[idx_buffer ? idx_buffer[vtx_i] : vtx_i];
- triangles_pos[n] = v.pos;
- buf_p += ImFormatString(buf_p, (int)(buf_end - buf_p), "%s %04d: pos (%8.2f,%8.2f), uv (%.6f,%.6f), col %08X\n", (n == 0) ? "vtx" : " ", vtx_i, v.pos.x, v.pos.y, v.uv.x, v.uv.y, v.col);
+ ImDrawVert& v = draw_list->VtxBuffer[idx_buffer ? idx_buffer[idx_i] : idx_i];
+ triangle[n] = v.pos;
+ buf_p += ImFormatString(buf_p, buf_end - buf_p, "%s %04d: pos (%8.2f,%8.2f), uv (%.6f,%.6f), col %08X\n",
+ (n == 0) ? "Vert:" : " ", idx_i, v.pos.x, v.pos.y, v.uv.x, v.uv.y, v.col);
}
+
ImGui::Selectable(buf, false);
- if (ImGui::IsItemHovered())
+ if (fg_draw_list && ImGui::IsItemHovered())
{
- ImDrawListFlags backup_flags = overlay_draw_list->Flags;
- overlay_draw_list->Flags &= ~ImDrawListFlags_AntiAliasedLines; // Disable AA on triangle outlines at is more readable for very large and thin triangles.
- overlay_draw_list->AddPolyline(triangles_pos, 3, IM_COL32(255,255,0,255), true, 1.0f);
- overlay_draw_list->Flags = backup_flags;
+ ImDrawListFlags backup_flags = fg_draw_list->Flags;
+ fg_draw_list->Flags &= ~ImDrawListFlags_AntiAliasedLines; // Disable AA on triangle outlines is more readable for very large and thin triangles.
+ fg_draw_list->AddPolyline(triangle, 3, IM_COL32(255,255,0,255), true, 1.0f);
+ fg_draw_list->Flags = backup_flags;
}
}
ImGui::TreePop();
@@ -8937,29 +10025,51 @@ void ImGui::ShowMetricsWindow(bool* p_open)
ImGui::TreePop();
}
+ static void NodeColumns(const ImGuiColumns* columns)
+ {
+ if (!ImGui::TreeNode((void*)(uintptr_t)columns->ID, "Columns Id: 0x%08X, Count: %d, Flags: 0x%04X", columns->ID, columns->Count, columns->Flags))
+ return;
+ ImGui::BulletText("Width: %.1f (MinX: %.1f, MaxX: %.1f)", columns->OffMaxX - columns->OffMinX, columns->OffMinX, columns->OffMaxX);
+ for (int column_n = 0; column_n < columns->Columns.Size; column_n++)
+ ImGui::BulletText("Column %02d: OffsetNorm %.3f (= %.1f px)", column_n, columns->Columns[column_n].OffsetNorm, GetColumnOffsetFromNorm(columns, columns->Columns[column_n].OffsetNorm));
+ ImGui::TreePop();
+ }
+
static void NodeWindows(ImVector<ImGuiWindow*>& windows, const char* label)
{
if (!ImGui::TreeNode(label, "%s (%d)", label, windows.Size))
return;
for (int i = 0; i < windows.Size; i++)
+ {
+ ImGui::PushID(windows[i]);
Funcs::NodeWindow(windows[i], "Window");
+ ImGui::PopID();
+ }
ImGui::TreePop();
}
static void NodeWindow(ImGuiWindow* window, const char* label)
{
- if (!ImGui::TreeNode(window, "%s '%s', %d @ 0x%p", label, window->Name, window->Active || window->WasActive, window))
+ if (window == NULL)
+ {
+ ImGui::BulletText("%s: NULL", label);
+ return;
+ }
+ bool open = ImGui::TreeNode(label, "%s '%s', %d @ 0x%p", label, window->Name, (window->Active || window->WasActive), window);
+ if (ImGui::IsItemHovered() && window->WasActive)
+ ImGui::GetForegroundDrawList()->AddRect(window->Pos, window->Pos + window->Size, IM_COL32(255, 255, 0, 255));
+ if (!open)
return;
ImGuiWindowFlags flags = window->Flags;
NodeDrawList(window, window->DrawList, "DrawList");
- ImGui::BulletText("Pos: (%.1f,%.1f), Size: (%.1f,%.1f), SizeContents (%.1f,%.1f)", window->Pos.x, window->Pos.y, window->Size.x, window->Size.y, window->SizeContents.x, window->SizeContents.y);
+ ImGui::BulletText("Pos: (%.1f,%.1f), Size: (%.1f,%.1f), ContentSize (%.1f,%.1f)", window->Pos.x, window->Pos.y, window->Size.x, window->Size.y, window->ContentSize.x, window->ContentSize.y);
ImGui::BulletText("Flags: 0x%08X (%s%s%s%s%s%s%s%s%s..)", flags,
(flags & ImGuiWindowFlags_ChildWindow) ? "Child " : "", (flags & ImGuiWindowFlags_Tooltip) ? "Tooltip " : "", (flags & ImGuiWindowFlags_Popup) ? "Popup " : "",
(flags & ImGuiWindowFlags_Modal) ? "Modal " : "", (flags & ImGuiWindowFlags_ChildMenu) ? "ChildMenu " : "", (flags & ImGuiWindowFlags_NoSavedSettings) ? "NoSavedSettings " : "",
(flags & ImGuiWindowFlags_NoMouseInputs)? "NoMouseInputs":"", (flags & ImGuiWindowFlags_NoNavInputs) ? "NoNavInputs" : "", (flags & ImGuiWindowFlags_AlwaysAutoResize) ? "AlwaysAutoResize" : "");
- ImGui::BulletText("Scroll: (%.2f/%.2f,%.2f/%.2f)", window->Scroll.x, GetWindowScrollMaxX(window), window->Scroll.y, GetWindowScrollMaxY(window));
+ ImGui::BulletText("Scroll: (%.2f/%.2f,%.2f/%.2f) Scrollbar:%s%s", window->Scroll.x, window->ScrollMax.x, window->Scroll.y, window->ScrollMax.y, window->ScrollbarX ? "X" : "", window->ScrollbarY ? "Y" : "");
ImGui::BulletText("Active: %d/%d, WriteAccessed: %d, BeginOrderWithinContext: %d", window->Active, window->WasActive, window->WriteAccessed, (window->Active || window->WasActive) ? window->BeginOrderWithinContext : -1);
- ImGui::BulletText("Appearing: %d, Hidden: %d (Reg %d Resize %d), SkipItems: %d", window->Appearing, window->Hidden, window->HiddenFramesRegular, window->HiddenFramesForResize, window->SkipItems);
+ ImGui::BulletText("Appearing: %d, Hidden: %d (CanSkip %d Cannot %d), SkipItems: %d", window->Appearing, window->Hidden, window->HiddenFramesCanSkipItems, window->HiddenFramesCannotSkipItems, window->SkipItems);
ImGui::BulletText("NavLastIds: 0x%08X,0x%08X, NavLayerActiveMask: %X", window->NavLastIds[0], window->NavLastIds[1], window->DC.NavLayerActiveMask);
ImGui::BulletText("NavLastChildNavWindow: %s", window->NavLastChildNavWindow ? window->NavLastChildNavWindow->Name : "NULL");
if (!window->NavRectRel[0].IsInverted())
@@ -8972,32 +10082,58 @@ void ImGui::ShowMetricsWindow(bool* p_open)
if (window->ColumnsStorage.Size > 0 && ImGui::TreeNode("Columns", "Columns sets (%d)", window->ColumnsStorage.Size))
{
for (int n = 0; n < window->ColumnsStorage.Size; n++)
+ NodeColumns(&window->ColumnsStorage[n]);
+ ImGui::TreePop();
+ }
+ NodeStorage(&window->StateStorage, "Storage");
+ ImGui::TreePop();
+ }
+
+ static void NodeTabBar(ImGuiTabBar* tab_bar)
+ {
+ // Standalone tab bars (not associated to docking/windows functionality) currently hold no discernible strings.
+ char buf[256];
+ char* p = buf;
+ const char* buf_end = buf + IM_ARRAYSIZE(buf);
+ p += ImFormatString(p, buf_end - p, "TabBar (%d tabs)%s", tab_bar->Tabs.Size, (tab_bar->PrevFrameVisible < ImGui::GetFrameCount() - 2) ? " *Inactive*" : "");
+ if (ImGui::TreeNode(tab_bar, "%s", buf))
+ {
+ for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++)
{
- const ImGuiColumnsSet* columns = &window->ColumnsStorage[n];
- if (ImGui::TreeNode((void*)(uintptr_t)columns->ID, "Columns Id: 0x%08X, Count: %d, Flags: 0x%04X", columns->ID, columns->Count, columns->Flags))
- {
- ImGui::BulletText("Width: %.1f (MinX: %.1f, MaxX: %.1f)", columns->MaxX - columns->MinX, columns->MinX, columns->MaxX);
- for (int column_n = 0; column_n < columns->Columns.Size; column_n++)
- ImGui::BulletText("Column %02d: OffsetNorm %.3f (= %.1f px)", column_n, columns->Columns[column_n].OffsetNorm, OffsetNormToPixels(columns, columns->Columns[column_n].OffsetNorm));
- ImGui::TreePop();
- }
+ const ImGuiTabItem* tab = &tab_bar->Tabs[tab_n];
+ ImGui::PushID(tab);
+ if (ImGui::SmallButton("<")) { TabBarQueueChangeTabOrder(tab_bar, tab, -1); } ImGui::SameLine(0, 2);
+ if (ImGui::SmallButton(">")) { TabBarQueueChangeTabOrder(tab_bar, tab, +1); } ImGui::SameLine();
+ ImGui::Text("%02d%c Tab 0x%08X '%s'", tab_n, (tab->ID == tab_bar->SelectedTabId) ? '*' : ' ', tab->ID, (tab->NameOffset != -1) ? tab_bar->GetTabName(tab) : "");
+ ImGui::PopID();
}
ImGui::TreePop();
}
- ImGui::BulletText("Storage: %d bytes", window->StateStorage.Data.Size * (int)sizeof(ImGuiStorage::Pair));
+ }
+
+ static void NodeStorage(ImGuiStorage* storage, const char* label)
+ {
+ if (!ImGui::TreeNode(label, "%s: %d entries, %d bytes", label, storage->Data.Size, storage->Data.size_in_bytes()))
+ return;
+ for (int n = 0; n < storage->Data.Size; n++)
+ {
+ const ImGuiStorage::ImGuiStoragePair& p = storage->Data[n];
+ ImGui::BulletText("Key 0x%08X Value { i: %d }", p.key, p.val_i); // Important: we currently don't store a type, real value may not be integer.
+ }
ImGui::TreePop();
}
};
- // Access private state, we are going to display the draw lists from last frame
- ImGuiContext& g = *GImGui;
Funcs::NodeWindows(g.Windows, "Windows");
- if (ImGui::TreeNode("DrawList", "Active DrawLists (%d)", g.DrawDataBuilder.Layers[0].Size))
+ //Funcs::NodeWindows(g.WindowsFocusOrder, "WindowsFocusOrder");
+ if (ImGui::TreeNode("DrawLists", "Active DrawLists (%d)", g.DrawDataBuilder.Layers[0].Size))
{
for (int i = 0; i < g.DrawDataBuilder.Layers[0].Size; i++)
Funcs::NodeDrawList(NULL, g.DrawDataBuilder.Layers[0][i], "DrawList");
ImGui::TreePop();
}
+
+ // Details for Popups
if (ImGui::TreeNode("Popups", "Popups (%d)", g.OpenPopupStack.Size))
{
for (int i = 0; i < g.OpenPopupStack.Size; i++)
@@ -9007,6 +10143,37 @@ void ImGui::ShowMetricsWindow(bool* p_open)
}
ImGui::TreePop();
}
+
+ // Details for TabBars
+ if (ImGui::TreeNode("TabBars", "Tab Bars (%d)", g.TabBars.GetSize()))
+ {
+ for (int n = 0; n < g.TabBars.GetSize(); n++)
+ Funcs::NodeTabBar(g.TabBars.GetByIndex(n));
+ ImGui::TreePop();
+ }
+
+ // Details for Tables
+ IM_UNUSED(trt_rects_names);
+ IM_UNUSED(show_tables_rects);
+ IM_UNUSED(show_tables_rect_type);
+#ifdef IMGUI_HAS_TABLE
+ if (ImGui::TreeNode("Tables", "Tables (%d)", g.Tables.GetSize()))
+ {
+ for (int n = 0; n < g.Tables.GetSize(); n++)
+ Funcs::NodeTable(g.Tables.GetByIndex(n));
+ ImGui::TreePop();
+ }
+#endif // #define IMGUI_HAS_TABLE
+
+ // Details for Docking
+#ifdef IMGUI_HAS_DOCK
+ if (ImGui::TreeNode("Docking"))
+ {
+ ImGui::TreePop();
+ }
+#endif // #define IMGUI_HAS_DOCK
+
+ // Misc Details
if (ImGui::TreeNode("Internal state"))
{
const char* input_source_names[] = { "None", "Mouse", "Nav", "NavKeyboard", "NavGamepad" }; IM_ASSERT(IM_ARRAYSIZE(input_source_names) == ImGuiInputSource_COUNT);
@@ -9027,25 +10194,87 @@ void ImGui::ShowMetricsWindow(bool* p_open)
ImGui::TreePop();
}
+ // Tools
+ if (ImGui::TreeNode("Tools"))
+ {
+ // The Item Picker tool is super useful to visually select an item and break into the call-stack of where it was submitted.
+ if (ImGui::Button("Item Picker.."))
+ ImGui::DebugStartItemPicker();
+ ImGui::SameLine();
+ MetricsHelpMarker("Will call the IM_DEBUG_BREAK() macro to break in debugger.\nWarning: If you don't have a debugger attached, this will probably crash.");
+
+ ImGui::Checkbox("Show windows begin order", &show_windows_begin_order);
+ ImGui::Checkbox("Show windows rectangles", &show_windows_rects);
+ ImGui::SameLine();
+ ImGui::SetNextItemWidth(ImGui::GetFontSize() * 12);
+ show_windows_rects |= ImGui::Combo("##show_windows_rect_type", &show_windows_rect_type, wrt_rects_names, WRT_Count, WRT_Count);
+ if (show_windows_rects && g.NavWindow)
+ {
+ ImGui::BulletText("'%s':", g.NavWindow->Name);
+ ImGui::Indent();
+ for (int rect_n = 0; rect_n < WRT_Count; rect_n++)
+ {
+ ImRect r = Funcs::GetWindowRect(g.NavWindow, rect_n);
+ ImGui::Text("(%6.1f,%6.1f) (%6.1f,%6.1f) Size (%6.1f,%6.1f) %s", r.Min.x, r.Min.y, r.Max.x, r.Max.y, r.GetWidth(), r.GetHeight(), wrt_rects_names[rect_n]);
+ }
+ ImGui::Unindent();
+ }
+ ImGui::Checkbox("Show details when hovering ImDrawCmd node", &show_drawcmd_details);
+ ImGui::TreePop();
+ }
- if (g.IO.KeyCtrl && show_window_begin_order)
+ // Overlay: Display windows Rectangles and Begin Order
+ if (show_windows_rects || show_windows_begin_order)
{
for (int n = 0; n < g.Windows.Size; n++)
{
ImGuiWindow* window = g.Windows[n];
- if ((window->Flags & ImGuiWindowFlags_ChildWindow) || !window->WasActive)
+ if (!window->WasActive)
continue;
- char buf[32];
- ImFormatString(buf, IM_ARRAYSIZE(buf), "%d", window->BeginOrderWithinContext);
- float font_size = ImGui::GetFontSize() * 2;
- ImDrawList* overlay_draw_list = GetOverlayDrawList();
- overlay_draw_list->AddRectFilled(window->Pos, window->Pos + ImVec2(font_size, font_size), IM_COL32(200, 100, 100, 255));
- overlay_draw_list->AddText(NULL, font_size, window->Pos, IM_COL32(255, 255, 255, 255), buf);
+ ImDrawList* draw_list = GetForegroundDrawList(window);
+ if (show_windows_rects)
+ {
+ ImRect r = Funcs::GetWindowRect(window, show_windows_rect_type);
+ draw_list->AddRect(r.Min, r.Max, IM_COL32(255, 0, 128, 255));
+ }
+ if (show_windows_begin_order && !(window->Flags & ImGuiWindowFlags_ChildWindow))
+ {
+ char buf[32];
+ ImFormatString(buf, IM_ARRAYSIZE(buf), "%d", window->BeginOrderWithinContext);
+ float font_size = ImGui::GetFontSize();
+ draw_list->AddRectFilled(window->Pos, window->Pos + ImVec2(font_size, font_size), IM_COL32(200, 100, 100, 255));
+ draw_list->AddText(window->Pos, IM_COL32(255, 255, 255, 255), buf);
+ }
+ }
+ }
+
+#ifdef IMGUI_HAS_TABLE
+ // Overlay: Display Tables Rectangles
+ if (show_tables_rects)
+ {
+ for (int table_n = 0; table_n < g.Tables.GetSize(); table_n++)
+ {
+ ImGuiTable* table = g.Tables.GetByIndex(table_n);
}
}
+#endif // #define IMGUI_HAS_TABLE
+
+#ifdef IMGUI_HAS_DOCK
+ // Overlay: Display Docking info
+ if (show_docking_nodes && g.IO.KeyCtrl)
+ {
+ }
+#endif // #define IMGUI_HAS_DOCK
+
ImGui::End();
}
+#else
+
+void ImGui::ShowMetricsWindow(bool*) { }
+
+#endif
+
//-----------------------------------------------------------------------------
// Include imgui_user.inl at the end of imgui.cpp to access private data/functions that aren't exposed.
@@ -9055,3 +10284,5 @@ void ImGui::ShowMetricsWindow(bool* p_open)
#endif
//-----------------------------------------------------------------------------
+
+#endif // #ifndef IMGUI_DISABLE
diff --git a/src/imgui/imgui.h b/src/imgui/imgui.h
index 90cde6304..c2bbb7f71 100644
--- a/src/imgui/imgui.h
+++ b/src/imgui/imgui.h
@@ -1,14 +1,43 @@
-// dear imgui, v1.66 WIP
+// dear imgui, v1.75
// (headers)
-// See imgui.cpp file for documentation.
-// Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp for demo code.
-// Read 'Programmer guide' in imgui.cpp for notes on how to setup ImGui in your codebase.
-// Get latest version at https://github.com/ocornut/imgui
+// Help:
+// - Read FAQ at http://dearimgui.org/faq
+// - Newcomers, read 'Programmer guide' in imgui.cpp for notes on how to setup Dear ImGui in your codebase.
+// - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp for demo code. All applications in examples/ are doing that.
+// Read imgui.cpp for more details, documentation and comments.
+
+// Resources:
+// - FAQ http://dearimgui.org/faq
+// - Homepage & latest https://github.com/ocornut/imgui
+// - Releases & changelog https://github.com/ocornut/imgui/releases
+// - Gallery https://github.com/ocornut/imgui/issues/2847 (please post your screenshots/video there!)
+// - Glossary https://github.com/ocornut/imgui/wiki/Glossary
+// - Wiki https://github.com/ocornut/imgui/wiki
+// - Issues & support https://github.com/ocornut/imgui/issues
+
+/*
+
+Index of this file:
+// Header mess
+// Forward declarations and basic types
+// ImGui API (Dear ImGui end-user API)
+// Flags & Enumerations
+// Memory allocations macros
+// ImVector<>
+// ImGuiStyle
+// ImGuiIO
+// Misc data structures (ImGuiInputTextCallbackData, ImGuiSizeCallbackData, ImGuiPayload)
+// Obsolete functions
+// Helpers (ImGuiOnceUponAFrame, ImGuiTextFilter, ImGuiTextBuffer, ImGuiStorage, ImGuiListClipper, ImColor)
+// Draw List API (ImDrawCallback, ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListSplitter, ImDrawListFlags, ImDrawList, ImDrawData)
+// Font API (ImFontConfig, ImFontGlyph, ImFontGlyphRangesBuilder, ImFontAtlasFlags, ImFontAtlas, ImFont)
+
+*/
#pragma once
-// Configuration file (edit imconfig.h or define IMGUI_USER_CONFIG to set your own filename)
+// Configuration file with compile-time options (edit imconfig.h or #define IMGUI_USER_CONFIG to your own filename)
#ifdef IMGUI_USER_CONFIG
#include IMGUI_USER_CONFIG
#endif
@@ -16,19 +45,27 @@
#include "imconfig.h"
#endif
-#include <float.h> // FLT_MAX
-#include <stdarg.h> // va_list
+#ifndef IMGUI_DISABLE
+
+//-----------------------------------------------------------------------------
+// Header mess
+//-----------------------------------------------------------------------------
+
+// Includes
+#include <float.h> // FLT_MIN, FLT_MAX
+#include <stdarg.h> // va_list, va_start, va_end
#include <stddef.h> // ptrdiff_t, NULL
#include <string.h> // memset, memmove, memcpy, strlen, strchr, strcpy, strcmp
// Version
-// (Integer encoded as XYYZZ for use in #if preprocessor conditionals. Work in progress versions typically starts at XYY00 then bounced up to XYY01 when release tagging happens)
-#define IMGUI_VERSION "1.66 WIP"
-#define IMGUI_VERSION_NUM 16600
-#define IMGUI_CHECKVERSION() ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert))
+// (Integer encoded as XYYZZ for use in #if preprocessor conditionals. Work in progress versions typically starts at XYY99 then bounce up to XYY00, XYY01 etc. when release tagging happens)
+#define IMGUI_VERSION "1.75"
+#define IMGUI_VERSION_NUM 17500
+#define IMGUI_CHECKVERSION() ImGui::DebugCheckVersionAndDataLayout(IMGUI_VERSION, sizeof(ImGuiIO), sizeof(ImGuiStyle), sizeof(ImVec2), sizeof(ImVec4), sizeof(ImDrawVert), sizeof(ImDrawIdx))
// Define attributes of all API symbols declarations (e.g. for DLL under Windows)
// IMGUI_API is used for core imgui functions, IMGUI_IMPL_API is used for the default bindings files (imgui_impl_xxx.h)
+// Using dear imgui via a shared library is not recommended, because of function call overhead and because we don't guarantee backward nor forward ABI compatibility.
#ifndef IMGUI_API
#define IMGUI_API
#endif
@@ -36,44 +73,59 @@
#define IMGUI_IMPL_API IMGUI_API
#endif
-// Helpers
+// Helper Macros
#ifndef IM_ASSERT
#include <assert.h>
#define IM_ASSERT(_EXPR) assert(_EXPR) // You can override the default assert handler by editing imconfig.h
#endif
-#if defined(__clang__) || defined(__GNUC__)
-#define IM_FMTARGS(FMT) __attribute__((format(printf, FMT, FMT+1))) // Apply printf-style warnings to user functions.
+#if !defined(IMGUI_USE_STB_SPRINTF) && (defined(__clang__) || defined(__GNUC__))
+#define IM_FMTARGS(FMT) __attribute__((format(printf, FMT, FMT+1))) // To apply printf-style warnings to our functions.
#define IM_FMTLIST(FMT) __attribute__((format(printf, FMT, 0)))
#else
#define IM_FMTARGS(FMT)
#define IM_FMTLIST(FMT)
#endif
-#define IM_ARRAYSIZE(_ARR) ((int)(sizeof(_ARR)/sizeof(*_ARR))) // Size of a static C-style array. Don't use on pointers!
-#define IM_OFFSETOF(_TYPE,_MEMBER) ((size_t)&(((_TYPE*)0)->_MEMBER)) // Offset of _MEMBER within _TYPE. Standardized as offsetof() in modern C++.
+#define IM_ARRAYSIZE(_ARR) ((int)(sizeof(_ARR) / sizeof(*_ARR))) // Size of a static C-style array. Don't use on pointers!
+#define IM_UNUSED(_VAR) ((void)_VAR) // Used to silence "unused variable warnings". Often useful as asserts may be stripped out from final builds.
+#if (__cplusplus >= 201100)
+#define IM_OFFSETOF(_TYPE,_MEMBER) offsetof(_TYPE, _MEMBER) // Offset of _MEMBER within _TYPE. Standardized as offsetof() in C++11
+#else
+#define IM_OFFSETOF(_TYPE,_MEMBER) ((size_t)&(((_TYPE*)0)->_MEMBER)) // Offset of _MEMBER within _TYPE. Old style macro.
+#endif
+#define IM_UNICODE_CODEPOINT_MAX 0xFFFF // Last Unicode code point supported by this build.
+#define IM_UNICODE_CODEPOINT_INVALID 0xFFFD // Standard invalid Unicode code point.
+// Warnings
#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wold-style-cast"
-#elif defined(__GNUC__) && __GNUC__ >= 8
+#if __has_warning("-Wzero-as-null-pointer-constant")
+#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
+#endif
+#elif defined(__GNUC__)
#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wclass-memaccess"
+#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
+#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
#endif
-// Forward declarations
-struct ImDrawChannel; // Temporary storage for outputting drawing commands out of order, used by ImDrawList::ChannelsSplit()
-struct ImDrawCmd; // A single draw command within a parent ImDrawList (generally maps to 1 GPU draw call)
-struct ImDrawData; // All draw command lists required to render the frame
+//-----------------------------------------------------------------------------
+// Forward declarations and basic types
+//-----------------------------------------------------------------------------
+
+struct ImDrawChannel; // Temporary storage to output draw commands out of order, used by ImDrawListSplitter and ImDrawList::ChannelsSplit()
+struct ImDrawCmd; // A single draw command within a parent ImDrawList (generally maps to 1 GPU draw call, unless it is a callback)
+struct ImDrawData; // All draw command lists required to render the frame + pos/size coordinates to use for the projection matrix.
struct ImDrawList; // A single draw command list (generally one per window, conceptually you may see this as a dynamic "mesh" builder)
struct ImDrawListSharedData; // Data shared among multiple draw lists (typically owned by parent ImGui context, but you may create one yourself)
-struct ImDrawVert; // A single vertex (20 bytes by default, override layout with IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT)
+struct ImDrawListSplitter; // Helper to split a draw list into different layers which can be drawn into out of order, then flattened back.
+struct ImDrawVert; // A single vertex (pos + uv + col = 20 bytes by default. Override layout with IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT)
struct ImFont; // Runtime data for a single font within a parent ImFontAtlas
struct ImFontAtlas; // Runtime data for multiple fonts, bake multiple fonts into a single texture, TTF/OTF font loader
struct ImFontConfig; // Configuration data when adding a font or merging fonts
-struct ImColor; // Helper functions to create a color that can be converted to either u32 or float4 (*obsolete* please avoid using)
-#ifndef ImTextureID
-typedef void* ImTextureID; // User data to identify a texture (this is whatever to you want it to be! read the FAQ about ImTextureID in imgui.cpp)
-#endif
-struct ImGuiContext; // ImGui context (opaque)
+struct ImFontGlyph; // A single font glyph (code point + coordinates within in ImFontAtlas + offset)
+struct ImFontGlyphRangesBuilder; // Helper to build glyph ranges from text/string data
+struct ImColor; // Helper functions to create a color that can be converted to either u32 or float4 (*OBSOLETE* please avoid using)
+struct ImGuiContext; // Dear ImGui context (opaque structure, unless including imgui_internal.h)
struct ImGuiIO; // Main configuration and I/O between your application and ImGui
struct ImGuiInputTextCallbackData; // Shared state of InputText() when using custom ImGuiInputTextCallback (rare/advanced use)
struct ImGuiListClipper; // Helper to manually clip large list of items
@@ -82,40 +134,49 @@ struct ImGuiPayload; // User data payload for drag and drop opera
struct ImGuiSizeCallbackData; // Callback data when using SetNextWindowSizeConstraints() (rare/advanced use)
struct ImGuiStorage; // Helper for key->value storage
struct ImGuiStyle; // Runtime data for styling/colors
-struct ImGuiTextFilter; // Helper to parse and apply text filters (e.g. "aaaaa[,bbbb][,ccccc]")
struct ImGuiTextBuffer; // Helper to hold and append into a text buffer (~string builder)
+struct ImGuiTextFilter; // Helper to parse and apply text filters (e.g. "aaaaa[,bbbb][,ccccc]")
// Typedefs and Enums/Flags (declared as int for compatibility with old C++, to allow using as flags and to not pollute the top of this file)
-// Use your programming IDE "Go to definition" facility on the names of the center columns to find the actual flags/enum lists.
+// Use your programming IDE "Go to definition" facility on the names in the central column below to find the actual flags/enum lists.
+#ifndef ImTextureID
+typedef void* ImTextureID; // User data to identify a texture (this is whatever to you want it to be! read the FAQ about ImTextureID in imgui.cpp)
+#endif
typedef unsigned int ImGuiID; // Unique ID used by widgets (typically hashed from a stack of string)
-typedef unsigned short ImWchar; // Character for keyboard input/display
+typedef unsigned short ImWchar; // A single U16 character for keyboard input/display. We encode them as multi bytes UTF-8 when used in strings.
typedef int ImGuiCol; // -> enum ImGuiCol_ // Enum: A color identifier for styling
-typedef int ImGuiCond; // -> enum ImGuiCond_ // Enum: A condition for Set*()
+typedef int ImGuiCond; // -> enum ImGuiCond_ // Enum: A condition for many Set*() functions
typedef int ImGuiDataType; // -> enum ImGuiDataType_ // Enum: A primary data type
typedef int ImGuiDir; // -> enum ImGuiDir_ // Enum: A cardinal direction
typedef int ImGuiKey; // -> enum ImGuiKey_ // Enum: A key identifier (ImGui-side enum)
typedef int ImGuiNavInput; // -> enum ImGuiNavInput_ // Enum: An input identifier for navigation
+typedef int ImGuiMouseButton; // -> enum ImGuiMouseButton_ // Enum: A mouse button identifier (0=left, 1=right, 2=middle)
typedef int ImGuiMouseCursor; // -> enum ImGuiMouseCursor_ // Enum: A mouse cursor identifier
typedef int ImGuiStyleVar; // -> enum ImGuiStyleVar_ // Enum: A variable identifier for styling
-typedef int ImDrawCornerFlags; // -> enum ImDrawCornerFlags_ // Flags: for ImDrawList::AddRect*() etc.
+typedef int ImDrawCornerFlags; // -> enum ImDrawCornerFlags_ // Flags: for ImDrawList::AddRect(), AddRectFilled() etc.
typedef int ImDrawListFlags; // -> enum ImDrawListFlags_ // Flags: for ImDrawList
typedef int ImFontAtlasFlags; // -> enum ImFontAtlasFlags_ // Flags: for ImFontAtlas
typedef int ImGuiBackendFlags; // -> enum ImGuiBackendFlags_ // Flags: for io.BackendFlags
-typedef int ImGuiColorEditFlags; // -> enum ImGuiColorEditFlags_ // Flags: for ColorEdit*(), ColorPicker*()
-typedef int ImGuiColumnsFlags; // -> enum ImGuiColumnsFlags_ // Flags: for Columns(), BeginColumns()
+typedef int ImGuiColorEditFlags; // -> enum ImGuiColorEditFlags_ // Flags: for ColorEdit4(), ColorPicker4() etc.
typedef int ImGuiConfigFlags; // -> enum ImGuiConfigFlags_ // Flags: for io.ConfigFlags
typedef int ImGuiComboFlags; // -> enum ImGuiComboFlags_ // Flags: for BeginCombo()
-typedef int ImGuiDragDropFlags; // -> enum ImGuiDragDropFlags_ // Flags: for *DragDrop*()
+typedef int ImGuiDragDropFlags; // -> enum ImGuiDragDropFlags_ // Flags: for BeginDragDropSource(), AcceptDragDropPayload()
typedef int ImGuiFocusedFlags; // -> enum ImGuiFocusedFlags_ // Flags: for IsWindowFocused()
typedef int ImGuiHoveredFlags; // -> enum ImGuiHoveredFlags_ // Flags: for IsItemHovered(), IsWindowHovered() etc.
-typedef int ImGuiInputTextFlags; // -> enum ImGuiInputTextFlags_ // Flags: for InputText*()
+typedef int ImGuiInputTextFlags; // -> enum ImGuiInputTextFlags_ // Flags: for InputText(), InputTextMultiline()
typedef int ImGuiSelectableFlags; // -> enum ImGuiSelectableFlags_ // Flags: for Selectable()
-typedef int ImGuiTreeNodeFlags; // -> enum ImGuiTreeNodeFlags_ // Flags: for TreeNode*(),CollapsingHeader()
-typedef int ImGuiWindowFlags; // -> enum ImGuiWindowFlags_ // Flags: for Begin*()
+typedef int ImGuiTabBarFlags; // -> enum ImGuiTabBarFlags_ // Flags: for BeginTabBar()
+typedef int ImGuiTabItemFlags; // -> enum ImGuiTabItemFlags_ // Flags: for BeginTabItem()
+typedef int ImGuiTreeNodeFlags; // -> enum ImGuiTreeNodeFlags_ // Flags: for TreeNode(), TreeNodeEx(), CollapsingHeader()
+typedef int ImGuiWindowFlags; // -> enum ImGuiWindowFlags_ // Flags: for Begin(), BeginChild()
typedef int (*ImGuiInputTextCallback)(ImGuiInputTextCallbackData *data);
typedef void (*ImGuiSizeCallback)(ImGuiSizeCallbackData* data);
// Scalar data types
+typedef signed char ImS8; // 8-bit signed integer
+typedef unsigned char ImU8; // 8-bit unsigned integer
+typedef signed short ImS16; // 16-bit signed integer
+typedef unsigned short ImU16; // 16-bit unsigned integer
typedef signed int ImS32; // 32-bit signed integer == int
typedef unsigned int ImU32; // 32-bit unsigned integer (often used to store packed colors)
#if defined(_MSC_VER) && !defined(__clang__)
@@ -136,7 +197,8 @@ struct ImVec2
float x, y;
ImVec2() { x = y = 0.0f; }
ImVec2(float _x, float _y) { x = _x; y = _y; }
- float operator[] (size_t i) const { IM_ASSERT(i <= 1); return (&x)[i]; } // We very rarely use this [] operator, the assert overhead is fine.
+ float operator[] (size_t idx) const { IM_ASSERT(idx <= 1); return (&x)[idx]; } // We very rarely use this [] operator, the assert overhead is fine.
+ float& operator[] (size_t idx) { IM_ASSERT(idx <= 1); return (&x)[idx]; } // We very rarely use this [] operator, the assert overhead is fine.
#ifdef IM_VEC2_CLASS_EXTRA
IM_VEC2_CLASS_EXTRA // Define additional constructors and implicit cast operators in imconfig.h to convert back and forth between your math types and ImVec2.
#endif
@@ -153,35 +215,39 @@ struct ImVec4
#endif
};
-// Dear ImGui end-user API
-// (In a namespace so you can add extra functions in your own separate file. Please don't modify imgui.cpp/.h!)
+//-----------------------------------------------------------------------------
+// ImGui: Dear ImGui end-user API
+// (Inside a namespace so you can add extra functions in your own separate file. Please don't modify imgui source files!)
+//-----------------------------------------------------------------------------
+
namespace ImGui
{
// Context creation and access
// Each context create its own ImFontAtlas by default. You may instance one yourself and pass it to CreateContext() to share a font atlas between imgui contexts.
- // All those functions are not reliant on the current context.
+ // None of those functions is reliant on the current context.
IMGUI_API ImGuiContext* CreateContext(ImFontAtlas* shared_font_atlas = NULL);
IMGUI_API void DestroyContext(ImGuiContext* ctx = NULL); // NULL = destroy current context
IMGUI_API ImGuiContext* GetCurrentContext();
IMGUI_API void SetCurrentContext(ImGuiContext* ctx);
- IMGUI_API bool DebugCheckVersionAndDataLayout(const char* version_str, size_t sz_io, size_t sz_style, size_t sz_vec2, size_t sz_vec4, size_t sz_drawvert);
+ IMGUI_API bool DebugCheckVersionAndDataLayout(const char* version_str, size_t sz_io, size_t sz_style, size_t sz_vec2, size_t sz_vec4, size_t sz_drawvert, size_t sz_drawidx);
// Main
IMGUI_API ImGuiIO& GetIO(); // access the IO structure (mouse/keyboard/gamepad inputs, time, various configuration options/flags)
IMGUI_API ImGuiStyle& GetStyle(); // access the Style structure (colors, sizes). Always use PushStyleCol(), PushStyleVar() to modify style mid-frame.
- IMGUI_API void NewFrame(); // start a new ImGui frame, you can submit any command from this point until Render()/EndFrame().
- IMGUI_API void EndFrame(); // ends the ImGui frame. automatically called by Render(), you likely don't need to call that yourself directly. If you don't need to render data (skipping rendering) you may call EndFrame() but you'll have wasted CPU already! If you don't need to render, better to not create any imgui windows and not call NewFrame() at all!
- IMGUI_API void Render(); // ends the ImGui frame, finalize the draw data. (Obsolete: optionally call io.RenderDrawListsFn if set. Nowadays, prefer calling your render function yourself.)
- IMGUI_API ImDrawData* GetDrawData(); // valid after Render() and until the next call to NewFrame(). this is what you have to render. (Obsolete: this used to be passed to your io.RenderDrawListsFn() function.)
+ IMGUI_API void NewFrame(); // start a new Dear ImGui frame, you can submit any command from this point until Render()/EndFrame().
+ IMGUI_API void EndFrame(); // ends the Dear ImGui frame. automatically called by Render(), you likely don't need to call that yourself directly. If you don't need to render data (skipping rendering) you may call EndFrame() but you'll have wasted CPU already! If you don't need to render, better to not create any imgui windows and not call NewFrame() at all!
+ IMGUI_API void Render(); // ends the Dear ImGui frame, finalize the draw data. You can get call GetDrawData() to obtain it and run your rendering function. (Obsolete: this used to call io.RenderDrawListsFn(). Nowadays, we allow and prefer calling your render function yourself.)
+ IMGUI_API ImDrawData* GetDrawData(); // valid after Render() and until the next call to NewFrame(). this is what you have to render.
// Demo, Debug, Information
- IMGUI_API void ShowDemoWindow(bool* p_open = NULL); // create demo/test window (previously called ShowTestWindow). demonstrate most ImGui features. call this to learn about the library! try to make it always available in your application!
- IMGUI_API void ShowMetricsWindow(bool* p_open = NULL); // create metrics window. display ImGui internals: draw commands (with individual draw calls and vertices), window list, basic internal state, etc.
+ IMGUI_API void ShowDemoWindow(bool* p_open = NULL); // create Demo window (previously called ShowTestWindow). demonstrate most ImGui features. call this to learn about the library! try to make it always available in your application!
+ IMGUI_API void ShowAboutWindow(bool* p_open = NULL); // create About window. display Dear ImGui version, credits and build/system information.
+ IMGUI_API void ShowMetricsWindow(bool* p_open = NULL); // create Metrics/Debug window. display Dear ImGui internals: draw commands (with individual draw calls and vertices), window list, basic internal state, etc.
IMGUI_API void ShowStyleEditor(ImGuiStyle* ref = NULL); // add style editor block (not a window). you can pass in a reference ImGuiStyle structure to compare to, revert to and save to (else it uses the default style)
IMGUI_API bool ShowStyleSelector(const char* label); // add style selector block (not a window), essentially a combo listing the default styles.
IMGUI_API void ShowFontSelector(const char* label); // add font selector block (not a window), essentially a combo listing the loaded fonts.
IMGUI_API void ShowUserGuide(); // add basic help/info block (not a window): how to manipulate ImGui as a end-user (mouse/keyboard controls).
- IMGUI_API const char* GetVersion(); // get the compiled version string e.g. "1.23"
+ IMGUI_API const char* GetVersion(); // get the compiled version string e.g. "1.23" (essentially the compiled value for IMGUI_VERSION)
// Styles
IMGUI_API void StyleColorsDark(ImGuiStyle* dst = NULL); // new, recommended style (default)
@@ -191,9 +257,14 @@ namespace ImGui
// Windows
// - Begin() = push window to the stack and start appending to it. End() = pop window from the stack.
// - You may append multiple times to the same window during the same frame.
- // - Passing 'bool* p_open != NULL' shows a window-closing widget in the upper-right corner of the window, which clicking will set the boolean to false when clicked.
- // - Begin() return false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting anything to the window.
- // Always call a matching End() for each Begin() call, regardless of its return value [this is due to legacy reason and is inconsistent with most other functions such as BeginMenu/EndMenu, BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding BeginXXX function returned true.]
+ // - Passing 'bool* p_open != NULL' shows a window-closing widget in the upper-right corner of the window,
+ // which clicking will set the boolean to false when clicked.
+ // - Begin() return false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting
+ // anything to the window. Always call a matching End() for each Begin() call, regardless of its return value!
+ // [Important: due to legacy reason, this is inconsistent with most other functions such as BeginMenu/EndMenu,
+ // BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding BeginXXX function
+ // returned true. Begin and BeginChild are the only odd ones out. Will be fixed in a future update.]
+ // - Note that the bottom of window stack always contains a window called "Debug".
IMGUI_API bool Begin(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0);
IMGUI_API void End();
@@ -201,44 +272,48 @@ namespace ImGui
// - Use child windows to begin into a self-contained independent scrolling/clipping regions within a host window. Child windows can embed their own child.
// - For each independent axis of 'size': ==0.0f: use remaining host window size / >0.0f: fixed size / <0.0f: use remaining window size minus abs(size) / Each axis can use a different mode, e.g. ImVec2(0,400).
// - BeginChild() returns false to indicate the window is collapsed or fully clipped, so you may early out and omit submitting anything to the window.
- // Always call a matching EndChild() for each BeginChild() call, regardless of its return value [this is due to legacy reason and is inconsistent with most other functions such as BeginMenu/EndMenu, BeginPopup/EndPopup, etc. where the EndXXX call should only be called if the corresponding BeginXXX function returned true.]
+ // Always call a matching EndChild() for each BeginChild() call, regardless of its return value [as with Begin: this is due to legacy reason and inconsistent with most BeginXXX functions apart from the regular Begin() which behaves like BeginChild().]
IMGUI_API bool BeginChild(const char* str_id, const ImVec2& size = ImVec2(0,0), bool border = false, ImGuiWindowFlags flags = 0);
IMGUI_API bool BeginChild(ImGuiID id, const ImVec2& size = ImVec2(0,0), bool border = false, ImGuiWindowFlags flags = 0);
IMGUI_API void EndChild();
// Windows Utilities
+ // - 'current window' = the window we are appending into while inside a Begin()/End() block. 'next window' = next window we will Begin() into.
IMGUI_API bool IsWindowAppearing();
IMGUI_API bool IsWindowCollapsed();
IMGUI_API bool IsWindowFocused(ImGuiFocusedFlags flags=0); // is current window focused? or its root/child, depending on flags. see flags for options.
IMGUI_API bool IsWindowHovered(ImGuiHoveredFlags flags=0); // is current window hovered (and typically: not blocked by a popup/modal)? see flags for options. NB: If you are trying to check whether your mouse should be dispatched to imgui or to your app, you should use the 'io.WantCaptureMouse' boolean for that! Please read the FAQ!
- IMGUI_API ImDrawList* GetWindowDrawList(); // get draw list associated to the window, to append your own drawing primitives
+ IMGUI_API ImDrawList* GetWindowDrawList(); // get draw list associated to the current window, to append your own drawing primitives
IMGUI_API ImVec2 GetWindowPos(); // get current window position in screen space (useful if you want to do your own drawing via the DrawList API)
IMGUI_API ImVec2 GetWindowSize(); // get current window size
IMGUI_API float GetWindowWidth(); // get current window width (shortcut for GetWindowSize().x)
IMGUI_API float GetWindowHeight(); // get current window height (shortcut for GetWindowSize().y)
- IMGUI_API ImVec2 GetContentRegionMax(); // current content boundaries (typically window boundaries including scrolling, or current column boundaries), in windows coordinates
- IMGUI_API ImVec2 GetContentRegionAvail(); // == GetContentRegionMax() - GetCursorPos()
- IMGUI_API float GetContentRegionAvailWidth(); //
- IMGUI_API ImVec2 GetWindowContentRegionMin(); // content boundaries min (roughly (0,0)-Scroll), in window coordinates
- IMGUI_API ImVec2 GetWindowContentRegionMax(); // content boundaries max (roughly (0,0)+Size-Scroll) where Size can be override with SetNextWindowContentSize(), in window coordinates
- IMGUI_API float GetWindowContentRegionWidth(); //
+ // Prefer using SetNextXXX functions (before Begin) rather that SetXXX functions (after Begin).
IMGUI_API void SetNextWindowPos(const ImVec2& pos, ImGuiCond cond = 0, const ImVec2& pivot = ImVec2(0,0)); // set next window position. call before Begin(). use pivot=(0.5f,0.5f) to center on given point, etc.
IMGUI_API void SetNextWindowSize(const ImVec2& size, ImGuiCond cond = 0); // set next window size. set axis to 0.0f to force an auto-fit on this axis. call before Begin()
- IMGUI_API void SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeCallback custom_callback = NULL, void* custom_callback_data = NULL); // set next window size limits. use -1,-1 on either X/Y axis to preserve the current size. Use callback to apply non-trivial programmatic constraints.
- IMGUI_API void SetNextWindowContentSize(const ImVec2& size); // set next window content size (~ enforce the range of scrollbars). not including window decorations (title bar, menu bar, etc.). set an axis to 0.0f to leave it automatic. call before Begin()
+ IMGUI_API void SetNextWindowSizeConstraints(const ImVec2& size_min, const ImVec2& size_max, ImGuiSizeCallback custom_callback = NULL, void* custom_callback_data = NULL); // set next window size limits. use -1,-1 on either X/Y axis to preserve the current size. Sizes will be rounded down. Use callback to apply non-trivial programmatic constraints.
+ IMGUI_API void SetNextWindowContentSize(const ImVec2& size); // set next window content size (~ scrollable client area, which enforce the range of scrollbars). Not including window decorations (title bar, menu bar, etc.) nor WindowPadding. set an axis to 0.0f to leave it automatic. call before Begin()
IMGUI_API void SetNextWindowCollapsed(bool collapsed, ImGuiCond cond = 0); // set next window collapsed state. call before Begin()
- IMGUI_API void SetNextWindowFocus(); // set next window to be focused / front-most. call before Begin()
- IMGUI_API void SetNextWindowBgAlpha(float alpha); // set next window background color alpha. helper to easily modify ImGuiCol_WindowBg/ChildBg/PopupBg. you may also use ImGuiWindowFlags_NoBackground.
+ IMGUI_API void SetNextWindowFocus(); // set next window to be focused / top-most. call before Begin()
+ IMGUI_API void SetNextWindowBgAlpha(float alpha); // set next window background color alpha. helper to easily override the Alpha component of ImGuiCol_WindowBg/ChildBg/PopupBg. you may also use ImGuiWindowFlags_NoBackground.
IMGUI_API void SetWindowPos(const ImVec2& pos, ImGuiCond cond = 0); // (not recommended) set current window position - call within Begin()/End(). prefer using SetNextWindowPos(), as this may incur tearing and side-effects.
IMGUI_API void SetWindowSize(const ImVec2& size, ImGuiCond cond = 0); // (not recommended) set current window size - call within Begin()/End(). set to ImVec2(0,0) to force an auto-fit. prefer using SetNextWindowSize(), as this may incur tearing and minor side-effects.
IMGUI_API void SetWindowCollapsed(bool collapsed, ImGuiCond cond = 0); // (not recommended) set current window collapsed state. prefer using SetNextWindowCollapsed().
- IMGUI_API void SetWindowFocus(); // (not recommended) set current window to be focused / front-most. prefer using SetNextWindowFocus().
- IMGUI_API void SetWindowFontScale(float scale); // set font scale. Adjust IO.FontGlobalScale if you want to scale all windows
+ IMGUI_API void SetWindowFocus(); // (not recommended) set current window to be focused / top-most. prefer using SetNextWindowFocus().
+ IMGUI_API void SetWindowFontScale(float scale); // set font scale. Adjust IO.FontGlobalScale if you want to scale all windows. This is an old API! For correct scaling, prefer to reload font + rebuild ImFontAtlas + call style.ScaleAllSizes().
IMGUI_API void SetWindowPos(const char* name, const ImVec2& pos, ImGuiCond cond = 0); // set named window position.
IMGUI_API void SetWindowSize(const char* name, const ImVec2& size, ImGuiCond cond = 0); // set named window size. set axis to 0.0f to force an auto-fit on this axis.
IMGUI_API void SetWindowCollapsed(const char* name, bool collapsed, ImGuiCond cond = 0); // set named window collapsed state
- IMGUI_API void SetWindowFocus(const char* name); // set named window to be focused / front-most. use NULL to remove focus.
+ IMGUI_API void SetWindowFocus(const char* name); // set named window to be focused / top-most. use NULL to remove focus.
+
+ // Content region
+ // - Those functions are bound to be redesigned soon (they are confusing, incomplete and return values in local window coordinates which increases confusion)
+ IMGUI_API ImVec2 GetContentRegionMax(); // current content boundaries (typically window boundaries including scrolling, or current column boundaries), in windows coordinates
+ IMGUI_API ImVec2 GetContentRegionAvail(); // == GetContentRegionMax() - GetCursorPos()
+ IMGUI_API ImVec2 GetWindowContentRegionMin(); // content boundaries min (roughly (0,0)-Scroll), in window coordinates
+ IMGUI_API ImVec2 GetWindowContentRegionMax(); // content boundaries max (roughly (0,0)+Size-Scroll) where Size can be override with SetNextWindowContentSize(), in window coordinates
+ IMGUI_API float GetWindowContentRegionWidth(); //
// Windows Scrolling
IMGUI_API float GetScrollX(); // get scrolling amount [0..GetScrollMaxX()]
@@ -247,8 +322,10 @@ namespace ImGui
IMGUI_API float GetScrollMaxY(); // get maximum scrolling amount ~~ ContentSize.Y - WindowSize.Y
IMGUI_API void SetScrollX(float scroll_x); // set scrolling amount [0..GetScrollMaxX()]
IMGUI_API void SetScrollY(float scroll_y); // set scrolling amount [0..GetScrollMaxY()]
- IMGUI_API void SetScrollHereY(float center_y_ratio = 0.5f); // adjust scrolling amount to make current cursor position visible. center_y_ratio=0.0: top, 0.5: center, 1.0: bottom. When using to make a "default/current item" visible, consider using SetItemDefaultFocus() instead.
- IMGUI_API void SetScrollFromPosY(float pos_y, float center_y_ratio = 0.5f); // adjust scrolling amount to make given position valid. use GetCursorPos() or GetCursorStartPos()+offset to get valid positions.
+ IMGUI_API void SetScrollHereX(float center_x_ratio = 0.5f); // adjust scrolling amount to make current cursor position visible. center_x_ratio=0.0: left, 0.5: center, 1.0: right. When using to make a "default/current item" visible, consider using SetItemDefaultFocus() instead.
+ IMGUI_API void SetScrollHereY(float center_y_ratio = 0.5f); // adjust scrolling amount to make current cursor position visible. center_y_ratio=0.0: top, 0.5: center, 1.0: bottom. When using to make a "default/current item" visible, consider using SetItemDefaultFocus() instead.
+ IMGUI_API void SetScrollFromPosX(float local_x, float center_x_ratio = 0.5f); // adjust scrolling amount to make given position visible. Generally GetCursorStartPos() + offset to compute a valid position.
+ IMGUI_API void SetScrollFromPosY(float local_y, float center_y_ratio = 0.5f); // adjust scrolling amount to make given position visible. Generally GetCursorStartPos() + offset to compute a valid position.
// Parameters stacks (shared)
IMGUI_API void PushFont(ImFont* font); // use NULL as a shortcut to push default font
@@ -268,10 +345,11 @@ namespace ImGui
IMGUI_API ImU32 GetColorU32(ImU32 col); // retrieve given color with style alpha applied
// Parameters stacks (current window)
- IMGUI_API void PushItemWidth(float item_width); // width of items for the common item+label case, pixels. 0.0f = default to ~2/3 of windows width, >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -1.0f always align width to the right side)
+ IMGUI_API void PushItemWidth(float item_width); // set width of items for common large "item+label" widgets. >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -1.0f always align width to the right side). 0.0f = default to ~2/3 of windows width,
IMGUI_API void PopItemWidth();
- IMGUI_API float CalcItemWidth(); // width of item given pushed settings and current cursor position
- IMGUI_API void PushTextWrapPos(float wrap_pos_x = 0.0f); // word-wrapping for Text*() commands. < 0.0f: no wrapping; 0.0f: wrap to end of window (or column); > 0.0f: wrap at 'wrap_pos_x' position in window local space
+ IMGUI_API void SetNextItemWidth(float item_width); // set width of the _next_ common large "item+label" widget. >0.0f: width in pixels, <0.0f align xx pixels to the right of window (so -1.0f always align width to the right side)
+ IMGUI_API float CalcItemWidth(); // width of item given pushed settings and current cursor position. NOT necessarily the width of last item unlike most 'Item' functions.
+ IMGUI_API void PushTextWrapPos(float wrap_local_pos_x = 0.0f); // word-wrapping for Text*() commands. < 0.0f: no wrapping; 0.0f: wrap to end of window (or column); > 0.0f: wrap at 'wrap_pos_x' position in window local space
IMGUI_API void PopTextWrapPos();
IMGUI_API void PushAllowKeyboardFocus(bool allow_keyboard_focus); // allow focusing using TAB/Shift-TAB, enabled by default but you can disable it for certain widgets
IMGUI_API void PopAllowKeyboardFocus();
@@ -279,24 +357,27 @@ namespace ImGui
IMGUI_API void PopButtonRepeat();
// Cursor / Layout
+ // - By "cursor" we mean the current output position.
+ // - The typical widget behavior is to output themselves at the current cursor position, then move the cursor one line down.
+ // - You can call SameLine() between widgets to undo the last carriage return and output at the right of the preceeding widget.
IMGUI_API void Separator(); // separator, generally horizontal. inside a menu bar or in horizontal layout mode, this becomes a vertical separator.
- IMGUI_API void SameLine(float pos_x = 0.0f, float spacing_w = -1.0f); // call between widgets or groups to layout them horizontally
- IMGUI_API void NewLine(); // undo a SameLine()
- IMGUI_API void Spacing(); // add vertical spacing
- IMGUI_API void Dummy(const ImVec2& size); // add a dummy item of given size
+ IMGUI_API void SameLine(float offset_from_start_x=0.0f, float spacing=-1.0f); // call between widgets or groups to layout them horizontally. X position given in window coordinates.
+ IMGUI_API void NewLine(); // undo a SameLine() or force a new line when in an horizontal-layout context.
+ IMGUI_API void Spacing(); // add vertical spacing.
+ IMGUI_API void Dummy(const ImVec2& size); // add a dummy item of given size. unlike InvisibleButton(), Dummy() won't take the mouse click or be navigable into.
IMGUI_API void Indent(float indent_w = 0.0f); // move content position toward the right, by style.IndentSpacing or indent_w if != 0
IMGUI_API void Unindent(float indent_w = 0.0f); // move content position back to the left, by style.IndentSpacing or indent_w if != 0
- IMGUI_API void BeginGroup(); // lock horizontal starting position + capture group bounding box into one "item" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.)
- IMGUI_API void EndGroup();
- IMGUI_API ImVec2 GetCursorPos(); // cursor position is relative to window position
- IMGUI_API float GetCursorPosX(); // "
- IMGUI_API float GetCursorPosY(); // "
- IMGUI_API void SetCursorPos(const ImVec2& local_pos); // "
- IMGUI_API void SetCursorPosX(float x); // "
- IMGUI_API void SetCursorPosY(float y); // "
- IMGUI_API ImVec2 GetCursorStartPos(); // initial cursor position
+ IMGUI_API void BeginGroup(); // lock horizontal starting position
+ IMGUI_API void EndGroup(); // unlock horizontal starting position + capture the whole group bounding box into one "item" (so you can use IsItemHovered() or layout primitives such as SameLine() on whole group, etc.)
+ IMGUI_API ImVec2 GetCursorPos(); // cursor position in window coordinates (relative to window position)
+ IMGUI_API float GetCursorPosX(); // (some functions are using window-relative coordinates, such as: GetCursorPos, GetCursorStartPos, GetContentRegionMax, GetWindowContentRegion* etc.
+ IMGUI_API float GetCursorPosY(); // other functions such as GetCursorScreenPos or everything in ImDrawList::
+ IMGUI_API void SetCursorPos(const ImVec2& local_pos); // are using the main, absolute coordinate system.
+ IMGUI_API void SetCursorPosX(float local_x); // GetWindowPos() + GetCursorPos() == GetCursorScreenPos() etc.)
+ IMGUI_API void SetCursorPosY(float local_y); //
+ IMGUI_API ImVec2 GetCursorStartPos(); // initial cursor position in window coordinates
IMGUI_API ImVec2 GetCursorScreenPos(); // cursor position in absolute screen coordinates [0..io.DisplaySize] (useful to work with ImDrawList API)
- IMGUI_API void SetCursorScreenPos(const ImVec2& screen_pos); // cursor position in absolute screen coordinates [0..io.DisplaySize]
+ IMGUI_API void SetCursorScreenPos(const ImVec2& pos); // cursor position in absolute screen coordinates [0..io.DisplaySize]
IMGUI_API void AlignTextToFramePadding(); // vertically align upcoming text baseline to FramePadding.y so that it will align properly to regularly framed items (call if you have text on a line before a framed item)
IMGUI_API float GetTextLineHeight(); // ~ FontSize
IMGUI_API float GetTextLineHeightWithSpacing(); // ~ FontSize + style.ItemSpacing.y (distance in pixels between 2 consecutive lines of text)
@@ -304,23 +385,24 @@ namespace ImGui
IMGUI_API float GetFrameHeightWithSpacing(); // ~ FontSize + style.FramePadding.y * 2 + style.ItemSpacing.y (distance in pixels between 2 consecutive lines of framed widgets)
// ID stack/scopes
- // Read the FAQ for more details about how ID are handled in dear imgui. If you are creating widgets in a loop you most
- // likely want to push a unique identifier (e.g. object pointer, loop index) to uniquely differentiate them.
- // You can also use the "##foobar" syntax within widget label to distinguish them from each others.
- // In this header file we use the "label"/"name" terminology to denote a string that will be displayed and used as an ID,
- // whereas "str_id" denote a string that is only used as an ID and not aimed to be displayed.
- IMGUI_API void PushID(const char* str_id); // push identifier into the ID stack. IDs are hash of the entire stack!
- IMGUI_API void PushID(const char* str_id_begin, const char* str_id_end);
- IMGUI_API void PushID(const void* ptr_id);
- IMGUI_API void PushID(int int_id);
- IMGUI_API void PopID();
+ // - Read the FAQ for more details about how ID are handled in dear imgui. If you are creating widgets in a loop you most
+ // likely want to push a unique identifier (e.g. object pointer, loop index) to uniquely differentiate them.
+ // - The resulting ID are hashes of the entire stack.
+ // - You can also use the "Label##foobar" syntax within widget label to distinguish them from each others.
+ // - In this header file we use the "label"/"name" terminology to denote a string that will be displayed and used as an ID,
+ // whereas "str_id" denote a string that is only used as an ID and not normally displayed.
+ IMGUI_API void PushID(const char* str_id); // push string into the ID stack (will hash string).
+ IMGUI_API void PushID(const char* str_id_begin, const char* str_id_end); // push string into the ID stack (will hash string).
+ IMGUI_API void PushID(const void* ptr_id); // push pointer into the ID stack (will hash pointer).
+ IMGUI_API void PushID(int int_id); // push integer into the ID stack (will hash integer).
+ IMGUI_API void PopID(); // pop from the ID stack.
IMGUI_API ImGuiID GetID(const char* str_id); // calculate unique ID (hash of whole ID stack + given parameter). e.g. if you want to query into ImGuiStorage yourself
IMGUI_API ImGuiID GetID(const char* str_id_begin, const char* str_id_end);
IMGUI_API ImGuiID GetID(const void* ptr_id);
// Widgets: Text
- IMGUI_API void TextUnformatted(const char* text, const char* text_end = NULL); // raw text without formatting. Roughly equivalent to Text("%s", text) but: A) doesn't require null terminated string if 'text_end' is specified, B) it's faster, no memory copy is done, no buffer size limits, recommended for long chunks of text.
- IMGUI_API void Text(const char* fmt, ...) IM_FMTARGS(1); // simple formatted text
+ IMGUI_API void TextUnformatted(const char* text, const char* text_end = NULL); // raw text without formatting. Roughly equivalent to Text("%s", text) but: A) doesn't require null terminated string if 'text_end' is specified, B) it's faster, no memory copy is done, no buffer size limits, recommended for long chunks of text.
+ IMGUI_API void Text(const char* fmt, ...) IM_FMTARGS(1); // formatted text
IMGUI_API void TextV(const char* fmt, va_list args) IM_FMTLIST(1);
IMGUI_API void TextColored(const ImVec4& col, const char* fmt, ...) IM_FMTARGS(2); // shortcut for PushStyleColor(ImGuiCol_Text, col); Text(fmt, ...); PopStyleColor();
IMGUI_API void TextColoredV(const ImVec4& col, const char* fmt, va_list args) IM_FMTLIST(2);
@@ -334,10 +416,11 @@ namespace ImGui
IMGUI_API void BulletTextV(const char* fmt, va_list args) IM_FMTLIST(1);
// Widgets: Main
- // Most widgets return true when the value has been changed or when pressed/selected
+ // - Most widgets return true when the value has been changed or when pressed/selected
+ // - You may also use one of the many IsItemXXX functions (e.g. IsItemActive, IsItemHovered, etc.) to query widget state.
IMGUI_API bool Button(const char* label, const ImVec2& size = ImVec2(0,0)); // button
IMGUI_API bool SmallButton(const char* label); // button with FramePadding=(0,0) to easily embed within text
- IMGUI_API bool InvisibleButton(const char* str_id, const ImVec2& size); // button behavior without the visuals, useful to build custom behaviors using the public api (along with IsItemActive, IsItemHovered, etc.)
+ IMGUI_API bool InvisibleButton(const char* str_id, const ImVec2& size); // button behavior without the visuals, frequently useful to build custom behaviors using the public api (along with IsItemActive, IsItemHovered, etc.)
IMGUI_API bool ArrowButton(const char* str_id, ImGuiDir dir); // square button with an arrow shape
IMGUI_API void Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0,0), const ImVec2& uv1 = ImVec2(1,1), const ImVec4& tint_col = ImVec4(1,1,1,1), const ImVec4& border_col = ImVec4(0,0,0,0));
IMGUI_API bool ImageButton(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0 = ImVec2(0,0), const ImVec2& uv1 = ImVec2(1,1), int frame_padding = -1, const ImVec4& bg_col = ImVec4(0,0,0,0), const ImVec4& tint_col = ImVec4(1,1,1,1)); // <0 frame_padding uses default frame padding settings. 0 for no padding
@@ -349,18 +432,22 @@ namespace ImGui
IMGUI_API void Bullet(); // draw a small circle and keep the cursor on the same line. advance cursor x position by GetTreeNodeToLabelSpacing(), same distance that TreeNode() uses
// Widgets: Combo Box
- // The new BeginCombo()/EndCombo() api allows you to manage your contents and selection state however you want it, by creating e.g. Selectable() items.
- // The old Combo() api are helpers over BeginCombo()/EndCombo() which are kept available for convenience purpose.
+ // - The BeginCombo()/EndCombo() api allows you to manage your contents and selection state however you want it, by creating e.g. Selectable() items.
+ // - The old Combo() api are helpers over BeginCombo()/EndCombo() which are kept available for convenience purpose.
IMGUI_API bool BeginCombo(const char* label, const char* preview_value, ImGuiComboFlags flags = 0);
IMGUI_API void EndCombo(); // only call EndCombo() if BeginCombo() returns true!
IMGUI_API bool Combo(const char* label, int* current_item, const char* const items[], int items_count, int popup_max_height_in_items = -1);
IMGUI_API bool Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int popup_max_height_in_items = -1); // Separate items with \0 within a string, end item-list with \0\0. e.g. "One\0Two\0Three\0"
IMGUI_API bool Combo(const char* label, int* current_item, bool(*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int popup_max_height_in_items = -1);
- // Widgets: Drags (tip: ctrl+click on a drag box to input with keyboard. manually input values aren't clamped, can go off-bounds)
- // For all the Float2/Float3/Float4/Int2/Int3/Int4 versions of every functions, note that a 'float v[X]' function argument is the same as 'float* v', the array syntax is just a way to document the number of elements that are expected to be accessible. You can pass address of your first element out of a contiguous set, e.g. &myvector.x
- // Adjust format string to decorate the value with a prefix, a suffix, or adapt the editing and display precision e.g. "%.3f" -> 1.234; "%5.2f secs" -> 01.23 secs; "Biscuit: %.0f" -> Biscuit: 1; etc.
- // Speed are per-pixel of mouse movement (v_speed=0.2f: mouse needs to move by 5 pixels to increase value by 1). For gamepad/keyboard navigation, minimum speed is Max(v_speed, minimum_step_at_given_precision).
+ // Widgets: Drags
+ // - CTRL+Click on any drag box to turn them into an input box. Manually input values aren't clamped and can go off-bounds.
+ // - For all the Float2/Float3/Float4/Int2/Int3/Int4 versions of every functions, note that a 'float v[X]' function argument is the same as 'float* v', the array syntax is just a way to document the number of elements that are expected to be accessible. You can pass address of your first element out of a contiguous set, e.g. &myvector.x
+ // - Adjust format string to decorate the value with a prefix, a suffix, or adapt the editing and display precision e.g. "%.3f" -> 1.234; "%5.2f secs" -> 01.23 secs; "Biscuit: %.0f" -> Biscuit: 1; etc.
+ // - Speed are per-pixel of mouse movement (v_speed=0.2f: mouse needs to move by 5 pixels to increase value by 1). For gamepad/keyboard navigation, minimum speed is Max(v_speed, minimum_step_at_given_precision).
+ // - Use v_min < v_max to clamp edits to given limits. Note that CTRL+Click manual input can override those limits.
+ // - Use v_max = FLT_MAX / INT_MAX etc to avoid clamping to a maximum, same with v_min = -FLT_MAX / INT_MIN to avoid clamping to a minimum.
+ // - Use v_min > v_max to lock edits.
IMGUI_API bool DragFloat(const char* label, float* v, float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", float power = 1.0f); // If v_min >= v_max we have no bound
IMGUI_API bool DragFloat2(const char* label, float v[2], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", float power = 1.0f);
IMGUI_API bool DragFloat3(const char* label, float v[3], float v_speed = 1.0f, float v_min = 0.0f, float v_max = 0.0f, const char* format = "%.3f", float power = 1.0f);
@@ -371,11 +458,12 @@ namespace ImGui
IMGUI_API bool DragInt3(const char* label, int v[3], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d");
IMGUI_API bool DragInt4(const char* label, int v[4], float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d");
IMGUI_API bool DragIntRange2(const char* label, int* v_current_min, int* v_current_max, float v_speed = 1.0f, int v_min = 0, int v_max = 0, const char* format = "%d", const char* format_max = NULL);
- IMGUI_API bool DragScalar(const char* label, ImGuiDataType data_type, void* v, float v_speed, const void* v_min = NULL, const void* v_max = NULL, const char* format = NULL, float power = 1.0f);
- IMGUI_API bool DragScalarN(const char* label, ImGuiDataType data_type, void* v, int components, float v_speed, const void* v_min = NULL, const void* v_max = NULL, const char* format = NULL, float power = 1.0f);
+ IMGUI_API bool DragScalar(const char* label, ImGuiDataType data_type, void* p_data, float v_speed, const void* p_min = NULL, const void* p_max = NULL, const char* format = NULL, float power = 1.0f);
+ IMGUI_API bool DragScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, float v_speed, const void* p_min = NULL, const void* p_max = NULL, const char* format = NULL, float power = 1.0f);
- // Widgets: Sliders (tip: ctrl+click on a slider to input with keyboard. manually input values aren't clamped, can go off-bounds)
- // Adjust format string to decorate the value with a prefix, a suffix, or adapt the editing and display precision e.g. "%.3f" -> 1.234; "%5.2f secs" -> 01.23 secs; "Biscuit: %.0f" -> Biscuit: 1; etc.
+ // Widgets: Sliders
+ // - CTRL+Click on any slider to turn them into an input box. Manually input values aren't clamped and can go off-bounds.
+ // - Adjust format string to decorate the value with a prefix, a suffix, or adapt the editing and display precision e.g. "%.3f" -> 1.234; "%5.2f secs" -> 01.23 secs; "Biscuit: %.0f" -> Biscuit: 1; etc.
IMGUI_API bool SliderFloat(const char* label, float* v, float v_min, float v_max, const char* format = "%.3f", float power = 1.0f); // adjust format to decorate the value with a prefix or a suffix for in-slider labels or unit display. Use power!=1.0 for power curve sliders
IMGUI_API bool SliderFloat2(const char* label, float v[2], float v_min, float v_max, const char* format = "%.3f", float power = 1.0f);
IMGUI_API bool SliderFloat3(const char* label, float v[3], float v_min, float v_max, const char* format = "%.3f", float power = 1.0f);
@@ -385,30 +473,33 @@ namespace ImGui
IMGUI_API bool SliderInt2(const char* label, int v[2], int v_min, int v_max, const char* format = "%d");
IMGUI_API bool SliderInt3(const char* label, int v[3], int v_min, int v_max, const char* format = "%d");
IMGUI_API bool SliderInt4(const char* label, int v[4], int v_min, int v_max, const char* format = "%d");
- IMGUI_API bool SliderScalar(const char* label, ImGuiDataType data_type, void* v, const void* v_min, const void* v_max, const char* format = NULL, float power = 1.0f);
- IMGUI_API bool SliderScalarN(const char* label, ImGuiDataType data_type, void* v, int components, const void* v_min, const void* v_max, const char* format = NULL, float power = 1.0f);
+ IMGUI_API bool SliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format = NULL, float power = 1.0f);
+ IMGUI_API bool SliderScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_min, const void* p_max, const char* format = NULL, float power = 1.0f);
IMGUI_API bool VSliderFloat(const char* label, const ImVec2& size, float* v, float v_min, float v_max, const char* format = "%.3f", float power = 1.0f);
IMGUI_API bool VSliderInt(const char* label, const ImVec2& size, int* v, int v_min, int v_max, const char* format = "%d");
- IMGUI_API bool VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType data_type, void* v, const void* v_min, const void* v_max, const char* format = NULL, float power = 1.0f);
+ IMGUI_API bool VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format = NULL, float power = 1.0f);
// Widgets: Input with Keyboard
- // If you want to use InputText() with a dynamic string type such as std::string or your own, see misc/cpp/imgui_stdlib.h
+ // - If you want to use InputText() with std::string or any custom dynamic string type, see misc/cpp/imgui_stdlib.h and comments in imgui_demo.cpp.
+ // - Most of the ImGuiInputTextFlags flags are only useful for InputText() and not for InputFloatX, InputIntX, InputDouble etc.
IMGUI_API bool InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);
IMGUI_API bool InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size = ImVec2(0,0), ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);
- IMGUI_API bool InputFloat(const char* label, float* v, float step = 0.0f, float step_fast = 0.0f, const char* format = "%.3f", ImGuiInputTextFlags extra_flags = 0);
- IMGUI_API bool InputFloat2(const char* label, float v[2], const char* format = "%.3f", ImGuiInputTextFlags extra_flags = 0);
- IMGUI_API bool InputFloat3(const char* label, float v[3], const char* format = "%.3f", ImGuiInputTextFlags extra_flags = 0);
- IMGUI_API bool InputFloat4(const char* label, float v[4], const char* format = "%.3f", ImGuiInputTextFlags extra_flags = 0);
- IMGUI_API bool InputInt(const char* label, int* v, int step = 1, int step_fast = 100, ImGuiInputTextFlags extra_flags = 0);
- IMGUI_API bool InputInt2(const char* label, int v[2], ImGuiInputTextFlags extra_flags = 0);
- IMGUI_API bool InputInt3(const char* label, int v[3], ImGuiInputTextFlags extra_flags = 0);
- IMGUI_API bool InputInt4(const char* label, int v[4], ImGuiInputTextFlags extra_flags = 0);
- IMGUI_API bool InputDouble(const char* label, double* v, double step = 0.0f, double step_fast = 0.0f, const char* format = "%.6f", ImGuiInputTextFlags extra_flags = 0);
- IMGUI_API bool InputScalar(const char* label, ImGuiDataType data_type, void* v, const void* step = NULL, const void* step_fast = NULL, const char* format = NULL, ImGuiInputTextFlags extra_flags = 0);
- IMGUI_API bool InputScalarN(const char* label, ImGuiDataType data_type, void* v, int components, const void* step = NULL, const void* step_fast = NULL, const char* format = NULL, ImGuiInputTextFlags extra_flags = 0);
+ IMGUI_API bool InputTextWithHint(const char* label, const char* hint, char* buf, size_t buf_size, ImGuiInputTextFlags flags = 0, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);
+ IMGUI_API bool InputFloat(const char* label, float* v, float step = 0.0f, float step_fast = 0.0f, const char* format = "%.3f", ImGuiInputTextFlags flags = 0);
+ IMGUI_API bool InputFloat2(const char* label, float v[2], const char* format = "%.3f", ImGuiInputTextFlags flags = 0);
+ IMGUI_API bool InputFloat3(const char* label, float v[3], const char* format = "%.3f", ImGuiInputTextFlags flags = 0);
+ IMGUI_API bool InputFloat4(const char* label, float v[4], const char* format = "%.3f", ImGuiInputTextFlags flags = 0);
+ IMGUI_API bool InputInt(const char* label, int* v, int step = 1, int step_fast = 100, ImGuiInputTextFlags flags = 0);
+ IMGUI_API bool InputInt2(const char* label, int v[2], ImGuiInputTextFlags flags = 0);
+ IMGUI_API bool InputInt3(const char* label, int v[3], ImGuiInputTextFlags flags = 0);
+ IMGUI_API bool InputInt4(const char* label, int v[4], ImGuiInputTextFlags flags = 0);
+ IMGUI_API bool InputDouble(const char* label, double* v, double step = 0.0, double step_fast = 0.0, const char* format = "%.6f", ImGuiInputTextFlags flags = 0);
+ IMGUI_API bool InputScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_step = NULL, const void* p_step_fast = NULL, const char* format = NULL, ImGuiInputTextFlags flags = 0);
+ IMGUI_API bool InputScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_step = NULL, const void* p_step_fast = NULL, const char* format = NULL, ImGuiInputTextFlags flags = 0);
// Widgets: Color Editor/Picker (tip: the ColorEdit* functions have a little colored preview square that can be left-clicked to open a picker, and right-clicked to open an option menu.)
- // Note that a 'float v[X]' function argument is the same as 'float* v', the array syntax is just a way to document the number of elements that are expected to be accessible. You can the pass the address of a first float element out of a contiguous structure, e.g. &myvector.x
+ // - Note that in C++ a 'float v[X]' function argument is the _same_ as 'float* v', the array syntax is just a way to document the number of elements that are expected to be accessible.
+ // - You can pass the address of a first float element out of a contiguous structure, e.g. &myvector.x
IMGUI_API bool ColorEdit3(const char* label, float col[3], ImGuiColorEditFlags flags = 0);
IMGUI_API bool ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flags = 0);
IMGUI_API bool ColorPicker3(const char* label, float col[3], ImGuiColorEditFlags flags = 0);
@@ -417,9 +508,9 @@ namespace ImGui
IMGUI_API void SetColorEditOptions(ImGuiColorEditFlags flags); // initialize current options (generally on application startup) if you want to select a default format, picker type, etc. User will be able to change many settings, unless you pass the _NoOptions flag to your calls.
// Widgets: Trees
- // TreeNode functions return true when the node is open, in which case you need to also call TreePop() when you are finished displaying the tree node contents.
+ // - TreeNode functions return true when the node is open, in which case you need to also call TreePop() when you are finished displaying the tree node contents.
IMGUI_API bool TreeNode(const char* label);
- IMGUI_API bool TreeNode(const char* str_id, const char* fmt, ...) IM_FMTARGS(2); // helper variation to completely decorelate the id from the displayed string. Read the FAQ about why and how to use ID. to align arbitrary text at the same level as a TreeNode() you can use Bullet().
+ IMGUI_API bool TreeNode(const char* str_id, const char* fmt, ...) IM_FMTARGS(2); // helper variation to easily decorelate the id from the displayed string. Read the FAQ about why and how to use ID. to align arbitrary text at the same level as a TreeNode() you can use Bullet().
IMGUI_API bool TreeNode(const void* ptr_id, const char* fmt, ...) IM_FMTARGS(2); // "
IMGUI_API bool TreeNodeV(const char* str_id, const char* fmt, va_list args) IM_FMTLIST(2);
IMGUI_API bool TreeNodeV(const void* ptr_id, const char* fmt, va_list args) IM_FMTLIST(2);
@@ -431,17 +522,19 @@ namespace ImGui
IMGUI_API void TreePush(const char* str_id); // ~ Indent()+PushId(). Already called by TreeNode() when returning true, but you can call TreePush/TreePop yourself if desired.
IMGUI_API void TreePush(const void* ptr_id = NULL); // "
IMGUI_API void TreePop(); // ~ Unindent()+PopId()
- IMGUI_API void TreeAdvanceToLabelPos(); // advance cursor x position by GetTreeNodeToLabelSpacing()
IMGUI_API float GetTreeNodeToLabelSpacing(); // horizontal distance preceding label when using TreeNode*() or Bullet() == (g.FontSize + style.FramePadding.x*2) for a regular unframed TreeNode
- IMGUI_API void SetNextTreeNodeOpen(bool is_open, ImGuiCond cond = 0); // set next TreeNode/CollapsingHeader open state.
IMGUI_API bool CollapsingHeader(const char* label, ImGuiTreeNodeFlags flags = 0); // if returning 'true' the header is open. doesn't indent nor push on ID stack. user doesn't have to call TreePop().
IMGUI_API bool CollapsingHeader(const char* label, bool* p_open, ImGuiTreeNodeFlags flags = 0); // when 'p_open' isn't NULL, display an additional small close button on upper right of the header
+ IMGUI_API void SetNextItemOpen(bool is_open, ImGuiCond cond = 0); // set next TreeNode/CollapsingHeader open state.
// Widgets: Selectables
+ // - A selectable highlights when hovered, and can display another color when selected.
+ // - Neighbors selectable extend their highlight bounds in order to leave no gap between them. This is so a series of selected Selectable appear contiguous.
IMGUI_API bool Selectable(const char* label, bool selected = false, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0,0)); // "bool selected" carry the selection state (read-only). Selectable() is clicked is returns true so you can modify your selection state. size.x==0.0: use remaining width, size.x>0.0: specify width. size.y==0.0: use label height, size.y>0.0: specify height
IMGUI_API bool Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags flags = 0, const ImVec2& size = ImVec2(0,0)); // "bool* p_selected" point to the selection state (read-write), as a convenient helper.
// Widgets: List Boxes
+ // - FIXME: To be consistent with all the newer API, ListBoxHeader/ListBoxFooter should in reality be called BeginListBox/EndListBox. Will rename them.
IMGUI_API bool ListBox(const char* label, int* current_item, const char* const items[], int items_count, int height_in_items = -1);
IMGUI_API bool ListBox(const char* label, int* current_item, bool (*items_getter)(void* data, int idx, const char** out_text), void* data, int items_count, int height_in_items = -1);
IMGUI_API bool ListBoxHeader(const char* label, const ImVec2& size = ImVec2(0,0)); // use if you want to reimplement ListBox() will custom data or interactions. if the function return true, you can output elements then call ListBoxFooter() afterwards.
@@ -454,42 +547,57 @@ namespace ImGui
IMGUI_API void PlotHistogram(const char* label, const float* values, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0), int stride = sizeof(float));
IMGUI_API void PlotHistogram(const char* label, float(*values_getter)(void* data, int idx), void* data, int values_count, int values_offset = 0, const char* overlay_text = NULL, float scale_min = FLT_MAX, float scale_max = FLT_MAX, ImVec2 graph_size = ImVec2(0, 0));
- // Widgets: Value() Helpers. Output single value in "name: value" format (tip: freely declare more in your code to handle your types. you can add functions to the ImGui namespace)
+ // Widgets: Value() Helpers.
+ // - Those are merely shortcut to calling Text() with a format string. Output single value in "name: value" format (tip: freely declare more in your code to handle your types. you can add functions to the ImGui namespace)
IMGUI_API void Value(const char* prefix, bool b);
IMGUI_API void Value(const char* prefix, int v);
IMGUI_API void Value(const char* prefix, unsigned int v);
IMGUI_API void Value(const char* prefix, float v, const char* float_format = NULL);
// Widgets: Menus
- IMGUI_API bool BeginMainMenuBar(); // create and append to a full screen menu-bar.
- IMGUI_API void EndMainMenuBar(); // only call EndMainMenuBar() if BeginMainMenuBar() returns true!
+ // - Use BeginMenuBar() on a window ImGuiWindowFlags_MenuBar to append to its menu bar.
+ // - Use BeginMainMenuBar() to create a menu bar at the top of the screen.
IMGUI_API bool BeginMenuBar(); // append to menu-bar of current window (requires ImGuiWindowFlags_MenuBar flag set on parent window).
IMGUI_API void EndMenuBar(); // only call EndMenuBar() if BeginMenuBar() returns true!
+ IMGUI_API bool BeginMainMenuBar(); // create and append to a full screen menu-bar.
+ IMGUI_API void EndMainMenuBar(); // only call EndMainMenuBar() if BeginMainMenuBar() returns true!
IMGUI_API bool BeginMenu(const char* label, bool enabled = true); // create a sub-menu entry. only call EndMenu() if this returns true!
IMGUI_API void EndMenu(); // only call EndMenu() if BeginMenu() returns true!
IMGUI_API bool MenuItem(const char* label, const char* shortcut = NULL, bool selected = false, bool enabled = true); // return true when activated. shortcuts are displayed for convenience but not processed by ImGui at the moment
IMGUI_API bool MenuItem(const char* label, const char* shortcut, bool* p_selected, bool enabled = true); // return true when activated + toggle (*p_selected) if p_selected != NULL
// Tooltips
+ // - Tooltip are windows following the mouse which do not take focus away.
IMGUI_API void BeginTooltip(); // begin/append a tooltip window. to create full-featured tooltip (with any kind of items).
IMGUI_API void EndTooltip();
- IMGUI_API void SetTooltip(const char* fmt, ...) IM_FMTARGS(1); // set a text-only tooltip, typically use with ImGui::IsItemHovered(). overidde any previous call to SetTooltip().
+ IMGUI_API void SetTooltip(const char* fmt, ...) IM_FMTARGS(1); // set a text-only tooltip, typically use with ImGui::IsItemHovered(). override any previous call to SetTooltip().
IMGUI_API void SetTooltipV(const char* fmt, va_list args) IM_FMTLIST(1);
- // Popups
+ // Popups, Modals
+ // The properties of popups windows are:
+ // - They block normal mouse hovering detection outside them. (*)
+ // - Unless modal, they can be closed by clicking anywhere outside them, or by pressing ESCAPE.
+ // - Their visibility state (~bool) is held internally by imgui instead of being held by the programmer as we are used to with regular Begin() calls.
+ // User can manipulate the visibility state by calling OpenPopup().
+ // - We default to use the right mouse (ImGuiMouseButton_Right=1) for the Popup Context functions.
+ // (*) You can use IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup) to bypass it and detect hovering even when normally blocked by a popup.
+ // Those three properties are connected. The library needs to hold their visibility state because it can close popups at any time.
IMGUI_API void OpenPopup(const char* str_id); // call to mark popup as open (don't call every frame!). popups are closed when user click outside, or if CloseCurrentPopup() is called within a BeginPopup()/EndPopup() block. By default, Selectable()/MenuItem() are calling CloseCurrentPopup(). Popup identifiers are relative to the current ID-stack (so OpenPopup and BeginPopup needs to be at the same level).
IMGUI_API bool BeginPopup(const char* str_id, ImGuiWindowFlags flags = 0); // return true if the popup is open, and you can start outputting to it. only call EndPopup() if BeginPopup() returns true!
- IMGUI_API bool BeginPopupContextItem(const char* str_id = NULL, int mouse_button = 1); // helper to open and begin popup when clicked on last item. if you can pass a NULL str_id only if the previous item had an id. If you want to use that on a non-interactive item such as Text() you need to pass in an explicit ID here. read comments in .cpp!
- IMGUI_API bool BeginPopupContextWindow(const char* str_id = NULL, int mouse_button = 1, bool also_over_items = true); // helper to open and begin popup when clicked on current window.
- IMGUI_API bool BeginPopupContextVoid(const char* str_id = NULL, int mouse_button = 1); // helper to open and begin popup when clicked in void (where there are no imgui windows).
+ IMGUI_API bool BeginPopupContextItem(const char* str_id = NULL, ImGuiMouseButton mouse_button = 1); // helper to open and begin popup when clicked on last item. if you can pass a NULL str_id only if the previous item had an id. If you want to use that on a non-interactive item such as Text() you need to pass in an explicit ID here. read comments in .cpp!
+ IMGUI_API bool BeginPopupContextWindow(const char* str_id = NULL, ImGuiMouseButton mouse_button = 1, bool also_over_items = true); // helper to open and begin popup when clicked on current window.
+ IMGUI_API bool BeginPopupContextVoid(const char* str_id = NULL, ImGuiMouseButton mouse_button = 1); // helper to open and begin popup when clicked in void (where there are no imgui windows).
IMGUI_API bool BeginPopupModal(const char* name, bool* p_open = NULL, ImGuiWindowFlags flags = 0); // modal dialog (regular window with title bar, block interactions behind the modal window, can't close the modal window by clicking outside)
IMGUI_API void EndPopup(); // only call EndPopup() if BeginPopupXXX() returns true!
- IMGUI_API bool OpenPopupOnItemClick(const char* str_id = NULL, int mouse_button = 1); // helper to open popup when clicked on last item (note: actually triggers on the mouse _released_ event to be consistent with popup behaviors). return true when just opened.
- IMGUI_API bool IsPopupOpen(const char* str_id); // return true if the popup is open
+ IMGUI_API bool OpenPopupOnItemClick(const char* str_id = NULL, ImGuiMouseButton mouse_button = 1); // helper to open popup when clicked on last item (note: actually triggers on the mouse _released_ event to be consistent with popup behaviors). return true when just opened.
+ IMGUI_API bool IsPopupOpen(const char* str_id); // return true if the popup is open at the current begin-ed level of the popup stack.
IMGUI_API void CloseCurrentPopup(); // close the popup we have begin-ed into. clicking on a MenuItem or Selectable automatically close the current popup.
// Columns
- // You can also use SameLine(pos_x) for simplified columns. The columns API is work-in-progress and rather lacking (columns are arguably the worst part of dear imgui at the moment!)
+ // - You can also use SameLine(pos_x) to mimic simplified columns.
+ // - The columns API is work-in-progress and rather lacking (columns are arguably the worst part of dear imgui at the moment!)
+ // - There is a maximum of 64 columns.
+ // - Currently working on new 'Tables' api which will replace columns (see GitHub #2957)
IMGUI_API void Columns(int count = 1, const char* id = NULL, bool border = true);
IMGUI_API void NextColumn(); // next column, defaults to current row or next row if the current row is finished
IMGUI_API int GetColumnIndex(); // get current column index
@@ -499,59 +607,71 @@ namespace ImGui
IMGUI_API void SetColumnOffset(int column_index, float offset_x); // set position of column line (in pixels, from the left side of the contents region). pass -1 to use current column
IMGUI_API int GetColumnsCount();
- // Logging/Capture: all text output from interface is captured to tty/file/clipboard. By default, tree nodes are automatically opened during logging.
- IMGUI_API void LogToTTY(int max_depth = -1); // start logging to tty
- IMGUI_API void LogToFile(int max_depth = -1, const char* filename = NULL); // start logging to file
- IMGUI_API void LogToClipboard(int max_depth = -1); // start logging to OS clipboard
+ // Tab Bars, Tabs
+ IMGUI_API bool BeginTabBar(const char* str_id, ImGuiTabBarFlags flags = 0); // create and append into a TabBar
+ IMGUI_API void EndTabBar(); // only call EndTabBar() if BeginTabBar() returns true!
+ IMGUI_API bool BeginTabItem(const char* label, bool* p_open = NULL, ImGuiTabItemFlags flags = 0);// create a Tab. Returns true if the Tab is selected.
+ IMGUI_API void EndTabItem(); // only call EndTabItem() if BeginTabItem() returns true!
+ IMGUI_API void SetTabItemClosed(const char* tab_or_docked_window_label); // notify TabBar or Docking system of a closed tab/window ahead (useful to reduce visual flicker on reorderable tab bars). For tab-bar: call after BeginTabBar() and before Tab submissions. Otherwise call with a window name.
+
+ // Logging/Capture
+ // - All text output from the interface can be captured into tty/file/clipboard. By default, tree nodes are automatically opened during logging.
+ IMGUI_API void LogToTTY(int auto_open_depth = -1); // start logging to tty (stdout)
+ IMGUI_API void LogToFile(int auto_open_depth = -1, const char* filename = NULL); // start logging to file
+ IMGUI_API void LogToClipboard(int auto_open_depth = -1); // start logging to OS clipboard
IMGUI_API void LogFinish(); // stop logging (close file, etc.)
IMGUI_API void LogButtons(); // helper to display buttons for logging to tty/file/clipboard
IMGUI_API void LogText(const char* fmt, ...) IM_FMTARGS(1); // pass text data straight to log (without being displayed)
// Drag and Drop
- // [BETA API] Missing Demo code. API may evolve.
+ // [BETA API] API may evolve!
IMGUI_API bool BeginDragDropSource(ImGuiDragDropFlags flags = 0); // call when the current item is active. If this return true, you can call SetDragDropPayload() + EndDragDropSource()
- IMGUI_API bool SetDragDropPayload(const char* type, const void* data, size_t size, ImGuiCond cond = 0);// type is a user defined string of maximum 32 characters. Strings starting with '_' are reserved for dear imgui internal types. Data is copied and held by imgui.
+ IMGUI_API bool SetDragDropPayload(const char* type, const void* data, size_t sz, ImGuiCond cond = 0); // type is a user defined string of maximum 32 characters. Strings starting with '_' are reserved for dear imgui internal types. Data is copied and held by imgui.
IMGUI_API void EndDragDropSource(); // only call EndDragDropSource() if BeginDragDropSource() returns true!
IMGUI_API bool BeginDragDropTarget(); // call after submitting an item that may receive a payload. If this returns true, you can call AcceptDragDropPayload() + EndDragDropTarget()
IMGUI_API const ImGuiPayload* AcceptDragDropPayload(const char* type, ImGuiDragDropFlags flags = 0); // accept contents of a given type. If ImGuiDragDropFlags_AcceptBeforeDelivery is set you can peek into the payload before the mouse button is released.
IMGUI_API void EndDragDropTarget(); // only call EndDragDropTarget() if BeginDragDropTarget() returns true!
IMGUI_API const ImGuiPayload* GetDragDropPayload(); // peek directly into the current payload from anywhere. may return NULL. use ImGuiPayload::IsDataType() to test for the payload type.
-
+
// Clipping
IMGUI_API void PushClipRect(const ImVec2& clip_rect_min, const ImVec2& clip_rect_max, bool intersect_with_current_clip_rect);
IMGUI_API void PopClipRect();
// Focus, Activation
- // (Prefer using "SetItemDefaultFocus()" over "if (IsWindowAppearing()) SetScrollHereY()" when applicable to signify "this is the default item")
+ // - Prefer using "SetItemDefaultFocus()" over "if (IsWindowAppearing()) SetScrollHereY()" when applicable to signify "this is the default item"
IMGUI_API void SetItemDefaultFocus(); // make last item the default focused item of a window.
IMGUI_API void SetKeyboardFocusHere(int offset = 0); // focus keyboard on the next widget. Use positive 'offset' to access sub components of a multiple component widget. Use -1 to access previous widget.
// Item/Widgets Utilities
- // See Demo Window under "Widgets->Querying Status" for an interactive visualization of many of those functions.
+ // - Most of the functions are referring to the last/previous item we submitted.
+ // - See Demo Window under "Widgets->Querying Status" for an interactive visualization of most of those functions.
IMGUI_API bool IsItemHovered(ImGuiHoveredFlags flags = 0); // is the last item hovered? (and usable, aka not blocked by a popup, etc.). See ImGuiHoveredFlags for more options.
IMGUI_API bool IsItemActive(); // is the last item active? (e.g. button being held, text field being edited. This will continuously return true while holding mouse button on an item. Items that don't interact will always return false)
IMGUI_API bool IsItemFocused(); // is the last item focused for keyboard/gamepad navigation?
- IMGUI_API bool IsItemClicked(int mouse_button = 0); // is the last item clicked? (e.g. button/node just clicked on) == IsMouseClicked(mouse_button) && IsItemHovered()
+ IMGUI_API bool IsItemClicked(ImGuiMouseButton mouse_button = 0); // is the last item clicked? (e.g. button/node just clicked on) == IsMouseClicked(mouse_button) && IsItemHovered()
IMGUI_API bool IsItemVisible(); // is the last item visible? (items may be out of sight because of clipping/scrolling)
IMGUI_API bool IsItemEdited(); // did the last item modify its underlying value this frame? or was pressed? This is generally the same as the "bool" return value of many widgets.
+ IMGUI_API bool IsItemActivated(); // was the last item just made active (item was previously inactive).
IMGUI_API bool IsItemDeactivated(); // was the last item just made inactive (item was previously active). Useful for Undo/Redo patterns with widgets that requires continuous editing.
IMGUI_API bool IsItemDeactivatedAfterEdit(); // was the last item just made inactive and made a value change when it was active? (e.g. Slider/Drag moved). Useful for Undo/Redo patterns with widgets that requires continuous editing. Note that you may get false positives (some widgets such as Combo()/ListBox()/Selectable() will return true even when clicking an already selected item).
- IMGUI_API bool IsAnyItemHovered();
- IMGUI_API bool IsAnyItemActive();
- IMGUI_API bool IsAnyItemFocused();
- IMGUI_API ImVec2 GetItemRectMin(); // get bounding rectangle of last item, in screen space
- IMGUI_API ImVec2 GetItemRectMax(); // "
- IMGUI_API ImVec2 GetItemRectSize(); // get size of last item, in screen space
+ IMGUI_API bool IsItemToggledOpen(); // was the last item open state toggled? set by TreeNode().
+ IMGUI_API bool IsAnyItemHovered(); // is any item hovered?
+ IMGUI_API bool IsAnyItemActive(); // is any item active?
+ IMGUI_API bool IsAnyItemFocused(); // is any item focused?
+ IMGUI_API ImVec2 GetItemRectMin(); // get upper-left bounding rectangle of the last item (screen space)
+ IMGUI_API ImVec2 GetItemRectMax(); // get lower-right bounding rectangle of the last item (screen space)
+ IMGUI_API ImVec2 GetItemRectSize(); // get size of last item
IMGUI_API void SetItemAllowOverlap(); // allow last item to be overlapped by a subsequent item. sometimes useful with invisible buttons, selectables, etc. to catch unused area.
// Miscellaneous Utilities
IMGUI_API bool IsRectVisible(const ImVec2& size); // test if rectangle (of given size, starting from cursor position) is visible / not clipped.
IMGUI_API bool IsRectVisible(const ImVec2& rect_min, const ImVec2& rect_max); // test if rectangle (in screen space) is visible / not clipped. to perform coarse clipping on user's side.
- IMGUI_API double GetTime();
- IMGUI_API int GetFrameCount();
- IMGUI_API ImDrawList* GetOverlayDrawList(); // this draw list will be the last rendered one, useful to quickly draw overlays shapes/text
- IMGUI_API ImDrawListSharedData* GetDrawListSharedData(); // you may use this when creating your own ImDrawList instances
- IMGUI_API const char* GetStyleColorName(ImGuiCol idx);
+ IMGUI_API double GetTime(); // get global imgui time. incremented by io.DeltaTime every frame.
+ IMGUI_API int GetFrameCount(); // get global imgui frame count. incremented by 1 every frame.
+ IMGUI_API ImDrawList* GetBackgroundDrawList(); // this draw list will be the first rendering one. Useful to quickly draw shapes/text behind dear imgui contents.
+ IMGUI_API ImDrawList* GetForegroundDrawList(); // this draw list will be the last rendered one. Useful to quickly draw shapes/text over dear imgui contents.
+ IMGUI_API ImDrawListSharedData* GetDrawListSharedData(); // you may use this when creating your own ImDrawList instances.
+ IMGUI_API const char* GetStyleColorName(ImGuiCol idx); // get a string corresponding to the enum value (for display, saving, etc.).
IMGUI_API void SetStateStorage(ImGuiStorage* storage); // replace current window storage with our own (if you want to manipulate it yourself, typically clear subsection of it)
IMGUI_API ImGuiStorage* GetStateStorage();
IMGUI_API ImVec2 CalcTextSize(const char* text, const char* text_end = NULL, bool hide_text_after_double_hash = false, float wrap_width = -1.0f);
@@ -565,50 +685,61 @@ namespace ImGui
IMGUI_API void ColorConvertRGBtoHSV(float r, float g, float b, float& out_h, float& out_s, float& out_v);
IMGUI_API void ColorConvertHSVtoRGB(float h, float s, float v, float& out_r, float& out_g, float& out_b);
- // Inputs Utilities
+ // Inputs Utilities: Keyboard
+ // - For 'int user_key_index' you can use your own indices/enums according to how your backend/engine stored them in io.KeysDown[].
+ // - We don't know the meaning of those value. You can use GetKeyIndex() to map a ImGuiKey_ value into the user index.
IMGUI_API int GetKeyIndex(ImGuiKey imgui_key); // map ImGuiKey_* values into user's key index. == io.KeyMap[key]
- IMGUI_API bool IsKeyDown(int user_key_index); // is key being held. == io.KeysDown[user_key_index]. note that imgui doesn't know the semantic of each entry of io.KeysDown[]. Use your own indices/enums according to how your backend/engine stored them into io.KeysDown[]!
- IMGUI_API bool IsKeyPressed(int user_key_index, bool repeat = true); // was key pressed (went from !Down to Down). if repeat=true, uses io.KeyRepeatDelay / KeyRepeatRate
- IMGUI_API bool IsKeyReleased(int user_key_index); // was key released (went from Down to !Down)..
+ IMGUI_API bool IsKeyDown(int user_key_index); // is key being held. == io.KeysDown[user_key_index].
+ IMGUI_API bool IsKeyPressed(int user_key_index, bool repeat = true); // was key pressed (went from !Down to Down)? if repeat=true, uses io.KeyRepeatDelay / KeyRepeatRate
+ IMGUI_API bool IsKeyReleased(int user_key_index); // was key released (went from Down to !Down)?
IMGUI_API int GetKeyPressedAmount(int key_index, float repeat_delay, float rate); // uses provided repeat rate/delay. return a count, most often 0 or 1 but might be >1 if RepeatRate is small enough that DeltaTime > RepeatRate
- IMGUI_API bool IsMouseDown(int button); // is mouse button held (0=left, 1=right, 2=middle)
- IMGUI_API bool IsAnyMouseDown(); // is any mouse button held
- IMGUI_API bool IsMouseClicked(int button, bool repeat = false); // did mouse button clicked (went from !Down to Down) (0=left, 1=right, 2=middle)
- IMGUI_API bool IsMouseDoubleClicked(int button); // did mouse button double-clicked. a double-click returns false in IsMouseClicked(). uses io.MouseDoubleClickTime.
- IMGUI_API bool IsMouseReleased(int button); // did mouse button released (went from Down to !Down)
- IMGUI_API bool IsMouseDragging(int button = 0, float lock_threshold = -1.0f); // is mouse dragging. if lock_threshold < -1.0f uses io.MouseDraggingThreshold
- IMGUI_API bool IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool clip = true); // is mouse hovering given bounding rect (in screen space). clipped by current clipping settings, but disregarding of other consideration of focus/window ordering/popup-block.
- IMGUI_API bool IsMousePosValid(const ImVec2* mouse_pos = NULL); //
+ IMGUI_API void CaptureKeyboardFromApp(bool want_capture_keyboard_value = true); // attention: misleading name! manually override io.WantCaptureKeyboard flag next frame (said flag is entirely left for your application to handle). e.g. force capture keyboard when your widget is being hovered. This is equivalent to setting "io.WantCaptureKeyboard = want_capture_keyboard_value"; after the next NewFrame() call.
+
+ // Inputs Utilities: Mouse
+ // - To refer to a mouse button, you may use named enums in your code e.g. ImGuiMouseButton_Left, ImGuiMouseButton_Right.
+ // - You can also use regular integer: it is forever guaranteed that 0=Left, 1=Right, 2=Middle.
+ // - Dragging operations are only reported after mouse has moved a certain distance away from the initial clicking position (see 'lock_threshold' and 'io.MouseDraggingThreshold')
+ IMGUI_API bool IsMouseDown(ImGuiMouseButton button); // is mouse button held?
+ IMGUI_API bool IsMouseClicked(ImGuiMouseButton button, bool repeat = false); // did mouse button clicked? (went from !Down to Down)
+ IMGUI_API bool IsMouseReleased(ImGuiMouseButton button); // did mouse button released? (went from Down to !Down)
+ IMGUI_API bool IsMouseDoubleClicked(ImGuiMouseButton button); // did mouse button double-clicked? a double-click returns false in IsMouseClicked(). uses io.MouseDoubleClickTime.
+ IMGUI_API bool IsMouseHoveringRect(const ImVec2& r_min, const ImVec2& r_max, bool clip = true);// is mouse hovering given bounding rect (in screen space). clipped by current clipping settings, but disregarding of other consideration of focus/window ordering/popup-block.
+ IMGUI_API bool IsMousePosValid(const ImVec2* mouse_pos = NULL); // by convention we use (-FLT_MAX,-FLT_MAX) to denote that there is no mouse available
+ IMGUI_API bool IsAnyMouseDown(); // is any mouse button held?
IMGUI_API ImVec2 GetMousePos(); // shortcut to ImGui::GetIO().MousePos provided by user, to be consistent with other calls
- IMGUI_API ImVec2 GetMousePosOnOpeningCurrentPopup(); // retrieve backup of mouse position at the time of opening popup we have BeginPopup() into
- IMGUI_API ImVec2 GetMouseDragDelta(int button = 0, float lock_threshold = -1.0f); // dragging amount since clicking. if lock_threshold < -1.0f uses io.MouseDraggingThreshold
- IMGUI_API void ResetMouseDragDelta(int button = 0); //
+ IMGUI_API ImVec2 GetMousePosOnOpeningCurrentPopup(); // retrieve mouse position at the time of opening popup we have BeginPopup() into (helper to avoid user backing that value themselves)
+ IMGUI_API bool IsMouseDragging(ImGuiMouseButton button, float lock_threshold = -1.0f); // is mouse dragging? (if lock_threshold < -1.0f, uses io.MouseDraggingThreshold)
+ IMGUI_API ImVec2 GetMouseDragDelta(ImGuiMouseButton button = 0, float lock_threshold = -1.0f); // return the delta from the initial clicking position while the mouse button is pressed or was just released. This is locked and return 0.0f until the mouse moves past a distance threshold at least once (if lock_threshold < -1.0f, uses io.MouseDraggingThreshold)
+ IMGUI_API void ResetMouseDragDelta(ImGuiMouseButton button = 0); //
IMGUI_API ImGuiMouseCursor GetMouseCursor(); // get desired cursor type, reset in ImGui::NewFrame(), this is updated during the frame. valid before Render(). If you use software rendering by setting io.MouseDrawCursor ImGui will render those for you
- IMGUI_API void SetMouseCursor(ImGuiMouseCursor type); // set desired cursor type
- IMGUI_API void CaptureKeyboardFromApp(bool capture = true); // manually override io.WantCaptureKeyboard flag next frame (said flag is entirely left for your application to handle). e.g. force capture keyboard when your widget is being hovered.
- IMGUI_API void CaptureMouseFromApp(bool capture = true); // manually override io.WantCaptureMouse flag next frame (said flag is entirely left for your application to handle).
+ IMGUI_API void SetMouseCursor(ImGuiMouseCursor cursor_type); // set desired cursor type
+ IMGUI_API void CaptureMouseFromApp(bool want_capture_mouse_value = true); // attention: misleading name! manually override io.WantCaptureMouse flag next frame (said flag is entirely left for your application to handle). This is equivalent to setting "io.WantCaptureMouse = want_capture_mouse_value;" after the next NewFrame() call.
// Clipboard Utilities (also see the LogToClipboard() function to capture or output text data to the clipboard)
IMGUI_API const char* GetClipboardText();
IMGUI_API void SetClipboardText(const char* text);
// Settings/.Ini Utilities
- // The disk functions are automatically called if io.IniFilename != NULL (default is "imgui.ini").
- // Set io.IniFilename to NULL to load/save manually. Read io.WantSaveIniSettings description about handling .ini saving manually.
+ // - The disk functions are automatically called if io.IniFilename != NULL (default is "imgui.ini").
+ // - Set io.IniFilename to NULL to load/save manually. Read io.WantSaveIniSettings description about handling .ini saving manually.
IMGUI_API void LoadIniSettingsFromDisk(const char* ini_filename); // call after CreateContext() and before the first call to NewFrame(). NewFrame() automatically calls LoadIniSettingsFromDisk(io.IniFilename).
IMGUI_API void LoadIniSettingsFromMemory(const char* ini_data, size_t ini_size=0); // call after CreateContext() and before the first call to NewFrame() to provide .ini data from your own data source.
- IMGUI_API void SaveIniSettingsToDisk(const char* ini_filename);
+ IMGUI_API void SaveIniSettingsToDisk(const char* ini_filename); // this is automatically called (if io.IniFilename is not empty) a few seconds after any modification that should be reflected in the .ini file (and also by DestroyContext).
IMGUI_API const char* SaveIniSettingsToMemory(size_t* out_ini_size = NULL); // return a zero-terminated string with the .ini data which you can save by your own mean. call when io.WantSaveIniSettings is set, then save data by your own mean and clear io.WantSaveIniSettings.
- // Memory Utilities
- // All those functions are not reliant on the current context.
- // If you reload the contents of imgui.cpp at runtime, you may need to call SetCurrentContext() + SetAllocatorFunctions() again.
- IMGUI_API void SetAllocatorFunctions(void* (*alloc_func)(size_t sz, void* user_data), void(*free_func)(void* ptr, void* user_data), void* user_data = NULL);
+ // Memory Allocators
+ // - All those functions are not reliant on the current context.
+ // - If you reload the contents of imgui.cpp at runtime, you may need to call SetCurrentContext() + SetAllocatorFunctions() again because we use global storage for those.
+ IMGUI_API void SetAllocatorFunctions(void* (*alloc_func)(size_t sz, void* user_data), void (*free_func)(void* ptr, void* user_data), void* user_data = NULL);
IMGUI_API void* MemAlloc(size_t size);
IMGUI_API void MemFree(void* ptr);
} // namespace ImGui
+//-----------------------------------------------------------------------------
+// Flags & Enumerations
+//-----------------------------------------------------------------------------
+
// Flags for ImGui::Begin()
enum ImGuiWindowFlags_
{
@@ -616,7 +747,7 @@ enum ImGuiWindowFlags_
ImGuiWindowFlags_NoTitleBar = 1 << 0, // Disable title-bar
ImGuiWindowFlags_NoResize = 1 << 1, // Disable user resizing with the lower-right grip
ImGuiWindowFlags_NoMove = 1 << 2, // Disable user moving the window
- ImGuiWindowFlags_NoScrollbar = 1 << 3, // Disable scrollbars (window can still scroll with mouse or programatically)
+ ImGuiWindowFlags_NoScrollbar = 1 << 3, // Disable scrollbars (window can still scroll with mouse or programmatically)
ImGuiWindowFlags_NoScrollWithMouse = 1 << 4, // Disable user vertically scrolling with mouse wheel. On child window, mouse wheel will be forwarded to the parent unless NoScrollbar is also set.
ImGuiWindowFlags_NoCollapse = 1 << 5, // Disable user collapsing window by double-clicking on it
ImGuiWindowFlags_AlwaysAutoResize = 1 << 6, // Resize every window to its content every frame
@@ -626,12 +757,13 @@ enum ImGuiWindowFlags_
ImGuiWindowFlags_MenuBar = 1 << 10, // Has a menu-bar
ImGuiWindowFlags_HorizontalScrollbar = 1 << 11, // Allow horizontal scrollbar to appear (off by default). You may use SetNextWindowContentSize(ImVec2(width,0.0f)); prior to calling Begin() to specify width. Read code in imgui_demo in the "Horizontal Scrolling" section.
ImGuiWindowFlags_NoFocusOnAppearing = 1 << 12, // Disable taking focus when transitioning from hidden to visible state
- ImGuiWindowFlags_NoBringToFrontOnFocus = 1 << 13, // Disable bringing window to front when taking focus (e.g. clicking on it or programatically giving it focus)
+ ImGuiWindowFlags_NoBringToFrontOnFocus = 1 << 13, // Disable bringing window to front when taking focus (e.g. clicking on it or programmatically giving it focus)
ImGuiWindowFlags_AlwaysVerticalScrollbar= 1 << 14, // Always show vertical scrollbar (even if ContentSize.y < Size.y)
ImGuiWindowFlags_AlwaysHorizontalScrollbar=1<< 15, // Always show horizontal scrollbar (even if ContentSize.x < Size.x)
ImGuiWindowFlags_AlwaysUseWindowPadding = 1 << 16, // Ensure child windows without border uses style.WindowPadding (ignored by default for non-bordered child windows, because more convenient)
ImGuiWindowFlags_NoNavInputs = 1 << 18, // No gamepad/keyboard navigation within the window
ImGuiWindowFlags_NoNavFocus = 1 << 19, // No focusing toward this window with gamepad/keyboard navigation (e.g. skipped by CTRL+TAB)
+ ImGuiWindowFlags_UnsavedDocument = 1 << 20, // Append '*' to title without affecting the ID, as a convenience to avoid using the ### operator. When used in a tab/docking context, tab is selected on closure and closure is deferred by one frame to allow code to cancel the closure (with a confirmation popup, etc.) without flicker.
ImGuiWindowFlags_NoNav = ImGuiWindowFlags_NoNavInputs | ImGuiWindowFlags_NoNavFocus,
ImGuiWindowFlags_NoDecoration = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoCollapse,
ImGuiWindowFlags_NoInputs = ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoNavInputs | ImGuiWindowFlags_NoNavFocus,
@@ -645,8 +777,8 @@ enum ImGuiWindowFlags_
ImGuiWindowFlags_ChildMenu = 1 << 28 // Don't use! For internal use by BeginMenu()
// [Obsolete]
- //ImGuiWindowFlags_ShowBorders = 1 << 7, // --> Set style.FrameBorderSize=1.0f / style.WindowBorderSize=1.0f to enable borders around windows and items
- //ImGuiWindowFlags_ResizeFromAnySide = 1 << 17, // --> Set io.ConfigResizeWindowsFromEdges and make sure mouse cursors are supported by back-end (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors)
+ //ImGuiWindowFlags_ShowBorders = 1 << 7, // --> Set style.FrameBorderSize=1.0f or style.WindowBorderSize=1.0f to enable borders around items or windows.
+ //ImGuiWindowFlags_ResizeFromAnySide = 1 << 17, // --> Set io.ConfigWindowsResizeFromEdges=true and make sure mouse cursors are supported by back-end (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors)
};
// Flags for ImGui::InputText()
@@ -658,7 +790,7 @@ enum ImGuiInputTextFlags_
ImGuiInputTextFlags_CharsUppercase = 1 << 2, // Turn a..z into A..Z
ImGuiInputTextFlags_CharsNoBlank = 1 << 3, // Filter out spaces, tabs
ImGuiInputTextFlags_AutoSelectAll = 1 << 4, // Select entire text when first taking mouse focus
- ImGuiInputTextFlags_EnterReturnsTrue = 1 << 5, // Return 'true' when Enter is pressed (as opposed to when the value was modified)
+ ImGuiInputTextFlags_EnterReturnsTrue = 1 << 5, // Return 'true' when Enter is pressed (as opposed to every time the value was modified). Consider looking at the IsItemDeactivatedAfterEdit() function.
ImGuiInputTextFlags_CallbackCompletion = 1 << 6, // Callback on pressing TAB (for completion handling)
ImGuiInputTextFlags_CallbackHistory = 1 << 7, // Callback on pressing Up/Down arrows (for history handling)
ImGuiInputTextFlags_CallbackAlways = 1 << 8, // Callback on each iteration. User code may query cursor position, modify text buffer.
@@ -673,7 +805,8 @@ enum ImGuiInputTextFlags_
ImGuiInputTextFlags_CharsScientific = 1 << 17, // Allow 0123456789.+-*/eE (Scientific notation input)
ImGuiInputTextFlags_CallbackResize = 1 << 18, // Callback on buffer capacity changes request (beyond 'buf_size' parameter value), allowing the string to grow. Notify when the string wants to be resized (for string types which hold a cache of their Size). You will be provided a new BufSize in the callback and NEED to honor it. (see misc/cpp/imgui_stdlib.h for an example of using this)
// [Internal]
- ImGuiInputTextFlags_Multiline = 1 << 20 // For internal use by InputTextMultiline()
+ ImGuiInputTextFlags_Multiline = 1 << 20, // For internal use by InputTextMultiline()
+ ImGuiInputTextFlags_NoMarkEdited = 1 << 21 // For internal use by functions using InputText() before reformatting data
};
// Flags for ImGui::TreeNodeEx(), ImGui::CollapsingHeader*()
@@ -691,15 +824,11 @@ enum ImGuiTreeNodeFlags_
ImGuiTreeNodeFlags_Leaf = 1 << 8, // No collapsing, no arrow (use as a convenience for leaf nodes).
ImGuiTreeNodeFlags_Bullet = 1 << 9, // Display a bullet instead of arrow
ImGuiTreeNodeFlags_FramePadding = 1 << 10, // Use FramePadding (even for an unframed text node) to vertically align text baseline to regular widget height. Equivalent to calling AlignTextToFramePadding().
- //ImGuITreeNodeFlags_SpanAllAvailWidth = 1 << 11, // FIXME: TODO: Extend hit box horizontally even if not framed
- //ImGuiTreeNodeFlags_NoScrollOnOpen = 1 << 12, // FIXME: TODO: Disable automatic scroll on TreePop() if node got just open and contents is not visible
+ ImGuiTreeNodeFlags_SpanAvailWidth = 1 << 11, // Extend hit box to the right-most edge, even if not framed. This is not the default in order to allow adding other items on the same line. In the future we may refactor the hit system to be front-to-back, allowing natural overlaps and then this can become the default.
+ ImGuiTreeNodeFlags_SpanFullWidth = 1 << 12, // Extend hit box to the left-most and right-most edges (bypass the indented area).
ImGuiTreeNodeFlags_NavLeftJumpsBackHere = 1 << 13, // (WIP) Nav: left direction may move to this TreeNode() from any of its child (items submitted between TreeNode and TreePop)
+ //ImGuiTreeNodeFlags_NoScrollOnOpen = 1 << 14, // FIXME: TODO: Disable automatic scroll on TreePop() if node got just open and contents is not visible
ImGuiTreeNodeFlags_CollapsingHeader = ImGuiTreeNodeFlags_Framed | ImGuiTreeNodeFlags_NoTreePushOnOpen | ImGuiTreeNodeFlags_NoAutoOpenOnLog
-
- // Obsolete names (will be removed)
-#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
- , ImGuiTreeNodeFlags_AllowOverlapMode = ImGuiTreeNodeFlags_AllowItemOverlap
-#endif
};
// Flags for ImGui::Selectable()
@@ -709,7 +838,8 @@ enum ImGuiSelectableFlags_
ImGuiSelectableFlags_DontClosePopups = 1 << 0, // Clicking this don't close parent popup window
ImGuiSelectableFlags_SpanAllColumns = 1 << 1, // Selectable frame can span all columns (text will still fit in current column)
ImGuiSelectableFlags_AllowDoubleClick = 1 << 2, // Generate press events on double clicks too
- ImGuiSelectableFlags_Disabled = 1 << 3 // Cannot be selected, display greyed out text
+ ImGuiSelectableFlags_Disabled = 1 << 3, // Cannot be selected, display grayed out text
+ ImGuiSelectableFlags_AllowItemOverlap = 1 << 4 // (WIP) Hit testing to allow subsequent widgets to overlap this one
};
// Flags for ImGui::BeginCombo()
@@ -726,13 +856,39 @@ enum ImGuiComboFlags_
ImGuiComboFlags_HeightMask_ = ImGuiComboFlags_HeightSmall | ImGuiComboFlags_HeightRegular | ImGuiComboFlags_HeightLarge | ImGuiComboFlags_HeightLargest
};
+// Flags for ImGui::BeginTabBar()
+enum ImGuiTabBarFlags_
+{
+ ImGuiTabBarFlags_None = 0,
+ ImGuiTabBarFlags_Reorderable = 1 << 0, // Allow manually dragging tabs to re-order them + New tabs are appended at the end of list
+ ImGuiTabBarFlags_AutoSelectNewTabs = 1 << 1, // Automatically select new tabs when they appear
+ ImGuiTabBarFlags_TabListPopupButton = 1 << 2, // Disable buttons to open the tab list popup
+ ImGuiTabBarFlags_NoCloseWithMiddleMouseButton = 1 << 3, // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You can still repro this behavior on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false.
+ ImGuiTabBarFlags_NoTabListScrollingButtons = 1 << 4, // Disable scrolling buttons (apply when fitting policy is ImGuiTabBarFlags_FittingPolicyScroll)
+ ImGuiTabBarFlags_NoTooltip = 1 << 5, // Disable tooltips when hovering a tab
+ ImGuiTabBarFlags_FittingPolicyResizeDown = 1 << 6, // Resize tabs when they don't fit
+ ImGuiTabBarFlags_FittingPolicyScroll = 1 << 7, // Add scroll buttons when tabs don't fit
+ ImGuiTabBarFlags_FittingPolicyMask_ = ImGuiTabBarFlags_FittingPolicyResizeDown | ImGuiTabBarFlags_FittingPolicyScroll,
+ ImGuiTabBarFlags_FittingPolicyDefault_ = ImGuiTabBarFlags_FittingPolicyResizeDown
+};
+
+// Flags for ImGui::BeginTabItem()
+enum ImGuiTabItemFlags_
+{
+ ImGuiTabItemFlags_None = 0,
+ ImGuiTabItemFlags_UnsavedDocument = 1 << 0, // Append '*' to title without affecting the ID, as a convenience to avoid using the ### operator. Also: tab is selected on closure and closure is deferred by one frame to allow code to undo it without flicker.
+ ImGuiTabItemFlags_SetSelected = 1 << 1, // Trigger flag to programmatically make the tab selected when calling BeginTabItem()
+ ImGuiTabItemFlags_NoCloseWithMiddleMouseButton = 1 << 2, // Disable behavior of closing tabs (that are submitted with p_open != NULL) with middle mouse button. You can still repro this behavior on user's side with if (IsItemHovered() && IsMouseClicked(2)) *p_open = false.
+ ImGuiTabItemFlags_NoPushId = 1 << 3 // Don't call PushID(tab->ID)/PopID() on BeginTabItem()/EndTabItem()
+};
+
// Flags for ImGui::IsWindowFocused()
enum ImGuiFocusedFlags_
{
ImGuiFocusedFlags_None = 0,
ImGuiFocusedFlags_ChildWindows = 1 << 0, // IsWindowFocused(): Return true if any children of the window is focused
ImGuiFocusedFlags_RootWindow = 1 << 1, // IsWindowFocused(): Test from root window (top most parent of the current hierarchy)
- ImGuiFocusedFlags_AnyWindow = 1 << 2, // IsWindowFocused(): Return true if any window is focused
+ ImGuiFocusedFlags_AnyWindow = 1 << 2, // IsWindowFocused(): Return true if any window is focused. Important: If you are trying to tell how to dispatch your low-level inputs, do NOT use this. Use ImGui::GetIO().WantCaptureMouse instead.
ImGuiFocusedFlags_RootAndChildWindows = ImGuiFocusedFlags_RootWindow | ImGuiFocusedFlags_ChildWindows
};
@@ -748,7 +904,7 @@ enum ImGuiHoveredFlags_
ImGuiHoveredFlags_AllowWhenBlockedByPopup = 1 << 3, // Return true even if a popup window is normally blocking access to this item/window
//ImGuiHoveredFlags_AllowWhenBlockedByModal = 1 << 4, // Return true even if a modal popup window is normally blocking access to this item/window. FIXME-TODO: Unavailable yet.
ImGuiHoveredFlags_AllowWhenBlockedByActiveItem = 1 << 5, // Return true even if an active item is blocking access to this item/window. Useful for Drag and Drop patterns.
- ImGuiHoveredFlags_AllowWhenOverlapped = 1 << 6, // Return true even if the position is overlapped by another window
+ ImGuiHoveredFlags_AllowWhenOverlapped = 1 << 6, // Return true even if the position is obstructed or overlapped by another window
ImGuiHoveredFlags_AllowWhenDisabled = 1 << 7, // Return true even if the item is disabled
ImGuiHoveredFlags_RectOnly = ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem | ImGuiHoveredFlags_AllowWhenOverlapped,
ImGuiHoveredFlags_RootAndChildWindows = ImGuiHoveredFlags_RootWindow | ImGuiHoveredFlags_ChildWindows
@@ -763,7 +919,7 @@ enum ImGuiDragDropFlags_
ImGuiDragDropFlags_SourceNoDisableHover = 1 << 1, // By default, when dragging we clear data so that IsItemHovered() will return false, to avoid subsequent user code submitting tooltips. This flag disable this behavior so you can still call IsItemHovered() on the source item.
ImGuiDragDropFlags_SourceNoHoldToOpenOthers = 1 << 2, // Disable the behavior that allows to open tree nodes and collapsing header by holding over them while dragging a source item.
ImGuiDragDropFlags_SourceAllowNullID = 1 << 3, // Allow items such as Text(), Image() that have no unique identifier to be used as drag source, by manufacturing a temporary identifier based on their window-relative position. This is extremely unusual within the dear imgui ecosystem and so we made it explicit.
- ImGuiDragDropFlags_SourceExtern = 1 << 4, // External source (from outside of imgui), won't attempt to read current item/window info. Will always return true. Only one Extern source can be active simultaneously.
+ ImGuiDragDropFlags_SourceExtern = 1 << 4, // External source (from outside of dear imgui), won't attempt to read current item/window info. Will always return true. Only one Extern source can be active simultaneously.
ImGuiDragDropFlags_SourceAutoExpirePayload = 1 << 5, // Automatically expire the payload if the source cease to be submitted (otherwise payloads are persisting while being dragged)
// AcceptDragDropPayload() flags
ImGuiDragDropFlags_AcceptBeforeDelivery = 1 << 10, // AcceptDragDropPayload() will returns true even before the mouse button is released. You can then call IsDelivery() to test if the payload needs to be delivered.
@@ -779,10 +935,14 @@ enum ImGuiDragDropFlags_
// A primary data type
enum ImGuiDataType_
{
+ ImGuiDataType_S8, // signed char / char (with sensible compilers)
+ ImGuiDataType_U8, // unsigned char
+ ImGuiDataType_S16, // short
+ ImGuiDataType_U16, // unsigned short
ImGuiDataType_S32, // int
ImGuiDataType_U32, // unsigned int
- ImGuiDataType_S64, // long long, __int64
- ImGuiDataType_U64, // unsigned long long, unsigned __int64
+ ImGuiDataType_S64, // long long / __int64
+ ImGuiDataType_U64, // unsigned long long / unsigned __int64
ImGuiDataType_Float, // float
ImGuiDataType_Double, // double
ImGuiDataType_COUNT
@@ -817,12 +977,13 @@ enum ImGuiKey_
ImGuiKey_Space,
ImGuiKey_Enter,
ImGuiKey_Escape,
- ImGuiKey_A, // for text edit CTRL+A: select all
- ImGuiKey_C, // for text edit CTRL+C: copy
- ImGuiKey_V, // for text edit CTRL+V: paste
- ImGuiKey_X, // for text edit CTRL+X: cut
- ImGuiKey_Y, // for text edit CTRL+Y: redo
- ImGuiKey_Z, // for text edit CTRL+Z: undo
+ ImGuiKey_KeyPadEnter,
+ ImGuiKey_A, // for text edit CTRL+A: select all
+ ImGuiKey_C, // for text edit CTRL+C: copy
+ ImGuiKey_V, // for text edit CTRL+V: paste
+ ImGuiKey_X, // for text edit CTRL+X: cut
+ ImGuiKey_Y, // for text edit CTRL+Y: redo
+ ImGuiKey_Z, // for text edit CTRL+Z: undo
ImGuiKey_COUNT
};
@@ -864,6 +1025,7 @@ enum ImGuiNavInput_
// Configuration flags stored in io.ConfigFlags. Set by user/application.
enum ImGuiConfigFlags_
{
+ ImGuiConfigFlags_None = 0,
ImGuiConfigFlags_NavEnableKeyboard = 1 << 0, // Master keyboard navigation enable flag. NewFrame() will automatically fill io.NavInputs[] based on io.KeysDown[].
ImGuiConfigFlags_NavEnableGamepad = 1 << 1, // Master gamepad navigation enable flag. This is mostly to instruct your imgui back-end to fill io.NavInputs[]. Back-end also needs to set ImGuiBackendFlags_HasGamepad.
ImGuiConfigFlags_NavEnableSetMousePos = 1 << 2, // Instruct navigation to move the mouse cursor. May be useful on TV/console systems where moving a virtual mouse is awkward. Will update io.MousePos and set io.WantSetMousePos=true. If enabled you MUST honor io.WantSetMousePos requests in your binding, otherwise ImGui will react as if the mouse is jumping around back and forth.
@@ -871,7 +1033,7 @@ enum ImGuiConfigFlags_
ImGuiConfigFlags_NoMouse = 1 << 4, // Instruct imgui to clear mouse position/buttons in NewFrame(). This allows ignoring the mouse information set by the back-end.
ImGuiConfigFlags_NoMouseCursorChange = 1 << 5, // Instruct back-end to not alter mouse cursor shape and visibility. Use if the back-end cursor changes are interfering with yours and you don't want to use SetMouseCursor() to change mouse cursor. You may want to honor requests from imgui by reading GetMouseCursor() yourself instead.
- // User storage (to allow your back-end/engine to communicate to code that may be shared between multiple projects. Those flags are not used by core ImGui)
+ // User storage (to allow your back-end/engine to communicate to code that may be shared between multiple projects. Those flags are not used by core Dear ImGui)
ImGuiConfigFlags_IsSRGB = 1 << 20, // Application is SRGB-aware.
ImGuiConfigFlags_IsTouchScreen = 1 << 21 // Application is using a touch screen instead of a mouse.
};
@@ -879,9 +1041,11 @@ enum ImGuiConfigFlags_
// Back-end capabilities flags stored in io.BackendFlags. Set by imgui_impl_xxx or custom back-end.
enum ImGuiBackendFlags_
{
- ImGuiBackendFlags_HasGamepad = 1 << 0, // Back-end supports gamepad and currently has one connected.
- ImGuiBackendFlags_HasMouseCursors = 1 << 1, // Back-end supports honoring GetMouseCursor() value to change the OS cursor shape.
- ImGuiBackendFlags_HasSetMousePos = 1 << 2 // Back-end supports io.WantSetMousePos requests to reposition the OS mouse position (only used if ImGuiConfigFlags_NavEnableSetMousePos is set).
+ ImGuiBackendFlags_None = 0,
+ ImGuiBackendFlags_HasGamepad = 1 << 0, // Back-end Platform supports gamepad and currently has one connected.
+ ImGuiBackendFlags_HasMouseCursors = 1 << 1, // Back-end Platform supports honoring GetMouseCursor() value to change the OS cursor shape.
+ ImGuiBackendFlags_HasSetMousePos = 1 << 2, // Back-end Platform supports io.WantSetMousePos requests to reposition the OS mouse position (only used if ImGuiConfigFlags_NavEnableSetMousePos is set).
+ ImGuiBackendFlags_RendererHasVtxOffset = 1 << 3 // Back-end Renderer supports ImDrawCmd::VtxOffset. This enables output of large meshes (64K+ vertices) while still using 16-bit indices.
};
// Enumeration for PushStyleColor() / PopStyleColor()
@@ -911,7 +1075,7 @@ enum ImGuiCol_
ImGuiCol_Button,
ImGuiCol_ButtonHovered,
ImGuiCol_ButtonActive,
- ImGuiCol_Header,
+ ImGuiCol_Header, // Header* colors are used for CollapsingHeader, TreeNode, Selectable, MenuItem
ImGuiCol_HeaderHovered,
ImGuiCol_HeaderActive,
ImGuiCol_Separator,
@@ -920,6 +1084,11 @@ enum ImGuiCol_
ImGuiCol_ResizeGrip,
ImGuiCol_ResizeGripHovered,
ImGuiCol_ResizeGripActive,
+ ImGuiCol_Tab,
+ ImGuiCol_TabHovered,
+ ImGuiCol_TabActive,
+ ImGuiCol_TabUnfocused,
+ ImGuiCol_TabUnfocusedActive,
ImGuiCol_PlotLines,
ImGuiCol_PlotLinesHovered,
ImGuiCol_PlotHistogram,
@@ -934,10 +1103,8 @@ enum ImGuiCol_
// Obsolete names (will be removed)
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
- , ImGuiCol_ChildWindowBg = ImGuiCol_ChildBg, ImGuiCol_Column = ImGuiCol_Separator, ImGuiCol_ColumnHovered = ImGuiCol_SeparatorHovered, ImGuiCol_ColumnActive = ImGuiCol_SeparatorActive
- , ImGuiCol_ModalWindowDarkening = ImGuiCol_ModalWindowDimBg
- //ImGuiCol_CloseButton, ImGuiCol_CloseButtonActive, ImGuiCol_CloseButtonHovered, // [unused since 1.60+] the close button now uses regular button colors.
- //ImGuiCol_ComboBg, // [unused since 1.53+] ComboBg has been merged with PopupBg, so a redirect isn't accurate.
+ , ImGuiCol_ModalWindowDarkening = ImGuiCol_ModalWindowDimBg // [renamed in 1.63]
+ //, ImGuiCol_CloseButton, ImGuiCol_CloseButtonActive, ImGuiCol_CloseButtonHovered// [unused since 1.60+] the close button now uses regular button colors.
#endif
};
@@ -946,7 +1113,7 @@ enum ImGuiCol_
// NB: if changing this enum, you need to update the associated internal table GStyleVarInfo[] accordingly. This is where we link enum values to members offset/type.
enum ImGuiStyleVar_
{
- // Enum name ......................// Member in ImGuiStyle structure (see ImGuiStyle for descriptions)
+ // Enum name --------------------- // Member in ImGuiStyle structure (see ImGuiStyle for descriptions)
ImGuiStyleVar_Alpha, // float Alpha
ImGuiStyleVar_WindowPadding, // ImVec2 WindowPadding
ImGuiStyleVar_WindowRounding, // float WindowRounding
@@ -967,20 +1134,22 @@ enum ImGuiStyleVar_
ImGuiStyleVar_ScrollbarRounding, // float ScrollbarRounding
ImGuiStyleVar_GrabMinSize, // float GrabMinSize
ImGuiStyleVar_GrabRounding, // float GrabRounding
+ ImGuiStyleVar_TabRounding, // float TabRounding
ImGuiStyleVar_ButtonTextAlign, // ImVec2 ButtonTextAlign
+ ImGuiStyleVar_SelectableTextAlign, // ImVec2 SelectableTextAlign
ImGuiStyleVar_COUNT
// Obsolete names (will be removed)
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
- , ImGuiStyleVar_Count_ = ImGuiStyleVar_COUNT, ImGuiStyleVar_ChildWindowRounding = ImGuiStyleVar_ChildRounding
+ , ImGuiStyleVar_Count_ = ImGuiStyleVar_COUNT // [renamed in 1.60]
#endif
};
-// Enumeration for ColorEdit3() / ColorEdit4() / ColorPicker3() / ColorPicker4() / ColorButton()
+// Flags for ColorEdit3() / ColorEdit4() / ColorPicker3() / ColorPicker4() / ColorButton()
enum ImGuiColorEditFlags_
{
ImGuiColorEditFlags_None = 0,
- ImGuiColorEditFlags_NoAlpha = 1 << 1, // // ColorEdit, ColorPicker, ColorButton: ignore Alpha component (read 3 components from the input pointer).
+ ImGuiColorEditFlags_NoAlpha = 1 << 1, // // ColorEdit, ColorPicker, ColorButton: ignore Alpha component (will only read 3 components from the input pointer).
ImGuiColorEditFlags_NoPicker = 1 << 2, // // ColorEdit: disable picker when clicking on colored square.
ImGuiColorEditFlags_NoOptions = 1 << 3, // // ColorEdit: disable toggling options menu when right-clicking on inputs/small preview.
ImGuiColorEditFlags_NoSmallPreview = 1 << 4, // // ColorEdit, ColorPicker: disable colored square preview next to the inputs. (e.g. to show only the inputs)
@@ -990,24 +1159,45 @@ enum ImGuiColorEditFlags_
ImGuiColorEditFlags_NoSidePreview = 1 << 8, // // ColorPicker: disable bigger color preview on right side of the picker, use small colored square preview instead.
ImGuiColorEditFlags_NoDragDrop = 1 << 9, // // ColorEdit: disable drag and drop target. ColorButton: disable drag and drop source.
- // User Options (right-click on widget to change some of them). You can set application defaults using SetColorEditOptions(). The idea is that you probably don't want to override them in most of your calls, let the user choose and/or call SetColorEditOptions() during startup.
+ // User Options (right-click on widget to change some of them).
ImGuiColorEditFlags_AlphaBar = 1 << 16, // // ColorEdit, ColorPicker: show vertical alpha bar/gradient in picker.
ImGuiColorEditFlags_AlphaPreview = 1 << 17, // // ColorEdit, ColorPicker, ColorButton: display preview as a transparent color over a checkerboard, instead of opaque.
ImGuiColorEditFlags_AlphaPreviewHalf= 1 << 18, // // ColorEdit, ColorPicker, ColorButton: display half opaque / half checkerboard, instead of opaque.
ImGuiColorEditFlags_HDR = 1 << 19, // // (WIP) ColorEdit: Currently only disable 0.0f..1.0f limits in RGBA edition (note: you probably want to use ImGuiColorEditFlags_Float flag as well).
- ImGuiColorEditFlags_RGB = 1 << 20, // [Inputs] // ColorEdit: choose one among RGB/HSV/HEX. ColorPicker: choose any combination using RGB/HSV/HEX.
- ImGuiColorEditFlags_HSV = 1 << 21, // [Inputs] // "
- ImGuiColorEditFlags_HEX = 1 << 22, // [Inputs] // "
+ ImGuiColorEditFlags_DisplayRGB = 1 << 20, // [Display] // ColorEdit: override _display_ type among RGB/HSV/Hex. ColorPicker: select any combination using one or more of RGB/HSV/Hex.
+ ImGuiColorEditFlags_DisplayHSV = 1 << 21, // [Display] // "
+ ImGuiColorEditFlags_DisplayHex = 1 << 22, // [Display] // "
ImGuiColorEditFlags_Uint8 = 1 << 23, // [DataType] // ColorEdit, ColorPicker, ColorButton: _display_ values formatted as 0..255.
ImGuiColorEditFlags_Float = 1 << 24, // [DataType] // ColorEdit, ColorPicker, ColorButton: _display_ values formatted as 0.0f..1.0f floats instead of 0..255 integers. No round-trip of value via integers.
- ImGuiColorEditFlags_PickerHueBar = 1 << 25, // [PickerMode] // ColorPicker: bar for Hue, rectangle for Sat/Value.
- ImGuiColorEditFlags_PickerHueWheel = 1 << 26, // [PickerMode] // ColorPicker: wheel for Hue, triangle for Sat/Value.
+ ImGuiColorEditFlags_PickerHueBar = 1 << 25, // [Picker] // ColorPicker: bar for Hue, rectangle for Sat/Value.
+ ImGuiColorEditFlags_PickerHueWheel = 1 << 26, // [Picker] // ColorPicker: wheel for Hue, triangle for Sat/Value.
+ ImGuiColorEditFlags_InputRGB = 1 << 27, // [Input] // ColorEdit, ColorPicker: input and output data in RGB format.
+ ImGuiColorEditFlags_InputHSV = 1 << 28, // [Input] // ColorEdit, ColorPicker: input and output data in HSV format.
+
+ // Defaults Options. You can set application defaults using SetColorEditOptions(). The intent is that you probably don't want to
+ // override them in most of your calls. Let the user choose via the option menu and/or call SetColorEditOptions() once during startup.
+ ImGuiColorEditFlags__OptionsDefault = ImGuiColorEditFlags_Uint8|ImGuiColorEditFlags_DisplayRGB|ImGuiColorEditFlags_InputRGB|ImGuiColorEditFlags_PickerHueBar,
// [Internal] Masks
- ImGuiColorEditFlags__InputsMask = ImGuiColorEditFlags_RGB|ImGuiColorEditFlags_HSV|ImGuiColorEditFlags_HEX,
+ ImGuiColorEditFlags__DisplayMask = ImGuiColorEditFlags_DisplayRGB|ImGuiColorEditFlags_DisplayHSV|ImGuiColorEditFlags_DisplayHex,
ImGuiColorEditFlags__DataTypeMask = ImGuiColorEditFlags_Uint8|ImGuiColorEditFlags_Float,
ImGuiColorEditFlags__PickerMask = ImGuiColorEditFlags_PickerHueWheel|ImGuiColorEditFlags_PickerHueBar,
- ImGuiColorEditFlags__OptionsDefault = ImGuiColorEditFlags_Uint8|ImGuiColorEditFlags_RGB|ImGuiColorEditFlags_PickerHueBar // Change application default using SetColorEditOptions()
+ ImGuiColorEditFlags__InputMask = ImGuiColorEditFlags_InputRGB|ImGuiColorEditFlags_InputHSV
+
+ // Obsolete names (will be removed)
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+ , ImGuiColorEditFlags_RGB = ImGuiColorEditFlags_DisplayRGB, ImGuiColorEditFlags_HSV = ImGuiColorEditFlags_DisplayHSV, ImGuiColorEditFlags_HEX = ImGuiColorEditFlags_DisplayHex // [renamed in 1.69]
+#endif
+};
+
+// Identify a mouse button.
+// Those values are guaranteed to be stable and we frequently use 0/1 directly. Named enums provided for convenience.
+enum ImGuiMouseButton_
+{
+ ImGuiMouseButton_Left = 0,
+ ImGuiMouseButton_Right = 1,
+ ImGuiMouseButton_Middle = 2,
+ ImGuiMouseButton_COUNT = 5
};
// Enumeration for GetMouseCursor()
@@ -1017,21 +1207,23 @@ enum ImGuiMouseCursor_
ImGuiMouseCursor_None = -1,
ImGuiMouseCursor_Arrow = 0,
ImGuiMouseCursor_TextInput, // When hovering over InputText, etc.
- ImGuiMouseCursor_ResizeAll, // (Unused by imgui functions)
+ ImGuiMouseCursor_ResizeAll, // (Unused by Dear ImGui functions)
ImGuiMouseCursor_ResizeNS, // When hovering over an horizontal border
ImGuiMouseCursor_ResizeEW, // When hovering over a vertical border or a column
ImGuiMouseCursor_ResizeNESW, // When hovering over the bottom-left corner of a window
ImGuiMouseCursor_ResizeNWSE, // When hovering over the bottom-right corner of a window
- ImGuiMouseCursor_Hand, // (Unused by imgui functions. Use for e.g. hyperlinks)
+ ImGuiMouseCursor_Hand, // (Unused by Dear ImGui functions. Use for e.g. hyperlinks)
+ ImGuiMouseCursor_NotAllowed, // When hovering something with disallowed interaction. Usually a crossed circle.
ImGuiMouseCursor_COUNT
// Obsolete names (will be removed)
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
- , ImGuiMouseCursor_Count_ = ImGuiMouseCursor_COUNT
+ , ImGuiMouseCursor_Count_ = ImGuiMouseCursor_COUNT // [renamed in 1.60]
#endif
};
-// Condition for ImGui::SetWindow***(), SetNextWindow***(), SetNextTreeNode***() functions
+// Enumeration for ImGui::SetWindow***(), SetNextWindow***(), SetNextItem***() functions
+// Represent a condition.
// Important: Treat as a regular enum! Do NOT combine multiple values using binary operators! All the functions above treat 0 as a shortcut to ImGuiCond_Always.
enum ImGuiCond_
{
@@ -1039,23 +1231,109 @@ enum ImGuiCond_
ImGuiCond_Once = 1 << 1, // Set the variable once per runtime session (only the first call with succeed)
ImGuiCond_FirstUseEver = 1 << 2, // Set the variable if the object/window has no persistently saved data (no entry in .ini file)
ImGuiCond_Appearing = 1 << 3 // Set the variable if the object/window is appearing after being hidden/inactive (or the first time)
+};
- // Obsolete names (will be removed)
-#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
- , ImGuiSetCond_Always = ImGuiCond_Always, ImGuiSetCond_Once = ImGuiCond_Once, ImGuiSetCond_FirstUseEver = ImGuiCond_FirstUseEver, ImGuiSetCond_Appearing = ImGuiCond_Appearing
-#endif
+//-----------------------------------------------------------------------------
+// Helpers: Memory allocations macros
+// IM_MALLOC(), IM_FREE(), IM_NEW(), IM_PLACEMENT_NEW(), IM_DELETE()
+// We call C++ constructor on own allocated memory via the placement "new(ptr) Type()" syntax.
+// Defining a custom placement new() with a dummy parameter allows us to bypass including <new> which on some platforms complains when user has disabled exceptions.
+//-----------------------------------------------------------------------------
+
+struct ImNewDummy {};
+inline void* operator new(size_t, ImNewDummy, void* ptr) { return ptr; }
+inline void operator delete(void*, ImNewDummy, void*) {} // This is only required so we can use the symmetrical new()
+#define IM_ALLOC(_SIZE) ImGui::MemAlloc(_SIZE)
+#define IM_FREE(_PTR) ImGui::MemFree(_PTR)
+#define IM_PLACEMENT_NEW(_PTR) new(ImNewDummy(), _PTR)
+#define IM_NEW(_TYPE) new(ImNewDummy(), ImGui::MemAlloc(sizeof(_TYPE))) _TYPE
+template<typename T> void IM_DELETE(T* p) { if (p) { p->~T(); ImGui::MemFree(p); } }
+
+//-----------------------------------------------------------------------------
+// Helper: ImVector<>
+// Lightweight std::vector<>-like class to avoid dragging dependencies (also, some implementations of STL with debug enabled are absurdly slow, we bypass it so our code runs fast in debug).
+//-----------------------------------------------------------------------------
+// - You generally do NOT need to care or use this ever. But we need to make it available in imgui.h because some of our public structures are relying on it.
+// - We use std-like naming convention here, which is a little unusual for this codebase.
+// - Important: clear() frees memory, resize(0) keep the allocated buffer. We use resize(0) a lot to intentionally recycle allocated buffers across frames and amortize our costs.
+// - Important: our implementation does NOT call C++ constructors/destructors, we treat everything as raw data! This is intentional but be extra mindful of that,
+// Do NOT use this class as a std::vector replacement in your own code! Many of the structures used by dear imgui can be safely initialized by a zero-memset.
+//-----------------------------------------------------------------------------
+
+template<typename T>
+struct ImVector
+{
+ int Size;
+ int Capacity;
+ T* Data;
+
+ // Provide standard typedefs but we don't use them ourselves.
+ typedef T value_type;
+ typedef value_type* iterator;
+ typedef const value_type* const_iterator;
+
+ // Constructors, destructor
+ inline ImVector() { Size = Capacity = 0; Data = NULL; }
+ inline ImVector(const ImVector<T>& src) { Size = Capacity = 0; Data = NULL; operator=(src); }
+ inline ImVector<T>& operator=(const ImVector<T>& src) { clear(); resize(src.Size); memcpy(Data, src.Data, (size_t)Size * sizeof(T)); return *this; }
+ inline ~ImVector() { if (Data) IM_FREE(Data); }
+
+ inline bool empty() const { return Size == 0; }
+ inline int size() const { return Size; }
+ inline int size_in_bytes() const { return Size * (int)sizeof(T); }
+ inline int capacity() const { return Capacity; }
+ inline T& operator[](int i) { IM_ASSERT(i < Size); return Data[i]; }
+ inline const T& operator[](int i) const { IM_ASSERT(i < Size); return Data[i]; }
+
+ inline void clear() { if (Data) { Size = Capacity = 0; IM_FREE(Data); Data = NULL; } }
+ inline T* begin() { return Data; }
+ inline const T* begin() const { return Data; }
+ inline T* end() { return Data + Size; }
+ inline const T* end() const { return Data + Size; }
+ inline T& front() { IM_ASSERT(Size > 0); return Data[0]; }
+ inline const T& front() const { IM_ASSERT(Size > 0); return Data[0]; }
+ inline T& back() { IM_ASSERT(Size > 0); return Data[Size - 1]; }
+ inline const T& back() const { IM_ASSERT(Size > 0); return Data[Size - 1]; }
+ inline void swap(ImVector<T>& rhs) { int rhs_size = rhs.Size; rhs.Size = Size; Size = rhs_size; int rhs_cap = rhs.Capacity; rhs.Capacity = Capacity; Capacity = rhs_cap; T* rhs_data = rhs.Data; rhs.Data = Data; Data = rhs_data; }
+
+ inline int _grow_capacity(int sz) const { int new_capacity = Capacity ? (Capacity + Capacity/2) : 8; return new_capacity > sz ? new_capacity : sz; }
+ inline void resize(int new_size) { if (new_size > Capacity) reserve(_grow_capacity(new_size)); Size = new_size; }
+ inline void resize(int new_size, const T& v) { if (new_size > Capacity) reserve(_grow_capacity(new_size)); if (new_size > Size) for (int n = Size; n < new_size; n++) memcpy(&Data[n], &v, sizeof(v)); Size = new_size; }
+ inline void shrink(int new_size) { IM_ASSERT(new_size <= Size); Size = new_size; } // Resize a vector to a smaller size, guaranteed not to cause a reallocation
+ inline void reserve(int new_capacity) { if (new_capacity <= Capacity) return; T* new_data = (T*)IM_ALLOC((size_t)new_capacity * sizeof(T)); if (Data) { memcpy(new_data, Data, (size_t)Size * sizeof(T)); IM_FREE(Data); } Data = new_data; Capacity = new_capacity; }
+
+ // NB: It is illegal to call push_back/push_front/insert with a reference pointing inside the ImVector data itself! e.g. v.push_back(v[10]) is forbidden.
+ inline void push_back(const T& v) { if (Size == Capacity) reserve(_grow_capacity(Size + 1)); memcpy(&Data[Size], &v, sizeof(v)); Size++; }
+ inline void pop_back() { IM_ASSERT(Size > 0); Size--; }
+ inline void push_front(const T& v) { if (Size == 0) push_back(v); else insert(Data, v); }
+ inline T* erase(const T* it) { IM_ASSERT(it >= Data && it < Data+Size); const ptrdiff_t off = it - Data; memmove(Data + off, Data + off + 1, ((size_t)Size - (size_t)off - 1) * sizeof(T)); Size--; return Data + off; }
+ inline T* erase(const T* it, const T* it_last){ IM_ASSERT(it >= Data && it < Data+Size && it_last > it && it_last <= Data+Size); const ptrdiff_t count = it_last - it; const ptrdiff_t off = it - Data; memmove(Data + off, Data + off + count, ((size_t)Size - (size_t)off - count) * sizeof(T)); Size -= (int)count; return Data + off; }
+ inline T* erase_unsorted(const T* it) { IM_ASSERT(it >= Data && it < Data+Size); const ptrdiff_t off = it - Data; if (it < Data+Size-1) memcpy(Data + off, Data + Size - 1, sizeof(T)); Size--; return Data + off; }
+ inline T* insert(const T* it, const T& v) { IM_ASSERT(it >= Data && it <= Data+Size); const ptrdiff_t off = it - Data; if (Size == Capacity) reserve(_grow_capacity(Size + 1)); if (off < (int)Size) memmove(Data + off + 1, Data + off, ((size_t)Size - (size_t)off) * sizeof(T)); memcpy(&Data[off], &v, sizeof(v)); Size++; return Data + off; }
+ inline bool contains(const T& v) const { const T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data++ == v) return true; return false; }
+ inline T* find(const T& v) { T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data == v) break; else ++data; return data; }
+ inline const T* find(const T& v) const { const T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data == v) break; else ++data; return data; }
+ inline bool find_erase(const T& v) { const T* it = find(v); if (it < Data + Size) { erase(it); return true; } return false; }
+ inline bool find_erase_unsorted(const T& v) { const T* it = find(v); if (it < Data + Size) { erase_unsorted(it); return true; } return false; }
+ inline int index_from_ptr(const T* it) const { IM_ASSERT(it >= Data && it < Data + Size); const ptrdiff_t off = it - Data; return (int)off; }
};
+//-----------------------------------------------------------------------------
+// ImGuiStyle
// You may modify the ImGui::GetStyle() main instance during initialization and before NewFrame().
-// During the frame, use ImGui::PushStyleVar(ImGuiStyleVar_XXXX)/PopStyleVar() to alter the main style values, and ImGui::PushStyleColor(ImGuiCol_XXX)/PopStyleColor() for colors.
+// During the frame, use ImGui::PushStyleVar(ImGuiStyleVar_XXXX)/PopStyleVar() to alter the main style values,
+// and ImGui::PushStyleColor(ImGuiCol_XXX)/PopStyleColor() for colors.
+//-----------------------------------------------------------------------------
+
struct ImGuiStyle
{
- float Alpha; // Global alpha applies to everything in ImGui.
+ float Alpha; // Global alpha applies to everything in Dear ImGui.
ImVec2 WindowPadding; // Padding within a window.
float WindowRounding; // Radius of window corners rounding. Set to 0.0f to have rectangular windows.
float WindowBorderSize; // Thickness of border around windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly).
ImVec2 WindowMinSize; // Minimum window size. This is a global setting. If you want to constraint individual windows, use SetNextWindowSizeConstraints().
ImVec2 WindowTitleAlign; // Alignment for title bar text. Defaults to (0.0f,0.5f) for left-aligned,vertically centered.
+ ImGuiDir WindowMenuButtonPosition; // Side of the collapsing/docking button in the title bar (None/Left/Right). Defaults to ImGuiDir_Left.
float ChildRounding; // Radius of child window corners rounding. Set to 0.0f to have rectangular windows.
float ChildBorderSize; // Thickness of border around child windows. Generally set to 0.0f or 1.0f. (Other values are not well tested and more CPU/GPU costly).
float PopupRounding; // Radius of popup window corners rounding. (Note that tooltip windows use WindowRounding)
@@ -1067,82 +1345,99 @@ struct ImGuiStyle
ImVec2 ItemInnerSpacing; // Horizontal and vertical spacing between within elements of a composed widget (e.g. a slider and its label).
ImVec2 TouchExtraPadding; // Expand reactive bounding box for touch-based system where touch position is not accurate enough. Unfortunately we don't sort widgets so priority on overlap will always be given to the first widget. So don't grow this too much!
float IndentSpacing; // Horizontal indentation when e.g. entering a tree node. Generally == (FontSize + FramePadding.x*2).
- float ColumnsMinSpacing; // Minimum horizontal spacing between two columns.
+ float ColumnsMinSpacing; // Minimum horizontal spacing between two columns. Preferably > (FramePadding.x + 1).
float ScrollbarSize; // Width of the vertical scrollbar, Height of the horizontal scrollbar.
float ScrollbarRounding; // Radius of grab corners for scrollbar.
float GrabMinSize; // Minimum width/height of a grab box for slider/scrollbar.
float GrabRounding; // Radius of grabs corners rounding. Set to 0.0f to have rectangular slider grabs.
- ImVec2 ButtonTextAlign; // Alignment of button text when button is larger than text. Defaults to (0.5f,0.5f) for horizontally+vertically centered.
+ float TabRounding; // Radius of upper corners of a tab. Set to 0.0f to have rectangular tabs.
+ float TabBorderSize; // Thickness of border around tabs.
+ ImGuiDir ColorButtonPosition; // Side of the color button in the ColorEdit4 widget (left/right). Defaults to ImGuiDir_Right.
+ ImVec2 ButtonTextAlign; // Alignment of button text when button is larger than text. Defaults to (0.5f, 0.5f) (centered).
+ ImVec2 SelectableTextAlign; // Alignment of selectable text when selectable is larger than text. Defaults to (0.0f, 0.0f) (top-left aligned).
ImVec2 DisplayWindowPadding; // Window position are clamped to be visible within the display area by at least this amount. Only applies to regular windows.
ImVec2 DisplaySafeAreaPadding; // If you cannot see the edges of your screen (e.g. on a TV) increase the safe area padding. Apply to popups/tooltips as well regular windows. NB: Prefer configuring your TV sets correctly!
float MouseCursorScale; // Scale software rendered mouse cursor (when io.MouseDrawCursor is enabled). May be removed later.
bool AntiAliasedLines; // Enable anti-aliasing on lines/borders. Disable if you are really tight on CPU/GPU.
bool AntiAliasedFill; // Enable anti-aliasing on filled shapes (rounded rectangles, circles, etc.)
float CurveTessellationTol; // Tessellation tolerance when using PathBezierCurveTo() without a specific number of segments. Decrease for highly tessellated curves (higher quality, more polygons), increase to reduce quality.
+ float CircleSegmentMaxError; // Maximum error (in pixels) allowed when using AddCircle()/AddCircleFilled() or drawing rounded corner rectangles with no explicit segment count specified. Decrease for higher quality but more geometry.
ImVec4 Colors[ImGuiCol_COUNT];
IMGUI_API ImGuiStyle();
IMGUI_API void ScaleAllSizes(float scale_factor);
};
-// This is where your app communicate with Dear ImGui. Access via ImGui::GetIO().
-// Read 'Programmer guide' section in .cpp file for general usage.
+//-----------------------------------------------------------------------------
+// ImGuiIO
+// Communicate most settings and inputs/outputs to Dear ImGui using this structure.
+// Access via ImGui::GetIO(). Read 'Programmer guide' section in .cpp file for general usage.
+//-----------------------------------------------------------------------------
+
struct ImGuiIO
{
//------------------------------------------------------------------
- // Configuration (fill once) // Default value:
+ // Configuration (fill once) // Default value
//------------------------------------------------------------------
- ImGuiConfigFlags ConfigFlags; // = 0 // See ImGuiConfigFlags_ enum. Set by user/application. Gamepad/keyboard navigation options, etc.
- ImGuiBackendFlags BackendFlags; // = 0 // Set ImGuiBackendFlags_ enum. Set by imgui_impl_xxx files or custom back-end to communicate features supported by the back-end.
- ImVec2 DisplaySize; // <unset> // Main display size, in pixels. For clamping windows positions.
- float DeltaTime; // = 1.0f/60.0f // Time elapsed since last frame, in seconds.
- float IniSavingRate; // = 5.0f // Minimum time between saving positions/sizes to .ini file, in seconds.
- const char* IniFilename; // = "imgui.ini" // Path to .ini file. Set NULL to disable automatic .ini loading/saving, if e.g. you want to manually load/save from memory.
- const char* LogFilename; // = "imgui_log.txt" // Path to .log file (default parameter to ImGui::LogToFile when no file is specified).
- float MouseDoubleClickTime; // = 0.30f // Time for a double-click, in seconds.
- float MouseDoubleClickMaxDist; // = 6.0f // Distance threshold to stay in to validate a double-click, in pixels.
- float MouseDragThreshold; // = 6.0f // Distance threshold before considering we are dragging.
- int KeyMap[ImGuiKey_COUNT]; // <unset> // Map of indices into the KeysDown[512] entries array which represent your "native" keyboard state.
- float KeyRepeatDelay; // = 0.250f // When holding a key/button, time before it starts repeating, in seconds (for buttons in Repeat mode, etc.).
- float KeyRepeatRate; // = 0.050f // When holding a key/button, rate at which it repeats, in seconds.
- void* UserData; // = NULL // Store your own data for retrieval by callbacks.
-
- ImFontAtlas* Fonts; // <auto> // Load and assemble one or more fonts into a single tightly packed texture. Output to Fonts array.
- float FontGlobalScale; // = 1.0f // Global scale all fonts
- bool FontAllowUserScaling; // = false // Allow user scaling text of individual window with CTRL+Wheel.
- ImFont* FontDefault; // = NULL // Font to use on NewFrame(). Use NULL to uses Fonts->Fonts[0].
- ImVec2 DisplayFramebufferScale; // = (1.0f,1.0f) // For retina display or other situations where window coordinates are different from framebuffer coordinates. User storage only, presently not used by ImGui.
- ImVec2 DisplayVisibleMin; // <unset> (0.0f,0.0f) // [obsolete] If you use DisplaySize as a virtual space larger than your screen, set DisplayVisibleMin/Max to the visible area.
- ImVec2 DisplayVisibleMax; // <unset> (0.0f,0.0f) // [obsolete: just use io.DisplaySize] If the values are the same, we defaults to Min=(0.0f) and Max=DisplaySize
-
- // Miscellaneous configuration options
- bool MouseDrawCursor; // = false // Request ImGui to draw a mouse cursor for you (if you are on a platform without a mouse cursor). Cannot be easily renamed to 'io.ConfigXXX' because this is frequently used by back-end implementations.
- bool ConfigMacOSXBehaviors; // = defined(__APPLE__) // OS X style: Text editing cursor movement using Alt instead of Ctrl, Shortcuts using Cmd/Super instead of Ctrl, Line/Text Start and End using Cmd+Arrows instead of Home/End, Double click selects by word instead of selecting whole text, Multi-selection in lists uses Cmd/Super instead of Ctrl (was called io.OptMacOSXBehaviors prior to 1.63)
- bool ConfigInputTextCursorBlink; // = true // Set to false to disable blinking cursor, for users who consider it distracting. (was called: io.OptCursorBlink prior to 1.63)
- bool ConfigResizeWindowsFromEdges; // = false // [BETA] Enable resizing of windows from their edges and from the lower-left corner. This requires (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) because it needs mouse cursor feedback. (This used to be the ImGuiWindowFlags_ResizeFromAnySide flag)
+ ImGuiConfigFlags ConfigFlags; // = 0 // See ImGuiConfigFlags_ enum. Set by user/application. Gamepad/keyboard navigation options, etc.
+ ImGuiBackendFlags BackendFlags; // = 0 // See ImGuiBackendFlags_ enum. Set by back-end (imgui_impl_xxx files or custom back-end) to communicate features supported by the back-end.
+ ImVec2 DisplaySize; // <unset> // Main display size, in pixels.
+ float DeltaTime; // = 1.0f/60.0f // Time elapsed since last frame, in seconds.
+ float IniSavingRate; // = 5.0f // Minimum time between saving positions/sizes to .ini file, in seconds.
+ const char* IniFilename; // = "imgui.ini" // Path to .ini file. Set NULL to disable automatic .ini loading/saving, if e.g. you want to manually load/save from memory.
+ const char* LogFilename; // = "imgui_log.txt"// Path to .log file (default parameter to ImGui::LogToFile when no file is specified).
+ float MouseDoubleClickTime; // = 0.30f // Time for a double-click, in seconds.
+ float MouseDoubleClickMaxDist; // = 6.0f // Distance threshold to stay in to validate a double-click, in pixels.
+ float MouseDragThreshold; // = 6.0f // Distance threshold before considering we are dragging.
+ int KeyMap[ImGuiKey_COUNT]; // <unset> // Map of indices into the KeysDown[512] entries array which represent your "native" keyboard state.
+ float KeyRepeatDelay; // = 0.250f // When holding a key/button, time before it starts repeating, in seconds (for buttons in Repeat mode, etc.).
+ float KeyRepeatRate; // = 0.050f // When holding a key/button, rate at which it repeats, in seconds.
+ void* UserData; // = NULL // Store your own data for retrieval by callbacks.
+
+ ImFontAtlas*Fonts; // <auto> // Font atlas: load, rasterize and pack one or more fonts into a single texture.
+ float FontGlobalScale; // = 1.0f // Global scale all fonts
+ bool FontAllowUserScaling; // = false // Allow user scaling text of individual window with CTRL+Wheel.
+ ImFont* FontDefault; // = NULL // Font to use on NewFrame(). Use NULL to uses Fonts->Fonts[0].
+ ImVec2 DisplayFramebufferScale; // = (1, 1) // For retina display or other situations where window coordinates are different from framebuffer coordinates. This generally ends up in ImDrawData::FramebufferScale.
+
+ // Miscellaneous options
+ bool MouseDrawCursor; // = false // Request ImGui to draw a mouse cursor for you (if you are on a platform without a mouse cursor). Cannot be easily renamed to 'io.ConfigXXX' because this is frequently used by back-end implementations.
+ bool ConfigMacOSXBehaviors; // = defined(__APPLE__) // OS X style: Text editing cursor movement using Alt instead of Ctrl, Shortcuts using Cmd/Super instead of Ctrl, Line/Text Start and End using Cmd+Arrows instead of Home/End, Double click selects by word instead of selecting whole text, Multi-selection in lists uses Cmd/Super instead of Ctrl (was called io.OptMacOSXBehaviors prior to 1.63)
+ bool ConfigInputTextCursorBlink; // = true // Set to false to disable blinking cursor, for users who consider it distracting. (was called: io.OptCursorBlink prior to 1.63)
+ bool ConfigWindowsResizeFromEdges; // = true // Enable resizing of windows from their edges and from the lower-left corner. This requires (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) because it needs mouse cursor feedback. (This used to be a per-window ImGuiWindowFlags_ResizeFromAnySide flag)
+ bool ConfigWindowsMoveFromTitleBarOnly; // = false // [BETA] Set to true to only allow moving windows when clicked+dragged from the title bar. Windows without a title bar are not affected.
+ float ConfigWindowsMemoryCompactTimer;// = 60.0f // [BETA] Compact window memory usage when unused. Set to -1.0f to disable.
//------------------------------------------------------------------
- // Settings (User Functions)
+ // Platform Functions
+ // (the imgui_impl_xxxx back-end files are setting those up for you)
//------------------------------------------------------------------
- // Optional: access OS clipboard
+ // Optional: Platform/Renderer back-end name (informational only! will be displayed in About Window) + User data for back-end/wrappers to store their own stuff.
+ const char* BackendPlatformName; // = NULL
+ const char* BackendRendererName; // = NULL
+ void* BackendPlatformUserData; // = NULL // User data for platform back-end
+ void* BackendRendererUserData; // = NULL // User data for renderer back-end
+ void* BackendLanguageUserData; // = NULL // User data for non C++ programming language back-end
+
+ // Optional: Access OS clipboard
// (default to use native Win32 clipboard on Windows, otherwise uses a private clipboard. Override to access OS clipboard on other architectures)
const char* (*GetClipboardTextFn)(void* user_data);
void (*SetClipboardTextFn)(void* user_data, const char* text);
void* ClipboardUserData;
- // Optional: notify OS Input Method Editor of the screen position of your cursor for text input position (e.g. when using Japanese/Chinese IME in Windows)
+ // Optional: Notify OS Input Method Editor of the screen position of your cursor for text input position (e.g. when using Japanese/Chinese IME on Windows)
// (default to use native imm32 api on Windows)
void (*ImeSetInputScreenPosFn)(int x, int y);
- void* ImeWindowHandle; // (Windows) Set this to your HWND to get automatic IME cursor positioning.
+ void* ImeWindowHandle; // = NULL // (Windows) Set this to your HWND to get automatic IME cursor positioning.
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
// [OBSOLETE since 1.60+] Rendering function, will be automatically called in Render(). Please call your rendering function yourself now!
// You can obtain the ImDrawData* by calling ImGui::GetDrawData() after Render(). See example applications if you are unsure of how to implement this.
void (*RenderDrawListsFn)(ImDrawData* data);
#else
- // This is only here to keep ImGuiIO the same size, so that IMGUI_DISABLE_OBSOLETE_FUNCTIONS can exceptionally be used outside of imconfig.h.
+ // This is only here to keep ImGuiIO the same size/layout, so that IMGUI_DISABLE_OBSOLETE_FUNCTIONS can exceptionally be used outside of imconfig.h.
void* RenderDrawListsFnUnused;
#endif
@@ -1159,174 +1454,166 @@ struct ImGuiIO
bool KeyAlt; // Keyboard modifier pressed: Alt
bool KeySuper; // Keyboard modifier pressed: Cmd/Super/Windows
bool KeysDown[512]; // Keyboard keys that are pressed (ideally left in the "native" order your engine has access to keyboard keys, so you can use your own defines/enums for keys).
- ImWchar InputCharacters[16+1]; // List of characters input (translated by user from keypress+keyboard state). Fill using AddInputCharacter() helper.
- float NavInputs[ImGuiNavInput_COUNT]; // Gamepad inputs (keyboard keys will be auto-mapped and be written here by ImGui::NewFrame, all values will be cleared back to zero in ImGui::EndFrame)
+ float NavInputs[ImGuiNavInput_COUNT]; // Gamepad inputs. Cleared back to zero by EndFrame(). Keyboard keys will be auto-mapped and be written here by NewFrame().
// Functions
- IMGUI_API void AddInputCharacter(ImWchar c); // Add new character into InputCharacters[]
- IMGUI_API void AddInputCharactersUTF8(const char* utf8_chars); // Add new characters into InputCharacters[] from an UTF-8 string
- inline void ClearInputCharacters() { InputCharacters[0] = 0; } // Clear the text input buffer manually
+ IMGUI_API void AddInputCharacter(unsigned int c); // Queue new character input
+ IMGUI_API void AddInputCharactersUTF8(const char* str); // Queue new characters input from an UTF-8 string
+ IMGUI_API void ClearInputCharacters(); // Clear the text input buffer manually
//------------------------------------------------------------------
// Output - Retrieve after calling NewFrame()
//------------------------------------------------------------------
- bool WantCaptureMouse; // When io.WantCaptureMouse is true, imgui will use the mouse inputs, do not dispatch them to your main game/application (in both cases, always pass on mouse inputs to imgui). (e.g. unclicked mouse is hovering over an imgui window, widget is active, mouse was clicked over an imgui window, etc.).
- bool WantCaptureKeyboard; // When io.WantCaptureKeyboard is true, imgui will use the keyboard inputs, do not dispatch them to your main game/application (in both cases, always pass keyboard inputs to imgui). (e.g. InputText active, or an imgui window is focused and navigation is enabled, etc.).
- bool WantTextInput; // Mobile/console: when io.WantTextInput is true, you may display an on-screen keyboard. This is set by ImGui when it wants textual keyboard input to happen (e.g. when a InputText widget is active).
- bool WantSetMousePos; // MousePos has been altered, back-end should reposition mouse on next frame. Set only when ImGuiConfigFlags_NavEnableSetMousePos flag is enabled.
- bool WantSaveIniSettings; // When manual .ini load/save is active (io.IniFilename == NULL), this will be set to notify your application that you can call SaveIniSettingsToMemory() and save yourself. IMPORTANT: You need to clear io.WantSaveIniSettings yourself.
- bool NavActive; // Directional navigation is currently allowed (will handle ImGuiKey_NavXXX events) = a window is focused and it doesn't use the ImGuiWindowFlags_NoNavInputs flag.
- bool NavVisible; // Directional navigation is visible and allowed (will handle ImGuiKey_NavXXX events).
- float Framerate; // Application framerate estimation, in frame per second. Solely for convenience. Rolling average estimation based on IO.DeltaTime over 120 frames
- int MetricsRenderVertices; // Vertices output during last call to Render()
- int MetricsRenderIndices; // Indices output during last call to Render() = number of triangles * 3
- int MetricsRenderWindows; // Number of visible windows
- int MetricsActiveWindows; // Number of active windows
- int MetricsActiveAllocations; // Number of active allocations, updated by MemAlloc/MemFree based on current context. May be off if you have multiple imgui contexts.
- ImVec2 MouseDelta; // Mouse delta. Note that this is zero if either current or previous position are invalid (-FLT_MAX,-FLT_MAX), so a disappearing/reappearing mouse won't have a huge delta.
+ bool WantCaptureMouse; // When io.WantCaptureMouse is true, imgui will use the mouse inputs, do not dispatch them to your main game/application (in both cases, always pass on mouse inputs to imgui). (e.g. unclicked mouse is hovering over an imgui window, widget is active, mouse was clicked over an imgui window, etc.).
+ bool WantCaptureKeyboard; // When io.WantCaptureKeyboard is true, imgui will use the keyboard inputs, do not dispatch them to your main game/application (in both cases, always pass keyboard inputs to imgui). (e.g. InputText active, or an imgui window is focused and navigation is enabled, etc.).
+ bool WantTextInput; // Mobile/console: when io.WantTextInput is true, you may display an on-screen keyboard. This is set by ImGui when it wants textual keyboard input to happen (e.g. when a InputText widget is active).
+ bool WantSetMousePos; // MousePos has been altered, back-end should reposition mouse on next frame. Set only when ImGuiConfigFlags_NavEnableSetMousePos flag is enabled.
+ bool WantSaveIniSettings; // When manual .ini load/save is active (io.IniFilename == NULL), this will be set to notify your application that you can call SaveIniSettingsToMemory() and save yourself. IMPORTANT: You need to clear io.WantSaveIniSettings yourself.
+ bool NavActive; // Directional navigation is currently allowed (will handle ImGuiKey_NavXXX events) = a window is focused and it doesn't use the ImGuiWindowFlags_NoNavInputs flag.
+ bool NavVisible; // Directional navigation is visible and allowed (will handle ImGuiKey_NavXXX events).
+ float Framerate; // Application framerate estimation, in frame per second. Solely for convenience. Rolling average estimation based on IO.DeltaTime over 120 frames
+ int MetricsRenderVertices; // Vertices output during last call to Render()
+ int MetricsRenderIndices; // Indices output during last call to Render() = number of triangles * 3
+ int MetricsRenderWindows; // Number of visible windows
+ int MetricsActiveWindows; // Number of active windows
+ int MetricsActiveAllocations; // Number of active allocations, updated by MemAlloc/MemFree based on current context. May be off if you have multiple imgui contexts.
+ ImVec2 MouseDelta; // Mouse delta. Note that this is zero if either current or previous position are invalid (-FLT_MAX,-FLT_MAX), so a disappearing/reappearing mouse won't have a huge delta.
//------------------------------------------------------------------
- // [Internal] ImGui will maintain those fields. Forward compatibility not guaranteed!
+ // [Internal] Dear ImGui will maintain those fields. Forward compatibility not guaranteed!
//------------------------------------------------------------------
- ImVec2 MousePosPrev; // Previous mouse position temporary storage (nb: not for public use, set to MousePos in NewFrame())
- ImVec2 MouseClickedPos[5]; // Position at time of clicking
- double MouseClickedTime[5]; // Time of last click (used to figure out double-click)
- bool MouseClicked[5]; // Mouse button went from !Down to Down
- bool MouseDoubleClicked[5]; // Has mouse button been double-clicked?
- bool MouseReleased[5]; // Mouse button went from Down to !Down
- bool MouseDownOwned[5]; // Track if button was clicked inside a window. We don't request mouse capture from the application if click started outside ImGui bounds.
- float MouseDownDuration[5]; // Duration the mouse button has been down (0.0f == just clicked)
- float MouseDownDurationPrev[5]; // Previous time the mouse button has been down
- ImVec2 MouseDragMaxDistanceAbs[5]; // Maximum distance, absolute, on each axis, of how much mouse has traveled from the clicking point
- float MouseDragMaxDistanceSqr[5]; // Squared maximum distance of how much mouse has traveled from the clicking point
- float KeysDownDuration[512]; // Duration the keyboard key has been down (0.0f == just pressed)
- float KeysDownDurationPrev[512]; // Previous duration the key has been down
+ ImVec2 MousePosPrev; // Previous mouse position (note that MouseDelta is not necessary == MousePos-MousePosPrev, in case either position is invalid)
+ ImVec2 MouseClickedPos[5]; // Position at time of clicking
+ double MouseClickedTime[5]; // Time of last click (used to figure out double-click)
+ bool MouseClicked[5]; // Mouse button went from !Down to Down
+ bool MouseDoubleClicked[5]; // Has mouse button been double-clicked?
+ bool MouseReleased[5]; // Mouse button went from Down to !Down
+ bool MouseDownOwned[5]; // Track if button was clicked inside a dear imgui window. We don't request mouse capture from the application if click started outside ImGui bounds.
+ bool MouseDownWasDoubleClick[5]; // Track if button down was a double-click
+ float MouseDownDuration[5]; // Duration the mouse button has been down (0.0f == just clicked)
+ float MouseDownDurationPrev[5]; // Previous time the mouse button has been down
+ ImVec2 MouseDragMaxDistanceAbs[5]; // Maximum distance, absolute, on each axis, of how much mouse has traveled from the clicking point
+ float MouseDragMaxDistanceSqr[5]; // Squared maximum distance of how much mouse has traveled from the clicking point
+ float KeysDownDuration[512]; // Duration the keyboard key has been down (0.0f == just pressed)
+ float KeysDownDurationPrev[512]; // Previous duration the key has been down
float NavInputsDownDuration[ImGuiNavInput_COUNT];
float NavInputsDownDurationPrev[ImGuiNavInput_COUNT];
+ ImVector<ImWchar> InputQueueCharacters; // Queue of _characters_ input (obtained by platform back-end). Fill using AddInputCharacter() helper.
IMGUI_API ImGuiIO();
};
//-----------------------------------------------------------------------------
+// Misc data structures
+//-----------------------------------------------------------------------------
+
+// Shared state of InputText(), passed as an argument to your callback when a ImGuiInputTextFlags_Callback* flag is used.
+// The callback function should return 0 by default.
+// Callbacks (follow a flag name and see comments in ImGuiInputTextFlags_ declarations for more details)
+// - ImGuiInputTextFlags_CallbackCompletion: Callback on pressing TAB
+// - ImGuiInputTextFlags_CallbackHistory: Callback on pressing Up/Down arrows
+// - ImGuiInputTextFlags_CallbackAlways: Callback on each iteration
+// - ImGuiInputTextFlags_CallbackCharFilter: Callback on character inputs to replace or discard them. Modify 'EventChar' to replace or discard, or return 1 in callback to discard.
+// - ImGuiInputTextFlags_CallbackResize: Callback on buffer capacity changes request (beyond 'buf_size' parameter value), allowing the string to grow.
+struct ImGuiInputTextCallbackData
+{
+ ImGuiInputTextFlags EventFlag; // One ImGuiInputTextFlags_Callback* // Read-only
+ ImGuiInputTextFlags Flags; // What user passed to InputText() // Read-only
+ void* UserData; // What user passed to InputText() // Read-only
+
+ // Arguments for the different callback events
+ // - To modify the text buffer in a callback, prefer using the InsertChars() / DeleteChars() function. InsertChars() will take care of calling the resize callback if necessary.
+ // - If you know your edits are not going to resize the underlying buffer allocation, you may modify the contents of 'Buf[]' directly. You need to update 'BufTextLen' accordingly (0 <= BufTextLen < BufSize) and set 'BufDirty'' to true so InputText can update its internal state.
+ ImWchar EventChar; // Character input // Read-write // [CharFilter] Replace character with another one, or set to zero to drop. return 1 is equivalent to setting EventChar=0;
+ ImGuiKey EventKey; // Key pressed (Up/Down/TAB) // Read-only // [Completion,History]
+ char* Buf; // Text buffer // Read-write // [Resize] Can replace pointer / [Completion,History,Always] Only write to pointed data, don't replace the actual pointer!
+ int BufTextLen; // Text length (in bytes) // Read-write // [Resize,Completion,History,Always] Exclude zero-terminator storage. In C land: == strlen(some_text), in C++ land: string.length()
+ int BufSize; // Buffer size (in bytes) = capacity+1 // Read-only // [Resize,Completion,History,Always] Include zero-terminator storage. In C land == ARRAYSIZE(my_char_array), in C++ land: string.capacity()+1
+ bool BufDirty; // Set if you modify Buf/BufTextLen! // Write // [Completion,History,Always]
+ int CursorPos; // // Read-write // [Completion,History,Always]
+ int SelectionStart; // // Read-write // [Completion,History,Always] == to SelectionEnd when no selection)
+ int SelectionEnd; // // Read-write // [Completion,History,Always]
+
+ // Helper functions for text manipulation.
+ // Use those function to benefit from the CallbackResize behaviors. Calling those function reset the selection.
+ IMGUI_API ImGuiInputTextCallbackData();
+ IMGUI_API void DeleteChars(int pos, int bytes_count);
+ IMGUI_API void InsertChars(int pos, const char* text, const char* text_end = NULL);
+ bool HasSelection() const { return SelectionStart != SelectionEnd; }
+};
+
+// Resizing callback data to apply custom constraint. As enabled by SetNextWindowSizeConstraints(). Callback is called during the next Begin().
+// NB: For basic min/max size constraint on each axis you don't need to use the callback! The SetNextWindowSizeConstraints() parameters are enough.
+struct ImGuiSizeCallbackData
+{
+ void* UserData; // Read-only. What user passed to SetNextWindowSizeConstraints()
+ ImVec2 Pos; // Read-only. Window position, for reference.
+ ImVec2 CurrentSize; // Read-only. Current window size.
+ ImVec2 DesiredSize; // Read-write. Desired size, based on user's mouse position. Write to this field to restrain resizing.
+};
+
+// Data payload for Drag and Drop operations: AcceptDragDropPayload(), GetDragDropPayload()
+struct ImGuiPayload
+{
+ // Members
+ void* Data; // Data (copied and owned by dear imgui)
+ int DataSize; // Data size
+
+ // [Internal]
+ ImGuiID SourceId; // Source item id
+ ImGuiID SourceParentId; // Source parent id (if available)
+ int DataFrameCount; // Data timestamp
+ char DataType[32+1]; // Data type tag (short user-supplied string, 32 characters max)
+ bool Preview; // Set when AcceptDragDropPayload() was called and mouse has been hovering the target item (nb: handle overlapping drag targets)
+ bool Delivery; // Set when AcceptDragDropPayload() was called and mouse button is released over the target item.
+
+ ImGuiPayload() { Clear(); }
+ void Clear() { SourceId = SourceParentId = 0; Data = NULL; DataSize = 0; memset(DataType, 0, sizeof(DataType)); DataFrameCount = -1; Preview = Delivery = false; }
+ bool IsDataType(const char* type) const { return DataFrameCount != -1 && strcmp(type, DataType) == 0; }
+ bool IsPreview() const { return Preview; }
+ bool IsDelivery() const { return Delivery; }
+};
+
+//-----------------------------------------------------------------------------
// Obsolete functions (Will be removed! Read 'API BREAKING CHANGES' section in imgui.cpp for details)
+// Please keep your copy of dear imgui up to date! Occasionally set '#define IMGUI_DISABLE_OBSOLETE_FUNCTIONS' in imconfig.h to stay ahead.
//-----------------------------------------------------------------------------
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
namespace ImGui
{
+ // OBSOLETED in 1.72 (from July 2019)
+ static inline void TreeAdvanceToLabelPos() { SetCursorPosX(GetCursorPosX() + GetTreeNodeToLabelSpacing()); }
+ // OBSOLETED in 1.71 (from June 2019)
+ static inline void SetNextTreeNodeOpen(bool open, ImGuiCond cond = 0) { SetNextItemOpen(open, cond); }
+ // OBSOLETED in 1.70 (from May 2019)
+ static inline float GetContentRegionAvailWidth() { return GetContentRegionAvail().x; }
+ // OBSOLETED in 1.69 (from Mar 2019)
+ static inline ImDrawList* GetOverlayDrawList() { return GetForegroundDrawList(); }
// OBSOLETED in 1.66 (from Sep 2018)
static inline void SetScrollHere(float center_ratio=0.5f){ SetScrollHereY(center_ratio); }
- // OBSOLETED in 1.63 (from Aug 2018)
+ // OBSOLETED in 1.63 (between Aug 2018 and Sept 2018)
static inline bool IsItemDeactivatedAfterChange() { return IsItemDeactivatedAfterEdit(); }
- // OBSOLETED in 1.61 (from Apr 2018)
- IMGUI_API bool InputFloat(const char* label, float* v, float step, float step_fast, int decimal_precision, ImGuiInputTextFlags extra_flags = 0); // Use the 'const char* format' version instead of 'decimal_precision'!
- IMGUI_API bool InputFloat2(const char* label, float v[2], int decimal_precision, ImGuiInputTextFlags extra_flags = 0);
- IMGUI_API bool InputFloat3(const char* label, float v[3], int decimal_precision, ImGuiInputTextFlags extra_flags = 0);
- IMGUI_API bool InputFloat4(const char* label, float v[4], int decimal_precision, ImGuiInputTextFlags extra_flags = 0);
- // OBSOLETED in 1.60 (from Dec 2017)
+ // OBSOLETED in 1.61 (between Apr 2018 and Aug 2018)
+ IMGUI_API bool InputFloat(const char* label, float* v, float step, float step_fast, int decimal_precision, ImGuiInputTextFlags flags = 0); // Use the 'const char* format' version instead of 'decimal_precision'!
+ IMGUI_API bool InputFloat2(const char* label, float v[2], int decimal_precision, ImGuiInputTextFlags flags = 0);
+ IMGUI_API bool InputFloat3(const char* label, float v[3], int decimal_precision, ImGuiInputTextFlags flags = 0);
+ IMGUI_API bool InputFloat4(const char* label, float v[4], int decimal_precision, ImGuiInputTextFlags flags = 0);
+ // OBSOLETED in 1.60 (between Dec 2017 and Apr 2018)
static inline bool IsAnyWindowFocused() { return IsWindowFocused(ImGuiFocusedFlags_AnyWindow); }
static inline bool IsAnyWindowHovered() { return IsWindowHovered(ImGuiHoveredFlags_AnyWindow); }
- static inline ImVec2 CalcItemRectClosestPoint(const ImVec2& pos, bool on_edge = false, float outward = 0.f) { (void)on_edge; (void)outward; IM_ASSERT(0); return pos; }
- // OBSOLETED in 1.53 (between Oct 2017 and Dec 2017)
- static inline void ShowTestWindow() { return ShowDemoWindow(); }
- static inline bool IsRootWindowFocused() { return IsWindowFocused(ImGuiFocusedFlags_RootWindow); }
- static inline bool IsRootWindowOrAnyChildFocused() { return IsWindowFocused(ImGuiFocusedFlags_RootAndChildWindows); }
- static inline void SetNextWindowContentWidth(float w) { SetNextWindowContentSize(ImVec2(w, 0.0f)); }
- static inline float GetItemsLineHeightWithSpacing() { return GetFrameHeightWithSpacing(); }
- // OBSOLETED in 1.52 (between Aug 2017 and Oct 2017)
- IMGUI_API bool Begin(const char* name, bool* p_open, const ImVec2& size_on_first_use, float bg_alpha_override = -1.0f, ImGuiWindowFlags flags = 0); // Use SetNextWindowSize(size, ImGuiCond_FirstUseEver) + SetNextWindowBgAlpha() instead.
- static inline bool IsRootWindowOrAnyChildHovered() { return IsWindowHovered(ImGuiHoveredFlags_RootAndChildWindows); }
- static inline void AlignFirstTextHeightToWidgets() { AlignTextToFramePadding(); }
- static inline void SetNextWindowPosCenter(ImGuiCond c=0) { ImGuiIO& io = GetIO(); SetNextWindowPos(ImVec2(io.DisplaySize.x * 0.5f, io.DisplaySize.y * 0.5f), c, ImVec2(0.5f, 0.5f)); }
- // OBSOLETED in 1.51 (between Jun 2017 and Aug 2017)
- static inline bool IsItemHoveredRect() { return IsItemHovered(ImGuiHoveredFlags_RectOnly); }
- static inline bool IsPosHoveringAnyWindow(const ImVec2&) { IM_ASSERT(0); return false; } // This was misleading and partly broken. You probably want to use the ImGui::GetIO().WantCaptureMouse flag instead.
- static inline bool IsMouseHoveringAnyWindow() { return IsWindowHovered(ImGuiHoveredFlags_AnyWindow); }
- static inline bool IsMouseHoveringWindow() { return IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup | ImGuiHoveredFlags_AllowWhenBlockedByActiveItem); }
+ static inline ImVec2 CalcItemRectClosestPoint(const ImVec2& pos, bool on_edge = false, float outward = 0.f) { IM_UNUSED(on_edge); IM_UNUSED(outward); IM_ASSERT(0); return pos; }
}
+typedef ImGuiInputTextCallback ImGuiTextEditCallback; // OBSOLETED in 1.63 (from Aug 2018): made the names consistent
+typedef ImGuiInputTextCallbackData ImGuiTextEditCallbackData;
#endif
//-----------------------------------------------------------------------------
// Helpers
//-----------------------------------------------------------------------------
-// Helper: Lightweight std::vector<> like class to avoid dragging dependencies (also: Windows implementation of STL with debug enabled is absurdly slow, so let's bypass it so our code runs fast in debug).
-// *Important* Our implementation does NOT call C++ constructors/destructors. This is intentional, we do not require it but you have to be mindful of that. Do _not_ use this class as a std::vector replacement in your code!
-template<typename T>
-class ImVector
-{
-public:
- int Size;
- int Capacity;
- T* Data;
-
- typedef T value_type;
- typedef value_type* iterator;
- typedef const value_type* const_iterator;
-
- inline ImVector() { Size = Capacity = 0; Data = NULL; }
- inline ~ImVector() { if (Data) ImGui::MemFree(Data); }
- inline ImVector(const ImVector<T>& src) { Size = Capacity = 0; Data = NULL; operator=(src); }
- inline ImVector<T>& operator=(const ImVector<T>& src) { clear(); resize(src.Size); memcpy(Data, src.Data, (size_t)Size * sizeof(value_type)); return *this; }
-
- inline bool empty() const { return Size == 0; }
- inline int size() const { return Size; }
- inline int capacity() const { return Capacity; }
- inline value_type& operator[](int i) { IM_ASSERT(i < Size); return Data[i]; }
- inline const value_type& operator[](int i) const { IM_ASSERT(i < Size); return Data[i]; }
-
- inline void clear() { if (Data) { Size = Capacity = 0; ImGui::MemFree(Data); Data = NULL; } }
- inline iterator begin() { return Data; }
- inline const_iterator begin() const { return Data; }
- inline iterator end() { return Data + Size; }
- inline const_iterator end() const { return Data + Size; }
- inline value_type& front() { IM_ASSERT(Size > 0); return Data[0]; }
- inline const value_type& front() const { IM_ASSERT(Size > 0); return Data[0]; }
- inline value_type& back() { IM_ASSERT(Size > 0); return Data[Size - 1]; }
- inline const value_type& back() const { IM_ASSERT(Size > 0); return Data[Size - 1]; }
- inline void swap(ImVector<value_type>& rhs) { int rhs_size = rhs.Size; rhs.Size = Size; Size = rhs_size; int rhs_cap = rhs.Capacity; rhs.Capacity = Capacity; Capacity = rhs_cap; value_type* rhs_data = rhs.Data; rhs.Data = Data; Data = rhs_data; }
-
- inline int _grow_capacity(int sz) const { int new_capacity = Capacity ? (Capacity + Capacity/2) : 8; return new_capacity > sz ? new_capacity : sz; }
- inline void resize(int new_size) { if (new_size > Capacity) reserve(_grow_capacity(new_size)); Size = new_size; }
- inline void resize(int new_size,const value_type& v){ if (new_size > Capacity) reserve(_grow_capacity(new_size)); if (new_size > Size) for (int n = Size; n < new_size; n++) memcpy(&Data[n], &v, sizeof(v)); Size = new_size; }
- inline void reserve(int new_capacity)
- {
- if (new_capacity <= Capacity)
- return;
- value_type* new_data = (value_type*)ImGui::MemAlloc((size_t)new_capacity * sizeof(value_type));
- if (Data)
- {
- memcpy(new_data, Data, (size_t)Size * sizeof(value_type));
- ImGui::MemFree(Data);
- }
- Data = new_data;
- Capacity = new_capacity;
- }
-
- // NB: It is forbidden to call push_back/push_front/insert with a reference pointing inside the ImVector data itself! e.g. v.push_back(v[10]) is forbidden.
- inline void push_back(const value_type& v) { if (Size == Capacity) reserve(_grow_capacity(Size + 1)); memcpy(&Data[Size], &v, sizeof(v)); Size++; }
- inline void pop_back() { IM_ASSERT(Size > 0); Size--; }
- inline void push_front(const value_type& v) { if (Size == 0) push_back(v); else insert(Data, v); }
- inline iterator erase(const_iterator it) { IM_ASSERT(it >= Data && it < Data+Size); const ptrdiff_t off = it - Data; memmove(Data + off, Data + off + 1, ((size_t)Size - (size_t)off - 1) * sizeof(value_type)); Size--; return Data + off; }
- inline iterator erase(const_iterator it, const_iterator it_last){ IM_ASSERT(it >= Data && it < Data+Size && it_last > it && it_last <= Data+Size); const ptrdiff_t count = it_last - it; const ptrdiff_t off = it - Data; memmove(Data + off, Data + off + count, ((size_t)Size - (size_t)off - count) * sizeof(value_type)); Size -= (int)count; return Data + off; }
- inline iterator erase_unsorted(const_iterator it) { IM_ASSERT(it >= Data && it < Data+Size); const ptrdiff_t off = it - Data; if (it < Data+Size-1) memcpy(Data + off, Data + Size - 1, sizeof(value_type)); Size--; return Data + off; }
- inline iterator insert(const_iterator it, const value_type& v) { IM_ASSERT(it >= Data && it <= Data+Size); const ptrdiff_t off = it - Data; if (Size == Capacity) reserve(_grow_capacity(Size + 1)); if (off < (int)Size) memmove(Data + off + 1, Data + off, ((size_t)Size - (size_t)off) * sizeof(value_type)); memcpy(&Data[off], &v, sizeof(v)); Size++; return Data + off; }
- inline bool contains(const value_type& v) const { const T* data = Data; const T* data_end = Data + Size; while (data < data_end) if (*data++ == v) return true; return false; }
- inline int index_from_pointer(const_iterator it) const { IM_ASSERT(it >= Data && it <= Data+Size); const ptrdiff_t off = it - Data; return (int)off; }
-};
-
-// Helper: IM_NEW(), IM_PLACEMENT_NEW(), IM_DELETE() macros to call MemAlloc + Placement New, Placement Delete + MemFree
-// We call C++ constructor on own allocated memory via the placement "new(ptr) Type()" syntax.
-// Defining a custom placement new() with a dummy parameter allows us to bypass including <new> which on some platforms complains when user has disabled exceptions.
-struct ImNewDummy {};
-inline void* operator new(size_t, ImNewDummy, void* ptr) { return ptr; }
-inline void operator delete(void*, ImNewDummy, void*) {} // This is only required so we can use the symetrical new()
-#define IM_PLACEMENT_NEW(_PTR) new(ImNewDummy(), _PTR)
-#define IM_NEW(_TYPE) new(ImNewDummy(), ImGui::MemAlloc(sizeof(_TYPE))) _TYPE
-template<typename T> void IM_DELETE(T* p) { if (p) { p->~T(); ImGui::MemFree(p); } }
-
// Helper: Execute a block of code at maximum once a frame. Convenient if you want to quickly create an UI within deep-nested code that runs multiple times every frame.
// Usage: static ImGuiOnceUponAFrame oaf; if (oaf) ImGui::Text("This will be called only once per frame");
struct ImGuiOnceUponAFrame
@@ -1336,37 +1623,30 @@ struct ImGuiOnceUponAFrame
operator bool() const { int current_frame = ImGui::GetFrameCount(); if (RefFrame == current_frame) return false; RefFrame = current_frame; return true; }
};
-// Helper: Macro for ImGuiOnceUponAFrame. Attention: The macro expands into 2 statement so make sure you don't use it within e.g. an if() statement without curly braces.
-#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS // Will obsolete
-#define IMGUI_ONCE_UPON_A_FRAME static ImGuiOnceUponAFrame imgui_oaf; if (imgui_oaf)
-#endif
-
// Helper: Parse and apply text filters. In format "aaaaa[,bbbb][,ccccc]"
struct ImGuiTextFilter
{
IMGUI_API ImGuiTextFilter(const char* default_filter = "");
- IMGUI_API bool Draw(const char* label = "Filter (inc,-exc)", float width = 0.0f); // Helper calling InputText+Build
+ IMGUI_API bool Draw(const char* label = "Filter (inc,-exc)", float width = 0.0f); // Helper calling InputText+Build
IMGUI_API bool PassFilter(const char* text, const char* text_end = NULL) const;
IMGUI_API void Build();
void Clear() { InputBuf[0] = 0; Build(); }
bool IsActive() const { return !Filters.empty(); }
// [Internal]
- struct TextRange
+ struct ImGuiTextRange
{
- const char* b;
- const char* e;
-
- TextRange() { b = e = NULL; }
- TextRange(const char* _b, const char* _e) { b = _b; e = _e; }
- const char* begin() const { return b; }
- const char* end () const { return e; }
- bool empty() const { return b == e; }
- IMGUI_API void split(char separator, ImVector<TextRange>* out) const;
+ const char* b;
+ const char* e;
+
+ ImGuiTextRange() { b = e = NULL; }
+ ImGuiTextRange(const char* _b, const char* _e) { b = _b; e = _e; }
+ bool empty() const { return b == e; }
+ IMGUI_API void split(char separator, ImVector<ImGuiTextRange>* out) const;
};
- char InputBuf[256];
- ImVector<TextRange> Filters;
- int CountGrep;
+ char InputBuf[256];
+ ImVector<ImGuiTextRange>Filters;
+ int CountGrep;
};
// Helper: Growable text buffer for logging/accumulating text
@@ -1374,17 +1654,18 @@ struct ImGuiTextFilter
struct ImGuiTextBuffer
{
ImVector<char> Buf;
- static char EmptyString[1];
+ IMGUI_API static char EmptyString[1];
ImGuiTextBuffer() { }
- inline char operator[](int i) { IM_ASSERT(Buf.Data != NULL); return Buf.Data[i]; }
+ inline char operator[](int i) const { IM_ASSERT(Buf.Data != NULL); return Buf.Data[i]; }
const char* begin() const { return Buf.Data ? &Buf.front() : EmptyString; }
const char* end() const { return Buf.Data ? &Buf.back() : EmptyString; } // Buf is zero-terminated, so end() will point on the zero-terminator
- int size() const { return Buf.Data ? Buf.Size - 1 : 0; }
- bool empty() { return Buf.Size <= 1; }
+ int size() const { return Buf.Size ? Buf.Size - 1 : 0; }
+ bool empty() const { return Buf.Size <= 1; }
void clear() { Buf.clear(); }
void reserve(int capacity) { Buf.reserve(capacity); }
const char* c_str() const { return Buf.Data ? Buf.Data : EmptyString; }
+ IMGUI_API void append(const char* str, const char* str_end = NULL);
IMGUI_API void appendf(const char* fmt, ...) IM_FMTARGS(2);
IMGUI_API void appendfv(const char* fmt, va_list args) IM_FMTLIST(2);
};
@@ -1399,15 +1680,17 @@ struct ImGuiTextBuffer
// Types are NOT stored, so it is up to you to make sure your Key don't collide with different types.
struct ImGuiStorage
{
- struct Pair
+ // [Internal]
+ struct ImGuiStoragePair
{
ImGuiID key;
union { int val_i; float val_f; void* val_p; };
- Pair(ImGuiID _key, int _val_i) { key = _key; val_i = _val_i; }
- Pair(ImGuiID _key, float _val_f) { key = _key; val_f = _val_f; }
- Pair(ImGuiID _key, void* _val_p) { key = _key; val_p = _val_p; }
+ ImGuiStoragePair(ImGuiID _key, int _val_i) { key = _key; val_i = _val_i; }
+ ImGuiStoragePair(ImGuiID _key, float _val_f) { key = _key; val_f = _val_f; }
+ ImGuiStoragePair(ImGuiID _key, void* _val_p) { key = _key; val_p = _val_p; }
};
- ImVector<Pair> Data;
+
+ ImVector<ImGuiStoragePair> Data;
// - Get***() functions find pair, never add/allocate. Pairs are sorted so a query is O(log N)
// - Set***() functions find pair, insertion on demand if missing.
@@ -1438,79 +1721,41 @@ struct ImGuiStorage
IMGUI_API void BuildSortByKey();
};
-// Shared state of InputText(), passed as an argument to your callback when a ImGuiInputTextFlags_Callback* flag is used.
-// The callback function should return 0 by default.
-// Callbacks (follow a flag name and see comments in ImGuiInputTextFlags_ declarations for more details)
-// - ImGuiInputTextFlags_CallbackCompletion: Callback on pressing TAB
-// - ImGuiInputTextFlags_CallbackHistory: Callback on pressing Up/Down arrows
-// - ImGuiInputTextFlags_CallbackAlways: Callback on each iteration
-// - ImGuiInputTextFlags_CallbackCharFilter: Callback on character inputs to replace or discard them. Modify 'EventChar' to replace or discard, or return 1 in callback to discard.
-// - ImGuiInputTextFlags_CallbackResize: Callback on buffer capacity changes request (beyond 'buf_size' parameter value), allowing the string to grow.
-struct ImGuiInputTextCallbackData
-{
- ImGuiInputTextFlags EventFlag; // One ImGuiInputTextFlags_Callback* // Read-only
- ImGuiInputTextFlags Flags; // What user passed to InputText() // Read-only
- void* UserData; // What user passed to InputText() // Read-only
-
- // Arguments for the different callback events
- // - To modify the text buffer in a callback, prefer using the InsertChars() / DeleteChars() function. InsertChars() will take care of calling the resize callback if necessary.
- // - If you know your edits are not going to resize the underlying buffer allocation, you may modify the contents of 'Buf[]' directly. You need to update 'BufTextLen' accordingly (0 <= BufTextLen < BufSize) and set 'BufDirty'' to true so InputText can update its internal state.
- ImWchar EventChar; // Character input // Read-write // [CharFilter] Replace character with another one, or set to zero to drop. return 1 is equivalent to setting EventChar=0;
- ImGuiKey EventKey; // Key pressed (Up/Down/TAB) // Read-only // [Completion,History]
- char* Buf; // Text buffer // Read-write // [Resize] Can replace pointer / [Completion,History,Always] Only write to pointed data, don't replace the actual pointer!
- int BufTextLen; // Text length (in bytes) // Read-write // [Resize,Completion,History,Always] Exclude zero-terminator storage. In C land: == strlen(some_text), in C++ land: string.length()
- int BufSize; // Buffer size (in bytes) = capacity+1 // Read-only // [Resize,Completion,History,Always] Include zero-terminator storage. In C land == ARRAYSIZE(my_char_array), in C++ land: string.capacity()+1
- bool BufDirty; // Set if you modify Buf/BufTextLen! // Write // [Completion,History,Always]
- int CursorPos; // // Read-write // [Completion,History,Always]
- int SelectionStart; // // Read-write // [Completion,History,Always] == to SelectionEnd when no selection)
- int SelectionEnd; // // Read-write // [Completion,History,Always]
-
- // Helper functions for text manipulation.
- // Use those function to benefit from the CallbackResize behaviors. Calling those function reset the selection.
- IMGUI_API ImGuiInputTextCallbackData();
- IMGUI_API void DeleteChars(int pos, int bytes_count);
- IMGUI_API void InsertChars(int pos, const char* text, const char* text_end = NULL);
- bool HasSelection() const { return SelectionStart != SelectionEnd; }
-};
-
-#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
-typedef ImGuiInputTextCallback ImGuiTextEditCallback; // [OBSOLETE 1.63+] Made the names consistent
-typedef ImGuiInputTextCallbackData ImGuiTextEditCallbackData;
-#endif
-
-// Resizing callback data to apply custom constraint. As enabled by SetNextWindowSizeConstraints(). Callback is called during the next Begin().
-// NB: For basic min/max size constraint on each axis you don't need to use the callback! The SetNextWindowSizeConstraints() parameters are enough.
-struct ImGuiSizeCallbackData
-{
- void* UserData; // Read-only. What user passed to SetNextWindowSizeConstraints()
- ImVec2 Pos; // Read-only. Window position, for reference.
- ImVec2 CurrentSize; // Read-only. Current window size.
- ImVec2 DesiredSize; // Read-write. Desired size, based on user's mouse position. Write to this field to restrain resizing.
-};
-
-// Data payload for Drag and Drop operations
-struct ImGuiPayload
+// Helper: Manually clip large list of items.
+// If you are submitting lots of evenly spaced items and you have a random access to the list, you can perform coarse clipping based on visibility to save yourself from processing those items at all.
+// The clipper calculates the range of visible items and advance the cursor to compensate for the non-visible items we have skipped.
+// ImGui already clip items based on their bounds but it needs to measure text size to do so. Coarse clipping before submission makes this cost and your own data fetching/submission cost null.
+// Usage:
+// ImGuiListClipper clipper(1000); // we have 1000 elements, evenly spaced.
+// while (clipper.Step())
+// for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++)
+// ImGui::Text("line number %d", i);
+// - Step 0: the clipper let you process the first element, regardless of it being visible or not, so we can measure the element height (step skipped if we passed a known height as second arg to constructor).
+// - Step 1: the clipper infer height from first element, calculate the actual range of elements to display, and position the cursor before the first element.
+// - (Step 2: dummy step only required if an explicit items_height was passed to constructor or Begin() and user call Step(). Does nothing and switch to Step 3.)
+// - Step 3: the clipper validate that we have reached the expected Y position (corresponding to element DisplayEnd), advance the cursor to the end of the list and then returns 'false' to end the loop.
+struct ImGuiListClipper
{
- // Members
- void* Data; // Data (copied and owned by dear imgui)
- int DataSize; // Data size
+ int DisplayStart, DisplayEnd;
+ int ItemsCount;
// [Internal]
- ImGuiID SourceId; // Source item id
- ImGuiID SourceParentId; // Source parent id (if available)
- int DataFrameCount; // Data timestamp
- char DataType[32+1]; // Data type tag (short user-supplied string, 32 characters max)
- bool Preview; // Set when AcceptDragDropPayload() was called and mouse has been hovering the target item (nb: handle overlapping drag targets)
- bool Delivery; // Set when AcceptDragDropPayload() was called and mouse button is released over the target item.
+ int StepNo;
+ float ItemsHeight;
+ float StartPosY;
- ImGuiPayload() { Clear(); }
- void Clear() { SourceId = SourceParentId = 0; Data = NULL; DataSize = 0; memset(DataType, 0, sizeof(DataType)); DataFrameCount = -1; Preview = Delivery = false; }
- bool IsDataType(const char* type) const { return DataFrameCount != -1 && strcmp(type, DataType) == 0; }
- bool IsPreview() const { return Preview; }
- bool IsDelivery() const { return Delivery; }
+ // items_count: Use -1 to ignore (you can call Begin later). Use INT_MAX if you don't know how many items you have (in which case the cursor won't be advanced in the final step).
+ // items_height: Use -1.0f to be calculated automatically on first step. Otherwise pass in the distance between your items, typically GetTextLineHeightWithSpacing() or GetFrameHeightWithSpacing().
+ // If you don't specify an items_height, you NEED to call Step(). If you specify items_height you may call the old Begin()/End() api directly, but prefer calling Step().
+ ImGuiListClipper(int items_count = -1, float items_height = -1.0f) { Begin(items_count, items_height); } // NB: Begin() initialize every fields (as we allow user to call Begin/End multiple times on a same instance if they want).
+ ~ImGuiListClipper() { IM_ASSERT(ItemsCount == -1); } // Assert if user forgot to call End() or Step() until false.
+
+ IMGUI_API bool Step(); // Call until it returns false. The DisplayStart/DisplayEnd fields will be set and you can process/draw those items.
+ IMGUI_API void Begin(int items_count, float items_height = -1.0f); // Automatically called by constructor if you passed 'items_count' or by Step() in Step 1.
+ IMGUI_API void End(); // Automatically called on the last call of Step() that returns false.
};
-// Helpers macros to generate 32-bits encoded colors
+// Helpers macros to generate 32-bit encoded colors
#ifdef IMGUI_USE_BGRA_PACKED_COLOR
#define IM_COL32_R_SHIFT 16
#define IM_COL32_G_SHIFT 8
@@ -1529,7 +1774,7 @@ struct ImGuiPayload
#define IM_COL32_BLACK IM_COL32(0,0,0,255) // Opaque black
#define IM_COL32_BLACK_TRANS IM_COL32(0,0,0,0) // Transparent black = 0x00000000
-// Helper: ImColor() implicity converts colors to either ImU32 (packed 4x1 byte) or ImVec4 (4x1 float)
+// Helper: ImColor() implicitly converts colors to either ImU32 (packed 4x1 byte) or ImVec4 (4x1 float)
// Prefer using IM_COL32() macros if you want a guaranteed compile-time ImU32 for usage with ImDrawList API.
// **Avoid storing ImColor! Store either u32 of ImVec4. This is not a full-featured color class. MAY OBSOLETE.
// **None of the ImGui API are using ImColor directly but you can use it as a convenience to pass colors in either ImU32 or ImVec4 formats. Explicitly cast to ImU32 or ImVec4 if needed.
@@ -1550,60 +1795,47 @@ struct ImColor
static ImColor HSV(float h, float s, float v, float a = 1.0f) { float r,g,b; ImGui::ColorConvertHSVtoRGB(h, s, v, r, g, b); return ImColor(r,g,b,a); }
};
-// Helper: Manually clip large list of items.
-// If you are submitting lots of evenly spaced items and you have a random access to the list, you can perform coarse clipping based on visibility to save yourself from processing those items at all.
-// The clipper calculates the range of visible items and advance the cursor to compensate for the non-visible items we have skipped.
-// ImGui already clip items based on their bounds but it needs to measure text size to do so. Coarse clipping before submission makes this cost and your own data fetching/submission cost null.
-// Usage:
-// ImGuiListClipper clipper(1000); // we have 1000 elements, evenly spaced.
-// while (clipper.Step())
-// for (int i = clipper.DisplayStart; i < clipper.DisplayEnd; i++)
-// ImGui::Text("line number %d", i);
-// - Step 0: the clipper let you process the first element, regardless of it being visible or not, so we can measure the element height (step skipped if we passed a known height as second arg to constructor).
-// - Step 1: the clipper infer height from first element, calculate the actual range of elements to display, and position the cursor before the first element.
-// - (Step 2: dummy step only required if an explicit items_height was passed to constructor or Begin() and user call Step(). Does nothing and switch to Step 3.)
-// - Step 3: the clipper validate that we have reached the expected Y position (corresponding to element DisplayEnd), advance the cursor to the end of the list and then returns 'false' to end the loop.
-struct ImGuiListClipper
-{
- float StartPosY;
- float ItemsHeight;
- int ItemsCount, StepNo, DisplayStart, DisplayEnd;
-
- // items_count: Use -1 to ignore (you can call Begin later). Use INT_MAX if you don't know how many items you have (in which case the cursor won't be advanced in the final step).
- // items_height: Use -1.0f to be calculated automatically on first step. Otherwise pass in the distance between your items, typically GetTextLineHeightWithSpacing() or GetFrameHeightWithSpacing().
- // If you don't specify an items_height, you NEED to call Step(). If you specify items_height you may call the old Begin()/End() api directly, but prefer calling Step().
- ImGuiListClipper(int items_count = -1, float items_height = -1.0f) { Begin(items_count, items_height); } // NB: Begin() initialize every fields (as we allow user to call Begin/End multiple times on a same instance if they want).
- ~ImGuiListClipper() { IM_ASSERT(ItemsCount == -1); } // Assert if user forgot to call End() or Step() until false.
-
- IMGUI_API bool Step(); // Call until it returns false. The DisplayStart/DisplayEnd fields will be set and you can process/draw those items.
- IMGUI_API void Begin(int items_count, float items_height = -1.0f); // Automatically called by constructor if you passed 'items_count' or by Step() in Step 1.
- IMGUI_API void End(); // Automatically called on the last call of Step() that returns false.
-};
-
//-----------------------------------------------------------------------------
-// Draw List
+// Draw List API (ImDrawCmd, ImDrawIdx, ImDrawVert, ImDrawChannel, ImDrawListSplitter, ImDrawListFlags, ImDrawList, ImDrawData)
// Hold a series of drawing commands. The user provides a renderer for ImDrawData which essentially contains an array of ImDrawList.
//-----------------------------------------------------------------------------
// Draw callbacks for advanced uses.
-// NB- You most likely do NOT need to use draw callbacks just to create your own widget or customized UI rendering (you can poke into the draw list for that)
-// Draw callback may be useful for example, A) Change your GPU render state, B) render a complex 3D scene inside a UI element (without an intermediate texture/render target), etc.
-// The expected behavior from your rendering function is 'if (cmd.UserCallback != NULL) cmd.UserCallback(parent_list, cmd); else RenderTriangles()'
+// NB: You most likely do NOT need to use draw callbacks just to create your own widget or customized UI rendering,
+// you can poke into the draw list for that! Draw callback may be useful for example to:
+// A) Change your GPU render state,
+// B) render a complex 3D scene inside a UI element without an intermediate texture/render target, etc.
+// The expected behavior from your rendering function is 'if (cmd.UserCallback != NULL) { cmd.UserCallback(parent_list, cmd); } else { RenderTriangles() }'
+// If you want to override the signature of ImDrawCallback, you can simply use e.g. '#define ImDrawCallback MyDrawCallback' (in imconfig.h) + update rendering back-end accordingly.
+#ifndef ImDrawCallback
typedef void (*ImDrawCallback)(const ImDrawList* parent_list, const ImDrawCmd* cmd);
+#endif
+
+// Special Draw callback value to request renderer back-end to reset the graphics/render state.
+// The renderer back-end needs to handle this special value, otherwise it will crash trying to call a function at this address.
+// This is useful for example if you submitted callbacks which you know have altered the render state and you want it to be restored.
+// It is not done by default because they are many perfectly useful way of altering render state for imgui contents (e.g. changing shader/blending settings before an Image call).
+#define ImDrawCallback_ResetRenderState (ImDrawCallback)(-1)
// Typically, 1 command = 1 GPU draw call (unless command is a callback)
+// Pre 1.71 back-ends will typically ignore the VtxOffset/IdxOffset fields. When 'io.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset'
+// is enabled, those fields allow us to render meshes larger than 64K vertices while keeping 16-bit indices.
struct ImDrawCmd
{
unsigned int ElemCount; // Number of indices (multiple of 3) to be rendered as triangles. Vertices are stored in the callee ImDrawList's vtx_buffer[] array, indices in idx_buffer[].
ImVec4 ClipRect; // Clipping rectangle (x1, y1, x2, y2). Subtract ImDrawData->DisplayPos to get clipping rectangle in "viewport" coordinates
ImTextureID TextureId; // User-provided texture ID. Set by user in ImfontAtlas::SetTexID() for fonts or passed to Image*() functions. Ignore if never using images or multiple fonts atlas.
+ unsigned int VtxOffset; // Start offset in vertex buffer. Pre-1.71 or without ImGuiBackendFlags_RendererHasVtxOffset: always 0. With ImGuiBackendFlags_RendererHasVtxOffset: may be >0 to support meshes larger than 64K vertices with 16-bit indices.
+ unsigned int IdxOffset; // Start offset in index buffer. Always equal to sum of ElemCount drawn so far.
ImDrawCallback UserCallback; // If != NULL, call the function instead of rendering the vertices. clip_rect and texture_id will be set normally.
void* UserCallbackData; // The draw callback code can access this.
- ImDrawCmd() { ElemCount = 0; ClipRect.x = ClipRect.y = ClipRect.z = ClipRect.w = 0.0f; TextureId = (ImTextureID)NULL; UserCallback = NULL; UserCallbackData = NULL; }
+ ImDrawCmd() { ElemCount = 0; TextureId = (ImTextureID)NULL; VtxOffset = IdxOffset = 0; UserCallback = NULL; UserCallbackData = NULL; }
};
-// Vertex index (override with '#define ImDrawIdx unsigned int' inside in imconfig.h)
+// Vertex index
+// (to allow large meshes with 16-bit indices: set 'io.BackendFlags |= ImGuiBackendFlags_RendererHasVtxOffset' and handle ImDrawCmd::VtxOffset in the renderer back-end)
+// (to use 32-bit indices: override with '#define ImDrawIdx unsigned int' in imconfig.h)
#ifndef ImDrawIdx
typedef unsigned short ImDrawIdx;
#endif
@@ -1619,21 +1851,38 @@ struct ImDrawVert
#else
// You can override the vertex format layout by defining IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT in imconfig.h
// The code expect ImVec2 pos (8 bytes), ImVec2 uv (8 bytes), ImU32 col (4 bytes), but you can re-order them or add other fields as needed to simplify integration in your engine.
-// The type has to be described within the macro (you can either declare the struct or use a typedef)
+// The type has to be described within the macro (you can either declare the struct or use a typedef). This is because ImVec2/ImU32 are likely not declared a the time you'd want to set your type up.
// NOTE: IMGUI DOESN'T CLEAR THE STRUCTURE AND DOESN'T CALL A CONSTRUCTOR SO ANY CUSTOM FIELD WILL BE UNINITIALIZED. IF YOU ADD EXTRA FIELDS (SUCH AS A 'Z' COORDINATES) YOU WILL NEED TO CLEAR THEM DURING RENDER OR TO IGNORE THEM.
IMGUI_OVERRIDE_DRAWVERT_STRUCT_LAYOUT;
#endif
-// Draw channels are used by the Columns API to "split" the render list into different channels while building, so items of each column can be batched together.
-// You can also use them to simulate drawing layers and submit primitives in a different order than how they will be rendered.
+// For use by ImDrawListSplitter.
struct ImDrawChannel
{
- ImVector<ImDrawCmd> CmdBuffer;
- ImVector<ImDrawIdx> IdxBuffer;
+ ImVector<ImDrawCmd> _CmdBuffer;
+ ImVector<ImDrawIdx> _IdxBuffer;
+};
+
+// Split/Merge functions are used to split the draw list into different layers which can be drawn into out of order.
+// This is used by the Columns api, so items of each column can be batched together in a same draw call.
+struct ImDrawListSplitter
+{
+ int _Current; // Current channel number (0)
+ int _Count; // Number of active channels (1+)
+ ImVector<ImDrawChannel> _Channels; // Draw channels (not resized down so _Count might be < Channels.Size)
+
+ inline ImDrawListSplitter() { Clear(); }
+ inline ~ImDrawListSplitter() { ClearFreeMemory(); }
+ inline void Clear() { _Current = 0; _Count = 1; } // Do not clear Channels[] so our allocations are reused next frame
+ IMGUI_API void ClearFreeMemory();
+ IMGUI_API void Split(ImDrawList* draw_list, int count);
+ IMGUI_API void Merge(ImDrawList* draw_list);
+ IMGUI_API void SetCurrentChannel(ImDrawList* draw_list, int channel_idx);
};
enum ImDrawCornerFlags_
{
+ ImDrawCornerFlags_None = 0,
ImDrawCornerFlags_TopLeft = 1 << 0, // 0x1
ImDrawCornerFlags_TopRight = 1 << 1, // 0x2
ImDrawCornerFlags_BotLeft = 1 << 2, // 0x4
@@ -1647,13 +1896,17 @@ enum ImDrawCornerFlags_
enum ImDrawListFlags_
{
- ImDrawListFlags_AntiAliasedLines = 1 << 0,
- ImDrawListFlags_AntiAliasedFill = 1 << 1
+ ImDrawListFlags_None = 0,
+ ImDrawListFlags_AntiAliasedLines = 1 << 0, // Lines are anti-aliased (*2 the number of triangles for 1.0f wide line, otherwise *3 the number of triangles)
+ ImDrawListFlags_AntiAliasedFill = 1 << 1, // Filled shapes have anti-aliased edges (*2 the number of vertices)
+ ImDrawListFlags_AllowVtxOffset = 1 << 2 // Can emit 'VtxOffset > 0' to allow large meshes. Set when 'ImGuiBackendFlags_RendererHasVtxOffset' is enabled.
};
// Draw command list
-// This is the low-level list of polygons that ImGui functions are filling. At the end of the frame, all command lists are passed to your ImGuiIO::RenderDrawListFn function for rendering.
-// Each ImGui window contains its own ImDrawList. You can use ImGui::GetWindowDrawList() to access the current window draw list and draw custom primitives.
+// This is the low-level list of polygons that ImGui:: functions are filling. At the end of the frame,
+// all command lists are passed to your ImGuiIO::RenderDrawListFn function for rendering.
+// Each dear imgui window contains its own ImDrawList. You can use ImGui::GetWindowDrawList() to
+// access the current window draw list and draw custom primitives.
// You can interleave normal ImGui:: calls and adding primitives to the current draw list.
// All positions are generally in pixel coordinates (top-left at (0,0), bottom-right at io.DisplaySize), but you are totally free to apply whatever transformation matrix to want to the data (if you apply such transformation you'll want to apply it to ClipRect as well)
// Important: Primitives are always added to the list and not culled (culling is done at higher-level by ImGui:: functions), if you use this API a lot consider coarse culling your drawn objects.
@@ -1668,15 +1921,14 @@ struct ImDrawList
// [Internal, used while building lists]
const ImDrawListSharedData* _Data; // Pointer to shared draw data (you can use ImGui::GetDrawListSharedData() to get the one from current ImGui context)
const char* _OwnerName; // Pointer to owner window's name for debugging
- unsigned int _VtxCurrentIdx; // [Internal] == VtxBuffer.Size
+ unsigned int _VtxCurrentOffset; // [Internal] Always 0 unless 'Flags & ImDrawListFlags_AllowVtxOffset'.
+ unsigned int _VtxCurrentIdx; // [Internal] Generally == VtxBuffer.Size unless we are past 64K vertices, in which case this gets reset to 0.
ImDrawVert* _VtxWritePtr; // [Internal] point within VtxBuffer.Data after each add command (to avoid using the ImVector<> operators too much)
ImDrawIdx* _IdxWritePtr; // [Internal] point within IdxBuffer.Data after each add command (to avoid using the ImVector<> operators too much)
ImVector<ImVec4> _ClipRectStack; // [Internal]
ImVector<ImTextureID> _TextureIdStack; // [Internal]
ImVector<ImVec2> _Path; // [Internal] current path building
- int _ChannelsCurrent; // [Internal] current channel number (0)
- int _ChannelsCount; // [Internal] number of active channels (1+)
- ImVector<ImDrawChannel> _Channels; // [Internal] draw channels for columns API (not resized down so _ChannelsCount may be smaller than _Channels.Size)
+ ImDrawListSplitter _Splitter; // [Internal] for channels api
// If you want to create ImDrawList instances, pass them ImGui::GetDrawListSharedData() or create and use your own ImDrawListSharedData (so you can use ImDrawList without ImGui)
ImDrawList(const ImDrawListSharedData* shared_data) { _Data = shared_data; _OwnerName = NULL; Clear(); }
@@ -1690,53 +1942,68 @@ struct ImDrawList
inline ImVec2 GetClipRectMax() const { const ImVec4& cr = _ClipRectStack.back(); return ImVec2(cr.z, cr.w); }
// Primitives
- IMGUI_API void AddLine(const ImVec2& a, const ImVec2& b, ImU32 col, float thickness = 1.0f);
- IMGUI_API void AddRect(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners_flags = ImDrawCornerFlags_All, float thickness = 1.0f); // a: upper-left, b: lower-right, rounding_corners_flags: 4-bits corresponding to which corner to round
- IMGUI_API void AddRectFilled(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding = 0.0f, int rounding_corners_flags = ImDrawCornerFlags_All); // a: upper-left, b: lower-right
- IMGUI_API void AddRectFilledMultiColor(const ImVec2& a, const ImVec2& b, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left);
- IMGUI_API void AddQuad(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, ImU32 col, float thickness = 1.0f);
- IMGUI_API void AddQuadFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, ImU32 col);
- IMGUI_API void AddTriangle(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col, float thickness = 1.0f);
- IMGUI_API void AddTriangleFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col);
- IMGUI_API void AddCircle(const ImVec2& centre, float radius, ImU32 col, int num_segments = 12, float thickness = 1.0f);
- IMGUI_API void AddCircleFilled(const ImVec2& centre, float radius, ImU32 col, int num_segments = 12);
+ // - For rectangular primitives, "p_min" and "p_max" represent the upper-left and lower-right corners.
+ // - For circle primitives, use "num_segments == 0" to automatically calculate tessellation (preferred).
+ // In future versions we will use textures to provide cheaper and higher-quality circles.
+ // Use AddNgon() and AddNgonFilled() functions if you need to guaranteed a specific number of sides.
+ IMGUI_API void AddLine(const ImVec2& p1, const ImVec2& p2, ImU32 col, float thickness = 1.0f);
+ IMGUI_API void AddRect(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, float rounding = 0.0f, ImDrawCornerFlags rounding_corners = ImDrawCornerFlags_All, float thickness = 1.0f); // a: upper-left, b: lower-right (== upper-left + size), rounding_corners_flags: 4 bits corresponding to which corner to round
+ IMGUI_API void AddRectFilled(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, float rounding = 0.0f, ImDrawCornerFlags rounding_corners = ImDrawCornerFlags_All); // a: upper-left, b: lower-right (== upper-left + size)
+ IMGUI_API void AddRectFilledMultiColor(const ImVec2& p_min, const ImVec2& p_max, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left);
+ IMGUI_API void AddQuad(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness = 1.0f);
+ IMGUI_API void AddQuadFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col);
+ IMGUI_API void AddTriangle(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness = 1.0f);
+ IMGUI_API void AddTriangleFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col);
+ IMGUI_API void AddCircle(const ImVec2& center, float radius, ImU32 col, int num_segments = 12, float thickness = 1.0f);
+ IMGUI_API void AddCircleFilled(const ImVec2& center, float radius, ImU32 col, int num_segments = 12);
+ IMGUI_API void AddNgon(const ImVec2& center, float radius, ImU32 col, int num_segments, float thickness = 1.0f);
+ IMGUI_API void AddNgonFilled(const ImVec2& center, float radius, ImU32 col, int num_segments);
IMGUI_API void AddText(const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL);
IMGUI_API void AddText(const ImFont* font, float font_size, const ImVec2& pos, ImU32 col, const char* text_begin, const char* text_end = NULL, float wrap_width = 0.0f, const ImVec4* cpu_fine_clip_rect = NULL);
- IMGUI_API void AddImage(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a = ImVec2(0,0), const ImVec2& uv_b = ImVec2(1,1), ImU32 col = 0xFFFFFFFF);
- IMGUI_API void AddImageQuad(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a = ImVec2(0,0), const ImVec2& uv_b = ImVec2(1,0), const ImVec2& uv_c = ImVec2(1,1), const ImVec2& uv_d = ImVec2(0,1), ImU32 col = 0xFFFFFFFF);
- IMGUI_API void AddImageRounded(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col, float rounding, int rounding_corners = ImDrawCornerFlags_All);
- IMGUI_API void AddPolyline(const ImVec2* points, const int num_points, ImU32 col, bool closed, float thickness);
- IMGUI_API void AddConvexPolyFilled(const ImVec2* points, const int num_points, ImU32 col); // Note: Anti-aliased filling requires points to be in clockwise order.
- IMGUI_API void AddBezierCurve(const ImVec2& pos0, const ImVec2& cp0, const ImVec2& cp1, const ImVec2& pos1, ImU32 col, float thickness, int num_segments = 0);
+ IMGUI_API void AddPolyline(const ImVec2* points, int num_points, ImU32 col, bool closed, float thickness);
+ IMGUI_API void AddConvexPolyFilled(const ImVec2* points, int num_points, ImU32 col); // Note: Anti-aliased filling requires points to be in clockwise order.
+ IMGUI_API void AddBezierCurve(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments = 0);
+
+ // Image primitives
+ // - Read FAQ to understand what ImTextureID is.
+ // - "p_min" and "p_max" represent the upper-left and lower-right corners of the rectangle.
+ // - "uv_min" and "uv_max" represent the normalized texture coordinates to use for those corners. Using (0,0)->(1,1) texture coordinates will generally display the entire texture.
+ IMGUI_API void AddImage(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min = ImVec2(0, 0), const ImVec2& uv_max = ImVec2(1, 1), ImU32 col = IM_COL32_WHITE);
+ IMGUI_API void AddImageQuad(ImTextureID user_texture_id, const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& uv1 = ImVec2(0, 0), const ImVec2& uv2 = ImVec2(1, 0), const ImVec2& uv3 = ImVec2(1, 1), const ImVec2& uv4 = ImVec2(0, 1), ImU32 col = IM_COL32_WHITE);
+ IMGUI_API void AddImageRounded(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min, const ImVec2& uv_max, ImU32 col, float rounding, ImDrawCornerFlags rounding_corners = ImDrawCornerFlags_All);
// Stateful path API, add points then finish with PathFillConvex() or PathStroke()
- inline void PathClear() { _Path.resize(0); }
+ inline void PathClear() { _Path.Size = 0; }
inline void PathLineTo(const ImVec2& pos) { _Path.push_back(pos); }
- inline void PathLineToMergeDuplicate(const ImVec2& pos) { if (_Path.Size == 0 || memcmp(&_Path[_Path.Size-1], &pos, 8) != 0) _Path.push_back(pos); }
- inline void PathFillConvex(ImU32 col) { AddConvexPolyFilled(_Path.Data, _Path.Size, col); PathClear(); } // Note: Anti-aliased filling requires points to be in clockwise order.
- inline void PathStroke(ImU32 col, bool closed, float thickness = 1.0f) { AddPolyline(_Path.Data, _Path.Size, col, closed, thickness); PathClear(); }
- IMGUI_API void PathArcTo(const ImVec2& centre, float radius, float a_min, float a_max, int num_segments = 10);
- IMGUI_API void PathArcToFast(const ImVec2& centre, float radius, int a_min_of_12, int a_max_of_12); // Use precomputed angles for a 12 steps circle
- IMGUI_API void PathBezierCurveTo(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, int num_segments = 0);
- IMGUI_API void PathRect(const ImVec2& rect_min, const ImVec2& rect_max, float rounding = 0.0f, int rounding_corners_flags = ImDrawCornerFlags_All);
-
- // Channels
- // - Use to simulate layers. By switching channels to can render out-of-order (e.g. submit foreground primitives before background primitives)
- // - Use to minimize draw calls (e.g. if going back-and-forth between multiple non-overlapping clipping rectangles, prefer to append into separate channels then merge at the end)
- IMGUI_API void ChannelsSplit(int channels_count);
- IMGUI_API void ChannelsMerge();
- IMGUI_API void ChannelsSetCurrent(int channel_index);
+ inline void PathLineToMergeDuplicate(const ImVec2& pos) { if (_Path.Size == 0 || memcmp(&_Path.Data[_Path.Size-1], &pos, 8) != 0) _Path.push_back(pos); }
+ inline void PathFillConvex(ImU32 col) { AddConvexPolyFilled(_Path.Data, _Path.Size, col); _Path.Size = 0; } // Note: Anti-aliased filling requires points to be in clockwise order.
+ inline void PathStroke(ImU32 col, bool closed, float thickness = 1.0f) { AddPolyline(_Path.Data, _Path.Size, col, closed, thickness); _Path.Size = 0; }
+ IMGUI_API void PathArcTo(const ImVec2& center, float radius, float a_min, float a_max, int num_segments = 10);
+ IMGUI_API void PathArcToFast(const ImVec2& center, float radius, int a_min_of_12, int a_max_of_12); // Use precomputed angles for a 12 steps circle
+ IMGUI_API void PathBezierCurveTo(const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, int num_segments = 0);
+ IMGUI_API void PathRect(const ImVec2& rect_min, const ImVec2& rect_max, float rounding = 0.0f, ImDrawCornerFlags rounding_corners = ImDrawCornerFlags_All);
// Advanced
IMGUI_API void AddCallback(ImDrawCallback callback, void* callback_data); // Your rendering function must check for 'UserCallback' in ImDrawCmd and call the function instead of rendering triangles.
IMGUI_API void AddDrawCmd(); // This is useful if you need to forcefully create a new draw call (to allow for dependent rendering / blending). Otherwise primitives are merged into the same draw-call as much as possible
IMGUI_API ImDrawList* CloneOutput() const; // Create a clone of the CmdBuffer/IdxBuffer/VtxBuffer.
+ // Advanced: Channels
+ // - Use to split render into layers. By switching channels to can render out-of-order (e.g. submit FG primitives before BG primitives)
+ // - Use to minimize draw calls (e.g. if going back-and-forth between multiple clipping rectangles, prefer to append into separate channels then merge at the end)
+ // - FIXME-OBSOLETE: This API shouldn't have been in ImDrawList in the first place!
+ // Prefer using your own persistent copy of ImDrawListSplitter as you can stack them.
+ // Using the ImDrawList::ChannelsXXXX you cannot stack a split over another.
+ inline void ChannelsSplit(int count) { _Splitter.Split(this, count); }
+ inline void ChannelsMerge() { _Splitter.Merge(this); }
+ inline void ChannelsSetCurrent(int n) { _Splitter.SetCurrentChannel(this, n); }
+
// Internal helpers
// NB: all primitives needs to be reserved via PrimReserve() beforehand!
IMGUI_API void Clear();
IMGUI_API void ClearFreeMemory();
IMGUI_API void PrimReserve(int idx_count, int vtx_count);
+ IMGUI_API void PrimUnreserve(int idx_count, int vtx_count);
IMGUI_API void PrimRect(const ImVec2& a, const ImVec2& b, ImU32 col); // Axis aligned rectangle (composed of two triangles)
IMGUI_API void PrimRectUV(const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col);
IMGUI_API void PrimQuadUV(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a, const ImVec2& uv_b, const ImVec2& uv_c, const ImVec2& uv_d, ImU32 col);
@@ -1747,8 +2014,9 @@ struct ImDrawList
IMGUI_API void UpdateTextureID();
};
-// All draw data to render an ImGui frame
-// (NB: the style and the naming convention here is a little inconsistent but we preserve them for backward compatibility purpose)
+// All draw data to render a Dear ImGui frame
+// (NB: the style and the naming convention here is a little inconsistent, we currently preserve them for backward compatibility purpose,
+// as this is one of the oldest structure exposed by the library! Basically, ImDrawList == CmdList)
struct ImDrawData
{
bool Valid; // Only valid after Render() is called and before the next NewFrame() is called.
@@ -1758,15 +2026,20 @@ struct ImDrawData
int TotalVtxCount; // For convenience, sum of all ImDrawList's VtxBuffer.Size
ImVec2 DisplayPos; // Upper-left position of the viewport to render (== upper-left of the orthogonal projection matrix to use)
ImVec2 DisplaySize; // Size of the viewport to render (== io.DisplaySize for the main viewport) (DisplayPos + DisplaySize == lower-right of the orthogonal projection matrix to use)
+ ImVec2 FramebufferScale; // Amount of pixels for each unit of DisplaySize. Based on io.DisplayFramebufferScale. Generally (1,1) on normal display, (2,2) on OSX with Retina display.
// Functions
ImDrawData() { Valid = false; Clear(); }
~ImDrawData() { Clear(); }
- void Clear() { Valid = false; CmdLists = NULL; CmdListsCount = TotalVtxCount = TotalIdxCount = 0; DisplayPos = DisplaySize = ImVec2(0.f, 0.f); } // The ImDrawList are owned by ImGuiContext!
- IMGUI_API void DeIndexAllBuffers(); // Helper to convert all buffers from indexed to non-indexed, in case you cannot render indexed. Note: this is slow and most likely a waste of resources. Always prefer indexed rendering!
- IMGUI_API void ScaleClipRects(const ImVec2& sc); // Helper to scale the ClipRect field of each ImDrawCmd. Use if your final output buffer is at a different scale than ImGui expects, or if there is a difference between your window resolution and framebuffer resolution.
+ void Clear() { Valid = false; CmdLists = NULL; CmdListsCount = TotalVtxCount = TotalIdxCount = 0; DisplayPos = DisplaySize = FramebufferScale = ImVec2(0.f, 0.f); } // The ImDrawList are owned by ImGuiContext!
+ IMGUI_API void DeIndexAllBuffers(); // Helper to convert all buffers from indexed to non-indexed, in case you cannot render indexed. Note: this is slow and most likely a waste of resources. Always prefer indexed rendering!
+ IMGUI_API void ScaleClipRects(const ImVec2& fb_scale); // Helper to scale the ClipRect field of each ImDrawCmd. Use if your final output buffer is at a different scale than Dear ImGui expects, or if there is a difference between your window resolution and framebuffer resolution.
};
+//-----------------------------------------------------------------------------
+// Font API (ImFontConfig, ImFontGlyph, ImFontAtlasFlags, ImFontAtlas, ImFontGlyphRangesBuilder, ImFont)
+//-----------------------------------------------------------------------------
+
struct ImFontConfig
{
void* FontData; // // TTF/OTF data
@@ -1774,7 +2047,7 @@ struct ImFontConfig
bool FontDataOwnedByAtlas; // true // TTF/OTF data ownership taken by the container ImFontAtlas (will delete memory itself).
int FontNo; // 0 // Index of font within TTF/OTF file
float SizePixels; // // Size in pixels for rasterizer (more or less maps to the resulting font height).
- int OversampleH; // 3 // Rasterize at higher quality for sub-pixel positioning. We don't use sub-pixel positions on the Y axis.
+ int OversampleH; // 3 // Rasterize at higher quality for sub-pixel positioning. Read https://github.com/nothings/stb/blob/master/tests/oversample/README.md for details.
int OversampleV; // 1 // Rasterize at higher quality for sub-pixel positioning. We don't use sub-pixel positions on the Y axis.
bool PixelSnapH; // false // Align every glyph to pixel boundary. Useful e.g. if you are merging a non-pixel aligned font with the default font. If enabled, you can set OversampleH/V to 1.
ImVec2 GlyphExtraSpacing; // 0, 0 // Extra spacing (in pixels) between glyphs. Only X axis is supported for now.
@@ -1785,6 +2058,7 @@ struct ImFontConfig
bool MergeMode; // false // Merge into previous ImFont, so you can combine multiple inputs font into one ImFont (e.g. ASCII font + icons + Japanese glyphs). You may want to use GlyphOffset.y when merge font of different heights.
unsigned int RasterizerFlags; // 0x00 // Settings for custom font rasterizer (e.g. ImGuiFreeType). Leave as zero if you aren't using one.
float RasterizerMultiply; // 1.0f // Brighten (>1.0f) or darken (<1.0f) font output. Brightening small fonts may be a good workaround to make them more readable.
+ ImWchar EllipsisChar; // -1 // Explicitly specify unicode codepoint of ellipsis character. When fonts are being merged first specified ellipsis will be used.
// [Internal]
char Name[40]; // Name (strictly to ease debugging)
@@ -1801,6 +2075,35 @@ struct ImFontGlyph
float U0, V0, U1, V1; // Texture coordinates
};
+// Helper to build glyph ranges from text/string data. Feed your application strings/characters to it then call BuildRanges().
+// This is essentially a tightly packed of vector of 64k booleans = 8KB storage.
+struct ImFontGlyphRangesBuilder
+{
+ ImVector<ImU32> UsedChars; // Store 1-bit per Unicode code point (0=unused, 1=used)
+
+ ImFontGlyphRangesBuilder() { Clear(); }
+ inline void Clear() { int size_in_bytes = (IM_UNICODE_CODEPOINT_MAX+1) / 8; UsedChars.resize(size_in_bytes / (int)sizeof(ImU32)); memset(UsedChars.Data, 0, (size_t)size_in_bytes); }
+ inline bool GetBit(int n) const { int off = (n >> 5); ImU32 mask = 1u << (n & 31); return (UsedChars[off] & mask) != 0; } // Get bit n in the array
+ inline void SetBit(int n) { int off = (n >> 5); ImU32 mask = 1u << (n & 31); UsedChars[off] |= mask; } // Set bit n in the array
+ inline void AddChar(ImWchar c) { SetBit(c); } // Add character
+ IMGUI_API void AddText(const char* text, const char* text_end = NULL); // Add string (each character of the UTF-8 string are added)
+ IMGUI_API void AddRanges(const ImWchar* ranges); // Add ranges, e.g. builder.AddRanges(ImFontAtlas::GetGlyphRangesDefault()) to force add all of ASCII/Latin+Ext
+ IMGUI_API void BuildRanges(ImVector<ImWchar>* out_ranges); // Output new ranges
+};
+
+// See ImFontAtlas::AddCustomRectXXX functions.
+struct ImFontAtlasCustomRect
+{
+ unsigned int ID; // Input // User ID. Use < 0x110000 to map into a font glyph, >= 0x110000 for other/internal/custom texture data.
+ unsigned short Width, Height; // Input // Desired rectangle dimension
+ unsigned short X, Y; // Output // Packed position in Atlas
+ float GlyphAdvanceX; // Input // For custom font glyphs only (ID < 0x110000): glyph xadvance
+ ImVec2 GlyphOffset; // Input // For custom font glyphs only (ID < 0x110000): glyph display offset
+ ImFont* Font; // Input // For custom font glyphs only (ID < 0x110000): target font
+ ImFontAtlasCustomRect() { ID = 0xFFFFFFFF; Width = Height = 0; X = Y = 0xFFFF; GlyphAdvanceX = 0.0f; GlyphOffset = ImVec2(0,0); Font = NULL; }
+ bool IsPacked() const { return X != 0xFFFF; }
+};
+
enum ImFontAtlasFlags_
{
ImFontAtlasFlags_None = 0,
@@ -1816,13 +2119,13 @@ enum ImFontAtlasFlags_
// - Optionally, call any of the AddFont*** functions. If you don't call any, the default font embedded in the code will be loaded for you.
// - Call GetTexDataAsAlpha8() or GetTexDataAsRGBA32() to build and retrieve pixels data.
// - Upload the pixels data into a texture within your graphics system (see imgui_impl_xxxx.cpp examples)
-// - Call SetTexID(my_tex_id); and pass the pointer/identifier to your texture in a format natural to your graphics API.
+// - Call SetTexID(my_tex_id); and pass the pointer/identifier to your texture in a format natural to your graphics API.
// This value will be passed back to you during rendering to identify the texture. Read FAQ entry about ImTextureID for more details.
// Common pitfalls:
-// - If you pass a 'glyph_ranges' array to AddFont*** functions, you need to make sure that your array persist up until the
+// - If you pass a 'glyph_ranges' array to AddFont*** functions, you need to make sure that your array persist up until the
// atlas is build (when calling GetTexData*** or Build()). We only copy the pointer, not the data.
// - Important: By default, AddFontFromMemoryTTF() takes ownership of the data. Even though we are not writing to it, we will free the pointer on destruction.
-// You can set font_cfg->FontDataOwnedByAtlas=false to keep ownership of your data and it won't be freed,
+// You can set font_cfg->FontDataOwnedByAtlas=false to keep ownership of your data and it won't be freed,
// - Even though many functions are suffixed with "TTF", OTF data is supported just as well.
// - This is an old API and it is currently awkward for those and and various other reasons! We will address them in the future!
struct ImFontAtlas
@@ -1843,12 +2146,12 @@ struct ImFontAtlas
// Build atlas, retrieve pixel data.
// User is in charge of copying the pixels into graphics memory (e.g. create a texture with your engine). Then store your texture handle with SetTexID().
// The pitch is always = Width * BytesPerPixels (1 or 4)
- // Building in RGBA32 format is provided for convenience and compatibility, but note that unless you manually manipulate or copy color data into
+ // Building in RGBA32 format is provided for convenience and compatibility, but note that unless you manually manipulate or copy color data into
// the texture (e.g. when using the AddCustomRect*** api), then the RGB pixels emitted will always be white (~75% of memory/bandwidth waste.
IMGUI_API bool Build(); // Build pixels data. This is called automatically for you by the GetTexData*** functions.
- IMGUI_API bool IsBuilt() { return Fonts.Size > 0 && (TexPixelsAlpha8 != NULL || TexPixelsRGBA32 != NULL); }
IMGUI_API void GetTexDataAsAlpha8(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL); // 1 byte per-pixel
IMGUI_API void GetTexDataAsRGBA32(unsigned char** out_pixels, int* out_width, int* out_height, int* out_bytes_per_pixel = NULL); // 4 bytes-per-pixel
+ bool IsBuilt() const { return Fonts.Size > 0 && (TexPixelsAlpha8 != NULL || TexPixelsRGBA32 != NULL); }
void SetTexID(ImTextureID id) { TexID = id; }
//-------------------------------------------
@@ -1857,7 +2160,7 @@ struct ImFontAtlas
// Helpers to retrieve list of common Unicode ranges (2 value per range, values are inclusive, zero-terminated list)
// NB: Make sure that your string are UTF-8 and NOT in your local code page. In C++11, you can create UTF-8 string literal using the u8"Hello world" syntax. See FAQ for details.
- // NB: Consider using GlyphRangesBuilder to build glyph ranges from textual data.
+ // NB: Consider using ImFontGlyphRangesBuilder to build glyph ranges from textual data.
IMGUI_API const ImWchar* GetGlyphRangesDefault(); // Basic Latin, Extended Latin
IMGUI_API const ImWchar* GetGlyphRangesKorean(); // Default + Korean characters
IMGUI_API const ImWchar* GetGlyphRangesJapanese(); // Default + Hiragana, Katakana, Half-Width, Selection of 1946 Ideographs
@@ -1865,45 +2168,24 @@ struct ImFontAtlas
IMGUI_API const ImWchar* GetGlyphRangesChineseSimplifiedCommon();// Default + Half-Width + Japanese Hiragana/Katakana + set of 2500 CJK Unified Ideographs for common simplified Chinese
IMGUI_API const ImWchar* GetGlyphRangesCyrillic(); // Default + about 400 Cyrillic characters
IMGUI_API const ImWchar* GetGlyphRangesThai(); // Default + Thai characters
-
- // Helpers to build glyph ranges from text data. Feed your application strings/characters to it then call BuildRanges().
- struct GlyphRangesBuilder
- {
- ImVector<unsigned char> UsedChars; // Store 1-bit per Unicode code point (0=unused, 1=used)
- GlyphRangesBuilder() { UsedChars.resize(0x10000 / 8); memset(UsedChars.Data, 0, 0x10000 / 8); }
- bool GetBit(int n) const { return (UsedChars[n >> 3] & (1 << (n & 7))) != 0; }
- void SetBit(int n) { UsedChars[n >> 3] |= 1 << (n & 7); } // Set bit 'c' in the array
- void AddChar(ImWchar c) { SetBit(c); } // Add character
- IMGUI_API void AddText(const char* text, const char* text_end = NULL); // Add string (each character of the UTF-8 string are added)
- IMGUI_API void AddRanges(const ImWchar* ranges); // Add ranges, e.g. builder.AddRanges(ImFontAtlas::GetGlyphRangesDefault()) to force add all of ASCII/Latin+Ext
- IMGUI_API void BuildRanges(ImVector<ImWchar>* out_ranges); // Output new ranges
- };
+ IMGUI_API const ImWchar* GetGlyphRangesVietnamese(); // Default + Vietnamese characters
//-------------------------------------------
- // Custom Rectangles/Glyphs API
+ // [BETA] Custom Rectangles/Glyphs API
//-------------------------------------------
- // You can request arbitrary rectangles to be packed into the atlas, for your own purposes. After calling Build(), you can query the rectangle position and render your pixels.
- // You can also request your rectangles to be mapped as font glyph (given a font + Unicode point), so you can render e.g. custom colorful icons and use them as regular glyphs.
- struct CustomRect
- {
- unsigned int ID; // Input // User ID. Use <0x10000 to map into a font glyph, >=0x10000 for other/internal/custom texture data.
- unsigned short Width, Height; // Input // Desired rectangle dimension
- unsigned short X, Y; // Output // Packed position in Atlas
- float GlyphAdvanceX; // Input // For custom font glyphs only (ID<0x10000): glyph xadvance
- ImVec2 GlyphOffset; // Input // For custom font glyphs only (ID<0x10000): glyph display offset
- ImFont* Font; // Input // For custom font glyphs only (ID<0x10000): target font
- CustomRect() { ID = 0xFFFFFFFF; Width = Height = 0; X = Y = 0xFFFF; GlyphAdvanceX = 0.0f; GlyphOffset = ImVec2(0,0); Font = NULL; }
- bool IsPacked() const { return X != 0xFFFF; }
- };
-
- IMGUI_API int AddCustomRectRegular(unsigned int id, int width, int height); // Id needs to be >= 0x10000. Id >= 0x80000000 are reserved for ImGui and ImDrawList
- IMGUI_API int AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int height, float advance_x, const ImVec2& offset = ImVec2(0,0)); // Id needs to be < 0x10000 to register a rectangle to map into a specific font.
- const CustomRect* GetCustomRectByIndex(int index) const { if (index < 0) return NULL; return &CustomRects[index]; }
+ // You can request arbitrary rectangles to be packed into the atlas, for your own purposes.
+ // After calling Build(), you can query the rectangle position and render your pixels.
+ // You can also request your rectangles to be mapped as font glyph (given a font + Unicode point),
+ // so you can render e.g. custom colorful icons and use them as regular glyphs.
+ // Read docs/FONTS.txt for more details about using colorful icons.
+ IMGUI_API int AddCustomRectRegular(unsigned int id, int width, int height); // Id needs to be >= 0x110000. Id >= 0x80000000 are reserved for ImGui and ImDrawList
+ IMGUI_API int AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int height, float advance_x, const ImVec2& offset = ImVec2(0,0)); // Id needs to be < 0x110000 to register a rectangle to map into a specific font.
+ const ImFontAtlasCustomRect*GetCustomRectByIndex(int index) const { if (index < 0) return NULL; return &CustomRects[index]; }
// [Internal]
- IMGUI_API void CalcCustomRectUV(const CustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max);
- IMGUI_API bool GetMouseCursorTexData(ImGuiMouseCursor cursor, ImVec2* out_offset, ImVec2* out_size, ImVec2 out_uv_border[2], ImVec2 out_uv_fill[2]);
+ IMGUI_API void CalcCustomRectUV(const ImFontAtlasCustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max) const;
+ IMGUI_API bool GetMouseCursorTexData(ImGuiMouseCursor cursor, ImVec2* out_offset, ImVec2* out_size, ImVec2 out_uv_border[2], ImVec2 out_uv_fill[2]);
//-------------------------------------------
// Members
@@ -1913,7 +2195,7 @@ struct ImFontAtlas
ImFontAtlasFlags Flags; // Build flags (see ImFontAtlasFlags_)
ImTextureID TexID; // User data to refer to the texture once it has been uploaded to user's graphic systems. It is passed back to you during rendering via the ImDrawCmd structure.
int TexDesiredWidth; // Texture width desired by user before Build(). Must be a power-of-two. If have many glyphs your graphics API have texture size restrictions you may want to increase texture width to decrease height.
- int TexGlyphPadding; // Padding between glyphs within texture in pixels. Defaults to 1.
+ int TexGlyphPadding; // Padding between glyphs within texture in pixels. Defaults to 1. If your rendering method doesn't rely on bilinear filtering you may set this to 0.
// [Internal]
// NB: Access texture data via GetTexData*() calls! Which will setup a default font for you.
@@ -1924,42 +2206,47 @@ struct ImFontAtlas
ImVec2 TexUvScale; // = (1.0f/TexWidth, 1.0f/TexHeight)
ImVec2 TexUvWhitePixel; // Texture coordinates to a white pixel
ImVector<ImFont*> Fonts; // Hold all the fonts returned by AddFont*. Fonts[0] is the default font upon calling ImGui::NewFrame(), use ImGui::PushFont()/PopFont() to change the current font.
- ImVector<CustomRect> CustomRects; // Rectangles for packing custom texture data into the atlas.
+ ImVector<ImFontAtlasCustomRect> CustomRects; // Rectangles for packing custom texture data into the atlas.
ImVector<ImFontConfig> ConfigData; // Internal data
int CustomRectIds[1]; // Identifiers of custom texture rectangle used by ImFontAtlas/ImDrawList
+
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+ typedef ImFontAtlasCustomRect CustomRect; // OBSOLETED in 1.72+
+ typedef ImFontGlyphRangesBuilder GlyphRangesBuilder; // OBSOLETED in 1.67+
+#endif
};
// Font runtime data and rendering
// ImFontAtlas automatically loads a default embedded font for you when you call GetTexDataAsAlpha8() or GetTexDataAsRGBA32().
struct ImFont
{
- // Members: Hot ~62/78 bytes
- float FontSize; // <user set> // Height of characters, set during loading (don't change after loading)
- float Scale; // = 1.f // Base font scale, multiplied by the per-window font scale which you can adjust with SetFontScale()
- ImVec2 DisplayOffset; // = (0.f,0.f) // Offset font rendering by xx pixels
- ImVector<ImFontGlyph> Glyphs; // // All glyphs.
- ImVector<float> IndexAdvanceX; // // Sparse. Glyphs->AdvanceX in a directly indexable way (more cache-friendly, for CalcTextSize functions which are often bottleneck in large UI).
- ImVector<ImWchar> IndexLookup; // // Sparse. Index glyphs by Unicode code-point.
- const ImFontGlyph* FallbackGlyph; // == FindGlyph(FontFallbackChar)
- float FallbackAdvanceX; // == FallbackGlyph->AdvanceX
- ImWchar FallbackChar; // = '?' // Replacement glyph if one isn't found. Only set via SetFallbackChar()
-
- // Members: Cold ~18/26 bytes
- short ConfigDataCount; // ~ 1 // Number of ImFontConfig involved in creating this font. Bigger than 1 when merging multiple font sources into one ImFont.
- ImFontConfig* ConfigData; // // Pointer within ContainerAtlas->ConfigData
- ImFontAtlas* ContainerAtlas; // // What we has been loaded into
- float Ascent, Descent; // // Ascent: distance from top to bottom of e.g. 'A' [0..FontSize]
- bool DirtyLookupTables;
- int MetricsTotalSurface;// // Total surface in pixels to get an idea of the font rasterization/texture cost (not exact, we approximate the cost of padding between glyphs)
+ // Members: Hot ~20/24 bytes (for CalcTextSize)
+ ImVector<float> IndexAdvanceX; // 12-16 // out // // Sparse. Glyphs->AdvanceX in a directly indexable way (cache-friendly for CalcTextSize functions which only this this info, and are often bottleneck in large UI).
+ float FallbackAdvanceX; // 4 // out // = FallbackGlyph->AdvanceX
+ float FontSize; // 4 // in // // Height of characters/line, set during loading (don't change after loading)
+
+ // Members: Hot ~36/48 bytes (for CalcTextSize + render loop)
+ ImVector<ImWchar> IndexLookup; // 12-16 // out // // Sparse. Index glyphs by Unicode code-point.
+ ImVector<ImFontGlyph> Glyphs; // 12-16 // out // // All glyphs.
+ const ImFontGlyph* FallbackGlyph; // 4-8 // out // = FindGlyph(FontFallbackChar)
+ ImVec2 DisplayOffset; // 8 // in // = (0,0) // Offset font rendering by xx pixels
+
+ // Members: Cold ~32/40 bytes
+ ImFontAtlas* ContainerAtlas; // 4-8 // out // // What we has been loaded into
+ const ImFontConfig* ConfigData; // 4-8 // in // // Pointer within ContainerAtlas->ConfigData
+ short ConfigDataCount; // 2 // in // ~ 1 // Number of ImFontConfig involved in creating this font. Bigger than 1 when merging multiple font sources into one ImFont.
+ ImWchar FallbackChar; // 2 // in // = '?' // Replacement character if a glyph isn't found. Only set via SetFallbackChar()
+ ImWchar EllipsisChar; // 2 // out // = -1 // Character used for ellipsis rendering.
+ bool DirtyLookupTables; // 1 // out //
+ float Scale; // 4 // in // = 1.f // Base font scale, multiplied by the per-window font scale which you can adjust with SetWindowFontScale()
+ float Ascent, Descent; // 4+4 // out // // Ascent: distance from top to bottom of e.g. 'A' [0..FontSize]
+ int MetricsTotalSurface;// 4 // out // // Total surface in pixels to get an idea of the font rasterization/texture cost (not exact, we approximate the cost of padding between glyphs)
// Methods
IMGUI_API ImFont();
IMGUI_API ~ImFont();
- IMGUI_API void ClearOutputData();
- IMGUI_API void BuildLookupTable();
IMGUI_API const ImFontGlyph*FindGlyph(ImWchar c) const;
IMGUI_API const ImFontGlyph*FindGlyphNoFallback(ImWchar c) const;
- IMGUI_API void SetFallbackChar(ImWchar c);
float GetCharAdvance(ImWchar c) const { return ((int)c < IndexAdvanceX.Size) ? IndexAdvanceX[(int)c] : FallbackAdvanceX; }
bool IsLoaded() const { return ContainerAtlas != NULL; }
const char* GetDebugName() const { return ConfigData ? ConfigData->Name : "<unknown>"; }
@@ -1971,19 +2258,18 @@ struct ImFont
IMGUI_API void RenderChar(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, ImWchar c) const;
IMGUI_API void RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width = 0.0f, bool cpu_fine_clip = false) const;
- // [Internal]
+ // [Internal] Don't use!
+ IMGUI_API void BuildLookupTable();
+ IMGUI_API void ClearOutputData();
IMGUI_API void GrowIndex(int new_size);
IMGUI_API void AddGlyph(ImWchar c, float x0, float y0, float x1, float y1, float u0, float v0, float u1, float v1, float advance_x);
IMGUI_API void AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst = true); // Makes 'dst' character/glyph points to 'src' character/glyph. Currently needs to be called AFTER fonts have been built.
-
-#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
- typedef ImFontGlyph Glyph; // OBSOLETE 1.52+
-#endif
+ IMGUI_API void SetFallbackChar(ImWchar c);
};
#if defined(__clang__)
#pragma clang diagnostic pop
-#elif defined(__GNUC__) && __GNUC__ >= 8
+#elif defined(__GNUC__)
#pragma GCC diagnostic pop
#endif
@@ -1991,3 +2277,5 @@ struct ImFont
#ifdef IMGUI_INCLUDE_IMGUI_USER_H
#include "imgui_user.h"
#endif
+
+#endif // #ifndef IMGUI_DISABLE
diff --git a/src/imgui/imgui_demo.cpp b/src/imgui/imgui_demo.cpp
index 3173ab858..7664f1b4b 100644
--- a/src/imgui/imgui_demo.cpp
+++ b/src/imgui/imgui_demo.cpp
@@ -1,25 +1,41 @@
-// dear imgui, v1.66 WIP
+// dear imgui, v1.75
// (demo code)
+// Help:
+// - Read FAQ at http://dearimgui.org/faq
+// - Newcomers, read 'Programmer guide' in imgui.cpp for notes on how to setup Dear ImGui in your codebase.
+// - Call and read ImGui::ShowDemoWindow() in imgui_demo.cpp for demo code. All applications in examples/ are doing that.
+// Read imgui.cpp for more details, documentation and comments.
+// Get latest version at https://github.com/ocornut/imgui
+
// Message to the person tempted to delete this file when integrating Dear ImGui into their code base:
// Do NOT remove this file from your project! Think again! It is the most useful reference code that you and other coders
-// will want to refer to and call. Have the ImGui::ShowDemoWindow() function wired in an always-available debug menu of
-// your game/app! Removing this file from your project is hindering access to documentation for everyone in your team,
+// will want to refer to and call. Have the ImGui::ShowDemoWindow() function wired in an always-available debug menu of
+// your game/app! Removing this file from your project is hindering access to documentation for everyone in your team,
// likely leading you to poorer usage of the library.
// Everything in this file will be stripped out by the linker if you don't call ImGui::ShowDemoWindow().
-// If you want to link core Dear ImGui in your shipped builds but want an easy guarantee that the demo will not be linked,
+// If you want to link core Dear ImGui in your shipped builds but want a thorough guarantee that the demo will not be linked,
// you can setup your imconfig.h with #define IMGUI_DISABLE_DEMO_WINDOWS and those functions will be empty.
// In other situation, whenever you have Dear ImGui available you probably want this to be available for reference.
// Thank you,
-// -Your beloved friend, imgui_demo.cpp (that you won't delete)
+// -Your beloved friend, imgui_demo.cpp (which you won't delete)
-// Message to beginner C/C++ programmers about the meaning of the 'static' keyword:
-// In this demo code, we frequently we use 'static' variables inside functions. A static variable persist across calls, so it is
-// essentially like a global variable but declared inside the scope of the function. We do this as a way to gather code and data
+// Message to beginner C/C++ programmers about the meaning of the 'static' keyword:
+// In this demo code, we frequently we use 'static' variables inside functions. A static variable persist across calls, so it is
+// essentially like a global variable but declared inside the scope of the function. We do this as a way to gather code and data
// in the same place, to make the demo source code faster to read, faster to write, and smaller in size.
-// It also happens to be a convenient way of storing simple UI related information as long as your function doesn't need to be reentrant
-// or used in threads. This might be a pattern you will want to use in your code, but most of the real data you would be editing is
-// likely going to be stored outside your functions.
+// It also happens to be a convenient way of storing simple UI related information as long as your function doesn't need to be
+// reentrant or used in multiple threads. This might be a pattern you will want to use in your code, but most of the real data
+// you would be editing is likely going to be stored outside your functions.
+
+// The Demo code in this file is designed to be easy to copy-and-paste in into your application!
+// Because of this:
+// - We never omit the ImGui:: namespace when calling functions, even though most of our code is already in the same namespace.
+// - We try to declare static variables in the local scope, as close as possible to the code using them.
+// - We never use any of the helpers/facilities used internally by Dear ImGui, unless it has been exposed in the public API (imgui.h).
+// - We never use maths operators on ImVec2/ImVec4. For other of our sources files, they are provided by imgui_internal.h w/ IMGUI_DEFINE_MATH_OPERATORS.
+// For your own sources file they are optional and require you either enable those, either provide your own via IM_VEC2_CLASS_EXTRA in imconfig.h.
+// Because we don't want to assume anything about your support of maths operators, we don't use them in imgui_demo.cpp.
/*
@@ -27,6 +43,7 @@ Index of this file:
// [SECTION] Forward Declarations, Helpers
// [SECTION] Demo Window / ShowDemoWindow()
+// [SECTION] About Window / ShowAboutWindow()
// [SECTION] Style Editor / ShowStyleEditor()
// [SECTION] Example App: Main Menu Bar / ShowExampleAppMainMenuBar()
// [SECTION] Example App: Debug Console / ShowExampleAppConsole()
@@ -39,6 +56,7 @@ Index of this file:
// [SECTION] Example App: Simple Overlay / ShowExampleAppSimpleOverlay()
// [SECTION] Example App: Manipulating Window Titles / ShowExampleAppWindowTitles()
// [SECTION] Example App: Custom Rendering using ImDrawList API / ShowExampleAppCustomRendering()
+// [SECTION] Example App: Documents Handling / ShowExampleAppDocuments()
*/
@@ -47,7 +65,9 @@ Index of this file:
#endif
#include "imgui.h"
-#include <ctype.h> // toupper, isprint
+#ifndef IMGUI_DISABLE
+
+#include <ctype.h> // toupper
#include <limits.h> // INT_MIN, INT_MAX
#include <math.h> // sqrtf, powf, cosf, sinf, floorf, ceilf
#include <stdio.h> // vsnprintf, sscanf, printf
@@ -60,47 +80,54 @@ Index of this file:
#ifdef _MSC_VER
#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen
-#define vsnprintf _vsnprintf
#endif
-#ifdef __clang__
+#if defined(__clang__)
#pragma clang diagnostic ignored "-Wold-style-cast" // warning : use of old-style cast // yes, they are more terse.
#pragma clang diagnostic ignored "-Wdeprecated-declarations" // warning : 'xx' is deprecated: The POSIX name for this item.. // for strdup used in demo code (so user can copy & paste the code)
#pragma clang diagnostic ignored "-Wint-to-void-pointer-cast" // warning : cast to 'void *' from smaller integer type 'int'
#pragma clang diagnostic ignored "-Wformat-security" // warning : warning: format string is not a string literal
#pragma clang diagnostic ignored "-Wexit-time-destructors" // warning : declaration requires an exit-time destructor // exit-time destruction order is undefined. if MemFree() leads to users code that has been disabled before exit it might cause problems. ImGui coding style welcomes static/globals.
+#pragma clang diagnostic ignored "-Wunused-macros" // warning : warning: macro is not used // we define snprintf/vsnprintf on Windows so they are available, but not always used.
+#if __has_warning("-Wzero-as-null-pointer-constant")
+#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning : zero as null pointer constant // some standard header variations use #define NULL 0
+#endif
+#if __has_warning("-Wdouble-promotion")
+#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double.
+#endif
#if __has_warning("-Wreserved-id-macro")
#pragma clang diagnostic ignored "-Wreserved-id-macro" // warning : macro name is a reserved identifier //
#endif
#elif defined(__GNUC__)
+#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
#pragma GCC diagnostic ignored "-Wint-to-pointer-cast" // warning: cast to pointer from integer of different size
#pragma GCC diagnostic ignored "-Wformat-security" // warning : format string is not a string literal (potentially insecure)
#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function
#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value
-#if (__GNUC__ >= 6)
-#pragma GCC diagnostic ignored "-Wmisleading-indentation" // warning: this 'if' clause does not guard this statement // GCC 6.0+ only. See #883 on GitHub.
-#endif
+#pragma GCC diagnostic ignored "-Wmisleading-indentation" // [__GNUC__ >= 6] warning: this 'if' clause does not guard this statement // GCC 6.0+ only. See #883 on GitHub.
#endif
-// Play it nice with Windows users. Notepad in 2017 still doesn't display text data with Unix-style \n.
+// Play it nice with Windows users (Update: since 2018-05, Notepad finally appears to support Unix-style carriage returns!)
#ifdef _WIN32
-#define IM_NEWLINE "\r\n"
+#define IM_NEWLINE "\r\n"
#else
-#define IM_NEWLINE "\n"
+#define IM_NEWLINE "\n"
#endif
-#define IM_MAX(_A,_B) (((_A) >= (_B)) ? (_A) : (_B))
+#if defined(_MSC_VER) && !defined(snprintf)
+#define snprintf _snprintf
+#endif
+#if defined(_MSC_VER) && !defined(vsnprintf)
+#define vsnprintf _vsnprintf
+#endif
//-----------------------------------------------------------------------------
// [SECTION] Forward Declarations, Helpers
//-----------------------------------------------------------------------------
-#if !defined(IMGUI_DISABLE_OBSOLETE_FUNCTIONS) && defined(IMGUI_DISABLE_TEST_WINDOWS) && !defined(IMGUI_DISABLE_DEMO_WINDOWS) // Obsolete name since 1.53, TEST->DEMO
-#define IMGUI_DISABLE_DEMO_WINDOWS
-#endif
-
#if !defined(IMGUI_DISABLE_DEMO_WINDOWS)
// Forward Declarations
+static void ShowExampleAppDocuments(bool* p_open);
static void ShowExampleAppMainMenuBar();
static void ShowExampleAppConsole(bool* p_open);
static void ShowExampleAppLog(bool* p_open);
@@ -115,7 +142,8 @@ static void ShowExampleAppCustomRendering(bool* p_open);
static void ShowExampleMenuFile();
// Helper to display a little (?) mark which shows a tooltip when hovered.
-static void ShowHelpMarker(const char* desc)
+// In your own code you may want to display an actual icon if you are using a merged icon fonts (see docs/FONTS.txt)
+static void HelpMarker(const char* desc)
{
ImGui::TextDisabled("(?)");
if (ImGui::IsItemHovered())
@@ -131,29 +159,42 @@ static void ShowHelpMarker(const char* desc)
// Helper to display basic user controls.
void ImGui::ShowUserGuide()
{
+ ImGuiIO& io = ImGui::GetIO();
ImGui::BulletText("Double-click on title bar to collapse window.");
- ImGui::BulletText("Click and drag on lower right corner to resize window\n(double-click to auto fit window to its contents).");
- ImGui::BulletText("Click and drag on any empty space to move window.");
- ImGui::BulletText("TAB/SHIFT+TAB to cycle through keyboard editable fields.");
+ ImGui::BulletText("Click and drag on lower corner to resize window\n(double-click to auto fit window to its contents).");
ImGui::BulletText("CTRL+Click on a slider or drag box to input value as text.");
- if (ImGui::GetIO().FontAllowUserScaling)
+ ImGui::BulletText("TAB/SHIFT+TAB to cycle through keyboard editable fields.");
+ if (io.FontAllowUserScaling)
ImGui::BulletText("CTRL+Mouse Wheel to zoom window contents.");
- ImGui::BulletText("Mouse Wheel to scroll.");
- ImGui::BulletText("While editing text:\n");
+ ImGui::BulletText("While inputing text:\n");
ImGui::Indent();
- ImGui::BulletText("Hold SHIFT or use mouse to select text.");
ImGui::BulletText("CTRL+Left/Right to word jump.");
ImGui::BulletText("CTRL+A or double-click to select all.");
- ImGui::BulletText("CTRL+X,CTRL+C,CTRL+V to use clipboard.");
+ ImGui::BulletText("CTRL+X/C/V to use clipboard cut/copy/paste.");
ImGui::BulletText("CTRL+Z,CTRL+Y to undo/redo.");
ImGui::BulletText("ESCAPE to revert.");
ImGui::BulletText("You can apply arithmetic operators +,*,/ on numerical values.\nUse +- to subtract.");
ImGui::Unindent();
+ ImGui::BulletText("With keyboard navigation enabled:");
+ ImGui::Indent();
+ ImGui::BulletText("Arrow keys to navigate.");
+ ImGui::BulletText("Space to activate a widget.");
+ ImGui::BulletText("Return to input text into a widget.");
+ ImGui::BulletText("Escape to deactivate a widget, close popup, exit child window.");
+ ImGui::BulletText("Alt to jump to the menu layer of a window.");
+ ImGui::BulletText("CTRL+Tab to select a window.");
+ ImGui::Unindent();
}
//-----------------------------------------------------------------------------
// [SECTION] Demo Window / ShowDemoWindow()
//-----------------------------------------------------------------------------
+// - ShowDemoWindowWidgets()
+// - ShowDemoWindowLayout()
+// - ShowDemoWindowPopups()
+// - ShowDemoWindowColumns()
+// - ShowDemoWindowMisc()
+//-----------------------------------------------------------------------------
// We split the contents of the big ShowDemoWindow() function into smaller functions (because the link time of very large functions grow non-linearly)
static void ShowDemoWindowWidgets();
@@ -166,7 +207,10 @@ static void ShowDemoWindowMisc();
// You may execute this function to experiment with the UI and understand what it does. You may then search for keywords in the code when you are interested by a specific feature.
void ImGui::ShowDemoWindow(bool* p_open)
{
+ IM_ASSERT(ImGui::GetCurrentContext() != NULL && "Missing dear imgui context. Refer to examples app!"); // Exceptionally add an extra assert here for people confused with initial dear imgui setup
+
// Examples Apps (accessible from the "Examples" menu)
+ static bool show_app_documents = false;
static bool show_app_main_menu_bar = false;
static bool show_app_console = false;
static bool show_app_log = false;
@@ -179,6 +223,7 @@ void ImGui::ShowDemoWindow(bool* p_open)
static bool show_app_window_titles = false;
static bool show_app_custom_rendering = false;
+ if (show_app_documents) ShowExampleAppDocuments(&show_app_documents);
if (show_app_main_menu_bar) ShowExampleAppMainMenuBar();
if (show_app_console) ShowExampleAppConsole(&show_app_console);
if (show_app_log) ShowExampleAppLog(&show_app_log);
@@ -191,22 +236,14 @@ void ImGui::ShowDemoWindow(bool* p_open)
if (show_app_window_titles) ShowExampleAppWindowTitles(&show_app_window_titles);
if (show_app_custom_rendering) ShowExampleAppCustomRendering(&show_app_custom_rendering);
- // Dear ImGui Apps (accessible from the "Help" menu)
+ // Dear ImGui Apps (accessible from the "Tools" menu)
static bool show_app_metrics = false;
static bool show_app_style_editor = false;
static bool show_app_about = false;
if (show_app_metrics) { ImGui::ShowMetricsWindow(&show_app_metrics); }
if (show_app_style_editor) { ImGui::Begin("Style Editor", &show_app_style_editor); ImGui::ShowStyleEditor(); ImGui::End(); }
- if (show_app_about)
- {
- ImGui::Begin("About Dear ImGui", &show_app_about, ImGuiWindowFlags_AlwaysAutoResize);
- ImGui::Text("Dear ImGui, %s", ImGui::GetVersion());
- ImGui::Separator();
- ImGui::Text("By Omar Cornut and all dear imgui contributors.");
- ImGui::Text("Dear ImGui is licensed under the MIT License, see LICENSE for more information.");
- ImGui::End();
- }
+ if (show_app_about) { ImGui::ShowAboutWindow(&show_app_about); }
// Demonstrate the various window flags. Typically you would just use the default!
static bool no_titlebar = false;
@@ -237,19 +274,18 @@ void ImGui::ShowDemoWindow(bool* p_open)
ImGui::SetNextWindowSize(ImVec2(550, 680), ImGuiCond_FirstUseEver);
// Main body of the Demo window starts here.
- if (!ImGui::Begin("ImGui Demo", p_open, window_flags))
+ if (!ImGui::Begin("Dear ImGui Demo", p_open, window_flags))
{
// Early out if the window is collapsed, as an optimization.
ImGui::End();
return;
}
- ImGui::Text("dear imgui says hello. (%s)", IMGUI_VERSION);
// Most "big" widgets share a common width settings by default.
//ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.65f); // Use 2/3 of the space for widgets and 1/3 for labels (default)
ImGui::PushItemWidth(ImGui::GetFontSize() * -12); // Use fixed width for labels (by passing a negative value), the rest goes to widgets. We choose a width proportional to our font size.
- // Menu
+ // Menu Bar
if (ImGui::BeginMenuBar())
{
if (ImGui::BeginMenu("Menu"))
@@ -270,9 +306,10 @@ void ImGui::ShowDemoWindow(bool* p_open)
ImGui::MenuItem("Simple overlay", NULL, &show_app_simple_overlay);
ImGui::MenuItem("Manipulating window titles", NULL, &show_app_window_titles);
ImGui::MenuItem("Custom rendering", NULL, &show_app_custom_rendering);
+ ImGui::MenuItem("Documents", NULL, &show_app_documents);
ImGui::EndMenu();
}
- if (ImGui::BeginMenu("Help"))
+ if (ImGui::BeginMenu("Tools"))
{
ImGui::MenuItem("Metrics", NULL, &show_app_metrics);
ImGui::MenuItem("Style Editor", NULL, &show_app_style_editor);
@@ -282,15 +319,25 @@ void ImGui::ShowDemoWindow(bool* p_open)
ImGui::EndMenuBar();
}
+ ImGui::Text("dear imgui says hello. (%s)", IMGUI_VERSION);
ImGui::Spacing();
+
if (ImGui::CollapsingHeader("Help"))
{
+ ImGui::Text("ABOUT THIS DEMO:");
+ ImGui::BulletText("Sections below are demonstrating many aspects of the library.");
+ ImGui::BulletText("The \"Examples\" menu above leads to more demo contents.");
+ ImGui::BulletText("The \"Tools\" menu above gives access to: About Box, Style Editor,\n"
+ "and Metrics (general purpose Dear ImGui debugging tool).");
+ ImGui::Separator();
+
ImGui::Text("PROGRAMMER GUIDE:");
- ImGui::BulletText("Please see the ShowDemoWindow() code in imgui_demo.cpp. <- you are here!");
- ImGui::BulletText("Please see the comments in imgui.cpp.");
- ImGui::BulletText("Please see the examples/ in application.");
- ImGui::BulletText("Enable 'io.ConfigFlags |= NavEnableKeyboard' for keyboard controls.");
- ImGui::BulletText("Enable 'io.ConfigFlags |= NavEnableGamepad' for gamepad controls.");
+ ImGui::BulletText("See the ShowDemoWindow() code in imgui_demo.cpp. <- you are here!");
+ ImGui::BulletText("See comments in imgui.cpp.");
+ ImGui::BulletText("See example applications in the examples/ folder.");
+ ImGui::BulletText("Read the FAQ at http://www.dearimgui.org/faq/");
+ ImGui::BulletText("Set 'io.ConfigFlags |= NavEnableKeyboard' for keyboard controls.");
+ ImGui::BulletText("Set 'io.ConfigFlags |= NavEnableGamepad' for gamepad controls.");
ImGui::Separator();
ImGui::Text("USER GUIDE:");
@@ -305,9 +352,9 @@ void ImGui::ShowDemoWindow(bool* p_open)
{
ImGui::CheckboxFlags("io.ConfigFlags: NavEnableKeyboard", (unsigned int *)&io.ConfigFlags, ImGuiConfigFlags_NavEnableKeyboard);
ImGui::CheckboxFlags("io.ConfigFlags: NavEnableGamepad", (unsigned int *)&io.ConfigFlags, ImGuiConfigFlags_NavEnableGamepad);
- ImGui::SameLine(); ShowHelpMarker("Required back-end to feed in gamepad inputs in io.NavInputs[] and set io.BackendFlags |= ImGuiBackendFlags_HasGamepad.\n\nRead instructions in imgui.cpp for details.");
+ ImGui::SameLine(); HelpMarker("Required back-end to feed in gamepad inputs in io.NavInputs[] and set io.BackendFlags |= ImGuiBackendFlags_HasGamepad.\n\nRead instructions in imgui.cpp for details.");
ImGui::CheckboxFlags("io.ConfigFlags: NavEnableSetMousePos", (unsigned int *)&io.ConfigFlags, ImGuiConfigFlags_NavEnableSetMousePos);
- ImGui::SameLine(); ShowHelpMarker("Instruct navigation to move the mouse cursor. See comment for ImGuiConfigFlags_NavEnableSetMousePos.");
+ ImGui::SameLine(); HelpMarker("Instruct navigation to move the mouse cursor. See comment for ImGuiConfigFlags_NavEnableSetMousePos.");
ImGui::CheckboxFlags("io.ConfigFlags: NoMouse", (unsigned int *)&io.ConfigFlags, ImGuiConfigFlags_NoMouse);
if (io.ConfigFlags & ImGuiConfigFlags_NoMouse) // Create a way to restore this flag otherwise we could be stuck completely!
{
@@ -320,29 +367,33 @@ void ImGui::ShowDemoWindow(bool* p_open)
io.ConfigFlags &= ~ImGuiConfigFlags_NoMouse;
}
ImGui::CheckboxFlags("io.ConfigFlags: NoMouseCursorChange", (unsigned int *)&io.ConfigFlags, ImGuiConfigFlags_NoMouseCursorChange);
- ImGui::SameLine(); ShowHelpMarker("Instruct back-end to not alter mouse cursor shape and visibility.");
+ ImGui::SameLine(); HelpMarker("Instruct back-end to not alter mouse cursor shape and visibility.");
ImGui::Checkbox("io.ConfigInputTextCursorBlink", &io.ConfigInputTextCursorBlink);
- ImGui::SameLine(); ShowHelpMarker("Set to false to disable blinking cursor, for users who consider it distracting");
- ImGui::Checkbox("io.ConfigResizeWindowsFromEdges [beta]", &io.ConfigResizeWindowsFromEdges);
- ImGui::SameLine(); ShowHelpMarker("Enable resizing of windows from their edges and from the lower-left corner.\nThis requires (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) because it needs mouse cursor feedback.");
+ ImGui::SameLine(); HelpMarker("Set to false to disable blinking cursor, for users who consider it distracting");
+ ImGui::Checkbox("io.ConfigWindowsResizeFromEdges", &io.ConfigWindowsResizeFromEdges);
+ ImGui::SameLine(); HelpMarker("Enable resizing of windows from their edges and from the lower-left corner.\nThis requires (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) because it needs mouse cursor feedback.");
+ ImGui::Checkbox("io.ConfigWindowsMoveFromTitleBarOnly", &io.ConfigWindowsMoveFromTitleBarOnly);
ImGui::Checkbox("io.MouseDrawCursor", &io.MouseDrawCursor);
- ImGui::SameLine(); ShowHelpMarker("Instruct Dear ImGui to render a mouse cursor for you. Note that a mouse cursor rendered via your application GPU rendering path will feel more laggy than hardware cursor, but will be more in sync with your other visuals.\n\nSome desktop applications may use both kinds of cursors (e.g. enable software cursor only when resizing/dragging something).");
+ ImGui::SameLine(); HelpMarker("Instruct Dear ImGui to render a mouse cursor for you. Note that a mouse cursor rendered via your application GPU rendering path will feel more laggy than hardware cursor, but will be more in sync with your other visuals.\n\nSome desktop applications may use both kinds of cursors (e.g. enable software cursor only when resizing/dragging something).");
ImGui::TreePop();
ImGui::Separator();
}
if (ImGui::TreeNode("Backend Flags"))
{
- ImGuiBackendFlags backend_flags = io.BackendFlags; // Make a local copy to avoid modifying the back-end flags.
+ HelpMarker("Those flags are set by the back-ends (imgui_impl_xxx files) to specify their capabilities.\nHere we expose then as read-only fields to avoid breaking interactions with your back-end.");
+ ImGuiBackendFlags backend_flags = io.BackendFlags; // Make a local copy to avoid modifying actual back-end flags.
ImGui::CheckboxFlags("io.BackendFlags: HasGamepad", (unsigned int *)&backend_flags, ImGuiBackendFlags_HasGamepad);
ImGui::CheckboxFlags("io.BackendFlags: HasMouseCursors", (unsigned int *)&backend_flags, ImGuiBackendFlags_HasMouseCursors);
ImGui::CheckboxFlags("io.BackendFlags: HasSetMousePos", (unsigned int *)&backend_flags, ImGuiBackendFlags_HasSetMousePos);
+ ImGui::CheckboxFlags("io.BackendFlags: RendererHasVtxOffset", (unsigned int *)&backend_flags, ImGuiBackendFlags_RendererHasVtxOffset);
ImGui::TreePop();
ImGui::Separator();
}
if (ImGui::TreeNode("Style"))
{
+ HelpMarker("The same contents can be accessed in 'Tools->Style Editor' or by calling the ShowStyleEditor() function.");
ImGui::ShowStyleEditor();
ImGui::TreePop();
ImGui::Separator();
@@ -351,7 +402,7 @@ void ImGui::ShowDemoWindow(bool* p_open)
if (ImGui::TreeNode("Capture/Logging"))
{
ImGui::TextWrapped("The logging API redirects all text output so you can easily capture the content of a window or a block. Tree nodes can be automatically expanded.");
- ShowHelpMarker("Try opening any of the contents below in this window and then click one of the \"Log To\" button.");
+ HelpMarker("Try opening any of the contents below in this window and then click one of the \"Log To\" button.");
ImGui::LogButtons();
ImGui::TextWrapped("You can also call ImGui::LogText() to output directly to the log without a visual output.");
if (ImGui::Button("Copy \"Hello, world!\" to clipboard"))
@@ -416,7 +467,7 @@ static void ShowDemoWindowWidgets()
// Color buttons, demonstrate using PushID() to add unique identifier in the ID stack, and changing style.
for (int i = 0; i < 7; i++)
{
- if (i > 0)
+ if (i > 0)
ImGui::SameLine();
ImGui::PushID(i);
ImGui::PushStyleColor(ImGuiCol_Button, (ImVec4)ImColor::HSV(i/7.0f, 0.6f, 0.6f));
@@ -468,27 +519,32 @@ static void ShowDemoWindowWidgets()
const char* items[] = { "AAAA", "BBBB", "CCCC", "DDDD", "EEEE", "FFFF", "GGGG", "HHHH", "IIII", "JJJJ", "KKKK", "LLLLLLL", "MMMM", "OOOOOOO" };
static int item_current = 0;
ImGui::Combo("combo", &item_current, items, IM_ARRAYSIZE(items));
- ImGui::SameLine(); ShowHelpMarker("Refer to the \"Combo\" section below for an explanation of the full BeginCombo/EndCombo API, and demonstration of various flags.\n");
+ ImGui::SameLine(); HelpMarker("Refer to the \"Combo\" section below for an explanation of the full BeginCombo/EndCombo API, and demonstration of various flags.\n");
}
{
+ // To wire InputText() with std::string or any other custom string type,
+ // see the "Text Input > Resize Callback" section of this demo, and the misc/cpp/imgui_stdlib.h file.
static char str0[128] = "Hello, world!";
- static int i0 = 123;
ImGui::InputText("input text", str0, IM_ARRAYSIZE(str0));
- ImGui::SameLine(); ShowHelpMarker("USER:\nHold SHIFT or use mouse to select text.\n" "CTRL+Left/Right to word jump.\n" "CTRL+A or double-click to select all.\n" "CTRL+X,CTRL+C,CTRL+V clipboard.\n" "CTRL+Z,CTRL+Y undo/redo.\n" "ESCAPE to revert.\n\nPROGRAMMER:\nYou can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputText() to a dynamic string type. See misc/cpp/imgui_stdlib.h for an example (this is not demonstrated in imgui_demo.cpp).");
+ ImGui::SameLine(); HelpMarker("USER:\nHold SHIFT or use mouse to select text.\n" "CTRL+Left/Right to word jump.\n" "CTRL+A or double-click to select all.\n" "CTRL+X,CTRL+C,CTRL+V clipboard.\n" "CTRL+Z,CTRL+Y undo/redo.\n" "ESCAPE to revert.\n\nPROGRAMMER:\nYou can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputText() to a dynamic string type. See misc/cpp/imgui_stdlib.h for an example (this is not demonstrated in imgui_demo.cpp).");
+
+ static char str1[128] = "";
+ ImGui::InputTextWithHint("input text (w/ hint)", "enter text here", str1, IM_ARRAYSIZE(str1));
+ static int i0 = 123;
ImGui::InputInt("input int", &i0);
- ImGui::SameLine(); ShowHelpMarker("You can apply arithmetic operators +,*,/ on numerical values.\n e.g. [ 100 ], input \'*2\', result becomes [ 200 ]\nUse +- to subtract.\n");
+ ImGui::SameLine(); HelpMarker("You can apply arithmetic operators +,*,/ on numerical values.\n e.g. [ 100 ], input \'*2\', result becomes [ 200 ]\nUse +- to subtract.\n");
static float f0 = 0.001f;
- ImGui::InputFloat("input float", &f0, 0.01f, 1.0f);
+ ImGui::InputFloat("input float", &f0, 0.01f, 1.0f, "%.3f");
static double d0 = 999999.00000001;
ImGui::InputDouble("input double", &d0, 0.01f, 1.0f, "%.8f");
static float f1 = 1.e10f;
ImGui::InputFloat("input scientific", &f1, 0.0f, 0.0f, "%e");
- ImGui::SameLine(); ShowHelpMarker("You can input value using the scientific notation,\n e.g. \"1e+8\" becomes \"100000000\".\n");
+ ImGui::SameLine(); HelpMarker("You can input value using the scientific notation,\n e.g. \"1e+8\" becomes \"100000000\".\n");
static float vec4a[4] = { 0.10f, 0.20f, 0.30f, 0.44f };
ImGui::InputFloat3("input float3", vec4a);
@@ -497,7 +553,7 @@ static void ShowDemoWindowWidgets()
{
static int i1 = 50, i2 = 42;
ImGui::DragInt("drag int", &i1, 1);
- ImGui::SameLine(); ShowHelpMarker("Click and drag to edit value.\nHold SHIFT/ALT for faster/slower edit.\nDouble-click or CTRL+click to input value.");
+ ImGui::SameLine(); HelpMarker("Click and drag to edit value.\nHold SHIFT/ALT for faster/slower edit.\nDouble-click or CTRL+click to input value.");
ImGui::DragInt("drag int 0..100", &i2, 1, 0, 100, "%d%%");
@@ -509,20 +565,31 @@ static void ShowDemoWindowWidgets()
{
static int i1=0;
ImGui::SliderInt("slider int", &i1, -1, 3);
- ImGui::SameLine(); ShowHelpMarker("CTRL+click to input value.");
+ ImGui::SameLine(); HelpMarker("CTRL+click to input value.");
static float f1=0.123f, f2=0.0f;
ImGui::SliderFloat("slider float", &f1, 0.0f, 1.0f, "ratio = %.3f");
ImGui::SliderFloat("slider float (curve)", &f2, -10.0f, 10.0f, "%.4f", 2.0f);
+
static float angle = 0.0f;
ImGui::SliderAngle("slider angle", &angle);
+
+ // Using the format string to display a name instead of an integer.
+ // Here we completely omit '%d' from the format string, so it'll only display a name.
+ // This technique can also be used with DragInt().
+ enum Element { Element_Fire, Element_Earth, Element_Air, Element_Water, Element_COUNT };
+ const char* element_names[Element_COUNT] = { "Fire", "Earth", "Air", "Water" };
+ static int current_element = Element_Fire;
+ const char* current_element_name = (current_element >= 0 && current_element < Element_COUNT) ? element_names[current_element] : "Unknown";
+ ImGui::SliderInt("slider enum", &current_element, 0, Element_COUNT - 1, current_element_name);
+ ImGui::SameLine(); HelpMarker("Using the format string parameter to display a name instead of the underlying integer.");
}
{
static float col1[3] = { 1.0f,0.0f,0.2f };
static float col2[4] = { 0.4f,0.7f,0.0f,0.5f };
ImGui::ColorEdit3("color 1", col1);
- ImGui::SameLine(); ShowHelpMarker("Click on the colored square to open a color picker.\nClick and hold to use drag and drop.\nRight-click on the colored square to show options.\nCTRL+click on individual component to input value.\n");
+ ImGui::SameLine(); HelpMarker("Click on the colored square to open a color picker.\nClick and hold to use drag and drop.\nRight-click on the colored square to show options.\nCTRL+click on individual component to input value.\n");
ImGui::ColorEdit4("color 2", col2);
}
@@ -534,9 +601,8 @@ static void ShowDemoWindowWidgets()
ImGui::ListBox("listbox\n(single select)", &listbox_item_current, listbox_items, IM_ARRAYSIZE(listbox_items), 4);
//static int listbox_item_current2 = 2;
- //ImGui::PushItemWidth(-1);
+ //ImGui::SetNextItemWidth(-1);
//ImGui::ListBox("##listbox2", &listbox_item_current2, listbox_items, IM_ARRAYSIZE(listbox_items), 4);
- //ImGui::PopItemWidth();
}
ImGui::TreePop();
@@ -553,20 +619,32 @@ static void ShowDemoWindowWidgets()
if (ImGui::TreeNode("Basic trees"))
{
for (int i = 0; i < 5; i++)
+ {
+ // Use SetNextItemOpen() so set the default state of a node to be open.
+ // We could also use TreeNodeEx() with the ImGuiTreeNodeFlags_DefaultOpen flag to achieve the same thing!
+ if (i == 0)
+ ImGui::SetNextItemOpen(true, ImGuiCond_Once);
+
if (ImGui::TreeNode((void*)(intptr_t)i, "Child %d", i))
{
ImGui::Text("blah blah");
ImGui::SameLine();
- if (ImGui::SmallButton("button")) { };
+ if (ImGui::SmallButton("button")) {};
ImGui::TreePop();
}
+ }
ImGui::TreePop();
}
if (ImGui::TreeNode("Advanced, with Selectable nodes"))
{
- ShowHelpMarker("This is a more standard looking tree with selectable nodes.\nClick to select, CTRL+Click to toggle, click on arrows or double-click to open.");
+ HelpMarker("This is a more typical looking tree with selectable nodes.\nClick to select, CTRL+Click to toggle, click on arrows or double-click to open.");
+ static ImGuiTreeNodeFlags base_flags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_SpanAvailWidth;
static bool align_label_with_current_x_position = false;
+ ImGui::CheckboxFlags("ImGuiTreeNodeFlags_OpenOnArrow", (unsigned int*)&base_flags, ImGuiTreeNodeFlags_OpenOnArrow);
+ ImGui::CheckboxFlags("ImGuiTreeNodeFlags_OpenOnDoubleClick", (unsigned int*)&base_flags, ImGuiTreeNodeFlags_OpenOnDoubleClick);
+ ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanAvailWidth", (unsigned int*)&base_flags, ImGuiTreeNodeFlags_SpanAvailWidth);
+ ImGui::CheckboxFlags("ImGuiTreeNodeFlags_SpanFullWidth", (unsigned int*)&base_flags, ImGuiTreeNodeFlags_SpanFullWidth);
ImGui::Checkbox("Align label with current X position)", &align_label_with_current_x_position);
ImGui::Text("Hello!");
if (align_label_with_current_x_position)
@@ -574,26 +652,30 @@ static void ShowDemoWindowWidgets()
static int selection_mask = (1 << 2); // Dumb representation of what may be user-side selection state. You may carry selection state inside or outside your objects in whatever format you see fit.
int node_clicked = -1; // Temporary storage of what node we have clicked to process selection at the end of the loop. May be a pointer to your own node type, etc.
- ImGui::PushStyleVar(ImGuiStyleVar_IndentSpacing, ImGui::GetFontSize()*3); // Increase spacing to differentiate leaves from expanded contents.
for (int i = 0; i < 6; i++)
{
// Disable the default open on single-click behavior and pass in Selected flag according to our selection state.
- ImGuiTreeNodeFlags node_flags = ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick | ((selection_mask & (1 << i)) ? ImGuiTreeNodeFlags_Selected : 0);
+ ImGuiTreeNodeFlags node_flags = base_flags;
+ const bool is_selected = (selection_mask & (1 << i)) != 0;
+ if (is_selected)
+ node_flags |= ImGuiTreeNodeFlags_Selected;
if (i < 3)
{
- // Node
+ // Items 0..2 are Tree Node
bool node_open = ImGui::TreeNodeEx((void*)(intptr_t)i, node_flags, "Selectable Node %d", i);
if (ImGui::IsItemClicked())
node_clicked = i;
if (node_open)
{
- ImGui::Text("Blah blah\nBlah Blah");
+ ImGui::BulletText("Blah blah\nBlah Blah");
ImGui::TreePop();
}
}
else
{
- // Leaf: The only reason we have a TreeNode at all is to allow selection of the leaf. Otherwise we can use BulletText() or TreeAdvanceToLabelPos()+Text().
+ // Items 3..5 are Tree Leaves
+ // The only reason we use TreeNode at all is to allow selection of the leaf.
+ // Otherwise we can use BulletText() or advance the cursor by GetTreeNodeToLabelSpacing() and call Text().
node_flags |= ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen; // ImGuiTreeNodeFlags_Bullet
ImGui::TreeNodeEx((void*)(intptr_t)i, node_flags, "Selectable Leaf %d", i);
if (ImGui::IsItemClicked())
@@ -608,7 +690,6 @@ static void ShowDemoWindowWidgets()
else //if (!(selection_mask & (1 << node_clicked))) // Depending on selection behavior you want, this commented bit preserve selection when clicking on item that is part of the selection
selection_mask = (1 << node_clicked); // Click to single-select
}
- ImGui::PopStyleVar();
if (align_label_with_current_x_position)
ImGui::Indent(ImGui::GetTreeNodeToLabelSpacing());
ImGui::TreePop();
@@ -619,8 +700,8 @@ static void ShowDemoWindowWidgets()
if (ImGui::TreeNode("Collapsing Headers"))
{
static bool closable_group = true;
- ImGui::Checkbox("Enable extra group", &closable_group);
- if (ImGui::CollapsingHeader("Header"))
+ ImGui::Checkbox("Show 2nd header", &closable_group);
+ if (ImGui::CollapsingHeader("Header", ImGuiTreeNodeFlags_None))
{
ImGui::Text("IsItemHovered: %d", ImGui::IsItemHovered());
for (int i = 0; i < 5; i++)
@@ -632,6 +713,10 @@ static void ShowDemoWindowWidgets()
for (int i = 0; i < 5; i++)
ImGui::Text("More content %d", i);
}
+ /*
+ if (ImGui::CollapsingHeader("Header with a bullet", ImGuiTreeNodeFlags_Bullet))
+ ImGui::Text("IsItemHovered: %d", ImGui::IsItemHovered());
+ */
ImGui::TreePop();
}
@@ -639,6 +724,11 @@ static void ShowDemoWindowWidgets()
{
ImGui::BulletText("Bullet point 1");
ImGui::BulletText("Bullet point 2\nOn multiple lines");
+ if (ImGui::TreeNode("Tree node"))
+ {
+ ImGui::BulletText("Another bullet point");
+ ImGui::TreePop();
+ }
ImGui::Bullet(); ImGui::Text("Bullet point 3 (two calls)");
ImGui::Bullet(); ImGui::SmallButton("Button");
ImGui::TreePop();
@@ -652,7 +742,7 @@ static void ShowDemoWindowWidgets()
ImGui::TextColored(ImVec4(1.0f,0.0f,1.0f,1.0f), "Pink");
ImGui::TextColored(ImVec4(1.0f,1.0f,0.0f,1.0f), "Yellow");
ImGui::TextDisabled("Disabled");
- ImGui::SameLine(); ShowHelpMarker("The TextDisabled color is stored in ImGuiStyle.");
+ ImGui::SameLine(); HelpMarker("The TextDisabled color is stored in ImGuiStyle.");
ImGui::TreePop();
}
@@ -687,14 +777,14 @@ static void ShowDemoWindowWidgets()
if (ImGui::TreeNode("UTF-8 Text"))
{
// UTF-8 test with Japanese characters
- // (Needs a suitable font, try Noto, or Arial Unicode, or M+ fonts. Read misc/fonts/README.txt for details.)
+ // (Needs a suitable font, try Noto, or Arial Unicode, or M+ fonts. Read docs/FONTS.txt for details.)
// - From C++11 you can use the u8"my text" syntax to encode literal strings as UTF-8
// - For earlier compiler, you may be able to encode your sources as UTF-8 (e.g. Visual Studio save your file as 'UTF-8 without signature')
// - FOR THIS DEMO FILE ONLY, BECAUSE WE WANT TO SUPPORT OLD COMPILERS, WE ARE *NOT* INCLUDING RAW UTF-8 CHARACTERS IN THIS SOURCE FILE.
// Instead we are encoding a few strings with hexadecimal constants. Don't do this in your application!
// Please use u8"text in any language" in your application!
// Note that characters values are preserved even by InputText() if the font cannot be displayed, so you can safely copy & paste garbled characters into another application.
- ImGui::TextWrapped("CJK text will only appears if the font was loaded with the appropriate CJK character ranges. Call io.Font->LoadFromFileTTF() manually to load extra character ranges. Read misc/fonts/README.txt for details.");
+ ImGui::TextWrapped("CJK text will only appears if the font was loaded with the appropriate CJK character ranges. Call io.Font->AddFontFromFileTTF() manually to load extra character ranges. Read docs/FONTS.txt for details.");
ImGui::Text("Hiragana: \xe3\x81\x8b\xe3\x81\x8d\xe3\x81\x8f\xe3\x81\x91\xe3\x81\x93 (kakikukeko)"); // Normally we would use u8"blah blah" with the proper characters directly in the string.
ImGui::Text("Kanjis: \xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e (nihongo)");
static char buf[32] = "\xe6\x97\xa5\xe6\x9c\xac\xe8\xaa\x9e";
@@ -713,7 +803,7 @@ static void ShowDemoWindowWidgets()
// Here we are grabbing the font texture because that's the only one we have access to inside the demo code.
// Remember that ImTextureID is just storage for whatever you want it to be, it is essentially a value that will be passed to the render function inside the ImDrawCmd structure.
// If you use one of the default imgui_impl_XXXX.cpp renderer, they all have comments at the top of their file to specify what they expect to be stored in ImTextureID.
- // (for example, the imgui_impl_dx11.cpp renderer expect a 'ID3D11ShaderResourceView*' pointer. The imgui_impl_glfw_gl3.cpp renderer expect a GLuint OpenGL texture identifier etc.)
+ // (for example, the imgui_impl_dx11.cpp renderer expect a 'ID3D11ShaderResourceView*' pointer. The imgui_impl_opengl3.cpp renderer expect a GLuint OpenGL texture identifier etc.)
// If you decided that ImTextureID = MyEngineTexture*, then you can pass your MyEngineTexture* pointers to ImGui::Image(), and gather width/height through your own functions, etc.
// Using ShowMetricsWindow() as a "debugger" to inspect the draw data that are being passed to your render will help you debug issues if you are confused about this.
// Consider using the lower-level ImDrawList::AddImage() API, via ImGui::GetWindowDrawList()->AddImage().
@@ -723,7 +813,7 @@ static void ShowDemoWindowWidgets()
ImGui::Text("%.0fx%.0f", my_tex_w, my_tex_h);
ImVec2 pos = ImGui::GetCursorScreenPos();
- ImGui::Image(my_tex_id, ImVec2(my_tex_w, my_tex_h), ImVec2(0,0), ImVec2(1,1), ImColor(255,255,255,255), ImColor(255,255,255,128));
+ ImGui::Image(my_tex_id, ImVec2(my_tex_w, my_tex_h), ImVec2(0,0), ImVec2(1,1), ImVec4(1.0f,1.0f,1.0f,1.0f), ImVec4(1.0f,1.0f,1.0f,0.5f));
if (ImGui::IsItemHovered())
{
ImGui::BeginTooltip();
@@ -735,7 +825,7 @@ static void ShowDemoWindowWidgets()
ImGui::Text("Max: (%.2f, %.2f)", region_x + region_sz, region_y + region_sz);
ImVec2 uv0 = ImVec2((region_x) / my_tex_w, (region_y) / my_tex_h);
ImVec2 uv1 = ImVec2((region_x + region_sz) / my_tex_w, (region_y + region_sz) / my_tex_h);
- ImGui::Image(my_tex_id, ImVec2(region_sz * zoom, region_sz * zoom), uv0, uv1, ImColor(255,255,255,255), ImColor(255,255,255,128));
+ ImGui::Image(my_tex_id, ImVec2(region_sz * zoom, region_sz * zoom), uv0, uv1, ImVec4(1.0f, 1.0f, 1.0f, 1.0f), ImVec4(1.0f, 1.0f, 1.0f, 0.5f));
ImGui::EndTooltip();
}
ImGui::TextWrapped("And now some textured buttons..");
@@ -744,7 +834,7 @@ static void ShowDemoWindowWidgets()
{
ImGui::PushID(i);
int frame_padding = -1 + i; // -1 = uses default padding
- if (ImGui::ImageButton(my_tex_id, ImVec2(32,32), ImVec2(0,0), ImVec2(32.0f/my_tex_w,32/my_tex_h), frame_padding, ImColor(0,0,0,255)))
+ if (ImGui::ImageButton(my_tex_id, ImVec2(32,32), ImVec2(0,0), ImVec2(32.0f/my_tex_w,32/my_tex_h), frame_padding, ImVec4(0.0f,0.0f,0.0f,1.0f)))
pressed_count += 1;
ImGui::PopID();
ImGui::SameLine();
@@ -759,6 +849,7 @@ static void ShowDemoWindowWidgets()
// Expose flags as checkbox for the demo
static ImGuiComboFlags flags = 0;
ImGui::CheckboxFlags("ImGuiComboFlags_PopupAlignLeft", (unsigned int*)&flags, ImGuiComboFlags_PopupAlignLeft);
+ ImGui::SameLine(); HelpMarker("Only makes a difference if the popup is larger than the combo");
if (ImGui::CheckboxFlags("ImGuiComboFlags_NoArrowButton", (unsigned int*)&flags, ImGuiComboFlags_NoArrowButton))
flags &= ~ImGuiComboFlags_NoPreview; // Clear the other flag, as we cannot combine both
if (ImGui::CheckboxFlags("ImGuiComboFlags_NoPreview", (unsigned int*)&flags, ImGuiComboFlags_NoPreview))
@@ -829,7 +920,7 @@ static void ShowDemoWindowWidgets()
}
if (ImGui::TreeNode("Selection State: Multiple Selection"))
{
- ShowHelpMarker("Hold CTRL and click to select multiple items.");
+ HelpMarker("Hold CTRL and click to select multiple items.");
static bool selection[5] = { false, false, false, false, false };
for (int n = 0; n < 5; n++)
{
@@ -856,7 +947,7 @@ static void ShowDemoWindowWidgets()
if (ImGui::TreeNode("In columns"))
{
ImGui::Columns(3, NULL, false);
- static bool selected[16] = { 0 };
+ static bool selected[16] = {};
for (int i = 0; i < 16; i++)
{
char label[32]; sprintf(label, "Item %d", i);
@@ -868,67 +959,139 @@ static void ShowDemoWindowWidgets()
}
if (ImGui::TreeNode("Grid"))
{
- static bool selected[16] = { true, false, false, false, false, true, false, false, false, false, true, false, false, false, false, true };
- for (int i = 0; i < 16; i++)
+ static bool selected[4*4] = { true, false, false, false, false, true, false, false, false, false, true, false, false, false, false, true };
+ for (int i = 0; i < 4*4; i++)
{
ImGui::PushID(i);
if (ImGui::Selectable("Sailor", &selected[i], 0, ImVec2(50,50)))
{
- int x = i % 4, y = i / 4;
- if (x > 0) selected[i - 1] ^= 1;
- if (x < 3) selected[i + 1] ^= 1;
- if (y > 0) selected[i - 4] ^= 1;
- if (y < 3) selected[i + 4] ^= 1;
+ // Note: We _unnecessarily_ test for both x/y and i here only to silence some static analyzer. The second part of each test is unnecessary.
+ int x = i % 4;
+ int y = i / 4;
+ if (x > 0) { selected[i - 1] ^= 1; }
+ if (x < 3 && i < 15) { selected[i + 1] ^= 1; }
+ if (y > 0 && i > 3) { selected[i - 4] ^= 1; }
+ if (y < 3 && i < 12) { selected[i + 4] ^= 1; }
}
if ((i % 4) < 3) ImGui::SameLine();
ImGui::PopID();
}
ImGui::TreePop();
}
+ if (ImGui::TreeNode("Alignment"))
+ {
+ HelpMarker("Alignment applies when a selectable is larger than its text content.\nBy default, Selectables uses style.SelectableTextAlign but it can be overriden on a per-item basis using PushStyleVar().");
+ static bool selected[3*3] = { true, false, true, false, true, false, true, false, true };
+ for (int y = 0; y < 3; y++)
+ {
+ for (int x = 0; x < 3; x++)
+ {
+ ImVec2 alignment = ImVec2((float)x / 2.0f, (float)y / 2.0f);
+ char name[32];
+ sprintf(name, "(%.1f,%.1f)", alignment.x, alignment.y);
+ if (x > 0) ImGui::SameLine();
+ ImGui::PushStyleVar(ImGuiStyleVar_SelectableTextAlign, alignment);
+ ImGui::Selectable(name, &selected[3*y+x], ImGuiSelectableFlags_None, ImVec2(80,80));
+ ImGui::PopStyleVar();
+ }
+ }
+ ImGui::TreePop();
+ }
ImGui::TreePop();
}
- if (ImGui::TreeNode("Filtered Text Input"))
+ // To wire InputText() with std::string or any other custom string type,
+ // see the "Text Input > Resize Callback" section of this demo, and the misc/cpp/imgui_stdlib.h file.
+ if (ImGui::TreeNode("Text Input"))
{
- static char buf1[64] = ""; ImGui::InputText("default", buf1, 64);
- static char buf2[64] = ""; ImGui::InputText("decimal", buf2, 64, ImGuiInputTextFlags_CharsDecimal);
- static char buf3[64] = ""; ImGui::InputText("hexadecimal", buf3, 64, ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase);
- static char buf4[64] = ""; ImGui::InputText("uppercase", buf4, 64, ImGuiInputTextFlags_CharsUppercase);
- static char buf5[64] = ""; ImGui::InputText("no blank", buf5, 64, ImGuiInputTextFlags_CharsNoBlank);
- struct TextFilters { static int FilterImGuiLetters(ImGuiInputTextCallbackData* data) { if (data->EventChar < 256 && strchr("imgui", (char)data->EventChar)) return 0; return 1; } };
- static char buf6[64] = ""; ImGui::InputText("\"imgui\" letters", buf6, 64, ImGuiInputTextFlags_CallbackCharFilter, TextFilters::FilterImGuiLetters);
+ if (ImGui::TreeNode("Multi-line Text Input"))
+ {
+ // Note: we are using a fixed-sized buffer for simplicity here. See ImGuiInputTextFlags_CallbackResize
+ // and the code in misc/cpp/imgui_stdlib.h for how to setup InputText() for dynamically resizing strings.
+ static char text[1024 * 16] =
+ "/*\n"
+ " The Pentium F00F bug, shorthand for F0 0F C7 C8,\n"
+ " the hexadecimal encoding of one offending instruction,\n"
+ " more formally, the invalid operand with locked CMPXCHG8B\n"
+ " instruction bug, is a design flaw in the majority of\n"
+ " Intel Pentium, Pentium MMX, and Pentium OverDrive\n"
+ " processors (all in the P5 microarchitecture).\n"
+ "*/\n\n"
+ "label:\n"
+ "\tlock cmpxchg8b eax\n";
+
+ static ImGuiInputTextFlags flags = ImGuiInputTextFlags_AllowTabInput;
+ HelpMarker("You can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputTextMultiline() to a dynamic string type. See misc/cpp/imgui_stdlib.h for an example. (This is not demonstrated in imgui_demo.cpp because we don't want to include <string> in here)");
+ ImGui::CheckboxFlags("ImGuiInputTextFlags_ReadOnly", (unsigned int*)&flags, ImGuiInputTextFlags_ReadOnly);
+ ImGui::CheckboxFlags("ImGuiInputTextFlags_AllowTabInput", (unsigned int*)&flags, ImGuiInputTextFlags_AllowTabInput);
+ ImGui::CheckboxFlags("ImGuiInputTextFlags_CtrlEnterForNewLine", (unsigned int*)&flags, ImGuiInputTextFlags_CtrlEnterForNewLine);
+ ImGui::InputTextMultiline("##source", text, IM_ARRAYSIZE(text), ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 16), flags);
+ ImGui::TreePop();
+ }
- ImGui::Text("Password input");
- static char bufpass[64] = "password123";
- ImGui::InputText("password", bufpass, 64, ImGuiInputTextFlags_Password | ImGuiInputTextFlags_CharsNoBlank);
- ImGui::SameLine(); ShowHelpMarker("Display all characters as '*'.\nDisable clipboard cut and copy.\nDisable logging.\n");
- ImGui::InputText("password (clear)", bufpass, 64, ImGuiInputTextFlags_CharsNoBlank);
+ if (ImGui::TreeNode("Filtered Text Input"))
+ {
+ static char buf1[64] = ""; ImGui::InputText("default", buf1, 64);
+ static char buf2[64] = ""; ImGui::InputText("decimal", buf2, 64, ImGuiInputTextFlags_CharsDecimal);
+ static char buf3[64] = ""; ImGui::InputText("hexadecimal", buf3, 64, ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase);
+ static char buf4[64] = ""; ImGui::InputText("uppercase", buf4, 64, ImGuiInputTextFlags_CharsUppercase);
+ static char buf5[64] = ""; ImGui::InputText("no blank", buf5, 64, ImGuiInputTextFlags_CharsNoBlank);
+ struct TextFilters { static int FilterImGuiLetters(ImGuiInputTextCallbackData* data) { if (data->EventChar < 256 && strchr("imgui", (char)data->EventChar)) return 0; return 1; } };
+ static char buf6[64] = ""; ImGui::InputText("\"imgui\" letters", buf6, 64, ImGuiInputTextFlags_CallbackCharFilter, TextFilters::FilterImGuiLetters);
+
+ ImGui::Text("Password input");
+ static char bufpass[64] = "password123";
+ ImGui::InputText("password", bufpass, 64, ImGuiInputTextFlags_Password | ImGuiInputTextFlags_CharsNoBlank);
+ ImGui::SameLine(); HelpMarker("Display all characters as '*'.\nDisable clipboard cut and copy.\nDisable logging.\n");
+ ImGui::InputTextWithHint("password (w/ hint)", "<password>", bufpass, 64, ImGuiInputTextFlags_Password | ImGuiInputTextFlags_CharsNoBlank);
+ ImGui::InputText("password (clear)", bufpass, 64, ImGuiInputTextFlags_CharsNoBlank);
+ ImGui::TreePop();
+ }
- ImGui::TreePop();
- }
+ if (ImGui::TreeNode("Resize Callback"))
+ {
+ // To wire InputText() with std::string or any other custom string type,
+ // you can use the ImGuiInputTextFlags_CallbackResize flag + create a custom ImGui::InputText() wrapper using your prefered type.
+ // See misc/cpp/imgui_stdlib.h for an implementation of this using std::string.
+ HelpMarker("Demonstrate using ImGuiInputTextFlags_CallbackResize to wire your resizable string type to InputText().\n\nSee misc/cpp/imgui_stdlib.h for an implementation of this for std::string.");
+ struct Funcs
+ {
+ static int MyResizeCallback(ImGuiInputTextCallbackData* data)
+ {
+ if (data->EventFlag == ImGuiInputTextFlags_CallbackResize)
+ {
+ ImVector<char>* my_str = (ImVector<char>*)data->UserData;
+ IM_ASSERT(my_str->begin() == data->Buf);
+ my_str->resize(data->BufSize); // NB: On resizing calls, generally data->BufSize == data->BufTextLen + 1
+ data->Buf = my_str->begin();
+ }
+ return 0;
+ }
+
+ // Tip: Because ImGui:: is a namespace you would typicall add your own function into the namespace in your own source files.
+ // For example, you may add a function called ImGui::InputText(const char* label, MyString* my_str).
+ static bool MyInputTextMultiline(const char* label, ImVector<char>* my_str, const ImVec2& size = ImVec2(0, 0), ImGuiInputTextFlags flags = 0)
+ {
+ IM_ASSERT((flags & ImGuiInputTextFlags_CallbackResize) == 0);
+ return ImGui::InputTextMultiline(label, my_str->begin(), (size_t)my_str->size(), size, flags | ImGuiInputTextFlags_CallbackResize, Funcs::MyResizeCallback, (void*)my_str);
+ }
+ };
+
+ // For this demo we are using ImVector as a string container.
+ // Note that because we need to store a terminating zero character, our size/capacity are 1 more than usually reported by a typical string class.
+ static ImVector<char> my_str;
+ if (my_str.empty())
+ my_str.push_back(0);
+ Funcs::MyInputTextMultiline("##MyStr", &my_str, ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 16));
+ ImGui::Text("Data: %p\nSize: %d\nCapacity: %d", (void*)my_str.begin(), my_str.size(), my_str.capacity());
+ ImGui::TreePop();
+ }
- if (ImGui::TreeNode("Multi-line Text Input"))
- {
- static bool read_only = false;
- static char text[1024*16] =
- "/*\n"
- " The Pentium F00F bug, shorthand for F0 0F C7 C8,\n"
- " the hexadecimal encoding of one offending instruction,\n"
- " more formally, the invalid operand with locked CMPXCHG8B\n"
- " instruction bug, is a design flaw in the majority of\n"
- " Intel Pentium, Pentium MMX, and Pentium OverDrive\n"
- " processors (all in the P5 microarchitecture).\n"
- "*/\n\n"
- "label:\n"
- "\tlock cmpxchg8b eax\n";
-
- ShowHelpMarker("You can use the ImGuiInputTextFlags_CallbackResize facility if you need to wire InputTextMultiline() to a dynamic string type. See misc/cpp/imgui_stdlib.h for an example. (This is not demonstrated in imgui_demo.cpp)");
- ImGui::Checkbox("Read-only", &read_only);
- ImGuiInputTextFlags flags = ImGuiInputTextFlags_AllowTabInput | (read_only ? ImGuiInputTextFlags_ReadOnly : 0);
- ImGui::InputTextMultiline("##source", text, IM_ARRAYSIZE(text), ImVec2(-1.0f, ImGui::GetTextLineHeight() * 16), flags);
ImGui::TreePop();
}
+ // Plot/Graph widgets are currently fairly limited.
+ // Consider writing your own plotting widget, or using a third-party one (see "Wiki->Useful Widgets", or github.com/ocornut/imgui/issues/2747)
if (ImGui::TreeNode("Plots Widgets"))
{
static bool animate = true;
@@ -939,10 +1102,10 @@ static void ShowDemoWindowWidgets()
// Create a dummy array of contiguous float values to plot
// Tip: If your float aren't contiguous but part of a structure, you can pass a pointer to your first float and the sizeof() of your structure in the Stride parameter.
- static float values[90] = { 0 };
+ static float values[90] = {};
static int values_offset = 0;
static double refresh_time = 0.0;
- if (!animate || refresh_time == 0.0f)
+ if (!animate || refresh_time == 0.0)
refresh_time = ImGui::GetTime();
while (refresh_time < ImGui::GetTime()) // Create dummy data at fixed 60 hz rate for the demo
{
@@ -952,7 +1115,18 @@ static void ShowDemoWindowWidgets()
phase += 0.10f*values_offset;
refresh_time += 1.0f/60.0f;
}
- ImGui::PlotLines("Lines", values, IM_ARRAYSIZE(values), values_offset, "avg 0.0", -1.0f, 1.0f, ImVec2(0,80));
+
+ // Plots can display overlay texts
+ // (in this example, we will display an average value)
+ {
+ float average = 0.0f;
+ for (int n = 0; n < IM_ARRAYSIZE(values); n++)
+ average += values[n];
+ average /= (float)IM_ARRAYSIZE(values);
+ char overlay[32];
+ sprintf(overlay, "avg %f", average);
+ ImGui::PlotLines("Lines", values, IM_ARRAYSIZE(values), values_offset, overlay, -1.0f, 1.0f, ImVec2(0,80));
+ }
ImGui::PlotHistogram("Histogram", arr, IM_ARRAYSIZE(arr), 0, NULL, 0.0f, 1.0f, ImVec2(0,80));
// Use functions to generate output
@@ -964,7 +1138,8 @@ static void ShowDemoWindowWidgets()
};
static int func_type = 0, display_count = 70;
ImGui::Separator();
- ImGui::PushItemWidth(100); ImGui::Combo("func", &func_type, "Sin\0Saw\0"); ImGui::PopItemWidth();
+ ImGui::SetNextItemWidth(100);
+ ImGui::Combo("func", &func_type, "Sin\0Saw\0");
ImGui::SameLine();
ImGui::SliderInt("Sample count", &display_count, 1, 400);
float (*func)(void*, int) = (func_type == 0) ? Funcs::Sin : Funcs::Saw;
@@ -981,7 +1156,8 @@ static void ShowDemoWindowWidgets()
if (progress <= -0.1f) { progress = -0.1f; progress_dir *= -1.0f; }
}
- // Typically we would use ImVec2(-1.0f,0.0f) to use all available width, or ImVec2(width,0.0f) for a specified width. ImVec2(0.0f,0.0f) uses ItemWidth.
+ // Typically we would use ImVec2(-1.0f,0.0f) or ImVec2(-FLT_MIN,0.0f) to use all available width,
+ // or ImVec2(width,0.0f) for a specified width. ImVec2(0.0f,0.0f) uses ItemWidth.
ImGui::ProgressBar(progress, ImVec2(0.0f,0.0f));
ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x);
ImGui::Text("Progress Bar");
@@ -995,7 +1171,7 @@ static void ShowDemoWindowWidgets()
if (ImGui::TreeNode("Color/Picker Widgets"))
{
- static ImVec4 color = ImColor(114, 144, 154, 200);
+ static ImVec4 color = ImVec4(114.0f/255.0f, 144.0f/255.0f, 154.0f/255.0f, 200.0f/255.0f);
static bool alpha_preview = true;
static bool alpha_half_preview = false;
@@ -1005,40 +1181,42 @@ static void ShowDemoWindowWidgets()
ImGui::Checkbox("With Alpha Preview", &alpha_preview);
ImGui::Checkbox("With Half Alpha Preview", &alpha_half_preview);
ImGui::Checkbox("With Drag and Drop", &drag_and_drop);
- ImGui::Checkbox("With Options Menu", &options_menu); ImGui::SameLine(); ShowHelpMarker("Right-click on the individual color widget to show options.");
- ImGui::Checkbox("With HDR", &hdr); ImGui::SameLine(); ShowHelpMarker("Currently all this does is to lift the 0..1 limits on dragging widgets.");
- int misc_flags = (hdr ? ImGuiColorEditFlags_HDR : 0) | (drag_and_drop ? 0 : ImGuiColorEditFlags_NoDragDrop) | (alpha_half_preview ? ImGuiColorEditFlags_AlphaPreviewHalf : (alpha_preview ? ImGuiColorEditFlags_AlphaPreview : 0)) | (options_menu ? 0 : ImGuiColorEditFlags_NoOptions);
+ ImGui::Checkbox("With Options Menu", &options_menu); ImGui::SameLine(); HelpMarker("Right-click on the individual color widget to show options.");
+ ImGui::Checkbox("With HDR", &hdr); ImGui::SameLine(); HelpMarker("Currently all this does is to lift the 0..1 limits on dragging widgets.");
+ ImGuiColorEditFlags misc_flags = (hdr ? ImGuiColorEditFlags_HDR : 0) | (drag_and_drop ? 0 : ImGuiColorEditFlags_NoDragDrop) | (alpha_half_preview ? ImGuiColorEditFlags_AlphaPreviewHalf : (alpha_preview ? ImGuiColorEditFlags_AlphaPreview : 0)) | (options_menu ? 0 : ImGuiColorEditFlags_NoOptions);
ImGui::Text("Color widget:");
- ImGui::SameLine(); ShowHelpMarker("Click on the colored square to open a color picker.\nCTRL+click on individual component to input value.\n");
+ ImGui::SameLine(); HelpMarker("Click on the colored square to open a color picker.\nCTRL+click on individual component to input value.\n");
ImGui::ColorEdit3("MyColor##1", (float*)&color, misc_flags);
ImGui::Text("Color widget HSV with Alpha:");
- ImGui::ColorEdit4("MyColor##2", (float*)&color, ImGuiColorEditFlags_HSV | misc_flags);
+ ImGui::ColorEdit4("MyColor##2", (float*)&color, ImGuiColorEditFlags_DisplayHSV | misc_flags);
ImGui::Text("Color widget with Float Display:");
ImGui::ColorEdit4("MyColor##2f", (float*)&color, ImGuiColorEditFlags_Float | misc_flags);
ImGui::Text("Color button with Picker:");
- ImGui::SameLine(); ShowHelpMarker("With the ImGuiColorEditFlags_NoInputs flag you can hide all the slider/text inputs.\nWith the ImGuiColorEditFlags_NoLabel flag you can pass a non-empty label which will only be used for the tooltip and picker popup.");
+ ImGui::SameLine(); HelpMarker("With the ImGuiColorEditFlags_NoInputs flag you can hide all the slider/text inputs.\nWith the ImGuiColorEditFlags_NoLabel flag you can pass a non-empty label which will only be used for the tooltip and picker popup.");
ImGui::ColorEdit4("MyColor##3", (float*)&color, ImGuiColorEditFlags_NoInputs | ImGuiColorEditFlags_NoLabel | misc_flags);
ImGui::Text("Color button with Custom Picker Popup:");
- // Generate a dummy palette
- static bool saved_palette_inited = false;
- static ImVec4 saved_palette[32];
- if (!saved_palette_inited)
+ // Generate a dummy default palette. The palette will persist and can be edited.
+ static bool saved_palette_init = true;
+ static ImVec4 saved_palette[32] = {};
+ if (saved_palette_init)
+ {
for (int n = 0; n < IM_ARRAYSIZE(saved_palette); n++)
{
ImGui::ColorConvertHSVtoRGB(n / 31.0f, 0.8f, 0.8f, saved_palette[n].x, saved_palette[n].y, saved_palette[n].z);
saved_palette[n].w = 1.0f; // Alpha
}
- saved_palette_inited = true;
+ saved_palette_init = false;
+ }
static ImVec4 backup_color;
bool open_popup = ImGui::ColorButton("MyColor##3b", color, misc_flags);
- ImGui::SameLine();
+ ImGui::SameLine(0, ImGui::GetStyle().ItemInnerSpacing.x);
open_popup |= ImGui::Button("Palette");
if (open_popup)
{
@@ -1047,12 +1225,12 @@ static void ShowDemoWindowWidgets()
}
if (ImGui::BeginPopup("mypicker"))
{
- // FIXME: Adding a drag and drop example here would be perfect!
ImGui::Text("MY CUSTOM COLOR PICKER WITH AN AMAZING PALETTE!");
ImGui::Separator();
ImGui::ColorPicker4("##picker", (float*)&color, misc_flags | ImGuiColorEditFlags_NoSidePreview | ImGuiColorEditFlags_NoSmallPreview);
ImGui::SameLine();
- ImGui::BeginGroup();
+
+ ImGui::BeginGroup(); // Lock X position
ImGui::Text("Current");
ImGui::ColorButton("##current", color, ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_AlphaPreviewHalf, ImVec2(60,40));
ImGui::Text("Previous");
@@ -1068,6 +1246,8 @@ static void ShowDemoWindowWidgets()
if (ImGui::ColorButton("##palette", saved_palette[n], ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoPicker | ImGuiColorEditFlags_NoTooltip, ImVec2(20,20)))
color = ImVec4(saved_palette[n].x, saved_palette[n].y, saved_palette[n].z, color.w); // Preserve alpha!
+ // Allow user to drop colors into each palette entry
+ // (Note that ColorButton is already a drag source by default, unless using ImGuiColorEditFlags_NoDragDrop)
if (ImGui::BeginDragDropTarget())
{
if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F))
@@ -1092,7 +1272,7 @@ static void ShowDemoWindowWidgets()
static bool side_preview = true;
static bool ref_color = false;
static ImVec4 ref_color_v(1.0f,0.0f,1.0f,0.5f);
- static int inputs_mode = 2;
+ static int display_mode = 0;
static int picker_mode = 0;
ImGui::Checkbox("With Alpha", &alpha);
ImGui::Checkbox("With Alpha Bar", &alpha_bar);
@@ -1107,28 +1287,39 @@ static void ShowDemoWindowWidgets()
ImGui::ColorEdit4("##RefColor", &ref_color_v.x, ImGuiColorEditFlags_NoInputs | misc_flags);
}
}
- ImGui::Combo("Inputs Mode", &inputs_mode, "All Inputs\0No Inputs\0RGB Input\0HSV Input\0HEX Input\0");
+ ImGui::Combo("Display Mode", &display_mode, "Auto/Current\0None\0RGB Only\0HSV Only\0Hex Only\0");
+ ImGui::SameLine(); HelpMarker("ColorEdit defaults to displaying RGB inputs if you don't specify a display mode, but the user can change it with a right-click.\n\nColorPicker defaults to displaying RGB+HSV+Hex if you don't specify a display mode.\n\nYou can change the defaults using SetColorEditOptions().");
ImGui::Combo("Picker Mode", &picker_mode, "Auto/Current\0Hue bar + SV rect\0Hue wheel + SV triangle\0");
- ImGui::SameLine(); ShowHelpMarker("User can right-click the picker to change mode.");
+ ImGui::SameLine(); HelpMarker("User can right-click the picker to change mode.");
ImGuiColorEditFlags flags = misc_flags;
- if (!alpha) flags |= ImGuiColorEditFlags_NoAlpha; // This is by default if you call ColorPicker3() instead of ColorPicker4()
- if (alpha_bar) flags |= ImGuiColorEditFlags_AlphaBar;
- if (!side_preview) flags |= ImGuiColorEditFlags_NoSidePreview;
- if (picker_mode == 1) flags |= ImGuiColorEditFlags_PickerHueBar;
- if (picker_mode == 2) flags |= ImGuiColorEditFlags_PickerHueWheel;
- if (inputs_mode == 1) flags |= ImGuiColorEditFlags_NoInputs;
- if (inputs_mode == 2) flags |= ImGuiColorEditFlags_RGB;
- if (inputs_mode == 3) flags |= ImGuiColorEditFlags_HSV;
- if (inputs_mode == 4) flags |= ImGuiColorEditFlags_HEX;
+ if (!alpha) flags |= ImGuiColorEditFlags_NoAlpha; // This is by default if you call ColorPicker3() instead of ColorPicker4()
+ if (alpha_bar) flags |= ImGuiColorEditFlags_AlphaBar;
+ if (!side_preview) flags |= ImGuiColorEditFlags_NoSidePreview;
+ if (picker_mode == 1) flags |= ImGuiColorEditFlags_PickerHueBar;
+ if (picker_mode == 2) flags |= ImGuiColorEditFlags_PickerHueWheel;
+ if (display_mode == 1) flags |= ImGuiColorEditFlags_NoInputs; // Disable all RGB/HSV/Hex displays
+ if (display_mode == 2) flags |= ImGuiColorEditFlags_DisplayRGB; // Override display mode
+ if (display_mode == 3) flags |= ImGuiColorEditFlags_DisplayHSV;
+ if (display_mode == 4) flags |= ImGuiColorEditFlags_DisplayHex;
ImGui::ColorPicker4("MyColor##4", (float*)&color, flags, ref_color ? &ref_color_v.x : NULL);
ImGui::Text("Programmatically set defaults:");
- ImGui::SameLine(); ShowHelpMarker("SetColorEditOptions() is designed to allow you to set boot-time default.\nWe don't have Push/Pop functions because you can force options on a per-widget basis if needed, and the user can change non-forced ones with the options menu.\nWe don't have a getter to avoid encouraging you to persistently save values that aren't forward-compatible.");
+ ImGui::SameLine(); HelpMarker("SetColorEditOptions() is designed to allow you to set boot-time default.\nWe don't have Push/Pop functions because you can force options on a per-widget basis if needed, and the user can change non-forced ones with the options menu.\nWe don't have a getter to avoid encouraging you to persistently save values that aren't forward-compatible.");
if (ImGui::Button("Default: Uint8 + HSV + Hue Bar"))
- ImGui::SetColorEditOptions(ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_HSV | ImGuiColorEditFlags_PickerHueBar);
+ ImGui::SetColorEditOptions(ImGuiColorEditFlags_Uint8 | ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_PickerHueBar);
if (ImGui::Button("Default: Float + HDR + Hue Wheel"))
ImGui::SetColorEditOptions(ImGuiColorEditFlags_Float | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_PickerHueWheel);
+ // HSV encoded support (to avoid RGB<>HSV round trips and singularities when S==0 or V==0)
+ static ImVec4 color_stored_as_hsv(0.23f, 1.0f, 1.0f, 1.0f);
+ ImGui::Spacing();
+ ImGui::Text("HSV encoded colors");
+ ImGui::SameLine(); HelpMarker("By default, colors are given to ColorEdit and ColorPicker in RGB, but ImGuiColorEditFlags_InputHSV allows you to store colors as HSV and pass them to ColorEdit and ColorPicker as HSV. This comes with the added benefit that you can manipulate hue values with the picker even when saturation or value are zero.");
+ ImGui::Text("Color widget with InputHSV:");
+ ImGui::ColorEdit4("HSV shown as RGB##1", (float*)&color_stored_as_hsv, ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_InputHSV | ImGuiColorEditFlags_Float);
+ ImGui::ColorEdit4("HSV shown as HSV##1", (float*)&color_stored_as_hsv, ImGuiColorEditFlags_DisplayHSV | ImGuiColorEditFlags_InputHSV | ImGuiColorEditFlags_Float);
+ ImGui::DragFloat4("Raw HSV values", (float*)&color_stored_as_hsv, 0.01f, 0.0f, 1.0f);
+
ImGui::TreePop();
}
@@ -1144,15 +1335,15 @@ static void ShowDemoWindowWidgets()
if (ImGui::TreeNode("Data Types"))
{
// The DragScalar/InputScalar/SliderScalar functions allow various data types: signed/unsigned int/long long and float/double
- // To avoid polluting the public API with all possible combinations, we use the ImGuiDataType enum to pass the type,
- // and passing all arguments by address.
+ // To avoid polluting the public API with all possible combinations, we use the ImGuiDataType enum to pass the type,
+ // and passing all arguments by address.
// This is the reason the test code below creates local variables to hold "zero" "one" etc. for each types.
- // In practice, if you frequently use a given type that is not covered by the normal API entry points, you can wrap it
- // yourself inside a 1 line function which can take typed argument as value instead of void*, and then pass their address
+ // In practice, if you frequently use a given type that is not covered by the normal API entry points, you can wrap it
+ // yourself inside a 1 line function which can take typed argument as value instead of void*, and then pass their address
// to the generic function. For example:
- // bool MySliderU64(const char *label, u64* value, u64 min = 0, u64 max = 0, const char* format = "%lld")
- // {
- // return SliderScalar(label, ImGuiDataType_U64, value, &min, &max, format);
+ // bool MySliderU64(const char *label, u64* value, u64 min = 0, u64 max = 0, const char* format = "%lld")
+ // {
+ // return SliderScalar(label, ImGuiDataType_U64, value, &min, &max, format);
// }
// Limits (as helper variables that we can take the address of)
@@ -1162,6 +1353,10 @@ static void ShowDemoWindowWidgets()
ImS64 LLONG_MAX = 9223372036854775807LL;
ImU64 ULLONG_MAX = (2ULL * 9223372036854775807LL + 1);
#endif
+ const char s8_zero = 0, s8_one = 1, s8_fifty = 50, s8_min = -128, s8_max = 127;
+ const ImU8 u8_zero = 0, u8_one = 1, u8_fifty = 50, u8_min = 0, u8_max = 255;
+ const short s16_zero = 0, s16_one = 1, s16_fifty = 50, s16_min = -32768, s16_max = 32767;
+ const ImU16 u16_zero = 0, u16_one = 1, u16_fifty = 50, u16_min = 0, u16_max = 65535;
const ImS32 s32_zero = 0, s32_one = 1, s32_fifty = 50, s32_min = INT_MIN/2, s32_max = INT_MAX/2, s32_hi_a = INT_MAX/2 - 100, s32_hi_b = INT_MAX/2;
const ImU32 u32_zero = 0, u32_one = 1, u32_fifty = 50, u32_min = 0, u32_max = UINT_MAX/2, u32_hi_a = UINT_MAX/2 - 100, u32_hi_b = UINT_MAX/2;
const ImS64 s64_zero = 0, s64_one = 1, s64_fifty = 50, s64_min = LLONG_MIN/2, s64_max = LLONG_MAX/2, s64_hi_a = LLONG_MAX/2 - 100, s64_hi_b = LLONG_MAX/2;
@@ -1170,6 +1365,10 @@ static void ShowDemoWindowWidgets()
const double f64_zero = 0., f64_one = 1., f64_lo_a = -1000000000000000.0, f64_hi_a = +1000000000000000.0;
// State
+ static char s8_v = 127;
+ static ImU8 u8_v = 255;
+ static short s16_v = 32767;
+ static ImU16 u16_v = 65535;
static ImS32 s32_v = -1;
static ImU32 u32_v = (ImU32)-1;
static ImS64 s64_v = -1;
@@ -1180,17 +1379,25 @@ static void ShowDemoWindowWidgets()
const float drag_speed = 0.2f;
static bool drag_clamp = false;
ImGui::Text("Drags:");
- ImGui::Checkbox("Clamp integers to 0..50", &drag_clamp); ImGui::SameLine(); ShowHelpMarker("As with every widgets in dear imgui, we never modify values unless there is a user interaction.\nYou can override the clamping limits by using CTRL+Click to input a value.");
+ ImGui::Checkbox("Clamp integers to 0..50", &drag_clamp); ImGui::SameLine(); HelpMarker("As with every widgets in dear imgui, we never modify values unless there is a user interaction.\nYou can override the clamping limits by using CTRL+Click to input a value.");
+ ImGui::DragScalar("drag s8", ImGuiDataType_S8, &s8_v, drag_speed, drag_clamp ? &s8_zero : NULL, drag_clamp ? &s8_fifty : NULL);
+ ImGui::DragScalar("drag u8", ImGuiDataType_U8, &u8_v, drag_speed, drag_clamp ? &u8_zero : NULL, drag_clamp ? &u8_fifty : NULL, "%u ms");
+ ImGui::DragScalar("drag s16", ImGuiDataType_S16, &s16_v, drag_speed, drag_clamp ? &s16_zero : NULL, drag_clamp ? &s16_fifty : NULL);
+ ImGui::DragScalar("drag u16", ImGuiDataType_U16, &u16_v, drag_speed, drag_clamp ? &u16_zero : NULL, drag_clamp ? &u16_fifty : NULL, "%u ms");
ImGui::DragScalar("drag s32", ImGuiDataType_S32, &s32_v, drag_speed, drag_clamp ? &s32_zero : NULL, drag_clamp ? &s32_fifty : NULL);
ImGui::DragScalar("drag u32", ImGuiDataType_U32, &u32_v, drag_speed, drag_clamp ? &u32_zero : NULL, drag_clamp ? &u32_fifty : NULL, "%u ms");
ImGui::DragScalar("drag s64", ImGuiDataType_S64, &s64_v, drag_speed, drag_clamp ? &s64_zero : NULL, drag_clamp ? &s64_fifty : NULL);
ImGui::DragScalar("drag u64", ImGuiDataType_U64, &u64_v, drag_speed, drag_clamp ? &u64_zero : NULL, drag_clamp ? &u64_fifty : NULL);
ImGui::DragScalar("drag float", ImGuiDataType_Float, &f32_v, 0.005f, &f32_zero, &f32_one, "%f", 1.0f);
- ImGui::DragScalar("drag float ^2", ImGuiDataType_Float, &f32_v, 0.005f, &f32_zero, &f32_one, "%f", 2.0f); ImGui::SameLine(); ShowHelpMarker("You can use the 'power' parameter to increase tweaking precision on one side of the range.");
+ ImGui::DragScalar("drag float ^2", ImGuiDataType_Float, &f32_v, 0.005f, &f32_zero, &f32_one, "%f", 2.0f); ImGui::SameLine(); HelpMarker("You can use the 'power' parameter to increase tweaking precision on one side of the range.");
ImGui::DragScalar("drag double", ImGuiDataType_Double, &f64_v, 0.0005f, &f64_zero, NULL, "%.10f grams", 1.0f);
ImGui::DragScalar("drag double ^2", ImGuiDataType_Double, &f64_v, 0.0005f, &f64_zero, &f64_one, "0 < %.10f < 1", 2.0f);
ImGui::Text("Sliders");
+ ImGui::SliderScalar("slider s8 full", ImGuiDataType_S8, &s8_v, &s8_min, &s8_max, "%d");
+ ImGui::SliderScalar("slider u8 full", ImGuiDataType_U8, &u8_v, &u8_min, &u8_max, "%u");
+ ImGui::SliderScalar("slider s16 full", ImGuiDataType_S16, &s16_v, &s16_min, &s16_max, "%d");
+ ImGui::SliderScalar("slider u16 full", ImGuiDataType_U16, &u16_v, &u16_min, &u16_max, "%u");
ImGui::SliderScalar("slider s32 low", ImGuiDataType_S32, &s32_v, &s32_zero, &s32_fifty,"%d");
ImGui::SliderScalar("slider s32 high", ImGuiDataType_S32, &s32_v, &s32_hi_a, &s32_hi_b, "%d");
ImGui::SliderScalar("slider s32 full", ImGuiDataType_S32, &s32_v, &s32_min, &s32_max, "%d");
@@ -1213,6 +1420,10 @@ static void ShowDemoWindowWidgets()
static bool inputs_step = true;
ImGui::Text("Inputs");
ImGui::Checkbox("Show step buttons", &inputs_step);
+ ImGui::InputScalar("input s8", ImGuiDataType_S8, &s8_v, inputs_step ? &s8_one : NULL, NULL, "%d");
+ ImGui::InputScalar("input u8", ImGuiDataType_U8, &u8_v, inputs_step ? &u8_one : NULL, NULL, "%u");
+ ImGui::InputScalar("input s16", ImGuiDataType_S16, &s16_v, inputs_step ? &s16_one : NULL, NULL, "%d");
+ ImGui::InputScalar("input u16", ImGuiDataType_U16, &u16_v, inputs_step ? &u16_one : NULL, NULL, "%u");
ImGui::InputScalar("input s32", ImGuiDataType_S32, &s32_v, inputs_step ? &s32_one : NULL, NULL, "%d");
ImGui::InputScalar("input s32 hex", ImGuiDataType_S32, &s32_v, inputs_step ? &s32_one : NULL, NULL, "%08X", ImGuiInputTextFlags_CharsHexadecimal);
ImGui::InputScalar("input u32", ImGuiDataType_U32, &u32_v, inputs_step ? &u32_one : NULL, NULL, "%u");
@@ -1287,7 +1498,7 @@ static void ShowDemoWindowWidgets()
ImGui::PushID("set2");
static float values2[4] = { 0.20f, 0.80f, 0.40f, 0.25f };
const int rows = 3;
- const ImVec2 small_slider_size(18, (160.0f-(rows-1)*spacing)/rows);
+ const ImVec2 small_slider_size(18, (float)(int)((160.0f - (rows - 1) * spacing) / rows));
for (int nx = 0; nx < 4; nx++)
{
if (nx > 0) ImGui::SameLine();
@@ -1322,22 +1533,21 @@ static void ShowDemoWindowWidgets()
if (ImGui::TreeNode("Drag and Drop"))
{
+ if (ImGui::TreeNode("Drag and drop in standard widgets"))
{
// ColorEdit widgets automatically act as drag source and drag target.
// They are using standardized payload strings IMGUI_PAYLOAD_TYPE_COLOR_3F and IMGUI_PAYLOAD_TYPE_COLOR_4F to allow your own widgets
// to use colors in their drag and drop interaction. Also see the demo in Color Picker -> Palette demo.
- ImGui::BulletText("Drag and drop in standard widgets");
- ImGui::Indent();
- static float col1[3] = { 1.0f,0.0f,0.2f };
- static float col2[4] = { 0.4f,0.7f,0.0f,0.5f };
+ HelpMarker("You can drag from the colored squares.");
+ static float col1[3] = { 1.0f, 0.0f, 0.2f };
+ static float col2[4] = { 0.4f, 0.7f, 0.0f, 0.5f };
ImGui::ColorEdit3("color 1", col1);
ImGui::ColorEdit4("color 2", col2);
- ImGui::Unindent();
+ ImGui::TreePop();
}
+ if (ImGui::TreeNode("Drag and drop to copy/swap items"))
{
- ImGui::BulletText("Drag and drop to copy/swap items");
- ImGui::Indent();
enum Mode
{
Mode_Copy,
@@ -1347,7 +1557,7 @@ static void ShowDemoWindowWidgets()
static int mode = 0;
if (ImGui::RadioButton("Copy", mode == Mode_Copy)) { mode = Mode_Copy; } ImGui::SameLine();
if (ImGui::RadioButton("Move", mode == Mode_Move)) { mode = Mode_Move; } ImGui::SameLine();
- if (ImGui::RadioButton("Swap", mode == Mode_Swap)) { mode = Mode_Swap; }
+ if (ImGui::RadioButton("Swap", mode == Mode_Swap)) { mode = Mode_Swap; }
static const char* names[9] = { "Bobby", "Beatrice", "Betty", "Brianna", "Barry", "Bernard", "Bibi", "Blaine", "Bryn" };
for (int n = 0; n < IM_ARRAYSIZE(names); n++)
{
@@ -1359,8 +1569,8 @@ static void ShowDemoWindowWidgets()
// Our buttons are both drag sources and drag targets here!
if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_None))
{
- ImGui::SetDragDropPayload("DND_DEMO_CELL", &n, sizeof(int)); // Set payload to carry the index of our item (could be anything)
- if (mode == Mode_Copy) { ImGui::Text("Copy %s", names[n]); } // Display preview (could be anything, e.g. when dragging an image we could decide to display the filename and a small preview of the image, etc.)
+ ImGui::SetDragDropPayload("DND_DEMO_CELL", &n, sizeof(int)); // Set payload to carry the index of our item (could be anything)
+ if (mode == Mode_Copy) { ImGui::Text("Copy %s", names[n]); } // Display preview (could be anything, e.g. when dragging an image we could decide to display the filename and a small preview of the image, etc.)
if (mode == Mode_Move) { ImGui::Text("Move %s", names[n]); }
if (mode == Mode_Swap) { ImGui::Text("Swap %s", names[n]); }
ImGui::EndDragDropSource();
@@ -1391,7 +1601,31 @@ static void ShowDemoWindowWidgets()
}
ImGui::PopID();
}
- ImGui::Unindent();
+ ImGui::TreePop();
+ }
+
+ if (ImGui::TreeNode("Drag to reorder items (simple)"))
+ {
+ // Simple reordering
+ HelpMarker("We don't use the drag and drop api at all here! Instead we query when the item is held but not hovered, and order items accordingly.");
+ static const char* item_names[] = { "Item One", "Item Two", "Item Three", "Item Four", "Item Five" };
+ for (int n = 0; n < IM_ARRAYSIZE(item_names); n++)
+ {
+ const char* item = item_names[n];
+ ImGui::Selectable(item);
+
+ if (ImGui::IsItemActive() && !ImGui::IsItemHovered())
+ {
+ int n_next = n + (ImGui::GetMouseDragDelta(0).y < 0.f ? -1 : 1);
+ if (n_next >= 0 && n_next < IM_ARRAYSIZE(item_names))
+ {
+ item_names[n] = item_names[n_next];
+ item_names[n_next] = item;
+ ImGui::ResetMouseDragDelta();
+ }
+ }
+ }
+ ImGui::TreePop();
}
ImGui::TreePop();
@@ -1399,25 +1633,33 @@ static void ShowDemoWindowWidgets()
if (ImGui::TreeNode("Querying Status (Active/Focused/Hovered etc.)"))
{
- // Display the value of IsItemHovered() and other common item state functions. Note that the flags can be combined.
- // (because BulletText is an item itself and that would affect the output of IsItemHovered() we pass all state in a single call to simplify the code).
+ // Submit an item (various types available) so we can query their status in the following block.
static int item_type = 1;
+ ImGui::Combo("Item Type", &item_type, "Text\0Button\0Button (w/ repeat)\0Checkbox\0SliderFloat\0InputText\0InputFloat\0InputFloat3\0ColorEdit4\0MenuItem\0TreeNode\0TreeNode (w/ double-click)\0ListBox\0", 20);
+ ImGui::SameLine();
+ HelpMarker("Testing how various types of items are interacting with the IsItemXXX functions.");
+ bool ret = false;
static bool b = false;
static float col4f[4] = { 1.0f, 0.5, 0.0f, 1.0f };
- ImGui::RadioButton("Text", &item_type, 0);
- ImGui::RadioButton("Button", &item_type, 1);
- ImGui::RadioButton("CheckBox", &item_type, 2);
- ImGui::RadioButton("SliderFloat", &item_type, 3);
- ImGui::RadioButton("ColorEdit4", &item_type, 4);
- ImGui::RadioButton("ListBox", &item_type, 5);
- ImGui::Separator();
- bool ret = false;
+ static char str[16] = {};
if (item_type == 0) { ImGui::Text("ITEM: Text"); } // Testing text items with no identifier/interaction
if (item_type == 1) { ret = ImGui::Button("ITEM: Button"); } // Testing button
- if (item_type == 2) { ret = ImGui::Checkbox("ITEM: CheckBox", &b); } // Testing checkbox
- if (item_type == 3) { ret = ImGui::SliderFloat("ITEM: SliderFloat", &col4f[0], 0.0f, 1.0f); } // Testing basic item
- if (item_type == 4) { ret = ImGui::ColorEdit4("ITEM: ColorEdit4", col4f); } // Testing multi-component items (IsItemXXX flags are reported merged)
- if (item_type == 5) { const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::ListBox("ITEM: ListBox", &current, items, IM_ARRAYSIZE(items), IM_ARRAYSIZE(items)); }
+ if (item_type == 2) { ImGui::PushButtonRepeat(true); ret = ImGui::Button("ITEM: Button"); ImGui::PopButtonRepeat(); } // Testing button (with repeater)
+ if (item_type == 3) { ret = ImGui::Checkbox("ITEM: Checkbox", &b); } // Testing checkbox
+ if (item_type == 4) { ret = ImGui::SliderFloat("ITEM: SliderFloat", &col4f[0], 0.0f, 1.0f); } // Testing basic item
+ if (item_type == 5) { ret = ImGui::InputText("ITEM: InputText", &str[0], IM_ARRAYSIZE(str)); } // Testing input text (which handles tabbing)
+ if (item_type == 6) { ret = ImGui::InputFloat("ITEM: InputFloat", col4f, 1.0f); } // Testing +/- buttons on scalar input
+ if (item_type == 7) { ret = ImGui::InputFloat3("ITEM: InputFloat3", col4f); } // Testing multi-component items (IsItemXXX flags are reported merged)
+ if (item_type == 8) { ret = ImGui::ColorEdit4("ITEM: ColorEdit4", col4f); } // Testing multi-component items (IsItemXXX flags are reported merged)
+ if (item_type == 9) { ret = ImGui::MenuItem("ITEM: MenuItem"); } // Testing menu item (they use ImGuiButtonFlags_PressedOnRelease button policy)
+ if (item_type == 10){ ret = ImGui::TreeNode("ITEM: TreeNode"); if (ret) ImGui::TreePop(); } // Testing tree node
+ if (item_type == 11){ ret = ImGui::TreeNodeEx("ITEM: TreeNode w/ ImGuiTreeNodeFlags_OpenOnDoubleClick", ImGuiTreeNodeFlags_OpenOnDoubleClick | ImGuiTreeNodeFlags_NoTreePushOnOpen); } // Testing tree node with ImGuiButtonFlags_PressedOnDoubleClick button policy.
+ if (item_type == 12){ const char* items[] = { "Apple", "Banana", "Cherry", "Kiwi" }; static int current = 1; ret = ImGui::ListBox("ITEM: ListBox", &current, items, IM_ARRAYSIZE(items), IM_ARRAYSIZE(items)); }
+
+ // Display the value of IsItemHovered() and other common item state functions.
+ // Note that the ImGuiHoveredFlags_XXX flags can be combined.
+ // Because BulletText is an item itself and that would affect the output of IsItemXXX functions,
+ // we query every state in a single call to avoid storing them and to simplify the code
ImGui::BulletText(
"Return value = %d\n"
"IsItemFocused() = %d\n"
@@ -1428,9 +1670,12 @@ static void ShowDemoWindowWidgets()
"IsItemHovered(_RectOnly) = %d\n"
"IsItemActive() = %d\n"
"IsItemEdited() = %d\n"
+ "IsItemActivated() = %d\n"
"IsItemDeactivated() = %d\n"
- "IsItemDeactivatedEdit() = %d\n"
+ "IsItemDeactivatedAfterEdit() = %d\n"
"IsItemVisible() = %d\n"
+ "IsItemClicked() = %d\n"
+ "IsItemToggledOpen() = %d\n"
"GetItemRectMin() = (%.1f, %.1f)\n"
"GetItemRectMax() = (%.1f, %.1f)\n"
"GetItemRectSize() = (%.1f, %.1f)",
@@ -1443,9 +1688,12 @@ static void ShowDemoWindowWidgets()
ImGui::IsItemHovered(ImGuiHoveredFlags_RectOnly),
ImGui::IsItemActive(),
ImGui::IsItemEdited(),
+ ImGui::IsItemActivated(),
ImGui::IsItemDeactivated(),
ImGui::IsItemDeactivatedAfterEdit(),
ImGui::IsItemVisible(),
+ ImGui::IsItemClicked(),
+ ImGui::IsItemToggledOpen(),
ImGui::GetItemRectMin().x, ImGui::GetItemRectMin().y,
ImGui::GetItemRectMax().x, ImGui::GetItemRectMax().y,
ImGui::GetItemRectSize().x, ImGui::GetItemRectSize().y
@@ -1456,7 +1704,8 @@ static void ShowDemoWindowWidgets()
if (embed_all_inside_a_child_window)
ImGui::BeginChild("outer_child", ImVec2(0, ImGui::GetFontSize() * 20), true);
- // Testing IsWindowFocused() function with its various flags. Note that the flags can be combined.
+ // Testing IsWindowFocused() function with its various flags.
+ // Note that the ImGuiFocusedFlags_XXX flags can be combined.
ImGui::BulletText(
"IsWindowFocused() = %d\n"
"IsWindowFocused(_ChildWindows) = %d\n"
@@ -1469,13 +1718,15 @@ static void ShowDemoWindowWidgets()
ImGui::IsWindowFocused(ImGuiFocusedFlags_RootWindow),
ImGui::IsWindowFocused(ImGuiFocusedFlags_AnyWindow));
- // Testing IsWindowHovered() function with its various flags. Note that the flags can be combined.
+ // Testing IsWindowHovered() function with its various flags.
+ // Note that the ImGuiHoveredFlags_XXX flags can be combined.
ImGui::BulletText(
"IsWindowHovered() = %d\n"
"IsWindowHovered(_AllowWhenBlockedByPopup) = %d\n"
"IsWindowHovered(_AllowWhenBlockedByActiveItem) = %d\n"
"IsWindowHovered(_ChildWindows) = %d\n"
"IsWindowHovered(_ChildWindows|_RootWindow) = %d\n"
+ "IsWindowHovered(_ChildWindows|_AllowWhenBlockedByPopup) = %d\n"
"IsWindowHovered(_RootWindow) = %d\n"
"IsWindowHovered(_AnyWindow) = %d\n",
ImGui::IsWindowHovered(),
@@ -1483,16 +1734,20 @@ static void ShowDemoWindowWidgets()
ImGui::IsWindowHovered(ImGuiHoveredFlags_AllowWhenBlockedByActiveItem),
ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows),
ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_RootWindow),
+ ImGui::IsWindowHovered(ImGuiHoveredFlags_ChildWindows | ImGuiHoveredFlags_AllowWhenBlockedByPopup),
ImGui::IsWindowHovered(ImGuiHoveredFlags_RootWindow),
ImGui::IsWindowHovered(ImGuiHoveredFlags_AnyWindow));
ImGui::BeginChild("child", ImVec2(0, 50), true);
- ImGui::Text("This is another child window for testing with the _ChildWindows flag.");
+ ImGui::Text("This is another child window for testing the _ChildWindows flag.");
ImGui::EndChild();
if (embed_all_inside_a_child_window)
ImGui::EndChild();
- // Calling IsItemHovered() after begin returns the hovered status of the title bar.
+ static char dummy_str[] = "This is a dummy field to be able to tab-out of the widgets above.";
+ ImGui::InputText("dummy", dummy_str, IM_ARRAYSIZE(dummy_str), ImGuiInputTextFlags_ReadOnly);
+
+ // Calling IsItemHovered() after begin returns the hovered status of the title bar.
// This is useful in particular if you want to create a context menu (with BeginPopupContextItem) associated to the title bar of a window.
static bool test_window = false;
ImGui::Checkbox("Hovered/Active tests after Begin() for title bar testing", &test_window);
@@ -1520,8 +1775,9 @@ static void ShowDemoWindowLayout()
if (!ImGui::CollapsingHeader("Layout"))
return;
- if (ImGui::TreeNode("Child regions"))
+ if (ImGui::TreeNode("Child windows"))
{
+ HelpMarker("Use child windows to begin into a self-contained independent scrolling/clipping regions within a host window.");
static bool disable_mouse_wheel = false;
static bool disable_menu = false;
ImGui::Checkbox("Disable Mouse Wheel", &disable_mouse_wheel);
@@ -1530,13 +1786,13 @@ static void ShowDemoWindowLayout()
static int line = 50;
bool goto_line = ImGui::Button("Goto");
ImGui::SameLine();
- ImGui::PushItemWidth(100);
+ ImGui::SetNextItemWidth(100);
goto_line |= ImGui::InputInt("##Line", &line, 0, 0, ImGuiInputTextFlags_EnterReturnsTrue);
- ImGui::PopItemWidth();
// Child 1: no border, enable horizontal scrollbar
{
- ImGui::BeginChild("Child1", ImVec2(ImGui::GetWindowContentRegionWidth() * 0.5f, 300), false, ImGuiWindowFlags_HorizontalScrollbar | (disable_mouse_wheel ? ImGuiWindowFlags_NoScrollWithMouse : 0));
+ ImGuiWindowFlags window_flags = ImGuiWindowFlags_HorizontalScrollbar | (disable_mouse_wheel ? ImGuiWindowFlags_NoScrollWithMouse : 0);
+ ImGui::BeginChild("ChildL", ImVec2(ImGui::GetWindowContentRegionWidth() * 0.5f, 260), false, window_flags);
for (int i = 0; i < 100; i++)
{
ImGui::Text("%04d: scrollable region", i);
@@ -1552,8 +1808,9 @@ static void ShowDemoWindowLayout()
// Child 2: rounded border
{
+ ImGuiWindowFlags window_flags = (disable_mouse_wheel ? ImGuiWindowFlags_NoScrollWithMouse : 0) | (disable_menu ? 0 : ImGuiWindowFlags_MenuBar);
ImGui::PushStyleVar(ImGuiStyleVar_ChildRounding, 5.0f);
- ImGui::BeginChild("Child2", ImVec2(0, 300), true, (disable_mouse_wheel ? ImGuiWindowFlags_NoScrollWithMouse : 0) | (disable_menu ? 0 : ImGuiWindowFlags_MenuBar));
+ ImGui::BeginChild("ChildR", ImVec2(0, 260), true, window_flags);
if (!disable_menu && ImGui::BeginMenuBar())
{
if (ImGui::BeginMenu("Menu"))
@@ -1568,47 +1825,69 @@ static void ShowDemoWindowLayout()
{
char buf[32];
sprintf(buf, "%03d", i);
- ImGui::Button(buf, ImVec2(-1.0f, 0.0f));
+ ImGui::Button(buf, ImVec2(-FLT_MIN, 0.0f));
ImGui::NextColumn();
}
ImGui::EndChild();
ImGui::PopStyleVar();
}
+ ImGui::Separator();
+
+ // Demonstrate a few extra things
+ // - Changing ImGuiCol_ChildBg (which is transparent black in default styles)
+ // - Using SetCursorPos() to position the child window (because the child window is an item from the POV of the parent window)
+ // You can also call SetNextWindowPos() to position the child window. The parent window will effectively layout from this position.
+ // - Using ImGui::GetItemRectMin/Max() to query the "item" state (because the child window is an item from the POV of the parent window)
+ // See "Widgets" -> "Querying Status (Active/Focused/Hovered etc.)" section for more details about this.
+ {
+ ImGui::SetCursorPosX(ImGui::GetCursorPosX() + 10);
+ ImGui::PushStyleColor(ImGuiCol_ChildBg, IM_COL32(255, 0, 0, 100));
+ ImGui::BeginChild("Red", ImVec2(200, 100), true, ImGuiWindowFlags_None);
+ for (int n = 0; n < 50; n++)
+ ImGui::Text("Some test %d", n);
+ ImGui::EndChild();
+ ImVec2 child_rect_min = ImGui::GetItemRectMin();
+ ImVec2 child_rect_max = ImGui::GetItemRectMax();
+ ImGui::PopStyleColor();
+ ImGui::Text("Rect of child window is: (%.0f,%.0f) (%.0f,%.0f)", child_rect_min.x, child_rect_min.y, child_rect_max.x, child_rect_max.y);
+ }
+
ImGui::TreePop();
}
if (ImGui::TreeNode("Widgets Width"))
{
+ // Use SetNextItemWidth() to set the width of a single upcoming item.
+ // Use PushItemWidth()/PopItemWidth() to set the width of a group of items.
static float f = 0.0f;
- ImGui::Text("PushItemWidth(100)");
- ImGui::SameLine(); ShowHelpMarker("Fixed width.");
- ImGui::PushItemWidth(100);
+ ImGui::Text("SetNextItemWidth/PushItemWidth(100)");
+ ImGui::SameLine(); HelpMarker("Fixed width.");
+ ImGui::SetNextItemWidth(100);
ImGui::DragFloat("float##1", &f);
- ImGui::PopItemWidth();
- ImGui::Text("PushItemWidth(GetWindowWidth() * 0.5f)");
- ImGui::SameLine(); ShowHelpMarker("Half of window width.");
- ImGui::PushItemWidth(ImGui::GetWindowWidth() * 0.5f);
+ ImGui::Text("SetNextItemWidth/PushItemWidth(GetWindowWidth() * 0.5f)");
+ ImGui::SameLine(); HelpMarker("Half of window width.");
+ ImGui::SetNextItemWidth(ImGui::GetWindowWidth() * 0.5f);
ImGui::DragFloat("float##2", &f);
- ImGui::PopItemWidth();
- ImGui::Text("PushItemWidth(GetContentRegionAvailWidth() * 0.5f)");
- ImGui::SameLine(); ShowHelpMarker("Half of available width.\n(~ right-cursor_pos)\n(works within a column set)");
- ImGui::PushItemWidth(ImGui::GetContentRegionAvailWidth() * 0.5f);
+ ImGui::Text("SetNextItemWidth/PushItemWidth(GetContentRegionAvail().x * 0.5f)");
+ ImGui::SameLine(); HelpMarker("Half of available width.\n(~ right-cursor_pos)\n(works within a column set)");
+ ImGui::SetNextItemWidth(ImGui::GetContentRegionAvail().x * 0.5f);
ImGui::DragFloat("float##3", &f);
- ImGui::PopItemWidth();
- ImGui::Text("PushItemWidth(-100)");
- ImGui::SameLine(); ShowHelpMarker("Align to right edge minus 100");
- ImGui::PushItemWidth(-100);
+ ImGui::Text("SetNextItemWidth/PushItemWidth(-100)");
+ ImGui::SameLine(); HelpMarker("Align to right edge minus 100");
+ ImGui::SetNextItemWidth(-100);
ImGui::DragFloat("float##4", &f);
- ImGui::PopItemWidth();
- ImGui::Text("PushItemWidth(-1)");
- ImGui::SameLine(); ShowHelpMarker("Align to right edge");
+ // Demonstrate using PushItemWidth to surround three items. Calling SetNextItemWidth() before each of them would have the same effect.
+ ImGui::Text("SetNextItemWidth/PushItemWidth(-1)");
+ ImGui::SameLine(); HelpMarker("Align to right edge");
ImGui::PushItemWidth(-1);
- ImGui::DragFloat("float##5", &f);
+ ImGui::DragFloat("##float5a", &f);
+ ImGui::DragFloat("##float5b", &f);
+ ImGui::DragFloat("##float5c", &f);
ImGui::PopItemWidth();
ImGui::TreePop();
@@ -1702,9 +1981,80 @@ static void ShowDemoWindowLayout()
ImGui::TreePop();
}
+ if (ImGui::TreeNode("Tabs"))
+ {
+ if (ImGui::TreeNode("Basic"))
+ {
+ ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_None;
+ if (ImGui::BeginTabBar("MyTabBar", tab_bar_flags))
+ {
+ if (ImGui::BeginTabItem("Avocado"))
+ {
+ ImGui::Text("This is the Avocado tab!\nblah blah blah blah blah");
+ ImGui::EndTabItem();
+ }
+ if (ImGui::BeginTabItem("Broccoli"))
+ {
+ ImGui::Text("This is the Broccoli tab!\nblah blah blah blah blah");
+ ImGui::EndTabItem();
+ }
+ if (ImGui::BeginTabItem("Cucumber"))
+ {
+ ImGui::Text("This is the Cucumber tab!\nblah blah blah blah blah");
+ ImGui::EndTabItem();
+ }
+ ImGui::EndTabBar();
+ }
+ ImGui::Separator();
+ ImGui::TreePop();
+ }
+
+ if (ImGui::TreeNode("Advanced & Close Button"))
+ {
+ // Expose a couple of the available flags. In most cases you may just call BeginTabBar() with no flags (0).
+ static ImGuiTabBarFlags tab_bar_flags = ImGuiTabBarFlags_Reorderable;
+ ImGui::CheckboxFlags("ImGuiTabBarFlags_Reorderable", (unsigned int*)&tab_bar_flags, ImGuiTabBarFlags_Reorderable);
+ ImGui::CheckboxFlags("ImGuiTabBarFlags_AutoSelectNewTabs", (unsigned int*)&tab_bar_flags, ImGuiTabBarFlags_AutoSelectNewTabs);
+ ImGui::CheckboxFlags("ImGuiTabBarFlags_TabListPopupButton", (unsigned int*)&tab_bar_flags, ImGuiTabBarFlags_TabListPopupButton);
+ ImGui::CheckboxFlags("ImGuiTabBarFlags_NoCloseWithMiddleMouseButton", (unsigned int*)&tab_bar_flags, ImGuiTabBarFlags_NoCloseWithMiddleMouseButton);
+ if ((tab_bar_flags & ImGuiTabBarFlags_FittingPolicyMask_) == 0)
+ tab_bar_flags |= ImGuiTabBarFlags_FittingPolicyDefault_;
+ if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyResizeDown", (unsigned int*)&tab_bar_flags, ImGuiTabBarFlags_FittingPolicyResizeDown))
+ tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyResizeDown);
+ if (ImGui::CheckboxFlags("ImGuiTabBarFlags_FittingPolicyScroll", (unsigned int*)&tab_bar_flags, ImGuiTabBarFlags_FittingPolicyScroll))
+ tab_bar_flags &= ~(ImGuiTabBarFlags_FittingPolicyMask_ ^ ImGuiTabBarFlags_FittingPolicyScroll);
+
+ // Tab Bar
+ const char* names[4] = { "Artichoke", "Beetroot", "Celery", "Daikon" };
+ static bool opened[4] = { true, true, true, true }; // Persistent user state
+ for (int n = 0; n < IM_ARRAYSIZE(opened); n++)
+ {
+ if (n > 0) { ImGui::SameLine(); }
+ ImGui::Checkbox(names[n], &opened[n]);
+ }
+
+ // Passing a bool* to BeginTabItem() is similar to passing one to Begin(): the underlying bool will be set to false when the tab is closed.
+ if (ImGui::BeginTabBar("MyTabBar", tab_bar_flags))
+ {
+ for (int n = 0; n < IM_ARRAYSIZE(opened); n++)
+ if (opened[n] && ImGui::BeginTabItem(names[n], &opened[n], ImGuiTabItemFlags_None))
+ {
+ ImGui::Text("This is the %s tab!", names[n]);
+ if (n & 1)
+ ImGui::Text("I am an odd tab.");
+ ImGui::EndTabItem();
+ }
+ ImGui::EndTabBar();
+ }
+ ImGui::Separator();
+ ImGui::TreePop();
+ }
+ ImGui::TreePop();
+ }
+
if (ImGui::TreeNode("Groups"))
{
- ImGui::TextWrapped("(Using ImGui::BeginGroup()/EndGroup() to layout items. BeginGroup() basically locks the horizontal position. EndGroup() bundles the whole group so that you can use functions such as IsItemHovered() on it.)");
+ HelpMarker("BeginGroup() basically locks the horizontal position for new line. EndGroup() bundles the whole group so that you can use \"item\" functions such as IsItemHovered()/IsItemActive() or SameLine() etc. on the whole group.");
ImGui::BeginGroup();
{
ImGui::BeginGroup();
@@ -1748,104 +2098,219 @@ static void ShowDemoWindowLayout()
if (ImGui::TreeNode("Text Baseline Alignment"))
{
- ImGui::TextWrapped("(This is testing the vertical alignment that occurs on text to keep it at the same baseline as widgets. Lines only composed of text or \"small\" widgets fit in less vertical spaces than lines with normal widgets)");
+ {
+ ImGui::BulletText("Text baseline:");
+ ImGui::SameLine();
+ HelpMarker("This is testing the vertical alignment that gets applied on text to keep it aligned with widgets. Lines only composed of text or \"small\" widgets fit in less vertical spaces than lines with normal widgets.");
+ ImGui::Indent();
- ImGui::Text("One\nTwo\nThree"); ImGui::SameLine();
- ImGui::Text("Hello\nWorld"); ImGui::SameLine();
- ImGui::Text("Banana");
+ ImGui::Text("KO Blahblah"); ImGui::SameLine();
+ ImGui::Button("Some framed item"); ImGui::SameLine();
+ HelpMarker("Baseline of button will look misaligned with text..");
- ImGui::Text("Banana"); ImGui::SameLine();
- ImGui::Text("Hello\nWorld"); ImGui::SameLine();
- ImGui::Text("One\nTwo\nThree");
+ // If your line starts with text, call AlignTextToFramePadding() to align text to upcoming widgets.
+ // Because we don't know what's coming after the Text() statement, we need to move the text baseline down by FramePadding.y
+ ImGui::AlignTextToFramePadding();
+ ImGui::Text("OK Blahblah"); ImGui::SameLine();
+ ImGui::Button("Some framed item"); ImGui::SameLine();
+ HelpMarker("We call AlignTextToFramePadding() to vertically align the text baseline by +FramePadding.y");
- ImGui::Button("HOP##1"); ImGui::SameLine();
- ImGui::Text("Banana"); ImGui::SameLine();
- ImGui::Text("Hello\nWorld"); ImGui::SameLine();
- ImGui::Text("Banana");
+ // SmallButton() uses the same vertical padding as Text
+ ImGui::Button("TEST##1"); ImGui::SameLine();
+ ImGui::Text("TEST"); ImGui::SameLine();
+ ImGui::SmallButton("TEST##2");
- ImGui::Button("HOP##2"); ImGui::SameLine();
- ImGui::Text("Hello\nWorld"); ImGui::SameLine();
- ImGui::Text("Banana");
+ // If your line starts with text, call AlignTextToFramePadding() to align text to upcoming widgets.
+ ImGui::AlignTextToFramePadding();
+ ImGui::Text("Text aligned to framed item"); ImGui::SameLine();
+ ImGui::Button("Item##1"); ImGui::SameLine();
+ ImGui::Text("Item"); ImGui::SameLine();
+ ImGui::SmallButton("Item##2"); ImGui::SameLine();
+ ImGui::Button("Item##3");
- ImGui::Button("TEST##1"); ImGui::SameLine();
- ImGui::Text("TEST"); ImGui::SameLine();
- ImGui::SmallButton("TEST##2");
+ ImGui::Unindent();
+ }
- ImGui::AlignTextToFramePadding(); // If your line starts with text, call this to align it to upcoming widgets.
- ImGui::Text("Text aligned to Widget"); ImGui::SameLine();
- ImGui::Button("Widget##1"); ImGui::SameLine();
- ImGui::Text("Widget"); ImGui::SameLine();
- ImGui::SmallButton("Widget##2"); ImGui::SameLine();
- ImGui::Button("Widget##3");
+ ImGui::Spacing();
- // Tree
- const float spacing = ImGui::GetStyle().ItemInnerSpacing.x;
- ImGui::Button("Button##1");
- ImGui::SameLine(0.0f, spacing);
- if (ImGui::TreeNode("Node##1")) { for (int i = 0; i < 6; i++) ImGui::BulletText("Item %d..", i); ImGui::TreePop(); } // Dummy tree data
+ {
+ ImGui::BulletText("Multi-line text:");
+ ImGui::Indent();
+ ImGui::Text("One\nTwo\nThree"); ImGui::SameLine();
+ ImGui::Text("Hello\nWorld"); ImGui::SameLine();
+ ImGui::Text("Banana");
+
+ ImGui::Text("Banana"); ImGui::SameLine();
+ ImGui::Text("Hello\nWorld"); ImGui::SameLine();
+ ImGui::Text("One\nTwo\nThree");
+
+ ImGui::Button("HOP##1"); ImGui::SameLine();
+ ImGui::Text("Banana"); ImGui::SameLine();
+ ImGui::Text("Hello\nWorld"); ImGui::SameLine();
+ ImGui::Text("Banana");
+
+ ImGui::Button("HOP##2"); ImGui::SameLine();
+ ImGui::Text("Hello\nWorld"); ImGui::SameLine();
+ ImGui::Text("Banana");
+ ImGui::Unindent();
+ }
- ImGui::AlignTextToFramePadding(); // Vertically align text node a bit lower so it'll be vertically centered with upcoming widget. Otherwise you can use SmallButton (smaller fit).
- bool node_open = ImGui::TreeNode("Node##2"); // Common mistake to avoid: if we want to SameLine after TreeNode we need to do it before we add child content.
- ImGui::SameLine(0.0f, spacing); ImGui::Button("Button##2");
- if (node_open) { for (int i = 0; i < 6; i++) ImGui::BulletText("Item %d..", i); ImGui::TreePop(); } // Dummy tree data
+ ImGui::Spacing();
- // Bullet
- ImGui::Button("Button##3");
- ImGui::SameLine(0.0f, spacing);
- ImGui::BulletText("Bullet text");
+ {
+ ImGui::BulletText("Misc items:");
+ ImGui::Indent();
- ImGui::AlignTextToFramePadding();
- ImGui::BulletText("Node");
- ImGui::SameLine(0.0f, spacing); ImGui::Button("Button##4");
+ // SmallButton() sets FramePadding to zero. Text baseline is aligned to match baseline of previous Button
+ ImGui::Button("80x80", ImVec2(80, 80));
+ ImGui::SameLine();
+ ImGui::Button("50x50", ImVec2(50, 50));
+ ImGui::SameLine();
+ ImGui::Button("Button()");
+ ImGui::SameLine();
+ ImGui::SmallButton("SmallButton()");
+
+ // Tree
+ const float spacing = ImGui::GetStyle().ItemInnerSpacing.x;
+ ImGui::Button("Button##1");
+ ImGui::SameLine(0.0f, spacing);
+ if (ImGui::TreeNode("Node##1")) { for (int i = 0; i < 6; i++) ImGui::BulletText("Item %d..", i); ImGui::TreePop(); } // Dummy tree data
+
+ ImGui::AlignTextToFramePadding(); // Vertically align text node a bit lower so it'll be vertically centered with upcoming widget. Otherwise you can use SmallButton (smaller fit).
+ bool node_open = ImGui::TreeNode("Node##2");// Common mistake to avoid: if we want to SameLine after TreeNode we need to do it before we add child content.
+ ImGui::SameLine(0.0f, spacing); ImGui::Button("Button##2");
+ if (node_open) { for (int i = 0; i < 6; i++) ImGui::BulletText("Item %d..", i); ImGui::TreePop(); } // Dummy tree data
+
+ // Bullet
+ ImGui::Button("Button##3");
+ ImGui::SameLine(0.0f, spacing);
+ ImGui::BulletText("Bullet text");
+
+ ImGui::AlignTextToFramePadding();
+ ImGui::BulletText("Node");
+ ImGui::SameLine(0.0f, spacing); ImGui::Button("Button##4");
+ ImGui::Unindent();
+ }
ImGui::TreePop();
}
if (ImGui::TreeNode("Scrolling"))
{
- ImGui::TextWrapped("(Use SetScrollHereY() or SetScrollFromPosY() to scroll to a given position.)");
- static bool track = true;
- static int track_line = 50, scroll_to_px = 200;
- ImGui::Checkbox("Track", &track);
+ // Vertical scroll functions
+ HelpMarker("Use SetScrollHereY() or SetScrollFromPosY() to scroll to a given vertical position.");
+
+ static int track_item = 50;
+ static bool enable_track = true;
+ static bool enable_extra_decorations = false;
+ static float scroll_to_off_px = 0.0f;
+ static float scroll_to_pos_px = 200.0f;
+
+ ImGui::Checkbox("Decoration", &enable_extra_decorations);
+ ImGui::SameLine();
+ HelpMarker("We expose this for testing because scrolling sometimes had issues with window decoration such as menu-bars.");
+
+ ImGui::Checkbox("Track", &enable_track);
ImGui::PushItemWidth(100);
- ImGui::SameLine(130); track |= ImGui::DragInt("##line", &track_line, 0.25f, 0, 99, "Line = %d");
- bool scroll_to = ImGui::Button("Scroll To Pos");
- ImGui::SameLine(130); scroll_to |= ImGui::DragInt("##pos_y", &scroll_to_px, 1.00f, 0, 9999, "Y = %d px");
+ ImGui::SameLine(140); enable_track |= ImGui::DragInt("##item", &track_item, 0.25f, 0, 99, "Item = %d");
+
+ bool scroll_to_off = ImGui::Button("Scroll Offset");
+ ImGui::SameLine(140); scroll_to_off |= ImGui::DragFloat("##off", &scroll_to_off_px, 1.00f, 0, FLT_MAX, "+%.0f px");
+
+ bool scroll_to_pos = ImGui::Button("Scroll To Pos");
+ ImGui::SameLine(140); scroll_to_pos |= ImGui::DragFloat("##pos", &scroll_to_pos_px, 1.00f, -10, FLT_MAX, "X/Y = %.0f px");
ImGui::PopItemWidth();
- if (scroll_to) track = false;
+ if (scroll_to_off || scroll_to_pos)
+ enable_track = false;
+
+ ImGuiStyle& style = ImGui::GetStyle();
+ float child_w = (ImGui::GetContentRegionAvail().x - 4 * style.ItemSpacing.x) / 5;
+ if (child_w < 1.0f)
+ child_w = 1.0f;
+ ImGui::PushID("##VerticalScrolling");
for (int i = 0; i < 5; i++)
{
if (i > 0) ImGui::SameLine();
ImGui::BeginGroup();
- ImGui::Text("%s", i == 0 ? "Top" : i == 1 ? "25%" : i == 2 ? "Center" : i == 3 ? "75%" : "Bottom");
- ImGui::BeginChild(ImGui::GetID((void*)(intptr_t)i), ImVec2(ImGui::GetWindowWidth() * 0.17f, 200.0f), true);
- if (scroll_to)
- ImGui::SetScrollFromPosY(ImGui::GetCursorStartPos().y + scroll_to_px, i * 0.25f);
- for (int line = 0; line < 100; line++)
+ const char* names[] = { "Top", "25%", "Center", "75%", "Bottom" };
+ ImGui::TextUnformatted(names[i]);
+
+ ImGuiWindowFlags child_flags = enable_extra_decorations ? ImGuiWindowFlags_MenuBar : 0;
+ bool window_visible = ImGui::BeginChild(ImGui::GetID((void*)(intptr_t)i), ImVec2(child_w, 200.0f), true, child_flags);
+ if (ImGui::BeginMenuBar())
+ {
+ ImGui::TextUnformatted("abc");
+ ImGui::EndMenuBar();
+ }
+ if (scroll_to_off)
+ ImGui::SetScrollY(scroll_to_off_px);
+ if (scroll_to_pos)
+ ImGui::SetScrollFromPosY(ImGui::GetCursorStartPos().y + scroll_to_pos_px, i * 0.25f);
+ if (window_visible) // Avoid calling SetScrollHereY when running with culled items
{
- if (track && line == track_line)
+ for (int item = 0; item < 100; item++)
{
- ImGui::TextColored(ImVec4(1,1,0,1), "Line %d", line);
- ImGui::SetScrollHereY(i * 0.25f); // 0.0f:top, 0.5f:center, 1.0f:bottom
+ if (enable_track && item == track_item)
+ {
+ ImGui::TextColored(ImVec4(1, 1, 0, 1), "Item %d", item);
+ ImGui::SetScrollHereY(i * 0.25f); // 0.0f:top, 0.5f:center, 1.0f:bottom
+ }
+ else
+ {
+ ImGui::Text("Item %d", item);
+ }
}
- else
+ }
+ float scroll_y = ImGui::GetScrollY();
+ float scroll_max_y = ImGui::GetScrollMaxY();
+ ImGui::EndChild();
+ ImGui::Text("%.0f/%.0f", scroll_y, scroll_max_y);
+ ImGui::EndGroup();
+ }
+ ImGui::PopID();
+
+ // Horizontal scroll functions
+ ImGui::Spacing();
+ HelpMarker("Use SetScrollHereX() or SetScrollFromPosX() to scroll to a given horizontal position.\n\nUsing the \"Scroll To Pos\" button above will make the discontinuity at edges visible: scrolling to the top/bottom/left/right-most item will add an additional WindowPadding to reflect on reaching the edge of the list.\n\nBecause the clipping rectangle of most window hides half worth of WindowPadding on the left/right, using SetScrollFromPosX(+1) will usually result in clipped text whereas the equivalent SetScrollFromPosY(+1) wouldn't.");
+ ImGui::PushID("##HorizontalScrolling");
+ for (int i = 0; i < 5; i++)
+ {
+ float child_height = ImGui::GetTextLineHeight() + style.ScrollbarSize + style.WindowPadding.y * 2.0f;
+ ImGuiWindowFlags child_flags = ImGuiWindowFlags_HorizontalScrollbar | (enable_extra_decorations ? ImGuiWindowFlags_AlwaysVerticalScrollbar : 0);
+ bool window_visible = ImGui::BeginChild(ImGui::GetID((void*)(intptr_t)i), ImVec2(-100, child_height), true, child_flags);
+ if (scroll_to_off)
+ ImGui::SetScrollX(scroll_to_off_px);
+ if (scroll_to_pos)
+ ImGui::SetScrollFromPosX(ImGui::GetCursorStartPos().x + scroll_to_pos_px, i * 0.25f);
+ if (window_visible) // Avoid calling SetScrollHereY when running with culled items
+ {
+ for (int item = 0; item < 100; item++)
{
- ImGui::Text("Line %d", line);
+ if (enable_track && item == track_item)
+ {
+ ImGui::TextColored(ImVec4(1, 1, 0, 1), "Item %d", item);
+ ImGui::SetScrollHereX(i * 0.25f); // 0.0f:left, 0.5f:center, 1.0f:right
+ }
+ else
+ {
+ ImGui::Text("Item %d", item);
+ }
+ ImGui::SameLine();
}
}
- float scroll_y = ImGui::GetScrollY(), scroll_max_y = ImGui::GetScrollMaxY();
+ float scroll_x = ImGui::GetScrollX();
+ float scroll_max_x = ImGui::GetScrollMaxX();
ImGui::EndChild();
- ImGui::Text("%.0f/%0.f", scroll_y, scroll_max_y);
- ImGui::EndGroup();
+ ImGui::SameLine();
+ const char* names[] = { "Left", "25%", "Center", "75%", "Right" };
+ ImGui::Text("%s\n%.0f/%.0f", names[i], scroll_x, scroll_max_x);
+ ImGui::Spacing();
}
- ImGui::TreePop();
- }
+ ImGui::PopID();
- if (ImGui::TreeNode("Horizontal Scrolling"))
- {
- ImGui::Bullet(); ImGui::TextWrapped("Horizontal scrolling for a window has to be enabled explicitly via the ImGuiWindowFlags_HorizontalScrollbar flag.");
- ImGui::Bullet(); ImGui::TextWrapped("You may want to explicitly specify content width by calling SetNextWindowContentWidth() before Begin().");
+ // Miscellaneous Horizontal Scrolling Demo
+ HelpMarker("Horizontal scrolling for a window has to be enabled explicitly via the ImGuiWindowFlags_HorizontalScrollbar flag.\n\nYou may want to explicitly specify content width by calling SetNextWindowContentWidth() before Begin().");
static int lines = 7;
ImGui::SliderInt("Lines", &lines, 1, 15);
ImGui::PushStyleVar(ImGuiStyleVar_FrameRounding, 3.0f);
@@ -1872,20 +2337,112 @@ static void ShowDemoWindowLayout()
ImGui::PopID();
}
}
- float scroll_x = ImGui::GetScrollX(), scroll_max_x = ImGui::GetScrollMaxX();
+ float scroll_x = ImGui::GetScrollX();
+ float scroll_max_x = ImGui::GetScrollMaxX();
ImGui::EndChild();
ImGui::PopStyleVar(2);
float scroll_x_delta = 0.0f;
- ImGui::SmallButton("<<"); if (ImGui::IsItemActive()) scroll_x_delta = -ImGui::GetIO().DeltaTime * 1000.0f; ImGui::SameLine();
+ ImGui::SmallButton("<<"); if (ImGui::IsItemActive()) { scroll_x_delta = -ImGui::GetIO().DeltaTime * 1000.0f; } ImGui::SameLine();
ImGui::Text("Scroll from code"); ImGui::SameLine();
- ImGui::SmallButton(">>"); if (ImGui::IsItemActive()) scroll_x_delta = +ImGui::GetIO().DeltaTime * 1000.0f; ImGui::SameLine();
+ ImGui::SmallButton(">>"); if (ImGui::IsItemActive()) { scroll_x_delta = +ImGui::GetIO().DeltaTime * 1000.0f; } ImGui::SameLine();
ImGui::Text("%.0f/%.0f", scroll_x, scroll_max_x);
if (scroll_x_delta != 0.0f)
{
ImGui::BeginChild("scrolling"); // Demonstrate a trick: you can use Begin to set yourself in the context of another window (here we are already out of your child window)
ImGui::SetScrollX(ImGui::GetScrollX() + scroll_x_delta);
+ ImGui::EndChild();
+ }
+ ImGui::Spacing();
+
+ static bool show_horizontal_contents_size_demo_window = false;
+ ImGui::Checkbox("Show Horizontal contents size demo window", &show_horizontal_contents_size_demo_window);
+
+ if (show_horizontal_contents_size_demo_window)
+ {
+ static bool show_h_scrollbar = true;
+ static bool show_button = true;
+ static bool show_tree_nodes = true;
+ static bool show_text_wrapped = false;
+ static bool show_columns = true;
+ static bool show_tab_bar = true;
+ static bool show_child = false;
+ static bool explicit_content_size = false;
+ static float contents_size_x = 300.0f;
+ if (explicit_content_size)
+ ImGui::SetNextWindowContentSize(ImVec2(contents_size_x, 0.0f));
+ ImGui::Begin("Horizontal contents size demo window", &show_horizontal_contents_size_demo_window, show_h_scrollbar ? ImGuiWindowFlags_HorizontalScrollbar : 0);
+ ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(2, 0));
+ ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2, 0));
+ HelpMarker("Test of different widgets react and impact the work rectangle growing when horizontal scrolling is enabled.\n\nUse 'Metrics->Tools->Show windows rectangles' to visualize rectangles.");
+ ImGui::Checkbox("H-scrollbar", &show_h_scrollbar);
+ ImGui::Checkbox("Button", &show_button); // Will grow contents size (unless explicitly overwritten)
+ ImGui::Checkbox("Tree nodes", &show_tree_nodes); // Will grow contents size and display highlight over full width
+ ImGui::Checkbox("Text wrapped", &show_text_wrapped);// Will grow and use contents size
+ ImGui::Checkbox("Columns", &show_columns); // Will use contents size
+ ImGui::Checkbox("Tab bar", &show_tab_bar); // Will use contents size
+ ImGui::Checkbox("Child", &show_child); // Will grow and use contents size
+ ImGui::Checkbox("Explicit content size", &explicit_content_size);
+ ImGui::Text("Scroll %.1f/%.1f %.1f/%.1f", ImGui::GetScrollX(), ImGui::GetScrollMaxX(), ImGui::GetScrollY(), ImGui::GetScrollMaxY());
+ if (explicit_content_size)
+ {
+ ImGui::SameLine();
+ ImGui::SetNextItemWidth(100);
+ ImGui::DragFloat("##csx", &contents_size_x);
+ ImVec2 p = ImGui::GetCursorScreenPos();
+ ImGui::GetWindowDrawList()->AddRectFilled(p, ImVec2(p.x + 10, p.y + 10), IM_COL32_WHITE);
+ ImGui::GetWindowDrawList()->AddRectFilled(ImVec2(p.x + contents_size_x - 10, p.y), ImVec2(p.x + contents_size_x, p.y + 10), IM_COL32_WHITE);
+ ImGui::Dummy(ImVec2(0, 10));
+ }
+ ImGui::PopStyleVar(2);
+ ImGui::Separator();
+ if (show_button)
+ {
+ ImGui::Button("this is a 300-wide button", ImVec2(300, 0));
+ }
+ if (show_tree_nodes)
+ {
+ bool open = true;
+ if (ImGui::TreeNode("this is a tree node"))
+ {
+ if (ImGui::TreeNode("another one of those tree node..."))
+ {
+ ImGui::Text("Some tree contents");
+ ImGui::TreePop();
+ }
+ ImGui::TreePop();
+ }
+ ImGui::CollapsingHeader("CollapsingHeader", &open);
+ }
+ if (show_text_wrapped)
+ {
+ ImGui::TextWrapped("This text should automatically wrap on the edge of the work rectangle.");
+ }
+ if (show_columns)
+ {
+ ImGui::Columns(4);
+ for (int n = 0; n < 4; n++)
+ {
+ ImGui::Text("Width %.2f", ImGui::GetColumnWidth());
+ ImGui::NextColumn();
+ }
+ ImGui::Columns(1);
+ }
+ if (show_tab_bar && ImGui::BeginTabBar("Hello"))
+ {
+ if (ImGui::BeginTabItem("OneOneOne")) { ImGui::EndTabItem(); }
+ if (ImGui::BeginTabItem("TwoTwoTwo")) { ImGui::EndTabItem(); }
+ if (ImGui::BeginTabItem("ThreeThreeThree")) { ImGui::EndTabItem(); }
+ if (ImGui::BeginTabItem("FourFourFour")) { ImGui::EndTabItem(); }
+ ImGui::EndTabBar();
+ }
+ if (show_child)
+ {
+ ImGui::BeginChild("child", ImVec2(0,0), true);
+ ImGui::EndChild();
+ }
ImGui::End();
}
+
ImGui::TreePop();
}
@@ -1893,12 +2450,12 @@ static void ShowDemoWindowLayout()
{
static ImVec2 size(100, 100), offset(50, 20);
ImGui::TextWrapped("On a per-widget basis we are occasionally clipping text CPU-side if it won't fit in its frame. Otherwise we are doing coarser clipping + passing a scissor rectangle to the renderer. The system is designed to try minimizing both execution and CPU/GPU rendering cost.");
- ImGui::DragFloat2("size", (float*)&size, 0.5f, 0.0f, 200.0f, "%.0f");
+ ImGui::DragFloat2("size", (float*)&size, 0.5f, 1.0f, 200.0f, "%.0f");
ImGui::TextWrapped("(Click and drag)");
ImVec2 pos = ImGui::GetCursorScreenPos();
ImVec4 clip_rect(pos.x, pos.y, pos.x + size.x, pos.y + size.y);
ImGui::InvisibleButton("##dummy", size);
- if (ImGui::IsItemActive() && ImGui::IsMouseDragging()) { offset.x += ImGui::GetIO().MouseDelta.x; offset.y += ImGui::GetIO().MouseDelta.y; }
+ if (ImGui::IsItemActive() && ImGui::IsMouseDragging(0)) { offset.x += ImGui::GetIO().MouseDelta.x; offset.y += ImGui::GetIO().MouseDelta.y; }
ImGui::GetWindowDrawList()->AddRectFilled(pos, ImVec2(pos.x + size.x, pos.y + size.y), IM_COL32(90, 90, 120, 255));
ImGui::GetWindowDrawList()->AddText(ImGui::GetFont(), ImGui::GetFontSize()*2.0f, ImVec2(pos.x + offset.x, pos.y + offset.y), IM_COL32(255, 255, 255, 255), "Line 1 hello\nLine 2 clip me!", NULL, 0.0f, &clip_rect);
ImGui::TreePop();
@@ -1910,12 +2467,13 @@ static void ShowDemoWindowPopups()
if (!ImGui::CollapsingHeader("Popups & Modal windows"))
return;
- // Popups are windows with a few special properties:
+ // The properties of popups windows are:
// - They block normal mouse hovering detection outside them. (*)
// - Unless modal, they can be closed by clicking anywhere outside them, or by pressing ESCAPE.
- // - Their visibility state (~bool) is held internally by imgui instead of being held by the programmer as we are used to with regular Begin() calls.
+ // - Their visibility state (~bool) is held internally by Dear ImGui instead of being held by the programmer as we are used to with regular Begin() calls.
+ // User can manipulate the visibility state by calling OpenPopup().
// (*) One can use IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup) to bypass it and detect hovering even when normally blocked by a popup.
- // Those three properties are intimately connected. The library needs to hold their visibility state because it can close popups at any time.
+ // Those three properties are connected. The library needs to hold their visibility state because it can close popups at any time.
// Typical use for regular windows:
// bool my_tool_is_active = false; if (ImGui::Button("Open")) my_tool_is_active = true; [...] if (my_tool_is_active) Begin("My Tool", &my_tool_is_active) { [...] } End();
@@ -1923,7 +2481,7 @@ static void ShowDemoWindowPopups()
// if (ImGui::Button("Open")) ImGui::OpenPopup("MyPopup"); if (ImGui::BeginPopup("MyPopup") { [...] EndPopup(); }
// With popups we have to go through a library call (here OpenPopup) to manipulate the visibility state.
- // This may be a bit confusing at first but it should quickly make sense. Follow on the examples below.
+ // This may be a bit confusing at first but it should quickly make sense. Follow on the examples below.
if (ImGui::TreeNode("Popups"))
{
@@ -1976,6 +2534,13 @@ static void ShowDemoWindowPopups()
if (ImGui::BeginMenu("Sub-menu"))
{
ImGui::MenuItem("Click me");
+ if (ImGui::Button("Stacked Popup"))
+ ImGui::OpenPopup("another popup");
+ if (ImGui::BeginPopup("another popup"))
+ {
+ ImGui::Text("I am the last one here.");
+ ImGui::EndPopup();
+ }
ImGui::EndMenu();
}
ImGui::EndPopup();
@@ -2008,18 +2573,17 @@ static void ShowDemoWindowPopups()
{
if (ImGui::Selectable("Set to zero")) value = 0.0f;
if (ImGui::Selectable("Set to PI")) value = 3.1415f;
- ImGui::PushItemWidth(-1);
+ ImGui::SetNextItemWidth(-1);
ImGui::DragFloat("##Value", &value, 0.1f, 0.0f, 0.0f);
- ImGui::PopItemWidth();
ImGui::EndPopup();
}
// We can also use OpenPopupOnItemClick() which is the same as BeginPopupContextItem() but without the Begin call.
// So here we will make it that clicking on the text field with the right mouse button (1) will toggle the visibility of the popup above.
- ImGui::Text("(You can also right-click me to the same popup as above.)");
+ ImGui::Text("(You can also right-click me to open the same popup as above.)");
ImGui::OpenPopupOnItemClick("item context menu", 1);
- // When used after an item that has an ID (here the Button), we can skip providing an ID to BeginPopupContextItem().
+ // When used after an item that has an ID (here the Button), we can skip providing an ID to BeginPopupContextItem().
// BeginPopupContextItem() will use the last item ID as the popup ID.
// In addition here, we want to include your editable label inside the button label. We use the ### operator to override the ID (read FAQ about ID for details)
static char name[32] = "Label1";
@@ -2044,6 +2608,7 @@ static void ShowDemoWindowPopups()
if (ImGui::Button("Delete.."))
ImGui::OpenPopup("Delete?");
+
if (ImGui::BeginPopupModal("Delete?", NULL, ImGuiWindowFlags_AlwaysAutoResize))
{
ImGui::Text("All those beautiful files will be deleted.\nThis operation cannot be undone!\n\n");
@@ -2066,17 +2631,32 @@ static void ShowDemoWindowPopups()
if (ImGui::Button("Stacked modals.."))
ImGui::OpenPopup("Stacked 1");
- if (ImGui::BeginPopupModal("Stacked 1"))
+ if (ImGui::BeginPopupModal("Stacked 1", NULL, ImGuiWindowFlags_MenuBar))
{
+ if (ImGui::BeginMenuBar())
+ {
+ if (ImGui::BeginMenu("File"))
+ {
+ if (ImGui::MenuItem("Dummy menu item")) {}
+ ImGui::EndMenu();
+ }
+ ImGui::EndMenuBar();
+ }
ImGui::Text("Hello from Stacked The First\nUsing style.Colors[ImGuiCol_ModalWindowDimBg] behind it.");
+
+ // Testing behavior of widgets stacking their own regular popups over the modal.
static int item = 1;
- ImGui::Combo("Combo", &item, "aaaa\0bbbb\0cccc\0dddd\0eeee\0\0");
static float color[4] = { 0.4f,0.7f,0.0f,0.5f };
- ImGui::ColorEdit4("color", color); // This is to test behavior of stacked regular popups over a modal
+ ImGui::Combo("Combo", &item, "aaaa\0bbbb\0cccc\0dddd\0eeee\0\0");
+ ImGui::ColorEdit4("color", color);
if (ImGui::Button("Add another modal.."))
ImGui::OpenPopup("Stacked 2");
- if (ImGui::BeginPopupModal("Stacked 2"))
+
+ // Also demonstrate passing a bool* to BeginPopupModal(), this will create a regular close button which will close the popup.
+ // Note that the visibility state of popups is owned by imgui, so the input value of the bool actually doesn't matter here.
+ bool dummy_open = true;
+ if (ImGui::BeginPopupModal("Stacked 2", &dummy_open))
{
ImGui::Text("Hello from Stacked The Second!");
if (ImGui::Button("Close"))
@@ -2119,6 +2699,13 @@ static void ShowDemoWindowColumns()
ImGui::PushID("Columns");
+ static bool disable_indent = false;
+ ImGui::Checkbox("Disable tree indentation", &disable_indent);
+ ImGui::SameLine();
+ HelpMarker("Disable the indenting of tree nodes so demo columns can use the full window width.");
+ if (disable_indent)
+ ImGui::PushStyleVar(ImGuiStyleVar_IndentSpacing, 0.0f);
+
// Basic columns
if (ImGui::TreeNode("Basic"))
{
@@ -2130,7 +2717,7 @@ static void ShowDemoWindowColumns()
char label[32];
sprintf(label, "Item %d", n);
if (ImGui::Selectable(label)) {}
- //if (ImGui::Button(label, ImVec2(-1,0))) {}
+ //if (ImGui::Button(label, ImVec2(-FLT_MIN,0.0f))) {}
ImGui::NextColumn();
}
ImGui::Columns(1);
@@ -2164,6 +2751,40 @@ static void ShowDemoWindowColumns()
ImGui::TreePop();
}
+ if (ImGui::TreeNode("Borders"))
+ {
+ // NB: Future columns API should allow automatic horizontal borders.
+ static bool h_borders = true;
+ static bool v_borders = true;
+ static int columns_count = 4;
+ const int lines_count = 3;
+ ImGui::SetNextItemWidth(ImGui::GetFontSize() * 8);
+ ImGui::DragInt("##columns_count", &columns_count, 0.1f, 2, 10, "%d columns");
+ if (columns_count < 2)
+ columns_count = 2;
+ ImGui::SameLine();
+ ImGui::Checkbox("horizontal", &h_borders);
+ ImGui::SameLine();
+ ImGui::Checkbox("vertical", &v_borders);
+ ImGui::Columns(columns_count, NULL, v_borders);
+ for (int i = 0; i < columns_count * lines_count; i++)
+ {
+ if (h_borders && ImGui::GetColumnIndex() == 0)
+ ImGui::Separator();
+ ImGui::Text("%c%c%c", 'a' + i, 'a' + i, 'a' + i);
+ ImGui::Text("Width %.2f", ImGui::GetColumnWidth());
+ ImGui::Text("Avail %.2f", ImGui::GetContentRegionAvail().x);
+ ImGui::Text("Offset %.2f", ImGui::GetColumnOffset());
+ ImGui::Text("Long text that is likely to clip");
+ ImGui::Button("Button", ImVec2(-FLT_MIN, 0.0f));
+ ImGui::NextColumn();
+ }
+ ImGui::Columns(1);
+ if (h_borders)
+ ImGui::Separator();
+ ImGui::TreePop();
+ }
+
// Create multiple items in a same cell before switching to next column
if (ImGui::TreeNode("Mixed items"))
{
@@ -2210,29 +2831,6 @@ static void ShowDemoWindowColumns()
ImGui::TreePop();
}
- if (ImGui::TreeNode("Borders"))
- {
- // NB: Future columns API should allow automatic horizontal borders.
- static bool h_borders = true;
- static bool v_borders = true;
- ImGui::Checkbox("horizontal", &h_borders);
- ImGui::SameLine();
- ImGui::Checkbox("vertical", &v_borders);
- ImGui::Columns(4, NULL, v_borders);
- for (int i = 0; i < 4*3; i++)
- {
- if (h_borders && ImGui::GetColumnIndex() == 0)
- ImGui::Separator();
- ImGui::Text("%c%c%c", 'a'+i, 'a'+i, 'a'+i);
- ImGui::Text("Width %.2f\nOffset %.2f", ImGui::GetColumnWidth(), ImGui::GetColumnOffset());
- ImGui::NextColumn();
- }
- ImGui::Columns(1);
- if (h_borders)
- ImGui::Separator();
- ImGui::TreePop();
- }
-
// Scrolling columns
/*
if (ImGui::TreeNode("Vertical Scrolling"))
@@ -2280,18 +2878,44 @@ static void ShowDemoWindowColumns()
ImGui::TreePop();
}
- bool node_open = ImGui::TreeNode("Tree within single cell");
- ImGui::SameLine(); ShowHelpMarker("NB: Tree node must be poped before ending the cell. There's no storage of state per-cell.");
- if (node_open)
+ if (ImGui::TreeNode("Tree"))
{
- ImGui::Columns(2, "tree items");
- ImGui::Separator();
- if (ImGui::TreeNode("Hello")) { ImGui::BulletText("Sailor"); ImGui::TreePop(); } ImGui::NextColumn();
- if (ImGui::TreeNode("Bonjour")) { ImGui::BulletText("Marin"); ImGui::TreePop(); } ImGui::NextColumn();
+ ImGui::Columns(2, "tree", true);
+ for (int x = 0; x < 3; x++)
+ {
+ bool open1 = ImGui::TreeNode((void*)(intptr_t)x, "Node%d", x);
+ ImGui::NextColumn();
+ ImGui::Text("Node contents");
+ ImGui::NextColumn();
+ if (open1)
+ {
+ for (int y = 0; y < 3; y++)
+ {
+ bool open2 = ImGui::TreeNode((void*)(intptr_t)y, "Node%d.%d", x, y);
+ ImGui::NextColumn();
+ ImGui::Text("Node contents");
+ if (open2)
+ {
+ ImGui::Text("Even more contents");
+ if (ImGui::TreeNode("Tree in column"))
+ {
+ ImGui::Text("The quick brown fox jumps over the lazy dog");
+ ImGui::TreePop();
+ }
+ }
+ ImGui::NextColumn();
+ if (open2)
+ ImGui::TreePop();
+ }
+ ImGui::TreePop();
+ }
+ }
ImGui::Columns(1);
- ImGui::Separator();
ImGui::TreePop();
}
+
+ if (disable_indent)
+ ImGui::PopStyleVar();
ImGui::PopID();
}
@@ -2299,6 +2923,8 @@ static void ShowDemoWindowMisc()
{
if (ImGui::CollapsingHeader("Filtering"))
{
+ // Helper class to easy setup a text filter.
+ // You may want to implement a more feature-full filtering scheme in your own application.
static ImGuiTextFilter filter;
ImGui::Text("Filter usage:\n"
" \"\" display all lines\n"
@@ -2316,12 +2942,14 @@ static void ShowDemoWindowMisc()
{
ImGuiIO& io = ImGui::GetIO();
+ // Display ImGuiIO output flags
ImGui::Text("WantCaptureMouse: %d", io.WantCaptureMouse);
ImGui::Text("WantCaptureKeyboard: %d", io.WantCaptureKeyboard);
ImGui::Text("WantTextInput: %d", io.WantTextInput);
ImGui::Text("WantSetMousePos: %d", io.WantSetMousePos);
ImGui::Text("NavActive: %d, NavVisible: %d", io.NavActive, io.NavVisible);
+ // Display Keyboard/Mouse state
if (ImGui::TreeNode("Keyboard, Mouse & Navigation State"))
{
if (ImGui::IsMousePosValid())
@@ -2335,10 +2963,11 @@ static void ShowDemoWindowMisc()
ImGui::Text("Mouse released:"); for (int i = 0; i < IM_ARRAYSIZE(io.MouseDown); i++) if (ImGui::IsMouseReleased(i)) { ImGui::SameLine(); ImGui::Text("b%d", i); }
ImGui::Text("Mouse wheel: %.1f", io.MouseWheel);
- ImGui::Text("Keys down:"); for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++) if (io.KeysDownDuration[i] >= 0.0f) { ImGui::SameLine(); ImGui::Text("%d (%.02f secs)", i, io.KeysDownDuration[i]); }
- ImGui::Text("Keys pressed:"); for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++) if (ImGui::IsKeyPressed(i)) { ImGui::SameLine(); ImGui::Text("%d", i); }
- ImGui::Text("Keys release:"); for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++) if (ImGui::IsKeyReleased(i)) { ImGui::SameLine(); ImGui::Text("%d", i); }
+ ImGui::Text("Keys down:"); for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++) if (io.KeysDownDuration[i] >= 0.0f) { ImGui::SameLine(); ImGui::Text("%d (0x%X) (%.02f secs)", i, i, io.KeysDownDuration[i]); }
+ ImGui::Text("Keys pressed:"); for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++) if (ImGui::IsKeyPressed(i)) { ImGui::SameLine(); ImGui::Text("%d (0x%X)", i, i); }
+ ImGui::Text("Keys release:"); for (int i = 0; i < IM_ARRAYSIZE(io.KeysDown); i++) if (ImGui::IsKeyReleased(i)) { ImGui::SameLine(); ImGui::Text("%d (0x%X)", i, i); }
ImGui::Text("Keys mods: %s%s%s%s", io.KeyCtrl ? "CTRL " : "", io.KeyShift ? "SHIFT " : "", io.KeyAlt ? "ALT " : "", io.KeySuper ? "SUPER " : "");
+ ImGui::Text("Chars queue:"); for (int i = 0; i < io.InputQueueCharacters.Size; i++) { ImWchar c = io.InputQueueCharacters[i]; ImGui::SameLine(); ImGui::Text("\'%c\' (0x%04X)", (c > ' ' && c <= 255) ? (char)c : '?', c); } // FIXME: We should convert 'c' to UTF-8 here but the functions are not public.
ImGui::Text("NavInputs down:"); for (int i = 0; i < IM_ARRAYSIZE(io.NavInputs); i++) if (io.NavInputs[i] > 0.0f) { ImGui::SameLine(); ImGui::Text("[%d] %.2f", i, io.NavInputs[i]); }
ImGui::Text("NavInputs pressed:"); for (int i = 0; i < IM_ARRAYSIZE(io.NavInputs); i++) if (io.NavInputsDownDuration[i] == 0.0f) { ImGui::SameLine(); ImGui::Text("[%d]", i); }
@@ -2364,7 +2993,7 @@ static void ShowDemoWindowMisc()
ImGui::InputText("3", buf, IM_ARRAYSIZE(buf));
ImGui::PushAllowKeyboardFocus(false);
ImGui::InputText("4 (tab skip)", buf, IM_ARRAYSIZE(buf));
- //ImGui::SameLine(); ShowHelperMarker("Use ImGui::PushAllowKeyboardFocus(bool)\nto disable tabbing through certain widgets.");
+ //ImGui::SameLine(); HelpMarker("Use ImGui::PushAllowKeyboardFocus(bool)\nto disable tabbing through certain widgets.");
ImGui::PopAllowKeyboardFocus();
ImGui::InputText("5", buf, IM_ARRAYSIZE(buf));
ImGui::TreePop();
@@ -2400,9 +3029,9 @@ static void ShowDemoWindowMisc()
// Use >= 0 parameter to SetKeyboardFocusHere() to focus an upcoming item
static float f3[3] = { 0.0f, 0.0f, 0.0f };
int focus_ahead = -1;
- if (ImGui::Button("Focus on X")) focus_ahead = 0; ImGui::SameLine();
- if (ImGui::Button("Focus on Y")) focus_ahead = 1; ImGui::SameLine();
- if (ImGui::Button("Focus on Z")) focus_ahead = 2;
+ if (ImGui::Button("Focus on X")) { focus_ahead = 0; } ImGui::SameLine();
+ if (ImGui::Button("Focus on Y")) { focus_ahead = 1; } ImGui::SameLine();
+ if (ImGui::Button("Focus on Z")) { focus_ahead = 2; }
if (focus_ahead != -1) ImGui::SetKeyboardFocusHere(focus_ahead);
ImGui::SliderFloat3("Float3", &f3[0], 0.0f, 1.0f);
@@ -2416,33 +3045,28 @@ static void ShowDemoWindowMisc()
for (int button = 0; button < 3; button++)
ImGui::Text("IsMouseDragging(%d):\n w/ default threshold: %d,\n w/ zero threshold: %d\n w/ large threshold: %d",
button, ImGui::IsMouseDragging(button), ImGui::IsMouseDragging(button, 0.0f), ImGui::IsMouseDragging(button, 20.0f));
+
ImGui::Button("Drag Me");
if (ImGui::IsItemActive())
- {
- // Draw a line between the button and the mouse cursor
- ImDrawList* draw_list = ImGui::GetWindowDrawList();
- draw_list->PushClipRectFullScreen();
- draw_list->AddLine(io.MouseClickedPos[0], io.MousePos, ImGui::GetColorU32(ImGuiCol_Button), 4.0f);
- draw_list->PopClipRect();
-
- // Drag operations gets "unlocked" when the mouse has moved past a certain threshold (the default threshold is stored in io.MouseDragThreshold)
- // You can request a lower or higher threshold using the second parameter of IsMouseDragging() and GetMouseDragDelta()
- ImVec2 value_raw = ImGui::GetMouseDragDelta(0, 0.0f);
- ImVec2 value_with_lock_threshold = ImGui::GetMouseDragDelta(0);
- ImVec2 mouse_delta = io.MouseDelta;
- ImGui::SameLine(); ImGui::Text("Raw (%.1f, %.1f), WithLockThresold (%.1f, %.1f), MouseDelta (%.1f, %.1f)", value_raw.x, value_raw.y, value_with_lock_threshold.x, value_with_lock_threshold.y, mouse_delta.x, mouse_delta.y);
- }
+ ImGui::GetForegroundDrawList()->AddLine(io.MouseClickedPos[0], io.MousePos, ImGui::GetColorU32(ImGuiCol_Button), 4.0f); // Draw a line between the button and the mouse cursor
+
+ // Drag operations gets "unlocked" when the mouse has moved past a certain threshold (the default threshold is stored in io.MouseDragThreshold)
+ // You can request a lower or higher threshold using the second parameter of IsMouseDragging() and GetMouseDragDelta()
+ ImVec2 value_raw = ImGui::GetMouseDragDelta(0, 0.0f);
+ ImVec2 value_with_lock_threshold = ImGui::GetMouseDragDelta(0);
+ ImVec2 mouse_delta = io.MouseDelta;
+ ImGui::Text("GetMouseDragDelta(0):\n w/ default threshold: (%.1f, %.1f),\n w/ zero threshold: (%.1f, %.1f)\nMouseDelta: (%.1f, %.1f)", value_with_lock_threshold.x, value_with_lock_threshold.y, value_raw.x, value_raw.y, mouse_delta.x, mouse_delta.y);
ImGui::TreePop();
}
if (ImGui::TreeNode("Mouse cursors"))
{
- const char* mouse_cursors_names[] = { "Arrow", "TextInput", "Move", "ResizeNS", "ResizeEW", "ResizeNESW", "ResizeNWSE", "Hand" };
+ const char* mouse_cursors_names[] = { "Arrow", "TextInput", "ResizeAll", "ResizeNS", "ResizeEW", "ResizeNESW", "ResizeNWSE", "Hand", "NotAllowed" };
IM_ASSERT(IM_ARRAYSIZE(mouse_cursors_names) == ImGuiMouseCursor_COUNT);
ImGui::Text("Current mouse cursor = %d: %s", ImGui::GetMouseCursor(), mouse_cursors_names[ImGui::GetMouseCursor()]);
ImGui::Text("Hover to see mouse cursors:");
- ImGui::SameLine(); ShowHelpMarker("Your application can render a different mouse cursor based on what ImGui::GetMouseCursor() returns. If software cursor rendering (io.MouseDrawCursor) is set ImGui will draw the right cursor for you, otherwise your backend needs to handle it.");
+ ImGui::SameLine(); HelpMarker("Your application can render a different mouse cursor based on what ImGui::GetMouseCursor() returns. If software cursor rendering (io.MouseDrawCursor) is set ImGui will draw the right cursor for you, otherwise your backend needs to handle it.");
for (int i = 0; i < ImGuiMouseCursor_COUNT; i++)
{
char label[32];
@@ -2457,8 +3081,149 @@ static void ShowDemoWindowMisc()
}
//-----------------------------------------------------------------------------
+// [SECTION] About Window / ShowAboutWindow()
+// Access from Dear ImGui Demo -> Tools -> About
+//-----------------------------------------------------------------------------
+
+void ImGui::ShowAboutWindow(bool* p_open)
+{
+ if (!ImGui::Begin("About Dear ImGui", p_open, ImGuiWindowFlags_AlwaysAutoResize))
+ {
+ ImGui::End();
+ return;
+ }
+ ImGui::Text("Dear ImGui %s", ImGui::GetVersion());
+ ImGui::Separator();
+ ImGui::Text("By Omar Cornut and all Dear ImGui contributors.");
+ ImGui::Text("Dear ImGui is licensed under the MIT License, see LICENSE for more information.");
+
+ static bool show_config_info = false;
+ ImGui::Checkbox("Config/Build Information", &show_config_info);
+ if (show_config_info)
+ {
+ ImGuiIO& io = ImGui::GetIO();
+ ImGuiStyle& style = ImGui::GetStyle();
+
+ bool copy_to_clipboard = ImGui::Button("Copy to clipboard");
+ ImGui::BeginChildFrame(ImGui::GetID("cfginfos"), ImVec2(0, ImGui::GetTextLineHeightWithSpacing() * 18), ImGuiWindowFlags_NoMove);
+ if (copy_to_clipboard)
+ {
+ ImGui::LogToClipboard();
+ ImGui::LogText("```\n"); // Back quotes will make the text appears without formatting when pasting to GitHub
+ }
+
+ ImGui::Text("Dear ImGui %s (%d)", IMGUI_VERSION, IMGUI_VERSION_NUM);
+ ImGui::Separator();
+ ImGui::Text("sizeof(size_t): %d, sizeof(ImDrawIdx): %d, sizeof(ImDrawVert): %d", (int)sizeof(size_t), (int)sizeof(ImDrawIdx), (int)sizeof(ImDrawVert));
+ ImGui::Text("define: __cplusplus=%d", (int)__cplusplus);
+#ifdef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+ ImGui::Text("define: IMGUI_DISABLE_OBSOLETE_FUNCTIONS");
+#endif
+#ifdef IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS
+ ImGui::Text("define: IMGUI_DISABLE_WIN32_DEFAULT_CLIPBOARD_FUNCTIONS");
+#endif
+#ifdef IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS
+ ImGui::Text("define: IMGUI_DISABLE_WIN32_DEFAULT_IME_FUNCTIONS");
+#endif
+#ifdef IMGUI_DISABLE_WIN32_FUNCTIONS
+ ImGui::Text("define: IMGUI_DISABLE_WIN32_FUNCTIONS");
+#endif
+#ifdef IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS
+ ImGui::Text("define: IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS");
+#endif
+#ifdef IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS
+ ImGui::Text("define: IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS");
+#endif
+#ifdef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS
+ ImGui::Text("define: IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS");
+#endif
+#ifdef IMGUI_DISABLE_FILE_FUNCTIONS
+ ImGui::Text("define: IMGUI_DISABLE_FILE_FUNCTIONS");
+#endif
+#ifdef IMGUI_DISABLE_DEFAULT_ALLOCATORS
+ ImGui::Text("define: IMGUI_DISABLE_DEFAULT_ALLOCATORS");
+#endif
+#ifdef IMGUI_USE_BGRA_PACKED_COLOR
+ ImGui::Text("define: IMGUI_USE_BGRA_PACKED_COLOR");
+#endif
+#ifdef _WIN32
+ ImGui::Text("define: _WIN32");
+#endif
+#ifdef _WIN64
+ ImGui::Text("define: _WIN64");
+#endif
+#ifdef __linux__
+ ImGui::Text("define: __linux__");
+#endif
+#ifdef __APPLE__
+ ImGui::Text("define: __APPLE__");
+#endif
+#ifdef _MSC_VER
+ ImGui::Text("define: _MSC_VER=%d", _MSC_VER);
+#endif
+#ifdef __MINGW32__
+ ImGui::Text("define: __MINGW32__");
+#endif
+#ifdef __MINGW64__
+ ImGui::Text("define: __MINGW64__");
+#endif
+#ifdef __GNUC__
+ ImGui::Text("define: __GNUC__=%d", (int)__GNUC__);
+#endif
+#ifdef __clang_version__
+ ImGui::Text("define: __clang_version__=%s", __clang_version__);
+#endif
+ ImGui::Separator();
+ ImGui::Text("io.BackendPlatformName: %s", io.BackendPlatformName ? io.BackendPlatformName : "NULL");
+ ImGui::Text("io.BackendRendererName: %s", io.BackendRendererName ? io.BackendRendererName : "NULL");
+ ImGui::Text("io.ConfigFlags: 0x%08X", io.ConfigFlags);
+ if (io.ConfigFlags & ImGuiConfigFlags_NavEnableKeyboard) ImGui::Text(" NavEnableKeyboard");
+ if (io.ConfigFlags & ImGuiConfigFlags_NavEnableGamepad) ImGui::Text(" NavEnableGamepad");
+ if (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) ImGui::Text(" NavEnableSetMousePos");
+ if (io.ConfigFlags & ImGuiConfigFlags_NavNoCaptureKeyboard) ImGui::Text(" NavNoCaptureKeyboard");
+ if (io.ConfigFlags & ImGuiConfigFlags_NoMouse) ImGui::Text(" NoMouse");
+ if (io.ConfigFlags & ImGuiConfigFlags_NoMouseCursorChange) ImGui::Text(" NoMouseCursorChange");
+ if (io.MouseDrawCursor) ImGui::Text("io.MouseDrawCursor");
+ if (io.ConfigMacOSXBehaviors) ImGui::Text("io.ConfigMacOSXBehaviors");
+ if (io.ConfigInputTextCursorBlink) ImGui::Text("io.ConfigInputTextCursorBlink");
+ if (io.ConfigWindowsResizeFromEdges) ImGui::Text("io.ConfigWindowsResizeFromEdges");
+ if (io.ConfigWindowsMoveFromTitleBarOnly) ImGui::Text("io.ConfigWindowsMoveFromTitleBarOnly");
+ if (io.ConfigWindowsMemoryCompactTimer >= 0.0f) ImGui::Text("io.ConfigWindowsMemoryCompactTimer = %.1ff", io.ConfigWindowsMemoryCompactTimer);
+ ImGui::Text("io.BackendFlags: 0x%08X", io.BackendFlags);
+ if (io.BackendFlags & ImGuiBackendFlags_HasGamepad) ImGui::Text(" HasGamepad");
+ if (io.BackendFlags & ImGuiBackendFlags_HasMouseCursors) ImGui::Text(" HasMouseCursors");
+ if (io.BackendFlags & ImGuiBackendFlags_HasSetMousePos) ImGui::Text(" HasSetMousePos");
+ if (io.BackendFlags & ImGuiBackendFlags_RendererHasVtxOffset) ImGui::Text(" RendererHasVtxOffset");
+ ImGui::Separator();
+ ImGui::Text("io.Fonts: %d fonts, Flags: 0x%08X, TexSize: %d,%d", io.Fonts->Fonts.Size, io.Fonts->Flags, io.Fonts->TexWidth, io.Fonts->TexHeight);
+ ImGui::Text("io.DisplaySize: %.2f,%.2f", io.DisplaySize.x, io.DisplaySize.y);
+ ImGui::Text("io.DisplayFramebufferScale: %.2f,%.2f", io.DisplayFramebufferScale.x, io.DisplayFramebufferScale.y);
+ ImGui::Separator();
+ ImGui::Text("style.WindowPadding: %.2f,%.2f", style.WindowPadding.x, style.WindowPadding.y);
+ ImGui::Text("style.WindowBorderSize: %.2f", style.WindowBorderSize);
+ ImGui::Text("style.FramePadding: %.2f,%.2f", style.FramePadding.x, style.FramePadding.y);
+ ImGui::Text("style.FrameRounding: %.2f", style.FrameRounding);
+ ImGui::Text("style.FrameBorderSize: %.2f", style.FrameBorderSize);
+ ImGui::Text("style.ItemSpacing: %.2f,%.2f", style.ItemSpacing.x, style.ItemSpacing.y);
+ ImGui::Text("style.ItemInnerSpacing: %.2f,%.2f", style.ItemInnerSpacing.x, style.ItemInnerSpacing.y);
+
+ if (copy_to_clipboard)
+ {
+ ImGui::LogText("\n```\n");
+ ImGui::LogFinish();
+ }
+ ImGui::EndChildFrame();
+ }
+ ImGui::End();
+}
+
+//-----------------------------------------------------------------------------
// [SECTION] Style Editor / ShowStyleEditor()
//-----------------------------------------------------------------------------
+// - ShowStyleSelector()
+// - ShowFontSelector()
+// - ShowStyleEditor()
+//-----------------------------------------------------------------------------
// Demo helper function to select among default colors. See ShowStyleEditor() for more advanced options.
// Here we use the simplified Combo() api that packs items into a single literal string. Useful for quick combo boxes where the choices are known locally.
@@ -2487,15 +3252,20 @@ void ImGui::ShowFontSelector(const char* label)
if (ImGui::BeginCombo(label, font_current->GetDebugName()))
{
for (int n = 0; n < io.Fonts->Fonts.Size; n++)
- if (ImGui::Selectable(io.Fonts->Fonts[n]->GetDebugName(), io.Fonts->Fonts[n] == font_current))
- io.FontDefault = io.Fonts->Fonts[n];
+ {
+ ImFont* font = io.Fonts->Fonts[n];
+ ImGui::PushID((void*)font);
+ if (ImGui::Selectable(font->GetDebugName(), font == font_current))
+ io.FontDefault = font;
+ ImGui::PopID();
+ }
ImGui::EndCombo();
}
ImGui::SameLine();
- ShowHelpMarker(
+ HelpMarker(
"- Load additional fonts with io.Fonts->AddFontFromFileTTF().\n"
"- The font atlas is built when calling io.Fonts->GetTexDataAsXXXX() or io.Fonts->Build().\n"
- "- Read FAQ and documentation in misc/fonts/ for more details.\n"
+ "- Read FAQ and docs/FONTS.txt for more details.\n"
"- If you need to add/remove fonts at runtime (e.g. for DPI change), do it before calling NewFrame().");
}
@@ -2535,188 +3305,213 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
if (ImGui::Button("Revert Ref"))
style = *ref;
ImGui::SameLine();
- ShowHelpMarker("Save/Revert in local non-persistent storage. Default Colors definition are not affected. Use \"Export Colors\" below to save them somewhere.");
-
- if (ImGui::TreeNode("Rendering"))
- {
- ImGui::Checkbox("Anti-aliased lines", &style.AntiAliasedLines); ImGui::SameLine(); ShowHelpMarker("When disabling anti-aliasing lines, you'll probably want to disable borders in your style as well.");
- ImGui::Checkbox("Anti-aliased fill", &style.AntiAliasedFill);
- ImGui::PushItemWidth(100);
- ImGui::DragFloat("Curve Tessellation Tolerance", &style.CurveTessellationTol, 0.02f, 0.10f, FLT_MAX, "%.2f", 2.0f);
- if (style.CurveTessellationTol < 0.10f) style.CurveTessellationTol = 0.10f;
- ImGui::DragFloat("Global Alpha", &style.Alpha, 0.005f, 0.20f, 1.0f, "%.2f"); // Not exposing zero here so user doesn't "lose" the UI (zero alpha clips all widgets). But application code could have a toggle to switch between zero and non-zero.
- ImGui::PopItemWidth();
- ImGui::TreePop();
- }
+ HelpMarker("Save/Revert in local non-persistent storage. Default Colors definition are not affected. Use \"Export\" below to save them somewhere.");
- if (ImGui::TreeNode("Settings"))
- {
- ImGui::SliderFloat2("WindowPadding", (float*)&style.WindowPadding, 0.0f, 20.0f, "%.0f");
- ImGui::SliderFloat("PopupRounding", &style.PopupRounding, 0.0f, 16.0f, "%.0f");
- ImGui::SliderFloat2("FramePadding", (float*)&style.FramePadding, 0.0f, 20.0f, "%.0f");
- ImGui::SliderFloat2("ItemSpacing", (float*)&style.ItemSpacing, 0.0f, 20.0f, "%.0f");
- ImGui::SliderFloat2("ItemInnerSpacing", (float*)&style.ItemInnerSpacing, 0.0f, 20.0f, "%.0f");
- ImGui::SliderFloat2("TouchExtraPadding", (float*)&style.TouchExtraPadding, 0.0f, 10.0f, "%.0f");
- ImGui::SliderFloat("IndentSpacing", &style.IndentSpacing, 0.0f, 30.0f, "%.0f");
- ImGui::SliderFloat("ScrollbarSize", &style.ScrollbarSize, 1.0f, 20.0f, "%.0f");
- ImGui::SliderFloat("GrabMinSize", &style.GrabMinSize, 1.0f, 20.0f, "%.0f");
- ImGui::Text("BorderSize");
- ImGui::SliderFloat("WindowBorderSize", &style.WindowBorderSize, 0.0f, 1.0f, "%.0f");
- ImGui::SliderFloat("ChildBorderSize", &style.ChildBorderSize, 0.0f, 1.0f, "%.0f");
- ImGui::SliderFloat("PopupBorderSize", &style.PopupBorderSize, 0.0f, 1.0f, "%.0f");
- ImGui::SliderFloat("FrameBorderSize", &style.FrameBorderSize, 0.0f, 1.0f, "%.0f");
- ImGui::Text("Rounding");
- ImGui::SliderFloat("WindowRounding", &style.WindowRounding, 0.0f, 14.0f, "%.0f");
- ImGui::SliderFloat("ChildRounding", &style.ChildRounding, 0.0f, 16.0f, "%.0f");
- ImGui::SliderFloat("FrameRounding", &style.FrameRounding, 0.0f, 12.0f, "%.0f");
- ImGui::SliderFloat("ScrollbarRounding", &style.ScrollbarRounding, 0.0f, 12.0f, "%.0f");
- ImGui::SliderFloat("GrabRounding", &style.GrabRounding, 0.0f, 12.0f, "%.0f");
- ImGui::Text("Alignment");
- ImGui::SliderFloat2("WindowTitleAlign", (float*)&style.WindowTitleAlign, 0.0f, 1.0f, "%.2f");
- ImGui::SliderFloat2("ButtonTextAlign", (float*)&style.ButtonTextAlign, 0.0f, 1.0f, "%.2f"); ImGui::SameLine(); ShowHelpMarker("Alignment applies when a button is larger than its text content.");
- ImGui::Text("Safe Area Padding"); ImGui::SameLine(); ShowHelpMarker("Adjust if you cannot see the edges of your screen (e.g. on a TV where scaling has not been configured).");
- ImGui::SliderFloat2("DisplaySafeAreaPadding", (float*)&style.DisplaySafeAreaPadding, 0.0f, 30.0f, "%.0f");
- ImGui::TreePop();
- }
+ ImGui::Separator();
- if (ImGui::TreeNode("Colors"))
+ if (ImGui::BeginTabBar("##tabs", ImGuiTabBarFlags_None))
{
- static int output_dest = 0;
- static bool output_only_modified = true;
- if (ImGui::Button("Export Unsaved"))
+ if (ImGui::BeginTabItem("Sizes"))
{
- if (output_dest == 0)
- ImGui::LogToClipboard();
- else
- ImGui::LogToTTY();
- ImGui::LogText("ImVec4* colors = ImGui::GetStyle().Colors;" IM_NEWLINE);
- for (int i = 0; i < ImGuiCol_COUNT; i++)
- {
- const ImVec4& col = style.Colors[i];
- const char* name = ImGui::GetStyleColorName(i);
- if (!output_only_modified || memcmp(&col, &ref->Colors[i], sizeof(ImVec4)) != 0)
- ImGui::LogText("colors[ImGuiCol_%s]%*s= ImVec4(%.2ff, %.2ff, %.2ff, %.2ff);" IM_NEWLINE, name, 23-(int)strlen(name), "", col.x, col.y, col.z, col.w);
- }
- ImGui::LogFinish();
+ ImGui::Text("Main");
+ ImGui::SliderFloat2("WindowPadding", (float*)&style.WindowPadding, 0.0f, 20.0f, "%.0f");
+ ImGui::SliderFloat2("FramePadding", (float*)&style.FramePadding, 0.0f, 20.0f, "%.0f");
+ ImGui::SliderFloat2("ItemSpacing", (float*)&style.ItemSpacing, 0.0f, 20.0f, "%.0f");
+ ImGui::SliderFloat2("ItemInnerSpacing", (float*)&style.ItemInnerSpacing, 0.0f, 20.0f, "%.0f");
+ ImGui::SliderFloat2("TouchExtraPadding", (float*)&style.TouchExtraPadding, 0.0f, 10.0f, "%.0f");
+ ImGui::SliderFloat("IndentSpacing", &style.IndentSpacing, 0.0f, 30.0f, "%.0f");
+ ImGui::SliderFloat("ScrollbarSize", &style.ScrollbarSize, 1.0f, 20.0f, "%.0f");
+ ImGui::SliderFloat("GrabMinSize", &style.GrabMinSize, 1.0f, 20.0f, "%.0f");
+ ImGui::Text("Borders");
+ ImGui::SliderFloat("WindowBorderSize", &style.WindowBorderSize, 0.0f, 1.0f, "%.0f");
+ ImGui::SliderFloat("ChildBorderSize", &style.ChildBorderSize, 0.0f, 1.0f, "%.0f");
+ ImGui::SliderFloat("PopupBorderSize", &style.PopupBorderSize, 0.0f, 1.0f, "%.0f");
+ ImGui::SliderFloat("FrameBorderSize", &style.FrameBorderSize, 0.0f, 1.0f, "%.0f");
+ ImGui::SliderFloat("TabBorderSize", &style.TabBorderSize, 0.0f, 1.0f, "%.0f");
+ ImGui::Text("Rounding");
+ ImGui::SliderFloat("WindowRounding", &style.WindowRounding, 0.0f, 12.0f, "%.0f");
+ ImGui::SliderFloat("ChildRounding", &style.ChildRounding, 0.0f, 12.0f, "%.0f");
+ ImGui::SliderFloat("FrameRounding", &style.FrameRounding, 0.0f, 12.0f, "%.0f");
+ ImGui::SliderFloat("PopupRounding", &style.PopupRounding, 0.0f, 12.0f, "%.0f");
+ ImGui::SliderFloat("ScrollbarRounding", &style.ScrollbarRounding, 0.0f, 12.0f, "%.0f");
+ ImGui::SliderFloat("GrabRounding", &style.GrabRounding, 0.0f, 12.0f, "%.0f");
+ ImGui::SliderFloat("TabRounding", &style.TabRounding, 0.0f, 12.0f, "%.0f");
+ ImGui::Text("Alignment");
+ ImGui::SliderFloat2("WindowTitleAlign", (float*)&style.WindowTitleAlign, 0.0f, 1.0f, "%.2f");
+ int window_menu_button_position = style.WindowMenuButtonPosition + 1;
+ if (ImGui::Combo("WindowMenuButtonPosition", (int*)&window_menu_button_position, "None\0Left\0Right\0"))
+ style.WindowMenuButtonPosition = window_menu_button_position - 1;
+ ImGui::Combo("ColorButtonPosition", (int*)&style.ColorButtonPosition, "Left\0Right\0");
+ ImGui::SliderFloat2("ButtonTextAlign", (float*)&style.ButtonTextAlign, 0.0f, 1.0f, "%.2f"); ImGui::SameLine(); HelpMarker("Alignment applies when a button is larger than its text content.");
+ ImGui::SliderFloat2("SelectableTextAlign", (float*)&style.SelectableTextAlign, 0.0f, 1.0f, "%.2f"); ImGui::SameLine(); HelpMarker("Alignment applies when a selectable is larger than its text content.");
+ ImGui::Text("Safe Area Padding"); ImGui::SameLine(); HelpMarker("Adjust if you cannot see the edges of your screen (e.g. on a TV where scaling has not been configured).");
+ ImGui::SliderFloat2("DisplaySafeAreaPadding", (float*)&style.DisplaySafeAreaPadding, 0.0f, 30.0f, "%.0f");
+ ImGui::EndTabItem();
}
- ImGui::SameLine(); ImGui::PushItemWidth(120); ImGui::Combo("##output_type", &output_dest, "To Clipboard\0To TTY\0"); ImGui::PopItemWidth();
- ImGui::SameLine(); ImGui::Checkbox("Only Modified Colors", &output_only_modified);
- ImGui::Text("Tip: Left-click on colored square to open color picker,\nRight-click to open edit options menu.");
+ if (ImGui::BeginTabItem("Colors"))
+ {
+ static int output_dest = 0;
+ static bool output_only_modified = true;
+ if (ImGui::Button("Export"))
+ {
+ if (output_dest == 0)
+ ImGui::LogToClipboard();
+ else
+ ImGui::LogToTTY();
+ ImGui::LogText("ImVec4* colors = ImGui::GetStyle().Colors;" IM_NEWLINE);
+ for (int i = 0; i < ImGuiCol_COUNT; i++)
+ {
+ const ImVec4& col = style.Colors[i];
+ const char* name = ImGui::GetStyleColorName(i);
+ if (!output_only_modified || memcmp(&col, &ref->Colors[i], sizeof(ImVec4)) != 0)
+ ImGui::LogText("colors[ImGuiCol_%s]%*s= ImVec4(%.2ff, %.2ff, %.2ff, %.2ff);" IM_NEWLINE, name, 23 - (int)strlen(name), "", col.x, col.y, col.z, col.w);
+ }
+ ImGui::LogFinish();
+ }
+ ImGui::SameLine(); ImGui::SetNextItemWidth(120); ImGui::Combo("##output_type", &output_dest, "To Clipboard\0To TTY\0");
+ ImGui::SameLine(); ImGui::Checkbox("Only Modified Colors", &output_only_modified);
- static ImGuiTextFilter filter;
- filter.Draw("Filter colors", 200);
+ static ImGuiTextFilter filter;
+ filter.Draw("Filter colors", ImGui::GetFontSize() * 16);
- static ImGuiColorEditFlags alpha_flags = 0;
- ImGui::RadioButton("Opaque", &alpha_flags, 0); ImGui::SameLine();
- ImGui::RadioButton("Alpha", &alpha_flags, ImGuiColorEditFlags_AlphaPreview); ImGui::SameLine();
- ImGui::RadioButton("Both", &alpha_flags, ImGuiColorEditFlags_AlphaPreviewHalf);
+ static ImGuiColorEditFlags alpha_flags = 0;
+ if (ImGui::RadioButton("Opaque", alpha_flags == 0)) { alpha_flags = 0; } ImGui::SameLine();
+ if (ImGui::RadioButton("Alpha", alpha_flags == ImGuiColorEditFlags_AlphaPreview)) { alpha_flags = ImGuiColorEditFlags_AlphaPreview; } ImGui::SameLine();
+ if (ImGui::RadioButton("Both", alpha_flags == ImGuiColorEditFlags_AlphaPreviewHalf)) { alpha_flags = ImGuiColorEditFlags_AlphaPreviewHalf; } ImGui::SameLine();
+ HelpMarker("In the color list:\nLeft-click on colored square to open color picker,\nRight-click to open edit options menu.");
- ImGui::BeginChild("#colors", ImVec2(0, 300), true, ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar | ImGuiWindowFlags_NavFlattened);
- ImGui::PushItemWidth(-160);
- for (int i = 0; i < ImGuiCol_COUNT; i++)
- {
- const char* name = ImGui::GetStyleColorName(i);
- if (!filter.PassFilter(name))
- continue;
- ImGui::PushID(i);
- ImGui::ColorEdit4("##color", (float*)&style.Colors[i], ImGuiColorEditFlags_AlphaBar | alpha_flags);
- if (memcmp(&style.Colors[i], &ref->Colors[i], sizeof(ImVec4)) != 0)
+ ImGui::BeginChild("##colors", ImVec2(0, 0), true, ImGuiWindowFlags_AlwaysVerticalScrollbar | ImGuiWindowFlags_AlwaysHorizontalScrollbar | ImGuiWindowFlags_NavFlattened);
+ ImGui::PushItemWidth(-160);
+ for (int i = 0; i < ImGuiCol_COUNT; i++)
{
- // Tips: in a real user application, you may want to merge and use an icon font into the main font, so instead of "Save"/"Revert" you'd use icons.
- // Read the FAQ and misc/fonts/README.txt about using icon fonts. It's really easy and super convenient!
- ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); if (ImGui::Button("Save")) ref->Colors[i] = style.Colors[i];
- ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); if (ImGui::Button("Revert")) style.Colors[i] = ref->Colors[i];
+ const char* name = ImGui::GetStyleColorName(i);
+ if (!filter.PassFilter(name))
+ continue;
+ ImGui::PushID(i);
+ ImGui::ColorEdit4("##color", (float*)&style.Colors[i], ImGuiColorEditFlags_AlphaBar | alpha_flags);
+ if (memcmp(&style.Colors[i], &ref->Colors[i], sizeof(ImVec4)) != 0)
+ {
+ // Tips: in a real user application, you may want to merge and use an icon font into the main font, so instead of "Save"/"Revert" you'd use icons.
+ // Read the FAQ and docs/FONTS.txt about using icon fonts. It's really easy and super convenient!
+ ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); if (ImGui::Button("Save")) ref->Colors[i] = style.Colors[i];
+ ImGui::SameLine(0.0f, style.ItemInnerSpacing.x); if (ImGui::Button("Revert")) style.Colors[i] = ref->Colors[i];
+ }
+ ImGui::SameLine(0.0f, style.ItemInnerSpacing.x);
+ ImGui::TextUnformatted(name);
+ ImGui::PopID();
}
- ImGui::SameLine(0.0f, style.ItemInnerSpacing.x);
- ImGui::TextUnformatted(name);
- ImGui::PopID();
- }
- ImGui::PopItemWidth();
- ImGui::EndChild();
-
- ImGui::TreePop();
- }
+ ImGui::PopItemWidth();
+ ImGui::EndChild();
- bool fonts_opened = ImGui::TreeNode("Fonts", "Fonts (%d)", ImGui::GetIO().Fonts->Fonts.Size);
- if (fonts_opened)
- {
- ImFontAtlas* atlas = ImGui::GetIO().Fonts;
- if (ImGui::TreeNode("Atlas texture", "Atlas texture (%dx%d pixels)", atlas->TexWidth, atlas->TexHeight))
- {
- ImGui::Image(atlas->TexID, ImVec2((float)atlas->TexWidth, (float)atlas->TexHeight), ImVec2(0,0), ImVec2(1,1), ImColor(255,255,255,255), ImColor(255,255,255,128));
- ImGui::TreePop();
+ ImGui::EndTabItem();
}
- ImGui::PushItemWidth(100);
- for (int i = 0; i < atlas->Fonts.Size; i++)
+
+ if (ImGui::BeginTabItem("Fonts"))
{
- ImFont* font = atlas->Fonts[i];
- ImGui::PushID(font);
- bool font_details_opened = ImGui::TreeNode(font, "Font %d: \'%s\', %.2f px, %d glyphs", i, font->ConfigData ? font->ConfigData[0].Name : "", font->FontSize, font->Glyphs.Size);
- ImGui::SameLine(); if (ImGui::SmallButton("Set as default")) ImGui::GetIO().FontDefault = font;
- if (font_details_opened)
+ ImGuiIO& io = ImGui::GetIO();
+ ImFontAtlas* atlas = io.Fonts;
+ HelpMarker("Read FAQ and docs/FONTS.txt for details on font loading.");
+ ImGui::PushItemWidth(120);
+ for (int i = 0; i < atlas->Fonts.Size; i++)
{
- ImGui::PushFont(font);
- ImGui::Text("The quick brown fox jumps over the lazy dog");
- ImGui::PopFont();
- ImGui::DragFloat("Font scale", &font->Scale, 0.005f, 0.3f, 2.0f, "%.1f"); // Scale only this font
- ImGui::SameLine(); ShowHelpMarker("Note than the default embedded font is NOT meant to be scaled.\n\nFont are currently rendered into bitmaps at a given size at the time of building the atlas. You may oversample them to get some flexibility with scaling. You can also render at multiple sizes and select which one to use at runtime.\n\n(Glimmer of hope: the atlas system should hopefully be rewritten in the future to make scaling more natural and automatic.)");
- ImGui::InputFloat("Font offset", &font->DisplayOffset.y, 1, 1, "%.0f");
- ImGui::Text("Ascent: %f, Descent: %f, Height: %f", font->Ascent, font->Descent, font->Ascent - font->Descent);
- ImGui::Text("Fallback character: '%c' (%d)", font->FallbackChar, font->FallbackChar);
- ImGui::Text("Texture surface: %d pixels (approx) ~ %dx%d", font->MetricsTotalSurface, (int)sqrtf((float)font->MetricsTotalSurface), (int)sqrtf((float)font->MetricsTotalSurface));
- for (int config_i = 0; config_i < font->ConfigDataCount; config_i++)
- if (ImFontConfig* cfg = &font->ConfigData[config_i])
- ImGui::BulletText("Input %d: \'%s\', Oversample: (%d,%d), PixelSnapH: %d", config_i, cfg->Name, cfg->OversampleH, cfg->OversampleV, cfg->PixelSnapH);
- if (ImGui::TreeNode("Glyphs", "Glyphs (%d)", font->Glyphs.Size))
+ ImFont* font = atlas->Fonts[i];
+ ImGui::PushID(font);
+ bool font_details_opened = ImGui::TreeNode(font, "Font %d: \"%s\"\n%.2f px, %d glyphs, %d file(s)", i, font->ConfigData ? font->ConfigData[0].Name : "", font->FontSize, font->Glyphs.Size, font->ConfigDataCount);
+ ImGui::SameLine(); if (ImGui::SmallButton("Set as default")) { io.FontDefault = font; }
+ if (font_details_opened)
{
- // Display all glyphs of the fonts in separate pages of 256 characters
- for (int base = 0; base < 0x10000; base += 256)
+ ImGui::PushFont(font);
+ ImGui::Text("The quick brown fox jumps over the lazy dog");
+ ImGui::PopFont();
+ ImGui::DragFloat("Font scale", &font->Scale, 0.005f, 0.3f, 2.0f, "%.1f"); // Scale only this font
+ ImGui::SameLine(); HelpMarker("Note than the default embedded font is NOT meant to be scaled.\n\nFont are currently rendered into bitmaps at a given size at the time of building the atlas. You may oversample them to get some flexibility with scaling. You can also render at multiple sizes and select which one to use at runtime.\n\n(Glimmer of hope: the atlas system should hopefully be rewritten in the future to make scaling more natural and automatic.)");
+ ImGui::InputFloat("Font offset", &font->DisplayOffset.y, 1, 1, "%.0f");
+ ImGui::Text("Ascent: %f, Descent: %f, Height: %f", font->Ascent, font->Descent, font->Ascent - font->Descent);
+ ImGui::Text("Fallback character: '%c' (U+%04X)", font->FallbackChar, font->FallbackChar);
+ ImGui::Text("Ellipsis character: '%c' (U+%04X)", font->EllipsisChar, font->EllipsisChar);
+ const float surface_sqrt = sqrtf((float)font->MetricsTotalSurface);
+ ImGui::Text("Texture Area: about %d px ~%dx%d px", font->MetricsTotalSurface, (int)surface_sqrt, (int)surface_sqrt);
+ for (int config_i = 0; config_i < font->ConfigDataCount; config_i++)
+ if (font->ConfigData)
+ if (const ImFontConfig* cfg = &font->ConfigData[config_i])
+ ImGui::BulletText("Input %d: \'%s\', Oversample: (%d,%d), PixelSnapH: %d", config_i, cfg->Name, cfg->OversampleH, cfg->OversampleV, cfg->PixelSnapH);
+ if (ImGui::TreeNode("Glyphs", "Glyphs (%d)", font->Glyphs.Size))
{
- int count = 0;
- for (int n = 0; n < 256; n++)
- count += font->FindGlyphNoFallback((ImWchar)(base + n)) ? 1 : 0;
- if (count > 0 && ImGui::TreeNode((void*)(intptr_t)base, "U+%04X..U+%04X (%d %s)", base, base+255, count, count > 1 ? "glyphs" : "glyph"))
+ // Display all glyphs of the fonts in separate pages of 256 characters
+ for (unsigned int base = 0; base <= IM_UNICODE_CODEPOINT_MAX; base += 256)
{
- float cell_size = font->FontSize * 1;
- float cell_spacing = style.ItemSpacing.y;
- ImVec2 base_pos = ImGui::GetCursorScreenPos();
- ImDrawList* draw_list = ImGui::GetWindowDrawList();
- for (int n = 0; n < 256; n++)
+ int count = 0;
+ for (unsigned int n = 0; n < 256; n++)
+ count += font->FindGlyphNoFallback((ImWchar)(base + n)) ? 1 : 0;
+ if (count > 0 && ImGui::TreeNode((void*)(intptr_t)base, "U+%04X..U+%04X (%d %s)", base, base + 255, count, count > 1 ? "glyphs" : "glyph"))
{
- ImVec2 cell_p1(base_pos.x + (n % 16) * (cell_size + cell_spacing), base_pos.y + (n / 16) * (cell_size + cell_spacing));
- ImVec2 cell_p2(cell_p1.x + cell_size, cell_p1.y + cell_size);
- const ImFontGlyph* glyph = font->FindGlyphNoFallback((ImWchar)(base+n));
- draw_list->AddRect(cell_p1, cell_p2, glyph ? IM_COL32(255,255,255,100) : IM_COL32(255,255,255,50));
- if (glyph)
- font->RenderChar(draw_list, cell_size, cell_p1, ImGui::GetColorU32(ImGuiCol_Text), (ImWchar)(base+n)); // We use ImFont::RenderChar as a shortcut because we don't have UTF-8 conversion functions available to generate a string.
- if (glyph && ImGui::IsMouseHoveringRect(cell_p1, cell_p2))
+ float cell_size = font->FontSize * 1;
+ float cell_spacing = style.ItemSpacing.y;
+ ImVec2 base_pos = ImGui::GetCursorScreenPos();
+ ImDrawList* draw_list = ImGui::GetWindowDrawList();
+ for (unsigned int n = 0; n < 256; n++)
{
- ImGui::BeginTooltip();
- ImGui::Text("Codepoint: U+%04X", base+n);
- ImGui::Separator();
- ImGui::Text("AdvanceX: %.1f", glyph->AdvanceX);
- ImGui::Text("Pos: (%.2f,%.2f)->(%.2f,%.2f)", glyph->X0, glyph->Y0, glyph->X1, glyph->Y1);
- ImGui::Text("UV: (%.3f,%.3f)->(%.3f,%.3f)", glyph->U0, glyph->V0, glyph->U1, glyph->V1);
- ImGui::EndTooltip();
+ ImVec2 cell_p1(base_pos.x + (n % 16) * (cell_size + cell_spacing), base_pos.y + (n / 16) * (cell_size + cell_spacing));
+ ImVec2 cell_p2(cell_p1.x + cell_size, cell_p1.y + cell_size);
+ const ImFontGlyph* glyph = font->FindGlyphNoFallback((ImWchar)(base + n));
+ draw_list->AddRect(cell_p1, cell_p2, glyph ? IM_COL32(255, 255, 255, 100) : IM_COL32(255, 255, 255, 50));
+ if (glyph)
+ font->RenderChar(draw_list, cell_size, cell_p1, ImGui::GetColorU32(ImGuiCol_Text), (ImWchar)(base + n)); // We use ImFont::RenderChar as a shortcut because we don't have UTF-8 conversion functions available to generate a string.
+ if (glyph && ImGui::IsMouseHoveringRect(cell_p1, cell_p2))
+ {
+ ImGui::BeginTooltip();
+ ImGui::Text("Codepoint: U+%04X", base + n);
+ ImGui::Separator();
+ ImGui::Text("AdvanceX: %.1f", glyph->AdvanceX);
+ ImGui::Text("Pos: (%.2f,%.2f)->(%.2f,%.2f)", glyph->X0, glyph->Y0, glyph->X1, glyph->Y1);
+ ImGui::Text("UV: (%.3f,%.3f)->(%.3f,%.3f)", glyph->U0, glyph->V0, glyph->U1, glyph->V1);
+ ImGui::EndTooltip();
+ }
}
+ ImGui::Dummy(ImVec2((cell_size + cell_spacing) * 16, (cell_size + cell_spacing) * 16));
+ ImGui::TreePop();
}
- ImGui::Dummy(ImVec2((cell_size + cell_spacing) * 16, (cell_size + cell_spacing) * 16));
- ImGui::TreePop();
}
+ ImGui::TreePop();
}
ImGui::TreePop();
}
+ ImGui::PopID();
+ }
+ if (ImGui::TreeNode("Atlas texture", "Atlas texture (%dx%d pixels)", atlas->TexWidth, atlas->TexHeight))
+ {
+ ImVec4 tint_col = ImVec4(1.0f, 1.0f, 1.0f, 1.0f);
+ ImVec4 border_col = ImVec4(1.0f, 1.0f, 1.0f, 0.5f);
+ ImGui::Image(atlas->TexID, ImVec2((float)atlas->TexWidth, (float)atlas->TexHeight), ImVec2(0, 0), ImVec2(1, 1), tint_col, border_col);
ImGui::TreePop();
}
- ImGui::PopID();
+
+ HelpMarker("Those are old settings provided for convenience.\nHowever, the _correct_ way of scaling your UI is currently to reload your font at the designed size, rebuild the font atlas, and call style.ScaleAllSizes() on a reference ImGuiStyle structure.");
+ static float window_scale = 1.0f;
+ if (ImGui::DragFloat("window scale", &window_scale, 0.005f, 0.3f, 2.0f, "%.2f")) // scale only this window
+ ImGui::SetWindowFontScale(window_scale);
+ ImGui::DragFloat("global scale", &io.FontGlobalScale, 0.005f, 0.3f, 2.0f, "%.2f"); // scale everything
+ ImGui::PopItemWidth();
+
+ ImGui::EndTabItem();
}
- static float window_scale = 1.0f;
- ImGui::DragFloat("this window scale", &window_scale, 0.005f, 0.3f, 2.0f, "%.1f"); // scale only this window
- ImGui::DragFloat("global scale", &ImGui::GetIO().FontGlobalScale, 0.005f, 0.3f, 2.0f, "%.1f"); // scale everything
- ImGui::PopItemWidth();
- ImGui::SetWindowFontScale(window_scale);
- ImGui::TreePop();
+
+ if (ImGui::BeginTabItem("Rendering"))
+ {
+ ImGui::Checkbox("Anti-aliased lines", &style.AntiAliasedLines); ImGui::SameLine(); HelpMarker("When disabling anti-aliasing lines, you'll probably want to disable borders in your style as well.");
+ ImGui::Checkbox("Anti-aliased fill", &style.AntiAliasedFill);
+ ImGui::PushItemWidth(100);
+ ImGui::DragFloat("Curve Tessellation Tolerance", &style.CurveTessellationTol, 0.02f, 0.10f, 10.0f, "%.2f");
+ if (style.CurveTessellationTol < 0.10f) style.CurveTessellationTol = 0.10f;
+ ImGui::DragFloat("Circle segment Max Error", &style.CircleSegmentMaxError, 0.01f, 0.10f, 10.0f, "%.2f");
+ ImGui::DragFloat("Global Alpha", &style.Alpha, 0.005f, 0.20f, 1.0f, "%.2f"); // Not exposing zero here so user doesn't "lose" the UI (zero alpha clips all widgets). But application code could have a toggle to switch between zero and non-zero.
+ ImGui::PopItemWidth();
+
+ ImGui::EndTabItem();
+ }
+
+ ImGui::EndTabBar();
}
ImGui::PopItemWidth();
@@ -2725,8 +3520,14 @@ void ImGui::ShowStyleEditor(ImGuiStyle* ref)
//-----------------------------------------------------------------------------
// [SECTION] Example App: Main Menu Bar / ShowExampleAppMainMenuBar()
//-----------------------------------------------------------------------------
+// - ShowExampleAppMainMenuBar()
+// - ShowExampleMenuFile()
+//-----------------------------------------------------------------------------
-// Demonstrate creating a fullscreen menu bar and populating it.
+// Demonstrate creating a "main" fullscreen menu bar and populating it.
+// Note the difference between BeginMainMenuBar() and BeginMenuBar():
+// - BeginMenuBar() = menu-bar inside current window we Begin()-ed into (the window needs the ImGuiWindowFlags_MenuBar flag)
+// - BeginMainMenuBar() = helper to create menu-bar-sized window at the top of the main viewport + call BeginMenuBar() into it.
static void ShowExampleAppMainMenuBar()
{
if (ImGui::BeginMainMenuBar())
@@ -2750,6 +3551,7 @@ static void ShowExampleAppMainMenuBar()
}
}
+// Note that shortcuts are currently provided for display only (future version will add flags to BeginMenu to process shortcuts)
static void ShowExampleMenuFile()
{
ImGui::MenuItem("(dummy menu)", NULL, false, false);
@@ -2825,10 +3627,12 @@ struct ExampleAppConsole
{
char InputBuf[256];
ImVector<char*> Items;
- bool ScrollToBottom;
+ ImVector<const char*> Commands;
ImVector<char*> History;
int HistoryPos; // -1: new line, 0..History.Size-1 browsing history.
- ImVector<const char*> Commands;
+ ImGuiTextFilter Filter;
+ bool AutoScroll;
+ bool ScrollToBottom;
ExampleAppConsole()
{
@@ -2839,6 +3643,8 @@ struct ExampleAppConsole
Commands.push_back("HISTORY");
Commands.push_back("CLEAR");
Commands.push_back("CLASSIFY"); // "classify" is only here to provide an example of "C"+[tab] completing to "CL" and displaying matches.
+ AutoScroll = true;
+ ScrollToBottom = false;
AddLog("Welcome to Dear ImGui!");
}
~ExampleAppConsole()
@@ -2851,7 +3657,7 @@ struct ExampleAppConsole
// Portable helpers
static int Stricmp(const char* str1, const char* str2) { int d; while ((d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; } return d; }
static int Strnicmp(const char* str1, const char* str2, int n) { int d = 0; while (n > 0 && (d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; n--; } return d; }
- static char* Strdup(const char *str) { size_t len = strlen(str) + 1; void* buff = malloc(len); return (char*)memcpy(buff, (const void*)str, len); }
+ static char* Strdup(const char *str) { size_t len = strlen(str) + 1; void* buf = malloc(len); IM_ASSERT(buf); return (char*)memcpy(buf, (const void*)str, len); }
static void Strtrim(char* str) { char* str_end = str + strlen(str); while (str_end > str && str_end[-1] == ' ') str_end--; *str_end = 0; }
void ClearLog()
@@ -2859,7 +3665,6 @@ struct ExampleAppConsole
for (int i = 0; i < Items.Size; i++)
free(Items[i]);
Items.clear();
- ScrollToBottom = true;
}
void AddLog(const char* fmt, ...) IM_FMTARGS(2)
@@ -2872,7 +3677,6 @@ struct ExampleAppConsole
buf[IM_ARRAYSIZE(buf)-1] = 0;
va_end(args);
Items.push_back(Strdup(buf));
- ScrollToBottom = true;
}
void Draw(const char* title, bool* p_open)
@@ -2898,19 +3702,26 @@ struct ExampleAppConsole
// TODO: display items starting from the bottom
- if (ImGui::SmallButton("Add Dummy Text")) { AddLog("%d some text", Items.Size); AddLog("some more text"); AddLog("display very important message here!"); } ImGui::SameLine();
+ if (ImGui::SmallButton("Add Dummy Text")) { AddLog("%d some text", Items.Size); AddLog("some more text"); AddLog("display very important message here!"); } ImGui::SameLine();
if (ImGui::SmallButton("Add Dummy Error")) { AddLog("[error] something went wrong"); } ImGui::SameLine();
if (ImGui::SmallButton("Clear")) { ClearLog(); } ImGui::SameLine();
- bool copy_to_clipboard = ImGui::SmallButton("Copy"); ImGui::SameLine();
- if (ImGui::SmallButton("Scroll to bottom")) ScrollToBottom = true;
+ bool copy_to_clipboard = ImGui::SmallButton("Copy");
//static float t = 0.0f; if (ImGui::GetTime() - t > 0.02f) { t = ImGui::GetTime(); AddLog("Spam %f", t); }
ImGui::Separator();
- ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(0,0));
- static ImGuiTextFilter filter;
- filter.Draw("Filter (\"incl,-excl\") (\"error\")", 180);
- ImGui::PopStyleVar();
+ // Options menu
+ if (ImGui::BeginPopup("Options"))
+ {
+ ImGui::Checkbox("Auto-scroll", &AutoScroll);
+ ImGui::EndPopup();
+ }
+
+ // Options, Filter
+ if (ImGui::Button("Options"))
+ ImGui::OpenPopup("Options");
+ ImGui::SameLine();
+ Filter.Draw("Filter (\"incl,-excl\") (\"error\")", 180);
ImGui::Separator();
const float footer_height_to_reserve = ImGui::GetStyle().ItemSpacing.y + ImGui::GetFrameHeightWithSpacing(); // 1 separator, 1 input text
@@ -2935,24 +3746,27 @@ struct ExampleAppConsole
ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(4,1)); // Tighten spacing
if (copy_to_clipboard)
ImGui::LogToClipboard();
- ImVec4 col_default_text = ImGui::GetStyleColorVec4(ImGuiCol_Text);
for (int i = 0; i < Items.Size; i++)
{
const char* item = Items[i];
- if (!filter.PassFilter(item))
+ if (!Filter.PassFilter(item))
continue;
- ImVec4 col = col_default_text;
- if (strstr(item, "[error]")) col = ImColor(1.0f,0.4f,0.4f,1.0f);
- else if (strncmp(item, "# ", 2) == 0) col = ImColor(1.0f,0.78f,0.58f,1.0f);
- ImGui::PushStyleColor(ImGuiCol_Text, col);
+
+ // Normally you would store more information in your item (e.g. make Items[] an array of structure, store color/type etc.)
+ bool pop_color = false;
+ if (strstr(item, "[error]")) { ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 0.4f, 0.4f, 1.0f)); pop_color = true; }
+ else if (strncmp(item, "# ", 2) == 0) { ImGui::PushStyleColor(ImGuiCol_Text, ImVec4(1.0f, 0.8f, 0.6f, 1.0f)); pop_color = true; }
ImGui::TextUnformatted(item);
- ImGui::PopStyleColor();
+ if (pop_color)
+ ImGui::PopStyleColor();
}
if (copy_to_clipboard)
ImGui::LogFinish();
- if (ScrollToBottom)
+
+ if (ScrollToBottom || (AutoScroll && ImGui::GetScrollY() >= ImGui::GetScrollMaxY()))
ImGui::SetScrollHereY(1.0f);
ScrollToBottom = false;
+
ImGui::PopStyleVar();
ImGui::EndChild();
ImGui::Separator();
@@ -3013,6 +3827,9 @@ struct ExampleAppConsole
{
AddLog("Unknown command: '%s'\n", command_line);
}
+
+ // On commad input, we scroll to bottom even if AutoScroll==false
+ ScrollToBottom = true;
}
static int TextEditCallbackStub(ImGuiInputTextCallbackData* data) // In C++11 you are better off using lambdas for this sort of forwarding callbacks
@@ -3140,10 +3957,21 @@ struct ExampleAppLog
{
ImGuiTextBuffer Buf;
ImGuiTextFilter Filter;
- ImVector<int> LineOffsets; // Index to lines offset
- bool ScrollToBottom;
+ ImVector<int> LineOffsets; // Index to lines offset. We maintain this with AddLog() calls, allowing us to have a random access on lines
+ bool AutoScroll; // Keep scrolling if already at the bottom
+
+ ExampleAppLog()
+ {
+ AutoScroll = true;
+ Clear();
+ }
- void Clear() { Buf.clear(); LineOffsets.clear(); }
+ void Clear()
+ {
+ Buf.clear();
+ LineOffsets.clear();
+ LineOffsets.push_back(0);
+ }
void AddLog(const char* fmt, ...) IM_FMTARGS(2)
{
@@ -3154,47 +3982,88 @@ struct ExampleAppLog
va_end(args);
for (int new_size = Buf.size(); old_size < new_size; old_size++)
if (Buf[old_size] == '\n')
- LineOffsets.push_back(old_size);
- ScrollToBottom = true;
+ LineOffsets.push_back(old_size + 1);
}
void Draw(const char* title, bool* p_open = NULL)
{
- ImGui::SetNextWindowSize(ImVec2(500,400), ImGuiCond_FirstUseEver);
if (!ImGui::Begin(title, p_open))
{
ImGui::End();
return;
}
- if (ImGui::Button("Clear")) Clear();
+
+ // Options menu
+ if (ImGui::BeginPopup("Options"))
+ {
+ ImGui::Checkbox("Auto-scroll", &AutoScroll);
+ ImGui::EndPopup();
+ }
+
+ // Main window
+ if (ImGui::Button("Options"))
+ ImGui::OpenPopup("Options");
+ ImGui::SameLine();
+ bool clear = ImGui::Button("Clear");
ImGui::SameLine();
bool copy = ImGui::Button("Copy");
ImGui::SameLine();
Filter.Draw("Filter", -100.0f);
+
ImGui::Separator();
ImGui::BeginChild("scrolling", ImVec2(0,0), false, ImGuiWindowFlags_HorizontalScrollbar);
- if (copy) ImGui::LogToClipboard();
+ if (clear)
+ Clear();
+ if (copy)
+ ImGui::LogToClipboard();
+
+ ImGui::PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(0, 0));
+ const char* buf = Buf.begin();
+ const char* buf_end = Buf.end();
if (Filter.IsActive())
{
- const char* buf_begin = Buf.begin();
- const char* line = buf_begin;
- for (int line_no = 0; line != NULL; line_no++)
+ // In this example we don't use the clipper when Filter is enabled.
+ // This is because we don't have a random access on the result on our filter.
+ // A real application processing logs with ten of thousands of entries may want to store the result of search/filter.
+ // especially if the filtering function is not trivial (e.g. reg-exp).
+ for (int line_no = 0; line_no < LineOffsets.Size; line_no++)
{
- const char* line_end = (line_no < LineOffsets.Size) ? buf_begin + LineOffsets[line_no] : NULL;
- if (Filter.PassFilter(line, line_end))
- ImGui::TextUnformatted(line, line_end);
- line = line_end && line_end[1] ? line_end + 1 : NULL;
+ const char* line_start = buf + LineOffsets[line_no];
+ const char* line_end = (line_no + 1 < LineOffsets.Size) ? (buf + LineOffsets[line_no + 1] - 1) : buf_end;
+ if (Filter.PassFilter(line_start, line_end))
+ ImGui::TextUnformatted(line_start, line_end);
}
}
else
{
- ImGui::TextUnformatted(Buf.begin());
+ // The simplest and easy way to display the entire buffer:
+ // ImGui::TextUnformatted(buf_begin, buf_end);
+ // And it'll just work. TextUnformatted() has specialization for large blob of text and will fast-forward to skip non-visible lines.
+ // Here we instead demonstrate using the clipper to only process lines that are within the visible area.
+ // If you have tens of thousands of items and their processing cost is non-negligible, coarse clipping them on your side is recommended.
+ // Using ImGuiListClipper requires A) random access into your data, and B) items all being the same height,
+ // both of which we can handle since we an array pointing to the beginning of each line of text.
+ // When using the filter (in the block of code above) we don't have random access into the data to display anymore, which is why we don't use the clipper.
+ // Storing or skimming through the search result would make it possible (and would be recommended if you want to search through tens of thousands of entries)
+ ImGuiListClipper clipper;
+ clipper.Begin(LineOffsets.Size);
+ while (clipper.Step())
+ {
+ for (int line_no = clipper.DisplayStart; line_no < clipper.DisplayEnd; line_no++)
+ {
+ const char* line_start = buf + LineOffsets[line_no];
+ const char* line_end = (line_no + 1 < LineOffsets.Size) ? (buf + LineOffsets[line_no + 1] - 1) : buf_end;
+ ImGui::TextUnformatted(line_start, line_end);
+ }
+ }
+ clipper.End();
}
+ ImGui::PopStyleVar();
- if (ScrollToBottom)
+ if (AutoScroll && ImGui::GetScrollY() >= ImGui::GetScrollMaxY())
ImGui::SetScrollHereY(1.0f);
- ScrollToBottom = false;
+
ImGui::EndChild();
ImGui::End();
}
@@ -3205,16 +4074,26 @@ static void ShowExampleAppLog(bool* p_open)
{
static ExampleAppLog log;
- // Demo: add random items (unless Ctrl is held)
- static double last_time = -1.0;
- double time = ImGui::GetTime();
- if (time - last_time >= 0.20f && !ImGui::GetIO().KeyCtrl)
+ // For the demo: add a debug button _BEFORE_ the normal log window contents
+ // We take advantage of a rarely used feature: multiple calls to Begin()/End() are appending to the _same_ window.
+ // Most of the contents of the window will be added by the log.Draw() call.
+ ImGui::SetNextWindowSize(ImVec2(500, 400), ImGuiCond_FirstUseEver);
+ ImGui::Begin("Example: Log", p_open);
+ if (ImGui::SmallButton("[Debug] Add 5 entries"))
{
- const char* random_words[] = { "system", "info", "warning", "error", "fatal", "notice", "log" };
- log.AddLog("[%s] Hello, time is %.1f, frame count is %d\n", random_words[rand() % IM_ARRAYSIZE(random_words)], time, ImGui::GetFrameCount());
- last_time = time;
+ static int counter = 0;
+ for (int n = 0; n < 5; n++)
+ {
+ const char* categories[3] = { "info", "warn", "error" };
+ const char* words[] = { "Bumfuzzled", "Cattywampus", "Snickersnee", "Abibliophobia", "Absquatulate", "Nincompoop", "Pauciloquent" };
+ log.AddLog("[%05d] [%s] Hello, current time is %.1f, here's a word: '%s'\n",
+ ImGui::GetFrameCount(), categories[counter % IM_ARRAYSIZE(categories)], ImGui::GetTime(), words[counter % IM_ARRAYSIZE(words)]);
+ counter++;
+ }
}
+ ImGui::End();
+ // Actually call in the regular Log helper (which will Begin() into the same window as we just did)
log.Draw("Example: Log", p_open);
}
@@ -3226,7 +4105,7 @@ static void ShowExampleAppLog(bool* p_open)
static void ShowExampleAppLayout(bool* p_open)
{
ImGui::SetNextWindowSize(ImVec2(500, 440), ImGuiCond_FirstUseEver);
- if (ImGui::Begin("Example: Layout", p_open, ImGuiWindowFlags_MenuBar))
+ if (ImGui::Begin("Example: Simple layout", p_open, ImGuiWindowFlags_MenuBar))
{
if (ImGui::BeginMenuBar())
{
@@ -3256,7 +4135,20 @@ static void ShowExampleAppLayout(bool* p_open)
ImGui::BeginChild("item view", ImVec2(0, -ImGui::GetFrameHeightWithSpacing())); // Leave room for 1 line below us
ImGui::Text("MyObject: %d", selected);
ImGui::Separator();
- ImGui::TextWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ");
+ if (ImGui::BeginTabBar("##Tabs", ImGuiTabBarFlags_None))
+ {
+ if (ImGui::BeginTabItem("Description"))
+ {
+ ImGui::TextWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. ");
+ ImGui::EndTabItem();
+ }
+ if (ImGui::BeginTabItem("Details"))
+ {
+ ImGui::Text("ID: 0123456789");
+ ImGui::EndTabItem();
+ }
+ ImGui::EndTabBar();
+ }
ImGui::EndChild();
if (ImGui::Button("Revert")) {}
ImGui::SameLine();
@@ -3280,7 +4172,7 @@ static void ShowExampleAppPropertyEditor(bool* p_open)
return;
}
- ShowHelpMarker("This example shows how you may implement a property editor using two columns.\nAll objects/fields data are dummies here.\nRemember that in many simple cases, you can use ImGui::SameLine(xxx) to position\nyour cursor horizontally instead of using the Columns() API.");
+ HelpMarker("This example shows how you may implement a property editor using two columns.\nAll objects/fields data are dummies here.\nRemember that in many simple cases, you can use ImGui::SameLine(xxx) to position\nyour cursor horizontally instead of using the Columns() API.");
ImGui::PushStyleVar(ImGuiStyleVar_FramePadding, ImVec2(2,2));
ImGui::Columns(2);
@@ -3313,12 +4205,11 @@ static void ShowExampleAppPropertyEditor(bool* p_open)
ImGui::AlignTextToFramePadding();
ImGui::TreeNodeEx("Field", ImGuiTreeNodeFlags_Leaf | ImGuiTreeNodeFlags_NoTreePushOnOpen | ImGuiTreeNodeFlags_Bullet, "Field_%d", i);
ImGui::NextColumn();
- ImGui::PushItemWidth(-1);
+ ImGui::SetNextItemWidth(-1);
if (i >= 5)
ImGui::InputFloat("##value", &dummy_members[i], 1.0f);
else
ImGui::DragFloat("##value", &dummy_members[i], 0.01f);
- ImGui::PopItemWidth();
ImGui::NextColumn();
}
ImGui::PopID();
@@ -3357,7 +4248,7 @@ static void ShowExampleAppLongText(bool* p_open)
static ImGuiTextBuffer log;
static int lines = 0;
ImGui::Text("Printing unusually long amount of text.");
- ImGui::Combo("Test type", &test_type, "Single call to TextUnformatted()\0Multiple calls to Text(), clipped manually\0Multiple calls to Text(), not clipped (slow)\0");
+ ImGui::Combo("Test type", &test_type, "Single call to TextUnformatted()\0Multiple calls to Text(), clipped\0Multiple calls to Text(), not clipped (slow)\0");
ImGui::Text("Buffer contents: %d lines, %d bytes", lines, log.size());
if (ImGui::Button("Clear")) { log.clear(); lines = 0; }
ImGui::SameLine();
@@ -3427,7 +4318,7 @@ static void ShowExampleAppConstrainedResize(bool* p_open)
{
struct CustomConstraints // Helper functions to demonstrate programmatic constraints
{
- static void Square(ImGuiSizeCallbackData* data) { data->DesiredSize = ImVec2(IM_MAX(data->DesiredSize.x, data->DesiredSize.y), IM_MAX(data->DesiredSize.x, data->DesiredSize.y)); }
+ static void Square(ImGuiSizeCallbackData* data) { data->DesiredSize.x = data->DesiredSize.y = (data->DesiredSize.x > data->DesiredSize.y ? data->DesiredSize.x : data->DesiredSize.y); }
static void Step(ImGuiSizeCallbackData* data) { float step = (float)(int)(intptr_t)data->UserData; data->DesiredSize = ImVec2((int)(data->DesiredSize.x / step + 0.5f) * step, (int)(data->DesiredSize.y / step + 0.5f) * step); }
};
@@ -3439,8 +4330,8 @@ static void ShowExampleAppConstrainedResize(bool* p_open)
if (type == 2) ImGui::SetNextWindowSizeConstraints(ImVec2(100, 100), ImVec2(FLT_MAX, FLT_MAX)); // Width > 100, Height > 100
if (type == 3) ImGui::SetNextWindowSizeConstraints(ImVec2(400, -1), ImVec2(500, -1)); // Width 400-500
if (type == 4) ImGui::SetNextWindowSizeConstraints(ImVec2(-1, 400), ImVec2(-1, 500)); // Height 400-500
- if (type == 5) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Square); // Always Square
- if (type == 6) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Step, (void*)100);// Fixed Step
+ if (type == 5) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Square); // Always Square
+ if (type == 6) ImGui::SetNextWindowSizeConstraints(ImVec2(0, 0), ImVec2(FLT_MAX, FLT_MAX), CustomConstraints::Step, (void*)(intptr_t)100); // Fixed Step
ImGuiWindowFlags flags = auto_resize ? ImGuiWindowFlags_AlwaysAutoResize : 0;
if (ImGui::Begin("Example: Constrained Resize", p_open, flags))
@@ -3458,10 +4349,10 @@ static void ShowExampleAppConstrainedResize(bool* p_open)
if (ImGui::Button("200x200")) { ImGui::SetWindowSize(ImVec2(200, 200)); } ImGui::SameLine();
if (ImGui::Button("500x500")) { ImGui::SetWindowSize(ImVec2(500, 500)); } ImGui::SameLine();
if (ImGui::Button("800x200")) { ImGui::SetWindowSize(ImVec2(800, 200)); }
- ImGui::PushItemWidth(200);
+ ImGui::SetNextItemWidth(200);
ImGui::Combo("Constraint", &type, desc, IM_ARRAYSIZE(desc));
+ ImGui::SetNextItemWidth(200);
ImGui::DragInt("Lines", &display_lines, 0.2f, 1, 100);
- ImGui::PopItemWidth();
ImGui::Checkbox("Auto-resize", &auto_resize);
for (int i = 0; i < display_lines; i++)
ImGui::Text("%*sHello, sailor! Making this line long enough for the example.", i * 4, "");
@@ -3478,17 +4369,20 @@ static void ShowExampleAppSimpleOverlay(bool* p_open)
{
const float DISTANCE = 10.0f;
static int corner = 0;
- ImVec2 window_pos = ImVec2((corner & 1) ? ImGui::GetIO().DisplaySize.x - DISTANCE : DISTANCE, (corner & 2) ? ImGui::GetIO().DisplaySize.y - DISTANCE : DISTANCE);
- ImVec2 window_pos_pivot = ImVec2((corner & 1) ? 1.0f : 0.0f, (corner & 2) ? 1.0f : 0.0f);
+ ImGuiIO& io = ImGui::GetIO();
if (corner != -1)
+ {
+ ImVec2 window_pos = ImVec2((corner & 1) ? io.DisplaySize.x - DISTANCE : DISTANCE, (corner & 2) ? io.DisplaySize.y - DISTANCE : DISTANCE);
+ ImVec2 window_pos_pivot = ImVec2((corner & 1) ? 1.0f : 0.0f, (corner & 2) ? 1.0f : 0.0f);
ImGui::SetNextWindowPos(window_pos, ImGuiCond_Always, window_pos_pivot);
- ImGui::SetNextWindowBgAlpha(0.3f); // Transparent background
- if (ImGui::Begin("Example: Simple Overlay", p_open, (corner != -1 ? ImGuiWindowFlags_NoMove : 0) | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav))
+ }
+ ImGui::SetNextWindowBgAlpha(0.35f); // Transparent background
+ if (ImGui::Begin("Example: Simple overlay", p_open, (corner != -1 ? ImGuiWindowFlags_NoMove : 0) | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoFocusOnAppearing | ImGuiWindowFlags_NoNav))
{
ImGui::Text("Simple overlay\n" "in the corner of the screen.\n" "(right-click to change position)");
ImGui::Separator();
if (ImGui::IsMousePosValid())
- ImGui::Text("Mouse Position: (%.1f,%.1f)", ImGui::GetIO().MousePos.x, ImGui::GetIO().MousePos.y);
+ ImGui::Text("Mouse Position: (%.1f,%.1f)", io.MousePos.x, io.MousePos.y);
else
ImGui::Text("Mouse Position: <invalid>");
if (ImGui::BeginPopupContextWindow())
@@ -3543,7 +4437,6 @@ static void ShowExampleAppWindowTitles(bool*)
// Demonstrate using the low-level ImDrawList to draw custom shapes.
static void ShowExampleAppCustomRendering(bool* p_open)
{
- ImGui::SetNextWindowSize(ImVec2(350, 560), ImGuiCond_FirstUseEver);
if (!ImGui::Begin("Example: Custom rendering", p_open))
{
ImGui::End();
@@ -3556,102 +4449,424 @@ static void ShowExampleAppCustomRendering(bool* p_open)
// In this example we are not using the maths operators!
ImDrawList* draw_list = ImGui::GetWindowDrawList();
- // Primitives
- ImGui::Text("Primitives");
- static float sz = 36.0f;
- static float thickness = 4.0f;
- static ImVec4 col = ImVec4(1.0f, 1.0f, 0.4f, 1.0f);
- ImGui::DragFloat("Size", &sz, 0.2f, 2.0f, 72.0f, "%.0f");
- ImGui::DragFloat("Thickness", &thickness, 0.05f, 1.0f, 8.0f, "%.02f");
- ImGui::ColorEdit3("Color", &col.x);
- {
- const ImVec2 p = ImGui::GetCursorScreenPos();
- const ImU32 col32 = ImColor(col);
- float x = p.x + 4.0f, y = p.y + 4.0f, spacing = 8.0f;
- for (int n = 0; n < 2; n++)
- {
- float curr_thickness = (n == 0) ? 1.0f : thickness;
- draw_list->AddCircle(ImVec2(x+sz*0.5f, y+sz*0.5f), sz*0.5f, col32, 20, curr_thickness); x += sz+spacing;
- draw_list->AddRect(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, 0.0f, ImDrawCornerFlags_All, curr_thickness); x += sz+spacing;
- draw_list->AddRect(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, 10.0f, ImDrawCornerFlags_All, curr_thickness); x += sz+spacing;
- draw_list->AddRect(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, 10.0f, ImDrawCornerFlags_TopLeft|ImDrawCornerFlags_BotRight, curr_thickness); x += sz+spacing;
- draw_list->AddTriangle(ImVec2(x+sz*0.5f, y), ImVec2(x+sz,y+sz-0.5f), ImVec2(x,y+sz-0.5f), col32, curr_thickness); x += sz+spacing;
- draw_list->AddLine(ImVec2(x, y), ImVec2(x+sz, y ), col32, curr_thickness); x += sz+spacing; // Horizontal line (note: drawing a filled rectangle will be faster!)
- draw_list->AddLine(ImVec2(x, y), ImVec2(x, y+sz), col32, curr_thickness); x += spacing; // Vertical line (note: drawing a filled rectangle will be faster!)
- draw_list->AddLine(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, curr_thickness); x += sz+spacing; // Diagonal line
- draw_list->AddBezierCurve(ImVec2(x, y), ImVec2(x+sz*1.3f,y+sz*0.3f), ImVec2(x+sz-sz*1.3f,y+sz-sz*0.3f), ImVec2(x+sz, y+sz), col32, curr_thickness);
- x = p.x + 4;
- y += sz+spacing;
- }
- draw_list->AddCircleFilled(ImVec2(x+sz*0.5f, y+sz*0.5f), sz*0.5f, col32, 32); x += sz+spacing;
- draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x+sz, y+sz), col32); x += sz+spacing;
- draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, 10.0f); x += sz+spacing;
- draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x+sz, y+sz), col32, 10.0f, ImDrawCornerFlags_TopLeft|ImDrawCornerFlags_BotRight); x += sz+spacing;
- draw_list->AddTriangleFilled(ImVec2(x+sz*0.5f, y), ImVec2(x+sz,y+sz-0.5f), ImVec2(x,y+sz-0.5f), col32); x += sz+spacing;
- draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x+sz, y+thickness), col32); x += sz+spacing; // Horizontal line (faster than AddLine, but only handle integer thickness)
- draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x+thickness, y+sz), col32); x += spacing+spacing; // Vertical line (faster than AddLine, but only handle integer thickness)
- draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x+1, y+1), col32); x += sz; // Pixel (faster than AddLine)
- draw_list->AddRectFilledMultiColor(ImVec2(x, y), ImVec2(x+sz, y+sz), IM_COL32(0,0,0,255), IM_COL32(255,0,0,255), IM_COL32(255,255,0,255), IM_COL32(0,255,0,255));
- ImGui::Dummy(ImVec2((sz+spacing)*8, (sz+spacing)*3));
- }
- ImGui::Separator();
+ if (ImGui::BeginTabBar("##TabBar"))
{
- static ImVector<ImVec2> points;
- static bool adding_line = false;
- ImGui::Text("Canvas example");
- if (ImGui::Button("Clear")) points.clear();
- if (points.Size >= 2) { ImGui::SameLine(); if (ImGui::Button("Undo")) { points.pop_back(); points.pop_back(); } }
- ImGui::Text("Left-click and drag to add lines,\nRight-click to undo");
-
- // Here we are using InvisibleButton() as a convenience to 1) advance the cursor and 2) allows us to use IsItemHovered()
- // But you can also draw directly and poll mouse/keyboard by yourself. You can manipulate the cursor using GetCursorPos() and SetCursorPos().
- // If you only use the ImDrawList API, you can notify the owner window of its extends by using SetCursorPos(max).
- ImVec2 canvas_pos = ImGui::GetCursorScreenPos(); // ImDrawList API uses screen coordinates!
- ImVec2 canvas_size = ImGui::GetContentRegionAvail(); // Resize canvas to what's available
- if (canvas_size.x < 50.0f) canvas_size.x = 50.0f;
- if (canvas_size.y < 50.0f) canvas_size.y = 50.0f;
- draw_list->AddRectFilledMultiColor(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), IM_COL32(50, 50, 50, 255), IM_COL32(50, 50, 60, 255), IM_COL32(60, 60, 70, 255), IM_COL32(50, 50, 60, 255));
- draw_list->AddRect(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), IM_COL32(255, 255, 255, 255));
-
- bool adding_preview = false;
- ImGui::InvisibleButton("canvas", canvas_size);
- ImVec2 mouse_pos_in_canvas = ImVec2(ImGui::GetIO().MousePos.x - canvas_pos.x, ImGui::GetIO().MousePos.y - canvas_pos.y);
- if (adding_line)
- {
- adding_preview = true;
- points.push_back(mouse_pos_in_canvas);
- if (!ImGui::IsMouseDown(0))
- adding_line = adding_preview = false;
+ // Primitives
+ if (ImGui::BeginTabItem("Primitives"))
+ {
+ static float sz = 36.0f;
+ static float thickness = 3.0f;
+ static int ngon_sides = 6;
+ static bool circle_segments_override = false;
+ static int circle_segments_override_v = 12;
+ static ImVec4 colf = ImVec4(1.0f, 1.0f, 0.4f, 1.0f);
+ ImGui::PushItemWidth(-ImGui::GetFontSize() * 10);
+ ImGui::DragFloat("Size", &sz, 0.2f, 2.0f, 72.0f, "%.0f");
+ ImGui::DragFloat("Thickness", &thickness, 0.05f, 1.0f, 8.0f, "%.02f");
+ ImGui::SliderInt("N-gon sides", &ngon_sides, 3, 12);
+ ImGui::Checkbox("##circlesegmentoverride", &circle_segments_override);
+ ImGui::SameLine(0.0f, ImGui::GetStyle().ItemInnerSpacing.x);
+ if (ImGui::SliderInt("Circle segments", &circle_segments_override_v, 3, 40))
+ circle_segments_override = true;
+ ImGui::ColorEdit4("Color", &colf.x);
+ ImGui::PopItemWidth();
+ const ImVec2 p = ImGui::GetCursorScreenPos();
+ const ImU32 col = ImColor(colf);
+ const float spacing = 10.0f;
+ const ImDrawCornerFlags corners_none = 0;
+ const ImDrawCornerFlags corners_all = ImDrawCornerFlags_All;
+ const ImDrawCornerFlags corners_tl_br = ImDrawCornerFlags_TopLeft | ImDrawCornerFlags_BotRight;
+ const int circle_segments = circle_segments_override ? circle_segments_override_v : 0;
+ float x = p.x + 4.0f, y = p.y + 4.0f;
+ for (int n = 0; n < 2; n++)
+ {
+ // First line uses a thickness of 1.0f, second line uses the configurable thickness
+ float th = (n == 0) ? 1.0f : thickness;
+ draw_list->AddNgon(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, ngon_sides, th); x += sz + spacing; // N-gon
+ draw_list->AddCircle(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, circle_segments, th); x += sz + spacing; // Circle
+ draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 0.0f, corners_none, th); x += sz + spacing; // Square
+ draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f, corners_all, th); x += sz + spacing; // Square with all rounded corners
+ draw_list->AddRect(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f, corners_tl_br, th); x += sz + spacing; // Square with two rounded corners
+ draw_list->AddTriangle(ImVec2(x+sz*0.5f,y), ImVec2(x+sz, y+sz-0.5f), ImVec2(x, y+sz-0.5f), col, th); x += sz + spacing; // Triangle
+ draw_list->AddTriangle(ImVec2(x+sz*0.2f,y), ImVec2(x, y+sz-0.5f), ImVec2(x+sz*0.4f, y+sz-0.5f), col, th); x += sz*0.4f + spacing; // Thin triangle
+ draw_list->AddLine(ImVec2(x, y), ImVec2(x + sz, y), col, th); x += sz + spacing; // Horizontal line (note: drawing a filled rectangle will be faster!)
+ draw_list->AddLine(ImVec2(x, y), ImVec2(x, y + sz), col, th); x += spacing; // Vertical line (note: drawing a filled rectangle will be faster!)
+ draw_list->AddLine(ImVec2(x, y), ImVec2(x + sz, y + sz), col, th); x += sz + spacing; // Diagonal line
+ draw_list->AddBezierCurve(ImVec2(x, y), ImVec2(x + sz*1.3f, y + sz*0.3f), ImVec2(x + sz - sz*1.3f, y + sz - sz*0.3f), ImVec2(x + sz, y + sz), col, th);
+ x = p.x + 4;
+ y += sz + spacing;
+ }
+ draw_list->AddNgonFilled(ImVec2(x + sz * 0.5f, y + sz * 0.5f), sz*0.5f, col, ngon_sides); x += sz + spacing; // N-gon
+ draw_list->AddCircleFilled(ImVec2(x + sz*0.5f, y + sz*0.5f), sz*0.5f, col, circle_segments);x += sz + spacing; // Circle
+ draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col); x += sz + spacing; // Square
+ draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f); x += sz + spacing; // Square with all rounded corners
+ draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + sz), col, 10.0f, corners_tl_br); x += sz + spacing; // Square with two rounded corners
+ draw_list->AddTriangleFilled(ImVec2(x+sz*0.5f,y), ImVec2(x+sz, y+sz-0.5f), ImVec2(x, y+sz-0.5f), col); x += sz + spacing; // Triangle
+ draw_list->AddTriangleFilled(ImVec2(x+sz*0.2f,y), ImVec2(x, y+sz-0.5f), ImVec2(x+sz*0.4f, y+sz-0.5f), col); x += sz*0.4f + spacing; // Thin triangle
+ draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + sz, y + thickness), col); x += sz + spacing; // Horizontal line (faster than AddLine, but only handle integer thickness)
+ draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + thickness, y + sz), col); x += spacing*2.0f; // Vertical line (faster than AddLine, but only handle integer thickness)
+ draw_list->AddRectFilled(ImVec2(x, y), ImVec2(x + 1, y + 1), col); x += sz; // Pixel (faster than AddLine)
+ draw_list->AddRectFilledMultiColor(ImVec2(x, y), ImVec2(x + sz, y + sz), IM_COL32(0, 0, 0, 255), IM_COL32(255, 0, 0, 255), IM_COL32(255, 255, 0, 255), IM_COL32(0, 255, 0, 255));
+ ImGui::Dummy(ImVec2((sz + spacing) * 9.8f, (sz + spacing) * 3));
+ ImGui::EndTabItem();
}
- if (ImGui::IsItemHovered())
+
+ if (ImGui::BeginTabItem("Canvas"))
{
- if (!adding_line && ImGui::IsMouseClicked(0))
+ static ImVector<ImVec2> points;
+ static bool adding_line = false;
+ if (ImGui::Button("Clear")) points.clear();
+ if (points.Size >= 2) { ImGui::SameLine(); if (ImGui::Button("Undo")) { points.pop_back(); points.pop_back(); } }
+ ImGui::Text("Left-click and drag to add lines,\nRight-click to undo");
+
+ // Here we are using InvisibleButton() as a convenience to 1) advance the cursor and 2) allows us to use IsItemHovered()
+ // But you can also draw directly and poll mouse/keyboard by yourself. You can manipulate the cursor using GetCursorPos() and SetCursorPos().
+ // If you only use the ImDrawList API, you can notify the owner window of its extends by using SetCursorPos(max).
+ ImVec2 canvas_pos = ImGui::GetCursorScreenPos(); // ImDrawList API uses screen coordinates!
+ ImVec2 canvas_size = ImGui::GetContentRegionAvail(); // Resize canvas to what's available
+ if (canvas_size.x < 50.0f) canvas_size.x = 50.0f;
+ if (canvas_size.y < 50.0f) canvas_size.y = 50.0f;
+ draw_list->AddRectFilledMultiColor(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), IM_COL32(50, 50, 50, 255), IM_COL32(50, 50, 60, 255), IM_COL32(60, 60, 70, 255), IM_COL32(50, 50, 60, 255));
+ draw_list->AddRect(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), IM_COL32(255, 255, 255, 255));
+
+ bool adding_preview = false;
+ ImGui::InvisibleButton("canvas", canvas_size);
+ ImVec2 mouse_pos_in_canvas = ImVec2(ImGui::GetIO().MousePos.x - canvas_pos.x, ImGui::GetIO().MousePos.y - canvas_pos.y);
+ if (adding_line)
{
+ adding_preview = true;
points.push_back(mouse_pos_in_canvas);
- adding_line = true;
+ if (!ImGui::IsMouseDown(0))
+ adding_line = adding_preview = false;
}
- if (ImGui::IsMouseClicked(1) && !points.empty())
+ if (ImGui::IsItemHovered())
{
- adding_line = adding_preview = false;
- points.pop_back();
+ if (!adding_line && ImGui::IsMouseClicked(0))
+ {
+ points.push_back(mouse_pos_in_canvas);
+ adding_line = true;
+ }
+ if (ImGui::IsMouseClicked(1) && !points.empty())
+ {
+ adding_line = adding_preview = false;
+ points.pop_back();
+ points.pop_back();
+ }
+ }
+ draw_list->PushClipRect(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), true); // clip lines within the canvas (if we resize it, etc.)
+ for (int i = 0; i < points.Size - 1; i += 2)
+ draw_list->AddLine(ImVec2(canvas_pos.x + points[i].x, canvas_pos.y + points[i].y), ImVec2(canvas_pos.x + points[i + 1].x, canvas_pos.y + points[i + 1].y), IM_COL32(255, 255, 0, 255), 2.0f);
+ draw_list->PopClipRect();
+ if (adding_preview)
points.pop_back();
+ ImGui::EndTabItem();
+ }
+
+ if (ImGui::BeginTabItem("BG/FG draw lists"))
+ {
+ static bool draw_bg = true;
+ static bool draw_fg = true;
+ ImGui::Checkbox("Draw in Background draw list", &draw_bg);
+ ImGui::SameLine(); HelpMarker("The Background draw list will be rendered below every Dear ImGui windows.");
+ ImGui::Checkbox("Draw in Foreground draw list", &draw_fg);
+ ImGui::SameLine(); HelpMarker("The Foreground draw list will be rendered over every Dear ImGui windows.");
+ ImVec2 window_pos = ImGui::GetWindowPos();
+ ImVec2 window_size = ImGui::GetWindowSize();
+ ImVec2 window_center = ImVec2(window_pos.x + window_size.x * 0.5f, window_pos.y + window_size.y * 0.5f);
+ if (draw_bg)
+ ImGui::GetBackgroundDrawList()->AddCircle(window_center, window_size.x * 0.6f, IM_COL32(255, 0, 0, 200), 48, 10+4);
+ if (draw_fg)
+ ImGui::GetForegroundDrawList()->AddCircle(window_center, window_size.y * 0.6f, IM_COL32(0, 255, 0, 200), 48, 10);
+ ImGui::EndTabItem();
+ }
+
+ ImGui::EndTabBar();
+ }
+
+ ImGui::End();
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] Example App: Documents Handling / ShowExampleAppDocuments()
+//-----------------------------------------------------------------------------
+
+// Simplified structure to mimic a Document model
+struct MyDocument
+{
+ const char* Name; // Document title
+ bool Open; // Set when the document is open (in this demo, we keep an array of all available documents to simplify the demo)
+ bool OpenPrev; // Copy of Open from last update.
+ bool Dirty; // Set when the document has been modified
+ bool WantClose; // Set when the document
+ ImVec4 Color; // An arbitrary variable associated to the document
+
+ MyDocument(const char* name, bool open = true, const ImVec4& color = ImVec4(1.0f,1.0f,1.0f,1.0f))
+ {
+ Name = name;
+ Open = OpenPrev = open;
+ Dirty = false;
+ WantClose = false;
+ Color = color;
+ }
+ void DoOpen() { Open = true; }
+ void DoQueueClose() { WantClose = true; }
+ void DoForceClose() { Open = false; Dirty = false; }
+ void DoSave() { Dirty = false; }
+
+ // Display dummy contents for the Document
+ static void DisplayContents(MyDocument* doc)
+ {
+ ImGui::PushID(doc);
+ ImGui::Text("Document \"%s\"", doc->Name);
+ ImGui::PushStyleColor(ImGuiCol_Text, doc->Color);
+ ImGui::TextWrapped("Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.");
+ ImGui::PopStyleColor();
+ if (ImGui::Button("Modify", ImVec2(100, 0)))
+ doc->Dirty = true;
+ ImGui::SameLine();
+ if (ImGui::Button("Save", ImVec2(100, 0)))
+ doc->DoSave();
+ ImGui::ColorEdit3("color", &doc->Color.x); // Useful to test drag and drop and hold-dragged-to-open-tab behavior.
+ ImGui::PopID();
+ }
+
+ // Display context menu for the Document
+ static void DisplayContextMenu(MyDocument* doc)
+ {
+ if (!ImGui::BeginPopupContextItem())
+ return;
+
+ char buf[256];
+ sprintf(buf, "Save %s", doc->Name);
+ if (ImGui::MenuItem(buf, "CTRL+S", false, doc->Open))
+ doc->DoSave();
+ if (ImGui::MenuItem("Close", "CTRL+W", false, doc->Open))
+ doc->DoQueueClose();
+ ImGui::EndPopup();
+ }
+};
+
+struct ExampleAppDocuments
+{
+ ImVector<MyDocument> Documents;
+
+ ExampleAppDocuments()
+ {
+ Documents.push_back(MyDocument("Lettuce", true, ImVec4(0.4f, 0.8f, 0.4f, 1.0f)));
+ Documents.push_back(MyDocument("Eggplant", true, ImVec4(0.8f, 0.5f, 1.0f, 1.0f)));
+ Documents.push_back(MyDocument("Carrot", true, ImVec4(1.0f, 0.8f, 0.5f, 1.0f)));
+ Documents.push_back(MyDocument("Tomato", false, ImVec4(1.0f, 0.3f, 0.4f, 1.0f)));
+ Documents.push_back(MyDocument("A Rather Long Title", false));
+ Documents.push_back(MyDocument("Some Document", false));
+ }
+};
+
+// [Optional] Notify the system of Tabs/Windows closure that happened outside the regular tab interface.
+// If a tab has been closed programmatically (aka closed from another source such as the Checkbox() in the demo, as opposed
+// to clicking on the regular tab closing button) and stops being submitted, it will take a frame for the tab bar to notice its absence.
+// During this frame there will be a gap in the tab bar, and if the tab that has disappeared was the selected one, the tab bar
+// will report no selected tab during the frame. This will effectively give the impression of a flicker for one frame.
+// We call SetTabItemClosed() to manually notify the Tab Bar or Docking system of removed tabs to avoid this glitch.
+// Note that this completely optional, and only affect tab bars with the ImGuiTabBarFlags_Reorderable flag.
+static void NotifyOfDocumentsClosedElsewhere(ExampleAppDocuments& app)
+{
+ for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++)
+ {
+ MyDocument* doc = &app.Documents[doc_n];
+ if (!doc->Open && doc->OpenPrev)
+ ImGui::SetTabItemClosed(doc->Name);
+ doc->OpenPrev = doc->Open;
+ }
+}
+
+void ShowExampleAppDocuments(bool* p_open)
+{
+ static ExampleAppDocuments app;
+
+ // Options
+ static bool opt_reorderable = true;
+ static ImGuiTabBarFlags opt_fitting_flags = ImGuiTabBarFlags_FittingPolicyDefault_;
+
+ bool window_contents_visible = ImGui::Begin("Example: Documents", p_open, ImGuiWindowFlags_MenuBar);
+ if (!window_contents_visible)
+ {
+ ImGui::End();
+ return;
+ }
+
+ // Menu
+ if (ImGui::BeginMenuBar())
+ {
+ if (ImGui::BeginMenu("File"))
+ {
+ int open_count = 0;
+ for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++)
+ open_count += app.Documents[doc_n].Open ? 1 : 0;
+
+ if (ImGui::BeginMenu("Open", open_count < app.Documents.Size))
+ {
+ for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++)
+ {
+ MyDocument* doc = &app.Documents[doc_n];
+ if (!doc->Open)
+ if (ImGui::MenuItem(doc->Name))
+ doc->DoOpen();
+ }
+ ImGui::EndMenu();
+ }
+ if (ImGui::MenuItem("Close All Documents", NULL, false, open_count > 0))
+ for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++)
+ app.Documents[doc_n].DoQueueClose();
+ if (ImGui::MenuItem("Exit", "Alt+F4")) {}
+ ImGui::EndMenu();
+ }
+ ImGui::EndMenuBar();
+ }
+
+ // [Debug] List documents with one checkbox for each
+ for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++)
+ {
+ MyDocument* doc = &app.Documents[doc_n];
+ if (doc_n > 0)
+ ImGui::SameLine();
+ ImGui::PushID(doc);
+ if (ImGui::Checkbox(doc->Name, &doc->Open))
+ if (!doc->Open)
+ doc->DoForceClose();
+ ImGui::PopID();
+ }
+
+ ImGui::Separator();
+
+ // Submit Tab Bar and Tabs
+ {
+ ImGuiTabBarFlags tab_bar_flags = (opt_fitting_flags) | (opt_reorderable ? ImGuiTabBarFlags_Reorderable : 0);
+ if (ImGui::BeginTabBar("##tabs", tab_bar_flags))
+ {
+ if (opt_reorderable)
+ NotifyOfDocumentsClosedElsewhere(app);
+
+ // [DEBUG] Stress tests
+ //if ((ImGui::GetFrameCount() % 30) == 0) docs[1].Open ^= 1; // [DEBUG] Automatically show/hide a tab. Test various interactions e.g. dragging with this on.
+ //if (ImGui::GetIO().KeyCtrl) ImGui::SetTabItemSelected(docs[1].Name); // [DEBUG] Test SetTabItemSelected(), probably not very useful as-is anyway..
+
+ // Submit Tabs
+ for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++)
+ {
+ MyDocument* doc = &app.Documents[doc_n];
+ if (!doc->Open)
+ continue;
+
+ ImGuiTabItemFlags tab_flags = (doc->Dirty ? ImGuiTabItemFlags_UnsavedDocument : 0);
+ bool visible = ImGui::BeginTabItem(doc->Name, &doc->Open, tab_flags);
+
+ // Cancel attempt to close when unsaved add to save queue so we can display a popup.
+ if (!doc->Open && doc->Dirty)
+ {
+ doc->Open = true;
+ doc->DoQueueClose();
+ }
+
+ MyDocument::DisplayContextMenu(doc);
+ if (visible)
+ {
+ MyDocument::DisplayContents(doc);
+ ImGui::EndTabItem();
+ }
+ }
+
+ ImGui::EndTabBar();
+ }
+ }
+
+ // Update closing queue
+ static ImVector<MyDocument*> close_queue;
+ if (close_queue.empty())
+ {
+ // Close queue is locked once we started a popup
+ for (int doc_n = 0; doc_n < app.Documents.Size; doc_n++)
+ {
+ MyDocument* doc = &app.Documents[doc_n];
+ if (doc->WantClose)
+ {
+ doc->WantClose = false;
+ close_queue.push_back(doc);
+ }
+ }
+ }
+
+ // Display closing confirmation UI
+ if (!close_queue.empty())
+ {
+ int close_queue_unsaved_documents = 0;
+ for (int n = 0; n < close_queue.Size; n++)
+ if (close_queue[n]->Dirty)
+ close_queue_unsaved_documents++;
+
+ if (close_queue_unsaved_documents == 0)
+ {
+ // Close documents when all are unsaved
+ for (int n = 0; n < close_queue.Size; n++)
+ close_queue[n]->DoForceClose();
+ close_queue.clear();
+ }
+ else
+ {
+ if (!ImGui::IsPopupOpen("Save?"))
+ ImGui::OpenPopup("Save?");
+ if (ImGui::BeginPopupModal("Save?"))
+ {
+ ImGui::Text("Save change to the following items?");
+ ImGui::SetNextItemWidth(-1.0f);
+ if (ImGui::ListBoxHeader("##", close_queue_unsaved_documents, 6))
+ {
+ for (int n = 0; n < close_queue.Size; n++)
+ if (close_queue[n]->Dirty)
+ ImGui::Text("%s", close_queue[n]->Name);
+ ImGui::ListBoxFooter();
+ }
+
+ if (ImGui::Button("Yes", ImVec2(80, 0)))
+ {
+ for (int n = 0; n < close_queue.Size; n++)
+ {
+ if (close_queue[n]->Dirty)
+ close_queue[n]->DoSave();
+ close_queue[n]->DoForceClose();
+ }
+ close_queue.clear();
+ ImGui::CloseCurrentPopup();
+ }
+ ImGui::SameLine();
+ if (ImGui::Button("No", ImVec2(80, 0)))
+ {
+ for (int n = 0; n < close_queue.Size; n++)
+ close_queue[n]->DoForceClose();
+ close_queue.clear();
+ ImGui::CloseCurrentPopup();
+ }
+ ImGui::SameLine();
+ if (ImGui::Button("Cancel", ImVec2(80, 0)))
+ {
+ close_queue.clear();
+ ImGui::CloseCurrentPopup();
+ }
+ ImGui::EndPopup();
}
}
- draw_list->PushClipRect(canvas_pos, ImVec2(canvas_pos.x + canvas_size.x, canvas_pos.y + canvas_size.y), true); // clip lines within the canvas (if we resize it, etc.)
- for (int i = 0; i < points.Size - 1; i += 2)
- draw_list->AddLine(ImVec2(canvas_pos.x + points[i].x, canvas_pos.y + points[i].y), ImVec2(canvas_pos.x + points[i + 1].x, canvas_pos.y + points[i + 1].y), IM_COL32(255, 255, 0, 255), 2.0f);
- draw_list->PopClipRect();
- if (adding_preview)
- points.pop_back();
}
+
ImGui::End();
}
// End of Demo code
#else
+void ImGui::ShowAboutWindow(bool*) {}
void ImGui::ShowDemoWindow(bool*) {}
void ImGui::ShowUserGuide() {}
void ImGui::ShowStyleEditor(ImGuiStyle*) {}
#endif
+
+#endif // #ifndef IMGUI_DISABLE
diff --git a/src/imgui/imgui_draw.cpp b/src/imgui/imgui_draw.cpp
index 553fb16ee..4e6f1374b 100644
--- a/src/imgui/imgui_draw.cpp
+++ b/src/imgui/imgui_draw.cpp
@@ -1,4 +1,4 @@
-// dear imgui, v1.66 WIP
+// dear imgui, v1.75
// (drawing and font code)
/*
@@ -8,11 +8,13 @@ Index of this file:
// [SECTION] STB libraries implementation
// [SECTION] Style functions
// [SECTION] ImDrawList
+// [SECTION] ImDrawListSplitter
// [SECTION] ImDrawData
// [SECTION] Helpers ShadeVertsXXX functions
// [SECTION] ImFontConfig
// [SECTION] ImFontAtlas
-// [SECTION] ImFontAtlas glyph ranges helpers + GlyphRangesBuilder
+// [SECTION] ImFontAtlas glyph ranges helpers
+// [SECTION] ImFontGlyphRangesBuilder
// [SECTION] ImFont
// [SECTION] Internal Render Helpers
// [SECTION] Decompression code
@@ -25,14 +27,17 @@ Index of this file:
#endif
#include "imgui.h"
+#ifndef IMGUI_DISABLE
+
#ifndef IMGUI_DEFINE_MATH_OPERATORS
#define IMGUI_DEFINE_MATH_OPERATORS
#endif
#include "imgui_internal.h"
+#include "imconfig.h"
#include <stdio.h> // vsnprintf, sscanf, printf
#if !defined(alloca)
-#if defined(__GLIBC__) || defined(__sun) || defined(__CYGWIN__)
+#if defined(__GLIBC__) || defined(__sun) || defined(__CYGWIN__) || defined(__APPLE__) || defined(__SWITCH__)
#include <alloca.h> // alloca (glibc uses <alloca.h>. Note that Cygwin may have _WIN32 defined, so the order matters here)
#elif defined(_WIN32)
#include <malloc.h> // alloca
@@ -46,16 +51,20 @@ Index of this file:
// Visual Studio warnings
#ifdef _MSC_VER
+#pragma warning (disable: 4127) // condition expression is constant
#pragma warning (disable: 4505) // unreferenced local function has been removed (stb stuff)
#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen
#endif
// Clang/GCC warnings with -Weverything
-#ifdef __clang__
+#if defined(__clang__)
#pragma clang diagnostic ignored "-Wold-style-cast" // warning : use of old-style cast // yes, they are more terse.
#pragma clang diagnostic ignored "-Wfloat-equal" // warning : comparing floating point with == or != is unsafe // storing and comparing against same constants ok.
-#pragma clang diagnostic ignored "-Wglobal-constructors" // warning : declaration requires a global destructor // similar to above, not sure what the exact difference it.
+#pragma clang diagnostic ignored "-Wglobal-constructors" // warning : declaration requires a global destructor // similar to above, not sure what the exact difference is.
#pragma clang diagnostic ignored "-Wsign-conversion" // warning : implicit conversion changes signedness //
+#if __has_warning("-Wzero-as-null-pointer-constant")
+#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning : zero as null pointer constant // some standard header variations use #define NULL 0
+#endif
#if __has_warning("-Wcomma")
#pragma clang diagnostic ignored "-Wcomma" // warning : possible misuse of comma operator here //
#endif
@@ -63,15 +72,15 @@ Index of this file:
#pragma clang diagnostic ignored "-Wreserved-id-macro" // warning : macro name is a reserved identifier //
#endif
#if __has_warning("-Wdouble-promotion")
-#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function
+#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double.
#endif
#elif defined(__GNUC__)
+#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
#pragma GCC diagnostic ignored "-Wunused-function" // warning: 'xxxx' defined but not used
#pragma GCC diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function
#pragma GCC diagnostic ignored "-Wconversion" // warning: conversion to 'xxxx' from 'xxxx' may alter its value
-#if __GNUC__ >= 8
-#pragma GCC diagnostic ignored "-Wclass-memaccess" // warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
-#endif
+#pragma GCC diagnostic ignored "-Wstack-protector" // warning: stack protector not protecting local variables: variable length buffer
+#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
#endif
//-------------------------------------------------------------------------
@@ -79,7 +88,7 @@ Index of this file:
//-------------------------------------------------------------------------
// Compile time options:
-//#define IMGUI_STB_NAMESPACE ImGuiStb
+//#define IMGUI_STB_NAMESPACE ImStb
//#define IMGUI_STB_TRUETYPE_FILENAME "my_folder/stb_truetype.h"
//#define IMGUI_STB_RECT_PACK_FILENAME "my_folder/stb_rect_pack.h"
//#define IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION
@@ -95,7 +104,7 @@ namespace IMGUI_STB_NAMESPACE
#pragma warning (disable: 4456) // declaration of 'xx' hides previous local declaration
#endif
-#ifdef __clang__
+#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-function"
#pragma clang diagnostic ignored "-Wmissing-prototypes"
@@ -103,7 +112,7 @@ namespace IMGUI_STB_NAMESPACE
#pragma clang diagnostic ignored "-Wcast-qual" // warning : cast from 'const xxxx *' to 'xxx *' drops const qualifier //
#endif
-#ifdef __GNUC__
+#if defined(__GNUC__)
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wtype-limits" // warning: comparison is always true due to limited range of data type [-Wtype-limits]
#pragma GCC diagnostic ignored "-Wcast-qual" // warning: cast from type 'const xxxx *' to type 'xxxx *' casts away qualifiers
@@ -125,8 +134,8 @@ namespace IMGUI_STB_NAMESPACE
#ifndef STB_TRUETYPE_IMPLEMENTATION // in case the user already have an implementation in the _same_ compilation unit (e.g. unity builds)
#ifndef IMGUI_DISABLE_STB_TRUETYPE_IMPLEMENTATION
-#define STBTT_malloc(x,u) ((void)(u), ImGui::MemAlloc(x))
-#define STBTT_free(x,u) ((void)(u), ImGui::MemFree(x))
+#define STBTT_malloc(x,u) ((void)(u), IM_ALLOC(x))
+#define STBTT_free(x,u) ((void)(u), IM_FREE(x))
#define STBTT_assert(x) IM_ASSERT(x)
#define STBTT_fmod(x,y) ImFmod(x,y)
#define STBTT_sqrt(x) ImSqrt(x)
@@ -146,20 +155,20 @@ namespace IMGUI_STB_NAMESPACE
#endif
#endif
-#ifdef __GNUC__
+#if defined(__GNUC__)
#pragma GCC diagnostic pop
#endif
-#ifdef __clang__
+#if defined(__clang__)
#pragma clang diagnostic pop
#endif
-#ifdef _MSC_VER
+#if defined(_MSC_VER)
#pragma warning (pop)
#endif
#ifdef IMGUI_STB_NAMESPACE
-} // namespace ImGuiStb
+} // namespace ImStb
using namespace IMGUI_STB_NAMESPACE;
#endif
@@ -175,7 +184,7 @@ void ImGui::StyleColorsDark(ImGuiStyle* dst)
colors[ImGuiCol_Text] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f);
colors[ImGuiCol_TextDisabled] = ImVec4(0.50f, 0.50f, 0.50f, 1.00f);
colors[ImGuiCol_WindowBg] = ImVec4(0.06f, 0.06f, 0.06f, 0.94f);
- colors[ImGuiCol_ChildBg] = ImVec4(1.00f, 1.00f, 1.00f, 0.00f);
+ colors[ImGuiCol_ChildBg] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);
colors[ImGuiCol_PopupBg] = ImVec4(0.08f, 0.08f, 0.08f, 0.94f);
colors[ImGuiCol_Border] = ImVec4(0.43f, 0.43f, 0.50f, 0.50f);
colors[ImGuiCol_BorderShadow] = ImVec4(0.00f, 0.00f, 0.00f, 0.00f);
@@ -205,6 +214,11 @@ void ImGui::StyleColorsDark(ImGuiStyle* dst)
colors[ImGuiCol_ResizeGrip] = ImVec4(0.26f, 0.59f, 0.98f, 0.25f);
colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.67f);
colors[ImGuiCol_ResizeGripActive] = ImVec4(0.26f, 0.59f, 0.98f, 0.95f);
+ colors[ImGuiCol_Tab] = ImLerp(colors[ImGuiCol_Header], colors[ImGuiCol_TitleBgActive], 0.80f);
+ colors[ImGuiCol_TabHovered] = colors[ImGuiCol_HeaderHovered];
+ colors[ImGuiCol_TabActive] = ImLerp(colors[ImGuiCol_HeaderActive], colors[ImGuiCol_TitleBgActive], 0.60f);
+ colors[ImGuiCol_TabUnfocused] = ImLerp(colors[ImGuiCol_Tab], colors[ImGuiCol_TitleBg], 0.80f);
+ colors[ImGuiCol_TabUnfocusedActive] = ImLerp(colors[ImGuiCol_TabActive], colors[ImGuiCol_TitleBg], 0.40f);
colors[ImGuiCol_PlotLines] = ImVec4(0.61f, 0.61f, 0.61f, 1.00f);
colors[ImGuiCol_PlotLinesHovered] = ImVec4(1.00f, 0.43f, 0.35f, 1.00f);
colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f);
@@ -249,12 +263,17 @@ void ImGui::StyleColorsClassic(ImGuiStyle* dst)
colors[ImGuiCol_Header] = ImVec4(0.40f, 0.40f, 0.90f, 0.45f);
colors[ImGuiCol_HeaderHovered] = ImVec4(0.45f, 0.45f, 0.90f, 0.80f);
colors[ImGuiCol_HeaderActive] = ImVec4(0.53f, 0.53f, 0.87f, 0.80f);
- colors[ImGuiCol_Separator] = ImVec4(0.50f, 0.50f, 0.50f, 1.00f);
+ colors[ImGuiCol_Separator] = ImVec4(0.50f, 0.50f, 0.50f, 0.60f);
colors[ImGuiCol_SeparatorHovered] = ImVec4(0.60f, 0.60f, 0.70f, 1.00f);
colors[ImGuiCol_SeparatorActive] = ImVec4(0.70f, 0.70f, 0.90f, 1.00f);
colors[ImGuiCol_ResizeGrip] = ImVec4(1.00f, 1.00f, 1.00f, 0.16f);
colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.78f, 0.82f, 1.00f, 0.60f);
colors[ImGuiCol_ResizeGripActive] = ImVec4(0.78f, 0.82f, 1.00f, 0.90f);
+ colors[ImGuiCol_Tab] = ImLerp(colors[ImGuiCol_Header], colors[ImGuiCol_TitleBgActive], 0.80f);
+ colors[ImGuiCol_TabHovered] = colors[ImGuiCol_HeaderHovered];
+ colors[ImGuiCol_TabActive] = ImLerp(colors[ImGuiCol_HeaderActive], colors[ImGuiCol_TitleBgActive], 0.60f);
+ colors[ImGuiCol_TabUnfocused] = ImLerp(colors[ImGuiCol_Tab], colors[ImGuiCol_TitleBg], 0.80f);
+ colors[ImGuiCol_TabUnfocusedActive] = ImLerp(colors[ImGuiCol_TabActive], colors[ImGuiCol_TitleBg], 0.40f);
colors[ImGuiCol_PlotLines] = ImVec4(1.00f, 1.00f, 1.00f, 1.00f);
colors[ImGuiCol_PlotLinesHovered] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f);
colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f);
@@ -300,12 +319,17 @@ void ImGui::StyleColorsLight(ImGuiStyle* dst)
colors[ImGuiCol_Header] = ImVec4(0.26f, 0.59f, 0.98f, 0.31f);
colors[ImGuiCol_HeaderHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.80f);
colors[ImGuiCol_HeaderActive] = ImVec4(0.26f, 0.59f, 0.98f, 1.00f);
- colors[ImGuiCol_Separator] = ImVec4(0.39f, 0.39f, 0.39f, 1.00f);
+ colors[ImGuiCol_Separator] = ImVec4(0.39f, 0.39f, 0.39f, 0.62f);
colors[ImGuiCol_SeparatorHovered] = ImVec4(0.14f, 0.44f, 0.80f, 0.78f);
colors[ImGuiCol_SeparatorActive] = ImVec4(0.14f, 0.44f, 0.80f, 1.00f);
colors[ImGuiCol_ResizeGrip] = ImVec4(0.80f, 0.80f, 0.80f, 0.56f);
colors[ImGuiCol_ResizeGripHovered] = ImVec4(0.26f, 0.59f, 0.98f, 0.67f);
colors[ImGuiCol_ResizeGripActive] = ImVec4(0.26f, 0.59f, 0.98f, 0.95f);
+ colors[ImGuiCol_Tab] = ImLerp(colors[ImGuiCol_Header], colors[ImGuiCol_TitleBgActive], 0.90f);
+ colors[ImGuiCol_TabHovered] = colors[ImGuiCol_HeaderHovered];
+ colors[ImGuiCol_TabActive] = ImLerp(colors[ImGuiCol_HeaderActive], colors[ImGuiCol_TitleBgActive], 0.60f);
+ colors[ImGuiCol_TabUnfocused] = ImLerp(colors[ImGuiCol_Tab], colors[ImGuiCol_TitleBg], 0.80f);
+ colors[ImGuiCol_TabUnfocusedActive] = ImLerp(colors[ImGuiCol_TabActive], colors[ImGuiCol_TitleBg], 0.40f);
colors[ImGuiCol_PlotLines] = ImVec4(0.39f, 0.39f, 0.39f, 1.00f);
colors[ImGuiCol_PlotLinesHovered] = ImVec4(1.00f, 0.43f, 0.35f, 1.00f);
colors[ImGuiCol_PlotHistogram] = ImVec4(0.90f, 0.70f, 0.00f, 1.00f);
@@ -327,14 +351,30 @@ ImDrawListSharedData::ImDrawListSharedData()
Font = NULL;
FontSize = 0.0f;
CurveTessellationTol = 0.0f;
+ CircleSegmentMaxError = 0.0f;
ClipRectFullscreen = ImVec4(-8192.0f, -8192.0f, +8192.0f, +8192.0f);
+ InitialFlags = ImDrawListFlags_None;
- // Const data
+ // Lookup tables
for (int i = 0; i < IM_ARRAYSIZE(CircleVtx12); i++)
{
const float a = ((float)i * 2 * IM_PI) / (float)IM_ARRAYSIZE(CircleVtx12);
CircleVtx12[i] = ImVec2(ImCos(a), ImSin(a));
}
+ memset(CircleSegmentCounts, 0, sizeof(CircleSegmentCounts)); // This will be set by SetCircleSegmentMaxError()
+}
+
+void ImDrawListSharedData::SetCircleSegmentMaxError(float max_error)
+{
+ if (CircleSegmentMaxError == max_error)
+ return;
+ CircleSegmentMaxError = max_error;
+ for (int i = 0; i < IM_ARRAYSIZE(CircleSegmentCounts); i++)
+ {
+ const float radius = i + 1.0f;
+ const int segment_count = IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(radius, CircleSegmentMaxError);
+ CircleSegmentCounts[i] = (ImU8)ImMin(segment_count, 255);
+ }
}
void ImDrawList::Clear()
@@ -342,16 +382,15 @@ void ImDrawList::Clear()
CmdBuffer.resize(0);
IdxBuffer.resize(0);
VtxBuffer.resize(0);
- Flags = ImDrawListFlags_AntiAliasedLines | ImDrawListFlags_AntiAliasedFill;
+ Flags = _Data ? _Data->InitialFlags : ImDrawListFlags_None;
+ _VtxCurrentOffset = 0;
_VtxCurrentIdx = 0;
_VtxWritePtr = NULL;
_IdxWritePtr = NULL;
_ClipRectStack.resize(0);
_TextureIdStack.resize(0);
_Path.resize(0);
- _ChannelsCurrent = 0;
- _ChannelsCount = 1;
- // NB: Do not clear channels so our allocations are re-used after the first frame.
+ _Splitter.Clear();
}
void ImDrawList::ClearFreeMemory()
@@ -365,20 +404,12 @@ void ImDrawList::ClearFreeMemory()
_ClipRectStack.clear();
_TextureIdStack.clear();
_Path.clear();
- _ChannelsCurrent = 0;
- _ChannelsCount = 1;
- for (int i = 0; i < _Channels.Size; i++)
- {
- if (i == 0) memset(&_Channels[0], 0, sizeof(_Channels[0])); // channel 0 is a copy of CmdBuffer/IdxBuffer, don't destruct again
- _Channels[i].CmdBuffer.clear();
- _Channels[i].IdxBuffer.clear();
- }
- _Channels.clear();
+ _Splitter.ClearFreeMemory();
}
ImDrawList* ImDrawList::CloneOutput() const
{
- ImDrawList* dst = IM_NEW(ImDrawList(NULL));
+ ImDrawList* dst = IM_NEW(ImDrawList(_Data));
dst->CmdBuffer = CmdBuffer;
dst->IdxBuffer = IdxBuffer;
dst->VtxBuffer = VtxBuffer;
@@ -388,13 +419,15 @@ ImDrawList* ImDrawList::CloneOutput() const
// Using macros because C++ is a terrible language, we want guaranteed inline, no code in header, and no overhead in Debug builds
#define GetCurrentClipRect() (_ClipRectStack.Size ? _ClipRectStack.Data[_ClipRectStack.Size-1] : _Data->ClipRectFullscreen)
-#define GetCurrentTextureId() (_TextureIdStack.Size ? _TextureIdStack.Data[_TextureIdStack.Size-1] : NULL)
+#define GetCurrentTextureId() (_TextureIdStack.Size ? _TextureIdStack.Data[_TextureIdStack.Size-1] : (ImTextureID)NULL)
void ImDrawList::AddDrawCmd()
{
ImDrawCmd draw_cmd;
draw_cmd.ClipRect = GetCurrentClipRect();
draw_cmd.TextureId = GetCurrentTextureId();
+ draw_cmd.VtxOffset = _VtxCurrentOffset;
+ draw_cmd.IdxOffset = IdxBuffer.Size;
IM_ASSERT(draw_cmd.ClipRect.x <= draw_cmd.ClipRect.z && draw_cmd.ClipRect.y <= draw_cmd.ClipRect.w);
CmdBuffer.push_back(draw_cmd);
@@ -501,89 +534,21 @@ void ImDrawList::PopTextureID()
UpdateTextureID();
}
-void ImDrawList::ChannelsSplit(int channels_count)
-{
- IM_ASSERT(_ChannelsCurrent == 0 && _ChannelsCount == 1);
- int old_channels_count = _Channels.Size;
- if (old_channels_count < channels_count)
- _Channels.resize(channels_count);
- _ChannelsCount = channels_count;
-
- // _Channels[] (24/32 bytes each) hold storage that we'll swap with this->_CmdBuffer/_IdxBuffer
- // The content of _Channels[0] at this point doesn't matter. We clear it to make state tidy in a debugger but we don't strictly need to.
- // When we switch to the next channel, we'll copy _CmdBuffer/_IdxBuffer into _Channels[0] and then _Channels[1] into _CmdBuffer/_IdxBuffer
- memset(&_Channels[0], 0, sizeof(ImDrawChannel));
- for (int i = 1; i < channels_count; i++)
- {
- if (i >= old_channels_count)
- {
- IM_PLACEMENT_NEW(&_Channels[i]) ImDrawChannel();
- }
- else
- {
- _Channels[i].CmdBuffer.resize(0);
- _Channels[i].IdxBuffer.resize(0);
- }
- if (_Channels[i].CmdBuffer.Size == 0)
- {
- ImDrawCmd draw_cmd;
- draw_cmd.ClipRect = _ClipRectStack.back();
- draw_cmd.TextureId = _TextureIdStack.back();
- _Channels[i].CmdBuffer.push_back(draw_cmd);
- }
- }
-}
-
-void ImDrawList::ChannelsMerge()
+// Reserve space for a number of vertices and indices.
+// You must finish filling your reserved data before calling PrimReserve() again, as it may reallocate or
+// submit the intermediate results. PrimUnreserve() can be used to release unused allocations.
+void ImDrawList::PrimReserve(int idx_count, int vtx_count)
{
- // Note that we never use or rely on channels.Size because it is merely a buffer that we never shrink back to 0 to keep all sub-buffers ready for use.
- if (_ChannelsCount <= 1)
- return;
-
- ChannelsSetCurrent(0);
- if (CmdBuffer.Size && CmdBuffer.back().ElemCount == 0)
- CmdBuffer.pop_back();
-
- int new_cmd_buffer_count = 0, new_idx_buffer_count = 0;
- for (int i = 1; i < _ChannelsCount; i++)
- {
- ImDrawChannel& ch = _Channels[i];
- if (ch.CmdBuffer.Size && ch.CmdBuffer.back().ElemCount == 0)
- ch.CmdBuffer.pop_back();
- new_cmd_buffer_count += ch.CmdBuffer.Size;
- new_idx_buffer_count += ch.IdxBuffer.Size;
- }
- CmdBuffer.resize(CmdBuffer.Size + new_cmd_buffer_count);
- IdxBuffer.resize(IdxBuffer.Size + new_idx_buffer_count);
-
- ImDrawCmd* cmd_write = CmdBuffer.Data + CmdBuffer.Size - new_cmd_buffer_count;
- _IdxWritePtr = IdxBuffer.Data + IdxBuffer.Size - new_idx_buffer_count;
- for (int i = 1; i < _ChannelsCount; i++)
+ // Large mesh support (when enabled)
+ IM_ASSERT_PARANOID(idx_count >= 0 && vtx_count >= 0);
+ if (sizeof(ImDrawIdx) == 2 && (_VtxCurrentIdx + vtx_count >= (1 << 16)) && (Flags & ImDrawListFlags_AllowVtxOffset))
{
- ImDrawChannel& ch = _Channels[i];
- if (int sz = ch.CmdBuffer.Size) { memcpy(cmd_write, ch.CmdBuffer.Data, sz * sizeof(ImDrawCmd)); cmd_write += sz; }
- if (int sz = ch.IdxBuffer.Size) { memcpy(_IdxWritePtr, ch.IdxBuffer.Data, sz * sizeof(ImDrawIdx)); _IdxWritePtr += sz; }
+ _VtxCurrentOffset = VtxBuffer.Size;
+ _VtxCurrentIdx = 0;
+ AddDrawCmd();
}
- UpdateClipRect(); // We call this instead of AddDrawCmd(), so that empty channels won't produce an extra draw call.
- _ChannelsCount = 1;
-}
-void ImDrawList::ChannelsSetCurrent(int idx)
-{
- IM_ASSERT(idx < _ChannelsCount);
- if (_ChannelsCurrent == idx) return;
- memcpy(&_Channels.Data[_ChannelsCurrent].CmdBuffer, &CmdBuffer, sizeof(CmdBuffer)); // copy 12 bytes, four times
- memcpy(&_Channels.Data[_ChannelsCurrent].IdxBuffer, &IdxBuffer, sizeof(IdxBuffer));
- _ChannelsCurrent = idx;
- memcpy(&CmdBuffer, &_Channels.Data[_ChannelsCurrent].CmdBuffer, sizeof(CmdBuffer));
- memcpy(&IdxBuffer, &_Channels.Data[_ChannelsCurrent].IdxBuffer, sizeof(IdxBuffer));
- _IdxWritePtr = IdxBuffer.Data + IdxBuffer.Size;
-}
-
-// NB: this can be called with negative count for removing primitives (as long as the result does not underflow)
-void ImDrawList::PrimReserve(int idx_count, int vtx_count)
-{
- ImDrawCmd& draw_cmd = CmdBuffer.Data[CmdBuffer.Size-1];
+ ImDrawCmd& draw_cmd = CmdBuffer.Data[CmdBuffer.Size - 1];
draw_cmd.ElemCount += idx_count;
int vtx_buffer_old_size = VtxBuffer.Size;
@@ -595,6 +560,17 @@ void ImDrawList::PrimReserve(int idx_count, int vtx_count)
_IdxWritePtr = IdxBuffer.Data + idx_buffer_old_size;
}
+// Release the a number of reserved vertices/indices from the end of the last reservation made with PrimReserve().
+void ImDrawList::PrimUnreserve(int idx_count, int vtx_count)
+{
+ IM_ASSERT_PARANOID(idx_count >= 0 && vtx_count >= 0);
+
+ ImDrawCmd& draw_cmd = CmdBuffer.Data[CmdBuffer.Size - 1];
+ draw_cmd.ElemCount -= idx_count;
+ VtxBuffer.shrink(VtxBuffer.Size - vtx_count);
+ IdxBuffer.shrink(IdxBuffer.Size - idx_count);
+}
+
// Fully unrolled with inline call to keep our debug builds decently fast.
void ImDrawList::PrimRect(const ImVec2& a, const ImVec2& c, ImU32 col)
{
@@ -640,7 +616,13 @@ void ImDrawList::PrimQuadUV(const ImVec2& a, const ImVec2& b, const ImVec2& c, c
_IdxWritePtr += 6;
}
+// On AddPolyline() and AddConvexPolyFilled() we intentionally avoid using ImVec2 and superflous function calls to optimize debug/non-inlined builds.
+// Those macros expects l-values.
+#define IM_NORMALIZE2F_OVER_ZERO(VX,VY) { float d2 = VX*VX + VY*VY; if (d2 > 0.0f) { float inv_len = 1.0f / ImSqrt(d2); VX *= inv_len; VY *= inv_len; } }
+#define IM_FIXNORMAL2F(VX,VY) { float d2 = VX*VX + VY*VY; if (d2 < 0.5f) d2 = 0.5f; float inv_lensq = 1.0f / d2; VX *= inv_lensq; VY *= inv_lensq; }
+
// TODO: Thickness anti-aliased lines cap are missing their AA fringe.
+// We avoid using the ImVec2 math operators here to reduce cost to a minimum for debug/non-inlined builds.
void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32 col, bool closed, float thickness)
{
if (points_count < 2)
@@ -664,16 +646,17 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32
PrimReserve(idx_count, vtx_count);
// Temporary buffer
- ImVec2* temp_normals = (ImVec2*)alloca(points_count * (thick_line ? 5 : 3) * sizeof(ImVec2));
+ ImVec2* temp_normals = (ImVec2*)alloca(points_count * (thick_line ? 5 : 3) * sizeof(ImVec2)); //-V630
ImVec2* temp_points = temp_normals + points_count;
for (int i1 = 0; i1 < count; i1++)
{
const int i2 = (i1+1) == points_count ? 0 : i1+1;
- ImVec2 diff = points[i2] - points[i1];
- diff *= ImInvLength(diff, 1.0f);
- temp_normals[i1].x = diff.y;
- temp_normals[i1].y = -diff.x;
+ float dx = points[i2].x - points[i1].x;
+ float dy = points[i2].y - points[i1].y;
+ IM_NORMALIZE2F_OVER_ZERO(dx, dy);
+ temp_normals[i1].x = dy;
+ temp_normals[i1].y = -dx;
}
if (!closed)
temp_normals[points_count-1] = temp_normals[points_count-2];
@@ -696,17 +679,18 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32
unsigned int idx2 = (i1+1) == points_count ? _VtxCurrentIdx : idx1+3;
// Average normals
- ImVec2 dm = (temp_normals[i1] + temp_normals[i2]) * 0.5f;
- float dmr2 = dm.x*dm.x + dm.y*dm.y;
- if (dmr2 > 0.000001f)
- {
- float scale = 1.0f / dmr2;
- if (scale > 100.0f) scale = 100.0f;
- dm *= scale;
- }
- dm *= AA_SIZE;
- temp_points[i2*2+0] = points[i2] + dm;
- temp_points[i2*2+1] = points[i2] - dm;
+ float dm_x = (temp_normals[i1].x + temp_normals[i2].x) * 0.5f;
+ float dm_y = (temp_normals[i1].y + temp_normals[i2].y) * 0.5f;
+ IM_FIXNORMAL2F(dm_x, dm_y)
+ dm_x *= AA_SIZE;
+ dm_y *= AA_SIZE;
+
+ // Add temporary vertexes
+ ImVec2* out_vtx = &temp_points[i2*2];
+ out_vtx[0].x = points[i2].x + dm_x;
+ out_vtx[0].y = points[i2].y + dm_y;
+ out_vtx[1].x = points[i2].x - dm_x;
+ out_vtx[1].y = points[i2].y - dm_y;
// Add indexes
_IdxWritePtr[0] = (ImDrawIdx)(idx2+0); _IdxWritePtr[1] = (ImDrawIdx)(idx1+0); _IdxWritePtr[2] = (ImDrawIdx)(idx1+2);
@@ -750,20 +734,24 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32
unsigned int idx2 = (i1+1) == points_count ? _VtxCurrentIdx : idx1+4;
// Average normals
- ImVec2 dm = (temp_normals[i1] + temp_normals[i2]) * 0.5f;
- float dmr2 = dm.x*dm.x + dm.y*dm.y;
- if (dmr2 > 0.000001f)
- {
- float scale = 1.0f / dmr2;
- if (scale > 100.0f) scale = 100.0f;
- dm *= scale;
- }
- ImVec2 dm_out = dm * (half_inner_thickness + AA_SIZE);
- ImVec2 dm_in = dm * half_inner_thickness;
- temp_points[i2*4+0] = points[i2] + dm_out;
- temp_points[i2*4+1] = points[i2] + dm_in;
- temp_points[i2*4+2] = points[i2] - dm_in;
- temp_points[i2*4+3] = points[i2] - dm_out;
+ float dm_x = (temp_normals[i1].x + temp_normals[i2].x) * 0.5f;
+ float dm_y = (temp_normals[i1].y + temp_normals[i2].y) * 0.5f;
+ IM_FIXNORMAL2F(dm_x, dm_y);
+ float dm_out_x = dm_x * (half_inner_thickness + AA_SIZE);
+ float dm_out_y = dm_y * (half_inner_thickness + AA_SIZE);
+ float dm_in_x = dm_x * half_inner_thickness;
+ float dm_in_y = dm_y * half_inner_thickness;
+
+ // Add temporary vertexes
+ ImVec2* out_vtx = &temp_points[i2*4];
+ out_vtx[0].x = points[i2].x + dm_out_x;
+ out_vtx[0].y = points[i2].y + dm_out_y;
+ out_vtx[1].x = points[i2].x + dm_in_x;
+ out_vtx[1].y = points[i2].y + dm_in_y;
+ out_vtx[2].x = points[i2].x - dm_in_x;
+ out_vtx[2].y = points[i2].y - dm_in_y;
+ out_vtx[3].x = points[i2].x - dm_out_x;
+ out_vtx[3].y = points[i2].y - dm_out_y;
// Add indexes
_IdxWritePtr[0] = (ImDrawIdx)(idx2+1); _IdxWritePtr[1] = (ImDrawIdx)(idx1+1); _IdxWritePtr[2] = (ImDrawIdx)(idx1+2);
@@ -801,11 +789,13 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32
const int i2 = (i1+1) == points_count ? 0 : i1+1;
const ImVec2& p1 = points[i1];
const ImVec2& p2 = points[i2];
- ImVec2 diff = p2 - p1;
- diff *= ImInvLength(diff, 1.0f);
- const float dx = diff.x * (thickness * 0.5f);
- const float dy = diff.y * (thickness * 0.5f);
+ float dx = p2.x - p1.x;
+ float dy = p2.y - p1.y;
+ IM_NORMALIZE2F_OVER_ZERO(dx, dy);
+ dx *= (thickness * 0.5f);
+ dy *= (thickness * 0.5f);
+
_VtxWritePtr[0].pos.x = p1.x + dy; _VtxWritePtr[0].pos.y = p1.y - dx; _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col;
_VtxWritePtr[1].pos.x = p2.x + dy; _VtxWritePtr[1].pos.y = p2.y - dx; _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col;
_VtxWritePtr[2].pos.x = p2.x - dy; _VtxWritePtr[2].pos.y = p2.y + dx; _VtxWritePtr[2].uv = uv; _VtxWritePtr[2].col = col;
@@ -820,6 +810,7 @@ void ImDrawList::AddPolyline(const ImVec2* points, const int points_count, ImU32
}
}
+// We intentionally avoid using ImVec2 and its math operators here to reduce cost to a minimum for debug/non-inlined builds.
void ImDrawList::AddConvexPolyFilled(const ImVec2* points, const int points_count, ImU32 col)
{
if (points_count < 3)
@@ -846,15 +837,16 @@ void ImDrawList::AddConvexPolyFilled(const ImVec2* points, const int points_coun
}
// Compute normals
- ImVec2* temp_normals = (ImVec2*)alloca(points_count * sizeof(ImVec2));
+ ImVec2* temp_normals = (ImVec2*)alloca(points_count * sizeof(ImVec2)); //-V630
for (int i0 = points_count-1, i1 = 0; i1 < points_count; i0 = i1++)
{
const ImVec2& p0 = points[i0];
const ImVec2& p1 = points[i1];
- ImVec2 diff = p1 - p0;
- diff *= ImInvLength(diff, 1.0f);
- temp_normals[i0].x = diff.y;
- temp_normals[i0].y = -diff.x;
+ float dx = p1.x - p0.x;
+ float dy = p1.y - p0.y;
+ IM_NORMALIZE2F_OVER_ZERO(dx, dy);
+ temp_normals[i0].x = dy;
+ temp_normals[i0].y = -dx;
}
for (int i0 = points_count-1, i1 = 0; i1 < points_count; i0 = i1++)
@@ -862,19 +854,15 @@ void ImDrawList::AddConvexPolyFilled(const ImVec2* points, const int points_coun
// Average normals
const ImVec2& n0 = temp_normals[i0];
const ImVec2& n1 = temp_normals[i1];
- ImVec2 dm = (n0 + n1) * 0.5f;
- float dmr2 = dm.x*dm.x + dm.y*dm.y;
- if (dmr2 > 0.000001f)
- {
- float scale = 1.0f / dmr2;
- if (scale > 100.0f) scale = 100.0f;
- dm *= scale;
- }
- dm *= AA_SIZE * 0.5f;
+ float dm_x = (n0.x + n1.x) * 0.5f;
+ float dm_y = (n0.y + n1.y) * 0.5f;
+ IM_FIXNORMAL2F(dm_x, dm_y);
+ dm_x *= AA_SIZE * 0.5f;
+ dm_y *= AA_SIZE * 0.5f;
// Add vertices
- _VtxWritePtr[0].pos = (points[i1] - dm); _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col; // Inner
- _VtxWritePtr[1].pos = (points[i1] + dm); _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col_trans; // Outer
+ _VtxWritePtr[0].pos.x = (points[i1].x - dm_x); _VtxWritePtr[0].pos.y = (points[i1].y - dm_y); _VtxWritePtr[0].uv = uv; _VtxWritePtr[0].col = col; // Inner
+ _VtxWritePtr[1].pos.x = (points[i1].x + dm_x); _VtxWritePtr[1].pos.y = (points[i1].y + dm_y); _VtxWritePtr[1].uv = uv; _VtxWritePtr[1].col = col_trans; // Outer
_VtxWritePtr += 2;
// Add indexes for fringes
@@ -904,36 +892,50 @@ void ImDrawList::AddConvexPolyFilled(const ImVec2* points, const int points_coun
}
}
-void ImDrawList::PathArcToFast(const ImVec2& centre, float radius, int a_min_of_12, int a_max_of_12)
+void ImDrawList::PathArcToFast(const ImVec2& center, float radius, int a_min_of_12, int a_max_of_12)
{
if (radius == 0.0f || a_min_of_12 > a_max_of_12)
{
- _Path.push_back(centre);
+ _Path.push_back(center);
return;
}
_Path.reserve(_Path.Size + (a_max_of_12 - a_min_of_12 + 1));
for (int a = a_min_of_12; a <= a_max_of_12; a++)
{
const ImVec2& c = _Data->CircleVtx12[a % IM_ARRAYSIZE(_Data->CircleVtx12)];
- _Path.push_back(ImVec2(centre.x + c.x * radius, centre.y + c.y * radius));
+ _Path.push_back(ImVec2(center.x + c.x * radius, center.y + c.y * radius));
}
}
-void ImDrawList::PathArcTo(const ImVec2& centre, float radius, float a_min, float a_max, int num_segments)
+void ImDrawList::PathArcTo(const ImVec2& center, float radius, float a_min, float a_max, int num_segments)
{
if (radius == 0.0f)
{
- _Path.push_back(centre);
+ _Path.push_back(center);
return;
}
+
+ // Note that we are adding a point at both a_min and a_max.
+ // If you are trying to draw a full closed circle you don't want the overlapping points!
_Path.reserve(_Path.Size + (num_segments + 1));
for (int i = 0; i <= num_segments; i++)
{
const float a = a_min + ((float)i / (float)num_segments) * (a_max - a_min);
- _Path.push_back(ImVec2(centre.x + ImCos(a) * radius, centre.y + ImSin(a) * radius));
+ _Path.push_back(ImVec2(center.x + ImCos(a) * radius, center.y + ImSin(a) * radius));
}
}
+ImVec2 ImBezierCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, float t)
+{
+ float u = 1.0f - t;
+ float w1 = u*u*u;
+ float w2 = 3*u*u*t;
+ float w3 = 3*u*t*t;
+ float w4 = t*t*t;
+ return ImVec2(w1*p1.x + w2*p2.x + w3*p3.x + w4*p4.x, w1*p1.y + w2*p2.y + w3*p3.y + w4*p4.y);
+}
+
+// Closely mimics BezierClosestPointCasteljauStep() in imgui.cpp
static void PathBezierToCasteljau(ImVector<ImVec2>* path, float x1, float y1, float x2, float y2, float x3, float y3, float x4, float y4, float tess_tol, int level)
{
float dx = x4 - x1;
@@ -954,7 +956,6 @@ static void PathBezierToCasteljau(ImVector<ImVec2>* path, float x1, float y1, fl
float x123 = (x12+x23)*0.5f, y123 = (y12+y23)*0.5f;
float x234 = (x23+x34)*0.5f, y234 = (y23+y34)*0.5f;
float x1234 = (x123+x234)*0.5f, y1234 = (y123+y234)*0.5f;
-
PathBezierToCasteljau(path, x1,y1, x12,y12, x123,y123, x1234,y1234, tess_tol, level+1);
PathBezierToCasteljau(path, x1234,y1234, x234,y234, x34,y34, x4,y4, tess_tol, level+1);
}
@@ -965,26 +966,17 @@ void ImDrawList::PathBezierCurveTo(const ImVec2& p2, const ImVec2& p3, const ImV
ImVec2 p1 = _Path.back();
if (num_segments == 0)
{
- // Auto-tessellated
- PathBezierToCasteljau(&_Path, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, p4.x, p4.y, _Data->CurveTessellationTol, 0);
+ PathBezierToCasteljau(&_Path, p1.x, p1.y, p2.x, p2.y, p3.x, p3.y, p4.x, p4.y, _Data->CurveTessellationTol, 0); // Auto-tessellated
}
else
{
float t_step = 1.0f / (float)num_segments;
for (int i_step = 1; i_step <= num_segments; i_step++)
- {
- float t = t_step * i_step;
- float u = 1.0f - t;
- float w1 = u*u*u;
- float w2 = 3*u*u*t;
- float w3 = 3*u*t*t;
- float w4 = t*t*t;
- _Path.push_back(ImVec2(w1*p1.x + w2*p2.x + w3*p3.x + w4*p4.x, w1*p1.y + w2*p2.y + w3*p3.y + w4*p4.y));
- }
+ _Path.push_back(ImBezierCalc(p1, p2, p3, p4, t_step * i_step));
}
}
-void ImDrawList::PathRect(const ImVec2& a, const ImVec2& b, float rounding, int rounding_corners)
+void ImDrawList::PathRect(const ImVec2& a, const ImVec2& b, float rounding, ImDrawCornerFlags rounding_corners)
{
rounding = ImMin(rounding, ImFabs(b.x - a.x) * ( ((rounding_corners & ImDrawCornerFlags_Top) == ImDrawCornerFlags_Top) || ((rounding_corners & ImDrawCornerFlags_Bot) == ImDrawCornerFlags_Bot) ? 0.5f : 1.0f ) - 1.0f);
rounding = ImMin(rounding, ImFabs(b.y - a.y) * ( ((rounding_corners & ImDrawCornerFlags_Left) == ImDrawCornerFlags_Left) || ((rounding_corners & ImDrawCornerFlags_Right) == ImDrawCornerFlags_Right) ? 0.5f : 1.0f ) - 1.0f);
@@ -1009,44 +1001,46 @@ void ImDrawList::PathRect(const ImVec2& a, const ImVec2& b, float rounding, int
}
}
-void ImDrawList::AddLine(const ImVec2& a, const ImVec2& b, ImU32 col, float thickness)
+void ImDrawList::AddLine(const ImVec2& p1, const ImVec2& p2, ImU32 col, float thickness)
{
if ((col & IM_COL32_A_MASK) == 0)
return;
- PathLineTo(a + ImVec2(0.5f,0.5f));
- PathLineTo(b + ImVec2(0.5f,0.5f));
+ PathLineTo(p1 + ImVec2(0.5f, 0.5f));
+ PathLineTo(p2 + ImVec2(0.5f, 0.5f));
PathStroke(col, false, thickness);
}
-// a: upper-left, b: lower-right. we don't render 1 px sized rectangles properly.
-void ImDrawList::AddRect(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding, int rounding_corners_flags, float thickness)
+// p_min = upper-left, p_max = lower-right
+// Note we don't render 1 pixels sized rectangles properly.
+void ImDrawList::AddRect(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, float rounding, ImDrawCornerFlags rounding_corners, float thickness)
{
if ((col & IM_COL32_A_MASK) == 0)
return;
if (Flags & ImDrawListFlags_AntiAliasedLines)
- PathRect(a + ImVec2(0.5f,0.5f), b - ImVec2(0.50f,0.50f), rounding, rounding_corners_flags);
+ PathRect(p_min + ImVec2(0.50f,0.50f), p_max - ImVec2(0.50f,0.50f), rounding, rounding_corners);
else
- PathRect(a + ImVec2(0.5f,0.5f), b - ImVec2(0.49f,0.49f), rounding, rounding_corners_flags); // Better looking lower-right corner and rounded non-AA shapes.
+ PathRect(p_min + ImVec2(0.50f,0.50f), p_max - ImVec2(0.49f,0.49f), rounding, rounding_corners); // Better looking lower-right corner and rounded non-AA shapes.
PathStroke(col, true, thickness);
}
-void ImDrawList::AddRectFilled(const ImVec2& a, const ImVec2& b, ImU32 col, float rounding, int rounding_corners_flags)
+void ImDrawList::AddRectFilled(const ImVec2& p_min, const ImVec2& p_max, ImU32 col, float rounding, ImDrawCornerFlags rounding_corners)
{
if ((col & IM_COL32_A_MASK) == 0)
return;
if (rounding > 0.0f)
{
- PathRect(a, b, rounding, rounding_corners_flags);
+ PathRect(p_min, p_max, rounding, rounding_corners);
PathFillConvex(col);
}
else
{
PrimReserve(6, 4);
- PrimRect(a, b, col);
+ PrimRect(p_min, p_max, col);
}
}
-void ImDrawList::AddRectFilledMultiColor(const ImVec2& a, const ImVec2& c, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left)
+// p_min = upper-left, p_max = lower-right
+void ImDrawList::AddRectFilledMultiColor(const ImVec2& p_min, const ImVec2& p_max, ImU32 col_upr_left, ImU32 col_upr_right, ImU32 col_bot_right, ImU32 col_bot_left)
{
if (((col_upr_left | col_upr_right | col_bot_right | col_bot_left) & IM_COL32_A_MASK) == 0)
return;
@@ -1055,85 +1049,150 @@ void ImDrawList::AddRectFilledMultiColor(const ImVec2& a, const ImVec2& c, ImU32
PrimReserve(6, 4);
PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx+1)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx+2));
PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx+2)); PrimWriteIdx((ImDrawIdx)(_VtxCurrentIdx+3));
- PrimWriteVtx(a, uv, col_upr_left);
- PrimWriteVtx(ImVec2(c.x, a.y), uv, col_upr_right);
- PrimWriteVtx(c, uv, col_bot_right);
- PrimWriteVtx(ImVec2(a.x, c.y), uv, col_bot_left);
+ PrimWriteVtx(p_min, uv, col_upr_left);
+ PrimWriteVtx(ImVec2(p_max.x, p_min.y), uv, col_upr_right);
+ PrimWriteVtx(p_max, uv, col_bot_right);
+ PrimWriteVtx(ImVec2(p_min.x, p_max.y), uv, col_bot_left);
}
-void ImDrawList::AddQuad(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, ImU32 col, float thickness)
+void ImDrawList::AddQuad(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness)
{
if ((col & IM_COL32_A_MASK) == 0)
return;
- PathLineTo(a);
- PathLineTo(b);
- PathLineTo(c);
- PathLineTo(d);
+ PathLineTo(p1);
+ PathLineTo(p2);
+ PathLineTo(p3);
+ PathLineTo(p4);
PathStroke(col, true, thickness);
}
-void ImDrawList::AddQuadFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, ImU32 col)
+void ImDrawList::AddQuadFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col)
{
if ((col & IM_COL32_A_MASK) == 0)
return;
- PathLineTo(a);
- PathLineTo(b);
- PathLineTo(c);
- PathLineTo(d);
+ PathLineTo(p1);
+ PathLineTo(p2);
+ PathLineTo(p3);
+ PathLineTo(p4);
PathFillConvex(col);
}
-void ImDrawList::AddTriangle(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col, float thickness)
+void ImDrawList::AddTriangle(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col, float thickness)
{
if ((col & IM_COL32_A_MASK) == 0)
return;
- PathLineTo(a);
- PathLineTo(b);
- PathLineTo(c);
+ PathLineTo(p1);
+ PathLineTo(p2);
+ PathLineTo(p3);
PathStroke(col, true, thickness);
}
-void ImDrawList::AddTriangleFilled(const ImVec2& a, const ImVec2& b, const ImVec2& c, ImU32 col)
+void ImDrawList::AddTriangleFilled(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, ImU32 col)
{
if ((col & IM_COL32_A_MASK) == 0)
return;
- PathLineTo(a);
- PathLineTo(b);
- PathLineTo(c);
+ PathLineTo(p1);
+ PathLineTo(p2);
+ PathLineTo(p3);
PathFillConvex(col);
}
-void ImDrawList::AddCircle(const ImVec2& centre, float radius, ImU32 col, int num_segments, float thickness)
+void ImDrawList::AddCircle(const ImVec2& center, float radius, ImU32 col, int num_segments, float thickness)
{
- if ((col & IM_COL32_A_MASK) == 0)
+ if ((col & IM_COL32_A_MASK) == 0 || radius <= 0.0f)
return;
- const float a_max = IM_PI*2.0f * ((float)num_segments - 1.0f) / (float)num_segments;
- PathArcTo(centre, radius-0.5f, 0.0f, a_max, num_segments);
+ // Obtain segment count
+ if (num_segments <= 0)
+ {
+ // Automatic segment count
+ const int radius_idx = (int)radius - 1;
+ if (radius_idx < IM_ARRAYSIZE(_Data->CircleSegmentCounts))
+ num_segments = _Data->CircleSegmentCounts[radius_idx]; // Use cached value
+ else
+ num_segments = IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(radius, _Data->CircleSegmentMaxError);
+ }
+ else
+ {
+ // Explicit segment count (still clamp to avoid drawing insanely tessellated shapes)
+ num_segments = ImClamp(num_segments, 3, IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX);
+ }
+
+ // Because we are filling a closed shape we remove 1 from the count of segments/points
+ const float a_max = (IM_PI * 2.0f) * ((float)num_segments - 1.0f) / (float)num_segments;
+ if (num_segments == 12)
+ PathArcToFast(center, radius - 0.5f, 0, 12);
+ else
+ PathArcTo(center, radius - 0.5f, 0.0f, a_max, num_segments - 1);
PathStroke(col, true, thickness);
}
-void ImDrawList::AddCircleFilled(const ImVec2& centre, float radius, ImU32 col, int num_segments)
+void ImDrawList::AddCircleFilled(const ImVec2& center, float radius, ImU32 col, int num_segments)
{
- if ((col & IM_COL32_A_MASK) == 0)
+ if ((col & IM_COL32_A_MASK) == 0 || radius <= 0.0f)
+ return;
+
+ // Obtain segment count
+ if (num_segments <= 0)
+ {
+ // Automatic segment count
+ const int radius_idx = (int)radius - 1;
+ if (radius_idx < IM_ARRAYSIZE(_Data->CircleSegmentCounts))
+ num_segments = _Data->CircleSegmentCounts[radius_idx]; // Use cached value
+ else
+ num_segments = IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(radius, _Data->CircleSegmentMaxError);
+ }
+ else
+ {
+ // Explicit segment count (still clamp to avoid drawing insanely tessellated shapes)
+ num_segments = ImClamp(num_segments, 3, IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX);
+ }
+
+ // Because we are filling a closed shape we remove 1 from the count of segments/points
+ const float a_max = (IM_PI * 2.0f) * ((float)num_segments - 1.0f) / (float)num_segments;
+ if (num_segments == 12)
+ PathArcToFast(center, radius, 0, 12);
+ else
+ PathArcTo(center, radius, 0.0f, a_max, num_segments - 1);
+ PathFillConvex(col);
+}
+
+// Guaranteed to honor 'num_segments'
+void ImDrawList::AddNgon(const ImVec2& center, float radius, ImU32 col, int num_segments, float thickness)
+{
+ if ((col & IM_COL32_A_MASK) == 0 || num_segments <= 2)
+ return;
+
+ // Because we are filling a closed shape we remove 1 from the count of segments/points
+ const float a_max = (IM_PI * 2.0f) * ((float)num_segments - 1.0f) / (float)num_segments;
+ PathArcTo(center, radius - 0.5f, 0.0f, a_max, num_segments - 1);
+ PathStroke(col, true, thickness);
+}
+
+// Guaranteed to honor 'num_segments'
+void ImDrawList::AddNgonFilled(const ImVec2& center, float radius, ImU32 col, int num_segments)
+{
+ if ((col & IM_COL32_A_MASK) == 0 || num_segments <= 2)
return;
- const float a_max = IM_PI*2.0f * ((float)num_segments - 1.0f) / (float)num_segments;
- PathArcTo(centre, radius, 0.0f, a_max, num_segments);
+ // Because we are filling a closed shape we remove 1 from the count of segments/points
+ const float a_max = (IM_PI * 2.0f) * ((float)num_segments - 1.0f) / (float)num_segments;
+ PathArcTo(center, radius, 0.0f, a_max, num_segments - 1);
PathFillConvex(col);
}
-void ImDrawList::AddBezierCurve(const ImVec2& pos0, const ImVec2& cp0, const ImVec2& cp1, const ImVec2& pos1, ImU32 col, float thickness, int num_segments)
+// Cubic Bezier takes 4 controls points
+void ImDrawList::AddBezierCurve(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, ImU32 col, float thickness, int num_segments)
{
if ((col & IM_COL32_A_MASK) == 0)
return;
- PathLineTo(pos0);
- PathBezierCurveTo(cp0, cp1, pos1, num_segments);
+ PathLineTo(p1);
+ PathBezierCurveTo(p2, p3, p4, num_segments);
PathStroke(col, false, thickness);
}
@@ -1171,7 +1230,7 @@ void ImDrawList::AddText(const ImVec2& pos, ImU32 col, const char* text_begin, c
AddText(NULL, 0.0f, pos, col, text_begin, text_end);
}
-void ImDrawList::AddImage(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col)
+void ImDrawList::AddImage(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min, const ImVec2& uv_max, ImU32 col)
{
if ((col & IM_COL32_A_MASK) == 0)
return;
@@ -1181,13 +1240,13 @@ void ImDrawList::AddImage(ImTextureID user_texture_id, const ImVec2& a, const Im
PushTextureID(user_texture_id);
PrimReserve(6, 4);
- PrimRectUV(a, b, uv_a, uv_b, col);
+ PrimRectUV(p_min, p_max, uv_min, uv_max, col);
if (push_texture_id)
PopTextureID();
}
-void ImDrawList::AddImageQuad(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& d, const ImVec2& uv_a, const ImVec2& uv_b, const ImVec2& uv_c, const ImVec2& uv_d, ImU32 col)
+void ImDrawList::AddImageQuad(ImTextureID user_texture_id, const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& uv1, const ImVec2& uv2, const ImVec2& uv3, const ImVec2& uv4, ImU32 col)
{
if ((col & IM_COL32_A_MASK) == 0)
return;
@@ -1197,20 +1256,20 @@ void ImDrawList::AddImageQuad(ImTextureID user_texture_id, const ImVec2& a, cons
PushTextureID(user_texture_id);
PrimReserve(6, 4);
- PrimQuadUV(a, b, c, d, uv_a, uv_b, uv_c, uv_d, col);
+ PrimQuadUV(p1, p2, p3, p4, uv1, uv2, uv3, uv4, col);
if (push_texture_id)
PopTextureID();
}
-void ImDrawList::AddImageRounded(ImTextureID user_texture_id, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, ImU32 col, float rounding, int rounding_corners)
+void ImDrawList::AddImageRounded(ImTextureID user_texture_id, const ImVec2& p_min, const ImVec2& p_max, const ImVec2& uv_min, const ImVec2& uv_max, ImU32 col, float rounding, ImDrawCornerFlags rounding_corners)
{
if ((col & IM_COL32_A_MASK) == 0)
return;
if (rounding <= 0.0f || (rounding_corners & ImDrawCornerFlags_All) == 0)
{
- AddImage(user_texture_id, a, b, uv_a, uv_b, col);
+ AddImage(user_texture_id, p_min, p_max, uv_min, uv_max, col);
return;
}
@@ -1219,15 +1278,143 @@ void ImDrawList::AddImageRounded(ImTextureID user_texture_id, const ImVec2& a, c
PushTextureID(user_texture_id);
int vert_start_idx = VtxBuffer.Size;
- PathRect(a, b, rounding, rounding_corners);
+ PathRect(p_min, p_max, rounding, rounding_corners);
PathFillConvex(col);
int vert_end_idx = VtxBuffer.Size;
- ImGui::ShadeVertsLinearUV(this, vert_start_idx, vert_end_idx, a, b, uv_a, uv_b, true);
+ ImGui::ShadeVertsLinearUV(this, vert_start_idx, vert_end_idx, p_min, p_max, uv_min, uv_max, true);
if (push_texture_id)
PopTextureID();
}
+
+//-----------------------------------------------------------------------------
+// ImDrawListSplitter
+//-----------------------------------------------------------------------------
+// FIXME: This may be a little confusing, trying to be a little too low-level/optimal instead of just doing vector swap..
+//-----------------------------------------------------------------------------
+
+void ImDrawListSplitter::ClearFreeMemory()
+{
+ for (int i = 0; i < _Channels.Size; i++)
+ {
+ if (i == _Current)
+ memset(&_Channels[i], 0, sizeof(_Channels[i])); // Current channel is a copy of CmdBuffer/IdxBuffer, don't destruct again
+ _Channels[i]._CmdBuffer.clear();
+ _Channels[i]._IdxBuffer.clear();
+ }
+ _Current = 0;
+ _Count = 1;
+ _Channels.clear();
+}
+
+void ImDrawListSplitter::Split(ImDrawList* draw_list, int channels_count)
+{
+ IM_ASSERT(_Current == 0 && _Count <= 1 && "Nested channel splitting is not supported. Please use separate instances of ImDrawListSplitter.");
+ int old_channels_count = _Channels.Size;
+ if (old_channels_count < channels_count)
+ _Channels.resize(channels_count);
+ _Count = channels_count;
+
+ // Channels[] (24/32 bytes each) hold storage that we'll swap with draw_list->_CmdBuffer/_IdxBuffer
+ // The content of Channels[0] at this point doesn't matter. We clear it to make state tidy in a debugger but we don't strictly need to.
+ // When we switch to the next channel, we'll copy draw_list->_CmdBuffer/_IdxBuffer into Channels[0] and then Channels[1] into draw_list->CmdBuffer/_IdxBuffer
+ memset(&_Channels[0], 0, sizeof(ImDrawChannel));
+ for (int i = 1; i < channels_count; i++)
+ {
+ if (i >= old_channels_count)
+ {
+ IM_PLACEMENT_NEW(&_Channels[i]) ImDrawChannel();
+ }
+ else
+ {
+ _Channels[i]._CmdBuffer.resize(0);
+ _Channels[i]._IdxBuffer.resize(0);
+ }
+ if (_Channels[i]._CmdBuffer.Size == 0)
+ {
+ ImDrawCmd draw_cmd;
+ draw_cmd.ClipRect = draw_list->_ClipRectStack.back();
+ draw_cmd.TextureId = draw_list->_TextureIdStack.back();
+ _Channels[i]._CmdBuffer.push_back(draw_cmd);
+ }
+ }
+}
+
+static inline bool CanMergeDrawCommands(ImDrawCmd* a, ImDrawCmd* b)
+{
+ return memcmp(&a->ClipRect, &b->ClipRect, sizeof(a->ClipRect)) == 0 && a->TextureId == b->TextureId && a->VtxOffset == b->VtxOffset && !a->UserCallback && !b->UserCallback;
+}
+
+void ImDrawListSplitter::Merge(ImDrawList* draw_list)
+{
+ // Note that we never use or rely on channels.Size because it is merely a buffer that we never shrink back to 0 to keep all sub-buffers ready for use.
+ if (_Count <= 1)
+ return;
+
+ SetCurrentChannel(draw_list, 0);
+ if (draw_list->CmdBuffer.Size != 0 && draw_list->CmdBuffer.back().ElemCount == 0)
+ draw_list->CmdBuffer.pop_back();
+
+ // Calculate our final buffer sizes. Also fix the incorrect IdxOffset values in each command.
+ int new_cmd_buffer_count = 0;
+ int new_idx_buffer_count = 0;
+ ImDrawCmd* last_cmd = (_Count > 0 && draw_list->CmdBuffer.Size > 0) ? &draw_list->CmdBuffer.back() : NULL;
+ int idx_offset = last_cmd ? last_cmd->IdxOffset + last_cmd->ElemCount : 0;
+ for (int i = 1; i < _Count; i++)
+ {
+ ImDrawChannel& ch = _Channels[i];
+ if (ch._CmdBuffer.Size > 0 && ch._CmdBuffer.back().ElemCount == 0)
+ ch._CmdBuffer.pop_back();
+ if (ch._CmdBuffer.Size > 0 && last_cmd != NULL && CanMergeDrawCommands(last_cmd, &ch._CmdBuffer[0]))
+ {
+ // Merge previous channel last draw command with current channel first draw command if matching.
+ last_cmd->ElemCount += ch._CmdBuffer[0].ElemCount;
+ idx_offset += ch._CmdBuffer[0].ElemCount;
+ ch._CmdBuffer.erase(ch._CmdBuffer.Data); // FIXME-OPT: Improve for multiple merges.
+ }
+ if (ch._CmdBuffer.Size > 0)
+ last_cmd = &ch._CmdBuffer.back();
+ new_cmd_buffer_count += ch._CmdBuffer.Size;
+ new_idx_buffer_count += ch._IdxBuffer.Size;
+ for (int cmd_n = 0; cmd_n < ch._CmdBuffer.Size; cmd_n++)
+ {
+ ch._CmdBuffer.Data[cmd_n].IdxOffset = idx_offset;
+ idx_offset += ch._CmdBuffer.Data[cmd_n].ElemCount;
+ }
+ }
+ draw_list->CmdBuffer.resize(draw_list->CmdBuffer.Size + new_cmd_buffer_count);
+ draw_list->IdxBuffer.resize(draw_list->IdxBuffer.Size + new_idx_buffer_count);
+
+ // Write commands and indices in order (they are fairly small structures, we don't copy vertices only indices)
+ ImDrawCmd* cmd_write = draw_list->CmdBuffer.Data + draw_list->CmdBuffer.Size - new_cmd_buffer_count;
+ ImDrawIdx* idx_write = draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size - new_idx_buffer_count;
+ for (int i = 1; i < _Count; i++)
+ {
+ ImDrawChannel& ch = _Channels[i];
+ if (int sz = ch._CmdBuffer.Size) { memcpy(cmd_write, ch._CmdBuffer.Data, sz * sizeof(ImDrawCmd)); cmd_write += sz; }
+ if (int sz = ch._IdxBuffer.Size) { memcpy(idx_write, ch._IdxBuffer.Data, sz * sizeof(ImDrawIdx)); idx_write += sz; }
+ }
+ draw_list->_IdxWritePtr = idx_write;
+ draw_list->UpdateClipRect(); // We call this instead of AddDrawCmd(), so that empty channels won't produce an extra draw call.
+ draw_list->UpdateTextureID();
+ _Count = 1;
+}
+
+void ImDrawListSplitter::SetCurrentChannel(ImDrawList* draw_list, int idx)
+{
+ IM_ASSERT(idx >= 0 && idx < _Count);
+ if (_Current == idx)
+ return;
+ // Overwrite ImVector (12/16 bytes), four times. This is merely a silly optimization instead of doing .swap()
+ memcpy(&_Channels.Data[_Current]._CmdBuffer, &draw_list->CmdBuffer, sizeof(draw_list->CmdBuffer));
+ memcpy(&_Channels.Data[_Current]._IdxBuffer, &draw_list->IdxBuffer, sizeof(draw_list->IdxBuffer));
+ _Current = idx;
+ memcpy(&draw_list->CmdBuffer, &_Channels.Data[idx]._CmdBuffer, sizeof(draw_list->CmdBuffer));
+ memcpy(&draw_list->IdxBuffer, &_Channels.Data[idx]._IdxBuffer, sizeof(draw_list->IdxBuffer));
+ draw_list->_IdxWritePtr = draw_list->IdxBuffer.Data + draw_list->IdxBuffer.Size;
+}
+
//-----------------------------------------------------------------------------
// [SECTION] ImDrawData
//-----------------------------------------------------------------------------
@@ -1251,8 +1438,10 @@ void ImDrawData::DeIndexAllBuffers()
}
}
-// Helper to scale the ClipRect field of each ImDrawCmd. Use if your final output buffer is at a different scale than ImGui expects, or if there is a difference between your window resolution and framebuffer resolution.
-void ImDrawData::ScaleClipRects(const ImVec2& scale)
+// Helper to scale the ClipRect field of each ImDrawCmd.
+// Use if your final output buffer is at a different scale than draw_data->DisplaySize,
+// or if there is a difference between your window resolution and framebuffer resolution.
+void ImDrawData::ScaleClipRects(const ImVec2& fb_scale)
{
for (int i = 0; i < CmdListsCount; i++)
{
@@ -1260,7 +1449,7 @@ void ImDrawData::ScaleClipRects(const ImVec2& scale)
for (int cmd_i = 0; cmd_i < cmd_list->CmdBuffer.Size; cmd_i++)
{
ImDrawCmd* cmd = &cmd_list->CmdBuffer[cmd_i];
- cmd->ClipRect = ImVec4(cmd->ClipRect.x * scale.x, cmd->ClipRect.y * scale.y, cmd->ClipRect.z * scale.x, cmd->ClipRect.w * scale.y);
+ cmd->ClipRect = ImVec4(cmd->ClipRect.x * fb_scale.x, cmd->ClipRect.y * fb_scale.y, cmd->ClipRect.z * fb_scale.x, cmd->ClipRect.w * fb_scale.y);
}
}
}
@@ -1323,7 +1512,7 @@ ImFontConfig::ImFontConfig()
FontDataOwnedByAtlas = true;
FontNo = 0;
SizePixels = 0.0f;
- OversampleH = 3;
+ OversampleH = 3; // FIXME: 2 may be a better default?
OversampleV = 1;
PixelSnapH = false;
GlyphExtraSpacing = ImVec2(0.0f, 0.0f);
@@ -1334,6 +1523,7 @@ ImFontConfig::ImFontConfig()
MergeMode = false;
RasterizerFlags = 0x00;
RasterizerMultiply = 1.0f;
+ EllipsisChar = (ImWchar)-1;
memset(Name, 0, sizeof(Name));
DstFont = NULL;
}
@@ -1343,7 +1533,7 @@ ImFontConfig::ImFontConfig()
//-----------------------------------------------------------------------------
// A work of art lies ahead! (. = white layer, X = black layer, others are blank)
-// The white texels on the top left are the ones we'll use everywhere in ImGui to render filled shapes.
+// The white texels on the top left are the ones we'll use everywhere in Dear ImGui to render filled shapes.
const int FONT_ATLAS_DEFAULT_TEX_DATA_W_HALF = 108;
const int FONT_ATLAS_DEFAULT_TEX_DATA_H = 27;
const unsigned int FONT_ATLAS_DEFAULT_TEX_DATA_ID = 0x80000000;
@@ -1420,7 +1610,7 @@ void ImFontAtlas::ClearInputData()
for (int i = 0; i < ConfigData.Size; i++)
if (ConfigData[i].FontData && ConfigData[i].FontDataOwnedByAtlas)
{
- ImGui::MemFree(ConfigData[i].FontData);
+ IM_FREE(ConfigData[i].FontData);
ConfigData[i].FontData = NULL;
}
@@ -1441,9 +1631,9 @@ void ImFontAtlas::ClearTexData()
{
IM_ASSERT(!Locked && "Cannot modify a locked ImFontAtlas between NewFrame() and EndFrame/Render()!");
if (TexPixelsAlpha8)
- ImGui::MemFree(TexPixelsAlpha8);
+ IM_FREE(TexPixelsAlpha8);
if (TexPixelsRGBA32)
- ImGui::MemFree(TexPixelsRGBA32);
+ IM_FREE(TexPixelsRGBA32);
TexPixelsAlpha8 = NULL;
TexPixelsRGBA32 = NULL;
}
@@ -1489,7 +1679,7 @@ void ImFontAtlas::GetTexDataAsRGBA32(unsigned char** out_pixels, int* out_wid
GetTexDataAsAlpha8(&pixels, NULL, NULL);
if (pixels)
{
- TexPixelsRGBA32 = (unsigned int*)ImGui::MemAlloc((size_t)(TexWidth * TexHeight * 4));
+ TexPixelsRGBA32 = (unsigned int*)IM_ALLOC((size_t)TexWidth * (size_t)TexHeight * 4);
const unsigned char* src = pixels;
unsigned int* dst = TexPixelsRGBA32;
for (int n = TexWidth * TexHeight; n > 0; n--)
@@ -1513,19 +1703,22 @@ ImFont* ImFontAtlas::AddFont(const ImFontConfig* font_cfg)
if (!font_cfg->MergeMode)
Fonts.push_back(IM_NEW(ImFont));
else
- IM_ASSERT(!Fonts.empty()); // When using MergeMode make sure that a font has already been added before. You can use ImGui::GetIO().Fonts->AddFontDefault() to add the default imgui font.
+ IM_ASSERT(!Fonts.empty() && "Cannot use MergeMode for the first font"); // When using MergeMode make sure that a font has already been added before. You can use ImGui::GetIO().Fonts->AddFontDefault() to add the default imgui font.
ConfigData.push_back(*font_cfg);
ImFontConfig& new_font_cfg = ConfigData.back();
- if (!new_font_cfg.DstFont)
+ if (new_font_cfg.DstFont == NULL)
new_font_cfg.DstFont = Fonts.back();
if (!new_font_cfg.FontDataOwnedByAtlas)
{
- new_font_cfg.FontData = ImGui::MemAlloc(new_font_cfg.FontDataSize);
+ new_font_cfg.FontData = IM_ALLOC(new_font_cfg.FontDataSize);
new_font_cfg.FontDataOwnedByAtlas = true;
memcpy(new_font_cfg.FontData, font_cfg->FontData, (size_t)new_font_cfg.FontDataSize);
}
+ if (new_font_cfg.DstFont->EllipsisChar == (ImWchar)-1)
+ new_font_cfg.DstFont->EllipsisChar = font_cfg->EllipsisChar;
+
// Invalidate texture
ClearTexData();
return new_font_cfg.DstFont;
@@ -1556,8 +1749,11 @@ ImFont* ImFontAtlas::AddFontDefault(const ImFontConfig* font_cfg_template)
font_cfg.OversampleH = font_cfg.OversampleV = 1;
font_cfg.PixelSnapH = true;
}
- if (font_cfg.Name[0] == '\0') strcpy(font_cfg.Name, "ProggyClean.ttf, 13px");
- if (font_cfg.SizePixels <= 0.0f) font_cfg.SizePixels = 13.0f;
+ if (font_cfg.SizePixels <= 0.0f)
+ font_cfg.SizePixels = 13.0f * 1.0f;
+ if (font_cfg.Name[0] == '\0')
+ ImFormatString(font_cfg.Name, IM_ARRAYSIZE(font_cfg.Name), "ProggyClean.ttf, %dpx", (int)font_cfg.SizePixels);
+ font_cfg.EllipsisChar = (ImWchar)0x0085;
const char* ttf_compressed_base85 = GetDefaultCompressedFontDataTTFBase85();
const ImWchar* glyph_ranges = font_cfg.GlyphRanges != NULL ? font_cfg.GlyphRanges : GetGlyphRangesDefault();
@@ -1573,7 +1769,7 @@ ImFont* ImFontAtlas::AddFontFromFileTTF(const char* filename, float size_pixels,
void* data = ImFileLoadToMemory(filename, "rb", &data_size, 0);
if (!data)
{
- IM_ASSERT(0); // Could not load file.
+ IM_ASSERT_USER_ERROR(0, "Could not load font file!");
return NULL;
}
ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig();
@@ -1604,7 +1800,7 @@ ImFont* ImFontAtlas::AddFontFromMemoryTTF(void* ttf_data, int ttf_size, float si
ImFont* ImFontAtlas::AddFontFromMemoryCompressedTTF(const void* compressed_ttf_data, int compressed_ttf_size, float size_pixels, const ImFontConfig* font_cfg_template, const ImWchar* glyph_ranges)
{
const unsigned int buf_decompressed_size = stb_decompress_length((const unsigned char*)compressed_ttf_data);
- unsigned char* buf_decompressed_data = (unsigned char *)ImGui::MemAlloc(buf_decompressed_size);
+ unsigned char* buf_decompressed_data = (unsigned char *)IM_ALLOC(buf_decompressed_size);
stb_decompress(buf_decompressed_data, (const unsigned char*)compressed_ttf_data, (unsigned int)compressed_ttf_size);
ImFontConfig font_cfg = font_cfg_template ? *font_cfg_template : ImFontConfig();
@@ -1616,19 +1812,20 @@ ImFont* ImFontAtlas::AddFontFromMemoryCompressedTTF(const void* compressed_ttf_d
ImFont* ImFontAtlas::AddFontFromMemoryCompressedBase85TTF(const char* compressed_ttf_data_base85, float size_pixels, const ImFontConfig* font_cfg, const ImWchar* glyph_ranges)
{
int compressed_ttf_size = (((int)strlen(compressed_ttf_data_base85) + 4) / 5) * 4;
- void* compressed_ttf = ImGui::MemAlloc((size_t)compressed_ttf_size);
+ void* compressed_ttf = IM_ALLOC((size_t)compressed_ttf_size);
Decode85((const unsigned char*)compressed_ttf_data_base85, (unsigned char*)compressed_ttf);
ImFont* font = AddFontFromMemoryCompressedTTF(compressed_ttf, compressed_ttf_size, size_pixels, font_cfg, glyph_ranges);
- ImGui::MemFree(compressed_ttf);
+ IM_FREE(compressed_ttf);
return font;
}
int ImFontAtlas::AddCustomRectRegular(unsigned int id, int width, int height)
{
- IM_ASSERT(id >= 0x10000);
+ // Breaking change on 2019/11/21 (1.74): ImFontAtlas::AddCustomRectRegular() now requires an ID >= 0x110000 (instead of >= 0x10000)
+ IM_ASSERT(id >= 0x110000);
IM_ASSERT(width > 0 && width <= 0xFFFF);
IM_ASSERT(height > 0 && height <= 0xFFFF);
- CustomRect r;
+ ImFontAtlasCustomRect r;
r.ID = id;
r.Width = (unsigned short)width;
r.Height = (unsigned short)height;
@@ -1641,7 +1838,7 @@ int ImFontAtlas::AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int
IM_ASSERT(font != NULL);
IM_ASSERT(width > 0 && width <= 0xFFFF);
IM_ASSERT(height > 0 && height <= 0xFFFF);
- CustomRect r;
+ ImFontAtlasCustomRect r;
r.ID = id;
r.Width = (unsigned short)width;
r.Height = (unsigned short)height;
@@ -1652,7 +1849,7 @@ int ImFontAtlas::AddCustomRectFontGlyph(ImFont* font, ImWchar id, int width, int
return CustomRects.Size - 1; // Return index
}
-void ImFontAtlas::CalcCustomRectUV(const CustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max)
+void ImFontAtlas::CalcCustomRectUV(const ImFontAtlasCustomRect* rect, ImVec2* out_uv_min, ImVec2* out_uv_max) const
{
IM_ASSERT(TexWidth > 0 && TexHeight > 0); // Font atlas needs to be built before we can calculate UV coordinates
IM_ASSERT(rect->IsPacked()); // Make sure the rectangle has been packed
@@ -1668,7 +1865,7 @@ bool ImFontAtlas::GetMouseCursorTexData(ImGuiMouseCursor cursor_type, ImVec2* ou
return false;
IM_ASSERT(CustomRectIds[0] != -1);
- ImFontAtlas::CustomRect& r = CustomRects[CustomRectIds[0]];
+ ImFontAtlasCustomRect& r = CustomRects[CustomRectIds[0]];
IM_ASSERT(r.ID == FONT_ATLAS_DEFAULT_TEX_DATA_ID);
ImVec2 pos = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[cursor_type][0] + ImVec2((float)r.X, (float)r.Y);
ImVec2 size = FONT_ATLAS_DEFAULT_TEX_CURSOR_DATA[cursor_type][1];
@@ -1705,222 +1902,296 @@ void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsig
data[i] = table[data[i]];
}
+// Temporary data for one source font (multiple source fonts can be merged into one destination ImFont)
+// (C++03 doesn't allow instancing ImVector<> with function-local types so we declare the type here.)
+struct ImFontBuildSrcData
+{
+ stbtt_fontinfo FontInfo;
+ stbtt_pack_range PackRange; // Hold the list of codepoints to pack (essentially points to Codepoints.Data)
+ stbrp_rect* Rects; // Rectangle to pack. We first fill in their size and the packer will give us their position.
+ stbtt_packedchar* PackedChars; // Output glyphs
+ const ImWchar* SrcRanges; // Ranges as requested by user (user is allowed to request too much, e.g. 0x0020..0xFFFF)
+ int DstIndex; // Index into atlas->Fonts[] and dst_tmp_array[]
+ int GlyphsHighest; // Highest requested codepoint
+ int GlyphsCount; // Glyph count (excluding missing glyphs and glyphs already set by an earlier source font)
+ ImBoolVector GlyphsSet; // Glyph bit map (random access, 1-bit per codepoint. This will be a maximum of 8KB)
+ ImVector<int> GlyphsList; // Glyph codepoints list (flattened version of GlyphsMap)
+};
+
+// Temporary data for one destination ImFont* (multiple source fonts can be merged into one destination ImFont)
+struct ImFontBuildDstData
+{
+ int SrcCount; // Number of source fonts targeting this destination font.
+ int GlyphsHighest;
+ int GlyphsCount;
+ ImBoolVector GlyphsSet; // This is used to resolve collision when multiple sources are merged into a same destination font.
+};
+
+static void UnpackBoolVectorToFlatIndexList(const ImBoolVector* in, ImVector<int>* out)
+{
+ IM_ASSERT(sizeof(in->Storage.Data[0]) == sizeof(int));
+ const int* it_begin = in->Storage.begin();
+ const int* it_end = in->Storage.end();
+ for (const int* it = it_begin; it < it_end; it++)
+ if (int entries_32 = *it)
+ for (int bit_n = 0; bit_n < 32; bit_n++)
+ if (entries_32 & (1u << bit_n))
+ out->push_back((int)((it - it_begin) << 5) + bit_n);
+}
+
bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas)
{
IM_ASSERT(atlas->ConfigData.Size > 0);
ImFontAtlasBuildRegisterDefaultCustomRects(atlas);
+ // Clear atlas
atlas->TexID = (ImTextureID)NULL;
atlas->TexWidth = atlas->TexHeight = 0;
atlas->TexUvScale = ImVec2(0.0f, 0.0f);
atlas->TexUvWhitePixel = ImVec2(0.0f, 0.0f);
atlas->ClearTexData();
- // Count glyphs/ranges
- int total_glyphs_count = 0;
- int total_ranges_count = 0;
- for (int input_i = 0; input_i < atlas->ConfigData.Size; input_i++)
- {
- ImFontConfig& cfg = atlas->ConfigData[input_i];
- if (!cfg.GlyphRanges)
- cfg.GlyphRanges = atlas->GetGlyphRangesDefault();
- for (const ImWchar* in_range = cfg.GlyphRanges; in_range[0] && in_range[1]; in_range += 2, total_ranges_count++)
- total_glyphs_count += (in_range[1] - in_range[0]) + 1;
- }
-
- // We need a width for the skyline algorithm. Using a dumb heuristic here to decide of width. User can override TexDesiredWidth and TexGlyphPadding if they wish.
- // Width doesn't really matter much, but some API/GPU have texture size limitations and increasing width can decrease height.
- atlas->TexWidth = (atlas->TexDesiredWidth > 0) ? atlas->TexDesiredWidth : (total_glyphs_count > 4000) ? 4096 : (total_glyphs_count > 2000) ? 2048 : (total_glyphs_count > 1000) ? 1024 : 512;
- atlas->TexHeight = 0;
+ // Temporary storage for building
+ ImVector<ImFontBuildSrcData> src_tmp_array;
+ ImVector<ImFontBuildDstData> dst_tmp_array;
+ src_tmp_array.resize(atlas->ConfigData.Size);
+ dst_tmp_array.resize(atlas->Fonts.Size);
+ memset(src_tmp_array.Data, 0, (size_t)src_tmp_array.size_in_bytes());
+ memset(dst_tmp_array.Data, 0, (size_t)dst_tmp_array.size_in_bytes());
- // Start packing
- const int max_tex_height = 1024*32;
- stbtt_pack_context spc = {};
- if (!stbtt_PackBegin(&spc, NULL, atlas->TexWidth, max_tex_height, 0, atlas->TexGlyphPadding, NULL))
- return false;
- stbtt_PackSetOversampling(&spc, 1, 1);
-
- // Pack our extra data rectangles first, so it will be on the upper-left corner of our texture (UV will have small values).
- ImFontAtlasBuildPackCustomRects(atlas, spc.pack_info);
-
- // Initialize font information (so we can error without any cleanup)
- struct ImFontTempBuildData
+ // 1. Initialize font loading structure, check font data validity
+ for (int src_i = 0; src_i < atlas->ConfigData.Size; src_i++)
{
- stbtt_fontinfo FontInfo;
- stbrp_rect* Rects;
- int RectsCount;
- stbtt_pack_range* Ranges;
- int RangesCount;
- };
- ImFontTempBuildData* tmp_array = (ImFontTempBuildData*)ImGui::MemAlloc((size_t)atlas->ConfigData.Size * sizeof(ImFontTempBuildData));
- for (int input_i = 0; input_i < atlas->ConfigData.Size; input_i++)
- {
- ImFontConfig& cfg = atlas->ConfigData[input_i];
- ImFontTempBuildData& tmp = tmp_array[input_i];
+ ImFontBuildSrcData& src_tmp = src_tmp_array[src_i];
+ ImFontConfig& cfg = atlas->ConfigData[src_i];
IM_ASSERT(cfg.DstFont && (!cfg.DstFont->IsLoaded() || cfg.DstFont->ContainerAtlas == atlas));
+ // Find index from cfg.DstFont (we allow the user to set cfg.DstFont. Also it makes casual debugging nicer than when storing indices)
+ src_tmp.DstIndex = -1;
+ for (int output_i = 0; output_i < atlas->Fonts.Size && src_tmp.DstIndex == -1; output_i++)
+ if (cfg.DstFont == atlas->Fonts[output_i])
+ src_tmp.DstIndex = output_i;
+ IM_ASSERT(src_tmp.DstIndex != -1); // cfg.DstFont not pointing within atlas->Fonts[] array?
+ if (src_tmp.DstIndex == -1)
+ return false;
+
+ // Initialize helper structure for font loading and verify that the TTF/OTF data is correct
const int font_offset = stbtt_GetFontOffsetForIndex((unsigned char*)cfg.FontData, cfg.FontNo);
IM_ASSERT(font_offset >= 0 && "FontData is incorrect, or FontNo cannot be found.");
- if (!stbtt_InitFont(&tmp.FontInfo, (unsigned char*)cfg.FontData, font_offset))
- {
- atlas->TexWidth = atlas->TexHeight = 0; // Reset output on failure
- ImGui::MemFree(tmp_array);
+ if (!stbtt_InitFont(&src_tmp.FontInfo, (unsigned char*)cfg.FontData, font_offset))
return false;
- }
+
+ // Measure highest codepoints
+ ImFontBuildDstData& dst_tmp = dst_tmp_array[src_tmp.DstIndex];
+ src_tmp.SrcRanges = cfg.GlyphRanges ? cfg.GlyphRanges : atlas->GetGlyphRangesDefault();
+ for (const ImWchar* src_range = src_tmp.SrcRanges; src_range[0] && src_range[1]; src_range += 2)
+ src_tmp.GlyphsHighest = ImMax(src_tmp.GlyphsHighest, (int)src_range[1]);
+ dst_tmp.SrcCount++;
+ dst_tmp.GlyphsHighest = ImMax(dst_tmp.GlyphsHighest, src_tmp.GlyphsHighest);
}
+ // 2. For every requested codepoint, check for their presence in the font data, and handle redundancy or overlaps between source fonts to avoid unused glyphs.
+ int total_glyphs_count = 0;
+ for (int src_i = 0; src_i < src_tmp_array.Size; src_i++)
+ {
+ ImFontBuildSrcData& src_tmp = src_tmp_array[src_i];
+ ImFontBuildDstData& dst_tmp = dst_tmp_array[src_tmp.DstIndex];
+ src_tmp.GlyphsSet.Resize(src_tmp.GlyphsHighest + 1);
+ if (dst_tmp.GlyphsSet.Storage.empty())
+ dst_tmp.GlyphsSet.Resize(dst_tmp.GlyphsHighest + 1);
+
+ for (const ImWchar* src_range = src_tmp.SrcRanges; src_range[0] && src_range[1]; src_range += 2)
+ for (unsigned int codepoint = src_range[0]; codepoint <= src_range[1]; codepoint++)
+ {
+ if (dst_tmp.GlyphsSet.GetBit(codepoint)) // Don't overwrite existing glyphs. We could make this an option for MergeMode (e.g. MergeOverwrite==true)
+ continue;
+ if (!stbtt_FindGlyphIndex(&src_tmp.FontInfo, codepoint)) // It is actually in the font?
+ continue;
+
+ // Add to avail set/counters
+ src_tmp.GlyphsCount++;
+ dst_tmp.GlyphsCount++;
+ src_tmp.GlyphsSet.SetBit(codepoint, true);
+ dst_tmp.GlyphsSet.SetBit(codepoint, true);
+ total_glyphs_count++;
+ }
+ }
+
+ // 3. Unpack our bit map into a flat list (we now have all the Unicode points that we know are requested _and_ available _and_ not overlapping another)
+ for (int src_i = 0; src_i < src_tmp_array.Size; src_i++)
+ {
+ ImFontBuildSrcData& src_tmp = src_tmp_array[src_i];
+ src_tmp.GlyphsList.reserve(src_tmp.GlyphsCount);
+ UnpackBoolVectorToFlatIndexList(&src_tmp.GlyphsSet, &src_tmp.GlyphsList);
+ src_tmp.GlyphsSet.Clear();
+ IM_ASSERT(src_tmp.GlyphsList.Size == src_tmp.GlyphsCount);
+ }
+ for (int dst_i = 0; dst_i < dst_tmp_array.Size; dst_i++)
+ dst_tmp_array[dst_i].GlyphsSet.Clear();
+ dst_tmp_array.clear();
+
// Allocate packing character data and flag packed characters buffer as non-packed (x0=y0=x1=y1=0)
- int buf_packedchars_n = 0, buf_rects_n = 0, buf_ranges_n = 0;
- stbtt_packedchar* buf_packedchars = (stbtt_packedchar*)ImGui::MemAlloc(total_glyphs_count * sizeof(stbtt_packedchar));
- stbrp_rect* buf_rects = (stbrp_rect*)ImGui::MemAlloc(total_glyphs_count * sizeof(stbrp_rect));
- stbtt_pack_range* buf_ranges = (stbtt_pack_range*)ImGui::MemAlloc(total_ranges_count * sizeof(stbtt_pack_range));
- memset(buf_packedchars, 0, total_glyphs_count * sizeof(stbtt_packedchar));
- memset(buf_rects, 0, total_glyphs_count * sizeof(stbrp_rect)); // Unnecessary but let's clear this for the sake of sanity.
- memset(buf_ranges, 0, total_ranges_count * sizeof(stbtt_pack_range));
-
- // First font pass: pack all glyphs (no rendering at this point, we are working with rectangles in an infinitely tall texture at this point)
- for (int input_i = 0; input_i < atlas->ConfigData.Size; input_i++)
- {
- ImFontConfig& cfg = atlas->ConfigData[input_i];
- ImFontTempBuildData& tmp = tmp_array[input_i];
-
- // Setup ranges
- int font_glyphs_count = 0;
- int font_ranges_count = 0;
- for (const ImWchar* in_range = cfg.GlyphRanges; in_range[0] && in_range[1]; in_range += 2, font_ranges_count++)
- font_glyphs_count += (in_range[1] - in_range[0]) + 1;
- tmp.Ranges = buf_ranges + buf_ranges_n;
- tmp.RangesCount = font_ranges_count;
- buf_ranges_n += font_ranges_count;
- for (int i = 0; i < font_ranges_count; i++)
- {
- const ImWchar* in_range = &cfg.GlyphRanges[i * 2];
- stbtt_pack_range& range = tmp.Ranges[i];
- range.font_size = cfg.SizePixels;
- range.first_unicode_codepoint_in_range = in_range[0];
- range.num_chars = (in_range[1] - in_range[0]) + 1;
- range.chardata_for_range = buf_packedchars + buf_packedchars_n;
- buf_packedchars_n += range.num_chars;
- }
+ // (We technically don't need to zero-clear buf_rects, but let's do it for the sake of sanity)
+ ImVector<stbrp_rect> buf_rects;
+ ImVector<stbtt_packedchar> buf_packedchars;
+ buf_rects.resize(total_glyphs_count);
+ buf_packedchars.resize(total_glyphs_count);
+ memset(buf_rects.Data, 0, (size_t)buf_rects.size_in_bytes());
+ memset(buf_packedchars.Data, 0, (size_t)buf_packedchars.size_in_bytes());
+
+ // 4. Gather glyphs sizes so we can pack them in our virtual canvas.
+ int total_surface = 0;
+ int buf_rects_out_n = 0;
+ int buf_packedchars_out_n = 0;
+ for (int src_i = 0; src_i < src_tmp_array.Size; src_i++)
+ {
+ ImFontBuildSrcData& src_tmp = src_tmp_array[src_i];
+ if (src_tmp.GlyphsCount == 0)
+ continue;
- // Gather the sizes of all rectangle we need
- tmp.Rects = buf_rects + buf_rects_n;
- tmp.RectsCount = font_glyphs_count;
- buf_rects_n += font_glyphs_count;
- stbtt_PackSetOversampling(&spc, cfg.OversampleH, cfg.OversampleV);
- int n = stbtt_PackFontRangesGatherRects(&spc, &tmp.FontInfo, tmp.Ranges, tmp.RangesCount, tmp.Rects);
- IM_ASSERT(n == font_glyphs_count);
-
- // Detect missing glyphs and replace them with a zero-sized box instead of relying on the default glyphs
- // This allows us merging overlapping icon fonts more easily.
- int rect_i = 0;
- for (int range_i = 0; range_i < tmp.RangesCount; range_i++)
- for (int char_i = 0; char_i < tmp.Ranges[range_i].num_chars; char_i++, rect_i++)
- if (stbtt_FindGlyphIndex(&tmp.FontInfo, tmp.Ranges[range_i].first_unicode_codepoint_in_range + char_i) == 0)
- tmp.Rects[rect_i].w = tmp.Rects[rect_i].h = 0;
-
- // Pack
- stbrp_pack_rects((stbrp_context*)spc.pack_info, tmp.Rects, n);
-
- // Extend texture height
- // Also mark missing glyphs as non-packed so we don't attempt to render into them
- for (int i = 0; i < n; i++)
+ src_tmp.Rects = &buf_rects[buf_rects_out_n];
+ src_tmp.PackedChars = &buf_packedchars[buf_packedchars_out_n];
+ buf_rects_out_n += src_tmp.GlyphsCount;
+ buf_packedchars_out_n += src_tmp.GlyphsCount;
+
+ // Convert our ranges in the format stb_truetype wants
+ ImFontConfig& cfg = atlas->ConfigData[src_i];
+ src_tmp.PackRange.font_size = cfg.SizePixels;
+ src_tmp.PackRange.first_unicode_codepoint_in_range = 0;
+ src_tmp.PackRange.array_of_unicode_codepoints = src_tmp.GlyphsList.Data;
+ src_tmp.PackRange.num_chars = src_tmp.GlyphsList.Size;
+ src_tmp.PackRange.chardata_for_range = src_tmp.PackedChars;
+ src_tmp.PackRange.h_oversample = (unsigned char)cfg.OversampleH;
+ src_tmp.PackRange.v_oversample = (unsigned char)cfg.OversampleV;
+
+ // Gather the sizes of all rectangles we will need to pack (this loop is based on stbtt_PackFontRangesGatherRects)
+ const float scale = (cfg.SizePixels > 0) ? stbtt_ScaleForPixelHeight(&src_tmp.FontInfo, cfg.SizePixels) : stbtt_ScaleForMappingEmToPixels(&src_tmp.FontInfo, -cfg.SizePixels);
+ const int padding = atlas->TexGlyphPadding;
+ for (int glyph_i = 0; glyph_i < src_tmp.GlyphsList.Size; glyph_i++)
{
- if (tmp.Rects[i].w == 0 && tmp.Rects[i].h == 0)
- tmp.Rects[i].was_packed = 0;
- if (tmp.Rects[i].was_packed)
- atlas->TexHeight = ImMax(atlas->TexHeight, tmp.Rects[i].y + tmp.Rects[i].h);
+ int x0, y0, x1, y1;
+ const int glyph_index_in_font = stbtt_FindGlyphIndex(&src_tmp.FontInfo, src_tmp.GlyphsList[glyph_i]);
+ IM_ASSERT(glyph_index_in_font != 0);
+ stbtt_GetGlyphBitmapBoxSubpixel(&src_tmp.FontInfo, glyph_index_in_font, scale * cfg.OversampleH, scale * cfg.OversampleV, 0, 0, &x0, &y0, &x1, &y1);
+ src_tmp.Rects[glyph_i].w = (stbrp_coord)(x1 - x0 + padding + cfg.OversampleH - 1);
+ src_tmp.Rects[glyph_i].h = (stbrp_coord)(y1 - y0 + padding + cfg.OversampleV - 1);
+ total_surface += src_tmp.Rects[glyph_i].w * src_tmp.Rects[glyph_i].h;
}
}
- IM_ASSERT(buf_rects_n == total_glyphs_count);
- IM_ASSERT(buf_packedchars_n == total_glyphs_count);
- IM_ASSERT(buf_ranges_n == total_ranges_count);
- // Create texture
+ // We need a width for the skyline algorithm, any width!
+ // The exact width doesn't really matter much, but some API/GPU have texture size limitations and increasing width can decrease height.
+ // User can override TexDesiredWidth and TexGlyphPadding if they wish, otherwise we use a simple heuristic to select the width based on expected surface.
+ const int surface_sqrt = (int)ImSqrt((float)total_surface) + 1;
+ atlas->TexHeight = 0;
+ if (atlas->TexDesiredWidth > 0)
+ atlas->TexWidth = atlas->TexDesiredWidth;
+ else
+ atlas->TexWidth = (surface_sqrt >= 4096*0.7f) ? 4096 : (surface_sqrt >= 2048*0.7f) ? 2048 : (surface_sqrt >= 1024*0.7f) ? 1024 : 512;
+
+ // 5. Start packing
+ // Pack our extra data rectangles first, so it will be on the upper-left corner of our texture (UV will have small values).
+ const int TEX_HEIGHT_MAX = 1024 * 32;
+ stbtt_pack_context spc = {};
+ stbtt_PackBegin(&spc, NULL, atlas->TexWidth, TEX_HEIGHT_MAX, 0, atlas->TexGlyphPadding, NULL);
+ ImFontAtlasBuildPackCustomRects(atlas, spc.pack_info);
+
+ // 6. Pack each source font. No rendering yet, we are working with rectangles in an infinitely tall texture at this point.
+ for (int src_i = 0; src_i < src_tmp_array.Size; src_i++)
+ {
+ ImFontBuildSrcData& src_tmp = src_tmp_array[src_i];
+ if (src_tmp.GlyphsCount == 0)
+ continue;
+
+ stbrp_pack_rects((stbrp_context*)spc.pack_info, src_tmp.Rects, src_tmp.GlyphsCount);
+
+ // Extend texture height and mark missing glyphs as non-packed so we won't render them.
+ // FIXME: We are not handling packing failure here (would happen if we got off TEX_HEIGHT_MAX or if a single if larger than TexWidth?)
+ for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++)
+ if (src_tmp.Rects[glyph_i].was_packed)
+ atlas->TexHeight = ImMax(atlas->TexHeight, src_tmp.Rects[glyph_i].y + src_tmp.Rects[glyph_i].h);
+ }
+
+ // 7. Allocate texture
atlas->TexHeight = (atlas->Flags & ImFontAtlasFlags_NoPowerOfTwoHeight) ? (atlas->TexHeight + 1) : ImUpperPowerOfTwo(atlas->TexHeight);
atlas->TexUvScale = ImVec2(1.0f / atlas->TexWidth, 1.0f / atlas->TexHeight);
- atlas->TexPixelsAlpha8 = (unsigned char*)ImGui::MemAlloc(atlas->TexWidth * atlas->TexHeight);
+ atlas->TexPixelsAlpha8 = (unsigned char*)IM_ALLOC(atlas->TexWidth * atlas->TexHeight);
memset(atlas->TexPixelsAlpha8, 0, atlas->TexWidth * atlas->TexHeight);
spc.pixels = atlas->TexPixelsAlpha8;
spc.height = atlas->TexHeight;
- // Second pass: render font characters
- for (int input_i = 0; input_i < atlas->ConfigData.Size; input_i++)
+ // 8. Render/rasterize font characters into the texture
+ for (int src_i = 0; src_i < src_tmp_array.Size; src_i++)
{
- ImFontConfig& cfg = atlas->ConfigData[input_i];
- ImFontTempBuildData& tmp = tmp_array[input_i];
- stbtt_PackSetOversampling(&spc, cfg.OversampleH, cfg.OversampleV);
- stbtt_PackFontRangesRenderIntoRects(&spc, &tmp.FontInfo, tmp.Ranges, tmp.RangesCount, tmp.Rects);
+ ImFontConfig& cfg = atlas->ConfigData[src_i];
+ ImFontBuildSrcData& src_tmp = src_tmp_array[src_i];
+ if (src_tmp.GlyphsCount == 0)
+ continue;
+
+ stbtt_PackFontRangesRenderIntoRects(&spc, &src_tmp.FontInfo, &src_tmp.PackRange, 1, src_tmp.Rects);
+
+ // Apply multiply operator
if (cfg.RasterizerMultiply != 1.0f)
{
unsigned char multiply_table[256];
ImFontAtlasBuildMultiplyCalcLookupTable(multiply_table, cfg.RasterizerMultiply);
- for (const stbrp_rect* r = tmp.Rects; r != tmp.Rects + tmp.RectsCount; r++)
+ stbrp_rect* r = &src_tmp.Rects[0];
+ for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++, r++)
if (r->was_packed)
- ImFontAtlasBuildMultiplyRectAlpha8(multiply_table, spc.pixels, r->x, r->y, r->w, r->h, spc.stride_in_bytes);
+ ImFontAtlasBuildMultiplyRectAlpha8(multiply_table, atlas->TexPixelsAlpha8, r->x, r->y, r->w, r->h, atlas->TexWidth * 1);
}
- tmp.Rects = NULL;
+ src_tmp.Rects = NULL;
}
// End packing
stbtt_PackEnd(&spc);
- ImGui::MemFree(buf_rects);
- buf_rects = NULL;
+ buf_rects.clear();
- // Third pass: setup ImFont and glyphs for runtime
- for (int input_i = 0; input_i < atlas->ConfigData.Size; input_i++)
+ // 9. Setup ImFont and glyphs for runtime
+ for (int src_i = 0; src_i < src_tmp_array.Size; src_i++)
{
- ImFontConfig& cfg = atlas->ConfigData[input_i];
- ImFontTempBuildData& tmp = tmp_array[input_i];
+ ImFontBuildSrcData& src_tmp = src_tmp_array[src_i];
+ if (src_tmp.GlyphsCount == 0)
+ continue;
+
+ ImFontConfig& cfg = atlas->ConfigData[src_i];
ImFont* dst_font = cfg.DstFont; // We can have multiple input fonts writing into a same destination font (when using MergeMode=true)
- if (cfg.MergeMode)
- dst_font->BuildLookupTable();
- const float font_scale = stbtt_ScaleForPixelHeight(&tmp.FontInfo, cfg.SizePixels);
+ const float font_scale = stbtt_ScaleForPixelHeight(&src_tmp.FontInfo, cfg.SizePixels);
int unscaled_ascent, unscaled_descent, unscaled_line_gap;
- stbtt_GetFontVMetrics(&tmp.FontInfo, &unscaled_ascent, &unscaled_descent, &unscaled_line_gap);
+ stbtt_GetFontVMetrics(&src_tmp.FontInfo, &unscaled_ascent, &unscaled_descent, &unscaled_line_gap);
const float ascent = ImFloor(unscaled_ascent * font_scale + ((unscaled_ascent > 0.0f) ? +1 : -1));
const float descent = ImFloor(unscaled_descent * font_scale + ((unscaled_descent > 0.0f) ? +1 : -1));
ImFontAtlasBuildSetupFont(atlas, dst_font, &cfg, ascent, descent);
const float font_off_x = cfg.GlyphOffset.x;
- const float font_off_y = cfg.GlyphOffset.y + (float)(int)(dst_font->Ascent + 0.5f);
+ const float font_off_y = cfg.GlyphOffset.y + IM_ROUND(dst_font->Ascent);
- for (int i = 0; i < tmp.RangesCount; i++)
+ for (int glyph_i = 0; glyph_i < src_tmp.GlyphsCount; glyph_i++)
{
- stbtt_pack_range& range = tmp.Ranges[i];
- for (int char_idx = 0; char_idx < range.num_chars; char_idx += 1)
- {
- const stbtt_packedchar& pc = range.chardata_for_range[char_idx];
- if (!pc.x0 && !pc.x1 && !pc.y0 && !pc.y1)
- continue;
-
- const int codepoint = range.first_unicode_codepoint_in_range + char_idx;
- if (cfg.MergeMode && dst_font->FindGlyphNoFallback((ImWchar)codepoint))
- continue;
-
- float char_advance_x_org = pc.xadvance;
- float char_advance_x_mod = ImClamp(char_advance_x_org, cfg.GlyphMinAdvanceX, cfg.GlyphMaxAdvanceX);
- float char_off_x = font_off_x;
- if (char_advance_x_org != char_advance_x_mod)
- char_off_x += cfg.PixelSnapH ? (float)(int)((char_advance_x_mod - char_advance_x_org) * 0.5f) : (char_advance_x_mod - char_advance_x_org) * 0.5f;
-
- stbtt_aligned_quad q;
- float dummy_x = 0.0f, dummy_y = 0.0f;
- stbtt_GetPackedQuad(range.chardata_for_range, atlas->TexWidth, atlas->TexHeight, char_idx, &dummy_x, &dummy_y, &q, 0);
- dst_font->AddGlyph((ImWchar)codepoint, q.x0 + char_off_x, q.y0 + font_off_y, q.x1 + char_off_x, q.y1 + font_off_y, q.s0, q.t0, q.s1, q.t1, char_advance_x_mod);
- }
+ const int codepoint = src_tmp.GlyphsList[glyph_i];
+ const stbtt_packedchar& pc = src_tmp.PackedChars[glyph_i];
+
+ const float char_advance_x_org = pc.xadvance;
+ const float char_advance_x_mod = ImClamp(char_advance_x_org, cfg.GlyphMinAdvanceX, cfg.GlyphMaxAdvanceX);
+ float char_off_x = font_off_x;
+ if (char_advance_x_org != char_advance_x_mod)
+ char_off_x += cfg.PixelSnapH ? ImFloor((char_advance_x_mod - char_advance_x_org) * 0.5f) : (char_advance_x_mod - char_advance_x_org) * 0.5f;
+
+ // Register glyph
+ stbtt_aligned_quad q;
+ float dummy_x = 0.0f, dummy_y = 0.0f;
+ stbtt_GetPackedQuad(src_tmp.PackedChars, atlas->TexWidth, atlas->TexHeight, glyph_i, &dummy_x, &dummy_y, &q, 0);
+ dst_font->AddGlyph((ImWchar)codepoint, q.x0 + char_off_x, q.y0 + font_off_y, q.x1 + char_off_x, q.y1 + font_off_y, q.s0, q.t0, q.s1, q.t1, char_advance_x_mod);
}
}
- // Cleanup temporaries
- ImGui::MemFree(buf_packedchars);
- ImGui::MemFree(buf_ranges);
- ImGui::MemFree(tmp_array);
+ // Cleanup temporary (ImVector doesn't honor destructor)
+ for (int src_i = 0; src_i < src_tmp_array.Size; src_i++)
+ src_tmp_array[src_i].~ImFontBuildSrcData();
ImFontAtlasBuildFinish(atlas);
-
return true;
}
@@ -1948,16 +2219,17 @@ void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* f
font->ConfigDataCount++;
}
-void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* pack_context_opaque)
+void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque)
{
- stbrp_context* pack_context = (stbrp_context*)pack_context_opaque;
+ stbrp_context* pack_context = (stbrp_context*)stbrp_context_opaque;
+ IM_ASSERT(pack_context != NULL);
- ImVector<ImFontAtlas::CustomRect>& user_rects = atlas->CustomRects;
+ ImVector<ImFontAtlasCustomRect>& user_rects = atlas->CustomRects;
IM_ASSERT(user_rects.Size >= 1); // We expect at least the default custom rects to be registered, else something went wrong.
ImVector<stbrp_rect> pack_rects;
pack_rects.resize(user_rects.Size);
- memset(pack_rects.Data, 0, sizeof(stbrp_rect) * user_rects.Size);
+ memset(pack_rects.Data, 0, (size_t)pack_rects.size_in_bytes());
for (int i = 0; i < user_rects.Size; i++)
{
pack_rects[i].w = user_rects[i].Width;
@@ -1978,7 +2250,7 @@ static void ImFontAtlasBuildRenderDefaultTexData(ImFontAtlas* atlas)
{
IM_ASSERT(atlas->CustomRectIds[0] >= 0);
IM_ASSERT(atlas->TexPixelsAlpha8 != NULL);
- ImFontAtlas::CustomRect& r = atlas->CustomRects[atlas->CustomRectIds[0]];
+ ImFontAtlasCustomRect& r = atlas->CustomRects[atlas->CustomRectIds[0]];
IM_ASSERT(r.ID == FONT_ATLAS_DEFAULT_TEX_DATA_ID);
IM_ASSERT(r.IsPacked());
@@ -2013,8 +2285,8 @@ void ImFontAtlasBuildFinish(ImFontAtlas* atlas)
// Register custom rectangle glyphs
for (int i = 0; i < atlas->CustomRects.Size; i++)
{
- const ImFontAtlas::CustomRect& r = atlas->CustomRects[i];
- if (r.Font == NULL || r.ID > 0x10000)
+ const ImFontAtlasCustomRect& r = atlas->CustomRects[i];
+ if (r.Font == NULL || r.ID >= 0x110000)
continue;
IM_ASSERT(r.Font->ContainerAtlas == atlas);
@@ -2027,6 +2299,23 @@ void ImFontAtlasBuildFinish(ImFontAtlas* atlas)
for (int i = 0; i < atlas->Fonts.Size; i++)
if (atlas->Fonts[i]->DirtyLookupTables)
atlas->Fonts[i]->BuildLookupTable();
+
+ // Ellipsis character is required for rendering elided text. We prefer using U+2026 (horizontal ellipsis).
+ // However some old fonts may contain ellipsis at U+0085. Here we auto-detect most suitable ellipsis character.
+ // FIXME: Also note that 0x2026 is currently seldomly included in our font ranges. Because of this we are more likely to use three individual dots.
+ for (int i = 0; i < atlas->Fonts.size(); i++)
+ {
+ ImFont* font = atlas->Fonts[i];
+ if (font->EllipsisChar != (ImWchar)-1)
+ continue;
+ const ImWchar ellipsis_variants[] = { (ImWchar)0x2026, (ImWchar)0x0085 };
+ for (int j = 0; j < IM_ARRAYSIZE(ellipsis_variants); j++)
+ if (font->FindGlyphNoFallback(ellipsis_variants[j]) != NULL) // Verify glyph exists
+ {
+ font->EllipsisChar = ellipsis_variants[j];
+ break;
+ }
+ }
}
// Retrieve list of range (2 int per range, values are inclusive)
@@ -2057,7 +2346,8 @@ const ImWchar* ImFontAtlas::GetGlyphRangesChineseFull()
static const ImWchar ranges[] =
{
0x0020, 0x00FF, // Basic Latin + Latin Supplement
- 0x3000, 0x30FF, // Punctuations, Hiragana, Katakana
+ 0x2000, 0x206F, // General Punctuation
+ 0x3000, 0x30FF, // CJK Symbols and Punctuations, Hiragana, Katakana
0x31F0, 0x31FF, // Katakana Phonetic Extensions
0xFF00, 0xFFEF, // Half-width characters
0x4e00, 0x9FAF, // CJK Ideograms
@@ -2077,7 +2367,7 @@ static void UnpackAccumulativeOffsetsIntoRanges(int base_codepoint, const short*
}
//-------------------------------------------------------------------------
-// [SECTION] ImFontAtlas glyph ranges helpers + GlyphRangesBuilder
+// [SECTION] ImFontAtlas glyph ranges helpers
//-------------------------------------------------------------------------
const ImWchar* ImFontAtlas::GetGlyphRangesChineseSimplifiedCommon()
@@ -2085,7 +2375,7 @@ const ImWchar* ImFontAtlas::GetGlyphRangesChineseSimplifiedCommon()
// Store 2500 regularly used characters for Simplified Chinese.
// Sourced from https://zh.wiktionary.org/wiki/%E9%99%84%E5%BD%95:%E7%8E%B0%E4%BB%A3%E6%B1%89%E8%AF%AD%E5%B8%B8%E7%94%A8%E5%AD%97%E8%A1%A8
// This table covers 97.97% of all characters used during the month in July, 1987.
- // You can use ImFontAtlas::GlyphRangesBuilder to create your own ranges derived from this, by merging existing ranges or adding new characters.
+ // You can use ImFontGlyphRangesBuilder to create your own ranges derived from this, by merging existing ranges or adding new characters.
// (Stored as accumulative offsets from the initial unicode codepoint 0x4E00. This encoding is designed to helps us compact the source code size.)
static const short accumulative_offsets_from_0x4E00[] =
{
@@ -2133,9 +2423,10 @@ const ImWchar* ImFontAtlas::GetGlyphRangesChineseSimplifiedCommon()
static ImWchar base_ranges[] = // not zero-terminated
{
0x0020, 0x00FF, // Basic Latin + Latin Supplement
- 0x3000, 0x30FF, // Punctuations, Hiragana, Katakana
+ 0x2000, 0x206F, // General Punctuation
+ 0x3000, 0x30FF, // CJK Symbols and Punctuations, Hiragana, Katakana
0x31F0, 0x31FF, // Katakana Phonetic Extensions
- 0xFF00, 0xFFEF, // Half-width characters
+ 0xFF00, 0xFFEF // Half-width characters
};
static ImWchar full_ranges[IM_ARRAYSIZE(base_ranges) + IM_ARRAYSIZE(accumulative_offsets_from_0x4E00) * 2 + 1] = { 0 };
if (!full_ranges[0])
@@ -2151,7 +2442,7 @@ const ImWchar* ImFontAtlas::GetGlyphRangesJapanese()
// 1946 common ideograms code points for Japanese
// Sourced from http://theinstructionlimit.com/common-kanji-character-ranges-for-xna-spritefont-rendering
// FIXME: Source a list of the revised 2136 Joyo Kanji list from 2010 and rebuild this.
- // You can use ImFontAtlas::GlyphRangesBuilder to create your own ranges derived from this, by merging existing ranges or adding new characters.
+ // You can use ImFontGlyphRangesBuilder to create your own ranges derived from this, by merging existing ranges or adding new characters.
// (Stored as accumulative offsets from the initial unicode codepoint 0x4E00. This encoding is designed to helps us compact the source code size.)
static const short accumulative_offsets_from_0x4E00[] =
{
@@ -2186,14 +2477,14 @@ const ImWchar* ImFontAtlas::GetGlyphRangesJapanese()
3,7,6,3,1,2,3,9,1,3,1,6,3,2,1,3,11,3,1,6,10,3,2,3,1,2,1,5,1,1,11,3,6,4,1,7,2,1,2,5,5,34,4,14,18,4,19,7,5,8,2,6,79,1,5,2,14,8,2,9,2,1,36,28,16,
4,1,1,1,2,12,6,42,39,16,23,7,15,15,3,2,12,7,21,64,6,9,28,8,12,3,3,41,59,24,51,55,57,294,9,9,2,6,2,15,1,2,13,38,90,9,9,9,3,11,7,1,1,1,5,6,3,2,
1,2,2,3,8,1,4,4,1,5,7,1,4,3,20,4,9,1,1,1,5,5,17,1,5,2,6,2,4,1,4,5,7,3,18,11,11,32,7,5,4,7,11,127,8,4,3,3,1,10,1,1,6,21,14,1,16,1,7,1,3,6,9,65,
- 51,4,3,13,3,10,1,1,12,9,21,110,3,19,24,1,1,10,62,4,1,29,42,78,28,20,18,82,6,3,15,6,84,58,253,15,155,264,15,21,9,14,7,58,40,39,
+ 51,4,3,13,3,10,1,1,12,9,21,110,3,19,24,1,1,10,62,4,1,29,42,78,28,20,18,82,6,3,15,6,84,58,253,15,155,264,15,21,9,14,7,58,40,39,
};
static ImWchar base_ranges[] = // not zero-terminated
{
0x0020, 0x00FF, // Basic Latin + Latin Supplement
- 0x3000, 0x30FF, // Punctuations, Hiragana, Katakana
+ 0x3000, 0x30FF, // CJK Symbols and Punctuations, Hiragana, Katakana
0x31F0, 0x31FF, // Katakana Phonetic Extensions
- 0xFF00, 0xFFEF, // Half-width characters
+ 0xFF00, 0xFFEF // Half-width characters
};
static ImWchar full_ranges[IM_ARRAYSIZE(base_ranges) + IM_ARRAYSIZE(accumulative_offsets_from_0x4E00)*2 + 1] = { 0 };
if (!full_ranges[0])
@@ -2229,7 +2520,28 @@ const ImWchar* ImFontAtlas::GetGlyphRangesThai()
return &ranges[0];
}
-void ImFontAtlas::GlyphRangesBuilder::AddText(const char* text, const char* text_end)
+const ImWchar* ImFontAtlas::GetGlyphRangesVietnamese()
+{
+ static const ImWchar ranges[] =
+ {
+ 0x0020, 0x00FF, // Basic Latin
+ 0x0102, 0x0103,
+ 0x0110, 0x0111,
+ 0x0128, 0x0129,
+ 0x0168, 0x0169,
+ 0x01A0, 0x01A1,
+ 0x01AF, 0x01B0,
+ 0x1EA0, 0x1EF9,
+ 0,
+ };
+ return &ranges[0];
+}
+
+//-----------------------------------------------------------------------------
+// [SECTION] ImFontGlyphRangesBuilder
+//-----------------------------------------------------------------------------
+
+void ImFontGlyphRangesBuilder::AddText(const char* text, const char* text_end)
{
while (text_end ? (text < text_end) : *text)
{
@@ -2238,25 +2550,26 @@ void ImFontAtlas::GlyphRangesBuilder::AddText(const char* text, const char* text
text += c_len;
if (c_len == 0)
break;
- if (c < 0x10000)
+ if (c <= IM_UNICODE_CODEPOINT_MAX)
AddChar((ImWchar)c);
}
}
-void ImFontAtlas::GlyphRangesBuilder::AddRanges(const ImWchar* ranges)
+void ImFontGlyphRangesBuilder::AddRanges(const ImWchar* ranges)
{
for (; ranges[0]; ranges += 2)
for (ImWchar c = ranges[0]; c <= ranges[1]; c++)
AddChar(c);
}
-void ImFontAtlas::GlyphRangesBuilder::BuildRanges(ImVector<ImWchar>* out_ranges)
+void ImFontGlyphRangesBuilder::BuildRanges(ImVector<ImWchar>* out_ranges)
{
- for (int n = 0; n < 0x10000; n++)
+ const int max_codepoint = IM_UNICODE_CODEPOINT_MAX;
+ for (int n = 0; n <= max_codepoint; n++)
if (GetBit(n))
{
out_ranges->push_back((ImWchar)n);
- while (n < 0x10000 && GetBit(n + 1))
+ while (n < max_codepoint && GetBit(n + 1))
n++;
out_ranges->push_back((ImWchar)n);
}
@@ -2269,38 +2582,37 @@ void ImFontAtlas::GlyphRangesBuilder::BuildRanges(ImVector<ImWchar>* out_ranges)
ImFont::ImFont()
{
- Scale = 1.0f;
+ FontSize = 0.0f;
+ FallbackAdvanceX = 0.0f;
FallbackChar = (ImWchar)'?';
+ EllipsisChar = (ImWchar)-1;
DisplayOffset = ImVec2(0.0f, 0.0f);
- ClearOutputData();
+ FallbackGlyph = NULL;
+ ContainerAtlas = NULL;
+ ConfigData = NULL;
+ ConfigDataCount = 0;
+ DirtyLookupTables = false;
+ Scale = 1.0f;
+ Ascent = Descent = 0.0f;
+ MetricsTotalSurface = 0;
}
ImFont::~ImFont()
{
- // Invalidate active font so that the user gets a clear crash instead of a dangling pointer.
- // If you want to delete fonts you need to do it between Render() and NewFrame().
- // FIXME-CLEANUP
- /*
- ImGuiContext& g = *GImGui;
- if (g.Font == this)
- g.Font = NULL;
- */
ClearOutputData();
}
void ImFont::ClearOutputData()
{
FontSize = 0.0f;
+ FallbackAdvanceX = 0.0f;
Glyphs.clear();
IndexAdvanceX.clear();
IndexLookup.clear();
FallbackGlyph = NULL;
- FallbackAdvanceX = 0.0f;
- ConfigDataCount = 0;
- ConfigData = NULL;
ContainerAtlas = NULL;
- Ascent = Descent = 0.0f;
DirtyLookupTables = true;
+ Ascent = Descent = 0.0f;
MetricsTotalSurface = 0;
}
@@ -2331,7 +2643,7 @@ void ImFont::BuildLookupTable()
ImFontGlyph& tab_glyph = Glyphs.back();
tab_glyph = *FindGlyph((ImWchar)' ');
tab_glyph.Codepoint = '\t';
- tab_glyph.AdvanceX *= 4;
+ tab_glyph.AdvanceX *= IM_TABSIZE;
IndexAdvanceX[(int)tab_glyph.Codepoint] = (float)tab_glyph.AdvanceX;
IndexLookup[(int)tab_glyph.Codepoint] = (ImWchar)(Glyphs.Size-1);
}
@@ -2376,7 +2688,7 @@ void ImFont::AddGlyph(ImWchar codepoint, float x0, float y0, float x1, float y1,
glyph.AdvanceX = advance_x + ConfigData->GlyphExtraSpacing.x; // Bake spacing into AdvanceX
if (ConfigData->PixelSnapH)
- glyph.AdvanceX = (float)(int)(glyph.AdvanceX + 0.5f);
+ glyph.AdvanceX = IM_ROUND(glyph.AdvanceX);
// Compute rough surface usage metrics (+1 to account for average padding, +0.99 to round)
DirtyLookupTables = true;
@@ -2386,7 +2698,7 @@ void ImFont::AddGlyph(ImWchar codepoint, float x0, float y0, float x1, float y1,
void ImFont::AddRemapChar(ImWchar dst, ImWchar src, bool overwrite_dst)
{
IM_ASSERT(IndexLookup.Size > 0); // Currently this can only be called AFTER the font has been built, aka after calling ImFontAtlas::GetTexDataAs*() function.
- int index_size = IndexLookup.Size;
+ unsigned int index_size = (unsigned int)IndexLookup.Size;
if (dst < index_size && IndexLookup.Data[dst] == (ImWchar)-1 && !overwrite_dst) // 'dst' already exists
return;
@@ -2402,7 +2714,7 @@ const ImFontGlyph* ImFont::FindGlyph(ImWchar c) const
{
if (c >= IndexLookup.Size)
return FallbackGlyph;
- const ImWchar i = IndexLookup[c];
+ const ImWchar i = IndexLookup.Data[c];
if (i == (ImWchar)-1)
return FallbackGlyph;
return &Glyphs.Data[i];
@@ -2412,7 +2724,7 @@ const ImFontGlyph* ImFont::FindGlyphNoFallback(ImWchar c) const
{
if (c >= IndexLookup.Size)
return NULL;
- const ImWchar i = IndexLookup[c];
+ const ImWchar i = IndexLookup.Data[c];
if (i == (ImWchar)-1)
return NULL;
return &Glyphs.Data[i];
@@ -2472,7 +2784,7 @@ const char* ImFont::CalcWordWrapPositionA(float scale, const char* text, const c
}
}
- const float char_width = ((int)c < IndexAdvanceX.Size ? IndexAdvanceX[(int)c] : FallbackAdvanceX);
+ const float char_width = ((int)c < IndexAdvanceX.Size ? IndexAdvanceX.Data[c] : FallbackAdvanceX);
if (ImCharIsBlankW(c))
{
if (inside_word)
@@ -2503,7 +2815,7 @@ const char* ImFont::CalcWordWrapPositionA(float scale, const char* text, const c
}
// We ignore blank width at the end of the line (they can be skipped)
- if (line_width + word_width >= wrap_width)
+ if (line_width + word_width > wrap_width)
{
// Words that cannot possibly fit within an entire line will be cut anywhere.
if (word_width < wrap_width)
@@ -2589,7 +2901,7 @@ ImVec2 ImFont::CalcTextSizeA(float size, float max_width, float wrap_width, cons
continue;
}
- const float char_width = ((int)c < IndexAdvanceX.Size ? IndexAdvanceX[(int)c] : FallbackAdvanceX) * scale;
+ const float char_width = ((int)c < IndexAdvanceX.Size ? IndexAdvanceX.Data[c] : FallbackAdvanceX) * scale;
if (line_width + char_width >= max_width)
{
s = prev_s;
@@ -2618,8 +2930,8 @@ void ImFont::RenderChar(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col
if (const ImFontGlyph* glyph = FindGlyph(c))
{
float scale = (size >= 0.0f) ? (size / FontSize) : 1.0f;
- pos.x = (float)(int)pos.x + DisplayOffset.x;
- pos.y = (float)(int)pos.y + DisplayOffset.y;
+ pos.x = IM_FLOOR(pos.x + DisplayOffset.x);
+ pos.y = IM_FLOOR(pos.y + DisplayOffset.y);
draw_list->PrimReserve(6, 4);
draw_list->PrimRectUV(ImVec2(pos.x + glyph->X0 * scale, pos.y + glyph->Y0 * scale), ImVec2(pos.x + glyph->X1 * scale, pos.y + glyph->Y1 * scale), ImVec2(glyph->U0, glyph->V0), ImVec2(glyph->U1, glyph->V1), col);
}
@@ -2628,11 +2940,11 @@ void ImFont::RenderChar(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col
void ImFont::RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col, const ImVec4& clip_rect, const char* text_begin, const char* text_end, float wrap_width, bool cpu_fine_clip) const
{
if (!text_end)
- text_end = text_begin + strlen(text_begin); // ImGui functions generally already provides a valid text_end, so this is merely to handle direct calls.
+ text_end = text_begin + strlen(text_begin); // ImGui:: functions generally already provides a valid text_end, so this is merely to handle direct calls.
// Align to be pixel perfect
- pos.x = (float)(int)pos.x + DisplayOffset.x;
- pos.y = (float)(int)pos.y + DisplayOffset.y;
+ pos.x = IM_FLOOR(pos.x + DisplayOffset.x);
+ pos.y = IM_FLOOR(pos.y + DisplayOffset.y);
float x = pos.x;
float y = pos.y;
if (y > clip_rect.w)
@@ -2662,7 +2974,7 @@ void ImFont::RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col
while (y_end < clip_rect.w && s_end < text_end)
{
s_end = (const char*)memchr(s_end, '\n', text_end - s_end);
- s = s ? s + 1 : text_end;
+ s_end = s_end ? s_end + 1 : text_end;
y_end += line_height;
}
text_end = s_end;
@@ -2680,6 +2992,15 @@ void ImFont::RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col
ImDrawIdx* idx_write = draw_list->_IdxWritePtr;
unsigned int vtx_current_idx = draw_list->_VtxCurrentIdx;
+ ImU32 defaultCol = col;
+ ImU32 highlighCol = ImGui::GetColorU32(ImGuiCol_ButtonHovered);
+
+ // if text is started with ColorMarkerHovered symbol, we should use another color for a highlighting
+ if (*s == ImGui::ColorMarkerHovered) {
+ highlighCol = ImGui::GetColorU32(ImGuiCol_FrameBg);
+ s += 1;
+ }
+
while (s < text_end)
{
if (word_wrap_enabled)
@@ -2708,6 +3029,17 @@ void ImFont::RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col
}
}
+ if (*s == ImGui::ColorMarkerStart) {
+ col = highlighCol;
+ s += 1;
+ }
+ else if (*s == ImGui::ColorMarkerEnd) {
+ col = defaultCol;
+ s += 1;
+ if (s == text_end)
+ break;
+ }
+
// Decode and advance source
unsigned int c = (unsigned int)*s;
if (c < 0x80)
@@ -2805,13 +3137,13 @@ void ImFont::RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col
x += char_width;
}
- // Give back unused vertices
- draw_list->VtxBuffer.resize((int)(vtx_write - draw_list->VtxBuffer.Data));
- draw_list->IdxBuffer.resize((int)(idx_write - draw_list->IdxBuffer.Data));
+ // Give back unused vertices (clipped ones, blanks) ~ this is essentially a PrimUnreserve() action.
+ draw_list->VtxBuffer.Size = (int)(vtx_write - draw_list->VtxBuffer.Data); // Same as calling shrink()
+ draw_list->IdxBuffer.Size = (int)(idx_write - draw_list->IdxBuffer.Data);
draw_list->CmdBuffer[draw_list->CmdBuffer.Size-1].ElemCount -= (idx_expected_size - draw_list->IdxBuffer.Size);
draw_list->_VtxWritePtr = vtx_write;
draw_list->_IdxWritePtr = idx_write;
- draw_list->_VtxCurrentIdx = (unsigned int)draw_list->VtxBuffer.Size;
+ draw_list->_VtxCurrentIdx = vtx_current_idx;
}
//-----------------------------------------------------------------------------
@@ -2823,16 +3155,12 @@ void ImFont::RenderText(ImDrawList* draw_list, float size, ImVec2 pos, ImU32 col
// - RenderRectFilledRangeH()
//-----------------------------------------------------------------------------
-void ImGui::RenderMouseCursor(ImDrawList* draw_list, ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor)
+void ImGui::RenderMouseCursor(ImDrawList* draw_list, ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow)
{
if (mouse_cursor == ImGuiMouseCursor_None)
return;
IM_ASSERT(mouse_cursor > ImGuiMouseCursor_None && mouse_cursor < ImGuiMouseCursor_COUNT);
- const ImU32 col_shadow = IM_COL32(0, 0, 0, 48);
- const ImU32 col_border = IM_COL32(0, 0, 0, 255); // Black
- const ImU32 col_fill = IM_COL32(255, 255, 255, 255); // White
-
ImFontAtlas* font_atlas = draw_list->_Data->Font->ContainerAtlas;
ImVec2 offset, size, uv[4];
if (font_atlas->GetMouseCursorTexData(mouse_cursor, &offset, &size, &uv[0], &uv[2]))
@@ -2889,13 +3217,14 @@ void ImGui::RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, Im
const float inv_rounding = 1.0f / rounding;
const float arc0_b = ImAcos01(1.0f - (p0.x - rect.Min.x) * inv_rounding);
const float arc0_e = ImAcos01(1.0f - (p1.x - rect.Min.x) * inv_rounding);
+ const float half_pi = IM_PI * 0.5f; // We will == compare to this because we know this is the exact value ImAcos01 can return.
const float x0 = ImMax(p0.x, rect.Min.x + rounding);
if (arc0_b == arc0_e)
{
draw_list->PathLineTo(ImVec2(x0, p1.y));
draw_list->PathLineTo(ImVec2(x0, p0.y));
}
- else if (arc0_b == 0.0f && arc0_e == IM_PI*0.5f)
+ else if (arc0_b == 0.0f && arc0_e == half_pi)
{
draw_list->PathArcToFast(ImVec2(x0, p1.y - rounding), rounding, 3, 6); // BL
draw_list->PathArcToFast(ImVec2(x0, p0.y + rounding), rounding, 6, 9); // TR
@@ -2915,7 +3244,7 @@ void ImGui::RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, Im
draw_list->PathLineTo(ImVec2(x1, p0.y));
draw_list->PathLineTo(ImVec2(x1, p1.y));
}
- else if (arc1_b == 0.0f && arc1_e == IM_PI*0.5f)
+ else if (arc1_b == 0.0f && arc1_e == half_pi)
{
draw_list->PathArcToFast(ImVec2(x1, p0.y + rounding), rounding, 9, 12); // TR
draw_list->PathArcToFast(ImVec2(x1, p1.y - rounding), rounding, 0, 3); // BR
@@ -2929,7 +3258,6 @@ void ImGui::RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, Im
draw_list->PathFillConvex(col);
}
-
//-----------------------------------------------------------------------------
// [SECTION] Decompression code
//-----------------------------------------------------------------------------
@@ -2990,9 +3318,9 @@ static unsigned int stb_adler32(unsigned int adler32, unsigned char *buffer, uns
{
const unsigned long ADLER_MOD = 65521;
unsigned long s1 = adler32 & 0xffff, s2 = adler32 >> 16;
- unsigned long blocklen, i;
+ unsigned long blocklen = buflen % 5552;
- blocklen = buflen % 5552;
+ unsigned long i;
while (buflen) {
for (i=0; i + 7 < blocklen; i += 8) {
s1 += buffer[0], s2 += s1;
@@ -3019,10 +3347,9 @@ static unsigned int stb_adler32(unsigned int adler32, unsigned char *buffer, uns
static unsigned int stb_decompress(unsigned char *output, const unsigned char *i, unsigned int /*length*/)
{
- unsigned int olen;
if (stb__in4(0) != 0x57bC0000) return 0;
if (stb__in4(4) != 0) return 0; // error! stream is > 4GB
- olen = stb_decompress_length(i);
+ const unsigned int olen = stb_decompress_length(i);
stb__barrier_in_b = i;
stb__barrier_out_e = output + olen;
stb__barrier_out_b = output;
@@ -3154,3 +3481,5 @@ static const char* GetDefaultCompressedFontDataTTFBase85()
{
return proggy_clean_ttf_compressed_data_base85;
}
+
+#endif // #ifndef IMGUI_DISABLE
diff --git a/src/imgui/imgui_internal.h b/src/imgui/imgui_internal.h
index bac04ae6a..5de13c365 100644
--- a/src/imgui/imgui_internal.h
+++ b/src/imgui/imgui_internal.h
@@ -1,4 +1,4 @@
-// dear imgui, v1.66 WIP
+// dear imgui, v1.75
// (internal structures/api)
// You may use this file to debug, understand or extend ImGui features but we don't provide any guarantee of forward compatibility!
@@ -6,69 +6,120 @@
// #define IMGUI_DEFINE_MATH_OPERATORS
// To implement maths operators for ImVec2 (disabled by default to not collide with using IM_VEC2_CLASS_EXTRA along with your own math types+operators)
+/*
+
+Index of this file:
+// Header mess
+// Forward declarations
+// STB libraries includes
+// Context pointer
+// Generic helpers
+// Misc data structures
+// Main imgui context
+// Tab bar, tab item
+// Internal API
+
+*/
+
#pragma once
+#ifndef IMGUI_DISABLE
+
+//-----------------------------------------------------------------------------
+// Header mess
+//-----------------------------------------------------------------------------
#ifndef IMGUI_VERSION
#error Must include imgui.h before imgui_internal.h
#endif
-#include <stdio.h> // FILE*
+#include <stdio.h> // FILE*, sscanf
#include <stdlib.h> // NULL, malloc, free, qsort, atoi, atof
#include <math.h> // sqrtf, fabsf, fmodf, powf, floorf, ceilf, cosf, sinf
#include <limits.h> // INT_MIN, INT_MAX
+// Visual Studio warnings
#ifdef _MSC_VER
#pragma warning (push)
#pragma warning (disable: 4251) // class 'xxx' needs to have dll-interface to be used by clients of struct 'xxx' // when IMGUI_API is set to__declspec(dllexport)
#endif
-#ifdef __clang__
+// Clang/GCC warnings with -Weverything
+#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-function" // for stb_textedit.h
#pragma clang diagnostic ignored "-Wmissing-prototypes" // for stb_textedit.h
#pragma clang diagnostic ignored "-Wold-style-cast"
+#if __has_warning("-Wzero-as-null-pointer-constant")
+#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
+#endif
+#if __has_warning("-Wdouble-promotion")
+#pragma clang diagnostic ignored "-Wdouble-promotion"
+#endif
+#elif defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
+#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
+#endif
+
+// Legacy defines
+#ifdef IMGUI_DISABLE_FORMAT_STRING_FUNCTIONS // Renamed in 1.74
+#error Use IMGUI_DISABLE_DEFAULT_FORMAT_FUNCTIONS
+#endif
+#ifdef IMGUI_DISABLE_MATH_FUNCTIONS // Renamed in 1.74
+#error Use IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS
#endif
//-----------------------------------------------------------------------------
-// Forward Declarations
+// Forward declarations
//-----------------------------------------------------------------------------
+struct ImBoolVector; // Store 1-bit per value
struct ImRect; // An axis-aligned rectangle (2 points)
struct ImDrawDataBuilder; // Helper to build a ImDrawData instance
struct ImDrawListSharedData; // Data shared between all ImDrawList instances
struct ImGuiColorMod; // Stacked color modifier, backup of modified data so we can restore it
struct ImGuiColumnData; // Storage data for a single column
-struct ImGuiColumnsSet; // Storage data for a columns set
-struct ImGuiContext; // Main imgui context
+struct ImGuiColumns; // Storage data for a columns set
+struct ImGuiContext; // Main Dear ImGui context
+struct ImGuiDataTypeInfo; // Type information associated to a ImGuiDataType enum
struct ImGuiGroupData; // Stacked storage data for BeginGroup()/EndGroup()
struct ImGuiInputTextState; // Internal state of the currently focused/edited text input box
struct ImGuiItemHoveredDataBackup; // Backup and restore IsItemHovered() internal data
struct ImGuiMenuColumns; // Simple column measurement, currently used for MenuItem() only
struct ImGuiNavMoveResult; // Result of a directional navigation move query result
-struct ImGuiNextWindowData; // Storage for SetNexWindow** functions
-struct ImGuiPopupRef; // Storage for current popup stack
+struct ImGuiNextWindowData; // Storage for SetNextWindow** functions
+struct ImGuiNextItemData; // Storage for SetNextItem** functions
+struct ImGuiPopupData; // Storage for current popup stack
struct ImGuiSettingsHandler; // Storage for one type registered in the .ini file
struct ImGuiStyleMod; // Stacked style modifier, backup of modified data so we can restore it
+struct ImGuiTabBar; // Storage for a tab bar
+struct ImGuiTabItem; // Storage for a tab item (within a tab bar)
struct ImGuiWindow; // Storage for one window
struct ImGuiWindowTempData; // Temporary storage for one window (that's the data which in theory we could ditch at the end of the frame)
-struct ImGuiWindowSettings; // Storage for window settings stored in .ini file (we keep one of those even if the actual window wasn't instanced during this session)
+struct ImGuiWindowSettings; // Storage for a window .ini settings (we keep one of those even if the actual window wasn't instanced during this session)
// Use your programming IDE "Go to definition" facility on the names of the center columns to find the actual flags/enum lists.
-typedef int ImGuiLayoutType; // -> enum ImGuiLayoutType_ // Enum: Horizontal or vertical
-typedef int ImGuiButtonFlags; // -> enum ImGuiButtonFlags_ // Flags: for ButtonEx(), ButtonBehavior()
-typedef int ImGuiItemFlags; // -> enum ImGuiItemFlags_ // Flags: for PushItemFlag()
-typedef int ImGuiItemStatusFlags; // -> enum ImGuiItemStatusFlags_ // Flags: for DC.LastItemStatusFlags
-typedef int ImGuiNavHighlightFlags; // -> enum ImGuiNavHighlightFlags_ // Flags: for RenderNavHighlight()
-typedef int ImGuiNavDirSourceFlags; // -> enum ImGuiNavDirSourceFlags_ // Flags: for GetNavInputAmount2d()
-typedef int ImGuiNavMoveFlags; // -> enum ImGuiNavMoveFlags_ // Flags: for navigation requests
-typedef int ImGuiSeparatorFlags; // -> enum ImGuiSeparatorFlags_ // Flags: for Separator() - internal
-typedef int ImGuiSliderFlags; // -> enum ImGuiSliderFlags_ // Flags: for SliderBehavior()
+typedef int ImGuiLayoutType; // -> enum ImGuiLayoutType_ // Enum: Horizontal or vertical
+typedef int ImGuiButtonFlags; // -> enum ImGuiButtonFlags_ // Flags: for ButtonEx(), ButtonBehavior()
+typedef int ImGuiColumnsFlags; // -> enum ImGuiColumnsFlags_ // Flags: BeginColumns()
+typedef int ImGuiDragFlags; // -> enum ImGuiDragFlags_ // Flags: for DragBehavior()
+typedef int ImGuiItemFlags; // -> enum ImGuiItemFlags_ // Flags: for PushItemFlag()
+typedef int ImGuiItemStatusFlags; // -> enum ImGuiItemStatusFlags_ // Flags: for DC.LastItemStatusFlags
+typedef int ImGuiNavHighlightFlags; // -> enum ImGuiNavHighlightFlags_ // Flags: for RenderNavHighlight()
+typedef int ImGuiNavDirSourceFlags; // -> enum ImGuiNavDirSourceFlags_ // Flags: for GetNavInputAmount2d()
+typedef int ImGuiNavMoveFlags; // -> enum ImGuiNavMoveFlags_ // Flags: for navigation requests
+typedef int ImGuiNextItemDataFlags; // -> enum ImGuiNextItemDataFlags_ // Flags: for SetNextItemXXX() functions
+typedef int ImGuiNextWindowDataFlags; // -> enum ImGuiNextWindowDataFlags_// Flags: for SetNextWindowXXX() functions
+typedef int ImGuiSeparatorFlags; // -> enum ImGuiSeparatorFlags_ // Flags: for SeparatorEx()
+typedef int ImGuiSliderFlags; // -> enum ImGuiSliderFlags_ // Flags: for SliderBehavior()
+typedef int ImGuiTextFlags; // -> enum ImGuiTextFlags_ // Flags: for TextEx()
+typedef int ImGuiTooltipFlags; // -> enum ImGuiTooltipFlags_ // Flags: for BeginTooltipEx()
//-------------------------------------------------------------------------
-// STB libraries
+// STB libraries includes
//-------------------------------------------------------------------------
-namespace ImGuiStb
+namespace ImStb
{
#undef STB_TEXTEDIT_STRING
@@ -76,31 +127,63 @@ namespace ImGuiStb
#define STB_TEXTEDIT_STRING ImGuiInputTextState
#define STB_TEXTEDIT_CHARTYPE ImWchar
#define STB_TEXTEDIT_GETWIDTH_NEWLINE -1.0f
+#define STB_TEXTEDIT_UNDOSTATECOUNT 99
+#define STB_TEXTEDIT_UNDOCHARCOUNT 999
#include "imstb_textedit.h"
-} // namespace ImGuiStb
+} // namespace ImStb
//-----------------------------------------------------------------------------
-// Context
+// Context pointer
//-----------------------------------------------------------------------------
#ifndef GImGui
-extern IMGUI_API ImGuiContext* GImGui; // Current implicit ImGui context pointer
+extern IMGUI_API ImGuiContext* GImGui; // Current implicit context pointer
#endif
//-----------------------------------------------------------------------------
-// Helpers
+// Macros
//-----------------------------------------------------------------------------
-#define IM_PI 3.14159265358979323846f
+// Debug Logging
+#ifndef IMGUI_DEBUG_LOG
+#define IMGUI_DEBUG_LOG(_FMT,...) printf("[%05d] " _FMT, GImGui->FrameCount, __VA_ARGS__)
+#endif
+
+// Static Asserts
+#if (__cplusplus >= 201100)
+#define IM_STATIC_ASSERT(_COND) static_assert(_COND, "")
+#else
+#define IM_STATIC_ASSERT(_COND) typedef char static_assertion_##__line__[(_COND)?1:-1]
+#endif
+
+// "Paranoid" Debug Asserts are meant to only be enabled during specific debugging/work, otherwise would slow down the code too much.
+// We currently don't have many of those so the effect is currently negligible, but onward intent to add more aggressive ones in the code.
+//#define IMGUI_DEBUG_PARANOID
+#ifdef IMGUI_DEBUG_PARANOID
+#define IM_ASSERT_PARANOID(_EXPR) IM_ASSERT(_EXPR)
+#else
+#define IM_ASSERT_PARANOID(_EXPR)
+#endif
+
+// Error handling
+// Down the line in some frameworks/languages we would like to have a way to redirect those to the programmer and recover from more faults.
+#ifndef IM_ASSERT_USER_ERROR
+#define IM_ASSERT_USER_ERROR(_EXP,_MSG) IM_ASSERT((_EXP) && _MSG) // Recoverable User Error
+#endif
+
+// Misc Macros
+#define IM_PI 3.14159265358979323846f
#ifdef _WIN32
-#define IM_NEWLINE "\r\n" // Play it nice with Windows users (2018/05 news: Microsoft announced that Notepad will finally display Unix-style carriage returns!)
+#define IM_NEWLINE "\r\n" // Play it nice with Windows users (Update: since 2018-05, Notepad finally appears to support Unix-style carriage returns!)
#else
-#define IM_NEWLINE "\n"
+#define IM_NEWLINE "\n"
#endif
-#define IM_STATIC_ASSERT(_COND) typedef char static_assertion_##__line__[(_COND)?1:-1]
+#define IM_TABSIZE (4)
#define IM_F32_TO_INT8_UNBOUND(_VAL) ((int)((_VAL) * 255.0f + ((_VAL)>=0 ? 0.5f : -0.5f))) // Unsaturated, for display purpose
#define IM_F32_TO_INT8_SAT(_VAL) ((int)(ImSaturate(_VAL) * 255.0f + 0.5f)) // Saturated, always output 0..255
+#define IM_FLOOR(_VAL) ((float)(int)(_VAL)) // ImFloor() is not inlined in MSVC debug builds
+#define IM_ROUND(_VAL) ((float)(int)((_VAL) + 0.5f)) //
// Enforce cdecl calling convention for functions called by the standard library, in case compilation settings changed the default to e.g. __vectorcall
#ifdef _MSC_VER
@@ -109,48 +192,64 @@ extern IMGUI_API ImGuiContext* GImGui; // Current implicit ImGui context pointe
#define IMGUI_CDECL
#endif
-// Helpers: UTF-8 <> wchar
-IMGUI_API int ImTextStrToUtf8(char* buf, int buf_size, const ImWchar* in_text, const ImWchar* in_text_end); // return output UTF-8 bytes count
-IMGUI_API int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char* in_text_end); // read one character. return input UTF-8 bytes count
-IMGUI_API int ImTextStrFromUtf8(ImWchar* buf, int buf_size, const char* in_text, const char* in_text_end, const char** in_remaining = NULL); // return input UTF-8 bytes count
-IMGUI_API int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end); // return number of UTF-8 code-points (NOT bytes count)
-IMGUI_API int ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end); // return number of bytes to express one char in UTF-8
-IMGUI_API int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end); // return number of bytes to express string in UTF-8
+//-----------------------------------------------------------------------------
+// Generic helpers
+// Note that the ImXXX helpers functions are lower-level than ImGui functions.
+// ImGui functions or the ImGui context are never called/used from other ImXXX functions.
+//-----------------------------------------------------------------------------
+// - Helpers: Misc
+// - Helpers: Bit manipulation
+// - Helpers: String, Formatting
+// - Helpers: UTF-8 <> wchar conversions
+// - Helpers: ImVec2/ImVec4 operators
+// - Helpers: Maths
+// - Helpers: Geometry
+// - Helper: ImBoolVector
+// - Helper: ImPool<>
+// - Helper: ImChunkStream<>
+//-----------------------------------------------------------------------------
// Helpers: Misc
-IMGUI_API ImU32 ImHash(const void* data, int data_size, ImU32 seed = 0); // Pass data_size==0 for zero-terminated strings
-IMGUI_API void* ImFileLoadToMemory(const char* filename, const char* file_open_mode, size_t* out_file_size = NULL, int padding_bytes = 0);
-IMGUI_API FILE* ImFileOpen(const char* filename, const char* file_open_mode);
-static inline bool ImCharIsBlankA(char c) { return c == ' ' || c == '\t'; }
-static inline bool ImCharIsBlankW(unsigned int c) { return c == ' ' || c == '\t' || c == 0x3000; }
-static inline bool ImIsPowerOfTwo(int v) { return v != 0 && (v & (v - 1)) == 0; }
-static inline int ImUpperPowerOfTwo(int v) { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; }
#define ImQsort qsort
+IMGUI_API ImU32 ImHashData(const void* data, size_t data_size, ImU32 seed = 0);
+IMGUI_API ImU32 ImHashStr(const char* data, size_t data_size = 0, ImU32 seed = 0);
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+static inline ImU32 ImHash(const void* data, int size, ImU32 seed = 0) { return size ? ImHashData(data, (size_t)size, seed) : ImHashStr((const char*)data, 0, seed); } // [moved to ImHashStr/ImHashData in 1.68]
+#endif
-// Helpers: Geometry
-IMGUI_API ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p);
-IMGUI_API bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
-IMGUI_API ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
-IMGUI_API void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w);
-IMGUI_API ImGuiDir ImGetDirQuadrantFromDelta(float dx, float dy);
+// Helpers: Bit manipulation
+static inline bool ImIsPowerOfTwo(int v) { return v != 0 && (v & (v - 1)) == 0; }
+static inline int ImUpperPowerOfTwo(int v) { v--; v |= v >> 1; v |= v >> 2; v |= v >> 4; v |= v >> 8; v |= v >> 16; v++; return v; }
-// Helpers: String
+// Helpers: String, Formatting
IMGUI_API int ImStricmp(const char* str1, const char* str2);
IMGUI_API int ImStrnicmp(const char* str1, const char* str2, size_t count);
IMGUI_API void ImStrncpy(char* dst, const char* src, size_t count);
IMGUI_API char* ImStrdup(const char* str);
+IMGUI_API char* ImStrdupcpy(char* dst, size_t* p_dst_size, const char* str);
IMGUI_API const char* ImStrchrRange(const char* str_begin, const char* str_end, char c);
IMGUI_API int ImStrlenW(const ImWchar* str);
IMGUI_API const char* ImStreolRange(const char* str, const char* str_end); // End end-of-line
IMGUI_API const ImWchar*ImStrbolW(const ImWchar* buf_mid_line, const ImWchar* buf_begin); // Find beginning-of-line
IMGUI_API const char* ImStristr(const char* haystack, const char* haystack_end, const char* needle, const char* needle_end);
IMGUI_API void ImStrTrimBlanks(char* str);
+IMGUI_API const char* ImStrSkipBlank(const char* str);
IMGUI_API int ImFormatString(char* buf, size_t buf_size, const char* fmt, ...) IM_FMTARGS(3);
IMGUI_API int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) IM_FMTLIST(3);
IMGUI_API const char* ImParseFormatFindStart(const char* format);
IMGUI_API const char* ImParseFormatFindEnd(const char* format);
-IMGUI_API const char* ImParseFormatTrimDecorations(const char* format, char* buf, int buf_size);
+IMGUI_API const char* ImParseFormatTrimDecorations(const char* format, char* buf, size_t buf_size);
IMGUI_API int ImParseFormatPrecision(const char* format, int default_value);
+static inline bool ImCharIsBlankA(char c) { return c == ' ' || c == '\t'; }
+static inline bool ImCharIsBlankW(unsigned int c) { return c == ' ' || c == '\t' || c == 0x3000; }
+
+// Helpers: UTF-8 <> wchar conversions
+IMGUI_API int ImTextStrToUtf8(char* buf, int buf_size, const ImWchar* in_text, const ImWchar* in_text_end); // return output UTF-8 bytes count
+IMGUI_API int ImTextCharFromUtf8(unsigned int* out_char, const char* in_text, const char* in_text_end); // read one character. return input UTF-8 bytes count
+IMGUI_API int ImTextStrFromUtf8(ImWchar* buf, int buf_size, const char* in_text, const char* in_text_end, const char** in_remaining = NULL); // return input UTF-8 bytes count
+IMGUI_API int ImTextCountCharsFromUtf8(const char* in_text, const char* in_text_end); // return number of UTF-8 code-points (NOT bytes count)
+IMGUI_API int ImTextCountUtf8BytesFromChar(const char* in_text, const char* in_text_end); // return number of bytes to express one char in UTF-8
+IMGUI_API int ImTextCountUtf8BytesFromStr(const ImWchar* in_text, const ImWchar* in_text_end); // return number of bytes to express string in UTF-8
// Helpers: ImVec2/ImVec4 operators
// We are keeping those disabled by default so they don't leak in user space, to allow user enabling implicit cast operators between ImVec2 and their own types (using IM_VEC2_CLASS_EXTRA etc.)
@@ -171,29 +270,54 @@ static inline ImVec4 operator-(const ImVec4& lhs, const ImVec4& rhs)
static inline ImVec4 operator*(const ImVec4& lhs, const ImVec4& rhs) { return ImVec4(lhs.x*rhs.x, lhs.y*rhs.y, lhs.z*rhs.z, lhs.w*rhs.w); }
#endif
+// Helpers: File System
+#ifdef IMGUI_DISABLE_FILE_FUNCTIONS
+#define IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS
+typedef void* ImFileHandle;
+static inline ImFileHandle ImFileOpen(const char*, const char*) { return NULL; }
+static inline bool ImFileClose(ImFileHandle) { return false; }
+static inline ImU64 ImFileGetSize(ImFileHandle) { return (ImU64)-1; }
+static inline ImU64 ImFileRead(void*, ImU64, ImU64, ImFileHandle) { return 0; }
+static inline ImU64 ImFileWrite(const void*, ImU64, ImU64, ImFileHandle) { return 0; }
+#endif
+
+#ifndef IMGUI_DISABLE_DEFAULT_FILE_FUNCTIONS
+typedef FILE* ImFileHandle;
+IMGUI_API ImFileHandle ImFileOpen(const char* filename, const char* mode);
+IMGUI_API bool ImFileClose(ImFileHandle file);
+IMGUI_API ImU64 ImFileGetSize(ImFileHandle file);
+IMGUI_API ImU64 ImFileRead(void* data, ImU64 size, ImU64 count, ImFileHandle file);
+IMGUI_API ImU64 ImFileWrite(const void* data, ImU64 size, ImU64 count, ImFileHandle file);
+#else
+#define IMGUI_DISABLE_TTY_FUNCTIONS // Can't use stdout, fflush if we are not using default file functions
+#endif
+IMGUI_API void* ImFileLoadToMemory(const char* filename, const char* mode, size_t* out_file_size = NULL, int padding_bytes = 0);
+
// Helpers: Maths
// - Wrapper for standard libs functions. (Note that imgui_demo.cpp does _not_ use them to keep the code easy to copy)
-#ifndef IMGUI_DISABLE_MATH_FUNCTIONS
-static inline float ImFabs(float x) { return fabsf(x); }
-static inline float ImSqrt(float x) { return sqrtf(x); }
-static inline float ImPow(float x, float y) { return powf(x, y); }
-static inline double ImPow(double x, double y) { return pow(x, y); }
-static inline float ImFmod(float x, float y) { return fmodf(x, y); }
-static inline double ImFmod(double x, double y) { return fmod(x, y); }
-static inline float ImCos(float x) { return cosf(x); }
-static inline float ImSin(float x) { return sinf(x); }
-static inline float ImAcos(float x) { return acosf(x); }
-static inline float ImAtan2(float y, float x) { return atan2f(y, x); }
-static inline double ImAtof(const char* s) { return atof(s); }
-static inline float ImFloorStd(float x) { return floorf(x); } // we already uses our own ImFloor() { return (float)(int)v } internally so the standard one wrapper is named differently (it's used by stb_truetype)
-static inline float ImCeil(float x) { return ceilf(x); }
+#ifndef IMGUI_DISABLE_DEFAULT_MATH_FUNCTIONS
+#define ImFabs(X) fabsf(X)
+#define ImSqrt(X) sqrtf(X)
+#define ImFmod(X, Y) fmodf((X), (Y))
+#define ImCos(X) cosf(X)
+#define ImSin(X) sinf(X)
+#define ImAcos(X) acosf(X)
+#define ImAtan2(Y, X) atan2f((Y), (X))
+#define ImAtof(STR) atof(STR)
+#define ImFloorStd(X) floorf(X) // We already uses our own ImFloor() { return (float)(int)v } internally so the standard one wrapper is named differently (it's used by e.g. stb_truetype)
+#define ImCeil(X) ceilf(X)
+static inline float ImPow(float x, float y) { return powf(x, y); } // DragBehaviorT/SliderBehaviorT uses ImPow with either float/double and need the precision
+static inline double ImPow(double x, double y) { return pow(x, y); }
#endif
-// - ImMin/ImMax/ImClamp/ImLerp/ImSwap are used by widgets which support for variety of types: signed/unsigned int/long long float/double, using templates here but we could also redefine them 6 times
+// - ImMin/ImMax/ImClamp/ImLerp/ImSwap are used by widgets which support variety of types: signed/unsigned int/long long float/double
+// (Exceptionally using templates here but we could also redefine them for those types)
template<typename T> static inline T ImMin(T lhs, T rhs) { return lhs < rhs ? lhs : rhs; }
template<typename T> static inline T ImMax(T lhs, T rhs) { return lhs >= rhs ? lhs : rhs; }
template<typename T> static inline T ImClamp(T v, T mn, T mx) { return (v < mn) ? mn : (v > mx) ? mx : v; }
template<typename T> static inline T ImLerp(T a, T b, float t) { return (T)(a + (b - a) * t); }
template<typename T> static inline void ImSwap(T& a, T& b) { T tmp = a; a = b; b = tmp; }
+template<typename T> static inline T ImAddClampOverflow(T a, T b, T mn, T mx) { if (b < 0 && (a < mn - b)) return mn; if (b > 0 && (a > mx - b)) return mx; return a + b; }
+template<typename T> static inline T ImSubClampOverflow(T a, T b, T mn, T mx) { if (b > 0 && (a < mn + b)) return mn; if (b < 0 && (a > mx + b)) return mx; return a - b; }
// - Misc maths helpers
static inline ImVec2 ImMin(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x < rhs.x ? lhs.x : rhs.x, lhs.y < rhs.y ? lhs.y : rhs.y); }
static inline ImVec2 ImMax(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x >= rhs.x ? lhs.x : rhs.x, lhs.y >= rhs.y ? lhs.y : rhs.y); }
@@ -205,42 +329,117 @@ static inline float ImSaturate(float f)
static inline float ImLengthSqr(const ImVec2& lhs) { return lhs.x*lhs.x + lhs.y*lhs.y; }
static inline float ImLengthSqr(const ImVec4& lhs) { return lhs.x*lhs.x + lhs.y*lhs.y + lhs.z*lhs.z + lhs.w*lhs.w; }
static inline float ImInvLength(const ImVec2& lhs, float fail_value) { float d = lhs.x*lhs.x + lhs.y*lhs.y; if (d > 0.0f) return 1.0f / ImSqrt(d); return fail_value; }
-static inline float ImFloor(float f) { return (float)(int)f; }
-static inline ImVec2 ImFloor(const ImVec2& v) { return ImVec2((float)(int)v.x, (float)(int)v.y); }
+static inline float ImFloor(float f) { return (float)(int)(f); }
+static inline ImVec2 ImFloor(const ImVec2& v) { return ImVec2((float)(int)(v.x), (float)(int)(v.y)); }
+static inline int ImModPositive(int a, int b) { return (a + b) % b; }
static inline float ImDot(const ImVec2& a, const ImVec2& b) { return a.x * b.x + a.y * b.y; }
static inline ImVec2 ImRotate(const ImVec2& v, float cos_a, float sin_a) { return ImVec2(v.x * cos_a - v.y * sin_a, v.x * sin_a + v.y * cos_a); }
static inline float ImLinearSweep(float current, float target, float speed) { if (current < target) return ImMin(current + speed, target); if (current > target) return ImMax(current - speed, target); return current; }
static inline ImVec2 ImMul(const ImVec2& lhs, const ImVec2& rhs) { return ImVec2(lhs.x * rhs.x, lhs.y * rhs.y); }
-//-----------------------------------------------------------------------------
-// Types
-//-----------------------------------------------------------------------------
+// Helpers: Geometry
+IMGUI_API ImVec2 ImBezierCalc(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, float t); // Cubic Bezier
+IMGUI_API ImVec2 ImBezierClosestPoint(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, int num_segments); // For curves with explicit number of segments
+IMGUI_API ImVec2 ImBezierClosestPointCasteljau(const ImVec2& p1, const ImVec2& p2, const ImVec2& p3, const ImVec2& p4, const ImVec2& p, float tess_tol);// For auto-tessellated curves you can use tess_tol = style.CurveTessellationTol
+IMGUI_API ImVec2 ImLineClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& p);
+IMGUI_API bool ImTriangleContainsPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
+IMGUI_API ImVec2 ImTriangleClosestPoint(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p);
+IMGUI_API void ImTriangleBarycentricCoords(const ImVec2& a, const ImVec2& b, const ImVec2& c, const ImVec2& p, float& out_u, float& out_v, float& out_w);
+inline float ImTriangleArea(const ImVec2& a, const ImVec2& b, const ImVec2& c) { return ImFabs((a.x * (b.y - c.y)) + (b.x * (c.y - a.y)) + (c.x * (a.y - b.y))) * 0.5f; }
+IMGUI_API ImGuiDir ImGetDirQuadrantFromDelta(float dx, float dy);
+
+// Helper: ImBoolVector
+// Store 1-bit per value. Note that Resize() currently clears the whole vector.
+struct IMGUI_API ImBoolVector
+{
+ ImVector<int> Storage;
+ ImBoolVector() { }
+ void Resize(int sz) { Storage.resize((sz + 31) >> 5); memset(Storage.Data, 0, (size_t)Storage.Size * sizeof(Storage.Data[0])); }
+ void Clear() { Storage.clear(); }
+ bool GetBit(int n) const { int off = (n >> 5); int mask = 1 << (n & 31); return (Storage[off] & mask) != 0; }
+ void SetBit(int n, bool v) { int off = (n >> 5); int mask = 1 << (n & 31); if (v) Storage[off] |= mask; else Storage[off] &= ~mask; }
+};
-// 1D vector (this odd construct is used to facilitate the transition between 1D and 2D and maintenance of some patches)
-struct ImVec1
+// Helper: ImPool<>
+// Basic keyed storage for contiguous instances, slow/amortized insertion, O(1) indexable, O(Log N) queries by ID over a dense/hot buffer,
+// Honor constructor/destructor. Add/remove invalidate all pointers. Indexes have the same lifetime as the associated object.
+typedef int ImPoolIdx;
+template<typename T>
+struct IMGUI_API ImPool
{
- float x;
- ImVec1() { x = 0.0f; }
- ImVec1(float _x) { x = _x; }
+ ImVector<T> Buf; // Contiguous data
+ ImGuiStorage Map; // ID->Index
+ ImPoolIdx FreeIdx; // Next free idx to use
+
+ ImPool() { FreeIdx = 0; }
+ ~ImPool() { Clear(); }
+ T* GetByKey(ImGuiID key) { int idx = Map.GetInt(key, -1); return (idx != -1) ? &Buf[idx] : NULL; }
+ T* GetByIndex(ImPoolIdx n) { return &Buf[n]; }
+ ImPoolIdx GetIndex(const T* p) const { IM_ASSERT(p >= Buf.Data && p < Buf.Data + Buf.Size); return (ImPoolIdx)(p - Buf.Data); }
+ T* GetOrAddByKey(ImGuiID key) { int* p_idx = Map.GetIntRef(key, -1); if (*p_idx != -1) return &Buf[*p_idx]; *p_idx = FreeIdx; return Add(); }
+ bool Contains(const T* p) const { return (p >= Buf.Data && p < Buf.Data + Buf.Size); }
+ void Clear() { for (int n = 0; n < Map.Data.Size; n++) { int idx = Map.Data[n].val_i; if (idx != -1) Buf[idx].~T(); } Map.Clear(); Buf.clear(); FreeIdx = 0; }
+ T* Add() { int idx = FreeIdx; if (idx == Buf.Size) { Buf.resize(Buf.Size + 1); FreeIdx++; } else { FreeIdx = *(int*)&Buf[idx]; } IM_PLACEMENT_NEW(&Buf[idx]) T(); return &Buf[idx]; }
+ void Remove(ImGuiID key, const T* p) { Remove(key, GetIndex(p)); }
+ void Remove(ImGuiID key, ImPoolIdx idx) { Buf[idx].~T(); *(int*)&Buf[idx] = FreeIdx; FreeIdx = idx; Map.SetInt(key, -1); }
+ void Reserve(int capacity) { Buf.reserve(capacity); Map.Data.reserve(capacity); }
+ int GetSize() const { return Buf.Size; }
+};
+
+// Helper: ImChunkStream<>
+// Build and iterate a contiguous stream of variable-sized structures.
+// This is used by Settings to store persistent data while reducing allocation count.
+// We store the chunk size first, and align the final size on 4 bytes boundaries (this what the '(X + 3) & ~3' statement is for)
+// The tedious/zealous amount of casting is to avoid -Wcast-align warnings.
+template<typename T>
+struct IMGUI_API ImChunkStream
+{
+ ImVector<char> Buf;
+
+ void clear() { Buf.clear(); }
+ bool empty() const { return Buf.Size == 0; }
+ int size() const { return Buf.Size; }
+ T* alloc_chunk(size_t sz) { size_t HDR_SZ = 4; sz = ((HDR_SZ + sz) + 3u) & ~3u; int off = Buf.Size; Buf.resize(off + (int)sz); ((int*)(void*)(Buf.Data + off))[0] = (int)sz; return (T*)(void*)(Buf.Data + off + (int)HDR_SZ); }
+ T* begin() { size_t HDR_SZ = 4; if (!Buf.Data) return NULL; return (T*)(void*)(Buf.Data + HDR_SZ); }
+ T* next_chunk(T* p) { size_t HDR_SZ = 4; IM_ASSERT(p >= begin() && p < end()); p = (T*)(void*)((char*)(void*)p + chunk_size(p)); if (p == (T*)(void*)((char*)end() + HDR_SZ)) return (T*)0; IM_ASSERT(p < end()); return p; }
+ int chunk_size(const T* p) { return ((const int*)p)[-1]; }
+ T* end() { return (T*)(void*)(Buf.Data + Buf.Size); }
+ int offset_from_ptr(const T* p) { IM_ASSERT(p >= begin() && p < end()); const ptrdiff_t off = (const char*)p - Buf.Data; return (int)off; }
+ T* ptr_from_offset(int off) { IM_ASSERT(off >= 4 && off < Buf.Size); return (T*)(void*)(Buf.Data + off); }
};
+//-----------------------------------------------------------------------------
+// Misc data structures
+//-----------------------------------------------------------------------------
+
enum ImGuiButtonFlags_
{
ImGuiButtonFlags_None = 0,
ImGuiButtonFlags_Repeat = 1 << 0, // hold to repeat
- ImGuiButtonFlags_PressedOnClickRelease = 1 << 1, // return true on click + release on same item [DEFAULT if no PressedOn* flag is set]
- ImGuiButtonFlags_PressedOnClick = 1 << 2, // return true on click (default requires click+release)
- ImGuiButtonFlags_PressedOnRelease = 1 << 3, // return true on release (default requires click+release)
- ImGuiButtonFlags_PressedOnDoubleClick = 1 << 4, // return true on double-click (default requires click+release)
- ImGuiButtonFlags_FlattenChildren = 1 << 5, // allow interactions even if a child window is overlapping
- ImGuiButtonFlags_AllowItemOverlap = 1 << 6, // require previous frame HoveredId to either match id or be null before being usable, use along with SetItemAllowOverlap()
- ImGuiButtonFlags_DontClosePopups = 1 << 7, // disable automatically closing parent popup on press // [UNUSED]
- ImGuiButtonFlags_Disabled = 1 << 8, // disable interactions
- ImGuiButtonFlags_AlignTextBaseLine = 1 << 9, // vertically align button to match text baseline - ButtonEx() only // FIXME: Should be removed and handled by SmallButton(), not possible currently because of DC.CursorPosPrevLine
- ImGuiButtonFlags_NoKeyModifiers = 1 << 10, // disable interaction if a key modifier is held
- ImGuiButtonFlags_NoHoldingActiveID = 1 << 11, // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only)
- ImGuiButtonFlags_PressedOnDragDropHold = 1 << 12, // press when held into while we are drag and dropping another item (used by e.g. tree nodes, collapsing headers)
- ImGuiButtonFlags_NoNavFocus = 1 << 13 // don't override navigation focus when activated
+ ImGuiButtonFlags_PressedOnClick = 1 << 1, // return true on click (mouse down event)
+ ImGuiButtonFlags_PressedOnClickRelease = 1 << 2, // [Default] return true on click + release on same item <-- this is what the majority of Button are using
+ ImGuiButtonFlags_PressedOnClickReleaseAnywhere = 1 << 3, // return true on click + release even if the release event is not done while hovering the item
+ ImGuiButtonFlags_PressedOnRelease = 1 << 4, // return true on release (default requires click+release)
+ ImGuiButtonFlags_PressedOnDoubleClick = 1 << 5, // return true on double-click (default requires click+release)
+ ImGuiButtonFlags_PressedOnDragDropHold = 1 << 6, // return true when held into while we are drag and dropping another item (used by e.g. tree nodes, collapsing headers)
+ ImGuiButtonFlags_FlattenChildren = 1 << 7, // allow interactions even if a child window is overlapping
+ ImGuiButtonFlags_AllowItemOverlap = 1 << 8, // require previous frame HoveredId to either match id or be null before being usable, use along with SetItemAllowOverlap()
+ ImGuiButtonFlags_DontClosePopups = 1 << 9, // disable automatically closing parent popup on press // [UNUSED]
+ ImGuiButtonFlags_Disabled = 1 << 10, // disable interactions
+ ImGuiButtonFlags_AlignTextBaseLine = 1 << 11, // vertically align button to match text baseline - ButtonEx() only // FIXME: Should be removed and handled by SmallButton(), not possible currently because of DC.CursorPosPrevLine
+ ImGuiButtonFlags_NoKeyModifiers = 1 << 12, // disable mouse interaction if a key modifier is held
+ ImGuiButtonFlags_NoHoldingActiveId = 1 << 13, // don't set ActiveId while holding the mouse (ImGuiButtonFlags_PressedOnClick only)
+ ImGuiButtonFlags_NoNavFocus = 1 << 14, // don't override navigation focus when activated
+ ImGuiButtonFlags_NoHoveredOnNav = 1 << 15, // don't report as hovered when navigated on
+ ImGuiButtonFlags_MouseButtonLeft = 1 << 16, // [Default] react on left mouse button
+ ImGuiButtonFlags_MouseButtonRight = 1 << 17, // react on right mouse button
+ ImGuiButtonFlags_MouseButtonMiddle = 1 << 18, // react on center mouse button
+
+ ImGuiButtonFlags_MouseButtonMask_ = ImGuiButtonFlags_MouseButtonLeft | ImGuiButtonFlags_MouseButtonRight | ImGuiButtonFlags_MouseButtonMiddle,
+ ImGuiButtonFlags_MouseButtonShift_ = 16,
+ ImGuiButtonFlags_MouseButtonDefault_ = ImGuiButtonFlags_MouseButtonLeft,
+ ImGuiButtonFlags_PressedOnMask_ = ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClickReleaseAnywhere | ImGuiButtonFlags_PressedOnRelease | ImGuiButtonFlags_PressedOnDoubleClick | ImGuiButtonFlags_PressedOnDragDropHold,
+ ImGuiButtonFlags_PressedOnDefault_ = ImGuiButtonFlags_PressedOnClickRelease
};
enum ImGuiSliderFlags_
@@ -249,6 +448,12 @@ enum ImGuiSliderFlags_
ImGuiSliderFlags_Vertical = 1 << 0
};
+enum ImGuiDragFlags_
+{
+ ImGuiDragFlags_None = 0,
+ ImGuiDragFlags_Vertical = 1 << 0
+};
+
enum ImGuiColumnsFlags_
{
// Default: 0
@@ -260,20 +465,45 @@ enum ImGuiColumnsFlags_
ImGuiColumnsFlags_GrowParentContentsSize= 1 << 4 // (WIP) Restore pre-1.51 behavior of extending the parent window contents size but _without affecting the columns width at all_. Will eventually remove.
};
+// Extend ImGuiSelectableFlags_
enum ImGuiSelectableFlagsPrivate_
{
// NB: need to be in sync with last value of ImGuiSelectableFlags_
- ImGuiSelectableFlags_NoHoldingActiveID = 1 << 10,
- ImGuiSelectableFlags_PressedOnClick = 1 << 11,
- ImGuiSelectableFlags_PressedOnRelease = 1 << 12,
- ImGuiSelectableFlags_DrawFillAvailWidth = 1 << 13
+ ImGuiSelectableFlags_NoHoldingActiveID = 1 << 20,
+ ImGuiSelectableFlags_PressedOnClick = 1 << 21,
+ ImGuiSelectableFlags_PressedOnRelease = 1 << 22,
+ ImGuiSelectableFlags_DrawFillAvailWidth = 1 << 23, // FIXME: We may be able to remove this (added in 6251d379 for menus)
+ ImGuiSelectableFlags_DrawHoveredWhenHeld= 1 << 24, // Always show active when held, even is not hovered. This concept could probably be renamed/formalized somehow.
+ ImGuiSelectableFlags_SetNavIdOnHover = 1 << 25
+};
+
+// Extend ImGuiTreeNodeFlags_
+enum ImGuiTreeNodeFlagsPrivate_
+{
+ ImGuiTreeNodeFlags_ClipLabelForTrailingButton = 1 << 20
};
enum ImGuiSeparatorFlags_
{
ImGuiSeparatorFlags_None = 0,
ImGuiSeparatorFlags_Horizontal = 1 << 0, // Axis default to current layout type, so generally Horizontal unless e.g. in a menu bar
- ImGuiSeparatorFlags_Vertical = 1 << 1
+ ImGuiSeparatorFlags_Vertical = 1 << 1,
+ ImGuiSeparatorFlags_SpanAllColumns = 1 << 2
+};
+
+// Transient per-window flags, reset at the beginning of the frame. For child window, inherited from parent on first Begin().
+// This is going to be exposed in imgui.h when stabilized enough.
+enum ImGuiItemFlags_
+{
+ ImGuiItemFlags_None = 0,
+ ImGuiItemFlags_NoTabStop = 1 << 0, // false
+ ImGuiItemFlags_ButtonRepeat = 1 << 1, // false // Button() will return true multiple times based on io.KeyRepeatDelay and io.KeyRepeatRate settings.
+ ImGuiItemFlags_Disabled = 1 << 2, // false // [BETA] Disable interactions but doesn't affect visuals yet. See github.com/ocornut/imgui/issues/211
+ ImGuiItemFlags_NoNav = 1 << 3, // false
+ ImGuiItemFlags_NoNavDefaultFocus = 1 << 4, // false
+ ImGuiItemFlags_SelectableDontClosePopup = 1 << 5, // false // MenuItem/Selectable() automatically closes current Popup window
+ ImGuiItemFlags_MixedValue = 1 << 6, // false // [BETA] Represent a mixed/indeterminate value, generally multi-selection where values differ. Currently only supported by Checkbox() (later should support all sorts of widgets)
+ ImGuiItemFlags_Default_ = 0
};
// Storage for LastItem data
@@ -282,16 +512,51 @@ enum ImGuiItemStatusFlags_
ImGuiItemStatusFlags_None = 0,
ImGuiItemStatusFlags_HoveredRect = 1 << 0,
ImGuiItemStatusFlags_HasDisplayRect = 1 << 1,
- ImGuiItemStatusFlags_Edited = 1 << 2 // Value exposed by item was edited in the current frame (should match the bool return value of most widgets)
+ ImGuiItemStatusFlags_Edited = 1 << 2, // Value exposed by item was edited in the current frame (should match the bool return value of most widgets)
+ ImGuiItemStatusFlags_ToggledSelection = 1 << 3, // Set when Selectable(), TreeNode() reports toggling a selection. We can't report "Selected" because reporting the change allows us to handle clipping with less issues.
+ ImGuiItemStatusFlags_ToggledOpen = 1 << 4, // Set when TreeNode() reports toggling their open state.
+ ImGuiItemStatusFlags_HasDeactivated = 1 << 5, // Set if the widget/group is able to provide data for the ImGuiItemStatusFlags_Deactivated flag.
+ ImGuiItemStatusFlags_Deactivated = 1 << 6 // Only valid if ImGuiItemStatusFlags_HasDeactivated is set.
+
+#ifdef IMGUI_ENABLE_TEST_ENGINE
+ , // [imgui_tests only]
+ ImGuiItemStatusFlags_Openable = 1 << 10, //
+ ImGuiItemStatusFlags_Opened = 1 << 11, //
+ ImGuiItemStatusFlags_Checkable = 1 << 12, //
+ ImGuiItemStatusFlags_Checked = 1 << 13 //
+#endif
+};
+
+enum ImGuiTextFlags_
+{
+ ImGuiTextFlags_None = 0,
+ ImGuiTextFlags_NoWidthForLargeClippedText = 1 << 0
+};
+
+enum ImGuiTooltipFlags_
+{
+ ImGuiTooltipFlags_None = 0,
+ ImGuiTooltipFlags_OverridePreviousTooltip = 1 << 0 // Override will clear/ignore previously submitted tooltip (defaults to append)
};
// FIXME: this is in development, not exposed/functional as a generic feature yet.
+// Horizontal/Vertical enums are fixed to 0/1 so they may be used to index ImVec2
enum ImGuiLayoutType_
{
- ImGuiLayoutType_Vertical,
- ImGuiLayoutType_Horizontal
+ ImGuiLayoutType_Horizontal = 0,
+ ImGuiLayoutType_Vertical = 1
};
+enum ImGuiLogType
+{
+ ImGuiLogType_None = 0,
+ ImGuiLogType_TTY,
+ ImGuiLogType_File,
+ ImGuiLogType_Buffer,
+ ImGuiLogType_Clipboard
+};
+
+// X/Y enums are fixed to 0/1 so they may be used to index ImVec2
enum ImGuiAxis
{
ImGuiAxis_None = -1,
@@ -331,7 +596,7 @@ enum ImGuiNavHighlightFlags_
ImGuiNavHighlightFlags_None = 0,
ImGuiNavHighlightFlags_TypeDefault = 1 << 0,
ImGuiNavHighlightFlags_TypeThin = 1 << 1,
- ImGuiNavHighlightFlags_AlwaysDraw = 1 << 2,
+ ImGuiNavHighlightFlags_AlwaysDraw = 1 << 2, // Draw rectangular highlight if (g.NavId == id) _even_ when using the mouse.
ImGuiNavHighlightFlags_NoRounding = 1 << 3
};
@@ -351,7 +616,8 @@ enum ImGuiNavMoveFlags_
ImGuiNavMoveFlags_WrapX = 1 << 2, // On failed request, request from opposite side one line down (when NavDir==right) or one line up (when NavDir==left)
ImGuiNavMoveFlags_WrapY = 1 << 3, // This is not super useful for provided for completeness
ImGuiNavMoveFlags_AllowCurrentNavId = 1 << 4, // Allow scoring and considering the current NavId as a move target candidate. This is used when the move source is offset (e.g. pressing PageDown actually needs to send a Up move request, if we are pressing PageDown from the bottom-most item we need to stay in place)
- ImGuiNavMoveFlags_AlsoScoreVisibleSet = 1 << 5 // Store alternate result in NavMoveResultLocalVisibleSet that only comprise elements that are already fully visible.
+ ImGuiNavMoveFlags_AlsoScoreVisibleSet = 1 << 5, // Store alternate result in NavMoveResultLocalVisibleSet that only comprise elements that are already fully visible.
+ ImGuiNavMoveFlags_ScrollToEdge = 1 << 6
};
enum ImGuiNavForward
@@ -361,12 +627,36 @@ enum ImGuiNavForward
ImGuiNavForward_ForwardActive
};
+enum ImGuiNavLayer
+{
+ ImGuiNavLayer_Main = 0, // Main scrolling layer
+ ImGuiNavLayer_Menu = 1, // Menu layer (access with Alt/ImGuiNavInput_Menu)
+ ImGuiNavLayer_COUNT
+};
+
enum ImGuiPopupPositionPolicy
{
ImGuiPopupPositionPolicy_Default,
ImGuiPopupPositionPolicy_ComboBox
};
+// 1D vector (this odd construct is used to facilitate the transition between 1D and 2D, and the maintenance of some branches/patches)
+struct ImVec1
+{
+ float x;
+ ImVec1() { x = 0.0f; }
+ ImVec1(float _x) { x = _x; }
+};
+
+// 2D vector (half-size integer)
+struct ImVec2ih
+{
+ short x, y;
+ ImVec2ih() { x = y = 0; }
+ ImVec2ih(short _x, short _y) { x = _x; y = _y; }
+ explicit ImVec2ih(const ImVec2& rhs) { x = (short)rhs.x; y = (short)rhs.y; }
+};
+
// 2D axis aligned bounding-box
// NB: we can't rely on ImVec2 math operators being available here
struct IMGUI_API ImRect
@@ -374,7 +664,7 @@ struct IMGUI_API ImRect
ImVec2 Min; // Upper-left
ImVec2 Max; // Lower-right
- ImRect() : Min(FLT_MAX,FLT_MAX), Max(-FLT_MAX,-FLT_MAX) {}
+ ImRect() : Min(0.0f, 0.0f), Max(0.0f, 0.0f) {}
ImRect(const ImVec2& min, const ImVec2& max) : Min(min), Max(max) {}
ImRect(const ImVec4& v) : Min(v.x, v.y), Max(v.z, v.w) {}
ImRect(float x1, float y1, float x2, float y2) : Min(x1, y1), Max(x2, y2) {}
@@ -399,10 +689,18 @@ struct IMGUI_API ImRect
void TranslateY(float dy) { Min.y += dy; Max.y += dy; }
void ClipWith(const ImRect& r) { Min = ImMax(Min, r.Min); Max = ImMin(Max, r.Max); } // Simple version, may lead to an inverted rectangle, which is fine for Contains/Overlaps test but not for display.
void ClipWithFull(const ImRect& r) { Min = ImClamp(Min, r.Min, r.Max); Max = ImClamp(Max, r.Min, r.Max); } // Full version, ensure both points are fully clipped.
- void Floor() { Min.x = (float)(int)Min.x; Min.y = (float)(int)Min.y; Max.x = (float)(int)Max.x; Max.y = (float)(int)Max.y; }
+ void Floor() { Min.x = IM_FLOOR(Min.x); Min.y = IM_FLOOR(Min.y); Max.x = IM_FLOOR(Max.x); Max.y = IM_FLOOR(Max.y); }
bool IsInverted() const { return Min.x > Max.x || Min.y > Max.y; }
};
+// Type information associated to one ImGuiDataType. Retrieve with DataTypeGetInfo().
+struct ImGuiDataTypeInfo
+{
+ size_t Size; // Size in byte
+ const char* PrintFmt; // Default printf format for the type
+ const char* ScanFmt; // Default scanf format for the type
+};
+
// Stacked color modifier, backup of modified data so we can restore it
struct ImGuiColorMod
{
@@ -427,73 +725,78 @@ struct ImGuiGroupData
ImVec2 BackupCursorMaxPos;
ImVec1 BackupIndent;
ImVec1 BackupGroupOffset;
- ImVec2 BackupCurrentLineSize;
- float BackupCurrentLineTextBaseOffset;
- float BackupLogLinePosY;
+ ImVec2 BackupCurrLineSize;
+ float BackupCurrLineTextBaseOffset;
ImGuiID BackupActiveIdIsAlive;
bool BackupActiveIdPreviousFrameIsAlive;
- bool AdvanceCursor;
+ bool EmitItem;
};
// Simple column measurement, currently used for MenuItem() only.. This is very short-sighted/throw-away code and NOT a generic helper.
struct IMGUI_API ImGuiMenuColumns
{
- int Count;
float Spacing;
float Width, NextWidth;
- float Pos[4], NextWidths[4];
+ float Pos[3], NextWidths[3];
ImGuiMenuColumns();
void Update(int count, float spacing, bool clear);
float DeclColumns(float w0, float w1, float w2);
- float CalcExtraSpace(float avail_w);
+ float CalcExtraSpace(float avail_w) const;
};
// Internal state of the currently focused/edited text input box
struct IMGUI_API ImGuiInputTextState
{
ImGuiID ID; // widget id owning the text state
+ int CurLenW, CurLenA; // we need to maintain our buffer length in both UTF-8 and wchar format. UTF-8 len is valid even if TextA is not.
ImVector<ImWchar> TextW; // edit buffer, we need to persist but can't guarantee the persistence of the user-provided buffer. so we copy into own buffer.
- ImVector<char> InitialText; // backup of end-user buffer at the time of focus (in UTF-8, unaltered)
- ImVector<char> TempBuffer; // temporary buffer for callback and other other operations. size=capacity.
- int CurLenA, CurLenW; // we need to maintain our buffer length in both UTF-8 and wchar format.
+ ImVector<char> TextA; // temporary UTF8 buffer for callbacks and other operations. this is not updated in every code-path! size=capacity.
+ ImVector<char> InitialTextA; // backup of end-user buffer at the time of focus (in UTF-8, unaltered)
+ bool TextAIsValid; // temporary UTF8 buffer is not initially valid before we make the widget active (until then we pull the data from user argument)
int BufCapacityA; // end-user buffer capacity
- float ScrollX;
- ImGuiStb::STB_TexteditState StbState;
- float CursorAnim;
- bool CursorFollow;
- bool SelectedAllMouseLock;
-
- // Temporarily set when active
- ImGuiInputTextFlags UserFlags;
- ImGuiInputTextCallback UserCallback;
- void* UserCallbackData;
-
- ImGuiInputTextState() { memset(this, 0, sizeof(*this)); }
- void CursorAnimReset() { CursorAnim = -0.30f; } // After a user-input the cursor stays on for a while without blinking
- void CursorClamp() { StbState.cursor = ImMin(StbState.cursor, CurLenW); StbState.select_start = ImMin(StbState.select_start, CurLenW); StbState.select_end = ImMin(StbState.select_end, CurLenW); }
- bool HasSelection() const { return StbState.select_start != StbState.select_end; }
- void ClearSelection() { StbState.select_start = StbState.select_end = StbState.cursor; }
- void SelectAll() { StbState.select_start = 0; StbState.cursor = StbState.select_end = CurLenW; StbState.has_preferred_x = false; }
- void OnKeyPressed(int key); // Cannot be inline because we call in code in stb_textedit.h implementation
+ float ScrollX; // horizontal scrolling/offset
+ ImStb::STB_TexteditState Stb; // state for stb_textedit.h
+ float CursorAnim; // timer for cursor blink, reset on every user action so the cursor reappears immediately
+ bool CursorFollow; // set when we want scrolling to follow the current cursor position (not always!)
+ bool SelectedAllMouseLock; // after a double-click to select all, we ignore further mouse drags to update selection
+ ImGuiInputTextFlags UserFlags; // Temporarily set while we call user's callback
+ ImGuiInputTextCallback UserCallback; // "
+ void* UserCallbackData; // "
+
+ ImGuiInputTextState() { memset(this, 0, sizeof(*this)); }
+ void ClearText() { CurLenW = CurLenA = 0; TextW[0] = 0; TextA[0] = 0; CursorClamp(); }
+ void ClearFreeMemory() { TextW.clear(); TextA.clear(); InitialTextA.clear(); }
+ int GetUndoAvailCount() const { return Stb.undostate.undo_point; }
+ int GetRedoAvailCount() const { return STB_TEXTEDIT_UNDOSTATECOUNT - Stb.undostate.redo_point; }
+ void OnKeyPressed(int key); // Cannot be inline because we call in code in stb_textedit.h implementation
+
+ // Cursor & Selection
+ void CursorAnimReset() { CursorAnim = -0.30f; } // After a user-input the cursor stays on for a while without blinking
+ void CursorClamp() { Stb.cursor = ImMin(Stb.cursor, CurLenW); Stb.select_start = ImMin(Stb.select_start, CurLenW); Stb.select_end = ImMin(Stb.select_end, CurLenW); }
+ bool HasSelection() const { return Stb.select_start != Stb.select_end; }
+ void ClearSelection() { Stb.select_start = Stb.select_end = Stb.cursor; }
+ void SelectAll() { Stb.select_start = 0; Stb.cursor = Stb.select_end = CurLenW; Stb.has_preferred_x = 0; }
};
// Windows data saved in imgui.ini file
+// Because we never destroy or rename ImGuiWindowSettings, we can store the names in a separate buffer easily.
+// (this is designed to be stored in a ImChunkStream buffer, with the variable-length Name following our structure)
struct ImGuiWindowSettings
{
- char* Name;
ImGuiID ID;
- ImVec2 Pos;
- ImVec2 Size;
+ ImVec2ih Pos;
+ ImVec2ih Size;
bool Collapsed;
- ImGuiWindowSettings() { Name = NULL; ID = 0; Pos = Size = ImVec2(0,0); Collapsed = false; }
+ ImGuiWindowSettings() { ID = 0; Pos = Size = ImVec2ih(0, 0); Collapsed = false; }
+ char* GetName() { return (char*)(this + 1); }
};
struct ImGuiSettingsHandler
{
- const char* TypeName; // Short description stored in .ini file. Disallowed characters: '[' ']'
- ImGuiID TypeHash; // == ImHash(TypeName, 0, 0)
+ const char* TypeName; // Short description stored in .ini file. Disallowed characters: '[' ']'
+ ImGuiID TypeHash; // == ImHashStr(TypeName)
void* (*ReadOpenFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, const char* name); // Read: Called when entering into a new ini entry e.g. "[Window][Name]"
void (*ReadLineFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, void* entry, const char* line); // Read: Called for every line of text within an ini entry
void (*WriteAllFn)(ImGuiContext* ctx, ImGuiSettingsHandler* handler, ImGuiTextBuffer* out_buf); // Write: Output every entries into 'out_buf'
@@ -503,15 +806,17 @@ struct ImGuiSettingsHandler
};
// Storage for current popup stack
-struct ImGuiPopupRef
+struct ImGuiPopupData
{
ImGuiID PopupId; // Set on OpenPopup()
ImGuiWindow* Window; // Resolved on BeginPopup() - may stay unresolved if user never calls OpenPopup()
- ImGuiWindow* ParentWindow; // Set on OpenPopup()
+ ImGuiWindow* SourceWindow; // Set on OpenPopup() copy of NavWindow at the time of opening the popup
int OpenFrameCount; // Set on OpenPopup()
- ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differenciate multiple menu sets from each others (e.g. inside menu bar vs loose menu items)
+ ImGuiID OpenParentId; // Set on OpenPopup(), we need this to differentiate multiple menu sets from each others (e.g. inside menu bar vs loose menu items)
ImVec2 OpenPopupPos; // Set on OpenPopup(), preferred popup position (typically == OpenMousePos when using mouse)
ImVec2 OpenMousePos; // Set on OpenPopup(), copy of mouse position at the time of opening popup
+
+ ImGuiPopupData() { PopupId = 0; Window = SourceWindow = NULL; OpenFrameCount = -1; OpenParentId = 0; }
};
struct ImGuiColumnData
@@ -521,10 +826,10 @@ struct ImGuiColumnData
ImGuiColumnsFlags Flags; // Not exposed
ImRect ClipRect;
- ImGuiColumnData() { OffsetNorm = OffsetNormBeforeResize = 0.0f; Flags = 0; }
+ ImGuiColumnData() { OffsetNorm = OffsetNormBeforeResize = 0.0f; Flags = ImGuiColumnsFlags_None; }
};
-struct ImGuiColumnsSet
+struct ImGuiColumns
{
ImGuiID ID;
ImGuiColumnsFlags Flags;
@@ -532,43 +837,55 @@ struct ImGuiColumnsSet
bool IsBeingResized;
int Current;
int Count;
- float MinX, MaxX;
+ float OffMinX, OffMaxX; // Offsets from HostWorkRect.Min.x
float LineMinY, LineMaxY;
- float StartPosY; // Copy of CursorPos
- float StartMaxPosX; // Copy of CursorMaxPos
+ float HostCursorPosY; // Backup of CursorPos at the time of BeginColumns()
+ float HostCursorMaxPosX; // Backup of CursorMaxPos at the time of BeginColumns()
+ ImRect HostClipRect; // Backup of ClipRect at the time of BeginColumns()
+ ImRect HostWorkRect; // Backup of WorkRect at the time of BeginColumns()
ImVector<ImGuiColumnData> Columns;
+ ImDrawListSplitter Splitter;
- ImGuiColumnsSet() { Clear(); }
+ ImGuiColumns() { Clear(); }
void Clear()
{
ID = 0;
- Flags = 0;
+ Flags = ImGuiColumnsFlags_None;
IsFirstFrame = false;
IsBeingResized = false;
Current = 0;
Count = 1;
- MinX = MaxX = 0.0f;
+ OffMinX = OffMaxX = 0.0f;
LineMinY = LineMaxY = 0.0f;
- StartPosY = 0.0f;
- StartMaxPosX = 0.0f;
+ HostCursorPosY = 0.0f;
+ HostCursorMaxPosX = 0.0f;
Columns.clear();
}
};
+// Helper function to calculate a circle's segment count given its radius and a "maximum error" value.
+#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN 12
+#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX 512
+#define IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_CALC(_RAD,_MAXERROR) ImClamp((int)((IM_PI * 2.0f) / ImAcos((_RAD - _MAXERROR) / _RAD)), IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MIN, IM_DRAWLIST_CIRCLE_AUTO_SEGMENT_MAX)
+
// Data shared between all ImDrawList instances
+// You may want to create your own instance of this if you want to use ImDrawList completely without ImGui. In that case, watch out for future changes to this structure.
struct IMGUI_API ImDrawListSharedData
{
ImVec2 TexUvWhitePixel; // UV of white pixel in the atlas
ImFont* Font; // Current/default font (optional, for simplified AddText overload)
float FontSize; // Current/default font size (optional, for simplified AddText overload)
- float CurveTessellationTol;
+ float CurveTessellationTol; // Tessellation tolerance when using PathBezierCurveTo()
+ float CircleSegmentMaxError; // Number of circle segments to use per pixel of radius for AddCircle() etc
ImVec4 ClipRectFullscreen; // Value for PushClipRectFullscreen()
+ ImDrawListFlags InitialFlags; // Initial flags at the beginning of the frame (it is possible to alter flags on a per-drawlist basis afterwards)
- // Const data
- // FIXME: Bake rounded corners fill/borders in atlas
- ImVec2 CircleVtx12[12];
+ // [Internal] Lookup tables
+ ImVec2 CircleVtx12[12]; // FIXME: Bake rounded corners fill/borders in atlas
+ ImU8 CircleSegmentCounts[64]; // Precomputed segment count for given radius (array index + 1) before we calculate it dynamically (to avoid calculation overhead)
ImDrawListSharedData();
+ void SetCircleSegmentMaxError(float max_error);
};
struct ImDrawDataBuilder
@@ -582,134 +899,182 @@ struct ImDrawDataBuilder
struct ImGuiNavMoveResult
{
- ImGuiID ID; // Best candidate
- ImGuiWindow* Window; // Best candidate window
- float DistBox; // Best candidate box distance to current NavId
- float DistCenter; // Best candidate center distance to current NavId
- float DistAxial;
- ImRect RectRel; // Best candidate bounding box in window relative space
+ ImGuiWindow* Window; // Best candidate window
+ ImGuiID ID; // Best candidate ID
+ ImGuiID FocusScopeId; // Best candidate focus scope ID
+ float DistBox; // Best candidate box distance to current NavId
+ float DistCenter; // Best candidate center distance to current NavId
+ float DistAxial;
+ ImRect RectRel; // Best candidate bounding box in window relative space
ImGuiNavMoveResult() { Clear(); }
- void Clear() { ID = 0; Window = NULL; DistBox = DistCenter = DistAxial = FLT_MAX; RectRel = ImRect(); }
+ void Clear() { Window = NULL; ID = FocusScopeId = 0; DistBox = DistCenter = DistAxial = FLT_MAX; RectRel = ImRect(); }
+};
+
+enum ImGuiNextWindowDataFlags_
+{
+ ImGuiNextWindowDataFlags_None = 0,
+ ImGuiNextWindowDataFlags_HasPos = 1 << 0,
+ ImGuiNextWindowDataFlags_HasSize = 1 << 1,
+ ImGuiNextWindowDataFlags_HasContentSize = 1 << 2,
+ ImGuiNextWindowDataFlags_HasCollapsed = 1 << 3,
+ ImGuiNextWindowDataFlags_HasSizeConstraint = 1 << 4,
+ ImGuiNextWindowDataFlags_HasFocus = 1 << 5,
+ ImGuiNextWindowDataFlags_HasBgAlpha = 1 << 6
};
// Storage for SetNexWindow** functions
struct ImGuiNextWindowData
{
- ImGuiCond PosCond;
- ImGuiCond SizeCond;
- ImGuiCond ContentSizeCond;
- ImGuiCond CollapsedCond;
- ImGuiCond SizeConstraintCond;
- ImGuiCond FocusCond;
- ImGuiCond BgAlphaCond;
- ImVec2 PosVal;
- ImVec2 PosPivotVal;
- ImVec2 SizeVal;
- ImVec2 ContentSizeVal;
- bool CollapsedVal;
- ImRect SizeConstraintRect;
- ImGuiSizeCallback SizeCallback;
- void* SizeCallbackUserData;
- float BgAlphaVal;
- ImVec2 MenuBarOffsetMinVal; // This is not exposed publicly, so we don't clear it.
-
- ImGuiNextWindowData()
- {
- PosCond = SizeCond = ContentSizeCond = CollapsedCond = SizeConstraintCond = FocusCond = BgAlphaCond = 0;
- PosVal = PosPivotVal = SizeVal = ImVec2(0.0f, 0.0f);
- ContentSizeVal = ImVec2(0.0f, 0.0f);
- CollapsedVal = false;
- SizeConstraintRect = ImRect();
- SizeCallback = NULL;
- SizeCallbackUserData = NULL;
- BgAlphaVal = FLT_MAX;
- MenuBarOffsetMinVal = ImVec2(0.0f, 0.0f);
- }
+ ImGuiNextWindowDataFlags Flags;
+ ImGuiCond PosCond;
+ ImGuiCond SizeCond;
+ ImGuiCond CollapsedCond;
+ ImVec2 PosVal;
+ ImVec2 PosPivotVal;
+ ImVec2 SizeVal;
+ ImVec2 ContentSizeVal;
+ bool CollapsedVal;
+ ImRect SizeConstraintRect;
+ ImGuiSizeCallback SizeCallback;
+ void* SizeCallbackUserData;
+ float BgAlphaVal; // Override background alpha
+ ImVec2 MenuBarOffsetMinVal; // *Always on* This is not exposed publicly, so we don't clear it.
+
+ ImGuiNextWindowData() { memset(this, 0, sizeof(*this)); }
+ inline void ClearFlags() { Flags = ImGuiNextWindowDataFlags_None; }
+};
- void Clear()
- {
- PosCond = SizeCond = ContentSizeCond = CollapsedCond = SizeConstraintCond = FocusCond = BgAlphaCond = 0;
- }
+enum ImGuiNextItemDataFlags_
+{
+ ImGuiNextItemDataFlags_None = 0,
+ ImGuiNextItemDataFlags_HasWidth = 1 << 0,
+ ImGuiNextItemDataFlags_HasOpen = 1 << 1
};
-// Main imgui context
+struct ImGuiNextItemData
+{
+ ImGuiNextItemDataFlags Flags;
+ float Width; // Set by SetNextItemWidth()
+ ImGuiID FocusScopeId; // Set by SetNextItemMultiSelectData() (!= 0 signify value has been set, so it's an alternate version of HasSelectionData, we don't use Flags for this because they are cleared too early. This is mostly used for debugging)
+ ImGuiCond OpenCond;
+ bool OpenVal; // Set by SetNextItemOpen()
+
+ ImGuiNextItemData() { memset(this, 0, sizeof(*this)); }
+ inline void ClearFlags() { Flags = ImGuiNextItemDataFlags_None; } // Also cleared manually by ItemAdd()!
+};
+
+//-----------------------------------------------------------------------------
+// Tabs
+//-----------------------------------------------------------------------------
+
+struct ImGuiShrinkWidthItem
+{
+ int Index;
+ float Width;
+};
+
+struct ImGuiPtrOrIndex
+{
+ void* Ptr; // Either field can be set, not both. e.g. Dock node tab bars are loose while BeginTabBar() ones are in a pool.
+ int Index; // Usually index in a main pool.
+
+ ImGuiPtrOrIndex(void* ptr) { Ptr = ptr; Index = -1; }
+ ImGuiPtrOrIndex(int index) { Ptr = NULL; Index = index; }
+};
+
+//-----------------------------------------------------------------------------
+// Main Dear ImGui context
+//-----------------------------------------------------------------------------
+
struct ImGuiContext
{
bool Initialized;
- bool FrameScopeActive; // Set by NewFrame(), cleared by EndFrame()/Render()
- bool FontAtlasOwnedByContext; // Io.Fonts-> is owned by the ImGuiContext and will be destructed along with it.
+ bool FontAtlasOwnedByContext; // IO.Fonts-> is owned by the ImGuiContext and will be destructed along with it.
ImGuiIO IO;
ImGuiStyle Style;
ImFont* Font; // (Shortcut) == FontStack.empty() ? IO.Font : FontStack.back()
float FontSize; // (Shortcut) == FontBaseSize * g.CurrentWindow->FontWindowScale == window->FontSize(). Text height for current window.
float FontBaseSize; // (Shortcut) == IO.FontGlobalScale * Font->Scale * Font->FontSize. Base text height.
ImDrawListSharedData DrawListSharedData;
-
double Time;
int FrameCount;
int FrameCountEnded;
int FrameCountRendered;
+ bool WithinFrameScope; // Set by NewFrame(), cleared by EndFrame()
+ bool WithinFrameScopeWithImplicitWindow; // Set by NewFrame(), cleared by EndFrame() when the implicit debug window has been pushed
+ bool WithinEndChild; // Set within EndChild()
+
+ // Windows state
ImVector<ImGuiWindow*> Windows; // Windows, sorted in display order, back to front
- ImVector<ImGuiWindow*> WindowsFocusOrder; // Windows, sorted in focus order, back to front
- ImVector<ImGuiWindow*> WindowsSortBuffer;
+ ImVector<ImGuiWindow*> WindowsFocusOrder; // Windows, sorted in focus order, back to front. (FIXME: We could only store root windows here! Need to sort out the Docking equivalent which is RootWindowDockStop and is unfortunately a little more dynamic)
+ ImVector<ImGuiWindow*> WindowsTempSortBuffer; // Temporary buffer used in EndFrame() to reorder windows so parents are kept before their child
ImVector<ImGuiWindow*> CurrentWindowStack;
- ImGuiStorage WindowsById;
- int WindowsActiveCount;
- ImGuiWindow* CurrentWindow; // Being drawn into
+ ImGuiStorage WindowsById; // Map window's ImGuiID to ImGuiWindow*
+ int WindowsActiveCount; // Number of unique windows submitted by frame
+ ImGuiWindow* CurrentWindow; // Window being drawn into
ImGuiWindow* HoveredWindow; // Will catch mouse inputs
ImGuiWindow* HoveredRootWindow; // Will catch mouse inputs (for focus/move only)
+ ImGuiWindow* MovingWindow; // Track the window we clicked on (in order to preserve focus). The actually window that is moved is generally MovingWindow->RootWindow.
+ ImGuiWindow* WheelingWindow; // Track the window we started mouse-wheeling on. Until a timer elapse or mouse has moved, generally keep scrolling the same window even if during the course of scrolling the mouse ends up hovering a child window.
+ ImVec2 WheelingWindowRefMousePos;
+ float WheelingWindowTimer;
+
+ // Item/widgets state and tracking information
ImGuiID HoveredId; // Hovered widget
bool HoveredIdAllowOverlap;
ImGuiID HoveredIdPreviousFrame;
float HoveredIdTimer; // Measure contiguous hovering time
float HoveredIdNotActiveTimer; // Measure contiguous hovering time where the item has not been active
ImGuiID ActiveId; // Active widget
- ImGuiID ActiveIdPreviousFrame;
ImGuiID ActiveIdIsAlive; // Active widget has been seen this frame (we can't use a bool as the ActiveId may change within the frame)
float ActiveIdTimer;
bool ActiveIdIsJustActivated; // Set at the time of activation for one frame
bool ActiveIdAllowOverlap; // Active widget allows another widget to steal active id (generally for overlapping widgets, but not always)
- bool ActiveIdHasBeenEdited; // Was the value associated to the widget Edited over the course of the Active state.
- bool ActiveIdPreviousFrameIsAlive;
- bool ActiveIdPreviousFrameHasBeenEdited;
- int ActiveIdAllowNavDirFlags; // Active widget allows using directional navigation (e.g. can activate a button and move away from it)
+ bool ActiveIdHasBeenPressedBefore; // Track whether the active id led to a press (this is to allow changing between PressOnClick and PressOnRelease without pressing twice). Used by range_select branch.
+ bool ActiveIdHasBeenEditedBefore; // Was the value associated to the widget Edited over the course of the Active state.
+ bool ActiveIdHasBeenEditedThisFrame;
+ ImU32 ActiveIdUsingNavDirMask; // Active widget will want to read those directional navigation requests (e.g. can activate a button and move away from it)
+ ImU32 ActiveIdUsingNavInputMask; // Active widget will want to read those nav inputs.
+ ImU64 ActiveIdUsingKeyInputMask; // Active widget will want to read those key inputs. When we grow the ImGuiKey enum we'll need to either to order the enum to make useful keys come first, either redesign this into e.g. a small array.
ImVec2 ActiveIdClickOffset; // Clicked offset from upper-left corner, if applicable (currently only set by ButtonBehavior)
ImGuiWindow* ActiveIdWindow;
- ImGuiWindow* ActiveIdPreviousFrameWindow;
ImGuiInputSource ActiveIdSource; // Activating with mouse or nav (gamepad/keyboard)
+ int ActiveIdMouseButton;
+ ImGuiID ActiveIdPreviousFrame;
+ bool ActiveIdPreviousFrameIsAlive;
+ bool ActiveIdPreviousFrameHasBeenEditedBefore;
+ ImGuiWindow* ActiveIdPreviousFrameWindow;
ImGuiID LastActiveId; // Store the last non-zero ActiveId, useful for animation.
float LastActiveIdTimer; // Store the last non-zero ActiveId timer since the beginning of activation, useful for animation.
- ImGuiWindow* MovingWindow; // Track the window we clicked on (in order to preserve focus). The actually window that is moved is generally MovingWindow->RootWindow.
- ImVector<ImGuiColorMod> ColorModifiers; // Stack for PushStyleColor()/PopStyleColor()
+
+ // Next window/item data
+ ImGuiNextWindowData NextWindowData; // Storage for SetNextWindow** functions
+ ImGuiNextItemData NextItemData; // Storage for SetNextItem** functions
+
+ // Shared stacks
+ ImVector<ImGuiColorMod> ColorModifiers; // Stack for PushStyleColor()/PopStyleColor()
ImVector<ImGuiStyleMod> StyleModifiers; // Stack for PushStyleVar()/PopStyleVar()
ImVector<ImFont*> FontStack; // Stack for PushFont()/PopFont()
- ImVector<ImGuiPopupRef> OpenPopupStack; // Which popups are open (persistent)
- ImVector<ImGuiPopupRef> CurrentPopupStack; // Which level of BeginPopup() we are in (reset every frame)
- ImGuiNextWindowData NextWindowData; // Storage for SetNextWindow** functions
- bool NextTreeNodeOpenVal; // Storage for SetNextTreeNode** functions
- ImGuiCond NextTreeNodeOpenCond;
+ ImVector<ImGuiPopupData>OpenPopupStack; // Which popups are open (persistent)
+ ImVector<ImGuiPopupData>BeginPopupStack; // Which level of BeginPopup() we are in (reset every frame)
- // Navigation data (for gamepad/keyboard)
+ // Gamepad/keyboard Navigation
ImGuiWindow* NavWindow; // Focused window for navigation. Could be called 'FocusWindow'
ImGuiID NavId; // Focused item for navigation
+ ImGuiID NavFocusScopeId;
ImGuiID NavActivateId; // ~~ (g.ActiveId == 0) && IsNavInputPressed(ImGuiNavInput_Activate) ? NavId : 0, also set when calling ActivateItem()
ImGuiID NavActivateDownId; // ~~ IsNavInputDown(ImGuiNavInput_Activate) ? NavId : 0
ImGuiID NavActivatePressedId; // ~~ IsNavInputPressed(ImGuiNavInput_Activate) ? NavId : 0
ImGuiID NavInputId; // ~~ IsNavInputPressed(ImGuiNavInput_Input) ? NavId : 0
ImGuiID NavJustTabbedId; // Just tabbed to this id.
- ImGuiID NavJustMovedToId; // Just navigated to this id (result of a successfully MoveRequest)
- ImGuiID NavNextActivateId; // Set by ActivateItem(), queued until next frame
- ImGuiInputSource NavInputSource; // Keyboard or Gamepad mode?
+ ImGuiID NavJustMovedToId; // Just navigated to this id (result of a successfully MoveRequest).
+ ImGuiID NavJustMovedToFocusScopeId; // Just navigated to this focus scope id (result of a successfully MoveRequest).
+ ImGuiID NavNextActivateId; // Set by ActivateItem(), queued until next frame.
+ ImGuiInputSource NavInputSource; // Keyboard or Gamepad mode? THIS WILL ONLY BE None or NavGamepad or NavKeyboard.
ImRect NavScoringRectScreen; // Rectangle used for scoring, in screen space. Based of window->DC.NavRefRectRel[], modified for directional navigation scoring.
int NavScoringCount; // Metrics for debugging
- ImGuiWindow* NavWindowingTarget; // When selecting a window (holding Menu+FocusPrev/Next, or equivalent of CTRL-TAB) this window is temporarily displayed front-most.
- ImGuiWindow* NavWindowingTargetAnim; // Record of last valid NavWindowingTarget until DimBgRatio and NavWindowingHighlightAlpha becomes 0.0f
- ImGuiWindow* NavWindowingList;
- float NavWindowingTimer;
- float NavWindowingHighlightAlpha;
- bool NavWindowingToggleLayer;
- int NavLayer; // Layer we are navigating on. For now the system is hard-coded for 0=main contents and 1=menu/title bar, may expose layers later.
+ ImGuiNavLayer NavLayer; // Layer we are navigating on. For now the system is hard-coded for 0=main contents and 1=menu/title bar, may expose layers later.
int NavIdTabCounter; // == NavWindow->DC.FocusIdxTabCounter at time of NavId processing
bool NavIdIsAlive; // Nav widget has been seen this frame ~~ NavRefRectRel is valid
bool NavMousePosDirty; // When set we will update mouse position if (io.ConfigFlags & ImGuiConfigFlags_NavEnableSetMousePos) if set (NB: this not enabled by default)
@@ -725,62 +1090,101 @@ struct ImGuiContext
ImGuiNavMoveFlags NavMoveRequestFlags;
ImGuiNavForward NavMoveRequestForward; // None / ForwardQueued / ForwardActive (this is used to navigate sibling parent menus from a child menu)
ImGuiDir NavMoveDir, NavMoveDirLast; // Direction of the move request (left/right/up/down), direction of the previous move request
- ImGuiDir NavMoveClipDir;
+ ImGuiDir NavMoveClipDir; // FIXME-NAV: Describe the purpose of this better. Might want to rename?
ImGuiNavMoveResult NavMoveResultLocal; // Best move request candidate within NavWindow
ImGuiNavMoveResult NavMoveResultLocalVisibleSet; // Best move request candidate within NavWindow that are mostly visible (when using ImGuiNavMoveFlags_AlsoScoreVisibleSet flag)
ImGuiNavMoveResult NavMoveResultOther; // Best move request candidate within NavWindow's flattened hierarchy (when using ImGuiWindowFlags_NavFlattened flag)
+ // Navigation: Windowing (CTRL+TAB, holding Menu button + directional pads to move/resize)
+ ImGuiWindow* NavWindowingTarget; // When selecting a window (holding Menu+FocusPrev/Next, or equivalent of CTRL-TAB) this window is temporarily displayed top-most.
+ ImGuiWindow* NavWindowingTargetAnim; // Record of last valid NavWindowingTarget until DimBgRatio and NavWindowingHighlightAlpha becomes 0.0f
+ ImGuiWindow* NavWindowingList;
+ float NavWindowingTimer;
+ float NavWindowingHighlightAlpha;
+ bool NavWindowingToggleLayer;
+
+ // Legacy Focus/Tabbing system (older than Nav, active even if Nav is disabled, misnamed. FIXME-NAV: This needs a redesign!)
+ ImGuiWindow* FocusRequestCurrWindow; //
+ ImGuiWindow* FocusRequestNextWindow; //
+ int FocusRequestCurrCounterRegular; // Any item being requested for focus, stored as an index (we on layout to be stable between the frame pressing TAB and the next frame, semi-ouch)
+ int FocusRequestCurrCounterTabStop; // Tab item being requested for focus, stored as an index
+ int FocusRequestNextCounterRegular; // Stored for next frame
+ int FocusRequestNextCounterTabStop; // "
+ bool FocusTabPressed; //
+
// Render
ImDrawData DrawData; // Main ImDrawData instance to pass render information to the user
ImDrawDataBuilder DrawDataBuilder;
float DimBgRatio; // 0.0..1.0 animation when fading in a dimming background (for modal window and CTRL+TAB list)
- ImDrawList OverlayDrawList; // Optional software render of mouse cursors, if io.MouseDrawCursor is set + a few debug overlays
+ ImDrawList BackgroundDrawList; // First draw list to be rendered.
+ ImDrawList ForegroundDrawList; // Last draw list to be rendered. This is where we the render software mouse cursor (if io.MouseDrawCursor is set) and most debug overlays.
ImGuiMouseCursor MouseCursor;
// Drag and Drop
bool DragDropActive;
- bool DragDropWithinSourceOrTarget;
+ bool DragDropWithinSourceOrTarget; // Set when within a BeginDragDropXXX/EndDragDropXXX block.
ImGuiDragDropFlags DragDropSourceFlags;
int DragDropSourceFrameCount;
int DragDropMouseButton;
ImGuiPayload DragDropPayload;
- ImRect DragDropTargetRect;
+ ImRect DragDropTargetRect; // Store rectangle of current target candidate (we favor small targets when overlapping)
ImGuiID DragDropTargetId;
ImGuiDragDropFlags DragDropAcceptFlags;
float DragDropAcceptIdCurrRectSurface; // Target item surface (we resolve overlapping targets by prioritizing the smaller surface)
ImGuiID DragDropAcceptIdCurr; // Target item id (set at the time of accepting the payload)
ImGuiID DragDropAcceptIdPrev; // Target item id from previous frame (we need to store this to allow for overlapping drag and drop targets)
int DragDropAcceptFrameCount; // Last time a target expressed a desire to accept the source
- ImVector<unsigned char> DragDropPayloadBufHeap; // We don't expose the ImVector<> directly
- unsigned char DragDropPayloadBufLocal[8]; // Local buffer for small payloads
+ ImVector<unsigned char> DragDropPayloadBufHeap; // We don't expose the ImVector<> directly, ImGuiPayload only holds pointer+size
+ unsigned char DragDropPayloadBufLocal[16]; // Local buffer for small payloads
+
+ // Tab bars
+ ImGuiTabBar* CurrentTabBar;
+ ImPool<ImGuiTabBar> TabBars;
+ ImVector<ImGuiPtrOrIndex> CurrentTabBarStack;
+ ImVector<ImGuiShrinkWidthItem> ShrinkWidthBuffer;
// Widget state
+ ImVec2 LastValidMousePos;
ImGuiInputTextState InputTextState;
ImFont InputTextPasswordFont;
- ImGuiID ScalarAsInputTextId; // Temporary text input when CTRL+clicking on a slider, etc.
+ ImGuiID TempInputTextId; // Temporary text input when CTRL+clicking on a slider, etc.
ImGuiColorEditFlags ColorEditOptions; // Store user options for color edit widgets
- ImVec4 ColorPickerRef;
+ float ColorEditLastHue; // Backup of last Hue associated to LastColor[3], so we can restore Hue in lossy RGB<>HSV round trips
+ float ColorEditLastSat; // Backup of last Saturation associated to LastColor[3], so we can restore Saturation in lossy RGB<>HSV round trips
+ float ColorEditLastColor[3];
+ ImVec4 ColorPickerRef; // Initial/reference color at the time of opening the color picker.
bool DragCurrentAccumDirty;
float DragCurrentAccum; // Accumulator for dragging modification. Always high-precision, not rounded by end-user precision settings
float DragSpeedDefaultRatio; // If speed == 0.0f, uses (max-min) * DragSpeedDefaultRatio
- ImVec2 ScrollbarClickDeltaToGrabCenter; // Distance between mouse and center of grab box, normalized in parent space. Use storage?
+ float ScrollbarClickDeltaToGrabCenter; // Distance between mouse and center of grab box, normalized in parent space. Use storage?
int TooltipOverrideCount;
ImVector<char> PrivateClipboard; // If no custom clipboard handler is defined
- ImVec2 PlatformImePos, PlatformImeLastPos; // Cursor position request & last passed to the OS Input Method Editor
+
+ // Platform support
+ ImVec2 PlatformImePos; // Cursor position request & last passed to the OS Input Method Editor
+ ImVec2 PlatformImeLastPos;
// Settings
- bool SettingsLoaded;
- float SettingsDirtyTimer; // Save .ini Settings to memory when time reaches zero
- ImGuiTextBuffer SettingsIniData; // In memory .ini settings
- ImVector<ImGuiSettingsHandler> SettingsHandlers; // List of .ini settings handlers
- ImVector<ImGuiWindowSettings> SettingsWindows; // ImGuiWindow .ini settings entries (parsed from the last loaded .ini file and maintained on saving)
+ bool SettingsLoaded;
+ float SettingsDirtyTimer; // Save .ini Settings to memory when time reaches zero
+ ImGuiTextBuffer SettingsIniData; // In memory .ini settings
+ ImVector<ImGuiSettingsHandler> SettingsHandlers; // List of .ini settings handlers
+ ImChunkStream<ImGuiWindowSettings> SettingsWindows; // ImGuiWindow .ini settings entries
- // Logging
+ // Capture/Logging
bool LogEnabled;
- FILE* LogFile; // If != NULL log to stdout/ file
- ImGuiTextBuffer LogClipboard; // Accumulation buffer when log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators.
- int LogStartDepth;
- int LogAutoExpandMaxDepth;
+ ImGuiLogType LogType;
+ ImFileHandle LogFile; // If != NULL log to stdout/ file
+ ImGuiTextBuffer LogBuffer; // Accumulation buffer when log to clipboard. This is pointer so our GImGui static constructor doesn't call heap allocators.
+ float LogLinePosY;
+ bool LogLineFirstItem;
+ int LogDepthRef;
+ int LogDepthToExpand;
+ int LogDepthToExpandDefault; // Default/stored value for LogDepthMaxExpand if not specified in the LogXXX function call.
+
+ // Debug Tools
+ bool DebugItemPickerActive;
+ ImGuiID DebugItemPickerBreakId; // Will call IM_DEBUG_BREAK() when encountering this id
// Misc
float FramerateSecPerFrame[120]; // Calculate estimate of framerate for user over the last 2 seconds.
@@ -791,55 +1195,59 @@ struct ImGuiContext
int WantTextInputNextFrame;
char TempBuffer[1024*3+1]; // Temporary text buffer
- ImGuiContext(ImFontAtlas* shared_font_atlas) : OverlayDrawList(NULL)
+ ImGuiContext(ImFontAtlas* shared_font_atlas) : BackgroundDrawList(&DrawListSharedData), ForegroundDrawList(&DrawListSharedData)
{
Initialized = false;
- FrameScopeActive = false;
Font = NULL;
FontSize = FontBaseSize = 0.0f;
FontAtlasOwnedByContext = shared_font_atlas ? false : true;
IO.Fonts = shared_font_atlas ? shared_font_atlas : IM_NEW(ImFontAtlas)();
-
Time = 0.0f;
FrameCount = 0;
FrameCountEnded = FrameCountRendered = -1;
+ WithinFrameScope = WithinFrameScopeWithImplicitWindow = WithinEndChild = false;
+
WindowsActiveCount = 0;
CurrentWindow = NULL;
HoveredWindow = NULL;
HoveredRootWindow = NULL;
+ MovingWindow = NULL;
+ WheelingWindow = NULL;
+ WheelingWindowTimer = 0.0f;
+
HoveredId = 0;
HoveredIdAllowOverlap = false;
HoveredIdPreviousFrame = 0;
HoveredIdTimer = HoveredIdNotActiveTimer = 0.0f;
ActiveId = 0;
- ActiveIdPreviousFrame = 0;
ActiveIdIsAlive = 0;
ActiveIdTimer = 0.0f;
ActiveIdIsJustActivated = false;
ActiveIdAllowOverlap = false;
- ActiveIdHasBeenEdited = false;
- ActiveIdPreviousFrameIsAlive = false;
- ActiveIdPreviousFrameHasBeenEdited = false;
- ActiveIdAllowNavDirFlags = 0;
+ ActiveIdHasBeenPressedBefore = false;
+ ActiveIdHasBeenEditedBefore = false;
+ ActiveIdHasBeenEditedThisFrame = false;
+ ActiveIdUsingNavDirMask = 0x00;
+ ActiveIdUsingNavInputMask = 0x00;
+ ActiveIdUsingKeyInputMask = 0x00;
ActiveIdClickOffset = ImVec2(-1,-1);
- ActiveIdWindow = ActiveIdPreviousFrameWindow = NULL;
+ ActiveIdWindow = NULL;
ActiveIdSource = ImGuiInputSource_None;
+ ActiveIdMouseButton = 0;
+ ActiveIdPreviousFrame = 0;
+ ActiveIdPreviousFrameIsAlive = false;
+ ActiveIdPreviousFrameHasBeenEditedBefore = false;
+ ActiveIdPreviousFrameWindow = NULL;
LastActiveId = 0;
LastActiveIdTimer = 0.0f;
- MovingWindow = NULL;
- NextTreeNodeOpenVal = false;
- NextTreeNodeOpenCond = 0;
NavWindow = NULL;
- NavId = NavActivateId = NavActivateDownId = NavActivatePressedId = NavInputId = 0;
- NavJustTabbedId = NavJustMovedToId = NavNextActivateId = 0;
+ NavId = NavFocusScopeId = NavActivateId = NavActivateDownId = NavActivatePressedId = NavInputId = 0;
+ NavJustTabbedId = NavJustMovedToId = NavJustMovedToFocusScopeId = NavNextActivateId = 0;
NavInputSource = ImGuiInputSource_None;
NavScoringRectScreen = ImRect();
NavScoringCount = 0;
- NavWindowingTarget = NavWindowingTargetAnim = NavWindowingList = NULL;
- NavWindowingTimer = NavWindowingHighlightAlpha = 0.0f;
- NavWindowingToggleLayer = false;
- NavLayer = 0;
+ NavLayer = ImGuiNavLayer_Main;
NavIdTabCounter = INT_MAX;
NavIdIsAlive = false;
NavMousePosDirty = false;
@@ -851,42 +1259,63 @@ struct ImGuiContext
NavInitResultId = 0;
NavMoveFromClampedRefRect = false;
NavMoveRequest = false;
- NavMoveRequestFlags = 0;
+ NavMoveRequestFlags = ImGuiNavMoveFlags_None;
NavMoveRequestForward = ImGuiNavForward_None;
NavMoveDir = NavMoveDirLast = NavMoveClipDir = ImGuiDir_None;
+ NavWindowingTarget = NavWindowingTargetAnim = NavWindowingList = NULL;
+ NavWindowingTimer = NavWindowingHighlightAlpha = 0.0f;
+ NavWindowingToggleLayer = false;
+
+ FocusRequestCurrWindow = FocusRequestNextWindow = NULL;
+ FocusRequestCurrCounterRegular = FocusRequestCurrCounterTabStop = INT_MAX;
+ FocusRequestNextCounterRegular = FocusRequestNextCounterTabStop = INT_MAX;
+ FocusTabPressed = false;
+
DimBgRatio = 0.0f;
- OverlayDrawList._Data = &DrawListSharedData;
- OverlayDrawList._OwnerName = "##Overlay"; // Give it a name for debugging
+ BackgroundDrawList._OwnerName = "##Background"; // Give it a name for debugging
+ ForegroundDrawList._OwnerName = "##Foreground"; // Give it a name for debugging
MouseCursor = ImGuiMouseCursor_Arrow;
DragDropActive = DragDropWithinSourceOrTarget = false;
- DragDropSourceFlags = 0;
+ DragDropSourceFlags = ImGuiDragDropFlags_None;
DragDropSourceFrameCount = -1;
DragDropMouseButton = -1;
DragDropTargetId = 0;
- DragDropAcceptFlags = 0;
+ DragDropAcceptFlags = ImGuiDragDropFlags_None;
DragDropAcceptIdCurrRectSurface = 0.0f;
DragDropAcceptIdPrev = DragDropAcceptIdCurr = 0;
DragDropAcceptFrameCount = -1;
memset(DragDropPayloadBufLocal, 0, sizeof(DragDropPayloadBufLocal));
- ScalarAsInputTextId = 0;
+ CurrentTabBar = NULL;
+
+ LastValidMousePos = ImVec2(0.0f, 0.0f);
+ TempInputTextId = 0;
ColorEditOptions = ImGuiColorEditFlags__OptionsDefault;
+ ColorEditLastHue = ColorEditLastSat = 0.0f;
+ ColorEditLastColor[0] = ColorEditLastColor[1] = ColorEditLastColor[2] = FLT_MAX;
DragCurrentAccumDirty = false;
DragCurrentAccum = 0.0f;
DragSpeedDefaultRatio = 1.0f / 100.0f;
- ScrollbarClickDeltaToGrabCenter = ImVec2(0.0f, 0.0f);
+ ScrollbarClickDeltaToGrabCenter = 0.0f;
TooltipOverrideCount = 0;
+
PlatformImePos = PlatformImeLastPos = ImVec2(FLT_MAX, FLT_MAX);
SettingsLoaded = false;
SettingsDirtyTimer = 0.0f;
LogEnabled = false;
+ LogType = ImGuiLogType_None;
LogFile = NULL;
- LogStartDepth = 0;
- LogAutoExpandMaxDepth = 2;
+ LogLinePosY = FLT_MAX;
+ LogLineFirstItem = false;
+ LogDepthRef = 0;
+ LogDepthToExpand = LogDepthToExpandDefault = 2;
+
+ DebugItemPickerActive = false;
+ DebugItemPickerBreakId = 0;
memset(FramerateSecPerFrame, 0, sizeof(FramerateSecPerFrame));
FramerateSecPerFrameIdx = 0;
@@ -896,51 +1325,57 @@ struct ImGuiContext
}
};
-// Transient per-window flags, reset at the beginning of the frame. For child window, inherited from parent on first Begin().
-// This is going to be exposed in imgui.h when stabilized enough.
-enum ImGuiItemFlags_
-{
- ImGuiItemFlags_NoTabStop = 1 << 0, // false
- ImGuiItemFlags_ButtonRepeat = 1 << 1, // false // Button() will return true multiple times based on io.KeyRepeatDelay and io.KeyRepeatRate settings.
- ImGuiItemFlags_Disabled = 1 << 2, // false // [BETA] Disable interactions but doesn't affect visuals yet. See github.com/ocornut/imgui/issues/211
- ImGuiItemFlags_NoNav = 1 << 3, // false
- ImGuiItemFlags_NoNavDefaultFocus = 1 << 4, // false
- ImGuiItemFlags_SelectableDontClosePopup = 1 << 5, // false // MenuItem/Selectable() automatically closes current Popup window
- ImGuiItemFlags_Default_ = 0
-};
+//-----------------------------------------------------------------------------
+// ImGuiWindow
+//-----------------------------------------------------------------------------
// Transient per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the DC variable name in ImGuiWindow.
// FIXME: That's theory, in practice the delimitation between ImGuiWindow and ImGuiWindowTempData is quite tenuous and could be reconsidered.
struct IMGUI_API ImGuiWindowTempData
{
- ImVec2 CursorPos;
+ // Layout
+ ImVec2 CursorPos; // Current emitting position, in absolute coordinates.
ImVec2 CursorPosPrevLine;
- ImVec2 CursorStartPos; // Initial position in client area with padding
- ImVec2 CursorMaxPos; // Used to implicitly calculate the size of our contents, always growing during the frame. Turned into window->SizeContents at the beginning of next frame
- ImVec2 CurrentLineSize;
- float CurrentLineTextBaseOffset;
+ ImVec2 CursorStartPos; // Initial position after Begin(), generally ~ window position + WindowPadding.
+ ImVec2 CursorMaxPos; // Used to implicitly calculate the size of our contents, always growing during the frame. Used to calculate window->ContentSize at the beginning of next frame
+ ImVec2 CurrLineSize;
ImVec2 PrevLineSize;
+ float CurrLineTextBaseOffset; // Baseline offset (0.0f by default on a new line, generally == style.FramePadding.y when a framed item has been added).
float PrevLineTextBaseOffset;
- float LogLinePosY;
- int TreeDepth;
- ImU32 TreeDepthMayJumpToParentOnPop; // Store a copy of !g.NavIdIsAlive for TreeDepth 0..31
- ImGuiID LastItemId;
- ImGuiItemStatusFlags LastItemStatusFlags;
- ImRect LastItemRect; // Interaction rect
- ImRect LastItemDisplayRect; // End-user display rect (only valid if LastItemStatusFlags & ImGuiItemStatusFlags_HasDisplayRect)
- bool NavHideHighlightOneFrame;
- bool NavHasScroll; // Set when scrolling can be used (ScrollMax > 0.0f)
- int NavLayerCurrent; // Current layer, 0..31 (we currently only use 0..1)
+ ImVec1 Indent; // Indentation / start position from left of window (increased by TreePush/TreePop, etc.)
+ ImVec1 ColumnsOffset; // Offset to the current column (if ColumnsCurrent > 0). FIXME: This and the above should be a stack to allow use cases like Tree->Column->Tree. Need revamp columns API.
+ ImVec1 GroupOffset;
+
+ // Last item status
+ ImGuiID LastItemId; // ID for last item
+ ImGuiItemStatusFlags LastItemStatusFlags; // Status flags for last item (see ImGuiItemStatusFlags_)
+ ImRect LastItemRect; // Interaction rect for last item
+ ImRect LastItemDisplayRect; // End-user display rect for last item (only valid if LastItemStatusFlags & ImGuiItemStatusFlags_HasDisplayRect)
+
+ // Keyboard/Gamepad navigation
+ ImGuiNavLayer NavLayerCurrent; // Current layer, 0..31 (we currently only use 0..1)
int NavLayerCurrentMask; // = (1 << NavLayerCurrent) used by ItemAdd prior to clipping.
int NavLayerActiveMask; // Which layer have been written to (result from previous frame)
int NavLayerActiveMaskNext; // Which layer have been written to (buffer for current frame)
+ ImGuiID NavFocusScopeIdCurrent; // Current focus scope ID while appending
+ bool NavHideHighlightOneFrame;
+ bool NavHasScroll; // Set when scrolling can be used (ScrollMax > 0.0f)
+
+ // Miscellaneous
bool MenuBarAppending; // FIXME: Remove this
ImVec2 MenuBarOffset; // MenuBarOffset.x is sort of equivalent of a per-layer CursorPos.x, saved/restored as we switch to the menu bar. The only situation when MenuBarOffset.y is > 0 if when (SafeAreaPadding.y > FramePadding.y), often used on TVs.
+ ImGuiMenuColumns MenuColumns; // Simplified columns storage for menu items measurement
+ int TreeDepth; // Current tree depth.
+ ImU32 TreeJumpToParentOnPopMask; // Store a copy of !g.NavIdIsAlive for TreeDepth 0..31.. Could be turned into a ImU64 if necessary.
ImVector<ImGuiWindow*> ChildWindows;
- ImGuiStorage* StateStorage;
+ ImGuiStorage* StateStorage; // Current persistent per-window storage (store e.g. tree node open/close state)
+ ImGuiColumns* CurrentColumns; // Current columns set
ImGuiLayoutType LayoutType;
ImGuiLayoutType ParentLayoutType; // Layout type of parent window at the time of Begin()
+ int FocusCounterRegular; // (Legacy Focus/Tabbing system) Sequential counter, start at -1 and increase as assigned via FocusableItemRegister() (FIXME-NAV: Needs redesign)
+ int FocusCounterTabStop; // (Legacy Focus/Tabbing system) Same, but only count widgets which you can Tab through.
+ // Local parameters stacks
// We store the current settings outside of the vectors to increase memory locality (reduce cache misses). The vectors are rarely modified. Also it allows us to not heap allocate for short-lived windows which are not using those settings.
ImGuiItemFlags ItemFlags; // == ItemFlagsStack.back() [empty == ImGuiItemFlags_Default]
float ItemWidth; // == ItemWidthStack.back(). 0.0: default, >0.0: width in pixels, <0.0: align xx pixels to the right of window
@@ -949,67 +1384,67 @@ struct IMGUI_API ImGuiWindowTempData
ImVector<float> ItemWidthStack;
ImVector<float> TextWrapPosStack;
ImVector<ImGuiGroupData>GroupStack;
- int StackSizesBackup[6]; // Store size of various stacks for asserting
-
- ImVec1 Indent; // Indentation / start position from left of window (increased by TreePush/TreePop, etc.)
- ImVec1 GroupOffset;
- ImVec1 ColumnsOffset; // Offset to the current column (if ColumnsCurrent > 0). FIXME: This and the above should be a stack to allow use cases like Tree->Column->Tree. Need revamp columns API.
- ImGuiColumnsSet* ColumnsSet; // Current columns set
+ short StackSizesBackup[6]; // Store size of various stacks for asserting
ImGuiWindowTempData()
{
CursorPos = CursorPosPrevLine = CursorStartPos = CursorMaxPos = ImVec2(0.0f, 0.0f);
- CurrentLineSize = PrevLineSize = ImVec2(0.0f, 0.0f);
- CurrentLineTextBaseOffset = PrevLineTextBaseOffset = 0.0f;
- LogLinePosY = -1.0f;
- TreeDepth = 0;
- TreeDepthMayJumpToParentOnPop = 0x00;
+ CurrLineSize = PrevLineSize = ImVec2(0.0f, 0.0f);
+ CurrLineTextBaseOffset = PrevLineTextBaseOffset = 0.0f;
+ Indent = ImVec1(0.0f);
+ ColumnsOffset = ImVec1(0.0f);
+ GroupOffset = ImVec1(0.0f);
+
LastItemId = 0;
- LastItemStatusFlags = 0;
+ LastItemStatusFlags = ImGuiItemStatusFlags_None;
LastItemRect = LastItemDisplayRect = ImRect();
+
+ NavLayerActiveMask = NavLayerActiveMaskNext = 0x00;
+ NavLayerCurrent = ImGuiNavLayer_Main;
+ NavLayerCurrentMask = (1 << ImGuiNavLayer_Main);
+ NavFocusScopeIdCurrent = 0;
NavHideHighlightOneFrame = false;
NavHasScroll = false;
- NavLayerActiveMask = NavLayerActiveMaskNext = 0x00;
- NavLayerCurrent = 0;
- NavLayerCurrentMask = 1 << 0;
+
MenuBarAppending = false;
MenuBarOffset = ImVec2(0.0f, 0.0f);
+ TreeDepth = 0;
+ TreeJumpToParentOnPopMask = 0x00;
StateStorage = NULL;
+ CurrentColumns = NULL;
LayoutType = ParentLayoutType = ImGuiLayoutType_Vertical;
- ItemWidth = 0.0f;
+ FocusCounterRegular = FocusCounterTabStop = -1;
+
ItemFlags = ImGuiItemFlags_Default_;
+ ItemWidth = 0.0f;
TextWrapPos = -1.0f;
memset(StackSizesBackup, 0, sizeof(StackSizesBackup));
-
- Indent = ImVec1(0.0f);
- GroupOffset = ImVec1(0.0f);
- ColumnsOffset = ImVec1(0.0f);
- ColumnsSet = NULL;
}
};
// Storage for one window
struct IMGUI_API ImGuiWindow
{
- char* Name;
- ImGuiID ID; // == ImHash(Name)
+ char* Name; // Window name, owned by the window.
+ ImGuiID ID; // == ImHashStr(Name)
ImGuiWindowFlags Flags; // See enum ImGuiWindowFlags_
ImVec2 Pos; // Position (always rounded-up to nearest pixel)
ImVec2 Size; // Current size (==SizeFull or collapsed title bar size)
ImVec2 SizeFull; // Size when non collapsed
- ImVec2 SizeFullAtLastBegin; // Copy of SizeFull at the end of Begin. This is the reference value we'll use on the next frame to decide if we need scrollbars.
- ImVec2 SizeContents; // Size of contents (== extents reach of the drawing cursor) from previous frame. Include decoration, window title, border, menu, etc.
- ImVec2 SizeContentsExplicit; // Size of contents explicitly set by the user via SetNextWindowContentSize()
- ImVec2 WindowPadding; // Window padding at the time of begin.
- float WindowRounding; // Window rounding at the time of begin.
- float WindowBorderSize; // Window border size at the time of begin.
+ ImVec2 ContentSize; // Size of contents/scrollable client area (calculated from the extents reach of the cursor) from previous frame. Does not include window decoration or window padding.
+ ImVec2 ContentSizeExplicit; // Size of contents/scrollable client area explicitly request by the user via SetNextWindowContentSize().
+ ImVec2 WindowPadding; // Window padding at the time of Begin().
+ float WindowRounding; // Window rounding at the time of Begin().
+ float WindowBorderSize; // Window border size at the time of Begin().
+ int NameBufLen; // Size of buffer storing Name. May be larger than strlen(Name)!
ImGuiID MoveId; // == window->GetID("#MOVE")
ImGuiID ChildId; // ID of corresponding item in parent window (for navigation to return from child window to parent window)
ImVec2 Scroll;
+ ImVec2 ScrollMax;
ImVec2 ScrollTarget; // target scroll position. stored as cursor position with scrolling canceled out, so the highest point is always 0.0f. (FLT_MAX for no change)
ImVec2 ScrollTargetCenterRatio; // 0.0f = scroll so that target position is at top, 0.5f = scroll so that target position is centered
ImVec2 ScrollbarSizes; // Size taken by scrollbars on each axis
- bool ScrollbarX, ScrollbarY;
+ bool ScrollbarX, ScrollbarY; // Are scrollbars visible?
bool Active; // Set to true on Begin(), unless Collapsed
bool WasActive;
bool WriteAccessed; // Set to true when any widget access the current window
@@ -1017,37 +1452,45 @@ struct IMGUI_API ImGuiWindow
bool WantCollapseToggle;
bool SkipItems; // Set when items can safely be all clipped (e.g. window not visible or collapsed)
bool Appearing; // Set during the frame where the window is appearing (or re-appearing)
- bool Hidden; // Do not display (== (HiddenFramesForResize > 0) ||
+ bool Hidden; // Do not display (== (HiddenFrames*** > 0))
+ bool IsFallbackWindow; // Set on the "Debug##Default" window.
bool HasCloseButton; // Set when the window has a close button (p_open != NULL)
- int BeginCount; // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs)
- int BeginOrderWithinParent; // Order within immediate parent window, if we are a child window. Otherwise 0.
- int BeginOrderWithinContext; // Order within entire imgui context. This is mostly used for debugging submission order related issues.
+ signed char ResizeBorderHeld; // Current border being held for resize (-1: none, otherwise 0-3)
+ short BeginCount; // Number of Begin() during the current frame (generally 0 or 1, 1+ if appending via multiple Begin/End pairs)
+ short BeginOrderWithinParent; // Order within immediate parent window, if we are a child window. Otherwise 0.
+ short BeginOrderWithinContext; // Order within entire imgui context. This is mostly used for debugging submission order related issues.
ImGuiID PopupId; // ID in the popup stack when this window is used as a popup/menu (because we use generic Name/ID for recycling)
- int AutoFitFramesX, AutoFitFramesY;
+ ImS8 AutoFitFramesX, AutoFitFramesY;
+ ImS8 AutoFitChildAxises;
bool AutoFitOnlyGrows;
- int AutoFitChildAxises;
ImGuiDir AutoPosLastDirection;
- int HiddenFramesRegular; // Hide the window for N frames
- int HiddenFramesForResize; // Hide the window for N frames while allowing items to be submitted so we can measure their size
+ int HiddenFramesCanSkipItems; // Hide the window for N frames
+ int HiddenFramesCannotSkipItems; // Hide the window for N frames while allowing items to be submitted so we can measure their size
ImGuiCond SetWindowPosAllowFlags; // store acceptable condition flags for SetNextWindowPos() use.
ImGuiCond SetWindowSizeAllowFlags; // store acceptable condition flags for SetNextWindowSize() use.
ImGuiCond SetWindowCollapsedAllowFlags; // store acceptable condition flags for SetNextWindowCollapsed() use.
ImVec2 SetWindowPosVal; // store window position when using a non-zero Pivot (position set needs to be processed when we know the window size)
ImVec2 SetWindowPosPivot; // store window pivot for positioning. ImVec2(0,0) when positioning from top-left corner; ImVec2(0.5f,0.5f) for centering; ImVec2(1,1) for bottom right.
+ ImVector<ImGuiID> IDStack; // ID stack. ID are hashes seeded with the value at the top of the stack. (In theory this should be in the TempData structure)
ImGuiWindowTempData DC; // Temporary per-window data, reset at the beginning of the frame. This used to be called ImGuiDrawContext, hence the "DC" variable name.
- ImVector<ImGuiID> IDStack; // ID stack. ID are hashes seeded with the value at the top of the stack
- ImRect ClipRect; // Current clipping rectangle. = DrawList->clip_rect_stack.back(). Scissoring / clipping rectangle. x1, y1, x2, y2.
- ImRect OuterRectClipped; // = WindowRect just after setup in Begin(). == window->Rect() for root window.
- ImRect InnerMainRect, InnerClipRect;
- ImRect ContentsRegionRect; // FIXME: This is currently confusing/misleading. Maximum visible content position ~~ Pos + (SizeContentsExplicit ? SizeContentsExplicit : Size - ScrollbarSizes) - CursorStartPos, per axis
+
+ // The best way to understand what those rectangles are is to use the 'Metrics -> Tools -> Show windows rectangles' viewer.
+ // The main 'OuterRect', omitted as a field, is window->Rect().
+ ImRect OuterRectClipped; // == Window->Rect() just after setup in Begin(). == window->Rect() for root window.
+ ImRect InnerRect; // Inner rectangle (omit title bar, menu bar, scroll bar)
+ ImRect InnerClipRect; // == InnerRect shrunk by WindowPadding*0.5f on each side, clipped within viewport or parent clip rect.
+ ImRect WorkRect; // Cover the whole scrolling region, shrunk by WindowPadding*1.0f on each side. This is meant to replace ContentRegionRect over time (from 1.71+ onward).
+ ImRect ClipRect; // Current clipping/scissoring rectangle, evolve as we are using PushClipRect(), etc. == DrawList->clip_rect_stack.back().
+ ImRect ContentRegionRect; // FIXME: This is currently confusing/misleading. It is essentially WorkRect but not handling of scrolling. We currently rely on it as right/bottom aligned sizing operation need some size to rely on.
+
int LastFrameActive; // Last frame number the window was Active.
+ float LastTimeActive; // Last timestamp the window was Active (using float as we don't need high precision there)
float ItemWidthDefault;
- ImGuiMenuColumns MenuColumns; // Simplified columns storage for menu items
ImGuiStorage StateStorage;
- ImVector<ImGuiColumnsSet> ColumnsStorage;
- float FontWindowScale; // User scale multiplier per-window
- int SettingsIdx; // Index into SettingsWindow[] (indices are always valid as we only grow the array from the back)
+ ImVector<ImGuiColumns> ColumnsStorage;
+ float FontWindowScale; // User scale multiplier per-window, via SetWindowFontScale()
+ int SettingsOffset; // Offset into SettingsWindows[] (offsets are always valid as we only grow the array from the back)
ImDrawList* DrawList; // == &DrawListInst (for backward compatibility reason with code using imgui_internal.h we keep this a pointer)
ImDrawList DrawListInst;
@@ -1057,17 +1500,12 @@ struct IMGUI_API ImGuiWindow
ImGuiWindow* RootWindowForNav; // Point to ourself or first ancestor which doesn't have the NavFlattened flag.
ImGuiWindow* NavLastChildNavWindow; // When going to the menu bar, we remember the child window we came from. (This could probably be made implicit if we kept g.Windows sorted by last focused including child window.)
- ImGuiID NavLastIds[2]; // Last known NavId for this window, per layer (0/1)
- ImRect NavRectRel[2]; // Reference rectangle, in window relative space
-
- // Navigation / Focus
- // FIXME-NAV: Merge all this with the new Nav system, at least the request variables should be moved to ImGuiContext
- int FocusIdxAllCounter; // Start at -1 and increase as assigned via FocusItemRegister()
- int FocusIdxTabCounter; // (same, but only count widgets which you can Tab through)
- int FocusIdxAllRequestCurrent; // Item being requested for focus
- int FocusIdxTabRequestCurrent; // Tab-able item being requested for focus
- int FocusIdxAllRequestNext; // Item being requested for focus, for next update (relies on layout to be stable between the frame pressing TAB and the next frame)
- int FocusIdxTabRequestNext; // "
+ ImGuiID NavLastIds[ImGuiNavLayer_COUNT]; // Last known NavId for this window, per layer (0/1)
+ ImRect NavRectRel[ImGuiNavLayer_COUNT]; // Reference rectangle, in window relative space
+
+ bool MemoryCompacted;
+ int MemoryDrawListIdxCapacity;
+ int MemoryDrawListVtxCapacity;
public:
ImGuiWindow(ImGuiContext* context, const char* name);
@@ -1075,17 +1513,19 @@ public:
ImGuiID GetID(const char* str, const char* str_end = NULL);
ImGuiID GetID(const void* ptr);
+ ImGuiID GetID(int n);
ImGuiID GetIDNoKeepAlive(const char* str, const char* str_end = NULL);
ImGuiID GetIDNoKeepAlive(const void* ptr);
+ ImGuiID GetIDNoKeepAlive(int n);
ImGuiID GetIDFromRectangle(const ImRect& r_abs);
// We don't use g.FontSize because the window may be != g.CurrentWidow.
- ImRect Rect() const { return ImRect(Pos.x, Pos.y, Pos.x+Size.x, Pos.y+Size.y); }
- float CalcFontSize() const { return GImGui->FontBaseSize * FontWindowScale; }
- float TitleBarHeight() const { return (Flags & ImGuiWindowFlags_NoTitleBar) ? 0.0f : CalcFontSize() + GImGui->Style.FramePadding.y * 2.0f; }
- ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight())); }
- float MenuBarHeight() const { return (Flags & ImGuiWindowFlags_MenuBar) ? DC.MenuBarOffset.y + CalcFontSize() + GImGui->Style.FramePadding.y * 2.0f : 0.0f; }
- ImRect MenuBarRect() const { float y1 = Pos.y + TitleBarHeight(); return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight()); }
+ ImRect Rect() const { return ImRect(Pos.x, Pos.y, Pos.x+Size.x, Pos.y+Size.y); }
+ float CalcFontSize() const { ImGuiContext& g = *GImGui; float scale = g.FontBaseSize * FontWindowScale; if (ParentWindow) scale *= ParentWindow->FontWindowScale; return scale; }
+ float TitleBarHeight() const { ImGuiContext& g = *GImGui; return (Flags & ImGuiWindowFlags_NoTitleBar) ? 0.0f : CalcFontSize() + g.Style.FramePadding.y * 2.0f; }
+ ImRect TitleBarRect() const { return ImRect(Pos, ImVec2(Pos.x + SizeFull.x, Pos.y + TitleBarHeight())); }
+ float MenuBarHeight() const { ImGuiContext& g = *GImGui; return (Flags & ImGuiWindowFlags_MenuBar) ? DC.MenuBarOffset.y + CalcFontSize() + g.Style.FramePadding.y * 2.0f : 0.0f; }
+ ImRect MenuBarRect() const { float y1 = Pos.y + TitleBarHeight(); return ImRect(Pos.x, y1, Pos.x + SizeFull.x, y1 + MenuBarHeight()); }
};
// Backup and restore just enough data to be able to use IsItemHovered() on item A after another B in the same window has overwritten the data.
@@ -1102,35 +1542,111 @@ struct ImGuiItemHoveredDataBackup
};
//-----------------------------------------------------------------------------
+// Tab bar, tab item
+//-----------------------------------------------------------------------------
+
+// Extend ImGuiTabBarFlags_
+enum ImGuiTabBarFlagsPrivate_
+{
+ ImGuiTabBarFlags_DockNode = 1 << 20, // Part of a dock node [we don't use this in the master branch but it facilitate branch syncing to keep this around]
+ ImGuiTabBarFlags_IsFocused = 1 << 21,
+ ImGuiTabBarFlags_SaveSettings = 1 << 22 // FIXME: Settings are handled by the docking system, this only request the tab bar to mark settings dirty when reordering tabs
+};
+
+// Extend ImGuiTabItemFlags_
+enum ImGuiTabItemFlagsPrivate_
+{
+ ImGuiTabItemFlags_NoCloseButton = 1 << 20 // Track whether p_open was set or not (we'll need this info on the next frame to recompute ContentWidth during layout)
+};
+
+// Storage for one active tab item (sizeof() 26~32 bytes)
+struct ImGuiTabItem
+{
+ ImGuiID ID;
+ ImGuiTabItemFlags Flags;
+ int LastFrameVisible;
+ int LastFrameSelected; // This allows us to infer an ordered list of the last activated tabs with little maintenance
+ int NameOffset; // When Window==NULL, offset to name within parent ImGuiTabBar::TabsNames
+ float Offset; // Position relative to beginning of tab
+ float Width; // Width currently displayed
+ float ContentWidth; // Width of actual contents, stored during BeginTabItem() call
+
+ ImGuiTabItem() { ID = 0; Flags = ImGuiTabItemFlags_None; LastFrameVisible = LastFrameSelected = -1; NameOffset = -1; Offset = Width = ContentWidth = 0.0f; }
+};
+
+// Storage for a tab bar (sizeof() 92~96 bytes)
+struct ImGuiTabBar
+{
+ ImVector<ImGuiTabItem> Tabs;
+ ImGuiID ID; // Zero for tab-bars used by docking
+ ImGuiID SelectedTabId; // Selected tab/window
+ ImGuiID NextSelectedTabId;
+ ImGuiID VisibleTabId; // Can occasionally be != SelectedTabId (e.g. when previewing contents for CTRL+TAB preview)
+ int CurrFrameVisible;
+ int PrevFrameVisible;
+ ImRect BarRect;
+ float LastTabContentHeight; // Record the height of contents submitted below the tab bar
+ float OffsetMax; // Distance from BarRect.Min.x, locked during layout
+ float OffsetMaxIdeal; // Ideal offset if all tabs were visible and not clipped
+ float OffsetNextTab; // Distance from BarRect.Min.x, incremented with each BeginTabItem() call, not used if ImGuiTabBarFlags_Reorderable if set.
+ float ScrollingAnim;
+ float ScrollingTarget;
+ float ScrollingTargetDistToVisibility;
+ float ScrollingSpeed;
+ ImGuiTabBarFlags Flags;
+ ImGuiID ReorderRequestTabId;
+ ImS8 ReorderRequestDir;
+ bool WantLayout;
+ bool VisibleTabWasSubmitted;
+ short LastTabItemIdx; // For BeginTabItem()/EndTabItem()
+ ImVec2 FramePadding; // style.FramePadding locked at the time of BeginTabBar()
+ ImGuiTextBuffer TabsNames; // For non-docking tab bar we re-append names in a contiguous buffer.
+
+ ImGuiTabBar();
+ int GetTabOrder(const ImGuiTabItem* tab) const { return Tabs.index_from_ptr(tab); }
+ const char* GetTabName(const ImGuiTabItem* tab) const
+ {
+ IM_ASSERT(tab->NameOffset != -1 && tab->NameOffset < TabsNames.Buf.Size);
+ return TabsNames.Buf.Data + tab->NameOffset;
+ }
+};
+
+//-----------------------------------------------------------------------------
// Internal API
// No guarantee of forward compatibility here.
//-----------------------------------------------------------------------------
namespace ImGui
{
+ // Windows
// We should always have a CurrentWindow in the stack (there is an implicit "Debug" window)
// If this ever crash because g.CurrentWindow is NULL it means that either
// - ImGui::NewFrame() has never been called, which is illegal.
// - You are calling ImGui functions after ImGui::EndFrame()/ImGui::Render() and before the next ImGui::NewFrame(), which is also illegal.
inline ImGuiWindow* GetCurrentWindowRead() { ImGuiContext& g = *GImGui; return g.CurrentWindow; }
inline ImGuiWindow* GetCurrentWindow() { ImGuiContext& g = *GImGui; g.CurrentWindow->WriteAccessed = true; return g.CurrentWindow; }
+ IMGUI_API ImGuiWindow* FindWindowByID(ImGuiID id);
IMGUI_API ImGuiWindow* FindWindowByName(const char* name);
- IMGUI_API void FocusWindow(ImGuiWindow* window);
- IMGUI_API void FocusPreviousWindowIgnoringOne(ImGuiWindow* ignore_window);
- IMGUI_API void BringWindowToFocusFront(ImGuiWindow* window);
- IMGUI_API void BringWindowToDisplayFront(ImGuiWindow* window);
- IMGUI_API void BringWindowToDisplayBack(ImGuiWindow* window);
IMGUI_API void UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags flags, ImGuiWindow* parent_window);
IMGUI_API ImVec2 CalcWindowExpectedSize(ImGuiWindow* window);
IMGUI_API bool IsWindowChildOf(ImGuiWindow* window, ImGuiWindow* potential_parent);
IMGUI_API bool IsWindowNavFocusable(ImGuiWindow* window);
- IMGUI_API void SetWindowScrollX(ImGuiWindow* window, float new_scroll_x);
- IMGUI_API void SetWindowScrollY(ImGuiWindow* window, float new_scroll_y);
- IMGUI_API float GetWindowScrollMaxX(ImGuiWindow* window);
- IMGUI_API float GetWindowScrollMaxY(ImGuiWindow* window);
IMGUI_API ImRect GetWindowAllowedExtentRect(ImGuiWindow* window);
+ IMGUI_API void SetWindowPos(ImGuiWindow* window, const ImVec2& pos, ImGuiCond cond = 0);
+ IMGUI_API void SetWindowSize(ImGuiWindow* window, const ImVec2& size, ImGuiCond cond = 0);
+ IMGUI_API void SetWindowCollapsed(ImGuiWindow* window, bool collapsed, ImGuiCond cond = 0);
+
+ // Windows: Display Order and Focus Order
+ IMGUI_API void FocusWindow(ImGuiWindow* window);
+ IMGUI_API void FocusTopMostWindowUnderOne(ImGuiWindow* under_this_window, ImGuiWindow* ignore_window);
+ IMGUI_API void BringWindowToFocusFront(ImGuiWindow* window);
+ IMGUI_API void BringWindowToDisplayFront(ImGuiWindow* window);
+ IMGUI_API void BringWindowToDisplayBack(ImGuiWindow* window);
+
+ // Fonts, drawing
IMGUI_API void SetCurrentFont(ImFont* font);
inline ImFont* GetDefaultFont() { ImGuiContext& g = *GImGui; return g.IO.FontDefault ? g.IO.FontDefault : g.IO.Fonts->Fonts[0]; }
+ inline ImDrawList* GetForegroundDrawList(ImGuiWindow* window) { IM_UNUSED(window); ImGuiContext& g = *GImGui; return &g.ForegroundDrawList; } // This seemingly unnecessary wrapper simplifies compatibility between the 'master' and 'docking' branches.
// Init
IMGUI_API void Initialize(ImGuiContext* context);
@@ -1139,17 +1655,27 @@ namespace ImGui
// NewFrame
IMGUI_API void UpdateHoveredWindowAndCaptureFlags();
IMGUI_API void StartMouseMovingWindow(ImGuiWindow* window);
- IMGUI_API void UpdateMouseMovingWindow();
+ IMGUI_API void UpdateMouseMovingWindowNewFrame();
+ IMGUI_API void UpdateMouseMovingWindowEndFrame();
// Settings
IMGUI_API void MarkIniSettingsDirty();
IMGUI_API void MarkIniSettingsDirty(ImGuiWindow* window);
IMGUI_API ImGuiWindowSettings* CreateNewWindowSettings(const char* name);
IMGUI_API ImGuiWindowSettings* FindWindowSettings(ImGuiID id);
+ IMGUI_API ImGuiWindowSettings* FindOrCreateWindowSettings(const char* name);
IMGUI_API ImGuiSettingsHandler* FindSettingsHandler(const char* type_name);
+ // Scrolling
+ IMGUI_API void SetScrollX(ImGuiWindow* window, float new_scroll_x);
+ IMGUI_API void SetScrollY(ImGuiWindow* window, float new_scroll_y);
+ IMGUI_API void SetScrollFromPosX(ImGuiWindow* window, float local_x, float center_x_ratio = 0.5f);
+ IMGUI_API void SetScrollFromPosY(ImGuiWindow* window, float local_y, float center_y_ratio = 0.5f);
+ IMGUI_API ImVec2 ScrollToBringRectIntoView(ImGuiWindow* window, const ImRect& item_rect);
+
// Basic Accessors
inline ImGuiID GetItemID() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.LastItemId; }
+ inline ImGuiItemStatusFlags GetItemStatusFlags() { ImGuiContext& g = *GImGui; return g.CurrentWindow->DC.LastItemStatusFlags; }
inline ImGuiID GetActiveID() { ImGuiContext& g = *GImGui; return g.ActiveId; }
inline ImGuiID GetFocusID() { ImGuiContext& g = *GImGui; return g.NavId; }
IMGUI_API void SetActiveID(ImGuiID id, ImGuiWindow* window);
@@ -1158,31 +1684,39 @@ namespace ImGui
IMGUI_API ImGuiID GetHoveredID();
IMGUI_API void SetHoveredID(ImGuiID id);
IMGUI_API void KeepAliveID(ImGuiID id);
- IMGUI_API void MarkItemEdited(ImGuiID id);
+ IMGUI_API void MarkItemEdited(ImGuiID id); // Mark data associated to given item as "edited", used by IsItemDeactivatedAfterEdit() function.
+ IMGUI_API void PushOverrideID(ImGuiID id); // Push given value at the top of the ID stack (whereas PushID combines old and new hashes)
// Basic Helpers for widget code
- IMGUI_API void ItemSize(const ImVec2& size, float text_offset_y = 0.0f);
- IMGUI_API void ItemSize(const ImRect& bb, float text_offset_y = 0.0f);
+ IMGUI_API void ItemSize(const ImVec2& size, float text_baseline_y = -1.0f);
+ IMGUI_API void ItemSize(const ImRect& bb, float text_baseline_y = -1.0f);
IMGUI_API bool ItemAdd(const ImRect& bb, ImGuiID id, const ImRect* nav_bb = NULL);
IMGUI_API bool ItemHoverable(const ImRect& bb, ImGuiID id);
IMGUI_API bool IsClippedEx(const ImRect& bb, ImGuiID id, bool clip_even_when_logged);
- IMGUI_API bool FocusableItemRegister(ImGuiWindow* window, ImGuiID id, bool tab_stop = true); // Return true if focus is requested
+ IMGUI_API bool FocusableItemRegister(ImGuiWindow* window, ImGuiID id); // Return true if focus is requested
IMGUI_API void FocusableItemUnregister(ImGuiWindow* window);
- IMGUI_API ImVec2 CalcItemSize(ImVec2 size, float default_x, float default_y);
+ IMGUI_API ImVec2 CalcItemSize(ImVec2 size, float default_w, float default_h);
IMGUI_API float CalcWrapWidthForPos(const ImVec2& pos, float wrap_pos_x);
- IMGUI_API void PushMultiItemsWidths(int components, float width_full = 0.0f);
+ IMGUI_API void PushMultiItemsWidths(int components, float width_full);
IMGUI_API void PushItemFlag(ImGuiItemFlags option, bool enabled);
IMGUI_API void PopItemFlag();
+ IMGUI_API bool IsItemToggledSelection(); // Was the last item selection toggled? (after Selectable(), TreeNode() etc. We only returns toggle _event_ in order to handle clipping correctly)
+ IMGUI_API ImVec2 GetContentRegionMaxAbs();
+ IMGUI_API void ShrinkWidths(ImGuiShrinkWidthItem* items, int count, float width_excess);
+
+ // Logging/Capture
+ IMGUI_API void LogBegin(ImGuiLogType type, int auto_open_depth); // -> BeginCapture() when we design v2 api, for now stay under the radar by using the old name.
+ IMGUI_API void LogToBuffer(int auto_open_depth = -1); // Start logging/capturing to internal buffer
// Popups, Modals, Tooltips
+ IMGUI_API bool BeginChildEx(const char* name, ImGuiID id, const ImVec2& size_arg, bool border, ImGuiWindowFlags flags);
IMGUI_API void OpenPopupEx(ImGuiID id);
- IMGUI_API void ClosePopup(ImGuiID id);
- IMGUI_API void ClosePopupToLevel(int remaining);
- IMGUI_API void ClosePopupsOverWindow(ImGuiWindow* ref_window);
- IMGUI_API bool IsPopupOpen(ImGuiID id);
+ IMGUI_API void ClosePopupToLevel(int remaining, bool restore_focus_to_window_under_popup);
+ IMGUI_API void ClosePopupsOverWindow(ImGuiWindow* ref_window, bool restore_focus_to_window_under_popup);
+ IMGUI_API bool IsPopupOpen(ImGuiID id); // Test for id within current popup stack level (currently begin-ed into); this doesn't scan the whole popup stack!
IMGUI_API bool BeginPopupEx(ImGuiID id, ImGuiWindowFlags extra_flags);
- IMGUI_API void BeginTooltipEx(ImGuiWindowFlags extra_flags, bool override_previous_tooltip = true);
- IMGUI_API ImGuiWindow* GetFrontMostPopupModal();
+ IMGUI_API void BeginTooltipEx(ImGuiWindowFlags extra_flags, ImGuiTooltipFlags tooltip_flags);
+ IMGUI_API ImGuiWindow* GetTopMostPopupModal();
IMGUI_API ImVec2 FindBestWindowPosForPopup(ImGuiWindow* window);
IMGUI_API ImVec2 FindBestWindowPosForPopupEx(const ImVec2& ref_pos, const ImVec2& size, ImGuiDir* last_dir, const ImRect& r_outer, const ImRect& r_avoid, ImGuiPopupPositionPolicy policy = ImGuiPopupPositionPolicy_Default);
@@ -1194,26 +1728,52 @@ namespace ImGui
IMGUI_API void NavMoveRequestTryWrapping(ImGuiWindow* window, ImGuiNavMoveFlags move_flags);
IMGUI_API float GetNavInputAmount(ImGuiNavInput n, ImGuiInputReadMode mode);
IMGUI_API ImVec2 GetNavInputAmount2d(ImGuiNavDirSourceFlags dir_sources, ImGuiInputReadMode mode, float slow_factor = 0.0f, float fast_factor = 0.0f);
- IMGUI_API int CalcTypematicPressedRepeatAmount(float t, float t_prev, float repeat_delay, float repeat_rate);
+ IMGUI_API int CalcTypematicRepeatAmount(float t0, float t1, float repeat_delay, float repeat_rate);
IMGUI_API void ActivateItem(ImGuiID id); // Remotely activate a button, checkbox, tree node etc. given its unique ID. activation is queued and processed on the next frame when the item is encountered again.
- IMGUI_API void SetNavID(ImGuiID id, int nav_layer);
- IMGUI_API void SetNavIDWithRectRel(ImGuiID id, int nav_layer, const ImRect& rect_rel);
+ IMGUI_API void SetNavID(ImGuiID id, int nav_layer, ImGuiID focus_scope_id);
+ IMGUI_API void SetNavIDWithRectRel(ImGuiID id, int nav_layer, ImGuiID focus_scope_id, const ImRect& rect_rel);
+
+ // Focus scope (WIP)
+ IMGUI_API void PushFocusScope(ImGuiID id); // Note: this is storing in same stack as IDStack, so Push/Pop mismatch will be reported there.
+ IMGUI_API void PopFocusScope();
+ inline ImGuiID GetFocusScopeID() { ImGuiContext& g = *GImGui; return g.NavFocusScopeId; }
// Inputs
- inline bool IsKeyPressedMap(ImGuiKey key, bool repeat = true) { const int key_index = GImGui->IO.KeyMap[key]; return (key_index >= 0) ? IsKeyPressed(key_index, repeat) : false; }
- inline bool IsNavInputDown(ImGuiNavInput n) { return GImGui->IO.NavInputs[n] > 0.0f; }
- inline bool IsNavInputPressed(ImGuiNavInput n, ImGuiInputReadMode mode) { return GetNavInputAmount(n, mode) > 0.0f; }
- inline bool IsNavInputPressedAnyOfTwo(ImGuiNavInput n1, ImGuiNavInput n2, ImGuiInputReadMode mode) { return (GetNavInputAmount(n1, mode) + GetNavInputAmount(n2, mode)) > 0.0f; }
+ // FIXME: Eventually we should aim to move e.g. IsActiveIdUsingKey() into IsKeyXXX functions.
+ inline bool IsActiveIdUsingNavDir(ImGuiDir dir) { ImGuiContext& g = *GImGui; return (g.ActiveIdUsingNavDirMask & (1 << dir)) != 0; }
+ inline bool IsActiveIdUsingNavInput(ImGuiNavInput input) { ImGuiContext& g = *GImGui; return (g.ActiveIdUsingNavInputMask & (1 << input)) != 0; }
+ inline bool IsActiveIdUsingKey(ImGuiKey key) { ImGuiContext& g = *GImGui; IM_ASSERT(key < 64); return (g.ActiveIdUsingKeyInputMask & ((ImU64)1 << key)) != 0; }
+ IMGUI_API bool IsMouseDragPastThreshold(ImGuiMouseButton button, float lock_threshold = -1.0f);
+ inline bool IsKeyPressedMap(ImGuiKey key, bool repeat = true) { ImGuiContext& g = *GImGui; const int key_index = g.IO.KeyMap[key]; return (key_index >= 0) ? IsKeyPressed(key_index, repeat) : false; }
+ inline bool IsNavInputDown(ImGuiNavInput n) { ImGuiContext& g = *GImGui; return g.IO.NavInputs[n] > 0.0f; }
+ inline bool IsNavInputTest(ImGuiNavInput n, ImGuiInputReadMode rm) { return (GetNavInputAmount(n, rm) > 0.0f); }
// Drag and Drop
IMGUI_API bool BeginDragDropTargetCustom(const ImRect& bb, ImGuiID id);
IMGUI_API void ClearDragDrop();
IMGUI_API bool IsDragDropPayloadBeingAccepted();
- // New Columns API (FIXME-WIP)
+ // Internal Columns API (this is not exposed because we will encourage transitioning to the Tables api)
IMGUI_API void BeginColumns(const char* str_id, int count, ImGuiColumnsFlags flags = 0); // setup number of columns. use an identifier to distinguish multiple column sets. close with EndColumns().
IMGUI_API void EndColumns(); // close columns
- IMGUI_API void PushColumnClipRect(int column_index = -1);
+ IMGUI_API void PushColumnClipRect(int column_index);
+ IMGUI_API void PushColumnsBackground();
+ IMGUI_API void PopColumnsBackground();
+ IMGUI_API ImGuiID GetColumnsID(const char* str_id, int count);
+ IMGUI_API ImGuiColumns* FindOrCreateColumns(ImGuiWindow* window, ImGuiID id);
+ IMGUI_API float GetColumnOffsetFromNorm(const ImGuiColumns* columns, float offset_norm);
+ IMGUI_API float GetColumnNormFromOffset(const ImGuiColumns* columns, float offset);
+
+ // Tab Bars
+ IMGUI_API bool BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& bb, ImGuiTabBarFlags flags);
+ IMGUI_API ImGuiTabItem* TabBarFindTabByID(ImGuiTabBar* tab_bar, ImGuiID tab_id);
+ IMGUI_API void TabBarRemoveTab(ImGuiTabBar* tab_bar, ImGuiID tab_id);
+ IMGUI_API void TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab);
+ IMGUI_API void TabBarQueueChangeTabOrder(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, int dir);
+ IMGUI_API bool TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags);
+ IMGUI_API ImVec2 TabItemCalcSize(const char* label, bool has_close_button);
+ IMGUI_API void TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImU32 col);
+ IMGUI_API bool TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImVec2 frame_padding, const char* label, ImGuiID tab_id, ImGuiID close_button_id);
// Render helpers
// AVOID USING OUTSIDE OF IMGUI.CPP! NOT FOR PUBLIC CONSUMPTION. THOSE FUNCTIONS ARE A MESS. THEIR SIGNATURE AND BEHAVIOR WILL CHANGE, THEY NEED TO BE REFACTORED INTO SOMETHING DECENT.
@@ -1221,49 +1781,68 @@ namespace ImGui
IMGUI_API void RenderText(ImVec2 pos, const char* text, const char* text_end = NULL, bool hide_text_after_hash = true);
IMGUI_API void RenderTextWrapped(ImVec2 pos, const char* text, const char* text_end, float wrap_width);
IMGUI_API void RenderTextClipped(const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0,0), const ImRect* clip_rect = NULL);
+ IMGUI_API void RenderTextClippedEx(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, const char* text, const char* text_end, const ImVec2* text_size_if_known, const ImVec2& align = ImVec2(0, 0), const ImRect* clip_rect = NULL);
+ IMGUI_API void RenderTextEllipsis(ImDrawList* draw_list, const ImVec2& pos_min, const ImVec2& pos_max, float clip_max_x, float ellipsis_max_x, const char* text, const char* text_end, const ImVec2* text_size_if_known);
IMGUI_API void RenderFrame(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, bool border = true, float rounding = 0.0f);
IMGUI_API void RenderFrameBorder(ImVec2 p_min, ImVec2 p_max, float rounding = 0.0f);
IMGUI_API void RenderColorRectWithAlphaCheckerboard(ImVec2 p_min, ImVec2 p_max, ImU32 fill_col, float grid_step, ImVec2 grid_off, float rounding = 0.0f, int rounding_corners_flags = ~0);
- IMGUI_API void RenderArrow(ImVec2 pos, ImGuiDir dir, float scale = 1.0f);
- IMGUI_API void RenderBullet(ImVec2 pos);
IMGUI_API void RenderCheckMark(ImVec2 pos, ImU32 col, float sz);
IMGUI_API void RenderNavHighlight(const ImRect& bb, ImGuiID id, ImGuiNavHighlightFlags flags = ImGuiNavHighlightFlags_TypeDefault); // Navigation highlight
IMGUI_API const char* FindRenderedTextEnd(const char* text, const char* text_end = NULL); // Find the optional ## from which we stop displaying text.
IMGUI_API void LogRenderedText(const ImVec2* ref_pos, const char* text, const char* text_end = NULL);
// Render helpers (those functions don't access any ImGui state!)
- IMGUI_API void RenderMouseCursor(ImDrawList* draw_list, ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor = ImGuiMouseCursor_Arrow);
+ IMGUI_API void RenderArrow(ImDrawList* draw_list, ImVec2 pos, ImU32 col, ImGuiDir dir, float scale = 1.0f);
+ IMGUI_API void RenderBullet(ImDrawList* draw_list, ImVec2 pos, ImU32 col);
+ IMGUI_API void RenderMouseCursor(ImDrawList* draw_list, ImVec2 pos, float scale, ImGuiMouseCursor mouse_cursor, ImU32 col_fill, ImU32 col_border, ImU32 col_shadow);
IMGUI_API void RenderArrowPointingAt(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, ImGuiDir direction, ImU32 col);
IMGUI_API void RenderRectFilledRangeH(ImDrawList* draw_list, const ImRect& rect, ImU32 col, float x_start_norm, float x_end_norm, float rounding);
+#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
+ // [1.71: 2019/06/07: Updating prototypes of some of the internal functions. Leaving those for reference for a short while]
+ inline void RenderArrow(ImVec2 pos, ImGuiDir dir, float scale=1.0f) { ImGuiWindow* window = GetCurrentWindow(); RenderArrow(window->DrawList, pos, GetColorU32(ImGuiCol_Text), dir, scale); }
+ inline void RenderBullet(ImVec2 pos) { ImGuiWindow* window = GetCurrentWindow(); RenderBullet(window->DrawList, pos, GetColorU32(ImGuiCol_Text)); }
+#endif
+
// Widgets
+ IMGUI_API void TextEx(const char* text, const char* text_end = NULL, ImGuiTextFlags flags = 0);
IMGUI_API bool ButtonEx(const char* label, const ImVec2& size_arg = ImVec2(0,0), ImGuiButtonFlags flags = 0);
- IMGUI_API bool CloseButton(ImGuiID id, const ImVec2& pos, float radius);
+ IMGUI_API bool CloseButton(ImGuiID id, const ImVec2& pos);
IMGUI_API bool CollapseButton(ImGuiID id, const ImVec2& pos);
- IMGUI_API bool ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags);
- IMGUI_API void Scrollbar(ImGuiLayoutType direction);
- IMGUI_API void VerticalSeparator(); // Vertical separator, for menu bars (use current line height). Not exposed because it is misleading and it doesn't have an effect on regular layout.
+ IMGUI_API bool ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size_arg, ImGuiButtonFlags flags = 0);
+ IMGUI_API void Scrollbar(ImGuiAxis axis);
+ IMGUI_API bool ScrollbarEx(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float* p_scroll_v, float avail_v, float contents_v, ImDrawCornerFlags rounding_corners);
+ IMGUI_API ImGuiID GetWindowScrollbarID(ImGuiWindow* window, ImGuiAxis axis);
+ IMGUI_API ImGuiID GetWindowResizeID(ImGuiWindow* window, int n); // 0..3: corners, 4..7: borders
+ IMGUI_API void SeparatorEx(ImGuiSeparatorFlags flags);
// Widgets low-level behaviors
IMGUI_API bool ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags = 0);
- IMGUI_API bool DragBehavior(ImGuiID id, ImGuiDataType data_type, void* v, float v_speed, const void* v_min, const void* v_max, const char* format, float power);
- IMGUI_API bool SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* v, const void* v_min, const void* v_max, const char* format, float power, ImGuiSliderFlags flags, ImRect* out_grab_bb);
+ IMGUI_API bool DragBehavior(ImGuiID id, ImGuiDataType data_type, void* p_v, float v_speed, const void* p_min, const void* p_max, const char* format, float power, ImGuiDragFlags flags);
+ IMGUI_API bool SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* p_v, const void* p_min, const void* p_max, const char* format, float power, ImGuiSliderFlags flags, ImRect* out_grab_bb);
IMGUI_API bool SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float* size1, float* size2, float min_size1, float min_size2, float hover_extend = 0.0f, float hover_visibility_delay = 0.0f);
IMGUI_API bool TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* label, const char* label_end = NULL);
- IMGUI_API bool TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0); // Consume previous SetNextTreeNodeOpened() data, if any. May return true when logging
- IMGUI_API void TreePushRawID(ImGuiID id);
+ IMGUI_API bool TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags = 0); // Consume previous SetNextItemOpen() data, if any. May return true when logging
+ IMGUI_API void TreePushOverrideID(ImGuiID id);
- // Template functions are instantiated in imgui_widgets.cpp for a finite number of types.
+ // Template functions are instantiated in imgui_widgets.cpp for a finite number of types.
// To use them externally (for custom widget) you may need an "extern template" statement in your code in order to link to existing instances and silence Clang warnings (see #2036).
// e.g. " extern template IMGUI_API float RoundScalarWithFormatT<float, float>(const char* format, ImGuiDataType data_type, float v); "
- template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API bool DragBehaviorT(ImGuiDataType data_type, T* v, float v_speed, const T v_min, const T v_max, const char* format, float power);
- template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API bool SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, T* v, const T v_min, const T v_max, const char* format, float power, ImGuiSliderFlags flags, ImRect* out_grab_bb);
+ template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API bool DragBehaviorT(ImGuiDataType data_type, T* v, float v_speed, T v_min, T v_max, const char* format, float power, ImGuiDragFlags flags);
+ template<typename T, typename SIGNED_T, typename FLOAT_T> IMGUI_API bool SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, T* v, T v_min, T v_max, const char* format, float power, ImGuiSliderFlags flags, ImRect* out_grab_bb);
template<typename T, typename FLOAT_T> IMGUI_API float SliderCalcRatioFromValueT(ImGuiDataType data_type, T v, T v_min, T v_max, float power, float linear_zero_pos);
template<typename T, typename SIGNED_T> IMGUI_API T RoundScalarWithFormatT(const char* format, ImGuiDataType data_type, T v);
+ // Data type helpers
+ IMGUI_API const ImGuiDataTypeInfo* DataTypeGetInfo(ImGuiDataType data_type);
+ IMGUI_API int DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* p_data, const char* format);
+ IMGUI_API void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, void* arg_1, const void* arg_2);
+ IMGUI_API bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_buf, ImGuiDataType data_type, void* p_data, const char* format);
+
// InputText
- IMGUI_API bool InputTextEx(const char* label, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);
- IMGUI_API bool InputScalarAsWidgetReplacement(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* data_ptr, const char* format);
+ IMGUI_API bool InputTextEx(const char* label, const char* hint, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback = NULL, void* user_data = NULL);
+ IMGUI_API bool TempInputTextScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* p_data, const char* format);
+ inline bool TempInputTextIsActive(ImGuiID id) { ImGuiContext& g = *GImGui; return (g.ActiveId == id && g.TempInputTextId == id); }
// Color
IMGUI_API void ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags flags);
@@ -1271,27 +1850,68 @@ namespace ImGui
IMGUI_API void ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags flags);
// Plot
- IMGUI_API void PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size);
+ IMGUI_API void PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 frame_size);
// Shade functions (write over already created vertices)
IMGUI_API void ShadeVertsLinearColorGradientKeepAlpha(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, ImVec2 gradient_p0, ImVec2 gradient_p1, ImU32 col0, ImU32 col1);
IMGUI_API void ShadeVertsLinearUV(ImDrawList* draw_list, int vert_start_idx, int vert_end_idx, const ImVec2& a, const ImVec2& b, const ImVec2& uv_a, const ImVec2& uv_b, bool clamp);
+ // Garbage collection
+ IMGUI_API void GcCompactTransientWindowBuffers(ImGuiWindow* window);
+ IMGUI_API void GcAwakeTransientWindowBuffers(ImGuiWindow* window);
+
+ // Debug Tools
+ inline void DebugDrawItemRect(ImU32 col = IM_COL32(255,0,0,255)) { ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; GetForegroundDrawList(window)->AddRect(window->DC.LastItemRect.Min, window->DC.LastItemRect.Max, col); }
+ inline void DebugStartItemPicker() { ImGuiContext& g = *GImGui; g.DebugItemPickerActive = true; }
+
} // namespace ImGui
// ImFontAtlas internals
IMGUI_API bool ImFontAtlasBuildWithStbTruetype(ImFontAtlas* atlas);
IMGUI_API void ImFontAtlasBuildRegisterDefaultCustomRects(ImFontAtlas* atlas);
IMGUI_API void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* font_config, float ascent, float descent);
-IMGUI_API void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* spc);
+IMGUI_API void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque);
IMGUI_API void ImFontAtlasBuildFinish(ImFontAtlas* atlas);
IMGUI_API void ImFontAtlasBuildMultiplyCalcLookupTable(unsigned char out_table[256], float in_multiply_factor);
IMGUI_API void ImFontAtlasBuildMultiplyRectAlpha8(const unsigned char table[256], unsigned char* pixels, int x, int y, int w, int h, int stride);
-#ifdef __clang__
+// Debug Tools
+// Use 'Metrics->Tools->Item Picker' to break into the call-stack of a specific item.
+#ifndef IM_DEBUG_BREAK
+#if defined(__clang__)
+#define IM_DEBUG_BREAK() __builtin_debugtrap()
+#elif defined (_MSC_VER)
+#define IM_DEBUG_BREAK() __debugbreak()
+#else
+#define IM_DEBUG_BREAK() IM_ASSERT(0) // It is expected that you define IM_DEBUG_BREAK() into something that will break nicely in a debugger!
+#endif
+#endif // #ifndef IM_DEBUG_BREAK
+
+// Test Engine Hooks (imgui_tests)
+//#define IMGUI_ENABLE_TEST_ENGINE
+#ifdef IMGUI_ENABLE_TEST_ENGINE
+extern void ImGuiTestEngineHook_PreNewFrame(ImGuiContext* ctx);
+extern void ImGuiTestEngineHook_PostNewFrame(ImGuiContext* ctx);
+extern void ImGuiTestEngineHook_ItemAdd(ImGuiContext* ctx, const ImRect& bb, ImGuiID id);
+extern void ImGuiTestEngineHook_ItemInfo(ImGuiContext* ctx, ImGuiID id, const char* label, ImGuiItemStatusFlags flags);
+extern void ImGuiTestEngineHook_Log(ImGuiContext* ctx, const char* fmt, ...);
+#define IMGUI_TEST_ENGINE_ITEM_ADD(_BB, _ID) ImGuiTestEngineHook_ItemAdd(&g, _BB, _ID) // Register item bounding box
+#define IMGUI_TEST_ENGINE_ITEM_INFO(_ID, _LABEL, _FLAGS) ImGuiTestEngineHook_ItemInfo(&g, _ID, _LABEL, _FLAGS) // Register item label and status flags (optional)
+#define IMGUI_TEST_ENGINE_LOG(_FMT, ...) ImGuiTestEngineHook_Log(&g, _FMT, __VA_ARGS__) // Custom log entry from user land into test log
+#else
+#define IMGUI_TEST_ENGINE_ITEM_ADD(_BB, _ID) do { } while (0)
+#define IMGUI_TEST_ENGINE_ITEM_INFO(_ID, _LABEL, _FLAGS) do { } while (0)
+#define IMGUI_TEST_ENGINE_LOG(_FMT, ...) do { } while (0)
+#endif
+
+#if defined(__clang__)
#pragma clang diagnostic pop
+#elif defined(__GNUC__)
+#pragma GCC diagnostic pop
#endif
#ifdef _MSC_VER
#pragma warning (pop)
#endif
+
+#endif // #ifndef IMGUI_DISABLE
diff --git a/src/imgui/imgui_widgets.cpp b/src/imgui/imgui_widgets.cpp
index 7bf5938bd..6d2c95d99 100644
--- a/src/imgui/imgui_widgets.cpp
+++ b/src/imgui/imgui_widgets.cpp
@@ -1,4 +1,4 @@
-// dear imgui, v1.66 WIP
+// dear imgui, v1.75
// (widgets code)
/*
@@ -22,6 +22,9 @@ Index of this file:
// [SECTION] Widgets: PlotLines, PlotHistogram
// [SECTION] Widgets: Value helpers
// [SECTION] Widgets: MenuItem, BeginMenu, EndMenu, etc.
+// [SECTION] Widgets: BeginTabBar, EndTabBar, etc.
+// [SECTION] Widgets: BeginTabItem, EndTabItem, etc.
+// [SECTION] Widgets: Columns, BeginColumns, EndColumns, etc.
*/
@@ -30,12 +33,14 @@ Index of this file:
#endif
#include "imgui.h"
+#ifndef IMGUI_DISABLE
+
#ifndef IMGUI_DEFINE_MATH_OPERATORS
#define IMGUI_DEFINE_MATH_OPERATORS
#endif
#include "imgui_internal.h"
-#include <ctype.h> // toupper, isprint
+#include <ctype.h> // toupper
#if defined(_MSC_VER) && _MSC_VER <= 1500 // MSVC 2008 or earlier
#include <stddef.h> // intptr_t
#else
@@ -44,19 +49,29 @@ Index of this file:
// Visual Studio warnings
#ifdef _MSC_VER
-#pragma warning (disable: 4127) // condition expression is constant
-#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen
+#pragma warning (disable: 4127) // condition expression is constant
+#pragma warning (disable: 4996) // 'This function or variable may be unsafe': strcpy, strdup, sprintf, vsnprintf, sscanf, fopen
+#if defined(_MSC_VER) && _MSC_VER >= 1922 // MSVC 2019 16.2 or later
+#pragma warning (disable: 5054) // operator '|': deprecated between enumerations of different types
+#endif
#endif
// Clang/GCC warnings with -Weverything
-#ifdef __clang__
+#if defined(__clang__)
+#pragma clang diagnostic ignored "-Wold-style-cast" // warning : use of old-style cast // yes, they are more terse.
+#pragma clang diagnostic ignored "-Wfloat-equal" // warning : comparing floating point with == or != is unsafe // storing and comparing against same constants (typically 0.0f) is ok.
#pragma clang diagnostic ignored "-Wformat-nonliteral" // warning : format string is not a string literal // passing non-literal to vsnformat(). yes, user passing incorrect format strings can crash the code.
#pragma clang diagnostic ignored "-Wsign-conversion" // warning : implicit conversion changes signedness //
+#if __has_warning("-Wzero-as-null-pointer-constant")
+#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant" // warning : zero as null pointer constant // some standard header variations use #define NULL 0
+#endif
+#if __has_warning("-Wdouble-promotion")
+#pragma clang diagnostic ignored "-Wdouble-promotion" // warning: implicit conversion from 'float' to 'double' when passing argument to function // using printf() is a misery with this as C++ va_arg ellipsis changes float to double.
+#endif
#elif defined(__GNUC__)
+#pragma GCC diagnostic ignored "-Wpragmas" // warning: unknown option after '#pragma GCC diagnostic' kind
#pragma GCC diagnostic ignored "-Wformat-nonliteral" // warning: format not a string literal, format string not checked
-#if __GNUC__ >= 8
-#pragma GCC diagnostic ignored "-Wclass-memaccess" // warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
-#endif
+#pragma GCC diagnostic ignored "-Wclass-memaccess" // [__GNUC__ >= 8] warning: 'memset/memcpy' clearing/writing an object of type 'xxxx' with no trivial copy-assignment; use assignment or value-initialization instead
#endif
//-------------------------------------------------------------------------
@@ -64,33 +79,36 @@ Index of this file:
//-------------------------------------------------------------------------
// Those MIN/MAX values are not define because we need to point to them
-static const ImS32 IM_S32_MIN = INT_MIN; // (-2147483647 - 1), (0x80000000);
-static const ImS32 IM_S32_MAX = INT_MAX; // (2147483647), (0x7FFFFFFF)
-static const ImU32 IM_U32_MIN = 0;
-static const ImU32 IM_U32_MAX = UINT_MAX; // (0xFFFFFFFF)
+static const signed char IM_S8_MIN = -128;
+static const signed char IM_S8_MAX = 127;
+static const unsigned char IM_U8_MIN = 0;
+static const unsigned char IM_U8_MAX = 0xFF;
+static const signed short IM_S16_MIN = -32768;
+static const signed short IM_S16_MAX = 32767;
+static const unsigned short IM_U16_MIN = 0;
+static const unsigned short IM_U16_MAX = 0xFFFF;
+static const ImS32 IM_S32_MIN = INT_MIN; // (-2147483647 - 1), (0x80000000);
+static const ImS32 IM_S32_MAX = INT_MAX; // (2147483647), (0x7FFFFFFF)
+static const ImU32 IM_U32_MIN = 0;
+static const ImU32 IM_U32_MAX = UINT_MAX; // (0xFFFFFFFF)
#ifdef LLONG_MIN
-static const ImS64 IM_S64_MIN = LLONG_MIN; // (-9223372036854775807ll - 1ll);
-static const ImS64 IM_S64_MAX = LLONG_MAX; // (9223372036854775807ll);
+static const ImS64 IM_S64_MIN = LLONG_MIN; // (-9223372036854775807ll - 1ll);
+static const ImS64 IM_S64_MAX = LLONG_MAX; // (9223372036854775807ll);
#else
-static const ImS64 IM_S64_MIN = -9223372036854775807LL - 1;
-static const ImS64 IM_S64_MAX = 9223372036854775807LL;
+static const ImS64 IM_S64_MIN = -9223372036854775807LL - 1;
+static const ImS64 IM_S64_MAX = 9223372036854775807LL;
#endif
-static const ImU64 IM_U64_MIN = 0;
+static const ImU64 IM_U64_MIN = 0;
#ifdef ULLONG_MAX
-static const ImU64 IM_U64_MAX = ULLONG_MAX; // (0xFFFFFFFFFFFFFFFFull);
+static const ImU64 IM_U64_MAX = ULLONG_MAX; // (0xFFFFFFFFFFFFFFFFull);
#else
-static const ImU64 IM_U64_MAX = (2ULL * 9223372036854775807LL + 1);
+static const ImU64 IM_U64_MAX = (2ULL * 9223372036854775807LL + 1);
#endif
//-------------------------------------------------------------------------
// [SECTION] Forward Declarations
//-------------------------------------------------------------------------
-// Data Type helpers
-static inline int DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* data_ptr, const char* format);
-static void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, void* arg_1, const void* arg_2);
-static bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_buf, ImGuiDataType data_type, void* data_ptr, const char* format);
-
// For InputTextEx()
static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data);
static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end);
@@ -99,6 +117,7 @@ static ImVec2 InputTextCalcTextSizeW(const ImWchar* text_begin, const
//-------------------------------------------------------------------------
// [SECTION] Widgets: Text, etc.
//-------------------------------------------------------------------------
+// - TextEx() [Internal]
// - TextUnformatted()
// - Text()
// - TextV()
@@ -114,7 +133,7 @@ static ImVec2 InputTextCalcTextSizeW(const ImWchar* text_begin, const
// - BulletTextV()
//-------------------------------------------------------------------------
-void ImGui::TextUnformatted(const char* text, const char* text_end)
+void ImGui::TextEx(const char* text, const char* text_end, ImGuiTextFlags flags)
{
ImGuiWindow* window = GetCurrentWindow();
if (window->SkipItems)
@@ -126,9 +145,9 @@ void ImGui::TextUnformatted(const char* text, const char* text_end)
if (text_end == NULL)
text_end = text + strlen(text); // FIXME-OPT
- const ImVec2 text_pos(window->DC.CursorPos.x, window->DC.CursorPos.y + window->DC.CurrentLineTextBaseOffset);
+ const ImVec2 text_pos(window->DC.CursorPos.x, window->DC.CursorPos.y + window->DC.CurrLineTextBaseOffset);
const float wrap_pos_x = window->DC.TextWrapPos;
- const bool wrap_enabled = wrap_pos_x >= 0.0f;
+ const bool wrap_enabled = (wrap_pos_x >= 0.0f);
if (text_end - text > 2000 && !wrap_enabled)
{
// Long text!
@@ -138,71 +157,68 @@ void ImGui::TextUnformatted(const char* text, const char* text_end)
// - We use memchr(), pay attention that well optimized versions of those str/mem functions are much faster than a casually written loop.
const char* line = text;
const float line_height = GetTextLineHeight();
- const ImRect clip_rect = window->ClipRect;
ImVec2 text_size(0,0);
- if (text_pos.y <= clip_rect.Max.y)
+ // Lines to skip (can't skip when logging text)
+ ImVec2 pos = text_pos;
+ if (!g.LogEnabled)
{
- ImVec2 pos = text_pos;
-
- // Lines to skip (can't skip when logging text)
- if (!g.LogEnabled)
+ int lines_skippable = (int)((window->ClipRect.Min.y - text_pos.y) / line_height);
+ if (lines_skippable > 0)
{
- int lines_skippable = (int)((clip_rect.Min.y - text_pos.y) / line_height);
- if (lines_skippable > 0)
- {
- int lines_skipped = 0;
- while (line < text_end && lines_skipped < lines_skippable)
- {
- const char* line_end = (const char*)memchr(line, '\n', text_end - line);
- if (!line_end)
- line_end = text_end;
- line = line_end + 1;
- lines_skipped++;
- }
- pos.y += lines_skipped * line_height;
- }
- }
-
- // Lines to render
- if (line < text_end)
- {
- ImRect line_rect(pos, pos + ImVec2(FLT_MAX, line_height));
- while (line < text_end)
- {
- if (IsClippedEx(line_rect, 0, false))
- break;
-
- const char* line_end = (const char*)memchr(line, '\n', text_end - line);
- if (!line_end)
- line_end = text_end;
- const ImVec2 line_size = CalcTextSize(line, line_end, false);
- text_size.x = ImMax(text_size.x, line_size.x);
- RenderText(pos, line, line_end, false);
- line = line_end + 1;
- line_rect.Min.y += line_height;
- line_rect.Max.y += line_height;
- pos.y += line_height;
- }
-
- // Count remaining lines
int lines_skipped = 0;
- while (line < text_end)
+ while (line < text_end && lines_skipped < lines_skippable)
{
const char* line_end = (const char*)memchr(line, '\n', text_end - line);
if (!line_end)
line_end = text_end;
+ if ((flags & ImGuiTextFlags_NoWidthForLargeClippedText) == 0)
+ text_size.x = ImMax(text_size.x, CalcTextSize(line, line_end).x);
line = line_end + 1;
lines_skipped++;
}
pos.y += lines_skipped * line_height;
}
+ }
- text_size.y += (pos - text_pos).y;
+ // Lines to render
+ if (line < text_end)
+ {
+ ImRect line_rect(pos, pos + ImVec2(FLT_MAX, line_height));
+ while (line < text_end)
+ {
+ if (IsClippedEx(line_rect, 0, false))
+ break;
+
+ const char* line_end = (const char*)memchr(line, '\n', text_end - line);
+ if (!line_end)
+ line_end = text_end;
+ text_size.x = ImMax(text_size.x, CalcTextSize(line, line_end).x);
+ RenderText(pos, line, line_end, false);
+ line = line_end + 1;
+ line_rect.Min.y += line_height;
+ line_rect.Max.y += line_height;
+ pos.y += line_height;
+ }
+
+ // Count remaining lines
+ int lines_skipped = 0;
+ while (line < text_end)
+ {
+ const char* line_end = (const char*)memchr(line, '\n', text_end - line);
+ if (!line_end)
+ line_end = text_end;
+ if ((flags & ImGuiTextFlags_NoWidthForLargeClippedText) == 0)
+ text_size.x = ImMax(text_size.x, CalcTextSize(line, line_end).x);
+ line = line_end + 1;
+ lines_skipped++;
+ }
+ pos.y += lines_skipped * line_height;
}
+ text_size.y = (pos - text_pos).y;
ImRect bb(text_pos, text_pos + text_size);
- ItemSize(bb);
+ ItemSize(text_size, 0.0f);
ItemAdd(bb, 0);
}
else
@@ -210,9 +226,8 @@ void ImGui::TextUnformatted(const char* text, const char* text_end)
const float wrap_width = wrap_enabled ? CalcWrapWidthForPos(window->DC.CursorPos, wrap_pos_x) : 0.0f;
const ImVec2 text_size = CalcTextSize(text_begin, text_end, false, wrap_width);
- // Account of baseline offset
ImRect bb(text_pos, text_pos + text_size);
- ItemSize(text_size);
+ ItemSize(text_size, 0.0f);
if (!ItemAdd(bb, 0))
return;
@@ -221,6 +236,11 @@ void ImGui::TextUnformatted(const char* text, const char* text_end)
}
}
+void ImGui::TextUnformatted(const char* text, const char* text_end)
+{
+ TextEx(text, text_end, ImGuiTextFlags_NoWidthForLargeClippedText);
+}
+
void ImGui::Text(const char* fmt, ...)
{
va_list args;
@@ -237,7 +257,7 @@ void ImGui::TextV(const char* fmt, va_list args)
ImGuiContext& g = *GImGui;
const char* text_end = g.TempBuffer + ImFormatStringV(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), fmt, args);
- TextUnformatted(g.TempBuffer, text_end);
+ TextEx(g.TempBuffer, text_end, ImGuiTextFlags_NoWidthForLargeClippedText);
}
void ImGui::TextColored(const ImVec4& col, const char* fmt, ...)
@@ -280,10 +300,13 @@ void ImGui::TextWrapped(const char* fmt, ...)
void ImGui::TextWrappedV(const char* fmt, va_list args)
{
- bool need_wrap = (GImGui->CurrentWindow->DC.TextWrapPos < 0.0f); // Keep existing wrap position is one ia already set
- if (need_wrap) PushTextWrapPos(0.0f);
+ ImGuiWindow* window = GetCurrentWindow();
+ bool need_backup = (window->DC.TextWrapPos < 0.0f); // Keep existing wrap position if one is already set
+ if (need_backup)
+ PushTextWrapPos(0.0f);
TextV(fmt, args);
- if (need_wrap) PopTextWrapPos();
+ if (need_backup)
+ PopTextWrapPos();
}
void ImGui::LabelText(const char* label, const char* fmt, ...)
@@ -341,16 +364,18 @@ void ImGui::BulletTextV(const char* fmt, va_list args)
const char* text_begin = g.TempBuffer;
const char* text_end = text_begin + ImFormatStringV(g.TempBuffer, IM_ARRAYSIZE(g.TempBuffer), fmt, args);
const ImVec2 label_size = CalcTextSize(text_begin, text_end, false);
- const float text_base_offset_y = ImMax(0.0f, window->DC.CurrentLineTextBaseOffset); // Latch before ItemSize changes it
- const float line_height = ImMax(ImMin(window->DC.CurrentLineSize.y, g.FontSize + g.Style.FramePadding.y*2), g.FontSize);
- const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(g.FontSize + (label_size.x > 0.0f ? (label_size.x + style.FramePadding.x*2) : 0.0f), ImMax(line_height, label_size.y))); // Empty text doesn't add padding
- ItemSize(bb);
+ const ImVec2 total_size = ImVec2(g.FontSize + (label_size.x > 0.0f ? (label_size.x + style.FramePadding.x * 2) : 0.0f), label_size.y); // Empty text doesn't add padding
+ ImVec2 pos = window->DC.CursorPos;
+ pos.y += window->DC.CurrLineTextBaseOffset;
+ ItemSize(total_size, 0.0f);
+ const ImRect bb(pos, pos + total_size);
if (!ItemAdd(bb, 0))
return;
// Render
- RenderBullet(bb.Min + ImVec2(style.FramePadding.x + g.FontSize*0.5f, line_height*0.5f));
- RenderText(bb.Min+ImVec2(g.FontSize + style.FramePadding.x*2, text_base_offset_y), text_begin, text_end, false);
+ ImU32 text_col = GetColorU32(ImGuiCol_Text);
+ RenderBullet(window->DrawList, bb.Min + ImVec2(style.FramePadding.x + g.FontSize*0.5f, g.FontSize*0.5f), text_col);
+ RenderText(bb.Min + ImVec2(g.FontSize + style.FramePadding.x * 2, 0.0f), text_begin, text_end, false);
}
//-------------------------------------------------------------------------
@@ -363,6 +388,7 @@ void ImGui::BulletTextV(const char* fmt, va_list args)
// - ArrowButton()
// - CloseButton() [Internal]
// - CollapseButton() [Internal]
+// - ScrollbarEx() [Internal]
// - Scrollbar() [Internal]
// - Image()
// - ImageButton()
@@ -373,6 +399,60 @@ void ImGui::BulletTextV(const char* fmt, va_list args)
// - Bullet()
//-------------------------------------------------------------------------
+// The ButtonBehavior() function is key to many interactions and used by many/most widgets.
+// Because we handle so many cases (keyboard/gamepad navigation, drag and drop) and many specific behavior (via ImGuiButtonFlags_),
+// this code is a little complex.
+// By far the most common path is interacting with the Mouse using the default ImGuiButtonFlags_PressedOnClickRelease button behavior.
+// See the series of events below and the corresponding state reported by dear imgui:
+//------------------------------------------------------------------------------------------------------------------------------------------------
+// with PressedOnClickRelease: return-value IsItemHovered() IsItemActive() IsItemActivated() IsItemDeactivated() IsItemClicked()
+// Frame N+0 (mouse is outside bb) - - - - - -
+// Frame N+1 (mouse moves inside bb) - true - - - -
+// Frame N+2 (mouse button is down) - true true true - true
+// Frame N+3 (mouse button is down) - true true - - -
+// Frame N+4 (mouse moves outside bb) - - true - - -
+// Frame N+5 (mouse moves inside bb) - true true - - -
+// Frame N+6 (mouse button is released) true true - - true -
+// Frame N+7 (mouse button is released) - true - - - -
+// Frame N+8 (mouse moves outside bb) - - - - - -
+//------------------------------------------------------------------------------------------------------------------------------------------------
+// with PressedOnClick: return-value IsItemHovered() IsItemActive() IsItemActivated() IsItemDeactivated() IsItemClicked()
+// Frame N+2 (mouse button is down) true true true true - true
+// Frame N+3 (mouse button is down) - true true - - -
+// Frame N+6 (mouse button is released) - true - - true -
+// Frame N+7 (mouse button is released) - true - - - -
+//------------------------------------------------------------------------------------------------------------------------------------------------
+// with PressedOnRelease: return-value IsItemHovered() IsItemActive() IsItemActivated() IsItemDeactivated() IsItemClicked()
+// Frame N+2 (mouse button is down) - true - - - true
+// Frame N+3 (mouse button is down) - true - - - -
+// Frame N+6 (mouse button is released) true true - - - -
+// Frame N+7 (mouse button is released) - true - - - -
+//------------------------------------------------------------------------------------------------------------------------------------------------
+// with PressedOnDoubleClick: return-value IsItemHovered() IsItemActive() IsItemActivated() IsItemDeactivated() IsItemClicked()
+// Frame N+0 (mouse button is down) - true - - - true
+// Frame N+1 (mouse button is down) - true - - - -
+// Frame N+2 (mouse button is released) - true - - - -
+// Frame N+3 (mouse button is released) - true - - - -
+// Frame N+4 (mouse button is down) true true true true - true
+// Frame N+5 (mouse button is down) - true true - - -
+// Frame N+6 (mouse button is released) - true - - true -
+// Frame N+7 (mouse button is released) - true - - - -
+//------------------------------------------------------------------------------------------------------------------------------------------------
+// Note that some combinations are supported,
+// - PressedOnDragDropHold can generally be associated with any flag.
+// - PressedOnDoubleClick can be associated by PressedOnClickRelease/PressedOnRelease, in which case the second release event won't be reported.
+//------------------------------------------------------------------------------------------------------------------------------------------------
+// The behavior of the return-value changes when ImGuiButtonFlags_Repeat is set:
+// Repeat+ Repeat+ Repeat+ Repeat+
+// PressedOnClickRelease PressedOnClick PressedOnRelease PressedOnDoubleClick
+//-------------------------------------------------------------------------------------------------------------------------------------------------
+// Frame N+0 (mouse button is down) - true - true
+// ... - - - -
+// Frame N + RepeatDelay true true - true
+// ... - - - -
+// Frame N + RepeatDelay + RepeatRate*N true true - true
+//-------------------------------------------------------------------------------------------------------------------------------------------------
+
bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool* out_held, ImGuiButtonFlags flags)
{
ImGuiContext& g = *GImGui;
@@ -386,14 +466,24 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool
return false;
}
- // Default behavior requires click+release on same spot
- if ((flags & (ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_PressedOnRelease | ImGuiButtonFlags_PressedOnDoubleClick)) == 0)
- flags |= ImGuiButtonFlags_PressedOnClickRelease;
+ // Default only reacts to left mouse button
+ if ((flags & ImGuiButtonFlags_MouseButtonMask_) == 0)
+ flags |= ImGuiButtonFlags_MouseButtonDefault_;
+
+ // Default behavior requires click + release inside bounding box
+ if ((flags & ImGuiButtonFlags_PressedOnMask_) == 0)
+ flags |= ImGuiButtonFlags_PressedOnDefault_;
ImGuiWindow* backup_hovered_window = g.HoveredWindow;
- if ((flags & ImGuiButtonFlags_FlattenChildren) && g.HoveredRootWindow == window)
+ const bool flatten_hovered_children = (flags & ImGuiButtonFlags_FlattenChildren) && g.HoveredRootWindow == window;
+ if (flatten_hovered_children)
g.HoveredWindow = window;
+#ifdef IMGUI_ENABLE_TEST_ENGINE
+ if (id != 0 && window->DC.LastItemId != id)
+ ImGuiTestEngineHook_ItemAdd(&g, bb, id);
+#endif
+
bool pressed = false;
bool hovered = ItemHoverable(bb, id);
@@ -407,58 +497,69 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool
{
hovered = true;
SetHoveredID(id);
- if (CalcTypematicPressedRepeatAmount(g.HoveredIdTimer + 0.0001f, g.HoveredIdTimer + 0.0001f - g.IO.DeltaTime, 0.01f, 0.70f)) // FIXME: Our formula for CalcTypematicPressedRepeatAmount() is fishy
+ if (CalcTypematicRepeatAmount(g.HoveredIdTimer + 0.0001f - g.IO.DeltaTime, g.HoveredIdTimer + 0.0001f, 0.70f, 0.00f))
{
pressed = true;
FocusWindow(window);
}
}
- if ((flags & ImGuiButtonFlags_FlattenChildren) && g.HoveredRootWindow == window)
+ if (flatten_hovered_children)
g.HoveredWindow = backup_hovered_window;
// AllowOverlap mode (rarely used) requires previous frame HoveredId to be null or to match. This allows using patterns where a later submitted widget overlaps a previous one.
if (hovered && (flags & ImGuiButtonFlags_AllowItemOverlap) && (g.HoveredIdPreviousFrame != id && g.HoveredIdPreviousFrame != 0))
hovered = false;
- // Mouse
+ // Mouse handling
if (hovered)
{
if (!(flags & ImGuiButtonFlags_NoKeyModifiers) || (!g.IO.KeyCtrl && !g.IO.KeyShift && !g.IO.KeyAlt))
{
- // | CLICKING | HOLDING with ImGuiButtonFlags_Repeat
- // PressedOnClickRelease | <on release>* | <on repeat> <on repeat> .. (NOT on release) <-- MOST COMMON! (*) only if both click/release were over bounds
- // PressedOnClick | <on click> | <on click> <on repeat> <on repeat> ..
- // PressedOnRelease | <on release> | <on repeat> <on repeat> .. (NOT on release)
- // PressedOnDoubleClick | <on dclick> | <on dclick> <on repeat> <on repeat> ..
- // FIXME-NAV: We don't honor those different behaviors.
- if ((flags & ImGuiButtonFlags_PressedOnClickRelease) && g.IO.MouseClicked[0])
- {
- SetActiveID(id, window);
- if (!(flags & ImGuiButtonFlags_NoNavFocus))
- SetFocusID(id, window);
- FocusWindow(window);
- }
- if (((flags & ImGuiButtonFlags_PressedOnClick) && g.IO.MouseClicked[0]) || ((flags & ImGuiButtonFlags_PressedOnDoubleClick) && g.IO.MouseDoubleClicked[0]))
+ // Poll buttons
+ int mouse_button_clicked = -1;
+ int mouse_button_released = -1;
+ if ((flags & ImGuiButtonFlags_MouseButtonLeft) && g.IO.MouseClicked[0]) { mouse_button_clicked = 0; }
+ else if ((flags & ImGuiButtonFlags_MouseButtonRight) && g.IO.MouseClicked[1]) { mouse_button_clicked = 1; }
+ else if ((flags & ImGuiButtonFlags_MouseButtonMiddle) && g.IO.MouseClicked[2]) { mouse_button_clicked = 2; }
+ if ((flags & ImGuiButtonFlags_MouseButtonLeft) && g.IO.MouseReleased[0]) { mouse_button_released = 0; }
+ else if ((flags & ImGuiButtonFlags_MouseButtonRight) && g.IO.MouseReleased[1]) { mouse_button_released = 1; }
+ else if ((flags & ImGuiButtonFlags_MouseButtonMiddle) && g.IO.MouseReleased[2]) { mouse_button_released = 2; }
+
+ if (mouse_button_clicked != -1 && g.ActiveId != id)
{
- pressed = true;
- if (flags & ImGuiButtonFlags_NoHoldingActiveID)
- ClearActiveID();
- else
- SetActiveID(id, window); // Hold on ID
- FocusWindow(window);
+ if (flags & (ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnClickReleaseAnywhere))
+ {
+ SetActiveID(id, window);
+ g.ActiveIdMouseButton = mouse_button_clicked;
+ if (!(flags & ImGuiButtonFlags_NoNavFocus))
+ SetFocusID(id, window);
+ FocusWindow(window);
+ }
+ if ((flags & ImGuiButtonFlags_PressedOnClick) || ((flags & ImGuiButtonFlags_PressedOnDoubleClick) && g.IO.MouseDoubleClicked[mouse_button_clicked]))
+ {
+ pressed = true;
+ if (flags & ImGuiButtonFlags_NoHoldingActiveId)
+ ClearActiveID();
+ else
+ SetActiveID(id, window); // Hold on ID
+ g.ActiveIdMouseButton = mouse_button_clicked;
+ FocusWindow(window);
+ }
}
- if ((flags & ImGuiButtonFlags_PressedOnRelease) && g.IO.MouseReleased[0])
+ if ((flags & ImGuiButtonFlags_PressedOnRelease) && mouse_button_released != -1)
{
- if (!((flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[0] >= g.IO.KeyRepeatDelay)) // Repeat mode trumps <on release>
+ // Repeat mode trumps on release behavior
+ if (!((flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[mouse_button_released] >= g.IO.KeyRepeatDelay))
pressed = true;
ClearActiveID();
}
// 'Repeat' mode acts when held regardless of _PressedOn flags (see table above).
// Relies on repeat logic of IsMouseClicked() but we may as well do it ourselves if we end up exposing finer RepeatDelay/RepeatRate settings.
- if ((flags & ImGuiButtonFlags_Repeat) && g.ActiveId == id && g.IO.MouseDownDuration[0] > 0.0f && IsMouseClicked(0, true))
- pressed = true;
+ if (g.ActiveId == id && (flags & ImGuiButtonFlags_Repeat))
+ if (g.IO.MouseDownDuration[g.ActiveIdMouseButton] > 0.0f && IsMouseClicked(g.ActiveIdMouseButton, true))
+ pressed = true;
}
if (pressed)
@@ -468,12 +569,12 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool
// Gamepad/Keyboard navigation
// We report navigated item as hovered but we don't set g.HoveredId to not interfere with mouse.
if (g.NavId == id && !g.NavDisableHighlight && g.NavDisableMouseHover && (g.ActiveId == 0 || g.ActiveId == id || g.ActiveId == window->MoveId))
- hovered = true;
-
+ if (!(flags & ImGuiButtonFlags_NoHoveredOnNav))
+ hovered = true;
if (g.NavActivateDownId == id)
{
bool nav_activated_by_code = (g.NavActivateId == id);
- bool nav_activated_by_inputs = IsNavInputPressed(ImGuiNavInput_Activate, (flags & ImGuiButtonFlags_Repeat) ? ImGuiInputReadMode_Repeat : ImGuiInputReadMode_Pressed);
+ bool nav_activated_by_inputs = IsNavInputTest(ImGuiNavInput_Activate, (flags & ImGuiButtonFlags_Repeat) ? ImGuiInputReadMode_Repeat : ImGuiInputReadMode_Pressed);
if (nav_activated_by_code || nav_activated_by_inputs)
pressed = true;
if (nav_activated_by_code || nav_activated_by_inputs || g.ActiveId == id)
@@ -481,9 +582,8 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool
// Set active id so it can be queried by user via IsItemActive(), equivalent of holding the mouse button.
g.NavActivateId = id; // This is so SetActiveId assign a Nav source
SetActiveID(id, window);
- if (!(flags & ImGuiButtonFlags_NoNavFocus))
+ if ((nav_activated_by_code || nav_activated_by_inputs) && !(flags & ImGuiButtonFlags_NoNavFocus))
SetFocusID(id, window);
- g.ActiveIdAllowNavDirFlags = (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right) | (1 << ImGuiDir_Up) | (1 << ImGuiDir_Down);
}
}
@@ -494,16 +594,24 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool
{
if (g.ActiveIdIsJustActivated)
g.ActiveIdClickOffset = g.IO.MousePos - bb.Min;
- if (g.IO.MouseDown[0])
+
+ const int mouse_button = g.ActiveIdMouseButton;
+ IM_ASSERT(mouse_button >= 0 && mouse_button < ImGuiMouseButton_COUNT);
+ if (g.IO.MouseDown[mouse_button])
{
held = true;
}
else
{
- if (hovered && (flags & ImGuiButtonFlags_PressedOnClickRelease))
- if (!((flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[0] >= g.IO.KeyRepeatDelay)) // Repeat mode trumps <on release>
- if (!g.DragDropActive)
- pressed = true;
+ bool release_in = hovered && (flags & ImGuiButtonFlags_PressedOnClickRelease) != 0;
+ bool release_anywhere = (flags & ImGuiButtonFlags_PressedOnClickReleaseAnywhere) != 0;
+ if ((release_in || release_anywhere) && !g.DragDropActive)
+ {
+ bool is_double_click_release = (flags & ImGuiButtonFlags_PressedOnDoubleClick) && g.IO.MouseDownWasDoubleClick[mouse_button];
+ bool is_repeating_already = (flags & ImGuiButtonFlags_Repeat) && g.IO.MouseDownDurationPrev[mouse_button] >= g.IO.KeyRepeatDelay; // Repeat mode trumps <on release>
+ if (!is_double_click_release && !is_repeating_already)
+ pressed = true;
+ }
ClearActiveID();
}
if (!(flags & ImGuiButtonFlags_NoNavFocus))
@@ -514,6 +622,8 @@ bool ImGui::ButtonBehavior(const ImRect& bb, ImGuiID id, bool* out_hovered, bool
if (g.NavActivateDownId != id)
ClearActiveID();
}
+ if (pressed)
+ g.ActiveIdHasBeenPressedBefore = true;
}
if (out_hovered) *out_hovered = hovered;
@@ -534,12 +644,12 @@ bool ImGui::ButtonEx(const char* label, const ImVec2& size_arg, ImGuiButtonFlags
const ImVec2 label_size = CalcTextSize(label, NULL, true);
ImVec2 pos = window->DC.CursorPos;
- if ((flags & ImGuiButtonFlags_AlignTextBaseLine) && style.FramePadding.y < window->DC.CurrentLineTextBaseOffset) // Try to vertically align buttons that are smaller/have no padding so that text baseline matches (bit hacky, since it shouldn't be a flag)
- pos.y += window->DC.CurrentLineTextBaseOffset - style.FramePadding.y;
+ if ((flags & ImGuiButtonFlags_AlignTextBaseLine) && style.FramePadding.y < window->DC.CurrLineTextBaseOffset) // Try to vertically align buttons that are smaller/have no padding so that text baseline matches (bit hacky, since it shouldn't be a flag)
+ pos.y += window->DC.CurrLineTextBaseOffset - style.FramePadding.y;
ImVec2 size = CalcItemSize(size_arg, label_size.x + style.FramePadding.x * 2.0f, label_size.y + style.FramePadding.y * 2.0f);
const ImRect bb(pos, pos + size);
- ItemSize(bb, style.FramePadding.y);
+ ItemSize(size, style.FramePadding.y);
if (!ItemAdd(bb, id))
return false;
@@ -547,8 +657,6 @@ bool ImGui::ButtonEx(const char* label, const ImVec2& size_arg, ImGuiButtonFlags
flags |= ImGuiButtonFlags_Repeat;
bool hovered, held;
bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags);
- if (pressed)
- MarkItemEdited(id);
// Render
const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button);
@@ -560,6 +668,7 @@ bool ImGui::ButtonEx(const char* label, const ImVec2& size_arg, ImGuiButtonFlags
//if (pressed && !(flags & ImGuiButtonFlags_DontClosePopups) && (window->Flags & ImGuiWindowFlags_Popup))
// CloseCurrentPopup();
+ IMGUI_TEST_ENGINE_ITEM_INFO(id, label, window->DC.LastItemStatusFlags);
return pressed;
}
@@ -593,7 +702,7 @@ bool ImGui::InvisibleButton(const char* str_id, const ImVec2& size_arg)
const ImGuiID id = window->GetID(str_id);
ImVec2 size = CalcItemSize(size_arg, 0.0f, 0.0f);
const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size);
- ItemSize(bb);
+ ItemSize(size);
if (!ItemAdd(bb, id))
return false;
@@ -613,7 +722,7 @@ bool ImGui::ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size, ImGuiBu
const ImGuiID id = window->GetID(str_id);
const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size);
const float default_size = GetFrameHeight();
- ItemSize(bb, (size.y >= default_size) ? g.Style.FramePadding.y : 0.0f);
+ ItemSize(size, (size.y >= default_size) ? g.Style.FramePadding.y : -1.0f);
if (!ItemAdd(bb, id))
return false;
@@ -624,10 +733,11 @@ bool ImGui::ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size, ImGuiBu
bool pressed = ButtonBehavior(bb, id, &hovered, &held, flags);
// Render
- const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button);
+ const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button);
+ const ImU32 text_col = GetColorU32(ImGuiCol_Text);
RenderNavHighlight(bb, id);
- RenderFrame(bb.Min, bb.Max, col, true, g.Style.FrameRounding);
- RenderArrow(bb.Min + ImVec2(ImMax(0.0f, (size.x - g.FontSize) * 0.5f), ImMax(0.0f, (size.y - g.FontSize) * 0.5f)), dir);
+ RenderFrame(bb.Min, bb.Max, bg_col, true, g.Style.FrameRounding);
+ RenderArrow(window->DrawList, bb.Min + ImVec2(ImMax(0.0f, (size.x - g.FontSize) * 0.5f), ImMax(0.0f, (size.y - g.FontSize) * 0.5f)), text_col, dir);
return pressed;
}
@@ -635,18 +745,18 @@ bool ImGui::ArrowButtonEx(const char* str_id, ImGuiDir dir, ImVec2 size, ImGuiBu
bool ImGui::ArrowButton(const char* str_id, ImGuiDir dir)
{
float sz = GetFrameHeight();
- return ArrowButtonEx(str_id, dir, ImVec2(sz, sz), 0);
+ return ArrowButtonEx(str_id, dir, ImVec2(sz, sz), ImGuiButtonFlags_None);
}
// Button to close a window
-bool ImGui::CloseButton(ImGuiID id, const ImVec2& pos, float radius)
+bool ImGui::CloseButton(ImGuiID id, const ImVec2& pos)//, float size)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
// We intentionally allow interaction when clipped so that a mechanical Alt,Right,Validate sequence close a window.
// (this isn't the regular behavior of buttons, but it doesn't affect the user much because navigation tends to keep items visible).
- const ImRect bb(pos - ImVec2(radius,radius), pos + ImVec2(radius,radius));
+ const ImRect bb(pos, pos + ImVec2(g.FontSize, g.FontSize) + g.Style.FramePadding * 2.0f);
bool is_clipped = !ItemAdd(bb, id);
bool hovered, held;
@@ -655,11 +765,12 @@ bool ImGui::CloseButton(ImGuiID id, const ImVec2& pos, float radius)
return pressed;
// Render
+ ImU32 col = GetColorU32(held ? ImGuiCol_ButtonActive : ImGuiCol_ButtonHovered);
ImVec2 center = bb.GetCenter();
if (hovered)
- window->DrawList->AddCircleFilled(center, ImMax(2.0f, radius), GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : ImGuiCol_ButtonHovered), 9);
+ window->DrawList->AddCircleFilled(center, ImMax(2.0f, g.FontSize * 0.5f + 1.0f), col, 12);
- float cross_extent = (radius * 0.7071f) - 1.0f;
+ float cross_extent = g.FontSize * 0.5f * 0.7071f - 1.0f;
ImU32 cross_col = GetColorU32(ImGuiCol_Text);
center -= ImVec2(0.5f, 0.5f);
window->DrawList->AddLine(center + ImVec2(+cross_extent,+cross_extent), center + ImVec2(-cross_extent,-cross_extent), cross_col, 1.0f);
@@ -678,126 +789,153 @@ bool ImGui::CollapseButton(ImGuiID id, const ImVec2& pos)
bool hovered, held;
bool pressed = ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_None);
- ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button);
+ // Render
+ ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_ButtonActive : hovered ? ImGuiCol_ButtonHovered : ImGuiCol_Button);
+ ImU32 text_col = GetColorU32(ImGuiCol_Text);
+ ImVec2 center = bb.GetCenter();
if (hovered || held)
- window->DrawList->AddCircleFilled(bb.GetCenter() + ImVec2(0.0f, -0.5f), g.FontSize * 0.5f + 1.0f, col, 9);
- RenderArrow(bb.Min + g.Style.FramePadding, window->Collapsed ? ImGuiDir_Right : ImGuiDir_Down, 1.0f);
+ window->DrawList->AddCircleFilled(center/*+ ImVec2(0.0f, -0.5f)*/, g.FontSize * 0.5f + 1.0f, bg_col, 12);
+ RenderArrow(window->DrawList, bb.Min + g.Style.FramePadding, text_col, window->Collapsed ? ImGuiDir_Right : ImGuiDir_Down, 1.0f);
// Switch to moving the window after mouse is moved beyond the initial drag threshold
- if (IsItemActive() && IsMouseDragging())
+ if (IsItemActive() && IsMouseDragging(0))
StartMouseMovingWindow(window);
return pressed;
}
+ImGuiID ImGui::GetWindowScrollbarID(ImGuiWindow* window, ImGuiAxis axis)
+{
+ return window->GetIDNoKeepAlive(axis == ImGuiAxis_X ? "#SCROLLX" : "#SCROLLY");
+}
+
// Vertical/Horizontal scrollbar
// The entire piece of code below is rather confusing because:
// - We handle absolute seeking (when first clicking outside the grab) and relative manipulation (afterward or when clicking inside the grab)
// - We store values as normalized ratio and in a form that allows the window content to change while we are holding on a scrollbar
// - We handle both horizontal and vertical scrollbars, which makes the terminology not ideal.
-void ImGui::Scrollbar(ImGuiLayoutType direction)
+// Still, the code should probably be made simpler..
+bool ImGui::ScrollbarEx(const ImRect& bb_frame, ImGuiID id, ImGuiAxis axis, float* p_scroll_v, float size_avail_v, float size_contents_v, ImDrawCornerFlags rounding_corners)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
+ if (window->SkipItems)
+ return false;
- const bool horizontal = (direction == ImGuiLayoutType_Horizontal);
- const ImGuiStyle& style = g.Style;
- const ImGuiID id = window->GetID(horizontal ? "#SCROLLX" : "#SCROLLY");
+ const float bb_frame_width = bb_frame.GetWidth();
+ const float bb_frame_height = bb_frame.GetHeight();
+ if (bb_frame_width <= 0.0f || bb_frame_height <= 0.0f)
+ return false;
- // Render background
- bool other_scrollbar = (horizontal ? window->ScrollbarY : window->ScrollbarX);
- float other_scrollbar_size_w = other_scrollbar ? style.ScrollbarSize : 0.0f;
- const ImRect window_rect = window->Rect();
- const float border_size = window->WindowBorderSize;
- ImRect bb = horizontal
- ? ImRect(window->Pos.x + border_size, window_rect.Max.y - style.ScrollbarSize, window_rect.Max.x - other_scrollbar_size_w - border_size, window_rect.Max.y - border_size)
- : ImRect(window_rect.Max.x - style.ScrollbarSize, window->Pos.y + border_size, window_rect.Max.x - border_size, window_rect.Max.y - other_scrollbar_size_w - border_size);
- if (!horizontal)
- bb.Min.y += window->TitleBarHeight() + ((window->Flags & ImGuiWindowFlags_MenuBar) ? window->MenuBarHeight() : 0.0f);
- if (bb.GetWidth() <= 0.0f || bb.GetHeight() <= 0.0f)
- return;
+ // When we are too small, start hiding and disabling the grab (this reduce visual noise on very small window and facilitate using the resize grab)
+ float alpha = 1.0f;
+ if ((axis == ImGuiAxis_Y) && bb_frame_height < g.FontSize + g.Style.FramePadding.y * 2.0f)
+ alpha = ImSaturate((bb_frame_height - g.FontSize) / (g.Style.FramePadding.y * 2.0f));
+ if (alpha <= 0.0f)
+ return false;
- int window_rounding_corners;
- if (horizontal)
- window_rounding_corners = ImDrawCornerFlags_BotLeft | (other_scrollbar ? 0 : ImDrawCornerFlags_BotRight);
- else
- window_rounding_corners = (((window->Flags & ImGuiWindowFlags_NoTitleBar) && !(window->Flags & ImGuiWindowFlags_MenuBar)) ? ImDrawCornerFlags_TopRight : 0) | (other_scrollbar ? 0 : ImDrawCornerFlags_BotRight);
- window->DrawList->AddRectFilled(bb.Min, bb.Max, GetColorU32(ImGuiCol_ScrollbarBg), window->WindowRounding, window_rounding_corners);
- bb.Expand(ImVec2(-ImClamp((float)(int)((bb.Max.x - bb.Min.x - 2.0f) * 0.5f), 0.0f, 3.0f), -ImClamp((float)(int)((bb.Max.y - bb.Min.y - 2.0f) * 0.5f), 0.0f, 3.0f)));
+ const ImGuiStyle& style = g.Style;
+ const bool allow_interaction = (alpha >= 1.0f);
+ const bool horizontal = (axis == ImGuiAxis_X);
+
+ ImRect bb = bb_frame;
+ bb.Expand(ImVec2(-ImClamp(IM_FLOOR((bb_frame_width - 2.0f) * 0.5f), 0.0f, 3.0f), -ImClamp(IM_FLOOR((bb_frame_height - 2.0f) * 0.5f), 0.0f, 3.0f)));
// V denote the main, longer axis of the scrollbar (= height for a vertical scrollbar)
- float scrollbar_size_v = horizontal ? bb.GetWidth() : bb.GetHeight();
- float scroll_v = horizontal ? window->Scroll.x : window->Scroll.y;
- float win_size_avail_v = (horizontal ? window->SizeFull.x : window->SizeFull.y) - other_scrollbar_size_w;
- float win_size_contents_v = horizontal ? window->SizeContents.x : window->SizeContents.y;
+ const float scrollbar_size_v = horizontal ? bb.GetWidth() : bb.GetHeight();
// Calculate the height of our grabbable box. It generally represent the amount visible (vs the total scrollable amount)
// But we maintain a minimum size in pixel to allow for the user to still aim inside.
- IM_ASSERT(ImMax(win_size_contents_v, win_size_avail_v) > 0.0f); // Adding this assert to check if the ImMax(XXX,1.0f) is still needed. PLEASE CONTACT ME if this triggers.
- const float win_size_v = ImMax(ImMax(win_size_contents_v, win_size_avail_v), 1.0f);
- const float grab_h_pixels = ImClamp(scrollbar_size_v * (win_size_avail_v / win_size_v), style.GrabMinSize, scrollbar_size_v);
+ IM_ASSERT(ImMax(size_contents_v, size_avail_v) > 0.0f); // Adding this assert to check if the ImMax(XXX,1.0f) is still needed. PLEASE CONTACT ME if this triggers.
+ const float win_size_v = ImMax(ImMax(size_contents_v, size_avail_v), 1.0f);
+ const float grab_h_pixels = ImClamp(scrollbar_size_v * (size_avail_v / win_size_v), style.GrabMinSize, scrollbar_size_v);
const float grab_h_norm = grab_h_pixels / scrollbar_size_v;
// Handle input right away. None of the code of Begin() is relying on scrolling position before calling Scrollbar().
bool held = false;
bool hovered = false;
- const bool previously_held = (g.ActiveId == id);
ButtonBehavior(bb, id, &hovered, &held, ImGuiButtonFlags_NoNavFocus);
- float scroll_max = ImMax(1.0f, win_size_contents_v - win_size_avail_v);
- float scroll_ratio = ImSaturate(scroll_v / scroll_max);
+ float scroll_max = ImMax(1.0f, size_contents_v - size_avail_v);
+ float scroll_ratio = ImSaturate(*p_scroll_v / scroll_max);
float grab_v_norm = scroll_ratio * (scrollbar_size_v - grab_h_pixels) / scrollbar_size_v;
- if (held && grab_h_norm < 1.0f)
+ if (held && allow_interaction && grab_h_norm < 1.0f)
{
float scrollbar_pos_v = horizontal ? bb.Min.x : bb.Min.y;
float mouse_pos_v = horizontal ? g.IO.MousePos.x : g.IO.MousePos.y;
- float* click_delta_to_grab_center_v = horizontal ? &g.ScrollbarClickDeltaToGrabCenter.x : &g.ScrollbarClickDeltaToGrabCenter.y;
// Click position in scrollbar normalized space (0.0f->1.0f)
const float clicked_v_norm = ImSaturate((mouse_pos_v - scrollbar_pos_v) / scrollbar_size_v);
SetHoveredID(id);
bool seek_absolute = false;
- if (!previously_held)
+ if (g.ActiveIdIsJustActivated)
{
// On initial click calculate the distance between mouse and the center of the grab
- if (clicked_v_norm >= grab_v_norm && clicked_v_norm <= grab_v_norm + grab_h_norm)
- {
- *click_delta_to_grab_center_v = clicked_v_norm - grab_v_norm - grab_h_norm*0.5f;
- }
+ seek_absolute = (clicked_v_norm < grab_v_norm || clicked_v_norm > grab_v_norm + grab_h_norm);
+ if (seek_absolute)
+ g.ScrollbarClickDeltaToGrabCenter = 0.0f;
else
- {
- seek_absolute = true;
- *click_delta_to_grab_center_v = 0.0f;
- }
+ g.ScrollbarClickDeltaToGrabCenter = clicked_v_norm - grab_v_norm - grab_h_norm * 0.5f;
}
// Apply scroll
- // It is ok to modify Scroll here because we are being called in Begin() after the calculation of SizeContents and before setting up our starting position
- const float scroll_v_norm = ImSaturate((clicked_v_norm - *click_delta_to_grab_center_v - grab_h_norm*0.5f) / (1.0f - grab_h_norm));
- scroll_v = (float)(int)(0.5f + scroll_v_norm * scroll_max);//(win_size_contents_v - win_size_v));
- if (horizontal)
- window->Scroll.x = scroll_v;
- else
- window->Scroll.y = scroll_v;
+ // It is ok to modify Scroll here because we are being called in Begin() after the calculation of ContentSize and before setting up our starting position
+ const float scroll_v_norm = ImSaturate((clicked_v_norm - g.ScrollbarClickDeltaToGrabCenter - grab_h_norm * 0.5f) / (1.0f - grab_h_norm));
+ *p_scroll_v = IM_ROUND(scroll_v_norm * scroll_max);//(win_size_contents_v - win_size_v));
// Update values for rendering
- scroll_ratio = ImSaturate(scroll_v / scroll_max);
+ scroll_ratio = ImSaturate(*p_scroll_v / scroll_max);
grab_v_norm = scroll_ratio * (scrollbar_size_v - grab_h_pixels) / scrollbar_size_v;
// Update distance to grab now that we have seeked and saturated
if (seek_absolute)
- *click_delta_to_grab_center_v = clicked_v_norm - grab_v_norm - grab_h_norm*0.5f;
+ g.ScrollbarClickDeltaToGrabCenter = clicked_v_norm - grab_v_norm - grab_h_norm * 0.5f;
}
// Render
- const ImU32 grab_col = GetColorU32(held ? ImGuiCol_ScrollbarGrabActive : hovered ? ImGuiCol_ScrollbarGrabHovered : ImGuiCol_ScrollbarGrab);
+ window->DrawList->AddRectFilled(bb_frame.Min, bb_frame.Max, GetColorU32(ImGuiCol_ScrollbarBg), window->WindowRounding, rounding_corners);
+ const ImU32 grab_col = GetColorU32(held ? ImGuiCol_ScrollbarGrabActive : hovered ? ImGuiCol_ScrollbarGrabHovered : ImGuiCol_ScrollbarGrab, alpha);
ImRect grab_rect;
if (horizontal)
- grab_rect = ImRect(ImLerp(bb.Min.x, bb.Max.x, grab_v_norm), bb.Min.y, ImMin(ImLerp(bb.Min.x, bb.Max.x, grab_v_norm) + grab_h_pixels, window_rect.Max.x), bb.Max.y);
+ grab_rect = ImRect(ImLerp(bb.Min.x, bb.Max.x, grab_v_norm), bb.Min.y, ImLerp(bb.Min.x, bb.Max.x, grab_v_norm) + grab_h_pixels, bb.Max.y);
else
- grab_rect = ImRect(bb.Min.x, ImLerp(bb.Min.y, bb.Max.y, grab_v_norm), bb.Max.x, ImMin(ImLerp(bb.Min.y, bb.Max.y, grab_v_norm) + grab_h_pixels, window_rect.Max.y));
+ grab_rect = ImRect(bb.Min.x, ImLerp(bb.Min.y, bb.Max.y, grab_v_norm), bb.Max.x, ImLerp(bb.Min.y, bb.Max.y, grab_v_norm) + grab_h_pixels);
window->DrawList->AddRectFilled(grab_rect.Min, grab_rect.Max, grab_col, style.ScrollbarRounding);
+
+ return held;
+}
+
+void ImGui::Scrollbar(ImGuiAxis axis)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+
+ const ImGuiID id = GetWindowScrollbarID(window, axis);
+ KeepAliveID(id);
+
+ // Calculate scrollbar bounding box
+ const ImRect outer_rect = window->Rect();
+ const ImRect inner_rect = window->InnerRect;
+ const float border_size = window->WindowBorderSize;
+ const float scrollbar_size = window->ScrollbarSizes[axis ^ 1];
+ IM_ASSERT(scrollbar_size > 0.0f);
+ const float other_scrollbar_size = window->ScrollbarSizes[axis];
+ ImDrawCornerFlags rounding_corners = (other_scrollbar_size <= 0.0f) ? ImDrawCornerFlags_BotRight : 0;
+ ImRect bb;
+ if (axis == ImGuiAxis_X)
+ {
+ bb.Min = ImVec2(inner_rect.Min.x, ImMax(outer_rect.Min.y, outer_rect.Max.y - border_size - scrollbar_size));
+ bb.Max = ImVec2(inner_rect.Max.x, outer_rect.Max.y);
+ rounding_corners |= ImDrawCornerFlags_BotLeft;
+ }
+ else
+ {
+ bb.Min = ImVec2(ImMax(outer_rect.Min.x, outer_rect.Max.x - border_size - scrollbar_size), inner_rect.Min.y);
+ bb.Max = ImVec2(outer_rect.Max.x, window->InnerRect.Max.y);
+ rounding_corners |= ((window->Flags & ImGuiWindowFlags_NoTitleBar) && !(window->Flags & ImGuiWindowFlags_MenuBar)) ? ImDrawCornerFlags_TopRight : 0;
+ }
+ ScrollbarEx(bb, id, axis, &window->Scroll[axis], inner_rect.Max[axis] - inner_rect.Min[axis], window->ContentSize[axis] + window->WindowPadding[axis] * 2.0f, rounding_corners);
}
void ImGui::Image(ImTextureID user_texture_id, const ImVec2& size, const ImVec2& uv0, const ImVec2& uv1, const ImVec4& tint_col, const ImVec4& border_col)
@@ -875,19 +1013,10 @@ bool ImGui::Checkbox(const char* label, bool* v)
const ImGuiID id = window->GetID(label);
const ImVec2 label_size = CalcTextSize(label, NULL, true);
- const ImRect check_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(label_size.y + style.FramePadding.y*2, label_size.y + style.FramePadding.y*2)); // We want a square shape to we use Y twice
- ItemSize(check_bb, style.FramePadding.y);
-
- ImRect total_bb = check_bb;
- if (label_size.x > 0)
- SameLine(0, style.ItemInnerSpacing.x);
- const ImRect text_bb(window->DC.CursorPos + ImVec2(0,style.FramePadding.y), window->DC.CursorPos + ImVec2(0,style.FramePadding.y) + label_size);
- if (label_size.x > 0)
- {
- ItemSize(ImVec2(text_bb.GetWidth(), check_bb.GetHeight()), style.FramePadding.y);
- total_bb = ImRect(ImMin(check_bb.Min, text_bb.Min), ImMax(check_bb.Max, text_bb.Max));
- }
-
+ const float square_sz = GetFrameHeight();
+ const ImVec2 pos = window->DC.CursorPos;
+ const ImRect total_bb(pos, pos + ImVec2(square_sz + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), label_size.y + style.FramePadding.y * 2.0f));
+ ItemSize(total_bb, style.FramePadding.y);
if (!ItemAdd(total_bb, id))
return false;
@@ -899,20 +1028,28 @@ bool ImGui::Checkbox(const char* label, bool* v)
MarkItemEdited(id);
}
+ const ImRect check_bb(pos, pos + ImVec2(square_sz, square_sz));
RenderNavHighlight(total_bb, id);
RenderFrame(check_bb.Min, check_bb.Max, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), true, style.FrameRounding);
- if (*v)
+ ImU32 check_col = GetColorU32(ImGuiCol_CheckMark);
+ if (window->DC.ItemFlags & ImGuiItemFlags_MixedValue)
{
- const float check_sz = ImMin(check_bb.GetWidth(), check_bb.GetHeight());
- const float pad = ImMax(1.0f, (float)(int)(check_sz / 6.0f));
- RenderCheckMark(check_bb.Min + ImVec2(pad,pad), GetColorU32(ImGuiCol_CheckMark), check_bb.GetWidth() - pad*2.0f);
+ // Undocumented tristate/mixed/indeterminate checkbox (#2644)
+ ImVec2 pad(ImMax(1.0f, IM_FLOOR(square_sz / 3.6f)), ImMax(1.0f, IM_FLOOR(square_sz / 3.6f)));
+ window->DrawList->AddRectFilled(check_bb.Min + pad, check_bb.Max - pad, check_col, style.FrameRounding);
+ }
+ else if (*v)
+ {
+ const float pad = ImMax(1.0f, IM_FLOOR(square_sz / 6.0f));
+ RenderCheckMark(check_bb.Min + ImVec2(pad, pad), check_col, square_sz - pad*2.0f);
}
if (g.LogEnabled)
- LogRenderedText(&text_bb.Min, *v ? "[x]" : "[ ]");
+ LogRenderedText(&total_bb.Min, *v ? "[x]" : "[ ]");
if (label_size.x > 0.0f)
- RenderText(text_bb.Min, label);
+ RenderText(ImVec2(check_bb.Max.x + style.ItemInnerSpacing.x, check_bb.Min.y + style.FramePadding.y), label);
+ IMGUI_TEST_ENGINE_ITEM_INFO(id, label, window->DC.ItemFlags | ImGuiItemStatusFlags_Checkable | (*v ? ImGuiItemStatusFlags_Checked : 0));
return pressed;
}
@@ -942,26 +1079,18 @@ bool ImGui::RadioButton(const char* label, bool active)
const ImGuiID id = window->GetID(label);
const ImVec2 label_size = CalcTextSize(label, NULL, true);
- const ImRect check_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(label_size.y + style.FramePadding.y*2-1, label_size.y + style.FramePadding.y*2-1));
- ItemSize(check_bb, style.FramePadding.y);
-
- ImRect total_bb = check_bb;
- if (label_size.x > 0)
- SameLine(0, style.ItemInnerSpacing.x);
- const ImRect text_bb(window->DC.CursorPos + ImVec2(0, style.FramePadding.y), window->DC.CursorPos + ImVec2(0, style.FramePadding.y) + label_size);
- if (label_size.x > 0)
- {
- ItemSize(ImVec2(text_bb.GetWidth(), check_bb.GetHeight()), style.FramePadding.y);
- total_bb.Add(text_bb);
- }
-
+ const float square_sz = GetFrameHeight();
+ const ImVec2 pos = window->DC.CursorPos;
+ const ImRect check_bb(pos, pos + ImVec2(square_sz, square_sz));
+ const ImRect total_bb(pos, pos + ImVec2(square_sz + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), label_size.y + style.FramePadding.y * 2.0f));
+ ItemSize(total_bb, style.FramePadding.y);
if (!ItemAdd(total_bb, id))
return false;
ImVec2 center = check_bb.GetCenter();
- center.x = (float)(int)center.x + 0.5f;
- center.y = (float)(int)center.y + 0.5f;
- const float radius = check_bb.GetHeight() * 0.5f;
+ center.x = IM_ROUND(center.x);
+ center.y = IM_ROUND(center.y);
+ const float radius = (square_sz - 1.0f) * 0.5f;
bool hovered, held;
bool pressed = ButtonBehavior(total_bb, id, &hovered, &held);
@@ -972,25 +1101,25 @@ bool ImGui::RadioButton(const char* label, bool active)
window->DrawList->AddCircleFilled(center, radius, GetColorU32((held && hovered) ? ImGuiCol_FrameBgActive : hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg), 16);
if (active)
{
- const float check_sz = ImMin(check_bb.GetWidth(), check_bb.GetHeight());
- const float pad = ImMax(1.0f, (float)(int)(check_sz / 6.0f));
- window->DrawList->AddCircleFilled(center, radius-pad, GetColorU32(ImGuiCol_CheckMark), 16);
+ const float pad = ImMax(1.0f, IM_FLOOR(square_sz / 6.0f));
+ window->DrawList->AddCircleFilled(center, radius - pad, GetColorU32(ImGuiCol_CheckMark), 16);
}
if (style.FrameBorderSize > 0.0f)
{
- window->DrawList->AddCircle(center+ImVec2(1,1), radius, GetColorU32(ImGuiCol_BorderShadow), 16, style.FrameBorderSize);
+ window->DrawList->AddCircle(center + ImVec2(1,1), radius, GetColorU32(ImGuiCol_BorderShadow), 16, style.FrameBorderSize);
window->DrawList->AddCircle(center, radius, GetColorU32(ImGuiCol_Border), 16, style.FrameBorderSize);
}
if (g.LogEnabled)
- LogRenderedText(&text_bb.Min, active ? "(x)" : "( )");
+ LogRenderedText(&total_bb.Min, active ? "(x)" : "( )");
if (label_size.x > 0.0f)
- RenderText(text_bb.Min, label);
+ RenderText(ImVec2(check_bb.Max.x + style.ItemInnerSpacing.x, check_bb.Min.y + style.FramePadding.y), label);
return pressed;
}
+// FIXME: This would work nicely if it was a public template, e.g. 'template<T> RadioButton(const char* label, T* v, T v_button)', but I'm not sure how we would expose it..
bool ImGui::RadioButton(const char* label, int* v, int v_button)
{
const bool pressed = RadioButton(label, *v == v_button);
@@ -1010,8 +1139,9 @@ void ImGui::ProgressBar(float fraction, const ImVec2& size_arg, const char* over
const ImGuiStyle& style = g.Style;
ImVec2 pos = window->DC.CursorPos;
- ImRect bb(pos, pos + CalcItemSize(size_arg, CalcItemWidth(), g.FontSize + style.FramePadding.y*2.0f));
- ItemSize(bb, style.FramePadding.y);
+ ImVec2 size = CalcItemSize(size_arg, CalcItemWidth(), g.FontSize + style.FramePadding.y*2.0f);
+ ImRect bb(pos, pos + size);
+ ItemSize(size, style.FramePadding.y);
if (!ItemAdd(bb, 0))
return;
@@ -1043,7 +1173,7 @@ void ImGui::Bullet()
ImGuiContext& g = *GImGui;
const ImGuiStyle& style = g.Style;
- const float line_height = ImMax(ImMin(window->DC.CurrentLineSize.y, g.FontSize + g.Style.FramePadding.y*2), g.FontSize);
+ const float line_height = ImMax(ImMin(window->DC.CurrLineSize.y, g.FontSize + g.Style.FramePadding.y*2), g.FontSize);
const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(g.FontSize, line_height));
ItemSize(bb);
if (!ItemAdd(bb, 0))
@@ -1053,8 +1183,9 @@ void ImGui::Bullet()
}
// Render and stay on same line
- RenderBullet(bb.Min + ImVec2(style.FramePadding.x + g.FontSize*0.5f, line_height*0.5f));
- SameLine(0, style.FramePadding.x*2);
+ ImU32 text_col = GetColorU32(ImGuiCol_Text);
+ RenderBullet(window->DrawList, bb.Min + ImVec2(style.FramePadding.x + g.FontSize*0.5f, line_height*0.5f), text_col);
+ SameLine(0, style.FramePadding.x * 2.0f);
}
//-------------------------------------------------------------------------
@@ -1064,9 +1195,10 @@ void ImGui::Bullet()
// - Dummy()
// - NewLine()
// - AlignTextToFramePadding()
+// - SeparatorEx() [Internal]
// - Separator()
-// - VerticalSeparator() [Internal]
// - SplitterBehavior() [Internal]
+// - ShrinkWidths() [Internal]
//-------------------------------------------------------------------------
void ImGui::Spacing()
@@ -1084,7 +1216,7 @@ void ImGui::Dummy(const ImVec2& size)
return;
const ImRect bb(window->DC.CursorPos, window->DC.CursorPos + size);
- ItemSize(bb);
+ ItemSize(size);
ItemAdd(bb, 0);
}
@@ -1097,7 +1229,7 @@ void ImGui::NewLine()
ImGuiContext& g = *GImGui;
const ImGuiLayoutType backup_layout_type = window->DC.LayoutType;
window->DC.LayoutType = ImGuiLayoutType_Vertical;
- if (window->DC.CurrentLineSize.y > 0.0f) // In the event that we are on a line with items that is smaller that FontSize high, we will preserve its height.
+ if (window->DC.CurrLineSize.y > 0.0f) // In the event that we are on a line with items that is smaller that FontSize high, we will preserve its height.
ItemSize(ImVec2(0,0));
else
ItemSize(ImVec2(0.0f, g.FontSize));
@@ -1111,74 +1243,79 @@ void ImGui::AlignTextToFramePadding()
return;
ImGuiContext& g = *GImGui;
- window->DC.CurrentLineSize.y = ImMax(window->DC.CurrentLineSize.y, g.FontSize + g.Style.FramePadding.y * 2);
- window->DC.CurrentLineTextBaseOffset = ImMax(window->DC.CurrentLineTextBaseOffset, g.Style.FramePadding.y);
+ window->DC.CurrLineSize.y = ImMax(window->DC.CurrLineSize.y, g.FontSize + g.Style.FramePadding.y * 2);
+ window->DC.CurrLineTextBaseOffset = ImMax(window->DC.CurrLineTextBaseOffset, g.Style.FramePadding.y);
}
// Horizontal/vertical separating line
-void ImGui::Separator()
+void ImGui::SeparatorEx(ImGuiSeparatorFlags flags)
{
ImGuiWindow* window = GetCurrentWindow();
if (window->SkipItems)
return;
+
ImGuiContext& g = *GImGui;
+ IM_ASSERT(ImIsPowerOfTwo(flags & (ImGuiSeparatorFlags_Horizontal | ImGuiSeparatorFlags_Vertical))); // Check that only 1 option is selected
- // Those flags should eventually be overridable by the user
- ImGuiSeparatorFlags flags = (window->DC.LayoutType == ImGuiLayoutType_Horizontal) ? ImGuiSeparatorFlags_Vertical : ImGuiSeparatorFlags_Horizontal;
- IM_ASSERT(ImIsPowerOfTwo((int)(flags & (ImGuiSeparatorFlags_Horizontal | ImGuiSeparatorFlags_Vertical)))); // Check that only 1 option is selected
+ float thickness_draw = 1.0f;
+ float thickness_layout = 0.0f;
if (flags & ImGuiSeparatorFlags_Vertical)
{
- VerticalSeparator();
- return;
- }
-
- // Horizontal Separator
- if (window->DC.ColumnsSet)
- PopClipRect();
-
- float x1 = window->Pos.x;
- float x2 = window->Pos.x + window->Size.x;
- if (!window->DC.GroupStack.empty())
- x1 += window->DC.Indent.x;
+ // Vertical separator, for menu bars (use current line height). Not exposed because it is misleading and it doesn't have an effect on regular layout.
+ float y1 = window->DC.CursorPos.y;
+ float y2 = window->DC.CursorPos.y + window->DC.CurrLineSize.y;
+ const ImRect bb(ImVec2(window->DC.CursorPos.x, y1), ImVec2(window->DC.CursorPos.x + thickness_draw, y2));
+ ItemSize(ImVec2(thickness_layout, 0.0f));
+ if (!ItemAdd(bb, 0))
+ return;
- const ImRect bb(ImVec2(x1, window->DC.CursorPos.y), ImVec2(x2, window->DC.CursorPos.y+1.0f));
- ItemSize(ImVec2(0.0f, 0.0f)); // NB: we don't provide our width so that it doesn't get feed back into AutoFit, we don't provide height to not alter layout.
- if (!ItemAdd(bb, 0))
- {
- if (window->DC.ColumnsSet)
- PushColumnClipRect();
- return;
+ // Draw
+ window->DrawList->AddLine(ImVec2(bb.Min.x, bb.Min.y), ImVec2(bb.Min.x, bb.Max.y), GetColorU32(ImGuiCol_Separator));
+ if (g.LogEnabled)
+ LogText(" |");
}
+ else if (flags & ImGuiSeparatorFlags_Horizontal)
+ {
+ // Horizontal Separator
+ float x1 = window->Pos.x;
+ float x2 = window->Pos.x + window->Size.x;
+ if (!window->DC.GroupStack.empty())
+ x1 += window->DC.Indent.x;
- window->DrawList->AddLine(bb.Min, ImVec2(bb.Max.x,bb.Min.y), GetColorU32(ImGuiCol_Separator));
-
- if (g.LogEnabled)
- LogRenderedText(NULL, IM_NEWLINE "--------------------------------");
+ ImGuiColumns* columns = (flags & ImGuiSeparatorFlags_SpanAllColumns) ? window->DC.CurrentColumns : NULL;
+ if (columns)
+ PushColumnsBackground();
- if (window->DC.ColumnsSet)
- {
- PushColumnClipRect();
- window->DC.ColumnsSet->LineMinY = window->DC.CursorPos.y;
+ // We don't provide our width to the layout so that it doesn't get feed back into AutoFit
+ const ImRect bb(ImVec2(x1, window->DC.CursorPos.y), ImVec2(x2, window->DC.CursorPos.y + thickness_draw));
+ ItemSize(ImVec2(0.0f, thickness_layout));
+ const bool item_visible = ItemAdd(bb, 0);
+ if (item_visible)
+ {
+ // Draw
+ window->DrawList->AddLine(bb.Min, ImVec2(bb.Max.x, bb.Min.y), GetColorU32(ImGuiCol_Separator));
+ if (g.LogEnabled)
+ LogRenderedText(&bb.Min, "--------------------------------");
+ }
+ if (columns)
+ {
+ PopColumnsBackground();
+ columns->LineMinY = window->DC.CursorPos.y;
+ }
}
}
-void ImGui::VerticalSeparator()
+void ImGui::Separator()
{
- ImGuiWindow* window = GetCurrentWindow();
- if (window->SkipItems)
- return;
ImGuiContext& g = *GImGui;
-
- float y1 = window->DC.CursorPos.y;
- float y2 = window->DC.CursorPos.y + window->DC.CurrentLineSize.y;
- const ImRect bb(ImVec2(window->DC.CursorPos.x, y1), ImVec2(window->DC.CursorPos.x + 1.0f, y2));
- ItemSize(ImVec2(bb.GetWidth(), 0.0f));
- if (!ItemAdd(bb, 0))
+ ImGuiWindow* window = g.CurrentWindow;
+ if (window->SkipItems)
return;
- window->DrawList->AddLine(ImVec2(bb.Min.x, bb.Min.y), ImVec2(bb.Min.x, bb.Max.y), GetColorU32(ImGuiCol_Separator));
- if (g.LogEnabled)
- LogText(" |");
+ // Those flags should eventually be overridable by the user
+ ImGuiSeparatorFlags flags = (window->DC.LayoutType == ImGuiLayoutType_Horizontal) ? ImGuiSeparatorFlags_Vertical : ImGuiSeparatorFlags_Horizontal;
+ flags |= ImGuiSeparatorFlags_SpanAllColumns;
+ SeparatorEx(flags);
}
// Using 'hover_visibility_delay' allows us to hide the highlight and mouse cursor for a short time, which can be convenient to reduce visual noise.
@@ -1234,14 +1371,58 @@ bool ImGui::SplitterBehavior(const ImRect& bb, ImGuiID id, ImGuiAxis axis, float
// Render
const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : (hovered && g.HoveredIdTimer >= hover_visibility_delay) ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator);
- window->DrawList->AddRectFilled(bb_render.Min, bb_render.Max, col, g.Style.FrameRounding);
+ window->DrawList->AddRectFilled(bb_render.Min, bb_render.Max, col, 0.0f);
return held;
}
+static int IMGUI_CDECL ShrinkWidthItemComparer(const void* lhs, const void* rhs)
+{
+ const ImGuiShrinkWidthItem* a = (const ImGuiShrinkWidthItem*)lhs;
+ const ImGuiShrinkWidthItem* b = (const ImGuiShrinkWidthItem*)rhs;
+ if (int d = (int)(b->Width - a->Width))
+ return d;
+ return (b->Index - a->Index);
+}
+
+// Shrink excess width from a set of item, by removing width from the larger items first.
+void ImGui::ShrinkWidths(ImGuiShrinkWidthItem* items, int count, float width_excess)
+{
+ if (count == 1)
+ {
+ items[0].Width = ImMax(items[0].Width - width_excess, 1.0f);
+ return;
+ }
+ ImQsort(items, (size_t)count, sizeof(ImGuiShrinkWidthItem), ShrinkWidthItemComparer);
+ int count_same_width = 1;
+ while (width_excess > 0.0f && count_same_width < count)
+ {
+ while (count_same_width < count && items[0].Width <= items[count_same_width].Width)
+ count_same_width++;
+ float max_width_to_remove_per_item = (count_same_width < count) ? (items[0].Width - items[count_same_width].Width) : (items[0].Width - 1.0f);
+ float width_to_remove_per_item = ImMin(width_excess / count_same_width, max_width_to_remove_per_item);
+ for (int item_n = 0; item_n < count_same_width; item_n++)
+ items[item_n].Width -= width_to_remove_per_item;
+ width_excess -= width_to_remove_per_item * count_same_width;
+ }
+
+ // Round width and redistribute remainder left-to-right (could make it an option of the function?)
+ // Ensure that e.g. the right-most tab of a shrunk tab-bar always reaches exactly at the same distance from the right-most edge of the tab bar separator.
+ width_excess = 0.0f;
+ for (int n = 0; n < count; n++)
+ {
+ float width_rounded = ImFloor(items[n].Width);
+ width_excess += items[n].Width - width_rounded;
+ items[n].Width = width_rounded;
+ }
+ if (width_excess > 0.0f)
+ for (int n = 0; n < count; n++)
+ if (items[n].Index < (int)(width_excess + 0.01f))
+ items[n].Width += 1.0f;
+}
//-------------------------------------------------------------------------
-// [SECTION] Widgets: Combo Box
+// [SECTION] Widgets: ComboBox
//-------------------------------------------------------------------------
// - BeginCombo()
// - EndCombo()
@@ -1260,8 +1441,8 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF
{
// Always consume the SetNextWindowSizeConstraint() call in our early return paths
ImGuiContext& g = *GImGui;
- ImGuiCond backup_next_window_size_constraint = g.NextWindowData.SizeConstraintCond;
- g.NextWindowData.SizeConstraintCond = 0;
+ bool has_window_size_constraint = (g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSizeConstraint) != 0;
+ g.NextWindowData.Flags &= ~ImGuiNextWindowDataFlags_HasSizeConstraint;
ImGuiWindow* window = GetCurrentWindow();
if (window->SkipItems)
@@ -1274,7 +1455,8 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF
const float arrow_size = (flags & ImGuiComboFlags_NoArrowButton) ? 0.0f : GetFrameHeight();
const ImVec2 label_size = CalcTextSize(label, NULL, true);
- const float w = (flags & ImGuiComboFlags_NoPreview) ? arrow_size : CalcItemWidth();
+ const float expected_w = CalcItemWidth();
+ const float w = (flags & ImGuiComboFlags_NoPreview) ? arrow_size : expected_w;
const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y*2.0f));
const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));
ItemSize(total_bb, style.FramePadding.y);
@@ -1285,19 +1467,22 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF
bool pressed = ButtonBehavior(frame_bb, id, &hovered, &held);
bool popup_open = IsPopupOpen(id);
- const ImRect value_bb(frame_bb.Min, frame_bb.Max - ImVec2(arrow_size, 0.0f));
const ImU32 frame_col = GetColorU32(hovered ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg);
+ const float value_x2 = ImMax(frame_bb.Min.x, frame_bb.Max.x - arrow_size);
RenderNavHighlight(frame_bb, id);
if (!(flags & ImGuiComboFlags_NoPreview))
- window->DrawList->AddRectFilled(frame_bb.Min, ImVec2(frame_bb.Max.x - arrow_size, frame_bb.Max.y), frame_col, style.FrameRounding, ImDrawCornerFlags_Left);
+ window->DrawList->AddRectFilled(frame_bb.Min, ImVec2(value_x2, frame_bb.Max.y), frame_col, style.FrameRounding, (flags & ImGuiComboFlags_NoArrowButton) ? ImDrawCornerFlags_All : ImDrawCornerFlags_Left);
if (!(flags & ImGuiComboFlags_NoArrowButton))
{
- window->DrawList->AddRectFilled(ImVec2(frame_bb.Max.x - arrow_size, frame_bb.Min.y), frame_bb.Max, GetColorU32((popup_open || hovered) ? ImGuiCol_ButtonHovered : ImGuiCol_Button), style.FrameRounding, (w <= arrow_size) ? ImDrawCornerFlags_All : ImDrawCornerFlags_Right);
- RenderArrow(ImVec2(frame_bb.Max.x - arrow_size + style.FramePadding.y, frame_bb.Min.y + style.FramePadding.y), ImGuiDir_Down);
+ ImU32 bg_col = GetColorU32((popup_open || hovered) ? ImGuiCol_ButtonHovered : ImGuiCol_Button);
+ ImU32 text_col = GetColorU32(ImGuiCol_Text);
+ window->DrawList->AddRectFilled(ImVec2(value_x2, frame_bb.Min.y), frame_bb.Max, bg_col, style.FrameRounding, (w <= arrow_size) ? ImDrawCornerFlags_All : ImDrawCornerFlags_Right);
+ if (value_x2 + arrow_size - style.FramePadding.x <= frame_bb.Max.x)
+ RenderArrow(window->DrawList, ImVec2(value_x2 + style.FramePadding.y, frame_bb.Min.y + style.FramePadding.y), text_col, ImGuiDir_Down, 1.0f);
}
RenderFrameBorder(frame_bb.Min, frame_bb.Max, style.FrameRounding);
if (preview_value != NULL && !(flags & ImGuiComboFlags_NoPreview))
- RenderTextClipped(frame_bb.Min + style.FramePadding, value_bb.Max, preview_value, NULL, NULL, ImVec2(0.0f,0.0f));
+ RenderTextClipped(frame_bb.Min + style.FramePadding, ImVec2(value_x2, frame_bb.Max.y), preview_value, NULL, NULL, ImVec2(0.0f,0.0f));
if (label_size.x > 0)
RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label);
@@ -1312,9 +1497,9 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF
if (!popup_open)
return false;
- if (backup_next_window_size_constraint)
+ if (has_window_size_constraint)
{
- g.NextWindowData.SizeConstraintCond = backup_next_window_size_constraint;
+ g.NextWindowData.Flags |= ImGuiNextWindowDataFlags_HasSizeConstraint;
g.NextWindowData.SizeConstraintRect.Min.x = ImMax(g.NextWindowData.SizeConstraintRect.Min.x, w);
}
else
@@ -1330,7 +1515,7 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF
}
char name[16];
- ImFormatString(name, IM_ARRAYSIZE(name), "##Combo_%02d", g.CurrentPopupStack.Size); // Recycle windows based on depth
+ ImFormatString(name, IM_ARRAYSIZE(name), "##Combo_%02d", g.BeginPopupStack.Size); // Recycle windows based on depth
// Peak into expected window size so we can position it
if (ImGuiWindow* popup_window = FindWindowByName(name))
@@ -1344,8 +1529,10 @@ bool ImGui::BeginCombo(const char* label, const char* preview_value, ImGuiComboF
SetNextWindowPos(pos);
}
+ // We don't use BeginPopupEx() solely because we have a custom name string, which we could make an argument to BeginPopupEx()
+ ImGuiWindowFlags window_flags = ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_Popup | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_NoMove;
+
// Horizontally align ourselves with the framed text
- ImGuiWindowFlags window_flags = ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_Popup | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoSavedSettings;
PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(style.FramePadding.x, style.WindowPadding.y));
bool ret = Begin(name, NULL, window_flags);
PopStyleVar();
@@ -1404,7 +1591,7 @@ bool ImGui::Combo(const char* label, int* current_item, bool (*items_getter)(voi
items_getter(data, *current_item, &preview_value);
// The old Combo() API exposed "popup_max_height_in_items". The new more general BeginCombo() API doesn't have/need it, but we emulate it here.
- if (popup_max_height_in_items != -1 && !g.NextWindowData.SizeConstraintCond)
+ if (popup_max_height_in_items != -1 && !(g.NextWindowData.Flags & ImGuiNextWindowDataFlags_HasSizeConstraint))
SetNextWindowSizeConstraints(ImVec2(0,0), ImVec2(FLT_MAX, CalcMaxPopupHeightFromItemCount(popup_max_height_in_items)));
if (!BeginCombo(label, preview_value, ImGuiComboFlags_None))
@@ -1441,7 +1628,7 @@ bool ImGui::Combo(const char* label, int* current_item, const char* const items[
return value_changed;
}
-// Combo box helper allowing to pass all items in a single string literal holding multiple zero-terminated items "item1\0item2\0"
+// Combo box helper allowing to pass all items in a single string literal holding multiple zero-terminated items "item1\0item2\0"
bool ImGui::Combo(const char* label, int* current_item, const char* items_separated_by_zeros, int height_in_items)
{
int items_count = 0;
@@ -1459,6 +1646,7 @@ bool ImGui::Combo(const char* label, int* current_item, const char* items_separa
// [SECTION] Data Type and Data Formatting Helpers [Internal]
//-------------------------------------------------------------------------
// - PatchFormatStringFloatToInt()
+// - DataTypeGetInfo()
// - DataTypeFormatString()
// - DataTypeApplyOp()
// - DataTypeApplyOpFromText()
@@ -1466,26 +1654,23 @@ bool ImGui::Combo(const char* label, int* current_item, const char* items_separa
// - RoundScalarWithFormat<>()
//-------------------------------------------------------------------------
-struct ImGuiDataTypeInfo
-{
- size_t Size;
- const char* PrintFmt; // Unused
- const char* ScanFmt;
-};
-
static const ImGuiDataTypeInfo GDataTypeInfo[] =
{
- { sizeof(int), "%d", "%d" },
- { sizeof(unsigned int), "%u", "%u" },
+ { sizeof(char), "%d", "%d" }, // ImGuiDataType_S8
+ { sizeof(unsigned char), "%u", "%u" },
+ { sizeof(short), "%d", "%d" }, // ImGuiDataType_S16
+ { sizeof(unsigned short), "%u", "%u" },
+ { sizeof(int), "%d", "%d" }, // ImGuiDataType_S32
+ { sizeof(unsigned int), "%u", "%u" },
#ifdef _MSC_VER
- { sizeof(ImS64), "%I64d","%I64d" },
- { sizeof(ImU64), "%I64u","%I64u" },
+ { sizeof(ImS64), "%I64d","%I64d" }, // ImGuiDataType_S64
+ { sizeof(ImU64), "%I64u","%I64u" },
#else
- { sizeof(ImS64), "%lld", "%lld" },
- { sizeof(ImU64), "%llu", "%llu" },
+ { sizeof(ImS64), "%lld", "%lld" }, // ImGuiDataType_S64
+ { sizeof(ImU64), "%llu", "%llu" },
#endif
- { sizeof(float), "%f", "%f" }, // float are promoted to double in va_arg
- { sizeof(double), "%f", "%lf" },
+ { sizeof(float), "%f", "%f" }, // ImGuiDataType_Float (float are promoted to double in va_arg)
+ { sizeof(double), "%f", "%lf" }, // ImGuiDataType_Double
};
IM_STATIC_ASSERT(IM_ARRAYSIZE(GDataTypeInfo) == ImGuiDataType_COUNT);
@@ -1513,49 +1698,79 @@ static const char* PatchFormatStringFloatToInt(const char* fmt)
return fmt;
}
-static inline int DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* data_ptr, const char* format)
+const ImGuiDataTypeInfo* ImGui::DataTypeGetInfo(ImGuiDataType data_type)
{
- if (data_type == ImGuiDataType_S32 || data_type == ImGuiDataType_U32) // Signedness doesn't matter when pushing the argument
- return ImFormatString(buf, buf_size, format, *(const ImU32*)data_ptr);
- if (data_type == ImGuiDataType_S64 || data_type == ImGuiDataType_U64) // Signedness doesn't matter when pushing the argument
- return ImFormatString(buf, buf_size, format, *(const ImU64*)data_ptr);
+ IM_ASSERT(data_type >= 0 && data_type < ImGuiDataType_COUNT);
+ return &GDataTypeInfo[data_type];
+}
+
+int ImGui::DataTypeFormatString(char* buf, int buf_size, ImGuiDataType data_type, const void* p_data, const char* format)
+{
+ // Signedness doesn't matter when pushing integer arguments
+ if (data_type == ImGuiDataType_S32 || data_type == ImGuiDataType_U32)
+ return ImFormatString(buf, buf_size, format, *(const ImU32*)p_data);
+ if (data_type == ImGuiDataType_S64 || data_type == ImGuiDataType_U64)
+ return ImFormatString(buf, buf_size, format, *(const ImU64*)p_data);
if (data_type == ImGuiDataType_Float)
- return ImFormatString(buf, buf_size, format, *(const float*)data_ptr);
+ return ImFormatString(buf, buf_size, format, *(const float*)p_data);
if (data_type == ImGuiDataType_Double)
- return ImFormatString(buf, buf_size, format, *(const double*)data_ptr);
+ return ImFormatString(buf, buf_size, format, *(const double*)p_data);
+ if (data_type == ImGuiDataType_S8)
+ return ImFormatString(buf, buf_size, format, *(const ImS8*)p_data);
+ if (data_type == ImGuiDataType_U8)
+ return ImFormatString(buf, buf_size, format, *(const ImU8*)p_data);
+ if (data_type == ImGuiDataType_S16)
+ return ImFormatString(buf, buf_size, format, *(const ImS16*)p_data);
+ if (data_type == ImGuiDataType_U16)
+ return ImFormatString(buf, buf_size, format, *(const ImU16*)p_data);
IM_ASSERT(0);
return 0;
}
-// FIXME: Adding support for clamping on boundaries of the data type would be nice.
-static void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, void* arg1, const void* arg2)
+void ImGui::DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, void* arg1, const void* arg2)
{
IM_ASSERT(op == '+' || op == '-');
switch (data_type)
{
+ case ImGuiDataType_S8:
+ if (op == '+') { *(ImS8*)output = ImAddClampOverflow(*(const ImS8*)arg1, *(const ImS8*)arg2, IM_S8_MIN, IM_S8_MAX); }
+ if (op == '-') { *(ImS8*)output = ImSubClampOverflow(*(const ImS8*)arg1, *(const ImS8*)arg2, IM_S8_MIN, IM_S8_MAX); }
+ return;
+ case ImGuiDataType_U8:
+ if (op == '+') { *(ImU8*)output = ImAddClampOverflow(*(const ImU8*)arg1, *(const ImU8*)arg2, IM_U8_MIN, IM_U8_MAX); }
+ if (op == '-') { *(ImU8*)output = ImSubClampOverflow(*(const ImU8*)arg1, *(const ImU8*)arg2, IM_U8_MIN, IM_U8_MAX); }
+ return;
+ case ImGuiDataType_S16:
+ if (op == '+') { *(ImS16*)output = ImAddClampOverflow(*(const ImS16*)arg1, *(const ImS16*)arg2, IM_S16_MIN, IM_S16_MAX); }
+ if (op == '-') { *(ImS16*)output = ImSubClampOverflow(*(const ImS16*)arg1, *(const ImS16*)arg2, IM_S16_MIN, IM_S16_MAX); }
+ return;
+ case ImGuiDataType_U16:
+ if (op == '+') { *(ImU16*)output = ImAddClampOverflow(*(const ImU16*)arg1, *(const ImU16*)arg2, IM_U16_MIN, IM_U16_MAX); }
+ if (op == '-') { *(ImU16*)output = ImSubClampOverflow(*(const ImU16*)arg1, *(const ImU16*)arg2, IM_U16_MIN, IM_U16_MAX); }
+ return;
case ImGuiDataType_S32:
- if (op == '+') *(int*)output = *(const int*)arg1 + *(const int*)arg2;
- else if (op == '-') *(int*)output = *(const int*)arg1 - *(const int*)arg2;
+ if (op == '+') { *(ImS32*)output = ImAddClampOverflow(*(const ImS32*)arg1, *(const ImS32*)arg2, IM_S32_MIN, IM_S32_MAX); }
+ if (op == '-') { *(ImS32*)output = ImSubClampOverflow(*(const ImS32*)arg1, *(const ImS32*)arg2, IM_S32_MIN, IM_S32_MAX); }
return;
case ImGuiDataType_U32:
- if (op == '+') *(unsigned int*)output = *(const unsigned int*)arg1 + *(const ImU32*)arg2;
- else if (op == '-') *(unsigned int*)output = *(const unsigned int*)arg1 - *(const ImU32*)arg2;
+ if (op == '+') { *(ImU32*)output = ImAddClampOverflow(*(const ImU32*)arg1, *(const ImU32*)arg2, IM_U32_MIN, IM_U32_MAX); }
+ if (op == '-') { *(ImU32*)output = ImSubClampOverflow(*(const ImU32*)arg1, *(const ImU32*)arg2, IM_U32_MIN, IM_U32_MAX); }
return;
case ImGuiDataType_S64:
- if (op == '+') *(ImS64*)output = *(const ImS64*)arg1 + *(const ImS64*)arg2;
- else if (op == '-') *(ImS64*)output = *(const ImS64*)arg1 - *(const ImS64*)arg2;
+ if (op == '+') { *(ImS64*)output = ImAddClampOverflow(*(const ImS64*)arg1, *(const ImS64*)arg2, IM_S64_MIN, IM_S64_MAX); }
+ if (op == '-') { *(ImS64*)output = ImSubClampOverflow(*(const ImS64*)arg1, *(const ImS64*)arg2, IM_S64_MIN, IM_S64_MAX); }
return;
case ImGuiDataType_U64:
- if (op == '+') *(ImU64*)output = *(const ImU64*)arg1 + *(const ImU64*)arg2;
- else if (op == '-') *(ImU64*)output = *(const ImU64*)arg1 - *(const ImU64*)arg2;
+ if (op == '+') { *(ImU64*)output = ImAddClampOverflow(*(const ImU64*)arg1, *(const ImU64*)arg2, IM_U64_MIN, IM_U64_MAX); }
+ if (op == '-') { *(ImU64*)output = ImSubClampOverflow(*(const ImU64*)arg1, *(const ImU64*)arg2, IM_U64_MIN, IM_U64_MAX); }
return;
case ImGuiDataType_Float:
- if (op == '+') *(float*)output = *(const float*)arg1 + *(const float*)arg2;
- else if (op == '-') *(float*)output = *(const float*)arg1 - *(const float*)arg2;
+ if (op == '+') { *(float*)output = *(const float*)arg1 + *(const float*)arg2; }
+ if (op == '-') { *(float*)output = *(const float*)arg1 - *(const float*)arg2; }
return;
case ImGuiDataType_Double:
- if (op == '+') *(double*)output = *(const double*)arg1 + *(const double*)arg2;
- else if (op == '-') *(double*)output = *(const double*)arg1 - *(const double*)arg2;
+ if (op == '+') { *(double*)output = *(const double*)arg1 + *(const double*)arg2; }
+ if (op == '-') { *(double*)output = *(const double*)arg1 - *(const double*)arg2; }
return;
case ImGuiDataType_COUNT: break;
}
@@ -1564,7 +1779,7 @@ static void DataTypeApplyOp(ImGuiDataType data_type, int op, void* output, void*
// User can input math operators (e.g. +100) to edit a numerical values.
// NB: This is _not_ a full expression evaluator. We should probably add one and replace this dumb mess..
-static bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_buf, ImGuiDataType data_type, void* data_ptr, const char* format)
+bool ImGui::DataTypeApplyOpFromText(const char* buf, const char* initial_value_buf, ImGuiDataType data_type, void* p_data, const char* format)
{
while (ImCharIsBlankA(*buf))
buf++;
@@ -1588,16 +1803,18 @@ static bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_b
// Copy the value in an opaque buffer so we can compare at the end of the function if it changed at all.
IM_ASSERT(data_type < ImGuiDataType_COUNT);
int data_backup[2];
- IM_ASSERT(GDataTypeInfo[data_type].Size <= sizeof(data_backup));
- memcpy(data_backup, data_ptr, GDataTypeInfo[data_type].Size);
+ const ImGuiDataTypeInfo* type_info = ImGui::DataTypeGetInfo(data_type);
+ IM_ASSERT(type_info->Size <= sizeof(data_backup));
+ memcpy(data_backup, p_data, type_info->Size);
if (format == NULL)
- format = GDataTypeInfo[data_type].ScanFmt;
+ format = type_info->ScanFmt;
+ // FIXME-LEGACY: The aim is to remove those operators and write a proper expression evaluator at some point..
int arg1i = 0;
if (data_type == ImGuiDataType_S32)
{
- int* v = (int*)data_ptr;
+ int* v = (int*)p_data;
int arg0i = *v;
float arg1f = 0.0f;
if (op && sscanf(initial_value_buf, format, &arg0i) < 1)
@@ -1608,17 +1825,11 @@ static bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_b
else if (op == '/') { if (sscanf(buf, "%f", &arg1f) && arg1f != 0.0f) *v = (int)(arg0i / arg1f); } // Divide
else { if (sscanf(buf, format, &arg1i) == 1) *v = arg1i; } // Assign constant
}
- else if (data_type == ImGuiDataType_U32 || data_type == ImGuiDataType_S64 || data_type == ImGuiDataType_U64)
- {
- // Assign constant
- // FIXME: We don't bother handling support for legacy operators since they are a little too crappy. Instead we may implement a proper expression evaluator in the future.
- sscanf(buf, format, data_ptr);
- }
else if (data_type == ImGuiDataType_Float)
{
// For floats we have to ignore format with precision (e.g. "%.2f") because sscanf doesn't take them in
format = "%f";
- float* v = (float*)data_ptr;
+ float* v = (float*)p_data;
float arg0f = *v, arg1f = 0.0f;
if (op && sscanf(initial_value_buf, format, &arg0f) < 1)
return false;
@@ -1632,7 +1843,7 @@ static bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_b
else if (data_type == ImGuiDataType_Double)
{
format = "%lf"; // scanf differentiate float/double unlike printf which forces everything to double because of ellipsis
- double* v = (double*)data_ptr;
+ double* v = (double*)p_data;
double arg0f = *v, arg1f = 0.0;
if (op && sscanf(initial_value_buf, format, &arg0f) < 1)
return false;
@@ -1643,7 +1854,30 @@ static bool DataTypeApplyOpFromText(const char* buf, const char* initial_value_b
else if (op == '/') { if (arg1f != 0.0f) *v = arg0f / arg1f; } // Divide
else { *v = arg1f; } // Assign constant
}
- return memcmp(data_backup, data_ptr, GDataTypeInfo[data_type].Size) != 0;
+ else if (data_type == ImGuiDataType_U32 || data_type == ImGuiDataType_S64 || data_type == ImGuiDataType_U64)
+ {
+ // All other types assign constant
+ // We don't bother handling support for legacy operators since they are a little too crappy. Instead we will later implement a proper expression evaluator in the future.
+ sscanf(buf, format, p_data);
+ }
+ else
+ {
+ // Small types need a 32-bit buffer to receive the result from scanf()
+ int v32;
+ sscanf(buf, format, &v32);
+ if (data_type == ImGuiDataType_S8)
+ *(ImS8*)p_data = (ImS8)ImClamp(v32, (int)IM_S8_MIN, (int)IM_S8_MAX);
+ else if (data_type == ImGuiDataType_U8)
+ *(ImU8*)p_data = (ImU8)ImClamp(v32, (int)IM_U8_MIN, (int)IM_U8_MAX);
+ else if (data_type == ImGuiDataType_S16)
+ *(ImS16*)p_data = (ImS16)ImClamp(v32, (int)IM_S16_MIN, (int)IM_S16_MAX);
+ else if (data_type == ImGuiDataType_U16)
+ *(ImU16*)p_data = (ImU16)ImClamp(v32, (int)IM_U16_MIN, (int)IM_U16_MAX);
+ else
+ IM_ASSERT(0);
+ }
+
+ return memcmp(data_backup, p_data, type_info->Size) != 0;
}
static float GetMinimumStepAtDecimalPrecision(int decimal_precision)
@@ -1651,7 +1885,7 @@ static float GetMinimumStepAtDecimalPrecision(int decimal_precision)
static const float min_steps[10] = { 1.0f, 0.1f, 0.01f, 0.001f, 0.0001f, 0.00001f, 0.000001f, 0.0000001f, 0.00000001f, 0.000000001f };
if (decimal_precision < 0)
return FLT_MIN;
- return (decimal_precision >= 0 && decimal_precision < 10) ? min_steps[decimal_precision] : ImPow(10.0f, (float)-decimal_precision);
+ return (decimal_precision < IM_ARRAYSIZE(min_steps)) ? min_steps[decimal_precision] : ImPow(10.0f, (float)-decimal_precision);
}
template<typename TYPE>
@@ -1706,21 +1940,26 @@ TYPE ImGui::RoundScalarWithFormatT(const char* format, ImGuiDataType data_type,
// This is called by DragBehavior() when the widget is active (held by mouse or being manipulated with Nav controls)
template<typename TYPE, typename SIGNEDTYPE, typename FLOATTYPE>
-bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const TYPE v_min, const TYPE v_max, const char* format, float power)
+bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const TYPE v_min, const TYPE v_max, const char* format, float power, ImGuiDragFlags flags)
{
ImGuiContext& g = *GImGui;
+ const ImGuiAxis axis = (flags & ImGuiDragFlags_Vertical) ? ImGuiAxis_Y : ImGuiAxis_X;
const bool is_decimal = (data_type == ImGuiDataType_Float) || (data_type == ImGuiDataType_Double);
- const bool has_min_max = (v_min != v_max);
+ const bool is_clamped = (v_min < v_max);
+ const bool is_power = (power != 1.0f && is_decimal && is_clamped && (v_max - v_min < FLT_MAX));
+ const bool is_locked = (v_min > v_max);
+ if (is_locked)
+ return false;
// Default tweak speed
- if (v_speed == 0.0f && has_min_max && (v_max - v_min < FLT_MAX))
+ if (v_speed == 0.0f && is_clamped && (v_max - v_min < FLT_MAX))
v_speed = (float)((v_max - v_min) * g.DragSpeedDefaultRatio);
// Inputs accumulates into g.DragCurrentAccum, which is flushed into the current value as soon as it makes a difference with our precision settings
float adjust_delta = 0.0f;
if (g.ActiveIdSource == ImGuiInputSource_Mouse && IsMousePosValid() && g.IO.MouseDragMaxDistanceSqr[0] > 1.0f*1.0f)
{
- adjust_delta = g.IO.MouseDelta.x;
+ adjust_delta = g.IO.MouseDelta[axis];
if (g.IO.KeyAlt)
adjust_delta *= 1.0f / 100.0f;
if (g.IO.KeyShift)
@@ -1729,16 +1968,21 @@ bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const
else if (g.ActiveIdSource == ImGuiInputSource_Nav)
{
int decimal_precision = is_decimal ? ImParseFormatPrecision(format, 3) : 0;
- adjust_delta = GetNavInputAmount2d(ImGuiNavDirSourceFlags_Keyboard | ImGuiNavDirSourceFlags_PadDPad, ImGuiInputReadMode_RepeatFast, 1.0f / 10.0f, 10.0f).x;
+ adjust_delta = GetNavInputAmount2d(ImGuiNavDirSourceFlags_Keyboard | ImGuiNavDirSourceFlags_PadDPad, ImGuiInputReadMode_RepeatFast, 1.0f / 10.0f, 10.0f)[axis];
v_speed = ImMax(v_speed, GetMinimumStepAtDecimalPrecision(decimal_precision));
}
adjust_delta *= v_speed;
+ // For vertical drag we currently assume that Up=higher value (like we do with vertical sliders). This may become a parameter.
+ if (axis == ImGuiAxis_Y)
+ adjust_delta = -adjust_delta;
+
// Clear current value on activation
// Avoid altering values and clamping when we are _already_ past the limits and heading in the same direction, so e.g. if range is 0..255, current value is 300 and we are pushing to the right side, keep the 300.
bool is_just_activated = g.ActiveIdIsJustActivated;
- bool is_already_past_limits_and_pushing_outward = has_min_max && ((*v >= v_max && adjust_delta > 0.0f) || (*v <= v_min && adjust_delta < 0.0f));
- if (is_just_activated || is_already_past_limits_and_pushing_outward)
+ bool is_already_past_limits_and_pushing_outward = is_clamped && ((*v >= v_max && adjust_delta > 0.0f) || (*v <= v_min && adjust_delta < 0.0f));
+ bool is_drag_direction_change_with_power = is_power && ((adjust_delta < 0 && g.DragCurrentAccum > 0) || (adjust_delta > 0 && g.DragCurrentAccum < 0));
+ if (is_just_activated || is_already_past_limits_and_pushing_outward || is_drag_direction_change_with_power)
{
g.DragCurrentAccum = 0.0f;
g.DragCurrentAccumDirty = false;
@@ -1755,18 +1999,17 @@ bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const
TYPE v_cur = *v;
FLOATTYPE v_old_ref_for_accum_remainder = (FLOATTYPE)0.0f;
- const bool is_power = (power != 1.0f && is_decimal && has_min_max && (v_max - v_min < FLT_MAX));
if (is_power)
{
// Offset + round to user desired precision, with a curve on the v_min..v_max range to get more precision on one side of the range
FLOATTYPE v_old_norm_curved = ImPow((FLOATTYPE)(v_cur - v_min) / (FLOATTYPE)(v_max - v_min), (FLOATTYPE)1.0f / power);
FLOATTYPE v_new_norm_curved = v_old_norm_curved + (g.DragCurrentAccum / (v_max - v_min));
- v_cur = v_min + (TYPE)ImPow(ImSaturate((float)v_new_norm_curved), power) * (v_max - v_min);
+ v_cur = v_min + (SIGNEDTYPE)ImPow(ImSaturate((float)v_new_norm_curved), power) * (v_max - v_min);
v_old_ref_for_accum_remainder = v_old_norm_curved;
}
else
{
- v_cur += (TYPE)g.DragCurrentAccum;
+ v_cur += (SIGNEDTYPE)g.DragCurrentAccum;
}
// Round to user desired precision based on format string
@@ -1789,7 +2032,7 @@ bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const
v_cur = (TYPE)0;
// Clamp values (+ handle overflow/wrap-around for integer types)
- if (*v != v_cur && has_min_max)
+ if (*v != v_cur && is_clamped)
{
if (v_cur < v_min || (v_cur > *v && adjust_delta < 0.0f && !is_decimal))
v_cur = v_min;
@@ -1804,7 +2047,7 @@ bool ImGui::DragBehaviorT(ImGuiDataType data_type, TYPE* v, float v_speed, const
return true;
}
-bool ImGui::DragBehavior(ImGuiID id, ImGuiDataType data_type, void* v, float v_speed, const void* v_min, const void* v_max, const char* format, float power)
+bool ImGui::DragBehavior(ImGuiID id, ImGuiDataType data_type, void* p_v, float v_speed, const void* p_min, const void* p_max, const char* format, float power, ImGuiDragFlags flags)
{
ImGuiContext& g = *GImGui;
if (g.ActiveId == id)
@@ -1819,94 +2062,99 @@ bool ImGui::DragBehavior(ImGuiID id, ImGuiDataType data_type, void* v, float v_s
switch (data_type)
{
- case ImGuiDataType_S32: return DragBehaviorT<ImS32, ImS32, float >(data_type, (ImS32*)v, v_speed, v_min ? *(const ImS32* )v_min : IM_S32_MIN, v_max ? *(const ImS32* )v_max : IM_S32_MAX, format, power);
- case ImGuiDataType_U32: return DragBehaviorT<ImU32, ImS32, float >(data_type, (ImU32*)v, v_speed, v_min ? *(const ImU32* )v_min : IM_U32_MIN, v_max ? *(const ImU32* )v_max : IM_U32_MAX, format, power);
- case ImGuiDataType_S64: return DragBehaviorT<ImS64, ImS64, double>(data_type, (ImS64*)v, v_speed, v_min ? *(const ImS64* )v_min : IM_S64_MIN, v_max ? *(const ImS64* )v_max : IM_S64_MAX, format, power);
- case ImGuiDataType_U64: return DragBehaviorT<ImU64, ImS64, double>(data_type, (ImU64*)v, v_speed, v_min ? *(const ImU64* )v_min : IM_U64_MIN, v_max ? *(const ImU64* )v_max : IM_U64_MAX, format, power);
- case ImGuiDataType_Float: return DragBehaviorT<float, float, float >(data_type, (float*)v, v_speed, v_min ? *(const float* )v_min : -FLT_MAX, v_max ? *(const float* )v_max : FLT_MAX, format, power);
- case ImGuiDataType_Double: return DragBehaviorT<double,double,double>(data_type, (double*)v, v_speed, v_min ? *(const double*)v_min : -DBL_MAX, v_max ? *(const double*)v_max : DBL_MAX, format, power);
+ case ImGuiDataType_S8: { ImS32 v32 = (ImS32)*(ImS8*)p_v; bool r = DragBehaviorT<ImS32, ImS32, float>(ImGuiDataType_S32, &v32, v_speed, p_min ? *(const ImS8*) p_min : IM_S8_MIN, p_max ? *(const ImS8*)p_max : IM_S8_MAX, format, power, flags); if (r) *(ImS8*)p_v = (ImS8)v32; return r; }
+ case ImGuiDataType_U8: { ImU32 v32 = (ImU32)*(ImU8*)p_v; bool r = DragBehaviorT<ImU32, ImS32, float>(ImGuiDataType_U32, &v32, v_speed, p_min ? *(const ImU8*) p_min : IM_U8_MIN, p_max ? *(const ImU8*)p_max : IM_U8_MAX, format, power, flags); if (r) *(ImU8*)p_v = (ImU8)v32; return r; }
+ case ImGuiDataType_S16: { ImS32 v32 = (ImS32)*(ImS16*)p_v; bool r = DragBehaviorT<ImS32, ImS32, float>(ImGuiDataType_S32, &v32, v_speed, p_min ? *(const ImS16*)p_min : IM_S16_MIN, p_max ? *(const ImS16*)p_max : IM_S16_MAX, format, power, flags); if (r) *(ImS16*)p_v = (ImS16)v32; return r; }
+ case ImGuiDataType_U16: { ImU32 v32 = (ImU32)*(ImU16*)p_v; bool r = DragBehaviorT<ImU32, ImS32, float>(ImGuiDataType_U32, &v32, v_speed, p_min ? *(const ImU16*)p_min : IM_U16_MIN, p_max ? *(const ImU16*)p_max : IM_U16_MAX, format, power, flags); if (r) *(ImU16*)p_v = (ImU16)v32; return r; }
+ case ImGuiDataType_S32: return DragBehaviorT<ImS32, ImS32, float >(data_type, (ImS32*)p_v, v_speed, p_min ? *(const ImS32* )p_min : IM_S32_MIN, p_max ? *(const ImS32* )p_max : IM_S32_MAX, format, power, flags);
+ case ImGuiDataType_U32: return DragBehaviorT<ImU32, ImS32, float >(data_type, (ImU32*)p_v, v_speed, p_min ? *(const ImU32* )p_min : IM_U32_MIN, p_max ? *(const ImU32* )p_max : IM_U32_MAX, format, power, flags);
+ case ImGuiDataType_S64: return DragBehaviorT<ImS64, ImS64, double>(data_type, (ImS64*)p_v, v_speed, p_min ? *(const ImS64* )p_min : IM_S64_MIN, p_max ? *(const ImS64* )p_max : IM_S64_MAX, format, power, flags);
+ case ImGuiDataType_U64: return DragBehaviorT<ImU64, ImS64, double>(data_type, (ImU64*)p_v, v_speed, p_min ? *(const ImU64* )p_min : IM_U64_MIN, p_max ? *(const ImU64* )p_max : IM_U64_MAX, format, power, flags);
+ case ImGuiDataType_Float: return DragBehaviorT<float, float, float >(data_type, (float*)p_v, v_speed, p_min ? *(const float* )p_min : -FLT_MAX, p_max ? *(const float* )p_max : FLT_MAX, format, power, flags);
+ case ImGuiDataType_Double: return DragBehaviorT<double,double,double>(data_type, (double*)p_v, v_speed, p_min ? *(const double*)p_min : -DBL_MAX, p_max ? *(const double*)p_max : DBL_MAX, format, power, flags);
case ImGuiDataType_COUNT: break;
}
IM_ASSERT(0);
return false;
}
-bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* v, float v_speed, const void* v_min, const void* v_max, const char* format, float power)
+// Note: p_data, p_min and p_max are _pointers_ to a memory address holding the data. For a Drag widget, p_min and p_max are optional.
+// Read code of e.g. SliderFloat(), SliderInt() etc. or examples in 'Demo->Widgets->Data Types' to understand how to use this function directly.
+bool ImGui::DragScalar(const char* label, ImGuiDataType data_type, void* p_data, float v_speed, const void* p_min, const void* p_max, const char* format, float power)
{
ImGuiWindow* window = GetCurrentWindow();
if (window->SkipItems)
return false;
if (power != 1.0f)
- IM_ASSERT(v_min != NULL && v_max != NULL); // When using a power curve the drag needs to have known bounds
+ IM_ASSERT(p_min != NULL && p_max != NULL); // When using a power curve the drag needs to have known bounds
ImGuiContext& g = *GImGui;
const ImGuiStyle& style = g.Style;
const ImGuiID id = window->GetID(label);
const float w = CalcItemWidth();
-
const ImVec2 label_size = CalcTextSize(label, NULL, true);
const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y*2.0f));
- const ImRect inner_bb(frame_bb.Min + style.FramePadding, frame_bb.Max - style.FramePadding);
const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));
- // NB- we don't call ItemSize() yet because we may turn into a text edit box below
+ ItemSize(total_bb, style.FramePadding.y);
if (!ItemAdd(total_bb, id, &frame_bb))
- {
- ItemSize(total_bb, style.FramePadding.y);
return false;
- }
- const bool hovered = ItemHoverable(frame_bb, id);
// Default format string when passing NULL
- // Patch old "%.0f" format string to use "%d", read function comments for more details.
- IM_ASSERT(data_type >= 0 && data_type < ImGuiDataType_COUNT);
if (format == NULL)
- format = GDataTypeInfo[data_type].PrintFmt;
- else if (data_type == ImGuiDataType_S32 && strcmp(format, "%d") != 0)
+ format = DataTypeGetInfo(data_type)->PrintFmt;
+ else if (data_type == ImGuiDataType_S32 && strcmp(format, "%d") != 0) // (FIXME-LEGACY: Patch old "%.0f" format string to use "%d", read function more details.)
format = PatchFormatStringFloatToInt(format);
// Tabbing or CTRL-clicking on Drag turns it into an input box
- bool start_text_input = false;
- const bool tab_focus_requested = FocusableItemRegister(window, id);
- if (tab_focus_requested || (hovered && (g.IO.MouseClicked[0] || g.IO.MouseDoubleClicked[0])) || g.NavActivateId == id || (g.NavInputId == id && g.ScalarAsInputTextId != id))
- {
- SetActiveID(id, window);
- SetFocusID(id, window);
- FocusWindow(window);
- g.ActiveIdAllowNavDirFlags = (1 << ImGuiDir_Up) | (1 << ImGuiDir_Down);
- if (tab_focus_requested || g.IO.KeyCtrl || g.IO.MouseDoubleClicked[0] || g.NavInputId == id)
+ const bool hovered = ItemHoverable(frame_bb, id);
+ bool temp_input_is_active = TempInputTextIsActive(id);
+ bool temp_input_start = false;
+ if (!temp_input_is_active)
+ {
+ const bool focus_requested = FocusableItemRegister(window, id);
+ const bool clicked = (hovered && g.IO.MouseClicked[0]);
+ const bool double_clicked = (hovered && g.IO.MouseDoubleClicked[0]);
+ if (focus_requested || clicked || double_clicked || g.NavActivateId == id || g.NavInputId == id)
{
- start_text_input = true;
- g.ScalarAsInputTextId = 0;
+ SetActiveID(id, window);
+ SetFocusID(id, window);
+ FocusWindow(window);
+ g.ActiveIdUsingNavDirMask = (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right);
+ if (focus_requested || (clicked && g.IO.KeyCtrl) || double_clicked || g.NavInputId == id)
+ {
+ temp_input_start = true;
+ FocusableItemUnregister(window);
+ }
}
}
- if (start_text_input || (g.ActiveId == id && g.ScalarAsInputTextId == id))
- return InputScalarAsWidgetReplacement(frame_bb, id, label, data_type, v, format);
-
- // Actual drag behavior
- ItemSize(total_bb, style.FramePadding.y);
- const bool value_changed = DragBehavior(id, data_type, v, v_speed, v_min, v_max, format, power);
- if (value_changed)
- MarkItemEdited(id);
+ if (temp_input_is_active || temp_input_start)
+ return TempInputTextScalar(frame_bb, id, label, data_type, p_data, format);
// Draw frame
const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg);
RenderNavHighlight(frame_bb, id);
RenderFrame(frame_bb.Min, frame_bb.Max, frame_col, true, style.FrameRounding);
+ // Drag behavior
+ const bool value_changed = DragBehavior(id, data_type, p_data, v_speed, p_min, p_max, format, power, ImGuiDragFlags_None);
+ if (value_changed)
+ MarkItemEdited(id);
+
// Display value using user-provided display format so user can add prefix/suffix/decorations to the value.
char value_buf[64];
- const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, v, format);
+ const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, p_data, format);
RenderTextClipped(frame_bb.Min, frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f, 0.5f));
if (label_size.x > 0.0f)
- RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, inner_bb.Min.y), label);
+ RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label);
+ IMGUI_TEST_ENGINE_ITEM_INFO(id, label, window->DC.ItemFlags);
return value_changed;
}
-bool ImGui::DragScalarN(const char* label, ImGuiDataType data_type, void* v, int components, float v_speed, const void* v_min, const void* v_max, const char* format, float power)
+bool ImGui::DragScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, float v_speed, const void* p_min, const void* p_max, const char* format, float power)
{
ImGuiWindow* window = GetCurrentWindow();
if (window->SkipItems)
@@ -1916,20 +2164,27 @@ bool ImGui::DragScalarN(const char* label, ImGuiDataType data_type, void* v, int
bool value_changed = false;
BeginGroup();
PushID(label);
- PushMultiItemsWidths(components);
+ PushMultiItemsWidths(components, CalcItemWidth());
size_t type_size = GDataTypeInfo[data_type].Size;
for (int i = 0; i < components; i++)
{
PushID(i);
- value_changed |= DragScalar("##v", data_type, v, v_speed, v_min, v_max, format, power);
- SameLine(0, g.Style.ItemInnerSpacing.x);
+ if (i > 0)
+ SameLine(0, g.Style.ItemInnerSpacing.x);
+ value_changed |= DragScalar("", data_type, p_data, v_speed, p_min, p_max, format, power);
PopID();
PopItemWidth();
- v = (void*)((char*)v + type_size);
+ p_data = (void*)((char*)p_data + type_size);
}
PopID();
- TextUnformatted(label, FindRenderedTextEnd(label));
+ const char* label_end = FindRenderedTextEnd(label);
+ if (label != label_end)
+ {
+ SameLine(0, g.Style.ItemInnerSpacing.x);
+ TextEx(label, label_end);
+ }
+
EndGroup();
return value_changed;
}
@@ -1963,7 +2218,7 @@ bool ImGui::DragFloatRange2(const char* label, float* v_current_min, float* v_cu
ImGuiContext& g = *GImGui;
PushID(label);
BeginGroup();
- PushMultiItemsWidths(2);
+ PushMultiItemsWidths(2, CalcItemWidth());
bool value_changed = DragFloat("##min", v_current_min, v_speed, (v_min >= v_max) ? -FLT_MAX : v_min, (v_min >= v_max) ? *v_current_max : ImMin(v_max, *v_current_max), format, power);
PopItemWidth();
@@ -1972,7 +2227,7 @@ bool ImGui::DragFloatRange2(const char* label, float* v_current_min, float* v_cu
PopItemWidth();
SameLine(0, g.Style.ItemInnerSpacing.x);
- TextUnformatted(label, FindRenderedTextEnd(label));
+ TextEx(label, FindRenderedTextEnd(label));
EndGroup();
PopID();
return value_changed;
@@ -2008,7 +2263,7 @@ bool ImGui::DragIntRange2(const char* label, int* v_current_min, int* v_current_
ImGuiContext& g = *GImGui;
PushID(label);
BeginGroup();
- PushMultiItemsWidths(2);
+ PushMultiItemsWidths(2, CalcItemWidth());
bool value_changed = DragInt("##min", v_current_min, v_speed, (v_min >= v_max) ? INT_MIN : v_min, (v_min >= v_max) ? *v_current_max : ImMin(v_max, *v_current_max), format);
PopItemWidth();
@@ -2017,7 +2272,7 @@ bool ImGui::DragIntRange2(const char* label, int* v_current_min, int* v_current_
PopItemWidth();
SameLine(0, g.Style.ItemInnerSpacing.x);
- TextUnformatted(label, FindRenderedTextEnd(label));
+ TextEx(label, FindRenderedTextEnd(label));
EndGroup();
PopID();
@@ -2078,28 +2333,28 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ
ImGuiContext& g = *GImGui;
const ImGuiStyle& style = g.Style;
- const bool is_horizontal = (flags & ImGuiSliderFlags_Vertical) == 0;
+ const ImGuiAxis axis = (flags & ImGuiSliderFlags_Vertical) ? ImGuiAxis_Y : ImGuiAxis_X;
const bool is_decimal = (data_type == ImGuiDataType_Float) || (data_type == ImGuiDataType_Double);
const bool is_power = (power != 1.0f) && is_decimal;
const float grab_padding = 2.0f;
- const float slider_sz = is_horizontal ? (bb.GetWidth() - grab_padding * 2.0f) : (bb.GetHeight() - grab_padding * 2.0f);
+ const float slider_sz = (bb.Max[axis] - bb.Min[axis]) - grab_padding * 2.0f;
float grab_sz = style.GrabMinSize;
SIGNEDTYPE v_range = (v_min < v_max ? v_max - v_min : v_min - v_max);
if (!is_decimal && v_range >= 0) // v_range < 0 may happen on integer overflows
grab_sz = ImMax((float)(slider_sz / (v_range + 1)), style.GrabMinSize); // For integer sliders: if possible have the grab size represent 1 unit
grab_sz = ImMin(grab_sz, slider_sz);
const float slider_usable_sz = slider_sz - grab_sz;
- const float slider_usable_pos_min = (is_horizontal ? bb.Min.x : bb.Min.y) + grab_padding + grab_sz*0.5f;
- const float slider_usable_pos_max = (is_horizontal ? bb.Max.x : bb.Max.y) - grab_padding - grab_sz*0.5f;
+ const float slider_usable_pos_min = bb.Min[axis] + grab_padding + grab_sz * 0.5f;
+ const float slider_usable_pos_max = bb.Max[axis] - grab_padding - grab_sz * 0.5f;
// For power curve sliders that cross over sign boundary we want the curve to be symmetric around 0.0f
float linear_zero_pos; // 0.0->1.0f
if (is_power && v_min * v_max < 0.0f)
{
// Different sign
- const FLOATTYPE linear_dist_min_to_0 = ImPow(v_min >= 0 ? (FLOATTYPE)v_min : -(FLOATTYPE)v_min, (FLOATTYPE)1.0f/power);
- const FLOATTYPE linear_dist_max_to_0 = ImPow(v_max >= 0 ? (FLOATTYPE)v_max : -(FLOATTYPE)v_max, (FLOATTYPE)1.0f/power);
+ const FLOATTYPE linear_dist_min_to_0 = ImPow(v_min >= 0 ? (FLOATTYPE)v_min : -(FLOATTYPE)v_min, (FLOATTYPE)1.0f / power);
+ const FLOATTYPE linear_dist_max_to_0 = ImPow(v_max >= 0 ? (FLOATTYPE)v_max : -(FLOATTYPE)v_max, (FLOATTYPE)1.0f / power);
linear_zero_pos = (float)(linear_dist_min_to_0 / (linear_dist_min_to_0 + linear_dist_max_to_0));
}
else
@@ -2122,9 +2377,9 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ
}
else
{
- const float mouse_abs_pos = is_horizontal ? g.IO.MousePos.x : g.IO.MousePos.y;
+ const float mouse_abs_pos = g.IO.MousePos[axis];
clicked_t = (slider_usable_sz > 0.0f) ? ImClamp((mouse_abs_pos - slider_usable_pos_min) / slider_usable_sz, 0.0f, 1.0f) : 0.0f;
- if (!is_horizontal)
+ if (axis == ImGuiAxis_Y)
clicked_t = 1.0f - clicked_t;
set_new_value = true;
}
@@ -2132,7 +2387,7 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ
else if (g.ActiveIdSource == ImGuiInputSource_Nav)
{
const ImVec2 delta2 = GetNavInputAmount2d(ImGuiNavDirSourceFlags_Keyboard | ImGuiNavDirSourceFlags_PadDPad, ImGuiInputReadMode_RepeatFast, 0.0f, 0.0f);
- float delta = is_horizontal ? delta2.x : -delta2.y;
+ float delta = (axis == ImGuiAxis_X) ? delta2.x : -delta2.y;
if (g.NavActivatePressedId == id && !g.ActiveIdIsJustActivated)
{
ClearActiveID();
@@ -2203,7 +2458,7 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ
FLOATTYPE v_new_off_f = (v_max - v_min) * clicked_t;
TYPE v_new_off_floor = (TYPE)(v_new_off_f);
TYPE v_new_off_round = (TYPE)(v_new_off_f + (FLOATTYPE)0.5);
- if (!is_decimal && v_new_off_floor < v_new_off_round)
+ if (v_new_off_floor < v_new_off_round)
v_new = v_min + v_new_off_round;
else
v_new = v_min + v_new_off_floor;
@@ -2222,51 +2477,64 @@ bool ImGui::SliderBehaviorT(const ImRect& bb, ImGuiID id, ImGuiDataType data_typ
}
}
- // Output grab position so it can be displayed by the caller
- float grab_t = SliderCalcRatioFromValueT<TYPE,FLOATTYPE>(data_type, *v, v_min, v_max, power, linear_zero_pos);
- if (!is_horizontal)
- grab_t = 1.0f - grab_t;
- const float grab_pos = ImLerp(slider_usable_pos_min, slider_usable_pos_max, grab_t);
- if (is_horizontal)
- *out_grab_bb = ImRect(grab_pos - grab_sz*0.5f, bb.Min.y + grab_padding, grab_pos + grab_sz*0.5f, bb.Max.y - grab_padding);
+ if (slider_sz < 1.0f)
+ {
+ *out_grab_bb = ImRect(bb.Min, bb.Min);
+ }
else
- *out_grab_bb = ImRect(bb.Min.x + grab_padding, grab_pos - grab_sz*0.5f, bb.Max.x - grab_padding, grab_pos + grab_sz*0.5f);
+ {
+ // Output grab position so it can be displayed by the caller
+ float grab_t = SliderCalcRatioFromValueT<TYPE, FLOATTYPE>(data_type, *v, v_min, v_max, power, linear_zero_pos);
+ if (axis == ImGuiAxis_Y)
+ grab_t = 1.0f - grab_t;
+ const float grab_pos = ImLerp(slider_usable_pos_min, slider_usable_pos_max, grab_t);
+ if (axis == ImGuiAxis_X)
+ *out_grab_bb = ImRect(grab_pos - grab_sz * 0.5f, bb.Min.y + grab_padding, grab_pos + grab_sz * 0.5f, bb.Max.y - grab_padding);
+ else
+ *out_grab_bb = ImRect(bb.Min.x + grab_padding, grab_pos - grab_sz * 0.5f, bb.Max.x - grab_padding, grab_pos + grab_sz * 0.5f);
+ }
return value_changed;
}
-// For 32-bits and larger types, slider bounds are limited to half the natural type range.
+// For 32-bit and larger types, slider bounds are limited to half the natural type range.
// So e.g. an integer Slider between INT_MAX-10 and INT_MAX will fail, but an integer Slider between INT_MAX/2-10 and INT_MAX/2 will be ok.
// It would be possible to lift that limitation with some work but it doesn't seem to be worth it for sliders.
-bool ImGui::SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* v, const void* v_min, const void* v_max, const char* format, float power, ImGuiSliderFlags flags, ImRect* out_grab_bb)
+bool ImGui::SliderBehavior(const ImRect& bb, ImGuiID id, ImGuiDataType data_type, void* p_v, const void* p_min, const void* p_max, const char* format, float power, ImGuiSliderFlags flags, ImRect* out_grab_bb)
{
switch (data_type)
{
+ case ImGuiDataType_S8: { ImS32 v32 = (ImS32)*(ImS8*)p_v; bool r = SliderBehaviorT<ImS32, ImS32, float>(bb, id, ImGuiDataType_S32, &v32, *(const ImS8*)p_min, *(const ImS8*)p_max, format, power, flags, out_grab_bb); if (r) *(ImS8*)p_v = (ImS8)v32; return r; }
+ case ImGuiDataType_U8: { ImU32 v32 = (ImU32)*(ImU8*)p_v; bool r = SliderBehaviorT<ImU32, ImS32, float>(bb, id, ImGuiDataType_U32, &v32, *(const ImU8*)p_min, *(const ImU8*)p_max, format, power, flags, out_grab_bb); if (r) *(ImU8*)p_v = (ImU8)v32; return r; }
+ case ImGuiDataType_S16: { ImS32 v32 = (ImS32)*(ImS16*)p_v; bool r = SliderBehaviorT<ImS32, ImS32, float>(bb, id, ImGuiDataType_S32, &v32, *(const ImS16*)p_min, *(const ImS16*)p_max, format, power, flags, out_grab_bb); if (r) *(ImS16*)p_v = (ImS16)v32; return r; }
+ case ImGuiDataType_U16: { ImU32 v32 = (ImU32)*(ImU16*)p_v; bool r = SliderBehaviorT<ImU32, ImS32, float>(bb, id, ImGuiDataType_U32, &v32, *(const ImU16*)p_min, *(const ImU16*)p_max, format, power, flags, out_grab_bb); if (r) *(ImU16*)p_v = (ImU16)v32; return r; }
case ImGuiDataType_S32:
- IM_ASSERT(*(const ImS32*)v_min >= IM_S32_MIN/2 && *(const ImS32*)v_max <= IM_S32_MAX/2);
- return SliderBehaviorT<ImS32, ImS32, float >(bb, id, data_type, (ImS32*)v, *(const ImS32*)v_min, *(const ImS32*)v_max, format, power, flags, out_grab_bb);
+ IM_ASSERT(*(const ImS32*)p_min >= IM_S32_MIN/2 && *(const ImS32*)p_max <= IM_S32_MAX/2);
+ return SliderBehaviorT<ImS32, ImS32, float >(bb, id, data_type, (ImS32*)p_v, *(const ImS32*)p_min, *(const ImS32*)p_max, format, power, flags, out_grab_bb);
case ImGuiDataType_U32:
- IM_ASSERT(*(const ImU32*)v_min <= IM_U32_MAX/2);
- return SliderBehaviorT<ImU32, ImS32, float >(bb, id, data_type, (ImU32*)v, *(const ImU32*)v_min, *(const ImU32*)v_max, format, power, flags, out_grab_bb);
+ IM_ASSERT(*(const ImU32*)p_max <= IM_U32_MAX/2);
+ return SliderBehaviorT<ImU32, ImS32, float >(bb, id, data_type, (ImU32*)p_v, *(const ImU32*)p_min, *(const ImU32*)p_max, format, power, flags, out_grab_bb);
case ImGuiDataType_S64:
- IM_ASSERT(*(const ImS64*)v_min >= IM_S64_MIN/2 && *(const ImS64*)v_max <= IM_S64_MAX/2);
- return SliderBehaviorT<ImS64, ImS64, double>(bb, id, data_type, (ImS64*)v, *(const ImS64*)v_min, *(const ImS64*)v_max, format, power, flags, out_grab_bb);
+ IM_ASSERT(*(const ImS64*)p_min >= IM_S64_MIN/2 && *(const ImS64*)p_max <= IM_S64_MAX/2);
+ return SliderBehaviorT<ImS64, ImS64, double>(bb, id, data_type, (ImS64*)p_v, *(const ImS64*)p_min, *(const ImS64*)p_max, format, power, flags, out_grab_bb);
case ImGuiDataType_U64:
- IM_ASSERT(*(const ImU64*)v_min <= IM_U64_MAX/2);
- return SliderBehaviorT<ImU64, ImS64, double>(bb, id, data_type, (ImU64*)v, *(const ImU64*)v_min, *(const ImU64*)v_max, format, power, flags, out_grab_bb);
+ IM_ASSERT(*(const ImU64*)p_max <= IM_U64_MAX/2);
+ return SliderBehaviorT<ImU64, ImS64, double>(bb, id, data_type, (ImU64*)p_v, *(const ImU64*)p_min, *(const ImU64*)p_max, format, power, flags, out_grab_bb);
case ImGuiDataType_Float:
- IM_ASSERT(*(const float*)v_min >= -FLT_MAX/2.0f && *(const float*)v_max <= FLT_MAX/2.0f);
- return SliderBehaviorT<float, float, float >(bb, id, data_type, (float*)v, *(const float*)v_min, *(const float*)v_max, format, power, flags, out_grab_bb);
+ IM_ASSERT(*(const float*)p_min >= -FLT_MAX/2.0f && *(const float*)p_max <= FLT_MAX/2.0f);
+ return SliderBehaviorT<float, float, float >(bb, id, data_type, (float*)p_v, *(const float*)p_min, *(const float*)p_max, format, power, flags, out_grab_bb);
case ImGuiDataType_Double:
- IM_ASSERT(*(const double*)v_min >= -DBL_MAX/2.0f && *(const double*)v_max <= DBL_MAX/2.0f);
- return SliderBehaviorT<double,double,double>(bb, id, data_type, (double*)v, *(const double*)v_min, *(const double*)v_max, format, power, flags, out_grab_bb);
+ IM_ASSERT(*(const double*)p_min >= -DBL_MAX/2.0f && *(const double*)p_max <= DBL_MAX/2.0f);
+ return SliderBehaviorT<double,double,double>(bb, id, data_type, (double*)p_v, *(const double*)p_min, *(const double*)p_max, format, power, flags, out_grab_bb);
case ImGuiDataType_COUNT: break;
}
IM_ASSERT(0);
return false;
}
-bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* v, const void* v_min, const void* v_max, const char* format, float power)
+// Note: p_data, p_min and p_max are _pointers_ to a memory address holding the data. For a slider, they are all required.
+// Read code of e.g. SliderFloat(), SliderInt() etc. or examples in 'Demo->Widgets->Data Types' to understand how to use this function directly.
+bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, float power)
{
ImGuiWindow* window = GetCurrentWindow();
if (window->SkipItems)
@@ -2281,41 +2549,39 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* v, co
const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(w, label_size.y + style.FramePadding.y*2.0f));
const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));
- // NB- we don't call ItemSize() yet because we may turn into a text edit box below
+ ItemSize(total_bb, style.FramePadding.y);
if (!ItemAdd(total_bb, id, &frame_bb))
- {
- ItemSize(total_bb, style.FramePadding.y);
return false;
- }
// Default format string when passing NULL
- // Patch old "%.0f" format string to use "%d", read function comments for more details.
- IM_ASSERT(data_type >= 0 && data_type < ImGuiDataType_COUNT);
if (format == NULL)
- format = GDataTypeInfo[data_type].PrintFmt;
- else if (data_type == ImGuiDataType_S32 && strcmp(format, "%d") != 0)
+ format = DataTypeGetInfo(data_type)->PrintFmt;
+ else if (data_type == ImGuiDataType_S32 && strcmp(format, "%d") != 0) // (FIXME-LEGACY: Patch old "%.0f" format string to use "%d", read function more details.)
format = PatchFormatStringFloatToInt(format);
// Tabbing or CTRL-clicking on Slider turns it into an input box
- bool start_text_input = false;
- const bool tab_focus_requested = FocusableItemRegister(window, id);
const bool hovered = ItemHoverable(frame_bb, id);
- if (tab_focus_requested || (hovered && g.IO.MouseClicked[0]) || g.NavActivateId == id || (g.NavInputId == id && g.ScalarAsInputTextId != id))
+ bool temp_input_is_active = TempInputTextIsActive(id);
+ bool temp_input_start = false;
+ if (!temp_input_is_active)
{
- SetActiveID(id, window);
- SetFocusID(id, window);
- FocusWindow(window);
- g.ActiveIdAllowNavDirFlags = (1 << ImGuiDir_Up) | (1 << ImGuiDir_Down);
- if (tab_focus_requested || g.IO.KeyCtrl || g.NavInputId == id)
+ const bool focus_requested = FocusableItemRegister(window, id);
+ const bool clicked = (hovered && g.IO.MouseClicked[0]);
+ if (focus_requested || clicked || g.NavActivateId == id || g.NavInputId == id)
{
- start_text_input = true;
- g.ScalarAsInputTextId = 0;
+ SetActiveID(id, window);
+ SetFocusID(id, window);
+ FocusWindow(window);
+ g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right);
+ if (focus_requested || (clicked && g.IO.KeyCtrl) || g.NavInputId == id)
+ {
+ temp_input_start = true;
+ FocusableItemUnregister(window);
+ }
}
}
- if (start_text_input || (g.ActiveId == id && g.ScalarAsInputTextId == id))
- return InputScalarAsWidgetReplacement(frame_bb, id, label, data_type, v, format);
-
- ItemSize(total_bb, style.FramePadding.y);
+ if (temp_input_is_active || temp_input_start)
+ return TempInputTextScalar(frame_bb, id, label, data_type, p_data, format);
// Draw frame
const ImU32 frame_col = GetColorU32(g.ActiveId == id ? ImGuiCol_FrameBgActive : g.HoveredId == id ? ImGuiCol_FrameBgHovered : ImGuiCol_FrameBg);
@@ -2324,21 +2590,23 @@ bool ImGui::SliderScalar(const char* label, ImGuiDataType data_type, void* v, co
// Slider behavior
ImRect grab_bb;
- const bool value_changed = SliderBehavior(frame_bb, id, data_type, v, v_min, v_max, format, power, ImGuiSliderFlags_None, &grab_bb);
+ const bool value_changed = SliderBehavior(frame_bb, id, data_type, p_data, p_min, p_max, format, power, ImGuiSliderFlags_None, &grab_bb);
if (value_changed)
MarkItemEdited(id);
// Render grab
- window->DrawList->AddRectFilled(grab_bb.Min, grab_bb.Max, GetColorU32(g.ActiveId == id ? ImGuiCol_SliderGrabActive : ImGuiCol_SliderGrab), style.GrabRounding);
+ if (grab_bb.Max.x > grab_bb.Min.x)
+ window->DrawList->AddRectFilled(grab_bb.Min, grab_bb.Max, GetColorU32(g.ActiveId == id ? ImGuiCol_SliderGrabActive : ImGuiCol_SliderGrab), style.GrabRounding);
// Display value using user-provided display format so user can add prefix/suffix/decorations to the value.
char value_buf[64];
- const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, v, format);
+ const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, p_data, format);
RenderTextClipped(frame_bb.Min, frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f,0.5f));
if (label_size.x > 0.0f)
RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label);
+ IMGUI_TEST_ENGINE_ITEM_INFO(id, label, window->DC.ItemFlags);
return value_changed;
}
@@ -2353,20 +2621,27 @@ bool ImGui::SliderScalarN(const char* label, ImGuiDataType data_type, void* v, i
bool value_changed = false;
BeginGroup();
PushID(label);
- PushMultiItemsWidths(components);
+ PushMultiItemsWidths(components, CalcItemWidth());
size_t type_size = GDataTypeInfo[data_type].Size;
for (int i = 0; i < components; i++)
{
PushID(i);
- value_changed |= SliderScalar("##v", data_type, v, v_min, v_max, format, power);
- SameLine(0, g.Style.ItemInnerSpacing.x);
+ if (i > 0)
+ SameLine(0, g.Style.ItemInnerSpacing.x);
+ value_changed |= SliderScalar("", data_type, v, v_min, v_max, format, power);
PopID();
PopItemWidth();
v = (void*)((char*)v + type_size);
}
PopID();
- TextUnformatted(label, FindRenderedTextEnd(label));
+ const char* label_end = FindRenderedTextEnd(label);
+ if (label != label_end)
+ {
+ SameLine(0, g.Style.ItemInnerSpacing.x);
+ TextEx(label, label_end);
+ }
+
EndGroup();
return value_changed;
}
@@ -2421,7 +2696,7 @@ bool ImGui::SliderInt4(const char* label, int v[4], int v_min, int v_max, const
return SliderScalarN(label, ImGuiDataType_S32, v, 4, &v_min, &v_max, format);
}
-bool ImGui::VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType data_type, void* v, const void* v_min, const void* v_max, const char* format, float power)
+bool ImGui::VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType data_type, void* p_data, const void* p_min, const void* p_max, const char* format, float power)
{
ImGuiWindow* window = GetCurrentWindow();
if (window->SkipItems)
@@ -2440,11 +2715,9 @@ bool ImGui::VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType d
return false;
// Default format string when passing NULL
- // Patch old "%.0f" format string to use "%d", read function comments for more details.
- IM_ASSERT(data_type >= 0 && data_type < ImGuiDataType_COUNT);
if (format == NULL)
- format = GDataTypeInfo[data_type].PrintFmt;
- else if (data_type == ImGuiDataType_S32 && strcmp(format, "%d") != 0)
+ format = DataTypeGetInfo(data_type)->PrintFmt;
+ else if (data_type == ImGuiDataType_S32 && strcmp(format, "%d") != 0) // (FIXME-LEGACY: Patch old "%.0f" format string to use "%d", read function more details.)
format = PatchFormatStringFloatToInt(format);
const bool hovered = ItemHoverable(frame_bb, id);
@@ -2453,7 +2726,7 @@ bool ImGui::VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType d
SetActiveID(id, window);
SetFocusID(id, window);
FocusWindow(window);
- g.ActiveIdAllowNavDirFlags = (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right);
+ g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Up) | (1 << ImGuiDir_Down);
}
// Draw frame
@@ -2463,17 +2736,18 @@ bool ImGui::VSliderScalar(const char* label, const ImVec2& size, ImGuiDataType d
// Slider behavior
ImRect grab_bb;
- const bool value_changed = SliderBehavior(frame_bb, id, data_type, v, v_min, v_max, format, power, ImGuiSliderFlags_Vertical, &grab_bb);
+ const bool value_changed = SliderBehavior(frame_bb, id, data_type, p_data, p_min, p_max, format, power, ImGuiSliderFlags_Vertical, &grab_bb);
if (value_changed)
MarkItemEdited(id);
// Render grab
- window->DrawList->AddRectFilled(grab_bb.Min, grab_bb.Max, GetColorU32(g.ActiveId == id ? ImGuiCol_SliderGrabActive : ImGuiCol_SliderGrab), style.GrabRounding);
+ if (grab_bb.Max.y > grab_bb.Min.y)
+ window->DrawList->AddRectFilled(grab_bb.Min, grab_bb.Max, GetColorU32(g.ActiveId == id ? ImGuiCol_SliderGrabActive : ImGuiCol_SliderGrab), style.GrabRounding);
// Display value using user-provided display format so user can add prefix/suffix/decorations to the value.
// For the vertical slider we allow centered text to overlap the frame padding
char value_buf[64];
- const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, v, format);
+ const char* value_buf_end = value_buf + DataTypeFormatString(value_buf, IM_ARRAYSIZE(value_buf), data_type, p_data, format);
RenderTextClipped(ImVec2(frame_bb.Min.x, frame_bb.Min.y + style.FramePadding.y), frame_bb.Max, value_buf, value_buf_end, NULL, ImVec2(0.5f,0.0f));
if (label_size.x > 0.0f)
RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label);
@@ -2498,7 +2772,7 @@ bool ImGui::VSliderInt(const char* label, const ImVec2& size, int* v, int v_min,
// - ImParseFormatFindEnd() [Internal]
// - ImParseFormatTrimDecorations() [Internal]
// - ImParseFormatPrecision() [Internal]
-// - InputScalarAsWidgetReplacement() [Internal]
+// - TempInputTextScalar() [Internal]
// - InputScalar()
// - InputScalarN()
// - InputFloat()
@@ -2548,7 +2822,7 @@ const char* ImParseFormatFindEnd(const char* fmt)
// fmt = "%.3f" -> return fmt
// fmt = "hello %.3f" -> return fmt + 6
// fmt = "%.3f hello" -> return buf written with "%.3f"
-const char* ImParseFormatTrimDecorations(const char* fmt, char* buf, int buf_size)
+const char* ImParseFormatTrimDecorations(const char* fmt, char* buf, size_t buf_size)
{
const char* fmt_start = ImParseFormatFindStart(fmt);
if (fmt_start[0] != '%')
@@ -2556,7 +2830,7 @@ const char* ImParseFormatTrimDecorations(const char* fmt, char* buf, int buf_siz
const char* fmt_end = ImParseFormatFindEnd(fmt_start);
if (fmt_end[0] == 0) // If we only have leading decoration, we don't need to copy the data.
return fmt_start;
- ImStrncpy(buf, fmt_start, ImMin((int)(fmt_end + 1 - fmt_start), buf_size));
+ ImStrncpy(buf, fmt_start, ImMin((size_t)(fmt_end - fmt_start) + 1, buf_size));
return buf;
}
@@ -2584,100 +2858,118 @@ int ImParseFormatPrecision(const char* fmt, int default_precision)
return (precision == INT_MAX) ? default_precision : precision;
}
-// Create text input in place of a slider (when CTRL+Clicking on slider)
-// FIXME: Logic is messy and confusing.
-bool ImGui::InputScalarAsWidgetReplacement(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* data_ptr, const char* format)
+// Create text input in place of another active widget (e.g. used when doing a CTRL+Click on drag/slider widgets)
+// FIXME: Facilitate using this in variety of other situations.
+bool ImGui::TempInputTextScalar(const ImRect& bb, ImGuiID id, const char* label, ImGuiDataType data_type, void* p_data, const char* format)
{
ImGuiContext& g = *GImGui;
- ImGuiWindow* window = GetCurrentWindow();
- // Our replacement widget will override the focus ID (registered previously to allow for a TAB focus to happen)
- // On the first frame, g.ScalarAsInputTextId == 0, then on subsequent frames it becomes == id
- SetActiveID(g.ScalarAsInputTextId, window);
- g.ActiveIdAllowNavDirFlags = (1 << ImGuiDir_Up) | (1 << ImGuiDir_Down);
- SetHoveredID(0);
- FocusableItemUnregister(window);
+ // On the first frame, g.TempInputTextId == 0, then on subsequent frames it becomes == id.
+ // We clear ActiveID on the first frame to allow the InputText() taking it back.
+ const bool init = (g.TempInputTextId != id);
+ if (init)
+ ClearActiveID();
char fmt_buf[32];
char data_buf[32];
format = ImParseFormatTrimDecorations(format, fmt_buf, IM_ARRAYSIZE(fmt_buf));
- DataTypeFormatString(data_buf, IM_ARRAYSIZE(data_buf), data_type, data_ptr, format);
+ DataTypeFormatString(data_buf, IM_ARRAYSIZE(data_buf), data_type, p_data, format);
ImStrTrimBlanks(data_buf);
- ImGuiInputTextFlags flags = ImGuiInputTextFlags_AutoSelectAll | ((data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double) ? ImGuiInputTextFlags_CharsScientific : ImGuiInputTextFlags_CharsDecimal);
- bool value_changed = InputTextEx(label, data_buf, IM_ARRAYSIZE(data_buf), bb.GetSize(), flags);
- if (g.ScalarAsInputTextId == 0) // First frame we started displaying the InputText widget
+
+ g.CurrentWindow->DC.CursorPos = bb.Min;
+ ImGuiInputTextFlags flags = ImGuiInputTextFlags_AutoSelectAll | ImGuiInputTextFlags_NoMarkEdited;
+ flags |= ((data_type == ImGuiDataType_Float || data_type == ImGuiDataType_Double) ? ImGuiInputTextFlags_CharsScientific : ImGuiInputTextFlags_CharsDecimal);
+ bool value_changed = InputTextEx(label, NULL, data_buf, IM_ARRAYSIZE(data_buf), bb.GetSize(), flags);
+ if (init)
{
- IM_ASSERT(g.ActiveId == id); // InputText ID expected to match the Slider ID
- g.ScalarAsInputTextId = g.ActiveId;
- SetHoveredID(id);
+ // First frame we started displaying the InputText widget, we expect it to take the active id.
+ IM_ASSERT(g.ActiveId == id);
+ g.TempInputTextId = g.ActiveId;
}
if (value_changed)
- return DataTypeApplyOpFromText(data_buf, g.InputTextState.InitialText.Data, data_type, data_ptr, NULL);
- return false;
+ {
+ value_changed = DataTypeApplyOpFromText(data_buf, g.InputTextState.InitialTextA.Data, data_type, p_data, NULL);
+ if (value_changed)
+ MarkItemEdited(id);
+ }
+ return value_changed;
}
-// NB: format here must be a simple "%xx" format string with no prefix/suffix (unlike the Drag/Slider functions "format" argument)
-bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* data_ptr, const void* step, const void* step_fast, const char* format, ImGuiInputTextFlags extra_flags)
+// Note: p_data, p_step, p_step_fast are _pointers_ to a memory address holding the data. For an Input widget, p_step and p_step_fast are optional.
+// Read code of e.g. InputFloat(), InputInt() etc. or examples in 'Demo->Widgets->Data Types' to understand how to use this function directly.
+bool ImGui::InputScalar(const char* label, ImGuiDataType data_type, void* p_data, const void* p_step, const void* p_step_fast, const char* format, ImGuiInputTextFlags flags)
{
ImGuiWindow* window = GetCurrentWindow();
if (window->SkipItems)
return false;
ImGuiContext& g = *GImGui;
- const ImGuiStyle& style = g.Style;
+ ImGuiStyle& style = g.Style;
- IM_ASSERT(data_type >= 0 && data_type < ImGuiDataType_COUNT);
if (format == NULL)
- format = GDataTypeInfo[data_type].PrintFmt;
+ format = DataTypeGetInfo(data_type)->PrintFmt;
char buf[64];
- DataTypeFormatString(buf, IM_ARRAYSIZE(buf), data_type, data_ptr, format);
+ DataTypeFormatString(buf, IM_ARRAYSIZE(buf), data_type, p_data, format);
bool value_changed = false;
- if ((extra_flags & (ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsScientific)) == 0)
- extra_flags |= ImGuiInputTextFlags_CharsDecimal;
- extra_flags |= ImGuiInputTextFlags_AutoSelectAll;
+ if ((flags & (ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsScientific)) == 0)
+ flags |= ImGuiInputTextFlags_CharsDecimal;
+ flags |= ImGuiInputTextFlags_AutoSelectAll;
+ flags |= ImGuiInputTextFlags_NoMarkEdited; // We call MarkItemEdited() ourselve by comparing the actual data rather than the string.
- if (step != NULL)
+ if (p_step != NULL)
{
const float button_size = GetFrameHeight();
BeginGroup(); // The only purpose of the group here is to allow the caller to query item data e.g. IsItemActive()
PushID(label);
- PushItemWidth(ImMax(1.0f, CalcItemWidth() - (button_size + style.ItemInnerSpacing.x) * 2));
- if (InputText("", buf, IM_ARRAYSIZE(buf), extra_flags)) // PushId(label) + "" gives us the expected ID from outside point of view
- value_changed = DataTypeApplyOpFromText(buf, g.InputTextState.InitialText.Data, data_type, data_ptr, format);
- PopItemWidth();
+ SetNextItemWidth(ImMax(1.0f, CalcItemWidth() - (button_size + style.ItemInnerSpacing.x) * 2));
+ if (InputText("", buf, IM_ARRAYSIZE(buf), flags)) // PushId(label) + "" gives us the expected ID from outside point of view
+ value_changed = DataTypeApplyOpFromText(buf, g.InputTextState.InitialTextA.Data, data_type, p_data, format);
// Step buttons
+ const ImVec2 backup_frame_padding = style.FramePadding;
+ style.FramePadding.x = style.FramePadding.y;
+ ImGuiButtonFlags button_flags = ImGuiButtonFlags_Repeat | ImGuiButtonFlags_DontClosePopups;
+ if (flags & ImGuiInputTextFlags_ReadOnly)
+ button_flags |= ImGuiButtonFlags_Disabled;
SameLine(0, style.ItemInnerSpacing.x);
- if (ButtonEx("-", ImVec2(button_size, button_size), ImGuiButtonFlags_Repeat | ImGuiButtonFlags_DontClosePopups))
+ if (ButtonEx("-", ImVec2(button_size, button_size), button_flags))
{
- DataTypeApplyOp(data_type, '-', data_ptr, data_ptr, g.IO.KeyCtrl && step_fast ? step_fast : step);
+ DataTypeApplyOp(data_type, '-', p_data, p_data, g.IO.KeyCtrl && p_step_fast ? p_step_fast : p_step);
value_changed = true;
}
SameLine(0, style.ItemInnerSpacing.x);
- if (ButtonEx("+", ImVec2(button_size, button_size), ImGuiButtonFlags_Repeat | ImGuiButtonFlags_DontClosePopups))
+ if (ButtonEx("+", ImVec2(button_size, button_size), button_flags))
{
- DataTypeApplyOp(data_type, '+', data_ptr, data_ptr, g.IO.KeyCtrl && step_fast ? step_fast : step);
+ DataTypeApplyOp(data_type, '+', p_data, p_data, g.IO.KeyCtrl && p_step_fast ? p_step_fast : p_step);
value_changed = true;
}
- SameLine(0, style.ItemInnerSpacing.x);
- TextUnformatted(label, FindRenderedTextEnd(label));
+
+ const char* label_end = FindRenderedTextEnd(label);
+ if (label != label_end)
+ {
+ SameLine(0, style.ItemInnerSpacing.x);
+ TextEx(label, label_end);
+ }
+ style.FramePadding = backup_frame_padding;
PopID();
EndGroup();
}
else
{
- if (InputText(label, buf, IM_ARRAYSIZE(buf), extra_flags))
- value_changed = DataTypeApplyOpFromText(buf, g.InputTextState.InitialText.Data, data_type, data_ptr, format);
+ if (InputText(label, buf, IM_ARRAYSIZE(buf), flags))
+ value_changed = DataTypeApplyOpFromText(buf, g.InputTextState.InitialTextA.Data, data_type, p_data, format);
}
+ if (value_changed)
+ MarkItemEdited(window->DC.LastItemId);
return value_changed;
}
-bool ImGui::InputScalarN(const char* label, ImGuiDataType data_type, void* v, int components, const void* step, const void* step_fast, const char* format, ImGuiInputTextFlags extra_flags)
+bool ImGui::InputScalarN(const char* label, ImGuiDataType data_type, void* p_data, int components, const void* p_step, const void* p_step_fast, const char* format, ImGuiInputTextFlags flags)
{
ImGuiWindow* window = GetCurrentWindow();
if (window->SkipItems)
@@ -2687,112 +2979,120 @@ bool ImGui::InputScalarN(const char* label, ImGuiDataType data_type, void* v, in
bool value_changed = false;
BeginGroup();
PushID(label);
- PushMultiItemsWidths(components);
+ PushMultiItemsWidths(components, CalcItemWidth());
size_t type_size = GDataTypeInfo[data_type].Size;
for (int i = 0; i < components; i++)
{
PushID(i);
- value_changed |= InputScalar("##v", data_type, v, step, step_fast, format, extra_flags);
- SameLine(0, g.Style.ItemInnerSpacing.x);
+ if (i > 0)
+ SameLine(0, g.Style.ItemInnerSpacing.x);
+ value_changed |= InputScalar("", data_type, p_data, p_step, p_step_fast, format, flags);
PopID();
PopItemWidth();
- v = (void*)((char*)v + type_size);
+ p_data = (void*)((char*)p_data + type_size);
}
PopID();
- TextUnformatted(label, FindRenderedTextEnd(label));
+ const char* label_end = FindRenderedTextEnd(label);
+ if (label != label_end)
+ {
+ SameLine(0.0f, g.Style.ItemInnerSpacing.x);
+ TextEx(label, label_end);
+ }
+
EndGroup();
return value_changed;
}
-bool ImGui::InputFloat(const char* label, float* v, float step, float step_fast, const char* format, ImGuiInputTextFlags extra_flags)
+bool ImGui::InputFloat(const char* label, float* v, float step, float step_fast, const char* format, ImGuiInputTextFlags flags)
{
- extra_flags |= ImGuiInputTextFlags_CharsScientific;
- return InputScalar(label, ImGuiDataType_Float, (void*)v, (void*)(step>0.0f ? &step : NULL), (void*)(step_fast>0.0f ? &step_fast : NULL), format, extra_flags);
+ flags |= ImGuiInputTextFlags_CharsScientific;
+ return InputScalar(label, ImGuiDataType_Float, (void*)v, (void*)(step>0.0f ? &step : NULL), (void*)(step_fast>0.0f ? &step_fast : NULL), format, flags);
}
-bool ImGui::InputFloat2(const char* label, float v[2], const char* format, ImGuiInputTextFlags extra_flags)
+bool ImGui::InputFloat2(const char* label, float v[2], const char* format, ImGuiInputTextFlags flags)
{
- return InputScalarN(label, ImGuiDataType_Float, v, 2, NULL, NULL, format, extra_flags);
+ return InputScalarN(label, ImGuiDataType_Float, v, 2, NULL, NULL, format, flags);
}
-bool ImGui::InputFloat3(const char* label, float v[3], const char* format, ImGuiInputTextFlags extra_flags)
+bool ImGui::InputFloat3(const char* label, float v[3], const char* format, ImGuiInputTextFlags flags)
{
- return InputScalarN(label, ImGuiDataType_Float, v, 3, NULL, NULL, format, extra_flags);
+ return InputScalarN(label, ImGuiDataType_Float, v, 3, NULL, NULL, format, flags);
}
-bool ImGui::InputFloat4(const char* label, float v[4], const char* format, ImGuiInputTextFlags extra_flags)
+bool ImGui::InputFloat4(const char* label, float v[4], const char* format, ImGuiInputTextFlags flags)
{
- return InputScalarN(label, ImGuiDataType_Float, v, 4, NULL, NULL, format, extra_flags);
+ return InputScalarN(label, ImGuiDataType_Float, v, 4, NULL, NULL, format, flags);
}
// Prefer using "const char* format" directly, which is more flexible and consistent with other API.
#ifndef IMGUI_DISABLE_OBSOLETE_FUNCTIONS
-bool ImGui::InputFloat(const char* label, float* v, float step, float step_fast, int decimal_precision, ImGuiInputTextFlags extra_flags)
+bool ImGui::InputFloat(const char* label, float* v, float step, float step_fast, int decimal_precision, ImGuiInputTextFlags flags)
{
char format[16] = "%f";
if (decimal_precision >= 0)
ImFormatString(format, IM_ARRAYSIZE(format), "%%.%df", decimal_precision);
- return InputFloat(label, v, step, step_fast, format, extra_flags);
+ return InputFloat(label, v, step, step_fast, format, flags);
}
-bool ImGui::InputFloat2(const char* label, float v[2], int decimal_precision, ImGuiInputTextFlags extra_flags)
+bool ImGui::InputFloat2(const char* label, float v[2], int decimal_precision, ImGuiInputTextFlags flags)
{
char format[16] = "%f";
if (decimal_precision >= 0)
ImFormatString(format, IM_ARRAYSIZE(format), "%%.%df", decimal_precision);
- return InputScalarN(label, ImGuiDataType_Float, v, 2, NULL, NULL, format, extra_flags);
+ return InputScalarN(label, ImGuiDataType_Float, v, 2, NULL, NULL, format, flags);
}
-bool ImGui::InputFloat3(const char* label, float v[3], int decimal_precision, ImGuiInputTextFlags extra_flags)
+bool ImGui::InputFloat3(const char* label, float v[3], int decimal_precision, ImGuiInputTextFlags flags)
{
char format[16] = "%f";
if (decimal_precision >= 0)
ImFormatString(format, IM_ARRAYSIZE(format), "%%.%df", decimal_precision);
- return InputScalarN(label, ImGuiDataType_Float, v, 3, NULL, NULL, format, extra_flags);
+ return InputScalarN(label, ImGuiDataType_Float, v, 3, NULL, NULL, format, flags);
}
-bool ImGui::InputFloat4(const char* label, float v[4], int decimal_precision, ImGuiInputTextFlags extra_flags)
+bool ImGui::InputFloat4(const char* label, float v[4], int decimal_precision, ImGuiInputTextFlags flags)
{
char format[16] = "%f";
if (decimal_precision >= 0)
ImFormatString(format, IM_ARRAYSIZE(format), "%%.%df", decimal_precision);
- return InputScalarN(label, ImGuiDataType_Float, v, 4, NULL, NULL, format, extra_flags);
+ return InputScalarN(label, ImGuiDataType_Float, v, 4, NULL, NULL, format, flags);
}
#endif // IMGUI_DISABLE_OBSOLETE_FUNCTIONS
-bool ImGui::InputInt(const char* label, int* v, int step, int step_fast, ImGuiInputTextFlags extra_flags)
+bool ImGui::InputInt(const char* label, int* v, int step, int step_fast, ImGuiInputTextFlags flags)
{
// Hexadecimal input provided as a convenience but the flag name is awkward. Typically you'd use InputText() to parse your own data, if you want to handle prefixes.
- const char* format = (extra_flags & ImGuiInputTextFlags_CharsHexadecimal) ? "%08X" : "%d";
- return InputScalar(label, ImGuiDataType_S32, (void*)v, (void*)(step>0 ? &step : NULL), (void*)(step_fast>0 ? &step_fast : NULL), format, extra_flags);
+ const char* format = (flags & ImGuiInputTextFlags_CharsHexadecimal) ? "%08X" : "%d";
+ return InputScalar(label, ImGuiDataType_S32, (void*)v, (void*)(step>0 ? &step : NULL), (void*)(step_fast>0 ? &step_fast : NULL), format, flags);
}
-bool ImGui::InputInt2(const char* label, int v[2], ImGuiInputTextFlags extra_flags)
+bool ImGui::InputInt2(const char* label, int v[2], ImGuiInputTextFlags flags)
{
- return InputScalarN(label, ImGuiDataType_S32, v, 2, NULL, NULL, "%d", extra_flags);
+ return InputScalarN(label, ImGuiDataType_S32, v, 2, NULL, NULL, "%d", flags);
}
-bool ImGui::InputInt3(const char* label, int v[3], ImGuiInputTextFlags extra_flags)
+bool ImGui::InputInt3(const char* label, int v[3], ImGuiInputTextFlags flags)
{
- return InputScalarN(label, ImGuiDataType_S32, v, 3, NULL, NULL, "%d", extra_flags);
+ return InputScalarN(label, ImGuiDataType_S32, v, 3, NULL, NULL, "%d", flags);
}
-bool ImGui::InputInt4(const char* label, int v[4], ImGuiInputTextFlags extra_flags)
+bool ImGui::InputInt4(const char* label, int v[4], ImGuiInputTextFlags flags)
{
- return InputScalarN(label, ImGuiDataType_S32, v, 4, NULL, NULL, "%d", extra_flags);
+ return InputScalarN(label, ImGuiDataType_S32, v, 4, NULL, NULL, "%d", flags);
}
-bool ImGui::InputDouble(const char* label, double* v, double step, double step_fast, const char* format, ImGuiInputTextFlags extra_flags)
+bool ImGui::InputDouble(const char* label, double* v, double step, double step_fast, const char* format, ImGuiInputTextFlags flags)
{
- extra_flags |= ImGuiInputTextFlags_CharsScientific;
- return InputScalar(label, ImGuiDataType_Double, (void*)v, (void*)(step>0.0 ? &step : NULL), (void*)(step_fast>0.0 ? &step_fast : NULL), format, extra_flags);
+ flags |= ImGuiInputTextFlags_CharsScientific;
+ return InputScalar(label, ImGuiDataType_Double, (void*)v, (void*)(step>0.0 ? &step : NULL), (void*)(step_fast>0.0 ? &step_fast : NULL), format, flags);
}
//-------------------------------------------------------------------------
-// [SECTION] Widgets: InputText, InputTextMultiline
+// [SECTION] Widgets: InputText, InputTextMultiline, InputTextWithHint
//-------------------------------------------------------------------------
// - InputText()
+// - InputTextWithHint()
// - InputTextMultiline()
// - InputTextEx() [Internal]
//-------------------------------------------------------------------------
@@ -2800,12 +3100,18 @@ bool ImGui::InputDouble(const char* label, double* v, double step, double step_f
bool ImGui::InputText(const char* label, char* buf, size_t buf_size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data)
{
IM_ASSERT(!(flags & ImGuiInputTextFlags_Multiline)); // call InputTextMultiline()
- return InputTextEx(label, buf, (int)buf_size, ImVec2(0,0), flags, callback, user_data);
+ return InputTextEx(label, NULL, buf, (int)buf_size, ImVec2(0,0), flags, callback, user_data);
}
bool ImGui::InputTextMultiline(const char* label, char* buf, size_t buf_size, const ImVec2& size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data)
{
- return InputTextEx(label, buf, (int)buf_size, size, flags | ImGuiInputTextFlags_Multiline, callback, user_data);
+ return InputTextEx(label, NULL, buf, (int)buf_size, size, flags | ImGuiInputTextFlags_Multiline, callback, user_data);
+}
+
+bool ImGui::InputTextWithHint(const char* label, const char* hint, char* buf, size_t buf_size, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* user_data)
+{
+ IM_ASSERT(!(flags & ImGuiInputTextFlags_Multiline)); // call InputTextMultiline()
+ return InputTextEx(label, hint, buf, (int)buf_size, ImVec2(0, 0), flags, callback, user_data);
}
static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char** out_text_end)
@@ -2824,8 +3130,9 @@ static int InputTextCalcTextLenAndLineCount(const char* text_begin, const char**
static ImVec2 InputTextCalcTextSizeW(const ImWchar* text_begin, const ImWchar* text_end, const ImWchar** remaining, ImVec2* out_offset, bool stop_on_new_line)
{
- ImFont* font = GImGui->Font;
- const float line_height = GImGui->FontSize;
+ ImGuiContext& g = *GImGui;
+ ImFont* font = g.Font;
+ const float line_height = g.FontSize;
const float scale = line_height / font->FontSize;
ImVec2 text_size = ImVec2(0,0);
@@ -2867,13 +3174,13 @@ static ImVec2 InputTextCalcTextSizeW(const ImWchar* text_begin, const ImWchar* t
}
// Wrapper for stb_textedit.h to edit text (our wrapper is for: statically sized buffer, single-line, wchar characters. InputText converts between UTF-8 and wchar)
-namespace ImGuiStb
+namespace ImStb
{
static int STB_TEXTEDIT_STRINGLEN(const STB_TEXTEDIT_STRING* obj) { return obj->CurLenW; }
static ImWchar STB_TEXTEDIT_GETCHAR(const STB_TEXTEDIT_STRING* obj, int idx) { return obj->TextW[idx]; }
-static float STB_TEXTEDIT_GETWIDTH(STB_TEXTEDIT_STRING* obj, int line_start_idx, int char_idx) { ImWchar c = obj->TextW[line_start_idx+char_idx]; if (c == '\n') return STB_TEXTEDIT_GETWIDTH_NEWLINE; return GImGui->Font->GetCharAdvance(c) * (GImGui->FontSize / GImGui->Font->FontSize); }
-static int STB_TEXTEDIT_KEYTOTEXT(int key) { return key >= 0x10000 ? 0 : key; }
+static float STB_TEXTEDIT_GETWIDTH(STB_TEXTEDIT_STRING* obj, int line_start_idx, int char_idx) { ImWchar c = obj->TextW[line_start_idx + char_idx]; if (c == '\n') return STB_TEXTEDIT_GETWIDTH_NEWLINE; ImGuiContext& g = *GImGui; return g.Font->GetCharAdvance(c) * (g.FontSize / g.Font->FontSize); }
+static int STB_TEXTEDIT_KEYTOTEXT(int key) { return key >= 0x200000 ? 0 : key; }
static ImWchar STB_TEXTEDIT_NEWLINE = '\n';
static void STB_TEXTEDIT_LAYOUTROW(StbTexteditRow* r, STB_TEXTEDIT_STRING* obj, int line_start_idx)
{
@@ -2947,30 +3254,47 @@ static bool STB_TEXTEDIT_INSERTCHARS(STB_TEXTEDIT_STRING* obj, int pos, const Im
}
// We don't use an enum so we can build even with conflicting symbols (if another user of stb_textedit.h leak their STB_TEXTEDIT_K_* symbols)
-#define STB_TEXTEDIT_K_LEFT 0x10000 // keyboard input to move cursor left
-#define STB_TEXTEDIT_K_RIGHT 0x10001 // keyboard input to move cursor right
-#define STB_TEXTEDIT_K_UP 0x10002 // keyboard input to move cursor up
-#define STB_TEXTEDIT_K_DOWN 0x10003 // keyboard input to move cursor down
-#define STB_TEXTEDIT_K_LINESTART 0x10004 // keyboard input to move cursor to start of line
-#define STB_TEXTEDIT_K_LINEEND 0x10005 // keyboard input to move cursor to end of line
-#define STB_TEXTEDIT_K_TEXTSTART 0x10006 // keyboard input to move cursor to start of text
-#define STB_TEXTEDIT_K_TEXTEND 0x10007 // keyboard input to move cursor to end of text
-#define STB_TEXTEDIT_K_DELETE 0x10008 // keyboard input to delete selection or character under cursor
-#define STB_TEXTEDIT_K_BACKSPACE 0x10009 // keyboard input to delete selection or character left of cursor
-#define STB_TEXTEDIT_K_UNDO 0x1000A // keyboard input to perform undo
-#define STB_TEXTEDIT_K_REDO 0x1000B // keyboard input to perform redo
-#define STB_TEXTEDIT_K_WORDLEFT 0x1000C // keyboard input to move cursor left one word
-#define STB_TEXTEDIT_K_WORDRIGHT 0x1000D // keyboard input to move cursor right one word
-#define STB_TEXTEDIT_K_SHIFT 0x20000
+#define STB_TEXTEDIT_K_LEFT 0x200000 // keyboard input to move cursor left
+#define STB_TEXTEDIT_K_RIGHT 0x200001 // keyboard input to move cursor right
+#define STB_TEXTEDIT_K_UP 0x200002 // keyboard input to move cursor up
+#define STB_TEXTEDIT_K_DOWN 0x200003 // keyboard input to move cursor down
+#define STB_TEXTEDIT_K_LINESTART 0x200004 // keyboard input to move cursor to start of line
+#define STB_TEXTEDIT_K_LINEEND 0x200005 // keyboard input to move cursor to end of line
+#define STB_TEXTEDIT_K_TEXTSTART 0x200006 // keyboard input to move cursor to start of text
+#define STB_TEXTEDIT_K_TEXTEND 0x200007 // keyboard input to move cursor to end of text
+#define STB_TEXTEDIT_K_DELETE 0x200008 // keyboard input to delete selection or character under cursor
+#define STB_TEXTEDIT_K_BACKSPACE 0x200009 // keyboard input to delete selection or character left of cursor
+#define STB_TEXTEDIT_K_UNDO 0x20000A // keyboard input to perform undo
+#define STB_TEXTEDIT_K_REDO 0x20000B // keyboard input to perform redo
+#define STB_TEXTEDIT_K_WORDLEFT 0x20000C // keyboard input to move cursor left one word
+#define STB_TEXTEDIT_K_WORDRIGHT 0x20000D // keyboard input to move cursor right one word
+#define STB_TEXTEDIT_K_SHIFT 0x400000
#define STB_TEXTEDIT_IMPLEMENTATION
#include "imstb_textedit.h"
+// stb_textedit internally allows for a single undo record to do addition and deletion, but somehow, calling
+// the stb_textedit_paste() function creates two separate records, so we perform it manually. (FIXME: Report to nothings/stb?)
+static void stb_textedit_replace(STB_TEXTEDIT_STRING* str, STB_TexteditState* state, const STB_TEXTEDIT_CHARTYPE* text, int text_len)
+{
+ stb_text_makeundo_replace(str, state, 0, str->CurLenW, text_len);
+ ImStb::STB_TEXTEDIT_DELETECHARS(str, 0, str->CurLenW);
+ if (text_len <= 0)
+ return;
+ if (ImStb::STB_TEXTEDIT_INSERTCHARS(str, 0, text, text_len))
+ {
+ state->cursor = text_len;
+ state->has_preferred_x = 0;
+ return;
+ }
+ IM_ASSERT(0); // Failed to insert character, normally shouldn't happen because of how we currently use stb_textedit_replace()
}
+} // namespace ImStb
+
void ImGuiInputTextState::OnKeyPressed(int key)
{
- stb_textedit_key(this, &StbState, key);
+ stb_textedit_key(this, &Stb, key);
CursorFollow = true;
CursorAnimReset();
}
@@ -3014,10 +3338,10 @@ void ImGuiInputTextCallbackData::InsertChars(int pos, const char* new_text, cons
ImGuiContext& g = *GImGui;
ImGuiInputTextState* edit_state = &g.InputTextState;
IM_ASSERT(edit_state->ID != 0 && g.ActiveId == edit_state->ID);
- IM_ASSERT(Buf == edit_state->TempBuffer.Data);
+ IM_ASSERT(Buf == edit_state->TextA.Data);
int new_buf_size = BufTextLen + ImClamp(new_text_len * 4, 32, ImMax(256, new_text_len)) + 1;
- edit_state->TempBuffer.reserve(new_buf_size + 1);
- Buf = edit_state->TempBuffer.Data;
+ edit_state->TextA.reserve(new_buf_size + 1);
+ Buf = edit_state->TextA.Data;
BufSize = edit_state->BufCapacityA = new_buf_size;
}
@@ -3038,7 +3362,8 @@ static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags f
{
unsigned int c = *p_char;
- if (c < 128 && c != ' ' && !isprint((int)(c & 0xFF)))
+ // Filter non-printable (NB: isprint is unreliable! see #2467)
+ if (c < 0x20)
{
bool pass = false;
pass |= (c == '\n' && (flags & ImGuiInputTextFlags_Multiline));
@@ -3047,9 +3372,19 @@ static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags f
return false;
}
- if (c >= 0xE000 && c <= 0xF8FF) // Filter private Unicode range. I don't imagine anybody would want to input them. GLFW on OSX seems to send private characters for special keys like arrow keys.
+ // We ignore Ascii representation of delete (emitted from Backspace on OSX, see #2578, #2817)
+ if (c == 127)
+ return false;
+
+ // Filter private Unicode range. GLFW on OSX seems to send private characters for special keys like arrow keys (FIXME)
+ if (c >= 0xE000 && c <= 0xF8FF)
return false;
+ // Filter Unicode ranges we are not handling in this build.
+ if (c > IM_UNICODE_CODEPOINT_MAX)
+ return false;
+
+ // Generic named filters
if (flags & (ImGuiInputTextFlags_CharsDecimal | ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase | ImGuiInputTextFlags_CharsNoBlank | ImGuiInputTextFlags_CharsScientific))
{
if (flags & ImGuiInputTextFlags_CharsDecimal)
@@ -3073,6 +3408,7 @@ static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags f
return false;
}
+ // Custom callback filter
if (flags & ImGuiInputTextFlags_CallbackCharFilter)
{
ImGuiInputTextCallbackData callback_data;
@@ -3093,12 +3429,13 @@ static bool InputTextFilterCharacter(unsigned int* p_char, ImGuiInputTextFlags f
// Edit a string of text
// - buf_size account for the zero-terminator, so a buf_size of 6 can hold "Hello" but not "Hello!".
-// This is so we can easily call InputText() on static arrays using ARRAYSIZE() and to match
+// This is so we can easily call InputText() on static arrays using ARRAYSIZE() and to match
// Note that in std::string world, capacity() would omit 1 byte used by the zero-terminator.
// - When active, hold on a privately held copy of the text (and apply back to 'buf'). So changing 'buf' while the InputText is active has no effect.
// - If you want to use ImGui::InputText() with std::string, see misc/cpp/imgui_stdlib.h
-// (FIXME: Rather messy function partly because we are doing UTF8 > u16 > UTF8 conversions on the go to more easily handle stb_textedit calls. Ideally we should stay in UTF-8 all the time. See https://github.com/nothings/stb/issues/188)
-bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* callback_user_data)
+// (FIXME: Rather confusing and messy function, among the worse part of our codebase, expecting to rewrite a V2 at some point.. Partly because we are
+// doing UTF8 > U16 > UTF8 conversions on the go to easily interface with stb_textedit. Ideally should stay in UTF-8 all the time. See https://github.com/nothings/stb/issues/188)
+bool ImGui::InputTextEx(const char* label, const char* hint, char* buf, int buf_size, const ImVec2& size_arg, ImGuiInputTextFlags flags, ImGuiInputTextCallback callback, void* callback_user_data)
{
ImGuiWindow* window = GetCurrentWindow();
if (window->SkipItems)
@@ -3108,38 +3445,56 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
IM_ASSERT(!((flags & ImGuiInputTextFlags_CallbackCompletion) && (flags & ImGuiInputTextFlags_AllowTabInput))); // Can't use both together (they both use tab key)
ImGuiContext& g = *GImGui;
- const ImGuiIO& io = g.IO;
+ ImGuiIO& io = g.IO;
const ImGuiStyle& style = g.Style;
+ const bool RENDER_SELECTION_WHEN_INACTIVE = false;
const bool is_multiline = (flags & ImGuiInputTextFlags_Multiline) != 0;
- const bool is_editable = (flags & ImGuiInputTextFlags_ReadOnly) == 0;
+ const bool is_readonly = (flags & ImGuiInputTextFlags_ReadOnly) != 0;
const bool is_password = (flags & ImGuiInputTextFlags_Password) != 0;
const bool is_undoable = (flags & ImGuiInputTextFlags_NoUndoRedo) == 0;
const bool is_resizable = (flags & ImGuiInputTextFlags_CallbackResize) != 0;
if (is_resizable)
IM_ASSERT(callback != NULL); // Must provide a callback if you set the ImGuiInputTextFlags_CallbackResize flag!
- if (is_multiline) // Open group before calling GetID() because groups tracks id created within their scope,
+ if (is_multiline) // Open group before calling GetID() because groups tracks id created within their scope,
BeginGroup();
const ImGuiID id = window->GetID(label);
const ImVec2 label_size = CalcTextSize(label, NULL, true);
- ImVec2 size = CalcItemSize(size_arg, CalcItemWidth(), (is_multiline ? GetTextLineHeight() * 8.0f : label_size.y) + style.FramePadding.y*2.0f); // Arbitrary default of 8 lines high for multi-line
- const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + size);
- const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? (style.ItemInnerSpacing.x + label_size.x) : 0.0f, 0.0f));
+ const ImVec2 frame_size = CalcItemSize(size_arg, CalcItemWidth(), (is_multiline ? g.FontSize * 8.0f : label_size.y) + style.FramePadding.y*2.0f); // Arbitrary default of 8 lines high for multi-line
+ const ImVec2 total_size = ImVec2(frame_size.x + (label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f), frame_size.y);
+
+ const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size);
+ const ImRect total_bb(frame_bb.Min, frame_bb.Min + total_size);
ImGuiWindow* draw_window = window;
+ ImVec2 inner_size = frame_size;
if (is_multiline)
{
- ItemAdd(total_bb, id, &frame_bb);
- if (!BeginChildFrame(id, frame_bb.GetSize()))
+ if (!ItemAdd(total_bb, id, &frame_bb))
{
- EndChildFrame();
+ ItemSize(total_bb, style.FramePadding.y);
EndGroup();
return false;
}
- draw_window = GetCurrentWindow();
- draw_window->DC.NavLayerActiveMaskNext |= draw_window->DC.NavLayerCurrentMask; // This is to ensure that EndChild() will display a navigation highlight
- size.x -= draw_window->ScrollbarSizes.x;
+
+ // We reproduce the contents of BeginChildFrame() in order to provide 'label' so our window internal data are easier to read/debug.
+ PushStyleColor(ImGuiCol_ChildBg, style.Colors[ImGuiCol_FrameBg]);
+ PushStyleVar(ImGuiStyleVar_ChildRounding, style.FrameRounding);
+ PushStyleVar(ImGuiStyleVar_ChildBorderSize, style.FrameBorderSize);
+ PushStyleVar(ImGuiStyleVar_WindowPadding, style.FramePadding);
+ bool child_visible = BeginChildEx(label, id, frame_bb.GetSize(), true, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysUseWindowPadding);
+ PopStyleVar(3);
+ PopStyleColor();
+ if (!child_visible)
+ {
+ EndChild();
+ EndGroup();
+ return false;
+ }
+ draw_window = g.CurrentWindow; // Child window
+ draw_window->DC.NavLayerActiveMaskNext |= draw_window->DC.NavLayerCurrentMask; // This is to ensure that EndChild() will display a navigation highlight so we can "enter" into it.
+ inner_size.x -= draw_window->ScrollbarSizes.x;
}
else
{
@@ -3151,109 +3506,145 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
if (hovered)
g.MouseCursor = ImGuiMouseCursor_TextInput;
- // Password pushes a temporary font with only a fallback glyph
- if (is_password)
- {
- const ImFontGlyph* glyph = g.Font->FindGlyph('*');
- ImFont* password_font = &g.InputTextPasswordFont;
- password_font->FontSize = g.Font->FontSize;
- password_font->Scale = g.Font->Scale;
- password_font->DisplayOffset = g.Font->DisplayOffset;
- password_font->Ascent = g.Font->Ascent;
- password_font->Descent = g.Font->Descent;
- password_font->ContainerAtlas = g.Font->ContainerAtlas;
- password_font->FallbackGlyph = glyph;
- password_font->FallbackAdvanceX = glyph->AdvanceX;
- IM_ASSERT(password_font->Glyphs.empty() && password_font->IndexAdvanceX.empty() && password_font->IndexLookup.empty());
- PushFont(password_font);
- }
-
// NB: we are only allowed to access 'edit_state' if we are the active widget.
- ImGuiInputTextState& edit_state = g.InputTextState;
+ ImGuiInputTextState* state = NULL;
+ if (g.InputTextState.ID == id)
+ state = &g.InputTextState;
- const bool focus_requested = FocusableItemRegister(window, id, (flags & (ImGuiInputTextFlags_CallbackCompletion|ImGuiInputTextFlags_AllowTabInput)) == 0); // Using completion callback disable keyboard tabbing
- const bool focus_requested_by_code = focus_requested && (window->FocusIdxAllCounter == window->FocusIdxAllRequestCurrent);
+ const bool focus_requested = FocusableItemRegister(window, id);
+ const bool focus_requested_by_code = focus_requested && (g.FocusRequestCurrWindow == window && g.FocusRequestCurrCounterRegular == window->DC.FocusCounterRegular);
const bool focus_requested_by_tab = focus_requested && !focus_requested_by_code;
const bool user_clicked = hovered && io.MouseClicked[0];
- const bool user_scrolled = is_multiline && g.ActiveId == 0 && edit_state.ID == id && g.ActiveIdPreviousFrame == draw_window->GetIDNoKeepAlive("#SCROLLY");
const bool user_nav_input_start = (g.ActiveId != id) && ((g.NavInputId == id) || (g.NavActivateId == id && g.NavInputSource == ImGuiInputSource_NavKeyboard));
+ const bool user_scroll_finish = is_multiline && state != NULL && g.ActiveId == 0 && g.ActiveIdPreviousFrame == GetWindowScrollbarID(draw_window, ImGuiAxis_Y);
+ const bool user_scroll_active = is_multiline && state != NULL && g.ActiveId == GetWindowScrollbarID(draw_window, ImGuiAxis_Y);
bool clear_active_id = false;
-
bool select_all = (g.ActiveId != id) && ((flags & ImGuiInputTextFlags_AutoSelectAll) != 0 || user_nav_input_start) && (!is_multiline);
- if (focus_requested || user_clicked || user_scrolled || user_nav_input_start)
+
+ const bool init_make_active = (focus_requested || user_clicked || user_scroll_finish || user_nav_input_start);
+ const bool init_state = (init_make_active || user_scroll_active);
+ if (init_state && g.ActiveId != id)
{
- if (g.ActiveId != id)
+ // Access state even if we don't own it yet.
+ state = &g.InputTextState;
+ state->CursorAnimReset();
+
+ // Take a copy of the initial buffer value (both in original UTF-8 format and converted to wchar)
+ // From the moment we focused we are ignoring the content of 'buf' (unless we are in read-only mode)
+ const int buf_len = (int)strlen(buf);
+ state->InitialTextA.resize(buf_len + 1); // UTF-8. we use +1 to make sure that .Data is always pointing to at least an empty string.
+ memcpy(state->InitialTextA.Data, buf, buf_len + 1);
+
+ // Start edition
+ const char* buf_end = NULL;
+ state->TextW.resize(buf_size + 1); // wchar count <= UTF-8 count. we use +1 to make sure that .Data is always pointing to at least an empty string.
+ state->TextA.resize(0);
+ state->TextAIsValid = false; // TextA is not valid yet (we will display buf until then)
+ state->CurLenW = ImTextStrFromUtf8(state->TextW.Data, buf_size, buf, NULL, &buf_end);
+ state->CurLenA = (int)(buf_end - buf); // We can't get the result from ImStrncpy() above because it is not UTF-8 aware. Here we'll cut off malformed UTF-8.
+
+ // Preserve cursor position and undo/redo stack if we come back to same widget
+ // FIXME: For non-readonly widgets we might be able to require that TextAIsValid && TextA == buf ? (untested) and discard undo stack if user buffer has changed.
+ const bool recycle_state = (state->ID == id);
+ if (recycle_state)
{
- // Start edition
- // Take a copy of the initial buffer value (both in original UTF-8 format and converted to wchar)
- // From the moment we focused we are ignoring the content of 'buf' (unless we are in read-only mode)
- const int prev_len_w = edit_state.CurLenW;
- const int init_buf_len = (int)strlen(buf);
- edit_state.TextW.resize(buf_size+1); // wchar count <= UTF-8 count. we use +1 to make sure that .Data isn't NULL so it doesn't crash.
- edit_state.InitialText.resize(init_buf_len + 1); // UTF-8. we use +1 to make sure that .Data isn't NULL so it doesn't crash.
- memcpy(edit_state.InitialText.Data, buf, init_buf_len + 1);
- const char* buf_end = NULL;
- edit_state.CurLenW = ImTextStrFromUtf8(edit_state.TextW.Data, buf_size, buf, NULL, &buf_end);
- edit_state.CurLenA = (int)(buf_end - buf); // We can't get the result from ImStrncpy() above because it is not UTF-8 aware. Here we'll cut off malformed UTF-8.
- edit_state.CursorAnimReset();
-
- // Preserve cursor position and undo/redo stack if we come back to same widget
- // FIXME: We should probably compare the whole buffer to be on the safety side. Comparing buf (utf8) and edit_state.Text (wchar).
- const bool recycle_state = (edit_state.ID == id) && (prev_len_w == edit_state.CurLenW);
- if (recycle_state)
- {
- // Recycle existing cursor/selection/undo stack but clamp position
- // Note a single mouse click will override the cursor/position immediately by calling stb_textedit_click handler.
- edit_state.CursorClamp();
- }
- else
- {
- edit_state.ID = id;
- edit_state.ScrollX = 0.0f;
- stb_textedit_initialize_state(&edit_state.StbState, !is_multiline);
- if (!is_multiline && focus_requested_by_code)
- select_all = true;
- }
- if (flags & ImGuiInputTextFlags_AlwaysInsertMode)
- edit_state.StbState.insert_mode = true;
- if (!is_multiline && (focus_requested_by_tab || (user_clicked && io.KeyCtrl)))
+ // Recycle existing cursor/selection/undo stack but clamp position
+ // Note a single mouse click will override the cursor/position immediately by calling stb_textedit_click handler.
+ state->CursorClamp();
+ }
+ else
+ {
+ state->ID = id;
+ state->ScrollX = 0.0f;
+ stb_textedit_initialize_state(&state->Stb, !is_multiline);
+ if (!is_multiline && focus_requested_by_code)
select_all = true;
}
+ if (flags & ImGuiInputTextFlags_AlwaysInsertMode)
+ state->Stb.insert_mode = 1;
+ if (!is_multiline && (focus_requested_by_tab || (user_clicked && io.KeyCtrl)))
+ select_all = true;
+ }
+
+ if (g.ActiveId != id && init_make_active)
+ {
+ IM_ASSERT(state && state->ID == id);
SetActiveID(id, window);
SetFocusID(id, window);
FocusWindow(window);
- if (!is_multiline && !(flags & ImGuiInputTextFlags_CallbackHistory))
- g.ActiveIdAllowNavDirFlags |= ((1 << ImGuiDir_Up) | (1 << ImGuiDir_Down));
+
+ // Declare our inputs
+ IM_ASSERT(ImGuiNavInput_COUNT < 32);
+ g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Left) | (1 << ImGuiDir_Right);
+ if (is_multiline || (flags & ImGuiInputTextFlags_CallbackHistory))
+ g.ActiveIdUsingNavDirMask |= (1 << ImGuiDir_Up) | (1 << ImGuiDir_Down);
+ g.ActiveIdUsingNavInputMask |= (1 << ImGuiNavInput_Cancel);
+ g.ActiveIdUsingKeyInputMask |= ((ImU64)1 << ImGuiKey_Home) | ((ImU64)1 << ImGuiKey_End);
+ if (is_multiline)
+ g.ActiveIdUsingKeyInputMask |= ((ImU64)1 << ImGuiKey_PageUp) | ((ImU64)1 << ImGuiKey_PageDown); // FIXME-NAV: Page up/down actually not supported yet by widget, but claim them ahead.
+ if (flags & (ImGuiInputTextFlags_CallbackCompletion | ImGuiInputTextFlags_AllowTabInput)) // Disable keyboard tabbing out as we will use the \t character.
+ g.ActiveIdUsingKeyInputMask |= ((ImU64)1 << ImGuiKey_Tab);
}
- else if (io.MouseClicked[0])
- {
- // Release focus when we click outside
+
+ // We have an edge case if ActiveId was set through another widget (e.g. widget being swapped), clear id immediately (don't wait until the end of the function)
+ if (g.ActiveId == id && state == NULL)
+ ClearActiveID();
+
+ // Release focus when we click outside
+ if (g.ActiveId == id && io.MouseClicked[0] && !init_state && !init_make_active) //-V560
clear_active_id = true;
- }
+ // Lock the decision of whether we are going to take the path displaying the cursor or selection
+ const bool render_cursor = (g.ActiveId == id) || (state && user_scroll_active);
+ bool render_selection = state && state->HasSelection() && (RENDER_SELECTION_WHEN_INACTIVE || render_cursor);
bool value_changed = false;
bool enter_pressed = false;
- int backup_current_text_length = 0;
- if (g.ActiveId == id)
+ // When read-only we always use the live data passed to the function
+ // FIXME-OPT: Because our selection/cursor code currently needs the wide text we need to convert it when active, which is not ideal :(
+ if (is_readonly && state != NULL && (render_cursor || render_selection))
{
- if (!is_editable && !g.ActiveIdIsJustActivated)
- {
- // When read-only we always use the live data passed to the function
- edit_state.TextW.resize(buf_size+1);
- const char* buf_end = NULL;
- edit_state.CurLenW = ImTextStrFromUtf8(edit_state.TextW.Data, edit_state.TextW.Size, buf, NULL, &buf_end);
- edit_state.CurLenA = (int)(buf_end - buf);
- edit_state.CursorClamp();
- }
+ const char* buf_end = NULL;
+ state->TextW.resize(buf_size + 1);
+ state->CurLenW = ImTextStrFromUtf8(state->TextW.Data, state->TextW.Size, buf, NULL, &buf_end);
+ state->CurLenA = (int)(buf_end - buf);
+ state->CursorClamp();
+ render_selection &= state->HasSelection();
+ }
+
+ // Select the buffer to render.
+ const bool buf_display_from_state = (render_cursor || render_selection || g.ActiveId == id) && !is_readonly && state && state->TextAIsValid;
+ const bool is_displaying_hint = (hint != NULL && (buf_display_from_state ? state->TextA.Data : buf)[0] == 0);
+
+ // Password pushes a temporary font with only a fallback glyph
+ if (is_password && !is_displaying_hint)
+ {
+ const ImFontGlyph* glyph = g.Font->FindGlyph('*');
+ ImFont* password_font = &g.InputTextPasswordFont;
+ password_font->FontSize = g.Font->FontSize;
+ password_font->Scale = g.Font->Scale;
+ password_font->DisplayOffset = g.Font->DisplayOffset;
+ password_font->Ascent = g.Font->Ascent;
+ password_font->Descent = g.Font->Descent;
+ password_font->ContainerAtlas = g.Font->ContainerAtlas;
+ password_font->FallbackGlyph = glyph;
+ password_font->FallbackAdvanceX = glyph->AdvanceX;
+ IM_ASSERT(password_font->Glyphs.empty() && password_font->IndexAdvanceX.empty() && password_font->IndexLookup.empty());
+ PushFont(password_font);
+ }
- backup_current_text_length = edit_state.CurLenA;
- edit_state.BufCapacityA = buf_size;
- edit_state.UserFlags = flags;
- edit_state.UserCallback = callback;
- edit_state.UserCallbackData = callback_user_data;
+ // Process mouse inputs and character inputs
+ int backup_current_text_length = 0;
+ if (g.ActiveId == id)
+ {
+ IM_ASSERT(state != NULL);
+ backup_current_text_length = state->CurLenA;
+ state->BufCapacityA = buf_size;
+ state->UserFlags = flags;
+ state->UserCallback = callback;
+ state->UserCallbackData = callback_user_data;
// Although we are active we don't prevent mouse from hovering other elements unless we are interacting right now with the widget.
// Down the line we should have a cleaner library-wide concept of Selected vs Active.
@@ -3261,61 +3652,74 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
g.WantTextInputNextFrame = 1;
// Edit in progress
- const float mouse_x = (io.MousePos.x - frame_bb.Min.x - style.FramePadding.x) + edit_state.ScrollX;
+ const float mouse_x = (io.MousePos.x - frame_bb.Min.x - style.FramePadding.x) + state->ScrollX;
const float mouse_y = (is_multiline ? (io.MousePos.y - draw_window->DC.CursorPos.y - style.FramePadding.y) : (g.FontSize*0.5f));
const bool is_osx = io.ConfigMacOSXBehaviors;
if (select_all || (hovered && !is_osx && io.MouseDoubleClicked[0]))
{
- edit_state.SelectAll();
- edit_state.SelectedAllMouseLock = true;
+ state->SelectAll();
+ state->SelectedAllMouseLock = true;
}
else if (hovered && is_osx && io.MouseDoubleClicked[0])
{
// Double-click select a word only, OS X style (by simulating keystrokes)
- edit_state.OnKeyPressed(STB_TEXTEDIT_K_WORDLEFT);
- edit_state.OnKeyPressed(STB_TEXTEDIT_K_WORDRIGHT | STB_TEXTEDIT_K_SHIFT);
+ state->OnKeyPressed(STB_TEXTEDIT_K_WORDLEFT);
+ state->OnKeyPressed(STB_TEXTEDIT_K_WORDRIGHT | STB_TEXTEDIT_K_SHIFT);
}
- else if (io.MouseClicked[0] && !edit_state.SelectedAllMouseLock)
+ else if (io.MouseClicked[0] && !state->SelectedAllMouseLock)
{
if (hovered)
{
- stb_textedit_click(&edit_state, &edit_state.StbState, mouse_x, mouse_y);
- edit_state.CursorAnimReset();
+ stb_textedit_click(state, &state->Stb, mouse_x, mouse_y);
+ state->CursorAnimReset();
}
}
- else if (io.MouseDown[0] && !edit_state.SelectedAllMouseLock && (io.MouseDelta.x != 0.0f || io.MouseDelta.y != 0.0f))
+ else if (io.MouseDown[0] && !state->SelectedAllMouseLock && (io.MouseDelta.x != 0.0f || io.MouseDelta.y != 0.0f))
{
- stb_textedit_drag(&edit_state, &edit_state.StbState, mouse_x, mouse_y);
- edit_state.CursorAnimReset();
- edit_state.CursorFollow = true;
+ stb_textedit_drag(state, &state->Stb, mouse_x, mouse_y);
+ state->CursorAnimReset();
+ state->CursorFollow = true;
}
- if (edit_state.SelectedAllMouseLock && !io.MouseDown[0])
- edit_state.SelectedAllMouseLock = false;
+ if (state->SelectedAllMouseLock && !io.MouseDown[0])
+ state->SelectedAllMouseLock = false;
+
+ // It is ill-defined whether the back-end needs to send a \t character when pressing the TAB keys.
+ // Win32 and GLFW naturally do it but not SDL.
+ const bool ignore_char_inputs = (io.KeyCtrl && !io.KeyAlt) || (is_osx && io.KeySuper);
+ if ((flags & ImGuiInputTextFlags_AllowTabInput) && IsKeyPressedMap(ImGuiKey_Tab) && !ignore_char_inputs && !io.KeyShift && !is_readonly)
+ if (!io.InputQueueCharacters.contains('\t'))
+ {
+ unsigned int c = '\t'; // Insert TAB
+ if (InputTextFilterCharacter(&c, flags, callback, callback_user_data))
+ state->OnKeyPressed((int)c);
+ }
- if (io.InputCharacters[0])
+ // Process regular text input (before we check for Return because using some IME will effectively send a Return?)
+ // We ignore CTRL inputs, but need to allow ALT+CTRL as some keyboards (e.g. German) use AltGR (which _is_ Alt+Ctrl) to input certain characters.
+ if (io.InputQueueCharacters.Size > 0)
{
- // Process text input (before we check for Return because using some IME will effectively send a Return?)
- // We ignore CTRL inputs, but need to allow ALT+CTRL as some keyboards (e.g. German) use AltGR (which _is_ Alt+Ctrl) to input certain characters.
- bool ignore_inputs = (io.KeyCtrl && !io.KeyAlt) || (is_osx && io.KeySuper);
- if (!ignore_inputs && is_editable && !user_nav_input_start)
- for (int n = 0; n < IM_ARRAYSIZE(io.InputCharacters) && io.InputCharacters[n]; n++)
+ if (!ignore_char_inputs && !is_readonly && !user_nav_input_start)
+ for (int n = 0; n < io.InputQueueCharacters.Size; n++)
{
// Insert character if they pass filtering
- unsigned int c = (unsigned int)io.InputCharacters[n];
+ unsigned int c = (unsigned int)io.InputQueueCharacters[n];
+ if (c == '\t' && io.KeyShift)
+ continue;
if (InputTextFilterCharacter(&c, flags, callback, callback_user_data))
- edit_state.OnKeyPressed((int)c);
+ state->OnKeyPressed((int)c);
}
// Consume characters
- memset(g.IO.InputCharacters, 0, sizeof(g.IO.InputCharacters));
+ io.InputQueueCharacters.resize(0);
}
}
+ // Process other shortcuts/key-presses
bool cancel_edit = false;
if (g.ActiveId == id && !g.ActiveIdIsJustActivated && !clear_active_id)
{
- // Handle key-presses
+ IM_ASSERT(state != NULL);
const int k_mask = (io.KeyShift ? STB_TEXTEDIT_K_SHIFT : 0);
const bool is_osx = io.ConfigMacOSXBehaviors;
const bool is_shortcut_key = (is_osx ? (io.KeySuper && !io.KeyCtrl) : (io.KeyCtrl && !io.KeySuper)) && !io.KeyAlt && !io.KeyShift; // OS X style: Shortcuts using Cmd/Super instead of Ctrl
@@ -3325,79 +3729,77 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
const bool is_ctrl_key_only = io.KeyCtrl && !io.KeyShift && !io.KeyAlt && !io.KeySuper;
const bool is_shift_key_only = io.KeyShift && !io.KeyCtrl && !io.KeyAlt && !io.KeySuper;
- const bool is_cut = ((is_shortcut_key && IsKeyPressedMap(ImGuiKey_X)) || (is_shift_key_only && IsKeyPressedMap(ImGuiKey_Delete))) && is_editable && !is_password && (!is_multiline || edit_state.HasSelection());
- const bool is_copy = ((is_shortcut_key && IsKeyPressedMap(ImGuiKey_C)) || (is_ctrl_key_only && IsKeyPressedMap(ImGuiKey_Insert))) && !is_password && (!is_multiline || edit_state.HasSelection());
- const bool is_paste = ((is_shortcut_key && IsKeyPressedMap(ImGuiKey_V)) || (is_shift_key_only && IsKeyPressedMap(ImGuiKey_Insert))) && is_editable;
- const bool is_undo = ((is_shortcut_key && IsKeyPressedMap(ImGuiKey_Z)) && is_editable && is_undoable);
- const bool is_redo = ((is_shortcut_key && IsKeyPressedMap(ImGuiKey_Y)) || (is_osx_shift_shortcut && IsKeyPressedMap(ImGuiKey_Z))) && is_editable && is_undoable;
-
- if (IsKeyPressedMap(ImGuiKey_LeftArrow)) { edit_state.OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_LINESTART : is_wordmove_key_down ? STB_TEXTEDIT_K_WORDLEFT : STB_TEXTEDIT_K_LEFT) | k_mask); }
- else if (IsKeyPressedMap(ImGuiKey_RightArrow)) { edit_state.OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_LINEEND : is_wordmove_key_down ? STB_TEXTEDIT_K_WORDRIGHT : STB_TEXTEDIT_K_RIGHT) | k_mask); }
- else if (IsKeyPressedMap(ImGuiKey_UpArrow) && is_multiline) { if (io.KeyCtrl) SetWindowScrollY(draw_window, ImMax(draw_window->Scroll.y - g.FontSize, 0.0f)); else edit_state.OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_TEXTSTART : STB_TEXTEDIT_K_UP) | k_mask); }
- else if (IsKeyPressedMap(ImGuiKey_DownArrow) && is_multiline) { if (io.KeyCtrl) SetWindowScrollY(draw_window, ImMin(draw_window->Scroll.y + g.FontSize, GetScrollMaxY())); else edit_state.OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_TEXTEND : STB_TEXTEDIT_K_DOWN) | k_mask); }
- else if (IsKeyPressedMap(ImGuiKey_Home)) { edit_state.OnKeyPressed(io.KeyCtrl ? STB_TEXTEDIT_K_TEXTSTART | k_mask : STB_TEXTEDIT_K_LINESTART | k_mask); }
- else if (IsKeyPressedMap(ImGuiKey_End)) { edit_state.OnKeyPressed(io.KeyCtrl ? STB_TEXTEDIT_K_TEXTEND | k_mask : STB_TEXTEDIT_K_LINEEND | k_mask); }
- else if (IsKeyPressedMap(ImGuiKey_Delete) && is_editable) { edit_state.OnKeyPressed(STB_TEXTEDIT_K_DELETE | k_mask); }
- else if (IsKeyPressedMap(ImGuiKey_Backspace) && is_editable)
+ const bool is_cut = ((is_shortcut_key && IsKeyPressedMap(ImGuiKey_X)) || (is_shift_key_only && IsKeyPressedMap(ImGuiKey_Delete))) && !is_readonly && !is_password && (!is_multiline || state->HasSelection());
+ const bool is_copy = ((is_shortcut_key && IsKeyPressedMap(ImGuiKey_C)) || (is_ctrl_key_only && IsKeyPressedMap(ImGuiKey_Insert))) && !is_password && (!is_multiline || state->HasSelection());
+ const bool is_paste = ((is_shortcut_key && IsKeyPressedMap(ImGuiKey_V)) || (is_shift_key_only && IsKeyPressedMap(ImGuiKey_Insert))) && !is_readonly;
+ const bool is_undo = ((is_shortcut_key && IsKeyPressedMap(ImGuiKey_Z)) && !is_readonly && is_undoable);
+ const bool is_redo = ((is_shortcut_key && IsKeyPressedMap(ImGuiKey_Y)) || (is_osx_shift_shortcut && IsKeyPressedMap(ImGuiKey_Z))) && !is_readonly && is_undoable;
+
+ if (IsKeyPressedMap(ImGuiKey_LeftArrow)) { state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_LINESTART : is_wordmove_key_down ? STB_TEXTEDIT_K_WORDLEFT : STB_TEXTEDIT_K_LEFT) | k_mask); }
+ else if (IsKeyPressedMap(ImGuiKey_RightArrow)) { state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_LINEEND : is_wordmove_key_down ? STB_TEXTEDIT_K_WORDRIGHT : STB_TEXTEDIT_K_RIGHT) | k_mask); }
+ else if (IsKeyPressedMap(ImGuiKey_UpArrow) && is_multiline) { if (io.KeyCtrl) SetScrollY(draw_window, ImMax(draw_window->Scroll.y - g.FontSize, 0.0f)); else state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_TEXTSTART : STB_TEXTEDIT_K_UP) | k_mask); }
+ else if (IsKeyPressedMap(ImGuiKey_DownArrow) && is_multiline) { if (io.KeyCtrl) SetScrollY(draw_window, ImMin(draw_window->Scroll.y + g.FontSize, GetScrollMaxY())); else state->OnKeyPressed((is_startend_key_down ? STB_TEXTEDIT_K_TEXTEND : STB_TEXTEDIT_K_DOWN) | k_mask); }
+ else if (IsKeyPressedMap(ImGuiKey_Home)) { state->OnKeyPressed(io.KeyCtrl ? STB_TEXTEDIT_K_TEXTSTART | k_mask : STB_TEXTEDIT_K_LINESTART | k_mask); }
+ else if (IsKeyPressedMap(ImGuiKey_End)) { state->OnKeyPressed(io.KeyCtrl ? STB_TEXTEDIT_K_TEXTEND | k_mask : STB_TEXTEDIT_K_LINEEND | k_mask); }
+ else if (IsKeyPressedMap(ImGuiKey_Delete) && !is_readonly) { state->OnKeyPressed(STB_TEXTEDIT_K_DELETE | k_mask); }
+ else if (IsKeyPressedMap(ImGuiKey_Backspace) && !is_readonly)
{
- if (!edit_state.HasSelection())
+ if (!state->HasSelection())
{
- if (is_wordmove_key_down) edit_state.OnKeyPressed(STB_TEXTEDIT_K_WORDLEFT|STB_TEXTEDIT_K_SHIFT);
- else if (is_osx && io.KeySuper && !io.KeyAlt && !io.KeyCtrl) edit_state.OnKeyPressed(STB_TEXTEDIT_K_LINESTART|STB_TEXTEDIT_K_SHIFT);
+ if (is_wordmove_key_down)
+ state->OnKeyPressed(STB_TEXTEDIT_K_WORDLEFT|STB_TEXTEDIT_K_SHIFT);
+ else if (is_osx && io.KeySuper && !io.KeyAlt && !io.KeyCtrl)
+ state->OnKeyPressed(STB_TEXTEDIT_K_LINESTART|STB_TEXTEDIT_K_SHIFT);
}
- edit_state.OnKeyPressed(STB_TEXTEDIT_K_BACKSPACE | k_mask);
+ state->OnKeyPressed(STB_TEXTEDIT_K_BACKSPACE | k_mask);
}
- else if (IsKeyPressedMap(ImGuiKey_Enter))
+ else if (IsKeyPressedMap(ImGuiKey_Enter) || IsKeyPressedMap(ImGuiKey_KeyPadEnter))
{
bool ctrl_enter_for_new_line = (flags & ImGuiInputTextFlags_CtrlEnterForNewLine) != 0;
if (!is_multiline || (ctrl_enter_for_new_line && !io.KeyCtrl) || (!ctrl_enter_for_new_line && io.KeyCtrl))
{
enter_pressed = clear_active_id = true;
}
- else if (is_editable)
+ else if (!is_readonly)
{
unsigned int c = '\n'; // Insert new line
if (InputTextFilterCharacter(&c, flags, callback, callback_user_data))
- edit_state.OnKeyPressed((int)c);
+ state->OnKeyPressed((int)c);
}
}
- else if ((flags & ImGuiInputTextFlags_AllowTabInput) && IsKeyPressedMap(ImGuiKey_Tab) && !io.KeyCtrl && !io.KeyShift && !io.KeyAlt && is_editable)
- {
- unsigned int c = '\t'; // Insert TAB
- if (InputTextFilterCharacter(&c, flags, callback, callback_user_data))
- edit_state.OnKeyPressed((int)c);
- }
else if (IsKeyPressedMap(ImGuiKey_Escape))
{
clear_active_id = cancel_edit = true;
}
else if (is_undo || is_redo)
{
- edit_state.OnKeyPressed(is_undo ? STB_TEXTEDIT_K_UNDO : STB_TEXTEDIT_K_REDO);
- edit_state.ClearSelection();
+ state->OnKeyPressed(is_undo ? STB_TEXTEDIT_K_UNDO : STB_TEXTEDIT_K_REDO);
+ state->ClearSelection();
}
else if (is_shortcut_key && IsKeyPressedMap(ImGuiKey_A))
{
- edit_state.SelectAll();
- edit_state.CursorFollow = true;
+ state->SelectAll();
+ state->CursorFollow = true;
}
else if (is_cut || is_copy)
{
// Cut, Copy
if (io.SetClipboardTextFn)
{
- const int ib = edit_state.HasSelection() ? ImMin(edit_state.StbState.select_start, edit_state.StbState.select_end) : 0;
- const int ie = edit_state.HasSelection() ? ImMax(edit_state.StbState.select_start, edit_state.StbState.select_end) : edit_state.CurLenW;
- edit_state.TempBuffer.resize((ie-ib) * 4 + 1);
- ImTextStrToUtf8(edit_state.TempBuffer.Data, edit_state.TempBuffer.Size, edit_state.TextW.Data+ib, edit_state.TextW.Data+ie);
- SetClipboardText(edit_state.TempBuffer.Data);
+ const int ib = state->HasSelection() ? ImMin(state->Stb.select_start, state->Stb.select_end) : 0;
+ const int ie = state->HasSelection() ? ImMax(state->Stb.select_start, state->Stb.select_end) : state->CurLenW;
+ const int clipboard_data_len = ImTextCountUtf8BytesFromStr(state->TextW.Data + ib, state->TextW.Data + ie) + 1;
+ char* clipboard_data = (char*)IM_ALLOC(clipboard_data_len * sizeof(char));
+ ImTextStrToUtf8(clipboard_data, clipboard_data_len, state->TextW.Data + ib, state->TextW.Data + ie);
+ SetClipboardText(clipboard_data);
+ MemFree(clipboard_data);
}
if (is_cut)
{
- if (!edit_state.HasSelection())
- edit_state.SelectAll();
- edit_state.CursorFollow = true;
- stb_textedit_cut(&edit_state, &edit_state.StbState);
+ if (!state->HasSelection())
+ state->SelectAll();
+ state->CursorFollow = true;
+ stb_textedit_cut(state, &state->Stb);
}
}
else if (is_paste)
@@ -3406,7 +3808,7 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
{
// Filter pasted buffer
const int clipboard_len = (int)strlen(clipboard);
- ImWchar* clipboard_filtered = (ImWchar*)MemAlloc((clipboard_len+1) * sizeof(ImWchar));
+ ImWchar* clipboard_filtered = (ImWchar*)IM_ALLOC((clipboard_len+1) * sizeof(ImWchar));
int clipboard_filtered_len = 0;
for (const char* s = clipboard; *s; )
{
@@ -3414,37 +3816,51 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
s += ImTextCharFromUtf8(&c, s, NULL);
if (c == 0)
break;
- if (c >= 0x10000 || !InputTextFilterCharacter(&c, flags, callback, callback_user_data))
+ if (!InputTextFilterCharacter(&c, flags, callback, callback_user_data))
continue;
clipboard_filtered[clipboard_filtered_len++] = (ImWchar)c;
}
clipboard_filtered[clipboard_filtered_len] = 0;
if (clipboard_filtered_len > 0) // If everything was filtered, ignore the pasting operation
{
- stb_textedit_paste(&edit_state, &edit_state.StbState, clipboard_filtered, clipboard_filtered_len);
- edit_state.CursorFollow = true;
+ stb_textedit_paste(state, &state->Stb, clipboard_filtered, clipboard_filtered_len);
+ state->CursorFollow = true;
}
MemFree(clipboard_filtered);
}
}
+
+ // Update render selection flag after events have been handled, so selection highlight can be displayed during the same frame.
+ render_selection |= state->HasSelection() && (RENDER_SELECTION_WHEN_INACTIVE || render_cursor);
}
+ // Process callbacks and apply result back to user's buffer.
if (g.ActiveId == id)
{
+ IM_ASSERT(state != NULL);
const char* apply_new_text = NULL;
int apply_new_text_length = 0;
if (cancel_edit)
{
// Restore initial value. Only return true if restoring to the initial value changes the current buffer contents.
- if (is_editable && strcmp(buf, edit_state.InitialText.Data) != 0)
+ if (!is_readonly && strcmp(buf, state->InitialTextA.Data) != 0)
{
- apply_new_text = edit_state.InitialText.Data;
- apply_new_text_length = edit_state.InitialText.Size - 1;
+ // Push records into the undo stack so we can CTRL+Z the revert operation itself
+ apply_new_text = state->InitialTextA.Data;
+ apply_new_text_length = state->InitialTextA.Size - 1;
+ ImVector<ImWchar> w_text;
+ if (apply_new_text_length > 0)
+ {
+ w_text.resize(ImTextCountCharsFromUtf8(apply_new_text, apply_new_text + apply_new_text_length) + 1);
+ ImTextStrFromUtf8(w_text.Data, w_text.Size, apply_new_text, apply_new_text + apply_new_text_length);
+ }
+ stb_textedit_replace(state, &state->Stb, w_text.Data, (apply_new_text_length > 0) ? (w_text.Size - 1) : 0);
}
}
// When using 'ImGuiInputTextFlags_EnterReturnsTrue' as a special case we reapply the live buffer back to the input buffer before clearing ActiveId, even though strictly speaking it wasn't modified on this frame.
- // If we didn't do that, code like InputInt() with ImGuiInputTextFlags_EnterReturnsTrue would fail. Also this allows the user to use InputText() with ImGuiInputTextFlags_EnterReturnsTrue without maintaining any user-side storage.
+ // If we didn't do that, code like InputInt() with ImGuiInputTextFlags_EnterReturnsTrue would fail.
+ // This also allows the user to use InputText() with ImGuiInputTextFlags_EnterReturnsTrue without maintaining any user-side storage (please note that if you use this property along ImGuiInputTextFlags_CallbackResize you can end up with your temporary string object unnecessarily allocating once a frame, either store your string data, either if you don't then don't use ImGuiInputTextFlags_CallbackResize).
bool apply_edit_back_to_user_buffer = !cancel_edit || (enter_pressed && (flags & ImGuiInputTextFlags_EnterReturnsTrue) != 0);
if (apply_edit_back_to_user_buffer)
{
@@ -3452,10 +3868,11 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
// Note that as soon as the input box is active, the in-widget value gets priority over any underlying modification of the input buffer
// FIXME: We actually always render 'buf' when calling DrawList->AddText, making the comment above incorrect.
// FIXME-OPT: CPU waste to do this every time the widget is active, should mark dirty state from the stb_textedit callbacks.
- if (is_editable)
+ if (!is_readonly)
{
- edit_state.TempBuffer.resize(edit_state.TextW.Size * 4 + 1);
- ImTextStrToUtf8(edit_state.TempBuffer.Data, edit_state.TempBuffer.Size, edit_state.TextW.Data, NULL);
+ state->TextAIsValid = true;
+ state->TextA.resize(state->TextW.Size * 4 + 1);
+ ImTextStrToUtf8(state->TextA.Data, state->TextA.Size, state->TextW.Data, NULL);
}
// User callback
@@ -3493,52 +3910,55 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
callback_data.UserData = callback_user_data;
callback_data.EventKey = event_key;
- callback_data.Buf = edit_state.TempBuffer.Data;
- callback_data.BufTextLen = edit_state.CurLenA;
- callback_data.BufSize = edit_state.BufCapacityA;
+ callback_data.Buf = state->TextA.Data;
+ callback_data.BufTextLen = state->CurLenA;
+ callback_data.BufSize = state->BufCapacityA;
callback_data.BufDirty = false;
// We have to convert from wchar-positions to UTF-8-positions, which can be pretty slow (an incentive to ditch the ImWchar buffer, see https://github.com/nothings/stb/issues/188)
- ImWchar* text = edit_state.TextW.Data;
- const int utf8_cursor_pos = callback_data.CursorPos = ImTextCountUtf8BytesFromStr(text, text + edit_state.StbState.cursor);
- const int utf8_selection_start = callback_data.SelectionStart = ImTextCountUtf8BytesFromStr(text, text + edit_state.StbState.select_start);
- const int utf8_selection_end = callback_data.SelectionEnd = ImTextCountUtf8BytesFromStr(text, text + edit_state.StbState.select_end);
+ ImWchar* text = state->TextW.Data;
+ const int utf8_cursor_pos = callback_data.CursorPos = ImTextCountUtf8BytesFromStr(text, text + state->Stb.cursor);
+ const int utf8_selection_start = callback_data.SelectionStart = ImTextCountUtf8BytesFromStr(text, text + state->Stb.select_start);
+ const int utf8_selection_end = callback_data.SelectionEnd = ImTextCountUtf8BytesFromStr(text, text + state->Stb.select_end);
// Call user code
callback(&callback_data);
// Read back what user may have modified
- IM_ASSERT(callback_data.Buf == edit_state.TempBuffer.Data); // Invalid to modify those fields
- IM_ASSERT(callback_data.BufSize == edit_state.BufCapacityA);
+ IM_ASSERT(callback_data.Buf == state->TextA.Data); // Invalid to modify those fields
+ IM_ASSERT(callback_data.BufSize == state->BufCapacityA);
IM_ASSERT(callback_data.Flags == flags);
- if (callback_data.CursorPos != utf8_cursor_pos) { edit_state.StbState.cursor = ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.CursorPos); edit_state.CursorFollow = true; }
- if (callback_data.SelectionStart != utf8_selection_start) { edit_state.StbState.select_start = ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.SelectionStart); }
- if (callback_data.SelectionEnd != utf8_selection_end) { edit_state.StbState.select_end = ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.SelectionEnd); }
+ if (callback_data.CursorPos != utf8_cursor_pos) { state->Stb.cursor = ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.CursorPos); state->CursorFollow = true; }
+ if (callback_data.SelectionStart != utf8_selection_start) { state->Stb.select_start = ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.SelectionStart); }
+ if (callback_data.SelectionEnd != utf8_selection_end) { state->Stb.select_end = ImTextCountCharsFromUtf8(callback_data.Buf, callback_data.Buf + callback_data.SelectionEnd); }
if (callback_data.BufDirty)
{
IM_ASSERT(callback_data.BufTextLen == (int)strlen(callback_data.Buf)); // You need to maintain BufTextLen if you change the text!
if (callback_data.BufTextLen > backup_current_text_length && is_resizable)
- edit_state.TextW.resize(edit_state.TextW.Size + (callback_data.BufTextLen - backup_current_text_length));
- edit_state.CurLenW = ImTextStrFromUtf8(edit_state.TextW.Data, edit_state.TextW.Size, callback_data.Buf, NULL);
- edit_state.CurLenA = callback_data.BufTextLen; // Assume correct length and valid UTF-8 from user, saves us an extra strlen()
- edit_state.CursorAnimReset();
+ state->TextW.resize(state->TextW.Size + (callback_data.BufTextLen - backup_current_text_length));
+ state->CurLenW = ImTextStrFromUtf8(state->TextW.Data, state->TextW.Size, callback_data.Buf, NULL);
+ state->CurLenA = callback_data.BufTextLen; // Assume correct length and valid UTF-8 from user, saves us an extra strlen()
+ state->CursorAnimReset();
}
}
}
// Will copy result string if modified
- if (is_editable && strcmp(edit_state.TempBuffer.Data, buf) != 0)
+ if (!is_readonly && strcmp(state->TextA.Data, buf) != 0)
{
- apply_new_text = edit_state.TempBuffer.Data;
- apply_new_text_length = edit_state.CurLenA;
+ apply_new_text = state->TextA.Data;
+ apply_new_text_length = state->CurLenA;
}
}
// Copy result to user buffer
if (apply_new_text)
{
+ // We cannot test for 'backup_current_text_length != apply_new_text_length' here because we have no guarantee that the size
+ // of our owned buffer matches the size of the string object held by the user, and by design we allow InputText() to be used
+ // without any storage on user's side.
IM_ASSERT(apply_new_text_length >= 0);
- if (backup_current_text_length != apply_new_text_length && is_resizable)
+ if (is_resizable)
{
ImGuiInputTextCallbackData callback_data;
callback_data.EventFlag = ImGuiInputTextFlags_CallbackResize;
@@ -3553,65 +3973,79 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
apply_new_text_length = ImMin(callback_data.BufTextLen, buf_size - 1);
IM_ASSERT(apply_new_text_length <= buf_size);
}
+ //IMGUI_DEBUG_LOG("InputText(\"%s\"): apply_new_text length %d\n", label, apply_new_text_length);
// If the underlying buffer resize was denied or not carried to the next frame, apply_new_text_length+1 may be >= buf_size.
- ImStrncpy(buf, edit_state.TempBuffer.Data, ImMin(apply_new_text_length + 1, buf_size));
+ ImStrncpy(buf, apply_new_text, ImMin(apply_new_text_length + 1, buf_size));
value_changed = true;
}
// Clear temporary user storage
- edit_state.UserFlags = 0;
- edit_state.UserCallback = NULL;
- edit_state.UserCallbackData = NULL;
+ state->UserFlags = 0;
+ state->UserCallback = NULL;
+ state->UserCallbackData = NULL;
}
// Release active ID at the end of the function (so e.g. pressing Return still does a final application of the value)
if (clear_active_id && g.ActiveId == id)
ClearActiveID();
- // Render
- // Select which buffer we are going to display. When ImGuiInputTextFlags_NoLiveEdit is set 'buf' might still be the old value. We set buf to NULL to prevent accidental usage from now on.
- const char* buf_display = (g.ActiveId == id && is_editable) ? edit_state.TempBuffer.Data : buf; buf = NULL;
+ // Render frame
+ if (!is_multiline)
+ {
+ RenderNavHighlight(frame_bb, id);
+ RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding);
+ }
+
+ const ImVec4 clip_rect(frame_bb.Min.x, frame_bb.Min.y, frame_bb.Min.x + inner_size.x, frame_bb.Min.y + inner_size.y); // Not using frame_bb.Max because we have adjusted size
+ ImVec2 draw_pos = is_multiline ? draw_window->DC.CursorPos : frame_bb.Min + style.FramePadding;
+ ImVec2 text_size(0.0f, 0.0f);
// Set upper limit of single-line InputTextEx() at 2 million characters strings. The current pathological worst case is a long line
// without any carriage return, which would makes ImFont::RenderText() reserve too many vertices and probably crash. Avoid it altogether.
// Note that we only use this limit on single-line InputText(), so a pathologically large line on a InputTextMultiline() would still crash.
const int buf_display_max_length = 2 * 1024 * 1024;
-
- if (!is_multiline)
+ const char* buf_display = buf_display_from_state ? state->TextA.Data : buf; //-V595
+ const char* buf_display_end = NULL; // We have specialized paths below for setting the length
+ if (is_displaying_hint)
{
- RenderNavHighlight(frame_bb, id);
- RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding);
+ buf_display = hint;
+ buf_display_end = hint + strlen(hint);
}
- const ImVec4 clip_rect(frame_bb.Min.x, frame_bb.Min.y, frame_bb.Min.x + size.x, frame_bb.Min.y + size.y); // Not using frame_bb.Max because we have adjusted size
- ImVec2 render_pos = is_multiline ? draw_window->DC.CursorPos : frame_bb.Min + style.FramePadding;
- ImVec2 text_size(0.f, 0.f);
- const bool is_currently_scrolling = (edit_state.ID == id && is_multiline && g.ActiveId == draw_window->GetIDNoKeepAlive("#SCROLLY"));
- if (g.ActiveId == id || is_currently_scrolling)
+ // Render text. We currently only render selection when the widget is active or while scrolling.
+ // FIXME: We could remove the '&& render_cursor' to keep rendering selection when inactive.
+ if (render_cursor || render_selection)
{
- edit_state.CursorAnim += io.DeltaTime;
+ IM_ASSERT(state != NULL);
+ if (!is_displaying_hint)
+ buf_display_end = buf_display + state->CurLenA;
+ // Render text (with cursor and selection)
// This is going to be messy. We need to:
// - Display the text (this alone can be more easily clipped)
// - Handle scrolling, highlight selection, display cursor (those all requires some form of 1d->2d cursor position calculation)
// - Measure text height (for scrollbar)
// We are attempting to do most of that in **one main pass** to minimize the computation cost (non-negligible for large amount of text) + 2nd pass for selection rendering (we could merge them by an extra refactoring effort)
// FIXME: This should occur on buf_display but we'd need to maintain cursor/select_start/select_end for UTF-8.
- const ImWchar* text_begin = edit_state.TextW.Data;
+ const ImWchar* text_begin = state->TextW.Data;
ImVec2 cursor_offset, select_start_offset;
{
- // Count lines + find lines numbers straddling 'cursor' and 'select_start' position.
- const ImWchar* searches_input_ptr[2];
- searches_input_ptr[0] = text_begin + edit_state.StbState.cursor;
- searches_input_ptr[1] = NULL;
- int searches_remaining = 1;
- int searches_result_line_number[2] = { -1, -999 };
- if (edit_state.StbState.select_start != edit_state.StbState.select_end)
+ // Find lines numbers straddling 'cursor' (slot 0) and 'select_start' (slot 1) positions.
+ const ImWchar* searches_input_ptr[2] = { NULL, NULL };
+ int searches_result_line_no[2] = { -1000, -1000 };
+ int searches_remaining = 0;
+ if (render_cursor)
+ {
+ searches_input_ptr[0] = text_begin + state->Stb.cursor;
+ searches_result_line_no[0] = -1;
+ searches_remaining++;
+ }
+ if (render_selection)
{
- searches_input_ptr[1] = text_begin + ImMin(edit_state.StbState.select_start, edit_state.StbState.select_end);
- searches_result_line_number[1] = -1;
+ searches_input_ptr[1] = text_begin + ImMin(state->Stb.select_start, state->Stb.select_end);
+ searches_result_line_no[1] = -1;
searches_remaining++;
}
@@ -3619,47 +4053,49 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
// In multi-line mode, we never exit the loop until all lines are counted, so add one extra to the searches_remaining counter.
searches_remaining += is_multiline ? 1 : 0;
int line_count = 0;
- //for (const ImWchar* s = text_begin; (s = (const ImWchar*)wcschr((const wchar_t*)s, (wchar_t)'\n')) != NULL; s++) // FIXME-OPT: Could use this when wchar_t are 16-bits
+ //for (const ImWchar* s = text_begin; (s = (const ImWchar*)wcschr((const wchar_t*)s, (wchar_t)'\n')) != NULL; s++) // FIXME-OPT: Could use this when wchar_t are 16-bit
for (const ImWchar* s = text_begin; *s != 0; s++)
if (*s == '\n')
{
line_count++;
- if (searches_result_line_number[0] == -1 && s >= searches_input_ptr[0]) { searches_result_line_number[0] = line_count; if (--searches_remaining <= 0) break; }
- if (searches_result_line_number[1] == -1 && s >= searches_input_ptr[1]) { searches_result_line_number[1] = line_count; if (--searches_remaining <= 0) break; }
+ if (searches_result_line_no[0] == -1 && s >= searches_input_ptr[0]) { searches_result_line_no[0] = line_count; if (--searches_remaining <= 0) break; }
+ if (searches_result_line_no[1] == -1 && s >= searches_input_ptr[1]) { searches_result_line_no[1] = line_count; if (--searches_remaining <= 0) break; }
}
line_count++;
- if (searches_result_line_number[0] == -1) searches_result_line_number[0] = line_count;
- if (searches_result_line_number[1] == -1) searches_result_line_number[1] = line_count;
+ if (searches_result_line_no[0] == -1)
+ searches_result_line_no[0] = line_count;
+ if (searches_result_line_no[1] == -1)
+ searches_result_line_no[1] = line_count;
// Calculate 2d position by finding the beginning of the line and measuring distance
cursor_offset.x = InputTextCalcTextSizeW(ImStrbolW(searches_input_ptr[0], text_begin), searches_input_ptr[0]).x;
- cursor_offset.y = searches_result_line_number[0] * g.FontSize;
- if (searches_result_line_number[1] >= 0)
+ cursor_offset.y = searches_result_line_no[0] * g.FontSize;
+ if (searches_result_line_no[1] >= 0)
{
select_start_offset.x = InputTextCalcTextSizeW(ImStrbolW(searches_input_ptr[1], text_begin), searches_input_ptr[1]).x;
- select_start_offset.y = searches_result_line_number[1] * g.FontSize;
+ select_start_offset.y = searches_result_line_no[1] * g.FontSize;
}
// Store text height (note that we haven't calculated text width at all, see GitHub issues #383, #1224)
if (is_multiline)
- text_size = ImVec2(size.x, line_count * g.FontSize);
+ text_size = ImVec2(inner_size.x, line_count * g.FontSize);
}
// Scroll
- if (edit_state.CursorFollow)
+ if (render_cursor && state->CursorFollow)
{
// Horizontal scroll in chunks of quarter width
if (!(flags & ImGuiInputTextFlags_NoHorizontalScroll))
{
- const float scroll_increment_x = size.x * 0.25f;
- if (cursor_offset.x < edit_state.ScrollX)
- edit_state.ScrollX = (float)(int)ImMax(0.0f, cursor_offset.x - scroll_increment_x);
- else if (cursor_offset.x - size.x >= edit_state.ScrollX)
- edit_state.ScrollX = (float)(int)(cursor_offset.x - size.x + scroll_increment_x);
+ const float scroll_increment_x = inner_size.x * 0.25f;
+ if (cursor_offset.x < state->ScrollX)
+ state->ScrollX = IM_FLOOR(ImMax(0.0f, cursor_offset.x - scroll_increment_x));
+ else if (cursor_offset.x - inner_size.x >= state->ScrollX)
+ state->ScrollX = IM_FLOOR(cursor_offset.x - inner_size.x + scroll_increment_x);
}
else
{
- edit_state.ScrollX = 0.0f;
+ state->ScrollX = 0.0f;
}
// Vertical scroll
@@ -3668,33 +4104,33 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
float scroll_y = draw_window->Scroll.y;
if (cursor_offset.y - g.FontSize < scroll_y)
scroll_y = ImMax(0.0f, cursor_offset.y - g.FontSize);
- else if (cursor_offset.y - size.y >= scroll_y)
- scroll_y = cursor_offset.y - size.y;
- draw_window->DC.CursorPos.y += (draw_window->Scroll.y - scroll_y); // To avoid a frame of lag
+ else if (cursor_offset.y - inner_size.y >= scroll_y)
+ scroll_y = cursor_offset.y - inner_size.y;
+ draw_pos.y += (draw_window->Scroll.y - scroll_y); // Manipulate cursor pos immediately avoid a frame of lag
draw_window->Scroll.y = scroll_y;
- render_pos.y = draw_window->DC.CursorPos.y;
}
+
+ state->CursorFollow = false;
}
- edit_state.CursorFollow = false;
- const ImVec2 render_scroll = ImVec2(edit_state.ScrollX, 0.0f);
// Draw selection
- if (edit_state.StbState.select_start != edit_state.StbState.select_end)
+ const ImVec2 draw_scroll = ImVec2(state->ScrollX, 0.0f);
+ if (render_selection)
{
- const ImWchar* text_selected_begin = text_begin + ImMin(edit_state.StbState.select_start, edit_state.StbState.select_end);
- const ImWchar* text_selected_end = text_begin + ImMax(edit_state.StbState.select_start, edit_state.StbState.select_end);
+ const ImWchar* text_selected_begin = text_begin + ImMin(state->Stb.select_start, state->Stb.select_end);
+ const ImWchar* text_selected_end = text_begin + ImMax(state->Stb.select_start, state->Stb.select_end);
+ ImU32 bg_color = GetColorU32(ImGuiCol_TextSelectedBg, render_cursor ? 1.0f : 0.6f); // FIXME: current code flow mandate that render_cursor is always true here, we are leaving the transparent one for tests.
float bg_offy_up = is_multiline ? 0.0f : -1.0f; // FIXME: those offsets should be part of the style? they don't play so well with multi-line selection.
float bg_offy_dn = is_multiline ? 0.0f : 2.0f;
- ImU32 bg_color = GetColorU32(ImGuiCol_TextSelectedBg);
- ImVec2 rect_pos = render_pos + select_start_offset - render_scroll;
+ ImVec2 rect_pos = draw_pos + select_start_offset - draw_scroll;
for (const ImWchar* p = text_selected_begin; p < text_selected_end; )
{
if (rect_pos.y > clip_rect.w + g.FontSize)
break;
if (rect_pos.y < clip_rect.y)
{
- //p = (const ImWchar*)wmemchr((const wchar_t*)p, '\n', text_selected_end - p); // FIXME-OPT: Could use this when wchar_t are 16-bits
+ //p = (const ImWchar*)wmemchr((const wchar_t*)p, '\n', text_selected_end - p); // FIXME-OPT: Could use this when wchar_t are 16-bit
//p = p ? p + 1 : text_selected_end;
while (p < text_selected_end)
if (*p++ == '\n')
@@ -3703,64 +4139,77 @@ bool ImGui::InputTextEx(const char* label, char* buf, int buf_size, const ImVec2
else
{
ImVec2 rect_size = InputTextCalcTextSizeW(p, text_selected_end, &p, NULL, true);
- if (rect_size.x <= 0.0f) rect_size.x = (float)(int)(g.Font->GetCharAdvance((ImWchar)' ') * 0.50f); // So we can see selected empty lines
+ if (rect_size.x <= 0.0f) rect_size.x = IM_FLOOR(g.Font->GetCharAdvance((ImWchar)' ') * 0.50f); // So we can see selected empty lines
ImRect rect(rect_pos + ImVec2(0.0f, bg_offy_up - g.FontSize), rect_pos +ImVec2(rect_size.x, bg_offy_dn));
rect.ClipWith(clip_rect);
if (rect.Overlaps(clip_rect))
draw_window->DrawList->AddRectFilled(rect.Min, rect.Max, bg_color);
}
- rect_pos.x = render_pos.x - render_scroll.x;
+ rect_pos.x = draw_pos.x - draw_scroll.x;
rect_pos.y += g.FontSize;
}
}
- const int buf_display_len = edit_state.CurLenA;
- if (is_multiline || buf_display_len < buf_display_max_length)
- draw_window->DrawList->AddText(g.Font, g.FontSize, render_pos - render_scroll, GetColorU32(ImGuiCol_Text), buf_display, buf_display + buf_display_len, 0.0f, is_multiline ? NULL : &clip_rect);
+ // We test for 'buf_display_max_length' as a way to avoid some pathological cases (e.g. single-line 1 MB string) which would make ImDrawList crash.
+ if (is_multiline || (buf_display_end - buf_display) < buf_display_max_length)
+ {
+ ImU32 col = GetColorU32(is_displaying_hint ? ImGuiCol_TextDisabled : ImGuiCol_Text);
+ draw_window->DrawList->AddText(g.Font, g.FontSize, draw_pos - draw_scroll, col, buf_display, buf_display_end, 0.0f, is_multiline ? NULL : &clip_rect);
+ }
// Draw blinking cursor
- bool cursor_is_visible = (!g.IO.ConfigInputTextCursorBlink) || (g.InputTextState.CursorAnim <= 0.0f) || ImFmod(g.InputTextState.CursorAnim, 1.20f) <= 0.80f;
- ImVec2 cursor_screen_pos = render_pos + cursor_offset - render_scroll;
- ImRect cursor_screen_rect(cursor_screen_pos.x, cursor_screen_pos.y-g.FontSize+0.5f, cursor_screen_pos.x+1.0f, cursor_screen_pos.y-1.5f);
- if (cursor_is_visible && cursor_screen_rect.Overlaps(clip_rect))
- draw_window->DrawList->AddLine(cursor_screen_rect.Min, cursor_screen_rect.GetBL(), GetColorU32(ImGuiCol_Text));
-
- // Notify OS of text input position for advanced IME (-1 x offset so that Windows IME can cover our cursor. Bit of an extra nicety.)
- if (is_editable)
- g.PlatformImePos = ImVec2(cursor_screen_pos.x - 1, cursor_screen_pos.y - g.FontSize);
+ if (render_cursor)
+ {
+ state->CursorAnim += io.DeltaTime;
+ bool cursor_is_visible = (!g.IO.ConfigInputTextCursorBlink) || (state->CursorAnim <= 0.0f) || ImFmod(state->CursorAnim, 1.20f) <= 0.80f;
+ ImVec2 cursor_screen_pos = draw_pos + cursor_offset - draw_scroll;
+ ImRect cursor_screen_rect(cursor_screen_pos.x, cursor_screen_pos.y - g.FontSize + 0.5f, cursor_screen_pos.x + 1.0f, cursor_screen_pos.y - 1.5f);
+ if (cursor_is_visible && cursor_screen_rect.Overlaps(clip_rect))
+ draw_window->DrawList->AddLine(cursor_screen_rect.Min, cursor_screen_rect.GetBL(), GetColorU32(ImGuiCol_Text));
+
+ // Notify OS of text input position for advanced IME (-1 x offset so that Windows IME can cover our cursor. Bit of an extra nicety.)
+ if (!is_readonly)
+ g.PlatformImePos = ImVec2(cursor_screen_pos.x - 1.0f, cursor_screen_pos.y - g.FontSize);
+ }
}
else
{
- // Render text only
- const char* buf_end = NULL;
+ // Render text only (no selection, no cursor)
if (is_multiline)
- text_size = ImVec2(size.x, InputTextCalcTextLenAndLineCount(buf_display, &buf_end) * g.FontSize); // We don't need width
- else
- buf_end = buf_display + strlen(buf_display);
- if (is_multiline || (buf_end - buf_display) < buf_display_max_length)
- draw_window->DrawList->AddText(g.Font, g.FontSize, render_pos, GetColorU32(ImGuiCol_Text), buf_display, buf_end, 0.0f, is_multiline ? NULL : &clip_rect);
+ text_size = ImVec2(inner_size.x, InputTextCalcTextLenAndLineCount(buf_display, &buf_display_end) * g.FontSize); // We don't need width
+ else if (!is_displaying_hint && g.ActiveId == id)
+ buf_display_end = buf_display + state->CurLenA;
+ else if (!is_displaying_hint)
+ buf_display_end = buf_display + strlen(buf_display);
+
+ if (is_multiline || (buf_display_end - buf_display) < buf_display_max_length)
+ {
+ ImU32 col = GetColorU32(is_displaying_hint ? ImGuiCol_TextDisabled : ImGuiCol_Text);
+ draw_window->DrawList->AddText(g.Font, g.FontSize, draw_pos, col, buf_display, buf_display_end, 0.0f, is_multiline ? NULL : &clip_rect);
+ }
}
if (is_multiline)
{
Dummy(text_size + ImVec2(0.0f, g.FontSize)); // Always add room to scroll an extra line
- EndChildFrame();
+ EndChild();
EndGroup();
}
- if (is_password)
+ if (is_password && !is_displaying_hint)
PopFont();
// Log as text
- if (g.LogEnabled && !is_password)
- LogRenderedText(&render_pos, buf_display, NULL);
+ if (g.LogEnabled && !(is_password && !is_displaying_hint))
+ LogRenderedText(&draw_pos, buf_display, buf_display_end);
if (label_size.x > 0)
RenderText(ImVec2(frame_bb.Max.x + style.ItemInnerSpacing.x, frame_bb.Min.y + style.FramePadding.y), label);
- if (value_changed)
+ if (value_changed && !(flags & ImGuiInputTextFlags_NoMarkEdited))
MarkItemEdited(id);
+ IMGUI_TEST_ENGINE_ITEM_INFO(id, label, window->DC.ItemFlags);
if ((flags & ImGuiInputTextFlags_EnterReturnsTrue) != 0)
return enter_pressed;
else
@@ -3799,9 +4248,11 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag
ImGuiContext& g = *GImGui;
const ImGuiStyle& style = g.Style;
const float square_sz = GetFrameHeight();
- const float w_extra = (flags & ImGuiColorEditFlags_NoSmallPreview) ? 0.0f : (square_sz + style.ItemInnerSpacing.x);
- const float w_items_all = CalcItemWidth() - w_extra;
+ const float w_full = CalcItemWidth();
+ const float w_button = (flags & ImGuiColorEditFlags_NoSmallPreview) ? 0.0f : (square_sz + style.ItemInnerSpacing.x);
+ const float w_inputs = w_full - w_button;
const char* label_display_end = FindRenderedTextEnd(label);
+ g.NextItemData.ClearFlags();
BeginGroup();
PushID(label);
@@ -3809,20 +4260,24 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag
// If we're not showing any slider there's no point in doing any HSV conversions
const ImGuiColorEditFlags flags_untouched = flags;
if (flags & ImGuiColorEditFlags_NoInputs)
- flags = (flags & (~ImGuiColorEditFlags__InputsMask)) | ImGuiColorEditFlags_RGB | ImGuiColorEditFlags_NoOptions;
+ flags = (flags & (~ImGuiColorEditFlags__DisplayMask)) | ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_NoOptions;
// Context menu: display and modify options (before defaults are applied)
if (!(flags & ImGuiColorEditFlags_NoOptions))
ColorEditOptionsPopup(col, flags);
// Read stored options
- if (!(flags & ImGuiColorEditFlags__InputsMask))
- flags |= (g.ColorEditOptions & ImGuiColorEditFlags__InputsMask);
+ if (!(flags & ImGuiColorEditFlags__DisplayMask))
+ flags |= (g.ColorEditOptions & ImGuiColorEditFlags__DisplayMask);
if (!(flags & ImGuiColorEditFlags__DataTypeMask))
flags |= (g.ColorEditOptions & ImGuiColorEditFlags__DataTypeMask);
if (!(flags & ImGuiColorEditFlags__PickerMask))
flags |= (g.ColorEditOptions & ImGuiColorEditFlags__PickerMask);
- flags |= (g.ColorEditOptions & ~(ImGuiColorEditFlags__InputsMask | ImGuiColorEditFlags__DataTypeMask | ImGuiColorEditFlags__PickerMask));
+ if (!(flags & ImGuiColorEditFlags__InputMask))
+ flags |= (g.ColorEditOptions & ImGuiColorEditFlags__InputMask);
+ flags |= (g.ColorEditOptions & ~(ImGuiColorEditFlags__DisplayMask | ImGuiColorEditFlags__DataTypeMask | ImGuiColorEditFlags__PickerMask | ImGuiColorEditFlags__InputMask));
+ IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags__DisplayMask)); // Check that only 1 is selected
+ IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags__InputMask)); // Check that only 1 is selected
const bool alpha = (flags & ImGuiColorEditFlags_NoAlpha) == 0;
const bool hdr = (flags & ImGuiColorEditFlags_HDR) != 0;
@@ -3830,53 +4285,72 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag
// Convert to the formats we need
float f[4] = { col[0], col[1], col[2], alpha ? col[3] : 1.0f };
- if (flags & ImGuiColorEditFlags_HSV)
+ if ((flags & ImGuiColorEditFlags_InputHSV) && (flags & ImGuiColorEditFlags_DisplayRGB))
+ ColorConvertHSVtoRGB(f[0], f[1], f[2], f[0], f[1], f[2]);
+ else if ((flags & ImGuiColorEditFlags_InputRGB) && (flags & ImGuiColorEditFlags_DisplayHSV))
+ {
+ // Hue is lost when converting from greyscale rgb (saturation=0). Restore it.
ColorConvertRGBtoHSV(f[0], f[1], f[2], f[0], f[1], f[2]);
+ if (memcmp(g.ColorEditLastColor, col, sizeof(float) * 3) == 0)
+ {
+ if (f[1] == 0)
+ f[0] = g.ColorEditLastHue;
+ if (f[2] == 0)
+ f[1] = g.ColorEditLastSat;
+ }
+ }
int i[4] = { IM_F32_TO_INT8_UNBOUND(f[0]), IM_F32_TO_INT8_UNBOUND(f[1]), IM_F32_TO_INT8_UNBOUND(f[2]), IM_F32_TO_INT8_UNBOUND(f[3]) };
bool value_changed = false;
bool value_changed_as_float = false;
- if ((flags & (ImGuiColorEditFlags_RGB | ImGuiColorEditFlags_HSV)) != 0 && (flags & ImGuiColorEditFlags_NoInputs) == 0)
+ const ImVec2 pos = window->DC.CursorPos;
+ const float inputs_offset_x = (style.ColorButtonPosition == ImGuiDir_Left) ? w_button : 0.0f;
+ window->DC.CursorPos.x = pos.x + inputs_offset_x;
+
+ if ((flags & (ImGuiColorEditFlags_DisplayRGB | ImGuiColorEditFlags_DisplayHSV)) != 0 && (flags & ImGuiColorEditFlags_NoInputs) == 0)
{
// RGB/HSV 0..255 Sliders
- const float w_item_one = ImMax(1.0f, (float)(int)((w_items_all - (style.ItemInnerSpacing.x) * (components-1)) / (float)components));
- const float w_item_last = ImMax(1.0f, (float)(int)(w_items_all - (w_item_one + style.ItemInnerSpacing.x) * (components-1)));
+ const float w_item_one = ImMax(1.0f, IM_FLOOR((w_inputs - (style.ItemInnerSpacing.x) * (components-1)) / (float)components));
+ const float w_item_last = ImMax(1.0f, IM_FLOOR(w_inputs - (w_item_one + style.ItemInnerSpacing.x) * (components-1)));
const bool hide_prefix = (w_item_one <= CalcTextSize((flags & ImGuiColorEditFlags_Float) ? "M:0.000" : "M:000").x);
- const char* ids[4] = { "##X", "##Y", "##Z", "##W" };
- const char* fmt_table_int[3][4] =
+ static const char* ids[4] = { "##X", "##Y", "##Z", "##W" };
+ static const char* fmt_table_int[3][4] =
{
{ "%3d", "%3d", "%3d", "%3d" }, // Short display
{ "R:%3d", "G:%3d", "B:%3d", "A:%3d" }, // Long display for RGBA
{ "H:%3d", "S:%3d", "V:%3d", "A:%3d" } // Long display for HSVA
};
- const char* fmt_table_float[3][4] =
+ static const char* fmt_table_float[3][4] =
{
{ "%0.3f", "%0.3f", "%0.3f", "%0.3f" }, // Short display
{ "R:%0.3f", "G:%0.3f", "B:%0.3f", "A:%0.3f" }, // Long display for RGBA
{ "H:%0.3f", "S:%0.3f", "V:%0.3f", "A:%0.3f" } // Long display for HSVA
};
- const int fmt_idx = hide_prefix ? 0 : (flags & ImGuiColorEditFlags_HSV) ? 2 : 1;
+ const int fmt_idx = hide_prefix ? 0 : (flags & ImGuiColorEditFlags_DisplayHSV) ? 2 : 1;
- PushItemWidth(w_item_one);
for (int n = 0; n < components; n++)
{
if (n > 0)
SameLine(0, style.ItemInnerSpacing.x);
- if (n + 1 == components)
- PushItemWidth(w_item_last);
+ SetNextItemWidth((n + 1 < components) ? w_item_one : w_item_last);
+
+ // FIXME: When ImGuiColorEditFlags_HDR flag is passed HS values snap in weird ways when SV values go below 0.
if (flags & ImGuiColorEditFlags_Float)
- value_changed = value_changed_as_float = value_changed | DragFloat(ids[n], &f[n], 1.0f/255.0f, 0.0f, hdr ? 0.0f : 1.0f, fmt_table_float[fmt_idx][n]);
+ {
+ value_changed |= DragFloat(ids[n], &f[n], 1.0f/255.0f, 0.0f, hdr ? 0.0f : 1.0f, fmt_table_float[fmt_idx][n]);
+ value_changed_as_float |= value_changed;
+ }
else
+ {
value_changed |= DragInt(ids[n], &i[n], 1.0f, 0, hdr ? 0 : 255, fmt_table_int[fmt_idx][n]);
+ }
if (!(flags & ImGuiColorEditFlags_NoOptions))
OpenPopupOnItemClick("context");
}
- PopItemWidth();
- PopItemWidth();
}
- else if ((flags & ImGuiColorEditFlags_HEX) != 0 && (flags & ImGuiColorEditFlags_NoInputs) == 0)
+ else if ((flags & ImGuiColorEditFlags_DisplayHex) != 0 && (flags & ImGuiColorEditFlags_NoInputs) == 0)
{
// RGB Hexadecimal Input
char buf[64];
@@ -3884,7 +4358,7 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag
ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X%02X", ImClamp(i[0],0,255), ImClamp(i[1],0,255), ImClamp(i[2],0,255), ImClamp(i[3],0,255));
else
ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X", ImClamp(i[0],0,255), ImClamp(i[1],0,255), ImClamp(i[2],0,255));
- PushItemWidth(w_items_all);
+ SetNextItemWidth(w_inputs);
if (InputText("##Text", buf, IM_ARRAYSIZE(buf), ImGuiInputTextFlags_CharsHexadecimal | ImGuiInputTextFlags_CharsUppercase))
{
value_changed = true;
@@ -3899,14 +4373,13 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag
}
if (!(flags & ImGuiColorEditFlags_NoOptions))
OpenPopupOnItemClick("context");
- PopItemWidth();
}
ImGuiWindow* picker_active_window = NULL;
if (!(flags & ImGuiColorEditFlags_NoSmallPreview))
{
- if (!(flags & ImGuiColorEditFlags_NoInputs))
- SameLine(0, style.ItemInnerSpacing.x);
+ const float button_offset_x = ((flags & ImGuiColorEditFlags_NoInputs) || (style.ColorButtonPosition == ImGuiDir_Left)) ? 0.0f : w_inputs + style.ItemInnerSpacing.x;
+ window->DC.CursorPos = ImVec2(pos.x + button_offset_x, pos.y);
const ImVec4 col_v4(col[0], col[1], col[2], alpha ? col[3] : 1.0f);
if (ColorButton("##ColorButton", col_v4, flags))
@@ -3927,40 +4400,45 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag
picker_active_window = g.CurrentWindow;
if (label != label_display_end)
{
- TextUnformatted(label, label_display_end);
+ TextEx(label, label_display_end);
Spacing();
}
- ImGuiColorEditFlags picker_flags_to_forward = ImGuiColorEditFlags__DataTypeMask | ImGuiColorEditFlags__PickerMask | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaBar;
- ImGuiColorEditFlags picker_flags = (flags_untouched & picker_flags_to_forward) | ImGuiColorEditFlags__InputsMask | ImGuiColorEditFlags_NoLabel | ImGuiColorEditFlags_AlphaPreviewHalf;
- PushItemWidth(square_sz * 12.0f); // Use 256 + bar sizes?
+ ImGuiColorEditFlags picker_flags_to_forward = ImGuiColorEditFlags__DataTypeMask | ImGuiColorEditFlags__PickerMask | ImGuiColorEditFlags__InputMask | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaBar;
+ ImGuiColorEditFlags picker_flags = (flags_untouched & picker_flags_to_forward) | ImGuiColorEditFlags__DisplayMask | ImGuiColorEditFlags_NoLabel | ImGuiColorEditFlags_AlphaPreviewHalf;
+ SetNextItemWidth(square_sz * 12.0f); // Use 256 + bar sizes?
value_changed |= ColorPicker4("##picker", col, picker_flags, &g.ColorPickerRef.x);
- PopItemWidth();
EndPopup();
}
}
if (label != label_display_end && !(flags & ImGuiColorEditFlags_NoLabel))
{
- SameLine(0, style.ItemInnerSpacing.x);
- TextUnformatted(label, label_display_end);
+ const float text_offset_x = (flags & ImGuiColorEditFlags_NoInputs) ? w_button : w_full + style.ItemInnerSpacing.x;
+ window->DC.CursorPos = ImVec2(pos.x + text_offset_x, pos.y + style.FramePadding.y);
+ TextEx(label, label_display_end);
}
// Convert back
- if (picker_active_window == NULL)
+ if (value_changed && picker_active_window == NULL)
{
if (!value_changed_as_float)
for (int n = 0; n < 4; n++)
f[n] = i[n] / 255.0f;
- if (flags & ImGuiColorEditFlags_HSV)
- ColorConvertHSVtoRGB(f[0], f[1], f[2], f[0], f[1], f[2]);
- if (value_changed)
+ if ((flags & ImGuiColorEditFlags_DisplayHSV) && (flags & ImGuiColorEditFlags_InputRGB))
{
- col[0] = f[0];
- col[1] = f[1];
- col[2] = f[2];
- if (alpha)
- col[3] = f[3];
+ g.ColorEditLastHue = f[0];
+ g.ColorEditLastSat = f[1];
+ ColorConvertHSVtoRGB(f[0], f[1], f[2], f[0], f[1], f[2]);
+ memcpy(g.ColorEditLastColor, f, sizeof(float) * 3);
}
+ if ((flags & ImGuiColorEditFlags_DisplayRGB) && (flags & ImGuiColorEditFlags_InputHSV))
+ ColorConvertRGBtoHSV(f[0], f[1], f[2], f[0], f[1], f[2]);
+
+ col[0] = f[0];
+ col[1] = f[1];
+ col[2] = f[2];
+ if (alpha)
+ col[3] = f[3];
}
PopID();
@@ -3970,16 +4448,21 @@ bool ImGui::ColorEdit4(const char* label, float col[4], ImGuiColorEditFlags flag
// NB: The flag test is merely an optional micro-optimization, BeginDragDropTarget() does the same test.
if ((window->DC.LastItemStatusFlags & ImGuiItemStatusFlags_HoveredRect) && !(flags & ImGuiColorEditFlags_NoDragDrop) && BeginDragDropTarget())
{
+ bool accepted_drag_drop = false;
if (const ImGuiPayload* payload = AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F))
{
- memcpy((float*)col, payload->Data, sizeof(float) * 3);
- value_changed = true;
+ memcpy((float*)col, payload->Data, sizeof(float) * 3); // Preserve alpha if any //-V512
+ value_changed = accepted_drag_drop = true;
}
if (const ImGuiPayload* payload = AcceptDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F))
{
memcpy((float*)col, payload->Data, sizeof(float) * components);
- value_changed = true;
+ value_changed = accepted_drag_drop = true;
}
+
+ // Drag-drop payloads are always RGB
+ if (accepted_drag_drop && (flags & ImGuiColorEditFlags_InputHSV))
+ ColorConvertRGBtoHSV(col[0], col[1], col[2], col[0], col[1], col[2]);
EndDragDropTarget();
}
@@ -4049,25 +4532,33 @@ void ImGui::RenderColorRectWithAlphaCheckerboard(ImVec2 p_min, ImVec2 p_max, ImU
}
// Helper for ColorPicker4()
-static void RenderArrowsForVerticalBar(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, float bar_w)
+static void RenderArrowsForVerticalBar(ImDrawList* draw_list, ImVec2 pos, ImVec2 half_sz, float bar_w, float alpha)
{
- ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + half_sz.x + 1, pos.y), ImVec2(half_sz.x + 2, half_sz.y + 1), ImGuiDir_Right, IM_COL32_BLACK);
- ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + half_sz.x, pos.y), half_sz, ImGuiDir_Right, IM_COL32_WHITE);
- ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + bar_w - half_sz.x - 1, pos.y), ImVec2(half_sz.x + 2, half_sz.y + 1), ImGuiDir_Left, IM_COL32_BLACK);
- ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + bar_w - half_sz.x, pos.y), half_sz, ImGuiDir_Left, IM_COL32_WHITE);
+ ImU32 alpha8 = IM_F32_TO_INT8_SAT(alpha);
+ ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + half_sz.x + 1, pos.y), ImVec2(half_sz.x + 2, half_sz.y + 1), ImGuiDir_Right, IM_COL32(0,0,0,alpha8));
+ ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + half_sz.x, pos.y), half_sz, ImGuiDir_Right, IM_COL32(255,255,255,alpha8));
+ ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + bar_w - half_sz.x - 1, pos.y), ImVec2(half_sz.x + 2, half_sz.y + 1), ImGuiDir_Left, IM_COL32(0,0,0,alpha8));
+ ImGui::RenderArrowPointingAt(draw_list, ImVec2(pos.x + bar_w - half_sz.x, pos.y), half_sz, ImGuiDir_Left, IM_COL32(255,255,255,alpha8));
}
// Note: ColorPicker4() only accesses 3 floats if ImGuiColorEditFlags_NoAlpha flag is set.
+// (In C++ the 'float col[4]' notation for a function argument is equivalent to 'float* col', we only specify a size to facilitate understanding of the code.)
// FIXME: we adjust the big color square height based on item width, which may cause a flickering feedback loop (if automatic height makes a vertical scrollbar appears, affecting automatic width..)
+// FIXME: this is trying to be aware of style.Alpha but not fully correct. Also, the color wheel will have overlapping glitches with (style.Alpha < 1.0)
bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags flags, const float* ref_col)
{
ImGuiContext& g = *GImGui;
ImGuiWindow* window = GetCurrentWindow();
- ImDrawList* draw_list = window->DrawList;
+ if (window->SkipItems)
+ return false;
+ ImDrawList* draw_list = window->DrawList;
ImGuiStyle& style = g.Style;
ImGuiIO& io = g.IO;
+ const float width = CalcItemWidth();
+ g.NextItemData.ClearFlags();
+
PushID(label);
BeginGroup();
@@ -4081,7 +4572,10 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
// Read stored options
if (!(flags & ImGuiColorEditFlags__PickerMask))
flags |= ((g.ColorEditOptions & ImGuiColorEditFlags__PickerMask) ? g.ColorEditOptions : ImGuiColorEditFlags__OptionsDefault) & ImGuiColorEditFlags__PickerMask;
- IM_ASSERT(ImIsPowerOfTwo((int)(flags & ImGuiColorEditFlags__PickerMask))); // Check that only 1 is selected
+ if (!(flags & ImGuiColorEditFlags__InputMask))
+ flags |= ((g.ColorEditOptions & ImGuiColorEditFlags__InputMask) ? g.ColorEditOptions : ImGuiColorEditFlags__OptionsDefault) & ImGuiColorEditFlags__InputMask;
+ IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags__PickerMask)); // Check that only 1 is selected
+ IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags__InputMask)); // Check that only 1 is selected
if (!(flags & ImGuiColorEditFlags_NoOptions))
flags |= (g.ColorEditOptions & ImGuiColorEditFlags_AlphaBar);
@@ -4091,10 +4585,10 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
ImVec2 picker_pos = window->DC.CursorPos;
float square_sz = GetFrameHeight();
float bars_width = square_sz; // Arbitrary smallish width of Hue/Alpha picking bars
- float sv_picker_size = ImMax(bars_width * 1, CalcItemWidth() - (alpha_bar ? 2 : 1) * (bars_width + style.ItemInnerSpacing.x)); // Saturation/Value picking box
+ float sv_picker_size = ImMax(bars_width * 1, width - (alpha_bar ? 2 : 1) * (bars_width + style.ItemInnerSpacing.x)); // Saturation/Value picking box
float bar0_pos_x = picker_pos.x + sv_picker_size + style.ItemInnerSpacing.x;
float bar1_pos_x = bar0_pos_x + bars_width + style.ItemInnerSpacing.x;
- float bars_triangles_half_sz = (float)(int)(bars_width * 0.20f);
+ float bars_triangles_half_sz = IM_FLOOR(bars_width * 0.20f);
float backup_initial_col[4];
memcpy(backup_initial_col, col, components * sizeof(float));
@@ -4110,8 +4604,24 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
ImVec2 triangle_pb = ImVec2(triangle_r * -0.5f, triangle_r * -0.866025f); // Black point.
ImVec2 triangle_pc = ImVec2(triangle_r * -0.5f, triangle_r * +0.866025f); // White point.
- float H,S,V;
- ColorConvertRGBtoHSV(col[0], col[1], col[2], H, S, V);
+ float H = col[0], S = col[1], V = col[2];
+ float R = col[0], G = col[1], B = col[2];
+ if (flags & ImGuiColorEditFlags_InputRGB)
+ {
+ // Hue is lost when converting from greyscale rgb (saturation=0). Restore it.
+ ColorConvertRGBtoHSV(R, G, B, H, S, V);
+ if (memcmp(g.ColorEditLastColor, col, sizeof(float) * 3) == 0)
+ {
+ if (S == 0)
+ H = g.ColorEditLastHue;
+ if (V == 0)
+ S = g.ColorEditLastSat;
+ }
+ }
+ else if (flags & ImGuiColorEditFlags_InputHSV)
+ {
+ ColorConvertHSVtoRGB(H, S, V, R, G, B);
+ }
bool value_changed = false, value_changed_h = false, value_changed_sv = false;
@@ -4200,7 +4710,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
{
if ((flags & ImGuiColorEditFlags_NoSidePreview))
SameLine(0, style.ItemInnerSpacing.x);
- TextUnformatted(label, label_display_end);
+ TextEx(label, label_display_end);
}
}
@@ -4210,12 +4720,14 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
ImVec4 col_v4(col[0], col[1], col[2], (flags & ImGuiColorEditFlags_NoAlpha) ? 1.0f : col[3]);
if ((flags & ImGuiColorEditFlags_NoLabel))
Text("Current");
- ColorButton("##current", col_v4, (flags & (ImGuiColorEditFlags_HDR|ImGuiColorEditFlags_AlphaPreview|ImGuiColorEditFlags_AlphaPreviewHalf|ImGuiColorEditFlags_NoTooltip)), ImVec2(square_sz * 3, square_sz * 2));
+
+ ImGuiColorEditFlags sub_flags_to_forward = ImGuiColorEditFlags__InputMask | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf | ImGuiColorEditFlags_NoTooltip;
+ ColorButton("##current", col_v4, (flags & sub_flags_to_forward), ImVec2(square_sz * 3, square_sz * 2));
if (ref_col != NULL)
{
Text("Original");
ImVec4 ref_col_v4(ref_col[0], ref_col[1], ref_col[2], (flags & ImGuiColorEditFlags_NoAlpha) ? 1.0f : ref_col[3]);
- if (ColorButton("##original", ref_col_v4, (flags & (ImGuiColorEditFlags_HDR|ImGuiColorEditFlags_AlphaPreview|ImGuiColorEditFlags_AlphaPreviewHalf|ImGuiColorEditFlags_NoTooltip)), ImVec2(square_sz * 3, square_sz * 2)))
+ if (ColorButton("##original", ref_col_v4, (flags & sub_flags_to_forward), ImVec2(square_sz * 3, square_sz * 2)))
{
memcpy(col, ref_col, components * sizeof(float));
value_changed = true;
@@ -4227,32 +4739,46 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
// Convert back color to RGB
if (value_changed_h || value_changed_sv)
- ColorConvertHSVtoRGB(H >= 1.0f ? H - 10 * 1e-6f : H, S > 0.0f ? S : 10*1e-6f, V > 0.0f ? V : 1e-6f, col[0], col[1], col[2]);
+ {
+ if (flags & ImGuiColorEditFlags_InputRGB)
+ {
+ ColorConvertHSVtoRGB(H >= 1.0f ? H - 10 * 1e-6f : H, S > 0.0f ? S : 10*1e-6f, V > 0.0f ? V : 1e-6f, col[0], col[1], col[2]);
+ g.ColorEditLastHue = H;
+ g.ColorEditLastSat = S;
+ memcpy(g.ColorEditLastColor, col, sizeof(float) * 3);
+ }
+ else if (flags & ImGuiColorEditFlags_InputHSV)
+ {
+ col[0] = H;
+ col[1] = S;
+ col[2] = V;
+ }
+ }
// R,G,B and H,S,V slider color editor
bool value_changed_fix_hue_wrap = false;
if ((flags & ImGuiColorEditFlags_NoInputs) == 0)
{
PushItemWidth((alpha_bar ? bar1_pos_x : bar0_pos_x) + bars_width - picker_pos.x);
- ImGuiColorEditFlags sub_flags_to_forward = ImGuiColorEditFlags__DataTypeMask | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoOptions | ImGuiColorEditFlags_NoSmallPreview | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf;
+ ImGuiColorEditFlags sub_flags_to_forward = ImGuiColorEditFlags__DataTypeMask | ImGuiColorEditFlags__InputMask | ImGuiColorEditFlags_HDR | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_NoOptions | ImGuiColorEditFlags_NoSmallPreview | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf;
ImGuiColorEditFlags sub_flags = (flags & sub_flags_to_forward) | ImGuiColorEditFlags_NoPicker;
- if (flags & ImGuiColorEditFlags_RGB || (flags & ImGuiColorEditFlags__InputsMask) == 0)
- if (ColorEdit4("##rgb", col, sub_flags | ImGuiColorEditFlags_RGB))
+ if (flags & ImGuiColorEditFlags_DisplayRGB || (flags & ImGuiColorEditFlags__DisplayMask) == 0)
+ if (ColorEdit4("##rgb", col, sub_flags | ImGuiColorEditFlags_DisplayRGB))
{
// FIXME: Hackily differenciating using the DragInt (ActiveId != 0 && !ActiveIdAllowOverlap) vs. using the InputText or DropTarget.
// For the later we don't want to run the hue-wrap canceling code. If you are well versed in HSV picker please provide your input! (See #2050)
value_changed_fix_hue_wrap = (g.ActiveId != 0 && !g.ActiveIdAllowOverlap);
value_changed = true;
}
- if (flags & ImGuiColorEditFlags_HSV || (flags & ImGuiColorEditFlags__InputsMask) == 0)
- value_changed |= ColorEdit4("##hsv", col, sub_flags | ImGuiColorEditFlags_HSV);
- if (flags & ImGuiColorEditFlags_HEX || (flags & ImGuiColorEditFlags__InputsMask) == 0)
- value_changed |= ColorEdit4("##hex", col, sub_flags | ImGuiColorEditFlags_HEX);
+ if (flags & ImGuiColorEditFlags_DisplayHSV || (flags & ImGuiColorEditFlags__DisplayMask) == 0)
+ value_changed |= ColorEdit4("##hsv", col, sub_flags | ImGuiColorEditFlags_DisplayHSV);
+ if (flags & ImGuiColorEditFlags_DisplayHex || (flags & ImGuiColorEditFlags__DisplayMask) == 0)
+ value_changed |= ColorEdit4("##hex", col, sub_flags | ImGuiColorEditFlags_DisplayHex);
PopItemWidth();
}
// Try to cancel hue wrap (after ColorEdit4 call), if any
- if (value_changed_fix_hue_wrap)
+ if (value_changed_fix_hue_wrap && (flags & ImGuiColorEditFlags_InputRGB))
{
float new_H, new_S, new_V;
ColorConvertRGBtoHSV(col[0], col[1], col[2], new_H, new_S, new_V);
@@ -4265,17 +4791,47 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
}
}
- ImVec4 hue_color_f(1, 1, 1, 1); ColorConvertHSVtoRGB(H, 1, 1, hue_color_f.x, hue_color_f.y, hue_color_f.z);
+ if (value_changed)
+ {
+ if (flags & ImGuiColorEditFlags_InputRGB)
+ {
+ R = col[0];
+ G = col[1];
+ B = col[2];
+ ColorConvertRGBtoHSV(R, G, B, H, S, V);
+ if (memcmp(g.ColorEditLastColor, col, sizeof(float) * 3) == 0) // Fix local Hue as display below will use it immediately.
+ {
+ if (S == 0)
+ H = g.ColorEditLastHue;
+ if (V == 0)
+ S = g.ColorEditLastSat;
+ }
+ }
+ else if (flags & ImGuiColorEditFlags_InputHSV)
+ {
+ H = col[0];
+ S = col[1];
+ V = col[2];
+ ColorConvertHSVtoRGB(H, S, V, R, G, B);
+ }
+ }
+
+ const int style_alpha8 = IM_F32_TO_INT8_SAT(style.Alpha);
+ const ImU32 col_black = IM_COL32(0,0,0,style_alpha8);
+ const ImU32 col_white = IM_COL32(255,255,255,style_alpha8);
+ const ImU32 col_midgrey = IM_COL32(128,128,128,style_alpha8);
+ const ImU32 col_hues[6 + 1] = { IM_COL32(255,0,0,style_alpha8), IM_COL32(255,255,0,style_alpha8), IM_COL32(0,255,0,style_alpha8), IM_COL32(0,255,255,style_alpha8), IM_COL32(0,0,255,style_alpha8), IM_COL32(255,0,255,style_alpha8), IM_COL32(255,0,0,style_alpha8) };
+
+ ImVec4 hue_color_f(1, 1, 1, style.Alpha); ColorConvertHSVtoRGB(H, 1, 1, hue_color_f.x, hue_color_f.y, hue_color_f.z);
ImU32 hue_color32 = ColorConvertFloat4ToU32(hue_color_f);
- ImU32 col32_no_alpha = ColorConvertFloat4ToU32(ImVec4(col[0], col[1], col[2], 1.0f));
+ ImU32 user_col32_striped_of_alpha = ColorConvertFloat4ToU32(ImVec4(R, G, B, style.Alpha)); // Important: this is still including the main rendering/style alpha!!
- const ImU32 hue_colors[6+1] = { IM_COL32(255,0,0,255), IM_COL32(255,255,0,255), IM_COL32(0,255,0,255), IM_COL32(0,255,255,255), IM_COL32(0,0,255,255), IM_COL32(255,0,255,255), IM_COL32(255,0,0,255) };
ImVec2 sv_cursor_pos;
if (flags & ImGuiColorEditFlags_PickerHueWheel)
{
// Render Hue Wheel
- const float aeps = 1.5f / wheel_r_outer; // Half a pixel arc length in radians (2pi cancels out).
+ const float aeps = 0.5f / wheel_r_outer; // Half a pixel arc length in radians (2pi cancels out).
const int segment_per_arc = ImMax(4, (int)wheel_r_outer / 12);
for (int n = 0; n < 6; n++)
{
@@ -4283,13 +4839,13 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
const float a1 = (n+1.0f)/6.0f * 2.0f * IM_PI + aeps;
const int vert_start_idx = draw_list->VtxBuffer.Size;
draw_list->PathArcTo(wheel_center, (wheel_r_inner + wheel_r_outer)*0.5f, a0, a1, segment_per_arc);
- draw_list->PathStroke(IM_COL32_WHITE, false, wheel_thickness);
+ draw_list->PathStroke(col_white, false, wheel_thickness);
const int vert_end_idx = draw_list->VtxBuffer.Size;
// Paint colors over existing vertices
ImVec2 gradient_p0(wheel_center.x + ImCos(a0) * wheel_r_inner, wheel_center.y + ImSin(a0) * wheel_r_inner);
ImVec2 gradient_p1(wheel_center.x + ImCos(a1) * wheel_r_inner, wheel_center.y + ImSin(a1) * wheel_r_inner);
- ShadeVertsLinearColorGradientKeepAlpha(draw_list, vert_start_idx, vert_end_idx, gradient_p0, gradient_p1, hue_colors[n], hue_colors[n+1]);
+ ShadeVertsLinearColorGradientKeepAlpha(draw_list, vert_start_idx, vert_end_idx, gradient_p0, gradient_p1, col_hues[n], col_hues[n+1]);
}
// Render Cursor + preview on Hue Wheel
@@ -4299,8 +4855,8 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
float hue_cursor_rad = value_changed_h ? wheel_thickness * 0.65f : wheel_thickness * 0.55f;
int hue_cursor_segments = ImClamp((int)(hue_cursor_rad / 1.4f), 9, 32);
draw_list->AddCircleFilled(hue_cursor_pos, hue_cursor_rad, hue_color32, hue_cursor_segments);
- draw_list->AddCircle(hue_cursor_pos, hue_cursor_rad+1, IM_COL32(128,128,128,255), hue_cursor_segments);
- draw_list->AddCircle(hue_cursor_pos, hue_cursor_rad, IM_COL32_WHITE, hue_cursor_segments);
+ draw_list->AddCircle(hue_cursor_pos, hue_cursor_rad+1, col_midgrey, hue_cursor_segments);
+ draw_list->AddCircle(hue_cursor_pos, hue_cursor_rad, col_white, hue_cursor_segments);
// Render SV triangle (rotated according to hue)
ImVec2 tra = wheel_center + ImRotate(triangle_pa, cos_hue_angle, sin_hue_angle);
@@ -4310,46 +4866,46 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
draw_list->PrimReserve(6, 6);
draw_list->PrimVtx(tra, uv_white, hue_color32);
draw_list->PrimVtx(trb, uv_white, hue_color32);
- draw_list->PrimVtx(trc, uv_white, IM_COL32_WHITE);
- draw_list->PrimVtx(tra, uv_white, IM_COL32_BLACK_TRANS);
- draw_list->PrimVtx(trb, uv_white, IM_COL32_BLACK);
- draw_list->PrimVtx(trc, uv_white, IM_COL32_BLACK_TRANS);
- draw_list->AddTriangle(tra, trb, trc, IM_COL32(128,128,128,255), 1.5f);
+ draw_list->PrimVtx(trc, uv_white, col_white);
+ draw_list->PrimVtx(tra, uv_white, 0);
+ draw_list->PrimVtx(trb, uv_white, col_black);
+ draw_list->PrimVtx(trc, uv_white, 0);
+ draw_list->AddTriangle(tra, trb, trc, col_midgrey, 1.5f);
sv_cursor_pos = ImLerp(ImLerp(trc, tra, ImSaturate(S)), trb, ImSaturate(1 - V));
}
else if (flags & ImGuiColorEditFlags_PickerHueBar)
{
// Render SV Square
- draw_list->AddRectFilledMultiColor(picker_pos, picker_pos + ImVec2(sv_picker_size,sv_picker_size), IM_COL32_WHITE, hue_color32, hue_color32, IM_COL32_WHITE);
- draw_list->AddRectFilledMultiColor(picker_pos, picker_pos + ImVec2(sv_picker_size,sv_picker_size), IM_COL32_BLACK_TRANS, IM_COL32_BLACK_TRANS, IM_COL32_BLACK, IM_COL32_BLACK);
- RenderFrameBorder(picker_pos, picker_pos + ImVec2(sv_picker_size,sv_picker_size), 0.0f);
- sv_cursor_pos.x = ImClamp((float)(int)(picker_pos.x + ImSaturate(S) * sv_picker_size + 0.5f), picker_pos.x + 2, picker_pos.x + sv_picker_size - 2); // Sneakily prevent the circle to stick out too much
- sv_cursor_pos.y = ImClamp((float)(int)(picker_pos.y + ImSaturate(1 - V) * sv_picker_size + 0.5f), picker_pos.y + 2, picker_pos.y + sv_picker_size - 2);
+ draw_list->AddRectFilledMultiColor(picker_pos, picker_pos + ImVec2(sv_picker_size, sv_picker_size), col_white, hue_color32, hue_color32, col_white);
+ draw_list->AddRectFilledMultiColor(picker_pos, picker_pos + ImVec2(sv_picker_size, sv_picker_size), 0, 0, col_black, col_black);
+ RenderFrameBorder(picker_pos, picker_pos + ImVec2(sv_picker_size, sv_picker_size), 0.0f);
+ sv_cursor_pos.x = ImClamp(IM_ROUND(picker_pos.x + ImSaturate(S) * sv_picker_size), picker_pos.x + 2, picker_pos.x + sv_picker_size - 2); // Sneakily prevent the circle to stick out too much
+ sv_cursor_pos.y = ImClamp(IM_ROUND(picker_pos.y + ImSaturate(1 - V) * sv_picker_size), picker_pos.y + 2, picker_pos.y + sv_picker_size - 2);
// Render Hue Bar
for (int i = 0; i < 6; ++i)
- draw_list->AddRectFilledMultiColor(ImVec2(bar0_pos_x, picker_pos.y + i * (sv_picker_size / 6)), ImVec2(bar0_pos_x + bars_width, picker_pos.y + (i + 1) * (sv_picker_size / 6)), hue_colors[i], hue_colors[i], hue_colors[i + 1], hue_colors[i + 1]);
- float bar0_line_y = (float)(int)(picker_pos.y + H * sv_picker_size + 0.5f);
+ draw_list->AddRectFilledMultiColor(ImVec2(bar0_pos_x, picker_pos.y + i * (sv_picker_size / 6)), ImVec2(bar0_pos_x + bars_width, picker_pos.y + (i + 1) * (sv_picker_size / 6)), col_hues[i], col_hues[i], col_hues[i + 1], col_hues[i + 1]);
+ float bar0_line_y = IM_ROUND(picker_pos.y + H * sv_picker_size);
RenderFrameBorder(ImVec2(bar0_pos_x, picker_pos.y), ImVec2(bar0_pos_x + bars_width, picker_pos.y + sv_picker_size), 0.0f);
- RenderArrowsForVerticalBar(draw_list, ImVec2(bar0_pos_x - 1, bar0_line_y), ImVec2(bars_triangles_half_sz + 1, bars_triangles_half_sz), bars_width + 2.0f);
+ RenderArrowsForVerticalBar(draw_list, ImVec2(bar0_pos_x - 1, bar0_line_y), ImVec2(bars_triangles_half_sz + 1, bars_triangles_half_sz), bars_width + 2.0f, style.Alpha);
}
// Render cursor/preview circle (clamp S/V within 0..1 range because floating points colors may lead HSV values to be out of range)
float sv_cursor_rad = value_changed_sv ? 10.0f : 6.0f;
- draw_list->AddCircleFilled(sv_cursor_pos, sv_cursor_rad, col32_no_alpha, 12);
- draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad+1, IM_COL32(128,128,128,255), 12);
- draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad, IM_COL32_WHITE, 12);
+ draw_list->AddCircleFilled(sv_cursor_pos, sv_cursor_rad, user_col32_striped_of_alpha, 12);
+ draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad+1, col_midgrey, 12);
+ draw_list->AddCircle(sv_cursor_pos, sv_cursor_rad, col_white, 12);
// Render alpha bar
if (alpha_bar)
{
float alpha = ImSaturate(col[3]);
ImRect bar1_bb(bar1_pos_x, picker_pos.y, bar1_pos_x + bars_width, picker_pos.y + sv_picker_size);
- RenderColorRectWithAlphaCheckerboard(bar1_bb.Min, bar1_bb.Max, IM_COL32(0,0,0,0), bar1_bb.GetWidth() / 2.0f, ImVec2(0.0f, 0.0f));
- draw_list->AddRectFilledMultiColor(bar1_bb.Min, bar1_bb.Max, col32_no_alpha, col32_no_alpha, col32_no_alpha & ~IM_COL32_A_MASK, col32_no_alpha & ~IM_COL32_A_MASK);
- float bar1_line_y = (float)(int)(picker_pos.y + (1.0f - alpha) * sv_picker_size + 0.5f);
+ RenderColorRectWithAlphaCheckerboard(bar1_bb.Min, bar1_bb.Max, 0, bar1_bb.GetWidth() / 2.0f, ImVec2(0.0f, 0.0f));
+ draw_list->AddRectFilledMultiColor(bar1_bb.Min, bar1_bb.Max, user_col32_striped_of_alpha, user_col32_striped_of_alpha, user_col32_striped_of_alpha & ~IM_COL32_A_MASK, user_col32_striped_of_alpha & ~IM_COL32_A_MASK);
+ float bar1_line_y = IM_ROUND(picker_pos.y + (1.0f - alpha) * sv_picker_size);
RenderFrameBorder(bar1_bb.Min, bar1_bb.Max, 0.0f);
- RenderArrowsForVerticalBar(draw_list, ImVec2(bar1_pos_x - 1, bar1_line_y), ImVec2(bars_triangles_half_sz + 1, bars_triangles_half_sz), bars_width + 2.0f);
+ RenderArrowsForVerticalBar(draw_list, ImVec2(bar1_pos_x - 1, bar1_line_y), ImVec2(bars_triangles_half_sz + 1, bars_triangles_half_sz), bars_width + 2.0f, style.Alpha);
}
EndGroup();
@@ -4367,6 +4923,7 @@ bool ImGui::ColorPicker4(const char* label, float col[4], ImGuiColorEditFlags fl
// A little colored square. Return true when clicked.
// FIXME: May want to display/ignore the alpha component in the color display? Yet show it in the tooltip.
// 'desc_id' is not called 'label' because we don't display it next to the button, but only in the tooltip.
+// Note that 'col' may be encoded in HSV if ImGuiColorEditFlags_InputHSV is set.
bool ImGui::ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFlags flags, ImVec2 size)
{
ImGuiWindow* window = GetCurrentWindow();
@@ -4391,22 +4948,26 @@ bool ImGui::ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFl
if (flags & ImGuiColorEditFlags_NoAlpha)
flags &= ~(ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf);
- ImVec4 col_without_alpha(col.x, col.y, col.z, 1.0f);
+ ImVec4 col_rgb = col;
+ if (flags & ImGuiColorEditFlags_InputHSV)
+ ColorConvertHSVtoRGB(col_rgb.x, col_rgb.y, col_rgb.z, col_rgb.x, col_rgb.y, col_rgb.z);
+
+ ImVec4 col_rgb_without_alpha(col_rgb.x, col_rgb.y, col_rgb.z, 1.0f);
float grid_step = ImMin(size.x, size.y) / 2.99f;
float rounding = ImMin(g.Style.FrameRounding, grid_step * 0.5f);
ImRect bb_inner = bb;
float off = -0.75f; // The border (using Col_FrameBg) tends to look off when color is near-opaque and rounding is enabled. This offset seemed like a good middle ground to reduce those artifacts.
bb_inner.Expand(off);
- if ((flags & ImGuiColorEditFlags_AlphaPreviewHalf) && col.w < 1.0f)
+ if ((flags & ImGuiColorEditFlags_AlphaPreviewHalf) && col_rgb.w < 1.0f)
{
- float mid_x = (float)(int)((bb_inner.Min.x + bb_inner.Max.x) * 0.5f + 0.5f);
- RenderColorRectWithAlphaCheckerboard(ImVec2(bb_inner.Min.x + grid_step, bb_inner.Min.y), bb_inner.Max, GetColorU32(col), grid_step, ImVec2(-grid_step + off, off), rounding, ImDrawCornerFlags_TopRight| ImDrawCornerFlags_BotRight);
- window->DrawList->AddRectFilled(bb_inner.Min, ImVec2(mid_x, bb_inner.Max.y), GetColorU32(col_without_alpha), rounding, ImDrawCornerFlags_TopLeft|ImDrawCornerFlags_BotLeft);
+ float mid_x = IM_ROUND((bb_inner.Min.x + bb_inner.Max.x) * 0.5f);
+ RenderColorRectWithAlphaCheckerboard(ImVec2(bb_inner.Min.x + grid_step, bb_inner.Min.y), bb_inner.Max, GetColorU32(col_rgb), grid_step, ImVec2(-grid_step + off, off), rounding, ImDrawCornerFlags_TopRight| ImDrawCornerFlags_BotRight);
+ window->DrawList->AddRectFilled(bb_inner.Min, ImVec2(mid_x, bb_inner.Max.y), GetColorU32(col_rgb_without_alpha), rounding, ImDrawCornerFlags_TopLeft|ImDrawCornerFlags_BotLeft);
}
else
{
// Because GetColorU32() multiplies by the global style Alpha and we don't want to display a checkerboard if the source code had no alpha
- ImVec4 col_source = (flags & ImGuiColorEditFlags_AlphaPreview) ? col : col_without_alpha;
+ ImVec4 col_source = (flags & ImGuiColorEditFlags_AlphaPreview) ? col_rgb : col_rgb_without_alpha;
if (col_source.w < 1.0f)
RenderColorRectWithAlphaCheckerboard(bb_inner.Min, bb_inner.Max, GetColorU32(col_source), grid_step, ImVec2(off, off), rounding);
else
@@ -4423,37 +4984,38 @@ bool ImGui::ColorButton(const char* desc_id, const ImVec4& col, ImGuiColorEditFl
if (g.ActiveId == id && !(flags & ImGuiColorEditFlags_NoDragDrop) && BeginDragDropSource())
{
if (flags & ImGuiColorEditFlags_NoAlpha)
- SetDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F, &col, sizeof(float) * 3, ImGuiCond_Once);
+ SetDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_3F, &col_rgb, sizeof(float) * 3, ImGuiCond_Once);
else
- SetDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F, &col, sizeof(float) * 4, ImGuiCond_Once);
+ SetDragDropPayload(IMGUI_PAYLOAD_TYPE_COLOR_4F, &col_rgb, sizeof(float) * 4, ImGuiCond_Once);
ColorButton(desc_id, col, flags);
SameLine();
- TextUnformatted("Color");
+ TextEx("Color");
EndDragDropSource();
}
// Tooltip
if (!(flags & ImGuiColorEditFlags_NoTooltip) && hovered)
- ColorTooltip(desc_id, &col.x, flags & (ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf));
-
- if (pressed)
- MarkItemEdited(id);
+ ColorTooltip(desc_id, &col.x, flags & (ImGuiColorEditFlags__InputMask | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf));
return pressed;
}
+// Initialize/override default color options
void ImGui::SetColorEditOptions(ImGuiColorEditFlags flags)
{
ImGuiContext& g = *GImGui;
- if ((flags & ImGuiColorEditFlags__InputsMask) == 0)
- flags |= ImGuiColorEditFlags__OptionsDefault & ImGuiColorEditFlags__InputsMask;
+ if ((flags & ImGuiColorEditFlags__DisplayMask) == 0)
+ flags |= ImGuiColorEditFlags__OptionsDefault & ImGuiColorEditFlags__DisplayMask;
if ((flags & ImGuiColorEditFlags__DataTypeMask) == 0)
flags |= ImGuiColorEditFlags__OptionsDefault & ImGuiColorEditFlags__DataTypeMask;
if ((flags & ImGuiColorEditFlags__PickerMask) == 0)
flags |= ImGuiColorEditFlags__OptionsDefault & ImGuiColorEditFlags__PickerMask;
- IM_ASSERT(ImIsPowerOfTwo((int)(flags & ImGuiColorEditFlags__InputsMask))); // Check only 1 option is selected
- IM_ASSERT(ImIsPowerOfTwo((int)(flags & ImGuiColorEditFlags__DataTypeMask))); // Check only 1 option is selected
- IM_ASSERT(ImIsPowerOfTwo((int)(flags & ImGuiColorEditFlags__PickerMask))); // Check only 1 option is selected
+ if ((flags & ImGuiColorEditFlags__InputMask) == 0)
+ flags |= ImGuiColorEditFlags__OptionsDefault & ImGuiColorEditFlags__InputMask;
+ IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags__DisplayMask)); // Check only 1 option is selected
+ IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags__DataTypeMask)); // Check only 1 option is selected
+ IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags__PickerMask)); // Check only 1 option is selected
+ IM_ASSERT(ImIsPowerOfTwo(flags & ImGuiColorEditFlags__InputMask)); // Check only 1 option is selected
g.ColorEditOptions = flags;
}
@@ -4462,29 +5024,39 @@ void ImGui::ColorTooltip(const char* text, const float* col, ImGuiColorEditFlags
{
ImGuiContext& g = *GImGui;
- int cr = IM_F32_TO_INT8_SAT(col[0]), cg = IM_F32_TO_INT8_SAT(col[1]), cb = IM_F32_TO_INT8_SAT(col[2]), ca = (flags & ImGuiColorEditFlags_NoAlpha) ? 255 : IM_F32_TO_INT8_SAT(col[3]);
- BeginTooltipEx(0, true);
-
+ BeginTooltipEx(0, ImGuiTooltipFlags_OverridePreviousTooltip);
const char* text_end = text ? FindRenderedTextEnd(text, NULL) : text;
if (text_end > text)
{
- TextUnformatted(text, text_end);
+ TextEx(text, text_end);
Separator();
}
ImVec2 sz(g.FontSize * 3 + g.Style.FramePadding.y * 2, g.FontSize * 3 + g.Style.FramePadding.y * 2);
- ColorButton("##preview", ImVec4(col[0], col[1], col[2], col[3]), (flags & (ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf)) | ImGuiColorEditFlags_NoTooltip, sz);
+ ImVec4 cf(col[0], col[1], col[2], (flags & ImGuiColorEditFlags_NoAlpha) ? 1.0f : col[3]);
+ int cr = IM_F32_TO_INT8_SAT(col[0]), cg = IM_F32_TO_INT8_SAT(col[1]), cb = IM_F32_TO_INT8_SAT(col[2]), ca = (flags & ImGuiColorEditFlags_NoAlpha) ? 255 : IM_F32_TO_INT8_SAT(col[3]);
+ ColorButton("##preview", cf, (flags & (ImGuiColorEditFlags__InputMask | ImGuiColorEditFlags_NoAlpha | ImGuiColorEditFlags_AlphaPreview | ImGuiColorEditFlags_AlphaPreviewHalf)) | ImGuiColorEditFlags_NoTooltip, sz);
SameLine();
- if (flags & ImGuiColorEditFlags_NoAlpha)
- Text("#%02X%02X%02X\nR: %d, G: %d, B: %d\n(%.3f, %.3f, %.3f)", cr, cg, cb, cr, cg, cb, col[0], col[1], col[2]);
- else
- Text("#%02X%02X%02X%02X\nR:%d, G:%d, B:%d, A:%d\n(%.3f, %.3f, %.3f, %.3f)", cr, cg, cb, ca, cr, cg, cb, ca, col[0], col[1], col[2], col[3]);
+ if ((flags & ImGuiColorEditFlags_InputRGB) || !(flags & ImGuiColorEditFlags__InputMask))
+ {
+ if (flags & ImGuiColorEditFlags_NoAlpha)
+ Text("#%02X%02X%02X\nR: %d, G: %d, B: %d\n(%.3f, %.3f, %.3f)", cr, cg, cb, cr, cg, cb, col[0], col[1], col[2]);
+ else
+ Text("#%02X%02X%02X%02X\nR:%d, G:%d, B:%d, A:%d\n(%.3f, %.3f, %.3f, %.3f)", cr, cg, cb, ca, cr, cg, cb, ca, col[0], col[1], col[2], col[3]);
+ }
+ else if (flags & ImGuiColorEditFlags_InputHSV)
+ {
+ if (flags & ImGuiColorEditFlags_NoAlpha)
+ Text("H: %.3f, S: %.3f, V: %.3f", col[0], col[1], col[2]);
+ else
+ Text("H: %.3f, S: %.3f, V: %.3f, A: %.3f", col[0], col[1], col[2], col[3]);
+ }
EndTooltip();
}
void ImGui::ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags)
{
- bool allow_opt_inputs = !(flags & ImGuiColorEditFlags__InputsMask);
+ bool allow_opt_inputs = !(flags & ImGuiColorEditFlags__DisplayMask);
bool allow_opt_datatype = !(flags & ImGuiColorEditFlags__DataTypeMask);
if ((!allow_opt_inputs && !allow_opt_datatype) || !BeginPopup("context"))
return;
@@ -4492,9 +5064,9 @@ void ImGui::ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags)
ImGuiColorEditFlags opts = g.ColorEditOptions;
if (allow_opt_inputs)
{
- if (RadioButton("RGB", (opts & ImGuiColorEditFlags_RGB) != 0)) opts = (opts & ~ImGuiColorEditFlags__InputsMask) | ImGuiColorEditFlags_RGB;
- if (RadioButton("HSV", (opts & ImGuiColorEditFlags_HSV) != 0)) opts = (opts & ~ImGuiColorEditFlags__InputsMask) | ImGuiColorEditFlags_HSV;
- if (RadioButton("HEX", (opts & ImGuiColorEditFlags_HEX) != 0)) opts = (opts & ~ImGuiColorEditFlags__InputsMask) | ImGuiColorEditFlags_HEX;
+ if (RadioButton("RGB", (opts & ImGuiColorEditFlags_DisplayRGB) != 0)) opts = (opts & ~ImGuiColorEditFlags__DisplayMask) | ImGuiColorEditFlags_DisplayRGB;
+ if (RadioButton("HSV", (opts & ImGuiColorEditFlags_DisplayHSV) != 0)) opts = (opts & ~ImGuiColorEditFlags__DisplayMask) | ImGuiColorEditFlags_DisplayHSV;
+ if (RadioButton("Hex", (opts & ImGuiColorEditFlags_DisplayHex) != 0)) opts = (opts & ~ImGuiColorEditFlags__DisplayMask) | ImGuiColorEditFlags_DisplayHex;
}
if (allow_opt_datatype)
{
@@ -4517,12 +5089,15 @@ void ImGui::ColorEditOptionsPopup(const float* col, ImGuiColorEditFlags flags)
ImFormatString(buf, IM_ARRAYSIZE(buf), "(%d,%d,%d,%d)", cr, cg, cb, ca);
if (Selectable(buf))
SetClipboardText(buf);
- if (flags & ImGuiColorEditFlags_NoAlpha)
- ImFormatString(buf, IM_ARRAYSIZE(buf), "0x%02X%02X%02X", cr, cg, cb);
- else
- ImFormatString(buf, IM_ARRAYSIZE(buf), "0x%02X%02X%02X%02X", cr, cg, cb, ca);
+ ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X", cr, cg, cb);
if (Selectable(buf))
SetClipboardText(buf);
+ if (!(flags & ImGuiColorEditFlags_NoAlpha))
+ {
+ ImFormatString(buf, IM_ARRAYSIZE(buf), "#%02X%02X%02X%02X", cr, cg, cb, ca);
+ if (Selectable(buf))
+ SetClipboardText(buf);
+ }
EndPopup();
}
@@ -4554,7 +5129,7 @@ void ImGui::ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags fl
g.ColorEditOptions = (g.ColorEditOptions & ~ImGuiColorEditFlags__PickerMask) | (picker_flags & ImGuiColorEditFlags__PickerMask);
SetCursorScreenPos(backup_pos);
ImVec4 dummy_ref_col;
- memcpy(&dummy_ref_col.x, ref_col, sizeof(float) * (picker_flags & ImGuiColorEditFlags_NoAlpha ? 3 : 4));
+ memcpy(&dummy_ref_col, ref_col, sizeof(float) * ((picker_flags & ImGuiColorEditFlags_NoAlpha) ? 3 : 4));
ColorPicker4("##dummypicker", &dummy_ref_col.x, picker_flags);
PopID();
}
@@ -4575,12 +5150,11 @@ void ImGui::ColorPickerOptionsPopup(const float* ref_col, ImGuiColorEditFlags fl
// - TreeNodeV()
// - TreeNodeEx()
// - TreeNodeExV()
-// - TreeNodeBehavior() [Internal]
+// - TreeNodeBehavior() [Internal]
// - TreePush()
// - TreePop()
-// - TreeAdvanceToLabelPos()
// - GetTreeNodeToLabelSpacing()
-// - SetNextTreeNodeOpen()
+// - SetNextItemOpen()
// - CollapsingHeader()
//-------------------------------------------------------------------------
@@ -4674,17 +5248,17 @@ bool ImGui::TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags)
if (flags & ImGuiTreeNodeFlags_Leaf)
return true;
- // We only write to the tree storage if the user clicks (or explicitly use SetNextTreeNode*** functions)
+ // We only write to the tree storage if the user clicks (or explicitly use the SetNextItemOpen function)
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
ImGuiStorage* storage = window->DC.StateStorage;
bool is_open;
- if (g.NextTreeNodeOpenCond != 0)
+ if (g.NextItemData.Flags & ImGuiNextItemDataFlags_HasOpen)
{
- if (g.NextTreeNodeOpenCond & ImGuiCond_Always)
+ if (g.NextItemData.OpenCond & ImGuiCond_Always)
{
- is_open = g.NextTreeNodeOpenVal;
+ is_open = g.NextItemData.OpenVal;
storage->SetInt(id, is_open);
}
else
@@ -4693,7 +5267,7 @@ bool ImGui::TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags)
const int stored_value = storage->GetInt(id, -1);
if (stored_value == -1)
{
- is_open = g.NextTreeNodeOpenVal;
+ is_open = g.NextItemData.OpenVal;
storage->SetInt(id, is_open);
}
else
@@ -4701,7 +5275,6 @@ bool ImGui::TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags)
is_open = stored_value != 0;
}
}
- g.NextTreeNodeOpenCond = 0;
}
else
{
@@ -4710,7 +5283,7 @@ bool ImGui::TreeNodeBehaviorIsOpen(ImGuiID id, ImGuiTreeNodeFlags flags)
// When logging is enabled, we automatically expand tree nodes (but *NOT* collapsing headers.. seems like sensible behavior).
// NB- If we are above max depth we still allow manually opened nodes to be logged.
- if (g.LogEnabled && !(flags & ImGuiTreeNodeFlags_NoAutoOpenOnLog) && window->DC.TreeDepth < g.LogAutoExpandMaxDepth)
+ if (g.LogEnabled && !(flags & ImGuiTreeNodeFlags_NoAutoOpenOnLog) && (window->DC.TreeDepth - g.LogDepthRef) < g.LogDepthToExpand)
is_open = true;
return is_open;
@@ -4725,37 +5298,45 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l
ImGuiContext& g = *GImGui;
const ImGuiStyle& style = g.Style;
const bool display_frame = (flags & ImGuiTreeNodeFlags_Framed) != 0;
- const ImVec2 padding = (display_frame || (flags & ImGuiTreeNodeFlags_FramePadding)) ? style.FramePadding : ImVec2(style.FramePadding.x, 0.0f);
+ const ImVec2 padding = (display_frame || (flags & ImGuiTreeNodeFlags_FramePadding)) ? style.FramePadding : ImVec2(style.FramePadding.x, ImMin(window->DC.CurrLineTextBaseOffset, style.FramePadding.y));
if (!label_end)
label_end = FindRenderedTextEnd(label);
const ImVec2 label_size = CalcTextSize(label, label_end, false);
// We vertically grow up to current line height up the typical widget height.
- const float text_base_offset_y = ImMax(padding.y, window->DC.CurrentLineTextBaseOffset); // Latch before ItemSize changes it
- const float frame_height = ImMax(ImMin(window->DC.CurrentLineSize.y, g.FontSize + style.FramePadding.y*2), label_size.y + padding.y*2);
- ImRect frame_bb = ImRect(window->DC.CursorPos, ImVec2(window->Pos.x + GetContentRegionMax().x, window->DC.CursorPos.y + frame_height));
+ const float frame_height = ImMax(ImMin(window->DC.CurrLineSize.y, g.FontSize + style.FramePadding.y*2), label_size.y + padding.y*2);
+ ImRect frame_bb;
+ frame_bb.Min.x = (flags & ImGuiTreeNodeFlags_SpanFullWidth) ? window->WorkRect.Min.x : window->DC.CursorPos.x;
+ frame_bb.Min.y = window->DC.CursorPos.y;
+ frame_bb.Max.x = window->WorkRect.Max.x;
+ frame_bb.Max.y = window->DC.CursorPos.y + frame_height;
if (display_frame)
{
- // Framed header expand a little outside the default padding
- frame_bb.Min.x -= (float)(int)(window->WindowPadding.x*0.5f) - 1;
- frame_bb.Max.x += (float)(int)(window->WindowPadding.x*0.5f) - 1;
+ // Framed header expand a little outside the default padding, to the edge of InnerClipRect
+ // (FIXME: May remove this at some point and make InnerClipRect align with WindowPadding.x instead of WindowPadding.x*0.5f)
+ frame_bb.Min.x -= IM_FLOOR(window->WindowPadding.x * 0.5f - 1.0f);
+ frame_bb.Max.x += IM_FLOOR(window->WindowPadding.x * 0.5f);
}
- const float text_offset_x = (g.FontSize + (display_frame ? padding.x*3 : padding.x*2)); // Collapser arrow width + Spacing
- const float text_width = g.FontSize + (label_size.x > 0.0f ? label_size.x + padding.x*2 : 0.0f); // Include collapser
- ItemSize(ImVec2(text_width, frame_height), text_base_offset_y);
+ const float text_offset_x = g.FontSize + (display_frame ? padding.x*3 : padding.x*2); // Collapser arrow width + Spacing
+ const float text_offset_y = ImMax(padding.y, window->DC.CurrLineTextBaseOffset); // Latch before ItemSize changes it
+ const float text_width = g.FontSize + (label_size.x > 0.0f ? label_size.x + padding.x*2 : 0.0f); // Include collapser
+ ImVec2 text_pos(window->DC.CursorPos.x + text_offset_x, window->DC.CursorPos.y + text_offset_y);
+ ItemSize(ImVec2(text_width, frame_height), padding.y);
// For regular tree nodes, we arbitrary allow to click past 2 worth of ItemSpacing
- // (Ideally we'd want to add a flag for the user to specify if we want the hit test to be done up to the right side of the content or not)
- const ImRect interact_bb = display_frame ? frame_bb : ImRect(frame_bb.Min.x, frame_bb.Min.y, frame_bb.Min.x + text_width + style.ItemSpacing.x*2, frame_bb.Max.y);
- bool is_open = TreeNodeBehaviorIsOpen(id, flags);
+ ImRect interact_bb = frame_bb;
+ if (!display_frame && (flags & (ImGuiTreeNodeFlags_SpanAvailWidth | ImGuiTreeNodeFlags_SpanFullWidth)) == 0)
+ interact_bb.Max.x = frame_bb.Min.x + text_width + style.ItemSpacing.x * 2.0f;
// Store a flag for the current depth to tell if we will allow closing this node when navigating one of its child.
// For this purpose we essentially compare if g.NavIdIsAlive went from 0 to 1 between TreeNode() and TreePop().
// This is currently only support 32 level deep and we are fine with (1 << Depth) overflowing into a zero.
+ const bool is_leaf = (flags & ImGuiTreeNodeFlags_Leaf) != 0;
+ bool is_open = TreeNodeBehaviorIsOpen(id, flags);
if (is_open && !g.NavIdIsAlive && (flags & ImGuiTreeNodeFlags_NavLeftJumpsBackHere) && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen))
- window->DC.TreeDepthMayJumpToParentOnPop |= (1 << window->DC.TreeDepth);
+ window->DC.TreeJumpToParentOnPopMask |= (1 << window->DC.TreeDepth);
bool item_add = ItemAdd(interact_bb, id);
window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_HasDisplayRect;
@@ -4764,32 +5345,51 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l
if (!item_add)
{
if (is_open && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen))
- TreePushRawID(id);
+ TreePushOverrideID(id);
+ IMGUI_TEST_ENGINE_ITEM_INFO(window->DC.LastItemId, label, window->DC.ItemFlags | (is_leaf ? 0 : ImGuiItemStatusFlags_Openable) | (is_open ? ImGuiItemStatusFlags_Opened : 0));
return is_open;
}
// Flags that affects opening behavior:
- // - 0(default) ..................... single-click anywhere to open
+ // - 0 (default) .................... single-click anywhere to open
// - OpenOnDoubleClick .............. double-click anywhere to open
// - OpenOnArrow .................... single-click on arrow to open
// - OpenOnDoubleClick|OpenOnArrow .. single-click on arrow or double-click anywhere to open
- ImGuiButtonFlags button_flags = ImGuiButtonFlags_NoKeyModifiers | ((flags & ImGuiTreeNodeFlags_AllowItemOverlap) ? ImGuiButtonFlags_AllowItemOverlap : 0);
- if (!(flags & ImGuiTreeNodeFlags_Leaf))
- button_flags |= ImGuiButtonFlags_PressedOnDragDropHold;
+ ImGuiButtonFlags button_flags = 0;
+ if (flags & ImGuiTreeNodeFlags_AllowItemOverlap)
+ button_flags |= ImGuiButtonFlags_AllowItemOverlap;
if (flags & ImGuiTreeNodeFlags_OpenOnDoubleClick)
button_flags |= ImGuiButtonFlags_PressedOnDoubleClick | ((flags & ImGuiTreeNodeFlags_OpenOnArrow) ? ImGuiButtonFlags_PressedOnClickRelease : 0);
+ else
+ button_flags |= ImGuiButtonFlags_PressedOnClickRelease;
+ if (!is_leaf)
+ button_flags |= ImGuiButtonFlags_PressedOnDragDropHold;
+
+ // We allow clicking on the arrow section with keyboard modifiers held, in order to easily
+ // allow browsing a tree while preserving selection with code implementing multi-selection patterns.
+ // When clicking on the rest of the tree node we always disallow keyboard modifiers.
+ const float hit_padding_x = style.TouchExtraPadding.x;
+ const float arrow_hit_x1 = (text_pos.x - text_offset_x) - hit_padding_x;
+ const float arrow_hit_x2 = (text_pos.x - text_offset_x) + (g.FontSize + padding.x * 2.0f) + hit_padding_x;
+ if (window != g.HoveredWindow || !(g.IO.MousePos.x >= arrow_hit_x1 && g.IO.MousePos.x < arrow_hit_x2))
+ button_flags |= ImGuiButtonFlags_NoKeyModifiers;
- bool hovered, held, pressed = ButtonBehavior(interact_bb, id, &hovered, &held, button_flags);
- if (!(flags & ImGuiTreeNodeFlags_Leaf))
+ bool selected = (flags & ImGuiTreeNodeFlags_Selected) != 0;
+ const bool was_selected = selected;
+
+ bool hovered, held;
+ bool pressed = ButtonBehavior(interact_bb, id, &hovered, &held, button_flags);
+ bool toggled = false;
+ if (!is_leaf)
{
- bool toggled = false;
if (pressed)
{
- toggled = !(flags & (ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick)) || (g.NavActivateId == id);
+ if ((flags & (ImGuiTreeNodeFlags_OpenOnArrow | ImGuiTreeNodeFlags_OpenOnDoubleClick)) == 0 || (g.NavActivateId == id))
+ toggled = true;
if (flags & ImGuiTreeNodeFlags_OpenOnArrow)
- toggled |= IsMouseHoveringRect(interact_bb.Min, ImVec2(interact_bb.Min.x + text_offset_x, interact_bb.Max.y)) && (!g.NavDisableMouseHover);
- if (flags & ImGuiTreeNodeFlags_OpenOnDoubleClick)
- toggled |= g.IO.MouseDoubleClicked[0];
+ toggled |= (g.IO.MousePos.x >= arrow_hit_x1 && g.IO.MousePos.x < arrow_hit_x2) && (!g.NavDisableMouseHover); // Lightweight equivalent of IsMouseHoveringRect() since ButtonBehavior() already did the job
+ if ((flags & ImGuiTreeNodeFlags_OpenOnDoubleClick) && g.IO.MouseDoubleClicked[0])
+ toggled = true;
if (g.DragDropActive && is_open) // When using Drag and Drop "hold to open" we keep the node highlighted after opening, but never close it again.
toggled = false;
}
@@ -4809,20 +5409,33 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l
{
is_open = !is_open;
window->DC.StateStorage->SetInt(id, is_open);
+ window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_ToggledOpen;
}
}
if (flags & ImGuiTreeNodeFlags_AllowItemOverlap)
SetItemAllowOverlap();
+ // In this branch, TreeNodeBehavior() cannot toggle the selection so this will never trigger.
+ if (selected != was_selected) //-V547
+ window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_ToggledSelection;
+
// Render
- const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header);
- const ImVec2 text_pos = frame_bb.Min + ImVec2(text_offset_x, text_base_offset_y);
+ const ImU32 text_col = GetColorU32(ImGuiCol_Text);
+ ImGuiNavHighlightFlags nav_highlight_flags = ImGuiNavHighlightFlags_TypeThin;
if (display_frame)
{
// Framed type
- RenderFrame(frame_bb.Min, frame_bb.Max, col, true, style.FrameRounding);
- RenderNavHighlight(frame_bb, id, ImGuiNavHighlightFlags_TypeThin);
- RenderArrow(frame_bb.Min + ImVec2(padding.x, text_base_offset_y), is_open ? ImGuiDir_Down : ImGuiDir_Right, 1.0f);
+ const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header);
+ RenderFrame(frame_bb.Min, frame_bb.Max, bg_col, true, style.FrameRounding);
+ RenderNavHighlight(frame_bb, id, nav_highlight_flags);
+ if (flags & ImGuiTreeNodeFlags_Bullet)
+ RenderBullet(window->DrawList, ImVec2(text_pos.x - text_offset_x * 0.60f, text_pos.y + g.FontSize * 0.5f), text_col);
+ else if (!is_leaf)
+ RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y), text_col, is_open ? ImGuiDir_Down : ImGuiDir_Right, 1.0f);
+ else // Leaf without bullet, left-adjusted text
+ text_pos.x -= text_offset_x;
+ if (flags & ImGuiTreeNodeFlags_ClipLabelForTrailingButton)
+ frame_bb.Max.x -= g.FontSize + style.FramePadding.x;
if (g.LogEnabled)
{
// NB: '##' is normally used to hide text (as a library-wide feature), so we need to specify the text range to make sure the ## aren't stripped out here.
@@ -4830,7 +5443,7 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l
const char log_suffix[] = "##";
LogRenderedText(&text_pos, log_prefix, log_prefix+3);
RenderTextClipped(text_pos, frame_bb.Max, label, label_end, &label_size);
- LogRenderedText(&text_pos, log_suffix+1, log_suffix+3);
+ LogRenderedText(&text_pos, log_suffix, log_suffix+2);
}
else
{
@@ -4840,23 +5453,24 @@ bool ImGui::TreeNodeBehavior(ImGuiID id, ImGuiTreeNodeFlags flags, const char* l
else
{
// Unframed typed for tree nodes
- if (hovered || (flags & ImGuiTreeNodeFlags_Selected))
+ if (hovered || selected)
{
- RenderFrame(frame_bb.Min, frame_bb.Max, col, false);
- RenderNavHighlight(frame_bb, id, ImGuiNavHighlightFlags_TypeThin);
+ const ImU32 bg_col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header);
+ RenderFrame(frame_bb.Min, frame_bb.Max, bg_col, false);
+ RenderNavHighlight(frame_bb, id, nav_highlight_flags);
}
-
if (flags & ImGuiTreeNodeFlags_Bullet)
- RenderBullet(frame_bb.Min + ImVec2(text_offset_x * 0.5f, g.FontSize*0.50f + text_base_offset_y));
- else if (!(flags & ImGuiTreeNodeFlags_Leaf))
- RenderArrow(frame_bb.Min + ImVec2(padding.x, g.FontSize*0.15f + text_base_offset_y), is_open ? ImGuiDir_Down : ImGuiDir_Right, 0.70f);
+ RenderBullet(window->DrawList, ImVec2(text_pos.x - text_offset_x * 0.5f, text_pos.y + g.FontSize * 0.5f), text_col);
+ else if (!is_leaf)
+ RenderArrow(window->DrawList, ImVec2(text_pos.x - text_offset_x + padding.x, text_pos.y + g.FontSize * 0.15f), text_col, is_open ? ImGuiDir_Down : ImGuiDir_Right, 0.70f);
if (g.LogEnabled)
LogRenderedText(&text_pos, ">");
RenderText(text_pos, label, label_end, false);
}
if (is_open && !(flags & ImGuiTreeNodeFlags_NoTreePushOnOpen))
- TreePushRawID(id);
+ TreePushOverrideID(id);
+ IMGUI_TEST_ENGINE_ITEM_INFO(id, label, window->DC.ItemFlags | (is_leaf ? 0 : ImGuiItemStatusFlags_Openable) | (is_open ? ImGuiItemStatusFlags_Opened : 0));
return is_open;
}
@@ -4876,7 +5490,7 @@ void ImGui::TreePush(const void* ptr_id)
PushID(ptr_id ? ptr_id : (const void*)"#TreePush");
}
-void ImGui::TreePushRawID(ImGuiID id)
+void ImGui::TreePushOverrideID(ImGuiID id)
{
ImGuiWindow* window = GetCurrentWindow();
Indent();
@@ -4891,24 +5505,21 @@ void ImGui::TreePop()
Unindent();
window->DC.TreeDepth--;
+ ImU32 tree_depth_mask = (1 << window->DC.TreeDepth);
+
+ // Handle Left arrow to move to parent tree node (when ImGuiTreeNodeFlags_NavLeftJumpsBackHere is enabled)
if (g.NavMoveDir == ImGuiDir_Left && g.NavWindow == window && NavMoveRequestButNoResultYet())
- if (g.NavIdIsAlive && (window->DC.TreeDepthMayJumpToParentOnPop & (1 << window->DC.TreeDepth)))
+ if (g.NavIdIsAlive && (window->DC.TreeJumpToParentOnPopMask & tree_depth_mask))
{
- SetNavID(window->IDStack.back(), g.NavLayer);
+ SetNavID(window->IDStack.back(), g.NavLayer, 0);
NavMoveRequestCancel();
}
- window->DC.TreeDepthMayJumpToParentOnPop &= (1 << window->DC.TreeDepth) - 1;
+ window->DC.TreeJumpToParentOnPopMask &= tree_depth_mask - 1;
IM_ASSERT(window->IDStack.Size > 1); // There should always be 1 element in the IDStack (pushed during window creation). If this triggers you called TreePop/PopID too much.
PopID();
}
-void ImGui::TreeAdvanceToLabelPos()
-{
- ImGuiContext& g = *GImGui;
- g.CurrentWindow->DC.CursorPos.x += GetTreeNodeToLabelSpacing();
-}
-
// Horizontal distance preceding label when using TreeNode() or Bullet()
float ImGui::GetTreeNodeToLabelSpacing()
{
@@ -4916,13 +5527,15 @@ float ImGui::GetTreeNodeToLabelSpacing()
return g.FontSize + (g.Style.FramePadding.x * 2.0f);
}
-void ImGui::SetNextTreeNodeOpen(bool is_open, ImGuiCond cond)
+// Set next TreeNode/CollapsingHeader open state.
+void ImGui::SetNextItemOpen(bool is_open, ImGuiCond cond)
{
ImGuiContext& g = *GImGui;
if (g.CurrentWindow->SkipItems)
return;
- g.NextTreeNodeOpenVal = is_open;
- g.NextTreeNodeOpenCond = cond ? cond : ImGuiCond_Always;
+ g.NextItemData.Flags |= ImGuiNextItemDataFlags_HasOpen;
+ g.NextItemData.OpenVal = is_open;
+ g.NextItemData.OpenCond = cond ? cond : ImGuiCond_Always;
}
// CollapsingHeader returns true when opened but do not indent nor push into the ID stack (because of the ImGuiTreeNodeFlags_NoTreePushOnOpen flag).
@@ -4946,15 +5559,19 @@ bool ImGui::CollapsingHeader(const char* label, bool* p_open, ImGuiTreeNodeFlags
return false;
ImGuiID id = window->GetID(label);
- bool is_open = TreeNodeBehavior(id, flags | ImGuiTreeNodeFlags_CollapsingHeader | (p_open ? ImGuiTreeNodeFlags_AllowItemOverlap : 0), label);
+ flags |= ImGuiTreeNodeFlags_CollapsingHeader | (p_open ? ImGuiTreeNodeFlags_AllowItemOverlap | ImGuiTreeNodeFlags_ClipLabelForTrailingButton : 0);
+ bool is_open = TreeNodeBehavior(id, flags, label);
if (p_open)
{
- // Create a small overlapping close button // FIXME: We can evolve this into user accessible helpers to add extra buttons on title bars, headers, etc.
+ // Create a small overlapping close button
+ // FIXME: We can evolve this into user accessible helpers to add extra buttons on title bars, headers, etc.
+ // FIXME: CloseButton can overlap into text, need find a way to clip the text somehow.
ImGuiContext& g = *GImGui;
ImGuiItemHoveredDataBackup last_item_backup;
- float button_radius = g.FontSize * 0.5f;
- ImVec2 button_center = ImVec2(ImMin(window->DC.LastItemRect.Max.x, window->ClipRect.Max.x) - g.Style.FramePadding.x - button_radius, window->DC.LastItemRect.GetCenter().y);
- if (CloseButton(window->GetID((void*)(intptr_t)(id+1)), button_center, button_radius))
+ float button_size = g.FontSize;
+ float button_x = ImMax(window->DC.LastItemRect.Min.x, window->DC.LastItemRect.Max.x - g.Style.FramePadding.x * 2.0f - button_size);
+ float button_y = window->DC.LastItemRect.Min.y;
+ if (CloseButton(window->GetID((void*)((intptr_t)id + 1)), ImVec2(button_x, button_y)))
*p_open = false;
last_item_backup.Restore();
}
@@ -4968,7 +5585,7 @@ bool ImGui::CollapsingHeader(const char* label, bool* p_open, ImGuiTreeNodeFlags
// - Selectable()
//-------------------------------------------------------------------------
-// Tip: pass an empty label (e.g. "##dummy") then you can use the space to draw other text or image.
+// Tip: pass a non-visible label (e.g. "##dummy") then you can use the space to draw other text or image.
// But you need to make sure the ID is unique, e.g. enclose calls in PushID/PopID or use ##unique_id.
bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags flags, const ImVec2& size_arg)
{
@@ -4979,65 +5596,93 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl
ImGuiContext& g = *GImGui;
const ImGuiStyle& style = g.Style;
- if ((flags & ImGuiSelectableFlags_SpanAllColumns) && window->DC.ColumnsSet) // FIXME-OPT: Avoid if vertically clipped.
- PopClipRect();
+ if ((flags & ImGuiSelectableFlags_SpanAllColumns) && window->DC.CurrentColumns) // FIXME-OPT: Avoid if vertically clipped.
+ PushColumnsBackground();
ImGuiID id = window->GetID(label);
ImVec2 label_size = CalcTextSize(label, NULL, true);
ImVec2 size(size_arg.x != 0.0f ? size_arg.x : label_size.x, size_arg.y != 0.0f ? size_arg.y : label_size.y);
ImVec2 pos = window->DC.CursorPos;
- pos.y += window->DC.CurrentLineTextBaseOffset;
+ pos.y += window->DC.CurrLineTextBaseOffset;
ImRect bb_inner(pos, pos + size);
- ItemSize(bb_inner);
+ ItemSize(size, 0.0f);
// Fill horizontal space.
ImVec2 window_padding = window->WindowPadding;
float max_x = (flags & ImGuiSelectableFlags_SpanAllColumns) ? GetWindowContentRegionMax().x : GetContentRegionMax().x;
- float w_draw = ImMax(label_size.x, window->Pos.x + max_x - window_padding.x - window->DC.CursorPos.x);
+ float w_draw = ImMax(label_size.x, window->Pos.x + max_x - window_padding.x - pos.x);
ImVec2 size_draw((size_arg.x != 0 && !(flags & ImGuiSelectableFlags_DrawFillAvailWidth)) ? size_arg.x : w_draw, size_arg.y != 0.0f ? size_arg.y : size.y);
ImRect bb(pos, pos + size_draw);
if (size_arg.x == 0.0f || (flags & ImGuiSelectableFlags_DrawFillAvailWidth))
bb.Max.x += window_padding.x;
- // Selectables are tightly packed together, we extend the box to cover spacing between selectable.
- float spacing_L = (float)(int)(style.ItemSpacing.x * 0.5f);
- float spacing_U = (float)(int)(style.ItemSpacing.y * 0.5f);
- float spacing_R = style.ItemSpacing.x - spacing_L;
- float spacing_D = style.ItemSpacing.y - spacing_U;
+ // Selectables are tightly packed together so we extend the box to cover spacing between selectable.
+ const float spacing_x = style.ItemSpacing.x;
+ const float spacing_y = style.ItemSpacing.y;
+ const float spacing_L = IM_FLOOR(spacing_x * 0.50f);
+ const float spacing_U = IM_FLOOR(spacing_y * 0.50f);
bb.Min.x -= spacing_L;
bb.Min.y -= spacing_U;
- bb.Max.x += spacing_R;
- bb.Max.y += spacing_D;
- if (!ItemAdd(bb, (flags & ImGuiSelectableFlags_Disabled) ? 0 : id))
+ bb.Max.x += (spacing_x - spacing_L);
+ bb.Max.y += (spacing_y - spacing_U);
+
+ bool item_add;
+ if (flags & ImGuiSelectableFlags_Disabled)
{
- if ((flags & ImGuiSelectableFlags_SpanAllColumns) && window->DC.ColumnsSet)
- PushColumnClipRect();
+ ImGuiItemFlags backup_item_flags = window->DC.ItemFlags;
+ window->DC.ItemFlags |= ImGuiItemFlags_Disabled | ImGuiItemFlags_NoNavDefaultFocus;
+ item_add = ItemAdd(bb, id);
+ window->DC.ItemFlags = backup_item_flags;
+ }
+ else
+ {
+ item_add = ItemAdd(bb, id);
+ }
+ if (!item_add)
+ {
+ if ((flags & ImGuiSelectableFlags_SpanAllColumns) && window->DC.CurrentColumns)
+ PopColumnsBackground();
return false;
}
// We use NoHoldingActiveID on menus so user can click and _hold_ on a menu then drag to browse child entries
ImGuiButtonFlags button_flags = 0;
- if (flags & ImGuiSelectableFlags_NoHoldingActiveID) button_flags |= ImGuiButtonFlags_NoHoldingActiveID;
- if (flags & ImGuiSelectableFlags_PressedOnClick) button_flags |= ImGuiButtonFlags_PressedOnClick;
- if (flags & ImGuiSelectableFlags_PressedOnRelease) button_flags |= ImGuiButtonFlags_PressedOnRelease;
- if (flags & ImGuiSelectableFlags_Disabled) button_flags |= ImGuiButtonFlags_Disabled;
- if (flags & ImGuiSelectableFlags_AllowDoubleClick) button_flags |= ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnDoubleClick;
- bool hovered, held;
- bool pressed = ButtonBehavior(bb, id, &hovered, &held, button_flags);
+ if (flags & ImGuiSelectableFlags_NoHoldingActiveID) { button_flags |= ImGuiButtonFlags_NoHoldingActiveId; }
+ if (flags & ImGuiSelectableFlags_PressedOnClick) { button_flags |= ImGuiButtonFlags_PressedOnClick; }
+ if (flags & ImGuiSelectableFlags_PressedOnRelease) { button_flags |= ImGuiButtonFlags_PressedOnRelease; }
+ if (flags & ImGuiSelectableFlags_Disabled) { button_flags |= ImGuiButtonFlags_Disabled; }
+ if (flags & ImGuiSelectableFlags_AllowDoubleClick) { button_flags |= ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnDoubleClick; }
+ if (flags & ImGuiSelectableFlags_AllowItemOverlap) { button_flags |= ImGuiButtonFlags_AllowItemOverlap; }
+
if (flags & ImGuiSelectableFlags_Disabled)
selected = false;
- // Hovering selectable with mouse updates NavId accordingly so navigation can be resumed with gamepad/keyboard (this doesn't happen on most widgets)
- if (pressed || hovered)
+ const bool was_selected = selected;
+ bool hovered, held;
+ bool pressed = ButtonBehavior(bb, id, &hovered, &held, button_flags);
+
+ // Update NavId when clicking or when Hovering (this doesn't happen on most widgets), so navigation can be resumed with gamepad/keyboard
+ if (pressed || (hovered && (flags & ImGuiSelectableFlags_SetNavIdOnHover)))
+ {
if (!g.NavDisableMouseHover && g.NavWindow == window && g.NavLayer == window->DC.NavLayerCurrent)
{
g.NavDisableHighlight = true;
- SetNavID(id, window->DC.NavLayerCurrent);
+ SetNavID(id, window->DC.NavLayerCurrent, window->DC.NavFocusScopeIdCurrent);
}
+ }
if (pressed)
MarkItemEdited(id);
+ if (flags & ImGuiSelectableFlags_AllowItemOverlap)
+ SetItemAllowOverlap();
+
+ // In this branch, Selectable() cannot toggle the selection so this will never trigger.
+ if (selected != was_selected) //-V547
+ window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_ToggledSelection;
+
// Render
+ if (held && (flags & ImGuiSelectableFlags_DrawHoveredWhenHeld))
+ hovered = true;
if (hovered || selected)
{
const ImU32 col = GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header);
@@ -5045,19 +5690,21 @@ bool ImGui::Selectable(const char* label, bool selected, ImGuiSelectableFlags fl
RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_TypeThin | ImGuiNavHighlightFlags_NoRounding);
}
- if ((flags & ImGuiSelectableFlags_SpanAllColumns) && window->DC.ColumnsSet)
+ if ((flags & ImGuiSelectableFlags_SpanAllColumns) && window->DC.CurrentColumns)
{
- PushColumnClipRect();
+ PopColumnsBackground();
bb.Max.x -= (GetContentRegionMax().x - max_x);
}
- if (flags & ImGuiSelectableFlags_Disabled) PushStyleColor(ImGuiCol_Text, g.Style.Colors[ImGuiCol_TextDisabled]);
- RenderTextClipped(bb_inner.Min, bb.Max, label, NULL, &label_size, ImVec2(0.0f,0.0f));
+ if (flags & ImGuiSelectableFlags_Disabled) PushStyleColor(ImGuiCol_Text, style.Colors[ImGuiCol_TextDisabled]);
+ RenderTextClipped(bb_inner.Min, bb_inner.Max, label, NULL, &label_size, style.SelectableTextAlign, &bb);
if (flags & ImGuiSelectableFlags_Disabled) PopStyleColor();
// Automatically close popups
if (pressed && (window->Flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiSelectableFlags_DontClosePopups) && !(window->DC.ItemFlags & ImGuiItemFlags_SelectableDontClosePopup))
CloseCurrentPopup();
+
+ IMGUI_TEST_ENGINE_ITEM_INFO(id, label, window->DC.ItemFlags);
return pressed;
}
@@ -5078,17 +5725,21 @@ bool ImGui::Selectable(const char* label, bool* p_selected, ImGuiSelectableFlags
// - ListBoxHeader()
// - ListBoxFooter()
//-------------------------------------------------------------------------
+// FIXME: This is an old API. We should redesign some of it, rename ListBoxHeader->BeginListBox, ListBoxFooter->EndListBox
+// and promote using them over existing ListBox() functions, similarly to change with combo boxes.
+//-------------------------------------------------------------------------
-// FIXME: Rename to BeginListBox()
+// FIXME: In principle this function should be called BeginListBox(). We should rename it after re-evaluating if we want to keep the same signature.
// Helper to calculate the size of a listbox and display a label on the right.
-// Tip: To have a list filling the entire window width, PushItemWidth(-1) and pass an empty label "##empty"
+// Tip: To have a list filling the entire window width, PushItemWidth(-1) and pass an non-visible label e.g. "##empty"
bool ImGui::ListBoxHeader(const char* label, const ImVec2& size_arg)
{
+ ImGuiContext& g = *GImGui;
ImGuiWindow* window = GetCurrentWindow();
if (window->SkipItems)
return false;
- const ImGuiStyle& style = GetStyle();
+ const ImGuiStyle& style = g.Style;
const ImGuiID id = GetID(label);
const ImVec2 label_size = CalcTextSize(label, NULL, true);
@@ -5098,6 +5749,14 @@ bool ImGui::ListBoxHeader(const char* label, const ImVec2& size_arg)
ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size);
ImRect bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0.0f));
window->DC.LastItemRect = bb; // Forward storage for ListBoxFooter.. dodgy.
+ g.NextItemData.ClearFlags();
+
+ if (!IsRectVisible(bb.Min, bb.Max))
+ {
+ ItemSize(bb.GetSize(), style.FramePadding.y);
+ ItemAdd(bb, 0, &frame_bb);
+ return false;
+ }
BeginGroup();
if (label_size.x > 0)
@@ -5107,24 +5766,26 @@ bool ImGui::ListBoxHeader(const char* label, const ImVec2& size_arg)
return true;
}
-// FIXME: Rename to BeginListBox()
+// FIXME: In principle this function should be called EndListBox(). We should rename it after re-evaluating if we want to keep the same signature.
bool ImGui::ListBoxHeader(const char* label, int items_count, int height_in_items)
{
- // Size default to hold ~7 items. Fractional number of items helps seeing that we can scroll down/up without looking at scrollbar.
- // We don't add +0.40f if items_count <= height_in_items. It is slightly dodgy, because it means a dynamic list of items will make the widget resize occasionally when it crosses that size.
+ // Size default to hold ~7.25 items.
+ // We add +25% worth of item height to allow the user to see at a glance if there are more items up/down, without looking at the scrollbar.
+ // We don't add this extra bit if items_count <= height_in_items. It is slightly dodgy, because it means a dynamic list of items will make the widget resize occasionally when it crosses that size.
// I am expecting that someone will come and complain about this behavior in a remote future, then we can advise on a better solution.
if (height_in_items < 0)
height_in_items = ImMin(items_count, 7);
- float height_in_items_f = height_in_items < items_count ? (height_in_items + 0.40f) : (height_in_items + 0.00f);
+ const ImGuiStyle& style = GetStyle();
+ float height_in_items_f = (height_in_items < items_count) ? (height_in_items + 0.25f) : (height_in_items + 0.00f);
// We include ItemSpacing.y so that a list sized for the exact number of items doesn't make a scrollbar appears. We could also enforce that by passing a flag to BeginChild().
ImVec2 size;
size.x = 0.0f;
- size.y = GetTextLineHeightWithSpacing() * height_in_items_f + GetStyle().ItemSpacing.y;
+ size.y = ImFloor(GetTextLineHeightWithSpacing() * height_in_items_f + style.FramePadding.y * 2.0f);
return ListBoxHeader(label, size);
}
-// FIXME: Rename to EndListBox()
+// FIXME: In principle this function should be called EndListBox(). We should rename it after re-evaluating if we want to keep the same signature.
void ImGui::ListBoxFooter()
{
ImGuiWindow* parent_window = GetCurrentWindow()->ParentWindow;
@@ -5189,7 +5850,7 @@ bool ImGui::ListBox(const char* label, int* current_item, bool (*items_getter)(v
// - PlotHistogram()
//-------------------------------------------------------------------------
-void ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 graph_size)
+void ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_getter)(void* data, int idx), void* data, int values_count, int values_offset, const char* overlay_text, float scale_min, float scale_max, ImVec2 frame_size)
{
ImGuiWindow* window = GetCurrentWindow();
if (window->SkipItems)
@@ -5197,20 +5858,21 @@ void ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_ge
ImGuiContext& g = *GImGui;
const ImGuiStyle& style = g.Style;
+ const ImGuiID id = window->GetID(label);
const ImVec2 label_size = CalcTextSize(label, NULL, true);
- if (graph_size.x == 0.0f)
- graph_size.x = CalcItemWidth();
- if (graph_size.y == 0.0f)
- graph_size.y = label_size.y + (style.FramePadding.y * 2);
+ if (frame_size.x == 0.0f)
+ frame_size.x = CalcItemWidth();
+ if (frame_size.y == 0.0f)
+ frame_size.y = label_size.y + (style.FramePadding.y * 2);
- const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + ImVec2(graph_size.x, graph_size.y));
+ const ImRect frame_bb(window->DC.CursorPos, window->DC.CursorPos + frame_size);
const ImRect inner_bb(frame_bb.Min + style.FramePadding, frame_bb.Max - style.FramePadding);
const ImRect total_bb(frame_bb.Min, frame_bb.Max + ImVec2(label_size.x > 0.0f ? style.ItemInnerSpacing.x + label_size.x : 0.0f, 0));
ItemSize(total_bb, style.FramePadding.y);
if (!ItemAdd(total_bb, 0, &frame_bb))
return;
- const bool hovered = ItemHoverable(inner_bb, 0);
+ const bool hovered = ItemHoverable(frame_bb, id);
// Determine scale from values if not specified
if (scale_min == FLT_MAX || scale_max == FLT_MAX)
@@ -5220,6 +5882,8 @@ void ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_ge
for (int i = 0; i < values_count; i++)
{
const float v = values_getter(data, i);
+ if (v != v) // Ignore NaN values
+ continue;
v_min = ImMin(v_min, v);
v_max = ImMax(v_max, v);
}
@@ -5231,14 +5895,15 @@ void ImGui::PlotEx(ImGuiPlotType plot_type, const char* label, float (*values_ge
RenderFrame(frame_bb.Min, frame_bb.Max, GetColorU32(ImGuiCol_FrameBg), true, style.FrameRounding);
- if (values_count > 0)
+ const int values_count_min = (plot_type == ImGuiPlotType_Lines) ? 2 : 1;
+ if (values_count >= values_count_min)
{
- int res_w = ImMin((int)graph_size.x, values_count) + ((plot_type == ImGuiPlotType_Lines) ? -1 : 0);
+ int res_w = ImMin((int)frame_size.x, values_count) + ((plot_type == ImGuiPlotType_Lines) ? -1 : 0);
int item_count = values_count + ((plot_type == ImGuiPlotType_Lines) ? -1 : 0);
// Tooltip on hover
int v_hovered = -1;
- if (hovered)
+ if (hovered && inner_bb.Contains(g.IO.MousePos))
{
const float t = ImClamp((g.IO.MousePos.x - inner_bb.Min.x) / (inner_bb.Max.x - inner_bb.Min.x), 0.0f, 0.9999f);
const int v_idx = (int)(t * item_count);
@@ -5376,10 +6041,10 @@ void ImGui::Value(const char* prefix, float v, const char* float_format)
// [SECTION] MenuItem, BeginMenu, EndMenu, etc.
//-------------------------------------------------------------------------
// - ImGuiMenuColumns [Internal]
-// - BeginMainMenuBar()
-// - EndMainMenuBar()
// - BeginMenuBar()
// - EndMenuBar()
+// - BeginMainMenuBar()
+// - EndMainMenuBar()
// - BeginMenu()
// - EndMenu()
// - MenuItem()
@@ -5388,7 +6053,6 @@ void ImGui::Value(const char* prefix, float v, const char* float_format)
// Helpers for internal use
ImGuiMenuColumns::ImGuiMenuColumns()
{
- Count = 0;
Spacing = Width = NextWidth = 0.0f;
memset(Pos, 0, sizeof(Pos));
memset(NextWidths, 0, sizeof(NextWidths));
@@ -5396,16 +6060,17 @@ ImGuiMenuColumns::ImGuiMenuColumns()
void ImGuiMenuColumns::Update(int count, float spacing, bool clear)
{
- IM_ASSERT(Count <= IM_ARRAYSIZE(Pos));
- Count = count;
+ IM_ASSERT(count == IM_ARRAYSIZE(Pos));
+ IM_UNUSED(count);
Width = NextWidth = 0.0f;
Spacing = spacing;
- if (clear) memset(NextWidths, 0, sizeof(NextWidths));
- for (int i = 0; i < Count; i++)
+ if (clear)
+ memset(NextWidths, 0, sizeof(NextWidths));
+ for (int i = 0; i < IM_ARRAYSIZE(Pos); i++)
{
if (i > 0 && NextWidths[i] > 0.0f)
Width += Spacing;
- Pos[i] = (float)(int)Width;
+ Pos[i] = IM_FLOOR(Width);
Width += NextWidths[i];
NextWidths[i] = 0.0f;
}
@@ -5417,49 +6082,20 @@ float ImGuiMenuColumns::DeclColumns(float w0, float w1, float w2) // not using v
NextWidths[0] = ImMax(NextWidths[0], w0);
NextWidths[1] = ImMax(NextWidths[1], w1);
NextWidths[2] = ImMax(NextWidths[2], w2);
- for (int i = 0; i < 3; i++)
+ for (int i = 0; i < IM_ARRAYSIZE(Pos); i++)
NextWidth += NextWidths[i] + ((i > 0 && NextWidths[i] > 0.0f) ? Spacing : 0.0f);
return ImMax(Width, NextWidth);
}
-float ImGuiMenuColumns::CalcExtraSpace(float avail_w)
+float ImGuiMenuColumns::CalcExtraSpace(float avail_w) const
{
return ImMax(0.0f, avail_w - Width);
}
-// For the main menu bar, which cannot be moved, we honor g.Style.DisplaySafeAreaPadding to ensure text can be visible on a TV set.
-bool ImGui::BeginMainMenuBar()
-{
- ImGuiContext& g = *GImGui;
- g.NextWindowData.MenuBarOffsetMinVal = ImVec2(g.Style.DisplaySafeAreaPadding.x, ImMax(g.Style.DisplaySafeAreaPadding.y - g.Style.FramePadding.y, 0.0f));
- SetNextWindowPos(ImVec2(0.0f, 0.0f));
- SetNextWindowSize(ImVec2(g.IO.DisplaySize.x, g.NextWindowData.MenuBarOffsetMinVal.y + g.FontBaseSize + g.Style.FramePadding.y));
- PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
- PushStyleVar(ImGuiStyleVar_WindowMinSize, ImVec2(0,0));
- ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_MenuBar;
- bool is_open = Begin("##MainMenuBar", NULL, window_flags) && BeginMenuBar();
- PopStyleVar(2);
- g.NextWindowData.MenuBarOffsetMinVal = ImVec2(0.0f, 0.0f);
- if (!is_open)
- {
- End();
- return false;
- }
- return true;
-}
-
-void ImGui::EndMainMenuBar()
-{
- EndMenuBar();
-
- // When the user has left the menu layer (typically: closed menus through activation of an item), we restore focus to the previous window
- ImGuiContext& g = *GImGui;
- if (g.CurrentWindow == g.NavWindow && g.NavLayer == 0)
- FocusPreviousWindowIgnoringOne(g.NavWindow);
-
- End();
-}
-
+// FIXME: Provided a rectangle perhaps e.g. a BeginMenuBarEx() could be used anywhere..
+// Currently the main responsibility of this function being to setup clip-rect + horizontal layout + menu navigation layer.
+// Ideally we also want this to be responsible for claiming space out of the main window scrolling rectangle, in which case ImGuiWindowFlags_MenuBar will become unnecessary.
+// Then later the same system could be used for multiple menu-bars, scrollbars, side-bars.
bool ImGui::BeginMenuBar()
{
ImGuiWindow* window = GetCurrentWindow();
@@ -5469,20 +6105,20 @@ bool ImGui::BeginMenuBar()
return false;
IM_ASSERT(!window->DC.MenuBarAppending);
- BeginGroup(); // Backup position on layer 0
+ BeginGroup(); // Backup position on layer 0 // FIXME: Misleading to use a group for that backup/restore
PushID("##menubar");
// We don't clip with current window clipping rectangle as it is already set to the area below. However we clip with window full rect.
// We remove 1 worth of rounding to Max.x to that text in long menus and small windows don't tend to display over the lower-right rounded area, which looks particularly glitchy.
ImRect bar_rect = window->MenuBarRect();
- ImRect clip_rect(ImFloor(bar_rect.Min.x + 0.5f), ImFloor(bar_rect.Min.y + window->WindowBorderSize + 0.5f), ImFloor(ImMax(bar_rect.Min.x, bar_rect.Max.x - window->WindowRounding) + 0.5f), ImFloor(bar_rect.Max.y + 0.5f));
+ ImRect clip_rect(IM_ROUND(bar_rect.Min.x + window->WindowBorderSize), IM_ROUND(bar_rect.Min.y + window->WindowBorderSize), IM_ROUND(ImMax(bar_rect.Min.x, bar_rect.Max.x - ImMax(window->WindowRounding, window->WindowBorderSize))), IM_ROUND(bar_rect.Max.y));
clip_rect.ClipWith(window->OuterRectClipped);
PushClipRect(clip_rect.Min, clip_rect.Max, false);
window->DC.CursorPos = ImVec2(bar_rect.Min.x + window->DC.MenuBarOffset.x, bar_rect.Min.y + window->DC.MenuBarOffset.y);
window->DC.LayoutType = ImGuiLayoutType_Horizontal;
- window->DC.NavLayerCurrent++;
- window->DC.NavLayerCurrentMask <<= 1;
+ window->DC.NavLayerCurrent = ImGuiNavLayer_Menu;
+ window->DC.NavLayerCurrentMask = (1 << ImGuiNavLayer_Menu);
window->DC.MenuBarAppending = true;
AlignTextToFramePadding();
return true;
@@ -5505,10 +6141,11 @@ void ImGui::EndMenuBar()
{
// To do so we claim focus back, restore NavId and then process the movement request for yet another frame.
// This involve a one-frame delay which isn't very problematic in this situation. We could remove it by scoring in advance for multiple window (probably not worth the hassle/cost)
- IM_ASSERT(window->DC.NavLayerActiveMaskNext & 0x02); // Sanity check
+ const ImGuiNavLayer layer = ImGuiNavLayer_Menu;
+ IM_ASSERT(window->DC.NavLayerActiveMaskNext & (1 << layer)); // Sanity check
FocusWindow(window);
- SetNavIDWithRectRel(window->NavLastIds[1], 1, window->NavRectRel[1]);
- g.NavLayer = 1;
+ SetNavIDWithRectRel(window->NavLastIds[layer], layer, 0, window->NavRectRel[layer]);
+ g.NavLayer = layer;
g.NavDisableHighlight = true; // Hide highlight for the current frame so we don't see the intermediary selection.
g.NavMoveRequestForward = ImGuiNavForward_ForwardQueued;
NavMoveRequestCancel();
@@ -5520,14 +6157,48 @@ void ImGui::EndMenuBar()
PopClipRect();
PopID();
window->DC.MenuBarOffset.x = window->DC.CursorPos.x - window->MenuBarRect().Min.x; // Save horizontal position so next append can reuse it. This is kinda equivalent to a per-layer CursorPos.
- window->DC.GroupStack.back().AdvanceCursor = false;
+ window->DC.GroupStack.back().EmitItem = false;
EndGroup(); // Restore position on layer 0
window->DC.LayoutType = ImGuiLayoutType_Vertical;
- window->DC.NavLayerCurrent--;
- window->DC.NavLayerCurrentMask >>= 1;
+ window->DC.NavLayerCurrent = ImGuiNavLayer_Main;
+ window->DC.NavLayerCurrentMask = (1 << ImGuiNavLayer_Main);
window->DC.MenuBarAppending = false;
}
+// For the main menu bar, which cannot be moved, we honor g.Style.DisplaySafeAreaPadding to ensure text can be visible on a TV set.
+bool ImGui::BeginMainMenuBar()
+{
+ ImGuiContext& g = *GImGui;
+ g.NextWindowData.MenuBarOffsetMinVal = ImVec2(g.Style.DisplaySafeAreaPadding.x, ImMax(g.Style.DisplaySafeAreaPadding.y - g.Style.FramePadding.y, 0.0f));
+ SetNextWindowPos(ImVec2(0.0f, 0.0f));
+ SetNextWindowSize(ImVec2(g.IO.DisplaySize.x, g.NextWindowData.MenuBarOffsetMinVal.y + g.FontBaseSize + g.Style.FramePadding.y));
+ PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
+ PushStyleVar(ImGuiStyleVar_WindowMinSize, ImVec2(0, 0));
+ ImGuiWindowFlags window_flags = ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoScrollbar | ImGuiWindowFlags_NoSavedSettings | ImGuiWindowFlags_MenuBar;
+ bool is_open = Begin("##MainMenuBar", NULL, window_flags) && BeginMenuBar();
+ PopStyleVar(2);
+ g.NextWindowData.MenuBarOffsetMinVal = ImVec2(0.0f, 0.0f);
+ if (!is_open)
+ {
+ End();
+ return false;
+ }
+ return true; //-V1020
+}
+
+void ImGui::EndMainMenuBar()
+{
+ EndMenuBar();
+
+ // When the user has left the menu layer (typically: closed menus through activation of an item), we restore focus to the previous window
+ // FIXME: With this strategy we won't be able to restore a NULL focus.
+ ImGuiContext& g = *GImGui;
+ if (g.CurrentWindow == g.NavWindow && g.NavLayer == 0 && !g.NavAnyRequest)
+ FocusTopMostWindowUnderOne(g.NavWindow, NULL);
+
+ End();
+}
+
bool ImGui::BeginMenu(const char* label, bool enabled)
{
ImGuiWindow* window = GetCurrentWindow();
@@ -5542,66 +6213,73 @@ bool ImGui::BeginMenu(const char* label, bool enabled)
bool pressed;
bool menu_is_open = IsPopupOpen(id);
- bool menuset_is_open = !(window->Flags & ImGuiWindowFlags_Popup) && (g.OpenPopupStack.Size > g.CurrentPopupStack.Size && g.OpenPopupStack[g.CurrentPopupStack.Size].OpenParentId == window->IDStack.back());
+ bool menuset_is_open = !(window->Flags & ImGuiWindowFlags_Popup) && (g.OpenPopupStack.Size > g.BeginPopupStack.Size && g.OpenPopupStack[g.BeginPopupStack.Size].OpenParentId == window->IDStack.back());
ImGuiWindow* backed_nav_window = g.NavWindow;
if (menuset_is_open)
g.NavWindow = window; // Odd hack to allow hovering across menus of a same menu-set (otherwise we wouldn't be able to hover parent)
- // The reference position stored in popup_pos will be used by Begin() to find a suitable position for the child menu (using FindBestWindowPosForPopup).
+ // The reference position stored in popup_pos will be used by Begin() to find a suitable position for the child menu,
+ // However the final position is going to be different! It is choosen by FindBestWindowPosForPopup().
+ // e.g. Menus tend to overlap each other horizontally to amplify relative Z-ordering.
ImVec2 popup_pos, pos = window->DC.CursorPos;
if (window->DC.LayoutType == ImGuiLayoutType_Horizontal)
{
// Menu inside an horizontal menu bar
// Selectable extend their highlight by half ItemSpacing in each direction.
// For ChildMenu, the popup position will be overwritten by the call to FindBestWindowPosForPopup() in Begin()
- popup_pos = ImVec2(pos.x - 1.0f - (float)(int)(style.ItemSpacing.x * 0.5f), pos.y - style.FramePadding.y + window->MenuBarHeight());
- window->DC.CursorPos.x += (float)(int)(style.ItemSpacing.x * 0.5f);
- PushStyleVar(ImGuiStyleVar_ItemSpacing, style.ItemSpacing * 2.0f);
+ popup_pos = ImVec2(pos.x - 1.0f - IM_FLOOR(style.ItemSpacing.x * 0.5f), pos.y - style.FramePadding.y + window->MenuBarHeight());
+ window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * 0.5f);
+ PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(style.ItemSpacing.x * 2.0f, style.ItemSpacing.y));
float w = label_size.x;
pressed = Selectable(label, menu_is_open, ImGuiSelectableFlags_NoHoldingActiveID | ImGuiSelectableFlags_PressedOnClick | ImGuiSelectableFlags_DontClosePopups | (!enabled ? ImGuiSelectableFlags_Disabled : 0), ImVec2(w, 0.0f));
PopStyleVar();
- window->DC.CursorPos.x += (float)(int)(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar().
+ window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar().
}
else
{
// Menu inside a menu
popup_pos = ImVec2(pos.x, pos.y - style.WindowPadding.y);
- float w = window->MenuColumns.DeclColumns(label_size.x, 0.0f, (float)(int)(g.FontSize * 1.20f)); // Feedback to next frame
+ float w = window->DC.MenuColumns.DeclColumns(label_size.x, 0.0f, IM_FLOOR(g.FontSize * 1.20f)); // Feedback to next frame
float extra_w = ImMax(0.0f, GetContentRegionAvail().x - w);
pressed = Selectable(label, menu_is_open, ImGuiSelectableFlags_NoHoldingActiveID | ImGuiSelectableFlags_PressedOnClick | ImGuiSelectableFlags_DontClosePopups | ImGuiSelectableFlags_DrawFillAvailWidth | (!enabled ? ImGuiSelectableFlags_Disabled : 0), ImVec2(w, 0.0f));
- if (!enabled) PushStyleColor(ImGuiCol_Text, g.Style.Colors[ImGuiCol_TextDisabled]);
- RenderArrow(pos + ImVec2(window->MenuColumns.Pos[2] + extra_w + g.FontSize * 0.30f, 0.0f), ImGuiDir_Right);
- if (!enabled) PopStyleColor();
+ ImU32 text_col = GetColorU32(enabled ? ImGuiCol_Text : ImGuiCol_TextDisabled);
+ RenderArrow(window->DrawList, pos + ImVec2(window->DC.MenuColumns.Pos[2] + extra_w + g.FontSize * 0.30f, 0.0f), text_col, ImGuiDir_Right);
}
const bool hovered = enabled && ItemHoverable(window->DC.LastItemRect, id);
if (menuset_is_open)
g.NavWindow = backed_nav_window;
- bool want_open = false, want_close = false;
+ bool want_open = false;
+ bool want_close = false;
if (window->DC.LayoutType == ImGuiLayoutType_Vertical) // (window->Flags & (ImGuiWindowFlags_Popup|ImGuiWindowFlags_ChildMenu))
{
+ // Close menu when not hovering it anymore unless we are moving roughly in the direction of the menu
// Implement http://bjk5.com/post/44698559168/breaking-down-amazons-mega-dropdown to avoid using timers, so menus feels more reactive.
- bool moving_within_opened_triangle = false;
- if (g.HoveredWindow == window && g.OpenPopupStack.Size > g.CurrentPopupStack.Size && g.OpenPopupStack[g.CurrentPopupStack.Size].ParentWindow == window && !(window->Flags & ImGuiWindowFlags_MenuBar))
+ bool moving_toward_other_child_menu = false;
+
+ ImGuiWindow* child_menu_window = (g.BeginPopupStack.Size < g.OpenPopupStack.Size && g.OpenPopupStack[g.BeginPopupStack.Size].SourceWindow == window) ? g.OpenPopupStack[g.BeginPopupStack.Size].Window : NULL;
+ if (g.HoveredWindow == window && child_menu_window != NULL && !(window->Flags & ImGuiWindowFlags_MenuBar))
{
- if (ImGuiWindow* next_window = g.OpenPopupStack[g.CurrentPopupStack.Size].Window)
- {
- ImRect next_window_rect = next_window->Rect();
- ImVec2 ta = g.IO.MousePos - g.IO.MouseDelta;
- ImVec2 tb = (window->Pos.x < next_window->Pos.x) ? next_window_rect.GetTL() : next_window_rect.GetTR();
- ImVec2 tc = (window->Pos.x < next_window->Pos.x) ? next_window_rect.GetBL() : next_window_rect.GetBR();
- float extra = ImClamp(ImFabs(ta.x - tb.x) * 0.30f, 5.0f, 30.0f); // add a bit of extra slack.
- ta.x += (window->Pos.x < next_window->Pos.x) ? -0.5f : +0.5f; // to avoid numerical issues
- tb.y = ta.y + ImMax((tb.y - extra) - ta.y, -100.0f); // triangle is maximum 200 high to limit the slope and the bias toward large sub-menus // FIXME: Multiply by fb_scale?
- tc.y = ta.y + ImMin((tc.y + extra) - ta.y, +100.0f);
- moving_within_opened_triangle = ImTriangleContainsPoint(ta, tb, tc, g.IO.MousePos);
- //window->DrawList->PushClipRectFullScreen(); window->DrawList->AddTriangleFilled(ta, tb, tc, moving_within_opened_triangle ? IM_COL32(0,128,0,128) : IM_COL32(128,0,0,128)); window->DrawList->PopClipRect(); // Debug
- }
+ // FIXME-DPI: Values should be derived from a master "scale" factor.
+ ImRect next_window_rect = child_menu_window->Rect();
+ ImVec2 ta = g.IO.MousePos - g.IO.MouseDelta;
+ ImVec2 tb = (window->Pos.x < child_menu_window->Pos.x) ? next_window_rect.GetTL() : next_window_rect.GetTR();
+ ImVec2 tc = (window->Pos.x < child_menu_window->Pos.x) ? next_window_rect.GetBL() : next_window_rect.GetBR();
+ float extra = ImClamp(ImFabs(ta.x - tb.x) * 0.30f, 5.0f, 30.0f); // add a bit of extra slack.
+ ta.x += (window->Pos.x < child_menu_window->Pos.x) ? -0.5f : +0.5f; // to avoid numerical issues
+ tb.y = ta.y + ImMax((tb.y - extra) - ta.y, -100.0f); // triangle is maximum 200 high to limit the slope and the bias toward large sub-menus // FIXME: Multiply by fb_scale?
+ tc.y = ta.y + ImMin((tc.y + extra) - ta.y, +100.0f);
+ moving_toward_other_child_menu = ImTriangleContainsPoint(ta, tb, tc, g.IO.MousePos);
+ //GetForegroundDrawList()->AddTriangleFilled(ta, tb, tc, moving_within_opened_triangle ? IM_COL32(0,128,0,128) : IM_COL32(128,0,0,128)); // [DEBUG]
}
+ if (menu_is_open && !hovered && g.HoveredWindow == window && g.HoveredIdPreviousFrame != 0 && g.HoveredIdPreviousFrame != id && !moving_toward_other_child_menu)
+ want_close = true;
- want_close = (menu_is_open && !hovered && g.HoveredWindow == window && g.HoveredIdPreviousFrame != 0 && g.HoveredIdPreviousFrame != id && !moving_within_opened_triangle);
- want_open = (!menu_is_open && hovered && !moving_within_opened_triangle) || (!menu_is_open && hovered && pressed);
+ if (!menu_is_open && hovered && pressed) // Click to open
+ want_open = true;
+ else if (!menu_is_open && hovered && !moving_toward_other_child_menu) // Hover to open
+ want_open = true;
if (g.NavActivateId == id)
{
@@ -5636,9 +6314,11 @@ bool ImGui::BeginMenu(const char* label, bool enabled)
if (!enabled) // explicitly close if an open menu becomes disabled, facilitate users code a lot in pattern such as 'if (BeginMenu("options", has_object)) { ..use object.. }'
want_close = true;
if (want_close && IsPopupOpen(id))
- ClosePopupToLevel(g.CurrentPopupStack.Size);
+ ClosePopupToLevel(g.BeginPopupStack.Size, true);
+
+ IMGUI_TEST_ENGINE_ITEM_INFO(id, label, window->DC.ItemFlags | ImGuiItemStatusFlags_Openable | (menu_is_open ? ImGuiItemStatusFlags_Opened : 0));
- if (!menu_is_open && want_open && g.OpenPopupStack.Size > g.CurrentPopupStack.Size)
+ if (!menu_is_open && want_open && g.OpenPopupStack.Size > g.BeginPopupStack.Size)
{
// Don't recycle same menu level in the same frame, first close the other menu and yield for a frame.
OpenPopup(label);
@@ -5664,14 +6344,14 @@ bool ImGui::BeginMenu(const char* label, bool enabled)
void ImGui::EndMenu()
{
- // Nav: When a left move request _within our child menu_ failed, close the menu.
+ // Nav: When a left move request _within our child menu_ failed, close ourselves (the _parent_ menu).
// A menu doesn't close itself because EndMenuBar() wants the catch the last Left<>Right inputs.
// However, it means that with the current code, a BeginMenu() from outside another menu or a menu-bar won't be closable with the Left direction.
ImGuiContext& g = *GImGui;
ImGuiWindow* window = g.CurrentWindow;
if (g.NavWindow && g.NavWindow->ParentWindow == window && g.NavMoveDir == ImGuiDir_Left && NavMoveRequestButNoResultYet() && window->DC.LayoutType == ImGuiLayoutType_Vertical)
{
- ClosePopupToLevel(g.OpenPopupStack.Size - 1);
+ ClosePopupToLevel(g.BeginPopupStack.Size, true);
NavMoveRequestCancel();
}
@@ -5689,34 +6369,38 @@ bool ImGui::MenuItem(const char* label, const char* shortcut, bool selected, boo
ImVec2 pos = window->DC.CursorPos;
ImVec2 label_size = CalcTextSize(label, NULL, true);
- ImGuiSelectableFlags flags = ImGuiSelectableFlags_PressedOnRelease | (enabled ? 0 : ImGuiSelectableFlags_Disabled);
+ // We've been using the equivalent of ImGuiSelectableFlags_SetNavIdOnHover on all Selectable() since early Nav system days (commit 43ee5d73),
+ // but I am unsure whether this should be kept at all. For now moved it to be an opt-in feature used by menus only.
+ ImGuiSelectableFlags flags = ImGuiSelectableFlags_PressedOnRelease | ImGuiSelectableFlags_SetNavIdOnHover | (enabled ? 0 : ImGuiSelectableFlags_Disabled);
bool pressed;
if (window->DC.LayoutType == ImGuiLayoutType_Horizontal)
{
// Mimic the exact layout spacing of BeginMenu() to allow MenuItem() inside a menu bar, which is a little misleading but may be useful
// Note that in this situation we render neither the shortcut neither the selected tick mark
float w = label_size.x;
- window->DC.CursorPos.x += (float)(int)(style.ItemSpacing.x * 0.5f);
- PushStyleVar(ImGuiStyleVar_ItemSpacing, style.ItemSpacing * 2.0f);
+ window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * 0.5f);
+ PushStyleVar(ImGuiStyleVar_ItemSpacing, ImVec2(style.ItemSpacing.x * 2.0f, style.ItemSpacing.y));
pressed = Selectable(label, false, flags, ImVec2(w, 0.0f));
PopStyleVar();
- window->DC.CursorPos.x += (float)(int)(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar().
+ window->DC.CursorPos.x += IM_FLOOR(style.ItemSpacing.x * (-1.0f + 0.5f)); // -1 spacing to compensate the spacing added when Selectable() did a SameLine(). It would also work to call SameLine() ourselves after the PopStyleVar().
}
else
{
ImVec2 shortcut_size = shortcut ? CalcTextSize(shortcut, NULL) : ImVec2(0.0f, 0.0f);
- float w = window->MenuColumns.DeclColumns(label_size.x, shortcut_size.x, (float)(int)(g.FontSize * 1.20f)); // Feedback for next frame
+ float w = window->DC.MenuColumns.DeclColumns(label_size.x, shortcut_size.x, IM_FLOOR(g.FontSize * 1.20f)); // Feedback for next frame
float extra_w = ImMax(0.0f, GetContentRegionAvail().x - w);
pressed = Selectable(label, false, flags | ImGuiSelectableFlags_DrawFillAvailWidth, ImVec2(w, 0.0f));
if (shortcut_size.x > 0.0f)
{
PushStyleColor(ImGuiCol_Text, g.Style.Colors[ImGuiCol_TextDisabled]);
- RenderText(pos + ImVec2(window->MenuColumns.Pos[1] + extra_w, 0.0f), shortcut, NULL, false);
+ RenderText(pos + ImVec2(window->DC.MenuColumns.Pos[1] + extra_w, 0.0f), shortcut, NULL, false);
PopStyleColor();
}
if (selected)
- RenderCheckMark(pos + ImVec2(window->MenuColumns.Pos[2] + extra_w + g.FontSize * 0.40f, g.FontSize * 0.134f * 0.5f), GetColorU32(enabled ? ImGuiCol_Text : ImGuiCol_TextDisabled), g.FontSize * 0.866f);
+ RenderCheckMark(pos + ImVec2(window->DC.MenuColumns.Pos[2] + extra_w + g.FontSize * 0.40f, g.FontSize * 0.134f * 0.5f), GetColorU32(enabled ? ImGuiCol_Text : ImGuiCol_TextDisabled), g.FontSize * 0.866f);
}
+
+ IMGUI_TEST_ENGINE_ITEM_INFO(window->DC.LastItemId, label, window->DC.ItemFlags | ImGuiItemStatusFlags_Checkable | (selected ? ImGuiItemStatusFlags_Checked : 0));
return pressed;
}
@@ -5730,3 +6414,1297 @@ bool ImGui::MenuItem(const char* label, const char* shortcut, bool* p_selected,
}
return false;
}
+
+//-------------------------------------------------------------------------
+// [SECTION] Widgets: BeginTabBar, EndTabBar, etc.
+//-------------------------------------------------------------------------
+// - BeginTabBar()
+// - BeginTabBarEx() [Internal]
+// - EndTabBar()
+// - TabBarLayout() [Internal]
+// - TabBarCalcTabID() [Internal]
+// - TabBarCalcMaxTabWidth() [Internal]
+// - TabBarFindTabById() [Internal]
+// - TabBarRemoveTab() [Internal]
+// - TabBarCloseTab() [Internal]
+// - TabBarScrollClamp()v
+// - TabBarScrollToTab() [Internal]
+// - TabBarQueueChangeTabOrder() [Internal]
+// - TabBarScrollingButtons() [Internal]
+// - TabBarTabListPopupButton() [Internal]
+//-------------------------------------------------------------------------
+
+namespace ImGui
+{
+ static void TabBarLayout(ImGuiTabBar* tab_bar);
+ static ImU32 TabBarCalcTabID(ImGuiTabBar* tab_bar, const char* label);
+ static float TabBarCalcMaxTabWidth();
+ static float TabBarScrollClamp(ImGuiTabBar* tab_bar, float scrolling);
+ static void TabBarScrollToTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab);
+ static ImGuiTabItem* TabBarScrollingButtons(ImGuiTabBar* tab_bar);
+ static ImGuiTabItem* TabBarTabListPopupButton(ImGuiTabBar* tab_bar);
+}
+
+ImGuiTabBar::ImGuiTabBar()
+{
+ ID = 0;
+ SelectedTabId = NextSelectedTabId = VisibleTabId = 0;
+ CurrFrameVisible = PrevFrameVisible = -1;
+ LastTabContentHeight = 0.0f;
+ OffsetMax = OffsetMaxIdeal = OffsetNextTab = 0.0f;
+ ScrollingAnim = ScrollingTarget = ScrollingTargetDistToVisibility = ScrollingSpeed = 0.0f;
+ Flags = ImGuiTabBarFlags_None;
+ ReorderRequestTabId = 0;
+ ReorderRequestDir = 0;
+ WantLayout = VisibleTabWasSubmitted = false;
+ LastTabItemIdx = -1;
+}
+
+static int IMGUI_CDECL TabItemComparerByVisibleOffset(const void* lhs, const void* rhs)
+{
+ const ImGuiTabItem* a = (const ImGuiTabItem*)lhs;
+ const ImGuiTabItem* b = (const ImGuiTabItem*)rhs;
+ return (int)(a->Offset - b->Offset);
+}
+
+static ImGuiTabBar* GetTabBarFromTabBarRef(const ImGuiPtrOrIndex& ref)
+{
+ ImGuiContext& g = *GImGui;
+ return ref.Ptr ? (ImGuiTabBar*)ref.Ptr : g.TabBars.GetByIndex(ref.Index);
+}
+
+static ImGuiPtrOrIndex GetTabBarRefFromTabBar(ImGuiTabBar* tab_bar)
+{
+ ImGuiContext& g = *GImGui;
+ if (g.TabBars.Contains(tab_bar))
+ return ImGuiPtrOrIndex(g.TabBars.GetIndex(tab_bar));
+ return ImGuiPtrOrIndex(tab_bar);
+}
+
+bool ImGui::BeginTabBar(const char* str_id, ImGuiTabBarFlags flags)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ if (window->SkipItems)
+ return false;
+
+ ImGuiID id = window->GetID(str_id);
+ ImGuiTabBar* tab_bar = g.TabBars.GetOrAddByKey(id);
+ ImRect tab_bar_bb = ImRect(window->DC.CursorPos.x, window->DC.CursorPos.y, window->WorkRect.Max.x, window->DC.CursorPos.y + g.FontSize + g.Style.FramePadding.y * 2);
+ tab_bar->ID = id;
+ return BeginTabBarEx(tab_bar, tab_bar_bb, flags | ImGuiTabBarFlags_IsFocused);
+}
+
+bool ImGui::BeginTabBarEx(ImGuiTabBar* tab_bar, const ImRect& tab_bar_bb, ImGuiTabBarFlags flags)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ if (window->SkipItems)
+ return false;
+
+ if ((flags & ImGuiTabBarFlags_DockNode) == 0)
+ PushOverrideID(tab_bar->ID);
+
+ // Add to stack
+ g.CurrentTabBarStack.push_back(GetTabBarRefFromTabBar(tab_bar));
+ g.CurrentTabBar = tab_bar;
+
+ if (tab_bar->CurrFrameVisible == g.FrameCount)
+ {
+ //IMGUI_DEBUG_LOG("BeginTabBarEx already called this frame\n", g.FrameCount);
+ IM_ASSERT(0);
+ return true;
+ }
+
+ // When toggling back from ordered to manually-reorderable, shuffle tabs to enforce the last visible order.
+ // Otherwise, the most recently inserted tabs would move at the end of visible list which can be a little too confusing or magic for the user.
+ if ((flags & ImGuiTabBarFlags_Reorderable) && !(tab_bar->Flags & ImGuiTabBarFlags_Reorderable) && tab_bar->Tabs.Size > 1 && tab_bar->PrevFrameVisible != -1)
+ ImQsort(tab_bar->Tabs.Data, tab_bar->Tabs.Size, sizeof(ImGuiTabItem), TabItemComparerByVisibleOffset);
+
+ // Flags
+ if ((flags & ImGuiTabBarFlags_FittingPolicyMask_) == 0)
+ flags |= ImGuiTabBarFlags_FittingPolicyDefault_;
+
+ tab_bar->Flags = flags;
+ tab_bar->BarRect = tab_bar_bb;
+ tab_bar->WantLayout = true; // Layout will be done on the first call to ItemTab()
+ tab_bar->PrevFrameVisible = tab_bar->CurrFrameVisible;
+ tab_bar->CurrFrameVisible = g.FrameCount;
+ tab_bar->FramePadding = g.Style.FramePadding;
+
+ // Layout
+ ItemSize(ImVec2(tab_bar->OffsetMaxIdeal, tab_bar->BarRect.GetHeight()), tab_bar->FramePadding.y);
+ window->DC.CursorPos.x = tab_bar->BarRect.Min.x;
+
+ // Draw separator
+ const ImU32 col = GetColorU32((flags & ImGuiTabBarFlags_IsFocused) ? ImGuiCol_TabActive : ImGuiCol_TabUnfocusedActive);
+ const float y = tab_bar->BarRect.Max.y - 1.0f;
+ {
+ const float separator_min_x = tab_bar->BarRect.Min.x - IM_FLOOR(window->WindowPadding.x * 0.5f);
+ const float separator_max_x = tab_bar->BarRect.Max.x + IM_FLOOR(window->WindowPadding.x * 0.5f);
+ window->DrawList->AddLine(ImVec2(separator_min_x, y), ImVec2(separator_max_x, y), col, 1.0f);
+ }
+ return true;
+}
+
+void ImGui::EndTabBar()
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ if (window->SkipItems)
+ return;
+
+ ImGuiTabBar* tab_bar = g.CurrentTabBar;
+ if (tab_bar == NULL)
+ {
+ IM_ASSERT_USER_ERROR(tab_bar != NULL, "Mismatched BeginTabBar()/EndTabBar()!");
+ return;
+ }
+ if (tab_bar->WantLayout)
+ TabBarLayout(tab_bar);
+
+ // Restore the last visible height if no tab is visible, this reduce vertical flicker/movement when a tabs gets removed without calling SetTabItemClosed().
+ const bool tab_bar_appearing = (tab_bar->PrevFrameVisible + 1 < g.FrameCount);
+ if (tab_bar->VisibleTabWasSubmitted || tab_bar->VisibleTabId == 0 || tab_bar_appearing)
+ tab_bar->LastTabContentHeight = ImMax(window->DC.CursorPos.y - tab_bar->BarRect.Max.y, 0.0f);
+ else
+ window->DC.CursorPos.y = tab_bar->BarRect.Max.y + tab_bar->LastTabContentHeight;
+
+ if ((tab_bar->Flags & ImGuiTabBarFlags_DockNode) == 0)
+ PopID();
+
+ g.CurrentTabBarStack.pop_back();
+ g.CurrentTabBar = g.CurrentTabBarStack.empty() ? NULL : GetTabBarFromTabBarRef(g.CurrentTabBarStack.back());
+}
+
+// This is called only once a frame before by the first call to ItemTab()
+// The reason we're not calling it in BeginTabBar() is to leave a chance to the user to call the SetTabItemClosed() functions.
+static void ImGui::TabBarLayout(ImGuiTabBar* tab_bar)
+{
+ ImGuiContext& g = *GImGui;
+ tab_bar->WantLayout = false;
+
+ // Garbage collect
+ int tab_dst_n = 0;
+ for (int tab_src_n = 0; tab_src_n < tab_bar->Tabs.Size; tab_src_n++)
+ {
+ ImGuiTabItem* tab = &tab_bar->Tabs[tab_src_n];
+ if (tab->LastFrameVisible < tab_bar->PrevFrameVisible)
+ {
+ if (tab->ID == tab_bar->SelectedTabId)
+ tab_bar->SelectedTabId = 0;
+ continue;
+ }
+ if (tab_dst_n != tab_src_n)
+ tab_bar->Tabs[tab_dst_n] = tab_bar->Tabs[tab_src_n];
+ tab_dst_n++;
+ }
+ if (tab_bar->Tabs.Size != tab_dst_n)
+ tab_bar->Tabs.resize(tab_dst_n);
+
+ // Setup next selected tab
+ ImGuiID scroll_track_selected_tab_id = 0;
+ if (tab_bar->NextSelectedTabId)
+ {
+ tab_bar->SelectedTabId = tab_bar->NextSelectedTabId;
+ tab_bar->NextSelectedTabId = 0;
+ scroll_track_selected_tab_id = tab_bar->SelectedTabId;
+ }
+
+ // Process order change request (we could probably process it when requested but it's just saner to do it in a single spot).
+ if (tab_bar->ReorderRequestTabId != 0)
+ {
+ if (ImGuiTabItem* tab1 = TabBarFindTabByID(tab_bar, tab_bar->ReorderRequestTabId))
+ {
+ //IM_ASSERT(tab_bar->Flags & ImGuiTabBarFlags_Reorderable); // <- this may happen when using debug tools
+ int tab2_order = tab_bar->GetTabOrder(tab1) + tab_bar->ReorderRequestDir;
+ if (tab2_order >= 0 && tab2_order < tab_bar->Tabs.Size)
+ {
+ ImGuiTabItem* tab2 = &tab_bar->Tabs[tab2_order];
+ ImGuiTabItem item_tmp = *tab1;
+ *tab1 = *tab2;
+ *tab2 = item_tmp;
+ if (tab2->ID == tab_bar->SelectedTabId)
+ scroll_track_selected_tab_id = tab2->ID;
+ tab1 = tab2 = NULL;
+ }
+ if (tab_bar->Flags & ImGuiTabBarFlags_SaveSettings)
+ MarkIniSettingsDirty();
+ }
+ tab_bar->ReorderRequestTabId = 0;
+ }
+
+ // Tab List Popup (will alter tab_bar->BarRect and therefore the available width!)
+ const bool tab_list_popup_button = (tab_bar->Flags & ImGuiTabBarFlags_TabListPopupButton) != 0;
+ if (tab_list_popup_button)
+ if (ImGuiTabItem* tab_to_select = TabBarTabListPopupButton(tab_bar)) // NB: Will alter BarRect.Max.x!
+ scroll_track_selected_tab_id = tab_bar->SelectedTabId = tab_to_select->ID;
+
+ // Compute ideal widths
+ g.ShrinkWidthBuffer.resize(tab_bar->Tabs.Size);
+ float width_total_contents = 0.0f;
+ ImGuiTabItem* most_recently_selected_tab = NULL;
+ bool found_selected_tab_id = false;
+ for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++)
+ {
+ ImGuiTabItem* tab = &tab_bar->Tabs[tab_n];
+ IM_ASSERT(tab->LastFrameVisible >= tab_bar->PrevFrameVisible);
+
+ if (most_recently_selected_tab == NULL || most_recently_selected_tab->LastFrameSelected < tab->LastFrameSelected)
+ most_recently_selected_tab = tab;
+ if (tab->ID == tab_bar->SelectedTabId)
+ found_selected_tab_id = true;
+
+ // Refresh tab width immediately, otherwise changes of style e.g. style.FramePadding.x would noticeably lag in the tab bar.
+ // Additionally, when using TabBarAddTab() to manipulate tab bar order we occasionally insert new tabs that don't have a width yet,
+ // and we cannot wait for the next BeginTabItem() call. We cannot compute this width within TabBarAddTab() because font size depends on the active window.
+ const char* tab_name = tab_bar->GetTabName(tab);
+ const bool has_close_button = (tab->Flags & ImGuiTabItemFlags_NoCloseButton) ? false : true;
+ tab->ContentWidth = TabItemCalcSize(tab_name, has_close_button).x;
+
+ width_total_contents += (tab_n > 0 ? g.Style.ItemInnerSpacing.x : 0.0f) + tab->ContentWidth;
+
+ // Store data so we can build an array sorted by width if we need to shrink tabs down
+ g.ShrinkWidthBuffer[tab_n].Index = tab_n;
+ g.ShrinkWidthBuffer[tab_n].Width = tab->ContentWidth;
+ }
+
+ // Compute width
+ const float initial_offset_x = 0.0f; // g.Style.ItemInnerSpacing.x;
+ const float width_avail = ImMax(tab_bar->BarRect.GetWidth() - initial_offset_x, 0.0f);
+ float width_excess = (width_avail < width_total_contents) ? (width_total_contents - width_avail) : 0.0f;
+ if (width_excess > 0.0f && (tab_bar->Flags & ImGuiTabBarFlags_FittingPolicyResizeDown))
+ {
+ // If we don't have enough room, resize down the largest tabs first
+ ShrinkWidths(g.ShrinkWidthBuffer.Data, g.ShrinkWidthBuffer.Size, width_excess);
+ for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++)
+ tab_bar->Tabs[g.ShrinkWidthBuffer[tab_n].Index].Width = IM_FLOOR(g.ShrinkWidthBuffer[tab_n].Width);
+ }
+ else
+ {
+ const float tab_max_width = TabBarCalcMaxTabWidth();
+ for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++)
+ {
+ ImGuiTabItem* tab = &tab_bar->Tabs[tab_n];
+ tab->Width = ImMin(tab->ContentWidth, tab_max_width);
+ IM_ASSERT(tab->Width > 0.0f);
+ }
+ }
+
+ // Layout all active tabs
+ float offset_x = initial_offset_x;
+ float offset_x_ideal = offset_x;
+ tab_bar->OffsetNextTab = offset_x; // This is used by non-reorderable tab bar where the submission order is always honored.
+ for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++)
+ {
+ ImGuiTabItem* tab = &tab_bar->Tabs[tab_n];
+ tab->Offset = offset_x;
+ if (scroll_track_selected_tab_id == 0 && g.NavJustMovedToId == tab->ID)
+ scroll_track_selected_tab_id = tab->ID;
+ offset_x += tab->Width + g.Style.ItemInnerSpacing.x;
+ offset_x_ideal += tab->ContentWidth + g.Style.ItemInnerSpacing.x;
+ }
+ tab_bar->OffsetMax = ImMax(offset_x - g.Style.ItemInnerSpacing.x, 0.0f);
+ tab_bar->OffsetMaxIdeal = ImMax(offset_x_ideal - g.Style.ItemInnerSpacing.x, 0.0f);
+
+ // Horizontal scrolling buttons
+ const bool scrolling_buttons = (tab_bar->OffsetMax > tab_bar->BarRect.GetWidth() && tab_bar->Tabs.Size > 1) && !(tab_bar->Flags & ImGuiTabBarFlags_NoTabListScrollingButtons) && (tab_bar->Flags & ImGuiTabBarFlags_FittingPolicyScroll);
+ if (scrolling_buttons)
+ if (ImGuiTabItem* tab_to_select = TabBarScrollingButtons(tab_bar)) // NB: Will alter BarRect.Max.x!
+ scroll_track_selected_tab_id = tab_bar->SelectedTabId = tab_to_select->ID;
+
+ // If we have lost the selected tab, select the next most recently active one
+ if (found_selected_tab_id == false)
+ tab_bar->SelectedTabId = 0;
+ if (tab_bar->SelectedTabId == 0 && tab_bar->NextSelectedTabId == 0 && most_recently_selected_tab != NULL)
+ scroll_track_selected_tab_id = tab_bar->SelectedTabId = most_recently_selected_tab->ID;
+
+ // Lock in visible tab
+ tab_bar->VisibleTabId = tab_bar->SelectedTabId;
+ tab_bar->VisibleTabWasSubmitted = false;
+
+ // Update scrolling
+ if (scroll_track_selected_tab_id)
+ if (ImGuiTabItem* scroll_track_selected_tab = TabBarFindTabByID(tab_bar, scroll_track_selected_tab_id))
+ TabBarScrollToTab(tab_bar, scroll_track_selected_tab);
+ tab_bar->ScrollingAnim = TabBarScrollClamp(tab_bar, tab_bar->ScrollingAnim);
+ tab_bar->ScrollingTarget = TabBarScrollClamp(tab_bar, tab_bar->ScrollingTarget);
+ if (tab_bar->ScrollingAnim != tab_bar->ScrollingTarget)
+ {
+ // Scrolling speed adjust itself so we can always reach our target in 1/3 seconds.
+ // Teleport if we are aiming far off the visible line
+ tab_bar->ScrollingSpeed = ImMax(tab_bar->ScrollingSpeed, 70.0f * g.FontSize);
+ tab_bar->ScrollingSpeed = ImMax(tab_bar->ScrollingSpeed, ImFabs(tab_bar->ScrollingTarget - tab_bar->ScrollingAnim) / 0.3f);
+ const bool teleport = (tab_bar->PrevFrameVisible + 1 < g.FrameCount) || (tab_bar->ScrollingTargetDistToVisibility > 10.0f * g.FontSize);
+ tab_bar->ScrollingAnim = teleport ? tab_bar->ScrollingTarget : ImLinearSweep(tab_bar->ScrollingAnim, tab_bar->ScrollingTarget, g.IO.DeltaTime * tab_bar->ScrollingSpeed);
+ }
+ else
+ {
+ tab_bar->ScrollingSpeed = 0.0f;
+ }
+
+ // Clear name buffers
+ if ((tab_bar->Flags & ImGuiTabBarFlags_DockNode) == 0)
+ tab_bar->TabsNames.Buf.resize(0);
+}
+
+// Dockables uses Name/ID in the global namespace. Non-dockable items use the ID stack.
+static ImU32 ImGui::TabBarCalcTabID(ImGuiTabBar* tab_bar, const char* label)
+{
+ if (tab_bar->Flags & ImGuiTabBarFlags_DockNode)
+ {
+ ImGuiID id = ImHashStr(label);
+ KeepAliveID(id);
+ return id;
+ }
+ else
+ {
+ ImGuiWindow* window = GImGui->CurrentWindow;
+ return window->GetID(label);
+ }
+}
+
+static float ImGui::TabBarCalcMaxTabWidth()
+{
+ ImGuiContext& g = *GImGui;
+ return g.FontSize * 20.0f;
+}
+
+ImGuiTabItem* ImGui::TabBarFindTabByID(ImGuiTabBar* tab_bar, ImGuiID tab_id)
+{
+ if (tab_id != 0)
+ for (int n = 0; n < tab_bar->Tabs.Size; n++)
+ if (tab_bar->Tabs[n].ID == tab_id)
+ return &tab_bar->Tabs[n];
+ return NULL;
+}
+
+// The *TabId fields be already set by the docking system _before_ the actual TabItem was created, so we clear them regardless.
+void ImGui::TabBarRemoveTab(ImGuiTabBar* tab_bar, ImGuiID tab_id)
+{
+ if (ImGuiTabItem* tab = TabBarFindTabByID(tab_bar, tab_id))
+ tab_bar->Tabs.erase(tab);
+ if (tab_bar->VisibleTabId == tab_id) { tab_bar->VisibleTabId = 0; }
+ if (tab_bar->SelectedTabId == tab_id) { tab_bar->SelectedTabId = 0; }
+ if (tab_bar->NextSelectedTabId == tab_id) { tab_bar->NextSelectedTabId = 0; }
+}
+
+// Called on manual closure attempt
+void ImGui::TabBarCloseTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab)
+{
+ if ((tab_bar->VisibleTabId == tab->ID) && !(tab->Flags & ImGuiTabItemFlags_UnsavedDocument))
+ {
+ // This will remove a frame of lag for selecting another tab on closure.
+ // However we don't run it in the case where the 'Unsaved' flag is set, so user gets a chance to fully undo the closure
+ tab->LastFrameVisible = -1;
+ tab_bar->SelectedTabId = tab_bar->NextSelectedTabId = 0;
+ }
+ else if ((tab_bar->VisibleTabId != tab->ID) && (tab->Flags & ImGuiTabItemFlags_UnsavedDocument))
+ {
+ // Actually select before expecting closure
+ tab_bar->NextSelectedTabId = tab->ID;
+ }
+}
+
+static float ImGui::TabBarScrollClamp(ImGuiTabBar* tab_bar, float scrolling)
+{
+ scrolling = ImMin(scrolling, tab_bar->OffsetMax - tab_bar->BarRect.GetWidth());
+ return ImMax(scrolling, 0.0f);
+}
+
+static void ImGui::TabBarScrollToTab(ImGuiTabBar* tab_bar, ImGuiTabItem* tab)
+{
+ ImGuiContext& g = *GImGui;
+ float margin = g.FontSize * 1.0f; // When to scroll to make Tab N+1 visible always make a bit of N visible to suggest more scrolling area (since we don't have a scrollbar)
+ int order = tab_bar->GetTabOrder(tab);
+ float tab_x1 = tab->Offset + (order > 0 ? -margin : 0.0f);
+ float tab_x2 = tab->Offset + tab->Width + (order + 1 < tab_bar->Tabs.Size ? margin : 1.0f);
+ tab_bar->ScrollingTargetDistToVisibility = 0.0f;
+ if (tab_bar->ScrollingTarget > tab_x1 || (tab_x2 - tab_x1 >= tab_bar->BarRect.GetWidth()))
+ {
+ tab_bar->ScrollingTargetDistToVisibility = ImMax(tab_bar->ScrollingAnim - tab_x2, 0.0f);
+ tab_bar->ScrollingTarget = tab_x1;
+ }
+ else if (tab_bar->ScrollingTarget < tab_x2 - tab_bar->BarRect.GetWidth())
+ {
+ tab_bar->ScrollingTargetDistToVisibility = ImMax((tab_x1 - tab_bar->BarRect.GetWidth()) - tab_bar->ScrollingAnim, 0.0f);
+ tab_bar->ScrollingTarget = tab_x2 - tab_bar->BarRect.GetWidth();
+ }
+}
+
+void ImGui::TabBarQueueChangeTabOrder(ImGuiTabBar* tab_bar, const ImGuiTabItem* tab, int dir)
+{
+ IM_ASSERT(dir == -1 || dir == +1);
+ IM_ASSERT(tab_bar->ReorderRequestTabId == 0);
+ tab_bar->ReorderRequestTabId = tab->ID;
+ tab_bar->ReorderRequestDir = (ImS8)dir;
+}
+
+static ImGuiTabItem* ImGui::TabBarScrollingButtons(ImGuiTabBar* tab_bar)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+
+ const ImVec2 arrow_button_size(g.FontSize - 2.0f, g.FontSize + g.Style.FramePadding.y * 2.0f);
+ const float scrolling_buttons_width = arrow_button_size.x * 2.0f;
+
+ const ImVec2 backup_cursor_pos = window->DC.CursorPos;
+ //window->DrawList->AddRect(ImVec2(tab_bar->BarRect.Max.x - scrolling_buttons_width, tab_bar->BarRect.Min.y), ImVec2(tab_bar->BarRect.Max.x, tab_bar->BarRect.Max.y), IM_COL32(255,0,0,255));
+
+ const ImRect avail_bar_rect = tab_bar->BarRect;
+ bool want_clip_rect = !avail_bar_rect.Contains(ImRect(window->DC.CursorPos, window->DC.CursorPos + ImVec2(scrolling_buttons_width, 0.0f)));
+ if (want_clip_rect)
+ PushClipRect(tab_bar->BarRect.Min, tab_bar->BarRect.Max + ImVec2(g.Style.ItemInnerSpacing.x, 0.0f), true);
+
+ ImGuiTabItem* tab_to_select = NULL;
+
+ int select_dir = 0;
+ ImVec4 arrow_col = g.Style.Colors[ImGuiCol_Text];
+ arrow_col.w *= 0.5f;
+
+ PushStyleColor(ImGuiCol_Text, arrow_col);
+ PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0));
+ const float backup_repeat_delay = g.IO.KeyRepeatDelay;
+ const float backup_repeat_rate = g.IO.KeyRepeatRate;
+ g.IO.KeyRepeatDelay = 0.250f;
+ g.IO.KeyRepeatRate = 0.200f;
+ window->DC.CursorPos = ImVec2(tab_bar->BarRect.Max.x - scrolling_buttons_width, tab_bar->BarRect.Min.y);
+ if (ArrowButtonEx("##<", ImGuiDir_Left, arrow_button_size, ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_Repeat))
+ select_dir = -1;
+ window->DC.CursorPos = ImVec2(tab_bar->BarRect.Max.x - scrolling_buttons_width + arrow_button_size.x, tab_bar->BarRect.Min.y);
+ if (ArrowButtonEx("##>", ImGuiDir_Right, arrow_button_size, ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_Repeat))
+ select_dir = +1;
+ PopStyleColor(2);
+ g.IO.KeyRepeatRate = backup_repeat_rate;
+ g.IO.KeyRepeatDelay = backup_repeat_delay;
+
+ if (want_clip_rect)
+ PopClipRect();
+
+ if (select_dir != 0)
+ if (ImGuiTabItem* tab_item = TabBarFindTabByID(tab_bar, tab_bar->SelectedTabId))
+ {
+ int selected_order = tab_bar->GetTabOrder(tab_item);
+ int target_order = selected_order + select_dir;
+ tab_to_select = &tab_bar->Tabs[(target_order >= 0 && target_order < tab_bar->Tabs.Size) ? target_order : selected_order]; // If we are at the end of the list, still scroll to make our tab visible
+ }
+ window->DC.CursorPos = backup_cursor_pos;
+ tab_bar->BarRect.Max.x -= scrolling_buttons_width + 1.0f;
+
+ return tab_to_select;
+}
+
+static ImGuiTabItem* ImGui::TabBarTabListPopupButton(ImGuiTabBar* tab_bar)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+
+ // We use g.Style.FramePadding.y to match the square ArrowButton size
+ const float tab_list_popup_button_width = g.FontSize + g.Style.FramePadding.y;
+ const ImVec2 backup_cursor_pos = window->DC.CursorPos;
+ window->DC.CursorPos = ImVec2(tab_bar->BarRect.Min.x - g.Style.FramePadding.y, tab_bar->BarRect.Min.y);
+ tab_bar->BarRect.Min.x += tab_list_popup_button_width;
+
+ ImVec4 arrow_col = g.Style.Colors[ImGuiCol_Text];
+ arrow_col.w *= 0.5f;
+ PushStyleColor(ImGuiCol_Text, arrow_col);
+ PushStyleColor(ImGuiCol_Button, ImVec4(0, 0, 0, 0));
+ bool open = BeginCombo("##v", NULL, ImGuiComboFlags_NoPreview);
+ PopStyleColor(2);
+
+ ImGuiTabItem* tab_to_select = NULL;
+ if (open)
+ {
+ for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++)
+ {
+ ImGuiTabItem* tab = &tab_bar->Tabs[tab_n];
+ const char* tab_name = tab_bar->GetTabName(tab);
+ if (Selectable(tab_name, tab_bar->SelectedTabId == tab->ID))
+ tab_to_select = tab;
+ }
+ EndCombo();
+ }
+
+ window->DC.CursorPos = backup_cursor_pos;
+ return tab_to_select;
+}
+
+//-------------------------------------------------------------------------
+// [SECTION] Widgets: BeginTabItem, EndTabItem, etc.
+//-------------------------------------------------------------------------
+// - BeginTabItem()
+// - EndTabItem()
+// - TabItemEx() [Internal]
+// - SetTabItemClosed()
+// - TabItemCalcSize() [Internal]
+// - TabItemBackground() [Internal]
+// - TabItemLabelAndCloseButton() [Internal]
+//-------------------------------------------------------------------------
+
+bool ImGui::BeginTabItem(const char* label, bool* p_open, ImGuiTabItemFlags flags)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ if (window->SkipItems)
+ return false;
+
+ ImGuiTabBar* tab_bar = g.CurrentTabBar;
+ if (tab_bar == NULL)
+ {
+ IM_ASSERT_USER_ERROR(tab_bar, "BeginTabItem() Needs to be called between BeginTabBar() and EndTabBar()!");
+ return false;
+ }
+ bool ret = TabItemEx(tab_bar, label, p_open, flags);
+ if (ret && !(flags & ImGuiTabItemFlags_NoPushId))
+ {
+ ImGuiTabItem* tab = &tab_bar->Tabs[tab_bar->LastTabItemIdx];
+ PushOverrideID(tab->ID); // We already hashed 'label' so push into the ID stack directly instead of doing another hash through PushID(label)
+ }
+ return ret;
+}
+
+void ImGui::EndTabItem()
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ if (window->SkipItems)
+ return;
+
+ ImGuiTabBar* tab_bar = g.CurrentTabBar;
+ if (tab_bar == NULL)
+ {
+ IM_ASSERT(tab_bar != NULL && "Needs to be called between BeginTabBar() and EndTabBar()!");
+ return;
+ }
+ IM_ASSERT(tab_bar->LastTabItemIdx >= 0);
+ ImGuiTabItem* tab = &tab_bar->Tabs[tab_bar->LastTabItemIdx];
+ if (!(tab->Flags & ImGuiTabItemFlags_NoPushId))
+ window->IDStack.pop_back();
+}
+
+bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open, ImGuiTabItemFlags flags)
+{
+ // Layout whole tab bar if not already done
+ if (tab_bar->WantLayout)
+ TabBarLayout(tab_bar);
+
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ if (window->SkipItems)
+ return false;
+
+ const ImGuiStyle& style = g.Style;
+ const ImGuiID id = TabBarCalcTabID(tab_bar, label);
+
+ // If the user called us with *p_open == false, we early out and don't render. We make a dummy call to ItemAdd() so that attempts to use a contextual popup menu with an implicit ID won't use an older ID.
+ if (p_open && !*p_open)
+ {
+ PushItemFlag(ImGuiItemFlags_NoNav | ImGuiItemFlags_NoNavDefaultFocus, true);
+ ItemAdd(ImRect(), id);
+ PopItemFlag();
+ return false;
+ }
+
+ // Store into ImGuiTabItemFlags_NoCloseButton, also honor ImGuiTabItemFlags_NoCloseButton passed by user (although not documented)
+ if (flags & ImGuiTabItemFlags_NoCloseButton)
+ p_open = NULL;
+ else if (p_open == NULL)
+ flags |= ImGuiTabItemFlags_NoCloseButton;
+
+ // Calculate tab contents size
+ ImVec2 size = TabItemCalcSize(label, p_open != NULL);
+
+ // Acquire tab data
+ ImGuiTabItem* tab = TabBarFindTabByID(tab_bar, id);
+ bool tab_is_new = false;
+ if (tab == NULL)
+ {
+ tab_bar->Tabs.push_back(ImGuiTabItem());
+ tab = &tab_bar->Tabs.back();
+ tab->ID = id;
+ tab->Width = size.x;
+ tab_is_new = true;
+ }
+ tab_bar->LastTabItemIdx = (short)tab_bar->Tabs.index_from_ptr(tab);
+ tab->ContentWidth = size.x;
+
+ const bool tab_bar_appearing = (tab_bar->PrevFrameVisible + 1 < g.FrameCount);
+ const bool tab_bar_focused = (tab_bar->Flags & ImGuiTabBarFlags_IsFocused) != 0;
+ const bool tab_appearing = (tab->LastFrameVisible + 1 < g.FrameCount);
+ tab->LastFrameVisible = g.FrameCount;
+ tab->Flags = flags;
+
+ // Append name with zero-terminator
+ tab->NameOffset = tab_bar->TabsNames.size();
+ tab_bar->TabsNames.append(label, label + strlen(label) + 1);
+
+ // If we are not reorderable, always reset offset based on submission order.
+ // (We already handled layout and sizing using the previous known order, but sizing is not affected by order!)
+ if (!tab_appearing && !(tab_bar->Flags & ImGuiTabBarFlags_Reorderable))
+ {
+ tab->Offset = tab_bar->OffsetNextTab;
+ tab_bar->OffsetNextTab += tab->Width + g.Style.ItemInnerSpacing.x;
+ }
+
+ // Update selected tab
+ if (tab_appearing && (tab_bar->Flags & ImGuiTabBarFlags_AutoSelectNewTabs) && tab_bar->NextSelectedTabId == 0)
+ if (!tab_bar_appearing || tab_bar->SelectedTabId == 0)
+ tab_bar->NextSelectedTabId = id; // New tabs gets activated
+ if ((flags & ImGuiTabItemFlags_SetSelected) && (tab_bar->SelectedTabId != id)) // SetSelected can only be passed on explicit tab bar
+ tab_bar->NextSelectedTabId = id;
+
+ // Lock visibility
+ bool tab_contents_visible = (tab_bar->VisibleTabId == id);
+ if (tab_contents_visible)
+ tab_bar->VisibleTabWasSubmitted = true;
+
+ // On the very first frame of a tab bar we let first tab contents be visible to minimize appearing glitches
+ if (!tab_contents_visible && tab_bar->SelectedTabId == 0 && tab_bar_appearing)
+ if (tab_bar->Tabs.Size == 1 && !(tab_bar->Flags & ImGuiTabBarFlags_AutoSelectNewTabs))
+ tab_contents_visible = true;
+
+ if (tab_appearing && !(tab_bar_appearing && !tab_is_new))
+ {
+ PushItemFlag(ImGuiItemFlags_NoNav | ImGuiItemFlags_NoNavDefaultFocus, true);
+ ItemAdd(ImRect(), id);
+ PopItemFlag();
+ return tab_contents_visible;
+ }
+
+ if (tab_bar->SelectedTabId == id)
+ tab->LastFrameSelected = g.FrameCount;
+
+ // Backup current layout position
+ const ImVec2 backup_main_cursor_pos = window->DC.CursorPos;
+
+ // Layout
+ size.x = tab->Width;
+ window->DC.CursorPos = tab_bar->BarRect.Min + ImVec2(IM_FLOOR(tab->Offset - tab_bar->ScrollingAnim), 0.0f);
+ ImVec2 pos = window->DC.CursorPos;
+ ImRect bb(pos, pos + size);
+
+ // We don't have CPU clipping primitives to clip the CloseButton (until it becomes a texture), so need to add an extra draw call (temporary in the case of vertical animation)
+ bool want_clip_rect = (bb.Min.x < tab_bar->BarRect.Min.x) || (bb.Max.x > tab_bar->BarRect.Max.x);
+ if (want_clip_rect)
+ PushClipRect(ImVec2(ImMax(bb.Min.x, tab_bar->BarRect.Min.x), bb.Min.y - 1), ImVec2(tab_bar->BarRect.Max.x, bb.Max.y), true);
+
+ ImVec2 backup_cursor_max_pos = window->DC.CursorMaxPos;
+ ItemSize(bb.GetSize(), style.FramePadding.y);
+ window->DC.CursorMaxPos = backup_cursor_max_pos;
+
+ if (!ItemAdd(bb, id))
+ {
+ if (want_clip_rect)
+ PopClipRect();
+ window->DC.CursorPos = backup_main_cursor_pos;
+ return tab_contents_visible;
+ }
+
+ // Click to Select a tab
+ ImGuiButtonFlags button_flags = (ImGuiButtonFlags_PressedOnClick | ImGuiButtonFlags_AllowItemOverlap);
+ if (g.DragDropActive)
+ button_flags |= ImGuiButtonFlags_PressedOnDragDropHold;
+ bool hovered, held;
+ bool pressed = ButtonBehavior(bb, id, &hovered, &held, button_flags);
+ if (pressed)
+ tab_bar->NextSelectedTabId = id;
+ hovered |= (g.HoveredId == id);
+
+ // Allow the close button to overlap unless we are dragging (in which case we don't want any overlapping tabs to be hovered)
+ if (!held)
+ SetItemAllowOverlap();
+
+ // Drag and drop: re-order tabs
+ if (held && !tab_appearing && IsMouseDragging(0))
+ {
+ if (!g.DragDropActive && (tab_bar->Flags & ImGuiTabBarFlags_Reorderable))
+ {
+ // While moving a tab it will jump on the other side of the mouse, so we also test for MouseDelta.x
+ if (g.IO.MouseDelta.x < 0.0f && g.IO.MousePos.x < bb.Min.x)
+ {
+ if (tab_bar->Flags & ImGuiTabBarFlags_Reorderable)
+ TabBarQueueChangeTabOrder(tab_bar, tab, -1);
+ }
+ else if (g.IO.MouseDelta.x > 0.0f && g.IO.MousePos.x > bb.Max.x)
+ {
+ if (tab_bar->Flags & ImGuiTabBarFlags_Reorderable)
+ TabBarQueueChangeTabOrder(tab_bar, tab, +1);
+ }
+ }
+ }
+
+#if 0
+ if (hovered && g.HoveredIdNotActiveTimer > 0.50f && bb.GetWidth() < tab->ContentWidth)
+ {
+ // Enlarge tab display when hovering
+ bb.Max.x = bb.Min.x + IM_FLOOR(ImLerp(bb.GetWidth(), tab->ContentWidth, ImSaturate((g.HoveredIdNotActiveTimer - 0.40f) * 6.0f)));
+ display_draw_list = GetForegroundDrawList(window);
+ TabItemBackground(display_draw_list, bb, flags, GetColorU32(ImGuiCol_TitleBgActive));
+ }
+#endif
+
+ // Render tab shape
+ ImDrawList* display_draw_list = window->DrawList;
+ const ImU32 tab_col = GetColorU32((held || hovered) ? ImGuiCol_TabHovered : tab_contents_visible ? (tab_bar_focused ? ImGuiCol_TabActive : ImGuiCol_TabUnfocusedActive) : (tab_bar_focused ? ImGuiCol_Tab : ImGuiCol_TabUnfocused));
+ TabItemBackground(display_draw_list, bb, flags, tab_col);
+ RenderNavHighlight(bb, id);
+
+ // Select with right mouse button. This is so the common idiom for context menu automatically highlight the current widget.
+ const bool hovered_unblocked = IsItemHovered(ImGuiHoveredFlags_AllowWhenBlockedByPopup);
+ if (hovered_unblocked && (IsMouseClicked(1) || IsMouseReleased(1)))
+ tab_bar->NextSelectedTabId = id;
+
+ if (tab_bar->Flags & ImGuiTabBarFlags_NoCloseWithMiddleMouseButton)
+ flags |= ImGuiTabItemFlags_NoCloseWithMiddleMouseButton;
+
+ // Render tab label, process close button
+ const ImGuiID close_button_id = p_open ? window->GetID((void*)((intptr_t)id + 1)) : 0;
+ bool just_closed = TabItemLabelAndCloseButton(display_draw_list, bb, flags, tab_bar->FramePadding, label, id, close_button_id);
+ if (just_closed && p_open != NULL)
+ {
+ *p_open = false;
+ TabBarCloseTab(tab_bar, tab);
+ }
+
+ // Restore main window position so user can draw there
+ if (want_clip_rect)
+ PopClipRect();
+ window->DC.CursorPos = backup_main_cursor_pos;
+
+ // Tooltip (FIXME: Won't work over the close button because ItemOverlap systems messes up with HoveredIdTimer)
+ // We test IsItemHovered() to discard e.g. when another item is active or drag and drop over the tab bar (which g.HoveredId ignores)
+ if (g.HoveredId == id && !held && g.HoveredIdNotActiveTimer > 0.50f && IsItemHovered())
+ if (!(tab_bar->Flags & ImGuiTabBarFlags_NoTooltip))
+ SetTooltip("%.*s", (int)(FindRenderedTextEnd(label) - label), label);
+
+ return tab_contents_visible;
+}
+
+// [Public] This is call is 100% optional but it allows to remove some one-frame glitches when a tab has been unexpectedly removed.
+// To use it to need to call the function SetTabItemClosed() after BeginTabBar() and before any call to BeginTabItem()
+void ImGui::SetTabItemClosed(const char* label)
+{
+ ImGuiContext& g = *GImGui;
+ bool is_within_manual_tab_bar = g.CurrentTabBar && !(g.CurrentTabBar->Flags & ImGuiTabBarFlags_DockNode);
+ if (is_within_manual_tab_bar)
+ {
+ ImGuiTabBar* tab_bar = g.CurrentTabBar;
+ IM_ASSERT(tab_bar->WantLayout); // Needs to be called AFTER BeginTabBar() and BEFORE the first call to BeginTabItem()
+ ImGuiID tab_id = TabBarCalcTabID(tab_bar, label);
+ TabBarRemoveTab(tab_bar, tab_id);
+ }
+}
+
+ImVec2 ImGui::TabItemCalcSize(const char* label, bool has_close_button)
+{
+ ImGuiContext& g = *GImGui;
+ ImVec2 label_size = CalcTextSize(label, NULL, true);
+ ImVec2 size = ImVec2(label_size.x + g.Style.FramePadding.x, label_size.y + g.Style.FramePadding.y * 2.0f);
+ if (has_close_button)
+ size.x += g.Style.FramePadding.x + (g.Style.ItemInnerSpacing.x + g.FontSize); // We use Y intentionally to fit the close button circle.
+ else
+ size.x += g.Style.FramePadding.x + 1.0f;
+ return ImVec2(ImMin(size.x, TabBarCalcMaxTabWidth()), size.y);
+}
+
+void ImGui::TabItemBackground(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImU32 col)
+{
+ // While rendering tabs, we trim 1 pixel off the top of our bounding box so they can fit within a regular frame height while looking "detached" from it.
+ ImGuiContext& g = *GImGui;
+ const float width = bb.GetWidth();
+ IM_UNUSED(flags);
+ IM_ASSERT(width > 0.0f);
+ const float rounding = ImMax(0.0f, ImMin(g.Style.TabRounding, width * 0.5f - 1.0f));
+ const float y1 = bb.Min.y + 1.0f;
+ const float y2 = bb.Max.y - 1.0f;
+ draw_list->PathLineTo(ImVec2(bb.Min.x, y2));
+ draw_list->PathArcToFast(ImVec2(bb.Min.x + rounding, y1 + rounding), rounding, 6, 9);
+ draw_list->PathArcToFast(ImVec2(bb.Max.x - rounding, y1 + rounding), rounding, 9, 12);
+ draw_list->PathLineTo(ImVec2(bb.Max.x, y2));
+ draw_list->PathFillConvex(col);
+ if (g.Style.TabBorderSize > 0.0f)
+ {
+ draw_list->PathLineTo(ImVec2(bb.Min.x + 0.5f, y2));
+ draw_list->PathArcToFast(ImVec2(bb.Min.x + rounding + 0.5f, y1 + rounding + 0.5f), rounding, 6, 9);
+ draw_list->PathArcToFast(ImVec2(bb.Max.x - rounding - 0.5f, y1 + rounding + 0.5f), rounding, 9, 12);
+ draw_list->PathLineTo(ImVec2(bb.Max.x - 0.5f, y2));
+ draw_list->PathStroke(GetColorU32(ImGuiCol_Border), false, g.Style.TabBorderSize);
+ }
+}
+
+// Render text label (with custom clipping) + Unsaved Document marker + Close Button logic
+// We tend to lock style.FramePadding for a given tab-bar, hence the 'frame_padding' parameter.
+bool ImGui::TabItemLabelAndCloseButton(ImDrawList* draw_list, const ImRect& bb, ImGuiTabItemFlags flags, ImVec2 frame_padding, const char* label, ImGuiID tab_id, ImGuiID close_button_id)
+{
+ ImGuiContext& g = *GImGui;
+ ImVec2 label_size = CalcTextSize(label, NULL, true);
+ if (bb.GetWidth() <= 1.0f)
+ return false;
+
+ // Render text label (with clipping + alpha gradient) + unsaved marker
+ const char* TAB_UNSAVED_MARKER = "*";
+ ImRect text_pixel_clip_bb(bb.Min.x + frame_padding.x, bb.Min.y + frame_padding.y, bb.Max.x - frame_padding.x, bb.Max.y);
+ if (flags & ImGuiTabItemFlags_UnsavedDocument)
+ {
+ text_pixel_clip_bb.Max.x -= CalcTextSize(TAB_UNSAVED_MARKER, NULL, false).x;
+ ImVec2 unsaved_marker_pos(ImMin(bb.Min.x + frame_padding.x + label_size.x + 2, text_pixel_clip_bb.Max.x), bb.Min.y + frame_padding.y + IM_FLOOR(-g.FontSize * 0.25f));
+ RenderTextClippedEx(draw_list, unsaved_marker_pos, bb.Max - frame_padding, TAB_UNSAVED_MARKER, NULL, NULL);
+ }
+ ImRect text_ellipsis_clip_bb = text_pixel_clip_bb;
+
+ // Close Button
+ // We are relying on a subtle and confusing distinction between 'hovered' and 'g.HoveredId' which happens because we are using ImGuiButtonFlags_AllowOverlapMode + SetItemAllowOverlap()
+ // 'hovered' will be true when hovering the Tab but NOT when hovering the close button
+ // 'g.HoveredId==id' will be true when hovering the Tab including when hovering the close button
+ // 'g.ActiveId==close_button_id' will be true when we are holding on the close button, in which case both hovered booleans are false
+ bool close_button_pressed = false;
+ bool close_button_visible = false;
+ if (close_button_id != 0)
+ if (g.HoveredId == tab_id || g.HoveredId == close_button_id || g.ActiveId == close_button_id)
+ close_button_visible = true;
+ if (close_button_visible)
+ {
+ ImGuiItemHoveredDataBackup last_item_backup;
+ const float close_button_sz = g.FontSize;
+ PushStyleVar(ImGuiStyleVar_FramePadding, frame_padding);
+ if (CloseButton(close_button_id, ImVec2(bb.Max.x - frame_padding.x * 2.0f - close_button_sz, bb.Min.y)))
+ close_button_pressed = true;
+ PopStyleVar();
+ last_item_backup.Restore();
+
+ // Close with middle mouse button
+ if (!(flags & ImGuiTabItemFlags_NoCloseWithMiddleMouseButton) && IsMouseClicked(2))
+ close_button_pressed = true;
+
+ text_pixel_clip_bb.Max.x -= close_button_sz;
+ }
+
+ float ellipsis_max_x = close_button_visible ? text_pixel_clip_bb.Max.x : bb.Max.x - 1.0f;
+ RenderTextEllipsis(draw_list, text_ellipsis_clip_bb.Min, text_ellipsis_clip_bb.Max, text_pixel_clip_bb.Max.x, ellipsis_max_x, label, NULL, &label_size);
+
+ return close_button_pressed;
+}
+
+
+//-------------------------------------------------------------------------
+// [SECTION] Widgets: Columns, BeginColumns, EndColumns, etc.
+// In the current version, Columns are very weak. Needs to be replaced with a more full-featured system.
+//-------------------------------------------------------------------------
+// - GetColumnIndex()
+// - GetColumnCount()
+// - GetColumnOffset()
+// - GetColumnWidth()
+// - SetColumnOffset()
+// - SetColumnWidth()
+// - PushColumnClipRect() [Internal]
+// - PushColumnsBackground() [Internal]
+// - PopColumnsBackground() [Internal]
+// - FindOrCreateColumns() [Internal]
+// - GetColumnsID() [Internal]
+// - BeginColumns()
+// - NextColumn()
+// - EndColumns()
+// - Columns()
+//-------------------------------------------------------------------------
+
+int ImGui::GetColumnIndex()
+{
+ ImGuiWindow* window = GetCurrentWindowRead();
+ return window->DC.CurrentColumns ? window->DC.CurrentColumns->Current : 0;
+}
+
+int ImGui::GetColumnsCount()
+{
+ ImGuiWindow* window = GetCurrentWindowRead();
+ return window->DC.CurrentColumns ? window->DC.CurrentColumns->Count : 1;
+}
+
+float ImGui::GetColumnOffsetFromNorm(const ImGuiColumns* columns, float offset_norm)
+{
+ return offset_norm * (columns->OffMaxX - columns->OffMinX);
+}
+
+float ImGui::GetColumnNormFromOffset(const ImGuiColumns* columns, float offset)
+{
+ return offset / (columns->OffMaxX - columns->OffMinX);
+}
+
+static const float COLUMNS_HIT_RECT_HALF_WIDTH = 4.0f;
+
+static float GetDraggedColumnOffset(ImGuiColumns* columns, int column_index)
+{
+ // Active (dragged) column always follow mouse. The reason we need this is that dragging a column to the right edge of an auto-resizing
+ // window creates a feedback loop because we store normalized positions. So while dragging we enforce absolute positioning.
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ IM_ASSERT(column_index > 0); // We are not supposed to drag column 0.
+ IM_ASSERT(g.ActiveId == columns->ID + ImGuiID(column_index));
+
+ float x = g.IO.MousePos.x - g.ActiveIdClickOffset.x + COLUMNS_HIT_RECT_HALF_WIDTH - window->Pos.x;
+ x = ImMax(x, ImGui::GetColumnOffset(column_index - 1) + g.Style.ColumnsMinSpacing);
+ if ((columns->Flags & ImGuiColumnsFlags_NoPreserveWidths))
+ x = ImMin(x, ImGui::GetColumnOffset(column_index + 1) - g.Style.ColumnsMinSpacing);
+
+ return x;
+}
+
+float ImGui::GetColumnOffset(int column_index)
+{
+ ImGuiWindow* window = GetCurrentWindowRead();
+ ImGuiColumns* columns = window->DC.CurrentColumns;
+ if (columns == NULL)
+ return 0.0f;
+
+ if (column_index < 0)
+ column_index = columns->Current;
+ IM_ASSERT(column_index < columns->Columns.Size);
+
+ const float t = columns->Columns[column_index].OffsetNorm;
+ const float x_offset = ImLerp(columns->OffMinX, columns->OffMaxX, t);
+ return x_offset;
+}
+
+static float GetColumnWidthEx(ImGuiColumns* columns, int column_index, bool before_resize = false)
+{
+ if (column_index < 0)
+ column_index = columns->Current;
+
+ float offset_norm;
+ if (before_resize)
+ offset_norm = columns->Columns[column_index + 1].OffsetNormBeforeResize - columns->Columns[column_index].OffsetNormBeforeResize;
+ else
+ offset_norm = columns->Columns[column_index + 1].OffsetNorm - columns->Columns[column_index].OffsetNorm;
+ return ImGui::GetColumnOffsetFromNorm(columns, offset_norm);
+}
+
+float ImGui::GetColumnWidth(int column_index)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ ImGuiColumns* columns = window->DC.CurrentColumns;
+ if (columns == NULL)
+ return GetContentRegionAvail().x;
+
+ if (column_index < 0)
+ column_index = columns->Current;
+ return GetColumnOffsetFromNorm(columns, columns->Columns[column_index + 1].OffsetNorm - columns->Columns[column_index].OffsetNorm);
+}
+
+void ImGui::SetColumnOffset(int column_index, float offset)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+ ImGuiColumns* columns = window->DC.CurrentColumns;
+ IM_ASSERT(columns != NULL);
+
+ if (column_index < 0)
+ column_index = columns->Current;
+ IM_ASSERT(column_index < columns->Columns.Size);
+
+ const bool preserve_width = !(columns->Flags & ImGuiColumnsFlags_NoPreserveWidths) && (column_index < columns->Count-1);
+ const float width = preserve_width ? GetColumnWidthEx(columns, column_index, columns->IsBeingResized) : 0.0f;
+
+ if (!(columns->Flags & ImGuiColumnsFlags_NoForceWithinWindow))
+ offset = ImMin(offset, columns->OffMaxX - g.Style.ColumnsMinSpacing * (columns->Count - column_index));
+ columns->Columns[column_index].OffsetNorm = GetColumnNormFromOffset(columns, offset - columns->OffMinX);
+
+ if (preserve_width)
+ SetColumnOffset(column_index + 1, offset + ImMax(g.Style.ColumnsMinSpacing, width));
+}
+
+void ImGui::SetColumnWidth(int column_index, float width)
+{
+ ImGuiWindow* window = GetCurrentWindowRead();
+ ImGuiColumns* columns = window->DC.CurrentColumns;
+ IM_ASSERT(columns != NULL);
+
+ if (column_index < 0)
+ column_index = columns->Current;
+ SetColumnOffset(column_index + 1, GetColumnOffset(column_index) + width);
+}
+
+void ImGui::PushColumnClipRect(int column_index)
+{
+ ImGuiWindow* window = GetCurrentWindowRead();
+ ImGuiColumns* columns = window->DC.CurrentColumns;
+ if (column_index < 0)
+ column_index = columns->Current;
+
+ ImGuiColumnData* column = &columns->Columns[column_index];
+ PushClipRect(column->ClipRect.Min, column->ClipRect.Max, false);
+}
+
+// Get into the columns background draw command (which is generally the same draw command as before we called BeginColumns)
+void ImGui::PushColumnsBackground()
+{
+ ImGuiWindow* window = GetCurrentWindowRead();
+ ImGuiColumns* columns = window->DC.CurrentColumns;
+ if (columns->Count == 1)
+ return;
+ columns->Splitter.SetCurrentChannel(window->DrawList, 0);
+ int cmd_size = window->DrawList->CmdBuffer.Size;
+ PushClipRect(columns->HostClipRect.Min, columns->HostClipRect.Max, false);
+ IM_UNUSED(cmd_size);
+ IM_ASSERT(cmd_size == window->DrawList->CmdBuffer.Size); // Being in channel 0 this should not have created an ImDrawCmd
+}
+
+void ImGui::PopColumnsBackground()
+{
+ ImGuiWindow* window = GetCurrentWindowRead();
+ ImGuiColumns* columns = window->DC.CurrentColumns;
+ if (columns->Count == 1)
+ return;
+ columns->Splitter.SetCurrentChannel(window->DrawList, columns->Current + 1);
+ PopClipRect();
+}
+
+ImGuiColumns* ImGui::FindOrCreateColumns(ImGuiWindow* window, ImGuiID id)
+{
+ // We have few columns per window so for now we don't need bother much with turning this into a faster lookup.
+ for (int n = 0; n < window->ColumnsStorage.Size; n++)
+ if (window->ColumnsStorage[n].ID == id)
+ return &window->ColumnsStorage[n];
+
+ window->ColumnsStorage.push_back(ImGuiColumns());
+ ImGuiColumns* columns = &window->ColumnsStorage.back();
+ columns->ID = id;
+ return columns;
+}
+
+ImGuiID ImGui::GetColumnsID(const char* str_id, int columns_count)
+{
+ ImGuiWindow* window = GetCurrentWindow();
+
+ // Differentiate column ID with an arbitrary prefix for cases where users name their columns set the same as another widget.
+ // In addition, when an identifier isn't explicitly provided we include the number of columns in the hash to make it uniquer.
+ PushID(0x11223347 + (str_id ? 0 : columns_count));
+ ImGuiID id = window->GetID(str_id ? str_id : "columns");
+ PopID();
+
+ return id;
+}
+
+void ImGui::BeginColumns(const char* str_id, int columns_count, ImGuiColumnsFlags flags)
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = GetCurrentWindow();
+
+ IM_ASSERT(columns_count >= 1 && columns_count <= 64); // Maximum 64 columns
+ IM_ASSERT(window->DC.CurrentColumns == NULL); // Nested columns are currently not supported
+
+ // Acquire storage for the columns set
+ ImGuiID id = GetColumnsID(str_id, columns_count);
+ ImGuiColumns* columns = FindOrCreateColumns(window, id);
+ IM_ASSERT(columns->ID == id);
+ columns->Current = 0;
+ columns->Count = columns_count;
+ columns->Flags = flags;
+ window->DC.CurrentColumns = columns;
+
+ columns->HostCursorPosY = window->DC.CursorPos.y;
+ columns->HostCursorMaxPosX = window->DC.CursorMaxPos.x;
+ columns->HostClipRect = window->ClipRect;
+ columns->HostWorkRect = window->WorkRect;
+
+ // Set state for first column
+ // We aim so that the right-most column will have the same clipping width as other after being clipped by parent ClipRect
+ const float column_padding = g.Style.ItemSpacing.x;
+ const float half_clip_extend_x = ImFloor(ImMax(window->WindowPadding.x * 0.5f, window->WindowBorderSize));
+ const float max_1 = window->WorkRect.Max.x + column_padding - ImMax(column_padding - window->WindowPadding.x, 0.0f);
+ const float max_2 = window->WorkRect.Max.x + half_clip_extend_x;
+ columns->OffMinX = window->DC.Indent.x - column_padding + ImMax(column_padding - window->WindowPadding.x, 0.0f);
+ columns->OffMaxX = ImMax(ImMin(max_1, max_2) - window->Pos.x, columns->OffMinX + 1.0f);
+ columns->LineMinY = columns->LineMaxY = window->DC.CursorPos.y;
+
+ // Clear data if columns count changed
+ if (columns->Columns.Size != 0 && columns->Columns.Size != columns_count + 1)
+ columns->Columns.resize(0);
+
+ // Initialize default widths
+ columns->IsFirstFrame = (columns->Columns.Size == 0);
+ if (columns->Columns.Size == 0)
+ {
+ columns->Columns.reserve(columns_count + 1);
+ for (int n = 0; n < columns_count + 1; n++)
+ {
+ ImGuiColumnData column;
+ column.OffsetNorm = n / (float)columns_count;
+ columns->Columns.push_back(column);
+ }
+ }
+
+ for (int n = 0; n < columns_count; n++)
+ {
+ // Compute clipping rectangle
+ ImGuiColumnData* column = &columns->Columns[n];
+ float clip_x1 = IM_ROUND(window->Pos.x + GetColumnOffset(n));
+ float clip_x2 = IM_ROUND(window->Pos.x + GetColumnOffset(n + 1) - 1.0f);
+ column->ClipRect = ImRect(clip_x1, -FLT_MAX, clip_x2, +FLT_MAX);
+ column->ClipRect.ClipWith(window->ClipRect);
+ }
+
+ if (columns->Count > 1)
+ {
+ columns->Splitter.Split(window->DrawList, 1 + columns->Count);
+ columns->Splitter.SetCurrentChannel(window->DrawList, 1);
+ PushColumnClipRect(0);
+ }
+
+ // We don't generally store Indent.x inside ColumnsOffset because it may be manipulated by the user.
+ float offset_0 = GetColumnOffset(columns->Current);
+ float offset_1 = GetColumnOffset(columns->Current + 1);
+ float width = offset_1 - offset_0;
+ PushItemWidth(width * 0.65f);
+ window->DC.ColumnsOffset.x = ImMax(column_padding - window->WindowPadding.x, 0.0f);
+ window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x);
+ window->WorkRect.Max.x = window->Pos.x + offset_1 - column_padding;
+}
+
+void ImGui::NextColumn()
+{
+ ImGuiWindow* window = GetCurrentWindow();
+ if (window->SkipItems || window->DC.CurrentColumns == NULL)
+ return;
+
+ ImGuiContext& g = *GImGui;
+ ImGuiColumns* columns = window->DC.CurrentColumns;
+
+ if (columns->Count == 1)
+ {
+ window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x);
+ IM_ASSERT(columns->Current == 0);
+ return;
+ }
+ PopItemWidth();
+ PopClipRect();
+
+ const float column_padding = g.Style.ItemSpacing.x;
+ columns->LineMaxY = ImMax(columns->LineMaxY, window->DC.CursorPos.y);
+ if (++columns->Current < columns->Count)
+ {
+ // Columns 1+ ignore IndentX (by canceling it out)
+ // FIXME-COLUMNS: Unnecessary, could be locked?
+ window->DC.ColumnsOffset.x = GetColumnOffset(columns->Current) - window->DC.Indent.x + column_padding;
+ columns->Splitter.SetCurrentChannel(window->DrawList, columns->Current + 1);
+ }
+ else
+ {
+ // New row/line
+ // Column 0 honor IndentX
+ window->DC.ColumnsOffset.x = ImMax(column_padding - window->WindowPadding.x, 0.0f);
+ columns->Splitter.SetCurrentChannel(window->DrawList, 1);
+ columns->Current = 0;
+ columns->LineMinY = columns->LineMaxY;
+ }
+ window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x);
+ window->DC.CursorPos.y = columns->LineMinY;
+ window->DC.CurrLineSize = ImVec2(0.0f, 0.0f);
+ window->DC.CurrLineTextBaseOffset = 0.0f;
+
+ PushColumnClipRect(columns->Current); // FIXME-COLUMNS: Could it be an overwrite?
+
+ // FIXME-COLUMNS: Share code with BeginColumns() - move code on columns setup.
+ float offset_0 = GetColumnOffset(columns->Current);
+ float offset_1 = GetColumnOffset(columns->Current + 1);
+ float width = offset_1 - offset_0;
+ PushItemWidth(width * 0.65f);
+ window->WorkRect.Max.x = window->Pos.x + offset_1 - column_padding;
+}
+
+void ImGui::EndColumns()
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = GetCurrentWindow();
+ ImGuiColumns* columns = window->DC.CurrentColumns;
+ IM_ASSERT(columns != NULL);
+
+ PopItemWidth();
+ if (columns->Count > 1)
+ {
+ PopClipRect();
+ columns->Splitter.Merge(window->DrawList);
+ }
+
+ const ImGuiColumnsFlags flags = columns->Flags;
+ columns->LineMaxY = ImMax(columns->LineMaxY, window->DC.CursorPos.y);
+ window->DC.CursorPos.y = columns->LineMaxY;
+ if (!(flags & ImGuiColumnsFlags_GrowParentContentsSize))
+ window->DC.CursorMaxPos.x = columns->HostCursorMaxPosX; // Restore cursor max pos, as columns don't grow parent
+
+ // Draw columns borders and handle resize
+ // The IsBeingResized flag ensure we preserve pre-resize columns width so back-and-forth are not lossy
+ bool is_being_resized = false;
+ if (!(flags & ImGuiColumnsFlags_NoBorder) && !window->SkipItems)
+ {
+ // We clip Y boundaries CPU side because very long triangles are mishandled by some GPU drivers.
+ const float y1 = ImMax(columns->HostCursorPosY, window->ClipRect.Min.y);
+ const float y2 = ImMin(window->DC.CursorPos.y, window->ClipRect.Max.y);
+ int dragging_column = -1;
+ for (int n = 1; n < columns->Count; n++)
+ {
+ ImGuiColumnData* column = &columns->Columns[n];
+ float x = window->Pos.x + GetColumnOffset(n);
+ const ImGuiID column_id = columns->ID + ImGuiID(n);
+ const float column_hit_hw = COLUMNS_HIT_RECT_HALF_WIDTH;
+ const ImRect column_hit_rect(ImVec2(x - column_hit_hw, y1), ImVec2(x + column_hit_hw, y2));
+ KeepAliveID(column_id);
+ if (IsClippedEx(column_hit_rect, column_id, false))
+ continue;
+
+ bool hovered = false, held = false;
+ if (!(flags & ImGuiColumnsFlags_NoResize))
+ {
+ ButtonBehavior(column_hit_rect, column_id, &hovered, &held);
+ if (hovered || held)
+ g.MouseCursor = ImGuiMouseCursor_ResizeEW;
+ if (held && !(column->Flags & ImGuiColumnsFlags_NoResize))
+ dragging_column = n;
+ }
+
+ // Draw column
+ const ImU32 col = GetColorU32(held ? ImGuiCol_SeparatorActive : hovered ? ImGuiCol_SeparatorHovered : ImGuiCol_Separator);
+ const float xi = IM_FLOOR(x);
+ window->DrawList->AddLine(ImVec2(xi, y1 + 1.0f), ImVec2(xi, y2), col);
+ }
+
+ // Apply dragging after drawing the column lines, so our rendered lines are in sync with how items were displayed during the frame.
+ if (dragging_column != -1)
+ {
+ if (!columns->IsBeingResized)
+ for (int n = 0; n < columns->Count + 1; n++)
+ columns->Columns[n].OffsetNormBeforeResize = columns->Columns[n].OffsetNorm;
+ columns->IsBeingResized = is_being_resized = true;
+ float x = GetDraggedColumnOffset(columns, dragging_column);
+ SetColumnOffset(dragging_column, x);
+ }
+ }
+ columns->IsBeingResized = is_being_resized;
+
+ window->WorkRect = columns->HostWorkRect;
+ window->DC.CurrentColumns = NULL;
+ window->DC.ColumnsOffset.x = 0.0f;
+ window->DC.CursorPos.x = IM_FLOOR(window->Pos.x + window->DC.Indent.x + window->DC.ColumnsOffset.x);
+}
+
+// [2018-03: This is currently the only public API, while we are working on making BeginColumns/EndColumns user-facing]
+void ImGui::Columns(int columns_count, const char* id, bool border)
+{
+ ImGuiWindow* window = GetCurrentWindow();
+ IM_ASSERT(columns_count >= 1);
+
+ ImGuiColumnsFlags flags = (border ? 0 : ImGuiColumnsFlags_NoBorder);
+ //flags |= ImGuiColumnsFlags_NoPreserveWidths; // NB: Legacy behavior
+ ImGuiColumns* columns = window->DC.CurrentColumns;
+ if (columns != NULL && columns->Count == columns_count && columns->Flags == flags)
+ return;
+
+ if (columns != NULL)
+ EndColumns();
+
+ if (columns_count != 1)
+ BeginColumns(id, columns_count, flags);
+}
+
+//-------------------------------------------------------------------------
+
+#endif // #ifndef IMGUI_DISABLE
diff --git a/src/imgui/imstb_rectpack.h b/src/imgui/imstb_rectpack.h
index 2b07dcc82..ff2a85df4 100644
--- a/src/imgui/imstb_rectpack.h
+++ b/src/imgui/imstb_rectpack.h
@@ -1,4 +1,10 @@
-// stb_rect_pack.h - v0.11 - public domain - rectangle packing
+// [DEAR IMGUI]
+// This is a slightly modified version of stb_rect_pack.h 1.00.
+// Those changes would need to be pushed into nothings/stb:
+// - Added STBRP__CDECL
+// Grep for [DEAR IMGUI] to find the changes.
+
+// stb_rect_pack.h - v1.00 - public domain - rectangle packing
// Sean Barrett 2014
//
// Useful for e.g. packing rectangular textures into an atlas.
@@ -31,9 +37,12 @@
//
// Bugfixes / warning fixes
// Jeremy Jaussaud
+// Fabian Giesen
//
// Version history:
//
+// 1.00 (2019-02-25) avoid small space waste; gracefully fail too-wide rectangles
+// 0.99 (2019-02-07) warning fixes
// 0.11 (2017-03-03) return packing success/fail result
// 0.10 (2016-10-25) remove cast-away-const to avoid warnings
// 0.09 (2016-08-27) fix compiler warnings
@@ -204,6 +213,7 @@ struct stbrp_context
#define STBRP_ASSERT assert
#endif
+// [DEAR IMGUI] Added STBRP__CDECL
#ifdef _MSC_VER
#define STBRP__NOTUSED(v) (void)(v)
#define STBRP__CDECL __cdecl
@@ -349,6 +359,13 @@ static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context *c, int widt
width -= width % c->align;
STBRP_ASSERT(width % c->align == 0);
+ // if it can't possibly fit, bail immediately
+ if (width > c->width || height > c->height) {
+ fr.prev_link = NULL;
+ fr.x = fr.y = 0;
+ return fr;
+ }
+
node = c->active_head;
prev = &c->active_head;
while (node->x + width <= c->width) {
@@ -412,7 +429,7 @@ static stbrp__findresult stbrp__skyline_find_best_pos(stbrp_context *c, int widt
}
STBRP_ASSERT(node->next->x > xpos && node->x <= xpos);
y = stbrp__skyline_find_min_y(c, node, xpos, width, &waste);
- if (y + height < c->height) {
+ if (y + height <= c->height) {
if (y <= best_y) {
if (y < best_y || waste < best_waste || (waste==best_waste && xpos < best_x)) {
best_x = xpos;
@@ -512,6 +529,7 @@ static stbrp__findresult stbrp__skyline_pack_rectangle(stbrp_context *context, i
return res;
}
+// [DEAR IMGUI] Added STBRP__CDECL
static int STBRP__CDECL rect_height_compare(const void *a, const void *b)
{
const stbrp_rect *p = (const stbrp_rect *) a;
@@ -523,6 +541,7 @@ static int STBRP__CDECL rect_height_compare(const void *a, const void *b)
return (p->w > q->w) ? -1 : (p->w < q->w);
}
+// [DEAR IMGUI] Added STBRP__CDECL
static int STBRP__CDECL rect_original_order(const void *a, const void *b)
{
const stbrp_rect *p = (const stbrp_rect *) a;
@@ -543,9 +562,6 @@ STBRP_DEF int stbrp_pack_rects(stbrp_context *context, stbrp_rect *rects, int nu
// we use the 'was_packed' field internally to allow sorting/unsorting
for (i=0; i < num_rects; ++i) {
rects[i].was_packed = i;
- #ifndef STBRP_LARGE_RECTS
- STBRP_ASSERT(rects[i].w <= 0xffff && rects[i].h <= 0xffff);
- #endif
}
// sort according to heuristic
diff --git a/src/imgui/imstb_textedit.h b/src/imgui/imstb_textedit.h
index 9e12469be..2077d02ae 100644
--- a/src/imgui/imstb_textedit.h
+++ b/src/imgui/imstb_textedit.h
@@ -1,9 +1,10 @@
-// [ImGui] this is a slightly modified version of stb_textedit.h 1.12. Those changes would need to be pushed into nothings/stb
-// [ImGui] - 2018-06: fixed undo/redo after pasting large amount of text (over 32 kb). Redo will still fail when undo buffers are exhausted, but text won't be corrupted (see nothings/stb issue #620)
-// [ImGui] - 2018-06: fix in stb_textedit_discard_redo (see https://github.com/nothings/stb/issues/321)
-// [ImGui] - fixed some minor warnings
+// [DEAR IMGUI]
+// This is a slightly modified version of stb_textedit.h 1.13.
+// Those changes would need to be pushed into nothings/stb:
+// - Fix in stb_textedit_discard_redo (see https://github.com/nothings/stb/issues/321)
+// Grep for [DEAR IMGUI] to find the changes.
-// stb_textedit.h - v1.12 - public domain - Sean Barrett
+// stb_textedit.h - v1.13 - public domain - Sean Barrett
// Development of this library was sponsored by RAD Game Tools
//
// This C header file implements the guts of a multi-line text-editing
@@ -34,6 +35,7 @@
//
// VERSION HISTORY
//
+// 1.13 (2019-02-07) fix bug in undo size management
// 1.12 (2018-01-29) user can change STB_TEXTEDIT_KEYTYPE, fix redo to avoid crash
// 1.11 (2017-03-03) fix HOME on last line, dragging off single-line textfield
// 1.10 (2016-10-25) supress warnings about casting away const with -Wcast-qual
@@ -563,7 +565,6 @@ static void stb_textedit_find_charpos(StbFindState *find, STB_TEXTEDIT_STRING *s
// now scan to find xpos
find->x = r.x0;
- i = 0;
for (i=0; first+i < n; ++i)
find->x += STB_TEXTEDIT_GETWIDTH(str, first, i);
}
@@ -693,7 +694,7 @@ static void stb_textedit_prep_selection_at_cursor(STB_TexteditState *state)
static int stb_textedit_cut(STB_TEXTEDIT_STRING *str, STB_TexteditState *state)
{
if (STB_TEXT_HAS_SELECTION(state)) {
- stb_textedit_delete_selection(str,state); // implicity clamps
+ stb_textedit_delete_selection(str,state); // implicitly clamps
state->has_preferred_x = 0;
return 1;
}
@@ -745,7 +746,7 @@ retry:
state->has_preferred_x = 0;
}
} else {
- stb_textedit_delete_selection(str,state); // implicity clamps
+ stb_textedit_delete_selection(str,state); // implicitly clamps
if (STB_TEXTEDIT_INSERTCHARS(str, state->cursor, &ch, 1)) {
stb_text_makeundo_insert(state, state->cursor, 1);
++state->cursor;
@@ -1133,7 +1134,14 @@ static void stb_textedit_discard_redo(StbUndoState *state)
state->undo_rec[i].char_storage += n;
}
// now move all the redo records towards the end of the buffer; the first one is at 'redo_point'
- STB_TEXTEDIT_memmove(state->undo_rec + state->redo_point+1, state->undo_rec + state->redo_point, (size_t) ((STB_TEXTEDIT_UNDOSTATECOUNT - state->redo_point)*sizeof(state->undo_rec[0])));
+ // {DEAR IMGUI]
+ size_t move_size = (size_t)((STB_TEXTEDIT_UNDOSTATECOUNT - state->redo_point - 1) * sizeof(state->undo_rec[0]));
+ const char* buf_begin = (char*)state->undo_rec; (void)buf_begin;
+ const char* buf_end = (char*)state->undo_rec + sizeof(state->undo_rec); (void)buf_end;
+ IM_ASSERT(((char*)(state->undo_rec + state->redo_point)) >= buf_begin);
+ IM_ASSERT(((char*)(state->undo_rec + state->redo_point + 1) + move_size) <= buf_end);
+ STB_TEXTEDIT_memmove(state->undo_rec + state->redo_point+1, state->undo_rec + state->redo_point, move_size);
+
// now move redo_point to point to the new one
++state->redo_point;
}
diff --git a/src/imgui/imstb_truetype.h b/src/imgui/imstb_truetype.h
index f65deb503..193338afb 100644
--- a/src/imgui/imstb_truetype.h
+++ b/src/imgui/imstb_truetype.h
@@ -1,4 +1,9 @@
-// stb_truetype.h - v1.19 - public domain
+// [DEAR IMGUI]
+// This is a slightly modified version of stb_truetype.h 1.20.
+// Mostly fixing for compiler and static analyzer warnings.
+// Grep for [DEAR IMGUI] to find the changes.
+
+// stb_truetype.h - v1.20 - public domain
// authored from 2009-2016 by Sean Barrett / RAD Game Tools
//
// This library processes TrueType files:
@@ -49,6 +54,7 @@
//
// VERSION HISTORY
//
+// 1.20 (2019-02-07) PackFontRange skips missing codepoints; GetScaleFontVMetrics()
// 1.19 (2018-02-11) GPOS kerning, STBTT_fmod
// 1.18 (2018-01-29) add missing function
// 1.17 (2017-07-23) make more arguments const; doc fix
@@ -75,7 +81,7 @@
//
// USAGE
//
-// Include this file in whatever places neeed to refer to it. In ONE C/C++
+// Include this file in whatever places need to refer to it. In ONE C/C++
// file, write:
// #define STB_TRUETYPE_IMPLEMENTATION
// before the #include of this file. This expands out the actual
@@ -247,8 +253,8 @@
// Documentation & header file 520 LOC \___ 660 LOC documentation
// Sample code 140 LOC /
// Truetype parsing 620 LOC ---- 620 LOC TrueType
-// Software rasterization 240 LOC \ .
-// Curve tesselation 120 LOC \__ 550 LOC Bitmap creation
+// Software rasterization 240 LOC \.
+// Curve tessellation 120 LOC \__ 550 LOC Bitmap creation
// Bitmap management 100 LOC /
// Baked bitmap interface 70 LOC /
// Font name matching & access 150 LOC ---- 150
@@ -556,6 +562,8 @@ STBTT_DEF void stbtt_GetBakedQuad(const stbtt_bakedchar *chardata, int pw, int p
//
// It's inefficient; you might want to c&p it and optimize it.
+STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char *fontdata, int index, float size, float *ascent, float *descent, float *lineGap);
+// Query the font vertical metrics without having to create a font first.
//////////////////////////////////////////////////////////////////////////////
@@ -641,6 +649,12 @@ STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h
// To use with PackFontRangesGather etc., you must set it before calls
// call to PackFontRangesGatherRects.
+STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context *spc, int skip);
+// If skip != 0, this tells stb_truetype to skip any codepoints for which
+// there is no corresponding glyph. If skip=0, which is the default, then
+// codepoints without a glyph recived the font's "missing character" glyph,
+// typically an empty box by convention.
+
STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar *chardata, int pw, int ph, // same data as above
int char_index, // character to display
float *xpos, float *ypos, // pointers to current position in screen pixel space
@@ -669,6 +683,7 @@ struct stbtt_pack_context {
int height;
int stride_in_bytes;
int padding;
+ int skip_missing;
unsigned int h_oversample, v_oversample;
unsigned char *pixels;
void *nodes;
@@ -694,7 +709,7 @@ STBTT_DEF int stbtt_GetFontOffsetForIndex(const unsigned char *data, int index);
// file will only define one font and it always be at offset 0, so it will
// return '0' for index 0, and -1 for all other indices.
-// The following structure is defined publically so you can declare one on
+// The following structure is defined publicly so you can declare one on
// the stack or as a global or etc, but you should treat it as opaque.
struct stbtt_fontinfo
{
@@ -733,6 +748,7 @@ STBTT_DEF int stbtt_FindGlyphIndex(const stbtt_fontinfo *info, int unicode_codep
// and you want a speed-up, call this function with the character you're
// going to process, then use glyph-based functions instead of the
// codepoint-based functions.
+// Returns 0 if the character codepoint is not defined in the font.
//////////////////////////////////////////////////////////////////////////////
@@ -820,7 +836,7 @@ STBTT_DEF int stbtt_GetGlyphShape(const stbtt_fontinfo *info, int glyph_index, s
// returns # of vertices and fills *vertices with the pointer to them
// these are expressed in "unscaled" coordinates
//
-// The shape is a series of countours. Each one starts with
+// The shape is a series of contours. Each one starts with
// a STBTT_moveto, then consists of a series of mixed
// STBTT_lineto and STBTT_curveto segments. A lineto
// draws a line from previous endpoint to its x,y; a curveto
@@ -916,7 +932,7 @@ STBTT_DEF unsigned char * stbtt_GetGlyphSDF(const stbtt_fontinfo *info, float sc
STBTT_DEF unsigned char * stbtt_GetCodepointSDF(const stbtt_fontinfo *info, float scale, int codepoint, int padding, unsigned char onedge_value, float pixel_dist_scale, int *width, int *height, int *xoff, int *yoff);
// These functions compute a discretized SDF field for a single character, suitable for storing
// in a single-channel texture, sampling with bilinear filtering, and testing against
-// larger than some threshhold to produce scalable fonts.
+// larger than some threshold to produce scalable fonts.
// info -- the font
// scale -- controls the size of the resulting SDF bitmap, same as it would be creating a regular bitmap
// glyph/codepoint -- the character to generate the SDF for
@@ -1825,7 +1841,7 @@ static int stbtt__GetGlyphShapeTT(const stbtt_fontinfo *info, int glyph_index, s
if (comp_verts) STBTT_free(comp_verts, info->userdata);
return 0;
}
- if (num_vertices > 0) STBTT_memcpy(tmp, vertices, num_vertices*sizeof(stbtt_vertex));
+ if (num_vertices > 0) STBTT_memcpy(tmp, vertices, num_vertices*sizeof(stbtt_vertex)); //-V595
STBTT_memcpy(tmp+num_vertices, comp_verts, comp_num_verts*sizeof(stbtt_vertex));
if (vertices) STBTT_free(vertices, info->userdata);
vertices = tmp;
@@ -2196,7 +2212,7 @@ static int stbtt__run_charstring(const stbtt_fontinfo *info, int glyph_index, st
} break;
default:
- if (b0 != 255 && b0 != 28 && (b0 < 32 || b0 > 254))
+ if (b0 != 255 && b0 != 28 && (b0 < 32 || b0 > 254)) //-V560
return STBTT__CSERR("reserved operator");
// push immediate
@@ -2368,7 +2384,8 @@ static stbtt_int32 stbtt__GetGlyphClass(stbtt_uint8 *classDefTable, int glyph)
if (glyph >= startGlyphID && glyph < startGlyphID + glyphCount)
return (stbtt_int32)ttUSHORT(classDef1ValueArray + 2 * (glyph - startGlyphID));
- classDefTable = classDef1ValueArray + 2 * glyphCount;
+ // [DEAR IMGUI] Commented to fix static analyzer warning
+ //classDefTable = classDef1ValueArray + 2 * glyphCount;
} break;
case 2: {
@@ -2392,7 +2409,8 @@ static stbtt_int32 stbtt__GetGlyphClass(stbtt_uint8 *classDefTable, int glyph)
return (stbtt_int32)ttUSHORT(classRangeRecord + 4);
}
- classDefTable = classRangeRecords + 6 * classRangeCount;
+ // [DEAR IMGUI] Commented to fix static analyzer warning
+ //classDefTable = classRangeRecords + 6 * classRangeCount;
} break;
default: {
@@ -3024,6 +3042,8 @@ static void stbtt__fill_active_edges_new(float *scanline, float *scanline_fill,
dx = -dx;
dy = -dy;
t = x0, x0 = xb, xb = t;
+ // [DEAR IMGUI] Fix static analyzer warning
+ (void)dx; // [ImGui: fix static analyzer warning]
}
x1 = (int) x_top;
@@ -3161,7 +3181,13 @@ static void stbtt__rasterize_sorted_edges(stbtt__bitmap *result, stbtt__edge *e,
if (e->y0 != e->y1) {
stbtt__active_edge *z = stbtt__new_active(&hh, e, off_x, scan_y_top, userdata);
if (z != NULL) {
- STBTT_assert(z->ey >= scan_y_top);
+ if (j == 0 && off_y != 0) {
+ if (z->ey < scan_y_top) {
+ // this can happen due to subpixel positioning and some kind of fp rounding error i think
+ z->ey = scan_y_top;
+ }
+ }
+ STBTT_assert(z->ey >= scan_y_top); // if we get really unlucky a tiny bit of an edge can be out of bounds
// insert at front
z->next = active;
active = z;
@@ -3230,7 +3256,7 @@ static void stbtt__sort_edges_ins_sort(stbtt__edge *p, int n)
static void stbtt__sort_edges_quicksort(stbtt__edge *p, int n)
{
- /* threshhold for transitioning to insertion sort */
+ /* threshold for transitioning to insertion sort */
while (n > 12) {
stbtt__edge t;
int c01,c12,c,m,i,j;
@@ -3365,7 +3391,7 @@ static void stbtt__add_point(stbtt__point *points, int n, float x, float y)
points[n].y = y;
}
-// tesselate until threshhold p is happy... @TODO warped to compensate for non-linear stretching
+// tessellate until threshold p is happy... @TODO warped to compensate for non-linear stretching
static int stbtt__tesselate_curve(stbtt__point *points, int *num_points, float x0, float y0, float x1, float y1, float x2, float y2, float objspace_flatness_squared, int n)
{
// midpoint
@@ -3790,6 +3816,7 @@ STBTT_DEF int stbtt_PackBegin(stbtt_pack_context *spc, unsigned char *pixels, in
spc->stride_in_bytes = stride_in_bytes != 0 ? stride_in_bytes : pw;
spc->h_oversample = 1;
spc->v_oversample = 1;
+ spc->skip_missing = 0;
stbrp_init_target(context, pw-padding, ph-padding, nodes, num_nodes);
@@ -3815,6 +3842,11 @@ STBTT_DEF void stbtt_PackSetOversampling(stbtt_pack_context *spc, unsigned int h
spc->v_oversample = v_oversample;
}
+STBTT_DEF void stbtt_PackSetSkipMissingCodepoints(stbtt_pack_context *spc, int skip)
+{
+ spc->skip_missing = skip;
+}
+
#define STBTT__OVER_MASK (STBTT_MAX_OVERSAMPLE-1)
static void stbtt__h_prefilter(unsigned char *pixels, int w, int h, int stride_in_bytes, unsigned int kernel_width)
@@ -3968,13 +4000,17 @@ STBTT_DEF int stbtt_PackFontRangesGatherRects(stbtt_pack_context *spc, const stb
int x0,y0,x1,y1;
int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j];
int glyph = stbtt_FindGlyphIndex(info, codepoint);
- stbtt_GetGlyphBitmapBoxSubpixel(info,glyph,
- scale * spc->h_oversample,
- scale * spc->v_oversample,
- 0,0,
- &x0,&y0,&x1,&y1);
- rects[k].w = (stbrp_coord) (x1-x0 + spc->padding + spc->h_oversample-1);
- rects[k].h = (stbrp_coord) (y1-y0 + spc->padding + spc->v_oversample-1);
+ if (glyph == 0 && spc->skip_missing) {
+ rects[k].w = rects[k].h = 0;
+ } else {
+ stbtt_GetGlyphBitmapBoxSubpixel(info,glyph,
+ scale * spc->h_oversample,
+ scale * spc->v_oversample,
+ 0,0,
+ &x0,&y0,&x1,&y1);
+ rects[k].w = (stbrp_coord) (x1-x0 + spc->padding + spc->h_oversample-1);
+ rects[k].h = (stbrp_coord) (y1-y0 + spc->padding + spc->v_oversample-1);
+ }
++k;
}
}
@@ -4027,7 +4063,7 @@ STBTT_DEF int stbtt_PackFontRangesRenderIntoRects(stbtt_pack_context *spc, const
sub_y = stbtt__oversample_shift(spc->v_oversample);
for (j=0; j < ranges[i].num_chars; ++j) {
stbrp_rect *r = &rects[k];
- if (r->was_packed) {
+ if (r->was_packed && r->w != 0 && r->h != 0) {
stbtt_packedchar *bc = &ranges[i].chardata_for_range[j];
int advance, lsb, x0,y0,x1,y1;
int codepoint = ranges[i].array_of_unicode_codepoints == NULL ? ranges[i].first_unicode_codepoint_in_range + j : ranges[i].array_of_unicode_codepoints[j];
@@ -4141,6 +4177,19 @@ STBTT_DEF int stbtt_PackFontRange(stbtt_pack_context *spc, const unsigned char *
return stbtt_PackFontRanges(spc, fontdata, font_index, &range, 1);
}
+STBTT_DEF void stbtt_GetScaledFontVMetrics(const unsigned char *fontdata, int index, float size, float *ascent, float *descent, float *lineGap)
+{
+ int i_ascent, i_descent, i_lineGap;
+ float scale;
+ stbtt_fontinfo info;
+ stbtt_InitFont(&info, fontdata, stbtt_GetFontOffsetForIndex(fontdata, index));
+ scale = size > 0 ? stbtt_ScaleForPixelHeight(&info, size) : stbtt_ScaleForMappingEmToPixels(&info, -size);
+ stbtt_GetFontVMetrics(&info, &i_ascent, &i_descent, &i_lineGap);
+ *ascent = (float) i_ascent * scale;
+ *descent = (float) i_descent * scale;
+ *lineGap = (float) i_lineGap * scale;
+}
+
STBTT_DEF void stbtt_GetPackedQuad(const stbtt_packedchar *chardata, int pw, int ph, int char_index, float *xpos, float *ypos, stbtt_aligned_quad *q, int align_to_integer)
{
float ipw = 1.0f / pw, iph = 1.0f / ph;
@@ -4253,7 +4302,7 @@ static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex
int winding = 0;
orig[0] = x;
- orig[1] = y;
+ //orig[1] = y; // [DEAR IMGUI] commmented double assignment
// make sure y never passes through a vertex of the shape
y_frac = (float) STBTT_fmod(y, 1.0f);
diff --git a/src/libnest2d/LICENSE.txt b/src/libnest2d/LICENSE.txt
index dba13ed2d..07b1d92c0 100644
--- a/src/libnest2d/LICENSE.txt
+++ b/src/libnest2d/LICENSE.txt
@@ -1,661 +1,165 @@
- GNU AFFERO GENERAL PUBLIC LICENSE
- Version 3, 19 November 2007
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
- Preamble
-
- The GNU Affero General Public License is a free, copyleft license for
-software and other kinds of works, specifically designed to ensure
-cooperation with the community in the case of network server software.
-
- The licenses for most software and other practical works are designed
-to take away your freedom to share and change the works. By contrast,
-our General Public Licenses are intended to guarantee your freedom to
-share and change all versions of a program--to make sure it remains free
-software for all its users.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-them if you wish), that you receive source code or can get it if you
-want it, that you can change the software or use pieces of it in new
-free programs, and that you know you can do these things.
-
- Developers that use our General Public Licenses protect your rights
-with two steps: (1) assert copyright on the software, and (2) offer
-you this License which gives you legal permission to copy, distribute
-and/or modify the software.
-
- A secondary benefit of defending all users' freedom is that
-improvements made in alternate versions of the program, if they
-receive widespread use, become available for other developers to
-incorporate. Many developers of free software are heartened and
-encouraged by the resulting cooperation. However, in the case of
-software used on network servers, this result may fail to come about.
-The GNU General Public License permits making a modified version and
-letting the public access it on a server without ever releasing its
-source code to the public.
-
- The GNU Affero General Public License is designed specifically to
-ensure that, in such cases, the modified source code becomes available
-to the community. It requires the operator of a network server to
-provide the source code of the modified version running there to the
-users of that server. Therefore, public use of a modified version, on
-a publicly accessible server, gives the public access to the source
-code of the modified version.
-
- An older license, called the Affero General Public License and
-published by Affero, was designed to accomplish similar goals. This is
-a different license, not a version of the Affero GPL, but Affero has
-released a new version of the Affero GPL which permits relicensing under
-this license.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- TERMS AND CONDITIONS
-
- 0. Definitions.
-
- "This License" refers to version 3 of the GNU Affero General Public License.
-
- "Copyright" also means copyright-like laws that apply to other kinds of
-works, such as semiconductor masks.
-
- "The Program" refers to any copyrightable work licensed under this
-License. Each licensee is addressed as "you". "Licensees" and
-"recipients" may be individuals or organizations.
-
- To "modify" a work means to copy from or adapt all or part of the work
-in a fashion requiring copyright permission, other than the making of an
-exact copy. The resulting work is called a "modified version" of the
-earlier work or a work "based on" the earlier work.
-
- A "covered work" means either the unmodified Program or a work based
-on the Program.
-
- To "propagate" a work means to do anything with it that, without
-permission, would make you directly or secondarily liable for
-infringement under applicable copyright law, except executing it on a
-computer or modifying a private copy. Propagation includes copying,
-distribution (with or without modification), making available to the
-public, and in some countries other activities as well.
-
- To "convey" a work means any kind of propagation that enables other
-parties to make or receive copies. Mere interaction with a user through
-a computer network, with no transfer of a copy, is not conveying.
-
- An interactive user interface displays "Appropriate Legal Notices"
-to the extent that it includes a convenient and prominently visible
-feature that (1) displays an appropriate copyright notice, and (2)
-tells the user that there is no warranty for the work (except to the
-extent that warranties are provided), that licensees may convey the
-work under this License, and how to view a copy of this License. If
-the interface presents a list of user commands or options, such as a
-menu, a prominent item in the list meets this criterion.
-
- 1. Source Code.
-
- The "source code" for a work means the preferred form of the work
-for making modifications to it. "Object code" means any non-source
-form of a work.
-
- A "Standard Interface" means an interface that either is an official
-standard defined by a recognized standards body, or, in the case of
-interfaces specified for a particular programming language, one that
-is widely used among developers working in that language.
-
- The "System Libraries" of an executable work include anything, other
-than the work as a whole, that (a) is included in the normal form of
-packaging a Major Component, but which is not part of that Major
-Component, and (b) serves only to enable use of the work with that
-Major Component, or to implement a Standard Interface for which an
-implementation is available to the public in source code form. A
-"Major Component", in this context, means a major essential component
-(kernel, window system, and so on) of the specific operating system
-(if any) on which the executable work runs, or a compiler used to
-produce the work, or an object code interpreter used to run it.
-
- The "Corresponding Source" for a work in object code form means all
-the source code needed to generate, install, and (for an executable
-work) run the object code and to modify the work, including scripts to
-control those activities. However, it does not include the work's
-System Libraries, or general-purpose tools or generally available free
-programs which are used unmodified in performing those activities but
-which are not part of the work. For example, Corresponding Source
-includes interface definition files associated with source files for
-the work, and the source code for shared libraries and dynamically
-linked subprograms that the work is specifically designed to require,
-such as by intimate data communication or control flow between those
-subprograms and other parts of the work.
-
- The Corresponding Source need not include anything that users
-can regenerate automatically from other parts of the Corresponding
-Source.
-
- The Corresponding Source for a work in source code form is that
-same work.
-
- 2. Basic Permissions.
-
- All rights granted under this License are granted for the term of
-copyright on the Program, and are irrevocable provided the stated
-conditions are met. This License explicitly affirms your unlimited
-permission to run the unmodified Program. The output from running a
-covered work is covered by this License only if the output, given its
-content, constitutes a covered work. This License acknowledges your
-rights of fair use or other equivalent, as provided by copyright law.
-
- You may make, run and propagate covered works that you do not
-convey, without conditions so long as your license otherwise remains
-in force. You may convey covered works to others for the sole purpose
-of having them make modifications exclusively for you, or provide you
-with facilities for running those works, provided that you comply with
-the terms of this License in conveying all material for which you do
-not control copyright. Those thus making or running the covered works
-for you must do so exclusively on your behalf, under your direction
-and control, on terms that prohibit them from making any copies of
-your copyrighted material outside their relationship with you.
-
- Conveying under any other circumstances is permitted solely under
-the conditions stated below. Sublicensing is not allowed; section 10
-makes it unnecessary.
-
- 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
-
- No covered work shall be deemed part of an effective technological
-measure under any applicable law fulfilling obligations under article
-11 of the WIPO copyright treaty adopted on 20 December 1996, or
-similar laws prohibiting or restricting circumvention of such
-measures.
-
- When you convey a covered work, you waive any legal power to forbid
-circumvention of technological measures to the extent such circumvention
-is effected by exercising rights under this License with respect to
-the covered work, and you disclaim any intention to limit operation or
-modification of the work as a means of enforcing, against the work's
-users, your or third parties' legal rights to forbid circumvention of
-technological measures.
-
- 4. Conveying Verbatim Copies.
-
- You may convey verbatim copies of the Program's source code as you
-receive it, in any medium, provided that you conspicuously and
-appropriately publish on each copy an appropriate copyright notice;
-keep intact all notices stating that this License and any
-non-permissive terms added in accord with section 7 apply to the code;
-keep intact all notices of the absence of any warranty; and give all
-recipients a copy of this License along with the Program.
-
- You may charge any price or no price for each copy that you convey,
-and you may offer support or warranty protection for a fee.
-
- 5. Conveying Modified Source Versions.
-
- You may convey a work based on the Program, or the modifications to
-produce it from the Program, in the form of source code under the
-terms of section 4, provided that you also meet all of these conditions:
-
- a) The work must carry prominent notices stating that you modified
- it, and giving a relevant date.
-
- b) The work must carry prominent notices stating that it is
- released under this License and any conditions added under section
- 7. This requirement modifies the requirement in section 4 to
- "keep intact all notices".
-
- c) You must license the entire work, as a whole, under this
- License to anyone who comes into possession of a copy. This
- License will therefore apply, along with any applicable section 7
- additional terms, to the whole of the work, and all its parts,
- regardless of how they are packaged. This License gives no
- permission to license the work in any other way, but it does not
- invalidate such permission if you have separately received it.
-
- d) If the work has interactive user interfaces, each must display
- Appropriate Legal Notices; however, if the Program has interactive
- interfaces that do not display Appropriate Legal Notices, your
- work need not make them do so.
-
- A compilation of a covered work with other separate and independent
-works, which are not by their nature extensions of the covered work,
-and which are not combined with it such as to form a larger program,
-in or on a volume of a storage or distribution medium, is called an
-"aggregate" if the compilation and its resulting copyright are not
-used to limit the access or legal rights of the compilation's users
-beyond what the individual works permit. Inclusion of a covered work
-in an aggregate does not cause this License to apply to the other
-parts of the aggregate.
-
- 6. Conveying Non-Source Forms.
-
- You may convey a covered work in object code form under the terms
-of sections 4 and 5, provided that you also convey the
-machine-readable Corresponding Source under the terms of this License,
-in one of these ways:
-
- a) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by the
- Corresponding Source fixed on a durable physical medium
- customarily used for software interchange.
-
- b) Convey the object code in, or embodied in, a physical product
- (including a physical distribution medium), accompanied by a
- written offer, valid for at least three years and valid for as
- long as you offer spare parts or customer support for that product
- model, to give anyone who possesses the object code either (1) a
- copy of the Corresponding Source for all the software in the
- product that is covered by this License, on a durable physical
- medium customarily used for software interchange, for a price no
- more than your reasonable cost of physically performing this
- conveying of source, or (2) access to copy the
- Corresponding Source from a network server at no charge.
-
- c) Convey individual copies of the object code with a copy of the
- written offer to provide the Corresponding Source. This
- alternative is allowed only occasionally and noncommercially, and
- only if you received the object code with such an offer, in accord
- with subsection 6b.
-
- d) Convey the object code by offering access from a designated
- place (gratis or for a charge), and offer equivalent access to the
- Corresponding Source in the same way through the same place at no
- further charge. You need not require recipients to copy the
- Corresponding Source along with the object code. If the place to
- copy the object code is a network server, the Corresponding Source
- may be on a different server (operated by you or a third party)
- that supports equivalent copying facilities, provided you maintain
- clear directions next to the object code saying where to find the
- Corresponding Source. Regardless of what server hosts the
- Corresponding Source, you remain obligated to ensure that it is
- available for as long as needed to satisfy these requirements.
-
- e) Convey the object code using peer-to-peer transmission, provided
- you inform other peers where the object code and Corresponding
- Source of the work are being offered to the general public at no
- charge under subsection 6d.
-
- A separable portion of the object code, whose source code is excluded
-from the Corresponding Source as a System Library, need not be
-included in conveying the object code work.
-
- A "User Product" is either (1) a "consumer product", which means any
-tangible personal property which is normally used for personal, family,
-or household purposes, or (2) anything designed or sold for incorporation
-into a dwelling. In determining whether a product is a consumer product,
-doubtful cases shall be resolved in favor of coverage. For a particular
-product received by a particular user, "normally used" refers to a
-typical or common use of that class of product, regardless of the status
-of the particular user or of the way in which the particular user
-actually uses, or expects or is expected to use, the product. A product
-is a consumer product regardless of whether the product has substantial
-commercial, industrial or non-consumer uses, unless such uses represent
-the only significant mode of use of the product.
-
- "Installation Information" for a User Product means any methods,
-procedures, authorization keys, or other information required to install
-and execute modified versions of a covered work in that User Product from
-a modified version of its Corresponding Source. The information must
-suffice to ensure that the continued functioning of the modified object
-code is in no case prevented or interfered with solely because
-modification has been made.
-
- If you convey an object code work under this section in, or with, or
-specifically for use in, a User Product, and the conveying occurs as
-part of a transaction in which the right of possession and use of the
-User Product is transferred to the recipient in perpetuity or for a
-fixed term (regardless of how the transaction is characterized), the
-Corresponding Source conveyed under this section must be accompanied
-by the Installation Information. But this requirement does not apply
-if neither you nor any third party retains the ability to install
-modified object code on the User Product (for example, the work has
-been installed in ROM).
-
- The requirement to provide Installation Information does not include a
-requirement to continue to provide support service, warranty, or updates
-for a work that has been modified or installed by the recipient, or for
-the User Product in which it has been modified or installed. Access to a
-network may be denied when the modification itself materially and
-adversely affects the operation of the network or violates the rules and
-protocols for communication across the network.
-
- Corresponding Source conveyed, and Installation Information provided,
-in accord with this section must be in a format that is publicly
-documented (and with an implementation available to the public in
-source code form), and must require no special password or key for
-unpacking, reading or copying.
-
- 7. Additional Terms.
-
- "Additional permissions" are terms that supplement the terms of this
-License by making exceptions from one or more of its conditions.
-Additional permissions that are applicable to the entire Program shall
-be treated as though they were included in this License, to the extent
-that they are valid under applicable law. If additional permissions
-apply only to part of the Program, that part may be used separately
-under those permissions, but the entire Program remains governed by
-this License without regard to the additional permissions.
-
- When you convey a copy of a covered work, you may at your option
-remove any additional permissions from that copy, or from any part of
-it. (Additional permissions may be written to require their own
-removal in certain cases when you modify the work.) You may place
-additional permissions on material, added by you to a covered work,
-for which you have or can give appropriate copyright permission.
-
- Notwithstanding any other provision of this License, for material you
-add to a covered work, you may (if authorized by the copyright holders of
-that material) supplement the terms of this License with terms:
-
- a) Disclaiming warranty or limiting liability differently from the
- terms of sections 15 and 16 of this License; or
-
- b) Requiring preservation of specified reasonable legal notices or
- author attributions in that material or in the Appropriate Legal
- Notices displayed by works containing it; or
-
- c) Prohibiting misrepresentation of the origin of that material, or
- requiring that modified versions of such material be marked in
- reasonable ways as different from the original version; or
-
- d) Limiting the use for publicity purposes of names of licensors or
- authors of the material; or
-
- e) Declining to grant rights under trademark law for use of some
- trade names, trademarks, or service marks; or
-
- f) Requiring indemnification of licensors and authors of that
- material by anyone who conveys the material (or modified versions of
- it) with contractual assumptions of liability to the recipient, for
- any liability that these contractual assumptions directly impose on
- those licensors and authors.
-
- All other non-permissive additional terms are considered "further
-restrictions" within the meaning of section 10. If the Program as you
-received it, or any part of it, contains a notice stating that it is
-governed by this License along with a term that is a further
-restriction, you may remove that term. If a license document contains
-a further restriction but permits relicensing or conveying under this
-License, you may add to a covered work material governed by the terms
-of that license document, provided that the further restriction does
-not survive such relicensing or conveying.
-
- If you add terms to a covered work in accord with this section, you
-must place, in the relevant source files, a statement of the
-additional terms that apply to those files, or a notice indicating
-where to find the applicable terms.
-
- Additional terms, permissive or non-permissive, may be stated in the
-form of a separately written license, or stated as exceptions;
-the above requirements apply either way.
-
- 8. Termination.
-
- You may not propagate or modify a covered work except as expressly
-provided under this License. Any attempt otherwise to propagate or
-modify it is void, and will automatically terminate your rights under
-this License (including any patent licenses granted under the third
-paragraph of section 11).
-
- However, if you cease all violation of this License, then your
-license from a particular copyright holder is reinstated (a)
-provisionally, unless and until the copyright holder explicitly and
-finally terminates your license, and (b) permanently, if the copyright
-holder fails to notify you of the violation by some reasonable means
-prior to 60 days after the cessation.
-
- Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-
- Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, you do not qualify to receive new licenses for the same
-material under section 10.
-
- 9. Acceptance Not Required for Having Copies.
-
- You are not required to accept this License in order to receive or
-run a copy of the Program. Ancillary propagation of a covered work
-occurring solely as a consequence of using peer-to-peer transmission
-to receive a copy likewise does not require acceptance. However,
-nothing other than this License grants you permission to propagate or
-modify any covered work. These actions infringe copyright if you do
-not accept this License. Therefore, by modifying or propagating a
-covered work, you indicate your acceptance of this License to do so.
-
- 10. Automatic Licensing of Downstream Recipients.
-
- Each time you convey a covered work, the recipient automatically
-receives a license from the original licensors, to run, modify and
-propagate that work, subject to this License. You are not responsible
-for enforcing compliance by third parties with this License.
-
- An "entity transaction" is a transaction transferring control of an
-organization, or substantially all assets of one, or subdividing an
-organization, or merging organizations. If propagation of a covered
-work results from an entity transaction, each party to that
-transaction who receives a copy of the work also receives whatever
-licenses to the work the party's predecessor in interest had or could
-give under the previous paragraph, plus a right to possession of the
-Corresponding Source of the work from the predecessor in interest, if
-the predecessor has it or can get it with reasonable efforts.
-
- You may not impose any further restrictions on the exercise of the
-rights granted or affirmed under this License. For example, you may
-not impose a license fee, royalty, or other charge for exercise of
-rights granted under this License, and you may not initiate litigation
-(including a cross-claim or counterclaim in a lawsuit) alleging that
-any patent claim is infringed by making, using, selling, offering for
-sale, or importing the Program or any portion of it.
-
- 11. Patents.
-
- A "contributor" is a copyright holder who authorizes use under this
-License of the Program or a work on which the Program is based. The
-work thus licensed is called the contributor's "contributor version".
-
- A contributor's "essential patent claims" are all patent claims
-owned or controlled by the contributor, whether already acquired or
-hereafter acquired, that would be infringed by some manner, permitted
-by this License, of making, using, or selling its contributor version,
-but do not include claims that would be infringed only as a
-consequence of further modification of the contributor version. For
-purposes of this definition, "control" includes the right to grant
-patent sublicenses in a manner consistent with the requirements of
-this License.
-
- Each contributor grants you a non-exclusive, worldwide, royalty-free
-patent license under the contributor's essential patent claims, to
-make, use, sell, offer for sale, import and otherwise run, modify and
-propagate the contents of its contributor version.
-
- In the following three paragraphs, a "patent license" is any express
-agreement or commitment, however denominated, not to enforce a patent
-(such as an express permission to practice a patent or covenant not to
-sue for patent infringement). To "grant" such a patent license to a
-party means to make such an agreement or commitment not to enforce a
-patent against the party.
-
- If you convey a covered work, knowingly relying on a patent license,
-and the Corresponding Source of the work is not available for anyone
-to copy, free of charge and under the terms of this License, through a
-publicly available network server or other readily accessible means,
-then you must either (1) cause the Corresponding Source to be so
-available, or (2) arrange to deprive yourself of the benefit of the
-patent license for this particular work, or (3) arrange, in a manner
-consistent with the requirements of this License, to extend the patent
-license to downstream recipients. "Knowingly relying" means you have
-actual knowledge that, but for the patent license, your conveying the
-covered work in a country, or your recipient's use of the covered work
-in a country, would infringe one or more identifiable patents in that
-country that you have reason to believe are valid.
-
- If, pursuant to or in connection with a single transaction or
-arrangement, you convey, or propagate by procuring conveyance of, a
-covered work, and grant a patent license to some of the parties
-receiving the covered work authorizing them to use, propagate, modify
-or convey a specific copy of the covered work, then the patent license
-you grant is automatically extended to all recipients of the covered
-work and works based on it.
-
- A patent license is "discriminatory" if it does not include within
-the scope of its coverage, prohibits the exercise of, or is
-conditioned on the non-exercise of one or more of the rights that are
-specifically granted under this License. You may not convey a covered
-work if you are a party to an arrangement with a third party that is
-in the business of distributing software, under which you make payment
-to the third party based on the extent of your activity of conveying
-the work, and under which the third party grants, to any of the
-parties who would receive the covered work from you, a discriminatory
-patent license (a) in connection with copies of the covered work
-conveyed by you (or copies made from those copies), or (b) primarily
-for and in connection with specific products or compilations that
-contain the covered work, unless you entered into that arrangement,
-or that patent license was granted, prior to 28 March 2007.
-
- Nothing in this License shall be construed as excluding or limiting
-any implied license or other defenses to infringement that may
-otherwise be available to you under applicable patent law.
-
- 12. No Surrender of Others' Freedom.
-
- If conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot convey a
-covered work so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you may
-not convey it at all. For example, if you agree to terms that obligate you
-to collect a royalty for further conveying from those to whom you convey
-the Program, the only way you could satisfy both those terms and this
-License would be to refrain entirely from conveying the Program.
-
- 13. Remote Network Interaction; Use with the GNU General Public License.
-
- Notwithstanding any other provision of this License, if you modify the
-Program, your modified version must prominently offer all users
-interacting with it remotely through a computer network (if your version
-supports such interaction) an opportunity to receive the Corresponding
-Source of your version by providing access to the Corresponding Source
-from a network server at no charge, through some standard or customary
-means of facilitating copying of software. This Corresponding Source
-shall include the Corresponding Source for any work covered by version 3
-of the GNU General Public License that is incorporated pursuant to the
-following paragraph.
-
- Notwithstanding any other provision of this License, you have
-permission to link or combine any covered work with a work licensed
-under version 3 of the GNU General Public License into a single
-combined work, and to convey the resulting work. The terms of this
-License will continue to apply to the part which is the covered work,
-but the work with which it is combined will remain governed by version
-3 of the GNU General Public License.
-
- 14. Revised Versions of this License.
-
- The Free Software Foundation may publish revised and/or new versions of
-the GNU Affero General Public License from time to time. Such new versions
-will be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
- Each version is given a distinguishing version number. If the
-Program specifies that a certain numbered version of the GNU Affero General
-Public License "or any later version" applies to it, you have the
-option of following the terms and conditions either of that numbered
-version or of any later version published by the Free Software
-Foundation. If the Program does not specify a version number of the
-GNU Affero General Public License, you may choose any version ever published
-by the Free Software Foundation.
-
- If the Program specifies that a proxy can decide which future
-versions of the GNU Affero General Public License can be used, that proxy's
-public statement of acceptance of a version permanently authorizes you
-to choose that version for the Program.
-
- Later license versions may give you additional or different
-permissions. However, no additional obligations are imposed on any
-author or copyright holder as a result of your choosing to follow a
-later version.
-
- 15. Disclaimer of Warranty.
-
- THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
-APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
-HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
-OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
-THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
-IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
-ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
-
- 16. Limitation of Liability.
-
- IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
-THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
-GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
-USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
-DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
-PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
-EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
-SUCH DAMAGES.
-
- 17. Interpretation of Sections 15 and 16.
-
- If the disclaimer of warranty and limitation of liability provided
-above cannot be given local legal effect according to their terms,
-reviewing courts shall apply local law that most closely approximates
-an absolute waiver of all civil liability in connection with the
-Program, unless a warranty or assumption of liability accompanies a
-copy of the Program in return for a fee.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-state the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) <year> <name of author>
-
- This program is free software: you can redistribute it and/or modify
- it under the terms of the GNU Affero General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU Affero General Public License for more details.
-
- You should have received a copy of the GNU Affero General Public License
- along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-Also add information on how to contact you by electronic and paper mail.
-
- If your software can interact with users remotely through a computer
-network, you should also make sure that it provides a way for users to
-get its source. For example, if your program is a web application, its
-interface could display a "Source" link that leads users to an archive
-of the code. There are many ways you could offer source, and different
-solutions will be better for different programs; see section 13 for the
-specific requirements.
-
- You should also get your employer (if you work as a programmer) or school,
-if any, to sign a "copyright disclaimer" for the program, if necessary.
-For more information on this, and how to apply and follow the GNU AGPL, see
-<http://www.gnu.org/licenses/>.
+
+ This version of the GNU Lesser General Public License incorporates
+the terms and conditions of version 3 of the GNU General Public
+License, supplemented by the additional permissions listed below.
+
+ 0. Additional Definitions.
+
+ As used herein, "this License" refers to version 3 of the GNU Lesser
+General Public License, and the "GNU GPL" refers to version 3 of the GNU
+General Public License.
+
+ "The Library" refers to a covered work governed by this License,
+other than an Application or a Combined Work as defined below.
+
+ An "Application" is any work that makes use of an interface provided
+by the Library, but which is not otherwise based on the Library.
+Defining a subclass of a class defined by the Library is deemed a mode
+of using an interface provided by the Library.
+
+ A "Combined Work" is a work produced by combining or linking an
+Application with the Library. The particular version of the Library
+with which the Combined Work was made is also called the "Linked
+Version".
+
+ The "Minimal Corresponding Source" for a Combined Work means the
+Corresponding Source for the Combined Work, excluding any source code
+for portions of the Combined Work that, considered in isolation, are
+based on the Application, and not on the Linked Version.
+
+ The "Corresponding Application Code" for a Combined Work means the
+object code and/or source code for the Application, including any data
+and utility programs needed for reproducing the Combined Work from the
+Application, but excluding the System Libraries of the Combined Work.
+
+ 1. Exception to Section 3 of the GNU GPL.
+
+ You may convey a covered work under sections 3 and 4 of this License
+without being bound by section 3 of the GNU GPL.
+
+ 2. Conveying Modified Versions.
+
+ If you modify a copy of the Library, and, in your modifications, a
+facility refers to a function or data to be supplied by an Application
+that uses the facility (other than as an argument passed when the
+facility is invoked), then you may convey a copy of the modified
+version:
+
+ a) under this License, provided that you make a good faith effort to
+ ensure that, in the event an Application does not supply the
+ function or data, the facility still operates, and performs
+ whatever part of its purpose remains meaningful, or
+
+ b) under the GNU GPL, with none of the additional permissions of
+ this License applicable to that copy.
+
+ 3. Object Code Incorporating Material from Library Header Files.
+
+ The object code form of an Application may incorporate material from
+a header file that is part of the Library. You may convey such object
+code under terms of your choice, provided that, if the incorporated
+material is not limited to numerical parameters, data structure
+layouts and accessors, or small macros, inline functions and templates
+(ten or fewer lines in length), you do both of the following:
+
+ a) Give prominent notice with each copy of the object code that the
+ Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the object code with a copy of the GNU GPL and this license
+ document.
+
+ 4. Combined Works.
+
+ You may convey a Combined Work under terms of your choice that,
+taken together, effectively do not restrict modification of the
+portions of the Library contained in the Combined Work and reverse
+engineering for debugging such modifications, if you also do each of
+the following:
+
+ a) Give prominent notice with each copy of the Combined Work that
+ the Library is used in it and that the Library and its use are
+ covered by this License.
+
+ b) Accompany the Combined Work with a copy of the GNU GPL and this license
+ document.
+
+ c) For a Combined Work that displays copyright notices during
+ execution, include the copyright notice for the Library among
+ these notices, as well as a reference directing the user to the
+ copies of the GNU GPL and this license document.
+
+ d) Do one of the following:
+
+ 0) Convey the Minimal Corresponding Source under the terms of this
+ License, and the Corresponding Application Code in a form
+ suitable for, and under terms that permit, the user to
+ recombine or relink the Application with a modified version of
+ the Linked Version to produce a modified Combined Work, in the
+ manner specified by section 6 of the GNU GPL for conveying
+ Corresponding Source.
+
+ 1) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (a) uses at run time
+ a copy of the Library already present on the user's computer
+ system, and (b) will operate properly with a modified version
+ of the Library that is interface-compatible with the Linked
+ Version.
+
+ e) Provide Installation Information, but only if you would otherwise
+ be required to provide such information under section 6 of the
+ GNU GPL, and only to the extent that such information is
+ necessary to install and execute a modified version of the
+ Combined Work produced by recombining or relinking the
+ Application with a modified version of the Linked Version. (If
+ you use option 4d0, the Installation Information must accompany
+ the Minimal Corresponding Source and Corresponding Application
+ Code. If you use option 4d1, you must provide the Installation
+ Information in the manner specified by section 6 of the GNU GPL
+ for conveying Corresponding Source.)
+
+ 5. Combined Libraries.
+
+ You may place library facilities that are a work based on the
+Library side by side in a single library together with other library
+facilities that are not Applications and are not covered by this
+License, and convey such a combined library under terms of your
+choice, if you do both of the following:
+
+ a) Accompany the combined library with a copy of the same work based
+ on the Library, uncombined with any other library facilities,
+ conveyed under the terms of this License.
+
+ b) Give prominent notice with the combined library that part of it
+ is a work based on the Library, and explaining where to find the
+ accompanying uncombined form of the same work.
+
+ 6. Revised Versions of the GNU Lesser General Public License.
+
+ The Free Software Foundation may publish revised and/or new versions
+of the GNU Lesser General Public License from time to time. Such new
+versions will be similar in spirit to the present version, but may
+differ in detail to address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Library as you received it specifies that a certain numbered version
+of the GNU Lesser General Public License "or any later version"
+applies to it, you have the option of following the terms and
+conditions either of that published version or of any later version
+published by the Free Software Foundation. If the Library as you
+received it does not specify a version number of the GNU Lesser
+General Public License, you may choose any version of the GNU Lesser
+General Public License ever published by the Free Software Foundation.
+
+ If the Library as you received it specifies that a proxy can decide
+whether future versions of the GNU Lesser General Public License shall
+apply, that proxy's public statement of acceptance of any version is
+permanent authorization for you to choose that version for the
+Library. \ No newline at end of file
diff --git a/src/libnest2d/include/libnest2d/backends/clipper/geometries.hpp b/src/libnest2d/include/libnest2d/backends/clipper/geometries.hpp
index 57da6ec12..dd80322bc 100644
--- a/src/libnest2d/include/libnest2d/backends/clipper/geometries.hpp
+++ b/src/libnest2d/include/libnest2d/backends/clipper/geometries.hpp
@@ -77,7 +77,7 @@ inline void offset(PolygonImpl& sh, TCoord<PointImpl> distance, const PolygonTag
#define DISABLE_BOOST_OFFSET
using ClipperLib::ClipperOffset;
- using ClipperLib::jtMiter;
+ using ClipperLib::jtSquare;
using ClipperLib::etClosedPolygon;
using ClipperLib::Paths;
@@ -85,8 +85,8 @@ inline void offset(PolygonImpl& sh, TCoord<PointImpl> distance, const PolygonTag
try {
ClipperOffset offs;
- offs.AddPath(sh.Contour, jtMiter, etClosedPolygon);
- offs.AddPaths(sh.Holes, jtMiter, etClosedPolygon);
+ offs.AddPath(sh.Contour, jtSquare, etClosedPolygon);
+ offs.AddPaths(sh.Holes, jtSquare, etClosedPolygon);
offs.Execute(result, static_cast<double>(distance));
} catch (ClipperLib::clipperException &) {
throw GeometryException(GeomErr::OFFSET);
diff --git a/src/libnest2d/include/libnest2d/geometry_traits.hpp b/src/libnest2d/include/libnest2d/geometry_traits.hpp
index 72e239a70..c447cfcd9 100644
--- a/src/libnest2d/include/libnest2d/geometry_traits.hpp
+++ b/src/libnest2d/include/libnest2d/geometry_traits.hpp
@@ -982,6 +982,9 @@ template<class S> inline double area(const S& poly, const PolygonTag& )
});
}
+template<class RawShapes>
+inline double area(const RawShapes& shapes, const MultiPolygonTag&);
+
template<class S> // Dispatching function
inline double area(const S& sh)
{
diff --git a/src/libnest2d/include/libnest2d/libnest2d.hpp b/src/libnest2d/include/libnest2d/libnest2d.hpp
index b6d7fcdcf..5eef28c40 100644
--- a/src/libnest2d/include/libnest2d/libnest2d.hpp
+++ b/src/libnest2d/include/libnest2d/libnest2d.hpp
@@ -27,6 +27,7 @@ using Coord = TCoord<PointImpl>;
using Box = _Box<PointImpl>;
using Segment = _Segment<PointImpl>;
using Circle = _Circle<PointImpl>;
+using MultiPolygon = TMultiShape<PolygonImpl>;
using Item = _Item<PolygonImpl>;
using Rectangle = _Rectangle<PolygonImpl>;
diff --git a/src/libnest2d/include/libnest2d/nester.hpp b/src/libnest2d/include/libnest2d/nester.hpp
index 2f207d526..59477b4f1 100644
--- a/src/libnest2d/include/libnest2d/nester.hpp
+++ b/src/libnest2d/include/libnest2d/nester.hpp
@@ -741,6 +741,10 @@ public:
return impl_.getResult();
}
+ inline int lastPackedBinId() const {
+ return impl_.lastPackedBinId();
+ }
+
void clear() { impl_.clear(); }
};
@@ -862,6 +866,10 @@ public:
{
return selector_.getResult();
}
+
+ inline int lastPackedBinId() const {
+ return selector_.lastPackedBinId();
+ }
};
}
diff --git a/src/libnest2d/include/libnest2d/placers/nfpplacer.hpp b/src/libnest2d/include/libnest2d/placers/nfpplacer.hpp
index 91f04cb93..83f7bd246 100644
--- a/src/libnest2d/include/libnest2d/placers/nfpplacer.hpp
+++ b/src/libnest2d/include/libnest2d/placers/nfpplacer.hpp
@@ -167,6 +167,8 @@ struct NfpPConfig {
const ItemGroup& // remaining items
)> before_packing;
+ std::function<void(const ItemGroup &, NfpPConfig &config)> on_preload;
+
NfpPConfig(): rotations({0.0, Pi/2.0, Pi, 3*Pi/2}),
alignment(Alignment::CENTER), starting_point(Alignment::CENTER) {}
};
@@ -479,13 +481,18 @@ class _NofitPolyPlacer: public PlacerBoilerplate<_NofitPolyPlacer<RawShape, TBin
using MaxNfpLevel = nfp::MaxNfpLevel<RawShape>;
+public:
+
+ using Pile = nfp::Shapes<RawShape>;
+
+private:
+
// Norming factor for the optimization function
const double norm_;
+ Pile merged_pile_;
public:
- using Pile = nfp::Shapes<RawShape>;
-
inline explicit _NofitPolyPlacer(const BinType& bin):
Base(bin),
norm_(std::sqrt(sl::area(bin)))
@@ -528,15 +535,12 @@ public:
static inline double overfit(const Box& bb, const Box& bin)
{
- auto Bw = bin.width();
- auto Bh = bin.height();
- auto mBw = -Bw;
- auto mBh = -Bh;
- auto wdiff = double(bb.width()) + mBw;
- auto hdiff = double(bb.height()) + mBh;
- double diff = 0;
- if(wdiff > 0) diff += wdiff;
- if(hdiff > 0) diff += hdiff;
+ auto wdiff = TCompute<RawShape>(bb.width()) - bin.width();
+ auto hdiff = TCompute<RawShape>(bb.height()) - bin.height();
+ double diff = .0;
+ if(wdiff > 0) diff += double(wdiff);
+ if(hdiff > 0) diff += double(hdiff);
+
return diff;
}
@@ -575,6 +579,12 @@ public:
Base::clearItems();
}
+ void preload(const ItemGroup& packeditems) {
+ Base::preload(packeditems);
+ if (config_.on_preload)
+ config_.on_preload(packeditems, config_);
+ }
+
private:
using Shapes = TMultiShape<RawShape>;
@@ -619,135 +629,9 @@ private:
template<class Level>
Shapes calcnfp(const Item &trsh, Level)
{ // Function for arbitrary level of nfp implementation
- using namespace nfp;
-
- Shapes nfps;
-
- auto& orb = trsh.transformedShape();
- bool orbconvex = trsh.isContourConvex();
-
- for(Item& sh : items_) {
- nfp::NfpResult<RawShape> subnfp;
- auto& stat = sh.transformedShape();
-
- if(sh.isContourConvex() && orbconvex)
- subnfp = nfp::noFitPolygon<NfpLevel::CONVEX_ONLY>(stat, orb);
- else if(orbconvex)
- subnfp = nfp::noFitPolygon<NfpLevel::ONE_CONVEX>(stat, orb);
- else
- subnfp = nfp::noFitPolygon<Level::value>(stat, orb);
-
- correctNfpPosition(subnfp, sh, trsh);
-
- nfps = nfp::merge(nfps, subnfp.first);
- }
- return nfps;
- }
-
- // Very much experimental
- void repack(Item& item, PackResult& result) {
-
- if((sl::area(bin_) - this->filledArea()) >= item.area()) {
- auto prev_func = config_.object_function;
-
- unsigned iter = 0;
- ItemGroup backup_rf = items_;
- std::vector<Item> backup_cpy;
- for(Item& itm : items_) backup_cpy.emplace_back(itm);
-
- auto ofn = [this, &item, &result, &iter, &backup_cpy, &backup_rf]
- (double ratio)
- {
- auto& bin = bin_;
- iter++;
- config_.object_function = [bin, ratio](
- nfp::Shapes<RawShape>& pile,
- const Item& item,
- const ItemGroup& /*remaining*/)
- {
- pile.emplace_back(item.transformedShape());
- auto ch = sl::convexHull(pile);
- auto pbb = sl::boundingBox(pile);
- pile.pop_back();
-
- double parea = 0.5*(sl::area(ch) + sl::area(pbb));
-
- double pile_area = std::accumulate(
- pile.begin(), pile.end(), item.area(),
- [](double sum, const RawShape& sh){
- return sum + sl::area(sh);
- });
-
- // The pack ratio -- how much is the convex hull occupied
- double pack_rate = (pile_area)/parea;
-
- // ratio of waste
- double waste = 1.0 - pack_rate;
-
- // Score is the square root of waste. This will extend the
- // range of good (lower) values and shrink the range of bad
- // (larger) values.
- auto wscore = std::sqrt(waste);
-
-
- auto ibb = item.boundingBox();
- auto bbb = sl::boundingBox(bin);
- auto c = ibb.center();
- double norm = 0.5*pl::distance(bbb.minCorner(),
- bbb.maxCorner());
-
- double dscore = pl::distance(c, pbb.center()) / norm;
-
- return ratio*wscore + (1.0 - ratio) * dscore;
- };
-
- auto bb = sl::boundingBox(bin);
- double norm = bb.width() + bb.height();
-
- auto items = items_;
- clearItems();
- auto it = items.begin();
- while(auto pr = _trypack(*it++)) {
- this->accept(pr); if(it == items.end()) break;
- }
-
- auto count_diff = items.size() - items_.size();
- double score = count_diff;
-
- if(count_diff == 0) {
- result = _trypack(item);
-
- if(result) {
- std::cout << "Success" << std::endl;
- score = 0.0;
- } else {
- score += result.overfit() / norm;
- }
- } else {
- result = PackResult();
- items_ = backup_rf;
- for(unsigned i = 0; i < items_.size(); i++) {
- items_[i].get() = backup_cpy[i];
- }
- }
-
- std::cout << iter << " repack result: " << score << " "
- << ratio << " " << count_diff << std::endl;
-
- return score;
- };
-
- opt::StopCriteria stopcr;
- stopcr.max_iterations = 30;
- stopcr.stop_score = 1e-20;
- opt::TOptimizer<opt::Method::L_SUBPLEX> solver(stopcr);
- solver.optimize_min(ofn, opt::initvals(0.5),
- opt::bound(0.0, 1.0));
-
- // optimize
- config_.object_function = prev_func;
- }
+ // TODO: implement
+ return {};
}
struct Optimum {
@@ -787,19 +671,80 @@ private:
remlist.insert(remlist.end(), remaining.from, remaining.to);
}
+ double global_score = std::numeric_limits<double>::max();
+
+ auto initial_tr = item.translation();
+ auto initial_rot = item.rotation();
+ Vertex final_tr = {0, 0};
+ Radians final_rot = initial_rot;
+ Shapes nfps;
+
+ auto& bin = bin_;
+ double norm = norm_;
+ auto pbb = sl::boundingBox(merged_pile_);
+ auto binbb = sl::boundingBox(bin);
+
+ // This is the kernel part of the object function that is
+ // customizable by the library client
+ std::function<double(const Item&)> _objfunc;
+ if(config_.object_function) _objfunc = config_.object_function;
+ else {
+
+ // Inside check has to be strict if no alignment was enabled
+ std::function<double(const Box&)> ins_check;
+ if(config_.alignment == Config::Alignment::DONT_ALIGN)
+ ins_check = [&binbb, norm](const Box& fullbb) {
+ double ret = 0;
+ if(!sl::isInside(fullbb, binbb))
+ ret += norm;
+ return ret;
+ };
+ else
+ ins_check = [&bin](const Box& fullbb) {
+ double miss = overfit(fullbb, bin);
+ miss = miss > 0? miss : 0;
+ return std::pow(miss, 2);
+ };
+
+ _objfunc = [norm, binbb, pbb, ins_check](const Item& item)
+ {
+ auto ibb = item.boundingBox();
+ auto fullbb = sl::boundingBox(pbb, ibb);
+
+ double score = pl::distance(ibb.center(),
+ binbb.center());
+ score /= norm;
+
+ score += ins_check(fullbb);
+
+ return score;
+ };
+ }
+
if(items_.empty()) {
setInitialPosition(item);
+ auto best_tr = item.translation();
+ auto best_rot = item.rotation();
best_overfit = overfit(item.transformedShape(), bin_);
+
+ for(auto rot : config_.rotations) {
+ item.translation(initial_tr);
+ item.rotation(initial_rot + rot);
+ setInitialPosition(item);
+ double of = 0.;
+ if ((of = overfit(item.transformedShape(), bin_)) < best_overfit) {
+ best_overfit = of;
+ best_tr = item.translation();
+ best_rot = item.rotation();
+ }
+ }
+
can_pack = best_overfit <= 0;
+ item.rotation(best_rot);
+ item.translation(best_tr);
} else {
- double global_score = std::numeric_limits<double>::max();
-
- auto initial_tr = item.translation();
- auto initial_rot = item.rotation();
- Vertex final_tr = {0, 0};
- Radians final_rot = initial_rot;
- Shapes nfps;
+ Pile merged_pile = merged_pile_;
for(auto rot : config_.rotations) {
@@ -825,57 +770,6 @@ private:
ecache.back().accuracy(config_.accuracy);
}
- Shapes pile;
- pile.reserve(items_.size()+1);
- // double pile_area = 0;
- for(Item& mitem : items_) {
- pile.emplace_back(mitem.transformedShape());
- // pile_area += mitem.area();
- }
-
- auto merged_pile = nfp::merge(pile);
- auto& bin = bin_;
- double norm = norm_;
- auto pbb = sl::boundingBox(merged_pile);
- auto binbb = sl::boundingBox(bin);
-
- // This is the kernel part of the object function that is
- // customizable by the library client
- std::function<double(const Item&)> _objfunc;
- if(config_.object_function) _objfunc = config_.object_function;
- else {
-
- // Inside check has to be strict if no alignment was enabled
- std::function<double(const Box&)> ins_check;
- if(config_.alignment == Config::Alignment::DONT_ALIGN)
- ins_check = [&binbb, norm](const Box& fullbb) {
- double ret = 0;
- if(!sl::isInside(fullbb, binbb))
- ret += norm;
- return ret;
- };
- else
- ins_check = [&bin](const Box& fullbb) {
- double miss = overfit(fullbb, bin);
- miss = miss > 0? miss : 0;
- return std::pow(miss, 2);
- };
-
- _objfunc = [norm, binbb, pbb, ins_check](const Item& item)
- {
- auto ibb = item.boundingBox();
- auto fullbb = sl::boundingBox(pbb, ibb);
-
- double score = pl::distance(ibb.center(),
- binbb.center());
- score /= norm;
-
- score += ins_check(fullbb);
-
- return score;
- };
- }
-
// Our object function for placement
auto rawobjfunc = [_objfunc, iv, startpos]
(Vertex v, Item& itm)
@@ -1048,6 +942,7 @@ private:
if(can_pack) {
ret = PackResult(item);
+ merged_pile_ = nfp::merge(merged_pile_, item.transformedShape());
} else {
ret = PackResult(best_overfit);
}
@@ -1078,10 +973,9 @@ private:
if(items_.empty() ||
config_.alignment == Config::Alignment::DONT_ALIGN) return;
- nfp::Shapes<RawShape> m;
- m.reserve(items_.size());
- for(Item& item : items_) m.emplace_back(item.transformedShape());
- auto&& bb = sl::boundingBox(m);
+ Box bb = items_.front().get().boundingBox();
+ for(Item& item : items_)
+ bb = sl::boundingBox(item.boundingBox(), bb);
Vertex ci, cb;
@@ -1118,7 +1012,7 @@ private:
for(Item& item : items_) item.translate(d);
}
- void setInitialPosition(Item& item) {
+ void setInitialPosition(Item& item) {
Box bb = item.boundingBox();
Vertex ci, cb;
diff --git a/src/libnest2d/include/libnest2d/selections/firstfit.hpp b/src/libnest2d/include/libnest2d/selections/firstfit.hpp
index 373e8b618..e50fd7009 100644
--- a/src/libnest2d/include/libnest2d/selections/firstfit.hpp
+++ b/src/libnest2d/include/libnest2d/selections/firstfit.hpp
@@ -71,8 +71,9 @@ public:
std::sort(store_.begin(), store_.end(), sortfunc);
auto total = last-first;
- auto makeProgress = [this, &total](Placer& placer, size_t idx) {
- packed_bins_[idx] = placer.getItems();
+ auto makeProgress = [this, &total](Placer& placer, size_t bin_idx) {
+ packed_bins_[bin_idx] = placer.getItems();
+ this->last_packed_bin_id_ = int(bin_idx);
this->progress_(static_cast<unsigned>(--total));
};
diff --git a/src/libnest2d/include/libnest2d/selections/selection_boilerplate.hpp b/src/libnest2d/include/libnest2d/selections/selection_boilerplate.hpp
index e96378296..431159641 100644
--- a/src/libnest2d/include/libnest2d/selections/selection_boilerplate.hpp
+++ b/src/libnest2d/include/libnest2d/selections/selection_boilerplate.hpp
@@ -18,6 +18,8 @@ public:
return packed_bins_;
}
+ inline int lastPackedBinId() const { return last_packed_bin_id_; }
+
inline void progressIndicator(ProgressFunction fn) { progress_ = fn; }
inline void stopCondition(StopCondition cond) { stopcond_ = cond; }
@@ -54,6 +56,7 @@ protected:
PackGroup packed_bins_;
ProgressFunction progress_ = [](unsigned){};
StopCondition stopcond_ = [](){ return false; };
+ int last_packed_bin_id_ = -1;
};
}
diff --git a/src/libnest2d/tools/svgtools.hpp b/src/libnest2d/tools/svgtools.hpp
index e1ed1ad05..2a05b551d 100644
--- a/src/libnest2d/tools/svgtools.hpp
+++ b/src/libnest2d/tools/svgtools.hpp
@@ -5,7 +5,7 @@
#include <fstream>
#include <string>
-#include <libnest2d/libnest2d.hpp>
+#include <libnest2d/nester.hpp>
namespace libnest2d { namespace svg {
@@ -48,23 +48,28 @@ public:
conf_.width = static_cast<double>(box.width()) /
conf_.mm_in_coord_units;
}
-
- void writeItem(const Item& item) {
+
+ void writeShape(RawShape tsh) {
if(svg_layers_.empty()) addLayer();
- auto tsh = item.transformedShape();
if(conf_.origo_location == BOTTOMLEFT) {
auto d = static_cast<Coord>(
- std::round(conf_.height*conf_.mm_in_coord_units) );
-
+ std::round(conf_.height*conf_.mm_in_coord_units) );
+
auto& contour = shapelike::contour(tsh);
for(auto& v : contour) setY(v, -getY(v) + d);
-
+
auto& holes = shapelike::holes(tsh);
for(auto& h : holes) for(auto& v : h) setY(v, -getY(v) + d);
-
+
}
- currentLayer() += shapelike::serialize<Formats::SVG>(tsh,
- 1.0/conf_.mm_in_coord_units) + "\n";
+ currentLayer() +=
+ shapelike::serialize<Formats::SVG>(tsh,
+ 1.0 / conf_.mm_in_coord_units) +
+ "\n";
+ }
+
+ void writeItem(const Item& item) {
+ writeShape(item.transformedShape());
}
void writePackGroup(const PackGroup& result) {
diff --git a/src/libslic3r/AABBTreeIndirect.hpp b/src/libslic3r/AABBTreeIndirect.hpp
new file mode 100644
index 000000000..87d1ee9db
--- /dev/null
+++ b/src/libslic3r/AABBTreeIndirect.hpp
@@ -0,0 +1,759 @@
+// AABB tree built upon external data set, referencing the external data by integer indices.
+// The AABB tree balancing and traversal (ray casting, closest triangle of an indexed triangle mesh)
+// were adapted from libigl AABB.{cpp,hpp} Copyright (C) 2015 Alec Jacobson <alecjacobson@gmail.com>
+// while the implicit balanced tree representation and memory optimizations are Vojtech's.
+
+#ifndef slic3r_AABBTreeIndirect_hpp_
+#define slic3r_AABBTreeIndirect_hpp_
+
+#include <algorithm>
+#include <limits>
+#include <type_traits>
+#include <vector>
+
+#include "Utils.hpp" // for next_highest_power_of_2()
+
+extern "C"
+{
+// Ray-Triangle Intersection Test Routines by Tomas Moller, May 2000
+#include <igl/raytri.c>
+}
+// Definition of the ray intersection hit structure.
+#include <igl/Hit.h>
+
+namespace Slic3r {
+namespace AABBTreeIndirect {
+
+// Static balanced AABB tree for raycasting and closest triangle search.
+// The balanced tree is built over a single large std::vector of nodes, where the children of nodes
+// are addressed implicitely using a power of two indexing rule.
+// Memory for a full balanced tree is allocated, but not all nodes at the last level are used.
+// This may seem like a waste of memory, but one saves memory for the node links and there is zero
+// overhead of a memory allocator management (usually the memory allocator adds at least one pointer
+// before the memory returned). However, allocating memory in a single vector is very fast even
+// in multi-threaded environment and it is cache friendly.
+//
+// A balanced tree is built upon a vector of bounding boxes and their centroids, storing the reference
+// to the source entity (a 3D triangle, a 2D segment etc, a 3D or 2D point etc).
+// The source bounding boxes may have an epsilon applied to fight numeric rounding errors when
+// traversing the AABB tree.
+template<int ANumDimensions, typename ACoordType>
+class Tree
+{
+public:
+ static constexpr int NumDimensions = ANumDimensions;
+ using CoordType = ACoordType;
+ using VectorType = Eigen::Matrix<CoordType, NumDimensions, 1, Eigen::DontAlign>;
+ using BoundingBox = Eigen::AlignedBox<CoordType, NumDimensions>;
+ // Following could be static constexpr size_t, but that would not link in C++11
+ enum : size_t {
+ // Node is not used.
+ npos = size_t(-1),
+ // Inner node (not leaf).
+ inner = size_t(-2)
+ };
+
+ // Single node of the implicit balanced AABB tree. There are no links to the children nodes,
+ // as these links are calculated implicitely using a power of two rule.
+ struct Node {
+ // Index of the external source entity, for which this AABB tree was built, npos for internal nodes.
+ size_t idx = npos;
+ // Bounding box around this entity, possibly with epsilons applied to fight numeric rounding errors
+ // when traversing the AABB tree.
+ BoundingBox bbox;
+
+ bool is_valid() const { return this->idx != npos; }
+ bool is_inner() const { return this->idx == inner; }
+ bool is_leaf() const { return ! this->is_inner(); }
+
+ template<typename SourceNode>
+ void set(const SourceNode &rhs) {
+ this->idx = rhs.idx();
+ this->bbox = rhs.bbox();
+ }
+ };
+
+ void clear() { m_nodes.clear(); }
+
+ // SourceNode shall implement
+ // size_t SourceNode::idx() const
+ // - Index to the outside entity (triangle, edge, point etc).
+ // const VectorType& SourceNode::centroid() const
+ // - Centroid of this node. The centroid is used for balancing the tree.
+ // const BoundingBox& SourceNode::bbox() const
+ // - Bounding box of this node, likely expanded with epsilon to account for numeric rounding during tree traversal.
+ // Union of bounding boxes at a single level of the AABB tree is used for deciding the longest axis aligned dimension
+ // to split around.
+ template<typename SourceNode>
+ void build(std::vector<SourceNode> &&input)
+ {
+ if (input.empty())
+ clear();
+ else {
+ // Allocate enough memory for a full binary tree.
+ m_nodes.assign(next_highest_power_of_2(input.size()) * 2 - 1, Node());
+ build_recursive(input, 0, 0, input.size() - 1);
+ }
+ input.clear();
+ }
+
+ const std::vector<Node>& nodes() const { return m_nodes; }
+ const Node& node(size_t idx) const { return m_nodes[idx]; }
+ bool empty() const { return m_nodes.empty(); }
+
+ // Addressing the child nodes using the power of two rule.
+ static size_t left_child_idx(size_t idx) { return idx * 2 + 1; }
+ static size_t right_child_idx(size_t idx) { return left_child_idx(idx) + 1; }
+ const Node& left_child(size_t idx) const { return m_nodes[left_child_idx(idx)]; }
+ const Node& right_child(size_t idx) const { return m_nodes[right_child_idx(idx)]; }
+
+ template<typename SourceNode>
+ void build(const std::vector<SourceNode> &input)
+ {
+ std::vector<SourceNode> copy(input);
+ this->build(std::move(copy));
+ }
+
+private:
+ // Build a balanced tree by splitting the input sequence by an axis aligned plane at a dimension.
+ template<typename SourceNode>
+ void build_recursive(std::vector<SourceNode> &input, size_t node, const size_t left, const size_t right)
+ {
+ assert(node < m_nodes.size());
+ assert(left <= right);
+
+ if (left == right) {
+ // Insert a node into the balanced tree.
+ m_nodes[node].set(input[left]);
+ return;
+ }
+
+ // Calculate bounding box of the input.
+ BoundingBox bbox(input[left].bbox());
+ for (size_t i = left + 1; i <= right; ++ i)
+ bbox.extend(input[i].bbox());
+ int dimension = -1;
+ bbox.diagonal().maxCoeff(&dimension);
+
+ // Partition the input to left / right pieces of the same length to produce a balanced tree.
+ size_t center = (left + right) / 2;
+ partition_input(input, size_t(dimension), left, right, center);
+ // Insert an inner node into the tree. Inner node does not reference any input entity (triangle, line segment etc).
+ m_nodes[node].idx = inner;
+ m_nodes[node].bbox = bbox;
+ build_recursive(input, node * 2 + 1, left, center);
+ build_recursive(input, node * 2 + 2, center + 1, right);
+ }
+
+ // Partition the input m_nodes <left, right> at "k" and "dimension" using the QuickSelect method:
+ // https://en.wikipedia.org/wiki/Quickselect
+ // Items left of the k'th item are lower than the k'th item in the "dimension",
+ // items right of the k'th item are higher than the k'th item in the "dimension",
+ template<typename SourceNode>
+ void partition_input(std::vector<SourceNode> &input, const size_t dimension, size_t left, size_t right, const size_t k) const
+ {
+ while (left < right) {
+ size_t center = (left + right) / 2;
+ CoordType pivot;
+ {
+ // Bubble sort the input[left], input[center], input[right], so that a median of the three values
+ // will end up in input[center].
+ CoordType left_value = input[left ].centroid()(dimension);
+ CoordType center_value = input[center].centroid()(dimension);
+ CoordType right_value = input[right ].centroid()(dimension);
+ if (left_value > center_value) {
+ std::swap(input[left], input[center]);
+ std::swap(left_value, center_value);
+ }
+ if (left_value > right_value) {
+ std::swap(input[left], input[right]);
+ right_value = left_value;
+ }
+ if (center_value > right_value) {
+ std::swap(input[center], input[right]);
+ center_value = right_value;
+ }
+ pivot = center_value;
+ }
+ if (right <= left + 2)
+ // The <left, right> interval is already sorted.
+ break;
+ size_t i = left;
+ size_t j = right - 1;
+ std::swap(input[center], input[j]);
+ // Partition the set based on the pivot.
+ for (;;) {
+ // Skip left points that are already at correct positions.
+ // Search will certainly stop at position (right - 1), which stores the pivot.
+ while (input[++ i].centroid()(dimension) < pivot) ;
+ // Skip right points that are already at correct positions.
+ while (input[-- j].centroid()(dimension) > pivot && i < j) ;
+ if (i >= j)
+ break;
+ std::swap(input[i], input[j]);
+ }
+ // Restore pivot to the center of the sequence.
+ std::swap(input[i], input[right - 1]);
+ // Which side the kth element is in?
+ if (k < i)
+ right = i - 1;
+ else if (k == i)
+ // Sequence is partitioned, kth element is at its place.
+ break;
+ else
+ left = i + 1;
+ }
+ }
+
+ // The balanced tree storage.
+ std::vector<Node> m_nodes;
+};
+
+using Tree2f = Tree<2, float>;
+using Tree3f = Tree<3, float>;
+using Tree2d = Tree<2, double>;
+using Tree3d = Tree<3, double>;
+
+namespace detail {
+ template<typename AVertexType, typename AIndexedFaceType, typename ATreeType, typename AVectorType>
+ struct RayIntersector {
+ using VertexType = AVertexType;
+ using IndexedFaceType = AIndexedFaceType;
+ using TreeType = ATreeType;
+ using VectorType = AVectorType;
+
+ const std::vector<VertexType> &vertices;
+ const std::vector<IndexedFaceType> &faces;
+ const TreeType &tree;
+
+ const VectorType origin;
+ const VectorType dir;
+ const VectorType invdir;
+ };
+
+ template<typename VertexType, typename IndexedFaceType, typename TreeType, typename VectorType>
+ struct RayIntersectorHits : RayIntersector<VertexType, IndexedFaceType, TreeType, VectorType> {
+ std::vector<igl::Hit> hits;
+ };
+
+ //FIXME implement SSE for float AABB trees with float ray queries.
+ // SSE/SSE2 is supported by any Intel/AMD x64 processor.
+ // SSE support requires 16 byte alignment of the AABB nodes, representing the bounding boxes with 4+4 floats,
+ // storing the node index as the 4th element of the bounding box min value etc.
+ // https://www.flipcode.com/archives/SSE_RayBox_Intersection_Test.shtml
+ template <typename Derivedsource, typename Deriveddir, typename Scalar>
+ inline bool ray_box_intersect_invdir(
+ const Eigen::MatrixBase<Derivedsource> &origin,
+ const Eigen::MatrixBase<Deriveddir> &inv_dir,
+ Eigen::AlignedBox<Scalar,3> box,
+ const Scalar &t0,
+ const Scalar &t1) {
+ // http://people.csail.mit.edu/amy/papers/box-jgt.pdf
+ // "An Efficient and Robust Ray–Box Intersection Algorithm"
+ if (inv_dir.x() < 0)
+ std::swap(box.min().x(), box.max().x());
+ if (inv_dir.y() < 0)
+ std::swap(box.min().y(), box.max().y());
+ Scalar tmin = (box.min().x() - origin.x()) * inv_dir.x();
+ Scalar tymax = (box.max().y() - origin.y()) * inv_dir.y();
+ if (tmin > tymax)
+ return false;
+ Scalar tmax = (box.max().x() - origin.x()) * inv_dir.x();
+ Scalar tymin = (box.min().y() - origin.y()) * inv_dir.y();
+ if (tymin > tmax)
+ return false;
+ if (tymin > tmin)
+ tmin = tymin;
+ if (tymax < tmax)
+ tmax = tymax;
+ if (inv_dir.z() < 0)
+ std::swap(box.min().z(), box.max().z());
+ Scalar tzmin = (box.min().z() - origin.z()) * inv_dir.z();
+ if (tzmin > tmax)
+ return false;
+ Scalar tzmax = (box.max().z() - origin.z()) * inv_dir.z();
+ if (tmin > tzmax)
+ return false;
+ if (tzmin > tmin)
+ tmin = tzmin;
+ if (tzmax < tmax)
+ tmax = tzmax;
+ return tmin < t1 && tmax > t0;
+ }
+
+ template<typename V, typename W>
+ std::enable_if_t<std::is_same<typename V::Scalar, double>::value && std::is_same<typename W::Scalar, double>::value, bool>
+ intersect_triangle(const V &origin, const V &dir, const W &v0, const W &v1, const W &v2, double &t, double &u, double &v) {
+ return intersect_triangle1(const_cast<double*>(origin.data()), const_cast<double*>(dir.data()),
+ const_cast<double*>(v0.data()), const_cast<double*>(v1.data()), const_cast<double*>(v2.data()),
+ &t, &u, &v);
+ }
+
+ template<typename V, typename W>
+ std::enable_if_t<std::is_same<typename V::Scalar, double>::value && !std::is_same<typename W::Scalar, double>::value, bool>
+ intersect_triangle(const V &origin, const V &dir, const W &v0, const W &v1, const W &v2, double &t, double &u, double &v) {
+ using Vector = Eigen::Matrix<double, 3, 1>;
+ Vector w0 = v0.template cast<double>();
+ Vector w1 = v1.template cast<double>();
+ Vector w2 = v2.template cast<double>();
+ return intersect_triangle1(const_cast<double*>(origin.data()), const_cast<double*>(dir.data()),
+ w0.data(), w1.data(), w2.data(), &t, &u, &v);
+ }
+
+ template<typename V, typename W>
+ std::enable_if_t<! std::is_same<typename V::Scalar, double>::value && std::is_same<typename W::Scalar, double>::value, bool>
+ intersect_triangle(const V &origin, const V &dir, const W &v0, const W &v1, const W &v2, double &t, double &u, double &v) {
+ using Vector = Eigen::Matrix<double, 3, 1>;
+ Vector o = origin.template cast<double>();
+ Vector d = dir.template cast<double>();
+ return intersect_triangle1(o.data(), d.data(), const_cast<double*>(v0.data()), const_cast<double*>(v1.data()), const_cast<double*>(v2.data()), &t, &u, &v);
+ }
+
+ template<typename V, typename W>
+ std::enable_if_t<! std::is_same<typename V::Scalar, double>::value && ! std::is_same<typename W::Scalar, double>::value, bool>
+ intersect_triangle(const V &origin, const V &dir, const W &v0, const W &v1, const W &v2, double &t, double &u, double &v) {
+ using Vector = Eigen::Matrix<double, 3, 1>;
+ Vector o = origin.template cast<double>();
+ Vector d = dir.template cast<double>();
+ Vector w0 = v0.template cast<double>();
+ Vector w1 = v1.template cast<double>();
+ Vector w2 = v2.template cast<double>();
+ return intersect_triangle1(o.data(), d.data(), w0.data(), w1.data(), w2.data(), &t, &u, &v);
+ }
+
+ template<typename RayIntersectorType, typename Scalar>
+ static inline bool intersect_ray_recursive_first_hit(
+ RayIntersectorType &ray_intersector,
+ size_t node_idx,
+ Scalar min_t,
+ igl::Hit &hit)
+ {
+ const auto &node = ray_intersector.tree.node(node_idx);
+ assert(node.is_valid());
+
+ if (! ray_box_intersect_invdir(ray_intersector.origin, ray_intersector.invdir, node.bbox.template cast<Scalar>(), Scalar(0), min_t))
+ return false;
+
+ if (node.is_leaf()) {
+ // shoot ray, record hit
+ auto face = ray_intersector.faces[node.idx];
+ double t, u, v;
+ if (intersect_triangle(
+ ray_intersector.origin, ray_intersector.dir,
+ ray_intersector.vertices[face(0)], ray_intersector.vertices[face(1)], ray_intersector.vertices[face(2)],
+ t, u, v)
+ && t > 0.) {
+ hit = igl::Hit { int(node.idx), -1, float(u), float(v), float(t) };
+ return true;
+ } else
+ return false;
+ } else {
+ // Left / right child node index.
+ size_t left = node_idx * 2 + 1;
+ size_t right = left + 1;
+ igl::Hit left_hit;
+ igl::Hit right_hit;
+ bool left_ret = intersect_ray_recursive_first_hit(ray_intersector, left, min_t, left_hit);
+ if (left_ret && left_hit.t < min_t) {
+ min_t = left_hit.t;
+ hit = left_hit;
+ } else
+ left_ret = false;
+ bool right_ret = intersect_ray_recursive_first_hit(ray_intersector, right, min_t, right_hit);
+ if (right_ret && right_hit.t < min_t)
+ hit = right_hit;
+ else
+ right_ret = false;
+ return left_ret || right_ret;
+ }
+ }
+
+ template<typename RayIntersectorType>
+ static inline void intersect_ray_recursive_all_hits(RayIntersectorType &ray_intersector, size_t node_idx)
+ {
+ using Scalar = typename RayIntersectorType::VectorType::Scalar;
+
+ const auto &node = ray_intersector.tree.node(node_idx);
+ assert(node.is_valid());
+
+ if (! ray_box_intersect_invdir(ray_intersector.origin, ray_intersector.invdir, node.bbox.template cast<Scalar>(),
+ Scalar(0), std::numeric_limits<Scalar>::infinity()))
+ return;
+
+ if (node.is_leaf()) {
+ auto face = ray_intersector.faces[node.idx];
+ double t, u, v;
+ if (intersect_triangle(
+ ray_intersector.origin, ray_intersector.dir,
+ ray_intersector.vertices[face(0)], ray_intersector.vertices[face(1)], ray_intersector.vertices[face(2)],
+ t, u, v)
+ && t > 0.) {
+ ray_intersector.hits.emplace_back(igl::Hit{ int(node.idx), -1, float(u), float(v), float(t) });
+ }
+ } else {
+ // Left / right child node index.
+ size_t left = node_idx * 2 + 1;
+ size_t right = left + 1;
+ intersect_ray_recursive_all_hits(ray_intersector, left);
+ intersect_ray_recursive_all_hits(ray_intersector, right);
+ }
+ }
+
+ // Nothing to do with COVID-19 social distancing.
+ template<typename AVertexType, typename AIndexedFaceType, typename ATreeType, typename AVectorType>
+ struct IndexedTriangleSetDistancer {
+ using VertexType = AVertexType;
+ using IndexedFaceType = AIndexedFaceType;
+ using TreeType = ATreeType;
+ using VectorType = AVectorType;
+
+ const std::vector<VertexType> &vertices;
+ const std::vector<IndexedFaceType> &faces;
+ const TreeType &tree;
+
+ const VectorType origin;
+ };
+
+ // Real-time collision detection, Ericson, Chapter 5
+ template<typename Vector>
+ static inline Vector closest_point_to_triangle(const Vector &p, const Vector &a, const Vector &b, const Vector &c)
+ {
+ using Scalar = typename Vector::Scalar;
+ // Check if P in vertex region outside A
+ Vector ab = b - a;
+ Vector ac = c - a;
+ Vector ap = p - a;
+ Scalar d1 = ab.dot(ap);
+ Scalar d2 = ac.dot(ap);
+ if (d1 <= 0 && d2 <= 0)
+ return a;
+ // Check if P in vertex region outside B
+ Vector bp = p - b;
+ Scalar d3 = ab.dot(bp);
+ Scalar d4 = ac.dot(bp);
+ if (d3 >= 0 && d4 <= d3)
+ return b;
+ // Check if P in edge region of AB, if so return projection of P onto AB
+ Scalar vc = d1*d4 - d3*d2;
+ if (a != b && vc <= 0 && d1 >= 0 && d3 <= 0) {
+ Scalar v = d1 / (d1 - d3);
+ return a + v * ab;
+ }
+ // Check if P in vertex region outside C
+ Vector cp = p - c;
+ Scalar d5 = ab.dot(cp);
+ Scalar d6 = ac.dot(cp);
+ if (d6 >= 0 && d5 <= d6)
+ return c;
+ // Check if P in edge region of AC, if so return projection of P onto AC
+ Scalar vb = d5*d2 - d1*d6;
+ if (vb <= 0 && d2 >= 0 && d6 <= 0) {
+ Scalar w = d2 / (d2 - d6);
+ return a + w * ac;
+ }
+ // Check if P in edge region of BC, if so return projection of P onto BC
+ Scalar va = d3*d6 - d5*d4;
+ if (va <= 0 && (d4 - d3) >= 0 && (d5 - d6) >= 0) {
+ Scalar w = (d4 - d3) / ((d4 - d3) + (d5 - d6));
+ return b + w * (c - b);
+ }
+ // P inside face region. Compute Q through its barycentric coordinates (u,v,w)
+ Scalar denom = Scalar(1.0) / (va + vb + vc);
+ Scalar v = vb * denom;
+ Scalar w = vc * denom;
+ return a + ab * v + ac * w; // = u*a + v*b + w*c, u = va * denom = 1.0-v-w
+ };
+
+ template<typename IndexedTriangleSetDistancerType, typename Scalar>
+ static inline Scalar squared_distance_to_indexed_triangle_set_recursive(
+ IndexedTriangleSetDistancerType &distancer,
+ size_t node_idx,
+ Scalar low_sqr_d,
+ Scalar up_sqr_d,
+ size_t &i,
+ Eigen::PlainObjectBase<typename IndexedTriangleSetDistancerType::VectorType> &c)
+ {
+ using Vector = typename IndexedTriangleSetDistancerType::VectorType;
+
+ if (low_sqr_d > up_sqr_d)
+ return low_sqr_d;
+
+ // Save the best achieved hit.
+ auto set_min = [&i, &c, &up_sqr_d](const Scalar sqr_d_candidate, const size_t i_candidate, const Vector &c_candidate) {
+ if (sqr_d_candidate < up_sqr_d) {
+ i = i_candidate;
+ c = c_candidate;
+ up_sqr_d = sqr_d_candidate;
+ }
+ };
+
+ const auto &node = distancer.tree.node(node_idx);
+ assert(node.is_valid());
+ if (node.is_leaf())
+ {
+ const auto &triangle = distancer.faces[node.idx];
+ Vector c_candidate = closest_point_to_triangle<Vector>(
+ distancer.origin,
+ distancer.vertices[triangle(0)].template cast<Scalar>(),
+ distancer.vertices[triangle(1)].template cast<Scalar>(),
+ distancer.vertices[triangle(2)].template cast<Scalar>());
+ set_min((c_candidate - distancer.origin).squaredNorm(), node.idx, c_candidate);
+ }
+ else
+ {
+ size_t left_node_idx = node_idx * 2 + 1;
+ size_t right_node_idx = left_node_idx + 1;
+ const auto &node_left = distancer.tree.node(left_node_idx);
+ const auto &node_right = distancer.tree.node(right_node_idx);
+ assert(node_left.is_valid());
+ assert(node_right.is_valid());
+
+ bool looked_left = false;
+ bool looked_right = false;
+ const auto &look_left = [&]()
+ {
+ size_t i_left;
+ Vector c_left = c;
+ Scalar sqr_d_left = squared_distance_to_indexed_triangle_set_recursive(distancer, left_node_idx, low_sqr_d, up_sqr_d, i_left, c_left);
+ set_min(sqr_d_left, i_left, c_left);
+ looked_left = true;
+ };
+ const auto &look_right = [&]()
+ {
+ size_t i_right;
+ Vector c_right = c;
+ Scalar sqr_d_right = squared_distance_to_indexed_triangle_set_recursive(distancer, right_node_idx, low_sqr_d, up_sqr_d, i_right, c_right);
+ set_min(sqr_d_right, i_right, c_right);
+ looked_right = true;
+ };
+
+ // must look left or right if in box
+ using BBoxScalar = typename IndexedTriangleSetDistancerType::TreeType::BoundingBox::Scalar;
+ if (node_left.bbox.contains(distancer.origin.template cast<BBoxScalar>()))
+ look_left();
+ if (node_right.bbox.contains(distancer.origin.template cast<BBoxScalar>()))
+ look_right();
+ // if haven't looked left and could be less than current min, then look
+ Scalar left_up_sqr_d = node_left.bbox.squaredExteriorDistance(distancer.origin);
+ Scalar right_up_sqr_d = node_right.bbox.squaredExteriorDistance(distancer.origin);
+ if (left_up_sqr_d < right_up_sqr_d) {
+ if (! looked_left && left_up_sqr_d < up_sqr_d)
+ look_left();
+ if (! looked_right && right_up_sqr_d < up_sqr_d)
+ look_right();
+ } else {
+ if (! looked_right && right_up_sqr_d < up_sqr_d)
+ look_right();
+ if (! looked_left && left_up_sqr_d < up_sqr_d)
+ look_left();
+ }
+ }
+ return up_sqr_d;
+ }
+
+} // namespace detail
+
+// Build a balanced AABB Tree over an indexed triangles set, balancing the tree
+// on centroids of the triangles.
+// Epsilon is applied to the bounding boxes of the AABB Tree to cope with numeric inaccuracies
+// during tree traversal.
+template<typename VertexType, typename IndexedFaceType>
+inline Tree<3, typename VertexType::Scalar> build_aabb_tree_over_indexed_triangle_set(
+ // Indexed triangle set - 3D vertices.
+ const std::vector<VertexType> &vertices,
+ // Indexed triangle set - triangular faces, references to vertices.
+ const std::vector<IndexedFaceType> &faces,
+ //FIXME do we want to apply an epsilon?
+ const typename VertexType::Scalar eps = 0)
+{
+ using TreeType = Tree<3, typename VertexType::Scalar>;
+// using CoordType = typename TreeType::CoordType;
+ using VectorType = typename TreeType::VectorType;
+ using BoundingBox = typename TreeType::BoundingBox;
+
+ struct InputType {
+ size_t idx() const { return m_idx; }
+ const BoundingBox& bbox() const { return m_bbox; }
+ const VectorType& centroid() const { return m_centroid; }
+
+ size_t m_idx;
+ BoundingBox m_bbox;
+ VectorType m_centroid;
+ };
+
+ std::vector<InputType> input;
+ input.reserve(faces.size());
+ const VectorType veps(eps, eps, eps);
+ for (size_t i = 0; i < faces.size(); ++ i) {
+ const IndexedFaceType &face = faces[i];
+ const VertexType &v1 = vertices[face(0)];
+ const VertexType &v2 = vertices[face(1)];
+ const VertexType &v3 = vertices[face(2)];
+ InputType n;
+ n.m_idx = i;
+ n.m_centroid = (1./3.) * (v1 + v2 + v3);
+ n.m_bbox = BoundingBox(v1, v1);
+ n.m_bbox.extend(v2);
+ n.m_bbox.extend(v3);
+ n.m_bbox.min() -= veps;
+ n.m_bbox.max() += veps;
+ input.emplace_back(n);
+ }
+
+ TreeType out;
+ out.build(std::move(input));
+ return out;
+}
+
+// Find a first intersection of a ray with indexed triangle set.
+// Intersection test is calculated with the accuracy of VectorType::Scalar
+// even if the triangle mesh and the AABB Tree are built with floats.
+template<typename VertexType, typename IndexedFaceType, typename TreeType, typename VectorType>
+inline bool intersect_ray_first_hit(
+ // Indexed triangle set - 3D vertices.
+ const std::vector<VertexType> &vertices,
+ // Indexed triangle set - triangular faces, references to vertices.
+ const std::vector<IndexedFaceType> &faces,
+ // AABBTreeIndirect::Tree over vertices & faces, bounding boxes built with the accuracy of vertices.
+ const TreeType &tree,
+ // Origin of the ray.
+ const VectorType &origin,
+ // Direction of the ray.
+ const VectorType &dir,
+ // First intersection of the ray with the indexed triangle set.
+ igl::Hit &hit)
+{
+ using Scalar = typename VectorType::Scalar;
+ auto ray_intersector = detail::RayIntersector<VertexType, IndexedFaceType, TreeType, VectorType> {
+ vertices, faces, tree,
+ origin, dir, VectorType(dir.cwiseInverse())
+ };
+ return ! tree.empty() && detail::intersect_ray_recursive_first_hit(
+ ray_intersector, size_t(0), std::numeric_limits<Scalar>::infinity(), hit);
+}
+
+// Find all intersections of a ray with indexed triangle set.
+// Intersection test is calculated with the accuracy of VectorType::Scalar
+// even if the triangle mesh and the AABB Tree are built with floats.
+// The output hits are sorted by the ray parameter.
+// If the ray intersects a shared edge of two triangles, hits for both triangles are returned.
+template<typename VertexType, typename IndexedFaceType, typename TreeType, typename VectorType>
+inline bool intersect_ray_all_hits(
+ // Indexed triangle set - 3D vertices.
+ const std::vector<VertexType> &vertices,
+ // Indexed triangle set - triangular faces, references to vertices.
+ const std::vector<IndexedFaceType> &faces,
+ // AABBTreeIndirect::Tree over vertices & faces, bounding boxes built with the accuracy of vertices.
+ const TreeType &tree,
+ // Origin of the ray.
+ const VectorType &origin,
+ // Direction of the ray.
+ const VectorType &dir,
+ // All intersections of the ray with the indexed triangle set, sorted by parameter t.
+ std::vector<igl::Hit> &hits)
+{
+ auto ray_intersector = detail::RayIntersectorHits<VertexType, IndexedFaceType, TreeType, VectorType> {
+ vertices, faces, tree,
+ origin, dir, VectorType(dir.cwiseInverse())
+ };
+ if (! tree.empty()) {
+ ray_intersector.hits.reserve(8);
+ detail::intersect_ray_recursive_all_hits(ray_intersector, 0);
+ std::swap(hits, ray_intersector.hits);
+ std::sort(hits.begin(), hits.end(), [](const auto &l, const auto &r) { return l.t < r.t; });
+ }
+ return ! hits.empty();
+}
+
+// Finding a closest triangle, its closest point and squared distance to the closest point
+// on a 3D indexed triangle set using a pre-built AABBTreeIndirect::Tree.
+// Closest point to triangle test will be performed with the accuracy of VectorType::Scalar
+// even if the triangle mesh and the AABB Tree are built with floats.
+// Returns squared distance to the closest point or -1 if the input is empty.
+template<typename VertexType, typename IndexedFaceType, typename TreeType, typename VectorType>
+inline typename VectorType::Scalar squared_distance_to_indexed_triangle_set(
+ // Indexed triangle set - 3D vertices.
+ const std::vector<VertexType> &vertices,
+ // Indexed triangle set - triangular faces, references to vertices.
+ const std::vector<IndexedFaceType> &faces,
+ // AABBTreeIndirect::Tree over vertices & faces, bounding boxes built with the accuracy of vertices.
+ const TreeType &tree,
+ // Point to which the closest point on the indexed triangle set is searched for.
+ const VectorType &point,
+ // Index of the closest triangle in faces.
+ size_t &hit_idx_out,
+ // Position of the closest point on the indexed triangle set.
+ Eigen::PlainObjectBase<VectorType> &hit_point_out)
+{
+ using Scalar = typename VectorType::Scalar;
+ auto distancer = detail::IndexedTriangleSetDistancer<VertexType, IndexedFaceType, TreeType, VectorType>
+ { vertices, faces, tree, point };
+ return tree.empty() ? Scalar(-1) :
+ detail::squared_distance_to_indexed_triangle_set_recursive(distancer, size_t(0), Scalar(0), std::numeric_limits<Scalar>::infinity(), hit_idx_out, hit_point_out);
+}
+
+// Decides if exists some triangle in defined radius on a 3D indexed triangle set using a pre-built AABBTreeIndirect::Tree.
+// Closest point to triangle test will be performed with the accuracy of VectorType::Scalar
+// even if the triangle mesh and the AABB Tree are built with floats.
+// Returns true if exists some triangle in defined radius, false otherwise.
+template<typename VertexType, typename IndexedFaceType, typename TreeType, typename VectorType>
+inline bool is_any_triangle_in_radius(
+ // Indexed triangle set - 3D vertices.
+ const std::vector<VertexType> &vertices,
+ // Indexed triangle set - triangular faces, references to vertices.
+ const std::vector<IndexedFaceType> &faces,
+ // AABBTreeIndirect::Tree over vertices & faces, bounding boxes built with the accuracy of vertices.
+ const TreeType &tree,
+ // Point to which the closest point on the indexed triangle set is searched for.
+ const VectorType &point,
+ // Maximum distance in which triangle is search for
+ typename VectorType::Scalar &max_distance)
+{
+ using Scalar = typename VectorType::Scalar;
+ auto distancer = detail::IndexedTriangleSetDistancer<VertexType, IndexedFaceType, TreeType, VectorType>
+ { vertices, faces, tree, point };
+
+ size_t hit_idx;
+ VectorType hit_point = VectorType::Ones() * (std::nan(""));
+
+ if(tree.empty())
+ {
+ return false;
+ }
+
+ detail::squared_distance_to_indexed_triangle_set_recursive(distancer, size_t(0), Scalar(0), max_distance, hit_idx, hit_point);
+
+ return hit_point.allFinite();
+}
+
+
+// Traverse the tree and return the index of an entity whose bounding box
+// contains a given point. Returns size_t(-1) when the point is outside.
+template<typename TreeType, typename VectorType>
+void get_candidate_idxs(const TreeType& tree, const VectorType& v, std::vector<size_t>& candidates, size_t node_idx = 0)
+{
+ if (tree.empty() || ! tree.node(node_idx).bbox.contains(v))
+ return;
+
+ decltype(tree.node(node_idx)) node = tree.node(node_idx);
+ static_assert(std::is_reference<decltype(node)>::value,
+ "Nodes shall be addressed by reference.");
+ assert(node.is_valid());
+ assert(node.bbox.contains(v));
+
+ if (! node.is_leaf()) {
+ if (tree.left_child(node_idx).bbox.contains(v))
+ get_candidate_idxs(tree, v, candidates, tree.left_child_idx(node_idx));
+ if (tree.right_child(node_idx).bbox.contains(v))
+ get_candidate_idxs(tree, v, candidates, tree.right_child_idx(node_idx));
+ } else
+ candidates.push_back(node.idx);
+
+ return;
+}
+
+
+} // namespace AABBTreeIndirect
+} // namespace Slic3r
+
+#endif /* slic3r_AABBTreeIndirect_hpp_ */
diff --git a/src/slic3r/GUI/AppConfig.cpp b/src/libslic3r/AppConfig.cpp
index 215aac7e5..7c9403382 100644
--- a/src/slic3r/GUI/AppConfig.cpp
+++ b/src/libslic3r/AppConfig.cpp
@@ -1,26 +1,24 @@
#include "libslic3r/libslic3r.h"
#include "libslic3r/Utils.hpp"
#include "AppConfig.hpp"
+#include "Exception.hpp"
+#include "Thread.hpp"
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
#include <utility>
-#include <assert.h>
#include <vector>
#include <stdexcept>
-#include <boost/filesystem.hpp>
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem/operations.hpp>
#include <boost/nowide/cenv.hpp>
#include <boost/nowide/fstream.hpp>
#include <boost/property_tree/ini_parser.hpp>
-#include <boost/property_tree/ptree.hpp>
-#include <boost/property_tree/exceptions.hpp>
+#include <boost/property_tree/ptree_fwd.hpp>
#include <boost/algorithm/string/predicate.hpp>
-#include <boost/format.hpp>
+#include <boost/format/format_fwd.hpp>
-#include <wx/string.h>
-#include "I18N.hpp"
+//#include <wx/string.h>
+//#include "I18N.hpp"
namespace Slic3r {
@@ -40,50 +38,103 @@ void AppConfig::reset()
// Override missing or keys with their defaults.
void AppConfig::set_defaults()
{
- // Reset the empty fields to defaults.
- if (get("autocenter").empty())
- set("autocenter", "0");
- // Disable background processing by default as it is not stable.
- if (get("background_processing").empty())
- set("background_processing", "0");
- // If set, the "Controller" tab for the control of the printer over serial line and the serial port settings are hidden.
- // By default, Prusa has the controller hidden.
- if (get("no_controller").empty())
- set("no_controller", "1");
- // If set, the "- default -" selections of print/filament/printer are suppressed, if there is a valid preset available.
- if (get("no_defaults").empty())
- set("no_defaults", "1");
- if (get("show_incompatible_presets").empty())
- set("show_incompatible_presets", "0");
-
- if (get("version_check").empty())
- set("version_check", "1");
- if (get("preset_update").empty())
- set("preset_update", "1");
-
- if (get("export_sources_full_pathnames").empty())
- set("export_sources_full_pathnames", "0");
-
- // remove old 'use_legacy_opengl' parameter from this config, if present
- if (!get("use_legacy_opengl").empty())
- erase("", "use_legacy_opengl");
+ if (m_mode == EAppMode::Editor) {
+ // Reset the empty fields to defaults.
+ if (get("autocenter").empty())
+ set("autocenter", "0");
+ // Disable background processing by default as it is not stable.
+ if (get("background_processing").empty())
+ set("background_processing", "0");
+ // If set, the "Controller" tab for the control of the printer over serial line and the serial port settings are hidden.
+ // By default, Prusa has the controller hidden.
+ if (get("no_controller").empty())
+ set("no_controller", "1");
+ // If set, the "- default -" selections of print/filament/printer are suppressed, if there is a valid preset available.
+ if (get("no_defaults").empty())
+ set("no_defaults", "1");
+ if (get("show_incompatible_presets").empty())
+ set("show_incompatible_presets", "0");
+
+ if (get("show_drop_project_dialog").empty())
+ set("show_drop_project_dialog", "1");
+ if (get("drop_project_action").empty())
+ set("drop_project_action", "1");
+
+ if (get("version_check").empty())
+ set("version_check", "1");
+ if (get("preset_update").empty())
+ set("preset_update", "1");
+
+ if (get("export_sources_full_pathnames").empty())
+ set("export_sources_full_pathnames", "0");
+
+#if ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+#ifdef _WIN32
+ if (get("associate_3mf").empty())
+ set("associate_3mf", "0");
+ if (get("associate_stl").empty())
+ set("associate_stl", "0");
+#endif // _WIN32
+#endif // ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+
+ // remove old 'use_legacy_opengl' parameter from this config, if present
+ if (!get("use_legacy_opengl").empty())
+ erase("", "use_legacy_opengl");
#ifdef __APPLE__
- if (get("use_retina_opengl").empty())
- set("use_retina_opengl", "1");
+ if (get("use_retina_opengl").empty())
+ set("use_retina_opengl", "1");
#endif
- if (get("remember_output_path").empty())
- set("remember_output_path", "1");
+ if (get("single_instance").empty())
+ set("single_instance",
+#ifdef __APPLE__
+ "1"
+#else // __APPLE__
+ "0"
+#endif // __APPLE__
+ );
+
+ if (get("remember_output_path").empty())
+ set("remember_output_path", "1");
+
+ if (get("remember_output_path_removable").empty())
+ set("remember_output_path_removable", "1");
+
+ if (get("use_custom_toolbar_size").empty())
+ set("use_custom_toolbar_size", "0");
+
+ if (get("custom_toolbar_size").empty())
+ set("custom_toolbar_size", "100");
+
+ if (get("auto_toolbar_size").empty())
+ set("auto_toolbar_size", "100");
- if (get("remember_output_path_removable").empty())
- set("remember_output_path_removable", "1");
+#if ENABLE_ENVIRONMENT_MAP
+ if (get("use_environment_map").empty())
+ set("use_environment_map", "0");
+#endif // ENABLE_ENVIRONMENT_MAP
- if (get("use_custom_toolbar_size").empty())
- set("use_custom_toolbar_size", "0");
+ if (get("use_inches").empty())
+ set("use_inches", "0");
- if (get("custom_toolbar_size").empty())
- set("custom_toolbar_size", "100");
+ if (get("default_action_on_close_application").empty())
+ set("default_action_on_close_application", "none"); // , "discard" or "save"
+
+ if (get("default_action_on_select_preset").empty())
+ set("default_action_on_select_preset", "none"); // , "transfer", "discard" or "save"
+ }
+#if ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+ else {
+#ifdef _WIN32
+ if (get("associate_gcode").empty())
+ set("associate_gcode", "0");
+#endif // _WIN32
+ }
+#endif // ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+
+ if (get("seq_top_layer_only").empty())
+ set("seq_top_layer_only", "1");
if (get("use_perspective_camera").empty())
set("use_perspective_camera", "1");
@@ -91,6 +142,19 @@ 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");
+
+ if (get("show_splash_screen").empty())
+ set("show_splash_screen", "1");
+
+#if ENABLE_CTRL_M_ON_WINDOWS
+#ifdef _WIN32
+ if (get("use_legacy_3DConnexion").empty())
+ set("use_legacy_3DConnexion", "0");
+#endif // _WIN32
+#endif // ENABLE_CTRL_M_ON_WINDOWS
+
// Remove legacy window positions/sizes
erase("", "main_frame_maximized");
erase("", "main_frame_pos");
@@ -100,7 +164,7 @@ void AppConfig::set_defaults()
erase("", "object_settings_size");
}
-void AppConfig::load()
+std::string AppConfig::load()
{
// 1) Read the complete config file into a boost::property_tree.
namespace pt = boost::property_tree;
@@ -110,10 +174,15 @@ void AppConfig::load()
pt::read_ini(ifs, tree);
} catch (pt::ptree_error& ex) {
// Error while parsing config file. We'll customize the error message and rethrow to be displayed.
- throw std::runtime_error(
+ // ! But to avoid the use of _utf8 (related to use of wxWidgets)
+ // we will rethrow this exception from the place of load() call, if returned value wouldn't be empty
+ /*
+ throw Slic3r::RuntimeError(
_utf8(L("Error parsing PrusaSlicer config file, it is probably corrupted. "
"Try to manually delete the file to recover from the error. Your user profiles will not be affected.")) +
"\n\n" + AppConfig::config_path() + "\n\n" + ex.what());
+ */
+ return ex.what();
}
// 2) Parse the property_tree, extract the sections and key / value pairs.
@@ -156,13 +225,35 @@ void 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;
+ return "";
}
void AppConfig::save()
{
+ {
+ // Returns "undefined" if the thread naming functionality is not supported by the operating system.
+ std::optional<std::string> current_thread_name = get_current_thread_name();
+ if (current_thread_name && *current_thread_name != "slic3r_main")
+ throw CriticalException("Calling AppConfig::save() from a worker thread!");
+ }
+
// The config is first written to a file with a PID suffix and then moved
// to avoid race conditions with multiple instances of Slic3r
const auto path = config_path();
@@ -170,7 +261,10 @@ void AppConfig::save()
boost::nowide::ofstream c;
c.open(path_pid, std::ios::out | std::ios::trunc);
- c << "# " << Slic3r::header_slic3r_generated() << std::endl;
+ if (m_mode == EAppMode::Editor)
+ c << "# " << Slic3r::header_slic3r_generated() << std::endl;
+ else
+ c << "# " << Slic3r::header_gcodeviewer_generated() << std::endl;
// Make sure the "no" category is written first.
for (const std::pair<std::string, std::string> &kvp : m_storage[""])
c << kvp.first << " = " << kvp.second << std::endl;
@@ -298,13 +392,13 @@ void AppConfig::set_mouse_device(const std::string& name, double translation_spe
std::vector<std::string> AppConfig::get_mouse_device_names() const
{
- static constexpr char *prefix = "mouse_device:";
- static constexpr size_t prefix_len = 13; // strlen(prefix); reports error C2131: expression did not evaluate to a constant on VS2019
- std::vector<std::string> out;
+ static constexpr const char *prefix = "mouse_device:";
+ static const size_t prefix_len = strlen(prefix);
+ std::vector<std::string> out;
for (const std::pair<std::string, std::map<std::string, std::string>>& key_value_pair : m_storage)
- if (boost::starts_with(key_value_pair.first, "mouse_device:") && key_value_pair.first.size() > prefix_len)
+ if (boost::starts_with(key_value_pair.first, prefix) && key_value_pair.first.size() > prefix_len)
out.emplace_back(key_value_pair.first.substr(prefix_len));
- return out;
+ return out;
}
void AppConfig::update_config_dir(const std::string &dir)
@@ -364,13 +458,18 @@ void AppConfig::reset_selections()
it->second.erase("sla_print");
it->second.erase("sla_material");
it->second.erase("printer");
+ it->second.erase("physical_printer");
m_dirty = true;
}
}
std::string AppConfig::config_path()
{
- return (boost::filesystem::path(Slic3r::data_dir()) / (SLIC3R_APP_KEY ".ini")).make_preferred().string();
+ std::string path = (m_mode == EAppMode::Editor) ?
+ (boost::filesystem::path(Slic3r::data_dir()) / (SLIC3R_APP_KEY ".ini")).make_preferred().string() :
+ (boost::filesystem::path(Slic3r::data_dir()) / (GCODEVIEWER_APP_KEY ".ini")).make_preferred().string();
+
+ return path;
}
std::string AppConfig::version_check_url() const
@@ -381,7 +480,7 @@ std::string AppConfig::version_check_url() const
bool AppConfig::exists()
{
- return boost::filesystem::exists(AppConfig::config_path());
+ return boost::filesystem::exists(config_path());
}
}; // namespace Slic3r
diff --git a/src/slic3r/GUI/AppConfig.hpp b/src/libslic3r/AppConfig.hpp
index 346d42b21..c8ccd18cd 100644
--- a/src/slic3r/GUI/AppConfig.hpp
+++ b/src/libslic3r/AppConfig.hpp
@@ -15,9 +15,16 @@ namespace Slic3r {
class AppConfig
{
public:
- AppConfig() :
+ enum class EAppMode : unsigned char
+ {
+ Editor,
+ GCodeViewer
+ };
+
+ explicit AppConfig(EAppMode mode) :
m_dirty(false),
m_orig_version(Semver::invalid()),
+ m_mode(mode),
m_legacy_datadir(false)
{
this->reset();
@@ -29,7 +36,8 @@ public:
void set_defaults();
// Load the slic3r.ini from a user profile directory (or a datadir, if configured).
- void load();
+ // return error string or empty strinf
+ std::string load();
// Store the slic3r.ini into a user profile directory (or a datadir, if configured).
void save();
@@ -60,7 +68,7 @@ public:
boost::trim_all(key_trimmed);
assert(key_trimmed == key);
assert(! key_trimmed.empty());
-#endif _NDEBUG
+#endif // _NDEBUG
std::string &old = m_storage[section][key];
if (old != value) {
old = value;
@@ -121,22 +129,22 @@ public:
void reset_selections();
// Get the default config path from Slic3r::data_dir().
- static std::string config_path();
+ std::string config_path();
// 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?
- static bool exists();
+ bool exists();
std::vector<std::string> get_recent_projects() const;
void set_recent_projects(const std::vector<std::string>& recent_projects);
@@ -174,6 +182,8 @@ private:
return true;
}
+ // Type of application: Editor or GCodeViewer
+ EAppMode m_mode { EAppMode::Editor };
// Map of section, name -> value
std::map<std::string, std::map<std::string, std::string>> m_storage;
// Map of enabled vendors / models / variants
diff --git a/src/libslic3r/Arrange.cpp b/src/libslic3r/Arrange.cpp
index b8ef0bcdc..3800d49e3 100644
--- a/src/libslic3r/Arrange.cpp
+++ b/src/libslic3r/Arrange.cpp
@@ -1,12 +1,13 @@
#include "Arrange.hpp"
-#include "Geometry.hpp"
#include "SVG.hpp"
-#include "MTUtils.hpp"
+
+#include "BoundingBox.hpp"
#include <libnest2d/backends/clipper/geometries.hpp>
#include <libnest2d/optimizers/nlopt/subplex.hpp>
#include <libnest2d/placers/nfpplacer.hpp>
#include <libnest2d/selections/firstfit.hpp>
+#include <libnest2d/utils/rotcalipers.hpp>
#include <numeric>
#include <ClipperUtils.hpp>
@@ -52,8 +53,8 @@ template<class S> struct NfpImpl<S, NfpLevel::CONVEX_ONLY>
namespace Slic3r {
template<class Tout = double, class = FloatingOnly<Tout>, int...EigenArgs>
-inline SLIC3R_CONSTEXPR Eigen::Matrix<Tout, 2, EigenArgs...> unscaled(
- const ClipperLib::IntPoint &v) SLIC3R_NOEXCEPT
+inline constexpr Eigen::Matrix<Tout, 2, EigenArgs...> unscaled(
+ const ClipperLib::IntPoint &v) noexcept
{
return Eigen::Matrix<Tout, 2, EigenArgs...>{unscaled<Tout>(v.X),
unscaled<Tout>(v.Y)};
@@ -83,7 +84,7 @@ const double BIG_ITEM_TRESHOLD = 0.02;
// Fill in the placer algorithm configuration with values carefully chosen for
// Slic3r.
template<class PConf>
-void fillConfig(PConf& pcfg) {
+void fill_config(PConf& pcfg, const ArrangeParams &params) {
// Align the arranged pile into the center of the bin
pcfg.alignment = PConf::Alignment::CENTER;
@@ -93,19 +94,23 @@ void fillConfig(PConf& pcfg) {
// TODO cannot use rotations until multiple objects of same geometry can
// handle different rotations.
- pcfg.rotations = { 0.0 };
+ if (params.allow_rotations)
+ pcfg.rotations = {0., PI / 2., PI, 3. * PI / 2. };
+ else
+ pcfg.rotations = {0.};
// The accuracy of optimization.
// Goes from 0.0 to 1.0 and scales performance as well
- pcfg.accuracy = 0.65f;
+ pcfg.accuracy = params.accuracy;
// Allow parallel execution.
- pcfg.parallel = true;
+ pcfg.parallel = params.parallel;
}
// Apply penalty to object function result. This is used only when alignment
// after arrange is explicitly disabled (PConfig::Alignment::DONT_ALIGN)
-double fixed_overfit(const std::tuple<double, Box>& result, const Box &binbb)
+// Also, this will only work well for Box shaped beds.
+static double fixed_overfit(const std::tuple<double, Box>& result, const Box &binbb)
{
double score = std::get<0>(result);
Box pilebb = std::get<1>(result);
@@ -277,10 +282,10 @@ protected:
if (result.empty())
score = 0.50 * dist + 0.50 * density;
else
- score = R * 0.60 * dist +
- (1.0 - R) * 0.20 * density +
- 0.20 * alignment_score;
-
+ // Let the density matter more when fewer objects remain
+ score = 0.50 * dist + (1.0 - R) * 0.20 * density +
+ 0.30 * alignment_score;
+
break;
}
case LAST_BIG_ITEM: {
@@ -304,15 +309,15 @@ protected:
public:
AutoArranger(const TBin & bin,
- Distance dist,
+ const ArrangeParams &params,
std::function<void(unsigned)> progressind,
std::function<bool(void)> stopcond)
- : m_pck(bin, dist)
+ : m_pck(bin, params.min_obj_distance)
, m_bin(bin)
, m_bin_area(sl::area(bin))
, m_norm(std::sqrt(m_bin_area))
{
- fillConfig(m_pconf);
+ fill_config(m_pconf, params);
// Set up a callback that is called just before arranging starts
// This functionality is provided by the Nester class (m_pack).
@@ -343,18 +348,42 @@ public:
};
m_pconf.object_function = get_objfn();
+
+ m_pconf.on_preload = [this](const ItemGroup &items, PConfig &cfg) {
+ if (items.empty()) return;
+
+ cfg.alignment = PConfig::Alignment::DONT_ALIGN;
+ auto bb = sl::boundingBox(m_bin);
+ auto bbcenter = bb.center();
+ cfg.object_function = [this, bb, bbcenter](const Item &item) {
+ return fixed_overfit(objfunc(item, bbcenter), bb);
+ };
+ };
+
+ auto on_packed = params.on_packed;
- if (progressind) m_pck.progressIndicator(progressind);
+ if (progressind || on_packed)
+ m_pck.progressIndicator([this, progressind, on_packed](unsigned rem) {
+
+ if (progressind)
+ progressind(rem);
+
+ if (on_packed) {
+ int last_bed = m_pck.lastPackedBinId();
+ if (last_bed >= 0) {
+ Item &last_packed = m_pck.lastResult()[last_bed].back();
+ ArrangePolygon ap;
+ ap.bed_idx = last_packed.binId();
+ ap.priority = last_packed.priority();
+ on_packed(ap);
+ }
+ }
+ });
+
if (stopcond) m_pck.stopCondition(stopcond);
m_pck.configure(m_pconf);
}
-
- AutoArranger(const TBin & bin,
- std::function<void(unsigned)> progressind,
- std::function<bool(void)> stopcond)
- : AutoArranger{bin, 0 /* no min distance */, progressind, stopcond}
- {}
template<class It> inline void operator()(It from, It to) {
m_rtree.clear();
@@ -363,22 +392,15 @@ public:
m_item_count = 0;
}
- inline void preload(std::vector<Item>& fixeditems) {
- m_pconf.alignment = PConfig::Alignment::DONT_ALIGN;
- auto bb = sl::boundingBox(m_bin);
- auto bbcenter = bb.center();
- m_pconf.object_function = [this, bb, bbcenter](const Item &item) {
- return fixed_overfit(objfunc(item, bbcenter), bb);
- };
-
- // Build the rtree for queries to work
-
+ PConfig& config() { return m_pconf; }
+ const PConfig& config() const { return m_pconf; }
+
+ inline void preload(std::vector<Item>& fixeditems) {
for(unsigned idx = 0; idx < fixeditems.size(); ++idx) {
Item& itm = fixeditems[idx];
itm.markAsFixedInBin(itm.binId());
}
- m_pck.configure(m_pconf);
m_item_count += fixeditems.size();
}
};
@@ -392,12 +414,12 @@ template<> std::function<double(const Item&)> AutoArranger<Box>::get_objfn()
double score = std::get<0>(result);
auto& fullbb = std::get<1>(result);
-
+
double miss = Placer::overfit(fullbb, m_bin);
miss = miss > 0? miss : 0;
- score += miss*miss;
+ score += miss * miss;
- return score;
+ return score;
};
}
@@ -438,127 +460,6 @@ std::function<double(const Item &)> AutoArranger<clppr::Polygon>::get_objfn()
};
}
-inline Circle to_lnCircle(const CircleBed& circ) {
- return Circle({circ.center()(0), circ.center()(1)}, circ.radius());
-}
-
-// Get the type of bed geometry from a simple vector of points.
-void BedShapeHint::reset(BedShapes type)
-{
- if (m_type != type) {
- if (m_type == bsIrregular)
- m_bed.polygon.Slic3r::Polyline::~Polyline();
- else if (type == bsIrregular)
- ::new (&m_bed.polygon) Polyline();
- }
-
- m_type = type;
-}
-
-BedShapeHint::BedShapeHint(const Polyline &bed) {
- auto x = [](const Point& p) { return p(X); };
- auto y = [](const Point& p) { return p(Y); };
-
- auto width = [x](const BoundingBox& box) {
- return x(box.max) - x(box.min);
- };
-
- auto height = [y](const BoundingBox& box) {
- return y(box.max) - y(box.min);
- };
-
- auto area = [&width, &height](const BoundingBox& box) {
- double w = width(box);
- double h = height(box);
- return w * h;
- };
-
- auto poly_area = [](Polyline p) {
- Polygon pp; pp.points.reserve(p.points.size() + 1);
- pp.points = std::move(p.points);
- pp.points.emplace_back(pp.points.front());
- return std::abs(pp.area());
- };
-
- auto distance_to = [x, y](const Point& p1, const Point& p2) {
- double dx = x(p2) - x(p1);
- double dy = y(p2) - y(p1);
- return std::sqrt(dx*dx + dy*dy);
- };
-
- auto bb = bed.bounding_box();
-
- auto isCircle = [bb, distance_to](const Polyline& polygon) {
- auto center = bb.center();
- std::vector<double> vertex_distances;
- double avg_dist = 0;
- for (auto pt: polygon.points)
- {
- double distance = distance_to(center, pt);
- vertex_distances.push_back(distance);
- avg_dist += distance;
- }
-
- avg_dist /= vertex_distances.size();
-
- CircleBed ret(center, avg_dist);
- for(auto el : vertex_distances)
- {
- if (std::abs(el - avg_dist) > 10 * SCALED_EPSILON) {
- ret = CircleBed();
- break;
- }
- }
-
- return ret;
- };
-
- auto parea = poly_area(bed);
-
- if( (1.0 - parea/area(bb)) < 1e-3 ) {
- m_type = BedShapes::bsBox;
- m_bed.box = bb;
- }
- else if(auto c = isCircle(bed)) {
- m_type = BedShapes::bsCircle;
- m_bed.circ = c;
- } else {
- assert(m_type != BedShapes::bsIrregular);
- m_type = BedShapes::bsIrregular;
- ::new (&m_bed.polygon) Polyline(bed);
- }
-}
-
-BedShapeHint &BedShapeHint::operator=(BedShapeHint &&cpy)
-{
- reset(cpy.m_type);
-
- switch(m_type) {
- case bsBox: m_bed.box = std::move(cpy.m_bed.box); break;
- case bsCircle: m_bed.circ = std::move(cpy.m_bed.circ); break;
- case bsIrregular: m_bed.polygon = std::move(cpy.m_bed.polygon); break;
- case bsInfinite: m_bed.infbed = std::move(cpy.m_bed.infbed); break;
- case bsUnknown: break;
- }
-
- return *this;
-}
-
-BedShapeHint &BedShapeHint::operator=(const BedShapeHint &cpy)
-{
- reset(cpy.m_type);
-
- switch(m_type) {
- case bsBox: m_bed.box = cpy.m_bed.box; break;
- case bsCircle: m_bed.circ = cpy.m_bed.circ; break;
- case bsIrregular: m_bed.polygon = cpy.m_bed.polygon; break;
- case bsInfinite: m_bed.infbed = cpy.m_bed.infbed; break;
- case bsUnknown: break;
- }
-
- return *this;
-}
-
template<class Bin> void remove_large_items(std::vector<Item> &items, Bin &&bin)
{
auto it = items.begin();
@@ -567,25 +468,33 @@ template<class Bin> void remove_large_items(std::vector<Item> &items, Bin &&bin)
++it : it = items.erase(it);
}
+template<class S> Radians min_area_boundingbox_rotation(const S &sh)
+{
+ return minAreaBoundingBox<S, TCompute<S>, boost::rational<LargeInt>>(sh)
+ .angleToX();
+}
+
template<class BinT> // Arrange for arbitrary bin type
void _arrange(
std::vector<Item> & shapes,
std::vector<Item> & excludes,
const BinT & bin,
- coord_t minobjd,
+ const ArrangeParams &params,
std::function<void(unsigned)> progressfn,
std::function<bool()> stopfn)
{
// Integer ceiling the min distance from the bed perimeters
- coord_t md = minobjd;
- md = (md % 2) ? md / 2 + 1 : md / 2;
+ coord_t md = params.min_obj_distance;
+ md = md / 2;
auto corrected_bin = bin;
sl::offset(corrected_bin, md);
+ ArrangeParams mod_params = params;
+ mod_params.min_obj_distance = 0;
+
+ AutoArranger<BinT> arranger{corrected_bin, mod_params, progressfn, stopfn};
- AutoArranger<BinT> arranger{corrected_bin, progressfn, stopfn};
-
- auto infl = coord_t(std::ceil(minobjd / 2.0));
+ auto infl = coord_t(std::ceil(params.min_obj_distance / 2.0));
for (Item& itm : shapes) itm.inflate(infl);
for (Item& itm : excludes) itm.inflate(infl);
@@ -599,48 +508,127 @@ void _arrange(
for (auto &itm : shapes ) inp.emplace_back(itm);
for (auto &itm : excludes) inp.emplace_back(itm);
+ // Use the minimum bounding box rotation as a starting point.
+ // TODO: This only works for convex hull. If we ever switch to concave
+ // polygon nesting, a convex hull needs to be calculated.
+ if (params.allow_rotations)
+ for (auto &itm : shapes)
+ itm.rotation(min_area_boundingbox_rotation(itm.rawShape()));
+
arranger(inp.begin(), inp.end());
for (Item &itm : inp) itm.inflate(-infl);
}
-// The final client function for arrangement. A progress indicator and
-// a stop predicate can be also be passed to control the process.
-void arrange(ArrangePolygons & arrangables,
- const ArrangePolygons & excludes,
- coord_t min_obj_dist,
- const BedShapeHint & bedhint,
- std::function<void(unsigned)> progressind,
- std::function<bool()> stopcondition)
+inline Box to_nestbin(const BoundingBox &bb) { return Box{{bb.min(X), bb.min(Y)}, {bb.max(X), bb.max(Y)}};}
+inline Circle to_nestbin(const CircleBed &c) { return Circle({c.center()(0), c.center()(1)}, c.radius()); }
+inline clppr::Polygon to_nestbin(const Polygon &p) { return sl::create<clppr::Polygon>(Slic3rMultiPoint_to_ClipperPath(p)); }
+inline Box to_nestbin(const InfiniteBed &bed) { return Box::infinite({bed.center.x(), bed.center.y()}); }
+
+inline coord_t width(const BoundingBox& box) { return box.max.x() - box.min.x(); }
+inline coord_t height(const BoundingBox& box) { return box.max.y() - box.min.y(); }
+inline double area(const BoundingBox& box) { return double(width(box)) * height(box); }
+inline double poly_area(const Points &pts) { return std::abs(Polygon::area(pts)); }
+inline double distance_to(const Point& p1, const Point& p2)
{
- namespace clppr = ClipperLib;
+ double dx = p2.x() - p1.x();
+ double dy = p2.y() - p1.y();
+ return std::sqrt(dx*dx + dy*dy);
+}
+
+static CircleBed to_circle(const Point &center, const Points& points) {
+ std::vector<double> vertex_distances;
+ double avg_dist = 0;
- std::vector<Item> items, fixeditems;
- items.reserve(arrangables.size());
+ for (auto pt : points)
+ {
+ double distance = distance_to(center, pt);
+ vertex_distances.push_back(distance);
+ avg_dist += distance;
+ }
+
+ avg_dist /= vertex_distances.size();
- // Create Item from Arrangeable
- auto process_arrangeable = [](const ArrangePolygon &arrpoly,
- std::vector<Item> & outp)
+ CircleBed ret(center, avg_dist);
+ for(auto el : vertex_distances)
{
- Polygon p = arrpoly.poly.contour;
- const Vec2crd &offs = arrpoly.translation;
- double rotation = arrpoly.rotation;
+ if (std::abs(el - avg_dist) > 10 * SCALED_EPSILON) {
+ ret = {};
+ break;
+ }
+ }
+
+ return ret;
+}
- if (p.is_counter_clockwise()) p.reverse();
+// Create Item from Arrangeable
+static void process_arrangeable(const ArrangePolygon &arrpoly,
+ std::vector<Item> & outp)
+{
+ Polygon p = arrpoly.poly.contour;
+ const Vec2crd &offs = arrpoly.translation;
+ double rotation = arrpoly.rotation;
- clppr::Polygon clpath(Slic3rMultiPoint_to_ClipperPath(p));
-
- if (!clpath.Contour.empty()) {
- auto firstp = clpath.Contour.front();
- clpath.Contour.emplace_back(firstp);
- }
+ if (p.is_counter_clockwise()) p.reverse();
- outp.emplace_back(std::move(clpath));
- outp.back().rotation(rotation);
- outp.back().translation({offs.x(), offs.y()});
- outp.back().binId(arrpoly.bed_idx);
- outp.back().priority(arrpoly.priority);
- };
+ clppr::Polygon clpath(Slic3rMultiPoint_to_ClipperPath(p));
+ // This fixes:
+ // https://github.com/prusa3d/PrusaSlicer/issues/2209
+ if (clpath.Contour.size() < 3)
+ return;
+
+ auto firstp = clpath.Contour.front();
+ clpath.Contour.emplace_back(firstp);
+
+ outp.emplace_back(std::move(clpath));
+ outp.back().rotation(rotation);
+ outp.back().translation({offs.x(), offs.y()});
+ outp.back().binId(arrpoly.bed_idx);
+ outp.back().priority(arrpoly.priority);
+}
+
+template<class Fn> auto call_with_bed(const Points &bed, Fn &&fn)
+{
+ if (bed.empty())
+ return fn(InfiniteBed{});
+ else if (bed.size() == 1)
+ return fn(InfiniteBed{bed.front()});
+ else {
+ auto bb = BoundingBox(bed);
+ CircleBed circ = to_circle(bb.center(), bed);
+ auto parea = poly_area(bed);
+
+ if ((1.0 - parea / area(bb)) < 1e-3)
+ return fn(bb);
+ else if (!std::isnan(circ.radius()))
+ return fn(circ);
+ else
+ return fn(Polygon(bed));
+ }
+}
+
+template<>
+void arrange(ArrangePolygons & items,
+ const ArrangePolygons &excludes,
+ const Points & bed,
+ const ArrangeParams & params)
+{
+ call_with_bed(bed, [&](const auto &bin) {
+ arrange(items, excludes, bin, params);
+ });
+}
+
+template<class BedT>
+void arrange(ArrangePolygons & arrangables,
+ const ArrangePolygons &excludes,
+ const BedT & bed,
+ const ArrangeParams & params)
+{
+ namespace clppr = ClipperLib;
+
+ std::vector<Item> items, fixeditems;
+ items.reserve(arrangables.size());
+
for (ArrangePolygon &arrangeable : arrangables)
process_arrangeable(arrangeable, items);
@@ -649,45 +637,10 @@ void arrange(ArrangePolygons & arrangables,
for (Item &itm : fixeditems) itm.inflate(scaled(-2. * EPSILON));
- auto &cfn = stopcondition;
- auto &pri = progressind;
+ auto &cfn = params.stopcondition;
+ auto &pri = params.progressind;
- switch (bedhint.get_type()) {
- case bsBox: {
- // Create the arranger for the box shaped bed
- BoundingBox bbb = bedhint.get_box();
- Box binbb{{bbb.min(X), bbb.min(Y)}, {bbb.max(X), bbb.max(Y)}};
-
- _arrange(items, fixeditems, binbb, min_obj_dist, pri, cfn);
- break;
- }
- case bsCircle: {
- auto cc = to_lnCircle(bedhint.get_circle());
-
- _arrange(items, fixeditems, cc, min_obj_dist, pri, cfn);
- break;
- }
- case bsIrregular: {
- auto ctour = Slic3rMultiPoint_to_ClipperPath(bedhint.get_irregular());
- auto irrbed = sl::create<clppr::Polygon>(std::move(ctour));
- BoundingBox polybb(bedhint.get_irregular());
-
- _arrange(items, fixeditems, irrbed, min_obj_dist, pri, cfn);
- break;
- }
- case bsInfinite: {
- const InfiniteBed& nobin = bedhint.get_infinite();
- auto infbb = Box::infinite({nobin.center.x(), nobin.center.y()});
-
- _arrange(items, fixeditems, infbb, min_obj_dist, pri, cfn);
- break;
- }
- case bsUnknown: {
- // We know nothing about the bed, let it be infinite and zero centered
- _arrange(items, fixeditems, Box::infinite(), min_obj_dist, pri, cfn);
- break;
- }
- }
+ _arrange(items, fixeditems, to_nestbin(bed), params, pri, cfn);
for(size_t i = 0; i < items.size(); ++i) {
clppr::IntPoint tr = items[i].translation();
@@ -697,15 +650,10 @@ void arrange(ArrangePolygons & arrangables,
}
}
-// Arrange, without the fixed items (excludes)
-void arrange(ArrangePolygons & inp,
- coord_t min_d,
- const BedShapeHint & bedhint,
- std::function<void(unsigned)> prfn,
- std::function<bool()> stopfn)
-{
- arrange(inp, {}, min_d, bedhint, prfn, stopfn);
-}
+template void arrange(ArrangePolygons &items, const ArrangePolygons &excludes, const BoundingBox &bed, const ArrangeParams &params);
+template void arrange(ArrangePolygons &items, const ArrangePolygons &excludes, const CircleBed &bed, const ArrangeParams &params);
+template void arrange(ArrangePolygons &items, const ArrangePolygons &excludes, const Polygon &bed, const ArrangeParams &params);
+template void arrange(ArrangePolygons &items, const ArrangePolygons &excludes, const InfiniteBed &bed, const ArrangeParams &params);
} // namespace arr
} // namespace Slic3r
diff --git a/src/libslic3r/Arrange.hpp b/src/libslic3r/Arrange.hpp
index 1cfe1c907..0ff87c88d 100644
--- a/src/libslic3r/Arrange.hpp
+++ b/src/libslic3r/Arrange.hpp
@@ -1,11 +1,12 @@
-#ifndef MODELARRANGE_HPP
-#define MODELARRANGE_HPP
+#ifndef ARRANGE_HPP
+#define ARRANGE_HPP
#include "ExPolygon.hpp"
-#include "BoundingBox.hpp"
namespace Slic3r {
+class BoundingBox;
+
namespace arrangement {
/// A geometry abstraction for a circular print bed. Similarly to BoundingBox.
@@ -15,96 +16,16 @@ class CircleBed {
public:
inline CircleBed(): center_(0, 0), radius_(std::nan("")) {}
- inline CircleBed(const Point& c, double r): center_(c), radius_(r) {}
+ explicit inline CircleBed(const Point& c, double r): center_(c), radius_(r) {}
inline double radius() const { return radius_; }
inline const Point& center() const { return center_; }
- inline operator bool() { return !std::isnan(radius_); }
};
/// Representing an unbounded bed.
-struct InfiniteBed { Point center; };
-
-/// Types of print bed shapes.
-enum BedShapes {
- bsBox,
- bsCircle,
- bsIrregular,
- bsInfinite,
- bsUnknown
-};
-
-/// Info about the print bed for the arrange() function. This is a variant
-/// holding one of the four shapes a bed can be.
-class BedShapeHint {
- BedShapes m_type = BedShapes::bsInfinite;
-
- // The union neither calls constructors nor destructors of its members.
- // The only member with non-trivial constructor / destructor is the polygon,
- // a placement new / delete needs to be called over it.
- union BedShape_u { // TODO: use variant from cpp17?
- CircleBed circ;
- BoundingBox box;
- Polyline polygon;
- InfiniteBed infbed{};
- ~BedShape_u() {}
- BedShape_u() {}
- } m_bed;
-
- // Reset the type, allocate m_bed properly
- void reset(BedShapes type);
-
-public:
-
- BedShapeHint(){}
-
- /// Get a bed shape hint for arrange() from a naked Polyline.
- explicit BedShapeHint(const Polyline &polyl);
- explicit BedShapeHint(const BoundingBox &bb)
- {
- m_type = bsBox; m_bed.box = bb;
- }
-
- explicit BedShapeHint(const CircleBed &c)
- {
- m_type = bsCircle; m_bed.circ = c;
- }
-
- explicit BedShapeHint(const InfiniteBed &ibed)
- {
- m_type = bsInfinite; m_bed.infbed = ibed;
- }
-
- ~BedShapeHint()
- {
- if (m_type == BedShapes::bsIrregular)
- m_bed.polygon.Slic3r::Polyline::~Polyline();
- }
-
- BedShapeHint(const BedShapeHint &cpy) { *this = cpy; }
- BedShapeHint(BedShapeHint &&cpy) { *this = std::move(cpy); }
-
- BedShapeHint &operator=(const BedShapeHint &cpy);
- BedShapeHint& operator=(BedShapeHint &&cpy);
-
- BedShapes get_type() const { return m_type; }
-
- const BoundingBox &get_box() const
- {
- assert(m_type == bsBox); return m_bed.box;
- }
- const CircleBed &get_circle() const
- {
- assert(m_type == bsCircle); return m_bed.circ;
- }
- const Polyline &get_irregular() const
- {
- assert(m_type == bsIrregular); return m_bed.polygon;
- }
- const InfiniteBed &get_infinite() const
- {
- assert(m_type == bsInfinite); return m_bed.infbed;
- }
+struct InfiniteBed {
+ Point center;
+ explicit InfiniteBed(const Point &p = {0, 0}): center{p} {}
};
/// A logical bed representing an object not being arranged. Either the arrange
@@ -125,9 +46,14 @@ struct ArrangePolygon {
ExPolygon poly; /// The 2D silhouette to be arranged
Vec2crd translation{0, 0}; /// The translation of the poly
double rotation{0.0}; /// The rotation of the poly in radians
+ coord_t inflation = 0; /// Arrange with inflated polygon
int bed_idx{UNARRANGED}; /// To which logical bed does poly belong...
int priority{0};
+ // If empty, any rotation is allowed (currently unsupported)
+ // If only a zero is there, no rotation is allowed
+ std::vector<double> allowed_rotations = {0.};
+
/// Optional setter function which can store arbitrary data in its closure
std::function<void(const ArrangePolygon&)> setter = nullptr;
@@ -136,10 +62,47 @@ struct ArrangePolygon {
/// Test if arrange() was called previously and gave a successful result.
bool is_arranged() const { return bed_idx != UNARRANGED; }
+
+ inline ExPolygon transformed_poly() const
+ {
+ ExPolygon ret = poly;
+ ret.rotate(rotation);
+ ret.translate(translation.x(), translation.y());
+
+ return ret;
+ }
};
using ArrangePolygons = std::vector<ArrangePolygon>;
+struct ArrangeParams {
+
+ /// The minimum distance which is allowed for any
+ /// pair of items on the print bed in any direction.
+ coord_t min_obj_distance = 0;
+
+ /// The accuracy of optimization.
+ /// Goes from 0.0 to 1.0 and scales performance as well
+ float accuracy = 1.f;
+
+ /// Allow parallel execution.
+ bool parallel = true;
+
+ bool allow_rotations = false;
+
+ /// Progress indicator callback called when an object gets packed.
+ /// The unsigned argument is the number of items remaining to pack.
+ std::function<void(unsigned)> progressind;
+
+ std::function<void(const ArrangePolygon &)> on_packed;
+
+ /// A predicate returning true if abort is needed.
+ std::function<bool(void)> stopcondition;
+
+ ArrangeParams() = default;
+ explicit ArrangeParams(coord_t md) : min_obj_distance(md) {}
+};
+
/**
* \brief Arranges the input polygons.
*
@@ -150,33 +113,23 @@ using ArrangePolygons = std::vector<ArrangePolygon>;
* \param items Input vector of ArrangePolygons. The transformation, rotation
* and bin_idx fields will be changed after the call finished and can be used
* to apply the result on the input polygon.
- *
- * \param min_obj_distance The minimum distance which is allowed for any
- * pair of items on the print bed in any direction.
- *
- * \param bedhint Info about the shape and type of the bed.
- *
- * \param progressind Progress indicator callback called when
- * an object gets packed. The unsigned argument is the number of items
- * remaining to pack.
- *
- * \param stopcondition A predicate returning true if abort is needed.
*/
-void arrange(ArrangePolygons & items,
- coord_t min_obj_distance,
- const BedShapeHint & bedhint,
- std::function<void(unsigned)> progressind = nullptr,
- std::function<bool(void)> stopcondition = nullptr);
-
-/// Same as the previous, only that it takes unmovable items as an
-/// additional argument. Those will be considered as already arranged objects.
-void arrange(ArrangePolygons & items,
- const ArrangePolygons & excludes,
- coord_t min_obj_distance,
- const BedShapeHint & bedhint,
- std::function<void(unsigned)> progressind = nullptr,
- std::function<bool(void)> stopcondition = nullptr);
-
-} // arr
-} // Slic3r
+template<class TBed> void arrange(ArrangePolygons &items, const ArrangePolygons &excludes, const TBed &bed, const ArrangeParams &params = {});
+
+// A dispatch function that determines the bed shape from a set of points.
+template<> void arrange(ArrangePolygons &items, const ArrangePolygons &excludes, const Points &bed, const ArrangeParams &params);
+
+extern template void arrange(ArrangePolygons &items, const ArrangePolygons &excludes, const BoundingBox &bed, const ArrangeParams &params);
+extern template void arrange(ArrangePolygons &items, const ArrangePolygons &excludes, const CircleBed &bed, const ArrangeParams &params);
+extern template void arrange(ArrangePolygons &items, const ArrangePolygons &excludes, const Polygon &bed, const ArrangeParams &params);
+extern template void arrange(ArrangePolygons &items, const ArrangePolygons &excludes, const InfiniteBed &bed, const ArrangeParams &params);
+
+inline void arrange(ArrangePolygons &items, const Points &bed, const ArrangeParams &params = {}) { arrange(items, {}, bed, params); }
+inline void arrange(ArrangePolygons &items, const BoundingBox &bed, const ArrangeParams &params = {}) { arrange(items, {}, bed, params); }
+inline void arrange(ArrangePolygons &items, const CircleBed &bed, const ArrangeParams &params = {}) { arrange(items, {}, bed, params); }
+inline void arrange(ArrangePolygons &items, const Polygon &bed, const ArrangeParams &params = {}) { arrange(items, {}, bed, params); }
+inline void arrange(ArrangePolygons &items, const InfiniteBed &bed, const ArrangeParams &params = {}) { arrange(items, {}, bed, params); }
+
+}} // namespace Slic3r::arrangement
+
#endif // MODELARRANGE_HPP
diff --git a/src/libslic3r/BoundingBox.cpp b/src/libslic3r/BoundingBox.cpp
index d3cca7ff2..eb4e042a0 100644
--- a/src/libslic3r/BoundingBox.cpp
+++ b/src/libslic3r/BoundingBox.cpp
@@ -11,17 +11,6 @@ template BoundingBoxBase<Vec2d>::BoundingBoxBase(const std::vector<Vec2d> &point
template BoundingBox3Base<Vec3d>::BoundingBox3Base(const std::vector<Vec3d> &points);
-BoundingBox::BoundingBox(const Lines &lines)
-{
- Points points;
- points.reserve(lines.size());
- for (const Line &line : lines) {
- points.emplace_back(line.a);
- points.emplace_back(line.b);
- }
- *this = BoundingBox(points);
-}
-
void BoundingBox::polygon(Polygon* polygon) const
{
polygon->points.clear();
@@ -86,6 +75,7 @@ BoundingBoxBase<PointClass>::merge(const PointClass &point)
}
}
template void BoundingBoxBase<Point>::merge(const Point &point);
+template void BoundingBoxBase<Vec2f>::merge(const Vec2f &point);
template void BoundingBoxBase<Vec2d>::merge(const Vec2d &point);
template <class PointClass> void
@@ -112,6 +102,7 @@ BoundingBoxBase<PointClass>::merge(const BoundingBoxBase<PointClass> &bb)
}
}
template void BoundingBoxBase<Point>::merge(const BoundingBoxBase<Point> &bb);
+template void BoundingBoxBase<Vec2f>::merge(const BoundingBoxBase<Vec2f> &bb);
template void BoundingBoxBase<Vec2d>::merge(const BoundingBoxBase<Vec2d> &bb);
template <class PointClass> void
@@ -126,6 +117,7 @@ BoundingBox3Base<PointClass>::merge(const PointClass &point)
this->defined = true;
}
}
+template void BoundingBox3Base<Vec3f>::merge(const Vec3f &point);
template void BoundingBox3Base<Vec3d>::merge(const Vec3d &point);
template <class PointClass> void
@@ -158,6 +150,7 @@ BoundingBoxBase<PointClass>::size() const
return PointClass(this->max(0) - this->min(0), this->max(1) - this->min(1));
}
template Point BoundingBoxBase<Point>::size() const;
+template Vec2f BoundingBoxBase<Vec2f>::size() const;
template Vec2d BoundingBoxBase<Vec2d>::size() const;
template <class PointClass> PointClass
@@ -165,6 +158,7 @@ BoundingBox3Base<PointClass>::size() const
{
return PointClass(this->max(0) - this->min(0), this->max(1) - this->min(1), this->max(2) - this->min(2));
}
+template Vec3f BoundingBox3Base<Vec3f>::size() const;
template Vec3d BoundingBox3Base<Vec3d>::size() const;
template <class PointClass> double BoundingBoxBase<PointClass>::radius() const
@@ -211,6 +205,7 @@ BoundingBoxBase<PointClass>::center() const
return (this->min + this->max) / 2;
}
template Point BoundingBoxBase<Point>::center() const;
+template Vec2f BoundingBoxBase<Vec2f>::center() const;
template Vec2d BoundingBoxBase<Vec2d>::center() const;
template <class PointClass> PointClass
@@ -218,6 +213,7 @@ BoundingBox3Base<PointClass>::center() const
{
return (this->min + this->max) / 2;
}
+template Vec3f BoundingBox3Base<Vec3f>::center() const;
template Vec3d BoundingBox3Base<Vec3d>::center() const;
template <class PointClass> coordf_t
@@ -226,6 +222,7 @@ BoundingBox3Base<PointClass>::max_size() const
PointClass s = size();
return std::max(s(0), std::max(s(1), s(2)));
}
+template coordf_t BoundingBox3Base<Vec3f>::max_size() const;
template coordf_t BoundingBox3Base<Vec3d>::max_size() const;
// Align a coordinate to a grid. The coordinate may be negative,
diff --git a/src/libslic3r/BoundingBox.hpp b/src/libslic3r/BoundingBox.hpp
index 4fbe72163..8de28af5c 100644
--- a/src/libslic3r/BoundingBox.hpp
+++ b/src/libslic3r/BoundingBox.hpp
@@ -2,6 +2,7 @@
#define slic3r_BoundingBox_hpp_
#include "libslic3r.h"
+#include "Exception.hpp"
#include "Point.hpp"
#include "Polygon.hpp"
@@ -18,19 +19,23 @@ public:
BoundingBoxBase() : min(PointClass::Zero()), max(PointClass::Zero()), defined(false) {}
BoundingBoxBase(const PointClass &pmin, const PointClass &pmax) :
min(pmin), max(pmax), defined(pmin(0) < pmax(0) && pmin(1) < pmax(1)) {}
+ BoundingBoxBase(const PointClass &p1, const PointClass &p2, const PointClass &p3) :
+ min(p1), max(p1), defined(false) { merge(p2); merge(p3); }
BoundingBoxBase(const std::vector<PointClass>& points) : min(PointClass::Zero()), max(PointClass::Zero())
{
- if (points.empty())
- throw std::invalid_argument("Empty point set supplied to BoundingBoxBase constructor");
-
- typename std::vector<PointClass>::const_iterator it = points.begin();
- this->min = *it;
- this->max = *it;
- for (++ it; it != points.end(); ++ it) {
- this->min = this->min.cwiseMin(*it);
- this->max = this->max.cwiseMax(*it);
+ if (points.empty()) {
+ this->defined = false;
+ // throw Slic3r::InvalidArgument("Empty point set supplied to BoundingBoxBase constructor");
+ } else {
+ typename std::vector<PointClass>::const_iterator it = points.begin();
+ this->min = *it;
+ this->max = *it;
+ for (++ it; it != points.end(); ++ it) {
+ this->min = this->min.cwiseMin(*it);
+ this->max = this->max.cwiseMax(*it);
+ }
+ this->defined = (this->min(0) < this->max(0)) && (this->min(1) < this->max(1));
}
- this->defined = (this->min(0) < this->max(0)) && (this->min(1) < this->max(1));
}
void reset() { this->defined = false; this->min = PointClass::Zero(); this->max = PointClass::Zero(); }
void merge(const PointClass &point);
@@ -42,11 +47,15 @@ public:
void translate(coordf_t x, coordf_t y) { assert(this->defined); PointClass v(x, y); this->min += v; this->max += v; }
void translate(const Vec2d &v) { this->min += v; this->max += v; }
void offset(coordf_t delta);
+ BoundingBoxBase<PointClass> inflated(coordf_t delta) const throw() { BoundingBoxBase<PointClass> out(*this); out.offset(delta); return out; }
PointClass center() const;
bool contains(const PointClass &point) const {
return point(0) >= this->min(0) && point(0) <= this->max(0)
&& point(1) >= this->min(1) && point(1) <= this->max(1);
}
+ bool contains(const BoundingBoxBase<PointClass> &other) const {
+ return contains(other.min) && contains(other.max);
+ }
bool overlap(const BoundingBoxBase<PointClass> &other) const {
return ! (this->max(0) < other.min(0) || this->min(0) > other.max(0) ||
this->max(1) < other.min(1) || this->min(1) > other.max(1));
@@ -63,10 +72,12 @@ public:
BoundingBox3Base(const PointClass &pmin, const PointClass &pmax) :
BoundingBoxBase<PointClass>(pmin, pmax)
{ if (pmin(2) >= pmax(2)) BoundingBoxBase<PointClass>::defined = false; }
+ BoundingBox3Base(const PointClass &p1, const PointClass &p2, const PointClass &p3) :
+ BoundingBoxBase<PointClass>(p1, p1) { merge(p2); merge(p3); }
BoundingBox3Base(const std::vector<PointClass>& points)
{
if (points.empty())
- throw std::invalid_argument("Empty point set supplied to BoundingBox3Base constructor");
+ throw Slic3r::InvalidArgument("Empty point set supplied to BoundingBox3Base constructor");
typename std::vector<PointClass>::const_iterator it = points.begin();
this->min = *it;
this->max = *it;
@@ -84,6 +95,7 @@ public:
void translate(coordf_t x, coordf_t y, coordf_t z) { assert(this->defined); PointClass v(x, y, z); this->min += v; this->max += v; }
void translate(const Vec3d &v) { this->min += v; this->max += v; }
void offset(coordf_t delta);
+ BoundingBoxBase<PointClass> inflated(coordf_t delta) const throw() { BoundingBoxBase<PointClass> out(*this); out.offset(delta); return out; }
PointClass center() const;
coordf_t max_size() const;
@@ -107,24 +119,32 @@ extern template void BoundingBoxBase<Vec3d>::scale(double factor);
extern template void BoundingBoxBase<Point>::offset(coordf_t delta);
extern template void BoundingBoxBase<Vec2d>::offset(coordf_t delta);
extern template void BoundingBoxBase<Point>::merge(const Point &point);
+extern template void BoundingBoxBase<Vec2f>::merge(const Vec2f &point);
extern template void BoundingBoxBase<Vec2d>::merge(const Vec2d &point);
extern template void BoundingBoxBase<Point>::merge(const Points &points);
extern template void BoundingBoxBase<Vec2d>::merge(const Pointfs &points);
extern template void BoundingBoxBase<Point>::merge(const BoundingBoxBase<Point> &bb);
+extern template void BoundingBoxBase<Vec2f>::merge(const BoundingBoxBase<Vec2f> &bb);
extern template void BoundingBoxBase<Vec2d>::merge(const BoundingBoxBase<Vec2d> &bb);
extern template Point BoundingBoxBase<Point>::size() const;
+extern template Vec2f BoundingBoxBase<Vec2f>::size() const;
extern template Vec2d BoundingBoxBase<Vec2d>::size() const;
extern template double BoundingBoxBase<Point>::radius() const;
extern template double BoundingBoxBase<Vec2d>::radius() const;
extern template Point BoundingBoxBase<Point>::center() const;
+extern template Vec2f BoundingBoxBase<Vec2f>::center() const;
extern template Vec2d BoundingBoxBase<Vec2d>::center() const;
+extern template void BoundingBox3Base<Vec3f>::merge(const Vec3f &point);
extern template void BoundingBox3Base<Vec3d>::merge(const Vec3d &point);
extern template void BoundingBox3Base<Vec3d>::merge(const Pointf3s &points);
extern template void BoundingBox3Base<Vec3d>::merge(const BoundingBox3Base<Vec3d> &bb);
+extern template Vec3f BoundingBox3Base<Vec3f>::size() const;
extern template Vec3d BoundingBox3Base<Vec3d>::size() const;
extern template double BoundingBox3Base<Vec3d>::radius() const;
extern template void BoundingBox3Base<Vec3d>::offset(coordf_t delta);
+extern template Vec3f BoundingBox3Base<Vec3f>::center() const;
extern template Vec3d BoundingBox3Base<Vec3d>::center() const;
+extern template coordf_t BoundingBox3Base<Vec3f>::max_size() const;
extern template coordf_t BoundingBox3Base<Vec3d>::max_size() const;
class BoundingBox : public BoundingBoxBase<Point>
@@ -143,7 +163,8 @@ public:
BoundingBox() : BoundingBoxBase<Point>() {}
BoundingBox(const Point &pmin, const Point &pmax) : BoundingBoxBase<Point>(pmin, pmax) {}
BoundingBox(const Points &points) : BoundingBoxBase<Point>(points) {}
- BoundingBox(const Lines &lines);
+
+ BoundingBox inflated(coordf_t delta) const throw() { BoundingBox out(*this); out.offset(delta); return out; }
friend BoundingBox get_extents_rotated(const Points &points, double angle);
};
@@ -186,6 +207,25 @@ inline bool empty(const BoundingBox3Base<VT> &bb)
return ! bb.defined || bb.min(0) >= bb.max(0) || bb.min(1) >= bb.max(1) || bb.min(2) >= bb.max(2);
}
+inline BoundingBox scaled(const BoundingBoxf &bb) { return {scaled(bb.min), scaled(bb.max)}; }
+inline BoundingBox3 scaled(const BoundingBoxf3 &bb) { return {scaled(bb.min), scaled(bb.max)}; }
+inline BoundingBoxf unscaled(const BoundingBox &bb) { return {unscaled(bb.min), unscaled(bb.max)}; }
+inline BoundingBoxf3 unscaled(const BoundingBox3 &bb) { return {unscaled(bb.min), unscaled(bb.max)}; }
+
+template<class Tout, class Tin>
+auto cast(const BoundingBoxBase<Tin> &b)
+{
+ return BoundingBoxBase<Vec<3, Tout>>{b.min.template cast<Tout>(),
+ b.max.template cast<Tout>()};
+}
+
+template<class Tout, class Tin>
+auto cast(const BoundingBox3Base<Tin> &b)
+{
+ return BoundingBox3Base<Vec<3, Tout>>{b.min.template cast<Tout>(),
+ b.max.template cast<Tout>()};
+}
+
} // namespace Slic3r
// Serialization through the Cereal library
diff --git a/src/libslic3r/BridgeDetector.cpp b/src/libslic3r/BridgeDetector.cpp
index ce7c960fa..bf8907c3f 100644
--- a/src/libslic3r/BridgeDetector.cpp
+++ b/src/libslic3r/BridgeDetector.cpp
@@ -53,7 +53,7 @@ void BridgeDetector::initialize()
this->_edges = intersection_pl(to_polylines(grown), contours);
#ifdef SLIC3R_DEBUG
- printf(" bridge has " PRINTF_ZU " support(s)\n", this->_edges.size());
+ printf(" bridge has %zu support(s)\n", this->_edges.size());
#endif
// detect anchors as intersection between our bridge expolygon and the lower slices
diff --git a/src/libslic3r/CMakeLists.txt b/src/libslic3r/CMakeLists.txt
index 73b7df5bc..11e37afc6 100644
--- a/src/libslic3r/CMakeLists.txt
+++ b/src/libslic3r/CMakeLists.txt
@@ -1,5 +1,5 @@
project(libslic3r)
-cmake_minimum_required(VERSION 2.6)
+cmake_minimum_required(VERSION 3.13)
include(PrecompiledHeader)
@@ -46,6 +46,8 @@ add_library(libslic3r STATIC
Fill/Fill.hpp
Fill/Fill3DHoneycomb.cpp
Fill/Fill3DHoneycomb.hpp
+ Fill/FillAdaptive.cpp
+ Fill/FillAdaptive.hpp
Fill/FillBase.cpp
Fill/FillBase.hpp
Fill/FillConcentric.cpp
@@ -56,14 +58,13 @@ add_library(libslic3r STATIC
Fill/FillGyroid.hpp
Fill/FillPlanePath.cpp
Fill/FillPlanePath.hpp
+ Fill/FillLine.cpp
+ Fill/FillLine.hpp
Fill/FillRectilinear.cpp
Fill/FillRectilinear.hpp
- Fill/FillRectilinear2.cpp
- Fill/FillRectilinear2.hpp
- Fill/FillRectilinear3.cpp
- Fill/FillRectilinear3.hpp
Flow.cpp
Flow.hpp
+ format.hpp
Format/3mf.cpp
Format/3mf.hpp
Format/AMF.cpp
@@ -76,8 +77,8 @@ add_library(libslic3r STATIC
Format/PRUS.hpp
Format/STL.cpp
Format/STL.hpp
- GCode/Analyzer.cpp
- GCode/Analyzer.hpp
+ Format/SL1.hpp
+ Format/SL1.cpp
GCode/ThumbnailData.cpp
GCode/ThumbnailData.hpp
GCode/CoolingBuffer.cpp
@@ -86,24 +87,26 @@ add_library(libslic3r STATIC
GCode/PostProcessor.hpp
# GCode/PressureEqualizer.cpp
# GCode/PressureEqualizer.hpp
- GCode/PreviewData.cpp
- GCode/PreviewData.hpp
GCode/PrintExtents.cpp
GCode/PrintExtents.hpp
GCode/SpiralVase.cpp
GCode/SpiralVase.hpp
+ GCode/SeamPlacer.cpp
+ GCode/SeamPlacer.hpp
GCode/ToolOrdering.cpp
GCode/ToolOrdering.hpp
GCode/WipeTower.cpp
GCode/WipeTower.hpp
+ GCode/GCodeProcessor.cpp
+ GCode/GCodeProcessor.hpp
+ GCode/AvoidCrossingPerimeters.cpp
+ GCode/AvoidCrossingPerimeters.hpp
GCode.cpp
GCode.hpp
GCodeReader.cpp
GCodeReader.hpp
# GCodeSender.cpp
# GCodeSender.hpp
- GCodeTimeEstimator.cpp
- GCodeTimeEstimator.hpp
GCodeWriter.cpp
GCodeWriter.hpp
Geometry.cpp
@@ -119,12 +122,12 @@ add_library(libslic3r STATIC
Line.hpp
Model.cpp
Model.hpp
+ ModelArrange.hpp
+ ModelArrange.cpp
CustomGCode.cpp
CustomGCode.hpp
Arrange.hpp
Arrange.cpp
- MotionPlanner.cpp
- MotionPlanner.hpp
MultiPoint.cpp
MultiPoint.hpp
MutablePriorityQueue.hpp
@@ -142,6 +145,12 @@ add_library(libslic3r STATIC
PolygonTrimmer.hpp
Polyline.cpp
Polyline.hpp
+ Preset.cpp
+ Preset.hpp
+ PresetBundle.cpp
+ PresetBundle.hpp
+ AppConfig.cpp
+ AppConfig.hpp
Print.cpp
Print.hpp
PrintBase.cpp
@@ -150,6 +159,8 @@ add_library(libslic3r STATIC
PrintConfig.hpp
PrintObject.cpp
PrintRegion.cpp
+ PNGReadWrite.hpp
+ PNGReadWrite.cpp
Semver.cpp
ShortestPath.cpp
ShortestPath.hpp
@@ -159,6 +170,8 @@ add_library(libslic3r STATIC
SLAPrint.hpp
Slicing.cpp
Slicing.hpp
+ SlicesToTriangleMesh.hpp
+ SlicesToTriangleMesh.cpp
SlicingAdaptive.cpp
SlicingAdaptive.hpp
SupportMaterial.cpp
@@ -174,11 +187,20 @@ add_library(libslic3r STATIC
Tesselate.hpp
TriangleMesh.cpp
TriangleMesh.hpp
+ TriangulateWall.hpp
+ TriangulateWall.cpp
utils.cpp
Utils.hpp
Time.cpp
Time.hpp
+ Thread.cpp
+ Thread.hpp
+ TriangleSelector.cpp
+ TriangleSelector.hpp
MTUtils.hpp
+ VoronoiOffset.cpp
+ VoronoiOffset.hpp
+ VoronoiVisualUtils.hpp
Zipper.hpp
Zipper.cpp
MinAreaBoundingBox.hpp
@@ -188,12 +210,16 @@ add_library(libslic3r STATIC
SimplifyMesh.hpp
SimplifyMeshImpl.hpp
SimplifyMesh.cpp
+ MarchingSquares.hpp
+ Optimize/Optimizer.hpp
+ Optimize/NLoptOptimizer.hpp
+ Optimize/BruteforceOptimizer.hpp
${OpenVDBUtils_SOURCES}
- SLA/Common.hpp
- SLA/Common.cpp
SLA/Pad.hpp
SLA/Pad.cpp
SLA/SupportTreeBuilder.hpp
+ SLA/SupportTreeMesher.hpp
+ SLA/SupportTreeMesher.cpp
SLA/SupportTreeBuildsteps.hpp
SLA/SupportTreeBuildsteps.cpp
SLA/SupportTreeBuilder.cpp
@@ -205,10 +231,12 @@ add_library(libslic3r STATIC
SLA/Rotfinder.cpp
SLA/BoostAdapter.hpp
SLA/SpatIndex.hpp
- SLA/Raster.hpp
- SLA/Raster.cpp
- SLA/RasterWriter.hpp
- SLA/RasterWriter.cpp
+ SLA/SpatIndex.cpp
+ SLA/RasterBase.hpp
+ SLA/RasterBase.cpp
+ SLA/AGGRaster.hpp
+ SLA/RasterToPolygons.hpp
+ SLA/RasterToPolygons.cpp
SLA/ConcaveHull.hpp
SLA/ConcaveHull.cpp
SLA/Hollowing.hpp
@@ -219,8 +247,11 @@ add_library(libslic3r STATIC
SLA/SupportPointGenerator.cpp
SLA/Contour3D.hpp
SLA/Contour3D.cpp
- SLA/EigenMesh3D.hpp
+ SLA/IndexedMesh.hpp
+ SLA/IndexedMesh.cpp
SLA/Clustering.hpp
+ SLA/Clustering.cpp
+ SLA/ReprojectPointsOnMesh.hpp
)
if (SLIC3R_STATIC)
@@ -261,7 +292,8 @@ endif ()
encoding_check(libslic3r)
target_compile_definitions(libslic3r PUBLIC -DUSE_TBB -DTBB_USE_CAPTURED_EXCEPTION=0)
-target_include_directories(libslic3r PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} ${LIBNEST2D_INCLUDES} PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
+target_include_directories(libslic3r PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} PUBLIC ${CMAKE_CURRENT_BINARY_DIR})
+target_include_directories(libslic3r PUBLIC ${EXPAT_INCLUDE_DIRS})
target_link_libraries(libslic3r
libnest2d
admesh
@@ -280,6 +312,8 @@ target_link_libraries(libslic3r
TBB::tbb
libslic3r_cgal
${CMAKE_DL_LIBS}
+ PNG::PNG
+ ZLIB::ZLIB
)
if (TARGET OpenVDB::openvdb)
@@ -291,7 +325,7 @@ if(WIN32)
endif()
if(SLIC3R_PROFILE)
- target_link_libraries(slic3r Shiny)
+ target_link_libraries(libslic3r Shiny)
endif()
if (SLIC3R_PCH AND NOT SLIC3R_SYNTAXONLY)
diff --git a/src/libslic3r/ClipperUtils.cpp b/src/libslic3r/ClipperUtils.cpp
index d40d79b3d..305ea134f 100644
--- a/src/libslic3r/ClipperUtils.cpp
+++ b/src/libslic3r/ClipperUtils.cpp
@@ -8,7 +8,16 @@
#include "SVG.hpp"
#endif /* CLIPPER_UTILS_DEBUG */
-#include <Shiny/Shiny.h>
+// Profiling support using the Shiny intrusive profiler
+//#define CLIPPER_UTILS_PROFILE
+#if defined(SLIC3R_PROFILE) && defined(CLIPPER_UTILS_PROFILE)
+ #include <Shiny/Shiny.h>
+ #define CLIPPERUTILS_PROFILE_FUNC() PROFILE_FUNC()
+ #define CLIPPERUTILS_PROFILE_BLOCK(name) PROFILE_BLOCK(name)
+#else
+ #define CLIPPERUTILS_PROFILE_FUNC()
+ #define CLIPPERUTILS_PROFILE_BLOCK(name)
+#endif
#define CLIPPER_OFFSET_SHORTEST_EDGE_FACTOR (0.005f)
@@ -50,7 +59,7 @@ err:
void scaleClipperPolygon(ClipperLib::Path &polygon)
{
- PROFILE_FUNC();
+ CLIPPERUTILS_PROFILE_FUNC();
for (ClipperLib::Path::iterator pit = polygon.begin(); pit != polygon.end(); ++pit) {
pit->X <<= CLIPPER_OFFSET_POWER_OF_2;
pit->Y <<= CLIPPER_OFFSET_POWER_OF_2;
@@ -59,7 +68,7 @@ void scaleClipperPolygon(ClipperLib::Path &polygon)
void scaleClipperPolygons(ClipperLib::Paths &polygons)
{
- PROFILE_FUNC();
+ CLIPPERUTILS_PROFILE_FUNC();
for (ClipperLib::Paths::iterator it = polygons.begin(); it != polygons.end(); ++it)
for (ClipperLib::Path::iterator pit = (*it).begin(); pit != (*it).end(); ++pit) {
pit->X <<= CLIPPER_OFFSET_POWER_OF_2;
@@ -69,7 +78,7 @@ void scaleClipperPolygons(ClipperLib::Paths &polygons)
void unscaleClipperPolygon(ClipperLib::Path &polygon)
{
- PROFILE_FUNC();
+ CLIPPERUTILS_PROFILE_FUNC();
for (ClipperLib::Path::iterator pit = polygon.begin(); pit != polygon.end(); ++pit) {
pit->X += CLIPPER_OFFSET_SCALE_ROUNDING_DELTA;
pit->Y += CLIPPER_OFFSET_SCALE_ROUNDING_DELTA;
@@ -80,7 +89,7 @@ void unscaleClipperPolygon(ClipperLib::Path &polygon)
void unscaleClipperPolygons(ClipperLib::Paths &polygons)
{
- PROFILE_FUNC();
+ CLIPPERUTILS_PROFILE_FUNC();
for (ClipperLib::Paths::iterator it = polygons.begin(); it != polygons.end(); ++it)
for (ClipperLib::Path::iterator pit = (*it).begin(); pit != (*it).end(); ++pit) {
pit->X += CLIPPER_OFFSET_SCALE_ROUNDING_DELTA;
@@ -707,45 +716,33 @@ static void traverse_pt_noholes(const ClipperLib::PolyNodes &nodes, Polygons *ou
});
}
-static void traverse_pt_old(ClipperLib::PolyNodes &nodes, Polygons* retval)
+static void traverse_pt_outside_in(const ClipperLib::PolyNodes &nodes, Polygons *retval)
{
- /* use a nearest neighbor search to order these children
- TODO: supply start_near to chained_path() too? */
-
// collect ordering points
Points ordering_points;
ordering_points.reserve(nodes.size());
- for (ClipperLib::PolyNodes::const_iterator it = nodes.begin(); it != nodes.end(); ++it) {
- Point p((*it)->Contour.front().X, (*it)->Contour.front().Y);
- ordering_points.push_back(p);
- }
-
- // perform the ordering
- ClipperLib::PolyNodes ordered_nodes = chain_clipper_polynodes(ordering_points, nodes);
-
- // push results recursively
- for (ClipperLib::PolyNodes::iterator it = ordered_nodes.begin(); it != ordered_nodes.end(); ++it) {
+ for (const ClipperLib::PolyNode *node : nodes)
+ ordering_points.emplace_back(node->Contour.front().X, node->Contour.front().Y);
+
+ // Perform the ordering, push results recursively.
+ //FIXME pass the last point to chain_clipper_polynodes?
+ for (const ClipperLib::PolyNode *node : chain_clipper_polynodes(ordering_points, nodes)) {
+ retval->emplace_back(ClipperPath_to_Slic3rPolygon(node->Contour));
+ if (node->IsHole())
+ // Orient a hole, which is clockwise oriented, to CCW.
+ retval->back().reverse();
// traverse the next depth
- traverse_pt_old((*it)->Childs, retval);
- retval->push_back(ClipperPath_to_Slic3rPolygon((*it)->Contour));
- if ((*it)->IsHole()) retval->back().reverse(); // ccw
+ traverse_pt_outside_in(node->Childs, retval);
}
}
-Polygons union_pt_chained(const Polygons &subject, bool safety_offset_)
+Polygons union_pt_chained_outside_in(const Polygons &subject, bool safety_offset_)
{
ClipperLib::PolyTree polytree = union_pt(subject, safety_offset_);
Polygons retval;
- traverse_pt_old(polytree.Childs, &retval);
+ traverse_pt_outside_in(polytree.Childs, &retval);
return retval;
-
-// TODO: This needs to be tested:
-// ClipperLib::PolyTree polytree = union_pt(subject, safety_offset_);
-
-// Polygons retval;
-// traverse_pt_noholes(polytree.Childs, &retval);
-// return retval;
}
Polygons simplify_polygons(const Polygons &subject, bool preserve_collinear)
@@ -790,7 +787,7 @@ ExPolygons simplify_polygons_ex(const Polygons &subject, bool preserve_collinear
void safety_offset(ClipperLib::Paths* paths)
{
- PROFILE_FUNC();
+ CLIPPERUTILS_PROFILE_FUNC();
// scale input
scaleClipperPolygons(*paths);
@@ -812,11 +809,11 @@ void safety_offset(ClipperLib::Paths* paths)
if (! ccw)
std::reverse(path.begin(), path.end());
{
- PROFILE_BLOCK(safety_offset_AddPaths);
+ CLIPPERUTILS_PROFILE_BLOCK(safety_offset_AddPaths);
co.AddPath((*paths)[i], ClipperLib::jtMiter, ClipperLib::etClosedPolygon);
}
{
- PROFILE_BLOCK(safety_offset_Execute);
+ CLIPPERUTILS_PROFILE_BLOCK(safety_offset_Execute);
// offset outside by 10um
ClipperLib::Paths out_this;
co.Execute(out_this, ccw ? 10.f * float(CLIPPER_OFFSET_SCALE) : -10.f * float(CLIPPER_OFFSET_SCALE));
@@ -1060,7 +1057,7 @@ Polygons variable_offset_inner(const ExPolygon &expoly, const std::vector<std::v
ClipperLib::Paths holes;
holes.reserve(expoly.holes.size());
for (const Polygon& hole : expoly.holes)
- append(holes, fix_after_outer_offset(mittered_offset_path_scaled(hole, deltas[1 + &hole - expoly.holes.data()], miter_limit), ClipperLib::pftNegative, false));
+ append(holes, fix_after_outer_offset(mittered_offset_path_scaled(hole.points, deltas[1 + &hole - expoly.holes.data()], miter_limit), ClipperLib::pftNegative, false));
#ifndef NDEBUG
for (auto &c : holes)
assert(ClipperLib::Area(c) > 0.);
@@ -1104,7 +1101,7 @@ for (const std::vector<float>& ds : deltas)
ClipperLib::Paths holes;
holes.reserve(expoly.holes.size());
for (const Polygon& hole : expoly.holes)
- append(holes, fix_after_inner_offset(mittered_offset_path_scaled(hole, deltas[1 + &hole - expoly.holes.data()], miter_limit), ClipperLib::pftPositive, true));
+ append(holes, fix_after_inner_offset(mittered_offset_path_scaled(hole.points, deltas[1 + &hole - expoly.holes.data()], miter_limit), ClipperLib::pftPositive, true));
#ifndef NDEBUG
for (auto &c : holes)
assert(ClipperLib::Area(c) > 0.);
@@ -1148,7 +1145,7 @@ for (const std::vector<float>& ds : deltas)
ClipperLib::Paths holes;
holes.reserve(expoly.holes.size());
for (const Polygon& hole : expoly.holes)
- append(holes, fix_after_inner_offset(mittered_offset_path_scaled(hole, deltas[1 + &hole - expoly.holes.data()], miter_limit), ClipperLib::pftPositive, true));
+ append(holes, fix_after_inner_offset(mittered_offset_path_scaled(hole.points, deltas[1 + &hole - expoly.holes.data()], miter_limit), ClipperLib::pftPositive, true));
#ifndef NDEBUG
for (auto &c : holes)
assert(ClipperLib::Area(c) > 0.);
@@ -1196,7 +1193,7 @@ ExPolygons variable_offset_inner_ex(const ExPolygon &expoly, const std::vector<s
ClipperLib::Paths holes;
holes.reserve(expoly.holes.size());
for (const Polygon& hole : expoly.holes)
- append(holes, fix_after_outer_offset(mittered_offset_path_scaled(hole, deltas[1 + &hole - expoly.holes.data()], miter_limit), ClipperLib::pftNegative, false));
+ append(holes, fix_after_outer_offset(mittered_offset_path_scaled(hole.points, deltas[1 + &hole - expoly.holes.data()], miter_limit), ClipperLib::pftNegative, false));
#ifndef NDEBUG
for (auto &c : holes)
assert(ClipperLib::Area(c) > 0.);
diff --git a/src/libslic3r/ClipperUtils.hpp b/src/libslic3r/ClipperUtils.hpp
index 0828ec21f..cd966435b 100644
--- a/src/libslic3r/ClipperUtils.hpp
+++ b/src/libslic3r/ClipperUtils.hpp
@@ -219,7 +219,7 @@ ClipperLib::PolyTree union_pt(const Slic3r::ExPolygons &subject, bool safety_off
ClipperLib::PolyTree union_pt(Slic3r::Polygons &&subject, bool safety_offset_ = false);
ClipperLib::PolyTree union_pt(Slic3r::ExPolygons &&subject, bool safety_offset_ = false);
-Slic3r::Polygons union_pt_chained(const Slic3r::Polygons &subject, bool safety_offset_ = false);
+Slic3r::Polygons union_pt_chained_outside_in(const Slic3r::Polygons &subject, bool safety_offset_ = false);
ClipperLib::PolyNodes order_nodes(const ClipperLib::PolyNodes &nodes);
diff --git a/src/libslic3r/Config.cpp b/src/libslic3r/Config.cpp
index 6806f4f54..ea6c78f7c 100644
--- a/src/libslic3r/Config.cpp
+++ b/src/libslic3r/Config.cpp
@@ -1,10 +1,10 @@
#include "Config.hpp"
+#include "format.hpp"
#include "Utils.hpp"
#include <assert.h>
#include <fstream>
#include <iostream>
#include <iomanip>
-#include <exception> // std::runtime_error
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/erase.hpp>
@@ -192,6 +192,23 @@ bool unescape_strings_cstyle(const std::string &str, std::vector<std::string> &o
}
}
+std::string escape_ampersand(const std::string& str)
+{
+ // Allocate a buffer 2 times the input string length,
+ // so the output will fit even if all input characters get escaped.
+ std::vector<char> out(str.size() * 6, 0);
+ char* outptr = out.data();
+ for (size_t i = 0; i < str.size(); ++i) {
+ char c = str[i];
+ if (c == '&') {
+ (*outptr++) = '&';
+ (*outptr++) = '&';
+ } else
+ (*outptr++) = c;
+ }
+ return std::string(out.data(), outptr - out.data());
+}
+
std::vector<std::string> ConfigOptionDef::cli_args(const std::string &key) const
{
std::vector<std::string> args;
@@ -216,8 +233,9 @@ ConfigOption* ConfigOptionDef::create_empty_option() const
case coFloats: return new ConfigOptionFloatsNullable();
case coInts: return new ConfigOptionIntsNullable();
case coPercents: return new ConfigOptionPercentsNullable();
+ case coFloatsOrPercents: return new ConfigOptionFloatsOrPercentsNullable();
case coBools: return new ConfigOptionBoolsNullable();
- default: throw std::runtime_error(std::string("Unknown option type for nullable option ") + this->label);
+ default: throw Slic3r::RuntimeError(std::string("Unknown option type for nullable option ") + this->label);
}
} else {
switch (this->type) {
@@ -230,6 +248,7 @@ ConfigOption* ConfigOptionDef::create_empty_option() const
case coPercent: return new ConfigOptionPercent();
case coPercents: return new ConfigOptionPercents();
case coFloatOrPercent: return new ConfigOptionFloatOrPercent();
+ case coFloatsOrPercents: return new ConfigOptionFloatsOrPercents();
case coPoint: return new ConfigOptionPoint();
case coPoints: return new ConfigOptionPoints();
case coPoint3: return new ConfigOptionPoint3();
@@ -237,7 +256,7 @@ ConfigOption* ConfigOptionDef::create_empty_option() const
case coBool: return new ConfigOptionBool();
case coBools: return new ConfigOptionBools();
case coEnum: return new ConfigOptionEnumGeneric(this->enum_keys_map);
- default: throw std::runtime_error(std::string("Unknown option type for option ") + this->label);
+ default: throw Slic3r::RuntimeError(std::string("Unknown option type for option ") + this->label);
}
}
}
@@ -464,7 +483,7 @@ bool ConfigBase::set_deserialize_nothrow(const t_config_option_key &opt_key_src,
void ConfigBase::set_deserialize(const t_config_option_key &opt_key_src, const std::string &value_src, bool append)
{
if (! this->set_deserialize_nothrow(opt_key_src, value_src, append))
- throw BadOptionTypeException("ConfigBase::set_deserialize() failed");
+ throw BadOptionTypeException(format("ConfigBase::set_deserialize() failed for parameter \"%1%\", value \"%2%\"", opt_key_src, value_src));
}
void ConfigBase::set_deserialize(std::initializer_list<SetDeserializeItem> items)
@@ -534,7 +553,7 @@ double ConfigBase::get_abs_value(const t_config_option_key &opt_key) const
return opt_def->ratio_over.empty() ? 0. :
static_cast<const ConfigOptionFloatOrPercent*>(raw_opt)->get_abs_value(this->get_abs_value(opt_def->ratio_over));
}
- throw std::runtime_error("ConfigBase::get_abs_value(): Not a valid option type for get_abs_value()");
+ throw Slic3r::RuntimeError("ConfigBase::get_abs_value(): Not a valid option type for get_abs_value()");
}
// Return an absolute value of a possibly relative config variable.
@@ -545,7 +564,7 @@ double ConfigBase::get_abs_value(const t_config_option_key &opt_key, double rati
const ConfigOption *raw_opt = this->option(opt_key);
assert(raw_opt != nullptr);
if (raw_opt->type() != coFloatOrPercent)
- throw std::runtime_error("ConfigBase::get_abs_value(): opt_key is not of coFloatOrPercent");
+ throw Slic3r::RuntimeError("ConfigBase::get_abs_value(): opt_key is not of coFloatOrPercent");
// Compute absolute value.
return static_cast<const ConfigOptionFloatOrPercent*>(raw_opt)->get_abs_value(ratio_over);
}
@@ -570,7 +589,7 @@ void ConfigBase::setenv_() const
void ConfigBase::load(const std::string &file)
{
- if (boost::iends_with(file, ".gcode") || boost::iends_with(file, ".g"))
+ if (is_gcode_file(file))
this->load_from_gcode_file(file);
else
this->load_from_ini(file);
@@ -608,7 +627,7 @@ void ConfigBase::load_from_gcode_file(const std::string &file)
std::getline(ifs, firstline);
if (strncmp(slic3r_gcode_header, firstline.c_str(), strlen(slic3r_gcode_header)) != 0 &&
strncmp(prusaslicer_gcode_header, firstline.c_str(), strlen(prusaslicer_gcode_header)) != 0)
- throw std::runtime_error("Not a PrusaSlicer / Slic3r PE generated g-code.");
+ throw Slic3r::RuntimeError("Not a PrusaSlicer / Slic3r PE generated g-code.");
}
ifs.seekg(0, ifs.end);
auto file_length = ifs.tellg();
@@ -620,7 +639,7 @@ void ConfigBase::load_from_gcode_file(const std::string &file)
size_t key_value_pairs = load_from_gcode_string(data.data());
if (key_value_pairs < 80)
- throw std::runtime_error((boost::format("Suspiciously low number of configuration values extracted from %1%: %2%") % file % key_value_pairs).str());
+ throw Slic3r::RuntimeError(format("Suspiciously low number of configuration values extracted from %1%: %2%", file, key_value_pairs));
}
// Load the config keys from the given string.
@@ -749,7 +768,7 @@ ConfigOption* DynamicConfig::optptr(const t_config_option_key &opt_key, bool cre
throw NoDefinitionException(opt_key);
const ConfigOptionDef *optdef = def->get(opt_key);
if (optdef == nullptr)
-// throw std::runtime_error(std::string("Invalid option name: ") + opt_key);
+// throw Slic3r::RuntimeError(std::string("Invalid option name: ") + opt_key);
// Let the parent decide what to do if the opt_key is not defined by this->def().
return nullptr;
ConfigOption *opt = optdef->create_default_option();
@@ -933,6 +952,8 @@ CEREAL_REGISTER_TYPE(Slic3r::ConfigOptionPercent)
CEREAL_REGISTER_TYPE(Slic3r::ConfigOptionPercents)
CEREAL_REGISTER_TYPE(Slic3r::ConfigOptionPercentsNullable)
CEREAL_REGISTER_TYPE(Slic3r::ConfigOptionFloatOrPercent)
+CEREAL_REGISTER_TYPE(Slic3r::ConfigOptionFloatsOrPercents)
+CEREAL_REGISTER_TYPE(Slic3r::ConfigOptionFloatsOrPercentsNullable)
CEREAL_REGISTER_TYPE(Slic3r::ConfigOptionPoint)
CEREAL_REGISTER_TYPE(Slic3r::ConfigOptionPoints)
CEREAL_REGISTER_TYPE(Slic3r::ConfigOptionPoint3)
@@ -967,6 +988,8 @@ CEREAL_REGISTER_POLYMORPHIC_RELATION(Slic3r::ConfigOptionFloat, Slic3r::ConfigOp
CEREAL_REGISTER_POLYMORPHIC_RELATION(Slic3r::ConfigOptionFloats, Slic3r::ConfigOptionPercents)
CEREAL_REGISTER_POLYMORPHIC_RELATION(Slic3r::ConfigOptionFloats, Slic3r::ConfigOptionPercentsNullable)
CEREAL_REGISTER_POLYMORPHIC_RELATION(Slic3r::ConfigOptionPercent, Slic3r::ConfigOptionFloatOrPercent)
+CEREAL_REGISTER_POLYMORPHIC_RELATION(Slic3r::ConfigOptionVector<Slic3r::FloatOrPercent>, Slic3r::ConfigOptionFloatsOrPercents)
+CEREAL_REGISTER_POLYMORPHIC_RELATION(Slic3r::ConfigOptionVector<Slic3r::FloatOrPercent>, Slic3r::ConfigOptionFloatsOrPercentsNullable)
CEREAL_REGISTER_POLYMORPHIC_RELATION(Slic3r::ConfigOptionSingle<Slic3r::Vec2d>, Slic3r::ConfigOptionPoint)
CEREAL_REGISTER_POLYMORPHIC_RELATION(Slic3r::ConfigOptionVector<Slic3r::Vec2d>, Slic3r::ConfigOptionPoints)
CEREAL_REGISTER_POLYMORPHIC_RELATION(Slic3r::ConfigOptionSingle<Slic3r::Vec3d>, Slic3r::ConfigOptionPoint3)
diff --git a/src/libslic3r/Config.hpp b/src/libslic3r/Config.hpp
index f02caf226..8cdacd59f 100644
--- a/src/libslic3r/Config.hpp
+++ b/src/libslic3r/Config.hpp
@@ -13,6 +13,7 @@
#include <vector>
#include "libslic3r.h"
#include "clonable_ptr.hpp"
+#include "Exception.hpp"
#include "Point.hpp"
#include <boost/algorithm/string/trim.hpp>
@@ -33,33 +34,34 @@ extern std::string escape_strings_cstyle(const std::vector<std::string> &strs);
extern bool unescape_string_cstyle(const std::string &str, std::string &out);
extern bool unescape_strings_cstyle(const std::string &str, std::vector<std::string> &out);
+extern std::string escape_ampersand(const std::string& str);
+
/// Specialization of std::exception to indicate that an unknown config option has been encountered.
-class UnknownOptionException : public std::runtime_error {
+class UnknownOptionException : public Slic3r::RuntimeError {
public:
UnknownOptionException() :
- std::runtime_error("Unknown option exception") {}
+ Slic3r::RuntimeError("Unknown option exception") {}
UnknownOptionException(const std::string &opt_key) :
- std::runtime_error(std::string("Unknown option exception: ") + opt_key) {}
+ Slic3r::RuntimeError(std::string("Unknown option exception: ") + opt_key) {}
};
/// Indicate that the ConfigBase derived class does not provide config definition (the method def() returns null).
-class NoDefinitionException : public std::runtime_error
+class NoDefinitionException : public Slic3r::RuntimeError
{
public:
NoDefinitionException() :
- std::runtime_error("No definition exception") {}
+ Slic3r::RuntimeError("No definition exception") {}
NoDefinitionException(const std::string &opt_key) :
- std::runtime_error(std::string("No definition exception: ") + opt_key) {}
+ Slic3r::RuntimeError(std::string("No definition exception: ") + opt_key) {}
};
/// Indicate that an unsupported accessor was called on a config option.
-class BadOptionTypeException : public std::runtime_error
+class BadOptionTypeException : public Slic3r::RuntimeError
{
public:
- BadOptionTypeException() :
- std::runtime_error("Bad option type exception") {}
- BadOptionTypeException(const char* message) :
- std::runtime_error(message) {}
+ BadOptionTypeException() : Slic3r::RuntimeError("Bad option type exception") {}
+ BadOptionTypeException(const std::string &message) : Slic3r::RuntimeError(message) {}
+ BadOptionTypeException(const char* message) : Slic3r::RuntimeError(message) {}
};
// Type of a configuration value.
@@ -84,6 +86,8 @@ enum ConfigOptionType {
coPercents = coPercent + coVectorType,
// a fraction or an absolute value
coFloatOrPercent = 5,
+ // vector of the above
+ coFloatsOrPercents = coFloatOrPercent + coVectorType,
// single 2d point (Point2f). Currently not used.
coPoint = 6,
// vector of 2d points (Point2f). Currently used for the definition of the print bed and for the extruder offsets.
@@ -168,7 +172,7 @@ public:
void set(const ConfigOption *rhs) override
{
if (rhs->type() != this->type())
- throw std::runtime_error("ConfigOptionSingle: Assigning an incompatible type");
+ throw Slic3r::RuntimeError("ConfigOptionSingle: Assigning an incompatible type");
assert(dynamic_cast<const ConfigOptionSingle<T>*>(rhs));
this->value = static_cast<const ConfigOptionSingle<T>*>(rhs)->value;
}
@@ -176,7 +180,7 @@ public:
bool operator==(const ConfigOption &rhs) const override
{
if (rhs.type() != this->type())
- throw std::runtime_error("ConfigOptionSingle: Comparing incompatible types");
+ throw Slic3r::RuntimeError("ConfigOptionSingle: Comparing incompatible types");
assert(dynamic_cast<const ConfigOptionSingle<T>*>(&rhs));
return this->value == static_cast<const ConfigOptionSingle<T>*>(&rhs)->value;
}
@@ -240,7 +244,7 @@ public:
void set(const ConfigOption *rhs) override
{
if (rhs->type() != this->type())
- throw std::runtime_error("ConfigOptionVector: Assigning an incompatible type");
+ throw Slic3r::RuntimeError("ConfigOptionVector: Assigning an incompatible type");
assert(dynamic_cast<const ConfigOptionVector<T>*>(rhs));
this->values = static_cast<const ConfigOptionVector<T>*>(rhs)->values;
}
@@ -257,12 +261,12 @@ public:
if (opt->type() == this->type()) {
auto other = static_cast<const ConfigOptionVector<T>*>(opt);
if (other->values.empty())
- throw std::runtime_error("ConfigOptionVector::set(): Assigning from an empty vector");
+ throw Slic3r::RuntimeError("ConfigOptionVector::set(): Assigning from an empty vector");
this->values.emplace_back(other->values.front());
} else if (opt->type() == this->scalar_type())
this->values.emplace_back(static_cast<const ConfigOptionSingle<T>*>(opt)->value);
else
- throw std::runtime_error("ConfigOptionVector::set():: Assigning an incompatible type");
+ throw Slic3r::RuntimeError("ConfigOptionVector::set():: Assigning an incompatible type");
}
}
@@ -281,12 +285,12 @@ public:
// Assign the first value of the rhs vector.
auto other = static_cast<const ConfigOptionVector<T>*>(rhs);
if (other->values.empty())
- throw std::runtime_error("ConfigOptionVector::set_at(): Assigning from an empty vector");
+ throw Slic3r::RuntimeError("ConfigOptionVector::set_at(): Assigning from an empty vector");
this->values[i] = other->get_at(j);
} else if (rhs->type() == this->scalar_type())
this->values[i] = static_cast<const ConfigOptionSingle<T>*>(rhs)->value;
else
- throw std::runtime_error("ConfigOptionVector::set_at(): Assigning an incompatible type");
+ throw Slic3r::RuntimeError("ConfigOptionVector::set_at(): Assigning an incompatible type");
}
const T& get_at(size_t i) const
@@ -311,9 +315,9 @@ public:
else if (n > this->values.size()) {
if (this->values.empty()) {
if (opt_default == nullptr)
- throw std::runtime_error("ConfigOptionVector::resize(): No default value provided.");
+ throw Slic3r::RuntimeError("ConfigOptionVector::resize(): No default value provided.");
if (opt_default->type() != this->type())
- throw std::runtime_error("ConfigOptionVector::resize(): Extending with an incompatible type.");
+ throw Slic3r::RuntimeError("ConfigOptionVector::resize(): Extending with an incompatible type.");
this->values.resize(n, static_cast<const ConfigOptionVector<T>*>(opt_default)->values.front());
} else {
// Resize by duplicating the last value.
@@ -330,7 +334,7 @@ public:
bool operator==(const ConfigOption &rhs) const override
{
if (rhs.type() != this->type())
- throw std::runtime_error("ConfigOptionVector: Comparing incompatible types");
+ throw Slic3r::RuntimeError("ConfigOptionVector: Comparing incompatible types");
assert(dynamic_cast<const ConfigOptionVector<T>*>(&rhs));
return this->values == static_cast<const ConfigOptionVector<T>*>(&rhs)->values;
}
@@ -342,9 +346,9 @@ public:
// An option overrides another option if it is not nil and not equal.
bool overriden_by(const ConfigOption *rhs) const override {
if (this->nullable())
- throw std::runtime_error("Cannot override a nullable ConfigOption.");
+ throw Slic3r::RuntimeError("Cannot override a nullable ConfigOption.");
if (rhs->type() != this->type())
- throw std::runtime_error("ConfigOptionVector.overriden_by() applied to different types.");
+ throw Slic3r::RuntimeError("ConfigOptionVector.overriden_by() applied to different types.");
auto rhs_vec = static_cast<const ConfigOptionVector<T>*>(rhs);
if (! rhs->nullable())
// Overridding a non-nullable object with another non-nullable object.
@@ -362,9 +366,9 @@ public:
// Apply an override option, possibly a nullable one.
bool apply_override(const ConfigOption *rhs) override {
if (this->nullable())
- throw std::runtime_error("Cannot override a nullable ConfigOption.");
+ throw Slic3r::RuntimeError("Cannot override a nullable ConfigOption.");
if (rhs->type() != this->type())
- throw std::runtime_error("ConfigOptionVector.apply_override() applied to different types.");
+ throw Slic3r::RuntimeError("ConfigOptionVector.apply_override() applied to different types.");
auto rhs_vec = static_cast<const ConfigOptionVector<T>*>(rhs);
if (! rhs->nullable()) {
// Overridding a non-nullable object with another non-nullable object.
@@ -453,7 +457,7 @@ public:
bool operator==(const ConfigOptionFloatsTempl &rhs) const { return vectors_equal(this->values, rhs.values); }
bool operator==(const ConfigOption &rhs) const override {
if (rhs.type() != this->type())
- throw std::runtime_error("ConfigOptionFloatsTempl: Comparing incompatible types");
+ throw Slic3r::RuntimeError("ConfigOptionFloatsTempl: Comparing incompatible types");
assert(dynamic_cast<const ConfigOptionVector<double>*>(&rhs));
return vectors_equal(this->values, static_cast<const ConfigOptionVector<double>*>(&rhs)->values);
}
@@ -500,7 +504,7 @@ public:
if (NULLABLE)
this->values.push_back(nil_value());
else
- throw std::runtime_error("Deserializing nil into a non-nullable object");
+ throw Slic3r::RuntimeError("Deserializing nil into a non-nullable object");
} else {
std::istringstream iss(item_str);
double value;
@@ -525,9 +529,9 @@ protected:
if (NULLABLE)
ss << "nil";
else
- throw std::runtime_error("Serializing NaN");
+ throw Slic3r::RuntimeError("Serializing NaN");
} else
- throw std::runtime_error("Serializing invalid number");
+ throw Slic3r::RuntimeError("Serializing invalid number");
}
static bool vectors_equal(const std::vector<double> &v1, const std::vector<double> &v2) {
if (NULLABLE) {
@@ -646,7 +650,7 @@ public:
if (NULLABLE)
this->values.push_back(nil_value());
else
- throw std::runtime_error("Deserializing nil into a non-nullable object");
+ throw Slic3r::RuntimeError("Deserializing nil into a non-nullable object");
} else {
std::istringstream iss(item_str);
int value;
@@ -663,7 +667,7 @@ private:
if (NULLABLE)
ss << "nil";
else
- throw std::runtime_error("Serializing NaN");
+ throw Slic3r::RuntimeError("Serializing NaN");
} else
ss << v;
}
@@ -848,7 +852,7 @@ public:
bool operator==(const ConfigOption &rhs) const override
{
if (rhs.type() != this->type())
- throw std::runtime_error("ConfigOptionFloatOrPercent: Comparing incompatible types");
+ throw Slic3r::RuntimeError("ConfigOptionFloatOrPercent: Comparing incompatible types");
assert(dynamic_cast<const ConfigOptionFloatOrPercent*>(&rhs));
return *this == *static_cast<const ConfigOptionFloatOrPercent*>(&rhs);
}
@@ -859,7 +863,7 @@ public:
void set(const ConfigOption *rhs) override {
if (rhs->type() != this->type())
- throw std::runtime_error("ConfigOptionFloatOrPercent: Assigning an incompatible type");
+ throw Slic3r::RuntimeError("ConfigOptionFloatOrPercent: Assigning an incompatible type");
assert(dynamic_cast<const ConfigOptionFloatOrPercent*>(rhs));
*this = *static_cast<const ConfigOptionFloatOrPercent*>(rhs);
}
@@ -887,6 +891,143 @@ private:
template<class Archive> void serialize(Archive &ar) { ar(cereal::base_class<ConfigOptionPercent>(this), percent); }
};
+
+struct FloatOrPercent
+{
+ double value;
+ bool percent;
+
+private:
+ friend class cereal::access;
+ template<class Archive> void serialize(Archive & ar) { ar(this->value); ar(this->percent); }
+};
+
+inline bool operator==(const FloatOrPercent &l, const FloatOrPercent &r)
+{
+ return l.value == r.value && l.percent == r.percent;
+}
+
+inline bool operator!=(const FloatOrPercent& l, const FloatOrPercent& r)
+{
+ return !(l == r);
+}
+
+template<bool NULLABLE>
+class ConfigOptionFloatsOrPercentsTempl : public ConfigOptionVector<FloatOrPercent>
+{
+public:
+ ConfigOptionFloatsOrPercentsTempl() : ConfigOptionVector<FloatOrPercent>() {}
+ explicit ConfigOptionFloatsOrPercentsTempl(size_t n, FloatOrPercent value) : ConfigOptionVector<FloatOrPercent>(n, value) {}
+ explicit ConfigOptionFloatsOrPercentsTempl(std::initializer_list<FloatOrPercent> il) : ConfigOptionVector<FloatOrPercent>(std::move(il)) {}
+ explicit ConfigOptionFloatsOrPercentsTempl(const std::vector<FloatOrPercent> &vec) : ConfigOptionVector<FloatOrPercent>(vec) {}
+ explicit ConfigOptionFloatsOrPercentsTempl(std::vector<FloatOrPercent> &&vec) : ConfigOptionVector<FloatOrPercent>(std::move(vec)) {}
+
+ static ConfigOptionType static_type() { return coFloatsOrPercents; }
+ ConfigOptionType type() const override { return static_type(); }
+ ConfigOption* clone() const override { return new ConfigOptionFloatsOrPercentsTempl(*this); }
+ bool operator==(const ConfigOptionFloatsOrPercentsTempl &rhs) const { return vectors_equal(this->values, rhs.values); }
+ bool operator==(const ConfigOption &rhs) const override {
+ if (rhs.type() != this->type())
+ throw Slic3r::RuntimeError("ConfigOptionFloatsOrPercentsTempl: Comparing incompatible types");
+ assert(dynamic_cast<const ConfigOptionVector<FloatOrPercent>*>(&rhs));
+ return vectors_equal(this->values, static_cast<const ConfigOptionVector<FloatOrPercent>*>(&rhs)->values);
+ }
+ // Could a special "nil" value be stored inside the vector, indicating undefined value?
+ bool nullable() const override { return NULLABLE; }
+ // Special "nil" value to be stored into the vector if this->supports_nil().
+ static FloatOrPercent nil_value() { return { std::numeric_limits<double>::quiet_NaN(), false }; }
+ // A scalar is nil, or all values of a vector are nil.
+ bool is_nil() const override { for (auto v : this->values) if (! std::isnan(v.value)) return false; return true; }
+ bool is_nil(size_t idx) const override { return std::isnan(this->values[idx].value); }
+
+ std::string serialize() const override
+ {
+ std::ostringstream ss;
+ for (const FloatOrPercent &v : this->values) {
+ if (&v != &this->values.front())
+ ss << ",";
+ serialize_single_value(ss, v);
+ }
+ return ss.str();
+ }
+
+ std::vector<std::string> vserialize() const override
+ {
+ std::vector<std::string> vv;
+ vv.reserve(this->values.size());
+ for (const FloatOrPercent &v : this->values) {
+ std::ostringstream ss;
+ serialize_single_value(ss, v);
+ vv.push_back(ss.str());
+ }
+ return vv;
+ }
+
+ bool deserialize(const std::string &str, bool append = false) override
+ {
+ if (! append)
+ this->values.clear();
+ std::istringstream is(str);
+ std::string item_str;
+ while (std::getline(is, item_str, ',')) {
+ boost::trim(item_str);
+ if (item_str == "nil") {
+ if (NULLABLE)
+ this->values.push_back(nil_value());
+ else
+ throw Slic3r::RuntimeError("Deserializing nil into a non-nullable object");
+ } else {
+ bool percent = item_str.find_first_of("%") != std::string::npos;
+ std::istringstream iss(item_str);
+ double value;
+ iss >> value;
+ this->values.push_back({ value, percent });
+ }
+ }
+ return true;
+ }
+
+ ConfigOptionFloatsOrPercentsTempl& operator=(const ConfigOption *opt)
+ {
+ this->set(opt);
+ return *this;
+ }
+
+protected:
+ void serialize_single_value(std::ostringstream &ss, const FloatOrPercent &v) const {
+ if (std::isfinite(v.value)) {
+ ss << v.value;
+ if (v.percent)
+ ss << "%";
+ } else if (std::isnan(v.value)) {
+ if (NULLABLE)
+ ss << "nil";
+ else
+ throw Slic3r::RuntimeError("Serializing NaN");
+ } else
+ throw Slic3r::RuntimeError("Serializing invalid number");
+ }
+ static bool vectors_equal(const std::vector<FloatOrPercent> &v1, const std::vector<FloatOrPercent> &v2) {
+ if (NULLABLE) {
+ if (v1.size() != v2.size())
+ return false;
+ for (auto it1 = v1.begin(), it2 = v2.begin(); it1 != v1.end(); ++ it1, ++ it2)
+ if (! ((std::isnan(it1->value) && std::isnan(it2->value)) || *it1 == *it2))
+ return false;
+ return true;
+ } else
+ // Not supporting nullable values, the default vector compare is cheaper.
+ return v1 == v2;
+ }
+
+private:
+ friend class cereal::access;
+ template<class Archive> void serialize(Archive &ar) { ar(cereal::base_class<ConfigOptionVector<FloatOrPercent>>(this)); }
+};
+
+using ConfigOptionFloatsOrPercents = ConfigOptionFloatsOrPercentsTempl<false>;
+using ConfigOptionFloatsOrPercentsNullable = ConfigOptionFloatsOrPercentsTempl<true>;
+
class ConfigOptionPoint : public ConfigOptionSingle<Vec2d>
{
public:
@@ -1127,7 +1268,7 @@ public:
if (NULLABLE)
this->values.push_back(nil_value());
else
- throw std::runtime_error("Deserializing nil into a non-nullable object");
+ throw Slic3r::RuntimeError("Deserializing nil into a non-nullable object");
} else
this->values.push_back(item_str.compare("1") == 0);
}
@@ -1140,7 +1281,7 @@ protected:
if (NULLABLE)
ss << "nil";
else
- throw std::runtime_error("Serializing NaN");
+ throw Slic3r::RuntimeError("Serializing NaN");
} else
ss << (v ? "1" : "0");
}
@@ -1176,14 +1317,14 @@ public:
bool operator==(const ConfigOption &rhs) const override
{
if (rhs.type() != this->type())
- throw std::runtime_error("ConfigOptionEnum<T>: Comparing incompatible types");
+ throw Slic3r::RuntimeError("ConfigOptionEnum<T>: Comparing incompatible types");
// rhs could be of the following type: ConfigOptionEnumGeneric or ConfigOptionEnum<T>
return this->value == (T)rhs.getInt();
}
void set(const ConfigOption *rhs) override {
if (rhs->type() != this->type())
- throw std::runtime_error("ConfigOptionEnum<T>: Assigning an incompatible type");
+ throw Slic3r::RuntimeError("ConfigOptionEnum<T>: Assigning an incompatible type");
// rhs could be of the following type: ConfigOptionEnumGeneric or ConfigOptionEnum<T>
this->value = (T)rhs->getInt();
}
@@ -1260,14 +1401,14 @@ public:
bool operator==(const ConfigOption &rhs) const override
{
if (rhs.type() != this->type())
- throw std::runtime_error("ConfigOptionEnumGeneric: Comparing incompatible types");
+ throw Slic3r::RuntimeError("ConfigOptionEnumGeneric: Comparing incompatible types");
// rhs could be of the following type: ConfigOptionEnumGeneric or ConfigOptionEnum<T>
return this->value == rhs.getInt();
}
void set(const ConfigOption *rhs) override {
if (rhs->type() != this->type())
- throw std::runtime_error("ConfigOptionEnumGeneric: Assigning an incompatible type");
+ throw Slic3r::RuntimeError("ConfigOptionEnumGeneric: Assigning an incompatible type");
// rhs could be of the following type: ConfigOptionEnumGeneric or ConfigOptionEnum<T>
this->value = rhs->getInt();
}
@@ -1322,7 +1463,7 @@ public:
case coInts: { auto opt = new ConfigOptionIntsNullable(); archive(*opt); return opt; }
case coPercents: { auto opt = new ConfigOptionPercentsNullable();archive(*opt); return opt; }
case coBools: { auto opt = new ConfigOptionBoolsNullable(); archive(*opt); return opt; }
- default: throw std::runtime_error(std::string("ConfigOptionDef::load_option_from_archive(): Unknown nullable option type for option ") + this->opt_key);
+ default: throw Slic3r::RuntimeError(std::string("ConfigOptionDef::load_option_from_archive(): Unknown nullable option type for option ") + this->opt_key);
}
} else {
switch (this->type) {
@@ -1341,7 +1482,7 @@ public:
case coBool: { auto opt = new ConfigOptionBool(); archive(*opt); return opt; }
case coBools: { auto opt = new ConfigOptionBools(); archive(*opt); return opt; }
case coEnum: { auto opt = new ConfigOptionEnumGeneric(this->enum_keys_map); archive(*opt); return opt; }
- default: throw std::runtime_error(std::string("ConfigOptionDef::load_option_from_archive(): Unknown option type for option ") + this->opt_key);
+ default: throw Slic3r::RuntimeError(std::string("ConfigOptionDef::load_option_from_archive(): Unknown option type for option ") + this->opt_key);
}
}
}
@@ -1353,7 +1494,7 @@ public:
case coInts: archive(*static_cast<const ConfigOptionIntsNullable*>(opt)); break;
case coPercents: archive(*static_cast<const ConfigOptionPercentsNullable*>(opt));break;
case coBools: archive(*static_cast<const ConfigOptionBoolsNullable*>(opt)); break;
- default: throw std::runtime_error(std::string("ConfigOptionDef::save_option_to_archive(): Unknown nullable option type for option ") + this->opt_key);
+ default: throw Slic3r::RuntimeError(std::string("ConfigOptionDef::save_option_to_archive(): Unknown nullable option type for option ") + this->opt_key);
}
} else {
switch (this->type) {
@@ -1372,7 +1513,7 @@ public:
case coBool: archive(*static_cast<const ConfigOptionBool*>(opt)); break;
case coBools: archive(*static_cast<const ConfigOptionBools*>(opt)); break;
case coEnum: archive(*static_cast<const ConfigOptionEnumGeneric*>(opt)); break;
- default: throw std::runtime_error(std::string("ConfigOptionDef::save_option_to_archive(): Unknown option type for option ") + this->opt_key);
+ default: throw Slic3r::RuntimeError(std::string("ConfigOptionDef::save_option_to_archive(): Unknown option type for option ") + this->opt_key);
}
}
// Make the compiler happy, shut up the warnings.
@@ -1414,6 +1555,8 @@ public:
bool multiline = false;
// For text input: If true, the GUI text box spans the complete page width.
bool full_width = false;
+ // For text input: If true, the GUI formats text as code (fixed-width)
+ bool is_code = false;
// Not editable. Currently only used for the display of the number of threads.
bool readonly = false;
// Height of a multiline GUI text box.
diff --git a/src/libslic3r/CustomGCode.cpp b/src/libslic3r/CustomGCode.cpp
index 7c505c978..193235bf8 100644
--- a/src/libslic3r/CustomGCode.cpp
+++ b/src/libslic3r/CustomGCode.cpp
@@ -1,6 +1,6 @@
#include "CustomGCode.hpp"
#include "Config.hpp"
-#include "GCode/PreviewData.hpp"
+#include "GCode.hpp"
#include "GCodeWriter.hpp"
namespace Slic3r {
@@ -17,13 +17,13 @@ extern void update_custom_gcode_per_print_z_from_config(Info& info, DynamicPrint
return;
if (info.gcodes.empty() && ! colorprint_heights->values.empty()) {
// Convert the old colorprint_heighs only if there is no equivalent data in a new format.
- const std::vector<std::string>& colors = GCodePreviewData::ColorPrintColors();
- const auto& colorprint_values = colorprint_heights->values;
+ const std::vector<std::string>& colors = ColorPrintColors::get();
+ const auto& colorprint_values = colorprint_heights->values;
info.gcodes.clear();
info.gcodes.reserve(colorprint_values.size());
int i = 0;
for (auto val : colorprint_values)
- info.gcodes.emplace_back(Item{ val, ColorChangeCode, 1, colors[(++i)%7] });
+ info.gcodes.emplace_back(Item{ val, ColorChange, 1, colors[(++i)%7] });
info.mode = SingleExtruder;
}
@@ -43,11 +43,11 @@ extern void check_mode_for_custom_gcode_per_print_z(Info& info)
bool is_single_extruder = true;
for (auto item : info.gcodes)
{
- if (item.gcode == ToolChangeCode) {
+ if (item.type == ToolChange) {
info.mode = MultiAsSingle;
return;
}
- if (item.gcode == ColorChangeCode && item.extruder > 1)
+ if (item.type == ColorChange && item.extruder > 1)
is_single_extruder = false;
}
@@ -60,9 +60,10 @@ std::vector<std::pair<double, unsigned int>> custom_tool_changes(const Info& cus
{
std::vector<std::pair<double, unsigned int>> custom_tool_changes;
for (const Item& custom_gcode : custom_gcode_per_print_z.gcodes)
- if (custom_gcode.gcode == ToolChangeCode) {
+ if (custom_gcode.type == ToolChange) {
// If extruder count in PrinterSettings was changed, use default (0) extruder for extruders, more than num_extruders
- custom_tool_changes.emplace_back(custom_gcode.print_z, static_cast<unsigned int>(custom_gcode.extruder > num_extruders ? 1 : custom_gcode.extruder));
+ assert(custom_gcode.extruder >= 0);
+ custom_tool_changes.emplace_back(custom_gcode.print_z, static_cast<unsigned int>(size_t(custom_gcode.extruder) > num_extruders ? 1 : custom_gcode.extruder));
}
return custom_tool_changes;
}
diff --git a/src/libslic3r/CustomGCode.hpp b/src/libslic3r/CustomGCode.hpp
index a5ef1cc2e..334b40431 100644
--- a/src/libslic3r/CustomGCode.hpp
+++ b/src/libslic3r/CustomGCode.hpp
@@ -8,38 +8,40 @@ namespace Slic3r {
class DynamicPrintConfig;
-// Additional Codes which can be set by user using DoubleSlider
-static constexpr char ColorChangeCode[] = "M600";
-static constexpr char PausePrintCode[] = "M601";
-static constexpr char ToolChangeCode[] = "tool_change";
+namespace CustomGCode {
-enum CustomGcodeType
+enum Type
{
- cgtColorChange,
- cgtPausePrint,
+ ColorChange,
+ PausePrint,
+ ToolChange,
+ Template,
+ Custom
};
-namespace CustomGCode {
-
struct Item
{
bool operator<(const Item& rhs) const { return this->print_z < rhs.print_z; }
bool operator==(const Item& rhs) const
{
return (rhs.print_z == this->print_z ) &&
- (rhs.gcode == this->gcode ) &&
+ (rhs.type == this->type ) &&
(rhs.extruder == this->extruder ) &&
- (rhs.color == this->color );
+ (rhs.color == this->color ) &&
+ (rhs.extra == this->extra );
}
bool operator!=(const Item& rhs) const { return ! (*this == rhs); }
double print_z;
- std::string gcode;
+ Type type;
int extruder; // Informative value for ColorChangeCode and ToolChangeCode
// "gcode" == ColorChangeCode => M600 will be applied for "extruder" extruder
// "gcode" == ToolChangeCode => for whole print tool will be switched to "extruder" extruder
std::string color; // if gcode is equal to PausePrintCode,
// this field is used for save a short message shown on Printer display
+ std::string extra; // this field is used for the extra data like :
+ // - G-code text for the Type::Custom
+ // - message text for the Type::PausePrint
};
enum Mode
diff --git a/src/libslic3r/EdgeGrid.cpp b/src/libslic3r/EdgeGrid.cpp
index 065a69ba3..e7307fda4 100644
--- a/src/libslic3r/EdgeGrid.cpp
+++ b/src/libslic3r/EdgeGrid.cpp
@@ -3,16 +3,16 @@
#include <float.h>
#include <unordered_map>
-#if 0
-// #ifdef SLIC3R_GUI
-#include <wx/image.h>
-#endif /* SLIC3R_GUI */
+#include <png.h>
#include "libslic3r.h"
#include "ClipperUtils.hpp"
#include "EdgeGrid.hpp"
#include "Geometry.hpp"
#include "SVG.hpp"
+#include "PNGReadWrite.hpp"
+
+// #define EDGE_GRID_DEBUG_OUTPUT
#if 0
// Enable debugging and assert in this file.
@@ -55,6 +55,24 @@ void EdgeGrid::Grid::create(const Polygons &polygons, coord_t resolution)
create_from_m_contours(resolution);
}
+void EdgeGrid::Grid::create(const std::vector<const Polygon*> &polygons, coord_t resolution)
+{
+ // Count the contours.
+ size_t ncontours = 0;
+ for (size_t j = 0; j < polygons.size(); ++ j)
+ if (! polygons[j]->points.empty())
+ ++ ncontours;
+
+ // Collect the contours.
+ m_contours.assign(ncontours, nullptr);
+ ncontours = 0;
+ for (size_t j = 0; j < polygons.size(); ++ j)
+ if (! polygons[j]->points.empty())
+ m_contours[ncontours ++] = &polygons[j]->points;
+
+ create_from_m_contours(resolution);
+}
+
void EdgeGrid::Grid::create(const std::vector<Points> &polygons, coord_t resolution)
{
// Count the contours.
@@ -659,6 +677,11 @@ struct PropagateDanielssonSingleVStep3 {
void EdgeGrid::Grid::calculate_sdf()
{
+#ifdef EDGE_GRID_DEBUG_OUTPUT
+ static int iRun = 0;
+ ++ iRun;
+#endif
+
// 1) Initialize a signum and an unsigned vector to a zero iso surface.
size_t nrows = m_rows + 1;
size_t ncols = m_cols + 1;
@@ -756,19 +779,12 @@ void EdgeGrid::Grid::calculate_sdf()
}
}
-#if 0
- static int iRun = 0;
- ++ iRun;
- if (wxImage::FindHandler(wxBITMAP_TYPE_PNG) == nullptr)
- wxImage::AddHandler(new wxPNGHandler);
-//#ifdef SLIC3R_GUI
+#ifdef EDGE_GRID_DEBUG_OUTPUT
{
- wxImage img(ncols, nrows);
- unsigned char *data = img.GetData();
- memset(data, 0, ncols * nrows * 3);
- for (coord_t r = 0; r < nrows; ++r) {
- for (coord_t c = 0; c < ncols; ++c) {
- unsigned char *pxl = data + (((nrows - r - 1) * ncols) + c) * 3;
+ std::vector<uint8_t> pixels(ncols * nrows * 3, 0);
+ for (coord_t r = 0; r < nrows; ++ r) {
+ for (coord_t c = 0; c < ncols; ++ c) {
+ uint8_t *pxl = pixels.data() + (((nrows - r - 1) * ncols) + c) * 3;
float d = m_signed_distance_field[r * ncols + c];
if (d != search_radius) {
float s = 255 * d / search_radius;
@@ -784,15 +800,13 @@ void EdgeGrid::Grid::calculate_sdf()
}
}
}
- img.SaveFile(debug_out_path("unsigned_df-%d.png", iRun), wxBITMAP_TYPE_PNG);
+ png::write_rgb_to_file_scaled(debug_out_path("unsigned_df-%d.png", iRun), ncols, nrows, pixels, 10);
}
{
- wxImage img(ncols, nrows);
- unsigned char *data = img.GetData();
- memset(data, 0, ncols * nrows * 3);
- for (coord_t r = 0; r < nrows; ++r) {
- for (coord_t c = 0; c < ncols; ++c) {
- unsigned char *pxl = data + (((nrows - r - 1) * ncols) + c) * 3;
+ std::vector<uint8_t> pixels(ncols * nrows * 3, 0);
+ for (coord_t r = 0; r < nrows; ++ r) {
+ for (coord_t c = 0; c < ncols; ++ c) {
+ unsigned char *pxl = pixels.data() + (((nrows - r - 1) * ncols) + c) * 3;
float d = m_signed_distance_field[r * ncols + c];
if (d != search_radius) {
float s = 255 * d / search_radius;
@@ -817,9 +831,9 @@ void EdgeGrid::Grid::calculate_sdf()
}
}
}
- img.SaveFile(debug_out_path("signed_df-%d.png", iRun), wxBITMAP_TYPE_PNG);
+ png::write_rgb_to_file_scaled(debug_out_path("signed_df-%d.png", iRun), ncols, nrows, pixels, 10);
}
-#endif /* SLIC3R_GUI */
+#endif // EDGE_GRID_DEBUG_OUTPUT
// 2) Propagate the signum.
#define PROPAGATE_SIGNUM_SINGLE_STEP(DELTA) do { \
@@ -891,17 +905,14 @@ void EdgeGrid::Grid::calculate_sdf()
}
}
-#if 0
-//#ifdef SLIC3R_GUI
+#ifdef EDGE_GRID_DEBUG_OUTPUT
{
- wxImage img(ncols, nrows);
- unsigned char *data = img.GetData();
- memset(data, 0, ncols * nrows * 3);
+ std::vector<uint8_t> pixels(ncols * nrows * 3, 0);
float search_radius = float(m_resolution * 5);
for (coord_t r = 0; r < nrows; ++r) {
for (coord_t c = 0; c < ncols; ++c) {
- unsigned char *pxl = data + (((nrows - r - 1) * ncols) + c) * 3;
- unsigned char sign = signs[r * ncols + c];
+ uint8_t *pxl = pixels.data() + (((nrows - r - 1) * ncols) + c) * 3;
+ uint8_t sign = signs[r * ncols + c];
switch (sign) {
case 0:
// Positive, outside of a narrow band.
@@ -942,20 +953,17 @@ void EdgeGrid::Grid::calculate_sdf()
}
}
}
- img.SaveFile(debug_out_path("signed_df-signs-%d.png", iRun), wxBITMAP_TYPE_PNG);
+ png::write_rgb_to_file_scaled(debug_out_path("signed_df-signs-%d.png", iRun), ncols, nrows, pixels, 10);
}
-#endif /* SLIC3R_GUI */
+#endif // EDGE_GRID_DEBUG_OUTPUT
-#if 0
-//#ifdef SLIC3R_GUI
+#ifdef EDGE_GRID_DEBUG_OUTPUT
{
- wxImage img(ncols, nrows);
- unsigned char *data = img.GetData();
- memset(data, 0, ncols * nrows * 3);
+ std::vector<uint8_t> pixels(ncols * nrows * 3, 0);
float search_radius = float(m_resolution * 5);
for (coord_t r = 0; r < nrows; ++r) {
for (coord_t c = 0; c < ncols; ++c) {
- unsigned char *pxl = data + (((nrows - r - 1) * ncols) + c) * 3;
+ uint8_t *pxl = pixels.data() + (((nrows - r - 1) * ncols) + c) * 3;
float d = m_signed_distance_field[r * ncols + c];
float s = 255.f * fabs(d) / search_radius;
int is = std::max(0, std::min(255, int(floor(s + 0.5f))));
@@ -971,9 +979,9 @@ void EdgeGrid::Grid::calculate_sdf()
}
}
}
- img.SaveFile(debug_out_path("signed_df2-%d.png", iRun), wxBITMAP_TYPE_PNG);
+ png::write_rgb_to_file_scaled(debug_out_path("signed_df2-%d.png", iRun), ncols, nrows, pixels, 10);
}
-#endif /* SLIC3R_GUI */
+#endif // EDGE_GRID_DEBUG_OUTPUT
}
float EdgeGrid::Grid::signed_distance_bilinear(const Point &pt) const
@@ -1147,10 +1155,10 @@ EdgeGrid::Grid::ClosestPointResult EdgeGrid::Grid::closest_point(const Point &pt
}
}
}
- if (result.contour_idx != -1 && d_min <= double(search_radius)) {
+ if (result.contour_idx != size_t(-1) && d_min <= double(search_radius)) {
result.distance = d_min * sign_min;
result.t /= l2_seg_min;
- assert(result.t >= 0. && result.t < 1.);
+ assert(result.t >= 0. && result.t <= 1.);
#ifndef NDEBUG
{
const Slic3r::Points &pts = *m_contours[result.contour_idx];
@@ -1473,26 +1481,18 @@ bool EdgeGrid::Grid::has_intersecting_edges() const
return false;
}
-#if 0
-void EdgeGrid::save_png(const EdgeGrid::Grid &grid, const BoundingBox &bbox, coord_t resolution, const char *path)
+void EdgeGrid::save_png(const EdgeGrid::Grid &grid, const BoundingBox &bbox, coord_t resolution, const char *path, size_t scale)
{
- if (wxImage::FindHandler(wxBITMAP_TYPE_PNG) == nullptr)
- wxImage::AddHandler(new wxPNGHandler);
-
unsigned int w = (bbox.max(0) - bbox.min(0) + resolution - 1) / resolution;
unsigned int h = (bbox.max(1) - bbox.min(1) + resolution - 1) / resolution;
- wxImage img(w, h);
- unsigned char *data = img.GetData();
- memset(data, 0, w * h * 3);
- static int iRun = 0;
- ++iRun;
-
+ std::vector<uint8_t> pixels(w * h * 3, 0);
+
const coord_t search_radius = grid.resolution() * 2;
const coord_t display_blend_radius = grid.resolution() * 2;
for (coord_t r = 0; r < h; ++r) {
for (coord_t c = 0; c < w; ++ c) {
- unsigned char *pxl = data + (((h - r - 1) * w) + c) * 3;
+ unsigned char *pxl = pixels.data() + (((h - r - 1) * w) + c) * 3;
Point pt(c * resolution + bbox.min(0), r * resolution + bbox.min(1));
coordf_t min_dist;
bool on_segment = true;
@@ -1566,9 +1566,8 @@ void EdgeGrid::save_png(const EdgeGrid::Grid &grid, const BoundingBox &bbox, coo
}
}
- img.SaveFile(path, wxBITMAP_TYPE_PNG);
+ png::write_rgb_to_file_scaled(path, w, h, pixels, scale);
}
-#endif /* SLIC3R_GUI */
// Find all pairs of intersectiong edges from the set of polygons.
std::vector<std::pair<EdgeGrid::Grid::ContourEdge, EdgeGrid::Grid::ContourEdge>> intersecting_edges(const Polygons &polygons)
@@ -1586,12 +1585,17 @@ std::vector<std::pair<EdgeGrid::Grid::ContourEdge, EdgeGrid::Grid::ContourEdge>>
++ cnt;
}
}
- len /= double(cnt);
- bbox.offset(20);
- EdgeGrid::Grid grid;
- grid.set_bbox(bbox);
- grid.create(polygons, len);
- return grid.intersecting_edges();
+
+ std::vector<std::pair<EdgeGrid::Grid::ContourEdge, EdgeGrid::Grid::ContourEdge>> out;
+ if (cnt > 0) {
+ len /= double(cnt);
+ bbox.offset(20);
+ EdgeGrid::Grid grid;
+ grid.set_bbox(bbox);
+ grid.create(polygons, len);
+ out = grid.intersecting_edges();
+ }
+ return out;
}
// Find all pairs of intersectiong edges from the set of polygons, highlight them in an SVG.
diff --git a/src/libslic3r/EdgeGrid.hpp b/src/libslic3r/EdgeGrid.hpp
index 81517a5c4..c3bc869d4 100644
--- a/src/libslic3r/EdgeGrid.hpp
+++ b/src/libslic3r/EdgeGrid.hpp
@@ -21,6 +21,7 @@ public:
void set_bbox(const BoundingBox &bbox) { m_bbox = bbox; }
void create(const Polygons &polygons, coord_t resolution);
+ void create(const std::vector<const Polygon*> &polygons, coord_t resolution);
void create(const std::vector<Points> &polygons, coord_t resolution);
void create(const ExPolygon &expoly, coord_t resolution);
void create(const ExPolygons &expolygons, coord_t resolution);
@@ -83,10 +84,14 @@ public:
template<typename VISITOR> void visit_cells_intersecting_line(Slic3r::Point p1, Slic3r::Point p2, VISITOR &visitor) const
{
// End points of the line segment.
- p1(0) -= m_bbox.min(0);
- p1(1) -= m_bbox.min(1);
- p2(0) -= m_bbox.min(0);
- p2(1) -= m_bbox.min(1);
+ assert(m_bbox.contains(p1));
+ assert(m_bbox.contains(p2));
+ p1 -= m_bbox.min;
+ p2 -= m_bbox.min;
+ assert(p1.x() >= 0 && p1.x() < m_cols * m_resolution);
+ assert(p1.y() >= 0 && p1.y() < m_rows * m_resolution);
+ assert(p2.x() >= 0 && p2.x() < m_cols * m_resolution);
+ assert(p2.y() >= 0 && p2.y() < m_rows * m_resolution);
// Get the cells of the end points.
coord_t ix = p1(0) / m_resolution;
coord_t iy = p1(1) / m_resolution;
@@ -114,18 +119,22 @@ public:
ey -= ex;
ex = int64_t(dy) * m_resolution;
ix += 1;
+ assert(ix <= ixb);
}
else if (ex == ey) {
ex = int64_t(dy) * m_resolution;
ey = int64_t(dx) * m_resolution;
ix += 1;
iy += 1;
+ assert(ix <= ixb);
+ assert(iy <= iyb);
}
else {
assert(ex > ey);
ex -= ey;
ey = int64_t(dx) * m_resolution;
iy += 1;
+ assert(iy <= iyb);
}
if (! visitor(iy, ix))
return;
@@ -140,11 +149,13 @@ public:
ey -= ex;
ex = int64_t(dy) * m_resolution;
ix += 1;
+ assert(ix <= ixb);
}
else {
ex -= ey;
ey = int64_t(dx) * m_resolution;
iy -= 1;
+ assert(iy >= iyb);
}
if (! visitor(iy, ix))
return;
@@ -162,12 +173,14 @@ public:
ey -= ex;
ex = int64_t(dy) * m_resolution;
ix -= 1;
+ assert(ix >= ixb);
}
else {
assert(ex >= ey);
ex -= ey;
ey = int64_t(dx) * m_resolution;
iy += 1;
+ assert(iy <= iyb);
}
if (! visitor(iy, ix))
return;
@@ -182,6 +195,7 @@ public:
ey -= ex;
ex = int64_t(dy) * m_resolution;
ix -= 1;
+ assert(ix >= ixb);
}
else if (ex == ey) {
// The lower edge of a grid cell belongs to the cell.
@@ -190,10 +204,12 @@ public:
if (dx > 0) {
ex = int64_t(dy) * m_resolution;
ix -= 1;
+ assert(ix >= ixb);
}
if (dy > 0) {
ey = int64_t(dx) * m_resolution;
iy -= 1;
+ assert(iy >= iyb);
}
}
else {
@@ -201,6 +217,7 @@ public:
ex -= ey;
ey = int64_t(dx) * m_resolution;
iy -= 1;
+ assert(iy >= iyb);
}
if (! visitor(iy, ix))
return;
@@ -218,10 +235,10 @@ public:
bbox.min /= m_resolution;
bbox.max /= m_resolution;
// Trim with the cells.
- bbox.min.x() = std::max(bbox.min.x(), 0);
- bbox.min.y() = std::max(bbox.min.y(), 0);
- bbox.max.x() = std::min(bbox.max.x(), (coord_t)m_cols - 1);
- bbox.max.y() = std::min(bbox.max.y(), (coord_t)m_rows - 1);
+ bbox.min.x() = std::max<coord_t>(bbox.min.x(), 0);
+ bbox.min.y() = std::max<coord_t>(bbox.min.y(), 0);
+ bbox.max.x() = std::min<coord_t>(bbox.max.x(), (coord_t)m_cols - 1);
+ bbox.max.y() = std::min<coord_t>(bbox.max.y(), (coord_t)m_rows - 1);
for (coord_t iy = bbox.min.y(); iy <= bbox.max.y(); ++ iy)
for (coord_t ix = bbox.min.x(); ix <= bbox.max.x(); ++ ix)
if (! visitor(iy, ix))
@@ -230,6 +247,10 @@ public:
std::pair<std::vector<std::pair<size_t, size_t>>::const_iterator, std::vector<std::pair<size_t, size_t>>::const_iterator> cell_data_range(coord_t row, coord_t col) const
{
+ assert(row >= 0);
+ assert(row < m_rows);
+ assert(col >= 0);
+ assert(col < m_cols);
const EdgeGrid::Grid::Cell &cell = m_cells[row * m_cols + col];
return std::make_pair(m_cell_data.begin() + cell.begin, m_cell_data.begin() + cell.end);
}
@@ -238,7 +259,14 @@ public:
{
const Slic3r::Points &ipts = *m_contours[contour_and_segment_idx.first];
size_t ipt = contour_and_segment_idx.second;
- return std::pair<const Slic3r::Point&, const Slic3r::Point&>(ipts[ipt], ipts[(ipt + 1 == ipts.size()) ? 0 : ipt + 1]);
+ return std::pair<const Slic3r::Point&, const Slic3r::Point&>(ipts[ipt], ipts[ipt + 1 == ipts.size() ? 0 : ipt + 1]);
+ }
+
+ Line line(const std::pair<size_t, size_t> &contour_and_segment_idx) const
+ {
+ const Slic3r::Points &ipts = *m_contours[contour_and_segment_idx.first];
+ size_t ipt = contour_and_segment_idx.second;
+ return Line(ipts[ipt], ipts[ipt + 1 == ipts.size() ? 0 : ipt + 1]);
}
protected:
@@ -288,10 +316,8 @@ protected:
std::vector<float> m_signed_distance_field;
};
-#if 0
// Debugging utility. Save the signed distance field.
-extern void save_png(const Grid &grid, const BoundingBox &bbox, coord_t resolution, const char *path);
-#endif /* SLIC3R_GUI */
+extern void save_png(const Grid &grid, const BoundingBox &bbox, coord_t resolution, const char *path, size_t scale = 1);
} // namespace EdgeGrid
diff --git a/src/libslic3r/ElephantFootCompensation.cpp b/src/libslic3r/ElephantFootCompensation.cpp
index c11157627..1e50ade5a 100644
--- a/src/libslic3r/ElephantFootCompensation.cpp
+++ b/src/libslic3r/ElephantFootCompensation.cpp
@@ -254,11 +254,12 @@ std::vector<float> contour_distance2(const EdgeGrid::Grid &grid, const size_t id
grid(grid), idx_contour(idx_contour), contour(*grid.contours()[idx_contour]), resampled_point_parameters(resampled_point_parameters), dist_same_contour_accept(dist_same_contour_accept), dist_same_contour_reject(dist_same_contour_reject) {}
void init(const Points &contour, const Point &apoint) {
- this->idx_point = &apoint - contour.data();
- this->point = apoint;
- this->found = false;
- this->dir_inside = this->dir_inside_at_point(contour, this->idx_point);
- }
+ this->idx_point = &apoint - contour.data();
+ this->point = apoint;
+ this->found = false;
+ this->dir_inside = this->dir_inside_at_point(contour, this->idx_point);
+ this->distance = std::numeric_limits<double>::max();
+ }
bool operator()(coord_t iy, coord_t ix) {
// Called with a row and colum of the grid cell, which is intersected by a line.
diff --git a/src/libslic3r/ExPolygon.cpp b/src/libslic3r/ExPolygon.cpp
index 4a8966044..02cc126a3 100644
--- a/src/libslic3r/ExPolygon.cpp
+++ b/src/libslic3r/ExPolygon.cpp
@@ -1,5 +1,6 @@
#include "BoundingBox.hpp"
#include "ExPolygon.hpp"
+#include "Exception.hpp"
#include "Geometry.hpp"
#include "Polygon.hpp"
#include "Line.hpp"
@@ -41,11 +42,11 @@ void ExPolygon::scale(double factor)
hole.scale(factor);
}
-void ExPolygon::translate(double x, double y)
+void ExPolygon::translate(const Point &p)
{
- contour.translate(x, y);
+ contour.translate(p);
for (Polygon &hole : holes)
- hole.translate(x, y);
+ hole.translate(p);
}
void ExPolygon::rotate(double angle)
@@ -349,23 +350,10 @@ void ExPolygon::get_trapezoids2(Polygons* polygons) const
// find trapezoids by looping from first to next-to-last coordinate
for (std::vector<coord_t>::const_iterator x = xx.begin(); x != xx.end()-1; ++x) {
coord_t next_x = *(x + 1);
- if (*x == next_x) continue;
-
- // build rectangle
- Polygon poly;
- poly.points.resize(4);
- poly[0](0) = *x;
- poly[0](1) = bb.min(1);
- poly[1](0) = next_x;
- poly[1](1) = bb.min(1);
- poly[2](0) = next_x;
- poly[2](1) = bb.max(1);
- poly[3](0) = *x;
- poly[3](1) = bb.max(1);
-
- // intersect with this expolygon
- // append results to return value
- polygons_append(*polygons, intersection(poly, to_polygons(*this)));
+ if (*x != next_x)
+ // intersect with rectangle
+ // append results to return value
+ polygons_append(*polygons, intersection({ { { *x, bb.min.y() }, { next_x, bb.min.y() }, { next_x, bb.max.y() }, { *x, bb.max.y() } } }, to_polygons(*this)));
}
}
@@ -404,7 +392,7 @@ void ExPolygon::triangulate_pp(Polygons* polygons) const
{
TPPLPoly p;
p.Init(int(ex->contour.points.size()));
- //printf(PRINTF_ZU "\n0\n", ex->contour.points.size());
+ //printf("%zu\n0\n", ex->contour.points.size());
for (const Point &point : ex->contour.points) {
size_t i = &point - &ex->contour.points.front();
p[i].x = point(0);
@@ -419,7 +407,7 @@ void ExPolygon::triangulate_pp(Polygons* polygons) const
for (Polygons::const_iterator hole = ex->holes.begin(); hole != ex->holes.end(); ++hole) {
TPPLPoly p;
p.Init(hole->points.size());
- //printf(PRINTF_ZU "\n1\n", hole->points.size());
+ //printf("%zu\n1\n", hole->points.size());
for (const Point &point : hole->points) {
size_t i = &point - &hole->points.front();
p[i].x = point(0);
@@ -435,7 +423,7 @@ void ExPolygon::triangulate_pp(Polygons* polygons) const
std::list<TPPLPoly> output;
int res = TPPLPartition().Triangulate_MONO(&input, &output);
if (res != 1)
- throw std::runtime_error("Triangulation failed");
+ throw Slic3r::RuntimeError("Triangulation failed");
// convert output polygons
for (std::list<TPPLPoly>::iterator poly = output.begin(); poly != output.end(); ++poly) {
@@ -548,7 +536,7 @@ void ExPolygon::triangulate_pp(Points *triangles) const
int res = TPPLPartition().Triangulate_MONO(&input, &output);
// int TPPLPartition::Triangulate_EC(TPPLPolyList *inpolys, TPPLPolyList *triangles) {
if (res != 1)
- throw std::runtime_error("Triangulation failed");
+ throw Slic3r::RuntimeError("Triangulation failed");
*triangles = polypartition_output_to_triangles(output);
}
@@ -591,7 +579,7 @@ void ExPolygon::triangulate_p2t(Polygons* polygons) const
}
polygons->push_back(p);
}
- } catch (const std::runtime_error & /* err */) {
+ } catch (const Slic3r::RuntimeError & /* err */) {
assert(false);
// just ignore, don't triangulate
}
diff --git a/src/libslic3r/ExPolygon.hpp b/src/libslic3r/ExPolygon.hpp
index 4aad3603f..b4651abc2 100644
--- a/src/libslic3r/ExPolygon.hpp
+++ b/src/libslic3r/ExPolygon.hpp
@@ -17,9 +17,9 @@ typedef std::vector<ExPolygon> ExPolygons;
class ExPolygon
{
public:
- ExPolygon() {}
- ExPolygon(const ExPolygon &other) : contour(other.contour), holes(other.holes) {}
- ExPolygon(ExPolygon &&other) noexcept : contour(std::move(other.contour)), holes(std::move(other.holes)) {}
+ ExPolygon() = default;
+ ExPolygon(const ExPolygon &other) = default;
+ ExPolygon(ExPolygon &&other) = default;
explicit ExPolygon(const Polygon &contour) : contour(contour) {}
explicit ExPolygon(Polygon &&contour) : contour(std::move(contour)) {}
explicit ExPolygon(const Points &contour) : contour(contour) {}
@@ -31,10 +31,10 @@ public:
ExPolygon(std::initializer_list<Point> contour) : contour(contour) {}
ExPolygon(std::initializer_list<Point> contour, std::initializer_list<Point> hole) : contour(contour), holes({ hole }) {}
- ExPolygon& operator=(const ExPolygon &other) { contour = other.contour; holes = other.holes; return *this; }
- ExPolygon& operator=(ExPolygon &&other) noexcept { contour = std::move(other.contour); holes = std::move(other.holes); return *this; }
+ ExPolygon& operator=(const ExPolygon &other) = default;
+ ExPolygon& operator=(ExPolygon &&other) = default;
- Polygon contour;
+ Polygon contour;
Polygons holes;
operator Points() const;
@@ -42,7 +42,8 @@ public:
operator Polylines() const;
void clear() { contour.points.clear(); holes.clear(); }
void scale(double factor);
- void translate(double x, double y);
+ void translate(double x, double y) { this->translate(Point(coord_t(x), coord_t(y))); }
+ void translate(const Point &vector);
void rotate(double angle);
void rotate(double angle, const Point &center);
double area() const;
@@ -333,6 +334,14 @@ extern std::list<TPPLPoly> expoly_to_polypartition_input(const ExPolygons &expp)
extern std::list<TPPLPoly> expoly_to_polypartition_input(const ExPolygon &ex);
extern std::vector<Point> polypartition_output_to_triangles(const std::list<TPPLPoly> &output);
+inline double area(const ExPolygons &polys)
+{
+ double s = 0.;
+ for (auto &p : polys) s += p.area();
+
+ return s;
+}
+
} // namespace Slic3r
// start Boost
diff --git a/src/libslic3r/Exception.hpp b/src/libslic3r/Exception.hpp
new file mode 100644
index 000000000..fababa47d
--- /dev/null
+++ b/src/libslic3r/Exception.hpp
@@ -0,0 +1,31 @@
+#ifndef _libslic3r_Exception_h_
+#define _libslic3r_Exception_h_
+
+#include <stdexcept>
+
+namespace Slic3r {
+
+// PrusaSlicer's own exception hierarchy is derived from std::runtime_error.
+// Base for Slicer's own exceptions.
+class Exception : public std::runtime_error { using std::runtime_error::runtime_error; };
+#define SLIC3R_DERIVE_EXCEPTION(DERIVED_EXCEPTION, PARENT_EXCEPTION) \
+ class DERIVED_EXCEPTION : public PARENT_EXCEPTION { using PARENT_EXCEPTION::PARENT_EXCEPTION; }
+// Critical exception produced by Slicer, such exception shall never propagate up to the UI thread.
+// If that happens, an ugly fat message box with an ugly fat exclamation mark is displayed.
+SLIC3R_DERIVE_EXCEPTION(CriticalException, Exception);
+SLIC3R_DERIVE_EXCEPTION(RuntimeError, CriticalException);
+SLIC3R_DERIVE_EXCEPTION(LogicError, CriticalException);
+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);
+SLIC3R_DERIVE_EXCEPTION(PlaceholderParserError, RuntimeError);
+// 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
+
+} // namespace Slic3r
+
+#endif // _libslic3r_Exception_h_
diff --git a/src/libslic3r/ExtrusionEntity.cpp b/src/libslic3r/ExtrusionEntity.cpp
index c0d08c84b..390d107f2 100644
--- a/src/libslic3r/ExtrusionEntity.cpp
+++ b/src/libslic3r/ExtrusionEntity.cpp
@@ -14,12 +14,12 @@ namespace Slic3r {
void ExtrusionPath::intersect_expolygons(const ExPolygonCollection &collection, ExtrusionEntityCollection* retval) const
{
- this->_inflate_collection(intersection_pl(this->polyline, (Polygons)collection), retval);
+ this->_inflate_collection(intersection_pl((Polylines)polyline, to_polygons(collection.expolygons)), retval);
}
void ExtrusionPath::subtract_expolygons(const ExPolygonCollection &collection, ExtrusionEntityCollection* retval) const
{
- this->_inflate_collection(diff_pl(this->polyline, (Polygons)collection), retval);
+ this->_inflate_collection(diff_pl((Polylines)this->polyline, to_polygons(collection.expolygons)), retval);
}
void ExtrusionPath::clip_end(double distance)
@@ -306,13 +306,14 @@ double ExtrusionLoop::min_mm3_per_mm() const
std::string ExtrusionEntity::role_to_string(ExtrusionRole role)
{
switch (role) {
- case erNone : return L("None");
+ case erNone : return L("Unknown");
case erPerimeter : return L("Perimeter");
case erExternalPerimeter : return L("External perimeter");
case erOverhangPerimeter : return L("Overhang perimeter");
case erInternalInfill : return L("Internal infill");
case erSolidInfill : return L("Solid infill");
case erTopSolidInfill : return L("Top solid infill");
+ case erIroning : return L("Ironing");
case erBridgeInfill : return L("Bridge infill");
case erGapFill : return L("Gap fill");
case erSkirt : return L("Skirt");
@@ -326,4 +327,40 @@ std::string ExtrusionEntity::role_to_string(ExtrusionRole role)
return "";
}
+ExtrusionRole ExtrusionEntity::string_to_role(const std::string_view role)
+{
+ if (role == L("Perimeter"))
+ return erPerimeter;
+ else if (role == L("External perimeter"))
+ return erExternalPerimeter;
+ else if (role == L("Overhang perimeter"))
+ return erOverhangPerimeter;
+ else if (role == L("Internal infill"))
+ return erInternalInfill;
+ else if (role == L("Solid infill"))
+ return erSolidInfill;
+ else if (role == L("Top solid infill"))
+ return erTopSolidInfill;
+ else if (role == L("Ironing"))
+ return erIroning;
+ else if (role == L("Bridge infill"))
+ return erBridgeInfill;
+ else if (role == L("Gap fill"))
+ return erGapFill;
+ else if (role == L("Skirt"))
+ return erSkirt;
+ else if (role == L("Support material"))
+ return erSupportMaterial;
+ else if (role == L("Support material interface"))
+ return erSupportMaterialInterface;
+ else if (role == L("Wipe tower"))
+ return erWipeTower;
+ else if (role == L("Custom"))
+ return erCustom;
+ else if (role == L("Mixed"))
+ return erMixed;
+ else
+ return erNone;
+}
+
}
diff --git a/src/libslic3r/ExtrusionEntity.hpp b/src/libslic3r/ExtrusionEntity.hpp
index b76991f1c..6b0153b2e 100644
--- a/src/libslic3r/ExtrusionEntity.hpp
+++ b/src/libslic3r/ExtrusionEntity.hpp
@@ -6,6 +6,7 @@
#include "Polyline.hpp"
#include <assert.h>
+#include <string_view>
namespace Slic3r {
@@ -22,6 +23,7 @@ enum ExtrusionRole : uint8_t {
erInternalInfill,
erSolidInfill,
erTopSolidInfill,
+ erIroning,
erBridgeInfill,
erGapFill,
erSkirt,
@@ -54,14 +56,16 @@ inline bool is_infill(ExtrusionRole role)
return role == erBridgeInfill
|| role == erInternalInfill
|| role == erSolidInfill
- || role == erTopSolidInfill;
+ || role == erTopSolidInfill
+ || role == erIroning;
}
inline bool is_solid_infill(ExtrusionRole role)
{
return role == erBridgeInfill
|| role == erSolidInfill
- || role == erTopSolidInfill;
+ || role == erTopSolidInfill
+ || role == erIroning;
}
inline bool is_bridge(ExtrusionRole role) {
@@ -103,6 +107,7 @@ public:
virtual double total_volume() const = 0;
static std::string role_to_string(ExtrusionRole role);
+ static ExtrusionRole string_to_role(const std::string_view role);
};
typedef std::vector<ExtrusionEntity*> ExtrusionEntitiesPtr;
@@ -118,8 +123,8 @@ public:
// Height of the extrusion, used for visualization purposes.
float height;
- ExtrusionPath(ExtrusionRole role) : mm3_per_mm(-1), width(-1), height(-1), m_role(role) {};
- ExtrusionPath(ExtrusionRole role, double mm3_per_mm, float width, float height) : mm3_per_mm(mm3_per_mm), width(width), height(height), m_role(role) {};
+ ExtrusionPath(ExtrusionRole role) : mm3_per_mm(-1), width(-1), height(-1), m_role(role) {}
+ ExtrusionPath(ExtrusionRole role, double mm3_per_mm, float width, float height) : mm3_per_mm(mm3_per_mm), width(width), height(height), m_role(role) {}
ExtrusionPath(const ExtrusionPath& rhs) : polyline(rhs.polyline), mm3_per_mm(rhs.mm3_per_mm), width(rhs.width), height(rhs.height), m_role(rhs.m_role) {}
ExtrusionPath(ExtrusionPath&& rhs) : polyline(std::move(rhs.polyline)), mm3_per_mm(rhs.mm3_per_mm), width(rhs.width), height(rhs.height), m_role(rhs.m_role) {}
ExtrusionPath(const Polyline &polyline, const ExtrusionPath &rhs) : polyline(polyline), mm3_per_mm(rhs.mm3_per_mm), width(rhs.width), height(rhs.height), m_role(rhs.m_role) {}
diff --git a/src/libslic3r/ExtrusionEntityCollection.hpp b/src/libslic3r/ExtrusionEntityCollection.hpp
index dfece6949..5e40ab32e 100644
--- a/src/libslic3r/ExtrusionEntityCollection.hpp
+++ b/src/libslic3r/ExtrusionEntityCollection.hpp
@@ -2,6 +2,7 @@
#define slic3r_ExtrusionEntityCollection_hpp_
#include "libslic3r.h"
+#include "Exception.hpp"
#include "ExtrusionEntity.hpp"
namespace Slic3r {
@@ -107,7 +108,7 @@ public:
// Following methods shall never be called on an ExtrusionEntityCollection.
Polyline as_polyline() const override {
- throw std::runtime_error("Calling as_polyline() on a ExtrusionEntityCollection");
+ throw Slic3r::RuntimeError("Calling as_polyline() on a ExtrusionEntityCollection");
return Polyline();
};
@@ -117,7 +118,7 @@ public:
}
double length() const override {
- throw std::runtime_error("Calling length() on a ExtrusionEntityCollection");
+ throw Slic3r::RuntimeError("Calling length() on a ExtrusionEntityCollection");
return 0.;
}
};
diff --git a/src/libslic3r/FileParserError.hpp b/src/libslic3r/FileParserError.hpp
index 3f560fa4f..b7e63d84e 100644
--- a/src/libslic3r/FileParserError.hpp
+++ b/src/libslic3r/FileParserError.hpp
@@ -10,14 +10,14 @@
namespace Slic3r {
// Generic file parser error, mostly copied from boost::property_tree::file_parser_error
-class file_parser_error: public std::runtime_error
+class file_parser_error: public Slic3r::RuntimeError
{
public:
file_parser_error(const std::string &msg, const std::string &file, unsigned long line = 0) :
- std::runtime_error(format_what(msg, file, line)),
+ Slic3r::RuntimeError(format_what(msg, file, line)),
m_message(msg), m_filename(file), m_line(line) {}
file_parser_error(const std::string &msg, const boost::filesystem::path &file, unsigned long line = 0) :
- std::runtime_error(format_what(msg, file.string(), line)),
+ Slic3r::RuntimeError(format_what(msg, file.string(), line)),
m_message(msg), m_filename(file.string()), m_line(line) {}
// gcc 3.4.2 complains about lack of throw specifier on compiler
// generated dtor
@@ -35,7 +35,7 @@ private:
std::string m_filename;
unsigned long m_line;
- // Format error message to be returned by std::runtime_error::what()
+ // Format error message to be returned by Slic3r::RuntimeError::what()
static std::string format_what(const std::string &msg, const std::string &file, unsigned long l)
{
std::stringstream stream;
diff --git a/src/libslic3r/Fill/Fill.cpp b/src/libslic3r/Fill/Fill.cpp
index 498abe89e..6dbfa18fa 100644
--- a/src/libslic3r/Fill/Fill.cpp
+++ b/src/libslic3r/Fill/Fill.cpp
@@ -10,6 +10,7 @@
#include "../Surface.hpp"
#include "FillBase.hpp"
+#include "FillRectilinear.hpp"
namespace Slic3r {
@@ -32,10 +33,12 @@ struct SurfaceFillParams
// FillParams
float density = 0.f;
- // Don't connect the fill lines around the inner perimeter.
- bool dont_connect = false;
// Don't adjust spacing to fill the space evenly.
bool dont_adjust = false;
+ // Length of the infill anchor along the perimeter line.
+ // 1000mm is roughly the maximum length line that fits into a 32bit coord_t.
+ float anchor_length = 1000.f;
+ float anchor_length_max = 1000.f;
// width, height of extrusion, nozzle diameter, is bridge
// For the output, for fill generator.
@@ -64,8 +67,9 @@ struct SurfaceFillParams
RETURN_COMPARE_NON_EQUAL(overlap);
RETURN_COMPARE_NON_EQUAL(angle);
RETURN_COMPARE_NON_EQUAL(density);
- RETURN_COMPARE_NON_EQUAL_TYPED(unsigned, dont_connect);
RETURN_COMPARE_NON_EQUAL_TYPED(unsigned, dont_adjust);
+ RETURN_COMPARE_NON_EQUAL(anchor_length);
+ RETURN_COMPARE_NON_EQUAL(anchor_length_max);
RETURN_COMPARE_NON_EQUAL(flow.width);
RETURN_COMPARE_NON_EQUAL(flow.height);
RETURN_COMPARE_NON_EQUAL(flow.nozzle_diameter);
@@ -82,8 +86,9 @@ struct SurfaceFillParams
this->overlap == rhs.overlap &&
this->angle == rhs.angle &&
this->density == rhs.density &&
- this->dont_connect == rhs.dont_connect &&
this->dont_adjust == rhs.dont_adjust &&
+ this->anchor_length == rhs.anchor_length &&
+ this->anchor_length_max == rhs.anchor_length_max &&
this->flow == rhs.flow &&
this->extrusion_role == rhs.extrusion_role;
}
@@ -114,16 +119,17 @@ std::vector<SurfaceFill> group_fills(const Layer &layer)
if (surface.surface_type == stInternalVoid)
has_internal_voids = true;
else {
+ const PrintRegionConfig &region_config = layerm.region()->config();
FlowRole extrusion_role = surface.is_top() ? frTopSolidInfill : (surface.is_solid() ? frSolidInfill : frInfill);
bool is_bridge = layer.id() > 0 && surface.is_bridge();
params.extruder = layerm.region()->extruder(extrusion_role);
- params.pattern = layerm.region()->config().fill_pattern.value;
- params.density = float(layerm.region()->config().fill_density);
+ params.pattern = region_config.fill_pattern.value;
+ params.density = float(region_config.fill_density);
if (surface.is_solid()) {
params.density = 100.f;
params.pattern = (surface.is_external() && ! is_bridge) ?
- (surface.is_top() ? layerm.region()->config().top_fill_pattern.value : layerm.region()->config().bottom_fill_pattern.value) :
+ (surface.is_top() ? region_config.top_fill_pattern.value : region_config.bottom_fill_pattern.value) :
ipRectilinear;
} else if (params.density <= 0)
continue;
@@ -135,7 +141,7 @@ std::vector<SurfaceFill> group_fills(const Layer &layer)
(surface.is_top() ? erTopSolidInfill : erSolidInfill) :
erInternalInfill);
params.bridge_angle = float(surface.bridge_angle);
- params.angle = float(Geometry::deg2rad(layerm.region()->config().fill_angle.value));
+ params.angle = float(Geometry::deg2rad(region_config.fill_angle.value));
// calculate the actual flow we'll be using for this infill
params.flow = layerm.region()->flow(
@@ -148,7 +154,11 @@ std::vector<SurfaceFill> group_fills(const Layer &layer)
);
// Calculate flow spacing for infill pattern generation.
- if (! surface.is_solid() && ! is_bridge) {
+ if (surface.is_solid() || is_bridge) {
+ params.spacing = params.flow.spacing();
+ // Don't limit anchor length for solid or bridging infill.
+ params.anchor_length = 1000.f;
+ } else {
// it's internal infill, so we can calculate a generic flow spacing
// for all layers, for avoiding the ugly effect of
// misaligned infill on first layer because of different extrusion width and
@@ -161,8 +171,15 @@ std::vector<SurfaceFill> group_fills(const Layer &layer)
-1, // auto width
*layer.object()
).spacing();
- } else
- params.spacing = params.flow.spacing();
+ // Anchor a sparse infill to inner perimeters with the following anchor length:
+ params.anchor_length = float(region_config.infill_anchor);
+ if (region_config.infill_anchor.percent)
+ params.anchor_length = float(params.anchor_length * 0.01 * params.spacing);
+ params.anchor_length_max = float(region_config.infill_anchor_max);
+ if (region_config.infill_anchor_max.percent)
+ params.anchor_length_max = float(params.anchor_length_max * 0.01 * params.spacing);
+ }
+ params.anchor_length = std::min(params.anchor_length, params.anchor_length_max);
auto it_params = set_surface_params.find(params);
if (it_params == set_surface_params.end())
@@ -317,7 +334,7 @@ void export_group_fills_to_svg(const char *path, const std::vector<SurfaceFill>
#endif
// friend to Layer
-void Layer::make_fills()
+void Layer::make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive::Octree* support_fill_octree)
{
for (LayerRegion *layerm : m_regions)
layerm->fills.clear();
@@ -344,6 +361,7 @@ void Layer::make_fills()
f->layer_id = this->id();
f->z = this->print_z;
f->angle = surface_fill.params.angle;
+ f->adapt_fill_octree = (surface_fill.params.pattern == ipSupportCubic) ? support_fill_octree : adaptive_fill_octree;
// calculate flow spacing for infill pattern generation
bool using_internal_flow = ! surface_fill.surface.is_solid() && ! surface_fill.params.flow.bridge;
@@ -365,14 +383,20 @@ void Layer::make_fills()
// apply half spacing using this flow's own spacing and generate infill
FillParams params;
- params.density = float(0.01 * surface_fill.params.density);
- params.dont_adjust = surface_fill.params.dont_adjust; // false
+ params.density = float(0.01 * surface_fill.params.density);
+ params.dont_adjust = surface_fill.params.dont_adjust; // false
+ params.anchor_length = surface_fill.params.anchor_length;
+ params.anchor_length_max = surface_fill.params.anchor_length_max;
for (ExPolygon &expoly : surface_fill.expolygons) {
// Spacing is modified by the filler to indicate adjustments. Reset it for each expolygon.
f->spacing = surface_fill.params.spacing;
surface_fill.surface.expolygon = std::move(expoly);
- Polylines polylines = f->fill_surface(&surface_fill.surface, params);
+ Polylines polylines;
+ try {
+ polylines = f->fill_surface(&surface_fill.surface, params);
+ } catch (InfillFailedException &) {
+ }
if (! polylines.empty()) {
// calculate actual flow from spacing (which might have been adjusted by the infill
// pattern generator)
@@ -388,8 +412,8 @@ void Layer::make_fills()
flow_width = new_flow.width;
}
// Save into layer.
- auto *eec = new ExtrusionEntityCollection();
- m_regions[surface_fill.region_id]->fills.entities.push_back(eec);
+ ExtrusionEntityCollection* eec = nullptr;
+ m_regions[surface_fill.region_id]->fills.entities.push_back(eec = new ExtrusionEntityCollection());
// Only concentric fills are not sorted.
eec->no_sort = f->no_sort();
extrusion_entities_append_paths(
@@ -418,4 +442,168 @@ void Layer::make_fills()
#endif
}
+// Create ironing extrusions over top surfaces.
+void Layer::make_ironing()
+{
+ // LayerRegion::slices contains surfaces marked with SurfaceType.
+ // Here we want to collect top surfaces extruded with the same extruder.
+ // A surface will be ironed with the same extruder to not contaminate the print with another material leaking from the nozzle.
+
+ // First classify regions based on the extruder used.
+ struct IroningParams {
+ int extruder = -1;
+ bool just_infill = false;
+ // Spacing of the ironing lines, also to calculate the extrusion flow from.
+ double line_spacing;
+ // Height of the extrusion, to calculate the extrusion flow from.
+ double height;
+ double speed;
+ double angle;
+
+ bool operator<(const IroningParams &rhs) const {
+ if (this->extruder < rhs.extruder)
+ return true;
+ if (this->extruder > rhs.extruder)
+ return false;
+ if (int(this->just_infill) < int(rhs.just_infill))
+ return true;
+ if (int(this->just_infill) > int(rhs.just_infill))
+ return false;
+ if (this->line_spacing < rhs.line_spacing)
+ return true;
+ if (this->line_spacing > rhs.line_spacing)
+ return false;
+ if (this->height < rhs.height)
+ return true;
+ if (this->height > rhs.height)
+ return false;
+ if (this->speed < rhs.speed)
+ return true;
+ if (this->speed > rhs.speed)
+ return false;
+ if (this->angle < rhs.angle)
+ return true;
+ if (this->angle > rhs.angle)
+ return false;
+ return false;
+ }
+
+ bool operator==(const IroningParams &rhs) const {
+ return this->extruder == rhs.extruder && this->just_infill == rhs.just_infill &&
+ this->line_spacing == rhs.line_spacing && this->height == rhs.height && this->speed == rhs.speed &&
+ this->angle == rhs.angle;
+ }
+
+ LayerRegion *layerm = nullptr;
+
+ // IdeaMaker: ironing
+ // ironing flowrate (5% percent)
+ // ironing speed (10 mm/sec)
+
+ // Kisslicer:
+ // iron off, Sweep, Group
+ // ironing speed: 15 mm/sec
+
+ // Cura:
+ // Pattern (zig-zag / concentric)
+ // line spacing (0.1mm)
+ // flow: from normal layer height. 10%
+ // speed: 20 mm/sec
+ };
+
+ std::vector<IroningParams> by_extruder;
+ bool extruder_dont_care = this->object()->config().wipe_into_objects;
+ double default_layer_height = this->object()->config().layer_height;
+
+ for (LayerRegion *layerm : m_regions)
+ if (! layerm->slices.empty()) {
+ IroningParams ironing_params;
+ const PrintRegionConfig &config = layerm->region()->config();
+ if (config.ironing &&
+ (config.ironing_type == IroningType::AllSolid ||
+ (config.top_solid_layers > 0 &&
+ (config.ironing_type == IroningType::TopSurfaces ||
+ (config.ironing_type == IroningType::TopmostOnly && layerm->layer()->upper_layer == nullptr))))) {
+ if (config.perimeter_extruder == config.solid_infill_extruder || config.perimeters == 0) {
+ // Iron the whole face.
+ ironing_params.extruder = config.solid_infill_extruder;
+ } else {
+ // Iron just the infill.
+ ironing_params.extruder = config.solid_infill_extruder;
+ }
+ }
+ if (ironing_params.extruder != -1) {
+ ironing_params.just_infill = false;
+ ironing_params.line_spacing = config.ironing_spacing;
+ ironing_params.height = default_layer_height * 0.01 * config.ironing_flowrate;
+ ironing_params.speed = config.ironing_speed;
+ ironing_params.angle = config.fill_angle * M_PI / 180.;
+ ironing_params.layerm = layerm;
+ by_extruder.emplace_back(ironing_params);
+ }
+ }
+ std::sort(by_extruder.begin(), by_extruder.end());
+
+ FillRectilinear fill;
+ FillParams fill_params;
+ fill.set_bounding_box(this->object()->bounding_box());
+ fill.layer_id = this->id();
+ fill.z = this->print_z;
+ fill.overlap = 0;
+ fill_params.density = 1.;
+ fill_params.monotonic = true;
+
+ for (size_t i = 0; i < by_extruder.size(); ++ i) {
+ // Find span of regions equivalent to the ironing operation.
+ IroningParams &ironing_params = by_extruder[i];
+ size_t j = i;
+ for (++ j; j < by_extruder.size() && ironing_params == by_extruder[j]; ++ j) ;
+
+ // Create the ironing extrusions for regions <i, j)
+ ExPolygons ironing_areas;
+ double nozzle_dmr = this->object()->print()->config().nozzle_diameter.values[ironing_params.extruder - 1];
+ if (ironing_params.just_infill) {
+ // Just infill.
+ } else {
+ // Infill and perimeter.
+ // Merge top surfaces with the same ironing parameters.
+ Polygons polys;
+ for (size_t k = i; k < j; ++ k)
+ for (const Surface &surface : by_extruder[k].layerm->slices.surfaces)
+ if (surface.surface_type == stTop)
+ polygons_append(polys, surface.expolygon);
+ // Trim the top surfaces with half the nozzle diameter.
+ ironing_areas = intersection_ex(polys, offset(this->lslices, - float(scale_(0.5 * nozzle_dmr))));
+ }
+
+ // Create the filler object.
+ fill.spacing = ironing_params.line_spacing;
+ fill.angle = float(ironing_params.angle + 0.25 * M_PI);
+ fill.link_max_length = (coord_t)scale_(3. * fill.spacing);
+ double height = ironing_params.height * fill.spacing / nozzle_dmr;
+ Flow flow = Flow::new_from_spacing(float(nozzle_dmr), 0., float(height), false);
+ double flow_mm3_per_mm = flow.mm3_per_mm();
+ Surface surface_fill(stTop, ExPolygon());
+ for (ExPolygon &expoly : ironing_areas) {
+ surface_fill.expolygon = std::move(expoly);
+ Polylines polylines;
+ try {
+ polylines = fill.fill_surface(&surface_fill, fill_params);
+ } catch (InfillFailedException &) {
+ }
+ if (! polylines.empty()) {
+ // Save into layer.
+ ExtrusionEntityCollection *eec = nullptr;
+ ironing_params.layerm->fills.entities.push_back(eec = new ExtrusionEntityCollection());
+ // Don't sort the ironing infill lines as they are monotonicly ordered.
+ eec->no_sort = true;
+ extrusion_entities_append_paths(
+ eec->entities, std::move(polylines),
+ erIroning,
+ flow_mm3_per_mm, float(flow.width), float(height));
+ }
+ }
+ }
+}
+
} // namespace Slic3r
diff --git a/src/libslic3r/Fill/Fill.hpp b/src/libslic3r/Fill/Fill.hpp
index 9e3545084..e92ab2dee 100644
--- a/src/libslic3r/Fill/Fill.hpp
+++ b/src/libslic3r/Fill/Fill.hpp
@@ -6,7 +6,6 @@
#include <stdint.h>
#include "../libslic3r.h"
-#include "../BoundingBox.hpp"
#include "../PrintConfig.hpp"
#include "FillBase.hpp"
@@ -20,10 +19,10 @@ class LayerRegion;
class Filler
{
public:
- Filler() : fill(NULL) {}
+ Filler() : fill(nullptr) {}
~Filler() {
delete fill;
- fill = NULL;
+ fill = nullptr;
}
Fill *fill;
FillParams params;
diff --git a/src/libslic3r/Fill/Fill3DHoneycomb.cpp b/src/libslic3r/Fill/Fill3DHoneycomb.cpp
index 8aac6e49c..2ddca7fe4 100644
--- a/src/libslic3r/Fill/Fill3DHoneycomb.cpp
+++ b/src/libslic3r/Fill/Fill3DHoneycomb.cpp
@@ -137,7 +137,7 @@ void Fill3DHoneycomb::_fill_surface_single(
const FillParams &params,
unsigned int thickness_layers,
const std::pair<float, Point> &direction,
- ExPolygon &expolygon,
+ ExPolygon expolygon,
Polylines &polylines_out)
{
// no rotation is supported for this infill pattern
@@ -162,15 +162,13 @@ void Fill3DHoneycomb::_fill_surface_single(
pl.translate(bb.min);
// clip pattern to boundaries, chain the clipped polylines
- Polylines polylines_chained = chain_polylines(intersection_pl(polylines, to_polygons(expolygon)));
+ polylines = intersection_pl(polylines, to_polygons(expolygon));
// connect lines if needed
- if (! polylines_chained.empty()) {
- if (params.dont_connect)
- append(polylines_out, std::move(polylines_chained));
- else
- this->connect_infill(std::move(polylines_chained), expolygon, polylines_out, this->spacing, params);
- }
+ if (params.dont_connect() || polylines.size() <= 1)
+ append(polylines_out, chain_polylines(std::move(polylines)));
+ else
+ this->connect_infill(std::move(polylines), expolygon, polylines_out, this->spacing, params);
}
} // namespace Slic3r
diff --git a/src/libslic3r/Fill/Fill3DHoneycomb.hpp b/src/libslic3r/Fill/Fill3DHoneycomb.hpp
index 52b792251..2fc1cbe81 100644
--- a/src/libslic3r/Fill/Fill3DHoneycomb.hpp
+++ b/src/libslic3r/Fill/Fill3DHoneycomb.hpp
@@ -12,19 +12,19 @@ namespace Slic3r {
class Fill3DHoneycomb : public Fill
{
public:
- virtual Fill* clone() const { return new Fill3DHoneycomb(*this); };
- virtual ~Fill3DHoneycomb() {}
+ Fill* clone() const override { return new Fill3DHoneycomb(*this); };
+ ~Fill3DHoneycomb() override {}
// require bridge flow since most of this pattern hangs in air
- virtual bool use_bridge_flow() const { return true; }
+ bool use_bridge_flow() const override { return true; }
protected:
- virtual void _fill_surface_single(
+ void _fill_surface_single(
const FillParams &params,
unsigned int thickness_layers,
const std::pair<float, Point> &direction,
- ExPolygon &expolygon,
- Polylines &polylines_out);
+ ExPolygon expolygon,
+ Polylines &polylines_out) override;
};
} // namespace Slic3r
diff --git a/src/libslic3r/Fill/FillAdaptive.cpp b/src/libslic3r/Fill/FillAdaptive.cpp
new file mode 100644
index 000000000..520124533
--- /dev/null
+++ b/src/libslic3r/Fill/FillAdaptive.cpp
@@ -0,0 +1,1545 @@
+#include "../ClipperUtils.hpp"
+#include "../ExPolygon.hpp"
+#include "../Surface.hpp"
+#include "../Geometry.hpp"
+#include "../Layer.hpp"
+#include "../Print.hpp"
+#include "../ShortestPath.hpp"
+
+#include "FillAdaptive.hpp"
+
+// for indexed_triangle_set
+#include <admesh/stl.h>
+
+#include <cstdlib>
+#include <cmath>
+#include <algorithm>
+#include <numeric>
+
+// Boost pool: Don't use mutexes to synchronize memory allocation.
+#define BOOST_POOL_NO_MT
+#include <boost/pool/object_pool.hpp>
+
+#include <boost/geometry.hpp>
+#include <boost/geometry/geometries/point.hpp>
+#include <boost/geometry/geometries/segment.hpp>
+#include <boost/geometry/index/rtree.hpp>
+
+
+namespace Slic3r {
+namespace FillAdaptive {
+
+// Derived from https://github.com/juj/MathGeoLib/blob/master/src/Geometry/Triangle.cpp
+// The AABB-Triangle test implementation is based on the pseudo-code in
+// Christer Ericson's Real-Time Collision Detection, pp. 169-172. It is
+// practically a standard SAT test.
+//
+// Original MathGeoLib benchmark:
+// Best: 17.282 nsecs / 46.496 ticks, Avg: 17.804 nsecs, Worst: 18.434 nsecs
+//
+//FIXME Vojtech: The MathGeoLib contains a vectorized implementation.
+template<typename Vector>
+bool triangle_AABB_intersects(const Vector &a, const Vector &b, const Vector &c, const BoundingBoxBase<Vector> &aabb)
+{
+ using Scalar = typename Vector::Scalar;
+
+ Vector tMin = a.cwiseMin(b.cwiseMin(c));
+ Vector tMax = a.cwiseMax(b.cwiseMax(c));
+
+ if (tMin.x() >= aabb.max.x() || tMax.x() <= aabb.min.x()
+ || tMin.y() >= aabb.max.y() || tMax.y() <= aabb.min.y()
+ || tMin.z() >= aabb.max.z() || tMax.z() <= aabb.min.z())
+ return false;
+
+ Vector center = (aabb.min + aabb.max) * 0.5f;
+ Vector h = aabb.max - center;
+
+ const Vector t[3] { b-a, c-a, c-b };
+
+ Vector ac = a - center;
+
+ Vector n = t[0].cross(t[1]);
+ Scalar s = n.dot(ac);
+ Scalar r = std::abs(h.dot(n.cwiseAbs()));
+ if (abs(s) >= r)
+ return false;
+
+ const Vector at[3] = { t[0].cwiseAbs(), t[1].cwiseAbs(), t[2].cwiseAbs() };
+
+ Vector bc = b - center;
+ Vector cc = c - center;
+
+ // SAT test all cross-axes.
+ // The following is a fully unrolled loop of this code, stored here for reference:
+ /*
+ Scalar d1, d2, a1, a2;
+ const Vector e[3] = { DIR_VEC(1, 0, 0), DIR_VEC(0, 1, 0), DIR_VEC(0, 0, 1) };
+ for(int i = 0; i < 3; ++i)
+ for(int j = 0; j < 3; ++j)
+ {
+ Vector axis = Cross(e[i], t[j]);
+ ProjectToAxis(axis, d1, d2);
+ aabb.ProjectToAxis(axis, a1, a2);
+ if (d2 <= a1 || d1 >= a2) return false;
+ }
+ */
+
+ // eX <cross> t[0]
+ Scalar d1 = t[0].y() * ac.z() - t[0].z() * ac.y();
+ Scalar d2 = t[0].y() * cc.z() - t[0].z() * cc.y();
+ Scalar tc = (d1 + d2) * 0.5f;
+ r = std::abs(h.y() * at[0].z() + h.z() * at[0].y());
+ if (r + std::abs(tc - d1) < std::abs(tc))
+ return false;
+
+ // eX <cross> t[1]
+ d1 = t[1].y() * ac.z() - t[1].z() * ac.y();
+ d2 = t[1].y() * bc.z() - t[1].z() * bc.y();
+ tc = (d1 + d2) * 0.5f;
+ r = std::abs(h.y() * at[1].z() + h.z() * at[1].y());
+ if (r + std::abs(tc - d1) < std::abs(tc))
+ return false;
+
+ // eX <cross> t[2]
+ d1 = t[2].y() * ac.z() - t[2].z() * ac.y();
+ d2 = t[2].y() * bc.z() - t[2].z() * bc.y();
+ tc = (d1 + d2) * 0.5f;
+ r = std::abs(h.y() * at[2].z() + h.z() * at[2].y());
+ if (r + std::abs(tc - d1) < std::abs(tc))
+ return false;
+
+ // eY <cross> t[0]
+ d1 = t[0].z() * ac.x() - t[0].x() * ac.z();
+ d2 = t[0].z() * cc.x() - t[0].x() * cc.z();
+ tc = (d1 + d2) * 0.5f;
+ r = std::abs(h.x() * at[0].z() + h.z() * at[0].x());
+ if (r + std::abs(tc - d1) < std::abs(tc))
+ return false;
+
+ // eY <cross> t[1]
+ d1 = t[1].z() * ac.x() - t[1].x() * ac.z();
+ d2 = t[1].z() * bc.x() - t[1].x() * bc.z();
+ tc = (d1 + d2) * 0.5f;
+ r = std::abs(h.x() * at[1].z() + h.z() * at[1].x());
+ if (r + std::abs(tc - d1) < std::abs(tc))
+ return false;
+
+ // eY <cross> t[2]
+ d1 = t[2].z() * ac.x() - t[2].x() * ac.z();
+ d2 = t[2].z() * bc.x() - t[2].x() * bc.z();
+ tc = (d1 + d2) * 0.5f;
+ r = std::abs(h.x() * at[2].z() + h.z() * at[2].x());
+ if (r + std::abs(tc - d1) < std::abs(tc))
+ return false;
+
+ // eZ <cross> t[0]
+ d1 = t[0].x() * ac.y() - t[0].y() * ac.x();
+ d2 = t[0].x() * cc.y() - t[0].y() * cc.x();
+ tc = (d1 + d2) * 0.5f;
+ r = std::abs(h.y() * at[0].x() + h.x() * at[0].y());
+ if (r + std::abs(tc - d1) < std::abs(tc))
+ return false;
+
+ // eZ <cross> t[1]
+ d1 = t[1].x() * ac.y() - t[1].y() * ac.x();
+ d2 = t[1].x() * bc.y() - t[1].y() * bc.x();
+ tc = (d1 + d2) * 0.5f;
+ r = std::abs(h.y() * at[1].x() + h.x() * at[1].y());
+ if (r + std::abs(tc - d1) < std::abs(tc))
+ return false;
+
+ // eZ <cross> t[2]
+ d1 = t[2].x() * ac.y() - t[2].y() * ac.x();
+ d2 = t[2].x() * bc.y() - t[2].y() * bc.x();
+ tc = (d1 + d2) * 0.5f;
+ r = std::abs(h.y() * at[2].x() + h.x() * at[2].y());
+ if (r + std::abs(tc - d1) < std::abs(tc))
+ return false;
+
+ // No separating axis exists, the AABB and triangle intersect.
+ return true;
+}
+
+static double dist2_to_triangle(const Vec3d &a, const Vec3d &b, const Vec3d &c, const Vec3d &p)
+{
+ double out = std::numeric_limits<double>::max();
+ const Vec3d v1 = b - a;
+ auto l1 = v1.squaredNorm();
+ const Vec3d v2 = c - b;
+ auto l2 = v2.squaredNorm();
+ const Vec3d v3 = a - c;
+ auto l3 = v3.squaredNorm();
+
+ // Is the triangle valid?
+ if (l1 > 0. && l2 > 0. && l3 > 0.)
+ {
+ // 1) Project point into the plane of the triangle.
+ const Vec3d n = v1.cross(v2);
+ double d = (p - a).dot(n);
+ const Vec3d foot_pt = p - n * d / n.squaredNorm();
+
+ // 2) Maximum projection of n.
+ int proj_axis;
+ n.array().cwiseAbs().maxCoeff(&proj_axis);
+
+ // 3) Test whether the foot_pt is inside the triangle.
+ {
+ auto inside_triangle = [](const Vec2d& v1, const Vec2d& v2, const Vec2d& v3, const Vec2d& pt) {
+ const double d1 = cross2(v1, pt);
+ const double d2 = cross2(v2, pt);
+ const double d3 = cross2(v3, pt);
+ // Testing both CCW and CW orientations.
+ return (d1 >= 0. && d2 >= 0. && d3 >= 0.) || (d1 <= 0. && d2 <= 0. && d3 <= 0.);
+ };
+ bool inside;
+ switch (proj_axis) {
+ case 0:
+ inside = inside_triangle({v1.y(), v1.z()}, {v2.y(), v2.z()}, {v3.y(), v3.z()}, {foot_pt.y(), foot_pt.z()}); break;
+ case 1:
+ inside = inside_triangle({v1.z(), v1.x()}, {v2.z(), v2.x()}, {v3.z(), v3.x()}, {foot_pt.z(), foot_pt.x()}); break;
+ default:
+ assert(proj_axis == 2);
+ inside = inside_triangle({v1.x(), v1.y()}, {v2.x(), v2.y()}, {v3.x(), v3.y()}, {foot_pt.x(), foot_pt.y()}); break;
+ }
+ if (inside)
+ return (p - foot_pt).squaredNorm();
+ }
+
+ // 4) Find minimum distance to triangle vertices and edges.
+ out = std::min((p - a).squaredNorm(), std::min((p - b).squaredNorm(), (p - c).squaredNorm()));
+ auto t = (p - a).dot(v1);
+ if (t > 0. && t < l1)
+ out = std::min(out, (a + v1 * (t / l1) - p).squaredNorm());
+ t = (p - b).dot(v2);
+ if (t > 0. && t < l2)
+ out = std::min(out, (b + v2 * (t / l2) - p).squaredNorm());
+ t = (p - c).dot(v3);
+ if (t > 0. && t < l3)
+ out = std::min(out, (c + v3 * (t / l3) - p).squaredNorm());
+ }
+
+ return out;
+}
+
+// Ordering of children cubes.
+static const std::array<Vec3d, 8> child_centers {
+ Vec3d(-1, -1, -1), Vec3d( 1, -1, -1), Vec3d(-1, 1, -1), Vec3d( 1, 1, -1),
+ Vec3d(-1, -1, 1), Vec3d( 1, -1, 1), Vec3d(-1, 1, 1), Vec3d( 1, 1, 1)
+};
+
+// Traversal order of octree children cells for three infill directions,
+// so that a single line will be discretized in a strictly monotonic order.
+static constexpr std::array<std::array<int, 8>, 3> child_traversal_order {
+ std::array<int, 8>{ 2, 3, 0, 1, 6, 7, 4, 5 },
+ std::array<int, 8>{ 4, 0, 6, 2, 5, 1, 7, 3 },
+ std::array<int, 8>{ 1, 5, 0, 4, 3, 7, 2, 6 },
+};
+
+struct Cube
+{
+ Vec3d center;
+#ifndef NDEBUG
+ Vec3d center_octree;
+#endif // NDEBUG
+ std::array<Cube*, 8> children {}; // initialized to nullptrs
+ Cube(const Vec3d &center) : center(center) {}
+};
+
+struct CubeProperties
+{
+ double edge_length; // Lenght of edge of a cube
+ double height; // Height of rotated cube (standing on the corner)
+ double diagonal_length; // Length of diagonal of a cube a face
+ double line_z_distance; // Defines maximal distance from a center of a cube on Z axis on which lines will be created
+ double line_xy_distance;// Defines maximal distance from a center of a cube on X and Y axis on which lines will be created
+};
+
+struct Octree
+{
+ // Octree will allocate its Cubes from the pool. The pool only supports deletion of the complete pool,
+ // perfect for building up our octree.
+ boost::object_pool<Cube> pool;
+ Cube* root_cube { nullptr };
+ Vec3d origin;
+ std::vector<CubeProperties> cubes_properties;
+
+ Octree(const Vec3d &origin, const std::vector<CubeProperties> &cubes_properties)
+ : root_cube(pool.construct(origin)), origin(origin), cubes_properties(cubes_properties) {}
+
+ void insert_triangle(const Vec3d &a, const Vec3d &b, const Vec3d &c, Cube *current_cube, const BoundingBoxf3 &current_bbox, int depth);
+};
+
+void OctreeDeleter::operator()(Octree *p) {
+ delete p;
+}
+
+std::pair<double, double> adaptive_fill_line_spacing(const PrintObject &print_object)
+{
+ // Output, spacing for icAdaptiveCubic and icSupportCubic
+ double adaptive_line_spacing = 0.;
+ double support_line_spacing = 0.;
+
+ enum class Tristate {
+ Yes,
+ No,
+ Maybe
+ };
+ struct RegionFillData {
+ Tristate has_adaptive_infill;
+ Tristate has_support_infill;
+ double density;
+ double extrusion_width;
+ };
+ std::vector<RegionFillData> region_fill_data;
+ region_fill_data.reserve(print_object.print()->regions().size());
+ bool build_octree = false;
+ const std::vector<double> &nozzle_diameters = print_object.print()->config().nozzle_diameter.values;
+ double max_nozzle_diameter = *std::max_element(nozzle_diameters.begin(), nozzle_diameters.end());
+ double default_infill_extrusion_width = Flow::auto_extrusion_width(FlowRole::frInfill, float(max_nozzle_diameter));
+ for (const PrintRegion *region : print_object.print()->regions()) {
+ const PrintRegionConfig &config = region->config();
+ bool nonempty = config.fill_density > 0;
+ bool has_adaptive_infill = nonempty && config.fill_pattern == ipAdaptiveCubic;
+ bool has_support_infill = nonempty && config.fill_pattern == ipSupportCubic;
+ double infill_extrusion_width = config.infill_extrusion_width.percent ? default_infill_extrusion_width * 0.01 * config.infill_extrusion_width : config.infill_extrusion_width;
+ region_fill_data.push_back(RegionFillData({
+ has_adaptive_infill ? Tristate::Maybe : Tristate::No,
+ has_support_infill ? Tristate::Maybe : Tristate::No,
+ config.fill_density,
+ infill_extrusion_width != 0. ? infill_extrusion_width : default_infill_extrusion_width
+ }));
+ build_octree |= has_adaptive_infill || has_support_infill;
+ }
+
+ if (build_octree) {
+ // Compute the average of above parameters over all layers
+ for (const Layer *layer : print_object.layers())
+ for (size_t region_id = 0; region_id < layer->regions().size(); ++ region_id) {
+ RegionFillData &rd = region_fill_data[region_id];
+ if (rd.has_adaptive_infill == Tristate::Maybe && ! layer->regions()[region_id]->fill_surfaces.empty())
+ rd.has_adaptive_infill = Tristate::Yes;
+ if (rd.has_support_infill == Tristate::Maybe && ! layer->regions()[region_id]->fill_surfaces.empty())
+ rd.has_support_infill = Tristate::Yes;
+ }
+
+ double adaptive_fill_density = 0.;
+ double adaptive_infill_extrusion_width = 0.;
+ int adaptive_cnt = 0;
+ double support_fill_density = 0.;
+ double support_infill_extrusion_width = 0.;
+ int support_cnt = 0;
+
+ for (const RegionFillData &rd : region_fill_data) {
+ if (rd.has_adaptive_infill == Tristate::Yes) {
+ adaptive_fill_density += rd.density;
+ adaptive_infill_extrusion_width += rd.extrusion_width;
+ ++ adaptive_cnt;
+ } else if (rd.has_support_infill == Tristate::Yes) {
+ support_fill_density += rd.density;
+ support_infill_extrusion_width += rd.extrusion_width;
+ ++ support_cnt;
+ }
+ }
+
+ auto to_line_spacing = [](int cnt, double density, double extrusion_width) {
+ if (cnt) {
+ density /= double(cnt);
+ extrusion_width /= double(cnt);
+ return extrusion_width / ((density / 100.0f) * 0.333333333f);
+ } else
+ return 0.;
+ };
+ adaptive_line_spacing = to_line_spacing(adaptive_cnt, adaptive_fill_density, adaptive_infill_extrusion_width);
+ support_line_spacing = to_line_spacing(support_cnt, support_fill_density, support_infill_extrusion_width);
+ }
+
+ return std::make_pair(adaptive_line_spacing, support_line_spacing);
+}
+
+// Context used by generate_infill_lines() when recursively traversing an octree in a DDA fashion
+// (Digital Differential Analyzer).
+struct FillContext
+{
+ // The angles have to agree with child_traversal_order.
+ static constexpr double direction_angles[3] {
+ 0.,
+ (2.0 * M_PI) / 3.0,
+ -(2.0 * M_PI) / 3.0
+ };
+
+ FillContext(const Octree &octree, double z_position, int direction_idx) :
+ cubes_properties(octree.cubes_properties),
+ z_position(z_position),
+ traversal_order(child_traversal_order[direction_idx]),
+ cos_a(cos(direction_angles[direction_idx])),
+ sin_a(sin(direction_angles[direction_idx]))
+ {
+ static constexpr auto unused = std::numeric_limits<coord_t>::max();
+ temp_lines.assign((1 << octree.cubes_properties.size()) - 1, Line(Point(unused, unused), Point(unused, unused)));
+ }
+
+ // Rotate the point, uses the same convention as Point::rotate().
+ Vec2d rotate(const Vec2d& v) { return Vec2d(this->cos_a * v.x() - this->sin_a * v.y(), this->sin_a * v.x() + this->cos_a * v.y()); }
+
+ const std::vector<CubeProperties> &cubes_properties;
+ // Top of the current layer.
+ const double z_position;
+ // Order of traversal for this line direction.
+ const std::array<int, 8> traversal_order;
+ // Rotation of the generated line for this line direction.
+ const double cos_a;
+ const double sin_a;
+
+ // Linearized tree spanning a single Octree wall, used to connect lines spanning
+ // neighboring Octree cells. Unused lines have the Line::a::x set to infinity.
+ std::vector<Line> temp_lines;
+ // Final output
+ std::vector<Line> output_lines;
+};
+
+static constexpr double octree_rot[3] = { 5.0 * M_PI / 4.0, Geometry::deg2rad(215.264), M_PI / 6.0 };
+
+Eigen::Quaterniond transform_to_world()
+{
+ return Eigen::AngleAxisd(octree_rot[2], Vec3d::UnitZ()) * Eigen::AngleAxisd(octree_rot[1], Vec3d::UnitY()) * Eigen::AngleAxisd(octree_rot[0], Vec3d::UnitX());
+}
+
+Eigen::Quaterniond transform_to_octree()
+{
+ return Eigen::AngleAxisd(- octree_rot[0], Vec3d::UnitX()) * Eigen::AngleAxisd(- octree_rot[1], Vec3d::UnitY()) * Eigen::AngleAxisd(- octree_rot[2], Vec3d::UnitZ());
+}
+
+#ifndef NDEBUG
+// Verify that the traversal order of the octree children matches the line direction,
+// therefore the infill line may get extended with O(1) time & space complexity.
+static bool verify_traversal_order(
+ FillContext &context,
+ const Cube *cube,
+ int depth,
+ const Vec2d &line_from,
+ const Vec2d &line_to)
+{
+ std::array<Vec3d, 8> c;
+ Eigen::Quaterniond to_world = transform_to_world();
+ for (int i = 0; i < 8; ++i) {
+ int j = context.traversal_order[i];
+ Vec3d cntr = to_world * (cube->center_octree + (child_centers[j] * (context.cubes_properties[depth].edge_length / 4.)));
+ assert(!cube->children[j] || cube->children[j]->center.isApprox(cntr));
+ c[i] = cntr;
+ }
+ std::array<Vec3d, 10> dirs = {
+ c[1] - c[0], c[2] - c[0], c[3] - c[1], c[3] - c[2], c[3] - c[0],
+ c[5] - c[4], c[6] - c[4], c[7] - c[5], c[7] - c[6], c[7] - c[4]
+ };
+ assert(std::abs(dirs[4].z()) < 0.005);
+ assert(std::abs(dirs[9].z()) < 0.005);
+ assert(dirs[0].isApprox(dirs[3]));
+ assert(dirs[1].isApprox(dirs[2]));
+ assert(dirs[5].isApprox(dirs[8]));
+ assert(dirs[6].isApprox(dirs[7]));
+ Vec3d line_dir = Vec3d(line_to.x() - line_from.x(), line_to.y() - line_from.y(), 0.).normalized();
+ for (auto& dir : dirs) {
+ double d = dir.normalized().dot(line_dir);
+ assert(d > 0.7);
+ }
+ return true;
+}
+#endif // NDEBUG
+
+static void generate_infill_lines_recursive(
+ FillContext &context,
+ const Cube *cube,
+ // Address of this wall in the octree, used to address context.temp_lines.
+ int address,
+ int depth)
+{
+ assert(cube != nullptr);
+
+ const std::vector<CubeProperties> &cubes_properties = context.cubes_properties;
+ const double z_diff = context.z_position - cube->center.z();
+ const double z_diff_abs = std::abs(z_diff);
+
+ if (z_diff_abs > cubes_properties[depth].height / 2.)
+ return;
+
+ if (z_diff_abs < cubes_properties[depth].line_z_distance) {
+ // Discretize a single wall splitting the cube into two.
+ const double zdist = cubes_properties[depth].line_z_distance;
+ Vec2d from(
+ 0.5 * cubes_properties[depth].diagonal_length * (zdist - z_diff_abs) / zdist,
+ cubes_properties[depth].line_xy_distance - (zdist + z_diff) / sqrt(2.));
+ Vec2d to(-from.x(), from.y());
+ from = context.rotate(from);
+ to = context.rotate(to);
+ // Relative to cube center
+ const Vec2d offset(cube->center.x(), cube->center.y());
+ from += offset;
+ to += offset;
+ // Verify that the traversal order of the octree children matches the line direction,
+ // therefore the infill line may get extended with O(1) time & space complexity.
+ assert(verify_traversal_order(context, cube, depth, from, to));
+ // Either extend an existing line or start a new one.
+ Line &last_line = context.temp_lines[address];
+ Line new_line(Point::new_scale(from), Point::new_scale(to));
+ if (last_line.a.x() == std::numeric_limits<coord_t>::max()) {
+ last_line.a = new_line.a;
+ } else if ((new_line.a - last_line.b).cwiseAbs().maxCoeff() > 1000) { // SCALED_EPSILON is 100 and it is not enough
+ context.output_lines.emplace_back(last_line);
+ last_line.a = new_line.a;
+ }
+ last_line.b = new_line.b;
+ }
+
+ // left child index
+ address = address * 2 + 1;
+ -- depth;
+ size_t i = 0;
+ for (const int child_idx : context.traversal_order) {
+ const Cube *child = cube->children[child_idx];
+ if (child != nullptr)
+ generate_infill_lines_recursive(context, child, address, depth);
+ if (++ i == 4)
+ // right child index
+ ++ address;
+ }
+}
+
+#ifndef NDEBUG
+// #define ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT
+#endif
+
+#ifdef ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT
+static void export_infill_lines_to_svg(const ExPolygon &expoly, const Polylines &polylines, const std::string &path, const Points &pts = Points())
+{
+ BoundingBox bbox = get_extents(expoly);
+ bbox.offset(scale_(3.));
+
+ ::Slic3r::SVG svg(path, bbox);
+ svg.draw(expoly);
+ svg.draw_outline(expoly, "green");
+ svg.draw(polylines, "red");
+ static constexpr double trim_length = scale_(0.4);
+ for (Polyline polyline : polylines)
+ if (! polyline.empty()) {
+ Vec2d a = polyline.points.front().cast<double>();
+ Vec2d d = polyline.points.back().cast<double>();
+ if (polyline.size() == 2) {
+ Vec2d v = d - a;
+ double l = v.norm();
+ if (l > 2. * trim_length) {
+ a += v * trim_length / l;
+ d -= v * trim_length / l;
+ polyline.points.front() = a.cast<coord_t>();
+ polyline.points.back() = d.cast<coord_t>();
+ } else
+ polyline.points.clear();
+ } else if (polyline.size() > 2) {
+ Vec2d b = polyline.points[1].cast<double>();
+ Vec2d c = polyline.points[polyline.points.size() - 2].cast<double>();
+ Vec2d v = b - a;
+ double l = v.norm();
+ if (l > trim_length) {
+ a += v * trim_length / l;
+ polyline.points.front() = a.cast<coord_t>();
+ } else
+ polyline.points.erase(polyline.points.begin());
+ v = d - c;
+ l = v.norm();
+ if (l > trim_length)
+ polyline.points.back() = (d - v * trim_length / l).cast<coord_t>();
+ else
+ polyline.points.pop_back();
+ }
+ svg.draw(polyline, "black");
+ }
+ svg.draw(pts, "magenta");
+}
+#endif /* ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT */
+
+// Representing a T-joint (in general case) between two infill lines
+// (between one end point of intersect_pl/intersect_line and
+struct Intersection
+{
+ // Closest line to intersect_point.
+ const Line *closest_line;
+
+ // The line for which is computed closest line from intersect_point to closest_line
+ const Line *intersect_line;
+ // Pointer to the polyline from which is computed closest_line
+ Polyline *intersect_pl;
+ // Point for which is computed closest line (closest_line)
+ Point intersect_point;
+ // Indicate if intersect_point is the first or the last point of intersect_pl
+ bool front;
+ // Signum of intersect_line_dir.cross(closest_line.dir()):
+ bool left;
+
+ // Indication if this intersection has been proceed
+ bool used = false;
+
+ bool fresh() const throw() { return ! used && ! intersect_pl->empty(); }
+
+ Intersection(const Line &closest_line, const Line &intersect_line, Polyline *intersect_pl, const Point &intersect_point, bool front) :
+ closest_line(&closest_line), intersect_line(&intersect_line), intersect_pl(intersect_pl), intersect_point(intersect_point), front(front)
+ {
+ // Calculate side of this intersection line of the closest line.
+ Vec2d v1((this->closest_line->b - this->closest_line->a).cast<double>());
+ Vec2d v2(this->intersect_line_dir());
+#ifndef NDEBUG
+ {
+ Vec2d v1n = v1.normalized();
+ Vec2d v2n = v2.normalized();
+ double c = cross2(v1n, v2n);
+ assert(std::abs(c) > sin(M_PI / 12.));
+ }
+#endif // NDEBUG
+ this->left = cross2(v1, v2) > 0.;
+ }
+
+ std::optional<Line> other_hook() const {
+ std::optional<Line> out;
+ const Points &pts = intersect_pl->points;
+ if (pts.size() >= 3)
+ out = this->front ? Line(pts[1], pts[2]) : Line(pts[pts.size() - 2], pts[pts.size() - 3]);
+ return out;
+ }
+
+ bool other_hook_intersects(const Line &l, Point &pt) {
+ std::optional<Line> h = other_hook();
+ return h && h->intersection(l, &pt);
+ }
+ bool other_hook_intersects(const Line &l) { Point pt; return this->other_hook_intersects(l, pt); }
+
+ // Direction to intersect_point.
+ Vec2d intersect_line_dir() const throw() {
+ return (this->intersect_point == intersect_line->a ? intersect_line->b - intersect_line->a : intersect_line->a - intersect_line->b).cast<double>();
+ }
+};
+
+static inline Intersection* get_nearest_intersection(std::vector<std::pair<Intersection*, double>>& intersect_line, const size_t first_idx)
+{
+ assert(intersect_line.size() >= 2);
+ bool take_next = false;
+ if (first_idx == 0)
+ take_next = true;
+ else if (first_idx + 1 == intersect_line.size())
+ take_next = false;
+ else {
+ // Has both prev and next.
+ const std::pair<Intersection*, double> &ithis = intersect_line[first_idx];
+ const std::pair<Intersection*, double> &iprev = intersect_line[first_idx - 1];
+ const std::pair<Intersection*, double> &inext = intersect_line[first_idx + 1];
+ take_next = iprev.first->fresh() && inext.first->fresh() ?
+ inext.second - ithis.second < ithis.second - iprev.second :
+ inext.first->fresh();
+ }
+ return intersect_line[take_next ? first_idx + 1 : first_idx - 1].first;
+}
+
+// Create a line representing the anchor aka hook extrusion based on line_to_offset
+// translated in the direction of the intersection line (intersection.intersect_line).
+static Line create_offset_line(Line offset_line, const Intersection &intersection, const double scaled_offset)
+{
+ offset_line.translate((perp(intersection.closest_line->vector().cast<double>().normalized()) * (intersection.left ? scaled_offset : - scaled_offset)).cast<coord_t>());
+ // Extend the line by a small value to guarantee a collision with adjacent lines
+ offset_line.extend(coord_t(scaled_offset * 1.16)); // / cos(PI/6)
+ return offset_line;
+}
+
+namespace bg = boost::geometry;
+namespace bgm = boost::geometry::model;
+namespace bgi = boost::geometry::index;
+
+// float is needed because for coord_t bgi::intersects throws "bad numeric conversion: positive overflow"
+using rtree_point_t = bgm::point<float, 2, boost::geometry::cs::cartesian>;
+using rtree_segment_t = bgm::segment<rtree_point_t>;
+using rtree_t = bgi::rtree<std::pair<rtree_segment_t, size_t>, bgi::rstar<16, 4>>;
+
+static inline rtree_point_t mk_rtree_point(const Point &pt) {
+ return rtree_point_t(float(pt.x()), float(pt.y()));
+}
+static inline rtree_segment_t mk_rtree_seg(const Point &a, const Point &b) {
+ return { mk_rtree_point(a), mk_rtree_point(b) };
+}
+static inline rtree_segment_t mk_rtree_seg(const Line &l) {
+ return mk_rtree_seg(l.a, l.b);
+}
+
+// Create a hook based on hook_line and append it to the begin or end of the polyline in the intersection
+static void add_hook(
+ const Intersection &intersection, const double scaled_offset,
+ const coordf_t hook_length, double scaled_trim_distance,
+ const rtree_t &rtree, const Lines &lines_src)
+{
+ if (hook_length < SCALED_EPSILON)
+ // Ignore open hooks.
+ return;
+
+#ifndef NDEBUG
+ {
+ const Vec2d v = (intersection.closest_line->b - intersection.closest_line->a).cast<double>();
+ const Vec2d va = (intersection.intersect_point - intersection.closest_line->a).cast<double>();
+ const double l2 = v.squaredNorm(); // avoid a sqrt
+ assert(l2 > 0.);
+ const double t = va.dot(v) / l2;
+ assert(t > 0. && t < 1.);
+ const double d = (t * v - va).norm();
+ assert(d < 1000.);
+ }
+#endif // NDEBUG
+
+ // Trim the hook start by the infill line it will connect to.
+ Point hook_start;
+ bool intersection_found = intersection.intersect_line->intersection(
+ create_offset_line(*intersection.closest_line, intersection, scaled_offset),
+ &hook_start);
+ assert(intersection_found);
+
+ std::optional<Line> other_hook = intersection.other_hook();
+
+ Vec2d hook_vector_norm = intersection.closest_line->vector().cast<double>().normalized();
+ // hook_vector is extended by the thickness of the infill line, so that a collision is found against
+ // the infill centerline to be later trimmed by the thickened line.
+ Vector hook_vector = ((hook_length + 1.16 * scaled_trim_distance) * hook_vector_norm).cast<coord_t>();
+ Line hook_forward(hook_start, hook_start + hook_vector);
+
+ auto filter_itself = [&intersection, &lines_src](const auto &item) { return item.second != intersection.intersect_line - lines_src.data(); };
+
+ std::vector<std::pair<rtree_segment_t, size_t>> hook_intersections;
+ rtree.query(bgi::intersects(mk_rtree_seg(hook_forward)) && bgi::satisfies(filter_itself), std::back_inserter(hook_intersections));
+ Point self_intersection_point;
+ bool self_intersection = other_hook && other_hook->intersection(hook_forward, &self_intersection_point);
+
+ // Find closest intersection of a line segment starting with pt pointing in dir
+ // with any of the hook_intersections, returns Euclidian distance.
+ // dir is normalized.
+ auto max_hook_length = [hook_length, scaled_trim_distance, &lines_src](
+ const Vec2d &pt, const Vec2d &dir,
+ const std::vector<std::pair<rtree_segment_t, size_t>> &hook_intersections,
+ bool self_intersection, const std::optional<Line> &self_intersection_line, const Point &self_intersection_point) {
+ // No hook is longer than hook_length, there shouldn't be any intersection closer than that.
+ auto max_length = hook_length;
+ auto update_max_length = [&max_length](double d) {
+ if (d < max_length)
+ max_length = d;
+ };
+ // Shift the trimming point away from the colliding thick line.
+ auto shift_from_thick_line = [&dir, scaled_trim_distance](const Vec2d& dir2) {
+ return scaled_trim_distance * std::abs(cross2(dir, dir2.normalized()));
+ };
+
+ for (const auto &hook_intersection : hook_intersections) {
+ const rtree_segment_t &segment = hook_intersection.first;
+ // Segment start and end points, segment vector.
+ Vec2d pt2(bg::get<0, 0>(segment), bg::get<0, 1>(segment));
+ Vec2d dir2 = Vec2d(bg::get<1, 0>(segment), bg::get<1, 1>(segment)) - pt2;
+ // Find intersection of (pt, dir) with (pt2, dir2), where dir is normalized.
+ double denom = cross2(dir, dir2);
+ assert(std::abs(denom) > EPSILON);
+ double t = cross2(pt2 - pt, dir2) / denom;
+ if (hook_intersection.second < lines_src.size())
+ // Trimming by another infill line. Reduce overlap.
+ t -= shift_from_thick_line(dir2);
+ update_max_length(t);
+ }
+ if (self_intersection) {
+ double t = (self_intersection_point.cast<double>() - pt).dot(dir) - shift_from_thick_line((*self_intersection_line).vector().cast<double>());
+ max_length = std::min(max_length, t);
+ }
+ return std::max(0., max_length);
+ };
+
+ Vec2d hook_startf = hook_start.cast<double>();
+ double hook_forward_max_length = max_hook_length(hook_startf, hook_vector_norm, hook_intersections, self_intersection, other_hook, self_intersection_point);
+ double hook_backward_max_length = 0.;
+ if (hook_forward_max_length < hook_length - SCALED_EPSILON) {
+ // Try the other side.
+ hook_intersections.clear();
+ Line hook_backward(hook_start, hook_start - hook_vector);
+ rtree.query(bgi::intersects(mk_rtree_seg(hook_backward)) && bgi::satisfies(filter_itself), std::back_inserter(hook_intersections));
+ self_intersection = other_hook && other_hook->intersection(hook_backward, &self_intersection_point);
+ hook_backward_max_length = max_hook_length(hook_startf, - hook_vector_norm, hook_intersections, self_intersection, other_hook, self_intersection_point);
+ }
+
+ // Take the longer hook.
+ Vec2d hook_dir = (hook_forward_max_length > hook_backward_max_length ? hook_forward_max_length : - hook_backward_max_length) * hook_vector_norm;
+ Point hook_end = hook_start + hook_dir.cast<coord_t>();
+
+ Points &pl = intersection.intersect_pl->points;
+ if (intersection.front) {
+ pl.front() = hook_start;
+ pl.emplace(pl.begin(), hook_end);
+ } else {
+ pl.back() = hook_start;
+ pl.emplace_back(hook_end);
+ }
+}
+
+#ifndef NDEBUG
+bool validate_intersection_t_joint(const Intersection &intersection)
+{
+ const Vec2d v = (intersection.closest_line->b - intersection.closest_line->a).cast<double>();
+ const Vec2d va = (intersection.intersect_point - intersection.closest_line->a).cast<double>();
+ const double l2 = v.squaredNorm(); // avoid a sqrt
+ assert(l2 > 0.);
+ const double t = va.dot(v);
+ assert(t > SCALED_EPSILON && t < l2 - SCALED_EPSILON);
+ const double d = ((t / l2) * v - va).norm();
+ assert(d < 1000.);
+ return true;
+}
+bool validate_intersections(const std::vector<Intersection> &intersections)
+{
+ for (const Intersection& intersection : intersections)
+ assert(validate_intersection_t_joint(intersection));
+ return true;
+}
+#endif // NDEBUG
+
+static Polylines connect_lines_using_hooks(Polylines &&lines, const ExPolygon &boundary, const double spacing, const coordf_t hook_length, const coordf_t hook_length_max)
+{
+ rtree_t rtree;
+ size_t poly_idx = 0;
+
+ // 19% overlap, slightly lower than the allowed overlap in Fill::connect_infill()
+ const float scaled_offset = float(scale_(spacing) * 0.81);
+ // 25% overlap
+ const float scaled_trim_distance = float(scale_(spacing) * 0.5 * 0.75);
+
+ // Keeping the vector of closest points outside the loop, so the vector does not need to be reallocated.
+ std::vector<std::pair<rtree_segment_t, size_t>> closest;
+ // Pairs of lines touching at one end point. The pair is sorted to make the end point connection test symmetric.
+ std::vector<std::pair<const Polyline*, const Polyline*>> lines_touching_at_endpoints;
+ {
+ // Insert infill lines into rtree, merge close collinear segments split by the infill boundary,
+ // collect lines_touching_at_endpoints.
+ double r2_close = Slic3r::sqr(1200.);
+ for (Polyline &poly : lines) {
+ assert(poly.points.size() == 2);
+ if (&poly != lines.data()) {
+ // Join collinear segments separated by a tiny gap. These gaps were likely created by clipping the infill lines with a concave dent in an infill boundary.
+ auto collinear_segment = [&rtree, &closest, &lines, &lines_touching_at_endpoints, r2_close](const Point& pt, const Point& pt_other, const Polyline* polyline) -> std::pair<Polyline*, bool> {
+ closest.clear();
+ rtree.query(bgi::nearest(mk_rtree_point(pt), 1), std::back_inserter(closest));
+ const Polyline *other = &lines[closest.front().second];
+ double dist2_front = (other->points.front() - pt).cast<double>().squaredNorm();
+ double dist2_back = (other->points.back() - pt).cast<double>().squaredNorm();
+ double dist2_min = std::min(dist2_front, dist2_back);
+ if (dist2_min < r2_close) {
+ // Don't connect the segments in an opposite direction.
+ double dist2_min_other = std::min((other->points.front() - pt_other).cast<double>().squaredNorm(), (other->points.back() - pt_other).cast<double>().squaredNorm());
+ if (dist2_min_other > dist2_min) {
+ // End points of the two lines are very close, they should have been merged together if they are collinear.
+ Vec2d v1 = (pt_other - pt).cast<double>();
+ Vec2d v2 = (other->points.back() - other->points.front()).cast<double>();
+ Vec2d v1n = v1.normalized();
+ Vec2d v2n = v2.normalized();
+ // The vectors must not be collinear.
+ double d = v1n.dot(v2n);
+ if (std::abs(d) > 0.99f) {
+ // Lines are collinear, merge them.
+ rtree.remove(closest.front());
+ return std::make_pair(const_cast<Polyline*>(other), dist2_min == dist2_front);
+ } else {
+ if (polyline > other)
+ std::swap(polyline, other);
+ lines_touching_at_endpoints.emplace_back(polyline, other);
+ }
+ }
+ }
+ return std::make_pair(static_cast<Polyline*>(nullptr), false);
+ };
+ auto collinear_front = collinear_segment(poly.points.front(), poly.points.back(), &poly);
+ auto collinear_back = collinear_segment(poly.points.back(), poly.points.front(), &poly);
+ assert(! collinear_front.first || ! collinear_back.first || collinear_front.first != collinear_back.first);
+ if (collinear_front.first) {
+ Polyline &other = *collinear_front.first;
+ assert(&other != &poly);
+ poly.points.front() = collinear_front.second ? other.points.back() : other.points.front();
+ other.points.clear();
+ }
+ if (collinear_back.first) {
+ Polyline &other = *collinear_back.first;
+ assert(&other != &poly);
+ poly.points.back() = collinear_back.second ? other.points.back() : other.points.front();
+ other.points.clear();
+ }
+ }
+ rtree.insert(std::make_pair(mk_rtree_seg(poly.points.front(), poly.points.back()), poly_idx++));
+ }
+ }
+
+ // Convert input polylines to lines_src after the colinear segments were merged.
+ Lines lines_src;
+ lines_src.reserve(lines.size());
+ std::transform(lines.begin(), lines.end(), std::back_inserter(lines_src), [](const Polyline &pl) {
+ return pl.empty() ? Line(Point(0, 0), Point(0, 0)) : Line(pl.points.front(), pl.points.back()); });
+
+ sort_remove_duplicates(lines_touching_at_endpoints);
+
+ std::vector<Intersection> intersections;
+ {
+ // Minimum lenght of an infill line to anchor. Very short lines cannot be trimmed from both sides,
+ // it does not help to anchor extremely short infill lines, it consumes too much plastic while not adding
+ // to the object rigidity.
+ assert(scaled_offset > scaled_trim_distance);
+ const double line_len_threshold_drop_both_sides = scaled_offset * (2. / cos(PI / 6.) + 0.5) + SCALED_EPSILON;
+ const double line_len_threshold_anchor_both_sides = line_len_threshold_drop_both_sides + scaled_offset;
+ const double line_len_threshold_drop_single_side = scaled_offset * (1. / cos(PI / 6.) + 1.5) + SCALED_EPSILON;
+ const double line_len_threshold_anchor_single_side = line_len_threshold_drop_single_side + scaled_offset;
+ for (size_t line_idx = 0; line_idx < lines.size(); ++ line_idx) {
+ Polyline &line = lines[line_idx];
+ if (line.points.empty())
+ continue;
+
+ Point &front_point = line.points.front();
+ Point &back_point = line.points.back();
+
+ // Find the nearest line from the start point of the line.
+ std::optional<size_t> tjoint_front, tjoint_back;
+ {
+ auto has_tjoint = [&closest, line_idx, &rtree, &lines, &lines_src](const Point &pt) {
+ auto filter_t_joint = [line_idx, &lines_src, pt](const auto &item) {
+ if (item.second != line_idx) {
+ // Verify that the point projects onto the line.
+ const Line &line = lines_src[item.second];
+ const Vec2d v = (line.b - line.a).cast<double>();
+ const Vec2d va = (pt - line.a).cast<double>();
+ const double l2 = v.squaredNorm(); // avoid a sqrt
+ if (l2 > 0.) {
+ const double t = va.dot(v);
+ return t > SCALED_EPSILON && t < l2 - SCALED_EPSILON;
+ }
+ }
+ return false;
+ };
+ closest.clear();
+ rtree.query(bgi::nearest(mk_rtree_point(pt), 1) && bgi::satisfies(filter_t_joint), std::back_inserter(closest));
+ std::optional<size_t> out;
+ if (! closest.empty()) {
+ const Polyline &pl = lines[closest.front().second];
+ if (pl.points.empty()) {
+ // The closest infill line was already dropped as it was too short.
+ // Such an infill line should not make a T-joint anyways.
+ #if 0 // #ifndef NDEBUG
+ const auto &seg = closest.front().first;
+ struct Linef { Vec2d a; Vec2d b; };
+ Linef l { { bg::get<0, 0>(seg), bg::get<0, 1>(seg) }, { bg::get<1, 0>(seg), bg::get<1, 1>(seg) } };
+ assert(line_alg::distance_to_squared(l, Vec2d(pt.cast<double>())) > 1000 * 1000);
+ #endif // NDEBUG
+ } else if (((Line)pl).distance_to_squared(pt) <= 1000 * 1000)
+ out = closest.front().second;
+ }
+ return out;
+ };
+ // Refuse to create a T-joint if the infill lines touch at their ends.
+ auto filter_end_point_connections = [&lines_touching_at_endpoints, &lines, &line](std::optional<size_t> in) {
+ std::optional<size_t> out;
+ if (in) {
+ const Polyline *lo = &line;
+ const Polyline *hi = &lines[*in];
+ if (lo > hi)
+ std::swap(lo, hi);
+ if (! std::binary_search(lines_touching_at_endpoints.begin(), lines_touching_at_endpoints.end(), std::make_pair(lo, hi)))
+ // Not an end-point connection, it is a valid T-joint.
+ out = in;
+ }
+ return out;
+ };
+ tjoint_front = filter_end_point_connections(has_tjoint(front_point));
+ tjoint_back = filter_end_point_connections(has_tjoint(back_point));
+ }
+
+ int num_tjoints = int(tjoint_front.has_value()) + int(tjoint_back.has_value());
+ if (num_tjoints > 0) {
+ double line_len = line.length();
+ bool drop = false;
+ bool anchor = false;
+ if (num_tjoints == 1) {
+ // Connected to perimeters on a single side only, connected to another infill line on the other side.
+ drop = line_len < line_len_threshold_drop_single_side;
+ anchor = line_len > line_len_threshold_anchor_single_side;
+ } else {
+ // Not connected to perimeters at all, connected to two infill lines.
+ assert(num_tjoints == 2);
+ drop = line_len < line_len_threshold_drop_both_sides;
+ anchor = line_len > line_len_threshold_anchor_both_sides;
+ }
+ if (drop) {
+ // Drop a very short line if connected to another infill line.
+ // Lines shorter than spacing are skipped because it is needed to shrink a line by the value of spacing.
+ // A shorter line than spacing could produce a degenerate polyline.
+ line.points.clear();
+ } else if (anchor) {
+ if (tjoint_front) {
+ // T-joint of line's front point with the 'closest' line.
+ intersections.emplace_back(lines_src[*tjoint_front], lines_src[line_idx], &line, front_point, true);
+ assert(validate_intersection_t_joint(intersections.back()));
+ }
+ if (tjoint_back) {
+ // T-joint of line's back point with the 'closest' line.
+ intersections.emplace_back(lines_src[*tjoint_back], lines_src[line_idx], &line, back_point, false);
+ assert(validate_intersection_t_joint(intersections.back()));
+ }
+ } else {
+ if (tjoint_front)
+ // T joint at the front at a 60 degree angle, the line is very short.
+ // Trim the front side.
+ front_point += ((scaled_trim_distance * 1.155) * (back_point - front_point).cast<double>().normalized()).cast<coord_t>();
+ if (tjoint_back)
+ // T joint at the front at a 60 degree angle, the line is very short.
+ // Trim the front side.
+ back_point += ((scaled_trim_distance * 1.155) * (front_point - back_point).cast<double>().normalized()).cast<coord_t>();
+ }
+ }
+ }
+ // Remove those intersections, that point to a dropped line.
+ for (auto it = intersections.begin(); it != intersections.end(); ) {
+ assert(! lines[it->intersect_line - lines_src.data()].points.empty());
+ if (lines[it->closest_line - lines_src.data()].points.empty()) {
+ *it = intersections.back();
+ intersections.pop_back();
+ } else
+ ++ it;
+ }
+ }
+ assert(validate_intersections(intersections));
+
+#ifdef ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT
+ static int iRun = 0;
+ int iStep = 0;
+ {
+ Points pts;
+ for (const Intersection &i : intersections)
+ pts.emplace_back(i.intersect_point);
+ export_infill_lines_to_svg(boundary, lines, debug_out_path("FillAdaptive-Tjoints-%d.svg", iRun++), pts);
+ }
+#endif /* ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT */
+
+ // Sort lexicographically by closest_line_idx and left/right orientation.
+ std::sort(intersections.begin(), intersections.end(),
+ [](const Intersection &i1, const Intersection &i2) {
+ return (i1.closest_line == i2.closest_line) ?
+ int(i1.left) < int(i2.left) :
+ i1.closest_line < i2.closest_line;
+ });
+
+ std::vector<size_t> merged_with(lines.size());
+ std::iota(merged_with.begin(), merged_with.end(), 0);
+
+ // Appends the boundary polygon with all holes to rtree for detection to check whether hooks are not crossing the boundary
+ {
+ Point prev = boundary.contour.points.back();
+ for (const Point &point : boundary.contour.points) {
+ rtree.insert(std::make_pair(mk_rtree_seg(prev, point), poly_idx++));
+ prev = point;
+ }
+ for (const Polygon &polygon : boundary.holes) {
+ Point prev = polygon.points.back();
+ for (const Point &point : polygon.points) {
+ rtree.insert(std::make_pair(mk_rtree_seg(prev, point), poly_idx++));
+ prev = point;
+ }
+ }
+ }
+
+ auto update_merged_polyline_idx = [&merged_with](size_t pl_idx) {
+ // Update the polyline index to index which is merged
+ for (size_t last = pl_idx;;) {
+ size_t lower = merged_with[last];
+ if (lower == last) {
+ merged_with[pl_idx] = lower;
+ return lower;
+ }
+ last = lower;
+ }
+ assert(false);
+ return size_t(0);
+ };
+ auto update_merged_polyline = [&lines, update_merged_polyline_idx](Intersection& intersection) {
+ // Update the polyline index to index which is merged
+ size_t intersect_pl_idx = update_merged_polyline_idx(intersection.intersect_pl - lines.data());
+ intersection.intersect_pl = &lines[intersect_pl_idx];
+ // After polylines are merged, it is necessary to update "forward" based on if intersect_point is the first or the last point of intersect_pl.
+ if (intersection.fresh()) {
+ assert(intersection.intersect_pl->points.front() == intersection.intersect_point ||
+ intersection.intersect_pl->points.back() == intersection.intersect_point);
+ intersection.front = intersection.intersect_pl->points.front() == intersection.intersect_point;
+ }
+ };
+
+ // Merge polylines touching at their ends. This should be a very rare case, but it happens surprisingly often.
+ for (auto it = lines_touching_at_endpoints.rbegin(); it != lines_touching_at_endpoints.rend(); ++ it) {
+ Polyline *pl1 = const_cast<Polyline*>(it->first);
+ Polyline *pl2 = const_cast<Polyline*>(it->second);
+ assert(pl1 < pl2);
+ // pl1 was visited for the 1st time.
+ // pl2 may have alread been merged with another polyline, even with this one.
+ pl2 = &lines[update_merged_polyline_idx(pl2 - lines.data())];
+ assert(pl1 <= pl2);
+ // Avoid closing a loop, ignore dropped infill lines.
+ if (pl1 != pl2 && ! pl1->points.empty() && ! pl2->points.empty()) {
+ // Merge the polylines.
+ assert(pl1 < pl2);
+ assert(pl1->points.size() >= 2);
+ assert(pl2->points.size() >= 2);
+ double d11 = (pl1->points.front() - pl2->points.front()).cast<double>().squaredNorm();
+ double d12 = (pl1->points.front() - pl2->points.back()) .cast<double>().squaredNorm();
+ double d21 = (pl1->points.back() - pl2->points.front()).cast<double>().squaredNorm();
+ double d22 = (pl1->points.back() - pl2->points.back()) .cast<double>().squaredNorm();
+ double d1min = std::min(d11, d12);
+ double d2min = std::min(d21, d22);
+ if (d1min < d2min) {
+ pl1->reverse();
+ if (d12 == d1min)
+ pl2->reverse();
+ } else if (d22 == d2min)
+ pl2->reverse();
+ pl1->points.back() = (pl1->points.back() + pl2->points.front()) / 2;
+ pl1->append(pl2->points.begin() + 1, pl2->points.end());
+ pl2->points.clear();
+ merged_with[pl2 - lines.data()] = pl1 - lines.data();
+ }
+ }
+
+ // Keep intersect_line outside the loop, so it does not get reallocated.
+ std::vector<std::pair<Intersection*, double>> intersect_line;
+ for (size_t min_idx = 0; min_idx < intersections.size();) {
+ intersect_line.clear();
+ // All the nearest points (T-joints) ending at the same line are projected onto this line. Because of it, it can easily find the nearest point.
+ {
+ const Vec2d line_dir = intersections[min_idx].closest_line->vector().cast<double>();
+ size_t max_idx = min_idx;
+ for (; max_idx < intersections.size() &&
+ intersections[min_idx].closest_line == intersections[max_idx].closest_line &&
+ intersections[min_idx].left == intersections[max_idx].left;
+ ++ max_idx)
+ intersect_line.emplace_back(&intersections[max_idx], line_dir.dot(intersections[max_idx].intersect_point.cast<double>()));
+ min_idx = max_idx;
+ assert(intersect_line.size() > 0);
+ // Sort the intersections along line_dir.
+ std::sort(intersect_line.begin(), intersect_line.end(), [](const auto &i1, const auto &i2) { return i1.second < i2.second; });
+ }
+
+ if (intersect_line.size() == 1) {
+ // Simple case: The current intersection is the only one touching its adjacent line.
+ Intersection &first_i = *intersect_line.front().first;
+ update_merged_polyline(first_i);
+ if (first_i.fresh()) {
+ // Try to connect left or right. If not enough space for hook_length, take the longer side.
+#ifdef ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT
+ export_infill_lines_to_svg(boundary, lines, debug_out_path("FillAdaptive-add_hook0-pre-%d-%d.svg", iRun, iStep), { first_i.intersect_point });
+#endif // ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT
+ add_hook(first_i, scaled_offset, hook_length, scaled_trim_distance, rtree, lines_src);
+#ifdef ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT
+ export_infill_lines_to_svg(boundary, lines, debug_out_path("FillAdaptive-add_hook0-pre-%d-%d.svg", iRun, iStep), { first_i.intersect_point });
+ ++ iStep;
+#endif // ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT
+ first_i.used = true;
+ }
+ continue;
+ }
+
+ for (size_t first_idx = 0; first_idx < intersect_line.size(); ++ first_idx) {
+ Intersection &first_i = *intersect_line[first_idx].first;
+ update_merged_polyline(first_i);
+ if (! first_i.fresh())
+ // The intersection has been processed, or the polyline has been merged to another polyline.
+ continue;
+
+ // Get the previous or next intersection on the same line, pick the closer one.
+ if (first_idx > 0)
+ update_merged_polyline(*intersect_line[first_idx - 1].first);
+ if (first_idx + 1 < intersect_line.size())
+ update_merged_polyline(*intersect_line[first_idx + 1].first);
+ Intersection &nearest_i = *get_nearest_intersection(intersect_line, first_idx);
+ assert(first_i.closest_line == nearest_i.closest_line);
+ assert(first_i.intersect_line != nearest_i.intersect_line);
+ assert(first_i.intersect_line != first_i.closest_line);
+ assert(nearest_i.intersect_line != first_i.closest_line);
+ // A line between two intersections points
+ Line offset_line = create_offset_line(Line(first_i.intersect_point, nearest_i.intersect_point), first_i, scaled_offset);
+ // Check if both intersections lie on the offset_line and simultaneously get their points of intersecting.
+ // These points are used as start and end of the hook
+ Point first_i_point, nearest_i_point;
+ bool could_connect = false;
+ if (nearest_i.fresh()) {
+ could_connect = first_i.intersect_line->intersection(offset_line, &first_i_point) &&
+ nearest_i.intersect_line->intersection(offset_line, &nearest_i_point);
+ assert(could_connect);
+ }
+ Points &first_points = first_i.intersect_pl->points;
+ Points &second_points = nearest_i.intersect_pl->points;
+ could_connect &= (nearest_i_point - first_i_point).cast<double>().squaredNorm() <= Slic3r::sqr(hook_length_max);
+ if (could_connect) {
+ // Both intersections are so close that their polylines can be connected.
+ // Verify that no other infill line intersects this anchor line.
+ closest.clear();
+ rtree.query(
+ bgi::intersects(mk_rtree_seg(first_i_point, nearest_i_point)) &&
+ bgi::satisfies([&first_i, &nearest_i, &lines_src](const auto &item)
+ { return item.second != first_i.intersect_line - lines_src.data() && item.second != nearest_i.intersect_line - lines_src.data(); }),
+ std::back_inserter(closest));
+ could_connect = closest.empty();
+#if 0
+ // Avoid self intersections. Maybe it is better to trim the self intersection after the connection?
+ if (could_connect && first_i.intersect_pl != nearest_i.intersect_pl) {
+ Line l(first_i_point, nearest_i_point);
+ could_connect = ! first_i.other_hook_intersects(l) && ! nearest_i.other_hook_intersects(l);
+ }
+#endif
+ }
+ bool connected = false;
+ if (could_connect) {
+#ifdef ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT
+ export_infill_lines_to_svg(boundary, lines, debug_out_path("FillAdaptive-connecting-pre-%d-%d.svg", iRun, iStep), { first_i.intersect_point, nearest_i.intersect_point });
+#endif // ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT
+ // No other infill line intersects this anchor line. Extrude it as a whole.
+ if (first_i.intersect_pl == nearest_i.intersect_pl) {
+ // Both intersections are on the same polyline, that means a loop is being closed.
+ assert(first_i.front != nearest_i.front);
+ if (! first_i.front)
+ std::swap(first_i_point, nearest_i_point);
+ first_points.front() = first_i_point;
+ first_points.back() = nearest_i_point;
+ //FIXME trim the end of a closed loop a bit?
+ first_points.emplace(first_points.begin(), nearest_i_point);
+ } else {
+ // Both intersections are on different polylines
+ Line l(first_i_point, nearest_i_point);
+ l.translate((perp(first_i.closest_line->vector().cast<double>().normalized()) * (first_i.left ? scaled_trim_distance : - scaled_trim_distance)).cast<coord_t>());
+ Point pt_start, pt_end;
+ bool trim_start = first_i .intersect_pl->points.size() == 3 && first_i .other_hook_intersects(l, pt_start);
+ bool trim_end = nearest_i.intersect_pl->points.size() == 3 && nearest_i.other_hook_intersects(l, pt_end);
+ first_points.reserve(first_points.size() + second_points.size());
+ if (first_i.front)
+ std::reverse(first_points.begin(), first_points.end());
+ if (trim_start)
+ first_points.front() = pt_start;
+ first_points.back() = first_i_point;
+ first_points.emplace_back(nearest_i_point);
+ if (nearest_i.front)
+ first_points.insert(first_points.end(), second_points.begin() + 1, second_points.end());
+ else
+ first_points.insert(first_points.end(), second_points.rbegin() + 1, second_points.rend());
+ if (trim_end)
+ first_points.back() = pt_end;
+ // Keep the polyline at the lower index slot.
+ if (first_i.intersect_pl < nearest_i.intersect_pl) {
+ second_points.clear();
+ merged_with[nearest_i.intersect_pl - lines.data()] = first_i.intersect_pl - lines.data();
+ } else {
+ second_points = std::move(first_points);
+ first_points.clear();
+ merged_with[first_i.intersect_pl - lines.data()] = nearest_i.intersect_pl - lines.data();
+ }
+ }
+ nearest_i.used = true;
+ connected = true;
+#ifdef ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT
+ export_infill_lines_to_svg(boundary, lines, debug_out_path("FillAdaptive-connecting-post-%d-%d.svg", iRun, iStep), { first_i.intersect_point, nearest_i.intersect_point });
+#endif // ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT
+ }
+ if (! connected) {
+ // Try to connect left or right. If not enough space for hook_length, take the longer side.
+#ifdef ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT
+ export_infill_lines_to_svg(boundary, lines, debug_out_path("FillAdaptive-add_hook-pre-%d-%d.svg", iRun, iStep), { first_i.intersect_point });
+#endif // ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT
+ add_hook(first_i, scaled_offset, hook_length, scaled_trim_distance, rtree, lines_src);
+#ifdef ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT
+ export_infill_lines_to_svg(boundary, lines, debug_out_path("FillAdaptive-add_hook-post-%d-%d.svg", iRun, iStep), { first_i.intersect_point });
+#endif // ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT
+ }
+#ifdef ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT
+ ++ iStep;
+#endif ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT
+ first_i.used = true;
+ }
+ }
+
+ Polylines polylines_out;
+ polylines_out.reserve(polylines_out.size() + std::count_if(lines.begin(), lines.end(), [](const Polyline &pl) { return !pl.empty(); }));
+ for (Polyline &pl : lines)
+ if (!pl.empty()) polylines_out.emplace_back(std::move(pl));
+ return polylines_out;
+}
+
+#ifndef NDEBUG
+bool has_no_collinear_lines(const Polylines &polylines)
+{
+ // Create line end point lookup.
+ struct LineEnd {
+ LineEnd(const Polyline *line, bool start) : line(line), start(start) {}
+ const Polyline *line;
+ // Is it the start or end point?
+ bool start;
+ const Point& point() const { return start ? line->points.front() : line->points.back(); }
+ const Point& other_point() const { return start ? line->points.back() : line->points.front(); }
+ LineEnd other_end() const { return LineEnd(line, !start); }
+ Vec2d vec() const { return Vec2d((this->other_point() - this->point()).cast<double>()); }
+ bool operator==(const LineEnd &rhs) const { return this->line == rhs.line && this->start == rhs.start; }
+ };
+ struct LineEndAccessor {
+ const Point* operator()(const LineEnd &pt) const { return &pt.point(); }
+ };
+ typedef ClosestPointInRadiusLookup<LineEnd, LineEndAccessor> ClosestPointLookupType;
+ ClosestPointLookupType closest_end_point_lookup(coord_t(1001. * sqrt(2.)));
+ for (const Polyline& pl : polylines) {
+// assert(pl.points.size() == 2);
+ auto line_start = LineEnd(&pl, true);
+ auto line_end = LineEnd(&pl, false);
+
+ auto assert_not_collinear = [&closest_end_point_lookup](const LineEnd &line_start) {
+ std::vector<std::pair<const LineEnd*, double>> hits = closest_end_point_lookup.find_all(line_start.point());
+ for (const std::pair<const LineEnd*, double> &hit : hits)
+ if ((line_start.point() - hit.first->point()).cwiseAbs().maxCoeff() <= 1000) {
+ // End points of the two lines are very close, they should have been merged together if they are collinear.
+ Vec2d v1 = line_start.vec();
+ Vec2d v2 = hit.first->vec();
+ Vec2d v1n = v1.normalized();
+ Vec2d v2n = v2.normalized();
+ // The vectors must not be collinear.
+ assert(std::abs(v1n.dot(v2n)) < cos(M_PI / 12.));
+ }
+ };
+ assert_not_collinear(line_start);
+ assert_not_collinear(line_end);
+
+ closest_end_point_lookup.insert(line_start);
+ closest_end_point_lookup.insert(line_end);
+ }
+
+ return true;
+}
+#endif
+
+void Filler::_fill_surface_single(
+ const FillParams &params,
+ unsigned int thickness_layers,
+ const std::pair<float, Point> &direction,
+ ExPolygon expolygon,
+ Polylines &polylines_out)
+{
+ assert (this->adapt_fill_octree);
+
+ Polylines all_polylines;
+ {
+ // 3 contexts for three directions of infill lines
+ std::array<FillContext, 3> contexts {
+ FillContext { *adapt_fill_octree, this->z, 0 },
+ FillContext { *adapt_fill_octree, this->z, 1 },
+ FillContext { *adapt_fill_octree, this->z, 2 }
+ };
+ // Generate the infill lines along the octree cells, merge touching lines of the same direction.
+ size_t num_lines = 0;
+ for (auto &context : contexts) {
+ generate_infill_lines_recursive(context, adapt_fill_octree->root_cube, 0, int(adapt_fill_octree->cubes_properties.size()) - 1);
+ num_lines += context.output_lines.size() + context.temp_lines.size();
+ }
+
+#if 0
+ // Collect the lines, trim them by the expolygon.
+ all_polylines.reserve(num_lines);
+ auto boundary = to_polygons(expolygon);
+ for (auto &context : contexts) {
+ Polylines lines;
+ lines.reserve(context.output_lines.size() + context.temp_lines.size());
+ std::transform(context.output_lines.begin(), context.output_lines.end(), std::back_inserter(lines), [](const Line& l) { return Polyline{ l.a, l.b }; });
+ for (const Line &l : context.temp_lines)
+ if (l.a.x() != std::numeric_limits<coord_t>::max())
+ lines.push_back({ l.a, l.b });
+ // Crop all polylines
+ append(all_polylines, intersection_pl(std::move(lines), boundary));
+ }
+// assert(has_no_collinear_lines(all_polylines));
+#else
+ // Collect the lines.
+ std::vector<Line> lines;
+ lines.reserve(num_lines);
+ for (auto &context : contexts) {
+ append(lines, context.output_lines);
+ for (const Line &line : context.temp_lines)
+ if (line.a.x() != std::numeric_limits<coord_t>::max())
+ lines.emplace_back(line);
+ }
+ // Convert lines to polylines.
+ all_polylines.reserve(lines.size());
+ std::transform(lines.begin(), lines.end(), std::back_inserter(all_polylines), [](const Line& l) { return Polyline{ l.a, l.b }; });
+ // Crop all polylines
+ all_polylines = intersection_pl(std::move(all_polylines), to_polygons(expolygon));
+#endif
+ }
+
+ // After intersection_pl some polylines with only one line are split into more lines
+ for (Polyline &polyline : all_polylines) {
+ //FIXME assert that all the points are collinear and in between the start and end point.
+ if (polyline.points.size() > 2)
+ polyline.points.erase(polyline.points.begin() + 1, polyline.points.end() - 1);
+ }
+// assert(has_no_collinear_lines(all_polylines));
+
+#ifdef ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT
+ {
+ static int iRun = 0;
+ export_infill_lines_to_svg(expolygon, all_polylines, debug_out_path("FillAdaptive-initial-%d.svg", iRun++));
+ }
+#endif /* ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT */
+
+ const auto hook_length = coordf_t(std::min<float>(std::numeric_limits<coord_t>::max(), scale_(params.anchor_length)));
+ const auto hook_length_max = coordf_t(std::min<float>(std::numeric_limits<coord_t>::max(), scale_(params.anchor_length_max)));
+
+ Polylines all_polylines_with_hooks = all_polylines.size() > 1 ? connect_lines_using_hooks(std::move(all_polylines), expolygon, this->spacing, hook_length, hook_length_max) : std::move(all_polylines);
+
+#ifdef ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT
+ {
+ static int iRun = 0;
+ export_infill_lines_to_svg(expolygon, all_polylines_with_hooks, debug_out_path("FillAdaptive-hooks-%d.svg", iRun++));
+ }
+#endif /* ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT */
+
+ if (params.dont_connect() || all_polylines_with_hooks.size() <= 1)
+ append(polylines_out, chain_polylines(std::move(all_polylines_with_hooks)));
+ else
+ connect_infill(std::move(all_polylines_with_hooks), expolygon, polylines_out, this->spacing, params);
+
+#ifdef ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT
+ {
+ static int iRun = 0;
+ export_infill_lines_to_svg(expolygon, polylines_out, debug_out_path("FillAdaptive-final-%d.svg", iRun ++));
+ }
+#endif /* ADAPTIVE_CUBIC_INFILL_DEBUG_OUTPUT */
+}
+
+static double bbox_max_radius(const BoundingBoxf3 &bbox, const Vec3d &center)
+{
+ const auto p = (bbox.min - center);
+ const auto s = bbox.size();
+ double r2max = 0.;
+ for (int i = 0; i < 8; ++ i)
+ r2max = std::max(r2max, (p + Vec3d(s.x() * double(i & 1), s.y() * double(i & 2), s.z() * double(i & 4))).squaredNorm());
+ return sqrt(r2max);
+}
+
+static std::vector<CubeProperties> make_cubes_properties(double max_cube_edge_length, double line_spacing)
+{
+ max_cube_edge_length += EPSILON;
+
+ std::vector<CubeProperties> cubes_properties;
+ for (double edge_length = line_spacing * 2.;; edge_length *= 2.)
+ {
+ CubeProperties props{};
+ props.edge_length = edge_length;
+ props.height = edge_length * sqrt(3);
+ props.diagonal_length = edge_length * sqrt(2);
+ props.line_z_distance = edge_length / sqrt(3);
+ props.line_xy_distance = edge_length / sqrt(6);
+ cubes_properties.emplace_back(props);
+ if (edge_length > max_cube_edge_length)
+ break;
+ }
+ return cubes_properties;
+}
+
+static inline bool is_overhang_triangle(const Vec3d &a, const Vec3d &b, const Vec3d &c, const Vec3d &up)
+{
+ // Calculate triangle normal.
+ auto n = (b - a).cross(c - b);
+ return n.dot(up) > 0.707 * n.norm();
+}
+
+static void transform_center(Cube *current_cube, const Eigen::Matrix3d &rot)
+{
+#ifndef NDEBUG
+ current_cube->center_octree = current_cube->center;
+#endif // NDEBUG
+ current_cube->center = rot * current_cube->center;
+ for (auto *child : current_cube->children)
+ if (child)
+ transform_center(child, rot);
+}
+
+OctreePtr build_octree(
+ // Mesh is rotated to the coordinate system of the octree.
+ const indexed_triangle_set &triangle_mesh,
+ // Overhang triangles extracted from fill surfaces with stInternalBridge type,
+ // rotated to the coordinate system of the octree.
+ const std::vector<Vec3d> &overhang_triangles,
+ coordf_t line_spacing,
+ bool support_overhangs_only)
+{
+ assert(line_spacing > 0);
+ assert(! std::isnan(line_spacing));
+
+ BoundingBox3Base<Vec3f> bbox(triangle_mesh.vertices);
+ Vec3d cube_center = bbox.center().cast<double>();
+ std::vector<CubeProperties> cubes_properties = make_cubes_properties(double(bbox.size().maxCoeff()), line_spacing);
+ auto octree = OctreePtr(new Octree(cube_center, cubes_properties));
+
+ if (cubes_properties.size() > 1) {
+ Octree *octree_ptr = octree.get();
+ double edge_length_half = 0.5 * cubes_properties.back().edge_length;
+ Vec3d diag_half(edge_length_half, edge_length_half, edge_length_half);
+ int max_depth = int(cubes_properties.size()) - 1;
+ auto process_triangle = [octree_ptr, max_depth, diag_half](const Vec3d &a, const Vec3d &b, const Vec3d &c) {
+ octree_ptr->insert_triangle(
+ a, b, c,
+ octree_ptr->root_cube,
+ BoundingBoxf3(octree_ptr->root_cube->center - diag_half, octree_ptr->root_cube->center + diag_half),
+ max_depth);
+ };
+ auto up_vector = support_overhangs_only ? Vec3d(transform_to_octree() * Vec3d(0., 0., 1.)) : Vec3d();
+ for (auto &tri : triangle_mesh.indices) {
+ auto a = triangle_mesh.vertices[tri[0]].cast<double>();
+ auto b = triangle_mesh.vertices[tri[1]].cast<double>();
+ auto c = triangle_mesh.vertices[tri[2]].cast<double>();
+ if (! support_overhangs_only || is_overhang_triangle(a, b, c, up_vector))
+ process_triangle(a, b, c);
+ }
+ for (size_t i = 0; i < overhang_triangles.size(); i += 3)
+ process_triangle(overhang_triangles[i], overhang_triangles[i + 1], overhang_triangles[i + 2]);
+ {
+ // Transform the octree to world coordinates to reduce computation when extracting infill lines.
+ auto rot = transform_to_world().toRotationMatrix();
+ transform_center(octree->root_cube, rot);
+ octree->origin = rot * octree->origin;
+ }
+ }
+
+ return octree;
+}
+
+void Octree::insert_triangle(const Vec3d &a, const Vec3d &b, const Vec3d &c, Cube *current_cube, const BoundingBoxf3 &current_bbox, int depth)
+{
+ assert(current_cube);
+ assert(depth > 0);
+
+ // Squared radius of a sphere around the child cube.
+ const double r2_cube = Slic3r::sqr(0.5 * this->cubes_properties[-- depth].height + EPSILON);
+
+ for (size_t i = 0; i < 8; ++ i) {
+ const Vec3d &child_center_dir = child_centers[i];
+ // Calculate a slightly expanded bounding box of a child cube to cope with triangles touching a cube wall and other numeric errors.
+ // We will rather densify the octree a bit more than necessary instead of missing a triangle.
+ BoundingBoxf3 bbox;
+ for (int k = 0; k < 3; ++ k) {
+ if (child_center_dir[k] == -1.) {
+ bbox.min[k] = current_bbox.min[k];
+ bbox.max[k] = current_cube->center[k] + EPSILON;
+ } else {
+ bbox.min[k] = current_cube->center[k] - EPSILON;
+ bbox.max[k] = current_bbox.max[k];
+ }
+ }
+ Vec3d child_center = current_cube->center + (child_center_dir * (this->cubes_properties[depth].edge_length / 2.));
+ //if (dist2_to_triangle(a, b, c, child_center) < r2_cube) {
+ if (triangle_AABB_intersects(a, b, c, bbox)) {
+ if (! current_cube->children[i])
+ current_cube->children[i] = this->pool.construct(child_center);
+ if (depth > 0)
+ this->insert_triangle(a, b, c, current_cube->children[i], bbox, depth);
+ }
+ }
+}
+
+} // namespace FillAdaptive
+} // namespace Slic3r
diff --git a/src/libslic3r/Fill/FillAdaptive.hpp b/src/libslic3r/Fill/FillAdaptive.hpp
new file mode 100644
index 000000000..330cb8a46
--- /dev/null
+++ b/src/libslic3r/Fill/FillAdaptive.hpp
@@ -0,0 +1,79 @@
+// Adaptive cubic infill was inspired by the work of @mboerwinkle
+// as implemented for Cura.
+// https://github.com/Ultimaker/CuraEngine/issues/381
+// https://github.com/Ultimaker/CuraEngine/pull/401
+//
+// Our implementation is more accurate (discretizes a bit less cubes than Cura's)
+// by splitting only such cubes which contain a triangle.
+// Our line extraction is time optimal instead of O(n^2) when connecting extracted lines,
+// and we also implemented adaptivity for supporting internal overhangs only.
+
+#ifndef slic3r_FillAdaptive_hpp_
+#define slic3r_FillAdaptive_hpp_
+
+#include "FillBase.hpp"
+
+struct indexed_triangle_set;
+
+namespace Slic3r {
+
+class PrintObject;
+
+namespace FillAdaptive
+{
+
+struct Octree;
+// To keep the definition of Octree opaque, we have to define a custom deleter.
+struct OctreeDeleter { void operator()(Octree *p); };
+using OctreePtr = std::unique_ptr<Octree, OctreeDeleter>;
+
+// Calculate line spacing for
+// 1) adaptive cubic infill
+// 2) adaptive internal support cubic infill
+// Returns zero for a particular infill type if no such infill is to be generated.
+std::pair<double, double> adaptive_fill_line_spacing(const PrintObject &print_object);
+
+// Rotation of the octree to stand on one of its corners.
+Eigen::Quaterniond transform_to_world();
+// Inverse roation of the above.
+Eigen::Quaterniond transform_to_octree();
+
+FillAdaptive::OctreePtr build_octree(
+ // Mesh is rotated to the coordinate system of the octree.
+ const indexed_triangle_set &triangle_mesh,
+ // Overhang triangles extracted from fill surfaces with stInternalBridge type,
+ // rotated to the coordinate system of the octree.
+ const std::vector<Vec3d> &overhang_triangles,
+ coordf_t line_spacing,
+ // If true, octree is densified below internal overhangs only.
+ bool support_overhangs_only);
+
+//
+// Some of the algorithms used by class FillAdaptive were inspired by
+// Cura Engine's class SubDivCube
+// https://github.com/Ultimaker/CuraEngine/blob/master/src/infill/SubDivCube.h
+//
+class Filler : public Slic3r::Fill
+{
+public:
+ ~Filler() override {}
+
+protected:
+ Fill* clone() const override { return new Filler(*this); };
+ void _fill_surface_single(
+ const FillParams &params,
+ unsigned int thickness_layers,
+ const std::pair<float, Point> &direction,
+ ExPolygon expolygon,
+ Polylines &polylines_out) override;
+ // Let the G-code export reoder the infill lines.
+ //FIXME letting the G-code exporter to reorder infill lines of Adaptive Cubic Infill
+ // may not be optimal as the internal infill lines may get extruded before the long infill
+ // lines to which the short infill lines are supposed to anchor.
+ bool no_sort() const override { return false; }
+};
+
+}; // namespace FillAdaptive
+} // namespace Slic3r
+
+#endif // slic3r_FillAdaptive_hpp_
diff --git a/src/libslic3r/Fill/FillBase.cpp b/src/libslic3r/Fill/FillBase.cpp
index 39679e3d6..20d32f3e2 100644
--- a/src/libslic3r/Fill/FillBase.cpp
+++ b/src/libslic3r/Fill/FillBase.cpp
@@ -1,10 +1,12 @@
#include <stdio.h>
+#include <numeric>
#include "../ClipperUtils.hpp"
#include "../EdgeGrid.hpp"
#include "../Geometry.hpp"
-#include "../Surface.hpp"
+#include "../Point.hpp"
#include "../PrintConfig.hpp"
+#include "../Surface.hpp"
#include "../libslic3r.h"
#include "FillBase.hpp"
@@ -13,9 +15,9 @@
#include "Fill3DHoneycomb.hpp"
#include "FillGyroid.hpp"
#include "FillPlanePath.hpp"
+#include "FillLine.hpp"
#include "FillRectilinear.hpp"
-#include "FillRectilinear2.hpp"
-#include "FillRectilinear3.hpp"
+#include "FillAdaptive.hpp"
namespace Slic3r {
@@ -26,18 +28,20 @@ Fill* Fill::new_from_type(const InfillPattern type)
case ipHoneycomb: return new FillHoneycomb();
case ip3DHoneycomb: return new Fill3DHoneycomb();
case ipGyroid: return new FillGyroid();
- case ipRectilinear: return new FillRectilinear2();
-// case ipRectilinear: return new FillRectilinear();
+ case ipRectilinear: return new FillRectilinear();
+ case ipAlignedRectilinear: return new FillAlignedRectilinear();
+ case ipMonotonic: return new FillMonotonic();
case ipLine: return new FillLine();
- case ipGrid: return new FillGrid2();
+ case ipGrid: return new FillGrid();
case ipTriangles: return new FillTriangles();
case ipStars: return new FillStars();
case ipCubic: return new FillCubic();
-// case ipGrid: return new FillGrid();
case ipArchimedeanChords: return new FillArchimedeanChords();
case ipHilbertCurve: return new FillHilbertCurve();
case ipOctagramSpiral: return new FillOctagramSpiral();
- default: throw std::invalid_argument("unknown type");
+ case ipAdaptiveCubic: return new FillAdaptive::Filler();
+ case ipSupportCubic: return new FillAdaptive::Filler();
+ default: throw Slic3r::InvalidArgument("unknown type");
}
}
@@ -77,7 +81,7 @@ Polylines Fill::fill_surface(const Surface *surface, const FillParams &params)
params,
surface->thickness_layers,
_infill_direction(surface),
- expp[i],
+ std::move(expp[i]),
polylines_out);
return polylines_out;
}
@@ -92,10 +96,10 @@ coord_t Fill::_adjust_solid_spacing(const coord_t width, const coord_t distance)
assert(width >= 0);
assert(distance > 0);
// floor(width / distance)
- coord_t number_of_intervals = (width - EPSILON) / distance;
- coord_t distance_new = (number_of_intervals == 0) ?
+ const auto number_of_intervals = coord_t((width - EPSILON) / distance);
+ coord_t distance_new = (number_of_intervals == 0) ?
distance :
- ((width - EPSILON) / number_of_intervals);
+ coord_t((width - EPSILON) / number_of_intervals);
const coordf_t factor = coordf_t(distance_new) / coordf_t(distance);
assert(factor > 1. - 1e-5);
// How much could the extrusion width be increased? By 20%.
@@ -139,7 +143,7 @@ std::pair<float, Point> Fill::_infill_direction(const Surface *surface) const
#ifdef SLIC3R_DEBUG
printf("Filling bridge with angle %f\n", surface->bridge_angle);
#endif /* SLIC3R_DEBUG */
- out_angle = surface->bridge_angle;
+ out_angle = float(surface->bridge_angle);
} else if (this->layer_id != size_t(-1)) {
// alternate fill direction
out_angle += this->_layer_angle(this->layer_id / surface->thickness_layers);
@@ -151,407 +155,221 @@ std::pair<float, Point> Fill::_infill_direction(const Surface *surface) const
return std::pair<float, Point>(out_angle, out_shift);
}
-#if 0
-// From pull request "Gyroid improvements" #2730 by @supermerill
-
-/// cut poly between poly.point[idx_1] & poly.point[idx_1+1]
-/// add p1+-width to one part and p2+-width to the other one.
-/// add the "new" polyline to polylines (to part cut from poly)
-/// p1 & p2 have to be between poly.point[idx_1] & poly.point[idx_1+1]
-/// if idx_1 is ==0 or == size-1, then we don't need to create a new polyline.
-static void cut_polyline(Polyline &poly, Polylines &polylines, size_t idx_1, Point p1, Point p2) {
- //reorder points
- if (p1.distance_to_square(poly.points[idx_1]) > p2.distance_to_square(poly.points[idx_1])) {
- Point temp = p2;
- p2 = p1;
- p1 = temp;
- }
- if (idx_1 == poly.points.size() - 1) {
- //shouldn't be possible.
- poly.points.erase(poly.points.end() - 1);
- } else {
- // create new polyline
- Polyline new_poly;
- //put points in new_poly
- new_poly.points.push_back(p2);
- new_poly.points.insert(new_poly.points.end(), poly.points.begin() + idx_1 + 1, poly.points.end());
- //erase&put points in poly
- poly.points.erase(poly.points.begin() + idx_1 + 1, poly.points.end());
- poly.points.push_back(p1);
- //safe test
- if (poly.length() == 0)
- poly.points = new_poly.points;
- else
- polylines.emplace_back(new_poly);
- }
-}
-
-/// the poly is like a polygon but with first_point != last_point (already removed)
-static void cut_polygon(Polyline &poly, size_t idx_1, Point p1, Point p2) {
- //reorder points
- if (p1.distance_to_square(poly.points[idx_1]) > p2.distance_to_square(poly.points[idx_1])) {
- Point temp = p2;
- p2 = p1;
- p1 = temp;
- }
- //check if we need to rotate before cutting
- if (idx_1 != poly.size() - 1) {
- //put points in new_poly
- poly.points.insert(poly.points.end(), poly.points.begin(), poly.points.begin() + idx_1 + 1);
- poly.points.erase(poly.points.begin(), poly.points.begin() + idx_1 + 1);
- }
- //put points in poly
- poly.points.push_back(p1);
- poly.points.insert(poly.points.begin(), p2);
-}
-
-/// check if the polyline from pts_to_check may be at 'width' distance of a point in polylines_blocker
-/// it use equally_spaced_points with width/2 precision, so don't worry with pts_to_check number of points.
-/// it use the given polylines_blocker points, be sure to put enough of them to be reliable.
-/// complexity : N(pts_to_check.equally_spaced_points(width / 2)) x N(polylines_blocker.points)
-static bool collision(const Points &pts_to_check, const Polylines &polylines_blocker, const coordf_t width) {
- //check if it's not too close to a polyline
- coordf_t min_dist_square = width * width * 0.9 - SCALED_EPSILON;
- Polyline better_polylines(pts_to_check);
- Points better_pts = better_polylines.equally_spaced_points(width / 2);
- for (const Point &p : better_pts) {
- for (const Polyline &poly2 : polylines_blocker) {
- for (const Point &p2 : poly2.points) {
- if (p.distance_to_square(p2) < min_dist_square) {
- return true;
- }
- }
+// A single T joint of an infill line to a closed contour or one of its holes.
+struct ContourIntersectionPoint {
+ // Contour and point on a contour where an infill line is connected to.
+ size_t contour_idx;
+ size_t point_idx;
+ // Eucleidean parameter of point_idx along its contour.
+ double param;
+ // Other intersection points along the same contour. If there is only a single T-joint on a contour
+ // with an intersection line, then the prev_on_contour and next_on_contour remain nulls.
+ ContourIntersectionPoint* prev_on_contour { nullptr };
+ ContourIntersectionPoint* next_on_contour { nullptr };
+ // Length of the contour not yet allocated to some extrusion path going back (clockwise), or masked out by some overlapping infill line.
+ double contour_not_taken_length_prev { std::numeric_limits<double>::max() };
+ // Length of the contour not yet allocated to some extrusion path going forward (counter-clockwise), or masked out by some overlapping infill line.
+ double contour_not_taken_length_next { std::numeric_limits<double>::max() };
+ // End point is consumed if an infill line connected to this T-joint was already connected left or right along the contour,
+ // or if the infill line was processed, but it was not possible to connect it left or right along the contour.
+ bool consumed { false };
+ // Whether the contour was trimmed by an overlapping infill line, or whether part of this contour was connected to some infill line.
+ bool prev_trimmed { false };
+ bool next_trimmed { false };
+
+ void consume_prev() { this->contour_not_taken_length_prev = 0.; this->prev_trimmed = true; this->consumed = true; }
+ void consume_next() { this->contour_not_taken_length_next = 0.; this->next_trimmed = true; this->consumed = true; }
+
+ void trim_prev(const double new_len) {
+ if (new_len < this->contour_not_taken_length_prev) {
+ this->contour_not_taken_length_prev = new_len;
+ this->prev_trimmed = true;
}
}
- return false;
-}
-
-/// Try to find a path inside polylines that allow to go from p1 to p2.
-/// width if the width of the extrusion
-/// polylines_blockers are the array of polylines to check if the path isn't blocked by something.
-/// complexity: N(polylines.points) + a collision check after that if we finded a path: N(2(p2-p1)/width) x N(polylines_blocker.points)
-static Points get_frontier(Polylines &polylines, const Point& p1, const Point& p2, const coord_t width, const Polylines &polylines_blockers, coord_t max_size = -1) {
- for (size_t idx_poly = 0; idx_poly < polylines.size(); ++idx_poly) {
- Polyline &poly = polylines[idx_poly];
- if (poly.size() <= 1) continue;
-
- //loop?
- if (poly.first_point() == poly.last_point()) {
- //polygon : try to find a line for p1 & p2.
- size_t idx_11, idx_12, idx_21, idx_22;
- idx_11 = poly.closest_point_index(p1);
- idx_12 = idx_11;
- if (Line(poly.points[idx_11], poly.points[(idx_11 + 1) % (poly.points.size() - 1)]).distance_to(p1) < SCALED_EPSILON) {
- idx_12 = (idx_11 + 1) % (poly.points.size() - 1);
- } else if (Line(poly.points[(idx_11 > 0) ? (idx_11 - 1) : (poly.points.size() - 2)], poly.points[idx_11]).distance_to(p1) < SCALED_EPSILON) {
- idx_11 = (idx_11 > 0) ? (idx_11 - 1) : (poly.points.size() - 2);
- } else {
- continue;
- }
- idx_21 = poly.closest_point_index(p2);
- idx_22 = idx_21;
- if (Line(poly.points[idx_21], poly.points[(idx_21 + 1) % (poly.points.size() - 1)]).distance_to(p2) < SCALED_EPSILON) {
- idx_22 = (idx_21 + 1) % (poly.points.size() - 1);
- } else if (Line(poly.points[(idx_21 > 0) ? (idx_21 - 1) : (poly.points.size() - 2)], poly.points[idx_21]).distance_to(p2) < SCALED_EPSILON) {
- idx_21 = (idx_21 > 0) ? (idx_21 - 1) : (poly.points.size() - 2);
- } else {
- continue;
- }
-
-
- //edge case: on the same line
- if (idx_11 == idx_21 && idx_12 == idx_22) {
- if (collision(Points() = { p1, p2 }, polylines_blockers, width)) return Points();
- //break loop
- poly.points.erase(poly.points.end() - 1);
- cut_polygon(poly, idx_11, p1, p2);
- return Points() = { Line(p1, p2).midpoint() };
- }
-
- //compute distance & array for the ++ path
- Points ret_1_to_2;
- double dist_1_to_2 = p1.distance_to(poly.points[idx_12]);
- ret_1_to_2.push_back(poly.points[idx_12]);
- size_t max = idx_12 <= idx_21 ? idx_21+1 : poly.points.size();
- for (size_t i = idx_12 + 1; i < max; i++) {
- dist_1_to_2 += poly.points[i - 1].distance_to(poly.points[i]);
- ret_1_to_2.push_back(poly.points[i]);
- }
- if (idx_12 > idx_21) {
- dist_1_to_2 += poly.points.back().distance_to(poly.points.front());
- ret_1_to_2.push_back(poly.points[0]);
- for (size_t i = 1; i <= idx_21; i++) {
- dist_1_to_2 += poly.points[i - 1].distance_to(poly.points[i]);
- ret_1_to_2.push_back(poly.points[i]);
- }
- }
- dist_1_to_2 += p2.distance_to(poly.points[idx_21]);
-
- //compute distance & array for the -- path
- Points ret_2_to_1;
- double dist_2_to_1 = p1.distance_to(poly.points[idx_11]);
- ret_2_to_1.push_back(poly.points[idx_11]);
- size_t min = idx_22 <= idx_11 ? idx_22 : 0;
- for (size_t i = idx_11; i > min; i--) {
- dist_2_to_1 += poly.points[i - 1].distance_to(poly.points[i]);
- ret_2_to_1.push_back(poly.points[i - 1]);
- }
- if (idx_22 > idx_11) {
- dist_2_to_1 += poly.points.back().distance_to(poly.points.front());
- ret_2_to_1.push_back(poly.points[poly.points.size() - 1]);
- for (size_t i = poly.points.size() - 1; i > idx_22; i--) {
- dist_2_to_1 += poly.points[i - 1].distance_to(poly.points[i]);
- ret_2_to_1.push_back(poly.points[i - 1]);
- }
- }
- dist_2_to_1 += p2.distance_to(poly.points[idx_22]);
-
- if (max_size < dist_2_to_1 && max_size < dist_1_to_2) {
- return Points();
- }
-
- //choose between the two direction (keep the short one)
- if (dist_1_to_2 < dist_2_to_1) {
- if (collision(ret_1_to_2, polylines_blockers, width)) return Points();
- //break loop
- poly.points.erase(poly.points.end() - 1);
- //remove points
- if (idx_12 <= idx_21) {
- poly.points.erase(poly.points.begin() + idx_12, poly.points.begin() + idx_21 + 1);
- if (idx_12 != 0) {
- cut_polygon(poly, idx_11, p1, p2);
- } //else : already cut at the good place
- } else {
- poly.points.erase(poly.points.begin() + idx_12, poly.points.end());
- poly.points.erase(poly.points.begin(), poly.points.begin() + idx_21);
- cut_polygon(poly, poly.points.size() - 1, p1, p2);
- }
- return ret_1_to_2;
- } else {
- if (collision(ret_2_to_1, polylines_blockers, width)) return Points();
- //break loop
- poly.points.erase(poly.points.end() - 1);
- //remove points
- if (idx_22 <= idx_11) {
- poly.points.erase(poly.points.begin() + idx_22, poly.points.begin() + idx_11 + 1);
- if (idx_22 != 0) {
- cut_polygon(poly, idx_21, p1, p2);
- } //else : already cut at the good place
- } else {
- poly.points.erase(poly.points.begin() + idx_22, poly.points.end());
- poly.points.erase(poly.points.begin(), poly.points.begin() + idx_11);
- cut_polygon(poly, poly.points.size() - 1, p1, p2);
- }
- return ret_2_to_1;
- }
- } else {
- //polyline : try to find a line for p1 & p2.
- size_t idx_1, idx_2;
- idx_1 = poly.closest_point_index(p1);
- if (idx_1 < poly.points.size() - 1 && Line(poly.points[idx_1], poly.points[idx_1 + 1]).distance_to(p1) < SCALED_EPSILON) {
- } else if (idx_1 > 0 && Line(poly.points[idx_1 - 1], poly.points[idx_1]).distance_to(p1) < SCALED_EPSILON) {
- idx_1 = idx_1 - 1;
- } else {
- continue;
- }
- idx_2 = poly.closest_point_index(p2);
- if (idx_2 < poly.points.size() - 1 && Line(poly.points[idx_2], poly.points[idx_2 + 1]).distance_to(p2) < SCALED_EPSILON) {
- } else if (idx_2 > 0 && Line(poly.points[idx_2 - 1], poly.points[idx_2]).distance_to(p2) < SCALED_EPSILON) {
- idx_2 = idx_2 - 1;
- } else {
- continue;
- }
-
- //edge case: on the same line
- if (idx_1 == idx_2) {
- if (collision(Points() = { p1, p2 }, polylines_blockers, width)) return Points();
- cut_polyline(poly, polylines, idx_1, p1, p2);
- return Points() = { Line(p1, p2).midpoint() };
- }
-
- //create ret array
- size_t first_idx = idx_1;
- size_t last_idx = idx_2 + 1;
- if (idx_1 > idx_2) {
- first_idx = idx_2;
- last_idx = idx_1 + 1;
- }
- Points p_ret;
- p_ret.insert(p_ret.end(), poly.points.begin() + first_idx + 1, poly.points.begin() + last_idx);
-
- coordf_t length = 0;
- for (size_t i = 1; i < p_ret.size(); i++) length += p_ret[i - 1].distance_to(p_ret[i]);
-
- if (max_size < length) {
- return Points();
- }
-
- if (collision(p_ret, polylines_blockers, width)) return Points();
- //cut polyline
- poly.points.erase(poly.points.begin() + first_idx + 1, poly.points.begin() + last_idx);
- cut_polyline(poly, polylines, first_idx, p1, p2);
- //order the returned array to be p1->p2
- if (idx_1 > idx_2) {
- std::reverse(p_ret.begin(), p_ret.end());
- }
- return p_ret;
+ void trim_next(const double new_len) {
+ if (new_len < this->contour_not_taken_length_next) {
+ this->contour_not_taken_length_next = new_len;
+ this->next_trimmed = true;
}
-
}
- return Points();
+ // The end point of an infill line connected to this T-joint was not processed yet and a piece of the contour could be extruded going backwards.
+ bool could_take_prev() const throw() { return ! this->consumed && this->contour_not_taken_length_prev > SCALED_EPSILON; }
+ // The end point of an infill line connected to this T-joint was not processed yet and a piece of the contour could be extruded going forward.
+ bool could_take_next() const throw() { return ! this->consumed && this->contour_not_taken_length_next > SCALED_EPSILON; }
+
+ // Could extrude a complete segment from this to this->prev_on_contour.
+ bool could_connect_prev() const throw()
+ { return ! this->consumed && this->prev_on_contour != this && ! this->prev_on_contour->consumed && ! this->prev_trimmed && ! this->prev_on_contour->next_trimmed; }
+ // Could extrude a complete segment from this to this->next_on_contour.
+ bool could_connect_next() const throw()
+ { return ! this->consumed && this->next_on_contour != this && ! this->next_on_contour->consumed && ! this->next_trimmed && ! this->next_on_contour->prev_trimmed; }
+};
+
+// Distance from param1 to param2 when going counter-clockwise.
+static inline double closed_contour_distance_ccw(double param1, double param2, double contour_length)
+{
+ assert(param1 >= 0. && param1 <= contour_length);
+ assert(param2 >= 0. && param2 <= contour_length);
+ double d = param2 - param1;
+ if (d < 0.)
+ d += contour_length;
+ return d;
}
-/// Connect the infill_ordered polylines, in this order, from the back point to the next front point.
-/// It uses only the boundary polygons to do so, and can't pass two times at the same place.
-/// It avoid passing over the infill_ordered's polylines (preventing local over-extrusion).
-/// return the connected polylines in polylines_out. Can output polygons (stored as polylines with first_point = last_point).
-/// complexity: worst: N(infill_ordered.points) x N(boundary.points)
-/// typical: N(infill_ordered) x ( N(boundary.points) + N(infill_ordered.points) )
-void Fill::connect_infill(Polylines &&infill_ordered, const ExPolygon &boundary, Polylines &polylines_out, const FillParams &params) {
-
- //TODO: fallback to the quick & dirty old algorithm when n(points) is too high.
- Polylines polylines_frontier = to_polylines(((Polygons)boundary));
-
- Polylines polylines_blocker;
- coord_t clip_size = scale_(this->spacing) * 2;
- for (const Polyline &polyline : infill_ordered) {
- if (polyline.length() > 2.01 * clip_size) {
- polylines_blocker.push_back(polyline);
- polylines_blocker.back().clip_end(clip_size);
- polylines_blocker.back().clip_start(clip_size);
- }
- }
+// Distance from param1 to param2 when going clockwise.
+static inline double closed_contour_distance_cw(double param1, double param2, double contour_length)
+{
+ return closed_contour_distance_ccw(param2, param1, contour_length);
+}
- //length between two lines
- coordf_t ideal_length = (1 / params.density) * this->spacing;
-
- Polylines polylines_connected_first;
- bool first = true;
- for (const Polyline &polyline : infill_ordered) {
- if (!first) {
- // Try to connect the lines.
- Points &pts_end = polylines_connected_first.back().points;
- const Point &last_point = pts_end.back();
- const Point &first_point = polyline.points.front();
- if (last_point.distance_to(first_point) < scale_(this->spacing) * 10) {
- Points pts_frontier = get_frontier(polylines_frontier, last_point, first_point, scale_(this->spacing), polylines_blocker, (coord_t)scale_(ideal_length) * 2);
- if (!pts_frontier.empty()) {
- // The lines can be connected.
- pts_end.insert(pts_end.end(), pts_frontier.begin(), pts_frontier.end());
- pts_end.insert(pts_end.end(), polyline.points.begin(), polyline.points.end());
- continue;
- }
- }
- }
- // The lines cannot be connected.
- polylines_connected_first.emplace_back(std::move(polyline));
+// Length along the contour from cp1 to cp2 going counter-clockwise.
+double path_length_along_contour_ccw(const ContourIntersectionPoint *cp1, const ContourIntersectionPoint *cp2, double contour_length)
+{
+ assert(cp1 != nullptr);
+ assert(cp2 != nullptr);
+ assert(cp1->contour_idx == cp2->contour_idx);
+ assert(cp1 != cp2);
+ return closed_contour_distance_ccw(cp1->param, cp2->param, contour_length);
+}
- first = false;
+// Lengths along the contour from cp1 to cp2 going CCW and going CW.
+std::pair<double, double> path_lengths_along_contour(const ContourIntersectionPoint *cp1, const ContourIntersectionPoint *cp2, double contour_length)
+{
+ // Zero'th param is the length of the contour.
+ double param_lo = cp1->param;
+ double param_hi = cp2->param;
+ assert(param_lo >= 0. && param_lo <= contour_length);
+ assert(param_hi >= 0. && param_hi <= contour_length);
+ bool reversed = false;
+ if (param_lo > param_hi) {
+ std::swap(param_lo, param_hi);
+ reversed = true;
}
+ auto out = std::make_pair(param_hi - param_lo, param_lo + contour_length - param_hi);
+ if (reversed)
+ std::swap(out.first, out.second);
+ return out;
+}
- Polylines polylines_connected;
- first = true;
- for (const Polyline &polyline : polylines_connected_first) {
- if (!first) {
- // Try to connect the lines.
- Points &pts_end = polylines_connected.back().points;
- const Point &last_point = pts_end.back();
- const Point &first_point = polyline.points.front();
-
- Polylines before = polylines_frontier;
- Points pts_frontier = get_frontier(polylines_frontier, last_point, first_point, scale_(this->spacing), polylines_blocker);
- if (!pts_frontier.empty()) {
- // The lines can be connected.
- pts_end.insert(pts_end.end(), pts_frontier.begin(), pts_frontier.end());
- pts_end.insert(pts_end.end(), polyline.points.begin(), polyline.points.end());
- continue;
- }
- }
- // The lines cannot be connected.
- polylines_connected.emplace_back(std::move(polyline));
-
- first = false;
+// Add contour points from interval (idx_start, idx_end> to polyline.
+static inline void take_cw_full(Polyline &pl, const Points& contour, size_t idx_start, size_t idx_end)
+{
+ assert(! pl.empty() && pl.points.back() == contour[idx_start]);
+ size_t i = (idx_end == 0) ? contour.size() - 1 : idx_start - 1;
+ while (i != idx_end) {
+ pl.points.emplace_back(contour[i]);
+ if (i == 0)
+ i = contour.size();
+ --i;
}
+ pl.points.emplace_back(contour[i]);
+}
- //try to link to nearest point if possible
- for (size_t idx1 = 0; idx1 < polylines_connected.size(); idx1++) {
- size_t min_idx = 0;
- coordf_t min_length = 0;
- bool switch_id1 = false;
- bool switch_id2 = false;
- for (size_t idx2 = idx1 + 1; idx2 < polylines_connected.size(); idx2++) {
- double last_first = polylines_connected[idx1].last_point().distance_to_square(polylines_connected[idx2].first_point());
- double first_first = polylines_connected[idx1].first_point().distance_to_square(polylines_connected[idx2].first_point());
- double first_last = polylines_connected[idx1].first_point().distance_to_square(polylines_connected[idx2].last_point());
- double last_last = polylines_connected[idx1].last_point().distance_to_square(polylines_connected[idx2].last_point());
- double min = std::min(std::min(last_first, last_last), std::min(first_first, first_last));
- if (min < min_length || min_length == 0) {
- min_idx = idx2;
- switch_id1 = (std::min(last_first, last_last) > std::min(first_first, first_last));
- switch_id2 = (std::min(last_first, first_first) > std::min(last_last, first_last));
- min_length = min;
- }
- }
- if (min_idx > idx1 && min_idx < polylines_connected.size()){
- Points pts_frontier = get_frontier(polylines_frontier,
- switch_id1 ? polylines_connected[idx1].first_point() : polylines_connected[idx1].last_point(),
- switch_id2 ? polylines_connected[min_idx].last_point() : polylines_connected[min_idx].first_point(),
- scale_(this->spacing), polylines_blocker);
- if (!pts_frontier.empty()) {
- if (switch_id1) polylines_connected[idx1].reverse();
- if (switch_id2) polylines_connected[min_idx].reverse();
- Points &pts_end = polylines_connected[idx1].points;
- pts_end.insert(pts_end.end(), pts_frontier.begin(), pts_frontier.end());
- pts_end.insert(pts_end.end(), polylines_connected[min_idx].points.begin(), polylines_connected[min_idx].points.end());
- polylines_connected.erase(polylines_connected.begin() + min_idx);
- }
+// Add contour points from interval (idx_start, idx_end> to polyline, limited by the Eucleidean length taken.
+static inline double take_cw_limited(Polyline &pl, const Points &contour, const std::vector<double> &params, size_t idx_start, size_t idx_end, double length_to_take)
+{
+ // If appending to an infill line, then the start point of a perimeter line shall match the end point of an infill line.
+ assert(pl.empty() || pl.points.back() == contour[idx_start]);
+ assert(contour.size() + 1 == params.size());
+ assert(length_to_take > SCALED_EPSILON);
+ // Length of the contour.
+ double length = params.back();
+ // Parameter (length from contour.front()) for the first point.
+ double p0 = params[idx_start];
+ // Current (2nd) point of the contour.
+ size_t i = (idx_start == 0) ? contour.size() - 1 : idx_start - 1;
+ // Previous point of the contour.
+ size_t iprev = idx_start;
+ // Length of the contour curve taken for iprev.
+ double lprev = 0.;
+
+ for (;;) {
+ double l = closed_contour_distance_cw(p0, params[i], length);
+ if (l >= length_to_take) {
+ // Trim the last segment.
+ double t = double(length_to_take - lprev) / (l - lprev);
+ pl.points.emplace_back(lerp(contour[iprev], contour[i], t));
+ return length_to_take;
}
+ // Continue with the other segments.
+ pl.points.emplace_back(contour[i]);
+ if (i == idx_end)
+ return l;
+ iprev = i;
+ lprev = l;
+ if (i == 0)
+ i = contour.size();
+ -- i;
}
+ assert(false);
+ return 0;
+}
- //try to create some loops if possible
- for (Polyline &polyline : polylines_connected) {
- Points pts_frontier = get_frontier(polylines_frontier, polyline.last_point(), polyline.first_point(), scale_(this->spacing), polylines_blocker);
- if (!pts_frontier.empty()) {
- polyline.points.insert(polyline.points.end(), pts_frontier.begin(), pts_frontier.end());
- polyline.points.insert(polyline.points.begin(), polyline.points.back());
- }
- polylines_out.emplace_back(polyline);
+// Add contour points from interval (idx_start, idx_end> to polyline.
+static inline void take_ccw_full(Polyline &pl, const Points &contour, size_t idx_start, size_t idx_end)
+{
+ assert(! pl.empty() && pl.points.back() == contour[idx_start]);
+ size_t i = idx_start;
+ if (++ i == contour.size())
+ i = 0;
+ while (i != idx_end) {
+ pl.points.emplace_back(contour[i]);
+ if (++ i == contour.size())
+ i = 0;
}
+ pl.points.emplace_back(contour[i]);
}
-#else
-
-struct ContourPointData {
- ContourPointData(float param) : param(param) {}
- // Eucleidean position of the contour point along the contour.
- float param = 0.f;
- // Was the segment starting with this contour point extruded?
- bool segment_consumed = false;
- // Was this point extruded over?
- bool point_consumed = false;
-};
-
-// Verify whether the contour from point idx_start to point idx_end could be taken (whether all segments along the contour were not yet extruded).
-static bool could_take(const std::vector<ContourPointData> &contour_data, size_t idx_start, size_t idx_end)
+// Add contour points from interval (idx_start, idx_end> to polyline, limited by the Eucleidean length taken.
+// Returns length of the contour taken.
+static inline double take_ccw_limited(Polyline &pl, const Points &contour, const std::vector<double> &params, size_t idx_start, size_t idx_end, double length_to_take)
{
- assert(idx_start != idx_end);
- for (size_t i = idx_start; i != idx_end; ) {
- if (contour_data[i].segment_consumed || contour_data[i].point_consumed)
- return false;
- if (++ i == contour_data.size())
- i = 0;
- }
- return ! contour_data[idx_end].point_consumed;
+ // If appending to an infill line, then the start point of a perimeter line shall match the end point of an infill line.
+ assert(pl.empty() || pl.points.back() == contour[idx_start]);
+ assert(contour.size() + 1 == params.size());
+ assert(length_to_take > SCALED_EPSILON);
+ // Length of the contour.
+ double length = params.back();
+ // Parameter (length from contour.front()) for the first point.
+ double p0 = params[idx_start];
+ // Current (2nd) point of the contour.
+ size_t i = idx_start;
+ if (++ i == contour.size())
+ i = 0;
+ // Previous point of the contour.
+ size_t iprev = idx_start;
+ // Length of the contour curve taken at iprev.
+ double lprev = 0;
+ for (;;) {
+ double l = closed_contour_distance_ccw(p0, params[i], length);
+ if (l >= length_to_take) {
+ // Trim the last segment.
+ double t = double(length_to_take - lprev) / (l - lprev);
+ pl.points.emplace_back(lerp(contour[iprev], contour[i], t));
+ return length_to_take;
+ }
+ // Continue with the other segments.
+ pl.points.emplace_back(contour[i]);
+ if (i == idx_end)
+ return l;
+ iprev = i;
+ lprev = l;
+ if (++ i == contour.size())
+ i = 0;
+ }
+ assert(false);
+ return 0;
}
// Connect end of pl1 to the start of pl2 using the perimeter contour.
-// The idx_start and idx_end are ordered so that the connecting polyline points will be taken with increasing indices.
-static void take(Polyline &pl1, Polyline &&pl2, const Points &contour, std::vector<ContourPointData> &contour_data, size_t idx_start, size_t idx_end, bool reversed)
+// If clockwise, then a clockwise segment from idx_start to idx_end is taken, otherwise a counter-clockwise segment is being taken.
+static void take(Polyline &pl1, const Polyline &pl2, const Points &contour, size_t idx_start, size_t idx_end, bool clockwise)
{
#ifndef NDEBUG
- size_t num_points_initial = pl1.points.size();
assert(idx_start != idx_end);
+ assert(pl1.size() >= 2);
+ assert(pl2.size() >= 2);
#endif /* NDEBUG */
{
@@ -562,34 +380,133 @@ static void take(Polyline &pl1, Polyline &&pl2, const Points &contour, std::vect
pl1.points.reserve(pl1.points.size() + size_t(new_points) + pl2.points.size());
}
- contour_data[idx_start].point_consumed = true;
- contour_data[idx_start].segment_consumed = true;
- contour_data[idx_end ].point_consumed = true;
-
- if (reversed) {
- size_t i = (idx_end == 0) ? contour_data.size() - 1 : idx_end - 1;
- while (i != idx_start) {
- contour_data[i].point_consumed = true;
- contour_data[i].segment_consumed = true;
- pl1.points.emplace_back(contour[i]);
- if (i == 0)
- i = contour_data.size();
- -- i;
- }
- } else {
- size_t i = idx_start;
- if (++ i == contour_data.size())
- i = 0;
- while (i != idx_end) {
- contour_data[i].point_consumed = true;
- contour_data[i].segment_consumed = true;
- pl1.points.emplace_back(contour[i]);
- if (++ i == contour_data.size())
- i = 0;
- }
- }
+ if (clockwise)
+ take_cw_full(pl1, contour, idx_start, idx_end);
+ else
+ take_ccw_full(pl1, contour, idx_start, idx_end);
+
+ pl1.points.insert(pl1.points.end(), pl2.points.begin() + 1, pl2.points.end());
+}
- append(pl1.points, std::move(pl2.points));
+static void take(Polyline &pl1, const Polyline &pl2, const Points &contour, ContourIntersectionPoint *cp_start, ContourIntersectionPoint *cp_end, bool clockwise)
+{
+ assert(cp_start->prev_on_contour != nullptr);
+ assert(cp_start->next_on_contour != nullptr);
+ assert(cp_end ->prev_on_contour != nullptr);
+ assert(cp_end ->next_on_contour != nullptr);
+ assert(cp_start != cp_end);
+
+ take(pl1, pl2, contour, cp_start->point_idx, cp_end->point_idx, clockwise);
+
+ // Mark the contour segments in between cp_start and cp_end as consumed.
+ if (clockwise)
+ std::swap(cp_start, cp_end);
+ if (cp_start->next_on_contour != cp_end)
+ for (auto *cp = cp_start->next_on_contour; cp->next_on_contour != cp_end; cp = cp->next_on_contour) {
+ cp->consume_prev();
+ cp->consume_next();
+ }
+ cp_start->consume_next();
+ cp_end->consume_prev();
+}
+
+static void take_limited(
+ Polyline &pl1, const Points &contour, const std::vector<double> &params,
+ ContourIntersectionPoint *cp_start, ContourIntersectionPoint *cp_end, bool clockwise, double take_max_length, double line_half_width)
+{
+#ifndef NDEBUG
+ // This is a valid case, where a single infill line connect to two different contours (outer contour + hole or two holes).
+// assert(cp_start != cp_end);
+ assert(cp_start->prev_on_contour != nullptr);
+ assert(cp_start->next_on_contour != nullptr);
+ assert(cp_end ->prev_on_contour != nullptr);
+ assert(cp_end ->next_on_contour != nullptr);
+ assert(pl1.size() >= 2);
+ assert(contour.size() + 1 == params.size());
+#endif /* NDEBUG */
+
+ if (! (clockwise ? cp_start->could_take_prev() : cp_start->could_take_next()))
+ return;
+
+ assert(pl1.points.front() == contour[cp_start->point_idx] || pl1.points.back() == contour[cp_start->point_idx]);
+ bool add_at_start = pl1.points.front() == contour[cp_start->point_idx];
+ Points pl_tmp;
+ if (add_at_start) {
+ pl_tmp = std::move(pl1.points);
+ pl1.points.clear();
+ }
+
+ {
+ // Reserve memory at pl1 for the perimeter segment.
+ // Pessimizing - take the complete segment.
+ int new_points = int(cp_end->point_idx) - int(cp_start->point_idx) - 1;
+ if (new_points < 0)
+ new_points += int(contour.size());
+ pl1.points.reserve(pl1.points.size() + pl_tmp.size() + size_t(new_points));
+ }
+
+ double length = params.back();
+ double length_to_go = take_max_length;
+ cp_start->consumed = true;
+ if (cp_start == cp_end) {
+ length_to_go = std::max(0., std::min(length_to_go, length - line_half_width));
+ length_to_go = std::min(length_to_go, clockwise ? cp_start->contour_not_taken_length_prev : cp_start->contour_not_taken_length_next);
+ cp_start->consume_prev();
+ cp_start->consume_next();
+ if (length_to_go > SCALED_EPSILON)
+ clockwise ?
+ take_cw_limited (pl1, contour, params, cp_start->point_idx, cp_start->point_idx, length_to_go) :
+ take_ccw_limited(pl1, contour, params, cp_start->point_idx, cp_start->point_idx, length_to_go);
+ } else if (clockwise) {
+ // Going clockwise from cp_start to cp_end.
+ assert(cp_start != cp_end);
+ for (ContourIntersectionPoint *cp = cp_start; cp != cp_end; cp = cp->prev_on_contour) {
+ // Length of the segment from cp to cp->prev_on_contour.
+ double l = closed_contour_distance_cw(cp->param, cp->prev_on_contour->param, length);
+ length_to_go = std::min(length_to_go, cp->contour_not_taken_length_prev);
+ //if (cp->prev_on_contour->consumed)
+ // Don't overlap with an already extruded infill line.
+ length_to_go = std::max(0., std::min(length_to_go, l - line_half_width));
+ cp->consume_prev();
+ if (l >= length_to_go) {
+ if (length_to_go > SCALED_EPSILON) {
+ cp->prev_on_contour->trim_next(l - length_to_go);
+ take_cw_limited(pl1, contour, params, cp->point_idx, cp->prev_on_contour->point_idx, length_to_go);
+ }
+ break;
+ } else {
+ cp->prev_on_contour->trim_next(0.);
+ take_cw_full(pl1, contour, cp->point_idx, cp->prev_on_contour->point_idx);
+ length_to_go -= l;
+ }
+ }
+ } else {
+ assert(cp_start != cp_end);
+ for (ContourIntersectionPoint *cp = cp_start; cp != cp_end; cp = cp->next_on_contour) {
+ double l = closed_contour_distance_ccw(cp->param, cp->next_on_contour->param, length);
+ length_to_go = std::min(length_to_go, cp->contour_not_taken_length_next);
+ //if (cp->next_on_contour->consumed)
+ // Don't overlap with an already extruded infill line.
+ length_to_go = std::max(0., std::min(length_to_go, l - line_half_width));
+ cp->consume_next();
+ if (l >= length_to_go) {
+ if (length_to_go > SCALED_EPSILON) {
+ cp->next_on_contour->trim_prev(l - length_to_go);
+ take_ccw_limited(pl1, contour, params, cp->point_idx, cp->next_on_contour->point_idx, length_to_go);
+ }
+ break;
+ } else {
+ cp->next_on_contour->trim_prev(0.);
+ take_ccw_full(pl1, contour, cp->point_idx, cp->next_on_contour->point_idx);
+ length_to_go -= l;
+ }
+ }
+ }
+
+ if (add_at_start) {
+ pl1.reverse();
+ append(pl1.points, pl_tmp);
+ }
}
// Return an index of start of a segment and a point of the clipping point at distance from the end of polyline.
@@ -611,17 +528,17 @@ static inline SegmentPoint clip_start_segment_and_point(const Points &polyline,
SegmentPoint out;
if (polyline.size() >= 2) {
Vec2d pt_prev = polyline.front().cast<double>();
- for (int i = 1; i < polyline.size(); ++ i) {
+ for (size_t i = 1; i < polyline.size(); ++ i) {
Vec2d pt = polyline[i].cast<double>();
Vec2d v = pt - pt_prev;
- double l2 = v.squaredNorm();
- if (l2 > distance * distance) {
- out.idx_segment = i;
- out.t = distance / sqrt(l2);
+ double l = v.norm();
+ if (l > distance) {
+ out.idx_segment = i - 1;
+ out.t = distance / l;
out.point = pt_prev + out.t * v;
break;
}
- distance -= sqrt(l2);
+ distance -= l;
pt_prev = pt;
}
}
@@ -639,86 +556,333 @@ static inline SegmentPoint clip_end_segment_and_point(const Points &polyline, do
for (int i = int(polyline.size()) - 2; i >= 0; -- i) {
Vec2d pt = polyline[i].cast<double>();
Vec2d v = pt - pt_next;
- double l2 = v.squaredNorm();
- if (l2 > distance * distance) {
+ double l = v.norm();
+ if (l > distance) {
out.idx_segment = i;
- out.t = distance / sqrt(l2);
+ out.t = distance / l;
out.point = pt_next + out.t * v;
// Store the parameter referenced to the starting point of a segment.
out.t = 1. - out.t;
break;
}
- distance -= sqrt(l2);
+ distance -= l;
pt_next = pt;
}
}
return out;
}
-// Optimized version with the precalculated v1 = p1b - p1a and l1_2 = v1.squaredNorm().
-// Assumption: l1_2 < EPSILON.
-static inline double segment_point_distance_squared(const Vec2d &p1a, const Vec2d &p1b, const Vec2d &v1, const double l1_2, const Vec2d &p2)
+// Calculate intersection of a line with a thick segment.
+// Returns Eucledian parameters of the line / thick segment overlap.
+static inline bool line_rounded_thick_segment_collision(
+ const Vec2d &line_a, const Vec2d &line_b,
+ const Vec2d &segment_a, const Vec2d &segment_b, const double offset,
+ std::pair<double, double> &out_interval)
{
- assert(l1_2 > EPSILON);
- Vec2d v12 = p2 - p1a;
- double t = v12.dot(v1);
- return (t <= 0. ) ? v12.squaredNorm() :
- (t >= l1_2) ? (p2 - p1a).squaredNorm() :
- ((t / l1_2) * v1 - v12).squaredNorm();
+ const Vec2d line_v0 = line_b - line_a;
+ double lv = line_v0.squaredNorm();
+
+ const Vec2d segment_v = segment_b - segment_a;
+ const double segment_l = segment_v.norm();
+ const double offset2 = offset * offset;
+
+ bool intersects = false;
+ if (lv < SCALED_EPSILON * SCALED_EPSILON)
+ {
+ // Very short line vector. Just test whether the center point is inside the offset line.
+ Vec2d lpt = 0.5 * (line_a + line_b);
+ if (segment_l > SCALED_EPSILON) {
+ struct Linef { Vec2d a, b; };
+ intersects = line_alg::distance_to_squared(Linef{ segment_a, segment_b }, lpt) < offset2;
+ } else
+ intersects = (0.5 * (segment_a + segment_b) - lpt).squaredNorm() < offset2;
+ if (intersects) {
+ out_interval.first = 0.;
+ out_interval.second = sqrt(lv);
+ }
+ }
+ else
+ {
+ // Output interval.
+ double tmin = std::numeric_limits<double>::max();
+ double tmax = -tmin;
+ auto extend_interval = [&tmin, &tmax](double atmin, double atmax) {
+ tmin = std::min(tmin, atmin);
+ tmax = std::max(tmax, atmax);
+ };
+
+ // Intersections with the inflated segment end points.
+ auto ray_circle_intersection_interval_extend = [&extend_interval, &line_v0](const Vec2d &segment_pt, const double offset2, const Vec2d &line_pt, const Vec2d &line_vec) {
+ std::pair<Vec2d, Vec2d> pts;
+ Vec2d p0 = line_pt - segment_pt;
+ double c = - line_pt.dot(p0);
+ if (Geometry::ray_circle_intersections_r2_lv2_c(offset2, line_vec.x(), line_vec.y(), line_vec.squaredNorm(), c, pts)) {
+ double tmin = (pts.first - p0).dot(line_v0);
+ double tmax = (pts.second - p0).dot(line_v0);
+ if (tmin > tmax)
+ std::swap(tmin, tmax);
+ tmin = std::max(tmin, 0.);
+ tmax = std::min(tmax, 1.);
+ if (tmin <= tmax)
+ extend_interval(tmin, tmax);
+ }
+ };
+
+ // Intersections with the inflated segment.
+ if (segment_l > SCALED_EPSILON) {
+ ray_circle_intersection_interval_extend(segment_a, offset2, line_a, line_v0);
+ ray_circle_intersection_interval_extend(segment_b, offset2, line_a, line_v0);
+ // Clip the line segment transformed into a coordinate space of the segment,
+ // where the segment spans (0, 0) to (segment_l, 0).
+ const Vec2d dir_x = segment_v / segment_l;
+ const Vec2d dir_y(- dir_x.y(), dir_x.x());
+ const Vec2d line_p0(line_a - segment_a);
+ std::pair<double, double> interval;
+ if (Geometry::liang_barsky_line_clipping_interval(
+ Vec2d(line_p0.dot(dir_x), line_p0.dot(dir_y)),
+ Vec2d(line_v0.dot(dir_x), line_v0.dot(dir_y)),
+ BoundingBoxf(Vec2d(0., - offset), Vec2d(segment_l, offset)),
+ interval))
+ extend_interval(interval.first, interval.second);
+ } else
+ ray_circle_intersection_interval_extend(0.5 * (segment_a + segment_b), offset, line_a, line_v0);
+
+ intersects = tmin <= tmax;
+ if (intersects) {
+ lv = sqrt(lv);
+ out_interval.first = tmin * lv;
+ out_interval.second = tmax * lv;
+ }
+ }
+
+#if 0
+ {
+ BoundingBox bbox;
+ bbox.merge(line_a.cast<coord_t>());
+ bbox.merge(line_a.cast<coord_t>());
+ bbox.merge(segment_a.cast<coord_t>());
+ bbox.merge(segment_b.cast<coord_t>());
+ static int iRun = 0;
+ ::Slic3r::SVG svg(debug_out_path("%s-%03d.svg", "line-thick-segment-intersect", iRun ++), bbox);
+ svg.draw(Line(line_a.cast<coord_t>(), line_b.cast<coord_t>()), "black");
+ svg.draw(Line(segment_a.cast<coord_t>(), segment_b.cast<coord_t>()), "blue", offset * 2.);
+ svg.draw(segment_a.cast<coord_t>(), "blue", offset);
+ svg.draw(segment_b.cast<coord_t>(), "blue", offset);
+ svg.draw(Line(segment_a.cast<coord_t>(), segment_b.cast<coord_t>()), "black");
+ if (intersects)
+ svg.draw(Line((line_a + (line_b - line_a).normalized() * out_interval.first).cast<coord_t>(),
+ (line_a + (line_b - line_a).normalized() * out_interval.second).cast<coord_t>()), "red");
+ }
+#endif
+
+ return intersects;
}
-static inline double segment_point_distance_squared(const Vec2d &p1a, const Vec2d &p1b, const Vec2d &p2)
+static inline bool inside_interval(double low, double high, double p)
{
- const Vec2d v = p1b - p1a;
- const double l2 = v.squaredNorm();
- if (l2 < EPSILON)
- // p1a == p1b
- return (p2 - p1a).squaredNorm();
- return segment_point_distance_squared(p1a, p1b, v, v.squaredNorm(), p2);
+ return p >= low && p <= high;
}
-// Distance to the closest point of line.
-static inline double min_distance_of_segments(const Vec2d &p1a, const Vec2d &p1b, const Vec2d &p2a, const Vec2d &p2b)
+static inline bool interval_inside_interval(double outer_low, double outer_high, double inner_low, double inner_high, double epsilon)
{
- Vec2d v1 = p1b - p1a;
- double l1_2 = v1.squaredNorm();
- if (l1_2 < EPSILON)
- // p1a == p1b: Return distance of p1a from the (p2a, p2b) segment.
- return segment_point_distance_squared(p2a, p2b, p1a);
-
- Vec2d v2 = p2b - p2a;
- double l2_2 = v2.squaredNorm();
- if (l2_2 < EPSILON)
- // p2a == p2b: Return distance of p2a from the (p1a, p1b) segment.
- return segment_point_distance_squared(p1a, p1b, v1, l1_2, p2a);
-
- return std::min(
- std::min(segment_point_distance_squared(p1a, p1b, v1, l1_2, p2a), segment_point_distance_squared(p1a, p1b, v1, l1_2, p2b)),
- std::min(segment_point_distance_squared(p2a, p2b, v2, l2_2, p1a), segment_point_distance_squared(p2a, p2b, v2, l2_2, p1b)));
+ outer_low -= epsilon;
+ outer_high += epsilon;
+ return inside_interval(outer_low, outer_high, inner_low) && inside_interval(outer_low, outer_high, inner_high);
}
+static inline bool cyclic_interval_inside_interval(double outer_low, double outer_high, double inner_low, double inner_high, double length)
+{
+ if (outer_low > outer_high)
+ outer_high += length;
+ if (inner_low > inner_high)
+ inner_high += length;
+ else if (inner_high < outer_low) {
+ inner_low += length;
+ inner_high += length;
+ }
+ return interval_inside_interval(outer_low, outer_high, inner_low, inner_high, double(SCALED_EPSILON));
+}
+
+// #define INFILL_DEBUG_OUTPUT
+
+#ifdef INFILL_DEBUG_OUTPUT
+static void export_infill_to_svg(
+ // Boundary contour, along which the perimeter extrusions will be drawn.
+ const std::vector<Points> &boundary,
+ // Parametrization of boundary with Euclidian length.
+ const std::vector<std::vector<double>> &boundary_parameters,
+ // Intersections (T-joints) of the infill lines with the boundary.
+ std::vector<std::vector<ContourIntersectionPoint*>> &boundary_intersections,
+ // Infill lines, either completely inside the boundary, or touching the boundary.
+ const Polylines &infill,
+ const coord_t scaled_spacing,
+ const std::string &path,
+ const Polylines &overlap_lines = Polylines(),
+ const Polylines &polylines = Polylines(),
+ const Points &pts = Points())
+{
+ Polygons polygons;
+ std::transform(boundary.begin(), boundary.end(), std::back_inserter(polygons), [](auto &pts) { return Polygon(pts); });
+ ExPolygons expolygons = union_ex(polygons);
+ BoundingBox bbox = get_extents(polygons);
+ bbox.offset(scale_(3.));
+
+ ::Slic3r::SVG svg(path, bbox);
+ // Draw the filled infill polygons.
+ svg.draw(expolygons);
+
+ // Draw the pieces of boundary allowed to be used as anchors of infill lines, not yet consumed.
+ const std::string color_boundary_trimmed = "blue";
+ const std::string color_boundary_not_trimmed = "yellow";
+ const coordf_t boundary_line_width = scaled_spacing;
+ svg.draw_outline(polygons, "red", boundary_line_width);
+ for (const std::vector<ContourIntersectionPoint*> &intersections : boundary_intersections) {
+ const size_t boundary_idx = &intersections - boundary_intersections.data();
+ const Points &contour = boundary[boundary_idx];
+ const std::vector<double> &contour_param = boundary_parameters[boundary_idx];
+ for (const ContourIntersectionPoint *ip : intersections) {
+ assert(ip->next_trimmed == ip->next_on_contour->prev_trimmed);
+ assert(ip->prev_trimmed == ip->prev_on_contour->next_trimmed);
+ {
+ Polyline pl { contour[ip->point_idx] };
+ if (ip->next_trimmed) {
+ if (ip->contour_not_taken_length_next > SCALED_EPSILON) {
+ take_ccw_limited(pl, contour, contour_param, ip->point_idx, ip->next_on_contour->point_idx, ip->contour_not_taken_length_next);
+ svg.draw(pl, color_boundary_trimmed, boundary_line_width);
+ }
+ } else {
+ take_ccw_full(pl, contour, ip->point_idx, ip->next_on_contour->point_idx);
+ svg.draw(pl, color_boundary_not_trimmed, boundary_line_width);
+ }
+ }
+ {
+ Polyline pl { contour[ip->point_idx] };
+ if (ip->prev_trimmed) {
+ if (ip->contour_not_taken_length_prev > SCALED_EPSILON) {
+ take_cw_limited(pl, contour, contour_param, ip->point_idx, ip->prev_on_contour->point_idx, ip->contour_not_taken_length_prev);
+ svg.draw(pl, color_boundary_trimmed, boundary_line_width);
+ }
+ } else {
+ take_cw_full(pl, contour, ip->point_idx, ip->prev_on_contour->point_idx);
+ svg.draw(pl, color_boundary_not_trimmed, boundary_line_width);
+ }
+ }
+ }
+ }
+
+ // Draw the full infill polygon boundary.
+ svg.draw_outline(polygons, "green");
+
+ // Draw the infill lines, first the full length with red color, then a slightly shortened length with black color.
+ svg.draw(infill, "brown");
+ static constexpr double trim_length = scale_(0.15);
+ for (Polyline polyline : infill)
+ if (! polyline.empty()) {
+ Vec2d a = polyline.points.front().cast<double>();
+ Vec2d d = polyline.points.back().cast<double>();
+ if (polyline.size() == 2) {
+ Vec2d v = d - a;
+ double l = v.norm();
+ if (l > 2. * trim_length) {
+ a += v * trim_length / l;
+ d -= v * trim_length / l;
+ polyline.points.front() = a.cast<coord_t>();
+ polyline.points.back() = d.cast<coord_t>();
+ } else
+ polyline.points.clear();
+ } else if (polyline.size() > 2) {
+ Vec2d b = polyline.points[1].cast<double>();
+ Vec2d c = polyline.points[polyline.points.size() - 2].cast<double>();
+ Vec2d v = b - a;
+ double l = v.norm();
+ if (l > trim_length) {
+ a += v * trim_length / l;
+ polyline.points.front() = a.cast<coord_t>();
+ } else
+ polyline.points.erase(polyline.points.begin());
+ v = d - c;
+ l = v.norm();
+ if (l > trim_length)
+ polyline.points.back() = (d - v * trim_length / l).cast<coord_t>();
+ else
+ polyline.points.pop_back();
+ }
+ svg.draw(polyline, "black");
+ }
+
+ svg.draw(overlap_lines, "red", scale_(0.05));
+ svg.draw(polylines, "magenta", scale_(0.05));
+ svg.draw(pts, "magenta");
+}
+#endif // INFILL_DEBUG_OUTPUT
+
+#ifndef NDEBUG
+bool validate_boundary_intersections(const std::vector<std::vector<ContourIntersectionPoint*>> &boundary_intersections)
+{
+ for (const std::vector<ContourIntersectionPoint*>& contour : boundary_intersections) {
+ for (ContourIntersectionPoint* ip : contour) {
+ assert(ip->next_trimmed == ip->next_on_contour->prev_trimmed);
+ assert(ip->prev_trimmed == ip->prev_on_contour->next_trimmed);
+ }
+ }
+ return true;
+}
+#endif // NDEBUG
+
// Mark the segments of split boundary as consumed if they are very close to some of the infill line.
void mark_boundary_segments_touching_infill(
- const std::vector<Points> &boundary,
- std::vector<std::vector<ContourPointData>> &boundary_data,
- const BoundingBox &boundary_bbox,
- const Polylines &infill,
- const double clip_distance,
- const double distance_colliding)
+ // Boundary contour, along which the perimeter extrusions will be drawn.
+ const std::vector<Points> &boundary,
+ // Parametrization of boundary with Euclidian length.
+ const std::vector<std::vector<double>> &boundary_parameters,
+ // Intersections (T-joints) of the infill lines with the boundary.
+ std::vector<std::vector<ContourIntersectionPoint*>> &boundary_intersections,
+ // Bounding box around the boundary.
+ const BoundingBox &boundary_bbox,
+ // Infill lines, either completely inside the boundary, or touching the boundary.
+ const Polylines &infill,
+ // How much of the infill ends should be ignored when marking the boundary segments?
+ const double clip_distance,
+ // Roughly width of the infill line.
+ const double distance_colliding)
{
+ assert(boundary.size() == boundary_parameters.size());
+#ifndef NDEBUG
+ for (size_t i = 0; i < boundary.size(); ++ i)
+ assert(boundary[i].size() + 1 == boundary_parameters[i].size());
+ assert(validate_boundary_intersections(boundary_intersections));
+#endif
+
+#ifdef INFILL_DEBUG_OUTPUT
+ static int iRun = 0;
+ ++ iRun;
+ int iStep = 0;
+ export_infill_to_svg(boundary, boundary_parameters, boundary_intersections, infill, distance_colliding * 2, debug_out_path("%s-%03d.svg", "FillBase-mark_boundary_segments_touching_infill-start", iRun));
+ Polylines perimeter_overlaps;
+#endif // INFILL_DEBUG_OUTPUT
+
EdgeGrid::Grid grid;
- grid.set_bbox(boundary_bbox);
+ // Make sure that the the grid is big enough for queries against the thick segment.
+ grid.set_bbox(boundary_bbox.inflated(distance_colliding * 1.43));
// Inflate the bounding box by a thick line width.
- grid.create(boundary, clip_distance + scale_(10.));
+ grid.create(boundary, coord_t(std::max(clip_distance, distance_colliding) + scale_(10.)));
+ // Visitor for the EdgeGrid to trim boundary_intersections with existing infill lines.
struct Visitor {
- Visitor(const EdgeGrid::Grid &grid, const std::vector<Points> &boundary, std::vector<std::vector<ContourPointData>> &boundary_data, const double dist2_max) :
- grid(grid), boundary(boundary), boundary_data(boundary_data), dist2_max(dist2_max) {}
-
- void init(const Vec2d &pt1, const Vec2d &pt2) {
- this->pt1 = &pt1;
- this->pt2 = &pt2;
- }
+ Visitor(const EdgeGrid::Grid &grid,
+ const std::vector<Points> &boundary, const std::vector<std::vector<double>> &boundary_parameters, std::vector<std::vector<ContourIntersectionPoint*>> &boundary_intersections,
+ const double radius) :
+ grid(grid), boundary(boundary), boundary_parameters(boundary_parameters), boundary_intersections(boundary_intersections), radius(radius), trim_l_threshold(0.5 * radius) {}
+
+ // Init with a segment of an infill line.
+ void init(const Vec2d &infill_pt1, const Vec2d &infill_pt2) {
+ this->infill_pt1 = &infill_pt1;
+ this->infill_pt2 = &infill_pt2;
+ this->infill_bbox.reset();
+ this->infill_bbox.merge(infill_pt1);
+ this->infill_bbox.merge(infill_pt2);
+ this->infill_bbox.offset(this->radius + SCALED_EPSILON);
+ }
bool operator()(coord_t iy, coord_t ix) {
// Called with a row and colum of the grid cell, which is intersected by a line.
@@ -726,56 +890,123 @@ void mark_boundary_segments_touching_infill(
for (auto it_contour_and_segment = cell_data_range.first; it_contour_and_segment != cell_data_range.second; ++ it_contour_and_segment) {
// End points of the line segment and their vector.
auto segment = this->grid.segment(*it_contour_and_segment);
+ std::vector<ContourIntersectionPoint*> &intersections = boundary_intersections[it_contour_and_segment->first];
+ if (intersections.empty())
+ // There is no infil line touching this contour, thus effort will be saved to calculate overlap with other infill lines.
+ continue;
const Vec2d seg_pt1 = segment.first.cast<double>();
const Vec2d seg_pt2 = segment.second.cast<double>();
- if (min_distance_of_segments(seg_pt1, seg_pt2, *this->pt1, *this->pt2) < this->dist2_max) {
- // Mark this boundary segment as touching the infill line.
- ContourPointData &bdp = boundary_data[it_contour_and_segment->first][it_contour_and_segment->second];
- bdp.segment_consumed = true;
- // There is no need for checking seg_pt2 as it will be checked the next time.
- bool point_touching = false;
- if (segment_point_distance_squared(*this->pt1, *this->pt2, seg_pt1) < this->dist2_max) {
- point_touching = true;
- bdp.point_consumed = true;
- }
-#if 0
+ std::pair<double, double> interval;
+ BoundingBoxf bbox_seg;
+ bbox_seg.merge(seg_pt1);
+ bbox_seg.merge(seg_pt2);
+#ifdef INFILL_DEBUG_OUTPUT
+ //if (this->infill_bbox.overlap(bbox_seg)) this->perimeter_overlaps.push_back({ segment.first, segment.second });
+#endif // INFILL_DEBUG_OUTPUT
+ if (this->infill_bbox.overlap(bbox_seg) && line_rounded_thick_segment_collision(seg_pt1, seg_pt2, *this->infill_pt1, *this->infill_pt2, this->radius, interval)) {
+ // The boundary segment intersects with the infill segment thickened by radius.
+ // Interval is specified in Euclidian length from seg_pt1 to seg_pt2.
+ // 1) Find the Euclidian parameters of seg_pt1 and seg_pt2 on its boundary contour.
+ const std::vector<double> &contour_parameters = boundary_parameters[it_contour_and_segment->first];
+ const double contour_length = contour_parameters.back();
+ const double param_seg_pt1 = contour_parameters[it_contour_and_segment->second];
+ const double param_seg_pt2 = contour_parameters[it_contour_and_segment->second + 1];
+#ifdef INFILL_DEBUG_OUTPUT
+ this->perimeter_overlaps.push_back({ Point((seg_pt1 + (seg_pt2 - seg_pt1).normalized() * interval.first).cast<coord_t>()),
+ Point((seg_pt1 + (seg_pt2 - seg_pt1).normalized() * interval.second).cast<coord_t>()) });
+#endif // INFILL_DEBUG_OUTPUT
+ assert(interval.first >= 0.);
+ assert(interval.second >= 0.);
+ assert(interval.first <= interval.second);
+ const auto param_overlap1 = std::min(param_seg_pt2, param_seg_pt1 + interval.first);
+ const auto param_overlap2 = std::min(param_seg_pt2, param_seg_pt1 + interval.second);
+ // 2) Find the ContourIntersectionPoints before param_overlap1 and after param_overlap2.
+ // Find the span of ContourIntersectionPoints, that is trimmed by the interval (param_overlap1, param_overlap2).
+ ContourIntersectionPoint *ip_low, *ip_high;
+ if (intersections.size() == 1) {
+ // Only a single infill line touches this contour.
+ ip_low = ip_high = intersections.front();
+ } else {
+ assert(intersections.size() > 1);
+ auto it_low = Slic3r::lower_bound_by_predicate(intersections.begin(), intersections.end(), [param_overlap1](const ContourIntersectionPoint *l) { return l->param < param_overlap1; });
+ auto it_high = Slic3r::lower_bound_by_predicate(intersections.begin(), intersections.end(), [param_overlap2](const ContourIntersectionPoint *l) { return l->param < param_overlap2; });
+ ip_low = it_low == intersections.end() ? intersections.front() : *it_low;
+ ip_high = it_high == intersections.end() ? intersections.front() : *it_high;
+ if (ip_low->param != param_overlap1)
+ ip_low = ip_low->prev_on_contour;
+ assert(ip_low != ip_high);
+ // Verify that the interval (param_overlap1, param_overlap2) is inside the interval (ip_low->param, ip_high->param).
+ assert(cyclic_interval_inside_interval(ip_low->param, ip_high->param, param_overlap1, param_overlap2, contour_length));
+ }
+ assert(validate_boundary_intersections(boundary_intersections));
+ // Mark all ContourIntersectionPoints between ip_low and ip_high as consumed.
+ if (ip_low->next_on_contour != ip_high)
+ for (ContourIntersectionPoint *ip = ip_low->next_on_contour; ip != ip_high; ip = ip->next_on_contour) {
+ ip->consume_prev();
+ ip->consume_next();
+ }
+ // Subtract the interval from the first and last segments.
+ double trim_l = closed_contour_distance_ccw(ip_low->param, param_overlap1, contour_length);
+ //if (trim_l > trim_l_threshold)
+ ip_low->trim_next(trim_l);
+ trim_l = closed_contour_distance_ccw(param_overlap2, ip_high->param, contour_length);
+ //if (trim_l > trim_l_threshold)
+ ip_high->trim_prev(trim_l);
+ assert(ip_low->next_trimmed == ip_high->prev_trimmed);
+ assert(validate_boundary_intersections(boundary_intersections));
+ //FIXME mark point as consumed?
+ //FIXME verify the sequence between prev and next?
+#ifdef INFILL_DEBUG_OUTPUT
{
- static size_t iRun = 0;
+#if 0
+ static size_t iRun = 0;
ExPolygon expoly(Polygon(*grid.contours().front()));
for (size_t i = 1; i < grid.contours().size(); ++i)
expoly.holes.emplace_back(Polygon(*grid.contours()[i]));
SVG svg(debug_out_path("%s-%d.svg", "FillBase-mark_boundary_segments_touching_infill", iRun ++).c_str(), get_extents(expoly));
svg.draw(expoly, "green");
svg.draw(Line(segment.first, segment.second), "red");
- svg.draw(Line(this->pt1->cast<coord_t>(), this->pt2->cast<coord_t>()), "magenta");
- }
+ svg.draw(Line(this->infill_pt1->cast<coord_t>(), this->infill_pt2->cast<coord_t>()), "magenta");
#endif
+ }
+#endif // INFILL_DEBUG_OUTPUT
}
}
// Continue traversing the grid along the edge.
return true;
}
- const EdgeGrid::Grid &grid;
- const std::vector<Points> &boundary;
- std::vector<std::vector<ContourPointData>> &boundary_data;
+ const EdgeGrid::Grid &grid;
+ const std::vector<Points> &boundary;
+ const std::vector<std::vector<double>> &boundary_parameters;
+ std::vector<std::vector<ContourIntersectionPoint*>> &boundary_intersections;
// Maximum distance between the boundary and the infill line allowed to consider the boundary not touching the infill line.
- const double dist2_max;
+ const double radius;
+ // Region around the contour / infill line intersection point, where the intersections are ignored.
+ const double trim_l_threshold;
- const Vec2d *pt1;
- const Vec2d *pt2;
- } visitor(grid, boundary, boundary_data, distance_colliding * distance_colliding);
+ const Vec2d *infill_pt1;
+ const Vec2d *infill_pt2;
+ BoundingBoxf infill_bbox;
- BoundingBoxf bboxf(boundary_bbox.min.cast<double>(), boundary_bbox.max.cast<double>());
- bboxf.offset(- SCALED_EPSILON);
+#ifdef INFILL_DEBUG_OUTPUT
+ Polylines perimeter_overlaps;
+#endif // INFILL_DEBUG_OUTPUT
+ } visitor(grid, boundary, boundary_parameters, boundary_intersections, distance_colliding);
for (const Polyline &polyline : infill) {
+#ifdef INFILL_DEBUG_OUTPUT
+ ++ iStep;
+#endif // INFILL_DEBUG_OUTPUT
// Clip the infill polyline by the Eucledian distance along the polyline.
SegmentPoint start_point = clip_start_segment_and_point(polyline.points, clip_distance);
SegmentPoint end_point = clip_end_segment_and_point(polyline.points, clip_distance);
if (start_point.valid() && end_point.valid() &&
(start_point.idx_segment < end_point.idx_segment || (start_point.idx_segment == end_point.idx_segment && start_point.t < end_point.t))) {
// The clipped polyline is non-empty.
+#ifdef INFILL_DEBUG_OUTPUT
+ visitor.perimeter_overlaps.clear();
+#endif // INFILL_DEBUG_OUTPUT
for (size_t point_idx = start_point.idx_segment; point_idx <= end_point.idx_segment; ++ point_idx) {
//FIXME extend the EdgeGrid to suport tracing a thick line.
#if 0
@@ -815,51 +1046,93 @@ void mark_boundary_segments_touching_infill(
visitor.init(pt1, pt2);
// Simulate tracing of a thick line. This only works reliably if distance_colliding <= grid cell size.
Vec2d v = (pt2 - pt1).normalized() * distance_colliding;
- Vec2d vperp(-v.y(), v.x());
+ Vec2d vperp = perp(v);
Vec2d a = pt1 - v - vperp;
- Vec2d b = pt1 + v - vperp;
- if (Geometry::liang_barsky_line_clipping(a, b, bboxf))
- grid.visit_cells_intersecting_line(a.cast<coord_t>(), b.cast<coord_t>(), visitor);
+ Vec2d b = pt2 + v - vperp;
+ assert(grid.bbox().contains(a.cast<coord_t>()));
+ assert(grid.bbox().contains(b.cast<coord_t>()));
+ grid.visit_cells_intersecting_line(a.cast<coord_t>(), b.cast<coord_t>(), visitor);
a = pt1 - v + vperp;
- b = pt1 + v + vperp;
- if (Geometry::liang_barsky_line_clipping(a, b, bboxf))
- grid.visit_cells_intersecting_line(a.cast<coord_t>(), b.cast<coord_t>(), visitor);
+ b = pt2 + v + vperp;
+ assert(grid.bbox().contains(a.cast<coord_t>()));
+ assert(grid.bbox().contains(b.cast<coord_t>()));
+ grid.visit_cells_intersecting_line(a.cast<coord_t>(), b.cast<coord_t>(), visitor);
#endif
+#ifdef INFILL_DEBUG_OUTPUT
+// export_infill_to_svg(boundary, boundary_parameters, boundary_intersections, infill, distance_colliding * 2, debug_out_path("%s-%03d-%03d-%03d.svg", "FillBase-mark_boundary_segments_touching_infill-step", iRun, iStep, int(point_idx)), { polyline });
+#endif // INFILL_DEBUG_OUTPUT
}
- }
+#ifdef INFILL_DEBUG_OUTPUT
+ Polylines perimeter_overlaps;
+ export_infill_to_svg(boundary, boundary_parameters, boundary_intersections, infill, distance_colliding * 2, debug_out_path("%s-%03d-%03d.svg", "FillBase-mark_boundary_segments_touching_infill-step", iRun, iStep), visitor.perimeter_overlaps, { polyline });
+ append(perimeter_overlaps, std::move(visitor.perimeter_overlaps));
+ perimeter_overlaps.clear();
+#endif // INFILL_DEBUG_OUTPUT
+ }
}
+
+#ifdef INFILL_DEBUG_OUTPUT
+ export_infill_to_svg(boundary, boundary_parameters, boundary_intersections, infill, distance_colliding * 2, debug_out_path("%s-%03d.svg", "FillBase-mark_boundary_segments_touching_infill-end", iRun), perimeter_overlaps);
+#endif // INFILL_DEBUG_OUTPUT
+ assert(validate_boundary_intersections(boundary_intersections));
}
void Fill::connect_infill(Polylines &&infill_ordered, const ExPolygon &boundary_src, Polylines &polylines_out, const double spacing, const FillParams &params)
{
- assert(! infill_ordered.empty());
assert(! boundary_src.contour.points.empty());
+ auto polygons_src = reserve_vector<const Polygon*>(boundary_src.holes.size() + 1);
+ polygons_src.emplace_back(&boundary_src.contour);
+ for (const Polygon &polygon : boundary_src.holes)
+ polygons_src.emplace_back(&polygon);
+
+ connect_infill(std::move(infill_ordered), polygons_src, get_extents(boundary_src.contour), polylines_out, spacing, params);
+}
+
+void Fill::connect_infill(Polylines &&infill_ordered, const Polygons &boundary_src, const BoundingBox &bbox, Polylines &polylines_out, const double spacing, const FillParams &params)
+{
+ auto polygons_src = reserve_vector<const Polygon*>(boundary_src.size());
+ for (const Polygon &polygon : boundary_src)
+ polygons_src.emplace_back(&polygon);
+
+ connect_infill(std::move(infill_ordered), polygons_src, bbox, polylines_out, spacing, params);
+}
- BoundingBox bbox = get_extents(boundary_src.contour);
- bbox.offset(SCALED_EPSILON);
+void Fill::connect_infill(Polylines &&infill_ordered, const std::vector<const Polygon*> &boundary_src, const BoundingBox &bbox, Polylines &polylines_out, const double spacing, const FillParams &params)
+{
+ assert(! infill_ordered.empty());
+ assert(params.anchor_length >= 0.);
+ assert(params.anchor_length_max >= 0.01f);
+ assert(params.anchor_length_max >= params.anchor_length);
+ const double anchor_length = scale_(params.anchor_length);
+ const double anchor_length_max = scale_(params.anchor_length_max);
+
+#if 0
+ append(polylines_out, infill_ordered);
+ return;
+#endif
// 1) Add the end points of infill_ordered to boundary_src.
- std::vector<Points> boundary;
- std::vector<std::vector<ContourPointData>> boundary_data;
- boundary.assign(boundary_src.holes.size() + 1, Points());
- boundary_data.assign(boundary_src.holes.size() + 1, std::vector<ContourPointData>());
+ std::vector<Points> boundary;
+ std::vector<std::vector<double>> boundary_params;
+ boundary.assign(boundary_src.size(), Points());
+ boundary_params.assign(boundary_src.size(), std::vector<double>());
// Mapping the infill_ordered end point to a (contour, point) of boundary.
- std::vector<std::pair<size_t, size_t>> map_infill_end_point_to_boundary;
- map_infill_end_point_to_boundary.assign(infill_ordered.size() * 2, std::pair<size_t, size_t>(std::numeric_limits<size_t>::max(), std::numeric_limits<size_t>::max()));
+ static constexpr auto boundary_idx_unconnected = std::numeric_limits<size_t>::max();
+ std::vector<ContourIntersectionPoint> map_infill_end_point_to_boundary(infill_ordered.size() * 2, ContourIntersectionPoint{ boundary_idx_unconnected, boundary_idx_unconnected });
{
// Project the infill_ordered end points onto boundary_src.
std::vector<std::pair<EdgeGrid::Grid::ClosestPointResult, size_t>> intersection_points;
{
EdgeGrid::Grid grid;
- grid.set_bbox(bbox);
- grid.create(boundary_src, scale_(10.));
+ grid.set_bbox(bbox.inflated(SCALED_EPSILON));
+ grid.create(boundary_src, coord_t(scale_(10.)));
intersection_points.reserve(infill_ordered.size() * 2);
for (const Polyline &pl : infill_ordered)
for (const Point *pt : { &pl.points.front(), &pl.points.back() }) {
- EdgeGrid::Grid::ClosestPointResult cp = grid.closest_point(*pt, SCALED_EPSILON);
+ EdgeGrid::Grid::ClosestPointResult cp = grid.closest_point(*pt, coord_t(SCALED_EPSILON));
if (cp.valid()) {
// The infill end point shall lie on the contour.
- assert(cp.distance < 2.);
+ assert(cp.distance <= 3.);
intersection_points.emplace_back(cp, (&pl - infill_ordered.data()) * 2 + (pt == &pl.points.front() ? 0 : 1));
}
}
@@ -872,53 +1145,113 @@ void Fill::connect_infill(Polylines &&infill_ordered, const ExPolygon &boundary_
}
auto it = intersection_points.begin();
auto it_end = intersection_points.end();
- for (size_t idx_contour = 0; idx_contour <= boundary_src.holes.size(); ++ idx_contour) {
- const Polygon &contour_src = (idx_contour == 0) ? boundary_src.contour : boundary_src.holes[idx_contour - 1];
+ std::vector<std::vector<ContourIntersectionPoint*>> boundary_intersection_points(boundary.size(), std::vector<ContourIntersectionPoint*>());
+ for (size_t idx_contour = 0; idx_contour < boundary_src.size(); ++ idx_contour) {
+ // Copy contour_src to contour_dst while adding intersection points.
+ // Map infill end points map_infill_end_point_to_boundary to the newly inserted boundary points of contour_dst.
+ // chain the points of map_infill_end_point_to_boundary along their respective contours.
+ const Polygon &contour_src = *boundary_src[idx_contour];
Points &contour_dst = boundary[idx_contour];
+ std::vector<ContourIntersectionPoint*> &contour_intersection_points = boundary_intersection_points[idx_contour];
+ ContourIntersectionPoint *pfirst = nullptr;
+ ContourIntersectionPoint *pprev = nullptr;
+ {
+ // Reserve intersection points.
+ size_t n_intersection_points = 0;
+ for (auto itx = it; itx != it_end && itx->first.contour_idx == idx_contour; ++ itx)
+ ++ n_intersection_points;
+ contour_intersection_points.reserve(n_intersection_points);
+ }
for (size_t idx_point = 0; idx_point < contour_src.points.size(); ++ idx_point) {
- contour_dst.emplace_back(contour_src.points[idx_point]);
+ const Point &ipt = contour_src.points[idx_point];
+ if (contour_dst.empty() || contour_dst.back() != ipt)
+ contour_dst.emplace_back(ipt);
for (; it != it_end && it->first.contour_idx == idx_contour && it->first.start_point_idx == idx_point; ++ it) {
// Add these points to the destination contour.
- const Vec2d pt1 = contour_src[idx_point].cast<double>();
- const Vec2d pt2 = (idx_point + 1 == contour_src.size() ? contour_src.points.front() : contour_src.points[idx_point + 1]).cast<double>();
- const Vec2d pt = lerp(pt1, pt2, it->first.t);
- map_infill_end_point_to_boundary[it->second] = std::make_pair(idx_contour, contour_dst.size());
- contour_dst.emplace_back(pt.cast<coord_t>());
+ const Polyline &infill_line = infill_ordered[it->second / 2];
+ const Point &pt = (it->second & 1) ? infill_line.points.back() : infill_line.points.front();
+#ifndef NDEBUG
+ {
+ const Vec2d pt1 = ipt.cast<double>();
+ const Vec2d pt2 = (idx_point + 1 == contour_src.size() ? contour_src.points.front() : contour_src.points[idx_point + 1]).cast<double>();
+ const Vec2d ptx = lerp(pt1, pt2, it->first.t);
+ assert(std::abs(pt.x() - pt.x()) < SCALED_EPSILON);
+ assert(std::abs(pt.y() - pt.y()) < SCALED_EPSILON);
+ }
+#endif // NDEBUG
+ size_t idx_tjoint_pt = 0;
+ if (idx_point + 1 < contour_src.size() || pt != contour_dst.front()) {
+ if (pt != contour_dst.back())
+ contour_dst.emplace_back(pt);
+ idx_tjoint_pt = contour_dst.size() - 1;
+ }
+ map_infill_end_point_to_boundary[it->second] = ContourIntersectionPoint{ idx_contour, idx_tjoint_pt };
+ ContourIntersectionPoint *pthis = &map_infill_end_point_to_boundary[it->second];
+ if (pprev) {
+ pprev->next_on_contour = pthis;
+ pthis->prev_on_contour = pprev;
+ } else
+ pfirst = pthis;
+ contour_intersection_points.emplace_back(pthis);
+ pprev = pthis;
}
+ if (pfirst) {
+ pprev->next_on_contour = pfirst;
+ pfirst->prev_on_contour = pprev;
+ }
}
- // Parametrize the curve.
- std::vector<ContourPointData> &contour_data = boundary_data[idx_contour];
- contour_data.reserve(contour_dst.size());
- contour_data.emplace_back(ContourPointData(0.f));
- for (size_t i = 1; i < contour_dst.size(); ++ i)
- contour_data.emplace_back(contour_data.back().param + (contour_dst[i].cast<float>() - contour_dst[i - 1].cast<float>()).norm());
- contour_data.front().param = contour_data.back().param + (contour_dst.back().cast<float>() - contour_dst.front().cast<float>()).norm();
+ // Parametrize the new boundary with the intersection points inserted.
+ std::vector<double> &contour_params = boundary_params[idx_contour];
+ contour_params.assign(contour_dst.size() + 1, 0.);
+ for (size_t i = 1; i < contour_dst.size(); ++i) {
+ contour_params[i] = contour_params[i - 1] + (contour_dst[i].cast<double>() - contour_dst[i - 1].cast<double>()).norm();
+ assert(contour_params[i] > contour_params[i - 1]);
+ }
+ contour_params.back() = contour_params[contour_params.size() - 2] + (contour_dst.back().cast<double>() - contour_dst.front().cast<double>()).norm();
+ assert(contour_params.back() > contour_params[contour_params.size() - 2]);
+ // Map parameters from contour_params to boundary_intersection_points.
+ for (ContourIntersectionPoint *ip : contour_intersection_points)
+ ip->param = contour_params[ip->point_idx];
+ // and measure distance to the previous and next intersection point.
+ const double contour_length = contour_params.back();
+ for (ContourIntersectionPoint *ip : contour_intersection_points)
+ if (ip->next_on_contour == ip) {
+ assert(ip->prev_on_contour == ip);
+ ip->contour_not_taken_length_prev = ip->contour_not_taken_length_next = contour_length;
+ } else {
+ assert(ip->prev_on_contour != ip);
+ ip->contour_not_taken_length_prev = closed_contour_distance_ccw(ip->prev_on_contour->param, ip->param, contour_length);
+ ip->contour_not_taken_length_next = closed_contour_distance_ccw(ip->param, ip->next_on_contour->param, contour_length);
+ }
}
-#ifndef NDEBUG
- assert(boundary.size() == boundary_src.num_contours());
- assert(std::all_of(map_infill_end_point_to_boundary.begin(), map_infill_end_point_to_boundary.end(),
- [&boundary](const std::pair<size_t, size_t> &contour_point) {
- return contour_point.first < boundary.size() && contour_point.second < boundary[contour_point.first].size();
+ assert(boundary.size() == boundary_src.size());
+#if 0
+ // Adaptive Cubic Infill produces infill lines, which not always end at the outer boundary.
+ assert(std::all_of(map_infill_end_point_to_boundary.begin(), map_infill_end_point_to_boundary.end(),
+ [&boundary](const ContourIntersectionPoint &contour_point) {
+ return contour_point.contour_idx < boundary.size() && contour_point.point_idx < boundary[contour_point.contour_idx].size();
}));
-#endif /* NDEBUG */
- }
+#endif
- // Mark the points and segments of split boundary as consumed if they are very close to some of the infill line.
- {
- // @supermerill used 2. * scale_(spacing)
- const double clip_distance = 3. * scale_(spacing);
- const double distance_colliding = 1.1 * scale_(spacing);
- mark_boundary_segments_touching_infill(boundary, boundary_data, bbox, infill_ordered, clip_distance, distance_colliding);
+ // Mark the points and segments of split boundary as consumed if they are very close to some of the infill line.
+ {
+ // @supermerill used 2. * scale_(spacing)
+ const double clip_distance = 1.7 * scale_(spacing);
+ // Allow a bit of overlap. This value must be slightly higher than the overlap of FillAdaptive, otherwise
+ // the anchors of the adaptive infill will mask the other side of the perimeter line.
+ // (see connect_lines_using_hooks() in FillAdaptive.cpp)
+ const double distance_colliding = 0.8 * scale_(spacing);
+ mark_boundary_segments_touching_infill(boundary, boundary_params, boundary_intersection_points, bbox, infill_ordered, clip_distance, distance_colliding);
+ }
}
// Connection from end of one infill line to the start of another infill line.
- //const float length_max = scale_(spacing);
-// const float length_max = scale_((2. / params.density) * spacing);
- const float length_max = scale_((1000. / params.density) * spacing);
+ //const double length_max = scale_(spacing);
+// const auto length_max = double(scale_((2. / params.density) * spacing));
+ const auto length_max = double(scale_((1000. / params.density) * spacing));
std::vector<size_t> merged_with(infill_ordered.size());
- for (size_t i = 0; i < merged_with.size(); ++ i)
- merged_with[i] = i;
+ std::iota(merged_with.begin(), merged_with.end(), 0);
struct ConnectionCost {
ConnectionCost(size_t idx_first, double cost, bool reversed) : idx_first(idx_first), cost(cost), reversed(reversed) {}
size_t idx_first;
@@ -930,82 +1263,205 @@ void Fill::connect_infill(Polylines &&infill_ordered, const ExPolygon &boundary_
for (size_t idx_chain = 1; idx_chain < infill_ordered.size(); ++ idx_chain) {
const Polyline &pl1 = infill_ordered[idx_chain - 1];
const Polyline &pl2 = infill_ordered[idx_chain];
- const std::pair<size_t, size_t> *cp1 = &map_infill_end_point_to_boundary[(idx_chain - 1) * 2 + 1];
- const std::pair<size_t, size_t> *cp2 = &map_infill_end_point_to_boundary[idx_chain * 2];
- const std::vector<ContourPointData> &contour_data = boundary_data[cp1->first];
- if (cp1->first == cp2->first) {
+ const ContourIntersectionPoint *cp1 = &map_infill_end_point_to_boundary[(idx_chain - 1) * 2 + 1];
+ const ContourIntersectionPoint *cp2 = &map_infill_end_point_to_boundary[idx_chain * 2];
+ if (cp1->contour_idx != boundary_idx_unconnected && cp1->contour_idx == cp2->contour_idx) {
// End points on the same contour. Try to connect them.
- float param_lo = (cp1->second == 0) ? 0.f : contour_data[cp1->second].param;
- float param_hi = (cp2->second == 0) ? 0.f : contour_data[cp2->second].param;
- float param_end = contour_data.front().param;
- bool reversed = false;
- if (param_lo > param_hi) {
- std::swap(param_lo, param_hi);
- reversed = true;
- }
- assert(param_lo >= 0.f && param_lo <= param_end);
- assert(param_hi >= 0.f && param_hi <= param_end);
- double len = param_hi - param_lo;
- if (len < length_max)
- connections_sorted.emplace_back(idx_chain - 1, len, reversed);
- len = param_lo + param_end - param_hi;
- if (len < length_max)
- connections_sorted.emplace_back(idx_chain - 1, len, ! reversed);
+ std::pair<double, double> len = path_lengths_along_contour(cp1, cp2, boundary_params[cp1->contour_idx].back());
+ if (len.first < length_max)
+ connections_sorted.emplace_back(idx_chain - 1, len.first, false);
+ if (len.second < length_max)
+ connections_sorted.emplace_back(idx_chain - 1, len.second, true);
}
}
std::sort(connections_sorted.begin(), connections_sorted.end(), [](const ConnectionCost& l, const ConnectionCost& r) { return l.cost < r.cost; });
- size_t idx_chain_last = 0;
- for (ConnectionCost &connection_cost : connections_sorted) {
- const std::pair<size_t, size_t> *cp1 = &map_infill_end_point_to_boundary[connection_cost.idx_first * 2 + 1];
- const std::pair<size_t, size_t> *cp1prev = cp1 - 1;
- const std::pair<size_t, size_t> *cp2 = &map_infill_end_point_to_boundary[(connection_cost.idx_first + 1) * 2];
- const std::pair<size_t, size_t> *cp2next = cp2 + 1;
- assert(cp1->first == cp2->first);
- std::vector<ContourPointData> &contour_data = boundary_data[cp1->first];
- if (connection_cost.reversed)
- std::swap(cp1, cp2);
- // Mark the the other end points of the segments to be taken as consumed temporarily, so they will not be crossed
- // by the new connection line.
- bool prev_marked = false;
- bool next_marked = false;
- if (cp1prev->first == cp1->first && ! contour_data[cp1prev->second].point_consumed) {
- contour_data[cp1prev->second].point_consumed = true;
- prev_marked = true;
- }
- if (cp2next->first == cp1->first && ! contour_data[cp2next->second].point_consumed) {
- contour_data[cp2next->second].point_consumed = true;
- next_marked = true;
- }
- if (could_take(contour_data, cp1->second, cp2->second)) {
- // Indices of the polygons to be connected.
- size_t idx_first = connection_cost.idx_first;
- size_t idx_second = idx_first + 1;
- for (size_t last = idx_first;;) {
- size_t lower = merged_with[last];
- if (lower == last) {
- merged_with[idx_first] = lower;
- idx_first = lower;
- break;
- }
- last = lower;
- }
- // Connect the two polygons using the boundary contour.
- take(infill_ordered[idx_first], std::move(infill_ordered[idx_second]), boundary[cp1->first], contour_data, cp1->second, cp2->second, connection_cost.reversed);
- // Mark the second polygon as merged with the first one.
- merged_with[idx_second] = merged_with[idx_first];
- }
- if (prev_marked)
- contour_data[cp1prev->second].point_consumed = false;
- if (next_marked)
- contour_data[cp2next->second].point_consumed = false;
+ auto get_and_update_merged_with = [&merged_with](size_t polyline_idx) -> size_t {
+ for (size_t last = polyline_idx;;) {
+ size_t lower = merged_with[last];
+ assert(lower <= last);
+ if (lower == last) {
+ merged_with[polyline_idx] = last;
+ return last;
+ }
+ last = lower;
+ }
+ assert(false);
+ return std::numeric_limits<size_t>::max();
+ };
+
+ const double line_half_width = 0.5 * scale_(spacing);
+
+#if 0
+ for (ConnectionCost &connection_cost : connections_sorted) {
+ ContourIntersectionPoint *cp1 = &map_infill_end_point_to_boundary[connection_cost.idx_first * 2 + 1];
+ ContourIntersectionPoint *cp2 = &map_infill_end_point_to_boundary[(connection_cost.idx_first + 1) * 2];
+ assert(cp1 != cp2);
+ assert(cp1->contour_idx == cp2->contour_idx && cp1->contour_idx != boundary_idx_unconnected);
+ if (cp1->consumed || cp2->consumed)
+ continue;
+ const double length = connection_cost.cost;
+ bool could_connect;
+ {
+ // cp1, cp2 sorted CCW.
+ ContourIntersectionPoint *cp_low = connection_cost.reversed ? cp2 : cp1;
+ ContourIntersectionPoint *cp_high = connection_cost.reversed ? cp1 : cp2;
+ assert(std::abs(length - closed_contour_distance_ccw(cp_low->param, cp_high->param, boundary_params[cp1->contour_idx].back())) < SCALED_EPSILON);
+ could_connect = ! cp_low->next_trimmed && ! cp_high->prev_trimmed;
+ if (could_connect && cp_low->next_on_contour != cp_high) {
+ // Other end of cp1, may or may not be on the same contour as cp1.
+ const ContourIntersectionPoint *cp1prev = cp1 - 1;
+ // Other end of cp2, may or may not be on the same contour as cp2.
+ const ContourIntersectionPoint *cp2next = cp2 + 1;
+ for (auto *cp = cp_low->next_on_contour; cp != cp_high; cp = cp->next_on_contour)
+ if (cp->consumed || cp == cp1prev || cp == cp2next || cp->prev_trimmed || cp->next_trimmed) {
+ could_connect = false;
+ break;
+ }
+ }
+ }
+ // Indices of the polylines to be connected by a perimeter segment.
+ size_t idx_first = connection_cost.idx_first;
+ size_t idx_second = idx_first + 1;
+ idx_first = get_and_update_merged_with(idx_first);
+ assert(idx_first < idx_second);
+ assert(idx_second == merged_with[idx_second]);
+ if (could_connect && length < anchor_length_max) {
+ // Take the complete contour.
+ // Connect the two polygons using the boundary contour.
+ take(infill_ordered[idx_first], infill_ordered[idx_second], boundary[cp1->contour_idx], cp1, cp2, connection_cost.reversed);
+ // Mark the second polygon as merged with the first one.
+ merged_with[idx_second] = merged_with[idx_first];
+ infill_ordered[idx_second].points.clear();
+ } else {
+ // Try to connect cp1 resp. cp2 with a piece of perimeter line.
+ take_limited(infill_ordered[idx_first], boundary[cp1->contour_idx], boundary_params[cp1->contour_idx], cp1, cp2, connection_cost.reversed, anchor_length, line_half_width);
+ take_limited(infill_ordered[idx_second], boundary[cp1->contour_idx], boundary_params[cp1->contour_idx], cp2, cp1, ! connection_cost.reversed, anchor_length, line_half_width);
+ }
}
- polylines_out.reserve(polylines_out.size() + std::count_if(infill_ordered.begin(), infill_ordered.end(), [](const Polyline &pl) { return ! pl.empty(); }));
+#endif
+
+ struct Arc {
+ ContourIntersectionPoint *intersection;
+ double arc_length;
+ };
+ std::vector<Arc> arches;
+ arches.reserve(map_infill_end_point_to_boundary.size());
+ for (ContourIntersectionPoint &cp : map_infill_end_point_to_boundary)
+ if (cp.contour_idx != boundary_idx_unconnected && cp.next_on_contour != &cp && cp.could_connect_next())
+ arches.push_back({ &cp, path_length_along_contour_ccw(&cp, cp.next_on_contour, boundary_params[cp.contour_idx].back()) });
+ std::sort(arches.begin(), arches.end(), [](const auto &l, const auto &r) { return l.arc_length < r.arc_length; });
+
+ //FIXME improve the Traveling Salesman problem with 2-opt and 3-opt local optimization.
+ for (Arc &arc : arches)
+ if (! arc.intersection->consumed && ! arc.intersection->next_on_contour->consumed) {
+ // Indices of the polylines to be connected by a perimeter segment.
+ ContourIntersectionPoint *cp1 = arc.intersection;
+ ContourIntersectionPoint *cp2 = arc.intersection->next_on_contour;
+ size_t polyline_idx1 = get_and_update_merged_with(((cp1 - map_infill_end_point_to_boundary.data()) / 2));
+ size_t polyline_idx2 = get_and_update_merged_with(((cp2 - map_infill_end_point_to_boundary.data()) / 2));
+ const Points &contour = boundary[cp1->contour_idx];
+ const std::vector<double> &contour_params = boundary_params[cp1->contour_idx];
+ if (polyline_idx1 != polyline_idx2) {
+ Polyline &polyline1 = infill_ordered[polyline_idx1];
+ Polyline &polyline2 = infill_ordered[polyline_idx2];
+ if (arc.arc_length < anchor_length_max) {
+ // Not closing a loop, connecting the lines.
+ assert(contour[cp1->point_idx] == polyline1.points.front() || contour[cp1->point_idx] == polyline1.points.back());
+ if (contour[cp1->point_idx] == polyline1.points.front())
+ polyline1.reverse();
+ assert(contour[cp2->point_idx] == polyline2.points.front() || contour[cp2->point_idx] == polyline2.points.back());
+ if (contour[cp2->point_idx] == polyline2.points.back())
+ polyline2.reverse();
+ take(polyline1, polyline2, contour, cp1, cp2, false);
+ // Mark the second polygon as merged with the first one.
+ if (polyline_idx2 < polyline_idx1) {
+ polyline2 = std::move(polyline1);
+ polyline1.points.clear();
+ merged_with[polyline_idx1] = merged_with[polyline_idx2];
+ } else {
+ polyline2.points.clear();
+ merged_with[polyline_idx2] = merged_with[polyline_idx1];
+ }
+ } else if (anchor_length > SCALED_EPSILON) {
+ // Move along the perimeter, but don't take the whole arc.
+ take_limited(polyline1, contour, contour_params, cp1, cp2, false, anchor_length, line_half_width);
+ take_limited(polyline2, contour, contour_params, cp2, cp1, true, anchor_length, line_half_width);
+ }
+ }
+ }
+
+ // Connect the remaining open infill lines to the perimeter lines if possible.
+ for (ContourIntersectionPoint &contour_point : map_infill_end_point_to_boundary)
+ if (! contour_point.consumed && contour_point.contour_idx != boundary_idx_unconnected) {
+ const Points &contour = boundary[contour_point.contour_idx];
+ const std::vector<double> &contour_params = boundary_params[contour_point.contour_idx];
+ const size_t contour_pt_idx = contour_point.point_idx;
+
+ double lprev = contour_point.could_connect_prev() ?
+ path_length_along_contour_ccw(contour_point.prev_on_contour, &contour_point, contour_params.back()) :
+ std::numeric_limits<double>::max();
+ double lnext = contour_point.could_connect_next() ?
+ path_length_along_contour_ccw(&contour_point, contour_point.next_on_contour, contour_params.back()) :
+ std::numeric_limits<double>::max();
+ size_t polyline_idx = get_and_update_merged_with(((&contour_point - map_infill_end_point_to_boundary.data()) / 2));
+ Polyline &polyline = infill_ordered[polyline_idx];
+ assert(! polyline.empty());
+ assert(contour[contour_point.point_idx] == polyline.points.front() || contour[contour_point.point_idx] == polyline.points.back());
+ bool connected = false;
+ for (double l : { std::min(lprev, lnext), std::max(lprev, lnext) }) {
+ if (l == std::numeric_limits<double>::max() || l > anchor_length_max)
+ break;
+ // Take the complete contour.
+ bool reversed = l == lprev;
+ ContourIntersectionPoint *cp2 = reversed ? contour_point.prev_on_contour : contour_point.next_on_contour;
+ // Identify which end of the polyline touches the boundary.
+ size_t polyline_idx2 = get_and_update_merged_with(((cp2 - map_infill_end_point_to_boundary.data()) / 2));
+ if (polyline_idx == polyline_idx2)
+ // Try the other side.
+ continue;
+ // Not closing a loop.
+ if (contour[contour_point.point_idx] == polyline.points.front())
+ polyline.reverse();
+ Polyline &polyline2 = infill_ordered[polyline_idx2];
+ assert(! polyline.empty());
+ assert(contour[cp2->point_idx] == polyline2.points.front() || contour[cp2->point_idx] == polyline2.points.back());
+ if (contour[cp2->point_idx] == polyline2.points.back())
+ polyline2.reverse();
+ take(polyline, polyline2, contour, &contour_point, cp2, reversed);
+ if (polyline_idx < polyline_idx2) {
+ // Mark the second polyline as merged with the first one.
+ merged_with[polyline_idx2] = polyline_idx;
+ polyline2.points.clear();
+ } else {
+ // Mark the first polyline as merged with the second one.
+ merged_with[polyline_idx] = polyline_idx2;
+ polyline2 = std::move(polyline);
+ polyline.points.clear();
+ }
+ connected = true;
+ break;
+ }
+ if (! connected && anchor_length > SCALED_EPSILON) {
+ // Which to take? One could optimize for:
+ // 1) Shortest path
+ // 2) Hook length
+ // ...
+ // Let's take the longer now, as this improves the chance of another hook to be placed on the other side of this contour point.
+ double l = std::max(contour_point.contour_not_taken_length_prev, contour_point.contour_not_taken_length_next);
+ if (l > SCALED_EPSILON) {
+ if (contour_point.contour_not_taken_length_prev > contour_point.contour_not_taken_length_next)
+ take_limited(polyline, contour, contour_params, &contour_point, contour_point.prev_on_contour, true, anchor_length, line_half_width);
+ else
+ take_limited(polyline, contour, contour_params, &contour_point, contour_point.next_on_contour, false, anchor_length, line_half_width);
+ }
+ }
+ }
+
+ polylines_out.reserve(polylines_out.size() + std::count_if(infill_ordered.begin(), infill_ordered.end(), [](const Polyline &pl) { return ! pl.empty(); }));
for (Polyline &pl : infill_ordered)
if (! pl.empty())
polylines_out.emplace_back(std::move(pl));
}
-#endif
-
} // namespace Slic3r
diff --git a/src/libslic3r/Fill/FillBase.hpp b/src/libslic3r/Fill/FillBase.hpp
index 517ce8383..c09b70bca 100644
--- a/src/libslic3r/Fill/FillBase.hpp
+++ b/src/libslic3r/Fill/FillBase.hpp
@@ -5,42 +5,55 @@
#include <memory.h>
#include <float.h>
#include <stdint.h>
+#include <stdexcept>
#include <type_traits>
#include "../libslic3r.h"
#include "../BoundingBox.hpp"
-#include "../PrintConfig.hpp"
+#include "../Exception.hpp"
#include "../Utils.hpp"
namespace Slic3r {
class ExPolygon;
class Surface;
+enum InfillPattern : int;
+
+namespace FillAdaptive {
+ struct Octree;
+};
+
+// Infill shall never fail, therefore the error is classified as RuntimeError, not SlicingError.
+class InfillFailedException : public Slic3r::RuntimeError {
+public:
+ InfillFailedException() : Slic3r::RuntimeError("Infill failed") {}
+};
struct FillParams
{
- FillParams() {
- memset(this, 0, sizeof(FillParams));
- // Adjustment does not work.
- dont_adjust = true;
- }
-
bool full_infill() const { return density > 0.9999f; }
+ // Don't connect the fill lines around the inner perimeter.
+ bool dont_connect() const { return anchor_length_max < 0.05f; }
// Fill density, fraction in <0, 1>
- float density;
+ float density { 0.f };
- // Don't connect the fill lines around the inner perimeter.
- bool dont_connect;
+ // Length of an infill anchor along the perimeter.
+ // 1000mm is roughly the maximum length line that fits into a 32bit coord_t.
+ float anchor_length { 1000.f };
+ float anchor_length_max { 1000.f };
// Don't adjust spacing to fill the space evenly.
- bool dont_adjust;
+ bool dont_adjust { true };
+
+ // Monotonic infill - strictly left to right for better surface quality of top infills.
+ bool monotonic { false };
// For Honeycomb.
// we were requested to complete each loop;
// in this case we don't try to make more continuous paths
- bool complete;
+ bool complete { false };
};
static_assert(IsTriviallyCopyable<FillParams>::value, "FillParams class is not POD (and it should be - see constructor).");
@@ -66,8 +79,12 @@ public:
// In scaled coordinates. Bounding box of the 2D projection of the object.
BoundingBox bounding_box;
+ // Octree builds on mesh for usage in the adaptive cubic infill
+ FillAdaptive::Octree* adapt_fill_octree = nullptr;
+
public:
virtual ~Fill() {}
+ virtual Fill* clone() const = 0;
static Fill* new_from_type(const InfillPattern type);
static Fill* new_from_type(const std::string &type);
@@ -104,7 +121,7 @@ protected:
const FillParams & /* params */,
unsigned int /* thickness_layers */,
const std::pair<float, Point> & /* direction */,
- ExPolygon & /* expolygon */,
+ ExPolygon /* expolygon */,
Polylines & /* polylines_out */) {};
virtual float _layer_angle(size_t idx) const { return (idx & 1) ? float(M_PI/2.) : 0; }
@@ -112,7 +129,9 @@ protected:
virtual std::pair<float, Point> _infill_direction(const Surface *surface) const;
public:
- static void connect_infill(Polylines &&infill_ordered, const ExPolygon &boundary, Polylines &polylines_out, double spacing, const FillParams &params);
+ static void connect_infill(Polylines &&infill_ordered, const ExPolygon &boundary, Polylines &polylines_out, const double spacing, const FillParams &params);
+ static void connect_infill(Polylines &&infill_ordered, const Polygons &boundary, const BoundingBox& bbox, Polylines &polylines_out, const double spacing, const FillParams &params);
+ static void connect_infill(Polylines &&infill_ordered, const std::vector<const Polygon*> &boundary, const BoundingBox &bbox, Polylines &polylines_out, double spacing, const FillParams &params);
static coord_t _adjust_solid_spacing(const coord_t width, const coord_t distance);
diff --git a/src/libslic3r/Fill/FillConcentric.cpp b/src/libslic3r/Fill/FillConcentric.cpp
index 8a3a7ea89..1b96c43a4 100644
--- a/src/libslic3r/Fill/FillConcentric.cpp
+++ b/src/libslic3r/Fill/FillConcentric.cpp
@@ -10,7 +10,7 @@ void FillConcentric::_fill_surface_single(
const FillParams &params,
unsigned int thickness_layers,
const std::pair<float, Point> &direction,
- ExPolygon &expolygon,
+ ExPolygon expolygon,
Polylines &polylines_out)
{
// no rotation is supported for this infill pattern
@@ -24,22 +24,22 @@ void FillConcentric::_fill_surface_single(
this->spacing = unscale<double>(distance);
}
- Polygons loops = (Polygons)expolygon;
+ Polygons loops = to_polygons(std::move(expolygon));
Polygons last = loops;
while (! last.empty()) {
last = offset2(last, -(distance + min_spacing/2), +min_spacing/2);
- loops.insert(loops.end(), last.begin(), last.end());
+ append(loops, last);
}
// generate paths from the outermost to the innermost, to avoid
// adhesion problems of the first central tiny loops
- loops = union_pt_chained(loops, false);
+ loops = union_pt_chained_outside_in(loops, false);
// split paths using a nearest neighbor search
size_t iPathFirst = polylines_out.size();
Point last_pos(0, 0);
for (const Polygon &loop : loops) {
- polylines_out.push_back(loop.split_at_index(last_pos.nearest_point_index(loop)));
+ polylines_out.emplace_back(loop.split_at_index(last_pos.nearest_point_index(loop.points)));
last_pos = polylines_out.back().last_point();
}
diff --git a/src/libslic3r/Fill/FillConcentric.hpp b/src/libslic3r/Fill/FillConcentric.hpp
index 1286858ea..8bf01d11d 100644
--- a/src/libslic3r/Fill/FillConcentric.hpp
+++ b/src/libslic3r/Fill/FillConcentric.hpp
@@ -8,18 +8,18 @@ namespace Slic3r {
class FillConcentric : public Fill
{
public:
- virtual ~FillConcentric() {}
+ ~FillConcentric() override = default;
protected:
- virtual Fill* clone() const { return new FillConcentric(*this); };
- virtual void _fill_surface_single(
+ Fill* clone() const override { return new FillConcentric(*this); };
+ void _fill_surface_single(
const FillParams &params,
unsigned int thickness_layers,
const std::pair<float, Point> &direction,
- ExPolygon &expolygon,
- Polylines &polylines_out);
+ ExPolygon expolygon,
+ Polylines &polylines_out) override;
- virtual bool no_sort() const { return true; }
+ bool no_sort() const override { return true; }
};
} // namespace Slic3r
diff --git a/src/libslic3r/Fill/FillGyroid.cpp b/src/libslic3r/Fill/FillGyroid.cpp
index 913b0b0c0..5797c47a5 100644
--- a/src/libslic3r/Fill/FillGyroid.cpp
+++ b/src/libslic3r/Fill/FillGyroid.cpp
@@ -37,12 +37,12 @@ static inline Polyline make_wave(
double period = points.back()(0);
if (width != period) // do not extend if already truncated
{
- points.reserve(one_period.size() * floor(width / period));
+ points.reserve(one_period.size() * size_t(floor(width / period)));
points.pop_back();
- int n = points.size();
+ size_t n = points.size();
do {
- points.emplace_back(Vec2d(points[points.size()-n](0) + period, points[points.size()-n](1)));
+ points.emplace_back(points[points.size()-n].x() + period, points[points.size()-n].y());
} while (points.back()(0) < width - EPSILON);
points.emplace_back(Vec2d(width, f(width, z_sin, z_cos, vertical, flip)));
@@ -67,7 +67,7 @@ static std::vector<Vec2d> make_one_period(double width, double scaleFactor, doub
std::vector<Vec2d> points;
double dx = M_PI_2; // exact coordinates on main inflexion lobes
double limit = std::min(2*M_PI, width);
- points.reserve(ceil(limit / tolerance / 3));
+ points.reserve(coord_t(ceil(limit / tolerance / 3)));
for (double x = 0.; x < limit - EPSILON; x += dx) {
points.emplace_back(Vec2d(x, f(x, z_sin, z_cos, vertical, flip)));
@@ -152,11 +152,11 @@ void FillGyroid::_fill_surface_single(
const FillParams &params,
unsigned int thickness_layers,
const std::pair<float, Point> &direction,
- ExPolygon &expolygon,
+ ExPolygon expolygon,
Polylines &polylines_out)
{
- float infill_angle = this->angle + (CorrectionAngle * 2*M_PI) / 360.;
- if(abs(infill_angle) >= EPSILON)
+ auto infill_angle = float(this->angle + (CorrectionAngle * 2*M_PI) / 360.);
+ if(std::abs(infill_angle) >= EPSILON)
expolygon.rotate(-infill_angle);
BoundingBox bb = expolygon.contour.bounding_box();
@@ -182,23 +182,25 @@ void FillGyroid::_fill_surface_single(
polylines = intersection_pl(polylines, to_polygons(expolygon));
- if (! polylines.empty())
- // remove too small bits (larger than longer)
+ if (! polylines.empty()) {
+ // Remove very small bits, but be careful to not remove infill lines connecting thin walls!
+ // The infill perimeter lines should be separated by around a single infill line width.
+ const double minlength = scale_(0.8 * this->spacing);
polylines.erase(
- //FIXME what is the small size? Removing tiny extrusions disconnects walls!
- std::remove_if(polylines.begin(), polylines.end(), [this](const Polyline &pl) { return pl.length() < scale_(this->spacing * 3); }),
+ std::remove_if(polylines.begin(), polylines.end(), [minlength](const Polyline &pl) { return pl.length() < minlength; }),
polylines.end());
+ }
if (! polylines.empty()) {
- polylines = chain_polylines(polylines);
// connect lines
size_t polylines_out_first_idx = polylines_out.size();
- if (params.dont_connect)
- append(polylines_out, std::move(polylines));
+ if (params.dont_connect())
+ append(polylines_out, chain_polylines(polylines));
else
this->connect_infill(std::move(polylines), expolygon, polylines_out, this->spacing, params);
+
// new paths must be rotated back
- if (abs(infill_angle) >= EPSILON) {
+ if (std::abs(infill_angle) >= EPSILON) {
for (auto it = polylines_out.begin() + polylines_out_first_idx; it != polylines_out.end(); ++ it)
it->rotate(infill_angle);
}
diff --git a/src/libslic3r/Fill/FillGyroid.hpp b/src/libslic3r/Fill/FillGyroid.hpp
index 37babb25e..ac66dfca9 100644
--- a/src/libslic3r/Fill/FillGyroid.hpp
+++ b/src/libslic3r/Fill/FillGyroid.hpp
@@ -11,10 +11,10 @@ class FillGyroid : public Fill
{
public:
FillGyroid() {}
- virtual Fill* clone() const { return new FillGyroid(*this); }
+ Fill* clone() const override { return new FillGyroid(*this); }
// require bridge flow since most of this pattern hangs in air
- virtual bool use_bridge_flow() const { return false; }
+ bool use_bridge_flow() const override { return false; }
// Correction applied to regular infill angle to maximize printing
// speed in default configuration (degrees)
@@ -28,12 +28,12 @@ public:
protected:
- virtual void _fill_surface_single(
+ void _fill_surface_single(
const FillParams &params,
unsigned int thickness_layers,
const std::pair<float, Point> &direction,
- ExPolygon &expolygon,
- Polylines &polylines_out);
+ ExPolygon expolygon,
+ Polylines &polylines_out) override;
};
} // namespace Slic3r
diff --git a/src/libslic3r/Fill/FillHoneycomb.cpp b/src/libslic3r/Fill/FillHoneycomb.cpp
index 948af182b..5e7000088 100644
--- a/src/libslic3r/Fill/FillHoneycomb.cpp
+++ b/src/libslic3r/Fill/FillHoneycomb.cpp
@@ -10,7 +10,7 @@ void FillHoneycomb::_fill_surface_single(
const FillParams &params,
unsigned int thickness_layers,
const std::pair<float, Point> &direction,
- ExPolygon &expolygon,
+ ExPolygon expolygon,
Polylines &polylines_out)
{
// cache hexagons math
@@ -18,21 +18,21 @@ void FillHoneycomb::_fill_surface_single(
Cache::iterator it_m = this->cache.find(cache_id);
if (it_m == this->cache.end()) {
it_m = this->cache.insert(it_m, std::pair<CacheID, CacheData>(cache_id, CacheData()));
- CacheData &m = it_m->second;
- coord_t min_spacing = scale_(this->spacing);
- m.distance = min_spacing / params.density;
- m.hex_side = m.distance / (sqrt(3)/2);
- m.hex_width = m.distance * 2; // $m->{hex_width} == $m->{hex_side} * sqrt(3);
- coord_t hex_height = m.hex_side * 2;
- m.pattern_height = hex_height + m.hex_side;
- m.y_short = m.distance * sqrt(3)/3;
- m.x_offset = min_spacing / 2;
- m.y_offset = m.x_offset * sqrt(3)/3;
- m.hex_center = Point(m.hex_width/2, m.hex_side);
+ CacheData &m = it_m->second;
+ coord_t min_spacing = coord_t(scale_(this->spacing));
+ m.distance = coord_t(min_spacing / params.density);
+ m.hex_side = coord_t(m.distance / (sqrt(3)/2));
+ m.hex_width = m.distance * 2; // $m->{hex_width} == $m->{hex_side} * sqrt(3);
+ coord_t hex_height = m.hex_side * 2;
+ m.pattern_height = hex_height + m.hex_side;
+ m.y_short = coord_t(m.distance * sqrt(3)/3);
+ m.x_offset = min_spacing / 2;
+ m.y_offset = coord_t(m.x_offset * sqrt(3)/3);
+ m.hex_center = Point(m.hex_width/2, m.hex_side);
}
CacheData &m = it_m->second;
- Polygons polygons;
+ Polylines all_polylines;
{
// adjust actual bounding box to the nearest multiple of our hex pattern
// and align it so that it matches across layers
@@ -52,7 +52,7 @@ void FillHoneycomb::_fill_surface_single(
coord_t x = bounding_box.min(0);
while (x <= bounding_box.max(0)) {
- Polygon p;
+ Polyline p;
coord_t ax[2] = { x + m.x_offset, x + m.distance - m.x_offset };
for (size_t i = 0; i < 2; ++ i) {
std::reverse(p.points.begin(), p.points.end()); // turn first half upside down
@@ -69,55 +69,15 @@ void FillHoneycomb::_fill_surface_single(
x += m.distance;
}
p.rotate(-direction.first, m.hex_center);
- polygons.push_back(p);
+ all_polylines.push_back(p);
}
}
- if (params.complete || true) {
- // we were requested to complete each loop;
- // in this case we don't try to make more continuous paths
- Polygons polygons_trimmed = intersection((Polygons)expolygon, polygons);
- for (Polygons::iterator it = polygons_trimmed.begin(); it != polygons_trimmed.end(); ++ it)
- polylines_out.push_back(it->split_at_first_point());
- } else {
- // consider polygons as polylines without re-appending the initial point:
- // this cuts the last segment on purpose, so that the jump to the next
- // path is more straight
- Polylines paths;
- {
- Polylines p;
- for (Polygon &poly : polygons)
- p.emplace_back(poly.points);
- paths = intersection_pl(p, to_polygons(expolygon));
- }
-
- // connect paths
- if (! paths.empty()) { // prevent calling leftmost_point() on empty collections
- Polylines chained = chain_polylines(std::move(paths));
- assert(paths.empty());
- paths.clear();
- for (Polyline &path : chained) {
- if (! paths.empty()) {
- // distance between first point of this path and last point of last path
- double distance = (path.first_point() - paths.back().last_point()).cast<double>().norm();
- if (distance <= m.hex_width) {
- paths.back().points.insert(paths.back().points.end(), path.points.begin(), path.points.end());
- continue;
- }
- }
- // Don't connect the paths.
- paths.push_back(std::move(path));
- }
- }
-
- // clip paths again to prevent connection segments from crossing the expolygon boundaries
- paths = intersection_pl(paths, to_polygons(offset_ex(expolygon, SCALED_EPSILON)));
- // Move the polylines to the output, avoid a deep copy.
- size_t j = polylines_out.size();
- polylines_out.resize(j + paths.size(), Polyline());
- for (size_t i = 0; i < paths.size(); ++ i)
- std::swap(polylines_out[j ++], paths[i]);
- }
+ all_polylines = intersection_pl(std::move(all_polylines), to_polygons(expolygon));
+ if (params.dont_connect() || all_polylines.size() <= 1)
+ append(polylines_out, chain_polylines(std::move(all_polylines)));
+ else
+ connect_infill(std::move(all_polylines), expolygon, polylines_out, this->spacing, params);
}
} // namespace Slic3r
diff --git a/src/libslic3r/Fill/FillHoneycomb.hpp b/src/libslic3r/Fill/FillHoneycomb.hpp
index 4717602d4..707e976fd 100644
--- a/src/libslic3r/Fill/FillHoneycomb.hpp
+++ b/src/libslic3r/Fill/FillHoneycomb.hpp
@@ -12,16 +12,16 @@ namespace Slic3r {
class FillHoneycomb : public Fill
{
public:
- virtual ~FillHoneycomb() {}
+ ~FillHoneycomb() override {}
protected:
- virtual Fill* clone() const { return new FillHoneycomb(*this); };
- virtual void _fill_surface_single(
+ Fill* clone() const override { return new FillHoneycomb(*this); };
+ void _fill_surface_single(
const FillParams &params,
unsigned int thickness_layers,
const std::pair<float, Point> &direction,
- ExPolygon &expolygon,
- Polylines &polylines_out);
+ ExPolygon expolygon,
+ Polylines &polylines_out) override;
// Caching the
struct CacheID
@@ -49,7 +49,7 @@ protected:
typedef std::map<CacheID, CacheData> Cache;
Cache cache;
- virtual float _layer_angle(size_t idx) const { return float(M_PI/3.) * (idx % 3); }
+ float _layer_angle(size_t idx) const override { return float(M_PI/3.) * (idx % 3); }
};
} // namespace Slic3r
diff --git a/src/libslic3r/Fill/FillLine.cpp b/src/libslic3r/Fill/FillLine.cpp
new file mode 100644
index 000000000..1cb9b2244
--- /dev/null
+++ b/src/libslic3r/Fill/FillLine.cpp
@@ -0,0 +1,122 @@
+#include "../ClipperUtils.hpp"
+#include "../ExPolygon.hpp"
+#include "../ShortestPath.hpp"
+#include "../Surface.hpp"
+
+#include "FillLine.hpp"
+
+namespace Slic3r {
+
+void FillLine::_fill_surface_single(
+ const FillParams &params,
+ unsigned int thickness_layers,
+ const std::pair<float, Point> &direction,
+ ExPolygon expolygon,
+ Polylines &polylines_out)
+{
+ // rotate polygons so that we can work with vertical lines here
+ expolygon.rotate(- direction.first);
+
+ this->_min_spacing = scale_(this->spacing);
+ assert(params.density > 0.0001f && params.density <= 1.f);
+ this->_line_spacing = coord_t(coordf_t(this->_min_spacing) / params.density);
+ this->_diagonal_distance = this->_line_spacing * 2;
+ this->_line_oscillation = this->_line_spacing - this->_min_spacing; // only for Line infill
+ BoundingBox bounding_box = expolygon.contour.bounding_box();
+
+ // define flow spacing according to requested density
+ if (params.density > 0.9999f && !params.dont_adjust) {
+ this->_line_spacing = this->_adjust_solid_spacing(bounding_box.size()(0), this->_line_spacing);
+ this->spacing = unscale<double>(this->_line_spacing);
+ } else {
+ // extend bounding box so that our pattern will be aligned with other layers
+ // Transform the reference point to the rotated coordinate system.
+ bounding_box.merge(_align_to_grid(
+ bounding_box.min,
+ Point(this->_line_spacing, this->_line_spacing),
+ direction.second.rotated(- direction.first)));
+ }
+
+ // generate the basic pattern
+ coord_t x_max = bounding_box.max(0) + SCALED_EPSILON;
+ Lines lines;
+ for (coord_t x = bounding_box.min(0); x <= x_max; x += this->_line_spacing)
+ lines.push_back(this->_line(lines.size(), x, bounding_box.min(1), bounding_box.max(1)));
+
+ // clip paths against a slightly larger expolygon, so that the first and last paths
+ // are kept even if the expolygon has vertical sides
+ // the minimum offset for preventing edge lines from being clipped is SCALED_EPSILON;
+ // however we use a larger offset to support expolygons with slightly skewed sides and
+ // not perfectly straight
+ //FIXME Vojtech: Update the intersecton function to work directly with lines.
+ Polylines polylines_src;
+ polylines_src.reserve(lines.size());
+ for (Lines::const_iterator it = lines.begin(); it != lines.end(); ++ it) {
+ polylines_src.push_back(Polyline());
+ Points &pts = polylines_src.back().points;
+ pts.reserve(2);
+ pts.push_back(it->a);
+ pts.push_back(it->b);
+ }
+ Polylines polylines = intersection_pl(polylines_src, offset(to_polygons(expolygon), scale_(0.02)), false);
+
+ // FIXME Vojtech: This is only performed for horizontal lines, not for the vertical lines!
+ const float INFILL_OVERLAP_OVER_SPACING = 0.3f;
+ // How much to extend an infill path from expolygon outside?
+ coord_t extra = coord_t(floor(this->_min_spacing * INFILL_OVERLAP_OVER_SPACING + 0.5f));
+ for (Polylines::iterator it_polyline = polylines.begin(); it_polyline != polylines.end(); ++ it_polyline) {
+ Point *first_point = &it_polyline->points.front();
+ Point *last_point = &it_polyline->points.back();
+ if (first_point->y() > last_point->y())
+ std::swap(first_point, last_point);
+ first_point->y() -= extra;
+ last_point->y() += extra;
+ }
+
+ size_t n_polylines_out_old = polylines_out.size();
+
+ // connect lines
+ if (! params.dont_connect() && ! polylines.empty()) { // prevent calling leftmost_point() on empty collections
+ // offset the expolygon by max(min_spacing/2, extra)
+ ExPolygon expolygon_off;
+ {
+ ExPolygons expolygons_off = offset_ex(expolygon, this->_min_spacing/2);
+ if (! expolygons_off.empty()) {
+ // When expanding a polygon, the number of islands could only shrink. Therefore the offset_ex shall generate exactly one expanded island for one input island.
+ assert(expolygons_off.size() == 1);
+ std::swap(expolygon_off, expolygons_off.front());
+ }
+ }
+ bool first = true;
+ for (Polyline &polyline : chain_polylines(std::move(polylines))) {
+ if (! first) {
+ // Try to connect the lines.
+ Points &pts_end = polylines_out.back().points;
+ const Point &first_point = polyline.points.front();
+ const Point &last_point = pts_end.back();
+ // Distance in X, Y.
+ const Vector distance = last_point - first_point;
+ // TODO: we should also check that both points are on a fill_boundary to avoid
+ // connecting paths on the boundaries of internal regions
+ if (this->_can_connect(std::abs(distance(0)), std::abs(distance(1))) &&
+ expolygon_off.contains(Line(last_point, first_point))) {
+ // Append the polyline.
+ pts_end.insert(pts_end.end(), polyline.points.begin(), polyline.points.end());
+ continue;
+ }
+ }
+ // The lines cannot be connected.
+ polylines_out.emplace_back(std::move(polyline));
+ first = false;
+ }
+ }
+
+ // paths must be rotated back
+ for (Polylines::iterator it = polylines_out.begin() + n_polylines_out_old; it != polylines_out.end(); ++ it) {
+ // No need to translate, the absolute position is irrelevant.
+ // it->translate(- direction.second(0), - direction.second(1));
+ it->rotate(direction.first);
+ }
+}
+
+} // namespace Slic3r
diff --git a/src/libslic3r/Fill/FillLine.hpp b/src/libslic3r/Fill/FillLine.hpp
new file mode 100644
index 000000000..9bf2b97e0
--- /dev/null
+++ b/src/libslic3r/Fill/FillLine.hpp
@@ -0,0 +1,49 @@
+#ifndef slic3r_FillLine_hpp_
+#define slic3r_FillLine_hpp_
+
+#include "../libslic3r.h"
+
+#include "FillBase.hpp"
+
+namespace Slic3r {
+
+class Surface;
+
+class FillLine : public Fill
+{
+public:
+ Fill* clone() const override { return new FillLine(*this); };
+ ~FillLine() override = default;
+
+protected:
+ void _fill_surface_single(
+ const FillParams &params,
+ unsigned int thickness_layers,
+ const std::pair<float, Point> &direction,
+ ExPolygon expolygon,
+ Polylines &polylines_out) override;
+
+ coord_t _min_spacing;
+ coord_t _line_spacing;
+ // distance threshold for allowing the horizontal infill lines to be connected into a continuous path
+ coord_t _diagonal_distance;
+ // only for line infill
+ coord_t _line_oscillation;
+
+ Line _line(int i, coord_t x, coord_t y_min, coord_t y_max) const {
+ coord_t osc = (i & 1) ? this->_line_oscillation : 0;
+ return Line(Point(x - osc, y_min), Point(x + osc, y_max));
+ }
+
+ bool _can_connect(coord_t dist_X, coord_t dist_Y)
+ {
+ const auto TOLERANCE = coord_t(10 * SCALED_EPSILON);
+ return (dist_X >= (this->_line_spacing - this->_line_oscillation) - TOLERANCE)
+ && (dist_X <= (this->_line_spacing + this->_line_oscillation) + TOLERANCE)
+ && (dist_Y <= this->_diagonal_distance);
+ }
+};
+
+}; // namespace Slic3r
+
+#endif // slic3r_FillLine_hpp_
diff --git a/src/libslic3r/Fill/FillPlanePath.cpp b/src/libslic3r/Fill/FillPlanePath.cpp
index 7a322ce99..a7a33b13d 100644
--- a/src/libslic3r/Fill/FillPlanePath.cpp
+++ b/src/libslic3r/Fill/FillPlanePath.cpp
@@ -1,4 +1,5 @@
#include "../ClipperUtils.hpp"
+#include "../ShortestPath.hpp"
#include "../Surface.hpp"
#include "FillPlanePath.hpp"
@@ -9,7 +10,7 @@ void FillPlanePath::_fill_surface_single(
const FillParams &params,
unsigned int thickness_layers,
const std::pair<float, Point> &direction,
- ExPolygon &expolygon,
+ ExPolygon expolygon,
Polylines &polylines_out)
{
expolygon.rotate(- direction.first);
@@ -23,14 +24,14 @@ void FillPlanePath::_fill_surface_single(
Point shift = this->_centered() ?
bounding_box.center() :
bounding_box.min;
- expolygon.translate(-shift(0), -shift(1));
- bounding_box.translate(-shift(0), -shift(1));
+ expolygon.translate(-shift.x(), -shift.y());
+ bounding_box.translate(-shift.x(), -shift.y());
Pointfs pts = _generate(
- coord_t(ceil(coordf_t(bounding_box.min(0)) / distance_between_lines)),
- coord_t(ceil(coordf_t(bounding_box.min(1)) / distance_between_lines)),
- coord_t(ceil(coordf_t(bounding_box.max(0)) / distance_between_lines)),
- coord_t(ceil(coordf_t(bounding_box.max(1)) / distance_between_lines)));
+ coord_t(ceil(coordf_t(bounding_box.min.x()) / distance_between_lines)),
+ coord_t(ceil(coordf_t(bounding_box.min.y()) / distance_between_lines)),
+ coord_t(ceil(coordf_t(bounding_box.max.x()) / distance_between_lines)),
+ coord_t(ceil(coordf_t(bounding_box.max.y()) / distance_between_lines)));
Polylines polylines;
if (pts.size() >= 2) {
@@ -38,39 +39,24 @@ void FillPlanePath::_fill_surface_single(
polylines.push_back(Polyline());
Polyline &polyline = polylines.back();
polyline.points.reserve(pts.size());
- for (Pointfs::iterator it = pts.begin(); it != pts.end(); ++ it)
+ for (const Vec2d &pt : pts)
polyline.points.push_back(Point(
- coord_t(floor((*it)(0) * distance_between_lines + 0.5)),
- coord_t(floor((*it)(1) * distance_between_lines + 0.5))));
+ coord_t(floor(pt.x() * distance_between_lines + 0.5)),
+ coord_t(floor(pt.y() * distance_between_lines + 0.5))));
// intersection(polylines_src, offset((Polygons)expolygon, scale_(0.02)), &polylines);
- polylines = intersection_pl(polylines, to_polygons(expolygon));
-
-/*
- if (1) {
- require "Slic3r/SVG.pm";
- print "Writing fill.svg\n";
- Slic3r::SVG::output("fill.svg",
- no_arrows => 1,
- polygons => \@$expolygon,
- green_polygons => [ $bounding_box->polygon ],
- polylines => [ $polyline ],
- red_polylines => \@paths,
- );
- }
-*/
-
+ polylines = intersection_pl(std::move(polylines), to_polygons(expolygon));
+ Polylines chained;
+ if (params.dont_connect() || params.density > 0.5 || polylines.size() <= 1)
+ chained = chain_polylines(std::move(polylines));
+ else
+ connect_infill(std::move(polylines), expolygon, chained, this->spacing, params);
// paths must be repositioned and rotated back
- for (Polylines::iterator it = polylines.begin(); it != polylines.end(); ++ it) {
- it->translate(shift(0), shift(1));
- it->rotate(direction.first);
+ for (Polyline &pl : chained) {
+ pl.translate(shift.x(), shift.y());
+ pl.rotate(direction.first);
}
+ append(polylines_out, std::move(chained));
}
-
- // Move the polylines to the output, avoid a deep copy.
- size_t j = polylines_out.size();
- polylines_out.resize(j + polylines.size(), Polyline());
- for (size_t i = 0; i < polylines.size(); ++ i)
- std::swap(polylines_out[j ++], polylines[i]);
}
// Follow an Archimedean spiral, in polar coordinates: r=a+b\theta
@@ -85,13 +71,13 @@ Pointfs FillArchimedeanChords::_generate(coord_t min_x, coord_t min_y, coord_t m
coordf_t r = 1;
Pointfs out;
//FIXME Vojtech: If used as a solid infill, there is a gap left at the center.
- out.push_back(Vec2d(0, 0));
- out.push_back(Vec2d(1, 0));
+ out.emplace_back(0, 0);
+ out.emplace_back(1, 0);
while (r < rmax) {
// Discretization angle to achieve a discretization error lower than RESOLUTION.
theta += 2. * acos(1. - RESOLUTION / r);
r = a + b * theta;
- out.push_back(Vec2d(r * cos(theta), r * sin(theta)));
+ out.emplace_back(r * cos(theta), r * sin(theta));
}
return out;
}
@@ -128,15 +114,12 @@ static inline Point hilbert_n_to_xy(const size_t n)
++ ndigits;
}
}
- int state = (ndigits & 1) ? 4 : 0;
-// int dirstate = (ndigits & 1) ? 0 : 4;
+ int state = (ndigits & 1) ? 4 : 0;
coord_t x = 0;
coord_t y = 0;
for (int i = (int)ndigits - 1; i >= 0; -- i) {
int digit = (n >> (i * 2)) & 3;
state += digit;
-// if (digit != 3)
-// dirstate = state; // lowest non-3 digit
x |= digit_to_x[state] << i;
y |= digit_to_y[state] << i;
state = next_state[state];
@@ -162,7 +145,7 @@ Pointfs FillHilbertCurve::_generate(coord_t min_x, coord_t min_y, coord_t max_x,
line.reserve(sz2);
for (size_t i = 0; i < sz2; ++ i) {
Point p = hilbert_n_to_xy(i);
- line.push_back(Vec2d(p(0) + min_x, p(1) + min_y));
+ line.emplace_back(p.x() + min_x, p.y() + min_y);
}
return line;
}
@@ -175,27 +158,27 @@ Pointfs FillOctagramSpiral::_generate(coord_t min_x, coord_t min_y, coord_t max_
coordf_t r = 0;
coordf_t r_inc = sqrt(2.);
Pointfs out;
- out.push_back(Vec2d(0, 0));
+ out.emplace_back(0., 0.);
while (r < rmax) {
r += r_inc;
coordf_t rx = r / sqrt(2.);
coordf_t r2 = r + rx;
- out.push_back(Vec2d( r, 0.));
- out.push_back(Vec2d( r2, rx));
- out.push_back(Vec2d( rx, rx));
- out.push_back(Vec2d( rx, r2));
- out.push_back(Vec2d(0., r));
- out.push_back(Vec2d(-rx, r2));
- out.push_back(Vec2d(-rx, rx));
- out.push_back(Vec2d(-r2, rx));
- out.push_back(Vec2d(-r, 0.));
- out.push_back(Vec2d(-r2, -rx));
- out.push_back(Vec2d(-rx, -rx));
- out.push_back(Vec2d(-rx, -r2));
- out.push_back(Vec2d(0., -r));
- out.push_back(Vec2d( rx, -r2));
- out.push_back(Vec2d( rx, -rx));
- out.push_back(Vec2d( r2+r_inc, -rx));
+ out.emplace_back( r, 0.);
+ out.emplace_back( r2, rx);
+ out.emplace_back( rx, rx);
+ out.emplace_back( rx, r2);
+ out.emplace_back( 0., r);
+ out.emplace_back(-rx, r2);
+ out.emplace_back(-rx, rx);
+ out.emplace_back(-r2, rx);
+ out.emplace_back(- r, 0.);
+ out.emplace_back(-r2, -rx);
+ out.emplace_back(-rx, -rx);
+ out.emplace_back(-rx, -r2);
+ out.emplace_back( 0., -r);
+ out.emplace_back( rx, -r2);
+ out.emplace_back( rx, -rx);
+ out.emplace_back( r2+r_inc, -rx);
}
return out;
}
diff --git a/src/libslic3r/Fill/FillPlanePath.hpp b/src/libslic3r/Fill/FillPlanePath.hpp
index 49fb2b387..cf19a95f8 100644
--- a/src/libslic3r/Fill/FillPlanePath.hpp
+++ b/src/libslic3r/Fill/FillPlanePath.hpp
@@ -16,17 +16,17 @@ namespace Slic3r {
class FillPlanePath : public Fill
{
public:
- virtual ~FillPlanePath() {}
+ ~FillPlanePath() override = default;
protected:
- virtual void _fill_surface_single(
+ void _fill_surface_single(
const FillParams &params,
unsigned int thickness_layers,
const std::pair<float, Point> &direction,
- ExPolygon &expolygon,
- Polylines &polylines_out);
+ ExPolygon expolygon,
+ Polylines &polylines_out) override;
- virtual float _layer_angle(size_t idx) const { return 0.f; }
+ float _layer_angle(size_t idx) const override { return 0.f; }
virtual bool _centered() const = 0;
virtual Pointfs _generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y) = 0;
};
@@ -34,34 +34,34 @@ protected:
class FillArchimedeanChords : public FillPlanePath
{
public:
- virtual Fill* clone() const { return new FillArchimedeanChords(*this); };
- virtual ~FillArchimedeanChords() {}
+ Fill* clone() const override { return new FillArchimedeanChords(*this); };
+ ~FillArchimedeanChords() override = default;
protected:
- virtual bool _centered() const { return true; }
- virtual Pointfs _generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y);
+ bool _centered() const override { return true; }
+ Pointfs _generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y) override;
};
class FillHilbertCurve : public FillPlanePath
{
public:
- virtual Fill* clone() const { return new FillHilbertCurve(*this); };
- virtual ~FillHilbertCurve() {}
+ Fill* clone() const override { return new FillHilbertCurve(*this); };
+ ~FillHilbertCurve() override = default;
protected:
- virtual bool _centered() const { return false; }
- virtual Pointfs _generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y);
+ bool _centered() const override { return false; }
+ Pointfs _generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y) override;
};
class FillOctagramSpiral : public FillPlanePath
{
public:
- virtual Fill* clone() const { return new FillOctagramSpiral(*this); };
- virtual ~FillOctagramSpiral() {}
+ Fill* clone() const override { return new FillOctagramSpiral(*this); };
+ ~FillOctagramSpiral() override = default;
protected:
- virtual bool _centered() const { return true; }
- virtual Pointfs _generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y);
+ bool _centered() const override { return true; }
+ Pointfs _generate(coord_t min_x, coord_t min_y, coord_t max_x, coord_t max_y) override;
};
} // namespace Slic3r
diff --git a/src/libslic3r/Fill/FillRectilinear.cpp b/src/libslic3r/Fill/FillRectilinear.cpp
index 629e5b6f4..f8393cf36 100644
--- a/src/libslic3r/Fill/FillRectilinear.cpp
+++ b/src/libslic3r/Fill/FillRectilinear.cpp
@@ -1,127 +1,2961 @@
+#include <stdlib.h>
+#include <stdint.h>
+
+#include <algorithm>
+#include <cmath>
+#include <limits>
+#include <random>
+
+#include <boost/container/small_vector.hpp>
+#include <boost/log/trivial.hpp>
+#include <boost/static_assert.hpp>
+
#include "../ClipperUtils.hpp"
#include "../ExPolygon.hpp"
-#include "../ShortestPath.hpp"
+#include "../Geometry.hpp"
#include "../Surface.hpp"
+#include "../ShortestPath.hpp"
#include "FillRectilinear.hpp"
+// #define SLIC3R_DEBUG
+// #define INFILL_DEBUG_OUTPUT
+
+// Make assert active if SLIC3R_DEBUG
+#ifdef SLIC3R_DEBUG
+ #undef NDEBUG
+ #include "SVG.hpp"
+#endif
+
+#if defined(SLIC3R_DEBUG) || defined(INFILL_DEBUG_OUTPUT)
+ #include "SVG.hpp"
+#endif
+
+#include <cassert>
+
+// We want our version of assert.
+#include "../libslic3r.h"
+
namespace Slic3r {
-void FillRectilinear::_fill_surface_single(
- const FillParams &params,
- unsigned int thickness_layers,
- const std::pair<float, Point> &direction,
- ExPolygon &expolygon,
- Polylines &polylines_out)
+// 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)
{
- // rotate polygons so that we can work with vertical lines here
- expolygon.rotate(- direction.first);
+#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<double>().norm();
+ } else {
+ for (size_t i = seg1; i < poly.points.size(); ++ i, pPrev = pThis)
+ len += (*pPrev - *(pThis = &poly.points[i])).cast<double>().norm();
+ for (size_t i = 0; i < seg2; ++ i, pPrev = pThis)
+ len += (*pPrev - *(pThis = &poly.points[i])).cast<double>().norm();
+ }
+ len += (*pPrev - p2).cast<double>().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]);
+ }
+}
+
+// Intersection point of a vertical line with a polygon segment.
+struct SegmentIntersection
+{
+ // Index of a contour in ExPolygonWithOffset, with which this vertical line intersects.
+ size_t iContour { 0 };
+ // Index of a segment in iContour, with which this vertical line intersects.
+ size_t iSegment { 0 };
+ // y position of the intersection, rational number.
+ int64_t pos_p { 0 };
+ uint32_t pos_q { 1 };
+
+ coord_t pos() const {
+ // Division rounds both positive and negative down to zero.
+ // Add half of q for an arithmetic rounding effect.
+ int64_t p = pos_p;
+ if (p < 0)
+ p -= int64_t(pos_q>>1);
+ else
+ p += int64_t(pos_q>>1);
+ return coord_t(p / int64_t(pos_q));
+ }
+
+ // Left vertical line / contour intersection point.
+ // null if next_on_contour_vertical.
+ int32_t prev_on_contour { 0 };
+ // Right vertical line / contour intersection point.
+ // If next_on_contour_vertical, then then next_on_contour contains next contour point on the same vertical line.
+ int32_t next_on_contour { 0 };
+
+ // 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 : char {
+ UNKNOWN,
+ OUTER_LOW,
+ OUTER_HIGH,
+ INNER_LOW,
+ INNER_HIGH,
+ };
+ SegmentIntersectionType type { UNKNOWN };
+
+ enum class LinkType : uint8_t {
+ // Horizontal link (left or right).
+ Horizontal,
+ // Vertical link, up.
+ Up,
+ // Vertical link, down.
+ Down,
+ // Phony intersection point has no link.
+ Phony,
+ };
+
+ enum class LinkQuality : uint8_t {
+ Invalid,
+ Valid,
+ // Valid link, but too long to be followed.
+ TooLong,
+ };
+
+ // Kept grouped with other booleans for smaller memory footprint.
+ LinkType prev_on_contour_type { LinkType::Horizontal };
+ LinkType next_on_contour_type { LinkType::Horizontal };
+ LinkQuality prev_on_contour_quality { LinkQuality::Valid };
+ LinkQuality next_on_contour_quality { LinkQuality::Valid };
+ // Was this segment along the y axis consumed?
+ // Up means up along the vertical segment.
+ bool consumed_vertical_up { false };
+ // Was a segment of the inner perimeter contour consumed?
+ // Right means right from the vertical segment.
+ bool consumed_perimeter_right { false };
+
+ // 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; }
+
+ enum class Side {
+ Left,
+ Right
+ };
+ enum class Direction {
+ Up,
+ Down
+ };
+
+ bool has_left_horizontal() const { return this->prev_on_contour_type == LinkType::Horizontal; }
+ bool has_right_horizontal() const { return this->next_on_contour_type == LinkType::Horizontal; }
+ bool has_horizontal(Side side) const { return side == Side::Left ? this->has_left_horizontal() : this->has_right_horizontal(); }
+
+ bool has_left_vertical_up() const { return this->prev_on_contour_type == LinkType::Up; }
+ bool has_left_vertical_down() const { return this->prev_on_contour_type == LinkType::Down; }
+ bool has_left_vertical(Direction dir) const { return dir == Direction::Up ? this->has_left_vertical_up() : this->has_left_vertical_down(); }
+ bool has_left_vertical() const { return this->has_left_vertical_up() || this->has_left_vertical_down(); }
+ bool has_left_vertical_outside() const { return this->is_low() ? this->has_left_vertical_down() : this->has_left_vertical_up(); }
+
+ bool has_right_vertical_up() const { return this->next_on_contour_type == LinkType::Up; }
+ bool has_right_vertical_down() const { return this->next_on_contour_type == LinkType::Down; }
+ bool has_right_vertical(Direction dir) const { return dir == Direction::Up ? this->has_right_vertical_up() : this->has_right_vertical_down(); }
+ bool has_right_vertical() const { return this->has_right_vertical_up() || this->has_right_vertical_down(); }
+ bool has_right_vertical_outside() const { return this->is_low() ? this->has_right_vertical_down() : this->has_right_vertical_up(); }
+
+ bool has_vertical() const { return this->has_left_vertical() || this->has_right_vertical(); }
+ bool has_vertical(Side side) const { return side == Side::Left ? this->has_left_vertical() : this->has_right_vertical(); }
+ bool has_vertical_up() const { return this->has_left_vertical_up() || this->has_right_vertical_up(); }
+ bool has_vertical_down() const { return this->has_left_vertical_down() || this->has_right_vertical_down(); }
+ bool has_vertical(Direction dir) const { return dir == Direction::Up ? this->has_vertical_up() : this->has_vertical_down(); }
+
+ int left_horizontal() const { return this->has_left_horizontal() ? this->prev_on_contour : -1; }
+ int right_horizontal() const { return this->has_right_horizontal() ? this->next_on_contour : -1; }
+ int horizontal(Side side) const { return side == Side::Left ? this->left_horizontal() : this->right_horizontal(); }
+ LinkQuality horizontal_quality(Side side) const {
+ assert(this->has_horizontal(side));
+ return side == Side::Left ? this->prev_on_contour_quality : this->next_on_contour_quality;
+ }
+
+ int left_vertical_up() const { return this->has_left_vertical_up() ? this->prev_on_contour : -1; }
+ int left_vertical_down() const { return this->has_left_vertical_down() ? this->prev_on_contour : -1; }
+ int left_vertical(Direction dir) const { return (dir == Direction::Up ? this->has_left_vertical_up() : this->has_left_vertical_down()) ? this->prev_on_contour : -1; }
+ int left_vertical() const { return this->has_left_vertical() ? this->prev_on_contour : -1; }
+ int left_vertical_outside() const { return this->is_low() ? this->left_vertical_down() : this->left_vertical_up(); }
+ int right_vertical_up() const { return this->has_right_vertical_up() ? this->next_on_contour : -1; }
+ int right_vertical_down() const { return this->has_right_vertical_down() ? this->next_on_contour : -1; }
+ int right_vertical(Direction dir) const { return (dir == Direction::Up ? this->has_right_vertical_up() : this->has_right_vertical_down()) ? this->next_on_contour : -1; }
+ int right_vertical() const { return this->has_right_vertical() ? this->next_on_contour : -1; }
+ int right_vertical_outside() const { return this->is_low() ? this->right_vertical_down() : this->right_vertical_up(); }
+
+ int vertical_up(Side side) const { return side == Side::Left ? this->left_vertical_up() : this->right_vertical_up(); }
+ int vertical_down(Side side) const { return side == Side::Left ? this->left_vertical_down() : this->right_vertical_down(); }
+ int vertical_outside(Side side) const { return side == Side::Left ? this->left_vertical_outside() : this->right_vertical_outside(); }
+ // Returns -1 if there is no link up.
+ int vertical_up() const {
+ return this->has_left_vertical_up() ? this->left_vertical_up() : this->right_vertical_up();
+ }
+ LinkQuality vertical_up_quality() const {
+ return this->has_left_vertical_up() ? this->prev_on_contour_quality : this->next_on_contour_quality;
+ }
+ // Returns -1 if there is no link down.
+ int vertical_down() const {
+// assert(! this->has_left_vertical_down() || ! this->has_right_vertical_down());
+ return this->has_left_vertical_down() ? this->left_vertical_down() : this->right_vertical_down();
+ }
+ LinkQuality vertical_down_quality() const {
+ return this->has_left_vertical_down() ? this->prev_on_contour_quality : this->next_on_contour_quality;
+ }
+ int vertical_outside() const { return this->is_low() ? this->vertical_down() : this->vertical_up(); }
+ LinkQuality vertical_outside_quality() const { return this->is_low() ? this->vertical_down_quality() : this->vertical_up_quality(); }
+
+ // Compare two y intersection points given by rational numbers.
+ // Note that the rational number is given as pos_p/pos_q, where pos_p is int64 and pos_q is uint32.
+ // This function calculates pos_p * other.pos_q < other.pos_p * pos_q as a 48bit number.
+ // We don't use 128bit intrinsic data types as these are usually not supported by 32bit compilers and
+ // we don't need the full 128bit precision anyway.
+ bool operator<(const SegmentIntersection &other) const
+ {
+ assert(pos_q > 0);
+ assert(other.pos_q > 0);
+ if (pos_p == 0 || other.pos_p == 0) {
+ // Because the denominators are positive and one of the nominators is zero,
+ // following simple statement holds.
+ return pos_p < other.pos_p;
+ } else {
+ // None of the nominators is zero.
+ int sign1 = (pos_p > 0) ? 1 : -1;
+ int sign2 = (other.pos_p > 0) ? 1 : -1;
+ int signs = sign1 * sign2;
+ assert(signs == 1 || signs == -1);
+ if (signs < 0) {
+ // The nominators have different signs.
+ return sign1 < 0;
+ } else {
+ // The nominators have the same sign.
+ // Absolute values
+ uint64_t p1, p2;
+ if (sign1 > 0) {
+ p1 = uint64_t(pos_p);
+ p2 = uint64_t(other.pos_p);
+ } else {
+ p1 = uint64_t(- pos_p);
+ p2 = uint64_t(- other.pos_p);
+ };
+ // Multiply low and high 32bit words of p1 by other_pos.q
+ // 32bit x 32bit => 64bit
+ // l_hi and l_lo overlap by 32 bits.
+ uint64_t l_hi = (p1 >> 32) * uint64_t(other.pos_q);
+ uint64_t l_lo = (p1 & 0xffffffffll) * uint64_t(other.pos_q);
+ l_hi += (l_lo >> 32);
+ uint64_t r_hi = (p2 >> 32) * uint64_t(pos_q);
+ uint64_t r_lo = (p2 & 0xffffffffll) * uint64_t(pos_q);
+ r_hi += (r_lo >> 32);
+ // Compare the high 64 bits.
+ if (l_hi == r_hi) {
+ // Compare the low 32 bits.
+ l_lo &= 0xffffffffll;
+ r_lo &= 0xffffffffll;
+ return (sign1 < 0) ? (l_lo > r_lo) : (l_lo < r_lo);
+ }
+ return (sign1 < 0) ? (l_hi > r_hi) : (l_hi < r_hi);
+ }
+ }
+ }
+
+ bool operator==(const SegmentIntersection &other) const
+ {
+ assert(pos_q > 0);
+ assert(other.pos_q > 0);
+ if (pos_p == 0 || other.pos_p == 0) {
+ // Because the denominators are positive and one of the nominators is zero,
+ // following simple statement holds.
+ return pos_p == other.pos_p;
+ }
+
+ // None of the nominators is zero, none of the denominators is zero.
+ bool positive = pos_p > 0;
+ if (positive != (other.pos_p > 0))
+ return false;
+ // The nominators have the same sign.
+ // Absolute values
+ uint64_t p1 = positive ? uint64_t(pos_p) : uint64_t(- pos_p);
+ uint64_t p2 = positive ? uint64_t(other.pos_p) : uint64_t(- other.pos_p);
+ // Multiply low and high 32bit words of p1 by other_pos.q
+ // 32bit x 32bit => 64bit
+ // l_hi and l_lo overlap by 32 bits.
+ uint64_t l_lo = (p1 & 0xffffffffll) * uint64_t(other.pos_q);
+ uint64_t r_lo = (p2 & 0xffffffffll) * uint64_t(pos_q);
+ if (l_lo != r_lo)
+ return false;
+ uint64_t l_hi = (p1 >> 32) * uint64_t(other.pos_q);
+ uint64_t r_hi = (p2 >> 32) * uint64_t(pos_q);
+ return l_hi + (l_lo >> 32) == r_hi + (r_lo >> 32);
+ }
+};
+static_assert(sizeof(SegmentIntersection::pos_q) == 4, "SegmentIntersection::pos_q has to be 32bit long!");
+
+// A vertical line with intersection points with polygons.
+struct SegmentedIntersectionLine
+{
+ // Index of this vertical intersection line.
+ size_t idx;
+ // x position of this vertical intersection line.
+ coord_t pos;
+ // List of intersection points with polygons, sorted increasingly by the y axis.
+ std::vector<SegmentIntersection> 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<size_t>::max();
+ out.iSegment = std::numeric_limits<size_t>::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
+{
+public:
+ ExPolygonWithOffset(
+ const ExPolygon &expolygon,
+ float angle,
+ coord_t aoffset1,
+ // If the 2nd offset is zero, then it is ignored and only OUTER_LOW / OUTER_HIGH intersections are
+ // populated into vertical intersection lines.
+ coord_t aoffset2 = 0)
+ {
+ // Copy and rotate the source polygons.
+ polygons_src = expolygon;
+ if (angle != 0.f) {
+ polygons_src.contour.rotate(angle);
+ for (Polygon &hole : polygons_src.holes)
+ hole.rotate(angle);
+ }
+
+ 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 == 0 || aoffset2 < aoffset1);
+// bool sticks_removed =
+ remove_sticks(polygons_src);
+// if (sticks_removed) BOOST_LOG_TRIVIAL(error) << "Sticks removed!";
+ polygons_outer = offset(polygons_src, float(aoffset1), ClipperLib::jtMiter, mitterLimit);
+ if (aoffset2 < 0)
+ polygons_inner = offset(polygons_outer, float(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));
+ }
+ }
+
+ ExPolygonWithOffset(const ExPolygonWithOffset &rhs, float angle) : ExPolygonWithOffset(rhs) {
+ if (angle != 0.f) {
+ this->polygons_src.contour.rotate(angle);
+ for (Polygon &hole : this->polygons_src.holes)
+ hole.rotate(angle);
+ for (Polygon &poly : this->polygons_outer)
+ poly.rotate(angle);
+ for (Polygon &poly : this->polygons_inner)
+ poly.rotate(angle);
+ }
+ }
+
+ // 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]; }
+
+ 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) {
+ 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<unsigned char> polygons_ccw;
+};
+
+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;
+}
+
+// Find an intersection on a previous line, but return -1, if the connecting segment of a perimeter was already extruded.
+static inline bool intersection_on_prev_next_vertical_line_valid(
+ const std::vector<SegmentedIntersectionLine> &segs,
+ size_t iVerticalLine,
+ size_t iIntersection,
+ SegmentIntersection::Side side)
+{
+ const SegmentedIntersectionLine &vline_this = segs[iVerticalLine];
+ const SegmentIntersection &it_this = vline_this.intersections[iIntersection];
+ if (it_this.has_vertical(side))
+ // Not the first intersection along the contor. This intersection point
+ // has been preceded by an intersection point along the vertical line.
+ return false;
+ int iIntersectionOther = it_this.horizontal(side);
+ if (iIntersectionOther == -1)
+ return false;
+ assert(side == SegmentIntersection::Side::Right ? (iVerticalLine + 1 < segs.size()) : (iVerticalLine > 0));
+ const SegmentedIntersectionLine &vline_other = segs[side == SegmentIntersection::Side::Right ? (iVerticalLine + 1) : (iVerticalLine - 1)];
+ const SegmentIntersection &it_other = vline_other.intersections[iIntersectionOther];
+ assert(it_other.is_inner());
+ assert(iIntersectionOther > 0);
+ assert(iIntersectionOther + 1 < vline_other.intersections.size());
+ // Is iIntersectionOther at the boundary of a vertical segment?
+ const SegmentIntersection &it_other2 = vline_other.intersections[it_other.is_low() ? iIntersectionOther - 1 : iIntersectionOther + 1];
+ if (it_other2.is_inner())
+ // 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 false;
+ assert(it_other.is_low() == it_other2.is_low());
+ if (it_this.horizontal_quality(side) != SegmentIntersection::LinkQuality::Valid)
+ return false;
+ if (side == SegmentIntersection::Side::Right ? it_this.consumed_perimeter_right : it_other.consumed_perimeter_right)
+ // This perimeter segment was already consumed.
+ return false;
+ if (it_other.is_low() ? it_other.consumed_vertical_up : vline_other.intersections[iIntersectionOther - 1].consumed_vertical_up)
+ // This vertical segment was already consumed.
+ return false;
+#if 0
+ if (it_other.vertical_outside() != -1 && it_other.vertical_outside_quality() == SegmentIntersection::LinkQuality::Valid)
+ // Landed inside a vertical run. Stop here.
+ return false;
+#endif
+ return true;
+}
+
+static inline bool intersection_on_prev_vertical_line_valid(
+ const std::vector<SegmentedIntersectionLine> &segs,
+ size_t iVerticalLine,
+ size_t iIntersection)
+{
+ return intersection_on_prev_next_vertical_line_valid(segs, iVerticalLine, iIntersection, SegmentIntersection::Side::Left);
+}
+
+static inline bool intersection_on_next_vertical_line_valid(
+ const std::vector<SegmentedIntersectionLine> &segs,
+ size_t iVerticalLine,
+ size_t iIntersection)
+{
+ return intersection_on_prev_next_vertical_line_valid(segs, iVerticalLine, iIntersection, SegmentIntersection::Side::Right);
+}
+
+// Measure an Euclidian length of a perimeter segment when going from iIntersection to iIntersection2.
+static inline coordf_t measure_perimeter_horizontal_segment_length(
+ const ExPolygonWithOffset &poly_with_offset,
+ const std::vector<SegmentedIntersectionLine> &segs,
+ size_t iVerticalLine,
+ size_t iIntersection,
+ size_t iIntersection2)
+{
+ size_t iVerticalLineOther = iVerticalLine + 1;
+ assert(iVerticalLineOther < segs.size());
+ const SegmentedIntersectionLine &vline = segs[iVerticalLine];
+ const SegmentIntersection &it = vline.intersections[iIntersection];
+ const SegmentedIntersectionLine &vline2 = segs[iVerticalLineOther];
+ const SegmentIntersection &it2 = vline2.intersections[iIntersection2];
+ assert(it.iContour == it2.iContour);
+ const Polygon &poly = poly_with_offset.contour(it.iContour);
+// const bool ccw = poly_with_offset.is_contour_ccw(vline.iContour);
+ assert(it.type == it2.type);
+ assert(it.iContour == it2.iContour);
+
+ Point p1(vline.pos, it.pos());
+ Point p2(vline2.pos, it2.pos());
+ return it.is_low() ?
+ segment_length(poly, it .iSegment, p1, it2.iSegment, p2) :
+ segment_length(poly, it2.iSegment, p2, it .iSegment, p1);
+}
+
+// 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<SegmentedIntersectionLine> &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(Point(il2.pos, itsct2.pos()));
+}
+
+static inline coordf_t measure_perimeter_segment_on_vertical_line_length(
+ const ExPolygonWithOffset &poly_with_offset,
+ const std::vector<SegmentedIntersectionLine> &segs,
+ size_t iVerticalLine,
+ 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(itsct.iContour);
+ assert(itsct.is_inner() == itsct2.is_inner());
+ assert(itsct.type != itsct2.type);
+ assert(itsct.iContour == itsct2.iContour);
+ Point p1(il.pos, itsct.pos());
+ Point p2(il.pos, itsct2.pos());
+ return forward ?
+ segment_length(poly, itsct .iSegment, p1, itsct2.iSegment, p2) :
+ segment_length(poly, itsct2.iSegment, p2, itsct .iSegment, p1);
+}
+
+// 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<SegmentedIntersectionLine> &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(Point(il.pos, 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<SegmentedIntersectionLine> &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<int>::max() :
+ distance_of_segmens(poly, segs[i_vline-1].intersections[iPrev].iSegment, itsct.iSegment, true);
+ int d_down = (iBelow == -1) ? std::numeric_limits<int>::max() :
+ distance_of_segmens(poly, iSegBelow, itsct.iSegment, true);
+ int d_up = (iAbove == -1) ? std::numeric_limits<int>::max() :
+ distance_of_segmens(poly, iSegAbove, itsct.iSegment, true);
+ if (intrsection_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.
+ intrsection_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<int>::max() :
+ distance_of_segmens(poly, itsct.iSegment, segs[i_vline+1].intersections[iNext].iSegment, true);
+ int d_down = (iSegBelow == -1) ? std::numeric_limits<int>::max() :
+ distance_of_segmens(poly, itsct.iSegment, iSegBelow, true);
+ int d_up = (iSegAbove == -1) ? std::numeric_limits<int>::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
+};
+
+static std::vector<SegmentedIntersectionLine> slice_region_by_vertical_lines(const ExPolygonWithOffset &poly_with_offset, size_t n_vlines, coord_t x0, coord_t line_spacing)
+{
+ // Allocate storage for the segments.
+ std::vector<SegmentedIntersectionLine> segs(n_vlines, SegmentedIntersectionLine());
+ for (coord_t i = 0; i < coord_t(n_vlines); ++ i) {
+ segs[i].idx = i;
+ segs[i].pos = x0 + i * line_spacing;
+ }
+ // For each contour
+ 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 &p1 = contour[iPrev];
+ const Point &p2 = contour[iSegment];
+ // Which of the equally spaced vertical lines is intersected by this segment?
+ coord_t l = p1(0);
+ coord_t r = p2(0);
+ if (l > r)
+ std::swap(l, r);
+ // il, ir are the left / right indices of vertical lines intersecting a segment
+ int il = (l - x0) / line_spacing;
+ while (il * line_spacing + x0 < l)
+ ++ il;
+ il = std::max(int(0), il);
+ int ir = (r - x0 + line_spacing) / line_spacing;
+ while (ir * line_spacing + x0 > r)
+ -- ir;
+ ir = std::min(int(segs.size()) - 1, ir);
+ if (il > ir)
+ // No vertical line intersects this segment.
+ continue;
+ assert(il >= 0 && size_t(il) < segs.size());
+ assert(ir >= 0 && size_t(ir) < segs.size());
+ for (int i = il; i <= ir; ++ i) {
+ coord_t this_x = segs[i].pos;
+ assert(this_x == i * line_spacing + x0);
+ SegmentIntersection is;
+ is.iContour = iContour;
+ is.iSegment = iSegment;
+ assert(l <= this_x);
+ assert(r >= this_x);
+ // Calculate the intersection position in y axis. x is known.
+ if (p1(0) == this_x) {
+ if (p2(0) == this_x) {
+ // Ignore strictly vertical segments.
+ continue;
+ }
+ is.pos_p = p1(1);
+ is.pos_q = 1;
+ } else if (p2(0) == this_x) {
+ is.pos_p = p2(1);
+ is.pos_q = 1;
+ } else {
+ // First calculate the intersection parameter 't' as a rational number with non negative denominator.
+ if (p2(0) > p1(0)) {
+ is.pos_p = this_x - p1(0);
+ is.pos_q = p2(0) - p1(0);
+ } else {
+ is.pos_p = p1(0) - this_x;
+ is.pos_q = p1(0) - p2(0);
+ }
+ assert(is.pos_p >= 0 && is.pos_p <= is.pos_q);
+ // Make an intersection point from the 't'.
+ is.pos_p *= int64_t(p2(1) - p1(1));
+ is.pos_p += p1(1) * int64_t(is.pos_q);
+ }
+ // +-1 to take rounding into account.
+ assert(is.pos() + 1 >= std::min(p1(1), p2(1)));
+ assert(is.pos() <= std::max(p1(1), p2(1)) + 1);
+ segs[i].intersections.push_back(is);
+ }
+ }
+ }
+
+ // Sort the intersections along their segments, specify the intersection types.
+ for (size_t i_seg = 0; i_seg < segs.size(); ++ i_seg) {
+ SegmentedIntersectionLine &sil = segs[i_seg];
+ // Sort the intersection points using exact rational arithmetic.
+ std::sort(sil.intersections.begin(), sil.intersections.end());
+ // 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;
+ coord_t dir = contour[iSegment](0) - contour[iPrev](0);
+ 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].pos() == sil.intersections[j-1].pos()) {
+ // 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_THROW(CONDITION) do { assert(CONDITION); if (! (CONDITION)) throw InfillFailedException(); } while (0)
+ for (size_t i_seg = 0; i_seg < segs.size(); ++ i_seg) {
+ SegmentedIntersectionLine &sil = segs[i_seg];
+ // The intersection points have to be even.
+ ASSERT_THROW((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_THROW(sil.intersections[i].type == SegmentIntersection::OUTER_LOW);
+ size_t j = i + 1;
+ ASSERT_THROW(j < sil.intersections.size());
+ ASSERT_THROW(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_THROW(j < sil.intersections.size());
+ ASSERT_THROW((j & 1) == 1);
+ ASSERT_THROW(sil.intersections[j].type == SegmentIntersection::OUTER_HIGH);
+ ASSERT_THROW(i + 1 == j || sil.intersections[j - 1].type == SegmentIntersection::INNER_HIGH);
+ i = j + 1;
+ }
+ }
+#undef ASSERT_THROW
+
+ return segs;
+}
+
+#ifndef NDEBUG
+bool validate_segment_intersection_connectivity(const std::vector<SegmentedIntersectionLine> &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.
+static void connect_segment_intersections_by_contours(
+ const ExPolygonWithOffset &poly_with_offset, std::vector<SegmentedIntersectionLine> &segs,
+ const FillParams &params, const coord_t link_max_length)
+{
+ for (size_t i_vline = 0; i_vline < segs.size(); ++ i_vline) {
+ SegmentedIntersectionLine &il = segs[i_vline];
+ const SegmentedIntersectionLine *il_prev = i_vline > 0 ? &segs[i_vline - 1] : nullptr;
+ const SegmentedIntersectionLine *il_next = i_vline + 1 < segs.size() ? &segs[i_vline + 1] : nullptr;
+
+ for (int i_intersection = 0; i_intersection < int(il.intersections.size()); ++ i_intersection) {
+ SegmentIntersection &itsct = il.intersections[i_intersection];
+ const Polygon &poly = poly_with_offset.contour(itsct.iContour);
+ const bool forward = itsct.is_low(); // == poly_with_offset.is_contour_ccw(intrsctn->iContour);
+
+ // 1) Find possible connection points on the previous / next vertical line.
+ // Find an intersection point on il_prev, intersecting i_intersection
+ // at the same orientation as i_intersection, and being closest to i_intersection
+ // in the number of contour segments, when following the direction of the contour.
+ //FIXME this has O(n) time complexity. Likely an O(log(n)) scheme is possible.
+ int iprev = -1;
+ int d_prev = std::numeric_limits<int>::max();
+ if (il_prev) {
+ for (int i = 0; i < int(il_prev->intersections.size()); ++ i) {
+ const SegmentIntersection &itsct2 = il_prev->intersections[i];
+ if (itsct.iContour == itsct2.iContour && itsct.type == itsct2.type) {
+ // 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, itsct2.iSegment, itsct.iSegment, forward);
+ if (d < d_prev) {
+ iprev = i;
+ d_prev = d;
+ }
+ }
+ }
+ }
+
+ // The same for il_next.
+ int inext = -1;
+ int d_next = std::numeric_limits<int>::max();
+ if (il_next) {
+ for (int i = 0; i < int(il_next->intersections.size()); ++ i) {
+ const SegmentIntersection &itsct2 = il_next->intersections[i];
+ if (itsct.iContour == itsct2.iContour && itsct.type == itsct2.type) {
+ // 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 < d_next) {
+ inext = i;
+ d_next = d;
+ }
+ }
+ }
+ }
+
+ // 2) Find possible connection points on the same vertical line.
+ bool same_prev = false;
+ bool same_next = false;
+ // Does the perimeter intersect the current vertical line above intrsctn?
+ for (int i = 0; i < int(il.intersections.size()); ++ i)
+ if (const SegmentIntersection &it2 = il.intersections[i];
+ i != i_intersection && it2.iContour == itsct.iContour && it2.type != itsct.type) {
+ int d = distance_of_segmens(poly, it2.iSegment, itsct.iSegment, forward);
+ if (d < d_prev) {
+ iprev = i;
+ d_prev = d;
+ same_prev = true;
+ }
+ d = distance_of_segmens(poly, itsct.iSegment, it2.iSegment, forward);
+ if (d < d_next) {
+ inext = i;
+ d_next = d;
+ same_next = true;
+ }
+ }
+ assert(iprev >= 0);
+ assert(inext >= 0);
+
+ itsct.prev_on_contour = iprev;
+ itsct.prev_on_contour_type = same_prev ?
+ (iprev < i_intersection ? SegmentIntersection::LinkType::Down : SegmentIntersection::LinkType::Up) :
+ SegmentIntersection::LinkType::Horizontal;
+ itsct.next_on_contour = inext;
+ itsct.next_on_contour_type = same_next ?
+ (inext < i_intersection ? SegmentIntersection::LinkType::Down : SegmentIntersection::LinkType::Up) :
+ SegmentIntersection::LinkType::Horizontal;
+
+ if (same_prev) {
+ // Only follow a vertical perimeter segment if it skips just the outer intersections.
+ SegmentIntersection *it = &itsct;
+ SegmentIntersection *end = il.intersections.data() + iprev;
+ assert(it != end);
+ if (it > end)
+ std::swap(it, end);
+ for (++ it; it != end; ++ it)
+ if (it->is_inner()) {
+ itsct.prev_on_contour_quality = SegmentIntersection::LinkQuality::Invalid;
+ break;
+ }
+ }
+
+ if (same_next) {
+ // Only follow a vertical perimeter segment if it skips just the outer intersections.
+ SegmentIntersection *it = &itsct;
+ SegmentIntersection *end = il.intersections.data() + inext;
+ assert(it != end);
+ if (it > end)
+ std::swap(it, end);
+ for (++ it; it != end; ++ it)
+ if (it->is_inner()) {
+ itsct.next_on_contour_quality = SegmentIntersection::LinkQuality::Invalid;
+ break;
+ }
+ }
+
+ // If both iprev and inext are on this vline, then there must not be any intersection with the previous or next contour and we will
+ // not trace this contour when generating infill.
+ if (same_prev && same_next) {
+ assert(iprev != i_intersection);
+ assert(inext != i_intersection);
+ if ((iprev > i_intersection) == (inext > i_intersection)) {
+ // Both closest intersections of this contour are on the same vertical line and at the same side of this point.
+ // Ignore them when tracing the infill.
+ itsct.prev_on_contour_quality = SegmentIntersection::LinkQuality::Invalid;
+ itsct.next_on_contour_quality = SegmentIntersection::LinkQuality::Invalid;
+ }
+ }
+
+ if (params.dont_connect()) {
+ if (itsct.prev_on_contour_quality == SegmentIntersection::LinkQuality::Valid)
+ itsct.prev_on_contour_quality = SegmentIntersection::LinkQuality::TooLong;
+ if (itsct.next_on_contour_quality == SegmentIntersection::LinkQuality::Valid)
+ itsct.next_on_contour_quality = SegmentIntersection::LinkQuality::TooLong;
+ } else if (link_max_length > 0) {
+ // Measure length of the links.
+ if (itsct.prev_on_contour_quality == SegmentIntersection::LinkQuality::Valid &&
+ (same_prev ?
+ measure_perimeter_segment_on_vertical_line_length(poly_with_offset, segs, i_vline, iprev, i_intersection, forward) :
+ measure_perimeter_horizontal_segment_length(poly_with_offset, segs, i_vline - 1, iprev, i_intersection)) > link_max_length)
+ itsct.prev_on_contour_quality = SegmentIntersection::LinkQuality::TooLong;
+ if (itsct.next_on_contour_quality == SegmentIntersection::LinkQuality::Valid &&
+ (same_next ?
+ measure_perimeter_segment_on_vertical_line_length(poly_with_offset, segs, i_vline, i_intersection, inext, forward) :
+ measure_perimeter_horizontal_segment_length(poly_with_offset, segs, i_vline, i_intersection, inext)) > link_max_length)
+ itsct.next_on_contour_quality = SegmentIntersection::LinkQuality::TooLong;
+ }
+ }
+
+ // Make the LinkQuality::Invalid symmetric on vertical connections.
+ for (int i_intersection = 0; i_intersection < int(il.intersections.size()); ++ i_intersection) {
+ SegmentIntersection &it = il.intersections[i_intersection];
+ if (it.has_left_vertical() && it.prev_on_contour_quality == SegmentIntersection::LinkQuality::Invalid) {
+ SegmentIntersection &it2 = il.intersections[it.left_vertical()];
+ assert(it2.left_vertical() == i_intersection);
+ it2.prev_on_contour_quality = SegmentIntersection::LinkQuality::Invalid;
+ }
+ if (it.has_right_vertical() && it.next_on_contour_quality == SegmentIntersection::LinkQuality::Invalid) {
+ SegmentIntersection &it2 = il.intersections[it.right_vertical()];
+ assert(it2.right_vertical() == i_intersection);
+ it2.next_on_contour_quality = SegmentIntersection::LinkQuality::Invalid;
+ }
+ }
+ }
+
+ assert(validate_segment_intersection_connectivity(segs));
+}
+
+static void pinch_contours_insert_phony_outer_intersections(std::vector<SegmentedIntersectionLine> &segs)
+{
+ // Keep the vector outside the loops, so they will not be reallocated.
+ // Where to insert new outer points.
+ std::vector<size_t> insert_after;
+ // Mapping of indices of current intersection line after inserting new outer points.
+ std::vector<int32_t> map;
+ std::vector<SegmentIntersection> 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());
+ }
+ }
+ }
+ }
+
+ if (! insert_after.empty()) {
+ // Insert phony OUTER_HIGH / OUTER_LOW pairs, adjust indices pointing to intersection points on this contour.
+ map.clear();
+ {
+ size_t i = 0;
+ temp_intersections.clear();
+ for (size_t idx_inset_after : insert_after) {
+ for (; i <= idx_inset_after; ++ i) {
+ map.emplace_back(temp_intersections.size());
+ temp_intersections.emplace_back(il.intersections[i]);
+ }
+ coord_t pos = (temp_intersections.back().pos() + il.intersections[i].pos()) / 2;
+ temp_intersections.emplace_back(phony_outer_intersection(SegmentIntersection::OUTER_HIGH, pos));
+ temp_intersections.emplace_back(phony_outer_intersection(SegmentIntersection::OUTER_LOW, pos));
+ }
+ for (; i < il.intersections.size(); ++ i) {
+ map.emplace_back(temp_intersections.size());
+ temp_intersections.emplace_back(il.intersections[i]);
+ }
+ temp_intersections.swap(il.intersections);
+ }
+ // Reindex references on current intersection line.
+ for (SegmentIntersection &ip : il.intersections) {
+ if (ip.has_left_vertical())
+ ip.prev_on_contour = map[ip.prev_on_contour];
+ if (ip.has_right_vertical())
+ ip.next_on_contour = map[ip.next_on_contour];
+ }
+ // Reindex references on previous intersection line.
+ for (SegmentIntersection &ip : segs[i_vline - 1].intersections)
+ if (ip.has_right_horizontal())
+ ip.next_on_contour = map[ip.next_on_contour];
+ if (i_vline + 1 < 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];
+ }
+ }
+ }
+ }
+
+ assert(validate_segment_intersection_connectivity(segs));
+}
+
+// Find the last INNER_HIGH intersection starting with INNER_LOW, that is followed by OUTER_HIGH intersection.
+// Such intersection shall always exist.
+static const SegmentIntersection& end_of_vertical_run_raw(const SegmentIntersection &start)
+{
+ assert(start.type == SegmentIntersection::INNER_LOW);
+ // Step back to the beginning of the vertical segment to mark it as consumed.
+ auto *it = &start;
+ do {
+ ++ it;
+ } while (it->type != SegmentIntersection::OUTER_HIGH);
+ if ((it - 1)->is_inner()) {
+ // Step back.
+ -- it;
+ assert(it->type == SegmentIntersection::INNER_HIGH);
+ }
+ return *it;
+}
+static SegmentIntersection& end_of_vertical_run_raw(SegmentIntersection &start)
+{
+ return const_cast<SegmentIntersection&>(end_of_vertical_run_raw(std::as_const(start)));
+}
+
+// Find the last INNER_HIGH intersection starting with INNER_LOW, that is followed by OUTER_HIGH intersection, traversing vertical up contours if enabled.
+// Such intersection shall always exist.
+static const SegmentIntersection& end_of_vertical_run(const SegmentedIntersectionLine &il, const SegmentIntersection &start)
+{
+ assert(start.type == SegmentIntersection::INNER_LOW);
+ const SegmentIntersection *end = &end_of_vertical_run_raw(start);
+ assert(end->type == SegmentIntersection::INNER_HIGH);
+ for (;;) {
+ int up = end->vertical_up();
+ if (up == -1 || (end->has_left_vertical_up() ? end->prev_on_contour_quality : end->next_on_contour_quality) != SegmentIntersection::LinkQuality::Valid)
+ break;
+ const SegmentIntersection &new_start = il.intersections[up];
+ assert(end->iContour == new_start.iContour);
+ assert(new_start.type == SegmentIntersection::INNER_LOW);
+ end = &end_of_vertical_run_raw(new_start);
+ }
+ assert(end->type == SegmentIntersection::INNER_HIGH);
+ return *end;
+}
+static SegmentIntersection& end_of_vertical_run(SegmentedIntersectionLine &il, SegmentIntersection &start)
+{
+ return const_cast<SegmentIntersection&>(end_of_vertical_run(std::as_const(il), std::as_const(start)));
+}
+
+static void traverse_graph_generate_polylines(
+ const ExPolygonWithOffset& poly_with_offset, const FillParams& params, const coord_t link_max_length, std::vector<SegmentedIntersectionLine>& segs, Polylines& polylines_out)
+{
+ // 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 (int i_vline = 0; i_vline < int(segs.size()); ++ i_vline) {
+ SegmentedIntersectionLine &vline = segs[i_vline];
+ for (int i_intersection = 0; i_intersection + 1 < int(vline.intersections.size()); ++ i_intersection) {
+ if (vline.intersections[i_intersection].type == SegmentIntersection::OUTER_LOW &&
+ vline.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;
+ vline.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.
+ int i_vline = 0;
+ int i_intersection = -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 = nullptr;
+ if (! polylines_out.empty())
+ pointLast = polylines_out.back().points.back();
+ for (;;) {
+ if (i_intersection == -1) {
+ // The path has been interrupted. Find a next starting point, closest to the previous extruder position.
+ coordf_t dist2min = std::numeric_limits<coordf_t>().max();
+ for (int i_vline2 = 0; i_vline2 < int(segs.size()); ++ i_vline2) {
+ const SegmentedIntersectionLine &vline = segs[i_vline2];
+ if (! vline.intersections.empty()) {
+ assert(vline.intersections.size() > 1);
+ // Even number of intersections with the loops.
+ assert((vline.intersections.size() & 1) == 0);
+ assert(vline.intersections.front().type == SegmentIntersection::OUTER_LOW);
+ for (int i = 0; i < int(vline.intersections.size()); ++ i) {
+ const SegmentIntersection& intrsctn = vline.intersections[i];
+ if (intrsctn.is_outer()) {
+ assert(intrsctn.is_low() || i > 0);
+ bool consumed = intrsctn.is_low() ?
+ intrsctn.consumed_vertical_up :
+ vline.intersections[i - 1].consumed_vertical_up;
+ if (! consumed) {
+ coordf_t dist2 = sqr(coordf_t(pointLast(0) - vline.pos)) + sqr(coordf_t(pointLast(1) - intrsctn.pos()));
+ 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 == -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 = Point(segs[i_vline].pos, 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 &vline = segs[i_vline];
+ SegmentIntersection *it = &vline.intersections[i_intersection];
+ bool going_up = it->is_low();
+ bool try_connect = false;
+ if (going_up) {
+ assert(! it->consumed_vertical_up);
+ assert(i_intersection + 1 < vline.intersections.size());
+ // Step back to the beginning of the vertical segment to mark it as consumed.
+ if (it->is_inner()) {
+ assert(i_intersection > 0);
+ -- it;
+ -- i_intersection;
+ }
+ // Consume the complete vertical segment up to the outer contour.
+ do {
+ it->consumed_vertical_up = true;
+ ++ it;
+ ++ i_intersection;
+ assert(i_intersection < vline.intersections.size());
+ } while (it->type != SegmentIntersection::OUTER_HIGH);
+ if ((it - 1)->is_inner()) {
+ // Step back.
+ -- it;
+ -- i_intersection;
+ assert(it->type == SegmentIntersection::INNER_HIGH);
+ try_connect = true;
+ }
+ } else {
+ // Going down.
+ assert(it->is_high());
+ assert(i_intersection > 0);
+ assert(!(it - 1)->consumed_vertical_up);
+ // Consume the complete vertical segment up to the outer contour.
+ if (it->is_inner())
+ it->consumed_vertical_up = true;
+ do {
+ assert(i_intersection > 0);
+ -- it;
+ -- i_intersection;
+ it->consumed_vertical_up = true;
+ } while (it->type != SegmentIntersection::OUTER_LOW);
+ if ((it + 1)->is_inner()) {
+ // Step back.
+ ++ it;
+ ++ i_intersection;
+ assert(it->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 i_prev = it->left_horizontal();
+ int i_next = it->right_horizontal();
+ bool intersection_prev_valid = intersection_on_prev_vertical_line_valid(segs, i_vline, i_intersection);
+ bool intersection_next_valid = intersection_on_next_vertical_line_valid(segs, i_vline, i_intersection);
+ bool intersection_horizontal_valid = intersection_prev_valid || intersection_next_valid;
+ // Mark both the left and right connecting segment as consumed, because one cannot go to this intersection point as it has been consumed.
+ if (i_prev != -1)
+ segs[i_vline - 1].intersections[i_prev].consumed_perimeter_right = true;
+ if (i_next != -1)
+ it->consumed_perimeter_right = true;
+
+ // Try to connect to a previous or next vertical line, making a zig-zag pattern.
+ if (intersection_horizontal_valid) {
+ // A horizontal connection along the perimeter line exists.
+ assert(it->is_inner());
+ bool take_next = intersection_next_valid;
+ if (intersection_prev_valid && intersection_next_valid) {
+ // Take the shorter segment. This greedy heuristics may not be the best.
+ coordf_t dist_prev = measure_perimeter_horizontal_segment_length(poly_with_offset, segs, i_vline - 1, i_prev, i_intersection);
+ coordf_t dist_next = measure_perimeter_horizontal_segment_length(poly_with_offset, segs, i_vline, i_intersection, i_next);
+ take_next = dist_next < dist_prev;
+ }
+ polyline_current->points.emplace_back(vline.pos, it->pos());
+ emit_perimeter_prev_next_segment(poly_with_offset, segs, i_vline, it->iContour, i_intersection, take_next ? i_next : i_prev, *polyline_current, take_next);
+ //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 = i_next;
+ }
+ else {
+ -- i_vline;
+ i_intersection = i_prev;
+ }
+ continue;
+ }
+
+ // Try to connect to a previous or next point on the same vertical line.
+ int i_vertical = it->vertical_outside();
+ auto vertical_link_quality = (i_vertical == -1 || vline.intersections[i_vertical + (going_up ? 0 : -1)].consumed_vertical_up) ?
+ SegmentIntersection::LinkQuality::Invalid : it->vertical_outside_quality();
+#if 0
+ if (vertical_link_quality == SegmentIntersection::LinkQuality::Valid ||
+ // Follow the link if there is no horizontal link available.
+ (! intersection_horizontal_valid && vertical_link_quality != SegmentIntersection::LinkQuality::Invalid)) {
+#else
+ if (vertical_link_quality != SegmentIntersection::LinkQuality::Invalid) {
+#endif
+ assert(it->iContour == vline.intersections[i_vertical].iContour);
+ polyline_current->points.emplace_back(vline.pos, it->pos());
+ if (vertical_link_quality == SegmentIntersection::LinkQuality::Valid)
+ // Consume the connecting contour and the next segment.
+ emit_perimeter_segment_on_vertical_line(poly_with_offset, segs, i_vline, it->iContour, i_intersection, i_vertical,
+ *polyline_current, going_up ? it->has_left_vertical_up() : it->has_right_vertical_down());
+ else {
+ // Just skip the connecting contour and start a new path.
+ polylines_out.emplace_back();
+ polyline_current = &polylines_out.back();
+ polyline_current->points.emplace_back(vline.pos, vline.intersections[i_vertical].pos());
+ }
+ // 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 = i_intersection; i < i_vertical; ++i)
+ vline.intersections[i].consumed_vertical_up = true;
+ else
+ for (int i = i_vertical; i < i_intersection; ++i)
+ vline.intersections[i].consumed_vertical_up = true;
+ // seg.intersections[going_up ? i_intersection : i_intersection - 1].consumed_vertical_up = true;
+ it->consumed_perimeter_right = true;
+ (going_up ? ++it : --it)->consumed_perimeter_right = true;
+ i_intersection = i_vertical;
+ continue;
+ }
+
+ // 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.
+ going_up ? ++ it : -- it;
+ }
+
+ // Finish the current vertical line,
+ // reset the current vertical line to pick a new starting point in the next round.
+ assert(it->is_outer());
+ assert(it->is_high() == going_up);
+ pointLast = Point(vline.pos, it->pos());
+ polyline_current->points.emplace_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();
+ it = nullptr;
+ i_intersection = -1;
+ polyline_current = nullptr;
+ }
+}
+
+struct MonotonicRegion
+{
+ struct Boundary {
+ int vline;
+ int low;
+ int high;
+ };
+
+ Boundary left;
+ Boundary right;
+
+ // Length when starting at left.low
+ float len1 { 0.f };
+ // Length when starting at left.high
+ float len2 { 0.f };
+ // If true, then when starting at left.low, then ending at right.high and vice versa.
+ // If false, then ending at the same side as starting.
+ bool flips { false };
+
+ float length(bool region_flipped) const { return region_flipped ? len2 : len1; }
+ int left_intersection_point(bool region_flipped) const { return region_flipped ? left.high : left.low; }
+ int right_intersection_point(bool region_flipped) const { return (region_flipped == flips) ? right.low : right.high; }
+
+#if NDEBUG
+ // Left regions are used to track whether all regions left to this one have already been printed.
+ boost::container::small_vector<MonotonicRegion*, 4> left_neighbors;
+ // Right regions are held to pick a next region to be extruded using the "Ant colony" heuristics.
+ boost::container::small_vector<MonotonicRegion*, 4> right_neighbors;
+#else
+ // For debugging, use the normal vector as it is better supported by debug visualizers.
+ std::vector<MonotonicRegion*> left_neighbors;
+ std::vector<MonotonicRegion*> right_neighbors;
+#endif
+};
+
+struct AntPath
+{
+ float length { -1. }; // Length of the link to the next region.
+ float visibility { -1. }; // 1 / length. Which length, just to the next region, or including the path accross the region?
+ float pheromone { 0 }; // <0, 1>
+};
+
+struct MonotonicRegionLink
+{
+ MonotonicRegion *region;
+ bool flipped;
+ // Distance of right side of this region to left side of the next region, if the "flipped" flag of this region and the next region
+ // is applied as defined.
+ AntPath *next;
+ // Distance of right side of this region to left side of the next region, if the "flipped" flag of this region and the next region
+ // is applied in reverse order as if the zig-zags were flipped.
+ AntPath *next_flipped;
+};
+
+// Matrix of paths (AntPath) connecting ends of MontonousRegions.
+// AntPath lengths and their derived visibilities refer to the length of the perimeter line if such perimeter segment exists.
+class AntPathMatrix
+{
+public:
+ AntPathMatrix(
+ const std::vector<MonotonicRegion> &regions,
+ const ExPolygonWithOffset &poly_with_offset,
+ const std::vector<SegmentedIntersectionLine> &segs,
+ const float initial_pheromone) :
+ m_regions(regions),
+ m_poly_with_offset(poly_with_offset),
+ m_segs(segs),
+ // From end of one region to the start of another region, both flipped or not flipped.
+ m_matrix(regions.size() * regions.size() * 4, AntPath{ -1., -1., initial_pheromone}) {}
+
+ void update_inital_pheromone(float initial_pheromone)
+ {
+ for (AntPath &ap : m_matrix)
+ ap.pheromone = initial_pheromone;
+ }
+
+ AntPath& operator()(const MonotonicRegion &region_from, bool flipped_from, const MonotonicRegion &region_to, bool flipped_to)
+ {
+ int row = 2 * int(&region_from - m_regions.data()) + flipped_from;
+ int col = 2 * int(&region_to - m_regions.data()) + flipped_to;
+ AntPath &path = m_matrix[row * m_regions.size() * 2 + col];
+ if (path.length == -1.) {
+ // This path is accessed for the first time. Update the length and cost.
+ int i_from = region_from.right_intersection_point(flipped_from);
+ int i_to = region_to.left_intersection_point(flipped_to);
+ const SegmentedIntersectionLine &vline_from = m_segs[region_from.right.vline];
+ const SegmentedIntersectionLine &vline_to = m_segs[region_to.left.vline];
+ if (region_from.right.vline + 1 == region_from.left.vline) {
+ int i_right = vline_from.intersections[i_from].right_horizontal();
+ if (i_right == i_to && vline_from.intersections[i_from].next_on_contour_quality == SegmentIntersection::LinkQuality::Valid) {
+ // Measure length along the contour.
+ path.length = unscale<float>(measure_perimeter_horizontal_segment_length(m_poly_with_offset, m_segs, region_from.right.vline, i_from, i_to));
+ }
+ }
+ if (path.length == -1.) {
+ // Just apply the Eucledian distance of the end points.
+ path.length = unscale<float>(Vec2f(vline_to.pos - vline_from.pos, vline_to.intersections[i_to].pos() - vline_from.intersections[i_from].pos()).norm());
+ }
+ path.visibility = 1.f / (path.length + float(EPSILON));
+ }
+ return path;
+ }
+
+ AntPath& operator()(const MonotonicRegionLink &region_from, const MonotonicRegion &region_to, bool flipped_to)
+ { return (*this)(*region_from.region, region_from.flipped, region_to, flipped_to); }
+ AntPath& operator()(const MonotonicRegion &region_from, bool flipped_from, const MonotonicRegionLink &region_to)
+ { return (*this)(region_from, flipped_from, *region_to.region, region_to.flipped); }
+ AntPath& operator()(const MonotonicRegionLink &region_from, const MonotonicRegionLink &region_to)
+ { return (*this)(*region_from.region, region_from.flipped, *region_to.region, region_to.flipped); }
+
+private:
+ // Source regions, used for addressing and updating m_matrix.
+ const std::vector<MonotonicRegion> &m_regions;
+ // To calculate the intersection points and contour lengths.
+ const ExPolygonWithOffset &m_poly_with_offset;
+ const std::vector<SegmentedIntersectionLine> &m_segs;
+ // From end of one region to the start of another region, both flipped or not flipped.
+ //FIXME one may possibly use sparse representation of the matrix, likely using hashing.
+ std::vector<AntPath> m_matrix;
+};
+
+static const SegmentIntersection& vertical_run_bottom(const SegmentedIntersectionLine &vline, const SegmentIntersection &start)
+{
+ assert(start.is_inner());
+ const SegmentIntersection *it = &start;
+ // Find the lowest SegmentIntersection::INNER_LOW starting with right.
+ for (;;) {
+ while (it->type != SegmentIntersection::INNER_LOW)
+ -- it;
+ if ((it - 1)->type == SegmentIntersection::INNER_HIGH)
+ -- it;
+ else {
+ int down = it->vertical_down();
+ if (down == -1 || it->vertical_down_quality() != SegmentIntersection::LinkQuality::Valid)
+ break;
+ it = &vline.intersections[down];
+ assert(it->type == SegmentIntersection::INNER_HIGH);
+ }
+ }
+ return *it;
+}
+static SegmentIntersection& vertical_run_bottom(SegmentedIntersectionLine& vline, SegmentIntersection& start)
+{
+ return const_cast<SegmentIntersection&>(vertical_run_bottom(std::as_const(vline), std::as_const(start)));
+}
+
+static const SegmentIntersection& vertical_run_top(const SegmentedIntersectionLine &vline, const SegmentIntersection &start)
+{
+ assert(start.is_inner());
+ const SegmentIntersection *it = &start;
+ // Find the lowest SegmentIntersection::INNER_LOW starting with right.
+ for (;;) {
+ while (it->type != SegmentIntersection::INNER_HIGH)
+ ++ it;
+ if ((it + 1)->type == SegmentIntersection::INNER_LOW)
+ ++ it;
+ else {
+ int up = it->vertical_up();
+ if (up == -1 || it->vertical_up_quality() != SegmentIntersection::LinkQuality::Valid)
+ break;
+ it = &vline.intersections[up];
+ assert(it->type == SegmentIntersection::INNER_LOW);
+ }
+ }
+ return *it;
+}
+static SegmentIntersection& vertical_run_top(SegmentedIntersectionLine& vline, SegmentIntersection& start)
+{
+ return const_cast<SegmentIntersection&>(vertical_run_top(std::as_const(vline), std::as_const(start)));
+}
+
+static SegmentIntersection* overlap_bottom(SegmentIntersection &start, SegmentIntersection &end, SegmentedIntersectionLine &vline_this, SegmentedIntersectionLine &vline_other, SegmentIntersection::Side side)
+{
+ SegmentIntersection *other = nullptr;
+ assert(start.is_inner());
+ assert(end.is_inner());
+ const SegmentIntersection *it = &start;
+ for (;;) {
+ if (it->is_inner()) {
+ int i = it->horizontal(side);
+ if (i != -1) {
+ other = &vline_other.intersections[i];
+ break;
+ }
+ if (it == &end)
+ break;
+ }
+ if (it->type != SegmentIntersection::INNER_HIGH)
+ ++ it;
+ else if ((it + 1)->type == SegmentIntersection::INNER_LOW)
+ ++ it;
+ else {
+ int up = it->vertical_up();
+ if (up == -1 || it->vertical_up_quality() != SegmentIntersection::LinkQuality::Valid)
+ break;
+ it = &vline_this.intersections[up];
+ assert(it->type == SegmentIntersection::INNER_LOW);
+ }
+ }
+ return other == nullptr ? nullptr : &vertical_run_bottom(vline_other, *other);
+}
+
+static SegmentIntersection* overlap_top(SegmentIntersection &start, SegmentIntersection &end, SegmentedIntersectionLine &vline_this, SegmentedIntersectionLine &vline_other, SegmentIntersection::Side side)
+{
+ SegmentIntersection *other = nullptr;
+ assert(start.is_inner());
+ assert(end.is_inner());
+ const SegmentIntersection *it = &end;
+ for (;;) {
+ if (it->is_inner()) {
+ int i = it->horizontal(side);
+ if (i != -1) {
+ other = &vline_other.intersections[i];
+ break;
+ }
+ if (it == &start)
+ break;
+ }
+ if (it->type != SegmentIntersection::INNER_LOW)
+ -- it;
+ else if ((it - 1)->type == SegmentIntersection::INNER_HIGH)
+ -- it;
+ else {
+ int down = it->vertical_down();
+ if (down == -1 || it->vertical_down_quality() != SegmentIntersection::LinkQuality::Valid)
+ break;
+ it = &vline_this.intersections[down];
+ assert(it->type == SegmentIntersection::INNER_HIGH);
+ }
+ }
+ return other == nullptr ? nullptr : &vertical_run_top(vline_other, *other);
+}
+
+static std::pair<SegmentIntersection*, SegmentIntersection*> left_overlap(SegmentIntersection &start, SegmentIntersection &end, SegmentedIntersectionLine &vline_this, SegmentedIntersectionLine &vline_left)
+{
+ std::pair<SegmentIntersection*, SegmentIntersection*> out(nullptr, nullptr);
+ out.first = overlap_bottom(start, end, vline_this, vline_left, SegmentIntersection::Side::Left);
+ if (out.first != nullptr)
+ out.second = overlap_top(start, end, vline_this, vline_left, SegmentIntersection::Side::Left);
+ assert((out.first == nullptr && out.second == nullptr) || out.first < out.second);
+ return out;
+}
+
+static std::pair<SegmentIntersection*, SegmentIntersection*> left_overlap(std::pair<SegmentIntersection*, SegmentIntersection*> &start_end, SegmentedIntersectionLine &vline_this, SegmentedIntersectionLine &vline_left)
+{
+ assert((start_end.first == nullptr) == (start_end.second == nullptr));
+ return start_end.first == nullptr ? start_end : left_overlap(*start_end.first, *start_end.second, vline_this, vline_left);
+}
+
+static std::pair<SegmentIntersection*, SegmentIntersection*> right_overlap(SegmentIntersection &start, SegmentIntersection &end, SegmentedIntersectionLine &vline_this, SegmentedIntersectionLine &vline_right)
+{
+ std::pair<SegmentIntersection*, SegmentIntersection*> out(nullptr, nullptr);
+ out.first = overlap_bottom(start, end, vline_this, vline_right, SegmentIntersection::Side::Right);
+ if (out.first != nullptr)
+ out.second = overlap_top(start, end, vline_this, vline_right, SegmentIntersection::Side::Right);
+ assert((out.first == nullptr && out.second == nullptr) || out.first < out.second);
+ return out;
+}
+
+static std::pair<SegmentIntersection*, SegmentIntersection*> right_overlap(std::pair<SegmentIntersection*, SegmentIntersection*> &start_end, SegmentedIntersectionLine &vline_this, SegmentedIntersectionLine &vline_right)
+{
+ assert((start_end.first == nullptr) == (start_end.second == nullptr));
+ return start_end.first == nullptr ? start_end : right_overlap(*start_end.first, *start_end.second, vline_this, vline_right);
+}
+
+static std::vector<MonotonicRegion> generate_montonous_regions(std::vector<SegmentedIntersectionLine> &segs)
+{
+ std::vector<MonotonicRegion> monotonic_regions;
+
+#ifndef NDEBUG
+ #define SLIC3R_DEBUG_MONOTONOUS_REGIONS
+#endif
+
+#ifdef SLIC3R_DEBUG_MONOTONOUS_REGIONS
+ std::vector<std::vector<std::pair<int, int>>> consumed(segs.size());
+ auto test_overlap = [&consumed](int segment, int low, int high) {
+ for (const std::pair<int, int>& interval : consumed[segment])
+ if ((low >= interval.first && low <= interval.second) ||
+ (interval.first >= low && interval.first <= high))
+ return true;
+ consumed[segment].emplace_back(low, high);
+ return false;
+ };
+#else
+ auto test_overlap = [](int, int, int) { return false; };
+#endif
+
+ for (int i_vline_seed = 0; i_vline_seed < int(segs.size()); ++ i_vline_seed) {
+ SegmentedIntersectionLine &vline_seed = segs[i_vline_seed];
+ for (int i_intersection_seed = 1; i_intersection_seed + 1 < int(vline_seed.intersections.size()); ) {
+ while (i_intersection_seed < int(vline_seed.intersections.size()) &&
+ vline_seed.intersections[i_intersection_seed].type != SegmentIntersection::INNER_LOW)
+ ++ i_intersection_seed;
+ if (i_intersection_seed == int(vline_seed.intersections.size()))
+ break;
+ SegmentIntersection *start = &vline_seed.intersections[i_intersection_seed];
+ SegmentIntersection *end = &end_of_vertical_run(vline_seed, *start);
+ if (! start->consumed_vertical_up) {
+ // Draw a new monotonic region starting with this segment.
+ // while there is only a single right neighbor
+ int i_vline = i_vline_seed;
+ std::pair<SegmentIntersection*, SegmentIntersection*> left(start, end);
+ MonotonicRegion region;
+ region.left.vline = i_vline;
+ region.left.low = int(left.first - vline_seed.intersections.data());
+ region.left.high = int(left.second - vline_seed.intersections.data());
+ region.right = region.left;
+ assert(! test_overlap(region.left.vline, region.left.low, region.left.high));
+ start->consumed_vertical_up = true;
+ int num_lines = 1;
+ while (++ i_vline < int(segs.size())) {
+ SegmentedIntersectionLine &vline_left = segs[i_vline - 1];
+ SegmentedIntersectionLine &vline_right = segs[i_vline];
+ std::pair<SegmentIntersection*, SegmentIntersection*> right = right_overlap(left, vline_left, vline_right);
+ if (right.first == nullptr)
+ // No neighbor at the right side of the current segment.
+ break;
+ SegmentIntersection* right_top_first = &vertical_run_top(vline_right, *right.first);
+ if (right_top_first != right.second)
+ // This segment overlaps with multiple segments at its right side.
+ break;
+ std::pair<SegmentIntersection*, SegmentIntersection*> right_left = left_overlap(right, vline_right, vline_left);
+ if (left != right_left)
+ // Left & right draws don't overlap exclusively, right neighbor segment overlaps with multiple segments at its left.
+ break;
+ region.right.vline = i_vline;
+ region.right.low = int(right.first - vline_right.intersections.data());
+ region.right.high = int(right.second - vline_right.intersections.data());
+ right.first->consumed_vertical_up = true;
+ assert(! test_overlap(region.right.vline, region.right.low, region.right.high));
+ ++ num_lines;
+ left = right;
+ }
+ // Even number of lines makes the infill zig-zag to exit on the other side of the region than where it starts.
+ region.flips = (num_lines & 1) != 0;
+ monotonic_regions.emplace_back(region);
+ }
+ i_intersection_seed = int(end - vline_seed.intersections.data()) + 1;
+ }
+ }
+
+ return monotonic_regions;
+}
+
+#ifdef INFILL_DEBUG_OUTPUT
+static void export_monotonous_regions_to_svg(
+ const ExPolygonWithOffset &poly_with_offset,
+ const std::vector<SegmentedIntersectionLine> &segs,
+ const std::vector<MonotonicRegion> &monotonic_regions,
+ const std::string &path)
+{
+ BoundingBox bbox = get_extents(poly_with_offset.polygons_src);
+ bbox.offset(scale_(3.));
+
+ ::Slic3r::SVG svg(path, bbox);
+ svg.draw(poly_with_offset.polygons_src);
+ svg.draw_outline(poly_with_offset.polygons_src, "green");
+ svg.draw_outline(poly_with_offset.polygons_outer, "green");
+ svg.draw_outline(poly_with_offset.polygons_inner, "green");
+
+ // Draw the infill line candidates in red.
+ for (const SegmentedIntersectionLine &sil : segs) {
+ for (size_t i = 0; i + 1 < sil.intersections.size(); ++ i)
+ if (sil.intersections[i].type == SegmentIntersection::INNER_LOW && sil.intersections[i + 1].type == SegmentIntersection::INNER_HIGH) {
+ Line l(Point(sil.pos, sil.intersections[i].pos()), Point(sil.pos, sil.intersections[i + 1].pos()));
+ svg.draw(l, "blue");
+ } else if (sil.intersections[i].type == SegmentIntersection::INNER_HIGH && sil.intersections[i].has_vertical_up()) {
+ std::string color;
+ const SegmentIntersection *it = &sil.intersections[i];
+ switch (it->vertical_up_quality()) {
+ case SegmentIntersection::LinkQuality::Invalid: color = "red"; break;
+ case SegmentIntersection::LinkQuality::Valid: color = "blue"; break;
+ case SegmentIntersection::LinkQuality::TooLong:
+ default: color = "yellow"; break;
+ }
+ Polyline polyline;
+ polyline.points.push_back({ sil.pos, it->pos() });
+ emit_perimeter_segment_on_vertical_line(poly_with_offset, segs, &sil - segs.data() , it->iContour, it - sil.intersections.data(), it->vertical_up(), polyline, it->has_left_vertical_up());
+ svg.draw(polyline, color, scale_(0.05));
+ }
+ }
+
+ // Draw the monotonic regions.
+ for (const MonotonicRegion &region : monotonic_regions) {
+ auto draw_boundary_line = [&poly_with_offset, &segs, &svg](const MonotonicRegion::Boundary &boundary) {
+ const SegmentedIntersectionLine &sil = segs[boundary.vline];
+ for (size_t i = boundary.low; i < boundary.high; ++ i)
+ if (sil.intersections[i].type == SegmentIntersection::INNER_LOW && sil.intersections[i + 1].type == SegmentIntersection::INNER_HIGH) {
+ Line l(Point(sil.pos, sil.intersections[i].pos()), Point(sil.pos, sil.intersections[i + 1].pos()));
+ svg.draw(l, "red", scale_(0.05));
+ }
+ };
+ draw_boundary_line(region.left);
+ draw_boundary_line(region.right);
+ }
+}
+#endif // INFILL_DEBUG_OUTPUT
+
+// Traverse path, calculate length of the draw for the purpose of optimization.
+// This function is very similar to polylines_from_paths() in the way how it traverses the path, but
+// polylines_from_paths() emits a path, while this function just calculates the path length.
+static float montonous_region_path_length(const MonotonicRegion &region, bool dir, const ExPolygonWithOffset &poly_with_offset, const std::vector<SegmentedIntersectionLine> &segs)
+{
+ // From the initial point (i_vline, i_intersection), follow a path.
+ int i_intersection = region.left_intersection_point(dir);
+ int i_vline = region.left.vline;
+ float total_length = 0.;
+ bool no_perimeter = false;
+ Vec2f last_point;
+
+ for (;;) {
+ const SegmentedIntersectionLine &vline = segs[i_vline];
+ const SegmentIntersection *it = &vline.intersections[i_intersection];
+ const bool going_up = it->is_low();
+
+ if (no_perimeter)
+ total_length += (last_point - Vec2f(vline.pos, (it + (going_up ? - 1 : 1))->pos())).norm();
+
+ int iright = it->right_horizontal();
+ if (going_up) {
+ // Traverse the complete vertical segment up to the inner contour.
+ for (;;) {
+ do {
+ ++ it;
+ iright = std::max(iright, it->right_horizontal());
+ assert(it->is_inner());
+ } while (it->type != SegmentIntersection::INNER_HIGH || (it + 1)->type != SegmentIntersection::OUTER_HIGH);
+ int inext = it->vertical_up();
+ if (inext == -1 || it->vertical_up_quality() != SegmentIntersection::LinkQuality::Valid)
+ break;
+ assert(it->iContour == vline.intersections[inext].iContour);
+ it = vline.intersections.data() + inext;
+ }
+ } else {
+ // Going down.
+ assert(it->is_high());
+ assert(i_intersection > 0);
+ for (;;) {
+ do {
+ -- it;
+ if (int iright_new = it->right_horizontal(); iright_new != -1)
+ iright = iright_new;
+ assert(it->is_inner());
+ } while (it->type != SegmentIntersection::INNER_LOW || (it - 1)->type != SegmentIntersection::OUTER_LOW);
+ int inext = it->vertical_down();
+ if (inext == -1 || it->vertical_down_quality() != SegmentIntersection::LinkQuality::Valid)
+ break;
+ assert(it->iContour == vline.intersections[inext].iContour);
+ it = vline.intersections.data() + inext;
+ }
+ }
+
+ if (i_vline == region.right.vline)
+ break;
+
+ int inext = it->right_horizontal();
+ assert(iright != -1);
+ assert(inext == -1 || inext == iright);
+
+ // Find the end of the next overlapping vertical segment.
+ const SegmentedIntersectionLine &vline_right = segs[i_vline + 1];
+ const SegmentIntersection *right = going_up ?
+ &vertical_run_top(vline_right, vline_right.intersections[iright]) : &vertical_run_bottom(vline_right, vline_right.intersections[iright]);
+ i_intersection = int(right - vline_right.intersections.data());
+
+ if (inext == i_intersection && it->next_on_contour_quality == SegmentIntersection::LinkQuality::Valid) {
+ // Summarize length of the connection line along the perimeter.
+ //FIXME should it be weighted with a lower weight than non-extruding connection line? What weight?
+ // Taking half of the length.
+ total_length += 0.5f * float(measure_perimeter_horizontal_segment_length(poly_with_offset, segs, i_vline, it - vline.intersections.data(), inext));
+ // Don't add distance to the next vertical line start to the total length.
+ no_perimeter = false;
+ } else {
+ // Finish the current vertical line,
+ going_up ? ++ it : -- it;
+ assert(it->is_outer());
+ assert(it->is_high() == going_up);
+ // Mark the end of this vertical line.
+ last_point = Vec2f(vline.pos, it->pos());
+ // Remember to add distance to the last point.
+ no_perimeter = true;
+ }
+
+ ++ i_vline;
+ }
+
+ return unscale<float>(total_length);
+}
+
+static void connect_monotonic_regions(std::vector<MonotonicRegion> &regions, const ExPolygonWithOffset &poly_with_offset, std::vector<SegmentedIntersectionLine> &segs)
+{
+ // Map from low intersection to left / right side of a monotonic region.
+ using MapType = std::pair<SegmentIntersection*, MonotonicRegion*>;
+ std::vector<MapType> map_intersection_to_region_start;
+ std::vector<MapType> map_intersection_to_region_end;
+ map_intersection_to_region_start.reserve(regions.size());
+ map_intersection_to_region_end.reserve(regions.size());
+ for (MonotonicRegion &region : regions) {
+ map_intersection_to_region_start.emplace_back(&segs[region.left.vline].intersections[region.left.low], &region);
+ map_intersection_to_region_end.emplace_back(&segs[region.right.vline].intersections[region.right.low], &region);
+ }
+ auto intersections_lower = [](const MapType &l, const MapType &r){ return l.first < r.first ; };
+ auto intersections_equal = [](const MapType &l, const MapType &r){ return l.first == r.first ; };
+ std::sort(map_intersection_to_region_start.begin(), map_intersection_to_region_start.end(), intersections_lower);
+ std::sort(map_intersection_to_region_end.begin(), map_intersection_to_region_end.end(), intersections_lower);
+
+ // Scatter links to neighboring regions.
+ for (MonotonicRegion &region : regions) {
+ if (region.left.vline > 0) {
+ auto &vline = segs[region.left.vline];
+ auto &vline_left = segs[region.left.vline - 1];
+ auto[lbegin, lend] = left_overlap(vline.intersections[region.left.low], vline.intersections[region.left.high], vline, vline_left);
+ if (lbegin != nullptr) {
+ for (;;) {
+ MapType key(lbegin, nullptr);
+ auto it = std::lower_bound(map_intersection_to_region_end.begin(), map_intersection_to_region_end.end(), key);
+ assert(it != map_intersection_to_region_end.end() && it->first == key.first);
+ it->second->right_neighbors.emplace_back(&region);
+ SegmentIntersection *lnext = &vertical_run_top(vline_left, *lbegin);
+ if (lnext == lend)
+ break;
+ while (lnext->type != SegmentIntersection::INNER_LOW)
+ ++ lnext;
+ lbegin = lnext;
+ }
+ }
+ }
+ if (region.right.vline + 1 < int(segs.size())) {
+ auto &vline = segs[region.right.vline];
+ auto &vline_right = segs[region.right.vline + 1];
+ auto [rbegin, rend] = right_overlap(vline.intersections[region.right.low], vline.intersections[region.right.high], vline, vline_right);
+ if (rbegin != nullptr) {
+ for (;;) {
+ MapType key(rbegin, nullptr);
+ auto it = std::lower_bound(map_intersection_to_region_start.begin(), map_intersection_to_region_start.end(), key);
+ assert(it != map_intersection_to_region_start.end() && it->first == key.first);
+ it->second->left_neighbors.emplace_back(&region);
+ SegmentIntersection *rnext = &vertical_run_top(vline_right, *rbegin);
+ if (rnext == rend)
+ break;
+ while (rnext->type != SegmentIntersection::INNER_LOW)
+ ++ rnext;
+ rbegin = rnext;
+ }
+ }
+ }
+ }
+
+ // Sometimes a segment may indicate that it connects to a segment on the other side while the other does not.
+ // This may be a valid case if one side contains runs of OUTER_LOW, INNER_LOW, {INNER_HIGH, INNER_LOW}*, INNER_HIGH, OUTER_HIGH,
+ // where the part in the middle does not connect to the other side, but it will be extruded through.
+ for (MonotonicRegion &region : regions) {
+ std::sort(region.left_neighbors.begin(), region.left_neighbors.end());
+ std::sort(region.right_neighbors.begin(), region.right_neighbors.end());
+ }
+ for (MonotonicRegion &region : regions) {
+ for (MonotonicRegion *neighbor : region.left_neighbors) {
+ auto it = std::lower_bound(neighbor->right_neighbors.begin(), neighbor->right_neighbors.end(), &region);
+ if (it == neighbor->right_neighbors.end() || *it != &region)
+ neighbor->right_neighbors.insert(it, &region);
+ }
+ for (MonotonicRegion *neighbor : region.right_neighbors) {
+ auto it = std::lower_bound(neighbor->left_neighbors.begin(), neighbor->left_neighbors.end(), &region);
+ if (it == neighbor->left_neighbors.end() || *it != &region)
+ neighbor->left_neighbors.insert(it, &region);
+ }
+ }
+
+#ifndef NDEBUG
+ // Verify symmetry of the left_neighbors / right_neighbors.
+ for (MonotonicRegion &region : regions) {
+ for (MonotonicRegion *neighbor : region.left_neighbors) {
+ assert(std::count(region.left_neighbors.begin(), region.left_neighbors.end(), neighbor) == 1);
+ assert(std::find(neighbor->right_neighbors.begin(), neighbor->right_neighbors.end(), &region) != neighbor->right_neighbors.end());
+ }
+ for (MonotonicRegion *neighbor : region.right_neighbors) {
+ assert(std::count(region.right_neighbors.begin(), region.right_neighbors.end(), neighbor) == 1);
+ assert(std::find(neighbor->left_neighbors.begin(), neighbor->left_neighbors.end(), &region) != neighbor->left_neighbors.end());
+ }
+ }
+#endif /* NDEBUG */
+
+ // Fill in sum length of connecting lines of a region. This length is used for optimizing the infill path for minimum length.
+ for (MonotonicRegion &region : regions) {
+ region.len1 = montonous_region_path_length(region, false, poly_with_offset, segs);
+ region.len2 = montonous_region_path_length(region, true, poly_with_offset, segs);
+ // Subtract the smaller length from the longer one, so we will optimize just with the positive difference of the two.
+ if (region.len1 > region.len2) {
+ region.len1 -= region.len2;
+ region.len2 = 0;
+ } else {
+ region.len2 -= region.len1;
+ region.len1 = 0;
+ }
+ }
+}
+
+// Raad Salman: Algorithms for the Precedence Constrained Generalized Travelling Salesperson Problem
+// https://www.chalmers.se/en/departments/math/research/research-groups/optimization/OptimizationMasterTheses/MScThesis-RaadSalman-final.pdf
+// Algorithm 6.1 Lexicographic Path Preserving 3-opt
+// Optimize path while maintaining the ordering constraints.
+void monotonic_3_opt(std::vector<MonotonicRegionLink> &path, const std::vector<SegmentedIntersectionLine> &segs)
+{
+ // When doing the 3-opt path preserving flips, one has to fulfill two constraints:
+ //
+ // 1) The new path should be shorter than the old path.
+ // 2) The precedence constraints shall be satisified on the new path.
+ //
+ // Branch & bound with KD-tree may be used with the shorter path constraint, but the precedence constraint will have to be recalculated for each
+ // shorter path candidate found, which has a quadratic cost for a dense precedence graph. For a sparse precedence graph the precedence
+ // constraint verification will be cheaper.
+ //
+ // On the other side, if the full search space is traversed as in the diploma thesis by Raad Salman (page 24, Algorithm 6.1 Lexicographic Path Preserving 3-opt),
+ // then the precedence constraint verification is amortized inside the O(n^3) loop. Now which is better for our task?
+ //
+ // It is beneficial to also try flipping of the infill zig-zags, for which a prefix sum of both flipped and non-flipped paths over
+ // MonotonicRegionLinks may be utilized, however updating the prefix sum has a linear complexity, the same complexity as doing the 3-opt
+ // exchange by copying the pieces.
+}
+
+// #define SLIC3R_DEBUG_ANTS
+
+template<typename... TArgs>
+inline void print_ant(const std::string& fmt, TArgs&&... args) {
+#ifdef SLIC3R_DEBUG_ANTS
+ std::cout << Slic3r::format(fmt, std::forward<TArgs>(args)...) << std::endl;
+#endif
+}
+
+// Find a run through monotonic infill blocks using an 'Ant colony" optimization method.
+// http://www.scholarpedia.org/article/Ant_colony_optimization
+static std::vector<MonotonicRegionLink> chain_monotonic_regions(
+ std::vector<MonotonicRegion> &regions, const ExPolygonWithOffset &poly_with_offset, const std::vector<SegmentedIntersectionLine> &segs, std::mt19937_64 &rng)
+{
+ // Number of left neighbors (regions that this region depends on, this region cannot be printed before the regions left of it are printed) + self.
+ std::vector<int32_t> left_neighbors_unprocessed(regions.size(), 1);
+ // Queue of regions, which have their left neighbors already printed.
+ std::vector<MonotonicRegion*> queue;
+ queue.reserve(regions.size());
+ for (MonotonicRegion &region : regions)
+ if (region.left_neighbors.empty())
+ queue.emplace_back(&region);
+ else
+ left_neighbors_unprocessed[&region - regions.data()] += int(region.left_neighbors.size());
+ // Make copy of structures that need to be initialized at each ant iteration.
+ auto left_neighbors_unprocessed_initial = left_neighbors_unprocessed;
+ auto queue_initial = queue;
+
+ std::vector<MonotonicRegionLink> path, best_path;
+ path.reserve(regions.size());
+ best_path.reserve(regions.size());
+ float best_path_length = std::numeric_limits<float>::max();
+
+ struct NextCandidate {
+ MonotonicRegion *region;
+ AntPath *link;
+ AntPath *link_flipped;
+ float probability;
+ bool dir;
+ };
+ std::vector<NextCandidate> next_candidates;
+
+ auto validate_unprocessed =
+#ifdef NDEBUG
+ []() { return true; };
+#else
+ [&regions, &left_neighbors_unprocessed, &path, &queue]() {
+ std::vector<unsigned char> regions_processed(regions.size(), false);
+ std::vector<unsigned char> regions_in_queue(regions.size(), false);
+ for (const MonotonicRegion *region : queue) {
+ // This region is not processed yet, his predecessors are processed.
+ assert(left_neighbors_unprocessed[region - regions.data()] == 1);
+ regions_in_queue[region - regions.data()] = true;
+ }
+ for (const MonotonicRegionLink &link : path) {
+ assert(left_neighbors_unprocessed[link.region - regions.data()] == 0);
+ regions_processed[link.region - regions.data()] = true;
+ }
+ for (size_t i = 0; i < regions_processed.size(); ++ i) {
+ assert(! regions_processed[i] || ! regions_in_queue[i]);
+ const MonotonicRegion &region = regions[i];
+ if (regions_processed[i] || regions_in_queue[i]) {
+ assert(left_neighbors_unprocessed[i] == (regions_in_queue[i] ? 1 : 0));
+ // All left neighbors should be processed already.
+ for (const MonotonicRegion *left : region.left_neighbors) {
+ assert(regions_processed[left - regions.data()]);
+ assert(left_neighbors_unprocessed[left - regions.data()] == 0);
+ }
+ } else {
+ // Some left neihgbor should not be processed yet.
+ assert(left_neighbors_unprocessed[i] > 1);
+ size_t num_predecessors_unprocessed = 0;
+ bool has_left_last_on_path = false;
+ for (const MonotonicRegion* left : region.left_neighbors) {
+ size_t iprev = left - regions.data();
+ if (regions_processed[iprev]) {
+ assert(left_neighbors_unprocessed[iprev] == 0);
+ if (left == path.back().region) {
+ // This region should actually be on queue, but to optimize the queue management
+ // this item will be processed in the next round by traversing path.back().region->right_neighbors before processing the queue.
+ assert(! has_left_last_on_path);
+ has_left_last_on_path = true;
+ ++ num_predecessors_unprocessed;
+ }
+ } else {
+ if (regions_in_queue[iprev])
+ assert(left_neighbors_unprocessed[iprev] == 1);
+ else
+ assert(left_neighbors_unprocessed[iprev] > 1);
+ ++ num_predecessors_unprocessed;
+ }
+ }
+ assert(num_predecessors_unprocessed > 0);
+ assert(left_neighbors_unprocessed[i] == num_predecessors_unprocessed + 1);
+ }
+ }
+ return true;
+ };
+#endif /* NDEBUG */
+
+ // How many times to repeat the ant simulation (number of ant generations).
+ constexpr int num_rounds = 25;
+ // 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(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.
+ constexpr float pheromone_evaporation = 0.1f;
+ // Evaporation rate to diversify paths taken by individual ants.
+ constexpr float pheromone_diversification = 0.1f;
+ // Probability at which to take the next best path. Otherwise take the the path based on the cost distribution.
+ constexpr float probability_take_best = 0.9f;
+ // Exponents of the cost function.
+ constexpr float pheromone_alpha = 1.f; // pheromone exponent
+ constexpr float pheromone_beta = 2.f; // attractiveness weighted towards edge length
+
+ AntPathMatrix path_matrix(regions, poly_with_offset, segs, pheromone_initial_deposit);
+
+ // Find an initial path in a greedy way, set the initial pheromone value to 10% of the cost of the greedy path.
+ {
+ // Construct the first path in a greedy way to calculate an initial value of the pheromone value.
+ queue = queue_initial;
+ left_neighbors_unprocessed = left_neighbors_unprocessed_initial;
+ assert(validate_unprocessed());
+ // Pick the last of the queue.
+ MonotonicRegionLink path_end { queue.back(), false };
+ queue.pop_back();
+ -- left_neighbors_unprocessed[path_end.region - regions.data()];
+
+ float total_length = path_end.region->length(false);
+ while (! queue.empty() || ! path_end.region->right_neighbors.empty()) {
+ // Chain.
+ MonotonicRegion &region = *path_end.region;
+ bool dir = path_end.flipped;
+ NextCandidate next_candidate;
+ next_candidate.probability = 0;
+ for (MonotonicRegion *next : region.right_neighbors) {
+ int &unprocessed = left_neighbors_unprocessed[next - regions.data()];
+ assert(unprocessed > 1);
+ if (left_neighbors_unprocessed[next - regions.data()] == 2) {
+ // Dependencies of the successive blocks are satisfied.
+ AntPath &path1 = path_matrix(region, dir, *next, false);
+ AntPath &path2 = path_matrix(region, dir, *next, true);
+ if (path1.visibility > next_candidate.probability)
+ next_candidate = { next, &path1, &path1, path1.visibility, false };
+ if (path2.visibility > next_candidate.probability)
+ next_candidate = { next, &path2, &path2, path2.visibility, true };
+ }
+ }
+ bool from_queue = next_candidate.probability == 0;
+ if (from_queue) {
+ for (MonotonicRegion *next : queue) {
+ AntPath &path1 = path_matrix(region, dir, *next, false);
+ AntPath &path2 = path_matrix(region, dir, *next, true);
+ if (path1.visibility > next_candidate.probability)
+ next_candidate = { next, &path1, &path1, path1.visibility, false };
+ if (path2.visibility > next_candidate.probability)
+ next_candidate = { next, &path2, &path2, path2.visibility, true };
+ }
+ }
+ // Move the other right neighbors with satisified constraints to the queue.
+ for (MonotonicRegion *next : region.right_neighbors)
+ if (-- left_neighbors_unprocessed[next - regions.data()] == 1 && next_candidate.region != next)
+ queue.emplace_back(next);
+ if (from_queue) {
+ // Remove the selected path from the queue.
+ auto it = std::find(queue.begin(), queue.end(), next_candidate.region);
+ assert(it != queue.end());
+ *it = queue.back();
+ queue.pop_back();
+ }
+ // Extend the path.
+ MonotonicRegion *next_region = next_candidate.region;
+ bool next_dir = next_candidate.dir;
+ total_length += next_region->length(next_dir) + path_matrix(*path_end.region, path_end.flipped, *next_region, next_dir).length;
+ path_end = { next_region, next_dir };
+ assert(left_neighbors_unprocessed[next_region - regions.data()] == 1);
+ left_neighbors_unprocessed[next_region - regions.data()] = 0;
+ }
+
+ // Set an initial pheromone value to 10% of the greedy path's value.
+ pheromone_initial_deposit = 0.1f / total_length;
+ path_matrix.update_inital_pheromone(pheromone_initial_deposit);
+ }
+
+ // Probability (unnormalized) of traversing a link between two monotonic regions.
+ auto path_probability = [pheromone_alpha, pheromone_beta](AntPath &path) {
+ return pow(path.pheromone, pheromone_alpha) * pow(path.visibility, pheromone_beta);
+ };
+
+#ifdef SLIC3R_DEBUG_ANTS
+ static int irun = 0;
+ ++ irun;
+#endif /* SLIC3R_DEBUG_ANTS */
+
+ int num_rounds_no_change = 0;
+ for (int round = 0; round < num_rounds && num_rounds_no_change < num_rounds_no_change_exit; ++ round)
+ {
+ bool improved = false;
+ for (int ant = 0; ant < num_ants; ++ ant)
+ {
+ // Find a new path following the pheromones deposited by the previous ants.
+ print_ant("Round %1% ant %2%", round, ant);
+ path.clear();
+ queue = queue_initial;
+ left_neighbors_unprocessed = left_neighbors_unprocessed_initial;
+ assert(validate_unprocessed());
+ // Pick randomly the first from the queue at random orientation.
+ //FIXME picking the 1st monotonic region should likely be done based on accumulated pheromone level as well,
+ // but the inefficiency caused by the random pick of the 1st monotonic region is likely insignificant.
+ int first_idx = std::uniform_int_distribution<>(0, int(queue.size()) - 1)(rng);
+ path.emplace_back(MonotonicRegionLink{ queue[first_idx], rng() > rng.max() / 2 });
+ *(queue.begin() + first_idx) = std::move(queue.back());
+ queue.pop_back();
+ -- left_neighbors_unprocessed[path.back().region - regions.data()];
+ assert(left_neighbors_unprocessed[path.back().region - regions.data()] == 0);
+ assert(validate_unprocessed());
+ print_ant("\tRegion (%1%:%2%,%3%) (%4%:%5%,%6%)",
+ path.back().region->left.vline,
+ path.back().flipped ? path.back().region->left.high : path.back().region->left.low,
+ path.back().flipped ? path.back().region->left.low : path.back().region->left.high,
+ path.back().region->right.vline,
+ path.back().flipped == path.back().region->flips ? path.back().region->right.high : path.back().region->right.low,
+ path.back().flipped == path.back().region->flips ? path.back().region->right.low : path.back().region->right.high);
+
+ while (! queue.empty() || ! path.back().region->right_neighbors.empty()) {
+ // Chain.
+ MonotonicRegion &region = *path.back().region;
+ bool dir = path.back().flipped;
+ // Sort by distance to pt.
+ next_candidates.clear();
+ next_candidates.reserve(region.right_neighbors.size() * 2);
+ for (MonotonicRegion *next : region.right_neighbors) {
+ int &unprocessed = left_neighbors_unprocessed[next - regions.data()];
+ assert(unprocessed > 1);
+ if (-- unprocessed == 1) {
+ // Dependencies of the successive blocks are satisfied.
+ AntPath &path1 = path_matrix(region, dir, *next, false);
+ AntPath &path1_flipped = path_matrix(region, ! dir, *next, true);
+ AntPath &path2 = path_matrix(region, dir, *next, true);
+ AntPath &path2_flipped = path_matrix(region, ! dir, *next, false);
+ next_candidates.emplace_back(NextCandidate{ next, &path1, &path1_flipped, path_probability(path1), false });
+ next_candidates.emplace_back(NextCandidate{ next, &path2, &path2_flipped, path_probability(path2), true });
+ }
+ }
+ size_t num_direct_neighbors = next_candidates.size();
+ //FIXME add the queue items to the candidates? These are valid moves as well.
+ if (num_direct_neighbors == 0) {
+ // Add the queue candidates.
+ for (MonotonicRegion *next : queue) {
+ assert(left_neighbors_unprocessed[next - regions.data()] == 1);
+ AntPath &path1 = path_matrix(region, dir, *next, false);
+ AntPath &path1_flipped = path_matrix(region, ! dir, *next, true);
+ AntPath &path2 = path_matrix(region, dir, *next, true);
+ AntPath &path2_flipped = path_matrix(region, ! dir, *next, false);
+ next_candidates.emplace_back(NextCandidate{ next, &path1, &path1_flipped, path_probability(path1), false });
+ next_candidates.emplace_back(NextCandidate{ next, &path2, &path2_flipped, path_probability(path2), true });
+ }
+ }
+ float dice = float(rng()) / float(rng.max());
+ std::vector<NextCandidate>::iterator take_path;
+ if (dice < probability_take_best) {
+ // Take the highest probability path.
+ take_path = std::max_element(next_candidates.begin(), next_candidates.end(), [](auto &l, auto &r){ return l.probability < r.probability; });
+ print_ant("\tTaking best path at probability %1% below %2%", dice, probability_take_best);
+ } else {
+ // Take the path based on the probability.
+ // Calculate the total probability.
+ float total_probability = std::accumulate(next_candidates.begin(), next_candidates.end(), 0.f, [](const float l, const NextCandidate& r) { return l + r.probability; });
+ // Take a random path based on the probability.
+ float probability_threshold = float(rng()) * total_probability / float(rng.max());
+ take_path = next_candidates.end();
+ -- take_path;
+ for (auto it = next_candidates.begin(); it < next_candidates.end(); ++ it)
+ if ((probability_threshold -= it->probability) <= 0.) {
+ take_path = it;
+ break;
+ }
+ print_ant("\tTaking path at probability threshold %1% of %2%", probability_threshold, total_probability);
+ }
+ // Move the other right neighbors with satisified constraints to the queue.
+ for (std::vector<NextCandidate>::iterator it_next_candidate = next_candidates.begin(); it_next_candidate != next_candidates.begin() + num_direct_neighbors; ++ it_next_candidate)
+ if ((queue.empty() || it_next_candidate->region != queue.back()) && it_next_candidate->region != take_path->region)
+ queue.emplace_back(it_next_candidate->region);
+ if (size_t(take_path - next_candidates.begin()) >= num_direct_neighbors) {
+ // Remove the selected path from the queue.
+ auto it = std::find(queue.begin(), queue.end(), take_path->region);
+ assert(it != queue.end());
+ *it = queue.back();
+ queue.pop_back();
+ }
+ // Extend the path.
+ MonotonicRegion *next_region = take_path->region;
+ bool next_dir = take_path->dir;
+ path.back().next = take_path->link;
+ path.back().next_flipped = take_path->link_flipped;
+ path.emplace_back(MonotonicRegionLink{ next_region, next_dir });
+ assert(left_neighbors_unprocessed[next_region - regions.data()] == 1);
+ left_neighbors_unprocessed[next_region - regions.data()] = 0;
+ print_ant("\tRegion (%1%:%2%,%3%) (%4%:%5%,%6%) length to prev %7%",
+ next_region->left.vline,
+ next_dir ? next_region->left.high : next_region->left.low,
+ next_dir ? next_region->left.low : next_region->left.high,
+ next_region->right.vline,
+ next_dir == next_region->flips ? next_region->right.high : next_region->right.low,
+ next_dir == next_region->flips ? next_region->right.low : next_region->right.high,
+ take_path->link->length);
+
+ print_ant("\tRegion (%1%:%2%,%3%) (%4%:%5%,%6%)",
+ path.back().region->left.vline,
+ path.back().flipped ? path.back().region->left.high : path.back().region->left.low,
+ path.back().flipped ? path.back().region->left.low : path.back().region->left.high,
+ path.back().region->right.vline,
+ path.back().flipped == path.back().region->flips ? path.back().region->right.high : path.back().region->right.low,
+ path.back().flipped == path.back().region->flips ? path.back().region->right.low : path.back().region->right.high);
+
+ // Update pheromones along this link, see Ant Colony System (ACS) update rule.
+ // http://www.scholarpedia.org/article/Ant_colony_optimization
+ // The goal here is to lower the pheromone trace for paths taken to diversify the next path picked in the same batch of ants.
+ take_path->link->pheromone = (1.f - pheromone_diversification) * take_path->link->pheromone + pheromone_diversification * pheromone_initial_deposit;
+ assert(validate_unprocessed());
+ }
+
+ // Perform 3-opt local optimization of the path.
+ monotonic_3_opt(path, segs);
+
+ // Measure path length.
+ assert(! path.empty());
+ float path_length = std::accumulate(path.begin(), path.end() - 1,
+ path.back().region->length(path.back().flipped),
+ [&path_matrix](const float l, const MonotonicRegionLink &r) {
+ const MonotonicRegionLink &next = *(&r + 1);
+ return l + r.region->length(r.flipped) + path_matrix(*r.region, r.flipped, *next.region, next.flipped).length;
+ });
+ // Save the shortest path.
+ print_ant("\tThis length: %1%, shortest length: %2%", path_length, best_path_length);
+ if (path_length < best_path_length) {
+ best_path_length = path_length;
+ std::swap(best_path, path);
+#if 0 // #if ! defined(SLIC3R_DEBUG_ANTS) && ! defined(ndebug)
+ if (round == 0 && ant == 0)
+ std::cout << std::endl;
+ std::cout << Slic3r::format("round %1% ant %2% path length %3%", round, ant, path_length) << std::endl;
+#endif
+ if (path_length == 0)
+ // Perfect path found.
+ goto end;
+ improved = true;
+ }
+ }
+
+ // Reinforce the path pheromones with the best path.
+ float total_cost = best_path_length + float(EPSILON);
+ for (size_t i = 0; i + 1 < path.size(); ++ i) {
+ MonotonicRegionLink &link = path[i];
+ link.next->pheromone = (1.f - pheromone_evaporation) * link.next->pheromone + pheromone_evaporation / total_cost;
+ }
+
+ if (improved)
+ num_rounds_no_change = 0;
+ else
+ ++ num_rounds_no_change;
+ }
+
+end:
+ return best_path;
+}
+
+// Traverse path, produce polylines.
+static void polylines_from_paths(const std::vector<MonotonicRegionLink> &path, const ExPolygonWithOffset &poly_with_offset, const std::vector<SegmentedIntersectionLine> &segs, Polylines &polylines_out)
+{
+ Polyline *polyline = nullptr;
+ auto finish_polyline = [&polyline, &polylines_out]() {
+ polyline->remove_duplicate_points();
+ // Handle duplicate points and zero length segments.
+ assert(!polyline->has_duplicate_points());
+ // Handle nearly zero length edges.
+ if (polyline->points.size() <= 1 ||
+ (polyline->points.size() == 2 &&
+ std::abs(polyline->points.front().x() - polyline->points.back().x()) < SCALED_EPSILON &&
+ std::abs(polyline->points.front().y() - polyline->points.back().y()) < SCALED_EPSILON))
+ polylines_out.pop_back();
+ else if (polylines_out.size() >= 2) {
+ assert(polyline->points.size() >= 2);
+ // Merge the two last polylines. An extrusion may have been split by an introduction of phony outer points on intersection lines
+ // to cope with pinching of inner offset contours.
+ Polyline &pl_prev = polylines_out[polylines_out.size() - 2];
+ if (std::abs(polyline->points.front().x() - pl_prev.points.back().x()) < SCALED_EPSILON &&
+ std::abs(polyline->points.front().y() - pl_prev.points.back().y()) < SCALED_EPSILON) {
+ pl_prev.points.back() = (pl_prev.points.back() + polyline->points.front()) / 2;
+ pl_prev.points.insert(pl_prev.points.end(), polyline->points.begin() + 1, polyline->points.end());
+ polylines_out.pop_back();
+ }
+ }
+ polyline = nullptr;
+ };
+
+ for (const MonotonicRegionLink &path_segment : path) {
+ MonotonicRegion &region = *path_segment.region;
+ bool dir = path_segment.flipped;
+
+ // From the initial point (i_vline, i_intersection), follow a path.
+ int i_intersection = region.left_intersection_point(dir);
+ int i_vline = region.left.vline;
+
+ if (polyline != nullptr && &path_segment != path.data()) {
+ // Connect previous path segment with the new one.
+ const MonotonicRegionLink &path_segment_prev = *(&path_segment - 1);
+ const MonotonicRegion &region_prev = *path_segment_prev.region;
+ bool dir_prev = path_segment_prev.flipped;
+ int i_vline_prev = region_prev.right.vline;
+ const SegmentedIntersectionLine &vline_prev = segs[i_vline_prev];
+ int i_intersection_prev = region_prev.right_intersection_point(dir_prev);
+ const SegmentIntersection *ip_prev = &vline_prev.intersections[i_intersection_prev];
+ bool extended = false;
+ if (i_vline_prev + 1 == i_vline) {
+ if (ip_prev->right_horizontal() == i_intersection && ip_prev->next_on_contour_quality == SegmentIntersection::LinkQuality::Valid) {
+ // Emit a horizontal connection contour.
+ emit_perimeter_prev_next_segment(poly_with_offset, segs, i_vline_prev, ip_prev->iContour, i_intersection_prev, i_intersection, *polyline, true);
+ extended = true;
+ }
+ }
+ if (! extended) {
+ // Finish the current vertical line,
+ assert(ip_prev->is_inner());
+ ip_prev->is_low() ? -- ip_prev : ++ ip_prev;
+ assert(ip_prev->is_outer());
+ polyline->points.back() = Point(vline_prev.pos, ip_prev->pos());
+ finish_polyline();
+ }
+ }
+
+ for (;;) {
+ const SegmentedIntersectionLine &vline = segs[i_vline];
+ const SegmentIntersection *it = &vline.intersections[i_intersection];
+ const bool going_up = it->is_low();
+ if (polyline == nullptr) {
+ polylines_out.emplace_back();
+ polyline = &polylines_out.back();
+ // Extend the infill line up to the outer contour.
+ polyline->points.emplace_back(vline.pos, (it + (going_up ? - 1 : 1))->pos());
+ } else
+ polyline->points.emplace_back(vline.pos, it->pos());
+
+ int iright = it->right_horizontal();
+ if (going_up) {
+ // Consume the complete vertical segment up to the inner contour.
+ for (;;) {
+ do {
+ ++ it;
+ iright = std::max(iright, it->right_horizontal());
+ assert(it->is_inner());
+ } while (it->type != SegmentIntersection::INNER_HIGH || (it + 1)->type != SegmentIntersection::OUTER_HIGH);
+ polyline->points.emplace_back(vline.pos, it->pos());
+ int inext = it->vertical_up();
+ if (inext == -1 || it->vertical_up_quality() != SegmentIntersection::LinkQuality::Valid)
+ break;
+ assert(it->iContour == vline.intersections[inext].iContour);
+ emit_perimeter_segment_on_vertical_line(poly_with_offset, segs, i_vline, it->iContour, it - vline.intersections.data(), inext, *polyline, it->has_left_vertical_up());
+ it = vline.intersections.data() + inext;
+ }
+ } else {
+ // Going down.
+ assert(it->is_high());
+ assert(i_intersection > 0);
+ for (;;) {
+ do {
+ -- it;
+ if (int iright_new = it->right_horizontal(); iright_new != -1)
+ iright = iright_new;
+ assert(it->is_inner());
+ } while (it->type != SegmentIntersection::INNER_LOW || (it - 1)->type != SegmentIntersection::OUTER_LOW);
+ polyline->points.emplace_back(vline.pos, it->pos());
+ int inext = it->vertical_down();
+ if (inext == -1 || it->vertical_down_quality() != SegmentIntersection::LinkQuality::Valid)
+ break;
+ assert(it->iContour == vline.intersections[inext].iContour);
+ emit_perimeter_segment_on_vertical_line(poly_with_offset, segs, i_vline, it->iContour, it - vline.intersections.data(), inext, *polyline, it->has_right_vertical_down());
+ it = vline.intersections.data() + inext;
+ }
+ }
+
+ if (i_vline == region.right.vline)
+ break;
+
+ int inext = it->right_horizontal();
+ assert(iright != -1);
+ assert(inext == -1 || inext == iright);
+
+ // Find the end of the next overlapping vertical segment.
+ const SegmentedIntersectionLine &vline_right = segs[i_vline + 1];
+ const SegmentIntersection *right = going_up ?
+ &vertical_run_top(vline_right, vline_right.intersections[iright]) : &vertical_run_bottom(vline_right, vline_right.intersections[iright]);
+ i_intersection = int(right - vline_right.intersections.data());
+
+ if (inext == i_intersection && it->next_on_contour_quality == SegmentIntersection::LinkQuality::Valid) {
+ // Emit a horizontal connection contour.
+ emit_perimeter_prev_next_segment(poly_with_offset, segs, i_vline, it->iContour, it - vline.intersections.data(), inext, *polyline, true);
+ } else {
+ // Finish the current vertical line,
+ going_up ? ++ it : -- it;
+ assert(it->is_outer());
+ assert(it->is_high() == going_up);
+ polyline->points.back() = Point(vline.pos, it->pos());
+ finish_polyline();
+ }
+
+ ++ i_vline;
+ }
+ }
+
+ if (polyline != nullptr) {
+ // Finish the current vertical line,
+ const MonotonicRegion &region = *path.back().region;
+ const SegmentedIntersectionLine &vline = segs[region.right.vline];
+ const SegmentIntersection *ip = &vline.intersections[region.right_intersection_point(path.back().flipped)];
+ assert(ip->is_inner());
+ ip->is_low() ? -- ip : ++ ip;
+ assert(ip->is_outer());
+ polyline->points.back() = Point(vline.pos, ip->pos());
+ finish_polyline();
+ }
+}
+
+bool FillRectilinear::fill_surface_by_lines(const Surface *surface, const FillParams &params, float angleBase, float pattern_shift, Polylines &polylines_out)
+{
+ // At the end, only the new polylines will be rotated back.
+ size_t n_polylines_out_initial = polylines_out.size();
+
+ // Shrink the input polygon a bit first to not push the infill lines out of the perimeters.
+// const float INFILL_OVERLAP_OVER_SPACING = 0.3f;
+ const float INFILL_OVERLAP_OVER_SPACING = 0.45f;
+ assert(INFILL_OVERLAP_OVER_SPACING > 0 && INFILL_OVERLAP_OVER_SPACING < 0.5f);
+
+ // Rotate polygons so that we can work with vertical lines here
+ std::pair<float, Point> rotate_vector = this->_infill_direction(surface);
+ rotate_vector.first += angleBase;
- this->_min_spacing = scale_(this->spacing);
assert(params.density > 0.0001f && params.density <= 1.f);
- this->_line_spacing = coord_t(coordf_t(this->_min_spacing) / params.density);
- this->_diagonal_distance = this->_line_spacing * 2;
- this->_line_oscillation = this->_line_spacing - this->_min_spacing; // only for Line infill
- BoundingBox bounding_box = expolygon.contour.bounding_box();
-
+ coord_t line_spacing = coord_t(scale_(this->spacing) / params.density);
+
+ // On the polygons of poly_with_offset, the infill lines will be connected.
+ ExPolygonWithOffset poly_with_offset(
+ surface->expolygon,
+ - rotate_vector.first,
+ float(scale_(this->overlap - (0.5 - INFILL_OVERLAP_OVER_SPACING) * this->spacing)),
+ float(scale_(this->overlap - 0.5f * this->spacing)));
+ if (poly_with_offset.n_contours_inner == 0) {
+ // Not a single infill line fits.
+ //FIXME maybe one shall trigger the gap fill here?
+ return true;
+ }
+
+ BoundingBox bounding_box = poly_with_offset.bounding_box_src();
+
// define flow spacing according to requested density
- if (params.density > 0.9999f && !params.dont_adjust) {
- this->_line_spacing = this->_adjust_solid_spacing(bounding_box.size()(0), this->_line_spacing);
- this->spacing = unscale<double>(this->_line_spacing);
+ if (params.full_infill() && !params.dont_adjust) {
+ line_spacing = this->_adjust_solid_spacing(bounding_box.size()(0), line_spacing);
+ this->spacing = unscale<double>(line_spacing);
} else {
// extend bounding box so that our pattern will be aligned with other layers
// Transform the reference point to the rotated coordinate system.
+ Point refpt = rotate_vector.second.rotated(- rotate_vector.first);
+ // _align_to_grid will not work correctly with positive pattern_shift.
+ coord_t pattern_shift_scaled = coord_t(scale_(pattern_shift)) % line_spacing;
+ refpt.x() -= (pattern_shift_scaled >= 0) ? pattern_shift_scaled : (line_spacing + pattern_shift_scaled);
bounding_box.merge(_align_to_grid(
bounding_box.min,
- Point(this->_line_spacing, this->_line_spacing),
- direction.second.rotated(- direction.first)));
- }
-
- // generate the basic pattern
- coord_t x_max = bounding_box.max(0) + SCALED_EPSILON;
- Lines lines;
- for (coord_t x = bounding_box.min(0); x <= x_max; x += this->_line_spacing)
- lines.push_back(this->_line(lines.size(), x, bounding_box.min(1), bounding_box.max(1)));
- if (this->_horizontal_lines()) {
- coord_t y_max = bounding_box.max(1) + SCALED_EPSILON;
- for (coord_t y = bounding_box.min(1); y <= y_max; y += this->_line_spacing)
- lines.push_back(Line(Point(bounding_box.min(0), y), Point(bounding_box.max(0), y)));
- }
-
- // clip paths against a slightly larger expolygon, so that the first and last paths
- // are kept even if the expolygon has vertical sides
- // the minimum offset for preventing edge lines from being clipped is SCALED_EPSILON;
- // however we use a larger offset to support expolygons with slightly skewed sides and
- // not perfectly straight
- //FIXME Vojtech: Update the intersecton function to work directly with lines.
- Polylines polylines_src;
- polylines_src.reserve(lines.size());
- for (Lines::const_iterator it = lines.begin(); it != lines.end(); ++ it) {
- polylines_src.push_back(Polyline());
- Points &pts = polylines_src.back().points;
- pts.reserve(2);
- pts.push_back(it->a);
- pts.push_back(it->b);
- }
- Polylines polylines = intersection_pl(polylines_src, offset(to_polygons(expolygon), scale_(0.02)), false);
-
- // FIXME Vojtech: This is only performed for horizontal lines, not for the vertical lines!
- const float INFILL_OVERLAP_OVER_SPACING = 0.3f;
- // How much to extend an infill path from expolygon outside?
- coord_t extra = coord_t(floor(this->_min_spacing * INFILL_OVERLAP_OVER_SPACING + 0.5f));
- for (Polylines::iterator it_polyline = polylines.begin(); it_polyline != polylines.end(); ++ it_polyline) {
- Point *first_point = &it_polyline->points.front();
- Point *last_point = &it_polyline->points.back();
- if (first_point->y() > last_point->y())
- std::swap(first_point, last_point);
- first_point->y() -= extra;
- last_point->y() += extra;
- }
-
- size_t n_polylines_out_old = polylines_out.size();
-
- // connect lines
- if (! params.dont_connect && ! polylines.empty()) { // prevent calling leftmost_point() on empty collections
- // offset the expolygon by max(min_spacing/2, extra)
- ExPolygon expolygon_off;
- {
- ExPolygons expolygons_off = offset_ex(expolygon, this->_min_spacing/2);
- if (! expolygons_off.empty()) {
- // When expanding a polygon, the number of islands could only shrink. Therefore the offset_ex shall generate exactly one expanded island for one input island.
- assert(expolygons_off.size() == 1);
- std::swap(expolygon_off, expolygons_off.front());
+ 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 += (line_spacing + coord_t(SCALED_EPSILON)) / 2;
+
+#ifdef SLIC3R_DEBUG
+ static int iRun = 0;
+ BoundingBox bbox_svg = poly_with_offset.bounding_box_outer();
+ ::Slic3r::SVG svg(debug_out_path("FillRectilinear-%d.svg", iRun), bbox_svg); // , scale_(1.));
+ poly_with_offset.export_to_svg(svg);
+ {
+ ::Slic3r::SVG svg(debug_out_path("FillRectilinear-initial-%d.svg", iRun), bbox_svg); // , scale_(1.));
+ poly_with_offset.export_to_svg(svg);
+ }
+ iRun ++;
+#endif /* SLIC3R_DEBUG */
+
+ std::vector<SegmentedIntersectionLine> segs = slice_region_by_vertical_lines(poly_with_offset, n_vlines, x0, line_spacing);
+ // Connect by horizontal / vertical links, classify the links based on link_max_length as too long.
+ connect_segment_intersections_by_contours(poly_with_offset, segs, params, link_max_length);
+
+#ifdef SLIC3R_DEBUG
+ // Paint the segments and finalize the SVG file.
+ for (size_t i_seg = 0; i_seg < segs.size(); ++ i_seg) {
+ SegmentedIntersectionLine &sil = 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(Point(sil.pos, sil.intersections[i].pos()), Point(sil.pos, sil.intersections[j].pos())), "blue");
+ } else {
+ svg.draw(Line(Point(sil.pos, sil.intersections[i].pos()), Point(sil.pos, sil.intersections[i+1].pos())), "green");
+ svg.draw(Line(Point(sil.pos, sil.intersections[i+1].pos()), Point(sil.pos, sil.intersections[j-1].pos())), (j - i + 1 > 4) ? "yellow" : "magenta");
+ svg.draw(Line(Point(sil.pos, sil.intersections[j-1].pos()), Point(sil.pos, sil.intersections[j].pos())), "green");
}
+ i = j + 1;
}
- bool first = true;
- for (Polyline &polyline : chain_polylines(std::move(polylines))) {
- if (! first) {
- // Try to connect the lines.
- Points &pts_end = polylines_out.back().points;
- const Point &first_point = polyline.points.front();
- const Point &last_point = pts_end.back();
- // Distance in X, Y.
- const Vector distance = last_point - first_point;
- // TODO: we should also check that both points are on a fill_boundary to avoid
- // connecting paths on the boundaries of internal regions
- if (this->_can_connect(std::abs(distance(0)), std::abs(distance(1))) &&
- expolygon_off.contains(Line(last_point, first_point))) {
- // Append the polyline.
- pts_end.insert(pts_end.end(), polyline.points.begin(), polyline.points.end());
- continue;
- }
- }
- // The lines cannot be connected.
- polylines_out.emplace_back(std::move(polyline));
- first = false;
+ }
+ svg.Close();
+#endif /* SLIC3R_DEBUG */
+
+ //FIXME this is a hack to get the monotonic infill rolling. We likely want a smarter switch, likely based on user decison.
+ bool monotonic_infill = params.monotonic; // || params.density > 0.99;
+ if (monotonic_infill) {
+ // Sometimes the outer contour pinches the inner contour from both sides along a single vertical line.
+ // This situation is not handled correctly by generate_montonous_regions().
+ // Insert phony OUTER_HIGH / OUTER_LOW pairs at the position where the contour is pinched.
+ pinch_contours_insert_phony_outer_intersections(segs);
+ std::vector<MonotonicRegion> regions = generate_montonous_regions(segs);
+#ifdef INFILL_DEBUG_OUTPUT
+ {
+ static int iRun;
+ export_monotonous_regions_to_svg(poly_with_offset, segs, regions, debug_out_path("%s-%03d.svg", "MontonousRegions-initial", iRun ++));
+ }
+#endif // INFILL_DEBUG_OUTPUT
+ connect_monotonic_regions(regions, poly_with_offset, segs);
+ if (! regions.empty()) {
+ std::mt19937_64 rng;
+ std::vector<MonotonicRegionLink> path = chain_monotonic_regions(regions, poly_with_offset, segs, rng);
+ polylines_from_paths(path, poly_with_offset, segs, polylines_out);
+ }
+ } else
+ traverse_graph_generate_polylines(poly_with_offset, params, this->link_max_length, segs, polylines_out);
+
+#ifdef SLIC3R_DEBUG
+ {
+ {
+ ::Slic3r::SVG svg(debug_out_path("FillRectilinear-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("FillRectilinear-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_old; it != polylines_out.end(); ++ it) {
+ 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(- direction.second(0), - direction.second(1));
- it->rotate(direction.first);
+ // 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;
+}
+
+bool FillRectilinear::fill_surface_by_multilines(const Surface *surface, FillParams params, const std::initializer_list<SweepParams> &sweep_params, Polylines &polylines_out)
+{
+ assert(sweep_params.size() > 1);
+ assert(! params.full_infill());
+ params.density /= double(sweep_params.size());
+ assert(params.density > 0.0001f && params.density <= 1.f);
+
+ ExPolygonWithOffset poly_with_offset_base(surface->expolygon, 0, float(scale_(this->overlap - 0.5 * this->spacing)));
+ if (poly_with_offset_base.n_contours == 0)
+ // Not a single infill line fits.
+ return true;
+
+ Polylines fill_lines;
+ coord_t line_width = coord_t(scale_(this->spacing));
+ coord_t line_spacing = coord_t(scale_(this->spacing) / params.density);
+ std::pair<float, Point> rotate_vector = this->_infill_direction(surface);
+ for (const SweepParams &sweep : sweep_params) {
+ size_t n_fill_lines_initial = fill_lines.size();
+
+ // Rotate polygons so that we can work with vertical lines here
+ double angle = rotate_vector.first + sweep.angle_base;
+ ExPolygonWithOffset poly_with_offset(poly_with_offset_base, - angle);
+ BoundingBox bounding_box = poly_with_offset.bounding_box_src();
+ // Don't produce infill lines, which fully overlap with the infill perimeter.
+ coord_t x_min = bounding_box.min.x() + line_width + coord_t(SCALED_EPSILON);
+ coord_t x_max = bounding_box.max.x() - line_width - coord_t(SCALED_EPSILON);
+ // extend bounding box so that our pattern will be aligned with other layers
+ // Transform the reference point to the rotated coordinate system.
+ Point refpt = rotate_vector.second.rotated(- angle);
+ // _align_to_grid will not work correctly with positive pattern_shift.
+ coord_t pattern_shift_scaled = coord_t(scale_(sweep.pattern_shift)) % line_spacing;
+ refpt.x() -= (pattern_shift_scaled >= 0) ? pattern_shift_scaled : (line_spacing + pattern_shift_scaled);
+ bounding_box.merge(_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)
+ const size_t n_vlines = (bounding_box.max.x() - bounding_box.min.x() + line_spacing - 1) / line_spacing;
+ const double cos_a = cos(angle);
+ const double sin_a = sin(angle);
+ for (const SegmentedIntersectionLine &vline : slice_region_by_vertical_lines(poly_with_offset, n_vlines, bounding_box.min.x(), line_spacing))
+ if (vline.pos > x_min) {
+ if (vline.pos >= x_max)
+ break;
+ for (auto it = vline.intersections.begin(); it != vline.intersections.end();) {
+ auto it_low = it ++;
+ assert(it_low->type == SegmentIntersection::OUTER_LOW);
+ if (it_low->type != SegmentIntersection::OUTER_LOW)
+ continue;
+ auto it_high = it;
+ assert(it_high->type == SegmentIntersection::OUTER_HIGH);
+ if (it_high->type == SegmentIntersection::OUTER_HIGH) {
+ fill_lines.emplace_back(Point(vline.pos, it_low->pos()).rotated(cos_a, sin_a), Point(vline.pos, it_high->pos()).rotated(cos_a, sin_a));
+ ++ it;
+ }
+ }
+ }
}
+
+ if (params.dont_connect() || fill_lines.size() <= 1) {
+ if (fill_lines.size() > 1)
+ fill_lines = chain_polylines(std::move(fill_lines));
+ append(polylines_out, std::move(fill_lines));
+ } else
+ connect_infill(std::move(fill_lines), poly_with_offset_base.polygons_outer, get_extents(surface->expolygon.contour), polylines_out, this->spacing, params);
+
+ return true;
+}
+
+Polylines FillRectilinear::fill_surface(const Surface *surface, const FillParams &params)
+{
+ Polylines polylines_out;
+ if (! fill_surface_by_lines(surface, params, 0.f, 0.f, polylines_out))
+ BOOST_LOG_TRIVIAL(error) << "FillRectilinear::fill_surface() failed to fill a region.";
+ return polylines_out;
+}
+
+Polylines FillMonotonic::fill_surface(const Surface *surface, const FillParams &params)
+{
+ FillParams params2 = params;
+ params2.monotonic = true;
+ Polylines polylines_out;
+ if (! fill_surface_by_lines(surface, params2, 0.f, 0.f, polylines_out))
+ BOOST_LOG_TRIVIAL(error) << "FillMonotonous::fill_surface() failed to fill a region.";
+ return polylines_out;
+}
+
+Polylines FillGrid::fill_surface(const Surface *surface, const FillParams &params)
+{
+ Polylines polylines_out;
+ if (! this->fill_surface_by_multilines(
+ surface, params,
+ { { 0.f, 0.f }, { float(M_PI / 2.), 0.f } },
+ polylines_out))
+ BOOST_LOG_TRIVIAL(error) << "FillGrid::fill_surface() failed to fill a region.";
+ return polylines_out;
+}
+
+Polylines FillTriangles::fill_surface(const Surface *surface, const FillParams &params)
+{
+ Polylines polylines_out;
+ if (! this->fill_surface_by_multilines(
+ surface, params,
+ { { 0.f, 0.f }, { float(M_PI / 3.), 0.f }, { float(2. * M_PI / 3.), 0. } },
+ polylines_out))
+ BOOST_LOG_TRIVIAL(error) << "FillTriangles::fill_surface() failed to fill a region.";
+ return polylines_out;
+}
+
+Polylines FillStars::fill_surface(const Surface *surface, const FillParams &params)
+{
+ Polylines polylines_out;
+ if (! this->fill_surface_by_multilines(
+ surface, params,
+ { { 0.f, 0.f }, { float(M_PI / 3.), 0.f }, { float(2. * M_PI / 3.), float((3./2.) * this->spacing / params.density) } },
+ polylines_out))
+ BOOST_LOG_TRIVIAL(error) << "FillStars::fill_surface() failed to fill a region.";
+ return polylines_out;
+}
+
+Polylines FillCubic::fill_surface(const Surface *surface, const FillParams &params)
+{
+ Polylines polylines_out;
+ coordf_t dx = sqrt(0.5) * z;
+ if (! this->fill_surface_by_multilines(
+ surface, params,
+ { { 0.f, float(dx) }, { float(M_PI / 3.), - float(dx) }, { float(M_PI * 2. / 3.), float(dx) } },
+ polylines_out))
+ BOOST_LOG_TRIVIAL(error) << "FillCubic::fill_surface() failed to fill a region.";
+ return polylines_out;
}
} // namespace Slic3r
diff --git a/src/libslic3r/Fill/FillRectilinear.hpp b/src/libslic3r/Fill/FillRectilinear.hpp
index 1be85f755..0686fa166 100644
--- a/src/libslic3r/Fill/FillRectilinear.hpp
+++ b/src/libslic3r/Fill/FillRectilinear.hpp
@@ -12,68 +12,92 @@ class Surface;
class FillRectilinear : public Fill
{
public:
- virtual Fill* clone() const { return new FillRectilinear(*this); };
- virtual ~FillRectilinear() {}
+ Fill* clone() const override { return new FillRectilinear(*this); };
+ ~FillRectilinear() override = default;
+ Polylines fill_surface(const Surface *surface, const FillParams &params) override;
protected:
- virtual void _fill_surface_single(
- const FillParams &params,
- unsigned int thickness_layers,
- const std::pair<float, Point> &direction,
- ExPolygon &expolygon,
- Polylines &polylines_out);
-
- coord_t _min_spacing;
- coord_t _line_spacing;
- // distance threshold for allowing the horizontal infill lines to be connected into a continuous path
- coord_t _diagonal_distance;
- // only for line infill
- coord_t _line_oscillation;
-
- // Enabled for the grid infill, disabled for the rectilinear and line infill.
- virtual bool _horizontal_lines() const { return false; }
-
- virtual Line _line(int i, coord_t x, coord_t y_min, coord_t y_max) const
- { return Line(Point(x, y_min), Point(x, y_max)); }
-
- virtual bool _can_connect(coord_t dist_X, coord_t dist_Y) {
- return dist_X <= this->_diagonal_distance
- && dist_Y <= this->_diagonal_distance;
- }
+ // Fill by single directional lines, interconnect the lines along perimeters.
+ bool fill_surface_by_lines(const Surface *surface, const FillParams &params, float angleBase, float pattern_shift, Polylines &polylines_out);
+
+
+ // Fill by multiple sweeps of differing directions.
+ struct SweepParams {
+ float angle_base;
+ float pattern_shift;
+ };
+ bool fill_surface_by_multilines(const Surface *surface, FillParams params, const std::initializer_list<SweepParams> &sweep_params, Polylines &polylines_out);
};
-class FillLine : public FillRectilinear
+class FillAlignedRectilinear : public FillRectilinear
{
public:
- virtual ~FillLine() {}
+ Fill* clone() const override { return new FillAlignedRectilinear(*this); };
+ ~FillAlignedRectilinear() override = default;
protected:
- virtual Line _line(int i, coord_t x, coord_t y_min, coord_t y_max) const {
- coord_t osc = (i & 1) ? this->_line_oscillation : 0;
- return Line(Point(x - osc, y_min), Point(x + osc, y_max));
- }
-
- virtual bool _can_connect(coord_t dist_X, coord_t dist_Y)
- {
- coord_t TOLERANCE = 10 * SCALED_EPSILON;
- return (dist_X >= (this->_line_spacing - this->_line_oscillation) - TOLERANCE)
- && (dist_X <= (this->_line_spacing + this->_line_oscillation) + TOLERANCE)
- && (dist_Y <= this->_diagonal_distance);
- }
+ // Always generate infill at the same angle.
+ virtual float _layer_angle(size_t idx) const { return 0.f; }
+};
+
+class FillMonotonic : public FillRectilinear
+{
+public:
+ Fill* clone() const override { return new FillMonotonic(*this); };
+ ~FillMonotonic() override = default;
+ Polylines fill_surface(const Surface *surface, const FillParams &params) override;
+ bool no_sort() const override { return true; }
};
class FillGrid : public FillRectilinear
{
public:
- virtual ~FillGrid() {}
+ Fill* clone() const override { return new FillGrid(*this); };
+ ~FillGrid() override = default;
+ Polylines fill_surface(const Surface *surface, const FillParams &params) 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 { return 0.f; }
- // Flag for Slic3r::Fill::Rectilinear to fill both directions.
- virtual bool _horizontal_lines() const { return true; }
+ float _layer_angle(size_t idx) const override { return 0.f; }
+};
+
+class FillTriangles : public FillRectilinear
+{
+public:
+ Fill* clone() const override { return new FillTriangles(*this); };
+ ~FillTriangles() override = default;
+ Polylines fill_surface(const Surface *surface, const FillParams &params) override;
+
+protected:
+ // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
+ float _layer_angle(size_t idx) const override { return 0.f; }
};
+class FillStars : public FillRectilinear
+{
+public:
+ Fill* clone() const override { return new FillStars(*this); };
+ ~FillStars() override = default;
+ Polylines fill_surface(const Surface *surface, const FillParams &params) override;
+
+protected:
+ // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
+ float _layer_angle(size_t idx) const override { return 0.f; }
+};
+
+class FillCubic : public FillRectilinear
+{
+public:
+ Fill* clone() const override { return new FillCubic(*this); };
+ ~FillCubic() override = default;
+ Polylines fill_surface(const Surface *surface, const FillParams &params) override;
+
+protected:
+ // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
+ float _layer_angle(size_t idx) const override { return 0.f; }
+};
+
+
}; // namespace Slic3r
#endif // slic3r_FillRectilinear_hpp_
diff --git a/src/libslic3r/Fill/FillRectilinear2.cpp b/src/libslic3r/Fill/FillRectilinear2.cpp
deleted file mode 100644
index 8aea75886..000000000
--- a/src/libslic3r/Fill/FillRectilinear2.cpp
+++ /dev/null
@@ -1,1476 +0,0 @@
-#include <stdlib.h>
-#include <stdint.h>
-
-#include <algorithm>
-#include <cmath>
-#include <limits>
-
-#include <boost/static_assert.hpp>
-
-#include "../ClipperUtils.hpp"
-#include "../ExPolygon.hpp"
-#include "../Geometry.hpp"
-#include "../Surface.hpp"
-
-#include "FillRectilinear2.hpp"
-
-// #define SLIC3R_DEBUG
-
-// Make assert active if SLIC3R_DEBUG
-#ifdef SLIC3R_DEBUG
- #undef NDEBUG
- #include "SVG.hpp"
-#endif
-
-#include <cassert>
-
-// We want our version of assert.
-#include "../libslic3r.h"
-
-namespace Slic3r {
-
-// 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<double>().norm();
- } else {
- for (size_t i = seg1; i < poly.points.size(); ++ i, pPrev = pThis)
- len += (*pPrev - *(pThis = &poly.points[i])).cast<double>().norm();
- for (size_t i = 0; i < seg2; ++ i, pPrev = pThis)
- len += (*pPrev - *(pThis = &poly.points[i])).cast<double>().norm();
- }
- len += (*pPrev - p2).cast<double>().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]);
- }
-}
-
-// Intersection point of a vertical line with a polygon segment.
-class SegmentIntersection
-{
-public:
- SegmentIntersection() :
- iContour(0),
- iSegment(0),
- pos_p(0),
- pos_q(1),
- type(UNKNOWN),
- consumed_vertical_up(false),
- consumed_perimeter_right(false)
- {}
-
- // 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;
- // y position of the intersection, ratinal number.
- int64_t pos_p;
- uint32_t pos_q;
-
- coord_t pos() const {
- // Division rounds both positive and negative down to zero.
- // Add half of q for an arithmetic rounding effect.
- int64_t p = pos_p;
- if (p < 0)
- p -= int64_t(pos_q>>1);
- else
- p += int64_t(pos_q>>1);
- return coord_t(p / int64_t(pos_q));
- }
-
- // 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;
-
- // 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;
-
- // 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; }
-
- // Compare two y intersection points given by rational numbers.
- // Note that the rational number is given as pos_p/pos_q, where pos_p is int64 and pos_q is uint32.
- // This function calculates pos_p * other.pos_q < other.pos_p * pos_q as a 48bit number.
- // We don't use 128bit intrinsic data types as these are usually not supported by 32bit compilers and
- // we don't need the full 128bit precision anyway.
- bool operator<(const SegmentIntersection &other) const
- {
- assert(pos_q > 0);
- assert(other.pos_q > 0);
- if (pos_p == 0 || other.pos_p == 0) {
- // Because the denominators are positive and one of the nominators is zero,
- // following simple statement holds.
- return pos_p < other.pos_p;
- } else {
- // None of the nominators is zero.
- int sign1 = (pos_p > 0) ? 1 : -1;
- int sign2 = (other.pos_p > 0) ? 1 : -1;
- int signs = sign1 * sign2;
- assert(signs == 1 || signs == -1);
- if (signs < 0) {
- // The nominators have different signs.
- return sign1 < 0;
- } else {
- // The nominators have the same sign.
- // Absolute values
- uint64_t p1, p2;
- if (sign1 > 0) {
- p1 = uint64_t(pos_p);
- p2 = uint64_t(other.pos_p);
- } else {
- p1 = uint64_t(- pos_p);
- p2 = uint64_t(- other.pos_p);
- };
- // Multiply low and high 32bit words of p1 by other_pos.q
- // 32bit x 32bit => 64bit
- // l_hi and l_lo overlap by 32 bits.
- uint64_t l_hi = (p1 >> 32) * uint64_t(other.pos_q);
- uint64_t l_lo = (p1 & 0xffffffffll) * uint64_t(other.pos_q);
- l_hi += (l_lo >> 32);
- uint64_t r_hi = (p2 >> 32) * uint64_t(pos_q);
- uint64_t r_lo = (p2 & 0xffffffffll) * uint64_t(pos_q);
- r_hi += (r_lo >> 32);
- // Compare the high 64 bits.
- if (l_hi == r_hi) {
- // Compare the low 32 bits.
- l_lo &= 0xffffffffll;
- r_lo &= 0xffffffffll;
- return (sign1 < 0) ? (l_lo > r_lo) : (l_lo < r_lo);
- }
- return (sign1 < 0) ? (l_hi > r_hi) : (l_hi < r_hi);
- }
- }
- }
-
- bool operator==(const SegmentIntersection &other) const
- {
- assert(pos_q > 0);
- assert(other.pos_q > 0);
- if (pos_p == 0 || other.pos_p == 0) {
- // Because the denominators are positive and one of the nominators is zero,
- // following simple statement holds.
- return pos_p == other.pos_p;
- }
-
- // None of the nominators is zero, none of the denominators is zero.
- bool positive = pos_p > 0;
- if (positive != (other.pos_p > 0))
- return false;
- // The nominators have the same sign.
- // Absolute values
- uint64_t p1 = positive ? uint64_t(pos_p) : uint64_t(- pos_p);
- uint64_t p2 = positive ? uint64_t(other.pos_p) : uint64_t(- other.pos_p);
- // Multiply low and high 32bit words of p1 by other_pos.q
- // 32bit x 32bit => 64bit
- // l_hi and l_lo overlap by 32 bits.
- uint64_t l_lo = (p1 & 0xffffffffll) * uint64_t(other.pos_q);
- uint64_t r_lo = (p2 & 0xffffffffll) * uint64_t(pos_q);
- if (l_lo != r_lo)
- return false;
- uint64_t l_hi = (p1 >> 32) * uint64_t(other.pos_q);
- uint64_t r_hi = (p2 >> 32) * uint64_t(pos_q);
- return l_hi + (l_lo >> 32) == r_hi + (r_lo >> 32);
- }
-};
-
-// A vertical line with intersection points with polygons.
-class SegmentedIntersectionLine
-{
-public:
- // Index of this vertical intersection line.
- size_t idx;
- // x position of this vertical intersection line.
- coord_t pos;
- // List of intersection points with polygons, sorted increasingly by the y axis.
- std::vector<SegmentIntersection> intersections;
-};
-
-// 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
-{
-public:
- ExPolygonWithOffset(
- const ExPolygon &expolygon,
- float angle,
- coord_t aoffset1,
- coord_t aoffset2)
- {
- // Copy and rotate the source polygons.
- polygons_src = expolygon;
- polygons_src.contour.rotate(angle);
- for (Polygons::iterator it = polygons_src.holes.begin(); it != polygons_src.holes.end(); ++ it)
- it->rotate(angle);
-
- 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]; }
-
- 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) {
- 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<unsigned char> polygons_ccw;
-};
-
-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<SegmentedIntersectionLine> &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<int>::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<SegmentedIntersectionLine> &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<SegmentedIntersectionLine> &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<SegmentedIntersectionLine> &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<SegmentedIntersectionLine> &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<SegmentedIntersectionLine> &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<SegmentedIntersectionLine> &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(il.pos, itsct.pos());
- Point p2(il2.pos, 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<SegmentedIntersectionLine> &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<SegmentedIntersectionLine> &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<SegmentedIntersectionLine> &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(Point(il2.pos, itsct2.pos()));
-}
-
-static inline coordf_t measure_perimeter_segment_on_vertical_line_length(
- const ExPolygonWithOffset &poly_with_offset,
- const std::vector<SegmentedIntersectionLine> &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);
- Point p1(il.pos, itsct.pos());
- Point p2(il.pos, itsct2.pos());
- return forward ?
- segment_length(poly, itsct .iSegment, p1, itsct2.iSegment, p2) :
- segment_length(poly, itsct2.iSegment, p2, itsct .iSegment, p1);
-}
-
-// 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<SegmentedIntersectionLine> &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(Point(il.pos, 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<SegmentedIntersectionLine> &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<int>::max() :
- distance_of_segmens(poly, segs[i_vline-1].intersections[iPrev].iSegment, itsct.iSegment, true);
- int d_down = (iBelow == -1) ? std::numeric_limits<int>::max() :
- distance_of_segmens(poly, iSegBelow, itsct.iSegment, true);
- int d_up = (iAbove == -1) ? std::numeric_limits<int>::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<int>::max() :
- distance_of_segmens(poly, itsct.iSegment, segs[i_vline+1].intersections[iNext].iSegment, true);
- int d_down = (iSegBelow == -1) ? std::numeric_limits<int>::max() :
- distance_of_segmens(poly, itsct.iSegment, iSegBelow, true);
- int d_up = (iSegAbove == -1) ? std::numeric_limits<int>::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
-};
-
-bool FillRectilinear2::fill_surface_by_lines(const Surface *surface, const FillParams &params, float angleBase, float pattern_shift, Polylines &polylines_out)
-{
- // At the end, only the new polylines will be rotated back.
- size_t n_polylines_out_initial = polylines_out.size();
-
- // Shrink the input polygon a bit first to not push the infill lines out of the perimeters.
-// const float INFILL_OVERLAP_OVER_SPACING = 0.3f;
- const float INFILL_OVERLAP_OVER_SPACING = 0.45f;
- assert(INFILL_OVERLAP_OVER_SPACING > 0 && INFILL_OVERLAP_OVER_SPACING < 0.5f);
-
- // Rotate polygons so that we can work with vertical lines here
- std::pair<float, Point> rotate_vector = this->_infill_direction(surface);
- rotate_vector.first += angleBase;
-
- assert(params.density > 0.0001f && params.density <= 1.f);
- coord_t line_spacing = coord_t(scale_(this->spacing) / params.density);
-
- // On the polygons of poly_with_offset, the infill lines will be connected.
- ExPolygonWithOffset poly_with_offset(
- surface->expolygon,
- - rotate_vector.first,
- scale_(this->overlap - (0.5 - INFILL_OVERLAP_OVER_SPACING) * this->spacing),
- scale_(this->overlap - 0.5 * this->spacing));
- if (poly_with_offset.n_contours_inner == 0) {
- // Not a single infill line fits.
- //FIXME maybe one shall trigger the gap fill here?
- return true;
- }
-
- BoundingBox bounding_box = poly_with_offset.bounding_box_src();
-
- // define flow spacing according to requested density
- if (params.full_infill() && !params.dont_adjust) {
- line_spacing = this->_adjust_solid_spacing(bounding_box.size()(0), line_spacing);
- this->spacing = unscale<double>(line_spacing);
- } else {
- // extend bounding box so that our pattern will be aligned with other layers
- // Transform the reference point to the rotated coordinate system.
- Point refpt = rotate_vector.second.rotated(- rotate_vector.first);
- // _align_to_grid will not work correctly with positive pattern_shift.
- coord_t pattern_shift_scaled = coord_t(scale_(pattern_shift)) % line_spacing;
- refpt(0) -= (pattern_shift_scaled >= 0) ? pattern_shift_scaled : (line_spacing + pattern_shift_scaled);
- bounding_box.merge(_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 += (line_spacing + SCALED_EPSILON) / 2;
-
-#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.
- std::vector<SegmentedIntersectionLine> segs(n_vlines, SegmentedIntersectionLine());
- for (size_t i = 0; i < n_vlines; ++ i) {
- segs[i].idx = i;
- segs[i].pos = x0 + i * line_spacing;
- }
- 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 &p1 = contour[iPrev];
- const Point &p2 = contour[iSegment];
- // Which of the equally spaced vertical lines is intersected by this segment?
- coord_t l = p1(0);
- coord_t r = p2(0);
- if (l > r)
- std::swap(l, r);
- // il, ir are the left / right indices of vertical lines intersecting a segment
- int il = (l - x0) / line_spacing;
- while (il * line_spacing + x0 < l)
- ++ il;
- il = std::max(int(0), il);
- int ir = (r - x0 + line_spacing) / line_spacing;
- while (ir * line_spacing + x0 > r)
- -- ir;
- ir = std::min(int(segs.size()) - 1, ir);
- if (il > ir)
- // No vertical line intersects this segment.
- continue;
- assert(il >= 0 && size_t(il) < segs.size());
- assert(ir >= 0 && size_t(ir) < segs.size());
- for (int i = il; i <= ir; ++ i) {
- coord_t this_x = segs[i].pos;
- assert(this_x == i * line_spacing + x0);
- SegmentIntersection is;
- is.iContour = iContour;
- is.iSegment = iSegment;
- assert(l <= this_x);
- assert(r >= this_x);
- // Calculate the intersection position in y axis. x is known.
- if (p1(0) == this_x) {
- if (p2(0) == this_x) {
- // Ignore strictly vertical segments.
- continue;
- }
- is.pos_p = p1(1);
- is.pos_q = 1;
- } else if (p2(0) == this_x) {
- is.pos_p = p2(1);
- is.pos_q = 1;
- } else {
- // First calculate the intersection parameter 't' as a rational number with non negative denominator.
- if (p2(0) > p1(0)) {
- is.pos_p = this_x - p1(0);
- is.pos_q = p2(0) - p1(0);
- } else {
- is.pos_p = p1(0) - this_x;
- is.pos_q = p1(0) - p2(0);
- }
- assert(is.pos_p >= 0 && is.pos_p <= is.pos_q);
- // Make an intersection point from the 't'.
- is.pos_p *= int64_t(p2(1) - p1(1));
- is.pos_p += p1(1) * int64_t(is.pos_q);
- }
- // +-1 to take rounding into account.
- assert(is.pos() + 1 >= std::min(p1(1), p2(1)));
- assert(is.pos() <= std::max(p1(1), p2(1)) + 1);
- segs[i].intersections.push_back(is);
- }
- }
- }
-
- // Sort the intersections along their segments, specify the intersection types.
- for (size_t i_seg = 0; i_seg < segs.size(); ++ i_seg) {
- SegmentedIntersectionLine &sil = segs[i_seg];
- // Sort the intersection points using exact rational arithmetic.
- std::sort(sil.intersections.begin(), sil.intersections.end());
- // 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;
- coord_t dir = contour[iSegment](0) - contour[iPrev](0);
- 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].pos() == sil.intersections[j-1].pos()) {
- // 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)
- for (size_t i_seg = 0; i_seg < segs.size(); ++ i_seg) {
- SegmentedIntersectionLine &sil = 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 SLIC3R_DEBUG
- // Paint the segments and finalize the SVG file.
- for (size_t i_seg = 0; i_seg < segs.size(); ++ i_seg) {
- SegmentedIntersectionLine &sil = 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(Point(sil.pos, sil.intersections[i].pos()), Point(sil.pos, sil.intersections[j].pos())), "blue");
- } else {
- svg.draw(Line(Point(sil.pos, sil.intersections[i].pos()), Point(sil.pos, sil.intersections[i+1].pos())), "green");
- svg.draw(Line(Point(sil.pos, sil.intersections[i+1].pos()), Point(sil.pos, sil.intersections[j-1].pos())), (j - i + 1 > 4) ? "yellow" : "magenta");
- svg.draw(Line(Point(sil.pos, sil.intersections[j-1].pos()), Point(sil.pos, sil.intersections[j].pos())), "green");
- }
- i = j + 1;
- }
- }
- svg.Close();
-#endif /* SLIC3R_DEBUG */
-
- // 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<coordf_t>().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 = sqr(coordf_t(pointLast(0) - seg.pos)) + sqr(coordf_t(pointLast(1) - intrsctn.pos()));
- 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 = Point(segs[i_vline].pos, 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<int>::max() :
- distance_of_segmens(poly, segs[i_vline-1].intersections[iPrev].iSegment, intrsctn->iSegment, forward);
- int d_down = (iSegBelow == -1) ? std::numeric_limits<int>::max() :
- distance_of_segmens(poly, iSegBelow, intrsctn->iSegment, forward);
- int d_up = (iSegAbove == -1) ? std::numeric_limits<int>::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<int>::max() :
- distance_of_segmens(poly, intrsctn->iSegment, segs[i_vline+1].intersections[iNext].iSegment, forward);
- int d_down = (iSegBelow == -1) ? std::numeric_limits<int>::max() :
- distance_of_segmens(poly, intrsctn->iSegment, iSegBelow, forward);
- int d_up = (iSegAbove == -1) ? std::numeric_limits<int>::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<coord_t>::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<coord_t>::max() :
- measure_perimeter_next_segment_length(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, iNext);
- // Take the shorter path.
- //FIXME this may not be always the best strategy to take the shortest connection line now.
- bool take_next = (intrsctn_type_prev == INTERSECTION_TYPE_OTHER_VLINE_OK && intrsctn_type_next == INTERSECTION_TYPE_OTHER_VLINE_OK) ?
- (distNext < distPrev) :
- intrsctn_type_next == INTERSECTION_TYPE_OTHER_VLINE_OK;
- assert(intrsctn->is_inner());
- bool skip = params.dont_connect || (link_max_length > 0 && (take_next ? distNext : distPrev) > link_max_length);
- if (skip) {
- // Just skip the connecting contour and start a new path.
- goto dont_connect;
- polyline_current->points.push_back(Point(seg.pos, 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(Point(il2.pos, il2.intersections[take_next ? iNext : iPrev].pos()));
- } else {
- polyline_current->points.push_back(Point(seg.pos, intrsctn->pos()));
- emit_perimeter_prev_next_segment(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, take_next ? iNext : iPrev, *polyline_current, take_next);
- }
- // Mark both the left and right connecting segment as consumed, because one cannot go to this intersection point as it has been consumed.
- if (iPrev != -1)
- segs[i_vline-1].intersections[iPrev].consumed_perimeter_right = true;
- if (iNext != -1)
- intrsctn->consumed_perimeter_right = true;
- //FIXME consume the left / right connecting segments at the other end of this line? Currently it is not critical because a perimeter segment is not followed if the vertical segment at the other side has already been consumed.
- // Advance to the neighbor line.
- if (take_next) {
- ++ i_vline;
- i_intersection = iNext;
- } else {
- -- i_vline;
- i_intersection = iPrev;
- }
- continue;
- }
-
- // 5) Try to connect to a previous or next point on the same vertical line.
- if (vert_seg_dir_valid_mask) {
- bool valid = true;
- // Verify, that there is no intersection with the inner contour up to the end of the contour segment.
- // Verify, that the successive segment has not been consumed yet.
- if (going_up) {
- if (seg.intersections[iAbove].consumed_vertical_up) {
- valid = false;
- } else {
- for (int i = (int)i_intersection + 1; i < iAbove && valid; ++i)
- if (seg.intersections[i].is_inner())
- valid = false;
- }
- } else {
- if (seg.intersections[iBelow-1].consumed_vertical_up) {
- valid = false;
- } else {
- for (int i = iBelow + 1; i < (int)i_intersection && valid; ++i)
- if (seg.intersections[i].is_inner())
- valid = false;
- }
- }
- if (valid) {
- const Polygon &poly = poly_with_offset.contour(intrsctn->iContour);
- int iNext = going_up ? iAbove : iBelow;
- int iSegNext = going_up ? iSegAbove : iSegBelow;
- bool dir_forward = (vert_seg_dir_valid_mask == (DIR_FORWARD | DIR_BACKWARD)) ?
- // Take the shorter length between the current and the next intersection point.
- (distance_of_segmens(poly, intrsctn->iSegment, iSegNext, true) <
- distance_of_segmens(poly, intrsctn->iSegment, iSegNext, false)) :
- (vert_seg_dir_valid_mask == DIR_FORWARD);
- // Skip this perimeter line?
- bool skip = params.dont_connect;
- if (! skip && link_max_length > 0) {
- coordf_t link_length = measure_perimeter_segment_on_vertical_line_length(
- poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, iNext, dir_forward);
- skip = link_length > link_max_length;
- }
- polyline_current->points.push_back(Point(seg.pos, 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(Point(seg.pos, 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 = Point(seg.pos, 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
- {
- {
- ::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;
-}
-
-Polylines FillRectilinear2::fill_surface(const Surface *surface, const FillParams &params)
-{
- Polylines polylines_out;
- if (! fill_surface_by_lines(surface, params, 0.f, 0.f, polylines_out)) {
- printf("FillRectilinear2::fill_surface() failed to fill a region.\n");
- }
- return polylines_out;
-}
-
-Polylines FillGrid2::fill_surface(const Surface *surface, const FillParams &params)
-{
- // Each linear fill covers half of the target coverage.
- FillParams params2 = params;
- params2.density *= 0.5f;
- Polylines polylines_out;
- if (! fill_surface_by_lines(surface, params2, 0.f, 0.f, polylines_out) ||
- ! fill_surface_by_lines(surface, params2, float(M_PI / 2.), 0.f, polylines_out)) {
- printf("FillGrid2::fill_surface() failed to fill a region.\n");
- }
- return polylines_out;
-}
-
-Polylines FillTriangles::fill_surface(const Surface *surface, const FillParams &params)
-{
- // Each linear fill covers 1/3 of the target coverage.
- FillParams params2 = params;
- params2.density *= 0.333333333f;
- FillParams params3 = params2;
- params3.dont_connect = true;
- Polylines polylines_out;
- if (! fill_surface_by_lines(surface, params2, 0.f, 0., polylines_out) ||
- ! fill_surface_by_lines(surface, params2, float(M_PI / 3.), 0., polylines_out) ||
- ! fill_surface_by_lines(surface, params3, float(2. * M_PI / 3.), 0., polylines_out)) {
- printf("FillTriangles::fill_surface() failed to fill a region.\n");
- }
- return polylines_out;
-}
-
-Polylines FillStars::fill_surface(const Surface *surface, const FillParams &params)
-{
- // Each linear fill covers 1/3 of the target coverage.
- FillParams params2 = params;
- params2.density *= 0.333333333f;
- FillParams params3 = params2;
- params3.dont_connect = true;
- Polylines polylines_out;
- if (! fill_surface_by_lines(surface, params2, 0.f, 0., polylines_out) ||
- ! fill_surface_by_lines(surface, params2, float(M_PI / 3.), 0., polylines_out) ||
- ! fill_surface_by_lines(surface, params3, float(2. * M_PI / 3.), 0.5 * this->spacing / params2.density, polylines_out)) {
- printf("FillStars::fill_surface() failed to fill a region.\n");
- }
- return polylines_out;
-}
-
-Polylines FillCubic::fill_surface(const Surface *surface, const FillParams &params)
-{
- // Each linear fill covers 1/3 of the target coverage.
- FillParams params2 = params;
- params2.density *= 0.333333333f;
- FillParams params3 = params2;
- params3.dont_connect = true;
- Polylines polylines_out;
- coordf_t dx = sqrt(0.5) * z;
- if (! fill_surface_by_lines(surface, params2, 0.f, dx, polylines_out) ||
- ! fill_surface_by_lines(surface, params2, float(M_PI / 3.), - dx, polylines_out) ||
- // Rotated by PI*2/3 + PI to achieve reverse sloping wall.
- ! fill_surface_by_lines(surface, params3, float(M_PI * 2. / 3.), dx, polylines_out)) {
- printf("FillCubic::fill_surface() failed to fill a region.\n");
- }
- return polylines_out;
-}
-
-} // namespace Slic3r
diff --git a/src/libslic3r/Fill/FillRectilinear2.hpp b/src/libslic3r/Fill/FillRectilinear2.hpp
deleted file mode 100644
index 4459919b0..000000000
--- a/src/libslic3r/Fill/FillRectilinear2.hpp
+++ /dev/null
@@ -1,74 +0,0 @@
-#ifndef slic3r_FillRectilinear2_hpp_
-#define slic3r_FillRectilinear2_hpp_
-
-#include "../libslic3r.h"
-
-#include "FillBase.hpp"
-
-namespace Slic3r {
-
-class Surface;
-
-class FillRectilinear2 : public Fill
-{
-public:
- virtual Fill* clone() const { return new FillRectilinear2(*this); };
- virtual ~FillRectilinear2() {}
- virtual Polylines fill_surface(const Surface *surface, const FillParams &params);
-
-protected:
- bool fill_surface_by_lines(const Surface *surface, const FillParams &params, float angleBase, float pattern_shift, Polylines &polylines_out);
-};
-
-class FillGrid2 : public FillRectilinear2
-{
-public:
- virtual Fill* clone() const { return new FillGrid2(*this); };
- virtual ~FillGrid2() {}
- virtual Polylines fill_surface(const Surface *surface, const FillParams &params);
-
-protected:
- // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
- virtual float _layer_angle(size_t idx) const { return 0.f; }
-};
-
-class FillTriangles : public FillRectilinear2
-{
-public:
- virtual Fill* clone() const { return new FillTriangles(*this); };
- virtual ~FillTriangles() {}
- virtual Polylines fill_surface(const Surface *surface, const FillParams &params);
-
-protected:
- // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
- virtual float _layer_angle(size_t idx) const { return 0.f; }
-};
-
-class FillStars : public FillRectilinear2
-{
-public:
- virtual Fill* clone() const { return new FillStars(*this); };
- virtual ~FillStars() {}
- virtual Polylines fill_surface(const Surface *surface, const FillParams &params);
-
-protected:
- // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
- virtual float _layer_angle(size_t idx) const { return 0.f; }
-};
-
-class FillCubic : public FillRectilinear2
-{
-public:
- virtual Fill* clone() const { return new FillCubic(*this); };
- virtual ~FillCubic() {}
- virtual Polylines fill_surface(const Surface *surface, const FillParams &params);
-
-protected:
- // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
- virtual float _layer_angle(size_t idx) const { return 0.f; }
-};
-
-
-}; // namespace Slic3r
-
-#endif // slic3r_FillRectilinear2_hpp_
diff --git a/src/libslic3r/Fill/FillRectilinear3.cpp b/src/libslic3r/Fill/FillRectilinear3.cpp
deleted file mode 100644
index 078feeae9..000000000
--- a/src/libslic3r/Fill/FillRectilinear3.cpp
+++ /dev/null
@@ -1,1642 +0,0 @@
-#include <stdlib.h>
-#include <stdint.h>
-
-#include <algorithm>
-#include <cmath>
-#include <limits>
-
-#include <boost/static_assert.hpp>
-
-#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 <cassert>
-
-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<unsigned char> 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<SegmentIntersection> 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<coordf_t>());
- const Vec2d v1((seg_end - seg_start).cast<coordf_t>());
- // Point, vector of this hatching line.
- const Vec2d p2(line->pos.cast<coordf_t>());
- const Vec2d v2(line->dir.cast<coordf_t>());
- // Intersect the two rays.
- double denom = v1(0) * v2(1) - v2(0) * v1(1);
- Point out;
- if (denom == 0.) {
- // Lines are collinear. As the pos() method is not supposed to be called on collinear vectors,
- // the source vectors are not quite collinear. Return the center of the contour segment.
- out = seg_start + seg_end;
- out(0) >>= 1;
- out(1) >>= 1;
- } else {
- // Find the intersection point.
- double t = (v2(0) * (p1(1) - p2(1)) - v2(1) * (p1(0) - p2(0))) / denom;
- if (t < 0.)
- out = seg_start;
- else if (t > 1.)
- out = seg_end;
- else {
- out(0) = coord_t(floor(p1(0) + t * v1(0) + 0.5));
- out(1) = coord_t(floor(p1(1) + t * v1(1) + 0.5));
- }
- }
- return out;
-}
-
-static inline int signum(int64_t v) { return (v > 0) - (v < 0); }
-
-// Returns 0, if this and other segments intersect at the hatching line.
-// Returns -1, if this intersection is below the other intersection on the hatching line.
-// Returns +1 otherwise.
-int SegmentIntersection::ordering_along_line(const SegmentIntersection &other) const
-{
- assert(this->line == other.line);
- assert(this->expoly_with_offset == other.expoly_with_offset);
-
- if (this->iContour == other.iContour && this->iSegment == other.iSegment)
- return true;
-
- // Segment of this
- const Polygon &poly_a = this->expoly_with_offset->contour(this->iContour);
- // 30 bits + 1 signum bit.
- const Point &seg_start_a = poly_a.points[(this->iSegment == 0) ? poly_a.points.size() - 1 : this->iSegment - 1];
- const Point &seg_end_a = poly_a.points[this->iSegment];
-
- // Segment of other
- const Polygon &poly_b = this->expoly_with_offset->contour(other.iContour);
- // 30 bits + 1 signum bit.
- const Point &seg_start_b = poly_b.points[(other.iSegment == 0) ? poly_b.points.size() - 1 : other.iSegment - 1];
- const Point &seg_end_b = poly_b.points[other.iSegment];
-
- if (this->iContour == other.iContour) {
- if ((this->iSegment + 1) % poly_a.points.size() == other.iSegment) {
- // other.iSegment succeeds this->iSegment
- assert(seg_end_a == seg_start_b);
- // Avoid calling the 128bit x 128bit multiplication below if this->line intersects the common point.
- if (cross2(Vec2i64(this->line->dir.cast<int64_t>()), (seg_end_b - this->line->pos).cast<int64_t>()) == 0)
- return 0;
- } else if ((other.iSegment + 1) % poly_a.points.size() == this->iSegment) {
- // this->iSegment succeeds other.iSegment
- assert(seg_start_a == seg_end_b);
- // Avoid calling the 128bit x 128bit multiplication below if this->line intersects the common point.
- if (cross2(Vec2i64(this->line->dir.cast<int64_t>()), (seg_start_a - this->line->pos).cast<int64_t>()) == 0)
- return 0;
- } else {
- // General case.
- }
- }
-
- // First test, whether both points of one segment are completely in one half-plane of the other line.
- const Vec2i64 vec_b = (seg_end_b - seg_start_b).cast<int64_t>();
- int side_start = signum(cross2(vec_b, (seg_start_a - seg_start_b).cast<int64_t>()));
- int side_end = signum(cross2(vec_b, (seg_end_a - seg_start_b).cast<int64_t>()));
- int side = side_start * side_end;
- if (side > 0)
- // This segment is completely inside one half-plane of the other line, therefore the ordering is trivial.
- return signum(cross2(vec_b, this->line->dir.cast<int64_t>())) * side_start;
-
- const Vec2i64 vec_a = (seg_end_a - seg_start_a).cast<int64_t>();
- int side_start2 = signum(cross2(vec_a, (seg_start_b - seg_start_a).cast<int64_t>()));
- int side_end2 = signum(cross2(vec_a, (seg_end_b - seg_start_a).cast<int64_t>()));
- int side2 = side_start2 * side_end2;
- //if (side == 0 && side2 == 0)
- // The segments share one of their end points.
- if (side2 > 0)
- // This segment is completely inside one half-plane of the other line, therefore the ordering is trivial.
- return signum(cross2(this->line->dir.cast<int64_t>(), vec_a)) * side_start2;
-
- // The two segments intersect and they are not sucessive segments of the same contour.
- // Ordering of the points depends on the position of the segment intersection (left / right from this->line),
- // therefore a simple test over the input segment end points is not sufficient.
-
- // Find the parameters of intersection of the two segmetns with this->line.
- int64_t denom1 = cross2(this->line->dir.cast<int64_t>(), vec_a);
- int64_t denom2 = cross2(this->line->dir.cast<int64_t>(), vec_b);
- Vec2i64 vx_a = (seg_start_a - this->line->pos).cast<int64_t>();
- Vec2i64 vx_b = (seg_start_b - this->line->pos).cast<int64_t>();
- int64_t t1_times_denom1 = vx_a(0) * vec_a(1) - vx_a(1) * vec_a(0);
- int64_t t2_times_denom2 = vx_b(0) * vec_b(1) - vx_b(1) * vec_b(0);
- assert(denom1 != 0);
- assert(denom2 != 0);
- return Int128::compare_rationals_filtered(t1_times_denom1, denom1, t2_times_denom2, denom2);
-}
-
-// Compare two y intersection points given by rational numbers.
-bool SegmentIntersection::operator<(const SegmentIntersection &other) const
-{
-#ifdef _DEBUG
- Point p1 = this->pos();
- Point p2 = other.pos();
- int64_t d = this->line->dir.cast<int64_t>().dot((p2 - p1).cast<int64_t>());
-#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<SegmentedIntersectionLine> 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 &params,
- // 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<float, Point> &rotate_vector,
- // Resulting straight segments of the infill graph.
- InfillHatchingSingleDirection &out)
-{
- out.angle = rotate_vector.first + fill_dir_params.angle;
- out.direction = Point(coord_t(scale_(1000)), coord_t(0));
- // Hatch along the Y axis of the rotated coordinate system.
- out.direction.rotate(out.angle + 0.5 * M_PI);
- out.segs.clear();
-
- assert(params.density > 0.0001f && params.density <= 1.f);
- coord_t line_spacing = coord_t(scale_(fill_dir_params.spacing) / params.density);
-
- // Bounding box around the source contour, aligned with out.angle.
- BoundingBox bounding_box = get_extents_rotated(poly_with_offset.polygons_src.contour, - out.angle);
-
- // Define the flow spacing according to requested density.
- if (params.full_infill() && ! params.dont_adjust) {
- // Full infill, adjust the line spacing to fit an integer number of lines.
- out.line_spacing = Fill::_adjust_solid_spacing(bounding_box.size()(0), line_spacing);
- // Report back the adjusted line spacing.
- fill_dir_params.spacing = unscale<double>(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<int>(0, (l - x0 + line_spacing) / line_spacing);
- int ir = std::min<int>(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 <pl, pr>.
- assert(il >= 0 && ir < int(out.segs.size()));
- for (int i = il; i <= ir; ++ i) {
- // assert(out.segs[i](0) == i * line_spacing + x0);
- // assert(l <= out.segs[i](0));
- // assert(r >= out.segs[i](0));
- SegmentIntersection is;
- is.line = &out.segs[i];
- is.expoly_with_offset = &poly_with_offset;
- is.iContour = iContour;
- is.iSegment = iSegment;
- // Test whether the calculated intersection point falls into the bounding box of the input segment.
- // +-1 to take rounding into account.
- assert(int128::orient(out.segs[i].pos, out.segs[i].pos + out.direction, *pl) >= 0);
- assert(int128::orient(out.segs[i].pos, out.segs[i].pos + out.direction, *pr) <= 0);
- assert(is.pos()(0) + 1 >= std::min((*pl)(0), (*pr)(0)));
- assert(is.pos()(1) + 1 >= std::min((*pl)(1), (*pr)(1)));
- assert(is.pos()(0) <= std::max((*pl)(0), (*pr)(0)) + 1);
- assert(is.pos()(1) <= std::max((*pl)(1), (*pr)(1)) + 1);
- out.segs[i].intersections.push_back(is);
- }
- }
- }
-
- // Sort the intersections along their segments, specify the intersection types.
- for (size_t i_seg = 0; i_seg < out.segs.size(); ++ i_seg) {
- SegmentedIntersectionLine &sil = out.segs[i_seg];
- // Sort the intersection points using exact rational arithmetic.
- std::sort(sil.intersections.begin(), sil.intersections.end());
-#ifdef _DEBUG
- // Verify that the intersections are sorted along the haching direction.
- for (size_t i = 1; i < sil.intersections.size(); ++ i) {
- Point p1 = sil.intersections[i - 1].pos();
- Point p2 = sil.intersections[i].pos();
- int64_t d = sil.dir.cast<int64_t>().dot((p2 - p1).cast<int64_t>());
- 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<double>().norm();
- } else {
- for (size_t i = seg1; i < poly.points.size(); ++ i, pPrev = pThis)
- len += (*pPrev - *(pThis = &poly.points[i])).cast<double>().norm();
- for (size_t i = 0; i < seg2; ++ i, pPrev = pThis)
- len += (*pPrev - *(pThis = &poly.points[i])).cast<double>().norm();
- }
- len += (*pPrev - p2).cast<double>().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<SegmentedIntersectionLine> &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<int>::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<SegmentedIntersectionLine> &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<SegmentedIntersectionLine> &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<SegmentedIntersectionLine> &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<SegmentedIntersectionLine> &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<SegmentedIntersectionLine> &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<SegmentedIntersectionLine> &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<SegmentedIntersectionLine> &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<SegmentedIntersectionLine> &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<SegmentedIntersectionLine> &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<SegmentedIntersectionLine> &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<SegmentedIntersectionLine> &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<SegmentedIntersectionLine> &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<int>::max() :
- distance_of_segmens(poly, segs[i_vline-1].intersections[iPrev].iSegment, itsct.iSegment, true);
- int d_down = (iBelow == -1) ? std::numeric_limits<int>::max() :
- distance_of_segmens(poly, iSegBelow, itsct.iSegment, true);
- int d_up = (iAbove == -1) ? std::numeric_limits<int>::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<int>::max() :
- distance_of_segmens(poly, itsct.iSegment, segs[i_vline+1].intersections[iNext].iSegment, true);
- int d_down = (iSegBelow == -1) ? std::numeric_limits<int>::max() :
- distance_of_segmens(poly, itsct.iSegment, iSegBelow, true);
- int d_up = (iSegAbove == -1) ? std::numeric_limits<int>::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 &params,
- 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<SegmentedIntersectionLine> &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<coordf_t>().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<double>().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<int>::max() :
- distance_of_segmens(poly, segs[i_vline-1].intersections[iPrev].iSegment, intrsctn->iSegment, forward);
- int d_down = (iSegBelow == -1) ? std::numeric_limits<int>::max() :
- distance_of_segmens(poly, iSegBelow, intrsctn->iSegment, forward);
- int d_up = (iSegAbove == -1) ? std::numeric_limits<int>::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<int>::max() :
- distance_of_segmens(poly, intrsctn->iSegment, segs[i_vline+1].intersections[iNext].iSegment, forward);
- int d_down = (iSegBelow == -1) ? std::numeric_limits<int>::max() :
- distance_of_segmens(poly, intrsctn->iSegment, iSegBelow, forward);
- int d_up = (iSegAbove == -1) ? std::numeric_limits<int>::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<coord_t>::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<coord_t>::max() :
- measure_perimeter_next_segment_length(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, iNext);
- // Take the shorter path.
- //FIXME this may not be always the best strategy to take the shortest connection line now.
- bool take_next = (intrsctn_type_prev == INTERSECTION_TYPE_OTHER_VLINE_OK && intrsctn_type_next == INTERSECTION_TYPE_OTHER_VLINE_OK) ?
- (distNext < distPrev) :
- intrsctn_type_next == INTERSECTION_TYPE_OTHER_VLINE_OK;
- assert(intrsctn->is_inner());
- bool skip = params.dont_connect || (link_max_length > 0 && (take_next ? distNext : distPrev) > link_max_length);
- if (skip) {
- // Just skip the connecting contour and start a new path.
- goto dont_connect;
- polyline_current->points.push_back(intrsctn->pos());
- polylines_out.push_back(Polyline());
- polyline_current = &polylines_out.back();
- const SegmentedIntersectionLine &il2 = segs[take_next ? (i_vline + 1) : (i_vline - 1)];
- polyline_current->points.push_back(il2.intersections[take_next ? iNext : iPrev].pos());
- } else {
- polyline_current->points.push_back(intrsctn->pos());
- emit_perimeter_prev_next_segment(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, take_next ? iNext : iPrev, *polyline_current, take_next);
- }
- // Mark both the left and right connecting segment as consumed, because one cannot go to this intersection point as it has been consumed.
- if (iPrev != -1)
- segs[i_vline-1].intersections[iPrev].consumed_perimeter_right = true;
- if (iNext != -1)
- intrsctn->consumed_perimeter_right = true;
- //FIXME consume the left / right connecting segments at the other end of this line? Currently it is not critical because a perimeter segment is not followed if the vertical segment at the other side has already been consumed.
- // Advance to the neighbor line.
- if (take_next) {
- ++ i_vline;
- i_intersection = iNext;
- } else {
- -- i_vline;
- i_intersection = iPrev;
- }
- continue;
- }
-
- // 5) Try to connect to a previous or next point on the same vertical line.
- if (vert_seg_dir_valid_mask) {
- bool valid = true;
- // Verify, that there is no intersection with the inner contour up to the end of the contour segment.
- // Verify, that the successive segment has not been consumed yet.
- if (going_up) {
- if (seg.intersections[iAbove].consumed_vertical_up) {
- valid = false;
- } else {
- for (int i = (int)i_intersection + 1; i < iAbove && valid; ++i)
- if (seg.intersections[i].is_inner())
- valid = false;
- }
- } else {
- if (seg.intersections[iBelow-1].consumed_vertical_up) {
- valid = false;
- } else {
- for (int i = iBelow + 1; i < (int)i_intersection && valid; ++i)
- if (seg.intersections[i].is_inner())
- valid = false;
- }
- }
- if (valid) {
- const Polygon &poly = poly_with_offset.contour(intrsctn->iContour);
- int iNext = going_up ? iAbove : iBelow;
- int iSegNext = going_up ? iSegAbove : iSegBelow;
- bool dir_forward = (vert_seg_dir_valid_mask == (DIR_FORWARD | DIR_BACKWARD)) ?
- // Take the shorter length between the current and the next intersection point.
- (distance_of_segmens(poly, intrsctn->iSegment, iSegNext, true) <
- distance_of_segmens(poly, intrsctn->iSegment, iSegNext, false)) :
- (vert_seg_dir_valid_mask == DIR_FORWARD);
- // Skip this perimeter line?
- bool skip = params.dont_connect;
- if (! skip && link_max_length > 0) {
- coordf_t link_length = measure_perimeter_segment_on_vertical_line_length(
- poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, iNext, dir_forward);
- skip = link_length > link_max_length;
- }
- polyline_current->points.push_back(intrsctn->pos());
- if (skip) {
- // Just skip the connecting contour and start a new path.
- polylines_out.push_back(Polyline());
- polyline_current = &polylines_out.back();
- polyline_current->points.push_back(seg.intersections[iNext].pos());
- } else {
- // Consume the connecting contour and the next segment.
- emit_perimeter_segment_on_vertical_line(poly_with_offset, segs, i_vline, intrsctn->iContour, i_intersection, iNext, *polyline_current, dir_forward);
- }
- // Mark both the left and right connecting segment as consumed, because one cannot go to this intersection point as it has been consumed.
- // If there are any outer intersection points skipped (bypassed) by the contour,
- // mark them as processed.
- if (going_up) {
- for (int i = (int)i_intersection; i < iAbove; ++ i)
- seg.intersections[i].consumed_vertical_up = true;
- } else {
- for (int i = iBelow; i < (int)i_intersection; ++ i)
- seg.intersections[i].consumed_vertical_up = true;
- }
-// seg.intersections[going_up ? i_intersection : i_intersection - 1].consumed_vertical_up = true;
- intrsctn->consumed_perimeter_right = true;
- i_intersection = iNext;
- if (going_up)
- ++ intrsctn;
- else
- -- intrsctn;
- intrsctn->consumed_perimeter_right = true;
- continue;
- }
- }
- dont_connect:
- // No way to continue the current polyline. Take the rest of the line up to the outer contour.
- // This will finish the polyline, starting another polyline at a new point.
- if (going_up)
- ++ intrsctn;
- else
- -- intrsctn;
- }
-
- // Finish the current vertical line,
- // reset the current vertical line to pick a new starting point in the next round.
- assert(intrsctn->is_outer());
- assert(intrsctn->is_high() == going_up);
- pointLast = intrsctn->pos();
- polyline_current->points.push_back(pointLast);
- // Handle duplicate points and zero length segments.
- polyline_current->remove_duplicate_points();
- assert(! polyline_current->has_duplicate_points());
- // Handle nearly zero length edges.
- if (polyline_current->points.size() <= 1 ||
- (polyline_current->points.size() == 2 &&
- std::abs(polyline_current->points.front()(0) - polyline_current->points.back()(0)) < SCALED_EPSILON &&
- std::abs(polyline_current->points.front()(1) - polyline_current->points.back()(1)) < SCALED_EPSILON))
- polylines_out.pop_back();
- intrsctn = NULL;
- i_intersection = -1;
- polyline_current = NULL;
- }
-
-#ifdef SLIC3R_DEBUG
- {
- static int iRun = 0;
- BoundingBox bbox_svg = poly_with_offset.bounding_box_outer();
- {
- ::Slic3r::SVG svg(debug_out_path("FillRectilinear2-final-%03d.svg", iRun), bbox_svg); // , scale_(1.));
- poly_with_offset.export_to_svg(svg);
- for (size_t i = n_polylines_out_initial; i < polylines_out.size(); ++ i)
- svg.draw(polylines_out[i].lines(), "black");
- }
- // Paint a picture per polyline. This makes it easier to discover the order of the polylines and their overlap.
- for (size_t i_polyline = n_polylines_out_initial; i_polyline < polylines_out.size(); ++ i_polyline) {
- ::Slic3r::SVG svg(debug_out_path("FillRectilinear2-final-%03d-%03d.svg", iRun, i_polyline), bbox_svg); // , scale_(1.));
- svg.draw(polylines_out[i_polyline].lines(), "black");
- }
- }
-#endif /* SLIC3R_DEBUG */
-
- // paths must be rotated back
- for (Polylines::iterator it = polylines_out.begin() + n_polylines_out_initial; it != polylines_out.end(); ++ it) {
- // No need to translate, the absolute position is irrelevant.
- // it->translate(- rotate_vector.second(0), - rotate_vector.second(1));
- assert(! it->has_duplicate_points());
- //it->rotate(rotate_vector.first);
- //FIXME rather simplify the paths to avoid very short edges?
- //assert(! it->has_duplicate_points());
- it->remove_duplicate_points();
- }
-
-#ifdef SLIC3R_DEBUG
- // Verify, that there are no duplicate points in the sequence.
- for (Polyline &polyline : polylines_out)
- assert(! polyline.has_duplicate_points());
-#endif /* SLIC3R_DEBUG */
-
- return true;
-}
-
-}; // namespace FillRectilinear3_Internal
-
-bool FillRectilinear3::fill_surface_by_lines(const Surface *surface, const FillParams &params, std::vector<FillDirParams> &fill_dir_params, Polylines &polylines_out)
-{
- assert(params.density > 0.0001f && params.density <= 1.f);
-
- const float INFILL_OVERLAP_OVER_SPACING = 0.45f;
- assert(INFILL_OVERLAP_OVER_SPACING > 0 && INFILL_OVERLAP_OVER_SPACING < 0.5f);
-
- // On the polygons of poly_with_offset, the infill lines will be connected.
- FillRectilinear3_Internal::ExPolygonWithOffset poly_with_offset(
- surface->expolygon,
- float(scale_(- (0.5 - INFILL_OVERLAP_OVER_SPACING) * this->spacing)),
- float(scale_(- 0.5 * this->spacing)));
- if (poly_with_offset.n_contours_inner == 0) {
- // Not a single infill line fits.
- //FIXME maybe one shall trigger the gap fill here?
- return true;
- }
-
- // Rotate polygons so that we can work with vertical lines here
- std::pair<float, Point> rotate_vector = this->_infill_direction(surface);
- std::vector<FillRectilinear3_Internal::InfillHatchingSingleDirection> 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 &params)
-{
- Polylines polylines_out;
- std::vector<FillDirParams> fill_dir_params;
- fill_dir_params.emplace_back(FillDirParams(this->spacing, 0.f));
- if (! fill_surface_by_lines(surface, params, fill_dir_params, polylines_out))
- printf("FillRectilinear3::fill_surface() failed to fill a region.\n");
- if (params.full_infill() && ! params.dont_adjust)
- // Return back the adjusted spacing.
- this->spacing = fill_dir_params.front().spacing;
- return polylines_out;
-}
-
-Polylines FillGrid3::fill_surface(const Surface *surface, const FillParams &params)
-{
- // Each linear fill covers half of the target coverage.
- FillParams params2 = params;
- params2.density *= 0.5f;
- Polylines polylines_out;
- std::vector<FillDirParams> fill_dir_params;
- fill_dir_params.emplace_back(FillDirParams(this->spacing, 0.f));
- fill_dir_params.emplace_back(FillDirParams(this->spacing, float(M_PI / 2.)));
- if (! fill_surface_by_lines(surface, params2, fill_dir_params, polylines_out))
- printf("FillGrid3::fill_surface() failed to fill a region.\n");
- return polylines_out;
-}
-
-Polylines FillTriangles3::fill_surface(const Surface *surface, const FillParams &params)
-{
- // Each linear fill covers 1/3 of the target coverage.
- FillParams params2 = params;
- params2.density *= 0.333333333f;
- Polylines polylines_out;
- std::vector<FillDirParams> fill_dir_params;
- fill_dir_params.emplace_back(FillDirParams(this->spacing, 0.));
- fill_dir_params.emplace_back(FillDirParams(this->spacing, M_PI / 3.));
- fill_dir_params.emplace_back(FillDirParams(this->spacing, 2. * M_PI / 3.));
- if (! fill_surface_by_lines(surface, params2, fill_dir_params, polylines_out))
- printf("FillTriangles3::fill_surface() failed to fill a region.\n");
- return polylines_out;
-}
-
-Polylines FillStars3::fill_surface(const Surface *surface, const FillParams &params)
-{
- // Each linear fill covers 1/3 of the target coverage.
- FillParams params2 = params;
- params2.density *= 0.333333333f;
- Polylines polylines_out;
- std::vector<FillDirParams> fill_dir_params;
- fill_dir_params.emplace_back(FillDirParams(this->spacing, 0.));
- fill_dir_params.emplace_back(FillDirParams(this->spacing, M_PI / 3.));
- fill_dir_params.emplace_back(FillDirParams(this->spacing, 2. * M_PI / 3., 0.5 * this->spacing / params2.density));
- if (! fill_surface_by_lines(surface, params2, fill_dir_params, polylines_out))
- printf("FillStars3::fill_surface() failed to fill a region.\n");
- return polylines_out;
-}
-
-Polylines FillCubic3::fill_surface(const Surface *surface, const FillParams &params)
-{
- // Each linear fill covers 1/3 of the target coverage.
- FillParams params2 = params;
- params2.density *= 0.333333333f;
- Polylines polylines_out;
- std::vector<FillDirParams> fill_dir_params;
- coordf_t dx = sqrt(0.5) * z;
- fill_dir_params.emplace_back(FillDirParams(this->spacing, 0., dx));
- fill_dir_params.emplace_back(FillDirParams(this->spacing, M_PI / 3., -dx));
- fill_dir_params.emplace_back(FillDirParams(this->spacing, 2. * M_PI / 3., dx));
- if (! fill_surface_by_lines(surface, params2, fill_dir_params, polylines_out))
- printf("FillCubic3::fill_surface() failed to fill a region.\n");
- return polylines_out;
-}
-
-} // namespace Slic3r
diff --git a/src/libslic3r/Fill/FillRectilinear3.hpp b/src/libslic3r/Fill/FillRectilinear3.hpp
deleted file mode 100644
index 2023a25b7..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 { return new FillRectilinear3(*this); };
- virtual ~FillRectilinear3() {}
- virtual Polylines fill_surface(const Surface *surface, const FillParams &params);
-
- 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 &params, std::vector<FillDirParams> &fill_dir_params, Polylines &polylines_out);
-};
-
-class FillGrid3 : public FillRectilinear3
-{
-public:
- virtual Fill* clone() const { return new FillGrid3(*this); };
- virtual ~FillGrid3() {}
- virtual Polylines fill_surface(const Surface *surface, const FillParams &params);
-
-protected:
- // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
- virtual float _layer_angle(size_t /* idx */) const { return 0.f; }
-};
-
-class FillTriangles3 : public FillRectilinear3
-{
-public:
- virtual Fill* clone() const { return new FillTriangles3(*this); };
- virtual ~FillTriangles3() {}
- virtual Polylines fill_surface(const Surface *surface, const FillParams &params);
-
-protected:
- // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
- virtual float _layer_angle(size_t /* idx */) const { return 0.f; }
-};
-
-class FillStars3 : public FillRectilinear3
-{
-public:
- virtual Fill* clone() const { return new FillStars3(*this); };
- virtual ~FillStars3() {}
- virtual Polylines fill_surface(const Surface *surface, const FillParams &params);
-
-protected:
- // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
- virtual float _layer_angle(size_t /* idx */) const { return 0.f; }
-};
-
-class FillCubic3 : public FillRectilinear3
-{
-public:
- virtual Fill* clone() const { return new FillCubic3(*this); };
- virtual ~FillCubic3() {}
- virtual Polylines fill_surface(const Surface *surface, const FillParams &params);
-
-protected:
- // The grid fill will keep the angle constant between the layers, see the implementation of Slic3r::Fill.
- virtual float _layer_angle(size_t /* idx */) const { return 0.f; }
-};
-
-
-}; // namespace Slic3r
-
-#endif // slic3r_FillRectilinear3_hpp_
diff --git a/src/libslic3r/Flow.cpp b/src/libslic3r/Flow.cpp
index 1678be999..e5dcf0731 100644
--- a/src/libslic3r/Flow.cpp
+++ b/src/libslic3r/Flow.cpp
@@ -53,7 +53,7 @@ static inline FlowRole opt_key_to_flow_role(const std::string &opt_key)
else if (opt_key == "support_material_extrusion_width")
return frSupportMaterial;
else
- throw std::runtime_error("opt_key_to_flow_role: invalid argument");
+ throw Slic3r::RuntimeError("opt_key_to_flow_role: invalid argument");
};
static inline void throw_on_missing_variable(const std::string &opt_key, const char *dependent_opt_key)
@@ -126,7 +126,7 @@ Flow Flow::new_from_config_width(FlowRole role, const ConfigOptionFloatOrPercent
{
// we need layer height unless it's a bridge
if (height <= 0 && bridge_flow_ratio == 0)
- throw std::invalid_argument("Invalid flow height supplied to new_from_config_width()");
+ throw Slic3r::InvalidArgument("Invalid flow height supplied to new_from_config_width()");
float w;
if (bridge_flow_ratio > 0) {
@@ -151,7 +151,7 @@ Flow Flow::new_from_spacing(float spacing, float nozzle_diameter, float height,
{
// we need layer height unless it's a bridge
if (height <= 0 && !bridge)
- throw std::invalid_argument("Invalid flow height supplied to new_from_spacing()");
+ throw Slic3r::InvalidArgument("Invalid flow height supplied to new_from_spacing()");
// Calculate width from spacing.
// For normal extrusons, extrusion width is wider than the spacing due to the rounding and squishing of the extrusions.
// For bridge extrusions, the extrusions are placed with a tiny BRIDGE_EXTRA_SPACING gaps between the threads.
diff --git a/src/libslic3r/Flow.hpp b/src/libslic3r/Flow.hpp
index 7d6e35873..9e57ce907 100644
--- a/src/libslic3r/Flow.hpp
+++ b/src/libslic3r/Flow.hpp
@@ -3,6 +3,7 @@
#include "libslic3r.h"
#include "Config.hpp"
+#include "Exception.hpp"
#include "ExtrusionEntity.hpp"
namespace Slic3r {
@@ -27,11 +28,11 @@ enum FlowRole {
frSupportMaterialInterface,
};
-class FlowError : public std::invalid_argument
+class FlowError : public Slic3r::InvalidArgument
{
public:
- FlowError(const std::string& what_arg) : invalid_argument(what_arg) {}
- FlowError(const char* what_arg) : invalid_argument(what_arg) {}
+ FlowError(const std::string& what_arg) : Slic3r::InvalidArgument(what_arg) {}
+ FlowError(const char* what_arg) : Slic3r::InvalidArgument(what_arg) {}
};
class FlowErrorNegativeSpacing : public FlowError
diff --git a/src/libslic3r/Format/3mf.cpp b/src/libslic3r/Format/3mf.cpp
index efeb23700..d021f0f6d 100644
--- a/src/libslic3r/Format/3mf.cpp
+++ b/src/libslic3r/Format/3mf.cpp
@@ -1,11 +1,11 @@
#include "../libslic3r.h"
+#include "../Exception.hpp"
#include "../Model.hpp"
#include "../Utils.hpp"
#include "../GCode.hpp"
#include "../Geometry.hpp"
-#if ENABLE_THUMBNAIL_GENERATOR
#include "../GCode/ThumbnailData.hpp"
-#endif // ENABLE_THUMBNAIL_GENERATOR
+#include "../Time.hpp"
#include "../I18N.hpp"
@@ -47,9 +47,7 @@ const std::string MODEL_EXTENSION = ".model";
const std::string MODEL_FILE = "3D/3dmodel.model"; // << this is the only format of the string which works with CURA
const std::string CONTENT_TYPES_FILE = "[Content_Types].xml";
const std::string RELATIONSHIPS_FILE = "_rels/.rels";
-#if ENABLE_THUMBNAIL_GENERATOR
const std::string THUMBNAIL_FILE = "Metadata/thumbnail.png";
-#endif // ENABLE_THUMBNAIL_GENERATOR
const std::string PRINT_CONFIG_FILE = "Metadata/Slic3r_PE.config";
const std::string MODEL_CONFIG_FILE = "Metadata/Slic3r_PE_model.config";
const std::string LAYER_HEIGHTS_PROFILE_FILE = "Metadata/Slic3r_PE_layer_heights_profile.txt";
@@ -58,56 +56,59 @@ const std::string SLA_SUPPORT_POINTS_FILE = "Metadata/Slic3r_PE_sla_support_poin
const std::string SLA_DRAIN_HOLES_FILE = "Metadata/Slic3r_PE_sla_drain_holes.txt";
const std::string CUSTOM_GCODE_PER_PRINT_Z_FILE = "Metadata/Prusa_Slicer_custom_gcode_per_print_z.xml";
-const char* MODEL_TAG = "model";
-const char* RESOURCES_TAG = "resources";
-const char* OBJECT_TAG = "object";
-const char* MESH_TAG = "mesh";
-const char* VERTICES_TAG = "vertices";
-const char* VERTEX_TAG = "vertex";
-const char* TRIANGLES_TAG = "triangles";
-const char* TRIANGLE_TAG = "triangle";
-const char* COMPONENTS_TAG = "components";
-const char* COMPONENT_TAG = "component";
-const char* BUILD_TAG = "build";
-const char* ITEM_TAG = "item";
-const char* METADATA_TAG = "metadata";
-
-const char* CONFIG_TAG = "config";
-const char* VOLUME_TAG = "volume";
-
-const char* UNIT_ATTR = "unit";
-const char* NAME_ATTR = "name";
-const char* TYPE_ATTR = "type";
-const char* ID_ATTR = "id";
-const char* X_ATTR = "x";
-const char* Y_ATTR = "y";
-const char* Z_ATTR = "z";
-const char* V1_ATTR = "v1";
-const char* V2_ATTR = "v2";
-const char* V3_ATTR = "v3";
-const char* OBJECTID_ATTR = "objectid";
-const char* TRANSFORM_ATTR = "transform";
-const char* PRINTABLE_ATTR = "printable";
-const char* INSTANCESCOUNT_ATTR = "instances_count";
-
-const char* KEY_ATTR = "key";
-const char* VALUE_ATTR = "value";
-const char* FIRST_TRIANGLE_ID_ATTR = "firstid";
-const char* LAST_TRIANGLE_ID_ATTR = "lastid";
-
-const char* OBJECT_TYPE = "object";
-const char* VOLUME_TYPE = "volume";
-
-const char* NAME_KEY = "name";
-const char* MODIFIER_KEY = "modifier";
-const char* VOLUME_TYPE_KEY = "volume_type";
-const char* MATRIX_KEY = "matrix";
-const char* SOURCE_FILE_KEY = "source_file";
-const char* SOURCE_OBJECT_ID_KEY = "source_object_id";
-const char* SOURCE_VOLUME_ID_KEY = "source_volume_id";
-const char* SOURCE_OFFSET_X_KEY = "source_offset_x";
-const char* SOURCE_OFFSET_Y_KEY = "source_offset_y";
-const char* SOURCE_OFFSET_Z_KEY = "source_offset_z";
+static constexpr const char* MODEL_TAG = "model";
+static constexpr const char* RESOURCES_TAG = "resources";
+static constexpr const char* OBJECT_TAG = "object";
+static constexpr const char* MESH_TAG = "mesh";
+static constexpr const char* VERTICES_TAG = "vertices";
+static constexpr const char* VERTEX_TAG = "vertex";
+static constexpr const char* TRIANGLES_TAG = "triangles";
+static constexpr const char* TRIANGLE_TAG = "triangle";
+static constexpr const char* COMPONENTS_TAG = "components";
+static constexpr const char* COMPONENT_TAG = "component";
+static constexpr const char* BUILD_TAG = "build";
+static constexpr const char* ITEM_TAG = "item";
+static constexpr const char* METADATA_TAG = "metadata";
+
+static constexpr const char* CONFIG_TAG = "config";
+static constexpr const char* VOLUME_TAG = "volume";
+
+static constexpr const char* UNIT_ATTR = "unit";
+static constexpr const char* NAME_ATTR = "name";
+static constexpr const char* TYPE_ATTR = "type";
+static constexpr const char* ID_ATTR = "id";
+static constexpr const char* X_ATTR = "x";
+static constexpr const char* Y_ATTR = "y";
+static constexpr const char* Z_ATTR = "z";
+static constexpr const char* V1_ATTR = "v1";
+static constexpr const char* V2_ATTR = "v2";
+static constexpr const char* V3_ATTR = "v3";
+static constexpr const char* OBJECTID_ATTR = "objectid";
+static constexpr const char* TRANSFORM_ATTR = "transform";
+static constexpr const char* PRINTABLE_ATTR = "printable";
+static constexpr const char* INSTANCESCOUNT_ATTR = "instances_count";
+static constexpr const char* CUSTOM_SUPPORTS_ATTR = "slic3rpe:custom_supports";
+static constexpr const char* CUSTOM_SEAM_ATTR = "slic3rpe:custom_seam";
+
+static constexpr const char* KEY_ATTR = "key";
+static constexpr const char* VALUE_ATTR = "value";
+static constexpr const char* FIRST_TRIANGLE_ID_ATTR = "firstid";
+static constexpr const char* LAST_TRIANGLE_ID_ATTR = "lastid";
+
+static constexpr const char* OBJECT_TYPE = "object";
+static constexpr const char* VOLUME_TYPE = "volume";
+
+static constexpr const char* NAME_KEY = "name";
+static constexpr const char* MODIFIER_KEY = "modifier";
+static constexpr const char* VOLUME_TYPE_KEY = "volume_type";
+static constexpr const char* MATRIX_KEY = "matrix";
+static constexpr const char* SOURCE_FILE_KEY = "source_file";
+static constexpr const char* SOURCE_OBJECT_ID_KEY = "source_object_id";
+static constexpr const char* SOURCE_VOLUME_ID_KEY = "source_volume_id";
+static constexpr const char* SOURCE_OFFSET_X_KEY = "source_offset_x";
+static constexpr const char* SOURCE_OFFSET_Y_KEY = "source_offset_y";
+static constexpr const char* SOURCE_OFFSET_Z_KEY = "source_offset_z";
+static constexpr const char* SOURCE_IN_INCHES = "source_in_inches";
const unsigned int VALID_OBJECT_TYPES_COUNT = 1;
const char* VALID_OBJECT_TYPES[] =
@@ -124,11 +125,11 @@ const char* INVALID_OBJECT_TYPES[] =
"other"
};
-class version_error : public std::runtime_error
+class version_error : public Slic3r::FileIOError
{
public:
- version_error(const std::string& what_arg) : std::runtime_error(what_arg) {}
- version_error(const char* what_arg) : std::runtime_error(what_arg) {}
+ version_error(const std::string& what_arg) : Slic3r::FileIOError(what_arg) {}
+ version_error(const char* what_arg) : Slic3r::FileIOError(what_arg) {}
};
const char* get_attribute_value_charptr(const char** attributes, unsigned int attributes_size, const char* attribute_key)
@@ -286,6 +287,8 @@ namespace Slic3r {
{
std::vector<float> vertices;
std::vector<unsigned int> triangles;
+ std::vector<std::string> custom_supports;
+ std::vector<std::string> custom_seam;
bool empty()
{
@@ -296,6 +299,8 @@ namespace Slic3r {
{
vertices.clear();
triangles.clear();
+ custom_supports.clear();
+ custom_seam.clear();
}
};
@@ -604,7 +609,7 @@ namespace Slic3r {
{
// ensure the zip archive is closed and rethrow the exception
close_zip_reader(&archive);
- throw std::runtime_error(e.what());
+ throw Slic3r::FileIOError(e.what());
}
}
}
@@ -679,23 +684,23 @@ namespace Slic3r {
// m_layer_heights_profiles are indexed by a 1 based model object index.
IdToLayerHeightsProfileMap::iterator obj_layer_heights_profile = m_layer_heights_profiles.find(object.second + 1);
if (obj_layer_heights_profile != m_layer_heights_profiles.end())
- model_object->layer_height_profile = obj_layer_heights_profile->second;
+ model_object->layer_height_profile.set(std::move(obj_layer_heights_profile->second));
// m_layer_config_ranges are indexed by a 1 based model object index.
IdToLayerConfigRangesMap::iterator obj_layer_config_ranges = m_layer_config_ranges.find(object.second + 1);
if (obj_layer_config_ranges != m_layer_config_ranges.end())
- model_object->layer_config_ranges = obj_layer_config_ranges->second;
+ model_object->layer_config_ranges = std::move(obj_layer_config_ranges->second);
// m_sla_support_points are indexed by a 1 based model object index.
IdToSlaSupportPointsMap::iterator obj_sla_support_points = m_sla_support_points.find(object.second + 1);
if (obj_sla_support_points != m_sla_support_points.end() && !obj_sla_support_points->second.empty()) {
- model_object->sla_support_points = obj_sla_support_points->second;
+ model_object->sla_support_points = std::move(obj_sla_support_points->second);
model_object->sla_points_status = sla::PointsStatus::UserModified;
}
IdToSlaDrainHolesMap::iterator obj_drain_holes = m_sla_drain_holes.find(object.second + 1);
if (obj_drain_holes != m_sla_drain_holes.end() && !obj_drain_holes->second.empty()) {
- model_object->sla_drain_holes = obj_drain_holes->second;
+ model_object->sla_drain_holes = std::move(obj_drain_holes->second);
}
IdToMetadataMap::iterator obj_metadata = m_objects_metadata.find(object.first);
@@ -777,7 +782,7 @@ namespace Slic3r {
{
char error_buf[1024];
::sprintf(error_buf, "Error (%s) while parsing '%s' at line %d", XML_ErrorString(XML_GetErrorCode(data->parser)), data->stat.m_filename, (int)XML_GetCurrentLineNumber(data->parser));
- throw std::runtime_error(error_buf);
+ throw Slic3r::FileIOError(error_buf);
}
return n;
@@ -786,7 +791,7 @@ namespace Slic3r {
catch (const version_error& e)
{
// rethrow the exception
- throw std::runtime_error(e.what());
+ throw Slic3r::FileIOError(e.what());
}
catch (std::exception& e)
{
@@ -930,7 +935,7 @@ namespace Slic3r {
double max_z = range_tree.get<double>("<xmlattr>.max_z");
// get Z range information
- DynamicPrintConfig& config = config_ranges[{ min_z, max_z }];
+ DynamicPrintConfig config;
for (const auto& option : range_tree)
{
@@ -941,10 +946,12 @@ namespace Slic3r {
config.set_deserialize(opt_key, value);
}
+
+ config_ranges[{ min_z, max_z }].assign_config(std::move(config));
}
if (!config_ranges.empty())
- m_layer_config_ranges.insert(IdToLayerConfigRangesMap::value_type(obj_idx, config_ranges));
+ m_layer_config_ranges.insert(IdToLayerConfigRangesMap::value_type(obj_idx, std::move(config_ranges)));
}
}
}
@@ -1114,6 +1121,15 @@ namespace Slic3r {
float(std::atof(object_data_points[i+6].c_str())),
float(std::atof(object_data_points[i+7].c_str())));
}
+
+ // The holes are saved elevated above the mesh and deeper (bad idea indeed).
+ // This is retained for compatibility.
+ // Place the hole to the mesh and make it shallower to compensate.
+ // The offset is 1 mm above the mesh.
+ for (sla::DrainHole& hole : sla_drain_holes) {
+ hole.pos += hole.normal.normalized();
+ hole.height -= 1.f;
+ }
if (!sla_drain_holes.empty())
m_sla_drain_holes.insert(IdToSlaDrainHolesMap::value_type(object_id, sla_drain_holes));
@@ -1201,13 +1217,32 @@ namespace Slic3r {
}
if (code.first != "code")
continue;
+
pt::ptree tree = code.second;
- double print_z = tree.get<double> ("<xmlattr>.print_z" );
- std::string gcode = tree.get<std::string> ("<xmlattr>.gcode" );
- int extruder = tree.get<int> ("<xmlattr>.extruder" );
- std::string color = tree.get<std::string> ("<xmlattr>.color" );
+ double print_z = tree.get<double> ("<xmlattr>.print_z" );
+ int extruder = tree.get<int> ("<xmlattr>.extruder");
+ std::string color = tree.get<std::string> ("<xmlattr>.color" );
- m_model->custom_gcode_per_print_z.gcodes.push_back(CustomGCode::Item{print_z, gcode, extruder, color}) ;
+ CustomGCode::Type type;
+ std::string extra;
+ if (tree.find("type") == tree.not_found())
+ {
+ // It means that data was saved in old version (2.2.0 and older) of PrusaSlicer
+ // read old data ...
+ std::string gcode = tree.get<std::string> ("<xmlattr>.gcode");
+ // ... and interpret them to the new data
+ type = gcode == "M600" ? CustomGCode::ColorChange :
+ gcode == "M601" ? CustomGCode::PausePrint :
+ gcode == "tool_change" ? CustomGCode::ToolChange : CustomGCode::Custom;
+ extra = type == CustomGCode::PausePrint ? color :
+ type == CustomGCode::Custom ? gcode : "";
+ }
+ else
+ {
+ type = static_cast<CustomGCode::Type>(tree.get<int>("<xmlattr>.type"));
+ extra = tree.get<std::string>("<xmlattr>.extra");
+ }
+ m_model->custom_gcode_per_print_z.gcodes.push_back(CustomGCode::Item{print_z, type, extruder, color, extra}) ;
}
}
}
@@ -1523,6 +1558,9 @@ namespace Slic3r {
m_curr_object.geometry.triangles.push_back((unsigned int)get_attribute_value_int(attributes, num_attributes, V1_ATTR));
m_curr_object.geometry.triangles.push_back((unsigned int)get_attribute_value_int(attributes, num_attributes, V2_ATTR));
m_curr_object.geometry.triangles.push_back((unsigned int)get_attribute_value_int(attributes, num_attributes, V3_ATTR));
+
+ m_curr_object.geometry.custom_supports.push_back(get_attribute_value_string(attributes, num_attributes, CUSTOM_SUPPORTS_ATTR));
+ m_curr_object.geometry.custom_seam.push_back(get_attribute_value_string(attributes, num_attributes, CUSTOM_SEAM_ATTR));
return true;
}
@@ -1722,7 +1760,7 @@ namespace Slic3r {
}
// Added because of github #3435, currently not used by PrusaSlicer
- int instances_count_id = get_attribute_value_int(attributes, num_attributes, INSTANCESCOUNT_ATTR);
+ // int instances_count_id = get_attribute_value_int(attributes, num_attributes, INSTANCESCOUNT_ATTR);
m_objects_metadata.insert(IdToMetadataMap::value_type(object_id, ObjectMetadata()));
m_curr_config.object_id = object_id;
@@ -1856,6 +1894,18 @@ namespace Slic3r {
volume->source.transform = Slic3r::Geometry::Transformation(volume_matrix_to_object);
volume->calculate_convex_hull();
+ // recreate custom supports and seam from previously loaded attribute
+ for (unsigned i=0; i<triangles_count; ++i) {
+ size_t index = src_start_id/3 + i;
+ assert(index < geometry.custom_supports.size());
+ assert(index < geometry.custom_seam.size());
+ if (! geometry.custom_supports[index].empty())
+ volume->supported_facets.set_triangle_from_string(i, geometry.custom_supports[index]);
+ if (! geometry.custom_seam[index].empty())
+ volume->seam_facets.set_triangle_from_string(i, geometry.custom_seam[index]);
+ }
+
+
// apply the remaining volume's metadata
for (const Metadata& metadata : volume_data.metadata)
{
@@ -1877,6 +1927,8 @@ namespace Slic3r {
volume->source.mesh_offset(1) = ::atof(metadata.value.c_str());
else if (metadata.key == SOURCE_OFFSET_Z_KEY)
volume->source.mesh_offset(2) = ::atof(metadata.value.c_str());
+ else if (metadata.key == SOURCE_IN_INCHES)
+ volume->source.is_converted_from_inches = metadata.value == "1";
else
volume->config.set_deserialize(metadata.key, metadata.value);
}
@@ -1969,24 +2021,14 @@ namespace Slic3r {
bool m_fullpath_sources{ true };
public:
-#if ENABLE_THUMBNAIL_GENERATOR
bool save_model_to_file(const std::string& filename, Model& model, const DynamicPrintConfig* config, bool fullpath_sources, const ThumbnailData* thumbnail_data = nullptr);
-#else
- bool save_model_to_file(const std::string& filename, Model& model, const DynamicPrintConfig* config, bool fullpath_sources);
-#endif // ENABLE_THUMBNAIL_GENERATOR
private:
-#if ENABLE_THUMBNAIL_GENERATOR
bool _save_model_to_file(const std::string& filename, Model& model, const DynamicPrintConfig* config, const ThumbnailData* thumbnail_data);
-#else
- bool _save_model_to_file(const std::string& filename, Model& model, const DynamicPrintConfig* config);
-#endif // ENABLE_THUMBNAIL_GENERATOR
bool _add_content_types_file_to_archive(mz_zip_archive& archive);
-#if ENABLE_THUMBNAIL_GENERATOR
bool _add_thumbnail_file_to_archive(mz_zip_archive& archive, const ThumbnailData& thumbnail_data);
-#endif // ENABLE_THUMBNAIL_GENERATOR
bool _add_relationships_file_to_archive(mz_zip_archive& archive);
- bool _add_model_file_to_archive(mz_zip_archive& archive, const Model& model, IdToObjectDataMap &objects_data);
+ bool _add_model_file_to_archive(const std::string& filename, mz_zip_archive& archive, const Model& model, IdToObjectDataMap& objects_data);
bool _add_object_to_model_stream(std::stringstream& stream, unsigned int& object_id, ModelObject& object, BuildItemsList& build_items, VolumeToOffsetsMap& volumes_offsets);
bool _add_mesh_to_object_stream(std::stringstream& stream, ModelObject& object, VolumeToOffsetsMap& volumes_offsets);
bool _add_build_to_model_stream(std::stringstream& stream, const BuildItemsList& build_items);
@@ -1996,29 +2038,17 @@ namespace Slic3r {
bool _add_sla_drain_holes_file_to_archive(mz_zip_archive& archive, Model& model);
bool _add_print_config_file_to_archive(mz_zip_archive& archive, const DynamicPrintConfig &config);
bool _add_model_config_file_to_archive(mz_zip_archive& archive, const Model& model, const IdToObjectDataMap &objects_data);
- bool _add_custom_gcode_per_print_z_file_to_archive(mz_zip_archive& archive, Model& model);
+ bool _add_custom_gcode_per_print_z_file_to_archive(mz_zip_archive& archive, Model& model, const DynamicPrintConfig* config);
};
-#if ENABLE_THUMBNAIL_GENERATOR
bool _3MF_Exporter::save_model_to_file(const std::string& filename, Model& model, const DynamicPrintConfig* config, bool fullpath_sources, const ThumbnailData* thumbnail_data)
{
clear_errors();
m_fullpath_sources = fullpath_sources;
return _save_model_to_file(filename, model, config, thumbnail_data);
}
-#else
- bool _3MF_Exporter::save_model_to_file(const std::string& filename, Model& model, const DynamicPrintConfig* config, bool fullpath_sources)
- {
- clear_errors();
- return _save_model_to_file(filename, model, config);
- }
-#endif // ENABLE_THUMBNAIL_GENERATOR
-#if ENABLE_THUMBNAIL_GENERATOR
bool _3MF_Exporter::_save_model_to_file(const std::string& filename, Model& model, const DynamicPrintConfig* config, const ThumbnailData* thumbnail_data)
-#else
- bool _3MF_Exporter::_save_model_to_file(const std::string& filename, Model& model, const DynamicPrintConfig* config)
-#endif // ENABLE_THUMBNAIL_GENERATOR
{
mz_zip_archive archive;
mz_zip_zero_struct(&archive);
@@ -2037,7 +2067,6 @@ namespace Slic3r {
return false;
}
-#if ENABLE_THUMBNAIL_GENERATOR
if ((thumbnail_data != nullptr) && thumbnail_data->is_valid())
{
// Adds the file Metadata/thumbnail.png.
@@ -2048,7 +2077,6 @@ namespace Slic3r {
return false;
}
}
-#endif // ENABLE_THUMBNAIL_GENERATOR
// Adds relationships file ("_rels/.rels").
// The content of this file is the same for each PrusaSlicer 3mf.
@@ -2063,7 +2091,7 @@ namespace Slic3r {
// Adds model file ("3D/3dmodel.model").
// This is the one and only file that contains all the geometry (vertices and triangles) of all ModelVolumes.
IdToObjectDataMap objects_data;
- if (!_add_model_file_to_archive(archive, model, objects_data))
+ if (!_add_model_file_to_archive(filename, archive, model, objects_data))
{
close_zip_writer(&archive);
boost::filesystem::remove(filename);
@@ -2110,7 +2138,7 @@ namespace Slic3r {
// Adds custom gcode per height file ("Metadata/Prusa_Slicer_custom_gcode_per_print_z.xml").
// All custom gcode per height of whole Model are stored here
- if (!_add_custom_gcode_per_print_z_file_to_archive(archive, model))
+ if (!_add_custom_gcode_per_print_z_file_to_archive(archive, model, config))
{
close_zip_writer(&archive);
boost::filesystem::remove(filename);
@@ -2160,9 +2188,7 @@ namespace Slic3r {
stream << "<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">\n";
stream << " <Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\" />\n";
stream << " <Default Extension=\"model\" ContentType=\"application/vnd.ms-package.3dmanufacturing-3dmodel+xml\" />\n";
-#if ENABLE_THUMBNAIL_GENERATOR
stream << " <Default Extension=\"png\" ContentType=\"image/png\" />\n";
-#endif // ENABLE_THUMBNAIL_GENERATOR
stream << "</Types>";
std::string out = stream.str();
@@ -2176,7 +2202,6 @@ namespace Slic3r {
return true;
}
-#if ENABLE_THUMBNAIL_GENERATOR
bool _3MF_Exporter::_add_thumbnail_file_to_archive(mz_zip_archive& archive, const ThumbnailData& thumbnail_data)
{
bool res = false;
@@ -2194,7 +2219,6 @@ namespace Slic3r {
return res;
}
-#endif // ENABLE_THUMBNAIL_GENERATOR
bool _3MF_Exporter::_add_relationships_file_to_archive(mz_zip_archive& archive)
{
@@ -2202,9 +2226,7 @@ namespace Slic3r {
stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
stream << "<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">\n";
stream << " <Relationship Target=\"/" << MODEL_FILE << "\" Id=\"rel-1\" Type=\"http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodel\" />\n";
-#if ENABLE_THUMBNAIL_GENERATOR
stream << " <Relationship Target=\"/" << THUMBNAIL_FILE << "\" Id=\"rel-2\" Type=\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail\" />\n";
-#endif // ENABLE_THUMBNAIL_GENERATOR
stream << "</Relationships>";
std::string out = stream.str();
@@ -2218,7 +2240,7 @@ namespace Slic3r {
return true;
}
- bool _3MF_Exporter::_add_model_file_to_archive(mz_zip_archive& archive, const Model& model, IdToObjectDataMap &objects_data)
+ bool _3MF_Exporter::_add_model_file_to_archive(const std::string& filename, mz_zip_archive& archive, const Model& model, IdToObjectDataMap& objects_data)
{
std::stringstream stream;
// https://en.cppreference.com/w/cpp/types/numeric_limits/max_digits10
@@ -2229,6 +2251,19 @@ namespace Slic3r {
stream << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
stream << "<" << MODEL_TAG << " unit=\"millimeter\" xml:lang=\"en-US\" xmlns=\"http://schemas.microsoft.com/3dmanufacturing/core/2015/02\" xmlns:slic3rpe=\"http://schemas.slic3r.org/3mf/2017/06\">\n";
stream << " <" << METADATA_TAG << " name=\"" << SLIC3RPE_3MF_VERSION << "\">" << VERSION_3MF << "</" << METADATA_TAG << ">\n";
+ std::string name = xml_escape(boost::filesystem::path(filename).stem().string());
+ stream << " <" << METADATA_TAG << " name=\"Title\">" << name << "</" << METADATA_TAG << ">\n";
+ stream << " <" << METADATA_TAG << " name=\"Designer\">" << "</" << METADATA_TAG << ">\n";
+ stream << " <" << METADATA_TAG << " name=\"Description\">" << name << "</" << METADATA_TAG << ">\n";
+ stream << " <" << METADATA_TAG << " name=\"Copyright\">" << "</" << METADATA_TAG << ">\n";
+ stream << " <" << METADATA_TAG << " name=\"LicenseTerms\">" << "</" << METADATA_TAG << ">\n";
+ stream << " <" << METADATA_TAG << " name=\"Rating\">" << "</" << METADATA_TAG << ">\n";
+ std::string date = Slic3r::Utils::utc_timestamp(Slic3r::Utils::get_current_time_utc());
+ // keep only the date part of the string
+ date = date.substr(0, 10);
+ stream << " <" << METADATA_TAG << " name=\"CreationDate\">" << date << "</" << METADATA_TAG << ">\n";
+ stream << " <" << METADATA_TAG << " name=\"ModificationDate\">" << date << "</" << METADATA_TAG << ">\n";
+ stream << " <" << METADATA_TAG << " name=\"Application\">" << SLIC3R_APP_KEY << "-" << SLIC3R_VERSION << "</" << METADATA_TAG << ">\n";
stream << " <" << RESOURCES_TAG << ">\n";
// Instance transformations, indexed by the 3MF object ID (which is a linear serialization of all instances of all ModelObjects).
@@ -2331,9 +2366,9 @@ namespace Slic3r {
continue;
if (!volume->mesh().repaired)
- throw std::runtime_error("store_3mf() requires repair()");
+ throw Slic3r::FileIOError("store_3mf() requires repair()");
if (!volume->mesh().has_shared_vertices())
- throw std::runtime_error("store_3mf() requires shared vertices");
+ throw Slic3r::FileIOError("store_3mf() requires shared vertices");
volumes_offsets.insert(VolumeToOffsetsMap::value_type(volume, Offsets(vertices_count))).first;
@@ -2377,13 +2412,22 @@ namespace Slic3r {
triangles_count += (int)its.indices.size();
volume_it->second.last_triangle_id = triangles_count - 1;
- for (size_t i = 0; i < its.indices.size(); ++ i)
+ for (int i = 0; i < int(its.indices.size()); ++ i)
{
stream << " <" << TRIANGLE_TAG << " ";
for (int j = 0; j < 3; ++j)
{
stream << "v" << j + 1 << "=\"" << its.indices[i][j] + volume_it->second.first_vertex_id << "\" ";
}
+
+ std::string custom_supports_data_string = volume->supported_facets.get_triangle_as_string(i);
+ if (! custom_supports_data_string.empty())
+ stream << CUSTOM_SUPPORTS_ATTR << "=\"" << custom_supports_data_string << "\" ";
+
+ std::string custom_seam_data_string = volume->seam_facets.get_triangle_as_string(i);
+ if (! custom_seam_data_string.empty())
+ stream << CUSTOM_SEAM_ATTR << "=\"" << custom_seam_data_string << "\" ";
+
stream << "/>\n";
}
}
@@ -2433,7 +2477,7 @@ namespace Slic3r {
for (const ModelObject* object : model.objects)
{
++count;
- const std::vector<double> &layer_height_profile = object->layer_height_profile;
+ const std::vector<double>& layer_height_profile = object->layer_height_profile.get();
if ((layer_height_profile.size() >= 4) && ((layer_height_profile.size() % 2) == 0))
{
sprintf(buffer, "object_id=%d|", count);
@@ -2488,7 +2532,7 @@ namespace Slic3r {
range_tree.put("<xmlattr>.max_z", range.first.second);
// store range configuration
- const DynamicPrintConfig& config = range.second;
+ const ModelConfig& config = range.second;
for (const std::string& opt_key : config.keys())
{
pt::ptree& opt_tree = range_tree.add("option", config.opt_serialize(opt_key));
@@ -2574,7 +2618,18 @@ namespace Slic3r {
for (const ModelObject* object : model.objects)
{
++count;
- auto& drain_holes = object->sla_drain_holes;
+ sla::DrainHoles drain_holes = object->sla_drain_holes;
+
+ // The holes were placed 1mm above the mesh in the first implementation.
+ // This was a bad idea and the reference point was changed in 2.3 so
+ // to be on the mesh exactly. The elevated position is still saved
+ // in 3MFs for compatibility reasons.
+ for (sla::DrainHole& hole : drain_holes) {
+ hole.pos -= hole.normal.normalized();
+ hole.height += 1.f;
+ }
+
+
if (!drain_holes.empty())
{
out += string_printf(fmt, count);
@@ -2697,15 +2752,20 @@ namespace Slic3r {
stream << "\"/>\n";
// stores volume's source data
- if (!volume->source.input_file.empty())
{
std::string input_file = xml_escape(m_fullpath_sources ? volume->source.input_file : boost::filesystem::path(volume->source.input_file).filename().string());
- stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << SOURCE_FILE_KEY << "\" " << VALUE_ATTR << "=\"" << input_file << "\"/>\n";
- stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << SOURCE_OBJECT_ID_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.object_idx << "\"/>\n";
- stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << SOURCE_VOLUME_ID_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.volume_idx << "\"/>\n";
- stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << SOURCE_OFFSET_X_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.mesh_offset(0) << "\"/>\n";
- stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << SOURCE_OFFSET_Y_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.mesh_offset(1) << "\"/>\n";
- stream << " <" << METADATA_TAG << " " << TYPE_ATTR << "=\"" << VOLUME_TYPE << "\" " << KEY_ATTR << "=\"" << SOURCE_OFFSET_Z_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.mesh_offset(2) << "\"/>\n";
+ std::string prefix = std::string(" <") + METADATA_TAG + " " + TYPE_ATTR + "=\"" + VOLUME_TYPE + "\" " + KEY_ATTR + "=\"";
+ if (! volume->source.input_file.empty()) {
+ stream << prefix << SOURCE_FILE_KEY << "\" " << VALUE_ATTR << "=\"" << input_file << "\"/>\n";
+ stream << prefix << SOURCE_OBJECT_ID_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.object_idx << "\"/>\n";
+ stream << prefix << SOURCE_VOLUME_ID_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.volume_idx << "\"/>\n";
+ stream << prefix << SOURCE_OFFSET_X_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.mesh_offset(0) << "\"/>\n";
+ stream << prefix << SOURCE_OFFSET_Y_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.mesh_offset(1) << "\"/>\n";
+ stream << prefix << SOURCE_OFFSET_Z_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.mesh_offset(2) << "\"/>\n";
+ stream << prefix << SOURCE_OFFSET_Z_KEY << "\" " << VALUE_ATTR << "=\"" << volume->source.mesh_offset(2) << "\"/>\n";
+ }
+ if (volume->source.is_converted_from_inches)
+ stream << prefix << SOURCE_IN_INCHES << "\" " << VALUE_ATTR << "=\"1\"/>\n";
}
// stores volume's config data
@@ -2736,7 +2796,7 @@ namespace Slic3r {
return true;
}
-bool _3MF_Exporter::_add_custom_gcode_per_print_z_file_to_archive( mz_zip_archive& archive, Model& model)
+bool _3MF_Exporter::_add_custom_gcode_per_print_z_file_to_archive( mz_zip_archive& archive, Model& model, const DynamicPrintConfig* config)
{
std::string out = "";
@@ -2748,11 +2808,20 @@ bool _3MF_Exporter::_add_custom_gcode_per_print_z_file_to_archive( mz_zip_archiv
for (const CustomGCode::Item& code : model.custom_gcode_per_print_z.gcodes)
{
pt::ptree& code_tree = main_tree.add("code", "");
- // store minX and maxZ
+
+ // store data of custom_gcode_per_print_z
code_tree.put("<xmlattr>.print_z" , code.print_z );
- code_tree.put("<xmlattr>.gcode" , code.gcode );
+ code_tree.put("<xmlattr>.type" , static_cast<int>(code.type));
code_tree.put("<xmlattr>.extruder" , code.extruder );
code_tree.put("<xmlattr>.color" , code.color );
+ code_tree.put("<xmlattr>.extra" , code.extra );
+
+ // add gcode field data for the old version of the PrusaSlicer
+ std::string gcode = code.type == CustomGCode::ColorChange ? config->opt_string("color_change_gcode") :
+ code.type == CustomGCode::PausePrint ? config->opt_string("pause_print_gcode") :
+ code.type == CustomGCode::Template ? config->opt_string("template_custom_gcode") :
+ code.type == CustomGCode::ToolChange ? "tool_change" : code.extra;
+ code_tree.put("<xmlattr>.gcode" , gcode );
}
pt::ptree& mode_tree = main_tree.add("mode", "");
@@ -2795,22 +2864,13 @@ bool load_3mf(const char* path, DynamicPrintConfig* config, Model* model, bool c
return res;
}
-#if ENABLE_THUMBNAIL_GENERATOR
bool store_3mf(const char* path, Model* model, const DynamicPrintConfig* config, bool fullpath_sources, const ThumbnailData* thumbnail_data)
-#else
-bool store_3mf(const char* path, Model* model, const DynamicPrintConfig* config, bool fullpath_sources)
-#endif // ENABLE_THUMBNAIL_GENERATOR
{
if ((path == nullptr) || (model == nullptr))
return false;
_3MF_Exporter exporter;
-#if ENABLE_THUMBNAIL_GENERATOR
bool res = exporter.save_model_to_file(path, *model, config, fullpath_sources, thumbnail_data);
-#else
- bool res = exporter.save_model_to_file(path, *model, config, fullpath_sources);
-#endif // ENABLE_THUMBNAIL_GENERATOR
-
if (!res)
exporter.log_errors();
diff --git a/src/libslic3r/Format/3mf.hpp b/src/libslic3r/Format/3mf.hpp
index 8ca1ebde8..ccfd9356d 100644
--- a/src/libslic3r/Format/3mf.hpp
+++ b/src/libslic3r/Format/3mf.hpp
@@ -26,21 +26,15 @@ namespace Slic3r {
class Model;
class DynamicPrintConfig;
-#if ENABLE_THUMBNAIL_GENERATOR
struct ThumbnailData;
-#endif // ENABLE_THUMBNAIL_GENERATOR
// Load the content of a 3mf file into the given model and preset bundle.
extern bool load_3mf(const char* path, DynamicPrintConfig* config, Model* model, bool check_version);
// Save the given model and the config data contained in the given Print into a 3mf file.
// The model could be modified during the export process if meshes are not repaired or have no shared vertices
-#if ENABLE_THUMBNAIL_GENERATOR
extern bool store_3mf(const char* path, Model* model, const DynamicPrintConfig* config, bool fullpath_sources, const ThumbnailData* thumbnail_data = nullptr);
-#else
- extern bool store_3mf(const char* path, Model* model, const DynamicPrintConfig* config, bool fullpath_sources);
-#endif // ENABLE_THUMBNAIL_GENERATOR
-}; // namespace Slic3r
+} // namespace Slic3r
#endif /* slic3r_Format_3mf_hpp_ */
diff --git a/src/libslic3r/Format/AMF.cpp b/src/libslic3r/Format/AMF.cpp
index 2dc4ea0ba..07095d10b 100644
--- a/src/libslic3r/Format/AMF.cpp
+++ b/src/libslic3r/Format/AMF.cpp
@@ -7,6 +7,7 @@
#include <boost/nowide/cstdio.hpp>
#include "../libslic3r.h"
+#include "../Exception.hpp"
#include "../Model.hpp"
#include "../GCode.hpp"
#include "../PrintConfig.hpp"
@@ -240,7 +241,7 @@ struct AMFParserContext
// Current instance allocated for an amf/constellation/instance subtree.
Instance *m_instance;
// Generic string buffer for vertices, face indices, metadata etc.
- std::string m_value[4];
+ std::string m_value[5];
// Pointer to config to update if config data are stored inside the amf file
DynamicPrintConfig *m_config;
@@ -314,9 +315,26 @@ void AMFParserContext::startElement(const char *name, const char **atts)
if (strcmp(name, "code") == 0) {
node_type_new = NODE_TYPE_GCODE_PER_HEIGHT;
m_value[0] = get_attribute(atts, "print_z");
- m_value[1] = get_attribute(atts, "gcode");
- m_value[2] = get_attribute(atts, "extruder");
- m_value[3] = get_attribute(atts, "color");
+ m_value[1] = get_attribute(atts, "extruder");
+ m_value[2] = get_attribute(atts, "color");
+ if (get_attribute(atts, "type"))
+ {
+ m_value[3] = get_attribute(atts, "type");
+ m_value[4] = get_attribute(atts, "extra");
+ }
+ else
+ {
+ // It means that data was saved in old version (2.2.0 and older) of PrusaSlicer
+ // read old data ...
+ std::string gcode = get_attribute(atts, "gcode");
+ // ... and interpret them to the new data
+ CustomGCode::Type type= gcode == "M600" ? CustomGCode::ColorChange :
+ gcode == "M601" ? CustomGCode::PausePrint :
+ gcode == "tool_change" ? CustomGCode::ToolChange : CustomGCode::Custom;
+ m_value[3] = std::to_string(static_cast<int>(type));
+ m_value[4] = type == CustomGCode::PausePrint ? m_value[2] :
+ type == CustomGCode::Custom ? gcode : "";
+ }
}
else if (strcmp(name, "mode") == 0) {
node_type_new = NODE_TYPE_CUSTOM_GCODE_MODE;
@@ -640,12 +658,13 @@ void AMFParserContext::endElement(const char * /* name */)
break;
case NODE_TYPE_GCODE_PER_HEIGHT: {
- double print_z = double(atof(m_value[0].c_str()));
- const std::string& gcode = m_value[1];
- int extruder = atoi(m_value[2].c_str());
- const std::string& color = m_value[3];
+ double print_z = double(atof(m_value[0].c_str()));
+ int extruder = atoi(m_value[1].c_str());
+ const std::string& color= m_value[2];
+ CustomGCode::Type type = static_cast<CustomGCode::Type>(atoi(m_value[3].c_str()));
+ const std::string& extra= m_value[4];
- m_model.custom_gcode_per_print_z.gcodes.push_back(CustomGCode::Item{print_z, gcode, extruder, color});
+ m_model.custom_gcode_per_print_z.gcodes.push_back(CustomGCode::Item{print_z, type, extruder, color, extra});
for (std::string& val: m_value)
val.clear();
@@ -669,7 +688,7 @@ void AMFParserContext::endElement(const char * /* name */)
else if (strncmp(m_value[0].c_str(), "slic3r.", 7) == 0) {
const char *opt_key = m_value[0].c_str() + 7;
if (print_config_def.options.find(opt_key) != print_config_def.options.end()) {
- DynamicPrintConfig *config = nullptr;
+ ModelConfig *config = nullptr;
if (m_path.size() == 3) {
if (m_path[1] == NODE_TYPE_MATERIAL && m_material)
config = &m_material->config;
@@ -687,15 +706,17 @@ void AMFParserContext::endElement(const char * /* name */)
} else if (m_path.size() == 3 && m_path[1] == NODE_TYPE_OBJECT && m_object && strcmp(opt_key, "layer_height_profile") == 0) {
// Parse object's layer height profile, a semicolon separated list of floats.
char *p = m_value[1].data();
+ std::vector<coordf_t> data;
for (;;) {
char *end = strchr(p, ';');
if (end != nullptr)
*end = 0;
- m_object->layer_height_profile.push_back(float(atof(p)));
+ data.emplace_back(float(atof(p)));
if (end == nullptr)
break;
p = end + 1;
}
+ m_object->layer_height_profile.set(std::move(data));
}
else if (m_path.size() == 3 && m_path[1] == NODE_TYPE_OBJECT && m_object && strcmp(opt_key, "sla_support_points") == 0) {
// Parse object's layer height profile, a semicolon separated list of floats.
@@ -757,6 +778,9 @@ void AMFParserContext::endElement(const char * /* name */)
else if (strcmp(opt_key, "source_offset_z") == 0) {
m_volume->source.mesh_offset(2) = ::atof(m_value[1].c_str());
}
+ else if (strcmp(opt_key, "source_in_inches") == 0) {
+ m_volume->source.is_converted_from_inches = m_value[1] == "1";
+ }
}
} else if (m_path.size() == 3) {
if (m_path[1] == NODE_TYPE_MATERIAL) {
@@ -905,7 +929,7 @@ bool extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_fi
{
char error_buf[1024];
::sprintf(error_buf, "Error (%s) while parsing '%s' at line %d", XML_ErrorString(XML_GetErrorCode(data->parser)), data->stat.m_filename, (int)XML_GetCurrentLineNumber(data->parser));
- throw std::runtime_error(error_buf);
+ throw Slic3r::FileIOError(error_buf);
}
return n;
@@ -930,9 +954,9 @@ bool extract_model_from_archive(mz_zip_archive& archive, const mz_zip_archive_fi
if (check_version && (ctx.m_version > VERSION_AMF_COMPATIBLE))
{
// std::string msg = _(L("The selected amf file has been saved with a newer version of " + std::string(SLIC3R_APP_NAME) + " and is not compatible."));
- // throw std::runtime_error(msg.c_str());
+ // throw Slic3r::FileIOError(msg.c_str());
const std::string msg = (boost::format(_(L("The selected amf file has been saved with a newer version of %1% and is not compatible."))) % std::string(SLIC3R_APP_NAME)).str();
- throw std::runtime_error(msg);
+ throw Slic3r::FileIOError(msg);
}
return true;
@@ -976,7 +1000,7 @@ bool load_amf_archive(const char* path, DynamicPrintConfig* config, Model* model
{
// ensure the zip archive is closed and rethrow the exception
close_zip_reader(&archive);
- throw std::runtime_error(e.what());
+ throw Slic3r::FileIOError(e.what());
}
break;
@@ -996,6 +1020,12 @@ bool load_amf_archive(const char* path, DynamicPrintConfig* config, Model* model
#endif // forward compatibility
close_zip_reader(&archive);
+
+ for (ModelObject *o : model->objects)
+ for (ModelVolume *v : o->volumes)
+ if (v->source.input_file.empty() && (v->type() == ModelVolumeType::MODEL_PART))
+ v->source.input_file = path;
+
return true;
}
@@ -1076,7 +1106,7 @@ bool store_amf(const char* path, Model* model, const DynamicPrintConfig* config,
stream << " <metadata type=\"slic3r." << key << "\">" << object->config.opt_serialize(key) << "</metadata>\n";
if (!object->name.empty())
stream << " <metadata type=\"name\">" << xml_escape(object->name) << "</metadata>\n";
- const std::vector<double> &layer_height_profile = object->layer_height_profile;
+ const std::vector<double> &layer_height_profile = object->layer_height_profile.get();
if (layer_height_profile.size() >= 4 && (layer_height_profile.size() % 2) == 0) {
// Store the layer height profile as a single semicolon separated list.
stream << " <metadata type=\"slic3r.layer_height_profile\">";
@@ -1093,7 +1123,7 @@ bool store_amf(const char* path, Model* model, const DynamicPrintConfig* config,
// Store the layer config range as a single semicolon separated list.
stream << " <layer_config_ranges>\n";
size_t layer_counter = 0;
- for (auto range : config_ranges) {
+ for (const auto &range : config_ranges) {
stream << " <range id=\"" << layer_counter << "\">\n";
stream << " <metadata type=\"slic3r.layer_height_range\">";
@@ -1129,9 +1159,9 @@ bool store_amf(const char* path, Model* model, const DynamicPrintConfig* config,
for (ModelVolume *volume : object->volumes) {
vertices_offsets.push_back(num_vertices);
if (! volume->mesh().repaired)
- throw std::runtime_error("store_amf() requires repair()");
+ throw Slic3r::FileIOError("store_amf() requires repair()");
if (! volume->mesh().has_shared_vertices())
- throw std::runtime_error("store_amf() requires shared vertices");
+ throw Slic3r::FileIOError("store_amf() requires shared vertices");
const indexed_triangle_set &its = volume->mesh().its;
const Transform3d& matrix = volume->get_matrix();
for (size_t i = 0; i < its.vertices.size(); ++i) {
@@ -1184,6 +1214,8 @@ bool store_amf(const char* path, Model* model, const DynamicPrintConfig* config,
stream << " <metadata type=\"slic3r.source_offset_y\">" << volume->source.mesh_offset(1) << "</metadata>\n";
stream << " <metadata type=\"slic3r.source_offset_z\">" << volume->source.mesh_offset(2) << "</metadata>\n";
}
+ if (volume->source.is_converted_from_inches)
+ stream << " <metadata type=\"slic3r.source_in_inches\">1</metadata>\n";
stream << std::setprecision(std::numeric_limits<float>::max_digits10);
const indexed_triangle_set &its = volume->mesh().its;
for (size_t i = 0; i < its.indices.size(); ++i) {
@@ -1200,7 +1232,7 @@ bool store_amf(const char* path, Model* model, const DynamicPrintConfig* config,
for (ModelInstance *instance : object->instances) {
char buf[512];
sprintf(buf,
- " <instance objectid=\"" PRINTF_ZU "\">\n"
+ " <instance objectid=\"%zu\">\n"
" <deltax>%lf</deltax>\n"
" <deltay>%lf</deltay>\n"
" <deltaz>%lf</deltaz>\n"
@@ -1253,9 +1285,17 @@ bool store_amf(const char* path, Model* model, const DynamicPrintConfig* config,
pt::ptree& code_tree = main_tree.add("code", "");
// store custom_gcode_per_print_z gcodes information
code_tree.put("<xmlattr>.print_z" , code.print_z );
- code_tree.put("<xmlattr>.gcode" , code.gcode );
+ code_tree.put("<xmlattr>.type" , static_cast<int>(code.type));
code_tree.put("<xmlattr>.extruder" , code.extruder );
code_tree.put("<xmlattr>.color" , code.color );
+ code_tree.put("<xmlattr>.extra" , code.extra );
+
+ // add gcode field data for the old version of the PrusaSlicer
+ std::string gcode = code.type == CustomGCode::ColorChange ? config->opt_string("color_change_gcode") :
+ code.type == CustomGCode::PausePrint ? config->opt_string("pause_print_gcode") :
+ code.type == CustomGCode::Template ? config->opt_string("template_custom_gcode") :
+ code.type == CustomGCode::ToolChange ? "tool_change" : code.extra;
+ code_tree.put("<xmlattr>.gcode" , gcode );
}
pt::ptree& mode_tree = main_tree.add("mode", "");
diff --git a/src/libslic3r/Format/OBJ.cpp b/src/libslic3r/Format/OBJ.cpp
index aa389781a..cb7eb4549 100644
--- a/src/libslic3r/Format/OBJ.cpp
+++ b/src/libslic3r/Format/OBJ.cpp
@@ -7,6 +7,8 @@
#include <string>
+#include <boost/log/trivial.hpp>
+
#ifdef _WIN32
#define DIR_SEPARATOR '\\'
#else
@@ -22,7 +24,7 @@ bool load_obj(const char *path, TriangleMesh *meshptr)
// Parse the OBJ file.
ObjParser::ObjData data;
if (! ObjParser::objparse(path, data)) {
- // die "Failed to parse $file\n" if !-e $path;
+ BOOST_LOG_TRIVIAL(error) << "load_obj: failed to parse " << path;
return false;
}
@@ -70,7 +72,8 @@ bool load_obj(const char *path, TriangleMesh *meshptr)
++ num_normals;
}
}
- if (data.vertices[i].coordIdx != -1) {
+ // Result of obj_parseline() call is not checked, thus not all vertices are necessarily finalized with coord_Idx == -1.
+ if (i < data.vertices.size() && data.vertices[i].coordIdx != -1) {
// This is a quad. Produce the other triangle.
stl_facet &facet2 = stl.facet_start[i_face++];
facet2.vertex[0] = facet.vertex[0];
@@ -102,7 +105,7 @@ bool load_obj(const char *path, TriangleMesh *meshptr)
stl_get_size(&stl);
mesh.repair();
if (mesh.facets_count() == 0) {
- // die "This OBJ file couldn't be read because it's empty.\n"
+ BOOST_LOG_TRIVIAL(error) << "load_obj: This OBJ file couldn't be read because it's empty. " << path;
return false;
}
diff --git a/src/libslic3r/Format/PRUS.cpp b/src/libslic3r/Format/PRUS.cpp
index d6f87197d..e2c38d957 100644
--- a/src/libslic3r/Format/PRUS.cpp
+++ b/src/libslic3r/Format/PRUS.cpp
@@ -147,7 +147,7 @@ static void extract_model_from_archive(
}
}
if (! trafo_set)
- throw std::runtime_error(std::string("Archive ") + path + " does not contain a valid entry in scene.xml for " + name);
+ throw Slic3r::FileIOError(std::string("Archive ") + path + " does not contain a valid entry in scene.xml for " + name);
// Extract the STL.
StlHeader header;
@@ -266,7 +266,7 @@ static void extract_model_from_archive(
}
if (! mesh_valid)
- throw std::runtime_error(std::string("Archive ") + path + " does not contain a valid mesh for " + name);
+ throw Slic3r::FileIOError(std::string("Archive ") + path + " does not contain a valid mesh for " + name);
// Add this mesh to the model.
ModelVolume *volume = nullptr;
@@ -303,7 +303,7 @@ bool load_prus(const char *path, Model *model)
mz_bool res = MZ_FALSE;
try {
if (!open_zip_reader(&archive, path))
- throw std::runtime_error(std::string("Unable to init zip reader for ") + path);
+ throw Slic3r::FileIOError(std::string("Unable to init zip reader for ") + path);
std::vector<char> scene_xml_data;
// For grouping multiple STLs into a single ModelObject for multi-material prints.
std::map<int, ModelObject*> group_to_model_object;
@@ -316,10 +316,10 @@ bool load_prus(const char *path, Model *model)
buffer.assign((size_t)stat.m_uncomp_size, 0);
res = mz_zip_reader_extract_file_to_mem(&archive, stat.m_filename, (char*)buffer.data(), (size_t)stat.m_uncomp_size, 0);
if (res == MZ_FALSE)
- std::runtime_error(std::string("Error while extracting a file from ") + path);
+ throw Slic3r::FileIOError(std::string("Error while extracting a file from ") + path);
if (strcmp(stat.m_filename, "scene.xml") == 0) {
if (! scene_xml_data.empty())
- throw std::runtime_error(std::string("Multiple scene.xml were found in the archive.") + path);
+ throw Slic3r::FileIOError(std::string("Multiple scene.xml were found in the archive.") + path);
scene_xml_data = std::move(buffer);
} else if (boost::iends_with(stat.m_filename, ".stl")) {
// May throw std::exception
diff --git a/src/libslic3r/Format/SL1.cpp b/src/libslic3r/Format/SL1.cpp
new file mode 100644
index 000000000..f04855182
--- /dev/null
+++ b/src/libslic3r/Format/SL1.cpp
@@ -0,0 +1,481 @@
+#include "SL1.hpp"
+#include "GCode/ThumbnailData.hpp"
+#include "libslic3r/Time.hpp"
+
+#include <boost/log/trivial.hpp>
+#include <boost/filesystem.hpp>
+
+#include "libslic3r/Zipper.hpp"
+#include "libslic3r/SLAPrint.hpp"
+
+#include <sstream>
+
+#include "libslic3r/Exception.hpp"
+#include "libslic3r/SlicesToTriangleMesh.hpp"
+#include "libslic3r/MarchingSquares.hpp"
+#include "libslic3r/ClipperUtils.hpp"
+#include "libslic3r/MTUtils.hpp"
+#include "libslic3r/PrintConfig.hpp"
+#include "libslic3r/SLA/RasterBase.hpp"
+#include "libslic3r/miniz_extension.hpp"
+#include "libslic3r/PNGReadWrite.hpp"
+
+#include <boost/property_tree/ini_parser.hpp>
+#include <boost/filesystem/path.hpp>
+#include <boost/algorithm/string.hpp>
+
+namespace marchsq {
+
+template<> struct _RasterTraits<Slic3r::png::ImageGreyscale> {
+ using Rst = Slic3r::png::ImageGreyscale;
+
+ // The type of pixel cell in the raster
+ using ValueType = uint8_t;
+
+ // Value at a given position
+ static uint8_t get(const Rst &rst, size_t row, size_t col)
+ {
+ return rst.get(row, col);
+ }
+
+ // Number of rows and cols of the raster
+ static size_t rows(const Rst &rst) { return rst.rows; }
+ static size_t cols(const Rst &rst) { return rst.cols; }
+};
+
+} // namespace marchsq
+
+namespace Slic3r {
+
+namespace {
+
+struct PNGBuffer { std::vector<uint8_t> buf; std::string fname; };
+struct ArchiveData {
+ boost::property_tree::ptree profile, config;
+ std::vector<PNGBuffer> images;
+};
+
+static const constexpr char *CONFIG_FNAME = "config.ini";
+static const constexpr char *PROFILE_FNAME = "prusaslicer.ini";
+
+boost::property_tree::ptree read_ini(const mz_zip_archive_file_stat &entry,
+ MZ_Archive & zip)
+{
+ std::string buf(size_t(entry.m_uncomp_size), '\0');
+
+ if (!mz_zip_reader_extract_file_to_mem(&zip.arch, entry.m_filename,
+ buf.data(), buf.size(), 0))
+ throw Slic3r::FileIOError(zip.get_errorstr());
+
+ boost::property_tree::ptree tree;
+ std::stringstream ss(buf);
+ boost::property_tree::read_ini(ss, tree);
+ return tree;
+}
+
+PNGBuffer read_png(const mz_zip_archive_file_stat &entry,
+ MZ_Archive & zip,
+ const std::string & name)
+{
+ std::vector<uint8_t> buf(entry.m_uncomp_size);
+
+ if (!mz_zip_reader_extract_file_to_mem(&zip.arch, entry.m_filename,
+ buf.data(), buf.size(), 0))
+ throw Slic3r::FileIOError(zip.get_errorstr());
+
+ return {std::move(buf), (name.empty() ? entry.m_filename : name)};
+}
+
+ArchiveData extract_sla_archive(const std::string &zipfname,
+ const std::string &exclude)
+{
+ ArchiveData arch;
+
+ // Little RAII
+ struct Arch: public MZ_Archive {
+ Arch(const std::string &fname) {
+ if (!open_zip_reader(&arch, fname))
+ throw Slic3r::FileIOError(get_errorstr());
+ }
+
+ ~Arch() { close_zip_reader(&arch); }
+ } zip (zipfname);
+
+ mz_uint num_entries = mz_zip_reader_get_num_files(&zip.arch);
+
+ for (mz_uint i = 0; i < num_entries; ++i)
+ {
+ mz_zip_archive_file_stat entry;
+
+ if (mz_zip_reader_file_stat(&zip.arch, i, &entry))
+ {
+ std::string name = entry.m_filename;
+ boost::algorithm::to_lower(name);
+
+ if (boost::algorithm::contains(name, exclude)) continue;
+
+ if (name == CONFIG_FNAME) arch.config = read_ini(entry, zip);
+ if (name == PROFILE_FNAME) arch.profile = read_ini(entry, zip);
+
+ if (boost::filesystem::path(name).extension().string() == ".png") {
+ auto it = std::lower_bound(
+ arch.images.begin(), arch.images.end(), PNGBuffer{{}, name},
+ [](const PNGBuffer &r1, const PNGBuffer &r2) {
+ return std::less<std::string>()(r1.fname, r2.fname);
+ });
+
+ arch.images.insert(it, read_png(entry, zip, name));
+ }
+ }
+ }
+
+ return arch;
+}
+
+ExPolygons rings_to_expolygons(const std::vector<marchsq::Ring> &rings,
+ double px_w, double px_h)
+{
+ ExPolygons polys; polys.reserve(rings.size());
+
+ for (const marchsq::Ring &ring : rings) {
+ Polygon poly; Points &pts = poly.points;
+ pts.reserve(ring.size());
+
+ for (const marchsq::Coord &crd : ring)
+ pts.emplace_back(scaled(crd.c * px_w), scaled(crd.r * px_h));
+
+ polys.emplace_back(poly);
+ }
+
+ // reverse the raster transformations
+ return union_ex(polys);
+}
+
+template<class Fn> void foreach_vertex(ExPolygon &poly, Fn &&fn)
+{
+ for (auto &p : poly.contour.points) fn(p);
+ for (auto &h : poly.holes)
+ for (auto &p : h.points) fn(p);
+}
+
+void invert_raster_trafo(ExPolygons & expolys,
+ const sla::RasterBase::Trafo &trafo,
+ coord_t width,
+ coord_t height)
+{
+ if (trafo.flipXY) std::swap(height, width);
+
+ for (auto &expoly : expolys) {
+ if (trafo.mirror_y)
+ foreach_vertex(expoly, [height](Point &p) {p.y() = height - p.y(); });
+
+ if (trafo.mirror_x)
+ foreach_vertex(expoly, [width](Point &p) {p.x() = width - p.x(); });
+
+ expoly.translate(-trafo.center_x, -trafo.center_y);
+
+ if (trafo.flipXY)
+ foreach_vertex(expoly, [](Point &p) { std::swap(p.x(), p.y()); });
+
+ if ((trafo.mirror_x + trafo.mirror_y + trafo.flipXY) % 2) {
+ expoly.contour.reverse();
+ for (auto &h : expoly.holes) h.reverse();
+ }
+ }
+}
+
+struct RasterParams {
+ sla::RasterBase::Trafo trafo; // Raster transformations
+ coord_t width, height; // scaled raster dimensions (not resolution)
+ double px_h, px_w; // pixel dimesions
+ marchsq::Coord win; // marching squares window size
+};
+
+RasterParams get_raster_params(const DynamicPrintConfig &cfg)
+{
+ auto *opt_disp_cols = cfg.option<ConfigOptionInt>("display_pixels_x");
+ auto *opt_disp_rows = cfg.option<ConfigOptionInt>("display_pixels_y");
+ auto *opt_disp_w = cfg.option<ConfigOptionFloat>("display_width");
+ auto *opt_disp_h = cfg.option<ConfigOptionFloat>("display_height");
+ auto *opt_mirror_x = cfg.option<ConfigOptionBool>("display_mirror_x");
+ auto *opt_mirror_y = cfg.option<ConfigOptionBool>("display_mirror_y");
+ auto *opt_orient = cfg.option<ConfigOptionEnum<SLADisplayOrientation>>("display_orientation");
+
+ if (!opt_disp_cols || !opt_disp_rows || !opt_disp_w || !opt_disp_h ||
+ !opt_mirror_x || !opt_mirror_y || !opt_orient)
+ throw Slic3r::FileIOError("Invalid SL1 file");
+
+ RasterParams rstp;
+
+ rstp.px_w = opt_disp_w->value / (opt_disp_cols->value - 1);
+ rstp.px_h = opt_disp_h->value / (opt_disp_rows->value - 1);
+
+ rstp.trafo = sla::RasterBase::Trafo{opt_orient->value == sladoLandscape ?
+ sla::RasterBase::roLandscape :
+ sla::RasterBase::roPortrait,
+ {opt_mirror_x->value, opt_mirror_y->value}};
+
+ rstp.height = scaled(opt_disp_h->value);
+ rstp.width = scaled(opt_disp_w->value);
+
+ return rstp;
+}
+
+struct SliceParams { double layerh = 0., initial_layerh = 0.; };
+
+SliceParams get_slice_params(const DynamicPrintConfig &cfg)
+{
+ auto *opt_layerh = cfg.option<ConfigOptionFloat>("layer_height");
+ auto *opt_init_layerh = cfg.option<ConfigOptionFloat>("initial_layer_height");
+
+ if (!opt_layerh || !opt_init_layerh)
+ throw Slic3r::FileIOError("Invalid SL1 file");
+
+ return SliceParams{opt_layerh->getFloat(), opt_init_layerh->getFloat()};
+}
+
+std::vector<ExPolygons> extract_slices_from_sla_archive(
+ ArchiveData & arch,
+ const RasterParams & rstp,
+ std::function<bool(int)> progr)
+{
+ auto jobdir = arch.config.get<std::string>("jobDir");
+ for (auto &c : jobdir) c = std::tolower(c);
+
+ std::vector<ExPolygons> slices(arch.images.size());
+
+ struct Status
+ {
+ double incr, val, prev;
+ bool stop = false;
+ tbb::spin_mutex mutex;
+ } st {100. / slices.size(), 0., 0.};
+
+ tbb::parallel_for(size_t(0), arch.images.size(),
+ [&arch, &slices, &st, &rstp, progr](size_t i) {
+ // Status indication guarded with the spinlock
+ {
+ std::lock_guard<tbb::spin_mutex> lck(st.mutex);
+ if (st.stop) return;
+
+ st.val += st.incr;
+ double curr = std::round(st.val);
+ if (curr > st.prev) {
+ st.prev = curr;
+ st.stop = !progr(int(curr));
+ }
+ }
+
+ png::ImageGreyscale img;
+ png::ReadBuf rb{arch.images[i].buf.data(), arch.images[i].buf.size()};
+ if (!png::decode_png(rb, img)) return;
+
+ auto rings = marchsq::execute(img, 128, rstp.win);
+ ExPolygons expolys = rings_to_expolygons(rings, rstp.px_w, rstp.px_h);
+
+ // Invert the raster transformations indicated in
+ // the profile metadata
+ invert_raster_trafo(expolys, rstp.trafo, rstp.width, rstp.height);
+
+ slices[i] = std::move(expolys);
+ });
+
+ if (st.stop) slices = {};
+
+ return slices;
+}
+
+} // namespace
+
+void import_sla_archive(const std::string &zipfname, DynamicPrintConfig &out)
+{
+ ArchiveData arch = extract_sla_archive(zipfname, "png");
+ out.load(arch.profile);
+}
+
+void import_sla_archive(
+ const std::string & zipfname,
+ Vec2i windowsize,
+ TriangleMesh & out,
+ DynamicPrintConfig & profile,
+ std::function<bool(int)> progr)
+{
+ // Ensure minimum window size for marching squares
+ windowsize.x() = std::max(2, windowsize.x());
+ windowsize.y() = std::max(2, windowsize.y());
+
+ ArchiveData arch = extract_sla_archive(zipfname, "thumbnail");
+ profile.load(arch.profile);
+
+ RasterParams rstp = get_raster_params(profile);
+ rstp.win = {windowsize.y(), windowsize.x()};
+
+ SliceParams slicp = get_slice_params(profile);
+
+ std::vector<ExPolygons> slices =
+ extract_slices_from_sla_archive(arch, rstp, progr);
+
+ if (!slices.empty())
+ out = slices_to_triangle_mesh(slices, 0, slicp.layerh, slicp.initial_layerh);
+}
+
+using ConfMap = std::map<std::string, std::string>;
+
+namespace {
+
+std::string to_ini(const ConfMap &m)
+{
+ std::string ret;
+ for (auto &param : m) ret += param.first + " = " + param.second + "\n";
+
+ return ret;
+}
+
+std::string get_cfg_value(const DynamicPrintConfig &cfg, const std::string &key)
+{
+ std::string ret;
+
+ if (cfg.has(key)) {
+ auto opt = cfg.option(key);
+ if (opt) ret = opt->serialize();
+ }
+
+ return ret;
+}
+
+void fill_iniconf(ConfMap &m, const SLAPrint &print)
+{
+ auto &cfg = print.full_print_config();
+ m["layerHeight"] = get_cfg_value(cfg, "layer_height");
+ m["expTime"] = get_cfg_value(cfg, "exposure_time");
+ m["expTimeFirst"] = get_cfg_value(cfg, "initial_exposure_time");
+ m["materialName"] = get_cfg_value(cfg, "sla_material_settings_id");
+ m["printerModel"] = get_cfg_value(cfg, "printer_model");
+ m["printerVariant"] = get_cfg_value(cfg, "printer_variant");
+ m["printerProfile"] = get_cfg_value(cfg, "printer_settings_id");
+ m["printProfile"] = get_cfg_value(cfg, "sla_print_settings_id");
+ m["fileCreationTimestamp"] = Utils::utc_timestamp();
+ m["prusaSlicerVersion"] = SLIC3R_BUILD_ID;
+
+ SLAPrintStatistics stats = print.print_statistics();
+ // Set statistics values to the printer
+
+ double used_material = (stats.objects_used_material +
+ stats.support_used_material) / 1000;
+
+ int num_fade = print.default_object_config().faded_layers.getInt();
+ num_fade = num_fade >= 0 ? num_fade : 0;
+
+ m["usedMaterial"] = std::to_string(used_material);
+ m["numFade"] = std::to_string(num_fade);
+ m["numSlow"] = std::to_string(stats.slow_layers_count);
+ m["numFast"] = std::to_string(stats.fast_layers_count);
+ m["printTime"] = std::to_string(stats.estimated_print_time);
+
+ m["action"] = "print";
+}
+
+void fill_slicerconf(ConfMap &m, const SLAPrint &print)
+{
+ using namespace std::literals::string_view_literals;
+
+ // Sorted list of config keys, which shall not be stored into the ini.
+ 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
+ };
+
+ assert(std::is_sorted(banned_keys.begin(), banned_keys.end()));
+ auto is_banned = [](const std::string &key) {
+ return std::binary_search(banned_keys.begin(), banned_keys.end(), key);
+ };
+
+ auto &cfg = print.full_print_config();
+ for (const std::string &key : cfg.keys())
+ if (! is_banned(key) && ! cfg.option(key)->is_nil())
+ m[key] = cfg.opt_serialize(key);
+
+}
+
+} // namespace
+
+uqptr<sla::RasterBase> SL1Archive::create_raster() const
+{
+ sla::RasterBase::Resolution res;
+ sla::RasterBase::PixelDim pxdim;
+ std::array<bool, 2> mirror;
+
+ double w = m_cfg.display_width.getFloat();
+ double h = m_cfg.display_height.getFloat();
+ auto pw = size_t(m_cfg.display_pixels_x.getInt());
+ auto ph = size_t(m_cfg.display_pixels_y.getInt());
+
+ mirror[X] = m_cfg.display_mirror_x.getBool();
+ mirror[Y] = m_cfg.display_mirror_y.getBool();
+
+ auto ro = m_cfg.display_orientation.getInt();
+ sla::RasterBase::Orientation orientation =
+ ro == sla::RasterBase::roPortrait ? sla::RasterBase::roPortrait :
+ sla::RasterBase::roLandscape;
+
+ if (orientation == sla::RasterBase::roPortrait) {
+ std::swap(w, h);
+ std::swap(pw, ph);
+ }
+
+ res = sla::RasterBase::Resolution{pw, ph};
+ pxdim = sla::RasterBase::PixelDim{w / pw, h / ph};
+ sla::RasterBase::Trafo tr{orientation, mirror};
+
+ double gamma = m_cfg.gamma_correction.getFloat();
+
+ return sla::create_raster_grayscale_aa(res, pxdim, gamma, tr);
+}
+
+sla::RasterEncoder SL1Archive::get_encoder() const
+{
+ return sla::PNGRasterEncoder{};
+}
+
+void SL1Archive::export_print(Zipper& zipper,
+ const SLAPrint &print,
+ const std::string &prjname)
+{
+ std::string project =
+ prjname.empty() ?
+ boost::filesystem::path(zipper.get_filename()).stem().string() :
+ prjname;
+
+ ConfMap iniconf, slicerconf;
+ fill_iniconf(iniconf, print);
+
+ iniconf["jobDir"] = project;
+
+ fill_slicerconf(slicerconf, print);
+
+ try {
+ zipper.add_entry("config.ini");
+ zipper << to_ini(iniconf);
+ zipper.add_entry("prusaslicer.ini");
+ zipper << to_ini(slicerconf);
+
+ size_t i = 0;
+ for (const sla::EncodedRaster &rst : m_layers) {
+
+ std::string imgname = project + string_printf("%.5d", i++) + "." +
+ rst.extension();
+
+ zipper.add_entry(imgname.c_str(), rst.data(), rst.size());
+ }
+ } catch(std::exception& e) {
+ BOOST_LOG_TRIVIAL(error) << e.what();
+ // Rethrow the exception
+ throw;
+ }
+}
+
+} // namespace Slic3r
diff --git a/src/libslic3r/Format/SL1.hpp b/src/libslic3r/Format/SL1.hpp
new file mode 100644
index 000000000..ab731ff84
--- /dev/null
+++ b/src/libslic3r/Format/SL1.hpp
@@ -0,0 +1,62 @@
+#ifndef ARCHIVETRAITS_HPP
+#define ARCHIVETRAITS_HPP
+
+#include <string>
+
+#include "libslic3r/Zipper.hpp"
+#include "libslic3r/SLAPrint.hpp"
+
+namespace Slic3r {
+
+class SL1Archive: public SLAPrinter {
+ SLAPrinterConfig m_cfg;
+
+protected:
+ uqptr<sla::RasterBase> create_raster() const override;
+ sla::RasterEncoder get_encoder() const override;
+
+public:
+
+ SL1Archive() = default;
+ explicit SL1Archive(const SLAPrinterConfig &cfg): m_cfg(cfg) {}
+ explicit SL1Archive(SLAPrinterConfig &&cfg): m_cfg(std::move(cfg)) {}
+
+ void export_print(Zipper &zipper, const SLAPrint &print, const std::string &projectname = "");
+ void export_print(const std::string &fname, const SLAPrint &print, const std::string &projectname = "")
+ {
+ Zipper zipper(fname);
+ export_print(zipper, print, projectname);
+ }
+
+ void apply(const SLAPrinterConfig &cfg) override
+ {
+ auto diff = m_cfg.diff(cfg);
+ if (!diff.empty()) {
+ m_cfg.apply_only(cfg, diff);
+ m_layers = {};
+ }
+ }
+};
+
+void import_sla_archive(const std::string &zipfname, DynamicPrintConfig &out);
+
+void import_sla_archive(
+ const std::string & zipfname,
+ Vec2i windowsize,
+ TriangleMesh & out,
+ DynamicPrintConfig & profile,
+ std::function<bool(int)> progr = [](int) { return true; });
+
+inline void import_sla_archive(
+ const std::string & zipfname,
+ Vec2i windowsize,
+ TriangleMesh & out,
+ std::function<bool(int)> progr = [](int) { return true; })
+{
+ DynamicPrintConfig profile;
+ import_sla_archive(zipfname, windowsize, out, profile, progr);
+}
+
+} // namespace Slic3r::sla
+
+#endif // ARCHIVETRAITS_HPP
diff --git a/src/libslic3r/Format/objparser.cpp b/src/libslic3r/Format/objparser.cpp
index 8c1a53459..12cee350d 100644
--- a/src/libslic3r/Format/objparser.cpp
+++ b/src/libslic3r/Format/objparser.cpp
@@ -1,6 +1,7 @@
#include <stdlib.h>
#include <string.h>
+#include <boost/log/trivial.hpp>
#include <boost/nowide/cstdio.hpp>
#include "objparser.hpp"
@@ -312,7 +313,7 @@ static bool obj_parseline(const char *line, ObjData &data)
break;
}
default:
- printf("ObjParser: Unknown command: %c\r\n", c1);
+ BOOST_LOG_TRIVIAL(error) << "ObjParser: Unknown command: " << c1;
break;
}
@@ -338,15 +339,22 @@ bool objparse(const char *path, ObjData &data)
char *c = buf + lastLine;
while (*c == ' ' || *c == '\t')
++ c;
+ //FIXME check the return value and exit on error?
+ // Will it break parsing of some obj files?
obj_parseline(c, data);
lastLine = i + 1;
}
lenPrev = len - lastLine;
+ if (lenPrev > 65536) {
+ BOOST_LOG_TRIVIAL(error) << "ObjParser: Excessive line length";
+ ::fclose(pFile);
+ return false;
+ }
memmove(buf, buf + lastLine, lenPrev);
}
}
catch (std::bad_alloc&) {
- printf("Out of memory\r\n");
+ BOOST_LOG_TRIVIAL(error) << "ObjParser: Out of memory";
}
::fclose(pFile);
@@ -378,7 +386,8 @@ bool objparse(std::istream &stream, ObjData &data)
}
}
catch (std::bad_alloc&) {
- printf("Out of memory\r\n");
+ BOOST_LOG_TRIVIAL(error) << "ObjParser: Out of memory";
+ return false;
}
return true;
diff --git a/src/libslic3r/GCode.cpp b/src/libslic3r/GCode.cpp
index 19116b336..cc9dfce30 100644
--- a/src/libslic3r/GCode.cpp
+++ b/src/libslic3r/GCode.cpp
@@ -1,13 +1,16 @@
#include "libslic3r.h"
#include "I18N.hpp"
#include "GCode.hpp"
+#include "Exception.hpp"
#include "ExtrusionEntity.hpp"
#include "EdgeGrid.hpp"
#include "Geometry.hpp"
#include "GCode/PrintExtents.hpp"
#include "GCode/WipeTower.hpp"
#include "ShortestPath.hpp"
+#include "Print.hpp"
#include "Utils.hpp"
+#include "ClipperUtils.hpp"
#include "libslic3r.h"
#include <algorithm>
@@ -20,9 +23,7 @@
#include <boost/foreach.hpp>
#include <boost/filesystem.hpp>
#include <boost/log/trivial.hpp>
-#if ENABLE_THUMBNAIL_GENERATOR
#include <boost/beast/core/detail/base64.hpp>
-#endif // ENABLE_THUMBNAIL_GENERATOR
#include <boost/nowide/iostream.hpp>
#include <boost/nowide/cstdio.hpp>
@@ -49,311 +50,234 @@ using namespace std::literals::string_view_literals;
namespace Slic3r {
-//! macro used to mark string used at localization,
-//! return same string
+ //! macro used to mark string used at localization,
+ //! return same string
#define L(s) (s)
#define _(s) Slic3r::I18N::translate(s)
// Only add a newline in case the current G-code does not end with a newline.
-static inline void check_add_eol(std::string &gcode)
-{
- if (! gcode.empty() && gcode.back() != '\n')
- gcode += '\n';
-}
+ static inline void check_add_eol(std::string& gcode)
+ {
+ if (!gcode.empty() && gcode.back() != '\n')
+ gcode += '\n';
+ }
-// Return true if tch_prefix is found in custom_gcode
-static bool custom_gcode_changes_tool(const std::string& custom_gcode, const std::string& tch_prefix, unsigned next_extruder)
-{
- bool ok = false;
- size_t from_pos = 0;
- size_t pos = 0;
- while ((pos = custom_gcode.find(tch_prefix, from_pos)) != std::string::npos) {
- if (pos+1 == custom_gcode.size())
- break;
- from_pos = pos+1;
- // only whitespace is allowed before the command
- while (--pos < custom_gcode.size() && custom_gcode[pos] != '\n') {
- if (! std::isspace(custom_gcode[pos]))
- goto NEXT;
- }
- {
- // we should also check that the extruder changes to what was expected
- std::istringstream ss(custom_gcode.substr(from_pos, std::string::npos));
- unsigned num = 0;
- if (ss >> num)
- ok = (num == next_extruder);
+ // Return true if tch_prefix is found in custom_gcode
+ static bool custom_gcode_changes_tool(const std::string& custom_gcode, const std::string& tch_prefix, unsigned next_extruder)
+ {
+ bool ok = false;
+ size_t from_pos = 0;
+ size_t pos = 0;
+ while ((pos = custom_gcode.find(tch_prefix, from_pos)) != std::string::npos) {
+ if (pos + 1 == custom_gcode.size())
+ break;
+ from_pos = pos + 1;
+ // only whitespace is allowed before the command
+ while (--pos < custom_gcode.size() && custom_gcode[pos] != '\n') {
+ if (!std::isspace(custom_gcode[pos]))
+ goto NEXT;
+ }
+ {
+ // we should also check that the extruder changes to what was expected
+ std::istringstream ss(custom_gcode.substr(from_pos, std::string::npos));
+ unsigned num = 0;
+ if (ss >> num)
+ ok = (num == next_extruder);
+ }
+ NEXT:;
}
-NEXT: ;
+ return ok;
}
- return ok;
-}
-void AvoidCrossingPerimeters::init_external_mp(const Print &print)
-{
- m_external_mp = Slic3r::make_unique<MotionPlanner>(union_ex(this->collect_contours_all_layers(print.objects())));
-}
+ std::string OozePrevention::pre_toolchange(GCode& gcodegen)
+ {
+ std::string gcode;
-// Plan a travel move while minimizing the number of perimeter crossings.
-// point is in unscaled coordinates, in the coordinate system of the current active object
-// (set by gcodegen.set_origin()).
-Polyline AvoidCrossingPerimeters::travel_to(const GCode &gcodegen, const Point &point)
-{
- // If use_external, then perform the path planning in the world coordinate system (correcting for the gcodegen offset).
- // Otherwise perform the path planning in the coordinate system of the active object.
- bool use_external = this->use_external_mp || this->use_external_mp_once;
- Point scaled_origin = use_external ? Point::new_scale(gcodegen.origin()(0), gcodegen.origin()(1)) : Point(0, 0);
- Polyline result = (use_external ? m_external_mp.get() : m_layer_mp.get())->
- shortest_path(gcodegen.last_pos() + scaled_origin, point + scaled_origin);
- if (use_external)
- result.translate(- scaled_origin);
- return result;
-}
+ // move to the nearest standby point
+ if (!this->standby_points.empty()) {
+ // get current position in print coordinates
+ Vec3d writer_pos = gcodegen.writer().get_position();
+ Point pos = Point::new_scale(writer_pos(0), writer_pos(1));
-// Collect outer contours of all objects over all layers.
-// Discard objects only containing thin walls (offset would fail on an empty polygon).
-// Used by avoid crossing perimeters feature.
-Polygons AvoidCrossingPerimeters::collect_contours_all_layers(const PrintObjectPtrs& objects)
-{
- Polygons islands;
- for (const PrintObject *object : objects) {
- // Reducing all the object slices into the Z projection in a logarithimc fashion.
- // First reduce to half the number of layers.
- std::vector<Polygons> polygons_per_layer((object->layers().size() + 1) / 2);
- tbb::parallel_for(tbb::blocked_range<size_t>(0, object->layers().size() / 2),
- [&object, &polygons_per_layer](const tbb::blocked_range<size_t> &range) {
- for (size_t i = range.begin(); i < range.end(); ++ i) {
- const Layer* layer1 = object->layers()[i * 2];
- const Layer* layer2 = object->layers()[i * 2 + 1];
- Polygons polys;
- polys.reserve(layer1->lslices.size() + layer2->lslices.size());
- for (const ExPolygon &expoly : layer1->lslices)
- //FIXME no holes?
- polys.emplace_back(expoly.contour);
- for (const ExPolygon &expoly : layer2->lslices)
- //FIXME no holes?
- polys.emplace_back(expoly.contour);
- polygons_per_layer[i] = union_(polys);
- }
- });
- if (object->layers().size() & 1) {
- const Layer *layer = object->layers().back();
- Polygons polys;
- polys.reserve(layer->lslices.size());
- for (const ExPolygon &expoly : layer->lslices)
- //FIXME no holes?
- polys.emplace_back(expoly.contour);
- polygons_per_layer.back() = union_(polys);
- }
- // Now reduce down to a single layer.
- size_t cnt = polygons_per_layer.size();
- while (cnt > 1) {
- tbb::parallel_for(tbb::blocked_range<size_t>(0, cnt / 2),
- [&polygons_per_layer](const tbb::blocked_range<size_t> &range) {
- for (size_t i = range.begin(); i < range.end(); ++ i) {
- Polygons polys;
- polys.reserve(polygons_per_layer[i * 2].size() + polygons_per_layer[i * 2 + 1].size());
- polygons_append(polys, polygons_per_layer[i * 2]);
- polygons_append(polys, polygons_per_layer[i * 2 + 1]);
- polygons_per_layer[i * 2] = union_(polys);
- }
- });
- for (size_t i = 0; i < cnt / 2; ++ i)
- polygons_per_layer[i] = std::move(polygons_per_layer[i * 2]);
- if (cnt & 1)
- polygons_per_layer[cnt / 2] = std::move(polygons_per_layer[cnt - 1]);
- cnt = (cnt + 1) / 2;
- }
- // And collect copies of the objects.
- for (const PrintInstance &instance : object->instances()) {
- // All the layers were reduced to the 1st item of polygons_per_layer.
- size_t i = islands.size();
- polygons_append(islands, polygons_per_layer.front());
- for (; i < islands.size(); ++ i)
- islands[i].translate(instance.shift);
+ // find standby point
+ Point standby_point;
+ pos.nearest_point(this->standby_points, &standby_point);
+
+ /* We don't call gcodegen.travel_to() because we don't need retraction (it was already
+ triggered by the caller) nor avoid_crossing_perimeters and also because the coordinates
+ of the destination point must not be transformed by origin nor current extruder offset. */
+ gcode += gcodegen.writer().travel_to_xy(unscale(standby_point),
+ "move to standby position");
}
- }
- return islands;
-}
-std::string OozePrevention::pre_toolchange(GCode &gcodegen)
-{
- std::string gcode;
-
- // move to the nearest standby point
- if (!this->standby_points.empty()) {
- // get current position in print coordinates
- Vec3d writer_pos = gcodegen.writer().get_position();
- Point pos = Point::new_scale(writer_pos(0), writer_pos(1));
-
- // find standby point
- Point standby_point;
- pos.nearest_point(this->standby_points, &standby_point);
-
- /* We don't call gcodegen.travel_to() because we don't need retraction (it was already
- triggered by the caller) nor avoid_crossing_perimeters and also because the coordinates
- of the destination point must not be transformed by origin nor current extruder offset. */
- gcode += gcodegen.writer().travel_to_xy(unscale(standby_point),
- "move to standby position");
- }
-
- if (gcodegen.config().standby_temperature_delta.value != 0) {
- // we assume that heating is always slower than cooling, so no need to block
- gcode += gcodegen.writer().set_temperature
+ if (gcodegen.config().standby_temperature_delta.value != 0) {
+ // we assume that heating is always slower than cooling, so no need to block
+ gcode += gcodegen.writer().set_temperature
(this->_get_temp(gcodegen) + gcodegen.config().standby_temperature_delta.value, false, gcodegen.writer().extruder()->id());
+ }
+
+ return gcode;
}
-
- return gcode;
-}
-std::string OozePrevention::post_toolchange(GCode &gcodegen)
-{
- return (gcodegen.config().standby_temperature_delta.value != 0) ?
- gcodegen.writer().set_temperature(this->_get_temp(gcodegen), true, gcodegen.writer().extruder()->id()) :
- std::string();
-}
+ std::string OozePrevention::post_toolchange(GCode& gcodegen)
+ {
+ return (gcodegen.config().standby_temperature_delta.value != 0) ?
+ gcodegen.writer().set_temperature(this->_get_temp(gcodegen), true, gcodegen.writer().extruder()->id()) :
+ std::string();
+ }
-int
-OozePrevention::_get_temp(GCode &gcodegen)
-{
- return (gcodegen.layer() != NULL && gcodegen.layer()->id() == 0)
- ? gcodegen.config().first_layer_temperature.get_at(gcodegen.writer().extruder()->id())
- : gcodegen.config().temperature.get_at(gcodegen.writer().extruder()->id());
-}
+ int
+ OozePrevention::_get_temp(GCode& gcodegen)
+ {
+ return (gcodegen.layer() != NULL && gcodegen.layer()->id() == 0)
+ ? gcodegen.config().first_layer_temperature.get_at(gcodegen.writer().extruder()->id())
+ : gcodegen.config().temperature.get_at(gcodegen.writer().extruder()->id());
+ }
-std::string Wipe::wipe(GCode &gcodegen, bool toolchange)
-{
- std::string gcode;
-
- /* Reduce feedrate a bit; travel speed is often too high to move on existing material.
- Too fast = ripping of existing material; too slow = short wipe path, thus more blob. */
- double wipe_speed = gcodegen.writer().config.travel_speed.value * 0.8;
-
- // get the retraction length
- double length = toolchange
- ? gcodegen.writer().extruder()->retract_length_toolchange()
- : gcodegen.writer().extruder()->retract_length();
- // Shorten the retraction length by the amount already retracted before wipe.
- length *= (1. - gcodegen.writer().extruder()->retract_before_wipe());
-
- if (length > 0) {
- /* Calculate how long we need to travel in order to consume the required
- amount of retraction. In other words, how far do we move in XY at wipe_speed
- for the time needed to consume retract_length at retract_speed? */
- double wipe_dist = scale_(length / gcodegen.writer().extruder()->retract_speed() * wipe_speed);
-
- /* Take the stored wipe path and replace first point with the current actual position
- (they might be different, for example, in case of loop clipping). */
- Polyline wipe_path;
- wipe_path.append(gcodegen.last_pos());
- wipe_path.append(
- this->path.points.begin() + 1,
- this->path.points.end()
- );
-
- wipe_path.clip_end(wipe_path.length() - wipe_dist);
-
- // subdivide the retraction in segments
- if (! wipe_path.empty()) {
- for (const Line &line : wipe_path.lines()) {
- double segment_length = line.length();
- /* Reduce retraction length a bit to avoid effective retraction speed to be greater than the configured one
- due to rounding (TODO: test and/or better math for this) */
- double dE = length * (segment_length / wipe_dist) * 0.95;
- //FIXME one shall not generate the unnecessary G1 Fxxx commands, here wipe_speed is a constant inside this cycle.
- // Is it here for the cooling markers? Or should it be outside of the cycle?
- gcode += gcodegen.writer().set_speed(wipe_speed*60, "", gcodegen.enable_cooling_markers() ? ";_WIPE" : "");
- gcode += gcodegen.writer().extrude_to_xy(
- gcodegen.point_to_gcode(line.b),
- -dE,
- "wipe and retract"
- );
+ std::string Wipe::wipe(GCode& gcodegen, bool toolchange)
+ {
+ std::string gcode;
+
+ /* Reduce feedrate a bit; travel speed is often too high to move on existing material.
+ Too fast = ripping of existing material; too slow = short wipe path, thus more blob. */
+ double wipe_speed = gcodegen.writer().config.travel_speed.value * 0.8;
+
+ // get the retraction length
+ double length = toolchange
+ ? gcodegen.writer().extruder()->retract_length_toolchange()
+ : gcodegen.writer().extruder()->retract_length();
+ // Shorten the retraction length by the amount already retracted before wipe.
+ length *= (1. - gcodegen.writer().extruder()->retract_before_wipe());
+
+ if (length > 0) {
+ /* Calculate how long we need to travel in order to consume the required
+ amount of retraction. In other words, how far do we move in XY at wipe_speed
+ for the time needed to consume retract_length at retract_speed? */
+ double wipe_dist = scale_(length / gcodegen.writer().extruder()->retract_speed() * wipe_speed);
+
+ /* Take the stored wipe path and replace first point with the current actual position
+ (they might be different, for example, in case of loop clipping). */
+ Polyline wipe_path;
+ wipe_path.append(gcodegen.last_pos());
+ wipe_path.append(
+ this->path.points.begin() + 1,
+ this->path.points.end()
+ );
+
+ wipe_path.clip_end(wipe_path.length() - wipe_dist);
+
+ // subdivide the retraction in segments
+ if (!wipe_path.empty()) {
+ // add tag for processor
+ gcode += ";" + GCodeProcessor::Wipe_Start_Tag + "\n";
+ for (const Line& line : wipe_path.lines()) {
+ double segment_length = line.length();
+ /* Reduce retraction length a bit to avoid effective retraction speed to be greater than the configured one
+ due to rounding (TODO: test and/or better math for this) */
+ double dE = length * (segment_length / wipe_dist) * 0.95;
+ //FIXME one shall not generate the unnecessary G1 Fxxx commands, here wipe_speed is a constant inside this cycle.
+ // Is it here for the cooling markers? Or should it be outside of the cycle?
+ gcode += gcodegen.writer().set_speed(wipe_speed * 60, "", gcodegen.enable_cooling_markers() ? ";_WIPE" : "");
+ gcode += gcodegen.writer().extrude_to_xy(
+ gcodegen.point_to_gcode(line.b),
+ -dE,
+ "wipe and retract"
+ );
+ }
+ // add tag for processor
+ gcode += ";" + GCodeProcessor::Wipe_End_Tag + "\n";
+ gcodegen.set_last_pos(wipe_path.points.back());
}
- gcodegen.set_last_pos(wipe_path.points.back());
+
+ // prevent wiping again on same path
+ this->reset_path();
}
-
- // prevent wiping again on same path
- this->reset_path();
+
+ return gcode;
}
-
- return gcode;
-}
-static inline Point wipe_tower_point_to_object_point(GCode &gcodegen, const Vec2f &wipe_tower_pt)
-{
- return Point(scale_(wipe_tower_pt.x() - gcodegen.origin()(0)), scale_(wipe_tower_pt.y() - gcodegen.origin()(1)));
-}
+ static inline Point wipe_tower_point_to_object_point(GCode& gcodegen, const Vec2f& wipe_tower_pt)
+ {
+ return Point(scale_(wipe_tower_pt.x() - gcodegen.origin()(0)), scale_(wipe_tower_pt.y() - gcodegen.origin()(1)));
+ }
-std::string WipeTowerIntegration::append_tcr(GCode &gcodegen, const WipeTower::ToolChangeResult &tcr, int new_extruder_id, double z) const
-{
- if (new_extruder_id != -1 && new_extruder_id != tcr.new_tool)
- throw std::invalid_argument("Error: WipeTowerIntegration::append_tcr was asked to do a toolchange it didn't expect.");
+ std::string WipeTowerIntegration::append_tcr(GCode& gcodegen, const WipeTower::ToolChangeResult& tcr, int new_extruder_id, double z) const
+ {
+ if (new_extruder_id != -1 && new_extruder_id != tcr.new_tool)
+ throw Slic3r::InvalidArgument("Error: WipeTowerIntegration::append_tcr was asked to do a toolchange it didn't expect.");
- std::string gcode;
+ std::string gcode;
- // Toolchangeresult.gcode assumes the wipe tower corner is at the origin (except for priming lines)
- // We want to rotate and shift all extrusions (gcode postprocessing) and starting and ending position
- float alpha = m_wipe_tower_rotation/180.f * float(M_PI);
- Vec2f start_pos = tcr.start_pos;
- Vec2f end_pos = tcr.end_pos;
- if (!tcr.priming) {
- start_pos = Eigen::Rotation2Df(alpha) * start_pos;
- start_pos += m_wipe_tower_pos;
- end_pos = Eigen::Rotation2Df(alpha) * end_pos;
- end_pos += m_wipe_tower_pos;
- }
-
- Vec2f wipe_tower_offset = tcr.priming ? Vec2f::Zero() : m_wipe_tower_pos;
- float wipe_tower_rotation = tcr.priming ? 0.f : alpha;
-
- std::string tcr_rotated_gcode = post_process_wipe_tower_moves(tcr, wipe_tower_offset, wipe_tower_rotation);
-
- if (!tcr.priming) {
- // Move over the wipe tower.
- // Retract for a tool change, using the toolchange retract value and setting the priming extra length.
- gcode += gcodegen.retract(true);
- gcodegen.m_avoid_crossing_perimeters.use_external_mp_once = true;
- gcode += gcodegen.travel_to(
- wipe_tower_point_to_object_point(gcodegen, start_pos),
- erMixed,
- "Travel to a Wipe Tower");
- gcode += gcodegen.unretract();
- }
-
- double current_z = gcodegen.writer().get_position().z();
- if (z == -1.) // in case no specific z was provided, print at current_z pos
- z = current_z;
- if (! is_approx(z, current_z)) {
- gcode += gcodegen.writer().retract();
- gcode += gcodegen.writer().travel_to_z(z, "Travel down to the last wipe tower layer.");
- gcode += gcodegen.writer().unretract();
- }
-
-
- // Process the end filament gcode.
- std::string end_filament_gcode_str;
- if (gcodegen.writer().extruder() != nullptr) {
- // Process the custom end_filament_gcode in case of single_extruder_multi_material.
- unsigned int old_extruder_id = gcodegen.writer().extruder()->id();
- const std::string &end_filament_gcode = gcodegen.config().end_filament_gcode.get_at(old_extruder_id);
- if (gcodegen.writer().extruder() != nullptr && ! end_filament_gcode.empty()) {
- end_filament_gcode_str = gcodegen.placeholder_parser_process("end_filament_gcode", end_filament_gcode, old_extruder_id);
- check_add_eol(end_filament_gcode_str);
+ // Toolchangeresult.gcode assumes the wipe tower corner is at the origin (except for priming lines)
+ // We want to rotate and shift all extrusions (gcode postprocessing) and starting and ending position
+ float alpha = m_wipe_tower_rotation / 180.f * float(M_PI);
+
+ auto transform_wt_pt = [&alpha, this](const Vec2f& pt) -> Vec2f {
+ Vec2f out = Eigen::Rotation2Df(alpha) * pt;
+ out += m_wipe_tower_pos;
+ return out;
+ };
+
+ Vec2f start_pos = tcr.start_pos;
+ Vec2f end_pos = tcr.end_pos;
+ if (! tcr.priming) {
+ start_pos = transform_wt_pt(start_pos);
+ end_pos = transform_wt_pt(end_pos);
+ }
+
+ Vec2f wipe_tower_offset = tcr.priming ? Vec2f::Zero() : m_wipe_tower_pos;
+ float wipe_tower_rotation = tcr.priming ? 0.f : alpha;
+
+ std::string tcr_rotated_gcode = post_process_wipe_tower_moves(tcr, wipe_tower_offset, wipe_tower_rotation);
+
+ if (! tcr.priming) {
+ // Move over the wipe tower.
+ // Retract for a tool change, using the toolchange retract value and setting the priming extra length.
+ gcode += gcodegen.retract(true);
+ gcodegen.m_avoid_crossing_perimeters.use_external_mp_once();
+ gcode += gcodegen.travel_to(
+ wipe_tower_point_to_object_point(gcodegen, start_pos),
+ erMixed,
+ "Travel to a Wipe Tower");
+ gcode += gcodegen.unretract();
+ }
+
+ double current_z = gcodegen.writer().get_position().z();
+ if (z == -1.) // in case no specific z was provided, print at current_z pos
+ z = current_z;
+ if (! is_approx(z, current_z)) {
+ gcode += gcodegen.writer().retract();
+ gcode += gcodegen.writer().travel_to_z(z, "Travel down to the last wipe tower layer.");
+ gcode += gcodegen.writer().unretract();
+ }
+
+
+ // Process the end filament gcode.
+ std::string end_filament_gcode_str;
+ if (gcodegen.writer().extruder() != nullptr) {
+ // Process the custom end_filament_gcode in case of single_extruder_multi_material.
+ unsigned int old_extruder_id = gcodegen.writer().extruder()->id();
+ const std::string& end_filament_gcode = gcodegen.config().end_filament_gcode.get_at(old_extruder_id);
+ if (gcodegen.writer().extruder() != nullptr && !end_filament_gcode.empty()) {
+ end_filament_gcode_str = gcodegen.placeholder_parser_process("end_filament_gcode", end_filament_gcode, old_extruder_id);
+ check_add_eol(end_filament_gcode_str);
+ }
}
- }
- // Process the custom toolchange_gcode. If it is empty, provide a simple Tn command to change the filament.
- // Otherwise, leave control to the user completely.
- std::string toolchange_gcode_str;
- if (true /*gcodegen.writer().extruder() != nullptr*/) {
+ // Process the custom toolchange_gcode. If it is empty, provide a simple Tn command to change the filament.
+ // Otherwise, leave control to the user completely.
+ std::string toolchange_gcode_str;
const std::string& toolchange_gcode = gcodegen.config().toolchange_gcode.value;
- if (!toolchange_gcode.empty()) {
+// m_max_layer_z = std::max(m_max_layer_z, tcr.print_z);
+ if (! toolchange_gcode.empty()) {
DynamicConfig config;
int previous_extruder_id = gcodegen.writer().extruder() ? (int)gcodegen.writer().extruder()->id() : -1;
config.set_key_value("previous_extruder", new ConfigOptionInt(previous_extruder_id));
- config.set_key_value("next_extruder", new ConfigOptionInt((int)new_extruder_id));
- config.set_key_value("layer_num", new ConfigOptionInt(gcodegen.m_layer_index));
- config.set_key_value("layer_z", new ConfigOptionFloat(tcr.print_z));
+ config.set_key_value("next_extruder", new ConfigOptionInt((int)new_extruder_id));
+ config.set_key_value("layer_num", new ConfigOptionInt(gcodegen.m_layer_index));
+ config.set_key_value("layer_z", new ConfigOptionFloat(tcr.print_z));
+// config.set_key_value("max_layer_z", new ConfigOptionFloat(m_max_layer_z));
toolchange_gcode_str = gcodegen.placeholder_parser_process("toolchange_gcode", toolchange_gcode, new_extruder_id, &config);
check_add_eol(toolchange_gcode_str);
}
@@ -361,299 +285,274 @@ std::string WipeTowerIntegration::append_tcr(GCode &gcodegen, const WipeTower::T
std::string toolchange_command;
if (tcr.priming || (new_extruder_id >= 0 && gcodegen.writer().need_toolchange(new_extruder_id)))
toolchange_command = gcodegen.writer().toolchange(new_extruder_id);
- if (! custom_gcode_changes_tool(toolchange_gcode_str, gcodegen.writer().toolchange_prefix(), new_extruder_id))
+ if (!custom_gcode_changes_tool(toolchange_gcode_str, gcodegen.writer().toolchange_prefix(), new_extruder_id))
toolchange_gcode_str += toolchange_command;
else {
// We have informed the m_writer about the current extruder_id, we can ignore the generated G-code.
}
- }
- gcodegen.placeholder_parser().set("current_extruder", new_extruder_id);
+ gcodegen.placeholder_parser().set("current_extruder", new_extruder_id);
- // Process the start filament gcode.
- std::string start_filament_gcode_str;
- const std::string &start_filament_gcode = gcodegen.config().start_filament_gcode.get_at(new_extruder_id);
- if (! start_filament_gcode.empty()) {
- // Process the start_filament_gcode for the active filament only.
- DynamicConfig config;
- config.set_key_value("filament_extruder_id", new ConfigOptionInt(new_extruder_id));
- start_filament_gcode_str = gcodegen.placeholder_parser_process("start_filament_gcode", start_filament_gcode, new_extruder_id, &config);
- check_add_eol(start_filament_gcode_str);
- }
+ // Process the start filament gcode.
+ std::string start_filament_gcode_str;
+ const std::string& start_filament_gcode = gcodegen.config().start_filament_gcode.get_at(new_extruder_id);
+ if (!start_filament_gcode.empty()) {
+ // Process the start_filament_gcode for the active filament only.
+ DynamicConfig config;
+ config.set_key_value("filament_extruder_id", new ConfigOptionInt(new_extruder_id));
+ start_filament_gcode_str = gcodegen.placeholder_parser_process("start_filament_gcode", start_filament_gcode, new_extruder_id, &config);
+ check_add_eol(start_filament_gcode_str);
+ }
- // Insert the end filament, toolchange, and start filament gcode into the generated gcode.
- DynamicConfig config;
- config.set_key_value("end_filament_gcode", new ConfigOptionString(end_filament_gcode_str));
- config.set_key_value("toolchange_gcode", new ConfigOptionString(toolchange_gcode_str));
- config.set_key_value("start_filament_gcode", new ConfigOptionString(start_filament_gcode_str));
- std::string tcr_gcode, tcr_escaped_gcode = gcodegen.placeholder_parser_process("tcr_rotated_gcode", tcr_rotated_gcode, new_extruder_id, &config);
- unescape_string_cstyle(tcr_escaped_gcode, tcr_gcode);
- gcode += tcr_gcode;
- check_add_eol(toolchange_gcode_str);
+ // Insert the end filament, toolchange, and start filament gcode into the generated gcode.
+ DynamicConfig config;
+ config.set_key_value("end_filament_gcode", new ConfigOptionString(end_filament_gcode_str));
+ config.set_key_value("toolchange_gcode", new ConfigOptionString(toolchange_gcode_str));
+ config.set_key_value("start_filament_gcode", new ConfigOptionString(start_filament_gcode_str));
+ std::string tcr_gcode, tcr_escaped_gcode = gcodegen.placeholder_parser_process("tcr_rotated_gcode", tcr_rotated_gcode, new_extruder_id, &config);
+ unescape_string_cstyle(tcr_escaped_gcode, tcr_gcode);
+ gcode += tcr_gcode;
+ check_add_eol(toolchange_gcode_str);
- // A phony move to the end position at the wipe tower.
- gcodegen.writer().travel_to_xy(end_pos.cast<double>());
- gcodegen.set_last_pos(wipe_tower_point_to_object_point(gcodegen, end_pos));
- if (! is_approx(z, current_z)) {
- gcode += gcodegen.writer().retract();
- gcode += gcodegen.writer().travel_to_z(current_z, "Travel back up to the topmost object layer.");
- gcode += gcodegen.writer().unretract();
- }
+ // A phony move to the end position at the wipe tower.
+ gcodegen.writer().travel_to_xy(end_pos.cast<double>());
+ gcodegen.set_last_pos(wipe_tower_point_to_object_point(gcodegen, end_pos));
+ if (!is_approx(z, current_z)) {
+ gcode += gcodegen.writer().retract();
+ gcode += gcodegen.writer().travel_to_z(current_z, "Travel back up to the topmost object layer.");
+ gcode += gcodegen.writer().unretract();
+ }
- else {
- // Prepare a future wipe.
- gcodegen.m_wipe.path.points.clear();
- if (new_extruder_id >= 0) {
- // Start the wipe at the current position.
- gcodegen.m_wipe.path.points.emplace_back(wipe_tower_point_to_object_point(gcodegen, end_pos));
- // Wipe end point: Wipe direction away from the closer tower edge to the further tower edge.
- gcodegen.m_wipe.path.points.emplace_back(wipe_tower_point_to_object_point(gcodegen,
- Vec2f((std::abs(m_left - end_pos.x()) < std::abs(m_right - end_pos.x())) ? m_right : m_left,
- end_pos.y())));
+ else {
+ // Prepare a future wipe.
+ gcodegen.m_wipe.reset_path();
+ for (const Vec2f& wipe_pt : tcr.wipe_path)
+ gcodegen.m_wipe.path.points.emplace_back(wipe_tower_point_to_object_point(gcodegen, transform_wt_pt(wipe_pt)));
}
- }
- // Let the planner know we are traveling between objects.
- gcodegen.m_avoid_crossing_perimeters.use_external_mp_once = true;
- return gcode;
-}
+ // Let the planner know we are traveling between objects.
+ gcodegen.m_avoid_crossing_perimeters.use_external_mp_once();
+ return gcode;
+ }
-// This function postprocesses gcode_original, rotates and moves all G1 extrusions and returns resulting gcode
-// Starting position has to be supplied explicitely (otherwise it would fail in case first G1 command only contained one coordinate)
-std::string WipeTowerIntegration::post_process_wipe_tower_moves(const WipeTower::ToolChangeResult& tcr, const Vec2f& translation, float angle) const
-{
- Vec2f extruder_offset = m_extruder_offsets[tcr.initial_tool].cast<float>();
-
- std::istringstream gcode_str(tcr.gcode);
- std::string gcode_out;
- std::string line;
- Vec2f pos = tcr.start_pos;
- Vec2f transformed_pos = pos;
- Vec2f old_pos(-1000.1f, -1000.1f);
- std::string never_skip_tag = WipeTower::never_skip_tag();
-
- while (gcode_str) {
- std::getline(gcode_str, line); // we read the gcode line by line
-
- // All G1 commands should be translated and rotated. X and Y coords are
- // only pushed to the output when they differ from last time.
- // WT generator can override this by appending the never_skip_tag
- if (line.find("G1 ") == 0) {
- bool never_skip = false;
- auto it = line.find(never_skip_tag);
- if (it != std::string::npos) {
- // remove the tag and remember we saw it
- never_skip = true;
- line.erase(it, it+never_skip_tag.size());
- }
- std::ostringstream line_out;
- std::istringstream line_str(line);
- line_str >> std::noskipws; // don't skip whitespace
- char ch = 0;
- while (line_str >> ch) {
- if (ch == 'X' || ch =='Y')
- line_str >> (ch == 'X' ? pos.x() : pos.y());
- else
- line_out << ch;
- }
+ // This function postprocesses gcode_original, rotates and moves all G1 extrusions and returns resulting gcode
+ // Starting position has to be supplied explicitely (otherwise it would fail in case first G1 command only contained one coordinate)
+ std::string WipeTowerIntegration::post_process_wipe_tower_moves(const WipeTower::ToolChangeResult& tcr, const Vec2f& translation, float angle) const
+ {
+ Vec2f extruder_offset = m_extruder_offsets[tcr.initial_tool].cast<float>();
+
+ std::istringstream gcode_str(tcr.gcode);
+ std::string gcode_out;
+ std::string line;
+ Vec2f pos = tcr.start_pos;
+ Vec2f transformed_pos = pos;
+ Vec2f old_pos(-1000.1f, -1000.1f);
+
+ while (gcode_str) {
+ std::getline(gcode_str, line); // we read the gcode line by line
+
+ // All G1 commands should be translated and rotated. X and Y coords are
+ // only pushed to the output when they differ from last time.
+ // WT generator can override this by appending the never_skip_tag
+ if (line.find("G1 ") == 0) {
+ bool never_skip = false;
+ auto it = line.find(WipeTower::never_skip_tag());
+ if (it != std::string::npos) {
+ // remove the tag and remember we saw it
+ never_skip = true;
+ line.erase(it, it + WipeTower::never_skip_tag().size());
+ }
+ std::ostringstream line_out;
+ std::istringstream line_str(line);
+ line_str >> std::noskipws; // don't skip whitespace
+ char ch = 0;
+ while (line_str >> ch) {
+ if (ch == 'X' || ch == 'Y')
+ line_str >> (ch == 'X' ? pos.x() : pos.y());
+ else
+ line_out << ch;
+ }
- transformed_pos = Eigen::Rotation2Df(angle) * pos + translation;
-
- if (transformed_pos != old_pos || never_skip) {
- line = line_out.str();
- std::ostringstream oss;
- oss << std::fixed << std::setprecision(3) << "G1 ";
- if (transformed_pos.x() != old_pos.x() || never_skip)
- oss << " X" << transformed_pos.x() - extruder_offset.x();
- if (transformed_pos.y() != old_pos.y() || never_skip)
- oss << " Y" << transformed_pos.y() - extruder_offset.y();
- oss << " ";
- line.replace(line.find("G1 "), 3, oss.str());
- old_pos = transformed_pos;
+ transformed_pos = Eigen::Rotation2Df(angle) * pos + translation;
+
+ if (transformed_pos != old_pos || never_skip) {
+ line = line_out.str();
+ std::ostringstream oss;
+ oss << std::fixed << std::setprecision(3) << "G1 ";
+ if (transformed_pos.x() != old_pos.x() || never_skip)
+ oss << " X" << transformed_pos.x() - extruder_offset.x();
+ if (transformed_pos.y() != old_pos.y() || never_skip)
+ oss << " Y" << transformed_pos.y() - extruder_offset.y();
+ oss << " ";
+ line.replace(line.find("G1 "), 3, oss.str());
+ old_pos = transformed_pos;
+ }
}
- }
- gcode_out += line + "\n";
+ gcode_out += line + "\n";
- // If this was a toolchange command, we should change current extruder offset
- if (line == "[toolchange_gcode]") {
- extruder_offset = m_extruder_offsets[tcr.new_tool].cast<float>();
+ // If this was a toolchange command, we should change current extruder offset
+ if (line == "[toolchange_gcode]") {
+ extruder_offset = m_extruder_offsets[tcr.new_tool].cast<float>();
- // If the extruder offset changed, add an extra move so everything is continuous
- if (extruder_offset != m_extruder_offsets[tcr.initial_tool].cast<float>()) {
- std::ostringstream oss;
- oss << std::fixed << std::setprecision(3)
- << "G1 X" << transformed_pos.x() - extruder_offset.x()
- << " Y" << transformed_pos.y() - extruder_offset.y()
- << "\n";
- gcode_out += oss.str();
+ // If the extruder offset changed, add an extra move so everything is continuous
+ if (extruder_offset != m_extruder_offsets[tcr.initial_tool].cast<float>()) {
+ std::ostringstream oss;
+ oss << std::fixed << std::setprecision(3)
+ << "G1 X" << transformed_pos.x() - extruder_offset.x()
+ << " Y" << transformed_pos.y() - extruder_offset.y()
+ << "\n";
+ gcode_out += oss.str();
+ }
}
}
+ return gcode_out;
}
- return gcode_out;
-}
-
-
-std::string WipeTowerIntegration::prime(GCode &gcodegen)
-{
- assert(m_layer_idx == 0);
- std::string gcode;
-
-
- // Disable linear advance for the wipe tower operations.
- //gcode += (gcodegen.config().gcode_flavor == gcfRepRap ? std::string("M572 D0 S0\n") : std::string("M900 K0\n"));
- for (const WipeTower::ToolChangeResult& tcr : m_priming) {
- if (!tcr.extrusions.empty())
- gcode += append_tcr(gcodegen, tcr, tcr.new_tool);
-
-
- // Let the tool change be executed by the wipe tower class.
- // Inform the G-code writer about the changes done behind its back.
- //gcode += tcr.gcode;
- // Let the m_writer know the current extruder_id, but ignore the generated G-code.
- // unsigned int current_extruder_id = tcr.extrusions.back().tool;
- // gcodegen.writer().toolchange(current_extruder_id);
- // gcodegen.placeholder_parser().set("current_extruder", current_extruder_id);
+ std::string WipeTowerIntegration::prime(GCode& gcodegen)
+ {
+ std::string gcode;
+ for (const WipeTower::ToolChangeResult& tcr : m_priming) {
+ if (! tcr.extrusions.empty())
+ gcode += append_tcr(gcodegen, tcr, tcr.new_tool);
+ }
+ return gcode;
}
- // A phony move to the end position at the wipe tower.
- /* gcodegen.writer().travel_to_xy(Vec2d(m_priming.back().end_pos.x, m_priming.back().end_pos.y));
- gcodegen.set_last_pos(wipe_tower_point_to_object_point(gcodegen, m_priming.back().end_pos));
- // Prepare a future wipe.
- gcodegen.m_wipe.path.points.clear();
- // Start the wipe at the current position.
- gcodegen.m_wipe.path.points.emplace_back(wipe_tower_point_to_object_point(gcodegen, m_priming.back().end_pos));
- // Wipe end point: Wipe direction away from the closer tower edge to the further tower edge.
- gcodegen.m_wipe.path.points.emplace_back(wipe_tower_point_to_object_point(gcodegen,
- WipeTower::xy((std::abs(m_left - m_priming.back().end_pos.x) < std::abs(m_right - m_priming.back().end_pos.x)) ? m_right : m_left,
- m_priming.back().end_pos.y)));*/
-
- return gcode;
-}
+ std::string WipeTowerIntegration::tool_change(GCode& gcodegen, int extruder_id, bool finish_layer)
+ {
+ std::string gcode;
+ assert(m_layer_idx >= 0);
+ if (!m_brim_done || gcodegen.writer().need_toolchange(extruder_id) || finish_layer) {
+ if (m_layer_idx < (int)m_tool_changes.size()) {
+ if (!(size_t(m_tool_change_idx) < m_tool_changes[m_layer_idx].size()))
+ throw Slic3r::RuntimeError("Wipe tower generation failed, possibly due to empty first layer.");
+
+
+ // Calculate where the wipe tower layer will be printed. -1 means that print z will not change,
+ // resulting in a wipe tower with sparse layers.
+ double wipe_tower_z = -1;
+ bool ignore_sparse = false;
+ if (gcodegen.config().wipe_tower_no_sparse_layers.value) {
+ wipe_tower_z = m_last_wipe_tower_print_z;
+ ignore_sparse = (m_brim_done && m_tool_changes[m_layer_idx].size() == 1 && m_tool_changes[m_layer_idx].front().initial_tool == m_tool_changes[m_layer_idx].front().new_tool);
+ if (m_tool_change_idx == 0 && !ignore_sparse)
+ wipe_tower_z = m_last_wipe_tower_print_z + m_tool_changes[m_layer_idx].front().layer_height;
+ }
-std::string WipeTowerIntegration::tool_change(GCode &gcodegen, int extruder_id, bool finish_layer)
-{
- std::string gcode;
- assert(m_layer_idx >= 0);
- if (! m_brim_done || gcodegen.writer().need_toolchange(extruder_id) || finish_layer) {
- if (m_layer_idx < (int)m_tool_changes.size()) {
- if (! (size_t(m_tool_change_idx) < m_tool_changes[m_layer_idx].size()))
- throw std::runtime_error("Wipe tower generation failed, possibly due to empty first layer.");
-
-
- // Calculate where the wipe tower layer will be printed. -1 means that print z will not change,
- // resulting in a wipe tower with sparse layers.
- double wipe_tower_z = -1;
- bool ignore_sparse = false;
- if (gcodegen.config().wipe_tower_no_sparse_layers.value) {
- wipe_tower_z = m_last_wipe_tower_print_z;
- ignore_sparse = (m_brim_done && m_tool_changes[m_layer_idx].size() == 1 && m_tool_changes[m_layer_idx].front().initial_tool == m_tool_changes[m_layer_idx].front().new_tool);
- if (m_tool_change_idx == 0 && ! ignore_sparse)
- wipe_tower_z = m_last_wipe_tower_print_z + m_tool_changes[m_layer_idx].front().layer_height;
+ if (!ignore_sparse) {
+ gcode += append_tcr(gcodegen, m_tool_changes[m_layer_idx][m_tool_change_idx++], extruder_id, wipe_tower_z);
+ m_last_wipe_tower_print_z = wipe_tower_z;
+ }
}
+ m_brim_done = true;
+ }
+ return gcode;
+ }
- if (! ignore_sparse) {
- gcode += append_tcr(gcodegen, m_tool_changes[m_layer_idx][m_tool_change_idx++], extruder_id, wipe_tower_z);
- m_last_wipe_tower_print_z = wipe_tower_z;
- }
- }
- m_brim_done = true;
+ // Print is finished. Now it remains to unload the filament safely with ramming over the wipe tower.
+ std::string WipeTowerIntegration::finalize(GCode& gcodegen)
+ {
+ std::string gcode;
+ if (std::abs(gcodegen.writer().get_position()(2) - m_final_purge.print_z) > EPSILON)
+ gcode += gcodegen.change_layer(m_final_purge.print_z);
+ gcode += append_tcr(gcodegen, m_final_purge, -1);
+ return gcode;
}
- return gcode;
-}
-// Print is finished. Now it remains to unload the filament safely with ramming over the wipe tower.
-std::string WipeTowerIntegration::finalize(GCode &gcodegen)
-{
- std::string gcode;
- if (std::abs(gcodegen.writer().get_position()(2) - m_final_purge.print_z) > EPSILON)
- gcode += gcodegen.change_layer(m_final_purge.print_z);
- gcode += append_tcr(gcodegen, m_final_purge, -1);
- return gcode;
-}
+ const std::vector<std::string> ColorPrintColors::Colors = { "#C0392B", "#E67E22", "#F1C40F", "#27AE60", "#1ABC9C", "#2980B9", "#9B59B6" };
#define EXTRUDER_CONFIG(OPT) m_config.OPT.get_at(m_writer.extruder()->id())
// Collect pairs of object_layer + support_layer sorted by print_z.
// object_layer & support_layer are considered to be on the same print_z, if they are not further than EPSILON.
-std::vector<GCode::LayerToPrint> GCode::collect_layers_to_print(const PrintObject &object)
+std::vector<GCode::LayerToPrint> GCode::collect_layers_to_print(const PrintObject& object)
{
std::vector<GCode::LayerToPrint> layers_to_print;
layers_to_print.reserve(object.layers().size() + object.support_layers().size());
- // Calculate a minimum support layer height as a minimum over all extruders, but not smaller than 10um.
- // This is the same logic as in support generator.
- //FIXME should we use the printing extruders instead?
- double gap_over_supports = object.config().support_material_contact_distance;
- // FIXME should we test object.config().support_material_synchronize_layers ? Currently the support layers are synchronized with object layers iff soluble supports.
- assert(! object.config().support_material || gap_over_supports != 0. || object.config().support_material_synchronize_layers);
+ // Calculate a minimum support layer height as a minimum over all extruders, but not smaller than 10um.
+ // This is the same logic as in support generator.
+ //FIXME should we use the printing extruders instead?
+ double gap_over_supports = object.config().support_material_contact_distance;
+ // FIXME should we test object.config().support_material_synchronize_layers ? Currently the support layers are synchronized with object layers iff soluble supports.
+ assert(!object.config().support_material || gap_over_supports != 0. || object.config().support_material_synchronize_layers);
if (gap_over_supports != 0.) {
gap_over_supports = std::max(0., gap_over_supports);
- // Not a soluble support,
- double support_layer_height_min = 1000000.;
- for (auto lh : object.print()->config().min_layer_height.values)
- support_layer_height_min = std::min(support_layer_height_min, std::max(0.01, lh));
- gap_over_supports += support_layer_height_min;
+ // Not a soluble support,
+ double support_layer_height_min = 1000000.;
+ for (auto lh : object.print()->config().min_layer_height.values)
+ support_layer_height_min = std::min(support_layer_height_min, std::max(0.01, lh));
+ gap_over_supports += support_layer_height_min;
}
// Pair the object layers with the support layers by z.
- size_t idx_object_layer = 0;
+ size_t idx_object_layer = 0;
size_t idx_support_layer = 0;
const LayerToPrint* last_extrusion_layer = nullptr;
while (idx_object_layer < object.layers().size() || idx_support_layer < object.support_layers().size()) {
LayerToPrint layer_to_print;
- layer_to_print.object_layer = (idx_object_layer < object.layers().size()) ? object.layers()[idx_object_layer ++] : nullptr;
- layer_to_print.support_layer = (idx_support_layer < object.support_layers().size()) ? object.support_layers()[idx_support_layer ++] : nullptr;
+ layer_to_print.object_layer = (idx_object_layer < object.layers().size()) ? object.layers()[idx_object_layer++] : nullptr;
+ layer_to_print.support_layer = (idx_support_layer < object.support_layers().size()) ? object.support_layers()[idx_support_layer++] : nullptr;
if (layer_to_print.object_layer && layer_to_print.support_layer) {
if (layer_to_print.object_layer->print_z < layer_to_print.support_layer->print_z - EPSILON) {
layer_to_print.support_layer = nullptr;
- -- idx_support_layer;
- } else if (layer_to_print.support_layer->print_z < layer_to_print.object_layer->print_z - EPSILON) {
+ --idx_support_layer;
+ }
+ else if (layer_to_print.support_layer->print_z < layer_to_print.object_layer->print_z - EPSILON) {
layer_to_print.object_layer = nullptr;
- -- idx_object_layer;
+ --idx_object_layer;
}
}
layers_to_print.emplace_back(layer_to_print);
+ bool has_extrusions = (layer_to_print.object_layer && layer_to_print.object_layer->has_extrusions())
+ || (layer_to_print.support_layer && layer_to_print.support_layer->has_extrusions());
+
+ // Check that there are extrusions on the very first layer.
+ if (layers_to_print.size() == 1u) {
+ if (!has_extrusions)
+ throw Slic3r::SlicingError(_(L("There is an object with no extrusions on the first layer.")));
+ }
+
// In case there are extrusions on this layer, check there is a layer to lay it on.
if ((layer_to_print.object_layer && layer_to_print.object_layer->has_extrusions())
- // Allow empty support layers, as the support generator may produce no extrusions for non-empty support regions.
- || (layer_to_print.support_layer /* && layer_to_print.support_layer->has_extrusions() */)) {
+ // Allow empty support layers, as the support generator may produce no extrusions for non-empty support regions.
+ || (layer_to_print.support_layer /* && layer_to_print.support_layer->has_extrusions() */)) {
double support_contact_z = (last_extrusion_layer && last_extrusion_layer->support_layer)
- ? gap_over_supports
- : 0.;
+ ? gap_over_supports
+ : 0.;
double maximal_print_z = (last_extrusion_layer ? last_extrusion_layer->print_z() : 0.)
- + layer_to_print.layer()->height
- + support_contact_z;
+ + layer_to_print.layer()->height
+ + support_contact_z;
// Negative support_contact_z is not taken into account, it can result in false positives in cases
// where previous layer has object extrusions too (https://github.com/prusa3d/PrusaSlicer/issues/2752)
- // Only check this layer in case it has some extrusions.
- bool has_extrusions = (layer_to_print.object_layer && layer_to_print.object_layer->has_extrusions())
- || (layer_to_print.support_layer && layer_to_print.support_layer->has_extrusions());
-
- if (has_extrusions && layer_to_print.print_z() > maximal_print_z + 2. * EPSILON)
- throw std::runtime_error(_(L("Empty layers detected, the output would not be printable.")) + "\n\n" +
+ if (has_extrusions && layer_to_print.print_z() > maximal_print_z + 2. * EPSILON) {
+ const_cast<Print*>(object.print())->active_step_add_warning(PrintStateBase::WarningLevel::CRITICAL,
+ _(L("Empty layers detected, the output would not be printable.")) + "\n\n" +
_(L("Object name")) + ": " + object.model_object()->name + "\n" + _(L("Print z")) + ": " +
std::to_string(layers_to_print.back().print_z()) + "\n\n" + _(L("This is "
- "usually caused by negligibly small extrusions or by a faulty model. Try to repair "
- "the model or change its orientation on the bed.")));
+ "usually caused by negligibly small extrusions or by a faulty model. Try to repair "
+ "the model or change its orientation on the bed.")));
+ }
+
// Remember last layer with extrusions.
- last_extrusion_layer = &layers_to_print.back();
+ if (has_extrusions)
+ last_extrusion_layer = &layers_to_print.back();
}
}
return layers_to_print;
}
-// Prepare for non-sequential printing of multiple objects: Support resp. object layers with nearly identical print_z
+// Prepare for non-sequential printing of multiple objects: Support resp. object layers with nearly identical print_z
// will be printed for all objects at once.
// Return a list of <print_z, per object LayerToPrint> items.
-std::vector<std::pair<coordf_t, std::vector<GCode::LayerToPrint>>> GCode::collect_layers_to_print(const Print &print)
+std::vector<std::pair<coordf_t, std::vector<GCode::LayerToPrint>>> GCode::collect_layers_to_print(const Print& print)
{
struct OrderingItem {
coordf_t print_z;
@@ -668,30 +567,31 @@ std::vector<std::pair<coordf_t, std::vector<GCode::LayerToPrint>>> GCode::collec
OrderingItem ordering_item;
ordering_item.object_idx = i;
ordering.reserve(ordering.size() + per_object[i].size());
- const LayerToPrint &front = per_object[i].front();
- for (const LayerToPrint &ltp : per_object[i]) {
- ordering_item.print_z = ltp.print_z();
+ const LayerToPrint& front = per_object[i].front();
+ for (const LayerToPrint& ltp : per_object[i]) {
+ ordering_item.print_z = ltp.print_z();
ordering_item.layer_idx = &ltp - &front;
ordering.emplace_back(ordering_item);
}
}
- std::sort(ordering.begin(), ordering.end(), [](const OrderingItem &oi1, const OrderingItem &oi2) { return oi1.print_z < oi2.print_z; });
+ std::sort(ordering.begin(), ordering.end(), [](const OrderingItem& oi1, const OrderingItem& oi2) { return oi1.print_z < oi2.print_z; });
std::vector<std::pair<coordf_t, std::vector<LayerToPrint>>> layers_to_print;
+
// Merge numerically very close Z values.
for (size_t i = 0; i < ordering.size();) {
// Find the last layer with roughly the same print_z.
size_t j = i + 1;
coordf_t zmax = ordering[i].print_z + EPSILON;
- for (; j < ordering.size() && ordering[j].print_z <= zmax; ++ j) ;
+ for (; j < ordering.size() && ordering[j].print_z <= zmax; ++j);
// Merge into layers_to_print.
std::pair<coordf_t, std::vector<LayerToPrint>> merged;
// Assign an average print_z to the set of layers with nearly equal print_z.
- merged.first = 0.5 * (ordering[i].print_z + ordering[j-1].print_z);
+ merged.first = 0.5 * (ordering[i].print_z + ordering[j - 1].print_z);
merged.second.assign(print.objects().size(), LayerToPrint());
for (; i < j; ++i) {
- const OrderingItem &oi = ordering[i];
+ const OrderingItem& oi = ordering[i];
assert(merged.second[oi.object_idx].layer() == nullptr);
merged.second[oi.object_idx] = std::move(per_object[oi.object_idx][oi.layer_idx]);
}
@@ -701,11 +601,18 @@ std::vector<std::pair<coordf_t, std::vector<GCode::LayerToPrint>>> GCode::collec
return layers_to_print;
}
-#if ENABLE_THUMBNAIL_GENERATOR
-void GCode::do_export(Print* print, const char* path, GCodePreviewData* preview_data, ThumbnailsGeneratorCallback thumbnail_cb)
-#else
-void GCode::do_export(Print *print, const char *path, GCodePreviewData *preview_data)
-#endif // ENABLE_THUMBNAIL_GENERATOR
+// free functions called by GCode::do_export()
+namespace DoExport {
+ static void update_print_estimated_times_stats(const GCodeProcessor& processor, PrintStatistics& print_statistics)
+ {
+ const GCodeProcessor::Result& result = processor.get_result();
+ print_statistics.estimated_normal_print_time = get_time_dhms(result.time_statistics.modes[static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Normal)].time);
+ print_statistics.estimated_silent_print_time = processor.is_stealth_time_estimator_enabled() ?
+ get_time_dhms(result.time_statistics.modes[static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Stealth)].time) : "N/A";
+ }
+} // namespace DoExport
+
+void GCode::do_export(Print* print, const char* path, GCodeProcessor::Result* result, ThumbnailsGeneratorCallback thumbnail_cb)
{
PROFILE_CLEAR();
@@ -725,22 +632,16 @@ void GCode::do_export(Print *print, const char *path, GCodePreviewData *preview_
FILE *file = boost::nowide::fopen(path_tmp.c_str(), "wb");
if (file == nullptr)
- throw std::runtime_error(std::string("G-code export to ") + path + " failed.\nCannot open the file for writing.\n");
-
- m_enable_analyzer = preview_data != nullptr;
+ throw Slic3r::RuntimeError(std::string("G-code export to ") + path + " failed.\nCannot open the file for writing.\n");
try {
m_placeholder_parser_failed_templates.clear();
-#if ENABLE_THUMBNAIL_GENERATOR
this->_do_export(*print, file, thumbnail_cb);
-#else
- this->_do_export(*print, file);
-#endif // ENABLE_THUMBNAIL_GENERATOR
fflush(file);
if (ferror(file)) {
fclose(file);
boost::nowide::remove(path_tmp.c_str());
- throw std::runtime_error(std::string("G-code export to ") + path + " failed\nIs the disk full?\n");
+ throw Slic3r::RuntimeError(std::string("G-code export to ") + path + " failed\nIs the disk full?\n");
}
} catch (std::exception & /* ex */) {
// Rethrow on any exception. std::runtime_exception and CanceledException are expected to be thrown.
@@ -753,46 +654,33 @@ void GCode::do_export(Print *print, const char *path, GCodePreviewData *preview_
if (! m_placeholder_parser_failed_templates.empty()) {
// G-code export proceeded, but some of the PlaceholderParser substitutions failed.
+ //FIXME localize!
std::string msg = std::string("G-code export to ") + path + " failed due to invalid custom G-code sections:\n\n";
- for (const std::string &name : m_placeholder_parser_failed_templates)
- msg += std::string("\t") + name + "\n";
+ for (const auto &name_and_error : m_placeholder_parser_failed_templates)
+ msg += name_and_error.first + "\n" + name_and_error.second + "\n";
msg += "\nPlease inspect the file ";
msg += path_tmp + " for error messages enclosed between\n";
msg += " !!!!! Failed to process the custom G-code template ...\n";
msg += "and\n";
msg += " !!!!! End of an error report for the custom G-code template ...\n";
- throw std::runtime_error(msg);
+ msg += "for all macro processing errors.";
+ throw Slic3r::PlaceholderParserError(msg);
}
- GCodeTimeEstimator::PostProcessData normal_data = m_normal_time_estimator.get_post_process_data();
- GCodeTimeEstimator::PostProcessData silent_data = m_silent_time_estimator.get_post_process_data();
-
- bool remaining_times_enabled = print->config().remaining_times.value;
-
- BOOST_LOG_TRIVIAL(debug) << "Time estimator post processing" << log_memory_info();
- GCodeTimeEstimator::post_process(path_tmp, 60.0f, remaining_times_enabled ? &normal_data : nullptr, (remaining_times_enabled && m_silent_time_estimator_enabled) ? &silent_data : nullptr);
-
- if (remaining_times_enabled)
- {
- m_normal_time_estimator.reset();
- if (m_silent_time_estimator_enabled)
- m_silent_time_estimator.reset();
- }
-
- // starts analyzer calculations
- if (m_enable_analyzer) {
- BOOST_LOG_TRIVIAL(debug) << "Preparing G-code preview data" << log_memory_info();
- m_analyzer.calc_gcode_preview_data(*preview_data, [print]() { print->throw_if_canceled(); });
- m_analyzer.reset();
- }
+ BOOST_LOG_TRIVIAL(debug) << "Start processing gcode, " << log_memory_info();
+ m_processor.process_file(path_tmp, true, [print]() { print->throw_if_canceled(); });
+ DoExport::update_print_estimated_times_stats(m_processor, print->m_print_statistics);
+ if (result != nullptr)
+ *result = std::move(m_processor.extract_result());
+ BOOST_LOG_TRIVIAL(debug) << "Finished processing gcode, " << log_memory_info();
if (rename_file(path_tmp, path))
- throw std::runtime_error(
+ throw Slic3r::RuntimeError(
std::string("Failed to rename the output G-code file from ") + path_tmp + " to " + path + '\n' +
"Is " + path_tmp + " locked?" + '\n');
BOOST_LOG_TRIVIAL(info) << "Exporting G-code finished" << log_memory_info();
- print->set_done(psGCodeExport);
+ print->set_done(psGCodeExport);
// Write the profiler measurements to file
PROFILE_UPDATE();
@@ -801,104 +689,13 @@ void GCode::do_export(Print *print, const char *path, GCodePreviewData *preview_
// free functions called by GCode::_do_export()
namespace DoExport {
- static void init_time_estimators(const PrintConfig &config, GCodeTimeEstimator &normal_time_estimator, GCodeTimeEstimator &silent_time_estimator, bool &silent_time_estimator_enabled)
- {
- // resets time estimators
- normal_time_estimator.reset();
- normal_time_estimator.set_dialect(config.gcode_flavor);
- normal_time_estimator.set_extrusion_axis(config.get_extrusion_axis()[0]);
- silent_time_estimator_enabled = (config.gcode_flavor == gcfMarlin) && config.silent_mode;
-
- // Until we have a UI support for the other firmwares than the Marlin, use the hardcoded default values
- // and let the user to enter the G-code limits into the start G-code.
- // If the following block is enabled for other firmwares than the Marlin, then the function
- // this->print_machine_envelope(file, print);
- // shall be adjusted as well to produce a G-code block compatible with the particular firmware flavor.
- if (config.gcode_flavor.value == gcfMarlin) {
- normal_time_estimator.set_max_acceleration((float)config.machine_max_acceleration_extruding.values[0]);
- normal_time_estimator.set_retract_acceleration((float)config.machine_max_acceleration_retracting.values[0]);
- normal_time_estimator.set_minimum_feedrate((float)config.machine_min_extruding_rate.values[0]);
- normal_time_estimator.set_minimum_travel_feedrate((float)config.machine_min_travel_rate.values[0]);
- normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::X, (float)config.machine_max_acceleration_x.values[0]);
- normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Y, (float)config.machine_max_acceleration_y.values[0]);
- normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Z, (float)config.machine_max_acceleration_z.values[0]);
- normal_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::E, (float)config.machine_max_acceleration_e.values[0]);
- normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::X, (float)config.machine_max_feedrate_x.values[0]);
- normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Y, (float)config.machine_max_feedrate_y.values[0]);
- normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Z, (float)config.machine_max_feedrate_z.values[0]);
- normal_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::E, (float)config.machine_max_feedrate_e.values[0]);
- normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::X, (float)config.machine_max_jerk_x.values[0]);
- normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Y, (float)config.machine_max_jerk_y.values[0]);
- normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Z, (float)config.machine_max_jerk_z.values[0]);
- normal_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::E, (float)config.machine_max_jerk_e.values[0]);
-
- if (silent_time_estimator_enabled)
- {
- silent_time_estimator.reset();
- silent_time_estimator.set_dialect(config.gcode_flavor);
- silent_time_estimator.set_extrusion_axis(config.get_extrusion_axis()[0]);
- /* "Stealth mode" values can be just a copy of "normal mode" values
- * (when they aren't input for a printer preset).
- * Thus, use back value from values, instead of second one, which could be absent
- */
- silent_time_estimator.set_max_acceleration((float)config.machine_max_acceleration_extruding.values.back());
- silent_time_estimator.set_retract_acceleration((float)config.machine_max_acceleration_retracting.values.back());
- silent_time_estimator.set_minimum_feedrate((float)config.machine_min_extruding_rate.values.back());
- silent_time_estimator.set_minimum_travel_feedrate((float)config.machine_min_travel_rate.values.back());
- silent_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::X, (float)config.machine_max_acceleration_x.values.back());
- silent_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Y, (float)config.machine_max_acceleration_y.values.back());
- silent_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::Z, (float)config.machine_max_acceleration_z.values.back());
- silent_time_estimator.set_axis_max_acceleration(GCodeTimeEstimator::E, (float)config.machine_max_acceleration_e.values.back());
- silent_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::X, (float)config.machine_max_feedrate_x.values.back());
- silent_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Y, (float)config.machine_max_feedrate_y.values.back());
- silent_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::Z, (float)config.machine_max_feedrate_z.values.back());
- silent_time_estimator.set_axis_max_feedrate(GCodeTimeEstimator::E, (float)config.machine_max_feedrate_e.values.back());
- silent_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::X, (float)config.machine_max_jerk_x.values.back());
- silent_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Y, (float)config.machine_max_jerk_y.values.back());
- silent_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::Z, (float)config.machine_max_jerk_z.values.back());
- silent_time_estimator.set_axis_max_jerk(GCodeTimeEstimator::E, (float)config.machine_max_jerk_e.values.back());
- if (config.single_extruder_multi_material) {
- // As of now the fields are shown at the UI dialog in the same combo box as the ramming values, so they
- // are considered to be active for the single extruder multi-material printers only.
- silent_time_estimator.set_filament_load_times(config.filament_load_time.values);
- silent_time_estimator.set_filament_unload_times(config.filament_unload_time.values);
- }
- }
- }
- // Filament load / unload times are not specific to a firmware flavor. Let anybody use it if they find it useful.
- if (config.single_extruder_multi_material) {
- // As of now the fields are shown at the UI dialog in the same combo box as the ramming values, so they
- // are considered to be active for the single extruder multi-material printers only.
- normal_time_estimator.set_filament_load_times(config.filament_load_time.values);
- normal_time_estimator.set_filament_unload_times(config.filament_unload_time.values);
- }
- }
-
- static void init_gcode_analyzer(const PrintConfig &config, GCodeAnalyzer &analyzer)
- {
- // resets analyzer
- analyzer.reset();
-
- // send extruder offset data to analyzer
- GCodeAnalyzer::ExtruderOffsetsMap extruder_offsets;
- unsigned int num_extruders = static_cast<unsigned int>(config.nozzle_diameter.values.size());
- for (unsigned int extruder_id = 0; extruder_id < num_extruders; ++ extruder_id)
- {
- Vec2d offset = config.extruder_offset.get_at(extruder_id);
- if (!offset.isApprox(Vec2d::Zero()))
- extruder_offsets[extruder_id] = offset;
- }
- analyzer.set_extruder_offsets(extruder_offsets);
-
- // tell analyzer about the extrusion axis
- analyzer.set_extrusion_axis(config.get_extrusion_axis()[0]);
-
- // send extruders count to analyzer to allow it to detect invalid extruder idxs
- analyzer.set_extruders_count(num_extruders);
-
- // tell analyzer about the gcode flavor
- analyzer.set_gcode_flavor(config.gcode_flavor);
- }
+ static void init_gcode_processor(const PrintConfig& config, GCodeProcessor& processor, bool& silent_time_estimator_enabled)
+ {
+ silent_time_estimator_enabled = (config.gcode_flavor == gcfMarlin) && config.silent_mode;
+ processor.reset();
+ processor.apply_config(config);
+ processor.enable_stealth_time_estimator(silent_time_estimator_enabled);
+ }
static double autospeed_volumetric_limit(const Print &print)
{
@@ -917,8 +714,21 @@ namespace DoExport {
if (region->config().get_abs_value("infill_speed") == 0 ||
region->config().get_abs_value("solid_infill_speed") == 0 ||
region->config().get_abs_value("top_solid_infill_speed") == 0 ||
- region->config().get_abs_value("bridge_speed") == 0)
- mm3_per_mm.push_back(layerm->fills.min_mm3_per_mm());
+ region->config().get_abs_value("bridge_speed") == 0)
+ {
+ // Minimal volumetric flow should not be calculated over ironing extrusions.
+ // Use following lambda instead of the built-it method.
+ // https://github.com/prusa3d/PrusaSlicer/issues/5082
+ auto min_mm3_per_mm_no_ironing = [](const ExtrusionEntityCollection& eec) -> double {
+ double min = std::numeric_limits<double>::max();
+ for (const ExtrusionEntity* ee : eec.entities)
+ if (ee->role() != erIroning)
+ min = std::min(min, ee->min_mm3_per_mm());
+ return min;
+ };
+
+ mm3_per_mm.push_back(min_mm3_per_mm_no_ironing(layerm->fills));
+ }
}
}
if (object->config().get_abs_value("support_material_speed") == 0 ||
@@ -943,7 +753,8 @@ namespace DoExport {
return volumetric_speed;
}
- static void init_ooze_prevention(const Print &print, OozePrevention &ooze_prevention)
+
+ static void init_ooze_prevention(const Print &print, OozePrevention &ooze_prevention)
{
// Calculate wiping points if needed
if (print.config().ooze_prevention.value && ! print.config().single_extruder_multi_material) {
@@ -975,7 +786,6 @@ namespace DoExport {
}
}
- #if ENABLE_THUMBNAIL_GENERATOR
template<typename WriteToOutput, typename ThrowIfCanceledCallback>
static void export_thumbnails_to_file(ThumbnailsGeneratorCallback &thumbnail_cb, const std::vector<Vec2d> &sizes, WriteToOutput output, ThrowIfCanceledCallback throw_if_canceled)
{
@@ -1019,27 +829,18 @@ namespace DoExport {
}
}
}
- #endif // ENABLE_THUMBNAIL_GENERATOR
// Fill in print_statistics and return formatted string containing filament statistics to be inserted into G-code comment section.
- static std::string update_print_stats_and_format_filament_stats(
- const GCodeTimeEstimator &normal_time_estimator,
- const GCodeTimeEstimator &silent_time_estimator,
- const bool silent_time_estimator_enabled,
- const bool has_wipe_tower,
+ static std::string update_print_stats_and_format_filament_stats(
+ const bool has_wipe_tower,
const WipeTowerData &wipe_tower_data,
const std::vector<Extruder> &extruders,
PrintStatistics &print_statistics)
- {
+ {
std::string filament_stats_string_out;
print_statistics.clear();
- print_statistics.estimated_normal_print_time = normal_time_estimator.get_time_dhm/*s*/();
- print_statistics.estimated_silent_print_time = silent_time_estimator_enabled ? silent_time_estimator.get_time_dhm/*s*/() : "N/A";
- print_statistics.estimated_normal_custom_gcode_print_times = normal_time_estimator.get_custom_gcode_times_dhm(true);
- if (silent_time_estimator_enabled)
- print_statistics.estimated_silent_custom_gcode_print_times = silent_time_estimator.get_custom_gcode_times_dhm(true);
- print_statistics.total_toolchanges = std::max(0, wipe_tower_data.number_of_toolchanges);
+ print_statistics.total_toolchanges = std::max(0, wipe_tower_data.number_of_toolchanges);
if (! extruders.empty()) {
std::pair<std::string, unsigned int> out_filament_used_mm ("; filament used [mm] = ", 0);
std::pair<std::string, unsigned int> out_filament_used_cm3("; filament used [cm3] = ", 0);
@@ -1064,14 +865,14 @@ namespace DoExport {
++ dst.second;
};
print_statistics.filament_stats.insert(std::pair<size_t, float>{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;
@@ -1081,26 +882,26 @@ namespace DoExport {
}
filament_stats_string_out += out_filament_used_mm.first;
filament_stats_string_out += "\n" + out_filament_used_cm3.first;
- if (out_filament_used_g.second)
+ if (out_filament_used_g.second)
filament_stats_string_out += "\n" + out_filament_used_g.first;
- if (out_filament_cost.second)
+ if (out_filament_cost.second)
filament_stats_string_out += "\n" + out_filament_cost.first;
- }
- return filament_stats_string_out;
- }
+ }
+ return filament_stats_string_out;
+ }
}
// Sort the PrintObjects by their increasing Z, likely useful for avoiding colisions on Deltas during sequential prints.
static inline std::vector<const PrintInstance*> sort_object_instances_by_max_z(const Print &print)
{
std::vector<const PrintObject*> objects(print.objects().begin(), print.objects().end());
- std::sort(objects.begin(), objects.end(), [](const PrintObject *po1, const PrintObject *po2) { return po1->height() < po2->height(); });
- std::vector<const PrintInstance*> instances;
- instances.reserve(objects.size());
- for (const PrintObject *object : objects)
- for (size_t i = 0; i < object->instances().size(); ++ i)
- instances.emplace_back(&object->instances()[i]);
- return instances;
+ std::sort(objects.begin(), objects.end(), [](const PrintObject *po1, const PrintObject *po2) { return po1->height() < po2->height(); });
+ std::vector<const PrintInstance*> instances;
+ instances.reserve(objects.size());
+ for (const PrintObject *object : objects)
+ for (size_t i = 0; i < object->instances().size(); ++ i)
+ instances.emplace_back(&object->instances()[i]);
+ return instances;
}
// Produce a vector of PrintObjects in the order of their respective ModelObjects in print.model().
@@ -1125,23 +926,26 @@ std::vector<const PrintInstance*> sort_object_instances_by_model_order(const Pri
return instances;
}
-#if ENABLE_THUMBNAIL_GENERATOR
void GCode::_do_export(Print& print, FILE* file, ThumbnailsGeneratorCallback thumbnail_cb)
-#else
-void GCode::_do_export(Print& print, FILE* file)
-#endif // ENABLE_THUMBNAIL_GENERATOR
{
PROFILE_FUNC();
- DoExport::init_time_estimators(print.config(),
- // modifies the following:
- m_normal_time_estimator, m_silent_time_estimator, m_silent_time_estimator_enabled);
- DoExport::init_gcode_analyzer(print.config(), m_analyzer);
+ // modifies m_silent_time_estimator_enabled
+ DoExport::init_gcode_processor(print.config(), m_processor, m_silent_time_estimator_enabled);
// resets analyzer's tracking data
- m_last_mm3_per_mm = GCodeAnalyzer::Default_mm3_per_mm;
- m_last_width = GCodeAnalyzer::Default_Width;
- m_last_height = GCodeAnalyzer::Default_Height;
+ m_last_height = 0.f;
+ m_last_layer_z = 0.f;
+ m_max_layer_z = 0.f;
+#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ m_last_width = 0.f;
+#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+#if ENABLE_GCODE_VIEWER_DATA_CHECKING
+ m_last_mm3_per_mm = 0.;
+#if !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ m_last_width = 0.f;
+#endif // !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
// How many times will be change_layer() called?
// change_layer() in turn increments the progress bar status.
@@ -1194,8 +998,8 @@ void GCode::_do_export(Print& print, FILE* file)
// Write information on the generator.
_write_format(file, "; %s\n\n", Slic3r::header_slic3r_generated().c_str());
- DoExport::export_thumbnails_to_file(thumbnail_cb, print.full_print_config().option<ConfigOptionPoints>("thumbnails")->values,
- [this, file](const char* sz) { this->_write(file, sz); },
+ DoExport::export_thumbnails_to_file(thumbnail_cb, print.full_print_config().option<ConfigOptionPoints>("thumbnails")->values,
+ [this, file](const char* sz) { this->_write(file, sz); },
[&print]() { print.throw_if_canceled(); });
// Write notes (content of the Print Settings tab -> Notes)
@@ -1230,14 +1034,10 @@ void GCode::_do_export(Print& print, FILE* file)
_write_format(file, "\n");
}
print.throw_if_canceled();
-
+
// adds tags for time estimators
if (print.config().remaining_times.value)
- {
- _writeln(file, GCodeTimeEstimator::Normal_First_M73_Output_Placeholder_Tag);
- if (m_silent_time_estimator_enabled)
- _writeln(file, GCodeTimeEstimator::Silent_First_M73_Output_Placeholder_Tag);
- }
+ _writeln(file, GCodeProcessor::First_Line_M73_Placeholder_Tag);
// Prepare the helper object for replacing placeholders in custom G-code and output filename.
m_placeholder_parser = print.placeholder_parser();
@@ -1265,12 +1065,12 @@ void GCode::_do_export(Print& print, FILE* file)
}
// We don't allow switching of extruders per layer by Model::custom_gcode_per_print_z in sequential mode.
// Use the extruder IDs collected from Regions.
- this->set_extruders(print.extruders());
+ this->set_extruders(print.extruders());
} else {
- // Find tool ordering for all the objects at once, and the initial extruder ID.
+ // Find tool ordering for all the objects at once, and the initial extruder ID.
// If the tool ordering has been pre-calculated by Print class for wipe tower already, reuse it.
- tool_ordering = print.tool_ordering();
- tool_ordering.assign_custom_gcodes(print);
+ tool_ordering = print.tool_ordering();
+ tool_ordering.assign_custom_gcodes(print);
has_wipe_tower = print.has_wipe_tower() && tool_ordering.has_wipe_tower();
initial_extruder_id = (has_wipe_tower && ! print.config().single_extruder_multi_material_priming) ?
// The priming towers will be skipped.
@@ -1279,7 +1079,7 @@ void GCode::_do_export(Print& print, FILE* file)
tool_ordering.first_extruder();
// In non-sequential print, the printing extruders may have been modified by the extruder switches stored in Model::custom_gcode_per_print_z.
// Therefore initialize the printing extruders from there.
- this->set_extruders(tool_ordering.all_extruders());
+ this->set_extruders(tool_ordering.all_extruders());
// Order object instances using a nearest neighbor search.
print_object_instances_ordering = chain_print_object_instances(print);
}
@@ -1314,16 +1114,36 @@ void GCode::_do_export(Print& print, FILE* file)
m_placeholder_parser.set("has_wipe_tower", has_wipe_tower);
m_placeholder_parser.set("has_single_extruder_multi_material_priming", has_wipe_tower && print.config().single_extruder_multi_material_priming);
m_placeholder_parser.set("total_toolchanges", std::max(0, print.wipe_tower_data().number_of_toolchanges)); // Check for negative toolchanges (single extruder mode) and set to 0 (no tool change).
-
+ {
+ BoundingBoxf bbox(print.config().bed_shape.values);
+ m_placeholder_parser.set("print_bed_min", new ConfigOptionFloats({ bbox.min.x(), bbox.min.y() }));
+ m_placeholder_parser.set("print_bed_max", new ConfigOptionFloats({ bbox.max.x(), bbox.max.y() }));
+ m_placeholder_parser.set("print_bed_size", new ConfigOptionFloats({ bbox.size().x(), bbox.size().y() }));
+ }
+ {
+ // Convex hull of the 1st layer extrusions, for bed leveling and placing the initial purge line.
+ // It encompasses the object extrusions, support extrusions, skirt, brim, wipe tower.
+ // It does NOT encompass user extrusions generated by custom G-code,
+ // therefore it does NOT encompass the initial purge line.
+ // It does NOT encompass MMU/MMU2 starting (wipe) areas.
+ auto pts = std::make_unique<ConfigOptionPoints>();
+ pts->values.reserve(print.first_layer_convex_hull().size());
+ for (const Point &pt : print.first_layer_convex_hull().points)
+ pts->values.emplace_back(unscale(pt));
+ BoundingBoxf bbox(pts->values);
+ m_placeholder_parser.set("first_layer_print_convex_hull", pts.release());
+ m_placeholder_parser.set("first_layer_print_min", new ConfigOptionFloats({ bbox.min.x(), bbox.min.y() }));
+ m_placeholder_parser.set("first_layer_print_max", new ConfigOptionFloats({ bbox.max.x(), bbox.max.y() }));
+ m_placeholder_parser.set("first_layer_print_size", new ConfigOptionFloats({ bbox.size().x(), bbox.size().y() }));
+ }
std::string start_gcode = this->placeholder_parser_process("start_gcode", print.config().start_gcode.value, initial_extruder_id);
// Set bed temperature if the start G-code does not contain any bed temp control G-codes.
this->_print_first_layer_bed_temperature(file, print, start_gcode, initial_extruder_id, true);
// Set extruder(s) temperature before and after start G-code.
this->_print_first_layer_extruder_temperatures(file, print, start_gcode, initial_extruder_id, false);
- if (m_enable_analyzer)
- // adds tag for analyzer
- _write_format(file, ";%s%d\n", GCodeAnalyzer::Extrusion_Role_Tag.c_str(), erCustom);
+ // adds tag for processor
+ _write_format(file, ";%s%s\n", GCodeProcessor::Extrusion_Role_Tag.c_str(), ExtrusionEntity::role_to_string(erCustom).c_str());
// Write the custom start G-code
_writeln(file, start_gcode);
@@ -1343,17 +1163,13 @@ void GCode::_do_export(Print& print, FILE* file)
// Set other general things.
_write(file, this->preamble());
- // Initialize a motion planner for object-to-object travel moves.
- m_avoid_crossing_perimeters.reset();
- if (print.config().avoid_crossing_perimeters.value) {
- m_avoid_crossing_perimeters.init_external_mp(print);
- print.throw_if_canceled();
- }
-
// Calculate wiping points if needed
DoExport::init_ooze_prevention(print, m_ooze_prevention);
print.throw_if_canceled();
-
+
+ // Collect custom seam data from all objects.
+ m_seam_placer.init(print);
+
if (! (has_wipe_tower && print.config().single_extruder_multi_material_priming)) {
// Set initial extruder only after custom start G-code.
// Ugly hack: Do not set the initial extruder if the extruder is primed using the MMU priming towers at the edge of the print bed.
@@ -1382,12 +1198,12 @@ void GCode::_do_export(Print& print, FILE* file)
// Move to the origin position for the copy we're going to print.
// This happens before Z goes down to layer 0 again, so that no collision happens hopefully.
m_enable_cooling_markers = false; // we're not filtering these moves through CoolingBuffer
- m_avoid_crossing_perimeters.use_external_mp_once = true;
+ m_avoid_crossing_perimeters.use_external_mp_once();
_write(file, this->retract());
_write(file, this->travel_to(Point(0, 0), erNone, "move to origin position for next object"));
m_enable_cooling_markers = true;
// Disable motion planner when traveling to first object point.
- m_avoid_crossing_perimeters.disable_once = true;
+ m_avoid_crossing_perimeters.disable_once();
// Ff we are printing the bottom layer of an object, and we have already finished
// another one, set first layer temperatures. This happens before the Z move
// is triggered, so machine has more time to reach such temperatures.
@@ -1428,7 +1244,7 @@ void GCode::_do_export(Print& print, FILE* file)
m_wipe_tower.reset(new WipeTowerIntegration(print.config(), *print.wipe_tower_data().priming.get(), print.wipe_tower_data().tool_changes, *print.wipe_tower_data().final_purge.get()));
_write(file, m_writer.travel_to_z(first_layer_height + m_config.z_offset.value, "Move to the first layer height"));
if (print.config().single_extruder_multi_material_priming) {
- _write(file, m_wipe_tower->prime(*this));
+ _write(file, m_wipe_tower->prime(*this));
// Verify, whether the print overaps the priming extrusions.
BoundingBoxf bbox_print(get_print_extrusions_extents(print));
coordf_t twolayers_printz = ((layers_to_print.size() == 1) ? layers_to_print.front() : layers_to_print[1]).first + EPSILON;
@@ -1437,18 +1253,30 @@ void GCode::_do_export(Print& print, FILE* file)
bbox_print.merge(get_wipe_tower_extrusions_extents(print, twolayers_printz));
BoundingBoxf bbox_prime(get_wipe_tower_priming_extrusions_extents(print));
bbox_prime.offset(0.5f);
- // Beep for 500ms, tone 800Hz. Yet better, play some Morse.
- _write(file, this->retract());
- _write(file, "M300 S800 P500\n");
- if (bbox_prime.overlap(bbox_print)) {
- // Wait for the user to remove the priming extrusions, otherwise they would
- // get covered by the print.
- _write(file, "M1 Remove priming towers and click button.\n");
- }
- else {
- // Just wait for a bit to let the user check, that the priming succeeded.
- //TODO Add a message explaining what the printer is waiting for. This needs a firmware fix.
- _write(file, "M1 S10\n");
+ bool overlap = bbox_prime.overlap(bbox_print);
+
+ if (print.config().gcode_flavor == gcfMarlin) {
+ _write(file, this->retract());
+ _write(file, "M300 S800 P500\n"); // Beep for 500ms, tone 800Hz.
+ if (overlap) {
+ // Wait for the user to remove the priming extrusions.
+ _write(file, "M1 Remove priming towers and click button.\n");
+ } else {
+ // Just wait for a bit to let the user check, that the priming succeeded.
+ //TODO Add a message explaining what the printer is waiting for. This needs a firmware fix.
+ _write(file, "M1 S10\n");
+ }
+ } else {
+ // This is not Marlin, M1 command is probably not supported.
+ // (See https://github.com/prusa3d/PrusaSlicer/issues/5441.)
+ if (overlap) {
+ print.active_step_add_warning(PrintStateBase::WarningLevel::CRITICAL,
+ _(L("Your print is very close to the priming regions. "
+ "Make sure there is no collision.")));
+ } else {
+ // Just continue printing, no action necessary.
+ }
+
}
}
print.throw_if_canceled();
@@ -1474,15 +1302,15 @@ void GCode::_do_export(Print& print, FILE* file)
_write(file, this->retract());
_write(file, m_writer.set_fan(false));
- if (m_enable_analyzer)
- // adds tag for analyzer
- _write_format(file, ";%s%d\n", GCodeAnalyzer::Extrusion_Role_Tag.c_str(), erCustom);
+ // adds tag for processor
+ _write_format(file, ";%s%s\n", GCodeProcessor::Extrusion_Role_Tag.c_str(), ExtrusionEntity::role_to_string(erCustom).c_str());
// Process filament-specific gcode in extruder order.
{
DynamicConfig config;
config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index));
config.set_key_value("layer_z", new ConfigOptionFloat(m_writer.get_position()(2) - m_config.z_offset.value));
+ config.set_key_value("max_layer_z", new ConfigOptionFloat(m_max_layer_z));
if (print.config().single_extruder_multi_material) {
// Process the end_filament_gcode for the active filament only.
int extruder_id = m_writer.extruder()->id();
@@ -1490,7 +1318,7 @@ void GCode::_do_export(Print& print, FILE* file)
_writeln(file, this->placeholder_parser_process("end_filament_gcode", print.config().end_filament_gcode.get_at(extruder_id), extruder_id, &config));
} else {
for (const std::string &end_gcode : print.config().end_filament_gcode.values) {
- int extruder_id = (unsigned int)(&end_gcode - &print.config().end_filament_gcode.values.front());
+ int extruder_id = (unsigned int)(&end_gcode - &print.config().end_filament_gcode.values.front());
config.set_key_value("filament_extruder_id", new ConfigOptionInt(extruder_id));
_writeln(file, this->placeholder_parser_process("end_filament_gcode", end_gcode, extruder_id, &config));
}
@@ -1502,40 +1330,28 @@ void GCode::_do_export(Print& print, FILE* file)
// adds tags for time estimators
if (print.config().remaining_times.value)
- {
- _writeln(file, GCodeTimeEstimator::Normal_Last_M73_Output_Placeholder_Tag);
- if (m_silent_time_estimator_enabled)
- _writeln(file, GCodeTimeEstimator::Silent_Last_M73_Output_Placeholder_Tag);
- }
+ _writeln(file, GCodeProcessor::Last_Line_M73_Placeholder_Tag);
print.throw_if_canceled();
- // calculates estimated printing time
- m_normal_time_estimator.calculate_time(false);
- if (m_silent_time_estimator_enabled)
- m_silent_time_estimator.calculate_time(false);
-
// Get filament stats.
_write(file, DoExport::update_print_stats_and_format_filament_stats(
// Const inputs
- m_normal_time_estimator, m_silent_time_estimator, m_silent_time_estimator_enabled,
- has_wipe_tower, print.wipe_tower_data(),
+ has_wipe_tower, print.wipe_tower_data(),
m_writer.extruders(),
// 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);
- _write_format(file, "; estimated printing time (normal mode) = %s\n", m_normal_time_estimator.get_time_dhms().c_str());
- if (m_silent_time_estimator_enabled)
- _write_format(file, "; estimated printing time (silent mode) = %s\n", m_silent_time_estimator.get_time_dhms().c_str());
+ _writeln(file, GCodeProcessor::Estimated_Printing_Time_Placeholder_Tag);
// Append full config.
_write(file, "\n");
{
- std::string full_config = "";
+ std::string full_config;
append_full_config(print, full_config);
if (!full_config.empty())
_write(file, full_config);
@@ -1546,21 +1362,25 @@ void GCode::_do_export(Print& print, FILE* file)
std::string GCode::placeholder_parser_process(const std::string &name, const std::string &templ, unsigned int current_extruder_id, const DynamicConfig *config_override)
{
try {
- return m_placeholder_parser.process(templ, current_extruder_id, config_override);
+ return m_placeholder_parser.process(templ, current_extruder_id, config_override, &m_placeholder_parser_context);
} catch (std::runtime_error &err) {
// Collect the names of failed template substitutions for error reporting.
- m_placeholder_parser_failed_templates.insert(name);
+ auto it = m_placeholder_parser_failed_templates.find(name);
+ if (it == m_placeholder_parser_failed_templates.end())
+ // Only if there was no error reported for this template, store the first error message into the map to be reported.
+ // We don't want to collect error message for each and every occurence of a single custom G-code section.
+ m_placeholder_parser_failed_templates.insert(it, std::make_pair(name, std::string(err.what())));
// Insert the macro error message into the G-code.
return
- std::string("\n!!!!! Failed to process the custom G-code template ") + name + "\n" +
- err.what() +
+ std::string("\n!!!!! Failed to process the custom G-code template ") + name + "\n" +
+ err.what() +
"!!!!! End of an error report for the custom G-code template " + name + "\n\n";
}
}
-// Parse the custom G-code, try to find mcode_set_temp_dont_wait and mcode_set_temp_and_wait inside the custom G-code.
+// Parse the custom G-code, try to find mcode_set_temp_dont_wait and mcode_set_temp_and_wait or optionally G10 with temperature inside the custom G-code.
// Returns true if one of the temp commands are found, and try to parse the target temperature value into temp_out.
-static bool custom_gcode_sets_temperature(const std::string &gcode, const int mcode_set_temp_dont_wait, const int mcode_set_temp_and_wait, int &temp_out)
+static bool custom_gcode_sets_temperature(const std::string &gcode, const int mcode_set_temp_dont_wait, const int mcode_set_temp_and_wait, const bool include_g10, int &temp_out)
{
temp_out = -1;
if (gcode.empty())
@@ -1571,20 +1391,26 @@ static bool custom_gcode_sets_temperature(const std::string &gcode, const int mc
while (*ptr != 0) {
// Skip whitespaces.
for (; *ptr == ' ' || *ptr == '\t'; ++ ptr);
- if (*ptr == 'M') {
- // Line starts with 'M'. It is a machine command.
+ if (*ptr == 'M' || // Line starts with 'M'. It is a machine command.
+ (*ptr == 'G' && include_g10)) { // Only check for G10 if requested
+ bool is_gcode = *ptr == 'G';
++ ptr;
- // Parse the M code value.
+ // Parse the M or G code value.
char *endptr = nullptr;
- int mcode = int(strtol(ptr, &endptr, 10));
- if (endptr != nullptr && endptr != ptr && (mcode == mcode_set_temp_dont_wait || mcode == mcode_set_temp_and_wait)) {
- // M104/M109 or M140/M190 found.
- ptr = endptr;
- // Let the caller know that the custom G-code sets the temperature.
- temp_set_by_gcode = true;
+ int mgcode = int(strtol(ptr, &endptr, 10));
+ if (endptr != nullptr && endptr != ptr &&
+ is_gcode ?
+ // G10 found
+ mgcode == 10 :
+ // M104/M109 or M140/M190 found.
+ (mgcode == mcode_set_temp_dont_wait || mgcode == mcode_set_temp_and_wait)) {
+ ptr = endptr;
+ if (! is_gcode)
+ // Let the caller know that the custom M-code sets the temperature.
+ temp_set_by_gcode = true;
// Now try to parse the temperature value.
- // While not at the end of the line:
- while (strchr(";\r\n\0", *ptr) == nullptr) {
+ // While not at the end of the line:
+ while (strchr(";\r\n\0", *ptr) == nullptr) {
// Skip whitespaces.
for (; *ptr == ' ' || *ptr == '\t'; ++ ptr);
if (*ptr == 'S') {
@@ -1593,22 +1419,26 @@ static bool custom_gcode_sets_temperature(const std::string &gcode, const int mc
// Parse an int.
endptr = nullptr;
long temp_parsed = strtol(ptr, &endptr, 10);
- if (endptr > ptr) {
- ptr = endptr;
- temp_out = temp_parsed;
- }
+ if (endptr > ptr) {
+ ptr = endptr;
+ temp_out = temp_parsed;
+ // Let the caller know that the custom G-code sets the temperature
+ // Only do this after successfully parsing temperature since G10
+ // can be used for other reasons
+ temp_set_by_gcode = true;
+ }
} else {
// Skip this word.
- for (; strchr(" \t;\r\n\0", *ptr) == nullptr; ++ ptr);
+ for (; strchr(" \t;\r\n\0", *ptr) == nullptr; ++ ptr);
}
}
}
}
// Skip the rest of the line.
for (; *ptr != 0 && *ptr != '\r' && *ptr != '\n'; ++ ptr);
- // Skip the end of line indicators.
+ // Skip the end of line indicators.
for (; *ptr == '\r' || *ptr == '\n'; ++ ptr);
- }
+ }
return temp_set_by_gcode;
}
@@ -1616,7 +1446,7 @@ static bool custom_gcode_sets_temperature(const std::string &gcode, const int mc
// Do not process this piece of G-code by the time estimator, it already knows the values through another sources.
void GCode::print_machine_envelope(FILE *file, Print &print)
{
- if (print.config().gcode_flavor.value == gcfMarlin) {
+ if (print.config().gcode_flavor.value == gcfMarlin && print.config().machine_limits_usage.value == MachineLimitsUsage::EmitToGCode) {
fprintf(file, "M201 X%d Y%d Z%d E%d ; sets maximum accelerations, mm/sec^2\n",
int(print.config().machine_max_acceleration_x.values.front() + 0.5),
int(print.config().machine_max_acceleration_y.values.front() + 0.5),
@@ -1652,7 +1482,7 @@ void GCode::_print_first_layer_bed_temperature(FILE *file, Print &print, const s
int temp = print.config().first_layer_bed_temperature.get_at(first_printing_extruder_id);
// Is the bed temperature set by the provided custom G-code?
int temp_by_gcode = -1;
- bool temp_set_by_gcode = custom_gcode_sets_temperature(gcode, 140, 190, temp_by_gcode);
+ bool temp_set_by_gcode = custom_gcode_sets_temperature(gcode, 140, 190, false, temp_by_gcode);
if (temp_set_by_gcode && temp_by_gcode >= 0 && temp_by_gcode < 1000)
temp = temp_by_gcode;
// Always call m_writer.set_bed_temperature() so it will set the internal "current" state of the bed temp as if
@@ -1666,11 +1496,13 @@ void GCode::_print_first_layer_bed_temperature(FILE *file, Print &print, const s
// Only do that if the start G-code does not already contain any M-code controlling an extruder temperature.
// M104 - Set Extruder Temperature
// M109 - Set Extruder Temperature and Wait
+// RepRapFirmware: G10 Sxx
void GCode::_print_first_layer_extruder_temperatures(FILE *file, Print &print, const std::string &gcode, unsigned int first_printing_extruder_id, bool wait)
{
// Is the bed temperature set by the provided custom G-code?
- int temp_by_gcode = -1;
- if (custom_gcode_sets_temperature(gcode, 104, 109, temp_by_gcode)) {
+ int temp_by_gcode = -1;
+ bool include_g10 = print.config().gcode_flavor == gcfRepRapFirmware;
+ if (custom_gcode_sets_temperature(gcode, 104, 109, include_g10, temp_by_gcode)) {
// Set the extruder temperature at m_writer, but throw away the generated G-code as it will be written with the custom G-code.
int temp = print.config().first_layer_temperature.get_at(first_printing_extruder_id);
if (temp_by_gcode >= 0 && temp_by_gcode < 1000)
@@ -1697,9 +1529,9 @@ void GCode::_print_first_layer_extruder_temperatures(FILE *file, Print &print, c
}
inline GCode::ObjectByExtruder& object_by_extruder(
- std::map<unsigned int, std::vector<GCode::ObjectByExtruder>> &by_extruder,
- unsigned int extruder_id,
- size_t object_idx,
+ std::map<unsigned int, std::vector<GCode::ObjectByExtruder>> &by_extruder,
+ unsigned int extruder_id,
+ size_t object_idx,
size_t num_objects)
{
std::vector<GCode::ObjectByExtruder> &objects_by_extruder = by_extruder[extruder_id];
@@ -1709,9 +1541,9 @@ inline GCode::ObjectByExtruder& object_by_extruder(
}
inline std::vector<GCode::ObjectByExtruder::Island>& object_islands_by_extruder(
- std::map<unsigned int, std::vector<GCode::ObjectByExtruder>> &by_extruder,
- unsigned int extruder_id,
- size_t object_idx,
+ std::map<unsigned int, std::vector<GCode::ObjectByExtruder>> &by_extruder,
+ unsigned int extruder_id,
+ size_t object_idx,
size_t num_objects,
size_t num_islands)
{
@@ -1722,142 +1554,144 @@ inline std::vector<GCode::ObjectByExtruder::Island>& object_islands_by_extruder(
}
std::vector<GCode::InstanceToPrint> GCode::sort_print_object_instances(
- std::vector<GCode::ObjectByExtruder> &objects_by_extruder,
- const std::vector<LayerToPrint> &layers,
- // Ordering must be defined for normal (non-sequential print).
- const std::vector<const PrintInstance*> *ordering,
- // For sequential print, the instance of the object to be printing has to be defined.
- const size_t single_object_instance_idx)
+ std::vector<GCode::ObjectByExtruder> &objects_by_extruder,
+ const std::vector<LayerToPrint> &layers,
+ // Ordering must be defined for normal (non-sequential print).
+ const std::vector<const PrintInstance*> *ordering,
+ // For sequential print, the instance of the object to be printing has to be defined.
+ const size_t single_object_instance_idx)
{
std::vector<InstanceToPrint> out;
if (ordering == nullptr) {
- // Sequential print, single object is being printed.
- for (ObjectByExtruder &object_by_extruder : objects_by_extruder) {
- const size_t layer_id = &object_by_extruder - objects_by_extruder.data();
- const PrintObject *print_object = layers[layer_id].object();
- if (print_object)
- out.emplace_back(object_by_extruder, layer_id, *print_object, single_object_instance_idx);
- }
+ // Sequential print, single object is being printed.
+ for (ObjectByExtruder &object_by_extruder : objects_by_extruder) {
+ const size_t layer_id = &object_by_extruder - objects_by_extruder.data();
+ const PrintObject *print_object = layers[layer_id].object();
+ if (print_object)
+ out.emplace_back(object_by_extruder, layer_id, *print_object, single_object_instance_idx);
+ }
} else {
- // Create mapping from PrintObject* to ObjectByExtruder*.
- std::vector<std::pair<const PrintObject*, ObjectByExtruder*>> sorted;
- sorted.reserve(objects_by_extruder.size());
- for (ObjectByExtruder &object_by_extruder : objects_by_extruder) {
- const size_t layer_id = &object_by_extruder - objects_by_extruder.data();
- const PrintObject *print_object = layers[layer_id].object();
- if (print_object)
- sorted.emplace_back(print_object, &object_by_extruder);
- }
- std::sort(sorted.begin(), sorted.end());
-
- if (! sorted.empty()) {
- const Print &print = *sorted.front().first->print();
- out.reserve(sorted.size());
- for (const PrintInstance *instance : *ordering) {
- const PrintObject &print_object = *instance->print_object;
- std::pair<const PrintObject*, ObjectByExtruder*> key(&print_object, nullptr);
- auto it = std::lower_bound(sorted.begin(), sorted.end(), key);
- if (it != sorted.end() && it->first == &print_object)
- // ObjectByExtruder for this PrintObject was found.
- out.emplace_back(*it->second, it->second - objects_by_extruder.data(), print_object, instance - print_object.instances().data());
- }
- }
- }
- return out;
+ // Create mapping from PrintObject* to ObjectByExtruder*.
+ std::vector<std::pair<const PrintObject*, ObjectByExtruder*>> sorted;
+ sorted.reserve(objects_by_extruder.size());
+ for (ObjectByExtruder &object_by_extruder : objects_by_extruder) {
+ const size_t layer_id = &object_by_extruder - objects_by_extruder.data();
+ const PrintObject *print_object = layers[layer_id].object();
+ if (print_object)
+ sorted.emplace_back(print_object, &object_by_extruder);
+ }
+ std::sort(sorted.begin(), sorted.end());
+
+ if (! sorted.empty()) {
+ out.reserve(sorted.size());
+ for (const PrintInstance *instance : *ordering) {
+ const PrintObject &print_object = *instance->print_object;
+ std::pair<const PrintObject*, ObjectByExtruder*> key(&print_object, nullptr);
+ auto it = std::lower_bound(sorted.begin(), sorted.end(), key);
+ if (it != sorted.end() && it->first == &print_object)
+ // ObjectByExtruder for this PrintObject was found.
+ out.emplace_back(*it->second, it->second - objects_by_extruder.data(), print_object, instance - print_object.instances().data());
+ }
+ }
+ }
+ return out;
}
namespace ProcessLayer
{
static std::string emit_custom_gcode_per_print_z(
- const CustomGCode::Item *custom_gcode,
+ const CustomGCode::Item *custom_gcode,
// ID of the first extruder printing this layer.
unsigned int first_extruder_id,
- bool single_extruder_printer)
- {
+ const PrintConfig &config)
+ {
std::string gcode;
-
+ bool single_extruder_printer = config.nozzle_diameter.size() == 1;
+
if (custom_gcode != nullptr) {
- // Extruder switches are processed by LayerTools, they should be filtered out.
- assert(custom_gcode->gcode != ToolChangeCode);
-
- const std::string &custom_code = custom_gcode->gcode;
- bool color_change = custom_code == ColorChangeCode;
- bool tool_change = custom_code == ToolChangeCode;
- // Tool Change is applied as Color Change for a single extruder printer only.
- assert(! tool_change || single_extruder_printer);
-
- std::string pause_print_msg;
- int m600_extruder_before_layer = -1;
- if (color_change && custom_gcode->extruder > 0)
- m600_extruder_before_layer = custom_gcode->extruder - 1;
- else if (custom_code == PausePrintCode)
- pause_print_msg = custom_gcode->color;
-
- // we should add or not colorprint_change in respect to nozzle_diameter count instead of really used extruders count
- if (color_change || tool_change)
- {
+ // Extruder switches are processed by LayerTools, they should be filtered out.
+ assert(custom_gcode->type != CustomGCode::ToolChange);
+
+ CustomGCode::Type gcode_type = custom_gcode->type;
+ bool color_change = gcode_type == CustomGCode::ColorChange;
+ bool tool_change = gcode_type == CustomGCode::ToolChange;
+ // Tool Change is applied as Color Change for a single extruder printer only.
+ assert(! tool_change || single_extruder_printer);
+
+ std::string pause_print_msg;
+ int m600_extruder_before_layer = -1;
+ if (color_change && custom_gcode->extruder > 0)
+ m600_extruder_before_layer = custom_gcode->extruder - 1;
+ else if (gcode_type == CustomGCode::PausePrint)
+ pause_print_msg = custom_gcode->extra;
+
+ // we should add or not colorprint_change in respect to nozzle_diameter count instead of really used extruders count
+ if (color_change || tool_change)
+ {
+ assert(m600_extruder_before_layer >= 0);
// Color Change or Tool Change as Color Change.
- // add tag for analyzer
- gcode += "; " + GCodeAnalyzer::Color_Change_Tag + ",T" + std::to_string(m600_extruder_before_layer) + "\n";
- // add tag for time estimator
- gcode += "; " + GCodeTimeEstimator::Color_Change_Tag + "\n";
-
- if (!single_extruder_printer && m600_extruder_before_layer >= 0 && first_extruder_id != m600_extruder_before_layer
- // && !MMU1
- ) {
- //! FIXME_in_fw show message during print pause
- gcode += "M601\n"; // pause print
- gcode += "M117 Change filament for Extruder " + std::to_string(m600_extruder_before_layer) + "\n";
- }
+ // add tag for processor
+ gcode += ";" + GCodeProcessor::Color_Change_Tag + ",T" + std::to_string(m600_extruder_before_layer) + "\n";
+
+ if (!single_extruder_printer && m600_extruder_before_layer >= 0 && first_extruder_id != (unsigned)m600_extruder_before_layer
+ // && !MMU1
+ ) {
+ //! FIXME_in_fw show message during print pause
+ gcode += config.pause_print_gcode;// pause print
+ gcode += "\n";
+ gcode += "M117 Change filament for Extruder " + std::to_string(m600_extruder_before_layer) + "\n";
+ }
else {
- gcode += ColorChangeCode;
+ gcode += config.color_change_gcode;//ColorChangeCode;
gcode += "\n";
}
}
else
{
- if (custom_code == PausePrintCode) // Pause print
+ if (gcode_type == CustomGCode::PausePrint) // Pause print
{
- // add tag for analyzer
- gcode += "; " + GCodeAnalyzer::Pause_Print_Tag + "\n";
- //! FIXME_in_fw show message during print pause
+ // add tag for processor
+ gcode += ";" + GCodeProcessor::Pause_Print_Tag + "\n";
+ //! FIXME_in_fw show message during print pause
if (!pause_print_msg.empty())
gcode += "M117 " + pause_print_msg + "\n";
- // add tag for time estimator
- gcode += "; " + GCodeTimeEstimator::Pause_Print_Tag + "\n";
- }
- else // custom Gcode
+ gcode += config.pause_print_gcode;
+ }
+ else
{
- // add tag for analyzer
- gcode += "; " + GCodeAnalyzer::Custom_Code_Tag + "\n";
- // add tag for time estimator
- //gcode += "; " + GCodeTimeEstimator::Custom_Code_Tag + "\n";
- }
- gcode += custom_code + "\n";
- }
- }
+ // add tag for processor
+ gcode += ";" + GCodeProcessor::Custom_Code_Tag + "\n";
+ if (gcode_type == CustomGCode::Template) // Template Cistom Gcode
+ gcode += config.template_custom_gcode;
+ else // custom Gcode
+ gcode += custom_gcode->extra;
- return gcode;
- }
+ }
+ gcode += "\n";
+ }
+ }
+
+ return gcode;
+ }
} // namespace ProcessLayer
namespace Skirt {
- static void skirt_loops_per_extruder_all_printing(const Print &print, const LayerTools &layer_tools, std::map<unsigned int, std::pair<size_t, size_t>> &skirt_loops_per_extruder_out)
- {
+ static void skirt_loops_per_extruder_all_printing(const Print &print, const LayerTools &layer_tools, std::map<unsigned int, std::pair<size_t, size_t>> &skirt_loops_per_extruder_out)
+ {
// Prime all extruders printing over the 1st layer over the skirt lines.
size_t n_loops = print.skirt().entities.size();
size_t n_tools = layer_tools.extruders.size();
size_t lines_per_extruder = (n_loops + n_tools - 1) / n_tools;
for (size_t i = 0; i < n_loops; i += lines_per_extruder)
skirt_loops_per_extruder_out[layer_tools.extruders[i / lines_per_extruder]] = std::pair<size_t, size_t>(i, std::min(i + lines_per_extruder, n_loops));
- }
+ }
static std::map<unsigned int, std::pair<size_t, size_t>> make_skirt_loops_per_extruder_1st_layer(
const Print &print,
- const std::vector<GCode::LayerToPrint> & /*layers */,
- const LayerTools &layer_tools,
+ const std::vector<GCode::LayerToPrint> & /*layers */,
+ const LayerTools &layer_tools,
// Heights (print_z) at which the skirt has already been extruded.
std::vector<coordf_t> &skirt_done)
{
@@ -1865,7 +1699,7 @@ namespace Skirt {
// not at the print_z of the interlaced support material layers.
std::map<unsigned int, std::pair<size_t, size_t>> skirt_loops_per_extruder_out;
if (skirt_done.empty() && print.has_skirt() && ! print.skirt().entities.empty()) {
- skirt_loops_per_extruder_all_printing(print, layer_tools, skirt_loops_per_extruder_out);
+ skirt_loops_per_extruder_all_printing(print, layer_tools, skirt_loops_per_extruder_out);
skirt_done.emplace_back(layer_tools.print_z);
}
return skirt_loops_per_extruder_out;
@@ -1873,11 +1707,11 @@ namespace Skirt {
static std::map<unsigned int, std::pair<size_t, size_t>> make_skirt_loops_per_extruder_other_layers(
const Print &print,
- const std::vector<GCode::LayerToPrint> &layers,
- const LayerTools &layer_tools,
- // First non-empty support layer.
- const SupportLayer *support_layer,
- // Heights (print_z) at which the skirt has already been extruded.
+ const std::vector<GCode::LayerToPrint> &layers,
+ const LayerTools &layer_tools,
+ // First non-empty support layer.
+ const SupportLayer *support_layer,
+ // Heights (print_z) at which the skirt has already been extruded.
std::vector<coordf_t> &skirt_done)
{
// Extrude skirt at the print_z of the raft layers and normal object layers
@@ -1888,14 +1722,16 @@ namespace Skirt {
//FIXME infinite or high skirt does not make sense for sequential print!
(skirt_done.size() < (size_t)print.config().skirt_height.value || print.has_infinite_skirt()) &&
// This print_z has not been extruded yet (sequential print)
- skirt_done.back() < layer_tools.print_z - EPSILON &&
+ // FIXME: The skirt_done should not be empty at this point. The check is a workaround
+ // of https://github.com/prusa3d/PrusaSlicer/issues/5652, but it deserves a real fix.
+ (! skirt_done.empty() && skirt_done.back() < layer_tools.print_z - EPSILON) &&
// and this layer is an object layer, or it is a raft layer.
(layer_tools.has_object || support_layer->id() < (size_t)support_layer->object()->config().raft_layers.value)) {
#if 0
// Prime just the first printing extruder. This is original Slic3r's implementation.
skirt_loops_per_extruder_out[layer_tools.extruders.front()] = std::pair<size_t, size_t>(0, print.config().skirts.value);
#else
- // Prime all extruders planned for this layer, see
+ // Prime all extruders planned for this layer, see
// https://github.com/prusa3d/PrusaSlicer/issues/469#issuecomment-322450619
skirt_loops_per_extruder_all_printing(print, layer_tools, skirt_loops_per_extruder_out);
#endif
@@ -1907,7 +1743,7 @@ namespace Skirt {
} // namespace Skirt
-// In sequential mode, process_layer is called once per each object and its copy,
+// In sequential mode, process_layer is called once per each object and its copy,
// therefore layers will contain a single entry and single_object_instance_idx will point to the copy of the object.
// In non-sequential mode, process_layer is called per each print_z height with all object and support layers accumulated.
// For multi-material prints, this routine minimizes extruder switches by gathering extruder specific extrusion paths
@@ -1919,14 +1755,13 @@ void GCode::process_layer(
// Set of object & print layers of the same PrintObject and with the same print_z.
const std::vector<LayerToPrint> &layers,
const LayerTools &layer_tools,
- // Pairs of PrintObject index and its instance index.
- const std::vector<const PrintInstance*> *ordering,
+ // Pairs of PrintObject index and its instance index.
+ const std::vector<const PrintInstance*> *ordering,
// If set to size_t(-1), then print all copies of all objects.
// Otherwise print a single copy of a single object.
const size_t single_object_instance_idx)
{
assert(! layers.empty());
-// assert(! layer_tools.extruders.empty());
// Either printing all copies of all objects, or just a single copy of a single object.
assert(single_object_instance_idx == size_t(-1) || layers.size() == 1);
@@ -1953,6 +1788,7 @@ void GCode::process_layer(
// Check whether it is possible to apply the spiral vase logic for this layer.
// Just a reminder: A spiral vase mode is allowed for a single object, single material print only.
+ m_enable_loop_clipping = true;
if (m_spiral_vase && layers.size() == 1 && support_layer == nullptr) {
bool enable = (layer.id() > 0 || print.config().brim_width.value == 0.) && (layer.id() >= (size_t)print.config().skirt_height.value && ! print.has_infinite_skirt());
if (enable) {
@@ -1964,24 +1800,40 @@ void GCode::process_layer(
break;
}
}
- m_spiral_vase->enable = enable;
+ m_spiral_vase->enable(enable);
+ // If we're going to apply spiralvase to this layer, disable loop clipping.
+ m_enable_loop_clipping = !enable;
}
- // If we're going to apply spiralvase to this layer, disable loop clipping
- m_enable_loop_clipping = ! m_spiral_vase || ! m_spiral_vase->enable;
-
+
std::string gcode;
+ // add tag for processor
+ gcode += ";" + GCodeProcessor::Layer_Change_Tag + "\n";
+ // export layer z
+ char buf[64];
+ sprintf(buf, ";Z:%g\n", print_z);
+ gcode += buf;
+ // export layer height
+ float height = first_layer ? static_cast<float>(print_z) : static_cast<float>(print_z) - m_last_layer_z;
+ sprintf(buf, ";%s%g\n", GCodeProcessor::Height_Tag.c_str(), height);
+ gcode += buf;
+ // update caches
+ m_last_layer_z = static_cast<float>(print_z);
+ m_max_layer_z = std::max(m_max_layer_z, m_last_layer_z);
+ m_last_height = height;
+
// Set new layer - this will change Z and force a retraction if retract_layer_change is enabled.
if (! print.config().before_layer_gcode.value.empty()) {
DynamicConfig config;
- config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index + 1));
- config.set_key_value("layer_z", new ConfigOptionFloat(print_z));
+ config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index + 1));
+ config.set_key_value("layer_z", new ConfigOptionFloat(print_z));
+ config.set_key_value("max_layer_z", new ConfigOptionFloat(m_max_layer_z));
gcode += this->placeholder_parser_process("before_layer_gcode",
print.config().before_layer_gcode.value, m_writer.extruder()->id(), &config)
+ "\n";
}
gcode += this->change_layer(print_z); // this will increase m_layer_index
- m_layer = &layer;
+ m_layer = &layer;
if (! print.config().layer_gcode.value.empty()) {
DynamicConfig config;
config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index));
@@ -1989,6 +1841,7 @@ void GCode::process_layer(
gcode += this->placeholder_parser_process("layer_gcode",
print.config().layer_gcode.value, m_writer.extruder()->id(), &config)
+ "\n";
+ config.set_key_value("max_layer_z", new ConfigOptionFloat(m_max_layer_z));
}
if (! first_layer && ! m_second_layer_things_done) {
@@ -2012,7 +1865,7 @@ void GCode::process_layer(
if (single_object_instance_idx == size_t(-1)) {
// Normal (non-sequential) print.
- gcode += ProcessLayer::emit_custom_gcode_per_print_z(layer_tools.custom_gcode, first_extruder_id, print.config().nozzle_diameter.size() == 1);
+ gcode += ProcessLayer::emit_custom_gcode_per_print_z(layer_tools.custom_gcode, first_extruder_id, print.config());
}
// Extrude skirt at the print_z of the raft layers and normal object layers
// not at the print_z of the interlaced support material layers.
@@ -2073,8 +1926,8 @@ void GCode::process_layer(
}
if (layer_to_print.object_layer != nullptr) {
const Layer &layer = *layer_to_print.object_layer;
- // We now define a strategy for building perimeters and fills. The separation
- // between regions doesn't matter in terms of printing order, as we follow
+ // We now define a strategy for building perimeters and fills. The separation
+ // between regions doesn't matter in terms of printing order, as we follow
// another logic instead:
// - we group all extrusions by extruder so that we minimize toolchanges
// - we start from the last used extruder
@@ -2089,13 +1942,13 @@ void GCode::process_layer(
std::vector<size_t> slices_test_order;
slices_test_order.reserve(n_slices);
for (size_t i = 0; i < n_slices; ++ i)
- slices_test_order.emplace_back(i);
+ slices_test_order.emplace_back(i);
std::sort(slices_test_order.begin(), slices_test_order.end(), [&layer_surface_bboxes](size_t i, size_t j) {
- const Vec2d s1 = layer_surface_bboxes[i].size().cast<double>();
- const Vec2d s2 = layer_surface_bboxes[j].size().cast<double>();
- return s1.x() * s1.y() < s2.x() * s2.y();
+ const Vec2d s1 = layer_surface_bboxes[i].size().cast<double>();
+ const Vec2d s2 = layer_surface_bboxes[j].size().cast<double>();
+ return s1.x() * s1.y() < s2.x() * s2.y();
});
- auto point_inside_surface = [&layer, &layer_surface_bboxes](const size_t i, const Point &point) {
+ auto point_inside_surface = [&layer, &layer_surface_bboxes](const size_t i, const Point &point) {
const BoundingBox &bbox = layer_surface_bboxes[i];
return point(0) >= bbox.min(0) && point(0) < bbox.max(0) &&
point(1) >= bbox.min(1) && point(1) < bbox.max(1) &&
@@ -2126,27 +1979,27 @@ void GCode::process_layer(
// Let's recover vector of extruder overrides:
const WipingExtrusions::ExtruderPerCopy *entity_overrides = nullptr;
if (! layer_tools.has_extruder(correct_extruder_id)) {
- // this entity is not overridden, but its extruder is not in layer_tools - we'll print it
+ // this entity is not overridden, but its extruder is not in layer_tools - we'll print it
// by last extruder on this layer (could happen e.g. when a wiping object is taller than others - dontcare extruders are eradicated from layer_tools)
correct_extruder_id = layer_tools.extruders.back();
}
printing_extruders.clear();
if (is_anything_overridden) {
- entity_overrides = const_cast<LayerTools&>(layer_tools).wiping_extrusions().get_extruder_overrides(extrusions, correct_extruder_id, layer_to_print.object()->instances().size());
- if (entity_overrides == nullptr) {
- printing_extruders.emplace_back(correct_extruder_id);
- } else {
- printing_extruders.reserve(entity_overrides->size());
- for (int extruder : *entity_overrides)
- printing_extruders.emplace_back(extruder >= 0 ?
- // at least one copy is overridden to use this extruder
- extruder :
- // at least one copy would normally be printed with this extruder (see get_extruder_overrides function for explanation)
- static_cast<unsigned int>(- extruder - 1));
- Slic3r::sort_remove_duplicates(printing_extruders);
- }
- } else
- printing_extruders.emplace_back(correct_extruder_id);
+ entity_overrides = const_cast<LayerTools&>(layer_tools).wiping_extrusions().get_extruder_overrides(extrusions, correct_extruder_id, layer_to_print.object()->instances().size());
+ if (entity_overrides == nullptr) {
+ printing_extruders.emplace_back(correct_extruder_id);
+ } else {
+ printing_extruders.reserve(entity_overrides->size());
+ for (int extruder : *entity_overrides)
+ printing_extruders.emplace_back(extruder >= 0 ?
+ // at least one copy is overridden to use this extruder
+ extruder :
+ // at least one copy would normally be printed with this extruder (see get_extruder_overrides function for explanation)
+ static_cast<unsigned int>(- extruder - 1));
+ Slic3r::sort_remove_duplicates(printing_extruders);
+ }
+ } else
+ printing_extruders.emplace_back(correct_extruder_id);
// Now we must add this extrusion into the by_extruder map, once for each extruder that will print it:
for (unsigned int extruder : printing_extruders)
@@ -2157,10 +2010,10 @@ void GCode::process_layer(
&layer_to_print - layers.data(),
layers.size(), n_slices+1);
for (size_t i = 0; i <= n_slices; ++ i) {
- bool last = i == n_slices;
- size_t island_idx = last ? n_slices : slices_test_order[i];
+ bool last = i == n_slices;
+ size_t island_idx = last ? n_slices : slices_test_order[i];
if (// extrusions->first_point does not fit inside any slice
- last ||
+ last ||
// extrusions->first_point fits inside ith slice
point_inside_surface(island_idx, extrusions->first_point())) {
if (islands[island_idx].by_region.empty())
@@ -2185,13 +2038,13 @@ void GCode::process_layer(
this->set_extruder(extruder_id, print_z);
// let analyzer tag generator aware of a role type change
- if (m_enable_analyzer && layer_tools.has_wipe_tower && m_wipe_tower)
- m_last_analyzer_extrusion_role = erWipeTower;
+ if (layer_tools.has_wipe_tower && m_wipe_tower)
+ m_last_processor_extrusion_role = erWipeTower;
if (auto loops_it = skirt_loops_per_extruder.find(extruder_id); loops_it != skirt_loops_per_extruder.end()) {
const std::pair<size_t, size_t> loops = loops_it->second;
this->set_origin(0., 0.);
- m_avoid_crossing_perimeters.use_external_mp = true;
+ m_avoid_crossing_perimeters.use_external_mp();
Flow layer_skirt_flow(print.skirt_flow());
layer_skirt_flow.height = float(m_skirt_done.back() - (m_skirt_done.size() == 1 ? 0. : m_skirt_done[m_skirt_done.size() - 2]));
double mm3_per_mm = layer_skirt_flow.mm3_per_mm();
@@ -2205,23 +2058,23 @@ void GCode::process_layer(
//FIXME using the support_material_speed of the 1st object printed.
gcode += this->extrude_loop(loop, "skirt", m_config.support_material_speed.value);
}
- m_avoid_crossing_perimeters.use_external_mp = false;
+ m_avoid_crossing_perimeters.use_external_mp(false);
// Allow a straight travel move to the first object point if this is the first layer (but don't in next layers).
if (first_layer && loops.first == 0)
- m_avoid_crossing_perimeters.disable_once = true;
+ m_avoid_crossing_perimeters.disable_once();
}
// Extrude brim with the extruder of the 1st region.
if (! m_brim_done) {
this->set_origin(0., 0.);
- m_avoid_crossing_perimeters.use_external_mp = true;
+ m_avoid_crossing_perimeters.use_external_mp();
for (const ExtrusionEntity *ee : print.brim().entities) {
gcode += this->extrude_entity(*ee, "brim", m_config.support_material_speed.value);
}
m_brim_done = true;
- m_avoid_crossing_perimeters.use_external_mp = false;
+ m_avoid_crossing_perimeters.use_external_mp(false);
// Allow a straight travel move to the first object point.
- m_avoid_crossing_perimeters.disable_once = true;
+ m_avoid_crossing_perimeters.disable_once();
}
@@ -2229,10 +2082,10 @@ void GCode::process_layer(
if (objects_by_extruder_it == by_extruder.end())
continue;
- std::vector<InstanceToPrint> instances_to_print = sort_print_object_instances(objects_by_extruder_it->second, layers, ordering, single_object_instance_idx);
+ std::vector<InstanceToPrint> instances_to_print = sort_print_object_instances(objects_by_extruder_it->second, layers, ordering, single_object_instance_idx);
// We are almost ready to print. However, we must go through all the objects twice to print the the overridden extrusions first (infill/perimeter wiping feature):
- std::vector<ObjectByExtruder::Island::Region> by_region_per_copy_cache;
+ std::vector<ObjectByExtruder::Island::Region> by_region_per_copy_cache;
for (int print_wipe_extrusions = is_anything_overridden; print_wipe_extrusions>=0; --print_wipe_extrusions) {
if (is_anything_overridden && print_wipe_extrusions == 0)
gcode+="; PURGING FINISHED\n";
@@ -2241,15 +2094,14 @@ void GCode::process_layer(
m_config.apply(instance_to_print.print_object.config(), true);
m_layer = layers[instance_to_print.layer_id].layer();
if (m_config.avoid_crossing_perimeters)
- m_avoid_crossing_perimeters.init_layer_mp(union_ex(m_layer->lslices, true));
-
+ m_avoid_crossing_perimeters.init_layer(*m_layer);
if (this->config().gcode_label_objects)
gcode += std::string("; printing object ") + instance_to_print.print_object.model_object()->name + " id:" + std::to_string(instance_to_print.layer_id) + " copy " + std::to_string(instance_to_print.instance_id) + "\n";
// When starting a new object, use the external motion planner for the first travel move.
const Point &offset = instance_to_print.print_object.instances()[instance_to_print.instance_id].shift;
std::pair<const PrintObject*, Point> this_object_copy(&instance_to_print.print_object, offset);
if (m_last_obj_copy != this_object_copy)
- m_avoid_crossing_perimeters.use_external_mp_once = true;
+ m_avoid_crossing_perimeters.use_external_mp_once();
m_last_obj_copy = this_object_copy;
this->set_origin(unscale(offset));
if (instance_to_print.object_by_extruder.support != nullptr && !print_wipe_extrusions) {
@@ -2259,25 +2111,29 @@ void GCode::process_layer(
instance_to_print.object_by_extruder.support->chained_path_from(m_last_pos, instance_to_print.object_by_extruder.support_extrusion_role));
m_layer = layers[instance_to_print.layer_id].layer();
}
+ //FIXME order islands?
+ // Sequential tool path ordering of multiple parts within the same object, aka. perimeter tracking (#5511)
for (ObjectByExtruder::Island &island : instance_to_print.object_by_extruder.islands) {
const auto& by_region_specific = is_anything_overridden ? island.by_region_per_copy(by_region_per_copy_cache, static_cast<unsigned int>(instance_to_print.instance_id), extruder_id, print_wipe_extrusions != 0) : island.by_region;
- //FIXME the following code prints regions in the order they are defined, the path is not optimized in any way.
+ //FIXME the following code prints regions in the order they are defined, the path is not optimized in any way.
if (print.config().infill_first) {
- gcode += this->extrude_infill(print, by_region_specific);
+ gcode += this->extrude_infill(print, by_region_specific, false);
gcode += this->extrude_perimeters(print, by_region_specific, lower_layer_edge_grids[instance_to_print.layer_id]);
} else {
gcode += this->extrude_perimeters(print, by_region_specific, lower_layer_edge_grids[instance_to_print.layer_id]);
- gcode += this->extrude_infill(print,by_region_specific);
+ gcode += this->extrude_infill(print,by_region_specific, false);
}
+ // ironing
+ gcode += this->extrude_infill(print,by_region_specific, true);
}
if (this->config().gcode_label_objects)
- gcode += std::string("; stop printing object ") + instance_to_print.print_object.model_object()->name + " id:" + std::to_string(instance_to_print.layer_id) + " copy " + std::to_string(instance_to_print.instance_id) + "\n";
+ gcode += std::string("; stop printing object ") + instance_to_print.print_object.model_object()->name + " id:" + std::to_string(instance_to_print.layer_id) + " copy " + std::to_string(instance_to_print.instance_id) + "\n";
}
}
}
// Apply spiral vase post-processing if this layer contains suitable geometry
- // (we must feed all the G-code into the post-processor, including the first
+ // (we must feed all the G-code into the post-processor, including the first
// bottom non-spiral layers otherwise it will mess with positions)
// we apply spiral vase at this stage because it requires a full layer.
// Just a reminder: A spiral vase mode is allowed for a single object per layer, single material print only.
@@ -2288,12 +2144,6 @@ void GCode::process_layer(
if (m_cooling_buffer)
gcode = m_cooling_buffer->process_layer(gcode, layer.id());
- // add tag for analyzer
- if (gcode.find(GCodeAnalyzer::Pause_Print_Tag) != gcode.npos)
- gcode += "\n; " + GCodeAnalyzer::End_Pause_Print_Or_Custom_Code_Tag + "\n";
- else if (gcode.find(GCodeAnalyzer::Custom_Code_Tag) != gcode.npos)
- gcode += "\n; " + GCodeAnalyzer::End_Pause_Print_Or_Custom_Code_Tag + "\n";
-
#ifdef HAS_PRESSURE_EQUALIZER
// Apply pressure equalization if enabled;
// printf("G-code before filter:\n%s\n", gcode.c_str());
@@ -2301,13 +2151,9 @@ void GCode::process_layer(
gcode = m_pressure_equalizer->process(gcode.c_str(), false);
// printf("G-code after filter:\n%s\n", out.c_str());
#endif /* HAS_PRESSURE_EQUALIZER */
-
+
_write(file, gcode);
- BOOST_LOG_TRIVIAL(trace) << "Exported layer " << layer.id() << " print_z " << print_z <<
- ", time estimator memory: " <<
- format_memsize_MB(m_normal_time_estimator.memory_used() + (m_silent_time_estimator_enabled ? m_silent_time_estimator.memory_used() : 0)) <<
- ", analyzer memory: " <<
- format_memsize_MB(m_analyzer.memory_used()) <<
+ BOOST_LOG_TRIVIAL(trace) << "Exported layer " << layer.id() << " print_z " << print_z <<
log_memory_info();
}
@@ -2319,19 +2165,20 @@ void GCode::apply_print_config(const PrintConfig &print_config)
void GCode::append_full_config(const Print &print, std::string &str)
{
- const DynamicPrintConfig &cfg = print.full_print_config();
+ const DynamicPrintConfig &cfg = print.full_print_config();
// Sorted list of config keys, which shall not be stored into the G-code. Initializer list.
- static constexpr auto banned_keys = {
- "compatible_printers"sv,
- "compatible_prints"sv,
- "print_host"sv,
- "printhost_apikey"sv,
- "printhost_cafile"sv
- };
+ 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
+ };
assert(std::is_sorted(banned_keys.begin(), banned_keys.end()));
- auto is_banned = [](const std::string &key) {
- return std::binary_search(banned_keys.begin(), banned_keys.end(), key);
- };
+ auto is_banned = [](const std::string &key) {
+ return std::binary_search(banned_keys.begin(), banned_keys.end(), key);
+ };
for (const std::string &key : cfg.keys())
if (! is_banned(key) && ! cfg.option(key)->is_nil())
str += "; " + key + " = " + cfg.opt_serialize(key) + "\n";
@@ -2340,7 +2187,7 @@ void GCode::append_full_config(const Print &print, std::string &str)
void GCode::set_extruders(const std::vector<unsigned int> &extruder_ids)
{
m_writer.set_extruders(extruder_ids);
-
+
// enable wipe path generation if any extruder has wipe enabled
m_wipe.enable = false;
for (auto id : extruder_ids)
@@ -2351,7 +2198,7 @@ void GCode::set_extruders(const std::vector<unsigned int> &extruder_ids)
}
void GCode::set_origin(const Vec2d &pointf)
-{
+{
// if origin increases (goes towards right), last_pos decreases because it goes towards left
const Point translate(
scale_(m_origin(0) - pointf(0)),
@@ -2365,13 +2212,13 @@ void GCode::set_origin(const Vec2d &pointf)
std::string GCode::preamble()
{
std::string gcode = m_writer.preamble();
-
+
/* Perform a *silent* move to z_offset: we need this to initialize the Z
position of our writer object so that any initial lift taking place
before the first layer change will raise the extruder from the correct
initial Z instead of 0. */
m_writer.travel_to_z(m_config.z_offset.value);
-
+
return gcode;
}
@@ -2391,178 +2238,14 @@ std::string GCode::change_layer(coordf_t print_z)
comment << "move to next layer (" << m_layer_index << ")";
gcode += m_writer.travel_to_z(z, comment.str());
}
-
+
// forget last wiping path as wiping after raising Z is pointless
m_wipe.reset_path();
-
- return gcode;
-}
-
-// Return a value in <0, 1> of a cubic B-spline kernel centered around zero.
-// The B-spline is re-scaled so it has value 1 at zero.
-static inline float bspline_kernel(float x)
-{
- x = std::abs(x);
- if (x < 1.f) {
- return 1.f - (3.f / 2.f) * x * x + (3.f / 4.f) * x * x * x;
- }
- else if (x < 2.f) {
- x -= 1.f;
- float x2 = x * x;
- float x3 = x2 * x;
- return (1.f / 4.f) - (3.f / 4.f) * x + (3.f / 4.f) * x2 - (1.f / 4.f) * x3;
- }
- else
- return 0;
-}
-
-static float extrudate_overlap_penalty(float nozzle_r, float weight_zero, float overlap_distance)
-{
- // The extrudate is not fully supported by the lower layer. Fit a polynomial penalty curve.
- // Solved by sympy package:
-/*
-from sympy import *
-(x,a,b,c,d,r,z)=symbols('x a b c d r z')
-p = a + b*x + c*x*x + d*x*x*x
-p2 = p.subs(solve([p.subs(x, -r), p.diff(x).subs(x, -r), p.diff(x,x).subs(x, -r), p.subs(x, 0)-z], [a, b, c, d]))
-from sympy.plotting import plot
-plot(p2.subs(r,0.2).subs(z,1.), (x, -1, 3), adaptive=False, nb_of_points=400)
-*/
- if (overlap_distance < - nozzle_r) {
- // The extrudate is fully supported by the lower layer. This is the ideal case, therefore zero penalty.
- return 0.f;
- } else {
- float x = overlap_distance / nozzle_r;
- float x2 = x * x;
- float x3 = x2 * x;
- return weight_zero * (1.f + 3.f * x + 3.f * x2 + x3);
- }
-}
-
-static Points::iterator project_point_to_polygon_and_insert(Polygon &polygon, const Point &pt, double eps)
-{
- assert(polygon.points.size() >= 2);
- if (polygon.points.size() <= 1)
- if (polygon.points.size() == 1)
- return polygon.points.begin();
-
- Point pt_min;
- double d_min = std::numeric_limits<double>::max();
- size_t i_min = size_t(-1);
- for (size_t i = 0; i < polygon.points.size(); ++ i) {
- size_t j = i + 1;
- if (j == polygon.points.size())
- j = 0;
- const Point &p1 = polygon.points[i];
- const Point &p2 = polygon.points[j];
- const Slic3r::Point v_seg = p2 - p1;
- const Slic3r::Point v_pt = pt - p1;
- const int64_t l2_seg = int64_t(v_seg(0)) * int64_t(v_seg(0)) + int64_t(v_seg(1)) * int64_t(v_seg(1));
- int64_t t_pt = int64_t(v_seg(0)) * int64_t(v_pt(0)) + int64_t(v_seg(1)) * int64_t(v_pt(1));
- if (t_pt < 0) {
- // Closest to p1.
- double dabs = sqrt(int64_t(v_pt(0)) * int64_t(v_pt(0)) + int64_t(v_pt(1)) * int64_t(v_pt(1)));
- if (dabs < d_min) {
- d_min = dabs;
- i_min = i;
- pt_min = p1;
- }
- }
- else if (t_pt > l2_seg) {
- // Closest to p2. Then p2 is the starting point of another segment, which shall be discovered in the next step.
- continue;
- } else {
- // Closest to the segment.
- assert(t_pt >= 0 && t_pt <= l2_seg);
- int64_t d_seg = int64_t(v_seg(1)) * int64_t(v_pt(0)) - int64_t(v_seg(0)) * int64_t(v_pt(1));
- double d = double(d_seg) / sqrt(double(l2_seg));
- double dabs = std::abs(d);
- if (dabs < d_min) {
- d_min = dabs;
- i_min = i;
- // Evaluate the foot point.
- pt_min = p1;
- double linv = double(d_seg) / double(l2_seg);
- pt_min(0) = pt(0) - coord_t(floor(double(v_seg(1)) * linv + 0.5));
- pt_min(1) = pt(1) + coord_t(floor(double(v_seg(0)) * linv + 0.5));
- assert(Line(p1, p2).distance_to(pt_min) < scale_(1e-5));
- }
- }
- }
-
- assert(i_min != size_t(-1));
- if ((pt_min - polygon.points[i_min]).cast<double>().norm() > eps) {
- // Insert a new point on the segment i_min, i_min+1.
- return polygon.points.insert(polygon.points.begin() + (i_min + 1), pt_min);
- }
- return polygon.points.begin() + i_min;
+ return gcode;
}
-std::vector<float> polygon_parameter_by_length(const Polygon &polygon)
-{
- // Parametrize the polygon by its length.
- std::vector<float> lengths(polygon.points.size()+1, 0.);
- for (size_t i = 1; i < polygon.points.size(); ++ i)
- lengths[i] = lengths[i-1] + (polygon.points[i] - polygon.points[i-1]).cast<float>().norm();
- lengths.back() = lengths[lengths.size()-2] + (polygon.points.front() - polygon.points.back()).cast<float>().norm();
- return lengths;
-}
-std::vector<float> polygon_angles_at_vertices(const Polygon &polygon, const std::vector<float> &lengths, float min_arm_length)
-{
- assert(polygon.points.size() + 1 == lengths.size());
- if (min_arm_length > 0.25f * lengths.back())
- min_arm_length = 0.25f * lengths.back();
-
- // Find the initial prev / next point span.
- size_t idx_prev = polygon.points.size();
- size_t idx_curr = 0;
- size_t idx_next = 1;
- while (idx_prev > idx_curr && lengths.back() - lengths[idx_prev] < min_arm_length)
- -- idx_prev;
- while (idx_next < idx_prev && lengths[idx_next] < min_arm_length)
- ++ idx_next;
-
- std::vector<float> angles(polygon.points.size(), 0.f);
- for (; idx_curr < polygon.points.size(); ++ idx_curr) {
- // Move idx_prev up until the distance between idx_prev and idx_curr is lower than min_arm_length.
- if (idx_prev >= idx_curr) {
- while (idx_prev < polygon.points.size() && lengths.back() - lengths[idx_prev] + lengths[idx_curr] > min_arm_length)
- ++ idx_prev;
- if (idx_prev == polygon.points.size())
- idx_prev = 0;
- }
- while (idx_prev < idx_curr && lengths[idx_curr] - lengths[idx_prev] > min_arm_length)
- ++ idx_prev;
- // Move idx_prev one step back.
- if (idx_prev == 0)
- idx_prev = polygon.points.size() - 1;
- else
- -- idx_prev;
- // Move idx_next up until the distance between idx_curr and idx_next is greater than min_arm_length.
- if (idx_curr <= idx_next) {
- while (idx_next < polygon.points.size() && lengths[idx_next] - lengths[idx_curr] < min_arm_length)
- ++ idx_next;
- if (idx_next == polygon.points.size())
- idx_next = 0;
- }
- while (idx_next < idx_curr && lengths.back() - lengths[idx_curr] + lengths[idx_next] < min_arm_length)
- ++ idx_next;
- // Calculate angle between idx_prev, idx_curr, idx_next.
- const Point &p0 = polygon.points[idx_prev];
- const Point &p1 = polygon.points[idx_curr];
- const Point &p2 = polygon.points[idx_next];
- const Point v1 = p1 - p0;
- const Point v2 = p2 - p1;
- int64_t dot = int64_t(v1(0))*int64_t(v2(0)) + int64_t(v1(1))*int64_t(v2(1));
- int64_t cross = int64_t(v1(0))*int64_t(v2(1)) - int64_t(v1(1))*int64_t(v2(0));
- float angle = float(atan2(double(cross), double(dot)));
- angles[idx_curr] = angle;
- }
-
- return angles;
-}
std::string GCode::extrude_loop(ExtrusionLoop loop, std::string description, double speed, std::unique_ptr<EdgeGrid::Grid> *lower_layer_edge_grid)
{
@@ -2589,195 +2272,49 @@ std::string GCode::extrude_loop(ExtrusionLoop loop, std::string description, dou
#endif
}
}
-
+
// extrude all loops ccw
bool was_clockwise = loop.make_counter_clockwise();
-
+
SeamPosition seam_position = m_config.seam_position;
- if (loop.loop_role() == elrSkirt)
+ if (loop.loop_role() == elrSkirt)
seam_position = spNearest;
-
+
// find the point of the loop that is closest to the current extruder position
// or randomize if requested
Point last_pos = this->last_pos();
if (m_config.spiral_vase) {
loop.split_at(last_pos, false);
- } else if (seam_position == spNearest || seam_position == spAligned || seam_position == spRear) {
- Polygon polygon = loop.polygon();
- const coordf_t nozzle_dmr = EXTRUDER_CONFIG(nozzle_diameter);
- const coord_t nozzle_r = coord_t(scale_(0.5 * nozzle_dmr) + 0.5);
-
- // Retrieve the last start position for this object.
- float last_pos_weight = 1.f;
-
- if (seam_position == spAligned) {
- // Seam is aligned to the seam at the preceding layer.
- if (m_layer != NULL && m_seam_position.count(m_layer->object()) > 0) {
- last_pos = m_seam_position[m_layer->object()];
- last_pos_weight = 1.f;
- }
- }
- else if (seam_position == spRear) {
- // Object is centered around (0,0) in its current coordinate system.
- last_pos.x() = 0;
- last_pos.y() += coord_t(3. * m_layer->object()->bounding_box().radius());
- last_pos_weight = 5.f;
- }
-
- // Insert a projection of last_pos into the polygon.
- size_t last_pos_proj_idx;
- {
- Points::iterator it = project_point_to_polygon_and_insert(polygon, last_pos, 0.1 * nozzle_r);
- last_pos_proj_idx = it - polygon.points.begin();
- }
-
- // Parametrize the polygon by its length.
- std::vector<float> lengths = polygon_parameter_by_length(polygon);
-
- // For each polygon point, store a penalty.
- // First calculate the angles, store them as penalties. The angles are caluculated over a minimum arm length of nozzle_r.
- std::vector<float> penalties = polygon_angles_at_vertices(polygon, lengths, float(nozzle_r));
- // No penalty for reflex points, slight penalty for convex points, high penalty for flat surfaces.
- const float penaltyConvexVertex = 1.f;
- const float penaltyFlatSurface = 5.f;
- const float penaltyOverhangHalf = 10.f;
- // Penalty for visible seams.
- for (size_t i = 0; i < polygon.points.size(); ++ i) {
- float ccwAngle = penalties[i];
- if (was_clockwise)
- ccwAngle = - ccwAngle;
- float penalty = 0;
-// if (ccwAngle <- float(PI/3.))
- if (ccwAngle <- float(0.6 * PI))
- // Sharp reflex vertex. We love that, it hides the seam perfectly.
- penalty = 0.f;
-// else if (ccwAngle > float(PI/3.))
- else if (ccwAngle > float(0.6 * PI))
- // Seams on sharp convex vertices are more visible than on reflex vertices.
- penalty = penaltyConvexVertex;
- else if (ccwAngle < 0.f) {
- // Interpolate penalty between maximum and zero.
- penalty = penaltyFlatSurface * bspline_kernel(ccwAngle * float(PI * 2. / 3.));
- } else {
- assert(ccwAngle >= 0.f);
- // Interpolate penalty between maximum and the penalty for a convex vertex.
- penalty = penaltyConvexVertex + (penaltyFlatSurface - penaltyConvexVertex) * bspline_kernel(ccwAngle * float(PI * 2. / 3.));
- }
- // Give a negative penalty for points close to the last point or the prefered seam location.
- //float dist_to_last_pos_proj = last_pos_proj.distance_to(polygon.points[i]);
- float dist_to_last_pos_proj = (i < last_pos_proj_idx) ?
- std::min(lengths[last_pos_proj_idx] - lengths[i], lengths.back() - lengths[last_pos_proj_idx] + lengths[i]) :
- std::min(lengths[i] - lengths[last_pos_proj_idx], lengths.back() - lengths[i] + lengths[last_pos_proj_idx]);
- float dist_max = 0.1f * lengths.back(); // 5.f * nozzle_dmr
- penalty -= last_pos_weight * bspline_kernel(dist_to_last_pos_proj / dist_max);
- penalties[i] = std::max(0.f, penalty);
- }
-
- // Penalty for overhangs.
- if (lower_layer_edge_grid && (*lower_layer_edge_grid)) {
- // Use the edge grid distance field structure over the lower layer to calculate overhangs.
- coord_t nozzle_r = coord_t(floor(scale_(0.5 * nozzle_dmr) + 0.5));
- coord_t search_r = coord_t(floor(scale_(0.8 * nozzle_dmr) + 0.5));
- for (size_t i = 0; i < polygon.points.size(); ++ i) {
- const Point &p = polygon.points[i];
- coordf_t dist;
- // Signed distance is positive outside the object, negative inside the object.
- // The point is considered at an overhang, if it is more than nozzle radius
- // outside of the lower layer contour.
- #ifdef NDEBUG // to suppress unused variable warning in release mode
- (*lower_layer_edge_grid)->signed_distance(p, search_r, dist);
- #else
- bool found = (*lower_layer_edge_grid)->signed_distance(p, search_r, dist);
- #endif
- // If the approximate Signed Distance Field was initialized over lower_layer_edge_grid,
- // then the signed distnace shall always be known.
- assert(found);
- penalties[i] += extrudate_overlap_penalty(float(nozzle_r), penaltyOverhangHalf, float(dist));
- }
- }
-
- // Find a point with a minimum penalty.
- size_t idx_min = std::min_element(penalties.begin(), penalties.end()) - penalties.begin();
-
- // if (seam_position == spAligned)
- // For all (aligned, nearest, rear) seams:
- {
- // Very likely the weight of idx_min is very close to the weight of last_pos_proj_idx.
- // In that case use last_pos_proj_idx instead.
- float penalty_aligned = penalties[last_pos_proj_idx];
- float penalty_min = penalties[idx_min];
- float penalty_diff_abs = std::abs(penalty_min - penalty_aligned);
- float penalty_max = std::max(penalty_min, penalty_aligned);
- float penalty_diff_rel = (penalty_max == 0.f) ? 0.f : penalty_diff_abs / penalty_max;
- // printf("Align seams, penalty aligned: %f, min: %f, diff abs: %f, diff rel: %f\n", penalty_aligned, penalty_min, penalty_diff_abs, penalty_diff_rel);
- if (penalty_diff_rel < 0.05) {
- // Penalty of the aligned point is very close to the minimum penalty.
- // Align the seams as accurately as possible.
- idx_min = last_pos_proj_idx;
- }
- m_seam_position[m_layer->object()] = polygon.points[idx_min];
- }
-
- // Export the contour into a SVG file.
- #if 0
- {
- static int iRun = 0;
- SVG svg(debug_out_path("GCode_extrude_loop-%d.svg", iRun ++));
- if (m_layer->lower_layer != NULL)
- svg.draw(m_layer->lower_layer->slices);
- for (size_t i = 0; i < loop.paths.size(); ++ i)
- svg.draw(loop.paths[i].as_polyline(), "red");
- Polylines polylines;
- for (size_t i = 0; i < loop.paths.size(); ++ i)
- polylines.push_back(loop.paths[i].as_polyline());
- Slic3r::Polygons polygons;
- coordf_t nozzle_dmr = EXTRUDER_CONFIG(nozzle_diameter);
- coord_t delta = scale_(0.5*nozzle_dmr);
- Slic3r::offset(polylines, &polygons, delta);
-// for (size_t i = 0; i < polygons.size(); ++ i) svg.draw((Polyline)polygons[i], "blue");
- svg.draw(last_pos, "green", 3);
- svg.draw(polygon.points[idx_min], "yellow", 3);
- svg.Close();
- }
- #endif
-
+ } else {
+ const EdgeGrid::Grid* edge_grid_ptr = (lower_layer_edge_grid && *lower_layer_edge_grid)
+ ? lower_layer_edge_grid->get()
+ : nullptr;
+ Point seam = m_seam_placer.get_seam(*m_layer, seam_position, loop,
+ last_pos, EXTRUDER_CONFIG(nozzle_diameter),
+ (m_layer == NULL ? nullptr : m_layer->object()),
+ was_clockwise, edge_grid_ptr);
// Split the loop at the point with a minium penalty.
- if (!loop.split_at_vertex(polygon.points[idx_min]))
+ if (!loop.split_at_vertex(seam))
// The point is not in the original loop. Insert it.
- loop.split_at(polygon.points[idx_min], true);
-
- } else if (seam_position == spRandom) {
- if (loop.loop_role() == elrContourInternalPerimeter) {
- // This loop does not contain any other loop. Set a random position.
- // The other loops will get a seam close to the random point chosen
- // on the inner most contour.
- //FIXME This works correctly for inner contours first only.
- //FIXME Better parametrize the loop by its length.
- Polygon polygon = loop.polygon();
- Point centroid = polygon.centroid();
- last_pos = Point(polygon.bounding_box().max(0), centroid(1));
- last_pos.rotate(fmod((float)rand()/16.0, 2.0*PI), centroid);
- }
- // Find the closest point, avoid overhangs.
- loop.split_at(last_pos, true);
+ loop.split_at(seam, true);
}
-
+
// clip the path to avoid the extruder to get exactly on the first point of the loop;
// if polyline was shorter than the clipping distance we'd get a null polyline, so
// we discard it in that case
- double clip_length = m_enable_loop_clipping ?
- scale_(EXTRUDER_CONFIG(nozzle_diameter)) * LOOP_CLIPPING_LENGTH_OVER_NOZZLE_DIAMETER :
+ double clip_length = m_enable_loop_clipping ?
+ scale_(EXTRUDER_CONFIG(nozzle_diameter)) * LOOP_CLIPPING_LENGTH_OVER_NOZZLE_DIAMETER :
0;
// get paths
ExtrusionPaths paths;
loop.clip_end(clip_length, &paths);
if (paths.empty()) return "";
-
+
// apply the small perimeter speed
if (is_perimeter(paths.front().role()) && loop.length() <= SMALL_PERIMETER_LENGTH && speed == -1)
speed = m_config.small_perimeter_speed.get_abs_value(m_config.perimeter_speed);
-
+
// extrude along the path
std::string gcode;
for (ExtrusionPaths::iterator path = paths.begin(); path != paths.end(); ++path) {
@@ -2786,31 +2323,31 @@ std::string GCode::extrude_loop(ExtrusionLoop loop, std::string description, dou
path->simplify(SCALED_RESOLUTION);
gcode += this->_extrude(*path, description, speed);
}
-
+
// reset acceleration
gcode += m_writer.set_acceleration((unsigned int)(m_config.default_acceleration.value + 0.5));
-
+
if (m_wipe.enable)
m_wipe.path = paths.front().polyline; // TODO: don't limit wipe to last path
-
+
// make a little move inwards before leaving loop
- if (paths.back().role() == erExternalPerimeter && m_layer != NULL && m_config.perimeters.value > 1 && paths.front().size() >= 2 && paths.back().polyline.points.size() >= 3) {
+ if (paths.back().role() == erExternalPerimeter && m_layer != NULL && m_config.perimeters.value > 1 && paths.front().size() >= 2 && paths.back().polyline.points.size() >= 3) {
// detect angle between last and first segment
// the side depends on the original winding order of the polygon (left for contours, right for holes)
- //FIXME improve the algorithm in case the loop is tiny.
- //FIXME improve the algorithm in case the loop is split into segments with a low number of points (see the Point b query).
+ //FIXME improve the algorithm in case the loop is tiny.
+ //FIXME improve the algorithm in case the loop is split into segments with a low number of points (see the Point b query).
Point a = paths.front().polyline.points[1]; // second point
Point b = *(paths.back().polyline.points.end()-3); // second to last point
if (was_clockwise) {
// swap points
Point c = a; a = b; b = c;
}
-
+
double angle = paths.front().first_point().ccw_angle(a, b) / 3;
-
+
// turn left if contour, turn right if hole
if (was_clockwise) angle *= -1;
-
+
// create the destination point along the first segment and rotate it
// we make sure we don't exceed the segment length because we don't know
// the rotation of the second segment so we might cross the object boundary
@@ -2826,7 +2363,7 @@ std::string GCode::extrude_loop(ExtrusionLoop loop, std::string description, dou
// generate the travel move
gcode += m_writer.travel_to_xy(this->point_to_gcode(pt), "move inwards before travel");
}
-
+
return gcode;
}
@@ -2858,7 +2395,7 @@ std::string GCode::extrude_entity(const ExtrusionEntity &entity, std::string des
else if (const ExtrusionLoop* loop = dynamic_cast<const ExtrusionLoop*>(&entity))
return this->extrude_loop(*loop, description, speed, lower_layer_edge_grid);
else
- throw std::invalid_argument("Invalid argument supplied to extrude()");
+ throw Slic3r::InvalidArgument("Invalid argument supplied to extrude()");
return "";
}
@@ -2890,21 +2427,29 @@ std::string GCode::extrude_perimeters(const Print &print, const std::vector<Obje
}
// Chain the paths hierarchically by a greedy algorithm to minimize a travel distance.
-std::string GCode::extrude_infill(const Print &print, const std::vector<ObjectByExtruder::Island::Region> &by_region)
+std::string GCode::extrude_infill(const Print &print, const std::vector<ObjectByExtruder::Island::Region> &by_region, bool ironing)
{
- std::string gcode;
+ std::string gcode;
+ ExtrusionEntitiesPtr extrusions;
+ const char* extrusion_name = ironing ? "ironing" : "infill";
for (const ObjectByExtruder::Island::Region &region : by_region)
if (! region.infills.empty()) {
- m_config.apply(print.regions()[&region - &by_region.front()]->config());
- ExtrusionEntitiesPtr extrusions { region.infills };
- chain_and_reorder_extrusion_entities(extrusions, &m_last_pos);
- for (const ExtrusionEntity *fill : extrusions) {
- auto *eec = dynamic_cast<const ExtrusionEntityCollection*>(fill);
- if (eec) {
- for (ExtrusionEntity *ee : eec->chained_path_from(m_last_pos).entities)
- gcode += this->extrude_entity(*ee, "infill");
- } else
- gcode += this->extrude_entity(*fill, "infill");
+ extrusions.clear();
+ extrusions.reserve(region.infills.size());
+ for (ExtrusionEntity *ee : region.infills)
+ if ((ee->role() == erIroning) == ironing)
+ extrusions.emplace_back(ee);
+ if (! extrusions.empty()) {
+ m_config.apply(print.regions()[&region - &by_region.front()]->config());
+ chain_and_reorder_extrusion_entities(extrusions, &m_last_pos);
+ for (const ExtrusionEntity *fill : extrusions) {
+ auto *eec = dynamic_cast<const ExtrusionEntityCollection*>(fill);
+ if (eec) {
+ for (ExtrusionEntity *ee : eec->chained_path_from(m_last_pos).entities)
+ gcode += this->extrude_entity(*ee, extrusion_name);
+ } else
+ gcode += this->extrude_entity(*fill, extrusion_name);
+ }
}
}
return gcode;
@@ -2940,15 +2485,9 @@ std::string GCode::extrude_support(const ExtrusionEntityCollection &support_fill
void GCode::_write(FILE* file, const char *what)
{
if (what != nullptr) {
- // apply analyzer, if enabled
- const char* gcode = m_enable_analyzer ? m_analyzer.process_gcode(what).c_str() : what;
-
+ const char* gcode = what;
// writes string to file
fwrite(gcode, 1, ::strlen(gcode), file);
- // updates time estimator and gcode lines vector
- m_normal_time_estimator.add_gcode_block(gcode);
- if (m_silent_time_estimator_enabled)
- m_silent_time_estimator.add_gcode_block(gcode);
}
}
@@ -2993,10 +2532,10 @@ void GCode::_write_format(FILE* file, const char* format, ...)
std::string GCode::_extrude(const ExtrusionPath &path, std::string description, double speed)
{
std::string gcode;
-
+
if (is_bridge(path.role()))
description += " (bridge)";
-
+
// go to first point of extrusion path
if (!m_last_pos_defined || m_last_pos != path.first_point()) {
gcode += this->travel_to(
@@ -3005,10 +2544,10 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description,
"move to first " + description + " point"
);
}
-
+
// compensate retraction
gcode += this->unretract();
-
+
// adjust acceleration
{
double acceleration;
@@ -3025,11 +2564,11 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description,
}
gcode += m_writer.set_acceleration((unsigned int)floor(acceleration + 0.5));
}
-
+
// calculate extrusion length per distance unit
double e_per_mm = m_writer.extruder()->e_per_mm3() * path.mm3_per_mm;
if (m_writer.extrusion_axis().empty()) e_per_mm = 0;
-
+
// set speed
if (speed == -1) {
if (path.role() == erPerimeter) {
@@ -3044,10 +2583,12 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description,
speed = m_config.get_abs_value("solid_infill_speed");
} else if (path.role() == erTopSolidInfill) {
speed = m_config.get_abs_value("top_solid_infill_speed");
+ } else if (path.role() == erIroning) {
+ speed = m_config.get_abs_value("ironing_speed");
} else if (path.role() == erGapFill) {
speed = m_config.get_abs_value("gap_fill_speed");
} else {
- throw std::invalid_argument("Invalid speed");
+ throw Slic3r::InvalidArgument("Invalid speed");
}
}
if (this->on_first_layer())
@@ -3069,7 +2610,7 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description,
);
}
double F = speed * 60; // convert mm/sec to mm/min
-
+
// extrude arc or line
if (m_enable_extrusion_role_markers)
{
@@ -3085,41 +2626,46 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description,
}
}
- // adds analyzer tags and updates analyzer's tracking data
- if (m_enable_analyzer)
- {
- // PrusaMultiMaterial::Writer may generate GCodeAnalyzer::Height_Tag and GCodeAnalyzer::Width_Tag lines without updating m_last_height and m_last_width
- // so, if the last role was erWipeTower we force export of GCodeAnalyzer::Height_Tag and GCodeAnalyzer::Width_Tag lines
- bool last_was_wipe_tower = (m_last_analyzer_extrusion_role == erWipeTower);
- char buf[64];
+ // adds processor tags and updates processor tracking data
+ // PrusaMultiMaterial::Writer may generate GCodeProcessor::Height_Tag lines without updating m_last_height
+ // so, if the last role was erWipeTower we force export of GCodeProcessor::Height_Tag lines
+ bool last_was_wipe_tower = (m_last_processor_extrusion_role == erWipeTower);
+ char buf[64];
- if (path.role() != m_last_analyzer_extrusion_role)
- {
- m_last_analyzer_extrusion_role = path.role();
- sprintf(buf, ";%s%d\n", GCodeAnalyzer::Extrusion_Role_Tag.c_str(), int(m_last_analyzer_extrusion_role));
- gcode += buf;
- }
+ if (path.role() != m_last_processor_extrusion_role) {
+ m_last_processor_extrusion_role = path.role();
+ sprintf(buf, ";%s%s\n", GCodeProcessor::Extrusion_Role_Tag.c_str(), ExtrusionEntity::role_to_string(m_last_processor_extrusion_role).c_str());
+ gcode += buf;
+ }
- if (last_was_wipe_tower || (m_last_mm3_per_mm != path.mm3_per_mm))
- {
- m_last_mm3_per_mm = path.mm3_per_mm;
- sprintf(buf, ";%s%f\n", GCodeAnalyzer::Mm3_Per_Mm_Tag.c_str(), m_last_mm3_per_mm);
- gcode += buf;
- }
+#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ if (last_was_wipe_tower || m_last_width != path.width) {
+ m_last_width = path.width;
+ sprintf(buf, ";%s%g\n", GCodeProcessor::Width_Tag.c_str(), m_last_width);
+ gcode += buf;
+ }
+#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
- if (last_was_wipe_tower || (m_last_width != path.width))
- {
- m_last_width = path.width;
- sprintf(buf, ";%s%f\n", GCodeAnalyzer::Width_Tag.c_str(), m_last_width);
- gcode += buf;
- }
+#if ENABLE_GCODE_VIEWER_DATA_CHECKING
+ if (last_was_wipe_tower || (m_last_mm3_per_mm != path.mm3_per_mm)) {
+ m_last_mm3_per_mm = path.mm3_per_mm;
+ sprintf(buf, ";%s%f\n", GCodeProcessor::Mm3_Per_Mm_Tag.c_str(), m_last_mm3_per_mm);
+ gcode += buf;
+ }
- if (last_was_wipe_tower || (m_last_height != path.height))
- {
- m_last_height = path.height;
- sprintf(buf, ";%s%f\n", GCodeAnalyzer::Height_Tag.c_str(), m_last_height);
- gcode += buf;
- }
+#if !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ if (last_was_wipe_tower || m_last_width != path.width) {
+ m_last_width = path.width;
+ sprintf(buf, ";%s%g\n", GCodeProcessor::Width_Tag.c_str(), m_last_width);
+ gcode += buf;
+ }
+#endif // !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
+
+ if (last_was_wipe_tower || std::abs(m_last_height - path.height) > EPSILON) {
+ m_last_height = path.height;
+ sprintf(buf, ";%s%g\n", GCodeProcessor::Height_Tag.c_str(), m_last_height);
+ gcode += buf;
}
std::string comment;
@@ -3148,54 +2694,62 @@ std::string GCode::_extrude(const ExtrusionPath &path, std::string description,
}
if (m_enable_cooling_markers)
gcode += is_bridge(path.role()) ? ";_BRIDGE_FAN_END\n" : ";_EXTRUDE_END\n";
-
+
this->set_last_pos(path.last_point());
return gcode;
}
// This method accepts &point in print coordinates.
std::string GCode::travel_to(const Point &point, ExtrusionRole role, std::string comment)
-{
+{
/* Define the travel move as a line between current position and the taget point.
This is expressed in print coordinates, so it will need to be translated by
this->origin in order to get G-code coordinates. */
- Polyline travel;
- travel.append(this->last_pos());
- travel.append(point);
-
+ Polyline travel { this->last_pos(), point };
+
// check whether a straight travel move would need retraction
- bool needs_retraction = this->needs_retraction(travel, role);
-
+ bool needs_retraction = this->needs_retraction(travel, role);
+ // check whether wipe could be disabled without causing visible stringing
+ bool could_be_wipe_disabled = false;
+
// if a retraction would be needed, try to use avoid_crossing_perimeters to plan a
// multi-hop travel path inside the configuration space
if (needs_retraction
&& m_config.avoid_crossing_perimeters
- && ! m_avoid_crossing_perimeters.disable_once) {
- travel = m_avoid_crossing_perimeters.travel_to(*this, point);
-
+ && ! m_avoid_crossing_perimeters.disabled_once()) {
+ travel = m_avoid_crossing_perimeters.travel_to(*this, point, &could_be_wipe_disabled);
// check again whether the new travel path still needs a retraction
needs_retraction = this->needs_retraction(travel, role);
//if (needs_retraction && m_layer_index > 1) exit(0);
}
-
+
// Re-allow avoid_crossing_perimeters for the next travel moves
- m_avoid_crossing_perimeters.disable_once = false;
- m_avoid_crossing_perimeters.use_external_mp_once = false;
-
+ m_avoid_crossing_perimeters.reset_once_modifiers();
+
// generate G-code for the travel move
std::string gcode;
- if (needs_retraction)
+ if (needs_retraction) {
+ if (m_config.avoid_crossing_perimeters && could_be_wipe_disabled)
+ m_wipe.reset_path();
+
+ Point last_post_before_retract = this->last_pos();
gcode += this->retract();
- else
+ // When "Wipe while retracting" is enabled, then extruder moves to another position, and travel from this position can cross perimeters.
+ // Because of it, it is necessary to call avoid crossing perimeters for the path between previous last_post and last_post after calling retraction()
+ if (last_post_before_retract != this->last_pos() && m_config.avoid_crossing_perimeters) {
+ Polyline retract_travel = m_avoid_crossing_perimeters.travel_to(*this, last_post_before_retract);
+ append(retract_travel.points, travel.points);
+ travel = std::move(retract_travel);
+ }
+ } else
// Reset the wipe path when traveling, so one would not wipe along an old path.
m_wipe.reset_path();
-
+
// use G1 because we rely on paths being straight (G0 may make round paths)
- Lines lines = travel.lines();
- if (! lines.empty()) {
- for (const Line &line : lines)
- gcode += m_writer.travel_to_xy(this->point_to_gcode(line.b), comment);
- this->set_last_pos(lines.back().b);
+ if (travel.size() >= 2) {
+ for (size_t i = 1; i < travel.size(); ++ i)
+ gcode += m_writer.travel_to_xy(this->point_to_gcode(travel.points[i]), comment);
+ this->set_last_pos(travel.points.back());
}
return gcode;
}
@@ -3206,7 +2760,7 @@ bool GCode::needs_retraction(const Polyline &travel, ExtrusionRole role)
// skip retraction if the move is shorter than the configured threshold
return false;
}
-
+
if (role == erSupportMaterial) {
const SupportLayer* support_layer = dynamic_cast<const SupportLayer*>(m_layer);
//FIXME support_layer->support_islands.contains should use some search structure!
@@ -3223,7 +2777,7 @@ bool GCode::needs_retraction(const Polyline &travel, ExtrusionRole role)
// internal infill is enabled (so that stringing is entirely not visible).
//FIXME any_internal_region_slice_contains() is potentionally very slow, it shall test for the bounding boxes first.
return false;
-
+
// retract if only_retract_when_crossing_perimeters is disabled or doesn't apply
return true;
}
@@ -3231,26 +2785,26 @@ bool GCode::needs_retraction(const Polyline &travel, ExtrusionRole role)
std::string GCode::retract(bool toolchange)
{
std::string gcode;
-
+
if (m_writer.extruder() == nullptr)
return gcode;
-
+
// wipe (if it's enabled for this extruder and we have a stored wipe path)
if (EXTRUDER_CONFIG(wipe) && m_wipe.has_path()) {
gcode += toolchange ? m_writer.retract_for_toolchange(true) : m_writer.retract(true);
gcode += m_wipe.wipe(*this, toolchange);
}
-
+
/* The parent class will decide whether we need to perform an actual retraction
- (the extruder might be already retracted fully or partially). We call these
+ (the extruder might be already retracted fully or partially). We call these
methods even if we performed wipe, since this will ensure the entire retraction
length is honored in case wipe path was too short. */
gcode += toolchange ? m_writer.retract_for_toolchange() : m_writer.retract();
-
+
gcode += m_writer.reset_e();
if (m_writer.extruder()->retract_length() > 0 || m_config.use_firmware_retraction)
gcode += m_writer.lift();
-
+
return gcode;
}
@@ -3258,11 +2812,11 @@ std::string GCode::set_extruder(unsigned int extruder_id, double print_z)
{
if (!m_writer.need_toolchange(extruder_id))
return "";
-
+
// if we are running a single-extruder setup, just set the extruder and return nothing
if (!m_writer.multiple_extruders) {
m_placeholder_parser.set("current_extruder", extruder_id);
-
+
std::string gcode;
// Append the filament start G-code.
const std::string &start_filament_gcode = m_config.start_filament_gcode.get_at(extruder_id);
@@ -3274,13 +2828,13 @@ std::string GCode::set_extruder(unsigned int extruder_id, double print_z)
gcode += m_writer.toolchange(extruder_id);
return gcode;
}
-
+
// prepend retraction on the current extruder
std::string gcode = this->retract(true);
// Always reset the extrusion path, even if the tool change retract is set to zero.
m_wipe.reset_path();
-
+
if (m_writer.extruder() != nullptr) {
// Process the custom end_filament_gcode. set_extruder() is only called if there is no wipe tower
// so it should not be injected twice.
@@ -3292,7 +2846,7 @@ std::string GCode::set_extruder(unsigned int extruder_id, double print_z)
}
}
-
+
// If ooze prevention is enabled, park current extruder in the nearest
// standby point and set it to the standby temperature.
if (m_ooze_prevention.enable && m_writer.extruder() != nullptr)
@@ -3308,6 +2862,7 @@ std::string GCode::set_extruder(unsigned int extruder_id, double print_z)
config.set_key_value("next_extruder", new ConfigOptionInt((int)extruder_id));
config.set_key_value("layer_num", new ConfigOptionInt(m_layer_index));
config.set_key_value("layer_z", new ConfigOptionFloat(print_z));
+ config.set_key_value("max_layer_z", new ConfigOptionFloat(m_max_layer_z));
toolchange_gcode_parsed = placeholder_parser_process("toolchange_gcode", toolchange_gcode, extruder_id, &config);
gcode += toolchange_gcode_parsed;
check_add_eol(gcode);
@@ -3341,7 +2896,7 @@ std::string GCode::set_extruder(unsigned int extruder_id, double print_z)
// Set the new extruder to the operating temperature.
if (m_ooze_prevention.enable)
gcode += m_ooze_prevention.post_toolchange(*this);
-
+
return gcode;
}
@@ -3368,17 +2923,17 @@ const std::vector<GCode::ObjectByExtruder::Island::Region>& GCode::ObjectByExtru
{
bool has_overrides = false;
for (const auto& reg : by_region)
- if (! reg.infills_overrides.empty() || ! reg.perimeters_overrides.empty()) {
- has_overrides = true;
- break;
- }
+ if (! reg.infills_overrides.empty() || ! reg.perimeters_overrides.empty()) {
+ has_overrides = true;
+ break;
+ }
- // Data is cleared, but the memory is not.
+ // Data is cleared, but the memory is not.
by_region_per_copy_cache.clear();
if (! has_overrides)
- // Simple case. No need to copy the regions.
- return wiping_entities ? by_region_per_copy_cache : this->by_region;
+ // Simple case. No need to copy the regions.
+ return wiping_entities ? by_region_per_copy_cache : this->by_region;
// Complex case. Some of the extrusions of some object instances are to be printed first - those are the wiping extrusions.
// Some of the extrusions of some object instances are printed later - those are the clean print extrusions.
@@ -3397,25 +2952,25 @@ const std::vector<GCode::ObjectByExtruder::Island::Region>& GCode::ObjectByExtru
// Now the most important thing - which extrusion should we print.
// See function ToolOrdering::get_extruder_overrides for details about the negative numbers hack.
if (wiping_entities) {
- // Apply overrides for this region.
- for (unsigned int i = 0; i < overrides.size(); ++ i) {
- const WipingExtrusions::ExtruderPerCopy *this_override = overrides[i];
- // This copy (aka object instance) should be printed with this extruder, which overrides the default one.
- if (this_override != nullptr && (*this_override)[copy] == int(extruder))
- target_eec.emplace_back(entities[i]);
- }
- } else {
- // Apply normal extrusions (non-overrides) for this region.
- unsigned int i = 0;
- for (; i < overrides.size(); ++ i) {
- const WipingExtrusions::ExtruderPerCopy *this_override = overrides[i];
- // This copy (aka object instance) should be printed with this extruder, which shall be equal to the default one.
- if (this_override == nullptr || (*this_override)[copy] == -int(extruder)-1)
- target_eec.emplace_back(entities[i]);
- }
- for (; i < entities.size(); ++ i)
+ // Apply overrides for this region.
+ for (unsigned int i = 0; i < overrides.size(); ++ i) {
+ const WipingExtrusions::ExtruderPerCopy *this_override = overrides[i];
+ // This copy (aka object instance) should be printed with this extruder, which overrides the default one.
+ if (this_override != nullptr && (*this_override)[copy] == int(extruder))
+ target_eec.emplace_back(entities[i]);
+ }
+ } else {
+ // Apply normal extrusions (non-overrides) for this region.
+ unsigned int i = 0;
+ for (; i < overrides.size(); ++ i) {
+ const WipingExtrusions::ExtruderPerCopy *this_override = overrides[i];
+ // This copy (aka object instance) should be printed with this extruder, which shall be equal to the default one.
+ if (this_override == nullptr || (*this_override)[copy] == -int(extruder)-1)
+ target_eec.emplace_back(entities[i]);
+ }
+ for (; i < entities.size(); ++ i)
target_eec.emplace_back(entities[i]);
- }
+ }
}
}
return by_region_per_copy_cache;
@@ -3435,27 +2990,30 @@ void GCode::ObjectByExtruder::Island::Region::append(const Type type, const Extr
perimeters_or_infills_overrides = &perimeters_overrides;
break;
case INFILL:
- perimeters_or_infills = &infills;
- perimeters_or_infills_overrides = &infills_overrides;
+ perimeters_or_infills = &infills;
+ perimeters_or_infills_overrides = &infills_overrides;
break;
default:
- throw std::invalid_argument("Unknown parameter!");
+ throw Slic3r::InvalidArgument("Unknown parameter!");
}
// First we append the entities, there are eec->entities.size() of them:
size_t old_size = perimeters_or_infills->size();
- size_t new_size = old_size + eec->entities.size();
+ size_t new_size = old_size + (eec->can_reverse() ? eec->entities.size() : 1);
perimeters_or_infills->reserve(new_size);
- for (auto* ee : eec->entities)
- perimeters_or_infills->emplace_back(ee);
+ if (eec->can_reverse()) {
+ for (auto* ee : eec->entities)
+ perimeters_or_infills->emplace_back(ee);
+ } else
+ perimeters_or_infills->emplace_back(const_cast<ExtrusionEntityCollection*>(eec));
if (copies_extruder != nullptr) {
- // Don't reallocate overrides if not needed.
- // Missing overrides are implicitely considered non-overridden.
+ // Don't reallocate overrides if not needed.
+ // Missing overrides are implicitely considered non-overridden.
perimeters_or_infills_overrides->reserve(new_size);
perimeters_or_infills_overrides->resize(old_size, nullptr);
perimeters_or_infills_overrides->resize(new_size, copies_extruder);
- }
+ }
}
} // namespace Slic3r
diff --git a/src/libslic3r/GCode.hpp b/src/libslic3r/GCode.hpp
index 650fb8860..458eae80a 100644
--- a/src/libslic3r/GCode.hpp
+++ b/src/libslic3r/GCode.hpp
@@ -5,23 +5,21 @@
#include "ExPolygon.hpp"
#include "GCodeWriter.hpp"
#include "Layer.hpp"
-#include "MotionPlanner.hpp"
#include "Point.hpp"
#include "PlaceholderParser.hpp"
-#include "Print.hpp"
#include "PrintConfig.hpp"
+#include "GCode/AvoidCrossingPerimeters.hpp"
#include "GCode/CoolingBuffer.hpp"
#include "GCode/SpiralVase.hpp"
#include "GCode/ToolOrdering.hpp"
#include "GCode/WipeTower.hpp"
-#include "GCodeTimeEstimator.hpp"
+#include "GCode/SeamPlacer.hpp"
+#include "GCode/GCodeProcessor.hpp"
#include "EdgeGrid.hpp"
-#include "GCode/Analyzer.hpp"
-#if ENABLE_THUMBNAIL_GENERATOR
#include "GCode/ThumbnailData.hpp"
-#endif // ENABLE_THUMBNAIL_GENERATOR
#include <memory>
+#include <map>
#include <string>
#ifdef HAS_PRESSURE_EQUALIZER
@@ -32,35 +30,10 @@ namespace Slic3r {
// Forward declarations.
class GCode;
-class GCodePreviewData;
-class AvoidCrossingPerimeters {
-public:
-
- // this flag triggers the use of the external configuration space
- bool use_external_mp;
- bool use_external_mp_once; // just for the next travel move
-
- // this flag disables avoid_crossing_perimeters just for the next travel move
- // we enable it by default for the first travel move in print
- bool disable_once;
-
- AvoidCrossingPerimeters() : use_external_mp(false), use_external_mp_once(false), disable_once(true) {}
- ~AvoidCrossingPerimeters() {}
-
- void reset() { m_external_mp.reset(); m_layer_mp.reset(); }
- void init_external_mp(const Print &print);
- void init_layer_mp(const ExPolygons &islands) { m_layer_mp = Slic3r::make_unique<MotionPlanner>(islands); }
-
- Polyline travel_to(const GCode &gcodegen, const Point &point);
-
-private:
- // For initializing the regions to avoid.
- static Polygons collect_contours_all_layers(const PrintObjectPtrs& objects);
-
- std::unique_ptr<MotionPlanner> m_external_mp;
- std::unique_ptr<MotionPlanner> m_layer_mp;
-};
+namespace { struct Item; }
+struct PrintInstance;
+using PrintObjectPtrs = std::vector<PrintObject*>;
class OozePrevention {
public:
@@ -137,28 +110,38 @@ private:
double m_last_wipe_tower_print_z = 0.f;
};
+class ColorPrintColors
+{
+ static const std::vector<std::string> Colors;
+public:
+ static const std::vector<std::string>& get() { return Colors; }
+};
+
class GCode {
public:
GCode() :
m_origin(Vec2d::Zero()),
m_enable_loop_clipping(true),
m_enable_cooling_markers(false),
- m_enable_extrusion_role_markers(false),
- m_enable_analyzer(false),
- m_last_analyzer_extrusion_role(erNone),
+ m_enable_extrusion_role_markers(false),
+ m_last_processor_extrusion_role(erNone),
m_layer_count(0),
m_layer_index(-1),
m_layer(nullptr),
m_volumetric_speed(0),
m_last_pos_defined(false),
m_last_extrusion_role(erNone),
- m_last_mm3_per_mm(GCodeAnalyzer::Default_mm3_per_mm),
- m_last_width(GCodeAnalyzer::Default_Width),
- m_last_height(GCodeAnalyzer::Default_Height),
+#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ m_last_width(0.0f),
+#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+#if ENABLE_GCODE_VIEWER_DATA_CHECKING
+ m_last_mm3_per_mm(0.0),
+#if !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ m_last_width(0.0f),
+#endif // !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
m_brim_done(false),
m_second_layer_things_done(false),
- m_normal_time_estimator(GCodeTimeEstimator::Normal),
- m_silent_time_estimator(GCodeTimeEstimator::Silent),
m_silent_time_estimator_enabled(false),
m_last_obj_copy(nullptr, Point(std::numeric_limits<coord_t>::max(), std::numeric_limits<coord_t>::max()))
{}
@@ -166,11 +149,7 @@ public:
// throws std::runtime_exception on error,
// throws CanceledException through print->throw_if_canceled().
-#if ENABLE_THUMBNAIL_GENERATOR
- void do_export(Print* print, const char* path, GCodePreviewData* preview_data = nullptr, ThumbnailsGeneratorCallback thumbnail_cb = nullptr);
-#else
- void do_export(Print *print, const char *path, GCodePreviewData *preview_data = nullptr);
-#endif // ENABLE_THUMBNAIL_GENERATOR
+ void do_export(Print* print, const char* path, GCodeProcessor::Result* result = nullptr, ThumbnailsGeneratorCallback thumbnail_cb = nullptr);
// Exported for the helper classes (OozePrevention, Wipe) and for the Perl binding for unit tests.
const Vec2d& origin() const { return m_origin; }
@@ -182,6 +161,7 @@ public:
const FullPrintConfig &config() const { return m_config; }
const Layer* layer() const { return m_layer; }
GCodeWriter& writer() { return m_writer; }
+ const GCodeWriter& writer() const { return m_writer; }
PlaceholderParser& placeholder_parser() { return m_placeholder_parser; }
const PlaceholderParser& placeholder_parser() const { return m_placeholder_parser; }
// Process a template through the placeholder parser, collect error messages to be reported
@@ -210,11 +190,7 @@ public:
};
private:
-#if ENABLE_THUMBNAIL_GENERATOR
void _do_export(Print &print, FILE *file, ThumbnailsGeneratorCallback thumbnail_cb);
-#else
- void _do_export(Print &print, FILE *file);
-#endif //ENABLE_THUMBNAIL_GENERATOR
static std::vector<LayerToPrint> collect_layers_to_print(const PrintObject &object);
static std::vector<std::pair<coordf_t, std::vector<LayerToPrint>>> collect_layers_to_print(const Print &print);
@@ -305,7 +281,7 @@ private:
const size_t single_object_instance_idx);
std::string extrude_perimeters(const Print &print, const std::vector<ObjectByExtruder::Island::Region> &by_region, std::unique_ptr<EdgeGrid::Grid> &lower_layer_edge_grid);
- std::string extrude_infill(const Print &print, const std::vector<ObjectByExtruder::Island::Region> &by_region);
+ std::string extrude_infill(const Print &print, const std::vector<ObjectByExtruder::Island::Region> &by_region, bool ironing);
std::string extrude_support(const ExtrusionEntityCollection &support_fills);
std::string travel_to(const Point &point, ExtrusionRole role, std::string comment);
@@ -314,6 +290,9 @@ private:
std::string unretract() { return m_writer.unlift() + m_writer.unretract(); }
std::string set_extruder(unsigned int extruder_id, double print_z);
+ // Cache for custom seam enforcers/blockers for each layer.
+ SeamPlacer m_seam_placer;
+
/* Origin of print coordinates expressed in unscaled G-code coordinates.
This affects the input arguments supplied to the extrude*() and travel_to()
methods. */
@@ -321,8 +300,10 @@ private:
FullPrintConfig m_config;
GCodeWriter m_writer;
PlaceholderParser m_placeholder_parser;
+ // For random number generator etc.
+ PlaceholderParser::ContextData m_placeholder_parser_context;
// Collection of templates, on which the placeholder substitution failed.
- std::set<std::string> m_placeholder_parser_failed_templates;
+ std::map<std::string, std::string> m_placeholder_parser_failed_templates;
OozePrevention m_ooze_prevention;
Wipe m_wipe;
AvoidCrossingPerimeters m_avoid_crossing_perimeters;
@@ -334,11 +315,8 @@ private:
// Markers for the Pressure Equalizer to recognize the extrusion type.
// The Pressure Equalizer removes the markers from the final G-code.
bool m_enable_extrusion_role_markers;
- // Enableds the G-code Analyzer.
- // Extended markers will be added during G-code generation.
- // The G-code Analyzer will remove these comments from the final G-code.
- bool m_enable_analyzer;
- ExtrusionRole m_last_analyzer_extrusion_role;
+ // Keeps track of the last extrusion role passed to the processor
+ ExtrusionRole m_last_processor_extrusion_role;
// How many times will change_layer() be called?
// change_layer() will update the progress bar.
unsigned int m_layer_count;
@@ -347,14 +325,22 @@ private:
// Current layer processed. Insequential printing mode, only a single copy will be printed.
// In non-sequential mode, all its copies will be printed.
const Layer* m_layer;
- std::map<const PrintObject*,Point> m_seam_position;
double m_volumetric_speed;
// Support for the extrusion role markers. Which marker is active?
ExtrusionRole m_last_extrusion_role;
- // Support for G-Code Analyzer
+ // Support for G-Code Processor
+ float m_last_height{ 0.0f };
+ float m_last_layer_z{ 0.0f };
+ float m_max_layer_z{ 0.0f };
+#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ float m_last_width{ 0.0f };
+#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+#if ENABLE_GCODE_VIEWER_DATA_CHECKING
double m_last_mm3_per_mm;
- float m_last_width;
- float m_last_height;
+#if !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ float m_last_width{ 0.0f };
+#endif // !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
Point m_last_pos;
bool m_last_pos_defined;
@@ -375,13 +361,10 @@ private:
// Index of a last object copy extruded.
std::pair<const PrintObject*, Point> m_last_obj_copy;
- // Time estimators
- GCodeTimeEstimator m_normal_time_estimator;
- GCodeTimeEstimator m_silent_time_estimator;
bool m_silent_time_estimator_enabled;
- // Analyzer
- GCodeAnalyzer m_analyzer;
+ // Processor
+ GCodeProcessor m_processor;
// Write a string into a file.
void _write(FILE* file, const std::string& what) { this->_write(file, what.c_str()); }
diff --git a/src/libslic3r/GCode/Analyzer.cpp b/src/libslic3r/GCode/Analyzer.cpp
deleted file mode 100644
index 8a18cc8f2..000000000
--- a/src/libslic3r/GCode/Analyzer.cpp
+++ /dev/null
@@ -1,1193 +0,0 @@
-#include <memory.h>
-#include <string.h>
-#include <float.h>
-
-#include "../libslic3r.h"
-#include "../PrintConfig.hpp"
-#include "../Utils.hpp"
-#include "Print.hpp"
-
-#include <boost/log/trivial.hpp>
-
-#include "Analyzer.hpp"
-#include "PreviewData.hpp"
-
-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::Vec3d DEFAULT_START_POSITION = Slic3r::Vec3d(0.0f, 0.0f, 0.0f);
-static const float DEFAULT_START_EXTRUSION = 0.0f;
-static const float DEFAULT_FAN_SPEED = 0.0f;
-
-namespace Slic3r {
-
-const std::string GCodeAnalyzer::Extrusion_Role_Tag = "_ANALYZER_EXTR_ROLE:";
-const std::string GCodeAnalyzer::Mm3_Per_Mm_Tag = "_ANALYZER_MM3_PER_MM:";
-const std::string GCodeAnalyzer::Width_Tag = "_ANALYZER_WIDTH:";
-const std::string GCodeAnalyzer::Height_Tag = "_ANALYZER_HEIGHT:";
-const std::string GCodeAnalyzer::Color_Change_Tag = "_ANALYZER_COLOR_CHANGE";
-const std::string GCodeAnalyzer::Pause_Print_Tag = "_ANALYZER_PAUSE_PRINT";
-const std::string GCodeAnalyzer::Custom_Code_Tag = "_ANALYZER_CUSTOM_CODE";
-const std::string GCodeAnalyzer::End_Pause_Print_Or_Custom_Code_Tag = "_ANALYZER_END_PAUSE_PRINT_OR_CUSTOM_CODE";
-
-const double GCodeAnalyzer::Default_mm3_per_mm = 0.0;
-const float GCodeAnalyzer::Default_Width = 0.0f;
-const float GCodeAnalyzer::Default_Height = 0.0f;
-
-GCodeAnalyzer::Metadata::Metadata()
- : extrusion_role(erNone)
- , extruder_id(DEFAULT_EXTRUDER_ID)
- , mm3_per_mm(GCodeAnalyzer::Default_mm3_per_mm)
- , width(GCodeAnalyzer::Default_Width)
- , height(GCodeAnalyzer::Default_Height)
- , feedrate(DEFAULT_FEEDRATE)
- , fan_speed(DEFAULT_FAN_SPEED)
- , cp_color_id(DEFAULT_COLOR_PRINT_ID)
-{
-}
-
-GCodeAnalyzer::Metadata::Metadata(ExtrusionRole extrusion_role, unsigned int extruder_id, double mm3_per_mm, float width, float height, float feedrate, float fan_speed, unsigned int cp_color_id/* = 0*/)
- : extrusion_role(extrusion_role)
- , extruder_id(extruder_id)
- , mm3_per_mm(mm3_per_mm)
- , width(width)
- , height(height)
- , feedrate(feedrate)
- , fan_speed(fan_speed)
- , cp_color_id(cp_color_id)
-{
-}
-
-bool GCodeAnalyzer::Metadata::operator != (const GCodeAnalyzer::Metadata& other) const
-{
- if (extrusion_role != other.extrusion_role)
- return true;
-
- if (extruder_id != other.extruder_id)
- return true;
-
- if (mm3_per_mm != other.mm3_per_mm)
- return true;
-
- if (width != other.width)
- return true;
-
- if (height != other.height)
- return true;
-
- if (feedrate != other.feedrate)
- return true;
-
- if (fan_speed != other.fan_speed)
- return true;
-
- if (cp_color_id != other.cp_color_id)
- return true;
-
- return false;
-}
-
-GCodeAnalyzer::GCodeMove::GCodeMove(GCodeMove::EType type, ExtrusionRole extrusion_role, unsigned int extruder_id, double mm3_per_mm, float width, float height, float feedrate, const Vec3d& start_position, const Vec3d& end_position, float delta_extruder, float fan_speed, unsigned int cp_color_id/* = 0*/)
- : type(type)
- , data(extrusion_role, extruder_id, mm3_per_mm, width, height, feedrate, fan_speed, cp_color_id)
- , start_position(start_position)
- , end_position(end_position)
- , delta_extruder(delta_extruder)
-{
-}
-
-GCodeAnalyzer::GCodeMove::GCodeMove(GCodeMove::EType type, const GCodeAnalyzer::Metadata& data, const Vec3d& start_position, const Vec3d& 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<m_extruders_count; i++)
- m_extruder_color[i] = i;
-}
-
-void GCodeAnalyzer::reset()
-{
- _set_units(Millimeters);
- _set_global_positioning_type(Absolute);
- _set_e_local_positioning_type(Absolute);
- _set_extrusion_role(erNone);
- _set_extruder_id(DEFAULT_EXTRUDER_ID);
- _set_cp_color_id(DEFAULT_COLOR_PRINT_ID);
- _set_mm3_per_mm(Default_mm3_per_mm);
- _set_width(Default_Width);
- _set_height(Default_Height);
- _set_feedrate(DEFAULT_FEEDRATE);
- _set_start_position(DEFAULT_START_POSITION);
- _set_start_extrusion(DEFAULT_START_EXTRUSION);
- _set_fan_speed(DEFAULT_FAN_SPEED);
- _reset_axes_position();
- _reset_axes_origin();
- _reset_cached_position();
-
- m_moves_map.clear();
- m_extruder_offsets.clear();
- m_extruders_count = 1;
- m_extruder_color.clear();
-}
-
-const std::string& GCodeAnalyzer::process_gcode(const std::string& gcode)
-{
- m_process_output = "";
-
- m_parser.parse_buffer(gcode,
- [this](GCodeReader& reader, const GCodeReader::GCodeLine& line)
- { this->_process_gcode_line(reader, line); });
-
- return m_process_output;
-}
-
-void GCodeAnalyzer::calc_gcode_preview_data(GCodePreviewData& preview_data, std::function<void()> cancel_callback)
-{
- // resets preview data
- preview_data.reset();
-
- // calculates extrusion layers
- _calc_gcode_preview_extrusion_layers(preview_data, cancel_callback);
-
- // calculates travel
- _calc_gcode_preview_travel(preview_data, cancel_callback);
-
- // calculates retractions
- _calc_gcode_preview_retractions(preview_data, cancel_callback);
-
- // calculates unretractions
- _calc_gcode_preview_unretractions(preview_data, cancel_callback);
-}
-
-bool GCodeAnalyzer::is_valid_extrusion_role(ExtrusionRole role)
-{
- return ((erPerimeter <= role) && (role < erMixed));
-}
-
-void GCodeAnalyzer::_process_gcode_line(GCodeReader&, const GCodeReader::GCodeLine& line)
-{
- // processes 'special' comments contained in line
- if (_process_tags(line))
- {
-#if 0
- // DEBUG ONLY: puts the line back into the gcode
- m_process_output += line.raw() + "\n";
-#endif
- return;
- }
-
- // sets new start position/extrusion
- _set_start_position(_get_end_position());
- _set_start_extrusion(_get_axis_position(E));
-
- // processes 'normal' gcode lines
- std::string cmd = line.cmd();
- if (cmd.length() > 1)
- {
- switch (::toupper(cmd[0]))
- {
- case 'G':
- {
- switch (::atoi(&cmd[1]))
- {
- case 1: // Move
- {
- _processG1(line);
- break;
- }
- case 10: // Retract
- {
- _processG10(line);
- break;
- }
- case 11: // Unretract
- {
- _processG11(line);
- break;
- }
- case 22: // Firmware controlled Retract
- {
- _processG22(line);
- break;
- }
- case 23: // Firmware controlled Unretract
- {
- _processG23(line);
- break;
- }
- case 90: // Set to Absolute Positioning
- {
- _processG90(line);
- break;
- }
- case 91: // Set to Relative Positioning
- {
- _processG91(line);
- break;
- }
- case 92: // Set Position
- {
- _processG92(line);
- break;
- }
- }
-
- break;
- }
- case 'M':
- {
- switch (::atoi(&cmd[1]))
- {
- case 82: // Set extruder to absolute mode
- {
- _processM82(line);
- break;
- }
- case 83: // Set extruder to relative mode
- {
- _processM83(line);
- break;
- }
- case 106: // Set fan speed
- {
- _processM106(line);
- break;
- }
- case 107: // Disable fan
- {
- _processM107(line);
- break;
- }
- case 108:
- case 135:
- {
- // these are used by MakerWare and Sailfish firmwares
- // for tool changing - we can process it in one place
- _processM108orM135(line);
- break;
- }
- case 132: // Recall stored home offsets
- {
- _processM132(line);
- break;
- }
- case 401: // Repetier: Store x, y and z position
- {
- _processM401(line);
- break;
- }
- case 402: // Repetier: Go to stored position
- {
- _processM402(line);
- break;
- }
- }
-
- break;
- }
- case 'T': // Select Tools
- {
- _processT(line);
- break;
- }
- }
- }
-
- // puts the line back into the gcode
- m_process_output += line.raw() + "\n";
-}
-
-void GCodeAnalyzer::_processG1(const GCodeReader::GCodeLine& line)
-{
- auto axis_absolute_position = [this](GCodeAnalyzer::EAxis axis, const GCodeReader::GCodeLine& lineG1) -> float
- {
- bool is_relative = (_get_global_positioning_type() == Relative);
- if (axis == E)
- is_relative |= (_get_e_local_positioning_type() == Relative);
-
- if (lineG1.has(Slic3r::Axis(axis)))
- {
- float lengthsScaleFactor = (_get_units() == GCodeAnalyzer::Inches) ? INCHES_TO_MM : 1.0f;
- float ret = lineG1.value(Slic3r::Axis(axis)) * lengthsScaleFactor;
- return is_relative ? _get_axis_position(axis) + ret : _get_axis_origin(axis) + ret;
- }
- else
- return _get_axis_position(axis);
- };
-
- // updates axes positions from line
-
- float new_pos[Num_Axis];
- for (unsigned char a = X; a < Num_Axis; ++a)
- {
- new_pos[a] = axis_absolute_position((EAxis)a, line);
- }
-
- // updates feedrate from line, if present
- if (line.has_f())
- _set_feedrate(line.f() * MMMIN_TO_MMSEC);
-
- // calculates movement deltas
- float delta_pos[Num_Axis];
- for (unsigned char a = X; a < Num_Axis; ++a)
- {
- delta_pos[a] = new_pos[a] - _get_axis_position((EAxis)a);
- }
-
- // Detects move type
- GCodeMove::EType type = GCodeMove::Noop;
-
- if (delta_pos[E] < 0.0f)
- {
- if ((delta_pos[X] != 0.0f) || (delta_pos[Y] != 0.0f) || (delta_pos[Z] != 0.0f))
- type = GCodeMove::Move;
- else
- type = GCodeMove::Retract;
- }
- else if (delta_pos[E] > 0.0f)
- {
- if ((delta_pos[X] == 0.0f) && (delta_pos[Y] == 0.0f) && (delta_pos[Z] == 0.0f))
- type = GCodeMove::Unretract;
- else if ((delta_pos[X] != 0.0f) || (delta_pos[Y] != 0.0f))
- type = GCodeMove::Extrude;
- }
- else if ((delta_pos[X] != 0.0f) || (delta_pos[Y] != 0.0f) || (delta_pos[Z] != 0.0f))
- type = GCodeMove::Move;
-
- ExtrusionRole role = _get_extrusion_role();
- if ((type == GCodeMove::Extrude) && ((_get_width() == 0.0f) || (_get_height() == 0.0f) || !is_valid_extrusion_role(role)))
- type = GCodeMove::Move;
-
- // updates axis positions
- for (unsigned char a = X; a < Num_Axis; ++a)
- {
- _set_axis_position((EAxis)a, new_pos[a]);
- }
-
- // stores the move
- if (type != GCodeMove::Noop)
- _store_move(type);
-}
-
-void GCodeAnalyzer::_processG10(const GCodeReader::GCodeLine& line)
-{
- // stores retract move
- _store_move(GCodeMove::Retract);
-}
-
-void GCodeAnalyzer::_processG11(const GCodeReader::GCodeLine& line)
-{
- // stores unretract move
- _store_move(GCodeMove::Unretract);
-}
-
-void GCodeAnalyzer::_processG22(const GCodeReader::GCodeLine& line)
-{
- // stores retract move
- _store_move(GCodeMove::Retract);
-}
-
-void GCodeAnalyzer::_processG23(const GCodeReader::GCodeLine& line)
-{
- // stores unretract move
- _store_move(GCodeMove::Unretract);
-}
-
-void GCodeAnalyzer::_processG90(const GCodeReader::GCodeLine& line)
-{
- _set_global_positioning_type(Absolute);
-}
-
-void GCodeAnalyzer::_processG91(const GCodeReader::GCodeLine& line)
-{
- _set_global_positioning_type(Relative);
-}
-
-void GCodeAnalyzer::_processG92(const GCodeReader::GCodeLine& line)
-{
- float lengthsScaleFactor = (_get_units() == Inches) ? INCHES_TO_MM : 1.0f;
- bool anyFound = false;
-
- if (line.has_x())
- {
- _set_axis_origin(X, _get_axis_position(X) - line.x() * lengthsScaleFactor);
- anyFound = true;
- }
-
- if (line.has_y())
- {
- _set_axis_origin(Y, _get_axis_position(Y) - line.y() * lengthsScaleFactor);
- anyFound = true;
- }
-
- if (line.has_z())
- {
- _set_axis_origin(Z, _get_axis_position(Z) - line.z() * lengthsScaleFactor);
- anyFound = true;
- }
-
- if (line.has_e())
- {
- // extruder coordinate can grow to the point where its float representation does not allow for proper addition with small increments,
- // we set the value taken from the G92 line as the new current position for it
- _set_axis_position(E, line.e() * lengthsScaleFactor);
- anyFound = true;
- }
-
- if (!anyFound && ! line.has_unknown_axis())
- {
- // The G92 may be called for axes that PrusaSlicer does not recognize, for example see GH issue #3510,
- // where G92 A0 B0 is called although the extruder axis is till E.
- for (unsigned char a = X; a < Num_Axis; ++a)
- {
- _set_axis_origin((EAxis)a, _get_axis_position((EAxis)a));
- }
- }
-}
-
-void GCodeAnalyzer::_processM82(const GCodeReader::GCodeLine& line)
-{
- _set_e_local_positioning_type(Absolute);
-}
-
-void GCodeAnalyzer::_processM83(const GCodeReader::GCodeLine& line)
-{
- _set_e_local_positioning_type(Relative);
-}
-
-void GCodeAnalyzer::_processM106(const GCodeReader::GCodeLine& line)
-{
- if (!line.has('P'))
- {
- // The absence of P means the print cooling fan, so ignore anything else.
- float new_fan_speed;
- if (line.has_value('S', new_fan_speed))
- _set_fan_speed((100.0f / 255.0f) * new_fan_speed);
- else
- _set_fan_speed(100.0f);
- }
-}
-
-void GCodeAnalyzer::_processM107(const GCodeReader::GCodeLine& line)
-{
- _set_fan_speed(0.0f);
-}
-
-void GCodeAnalyzer::_processM108orM135(const GCodeReader::GCodeLine& line)
-{
- // These M-codes are used by MakerWare and Sailfish to change active tool.
- // They have to be processed otherwise toolchanges will be unrecognised
- // by the analyzer - see https://github.com/prusa3d/PrusaSlicer/issues/2566
-
- size_t code = ::atoi(&(line.cmd()[1]));
- if ((code == 108 && m_gcode_flavor == gcfSailfish)
- || (code == 135 && m_gcode_flavor == gcfMakerWare)) {
-
- std::string cmd = line.raw();
- size_t T_pos = cmd.find("T");
- if (T_pos != std::string::npos) {
- cmd = cmd.substr(T_pos);
- _processT(cmd);
- }
- }
-}
-
-void GCodeAnalyzer::_processM132(const GCodeReader::GCodeLine& line)
-{
- // This command is used by Makerbot to load the current home position from EEPROM
- // see: https://github.com/makerbot/s3g/blob/master/doc/GCodeProtocol.md
- // Using this command to reset the axis origin to zero helps in fixing: https://github.com/prusa3d/PrusaSlicer/issues/3082
-
- if (line.has_x())
- _set_axis_origin(X, 0.0f);
-
- if (line.has_y())
- _set_axis_origin(Y, 0.0f);
-
- if (line.has_z())
- _set_axis_origin(Z, 0.0f);
-
- if (line.has_e())
- _set_axis_origin(E, 0.0f);
-}
-
-void GCodeAnalyzer::_processM401(const GCodeReader::GCodeLine& line)
-{
- if (m_gcode_flavor != gcfRepetier)
- return;
-
- for (unsigned char a = 0; a <= 3; ++a)
- {
- _set_cached_position(a, _get_axis_position((EAxis)a));
- }
- _set_cached_position(4, _get_feedrate());
-}
-
-void GCodeAnalyzer::_processM402(const GCodeReader::GCodeLine& line)
-{
- if (m_gcode_flavor != gcfRepetier)
- return;
-
- // see for reference:
- // https://github.com/repetier/Repetier-Firmware/blob/master/src/ArduinoAVR/Repetier/Printer.cpp
- // void Printer::GoToMemoryPosition(bool x, bool y, bool z, bool e, float feed)
-
- bool has_xyz = !(line.has_x() || line.has_y() || line.has_z());
-
- float p = FLT_MAX;
- for (unsigned char a = X; a <= Z; ++a)
- {
- if (has_xyz || line.has(a))
- {
- p = _get_cached_position(a);
- if (p != FLT_MAX)
- _set_axis_position((EAxis)a, p);
- }
- }
-
- p = _get_cached_position(E);
- if (p != FLT_MAX)
- _set_axis_position(E, p);
-
- p = FLT_MAX;
- if (!line.has_value(4, p))
- p = _get_cached_position(4);
-
- if (p != FLT_MAX)
- _set_feedrate(p);
-}
-
-void GCodeAnalyzer::_reset_cached_position()
-{
- for (unsigned char a = 0; a <= 4; ++a)
- {
- m_state.cached_position[a] = FLT_MAX;
- }
-}
-
-void GCodeAnalyzer::_processT(const std::string& cmd)
-{
- if (cmd.length() > 1)
- {
- unsigned int id = (unsigned int)::strtol(cmd.substr(1).c_str(), nullptr, 10);
- if (_get_extruder_id() != id)
- {
- if (id >= m_extruders_count)
- {
- if (m_extruders_count > 1)
- BOOST_LOG_TRIVIAL(error) << "GCodeAnalyzer encountered an invalid toolchange, maybe from a custom gcode.";
- }
- else
- {
- _set_extruder_id(id);
- if (_get_cp_color_id() != INT_MAX)
- _set_cp_color_id(m_extruder_color[id]);
- }
-
- // stores tool change move
- _store_move(GCodeMove::Tool_change);
- }
- }
-}
-
-void GCodeAnalyzer::_processT(const GCodeReader::GCodeLine& line)
-{
- _processT(line.cmd());
-}
-
-bool GCodeAnalyzer::_process_tags(const GCodeReader::GCodeLine& line)
-{
- std::string comment = line.comment();
-
- // extrusion role tag
- size_t pos = comment.find(Extrusion_Role_Tag);
- if (pos != comment.npos)
- {
- _process_extrusion_role_tag(comment, pos);
- return true;
- }
-
- // mm3 per mm tag
- pos = comment.find(Mm3_Per_Mm_Tag);
- if (pos != comment.npos)
- {
- _process_mm3_per_mm_tag(comment, pos);
- return true;
- }
-
- // width tag
- pos = comment.find(Width_Tag);
- if (pos != comment.npos)
- {
- _process_width_tag(comment, pos);
- return true;
- }
-
- // height tag
- pos = comment.find(Height_Tag);
- if (pos != comment.npos)
- {
- _process_height_tag(comment, pos);
- return true;
- }
-
- // color change tag
- pos = comment.find(Color_Change_Tag);
- if (pos != comment.npos)
- {
- pos = comment.find_last_of(",T");
- int extruder = pos == comment.npos ? 0 : std::atoi(comment.substr(pos + 1, comment.npos).c_str());
- _process_color_change_tag(extruder);
- return true;
- }
-
- // color change tag
- pos = comment.find(Pause_Print_Tag);
- if (pos != comment.npos)
- {
- _process_pause_print_or_custom_code_tag();
- return true;
- }
-
- // color change tag
- pos = comment.find(Custom_Code_Tag);
- if (pos != comment.npos)
- {
- _process_pause_print_or_custom_code_tag();
- return true;
- }
-
- // color change 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(::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(int 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(double value)
-{
- m_state.data.mm3_per_mm = value;
-}
-
-double GCodeAnalyzer::_get_mm3_per_mm() const
-{
- return m_state.data.mm3_per_mm;
-}
-
-void GCodeAnalyzer::_set_width(float width)
-{
- m_state.data.width = width;
-}
-
-float GCodeAnalyzer::_get_width() const
-{
- return m_state.data.width;
-}
-
-void GCodeAnalyzer::_set_height(float height)
-{
- m_state.data.height = height;
-}
-
-float GCodeAnalyzer::_get_height() const
-{
- return m_state.data.height;
-}
-
-void GCodeAnalyzer::_set_feedrate(float feedrate_mm_sec)
-{
- m_state.data.feedrate = feedrate_mm_sec;
-}
-
-float GCodeAnalyzer::_get_feedrate() const
-{
- return m_state.data.feedrate;
-}
-
-void GCodeAnalyzer::_set_fan_speed(float fan_speed_percentage)
-{
- m_state.data.fan_speed = fan_speed_percentage;
-}
-
-float GCodeAnalyzer::_get_fan_speed() const
-{
- return m_state.data.fan_speed;
-}
-
-void GCodeAnalyzer::_set_axis_position(EAxis axis, float position)
-{
- m_state.position[axis] = position;
-}
-
-float GCodeAnalyzer::_get_axis_position(EAxis axis) const
-{
- return m_state.position[axis];
-}
-
-void GCodeAnalyzer::_set_axis_origin(EAxis axis, float position)
-{
- m_state.origin[axis] = position;
-}
-
-float GCodeAnalyzer::_get_axis_origin(EAxis axis) const
-{
- return m_state.origin[axis];
-}
-
-void GCodeAnalyzer::_reset_axes_position()
-{
- ::memset((void*)m_state.position, 0, Num_Axis * sizeof(float));
-}
-
-void GCodeAnalyzer::_reset_axes_origin()
-{
- ::memset((void*)m_state.origin, 0, Num_Axis * sizeof(float));
-}
-
-void GCodeAnalyzer::_set_start_position(const Vec3d& position)
-{
- m_state.start_position = position;
-}
-
-const Vec3d& 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;
-}
-
-Vec3d GCodeAnalyzer::_get_end_position() const
-{
- return Vec3d(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
- Vec3d extruder_offset = Vec3d::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 = Vec3d(extr_it->second(0), extr_it->second(1), 0.0);
-
- Vec3d start_position = _get_start_position() + extruder_offset;
- Vec3d end_position = _get_end_position() + extruder_offset;
- it->second.emplace_back(type, _get_extrusion_role(), extruder_id, _get_mm3_per_mm(), _get_width(), _get_height(), _get_feedrate(), start_position, end_position, _get_delta_extrusion(), _get_fan_speed(), _get_cp_color_id());
-}
-
-bool GCodeAnalyzer::_is_valid_extrusion_role(int value) const
-{
- return ((int)erNone <= value) && (value <= (int)erMixed);
-}
-
-void GCodeAnalyzer::_calc_gcode_preview_extrusion_layers(GCodePreviewData& preview_data, std::function<void()> 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 = float(data.mm3_per_mm);
- path.width = data.width;
- path.height = data.height;
- path.feedrate = data.feedrate;
- path.extruder_id = data.extruder_id;
- path.cp_color_id = data.cp_color_id;
- path.fan_speed = data.fan_speed;
- }
- }
- };
-
- TypeToMovesMap::iterator extrude_moves = m_moves_map.find(GCodeMove::Extrude);
- if (extrude_moves == m_moves_map.end())
- return;
-
- Metadata data;
- float z = FLT_MAX;
- Polyline polyline;
- Vec3d position(FLT_MAX, FLT_MAX, FLT_MAX);
- float volumetric_rate = FLT_MAX;
- GCodePreviewData::Range height_range;
- GCodePreviewData::Range width_range;
- GCodePreviewData::MultiRange<GCodePreviewData::FeedrateKind> feedrate_range;
- GCodePreviewData::Range volumetric_rate_range;
- GCodePreviewData::Range fan_speed_range;
-
- // to avoid to call the callback too often
- unsigned int cancel_callback_threshold = (unsigned int)std::max((int)extrude_moves->second.size() / 25, 1);
- unsigned int cancel_callback_curr = 0;
-
- // constructs the polylines while traversing the moves
- for (const GCodeMove& move : extrude_moves->second)
- {
- // to avoid to call the callback too often
- cancel_callback_curr = (cancel_callback_curr + 1) % cancel_callback_threshold;
- if (cancel_callback_curr == 0)
- cancel_callback();
-
- if ((data != move.data) || (z != move.start_position.z()) || (position != move.start_position) || (volumetric_rate != move.data.feedrate * (float)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 * (float)move.data.mm3_per_mm;
- height_range.update_from(move.data.height);
- width_range.update_from(move.data.width);
- feedrate_range.update_from(move.data.feedrate, GCodePreviewData::FeedrateKind::EXTRUSION);
- volumetric_rate_range.update_from(volumetric_rate);
- fan_speed_range.update_from(move.data.fan_speed);
- }
- else
- // append end vertex of the move to current polyline
- polyline.append(Point(scale_(move.end_position.x()), scale_(move.end_position.y())));
-
- // update current values
- position = move.end_position;
- }
-
- // store last polyline
- polyline.remove_duplicate_points();
- Helper::store_polyline(polyline, data, z, preview_data);
-
- // updates preview ranges data
- preview_data.ranges.height.update_from(height_range);
- preview_data.ranges.width.update_from(width_range);
- preview_data.ranges.feedrate.update_from(feedrate_range);
- preview_data.ranges.volumetric_rate.update_from(volumetric_rate_range);
- preview_data.ranges.fan_speed.update_from(fan_speed_range);
-
- // we need to sort the layers by their z as they can be shuffled in case of sequential prints
- std::sort(preview_data.extrusion.layers.begin(), preview_data.extrusion.layers.end(), [](const GCodePreviewData::Extrusion::Layer& l1, const GCodePreviewData::Extrusion::Layer& l2)->bool { return l1.z < l2.z; });
-}
-
-void GCodeAnalyzer::_calc_gcode_preview_travel(GCodePreviewData& preview_data, std::function<void()> 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;
- Vec3d 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<GCodePreviewData::FeedrateKind> 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<double>(p1.polyline.bounding_box().min(2)) < unscale<double>(p2.polyline.bounding_box().min(2)); });
-}
-
-void GCodeAnalyzer::_calc_gcode_preview_retractions(GCodePreviewData& preview_data, std::function<void()> 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<double>(p1.position(2)) < unscale<double>(p2.position(2)); });
-}
-
-void GCodeAnalyzer::_calc_gcode_preview_unretractions(GCodePreviewData& preview_data, std::function<void()> 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<double>(p1.position(2)) < unscale<double>(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<GCodeMove::EType, GCodeMovesList> &kvp : m_moves_map)
- out += sizeof(kvp) + SLIC3R_STDVEC_MEMSIZE(kvp.second, GCodeMove);
- out += m_process_output.size();
- return out;
-}
-
-} // namespace Slic3r
diff --git a/src/libslic3r/GCode/Analyzer.hpp b/src/libslic3r/GCode/Analyzer.hpp
deleted file mode 100644
index 781c3f265..000000000
--- a/src/libslic3r/GCode/Analyzer.hpp
+++ /dev/null
@@ -1,305 +0,0 @@
-#ifndef slic3r_GCode_Analyzer_hpp_
-#define slic3r_GCode_Analyzer_hpp_
-
-#include "../libslic3r.h"
-#include "../PrintConfig.hpp"
-#include "../ExtrusionEntity.hpp"
-
-#include "../Point.hpp"
-#include "../GCodeReader.hpp"
-
-namespace Slic3r {
-
-class GCodePreviewData;
-
-class GCodeAnalyzer
-{
-public:
- static const std::string Extrusion_Role_Tag;
- static const std::string Mm3_Per_Mm_Tag;
- static const std::string Width_Tag;
- static const std::string Height_Tag;
- static const std::string Color_Change_Tag;
- static const std::string Pause_Print_Tag;
- static const std::string Custom_Code_Tag;
- static const std::string End_Pause_Print_Or_Custom_Code_Tag;
-
- static const double 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;
- double mm3_per_mm;
- float width; // mm
- float height; // mm
- float feedrate; // mm/s
- float fan_speed; // percentage
- unsigned int cp_color_id;
-
- Metadata();
- Metadata(ExtrusionRole extrusion_role, unsigned int extruder_id, double mm3_per_mm, float width, float height, float feedrate, float fan_speed, unsigned int cp_color_id = 0);
-
- bool operator != (const Metadata& other) const;
- };
-
- struct GCodeMove
- {
- enum EType : unsigned char
- {
- Noop,
- Retract,
- Unretract,
- Tool_change,
- Move,
- Extrude,
- Num_Types
- };
-
- EType type;
- Metadata data;
- Vec3d start_position;
- Vec3d end_position;
- float delta_extruder;
-
- GCodeMove(EType type, ExtrusionRole extrusion_role, unsigned int extruder_id, double mm3_per_mm, float width, float height, float feedrate, const Vec3d& start_position, const Vec3d& end_position, float delta_extruder, float fan_speed, unsigned int cp_color_id = 0);
- GCodeMove(EType type, const Metadata& data, const Vec3d& start_position, const Vec3d& end_position, float delta_extruder);
- };
-
- typedef std::vector<GCodeMove> GCodeMovesList;
- typedef std::map<GCodeMove::EType, GCodeMovesList> TypeToMovesMap;
- typedef std::map<unsigned int, Vec2d> ExtruderOffsetsMap;
- typedef std::map<unsigned int, unsigned int> ExtruderToColorMap;
-
-private:
- struct State
- {
- EUnits units;
- EPositioningType global_positioning_type;
- EPositioningType e_local_positioning_type;
- Metadata data;
- Vec3d start_position = Vec3d::Zero();
- float cached_position[5];
- float start_extrusion;
- float position[Num_Axis];
- float origin[Num_Axis];
- unsigned int cp_color_counter = 0;
- };
-
-private:
- State m_state;
- GCodeReader m_parser;
- TypeToMovesMap m_moves_map;
- ExtruderOffsetsMap m_extruder_offsets;
- unsigned int m_extruders_count;
- GCodeFlavor m_gcode_flavor;
-
- ExtruderToColorMap m_extruder_color;
-
- // The output of process_layer()
- std::string m_process_output;
-
-public:
- GCodeAnalyzer() { reset(); }
-
- void set_extruder_offsets(const ExtruderOffsetsMap& extruder_offsets) { m_extruder_offsets = extruder_offsets; }
- void set_extruders_count(unsigned int count);
-
- void set_extrusion_axis(char axis) { m_parser.set_extrusion_axis(axis); }
-
- void set_gcode_flavor(const GCodeFlavor& flavor) { m_gcode_flavor = flavor; }
-
- // Reinitialize the analyzer
- void reset();
-
- // Adds the gcode contained in the given string to the analysis and returns it after removing the workcodes
- const std::string& process_gcode(const std::string& gcode);
-
- // Calculates all data needed for gcode visualization
- // throws CanceledException through print->throw_if_canceled() (sent by the caller as callback).
- void calc_gcode_preview_data(GCodePreviewData& preview_data, std::function<void()> cancel_callback = std::function<void()>());
-
- // Return an estimate of the memory consumed by the time estimator.
- size_t memory_used() const;
-
- static bool is_valid_extrusion_role(ExtrusionRole role);
-
-private:
- // Processes the given gcode line
- void _process_gcode_line(GCodeReader& reader, const GCodeReader::GCodeLine& line);
-
- // Move
- void _processG1(const GCodeReader::GCodeLine& line);
-
- // Retract
- void _processG10(const GCodeReader::GCodeLine& line);
-
- // Unretract
- void _processG11(const GCodeReader::GCodeLine& line);
-
- // Firmware controlled Retract
- void _processG22(const GCodeReader::GCodeLine& line);
-
- // Firmware controlled Unretract
- void _processG23(const GCodeReader::GCodeLine& line);
-
- // Set to Absolute Positioning
- void _processG90(const GCodeReader::GCodeLine& line);
-
- // Set to Relative Positioning
- void _processG91(const GCodeReader::GCodeLine& line);
-
- // Set Position
- void _processG92(const GCodeReader::GCodeLine& line);
-
- // Set extruder to absolute mode
- void _processM82(const GCodeReader::GCodeLine& line);
-
- // Set extruder to relative mode
- void _processM83(const GCodeReader::GCodeLine& line);
-
- // Set fan speed
- void _processM106(const GCodeReader::GCodeLine& line);
-
- // Disable fan
- void _processM107(const GCodeReader::GCodeLine& line);
-
- // Set tool (MakerWare and Sailfish flavor)
- void _processM108orM135(const GCodeReader::GCodeLine& line);
-
- // Recall stored home offsets
- void _processM132(const GCodeReader::GCodeLine& line);
-
- // Repetier: Store x, y and z position
- void _processM401(const GCodeReader::GCodeLine& line);
-
- // Repetier: Go to stored position
- void _processM402(const GCodeReader::GCodeLine& line);
-
- // Processes T line (Select Tool)
- void _processT(const std::string& command);
- void _processT(const GCodeReader::GCodeLine& line);
-
- // Processes the tags
- // Returns true if any tag has been processed
- bool _process_tags(const GCodeReader::GCodeLine& line);
-
- // Processes extrusion role tag
- void _process_extrusion_role_tag(const std::string& comment, size_t pos);
-
- // Processes mm3_per_mm tag
- void _process_mm3_per_mm_tag(const std::string& comment, size_t pos);
-
- // Processes width tag
- void _process_width_tag(const std::string& comment, size_t pos);
-
- // Processes height tag
- void _process_height_tag(const std::string& comment, size_t pos);
-
- // Processes color change tag
- void _process_color_change_tag(int 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(double value);
- double _get_mm3_per_mm() const;
-
- void _set_width(float width);
- float _get_width() const;
-
- void _set_height(float height);
- float _get_height() const;
-
- void _set_feedrate(float feedrate_mm_sec);
- float _get_feedrate() const;
-
- void _set_fan_speed(float fan_speed_percentage);
- float _get_fan_speed() const;
-
- void _set_axis_position(EAxis axis, float position);
- float _get_axis_position(EAxis axis) const;
-
- void _set_axis_origin(EAxis axis, float position);
- float _get_axis_origin(EAxis axis) const;
-
- // Sets axes position to zero
- void _reset_axes_position();
- // Sets origin position to zero
- void _reset_axes_origin();
-
- void _set_start_position(const Vec3d& position);
- const Vec3d& _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[])
- Vec3d _get_end_position() const;
-
- // Adds a new move with the given data
- void _store_move(GCodeMove::EType type);
-
- // Checks if the given int is a valid extrusion role (contained into enum ExtrusionRole)
- bool _is_valid_extrusion_role(int value) const;
-
- // All the following methods throw CanceledException through print->throw_if_canceled() (sent by the caller as callback).
- void _calc_gcode_preview_extrusion_layers(GCodePreviewData& preview_data, std::function<void()> cancel_callback);
- void _calc_gcode_preview_travel(GCodePreviewData& preview_data, std::function<void()> cancel_callback);
- void _calc_gcode_preview_retractions(GCodePreviewData& preview_data, std::function<void()> cancel_callback);
- void _calc_gcode_preview_unretractions(GCodePreviewData& preview_data, std::function<void()> cancel_callback);
-};
-
-} // namespace Slic3r
-
-#endif /* slic3r_GCode_Analyzer_hpp_ */
diff --git a/src/libslic3r/GCode/AvoidCrossingPerimeters.cpp b/src/libslic3r/GCode/AvoidCrossingPerimeters.cpp
new file mode 100644
index 000000000..f1d895372
--- /dev/null
+++ b/src/libslic3r/GCode/AvoidCrossingPerimeters.cpp
@@ -0,0 +1,1377 @@
+#include "../Layer.hpp"
+#include "../GCode.hpp"
+#include "../EdgeGrid.hpp"
+#include "../Print.hpp"
+#include "../Polygon.hpp"
+#include "../ExPolygon.hpp"
+#include "../Geometry.hpp"
+#include "../ClipperUtils.hpp"
+#include "../SVG.hpp"
+#include "AvoidCrossingPerimeters.hpp"
+
+#include <numeric>
+#include <unordered_set>
+
+namespace Slic3r {
+
+struct TravelPoint
+{
+ Point point;
+ // Index of the polygon containing this point. A negative value indicates that the point is not on any border.
+ int border_idx;
+};
+
+struct Intersection
+{
+ // Index of the polygon containing this point of intersection.
+ size_t border_idx;
+ // Index of the line on the polygon containing this point of intersection.
+ size_t line_idx;
+ // Point of intersection.
+ Point point;
+ // Distance from the first point in the corresponding boundary
+ float distance;
+};
+
+// Finding all intersections of a set of contours with a line segment.
+struct AllIntersectionsVisitor
+{
+ AllIntersectionsVisitor(const EdgeGrid::Grid &grid, std::vector<Intersection> &intersections) : grid(grid), intersections(intersections)
+ {
+ intersection_set.reserve(intersections.capacity());
+ }
+
+ AllIntersectionsVisitor(const EdgeGrid::Grid &grid, std::vector<Intersection> &intersections, const Line &travel_line)
+ : grid(grid), intersections(intersections), travel_line(travel_line)
+ {
+ intersection_set.reserve(intersections.capacity());
+ }
+
+ void reset() {
+ intersection_set.clear();
+ }
+
+ bool operator()(coord_t iy, coord_t ix)
+ {
+ // Called with a row and colum of the grid cell, which is intersected by a line.
+ auto cell_data_range = grid.cell_data_range(iy, ix);
+ for (auto it_contour_and_segment = cell_data_range.first; it_contour_and_segment != cell_data_range.second; ++it_contour_and_segment) {
+ Point intersection_point;
+ if (travel_line.intersection(grid.line(*it_contour_and_segment), &intersection_point) &&
+ intersection_set.find(*it_contour_and_segment) == intersection_set.end()) {
+ intersections.push_back({ it_contour_and_segment->first, it_contour_and_segment->second, intersection_point });
+ intersection_set.insert(*it_contour_and_segment);
+ }
+ }
+ // Continue traversing the grid along the edge.
+ return true;
+ }
+
+ const EdgeGrid::Grid &grid;
+ std::vector<Intersection> &intersections;
+ Line travel_line;
+ std::unordered_set<std::pair<size_t, size_t>, boost::hash<std::pair<size_t, size_t>>> intersection_set;
+};
+
+// Visitor to check for any collision of a line segment with any contour stored inside the edge_grid.
+struct FirstIntersectionVisitor
+{
+ explicit FirstIntersectionVisitor(const EdgeGrid::Grid &grid) : grid(grid) {}
+
+ bool operator()(coord_t iy, coord_t ix)
+ {
+ assert(pt_current != nullptr);
+ assert(pt_next != nullptr);
+ // Called with a row and colum of the grid cell, which is intersected by a line.
+ auto cell_data_range = grid.cell_data_range(iy, ix);
+ this->intersect = false;
+ for (auto it_contour_and_segment = cell_data_range.first; it_contour_and_segment != cell_data_range.second; ++it_contour_and_segment) {
+ // End points of the line segment and their vector.
+ auto segment = grid.segment(*it_contour_and_segment);
+ if (Geometry::segments_intersect(segment.first, segment.second, *pt_current, *pt_next)) {
+ this->intersect = true;
+ return false;
+ }
+ }
+ // Continue traversing the grid along the edge.
+ return true;
+ }
+
+ const EdgeGrid::Grid &grid;
+ const Slic3r::Point *pt_current = nullptr;
+ const Slic3r::Point *pt_next = nullptr;
+ bool intersect = false;
+};
+
+// point_idx is the index from which is different vertex is searched.
+template<bool forward>
+static Point find_first_different_vertex(const Polygon &polygon, const size_t point_idx, const Point &point)
+{
+ assert(point_idx < polygon.size());
+ // Solve case when vertex on passed index point_idx is different that pass point. This helps the following code keep simple.
+ if (point != polygon.points[point_idx])
+ return polygon.points[point_idx];
+
+ auto line_idx = (int(point_idx) + 1) % int(polygon.points.size());
+ assert(line_idx != int(point_idx));
+ if constexpr (forward)
+ for (; point == polygon.points[line_idx] && line_idx != int(point_idx); line_idx = line_idx + 1 < int(polygon.points.size()) ? line_idx + 1 : 0);
+ else
+ for (; point == polygon.points[line_idx] && line_idx != int(point_idx); line_idx = line_idx - 1 >= 0 ? line_idx - 1 : int(polygon.points.size()) - 1);
+ assert(point != polygon.points[line_idx]);
+ return polygon.points[line_idx];
+}
+
+static Vec2d three_points_inward_normal(const Point &left, const Point &middle, const Point &right)
+{
+ assert(left != middle);
+ assert(middle != right);
+ return (perp(Point(middle - left)).cast<double>().normalized() + perp(Point(right - middle)).cast<double>().normalized()).normalized();
+}
+
+// Compute normal of the polygon's vertex in an inward direction
+static Vec2d get_polygon_vertex_inward_normal(const Polygon &polygon, const size_t point_idx)
+{
+ const size_t left_idx = prev_idx_modulo(point_idx, polygon.points);
+ const size_t right_idx = next_idx_modulo(point_idx, polygon.points);
+ const Point &middle = polygon.points[point_idx];
+ const Point &left = find_first_different_vertex<false>(polygon, left_idx, middle);
+ const Point &right = find_first_different_vertex<true>(polygon, right_idx, middle);
+ return three_points_inward_normal(left, middle, right);
+}
+
+// Compute offset of point_idx of the polygon in a direction of inward normal
+static Point get_polygon_vertex_offset(const Polygon &polygon, const size_t point_idx, const int offset)
+{
+ return polygon.points[point_idx] + (get_polygon_vertex_inward_normal(polygon, point_idx) * double(offset)).cast<coord_t>();
+}
+
+// Compute offset (in the direction of inward normal) of the point(passed on "middle") based on the nearest points laying on the polygon (left_idx and right_idx).
+static Point get_middle_point_offset(const Polygon &polygon, const size_t left_idx, const size_t right_idx, const Point &middle, const coord_t offset)
+{
+ const Point &left = find_first_different_vertex<false>(polygon, left_idx, middle);
+ const Point &right = find_first_different_vertex<true>(polygon, right_idx, middle);
+ return middle + (three_points_inward_normal(left, middle, right) * double(offset)).cast<coord_t>();
+}
+
+static Polyline to_polyline(const std::vector<TravelPoint> &travel)
+{
+ Polyline result;
+ result.points.reserve(travel.size());
+ for (const TravelPoint &t_point : travel)
+ result.append(t_point.point);
+ return result;
+}
+
+// #define AVOID_CROSSING_PERIMETERS_DEBUG_OUTPUT
+
+#ifdef AVOID_CROSSING_PERIMETERS_DEBUG_OUTPUT
+static void export_travel_to_svg(const Polygons &boundary,
+ const Line &original_travel,
+ const Polyline &result_travel,
+ const std::vector<Intersection> &intersections,
+ const std::string &path)
+{
+ BoundingBox bbox = get_extents(boundary);
+ ::Slic3r::SVG svg(path, bbox);
+ svg.draw_outline(boundary, "green");
+ svg.draw(original_travel, "blue");
+ svg.draw(result_travel, "red");
+ svg.draw(original_travel.a, "black");
+ svg.draw(original_travel.b, "grey");
+
+ for (const Intersection &intersection : intersections)
+ svg.draw(intersection.point, "lightseagreen");
+}
+
+static void export_travel_to_svg(const Polygons &boundary,
+ const Line &original_travel,
+ const std::vector<TravelPoint> &result_travel,
+ const std::vector<Intersection> &intersections,
+ const std::string &path)
+{
+ export_travel_to_svg(boundary, original_travel, to_polyline(result_travel), intersections, path);
+}
+#endif /* AVOID_CROSSING_PERIMETERS_DEBUG_OUTPUT */
+
+// Returns a direction of the shortest path along the polygon boundary
+enum class Direction { Forward, Backward };
+// Returns a direction of the shortest path along the polygon boundary
+static Direction get_shortest_direction(const AvoidCrossingPerimeters::Boundary &boundary,
+ const Intersection &intersection_first,
+ const Intersection &intersection_second,
+ float contour_length)
+{
+ assert(intersection_first.border_idx == intersection_second.border_idx);
+ const Polygon &poly = boundary.boundaries[intersection_first.border_idx];
+ float dist_first = intersection_first.distance;
+ float dist_second = intersection_second.distance;
+
+ assert(dist_first >= 0.f && dist_first <= contour_length);
+ assert(dist_second >= 0.f && dist_second <= contour_length);
+
+ bool reversed = false;
+ if (dist_first > dist_second) {
+ std::swap(dist_first, dist_second);
+ reversed = true;
+ }
+ float total_length_forward = dist_second - dist_first;
+ float total_length_backward = dist_first + contour_length - dist_second;
+ if (reversed) std::swap(total_length_forward, total_length_backward);
+
+ total_length_forward -= (intersection_first.point - poly[intersection_first.line_idx]).cast<float>().norm();
+ total_length_backward -= (poly[(intersection_first.line_idx + 1) % poly.size()] - intersection_first.point).cast<float>().norm();
+
+ total_length_forward -= (poly[(intersection_second.line_idx + 1) % poly.size()] - intersection_second.point).cast<float>().norm();
+ total_length_backward -= (intersection_second.point - poly[intersection_second.line_idx]).cast<float>().norm();
+
+ if (total_length_forward < total_length_backward) return Direction::Forward;
+ return Direction::Backward;
+}
+
+// Straighten the travel path as long as it does not collide with the contours stored in edge_grid.
+static std::vector<TravelPoint> simplify_travel(const AvoidCrossingPerimeters::Boundary &boundary, const std::vector<TravelPoint> &travel)
+{
+ FirstIntersectionVisitor visitor(boundary.grid);
+ std::vector<TravelPoint> simplified_path;
+ simplified_path.reserve(travel.size());
+ simplified_path.emplace_back(travel.front());
+
+ // Try to skip some points in the path.
+ //FIXME maybe use a binary search to trim the line?
+ //FIXME how about searching tangent point at long segments?
+ for (size_t point_idx = 1; point_idx < travel.size(); ++point_idx) {
+ const Point &current_point = travel[point_idx - 1].point;
+ TravelPoint next = travel[point_idx];
+
+ visitor.pt_current = &current_point;
+
+ for (size_t point_idx_2 = point_idx + 1; point_idx_2 < travel.size(); ++point_idx_2) {
+ if (travel[point_idx_2].point == current_point) {
+ next = travel[point_idx_2];
+ point_idx = point_idx_2;
+ continue;
+ }
+
+ visitor.pt_next = &travel[point_idx_2].point;
+ boundary.grid.visit_cells_intersecting_line(*visitor.pt_current, *visitor.pt_next, visitor);
+ // Check if deleting point causes crossing a boundary
+ if (!visitor.intersect) {
+ next = travel[point_idx_2];
+ point_idx = point_idx_2;
+ }
+ }
+
+ simplified_path.emplace_back(next);
+ }
+
+ return simplified_path;
+}
+
+// Called by avoid_perimeters() and by simplify_travel_heuristics().
+static size_t avoid_perimeters_inner(const AvoidCrossingPerimeters::Boundary &boundary,
+ const Point &start,
+ const Point &end,
+ std::vector<TravelPoint> &result_out)
+{
+ const Polygons &boundaries = boundary.boundaries;
+ const EdgeGrid::Grid &edge_grid = boundary.grid;
+ // Find all intersections between boundaries and the line segment, sort them along the line segment.
+ std::vector<Intersection> intersections;
+ {
+ intersections.reserve(boundaries.size());
+ AllIntersectionsVisitor visitor(edge_grid, intersections, Line(start, end));
+ edge_grid.visit_cells_intersecting_line(start, end, visitor);
+ Vec2d dir = (end - start).cast<double>();
+ for (Intersection &intersection : intersections)
+ intersection.distance = boundary.boundaries_params[intersection.border_idx][intersection.line_idx];
+ std::sort(intersections.begin(), intersections.end(), [dir](const auto &l, const auto &r) { return (r.point - l.point).template cast<double>().dot(dir) > 0.; });
+ }
+
+ std::vector<TravelPoint> result;
+ result.push_back({start, -1});
+
+ auto crossing_boundary_from_inside = [&boundary](const Point &start, const Intersection &intersection) {
+ const Polygon &poly = boundary.boundaries[intersection.border_idx];
+ Vec2d poly_line = Line(poly[intersection.line_idx], poly[(intersection.line_idx + 1) % poly.size()]).normal().cast<double>();
+ Vec2d intersection_vec = (intersection.point - start).cast<double>();
+ return poly_line.normalized().dot(intersection_vec.normalized()) >= 0;
+ };
+
+ for (auto it_first = intersections.begin(); it_first != intersections.end(); ++it_first) {
+ // The entry point to the boundary polygon
+ const Intersection &intersection_first = *it_first;
+ if(!crossing_boundary_from_inside(start, intersection_first))
+ continue;
+ // Skip the it_first from the search for the farthest exit point from the boundary polygon
+ auto it_last_item = std::make_reverse_iterator(it_first) - 1;
+ // Search for the farthest intersection different from it_first but with the same border_idx
+ auto it_second_r = std::find_if(intersections.rbegin(), it_last_item, [&intersection_first](const Intersection &intersection) {
+ return intersection_first.border_idx == intersection.border_idx;
+ });
+
+ // Append the first intersection into the path
+ size_t left_idx = intersection_first.line_idx;
+ size_t right_idx = intersection_first.line_idx + 1 == boundaries[intersection_first.border_idx].points.size() ? 0 : intersection_first.line_idx + 1;
+ // Offset of the polygon's point using get_middle_point_offset is used to simplify the calculation of intersection between the
+ // boundary and the travel. The appended point is translated in the direction of inward normal. This translation ensures that the
+ // appended point will be inside the polygon and not on the polygon border.
+ result.push_back({get_middle_point_offset(boundaries[intersection_first.border_idx], left_idx, right_idx, intersection_first.point, coord_t(SCALED_EPSILON)), int(intersection_first.border_idx)});
+
+ // Check if intersection line also exit the boundary polygon
+ if (it_second_r != it_last_item) {
+ // Transform reverse iterator to forward
+ auto it_second = it_second_r.base() - 1;
+ // The exit point from the boundary polygon
+ const Intersection &intersection_second = *it_second;
+ Direction shortest_direction = get_shortest_direction(boundary, intersection_first, intersection_second,
+ boundary.boundaries_params[intersection_first.border_idx].back());
+ // Append the path around the border into the path
+ if (shortest_direction == Direction::Forward)
+ for (int line_idx = int(intersection_first.line_idx); line_idx != int(intersection_second.line_idx);
+ line_idx = line_idx + 1 < int(boundaries[intersection_first.border_idx].size()) ? line_idx + 1 : 0)
+ result.push_back({get_polygon_vertex_offset(boundaries[intersection_first.border_idx],
+ (line_idx + 1 == int(boundaries[intersection_first.border_idx].points.size())) ? 0 : (line_idx + 1), coord_t(SCALED_EPSILON)), int(intersection_first.border_idx)});
+ else
+ for (int line_idx = int(intersection_first.line_idx); line_idx != int(intersection_second.line_idx);
+ line_idx = line_idx - 1 >= 0 ? line_idx - 1 : int(boundaries[intersection_first.border_idx].size()) - 1)
+ result.push_back({get_polygon_vertex_offset(boundaries[intersection_second.border_idx], line_idx + 0, coord_t(SCALED_EPSILON)), int(intersection_first.border_idx)});
+
+ // Append the farthest intersection into the path
+ left_idx = intersection_second.line_idx;
+ right_idx = (intersection_second.line_idx >= (boundaries[intersection_second.border_idx].points.size() - 1)) ? 0 : (intersection_second.line_idx + 1);
+ result.push_back({get_middle_point_offset(boundaries[intersection_second.border_idx], left_idx, right_idx, intersection_second.point, coord_t(SCALED_EPSILON)), int(intersection_second.border_idx)});
+ // Skip intersections in between
+ it_first = it_second;
+ }
+ }
+
+ result.push_back({end, -1});
+
+#ifdef AVOID_CROSSING_PERIMETERS_DEBUG_OUTPUT
+ {
+ static int iRun = 0;
+ export_travel_to_svg(boundaries, Line(start, end), result, intersections,
+ debug_out_path("AvoidCrossingPerimetersInner-initial-%d.svg", iRun++));
+ }
+#endif /* AVOID_CROSSING_PERIMETERS_DEBUG_OUTPUT */
+
+ if (! intersections.empty())
+ result = simplify_travel(boundary, result);
+
+#ifdef AVOID_CROSSING_PERIMETERS_DEBUG_OUTPUT
+ {
+ static int iRun = 0;
+ export_travel_to_svg(boundaries, Line(start, end), result, intersections,
+ debug_out_path("AvoidCrossingPerimetersInner-final-%d.svg", iRun++));
+ }
+#endif /* AVOID_CROSSING_PERIMETERS_DEBUG_OUTPUT */
+
+ append(result_out, std::move(result));
+ return intersections.size();
+}
+
+// Called by AvoidCrossingPerimeters::travel_to()
+static size_t avoid_perimeters(const AvoidCrossingPerimeters::Boundary &boundary,
+ const Point &start,
+ const Point &end,
+ Polyline &result_out)
+{
+ // Travel line is completely or partially inside the bounding box.
+ std::vector<TravelPoint> path;
+ size_t num_intersections = avoid_perimeters_inner(boundary, start, end, path);
+ result_out = to_polyline(path);
+
+#ifdef AVOID_CROSSING_PERIMETERS_DEBUG_OUTPUT
+ {
+ static int iRun = 0;
+ export_travel_to_svg(boundary.boundaries, Line(start, end), path, {}, debug_out_path("AvoidCrossingPerimeters-final-%d.svg", iRun ++));
+ }
+#endif /* AVOID_CROSSING_PERIMETERS_DEBUG_OUTPUT */
+
+ return num_intersections;
+}
+
+// Check if anyone of ExPolygons contains whole travel.
+// called by need_wipe() and AvoidCrossingPerimeters::travel_to()
+// FIXME Lukas H.: Maybe similar approach could also be used for ExPolygon::contains()
+static bool any_expolygon_contains(const ExPolygons &ex_polygons,
+ const std::vector<BoundingBox> &ex_polygons_bboxes,
+ const EdgeGrid::Grid &grid_lslice,
+ const Line &travel)
+{
+ assert(ex_polygons.size() == ex_polygons_bboxes.size());
+ if(!grid_lslice.bbox().contains(travel.a) || !grid_lslice.bbox().contains(travel.b))
+ return false;
+
+ FirstIntersectionVisitor visitor(grid_lslice);
+ visitor.pt_current = &travel.a;
+ visitor.pt_next = &travel.b;
+ grid_lslice.visit_cells_intersecting_line(*visitor.pt_current, *visitor.pt_next, visitor);
+ if (!visitor.intersect) {
+ for (const ExPolygon &ex_polygon : ex_polygons) {
+ const BoundingBox &bbox = ex_polygons_bboxes[&ex_polygon - &ex_polygons.front()];
+ if (bbox.contains(travel.a) && bbox.contains(travel.b) && ex_polygon.contains(travel.a))
+ return true;
+ }
+ }
+ return false;
+}
+
+// Check if anyone of ExPolygons contains whole travel.
+// called by need_wipe()
+static bool any_expolygon_contains(const ExPolygons &ex_polygons, const std::vector<BoundingBox> &ex_polygons_bboxes, const EdgeGrid::Grid &grid_lslice, const Polyline &travel)
+{
+ assert(ex_polygons.size() == ex_polygons_bboxes.size());
+ if(std::any_of(travel.points.begin(), travel.points.end(), [&grid_lslice](const Point &point) { return !grid_lslice.bbox().contains(point); }))
+ return false;
+
+ FirstIntersectionVisitor visitor(grid_lslice);
+ bool any_intersection = false;
+ for (size_t line_idx = 1; line_idx < travel.size(); ++line_idx) {
+ visitor.pt_current = &travel.points[line_idx - 1];
+ visitor.pt_next = &travel.points[line_idx];
+ grid_lslice.visit_cells_intersecting_line(*visitor.pt_current, *visitor.pt_next, visitor);
+ any_intersection = visitor.intersect;
+ if (any_intersection) break;
+ }
+
+ if (!any_intersection) {
+ for (const ExPolygon &ex_polygon : ex_polygons) {
+ const BoundingBox &bbox = ex_polygons_bboxes[&ex_polygon - &ex_polygons.front()];
+ if (std::all_of(travel.points.begin(), travel.points.end(), [&bbox](const Point &point) { return bbox.contains(point); }) &&
+ ex_polygon.contains(travel.points.front()))
+ return true;
+ }
+ }
+ return false;
+}
+
+static bool need_wipe(const GCode &gcodegen,
+ const EdgeGrid::Grid &grid_lslice,
+ const Line &original_travel,
+ const Polyline &result_travel,
+ const size_t intersection_count)
+{
+ const ExPolygons &lslices = gcodegen.layer()->lslices;
+ const std::vector<BoundingBox> &lslices_bboxes = gcodegen.layer()->lslices_bboxes;
+ bool z_lift_enabled = gcodegen.config().retract_lift.get_at(gcodegen.writer().extruder()->id()) > 0.;
+ bool wipe_needed = false;
+
+ // If the original unmodified path doesn't have any intersection with boundary, then it is entirely inside the object otherwise is entirely
+ // outside the object.
+ if (intersection_count > 0) {
+ // The original layer is intersected with defined boundaries. Then it is necessary to make a detailed test.
+ // If the z-lift is enabled, then a wipe is needed when the original travel leads above the holes.
+ if (z_lift_enabled) {
+ if (any_expolygon_contains(lslices, lslices_bboxes, grid_lslice, original_travel)) {
+ // Check if original_travel and result_travel are not same.
+ // If both are the same, then it is possible to skip testing of result_travel
+ wipe_needed = !(result_travel.size() > 2 && result_travel.first_point() == original_travel.a && result_travel.last_point() == original_travel.b) &&
+ !any_expolygon_contains(lslices, lslices_bboxes, grid_lslice, result_travel);
+ } else {
+ wipe_needed = true;
+ }
+ } else {
+ wipe_needed = !any_expolygon_contains(lslices, lslices_bboxes, grid_lslice, result_travel);
+ }
+ }
+
+ return wipe_needed;
+}
+
+// called by get_perimeter_spacing() / get_perimeter_spacing_external()
+static inline float get_default_perimeter_spacing(const PrintObject &print_object)
+{
+ std::vector<unsigned int> printing_extruders = print_object.object_extruders();
+ assert(!printing_extruders.empty());
+ float avg_extruder = 0;
+ for(unsigned int extruder_id : printing_extruders)
+ avg_extruder += float(scale_(print_object.print()->config().nozzle_diameter.get_at(extruder_id)));
+ avg_extruder /= printing_extruders.size();
+ return avg_extruder;
+}
+
+// called by get_boundary()
+static float get_perimeter_spacing(const Layer &layer)
+{
+ size_t regions_count = 0;
+ float perimeter_spacing = 0.f;
+ for (const LayerRegion *layer_region : layer.regions())
+ if (layer_region != nullptr && !layer_region->slices.empty()) {
+ perimeter_spacing += layer_region->flow(frPerimeter).scaled_spacing();
+ ++regions_count;
+ }
+
+ assert(perimeter_spacing >= 0.f);
+ if (regions_count != 0)
+ perimeter_spacing /= float(regions_count);
+ else
+ perimeter_spacing = get_default_perimeter_spacing(*layer.object());
+ return perimeter_spacing;
+}
+
+// called by get_boundary_external()
+static float get_perimeter_spacing_external(const Layer &layer)
+{
+ size_t regions_count = 0;
+ float perimeter_spacing = 0.f;
+ for (const PrintObject *object : layer.object()->print()->objects())
+ if (const Layer *l = object->get_layer_at_printz(layer.print_z, EPSILON); l)
+ for (const LayerRegion *layer_region : l->regions())
+ if (layer_region != nullptr && !layer_region->slices.empty()) {
+ perimeter_spacing += layer_region->flow(frPerimeter).scaled_spacing();
+ ++ regions_count;
+ }
+
+ assert(perimeter_spacing >= 0.f);
+ if (regions_count != 0)
+ perimeter_spacing /= float(regions_count);
+ else
+ perimeter_spacing = get_default_perimeter_spacing(*layer.object());
+ return perimeter_spacing;
+}
+
+// Adds points around all vertices so that the offset affects only small sections around these vertices.
+static void resample_polygon(Polygon &polygon, double dist_from_vertex)
+{
+ Points resampled_poly;
+ resampled_poly.reserve(3 * polygon.size());
+ resampled_poly.emplace_back(polygon.first_point());
+ for (size_t pt_idx = 1; pt_idx < polygon.size(); ++pt_idx) {
+ const Point &p1 = polygon[pt_idx - 1];
+ const Point &p2 = polygon[pt_idx];
+ double line_length = (p2 - p1).cast<double>().norm();
+ Vector line_vec = ((p2 - p1).cast<double>().normalized() * dist_from_vertex).cast<coord_t>();
+ if (line_length > 2 * dist_from_vertex) {
+ resampled_poly.emplace_back(p1 + line_vec);
+ resampled_poly.emplace_back(p2 - line_vec);
+ }
+ resampled_poly.emplace_back(polygon[pt_idx]);
+ }
+ polygon.points = std::move(resampled_poly);
+}
+
+static void resample_expolygon(ExPolygon &ex_polygon, double dist_from_vertex)
+{
+ resample_polygon(ex_polygon.contour, dist_from_vertex);
+ for (Polygon &polygon : ex_polygon.holes) resample_polygon(polygon, dist_from_vertex);
+}
+
+static void resample_expolygons(ExPolygons &ex_polygons, double dist_from_vertex)
+{
+ for (ExPolygon &ex_poly : ex_polygons) resample_expolygon(ex_poly, dist_from_vertex);
+}
+
+static void precompute_polygon_distances(const Polygon &polygon, std::vector<float> &polygon_distances_out)
+{
+ polygon_distances_out.assign(polygon.size() + 1, 0.f);
+ for (size_t point_idx = 1; point_idx < polygon.size(); ++point_idx)
+ polygon_distances_out[point_idx] = polygon_distances_out[point_idx - 1] + (polygon[point_idx].cast<float>() - polygon[point_idx - 1].cast<float>()).norm();
+ polygon_distances_out.back() = polygon_distances_out[polygon.size() - 1] + (polygon.last_point().cast<float>() - polygon.first_point().cast<float>()).norm();
+}
+
+static void precompute_expolygon_distances(const ExPolygon &ex_polygon, std::vector<std::vector<float>> &expolygon_distances_out)
+{
+ expolygon_distances_out.assign(ex_polygon.holes.size() + 1, std::vector<float>());
+ precompute_polygon_distances(ex_polygon.contour, expolygon_distances_out.front());
+ for (size_t hole_idx = 0; hole_idx < ex_polygon.holes.size(); ++hole_idx)
+ precompute_polygon_distances(ex_polygon.holes[hole_idx], expolygon_distances_out[hole_idx + 1]);
+}
+
+// It is highly based on the function contour_distance2 from the ElephantFootCompensation.cpp
+static std::vector<float> contour_distance(const EdgeGrid::Grid &grid,
+ const std::vector<float> &poly_distances,
+ const size_t contour_idx,
+ const Polygon &polygon,
+ double compensation,
+ double search_radius)
+{
+ assert(! polygon.empty());
+ assert(polygon.size() >= 2);
+
+ std::vector<float> out;
+
+ if (polygon.size() > 2)
+ {
+ struct Visitor {
+ Visitor(const EdgeGrid::Grid &grid, const size_t contour_idx, const std::vector<float> &polygon_distances, double dist_same_contour_accept, double dist_same_contour_reject) :
+ grid(grid), idx_contour(contour_idx), contour(*grid.contours()[contour_idx]), boundary_parameters(polygon_distances), dist_same_contour_accept(dist_same_contour_accept), dist_same_contour_reject(dist_same_contour_reject) {}
+
+ void init(const Points &contour, const Point &apoint)
+ {
+ this->idx_point = &apoint - contour.data();
+ this->point = apoint;
+ this->found = false;
+ this->dir_inside = this->dir_inside_at_point(contour, this->idx_point);
+ this->distance = std::numeric_limits<double>::max();
+ }
+
+ bool operator()(coord_t iy, coord_t ix)
+ {
+ // Called with a row and colum of the grid cell, which is intersected by a line.
+ auto cell_data_range = this->grid.cell_data_range(iy, ix);
+ for (auto it_contour_and_segment = cell_data_range.first; it_contour_and_segment != cell_data_range.second;
+ ++it_contour_and_segment) {
+ // End points of the line segment and their vector.
+ std::pair<const Point &, const Point &> segment = this->grid.segment(*it_contour_and_segment);
+ const Vec2d v = (segment.second - segment.first).cast<double>();
+ const Vec2d va = (this->point - segment.first).cast<double>();
+ const double l2 = v.squaredNorm(); // avoid a sqrt
+ const double t = (l2 == 0.0) ? 0. : clamp(0., 1., va.dot(v) / l2);
+ // Closest point from this->point to the segment.
+ const Vec2d foot = segment.first.cast<double>() + t * v;
+ const Vec2d bisector = foot - this->point.cast<double>();
+ const double dist = bisector.norm();
+
+ if ((!this->found || dist < this->distance) && this->dir_inside.dot(bisector) > 0) {
+ bool accept = true;
+ if (it_contour_and_segment->first == idx_contour) {
+ // Complex case: The closest segment originates from the same contour as the starting point.
+ // Reject the closest point if its distance along the contour is reasonable compared to the current contour bisector
+ // (this->pt, foot).
+ const Slic3r::Points &ipts = *grid.contours()[it_contour_and_segment->first];
+ double param_lo = boundary_parameters[this->idx_point];
+ double param_hi = t * sqrt(l2);
+ double param_end = boundary_parameters.back();
+ const size_t ipt = it_contour_and_segment->second;
+ if (ipt + 1 < ipts.size())
+ param_hi += boundary_parameters[ipt > 0 ? ipt - 1 : 0];
+ if (param_lo > param_hi)
+ std::swap(param_lo, param_hi);
+ assert(param_lo > -SCALED_EPSILON && param_lo <= param_end + SCALED_EPSILON);
+ assert(param_hi > -SCALED_EPSILON && param_hi <= param_end + SCALED_EPSILON);
+ double dist_along_contour = std::min(param_hi - param_lo, param_lo + param_end - param_hi);
+ if (dist_along_contour < dist_same_contour_accept)
+ accept = false;
+ else if (dist < dist_same_contour_reject + SCALED_EPSILON) {
+ // this->point is close to foot. This point will only be accepted if the path along the contour is significantly
+ // longer than the bisector. That is, the path shall not bulge away from the bisector too much.
+ // Bulge is estimated by 0.6 of the circle circumference drawn around the bisector.
+ // Test whether the contour is convex or concave.
+ bool inside = (t == 0.) ? this->inside_corner(ipts, ipt, this->point) :
+ (t == 1.) ? this->inside_corner(ipts, ipt + 1 == ipts.size() ? 0 : ipt + 1, this->point) :
+ this->left_of_segment(ipts, ipt, this->point);
+ accept = inside && dist_along_contour > 0.6 * M_PI * dist;
+ }
+ }
+ if (accept && (!this->found || dist < this->distance)) {
+ // Simple case: Just measure the shortest distance.
+ this->distance = dist;
+ this->found = true;
+ }
+ }
+ }
+ // Continue traversing the grid.
+ return true;
+ }
+
+ const EdgeGrid::Grid &grid;
+ const size_t idx_contour;
+ const Points &contour;
+
+ const std::vector<float> &boundary_parameters;
+ const double dist_same_contour_accept;
+ const double dist_same_contour_reject;
+
+ size_t idx_point;
+ Point point;
+ // Direction inside the contour from idx_point, not normalized.
+ Vec2d dir_inside;
+ bool found;
+ double distance;
+
+ private:
+ static Vec2d dir_inside_at_point(const Points &contour, size_t i)
+ {
+ size_t iprev = prev_idx_modulo(i, contour);
+ size_t inext = next_idx_modulo(i, contour);
+ Vec2d v1 = (contour[i] - contour[iprev]).cast<double>();
+ Vec2d v2 = (contour[inext] - contour[i]).cast<double>();
+ return Vec2d(-v1.y() - v2.y(), v1.x() + v2.x());
+ }
+
+ static bool inside_corner(const Slic3r::Points &contour, size_t i, const Point &pt_oposite)
+ {
+ const Vec2d pt = pt_oposite.cast<double>();
+ size_t iprev = prev_idx_modulo(i, contour);
+ size_t inext = next_idx_modulo(i, contour);
+ Vec2d v1 = (contour[i] - contour[iprev]).cast<double>();
+ Vec2d v2 = (contour[inext] - contour[i]).cast<double>();
+ bool left_of_v1 = cross2(v1, pt - contour[iprev].cast<double>()) > 0.;
+ bool left_of_v2 = cross2(v2, pt - contour[i].cast<double>()) > 0.;
+ return cross2(v1, v2) > 0 ? left_of_v1 && left_of_v2 : // convex corner
+ left_of_v1 || left_of_v2; // concave corner
+ }
+
+ static bool left_of_segment(const Slic3r::Points &contour, size_t i, const Point &pt_oposite)
+ {
+ const Vec2d pt = pt_oposite.cast<double>();
+ size_t inext = next_idx_modulo(i, contour);
+ Vec2d v = (contour[inext] - contour[i]).cast<double>();
+ return cross2(v, pt - contour[i].cast<double>()) > 0.;
+ }
+ } visitor(grid, contour_idx, poly_distances, 0.5 * compensation * M_PI, search_radius);
+
+ out.reserve(polygon.size());
+ Point radius_vector(search_radius, search_radius);
+ for (const Point &pt : polygon.points) {
+ visitor.init(polygon.points, pt);
+ grid.visit_cells_intersecting_box(BoundingBox(pt - radius_vector, pt + radius_vector), visitor);
+ out.emplace_back(float(visitor.found ? std::min(visitor.distance, search_radius) : search_radius));
+ }
+ }
+
+ return out;
+}
+
+// Polygon offset which ensures that if a polygon breaks up into several separate parts, the original polygon will be used in these places.
+// ExPolygons are handled one by one so returned ExPolygons could intersect.
+static ExPolygons inner_offset(const ExPolygons &ex_polygons, double offset, double min_contour_width = scale_(0.001))
+{
+ double search_radius = 2. * (offset + min_contour_width);
+ ExPolygons ex_poly_result = ex_polygons;
+ resample_expolygons(ex_poly_result, offset / 2);
+
+ for (ExPolygon &ex_poly : ex_poly_result) {
+ BoundingBox bbox(get_extents(ex_poly));
+ bbox.offset(SCALED_EPSILON);
+ EdgeGrid::Grid grid;
+ grid.set_bbox(bbox);
+ grid.create(ex_poly, coord_t(0.7 * search_radius));
+
+ std::vector<std::vector<float>> ex_poly_distances;
+ precompute_expolygon_distances(ex_poly, ex_poly_distances);
+
+ std::vector<std::vector<float>> offsets;
+ offsets.reserve(ex_poly.holes.size() + 1);
+ for (size_t idx_contour = 0; idx_contour <= ex_poly.holes.size(); ++idx_contour) {
+ const Polygon &poly = (idx_contour == 0) ? ex_poly.contour : ex_poly.holes[idx_contour - 1];
+ assert(poly.is_counter_clockwise() == (idx_contour == 0));
+ std::vector<float> distances = contour_distance(grid, ex_poly_distances[idx_contour], idx_contour, poly, offset, search_radius);
+ for (float &distance : distances) {
+ if (distance < min_contour_width)
+ distance = 0.f;
+ else if (distance > min_contour_width + 2. * offset)
+ distance = - float(offset);
+ else
+ distance = - (distance - float(min_contour_width)) / 2.f;
+ }
+ offsets.emplace_back(distances);
+ }
+
+ ExPolygons offset_ex_poly = variable_offset_inner_ex(ex_poly, offsets);
+ // If variable_offset_inner_ex produces empty result, then original ex_polygon is used
+ if (offset_ex_poly.size() == 1) {
+ ex_poly = std::move(offset_ex_poly.front());
+ } else if (offset_ex_poly.size() > 1) {
+ // fix_after_inner_offset called inside variable_offset_inner_ex sometimes produces
+ // tiny artefacts polygons, so these artefacts are removed.
+ double max_area = offset_ex_poly.front().area();
+ size_t max_area_idx = 0;
+ for (size_t poly_idx = 1; poly_idx < offset_ex_poly.size(); ++poly_idx) {
+ double area = offset_ex_poly[poly_idx].area();
+ if (max_area < area) {
+ max_area = area;
+ max_area_idx = poly_idx;
+ }
+ }
+ ex_poly = std::move(offset_ex_poly[max_area_idx]);
+ }
+ }
+ return ex_poly_result;
+}
+
+//#define INCLUDE_SUPPORTS_IN_BOUNDARY
+
+// called by AvoidCrossingPerimeters::travel_to()
+static ExPolygons get_boundary(const Layer &layer)
+{
+ const float perimeter_spacing = get_perimeter_spacing(layer);
+ const float perimeter_offset = perimeter_spacing / 2.f;
+ auto const *support_layer = dynamic_cast<const SupportLayer *>(&layer);
+ ExPolygons boundary = union_ex(inner_offset(layer.lslices, perimeter_offset));
+ if(support_layer) {
+#ifdef INCLUDE_SUPPORTS_IN_BOUNDARY
+ append(boundary, inner_offset(support_layer->support_islands.expolygons, perimeter_offset));
+#endif
+ auto *layer_below = layer.object()->get_first_layer_bellow_printz(layer.print_z, EPSILON);
+ if (layer_below)
+ append(boundary, inner_offset(layer_below->lslices, perimeter_offset));
+ // After calling inner_offset it is necessary to call union_ex because of the possibility of intersection ExPolygons
+ boundary = union_ex(boundary);
+ }
+ // Collect all top layers that will not be crossed.
+ size_t polygons_count = 0;
+ for (const LayerRegion *layer_region : layer.regions())
+ for (const Surface &surface : layer_region->fill_surfaces.surfaces)
+ if (surface.is_top()) ++polygons_count;
+
+ if (polygons_count > 0) {
+ ExPolygons top_layer_polygons;
+ top_layer_polygons.reserve(polygons_count);
+ for (const LayerRegion *layer_region : layer.regions())
+ for (const Surface &surface : layer_region->fill_surfaces.surfaces)
+ if (surface.is_top()) top_layer_polygons.emplace_back(surface.expolygon);
+
+ top_layer_polygons = union_ex(top_layer_polygons);
+ return diff_ex(boundary, offset_ex(top_layer_polygons, -perimeter_offset));
+ }
+
+ return boundary;
+}
+
+// called by AvoidCrossingPerimeters::travel_to()
+static Polygons get_boundary_external(const Layer &layer)
+{
+ const float perimeter_spacing = get_perimeter_spacing_external(layer);
+ const float perimeter_offset = perimeter_spacing / 2.f;
+ auto const *support_layer = dynamic_cast<const SupportLayer *>(&layer);
+ Polygons boundary;
+#ifdef INCLUDE_SUPPORTS_IN_BOUNDARY
+ ExPolygons supports_boundary;
+#endif
+ // Collect all holes for all printed objects and their instances, which will be printed at the same time as passed "layer".
+ for (const PrintObject *object : layer.object()->print()->objects()) {
+ Polygons polygons_per_obj;
+#ifdef INCLUDE_SUPPORTS_IN_BOUNDARY
+ ExPolygons supports_per_obj;
+#endif
+ if (const Layer *l = object->get_layer_at_printz(layer.print_z, EPSILON); l)
+ for (const ExPolygon &island : l->lslices) append(polygons_per_obj, island.holes);
+ if (support_layer) {
+ auto *layer_below = object->get_first_layer_bellow_printz(layer.print_z, EPSILON);
+ if (layer_below)
+ for (const ExPolygon &island : layer_below->lslices) append(polygons_per_obj, island.holes);
+#ifdef INCLUDE_SUPPORTS_IN_BOUNDARY
+ append(supports_per_obj, support_layer->support_islands.expolygons);
+#endif
+ }
+
+ for (const PrintInstance &instance : object->instances()) {
+ size_t boundary_idx = boundary.size();
+ append(boundary, polygons_per_obj);
+ for (; boundary_idx < boundary.size(); ++boundary_idx)
+ boundary[boundary_idx].translate(instance.shift);
+#ifdef INCLUDE_SUPPORTS_IN_BOUNDARY
+ size_t support_idx = supports_boundary.size();
+ append(supports_boundary, supports_per_obj);
+ for (; support_idx < supports_boundary.size(); ++support_idx)
+ supports_boundary[support_idx].translate(instance.shift);
+#endif
+ }
+ }
+
+ // Used offset_ex for cases when another object will be in the hole of another polygon
+ boundary = to_polygons(offset_ex(boundary, perimeter_offset));
+ // Reverse all polygons for making normals point from the polygon out.
+ for (Polygon &poly : boundary)
+ poly.reverse();
+#ifdef INCLUDE_SUPPORTS_IN_BOUNDARY
+ append(boundary, to_polygons(inner_offset(supports_boundary, perimeter_offset)));
+#endif
+ return boundary;
+}
+
+static void init_boundary_distances(AvoidCrossingPerimeters::Boundary *boundary)
+{
+ boundary->boundaries_params.assign(boundary->boundaries.size(), std::vector<float>());
+ for (size_t poly_idx = 0; poly_idx < boundary->boundaries.size(); ++poly_idx)
+ precompute_polygon_distances(boundary->boundaries[poly_idx], boundary->boundaries_params[poly_idx]);
+}
+
+static void init_boundary(AvoidCrossingPerimeters::Boundary *boundary, Polygons &&boundary_polygons)
+{
+ boundary->clear();
+ boundary->boundaries = std::move(boundary_polygons);
+
+ BoundingBox bbox(get_extents(boundary->boundaries));
+ bbox.offset(SCALED_EPSILON);
+ boundary->bbox = BoundingBoxf(bbox.min.cast<double>(), bbox.max.cast<double>());
+ boundary->grid.set_bbox(bbox);
+ // FIXME 1mm grid?
+ boundary->grid.create(boundary->boundaries, coord_t(scale_(1.)));
+ init_boundary_distances(boundary);
+}
+
+// Plan travel, which avoids perimeter crossings by following the boundaries of the layer.
+Polyline AvoidCrossingPerimeters::travel_to(const GCode &gcodegen, const Point &point, bool *could_be_wipe_disabled)
+{
+ // If use_external, then perform the path planning in the world coordinate system (correcting for the gcodegen offset).
+ // Otherwise perform the path planning in the coordinate system of the active object.
+ bool use_external = m_use_external_mp || m_use_external_mp_once;
+ Point scaled_origin = use_external ? Point::new_scale(gcodegen.origin()(0), gcodegen.origin()(1)) : Point(0, 0);
+ const Point start = gcodegen.last_pos() + scaled_origin;
+ const Point end = point + scaled_origin;
+ const Line travel(start, end);
+
+ Polyline result_pl;
+ size_t travel_intersection_count = 0;
+ Vec2d startf = start.cast<double>();
+ Vec2d endf = end .cast<double>();
+
+ const ExPolygons &lslices = gcodegen.layer()->lslices;
+ const std::vector<BoundingBox> &lslices_bboxes = gcodegen.layer()->lslices_bboxes;
+ bool is_support_layer = dynamic_cast<const SupportLayer *>(gcodegen.layer()) != nullptr;
+ if (!use_external && (is_support_layer || (!lslices.empty() && !any_expolygon_contains(lslices, lslices_bboxes, m_grid_lslice, travel)))) {
+ // Initialize m_internal only when it is necessary.
+ if (m_internal.boundaries.empty())
+ init_boundary(&m_internal, to_polygons(get_boundary(*gcodegen.layer())));
+
+ // Trim the travel line by the bounding box.
+ if (!m_internal.boundaries.empty() && Geometry::liang_barsky_line_clipping(startf, endf, m_internal.bbox)) {
+ travel_intersection_count = avoid_perimeters(m_internal, startf.cast<coord_t>(), endf.cast<coord_t>(), result_pl);
+ result_pl.points.front() = start;
+ result_pl.points.back() = end;
+ }
+ } else if(use_external) {
+ // Initialize m_external only when exist any external travel for the current layer.
+ if (m_external.boundaries.empty())
+ init_boundary(&m_external, get_boundary_external(*gcodegen.layer()));
+
+ // Trim the travel line by the bounding box.
+ if (!m_external.boundaries.empty() && Geometry::liang_barsky_line_clipping(startf, endf, m_external.bbox)) {
+ travel_intersection_count = avoid_perimeters(m_external, startf.cast<coord_t>(), endf.cast<coord_t>(), result_pl);
+ result_pl.points.front() = start;
+ result_pl.points.back() = end;
+ }
+ }
+
+ if(result_pl.empty()) {
+ // Travel line is completely outside the bounding box.
+ result_pl = {start, end};
+ travel_intersection_count = 0;
+ }
+
+ const ConfigOptionFloatOrPercent &opt_max_detour = gcodegen.config().avoid_crossing_perimeters_max_detour;
+ bool max_detour_length_exceeded = false;
+ if (opt_max_detour.value > 0) {
+ double direct_length = travel.length();
+ double detour = result_pl.length() - direct_length;
+ double max_detour_length = opt_max_detour.percent ?
+ direct_length * 0.01 * opt_max_detour.value :
+ scale_(opt_max_detour.value);
+ if (detour > max_detour_length) {
+ result_pl = {start, end};
+ max_detour_length_exceeded = true;
+ }
+ }
+
+ if (use_external) {
+ result_pl.translate(-scaled_origin);
+ *could_be_wipe_disabled = false;
+ } else if (max_detour_length_exceeded) {
+ *could_be_wipe_disabled = false;
+ } else
+ *could_be_wipe_disabled = !need_wipe(gcodegen, m_grid_lslice, travel, result_pl, travel_intersection_count);
+
+ return result_pl;
+}
+
+// ************************************* AvoidCrossingPerimeters::init_layer() *****************************************
+
+void AvoidCrossingPerimeters::init_layer(const Layer &layer)
+{
+ m_internal.clear();
+ m_external.clear();
+
+ BoundingBox bbox_slice(get_extents(layer.lslices));
+ bbox_slice.offset(SCALED_EPSILON);
+
+ m_grid_lslice.set_bbox(bbox_slice);
+ //FIXME 1mm grid?
+ m_grid_lslice.create(layer.lslices, coord_t(scale_(1.)));
+}
+
+#if 0
+static double travel_length(const std::vector<TravelPoint> &travel) {
+ double total_length = 0;
+ for (size_t idx = 1; idx < travel.size(); ++idx)
+ total_length += (travel[idx].point - travel[idx - 1].point).cast<double>().norm();
+
+ return total_length;
+}
+
+// Called by avoid_perimeters() and by simplify_travel_heuristics().
+static size_t avoid_perimeters_inner(const AvoidCrossingPerimeters::Boundary &boundary,
+ const Point &start,
+ const Point &end,
+ std::vector<TravelPoint> &result_out)
+{
+ const Polygons &boundaries = boundary.boundaries;
+ const EdgeGrid::Grid &edge_grid = boundary.grid;
+ // Find all intersections between boundaries and the line segment, sort them along the line segment.
+ std::vector<Intersection> intersections;
+ {
+ intersections.reserve(boundaries.size());
+ AllIntersectionsVisitor visitor(edge_grid, intersections, Line(start, end));
+ edge_grid.visit_cells_intersecting_line(start, end, visitor);
+ Vec2d dir = (end - start).cast<double>();
+ for (Intersection &intersection : intersections)
+ intersection.distance = boundary.boundaries_params[intersection.border_idx][intersection.line_idx];
+ std::sort(intersections.begin(), intersections.end(), [dir](const auto &l, const auto &r) { return (r.point - l.point).template cast<double>().dot(dir) > 0.; });
+ }
+
+ std::vector<TravelPoint> result;
+ result.push_back({start, -1});
+ for (auto it_first = intersections.begin(); it_first != intersections.end(); ++it_first) {
+ // The entry point to the boundary polygon
+ const Intersection &intersection_first = *it_first;
+ // Skip the it_first from the search for the farthest exit point from the boundary polygon
+ auto it_last_item = std::make_reverse_iterator(it_first) - 1;
+ // Search for the farthest intersection different from it_first but with the same border_idx
+ auto it_second_r = std::find_if(intersections.rbegin(), it_last_item, [&intersection_first](const Intersection &intersection) {
+ return intersection_first.border_idx == intersection.border_idx;
+ });
+
+ // Append the first intersection into the path
+ size_t left_idx = intersection_first.line_idx;
+ size_t right_idx = intersection_first.line_idx + 1 == boundaries[intersection_first.border_idx].points.size() ? 0 : intersection_first.line_idx + 1;
+ // Offset of the polygon's point using get_middle_point_offset is used to simplify the calculation of intersection between the
+ // boundary and the travel. The appended point is translated in the direction of inward normal. This translation ensures that the
+ // appended point will be inside the polygon and not on the polygon border.
+ result.push_back({get_middle_point_offset(boundaries[intersection_first.border_idx], left_idx, right_idx, intersection_first.point, coord_t(SCALED_EPSILON)), int(intersection_first.border_idx)});
+
+ // Check if intersection line also exit the boundary polygon
+ if (it_second_r != it_last_item) {
+ // Transform reverse iterator to forward
+ auto it_second = it_second_r.base() - 1;
+ // The exit point from the boundary polygon
+ const Intersection &intersection_second = *it_second;
+ Direction shortest_direction = get_shortest_direction(boundary, intersection_first, intersection_second,
+ boundary.boundaries_params[intersection_first.border_idx].back());
+ // Append the path around the border into the path
+ if (shortest_direction == Direction::Forward)
+ for (int line_idx = int(intersection_first.line_idx); line_idx != int(intersection_second.line_idx);
+ line_idx = line_idx + 1 < int(boundaries[intersection_first.border_idx].size()) ? line_idx + 1 : 0)
+ result.push_back({get_polygon_vertex_offset(boundaries[intersection_first.border_idx],
+ (line_idx + 1 == int(boundaries[intersection_first.border_idx].points.size())) ? 0 : (line_idx + 1), coord_t(SCALED_EPSILON)), int(intersection_first.border_idx)});
+ else
+ for (int line_idx = int(intersection_first.line_idx); line_idx != int(intersection_second.line_idx);
+ line_idx = line_idx - 1 >= 0 ? line_idx - 1 : int(boundaries[intersection_first.border_idx].size()) - 1)
+ result.push_back({get_polygon_vertex_offset(boundaries[intersection_second.border_idx], line_idx + 0, coord_t(SCALED_EPSILON)), int(intersection_first.border_idx)});
+
+ // Append the farthest intersection into the path
+ left_idx = intersection_second.line_idx;
+ right_idx = (intersection_second.line_idx >= (boundaries[intersection_second.border_idx].points.size() - 1)) ? 0 : (intersection_second.line_idx + 1);
+ result.push_back({get_middle_point_offset(boundaries[intersection_second.border_idx], left_idx, right_idx, intersection_second.point, coord_t(SCALED_EPSILON)), int(intersection_second.border_idx)});
+ // Skip intersections in between
+ it_first = it_second;
+ }
+ }
+
+ result.push_back({end, -1});
+
+#ifdef AVOID_CROSSING_PERIMETERS_DEBUG_OUTPUT
+ {
+ static int iRun = 0;
+ export_travel_to_svg(boundaries, Line(start, end), result, intersections,
+ debug_out_path("AvoidCrossingPerimetersInner-initial-%d.svg", iRun++));
+ }
+#endif /* AVOID_CROSSING_PERIMETERS_DEBUG_OUTPUT */
+
+ if (! intersections.empty())
+ result = simplify_travel(boundary, result);
+
+#ifdef AVOID_CROSSING_PERIMETERS_DEBUG_OUTPUT
+ {
+ static int iRun = 0;
+ export_travel_to_svg(boundaries, Line(start, end), result, intersections,
+ debug_out_path("AvoidCrossingPerimetersInner-final-%d.svg", iRun++));
+ }
+#endif /* AVOID_CROSSING_PERIMETERS_DEBUG_OUTPUT */
+
+ append(result_out, std::move(result));
+ return intersections.size();
+}
+
+static std::vector<TravelPoint> simplify_travel_heuristics(const AvoidCrossingPerimeters::Boundary &boundary,
+ const std::vector<TravelPoint> &travel)
+{
+ std::vector<TravelPoint> simplified_path;
+ std::vector<Intersection> intersections;
+ AllIntersectionsVisitor visitor(boundary.grid, intersections);
+ simplified_path.reserve(travel.size());
+ simplified_path.emplace_back(travel.front());
+ for (size_t point_idx = 1; point_idx < travel.size(); ++point_idx) {
+ // Skip all indexes on the same polygon
+ while (point_idx < travel.size() && travel[point_idx - 1].border_idx == travel[point_idx].border_idx) {
+ simplified_path.emplace_back(travel[point_idx]);
+ point_idx++;
+ }
+
+ if (point_idx < travel.size()) {
+ const TravelPoint &current = travel[point_idx - 1];
+ const TravelPoint &next = travel[point_idx];
+ TravelPoint new_next = next;
+ size_t new_point_idx = point_idx;
+ double path_length = (next.point - current.point).cast<double>().norm();
+ double new_path_shorter_by = 0.;
+ size_t border_idx_change_count = 0;
+ std::vector<TravelPoint> shortcut;
+ for (size_t point_idx_2 = point_idx + 1; point_idx_2 < travel.size(); ++point_idx_2) {
+ const TravelPoint &possible_new_next = travel[point_idx_2];
+ if (travel[point_idx_2 - 1].border_idx != travel[point_idx_2].border_idx)
+ border_idx_change_count++;
+
+ if (border_idx_change_count >= 2)
+ break;
+
+ path_length += (possible_new_next.point - travel[point_idx_2 - 1].point).cast<double>().norm();
+ double shortcut_length = (possible_new_next.point - current.point).cast<double>().norm();
+ if ((path_length - shortcut_length) <= scale_(10.0))
+ continue;
+
+ intersections.clear();
+ visitor.reset();
+ visitor.travel_line.a = current.point;
+ visitor.travel_line.b = possible_new_next.point;
+ boundary.grid.visit_cells_intersecting_line(visitor.travel_line.a, visitor.travel_line.b, visitor);
+ if (!intersections.empty()) {
+ Vec2d dir = (visitor.travel_line.b - visitor.travel_line.a).cast<double>();
+ std::sort(intersections.begin(), intersections.end(), [dir](const auto &l, const auto &r) { return (r.point - l.point).template cast<double>().dot(dir) > 0.; });
+ size_t last_border_idx_count = 0;
+ for (const Intersection &intersection : intersections)
+ if (int(intersection.border_idx) == possible_new_next.border_idx)
+ ++last_border_idx_count;
+
+ if (last_border_idx_count > 0)
+ continue;
+
+ std::vector<TravelPoint> possible_shortcut;
+ avoid_perimeters_inner(boundary, current.point, possible_new_next.point, possible_shortcut);
+ double shortcut_travel = travel_length(possible_shortcut);
+ if (path_length > shortcut_travel && path_length - shortcut_travel > new_path_shorter_by) {
+ new_path_shorter_by = path_length - shortcut_travel;
+ shortcut = possible_shortcut;
+ new_next = possible_new_next;
+ new_point_idx = point_idx_2;
+ }
+ }
+ }
+
+ if (!shortcut.empty()) {
+ assert(shortcut.size() >= 2);
+ simplified_path.insert(simplified_path.end(), shortcut.begin() + 1, shortcut.end() - 1);
+ point_idx = new_point_idx;
+ }
+
+ simplified_path.emplace_back(new_next);
+ }
+ }
+
+ return simplified_path;
+}
+
+// Called by AvoidCrossingPerimeters::travel_to()
+static size_t avoid_perimeters(const AvoidCrossingPerimeters::Boundary &boundary,
+ const Point &start,
+ const Point &end,
+ Polyline &result_out)
+{
+ // Travel line is completely or partially inside the bounding box.
+ std::vector<TravelPoint> path;
+ size_t num_intersections = avoid_perimeters_inner(boundary, start, end, path);
+ if (num_intersections) {
+ path = simplify_travel_heuristics(boundary, path);
+ std::reverse(path.begin(), path.end());
+ path = simplify_travel_heuristics(boundary, path);
+ std::reverse(path.begin(), path.end());
+ }
+
+ result_out = to_polyline(path);
+
+#ifdef AVOID_CROSSING_PERIMETERS_DEBUG_OUTPUT
+ {
+ static int iRun = 0;
+ export_travel_to_svg(boundaries, Line(start, end), path, {}, debug_out_path("AvoidCrossingPerimeters-final-%d.svg", iRun ++));
+ }
+#endif /* AVOID_CROSSING_PERIMETERS_DEBUG_OUTPUT */
+
+ return num_intersections;
+}
+
+// Plan travel, which avoids perimeter crossings by following the boundaries of the layer.
+Polyline AvoidCrossingPerimeters::travel_to(const GCode &gcodegen, const Point &point, bool *could_be_wipe_disabled)
+{
+ // If use_external, then perform the path planning in the world coordinate system (correcting for the gcodegen offset).
+ // Otherwise perform the path planning in the coordinate system of the active object.
+ bool use_external = m_use_external_mp || m_use_external_mp_once;
+ Point scaled_origin = use_external ? Point::new_scale(gcodegen.origin()(0), gcodegen.origin()(1)) : Point(0, 0);
+ Point start = gcodegen.last_pos() + scaled_origin;
+ Point end = point + scaled_origin;
+ Polyline result_pl;
+ size_t travel_intersection_count = 0;
+ Vec2d startf = start.cast<double>();
+ Vec2d endf = end .cast<double>();
+ // Trim the travel line by the bounding box.
+ if (Geometry::liang_barsky_line_clipping(startf, endf, (use_external ? m_external : m_internal).bbox)) {
+ // Travel line is completely or partially inside the bounding box.
+ //FIXME initialize m_boundaries / m_boundaries_external on demand?
+ travel_intersection_count = avoid_perimeters((use_external ? m_external : m_internal), startf.cast<coord_t>(), endf.cast<coord_t>(),
+ result_pl);
+ result_pl.points.front() = start;
+ result_pl.points.back() = end;
+ } else {
+ // Travel line is completely outside the bounding box.
+ result_pl = {start, end};
+ travel_intersection_count = 0;
+ }
+
+ Line travel(start, end);
+ double max_detour_length scale_(gcodegen.config().avoid_crossing_perimeters_max_detour);
+ if (max_detour_length > 0 && (result_pl.length() - travel.length()) > max_detour_length)
+ result_pl = {start, end};
+
+ if (use_external) {
+ result_pl.translate(-scaled_origin);
+ *could_be_wipe_disabled = false;
+ } else
+ *could_be_wipe_disabled = !need_wipe(gcodegen, m_grid_lslice, travel, result_pl, travel_intersection_count);
+
+ return result_pl;
+}
+
+// called by AvoidCrossingPerimeters::init_layer()->get_boundary()/get_boundary_external()
+static std::pair<Polygons, Polygons> split_expolygon(const ExPolygons &ex_polygons)
+{
+ Polygons contours, holes;
+ contours.reserve(ex_polygons.size());
+ holes.reserve(std::accumulate(ex_polygons.begin(), ex_polygons.end(), size_t(0),
+ [](size_t sum, const ExPolygon &ex_poly) { return sum + ex_poly.holes.size(); }));
+ for (const ExPolygon &ex_poly : ex_polygons) {
+ contours.emplace_back(ex_poly.contour);
+ append(holes, ex_poly.holes);
+ }
+ return std::make_pair(std::move(contours), std::move(holes));
+}
+
+// called by AvoidCrossingPerimeters::init_layer()
+static ExPolygons get_boundary(const Layer &layer)
+{
+ const float perimeter_spacing = get_perimeter_spacing(layer);
+ const float perimeter_offset = perimeter_spacing / 2.f;
+ size_t polygons_count = 0;
+ for (const LayerRegion *layer_region : layer.regions())
+ polygons_count += layer_region->slices.surfaces.size();
+
+ ExPolygons boundary;
+ boundary.reserve(polygons_count);
+ for (const LayerRegion *layer_region : layer.regions())
+ for (const Surface &surface : layer_region->slices.surfaces)
+ boundary.emplace_back(surface.expolygon);
+
+ boundary = union_ex(boundary);
+ ExPolygons perimeter_boundary = offset_ex(boundary, -perimeter_offset);
+ ExPolygons result_boundary;
+ if (perimeter_boundary.size() != boundary.size()) {
+ //FIXME ???
+ // If any part of the polygon is missing after shrinking, then for misisng parts are is used the boundary of the slice.
+ ExPolygons missing_perimeter_boundary = offset_ex(diff_ex(boundary,
+ offset_ex(perimeter_boundary, perimeter_offset + float(SCALED_EPSILON) / 2.f)),
+ perimeter_offset + float(SCALED_EPSILON));
+ perimeter_boundary = offset_ex(perimeter_boundary, perimeter_offset);
+ append(perimeter_boundary, std::move(missing_perimeter_boundary));
+ // By calling intersection_ex some artifacts arose by previous operations are removed.
+ result_boundary = intersection_ex(offset_ex(perimeter_boundary, -perimeter_offset), boundary);
+ } else {
+ result_boundary = std::move(perimeter_boundary);
+ }
+
+ auto [contours, holes] = split_expolygon(boundary);
+ // Add an outer boundary to avoid crossing perimeters from supports
+ ExPolygons outer_boundary = union_ex(
+ diff(offset(Geometry::convex_hull(contours), 2.f * perimeter_spacing), offset(contours, perimeter_spacing + perimeter_offset)));
+ result_boundary.insert(result_boundary.end(), outer_boundary.begin(), outer_boundary.end());
+ ExPolygons holes_boundary = offset_ex(holes, -perimeter_spacing);
+ result_boundary.insert(result_boundary.end(), holes_boundary.begin(), holes_boundary.end());
+ result_boundary = union_ex(result_boundary);
+
+ // Collect all top layers that will not be crossed.
+ polygons_count = 0;
+ for (const LayerRegion *layer_region : layer.regions())
+ for (const Surface &surface : layer_region->fill_surfaces.surfaces)
+ if (surface.is_top()) ++polygons_count;
+
+ if (polygons_count > 0) {
+ ExPolygons top_layer_polygons;
+ top_layer_polygons.reserve(polygons_count);
+ for (const LayerRegion *layer_region : layer.regions())
+ for (const Surface &surface : layer_region->fill_surfaces.surfaces)
+ if (surface.is_top()) top_layer_polygons.emplace_back(surface.expolygon);
+
+ top_layer_polygons = union_ex(top_layer_polygons);
+ return diff_ex(result_boundary, offset_ex(top_layer_polygons, -perimeter_offset));
+ }
+
+ return result_boundary;
+}
+
+// called by AvoidCrossingPerimeters::init_layer()
+static ExPolygons get_boundary_external(const Layer &layer)
+{
+ const float perimeter_spacing = get_perimeter_spacing_external(layer);
+ const float perimeter_offset = perimeter_spacing / 2.f;
+ ExPolygons boundary;
+ // Collect all polygons for all printed objects and their instances, which will be printed at the same time as passed "layer".
+ for (const PrintObject *object : layer.object()->print()->objects()) {
+ ExPolygons polygons_per_obj;
+ //FIXME with different layering, layers on other objects will not be found at this object's print_z.
+ // Search an overlap of layers?
+ if (const Layer* l = object->get_layer_at_printz(layer.print_z, EPSILON); l)
+ for (const LayerRegion *layer_region : l->regions())
+ for (const Surface &surface : layer_region->slices.surfaces)
+ polygons_per_obj.emplace_back(surface.expolygon);
+
+ for (const PrintInstance &instance : object->instances()) {
+ size_t boundary_idx = boundary.size();
+ boundary.insert(boundary.end(), polygons_per_obj.begin(), polygons_per_obj.end());
+ for (; boundary_idx < boundary.size(); ++boundary_idx)
+ boundary[boundary_idx].translate(instance.shift);
+ }
+ }
+ boundary = union_ex(boundary);
+ auto [contours, holes] = split_expolygon(boundary);
+ // Polygons in which is possible traveling without crossing perimeters of another object.
+ // A convex hull allows removing unnecessary detour caused by following the boundary of the object.
+ ExPolygons result_boundary =
+ diff_ex(offset(Geometry::convex_hull(contours), 2.f * perimeter_spacing),offset(contours, perimeter_spacing + perimeter_offset));
+ // All holes are extended for forcing travel around the outer perimeter of a hole when a hole is crossed.
+ append(result_boundary, diff_ex(offset(holes, perimeter_spacing), offset(holes, perimeter_offset)));
+ return union_ex(result_boundary);
+}
+
+void AvoidCrossingPerimeters::init_layer(const Layer &layer)
+{
+ m_internal.boundaries.clear();
+ m_external.boundaries.clear();
+
+ m_internal.boundaries = to_polygons(get_boundary(layer));
+ m_external.boundaries = to_polygons(get_boundary_external(layer));
+
+ BoundingBox bbox(get_extents(m_internal.boundaries));
+ bbox.offset(SCALED_EPSILON);
+ BoundingBox bbox_external = get_extents(m_external.boundaries);
+ bbox_external.offset(SCALED_EPSILON);
+ BoundingBox bbox_slice(get_extents(layer.lslices));
+ bbox_slice.offset(SCALED_EPSILON);
+
+ m_internal.bbox = BoundingBoxf(bbox.min.cast<double>(), bbox.max.cast<double>());
+ m_external.bbox = BoundingBoxf(bbox_external.min.cast<double>(), bbox_external.max.cast<double>());
+
+ m_internal.grid.set_bbox(bbox);
+ //FIX1ME 1mm grid?
+ m_internal.grid.create(m_internal.boundaries, coord_t(scale_(1.)));
+ m_external.grid.set_bbox(bbox_external);
+ //FIX1ME 1mm grid?
+ m_external.grid.create(m_external.boundaries, coord_t(scale_(1.)));
+ m_grid_lslice.set_bbox(bbox_slice);
+ //FIX1ME 1mm grid?
+ m_grid_lslice.create(layer.lslices, coord_t(scale_(1.)));
+
+ init_boundary_distances(&m_internal);
+ init_boundary_distances(&m_external);
+}
+#endif
+
+} // namespace Slic3r
diff --git a/src/libslic3r/GCode/AvoidCrossingPerimeters.hpp b/src/libslic3r/GCode/AvoidCrossingPerimeters.hpp
new file mode 100644
index 000000000..03c420a32
--- /dev/null
+++ b/src/libslic3r/GCode/AvoidCrossingPerimeters.hpp
@@ -0,0 +1,70 @@
+#ifndef slic3r_AvoidCrossingPerimeters_hpp_
+#define slic3r_AvoidCrossingPerimeters_hpp_
+
+#include "../libslic3r.h"
+#include "../ExPolygon.hpp"
+#include "../EdgeGrid.hpp"
+
+namespace Slic3r {
+
+// Forward declarations.
+class GCode;
+class Layer;
+class Point;
+
+class AvoidCrossingPerimeters
+{
+public:
+ // Routing around the objects vs. inside a single object.
+ void use_external_mp(bool use = true) { m_use_external_mp = use; };
+ void use_external_mp_once() { m_use_external_mp_once = true; }
+ void disable_once() { m_disabled_once = true; }
+ bool disabled_once() const { return m_disabled_once; }
+ void reset_once_modifiers() { m_use_external_mp_once = false; m_disabled_once = false; }
+
+ void init_layer(const Layer &layer);
+
+ Polyline travel_to(const GCode& gcodegen, const Point& point)
+ {
+ bool could_be_wipe_disabled;
+ return this->travel_to(gcodegen, point, &could_be_wipe_disabled);
+ }
+
+ Polyline travel_to(const GCode& gcodegen, const Point& point, bool* could_be_wipe_disabled);
+
+ struct Boundary {
+ // Collection of boundaries used for detection of crossing perimeters for travels
+ Polygons boundaries;
+ // Bounding box of boundaries
+ BoundingBoxf bbox;
+ // Precomputed distances of all points in boundaries
+ std::vector<std::vector<float>> boundaries_params;
+ // Used for detection of intersection between line and any polygon from boundaries
+ EdgeGrid::Grid grid;
+
+ void clear()
+ {
+ boundaries.clear();
+ boundaries_params.clear();
+ }
+ };
+
+private:
+ bool m_use_external_mp { false };
+ // just for the next travel move
+ bool m_use_external_mp_once { false };
+ // this flag disables avoid_crossing_perimeters just for the next travel move
+ // we enable it by default for the first travel move in print
+ bool m_disabled_once { true };
+
+ // Used for detection of line or polyline is inside of any polygon.
+ EdgeGrid::Grid m_grid_lslice;
+ // Store all needed data for travels inside object
+ Boundary m_internal;
+ // Store all needed data for travels outside object
+ Boundary m_external;
+};
+
+} // namespace Slic3r
+
+#endif // slic3r_AvoidCrossingPerimeters_hpp_
diff --git a/src/libslic3r/GCode/CoolingBuffer.cpp b/src/libslic3r/GCode/CoolingBuffer.cpp
index 6815ea73a..07ab197f2 100644
--- a/src/libslic3r/GCode/CoolingBuffer.cpp
+++ b/src/libslic3r/GCode/CoolingBuffer.cpp
@@ -682,7 +682,8 @@ std::string CoolingBuffer::apply_layer_cooldown(
#define EXTRUDER_CONFIG(OPT) config.OPT.get_at(m_current_extruder)
int min_fan_speed = EXTRUDER_CONFIG(min_fan_speed);
int fan_speed_new = EXTRUDER_CONFIG(fan_always_on) ? min_fan_speed : 0;
- if (layer_id >= (size_t)EXTRUDER_CONFIG(disable_fan_first_layers)) {
+ int disable_fan_first_layers = EXTRUDER_CONFIG(disable_fan_first_layers);
+ if (int(layer_id) >= disable_fan_first_layers) {
int max_fan_speed = EXTRUDER_CONFIG(max_fan_speed);
float slowdown_below_layer_time = float(EXTRUDER_CONFIG(slowdown_below_layer_time));
float fan_below_layer_time = float(EXTRUDER_CONFIG(fan_below_layer_time));
@@ -698,6 +699,17 @@ std::string CoolingBuffer::apply_layer_cooldown(
}
}
bridge_fan_speed = EXTRUDER_CONFIG(bridge_fan_speed);
+ // Is the fan speed ramp enabled?
+ int full_fan_speed_layer = EXTRUDER_CONFIG(full_fan_speed_layer);
+ // When ramping up fan speed from disable_fan_first_layers to full_fan_speed_layer, force disable_fan_first_layers above zero,
+ // so there will be a zero fan speed at least at the 1st layer.
+ disable_fan_first_layers = std::max(disable_fan_first_layers, 1);
+ if (int(layer_id) >= disable_fan_first_layers && int(layer_id) + 1 < full_fan_speed_layer) {
+ // Ramp up the fan speed from disable_fan_first_layers to full_fan_speed_layer.
+ float factor = float(int(layer_id + 1) - disable_fan_first_layers) / float(full_fan_speed_layer - disable_fan_first_layers);
+ fan_speed_new = clamp(0, 255, int(float(fan_speed_new ) * factor + 0.5f));
+ bridge_fan_speed = clamp(0, 255, int(float(bridge_fan_speed) * factor + 0.5f));
+ }
#undef EXTRUDER_CONFIG
bridge_fan_control = bridge_fan_speed > fan_speed_new;
} else {
diff --git a/src/libslic3r/GCode/GCodeProcessor.cpp b/src/libslic3r/GCode/GCodeProcessor.cpp
new file mode 100644
index 000000000..d553d727a
--- /dev/null
+++ b/src/libslic3r/GCode/GCodeProcessor.cpp
@@ -0,0 +1,2530 @@
+#include "libslic3r/libslic3r.h"
+#include "libslic3r/Utils.hpp"
+#include "libslic3r/Print.hpp"
+#include "GCodeProcessor.hpp"
+
+#include <boost/log/trivial.hpp>
+#include <boost/nowide/fstream.hpp>
+#include <boost/nowide/cstdio.hpp>
+
+#include <float.h>
+#include <assert.h>
+
+#if __has_include(<charconv>)
+ #include <charconv>
+ #include <utility>
+#endif
+
+#include <chrono>
+
+static const float INCHES_TO_MM = 25.4f;
+static const float MMMIN_TO_MMSEC = 1.0f / 60.0f;
+
+static const float DEFAULT_ACCELERATION = 1500.0f; // Prusa Firmware 1_75mm_MK2
+
+namespace Slic3r {
+
+const std::string GCodeProcessor::Extrusion_Role_Tag = "TYPE:";
+const std::string GCodeProcessor::Wipe_Start_Tag = "WIPE_START";
+const std::string GCodeProcessor::Wipe_End_Tag = "WIPE_END";
+const std::string GCodeProcessor::Height_Tag = "HEIGHT:";
+const std::string GCodeProcessor::Layer_Change_Tag = "LAYER_CHANGE";
+const std::string GCodeProcessor::Color_Change_Tag = "COLOR_CHANGE";
+const std::string GCodeProcessor::Pause_Print_Tag = "PAUSE_PRINT";
+const std::string GCodeProcessor::Custom_Code_Tag = "CUSTOM_GCODE";
+
+const std::string GCodeProcessor::First_Line_M73_Placeholder_Tag = "; _GP_FIRST_LINE_M73_PLACEHOLDER";
+const std::string GCodeProcessor::Last_Line_M73_Placeholder_Tag = "; _GP_LAST_LINE_M73_PLACEHOLDER";
+const std::string GCodeProcessor::Estimated_Printing_Time_Placeholder_Tag = "; _GP_ESTIMATED_PRINTING_TIME_PLACEHOLDER";
+
+const float GCodeProcessor::Wipe_Width = 0.05f;
+const float GCodeProcessor::Wipe_Height = 0.05f;
+
+#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+const std::string GCodeProcessor::Width_Tag = "WIDTH:";
+#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+#if ENABLE_GCODE_VIEWER_DATA_CHECKING
+#if !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+const std::string GCodeProcessor::Width_Tag = "WIDTH:";
+#endif // !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+const std::string GCodeProcessor::Mm3_Per_Mm_Tag = "MM3_PER_MM:";
+#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
+
+static bool is_valid_extrusion_role(int value)
+{
+ return (static_cast<int>(erNone) <= value) && (value <= static_cast<int>(erMixed));
+}
+
+static void set_option_value(ConfigOptionFloats& option, size_t id, float value)
+{
+ if (id < option.values.size())
+ option.values[id] = static_cast<double>(value);
+};
+
+static float get_option_value(const ConfigOptionFloats& option, size_t id)
+{
+ return option.values.empty() ? 0.0f :
+ ((id < option.values.size()) ? static_cast<float>(option.values[id]) : static_cast<float>(option.values.back()));
+}
+
+static float estimated_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);
+}
+
+static float 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);
+}
+
+static float speed_from_distance(float initial_feedrate, float distance, float acceleration)
+{
+ // to avoid invalid negative numbers due to numerical errors
+ float value = std::max(0.0f, sqr(initial_feedrate) + 2.0f * acceleration * distance);
+ return ::sqrt(value);
+}
+
+// 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)
+{
+ // to avoid invalid negative numbers due to numerical errors
+ float value = std::max(0.0f, sqr(target_velocity) - 2.0f * acceleration * distance);
+ return std::sqrt(value);
+}
+
+static float 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;
+}
+
+void GCodeProcessor::CachedPosition::reset()
+{
+ std::fill(position.begin(), position.end(), FLT_MAX);
+ feedrate = FLT_MAX;
+}
+
+void GCodeProcessor::CpColor::reset()
+{
+ counter = 0;
+ current = 0;
+}
+
+float GCodeProcessor::Trapezoid::acceleration_time(float entry_feedrate, float acceleration) const
+{
+ return acceleration_time_from_distance(entry_feedrate, accelerate_until, acceleration);
+}
+
+float GCodeProcessor::Trapezoid::cruise_time() const
+{
+ return (cruise_feedrate != 0.0f) ? cruise_distance() / cruise_feedrate : 0.0f;
+}
+
+float GCodeProcessor::Trapezoid::deceleration_time(float distance, float acceleration) const
+{
+ return acceleration_time_from_distance(cruise_feedrate, (distance - decelerate_after), -acceleration);
+}
+
+float GCodeProcessor::Trapezoid::cruise_distance() const
+{
+ return decelerate_after - accelerate_until;
+}
+
+void GCodeProcessor::TimeBlock::calculate_trapezoid()
+{
+ trapezoid.cruise_feedrate = feedrate_profile.cruise;
+
+ float accelerate_distance = std::max(0.0f, estimated_acceleration_distance(feedrate_profile.entry, feedrate_profile.cruise, acceleration));
+ float decelerate_distance = std::max(0.0f, estimated_acceleration_distance(feedrate_profile.cruise, feedrate_profile.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_profile.entry, feedrate_profile.exit, acceleration, distance), 0.0f, distance);
+ cruise_distance = 0.0f;
+ trapezoid.cruise_feedrate = speed_from_distance(feedrate_profile.entry, accelerate_distance, acceleration);
+ }
+
+ trapezoid.accelerate_until = accelerate_distance;
+ trapezoid.decelerate_after = accelerate_distance + cruise_distance;
+}
+
+float GCodeProcessor::TimeBlock::time() const
+{
+ return trapezoid.acceleration_time(feedrate_profile.entry, acceleration)
+ + trapezoid.cruise_time()
+ + trapezoid.deceleration_time(distance, acceleration);
+}
+
+void GCodeProcessor::TimeMachine::State::reset()
+{
+ feedrate = 0.0f;
+ safe_feedrate = 0.0f;
+ axis_feedrate = { 0.0f, 0.0f, 0.0f, 0.0f };
+ abs_axis_feedrate = { 0.0f, 0.0f, 0.0f, 0.0f };
+}
+
+void GCodeProcessor::TimeMachine::CustomGCodeTime::reset()
+{
+ needed = false;
+ cache = 0.0f;
+ times = std::vector<std::pair<CustomGCode::Type, float>>();
+}
+
+void GCodeProcessor::TimeMachine::reset()
+{
+ enabled = false;
+ acceleration = 0.0f;
+ max_acceleration = 0.0f;
+ extrude_factor_override_percentage = 1.0f;
+ time = 0.0f;
+ curr.reset();
+ prev.reset();
+ gcode_time.reset();
+ blocks = std::vector<TimeBlock>();
+ g1_times_cache = std::vector<G1LinesCacheItem>();
+ std::fill(moves_time.begin(), moves_time.end(), 0.0f);
+ std::fill(roles_time.begin(), roles_time.end(), 0.0f);
+ layers_time = std::vector<float>();
+}
+
+void GCodeProcessor::TimeMachine::simulate_st_synchronize(float additional_time)
+{
+ if (!enabled)
+ return;
+
+ time += additional_time;
+ gcode_time.cache += additional_time;
+ calculate_time();
+}
+
+static void planner_forward_pass_kernel(GCodeProcessor::TimeBlock& prev, GCodeProcessor::TimeBlock& curr)
+{
+ // 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_profile.entry < curr.feedrate_profile.entry) {
+ float entry_speed = std::min(curr.feedrate_profile.entry, max_allowable_speed(-prev.acceleration, prev.feedrate_profile.entry, prev.distance));
+
+ // Check for junction speed change
+ if (curr.feedrate_profile.entry != entry_speed) {
+ curr.feedrate_profile.entry = entry_speed;
+ curr.flags.recalculate = true;
+ }
+ }
+ }
+}
+
+void planner_reverse_pass_kernel(GCodeProcessor::TimeBlock& curr, GCodeProcessor::TimeBlock& 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_profile.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_profile.entry)
+ curr.feedrate_profile.entry = std::min(curr.max_entry_speed, max_allowable_speed(-curr.acceleration, next.feedrate_profile.entry, curr.distance));
+ else
+ curr.feedrate_profile.entry = curr.max_entry_speed;
+
+ curr.flags.recalculate = true;
+ }
+}
+
+static void recalculate_trapezoids(std::vector<GCodeProcessor::TimeBlock>& blocks)
+{
+ GCodeProcessor::TimeBlock* curr = nullptr;
+ GCodeProcessor::TimeBlock* next = nullptr;
+
+ for (size_t i = 0; i < blocks.size(); ++i) {
+ GCodeProcessor::TimeBlock& b = 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.
+ GCodeProcessor::TimeBlock block = *curr;
+ block.feedrate_profile.exit = next->feedrate_profile.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) {
+ GCodeProcessor::TimeBlock block = *next;
+ block.feedrate_profile.exit = next->safe_feedrate;
+ block.calculate_trapezoid();
+ next->trapezoid = block.trapezoid;
+ next->flags.recalculate = false;
+ }
+}
+
+void GCodeProcessor::TimeMachine::calculate_time(size_t keep_last_n_blocks)
+{
+ if (!enabled || blocks.size() < 2)
+ return;
+
+ assert(keep_last_n_blocks <= blocks.size());
+
+ // forward_pass
+ for (size_t i = 0; i + 1 < blocks.size(); ++i) {
+ planner_forward_pass_kernel(blocks[i], blocks[i + 1]);
+ }
+
+ // reverse_pass
+ for (int i = static_cast<int>(blocks.size()) - 1; i > 0; --i)
+ planner_reverse_pass_kernel(blocks[i - 1], blocks[i]);
+
+ recalculate_trapezoids(blocks);
+
+ size_t n_blocks_process = blocks.size() - keep_last_n_blocks;
+ for (size_t i = 0; i < n_blocks_process; ++i) {
+ const TimeBlock& block = blocks[i];
+ float block_time = block.time();
+ time += block_time;
+ gcode_time.cache += block_time;
+ moves_time[static_cast<size_t>(block.move_type)] += block_time;
+ roles_time[static_cast<size_t>(block.role)] += block_time;
+ if (block.layer_id > 0) {
+ if (block.layer_id >= layers_time.size()) {
+ size_t curr_size = layers_time.size();
+ layers_time.resize(block.layer_id);
+ for (size_t i = curr_size; i < layers_time.size(); ++i) {
+ layers_time[i] = 0.0f;
+ }
+ }
+ layers_time[block.layer_id - 1] += block_time;
+ }
+ g1_times_cache.push_back({ block.g1_line_id, time });
+ }
+
+ if (keep_last_n_blocks)
+ blocks.erase(blocks.begin(), blocks.begin() + n_blocks_process);
+ else
+ blocks.clear();
+}
+
+void GCodeProcessor::TimeProcessor::reset()
+{
+ extruder_unloaded = true;
+ export_remaining_time_enabled = false;
+ machine_envelope_processing_enabled = false;
+ machine_limits = MachineEnvelopeConfig();
+ filament_load_times = std::vector<float>();
+ filament_unload_times = std::vector<float>();
+ for (size_t i = 0; i < static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) {
+ machines[i].reset();
+ }
+ machines[static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Normal)].enabled = true;
+}
+
+void GCodeProcessor::TimeProcessor::post_process(const std::string& filename)
+{
+ 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"));
+
+ // temporary file to contain modified gcode
+ std::string out_path = filename + ".postprocess";
+ FILE* out = boost::nowide::fopen(out_path.c_str(), "wb");
+ if (out == nullptr)
+ throw Slic3r::RuntimeError(std::string("Time estimator post process export failed.\nCannot open file for writing.\n"));
+
+ auto time_in_minutes = [](float time_in_seconds) {
+ return int(::roundf(time_in_seconds / 60.0f));
+ };
+
+ auto format_line_M73 = [](const std::string& mask, int percent, int time) {
+ char line_M73[64];
+ sprintf(line_M73, mask.c_str(),
+ std::to_string(percent).c_str(),
+ std::to_string(time).c_str());
+ return std::string(line_M73);
+ };
+
+ GCodeReader parser;
+ std::string gcode_line;
+ size_t g1_lines_counter = 0;
+ // keeps track of last exported pair <percent, remaining time>
+ std::array<std::pair<int, int>, static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Count)> last_exported;
+ for (size_t i = 0; i < static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) {
+ last_exported[i] = { 0, time_in_minutes(machines[i].time) };
+ }
+
+ // buffer line to export only when greater than 64K to reduce writing calls
+ std::string export_line;
+
+ // replace placeholder lines with the proper final value
+ auto process_placeholders = [&](const std::string& gcode_line) {
+ // remove trailing '\n'
+ std::string line = gcode_line.substr(0, gcode_line.length() - 1);
+
+ std::string ret;
+
+ 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<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) {
+ const TimeMachine& machine = machines[i];
+ if (machine.enabled) {
+ ret += format_line_M73(machine.line_m73_mask.c_str(),
+ (line == First_Line_M73_Placeholder_Tag) ? 0 : 100,
+ (line == First_Line_M73_Placeholder_Tag) ? time_in_minutes(machines[i].time) : 0);
+ }
+ }
+ }
+ else if (line == Estimated_Printing_Time_Placeholder_Tag) {
+ for (size_t i = 0; i < static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) {
+ const TimeMachine& machine = machines[i];
+ PrintEstimatedTimeStatistics::ETimeMode mode = static_cast<PrintEstimatedTimeStatistics::ETimeMode>(i);
+ if (mode == PrintEstimatedTimeStatistics::ETimeMode::Normal || machine.enabled) {
+ char buf[128];
+ sprintf(buf, "; estimated printing time (%s mode) = %s\n",
+ (mode == PrintEstimatedTimeStatistics::ETimeMode::Normal) ? "normal" : "silent",
+ get_time_dhms(machine.time).c_str());
+ ret += buf;
+ }
+ }
+ }
+
+ return std::make_pair(!ret.empty(), ret.empty() ? gcode_line : ret);
+ };
+
+ // check for temporary lines
+ auto is_temporary_decoration = [](const std::string_view gcode_line) {
+ // remove trailing '\n'
+ assert(! gcode_line.empty());
+ assert(gcode_line.back() == '\n');
+
+ // return true for decorations which are used in processing the gcode but that should not be exported into the final gcode
+ // i.e.:
+ // bool ret = gcode_line.substr(0, gcode_line.length() - 1) == ";" + Layer_Change_Tag;
+ // ...
+ // return ret;
+ 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<std::vector<TimeMachine::G1LinesCacheItem>::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<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) {
+ const TimeMachine& machine = machines[i];
+ if (machine.enabled) {
+ // Skip all machine.g1_times_cache below g1_lines_counter.
+ auto& it = g1_times_cache_it[i];
+ while (it != machine.g1_times_cache.end() && it->id < g1_lines_counter)
+ ++it;
+ if (it != machine.g1_times_cache.end() && it->id == g1_lines_counter) {
+ float elapsed_time = it->elapsed_time;
+ std::pair<int, int> to_export = { int(100.0f * elapsed_time / machine.time),
+ time_in_minutes(machine.time - elapsed_time) };
+ if (last_exported[i] != to_export) {
+ export_line += format_line_M73(machine.line_m73_mask.c_str(),
+ to_export.first, to_export.second);
+ last_exported[i] = to_export;
+ }
+ }
+ }
+ }
+ }
+ };
+
+ // 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(out_path.c_str());
+ throw Slic3r::RuntimeError(std::string("Time estimator post process export failed.\nIs the disk full?\n"));
+ }
+ export_line.clear();
+ };
+
+ 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"));
+ }
+
+ gcode_line += "\n";
+ // replace placeholder lines
+ auto [processed, result] = process_placeholders(gcode_line);
+ gcode_line = result;
+ if (!processed) {
+ // remove temporary lines
+ if (is_temporary_decoration(gcode_line))
+ continue;
+
+ // add lines M73 where needed
+ parser.parse_line(gcode_line,
+ [&](GCodeReader& reader, const GCodeReader::GCodeLine& line) {
+ if (line.cmd_is("G1")) {
+ process_line_G1();
+ ++g1_lines_counter;
+ }
+ });
+ }
+
+ 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(out_path, filename))
+ throw Slic3r::RuntimeError(std::string("Failed to rename the output G-code file from ") + out_path + " to " + filename + '\n' +
+ "Is " + out_path + " locked?" + '\n');
+}
+
+const std::vector<std::pair<GCodeProcessor::EProducer, std::string>> GCodeProcessor::Producers = {
+ { EProducer::PrusaSlicer, "PrusaSlicer" },
+ { EProducer::Slic3rPE, "Slic3r Prusa Edition" },
+ { EProducer::Slic3r, "Slic3r" },
+ { EProducer::Cura, "Cura_SteamEngine" },
+ { EProducer::Simplify3D, "Simplify3D" },
+ { EProducer::CraftWare, "CraftWare" },
+ { EProducer::ideaMaker, "ideaMaker" },
+ { EProducer::KissSlicer, "KISSlicer" }
+};
+
+unsigned int GCodeProcessor::s_result_id = 0;
+
+GCodeProcessor::GCodeProcessor()
+{
+ reset();
+ m_time_processor.machines[static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Normal)].line_m73_mask = "M73 P%s R%s\n";
+ m_time_processor.machines[static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Stealth)].line_m73_mask = "M73 Q%s S%s\n";
+}
+
+void GCodeProcessor::apply_config(const PrintConfig& config)
+{
+ m_parser.apply_config(config);
+
+ m_flavor = config.gcode_flavor;
+
+ size_t extruders_count = config.nozzle_diameter.values.size();
+ m_result.extruders_count = extruders_count;
+
+ m_extruder_offsets.resize(extruders_count);
+ for (size_t i = 0; i < extruders_count; ++i) {
+ Vec2f offset = config.extruder_offset.get_at(i).cast<float>();
+ m_extruder_offsets[i] = { offset(0), offset(1), 0.0f };
+ }
+
+ m_extruder_colors.resize(extruders_count);
+ for (size_t i = 0; i < extruders_count; ++i) {
+ m_extruder_colors[i] = static_cast<unsigned char>(i);
+ }
+
+ m_filament_diameters.resize(config.filament_diameter.values.size());
+ for (size_t i = 0; i < config.filament_diameter.values.size(); ++i) {
+ m_filament_diameters[i] = static_cast<float>(config.filament_diameter.values[i]);
+ }
+
+ if (m_flavor == gcfMarlin && config.machine_limits_usage.value != MachineLimitsUsage::Ignore)
+ m_time_processor.machine_limits = reinterpret_cast<const MachineEnvelopeConfig&>(config);
+
+ // Filament load / unload times are not specific to a firmware flavor. Let anybody use it if they find it useful.
+ // As of now the fields are shown at the UI dialog in the same combo box as the ramming values, so they
+ // are considered to be active for the single extruder multi-material printers only.
+ m_time_processor.filament_load_times.resize(config.filament_load_time.values.size());
+ for (size_t i = 0; i < config.filament_load_time.values.size(); ++i) {
+ m_time_processor.filament_load_times[i] = static_cast<float>(config.filament_load_time.values[i]);
+ }
+ m_time_processor.filament_unload_times.resize(config.filament_unload_time.values.size());
+ for (size_t i = 0; i < config.filament_unload_time.values.size(); ++i) {
+ m_time_processor.filament_unload_times[i] = static_cast<float>(config.filament_unload_time.values[i]);
+ }
+
+ for (size_t i = 0; i < static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) {
+ float max_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_extruding, i);
+ m_time_processor.machines[i].max_acceleration = max_acceleration;
+ m_time_processor.machines[i].acceleration = (max_acceleration > 0.0f) ? max_acceleration : DEFAULT_ACCELERATION;
+ }
+
+ m_time_processor.export_remaining_time_enabled = config.remaining_times.value;
+
+#if ENABLE_VOLUMETRIC_EXTRUSION_PROCESSING
+ m_use_volumetric_e = config.use_volumetric_e;
+#endif // ENABLE_VOLUMETRIC_EXTRUSION_PROCESSING
+}
+
+void GCodeProcessor::apply_config(const DynamicPrintConfig& config)
+{
+ m_parser.apply_config(config);
+
+ const ConfigOptionEnum<GCodeFlavor>* gcode_flavor = config.option<ConfigOptionEnum<GCodeFlavor>>("gcode_flavor");
+ if (gcode_flavor != nullptr)
+ m_flavor = gcode_flavor->value;
+
+ const ConfigOptionPoints* bed_shape = config.option<ConfigOptionPoints>("bed_shape");
+ if (bed_shape != nullptr)
+ m_result.bed_shape = bed_shape->values;
+
+ const ConfigOptionString* print_settings_id = config.option<ConfigOptionString>("print_settings_id");
+ if (print_settings_id != nullptr)
+ m_result.settings_ids.print = print_settings_id->value;
+
+ const ConfigOptionStrings* filament_settings_id = config.option<ConfigOptionStrings>("filament_settings_id");
+ if (filament_settings_id != nullptr)
+ m_result.settings_ids.filament = filament_settings_id->values;
+
+ const ConfigOptionString* printer_settings_id = config.option<ConfigOptionString>("printer_settings_id");
+ if (printer_settings_id != nullptr)
+ m_result.settings_ids.printer = printer_settings_id->value;
+
+ const ConfigOptionFloats* filament_diameters = config.option<ConfigOptionFloats>("filament_diameter");
+ if (filament_diameters != nullptr) {
+ for (double diam : filament_diameters->values) {
+ m_filament_diameters.push_back(static_cast<float>(diam));
+ }
+ }
+
+ m_result.extruders_count = config.option<ConfigOptionFloats>("nozzle_diameter")->values.size();
+
+ const ConfigOptionPoints* extruder_offset = config.option<ConfigOptionPoints>("extruder_offset");
+ if (extruder_offset != nullptr) {
+ m_extruder_offsets.resize(extruder_offset->values.size());
+ for (size_t i = 0; i < extruder_offset->values.size(); ++i) {
+ Vec2f offset = extruder_offset->values[i].cast<float>();
+ m_extruder_offsets[i] = { offset(0), offset(1), 0.0f };
+ }
+ }
+
+ const ConfigOptionStrings* extruder_colour = config.option<ConfigOptionStrings>("extruder_colour");
+ if (extruder_colour != nullptr) {
+ // takes colors from config
+ m_result.extruder_colors = extruder_colour->values;
+ // try to replace missing values with filament colors
+ const ConfigOptionStrings* filament_colour = config.option<ConfigOptionStrings>("filament_colour");
+ if (filament_colour != nullptr && filament_colour->values.size() == m_result.extruder_colors.size()) {
+ for (size_t i = 0; i < m_result.extruder_colors.size(); ++i) {
+ if (m_result.extruder_colors[i].empty())
+ m_result.extruder_colors[i] = filament_colour->values[i];
+ }
+ }
+ }
+
+ // replace missing values with default
+ std::string default_color = "#FF8000";
+ for (size_t i = 0; i < m_result.extruder_colors.size(); ++i) {
+ if (m_result.extruder_colors[i].empty())
+ m_result.extruder_colors[i] = default_color;
+ }
+
+ m_extruder_colors.resize(m_result.extruder_colors.size());
+ for (size_t i = 0; i < m_result.extruder_colors.size(); ++i) {
+ m_extruder_colors[i] = static_cast<unsigned char>(i);
+ }
+
+ const ConfigOptionFloats* filament_load_time = config.option<ConfigOptionFloats>("filament_load_time");
+ if (filament_load_time != nullptr) {
+ m_time_processor.filament_load_times.resize(filament_load_time->values.size());
+ for (size_t i = 0; i < filament_load_time->values.size(); ++i) {
+ m_time_processor.filament_load_times[i] = static_cast<float>(filament_load_time->values[i]);
+ }
+ }
+
+ const ConfigOptionFloats* filament_unload_time = config.option<ConfigOptionFloats>("filament_unload_time");
+ if (filament_unload_time != nullptr) {
+ m_time_processor.filament_unload_times.resize(filament_unload_time->values.size());
+ for (size_t i = 0; i < filament_unload_time->values.size(); ++i) {
+ m_time_processor.filament_unload_times[i] = static_cast<float>(filament_unload_time->values[i]);
+ }
+ }
+
+ if (m_flavor == gcfMarlin) {
+ const ConfigOptionFloats* machine_max_acceleration_x = config.option<ConfigOptionFloats>("machine_max_acceleration_x");
+ if (machine_max_acceleration_x != nullptr)
+ m_time_processor.machine_limits.machine_max_acceleration_x.values = machine_max_acceleration_x->values;
+
+ const ConfigOptionFloats* machine_max_acceleration_y = config.option<ConfigOptionFloats>("machine_max_acceleration_y");
+ if (machine_max_acceleration_y != nullptr)
+ m_time_processor.machine_limits.machine_max_acceleration_y.values = machine_max_acceleration_y->values;
+
+ const ConfigOptionFloats* machine_max_acceleration_z = config.option<ConfigOptionFloats>("machine_max_acceleration_z");
+ if (machine_max_acceleration_z != nullptr)
+ m_time_processor.machine_limits.machine_max_acceleration_z.values = machine_max_acceleration_z->values;
+
+ const ConfigOptionFloats* machine_max_acceleration_e = config.option<ConfigOptionFloats>("machine_max_acceleration_e");
+ if (machine_max_acceleration_e != nullptr)
+ m_time_processor.machine_limits.machine_max_acceleration_e.values = machine_max_acceleration_e->values;
+
+ const ConfigOptionFloats* machine_max_feedrate_x = config.option<ConfigOptionFloats>("machine_max_feedrate_x");
+ if (machine_max_feedrate_x != nullptr)
+ m_time_processor.machine_limits.machine_max_feedrate_x.values = machine_max_feedrate_x->values;
+
+ const ConfigOptionFloats* machine_max_feedrate_y = config.option<ConfigOptionFloats>("machine_max_feedrate_y");
+ if (machine_max_feedrate_y != nullptr)
+ m_time_processor.machine_limits.machine_max_feedrate_y.values = machine_max_feedrate_y->values;
+
+ const ConfigOptionFloats* machine_max_feedrate_z = config.option<ConfigOptionFloats>("machine_max_feedrate_z");
+ if (machine_max_feedrate_z != nullptr)
+ m_time_processor.machine_limits.machine_max_feedrate_z.values = machine_max_feedrate_z->values;
+
+ const ConfigOptionFloats* machine_max_feedrate_e = config.option<ConfigOptionFloats>("machine_max_feedrate_e");
+ if (machine_max_feedrate_e != nullptr)
+ m_time_processor.machine_limits.machine_max_feedrate_e.values = machine_max_feedrate_e->values;
+
+ const ConfigOptionFloats* machine_max_jerk_x = config.option<ConfigOptionFloats>("machine_max_jerk_x");
+ if (machine_max_jerk_x != nullptr)
+ m_time_processor.machine_limits.machine_max_jerk_x.values = machine_max_jerk_x->values;
+
+ const ConfigOptionFloats* machine_max_jerk_y = config.option<ConfigOptionFloats>("machine_max_jerk_y");
+ if (machine_max_jerk_y != nullptr)
+ m_time_processor.machine_limits.machine_max_jerk_y.values = machine_max_jerk_y->values;
+
+ const ConfigOptionFloats* machine_max_jerk_z = config.option<ConfigOptionFloats>("machine_max_jerkz");
+ if (machine_max_jerk_z != nullptr)
+ m_time_processor.machine_limits.machine_max_jerk_z.values = machine_max_jerk_z->values;
+
+ const ConfigOptionFloats* machine_max_jerk_e = config.option<ConfigOptionFloats>("machine_max_jerk_e");
+ if (machine_max_jerk_e != nullptr)
+ m_time_processor.machine_limits.machine_max_jerk_e.values = machine_max_jerk_e->values;
+
+ const ConfigOptionFloats* machine_max_acceleration_extruding = config.option<ConfigOptionFloats>("machine_max_acceleration_extruding");
+ if (machine_max_acceleration_extruding != nullptr)
+ m_time_processor.machine_limits.machine_max_acceleration_extruding.values = machine_max_acceleration_extruding->values;
+
+ const ConfigOptionFloats* machine_max_acceleration_retracting = config.option<ConfigOptionFloats>("machine_max_acceleration_retracting");
+ if (machine_max_acceleration_retracting != nullptr)
+ m_time_processor.machine_limits.machine_max_acceleration_retracting.values = machine_max_acceleration_retracting->values;
+
+ const ConfigOptionFloats* machine_min_extruding_rate = config.option<ConfigOptionFloats>("machine_min_extruding_rate");
+ if (machine_min_extruding_rate != nullptr)
+ m_time_processor.machine_limits.machine_min_extruding_rate.values = machine_min_extruding_rate->values;
+
+ const ConfigOptionFloats* machine_min_travel_rate = config.option<ConfigOptionFloats>("machine_min_travel_rate");
+ if (machine_min_travel_rate != nullptr)
+ m_time_processor.machine_limits.machine_min_travel_rate.values = machine_min_travel_rate->values;
+ }
+
+ for (size_t i = 0; i < static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) {
+ float max_acceleration = get_option_value(m_time_processor.machine_limits.machine_max_acceleration_extruding, i);
+ m_time_processor.machines[i].max_acceleration = max_acceleration;
+ m_time_processor.machines[i].acceleration = (max_acceleration > 0.0f) ? max_acceleration : DEFAULT_ACCELERATION;
+ }
+
+ if (m_time_processor.machine_limits.machine_max_acceleration_x.values.size() > 1)
+ enable_stealth_time_estimator(true);
+
+#if ENABLE_VOLUMETRIC_EXTRUSION_PROCESSING
+ const ConfigOptionBool* use_volumetric_e = config.option<ConfigOptionBool>("use_volumetric_e");
+ if (use_volumetric_e != nullptr)
+ m_use_volumetric_e = use_volumetric_e->value;
+#endif // ENABLE_VOLUMETRIC_EXTRUSION_PROCESSING
+}
+
+void GCodeProcessor::enable_stealth_time_estimator(bool enabled)
+{
+ m_time_processor.machines[static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Stealth)].enabled = enabled;
+}
+
+void GCodeProcessor::reset()
+{
+ static const size_t Min_Extruder_Count = 5;
+
+ m_units = EUnits::Millimeters;
+ m_global_positioning_type = EPositioningType::Absolute;
+ m_e_local_positioning_type = EPositioningType::Absolute;
+ m_extruder_offsets = std::vector<Vec3f>(Min_Extruder_Count, Vec3f::Zero());
+ m_flavor = gcfRepRapSprinter;
+
+ m_start_position = { 0.0f, 0.0f, 0.0f, 0.0f };
+ m_end_position = { 0.0f, 0.0f, 0.0f, 0.0f };
+ m_origin = { 0.0f, 0.0f, 0.0f, 0.0f };
+ m_cached_position.reset();
+ m_wiping = false;
+
+ m_feedrate = 0.0f;
+ m_width = 0.0f;
+ m_height = 0.0f;
+#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ m_forced_width = 0.0f;
+ m_forced_height = 0.0f;
+#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ m_mm3_per_mm = 0.0f;
+ m_fan_speed = 0.0f;
+
+ m_extrusion_role = erNone;
+ m_extruder_id = 0;
+ m_extruder_colors.resize(Min_Extruder_Count);
+ for (size_t i = 0; i < Min_Extruder_Count; ++i) {
+ m_extruder_colors[i] = static_cast<unsigned char>(i);
+ }
+
+ m_filament_diameters = std::vector<float>(Min_Extruder_Count, 1.75f);
+ m_extruded_last_z = 0.0f;
+ m_g1_line_id = 0;
+ m_layer_id = 0;
+ m_cp_color.reset();
+
+ m_producer = EProducer::Unknown;
+ m_producers_enabled = false;
+
+ m_time_processor.reset();
+
+ m_result.reset();
+ m_result.id = ++s_result_id;
+
+#if ENABLE_VOLUMETRIC_EXTRUSION_PROCESSING
+ m_use_volumetric_e = false;
+#endif // ENABLE_VOLUMETRIC_EXTRUSION_PROCESSING
+
+#if ENABLE_GCODE_VIEWER_DATA_CHECKING
+ m_mm3_per_mm_compare.reset();
+ m_height_compare.reset();
+ m_width_compare.reset();
+#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
+}
+
+void GCodeProcessor::process_file(const std::string& filename, bool apply_postprocess, std::function<void()> cancel_callback)
+{
+ auto last_cancel_callback_time = std::chrono::high_resolution_clock::now();
+
+#if ENABLE_GCODE_VIEWER_STATISTICS
+ auto start_time = std::chrono::high_resolution_clock::now();
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+
+ // pre-processing
+ // parse the gcode file to detect its producer
+ if (m_producers_enabled) {
+ m_parser.parse_file(filename, [this](GCodeReader& reader, const GCodeReader::GCodeLine& line) {
+ const std::string_view cmd = line.cmd();
+ if (cmd.length() == 0) {
+ const std::string_view comment = line.comment();
+ if (comment.length() > 1 && detect_producer(comment))
+ m_parser.quit_parsing_file();
+ }
+ });
+
+ // if the gcode was produced by PrusaSlicer,
+ // extract the config from it
+ if (m_producer == EProducer::PrusaSlicer || m_producer == EProducer::Slic3rPE || m_producer == EProducer::Slic3r) {
+ DynamicPrintConfig config;
+ config.apply(FullPrintConfig::defaults());
+ config.load_from_gcode_file(filename);
+ apply_config(config);
+ }
+ }
+
+ // process gcode
+ m_result.id = ++s_result_id;
+ // 1st move must be a dummy move
+ m_result.moves.emplace_back(MoveVertex());
+ m_parser.parse_file(filename, [this, cancel_callback, &last_cancel_callback_time](GCodeReader& reader, const GCodeReader::GCodeLine& line) {
+ if (cancel_callback != nullptr) {
+ // call the cancel callback every 100 ms
+ auto curr_time = std::chrono::high_resolution_clock::now();
+ if (std::chrono::duration_cast<std::chrono::milliseconds>(curr_time - last_cancel_callback_time).count() > 100) {
+ cancel_callback();
+ last_cancel_callback_time = curr_time;
+ }
+ }
+ process_gcode_line(line);
+ });
+
+ // update width/height of wipe moves
+ for (MoveVertex& move : m_result.moves) {
+ if (move.type == EMoveType::Wipe) {
+ move.width = Wipe_Width;
+ move.height = Wipe_Height;
+ }
+ }
+
+ // process the time blocks
+ for (size_t i = 0; i < static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) {
+ TimeMachine& machine = m_time_processor.machines[i];
+ TimeMachine::CustomGCodeTime& gcode_time = machine.gcode_time;
+ machine.calculate_time();
+ if (gcode_time.needed && gcode_time.cache != 0.0f)
+ gcode_time.times.push_back({ CustomGCode::ColorChange, gcode_time.cache });
+ }
+
+ update_estimated_times_stats();
+
+ // post-process to add M73 lines into the gcode
+ if (apply_postprocess)
+ m_time_processor.post_process(filename);
+
+#if ENABLE_GCODE_VIEWER_DATA_CHECKING
+ std::cout << "\n";
+ m_mm3_per_mm_compare.output();
+ m_height_compare.output();
+ m_width_compare.output();
+#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
+
+#if ENABLE_GCODE_VIEWER_STATISTICS
+ m_result.time = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - start_time).count();
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+}
+
+float GCodeProcessor::get_time(PrintEstimatedTimeStatistics::ETimeMode mode) const
+{
+ return (mode < PrintEstimatedTimeStatistics::ETimeMode::Count) ? m_time_processor.machines[static_cast<size_t>(mode)].time : 0.0f;
+}
+
+std::string GCodeProcessor::get_time_dhm(PrintEstimatedTimeStatistics::ETimeMode mode) const
+{
+ return (mode < PrintEstimatedTimeStatistics::ETimeMode::Count) ? short_time(get_time_dhms(m_time_processor.machines[static_cast<size_t>(mode)].time)) : std::string("N/A");
+}
+
+std::vector<std::pair<CustomGCode::Type, std::pair<float, float>>> GCodeProcessor::get_custom_gcode_times(PrintEstimatedTimeStatistics::ETimeMode mode, bool include_remaining) const
+{
+ std::vector<std::pair<CustomGCode::Type, std::pair<float, float>>> ret;
+ if (mode < PrintEstimatedTimeStatistics::ETimeMode::Count) {
+ const TimeMachine& machine = m_time_processor.machines[static_cast<size_t>(mode)];
+ float total_time = 0.0f;
+ for (const auto& [type, time] : machine.gcode_time.times) {
+ float remaining = include_remaining ? machine.time - total_time : 0.0f;
+ ret.push_back({ type, { time, remaining } });
+ total_time += time;
+ }
+ }
+ return ret;
+}
+
+std::vector<std::pair<EMoveType, float>> GCodeProcessor::get_moves_time(PrintEstimatedTimeStatistics::ETimeMode mode) const
+{
+ std::vector<std::pair<EMoveType, float>> ret;
+ if (mode < PrintEstimatedTimeStatistics::ETimeMode::Count) {
+ for (size_t i = 0; i < m_time_processor.machines[static_cast<size_t>(mode)].moves_time.size(); ++i) {
+ float time = m_time_processor.machines[static_cast<size_t>(mode)].moves_time[i];
+ if (time > 0.0f)
+ ret.push_back({ static_cast<EMoveType>(i), time });
+ }
+ }
+ return ret;
+}
+
+std::vector<std::pair<ExtrusionRole, float>> GCodeProcessor::get_roles_time(PrintEstimatedTimeStatistics::ETimeMode mode) const
+{
+ std::vector<std::pair<ExtrusionRole, float>> ret;
+ if (mode < PrintEstimatedTimeStatistics::ETimeMode::Count) {
+ for (size_t i = 0; i < m_time_processor.machines[static_cast<size_t>(mode)].roles_time.size(); ++i) {
+ float time = m_time_processor.machines[static_cast<size_t>(mode)].roles_time[i];
+ if (time > 0.0f)
+ ret.push_back({ static_cast<ExtrusionRole>(i), time });
+ }
+ }
+ return ret;
+}
+
+std::vector<float> GCodeProcessor::get_layers_time(PrintEstimatedTimeStatistics::ETimeMode mode) const
+{
+ return (mode < PrintEstimatedTimeStatistics::ETimeMode::Count) ?
+ m_time_processor.machines[static_cast<size_t>(mode)].layers_time :
+ std::vector<float>();
+}
+
+void GCodeProcessor::process_gcode_line(const GCodeReader::GCodeLine& line)
+{
+/* std::cout << line.raw() << std::endl; */
+
+ // update start position
+ m_start_position = m_end_position;
+
+ const std::string_view cmd = line.cmd();
+ if (cmd.length() > 1) {
+ // process command lines
+ switch (::toupper(cmd[0]))
+ {
+ case 'G':
+ {
+ switch (::atoi(&cmd[1]))
+ {
+ case 0: { process_G0(line); break; } // Move
+ case 1: { process_G1(line); break; } // Move
+ case 10: { process_G10(line); break; } // Retract
+ case 11: { process_G11(line); break; } // Unretract
+ case 20: { process_G20(line); break; } // Set Units to Inches
+ case 21: { process_G21(line); break; } // Set Units to Millimeters
+ case 22: { process_G22(line); break; } // Firmware controlled retract
+ case 23: { process_G23(line); break; } // Firmware controlled unretract
+ case 90: { process_G90(line); break; } // Set to Absolute Positioning
+ case 91: { process_G91(line); break; } // Set to Relative Positioning
+ case 92: { process_G92(line); break; } // Set Position
+ default: { break; }
+ }
+ break;
+ }
+ case 'M':
+ {
+ switch (::atoi(&cmd[1]))
+ {
+ case 1: { process_M1(line); break; } // Sleep or Conditional stop
+ case 82: { process_M82(line); break; } // Set extruder to absolute mode
+ case 83: { process_M83(line); break; } // Set extruder to relative mode
+ case 106: { process_M106(line); break; } // Set fan speed
+ case 107: { process_M107(line); break; } // Disable fan
+ case 108: { process_M108(line); break; } // Set tool (Sailfish)
+ case 132: { process_M132(line); break; } // Recall stored home offsets
+ case 135: { process_M135(line); break; } // Set tool (MakerWare)
+ case 201: { process_M201(line); break; } // Set max printing acceleration
+ case 203: { process_M203(line); break; } // Set maximum feedrate
+ case 204: { process_M204(line); break; } // Set default acceleration
+ case 205: { process_M205(line); break; } // Advanced settings
+ case 221: { process_M221(line); break; } // Set extrude factor override percentage
+ case 401: { process_M401(line); break; } // Repetier: Store x, y and z position
+ case 402: { process_M402(line); break; } // Repetier: Go to stored position
+ case 566: { process_M566(line); break; } // Set allowable instantaneous speed change
+ case 702: { process_M702(line); break; } // Unload the current filament into the MK3 MMU2 unit at the end of print.
+ default: { break; }
+ }
+ break;
+ }
+ case 'T':
+ {
+ process_T(line); // Select Tool
+ break;
+ }
+ default: { break; }
+ }
+ }
+ else {
+ 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));
+ }
+}
+
+static inline bool starts_with(const std::string_view comment, const std::string_view tag)
+{
+ size_t tag_len = tag.size();
+ return comment.size() >= tag_len && comment.substr(0, tag_len) == tag;
+}
+
+#if __has_include(<charconv>)
+ template <typename T, typename = void>
+ struct is_from_chars_convertible : std::false_type {};
+ template <typename T>
+ struct is_from_chars_convertible<T, std::void_t<decltype(std::from_chars(std::declval<const char*>(), std::declval<const char*>(), std::declval<T&>()))>> : std::true_type {};
+#endif
+
+// Returns true if the number was parsed correctly into out and the number spanned the whole input string.
+template<typename T>
+[[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(<charconv>)
+ // 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 <charconv> at all.
+ if constexpr (is_from_chars_convertible<T>::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<T, int>)
+ out = std::stoi(str, &read);
+ else if constexpr (std::is_same_v<T, long>)
+ out = std::stol(str, &read);
+ else if constexpr (std::is_same_v<T, float>)
+ out = std::stof(str, &read);
+ else if constexpr (std::is_same_v<T, double>)
+ 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
+ if (starts_with(comment, Extrusion_Role_Tag)) {
+ m_extrusion_role = ExtrusionEntity::string_to_role(comment.substr(Extrusion_Role_Tag.length()));
+ return;
+ }
+
+ // wipe start tag
+ if (starts_with(comment, Wipe_Start_Tag)) {
+ m_wiping = true;
+ return;
+ }
+
+ // wipe end tag
+ if (starts_with(comment, Wipe_End_Tag)) {
+ m_wiping = false;
+ return;
+ }
+
+#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ if (!m_producers_enabled || m_producer == EProducer::PrusaSlicer) {
+ // height tag
+ if (starts_with(comment, Height_Tag)) {
+ if (!parse_number(comment.substr(Height_Tag.size()), m_forced_height))
+ BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Height (" << comment << ").";
+ return;
+ }
+ // width tag
+ if (starts_with(comment, Width_Tag)) {
+ if (!parse_number(comment.substr(Width_Tag.size()), m_forced_width))
+ BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Width (" << comment << ").";
+ return;
+ }
+ }
+#else
+ if ((!m_producers_enabled || m_producer == EProducer::PrusaSlicer) &&
+ starts_with(comment, Height_Tag)) {
+ // height tag
+ 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
+ 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
+#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+
+ // color change tag
+ 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<unsigned char>(eid);
+ }
+
+ m_extruder_colors[extruder_id] = static_cast<unsigned char>(m_extruder_offsets.size()) + m_cp_color.counter; // color_change position in list of color for preview
+ ++m_cp_color.counter;
+ if (m_cp_color.counter == UCHAR_MAX)
+ m_cp_color.counter = 0;
+
+ if (m_extruder_id == extruder_id) {
+ m_cp_color.current = m_extruder_colors[extruder_id];
+ store_move_vertex(EMoveType::Color_change);
+ }
+
+ process_custom_gcode_time(CustomGCode::ColorChange);
+
+ return;
+ }
+
+ // pause print tag
+ if (comment == Pause_Print_Tag) {
+ store_move_vertex(EMoveType::Pause_Print);
+ process_custom_gcode_time(CustomGCode::PausePrint);
+ return;
+ }
+
+ // custom code tag
+ if (comment == Custom_Code_Tag) {
+ store_move_vertex(EMoveType::Custom_GCode);
+ return;
+ }
+
+#if ENABLE_GCODE_VIEWER_DATA_CHECKING
+ // mm3_per_mm print tag
+ 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
+ if (comment == Layer_Change_Tag) {
+ ++m_layer_id;
+ return;
+ }
+}
+
+bool GCodeProcessor::process_producers_tags(const std::string_view comment)
+{
+ switch (m_producer)
+ {
+ case EProducer::Slic3rPE:
+ case EProducer::Slic3r:
+ case EProducer::PrusaSlicer: { return process_prusaslicer_tags(comment); }
+ case EProducer::Cura: { return process_cura_tags(comment); }
+ case EProducer::Simplify3D: { return process_simplify3d_tags(comment); }
+ case EProducer::CraftWare: { return process_craftware_tags(comment); }
+ case EProducer::ideaMaker: { return process_ideamaker_tags(comment); }
+ case EProducer::KissSlicer: { return process_kissslicer_tags(comment); }
+ default: { return false; }
+ }
+}
+
+bool GCodeProcessor::process_prusaslicer_tags(const std::string_view comment)
+{
+ return false;
+}
+
+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) {
+ const std::string_view type = comment.substr(pos + tag.length());
+ if (type == "SKIRT")
+ m_extrusion_role = erSkirt;
+ else if (type == "WALL-OUTER")
+ m_extrusion_role = erExternalPerimeter;
+ else if (type == "WALL-INNER")
+ m_extrusion_role = erPerimeter;
+ else if (type == "SKIN")
+ m_extrusion_role = erSolidInfill;
+ else if (type == "FILL")
+ m_extrusion_role = erInternalInfill;
+ else if (type == "SUPPORT")
+ m_extrusion_role = erSupportMaterial;
+ else if (type == "SUPPORT-INTERFACE")
+ m_extrusion_role = erSupportMaterialInterface;
+ else if (type == "PRIME-TOWER")
+ m_extrusion_role = erWipeTower;
+ else {
+ m_extrusion_role = erNone;
+ BOOST_LOG_TRIVIAL(warning) << "GCodeProcessor found unknown extrusion role: " << type;
+ }
+
+ return true;
+ }
+
+ // flavor
+ tag = "FLAVOR:";
+ pos = comment.find(tag);
+ if (pos != comment.npos) {
+ const std::string_view flavor = comment.substr(pos + tag.length());
+ if (flavor == "BFB")
+ m_flavor = gcfMarlin; // << ???????????????????????
+ else if (flavor == "Mach3")
+ m_flavor = gcfMach3;
+ else if (flavor == "Makerbot")
+ m_flavor = gcfMakerWare;
+ else if (flavor == "UltiGCode")
+ m_flavor = gcfMarlin; // << ???????????????????????
+ else if (flavor == "Marlin(Volumetric)")
+ m_flavor = gcfMarlin; // << ???????????????????????
+ else if (flavor == "Griffin")
+ m_flavor = gcfMarlin; // << ???????????????????????
+ else if (flavor == "Repetier")
+ m_flavor = gcfRepetier;
+ else if (flavor == "RepRap")
+ m_flavor = gcfRepRapFirmware;
+ else if (flavor == "Marlin")
+ m_flavor = gcfMarlin;
+ else
+ BOOST_LOG_TRIVIAL(warning) << "GCodeProcessor found unknown flavor: " << flavor;
+
+ return true;
+ }
+
+ // layer
+ tag = "LAYER:";
+ pos = comment.find(tag);
+ if (pos != comment.npos) {
+ ++m_layer_id;
+ return true;
+ }
+
+ return false;
+}
+
+bool GCodeProcessor::process_simplify3d_tags(const std::string_view comment)
+{
+ // extrusion roles
+
+ // ; skirt
+ size_t pos = comment.find(" skirt");
+ if (pos == 0) {
+ m_extrusion_role = erSkirt;
+ return true;
+ }
+
+ // ; outer perimeter
+ pos = comment.find(" outer perimeter");
+ if (pos == 0) {
+ m_extrusion_role = erExternalPerimeter;
+ return true;
+ }
+
+ // ; inner perimeter
+ pos = comment.find(" inner perimeter");
+ if (pos == 0) {
+ m_extrusion_role = erPerimeter;
+ return true;
+ }
+
+ // ; gap fill
+ pos = comment.find(" gap fill");
+ if (pos == 0) {
+ m_extrusion_role = erGapFill;
+ return true;
+ }
+
+ // ; infill
+ pos = comment.find(" infill");
+ if (pos == 0) {
+ m_extrusion_role = erInternalInfill;
+ return true;
+ }
+
+ // ; solid layer
+ pos = comment.find(" solid layer");
+ if (pos == 0) {
+ m_extrusion_role = erNone; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ return true;
+ }
+
+ // ; bridge
+ pos = comment.find(" bridge");
+ if (pos == 0) {
+ m_extrusion_role = erBridgeInfill;
+ return true;
+ }
+
+ // ; support
+ pos = comment.find(" support");
+ if (pos == 0) {
+ m_extrusion_role = erSupportMaterial;
+ return true;
+ }
+
+ // ; prime pillar
+ pos = comment.find(" prime pillar");
+ if (pos == 0) {
+ m_extrusion_role = erWipeTower;
+ return true;
+ }
+
+ // ; ooze shield
+ pos = comment.find(" ooze shield");
+ if (pos == 0) {
+ m_extrusion_role = erNone; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ return true;
+ }
+
+ // ; raft
+ pos = comment.find(" raft");
+ if (pos == 0) {
+ m_extrusion_role = erSkirt;
+ return true;
+ }
+
+ // geometry
+#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ // ; tool
+ std::string tag = " tool";
+ pos = comment.find(tag);
+ if (pos == 0) {
+ 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);
+ std::string w_tag = "W";
+ size_t w_start = data.find(w_tag);
+ size_t w_end = data.find_first_of(' ', w_start);
+ if (h_start != data.npos) {
+ if (!parse_number(data.substr(h_start + 1, (h_end != data.npos) ? h_end - h_start - 1 : h_end), m_forced_height))
+ BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Height (" << comment << ").";
+ }
+ if (w_start != data.npos) {
+ if (!parse_number(data.substr(w_start + 1, (w_end != data.npos) ? w_end - w_start - 1 : w_end), m_forced_width))
+ BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Width (" << comment << ").";
+ }
+
+ return true;
+ }
+
+ // ; layer
+ tag = " layer";
+#else
+#if ENABLE_GCODE_VIEWER_DATA_CHECKING
+ // ; tool
+ std::string tag = " tool";
+ pos = comment.find(tag);
+ if (pos == 0) {
+ 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);
+ std::string w_tag = "W";
+ size_t w_start = data.find(w_tag);
+ size_t w_end = data.find_first_of(' ', w_start);
+ if (h_start != data.npos) {
+ 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) {
+ 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;
+ }
+#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
+
+ // ; layer
+ std::string tag = " layer";
+#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ pos = comment.find(tag);
+ if (pos == 0) {
+ // skip lines "; layer end"
+ const std::string_view data = comment.substr(pos + tag.length());
+ size_t end_start = data.find("end");
+ if (end_start == data.npos)
+ ++m_layer_id;
+
+ return true;
+ }
+
+ return false;
+}
+
+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) {
+ const std::string_view type = comment.substr(pos + tag.length());
+ if (type == "Skirt")
+ m_extrusion_role = erSkirt;
+ else if (type == "Perimeter")
+ m_extrusion_role = erExternalPerimeter;
+ else if (type == "HShell")
+ m_extrusion_role = erNone; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ else if (type == "InnerHair")
+ m_extrusion_role = erNone; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ else if (type == "Loop")
+ m_extrusion_role = erNone; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ else if (type == "Infill")
+ m_extrusion_role = erInternalInfill;
+ else if (type == "Raft")
+ m_extrusion_role = erSkirt;
+ else if (type == "Support")
+ m_extrusion_role = erSupportMaterial;
+ else if (type == "SupportTouch")
+ m_extrusion_role = erSupportMaterial;
+ else if (type == "SoftSupport")
+ m_extrusion_role = erSupportMaterialInterface;
+ else if (type == "Pillar")
+ m_extrusion_role = erWipeTower;
+ else {
+ m_extrusion_role = erNone;
+ BOOST_LOG_TRIVIAL(warning) << "GCodeProcessor found unknown extrusion role: " << type;
+ }
+
+ return true;
+ }
+
+ // layer
+ pos = comment.find(" Layer #");
+ if (pos == 0) {
+ ++m_layer_id;
+ return true;
+ }
+
+ return false;
+}
+
+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) {
+ const std::string_view type = comment.substr(pos + tag.length());
+ if (type == "RAFT")
+ m_extrusion_role = erSkirt;
+ else if (type == "WALL-OUTER")
+ m_extrusion_role = erExternalPerimeter;
+ else if (type == "WALL-INNER")
+ m_extrusion_role = erPerimeter;
+ else if (type == "SOLID-FILL")
+ m_extrusion_role = erSolidInfill;
+ else if (type == "FILL")
+ m_extrusion_role = erInternalInfill;
+ else if (type == "BRIDGE")
+ m_extrusion_role = erBridgeInfill;
+ else if (type == "SUPPORT")
+ m_extrusion_role = erSupportMaterial;
+ else {
+ m_extrusion_role = erNone;
+ BOOST_LOG_TRIVIAL(warning) << "GCodeProcessor found unknown extrusion role: " << type;
+ }
+ return true;
+ }
+
+ // geometry
+#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ // width
+ tag = "WIDTH:";
+ pos = comment.find(tag);
+ if (pos != comment.npos) {
+ if (!parse_number(comment.substr(pos + tag.length()), m_forced_width))
+ BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Width (" << comment << ").";
+ return true;
+ }
+
+ // height
+ tag = "HEIGHT:";
+ pos = comment.find(tag);
+ if (pos != comment.npos) {
+ if (!parse_number(comment.substr(pos + tag.length()), m_forced_height))
+ BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid value for Height (" << comment << ").";
+ return true;
+ }
+#else
+#if ENABLE_GCODE_VIEWER_DATA_CHECKING
+ // width
+ tag = "WIDTH:";
+ pos = comment.find(tag);
+ if (pos != comment.npos) {
+ 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;
+ }
+
+ // height
+ tag = "HEIGHT:";
+ pos = comment.find(tag);
+ if (pos != comment.npos) {
+ 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
+#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+
+ // layer
+ pos = comment.find("LAYER:");
+ if (pos == 0) {
+ ++m_layer_id;
+ return true;
+ }
+
+ return false;
+}
+
+bool GCodeProcessor::process_kissslicer_tags(const std::string_view comment)
+{
+ // extrusion roles
+
+ // ; 'Raft Path'
+ size_t pos = comment.find(" 'Raft Path'");
+ if (pos == 0) {
+ m_extrusion_role = erSkirt;
+ return true;
+ }
+
+ // ; 'Support Interface Path'
+ pos = comment.find(" 'Support Interface Path'");
+ if (pos == 0) {
+ m_extrusion_role = erSupportMaterialInterface;
+ return true;
+ }
+
+ // ; 'Travel/Ironing Path'
+ pos = comment.find(" 'Travel/Ironing Path'");
+ if (pos == 0) {
+ m_extrusion_role = erIroning;
+ return true;
+ }
+
+ // ; 'Support (may Stack) Path'
+ pos = comment.find(" 'Support (may Stack) Path'");
+ if (pos == 0) {
+ m_extrusion_role = erSupportMaterial;
+ return true;
+ }
+
+ // ; 'Perimeter Path'
+ pos = comment.find(" 'Perimeter Path'");
+ if (pos == 0) {
+ m_extrusion_role = erExternalPerimeter;
+ return true;
+ }
+
+ // ; 'Pillar Path'
+ pos = comment.find(" 'Pillar Path'");
+ if (pos == 0) {
+ m_extrusion_role = erNone; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ return true;
+ }
+
+ // ; 'Destring/Wipe/Jump Path'
+ pos = comment.find(" 'Destring/Wipe/Jump Path'");
+ if (pos == 0) {
+ m_extrusion_role = erNone; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ return true;
+ }
+
+ // ; 'Prime Pillar Path'
+ pos = comment.find(" 'Prime Pillar Path'");
+ if (pos == 0) {
+ m_extrusion_role = erNone; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ return true;
+ }
+
+ // ; 'Loop Path'
+ pos = comment.find(" 'Loop Path'");
+ if (pos == 0) {
+ m_extrusion_role = erNone; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ return true;
+ }
+
+ // ; 'Crown Path'
+ pos = comment.find(" 'Crown Path'");
+ if (pos == 0) {
+ m_extrusion_role = erNone; // <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
+ return true;
+ }
+
+ // ; 'Solid Path'
+ pos = comment.find(" 'Solid Path'");
+ if (pos == 0) {
+ m_extrusion_role = erNone;
+ return true;
+ }
+
+ // ; 'Stacked Sparse Infill Path'
+ pos = comment.find(" 'Stacked Sparse Infill Path'");
+ if (pos == 0) {
+ m_extrusion_role = erInternalInfill;
+ return true;
+ }
+
+ // ; 'Sparse Infill Path'
+ pos = comment.find(" 'Sparse Infill Path'");
+ if (pos == 0) {
+ m_extrusion_role = erSolidInfill;
+ return true;
+ }
+
+ // geometry
+
+ // layer
+ pos = comment.find(" BEGIN_LAYER_");
+ if (pos == 0) {
+ ++m_layer_id;
+ return true;
+ }
+
+ return false;
+}
+
+bool GCodeProcessor::detect_producer(const std::string_view comment)
+{
+ for (const auto& [id, search_string] : Producers) {
+ size_t pos = comment.find(search_string);
+ if (pos != comment.npos) {
+ m_producer = id;
+ BOOST_LOG_TRIVIAL(info) << "Detected gcode producer: " << search_string;
+ return true;
+ }
+ }
+ return false;
+}
+
+void GCodeProcessor::process_G0(const GCodeReader::GCodeLine& line)
+{
+ process_G1(line);
+}
+
+void GCodeProcessor::process_G1(const GCodeReader::GCodeLine& line)
+{
+#if ENABLE_VOLUMETRIC_EXTRUSION_PROCESSING
+ float filament_diameter = (static_cast<size_t>(m_extruder_id) < m_filament_diameters.size()) ? m_filament_diameters[m_extruder_id] : m_filament_diameters.back();
+ float filament_radius = 0.5f * filament_diameter;
+ float area_filament_cross_section = static_cast<float>(M_PI) * sqr(filament_radius);
+ auto absolute_position = [this, area_filament_cross_section](Axis axis, const GCodeReader::GCodeLine& lineG1) {
+#else
+ auto absolute_position = [this](Axis axis, const GCodeReader::GCodeLine& lineG1) {
+#endif // ENABLE_VOLUMETRIC_EXTRUSION_PROCESSING
+ bool is_relative = (m_global_positioning_type == EPositioningType::Relative);
+ if (axis == E)
+ is_relative |= (m_e_local_positioning_type == EPositioningType::Relative);
+
+ if (lineG1.has(Slic3r::Axis(axis))) {
+ float lengthsScaleFactor = (m_units == EUnits::Inches) ? INCHES_TO_MM : 1.0f;
+ float ret = lineG1.value(Slic3r::Axis(axis)) * lengthsScaleFactor;
+#if ENABLE_VOLUMETRIC_EXTRUSION_PROCESSING
+ if (axis == E && m_use_volumetric_e)
+ ret /= area_filament_cross_section;
+#endif // ENABLE_VOLUMETRIC_EXTRUSION_PROCESSING
+ return is_relative ? m_start_position[axis] + ret : m_origin[axis] + ret;
+ }
+ else
+ return m_start_position[axis];
+ };
+
+ auto move_type = [this](const AxisCoords& delta_pos) {
+ EMoveType type = EMoveType::Noop;
+
+ if (m_wiping)
+ type = EMoveType::Wipe;
+ else if (delta_pos[E] < 0.0f)
+ type = (delta_pos[X] != 0.0f || delta_pos[Y] != 0.0f || delta_pos[Z] != 0.0f) ? EMoveType::Travel : EMoveType::Retract;
+ else if (delta_pos[E] > 0.0f) {
+ if (delta_pos[X] == 0.0f && delta_pos[Y] == 0.0f)
+ type = (delta_pos[Z] == 0.0f) ? EMoveType::Unretract : EMoveType::Travel;
+ else if (delta_pos[X] != 0.0f || delta_pos[Y] != 0.0f)
+ type = EMoveType::Extrude;
+ }
+ else if (delta_pos[X] != 0.0f || delta_pos[Y] != 0.0f || delta_pos[Z] != 0.0f)
+ type = EMoveType::Travel;
+
+ return type;
+ };
+
+ ++m_g1_line_id;
+
+ // enable processing of lines M201/M203/M204/M205
+ m_time_processor.machine_envelope_processing_enabled = true;
+
+ // updates axes positions from line
+ for (unsigned char a = X; a <= E; ++a) {
+ m_end_position[a] = absolute_position((Axis)a, line);
+ }
+
+ // updates feedrate from line, if present
+ if (line.has_f())
+ m_feedrate = line.f() * MMMIN_TO_MMSEC;
+
+ // calculates movement deltas
+ float max_abs_delta = 0.0f;
+ AxisCoords delta_pos;
+ for (unsigned char a = X; a <= E; ++a) {
+ delta_pos[a] = m_end_position[a] - m_start_position[a];
+ max_abs_delta = std::max(max_abs_delta, std::abs(delta_pos[a]));
+ }
+
+ // no displacement, return
+ if (max_abs_delta == 0.0f)
+ return;
+
+ EMoveType type = move_type(delta_pos);
+ if (type == EMoveType::Extrude && m_end_position[Z] == 0.0f)
+ type = EMoveType::Travel;
+
+ if (type == EMoveType::Extrude) {
+ float delta_xyz = std::sqrt(sqr(delta_pos[X]) + sqr(delta_pos[Y]) + sqr(delta_pos[Z]));
+#if !ENABLE_VOLUMETRIC_EXTRUSION_PROCESSING
+ float filament_diameter = (static_cast<size_t>(m_extruder_id) < m_filament_diameters.size()) ? m_filament_diameters[m_extruder_id] : m_filament_diameters.back();
+ float filament_radius = 0.5f * filament_diameter;
+ float area_filament_cross_section = static_cast<float>(M_PI) * sqr(filament_radius);
+#endif // !ENABLE_VOLUMETRIC_EXTRUSION_PROCESSING
+ float volume_extruded_filament = area_filament_cross_section * delta_pos[E];
+ float area_toolpath_cross_section = volume_extruded_filament / delta_xyz;
+
+ // volume extruded filament / tool displacement = area toolpath cross section
+ m_mm3_per_mm = area_toolpath_cross_section;
+#if ENABLE_GCODE_VIEWER_DATA_CHECKING
+ m_mm3_per_mm_compare.update(area_toolpath_cross_section, m_extrusion_role);
+#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
+
+#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ if (m_forced_height > 0.0f)
+ m_height = m_forced_height;
+ else {
+ if (m_end_position[Z] > m_extruded_last_z + EPSILON) {
+ m_height = m_end_position[Z] - m_extruded_last_z;
+ m_extruded_last_z = m_end_position[Z];
+ }
+ }
+
+#if ENABLE_GCODE_VIEWER_DATA_CHECKING
+ m_height_compare.update(m_height, m_extrusion_role);
+#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
+#else
+ if ((m_producers_enabled && m_producer != EProducer::PrusaSlicer) || m_height == 0.0f) {
+ if (m_end_position[Z] > m_extruded_last_z + EPSILON) {
+ m_height = m_end_position[Z] - m_extruded_last_z;
+#if ENABLE_GCODE_VIEWER_DATA_CHECKING
+ m_height_compare.update(m_height, m_extrusion_role);
+#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
+ m_extruded_last_z = m_end_position[Z];
+ }
+ }
+#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+
+#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ if (m_forced_width > 0.0f)
+ m_width = m_forced_width;
+ else if (m_extrusion_role == erExternalPerimeter)
+#else
+ if (m_extrusion_role == erExternalPerimeter)
+#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ // cross section: rectangle
+ m_width = delta_pos[E] * static_cast<float>(M_PI * sqr(1.05f * filament_radius)) / (delta_xyz * m_height);
+ else if (m_extrusion_role == erBridgeInfill || m_extrusion_role == erNone)
+ // cross section: circle
+ m_width = static_cast<float>(m_filament_diameters[m_extruder_id]) * std::sqrt(delta_pos[E] / delta_xyz);
+ else
+ // cross section: rectangle + 2 semicircles
+ m_width = delta_pos[E] * static_cast<float>(M_PI * sqr(filament_radius)) / (delta_xyz * m_height) + static_cast<float>(1.0 - 0.25 * M_PI) * m_height;
+
+ // clamp width to avoid artifacts which may arise from wrong values of m_height
+ m_width = std::min(m_width, std::max(1.0f, 4.0f * m_height));
+
+#if ENABLE_GCODE_VIEWER_DATA_CHECKING
+ m_width_compare.update(m_width, m_extrusion_role);
+#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
+ }
+
+ if (type == EMoveType::Extrude && (m_extrusion_role == erCustom || m_width == 0.0f || m_height == 0.0f))
+ type = EMoveType::Travel;
+
+ // time estimate section
+ auto move_length = [](const AxisCoords& delta_pos) {
+ float sq_xyz_length = sqr(delta_pos[X]) + sqr(delta_pos[Y]) + sqr(delta_pos[Z]);
+ return (sq_xyz_length > 0.0f) ? std::sqrt(sq_xyz_length) : std::abs(delta_pos[E]);
+ };
+
+ auto is_extrusion_only_move = [](const AxisCoords& delta_pos) {
+ return delta_pos[X] == 0.0f && delta_pos[Y] == 0.0f && delta_pos[Z] == 0.0f && delta_pos[E] != 0.0f;
+ };
+
+ float distance = move_length(delta_pos);
+ assert(distance != 0.0f);
+ float inv_distance = 1.0f / distance;
+
+ for (size_t i = 0; i < static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) {
+ TimeMachine& machine = m_time_processor.machines[i];
+ if (!machine.enabled)
+ continue;
+
+ TimeMachine::State& curr = machine.curr;
+ TimeMachine::State& prev = machine.prev;
+ std::vector<TimeBlock>& blocks = machine.blocks;
+
+ curr.feedrate = (delta_pos[E] == 0.0f) ?
+ minimum_travel_feedrate(static_cast<PrintEstimatedTimeStatistics::ETimeMode>(i), m_feedrate) :
+ minimum_feedrate(static_cast<PrintEstimatedTimeStatistics::ETimeMode>(i), m_feedrate);
+
+ TimeBlock block;
+ 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
+ float min_feedrate_factor = 1.0f;
+ for (unsigned char a = X; a <= E; ++a) {
+ curr.axis_feedrate[a] = curr.feedrate * delta_pos[a] * inv_distance;
+ if (a == E)
+ curr.axis_feedrate[a] *= machine.extrude_factor_override_percentage;
+
+ curr.abs_axis_feedrate[a] = std::abs(curr.axis_feedrate[a]);
+ if (curr.abs_axis_feedrate[a] != 0.0f) {
+ float axis_max_feedrate = get_axis_max_feedrate(static_cast<PrintEstimatedTimeStatistics::ETimeMode>(i), static_cast<Axis>(a));
+ if (axis_max_feedrate != 0.0f)
+ min_feedrate_factor = std::min(min_feedrate_factor, axis_max_feedrate / curr.abs_axis_feedrate[a]);
+ }
+ }
+
+ block.feedrate_profile.cruise = min_feedrate_factor * curr.feedrate;
+
+ if (min_feedrate_factor < 1.0f) {
+ for (unsigned char a = X; a <= E; ++a) {
+ curr.axis_feedrate[a] *= min_feedrate_factor;
+ curr.abs_axis_feedrate[a] *= min_feedrate_factor;
+ }
+ }
+
+ // calculates block acceleration
+ float acceleration = is_extrusion_only_move(delta_pos) ?
+ get_retract_acceleration(static_cast<PrintEstimatedTimeStatistics::ETimeMode>(i)) :
+ get_acceleration(static_cast<PrintEstimatedTimeStatistics::ETimeMode>(i));
+
+ for (unsigned char a = X; a <= E; ++a) {
+ float axis_max_acceleration = get_axis_max_acceleration(static_cast<PrintEstimatedTimeStatistics::ETimeMode>(i), static_cast<Axis>(a));
+ if (acceleration * std::abs(delta_pos[a]) * inv_distance > axis_max_acceleration)
+ acceleration = axis_max_acceleration;
+ }
+
+ block.acceleration = acceleration;
+
+ // calculates block exit feedrate
+ curr.safe_feedrate = block.feedrate_profile.cruise;
+
+ for (unsigned char a = X; a <= E; ++a) {
+ float axis_max_jerk = get_axis_max_jerk(static_cast<PrintEstimatedTimeStatistics::ETimeMode>(i), static_cast<Axis>(a));
+ if (curr.abs_axis_feedrate[a] > axis_max_jerk)
+ curr.safe_feedrate = std::min(curr.safe_feedrate, axis_max_jerk);
+ }
+
+ block.feedrate_profile.exit = curr.safe_feedrate;
+
+ static const float PREVIOUS_FEEDRATE_THRESHOLD = 0.0001f;
+
+ // calculates block entry feedrate
+ float vmax_junction = curr.safe_feedrate;
+ if (!blocks.empty() && prev.feedrate > PREVIOUS_FEEDRATE_THRESHOLD) {
+ bool prev_speed_larger = prev.feedrate > block.feedrate_profile.cruise;
+ float smaller_speed_factor = prev_speed_larger ? (block.feedrate_profile.cruise / prev.feedrate) : (prev.feedrate / block.feedrate_profile.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_profile.cruise : prev.feedrate;
+
+ float v_factor = 1.0f;
+ bool limited = false;
+
+ for (unsigned char a = X; a <= E; ++a) {
+ // Limit an axis. We have to differentiate coasting from the reversal of an axis movement, or a full stop.
+ float v_exit = prev.axis_feedrate[a];
+ float v_entry = 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(static_cast<PrintEstimatedTimeStatistics::ETimeMode>(i), static_cast<Axis>(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 ((prev.safe_feedrate > vmax_junction_threshold) && (curr.safe_feedrate > vmax_junction_threshold))
+ vmax_junction = curr.safe_feedrate;
+ }
+
+ float v_allowable = max_allowable_speed(-acceleration, curr.safe_feedrate, block.distance);
+ block.feedrate_profile.entry = std::min(vmax_junction, v_allowable);
+
+ block.max_entry_speed = vmax_junction;
+ block.flags.nominal_length = (block.feedrate_profile.cruise <= v_allowable);
+ block.flags.recalculate = true;
+ block.safe_feedrate = curr.safe_feedrate;
+
+ // calculates block trapezoid
+ block.calculate_trapezoid();
+
+ // updates previous
+ prev = curr;
+
+ blocks.push_back(block);
+
+ if (blocks.size() > TimeProcessor::Planner::refresh_threshold)
+ machine.calculate_time(TimeProcessor::Planner::queue_size);
+ }
+
+ // store move
+ store_move_vertex(type);
+}
+
+void GCodeProcessor::process_G10(const GCodeReader::GCodeLine& line)
+{
+ // stores retract move
+ store_move_vertex(EMoveType::Retract);
+}
+
+void GCodeProcessor::process_G11(const GCodeReader::GCodeLine& line)
+{
+ // stores unretract move
+ store_move_vertex(EMoveType::Unretract);
+}
+
+void GCodeProcessor::process_G20(const GCodeReader::GCodeLine& line)
+{
+ m_units = EUnits::Inches;
+}
+
+void GCodeProcessor::process_G21(const GCodeReader::GCodeLine& line)
+{
+ m_units = EUnits::Millimeters;
+}
+
+void GCodeProcessor::process_G22(const GCodeReader::GCodeLine& line)
+{
+ // stores retract move
+ store_move_vertex(EMoveType::Retract);
+}
+
+void GCodeProcessor::process_G23(const GCodeReader::GCodeLine& line)
+{
+ // stores unretract move
+ store_move_vertex(EMoveType::Unretract);
+}
+
+void GCodeProcessor::process_G90(const GCodeReader::GCodeLine& line)
+{
+ m_global_positioning_type = EPositioningType::Absolute;
+}
+
+void GCodeProcessor::process_G91(const GCodeReader::GCodeLine& line)
+{
+ m_global_positioning_type = EPositioningType::Relative;
+}
+
+void GCodeProcessor::process_G92(const GCodeReader::GCodeLine& line)
+{
+ float lengths_scale_factor = (m_units == EUnits::Inches) ? INCHES_TO_MM : 1.0f;
+ bool any_found = false;
+
+ if (line.has_x()) {
+ m_origin[X] = m_end_position[X] - line.x() * lengths_scale_factor;
+ any_found = true;
+ }
+
+ if (line.has_y()) {
+ m_origin[Y] = m_end_position[Y] - line.y() * lengths_scale_factor;
+ any_found = true;
+ }
+
+ if (line.has_z()) {
+ m_origin[Z] = m_end_position[Z] - line.z() * lengths_scale_factor;
+ any_found = 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
+ m_end_position[E] = line.e() * lengths_scale_factor;
+ any_found = true;
+ }
+ else
+ simulate_st_synchronize();
+
+ if (!any_found && !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 <= E; ++a) {
+ m_origin[a] = m_end_position[a];
+ }
+ }
+}
+
+void GCodeProcessor::process_M1(const GCodeReader::GCodeLine& line)
+{
+ simulate_st_synchronize();
+}
+
+void GCodeProcessor::process_M82(const GCodeReader::GCodeLine& line)
+{
+ m_e_local_positioning_type = EPositioningType::Absolute;
+}
+
+void GCodeProcessor::process_M83(const GCodeReader::GCodeLine& line)
+{
+ m_e_local_positioning_type = EPositioningType::Relative;
+}
+
+void GCodeProcessor::process_M106(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))
+ m_fan_speed = (100.0f / 255.0f) * new_fan_speed;
+ else
+ m_fan_speed = 100.0f;
+ }
+}
+
+void GCodeProcessor::process_M107(const GCodeReader::GCodeLine& line)
+{
+ m_fan_speed = 0.0f;
+}
+
+void GCodeProcessor::process_M108(const GCodeReader::GCodeLine& line)
+{
+ // These M-codes are used by 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
+
+ if (m_flavor != gcfSailfish)
+ return;
+
+ std::string cmd = line.raw();
+ size_t pos = cmd.find("T");
+ if (pos != std::string::npos)
+ process_T(cmd.substr(pos));
+}
+
+void GCodeProcessor::process_M132(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())
+ m_origin[X] = 0.0f;
+
+ if (line.has_y())
+ m_origin[Y] = 0.0f;
+
+ if (line.has_z())
+ m_origin[Z] = 0.0f;
+
+ if (line.has_e())
+ m_origin[E] = 0.0f;
+}
+
+void GCodeProcessor::process_M135(const GCodeReader::GCodeLine& line)
+{
+ // These M-codes are used by MakerWare 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
+
+ if (m_flavor != gcfMakerWare)
+ return;
+
+ std::string cmd = line.raw();
+ size_t pos = cmd.find("T");
+ if (pos != std::string::npos)
+ process_T(cmd.substr(pos));
+}
+
+void GCodeProcessor::process_M201(const GCodeReader::GCodeLine& line)
+{
+ // see http://reprap.org/wiki/G-code#M201:_Set_max_printing_acceleration
+ float factor = ((m_flavor != gcfRepRapSprinter && m_flavor != gcfRepRapFirmware) && m_units == EUnits::Inches) ? INCHES_TO_MM : 1.0f;
+
+ for (size_t i = 0; i < static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) {
+ if (static_cast<PrintEstimatedTimeStatistics::ETimeMode>(i) == PrintEstimatedTimeStatistics::ETimeMode::Normal ||
+ m_time_processor.machine_envelope_processing_enabled) {
+ if (line.has_x())
+ set_option_value(m_time_processor.machine_limits.machine_max_acceleration_x, i, line.x() * factor);
+
+ if (line.has_y())
+ set_option_value(m_time_processor.machine_limits.machine_max_acceleration_y, i, line.y() * factor);
+
+ if (line.has_z())
+ set_option_value(m_time_processor.machine_limits.machine_max_acceleration_z, i, line.z() * factor);
+
+ if (line.has_e())
+ set_option_value(m_time_processor.machine_limits.machine_max_acceleration_e, i, line.e() * factor);
+ }
+ }
+}
+
+void GCodeProcessor::process_M203(const GCodeReader::GCodeLine& line)
+{
+ // see http://reprap.org/wiki/G-code#M203:_Set_maximum_feedrate
+ if (m_flavor == gcfRepetier)
+ return;
+
+ // see http://reprap.org/wiki/G-code#M203:_Set_maximum_feedrate
+ // http://smoothieware.org/supported-g-codes
+ float factor = (m_flavor == gcfMarlin || m_flavor == gcfSmoothie) ? 1.0f : MMMIN_TO_MMSEC;
+
+ for (size_t i = 0; i < static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) {
+ if (static_cast<PrintEstimatedTimeStatistics::ETimeMode>(i) == PrintEstimatedTimeStatistics::ETimeMode::Normal ||
+ m_time_processor.machine_envelope_processing_enabled) {
+ if (line.has_x())
+ set_option_value(m_time_processor.machine_limits.machine_max_feedrate_x, i, line.x() * factor);
+
+ if (line.has_y())
+ set_option_value(m_time_processor.machine_limits.machine_max_feedrate_y, i, line.y() * factor);
+
+ if (line.has_z())
+ set_option_value(m_time_processor.machine_limits.machine_max_feedrate_z, i, line.z() * factor);
+
+ if (line.has_e())
+ set_option_value(m_time_processor.machine_limits.machine_max_feedrate_e, i, line.e() * factor);
+ }
+ }
+}
+
+void GCodeProcessor::process_M204(const GCodeReader::GCodeLine& line)
+{
+ float value;
+ for (size_t i = 0; i < static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) {
+ if (static_cast<PrintEstimatedTimeStatistics::ETimeMode>(i) == PrintEstimatedTimeStatistics::ETimeMode::Normal ||
+ m_time_processor.machine_envelope_processing_enabled) {
+ 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(static_cast<PrintEstimatedTimeStatistics::ETimeMode>(i), value);
+ if (line.has_value('T', value))
+ set_option_value(m_time_processor.machine_limits.machine_max_acceleration_retracting, i, value);
+ }
+ else {
+ // New acceleration format, compatible with the upstream Marlin.
+ if (line.has_value('P', value))
+ set_acceleration(static_cast<PrintEstimatedTimeStatistics::ETimeMode>(i), value);
+ if (line.has_value('R', value))
+ set_option_value(m_time_processor.machine_limits.machine_max_acceleration_retracting, i, value);
+ if (line.has_value('T', value)) {
+ // Interpret the T value as the travel acceleration in the new Marlin format.
+ //FIXME Prusa3D firmware currently does not support travel acceleration value independent from the extruding acceleration value.
+ // set_travel_acceleration(value);
+ }
+ }
+ }
+ }
+}
+
+void GCodeProcessor::process_M205(const GCodeReader::GCodeLine& line)
+{
+ for (size_t i = 0; i < static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) {
+ if (static_cast<PrintEstimatedTimeStatistics::ETimeMode>(i) == PrintEstimatedTimeStatistics::ETimeMode::Normal ||
+ m_time_processor.machine_envelope_processing_enabled) {
+ if (line.has_x()) {
+ float max_jerk = line.x();
+ set_option_value(m_time_processor.machine_limits.machine_max_jerk_x, i, max_jerk);
+ set_option_value(m_time_processor.machine_limits.machine_max_jerk_y, i, max_jerk);
+ }
+
+ if (line.has_y())
+ set_option_value(m_time_processor.machine_limits.machine_max_jerk_y, i, line.y());
+
+ if (line.has_z())
+ set_option_value(m_time_processor.machine_limits.machine_max_jerk_z, i, line.z());
+
+ if (line.has_e())
+ set_option_value(m_time_processor.machine_limits.machine_max_jerk_e, i, line.e());
+
+ float value;
+ if (line.has_value('S', value))
+ set_option_value(m_time_processor.machine_limits.machine_min_extruding_rate, i, value);
+
+ if (line.has_value('T', value))
+ set_option_value(m_time_processor.machine_limits.machine_min_travel_rate, i, value);
+ }
+ }
+}
+
+void GCodeProcessor::process_M221(const GCodeReader::GCodeLine& line)
+{
+ float value_s;
+ float value_t;
+ if (line.has_value('S', value_s) && !line.has_value('T', value_t)) {
+ value_s *= 0.01f;
+ for (size_t i = 0; i < static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) {
+ m_time_processor.machines[i].extrude_factor_override_percentage = value_s;
+ }
+ }
+}
+
+void GCodeProcessor::process_M401(const GCodeReader::GCodeLine& line)
+{
+ if (m_flavor != gcfRepetier)
+ return;
+
+ for (unsigned char a = 0; a <= 3; ++a) {
+ m_cached_position.position[a] = m_start_position[a];
+ }
+ m_cached_position.feedrate = m_feedrate;
+}
+
+void GCodeProcessor::process_M402(const GCodeReader::GCodeLine& line)
+{
+ if (m_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 = m_cached_position.position[a];
+ if (p != FLT_MAX)
+ m_start_position[a] = p;
+ }
+ }
+
+ p = m_cached_position.position[E];
+ if (p != FLT_MAX)
+ m_start_position[E] = p;
+
+ p = FLT_MAX;
+ if (!line.has_value(4, p))
+ p = m_cached_position.feedrate;
+
+ if (p != FLT_MAX)
+ m_feedrate = p;
+}
+
+void GCodeProcessor::process_M566(const GCodeReader::GCodeLine& line)
+{
+ for (size_t i = 0; i < static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) {
+ if (line.has_x())
+ set_option_value(m_time_processor.machine_limits.machine_max_jerk_x, i, line.x() * MMMIN_TO_MMSEC);
+
+ if (line.has_y())
+ set_option_value(m_time_processor.machine_limits.machine_max_jerk_y, i, line.y() * MMMIN_TO_MMSEC);
+
+ if (line.has_z())
+ set_option_value(m_time_processor.machine_limits.machine_max_jerk_z, i, line.z() * MMMIN_TO_MMSEC);
+
+ if (line.has_e())
+ set_option_value(m_time_processor.machine_limits.machine_max_jerk_e, i, line.e() * MMMIN_TO_MMSEC);
+ }
+}
+
+void GCodeProcessor::process_M702(const GCodeReader::GCodeLine& line)
+{
+ 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.
+ m_time_processor.extruder_unloaded = true;
+ simulate_st_synchronize(get_filament_unload_time(m_extruder_id));
+ }
+}
+
+void GCodeProcessor::process_T(const GCodeReader::GCodeLine& line)
+{
+ process_T(line.cmd());
+}
+
+void GCodeProcessor::process_T(const std::string_view command)
+{
+ if (command.length() > 1) {
+ int eid;
+ if (! parse_number(command.substr(1), eid) || eid < 0 || eid > 255) {
+ // T-1 is a valid gcode line for RepRap Firmwares (used to deselects all tools) see https://github.com/prusa3d/PrusaSlicer/issues/5677
+ if ((m_flavor != gcfRepRapFirmware && m_flavor != gcfRepRapSprinter) || eid != -1)
+ BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid toolchange (" << command << ").";
+ } else {
+ unsigned char id = static_cast<unsigned char>(eid);
+ if (m_extruder_id != id) {
+ unsigned char extruders_count = static_cast<unsigned char>(m_extruder_offsets.size());
+ if (id >= extruders_count)
+ BOOST_LOG_TRIVIAL(error) << "GCodeProcessor encountered an invalid toolchange, maybe from a custom gcode.";
+ else {
+ unsigned char old_extruder_id = m_extruder_id;
+ m_extruder_id = id;
+ m_cp_color.current = m_extruder_colors[id];
+ // Specific to the MK3 MMU2:
+ // The initial value of extruder_unloaded is set to true 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(static_cast<size_t>(old_extruder_id));
+ m_time_processor.extruder_unloaded = false;
+ extra_time += get_filament_load_time(static_cast<size_t>(m_extruder_id));
+ simulate_st_synchronize(extra_time);
+ }
+
+ // store tool change move
+ store_move_vertex(EMoveType::Tool_change);
+ }
+ }
+ }
+}
+
+void GCodeProcessor::store_move_vertex(EMoveType type)
+{
+ MoveVertex vertex = {
+ type,
+ m_extrusion_role,
+ m_extruder_id,
+ m_cp_color.current,
+ Vec3f(m_end_position[X], m_end_position[Y], m_end_position[Z]) + m_extruder_offsets[m_extruder_id],
+ m_end_position[E] - m_start_position[E],
+ m_feedrate,
+ m_width,
+ m_height,
+ m_mm3_per_mm,
+ m_fan_speed,
+ static_cast<float>(m_result.moves.size())
+ };
+ m_result.moves.emplace_back(vertex);
+}
+
+float GCodeProcessor::minimum_feedrate(PrintEstimatedTimeStatistics::ETimeMode mode, float feedrate) const
+{
+ if (m_time_processor.machine_limits.machine_min_extruding_rate.empty())
+ return feedrate;
+
+ return std::max(feedrate, get_option_value(m_time_processor.machine_limits.machine_min_extruding_rate, static_cast<size_t>(mode)));
+}
+
+float GCodeProcessor::minimum_travel_feedrate(PrintEstimatedTimeStatistics::ETimeMode mode, float feedrate) const
+{
+ if (m_time_processor.machine_limits.machine_min_travel_rate.empty())
+ return feedrate;
+
+ return std::max(feedrate, get_option_value(m_time_processor.machine_limits.machine_min_travel_rate, static_cast<size_t>(mode)));
+}
+
+float GCodeProcessor::get_axis_max_feedrate(PrintEstimatedTimeStatistics::ETimeMode mode, Axis axis) const
+{
+ switch (axis)
+ {
+ case X: { return get_option_value(m_time_processor.machine_limits.machine_max_feedrate_x, static_cast<size_t>(mode)); }
+ case Y: { return get_option_value(m_time_processor.machine_limits.machine_max_feedrate_y, static_cast<size_t>(mode)); }
+ case Z: { return get_option_value(m_time_processor.machine_limits.machine_max_feedrate_z, static_cast<size_t>(mode)); }
+ case E: { return get_option_value(m_time_processor.machine_limits.machine_max_feedrate_e, static_cast<size_t>(mode)); }
+ default: { return 0.0f; }
+ }
+}
+
+float GCodeProcessor::get_axis_max_acceleration(PrintEstimatedTimeStatistics::ETimeMode mode, Axis axis) const
+{
+ switch (axis)
+ {
+ case X: { return get_option_value(m_time_processor.machine_limits.machine_max_acceleration_x, static_cast<size_t>(mode)); }
+ case Y: { return get_option_value(m_time_processor.machine_limits.machine_max_acceleration_y, static_cast<size_t>(mode)); }
+ case Z: { return get_option_value(m_time_processor.machine_limits.machine_max_acceleration_z, static_cast<size_t>(mode)); }
+ case E: { return get_option_value(m_time_processor.machine_limits.machine_max_acceleration_e, static_cast<size_t>(mode)); }
+ default: { return 0.0f; }
+ }
+}
+
+float GCodeProcessor::get_axis_max_jerk(PrintEstimatedTimeStatistics::ETimeMode mode, Axis axis) const
+{
+ switch (axis)
+ {
+ case X: { return get_option_value(m_time_processor.machine_limits.machine_max_jerk_x, static_cast<size_t>(mode)); }
+ case Y: { return get_option_value(m_time_processor.machine_limits.machine_max_jerk_y, static_cast<size_t>(mode)); }
+ case Z: { return get_option_value(m_time_processor.machine_limits.machine_max_jerk_z, static_cast<size_t>(mode)); }
+ case E: { return get_option_value(m_time_processor.machine_limits.machine_max_jerk_e, static_cast<size_t>(mode)); }
+ default: { return 0.0f; }
+ }
+}
+
+float GCodeProcessor::get_retract_acceleration(PrintEstimatedTimeStatistics::ETimeMode mode) const
+{
+ return get_option_value(m_time_processor.machine_limits.machine_max_acceleration_retracting, static_cast<size_t>(mode));
+}
+
+float GCodeProcessor::get_acceleration(PrintEstimatedTimeStatistics::ETimeMode mode) const
+{
+ size_t id = static_cast<size_t>(mode);
+ return (id < m_time_processor.machines.size()) ? m_time_processor.machines[id].acceleration : DEFAULT_ACCELERATION;
+}
+
+void GCodeProcessor::set_acceleration(PrintEstimatedTimeStatistics::ETimeMode mode, float value)
+{
+ size_t id = static_cast<size_t>(mode);
+ if (id < m_time_processor.machines.size()) {
+ m_time_processor.machines[id].acceleration = (m_time_processor.machines[id].max_acceleration == 0.0f) ? value :
+ // Clamp the acceleration with the maximum.
+ std::min(value, m_time_processor.machines[id].max_acceleration);
+ }
+}
+
+float GCodeProcessor::get_filament_load_time(size_t extruder_id)
+{
+ return (m_time_processor.filament_load_times.empty() || m_time_processor.extruder_unloaded) ?
+ 0.0f :
+ ((extruder_id < m_time_processor.filament_load_times.size()) ?
+ m_time_processor.filament_load_times[extruder_id] : m_time_processor.filament_load_times.front());
+}
+
+float GCodeProcessor::get_filament_unload_time(size_t extruder_id)
+{
+ return (m_time_processor.filament_unload_times.empty() || m_time_processor.extruder_unloaded) ?
+ 0.0f :
+ ((extruder_id < m_time_processor.filament_unload_times.size()) ?
+ m_time_processor.filament_unload_times[extruder_id] : m_time_processor.filament_unload_times.front());
+}
+
+void GCodeProcessor::process_custom_gcode_time(CustomGCode::Type code)
+{
+ for (size_t i = 0; i < static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) {
+ TimeMachine& machine = m_time_processor.machines[i];
+ if (!machine.enabled)
+ continue;
+
+ TimeMachine::CustomGCodeTime& gcode_time = machine.gcode_time;
+ gcode_time.needed = true;
+ //FIXME this simulates st_synchronize! is it correct?
+ // The estimated time may be longer than the real print time.
+ machine.simulate_st_synchronize();
+ if (gcode_time.cache != 0.0f) {
+ gcode_time.times.push_back({ code, gcode_time.cache });
+ gcode_time.cache = 0.0f;
+ }
+ }
+}
+
+void GCodeProcessor::simulate_st_synchronize(float additional_time)
+{
+ for (size_t i = 0; i < static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Count); ++i) {
+ m_time_processor.machines[i].simulate_st_synchronize(additional_time);
+ }
+}
+
+void GCodeProcessor::update_estimated_times_stats()
+{
+ auto update_mode = [this](PrintEstimatedTimeStatistics::ETimeMode mode) {
+ PrintEstimatedTimeStatistics::Mode& data = m_result.time_statistics.modes[static_cast<size_t>(mode)];
+ data.time = get_time(mode);
+ data.custom_gcode_times = get_custom_gcode_times(mode, true);
+ data.moves_times = get_moves_time(mode);
+ data.roles_times = get_roles_time(mode);
+ data.layers_times = get_layers_time(mode);
+ };
+
+ update_mode(PrintEstimatedTimeStatistics::ETimeMode::Normal);
+ if (m_time_processor.machines[static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Stealth)].enabled)
+ update_mode(PrintEstimatedTimeStatistics::ETimeMode::Stealth);
+ else
+ m_result.time_statistics.modes[static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Stealth)].reset();
+}
+
+} /* namespace Slic3r */
+
diff --git a/src/libslic3r/GCode/GCodeProcessor.hpp b/src/libslic3r/GCode/GCodeProcessor.hpp
new file mode 100644
index 000000000..5068d0fd6
--- /dev/null
+++ b/src/libslic3r/GCode/GCodeProcessor.hpp
@@ -0,0 +1,610 @@
+#ifndef slic3r_GCodeProcessor_hpp_
+#define slic3r_GCodeProcessor_hpp_
+
+#include "libslic3r/GCodeReader.hpp"
+#include "libslic3r/Point.hpp"
+#include "libslic3r/ExtrusionEntity.hpp"
+#include "libslic3r/PrintConfig.hpp"
+#include "libslic3r/CustomGCode.hpp"
+
+#include <cstdint>
+#include <array>
+#include <vector>
+#include <string>
+#include <string_view>
+
+namespace Slic3r {
+
+ enum class EMoveType : unsigned char
+ {
+ Noop,
+ Retract,
+ Unretract,
+ Tool_change,
+ Color_change,
+ Pause_Print,
+ Custom_GCode,
+ Travel,
+ Wipe,
+ Extrude,
+ Count
+ };
+
+ struct PrintEstimatedTimeStatistics
+ {
+ enum class ETimeMode : unsigned char
+ {
+ Normal,
+ Stealth,
+ Count
+ };
+
+ struct Mode
+ {
+ float time;
+ std::vector<std::pair<CustomGCode::Type, std::pair<float, float>>> custom_gcode_times;
+ std::vector<std::pair<EMoveType, float>> moves_times;
+ std::vector<std::pair<ExtrusionRole, float>> roles_times;
+ std::vector<float> layers_times;
+
+ void reset() {
+ time = 0.0f;
+ custom_gcode_times.clear();
+ moves_times.clear();
+ roles_times.clear();
+ layers_times.clear();
+ }
+ };
+
+ std::array<Mode, static_cast<size_t>(ETimeMode::Count)> modes;
+
+ PrintEstimatedTimeStatistics() { reset(); }
+
+ void reset() {
+ for (auto m : modes) {
+ m.reset();
+ }
+ }
+ };
+
+ class GCodeProcessor
+ {
+ public:
+ static const std::string Extrusion_Role_Tag;
+ static const std::string Wipe_Start_Tag;
+ static const std::string Wipe_End_Tag;
+ static const std::string Height_Tag;
+ static const std::string Layer_Change_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 First_Line_M73_Placeholder_Tag;
+ static const std::string Last_Line_M73_Placeholder_Tag;
+ static const std::string Estimated_Printing_Time_Placeholder_Tag;
+
+ static const float Wipe_Width;
+ static const float Wipe_Height;
+
+#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ static const std::string Width_Tag;
+#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+#if ENABLE_GCODE_VIEWER_DATA_CHECKING
+#if !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ static const std::string Width_Tag;
+#endif // !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ static const std::string Mm3_Per_Mm_Tag;
+#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
+
+ private:
+ using AxisCoords = std::array<float, 4>;
+ using ExtruderColors = std::vector<unsigned char>;
+
+ enum class EUnits : unsigned char
+ {
+ Millimeters,
+ Inches
+ };
+
+ enum class EPositioningType : unsigned char
+ {
+ Absolute,
+ Relative
+ };
+
+ struct CachedPosition
+ {
+ AxisCoords position; // mm
+ float feedrate; // mm/s
+
+ void reset();
+ };
+
+ struct CpColor
+ {
+ unsigned char counter;
+ unsigned char current;
+
+ void reset();
+ };
+
+ public:
+ struct FeedrateProfile
+ {
+ float entry{ 0.0f }; // mm/s
+ float cruise{ 0.0f }; // mm/s
+ float exit{ 0.0f }; // mm/s
+ };
+
+ struct Trapezoid
+ {
+ float accelerate_until{ 0.0f }; // mm
+ float decelerate_after{ 0.0f }; // mm
+ float cruise_feedrate{ 0.0f }; // 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;
+ };
+
+ struct TimeBlock
+ {
+ struct Flags
+ {
+ bool recalculate{ false };
+ bool nominal_length{ false };
+ };
+
+ 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
+ float max_entry_speed{ 0.0f }; // mm/s
+ float safe_feedrate{ 0.0f }; // mm/s
+ Flags flags;
+ FeedrateProfile feedrate_profile;
+ Trapezoid trapezoid;
+
+ // Calculates this block's trapezoid
+ void calculate_trapezoid();
+
+ float time() const;
+ };
+
+ private:
+ struct TimeMachine
+ {
+ struct State
+ {
+ float feedrate; // mm/s
+ float safe_feedrate; // mm/s
+ AxisCoords axis_feedrate; // mm/s
+ AxisCoords abs_axis_feedrate; // mm/s
+
+ void reset();
+ };
+
+ struct CustomGCodeTime
+ {
+ bool needed;
+ float cache;
+ std::vector<std::pair<CustomGCode::Type, float>> times;
+
+ 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.
+ float max_acceleration; // mm/s^2
+ float extrude_factor_override_percentage;
+ float time; // s
+ std::string line_m73_mask;
+ State curr;
+ State prev;
+ CustomGCodeTime gcode_time;
+ std::vector<TimeBlock> blocks;
+ std::vector<G1LinesCacheItem> g1_times_cache;
+ std::array<float, static_cast<size_t>(EMoveType::Count)> moves_time;
+ std::array<float, static_cast<size_t>(ExtrusionRole::erCount)> roles_time;
+ std::vector<float> layers_time;
+
+ void reset();
+
+ // Simulates firmware st_synchronize() call
+ void simulate_st_synchronize(float additional_time = 0.0f);
+ void calculate_time(size_t keep_last_n_blocks = 0);
+ };
+
+ struct TimeProcessor
+ {
+ struct Planner
+ {
+ // 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 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 refresh_threshold = queue_size * 4;
+ };
+
+ // 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_unloaded = true means no filament is loaded yet, all the filaments are parked in the MK3 MMU2 unit.
+ bool extruder_unloaded;
+ // whether or not to export post-process the gcode to export lines M73 in it
+ bool export_remaining_time_enabled;
+ // allow to skip the lines M201/M203/M204/M205 generated by GCode::print_machine_envelope() for non-Normal time estimate mode
+ bool machine_envelope_processing_enabled;
+ MachineEnvelopeConfig machine_limits;
+ // Additional load / unload times for a filament exchange sequence.
+ std::vector<float> filament_load_times;
+ std::vector<float> filament_unload_times;
+ std::array<TimeMachine, static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Count)> machines;
+
+ void reset();
+
+ // post process the file with the given filename to add remaining time lines M73
+ void post_process(const std::string& filename);
+ };
+
+ public:
+ struct MoveVertex
+ {
+ EMoveType type{ EMoveType::Noop };
+ ExtrusionRole extrusion_role{ erNone };
+ unsigned char extruder_id{ 0 };
+ unsigned char cp_color_id{ 0 };
+ Vec3f position{ Vec3f::Zero() }; // mm
+ float delta_extruder{ 0.0f }; // mm
+ float feedrate{ 0.0f }; // mm/s
+ float width{ 0.0f }; // mm
+ float height{ 0.0f }; // mm
+ float mm3_per_mm{ 0.0f };
+ float fan_speed{ 0.0f }; // percentage
+ float time{ 0.0f }; // s
+
+ float volumetric_rate() const { return feedrate * mm3_per_mm; }
+ };
+
+ struct Result
+ {
+ struct SettingsIds
+ {
+ std::string print;
+ std::vector<std::string> filament;
+ std::string printer;
+
+ void reset()
+ {
+ print = "";
+ filament = std::vector<std::string>();
+ printer = "";
+ }
+ };
+ unsigned int id;
+ std::vector<MoveVertex> moves;
+ Pointfs bed_shape;
+ SettingsIds settings_ids;
+ size_t extruders_count;
+ std::vector<std::string> extruder_colors;
+ PrintEstimatedTimeStatistics time_statistics;
+
+#if ENABLE_GCODE_VIEWER_STATISTICS
+ int64_t time{ 0 };
+ void reset()
+ {
+ time = 0;
+ moves = std::vector<MoveVertex>();
+ bed_shape = Pointfs();
+ extruder_colors = std::vector<std::string>();
+ extruders_count = 0;
+ settings_ids.reset();
+ }
+#else
+ void reset()
+ {
+ moves = std::vector<MoveVertex>();
+ bed_shape = Pointfs();
+ extruder_colors = std::vector<std::string>();
+ extruders_count = 0;
+ settings_ids.reset();
+ }
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+ };
+
+#if ENABLE_GCODE_VIEWER_DATA_CHECKING
+ struct DataChecker
+ {
+ struct Error
+ {
+ float value;
+ float tag_value;
+ ExtrusionRole role;
+ };
+
+ std::string type;
+ float threshold{ 0.01f };
+ float last_tag_value{ 0.0f };
+ unsigned int count{ 0 };
+ std::vector<Error> errors;
+
+ DataChecker(const std::string& type, float threshold)
+ : type(type), threshold(threshold)
+ {}
+
+ void update(float value, ExtrusionRole role) {
+ if (role != erCustom) {
+ ++count;
+ if (last_tag_value != 0.0f) {
+ if (std::abs(value - last_tag_value) / last_tag_value > threshold)
+ errors.push_back({ value, last_tag_value, role });
+ }
+ }
+ }
+
+ void reset() { last_tag_value = 0.0f; errors.clear(); count = 0; }
+
+ std::pair<float, float> get_min() const {
+ float delta_min = FLT_MAX;
+ float perc_min = 0.0f;
+ for (const Error& e : errors) {
+ if (delta_min > e.value - e.tag_value) {
+ delta_min = e.value - e.tag_value;
+ perc_min = 100.0f * delta_min / e.tag_value;
+ }
+ }
+ return { delta_min, perc_min };
+ }
+
+ std::pair<float, float> get_max() const {
+ float delta_max = -FLT_MAX;
+ float perc_max = 0.0f;
+ for (const Error& e : errors) {
+ if (delta_max < e.value - e.tag_value) {
+ delta_max = e.value - e.tag_value;
+ perc_max = 100.0f * delta_max / e.tag_value;
+ }
+ }
+ return { delta_max, perc_max };
+ }
+
+ void output() const {
+ if (!errors.empty()) {
+ std::cout << type << ":\n";
+ std::cout << "Errors: " << errors.size() << " (" << 100.0f * float(errors.size()) / float(count) << "%)\n";
+ auto [min, perc_min] = get_min();
+ auto [max, perc_max] = get_max();
+ std::cout << "min: " << min << "(" << perc_min << "%) - max: " << max << "(" << perc_max << "%)\n";
+ }
+ }
+ };
+#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
+
+ private:
+ GCodeReader m_parser;
+
+ EUnits m_units;
+ EPositioningType m_global_positioning_type;
+ EPositioningType m_e_local_positioning_type;
+ std::vector<Vec3f> m_extruder_offsets;
+ GCodeFlavor m_flavor;
+
+ AxisCoords m_start_position; // mm
+ AxisCoords m_end_position; // mm
+ AxisCoords m_origin; // mm
+ CachedPosition m_cached_position;
+ bool m_wiping;
+
+ float m_feedrate; // mm/s
+ float m_width; // mm
+ float m_height; // mm
+#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ float m_forced_width; // mm
+ float m_forced_height; // mm
+#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ float m_mm3_per_mm;
+ float m_fan_speed; // percentage
+ ExtrusionRole m_extrusion_role;
+ unsigned char m_extruder_id;
+ ExtruderColors m_extruder_colors;
+ std::vector<float> m_filament_diameters;
+ float m_extruded_last_z;
+ unsigned int m_g1_line_id;
+ unsigned int m_layer_id;
+ CpColor m_cp_color;
+#if ENABLE_VOLUMETRIC_EXTRUSION_PROCESSING
+ bool m_use_volumetric_e;
+#endif // ENABLE_VOLUMETRIC_EXTRUSION_PROCESSING
+
+ enum class EProducer
+ {
+ Unknown,
+ PrusaSlicer,
+ Slic3rPE,
+ Slic3r,
+ Cura,
+ Simplify3D,
+ CraftWare,
+ ideaMaker,
+ KissSlicer
+ };
+
+ static const std::vector<std::pair<GCodeProcessor::EProducer, std::string>> Producers;
+ EProducer m_producer;
+ bool m_producers_enabled;
+
+ TimeProcessor m_time_processor;
+
+ Result m_result;
+ static unsigned int s_result_id;
+
+#if ENABLE_GCODE_VIEWER_DATA_CHECKING
+ DataChecker m_mm3_per_mm_compare{ "mm3_per_mm", 0.01f };
+ DataChecker m_height_compare{ "height", 0.01f };
+ DataChecker m_width_compare{ "width", 0.01f };
+#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
+
+ public:
+ GCodeProcessor();
+
+ void apply_config(const PrintConfig& config);
+ void apply_config(const DynamicPrintConfig& config);
+ void enable_stealth_time_estimator(bool enabled);
+ bool is_stealth_time_estimator_enabled() const {
+ return m_time_processor.machines[static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Stealth)].enabled;
+ }
+ void enable_machine_envelope_processing(bool enabled) { m_time_processor.machine_envelope_processing_enabled = enabled; }
+ void enable_producers(bool enabled) { m_producers_enabled = enabled; }
+ void reset();
+
+ const Result& get_result() const { return m_result; }
+ Result&& extract_result() { return std::move(m_result); }
+
+ // Process the gcode contained in the file with the given filename
+ // throws CanceledException through print->throw_if_canceled() (sent by the caller as callback).
+ void process_file(const std::string& filename, bool apply_postprocess, std::function<void()> cancel_callback = nullptr);
+
+ float get_time(PrintEstimatedTimeStatistics::ETimeMode mode) const;
+ std::string get_time_dhm(PrintEstimatedTimeStatistics::ETimeMode mode) const;
+ std::vector<std::pair<CustomGCode::Type, std::pair<float, float>>> get_custom_gcode_times(PrintEstimatedTimeStatistics::ETimeMode mode, bool include_remaining) const;
+
+ std::vector<std::pair<EMoveType, float>> get_moves_time(PrintEstimatedTimeStatistics::ETimeMode mode) const;
+ std::vector<std::pair<ExtrusionRole, float>> get_roles_time(PrintEstimatedTimeStatistics::ETimeMode mode) const;
+ std::vector<float> get_layers_time(PrintEstimatedTimeStatistics::ETimeMode mode) const;
+
+ private:
+ void process_gcode_line(const GCodeReader::GCodeLine& line);
+
+ // Process tags embedded into comments
+ 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 process_kissslicer_tags(const std::string_view comment);
+
+ bool detect_producer(const std::string_view comment);
+
+ // Move
+ void process_G0(const GCodeReader::GCodeLine& line);
+ void process_G1(const GCodeReader::GCodeLine& line);
+
+ // Retract
+ void process_G10(const GCodeReader::GCodeLine& line);
+
+ // Unretract
+ void process_G11(const GCodeReader::GCodeLine& line);
+
+ // Set Units to Inches
+ void process_G20(const GCodeReader::GCodeLine& line);
+
+ // Set Units to Millimeters
+ void process_G21(const GCodeReader::GCodeLine& line);
+
+ // Firmware controlled Retract
+ void process_G22(const GCodeReader::GCodeLine& line);
+
+ // Firmware controlled Unretract
+ void process_G23(const GCodeReader::GCodeLine& line);
+
+ // Set to Absolute Positioning
+ void process_G90(const GCodeReader::GCodeLine& line);
+
+ // Set to Relative Positioning
+ void process_G91(const GCodeReader::GCodeLine& line);
+
+ // Set Position
+ void process_G92(const GCodeReader::GCodeLine& line);
+
+ // Sleep or Conditional stop
+ void process_M1(const GCodeReader::GCodeLine& line);
+
+ // Set extruder to absolute mode
+ void process_M82(const GCodeReader::GCodeLine& line);
+
+ // Set extruder to relative mode
+ void process_M83(const GCodeReader::GCodeLine& line);
+
+ // Set fan speed
+ void process_M106(const GCodeReader::GCodeLine& line);
+
+ // Disable fan
+ void process_M107(const GCodeReader::GCodeLine& line);
+
+ // Set tool (Sailfish)
+ void process_M108(const GCodeReader::GCodeLine& line);
+
+ // Recall stored home offsets
+ void process_M132(const GCodeReader::GCodeLine& line);
+
+ // Set tool (MakerWare)
+ void process_M135(const GCodeReader::GCodeLine& line);
+
+ // Set max printing acceleration
+ void process_M201(const GCodeReader::GCodeLine& line);
+
+ // Set maximum feedrate
+ void process_M203(const GCodeReader::GCodeLine& line);
+
+ // Set default acceleration
+ void process_M204(const GCodeReader::GCodeLine& line);
+
+ // Advanced settings
+ void process_M205(const GCodeReader::GCodeLine& line);
+
+ // Set extrude factor override percentage
+ void process_M221(const GCodeReader::GCodeLine& line);
+
+ // Repetier: Store x, y and z position
+ void process_M401(const GCodeReader::GCodeLine& line);
+
+ // Repetier: Go to stored position
+ void process_M402(const GCodeReader::GCodeLine& line);
+
+ // Set allowable instantaneous speed change
+ void process_M566(const GCodeReader::GCodeLine& line);
+
+ // Unload the current filament into the MK3 MMU2 unit at the end of print.
+ void process_M702(const GCodeReader::GCodeLine& line);
+
+ // Processes T line (Select Tool)
+ void process_T(const GCodeReader::GCodeLine& line);
+ void process_T(const std::string_view command);
+
+ void store_move_vertex(EMoveType type);
+
+ float minimum_feedrate(PrintEstimatedTimeStatistics::ETimeMode mode, float feedrate) const;
+ float minimum_travel_feedrate(PrintEstimatedTimeStatistics::ETimeMode mode, float feedrate) const;
+ float get_axis_max_feedrate(PrintEstimatedTimeStatistics::ETimeMode mode, Axis axis) const;
+ float get_axis_max_acceleration(PrintEstimatedTimeStatistics::ETimeMode mode, Axis axis) const;
+ float get_axis_max_jerk(PrintEstimatedTimeStatistics::ETimeMode mode, Axis axis) const;
+ float get_retract_acceleration(PrintEstimatedTimeStatistics::ETimeMode mode) const;
+ float get_acceleration(PrintEstimatedTimeStatistics::ETimeMode mode) const;
+ void set_acceleration(PrintEstimatedTimeStatistics::ETimeMode mode, float value);
+ float get_filament_load_time(size_t extruder_id);
+ float get_filament_unload_time(size_t extruder_id);
+
+ void process_custom_gcode_time(CustomGCode::Type code);
+
+ // Simulates firmware st_synchronize() call
+ void simulate_st_synchronize(float additional_time = 0.0f);
+
+ void update_estimated_times_stats();
+ };
+
+} /* namespace Slic3r */
+
+#endif /* slic3r_GCodeProcessor_hpp_ */
+
+
diff --git a/src/libslic3r/GCode/PostProcessor.cpp b/src/libslic3r/GCode/PostProcessor.cpp
index 25982959b..9a66e743b 100644
--- a/src/libslic3r/GCode/PostProcessor.cpp
+++ b/src/libslic3r/GCode/PostProcessor.cpp
@@ -79,7 +79,7 @@ static DWORD execute_process_winapi(const std::wstring &command_line)
if (! ::CreateProcessW(
nullptr /* lpApplicationName */, (LPWSTR)command_line.c_str(), nullptr /* lpProcessAttributes */, nullptr /* lpThreadAttributes */, false /* bInheritHandles */,
CREATE_UNICODE_ENVIRONMENT /* | CREATE_NEW_CONSOLE */ /* dwCreationFlags */, (LPVOID)envstr.c_str(), nullptr /* lpCurrentDirectory */, &startup_info, &process_info))
- throw std::runtime_error(std::string("Failed starting the script ") + boost::nowide::narrow(command_line) + ", Win32 error: " + std::to_string(int(::GetLastError())));
+ throw Slic3r::RuntimeError(std::string("Failed starting the script ") + boost::nowide::narrow(command_line) + ", Win32 error: " + std::to_string(int(::GetLastError())));
::WaitForSingleObject(process_info.hProcess, INFINITE);
ULONG rc = 0;
::GetExitCodeProcess(process_info.hProcess, &rc);
@@ -98,13 +98,13 @@ static int run_script(const std::string &script, const std::string &gcode, std::
LPWSTR *szArglist = CommandLineToArgvW(boost::nowide::widen(script).c_str(), &nArgs);
if (szArglist == nullptr || nArgs <= 0) {
// CommandLineToArgvW failed. Maybe the command line escapment is invalid?
- throw std::runtime_error(std::string("Post processing script ") + script + " on file " + gcode + " failed. CommandLineToArgvW() refused to parse the command line path.");
+ throw Slic3r::RuntimeError(std::string("Post processing script ") + script + " on file " + gcode + " failed. CommandLineToArgvW() refused to parse the command line path.");
}
std::wstring command_line;
std::wstring command = szArglist[0];
if (! boost::filesystem::exists(boost::filesystem::path(command)))
- throw std::runtime_error(std::string("The configured post-processing script does not exist: ") + boost::nowide::narrow(command));
+ throw Slic3r::RuntimeError(std::string("The configured post-processing script does not exist: ") + boost::nowide::narrow(command));
if (boost::iends_with(command, L".pl")) {
// This is a perl script. Run it through the perl interpreter.
// The current process may be slic3r.exe or slic3r-console.exe.
@@ -115,7 +115,7 @@ static int run_script(const std::string &script, const std::string &gcode, std::
boost::filesystem::path path_perl = path_exe.parent_path() / "perl" / "perl.exe";
if (! boost::filesystem::exists(path_perl)) {
LocalFree(szArglist);
- throw std::runtime_error(std::string("Perl interpreter ") + path_perl.string() + " does not exist.");
+ throw Slic3r::RuntimeError(std::string("Perl interpreter ") + path_perl.string() + " does not exist.");
}
// Replace it with the current perl interpreter.
quote_argv_winapi(boost::nowide::widen(path_perl.string()), command_line);
@@ -179,17 +179,22 @@ static int run_script(const std::string &script, const std::string &gcode, std::
namespace Slic3r {
-void run_post_process_scripts(const std::string &path, const PrintConfig &config)
+void run_post_process_scripts(const std::string &path, const DynamicPrintConfig &config)
{
- if (config.post_process.values.empty())
+ const auto* post_process = config.opt<ConfigOptionStrings>("post_process");
+ if (// likely running in SLA mode
+ post_process == nullptr ||
+ // no post-processing script
+ post_process->values.empty())
return;
+ // Store print configuration into environment variables.
config.setenv_();
auto gcode_file = boost::filesystem::path(path);
if (! boost::filesystem::exists(gcode_file))
- throw std::runtime_error(std::string("Post-processor can't find exported gcode file"));
+ throw Slic3r::RuntimeError(std::string("Post-processor can't find exported gcode file"));
- for (const std::string &scripts : config.post_process.values) {
+ for (const std::string &scripts : post_process->values) {
std::vector<std::string> lines;
boost::split(lines, scripts, boost::is_any_of("\r\n"));
for (std::string script : lines) {
@@ -205,7 +210,7 @@ void run_post_process_scripts(const std::string &path, const PrintConfig &config
const std::string msg = std_err.empty() ? (boost::format("Post-processing script %1% on file %2% failed.\nError code: %3%") % script % path % result).str()
: (boost::format("Post-processing script %1% on file %2% failed.\nError code: %3%\nOutput:\n%4%") % script % path % result % std_err).str();
BOOST_LOG_TRIVIAL(error) << msg;
- throw std::runtime_error(msg);
+ throw Slic3r::RuntimeError(msg);
}
}
}
diff --git a/src/libslic3r/GCode/PostProcessor.hpp b/src/libslic3r/GCode/PostProcessor.hpp
index ce47374cb..a9196aef7 100644
--- a/src/libslic3r/GCode/PostProcessor.hpp
+++ b/src/libslic3r/GCode/PostProcessor.hpp
@@ -8,7 +8,7 @@
namespace Slic3r {
-extern void run_post_process_scripts(const std::string &path, const PrintConfig &config);
+extern void run_post_process_scripts(const std::string &path, const DynamicPrintConfig &config);
} // namespace Slic3r
diff --git a/src/libslic3r/GCode/PressureEqualizer.cpp b/src/libslic3r/GCode/PressureEqualizer.cpp
index 3b2a58a88..c3f084a24 100644
--- a/src/libslic3r/GCode/PressureEqualizer.cpp
+++ b/src/libslic3r/GCode/PressureEqualizer.cpp
@@ -148,7 +148,7 @@ static inline int parse_int(const char *&line)
char *endptr = NULL;
long result = strtol(line, &endptr, 10);
if (endptr == NULL || !is_ws_or_eol(*endptr))
- throw std::runtime_error("PressureEqualizer: Error parsing an int");
+ throw Slic3r::RuntimeError("PressureEqualizer: Error parsing an int");
line = endptr;
return int(result);
};
@@ -160,14 +160,15 @@ static inline float parse_float(const char *&line)
char *endptr = NULL;
float result = strtof(line, &endptr);
if (endptr == NULL || !is_ws_or_eol(*endptr))
- throw std::runtime_error("PressureEqualizer: Error parsing a float");
+ throw Slic3r::RuntimeError("PressureEqualizer: Error parsing a float");
line = endptr;
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);
@@ -229,7 +230,7 @@ bool PressureEqualizer::process_line(const char *line, const size_t len, GCodeLi
assert(false);
}
if (i == -1)
- throw std::runtime_error(std::string("GCode::PressureEqualizer: Invalid axis for G0/G1: ") + axis);
+ throw Slic3r::RuntimeError(std::string("GCode::PressureEqualizer: Invalid axis for G0/G1: ") + axis);
buf.pos_provided[i] = true;
new_pos[i] = parse_float(line);
if (i == 3 && m_config->use_relative_e_distances.value)
@@ -298,7 +299,7 @@ bool PressureEqualizer::process_line(const char *line, const size_t len, GCodeLi
set = true;
break;
default:
- throw std::runtime_error(std::string("GCode::PressureEqualizer: Incorrect axis in a G92 G-code: ") + axis);
+ throw Slic3r::RuntimeError(std::string("GCode::PressureEqualizer: Incorrect axis in a G92 G-code: ") + axis);
}
eatws(line);
}
diff --git a/src/libslic3r/GCode/PreviewData.cpp b/src/libslic3r/GCode/PreviewData.cpp
deleted file mode 100644
index 874a4d2ec..000000000
--- a/src/libslic3r/GCode/PreviewData.cpp
+++ /dev/null
@@ -1,516 +0,0 @@
-#include "Analyzer.hpp"
-#include "PreviewData.hpp"
-#include <I18N.hpp>
-#include "Utils.hpp"
-
-#include <boost/format.hpp>
-
-//! macro used to mark string used at localization,
-#define L(s) (s)
-
-namespace Slic3r {
-
-std::vector<unsigned char> Color::as_bytes() const
-{
- std::vector<unsigned char> ret;
- for (unsigned int i = 0; i < 4; ++i)
- {
- ret.push_back((unsigned char)(255.0f * rgba[i]));
- }
- return ret;
-}
-
-GCodePreviewData::Extrusion::Layer::Layer(float z, const Paths& paths)
- : z(z)
- , paths(paths)
-{
-}
-
-GCodePreviewData::Travel::Polyline::Polyline(EType type, EDirection direction, float feedrate, unsigned int extruder_id, const Polyline3& polyline)
- : type(type)
- , direction(direction)
- , feedrate(feedrate)
- , extruder_id(extruder_id)
- , polyline(polyline)
-{
-}
-
-GCodePreviewData::Range::Range()
-{
- reset();
-}
-
-void GCodePreviewData::Range::reset()
-{
- min_val = FLT_MAX;
- max_val = -FLT_MAX;
-}
-
-bool GCodePreviewData::Range::empty() const
-{
- return min_val >= max_val;
-}
-
-void GCodePreviewData::Range::update_from(float value)
-{
- min_val = std::min(min_val, value);
- max_val = std::max(max_val, value);
-}
-
-void GCodePreviewData::Range::update_from(const RangeBase& other)
-{
- min_val = std::min(min_val, other.min());
- max_val = std::max(max_val, other.max());
-}
-
-float GCodePreviewData::RangeBase::step_size() const
-{
- return (max() - min()) / static_cast<float>(range_rainbow_colors.size() - 1);
-}
-
-Color GCodePreviewData::RangeBase::get_color_at(float value) const
-{
- // Input value scaled to the color range
- float step = step_size();
- const float global_t = (step != 0.0f) ? std::max(0.0f, value - min()) / step_size() : 0.0f; // lower limit of 0.0f
-
- constexpr std::size_t color_max_idx = range_rainbow_colors.size() - 1;
-
- // Compute the two colors just below (low) and above (high) the input value
- const std::size_t color_low_idx = std::clamp(static_cast<std::size_t>(global_t), std::size_t{ 0 }, color_max_idx);
- const std::size_t color_high_idx = std::clamp(color_low_idx + 1, std::size_t{ 0 }, color_max_idx);
-
- // Compute how far the value is between the low and high colors so that they can be interpolated
- const float local_t = std::min(global_t - static_cast<float>(color_low_idx), 1.0f); // upper limit of 1.0f
-
- // Interpolate between the low and high colors in RGB space to find exactly which color the input value should get
- Color ret;
- for (unsigned int i = 0; i < 4; ++i)
- {
- ret.rgba[i] = lerp(range_rainbow_colors[color_low_idx].rgba[i], range_rainbow_colors[color_high_idx].rgba[i], local_t);
- }
- return ret;
-}
-
-float GCodePreviewData::Range::min() const
-{
- return min_val;
-}
-
-float GCodePreviewData::Range::max() const
-{
- return max_val;
-}
-
-GCodePreviewData::LegendItem::LegendItem(const std::string& text, const Color& color)
- : text(text)
- , color(color)
-{
-}
-
-const Color GCodePreviewData::Extrusion::Default_Extrusion_Role_Colors[erCount] =
-{
- Color(0.0f, 0.0f, 0.0f, 1.0f), // erNone
- Color(1.0f, 0.0f, 0.0f, 1.0f), // erPerimeter
- Color(0.0f, 1.0f, 0.0f, 1.0f), // erExternalPerimeter
- Color(0.0f, 0.0f, 1.0f, 1.0f), // erOverhangPerimeter
- Color(1.0f, 1.0f, 0.0f, 1.0f), // erInternalInfill
- Color(1.0f, 0.0f, 1.0f, 1.0f), // erSolidInfill
- Color(0.0f, 1.0f, 1.0f, 1.0f), // erTopSolidInfill
- Color(0.5f, 0.5f, 0.5f, 1.0f), // erBridgeInfill
- Color(1.0f, 1.0f, 1.0f, 1.0f), // erGapFill
- Color(0.5f, 0.0f, 0.0f, 1.0f), // erSkirt
- Color(0.0f, 0.5f, 0.0f, 1.0f), // erSupportMaterial
- Color(0.0f, 0.0f, 0.5f, 1.0f), // erSupportMaterialInterface
- Color(0.7f, 0.89f, 0.67f, 1.0f), // erWipeTower
- Color(1.0f, 1.0f, 0.0f, 1.0f), // erCustom
- Color(0.0f, 0.0f, 0.0f, 1.0f) // erMixed
-};
-
-const GCodePreviewData::Extrusion::EViewType GCodePreviewData::Extrusion::Default_View_Type = GCodePreviewData::Extrusion::FeatureType;
-
-void GCodePreviewData::Extrusion::set_default()
-{
- view_type = Default_View_Type;
-
- ::memcpy((void*)role_colors, (const void*)Default_Extrusion_Role_Colors, erCount * sizeof(Color));
-
- for (unsigned int i = 0; i < erCount; ++i)
- role_names[i] = ExtrusionEntity::role_to_string(ExtrusionRole(i));
-
- role_flags = 0;
- for (unsigned int i = 0; i < erCount; ++i)
- role_flags |= 1 << i;
-}
-
-bool GCodePreviewData::Extrusion::is_role_flag_set(ExtrusionRole role) const
-{
- return is_role_flag_set(role_flags, role);
-}
-
-bool GCodePreviewData::Extrusion::is_role_flag_set(unsigned int flags, ExtrusionRole role)
-{
- return GCodeAnalyzer::is_valid_extrusion_role(role) && (flags & (1 << (role - erPerimeter))) != 0;
-}
-
-size_t GCodePreviewData::Extrusion::memory_used() const
-{
- size_t out = sizeof(*this);
- out += SLIC3R_STDVEC_MEMSIZE(this->layers, Layer);
- for (const Layer &layer : this->layers) {
- out += SLIC3R_STDVEC_MEMSIZE(layer.paths, Path);
- for (const Path &path : layer.paths)
- out += SLIC3R_STDVEC_MEMSIZE(path.polyline.points, Point);
- }
- return out;
-}
-
-const float GCodePreviewData::Travel::Default_Width = 0.075f;
-const float GCodePreviewData::Travel::Default_Height = 0.075f;
-const Color GCodePreviewData::Travel::Default_Type_Colors[Num_Types] =
-{
- Color(0.0f, 0.0f, 0.75f, 1.0f), // Move
- Color(0.0f, 0.75f, 0.0f, 1.0f), // Extrude
- Color(0.75f, 0.0f, 0.0f, 1.0f), // Retract
-};
-
-void GCodePreviewData::Travel::set_default()
-{
- width = Default_Width;
- height = Default_Height;
- ::memcpy((void*)type_colors, (const void*)Default_Type_Colors, Num_Types * sizeof(Color));
- color_print_idx = 0;
-
- is_visible = false;
-}
-
-size_t GCodePreviewData::Travel::memory_used() const
-{
- size_t out = sizeof(*this);
- out += SLIC3R_STDVEC_MEMSIZE(this->polylines, Polyline);
- for (const Polyline &polyline : this->polylines)
- out += SLIC3R_STDVEC_MEMSIZE(polyline.polyline.points, Vec3crd);
- return out;
-}
-
-const Color GCodePreviewData::Retraction::Default_Color = Color(1.0f, 1.0f, 1.0f, 1.0f);
-
-GCodePreviewData::Retraction::Position::Position(const Vec3crd& position, float width, float height)
- : position(position)
- , width(width)
- , height(height)
-{
-}
-
-void GCodePreviewData::Retraction::set_default()
-{
- color = Default_Color;
- is_visible = false;
-}
-
-size_t GCodePreviewData::Retraction::memory_used() const
-{
- return sizeof(*this) + SLIC3R_STDVEC_MEMSIZE(this->positions, Position);
-}
-
-void GCodePreviewData::Shell::set_default()
-{
- is_visible = false;
-}
-
-GCodePreviewData::GCodePreviewData()
-{
- set_default();
-}
-
-void GCodePreviewData::set_default()
-{
- extrusion.set_default();
- travel.set_default();
- retraction.set_default();
- unretraction.set_default();
- shell.set_default();
-
- // Configure the color range for feedrate to match the default for travels and to enable extrusions since they are always visible
- ranges.feedrate.set_mode(FeedrateKind::TRAVEL, travel.is_visible);
- ranges.feedrate.set_mode(FeedrateKind::EXTRUSION, true);
-}
-
-void GCodePreviewData::reset()
-{
- ranges.width.reset();
- ranges.height.reset();
- ranges.feedrate.reset();
- ranges.fan_speed.reset();
- ranges.volumetric_rate.reset();
- extrusion.layers.clear();
- travel.polylines.clear();
- retraction.positions.clear();
- unretraction.positions.clear();
-}
-
-bool GCodePreviewData::empty() const
-{
- return extrusion.layers.empty() && travel.polylines.empty() && retraction.positions.empty() && unretraction.positions.empty();
-}
-
-Color GCodePreviewData::get_extrusion_role_color(ExtrusionRole role) const
-{
- return extrusion.role_colors[role];
-}
-
-Color GCodePreviewData::get_height_color(float height) const
-{
- return ranges.height.get_color_at(height);
-}
-
-Color GCodePreviewData::get_width_color(float width) const
-{
- return ranges.width.get_color_at(width);
-}
-
-Color GCodePreviewData::get_feedrate_color(float feedrate) const
-{
- return ranges.feedrate.get_color_at(feedrate);
-}
-
-Color GCodePreviewData::get_fan_speed_color(float fan_speed) const
-{
- return ranges.fan_speed.get_color_at(fan_speed);
-}
-
-Color GCodePreviewData::get_volumetric_rate_color(float rate) const
-{
- return ranges.volumetric_rate.get_color_at(rate);
-}
-
-void GCodePreviewData::set_extrusion_role_color(const std::string& role_name, float red, float green, float blue, float alpha)
-{
- for (unsigned int i = 0; i < erCount; ++i)
- {
- if (role_name == extrusion.role_names[i])
- {
- extrusion.role_colors[i] = Color(red, green, blue, alpha);
- break;
- }
- }
-}
-
-void GCodePreviewData::set_extrusion_paths_colors(const std::vector<std::string>& colors)
-{
- unsigned int size = (unsigned int)colors.size();
-
- if (size % 2 != 0)
- return;
-
- for (unsigned int i = 0; i < size; i += 2)
- {
- const std::string& color_str = colors[i + 1];
-
- if (color_str.size() == 6)
- {
- bool valid = true;
- for (int c = 0; c < 6; ++c)
- {
- if (::isxdigit(color_str[c]) == 0)
- {
- valid = false;
- break;
- }
- }
-
- if (valid)
- {
- unsigned int color;
- std::stringstream ss;
- ss << std::hex << color_str;
- ss >> color;
-
- float den = 1.0f / 255.0f;
-
- float r = (float)((color & 0xFF0000) >> 16) * den;
- float g = (float)((color & 0x00FF00) >> 8) * den;
- float b = (float)(color & 0x0000FF) * den;
-
- this->set_extrusion_role_color(colors[i], r, g, b, 1.0f);
- }
- }
- }
-}
-
-std::string GCodePreviewData::get_legend_title() const
-{
- switch (extrusion.view_type)
- {
- case Extrusion::FeatureType:
- return L("Feature type");
- case Extrusion::Height:
- return L("Height (mm)");
- case Extrusion::Width:
- return L("Width (mm)");
- case Extrusion::Feedrate:
- return L("Speed (mm/s)");
- case Extrusion::FanSpeed:
- return L("Fan Speed (%)");
- case Extrusion::VolumetricRate:
- return L("Volumetric flow rate (mm³/s)");
- case Extrusion::Tool:
- return L("Tool");
- case Extrusion::ColorPrint:
- return L("Color Print");
- case Extrusion::Num_View_Types:
- break; // just to supress warning about non-handled value
- }
-
- return "";
-}
-
-GCodePreviewData::LegendItemsList GCodePreviewData::get_legend_items(const std::vector<float>& tool_colors,
- const std::vector<std::string>& cp_items) const
-{
- struct Helper
- {
- static void FillListFromRange(LegendItemsList& list, const RangeBase& range, unsigned int decimals, float scale_factor)
- {
- list.reserve(range_rainbow_colors.size());
-
- float step = range.step_size();
- if (step == 0.0f)
- {
- char buf[1024];
- sprintf(buf, "%.*f", decimals, scale_factor * range.min());
- list.emplace_back(buf, range_rainbow_colors[0]);
- }
- else
- {
- for (int i = static_cast<int>(range_rainbow_colors.size()) - 1; i >= 0; --i)
- {
- char buf[1024];
- sprintf(buf, "%.*f", decimals, scale_factor * (range.min() + (float)i * step));
- list.emplace_back(buf, range_rainbow_colors[i]);
- }
- }
- }
- };
-
- LegendItemsList items;
-
- switch (extrusion.view_type)
- {
- case Extrusion::FeatureType:
- {
- ExtrusionRole first_valid = erPerimeter;
- ExtrusionRole last_valid = erCustom;
-
- items.reserve(last_valid - first_valid + 1);
- for (unsigned int i = (unsigned int)first_valid; i <= (unsigned int)last_valid; ++i)
- {
- items.emplace_back(Slic3r::I18N::translate(extrusion.role_names[i]), extrusion.role_colors[i]);
- }
-
- break;
- }
- case Extrusion::Height:
- {
- Helper::FillListFromRange(items, ranges.height, 3, 1.0f);
- break;
- }
- case Extrusion::Width:
- {
- Helper::FillListFromRange(items, ranges.width, 3, 1.0f);
- break;
- }
- case Extrusion::Feedrate:
- {
- Helper::FillListFromRange(items, ranges.feedrate, 1, 1.0f);
- break;
- }
- case Extrusion::FanSpeed:
- {
- Helper::FillListFromRange(items, ranges.fan_speed, 0, 1.0f);
- break;
- }
- case Extrusion::VolumetricRate:
- {
- Helper::FillListFromRange(items, ranges.volumetric_rate, 3, 1.0f);
- break;
- }
- case Extrusion::Tool:
- {
- unsigned int tools_colors_count = (unsigned int)tool_colors.size() / 4;
- items.reserve(tools_colors_count);
- for (unsigned int i = 0; i < tools_colors_count; ++i)
- {
- Color color;
- ::memcpy((void*)color.rgba.data(), (const void*)(tool_colors.data() + i * 4), 4 * sizeof(float));
- items.emplace_back((boost::format(Slic3r::I18N::translate(L("Extruder %d"))) % (i + 1)).str(), color);
- }
-
- break;
- }
- case Extrusion::ColorPrint:
- {
- const int color_cnt = (int)tool_colors.size()/4;
- const auto color_print_cnt = (int)cp_items.size();
- if (color_print_cnt == 1) // means "Default print color"
- {
- Color color;
- ::memcpy((void*)color.rgba.data(), (const void*)(tool_colors.data()), 4 * sizeof(float));
-
- items.emplace_back(cp_items[0], color);
- break;
- }
-
- if (color_cnt != color_print_cnt)
- break;
-
- for (int i = 0 ; i < color_print_cnt; ++i)
- {
- Color color;
- ::memcpy((void*)color.rgba.data(), (const void*)(tool_colors.data() + i * 4), 4 * sizeof(float));
-
- items.emplace_back(cp_items[i], color);
- }
- break;
- }
- case Extrusion::Num_View_Types:
- break; // just to supress warning about non-handled value
- }
-
- return items;
-}
-
-// Return an estimate of the memory consumed by the time estimator.
-size_t GCodePreviewData::memory_used() const
-{
- return
- this->extrusion.memory_used() +
- this->travel.memory_used() +
- this->retraction.memory_used() +
- this->unretraction.memory_used() +
- sizeof(shell) + sizeof(ranges);
-}
-
-const std::vector<std::string>& GCodePreviewData::ColorPrintColors()
-{
- static std::vector<std::string> color_print = {"#C0392B", "#E67E22", "#F1C40F", "#27AE60", "#1ABC9C", "#2980B9", "#9B59B6"};
- return color_print;
-}
-
-Color operator + (const Color& c1, const Color& c2)
-{
- return Color(std::clamp(c1.rgba[0] + c2.rgba[0], 0.0f, 1.0f),
- std::clamp(c1.rgba[1] + c2.rgba[1], 0.0f, 1.0f),
- std::clamp(c1.rgba[2] + c2.rgba[2], 0.0f, 1.0f),
- std::clamp(c1.rgba[3] + c2.rgba[3], 0.0f, 1.0f));
-}
-
-Color operator * (float f, const Color& color)
-{
- return Color(std::clamp(f * color.rgba[0], 0.0f, 1.0f),
- std::clamp(f * color.rgba[1], 0.0f, 1.0f),
- std::clamp(f * color.rgba[2], 0.0f, 1.0f),
- std::clamp(f * color.rgba[3], 0.0f, 1.0f));
-}
-
-} // namespace Slic3r
diff --git a/src/libslic3r/GCode/PreviewData.hpp b/src/libslic3r/GCode/PreviewData.hpp
deleted file mode 100644
index 35bbfa50a..000000000
--- a/src/libslic3r/GCode/PreviewData.hpp
+++ /dev/null
@@ -1,397 +0,0 @@
-#ifndef slic3r_GCode_PreviewData_hpp_
-#define slic3r_GCode_PreviewData_hpp_
-
-#include "../libslic3r.h"
-#include "../ExtrusionEntity.hpp"
-#include "../Point.hpp"
-
-#include <tuple>
-#include <array>
-#include <vector>
-#include <bitset>
-#include <cstddef>
-#include <algorithm>
-#include <string>
-
-#include <float.h>
-
-namespace Slic3r {
-
-// Represents an RGBA color
-struct Color
-{
- std::array<float,4> rgba;
-
- Color(const float *argba)
- {
- memcpy(this->rgba.data(), argba, sizeof(float) * 4);
- }
- constexpr Color(float r = 1.f, float g = 1.f, float b = 1.f, float a = 1.f) : rgba{r,g,b,a}
- {
- // Intentionally empty
- }
-
- std::vector<unsigned char> as_bytes() const;
-};
-Color operator + (const Color& c1, const Color& c2);
-Color operator * (float f, const Color& color);
-
-// Default colors for Ranges
-constexpr std::array<Color, 10> range_rainbow_colors{
- Color{0.043f, 0.173f, 0.478f, 1.0f},
- Color{0.075f, 0.349f, 0.522f, 1.0f},
- Color{0.110f, 0.533f, 0.569f, 1.0f},
- Color{0.016f, 0.839f, 0.059f, 1.0f},
- Color{0.667f, 0.949f, 0.000f, 1.0f},
- Color{0.988f, 0.975f, 0.012f, 1.0f},
- Color{0.961f, 0.808f, 0.039f, 1.0f},
- Color{0.890f, 0.533f, 0.125f, 1.0f},
- Color{0.820f, 0.408f, 0.188f, 1.0f},
- Color{0.761f, 0.322f, 0.235f, 1.0f}};
-
-class GCodePreviewData
-{
-public:
-
- // Color mapping to convert a float into a smooth rainbow of 10 colors.
- class RangeBase
- {
- public:
-
- virtual void reset() = 0;
- virtual bool empty() const = 0;
- virtual float min() const = 0;
- virtual float max() const = 0;
-
- // Gets the step size using min(), max() and colors
- float step_size() const;
-
- // Gets the color at a value using colors, min(), and max()
- Color get_color_at(float value) const;
- };
-
- // Color mapping converting a float in a range between a min and a max into a smooth rainbow of 10 colors.
- class Range : public RangeBase
- {
- public:
- Range();
-
- // RangeBase Overrides
- void reset() override;
- bool empty() const override;
- float min() const override;
- float max() const override;
-
- // Range-specific methods
- void update_from(float value);
- void update_from(const RangeBase& other);
-
- private:
- float min_val;
- float max_val;
- };
-
- // Like Range, but stores multiple ranges internally that are used depending on mode.
- // Template param EnumRangeType must be an enum with values for each type of range that needs to be tracked in this MultiRange.
- // The last enum value should be num_values. The numerical values of all enum values should range from 0 to num_values.
- template <typename EnumRangeType>
- class MultiRange : public RangeBase
- {
- public:
-
- void reset() override
- {
- bounds = decltype(bounds){};
- }
-
- bool empty() const override
- {
- for (std::size_t i = 0; i < bounds.size(); ++i)
- {
- if (bounds[i].min != bounds[i].max)
- return false;
- }
- return true;
- }
-
- float min() const override
- {
- float min = FLT_MAX;
- for (std::size_t i = 0; i < bounds.size(); ++i)
- {
- // Only use bounds[i] if the current mode includes it
- if (mode.test(i))
- {
- min = std::min(min, bounds[i].min);
- }
- }
- return min;
- }
-
- float max() const override
- {
- float max = -FLT_MAX;
- for (std::size_t i = 0; i < bounds.size(); ++i)
- {
- // Only use bounds[i] if the current mode includes it
- if (mode.test(i))
- {
- max = std::max(max, bounds[i].max);
- }
- }
- return max;
- }
-
- void update_from(const float value, EnumRangeType range_type_value)
- {
- bounds[static_cast<std::size_t>(range_type_value)].update_from(value);
- }
-
- void update_from(const MultiRange& other)
- {
- for (std::size_t i = 0; i < bounds.size(); ++i)
- {
- bounds[i].update_from(other.bounds[i]);
- }
- }
-
- void set_mode(const EnumRangeType range_type_value, const bool enable)
- {
- mode.set(static_cast<std::size_t>(range_type_value), enable);
- }
-
- private:
-
- // Interval bounds
- struct Bounds
- {
- float min{FLT_MAX};
- float max{-FLT_MAX};
- void update_from(const float value)
- {
- min = std::min(min, value);
- max = std::max(max, value);
- }
- void update_from(const Bounds other_bounds)
- {
- min = std::min(min, other_bounds.min);
- max = std::max(max, other_bounds.max);
- }
- };
-
- std::array<Bounds, static_cast<std::size_t>(EnumRangeType::num_values)> bounds;
- std::bitset<static_cast<std::size_t>(EnumRangeType::num_values)> mode;
- };
-
- // Enum distinguishing different kinds of feedrate data
- enum class FeedrateKind
- {
- EXTRUSION = 0, // values must go from 0 up to num_values
- TRAVEL,
- num_values //must be last in the list of values
- };
-
- struct Ranges
- {
- // Color mapping by layer height.
- Range height;
- // Color mapping by extrusion width.
- Range width;
- // Color mapping by feedrate.
- MultiRange<FeedrateKind> feedrate;
- // Color mapping by fan speed.
- Range fan_speed;
- // Color mapping by volumetric extrusion rate.
- Range volumetric_rate;
- };
-
- struct LegendItem
- {
- std::string text;
- Color color;
-
- LegendItem(const std::string& text, const Color& color);
- };
-
- typedef std::vector<LegendItem> LegendItemsList;
-
- struct Extrusion
- {
- enum EViewType : unsigned char
- {
- FeatureType,
- Height,
- Width,
- Feedrate,
- FanSpeed,
- VolumetricRate,
- Tool,
- ColorPrint,
- Num_View_Types
- };
-
- static const Color Default_Extrusion_Role_Colors[erCount];
- static const std::string Default_Extrusion_Role_Names[erCount];
- static const EViewType Default_View_Type;
-
- class Path
- {
- public:
- Polyline polyline;
- ExtrusionRole extrusion_role;
- // Volumetric velocity. mm^3 of plastic per mm of linear head motion. Used by the G-code generator.
- float mm3_per_mm;
- // Width of the extrusion, used for visualization purposes.
- float width;
- // Height of the extrusion, used for visualization purposes.
- float height;
- // Feedrate of the extrusion, used for visualization purposes.
- float feedrate;
- // Id of the extruder, used for visualization purposes.
- uint32_t extruder_id;
- // Id of the color, used for visualization purposes in the color printing case.
- uint32_t cp_color_id;
- // Fan speed for the extrusion, used for visualization purposes.
- float fan_speed;
- };
- using Paths = std::vector<Path>;
-
- struct Layer
- {
- float z;
- Paths paths;
-
- Layer(float z, const Paths& paths);
- };
-
- typedef std::vector<Layer> LayersList;
-
- EViewType view_type;
- Color role_colors[erCount];
- std::string role_names[erCount];
- LayersList layers;
- unsigned int role_flags;
-
- void set_default();
- bool is_role_flag_set(ExtrusionRole role) const;
-
- // Return an estimate of the memory consumed by the time estimator.
- size_t memory_used() const;
-
- static bool is_role_flag_set(unsigned int flags, ExtrusionRole role);
- };
-
- struct Travel
- {
- enum EType : unsigned char
- {
- Move,
- Extrude,
- Retract,
- Num_Types
- };
-
- static const float Default_Width;
- static const float Default_Height;
- static const Color Default_Type_Colors[Num_Types];
-
- struct Polyline
- {
- enum EDirection
- {
- Vertical,
- Generic,
- Num_Directions
- };
-
- EType type;
- EDirection direction;
- float feedrate;
- unsigned int extruder_id;
- Polyline3 polyline;
-
- Polyline(EType type, EDirection direction, float feedrate, unsigned int extruder_id, const Polyline3& polyline);
- };
-
- typedef std::vector<Polyline> PolylinesList;
-
- PolylinesList polylines;
- float width;
- float height;
- Color type_colors[Num_Types];
- bool is_visible;
- size_t color_print_idx;
-
- void set_default();
-
- // Return an estimate of the memory consumed by the time estimator.
- size_t memory_used() const;
- };
-
- struct Retraction
- {
- static const Color Default_Color;
-
- struct Position
- {
- Vec3crd position;
- float width;
- float height;
-
- Position(const Vec3crd& position, float width, float height);
- };
-
- typedef std::vector<Position> PositionsList;
-
- PositionsList positions;
- Color color;
- bool is_visible;
-
- void set_default();
-
- // Return an estimate of the memory consumed by the time estimator.
- size_t memory_used() const;
- };
-
- struct Shell
- {
- bool is_visible;
-
- void set_default();
- };
-
- Extrusion extrusion;
- Travel travel;
- Retraction retraction;
- Retraction unretraction;
- Shell shell;
- Ranges ranges;
-
- GCodePreviewData();
-
- void set_default();
- void reset();
- bool empty() const;
-
- Color get_extrusion_role_color(ExtrusionRole role) const;
- Color get_height_color(float height) const;
- Color get_width_color(float width) const;
- Color get_feedrate_color(float feedrate) const;
- Color get_fan_speed_color(float fan_speed) const;
- Color get_volumetric_rate_color(float rate) const;
-
- void set_extrusion_role_color(const std::string& role_name, float red, float green, float blue, float alpha);
- void set_extrusion_paths_colors(const std::vector<std::string>& colors);
-
- std::string get_legend_title() const;
- LegendItemsList get_legend_items(const std::vector<float>& tool_colors, const std::vector<std::string>& cp_items) const;
-
- // Return an estimate of the memory consumed by the time estimator.
- size_t memory_used() const;
-
- static const std::vector<std::string>& ColorPrintColors();
-};
-
-} // namespace Slic3r
-
-#endif /* slic3r_GCode_PreviewData_hpp_ */
diff --git a/src/libslic3r/GCode/PrintExtents.cpp b/src/libslic3r/GCode/PrintExtents.cpp
index 7a8271e30..a86411519 100644
--- a/src/libslic3r/GCode/PrintExtents.cpp
+++ b/src/libslic3r/GCode/PrintExtents.cpp
@@ -6,6 +6,7 @@
#include "../BoundingBox.hpp"
#include "../ExtrusionEntity.hpp"
#include "../ExtrusionEntityCollection.hpp"
+#include "../Layer.hpp"
#include "../Print.hpp"
#include "PrintExtents.hpp"
@@ -93,7 +94,7 @@ static BoundingBoxf extrusionentity_extents(const ExtrusionEntity *extrusion_ent
auto *extrusion_entity_collection = dynamic_cast<const ExtrusionEntityCollection*>(extrusion_entity);
if (extrusion_entity_collection != nullptr)
return extrusionentity_extents(*extrusion_entity_collection);
- throw std::runtime_error("Unexpected extrusion_entity type in extrusionentity_extents()");
+ throw Slic3r::RuntimeError("Unexpected extrusion_entity type in extrusionentity_extents()");
return BoundingBoxf();
}
diff --git a/src/libslic3r/GCode/SeamPlacer.cpp b/src/libslic3r/GCode/SeamPlacer.cpp
new file mode 100644
index 000000000..1acc160f0
--- /dev/null
+++ b/src/libslic3r/GCode/SeamPlacer.cpp
@@ -0,0 +1,848 @@
+#include "SeamPlacer.hpp"
+
+#include "libslic3r/ExtrusionEntity.hpp"
+#include "libslic3r/Print.hpp"
+#include "libslic3r/BoundingBox.hpp"
+#include "libslic3r/EdgeGrid.hpp"
+#include "libslic3r/ClipperUtils.hpp"
+#include "libslic3r/SVG.hpp"
+#include "libslic3r/Layer.hpp"
+
+namespace Slic3r {
+
+// This penalty is added to all points inside custom blockers (subtracted from pts inside enforcers).
+static constexpr float ENFORCER_BLOCKER_PENALTY = 100;
+
+// In case there are custom enforcers/blockers, the loop polygon shall always have
+// sides smaller than this (so it isn't limited to original resolution).
+static constexpr float MINIMAL_POLYGON_SIDE = scale_(0.2f);
+
+// When spAligned is active and there is a support enforcer,
+// add this penalty to its center.
+static constexpr float ENFORCER_CENTER_PENALTY = -10.f;
+
+
+
+
+static float extrudate_overlap_penalty(float nozzle_r, float weight_zero, float overlap_distance)
+{
+ // The extrudate is not fully supported by the lower layer. Fit a polynomial penalty curve.
+ // Solved by sympy package:
+/*
+from sympy import *
+(x,a,b,c,d,r,z)=symbols('x a b c d r z')
+p = a + b*x + c*x*x + d*x*x*x
+p2 = p.subs(solve([p.subs(x, -r), p.diff(x).subs(x, -r), p.diff(x,x).subs(x, -r), p.subs(x, 0)-z], [a, b, c, d]))
+from sympy.plotting import plot
+plot(p2.subs(r,0.2).subs(z,1.), (x, -1, 3), adaptive=False, nb_of_points=400)
+*/
+ if (overlap_distance < - nozzle_r) {
+ // The extrudate is fully supported by the lower layer. This is the ideal case, therefore zero penalty.
+ return 0.f;
+ } else {
+ float x = overlap_distance / nozzle_r;
+ float x2 = x * x;
+ float x3 = x2 * x;
+ return weight_zero * (1.f + 3.f * x + 3.f * x2 + x3);
+ }
+}
+
+
+
+// Return a value in <0, 1> of a cubic B-spline kernel centered around zero.
+// The B-spline is re-scaled so it has value 1 at zero.
+static inline float bspline_kernel(float x)
+{
+ x = std::abs(x);
+ if (x < 1.f) {
+ return 1.f - (3.f / 2.f) * x * x + (3.f / 4.f) * x * x * x;
+ }
+ else if (x < 2.f) {
+ x -= 1.f;
+ float x2 = x * x;
+ float x3 = x2 * x;
+ return (1.f / 4.f) - (3.f / 4.f) * x + (3.f / 4.f) * x2 - (1.f / 4.f) * x3;
+ }
+ else
+ return 0;
+}
+
+
+
+static Points::const_iterator project_point_to_polygon_and_insert(Polygon &polygon, const Point &pt, double eps)
+{
+ assert(polygon.points.size() >= 2);
+ if (polygon.points.size() <= 1)
+ if (polygon.points.size() == 1)
+ return polygon.points.begin();
+
+ Point pt_min;
+ double d_min = std::numeric_limits<double>::max();
+ size_t i_min = size_t(-1);
+
+ for (size_t i = 0; i < polygon.points.size(); ++ i) {
+ size_t j = i + 1;
+ if (j == polygon.points.size())
+ j = 0;
+ const Point &p1 = polygon.points[i];
+ const Point &p2 = polygon.points[j];
+ const Slic3r::Point v_seg = p2 - p1;
+ const Slic3r::Point v_pt = pt - p1;
+ const int64_t l2_seg = int64_t(v_seg(0)) * int64_t(v_seg(0)) + int64_t(v_seg(1)) * int64_t(v_seg(1));
+ int64_t t_pt = int64_t(v_seg(0)) * int64_t(v_pt(0)) + int64_t(v_seg(1)) * int64_t(v_pt(1));
+ if (t_pt < 0) {
+ // Closest to p1.
+ double dabs = sqrt(int64_t(v_pt(0)) * int64_t(v_pt(0)) + int64_t(v_pt(1)) * int64_t(v_pt(1)));
+ if (dabs < d_min) {
+ d_min = dabs;
+ i_min = i;
+ pt_min = p1;
+ }
+ }
+ else if (t_pt > l2_seg) {
+ // Closest to p2. Then p2 is the starting point of another segment, which shall be discovered in the next step.
+ continue;
+ } else {
+ // Closest to the segment.
+ assert(t_pt >= 0 && t_pt <= l2_seg);
+ int64_t d_seg = int64_t(v_seg(1)) * int64_t(v_pt(0)) - int64_t(v_seg(0)) * int64_t(v_pt(1));
+ double d = double(d_seg) / sqrt(double(l2_seg));
+ double dabs = std::abs(d);
+ if (dabs < d_min) {
+ d_min = dabs;
+ i_min = i;
+ // Evaluate the foot point.
+ pt_min = p1;
+ double linv = double(d_seg) / double(l2_seg);
+ pt_min(0) = pt(0) - coord_t(floor(double(v_seg(1)) * linv + 0.5));
+ pt_min(1) = pt(1) + coord_t(floor(double(v_seg(0)) * linv + 0.5));
+ assert(Line(p1, p2).distance_to(pt_min) < scale_(1e-5));
+ }
+ }
+ }
+
+ assert(i_min != size_t(-1));
+ if ((pt_min - polygon.points[i_min]).cast<double>().norm() > eps) {
+ // Insert a new point on the segment i_min, i_min+1.
+ return polygon.points.insert(polygon.points.begin() + (i_min + 1), pt_min);
+ }
+ return polygon.points.begin() + i_min;
+}
+
+
+
+static std::vector<float> polygon_angles_at_vertices(const Polygon &polygon, const std::vector<float> &lengths, float min_arm_length)
+{
+ assert(polygon.points.size() + 1 == lengths.size());
+ if (min_arm_length > 0.25f * lengths.back())
+ min_arm_length = 0.25f * lengths.back();
+
+ // Find the initial prev / next point span.
+ size_t idx_prev = polygon.points.size();
+ size_t idx_curr = 0;
+ size_t idx_next = 1;
+ while (idx_prev > idx_curr && lengths.back() - lengths[idx_prev] < min_arm_length)
+ -- idx_prev;
+ while (idx_next < idx_prev && lengths[idx_next] < min_arm_length)
+ ++ idx_next;
+
+ std::vector<float> angles(polygon.points.size(), 0.f);
+ for (; idx_curr < polygon.points.size(); ++ idx_curr) {
+ // Move idx_prev up until the distance between idx_prev and idx_curr is lower than min_arm_length.
+ if (idx_prev >= idx_curr) {
+ while (idx_prev < polygon.points.size() && lengths.back() - lengths[idx_prev] + lengths[idx_curr] > min_arm_length)
+ ++ idx_prev;
+ if (idx_prev == polygon.points.size())
+ idx_prev = 0;
+ }
+ while (idx_prev < idx_curr && lengths[idx_curr] - lengths[idx_prev] > min_arm_length)
+ ++ idx_prev;
+ // Move idx_prev one step back.
+ if (idx_prev == 0)
+ idx_prev = polygon.points.size() - 1;
+ else
+ -- idx_prev;
+ // Move idx_next up until the distance between idx_curr and idx_next is greater than min_arm_length.
+ if (idx_curr <= idx_next) {
+ while (idx_next < polygon.points.size() && lengths[idx_next] - lengths[idx_curr] < min_arm_length)
+ ++ idx_next;
+ if (idx_next == polygon.points.size())
+ idx_next = 0;
+ }
+ while (idx_next < idx_curr && lengths.back() - lengths[idx_curr] + lengths[idx_next] < min_arm_length)
+ ++ idx_next;
+ // Calculate angle between idx_prev, idx_curr, idx_next.
+ const Point &p0 = polygon.points[idx_prev];
+ const Point &p1 = polygon.points[idx_curr];
+ const Point &p2 = polygon.points[idx_next];
+ const Point v1 = p1 - p0;
+ const Point v2 = p2 - p1;
+ int64_t dot = int64_t(v1(0))*int64_t(v2(0)) + int64_t(v1(1))*int64_t(v2(1));
+ int64_t cross = int64_t(v1(0))*int64_t(v2(1)) - int64_t(v1(1))*int64_t(v2(0));
+ float angle = float(atan2(double(cross), double(dot)));
+ angles[idx_curr] = angle;
+ }
+
+ return angles;
+}
+
+
+
+void SeamPlacer::init(const Print& print)
+{
+ m_enforcers.clear();
+ m_blockers.clear();
+ m_seam_history.clear();
+ m_po_list.clear();
+
+ const std::vector<double>& nozzle_dmrs = print.config().nozzle_diameter.values;
+ float max_nozzle_dmr = *std::max_element(nozzle_dmrs.begin(), nozzle_dmrs.end());
+
+
+ std::vector<ExPolygons> temp_enf;
+ std::vector<ExPolygons> temp_blk;
+
+ for (const PrintObject* po : print.objects()) {
+ temp_enf.clear();
+ temp_blk.clear();
+ po->project_and_append_custom_facets(true, EnforcerBlockerType::ENFORCER, temp_enf);
+ po->project_and_append_custom_facets(true, EnforcerBlockerType::BLOCKER, temp_blk);
+
+ // Offset the triangles out slightly.
+ for (auto* custom_per_object : {&temp_enf, &temp_blk}) {
+ float offset = max_nozzle_dmr + po->config().elefant_foot_compensation;
+ for (ExPolygons& explgs : *custom_per_object) {
+ explgs = Slic3r::offset_ex(explgs, scale_(offset));
+ offset = max_nozzle_dmr;
+ }
+ }
+
+// FIXME: Offsetting should be done somehow cheaper, but following does not work
+// for (auto* custom_per_object : {&temp_enf, &temp_blk}) {
+// for (ExPolygons& plgs : *custom_per_object) {
+// for (ExPolygon& plg : plgs) {
+// auto out = Slic3r::offset_ex(plg, scale_(max_nozzle_dmr));
+// plg = out.empty() ? ExPolygon() : out.front();
+// assert(out.empty() || out.size() == 1);
+// }
+// }
+// }
+
+
+
+ // Remember this PrintObject and initialize a store of enforcers and blockers for it.
+ m_po_list.push_back(po);
+ size_t po_idx = m_po_list.size() - 1;
+ m_enforcers.emplace_back(std::vector<CustomTrianglesPerLayer>(temp_enf.size()));
+ m_blockers.emplace_back(std::vector<CustomTrianglesPerLayer>(temp_blk.size()));
+
+ // A helper class to store data to build the AABB tree from.
+ class CustomTriangleRef {
+ public:
+ CustomTriangleRef(size_t idx,
+ Point&& centroid,
+ BoundingBox&& bb)
+ : m_idx{idx}, m_centroid{centroid},
+ m_bbox{AlignedBoxType(bb.min, bb.max)}
+ {}
+ size_t idx() const { return m_idx; }
+ const Point& centroid() const { return m_centroid; }
+ const TreeType::BoundingBox& bbox() const { return m_bbox; }
+
+ private:
+ size_t m_idx;
+ Point m_centroid;
+ AlignedBoxType m_bbox;
+ };
+
+ // A lambda to extract the ExPolygons and save them into the member AABB tree.
+ // Will be called for enforcers and blockers separately.
+ auto add_custom = [](std::vector<ExPolygons>& src, std::vector<CustomTrianglesPerLayer>& dest) {
+ // Go layer by layer, and append all the ExPolygons into the AABB tree.
+ size_t layer_idx = 0;
+ for (ExPolygons& expolys_on_layer : src) {
+ CustomTrianglesPerLayer& layer_data = dest[layer_idx];
+ std::vector<CustomTriangleRef> triangles_data;
+ layer_data.polys.reserve(expolys_on_layer.size());
+ triangles_data.reserve(expolys_on_layer.size());
+
+ for (ExPolygon& expoly : expolys_on_layer) {
+ if (expoly.empty())
+ continue;
+ layer_data.polys.emplace_back(std::move(expoly));
+ triangles_data.emplace_back(layer_data.polys.size() - 1,
+ layer_data.polys.back().centroid(),
+ layer_data.polys.back().bounding_box());
+ }
+ // All polygons are saved, build the AABB tree for them.
+ layer_data.tree.build(std::move(triangles_data));
+ ++layer_idx;
+ }
+ };
+
+ add_custom(temp_enf, m_enforcers.at(po_idx));
+ add_custom(temp_blk, m_blockers.at(po_idx));
+ }
+}
+
+
+
+Point SeamPlacer::get_seam(const Layer& layer, const SeamPosition seam_position,
+ const ExtrusionLoop& loop, Point last_pos, coordf_t nozzle_dmr,
+ const PrintObject* po, bool was_clockwise, const EdgeGrid::Grid* lower_layer_edge_grid)
+{
+ Polygon polygon = loop.polygon();
+ BoundingBox polygon_bb = polygon.bounding_box();
+ const coord_t nozzle_r = coord_t(scale_(0.5 * nozzle_dmr) + 0.5);
+
+ size_t po_idx = std::find(m_po_list.begin(), m_po_list.end(), po) - m_po_list.begin();
+
+ // Find current layer in respective PrintObject. Cache the result so the
+ // lookup is only done once per layer, not for each loop.
+ const Layer* layer_po = nullptr;
+ if (po == m_last_po && layer.print_z == m_last_print_z)
+ layer_po = m_last_layer_po;
+ else {
+ layer_po = po->get_layer_at_printz(layer.print_z);
+ m_last_po = po;
+ m_last_print_z = layer.print_z;
+ m_last_layer_po = layer_po;
+ }
+ if (! layer_po)
+ return last_pos;
+
+ // Index of this layer in the respective PrintObject.
+ size_t layer_idx = layer_po->id() - po->layers().front()->id(); // raft layers
+
+ assert(layer_idx < po->layer_count());
+
+ if (this->is_custom_seam_on_layer(layer_idx, po_idx)) {
+ // Seam enf/blockers can begin and end in between the original vertices.
+ // Let add extra points in between and update the leghths.
+ polygon.densify(MINIMAL_POLYGON_SIDE);
+ }
+
+ if (seam_position != spRandom) {
+ // Retrieve the last start position for this object.
+ float last_pos_weight = 1.f;
+
+ if (seam_position == spAligned) {
+ // Seam is aligned to the seam at the preceding layer.
+ if (po != nullptr) {
+ std::optional<Point> pos = m_seam_history.get_last_seam(m_po_list[po_idx], layer_idx, polygon_bb);
+ if (pos.has_value()) {
+ last_pos = *pos;
+ last_pos_weight = is_custom_enforcer_on_layer(layer_idx, po_idx) ? 0.f : 1.f;
+ }
+ }
+ }
+ else if (seam_position == spRear) {
+ // Object is centered around (0,0) in its current coordinate system.
+ last_pos.x() = 0;
+ last_pos.y() += coord_t(3. * po->bounding_box().radius());
+ last_pos_weight = 5.f;
+ } if (seam_position == spNearest) {
+ // last_pos already contains current nozzle position
+ }
+
+ // Insert a projection of last_pos into the polygon.
+ size_t last_pos_proj_idx;
+ {
+ auto it = project_point_to_polygon_and_insert(polygon, last_pos, 0.1 * nozzle_r);
+ last_pos_proj_idx = it - polygon.points.begin();
+ }
+
+ // Parametrize the polygon by its length.
+ std::vector<float> lengths = polygon.parameter_by_length();
+
+ // For each polygon point, store a penalty.
+ // First calculate the angles, store them as penalties. The angles are caluculated over a minimum arm length of nozzle_r.
+ std::vector<float> penalties = polygon_angles_at_vertices(polygon, lengths, float(nozzle_r));
+ // No penalty for reflex points, slight penalty for convex points, high penalty for flat surfaces.
+ const float penaltyConvexVertex = 1.f;
+ const float penaltyFlatSurface = 5.f;
+ const float penaltyOverhangHalf = 10.f;
+ // Penalty for visible seams.
+ for (size_t i = 0; i < polygon.points.size(); ++ i) {
+ float ccwAngle = penalties[i];
+ if (was_clockwise)
+ ccwAngle = - ccwAngle;
+ float penalty = 0;
+ if (ccwAngle <- float(0.6 * PI))
+ // Sharp reflex vertex. We love that, it hides the seam perfectly.
+ penalty = 0.f;
+ else if (ccwAngle > float(0.6 * PI))
+ // Seams on sharp convex vertices are more visible than on reflex vertices.
+ penalty = penaltyConvexVertex;
+ else if (ccwAngle < 0.f) {
+ // Interpolate penalty between maximum and zero.
+ penalty = penaltyFlatSurface * bspline_kernel(ccwAngle * float(PI * 2. / 3.));
+ } else {
+ assert(ccwAngle >= 0.f);
+ // Interpolate penalty between maximum and the penalty for a convex vertex.
+ penalty = penaltyConvexVertex + (penaltyFlatSurface - penaltyConvexVertex) * bspline_kernel(ccwAngle * float(PI * 2. / 3.));
+ }
+ // Give a negative penalty for points close to the last point or the prefered seam location.
+ float dist_to_last_pos_proj = (i < last_pos_proj_idx) ?
+ std::min(lengths[last_pos_proj_idx] - lengths[i], lengths.back() - lengths[last_pos_proj_idx] + lengths[i]) :
+ std::min(lengths[i] - lengths[last_pos_proj_idx], lengths.back() - lengths[i] + lengths[last_pos_proj_idx]);
+ float dist_max = 0.1f * lengths.back(); // 5.f * nozzle_dmr
+ penalty -= last_pos_weight * bspline_kernel(dist_to_last_pos_proj / dist_max);
+ penalties[i] = std::max(0.f, penalty);
+ }
+
+ // Penalty for overhangs.
+ if (lower_layer_edge_grid) {
+ // Use the edge grid distance field structure over the lower layer to calculate overhangs.
+ coord_t nozzle_r = coord_t(std::floor(scale_(0.5 * nozzle_dmr) + 0.5));
+ coord_t search_r = coord_t(std::floor(scale_(0.8 * nozzle_dmr) + 0.5));
+ for (size_t i = 0; i < polygon.points.size(); ++ i) {
+ const Point &p = polygon.points[i];
+ coordf_t dist;
+ // Signed distance is positive outside the object, negative inside the object.
+ // The point is considered at an overhang, if it is more than nozzle radius
+ // outside of the lower layer contour.
+ [[maybe_unused]] bool found = lower_layer_edge_grid->signed_distance(p, search_r, dist);
+ // If the approximate Signed Distance Field was initialized over lower_layer_edge_grid,
+ // then the signed distnace shall always be known.
+ assert(found);
+ penalties[i] += extrudate_overlap_penalty(float(nozzle_r), penaltyOverhangHalf, float(dist));
+ }
+ }
+
+ // Custom seam. Huge (negative) constant penalty is applied inside
+ // blockers (enforcers) to rule out points that should not win.
+ this->apply_custom_seam(polygon, po_idx, penalties, lengths, layer_idx, seam_position);
+
+ // Find a point with a minimum penalty.
+ size_t idx_min = std::min_element(penalties.begin(), penalties.end()) - penalties.begin();
+
+ if (seam_position != spAligned || ! is_custom_enforcer_on_layer(layer_idx, po_idx)) {
+ // Very likely the weight of idx_min is very close to the weight of last_pos_proj_idx.
+ // In that case use last_pos_proj_idx instead.
+ float penalty_aligned = penalties[last_pos_proj_idx];
+ float penalty_min = penalties[idx_min];
+ float penalty_diff_abs = std::abs(penalty_min - penalty_aligned);
+ float penalty_max = std::max(std::abs(penalty_min), std::abs(penalty_aligned));
+ float penalty_diff_rel = (penalty_max == 0.f) ? 0.f : penalty_diff_abs / penalty_max;
+ // printf("Align seams, penalty aligned: %f, min: %f, diff abs: %f, diff rel: %f\n", penalty_aligned, penalty_min, penalty_diff_abs, penalty_diff_rel);
+ if (std::abs(penalty_diff_rel) < 0.05) {
+ // Penalty of the aligned point is very close to the minimum penalty.
+ // Align the seams as accurately as possible.
+ idx_min = last_pos_proj_idx;
+ }
+ }
+
+ if (seam_position == spAligned && loop.role() == erExternalPerimeter)
+ m_seam_history.add_seam(po, polygon.points[idx_min], polygon_bb);
+
+
+ // Export the contour into a SVG file.
+ #if 0
+ {
+ static int iRun = 0;
+ SVG svg(debug_out_path("GCode_extrude_loop-%d.svg", iRun ++));
+ if (m_layer->lower_layer != NULL)
+ svg.draw(m_layer->lower_layer->slices);
+ for (size_t i = 0; i < loop.paths.size(); ++ i)
+ svg.draw(loop.paths[i].as_polyline(), "red");
+ Polylines polylines;
+ for (size_t i = 0; i < loop.paths.size(); ++ i)
+ polylines.push_back(loop.paths[i].as_polyline());
+ Slic3r::Polygons polygons;
+ coordf_t nozzle_dmr = EXTRUDER_CONFIG(nozzle_diameter);
+ coord_t delta = scale_(0.5*nozzle_dmr);
+ Slic3r::offset(polylines, &polygons, delta);
+// for (size_t i = 0; i < polygons.size(); ++ i) svg.draw((Polyline)polygons[i], "blue");
+ svg.draw(last_pos, "green", 3);
+ svg.draw(polygon.points[idx_min], "yellow", 3);
+ svg.Close();
+ }
+ #endif
+ return polygon.points[idx_min];
+
+ } else { // spRandom
+ if (po->print()->default_region_config().external_perimeters_first) {
+ if (loop.role() == erExternalPerimeter)
+ last_pos = this->get_random_seam(layer_idx, polygon, po_idx);
+ else {
+ // Internal perimeters will just use last_pos.
+ }
+ } else {
+ if (loop.loop_role() == elrContourInternalPerimeter && loop.role() != erExternalPerimeter) {
+ // This loop does not contain any other loop. Set a random position.
+ // The other loops will get a seam close to the random point chosen
+ // on the innermost contour.
+ last_pos = this->get_random_seam(layer_idx, polygon, po_idx);
+ m_last_loop_was_external = false;
+ }
+ if (loop.role() == erExternalPerimeter) {
+ if (m_last_loop_was_external) {
+ // There was no internal perimeter before this one.
+ last_pos = this->get_random_seam(layer_idx, polygon, po_idx);
+ } else {
+ if (is_custom_seam_on_layer(layer_idx, po_idx)) {
+ // There is a possibility that the loop will be influenced by custom
+ // seam enforcer/blocker. In this case do not inherit the seam
+ // from internal loops (which may conflict with the custom selection
+ // and generate another random one.
+ bool saw_custom = false;
+ Point candidate = this->get_random_seam(layer_idx, polygon, po_idx, &saw_custom);
+ if (saw_custom)
+ last_pos = candidate;
+ }
+ }
+ m_last_loop_was_external = true;
+ }
+ }
+ return last_pos;
+ }
+}
+
+
+Point SeamPlacer::get_random_seam(size_t layer_idx, const Polygon& polygon, size_t po_idx,
+ bool* saw_custom) const
+{
+ // Parametrize the polygon by its length.
+ const std::vector<float> lengths = polygon.parameter_by_length();
+
+ // Which of the points are inside enforcers/blockers?
+ std::vector<size_t> enforcers_idxs;
+ std::vector<size_t> blockers_idxs;
+ this->get_enforcers_and_blockers(layer_idx, polygon, po_idx, enforcers_idxs, blockers_idxs);
+
+ bool has_enforcers = ! enforcers_idxs.empty();
+ bool has_blockers = ! blockers_idxs.empty();
+ if (saw_custom)
+ *saw_custom = has_enforcers || has_blockers;
+
+ assert(std::is_sorted(enforcers_idxs.begin(), enforcers_idxs.end()));
+ assert(std::is_sorted(blockers_idxs.begin(), blockers_idxs.end()));
+ std::vector<float> edges;
+
+ // Lambda to calculate lengths of all edges of interest. Last parameter
+ // decides whether to measure edges inside or outside idxs.
+ // Negative number = not an edge of interest.
+ auto get_valid_length = [&lengths](const std::vector<size_t>& idxs,
+ std::vector<float>& edges,
+ bool measure_inside_edges) -> float
+ {
+ // First mark edges we are interested in by assigning a positive number.
+ edges.assign(lengths.size()-1, measure_inside_edges ? -1.f : 1.f);
+ for (size_t i=0; i<idxs.size(); ++i) {
+ size_t this_pt_idx = idxs[i];
+ // Two concurrent indices in the list -> the edge between them is the enforcer/blocker.
+ bool inside_edge = ((i != idxs.size()-1 && idxs[i+1] == this_pt_idx + 1)
+ || (i == idxs.size()-1 && idxs.back() == lengths.size()-2 && idxs[0] == 0));
+ if (inside_edge)
+ edges[this_pt_idx] = measure_inside_edges ? 1.f : -1.f;
+ }
+ // Now measure them.
+ float running_total = 0.f;
+ for (size_t i=0; i<edges.size(); ++i) {
+ if (edges[i] > 0.f) {
+ edges[i] = lengths[i+1] - lengths[i];
+ running_total += edges[i];
+ }
+ }
+ return running_total;
+ };
+
+ // Find all seam candidate edges and their lengths.
+ float valid_length = 0.f;
+ if (has_enforcers)
+ valid_length = get_valid_length(enforcers_idxs, edges, true);
+
+ if (! has_enforcers || valid_length == 0.f) {
+ // Second condition covers case with isolated enf points. Given how the painted
+ // triangles are projected, this should not happen. Stay on the safe side though.
+ if (has_blockers)
+ valid_length = get_valid_length(blockers_idxs, edges, false);
+ if (valid_length == 0.f) // No blockers or everything blocked - use the whole polygon.
+ valid_length = lengths.back();
+ }
+ assert(valid_length != 0.f);
+ // Now generate a random length and find the respective edge.
+ float rand_len = valid_length * (rand()/float(RAND_MAX));
+ size_t pt_idx = 0; // Index of the edge where to put the seam.
+ if (valid_length == lengths.back()) {
+ // Whole polygon is used for placing the seam.
+ auto it = std::lower_bound(lengths.begin(), lengths.end(), rand_len);
+ pt_idx = it == lengths.begin() ? 0 : (it-lengths.begin()-1); // this takes care of a corner case where rand() returns 0
+ } else {
+ float running = 0.f;
+ for (size_t i=0; i<edges.size(); ++i) {
+ running += edges[i] > 0.f ? edges[i] : 0.f;
+ if (running >= rand_len) {
+ pt_idx = i;
+ break;
+ }
+ }
+ }
+
+ if (! has_enforcers && ! has_blockers) {
+ // The polygon may be too coarse, calculate the point exactly.
+ assert(valid_length == lengths.back());
+ bool last_seg = pt_idx == polygon.points.size()-1;
+ size_t next_idx = last_seg ? 0 : pt_idx+1;
+ const Point& prev = polygon.points[pt_idx];
+ const Point& next = polygon.points[next_idx];
+ assert(next_idx == 0 || pt_idx+1 == next_idx);
+ coordf_t diff_x = next.x() - prev.x();
+ coordf_t diff_y = next.y() - prev.y();
+ coordf_t dist = lengths[last_seg ? pt_idx+1 : next_idx] - lengths[pt_idx];
+ return Point(prev.x() + (rand_len - lengths[pt_idx]) * (diff_x/dist),
+ prev.y() + (rand_len - lengths[pt_idx]) * (diff_y/dist));
+
+ } else {
+ // The polygon should be dense enough.
+ return polygon.points[pt_idx];
+ }
+}
+
+
+
+
+
+
+
+
+void SeamPlacer::get_enforcers_and_blockers(size_t layer_id,
+ const Polygon& polygon,
+ size_t po_idx,
+ std::vector<size_t>& enforcers_idxs,
+ std::vector<size_t>& blockers_idxs) const
+{
+ enforcers_idxs.clear();
+ blockers_idxs.clear();
+
+ auto is_inside = [](const Point& pt,
+ const CustomTrianglesPerLayer& custom_data) -> bool {
+ assert(! custom_data.polys.empty());
+ // Now ask the AABB tree which polygons we should check and check them.
+ std::vector<size_t> candidates;
+ AABBTreeIndirect::get_candidate_idxs(custom_data.tree, pt, candidates);
+ if (! candidates.empty())
+ for (size_t idx : candidates)
+ if (custom_data.polys[idx].contains(pt))
+ return true;
+ return false;
+ };
+
+ if (! m_enforcers[po_idx].empty()) {
+ const CustomTrianglesPerLayer& enforcers = m_enforcers[po_idx][layer_id];
+ if (! enforcers.polys.empty()) {
+ for (size_t i=0; i<polygon.points.size(); ++i) {
+ if (is_inside(polygon.points[i], enforcers))
+ enforcers_idxs.emplace_back(i);
+ }
+ }
+ }
+
+ if (! m_blockers[po_idx].empty()) {
+ const CustomTrianglesPerLayer& blockers = m_blockers[po_idx][layer_id];
+ if (! blockers.polys.empty()) {
+ for (size_t i=0; i<polygon.points.size(); ++i) {
+ if (is_inside(polygon.points[i], blockers))
+ blockers_idxs.emplace_back(i);
+ }
+ }
+ }
+
+}
+
+
+// Go through the polygon, identify points inside support enforcers and return
+// indices of points in the middle of each enforcer (measured along the contour).
+static std::vector<size_t> find_enforcer_centers(const Polygon& polygon,
+ const std::vector<float>& lengths,
+ const std::vector<size_t>& enforcers_idxs)
+{
+ std::vector<size_t> out;
+ assert(polygon.points.size()+1 == lengths.size());
+ assert(std::is_sorted(enforcers_idxs.begin(), enforcers_idxs.end()));
+ if (polygon.size() < 2 || enforcers_idxs.empty())
+ return out;
+
+ auto get_center_idx = [&polygon, &lengths](size_t start_idx, size_t end_idx) -> size_t {
+ assert(end_idx >= start_idx);
+ if (start_idx == end_idx)
+ return start_idx;
+ float t_c = lengths[start_idx] + 0.5f * (lengths[end_idx] - lengths[start_idx]);
+ auto it = std::lower_bound(lengths.begin() + start_idx, lengths.begin() + end_idx, t_c);
+ int ret = it - lengths.begin();
+ return ret;
+ };
+
+ int last_enforcer_start_idx = enforcers_idxs.front();
+ bool first_pt_in_list = enforcers_idxs.front() != 0;
+ bool last_pt_in_list = enforcers_idxs.back() == polygon.points.size() - 1;
+ bool wrap_around = last_pt_in_list && first_pt_in_list;
+
+ for (size_t i=0; i<enforcers_idxs.size(); ++i) {
+ if (i != enforcers_idxs.size() - 1) {
+ if (enforcers_idxs[i+1] != enforcers_idxs[i] + 1) {
+ // i is last point of current enforcer
+ out.push_back(get_center_idx(last_enforcer_start_idx, enforcers_idxs[i]));
+ last_enforcer_start_idx = enforcers_idxs[i+1];
+ }
+ } else {
+ if (! wrap_around) {
+ // we can safely use the last enforcer point.
+ out.push_back(get_center_idx(last_enforcer_start_idx, enforcers_idxs[i]));
+ }
+ }
+ }
+
+ if (wrap_around) {
+ // Update first center already found.
+ if (out.empty()) {
+ // Probably an enforcer around the whole contour. Return nothing.
+ return out;
+ }
+
+ // find last point of the enforcer at the beginning:
+ size_t idx = 0;
+ while (enforcers_idxs[idx]+1 == enforcers_idxs[idx+1])
+ ++idx;
+
+ float t_s = lengths[last_enforcer_start_idx];
+ float t_e = lengths[idx];
+ float half_dist = 0.5f * (t_e + lengths.back() - t_s);
+ float t_c = (half_dist > t_e) ? t_s + half_dist : t_e - half_dist;
+
+ auto it = std::lower_bound(lengths.begin(), lengths.end(), t_c);
+ out[0] = it - lengths.begin();
+ if (out[0] == lengths.size() - 1)
+ --out[0];
+ assert(out[0] < lengths.size() - 1);
+ }
+ return out;
+}
+
+
+
+void SeamPlacer::apply_custom_seam(const Polygon& polygon, size_t po_idx,
+ std::vector<float>& penalties,
+ const std::vector<float>& lengths,
+ int layer_id, SeamPosition seam_position) const
+{
+ if (! is_custom_seam_on_layer(layer_id, po_idx))
+ return;
+
+ std::vector<size_t> enforcers_idxs;
+ std::vector<size_t> blockers_idxs;
+ this->get_enforcers_and_blockers(layer_id, polygon, po_idx, enforcers_idxs, blockers_idxs);
+
+ for (size_t i : enforcers_idxs) {
+ assert(i < penalties.size());
+ penalties[i] -= float(ENFORCER_BLOCKER_PENALTY);
+ }
+ for (size_t i : blockers_idxs) {
+ assert(i < penalties.size());
+ penalties[i] += float(ENFORCER_BLOCKER_PENALTY);
+ }
+ if (seam_position == spAligned) {
+ std::vector<size_t> enf_centers = find_enforcer_centers(polygon, lengths, enforcers_idxs);
+ for (size_t idx : enf_centers) {
+ assert(idx < penalties.size());
+ penalties[idx] += ENFORCER_CENTER_PENALTY;
+ }
+ }
+
+////////////////////////
+// std::ostringstream os;
+// os << std::setw(3) << std::setfill('0') << layer_id;
+// int a = scale_(30.);
+// SVG svg("custom_seam" + os.str() + ".svg", BoundingBox(Point(-a, -a), Point(a, a)));
+// //if (! m_enforcers[po_idx].empty())
+// // svg.draw(m_enforcers[po_idx][layer_id].polys, "blue");
+// //if (! m_blockers[po_idx].empty())
+// // svg.draw(m_blockers[po_idx][layer_id].polys, "red");
+
+
+
+// size_t min_idx = std::min_element(penalties.begin(), penalties.end()) - penalties.begin();
+
+// //svg.draw(polygon.points[idx_min], "red", 6e5);
+// for (size_t i=0; i<polygon.points.size(); ++i) {
+// std::string fill;
+// coord_t size = 0;
+// if (min_idx == i) {
+// fill = "yellow";
+// size = 5e5;
+// } else
+// fill = (std::find(enforcers_idxs.begin(), enforcers_idxs.end(), i) != enforcers_idxs.end() ? "green" : "black");
+// if (i != 0)
+// svg.draw(polygon.points[i], fill, size);
+// else
+// svg.draw(polygon.points[i], "red", 5e5);
+// }
+//////////////////////
+
+}
+
+
+
+std::optional<Point> SeamHistory::get_last_seam(const PrintObject* po, size_t layer_id, const BoundingBox& island_bb)
+{
+ assert(layer_id >= m_layer_id);
+ if (layer_id > m_layer_id) {
+ // Get seam was called for different layer than last time.
+ m_data_last_layer = m_data_this_layer;
+ m_data_this_layer.clear();
+ m_layer_id = layer_id;
+ }
+
+
+
+ std::optional<Point> out;
+
+ auto seams_it = m_data_last_layer.find(po);
+ if (seams_it == m_data_last_layer.end())
+ return out;
+
+ const std::vector<SeamPoint>& seam_data_po = seams_it->second;
+
+ // Find a bounding-box on the last layer that is close to one we see now.
+ double min_score = std::numeric_limits<double>::max();
+ for (const SeamPoint& sp : seam_data_po) {
+ const BoundingBox& bb = sp.m_island_bb;
+
+ if (! bb.overlap(island_bb)) {
+ // This bb does not even overlap. It is likely unrelated.
+ continue;
+ }
+
+ double score = std::pow(bb.min(0) - island_bb.min(0), 2.)
+ + std::pow(bb.min(1) - island_bb.min(1), 2.)
+ + std::pow(bb.max(0) - island_bb.max(0), 2.)
+ + std::pow(bb.max(1) - island_bb.max(1), 2.);
+
+ if (score < min_score) {
+ min_score = score;
+ out = sp.m_pos;
+ }
+ }
+
+ return out;
+}
+
+
+
+void SeamHistory::add_seam(const PrintObject* po, const Point& pos, const BoundingBox& island_bb)
+{
+ m_data_this_layer[po].push_back({pos, island_bb});;
+}
+
+
+
+void SeamHistory::clear()
+{
+ m_layer_id = 0;
+ m_data_last_layer.clear();
+ m_data_this_layer.clear();
+}
+
+
+}
diff --git a/src/libslic3r/GCode/SeamPlacer.hpp b/src/libslic3r/GCode/SeamPlacer.hpp
new file mode 100644
index 000000000..0bae7af5a
--- /dev/null
+++ b/src/libslic3r/GCode/SeamPlacer.hpp
@@ -0,0 +1,109 @@
+#ifndef libslic3r_SeamPlacer_hpp_
+#define libslic3r_SeamPlacer_hpp_
+
+#include <optional>
+
+#include "libslic3r/Polygon.hpp"
+#include "libslic3r/PrintConfig.hpp"
+#include "libslic3r/BoundingBox.hpp"
+#include "libslic3r/AABBTreeIndirect.hpp"
+
+namespace Slic3r {
+
+class PrintObject;
+class ExtrusionLoop;
+class Print;
+class Layer;
+namespace EdgeGrid { class Grid; }
+
+
+class SeamHistory {
+public:
+ SeamHistory() { clear(); }
+ std::optional<Point> get_last_seam(const PrintObject* po, size_t layer_id, const BoundingBox& island_bb);
+ void add_seam(const PrintObject* po, const Point& pos, const BoundingBox& island_bb);
+ void clear();
+
+private:
+ struct SeamPoint {
+ Point m_pos;
+ BoundingBox m_island_bb;
+ };
+
+ std::map<const PrintObject*, std::vector<SeamPoint>> m_data_last_layer;
+ std::map<const PrintObject*, std::vector<SeamPoint>> m_data_this_layer;
+ size_t m_layer_id;
+};
+
+
+
+class SeamPlacer {
+public:
+ void init(const Print& print);
+
+ Point get_seam(const Layer& layer, const SeamPosition seam_position,
+ const ExtrusionLoop& loop, Point last_pos,
+ coordf_t nozzle_diameter, const PrintObject* po,
+ bool was_clockwise, const EdgeGrid::Grid* lower_layer_edge_grid);
+
+ using TreeType = AABBTreeIndirect::Tree<2, coord_t>;
+ using AlignedBoxType = Eigen::AlignedBox<TreeType::CoordType, TreeType::NumDimensions>;
+
+private:
+
+ struct CustomTrianglesPerLayer {
+ Polygons polys;
+ TreeType tree;
+ };
+
+ // Just a cache to save some lookups.
+ const Layer* m_last_layer_po = nullptr;
+ coordf_t m_last_print_z = -1.;
+ const PrintObject* m_last_po = nullptr;
+
+ bool m_last_loop_was_external = true;
+
+ std::vector<std::vector<CustomTrianglesPerLayer>> m_enforcers;
+ std::vector<std::vector<CustomTrianglesPerLayer>> m_blockers;
+ std::vector<const PrintObject*> m_po_list;
+
+ //std::map<const PrintObject*, Point> m_last_seam_position;
+ SeamHistory m_seam_history;
+
+ // Get indices of points inside enforcers and blockers.
+ void get_enforcers_and_blockers(size_t layer_id,
+ const Polygon& polygon,
+ size_t po_id,
+ std::vector<size_t>& enforcers_idxs,
+ std::vector<size_t>& blockers_idxs) const;
+
+ // Apply penalties to points inside enforcers/blockers.
+ void apply_custom_seam(const Polygon& polygon, size_t po_id,
+ std::vector<float>& penalties,
+ const std::vector<float>& lengths,
+ int layer_id, SeamPosition seam_position) const;
+
+ // Return random point of a polygon. The distribution will be uniform
+ // along the contour and account for enforcers and blockers.
+ Point get_random_seam(size_t layer_idx, const Polygon& polygon, size_t po_id,
+ bool* saw_custom = nullptr) const;
+
+ // Is there any enforcer/blocker on this layer?
+ bool is_custom_seam_on_layer(size_t layer_id, size_t po_idx) const {
+ return is_custom_enforcer_on_layer(layer_id, po_idx)
+ || is_custom_blocker_on_layer(layer_id, po_idx);
+ }
+
+ bool is_custom_enforcer_on_layer(size_t layer_id, size_t po_idx) const {
+ return (! m_enforcers.at(po_idx).empty() && ! m_enforcers.at(po_idx)[layer_id].polys.empty());
+ }
+
+ bool is_custom_blocker_on_layer(size_t layer_id, size_t po_idx) const {
+ return (! m_blockers.at(po_idx).empty() && ! m_blockers.at(po_idx)[layer_id].polys.empty());
+ }
+};
+
+
+}
+
+#endif // libslic3r_SeamPlacer_hpp_
diff --git a/src/libslic3r/GCode/SpiralVase.cpp b/src/libslic3r/GCode/SpiralVase.cpp
index a3c190069..acb6ad034 100644
--- a/src/libslic3r/GCode/SpiralVase.cpp
+++ b/src/libslic3r/GCode/SpiralVase.cpp
@@ -16,7 +16,7 @@ std::string SpiralVase::process_layer(const std::string &gcode)
// If we're not going to modify G-code, just feed it to the reader
// in order to update positions.
- if (! this->enable) {
+ if (! m_enabled) {
m_reader.parse_buffer(gcode);
return gcode;
}
@@ -25,11 +25,11 @@ std::string SpiralVase::process_layer(const std::string &gcode)
float total_layer_length = 0;
float layer_height = 0;
float z = 0.f;
- bool set_z = false;
{
//FIXME Performance warning: This copies the GCodeConfig of the reader.
GCodeReader r = m_reader; // clone
+ bool set_z = false;
r.parse_buffer(gcode, [&total_layer_length, &layer_height, &z, &set_z]
(GCodeReader &reader, const GCodeReader::GCodeLine &line) {
if (line.cmd_is("G1")) {
@@ -50,7 +50,14 @@ std::string SpiralVase::process_layer(const std::string &gcode)
z -= layer_height;
std::string new_gcode;
- m_reader.parse_buffer(gcode, [&new_gcode, &z, &layer_height, &total_layer_length]
+ //FIXME Tapering of the transition layer only works reliably with relative extruder distances.
+ // For absolute extruder distances it will be switched off.
+ // Tapering the absolute extruder distances requires to process every extrusion value after the first transition
+ // layer.
+ bool transition = m_transition_layer && m_config->use_relative_e_distances.value;
+ float layer_height_factor = layer_height / total_layer_length;
+ float len = 0.f;
+ m_reader.parse_buffer(gcode, [&new_gcode, &z, total_layer_length, layer_height_factor, transition, &len]
(GCodeReader &reader, GCodeReader::GCodeLine line) {
if (line.cmd_is("G1")) {
if (line.has_z()) {
@@ -64,8 +71,11 @@ std::string SpiralVase::process_layer(const std::string &gcode)
if (dist_XY > 0) {
// horizontal move
if (line.extruding(reader)) {
- z += dist_XY * layer_height / total_layer_length;
- line.set(reader, Z, z);
+ len += dist_XY;
+ line.set(reader, Z, z + len * layer_height_factor);
+ if (transition && line.has(E))
+ // Transition layer, modulate the amount of extrusion from zero to the final value.
+ line.set(reader, E, line.value(E) * len / total_layer_length);
new_gcode += line.raw() + '\n';
}
return;
diff --git a/src/libslic3r/GCode/SpiralVase.hpp b/src/libslic3r/GCode/SpiralVase.hpp
index 496c1425c..5353901fe 100644
--- a/src/libslic3r/GCode/SpiralVase.hpp
+++ b/src/libslic3r/GCode/SpiralVase.hpp
@@ -8,18 +8,26 @@ namespace Slic3r {
class SpiralVase {
public:
- bool enable = false;
-
SpiralVase(const PrintConfig &config) : m_config(&config)
{
m_reader.z() = (float)m_config->z_offset;
m_reader.apply_config(*m_config);
};
+
+ void enable(bool en) {
+ m_transition_layer = en && ! m_enabled;
+ m_enabled = en;
+ }
+
std::string process_layer(const std::string &gcode);
private:
const PrintConfig *m_config;
GCodeReader m_reader;
+
+ bool m_enabled = false;
+ // First spiral vase layer. Layer height has to be ramped up from zero to the target layer height.
+ bool m_transition_layer = false;
};
}
diff --git a/src/libslic3r/GCode/ThumbnailData.cpp b/src/libslic3r/GCode/ThumbnailData.cpp
index 80165916b..a5941bff1 100644
--- a/src/libslic3r/GCode/ThumbnailData.cpp
+++ b/src/libslic3r/GCode/ThumbnailData.cpp
@@ -1,8 +1,5 @@
-#include "libslic3r/libslic3r.h"
#include "ThumbnailData.hpp"
-#if ENABLE_THUMBNAIL_GENERATOR
-
namespace Slic3r {
void ThumbnailData::set(unsigned int w, unsigned int h)
@@ -32,5 +29,3 @@ bool ThumbnailData::is_valid() const
}
} // namespace Slic3r
-
-#endif // ENABLE_THUMBNAIL_GENERATOR \ No newline at end of file
diff --git a/src/libslic3r/GCode/ThumbnailData.hpp b/src/libslic3r/GCode/ThumbnailData.hpp
index 4acfe4374..2a302ed85 100644
--- a/src/libslic3r/GCode/ThumbnailData.hpp
+++ b/src/libslic3r/GCode/ThumbnailData.hpp
@@ -1,8 +1,6 @@
#ifndef slic3r_ThumbnailData_hpp_
#define slic3r_ThumbnailData_hpp_
-#if ENABLE_THUMBNAIL_GENERATOR
-
#include <vector>
#include "libslic3r/Point.hpp"
@@ -26,6 +24,4 @@ typedef std::function<void(ThumbnailsList & thumbnails, const Vec2ds & sizes, bo
} // namespace Slic3r
-#endif // ENABLE_THUMBNAIL_GENERATOR
-
-#endif // slic3r_ThumbnailData_hpp_ \ No newline at end of file
+#endif // slic3r_ThumbnailData_hpp_
diff --git a/src/libslic3r/GCode/ToolOrdering.cpp b/src/libslic3r/GCode/ToolOrdering.cpp
index 9bdda3a4c..74f061e4e 100644
--- a/src/libslic3r/GCode/ToolOrdering.cpp
+++ b/src/libslic3r/GCode/ToolOrdering.cpp
@@ -1,5 +1,6 @@
#include "Print.hpp"
#include "ToolOrdering.hpp"
+#include "Layer.hpp"
// #define SLIC3R_DEBUG
@@ -15,7 +16,6 @@
#include <libslic3r.h>
-#include "../GCodeWriter.hpp"
namespace Slic3r {
@@ -94,7 +94,7 @@ ToolOrdering::ToolOrdering(const PrintObject &object, unsigned int first_extrude
// Reorder the extruders to minimize tool switches.
this->reorder_extruders(first_extruder);
- this->fill_wipe_tower_partitions(object.print()->config(), object.layers().front()->print_z - object.layers().front()->height);
+ this->fill_wipe_tower_partitions(object.print()->config(), object.layers().front()->print_z - object.layers().front()->height, object.config().layer_height);
this->collect_extruder_statistics(prime_multi_material);
}
@@ -107,6 +107,7 @@ ToolOrdering::ToolOrdering(const Print &print, unsigned int first_extruder, bool
// Initialize the print layers for all objects and all layers.
coordf_t object_bottom_z = 0.;
+ coordf_t max_layer_height = 0.;
{
std::vector<coordf_t> zs;
for (auto object : print.objects()) {
@@ -122,6 +123,8 @@ ToolOrdering::ToolOrdering(const Print &print, unsigned int first_extruder, bool
object_bottom_z = layer->print_z - layer->height;
break;
}
+
+ max_layer_height = std::max(max_layer_height, object->config().layer_height.value);
}
this->initialize_layers(zs);
}
@@ -144,7 +147,7 @@ ToolOrdering::ToolOrdering(const Print &print, unsigned int first_extruder, bool
// Reorder the extruders to minimize tool switches.
this->reorder_extruders(first_extruder);
- this->fill_wipe_tower_partitions(print.config(), object_bottom_z);
+ this->fill_wipe_tower_partitions(print.config(), object_bottom_z, max_layer_height);
this->collect_extruder_statistics(prime_multi_material);
}
@@ -318,7 +321,7 @@ void ToolOrdering::reorder_extruders(unsigned int last_extruder_id)
}
}
-void ToolOrdering::fill_wipe_tower_partitions(const PrintConfig &config, coordf_t object_bottom_z)
+void ToolOrdering::fill_wipe_tower_partitions(const PrintConfig &config, coordf_t object_bottom_z, coordf_t max_object_layer_height)
{
if (m_layer_tools.empty())
return;
@@ -351,6 +354,10 @@ void ToolOrdering::fill_wipe_tower_partitions(const PrintConfig &config, coordf_
mlh = 0.75 * config.nozzle_diameter.values[i];
max_layer_height = std::min(max_layer_height, mlh);
}
+ // The Prusa3D Fast (0.35mm layer height) print profile sets a higher layer height than what is normally allowed
+ // by the nozzle. This is a hack and it works by increasing extrusion width. See GH #3919.
+ max_layer_height = std::max(max_layer_height, max_object_layer_height);
+
for (size_t i = 0; i + 1 < m_layer_tools.size(); ++ i) {
const LayerTools &lt = m_layer_tools[i];
const LayerTools &lt_next = m_layer_tools[i + 1];
@@ -404,7 +411,7 @@ void ToolOrdering::fill_wipe_tower_partitions(const PrintConfig &config, coordf_
unsigned int j = i+1;
double last_wipe_tower_print_z = lt_next.print_z;
while (++j < m_layer_tools.size()-1 && !m_layer_tools[j].has_wipe_tower)
- if (m_layer_tools[j+1].print_z - last_wipe_tower_print_z > max_layer_height) {
+ if (m_layer_tools[j+1].print_z - last_wipe_tower_print_z > max_layer_height + EPSILON) {
m_layer_tools[j].has_wipe_tower = true;
last_wipe_tower_print_z = m_layer_tools[j].print_z;
}
@@ -485,7 +492,7 @@ void ToolOrdering::assign_custom_gcodes(const Print &print)
for (unsigned int i : lt.extruders)
extruder_printing_above[i] = true;
// Skip all custom G-codes above this layer and skip all extruder switches.
- for (; custom_gcode_it != custom_gcode_per_print_z.gcodes.rend() && (custom_gcode_it->print_z > lt.print_z + EPSILON || custom_gcode_it->gcode == ToolChangeCode); ++ custom_gcode_it);
+ for (; custom_gcode_it != custom_gcode_per_print_z.gcodes.rend() && (custom_gcode_it->print_z > lt.print_z + EPSILON || custom_gcode_it->type == CustomGCode::ToolChange); ++ custom_gcode_it);
if (custom_gcode_it == custom_gcode_per_print_z.gcodes.rend())
// Custom G-codes were processed.
break;
@@ -497,8 +504,8 @@ void ToolOrdering::assign_custom_gcodes(const Print &print)
print_z_below = it_lt_below->print_z;
if (custom_gcode.print_z > print_z_below + 0.5 * EPSILON) {
// The custom G-code applies to the current layer.
- bool color_change = custom_gcode.gcode == ColorChangeCode;
- bool tool_change = custom_gcode.gcode == ToolChangeCode;
+ bool color_change = custom_gcode.type == CustomGCode::ColorChange;
+ bool tool_change = custom_gcode.type == CustomGCode::ToolChange;
bool pause_or_custom_gcode = ! color_change && ! tool_change;
bool apply_color_change = ! ignore_tool_and_color_changes &&
// If it is color change, it will actually be useful as the exturder above will print.
diff --git a/src/libslic3r/GCode/ToolOrdering.hpp b/src/libslic3r/GCode/ToolOrdering.hpp
index 2252270d4..e2e07533f 100644
--- a/src/libslic3r/GCode/ToolOrdering.hpp
+++ b/src/libslic3r/GCode/ToolOrdering.hpp
@@ -14,6 +14,8 @@ namespace Slic3r {
class Print;
class PrintObject;
class LayerTools;
+namespace CustomGCode { struct Item; }
+class PrintRegion;
@@ -64,7 +66,7 @@ private:
std::map<const ExtrusionEntity*, ExtruderPerCopy> entity_map; // to keep track of who prints what
bool something_overridable = false;
bool something_overridden = false;
- const LayerTools* m_layer_tools; // so we know which LayerTools object this belongs to
+ const LayerTools* m_layer_tools = nullptr; // so we know which LayerTools object this belongs to
};
@@ -166,7 +168,7 @@ private:
void initialize_layers(std::vector<coordf_t> &zs);
void collect_extruders(const PrintObject &object, const std::vector<std::pair<double, unsigned int>> &per_layer_extruder_switches);
void reorder_extruders(unsigned int last_extruder_id);
- void fill_wipe_tower_partitions(const PrintConfig &config, coordf_t object_bottom_z);
+ void fill_wipe_tower_partitions(const PrintConfig &config, coordf_t object_bottom_z, coordf_t max_layer_height);
void collect_extruder_statistics(bool prime_multi_material);
std::vector<LayerTools> m_layer_tools;
diff --git a/src/libslic3r/GCode/WipeTower.cpp b/src/libslic3r/GCode/WipeTower.cpp
index d31adbd8f..0f72dc415 100644
--- a/src/libslic3r/GCode/WipeTower.cpp
+++ b/src/libslic3r/GCode/WipeTower.cpp
@@ -1,36 +1,23 @@
-/*
-
-TODO LIST
----------
-
-1. cooling moves - DONE
-2. account for perimeter and finish_layer extrusions and subtract it from last wipe - DONE
-3. priming extrusions (last wipe must clear the color) - DONE
-4. Peter's wipe tower - layer's are not exactly square
-5. Peter's wipe tower - variable width for higher levels
-6. Peter's wipe tower - make sure it is not too sparse (apply max_bridge_distance and make last wipe longer)
-7. Peter's wipe tower - enable enhanced first layer adhesion
-
-*/
-
#include "WipeTower.hpp"
-#include <assert.h>
-#include <math.h>
+#include <cassert>
#include <iostream>
#include <vector>
#include <numeric>
-#include "Analyzer.hpp"
+#include "GCodeProcessor.hpp"
#include "BoundingBox.hpp"
-#if defined(__linux) || defined(__GNUC__ )
-#include <strings.h>
-#endif /* __linux */
-#ifdef _MSC_VER
-#define strcasecmp _stricmp
-#endif
+// Experimental "Peter's wipe tower" feature was partially implemented, inspired by
+// PJR's idea of alternating two perpendicular wiping directions on a square tower.
+// It is probably never going to be finished, there are multiple remaining issues
+// and there is probably no need to go down this way. m_peters_wipe_tower variable
+// turns this on, maybe it should just be removed. Anyway, the issues are
+// - layer's are not exactly square
+// - variable width for higher levels
+// - make sure it is not too sparse (apply max_bridge_distance and make last wipe longer)
+// - enable enhanced first layer adhesion
namespace Slic3r
@@ -47,36 +34,54 @@ public:
m_extrusion_flow(0.f),
m_preview_suppressed(false),
m_elapsed_time(0.f),
+#if ENABLE_GCODE_VIEWER_DATA_CHECKING
m_default_analyzer_line_width(line_width),
+#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
m_gcode_flavor(flavor),
m_filpar(filament_parameters)
{
// adds tag for analyzer:
char buf[64];
- sprintf(buf, ";%s%f\n", GCodeAnalyzer::Height_Tag.c_str(), m_layer_height); // don't rely on GCodeAnalyzer knowing the layer height - it knows nothing at priming
+ sprintf(buf, ";%s%f\n", GCodeProcessor::Height_Tag.c_str(), m_layer_height); // don't rely on GCodeAnalyzer knowing the layer height - it knows nothing at priming
m_gcode += buf;
- sprintf(buf, ";%s%d\n", GCodeAnalyzer::Extrusion_Role_Tag.c_str(), erWipeTower);
+ sprintf(buf, ";%s%s\n", GCodeProcessor::Extrusion_Role_Tag.c_str(), ExtrusionEntity::role_to_string(erWipeTower).c_str());
m_gcode += buf;
+#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE || ENABLE_GCODE_VIEWER_DATA_CHECKING
change_analyzer_line_width(line_width);
+#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE || ENABLE_GCODE_VIEWER_DATA_CHECKING
}
- WipeTowerWriter& change_analyzer_line_width(float line_width) {
- // adds tag for analyzer:
- char buf[64];
- sprintf(buf, ";%s%f\n", GCodeAnalyzer::Width_Tag.c_str(), line_width);
- m_gcode += buf;
- return *this;
+#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ WipeTowerWriter& change_analyzer_line_width(float line_width) {
+ // adds tag for analyzer:
+ char buf[64];
+ sprintf(buf, ";%s%f\n", GCodeProcessor::Width_Tag.c_str(), line_width);
+ m_gcode += buf;
+ return *this;
}
-
- WipeTowerWriter& change_analyzer_mm3_per_mm(float len, float e) {
- static const float area = float(M_PI) * 1.75f * 1.75f / 4.f;
- float mm3_per_mm = (len == 0.f ? 0.f : area * e / len);
- // adds tag for analyzer:
- char buf[64];
- sprintf(buf, ";%s%f\n", GCodeAnalyzer::Mm3_Per_Mm_Tag.c_str(), mm3_per_mm);
- m_gcode += buf;
- return *this;
+#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+
+#if ENABLE_GCODE_VIEWER_DATA_CHECKING
+#if !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ WipeTowerWriter& change_analyzer_line_width(float line_width) {
+ // adds tag for analyzer:
+ char buf[64];
+ sprintf(buf, ";%s%f\n", GCodeProcessor::Width_Tag.c_str(), line_width);
+ m_gcode += buf;
+ return *this;
+ }
+#endif // !ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+
+ WipeTowerWriter& change_analyzer_mm3_per_mm(float len, float e) {
+ static const float area = float(M_PI) * 1.75f * 1.75f / 4.f;
+ float mm3_per_mm = (len == 0.f ? 0.f : area * e / len);
+ // adds tag for processor:
+ char buf[64];
+ sprintf(buf, ";%s%f\n", GCodeProcessor::Mm3_Per_Mm_Tag.c_str(), mm3_per_mm);
+ m_gcode += buf;
+ return *this;
}
+#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
WipeTowerWriter& set_initial_position(const Vec2f &pos, float width = 0.f, float depth = 0.f, float internal_angle = 0.f) {
m_wipe_tower_width = width;
@@ -102,15 +107,22 @@ public:
}
WipeTowerWriter& disable_linear_advance() {
- m_gcode += (m_gcode_flavor == gcfRepRap ? std::string("M572 D0 S0\n") : std::string("M900 K0\n"));
+ m_gcode += (m_gcode_flavor == gcfRepRapSprinter || m_gcode_flavor == gcfRepRapFirmware
+ ? (std::string("M572 D") + std::to_string(m_current_tool) + " S0\n")
+ : std::string("M900 K0\n"));
return *this;
}
// Suppress / resume G-code preview in Slic3r. Slic3r will have difficulty to differentiate the various
// filament loading and cooling moves from normal extrusion moves. Therefore the writer
// is asked to suppres output of some lines, which look like extrusions.
- WipeTowerWriter& suppress_preview() { change_analyzer_line_width(0.f); m_preview_suppressed = true; return *this; }
- WipeTowerWriter& resume_preview() { change_analyzer_line_width(m_default_analyzer_line_width); m_preview_suppressed = false; return *this; }
+#if ENABLE_GCODE_VIEWER_DATA_CHECKING
+ WipeTowerWriter& suppress_preview() { change_analyzer_line_width(0.f); m_preview_suppressed = true; return *this; }
+ WipeTowerWriter& resume_preview() { change_analyzer_line_width(m_default_analyzer_line_width); m_preview_suppressed = false; return *this; }
+#else
+ WipeTowerWriter& suppress_preview() { m_preview_suppressed = true; return *this; }
+ WipeTowerWriter& resume_preview() { m_preview_suppressed = false; return *this; }
+#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
WipeTowerWriter& feedrate(float f)
{
@@ -147,8 +159,10 @@ public:
Vec2f rot(this->rotate(Vec2f(x,y))); // this is where we want to go
if (! m_preview_suppressed && e > 0.f && len > 0.f) {
+#if ENABLE_GCODE_VIEWER_DATA_CHECKING
change_analyzer_mm3_per_mm(len, e);
- // Width of a squished extrusion, corrected for the roundings of the squished extrusions.
+#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
+ // Width of a squished extrusion, corrected for the roundings of the squished extrusions.
// This is left zero if it is a travel move.
float width = e * m_filpar[0].filament_area / (len * m_layer_height);
// Correct for the roundings of a squished extrusion.
@@ -349,7 +363,7 @@ public:
// Set digital trimpot motor
WipeTowerWriter& set_extruder_trimpot(int current)
{
- if (m_gcode_flavor == gcfRepRap)
+ if (m_gcode_flavor == gcfRepRapSprinter || m_gcode_flavor == gcfRepRapFirmware)
m_gcode += "M906 E";
else
m_gcode += "M907 E";
@@ -391,9 +405,26 @@ public:
WipeTowerWriter& append(const std::string& text) { m_gcode += text; return *this; }
+ std::vector<Vec2f> wipe_path() const
+ {
+ return m_wipe_path;
+ }
+
+ WipeTowerWriter& add_wipe_point(const Vec2f& pt)
+ {
+ m_wipe_path.push_back(rotate(pt));
+ return *this;
+ }
+
+ WipeTowerWriter& add_wipe_point(float x, float y)
+ {
+ return add_wipe_point(Vec2f(x, y));
+ }
+
private:
Vec2f m_start_pos;
Vec2f m_current_pos;
+ std::vector<Vec2f> m_wipe_path;
float m_current_z;
float m_current_feedrate;
size_t m_current_tool;
@@ -409,7 +440,9 @@ private:
float m_wipe_tower_depth = 0.f;
unsigned m_last_fan_speed = 0;
int current_temp = -1;
+#if ENABLE_GCODE_VIEWER_DATA_CHECKING
const float m_default_analyzer_line_width;
+#endif // ENABLE_GCODE_VIEWER_DATA_CHECKING
float m_used_filament_length = 0.f;
GCodeFlavor m_gcode_flavor;
const std::vector<WipeTower::FilamentParameters>& m_filpar;
@@ -465,6 +498,27 @@ private:
+WipeTower::ToolChangeResult WipeTower::construct_tcr(WipeTowerWriter& writer,
+ bool priming,
+ size_t old_tool) const
+{
+ ToolChangeResult result;
+ result.priming = priming;
+ result.initial_tool = int(old_tool);
+ result.new_tool = int(this->m_current_tool);
+ result.print_z = this->m_z_pos;
+ result.layer_height = this->m_layer_height;
+ result.elapsed_time = writer.elapsed_time();
+ result.start_pos = writer.start_pos_rotated();
+ result.end_pos = priming ? writer.pos() : writer.pos_rotated();
+ result.gcode = std::move(writer.gcode());
+ result.extrusions = std::move(writer.extrusions());
+ result.wipe_path = std::move(writer.wipe_path());
+ return result;
+}
+
+
+
WipeTower::WipeTower(const PrintConfig& config, const std::vector<std::vector<float>>& wiping_matrix, size_t initial_tool) :
m_semm(config.single_extruder_multi_material.value),
m_wipe_tower_pos(config.wipe_tower_x, config.wipe_tower_y),
@@ -623,20 +677,6 @@ std::vector<WipeTower::ToolChangeResult> WipeTower::prime(
if (m_current_tool < m_used_filament_length.size())
m_used_filament_length[m_current_tool] += writer.get_and_reset_used_filament_length();
- ToolChangeResult result;
- result.priming = true;
- result.initial_tool = int(old_tool);
- result.new_tool = int(m_current_tool);
- result.print_z = this->m_z_pos;
- result.layer_height = this->m_layer_height;
- result.gcode = writer.gcode();
- result.elapsed_time = writer.elapsed_time();
- result.extrusions = writer.extrusions();
- result.start_pos = writer.start_pos_rotated();
- result.end_pos = writer.pos();
-
- results.push_back(std::move(result));
-
// This is the last priming toolchange - finish priming
if (idx_tool+1 == tools.size()) {
// Reset the extruder current to a normal value.
@@ -650,6 +690,8 @@ std::vector<WipeTower::ToolChangeResult> WipeTower::prime(
";------------------\n"
"\n\n");
}
+
+ results.emplace_back(construct_tcr(writer, true, old_tool));
}
m_old_temperature = -1; // If the priming is turned off in config, the temperature changing commands will not actually appear
@@ -661,7 +703,7 @@ std::vector<WipeTower::ToolChangeResult> WipeTower::prime(
return results;
}
-WipeTower::ToolChangeResult WipeTower::tool_change(size_t tool, bool last_in_layer)
+WipeTower::ToolChangeResult WipeTower::tool_change(size_t tool)
{
if ( m_print_brim )
return toolchange_Brim();
@@ -738,7 +780,9 @@ WipeTower::ToolChangeResult WipeTower::tool_change(size_t tool, bool last_in_lay
else {
writer.rectangle(Vec2f::Zero(), m_wipe_tower_width, m_layer_info->depth + m_perimeter_width);
if (layer_finished()) { // no finish_layer will be called, we must wipe the nozzle
- writer.travel(writer.x()> m_wipe_tower_width / 2.f ? 0.f : m_wipe_tower_width, writer.y());
+ writer.add_wipe_point(writer.x(), writer.y())
+ .add_wipe_point(writer.x()> m_wipe_tower_width / 2.f ? 0.f : m_wipe_tower_width, writer.y());
+
}
}
}
@@ -757,18 +801,7 @@ WipeTower::ToolChangeResult WipeTower::tool_change(size_t tool, bool last_in_lay
if (m_current_tool < m_used_filament_length.size())
m_used_filament_length[m_current_tool] += writer.get_and_reset_used_filament_length();
- ToolChangeResult result;
- result.priming = false;
- result.initial_tool = int(old_tool);
- result.new_tool = int(m_current_tool);
- result.print_z = this->m_z_pos;
- result.layer_height = this->m_layer_height;
- result.gcode = writer.gcode();
- result.elapsed_time = writer.elapsed_time();
- result.extrusions = writer.extrusions();
- result.start_pos = writer.start_pos_rotated();
- result.end_pos = writer.pos_rotated();
- return result;
+ return construct_tcr(writer, false, old_tool);
}
WipeTower::ToolChangeResult WipeTower::toolchange_Brim(bool sideOnly, float y_offset)
@@ -801,13 +834,15 @@ WipeTower::ToolChangeResult WipeTower::toolchange_Brim(bool sideOnly, float y_of
for (size_t i = 0; i < 4; ++ i) {
box.expand(spacing);
writer.travel (box.ld, 7000)
- .extrude(box.lu, 2100).extrude(box.ru)
- .extrude(box.rd ).extrude(box.ld);
+ .extrude(box.lu, 2100).extrude(box.ru)
+ .extrude(box.rd ).extrude(box.ld);
}
- writer.travel(wipeTower_box.ld, 7000); // Move to the front left corner.
- writer.travel(wipeTower_box.rd) // Always wipe the nozzle with a long wipe to reduce stringing when moving away from the wipe tower.
- .travel(wipeTower_box.ld);
+ box.expand(-spacing);
+ writer.add_wipe_point(writer.x(), writer.y())
+ .add_wipe_point(box.ld)
+ .add_wipe_point(box.rd);
+
writer.append("; CP WIPE TOWER FIRST LAYER BRIM END\n"
";-----------------------------------\n");
@@ -821,18 +856,7 @@ WipeTower::ToolChangeResult WipeTower::toolchange_Brim(bool sideOnly, float y_of
if (m_current_tool < m_used_filament_length.size())
m_used_filament_length[m_current_tool] += writer.get_and_reset_used_filament_length();
- ToolChangeResult result;
- result.priming = false;
- result.initial_tool = int(old_tool);
- result.new_tool = int(m_current_tool);
- result.print_z = this->m_z_pos;
- result.layer_height = this->m_layer_height;
- result.gcode = writer.gcode();
- result.elapsed_time = writer.elapsed_time();
- result.extrusions = writer.extrusions();
- result.start_pos = writer.start_pos_rotated();
- result.end_pos = writer.pos_rotated();
- return result;
+ return construct_tcr(writer, false, old_tool);
}
@@ -850,8 +874,12 @@ void WipeTower::toolchange_Unload(
const float line_width = m_perimeter_width * m_filpar[m_current_tool].ramming_line_width_multiplicator; // desired ramming line thickness
const float y_step = line_width * m_filpar[m_current_tool].ramming_step_multiplicator * m_extra_spacing; // spacing between lines in mm
+#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE || ENABLE_GCODE_VIEWER_DATA_CHECKING
writer.append("; CP TOOLCHANGE UNLOAD\n")
- .change_analyzer_line_width(line_width);
+ .change_analyzer_line_width(line_width);
+#else
+ writer.append("; CP TOOLCHANGE UNLOAD\n");
+#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE || ENABLE_GCODE_VIEWER_DATA_CHECKING
unsigned i = 0; // iterates through ramming_speed
m_left_to_right = true; // current direction of ramming
@@ -871,13 +899,6 @@ void WipeTower::toolchange_Unload(
else
sparse_beginning_y += (m_layer_info-1)->toolchanges_depth() + m_perimeter_width;
- //debugging:
- /* float oldx = writer.x();
- float oldy = writer.y();
- writer.travel(xr,sparse_beginning_y);
- writer.extrude(xr+5,writer.y());
- writer.travel(oldx,oldy);*/
-
float sum_of_depths = 0.f;
for (const auto& tch : m_layer_info->tool_changes) { // let's find this toolchange
if (tch.old_tool == m_current_tool) {
@@ -885,13 +906,6 @@ void WipeTower::toolchange_Unload(
float ramming_end_y = sum_of_depths;
ramming_end_y -= (y_step/m_extra_spacing-m_perimeter_width) / 2.f; // center of final ramming line
- // debugging:
- /*float oldx = writer.x();
- float oldy = writer.y();
- writer.travel(xl,ramming_end_y);
- writer.extrude(xl-15,writer.y());
- writer.travel(oldx,oldy);*/
-
if ( (m_current_shape == SHAPE_REVERSED && ramming_end_y < sparse_beginning_y - 0.5f*m_perimeter_width ) ||
(m_current_shape == SHAPE_NORMAL && ramming_end_y > sparse_beginning_y + 0.5f*m_perimeter_width ) )
{
@@ -928,7 +942,9 @@ void WipeTower::toolchange_Unload(
}
}
Vec2f end_of_ramming(writer.x(),writer.y());
+#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE || ENABLE_GCODE_VIEWER_DATA_CHECKING
writer.change_analyzer_line_width(m_perimeter_width); // so the next lines are not affected by ramming_line_width_multiplier
+#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE || ENABLE_GCODE_VIEWER_DATA_CHECKING
// Retraction:
float old_x = writer.x();
@@ -940,12 +956,6 @@ void WipeTower::toolchange_Unload(
.retract(0.70f * total_retraction_distance, 1.0f * m_filpar[m_current_tool].unloading_speed * 60.f)
.retract(0.20f * total_retraction_distance, 0.5f * m_filpar[m_current_tool].unloading_speed * 60.f)
.retract(0.10f * total_retraction_distance, 0.3f * m_filpar[m_current_tool].unloading_speed * 60.f)
-
- /*.load_move_x_advanced(turning_point, -15.f, 83.f, 50.f) // this is done at fixed speed
- .load_move_x_advanced(old_x, -0.70f * total_retraction_distance, 1.0f * m_filpar[m_current_tool].unloading_speed)
- .load_move_x_advanced(turning_point, -0.20f * total_retraction_distance, 0.5f * m_filpar[m_current_tool].unloading_speed)
- .load_move_x_advanced(old_x, -0.10f * total_retraction_distance, 0.3f * m_filpar[m_current_tool].unloading_speed)
- .travel(old_x, writer.y()) // in case previous move was shortened to limit feedrate*/
.resume_preview();
}
// Wipe tower should only change temperature with single extruder MM. Otherwise, all temperatures should
@@ -1038,11 +1048,6 @@ void WipeTower::toolchange_Load(
writer.append("; CP TOOLCHANGE LOAD\n")
.suppress_preview()
- /*.load_move_x_advanced(turning_point, 0.2f * edist, 0.3f * m_filpar[m_current_tool].loading_speed) // Acceleration
- .load_move_x_advanced(oldx, 0.5f * edist, m_filpar[m_current_tool].loading_speed) // Fast phase
- .load_move_x_advanced(turning_point, 0.2f * edist, 0.3f * m_filpar[m_current_tool].loading_speed) // Slowing down
- .load_move_x_advanced(oldx, 0.1f * edist, 0.1f * m_filpar[m_current_tool].loading_speed) // Super slow*/
-
.load(0.2f * edist, 60.f * m_filpar[m_current_tool].loading_speed_start)
.load_move_x_advanced(turning_point, 0.7f * edist, m_filpar[m_current_tool].loading_speed) // Fast phase
.load_move_x_advanced(oldx, 0.1f * edist, 0.1f * m_filpar[m_current_tool].loading_speed) // Super slow*/
@@ -1112,11 +1117,14 @@ void WipeTower::toolchange_Wipe(
m_left_to_right = !m_left_to_right;
}
- // this is neither priming nor not the last toolchange on this layer - we are going back to the model - wipe the nozzle
+ // this is neither priming nor not the last toolchange on this layer - we are
+ // going back to the model - wipe the nozzle.
if (m_layer_info != m_plan.end() && m_current_tool != m_layer_info->tool_changes.back().new_tool) {
m_left_to_right = !m_left_to_right;
- writer.travel(writer.x(), writer.y() - dy)
- .travel(m_left_to_right ? m_wipe_tower_width : 0.f, writer.y());
+ writer.add_wipe_point(writer.x(), writer.y())
+ .add_wipe_point(writer.x(), writer.y() - dy)
+ .add_wipe_point(m_left_to_right ? m_wipe_tower_width : 0.f, writer.y() - dy);
+
}
writer.set_extrusion_flow(m_extrusion_flow); // Reset the extrusion flow.
@@ -1180,7 +1188,8 @@ WipeTower::ToolChangeResult WipeTower::finish_layer()
writer.extrude(box.rd.x() - m_perimeter_width / 2.f, writer.y() + 0.5f * step);
writer.extrude(box.ld.x() + m_perimeter_width / 2.f, writer.y());
}
- writer.travel(box.rd.x()-m_perimeter_width/2.f,writer.y()); // wipe the nozzle
+ writer.add_wipe_point(writer.x(), writer.y())
+ .add_wipe_point(box.rd.x()-m_perimeter_width/2.f,writer.y());
}
else { // Extrude a sparse infill to support the material to be printed above.
const float dy = (fill_box.lu.y() - fill_box.ld.y() - m_perimeter_width);
@@ -1199,10 +1208,13 @@ WipeTower::ToolChangeResult WipeTower::finish_layer()
writer.travel(x,writer.y());
writer.extrude(x,i%2 ? fill_box.rd.y() : fill_box.ru.y());
}
- writer.travel(left,writer.y(),7200); // wipes the nozzle before moving away from the wipe tower
+ writer.add_wipe_point(Vec2f(writer.x(), writer.y()))
+ .add_wipe_point(Vec2f(left, writer.y()));
+ }
+ else {
+ writer.add_wipe_point(Vec2f(writer.x(), writer.y()))
+ .add_wipe_point(Vec2f(right, writer.y()));
}
- else
- writer.travel(right,writer.y(),7200); // wipes the nozzle before moving away from the wipe tower
}
writer.append("; CP EMPTY GRID END\n"
";------------------\n\n\n\n\n\n\n");
@@ -1216,18 +1228,7 @@ WipeTower::ToolChangeResult WipeTower::finish_layer()
if (m_current_tool < m_used_filament_length.size())
m_used_filament_length[m_current_tool] += writer.get_and_reset_used_filament_length();
- ToolChangeResult result;
- result.priming = false;
- result.initial_tool = int(old_tool);
- result.new_tool = int(m_current_tool);
- result.print_z = this->m_z_pos;
- result.layer_height = this->m_layer_height;
- result.gcode = writer.gcode();
- result.elapsed_time = writer.elapsed_time();
- result.extrusions = writer.extrusions();
- result.start_pos = writer.start_pos_rotated();
- result.end_pos = writer.pos_rotated();
- return result;
+ return construct_tcr(writer, false, old_tool);
}
// Appends a toolchange into m_plan and calculates neccessary depth of the corresponding box
@@ -1298,7 +1299,7 @@ void WipeTower::save_on_last_wipe()
continue;
for (const auto &toolchange : m_layer_info->tool_changes)
- tool_change(toolchange.new_tool, false);
+ tool_change(toolchange.new_tool);
float width = m_wipe_tower_width - 3*m_perimeter_width; // width we draw into
float length_to_save = 2*(m_wipe_tower_width+m_wipe_tower_depth) + (!layer_finished() ? finish_layer().total_extrusion_length_in_plane() : 0.f);
@@ -1360,7 +1361,7 @@ void WipeTower::generate(std::vector<std::vector<WipeTower::ToolChangeResult>> &
m_y_shift = (m_wipe_tower_depth-m_layer_info->depth-m_perimeter_width)/2.f;
for (const auto &toolchange : layer.tool_changes)
- layer_result.emplace_back(tool_change(toolchange.new_tool, false));
+ layer_result.emplace_back(tool_change(toolchange.new_tool));
if (! layer_finished()) {
auto finish_layer_toolchange = finish_layer();
@@ -1374,6 +1375,7 @@ void WipeTower::generate(std::vector<std::vector<WipeTower::ToolChangeResult>> &
last_toolchange.gcode += finish_layer_toolchange.gcode;
last_toolchange.extrusions.insert(last_toolchange.extrusions.end(), finish_layer_toolchange.extrusions.begin(), finish_layer_toolchange.extrusions.end());
last_toolchange.end_pos = finish_layer_toolchange.end_pos;
+ last_toolchange.wipe_path = finish_layer_toolchange.wipe_path;
}
else
layer_result.emplace_back(std::move(finish_layer_toolchange));
@@ -1409,4 +1411,5 @@ void WipeTower::make_wipe_tower_square()
lay.extra_spacing = lay.depth / lay.toolchanges_depth();
}
-}; // namespace Slic3r
+
+} // namespace Slic3r
diff --git a/src/libslic3r/GCode/WipeTower.hpp b/src/libslic3r/GCode/WipeTower.hpp
index cc870c08a..0f9b0b87d 100644
--- a/src/libslic3r/GCode/WipeTower.hpp
+++ b/src/libslic3r/GCode/WipeTower.hpp
@@ -21,7 +21,7 @@ enum GCodeFlavor : unsigned char;
class WipeTower
{
public:
- static char const* never_skip_tag() { return "_GCODE_WIPE_TOWER_NEVER_SKIP_TAG"; }
+ static const std::string never_skip_tag() { return "_GCODE_WIPE_TOWER_NEVER_SKIP_TAG"; }
struct Extrusion
{
@@ -57,6 +57,13 @@ public:
// Is this a priming extrusion? (If so, the wipe tower rotation & translation will not be applied later)
bool priming;
+ // Pass a polyline so that normal G-code generator can do a wipe for us.
+ // The wipe cannot be done by the wipe tower because it has to pass back
+ // a loaded extruder, so it would have to either do a wipe with no retraction
+ // (leading to https://github.com/prusa3d/PrusaSlicer/issues/2834) or do
+ // an extra retraction-unretraction pair.
+ std::vector<Vec2f> wipe_path;
+
// Initial tool
int initial_tool;
@@ -77,6 +84,12 @@ public:
}
};
+ // Construct ToolChangeResult from current state of WipeTower and WipeTowerWriter.
+ // WipeTowerWriter is moved from !
+ ToolChangeResult construct_tcr(WipeTowerWriter& writer,
+ bool priming,
+ size_t old_tool) const;
+
// x -- x coordinates of wipe tower in mm ( left bottom corner )
// y -- y coordinates of wipe tower in mm ( left bottom corner )
// width -- width of wipe tower in mm ( default 60 mm - leave as it is )
@@ -154,7 +167,7 @@ public:
// Returns gcode for a toolchange and a final print head position.
// On the first layer, extrude a brim around the future wipe tower first.
- ToolChangeResult tool_change(size_t new_tool, bool last_in_layer);
+ ToolChangeResult tool_change(size_t new_tool);
// Fill the unfilled space with a sparse infill.
// Call this method only if layer_finished() is false.
@@ -189,8 +202,6 @@ public:
};
private:
- WipeTower();
-
enum wipe_shape // A fill-in direction
{
SHAPE_NORMAL = 1,
diff --git a/src/libslic3r/GCodeReader.cpp b/src/libslic3r/GCodeReader.cpp
index e68bc5ad2..2ef238f10 100644
--- a/src/libslic3r/GCodeReader.cpp
+++ b/src/libslic3r/GCodeReader.cpp
@@ -1,6 +1,7 @@
#include "GCodeReader.hpp"
#include <boost/algorithm/string/classification.hpp>
#include <boost/algorithm/string/split.hpp>
+#include <boost/nowide/fstream.hpp>
#include <fstream>
#include <iostream>
#include <iomanip>
@@ -113,9 +114,10 @@ void GCodeReader::update_coordinates(GCodeLine &gline, std::pair<const char*, co
void GCodeReader::parse_file(const std::string &file, callback_t callback)
{
- std::ifstream f(file);
+ boost::nowide::ifstream f(file);
std::string line;
- while (std::getline(f, line))
+ m_parsing_file = true;
+ while (m_parsing_file && std::getline(f, line))
this->parse_line(line, callback);
}
diff --git a/src/libslic3r/GCodeReader.hpp b/src/libslic3r/GCodeReader.hpp
index 9503ddcc1..d90a23160 100644
--- a/src/libslic3r/GCodeReader.hpp
+++ b/src/libslic3r/GCodeReader.hpp
@@ -6,6 +6,7 @@
#include <cstdlib>
#include <functional>
#include <string>
+#include <string_view>
#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]; }
@@ -107,6 +108,7 @@ public:
{ GCodeLine gline; this->parse_line(line.c_str(), gline, callback); }
void parse_file(const std::string &file, callback_t callback);
+ void quit_parsing_file() { m_parsing_file = false; }
float& x() { return m_position[X]; }
float x() const { return m_position[X]; }
@@ -145,6 +147,7 @@ private:
char m_extrusion_axis;
float m_position[NUM_AXES];
bool m_verbose;
+ bool m_parsing_file{ false };
};
} /* namespace Slic3r */
diff --git a/src/libslic3r/GCodeSender.cpp b/src/libslic3r/GCodeSender.cpp
index 0988091ce..275dd61a7 100644
--- a/src/libslic3r/GCodeSender.cpp
+++ b/src/libslic3r/GCodeSender.cpp
@@ -134,7 +134,7 @@ GCodeSender::set_baud_rate(unsigned int baud_rate)
speed_t newSpeed = baud_rate;
ioctl(handle, IOSSIOSPEED, &newSpeed);
::tcsetattr(handle, TCSANOW, &ios);
-#elif __linux
+#elif __linux__
termios2 ios;
if (ioctl(handle, TCGETS2, &ios))
printf("Error in TCGETS2: %s\n", strerror(errno));
@@ -153,7 +153,7 @@ GCodeSender::set_baud_rate(unsigned int baud_rate)
if (::tcsetattr(handle, TCSAFLUSH, &ios) != 0)
printf("Failed to set baud rate: %s\n", strerror(errno));
#else
- //throw invalid_argument ("OS does not currently support custom bauds");
+ //throw Slic3r::InvalidArgument("OS does not currently support custom bauds");
#endif
}
}
@@ -393,7 +393,7 @@ GCodeSender::on_read(const boost::system::error_code& error,
}
this->send();
} else {
- printf("Cannot resend " PRINTF_ZU " (oldest we have is " PRINTF_ZU ")\n", toresend, this->sent - this->last_sent.size());
+ printf("Cannot resend %zu (oldest we have is %zu)\n", toresend, this->sent - this->last_sent.size());
}
} else if (boost::starts_with(line, "wait")) {
// ignore
diff --git a/src/libslic3r/GCodeTimeEstimator.cpp b/src/libslic3r/GCodeTimeEstimator.cpp
deleted file mode 100644
index 44b6a3d24..000000000
--- a/src/libslic3r/GCodeTimeEstimator.cpp
+++ /dev/null
@@ -1,1703 +0,0 @@
-#include "GCodeTimeEstimator.hpp"
-#include "Utils.hpp"
-#include <boost/bind.hpp>
-#include <cmath>
-
-#include <Shiny/Shiny.h>
-
-#include <boost/nowide/fstream.hpp>
-#include <boost/nowide/cstdio.hpp>
-#include <boost/algorithm/string/predicate.hpp>
-
-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 acceleration) const
- {
- return acceleration_time_from_distance(feedrate.entry, accelerate_until, acceleration);
- }
-
- float GCodeTimeEstimator::Block::Trapezoid::cruise_time() const
- {
- return (feedrate.cruise != 0.0f) ? cruise_distance() / feedrate.cruise : 0.0f;
- }
-
- float GCodeTimeEstimator::Block::Trapezoid::deceleration_time(float acceleration) const
- {
- return acceleration_time_from_distance(feedrate.cruise, (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);
- }
-
- GCodeTimeEstimator::Block::Block()
- {
- }
-
- float GCodeTimeEstimator::Block::move_length() const
- {
- float length = ::sqrt(sqr(delta_pos[X]) + sqr(delta_pos[Y]) + sqr(delta_pos[Z]));
- return (length > 0.0f) ? length : std::abs(delta_pos[E]);
- }
-
- float GCodeTimeEstimator::Block::is_extruder_only_move() const
- {
- return (delta_pos[X] == 0.0f) && (delta_pos[Y] == 0.0f) && (delta_pos[Z] == 0.0f) && (delta_pos[E] != 0.0f);
- }
-
- float GCodeTimeEstimator::Block::is_travel_move() const
- {
- return delta_pos[E] == 0.0f;
- }
-
- float GCodeTimeEstimator::Block::acceleration_time() const
- {
- return trapezoid.acceleration_time(acceleration);
- }
-
- float GCodeTimeEstimator::Block::cruise_time() const
- {
- return trapezoid.cruise_time();
- }
-
- float GCodeTimeEstimator::Block::deceleration_time() const
- {
- return trapezoid.deceleration_time(acceleration);
- }
-
- float GCodeTimeEstimator::Block::cruise_distance() const
- {
- return trapezoid.cruise_distance();
- }
-
- void GCodeTimeEstimator::Block::calculate_trapezoid()
- {
- float distance = move_length();
-
- trapezoid.distance = distance;
- trapezoid.feedrate = feedrate;
-
- 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 = clamp(0.0f, distance, intersection_distance(feedrate.entry, feedrate.exit, acceleration, distance));
- cruise_distance = 0.0f;
- trapezoid.feedrate.cruise = 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();
- m_last_st_synchronized_block_id = -1;
- }
- _calculate_time();
-
- 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_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();
-
- 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();
-
- 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<std::string>& 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();
-
- 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
- }
-
- 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 std::runtime_error(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 std::runtime_error(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 std::runtime_error(std::string("Time estimator post process export failed.\nIs the disk full?\n"));
- }
- export_line.clear();
- };
-
- GCodeReader parser;
- unsigned 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_line_ids.size()) || (data->g1_line_ids[g1_line_id].first >= g1_lines_count));
- const Block* block = nullptr;
- if (g1_line_id < (int)data->g1_line_ids.size())
- {
- const G1LineIdToBlockId& map_item = data->g1_line_ids[g1_line_id];
- if (map_item.first == g1_lines_count)
- {
- if (line.has_e() && (map_item.second < (unsigned int)data->blocks.size()))
- block = &data->blocks[map_item.second];
- ++g1_line_id;
- }
- }
-
- if ((block != nullptr) && (block->elapsed_time != -1.0f))
- {
- float block_remaining_time = data->time - block->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 * block->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 std::runtime_error(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 std::runtime_error(std::string("Failed to rename the output G-code file from ") + path_tmp + " to " + filename + '\n' +
- "Is " + path_tmp + " locked?" + '\n');
-
- return true;
- }
-
- void GCodeTimeEstimator::set_axis_position(EAxis axis, float position)
- {
- m_state.axis[axis].position = position;
- }
-
- void GCodeTimeEstimator::set_axis_origin(EAxis axis, float position)
- {
- m_state.axis[axis].origin = position;
- }
-
- void GCodeTimeEstimator::set_axis_max_feedrate(EAxis axis, float feedrate_mm_sec)
- {
- m_state.axis[axis].max_feedrate = feedrate_mm_sec;
- }
-
- void GCodeTimeEstimator::set_axis_max_acceleration(EAxis axis, float acceleration)
- {
- m_state.axis[axis].max_acceleration = acceleration;
- }
-
- void GCodeTimeEstimator::set_axis_max_jerk(EAxis axis, float jerk)
- {
- m_state.axis[axis].max_jerk = jerk;
- }
-
- float GCodeTimeEstimator::get_axis_position(EAxis axis) const
- {
- return m_state.axis[axis].position;
- }
-
- float GCodeTimeEstimator::get_axis_origin(EAxis axis) const
- {
- return m_state.axis[axis].origin;
- }
-
- float GCodeTimeEstimator::get_axis_max_feedrate(EAxis axis) const
- {
- return m_state.axis[axis].max_feedrate;
- }
-
- float GCodeTimeEstimator::get_axis_max_acceleration(EAxis axis) const
- {
- return m_state.axis[axis].max_acceleration;
- }
-
- float GCodeTimeEstimator::get_axis_max_jerk(EAxis axis) const
- {
- return m_state.axis[axis].max_jerk;
- }
-
- void GCodeTimeEstimator::set_feedrate(float feedrate_mm_sec)
- {
- m_state.feedrate = feedrate_mm_sec;
- }
-
- float GCodeTimeEstimator::get_feedrate() const
- {
- return m_state.feedrate;
- }
-
- void GCodeTimeEstimator::set_acceleration(float acceleration_mm_sec2)
- {
- m_state.acceleration = (m_state.max_acceleration == 0) ?
- acceleration_mm_sec2 :
- // Clamp the acceleration with the maximum.
- std::min(m_state.max_acceleration, acceleration_mm_sec2);
- }
-
- float GCodeTimeEstimator::get_acceleration() const
- {
- return m_state.acceleration;
- }
-
- void GCodeTimeEstimator::set_max_acceleration(float acceleration_mm_sec2)
- {
- m_state.max_acceleration = acceleration_mm_sec2;
- if (acceleration_mm_sec2 > 0)
- m_state.acceleration = acceleration_mm_sec2;
- }
-
- float GCodeTimeEstimator::get_max_acceleration() const
- {
- return m_state.max_acceleration;
- }
-
- void GCodeTimeEstimator::set_retract_acceleration(float acceleration_mm_sec2)
- {
- m_state.retract_acceleration = acceleration_mm_sec2;
- }
-
- float GCodeTimeEstimator::get_retract_acceleration() const
- {
- return m_state.retract_acceleration;
- }
-
- void GCodeTimeEstimator::set_minimum_feedrate(float feedrate_mm_sec)
- {
- m_state.minimum_feedrate = feedrate_mm_sec;
- }
-
- float GCodeTimeEstimator::get_minimum_feedrate() const
- {
- return m_state.minimum_feedrate;
- }
-
- void GCodeTimeEstimator::set_minimum_travel_feedrate(float feedrate_mm_sec)
- {
- m_state.minimum_travel_feedrate = feedrate_mm_sec;
- }
-
- float GCodeTimeEstimator::get_minimum_travel_feedrate() const
- {
- return m_state.minimum_travel_feedrate;
- }
-
- void GCodeTimeEstimator::set_filament_load_times(const std::vector<double> &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<double> &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::add_additional_time(float timeSec)
- {
- PROFILE_FUNC();
- m_state.additional_time += timeSec;
- }
-
- void GCodeTimeEstimator::set_additional_time(float timeSec)
- {
- m_state.additional_time = timeSec;
- }
-
- float GCodeTimeEstimator::get_additional_time() const
- {
- return m_state.additional_time;
- }
-
- void GCodeTimeEstimator::set_default()
- {
- set_units(Millimeters);
- set_dialect(gcfRepRap);
- set_global_positioning_type(Absolute);
- set_e_local_positioning_type(Absolute);
-
- set_feedrate(DEFAULT_FEEDRATE);
- // Setting the maximum acceleration to zero means that the there is no limit and the G-code
- // is allowed to set excessive values.
- set_max_acceleration(0);
- set_acceleration(DEFAULT_ACCELERATION);
- set_retract_acceleration(DEFAULT_RETRACT_ACCELERATION);
- set_minimum_feedrate(DEFAULT_MINIMUM_FEEDRATE);
- set_minimum_travel_feedrate(DEFAULT_MINIMUM_TRAVEL_FEEDRATE);
- set_extrude_factor_override_percentage(DEFAULT_EXTRUDE_FACTOR_OVERRIDE_PERCENTAGE);
-
- for (unsigned char a = X; a < Num_Axis; ++a)
- {
- EAxis axis = (EAxis)a;
- set_axis_max_feedrate(axis, DEFAULT_AXIS_MAX_FEEDRATE[a]);
- set_axis_max_acceleration(axis, DEFAULT_AXIS_MAX_ACCELERATION[a]);
- set_axis_max_jerk(axis, DEFAULT_AXIS_MAX_JERK[a]);
- }
-
- m_state.filament_load_times.clear();
- m_state.filament_unload_times.clear();
- }
-
- void GCodeTimeEstimator::reset()
- {
- _reset_time();
-#if ENABLE_MOVE_STATS
- _moves_stats.clear();
-#endif // ENABLE_MOVE_STATS
- _reset_blocks();
- _reset();
- }
-
- float GCodeTimeEstimator::get_time() const
- {
- return m_time;
- }
-
- std::string GCodeTimeEstimator::get_time_dhms() const
- {
- return _get_time_dhms(get_time());
- }
-
- std::string GCodeTimeEstimator::get_time_dhm() const
- {
- return _get_time_dhm(get_time());
- }
-
- std::string GCodeTimeEstimator::get_time_minutes() const
- {
- return _get_time_minutes(get_time());
- }
-
- std::vector<std::pair<CustomGcodeType, float>> GCodeTimeEstimator::get_custom_gcode_times() const
- {
- return m_custom_gcode_times;
- }
-
- std::vector<std::string> GCodeTimeEstimator::get_color_times_dhms(bool include_remaining) const
- {
- std::vector<std::string> 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<std::string> GCodeTimeEstimator::get_color_times_minutes(bool include_remaining) const
- {
- std::vector<std::string> 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<std::pair<CustomGcodeType, std::string>> GCodeTimeEstimator::get_custom_gcode_times_dhm(bool include_remaining) const
- {
- std::vector<std::pair<CustomGcodeType, std::string>> 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_line_ids, G1LineIdToBlockId);
- 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);
-
- set_additional_time(0.0f);
-
- reset_extruder_id();
- reset_g1_line_id();
- m_g1_line_ids.clear();
-
- m_last_st_synchronized_block_id = -1;
-
- 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()
- {
- PROFILE_FUNC();
- _forward_pass();
- _reverse_pass();
- _recalculate_trapezoids();
-
- m_time += get_additional_time();
- m_custom_gcode_time_cache += get_additional_time();
-
- for (int i = m_last_st_synchronized_block_id + 1; i < (int)m_blocks.size(); ++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;
- block.elapsed_time = m_time;
-
-#if ENABLE_MOVE_STATS
- MovesStatsMap::iterator it = _moves_stats.find(block.move_type);
- if (it == _moves_stats.end())
- it = _moves_stats.insert(MovesStatsMap::value_type(block.move_type, MoveStats())).first;
-
- it->second.count += 1;
- it->second.time += block_time;
-#endif // ENABLE_MOVE_STATS
-
- m_custom_gcode_time_cache += block_time;
- }
-
- m_last_st_synchronized_block_id = (int)m_blocks.size() - 1;
- // The additional time has been consumed (added to the total time), reset it to zero.
- set_additional_time(0.);
- }
-
- 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;
- };
-
- 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;
- for (unsigned char a = X; a < Num_Axis; ++a)
- {
- block.delta_pos[a] = new_pos[a] - get_axis_position((EAxis)a);
- max_abs_delta = std::max(max_abs_delta, std::abs(block.delta_pos[a]));
- }
-
- // is it a move ?
- if (max_abs_delta == 0.0f)
- return;
-
- // calculates block feedrate
- m_curr.feedrate = std::max(get_feedrate(), block.is_travel_move() ? get_minimum_travel_feedrate() : get_minimum_feedrate());
-
- float distance = block.move_length();
- float invDistance = 1.0f / distance;
-
- float min_feedrate_factor = 1.0f;
- for (unsigned char a = X; a < Num_Axis; ++a)
- {
- m_curr.axis_feedrate[a] = m_curr.feedrate * block.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 = block.is_extruder_only_move() ? get_retract_acceleration() : get_acceleration();
-
- for (unsigned char a = X; a < Num_Axis; ++a)
- {
- float axis_max_acceleration = get_axis_max_acceleration((EAxis)a);
- if (acceleration * std::abs(block.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, 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 (block.delta_pos[E] < 0.0f)
- {
- if ((block.delta_pos[X] != 0.0f) || (block.delta_pos[Y] != 0.0f) || (block.delta_pos[Z] != 0.0f))
- block.move_type = Block::Move;
- else
- block.move_type = Block::Retract;
- }
- else if (block.delta_pos[E] > 0.0f)
- {
- if ((block.delta_pos[X] == 0.0f) && (block.delta_pos[Y] == 0.0f) && (block.delta_pos[Z] == 0.0f))
- block.move_type = Block::Unretract;
- else if ((block.delta_pos[X] != 0.0f) || (block.delta_pos[Y] != 0.0f))
- block.move_type = Block::Extrude;
- }
- else if ((block.delta_pos[X] != 0.0f) || (block.delta_pos[Y] != 0.0f) || (block.delta_pos[Z] != 0.0f))
- block.move_type = Block::Move;
-#endif // ENABLE_MOVE_STATS
-
- // adds block to blocks list
- m_blocks.emplace_back(block);
- m_g1_line_ids.emplace_back(G1LineIdToBlockIdMap::value_type(get_g1_line_id(), (unsigned int)m_blocks.size() - 1));
- }
-
- void GCodeTimeEstimator::_processG4(const GCodeReader::GCodeLine& line)
- {
- PROFILE_FUNC();
- GCodeFlavor dialect = get_dialect();
-
- float value;
- if (line.has_value('P', value))
- add_additional_time(value * MILLISEC_TO_SEC);
-
- // see: http://reprap.org/wiki/G-code#G4:_Dwell
- if ((dialect == gcfRepetier) ||
- (dialect == gcfMarlin) ||
- (dialect == gcfSmoothie) ||
- (dialect == gcfRepRap))
- {
- if (line.has_value('S', value))
- add_additional_time(value);
- }
-
- _simulate_st_synchronize();
- }
-
- 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();
-
- 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();
- }
-
- void GCodeTimeEstimator::_processM82(const GCodeReader::GCodeLine& line)
- {
- PROFILE_FUNC();
- set_e_local_positioning_type(Absolute);
- }
-
- void GCodeTimeEstimator::_processM83(const GCodeReader::GCodeLine& line)
- {
- PROFILE_FUNC();
- set_e_local_positioning_type(Relative);
- }
-
- void GCodeTimeEstimator::_processM109(const GCodeReader::GCodeLine& line)
- {
- PROFILE_FUNC();
- // TODO
- }
-
- void GCodeTimeEstimator::_processM201(const GCodeReader::GCodeLine& line)
- {
- PROFILE_FUNC();
- GCodeFlavor dialect = get_dialect();
-
- // see http://reprap.org/wiki/G-code#M201:_Set_max_printing_acceleration
- float factor = ((dialect != gcfRepRap) && (get_units() == GCodeTimeEstimator::Inches)) ? INCHES_TO_MM : 1.0f;
-
- if (line.has_x())
- set_axis_max_acceleration(X, line.x() * factor);
-
- if (line.has_y())
- set_axis_max_acceleration(Y, line.y() * factor);
-
- if (line.has_z())
- set_axis_max_acceleration(Z, line.z() * factor);
-
- if (line.has_e())
- set_axis_max_acceleration(E, line.e() * factor);
- }
-
- void GCodeTimeEstimator::_processM203(const GCodeReader::GCodeLine& line)
- {
- PROFILE_FUNC();
- GCodeFlavor dialect = get_dialect();
-
- // see http://reprap.org/wiki/G-code#M203:_Set_maximum_feedrate
- if (dialect == gcfRepetier)
- return;
-
- // see http://reprap.org/wiki/G-code#M203:_Set_maximum_feedrate
- // http://smoothieware.org/supported-g-codes
- float factor = (dialect == gcfMarlin || dialect == gcfSmoothie) ? 1.0f : MMMIN_TO_MMSEC;
-
- if (line.has_x())
- set_axis_max_feedrate(X, line.x() * factor);
-
- if (line.has_y())
- set_axis_max_feedrate(Y, line.y() * factor);
-
- if (line.has_z())
- set_axis_max_feedrate(Z, line.z() * factor);
-
- if (line.has_e())
- set_axis_max_feedrate(E, line.e() * factor);
- }
-
- void GCodeTimeEstimator::_processM204(const GCodeReader::GCodeLine& line)
- {
- PROFILE_FUNC();
- float value;
- if (line.has_value('S', value)) {
- // Legacy acceleration format. This format is used by the legacy Marlin, MK2 or MK3 firmware,
- // and it is also generated by Slic3r to control acceleration per extrusion type
- // (there is a separate acceleration settings in Slicer for perimeter, first layer etc).
- set_acceleration(value);
- if (line.has_value('T', value))
- set_retract_acceleration(value);
- } else {
- // New acceleration format, compatible with the upstream Marlin.
- if (line.has_value('P', value))
- set_acceleration(value);
- if (line.has_value('R', value))
- set_retract_acceleration(value);
- if (line.has_value('T', value)) {
- // Interpret the T value as the travel acceleration in the new Marlin format.
- //FIXME Prusa3D firmware currently does not support travel acceleration value independent from the extruding acceleration value.
- // set_travel_acceleration(value);
- }
- }
- }
-
- void GCodeTimeEstimator::_processM205(const GCodeReader::GCodeLine& line)
- {
- PROFILE_FUNC();
- if (line.has_x())
- {
- float max_jerk = line.x();
- set_axis_max_jerk(X, max_jerk);
- set_axis_max_jerk(Y, max_jerk);
- }
-
- if (line.has_y())
- set_axis_max_jerk(Y, line.y());
-
- if (line.has_z())
- set_axis_max_jerk(Z, line.z());
-
- if (line.has_e())
- set_axis_max_jerk(E, line.e());
-
- float value;
- if (line.has_value('S', value))
- set_minimum_feedrate(value);
-
- if (line.has_value('T', value))
- set_minimum_travel_feedrate(value);
- }
-
- void GCodeTimeEstimator::_processM221(const GCodeReader::GCodeLine& line)
- {
- PROFILE_FUNC();
- float value_s;
- float value_t;
- if (line.has_value('S', value_s) && !line.has_value('T', value_t))
- set_extrude_factor_override_percentage(value_s * 0.01f);
- }
-
- void GCodeTimeEstimator::_processM566(const GCodeReader::GCodeLine& line)
- {
- PROFILE_FUNC();
- if (line.has_x())
- set_axis_max_jerk(X, line.x() * MMMIN_TO_MMSEC);
-
- if (line.has_y())
- set_axis_max_jerk(Y, line.y() * MMMIN_TO_MMSEC);
-
- if (line.has_z())
- set_axis_max_jerk(Z, line.z() * MMMIN_TO_MMSEC);
-
- if (line.has_e())
- set_axis_max_jerk(E, line.e() * MMMIN_TO_MMSEC);
- }
-
- void GCodeTimeEstimator::_processM702(const GCodeReader::GCodeLine& line)
- {
- PROFILE_FUNC();
- if (line.has('C')) {
- // MK3 MMU2 specific M code:
- // M702 C is expected to be sent by the custom end G-code when finalizing a print.
- // The MK3 unit shall unload and park the active filament into the MMU2 unit.
- add_additional_time(get_filament_unload_time(get_extruder_id()));
- reset_extruder_id();
- _simulate_st_synchronize();
- }
- }
-
- 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.
- add_additional_time(get_filament_unload_time(get_extruder_id()));
- set_extruder_id(id);
- add_additional_time(get_filament_load_time(get_extruder_id()));
- _simulate_st_synchronize();
- }
- }
- }
-
- 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(cgtColorChange);
- return true;
- }
-
- // Pause_Print_Tag
- pos = comment.find(Pause_Print_Tag);
- if (pos != comment.npos)
- {
- _process_custom_gcode_tag(cgtPausePrint);
- return true;
- }
-
- return false;
- }
-
- void GCodeTimeEstimator::_process_custom_gcode_tag(CustomGcodeType code)
- {
- PROFILE_FUNC();
- m_needs_custom_gcode_times = true;
- _calculate_time();
- 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()
- {
- PROFILE_FUNC();
- _calculate_time();
- }
-
- void GCodeTimeEstimator::_forward_pass()
- {
- PROFILE_FUNC();
- if (m_blocks.size() > 1)
- {
- for (int i = m_last_st_synchronized_block_id + 1; i < (int)m_blocks.size() - 1; ++i)
- {
- _planner_forward_pass_kernel(m_blocks[i], m_blocks[i + 1]);
- }
- }
- }
-
- void GCodeTimeEstimator::_reverse_pass()
- {
- PROFILE_FUNC();
- if (m_blocks.size() > 1)
- {
- for (int i = (int)m_blocks.size() - 1; i >= m_last_st_synchronized_block_id + 2; --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.move_length()));
-
- // 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.move_length()));
- 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 (int i = m_last_st_synchronized_block_id + 1; i < (int)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 = std::round(time_in_secs / 60.);
- if (minutes <= 0) {
- ::sprintf(buffer, "%ds", (int)time_in_secs);
- } else {
- int days = minutes / 1440;
- minutes -= days * 1440;
- int hours = minutes / 60;
- minutes -= hours * 60;
- if (days > 0)
- ::sprintf(buffer, "%dd %dh %dm", days, hours, minutes);
- else if (hours > 0)
- ::sprintf(buffer, "%dh %dm", hours, minutes);
- else
- ::sprintf(buffer, "%dm", minutes);
- }
-
- return buffer;
- }
-
- std::string GCodeTimeEstimator::_get_time_minutes(float time_in_secs)
- {
- return std::to_string((int)(::roundf(time_in_secs / 60.0f)));
- }
-
-#if ENABLE_MOVE_STATS
- void GCodeTimeEstimator::_log_moves_stats() const
- {
- float moves_count = 0.0f;
- for (const MovesStatsMap::value_type& move : _moves_stats)
- {
- moves_count += (float)move.second.count;
- }
-
- for (const MovesStatsMap::value_type& move : _moves_stats)
- {
- std::cout << MOVE_TYPE_STR[move.first];
- std::cout << ": count " << move.second.count << " (" << 100.0f * (float)move.second.count / moves_count << "%)";
- std::cout << " - time: " << move.second.time << "s (" << 100.0f * move.second.time / m_time << "%)";
- std::cout << std::endl;
- }
- std::cout << std::endl;
- }
-#endif // ENABLE_MOVE_STATS
-}
diff --git a/src/libslic3r/GCodeTimeEstimator.hpp b/src/libslic3r/GCodeTimeEstimator.hpp
deleted file mode 100644
index 7c364d9eb..000000000
--- a/src/libslic3r/GCodeTimeEstimator.hpp
+++ /dev/null
@@ -1,498 +0,0 @@
-#ifndef slic3r_GCodeTimeEstimator_hpp_
-#define slic3r_GCodeTimeEstimator_hpp_
-
-#include "libslic3r.h"
-#include "PrintConfig.hpp"
-#include "GCodeReader.hpp"
-#include "CustomGCode.hpp"
-
-#define ENABLE_MOVE_STATS 0
-
-namespace Slic3r {
-
- //
- // Some of the algorithms used by class GCodeTimeEstimator were inpired by
- // Cura Engine's class TimeEstimateCalculator
- // https://github.com/Ultimaker/CuraEngine/blob/master/src/timeEstimate.h
- //
- class GCodeTimeEstimator
- {
- public:
- static const std::string Normal_First_M73_Output_Placeholder_Tag;
- static const std::string Silent_First_M73_Output_Placeholder_Tag;
- static const std::string Normal_Last_M73_Output_Placeholder_Tag;
- static const std::string Silent_Last_M73_Output_Placeholder_Tag;
-
- static const std::string Color_Change_Tag;
- static const std::string Pause_Print_Tag;
-
- enum EMode : unsigned char
- {
- Normal,
- Silent
- };
-
- enum EUnits : unsigned char
- {
- Millimeters,
- Inches
- };
-
- enum EAxis : unsigned char
- {
- X,
- Y,
- Z,
- E,
- Num_Axis
- };
-
- enum EPositioningType : unsigned char
- {
- Absolute,
- Relative
- };
-
- private:
- struct Axis
- {
- float position; // mm
- float origin; // mm
- float max_feedrate; // mm/s
- float max_acceleration; // mm/s^2
- float max_jerk; // mm/s
- };
-
- struct Feedrates
- {
- float feedrate; // mm/s
- float axis_feedrate[Num_Axis]; // mm/s
- float abs_axis_feedrate[Num_Axis]; // mm/s
- float safe_feedrate; // mm/s
-
- void reset();
- };
-
- struct State
- {
- GCodeFlavor dialect;
- EUnits units;
- EPositioningType global_positioning_type;
- EPositioningType e_local_positioning_type;
- Axis axis[Num_Axis];
- float feedrate; // mm/s
- float acceleration; // mm/s^2
- // hard limit for the acceleration, to which the firmware will clamp.
- float max_acceleration; // mm/s^2
- float retract_acceleration; // mm/s^2
- float additional_time; // s
- 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<float> filament_load_times;
- std::vector<float> 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 distance; // mm
- float accelerate_until; // mm
- float decelerate_after; // mm
- FeedrateProfile feedrate;
-
- float acceleration_time(float acceleration) const;
- float cruise_time() const;
- float deceleration_time(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 delta_pos[Num_Axis]; // mm
- float acceleration; // mm/s^2
- float max_entry_speed; // mm/s
- float safe_feedrate; // mm/s
-
- FeedrateProfile feedrate;
- Trapezoid trapezoid;
- float elapsed_time;
-
- Block();
-
- // Returns the length of the move covered by this block, in mm
- float move_length() const;
-
- // Returns true if this block is a retract/unretract move only
- float is_extruder_only_move() const;
-
- // Returns true if this block is a move with no extrusion
- float is_travel_move() const;
-
- // 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<Block> BlocksList;
-
-#if ENABLE_MOVE_STATS
- struct MoveStats
- {
- unsigned int count;
- float time;
-
- MoveStats();
- };
-
- typedef std::map<Block::EMoveType, MoveStats> MovesStatsMap;
-#endif // ENABLE_MOVE_STATS
-
- public:
- typedef std::pair<unsigned int, unsigned int> G1LineIdToBlockId;
- typedef std::vector<G1LineIdToBlockId> G1LineIdToBlockIdMap;
-
- struct PostProcessData
- {
- const G1LineIdToBlockIdMap& g1_line_ids;
- const BlocksList& blocks;
- float time;
-
- PostProcessData(const G1LineIdToBlockIdMap& g1_line_ids, const BlocksList& blocks, float time) : g1_line_ids(g1_line_ids), blocks(blocks), time(time) {}
- };
-
- private:
- EMode m_mode;
- GCodeReader m_parser;
- State m_state;
- Feedrates m_curr;
- Feedrates m_prev;
- BlocksList m_blocks;
- // Map between g1 line id and blocks id, used to speed up export of remaining times
- G1LineIdToBlockIdMap m_g1_line_ids;
- // Index of the last block already st_synchronized
- int m_last_st_synchronized_block_id;
- float m_time; // s
-
- // data to calculate custom code times
- bool m_needs_custom_gcode_times;
- std::vector<std::pair<CustomGcodeType, float>> 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<std::string>& gcode_lines);
-
- // Process the gcode contained in the file with the given filename,
- // replacing placeholders with correspondent new lines M73
- // placing new lines M73 (containing the remaining time) where needed (in dependence of the given interval in seconds)
- // and removing working tags (as those used for color changes)
- // if normal_mode == nullptr no M73 line will be added for normal mode
- // if silent_mode == nullptr no M73 line will be added for silent mode
- static bool post_process(const std::string& filename, float interval_sec, const PostProcessData* const normal_mode, const PostProcessData* const silent_mode);
-
- // Set current position on the given axis with the given value
- void set_axis_position(EAxis axis, float position);
- // Set current origin on the given axis with the given value
- void set_axis_origin(EAxis axis, float position);
-
- void set_axis_max_feedrate(EAxis axis, float feedrate_mm_sec);
- void set_axis_max_acceleration(EAxis axis, float acceleration);
- void set_axis_max_jerk(EAxis axis, float jerk);
-
- // Returns current position on the given axis
- float get_axis_position(EAxis axis) const;
- // Returns current origin on the given axis
- float get_axis_origin(EAxis axis) const;
-
- float get_axis_max_feedrate(EAxis axis) const;
- float get_axis_max_acceleration(EAxis axis) const;
- float get_axis_max_jerk(EAxis axis) const;
-
- void set_feedrate(float feedrate_mm_sec);
- float get_feedrate() const;
-
- void set_acceleration(float acceleration_mm_sec2);
- float get_acceleration() const;
-
- // Maximum acceleration for the machine. The firmware simulator will clamp the M204 Sxxx to this maximum.
- void set_max_acceleration(float acceleration_mm_sec2);
- float get_max_acceleration() const;
-
- void set_retract_acceleration(float acceleration_mm_sec2);
- float get_retract_acceleration() const;
-
- void set_minimum_feedrate(float feedrate_mm_sec);
- float get_minimum_feedrate() const;
-
- void set_minimum_travel_feedrate(float feedrate_mm_sec);
- float get_minimum_travel_feedrate() const;
-
- void set_filament_load_times(const std::vector<double> &filament_load_times);
- void set_filament_unload_times(const std::vector<double> &filament_unload_times);
- float get_filament_load_time(unsigned int id_extruder);
- float get_filament_unload_time(unsigned int id_extruder);
-
- void set_extrude_factor_override_percentage(float percentage);
- float get_extrude_factor_override_percentage() const;
-
- void set_dialect(GCodeFlavor dialect);
- GCodeFlavor get_dialect() const;
-
- void set_units(EUnits units);
- EUnits get_units() const;
-
- void set_global_positioning_type(EPositioningType type);
- EPositioningType get_global_positioning_type() const;
-
- void set_e_local_positioning_type(EPositioningType type);
- EPositioningType get_e_local_positioning_type() const;
-
- int get_g1_line_id() const;
- void increment_g1_line_id();
- void reset_g1_line_id();
-
- void set_extrusion_axis(char axis) { m_parser.set_extrusion_axis(axis); }
-
- void set_extruder_id(unsigned int id);
- unsigned int get_extruder_id() const;
- void reset_extruder_id();
-
- void add_additional_time(float timeSec);
- void set_additional_time(float timeSec);
- float get_additional_time() const;
-
- void set_default();
-
- // Call this method before to start adding lines using add_gcode_line() when reusing an instance of GCodeTimeEstimator
- void reset();
-
- // Returns the estimated time, in seconds
- float get_time() const;
-
- // Returns the estimated time, in format DDd HHh MMm SSs
- std::string get_time_dhms() const;
-
- // Returns the estimated time, in format DDd HHh MMm
- std::string get_time_dhm() const;
-
- // Returns the estimated time, in minutes (integer)
- std::string get_time_minutes() const;
-
- // Returns the estimated time, in seconds, for each custom gcode
- std::vector<std::pair<CustomGcodeType, float>> 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<std::string> 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<std::string> get_color_times_minutes(bool include_remaining) const;
-
- // Returns the estimated time, in format DDd HHh MMm, for each custom_gcode
- // If include_remaining==true the strings will be formatted as: "time for custom_gcode (remaining time at color start)"
- std::vector<std::pair<CustomGcodeType, std::string>> 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_line_ids, m_blocks, m_time); }
-
- private:
- void _reset();
- void _reset_time();
- void _reset_blocks();
-
- // Calculates the time estimate
- void _calculate_time();
-
- // 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(CustomGcodeType code);
-
- // Simulates firmware st_synchronize() call
- void _simulate_st_synchronize();
-
- 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 /* slic3r_GCodeTimeEstimator_hpp_ */
diff --git a/src/libslic3r/GCodeWriter.cpp b/src/libslic3r/GCodeWriter.cpp
index 38a1c3ebe..b35387762 100644
--- a/src/libslic3r/GCodeWriter.cpp
+++ b/src/libslic3r/GCodeWriter.cpp
@@ -9,7 +9,7 @@
#define FLAVOR_IS(val) this->config.gcode_flavor == val
#define FLAVOR_IS_NOT(val) this->config.gcode_flavor != val
#define COMMENT(comment) if (this->config.gcode_comments && !comment.empty()) gcode << " ; " << comment;
-#define PRECISION(val, precision) std::fixed << std::setprecision(precision) << val
+#define PRECISION(val, precision) std::fixed << std::setprecision(precision) << (val)
#define XYZF_NUM(val) PRECISION(val, 3)
#define E_NUM(val) PRECISION(val, 5)
@@ -20,7 +20,7 @@ void GCodeWriter::apply_print_config(const PrintConfig &print_config)
this->config.apply(print_config, true);
m_extrusion_axis = this->config.get_extrusion_axis();
m_single_extruder_multi_material = print_config.single_extruder_multi_material.value;
- m_max_acceleration = std::lrint((print_config.gcode_flavor.value == gcfMarlin) ?
+ m_max_acceleration = std::lrint((print_config.gcode_flavor.value == gcfMarlin && print_config.machine_limits_usage.value == MachineLimitsUsage::EmitToGCode) ?
print_config.machine_max_acceleration_extruding.values.front() : 0);
}
@@ -46,7 +46,13 @@ std::string GCodeWriter::preamble()
gcode << "G21 ; set units to millimeters\n";
gcode << "G90 ; use absolute coordinates\n";
}
- if (FLAVOR_IS(gcfRepRap) || FLAVOR_IS(gcfMarlin) || FLAVOR_IS(gcfTeacup) || FLAVOR_IS(gcfRepetier) || FLAVOR_IS(gcfSmoothie)) {
+ if (FLAVOR_IS(gcfRepRapSprinter) ||
+ FLAVOR_IS(gcfRepRapFirmware) ||
+ FLAVOR_IS(gcfMarlin) ||
+ FLAVOR_IS(gcfTeacup) ||
+ FLAVOR_IS(gcfRepetier) ||
+ FLAVOR_IS(gcfSmoothie))
+ {
if (this->config.use_relative_e_distances) {
gcode << "M83 ; use relative distances for extrusion\n";
} else {
@@ -72,11 +78,15 @@ std::string GCodeWriter::set_temperature(unsigned int temperature, bool wait, in
return "";
std::string code, comment;
- if (wait && FLAVOR_IS_NOT(gcfTeacup)) {
+ if (wait && FLAVOR_IS_NOT(gcfTeacup) && FLAVOR_IS_NOT(gcfRepRapFirmware)) {
code = "M109";
comment = "set temperature and wait for it to be reached";
} else {
- code = "M104";
+ if (FLAVOR_IS(gcfRepRapFirmware)) { // M104 is deprecated on RepRapFirmware
+ code = "G10";
+ } else {
+ code = "M104";
+ }
comment = "set temperature";
}
@@ -88,14 +98,17 @@ std::string GCodeWriter::set_temperature(unsigned int temperature, bool wait, in
gcode << "S";
}
gcode << temperature;
- if (tool != -1 &&
- ( (this->multiple_extruders && ! m_single_extruder_multi_material) ||
- FLAVOR_IS(gcfMakerWare) || FLAVOR_IS(gcfSailfish)) ) {
- gcode << " T" << tool;
+ bool multiple_tools = this->multiple_extruders && ! m_single_extruder_multi_material;
+ if (tool != -1 && (multiple_tools || FLAVOR_IS(gcfMakerWare) || FLAVOR_IS(gcfSailfish)) ) {
+ if (FLAVOR_IS(gcfRepRapFirmware)) {
+ gcode << " P" << tool;
+ } else {
+ gcode << " T" << tool;
+ }
}
gcode << " ; " << comment << "\n";
- if (FLAVOR_IS(gcfTeacup) && wait)
+ if ((FLAVOR_IS(gcfTeacup) || FLAVOR_IS(gcfRepRapFirmware)) && wait)
gcode << "M116 ; wait for temperature to be reached\n";
return gcode.str();
@@ -445,7 +458,7 @@ std::string GCodeWriter::_retract(double length, double restart_extra, const std
gcode << "G10 ; retract\n";
} else {
gcode << "G1 " << m_extrusion_axis << E_NUM(m_extruder->E())
- << " F" << float(m_extruder->retract_speed() * 60.);
+ << " F" << XYZF_NUM(m_extruder->retract_speed() * 60.);
COMMENT(comment);
gcode << "\n";
}
@@ -475,7 +488,7 @@ std::string GCodeWriter::unretract()
} else {
// use G1 instead of G0 because G0 will blend the restart with the previous travel move
gcode << "G1 " << m_extrusion_axis << E_NUM(m_extruder->E())
- << " F" << float(m_extruder->deretract_speed() * 60.);
+ << " F" << XYZF_NUM(m_extruder->deretract_speed() * 60.);
if (this->config.gcode_comments) gcode << " ; unretract";
gcode << "\n";
}
diff --git a/src/libslic3r/Geometry.cpp b/src/libslic3r/Geometry.cpp
index b9e4d6e78..45730dd9f 100644
--- a/src/libslic3r/Geometry.cpp
+++ b/src/libslic3r/Geometry.cpp
@@ -1,4 +1,5 @@
#include "libslic3r.h"
+#include "Exception.hpp"
#include "Geometry.hpp"
#include "ClipperUtils.hpp"
#include "ExPolygon.hpp"
@@ -337,19 +338,19 @@ double rad2deg_dir(double angle)
return rad2deg(angle);
}
-Point circle_taubin_newton(const Points::const_iterator& input_begin, const Points::const_iterator& input_end, size_t cycles)
+Point circle_center_taubin_newton(const Points::const_iterator& input_begin, const Points::const_iterator& input_end, size_t cycles)
{
Vec2ds tmp;
tmp.reserve(std::distance(input_begin, input_end));
std::transform(input_begin, input_end, std::back_inserter(tmp), [] (const Point& in) { return unscale(in); } );
- Vec2d center = circle_taubin_newton(tmp.cbegin(), tmp.end(), cycles);
+ Vec2d center = circle_center_taubin_newton(tmp.cbegin(), tmp.end(), cycles);
return Point::new_scale(center.x(), center.y());
}
/// Adapted from work in "Circular and Linear Regression: Fitting circles and lines by least squares", pg 126
/// Returns a point corresponding to the center of a circle for which all of the points from input_begin to input_end
/// lie on.
-Vec2d circle_taubin_newton(const Vec2ds::const_iterator& input_begin, const Vec2ds::const_iterator& input_end, size_t cycles)
+Vec2d circle_center_taubin_newton(const Vec2ds::const_iterator& input_begin, const Vec2ds::const_iterator& input_end, size_t cycles)
{
// calculate the centroid of the data set
const Vec2d sum = std::accumulate(input_begin, input_end, Vec2d(0,0));
@@ -471,7 +472,7 @@ Pointfs arrange(size_t num_parts, const Vec2d &part_size, coordf_t gap, const Bo
size_t cellw = size_t(floor((bed_bbox.size()(0) + gap) / cell_size(0)));
size_t cellh = size_t(floor((bed_bbox.size()(1) + gap) / cell_size(1)));
if (num_parts > cellw * cellh)
- throw std::invalid_argument(PRINTF_ZU " parts won't fit in your print area!\n", num_parts);
+ throw Slic3r::InvalidArgument("%zu parts won't fit in your print area!\n", num_parts);
// Get a bounding box of cellw x cellh cells, centered at the center of the bed.
Vec2d cells_size(cellw * cell_size(0) - gap, cellh * cell_size(1) - gap);
@@ -1222,7 +1223,7 @@ Vec3d extract_euler_angles(const Eigen::Matrix<double, 3, 3, Eigen::DontAlign>&
// reference: http://www.gregslabaugh.net/publications/euler.pdf
Vec3d angles1 = Vec3d::Zero();
Vec3d angles2 = Vec3d::Zero();
- if (is_approx(std::abs(rotation_matrix(2, 0)), 1.0))
+ if (std::abs(std::abs(rotation_matrix(2, 0)) - 1.0) < 1e-5)
{
angles1(2) = 0.0;
if (rotation_matrix(2, 0) < 0.0) // == -1.0
diff --git a/src/libslic3r/Geometry.hpp b/src/libslic3r/Geometry.hpp
index 1fa15ba63..f8d3b0a5c 100644
--- a/src/libslic3r/Geometry.hpp
+++ b/src/libslic3r/Geometry.hpp
@@ -10,6 +10,7 @@
// Serialization through the Cereal library
#include <cereal/access.hpp>
+#define BOOST_VORONOI_USE_GMP 1
#include "boost/polygon/voronoi.hpp"
namespace ClipperLib {
@@ -114,32 +115,145 @@ inline bool segment_segment_intersection(const Vec2d &p1, const Vec2d &v1, const
return true;
}
-
-inline int segments_could_intersect(
+inline bool segments_intersect(
const Slic3r::Point &ip1, const Slic3r::Point &ip2,
const Slic3r::Point &jp1, const Slic3r::Point &jp2)
+{
+ assert(ip1 != ip2);
+ assert(jp1 != jp2);
+
+ auto segments_could_intersect = [](
+ const Slic3r::Point &ip1, const Slic3r::Point &ip2,
+ const Slic3r::Point &jp1, const Slic3r::Point &jp2) -> std::pair<int, int>
+ {
+ Vec2i64 iv = (ip2 - ip1).cast<int64_t>();
+ Vec2i64 vij1 = (jp1 - ip1).cast<int64_t>();
+ Vec2i64 vij2 = (jp2 - ip1).cast<int64_t>();
+ int64_t tij1 = cross2(iv, vij1);
+ int64_t tij2 = cross2(iv, vij2);
+ return std::make_pair(
+ // signum
+ (tij1 > 0) ? 1 : ((tij1 < 0) ? -1 : 0),
+ (tij2 > 0) ? 1 : ((tij2 < 0) ? -1 : 0));
+ };
+
+ std::pair<int, int> sign1 = segments_could_intersect(ip1, ip2, jp1, jp2);
+ std::pair<int, int> sign2 = segments_could_intersect(jp1, jp2, ip1, ip2);
+ int test1 = sign1.first * sign1.second;
+ int test2 = sign2.first * sign2.second;
+ if (test1 <= 0 && test2 <= 0) {
+ // The segments possibly intersect. They may also be collinear, but not intersect.
+ if (test1 != 0 || test2 != 0)
+ // Certainly not collinear, then the segments intersect.
+ return true;
+ // If the first segment is collinear with the other, the other is collinear with the first segment.
+ assert((sign1.first == 0 && sign1.second == 0) == (sign2.first == 0 && sign2.second == 0));
+ if (sign1.first == 0 && sign1.second == 0) {
+ // The segments are certainly collinear. Now verify whether they overlap.
+ Slic3r::Point vi = ip2 - ip1;
+ // Project both on the longer coordinate of vi.
+ int axis = std::abs(vi.x()) > std::abs(vi.y()) ? 0 : 1;
+ coord_t i = ip1(axis);
+ coord_t j = ip2(axis);
+ coord_t k = jp1(axis);
+ coord_t l = jp2(axis);
+ if (i > j)
+ std::swap(i, j);
+ if (k > l)
+ std::swap(k, l);
+ return (k >= i && k <= j) || (i >= k && i <= l);
+ }
+ }
+ return false;
+}
+
+template<typename T> inline T foot_pt(const T &line_pt, const T &line_dir, const T &pt)
{
- Vec2i64 iv = (ip2 - ip1).cast<int64_t>();
- Vec2i64 vij1 = (jp1 - ip1).cast<int64_t>();
- Vec2i64 vij2 = (jp2 - ip1).cast<int64_t>();
- int64_t tij1 = cross2(iv, vij1);
- int64_t tij2 = cross2(iv, vij2);
- int sij1 = (tij1 > 0) ? 1 : ((tij1 < 0) ? -1 : 0); // signum
- int sij2 = (tij2 > 0) ? 1 : ((tij2 < 0) ? -1 : 0);
- return sij1 * sij2;
+ T v = pt - line_pt;
+ auto l2 = line_dir.squaredNorm();
+ auto t = (l2 == 0) ? 0 : v.dot(line_dir) / l2;
+ return line_pt + line_dir * t;
}
-inline bool segments_intersect(
- const Slic3r::Point &ip1, const Slic3r::Point &ip2,
- const Slic3r::Point &jp1, const Slic3r::Point &jp2)
+inline Vec2d foot_pt(const Line &iline, const Point &ipt)
+{
+ return foot_pt<Vec2d>(iline.a.cast<double>(), (iline.b - iline.a).cast<double>(), ipt.cast<double>());
+}
+
+template<typename T> inline auto ray_point_distance_squared(const T &ray_pt, const T &ray_dir, const T &pt)
{
- return segments_could_intersect(ip1, ip2, jp1, jp2) <= 0 &&
- segments_could_intersect(jp1, jp2, ip1, ip2) <= 0;
+ return (foot_pt(ray_pt, ray_dir, pt) - pt).squaredNorm();
+}
+
+template<typename T> inline auto ray_point_distance(const T &ray_pt, const T &ray_dir, const T &pt)
+{
+ return (foot_pt(ray_pt, ray_dir, pt) - pt).norm();
+}
+
+inline double ray_point_distance_squared(const Line &iline, const Point &ipt)
+{
+ return (foot_pt(iline, ipt) - ipt.cast<double>()).squaredNorm();
+}
+
+inline double ray_point_distance(const Line &iline, const Point &ipt)
+{
+ return (foot_pt(iline, ipt) - ipt.cast<double>()).norm();
}
// Based on Liang-Barsky function by Daniel White @ http://www.skytopia.com/project/articles/compsci/clipping.html
template<typename T>
-bool liang_barsky_line_clipping(
+inline bool liang_barsky_line_clipping_interval(
+ // Start and end points of the source line, result will be stored there as well.
+ const Eigen::Matrix<T, 2, 1, Eigen::DontAlign> &x0,
+ const Eigen::Matrix<T, 2, 1, Eigen::DontAlign> &v,
+ // Bounding box to clip with.
+ const BoundingBoxBase<Eigen::Matrix<T, 2, 1, Eigen::DontAlign>> &bbox,
+ std::pair<double, double> &out_interval)
+{
+ double t0 = 0.0;
+ double t1 = 1.0;
+ // Traverse through left, right, bottom, top edges.
+ auto clip_side = [&x0, &v, &bbox, &t0, &t1](double p, double q) -> bool {
+ if (p == 0) {
+ if (q < 0)
+ // Line parallel to the bounding box edge is fully outside of the bounding box.
+ return false;
+ // else don't clip
+ } else {
+ double r = q / p;
+ if (p < 0) {
+ if (r > t1)
+ // Fully clipped.
+ return false;
+ if (r > t0)
+ // Partially clipped.
+ t0 = r;
+ } else {
+ assert(p > 0);
+ if (r < t0)
+ // Fully clipped.
+ return false;
+ if (r < t1)
+ // Partially clipped.
+ t1 = r;
+ }
+ }
+ return true;
+ };
+
+ if (clip_side(- v.x(), - bbox.min.x() + x0.x()) &&
+ clip_side( v.x(), bbox.max.x() - x0.x()) &&
+ clip_side(- v.y(), - bbox.min.y() + x0.y()) &&
+ clip_side( v.y(), bbox.max.y() - x0.y())) {
+ out_interval.first = t0;
+ out_interval.second = t1;
+ return true;
+ }
+ return false;
+}
+
+template<typename T>
+inline bool liang_barsky_line_clipping(
// Start and end points of the source line, result will be stored there as well.
Eigen::Matrix<T, 2, 1, Eigen::DontAlign> &x0,
Eigen::Matrix<T, 2, 1, Eigen::DontAlign> &x1,
@@ -147,50 +261,14 @@ bool liang_barsky_line_clipping(
const BoundingBoxBase<Eigen::Matrix<T, 2, 1, Eigen::DontAlign>> &bbox)
{
Eigen::Matrix<T, 2, 1, Eigen::DontAlign> v = x1 - x0;
- double t0 = 0.0;
- double t1 = 1.0;
-
- // Traverse through left, right, bottom, top edges.
- for (int edge = 0; edge < 4; ++ edge)
- {
- double p, q;
- switch (edge) {
- case 0: p = - v.x(); q = - bbox.min.x() + x0.x(); break;
- case 1: p = v.x(); q = bbox.max.x() - x0.x(); break;
- case 2: p = - v.y(); q = - bbox.min.y() + x0.y(); break;
- default: p = v.y(); q = bbox.max.y() - x0.y(); break;
- }
-
- if (p == 0) {
- if (q < 0)
- // Line parallel to the bounding box edge is fully outside of the bounding box.
- return false;
- // else don't clip
- } else {
- double r = q / p;
- if (p < 0) {
- if (r > t1)
- // Fully clipped.
- return false;
- if (r > t0)
- // Partially clipped.
- t0 = r;
- } else {
- assert(p > 0);
- if (r < t0)
- // Fully clipped.
- return false;
- if (r < t1)
- // Partially clipped.
- t1 = r;
- }
- }
+ std::pair<double, double> interval;
+ if (liang_barsky_line_clipping_interval(x0, v, bbox, interval)) {
+ // Clipped successfully.
+ x1 = x0 + interval.second * v;
+ x0 += interval.first * v;
+ return true;
}
-
- // Clipped successfully.
- x1 = x0 + t1 * v;
- x0 += t0 * v;
- return true;
+ return false;
}
// Based on Liang-Barsky function by Daniel White @ http://www.skytopia.com/project/articles/compsci/clipping.html
@@ -210,6 +288,35 @@ bool liang_barsky_line_clipping(
return liang_barsky_line_clipping(x0clip, x1clip, bbox);
}
+// Ugly named variant, that accepts the squared line
+// Don't call me with a nearly zero length vector!
+template<typename T>
+int ray_circle_intersections_r2_lv2_c(T r2, T a, T b, T lv2, T c, std::pair<Eigen::Matrix<T, 2, 1, Eigen::DontAlign>, Eigen::Matrix<T, 2, 1, Eigen::DontAlign>> &out)
+{
+ T x0 = - a * c / lv2;
+ T y0 = - b * c / lv2;
+ T d = r2 - c * c / lv2;
+ if (d < T(0))
+ return 0;
+ T mult = sqrt(d / lv2);
+ out.first.x() = x0 + b * mult;
+ out.first.y() = y0 - a * mult;
+ out.second.x() = x0 - b * mult;
+ out.second.y() = y0 + a * mult;
+ return mult == T(0) ? 1 : 2;
+}
+template<typename T>
+int ray_circle_intersections(T r, T a, T b, T c, std::pair<Eigen::Matrix<T, 2, 1, Eigen::DontAlign>, Eigen::Matrix<T, 2, 1, Eigen::DontAlign>> &out)
+{
+ T lv2 = a * a + b * b;
+ if (lv2 < T(SCALED_EPSILON * SCALED_EPSILON)) {
+ //FIXME what is the correct epsilon?
+ // What if the line touches the circle?
+ return false;
+ }
+ return ray_circle_intersections_r2_lv2_c2(r * r, a, b, a * a + b * b, c, out);
+}
+
Pointf3s convex_hull(Pointf3s points);
Polygon convex_hull(Points points);
Polygon convex_hull(const Polygons &polygons);
@@ -218,7 +325,7 @@ bool directions_parallel(double angle1, double angle2, double max_diff = 0);
template<class T> bool contains(const std::vector<T> &vector, const Point &point);
template<typename T> T rad2deg(T angle) { return T(180.0) * angle / T(PI); }
double rad2deg_dir(double angle);
-template<typename T> T deg2rad(T angle) { return T(PI) * angle / T(180.0); }
+template<typename T> constexpr T deg2rad(const T angle) { return T(PI) * angle / T(180.0); }
template<typename T> T angle_to_0_2PI(T angle)
{
static const T TWO_PI = T(2) * T(PI);
@@ -235,12 +342,12 @@ template<typename T> T angle_to_0_2PI(T angle)
}
/// Find the center of the circle corresponding to the vector of Points as an arc.
-Point circle_taubin_newton(const Points::const_iterator& input_start, const Points::const_iterator& input_end, size_t cycles = 20);
-inline Point circle_taubin_newton(const Points& input, size_t cycles = 20) { return circle_taubin_newton(input.cbegin(), input.cend(), cycles); }
+Point circle_center_taubin_newton(const Points::const_iterator& input_start, const Points::const_iterator& input_end, size_t cycles = 20);
+inline Point circle_center_taubin_newton(const Points& input, size_t cycles = 20) { return circle_center_taubin_newton(input.cbegin(), input.cend(), cycles); }
/// Find the center of the circle corresponding to the vector of Pointfs as an arc.
-Vec2d circle_taubin_newton(const Vec2ds::const_iterator& input_start, const Vec2ds::const_iterator& input_end, size_t cycles = 20);
-inline Vec2d circle_taubin_newton(const Vec2ds& input, size_t cycles = 20) { return circle_taubin_newton(input.cbegin(), input.cend(), cycles); }
+Vec2d circle_center_taubin_newton(const Vec2ds::const_iterator& input_start, const Vec2ds::const_iterator& input_end, size_t cycles = 20);
+inline Vec2d circle_center_taubin_newton(const Vec2ds& input, size_t cycles = 20) { return circle_center_taubin_newton(input.cbegin(), input.cend(), cycles); }
void simplify_polygons(const Polygons &polygons, double tolerance, Polygons* retval);
@@ -251,8 +358,16 @@ bool arrange(
// output
Pointfs &positions);
+class VoronoiDiagram : public boost::polygon::voronoi_diagram<double> {
+public:
+ typedef double coord_type;
+ typedef boost::polygon::point_data<coordinate_type> point_type;
+ typedef boost::polygon::segment_data<coordinate_type> segment_type;
+ typedef boost::polygon::rectangle_data<coordinate_type> rect_type;
+};
+
class MedialAxis {
- public:
+public:
Lines lines;
const ExPolygon* expolygon;
double max_width;
@@ -262,14 +377,8 @@ class MedialAxis {
void build(ThickPolylines* polylines);
void build(Polylines* polylines);
- private:
- class VD : public boost::polygon::voronoi_diagram<double> {
- public:
- typedef double coord_type;
- typedef boost::polygon::point_data<coordinate_type> point_type;
- typedef boost::polygon::segment_data<coordinate_type> segment_type;
- typedef boost::polygon::rectangle_data<coordinate_type> rect_type;
- };
+private:
+ using VD = VoronoiDiagram;
VD vd;
std::set<const VD::edge_type*> edges, valid_edges;
std::map<const VD::edge_type*, std::pair<coordf_t,coordf_t> > thickness;
diff --git a/src/libslic3r/Layer.cpp b/src/libslic3r/Layer.cpp
index 29b20d2e1..975274445 100644
--- a/src/libslic3r/Layer.cpp
+++ b/src/libslic3r/Layer.cpp
@@ -64,19 +64,30 @@ void Layer::make_slices()
this->lslices.emplace_back(std::move(slices[i]));
}
-// Merge typed slices into untyped slices. This method is used to revert the effects of detect_surfaces_type() called for posPrepareInfill.
-void Layer::merge_slices()
+static inline bool layer_needs_raw_backup(const Layer *layer)
{
- if (m_regions.size() == 1 && (this->id() > 0 || this->object()->config().elefant_foot_compensation.value == 0)) {
- // Optimization, also more robust. Don't merge classified pieces of layerm->slices,
- // but use the non-split islands of a layer. For a single region print, these shall be equal.
- // Don't use this optimization on 1st layer with Elephant foot compensation applied, as this->lslices are uncompensated,
- // while regions are compensated.
- m_regions.front()->slices.set(this->lslices, stInternal);
+ return ! (layer->regions().size() == 1 && (layer->id() > 0 || layer->object()->config().elefant_foot_compensation.value == 0));
+}
+
+void Layer::backup_untyped_slices()
+{
+ if (layer_needs_raw_backup(this)) {
+ for (LayerRegion *layerm : m_regions)
+ layerm->raw_slices = to_expolygons(layerm->slices.surfaces);
} else {
+ assert(m_regions.size() == 1);
+ m_regions.front()->raw_slices.clear();
+ }
+}
+
+void Layer::restore_untyped_slices()
+{
+ if (layer_needs_raw_backup(this)) {
for (LayerRegion *layerm : m_regions)
- // without safety offset, artifacts are generated (upstream Slic3r GH #2494)
- layerm->slices.set(union_ex(to_polygons(std::move(layerm->slices.surfaces)), true), stInternal);
+ layerm->slices.set(layerm->raw_slices, stInternal);
+ } else {
+ assert(m_regions.size() == 1);
+ m_regions.front()->slices.set(this->lslices, stInternal);
}
}
diff --git a/src/libslic3r/Layer.hpp b/src/libslic3r/Layer.hpp
index d66aa8f01..508269f1a 100644
--- a/src/libslic3r/Layer.hpp
+++ b/src/libslic3r/Layer.hpp
@@ -13,6 +13,10 @@ class Layer;
class PrintRegion;
class PrintObject;
+namespace FillAdaptive {
+ struct Octree;
+};
+
class LayerRegion
{
public:
@@ -24,6 +28,10 @@ public:
// collection of surfaces generated by slicing the original geometry
// divided by type top/bottom/internal
SurfaceCollection slices;
+ // Backed up slices before they are split into top/bottom/internal.
+ // Only backed up for multi-region layers or layers with elephant foot compensation.
+ //FIXME Review whether not to simplify the code by keeping the raw_slices all the time.
+ ExPolygons raw_slices;
// collection of extrusion paths/loops filling gaps
// These fills are generated by the perimeter generator.
@@ -36,11 +44,6 @@ public:
// collection of surfaces for infill generation
SurfaceCollection fill_surfaces;
- // Collection of perimeter surfaces. This is a cached result of diff(slices, fill_surfaces).
- // While not necessary, the memory consumption is meager and it speeds up calculation.
- // The perimeter_surfaces keep the IDs of the slices (top/bottom/)
- SurfaceCollection perimeter_surfaces;
-
// collection of expolygons representing the bridged areas (thus not
// needing support material)
Polygons bridged;
@@ -126,8 +129,10 @@ public:
// Test whether whether there are any slices assigned to this layer.
bool empty() const;
void make_slices();
- // Merge typed slices into untyped slices. This method is used to revert the effects of detect_surfaces_type() called for posPrepareInfill.
- void merge_slices();
+ // Backup and restore raw sliced regions if needed.
+ //FIXME Review whether not to simplify the code by keeping the raw_slices all the time.
+ void backup_untyped_slices();
+ void restore_untyped_slices();
// Slices merged into islands, to be used by the elephant foot compensation to trim the individual surfaces with the shrunk merged slices.
ExPolygons merged(float offset) const;
template <class T> bool any_internal_region_slice_contains(const T &item) const {
@@ -139,7 +144,9 @@ public:
return false;
}
void make_perimeters();
- void make_fills();
+ void make_fills() { this->make_fills(nullptr, nullptr); };
+ void make_fills(FillAdaptive::Octree* adaptive_fill_octree, FillAdaptive::Octree* support_fill_octree);
+ void make_ironing();
void export_region_slices_to_svg(const char *path) const;
void export_region_fill_surfaces_to_svg(const char *path) const;
@@ -170,6 +177,7 @@ class SupportLayer : public Layer
{
public:
// Polygons covered by the supports: base, interface and contact areas.
+ // Used to suppress retraction if moving for a support extrusion over these support_islands.
ExPolygonCollection support_islands;
// Extrusion paths for the support base and for the support interface and contacts.
ExtrusionEntityCollection support_fills;
diff --git a/src/libslic3r/LayerRegion.cpp b/src/libslic3r/LayerRegion.cpp
index 19907d6de..5ce56896d 100644
--- a/src/libslic3r/LayerRegion.cpp
+++ b/src/libslic3r/LayerRegion.cpp
@@ -54,15 +54,23 @@ void LayerRegion::make_perimeters(const SurfaceCollection &slices, SurfaceCollec
{
this->perimeters.clear();
this->thin_fills.clear();
-
+
+ const PrintConfig &print_config = this->layer()->object()->print()->config();
+ const PrintRegionConfig &region_config = this->region()->config();
+ // This needs to be in sync with PrintObject::_slice() slicing_mode_normal_below_layer!
+ bool spiral_vase = print_config.spiral_vase &&
+ (this->layer()->id() >= region_config.bottom_solid_layers.value &&
+ this->layer()->print_z >= region_config.bottom_solid_min_thickness - EPSILON);
+
PerimeterGenerator g(
// input:
&slices,
this->layer()->height,
this->flow(frPerimeter),
- &this->region()->config(),
+ &region_config,
&this->layer()->object()->config(),
- &this->layer()->object()->print()->config(),
+ &print_config,
+ spiral_vase,
// output:
&this->perimeters,
@@ -264,7 +272,7 @@ void LayerRegion::process_external_surfaces(const Layer *lower_layer, const Poly
this->flow(frInfill, true).scaled_width()
);
#ifdef SLIC3R_DEBUG
- printf("Processing bridge at layer " PRINTF_ZU ":\n", this->layer()->id());
+ printf("Processing bridge at layer %zu:\n", this->layer()->id());
#endif
double custom_angle = Geometry::deg2rad(this->region()->config().bridge_angle.value);
if (bd.detect_angle(custom_angle)) {
diff --git a/src/libslic3r/Line.cpp b/src/libslic3r/Line.cpp
index 05cbfee4e..8a2a2875b 100644
--- a/src/libslic3r/Line.cpp
+++ b/src/libslic3r/Line.cpp
@@ -33,24 +33,6 @@ bool Line::intersection_infinite(const Line &other, Point* point) const
return true;
}
-// Distance to the closest point of line.
-double Line::distance_to_squared(const Point &point, const Point &a, const Point &b)
-{
- const Vec2d v = (b - a).cast<double>();
- const Vec2d va = (point - a).cast<double>();
- const double l2 = v.squaredNorm(); // avoid a sqrt
- if (l2 == 0.0)
- // a == b case
- return va.squaredNorm();
- // Consider the line extending the segment, parameterized as a + t (b - a).
- // We find projection of this point onto the line.
- // It falls where t = [(this-a) . (b-a)] / |b-a|^2
- const double t = va.dot(v) / l2;
- if (t < 0.0) return va.squaredNorm(); // beyond the 'a' end of the segment
- else if (t > 1.0) return (point - b).cast<double>().squaredNorm(); // beyond the 'b' end of the segment
- return (t * v - va).squaredNorm();
-}
-
double Line::perp_distance_to(const Point &point) const
{
const Line &line = *this;
@@ -118,6 +100,13 @@ bool Line::clip_with_bbox(const BoundingBox &bbox)
return result;
}
+void Line::extend(double offset)
+{
+ Vector offset_vector = (offset * this->vector().cast<double>().normalized()).cast<coord_t>();
+ this->a -= offset_vector;
+ this->b += offset_vector;
+}
+
Vec3d Linef3::intersect_plane(double z) const
{
auto v = (this->b - this->a).cast<double>();
@@ -125,4 +114,14 @@ Vec3d Linef3::intersect_plane(double z) const
return Vec3d(this->a(0) + v(0) * t, this->a(1) + v(1) * t, z);
}
+BoundingBox get_extents(const Lines &lines)
+{
+ BoundingBox bbox;
+ for (const Line &line : lines) {
+ bbox.merge(line.a);
+ bbox.merge(line.b);
+ }
+ return bbox;
}
+
+} // namespace Slic3r
diff --git a/src/libslic3r/Line.hpp b/src/libslic3r/Line.hpp
index 06809c02a..72532b4e3 100644
--- a/src/libslic3r/Line.hpp
+++ b/src/libslic3r/Line.hpp
@@ -18,6 +18,35 @@ typedef std::vector<ThickLine> ThickLines;
Linef3 transform(const Linef3& line, const Transform3d& t);
+namespace line_alg {
+
+// Distance to the closest point of line.
+template<class L, class T, int N>
+double distance_to_squared(const L &line, const Vec<N, T> &point)
+{
+ const Vec<N, double> v = (line.b - line.a).template cast<double>();
+ const Vec<N, double> va = (point - line.a).template cast<double>();
+ const double l2 = v.squaredNorm(); // avoid a sqrt
+ if (l2 == 0.0)
+ // a == b case
+ return va.squaredNorm();
+ // Consider the line extending the segment, parameterized as a + t (b - a).
+ // We find projection of this point onto the line.
+ // It falls where t = [(this-a) . (b-a)] / |b-a|^2
+ const double t = va.dot(v) / l2;
+ if (t < 0.0) return va.squaredNorm(); // beyond the 'a' end of the segment
+ else if (t > 1.0) return (point - line.b).template cast<double>().squaredNorm(); // beyond the 'b' end of the segment
+ return (t * v - va).squaredNorm();
+}
+
+template<class L, class T, int N>
+double distance_to(const L &line, const Vec<N, T> &point)
+{
+ return std::sqrt(distance_to_squared(line, point));
+}
+
+} // namespace line_alg
+
class Line
{
public:
@@ -25,7 +54,8 @@ public:
Line(const Point& _a, const Point& _b) : a(_a), b(_b) {}
explicit operator Lines() const { Lines lines; lines.emplace_back(*this); return lines; }
void scale(double factor) { this->a *= factor; this->b *= factor; }
- void translate(double x, double y) { Vector v(x, y); this->a += v; this->b += v; }
+ void translate(const Point &v) { this->a += v; this->b += v; }
+ void translate(double x, double y) { this->translate(Point(x, y)); }
void rotate(double angle, const Point &center) { this->a.rotate(angle, center); this->b.rotate(angle, center); }
void reverse() { std::swap(this->a, this->b); }
double length() const { return (b - a).cast<double>().norm(); }
@@ -46,8 +76,10 @@ public:
double ccw(const Point& point) const { return point.ccw(*this); }
// Clip a line with a bounding box. Returns false if the line is completely outside of the bounding box.
bool clip_with_bbox(const BoundingBox &bbox);
+ // Extend the line from both sides by an offset.
+ void extend(double offset);
- static double distance_to_squared(const Point &point, const Point &a, const Point &b);
+ static inline double distance_to_squared(const Point &point, const Point &a, const Point &b) { return line_alg::distance_to_squared(Line{a, b}, Vec<2, coord_t>{point}); }
static double distance_to(const Point &point, const Point &a, const Point &b) { return sqrt(distance_to_squared(point, a, b)); }
Point a;
@@ -103,6 +135,8 @@ public:
Vec3d b;
};
+BoundingBox get_extents(const Lines &lines);
+
} // namespace Slic3r
// start Boost
@@ -123,4 +157,4 @@ namespace boost { namespace polygon {
} }
// end Boost
-#endif
+#endif // slic3r_Line_hpp_
diff --git a/src/libslic3r/MTUtils.hpp b/src/libslic3r/MTUtils.hpp
index 3402d2c85..555cfe501 100644
--- a/src/libslic3r/MTUtils.hpp
+++ b/src/libslic3r/MTUtils.hpp
@@ -10,7 +10,6 @@
#include <cmath>
#include "libslic3r.h"
-#include "Point.hpp"
namespace Slic3r {
@@ -75,143 +74,6 @@ public:
}
};
-/// An std compatible random access iterator which uses indices to the
-/// source vector thus resistant to invalidation caused by relocations. It
-/// also "knows" its container. No comparison is neccesary to the container
-/// "end()" iterator. The template can be instantiated with a different
-/// value type than that of the container's but the types must be
-/// compatible. E.g. a base class of the contained objects is compatible.
-///
-/// For a constant iterator, one can instantiate this template with a value
-/// type preceded with 'const'.
-template<class Vector, // The container type, must be random access...
- class Value = typename Vector::value_type // The value type
- >
-class IndexBasedIterator
-{
- static const size_t NONE = size_t(-1);
-
- std::reference_wrapper<Vector> m_index_ref;
- size_t m_idx = NONE;
-
-public:
- using value_type = Value;
- using pointer = Value *;
- using reference = Value &;
- using difference_type = long;
- using iterator_category = std::random_access_iterator_tag;
-
- inline explicit IndexBasedIterator(Vector &index, size_t idx)
- : m_index_ref(index), m_idx(idx)
- {}
-
- // Post increment
- inline IndexBasedIterator operator++(int)
- {
- IndexBasedIterator cpy(*this);
- ++m_idx;
- return cpy;
- }
-
- inline IndexBasedIterator operator--(int)
- {
- IndexBasedIterator cpy(*this);
- --m_idx;
- return cpy;
- }
-
- inline IndexBasedIterator &operator++()
- {
- ++m_idx;
- return *this;
- }
-
- inline IndexBasedIterator &operator--()
- {
- --m_idx;
- return *this;
- }
-
- inline IndexBasedIterator &operator+=(difference_type l)
- {
- m_idx += size_t(l);
- return *this;
- }
-
- inline IndexBasedIterator operator+(difference_type l)
- {
- auto cpy = *this;
- cpy += l;
- return cpy;
- }
-
- inline IndexBasedIterator &operator-=(difference_type l)
- {
- m_idx -= size_t(l);
- return *this;
- }
-
- inline IndexBasedIterator operator-(difference_type l)
- {
- auto cpy = *this;
- cpy -= l;
- return cpy;
- }
-
- operator difference_type() { return difference_type(m_idx); }
-
- /// Tesing the end of the container... this is not possible with std
- /// iterators.
- inline bool is_end() const
- {
- return m_idx >= m_index_ref.get().size();
- }
-
- inline Value &operator*() const
- {
- assert(m_idx < m_index_ref.get().size());
- return m_index_ref.get().operator[](m_idx);
- }
-
- inline Value *operator->() const
- {
- assert(m_idx < m_index_ref.get().size());
- return &m_index_ref.get().operator[](m_idx);
- }
-
- /// If both iterators point past the container, they are equal...
- inline bool operator==(const IndexBasedIterator &other)
- {
- size_t e = m_index_ref.get().size();
- return m_idx == other.m_idx || (m_idx >= e && other.m_idx >= e);
- }
-
- inline bool operator!=(const IndexBasedIterator &other)
- {
- return !(*this == other);
- }
-
- inline bool operator<=(const IndexBasedIterator &other)
- {
- return (m_idx < other.m_idx) || (*this == other);
- }
-
- inline bool operator<(const IndexBasedIterator &other)
- {
- return m_idx < other.m_idx && (*this != other);
- }
-
- inline bool operator>=(const IndexBasedIterator &other)
- {
- return m_idx > other.m_idx || *this == other;
- }
-
- inline bool operator>(const IndexBasedIterator &other)
- {
- return m_idx > other.m_idx && *this != other;
- }
-};
-
/// A very simple range concept implementation with iterator-like objects.
template<class It> class Range
{
@@ -252,111 +114,11 @@ template<class T> struct remove_cvref
template<class T> using remove_cvref_t = typename remove_cvref<T>::type;
-// A shorter C++14 style form of the enable_if metafunction
-template<bool B, class T>
-using enable_if_t = typename std::enable_if<B, T>::type;
-
-// /////////////////////////////////////////////////////////////////////////////
-// Type safe conversions to and from scaled and unscaled coordinates
-// /////////////////////////////////////////////////////////////////////////////
-
-// A meta-predicate which is true for integers wider than or equal to coord_t
-template<class I> struct is_scaled_coord
-{
- static const SLIC3R_CONSTEXPR bool value =
- std::is_integral<I>::value &&
- std::numeric_limits<I>::digits >=
- std::numeric_limits<coord_t>::digits;
-};
-
-// Meta predicates for floating, 'scaled coord' and generic arithmetic types
-template<class T, class O = T>
-using FloatingOnly = enable_if_t<std::is_floating_point<T>::value, O>;
-
-template<class T, class O = T>
-using ScaledCoordOnly = enable_if_t<is_scaled_coord<T>::value, O>;
-
-template<class T, class O = T>
-using IntegerOnly = enable_if_t<std::is_integral<T>::value, O>;
-
-template<class T, class O = T>
-using ArithmeticOnly = enable_if_t<std::is_arithmetic<T>::value, O>;
-
-// Semantics are the following:
-// Upscaling (scaled()): only from floating point types (or Vec) to either
-// floating point or integer 'scaled coord' coordinates.
-// Downscaling (unscaled()): from arithmetic (or Vec) to floating point only
-
-// Conversion definition from unscaled to floating point scaled
-template<class Tout,
- class Tin,
- class = FloatingOnly<Tin>>
-inline constexpr FloatingOnly<Tout> scaled(const Tin &v) noexcept
-{
- return Tout(v / Tin(SCALING_FACTOR));
-}
-
-// Conversion definition from unscaled to integer 'scaled coord'.
-// TODO: is the rounding necessary? Here it is commented out to show that
-// it can be different for integers but it does not have to be. Using
-// std::round means loosing noexcept and constexpr modifiers
-template<class Tout = coord_t, class Tin, class = FloatingOnly<Tin>>
-inline constexpr ScaledCoordOnly<Tout> scaled(const Tin &v) noexcept
-{
- //return static_cast<Tout>(std::round(v / SCALING_FACTOR));
- return Tout(v / Tin(SCALING_FACTOR));
-}
-
-// Conversion for Eigen vectors (N dimensional points)
-template<class Tout = coord_t,
- class Tin,
- int N,
- class = FloatingOnly<Tin>,
- int...EigenArgs>
-inline Eigen::Matrix<ArithmeticOnly<Tout>, N, EigenArgs...>
-scaled(const Eigen::Matrix<Tin, N, EigenArgs...> &v)
-{
- return (v / SCALING_FACTOR).template cast<Tout>();
-}
-
-// Conversion from arithmetic scaled type to floating point unscaled
-template<class Tout = double,
- class Tin,
- class = ArithmeticOnly<Tin>,
- class = FloatingOnly<Tout>>
-inline constexpr Tout unscaled(const Tin &v) noexcept
-{
- return Tout(v * Tout(SCALING_FACTOR));
-}
-
-// Unscaling for Eigen vectors. Input base type can be arithmetic, output base
-// type can only be floating point.
-template<class Tout = double,
- class Tin,
- int N,
- class = ArithmeticOnly<Tin>,
- class = FloatingOnly<Tout>,
- int...EigenArgs>
-inline constexpr Eigen::Matrix<Tout, N, EigenArgs...>
-unscaled(const Eigen::Matrix<Tin, N, EigenArgs...> &v) noexcept
-{
- return v.template cast<Tout>() * SCALING_FACTOR;
-}
-
-template<class T, class I, class... Args> // Arbitrary allocator can be used
-inline IntegerOnly<I, std::vector<T, Args...>> reserve_vector(I capacity)
-{
- std::vector<T, Args...> ret;
- if (capacity > I(0)) ret.reserve(size_t(capacity));
-
- return ret;
-}
-
/// Exactly like Matlab https://www.mathworks.com/help/matlab/ref/linspace.html
-template<class T, class I>
+template<class T, class I, class = IntegerOnly<I>>
inline std::vector<T> linspace_vector(const ArithmeticOnly<T> &start,
const T &stop,
- const IntegerOnly<I> &n)
+ const I &n)
{
std::vector<T> vals(n, T());
diff --git a/src/libslic3r/MarchingSquares.hpp b/src/libslic3r/MarchingSquares.hpp
new file mode 100644
index 000000000..d5f07fbde
--- /dev/null
+++ b/src/libslic3r/MarchingSquares.hpp
@@ -0,0 +1,448 @@
+#ifndef MARCHINGSQUARES_HPP
+#define MARCHINGSQUARES_HPP
+
+#include <type_traits>
+#include <cstdint>
+#include <vector>
+#include <algorithm>
+#include <cassert>
+
+namespace marchsq {
+
+// Marks a square in the grid
+struct Coord {
+ long r = 0, c = 0;
+
+ Coord() = default;
+ explicit Coord(long s) : r(s), c(s) {}
+ Coord(long _r, long _c): r(_r), c(_c) {}
+
+ size_t seq(const Coord &res) const { return r * res.c + c; }
+ Coord& operator+=(const Coord& b) { r += b.r; c += b.c; return *this; }
+ Coord operator+(const Coord& b) const { Coord a = *this; a += b; return a; }
+};
+
+// Closed ring of cell coordinates
+using Ring = std::vector<Coord>;
+
+// Specialize this struct to register a raster type for the Marching squares alg
+template<class T, class Enable = void> struct _RasterTraits {
+
+ // The type of pixel cell in the raster
+ using ValueType = typename T::ValueType;
+
+ // Value at a given position
+ static ValueType get(const T &raster, size_t row, size_t col);
+
+ // Number of rows and cols of the raster
+ static size_t rows(const T &raster);
+ static size_t cols(const T &raster);
+};
+
+// Specialize this to use parellel loops within the algorithm
+template<class ExecutionPolicy, class Enable = void> struct _Loop {
+ template<class It, class Fn> static void for_each(It from, It to, Fn &&fn)
+ {
+ for (auto it = from; it < to; ++it) fn(*it, size_t(it - from));
+ }
+};
+
+namespace __impl {
+
+template<class T> using RasterTraits = _RasterTraits<std::decay_t<T>>;
+template<class T> using TRasterValue = typename RasterTraits<T>::ValueType;
+
+template<class T> size_t rows(const T &raster)
+{
+ return RasterTraits<T>::rows(raster);
+}
+
+template<class T> size_t cols(const T &raster)
+{
+ return RasterTraits<T>::cols(raster);
+}
+
+template<class T> TRasterValue<T> isoval(const T &rst, const Coord &crd)
+{
+ return RasterTraits<T>::get(rst, crd.r, crd.c);
+}
+
+template<class ExecutionPolicy, class It, class Fn>
+void for_each(ExecutionPolicy&& policy, It from, It to, Fn &&fn)
+{
+ _Loop<ExecutionPolicy>::for_each(from, to, fn);
+}
+
+// Type of squares (tiles) depending on which vertices are inside an ROI
+// The vertices would be marked a, b, c, d in counter clockwise order from the
+// bottom left vertex of a square.
+// d --- c
+// | |
+// | |
+// a --- b
+enum class SquareTag : uint8_t {
+// 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
+ none, a, b, ab, c, ac, bc, abc, d, ad, bd, abd, cd, acd, bcd, full
+};
+
+template<class E> constexpr std::underlying_type_t<E> _t(E e) noexcept
+{
+ return static_cast<std::underlying_type_t<E>>(e);
+}
+
+enum class Dir: uint8_t { left, down, right, up, none};
+
+static const constexpr Dir NEXT_CCW[] = {
+ /* 00 */ Dir::none, // SquareTag::none (empty square, nowhere to go)
+ /* 01 */ Dir::left, // SquareTag::a
+ /* 02 */ Dir::down, // SquareTag::b
+ /* 03 */ Dir::left, // SquareTag::ab
+ /* 04 */ Dir::right, // SquareTag::c
+ /* 05 */ Dir::none, // SquareTag::ac (ambiguous case)
+ /* 06 */ Dir::down, // SquareTag::bc
+ /* 07 */ Dir::left, // SquareTag::abc
+ /* 08 */ Dir::up, // SquareTag::d
+ /* 09 */ Dir::up, // SquareTag::ad
+ /* 10 */ Dir::none, // SquareTag::bd (ambiguous case)
+ /* 11 */ Dir::up, // SquareTag::abd
+ /* 12 */ Dir::right, // SquareTag::cd
+ /* 13 */ Dir::right, // SquareTag::acd
+ /* 14 */ Dir::down, // SquareTag::bcd
+ /* 15 */ Dir::none // SquareTag::full (full covered, nowhere to go)
+};
+
+static const constexpr uint8_t PREV_CCW[] = {
+ /* 00 */ 1 << _t(Dir::none),
+ /* 01 */ 1 << _t(Dir::up),
+ /* 02 */ 1 << _t(Dir::left),
+ /* 03 */ 1 << _t(Dir::left),
+ /* 04 */ 1 << _t(Dir::down),
+ /* 05 */ 1 << _t(Dir::up) | 1 << _t(Dir::down),
+ /* 06 */ 1 << _t(Dir::down),
+ /* 07 */ 1 << _t(Dir::down),
+ /* 08 */ 1 << _t(Dir::right),
+ /* 09 */ 1 << _t(Dir::up),
+ /* 10 */ 1 << _t(Dir::left) | 1 << _t(Dir::right),
+ /* 11 */ 1 << _t(Dir::left),
+ /* 12 */ 1 << _t(Dir::right),
+ /* 13 */ 1 << _t(Dir::up),
+ /* 14 */ 1 << _t(Dir::right),
+ /* 15 */ 1 << _t(Dir::none)
+};
+
+const constexpr uint8_t DIRMASKS[] = {
+ /*left: */ 0x01, /*down*/ 0x12, /*right */0x21, /*up*/ 0x10, /*none*/ 0x00
+};
+
+inline Coord step(const Coord &crd, Dir d)
+{
+ uint8_t dd = DIRMASKS[uint8_t(d)];
+ return {crd.r - 1 + (dd & 0x0f), crd.c - 1 + (dd >> 4)};
+}
+
+template<class Rst> class Grid {
+ const Rst * m_rst = nullptr;
+ Coord m_cellsize, m_res_1, m_window, m_gridsize, m_grid_1;
+ std::vector<uint8_t> m_tags; // Assign tags to each square
+
+ Coord rastercoord(const Coord &crd) const
+ {
+ return {(crd.r - 1) * m_window.r, (crd.c - 1) * m_window.c};
+ }
+
+ Coord bl(const Coord &crd) const { return tl(crd) + Coord{m_res_1.r, 0}; }
+ Coord br(const Coord &crd) const { return tl(crd) + Coord{m_res_1.r, m_res_1.c}; }
+ Coord tr(const Coord &crd) const { return tl(crd) + Coord{0, m_res_1.c}; }
+ Coord tl(const Coord &crd) const { return rastercoord(crd); }
+
+ bool is_within(const Coord &crd)
+ {
+ long R = rows(*m_rst), C = cols(*m_rst);
+ return crd.r >= 0 && crd.r < R && crd.c >= 0 && crd.c < C;
+ };
+
+ // Calculate the tag for a cell (or square). The cell coordinates mark the
+ // top left vertex of a square in the raster. v is the isovalue
+ uint8_t get_tag_for_cell(const Coord &cell, TRasterValue<Rst> v)
+ {
+ Coord sqr[] = {bl(cell), br(cell), tr(cell), tl(cell)};
+
+ uint8_t t = ((is_within(sqr[0]) && isoval(*m_rst, sqr[0]) >= v)) +
+ ((is_within(sqr[1]) && isoval(*m_rst, sqr[1]) >= v) << 1) +
+ ((is_within(sqr[2]) && isoval(*m_rst, sqr[2]) >= v) << 2) +
+ ((is_within(sqr[3]) && isoval(*m_rst, sqr[3]) >= v) << 3);
+
+ assert(t < 16);
+ return t;
+ }
+
+ // Get a cell coordinate from a sequential index
+ Coord coord(size_t i) const
+ {
+ return {long(i) / m_gridsize.c, long(i) % m_gridsize.c};
+ }
+
+ size_t seq(const Coord &crd) const { return crd.seq(m_gridsize); }
+
+ bool is_visited(size_t idx, Dir d = Dir::none) const
+ {
+ SquareTag t = get_tag(idx);
+ uint8_t ref = d == Dir::none ? PREV_CCW[_t(t)] : uint8_t(1 << _t(d));
+ return t == SquareTag::full || t == SquareTag::none ||
+ ((m_tags[idx] & 0xf0) >> 4) == ref;
+ }
+
+ void set_visited(size_t idx, Dir d = Dir::none)
+ {
+ m_tags[idx] |= (1 << (_t(d)) << 4);
+ }
+
+ bool is_ambiguous(size_t idx) const
+ {
+ SquareTag t = get_tag(idx);
+ return t == SquareTag::ac || t == SquareTag::bd;
+ }
+
+ // Search for a new starting square
+ size_t search_start_cell(size_t i = 0) const
+ {
+ // Skip ambiguous tags as starting tags due to unknown previous
+ // direction.
+ while ((i < m_tags.size()) && (is_visited(i) || is_ambiguous(i))) ++i;
+
+ return i;
+ }
+
+ SquareTag get_tag(size_t idx) const { return SquareTag(m_tags[idx] & 0x0f); }
+
+ Dir next_dir(Dir prev, SquareTag tag) const
+ {
+ // Treat ambiguous cases as two separate regions in one square.
+ switch (tag) {
+ case SquareTag::ac:
+ switch (prev) {
+ case Dir::down: return Dir::right;
+ case Dir::up: return Dir::left;
+ default: assert(false); return Dir::none;
+ }
+ case SquareTag::bd:
+ switch (prev) {
+ case Dir::right: return Dir::up;
+ case Dir::left: return Dir::down;
+ default: assert(false); return Dir::none;
+ }
+ default:
+ return NEXT_CCW[uint8_t(tag)];
+ }
+
+ return Dir::none;
+ }
+
+ struct CellIt {
+ Coord crd; Dir dir= Dir::none; const Rst *grid = nullptr;
+
+ TRasterValue<Rst> operator*() const { return isoval(*grid, crd); }
+ CellIt& operator++() { crd = step(crd, dir); return *this; }
+ CellIt operator++(int) { CellIt it = *this; ++(*this); return it; }
+ bool operator!=(const CellIt &it) { return crd.r != it.crd.r || crd.c != it.crd.c; }
+
+ using value_type = TRasterValue<Rst>;
+ using pointer = TRasterValue<Rst> *;
+ using reference = TRasterValue<Rst> &;
+ using difference_type = long;
+ using iterator_category = std::forward_iterator_tag;
+ };
+
+ // Two cell iterators representing an edge of a square. This is then
+ // used for binary search for the first active pixel on the edge.
+ struct Edge { CellIt from, to; };
+
+ Edge _edge(const Coord &ringvertex) const
+ {
+ size_t idx = ringvertex.r;
+ Coord cell = coord(idx);
+ uint8_t tg = m_tags[ringvertex.r];
+ SquareTag t = SquareTag(tg & 0x0f);
+
+ switch (t) {
+ case SquareTag::a:
+ case SquareTag::ab:
+ case SquareTag::abc:
+ return {{tl(cell), Dir::down, m_rst}, {bl(cell)}};
+ case SquareTag::b:
+ case SquareTag::bc:
+ case SquareTag::bcd:
+ return {{bl(cell), Dir::right, m_rst}, {br(cell)}};
+ case SquareTag::c:
+ return {{br(cell), Dir::up, m_rst}, {tr(cell)}};
+ case SquareTag::ac:
+ switch (Dir(ringvertex.c)) {
+ case Dir::left: return {{tl(cell), Dir::down, m_rst}, {bl(cell)}};
+ case Dir::right: return {{br(cell), Dir::up, m_rst}, {tr(cell)}};
+ default: assert(false);
+ }
+ case SquareTag::d:
+ case SquareTag::ad:
+ case SquareTag::abd:
+ return {{tr(cell), Dir::left, m_rst}, {tl(cell)}};
+ case SquareTag::bd:
+ switch (Dir(ringvertex.c)) {
+ case Dir::down: return {{bl(cell), Dir::right, m_rst}, {br(cell)}};
+ case Dir::up: return {{tr(cell), Dir::left, m_rst}, {tl(cell)}};
+ default: assert(false);
+ }
+ case SquareTag::cd:
+ case SquareTag::acd:
+ return {{br(cell), Dir::up, m_rst}, {tr(cell)}};
+ case SquareTag::full:
+ case SquareTag::none: {
+ Coord crd{tl(cell) + Coord{m_cellsize.r / 2, m_cellsize.c / 2}};
+ return {{crd, Dir::none, m_rst}, crd};
+ }
+ }
+
+ return {};
+ }
+
+ Edge edge(const Coord &ringvertex) const
+ {
+ const long R = rows(*m_rst), C = cols(*m_rst);
+ const long R_1 = R - 1, C_1 = C - 1;
+
+ Edge e = _edge(ringvertex);
+ e.to.dir = e.from.dir;
+ ++e.to;
+
+ e.from.crd.r = std::min(e.from.crd.r, R_1);
+ e.from.crd.r = std::max(e.from.crd.r, 0l);
+ e.from.crd.c = std::min(e.from.crd.c, C_1);
+ e.from.crd.c = std::max(e.from.crd.c, 0l);
+
+ e.to.crd.r = std::min(e.to.crd.r, R);
+ e.to.crd.r = std::max(e.to.crd.r, 0l);
+ e.to.crd.c = std::min(e.to.crd.c, C);
+ e.to.crd.c = std::max(e.to.crd.c, 0l);
+
+ return e;
+ }
+
+public:
+ explicit Grid(const Rst &rst, const Coord &cellsz, const Coord &overlap)
+ : m_rst{&rst}
+ , m_cellsize{cellsz}
+ , m_res_1{m_cellsize.r - 1, m_cellsize.c - 1}
+ , m_window{overlap.r < cellsz.r ? cellsz.r - overlap.r : cellsz.r,
+ overlap.c < cellsz.c ? cellsz.c - overlap.c : cellsz.c}
+ , m_gridsize{2 + (long(rows(rst)) - overlap.r) / m_window.r,
+ 2 + (long(cols(rst)) - overlap.c) / m_window.c}
+ , m_tags(m_gridsize.r * m_gridsize.c, 0)
+ {}
+
+ // Go through the cells and mark them with the appropriate tag.
+ template<class ExecutionPolicy>
+ void tag_grid(ExecutionPolicy &&policy, TRasterValue<Rst> isoval)
+ {
+ // parallel for r
+ for_each (std::forward<ExecutionPolicy>(policy),
+ m_tags.begin(), m_tags.end(),
+ [this, isoval](uint8_t& tag, size_t idx) {
+ tag = get_tag_for_cell(coord(idx), isoval);
+ });
+ }
+
+ // Scan for the rings on the tagged grid. Each ring vertex stores the
+ // sequential index of the cell and the next direction (Dir).
+ // This info can be used later to calculate the exact raster coordinate.
+ std::vector<Ring> scan_rings()
+ {
+ std::vector<Ring> rings;
+ size_t startidx = 0;
+ while ((startidx = search_start_cell(startidx)) < m_tags.size()) {
+ Ring ring;
+
+ size_t idx = startidx;
+ Dir prev = Dir::none, next = next_dir(prev, get_tag(idx));
+
+ while (next != Dir::none && !is_visited(idx, prev)) {
+ Coord ringvertex{long(idx), long(next)};
+ ring.emplace_back(ringvertex);
+ set_visited(idx, prev);
+
+ idx = seq(step(coord(idx), next));
+ prev = next;
+ next = next_dir(next, get_tag(idx));
+ }
+
+ // To prevent infinite loops in case of degenerate input
+ if (next == Dir::none) m_tags[startidx] = _t(SquareTag::none);
+
+ if (ring.size() > 1) {
+ ring.pop_back();
+ rings.emplace_back(ring);
+ }
+ }
+
+ return rings;
+ }
+
+ // Calculate the exact raster position from the cells which store the
+ // sequantial index of the square and the next direction
+ template<class ExecutionPolicy>
+ void interpolate_rings(ExecutionPolicy && policy,
+ std::vector<Ring> &rings,
+ TRasterValue<Rst> isov)
+ {
+ for_each(std::forward<ExecutionPolicy>(policy),
+ rings.begin(), rings.end(), [this, isov] (Ring &ring, size_t)
+ {
+ for (Coord &ringvertex : ring) {
+ Edge e = edge(ringvertex);
+
+ CellIt found = std::lower_bound(e.from, e.to, isov);
+ ringvertex = found.crd;
+ }
+ });
+ }
+};
+
+template<class Raster, class ExecutionPolicy>
+std::vector<marchsq::Ring> execute_with_policy(ExecutionPolicy && policy,
+ const Raster & raster,
+ TRasterValue<Raster> isoval,
+ Coord windowsize = {})
+{
+ if (!rows(raster) || !cols(raster)) return {};
+
+ size_t ratio = cols(raster) / rows(raster);
+
+ if (!windowsize.r) windowsize.r = 2;
+ if (!windowsize.c)
+ windowsize.c = std::max(2l, long(windowsize.r * ratio));
+
+ Coord overlap{1};
+
+ Grid<Raster> grid{raster, windowsize, overlap};
+
+ grid.tag_grid(std::forward<ExecutionPolicy>(policy), isoval);
+ std::vector<marchsq::Ring> rings = grid.scan_rings();
+ grid.interpolate_rings(std::forward<ExecutionPolicy>(policy), rings, isoval);
+
+ return rings;
+}
+
+template<class Raster>
+std::vector<marchsq::Ring> execute(const Raster &raster,
+ TRasterValue<Raster> isoval,
+ Coord windowsize = {})
+{
+ return execute_with_policy(nullptr, raster, isoval, windowsize);
+}
+
+} // namespace __impl
+
+using __impl::execute_with_policy;
+using __impl::execute;
+
+} // namespace marchsq
+
+#endif // MARCHINGSQUARES_HPP
diff --git a/src/libslic3r/MeshBoolean.cpp b/src/libslic3r/MeshBoolean.cpp
index 6c5418fd4..6ffc5dec3 100644
--- a/src/libslic3r/MeshBoolean.cpp
+++ b/src/libslic3r/MeshBoolean.cpp
@@ -1,3 +1,4 @@
+#include "Exception.hpp"
#include "MeshBoolean.hpp"
#include "libslic3r/TriangleMesh.hpp"
#undef PI
@@ -11,7 +12,6 @@
#include <CGAL/Exact_integer.h>
#include <CGAL/Surface_mesh.h>
#include <CGAL/Polygon_mesh_processing/orient_polygon_soup.h>
-#include <CGAL/Polygon_mesh_processing/repair_polygon_soup.h>
#include <CGAL/Polygon_mesh_processing/repair.h>
#include <CGAL/Polygon_mesh_processing/remesh.h>
#include <CGAL/Polygon_mesh_processing/polygon_soup_to_polygon_mesh.h>
@@ -29,7 +29,7 @@ TriangleMesh eigen_to_triangle_mesh(const EigenMesh &emesh)
auto &VC = emesh.first; auto &FC = emesh.second;
Pointf3s points(size_t(VC.rows()));
- std::vector<Vec3crd> facets(size_t(FC.rows()));
+ std::vector<Vec3i> facets(size_t(FC.rows()));
for (Eigen::Index i = 0; i < VC.rows(); ++i)
points[size_t(i)] = VC.row(i);
@@ -136,7 +136,7 @@ template<class _Mesh> void triangle_mesh_to_cgal(const TriangleMesh &M, _Mesh &o
if(CGAL::is_closed(out))
CGALProc::orient_to_bound_a_volume(out);
else
- std::runtime_error("Mesh not watertight");
+ throw Slic3r::RuntimeError("Mesh not watertight");
}
inline Vec3d to_vec3d(const _EpicMesh::Point &v)
@@ -154,7 +154,7 @@ inline Vec3d to_vec3d(const _EpecMesh::Point &v)
template<class _Mesh> TriangleMesh cgal_to_triangle_mesh(const _Mesh &cgalmesh)
{
Pointf3s points;
- std::vector<Vec3crd> facets;
+ std::vector<Vec3i> facets;
points.reserve(cgalmesh.num_vertices());
facets.reserve(cgalmesh.num_faces());
@@ -166,7 +166,7 @@ template<class _Mesh> TriangleMesh cgal_to_triangle_mesh(const _Mesh &cgalmesh)
for (auto &face : cgalmesh.faces()) {
auto vtc = cgalmesh.vertices_around_face(cgalmesh.halfedge(face));
int i = 0;
- Vec3crd trface;
+ Vec3i trface;
for (auto v : vtc) trface(i++) = static_cast<int>(v);
facets.emplace_back(trface);
}
@@ -222,7 +222,7 @@ template<class Op> void _cgal_do(Op &&op, CGALMesh &A, CGALMesh &B)
}
if (! success)
- throw std::runtime_error("CGAL mesh boolean operation failed.");
+ throw Slic3r::RuntimeError("CGAL mesh boolean operation failed.");
}
void minus(CGALMesh &A, CGALMesh &B) { _cgal_do(_cgal_diff, A, B); }
diff --git a/src/libslic3r/Model.cpp b/src/libslic3r/Model.cpp
index b3a18f26b..c25026cc4 100644
--- a/src/libslic3r/Model.cpp
+++ b/src/libslic3r/Model.cpp
@@ -1,6 +1,9 @@
+#include "Exception.hpp"
#include "Model.hpp"
+#include "ModelArrange.hpp"
#include "Geometry.hpp"
#include "MTUtils.hpp"
+#include "TriangleSelector.hpp"
#include "Format/AMF.hpp"
#include "Format/OBJ.hpp"
@@ -19,7 +22,6 @@
#include "SVG.hpp"
#include <Eigen/Dense>
#include "GCodeWriter.hpp"
-#include "GCode/PreviewData.hpp"
namespace Slic3r {
@@ -112,13 +114,13 @@ Model Model::read_from_file(const std::string& input_file, DynamicPrintConfig* c
else if (boost::algorithm::iends_with(input_file, ".prusa"))
result = load_prus(input_file.c_str(), &model);
else
- throw std::runtime_error("Unknown file format. Input file must have .stl, .obj, .amf(.xml) or .prusa extension.");
+ throw Slic3r::RuntimeError("Unknown file format. Input file must have .stl, .obj, .amf(.xml) or .prusa extension.");
if (! result)
- throw std::runtime_error("Loading of a model file failed.");
+ throw Slic3r::RuntimeError("Loading of a model file failed.");
if (model.objects.empty())
- throw std::runtime_error("The supplied file couldn't be read because it's empty");
+ throw Slic3r::RuntimeError("The supplied file couldn't be read because it's empty");
for (ModelObject *o : model.objects)
o->input_file = input_file;
@@ -142,13 +144,13 @@ Model Model::read_from_archive(const std::string& input_file, DynamicPrintConfig
else if (boost::algorithm::iends_with(input_file, ".zip.amf"))
result = load_amf(input_file.c_str(), config, &model, check_version);
else
- throw std::runtime_error("Unknown file format. Input file must have .3mf or .zip.amf extension.");
+ throw Slic3r::RuntimeError("Unknown file format. Input file must have .3mf or .zip.amf extension.");
if (!result)
- throw std::runtime_error("Loading of a model file failed.");
+ throw Slic3r::RuntimeError("Loading of a model file failed.");
if (model.objects.empty())
- throw std::runtime_error("The supplied file couldn't be read because it's empty");
+ throw Slic3r::RuntimeError("The supplied file couldn't be read because it's empty");
for (ModelObject *o : model.objects)
{
@@ -355,116 +357,6 @@ TriangleMesh Model::mesh() const
return mesh;
}
-static bool _arrange(const Pointfs &sizes, coordf_t dist, const BoundingBoxf* bb, Pointfs &out)
-{
- if (sizes.empty())
- // return if the list is empty or the following call to BoundingBoxf constructor will lead to a crash
- return true;
-
- // we supply unscaled data to arrange()
- bool result = Slic3r::Geometry::arrange(
- sizes.size(), // number of parts
- BoundingBoxf(sizes).max, // width and height of a single cell
- dist, // distance between cells
- bb, // bounding box of the area to fill
- out // output positions
- );
-
- if (!result && bb != nullptr) {
- // Try to arrange again ignoring bb
- result = Slic3r::Geometry::arrange(
- sizes.size(), // number of parts
- BoundingBoxf(sizes).max, // width and height of a single cell
- dist, // distance between cells
- nullptr, // bounding box of the area to fill
- out // output positions
- );
- }
-
- return result;
-}
-
-/* arrange objects preserving their instance count
- but altering their instance positions */
-bool Model::arrange_objects(coordf_t dist, const BoundingBoxf* bb)
-{
- size_t count = 0;
- for (auto obj : objects) count += obj->instances.size();
-
- arrangement::ArrangePolygons input;
- ModelInstancePtrs instances;
- input.reserve(count);
- instances.reserve(count);
- for (ModelObject *mo : objects)
- for (ModelInstance *minst : mo->instances) {
- input.emplace_back(minst->get_arrange_polygon());
- instances.emplace_back(minst);
- }
-
- arrangement::BedShapeHint bedhint;
- coord_t bedwidth = 0;
-
- if (bb) {
- bedwidth = scaled(bb->size().x());
- bedhint = arrangement::BedShapeHint(
- BoundingBox(scaled(bb->min), scaled(bb->max)));
- }
-
- arrangement::arrange(input, scaled(dist), bedhint);
-
- bool ret = true;
- coord_t stride = bedwidth + bedwidth / 5;
-
- for(size_t i = 0; i < input.size(); ++i) {
- if (input[i].bed_idx != 0) ret = false;
- if (input[i].bed_idx >= 0) {
- input[i].translation += Vec2crd{input[i].bed_idx * stride, 0};
- instances[i]->apply_arrange_result(input[i].translation,
- input[i].rotation);
- }
- }
-
- return ret;
-}
-
-// Duplicate the entire model preserving instance relative positions.
-void Model::duplicate(size_t copies_num, coordf_t dist, const BoundingBoxf* bb)
-{
- Pointfs model_sizes(copies_num-1, to_2d(this->bounding_box().size()));
- Pointfs positions;
- if (! _arrange(model_sizes, dist, bb, positions))
- throw std::invalid_argument("Cannot duplicate part as the resulting objects would not fit on the print bed.\n");
-
- // note that this will leave the object count unaltered
-
- for (ModelObject *o : this->objects) {
- // make a copy of the pointers in order to avoid recursion when appending their copies
- ModelInstancePtrs instances = o->instances;
- for (const ModelInstance *i : instances) {
- for (const Vec2d &pos : positions) {
- ModelInstance *instance = o->add_instance(*i);
- instance->set_offset(instance->get_offset() + Vec3d(pos(0), pos(1), 0.0));
- }
- }
- o->invalidate_bounding_box();
- }
-}
-
-/* this will append more instances to each object
- and then automatically rearrange everything */
-void Model::duplicate_objects(size_t copies_num, coordf_t dist, const BoundingBoxf* bb)
-{
- for (ModelObject *o : this->objects) {
- // make a copy of the pointers in order to avoid recursion when appending their copies
- ModelInstancePtrs instances = o->instances;
- for (const ModelInstance *i : instances)
- for (size_t k = 2; k <= copies_num; ++ k)
- o->add_instance(*i);
- }
-
- this->arrange_objects(dist, bb);
-}
-
void Model::duplicate_objects_grid(size_t x, size_t y, coordf_t dist)
{
if (this->objects.size() > 1) throw "Grid duplication is not supported with multiple objects";
@@ -557,6 +449,29 @@ void Model::convert_multipart_object(unsigned int max_extruders)
this->objects.push_back(object);
}
+bool Model::looks_like_imperial_units() const
+{
+ if (this->objects.size() == 0)
+ return false;
+
+ for (ModelObject* obj : this->objects)
+ if (obj->get_object_stl_stats().volume < 9.0) // 9 = 3*3*3;
+ return true;
+
+ return false;
+}
+
+void Model::convert_from_imperial_units(bool only_small_volumes)
+{
+ double in_to_mm = 25.4;
+ for (ModelObject* obj : this->objects)
+ if (! only_small_volumes || obj->get_object_stl_stats().volume < 9.0) { // 9 = 3*3*3;
+ obj->scale_mesh_after_creation(Vec3d(in_to_mm, in_to_mm, in_to_mm));
+ for (ModelVolume* v : obj->volumes)
+ v->source.is_converted_from_inches = true;
+ }
+}
+
void Model::adjust_min_z()
{
if (objects.empty())
@@ -693,6 +608,7 @@ void ModelObject::assign_new_unique_ids_recursive()
model_volume->assign_new_unique_ids_recursive();
for (ModelInstance *model_instance : this->instances)
model_instance->assign_new_unique_ids_recursive();
+ this->layer_height_profile.set_new_unique_id();
}
// Clone this ModelObject including its volumes and instances, keep the IDs of the copies equal to the original.
@@ -862,6 +778,38 @@ TriangleMesh ModelObject::raw_mesh() const
return mesh;
}
+// Non-transformed (non-rotated, non-scaled, non-translated) sum of non-modifier object volumes.
+// Currently used by ModelObject::mesh(), to calculate the 2D envelope for 2D plater
+// and to display the object statistics at ModelObject::print_info().
+indexed_triangle_set ModelObject::raw_indexed_triangle_set() const
+{
+ size_t num_vertices = 0;
+ size_t num_faces = 0;
+ for (const ModelVolume *v : this->volumes)
+ if (v->is_model_part()) {
+ num_vertices += v->mesh().its.vertices.size();
+ num_faces += v->mesh().its.indices.size();
+ }
+ indexed_triangle_set out;
+ out.vertices.reserve(num_vertices);
+ out.indices.reserve(num_faces);
+ for (const ModelVolume *v : this->volumes)
+ if (v->is_model_part()) {
+ size_t i = out.vertices.size();
+ size_t j = out.indices.size();
+ append(out.vertices, v->mesh().its.vertices);
+ append(out.indices, v->mesh().its.indices);
+ auto m = v->get_matrix();
+ for (; i < out.vertices.size(); ++ i)
+ out.vertices[i] = (m * out.vertices[i].cast<double>()).cast<float>().eval();
+ if (v->is_left_handed()) {
+ for (; j < out.indices.size(); ++ j)
+ std::swap(out.indices[j][0], out.indices[j][1]);
+ }
+ }
+ return out;
+}
+
// Non-transformed (non-rotated, non-scaled, non-translated) sum of all object volumes.
TriangleMesh ModelObject::full_raw_mesh() const
{
@@ -903,7 +851,7 @@ const BoundingBoxf3& ModelObject::raw_bounding_box() const
m_raw_bounding_box_valid = true;
m_raw_bounding_box.reset();
if (this->instances.empty())
- throw std::invalid_argument("Can't call raw_bounding_box() with no instances");
+ throw Slic3r::InvalidArgument("Can't call raw_bounding_box() with no instances");
const Transform3d& inst_matrix = this->instances.front()->get_transformation().get_matrix(true);
for (const ModelVolume *v : this->volumes)
@@ -1075,6 +1023,65 @@ void ModelObject::scale_mesh_after_creation(const Vec3d &versor)
this->invalidate_bounding_box();
}
+void ModelObject::convert_units(ModelObjectPtrs& new_objects, bool from_imperial, std::vector<int> volume_idxs)
+{
+ BOOST_LOG_TRIVIAL(trace) << "ModelObject::convert_units - start";
+
+ ModelObject* new_object = new_clone(*this);
+
+ double koef = from_imperial ? 25.4 : 0.0393700787;
+ const Vec3d versor = Vec3d(koef, koef, koef);
+
+ new_object->set_model(nullptr);
+ new_object->sla_support_points.clear();
+ new_object->sla_drain_holes.clear();
+ new_object->sla_points_status = sla::PointsStatus::NoPoints;
+ new_object->clear_volumes();
+ new_object->input_file.clear();
+
+ int vol_idx = 0;
+ for (ModelVolume* volume : volumes)
+ {
+ if (!volume->mesh().empty()) {
+ TriangleMesh mesh(volume->mesh());
+ mesh.require_shared_vertices();
+
+ ModelVolume* vol = new_object->add_volume(mesh);
+ vol->name = volume->name;
+ vol->set_type(volume->type());
+ // Don't copy the config's ID.
+ vol->config.assign_config(volume->config);
+ assert(vol->config.id().valid());
+ assert(vol->config.id() != volume->config.id());
+ vol->set_material(volume->material_id(), *volume->material());
+ vol->source.input_file = volume->source.input_file;
+ vol->source.object_idx = (int)new_objects.size();
+ vol->source.volume_idx = vol_idx;
+
+ vol->supported_facets.assign(volume->supported_facets);
+ vol->seam_facets.assign(volume->seam_facets);
+
+ // Perform conversion only if the target "imperial" state is different from the current one.
+ // This check supports conversion of "mixed" set of volumes, each with different "imperial" state.
+ if (//vol->source.is_converted_from_inches != from_imperial &&
+ (volume_idxs.empty() ||
+ std::find(volume_idxs.begin(), volume_idxs.end(), vol_idx) != volume_idxs.end())) {
+ vol->scale_geometry_after_creation(versor);
+ vol->set_offset(versor.cwiseProduct(volume->get_offset()));
+ vol->source.is_converted_from_inches = from_imperial;
+ }
+ else
+ vol->set_offset(volume->get_offset());
+ }
+ vol_idx ++;
+ }
+ new_object->invalidate_bounding_box();
+
+ new_objects.push_back(new_object);
+
+ BOOST_LOG_TRIVIAL(trace) << "ModelObject::convert_units - end";
+}
+
size_t ModelObject::materials_count() const
{
std::set<t_model_material_id> material_ids;
@@ -1149,6 +1156,9 @@ ModelObjectPtrs ModelObject::cut(size_t instance, coordf_t z, bool keep_upper, b
for (ModelVolume *volume : volumes) {
const auto volume_matrix = volume->get_matrix();
+ volume->supported_facets.clear();
+ volume->seam_facets.clear();
+
if (! volume->is_model_part()) {
// Modifiers are not cut, but we still need to add the instance transformation
// to the modifier volume transformation to preserve their shape properly.
@@ -1192,7 +1202,7 @@ ModelObjectPtrs ModelObject::cut(size_t instance, coordf_t z, bool keep_upper, b
ModelVolume* vol = upper->add_volume(upper_mesh);
vol->name = volume->name;
// Don't copy the config's ID.
- static_cast<DynamicPrintConfig&>(vol->config) = static_cast<const DynamicPrintConfig&>(volume->config);
+ vol->config.assign_config(volume->config);
assert(vol->config.id().valid());
assert(vol->config.id() != volume->config.id());
vol->set_material(volume->material_id(), *volume->material());
@@ -1201,8 +1211,8 @@ ModelObjectPtrs ModelObject::cut(size_t instance, coordf_t z, bool keep_upper, b
ModelVolume* vol = lower->add_volume(lower_mesh);
vol->name = volume->name;
// Don't copy the config's ID.
- static_cast<DynamicPrintConfig&>(vol->config) = static_cast<const DynamicPrintConfig&>(volume->config);
- assert(vol->config.id().valid());
+ vol->config.assign_config(volume->config);
+ assert(vol->config.id().valid());
assert(vol->config.id() != volume->config.id());
vol->set_material(volume->material_id(), *volume->material());
@@ -1273,13 +1283,17 @@ void ModelObject::split(ModelObjectPtrs* new_objects)
ModelVolume* volume = this->volumes.front();
TriangleMeshPtrs meshptrs = volume->mesh().split();
for (TriangleMesh *mesh : meshptrs) {
+
+ // FIXME: crashes if not satisfied
+ if (mesh->facets_count() < 3) continue;
+
mesh->repair();
// XXX: this seems to be the only real usage of m_model, maybe refactor this so that it's not needed?
ModelObject* new_object = m_model->add_object();
new_object->name = this->name;
// Don't copy the config's ID.
- static_cast<DynamicPrintConfig&>(new_object->config) = static_cast<const DynamicPrintConfig&>(this->config);
+ new_object->config.assign_config(this->config);
assert(new_object->config.id().valid());
assert(new_object->config.id() != this->config.id());
new_object->instances.reserve(this->instances.size());
@@ -1303,6 +1317,27 @@ void ModelObject::split(ModelObjectPtrs* new_objects)
return;
}
+void ModelObject::merge()
+{
+ if (this->volumes.size() == 1) {
+ // We can't merge meshes if there's just one volume
+ return;
+ }
+
+ TriangleMesh mesh;
+
+ for (ModelVolume* volume : volumes)
+ if (!volume->mesh().empty())
+ mesh.merge(volume->mesh());
+ mesh.repair();
+
+ this->clear_volumes();
+ ModelVolume* vol = this->add_volume(mesh);
+
+ if (!vol)
+ return;
+}
+
// Support for non-uniform scaling of instances. If an instance is rotated by angles, which are not multiples of ninety degrees,
// then the scaling in world coordinate system is not representable by the Geometry::Transformation structure.
// This situation is solved by baking in the instance transformation into the mesh vertices.
@@ -1415,8 +1450,8 @@ unsigned int ModelObject::check_instances_print_volume_state(const BoundingBoxf3
inside_outside |= OUTSIDE;
}
model_instance->print_volume_state =
- (inside_outside == (INSIDE | OUTSIDE)) ? ModelInstance::PVS_Partly_Outside :
- (inside_outside == INSIDE) ? ModelInstance::PVS_Inside : ModelInstance::PVS_Fully_Outside;
+ (inside_outside == (INSIDE | OUTSIDE)) ? ModelInstancePVS_Partly_Outside :
+ (inside_outside == INSIDE) ? ModelInstancePVS_Inside : ModelInstancePVS_Fully_Outside;
if (inside_outside == INSIDE)
++ num_printable;
}
@@ -1496,9 +1531,6 @@ stl_stats ModelObject::get_object_stl_stats() const
// fill full_stats from all objet's meshes
for (ModelVolume* volume : this->volumes)
{
- if (volume->id() == this->volumes[0]->id())
- continue;
-
const stl_stats& stats = volume->mesh().stl.stats;
// initialize full_stats (for repaired errors)
@@ -1708,6 +1740,14 @@ void ModelObject::scale_to_fit(const Vec3d &size)
*/
}
+void ModelVolume::assign_new_unique_ids_recursive()
+{
+ ObjectBase::set_new_unique_id();
+ config.set_new_unique_id();
+ supported_facets.set_new_unique_id();
+ seam_facets.set_new_unique_id();
+}
+
void ModelVolume::rotate(double angle, Axis axis)
{
switch (axis)
@@ -1768,6 +1808,14 @@ void ModelVolume::transform_this_mesh(const Matrix3d &matrix, bool fix_left_hand
this->set_new_unique_id();
}
+void ModelVolume::convert_from_imperial_units()
+{
+ double in_to_mm = 25.4;
+ this->scale_geometry_after_creation(Vec3d(in_to_mm, in_to_mm, in_to_mm));
+ this->set_offset(Vec3d(0, 0, 0));
+ this->source.is_converted_from_inches = true;
+}
+
void ModelInstance::transform_mesh(TriangleMesh* mesh, bool dont_translate) const
{
mesh->transform(get_matrix(dont_translate));
@@ -1820,7 +1868,7 @@ void ModelInstance::transform_polygon(Polygon* polygon) const
arrangement::ArrangePolygon ModelInstance::get_arrange_polygon() const
{
- static const double SIMPLIFY_TOLERANCE_MM = 0.1;
+// static const double SIMPLIFY_TOLERANCE_MM = 0.1;
Vec3d rotation = get_rotation();
rotation.z() = 0.;
@@ -1832,13 +1880,11 @@ arrangement::ArrangePolygon ModelInstance::get_arrange_polygon() const
assert(!p.points.empty());
- // this may happen for malformed models, see:
- // https://github.com/prusa3d/PrusaSlicer/issues/2209
- if (!p.points.empty()) {
- Polygons pp{p};
- pp = p.simplify(scaled<double>(SIMPLIFY_TOLERANCE_MM));
- if (!pp.empty()) p = pp.front();
- }
+// if (!p.points.empty()) {
+// Polygons pp{p};
+// pp = p.simplify(scaled<double>(SIMPLIFY_TOLERANCE_MM));
+// if (!pp.empty()) p = pp.front();
+// }
arrangement::ArrangePolygon ret;
ret.poly.contour = std::move(p);
@@ -1848,6 +1894,83 @@ arrangement::ArrangePolygon ModelInstance::get_arrange_polygon() const
return ret;
}
+indexed_triangle_set FacetsAnnotation::get_facets(const ModelVolume& mv, EnforcerBlockerType type) const
+{
+ TriangleSelector selector(mv.mesh());
+ selector.deserialize(m_data);
+ indexed_triangle_set out = selector.get_facets(type);
+ return out;
+}
+
+bool FacetsAnnotation::set(const TriangleSelector& selector)
+{
+ std::map<int, std::vector<bool>> sel_map = selector.serialize();
+ if (sel_map != m_data) {
+ m_data = sel_map;
+ this->touch();
+ return true;
+ }
+ return false;
+}
+
+void FacetsAnnotation::clear()
+{
+ m_data.clear();
+ this->reset_timestamp();
+}
+
+// Following function takes data from a triangle and encodes it as string
+// of hexadecimal numbers (one digit per triangle). Used for 3MF export,
+// changing it may break backwards compatibility !!!!!
+std::string FacetsAnnotation::get_triangle_as_string(int triangle_idx) const
+{
+ std::string out;
+
+ auto triangle_it = m_data.find(triangle_idx);
+ if (triangle_it != m_data.end()) {
+ const std::vector<bool>& code = triangle_it->second;
+ int offset = 0;
+ while (offset < int(code.size())) {
+ int next_code = 0;
+ for (int i=3; i>=0; --i) {
+ next_code = next_code << 1;
+ next_code |= int(code[offset + i]);
+ }
+ offset += 4;
+
+ assert(next_code >=0 && next_code <= 15);
+ char digit = next_code < 10 ? next_code + '0' : (next_code-10)+'A';
+ out.insert(out.begin(), digit);
+ }
+ }
+ return out;
+}
+
+// Recover triangle splitting & state from string of hexadecimal values previously
+// generated by get_triangle_as_string. Used to load from 3MF.
+void FacetsAnnotation::set_triangle_from_string(int triangle_id, const std::string& str)
+{
+ assert(! str.empty());
+ m_data[triangle_id] = std::vector<bool>(); // zero current state or create new
+ std::vector<bool>& code = m_data[triangle_id];
+
+ for (auto it = str.crbegin(); it != str.crend(); ++it) {
+ const char ch = *it;
+ int dec = 0;
+ if (ch >= '0' && ch<='9')
+ dec = int(ch - '0');
+ else if (ch >='A' && ch <= 'F')
+ dec = 10 + int(ch - 'A');
+ else
+ assert(false);
+
+ // Convert to binary and append into code.
+ for (int i=0; i<4; ++i) {
+ code.insert(code.end(), bool(dec & (1 << i)));
+ }
+ }
+}
+
// Test whether the two models contain the same number of ModelObjects with the same set of IDs
// ordered in the same order. In that case it is not necessary to kill the background processing.
bool model_object_list_equal(const Model &model_old, const Model &model_new)
@@ -1911,6 +2034,26 @@ bool model_volume_list_changed(const ModelObject &model_object_old, const ModelO
return false;
}
+bool model_custom_supports_data_changed(const ModelObject& mo, const ModelObject& mo_new) {
+ assert(! model_volume_list_changed(mo, mo_new, ModelVolumeType::MODEL_PART));
+ assert(mo.volumes.size() == mo_new.volumes.size());
+ for (size_t i=0; i<mo.volumes.size(); ++i) {
+ if (! mo_new.volumes[i]->supported_facets.timestamp_matches(mo.volumes[i]->supported_facets))
+ return true;
+ }
+ return false;
+}
+
+bool model_custom_seam_data_changed(const ModelObject& mo, const ModelObject& mo_new) {
+ assert(! model_volume_list_changed(mo, mo_new, ModelVolumeType::MODEL_PART));
+ assert(mo.volumes.size() == mo_new.volumes.size());
+ for (size_t i=0; i<mo.volumes.size(); ++i) {
+ if (! mo_new.volumes[i]->seam_facets.timestamp_matches(mo.volumes[i]->seam_facets))
+ return true;
+ }
+ return false;
+}
+
extern bool model_has_multi_part_objects(const Model &model)
{
for (const ModelObject *model_object : model.objects)
@@ -1921,7 +2064,7 @@ extern bool model_has_multi_part_objects(const Model &model)
extern bool model_has_advanced_features(const Model &model)
{
- auto config_is_advanced = [](const DynamicPrintConfig &config) {
+ auto config_is_advanced = [](const ModelConfig &config) {
return ! (config.empty() || (config.size() == 1 && config.cbegin()->first == "extruder"));
};
for (const ModelObject *model_object : model.objects) {
@@ -1991,6 +2134,7 @@ void check_model_ids_equal(const Model &model1, const Model &model2)
}
}
}
+
#endif /* NDEBUG */
}
diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp
index 2fbd58461..99db132f6 100644
--- a/src/libslic3r/Model.hpp
+++ b/src/libslic3r/Model.hpp
@@ -3,7 +3,6 @@
#include "libslic3r.h"
#include "Geometry.hpp"
-#include "Layer.hpp"
#include "ObjectID.hpp"
#include "Point.hpp"
#include "PrintConfig.hpp"
@@ -39,12 +38,13 @@ class ModelVolume;
class ModelWipeTower;
class Print;
class SLAPrint;
+class TriangleSelector;
namespace UndoRedo {
class StackImpl;
}
-class ModelConfig : public ObjectBase, public DynamicPrintConfig
+class ModelConfigObject : public ObjectBase, public ModelConfig
{
private:
friend class cereal::access;
@@ -55,21 +55,25 @@ private:
// Constructors to be only called by derived classes.
// Default constructor to assign a unique ID.
- explicit ModelConfig() {}
+ explicit ModelConfigObject() = default;
// Constructor with ignored int parameter to assign an invalid ID, to be replaced
// by an existing ID copied from elsewhere.
- explicit ModelConfig(int) : ObjectBase(-1) {}
+ explicit ModelConfigObject(int) : ObjectBase(-1) {}
// Copy constructor copies the ID.
- explicit ModelConfig(const ModelConfig &cfg) : ObjectBase(-1), DynamicPrintConfig(cfg) { this->copy_id(cfg); }
+ explicit ModelConfigObject(const ModelConfigObject &cfg) = default;
// Move constructor copies the ID.
- explicit ModelConfig(ModelConfig &&cfg) : ObjectBase(-1), DynamicPrintConfig(std::move(cfg)) { this->copy_id(cfg); }
+ explicit ModelConfigObject(ModelConfigObject &&cfg) = default;
- ModelConfig& operator=(const ModelConfig &rhs) = default;
- ModelConfig& operator=(ModelConfig &&rhs) = default;
+ Timestamp timestamp() const throw() override { return this->ModelConfig::timestamp(); }
+ bool object_id_and_timestamp_match(const ModelConfigObject &rhs) const throw() { return this->id() == rhs.id() && this->timestamp() == rhs.timestamp(); }
- template<class Archive> void serialize(Archive &ar) {
- ar(cereal::base_class<DynamicPrintConfig>(this));
- }
+ // called by ModelObject::assign_copy()
+ ModelConfigObject& operator=(const ModelConfigObject &rhs) = default;
+ ModelConfigObject& operator=(ModelConfigObject &&rhs) = default;
+
+ template<class Archive> void serialize(Archive &ar) {
+ ar(cereal::base_class<ModelConfig>(this));
+ }
};
namespace Internal {
@@ -135,7 +139,7 @@ public:
// Attributes are defined by the AMF file format, but they don't seem to be used by Slic3r for any purpose.
t_model_material_attributes attributes;
// Dynamic configuration storage for the object specific configuration values, overriding the global configuration.
- ModelConfig config;
+ ModelConfigObject config;
Model* get_model() const { return m_model; }
void apply(const t_model_material_attributes &attributes)
@@ -161,7 +165,7 @@ private:
ModelMaterial() : ObjectBase(-1), config(-1), m_model(nullptr) { assert(this->id().invalid()); assert(this->config.id().invalid()); }
template<class Archive> void serialize(Archive &ar) {
assert(this->id().invalid()); assert(this->config.id().invalid());
- Internal::StaticSerializationWrapper<ModelConfig> config_wrapper(config);
+ Internal::StaticSerializationWrapper<ModelConfigObject> config_wrapper(config);
ar(attributes, config_wrapper);
// assert(this->id().valid()); assert(this->config.id().valid());
}
@@ -172,6 +176,45 @@ private:
ModelMaterial& operator=(ModelMaterial &&rhs) = delete;
};
+class LayerHeightProfile final : public ObjectWithTimestamp {
+public:
+ // Assign the content if the timestamp differs, don't assign an ObjectID.
+ void assign(const LayerHeightProfile &rhs) { if (! this->timestamp_matches(rhs)) { this->m_data = rhs.m_data; this->copy_timestamp(rhs); } }
+ void assign(LayerHeightProfile &&rhs) { if (! this->timestamp_matches(rhs)) { this->m_data = std::move(rhs.m_data); this->copy_timestamp(rhs); } }
+
+ std::vector<coordf_t> get() const throw() { return m_data; }
+ bool empty() const throw() { return m_data.empty(); }
+ void set(const std::vector<coordf_t> &data) { if (m_data != data) { m_data = data; this->touch(); } }
+ void set(std::vector<coordf_t> &&data) { if (m_data != data) { m_data = std::move(data); this->touch(); } }
+ void clear() { m_data.clear(); this->touch(); }
+
+ template<class Archive> void serialize(Archive &ar)
+ {
+ ar(cereal::base_class<ObjectWithTimestamp>(this), m_data);
+ }
+
+private:
+ // Constructors to be only called by derived classes.
+ // Default constructor to assign a unique ID.
+ explicit LayerHeightProfile() = default;
+ // Constructor with ignored int parameter to assign an invalid ID, to be replaced
+ // by an existing ID copied from elsewhere.
+ explicit LayerHeightProfile(int) : ObjectWithTimestamp(-1) {}
+ // Copy constructor copies the ID.
+ explicit LayerHeightProfile(const LayerHeightProfile &rhs) = default;
+ // Move constructor copies the ID.
+ explicit LayerHeightProfile(LayerHeightProfile &&rhs) = default;
+
+ // called by ModelObject::assign_copy()
+ LayerHeightProfile& operator=(const LayerHeightProfile &rhs) = default;
+ LayerHeightProfile& operator=(LayerHeightProfile &&rhs) = default;
+
+ std::vector<coordf_t> m_data;
+
+ // to access set_new_unique_id() when copy / pasting an object
+ friend class ModelObject;
+};
+
// A printable object, possibly having multiple print volumes (each with its own set of parameters and materials),
// and possibly having multiple modifier volumes, each modifier volume with its set of parameters and materials.
// Each ModelObject may be instantiated mutliple times, each instance having different placement on the print bed,
@@ -188,12 +231,12 @@ public:
// ModelVolumes are owned by this ModelObject.
ModelVolumePtrs volumes;
// Configuration parameters specific to a single ModelObject, overriding the global Slic3r settings.
- ModelConfig config;
+ ModelConfigObject config;
// Variation of a layer thickness for spans of Z coordinates + optional parameter overrides.
t_layer_config_ranges layer_config_ranges;
// Profile of increasing z to a layer height, to be linearly interpolated when calculating the layers.
// The pairs of <z, layer_height> are packed into a 1D array.
- std::vector<coordf_t> layer_height_profile;
+ LayerHeightProfile layer_height_profile;
// Whether or not this object is printable
bool printable;
@@ -214,8 +257,8 @@ public:
when user expects that. */
Vec3d origin_translation;
- Model* get_model() { return m_model; };
- const Model* get_model() const { return m_model; };
+ Model* get_model() { return m_model; }
+ const Model* get_model() const { return m_model; }
ModelVolume* add_volume(const TriangleMesh &mesh);
ModelVolume* add_volume(TriangleMesh &&mesh);
@@ -243,6 +286,8 @@ public:
// Non-transformed (non-rotated, non-scaled, non-translated) sum of non-modifier object volumes.
// Currently used by ModelObject::mesh() and to calculate the 2D envelope for 2D plater.
TriangleMesh raw_mesh() const;
+ // The same as above, but producing a lightweight indexed_triangle_set.
+ indexed_triangle_set raw_indexed_triangle_set() const;
// Non-transformed (non-rotated, non-scaled, non-translated) sum of all object volumes.
TriangleMesh full_raw_mesh() const;
// A transformed snug bounding box around the non-modifier object volumes, without the translation applied.
@@ -280,12 +325,14 @@ public:
// This method could only be called before the meshes of this ModelVolumes are not shared!
void scale_mesh_after_creation(const Vec3d& versor);
+ void convert_units(ModelObjectPtrs&new_objects, bool from_imperial, std::vector<int> volume_idxs);
size_t materials_count() const;
size_t facets_count() const;
bool needed_repair() const;
ModelObjectPtrs cut(size_t instance, coordf_t z, bool keep_upper = true, bool keep_lower = true, bool rotate_lower = false); // Note: z is in world coordinates
void split(ModelObjectPtrs* new_objects);
+ void merge();
// Support for non-uniform scaling of instances. If an instance is rotated by angles, which are not multiples of ninety degrees,
// then the scaling in world coordinate system is not representable by the Geometry::Transformation structure.
// This situation is solved by baking in the instance transformation into the mesh vertices.
@@ -313,41 +360,85 @@ private:
// This constructor assigns new ID to this ModelObject and its config.
explicit ModelObject(Model* model) : m_model(model), printable(true), origin_translation(Vec3d::Zero()),
m_bounding_box_valid(false), m_raw_bounding_box_valid(false), m_raw_mesh_bounding_box_valid(false)
- { assert(this->id().valid()); }
- explicit ModelObject(int) : ObjectBase(-1), config(-1), m_model(nullptr), printable(true), origin_translation(Vec3d::Zero()), m_bounding_box_valid(false), m_raw_bounding_box_valid(false), m_raw_mesh_bounding_box_valid(false)
- { assert(this->id().invalid()); assert(this->config.id().invalid()); }
+ {
+ assert(this->id().valid());
+ assert(this->config.id().valid());
+ assert(this->layer_height_profile.id().valid());
+ }
+ explicit ModelObject(int) : ObjectBase(-1), config(-1), layer_height_profile(-1), m_model(nullptr), printable(true), origin_translation(Vec3d::Zero()), m_bounding_box_valid(false), m_raw_bounding_box_valid(false), m_raw_mesh_bounding_box_valid(false)
+ {
+ assert(this->id().invalid());
+ assert(this->config.id().invalid());
+ assert(this->layer_height_profile.id().invalid());
+ }
~ModelObject();
void assign_new_unique_ids_recursive() override;
// To be able to return an object from own copy / clone methods. Hopefully the compiler will do the "Copy elision"
// (Omits copy and move(since C++11) constructors, resulting in zero - copy pass - by - value semantics).
- ModelObject(const ModelObject &rhs) : ObjectBase(-1), config(-1), m_model(rhs.m_model) {
- assert(this->id().invalid()); assert(this->config.id().invalid()); assert(rhs.id() != rhs.config.id());
+ ModelObject(const ModelObject &rhs) : ObjectBase(-1), config(-1), layer_height_profile(-1), m_model(rhs.m_model) {
+ assert(this->id().invalid());
+ assert(this->config.id().invalid());
+ assert(this->layer_height_profile.id().invalid());
+ assert(rhs.id() != rhs.config.id());
+ assert(rhs.id() != rhs.layer_height_profile.id());
this->assign_copy(rhs);
- assert(this->id().valid()); assert(this->config.id().valid()); assert(this->id() != this->config.id());
- assert(this->id() == rhs.id()); assert(this->config.id() == rhs.config.id());
+ assert(this->id().valid());
+ assert(this->config.id().valid());
+ assert(this->layer_height_profile.id().valid());
+ assert(this->id() != this->config.id());
+ assert(this->id() != this->layer_height_profile.id());
+ assert(this->id() == rhs.id());
+ assert(this->config.id() == rhs.config.id());
+ assert(this->layer_height_profile.id() == rhs.layer_height_profile.id());
}
- explicit ModelObject(ModelObject &&rhs) : ObjectBase(-1), config(-1) {
- assert(this->id().invalid()); assert(this->config.id().invalid()); assert(rhs.id() != rhs.config.id());
+ explicit ModelObject(ModelObject &&rhs) : ObjectBase(-1), config(-1), layer_height_profile(-1) {
+ assert(this->id().invalid());
+ assert(this->config.id().invalid());
+ assert(this->layer_height_profile.id().invalid());
+ assert(rhs.id() != rhs.config.id());
+ assert(rhs.id() != rhs.layer_height_profile.id());
this->assign_copy(std::move(rhs));
- assert(this->id().valid()); assert(this->config.id().valid()); assert(this->id() != this->config.id());
- assert(this->id() == rhs.id()); assert(this->config.id() == rhs.config.id());
+ assert(this->id().valid());
+ assert(this->config.id().valid());
+ assert(this->layer_height_profile.id().valid());
+ assert(this->id() != this->config.id());
+ assert(this->id() != this->layer_height_profile.id());
+ assert(this->id() == rhs.id());
+ assert(this->config.id() == rhs.config.id());
+ assert(this->layer_height_profile.id() == rhs.layer_height_profile.id());
}
- ModelObject& operator=(const ModelObject &rhs) {
+ ModelObject& operator=(const ModelObject &rhs) {
this->assign_copy(rhs);
m_model = rhs.m_model;
- assert(this->id().valid()); assert(this->config.id().valid()); assert(this->id() != this->config.id());
- assert(this->id() == rhs.id()); assert(this->config.id() == rhs.config.id());
+ assert(this->id().valid());
+ assert(this->config.id().valid());
+ assert(this->layer_height_profile.id().valid());
+ assert(this->id() != this->config.id());
+ assert(this->id() != this->layer_height_profile.id());
+ assert(this->id() == rhs.id());
+ assert(this->config.id() == rhs.config.id());
+ assert(this->layer_height_profile.id() == rhs.layer_height_profile.id());
return *this;
}
- ModelObject& operator=(ModelObject &&rhs) {
+ ModelObject& operator=(ModelObject &&rhs) {
this->assign_copy(std::move(rhs));
m_model = rhs.m_model;
- assert(this->id().valid()); assert(this->config.id().valid()); assert(this->id() != this->config.id());
- assert(this->id() == rhs.id()); assert(this->config.id() == rhs.config.id());
+ assert(this->id().valid());
+ assert(this->config.id().valid());
+ assert(this->layer_height_profile.id().valid());
+ assert(this->id() != this->config.id());
+ assert(this->id() != this->layer_height_profile.id());
+ assert(this->id() == rhs.id());
+ assert(this->config.id() == rhs.config.id());
+ assert(this->layer_height_profile.id() == rhs.layer_height_profile.id());
return *this;
}
- void set_new_unique_id() { ObjectBase::set_new_unique_id(); this->config.set_new_unique_id(); }
+ void set_new_unique_id() {
+ ObjectBase::set_new_unique_id();
+ this->config.set_new_unique_id();
+ this->layer_height_profile.set_new_unique_id();
+ }
OBJECTBASE_DERIVED_COPY_MOVE_CLONE(ModelObject)
@@ -371,13 +462,19 @@ private:
friend class cereal::access;
friend class UndoRedo::StackImpl;
// Used for deserialization -> Don't allocate any IDs for the ModelObject or its config.
- ModelObject() : ObjectBase(-1), config(-1), m_model(nullptr), m_bounding_box_valid(false), m_raw_bounding_box_valid(false), m_raw_mesh_bounding_box_valid(false) {
- assert(this->id().invalid()); assert(this->config.id().invalid());
+ ModelObject() :
+ ObjectBase(-1), config(-1), layer_height_profile(-1),
+ m_model(nullptr), m_bounding_box_valid(false), m_raw_bounding_box_valid(false), m_raw_mesh_bounding_box_valid(false) {
+ assert(this->id().invalid());
+ assert(this->config.id().invalid());
+ assert(this->layer_height_profile.id().invalid());
}
template<class Archive> void serialize(Archive &ar) {
ar(cereal::base_class<ObjectBase>(this));
- Internal::StaticSerializationWrapper<ModelConfig> config_wrapper(config);
- ar(name, input_file, instances, volumes, config_wrapper, layer_config_ranges, layer_height_profile, sla_support_points, sla_points_status, sla_drain_holes, printable, origin_translation,
+ Internal::StaticSerializationWrapper<ModelConfigObject> config_wrapper(config);
+ Internal::StaticSerializationWrapper<LayerHeightProfile> layer_heigth_profile_wrapper(layer_height_profile);
+ ar(name, input_file, instances, volumes, config_wrapper, layer_config_ranges, layer_heigth_profile_wrapper,
+ sla_support_points, sla_points_status, sla_drain_holes, printable, origin_translation,
m_bounding_box, m_bounding_box_valid, m_raw_bounding_box, m_raw_bounding_box_valid, m_raw_mesh_bounding_box, m_raw_mesh_bounding_box_valid);
}
};
@@ -391,6 +488,56 @@ enum class ModelVolumeType : int {
SUPPORT_BLOCKER,
};
+enum class EnforcerBlockerType : int8_t {
+ // Maximum is 3. The value is serialized in TriangleSelector into 2 bits!
+ NONE = 0,
+ ENFORCER = 1,
+ BLOCKER = 2
+};
+
+class FacetsAnnotation final : public ObjectWithTimestamp {
+public:
+ // Assign the content if the timestamp differs, don't assign an ObjectID.
+ void assign(const FacetsAnnotation& rhs) { if (! this->timestamp_matches(rhs)) { this->m_data = rhs.m_data; this->copy_timestamp(rhs); } }
+ void assign(FacetsAnnotation&& rhs) { if (! this->timestamp_matches(rhs)) { this->m_data = std::move(rhs.m_data); this->copy_timestamp(rhs); } }
+ const std::map<int, std::vector<bool>>& get_data() const throw() { return m_data; }
+ bool set(const TriangleSelector& selector);
+ indexed_triangle_set get_facets(const ModelVolume& mv, EnforcerBlockerType type) const;
+ bool empty() const { return m_data.empty(); }
+ void clear();
+ std::string get_triangle_as_string(int i) const;
+ void set_triangle_from_string(int triangle_id, const std::string& str);
+
+private:
+ // Constructors to be only called by derived classes.
+ // Default constructor to assign a unique ID.
+ explicit FacetsAnnotation() = default;
+ // Constructor with ignored int parameter to assign an invalid ID, to be replaced
+ // by an existing ID copied from elsewhere.
+ explicit FacetsAnnotation(int) : ObjectWithTimestamp(-1) {}
+ // Copy constructor copies the ID.
+ explicit FacetsAnnotation(const FacetsAnnotation &rhs) = default;
+ // Move constructor copies the ID.
+ explicit FacetsAnnotation(FacetsAnnotation &&rhs) = default;
+
+ // called by ModelVolume::assign_copy()
+ FacetsAnnotation& operator=(const FacetsAnnotation &rhs) = default;
+ FacetsAnnotation& operator=(FacetsAnnotation &&rhs) = default;
+
+ friend class cereal::access;
+ friend class UndoRedo::StackImpl;
+
+ template<class Archive> void serialize(Archive &ar)
+ {
+ ar(cereal::base_class<ObjectWithTimestamp>(this), m_data);
+ }
+
+ std::map<int, std::vector<bool>> m_data;
+
+ // To access set_new_unique_id() when copy / pasting a ModelVolume.
+ friend class ModelVolume;
+};
+
// An object STL, or a modifier volume, over which a different set of parameters shall be applied.
// ModelVolume instances are owned by a ModelObject.
class ModelVolume final : public ObjectBase
@@ -405,8 +552,13 @@ public:
int volume_idx{ -1 };
Vec3d mesh_offset{ Vec3d::Zero() };
Geometry::Transformation transform;
+ bool is_converted_from_inches = false;
- template<class Archive> void serialize(Archive& ar) { ar(input_file, object_idx, volume_idx, mesh_offset, transform); }
+ template<class Archive> void serialize(Archive& ar) {
+ //FIXME Vojtech: Serialize / deserialize only if the Source is set.
+ // likely testing input_file or object_idx would be sufficient.
+ ar(input_file, object_idx, volume_idx, mesh_offset, transform, is_converted_from_inches);
+ }
};
Source source;
@@ -419,10 +571,16 @@ public:
void reset_mesh() { m_mesh = std::make_shared<const TriangleMesh>(); }
// Configuration parameters specific to an object model geometry or a modifier volume,
// overriding the global Slic3r settings and the ModelObject settings.
- ModelConfig config;
+ ModelConfigObject config;
+
+ // List of mesh facets to be supported/unsupported.
+ FacetsAnnotation supported_facets;
+
+ // List of seam enforcers/blockers.
+ FacetsAnnotation seam_facets;
// A parent object owning this modifier volume.
- ModelObject* get_object() const { return this->object; };
+ ModelObject* get_object() const { return this->object; }
ModelVolumeType type() const { return m_type; }
void set_type(const ModelVolumeType t) { m_type = t; }
bool is_model_part() const { return m_type == ModelVolumeType::MODEL_PART; }
@@ -498,10 +656,16 @@ public:
void set_mirror(const Vec3d& mirror) { m_transformation.set_mirror(mirror); }
void set_mirror(Axis axis, double mirror) { m_transformation.set_mirror(axis, mirror); }
+ void convert_from_imperial_units();
const Transform3d& get_matrix(bool dont_translate = false, bool dont_rotate = false, bool dont_scale = false, bool dont_mirror = false) const { return m_transformation.get_matrix(dont_translate, dont_rotate, dont_scale, dont_mirror); }
- void set_new_unique_id() { ObjectBase::set_new_unique_id(); this->config.set_new_unique_id(); }
+ void set_new_unique_id() {
+ ObjectBase::set_new_unique_id();
+ this->config.set_new_unique_id();
+ this->supported_facets.set_new_unique_id();
+ this->seam_facets.set_new_unique_id();
+ }
protected:
friend class Print;
@@ -512,7 +676,7 @@ protected:
// Copies IDs of both the ModelVolume and its config.
explicit ModelVolume(const ModelVolume &rhs) = default;
void set_model_object(ModelObject *model_object) { object = model_object; }
- void assign_new_unique_ids_recursive() override { ObjectBase::set_new_unique_id(); config.set_new_unique_id(); }
+ void assign_new_unique_ids_recursive() override;
void transform_this_mesh(const Transform3d& t, bool fix_left_handed);
void transform_this_mesh(const Matrix3d& m, bool fix_left_handed);
@@ -536,35 +700,71 @@ private:
ModelVolume(ModelObject *object, const TriangleMesh &mesh) : m_mesh(new TriangleMesh(mesh)), m_type(ModelVolumeType::MODEL_PART), object(object)
{
- assert(this->id().valid()); assert(this->config.id().valid()); assert(this->id() != this->config.id());
+ assert(this->id().valid());
+ assert(this->config.id().valid());
+ assert(this->supported_facets.id().valid());
+ assert(this->seam_facets.id().valid());
+ assert(this->id() != this->config.id());
+ assert(this->id() != this->supported_facets.id());
+ assert(this->id() != this->seam_facets.id());
if (mesh.stl.stats.number_of_facets > 1)
calculate_convex_hull();
}
ModelVolume(ModelObject *object, TriangleMesh &&mesh, TriangleMesh &&convex_hull) :
m_mesh(new TriangleMesh(std::move(mesh))), m_convex_hull(new TriangleMesh(std::move(convex_hull))), m_type(ModelVolumeType::MODEL_PART), object(object) {
- assert(this->id().valid()); assert(this->config.id().valid()); assert(this->id() != this->config.id());
+ assert(this->id().valid());
+ assert(this->config.id().valid());
+ assert(this->supported_facets.id().valid());
+ assert(this->seam_facets.id().valid());
+ assert(this->id() != this->config.id());
+ assert(this->id() != this->supported_facets.id());
+ assert(this->id() != this->seam_facets.id());
}
// Copying an existing volume, therefore this volume will get a copy of the ID assigned.
ModelVolume(ModelObject *object, const ModelVolume &other) :
ObjectBase(other),
- name(other.name), source(other.source), m_mesh(other.m_mesh), m_convex_hull(other.m_convex_hull), config(other.config), m_type(other.m_type), object(object), m_transformation(other.m_transformation)
+ name(other.name), source(other.source), m_mesh(other.m_mesh), m_convex_hull(other.m_convex_hull),
+ config(other.config), m_type(other.m_type), object(object), m_transformation(other.m_transformation),
+ supported_facets(other.supported_facets), seam_facets(other.seam_facets)
{
- assert(this->id().valid()); assert(this->config.id().valid()); assert(this->id() != this->config.id());
- assert(this->id() == other.id() && this->config.id() == other.config.id());
+ assert(this->id().valid());
+ assert(this->config.id().valid());
+ assert(this->supported_facets.id().valid());
+ assert(this->seam_facets.id().valid());
+ assert(this->id() != this->config.id());
+ assert(this->id() != this->supported_facets.id());
+ assert(this->id() != this->seam_facets.id());
+ assert(this->id() == other.id());
+ assert(this->config.id() == other.config.id());
+ assert(this->supported_facets.id() == other.supported_facets.id());
+ assert(this->seam_facets.id() == other.seam_facets.id());
this->set_material_id(other.material_id());
}
// Providing a new mesh, therefore this volume will get a new unique ID assigned.
ModelVolume(ModelObject *object, const ModelVolume &other, const TriangleMesh &&mesh) :
name(other.name), source(other.source), m_mesh(new TriangleMesh(std::move(mesh))), config(other.config), m_type(other.m_type), object(object), m_transformation(other.m_transformation)
{
- assert(this->id().valid()); assert(this->config.id().valid()); assert(this->id() != this->config.id());
- assert(this->id() != other.id() && this->config.id() == other.config.id());
+ assert(this->id().valid());
+ assert(this->config.id().valid());
+ assert(this->supported_facets.id().valid());
+ assert(this->seam_facets.id().valid());
+ assert(this->id() != this->config.id());
+ assert(this->id() != this->supported_facets.id());
+ assert(this->id() != this->seam_facets.id());
+ assert(this->id() != other.id());
+ assert(this->config.id() == other.config.id());
this->set_material_id(other.material_id());
this->config.set_new_unique_id();
if (mesh.stl.stats.number_of_facets > 1)
calculate_convex_hull();
- assert(this->config.id().valid()); assert(this->config.id() != other.config.id()); assert(this->id() != this->config.id());
+ assert(this->config.id().valid());
+ assert(this->config.id() != other.config.id());
+ assert(this->supported_facets.id() != other.supported_facets.id());
+ assert(this->seam_facets.id() != other.seam_facets.id());
+ assert(this->id() != this->config.id());
+ assert(this->supported_facets.empty());
+ assert(this->seam_facets.empty());
}
ModelVolume& operator=(ModelVolume &rhs) = delete;
@@ -572,12 +772,17 @@ private:
friend class cereal::access;
friend class UndoRedo::StackImpl;
// Used for deserialization, therefore no IDs are allocated.
- ModelVolume() : ObjectBase(-1), config(-1), object(nullptr) {
- assert(this->id().invalid()); assert(this->config.id().invalid());
+ ModelVolume() : ObjectBase(-1), config(-1), supported_facets(-1), seam_facets(-1), object(nullptr) {
+ assert(this->id().invalid());
+ assert(this->config.id().invalid());
+ assert(this->supported_facets.id().invalid());
+ assert(this->seam_facets.id().invalid());
}
template<class Archive> void load(Archive &ar) {
bool has_convex_hull;
ar(name, source, m_mesh, m_type, m_material_id, m_transformation, m_is_splittable, has_convex_hull);
+ cereal::load_by_value(ar, supported_facets);
+ cereal::load_by_value(ar, seam_facets);
cereal::load_by_value(ar, config);
assert(m_mesh);
if (has_convex_hull) {
@@ -591,31 +796,34 @@ private:
template<class Archive> void save(Archive &ar) const {
bool has_convex_hull = m_convex_hull.get() != nullptr;
ar(name, source, m_mesh, m_type, m_material_id, m_transformation, m_is_splittable, has_convex_hull);
+ cereal::save_by_value(ar, supported_facets);
+ cereal::save_by_value(ar, seam_facets);
cereal::save_by_value(ar, config);
if (has_convex_hull)
cereal::save_optional(ar, m_convex_hull);
}
};
+
+enum ModelInstanceEPrintVolumeState : unsigned char
+{
+ ModelInstancePVS_Inside,
+ ModelInstancePVS_Partly_Outside,
+ ModelInstancePVS_Fully_Outside,
+ ModelInstanceNum_BedStates
+};
+
+
// A single instance of a ModelObject.
// Knows the affine transformation of an object.
class ModelInstance final : public ObjectBase
{
-public:
- enum EPrintVolumeState : unsigned char
- {
- PVS_Inside,
- PVS_Partly_Outside,
- PVS_Fully_Outside,
- Num_BedStates
- };
-
private:
Geometry::Transformation m_transformation;
public:
// flag showing the position of this instance with respect to the print volume (set by Print::validate() using ModelObject::check_instances_print_volume_state())
- EPrintVolumeState print_volume_state;
+ ModelInstanceEPrintVolumeState print_volume_state;
// Whether or not this instance is printable
bool printable;
@@ -662,13 +870,13 @@ public:
const Transform3d& get_matrix(bool dont_translate = false, bool dont_rotate = false, bool dont_scale = false, bool dont_mirror = false) const { return m_transformation.get_matrix(dont_translate, dont_rotate, dont_scale, dont_mirror); }
- bool is_printable() const { return object->printable && printable && (print_volume_state == PVS_Inside); }
+ bool is_printable() const { return object->printable && printable && (print_volume_state == ModelInstancePVS_Inside); }
// Getting the input polygon for arrange
arrangement::ArrangePolygon get_arrange_polygon() const;
// Apply the arrange result on the ModelInstance
- void apply_arrange_result(const Vec2crd& offs, double rotation)
+ void apply_arrange_result(const Vec2d& offs, double rotation)
{
// write the transformation data into the model instance
set_rotation(Z, rotation);
@@ -691,10 +899,10 @@ private:
ModelObject* object;
// Constructor, which assigns a new unique ID.
- explicit ModelInstance(ModelObject* object) : print_volume_state(PVS_Inside), printable(true), object(object) { assert(this->id().valid()); }
+ explicit ModelInstance(ModelObject* object) : print_volume_state(ModelInstancePVS_Inside), printable(true), object(object) { assert(this->id().valid()); }
// Constructor, which assigns a new unique ID.
explicit ModelInstance(ModelObject *object, const ModelInstance &other) :
- m_transformation(other.m_transformation), print_volume_state(PVS_Inside), printable(other.printable), object(object) { assert(this->id().valid() && this->id() != other.id()); }
+ m_transformation(other.m_transformation), print_volume_state(ModelInstancePVS_Inside), printable(other.printable), object(object) { assert(this->id().valid() && this->id() != other.id()); }
explicit ModelInstance(ModelInstance &&rhs) = delete;
ModelInstance& operator=(const ModelInstance &rhs) = delete;
@@ -709,6 +917,7 @@ private:
}
};
+
class ModelWipeTower final : public ObjectBase
{
public:
@@ -802,14 +1011,14 @@ public:
bool center_instances_around_point(const Vec2d &point);
void translate(coordf_t x, coordf_t y, coordf_t z) { for (ModelObject *o : this->objects) o->translate(x, y, z); }
TriangleMesh mesh() const;
- bool arrange_objects(coordf_t dist, const BoundingBoxf* bb = NULL);
+
// Croaks if the duplicated objects do not fit the print bed.
- void duplicate(size_t copies_num, coordf_t dist, const BoundingBoxf* bb = NULL);
- void duplicate_objects(size_t copies_num, coordf_t dist, const BoundingBoxf* bb = NULL);
- void duplicate_objects_grid(size_t x, size_t y, coordf_t dist);
+ void duplicate_objects_grid(size_t x, size_t y, coordf_t dist);
bool looks_like_multipart_object() const;
void convert_multipart_object(unsigned int max_extruders);
+ bool looks_like_imperial_units() const;
+ void convert_from_imperial_units(bool only_small_volumes);
// Ensures that the min z of the model is not negative
void adjust_min_z();
@@ -822,7 +1031,7 @@ public:
std::string propose_export_file_name_and_path(const std::string &new_extension) const;
private:
- explicit Model(int) : ObjectBase(-1) { assert(this->id().invalid()); };
+ explicit Model(int) : ObjectBase(-1) { assert(this->id().invalid()); }
void assign_new_unique_ids_recursive();
void update_links_bottom_up_recursive();
@@ -831,7 +1040,7 @@ private:
template<class Archive> void serialize(Archive &ar) {
Internal::StaticSerializationWrapper<ModelWipeTower> wipe_tower_wrapper(wipe_tower);
ar(materials, objects, wipe_tower_wrapper);
- }
+ }
};
#undef OBJECTBASE_DERIVED_COPY_MOVE_CLONE
@@ -849,6 +1058,14 @@ extern bool model_object_list_extended(const Model &model_old, const Model &mode
// than the old ModelObject.
extern bool model_volume_list_changed(const ModelObject &model_object_old, const ModelObject &model_object_new, const ModelVolumeType type);
+// Test whether the now ModelObject has newer custom supports data than the old one.
+// The function assumes that volumes list is synchronized.
+extern bool model_custom_supports_data_changed(const ModelObject& mo, const ModelObject& mo_new);
+
+// Test whether the now ModelObject has newer custom seam data than the old one.
+// The function assumes that volumes list is synchronized.
+extern bool model_custom_seam_data_changed(const ModelObject& mo, const ModelObject& mo_new);
+
// If the model has multi-part objects, then it is currently not supported by the SLA mode.
// Either the model cannot be loaded, or a SLA printer has to be activated.
extern bool model_has_multi_part_objects(const Model &model);
@@ -866,7 +1083,7 @@ void check_model_ids_equal(const Model &model1, const Model &model2);
namespace cereal
{
template <class Archive> struct specialize<Archive, Slic3r::ModelVolume, cereal::specialization::member_load_save> {};
- template <class Archive> struct specialize<Archive, Slic3r::ModelConfig, cereal::specialization::member_serialize> {};
+ template <class Archive> struct specialize<Archive, Slic3r::ModelConfigObject, cereal::specialization::member_serialize> {};
}
#endif /* slic3r_Model_hpp_ */
diff --git a/src/libslic3r/ModelArrange.cpp b/src/libslic3r/ModelArrange.cpp
new file mode 100644
index 000000000..fcea7e14e
--- /dev/null
+++ b/src/libslic3r/ModelArrange.cpp
@@ -0,0 +1,85 @@
+#include "ModelArrange.hpp"
+
+#include <libslic3r/Model.hpp>
+#include "MTUtils.hpp"
+
+namespace Slic3r {
+
+arrangement::ArrangePolygons get_arrange_polys(const Model &model, ModelInstancePtrs &instances)
+{
+ size_t count = 0;
+ for (auto obj : model.objects) count += obj->instances.size();
+
+ ArrangePolygons input;
+ input.reserve(count);
+ instances.clear(); instances.reserve(count);
+ for (ModelObject *mo : model.objects)
+ for (ModelInstance *minst : mo->instances) {
+ input.emplace_back(minst->get_arrange_polygon());
+ instances.emplace_back(minst);
+ }
+
+ return input;
+}
+
+bool apply_arrange_polys(ArrangePolygons &input, ModelInstancePtrs &instances, VirtualBedFn vfn)
+{
+ bool ret = true;
+
+ for(size_t i = 0; i < input.size(); ++i) {
+ if (input[i].bed_idx != 0) { ret = false; if (vfn) vfn(input[i]); }
+ if (input[i].bed_idx >= 0)
+ instances[i]->apply_arrange_result(input[i].translation.cast<double>(),
+ input[i].rotation);
+ }
+
+ return ret;
+}
+
+Slic3r::arrangement::ArrangePolygon get_arrange_poly(const Model &model)
+{
+ ArrangePolygon ap;
+ Points &apts = ap.poly.contour.points;
+ for (const ModelObject *mo : model.objects)
+ for (const ModelInstance *minst : mo->instances) {
+ ArrangePolygon obj_ap = minst->get_arrange_polygon();
+ ap.poly.contour.rotate(obj_ap.rotation);
+ ap.poly.contour.translate(obj_ap.translation.x(), obj_ap.translation.y());
+ const Points &pts = obj_ap.poly.contour.points;
+ std::copy(pts.begin(), pts.end(), std::back_inserter(apts));
+ }
+
+ apts = std::move(Geometry::convex_hull(apts).points);
+ return ap;
+}
+
+void duplicate(Model &model, Slic3r::arrangement::ArrangePolygons &copies, VirtualBedFn vfn)
+{
+ for (ModelObject *o : model.objects) {
+ // make a copy of the pointers in order to avoid recursion when appending their copies
+ ModelInstancePtrs instances = o->instances;
+ o->instances.clear();
+ for (const ModelInstance *i : instances) {
+ for (arrangement::ArrangePolygon &ap : copies) {
+ if (ap.bed_idx != 0) vfn(ap);
+ ModelInstance *instance = o->add_instance(*i);
+ Vec2d pos = unscale(ap.translation);
+ instance->set_offset(instance->get_offset() + to_3d(pos, 0.));
+ }
+ }
+ o->invalidate_bounding_box();
+ }
+}
+
+void duplicate_objects(Model &model, size_t copies_num)
+{
+ for (ModelObject *o : model.objects) {
+ // make a copy of the pointers in order to avoid recursion when appending their copies
+ ModelInstancePtrs instances = o->instances;
+ for (const ModelInstance *i : instances)
+ for (size_t k = 2; k <= copies_num; ++ k)
+ o->add_instance(*i);
+ }
+}
+
+} // namespace Slic3r
diff --git a/src/libslic3r/ModelArrange.hpp b/src/libslic3r/ModelArrange.hpp
new file mode 100644
index 000000000..124c5c018
--- /dev/null
+++ b/src/libslic3r/ModelArrange.hpp
@@ -0,0 +1,71 @@
+#ifndef MODELARRANGE_HPP
+#define MODELARRANGE_HPP
+
+#include <libslic3r/Arrange.hpp>
+
+namespace Slic3r {
+
+class Model;
+class ModelInstance;
+using ModelInstancePtrs = std::vector<ModelInstance*>;
+
+using arrangement::ArrangePolygon;
+using arrangement::ArrangePolygons;
+using arrangement::ArrangeParams;
+using arrangement::InfiniteBed;
+using arrangement::CircleBed;
+
+// Do something with ArrangePolygons in virtual beds
+using VirtualBedFn = std::function<void(arrangement::ArrangePolygon&)>;
+
+[[noreturn]] inline void throw_if_out_of_bed(arrangement::ArrangePolygon&)
+{
+ throw Slic3r::RuntimeError("Objects could not fit on the bed");
+}
+
+ArrangePolygons get_arrange_polys(const Model &model, ModelInstancePtrs &instances);
+ArrangePolygon get_arrange_poly(const Model &model);
+bool apply_arrange_polys(ArrangePolygons &polys, ModelInstancePtrs &instances, VirtualBedFn);
+
+void duplicate(Model &model, ArrangePolygons &copies, VirtualBedFn);
+void duplicate_objects(Model &model, size_t copies_num);
+
+template<class TBed>
+bool arrange_objects(Model & model,
+ const TBed & bed,
+ const ArrangeParams &params,
+ VirtualBedFn vfn = throw_if_out_of_bed)
+{
+ ModelInstancePtrs instances;
+ auto&& input = get_arrange_polys(model, instances);
+ arrangement::arrange(input, bed, params);
+
+ return apply_arrange_polys(input, instances, vfn);
+}
+
+template<class TBed>
+void duplicate(Model & model,
+ size_t copies_num,
+ const TBed & bed,
+ const ArrangeParams &params,
+ VirtualBedFn vfn = throw_if_out_of_bed)
+{
+ ArrangePolygons copies(copies_num, get_arrange_poly(model));
+ arrangement::arrange(copies, bed, params);
+ duplicate(model, copies, vfn);
+}
+
+template<class TBed>
+void duplicate_objects(Model & model,
+ size_t copies_num,
+ const TBed & bed,
+ const ArrangeParams &params,
+ VirtualBedFn vfn = throw_if_out_of_bed)
+{
+ duplicate_objects(model, copies_num);
+ arrange_objects(model, bed, params, vfn);
+}
+
+}
+
+#endif // MODELARRANGE_HPP
diff --git a/src/libslic3r/MotionPlanner.cpp b/src/libslic3r/MotionPlanner.cpp
deleted file mode 100644
index 45a80671c..000000000
--- a/src/libslic3r/MotionPlanner.cpp
+++ /dev/null
@@ -1,362 +0,0 @@
-#include "BoundingBox.hpp"
-#include "MotionPlanner.hpp"
-#include "MutablePriorityQueue.hpp"
-#include "Utils.hpp"
-
-#include <limits> // for numeric_limits
-#include <assert.h>
-
-#include "boost/polygon/voronoi.hpp"
-using boost::polygon::voronoi_builder;
-using boost::polygon::voronoi_diagram;
-
-namespace Slic3r {
-
-MotionPlanner::MotionPlanner(const ExPolygons &islands) : m_initialized(false)
-{
- ExPolygons expp;
- for (const ExPolygon &island : islands) {
- island.simplify(SCALED_EPSILON, &expp);
- for (ExPolygon &island : expp)
- m_islands.emplace_back(MotionPlannerEnv(island));
- expp.clear();
- }
-}
-
-void MotionPlanner::initialize()
-{
- // prevent initialization of empty BoundingBox
- if (m_initialized || m_islands.empty())
- return;
-
- // loop through islands in order to create inner expolygons and collect their contours.
- Polygons outer_holes;
- for (MotionPlannerEnv &island : m_islands) {
- // Generate the internal env boundaries by shrinking the island
- // we'll use these inner rings for motion planning (endpoints of the Voronoi-based
- // graph, visibility check) in order to avoid moving too close to the boundaries.
- island.m_env = ExPolygonCollection(offset_ex(island.m_island, -MP_INNER_MARGIN));
- // Island contours are holes of our external environment.
- outer_holes.push_back(island.m_island.contour);
- }
-
- // Generate a box contour around everyting.
- Polygons contour = offset(get_extents(outer_holes).polygon(), +MP_OUTER_MARGIN*2);
- assert(contour.size() == 1);
- // make expolygon for outer environment
- ExPolygons outer = diff_ex(contour, outer_holes);
- assert(outer.size() == 1);
- // If some of the islands are nested, then the 0th contour is the outer contour due to the order of conversion
- // from Clipper data structure into the Slic3r expolygons inside diff_ex().
- m_outer = MotionPlannerEnv(outer.front());
- m_outer.m_env = ExPolygonCollection(diff_ex(contour, offset(outer_holes, +MP_OUTER_MARGIN)));
- m_graphs.resize(m_islands.size() + 1);
- m_initialized = true;
-}
-
-Polyline MotionPlanner::shortest_path(const Point &from, const Point &to)
-{
- // If we have an empty configuration space, return a straight move.
- if (m_islands.empty())
- return Polyline(from, to);
-
- // Are both points in the same island?
- int island_idx_from = -1;
- int island_idx_to = -1;
- int island_idx = -1;
- for (MotionPlannerEnv &island : m_islands) {
- int idx = &island - m_islands.data();
- if (island.island_contains(from))
- island_idx_from = idx;
- if (island.island_contains(to))
- island_idx_to = idx;
- if (island_idx_from == idx && island_idx_to == idx) {
- // Since both points are in the same island, is a direct move possible?
- // If so, we avoid generating the visibility environment.
- if (island.m_island.contains(Line(from, to)))
- return Polyline(from, to);
- // Both points are inside a single island, but the straight line crosses the island boundary.
- island_idx = idx;
- break;
- }
- }
-
- // lazy generation of configuration space.
- this->initialize();
-
- // Get environment. If the from / to points do not share an island, then they cross an open space,
- // therefore island_idx == -1 and env will be set to the environment of the empty space.
- const MotionPlannerEnv &env = this->get_env(island_idx);
- if (env.m_env.expolygons.empty()) {
- // if this environment is empty (probably because it's too small), perform straight move
- // and avoid running the algorithms on empty dataset
- return Polyline(from, to);
- }
-
- // Now check whether points are inside the environment.
- Point inner_from = from;
- Point inner_to = to;
-
- if (island_idx == -1) {
- // The end points do not share the same island. In that case some of the travel
- // will be likely performed inside the empty space.
- // TODO: instead of using the nearest_env_point() logic, we should
- // create a temporary graph where we connect 'from' and 'to' to the
- // nodes which don't require more than one crossing, and let Dijkstra
- // figure out the entire path - this should also replace the call to
- // find_node() below
- if (island_idx_from != -1)
- // The start point is inside some island. Find the closest point at the empty space to start from.
- inner_from = env.nearest_env_point(from, to);
- if (island_idx_to != -1)
- // The start point is inside some island. Find the closest point at the empty space to start from.
- inner_to = env.nearest_env_point(to, inner_from);
- }
-
- // Perform a path search either in the open space, or in a common island of from/to.
- const MotionPlannerGraph &graph = this->init_graph(island_idx);
- // If no path exists without crossing perimeters, returns a straight segment.
- Polyline polyline = graph.shortest_path(inner_from, inner_to);
- polyline.points.insert(polyline.points.begin(), from);
- polyline.points.emplace_back(to);
-
- {
- // grow our environment slightly in order for simplify_by_visibility()
- // to work best by considering moves on boundaries valid as well
- ExPolygonCollection grown_env(offset_ex(env.m_env.expolygons, float(+SCALED_EPSILON)));
-
- if (island_idx == -1) {
- /* If 'from' or 'to' are not inside our env, they were connected using the
- nearest_env_point() search which maybe produce ugly paths since it does not
- include the endpoint in the Dijkstra search; the simplify_by_visibility()
- call below will not work in many cases where the endpoint is not contained in
- grown_env (whose contour was arbitrarily constructed with MP_OUTER_MARGIN,
- which may not be enough for, say, including a skirt point). So we prune
- the extra points manually. */
- if (! grown_env.contains(from)) {
- // delete second point while the line connecting first to third crosses the
- // boundaries as many times as the current first to second
- while (polyline.points.size() > 2 && intersection_ln(Line(from, polyline.points[2]), (Polygons)grown_env).size() == 1)
- polyline.points.erase(polyline.points.begin() + 1);
- }
- if (! grown_env.contains(to))
- while (polyline.points.size() > 2 && intersection_ln(Line(*(polyline.points.end() - 3), to), (Polygons)grown_env).size() == 1)
- polyline.points.erase(polyline.points.end() - 2);
- }
-
- // Perform some quick simplification (simplify_by_visibility() would make this
- // unnecessary, but this is much faster)
- polyline.simplify(MP_INNER_MARGIN/10);
-
- // remove unnecessary vertices
- // Note: this is computationally intensive and does not look very necessary
- // now that we prune the endpoints with the logic above,
- // so we comment it for now until a good test case arises
- //polyline.simplify_by_visibility(grown_env);
-
- /*
- SVG svg("shortest_path.svg");
- svg.draw(grown_env.expolygons);
- svg.arrows = false;
- for (MotionPlannerGraph::adjacency_list_t::const_iterator it = graph->adjacency_list.begin(); it != graph->adjacency_list.end(); ++it) {
- Point a = graph->nodes[it - graph->adjacency_list.begin()];
- for (std::vector<MotionPlannerGraph::Neighbor>::const_iterator n = it->begin(); n != it->end(); ++n) {
- Point b = graph->nodes[n->target];
- svg.draw(Line(a, b));
- }
- }
- svg.arrows = true;
- svg.draw(from);
- svg.draw(inner_from, "red");
- svg.draw(to);
- svg.draw(inner_to, "red");
- svg.draw(polyline, "red");
- svg.Close();
- */
- }
-
- return polyline;
-}
-
-const MotionPlannerGraph& MotionPlanner::init_graph(int island_idx)
-{
- // 0th graph is the graph for m_outer. Other graphs are 1 indexed.
- MotionPlannerGraph *graph = m_graphs[island_idx + 1].get();
- if (graph == nullptr) {
- // If this graph doesn't exist, initialize it.
- m_graphs[island_idx + 1] = make_unique<MotionPlannerGraph>();
- graph = m_graphs[island_idx + 1].get();
-
- /* We don't add polygon boundaries as graph edges, because we'd need to connect
- them to the Voronoi-generated edges by recognizing coinciding nodes. */
-
- typedef voronoi_diagram<double> VD;
- VD vd;
- // Mapping between Voronoi vertices and graph nodes.
- std::map<const VD::vertex_type*, size_t> vd_vertices;
- // get boundaries as lines
- const MotionPlannerEnv &env = this->get_env(island_idx);
- Lines lines = env.m_env.lines();
- boost::polygon::construct_voronoi(lines.begin(), lines.end(), &vd);
- // traverse the Voronoi diagram and generate graph nodes and edges
- for (const VD::edge_type &edge : vd.edges()) {
- if (edge.is_infinite())
- continue;
- const VD::vertex_type* v0 = edge.vertex0();
- const VD::vertex_type* v1 = edge.vertex1();
- Point p0(v0->x(), v0->y());
- Point p1(v1->x(), v1->y());
- // Insert only Voronoi edges fully contained in the island.
- //FIXME This test has a terrible O(n^2) time complexity.
- if (env.island_contains_b(p0) && env.island_contains_b(p1)) {
- // Find v0 in the graph, allocate a new node if v0 does not exist in the graph yet.
- auto i_v0 = vd_vertices.find(v0);
- size_t v0_idx;
- if (i_v0 == vd_vertices.end())
- vd_vertices[v0] = v0_idx = graph->add_node(p0);
- else
- v0_idx = i_v0->second;
- // Find v1 in the graph, allocate a new node if v0 does not exist in the graph yet.
- auto i_v1 = vd_vertices.find(v1);
- size_t v1_idx;
- if (i_v1 == vd_vertices.end())
- vd_vertices[v1] = v1_idx = graph->add_node(p1);
- else
- v1_idx = i_v1->second;
- // Euclidean distance is used as weight for the graph edge
- graph->add_edge(v0_idx, v1_idx, (p1 - p0).cast<double>().norm());
- }
- }
- }
-
- return *graph;
-}
-
-// Find a middle point on the path from start_point to end_point with the shortest path.
-static inline size_t nearest_waypoint_index(const Point &start_point, const Points &middle_points, const Point &end_point)
-{
- size_t idx = size_t(-1);
- double dmin = std::numeric_limits<double>::infinity();
- for (const Point &p : middle_points) {
- double d = (p - start_point).cast<double>().norm() + (end_point - p).cast<double>().norm();
- if (d < dmin) {
- idx = &p - middle_points.data();
- dmin = d;
- if (dmin < EPSILON)
- break;
- }
- }
- return idx;
-}
-
-Point MotionPlannerEnv::nearest_env_point(const Point &from, const Point &to) const
-{
- /* In order to ensure that the move between 'from' and the initial env point does
- not violate any of the configuration space boundaries, we limit our search to
- the points that satisfy this condition. */
-
- /* Assume that this method is never called when 'env' contains 'from';
- so 'from' is either inside a hole or outside all contours */
-
- // get the points of the hole containing 'from', if any
- Points pp;
- for (const ExPolygon &ex : m_env.expolygons) {
- for (const Polygon &hole : ex.holes)
- if (hole.contains(from))
- pp = hole;
- if (! pp.empty())
- break;
- }
-
- // If 'from' is not inside a hole, it's outside of all contours, so take all contours' points.
- if (pp.empty())
- for (const ExPolygon &ex : m_env.expolygons)
- append(pp, ex.contour.points);
-
- // Find the candidate result and check that it doesn't cross too many boundaries.
- while (pp.size() > 1) {
- // find the point in pp that is closest to both 'from' and 'to'
- size_t result = nearest_waypoint_index(from, pp, to);
- // as we assume 'from' is outside env, any node will require at least one crossing
- if (intersection_ln(Line(from, pp[result]), m_island).size() > 1) {
- // discard result
- pp.erase(pp.begin() + result);
- } else
- return pp[result];
- }
-
- // if we're here, return last point if any (better than nothing)
- // if we have no points at all, then we have an empty environment and we
- // make this method behave as a no-op (we shouldn't get here by the way)
- return pp.empty() ? from : pp.front();
-}
-
-// Add a new directed edge to the adjacency graph.
-void MotionPlannerGraph::add_edge(size_t from, size_t to, double weight)
-{
- // Extend adjacency list until this start node.
- if (m_adjacency_list.size() < from + 1) {
- // Reserve in powers of two to avoid repeated reallocation.
- m_adjacency_list.reserve(std::max<uint32_t>(8, next_highest_power_of_2((uint32_t)(from + 1))));
- // Allocate new empty adjacency vectors.
- m_adjacency_list.resize(from + 1);
- }
- m_adjacency_list[from].emplace_back(Neighbor(node_t(to), weight));
-}
-
-// Dijkstra's shortest path in a weighted graph from node_start to node_end.
-// The returned path contains the end points.
-// If no path exists from node_start to node_end, a straight segment is returned.
-Polyline MotionPlannerGraph::shortest_path(size_t node_start, size_t node_end) const
-{
- // This prevents a crash in case for some reason we got here with an empty adjacency list.
- if (this->empty())
- return Polyline();
-
- // Dijkstra algorithm, previous node of the current node 'u' in the shortest path towards node_start.
- std::vector<node_t> previous(m_adjacency_list.size(), -1);
- std::vector<weight_t> distance(m_adjacency_list.size(), std::numeric_limits<weight_t>::infinity());
- std::vector<size_t> map_node_to_queue_id(m_adjacency_list.size(), size_t(-1));
- distance[node_start] = 0.;
-
- auto queue = make_mutable_priority_queue<node_t, false>(
- [&map_node_to_queue_id](const node_t node, size_t idx) { map_node_to_queue_id[node] = idx; },
- [&distance](const node_t node1, const node_t node2) { return distance[node1] < distance[node2]; });
- queue.reserve(m_adjacency_list.size());
- for (size_t i = 0; i < m_adjacency_list.size(); ++ i)
- queue.push(node_t(i));
-
- while (! queue.empty()) {
- // Get the next node with the lowest distance to node_start.
- node_t u = node_t(queue.top());
- queue.pop();
- map_node_to_queue_id[u] = size_t(-1);
- // Stop searching if we reached our destination.
- if (size_t(u) == node_end)
- break;
- // Visit each edge starting at node u.
- for (const Neighbor& neighbor : m_adjacency_list[u])
- if (map_node_to_queue_id[neighbor.target] != size_t(-1)) {
- weight_t alt = distance[u] + neighbor.weight;
- // If total distance through u is shorter than the previous
- // distance (if any) between node_start and neighbor.target, replace it.
- if (alt < distance[neighbor.target]) {
- distance[neighbor.target] = alt;
- previous[neighbor.target] = u;
- queue.update(map_node_to_queue_id[neighbor.target]);
- }
- }
- }
-
- // In case the end point was not reached, previous[node_end] contains -1
- // and a straight line from node_start to node_end is returned.
- Polyline polyline;
- polyline.points.reserve(m_adjacency_list.size());
- for (node_t vertex = node_t(node_end); vertex != -1; vertex = previous[vertex])
- polyline.points.emplace_back(m_nodes[vertex]);
- polyline.points.emplace_back(m_nodes[node_start]);
- polyline.reverse();
- return polyline;
-}
-
-}
diff --git a/src/libslic3r/MotionPlanner.hpp b/src/libslic3r/MotionPlanner.hpp
deleted file mode 100644
index e912f2fb4..000000000
--- a/src/libslic3r/MotionPlanner.hpp
+++ /dev/null
@@ -1,91 +0,0 @@
-#ifndef slic3r_MotionPlanner_hpp_
-#define slic3r_MotionPlanner_hpp_
-
-#include "libslic3r.h"
-#include "BoundingBox.hpp"
-#include "ClipperUtils.hpp"
-#include "ExPolygonCollection.hpp"
-#include "Polyline.hpp"
-#include <map>
-#include <utility>
-#include <memory>
-#include <vector>
-
-#define MP_INNER_MARGIN scale_(1.0)
-#define MP_OUTER_MARGIN scale_(2.0)
-
-namespace Slic3r {
-
-class MotionPlanner;
-
-class MotionPlannerEnv
-{
- friend class MotionPlanner;
-
-public:
- MotionPlannerEnv() {};
- MotionPlannerEnv(const ExPolygon &island) : m_island(island), m_island_bbox(get_extents(island)) {};
- Point nearest_env_point(const Point &from, const Point &to) const;
- bool island_contains(const Point &pt) const
- { return m_island_bbox.contains(pt) && m_island.contains(pt); }
- bool island_contains_b(const Point &pt) const
- { return m_island_bbox.contains(pt) && m_island.contains_b(pt); }
-
-private:
- ExPolygon m_island;
- BoundingBox m_island_bbox;
- // Region, where the travel is allowed.
- ExPolygonCollection m_env;
-};
-
-// A 2D directed graph for searching a shortest path using the famous Dijkstra algorithm.
-class MotionPlannerGraph
-{
-public:
- // Add a directed edge into the graph.
- size_t add_node(const Point &p) { m_nodes.emplace_back(p); return m_nodes.size() - 1; }
- void add_edge(size_t from, size_t to, double weight);
- size_t find_closest_node(const Point &point) const { return point.nearest_point_index(m_nodes); }
-
- bool empty() const { return m_adjacency_list.empty(); }
- Polyline shortest_path(size_t from, size_t to) const;
- Polyline shortest_path(const Point &from, const Point &to) const
- { return this->shortest_path(this->find_closest_node(from), this->find_closest_node(to)); }
-
-private:
- typedef int node_t;
- typedef double weight_t;
- struct Neighbor {
- Neighbor(node_t target, weight_t weight) : target(target), weight(weight) {}
- node_t target;
- weight_t weight;
- };
- Points m_nodes;
- std::vector<std::vector<Neighbor>> m_adjacency_list;
-};
-
-class MotionPlanner
-{
-public:
- MotionPlanner(const ExPolygons &islands);
- ~MotionPlanner() {}
-
- Polyline shortest_path(const Point &from, const Point &to);
- size_t islands_count() const { return m_islands.size(); }
-
-private:
- bool m_initialized;
- std::vector<MotionPlannerEnv> m_islands;
- MotionPlannerEnv m_outer;
- // 0th graph is the graph for m_outer. Other graphs are 1 indexed.
- std::vector<std::unique_ptr<MotionPlannerGraph>> m_graphs;
-
- void initialize();
- const MotionPlannerGraph& init_graph(int island_idx);
- const MotionPlannerEnv& get_env(int island_idx) const
- { return (island_idx == -1) ? m_outer : m_islands[island_idx]; }
-};
-
-}
-
-#endif
diff --git a/src/libslic3r/MultiPoint.cpp b/src/libslic3r/MultiPoint.cpp
index 39b07e7d8..03f7ff59c 100644
--- a/src/libslic3r/MultiPoint.cpp
+++ b/src/libslic3r/MultiPoint.cpp
@@ -18,13 +18,6 @@ void MultiPoint::scale(double factor_x, double factor_y)
}
}
-void MultiPoint::translate(double x, double y)
-{
- Vector v(x, y);
- for (Point &pt : points)
- pt += v;
-}
-
void MultiPoint::translate(const Point &v)
{
for (Point &pt : points)
@@ -140,6 +133,17 @@ bool MultiPoint::first_intersection(const Line& line, Point* intersection) const
return found;
}
+bool MultiPoint::intersections(const Line &line, Points *intersections) const
+{
+ size_t intersections_size = intersections->size();
+ for (const Line &polygon_line : this->lines()) {
+ Point intersection;
+ if (polygon_line.intersection(line, &intersection))
+ intersections->emplace_back(std::move(intersection));
+ }
+ return intersections->size() > intersections_size;
+}
+
std::vector<Point> MultiPoint::_douglas_peucker(const std::vector<Point>& pts, const double tolerance)
{
std::vector<Point> result_pts;
diff --git a/src/libslic3r/MultiPoint.hpp b/src/libslic3r/MultiPoint.hpp
index 9ff91b502..d5bac7249 100644
--- a/src/libslic3r/MultiPoint.hpp
+++ b/src/libslic3r/MultiPoint.hpp
@@ -17,8 +17,6 @@ class MultiPoint
public:
Points points;
- operator Points() const { return this->points; }
-
MultiPoint() {}
MultiPoint(const MultiPoint &other) : points(other.points) {}
MultiPoint(MultiPoint &&other) : points(std::move(other.points)) {}
@@ -28,7 +26,7 @@ public:
MultiPoint& operator=(MultiPoint &&other) { points = std::move(other.points); return *this; }
void scale(double factor);
void scale(double factor_x, double factor_y);
- void translate(double x, double y);
+ void translate(double x, double y) { this->translate(Point(coord_t(x), coord_t(y))); }
void translate(const Point &vector);
void rotate(double angle) { this->rotate(cos(angle), sin(angle)); }
void rotate(double cos_angle, double sin_angle);
@@ -81,7 +79,8 @@ public:
bool intersection(const Line& line, Point* intersection) const;
bool first_intersection(const Line& line, Point* intersection) const;
-
+ bool intersections(const Line &line, Points *intersections) const;
+
static Points _douglas_peucker(const Points &points, const double tolerance);
static Points visivalingam(const Points& pts, const double& tolerance);
};
diff --git a/src/libslic3r/ObjectID.cpp b/src/libslic3r/ObjectID.cpp
index b188d84c0..7177c47fe 100644
--- a/src/libslic3r/ObjectID.cpp
+++ b/src/libslic3r/ObjectID.cpp
@@ -17,6 +17,8 @@ ObjectID wipe_tower_instance_id()
return mine.id();
}
+ObjectWithTimestamp::Timestamp ObjectWithTimestamp::s_last_timestamp = 1;
+
} // namespace Slic3r
// CEREAL_REGISTER_TYPE(Slic3r::ObjectBase)
diff --git a/src/libslic3r/ObjectID.hpp b/src/libslic3r/ObjectID.hpp
index 484d1173b..ea7c748a5 100644
--- a/src/libslic3r/ObjectID.hpp
+++ b/src/libslic3r/ObjectID.hpp
@@ -42,12 +42,21 @@ private:
// Base for Model, ModelObject, ModelVolume, ModelInstance or ModelMaterial to provide a unique ID
// to synchronize the front end (UI) with the back end (BackgroundSlicingProcess / Print / PrintObject).
+// Also base for Print, PrintObject, SLAPrint, SLAPrintObject to provide a unique ID for matching Model / ModelObject
+// with their corresponding Print / PrintObject objects by the notification center at the UI when processing back-end warnings.
// Achtung! The s_last_id counter is not thread safe, so it is expected, that the ObjectBase derived instances
// are only instantiated from the main thread.
class ObjectBase
{
public:
- ObjectID id() const { return m_id; }
+ using Timestamp = uint64_t;
+
+ ObjectID id() const { return m_id; }
+ // Return an optional timestamp of this object.
+ // If the timestamp returned is non-zero, then the serialization framework will
+ // only save this object on the Undo/Redo stack if the timestamp is different
+ // from the timestmap of the object at the top of the Undo / Redo stack.
+ virtual Timestamp timestamp() const { return 0; }
protected:
// Constructors to be only called by derived classes.
@@ -57,7 +66,7 @@ protected:
// by an existing ID copied from elsewhere.
ObjectBase(int) : m_id(ObjectID(0)) {}
// The class tree will have virtual tables and type information.
- virtual ~ObjectBase() {}
+ virtual ~ObjectBase() = default;
// Use with caution!
void set_new_unique_id() { m_id = generate_new_id(); }
@@ -84,6 +93,44 @@ private:
template<class Archive> static void load_and_construct(Archive & ar, cereal::construct<ObjectBase> &construct) { ObjectID id; ar(id); construct(id); }
};
+class ObjectWithTimestamp : public ObjectBase
+{
+protected:
+ // Constructors to be only called by derived classes.
+ // Default constructor to assign a new timestamp unique to this object's history.
+ ObjectWithTimestamp() = default;
+ // Constructor with ignored int parameter to assign an invalid ID, to be replaced
+ // by an existing ID copied from elsewhere.
+ ObjectWithTimestamp(int) : ObjectBase(-1) {}
+ // The class tree will have virtual tables and type information.
+ virtual ~ObjectWithTimestamp() = default;
+
+ // Resetting timestamp to 1 indicates the object is in its initial (cleared) state.
+ // To be called by the derived class's clear() method.
+ void reset_timestamp() { m_timestamp = 1; }
+ // The timestamp uniquely identifies content of the derived class' data, therefore it makes sense to copy the timestamp if the content data was copied.
+ void copy_timestamp(const ObjectWithTimestamp& rhs) { m_timestamp = rhs.m_timestamp; }
+
+public:
+ // Return an optional timestamp of this object.
+ // If the timestamp returned is non-zero, then the serialization framework will
+ // only save this object on the Undo/Redo stack if the timestamp is different
+ // from the timestmap of the object at the top of the Undo / Redo stack.
+ Timestamp timestamp() const throw() override { return m_timestamp; }
+ bool timestamp_matches(const ObjectWithTimestamp &rhs) const throw() { return m_timestamp == rhs.m_timestamp; }
+ bool object_id_and_timestamp_match(const ObjectWithTimestamp &rhs) const throw() { return this->id() == rhs.id() && m_timestamp == rhs.m_timestamp; }
+ void touch() { m_timestamp = ++ s_last_timestamp; }
+
+private:
+ // The first timestamp is non-zero, as zero timestamp means the timestamp is not reliable.
+ Timestamp m_timestamp { 1 };
+ static Timestamp s_last_timestamp;
+
+ friend class cereal::access;
+ friend class Slic3r::UndoRedo::StackImpl;
+ template<class Archive> void serialize(Archive &ar) { ar(m_timestamp); }
+};
+
// Unique object / instance ID for the wipe tower.
extern ObjectID wipe_tower_object_id();
extern ObjectID wipe_tower_instance_id();
diff --git a/src/libslic3r/OpenVDBUtils.cpp b/src/libslic3r/OpenVDBUtils.cpp
index c30052036..31ae203dd 100644
--- a/src/libslic3r/OpenVDBUtils.cpp
+++ b/src/libslic3r/OpenVDBUtils.cpp
@@ -2,6 +2,7 @@
#include "OpenVDBUtils.hpp"
#include <openvdb/tools/MeshToVolume.h>
#include <openvdb/tools/VolumeToMesh.h>
+#include <openvdb/tools/Composite.h>
#include <openvdb/tools/LevelSetRebuild.h>
//#include "MTUtils.hpp"
@@ -57,7 +58,6 @@ void Contour3DDataAdapter::getIndexSpacePoint(size_t n,
// TODO: Do I need to call initialize? Seems to work without it as well but the
// docs say it should be called ones. It does a mutex lock-unlock sequence all
// even if was called previously.
-
openvdb::FloatGrid::Ptr mesh_to_grid(const TriangleMesh &mesh,
const openvdb::math::Transform &tr,
float exteriorBandWidth,
@@ -65,9 +65,38 @@ openvdb::FloatGrid::Ptr mesh_to_grid(const TriangleMesh &mesh,
int flags)
{
openvdb::initialize();
- return openvdb::tools::meshToVolume<openvdb::FloatGrid>(
- TriangleMeshDataAdapter{mesh}, tr, exteriorBandWidth,
- interiorBandWidth, flags);
+
+ TriangleMeshPtrs meshparts = mesh.split();
+
+ auto it = std::remove_if(meshparts.begin(), meshparts.end(),
+ [](TriangleMesh *m){
+ m->require_shared_vertices();
+ return !m->is_manifold() || m->volume() < EPSILON;
+ });
+
+ meshparts.erase(it, meshparts.end());
+
+ openvdb::FloatGrid::Ptr grid;
+ for (TriangleMesh *m : meshparts) {
+ auto subgrid = openvdb::tools::meshToVolume<openvdb::FloatGrid>(
+ TriangleMeshDataAdapter{*m}, tr, exteriorBandWidth,
+ interiorBandWidth, flags);
+
+ if (grid && subgrid) openvdb::tools::csgUnion(*grid, *subgrid);
+ else if (subgrid) grid = std::move(subgrid);
+ }
+
+ if (grid) {
+ grid = openvdb::tools::levelSetRebuild(*grid, 0., exteriorBandWidth,
+ interiorBandWidth);
+ } else if(meshparts.empty()) {
+ // Splitting failed, fall back to hollow the original mesh
+ grid = openvdb::tools::meshToVolume<openvdb::FloatGrid>(
+ TriangleMeshDataAdapter{mesh}, tr, exteriorBandWidth,
+ interiorBandWidth, flags);
+ }
+
+ return grid;
}
openvdb::FloatGrid::Ptr mesh_to_grid(const sla::Contour3D &mesh,
diff --git a/src/libslic3r/OpenVDBUtils.hpp b/src/libslic3r/OpenVDBUtils.hpp
index c493845a1..e35231d35 100644
--- a/src/libslic3r/OpenVDBUtils.hpp
+++ b/src/libslic3r/OpenVDBUtils.hpp
@@ -2,7 +2,6 @@
#define OPENVDBUTILS_HPP
#include <libslic3r/TriangleMesh.hpp>
-#include <libslic3r/SLA/Common.hpp>
#include <libslic3r/SLA/Contour3D.hpp>
#include <openvdb/openvdb.h>
diff --git a/src/libslic3r/Optimize/BruteforceOptimizer.hpp b/src/libslic3r/Optimize/BruteforceOptimizer.hpp
new file mode 100644
index 000000000..2daef538e
--- /dev/null
+++ b/src/libslic3r/Optimize/BruteforceOptimizer.hpp
@@ -0,0 +1,140 @@
+#ifndef BRUTEFORCEOPTIMIZER_HPP
+#define BRUTEFORCEOPTIMIZER_HPP
+
+#include <libslic3r/Optimize/Optimizer.hpp>
+
+namespace Slic3r { namespace opt {
+
+namespace detail {
+// Implementing a bruteforce optimizer
+
+// Return the number of iterations needed to reach a specific grid position (idx)
+template<size_t N>
+long num_iter(const std::array<size_t, N> &idx, size_t gridsz)
+{
+ long ret = 0;
+ for (size_t i = 0; i < N; ++i) ret += idx[i] * std::pow(gridsz, i);
+ return ret;
+}
+
+// Implementation of a grid search where the search interval is sampled in
+// equidistant points for each dimension. Grid size determines the number of
+// samples for one dimension so the number of function calls is gridsize ^ dimension.
+struct AlgBurteForce {
+ bool to_min;
+ StopCriteria stc;
+ size_t gridsz;
+
+ AlgBurteForce(const StopCriteria &cr, size_t gs): stc{cr}, gridsz{gs} {}
+
+ // This function is called recursively for each dimension and generates
+ // the grid values for the particular dimension. If D is less than zero,
+ // the object function input values are generated for each dimension and it
+ // can be evaluated. The current best score is compared with the newly
+ // returned score and changed appropriately.
+ template<int D, size_t N, class Fn, class Cmp>
+ bool run(std::array<size_t, N> &idx,
+ Result<N> &result,
+ const Bounds<N> &bounds,
+ Fn &&fn,
+ Cmp &&cmp)
+ {
+ if (stc.stop_condition()) return false;
+
+ if constexpr (D < 0) { // Let's evaluate fn
+ Input<N> inp;
+
+ auto max_iter = stc.max_iterations();
+ if (max_iter && num_iter(idx, gridsz) >= max_iter)
+ return false;
+
+ for (size_t d = 0; d < N; ++d) {
+ const Bound &b = bounds[d];
+ double step = (b.max() - b.min()) / (gridsz - 1);
+ inp[d] = b.min() + idx[d] * step;
+ }
+
+ auto score = fn(inp);
+ if (cmp(score, result.score)) { // Change current score to the new
+ double absdiff = std::abs(score - result.score);
+
+ result.score = score;
+ result.optimum = inp;
+
+ // Check if the required precision is reached.
+ if (absdiff < stc.abs_score_diff() ||
+ absdiff < stc.rel_score_diff() * std::abs(score))
+ return false;
+ }
+
+ } else {
+ for (size_t i = 0; i < gridsz; ++i) {
+ idx[D] = i; // Mark the current grid position and dig down
+ if (!run<D - 1>(idx, result, bounds, std::forward<Fn>(fn),
+ std::forward<Cmp>(cmp)))
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ template<class Fn, size_t N>
+ Result<N> optimize(Fn&& fn,
+ const Input<N> &/*initvals*/,
+ const Bounds<N>& bounds)
+ {
+ std::array<size_t, N> idx = {};
+ Result<N> result;
+
+ if (to_min) {
+ result.score = std::numeric_limits<double>::max();
+ run<int(N) - 1>(idx, result, bounds, std::forward<Fn>(fn),
+ std::less<double>{});
+ }
+ else {
+ result.score = std::numeric_limits<double>::lowest();
+ run<int(N) - 1>(idx, result, bounds, std::forward<Fn>(fn),
+ std::greater<double>{});
+ }
+
+ return result;
+ }
+};
+
+} // namespace detail
+
+using AlgBruteForce = detail::AlgBurteForce;
+
+template<>
+class Optimizer<AlgBruteForce> {
+ AlgBruteForce m_alg;
+
+public:
+
+ Optimizer(const StopCriteria &cr = {}, size_t gridsz = 100)
+ : m_alg{cr, gridsz}
+ {}
+
+ Optimizer& to_max() { m_alg.to_min = false; return *this; }
+ Optimizer& to_min() { m_alg.to_min = true; return *this; }
+
+ template<class Func, size_t N>
+ Result<N> optimize(Func&& func,
+ const Input<N> &initvals,
+ const Bounds<N>& bounds)
+ {
+ return m_alg.optimize(std::forward<Func>(func), initvals, bounds);
+ }
+
+ Optimizer &set_criteria(const StopCriteria &cr)
+ {
+ m_alg.stc = cr; return *this;
+ }
+
+ const StopCriteria &get_criteria() const { return m_alg.stc; }
+};
+
+}} // namespace Slic3r::opt
+
+#endif // BRUTEFORCEOPTIMIZER_HPP
diff --git a/src/libslic3r/Optimize/NLoptOptimizer.hpp b/src/libslic3r/Optimize/NLoptOptimizer.hpp
new file mode 100644
index 000000000..826b1632a
--- /dev/null
+++ b/src/libslic3r/Optimize/NLoptOptimizer.hpp
@@ -0,0 +1,233 @@
+#ifndef NLOPTOPTIMIZER_HPP
+#define NLOPTOPTIMIZER_HPP
+
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable: 4244)
+#pragma warning(disable: 4267)
+#endif
+#include <nlopt.h>
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+#include <utility>
+
+#include <libslic3r/Optimize/Optimizer.hpp>
+
+namespace Slic3r { namespace opt {
+
+namespace detail {
+
+// Helper types for NLopt algorithm selection in template contexts
+template<nlopt_algorithm alg> struct NLoptAlg {};
+
+// NLopt can combine multiple algorithms if one is global an other is a local
+// method. This is how template specializations can be informed about this fact.
+template<nlopt_algorithm gl_alg, nlopt_algorithm lc_alg = NLOPT_LN_NELDERMEAD>
+struct NLoptAlgComb {};
+
+template<class M> struct IsNLoptAlg {
+ static const constexpr bool value = false;
+};
+
+template<nlopt_algorithm a> struct IsNLoptAlg<NLoptAlg<a>> {
+ static const constexpr bool value = true;
+};
+
+template<nlopt_algorithm a1, nlopt_algorithm a2>
+struct IsNLoptAlg<NLoptAlgComb<a1, a2>> {
+ static const constexpr bool value = true;
+};
+
+template<class M, class T = void>
+using NLoptOnly = std::enable_if_t<IsNLoptAlg<M>::value, T>;
+
+
+enum class OptDir { MIN, MAX }; // Where to optimize
+
+struct NLopt { // Helper RAII class for nlopt_opt
+ nlopt_opt ptr = nullptr;
+
+ template<class...A> explicit NLopt(A&&...a)
+ {
+ ptr = nlopt_create(std::forward<A>(a)...);
+ }
+
+ NLopt(const NLopt&) = delete;
+ NLopt(NLopt&&) = delete;
+ NLopt& operator=(const NLopt&) = delete;
+ NLopt& operator=(NLopt&&) = delete;
+
+ ~NLopt() { nlopt_destroy(ptr); }
+};
+
+template<class Method> class NLoptOpt {};
+
+// Optimizers based on NLopt.
+template<nlopt_algorithm alg> class NLoptOpt<NLoptAlg<alg>> {
+protected:
+ StopCriteria m_stopcr;
+ OptDir m_dir;
+
+ template<class Fn> using TOptData =
+ std::tuple<std::remove_reference_t<Fn>*, NLoptOpt*, nlopt_opt>;
+
+ template<class Fn, size_t N>
+ static double optfunc(unsigned n, const double *params,
+ double *gradient,
+ void *data)
+ {
+ assert(n >= N);
+
+ auto tdata = static_cast<TOptData<Fn>*>(data);
+
+ if (std::get<1>(*tdata)->m_stopcr.stop_condition())
+ nlopt_force_stop(std::get<2>(*tdata));
+
+ auto fnptr = std::get<0>(*tdata);
+ auto funval = to_arr<N>(params);
+
+ double scoreval = 0.;
+ using RetT = decltype((*fnptr)(funval));
+ if constexpr (std::is_convertible_v<RetT, ScoreGradient<N>>) {
+ ScoreGradient<N> score = (*fnptr)(funval);
+ for (size_t i = 0; i < n; ++i) gradient[i] = (*score.gradient)[i];
+ scoreval = score.score;
+ } else {
+ scoreval = (*fnptr)(funval);
+ }
+
+ return scoreval;
+ }
+
+ template<size_t N>
+ void set_up(NLopt &nl, const Bounds<N>& bounds)
+ {
+ std::array<double, N> lb, ub;
+
+ for (size_t i = 0; i < N; ++i) {
+ lb[i] = bounds[i].min();
+ ub[i] = bounds[i].max();
+ }
+
+ nlopt_set_lower_bounds(nl.ptr, lb.data());
+ nlopt_set_upper_bounds(nl.ptr, ub.data());
+
+ double abs_diff = m_stopcr.abs_score_diff();
+ double rel_diff = m_stopcr.rel_score_diff();
+ double stopval = m_stopcr.stop_score();
+ if(!std::isnan(abs_diff)) nlopt_set_ftol_abs(nl.ptr, abs_diff);
+ if(!std::isnan(rel_diff)) nlopt_set_ftol_rel(nl.ptr, rel_diff);
+ if(!std::isnan(stopval)) nlopt_set_stopval(nl.ptr, stopval);
+
+ if(this->m_stopcr.max_iterations() > 0)
+ nlopt_set_maxeval(nl.ptr, this->m_stopcr.max_iterations());
+ }
+
+ template<class Fn, size_t N>
+ Result<N> optimize(NLopt &nl, Fn &&fn, const Input<N> &initvals)
+ {
+ Result<N> r;
+
+ TOptData<Fn> data = std::make_tuple(&fn, this, nl.ptr);
+
+ switch(m_dir) {
+ case OptDir::MIN:
+ nlopt_set_min_objective(nl.ptr, optfunc<Fn, N>, &data); break;
+ case OptDir::MAX:
+ nlopt_set_max_objective(nl.ptr, optfunc<Fn, N>, &data); break;
+ }
+
+ r.optimum = initvals;
+ r.resultcode = nlopt_optimize(nl.ptr, r.optimum.data(), &r.score);
+
+ return r;
+ }
+
+public:
+
+ template<class Func, size_t N>
+ Result<N> optimize(Func&& func,
+ const Input<N> &initvals,
+ const Bounds<N>& bounds)
+ {
+ NLopt nl{alg, N};
+ set_up(nl, bounds);
+
+ return optimize(nl, std::forward<Func>(func), initvals);
+ }
+
+ explicit NLoptOpt(StopCriteria stopcr = {}) : m_stopcr(stopcr) {}
+
+ void set_criteria(const StopCriteria &cr) { m_stopcr = cr; }
+ const StopCriteria &get_criteria() const noexcept { return m_stopcr; }
+ void set_dir(OptDir dir) noexcept { m_dir = dir; }
+
+ void seed(long s) { nlopt_srand(s); }
+};
+
+template<nlopt_algorithm glob, nlopt_algorithm loc>
+class NLoptOpt<NLoptAlgComb<glob, loc>>: public NLoptOpt<NLoptAlg<glob>>
+{
+ using Base = NLoptOpt<NLoptAlg<glob>>;
+public:
+
+ template<class Fn, size_t N>
+ Result<N> optimize(Fn&& f,
+ const Input<N> &initvals,
+ const Bounds<N>& bounds)
+ {
+ NLopt nl_glob{glob, N}, nl_loc{loc, N};
+
+ Base::set_up(nl_glob, bounds);
+ Base::set_up(nl_loc, bounds);
+ nlopt_set_local_optimizer(nl_glob.ptr, nl_loc.ptr);
+
+ return Base::optimize(nl_glob, std::forward<Fn>(f), initvals);
+ }
+
+ explicit NLoptOpt(StopCriteria stopcr = {}) : Base{stopcr} {}
+};
+
+} // namespace detail;
+
+// Optimizers based on NLopt.
+template<class M> class Optimizer<M, detail::NLoptOnly<M>> {
+ detail::NLoptOpt<M> m_opt;
+
+public:
+
+ Optimizer& to_max() { m_opt.set_dir(detail::OptDir::MAX); return *this; }
+ Optimizer& to_min() { m_opt.set_dir(detail::OptDir::MIN); return *this; }
+
+ template<class Func, size_t N>
+ Result<N> optimize(Func&& func,
+ const Input<N> &initvals,
+ const Bounds<N>& bounds)
+ {
+ return m_opt.optimize(std::forward<Func>(func), initvals, bounds);
+ }
+
+ explicit Optimizer(StopCriteria stopcr = {}) : m_opt(stopcr) {}
+
+ Optimizer &set_criteria(const StopCriteria &cr)
+ {
+ m_opt.set_criteria(cr); return *this;
+ }
+
+ const StopCriteria &get_criteria() const { return m_opt.get_criteria(); }
+
+ void seed(long s) { m_opt.seed(s); }
+};
+
+// Predefinded NLopt algorithms
+using AlgNLoptGenetic = detail::NLoptAlgComb<NLOPT_GN_ESCH>;
+using AlgNLoptSubplex = detail::NLoptAlg<NLOPT_LN_SBPLX>;
+using AlgNLoptSimplex = detail::NLoptAlg<NLOPT_LN_NELDERMEAD>;
+using AlgNLoptDIRECT = detail::NLoptAlg<NLOPT_GN_DIRECT>;
+using AlgNLoptMLSL = detail::NLoptAlg<NLOPT_GN_MLSL>;
+
+}} // namespace Slic3r::opt
+
+#endif // NLOPTOPTIMIZER_HPP
diff --git a/src/libslic3r/Optimize/Optimizer.hpp b/src/libslic3r/Optimize/Optimizer.hpp
new file mode 100644
index 000000000..05191eba2
--- /dev/null
+++ b/src/libslic3r/Optimize/Optimizer.hpp
@@ -0,0 +1,182 @@
+#ifndef OPTIMIZER_HPP
+#define OPTIMIZER_HPP
+
+#include <utility>
+#include <tuple>
+#include <array>
+#include <cmath>
+#include <functional>
+#include <limits>
+#include <cassert>
+
+namespace Slic3r { namespace opt {
+
+// A type to hold the complete result of the optimization.
+template<size_t N> struct Result {
+ int resultcode; // Method dependent
+ std::array<double, N> optimum;
+ double score;
+};
+
+// An interval of possible input values for optimization
+class Bound {
+ double m_min, m_max;
+
+public:
+ Bound(double min = std::numeric_limits<double>::min(),
+ double max = std::numeric_limits<double>::max())
+ : m_min(min), m_max(max)
+ {}
+
+ double min() const noexcept { return m_min; }
+ double max() const noexcept { return m_max; }
+};
+
+// Helper types for optimization function input and bounds
+template<size_t N> using Input = std::array<double, N>;
+template<size_t N> using Bounds = std::array<Bound, N>;
+
+// A type for specifying the stop criteria. Setter methods can be concatenated
+class StopCriteria {
+
+ // If the absolute value difference between two scores.
+ double m_abs_score_diff = std::nan("");
+
+ // If the relative value difference between two scores.
+ double m_rel_score_diff = std::nan("");
+
+ // Stop if this value or better is found.
+ double m_stop_score = std::nan("");
+
+ // A predicate that if evaluates to true, the optimization should terminate
+ // and the best result found prior to termination should be returned.
+ std::function<bool()> m_stop_condition = [] { return false; };
+
+ // The max allowed number of iterations.
+ unsigned m_max_iterations = 0;
+
+public:
+
+ StopCriteria & abs_score_diff(double val)
+ {
+ m_abs_score_diff = val; return *this;
+ }
+
+ double abs_score_diff() const { return m_abs_score_diff; }
+
+ StopCriteria & rel_score_diff(double val)
+ {
+ m_rel_score_diff = val; return *this;
+ }
+
+ double rel_score_diff() const { return m_rel_score_diff; }
+
+ StopCriteria & stop_score(double val)
+ {
+ m_stop_score = val; return *this;
+ }
+
+ double stop_score() const { return m_stop_score; }
+
+ StopCriteria & max_iterations(double val)
+ {
+ m_max_iterations = val; return *this;
+ }
+
+ double max_iterations() const { return m_max_iterations; }
+
+ template<class Fn> StopCriteria & stop_condition(Fn &&cond)
+ {
+ m_stop_condition = cond; return *this;
+ }
+
+ bool stop_condition() { return m_stop_condition(); }
+};
+
+// Helper class to use optimization methods involving gradient.
+template<size_t N> struct ScoreGradient {
+ double score;
+ std::optional<std::array<double, N>> gradient;
+
+ ScoreGradient(double s, const std::array<double, N> &grad)
+ : score{s}, gradient{grad}
+ {}
+};
+
+// Helper to be used in static_assert.
+template<class T> struct always_false { enum { value = false }; };
+
+// Basic interface to optimizer object
+template<class Method, class Enable = void> class Optimizer {
+public:
+
+ Optimizer(const StopCriteria &)
+ {
+ static_assert (always_false<Method>::value,
+ "Optimizer unimplemented for given method!");
+ }
+
+ // Switch optimization towards function minimum
+ Optimizer &to_min() { return *this; }
+
+ // Switch optimization towards function maximum
+ Optimizer &to_max() { return *this; }
+
+ // Set criteria for successive optimizations
+ Optimizer &set_criteria(const StopCriteria &) { return *this; }
+
+ // Get current criteria
+ StopCriteria get_criteria() const { return {}; };
+
+ // Find function minimum or maximum for Func which has has signature:
+ // double(const Input<N> &input) and input with dimension N
+ //
+ // Initial starting point can be given as the second parameter.
+ //
+ // For each dimension an interval (Bound) has to be given marking the bounds
+ // for that dimension.
+ //
+ // initvals have to be within the specified bounds, otherwise its undefined
+ // behavior.
+ //
+ // Func can return a score of type double or optionally a ScoreGradient
+ // class to indicate the function gradient for a optimization methods that
+ // make use of the gradient.
+ template<class Func, size_t N>
+ Result<N> optimize(Func&& /*func*/,
+ const Input<N> &/*initvals*/,
+ const Bounds<N>& /*bounds*/) { return {}; }
+
+ // optional for randomized methods:
+ void seed(long /*s*/) {}
+};
+
+namespace detail {
+
+// Helper to convert C style array to std::array. The copy should be optimized
+// away with modern compilers.
+template<size_t N, class T> auto to_arr(const T *a)
+{
+ std::array<T, N> r;
+ std::copy(a, a + N, std::begin(r));
+ return r;
+}
+
+template<size_t N, class T> auto to_arr(const T (&a) [N])
+{
+ return to_arr<N>(static_cast<const T *>(a));
+}
+
+} // namespace detail
+
+// Helper functions to create bounds, initial value
+template<size_t N> Bounds<N> bounds(const Bound (&b) [N]) { return detail::to_arr(b); }
+template<size_t N> Input<N> initvals(const double (&a) [N]) { return detail::to_arr(a); }
+template<size_t N> auto score_gradient(double s, const double (&grad)[N])
+{
+ return ScoreGradient<N>(s, detail::to_arr(grad));
+}
+
+}} // namespace Slic3r::opt
+
+#endif // OPTIMIZER_HPP
diff --git a/src/libslic3r/PNGReadWrite.cpp b/src/libslic3r/PNGReadWrite.cpp
new file mode 100644
index 000000000..1e8a7de53
--- /dev/null
+++ b/src/libslic3r/PNGReadWrite.cpp
@@ -0,0 +1,225 @@
+#include "PNGReadWrite.hpp"
+
+#include <memory>
+
+#include <cstdio>
+#include <png.h>
+
+#include <boost/log/trivial.hpp>
+#include <boost/nowide/cstdio.hpp>
+
+namespace Slic3r { namespace png {
+
+struct PNGDescr {
+ png_struct *png = nullptr; png_info *info = nullptr;
+
+ PNGDescr() = default;
+ PNGDescr(const PNGDescr&) = delete;
+ PNGDescr(PNGDescr&&) = delete;
+ PNGDescr& operator=(const PNGDescr&) = delete;
+ PNGDescr& operator=(PNGDescr&&) = delete;
+
+ ~PNGDescr()
+ {
+ if (png && info) png_destroy_info_struct(png, &info);
+ if (png) png_destroy_read_struct( &png, nullptr, nullptr);
+ }
+};
+
+bool is_png(const ReadBuf &rb)
+{
+ static const constexpr int PNG_SIG_BYTES = 8;
+
+#if PNG_LIBPNG_VER_MINOR <= 2
+ // Earlier libpng versions had png_sig_cmp(png_bytep, ...) which is not
+ // a const pointer. It is not possible to cast away the const qualifier from
+ // the input buffer so... yes... life is challenging...
+ png_byte buf[PNG_SIG_BYTES];
+ auto inbuf = static_cast<const std::uint8_t *>(rb.buf);
+ std::copy(inbuf, inbuf + PNG_SIG_BYTES, buf);
+#else
+ auto buf = static_cast<png_const_bytep>(rb.buf);
+#endif
+
+ return rb.sz >= PNG_SIG_BYTES && !png_sig_cmp(buf, 0, PNG_SIG_BYTES);
+}
+
+// Buffer read callback for libpng. It provides an allocated output buffer and
+// the amount of data it desires to read from the input.
+static void png_read_callback(png_struct *png_ptr,
+ png_bytep outBytes,
+ png_size_t byteCountToRead)
+{
+ // Retrieve our input buffer through the png_ptr
+ auto reader = static_cast<IStream *>(png_get_io_ptr(png_ptr));
+
+ if (!reader || !reader->is_ok()) return;
+
+ reader->read(static_cast<std::uint8_t *>(outBytes), byteCountToRead);
+}
+
+bool decode_png(IStream &in_buf, ImageGreyscale &out_img)
+{
+ static const constexpr int PNG_SIG_BYTES = 8;
+
+ std::vector<png_byte> sig(PNG_SIG_BYTES, 0);
+ in_buf.read(sig.data(), PNG_SIG_BYTES);
+ if (!png_check_sig(sig.data(), PNG_SIG_BYTES))
+ return false;
+
+ PNGDescr dsc;
+ dsc.png = png_create_read_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr,
+ nullptr);
+
+ if(!dsc.png) return false;
+
+ dsc.info = png_create_info_struct(dsc.png);
+ if(!dsc.info) return false;
+
+ png_set_read_fn(dsc.png, static_cast<void *>(&in_buf), png_read_callback);
+
+ // Tell that we have already read the first bytes to check the signature
+ png_set_sig_bytes(dsc.png, PNG_SIG_BYTES);
+
+ png_read_info(dsc.png, dsc.info);
+
+ out_img.cols = png_get_image_width(dsc.png, dsc.info);
+ out_img.rows = png_get_image_height(dsc.png, dsc.info);
+ size_t color_type = png_get_color_type(dsc.png, dsc.info);
+ size_t bit_depth = png_get_bit_depth(dsc.png, dsc.info);
+
+ if (color_type != PNG_COLOR_TYPE_GRAY || bit_depth != 8)
+ return false;
+
+ out_img.buf.resize(out_img.rows * out_img.cols);
+
+ auto readbuf = static_cast<png_bytep>(out_img.buf.data());
+ for (size_t r = 0; r < out_img.rows; ++r)
+ png_read_row(dsc.png, readbuf + r * out_img.cols, nullptr);
+
+ return true;
+}
+
+// Down to earth function to store a packed RGB image to file. Mostly useful for debugging purposes.
+// Based on https://www.lemoda.net/c/write-png/
+bool write_rgb_to_file(const char *file_name_utf8, size_t width, size_t height, const uint8_t *data_rgb)
+{
+ bool result = false;
+
+ // Forward declaration due to the gotos.
+ png_structp png_ptr = nullptr;
+ png_infop info_ptr = nullptr;
+ png_byte **row_pointers = nullptr;
+
+ FILE *fp = boost::nowide::fopen(file_name_utf8, "wb");
+ if (! fp) {
+ BOOST_LOG_TRIVIAL(error) << "write_png_file: File could not be opened for writing: " << file_name_utf8;
+ goto fopen_failed;
+ }
+
+ png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
+ if (! png_ptr) {
+ BOOST_LOG_TRIVIAL(error) << "write_png_file: png_create_write_struct() failed";
+ goto png_create_write_struct_failed;
+ }
+
+ info_ptr = png_create_info_struct(png_ptr);
+ if (! info_ptr) {
+ BOOST_LOG_TRIVIAL(error) << "write_png_file: png_create_info_struct() failed";
+ goto png_create_info_struct_failed;
+ }
+
+ // Set up error handling.
+ if (setjmp(png_jmpbuf(png_ptr))) {
+ BOOST_LOG_TRIVIAL(error) << "write_png_file: setjmp() failed";
+ goto png_failure;
+ }
+
+ // Set image attributes.
+ png_set_IHDR(png_ptr,
+ info_ptr,
+ png_uint_32(width),
+ png_uint_32(height),
+ 8, // depth
+ PNG_COLOR_TYPE_RGB,
+ PNG_INTERLACE_NONE,
+ PNG_COMPRESSION_TYPE_DEFAULT,
+ PNG_FILTER_TYPE_DEFAULT);
+
+ // Initialize rows of PNG.
+ row_pointers = reinterpret_cast<png_byte**>(::png_malloc(png_ptr, height * sizeof(png_byte*)));
+ for (size_t y = 0; y < height; ++ y) {
+ auto row = reinterpret_cast<png_byte*>(::png_malloc(png_ptr, sizeof(uint8_t) * width * 3));
+ row_pointers[y] = row;
+ memcpy(row, data_rgb + width * y * 3, sizeof(uint8_t) * width * 3);
+ }
+
+ // Write the image data to "fp".
+ png_init_io(png_ptr, fp);
+ png_set_rows(png_ptr, info_ptr, row_pointers);
+ png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, nullptr);
+
+ for (size_t y = 0; y < height; ++ y)
+ png_free(png_ptr, row_pointers[y]);
+ png_free(png_ptr, row_pointers);
+
+ result = true;
+
+png_failure:
+png_create_info_struct_failed:
+ ::png_destroy_write_struct(&png_ptr, &info_ptr);
+png_create_write_struct_failed:
+ ::fclose(fp);
+fopen_failed:
+ return result;
+}
+
+bool write_rgb_to_file(const std::string &file_name_utf8, size_t width, size_t height, const uint8_t *data_rgb)
+{
+ return write_rgb_to_file(file_name_utf8.c_str(), width, height, data_rgb);
+}
+
+bool write_rgb_to_file(const std::string &file_name_utf8, size_t width, size_t height, const std::vector<uint8_t> &data_rgb)
+{
+ assert(width * height * 3 == data_rgb.size());
+ return write_rgb_to_file(file_name_utf8.c_str(), width, height, data_rgb.data());
+}
+
+// Scaled variants are mostly useful for debugging purposes, for example to export images of low resolution distance fileds.
+// Scaling is done by multiplying rows and columns without any smoothing to emphasise the original pixels.
+bool write_rgb_to_file_scaled(const char *file_name_utf8, size_t width, size_t height, const uint8_t *data_rgb, size_t scale)
+{
+ if (scale <= 1)
+ return write_rgb_to_file(file_name_utf8, width, height, data_rgb);
+ else {
+ std::vector<uint8_t> scaled(width * height * 3 * scale * scale);
+ uint8_t *dst = scaled.data();
+ for (size_t r = 0; r < height; ++ r) {
+ for (size_t repr = 0; repr < scale; ++ repr) {
+ const uint8_t *row = data_rgb + width * 3 * r;
+ for (size_t c = 0; c < width; ++ c) {
+ for (size_t repc = 0; repc < scale; ++ repc) {
+ *dst ++ = row[0];
+ *dst ++ = row[1];
+ *dst ++ = row[2];
+ }
+ row += 3;
+ }
+ }
+ }
+ return write_rgb_to_file(file_name_utf8, width * scale, height * scale, scaled.data());
+ }
+}
+
+bool write_rgb_to_file_scaled(const std::string &file_name_utf8, size_t width, size_t height, const uint8_t *data_rgb, size_t scale)
+{
+ return write_rgb_to_file_scaled(file_name_utf8.c_str(), width, height, data_rgb, scale);
+}
+
+bool write_rgb_to_file_scaled(const std::string &file_name_utf8, size_t width, size_t height, const std::vector<uint8_t> &data_rgb, size_t scale)
+{
+ assert(width * height * 3 == data_rgb.size());
+ return write_rgb_to_file_scaled(file_name_utf8.c_str(), width, height, data_rgb.data(), scale);
+}
+
+}} // namespace Slic3r::png
diff --git a/src/libslic3r/PNGReadWrite.hpp b/src/libslic3r/PNGReadWrite.hpp
new file mode 100644
index 000000000..6be8ed555
--- /dev/null
+++ b/src/libslic3r/PNGReadWrite.hpp
@@ -0,0 +1,82 @@
+#ifndef PNGREAD_HPP
+#define PNGREAD_HPP
+
+#include <vector>
+#include <string>
+#include <istream>
+
+namespace Slic3r { namespace png {
+
+// Interface for an input stream of encoded png image data.
+struct IStream {
+ virtual ~IStream() = default;
+ virtual size_t read(std::uint8_t *outp, size_t amount) = 0;
+ virtual bool is_ok() const = 0;
+};
+
+// The output format of decode_png: a 2D pixel matrix stored continuously row
+// after row (row major layout).
+template<class PxT> struct Image {
+ std::vector<PxT> buf;
+ size_t rows, cols;
+ PxT get(size_t row, size_t col) const { return buf[row * cols + col]; }
+};
+
+using ImageGreyscale = Image<uint8_t>;
+
+// Only decodes true 8 bit grayscale png images. Returns false for other formats
+// TODO (if needed): implement transformation of rgb images into grayscale...
+bool decode_png(IStream &stream, ImageGreyscale &out_img);
+
+// TODO (if needed)
+// struct RGB { uint8_t r, g, b; };
+// using ImageRGB = Image<RGB>;
+// bool decode_png(IStream &stream, ImageRGB &img);
+
+
+// Encoded png data buffer: a simple read-only buffer and its size.
+struct ReadBuf { const void *buf = nullptr; const size_t sz = 0; };
+
+bool is_png(const ReadBuf &pngbuf);
+
+template<class Img> bool decode_png(const ReadBuf &in_buf, Img &out_img)
+{
+ struct ReadBufStream: public IStream {
+ const ReadBuf &rbuf_ref; size_t pos = 0;
+
+ explicit ReadBufStream(const ReadBuf &buf): rbuf_ref{buf} {}
+
+ size_t read(std::uint8_t *outp, size_t amount) override
+ {
+ if (amount > rbuf_ref.sz - pos) return 0;
+
+ auto buf = static_cast<const std::uint8_t *>(rbuf_ref.buf);
+ std::copy(buf + pos, buf + (pos + amount), outp);
+ pos += amount;
+
+ return amount;
+ }
+
+ bool is_ok() const override { return pos < rbuf_ref.sz; }
+ } stream{in_buf};
+
+ return decode_png(stream, out_img);
+}
+
+// TODO: std::istream of FILE* could be similarly adapted in case its needed...
+
+
+
+// Down to earth function to store a packed RGB image to file. Mostly useful for debugging purposes.
+bool write_rgb_to_file(const char *file_name_utf8, size_t width, size_t height, const uint8_t *data_rgb);
+bool write_rgb_to_file(const std::string &file_name_utf8, size_t width, size_t height, const uint8_t *data_rgb);
+bool write_rgb_to_file(const std::string &file_name_utf8, size_t width, size_t height, const std::vector<uint8_t> &data_rgb);
+// Scaled variants are mostly useful for debugging purposes, for example to export images of low resolution distance fileds.
+// Scaling is done by multiplying rows and columns without any smoothing to emphasise the original pixels.
+bool write_rgb_to_file_scaled(const char *file_name_utf8, size_t width, size_t height, const uint8_t *data_rgb, size_t scale);
+bool write_rgb_to_file_scaled(const std::string &file_name_utf8, size_t width, size_t height, const uint8_t *data_rgb, size_t scale);
+bool write_rgb_to_file_scaled(const std::string &file_name_utf8, size_t width, size_t height, const std::vector<uint8_t> &data_rgb, size_t scale);
+
+}} // namespace Slic3r::png
+
+#endif // PNGREAD_HPP
diff --git a/src/libslic3r/PerimeterGenerator.cpp b/src/libslic3r/PerimeterGenerator.cpp
index 3cd91dafe..ba12a1edb 100644
--- a/src/libslic3r/PerimeterGenerator.cpp
+++ b/src/libslic3r/PerimeterGenerator.cpp
@@ -158,7 +158,7 @@ static ExtrusionEntityCollection traverse_loops(const PerimeterGenerator &perime
// get non-overhang paths by intersecting this loop with the grown lower slices
extrusion_paths_append(
paths,
- intersection_pl(loop.polygon, perimeter_generator.lower_slices_polygons()),
+ intersection_pl((Polygons)loop.polygon, perimeter_generator.lower_slices_polygons()),
role,
is_external ? perimeter_generator.ext_mm3_per_mm() : perimeter_generator.mm3_per_mm(),
is_external ? perimeter_generator.ext_perimeter_flow.width : perimeter_generator.perimeter_flow.width,
@@ -169,7 +169,7 @@ static ExtrusionEntityCollection traverse_loops(const PerimeterGenerator &perime
// the loop centerline and original lower slices is >= half nozzle diameter
extrusion_paths_append(
paths,
- diff_pl(loop.polygon, perimeter_generator.lower_slices_polygons()),
+ diff_pl((Polygons)loop.polygon, perimeter_generator.lower_slices_polygons()),
erOverhangPerimeter,
perimeter_generator.mm3_per_mm_overhang(),
perimeter_generator.overhang_flow.width,
@@ -271,7 +271,7 @@ void PerimeterGenerator::process()
double nozzle_diameter = this->print_config->nozzle_diameter.get_at(this->config->perimeter_extruder-1);
m_lower_slices_polygons = offset(*this->lower_slices, float(scale_(+nozzle_diameter/2)));
}
-
+
// we need to process each island separately because we might have different
// extra perimeters for each one
for (const Surface &surface : this->slices->surfaces) {
@@ -312,7 +312,7 @@ void PerimeterGenerator::process()
for (ExPolygon &ex : expp)
ex.medial_axis(ext_perimeter_width + ext_perimeter_spacing2, min_width, &thin_walls);
}
- if (print_config->spiral_vase && offsets.size() > 1) {
+ if (m_spiral_vase && offsets.size() > 1) {
// Remove all but the largest area polygon.
keep_largest_contour_only(offsets);
}
diff --git a/src/libslic3r/PerimeterGenerator.hpp b/src/libslic3r/PerimeterGenerator.hpp
index c0d9e65a7..f55555068 100644
--- a/src/libslic3r/PerimeterGenerator.hpp
+++ b/src/libslic3r/PerimeterGenerator.hpp
@@ -37,6 +37,7 @@ public:
const PrintRegionConfig* config,
const PrintObjectConfig* object_config,
const PrintConfig* print_config,
+ const bool spiral_vase,
// Output:
// Loops with the external thin walls
ExtrusionEntityCollection* loops,
@@ -48,6 +49,7 @@ public:
layer_id(-1), perimeter_flow(flow), ext_perimeter_flow(flow),
overhang_flow(flow), solid_infill_flow(flow),
config(config), object_config(object_config), print_config(print_config),
+ m_spiral_vase(spiral_vase),
loops(loops), gap_fill(gap_fill), fill_surfaces(fill_surfaces),
m_ext_mm3_per_mm(-1), m_mm3_per_mm(-1), m_mm3_per_mm_overhang(-1)
{}
@@ -60,6 +62,7 @@ public:
Polygons lower_slices_polygons() const { return m_lower_slices_polygons; }
private:
+ bool m_spiral_vase;
double m_ext_mm3_per_mm;
double m_mm3_per_mm;
double m_mm3_per_mm_overhang;
diff --git a/src/libslic3r/PlaceholderParser.cpp b/src/libslic3r/PlaceholderParser.cpp
index 527d82b4c..6f2b7f3ea 100644
--- a/src/libslic3r/PlaceholderParser.cpp
+++ b/src/libslic3r/PlaceholderParser.cpp
@@ -1,4 +1,5 @@
#include "PlaceholderParser.hpp"
+#include "Exception.hpp"
#include "Flow.hpp"
#include <cstring>
#include <ctime>
@@ -24,6 +25,7 @@
#endif
#include <boost/algorithm/string.hpp>
+#include <boost/nowide/convert.hpp>
// Spirit v2.5 allows you to suppress automatic generation
// of predefined terminals to speed up complation. With
@@ -494,6 +496,12 @@ namespace client
static void leq (expr &lhs, expr &rhs) { compare_op(lhs, rhs, '>', true ); }
static void geq (expr &lhs, expr &rhs) { compare_op(lhs, rhs, '<', true ); }
+ static void throw_if_not_numeric(const expr &param)
+ {
+ const char *err_msg = "Not a numeric type.";
+ param.throw_if_not_numeric(err_msg);
+ }
+
enum Function2ParamsType {
FUNCTION_MIN,
FUNCTION_MAX,
@@ -501,9 +509,8 @@ namespace client
// Store the result into param1.
static void function_2params(expr &param1, expr &param2, Function2ParamsType fun)
{
- const char *err_msg = "Not a numeric type.";
- param1.throw_if_not_numeric(err_msg);
- param2.throw_if_not_numeric(err_msg);
+ throw_if_not_numeric(param1);
+ throw_if_not_numeric(param2);
if (param1.type == TYPE_DOUBLE || param2.type == TYPE_DOUBLE) {
double d = 0.;
switch (fun) {
@@ -528,6 +535,20 @@ namespace client
static void min(expr &param1, expr &param2) { function_2params(param1, param2, FUNCTION_MIN); }
static void max(expr &param1, expr &param2) { function_2params(param1, param2, FUNCTION_MAX); }
+ // Store the result into param1.
+ static void random(expr &param1, expr &param2, std::mt19937 &rng)
+ {
+ throw_if_not_numeric(param1);
+ throw_if_not_numeric(param2);
+ if (param1.type == TYPE_DOUBLE || param2.type == TYPE_DOUBLE) {
+ param1.data.d = std::uniform_real_distribution<>(param1.as_d(), param2.as_d())(rng);
+ param1.type = TYPE_DOUBLE;
+ } else {
+ param1.data.i = std::uniform_int_distribution<>(param1.as_i(), param2.as_i())(rng);
+ param1.type = TYPE_INT;
+ }
+ }
+
static void regex_op(expr &lhs, boost::iterator_range<Iterator> &rhs, char op)
{
const std::string *subject = nullptr;
@@ -622,6 +643,7 @@ namespace client
const DynamicConfig *config = nullptr;
const DynamicConfig *config_override = nullptr;
size_t current_extruder_id = 0;
+ PlaceholderParser::ContextData *context_data = nullptr;
// If false, the macro_processor will evaluate a full macro.
// If true, the macro processor will evaluate just a boolean condition using the full expressive power of the macro processor.
bool just_boolean_expression = false;
@@ -823,6 +845,15 @@ namespace client
}
template <typename Iterator>
+ static void random(const MyContext *ctx, expr<Iterator> &param1, expr<Iterator> &param2)
+ {
+ if (ctx->context_data == nullptr)
+ ctx->throw_exception("Random number generator not available in this context.",
+ boost::iterator_range<Iterator>(param1.it_range.begin(), param2.it_range.end()));
+ expr<Iterator>::random(param1, param2, ctx->context_data->rng);
+ }
+
+ template <typename Iterator>
static void throw_exception(const std::string &msg, const boost::iterator_range<Iterator> &it_range)
{
// An asterix is added to the start of the string to differentiate the boost::spirit::info::tag content
@@ -869,7 +900,9 @@ namespace client
}
}
msg += '\n';
- msg += error_line;
+ // This hack removes all non-UTF8 characters from the source line, so that the upstream wxWidgets conversions
+ // from UTF8 to UTF16 don't bail out.
+ msg += boost::nowide::narrow(boost::nowide::widen(error_line));
msg += '\n';
for (size_t i = 0; i < error_pos; ++ i)
msg += ' ';
@@ -1172,6 +1205,8 @@ namespace client
[ px::bind(&expr<Iterator>::min, _val, _2) ]
| (kw["max"] > '(' > conditional_expression(_r1) [_val = _1] > ',' > conditional_expression(_r1) > ')')
[ px::bind(&expr<Iterator>::max, _val, _2) ]
+ | (kw["random"] > '(' > conditional_expression(_r1) [_val = _1] > ',' > conditional_expression(_r1) > ')')
+ [ px::bind(&MyContext::random<Iterator>, _r1, _val, _2) ]
| (kw["int"] > '(' > unary_expression(_r1) > ')') [ px::bind(&FactorActions::to_int, _1, _val) ]
| (strict_double > iter_pos) [ px::bind(&FactorActions::double_, _1, _2, _val) ]
| (int_ > iter_pos) [ px::bind(&FactorActions::int_, _1, _2, _val) ]
@@ -1208,6 +1243,7 @@ namespace client
("false")
("min")
("max")
+ ("random")
("not")
("or")
("true");
@@ -1303,23 +1339,24 @@ static std::string process_macro(const std::string &templ, client::MyContext &co
if (!context.error_message.empty()) {
if (context.error_message.back() != '\n' && context.error_message.back() != '\r')
context.error_message += '\n';
- throw std::runtime_error(context.error_message);
+ throw Slic3r::PlaceholderParserError(context.error_message);
}
return output;
}
-std::string PlaceholderParser::process(const std::string &templ, unsigned int current_extruder_id, const DynamicConfig *config_override) const
+std::string PlaceholderParser::process(const std::string &templ, unsigned int current_extruder_id, const DynamicConfig *config_override, ContextData *context_data) const
{
client::MyContext context;
context.external_config = this->external_config();
context.config = &this->config();
context.config_override = config_override;
context.current_extruder_id = current_extruder_id;
+ context.context_data = context_data;
return process_macro(templ, context);
}
// Evaluate a boolean expression using the full expressive power of the PlaceholderParser boolean expression syntax.
-// Throws std::runtime_error on syntax or runtime error.
+// Throws Slic3r::RuntimeError on syntax or runtime error.
bool PlaceholderParser::evaluate_boolean_expression(const std::string &templ, const DynamicConfig &config, const DynamicConfig *config_override)
{
client::MyContext context;
diff --git a/src/libslic3r/PlaceholderParser.hpp b/src/libslic3r/PlaceholderParser.hpp
index d744dba22..ae6ef8f02 100644
--- a/src/libslic3r/PlaceholderParser.hpp
+++ b/src/libslic3r/PlaceholderParser.hpp
@@ -3,6 +3,7 @@
#include "libslic3r.h"
#include <map>
+#include <random>
#include <string>
#include <vector>
#include "PrintConfig.hpp"
@@ -11,7 +12,16 @@ namespace Slic3r {
class PlaceholderParser
{
-public:
+public:
+ // Context to be shared during multiple executions of the PlaceholderParser.
+ // The context is kept external to the PlaceholderParser, so that the same PlaceholderParser
+ // may be called safely from multiple threads.
+ // In the future, the context may hold variables created and modified by the PlaceholderParser
+ // and shared between the PlaceholderParser::process() invocations.
+ struct ContextData {
+ std::mt19937 rng;
+ };
+
PlaceholderParser(const DynamicConfig *external_config = nullptr);
// Return a list of keys, which should be changed in m_config from rhs.
@@ -40,11 +50,11 @@ public:
const DynamicConfig* external_config() const { return m_external_config; }
// Fill in the template using a macro processing language.
- // Throws std::runtime_error on syntax or runtime error.
- std::string process(const std::string &templ, unsigned int current_extruder_id = 0, const DynamicConfig *config_override = nullptr) const;
+ // Throws Slic3r::PlaceholderParserError on syntax or runtime error.
+ std::string process(const std::string &templ, unsigned int current_extruder_id = 0, const DynamicConfig *config_override = nullptr, ContextData *context = nullptr) const;
// Evaluate a boolean expression using the full expressive power of the PlaceholderParser boolean expression syntax.
- // Throws std::runtime_error on syntax or runtime error.
+ // Throws Slic3r::PlaceholderParserError on syntax or runtime error.
static bool evaluate_boolean_expression(const std::string &templ, const DynamicConfig &config, const DynamicConfig *config_override = nullptr);
// Update timestamp, year, month, day, hour, minute, second variables at the provided config.
diff --git a/src/libslic3r/Point.cpp b/src/libslic3r/Point.cpp
index c2417d0dc..b16abe7be 100644
--- a/src/libslic3r/Point.cpp
+++ b/src/libslic3r/Point.cpp
@@ -2,6 +2,7 @@
#include "Line.hpp"
#include "MultiPoint.hpp"
#include "Int128.hpp"
+#include "BoundingBox.hpp"
#include <algorithm>
namespace Slic3r {
@@ -44,16 +45,6 @@ Pointf3s transform(const Pointf3s& points, const Transform3d& t)
return ret_points;
}
-void Point::rotate(double angle)
-{
- double cur_x = (double)(*this)(0);
- double cur_y = (double)(*this)(1);
- double s = ::sin(angle);
- double c = ::cos(angle);
- (*this)(0) = (coord_t)round(c * cur_x - s * cur_y);
- (*this)(1) = (coord_t)round(c * cur_y + s * cur_x);
-}
-
void Point::rotate(double angle, const Point &center)
{
double cur_x = (double)(*this)(0);
@@ -186,6 +177,19 @@ Point Point::projection_onto(const Line &line) const
return ((line.a - *this).cast<double>().squaredNorm() < (line.b - *this).cast<double>().squaredNorm()) ? line.a : line.b;
}
+BoundingBox get_extents(const Points &pts)
+{
+ return BoundingBox(pts);
+}
+
+BoundingBox get_extents(const std::vector<Points> &pts)
+{
+ BoundingBox bbox;
+ for (const Points &p : pts)
+ bbox.merge(get_extents(p));
+ return bbox;
+}
+
std::ostream& operator<<(std::ostream &stm, const Vec2d &pointf)
{
return stm << pointf(0) << "," << pointf(1);
diff --git a/src/libslic3r/Point.hpp b/src/libslic3r/Point.hpp
index dced5c02a..a6525af4e 100644
--- a/src/libslic3r/Point.hpp
+++ b/src/libslic3r/Point.hpp
@@ -13,6 +13,7 @@
namespace Slic3r {
+class BoundingBox;
class Line;
class MultiPoint;
class Point;
@@ -24,7 +25,9 @@ typedef Eigen::Matrix<coord_t, 2, 1, Eigen::DontAlign> Vec2crd;
typedef Eigen::Matrix<coord_t, 3, 1, Eigen::DontAlign> Vec3crd;
typedef Eigen::Matrix<int, 2, 1, Eigen::DontAlign> Vec2i;
typedef Eigen::Matrix<int, 3, 1, Eigen::DontAlign> Vec3i;
+typedef Eigen::Matrix<int32_t, 2, 1, Eigen::DontAlign> Vec2i32;
typedef Eigen::Matrix<int64_t, 2, 1, Eigen::DontAlign> Vec2i64;
+typedef Eigen::Matrix<int32_t, 3, 1, Eigen::DontAlign> Vec3i32;
typedef Eigen::Matrix<int64_t, 3, 1, Eigen::DontAlign> Vec3i64;
// Vector types with a double coordinate base type.
@@ -53,20 +56,20 @@ typedef Eigen::Transform<double, 3, Eigen::Affine, Eigen::DontAlign> Transform3d
inline bool operator<(const Vec2d &lhs, const Vec2d &rhs) { return lhs(0) < rhs(0) || (lhs(0) == rhs(0) && lhs(1) < rhs(1)); }
+// One likely does not want to perform the cross product with a 32bit accumulator.
+//inline int32_t cross2(const Vec2i32 &v1, const Vec2i32 &v2) { return v1(0) * v2(1) - v1(1) * v2(0); }
inline int64_t cross2(const Vec2i64 &v1, const Vec2i64 &v2) { return v1(0) * v2(1) - v1(1) * v2(0); }
-inline coord_t cross2(const Vec2crd &v1, const Vec2crd &v2) { return v1(0) * v2(1) - v1(1) * v2(0); }
inline float cross2(const Vec2f &v1, const Vec2f &v2) { return v1(0) * v2(1) - v1(1) * v2(0); }
inline double cross2(const Vec2d &v1, const Vec2d &v2) { return v1(0) * v2(1) - v1(1) * v2(0); }
-inline Vec2crd to_2d(const Vec3crd &pt3) { return Vec2crd(pt3(0), pt3(1)); }
-inline Vec2i64 to_2d(const Vec3i64 &pt3) { return Vec2i64(pt3(0), pt3(1)); }
-inline Vec2f to_2d(const Vec3f &pt3) { return Vec2f (pt3(0), pt3(1)); }
-inline Vec2d to_2d(const Vec3d &pt3) { return Vec2d (pt3(0), pt3(1)); }
+template<typename T, int Options>
+inline Eigen::Matrix<T, 2, 1, Eigen::DontAlign> perp(const Eigen::MatrixBase<Eigen::Matrix<T, 2, 1, Options>> &v) { return Eigen::Matrix<T, 2, 1, Eigen::DontAlign>(- v.y(), v.x()); }
-inline Vec3d to_3d(const Vec2d &v, double z) { return Vec3d(v(0), v(1), z); }
-inline Vec3f to_3d(const Vec2f &v, float z) { return Vec3f(v(0), v(1), z); }
-inline Vec3i64 to_3d(const Vec2i64 &v, float z) { return Vec3i64(int64_t(v(0)), int64_t(v(1)), int64_t(z)); }
-inline Vec3crd to_3d(const Vec3crd &p, coord_t z) { return Vec3crd(p(0), p(1), z); }
+template<class T, int N, int Options>
+Eigen::Matrix<T, 2, 1, Eigen::DontAlign> to_2d(const Eigen::MatrixBase<Eigen::Matrix<T, N, 1, Options>> &ptN) { return { ptN(0), ptN(1) }; }
+
+template<class T, int Options>
+Eigen::Matrix<T, 3, 1, Eigen::DontAlign> to_3d(const Eigen::MatrixBase<Eigen::Matrix<T, 2, 1, Options>> & pt, const T z) { return { pt(0), pt(1), z }; }
inline Vec2d unscale(coord_t x, coord_t y) { return Vec2d(unscale<double>(x), unscale<double>(y)); }
inline Vec2d unscale(const Vec2crd &pt) { return Vec2d(unscale<double>(pt(0)), unscale<double>(pt(1))); }
@@ -83,14 +86,16 @@ inline std::string to_string(const Vec3d &pt) { return std::string("[") + std:
std::vector<Vec3f> transform(const std::vector<Vec3f>& points, const Transform3f& t);
Pointf3s transform(const Pointf3s& points, const Transform3d& t);
+template<int N, class T> using Vec = Eigen::Matrix<T, N, 1, Eigen::DontAlign, N, 1>;
+
class Point : public Vec2crd
{
public:
typedef coord_t coord_type;
Point() : Vec2crd(0, 0) {}
- Point(coord_t x, coord_t y) : Vec2crd(x, y) {}
- Point(int64_t x, int64_t y) : Vec2crd(coord_t(x), coord_t(y)) {} // for Clipper
+ Point(int32_t x, int32_t y) : Vec2crd(coord_t(x), coord_t(y)) {}
+ Point(int64_t x, int64_t y) : Vec2crd(coord_t(x), coord_t(y)) {}
Point(double x, double y) : Vec2crd(coord_t(lrint(x)), coord_t(lrint(y))) {}
Point(const Point &rhs) { *this = rhs; }
explicit Point(const Vec2d& rhs) : Vec2crd(coord_t(lrint(rhs.x())), coord_t(lrint(rhs.y()))) {}
@@ -98,6 +103,7 @@ public:
template<typename OtherDerived>
Point(const Eigen::MatrixBase<OtherDerived> &other) : Vec2crd(other) {}
static Point new_scale(coordf_t x, coordf_t y) { return Point(coord_t(scale_(x)), coord_t(scale_(y))); }
+ static Point new_scale(const Vec2d &v) { return Point(coord_t(scale_(v.x())), coord_t(scale_(v.y()))); }
// This method allows you to assign Eigen expressions to MyVectorType
template<typename OtherDerived>
@@ -112,10 +118,19 @@ public:
Point& operator+=(const Point& rhs) { (*this)(0) += rhs(0); (*this)(1) += rhs(1); return *this; }
Point& operator-=(const Point& rhs) { (*this)(0) -= rhs(0); (*this)(1) -= rhs(1); return *this; }
Point& operator*=(const double &rhs) { (*this)(0) = coord_t((*this)(0) * rhs); (*this)(1) = coord_t((*this)(1) * rhs); return *this; }
+ Point operator*(const double &rhs) { return Point((*this)(0) * rhs, (*this)(1) * rhs); }
+
+ void rotate(double angle) { this->rotate(std::cos(angle), std::sin(angle)); }
+ void rotate(double cos_a, double sin_a) {
+ double cur_x = (double)(*this)(0);
+ double cur_y = (double)(*this)(1);
+ (*this)(0) = (coord_t)round(cos_a * cur_x - sin_a * cur_y);
+ (*this)(1) = (coord_t)round(cos_a * cur_y + sin_a * cur_x);
+ }
- void rotate(double angle);
void rotate(double angle, const Point &center);
Point rotated(double angle) const { Point res(*this); res.rotate(angle); return res; }
+ Point rotated(double cos_a, double sin_a) const { Point res(*this); res.rotate(cos_a, sin_a); return res; }
Point rotated(double angle, const Point &center) const { Point res(*this); res.rotate(angle, center); return res; }
int nearest_point_index(const Points &points) const;
int nearest_point_index(const PointConstPtrs &points) const;
@@ -158,6 +173,15 @@ inline bool is_approx(const Vec3d &p1, const Vec3d &p2, double epsilon = EPSILON
return d.x() < epsilon && d.y() < epsilon && d.z() < epsilon;
}
+inline Point lerp(const Point &a, const Point &b, double t)
+{
+ assert((t >= -EPSILON) && (t <= 1. + EPSILON));
+ return ((1. - t) * a.cast<double>() + t * b.cast<double>()).cast<coord_t>();
+}
+
+extern BoundingBox get_extents(const Points &pts);
+extern BoundingBox get_extents(const std::vector<Points> &pts);
+
namespace int128 {
// Exact orientation predicate,
// returns +1: CCW, 0: collinear, -1: CW.
@@ -275,6 +299,33 @@ public:
std::make_pair(nullptr, std::numeric_limits<double>::max());
}
+ // Returns all pairs of values and squared distances.
+ std::vector<std::pair<const ValueType*, double>> find_all(const Vec2crd &pt) {
+ // Iterate over 4 closest grid cells around pt,
+ // Round pt to a closest grid_cell corner.
+ Vec2crd grid_corner((pt(0)+(m_grid_resolution>>1))>>m_grid_log2, (pt(1)+(m_grid_resolution>>1))>>m_grid_log2);
+ // For four neighbors of grid_corner:
+ std::vector<std::pair<const ValueType*, double>> out;
+ const double r2 = double(m_search_radius) * m_search_radius;
+ for (coord_t neighbor_y = -1; neighbor_y < 1; ++ neighbor_y) {
+ for (coord_t neighbor_x = -1; neighbor_x < 1; ++ neighbor_x) {
+ // Range of fragment starts around grid_corner, close to pt.
+ auto range = m_map.equal_range(Vec2crd(grid_corner(0) + neighbor_x, grid_corner(1) + neighbor_y));
+ // Find the map entry closest to pt.
+ for (auto it = range.first; it != range.second; ++it) {
+ const ValueType &value = it->second;
+ const Vec2crd *pt2 = m_point_accessor(value);
+ if (pt2 != nullptr) {
+ const double d2 = (pt - *pt2).cast<double>().squaredNorm();
+ if (d2 <= r2)
+ out.emplace_back(&value, d2);
+ }
+ }
+ }
+ }
+ return out;
+ }
+
private:
typedef typename std::unordered_multimap<Vec2crd, ValueType, PointHash> map_type;
PointAccessor m_point_accessor;
@@ -286,6 +337,72 @@ private:
std::ostream& operator<<(std::ostream &stm, const Vec2d &pointf);
+
+// /////////////////////////////////////////////////////////////////////////////
+// Type safe conversions to and from scaled and unscaled coordinates
+// /////////////////////////////////////////////////////////////////////////////
+
+// Semantics are the following:
+// Upscaling (scaled()): only from floating point types (or Vec) to either
+// floating point or integer 'scaled coord' coordinates.
+// Downscaling (unscaled()): from arithmetic (or Vec) to floating point only
+
+// Conversion definition from unscaled to floating point scaled
+template<class Tout,
+ class Tin,
+ class = FloatingOnly<Tin>>
+inline constexpr FloatingOnly<Tout> scaled(const Tin &v) noexcept
+{
+ return Tout(v / Tin(SCALING_FACTOR));
+}
+
+// Conversion definition from unscaled to integer 'scaled coord'.
+// TODO: is the rounding necessary? Here it is commented out to show that
+// it can be different for integers but it does not have to be. Using
+// std::round means loosing noexcept and constexpr modifiers
+template<class Tout = coord_t, class Tin, class = FloatingOnly<Tin>>
+inline constexpr ScaledCoordOnly<Tout> scaled(const Tin &v) noexcept
+{
+ //return static_cast<Tout>(std::round(v / SCALING_FACTOR));
+ return Tout(v / Tin(SCALING_FACTOR));
+}
+
+// Conversion for Eigen vectors (N dimensional points)
+template<class Tout = coord_t,
+ class Tin,
+ int N,
+ class = FloatingOnly<Tin>,
+ int...EigenArgs>
+inline Eigen::Matrix<ArithmeticOnly<Tout>, N, EigenArgs...>
+scaled(const Eigen::Matrix<Tin, N, EigenArgs...> &v)
+{
+ return (v / SCALING_FACTOR).template cast<Tout>();
+}
+
+// Conversion from arithmetic scaled type to floating point unscaled
+template<class Tout = double,
+ class Tin,
+ class = ArithmeticOnly<Tin>,
+ class = FloatingOnly<Tout>>
+inline constexpr Tout unscaled(const Tin &v) noexcept
+{
+ return Tout(v * Tout(SCALING_FACTOR));
+}
+
+// Unscaling for Eigen vectors. Input base type can be arithmetic, output base
+// type can only be floating point.
+template<class Tout = double,
+ class Tin,
+ int N,
+ class = ArithmeticOnly<Tin>,
+ class = FloatingOnly<Tout>,
+ int...EigenArgs>
+inline constexpr Eigen::Matrix<Tout, N, EigenArgs...>
+unscaled(const Eigen::Matrix<Tin, N, EigenArgs...> &v) noexcept
+{
+ return v.template cast<Tout>() * SCALING_FACTOR;
+}
+
} // namespace Slic3r
// start Boost
@@ -300,7 +417,7 @@ namespace boost { namespace polygon {
typedef coord_t coordinate_type;
static inline coordinate_type get(const Slic3r::Point& point, orientation_2d orient) {
- return (orient == HORIZONTAL) ? (coordinate_type)point(0) : (coordinate_type)point(1);
+ return (coordinate_type)point((orient == HORIZONTAL) ? 0 : 1);
}
};
@@ -308,16 +425,10 @@ namespace boost { namespace polygon {
struct point_mutable_traits<Slic3r::Point> {
typedef coord_t coordinate_type;
static inline void set(Slic3r::Point& point, orientation_2d orient, coord_t value) {
- if (orient == HORIZONTAL)
- point(0) = value;
- else
- point(1) = value;
+ point((orient == HORIZONTAL) ? 0 : 1) = value;
}
static inline Slic3r::Point construct(coord_t x_value, coord_t y_value) {
- Slic3r::Point retval;
- retval(0) = x_value;
- retval(1) = y_value;
- return retval;
+ return Slic3r::Point(x_value, y_value);
}
};
} }
diff --git a/src/libslic3r/Polygon.cpp b/src/libslic3r/Polygon.cpp
index e1e299144..f74df1c9a 100644
--- a/src/libslic3r/Polygon.cpp
+++ b/src/libslic3r/Polygon.cpp
@@ -1,5 +1,6 @@
#include "BoundingBox.hpp"
#include "ClipperUtils.hpp"
+#include "Exception.hpp"
#include "Polygon.hpp"
#include "Polyline.hpp"
@@ -16,7 +17,7 @@ Polyline Polygon::split_at_vertex(const Point &point) const
for (const Point &pt : this->points)
if (pt == point)
return this->split_at_index(int(&pt - &this->points.front()));
- throw std::invalid_argument("Point not found");
+ throw Slic3r::InvalidArgument("Point not found");
return Polyline();
}
@@ -48,12 +49,12 @@ int64_t Polygon::area2x() const
}
*/
-double Polygon::area() const
+double Polygon::area(const Points &points)
{
size_t n = points.size();
if (n < 3)
return 0.;
-
+
double a = 0.;
for (size_t i = 0, j = n - 1; i < n; ++i) {
a += ((double)points[j](0) + (double)points[i](0)) * ((double)points[i](1) - (double)points[j](1));
@@ -62,6 +63,11 @@ double Polygon::area() const
return 0.5 * a;
}
+double Polygon::area() const
+{
+ return Polygon::area(points);
+}
+
bool Polygon::is_counter_clockwise() const
{
return ClipperLib::Orientation(Slic3rMultiPoint_to_ClipperPath(*this));
@@ -254,9 +260,42 @@ Point Polygon::point_projection(const Point &point) const
return proj;
}
-BoundingBox get_extents(const Points &points)
-{
- return BoundingBox(points);
+std::vector<float> Polygon::parameter_by_length() const
+{
+ // Parametrize the polygon by its length.
+ std::vector<float> lengths(points.size()+1, 0.);
+ for (size_t i = 1; i < points.size(); ++ i)
+ lengths[i] = lengths[i-1] + (points[i] - points[i-1]).cast<float>().norm();
+ lengths.back() = lengths[lengths.size()-2] + (points.front() - points.back()).cast<float>().norm();
+ return lengths;
+}
+
+void Polygon::densify(float min_length, std::vector<float>* lengths_ptr)
+{
+ std::vector<float> lengths_local;
+ std::vector<float>& lengths = lengths_ptr ? *lengths_ptr : lengths_local;
+
+ if (! lengths_ptr) {
+ // Length parametrization has not been provided. Calculate our own.
+ lengths = this->parameter_by_length();
+ }
+
+ assert(points.size() == lengths.size() - 1);
+
+ for (size_t j=1; j<=points.size(); ++j) {
+ bool last = j == points.size();
+ int i = last ? 0 : j;
+
+ if (lengths[j] - lengths[j-1] > min_length) {
+ Point diff = points[i] - points[j-1];
+ float diff_len = lengths[j] - lengths[j-1];
+ float r = (min_length/diff_len);
+ Point new_pt = points[j-1] + Point(r*diff[0], r*diff[1]);
+ points.insert(points.begin() + j, new_pt);
+ lengths.insert(lengths.begin() + j, lengths[j-1] + min_length);
+ }
+ }
+ assert(points.size() == lengths.size() - 1);
}
BoundingBox get_extents(const Polygon &poly)
diff --git a/src/libslic3r/Polygon.hpp b/src/libslic3r/Polygon.hpp
index 0f8457ebd..b550ae7d7 100644
--- a/src/libslic3r/Polygon.hpp
+++ b/src/libslic3r/Polygon.hpp
@@ -16,12 +16,13 @@ typedef std::vector<Polygon> Polygons;
class Polygon : public MultiPoint
{
public:
- operator Polygons() const { Polygons pp; pp.push_back(*this); return pp; }
- operator Polyline() const { return this->split_at_first_point(); }
+ explicit operator Polygons() const { Polygons pp; pp.push_back(*this); return pp; }
+ explicit operator Polyline() const { return this->split_at_first_point(); }
Point& operator[](Points::size_type idx) { return this->points[idx]; }
const Point& operator[](Points::size_type idx) const { return this->points[idx]; }
- Polygon() {}
+ Polygon() = default;
+ virtual ~Polygon() = default;
explicit Polygon(const Points &points) : MultiPoint(points) {}
Polygon(std::initializer_list<Point> points) : MultiPoint(points) {}
Polygon(const Polygon &other) : MultiPoint(other.points) {}
@@ -46,7 +47,8 @@ public:
// Split a closed polygon into an open polyline, with the split point duplicated at both ends.
Polyline split_at_first_point() const { return this->split_at_index(0); }
Points equally_spaced_points(double distance) const { return this->split_at_first_point().equally_spaced_points(distance); }
-
+
+ static double area(const Points &pts);
double area() const;
bool is_counter_clockwise() const;
bool is_clockwise() const;
@@ -59,18 +61,19 @@ public:
bool contains(const Point &point) const;
Polygons simplify(double tolerance) const;
void simplify(double tolerance, Polygons &polygons) const;
+ void densify(float min_length, std::vector<float>* lengths = nullptr);
void triangulate_convex(Polygons* polygons) const;
Point centroid() const;
Points concave_points(double angle = PI) const;
Points convex_points(double angle = PI) const;
// Projection of a point onto the polygon.
Point point_projection(const Point &point) const;
+ std::vector<float> parameter_by_length() const;
};
inline bool operator==(const Polygon &lhs, const Polygon &rhs) { return lhs.points == rhs.points; }
inline bool operator!=(const Polygon &lhs, const Polygon &rhs) { return lhs.points != rhs.points; }
-extern BoundingBox get_extents(const Points &points);
extern BoundingBox get_extents(const Polygon &poly);
extern BoundingBox get_extents(const Polygons &polygons);
extern BoundingBox get_extents_rotated(const Polygon &poly, double angle);
@@ -84,6 +87,14 @@ inline double total_length(const Polygons &polylines) {
return total;
}
+inline double area(const Polygons &polys)
+{
+ double s = 0.;
+ for (auto &p : polys) s += p.area();
+
+ return s;
+}
+
// Remove sticks (tentacles with zero area) from the polygon.
extern bool remove_sticks(Polygon &poly);
extern bool remove_sticks(Polygons &polys);
@@ -151,9 +162,11 @@ inline Lines to_lines(const Polygon &poly)
{
Lines lines;
lines.reserve(poly.points.size());
- for (Points::const_iterator it = poly.points.begin(); it != poly.points.end()-1; ++it)
- lines.push_back(Line(*it, *(it + 1)));
- lines.push_back(Line(poly.points.back(), poly.points.front()));
+ if (poly.points.size() > 2) {
+ for (Points::const_iterator it = poly.points.begin(); it != poly.points.end()-1; ++it)
+ lines.push_back(Line(*it, *(it + 1)));
+ lines.push_back(Line(poly.points.back(), poly.points.front()));
+ }
return lines;
}
diff --git a/src/libslic3r/Polyline.cpp b/src/libslic3r/Polyline.cpp
index 26aad83d2..a6be64299 100644
--- a/src/libslic3r/Polyline.cpp
+++ b/src/libslic3r/Polyline.cpp
@@ -1,5 +1,6 @@
#include "BoundingBox.hpp"
#include "Polyline.hpp"
+#include "Exception.hpp"
#include "ExPolygon.hpp"
#include "ExPolygonCollection.hpp"
#include "Line.hpp"
@@ -19,7 +20,7 @@ Polyline::operator Polylines() const
Polyline::operator Line() const
{
if (this->points.size() > 2)
- throw std::invalid_argument("Can't convert polyline with more than two points to a line");
+ throw Slic3r::InvalidArgument("Can't convert polyline with more than two points to a line");
return Line(this->points.front(), this->points.back());
}
@@ -199,7 +200,7 @@ BoundingBox get_extents(const Polylines &polylines)
if (! polylines.empty()) {
bb = polylines.front().bounding_box();
for (size_t i = 1; i < polylines.size(); ++ i)
- bb.merge(polylines[i]);
+ bb.merge(polylines[i].points);
}
return bb;
}
@@ -207,7 +208,7 @@ BoundingBox get_extents(const Polylines &polylines)
const Point& leftmost_point(const Polylines &polylines)
{
if (polylines.empty())
- throw std::invalid_argument("leftmost_point() called on empty PolylineCollection");
+ throw Slic3r::InvalidArgument("leftmost_point() called on empty PolylineCollection");
Polylines::const_iterator it = polylines.begin();
const Point *p = &it->leftmost_point();
for (++ it; it != polylines.end(); ++it) {
diff --git a/src/libslic3r/Polyline.hpp b/src/libslic3r/Polyline.hpp
index 2a53a13f9..ef1da9afb 100644
--- a/src/libslic3r/Polyline.hpp
+++ b/src/libslic3r/Polyline.hpp
@@ -60,8 +60,8 @@ public:
}
}
- operator Polylines() const;
- operator Line() const;
+ explicit operator Polylines() const;
+ explicit operator Line() const;
const Point& last_point() const override { return this->points.back(); }
const Point& leftmost_point() const;
diff --git a/src/slic3r/GUI/Preset.cpp b/src/libslic3r/Preset.cpp
index 1b03a558d..c24033df2 100644
--- a/src/slic3r/GUI/Preset.cpp
+++ b/src/libslic3r/Preset.cpp
@@ -1,10 +1,8 @@
#include <cassert>
+#include "Exception.hpp"
#include "Preset.hpp"
#include "AppConfig.hpp"
-#include "BitmapCache.hpp"
-#include "I18N.hpp"
-#include "wxExtensions.hpp"
#ifdef _MSC_VER
#define WIN32_LEAN_AND_MEAN
@@ -12,6 +10,16 @@
#include <Windows.h>
#endif /* _MSC_VER */
+// instead of #include "slic3r/GUI/I18N.hpp" :
+#ifndef L
+// !!! If you needed to translate some string,
+// !!! please use _L(string)
+// !!! _() - is a standard wxWidgets macro to translate
+// !!! L() is used only for marking localizable string
+// !!! It will be used in "xgettext" to create a Locating Message Catalog.
+#define L(s) s
+#endif /* L */
+
#include <algorithm>
#include <fstream>
#include <stdexcept>
@@ -19,6 +27,7 @@
#include <boost/format.hpp>
#include <boost/filesystem.hpp>
#include <boost/filesystem/fstream.hpp>
+#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/predicate.hpp>
#include <boost/nowide/cenv.hpp>
@@ -30,15 +39,9 @@
#include <boost/locale.hpp>
#include <boost/log/trivial.hpp>
-#include <wx/image.h>
-#include <wx/choice.h>
-#include <wx/bmpcbox.h>
-#include <wx/wupdlock.h>
-
-#include "libslic3r/libslic3r.h"
-#include "libslic3r/Utils.hpp"
-#include "libslic3r/PlaceholderParser.hpp"
-#include "Plater.hpp"
+#include "libslic3r.h"
+#include "Utils.hpp"
+#include "PlaceholderParser.hpp"
using boost::property_tree::ptree;
@@ -105,7 +108,7 @@ VendorProfile VendorProfile::from_ini(const ptree &tree, const boost::filesystem
const std::string id = path.stem().string();
if (! boost::filesystem::exists(path)) {
- throw std::runtime_error((boost::format("Cannot load Vendor Config Bundle `%1%`: File not found: `%2%`.") % id % path).str());
+ throw Slic3r::RuntimeError((boost::format("Cannot load Vendor Config Bundle `%1%`: File not found: `%2%`.") % id % path).str());
}
VendorProfile res(id);
@@ -115,7 +118,7 @@ VendorProfile VendorProfile::from_ini(const ptree &tree, const boost::filesystem
{
auto res = tree.find(key);
if (res == tree.not_found()) {
- throw std::runtime_error((boost::format("Vendor Config Bundle `%1%` is not valid: Missing secion or key: `%2%`.") % id % key).str());
+ throw Slic3r::RuntimeError((boost::format("Vendor Config Bundle `%1%` is not valid: Missing secion or key: `%2%`.") % id % key).str());
}
return res;
};
@@ -127,7 +130,7 @@ VendorProfile VendorProfile::from_ini(const ptree &tree, const boost::filesystem
auto config_version_str = get_or_throw(vendor_section, "config_version")->second.data();
auto config_version = Semver::parse(config_version_str);
if (! config_version) {
- throw std::runtime_error((boost::format("Vendor Config Bundle `%1%` is not valid: Cannot parse config_version: `%2%`.") % id % config_version_str).str());
+ throw Slic3r::RuntimeError((boost::format("Vendor Config Bundle `%1%` is not valid: Cannot parse config_version: `%2%`.") % id % config_version_str).str());
} else {
res.config_version = std::move(*config_version);
}
@@ -245,9 +248,9 @@ const std::string& Preset::suffix_modified()
return g_suffix_modified;
}
-void Preset::update_suffix_modified()
+void Preset::update_suffix_modified(const std::string& new_suffix_modified)
{
- g_suffix_modified = (" (" + _(L("modified")) + ")").ToUTF8().data();
+ g_suffix_modified = new_suffix_modified;
}
// Remove an optional "(modified)" suffix from a name.
// This converts a UI name to a unique preset identifier.
@@ -405,8 +408,9 @@ const std::vector<std::string>& Preset::print_options()
"extra_perimeters", "ensure_vertical_shell_thickness", "avoid_crossing_perimeters", "thin_walls", "overhangs",
"seam_position", "external_perimeters_first", "fill_density", "fill_pattern", "top_fill_pattern", "bottom_fill_pattern",
"infill_every_layers", "infill_only_where_needed", "solid_infill_every_layers", "fill_angle", "bridge_angle",
- "solid_infill_below_area", "only_retract_when_crossing_perimeters", "infill_first", "max_print_speed",
- "max_volumetric_speed",
+ "solid_infill_below_area", "only_retract_when_crossing_perimeters", "infill_first",
+ "ironing", "ironing_type", "ironing_flowrate", "ironing_speed", "ironing_spacing",
+ "max_print_speed", "max_volumetric_speed", "avoid_crossing_perimeters_max_detour",
#ifdef HAS_PRESSURE_EQUALIZER
"max_volumetric_extrusion_rate_slope_positive", "max_volumetric_extrusion_rate_slope_negative",
#endif /* HAS_PRESSURE_EQUALIZER */
@@ -423,7 +427,7 @@ const std::vector<std::string>& Preset::print_options()
"infill_extruder", "solid_infill_extruder", "support_material_extruder", "support_material_interface_extruder",
"ooze_prevention", "standby_temperature_delta", "interface_shells", "extrusion_width", "first_layer_extrusion_width",
"perimeter_extrusion_width", "external_perimeter_extrusion_width", "infill_extrusion_width", "solid_infill_extrusion_width",
- "top_infill_extrusion_width", "support_material_extrusion_width", "infill_overlap", "bridge_flow_ratio", "clip_multipart_objects",
+ "top_infill_extrusion_width", "support_material_extrusion_width", "infill_overlap", "infill_anchor", "infill_anchor_max", "bridge_flow_ratio", "clip_multipart_objects",
"elefant_foot_compensation", "xy_size_compensation", "threads", "resolution", "wipe_tower", "wipe_tower_x", "wipe_tower_y",
"wipe_tower_width", "wipe_tower_rotation_angle", "wipe_tower_bridging", "single_extruder_multi_material_priming",
"wipe_tower_no_sparse_layers", "compatible_printers", "compatible_printers_condition", "inherits"
@@ -435,11 +439,11 @@ const std::vector<std::string>& Preset::filament_options()
{
static std::vector<std::string> s_opts {
"filament_colour", "filament_diameter", "filament_type", "filament_soluble", "filament_notes", "filament_max_volumetric_speed",
- "extrusion_multiplier", "filament_density", "filament_cost", "filament_loading_speed", "filament_loading_speed_start", "filament_load_time",
+ "extrusion_multiplier", "filament_density", "filament_cost", "filament_spool_weight", "filament_loading_speed", "filament_loading_speed_start", "filament_load_time",
"filament_unloading_speed", "filament_unloading_speed_start", "filament_unload_time", "filament_toolchange_delay", "filament_cooling_moves",
"filament_cooling_initial_speed", "filament_cooling_final_speed", "filament_ramming_parameters", "filament_minimal_purge_on_wipe_tower",
"temperature", "first_layer_temperature", "bed_temperature", "first_layer_bed_temperature", "fan_always_on", "cooling", "min_fan_speed",
- "max_fan_speed", "bridge_fan_speed", "disable_fan_first_layers", "fan_below_layer_time", "slowdown_below_layer_time", "min_print_speed",
+ "max_fan_speed", "bridge_fan_speed", "disable_fan_first_layers", "full_fan_speed_layer", "fan_below_layer_time", "slowdown_below_layer_time", "min_print_speed",
"start_filament_gcode", "end_filament_gcode",
// Retract overrides
"filament_retract_length", "filament_retract_lift", "filament_retract_lift_above", "filament_retract_lift_below", "filament_retract_speed", "filament_deretract_speed", "filament_retract_restart_extra", "filament_retract_before_travel",
@@ -450,26 +454,40 @@ const std::vector<std::string>& Preset::filament_options()
return s_opts;
}
+const std::vector<std::string>& Preset::machine_limits_options()
+{
+ static std::vector<std::string> s_opts;
+ if (s_opts.empty()) {
+ s_opts = {
+ "machine_max_acceleration_extruding", "machine_max_acceleration_retracting",
+ "machine_max_acceleration_x", "machine_max_acceleration_y", "machine_max_acceleration_z", "machine_max_acceleration_e",
+ "machine_max_feedrate_x", "machine_max_feedrate_y", "machine_max_feedrate_z", "machine_max_feedrate_e",
+ "machine_min_extruding_rate", "machine_min_travel_rate",
+ "machine_max_jerk_x", "machine_max_jerk_y", "machine_max_jerk_z", "machine_max_jerk_e",
+ };
+ }
+ return s_opts;
+}
+
const std::vector<std::string>& Preset::printer_options()
{
static std::vector<std::string> s_opts;
if (s_opts.empty()) {
s_opts = {
"printer_technology",
- "bed_shape", "bed_custom_texture", "bed_custom_model", "z_offset", "gcode_flavor", "use_relative_e_distances", "serial_port", "serial_speed",
+ "bed_shape", "bed_custom_texture", "bed_custom_model", "z_offset", "gcode_flavor", "use_relative_e_distances",
"use_firmware_retraction", "use_volumetric_e", "variable_layer_height",
+ //FIXME the print host keys are left here just for conversion from the Printer preset to Physical Printer preset.
"host_type", "print_host", "printhost_apikey", "printhost_cafile",
"single_extruder_multi_material", "start_gcode", "end_gcode", "before_layer_gcode", "layer_gcode", "toolchange_gcode",
+ "color_change_gcode", "pause_print_gcode", "template_custom_gcode",
"between_objects_gcode", "printer_vendor", "printer_model", "printer_variant", "printer_notes", "cooling_tube_retraction",
"cooling_tube_length", "high_current_on_filament_swap", "parking_pos_retraction", "extra_loading_move", "max_print_height",
"default_print_profile", "inherits",
- "remaining_times", "silent_mode", "machine_max_acceleration_extruding", "machine_max_acceleration_retracting",
- "machine_max_acceleration_x", "machine_max_acceleration_y", "machine_max_acceleration_z", "machine_max_acceleration_e",
- "machine_max_feedrate_x", "machine_max_feedrate_y", "machine_max_feedrate_z", "machine_max_feedrate_e",
- "machine_min_extruding_rate", "machine_min_travel_rate",
- "machine_max_jerk_x", "machine_max_jerk_y", "machine_max_jerk_z", "machine_max_jerk_e",
- "thumbnails"
+ "remaining_times", "silent_mode",
+ "machine_limits_usage", "thumbnails"
};
+ s_opts.insert(s_opts.end(), Preset::machine_limits_options().begin(), Preset::machine_limits_options().end());
s_opts.insert(s_opts.end(), Preset::nozzle_options().begin(), Preset::nozzle_options().end());
}
return s_opts;
@@ -494,6 +512,7 @@ const std::vector<std::string>& Preset::sla_print_options()
"support_head_penetration",
"support_head_width",
"support_pillar_diameter",
+ "support_small_pillar_diameter_percent",
"support_max_bridges_on_pillar",
"support_pillar_connection_mode",
"support_buildplate_only",
@@ -577,6 +596,7 @@ const std::vector<std::string>& Preset::sla_printer_options()
"gamma_correction",
"min_exposure_time", "max_exposure_time",
"min_initial_exposure_time", "max_initial_exposure_time",
+ //FIXME the print host keys are left here just for conversion from the Printer preset to Physical Printer preset.
"print_host", "printhost_apikey", "printhost_cafile",
"printer_notes",
"inherits"
@@ -588,10 +608,7 @@ const std::vector<std::string>& Preset::sla_printer_options()
PresetCollection::PresetCollection(Preset::Type type, const std::vector<std::string> &keys, const Slic3r::StaticPrintConfig &defaults, const std::string &default_name) :
m_type(type),
m_edited_preset(type, "", false),
- m_idx_selected(0),
- m_bitmap_main_frame(new wxBitmap),
- m_bitmap_add(new wxBitmap),
- m_bitmap_cache(new GUI::BitmapCache)
+ m_idx_selected(0)
{
// Insert just the default preset.
this->add_default_preset(keys, defaults, default_name);
@@ -600,12 +617,6 @@ PresetCollection::PresetCollection(Preset::Type type, const std::vector<std::str
PresetCollection::~PresetCollection()
{
- delete m_bitmap_main_frame;
- m_bitmap_main_frame = nullptr;
- delete m_bitmap_add;
- m_bitmap_add = nullptr;
- delete m_bitmap_cache;
- m_bitmap_cache = nullptr;
}
void PresetCollection::reset(bool delete_files)
@@ -638,7 +649,9 @@ void PresetCollection::add_default_preset(const std::vector<std::string> &keys,
// Throws an exception on error.
void PresetCollection::load_presets(const std::string &dir_path, const std::string &subdir)
{
- boost::filesystem::path dir = boost::filesystem::canonical(boost::filesystem::path(dir_path) / subdir).make_preferred();
+ // Don't use boost::filesystem::canonical() on Windows, it is broken in regard to reparse points,
+ // see https://github.com/prusa3d/PrusaSlicer/issues/732
+ boost::filesystem::path dir = boost::filesystem::absolute(boost::filesystem::path(dir_path) / subdir).make_preferred();
m_dir_path = dir.string();
std::string errors_cummulative;
// Store the loaded presets into a new vector, otherwise the binary search for already existing presets would be broken.
@@ -674,9 +687,9 @@ void PresetCollection::load_presets(const std::string &dir_path, const std::stri
preset.file << "\" contains the following incorrect keys: " << incorrect_keys << ", which were removed";
preset.loaded = true;
} catch (const std::ifstream::failure &err) {
- throw std::runtime_error(std::string("The selected preset cannot be loaded: ") + preset.file + "\n\tReason: " + err.what());
+ throw Slic3r::RuntimeError(std::string("The selected preset cannot be loaded: ") + preset.file + "\n\tReason: " + err.what());
} catch (const std::runtime_error &err) {
- throw std::runtime_error(std::string("Failed loading the preset file: ") + preset.file + "\n\tReason: " + err.what());
+ throw Slic3r::RuntimeError(std::string("Failed loading the preset file: ") + preset.file + "\n\tReason: " + err.what());
}
presets_loaded.emplace_back(preset);
} catch (const std::runtime_error &err) {
@@ -688,7 +701,7 @@ void PresetCollection::load_presets(const std::string &dir_path, const std::stri
std::sort(m_presets.begin() + m_num_default_presets, m_presets.end());
this->select_preset(first_visible_idx());
if (! errors_cummulative.empty())
- throw std::runtime_error(errors_cummulative);
+ throw Slic3r::RuntimeError(errors_cummulative);
}
// Load a preset from an already parsed config file, insert it into the sorted sequence of presets
@@ -700,38 +713,6 @@ Preset& PresetCollection::load_preset(const std::string &path, const std::string
return this->load_preset(path, name, std::move(cfg), select);
}
-enum class ProfileHostParams
-{
- Same,
- Different,
- Anonymized,
-};
-
-static ProfileHostParams profile_host_params_same_or_anonymized(const DynamicPrintConfig &cfg_old, const DynamicPrintConfig &cfg_new)
-{
- auto opt_print_host_old = cfg_old.option<ConfigOptionString>("print_host");
- auto opt_printhost_apikey_old = cfg_old.option<ConfigOptionString>("printhost_apikey");
- auto opt_printhost_cafile_old = cfg_old.option<ConfigOptionString>("printhost_cafile");
-
- auto opt_print_host_new = cfg_new.option<ConfigOptionString>("print_host");
- auto opt_printhost_apikey_new = cfg_new.option<ConfigOptionString>("printhost_apikey");
- auto opt_printhost_cafile_new = cfg_new.option<ConfigOptionString>("printhost_cafile");
-
- // If the new print host data is undefined, use the old data.
- bool new_print_host_undefined = (opt_print_host_new == nullptr || opt_print_host_new ->empty()) &&
- (opt_printhost_apikey_new == nullptr || opt_printhost_apikey_new ->empty()) &&
- (opt_printhost_cafile_new == nullptr || opt_printhost_cafile_new ->empty());
- if (new_print_host_undefined)
- return ProfileHostParams::Anonymized;
-
- auto opt_same = [](const ConfigOptionString *l, const ConfigOptionString *r) {
- return ((l == nullptr || l->empty()) && (r == nullptr || r->empty())) ||
- (l != nullptr && r != nullptr && l->value == r->value);
- };
- return (opt_same(opt_print_host_old, opt_print_host_new) && opt_same(opt_printhost_apikey_old, opt_printhost_apikey_new) &&
- opt_same(opt_printhost_cafile_old, opt_printhost_cafile_new)) ? ProfileHostParams::Same : ProfileHostParams::Different;
-}
-
static bool profile_print_params_same(const DynamicPrintConfig &cfg_old, const DynamicPrintConfig &cfg_new)
{
t_config_option_keys diff = cfg_old.diff(cfg_new);
@@ -741,67 +722,87 @@ static bool profile_print_params_same(const DynamicPrintConfig &cfg_old, const D
"compatible_printers", "compatible_printers_condition", "inherits",
"print_settings_id", "filament_settings_id", "sla_print_settings_id", "sla_material_settings_id", "printer_settings_id",
"printer_model", "printer_variant", "default_print_profile", "default_filament_profile", "default_sla_print_profile", "default_sla_material_profile",
+ //FIXME remove the print host keys?
"print_host", "printhost_apikey", "printhost_cafile" })
diff.erase(std::remove(diff.begin(), diff.end(), key), diff.end());
// Preset with the same name as stored inside the config exists.
- return diff.empty() && profile_host_params_same_or_anonymized(cfg_old, cfg_new) != ProfileHostParams::Different;
+ return diff.empty();
}
// Load a preset from an already parsed config file, insert it into the sorted sequence of presets
// and select it, losing previous modifications.
-// In case
-Preset& PresetCollection::load_external_preset(
+// Only a single profile could be edited at at the same time, which introduces complexity when loading
+// filament profiles for multi-extruder printers.
+std::pair<Preset*, bool> PresetCollection::load_external_preset(
// Path to the profile source file (a G-code, an AMF or 3MF file, a config file)
const std::string &path,
// Name of the profile, derived from the source file name.
const std::string &name,
// Original name of the profile, extracted from the loaded config. Empty, if the name has not been stored.
const std::string &original_name,
- // Config to initialize the preset from.
- const DynamicPrintConfig &config,
+ // Config to initialize the preset from. It may contain configs of all presets merged in a single dictionary!
+ const DynamicPrintConfig &combined_config,
// Select the preset after loading?
- bool select)
+ LoadAndSelect select)
{
// Load the preset over a default preset, so that the missing fields are filled in from the default preset.
- DynamicPrintConfig cfg(this->default_preset_for(config).config);
- cfg.apply_only(config, cfg.keys(), true);
+ DynamicPrintConfig cfg(this->default_preset_for(combined_config).config);
+ const auto &keys = cfg.keys();
+ cfg.apply_only(combined_config, keys, true);
+ std::string &inherits = Preset::inherits(cfg);
+ if (select == LoadAndSelect::Never) {
+ // Some filament profile has been selected and modified already.
+ // Check whether this profile is equal to the modified edited profile.
+ const Preset &edited = this->get_edited_preset();
+ if ((edited.name == original_name || edited.name == inherits) && profile_print_params_same(edited.config, cfg))
+ // Just point to that already selected and edited profile.
+ return std::make_pair(&(*this->find_preset_internal(edited.name)), false);
+ }
// Is there a preset already loaded with the name stored inside the config?
- std::deque<Preset>::iterator it = this->find_preset_internal(original_name);
- bool found = it != m_presets.end() && it->name == original_name;
+ std::deque<Preset>::iterator it = this->find_preset_internal(original_name);
+ bool found = it != m_presets.end() && it->name == original_name;
if (! found) {
// Try to match the original_name against the "renamed_from" profile names of loaded system profiles.
it = this->find_preset_renamed(original_name);
found = it != m_presets.end();
}
- if (found) {
- if (profile_print_params_same(it->config, cfg)) {
- // The preset exists and it matches the values stored inside config.
- if (select)
- this->select_preset(it - m_presets.begin());
- return *it;
- }
- if (profile_host_params_same_or_anonymized(it->config, cfg) == ProfileHostParams::Anonymized) {
- // The project being loaded is anonymized. Replace the empty host keys of the loaded profile with the data from the original profile.
- // See "Octoprint Settings when Opening a .3MF file" GH issue #3244
- auto opt_update = [it, &cfg](const std::string &opt_key) {
- auto opt = it->config.option<ConfigOptionString>(opt_key);
- if (opt != nullptr)
- cfg.set_key_value(opt_key, opt->clone());
- };
- opt_update("print_host");
- opt_update("printhost_apikey");
- opt_update("printhost_cafile");
- }
+ if (found && profile_print_params_same(it->config, cfg)) {
+ // The preset exists and it matches the values stored inside config.
+ if (select == LoadAndSelect::Always)
+ this->select_preset(it - m_presets.begin());
+ return std::make_pair(&(*it), false);
+ }
+ if (! found && select != LoadAndSelect::Never && ! inherits.empty()) {
+ // Try to use a system profile as a base to select the system profile
+ // and override its settings with the loaded ones.
+ assert(it == m_presets.end());
+ it = this->find_preset_internal(inherits);
+ found = it != m_presets.end() && it->name == inherits;
+ if (found && profile_print_params_same(it->config, cfg)) {
+ // The system preset exists and it matches the values stored inside config.
+ if (select == LoadAndSelect::Always)
+ this->select_preset(it - m_presets.begin());
+ return std::make_pair(&(*it), false);
+ }
}
- // Update the "inherits" field.
- std::string &inherits = Preset::inherits(cfg);
- if (found && inherits.empty()) {
- // There is a profile with the same name already loaded. Should we update the "inherits" field?
- if (it->vendor == nullptr)
- inherits = it->inherits();
- else
- inherits = it->name;
+ if (found) {
+ if (select != LoadAndSelect::Never) {
+ // Select the existing preset and override it with new values, so that
+ // the differences will be shown in the preset editor against the referenced profile.
+ this->select_preset(it - m_presets.begin());
+ // The source config may contain keys from many possible preset types. Just copy those that relate to this preset.
+ this->get_edited_preset().config.apply_only(combined_config, keys, true);
+ this->update_dirty();
+ assert(this->get_edited_preset().is_dirty);
+ return std::make_pair(&(*it), this->get_edited_preset().is_dirty);
+ }
+ if (inherits.empty()) {
+ // Update the "inherits" field.
+ // There is a profile with the same name already loaded. Should we update the "inherits" field?
+ inherits = it->vendor ? it->name : it->inherits();
+ }
}
+
// The external preset does not match an internal preset, load the external preset.
std::string new_name;
for (size_t idx = 0;; ++ idx) {
@@ -822,19 +823,19 @@ Preset& PresetCollection::load_external_preset(
break;
if (profile_print_params_same(it->config, cfg)) {
// The preset exists and it matches the values stored inside config.
- if (select)
+ if (select == LoadAndSelect::Always)
this->select_preset(it - m_presets.begin());
- return *it;
+ return std::make_pair(&(*it), false);
}
// Form another profile name.
}
// Insert a new profile.
- Preset &preset = this->load_preset(path, new_name, std::move(cfg), select);
+ Preset &preset = this->load_preset(path, new_name, std::move(cfg), select == LoadAndSelect::Always);
preset.is_external = true;
if (&this->get_selected_preset() == &preset)
this->get_edited_preset().is_external = true;
- return preset;
+ return std::make_pair(&preset, false);
}
Preset& PresetCollection::load_preset(const std::string &path, const std::string &name, DynamicPrintConfig &&config, bool select)
@@ -949,19 +950,9 @@ bool PresetCollection::delete_preset(const std::string& name)
return true;
}
-void PresetCollection::load_bitmap_default(const std::string &file_name)
-{
- *m_bitmap_main_frame = create_scaled_bitmap(file_name);
-}
-
-void PresetCollection::load_bitmap_add(const std::string &file_name)
-{
- *m_bitmap_add = create_scaled_bitmap(file_name);
-}
-
const Preset* PresetCollection::get_selected_preset_parent() const
{
- if (this->get_selected_idx() == -1)
+ if (this->get_selected_idx() == size_t(-1))
// This preset collection has no preset activated yet. Only the get_edited_preset() is valid.
return nullptr;
@@ -1000,7 +991,15 @@ const Preset* PresetCollection::get_preset_parent(const Preset& child) const
if (it != m_presets.end())
preset = &(*it);
}
- return (preset == nullptr/* || preset->is_default */|| preset->is_external) ? nullptr : preset;
+ return
+ // not found
+ (preset == nullptr/* || preset->is_default */||
+ // this should not happen, user profile should not derive from an external profile
+ preset->is_external ||
+ // this should not happen, however people are creative, see GH #4996
+ preset == &child) ?
+ nullptr :
+ preset;
}
// Return vendor of the first parent profile, for which the vendor is defined, or null if such profile does not exist.
@@ -1027,7 +1026,7 @@ const std::string& PresetCollection::get_preset_name_by_alias(const std::string&
it != m_map_alias_to_profile_name.end() && it->first == alias; ++ it)
if (auto it_preset = this->find_preset_internal(it->second);
it_preset != m_presets.end() && it_preset->name == it->second &&
- it_preset->is_visible && (it_preset->is_compatible || (it_preset - m_presets.begin()) == m_idx_selected))
+ it_preset->is_visible && (it_preset->is_compatible || size_t(it_preset - m_presets.begin()) == m_idx_selected))
return it_preset->name;
return alias;
}
@@ -1089,6 +1088,7 @@ size_t PresetCollection::update_compatible_internal(const PresetWithVendorProfil
bool selected = idx_preset == m_idx_selected;
Preset &preset_selected = m_presets[idx_preset];
Preset &preset_edited = selected ? m_edited_preset : preset_selected;
+
const PresetWithVendorProfile this_preset_with_vendor_profile = this->get_preset_with_vendor_profile(preset_edited);
bool was_compatible = preset_edited.is_compatible;
preset_edited.is_compatible = is_compatible_with_printer(this_preset_with_vendor_profile, active_printer, &config);
@@ -1097,7 +1097,7 @@ size_t PresetCollection::update_compatible_internal(const PresetWithVendorProfil
preset_edited.is_compatible &= is_compatible_with_print(this_preset_with_vendor_profile, *active_print, active_printer);
if (! preset_edited.is_compatible && selected &&
(unselect_if_incompatible == PresetSelectCompatibleType::Always || (unselect_if_incompatible == PresetSelectCompatibleType::OnlyIfWasCompatible && was_compatible)))
- m_idx_selected = -1;
+ m_idx_selected = size_t(-1);
if (selected)
preset_selected.is_compatible = preset_edited.is_compatible;
}
@@ -1116,279 +1116,15 @@ size_t PresetCollection::update_compatible_internal(const PresetWithVendorProfil
// Delete the current preset, activate the first visible preset.
//void PresetCollection::delete_current_preset();
-// Update the wxChoice UI component from this list of presets.
-// Hide the
-void PresetCollection::update_plater_ui(GUI::PresetComboBox *ui)
-{
- if (ui == nullptr)
- return;
-
- // Otherwise fill in the list from scratch.
- ui->Freeze();
- ui->Clear();
- size_t selected_preset_item = INT_MAX; // some value meaning that no one item is selected
-
- const Preset &selected_preset = this->get_selected_preset();
- // Show wide icons if the currently selected preset is not compatible with the current printer,
- // and draw a red flag in front of the selected preset.
- bool wide_icons = ! selected_preset.is_compatible && m_bitmap_incompatible != nullptr;
-
- /* It's supposed that standard size of an icon is 16px*16px for 100% scaled display.
- * So set sizes for solid_colored icons used for filament preset
- * and scale them in respect to em_unit value
- */
- const float scale_f = ui->em_unit() * 0.1f;
- const int icon_height = 16 * scale_f + 0.5f;
- const int icon_width = 16 * scale_f + 0.5f;
- const int thin_space_icon_width = 4 * scale_f + 0.5f;
- const int wide_space_icon_width = 6 * scale_f + 0.5f;
-
- std::map<wxString, wxBitmap*> nonsys_presets;
- wxString selected = "";
- wxString tooltip = "";
- if (!this->m_presets.front().is_visible)
- ui->set_label_marker(ui->Append(PresetCollection::separator(L("System presets")), wxNullBitmap));
- for (size_t i = this->m_presets.front().is_visible ? 0 : m_num_default_presets; i < this->m_presets.size(); ++ i) {
- const Preset &preset = this->m_presets[i];
- if (! preset.is_visible || (! preset.is_compatible && i != m_idx_selected))
- continue;
-
- std::string bitmap_key = "";
- // !!! Temporary solution, till refactoring: create and use "sla_printer" icon instead of m_bitmap_main_frame
- wxBitmap main_bmp = m_bitmap_main_frame ? *m_bitmap_main_frame : wxNullBitmap;
- if (m_type == Preset::TYPE_PRINTER && preset.printer_technology()==ptSLA ) {
- bitmap_key = "sla_printer";
- main_bmp = create_scaled_bitmap("sla_printer");
- }
-
- // If the filament preset is not compatible and there is a "red flag" icon loaded, show it left
- // to the filament color image.
- if (wide_icons)
- bitmap_key += preset.is_compatible ? ",cmpt" : ",ncmpt";
- bitmap_key += (preset.is_system || preset.is_default) ? ",syst" : ",nsyst";
- wxBitmap *bmp = m_bitmap_cache->find(bitmap_key);
- if (bmp == nullptr) {
- // Create the bitmap with color bars.
- std::vector<wxBitmap> bmps;
- if (wide_icons)
- // Paint a red flag for incompatible presets.
- bmps.emplace_back(preset.is_compatible ? m_bitmap_cache->mkclear(icon_width, icon_height) : *m_bitmap_incompatible);
- // Paint the color bars.
- bmps.emplace_back(m_bitmap_cache->mkclear(thin_space_icon_width, icon_height));
- bmps.emplace_back(main_bmp);
- // Paint a lock at the system presets.
- bmps.emplace_back(m_bitmap_cache->mkclear(wide_space_icon_width, icon_height));
- bmps.emplace_back((preset.is_system || preset.is_default) ? *m_bitmap_lock : m_bitmap_cache->mkclear(icon_width, icon_height));
- bmp = m_bitmap_cache->insert(bitmap_key, bmps);
- }
-
- const std::string name = preset.alias.empty() ? preset.name : preset.alias;
- if (preset.is_default || preset.is_system) {
- ui->Append(wxString::FromUTF8((/*preset.*/name + (preset.is_dirty ? g_suffix_modified : "")).c_str()),
- (bmp == 0) ? main_bmp : *bmp);
- if (i == m_idx_selected ||
- // just in case: mark selected_preset_item as a first added element
- selected_preset_item == INT_MAX) {
- selected_preset_item = ui->GetCount() - 1;
- tooltip = wxString::FromUTF8(preset.name.c_str());
- }
- }
- else
- {
- nonsys_presets.emplace(wxString::FromUTF8((/*preset.*/name + (preset.is_dirty ? g_suffix_modified : "")).c_str()), bmp/*preset.is_compatible*/);
- if (i == m_idx_selected) {
- selected = wxString::FromUTF8((/*preset.*/name + (preset.is_dirty ? g_suffix_modified : "")).c_str());
- tooltip = wxString::FromUTF8(preset.name.c_str());
- }
- }
- if (i + 1 == m_num_default_presets)
- ui->set_label_marker(ui->Append(PresetCollection::separator(L("System presets")), wxNullBitmap));
- }
- if (!nonsys_presets.empty())
- {
- ui->set_label_marker(ui->Append(PresetCollection::separator(L("User presets")), wxNullBitmap));
- for (std::map<wxString, wxBitmap*>::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) {
- ui->Append(it->first, *it->second);
- if (it->first == selected ||
- // just in case: mark selected_preset_item as a first added element
- selected_preset_item == INT_MAX)
- selected_preset_item = ui->GetCount() - 1;
- }
- }
- if (m_type == Preset::TYPE_PRINTER || m_type == Preset::TYPE_SLA_MATERIAL) {
- std::string bitmap_key = "";
- // If the filament preset is not compatible and there is a "red flag" icon loaded, show it left
- // to the filament color image.
- if (wide_icons)
- bitmap_key += "wide,";
- bitmap_key += "edit_preset_list";
- wxBitmap *bmp = m_bitmap_cache->find(bitmap_key);
- if (bmp == nullptr) {
- // Create the bitmap with color bars.
- std::vector<wxBitmap> bmps;
- if (wide_icons)
- // Paint a red flag for incompatible presets.
- bmps.emplace_back(m_bitmap_cache->mkclear(icon_width, icon_height));
- // Paint the color bars.
- bmps.emplace_back(m_bitmap_cache->mkclear(thin_space_icon_width, icon_height));
- bmps.emplace_back(*m_bitmap_main_frame);
- // Paint a lock at the system presets.
- bmps.emplace_back(m_bitmap_cache->mkclear(wide_space_icon_width, icon_height));
-// bmps.emplace_back(m_bitmap_add ? *m_bitmap_add : wxNullBitmap);
- bmps.emplace_back(create_scaled_bitmap("edit_uni"));
- bmp = m_bitmap_cache->insert(bitmap_key, bmps);
- }
- if (m_type == Preset::TYPE_SLA_MATERIAL)
- ui->set_label_marker(ui->Append(PresetCollection::separator(L("Add/Remove materials")), *bmp), GUI::PresetComboBox::LABEL_ITEM_WIZARD_MATERIALS);
- else
- ui->set_label_marker(ui->Append(PresetCollection::separator(L("Add/Remove printers")), *bmp), GUI::PresetComboBox::LABEL_ITEM_WIZARD_PRINTERS);
- }
-
- /* But, if selected_preset_item is still equal to INT_MAX, it means that
- * there is no presets added to the list.
- * So, select last combobox item ("Add/Remove preset")
- */
- if (selected_preset_item == INT_MAX)
- selected_preset_item = ui->GetCount() - 1;
-
- ui->SetSelection(selected_preset_item);
- ui->SetToolTip(tooltip.IsEmpty() ? ui->GetString(selected_preset_item) : tooltip);
- ui->check_selection();
- ui->Thaw();
-
- // Update control min size after rescale (changed Display DPI under MSW)
- if (ui->GetMinWidth() != 20 * ui->em_unit())
- ui->SetMinSize(wxSize(20 * ui->em_unit(), ui->GetSize().GetHeight()));
-}
-
-size_t PresetCollection::update_tab_ui(wxBitmapComboBox *ui, bool show_incompatible, const int em/* = 10*/)
-{
- if (ui == nullptr)
- return 0;
- ui->Freeze();
- ui->Clear();
- size_t selected_preset_item = INT_MAX; // some value meaning that no one item is selected
-
- /* It's supposed that standard size of an icon is 16px*16px for 100% scaled display.
- * So set sizes for solid_colored(empty) icons used for preset
- * and scale them in respect to em_unit value
- */
- const float scale_f = em * 0.1f;
- const int icon_height = 16 * scale_f + 0.5f;
- const int icon_width = 16 * scale_f + 0.5f;
-
- std::map<wxString, wxBitmap*> nonsys_presets;
- wxString selected = "";
- if (!this->m_presets.front().is_visible)
- ui->Append(PresetCollection::separator(L("System presets")), wxNullBitmap);
- for (size_t i = this->m_presets.front().is_visible ? 0 : m_num_default_presets; i < this->m_presets.size(); ++i) {
- const Preset &preset = this->m_presets[i];
- if (! preset.is_visible || (! show_incompatible && ! preset.is_compatible && i != m_idx_selected))
- continue;
- std::string bitmap_key = "tab";
-
- // !!! Temporary solution, till refactoring: create and use "sla_printer" icon instead of m_bitmap_main_frame
- wxBitmap main_bmp = m_bitmap_main_frame ? *m_bitmap_main_frame : wxNullBitmap;
- if (m_type == Preset::TYPE_PRINTER && preset.printer_technology() == ptSLA) {
- bitmap_key = "sla_printer";
- main_bmp = create_scaled_bitmap("sla_printer");
- }
-
- bitmap_key += preset.is_compatible ? ",cmpt" : ",ncmpt";
- bitmap_key += (preset.is_system || preset.is_default) ? ",syst" : ",nsyst";
- wxBitmap *bmp = m_bitmap_cache->find(bitmap_key);
- if (bmp == nullptr) {
- // Create the bitmap with color bars.
- std::vector<wxBitmap> bmps;
- const wxBitmap* tmp_bmp = preset.is_compatible ? m_bitmap_compatible : m_bitmap_incompatible;
- bmps.emplace_back((tmp_bmp == 0) ? main_bmp : *tmp_bmp);
- // Paint a lock at the system presets.
- bmps.emplace_back((preset.is_system || preset.is_default) ? *m_bitmap_lock : m_bitmap_cache->mkclear(icon_width, icon_height));
- bmp = m_bitmap_cache->insert(bitmap_key, bmps);
- }
-
- if (preset.is_default || preset.is_system) {
- ui->Append(wxString::FromUTF8((preset.name + (preset.is_dirty ? g_suffix_modified : "")).c_str()),
- (bmp == 0) ? main_bmp : *bmp);
- if (i == m_idx_selected ||
- // just in case: mark selected_preset_item as a first added element
- selected_preset_item == INT_MAX)
- selected_preset_item = ui->GetCount() - 1;
- }
- else
- {
- nonsys_presets.emplace(wxString::FromUTF8((preset.name + (preset.is_dirty ? g_suffix_modified : "")).c_str()), bmp/*preset.is_compatible*/);
- if (i == m_idx_selected)
- selected = wxString::FromUTF8((preset.name + (preset.is_dirty ? g_suffix_modified : "")).c_str());
- }
- if (i + 1 == m_num_default_presets)
- ui->Append(PresetCollection::separator(L("System presets")), wxNullBitmap);
- }
- if (!nonsys_presets.empty())
- {
- ui->Append(PresetCollection::separator(L("User presets")), wxNullBitmap);
- for (std::map<wxString, wxBitmap*>::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) {
- ui->Append(it->first, *it->second);
- if (it->first == selected ||
- // just in case: mark selected_preset_item as a first added element
- selected_preset_item == INT_MAX)
- selected_preset_item = ui->GetCount() - 1;
- }
- }
- if (m_type == Preset::TYPE_PRINTER) {
- wxBitmap *bmp = m_bitmap_cache->find("edit_printer_list");
- if (bmp == nullptr) {
- // Create the bitmap with color bars.
- std::vector<wxBitmap> bmps;
- bmps.emplace_back(*m_bitmap_main_frame);
-// bmps.emplace_back(m_bitmap_add ? *m_bitmap_add : wxNullBitmap);
- bmps.emplace_back(create_scaled_bitmap("edit_uni"));
- bmp = m_bitmap_cache->insert("add_printer_tab", bmps);
- }
- ui->Append(PresetCollection::separator("Add a new printer"), *bmp);
- }
-
- /* But, if selected_preset_item is still equal to INT_MAX, it means that
- * there is no presets added to the list.
- * So, select last combobox item ("Add/Remove preset")
- */
- if (selected_preset_item == INT_MAX)
- selected_preset_item = ui->GetCount() - 1;
-
- ui->SetSelection(selected_preset_item);
- ui->SetToolTip(ui->GetString(selected_preset_item));
- ui->Thaw();
- return selected_preset_item;
-}
-
-// Update a dirty floag of the current preset, update the labels of the UI component accordingly.
+// Update a dirty flag of the current preset
// Return true if the dirty flag changed.
-bool PresetCollection::update_dirty_ui(wxBitmapComboBox *ui)
+bool PresetCollection::update_dirty()
{
- wxWindowUpdateLocker noUpdates(ui);
- // 1) Update the dirty flag of the current preset.
bool was_dirty = this->get_selected_preset().is_dirty;
bool is_dirty = current_is_dirty();
this->get_selected_preset().is_dirty = is_dirty;
this->get_edited_preset().is_dirty = is_dirty;
- // 2) Update the labels.
- for (unsigned int ui_id = 0; ui_id < ui->GetCount(); ++ ui_id) {
- std::string old_label = ui->GetString(ui_id).utf8_str().data();
- std::string preset_name = Preset::remove_suffix_modified(old_label);
- const Preset *preset = this->find_preset(preset_name, false);
-// The old_label could be the "----- system presets ------" or the "------- user presets --------" separator.
-// assert(preset != nullptr);
- if (preset != nullptr) {
- std::string new_label = preset->is_dirty ? preset->name + g_suffix_modified : preset->name;
- if (old_label != new_label)
- ui->SetString(ui_id, wxString::FromUTF8(new_label.c_str()));
- }
- }
-#ifdef __APPLE__
- // wxWidgets on OSX do not upload the text of the combo box line automatically.
- // Force it to update by re-selecting.
- ui->SetSelection(ui->GetSelection());
-#endif /* __APPLE __ */
+
return was_dirty != is_dirty;
}
@@ -1398,7 +1134,7 @@ void add_correct_opts_to_diff(const std::string &opt_key, t_config_option_keys&
const T* opt_init = static_cast<const T*>(other.option(opt_key));
const T* opt_cur = static_cast<const T*>(this_c.option(opt_key));
int opt_init_max_id = opt_init->values.size() - 1;
- for (int i = 0; i < opt_cur->values.size(); i++)
+ for (int i = 0; i < int(opt_cur->values.size()); i++)
{
int init_id = i <= opt_init_max_id ? i : 0;
if (opt_cur->values[i] != opt_init->values[init_id])
@@ -1416,18 +1152,22 @@ inline t_config_option_keys deep_diff(const ConfigBase &config_this, const Confi
if (this_opt != nullptr && other_opt != nullptr && *this_opt != *other_opt)
{
if (opt_key == "bed_shape" || opt_key == "thumbnails" || opt_key == "compatible_prints" || opt_key == "compatible_printers") {
+ // Scalar variable, or a vector variable, which is independent from number of extruders,
+ // thus the vector is presented to the user as a single input.
diff.emplace_back(opt_key);
- continue;
- }
- switch (other_opt->type())
- {
- case coInts: add_correct_opts_to_diff<ConfigOptionInts >(opt_key, diff, config_other, config_this); break;
- case coBools: add_correct_opts_to_diff<ConfigOptionBools >(opt_key, diff, config_other, config_this); break;
- case coFloats: add_correct_opts_to_diff<ConfigOptionFloats >(opt_key, diff, config_other, config_this); break;
- case coStrings: add_correct_opts_to_diff<ConfigOptionStrings >(opt_key, diff, config_other, config_this); break;
- case coPercents:add_correct_opts_to_diff<ConfigOptionPercents >(opt_key, diff, config_other, config_this); break;
- case coPoints: add_correct_opts_to_diff<ConfigOptionPoints >(opt_key, diff, config_other, config_this); break;
- default: diff.emplace_back(opt_key); break;
+ } else if (opt_key == "default_filament_profile") {
+ // Ignore this field, it is not presented to the user, therefore showing a "modified" flag for this parameter does not help.
+ // Also the length of this field may differ, which may lead to a crash if the block below is used.
+ } else {
+ switch (other_opt->type()) {
+ case coInts: add_correct_opts_to_diff<ConfigOptionInts >(opt_key, diff, config_other, config_this); break;
+ case coBools: add_correct_opts_to_diff<ConfigOptionBools >(opt_key, diff, config_other, config_this); break;
+ case coFloats: add_correct_opts_to_diff<ConfigOptionFloats >(opt_key, diff, config_other, config_this); break;
+ case coStrings: add_correct_opts_to_diff<ConfigOptionStrings >(opt_key, diff, config_other, config_this); break;
+ case coPercents:add_correct_opts_to_diff<ConfigOptionPercents >(opt_key, diff, config_other, config_this); break;
+ case coPoints: add_correct_opts_to_diff<ConfigOptionPoints >(opt_key, diff, config_other, config_this); break;
+ default: diff.emplace_back(opt_key); break;
+ }
}
}
}
@@ -1580,6 +1320,8 @@ std::string PresetCollection::section_name() const
}
}
+// Used for validating the "inherits" flag when importing user's config bundles.
+// Returns names of all system presets including the former names of these presets.
std::vector<std::string> PresetCollection::system_preset_names() const
{
size_t num = 0;
@@ -1589,8 +1331,10 @@ std::vector<std::string> PresetCollection::system_preset_names() const
std::vector<std::string> out;
out.reserve(num);
for (const Preset &preset : m_presets)
- if (preset.is_system)
+ if (preset.is_system) {
out.emplace_back(preset.name);
+ out.insert(out.end(), preset.renamed_from.begin(), preset.renamed_from.end());
+ }
std::sort(out.begin(), out.end());
return out;
}
@@ -1602,16 +1346,6 @@ std::string PresetCollection::path_from_name(const std::string &new_name) const
return (boost::filesystem::path(m_dir_path) / file_name).make_preferred().string();
}
-void PresetCollection::clear_bitmap_cache()
-{
- m_bitmap_cache->clear();
-}
-
-wxString PresetCollection::separator(const std::string &label)
-{
- return wxString::FromUTF8(PresetCollection::separator_head()) + _(label) + wxString::FromUTF8(PresetCollection::separator_tail());
-}
-
const Preset& PrinterPresetCollection::default_preset_for(const DynamicPrintConfig &config) const
{
const ConfigOptionEnumGeneric *opt_printer_technology = config.opt<ConfigOptionEnumGeneric>("printer_technology");
@@ -1629,6 +1363,526 @@ const Preset* PrinterPresetCollection::find_by_model_id(const std::string &model
return it != cend() ? &*it : nullptr;
}
+// -------------------------
+// *** PhysicalPrinter ***
+// -------------------------
+
+std::string PhysicalPrinter::separator()
+{
+ return " * ";
+}
+
+const std::vector<std::string>& PhysicalPrinter::printer_options()
+{
+ static std::vector<std::string> s_opts;
+ if (s_opts.empty()) {
+ s_opts = {
+ "preset_name",
+ "printer_technology",
+// "printer_model",
+ "host_type",
+ "print_host",
+ "printhost_apikey",
+ "printhost_cafile",
+ "printhost_port",
+ "printhost_authorization_type",
+ // HTTP digest authentization (RFC 2617)
+ "printhost_user",
+ "printhost_password"
+ };
+ }
+ return s_opts;
+}
+
+static constexpr auto legacy_print_host_options = {
+ "print_host",
+ "printhost_apikey",
+ "printhost_cafile",
+};
+
+std::vector<std::string> PhysicalPrinter::presets_with_print_host_information(const PrinterPresetCollection& printer_presets)
+{
+ std::vector<std::string> presets;
+ for (const Preset& preset : printer_presets)
+ if (has_print_host_information(preset.config))
+ presets.emplace_back(preset.name);
+
+ return presets;
+}
+
+bool PhysicalPrinter::has_print_host_information(const DynamicPrintConfig& config)
+{
+ for (const char *opt : legacy_print_host_options)
+ if (!config.opt_string(opt).empty())
+ return true;
+
+ return false;
+}
+
+const std::set<std::string>& PhysicalPrinter::get_preset_names() const
+{
+ return preset_names;
+}
+
+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();
+}
+
+void PhysicalPrinter::update_preset_names_in_config()
+{
+ if (!preset_names.empty()) {
+ std::string name;
+ for (auto el : preset_names)
+ name += el + ";";
+ name.pop_back();
+ config.set_key_value("preset_name", new ConfigOptionString(name));
+ }
+}
+
+void PhysicalPrinter::save(const std::string& file_name_from, const std::string& file_name_to)
+{
+ // rename the file
+ boost::nowide::rename(file_name_from.data(), file_name_to.data());
+ this->file = file_name_to;
+ // save configuration
+ this->config.save(this->file);
+}
+
+void PhysicalPrinter::update_from_preset(const Preset& preset)
+{
+ config.apply_only(preset.config, printer_options(), true);
+ // add preset names to the options list
+ preset_names.emplace(preset.name);
+ update_preset_names_in_config();
+}
+
+void PhysicalPrinter::update_from_config(const DynamicPrintConfig& new_config)
+{
+ config.apply_only(new_config, printer_options(), false);
+
+ std::string str = config.opt_string("preset_name");
+ std::set<std::string> values{};
+ if (!str.empty()) {
+ boost::split(values, str, boost::is_any_of(";"));
+ for (const std::string& val : values)
+ preset_names.emplace(val);
+ }
+ preset_names = values;
+}
+
+void PhysicalPrinter::reset_presets()
+{
+ return preset_names.clear();
+}
+
+bool PhysicalPrinter::add_preset(const std::string& preset_name)
+{
+ return preset_names.emplace(preset_name).second;
+}
+
+bool PhysicalPrinter::delete_preset(const std::string& preset_name)
+{
+ return preset_names.erase(preset_name) > 0;
+}
+
+PhysicalPrinter::PhysicalPrinter(const std::string& name, const DynamicPrintConfig& default_config) :
+ name(name), config(default_config)
+{
+ update_from_config(config);
+}
+
+PhysicalPrinter::PhysicalPrinter(const std::string& name, const DynamicPrintConfig &default_config, const Preset& preset) :
+ name(name), config(default_config)
+{
+ update_from_preset(preset);
+}
+
+void PhysicalPrinter::set_name(const std::string& name)
+{
+ this->name = name;
+}
+
+std::string PhysicalPrinter::get_full_name(std::string preset_name) const
+{
+ return name + separator() + preset_name;
+}
+
+std::string PhysicalPrinter::get_short_name(std::string full_name)
+{
+ int pos = full_name.find(separator());
+ if (pos > 0)
+ boost::erase_tail(full_name, full_name.length() - pos);
+ return full_name;
+}
+
+std::string PhysicalPrinter::get_preset_name(std::string name)
+{
+ int pos = name.find(separator());
+ boost::erase_head(name, pos + 3);
+ return Preset::remove_suffix_modified(name);
+}
+
+
+// -----------------------------------
+// *** PhysicalPrinterCollection ***
+// -----------------------------------
+
+PhysicalPrinterCollection::PhysicalPrinterCollection( const std::vector<std::string>& keys)
+{
+ // Default config for a physical printer containing all key/value pairs of PhysicalPrinter::printer_options().
+ for (const std::string &key : keys) {
+ const ConfigOptionDef *opt = print_config_def.get(key);
+ assert(opt);
+ assert(opt->default_value);
+ m_default_config.set_key_value(key, opt->default_value->clone());
+ }
+}
+
+// Load all printers found in dir_path.
+// Throws an exception on error.
+void PhysicalPrinterCollection::load_printers(const std::string& dir_path, const std::string& subdir)
+{
+ // Don't use boost::filesystem::canonical() on Windows, it is broken in regard to reparse points,
+ // see https://github.com/prusa3d/PrusaSlicer/issues/732
+ boost::filesystem::path dir = boost::filesystem::absolute(boost::filesystem::path(dir_path) / subdir).make_preferred();
+ m_dir_path = dir.string();
+ std::string errors_cummulative;
+ // Store the loaded printers into a new vector, otherwise the binary search for already existing presets would be broken.
+ std::deque<PhysicalPrinter> printers_loaded;
+ for (auto& dir_entry : boost::filesystem::directory_iterator(dir))
+ if (Slic3r::is_ini_file(dir_entry)) {
+ std::string name = dir_entry.path().filename().string();
+ // Remove the .ini suffix.
+ name.erase(name.size() - 4);
+ if (this->find_printer(name, false)) {
+ // This happens when there's is a preset (most likely legacy one) with the same name as a system preset
+ // that's already been loaded from a bundle.
+ BOOST_LOG_TRIVIAL(warning) << "Printer already present, not loading: " << name;
+ continue;
+ }
+ try {
+ PhysicalPrinter printer(name, this->default_config());
+ printer.file = dir_entry.path().string();
+ // Load the preset file, apply preset values on top of defaults.
+ try {
+ DynamicPrintConfig config;
+ config.load_from_ini(printer.file);
+ printer.update_from_config(config);
+ printer.loaded = true;
+ }
+ catch (const std::ifstream::failure& err) {
+ throw Slic3r::RuntimeError(std::string("The selected preset cannot be loaded: ") + printer.file + "\n\tReason: " + err.what());
+ }
+ catch (const std::runtime_error& err) {
+ throw Slic3r::RuntimeError(std::string("Failed loading the preset file: ") + printer.file + "\n\tReason: " + err.what());
+ }
+ printers_loaded.emplace_back(printer);
+ }
+ catch (const std::runtime_error& err) {
+ errors_cummulative += err.what();
+ errors_cummulative += "\n";
+ }
+ }
+ m_printers.insert(m_printers.end(), std::make_move_iterator(printers_loaded.begin()), std::make_move_iterator(printers_loaded.end()));
+ std::sort(m_printers.begin(), m_printers.end());
+ if (!errors_cummulative.empty())
+ throw Slic3r::RuntimeError(errors_cummulative);
+}
+
+void PhysicalPrinterCollection::load_printer(const std::string& path, const std::string& name, DynamicPrintConfig&& config, bool select, bool save/* = false*/)
+{
+ auto it = this->find_printer_internal(name);
+ if (it == m_printers.end() || it->name != name) {
+ // The preset was not found. Create a new preset.
+ it = m_printers.emplace(it, PhysicalPrinter(name, config));
+ }
+
+ it->file = path;
+ it->config = std::move(config);
+ it->loaded = true;
+ if (select)
+ this->select_printer(*it);
+
+ if (save)
+ it->save();
+}
+
+// if there is saved user presets, contains information about "Print Host upload",
+// Create default printers with this presets
+// Note! "Print Host upload" options will be cleared after physical printer creations
+void PhysicalPrinterCollection::load_printers_from_presets(PrinterPresetCollection& printer_presets)
+{
+ int cnt=0;
+ for (Preset& preset: printer_presets) {
+ DynamicPrintConfig& config = preset.config;
+ 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);
+ if (existed_printer)
+ // just add preset for this printer
+ existed_printer->add_preset(preset.name);
+ else {
+ std::string new_printer_name = (boost::format("Printer %1%") % ++cnt ).str();
+ while (find_printer(new_printer_name))
+ new_printer_name = (boost::format("Printer %1%") % ++cnt).str();
+
+ // create new printer from this preset
+ PhysicalPrinter printer(new_printer_name, this->default_config(), preset);
+ printer.loaded = true;
+ save_printer(printer);
+ }
+
+ // erase "Print Host upload" information from the preset
+ for (const char *opt : legacy_print_host_options)
+ config.opt_string(opt).clear();
+ // save changes for preset
+ preset.save();
+
+ // 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 char *opt : legacy_print_host_options)
+ edited.config.opt_string(opt).clear();
+ }
+
+ break;
+ }
+ }
+ }
+}
+
+PhysicalPrinter* PhysicalPrinterCollection::find_printer( const std::string& name, bool case_sensitive_search)
+{
+ auto it = this->find_printer_internal(name, case_sensitive_search);
+
+ // Ensure that a temporary copy is returned if the preset found is currently selected.
+ auto is_equal_name = [name, case_sensitive_search](const std::string& in_name) {
+ if (case_sensitive_search)
+ return in_name == name;
+ return boost::to_lower_copy<std::string>(in_name) == boost::to_lower_copy<std::string>(name);
+ };
+
+ if (it == m_printers.end() || !is_equal_name(it->name))
+ return nullptr;
+ return &this->printer(it - m_printers.begin());
+}
+
+std::deque<PhysicalPrinter>::iterator PhysicalPrinterCollection::find_printer_internal(const std::string& name, bool case_sensitive_search/* = true*/)
+{
+ if (case_sensitive_search)
+ return Slic3r::lower_bound_by_predicate(m_printers.begin(), m_printers.end(), [&name](const auto& l) { return l.name < name; });
+
+ std::string low_name = boost::to_lower_copy<std::string>(name);
+
+ size_t i = 0;
+ for (const PhysicalPrinter& printer : m_printers) {
+ if (boost::to_lower_copy<std::string>(printer.name) == low_name)
+ break;
+ i++;
+ }
+ if (i == m_printers.size())
+ return m_printers.end();
+
+ return m_printers.begin() + i;
+}
+
+PhysicalPrinter* PhysicalPrinterCollection::find_printer_with_same_config(const DynamicPrintConfig& config)
+{
+ for (const PhysicalPrinter& printer :*this) {
+ bool is_equal = true;
+ for (const char *opt : legacy_print_host_options)
+ if (is_equal && printer.config.opt_string(opt) != config.opt_string(opt))
+ is_equal = false;
+
+ if (is_equal)
+ return find_printer(printer.name);
+ }
+ return nullptr;
+}
+
+// Generate a file path from a profile name. Add the ".ini" suffix if it is missing.
+std::string PhysicalPrinterCollection::path_from_name(const std::string& new_name) const
+{
+ std::string file_name = boost::iends_with(new_name, ".ini") ? new_name : (new_name + ".ini");
+ return (boost::filesystem::path(m_dir_path) / file_name).make_preferred().string();
+}
+
+void PhysicalPrinterCollection::save_printer(PhysicalPrinter& edited_printer, const std::string& renamed_from/* = ""*/)
+{
+ // controll and update preset_names in edited_printer config
+ edited_printer.update_preset_names_in_config();
+
+ std::string name = renamed_from.empty() ? edited_printer.name : renamed_from;
+ // 1) Find the printer with a new_name or create a new one,
+ // initialize it with the edited config.
+ auto it = this->find_printer_internal(name);
+ if (it != m_printers.end() && it->name == name) {
+ // Printer with the same name found.
+ // Overwriting an existing preset.
+ it->config = std::move(edited_printer.config);
+ it->name = edited_printer.name;
+ it->preset_names = edited_printer.preset_names;
+ // sort printers and get new it
+ std::sort(m_printers.begin(), m_printers.end());
+ it = this->find_printer_internal(edited_printer.name);
+ }
+ else {
+ // Creating a new printer.
+ it = m_printers.emplace(it, edited_printer);
+ }
+ assert(it != m_printers.end());
+
+ // 2) Save printer
+ PhysicalPrinter& printer = *it;
+ if (printer.file.empty())
+ printer.file = this->path_from_name(printer.name);
+
+ if (printer.file == this->path_from_name(printer.name))
+ printer.save();
+ else
+ // if printer was renamed, we should rename a file and than save the config
+ printer.save(printer.file, this->path_from_name(printer.name));
+
+ // update idx_selected
+ m_idx_selected = it - m_printers.begin();
+}
+
+bool PhysicalPrinterCollection::delete_printer(const std::string& name)
+{
+ auto it = this->find_printer_internal(name);
+ if (it == m_printers.end())
+ return false;
+
+ const PhysicalPrinter& printer = *it;
+ // Erase the preset file.
+ boost::nowide::remove(printer.file.c_str());
+ m_printers.erase(it);
+ return true;
+}
+
+bool PhysicalPrinterCollection::delete_selected_printer()
+{
+ if (!has_selection())
+ return false;
+ const PhysicalPrinter& printer = this->get_selected_printer();
+
+ // Erase the preset file.
+ boost::nowide::remove(printer.file.c_str());
+ // Remove the preset from the list.
+ m_printers.erase(m_printers.begin() + m_idx_selected);
+ // unselect all printers
+ unselect_printer();
+
+ return true;
+}
+
+bool PhysicalPrinterCollection::delete_preset_from_printers( const std::string& preset_name)
+{
+ std::vector<std::string> printers_for_delete;
+ for (PhysicalPrinter& printer : m_printers) {
+ if (printer.preset_names.size() == 1 && *printer.preset_names.begin() == preset_name)
+ printers_for_delete.emplace_back(printer.name);
+ else if (printer.delete_preset(preset_name))
+ save_printer(printer);
+ }
+
+ if (!printers_for_delete.empty())
+ for (const std::string& printer_name : printers_for_delete)
+ delete_printer(printer_name);
+
+ unselect_printer();
+ return true;
+}
+
+// Get list of printers which have more than one preset and "preset_name" preset is one of them
+std::vector<std::string> PhysicalPrinterCollection::get_printers_with_preset(const std::string& preset_name)
+{
+ std::vector<std::string> printers;
+
+ for (auto printer : m_printers) {
+ if (printer.preset_names.size() == 1)
+ continue;
+ if (printer.preset_names.find(preset_name) != printer.preset_names.end())
+ printers.emplace_back(printer.name);
+ }
+
+ return printers;
+}
+
+// Get list of printers which has only "preset_name" preset
+std::vector<std::string> PhysicalPrinterCollection::get_printers_with_only_preset(const std::string& preset_name)
+{
+ std::vector<std::string> printers;
+
+ for (auto printer : m_printers)
+ if (printer.preset_names.size() == 1 && *printer.preset_names.begin() == preset_name)
+ printers.emplace_back(printer.name);
+
+ return printers;
+}
+
+std::string PhysicalPrinterCollection::get_selected_full_printer_name() const
+{
+ return (m_idx_selected == size_t(-1)) ? std::string() : this->get_selected_printer().get_full_name(m_selected_preset);
+}
+
+void PhysicalPrinterCollection::select_printer(const std::string& full_name)
+{
+ std::string printer_name = PhysicalPrinter::get_short_name(full_name);
+ auto it = this->find_printer_internal(printer_name);
+ if (it == m_printers.end()) {
+ unselect_printer();
+ return;
+ }
+
+ // update idx_selected
+ m_idx_selected = it - m_printers.begin();
+
+ // update name of the currently selected preset
+ if (printer_name == full_name)
+ // use first preset in the list
+ m_selected_preset = *it->preset_names.begin();
+ else
+ m_selected_preset = it->get_preset_name(full_name);
+}
+
+void PhysicalPrinterCollection::select_printer(const std::string& printer_name, const std::string& preset_name)
+{
+ if (preset_name.empty())
+ return select_printer(printer_name);
+ return select_printer(printer_name + PhysicalPrinter::separator() + preset_name);
+}
+
+void PhysicalPrinterCollection::select_printer(const PhysicalPrinter& printer)
+{
+ return select_printer(printer.name);
+}
+
+bool PhysicalPrinterCollection::has_selection() const
+{
+ return m_idx_selected != size_t(-1);
+}
+
+void PhysicalPrinterCollection::unselect_printer()
+{
+ m_idx_selected = size_t(-1);
+ m_selected_preset.clear();
+}
+
+bool PhysicalPrinterCollection::is_selected(PhysicalPrinterCollection::ConstIterator it, const std::string& preset_name) const
+{
+ return m_idx_selected == size_t(it - m_printers.begin()) &&
+ m_selected_preset == preset_name;
+}
+
+
namespace PresetUtils {
const VendorProfile::PrinterModel* system_printer_model(const Preset &preset)
{
@@ -1643,6 +1897,30 @@ namespace PresetUtils {
}
return out;
}
+
+ std::string system_printer_bed_model(const Preset& preset)
+ {
+ std::string out;
+ const VendorProfile::PrinterModel* pm = PresetUtils::system_printer_model(preset);
+ if (pm != nullptr && !pm->bed_model.empty()) {
+ out = Slic3r::data_dir() + "/vendor/" + preset.vendor->id + "/" + pm->bed_model;
+ if (!boost::filesystem::exists(boost::filesystem::path(out)))
+ out = Slic3r::resources_dir() + "/profiles/" + preset.vendor->id + "/" + pm->bed_model;
+ }
+ return out;
+ }
+
+ std::string system_printer_bed_texture(const Preset& preset)
+ {
+ std::string out;
+ const VendorProfile::PrinterModel* pm = PresetUtils::system_printer_model(preset);
+ if (pm != nullptr && !pm->bed_texture.empty()) {
+ out = Slic3r::data_dir() + "/vendor/" + preset.vendor->id + "/" + pm->bed_texture;
+ if (!boost::filesystem::exists(boost::filesystem::path(out)))
+ out = Slic3r::resources_dir() + "/profiles/" + preset.vendor->id + "/" + pm->bed_texture;
+ }
+ return out;
+ }
} // namespace PresetUtils
} // namespace Slic3r
diff --git a/src/slic3r/GUI/Preset.hpp b/src/libslic3r/Preset.hpp
index fee70c943..b6d44d58f 100644
--- a/src/slic3r/GUI/Preset.hpp
+++ b/src/libslic3r/Preset.hpp
@@ -8,27 +8,14 @@
#include <boost/filesystem/path.hpp>
#include <boost/property_tree/ptree_fwd.hpp>
-#include "libslic3r/libslic3r.h"
-#include "libslic3r/PrintConfig.hpp"
-#include "libslic3r/Semver.hpp"
-
-class wxBitmap;
-class wxBitmapComboBox;
-class wxChoice;
-class wxItemContainer;
-class wxString;
-class wxWindow;
+#include "PrintConfig.hpp"
+#include "Semver.hpp"
namespace Slic3r {
class AppConfig;
class PresetBundle;
-namespace GUI {
- class BitmapCache;
- class PresetComboBox;
-}
-
enum ConfigFileType
{
CONFIG_FILE_TYPE_UNKNOWN,
@@ -125,6 +112,7 @@ public:
TYPE_FILAMENT,
TYPE_SLA_MATERIAL,
TYPE_PRINTER,
+ TYPE_COUNT,
};
Preset(Type type, const std::string &name, bool is_default = false) : type(type), is_default(is_default), name(name) {}
@@ -230,12 +218,14 @@ public:
static const std::vector<std::string>& printer_options();
// Nozzle options of the printer options.
static const std::vector<std::string>& nozzle_options();
+ // Printer machine limits, those are contained in printer_options().
+ static const std::vector<std::string>& machine_limits_options();
static const std::vector<std::string>& sla_printer_options();
static const std::vector<std::string>& sla_material_options();
static const std::vector<std::string>& sla_print_options();
- static void update_suffix_modified();
+ static void update_suffix_modified(const std::string& new_suffix_modified);
static const std::string& suffix_modified();
static std::string remove_suffix_modified(const std::string& name);
static void normalize(DynamicPrintConfig &config);
@@ -297,7 +287,18 @@ public:
Preset& load_preset(const std::string &path, const std::string &name, const DynamicPrintConfig &config, bool select = true);
Preset& load_preset(const std::string &path, const std::string &name, DynamicPrintConfig &&config, bool select = true);
- Preset& load_external_preset(
+ // Returns a loaded preset, returns true if an existing preset was selected AND modified from config.
+ // In that case the successive filament loaded for a multi material printer should not be modified, but
+ // an external preset should be created instead.
+ enum class LoadAndSelect {
+ // Never select
+ Never,
+ // Always select
+ Always,
+ // Select a profile only if it was modified.
+ OnlyIfModified,
+ };
+ std::pair<Preset*, bool> load_external_preset(
// Path to the profile source file (a G-code, an AMF or 3MF file, a config file)
const std::string &path,
// Name of the profile, derived from the source file name.
@@ -307,7 +308,7 @@ public:
// Config to initialize the preset from.
const DynamicPrintConfig &config,
// Select the preset after loading?
- bool select = true);
+ LoadAndSelect select = LoadAndSelect::Always);
// Save the preset under a new name. If the name is different from the old one,
// a new preset is stored into the list of presets.
@@ -321,18 +322,6 @@ public:
// returns true if the preset was deleted successfully.
bool delete_preset(const std::string& name);
- // Load default bitmap to be placed at the wxBitmapComboBox of a MainFrame.
- void load_bitmap_default(const std::string &file_name);
-
- // Load "add new printer" bitmap to be placed at the wxBitmapComboBox of a MainFrame.
- void load_bitmap_add(const std::string &file_name);
-
- // Compatible & incompatible marks, to be placed at the wxBitmapComboBox items.
- void set_bitmap_compatible (const wxBitmap *bmp) { m_bitmap_compatible = bmp; }
- void set_bitmap_incompatible(const wxBitmap *bmp) { m_bitmap_incompatible = bmp; }
- void set_bitmap_lock (const wxBitmap *bmp) { m_bitmap_lock = bmp; }
- void set_bitmap_lock_open (const wxBitmap *bmp) { m_bitmap_lock_open = bmp; }
-
// Enable / disable the "- default -" preset.
void set_default_suppressed(bool default_suppressed);
bool is_default_suppressed() const { return m_default_suppressed; }
@@ -342,9 +331,9 @@ public:
// Return the selected preset, without the user modifications applied.
Preset& get_selected_preset() { return m_presets[m_idx_selected]; }
const Preset& get_selected_preset() const { return m_presets[m_idx_selected]; }
- int get_selected_idx() const { return m_idx_selected; }
+ size_t get_selected_idx() const { return m_idx_selected; }
// Returns the name of the selected preset, or an empty string if no preset is selected.
- std::string get_selected_preset_name() const { return (m_idx_selected == -1) ? std::string() : this->get_selected_preset().name; }
+ std::string get_selected_preset_name() const { return (m_idx_selected == size_t(-1)) ? std::string() : this->get_selected_preset().name; }
// For the current edited preset, return the parent preset if there is one.
// If there is no parent preset, nullptr is returned.
// The parent preset may be a system preset or a user preset, which will be
@@ -366,7 +355,7 @@ public:
// used to update preset_choice from Tab
const std::deque<Preset>& get_presets() const { return m_presets; }
- int get_idx_selected() { return m_idx_selected; }
+ size_t get_idx_selected() { return m_idx_selected; }
static const std::string& get_suffix_modified();
// Return a preset possibly with modifications.
@@ -374,7 +363,7 @@ public:
const Preset& default_preset(size_t idx = 0) const { assert(idx < m_num_default_presets); return m_presets[idx]; }
virtual const Preset& default_preset_for(const DynamicPrintConfig & /* config */) const { return this->default_preset(); }
// Return a preset by an index. If the preset is active, a temporary copy is returned.
- Preset& preset(size_t idx) { return (int(idx) == m_idx_selected) ? m_edited_preset : m_presets[idx]; }
+ Preset& preset(size_t idx) { return (idx == m_idx_selected) ? m_edited_preset : m_presets[idx]; }
const Preset& preset(size_t idx) const { return const_cast<PresetCollection*>(this)->preset(idx); }
void discard_current_changes() { m_presets[m_idx_selected].reset_dirty(); m_edited_preset = m_presets[m_idx_selected]; }
@@ -393,19 +382,28 @@ public:
size_t i = m_default_suppressed ? m_num_default_presets : 0;
size_t n = this->m_presets.size();
size_t i_compatible = n;
+ int match_quality = -1;
for (; i < n; ++ i)
// Since we use the filament selection from Wizard, it's needed to control the preset visibility too
if (m_presets[i].is_compatible && m_presets[i].is_visible) {
- if (prefered_condition(m_presets[i].name))
- return i;
- if (i_compatible == n)
- // Store the first compatible profile into i_compatible.
+ int this_match_quality = prefered_condition(m_presets[i]);
+ if (this_match_quality > match_quality) {
+ if (match_quality == std::numeric_limits<int>::max())
+ // Better match will not be found.
+ return i;
+ // Store the first compatible profile with highest match quality into i_compatible.
i_compatible = i;
+ match_quality = this_match_quality;
+ }
}
- return (i_compatible == n) ? 0 : i_compatible;
+ return (i_compatible == n) ?
+ // No compatible preset found, return the default preset.
+ 0 :
+ // Compatible preset found.
+ i_compatible;
}
// Return index of the first compatible preset. Certainly at least the '- default -' preset shall be compatible.
- size_t first_compatible_idx() const { return this->first_compatible_idx([](const std::string&){return true;}); }
+ size_t first_compatible_idx() const { return this->first_compatible_idx([](const Preset&) -> int { return 0; }); }
// Return index of the first visible preset. Certainly at least the '- default -' preset shall be visible.
// Return the first visible preset. Certainly at least the '- default -' preset shall be visible.
@@ -429,7 +427,7 @@ public:
this->select_preset(this->first_compatible_idx(prefered_condition));
}
void update_compatible(const PresetWithVendorProfile &active_printer, const PresetWithVendorProfile *active_print, PresetSelectCompatibleType select_other_if_incompatible)
- { this->update_compatible(active_printer, active_print, select_other_if_incompatible, [](const std::string&){return true;}); }
+ { this->update_compatible(active_printer, active_print, select_other_if_incompatible, [](const Preset&) -> int { return 0; }); }
size_t num_visible() const { return std::count_if(m_presets.begin(), m_presets.end(), [](const Preset &preset){return preset.is_visible;}); }
@@ -443,20 +441,13 @@ public:
{ return dirty_options(&this->get_edited_preset(), this->get_selected_preset_parent(), deep_compare); }
// Return a sorted list of system preset names.
+ // Used for validating the "inherits" flag when importing user's config bundles.
+ // Returns names of all system presets including the former names of these presets.
std::vector<std::string> system_preset_names() const;
- // Update the choice UI from the list of presets.
- // If show_incompatible, all presets are shown, otherwise only the compatible presets are shown.
- // If an incompatible preset is selected, it is shown as well.
- size_t update_tab_ui(wxBitmapComboBox *ui, bool show_incompatible, const int em = 10);
- // Update the choice UI from the list of presets.
- // Only the compatible presets are shown.
- // If an incompatible preset is selected, it is shown as well.
- void update_plater_ui(GUI::PresetComboBox *ui);
-
- // Update a dirty floag of the current preset, update the labels of the UI component accordingly.
+ // Update a dirty flag of the current preset
// Return true if the dirty flag changed.
- bool update_dirty_ui(wxBitmapComboBox *ui);
+ bool update_dirty();
// Select a profile by its name. Return true if the selection changed.
// Without force, the selection is only updated if the index changes.
@@ -466,16 +457,7 @@ public:
// Generate a file path from a profile name. Add the ".ini" suffix if it is missing.
std::string path_from_name(const std::string &new_name) const;
- void clear_bitmap_cache();
-
-#ifdef __linux__
- static const char* separator_head() { return "------- "; }
- static const char* separator_tail() { return " -------"; }
-#else /* __linux__ */
- static const char* separator_head() { return "————— "; }
- static const char* separator_tail() { return " —————"; }
-#endif /* __linux__ */
- static wxString separator(const std::string &label);
+ size_t num_default_presets() { return m_num_default_presets; }
protected:
// Select a preset, if it exists. If it does not exist, select an invalid (-1) index.
@@ -502,8 +484,7 @@ private:
// If a preset does not exist, an iterator is returned indicating where to insert a preset with the same name.
std::deque<Preset>::iterator find_preset_internal(const std::string &name)
{
- Preset key(m_type, name);
- auto it = std::lower_bound(m_presets.begin() + m_num_default_presets, m_presets.end(), key);
+ auto it = Slic3r::lower_bound_by_predicate(m_presets.begin() + m_num_default_presets, m_presets.end(), [&name](const auto& l) { return l.name < name; });
if (it == m_presets.end() || it->name != name) {
// Preset has not been not found in the sorted list of non-default presets. Try the defaults.
for (size_t i = 0; i < m_num_default_presets; ++ i)
@@ -542,27 +523,14 @@ private:
// Initially this preset contains a copy of the selected preset. Later on, this copy may be modified by the user.
Preset m_edited_preset;
// Selected preset.
- int m_idx_selected;
+ size_t m_idx_selected;
// Is the "- default -" preset suppressed?
bool m_default_suppressed = true;
size_t m_num_default_presets = 0;
- // Compatible & incompatible marks, to be placed at the wxBitmapComboBox items of a Plater.
- // These bitmaps are not owned by PresetCollection, but by a PresetBundle.
- const wxBitmap *m_bitmap_compatible = nullptr;
- const wxBitmap *m_bitmap_incompatible = nullptr;
- const wxBitmap *m_bitmap_lock = nullptr;
- const wxBitmap *m_bitmap_lock_open = nullptr;
- // Marks placed at the wxBitmapComboBox of a MainFrame.
- // These bitmaps are owned by PresetCollection.
- wxBitmap *m_bitmap_main_frame;
- // "Add printer profile" icon, owned by PresetCollection.
- wxBitmap *m_bitmap_add;
+
// Path to the directory to store the config files into.
std::string m_dir_path;
- // Caching color bitmaps for the filament combo box.
- GUI::BitmapCache *m_bitmap_cache = nullptr;
-
// to access select_preset_by_name_strict()
friend class PresetBundle;
};
@@ -582,8 +550,212 @@ public:
namespace PresetUtils {
// PrinterModel of a system profile, from which this preset is derived, or null if it is not derived from a system profile.
const VendorProfile::PrinterModel* system_printer_model(const Preset &preset);
+ std::string system_printer_bed_model(const Preset& preset);
+ std::string system_printer_bed_texture(const Preset& preset);
} // namespace PresetUtils
+
+//////////////////////////////////////////////////////////////////////
+
+class PhysicalPrinter
+{
+public:
+ PhysicalPrinter(const std::string& name, const DynamicPrintConfig &default_config);
+ PhysicalPrinter(const std::string& name, const DynamicPrintConfig &default_config, const Preset& preset);
+ void set_name(const std::string &name);
+
+ // Name of the Physical Printer, usually derived form the file name.
+ std::string name;
+ // File name of the Physical Printer.
+ std::string file;
+ // Configuration data, loaded from a file, or set from the defaults.
+ DynamicPrintConfig config;
+ // set of presets used with this physical printer
+ std::set<std::string> preset_names;
+
+ // Has this profile been loaded?
+ bool loaded = false;
+
+ static std::string separator();
+ static const std::vector<std::string>& printer_options();
+ static const std::vector<std::string>& print_host_options();
+ static std::vector<std::string> presets_with_print_host_information(const PrinterPresetCollection& printer_presets);
+ static bool has_print_host_information(const DynamicPrintConfig& config);
+
+ const std::set<std::string>& get_preset_names() const;
+
+ bool has_empty_config() const;
+ void update_preset_names_in_config();
+
+ void save() { this->config.save(this->file); }
+ void save(const std::string& file_name_from, const std::string& file_name_to);
+
+ void update_from_preset(const Preset& preset);
+ void update_from_config(const DynamicPrintConfig &new_config);
+
+ // add preset to the preset_names
+ // return false, if preset with this name is already exist in the set
+ bool add_preset(const std::string& preset_name);
+ bool delete_preset(const std::string& preset_name);
+ void reset_presets();
+
+ // Return a printer technology, return ptFFF if the printer technology is not set.
+ static PrinterTechnology printer_technology(const DynamicPrintConfig& cfg) {
+ auto* opt = cfg.option<ConfigOptionEnum<PrinterTechnology>>("printer_technology");
+ // The following assert may trigger when importing some legacy profile,
+ // but it is safer to keep it here to capture the cases where the "printer_technology" key is queried, where it should not.
+ return (opt == nullptr) ? ptFFF : opt->value;
+ }
+ PrinterTechnology printer_technology() const { return printer_technology(this->config); }
+
+ // Sort lexicographically by a preset name. The preset name shall be unique across a single PresetCollection.
+ bool operator<(const PhysicalPrinter& other) const { return this->name < other.name; }
+
+ // get full printer name included a name of the preset
+ std::string get_full_name(std::string preset_name) const;
+
+ // get printer name from the full name uncluded preset name
+ static std::string get_short_name(std::string full_name);
+
+ // get preset name from the full name uncluded printer name
+ static std::string get_preset_name(std::string full_name);
+
+protected:
+ friend class PhysicalPrinterCollection;
+};
+
+
+// ---------------------------------
+// *** PhysicalPrinterCollection ***
+// ---------------------------------
+
+// Collections of physical printers
+class PhysicalPrinterCollection
+{
+public:
+ PhysicalPrinterCollection(const std::vector<std::string>& keys);
+ ~PhysicalPrinterCollection() {}
+
+ typedef std::deque<PhysicalPrinter>::iterator Iterator;
+ typedef std::deque<PhysicalPrinter>::const_iterator ConstIterator;
+ Iterator begin() { return m_printers.begin(); }
+ ConstIterator begin() const { return m_printers.cbegin(); }
+ ConstIterator cbegin() const { return m_printers.cbegin(); }
+ Iterator end() { return m_printers.end(); }
+ ConstIterator end() const { return m_printers.cend(); }
+ ConstIterator cend() const { return m_printers.cend(); }
+
+ bool empty() const {return m_printers.empty(); }
+
+ void reset(bool delete_files) {};
+
+ const std::deque<PhysicalPrinter>& operator()() const { return m_printers; }
+
+ // Load ini files of the particular type from the provided directory path.
+ void load_printers(const std::string& dir_path, const std::string& subdir);
+ void load_printers_from_presets(PrinterPresetCollection &printer_presets);
+ // Load printer from the loaded configuration
+ void load_printer(const std::string& path, const std::string& name, DynamicPrintConfig&& config, bool select, bool save=false);
+
+ // Save the printer under a new name. If the name is different from the old one,
+ // a new printer is stored into the list of printers.
+ // New printer is activated.
+ void save_printer(PhysicalPrinter& printer, const std::string& renamed_from = "");
+
+ // Delete the current preset, activate the first visible preset.
+ // returns true if the preset was deleted successfully.
+ bool delete_printer(const std::string& name);
+ // Delete the selected preset
+ // returns true if the preset was deleted successfully.
+ bool delete_selected_printer();
+ // Delete preset_name preset from all printers:
+ // If there is last preset for the printer and first_check== false, then delete this printer
+ // returns true if all presets were deleted successfully.
+ bool delete_preset_from_printers(const std::string& preset_name);
+
+ // Get list of printers which have more than one preset and "preset_name" preset is one of them
+ std::vector<std::string> get_printers_with_preset( const std::string &preset_name);
+ // Get list of printers which has only "preset_name" preset
+ std::vector<std::string> get_printers_with_only_preset( const std::string &preset_name);
+
+ // Return the selected preset, without the user modifications applied.
+ PhysicalPrinter& get_selected_printer() { return m_printers[m_idx_selected]; }
+ const PhysicalPrinter& get_selected_printer() const { return m_printers[m_idx_selected]; }
+
+ size_t get_selected_idx() const { return m_idx_selected; }
+ // Returns the name of the selected preset, or an empty string if no preset is selected.
+ std::string get_selected_printer_name() const { return (m_idx_selected == size_t(-1)) ? std::string() : this->get_selected_printer().name; }
+ // Returns the config of the selected printer, or nullptr if no printer is selected.
+ DynamicPrintConfig* get_selected_printer_config() { return (m_idx_selected == size_t(-1)) ? nullptr : &(this->get_selected_printer().config); }
+ // Returns the config of the selected printer, or nullptr if no printer is selected.
+ PrinterTechnology get_selected_printer_technology() { return (m_idx_selected == size_t(-1)) ? PrinterTechnology::ptAny : this->get_selected_printer().printer_technology(); }
+
+ // Each physical printer can have a several related preset,
+ // so, use the next functions to get an exact names of selections in the list:
+ // Returns the full name of the selected printer, or an empty string if no preset is selected.
+ std::string get_selected_full_printer_name() const;
+ // Returns the printer model of the selected preset, or an empty string if no preset is selected.
+ std::string get_selected_printer_preset_name() const { return (m_idx_selected == size_t(-1)) ? std::string() : m_selected_preset; }
+
+ // Select printer by the full printer name, which contains name of printer, separator and name of selected preset
+ // If full_name doesn't contain name of selected preset, then select first preset in the list for this printer
+ void select_printer(const std::string& full_name);
+ void select_printer(const PhysicalPrinter& printer);
+ void select_printer(const std::string& printer_name, const std::string& preset_name);
+ bool has_selection() const;
+ void unselect_printer() ;
+ bool is_selected(ConstIterator it, const std::string &preset_name) const;
+
+ // Return a printer by an index. If the printer is active, a temporary copy is returned.
+ PhysicalPrinter& printer(size_t idx) { return m_printers[idx]; }
+ const PhysicalPrinter& printer(size_t idx) const { return const_cast<PhysicalPrinterCollection*>(this)->printer(idx); }
+
+ // Return a preset by its name. If the preset is active, a temporary copy is returned.
+ // If a preset is not found by its name, null is returned.
+ // It is possible case (in)sensitive search
+ PhysicalPrinter* find_printer(const std::string& name, bool case_sensitive_search = true);
+ const PhysicalPrinter* find_printer(const std::string& name, bool case_sensitive_search = true) const
+ {
+ return const_cast<PhysicalPrinterCollection*>(this)->find_printer(name, case_sensitive_search);
+ }
+
+ // Generate a file path from a profile name. Add the ".ini" suffix if it is missing.
+ std::string path_from_name(const std::string& new_name) const;
+
+ const DynamicPrintConfig& default_config() const { return m_default_config; }
+
+private:
+ PhysicalPrinterCollection& operator=(const PhysicalPrinterCollection& other);
+
+ // Find a physical printer position in the sorted list of printers.
+ // The name of a printer should be unique and case insensitive
+ // Use this functions with case_sensitive_search = false, when you need case insensitive search
+ std::deque<PhysicalPrinter>::iterator find_printer_internal(const std::string& name, bool case_sensitive_search = true);
+ std::deque<PhysicalPrinter>::const_iterator find_printer_internal(const std::string& name, bool case_sensitive_search = true) const
+ {
+ return const_cast<PhysicalPrinterCollection*>(this)->find_printer_internal(name);
+ }
+
+ PhysicalPrinter* find_printer_with_same_config( const DynamicPrintConfig &config);
+
+ // List of printers
+ // Use deque to force the container to allocate an object per each entry,
+ // so that the addresses of the presets don't change during resizing of the container.
+ std::deque<PhysicalPrinter> m_printers;
+
+ // Default config for a physical printer containing all key/value pairs of PhysicalPrinter::printer_options().
+ DynamicPrintConfig m_default_config;
+
+ // Selected printer.
+ size_t m_idx_selected = size_t(-1);
+ // The name of the preset which is currently select for this printer
+ std::string m_selected_preset;
+
+ // Path to the directory to store the config files into.
+ std::string m_dir_path;
+};
+
+
} // namespace Slic3r
#endif /* slic3r_Preset_hpp_ */
diff --git a/src/slic3r/GUI/PresetBundle.cpp b/src/libslic3r/PresetBundle.cpp
index 3a48cd675..b31ee6664 100644
--- a/src/slic3r/GUI/PresetBundle.cpp
+++ b/src/libslic3r/PresetBundle.cpp
@@ -1,12 +1,13 @@
#include <cassert>
#include "PresetBundle.hpp"
-#include "BitmapCache.hpp"
-#include "Plater.hpp"
-#include "I18N.hpp"
-#include "wxExtensions.hpp"
+#include "libslic3r.h"
+#include "Utils.hpp"
+#include "Model.hpp"
+#include "format.hpp"
#include <algorithm>
+#include <set>
#include <fstream>
#include <unordered_set>
#include <boost/filesystem.hpp>
@@ -21,15 +22,6 @@
#include <boost/locale.hpp>
#include <boost/log/trivial.hpp>
-#include <wx/dcmemory.h>
-#include <wx/image.h>
-#include <wx/choice.h>
-#include <wx/bmpcbox.h>
-#include <wx/wupdlock.h>
-
-#include "libslic3r/libslic3r.h"
-#include "libslic3r/Utils.hpp"
-#include "GUI_App.hpp"
// Store the print/filament/printer presets into a "presets" subdirectory of the Slic3rPE config dir.
// This breaks compatibility with the upstream Slic3r if the --datadir is used to switch between the two versions.
@@ -46,26 +38,19 @@ static std::vector<std::string> s_project_options {
const char *PresetBundle::PRUSA_BUNDLE = "PrusaResearch";
PresetBundle::PresetBundle() :
- prints(Preset::TYPE_PRINT, Preset::print_options(), static_cast<const HostConfig&>(FullPrintConfig::defaults())),
- filaments(Preset::TYPE_FILAMENT, Preset::filament_options(), static_cast<const HostConfig&>(FullPrintConfig::defaults())),
+ prints(Preset::TYPE_PRINT, Preset::print_options(), static_cast<const PrintRegionConfig&>(FullPrintConfig::defaults())),
+ filaments(Preset::TYPE_FILAMENT, Preset::filament_options(), static_cast<const PrintRegionConfig&>(FullPrintConfig::defaults())),
sla_materials(Preset::TYPE_SLA_MATERIAL, Preset::sla_material_options(), static_cast<const SLAMaterialConfig&>(SLAFullPrintConfig::defaults())),
sla_prints(Preset::TYPE_SLA_PRINT, Preset::sla_print_options(), static_cast<const SLAPrintObjectConfig&>(SLAFullPrintConfig::defaults())),
- printers(Preset::TYPE_PRINTER, Preset::printer_options(), static_cast<const HostConfig&>(FullPrintConfig::defaults()), "- default FFF -"),
- m_bitmapCompatible(new wxBitmap),
- m_bitmapIncompatible(new wxBitmap),
- m_bitmapLock(new wxBitmap),
- m_bitmapLockOpen(new wxBitmap),
- m_bitmapCache(new GUI::BitmapCache)
+ printers(Preset::TYPE_PRINTER, Preset::printer_options(), static_cast<const PrintRegionConfig&>(FullPrintConfig::defaults()), "- default FFF -"),
+ physical_printers(PhysicalPrinter::printer_options())
{
- if (wxImage::FindHandler(wxBITMAP_TYPE_PNG) == nullptr)
- wxImage::AddHandler(new wxPNGHandler);
-
// The following keys are handled by the UI, they do not have a counterpart in any StaticPrintConfig derived classes,
// therefore they need to be handled differently. As they have no counterpart in StaticPrintConfig, they are not being
// initialized based on PrintConfigDef(), but to empty values (zeros, empty vectors, empty strings).
//
// "compatible_printers", "compatible_printers_condition", "inherits",
- // "print_settings_id", "filament_settings_id", "printer_settings_id",
+ // "print_settings_id", "filament_settings_id", "printer_settings_id", "printer_settings_id"
// "printer_vendor", "printer_model", "printer_variant", "default_print_profile", "default_filament_profile"
// Create the ID config keys, as they are not part of the Static print config classes.
@@ -93,16 +78,16 @@ 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<ConfigOptionStrings>("default_filament_profile", true)->values = { "" };
- }
- else {
+ preset.config.option<ConfigOptionStrings>("default_filament_profile", true);
+ } else {
preset.config.optptr("default_sla_print_profile", true);
preset.config.optptr("default_sla_material_profile", true);
}
@@ -110,16 +95,6 @@ PresetBundle::PresetBundle() :
preset.inherits();
}
- // Load the default preset bitmaps.
- // #ys_FIXME_to_delete we'll load them later, using em_unit()
-// this->prints .load_bitmap_default("cog");
-// this->sla_prints .load_bitmap_default("package_green.png");
-// this->filaments .load_bitmap_default("spool.png");
-// this->sla_materials.load_bitmap_default("package_green.png");
-// this->printers .load_bitmap_default("printer_empty.png");
-// this->printers .load_bitmap_add("add.png");
-// this->load_compatible_bitmaps();
-
// Re-activate the default presets, so their "edited" preset copies will be updated with the additional configuration values above.
this->prints .select_preset(0);
this->sla_prints .select_preset(0);
@@ -132,20 +107,6 @@ PresetBundle::PresetBundle() :
PresetBundle::~PresetBundle()
{
- assert(m_bitmapCompatible != nullptr);
- assert(m_bitmapIncompatible != nullptr);
- assert(m_bitmapLock != nullptr);
- assert(m_bitmapLockOpen != nullptr);
- delete m_bitmapCompatible;
- m_bitmapCompatible = nullptr;
- delete m_bitmapIncompatible;
- m_bitmapIncompatible = nullptr;
- delete m_bitmapLock;
- m_bitmapLock = nullptr;
- delete m_bitmapLockOpen;
- m_bitmapLockOpen = nullptr;
- delete m_bitmapCache;
- m_bitmapCache = nullptr;
}
void PresetBundle::reset(bool delete_files)
@@ -180,14 +141,16 @@ void PresetBundle::setup_directories()
data_dir / "presets" / "filament",
data_dir / "presets" / "sla_print",
data_dir / "presets" / "sla_material",
- data_dir / "presets" / "printer"
+ data_dir / "presets" / "printer",
+ data_dir / "presets" / "physical_printer"
#else
// Store the print/filament/printer presets at the same location as the upstream Slic3r.
data_dir / "print",
data_dir / "filament",
data_dir / "sla_print",
data_dir / "sla_material",
- data_dir / "printer"
+ data_dir / "printer",
+ data_dir / "physical_printer"
#endif
};
for (const boost::filesystem::path &path : paths) {
@@ -195,7 +158,7 @@ void PresetBundle::setup_directories()
subdir.make_preferred();
if (! boost::filesystem::is_directory(subdir) &&
! boost::filesystem::create_directory(subdir))
- throw std::runtime_error(std::string("Slic3r was unable to create its data directory at ") + subdir.string());
+ throw Slic3r::RuntimeError(std::string("Slic3r was unable to create its data directory at ") + subdir.string());
}
}
@@ -237,10 +200,15 @@ void PresetBundle::load_presets(AppConfig &config, const std::string &preferred_
} catch (const std::runtime_error &err) {
errors_cummulative += err.what();
}
+ try {
+ this->physical_printers.load_printers(dir_user_presets, "physical_printer");
+ } catch (const std::runtime_error &err) {
+ errors_cummulative += err.what();
+ }
this->update_multi_material_filament_presets();
this->update_compatible(PresetSelectCompatibleType::Never);
if (! errors_cummulative.empty())
- throw std::runtime_error(errors_cummulative);
+ throw Slic3r::RuntimeError(errors_cummulative);
this->load_selections(config, preferred_model_id);
}
@@ -360,6 +328,32 @@ const std::string& PresetBundle::get_preset_name_by_alias( const Preset::Type& p
return presets.get_preset_name_by_alias(alias);
}
+void PresetBundle::save_changes_for_preset(const std::string& new_name, Preset::Type type,
+ const std::vector<std::string>& unselected_options)
+{
+ PresetCollection& presets = type == Preset::TYPE_PRINT ? prints :
+ type == Preset::TYPE_SLA_PRINT ? sla_prints :
+ type == Preset::TYPE_FILAMENT ? filaments :
+ type == Preset::TYPE_SLA_MATERIAL ? sla_materials : printers;
+
+ // if we want to save just some from selected options
+ if (!unselected_options.empty()) {
+ // revert unselected options to the old values
+ presets.get_edited_preset().config.apply_only(presets.get_selected_preset().config, unselected_options);
+ }
+
+ // Save the preset into Slic3r::data_dir / presets / section_name / preset_name.ini
+ presets.save_current_preset(new_name);
+ // Mark the print & filament enabled if they are compatible with the currently selected preset.
+ // If saving the preset changes compatibility with other presets, keep the now incompatible dependent presets selected, however with a "red flag" icon showing that they are no more compatible.
+ update_compatible(PresetSelectCompatibleType::Never);
+
+ if (type == Preset::TYPE_FILAMENT) {
+ // synchronize the first filament presets.
+ set_filament_preset(0, filaments.get_selected_preset_name());
+ }
+}
+
void PresetBundle::load_installed_filaments(AppConfig &config)
{
if (! config.has_section(AppConfig::SECTION_FILAMENTS)) {
@@ -463,6 +457,13 @@ void PresetBundle::load_selections(AppConfig &config, const std::string &preferr
// exist.
this->update_compatible(PresetSelectCompatibleType::Always);
this->update_multi_material_filament_presets();
+
+ // Parse the initial physical printer name.
+ 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())
+ physical_printers.select_printer(initial_physical_printer_name);
}
// Export selections (current print, current filaments, current printer) into config.ini
@@ -482,36 +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());
-}
-
-void PresetBundle::load_compatible_bitmaps()
-{
- *m_bitmapCompatible = create_scaled_bitmap("flag_green");
- *m_bitmapIncompatible = create_scaled_bitmap("flag_red");
- *m_bitmapLock = create_scaled_bitmap("lock_closed");
- *m_bitmapLockOpen = create_scaled_bitmap("lock_open");
-
- prints .set_bitmap_compatible(m_bitmapCompatible);
- filaments .set_bitmap_compatible(m_bitmapCompatible);
- sla_prints .set_bitmap_compatible(m_bitmapCompatible);
- sla_materials.set_bitmap_compatible(m_bitmapCompatible);
-
- prints .set_bitmap_incompatible(m_bitmapIncompatible);
- filaments .set_bitmap_incompatible(m_bitmapIncompatible);
- sla_prints .set_bitmap_incompatible(m_bitmapIncompatible);
- sla_materials.set_bitmap_incompatible(m_bitmapIncompatible);
-
- prints .set_bitmap_lock(m_bitmapLock);
- filaments .set_bitmap_lock(m_bitmapLock);
- sla_prints .set_bitmap_lock(m_bitmapLock);
- sla_materials.set_bitmap_lock(m_bitmapLock);
- printers .set_bitmap_lock(m_bitmapLock);
-
- prints .set_bitmap_lock_open(m_bitmapLock);
- filaments .set_bitmap_lock_open(m_bitmapLock);
- sla_prints .set_bitmap_lock_open(m_bitmapLock);
- sla_materials.set_bitmap_lock_open(m_bitmapLock);
- printers .set_bitmap_lock_open(m_bitmapLock);
+ config.set("presets", "physical_printer", physical_printers.get_selected_full_printer_name());
}
DynamicPrintConfig PresetBundle::full_config() const
@@ -524,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");
@@ -613,6 +586,7 @@ DynamicPrintConfig PresetBundle::full_fff_config() const
out.option<ConfigOptionString >("print_settings_id", true)->value = this->prints.get_selected_preset_name();
out.option<ConfigOptionStrings>("filament_settings_id", true)->values = this->filament_presets;
out.option<ConfigOptionString >("printer_settings_id", true)->value = this->printers.get_selected_preset_name();
+ out.option<ConfigOptionString >("physical_printer_settings_id", true)->value = this->physical_printers.get_selected_printer_name();
// Serialize the collected "compatible_printers_condition" and "inherits" fields.
// There will be 1 + num_exturders fields for "inherits" and 2 + num_extruders for "compatible_printers_condition" stored.
@@ -664,6 +638,7 @@ DynamicPrintConfig PresetBundle::full_sla_config() const
out.option<ConfigOptionString >("sla_print_settings_id", true)->value = this->sla_prints.get_selected_preset_name();
out.option<ConfigOptionString >("sla_material_settings_id", true)->value = this->sla_materials.get_selected_preset_name();
out.option<ConfigOptionString >("printer_settings_id", true)->value = this->printers.get_selected_preset_name();
+ out.option<ConfigOptionString >("physical_printer_settings_id", true)->value = this->physical_printers.get_selected_printer_name();
// Serialize the collected "compatible_printers_condition" and "inherits" fields.
// There will be 1 + num_exturders fields for "inherits" and 2 + num_extruders for "compatible_printers_condition" stored.
@@ -692,7 +667,7 @@ DynamicPrintConfig PresetBundle::full_sla_config() const
// If the file is loaded successfully, its print / filament / printer profiles will be activated.
void PresetBundle::load_config_file(const std::string &path)
{
- if (boost::iends_with(path, ".gcode") || boost::iends_with(path, ".g")) {
+ if (is_gcode_file(path)) {
DynamicPrintConfig config;
config.apply(FullPrintConfig::defaults());
config.load_from_gcode_file(path);
@@ -707,21 +682,21 @@ void PresetBundle::load_config_file(const std::string &path)
boost::nowide::ifstream ifs(path);
boost::property_tree::read_ini(ifs, tree);
} catch (const std::ifstream::failure &err) {
- throw std::runtime_error(std::string("The Config Bundle cannot be loaded: ") + path + "\n\tReason: " + err.what());
+ throw Slic3r::RuntimeError(std::string("The Config Bundle cannot be loaded: ") + path + "\n\tReason: " + err.what());
} catch (const boost::property_tree::file_parser_error &err) {
- throw std::runtime_error((boost::format("Failed loading the Config Bundle \"%1%\": %2% at line %3%")
+ throw Slic3r::RuntimeError((boost::format("Failed loading the Config Bundle \"%1%\": %2% at line %3%")
% err.filename() % err.message() % err.line()).str());
} catch (const std::runtime_error &err) {
- throw std::runtime_error(std::string("Failed loading the preset file: ") + path + "\n\tReason: " + err.what());
+ throw Slic3r::RuntimeError(std::string("Failed loading the preset file: ") + path + "\n\tReason: " + err.what());
}
// 2) Continue based on the type of the configuration file.
ConfigFileType config_file_type = guess_config_file_type(tree);
switch (config_file_type) {
case CONFIG_FILE_TYPE_UNKNOWN:
- throw std::runtime_error(std::string("Unknown configuration file type: ") + path);
+ throw Slic3r::RuntimeError(std::string("Unknown configuration file type: ") + path);
case CONFIG_FILE_TYPE_APP_CONFIG:
- throw std::runtime_error(std::string("Invalid configuration file: ") + path + ". This is an application config file.");
+ throw Slic3r::RuntimeError(std::string("Invalid configuration file: ") + path + ". This is an application config file.");
case CONFIG_FILE_TYPE_CONFIG:
{
// Initialize a config from full defaults.
@@ -739,6 +714,7 @@ void PresetBundle::load_config_file(const std::string &path)
}
// Load a config file from a boost property_tree. This is a private method called from load_config_file.
+// is_external == false on if called from ConfigWizard
void PresetBundle::load_config_file_config(const std::string &name_or_path, bool is_external, DynamicPrintConfig &&config)
{
PrinterTechnology printer_technology = Preset::printer_technology(config);
@@ -775,7 +751,7 @@ void PresetBundle::load_config_file_config(const std::string &name_or_path, bool
switch (printer_technology) {
case ptFFF:
config.option<ConfigOptionString>("default_print_profile", true);
- config.option<ConfigOptionStrings>("default_filament_profile", true)->values.resize(num_extruders, std::string());
+ config.option<ConfigOptionStrings>("default_filament_profile", true);
break;
case ptSLA:
config.option<ConfigOptionString>("default_sla_print_profile", true);
@@ -825,14 +801,17 @@ void PresetBundle::load_config_file_config(const std::string &name_or_path, bool
compatible_prints_condition = compatible_prints_condition_values.front();
Preset *loaded = nullptr;
if (is_external) {
- loaded = &this->filaments.load_external_preset(name_or_path, name, old_filament_profile_names->values.front(), config);
+ auto [aloaded, modified] = this->filaments.load_external_preset(name_or_path, name, old_filament_profile_names->values.front(), config);
+ loaded = aloaded;
} else {
- loaded = &this->filaments.load_preset(this->filaments.path_from_name(name), name, config);
+ // called from Config Wizard.
+ loaded= &this->filaments.load_preset(this->filaments.path_from_name(name), name, config);
loaded->save();
}
this->filament_presets.clear();
this->filament_presets.emplace_back(loaded->name);
} else {
+ assert(is_external);
// Split the filament presets, load each of them separately.
std::vector<DynamicPrintConfig> configs(num_extruders, this->filaments.default_preset().config);
// loop through options and scatter them into configs.
@@ -853,6 +832,7 @@ void PresetBundle::load_config_file_config(const std::string &name_or_path, bool
// To avoid incorrect selection of the first filament preset (means a value of Preset->m_idx_selected)
// in a case when next added preset take a place of previosly selected preset,
// we should add presets from last to first
+ bool any_modified = false;
for (int i = (int)configs.size()-1; i >= 0; i--) {
DynamicPrintConfig &cfg = configs[i];
// Split the "compatible_printers_condition" and "inherits" from the cummulative vectors to separate filament presets.
@@ -860,32 +840,21 @@ void PresetBundle::load_config_file_config(const std::string &name_or_path, bool
cfg.opt_string("compatible_prints_condition", true) = compatible_prints_condition_values[i];
cfg.opt_string("inherits", true) = inherits_values[i + 1];
// Load all filament presets, but only select the first one in the preset dialog.
- Preset *loaded = nullptr;
- if (is_external)
- loaded = &this->filaments.load_external_preset(name_or_path, name,
- (i < int(old_filament_profile_names->values.size())) ? old_filament_profile_names->values[i] : "",
- std::move(cfg), i == 0);
- else {
- // Used by the config wizard when creating a custom setup.
- // Therefore this block should only be called for a single extruder.
- char suffix[64];
- if (i == 0)
- suffix[0] = 0;
- else
- sprintf(suffix, "%d", (int)i);
- std::string new_name = name + suffix;
- loaded = &this->filaments.load_preset(this->filaments.path_from_name(new_name),
- new_name, std::move(cfg), i == 0);
- loaded->save();
- }
+ auto [loaded, modified] = this->filaments.load_external_preset(name_or_path, name,
+ (i < int(old_filament_profile_names->values.size())) ? old_filament_profile_names->values[i] : "",
+ std::move(cfg),
+ i == 0 ?
+ PresetCollection::LoadAndSelect::Always :
+ any_modified ?
+ PresetCollection::LoadAndSelect::Never :
+ PresetCollection::LoadAndSelect::OnlyIfModified);
+ any_modified |= modified;
this->filament_presets[i] = loaded->name;
}
}
// 4) Load the project config values (the per extruder wipe matrix etc).
this->project_config.apply_only(config, s_project_options);
- update_custom_gcode_per_print_z_from_config(GUI::wxGetApp().plater()->model().custom_gcode_per_print_z, &this->project_config);
-
break;
}
case ptSLA:
@@ -893,10 +862,23 @@ void PresetBundle::load_config_file_config(const std::string &name_or_path, bool
load_preset(this->sla_materials, 1, "sla_material_settings_id");
load_preset(this->printers, 2, "printer_settings_id");
break;
- default: break;
+ default:
+ break;
}
this->update_compatible(PresetSelectCompatibleType::Never);
+
+ const std::string &physical_printer = config.option<ConfigOptionString>("physical_printer_settings_id", true)->value;
+ if (this->printers.get_edited_preset().is_external || physical_printer.empty()) {
+ this->physical_printers.unselect_printer();
+ } else {
+ // Activate the physical printer profile if possible.
+ PhysicalPrinter *pp = this->physical_printers.find_printer(physical_printer, true);
+ if (pp != nullptr && std::find(pp->preset_names.begin(), pp->preset_names.end(), this->printers.get_edited_preset().name) != pp->preset_names.end())
+ this->physical_printers.select_printer(pp->name, this->printers.get_edited_preset().name);
+ else
+ this->physical_printers.unselect_printer();
+ }
}
// Load the active configuration of a config bundle from a boost property_tree. This is a private method called from load_config_file.
@@ -971,8 +953,6 @@ static void flatten_configbundle_hierarchy(boost::property_tree::ptree &tree, co
{
namespace pt = boost::property_tree;
- typedef std::pair<pt::ptree::key_type, pt::ptree> ptree_child_type;
-
// 1) For the group given by group_name, initialize the presets.
struct Prst {
Prst(const std::string &name, pt::ptree *node) : name(name), node(node) {}
@@ -1115,7 +1095,11 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla
namespace pt = boost::property_tree;
pt::ptree tree;
boost::nowide::ifstream ifs(path);
- pt::read_ini(ifs, tree);
+ try {
+ pt::read_ini(ifs, tree);
+ } catch (const boost::property_tree::ini_parser::ini_parser_error &err) {
+ throw Slic3r::RuntimeError(format("Failed loading config bundle \"%1%\"\nError: \"%2%\" at line %3%", path, err.message(), err.line()).c_str());
+ }
const VendorProfile *vendor_profile = nullptr;
if (flags & (LOAD_CFGBNDLE_SYSTEM | LOAD_CFGBUNDLE_VENDOR_ONLY)) {
@@ -1145,16 +1129,22 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla
std::vector<std::string> loaded_sla_prints;
std::vector<std::string> loaded_sla_materials;
std::vector<std::string> loaded_printers;
+ std::vector<std::string> loaded_physical_printers;
std::string active_print;
std::vector<std::string> active_filaments;
std::string active_sla_print;
std::string active_sla_material;
std::string active_printer;
+ std::string active_physical_printer;
size_t presets_loaded = 0;
+ size_t ph_printers_loaded = 0;
+
for (const auto &section : tree) {
PresetCollection *presets = nullptr;
std::vector<std::string> *loaded = nullptr;
std::string preset_name;
+ PhysicalPrinterCollection *ph_printers = nullptr;
+ std::string ph_printer_name;
if (boost::starts_with(section.first, "print:")) {
presets = &this->prints;
loaded = &loaded_prints;
@@ -1175,6 +1165,10 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla
presets = &this->printers;
loaded = &loaded_printers;
preset_name = section.first.substr(8);
+ } else if (boost::starts_with(section.first, "physical_printer:")) {
+ ph_printers = &this->physical_printers;
+ loaded = &loaded_physical_printers;
+ ph_printer_name = section.first.substr(17);
} else if (section.first == "presets") {
// Load the names of the active presets.
for (auto &kvp : section.second) {
@@ -1193,6 +1187,8 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla
active_sla_material = kvp.second.data();
} else if (kvp.first == "printer") {
active_printer = kvp.second.data();
+ }else if (kvp.first == "physical_printer") {
+ active_physical_printer = kvp.second.data();
}
}
} else if (section.first == "obsolete_presets") {
@@ -1332,7 +1328,7 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla
// Derive the profile logical name aka alias from the preset name if the alias was not stated explicitely.
if (alias_name.empty()) {
- int end_pos = preset_name.find_first_of("@");
+ size_t end_pos = preset_name.find_first_of("@");
if (end_pos != std::string::npos) {
alias_name = preset_name.substr(0, end_pos);
if (renamed_from.empty())
@@ -1349,9 +1345,46 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla
++ presets_loaded;
}
+
+ if (ph_printers != nullptr) {
+ // Load the physical printer
+ const DynamicPrintConfig& default_config = ph_printers->default_config();
+ DynamicPrintConfig config = default_config;
+
+ for (auto& kvp : section.second)
+ config.set_deserialize(kvp.first, kvp.second.data());
+
+ // Report configuration fields, which are misplaced into a wrong group.
+ std::string incorrect_keys = Preset::remove_invalid_keys(config, default_config);
+ if (!incorrect_keys.empty())
+ BOOST_LOG_TRIVIAL(error) << "Error in a Vendor Config Bundle \"" << path << "\": The physical printer \"" <<
+ section.first << "\" contains the following incorrect keys: " << incorrect_keys << ", which were removed";
+
+ const PhysicalPrinter* ph_printer_existing = ph_printers->find_printer(ph_printer_name, false);
+ if (ph_printer_existing != nullptr) {
+ BOOST_LOG_TRIVIAL(error) << "Error in a Vendor Config Bundle \"" << path << "\": The physical printer \"" <<
+ section.first << "\" has already been loaded from another Confing Bundle.";
+ continue;
+ }
+
+ // Decide a full path to this .ini file.
+ auto file_name = boost::algorithm::iends_with(ph_printer_name, ".ini") ? ph_printer_name : ph_printer_name + ".ini";
+ auto file_path = (boost::filesystem::path(data_dir())
+#ifdef SLIC3R_PROFILE_USE_PRESETS_SUBDIR
+ // Store the physical printers into a "presets" directory.
+ / "presets"
+#else
+ // Store the physical printers at the same location as the upstream Slic3r.
+#endif
+ / "physical_printer" / file_name).make_preferred();
+ // Load the preset into the list of presets, save it to disk.
+ ph_printers->load_printer(file_path.string(), ph_printer_name, std::move(config), false, flags & LOAD_CFGBNDLE_SAVE);
+
+ ++ph_printers_loaded;
+ }
}
- // 3) Activate the presets.
+ // 3) Activate the presets and physical printer if any exists.
if ((flags & LOAD_CFGBNDLE_SYSTEM) == 0) {
if (! active_print.empty())
prints.select_preset_by_name(active_print, true);
@@ -1361,6 +1394,8 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla
sla_materials.select_preset_by_name(active_sla_material, true);
if (! active_printer.empty())
printers.select_preset_by_name(active_printer, true);
+ if (! active_physical_printer.empty())
+ physical_printers.select_printer(active_physical_printer, active_printer);
// Activate the first filament preset.
if (! active_filaments.empty() && ! active_filaments.front().empty())
filaments.select_preset_by_name(active_filaments.front(), true);
@@ -1370,7 +1405,7 @@ size_t PresetBundle::load_configbundle(const std::string &path, unsigned int fla
this->update_compatible(PresetSelectCompatibleType::Never);
}
- return presets_loaded;
+ return presets_loaded + ph_printers_loaded;
}
void PresetBundle::update_multi_material_filament_presets()
@@ -1420,50 +1455,132 @@ void PresetBundle::update_compatible(PresetSelectCompatibleType select_other_pri
const Preset &printer_preset = this->printers.get_edited_preset();
const PresetWithVendorProfile printer_preset_with_vendor_profile = this->printers.get_preset_with_vendor_profile(printer_preset);
+ class PreferedProfileMatch
+ {
+ public:
+ PreferedProfileMatch(const std::string &prefered_alias, const std::string &prefered_name) :
+ m_prefered_alias(prefered_alias), m_prefered_name(prefered_name) {}
+
+ int operator()(const Preset &preset) const
+ {
+ return (! m_prefered_alias.empty() && m_prefered_alias == preset.alias) ?
+ // Matching an alias, always take this preset with priority.
+ std::numeric_limits<int>::max() :
+ // Otherwise take the prefered profile, or the first compatible.
+ preset.name == m_prefered_name;
+ }
+
+ private:
+ const std::string m_prefered_alias;
+ const std::string &m_prefered_name;
+ };
+
+ // Matching by the layer height in addition.
+ class PreferedPrintProfileMatch : public PreferedProfileMatch
+ {
+ public:
+ PreferedPrintProfileMatch(const Preset &preset, const std::string &prefered_name) :
+ PreferedProfileMatch(preset.alias, prefered_name), m_prefered_layer_height(preset.config.opt_float("layer_height")) {}
+
+ int operator()(const Preset &preset) const
+ {
+ int match_quality = PreferedProfileMatch::operator()(preset);
+ if (match_quality < std::numeric_limits<int>::max()) {
+ match_quality += 1;
+ if (m_prefered_layer_height > 0. && std::abs(preset.config.opt_float("layer_height") - m_prefered_layer_height) < 0.0005)
+ match_quality *= 10;
+ }
+ return match_quality;
+ }
+
+ private:
+ const double m_prefered_layer_height;
+ };
+
+ // Matching by the layer height in addition.
+ class PreferedFilamentProfileMatch : public PreferedProfileMatch
+ {
+ public:
+ PreferedFilamentProfileMatch(const Preset *preset, const std::string &prefered_name) :
+ PreferedProfileMatch(preset ? preset->alias : std::string(), prefered_name),
+ m_prefered_filament_type(preset ? preset->config.opt_string("filament_type", 0) : std::string()) {}
+
+ int operator()(const Preset &preset) const
+ {
+ int match_quality = PreferedProfileMatch::operator()(preset);
+ if (match_quality < std::numeric_limits<int>::max()) {
+ match_quality += 1;
+ if (! m_prefered_filament_type.empty() && m_prefered_filament_type == preset.config.opt_string("filament_type", 0))
+ match_quality *= 10;
+ }
+ return match_quality;
+ }
+
+ private:
+ const std::string m_prefered_filament_type;
+ };
+
+ // Matching by the layer height in addition.
+ class PreferedFilamentsProfileMatch
+ {
+ public:
+ PreferedFilamentsProfileMatch(const Preset &preset, const std::vector<std::string> &prefered_names) :
+ m_prefered_alias(preset.alias),
+ m_prefered_filament_type(preset.config.opt_string("filament_type", 0)),
+ m_prefered_names(prefered_names)
+ {}
+
+ int operator()(const Preset &preset) const
+ {
+ if (! m_prefered_alias.empty() && m_prefered_alias == preset.alias)
+ // Matching an alias, always take this preset with priority.
+ return std::numeric_limits<int>::max();
+ int match_quality = (std::find(m_prefered_names.begin(), m_prefered_names.end(), preset.name) != m_prefered_names.end()) + 1;
+ if (! m_prefered_filament_type.empty() && m_prefered_filament_type == preset.config.opt_string("filament_type", 0))
+ match_quality *= 10;
+ return match_quality;
+ }
+
+ private:
+ const std::string m_prefered_alias;
+ const std::string m_prefered_filament_type;
+ const std::vector<std::string> &m_prefered_names;
+ };
+
switch (printer_preset.printer_technology()) {
case ptFFF:
{
assert(printer_preset.config.has("default_print_profile"));
assert(printer_preset.config.has("default_filament_profile"));
- const std::string &prefered_print_profile = printer_preset.config.opt_string("default_print_profile");
const std::vector<std::string> &prefered_filament_profiles = printer_preset.config.option<ConfigOptionStrings>("default_filament_profile")->values;
- prefered_print_profile.empty() ?
- this->prints.update_compatible(printer_preset_with_vendor_profile, nullptr, select_other_print_if_incompatible) :
- this->prints.update_compatible(printer_preset_with_vendor_profile, nullptr, select_other_print_if_incompatible,
- [&prefered_print_profile](const std::string& profile_name) { return profile_name == prefered_print_profile; });
+ this->prints.update_compatible(printer_preset_with_vendor_profile, nullptr, select_other_print_if_incompatible,
+ PreferedPrintProfileMatch(this->prints.get_edited_preset(), printer_preset.config.opt_string("default_print_profile")));
const PresetWithVendorProfile print_preset_with_vendor_profile = this->prints.get_edited_preset_with_vendor_profile();
// Remember whether the filament profiles were compatible before updating the filament compatibility.
std::vector<char> filament_preset_was_compatible(this->filament_presets.size(), false);
for (size_t idx = 0; idx < this->filament_presets.size(); ++ idx) {
- std::string &filament_name = this->filament_presets[idx];
- Preset *preset = this->filaments.find_preset(filament_name, false);
+ Preset *preset = this->filaments.find_preset(this->filament_presets[idx], false);
filament_preset_was_compatible[idx] = preset != nullptr && preset->is_compatible;
}
- prefered_filament_profiles.empty() ?
- this->filaments.update_compatible(printer_preset_with_vendor_profile, &print_preset_with_vendor_profile, select_other_filament_if_incompatible) :
- this->filaments.update_compatible(printer_preset_with_vendor_profile, &print_preset_with_vendor_profile, select_other_filament_if_incompatible,
- [&prefered_filament_profiles](const std::string& profile_name)
- { return std::find(prefered_filament_profiles.begin(), prefered_filament_profiles.end(), profile_name) != prefered_filament_profiles.end(); });
+ // First select a first compatible profile for the preset editor.
+ this->filaments.update_compatible(printer_preset_with_vendor_profile, &print_preset_with_vendor_profile, select_other_filament_if_incompatible,
+ PreferedFilamentsProfileMatch(this->filaments.get_edited_preset(), prefered_filament_profiles));
if (select_other_filament_if_incompatible != PresetSelectCompatibleType::Never) {
// Verify validity of the current filament presets.
+ const std::string prefered_filament_profile = prefered_filament_profiles.empty() ? std::string() : prefered_filament_profiles.front();
if (this->filament_presets.size() == 1) {
+ // The compatible profile should have been already selected for the preset editor. Just use it.
if (select_other_filament_if_incompatible == PresetSelectCompatibleType::Always || filament_preset_was_compatible.front())
this->filament_presets.front() = this->filaments.get_edited_preset().name;
} else {
for (size_t idx = 0; idx < this->filament_presets.size(); ++ idx) {
std::string &filament_name = this->filament_presets[idx];
Preset *preset = this->filaments.find_preset(filament_name, false);
- if (preset == nullptr || (! preset->is_compatible && (select_other_filament_if_incompatible == PresetSelectCompatibleType::Always || filament_preset_was_compatible[idx]))) {
+ if (preset == nullptr || (! preset->is_compatible && (select_other_filament_if_incompatible == PresetSelectCompatibleType::Always || filament_preset_was_compatible[idx])))
// Pick a compatible profile. If there are prefered_filament_profiles, use them.
- if (prefered_filament_profiles.empty())
- filament_name = this->filaments.first_compatible().name;
- else {
- const std::string &preferred = (idx < prefered_filament_profiles.size()) ?
- prefered_filament_profiles[idx] : prefered_filament_profiles.front();
- filament_name = this->filaments.first_compatible(
- [&preferred](const std::string& profile_name) { return profile_name == preferred; }).name;
- }
- }
+ filament_name = this->filaments.first_compatible(
+ PreferedFilamentProfileMatch(preset,
+ (idx < prefered_filament_profiles.size()) ? prefered_filament_profiles[idx] : prefered_filament_profile)).name;
}
}
}
@@ -1473,24 +1590,18 @@ void PresetBundle::update_compatible(PresetSelectCompatibleType select_other_pri
{
assert(printer_preset.config.has("default_sla_print_profile"));
assert(printer_preset.config.has("default_sla_material_profile"));
- const PresetWithVendorProfile sla_print_preset_with_vendor_profile = this->sla_prints.get_edited_preset_with_vendor_profile();
- const std::string &prefered_sla_print_profile = printer_preset.config.opt_string("default_sla_print_profile");
- (prefered_sla_print_profile.empty()) ?
- this->sla_prints.update_compatible(printer_preset_with_vendor_profile, nullptr, select_other_print_if_incompatible) :
- this->sla_prints.update_compatible(printer_preset_with_vendor_profile, nullptr, select_other_print_if_incompatible,
- [&prefered_sla_print_profile](const std::string& profile_name){ return profile_name == prefered_sla_print_profile; });
- const std::string &prefered_sla_material_profile = printer_preset.config.opt_string("default_sla_material_profile");
- prefered_sla_material_profile.empty() ?
- this->sla_materials.update_compatible(printer_preset_with_vendor_profile, &sla_print_preset_with_vendor_profile, select_other_filament_if_incompatible) :
- this->sla_materials.update_compatible(printer_preset_with_vendor_profile, &sla_print_preset_with_vendor_profile, select_other_filament_if_incompatible,
- [&prefered_sla_material_profile](const std::string& profile_name){ return profile_name == prefered_sla_material_profile; });
+ this->sla_prints.update_compatible(printer_preset_with_vendor_profile, nullptr, select_other_print_if_incompatible,
+ PreferedPrintProfileMatch(this->sla_prints.get_edited_preset(), printer_preset.config.opt_string("default_sla_print_profile")));
+ const PresetWithVendorProfile sla_print_preset_with_vendor_profile = this->sla_prints.get_edited_preset_with_vendor_profile();
+ this->sla_materials.update_compatible(printer_preset_with_vendor_profile, &sla_print_preset_with_vendor_profile, select_other_filament_if_incompatible,
+ PreferedProfileMatch(this->sla_materials.get_edited_preset().alias, printer_preset.config.opt_string("default_sla_material_profile")));
break;
}
default: break;
}
}
-void PresetBundle::export_configbundle(const std::string &path, bool export_system_settings)
+void PresetBundle::export_configbundle(const std::string &path, bool export_system_settings, bool export_physical_printers/* = false*/)
{
boost::nowide::ofstream c;
c.open(path, std::ios::out | std::ios::trunc);
@@ -1514,6 +1625,14 @@ void PresetBundle::export_configbundle(const std::string &path, bool export_syst
}
}
+ if (export_physical_printers) {
+ for (const PhysicalPrinter& ph_printer : this->physical_printers) {
+ c << std::endl << "[physical_printer:" << ph_printer.name << "]" << std::endl;
+ for (const std::string& opt_key : ph_printer.config.keys())
+ c << opt_key << " = " << ph_printer.config.opt_serialize(opt_key) << std::endl;
+ }
+ }
+
// Export the names of the active presets.
c << std::endl << "[presets]" << std::endl;
c << "print = " << this->prints.get_selected_preset_name() << std::endl;
@@ -1529,6 +1648,8 @@ void PresetBundle::export_configbundle(const std::string &path, bool export_syst
c << "filament" << suffix << " = " << this->filament_presets[i] << std::endl;
}
+ if (export_physical_printers && this->physical_printers.get_selected_idx() >= 0)
+ c << "physical_printer = " << this->physical_printers.get_selected_printer_name() << std::endl;
#if 0
// Export the following setting values from the provided setting repository.
static const char *settings_keys[] = { "autocenter" };
@@ -1544,207 +1665,11 @@ void PresetBundle::export_configbundle(const std::string &path, bool export_syst
// an optional "(modified)" suffix will be removed from the filament name.
void PresetBundle::set_filament_preset(size_t idx, const std::string &name)
{
- if (name.find_first_of(PresetCollection::separator_head()) == 0)
- return;
-
- if (idx >= filament_presets.size())
+ if (idx >= filament_presets.size())
filament_presets.resize(idx + 1, filaments.default_preset().name);
filament_presets[idx] = Preset::remove_suffix_modified(name);
}
-void PresetBundle::load_default_preset_bitmaps()
-{
- // Clear bitmap cache, before load new scaled default preset bitmaps
- m_bitmapCache->clear();
- this->prints.clear_bitmap_cache();
- this->sla_prints.clear_bitmap_cache();
- this->filaments.clear_bitmap_cache();
- this->sla_materials.clear_bitmap_cache();
- this->printers.clear_bitmap_cache();
-
- this->prints.load_bitmap_default("cog");
- this->sla_prints.load_bitmap_default("cog");
- this->filaments.load_bitmap_default("spool.png");
- this->sla_materials.load_bitmap_default("resin");
- this->printers.load_bitmap_default("printer");
- this->printers.load_bitmap_add("add.png");
- this->load_compatible_bitmaps();
-}
-
-void PresetBundle::update_plater_filament_ui(unsigned int idx_extruder, GUI::PresetComboBox *ui)
-{
- if (ui == nullptr || this->printers.get_edited_preset().printer_technology() == ptSLA ||
- this->filament_presets.size() <= idx_extruder )
- return;
-
- unsigned char rgb[3];
- std::string extruder_color = this->printers.get_edited_preset().config.opt_string("extruder_colour", idx_extruder);
- if (!m_bitmapCache->parse_color(extruder_color, rgb))
- // Extruder color is not defined.
- extruder_color.clear();
-
- // Fill in the list from scratch.
- ui->Freeze();
- ui->Clear();
- size_t selected_preset_item = INT_MAX; // some value meaning that no one item is selected
-
- const Preset *selected_preset = this->filaments.find_preset(this->filament_presets[idx_extruder]);
- // Show wide icons if the currently selected preset is not compatible with the current printer,
- // and draw a red flag in front of the selected preset.
- bool wide_icons = selected_preset != nullptr && ! selected_preset->is_compatible && m_bitmapIncompatible != nullptr;
- assert(selected_preset != nullptr);
- std::map<wxString, wxBitmap*> nonsys_presets;
- wxString selected_str = "";
- if (!this->filaments().front().is_visible)
- ui->set_label_marker(ui->Append(PresetCollection::separator(L("System presets")), wxNullBitmap));
-
- /* It's supposed that standard size of an icon is 16px*16px for 100% scaled display.
- * So set sizes for solid_colored icons used for filament preset
- * and scale them in respect to em_unit value
- */
- const float scale_f = ui->em_unit() * 0.1f;
-
- // To avoid the errors of number rounding for different combination of monitor configuration,
- // let use scaled 8px, as a smallest icon unit
- const int icon_unit = 8 * scale_f + 0.5f;
- const int normal_icon_width = 2 * icon_unit; //16 * scale_f + 0.5f;
- const int thin_icon_width = icon_unit; //8 * scale_f + 0.5f;
- const int wide_icon_width = 3 * icon_unit; //24 * scale_f + 0.5f;
-
- const int space_icon_width = 2 * scale_f + 0.5f;
-
- // To avoid asserts, each added bitmap to wxBitmapCombobox should be the same size, so
- // set a bitmap height to m_bitmapLock->GetHeight()
- //
- // To avoid asserts, each added bitmap to wxBitmapCombobox should be the same size.
- // But for some display scaling (for example 125% or 175%) normal_icon_width differs from icon width.
- // So:
- // for nonsystem presets set a width of empty bitmap to m_bitmapLock->GetWidth()
- // for compatible presets set a width of empty bitmap to m_bitmapIncompatible->GetWidth()
- //
- // Note, under OSX we should use a Scaled Height/Width because of Retina scale
-#ifdef __APPLE__
- const int icon_height = m_bitmapLock->GetScaledHeight();
- const int lock_icon_width = m_bitmapLock->GetScaledWidth();
- const int flag_icon_width = m_bitmapIncompatible->GetScaledWidth();
-#else
- const int icon_height = m_bitmapLock->GetHeight();
- const int lock_icon_width = m_bitmapLock->GetWidth();
- const int flag_icon_width = m_bitmapIncompatible->GetWidth();
-#endif
-
- wxString tooltip = "";
-
- for (int i = this->filaments().front().is_visible ? 0 : 1; i < int(this->filaments().size()); ++i) {
- const Preset &preset = this->filaments.preset(i);
- bool selected = this->filament_presets[idx_extruder] == preset.name;
- if (! preset.is_visible || (! preset.is_compatible && ! selected))
- continue;
- // Assign an extruder color to the selected item if the extruder color is defined.
- std::string filament_rgb = preset.config.opt_string("filament_colour", 0);
- std::string extruder_rgb = (selected && !extruder_color.empty()) ? extruder_color : filament_rgb;
- bool single_bar = filament_rgb == extruder_rgb;
- std::string bitmap_key = single_bar ? filament_rgb : filament_rgb + extruder_rgb;
- // If the filament preset is not compatible and there is a "red flag" icon loaded, show it left
- // to the filament color image.
- if (wide_icons)
- bitmap_key += preset.is_compatible ? ",cmpt" : ",ncmpt";
- bitmap_key += (preset.is_system || preset.is_default) ? ",syst" : ",nsyst";
- if (preset.is_dirty)
- bitmap_key += ",drty";
- wxBitmap *bitmap = m_bitmapCache->find(bitmap_key);
- if (bitmap == nullptr) {
- // Create the bitmap with color bars.
- std::vector<wxBitmap> bmps;
- if (wide_icons)
- // Paint a red flag for incompatible presets.
- bmps.emplace_back(preset.is_compatible ? m_bitmapCache->mkclear(flag_icon_width, icon_height) : *m_bitmapIncompatible);
- // Paint the color bars.
- m_bitmapCache->parse_color(filament_rgb, rgb);
- bmps.emplace_back(m_bitmapCache->mksolid(single_bar ? wide_icon_width : normal_icon_width, icon_height, rgb));
- if (! single_bar) {
- m_bitmapCache->parse_color(extruder_rgb, rgb);
- bmps.emplace_back(m_bitmapCache->mksolid(thin_icon_width, icon_height, rgb));
- }
- // Paint a lock at the system presets.
- bmps.emplace_back(m_bitmapCache->mkclear(space_icon_width, icon_height));
- bmps.emplace_back((preset.is_system || preset.is_default) ? *m_bitmapLock : m_bitmapCache->mkclear(lock_icon_width, icon_height));
-// (preset.is_dirty ? *m_bitmapLockOpen : *m_bitmapLock) : m_bitmapCache->mkclear(16, 16));
- bitmap = m_bitmapCache->insert(bitmap_key, bmps);
- }
-
- const std::string name = preset.alias.empty() ? preset.name : preset.alias;
- if (preset.is_default || preset.is_system) {
- ui->Append(wxString::FromUTF8((/*preset.*/name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()),
- (bitmap == 0) ? wxNullBitmap : *bitmap);
- if (selected ||
- // just in case: mark selected_preset_item as a first added element
- selected_preset_item == INT_MAX ) {
- selected_preset_item = ui->GetCount() - 1;
- tooltip = wxString::FromUTF8(preset.name.c_str());
- }
- }
- else
- {
- nonsys_presets.emplace(wxString::FromUTF8((/*preset.*/name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()),
- (bitmap == 0) ? &wxNullBitmap : bitmap);
- if (selected) {
- selected_str = wxString::FromUTF8((/*preset.*/name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str());
- tooltip = wxString::FromUTF8(preset.name.c_str());
- }
- }
- if (preset.is_default)
- ui->set_label_marker(ui->Append(PresetCollection::separator(L("System presets")), wxNullBitmap));
- }
-
- if (!nonsys_presets.empty())
- {
- ui->set_label_marker(ui->Append(PresetCollection::separator(L("User presets")), wxNullBitmap));
- for (std::map<wxString, wxBitmap*>::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) {
- ui->Append(it->first, *it->second);
- if (it->first == selected_str ||
- // just in case: mark selected_preset_item as a first added element
- selected_preset_item == INT_MAX) {
- selected_preset_item = ui->GetCount() - 1;
- }
- }
- }
-
- std::string bitmap_key = "";
- if (wide_icons)
- bitmap_key += "wide,";
- bitmap_key += "edit_preset_list";
- wxBitmap* bmp = m_bitmapCache->find(bitmap_key);
- if (bmp == nullptr) {
- // Create the bitmap with color bars.
- std::vector<wxBitmap> bmps;
- if (wide_icons)
- // Paint a red flag for incompatible presets.
- bmps.emplace_back(m_bitmapCache->mkclear(flag_icon_width, icon_height));
- // Paint the color bars + a lock at the system presets.
- bmps.emplace_back(m_bitmapCache->mkclear(wide_icon_width+space_icon_width, icon_height));
- bmps.emplace_back(create_scaled_bitmap("edit_uni"));
- bmp = m_bitmapCache->insert(bitmap_key, bmps);
- }
- ui->set_label_marker(ui->Append(PresetCollection::separator(L("Add/Remove filaments")), *bmp), GUI::PresetComboBox::LABEL_ITEM_WIZARD_FILAMENTS);
-
- /* But, if selected_preset_item is still equal to INT_MAX, it means that
- * there is no presets added to the list.
- * So, select last combobox item ("Add/Remove filaments")
- */
- if (selected_preset_item == INT_MAX)
- selected_preset_item = ui->GetCount() - 1;
-
- ui->SetSelection(selected_preset_item);
- ui->SetToolTip(tooltip.IsEmpty() ? ui->GetString(selected_preset_item) : tooltip);
- ui->check_selection();
- ui->Thaw();
-
- // Update control min size after rescale (changed Display DPI under MSW)
- if (ui->GetMinWidth() != 20 * ui->em_unit())
- ui->SetMinSize(wxSize(20 * ui->em_unit(), ui->GetSize().GetHeight()));
-}
-
void PresetBundle::set_default_suppressed(bool default_suppressed)
{
prints.set_default_suppressed(default_suppressed);
diff --git a/src/slic3r/GUI/PresetBundle.hpp b/src/libslic3r/PresetBundle.hpp
index bf1bba21d..5d7cc84ba 100644
--- a/src/slic3r/GUI/PresetBundle.hpp
+++ b/src/libslic3r/PresetBundle.hpp
@@ -1,22 +1,15 @@
#ifndef slic3r_PresetBundle_hpp_
#define slic3r_PresetBundle_hpp_
-#include "AppConfig.hpp"
#include "Preset.hpp"
+#include "AppConfig.hpp"
#include <memory>
-#include <set>
#include <unordered_map>
#include <boost/filesystem/path.hpp>
-class wxWindow;
-
namespace Slic3r {
-namespace GUI {
- class BitmapCache;
-};
-
// Bundle of Print + Filament + Printer presets.
class PresetBundle
{
@@ -45,6 +38,7 @@ public:
PresetCollection& materials(PrinterTechnology pt) { return pt == ptFFF ? this->filaments : this->sla_materials; }
const PresetCollection& materials(PrinterTechnology pt) const { return pt == ptFFF ? this->filaments : this->sla_materials; }
PrinterPresetCollection printers;
+ PhysicalPrinterCollection physical_printers;
// Filament preset names for a multi-extruder or multi-material print.
// extruders.size() should be the same as printers.get_edited_preset().config.nozzle_diameter.size()
std::vector<std::string> filament_presets;
@@ -76,7 +70,7 @@ public:
// Load user configuration and store it into the user profiles.
// This method is called by the configuration wizard.
- void load_config(const std::string &name, DynamicPrintConfig config)
+ void load_config_from_wizard(const std::string &name, DynamicPrintConfig config)
{ this->load_config_file_config(name, false, std::move(config)); }
// Load configuration that comes from a model file containing configuration, such as 3MF et al.
@@ -108,10 +102,7 @@ public:
size_t load_configbundle(const std::string &path, unsigned int flags = LOAD_CFGBNDLE_SAVE);
// Export a config bundle file containing all the presets and the names of the active presets.
- void export_configbundle(const std::string &path, bool export_system_settings = false);
-
- // Update a filament selection combo box on the plater for an idx_extruder.
- void update_plater_filament_ui(unsigned int idx_extruder, GUI::PresetComboBox *ui);
+ void export_configbundle(const std::string &path, bool export_system_settings = false, bool export_physical_printers = false);
// Enable / disable the "- default -" preset.
void set_default_suppressed(bool default_suppressed);
@@ -132,8 +123,6 @@ public:
void update_compatible(PresetSelectCompatibleType select_other_print_if_incompatible, PresetSelectCompatibleType select_other_filament_if_incompatible);
void update_compatible(PresetSelectCompatibleType select_other_if_incompatible) { this->update_compatible(select_other_if_incompatible, select_other_if_incompatible); }
- void load_default_preset_bitmaps();
-
// Set the is_visible flag for printer vendors, printer models and printer variants
// based on the user configuration.
// If the "vendor" section is missing, enable all models and variants of the particular vendor.
@@ -141,6 +130,10 @@ public:
const std::string& get_preset_name_by_alias(const Preset::Type& preset_type, const std::string& alias) const;
+ // Save current preset of a required type under a new name. If the name is different from the old one,
+ // Unselected option would be reverted to the beginning values
+ void save_changes_for_preset(const std::string& new_name, Preset::Type type, const std::vector<std::string>& unselected_options);
+
static const char *PRUSA_BUNDLE;
private:
std::string load_system_presets();
@@ -163,21 +156,9 @@ private:
// If it is not an external config, then the config will be stored into the user profile directory.
void load_config_file_config(const std::string &name_or_path, bool is_external, DynamicPrintConfig &&config);
void load_config_file_config_bundle(const std::string &path, const boost::property_tree::ptree &tree);
- void load_compatible_bitmaps();
DynamicPrintConfig full_fff_config() const;
DynamicPrintConfig full_sla_config() const;
-
- // Indicator, that the preset is compatible with the selected printer.
- wxBitmap *m_bitmapCompatible;
- // Indicator, that the preset is NOT compatible with the selected printer.
- wxBitmap *m_bitmapIncompatible;
- // Indicator, that the preset is system and not modified.
- wxBitmap *m_bitmapLock;
- // Indicator, that the preset is system and user modified.
- wxBitmap *m_bitmapLockOpen;
- // Caching color bitmaps for the filament combo box.
- GUI::BitmapCache *m_bitmapCache;
};
} // namespace Slic3r
diff --git a/src/libslic3r/Print.cpp b/src/libslic3r/Print.cpp
index b967e8aa2..693c4e5be 100644
--- a/src/libslic3r/Print.cpp
+++ b/src/libslic3r/Print.cpp
@@ -1,5 +1,6 @@
#include "clipper/clipper_z.hpp"
+#include "Exception.hpp"
#include "Print.hpp"
#include "BoundingBox.hpp"
#include "ClipperUtils.hpp"
@@ -9,6 +10,7 @@
#include "I18N.hpp"
#include "ShortestPath.hpp"
#include "SupportMaterial.hpp"
+#include "Thread.hpp"
#include "GCode.hpp"
#include "GCode/WipeTower.hpp"
#include "Utils.hpp"
@@ -69,6 +71,7 @@ bool Print::invalidate_state_by_config_options(const std::vector<t_config_option
// or they are only notes not influencing the generated G-code.
static std::unordered_set<std::string> steps_gcode = {
"avoid_crossing_perimeters",
+ "avoid_crossing_perimeters_max_detour",
"bed_shape",
"bed_temperature",
"before_layer_gcode",
@@ -91,11 +94,13 @@ bool Print::invalidate_state_by_config_options(const std::vector<t_config_option
"extrusion_multiplier",
"fan_always_on",
"fan_below_layer_time",
+ "full_fan_speed_layer",
"filament_colour",
"filament_diameter",
"filament_density",
"filament_notes",
"filament_cost",
+ "filament_spool_weight",
"first_layer_acceleration",
"first_layer_bed_temperature",
"first_layer_speed",
@@ -244,7 +249,6 @@ bool Print::invalidate_step(PrintStep step)
{
bool invalidated = Inherited::invalidate_step(step);
// Propagate to dependent steps.
- //FIXME Why should skirt invalidate brim? Shouldn't it be vice versa?
if (step == psSkirt)
invalidated |= Inherited::invalidate_step(psBrim);
if (step != psGCodeExport)
@@ -403,7 +407,11 @@ static inline void model_volume_list_copy_configs(ModelObject &model_object_dst,
assert(mv_src.id() == mv_dst.id());
// Copy the ModelVolume data.
mv_dst.name = mv_src.name;
- static_cast<DynamicPrintConfig&>(mv_dst.config) = static_cast<const DynamicPrintConfig&>(mv_src.config);
+ mv_dst.config.assign_config(mv_src.config);
+ assert(mv_dst.supported_facets.id() == mv_src.supported_facets.id());
+ mv_dst.supported_facets.assign(mv_src.supported_facets);
+ assert(mv_dst.seam_facets.id() == mv_src.seam_facets.id());
+ mv_dst.seam_facets.assign(mv_src.seam_facets);
//FIXME what to do with the materials?
// mv_dst.m_material_id = mv_src.m_material_id;
++ i_src;
@@ -499,12 +507,12 @@ static bool custom_per_printz_gcodes_tool_changes_differ(const std::vector<Custo
auto it_a = va.begin();
auto it_b = vb.begin();
while (it_a != va.end() || it_b != vb.end()) {
- if (it_a != va.end() && it_a->gcode != ToolChangeCode) {
+ if (it_a != va.end() && it_a->type != CustomGCode::ToolChange) {
// Skip any CustomGCode items, which are not tool changes.
++ it_a;
continue;
}
- if (it_b != vb.end() && it_b->gcode != ToolChangeCode) {
+ if (it_b != vb.end() && it_b->type != CustomGCode::ToolChange) {
// Skip any CustomGCode items, which are not tool changes.
++ it_b;
continue;
@@ -512,8 +520,8 @@ static bool custom_per_printz_gcodes_tool_changes_differ(const std::vector<Custo
if (it_a == va.end() || it_b == vb.end())
// va or vb contains more Tool Changes than the other.
return true;
- assert(it_a->gcode == ToolChangeCode);
- assert(it_b->gcode == ToolChangeCode);
+ assert(it_a->type == CustomGCode::ToolChange);
+ assert(it_b->type == CustomGCode::ToolChange);
if (*it_a != *it_b)
// The two Tool Changes differ.
return true;
@@ -573,6 +581,16 @@ void Print::config_diffs(
}
}
+std::vector<ObjectID> Print::print_object_ids() const
+{
+ std::vector<ObjectID> out;
+ // Reserve one more for the caller to append the ID of the Print itself.
+ out.reserve(m_objects.size() + 1);
+ for (const PrintObject *print_object : m_objects)
+ out.emplace_back(print_object->id());
+ return out;
+}
+
Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_config)
{
#ifdef _DEBUG
@@ -580,10 +598,11 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_
#endif /* _DEBUG */
// Normalize the config.
- new_full_config.option("print_settings_id", true);
- new_full_config.option("filament_settings_id", true);
- new_full_config.option("printer_settings_id", true);
- new_full_config.normalize();
+ new_full_config.option("print_settings_id", true);
+ new_full_config.option("filament_settings_id", true);
+ new_full_config.option("printer_settings_id", true);
+ new_full_config.option("physical_printer_settings_id", true);
+ new_full_config.normalize_fdm();
// Find modified keys of the various configs. Resolve overrides extruder retract values by filament profiles.
t_config_option_keys print_diff, object_diff, region_diff, full_config_diff;
@@ -611,9 +630,10 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_
if (! full_config_diff.empty()) {
update_apply_status(this->invalidate_step(psGCodeExport));
// Set the profile aliases for the PrintBase::output_filename()
- m_placeholder_parser.set("print_preset", new_full_config.option("print_settings_id")->clone());
- m_placeholder_parser.set("filament_preset", new_full_config.option("filament_settings_id")->clone());
- m_placeholder_parser.set("printer_preset", new_full_config.option("printer_settings_id")->clone());
+ m_placeholder_parser.set("print_preset", new_full_config.option("print_settings_id")->clone());
+ m_placeholder_parser.set("filament_preset", new_full_config.option("filament_settings_id")->clone());
+ m_placeholder_parser.set("printer_preset", new_full_config.option("printer_settings_id")->clone());
+ m_placeholder_parser.set("physical_printer_preset", new_full_config.option("physical_printer_settings_id")->clone());
// We want the filament overrides to be applied over their respective extruder parameters by the PlaceholderParser.
// see "Placeholders do not respect filament overrides." GH issue #3649
m_placeholder_parser.apply_config(filament_overrides);
@@ -642,7 +662,7 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_
m_ranges.reserve(in.size());
// Input ranges are sorted lexicographically. First range trims the other ranges.
coordf_t last_z = 0;
- for (const std::pair<const t_layer_height_range, DynamicPrintConfig> &range : in)
+ for (const std::pair<const t_layer_height_range, ModelConfig> &range : in)
if (range.first.second > last_z) {
coordf_t min_z = std::max(range.first.first, 0.);
if (min_z > last_z + EPSILON) {
@@ -650,7 +670,7 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_
last_z = min_z;
}
if (range.first.second > last_z + EPSILON) {
- const DynamicPrintConfig* cfg = &range.second;
+ const DynamicPrintConfig *cfg = &range.second.get();
m_ranges.emplace_back(t_layer_height_range(last_z, range.first.second), cfg);
last_z = range.first.second;
}
@@ -840,11 +860,11 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_
// Only volume IDs, volume types, transformation matrices and their order are checked, configuration and other parameters are NOT checked.
bool model_parts_differ = model_volume_list_changed(model_object, model_object_new, ModelVolumeType::MODEL_PART);
bool modifiers_differ = model_volume_list_changed(model_object, model_object_new, ModelVolumeType::PARAMETER_MODIFIER);
- bool support_blockers_differ = model_volume_list_changed(model_object, model_object_new, ModelVolumeType::SUPPORT_BLOCKER);
- bool support_enforcers_differ = model_volume_list_changed(model_object, model_object_new, ModelVolumeType::SUPPORT_ENFORCER);
+ bool supports_differ = model_volume_list_changed(model_object, model_object_new, ModelVolumeType::SUPPORT_BLOCKER) ||
+ model_volume_list_changed(model_object, model_object_new, ModelVolumeType::SUPPORT_ENFORCER);
if (model_parts_differ || modifiers_differ ||
- model_object.origin_translation != model_object_new.origin_translation ||
- model_object.layer_height_profile != model_object_new.layer_height_profile ||
+ model_object.origin_translation != model_object_new.origin_translation ||
+ ! model_object.layer_height_profile.timestamp_matches(model_object_new.layer_height_profile) ||
! layer_height_ranges_equal(model_object.layer_config_ranges, model_object_new.layer_config_ranges, model_object_new.layer_height_profile.empty())) {
// The very first step (the slicing step) is invalidated. One may freely remove all associated PrintObjects.
auto range = print_object_status.equal_range(PrintObjectStatus(model_object.id()));
@@ -854,22 +874,28 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_
}
// Copy content of the ModelObject including its ID, do not change the parent.
model_object.assign_copy(model_object_new);
- } else if (support_blockers_differ || support_enforcers_differ) {
+ } else if (supports_differ || model_custom_supports_data_changed(model_object, model_object_new)) {
// First stop background processing before shuffling or deleting the ModelVolumes in the ModelObject's list.
- this->call_cancel_callback();
- update_apply_status(false);
+ if (supports_differ) {
+ this->call_cancel_callback();
+ update_apply_status(false);
+ }
// Invalidate just the supports step.
auto range = print_object_status.equal_range(PrintObjectStatus(model_object.id()));
for (auto it = range.first; it != range.second; ++ it)
update_apply_status(it->print_object->invalidate_step(posSupportMaterial));
- // Copy just the support volumes.
- model_volume_list_update_supports(model_object, model_object_new);
+ if (supports_differ) {
+ // Copy just the support volumes.
+ model_volume_list_update_supports(model_object, model_object_new);
+ }
+ } else if (model_custom_seam_data_changed(model_object, model_object_new)) {
+ update_apply_status(this->invalidate_step(psGCodeExport));
}
if (! model_parts_differ && ! modifiers_differ) {
// Synchronize Object's config.
- bool object_config_changed = model_object.config != model_object_new.config;
+ bool object_config_changed = ! model_object.config.timestamp_matches(model_object_new.config);
if (object_config_changed)
- static_cast<DynamicPrintConfig&>(model_object.config) = static_cast<const DynamicPrintConfig&>(model_object_new.config);
+ model_object.config.assign_config(model_object_new.config);
if (! object_diff.empty() || object_config_changed || num_extruders_changed) {
PrintObjectConfig new_config = PrintObject::object_config_from_model_object(m_default_object_config, model_object, num_extruders);
auto range = print_object_status.equal_range(PrintObjectStatus(model_object.id()));
@@ -881,7 +907,7 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_
}
}
}
- // Synchronize (just copy) the remaining data of ModelVolumes (name, config).
+ // Synchronize (just copy) the remaining data of ModelVolumes (name, config, custom supports data).
//FIXME What to do with m_material_id?
model_volume_list_copy_configs(model_object /* dst */, model_object_new /* src */, ModelVolumeType::MODEL_PART);
model_volume_list_copy_configs(model_object /* dst */, model_object_new /* src */, ModelVolumeType::PARAMETER_MODIFIER);
@@ -933,13 +959,20 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_
old.emplace_back(&(*it));
}
// Generate a list of trafos and XY offsets for instances of a ModelObject
- PrintObjectConfig config = PrintObject::object_config_from_model_object(m_default_object_config, *model_object, num_extruders);
+ // Producing the config for PrintObject on demand, caching it at print_object_last.
+ const PrintObject *print_object_last = nullptr;
+ auto print_object_apply_config = [this, &print_object_last, model_object, num_extruders](PrintObject* print_object) {
+ print_object->config_apply(print_object_last ?
+ print_object_last->config() :
+ PrintObject::object_config_from_model_object(m_default_object_config, *model_object, num_extruders));
+ print_object_last = print_object;
+ };
std::vector<PrintObjectTrafoAndInstances> new_print_instances = print_objects_from_model_object(*model_object);
if (old.empty()) {
// Simple case, just generate new instances.
for (PrintObjectTrafoAndInstances &print_instances : new_print_instances) {
PrintObject *print_object = new PrintObject(this, model_object, print_instances.trafo, std::move(print_instances.instances));
- print_object->config_apply(config);
+ print_object_apply_config(print_object);
print_objects_new.emplace_back(print_object);
// print_object_status.emplace(PrintObjectStatus(print_object, PrintObjectStatus::New));
new_objects = true;
@@ -956,7 +989,7 @@ Print::ApplyStatus Print::apply(const Model &model, DynamicPrintConfig new_full_
if (it_old == old.end() || ! transform3d_equal((*it_old)->trafo, new_instances.trafo)) {
// This is a new instance (or a set of instances with the same trafo). Just add it.
PrintObject *print_object = new PrintObject(this, model_object, new_instances.trafo, std::move(new_instances.instances));
- print_object->config_apply(config);
+ print_object_apply_config(print_object);
print_objects_new.emplace_back(print_object);
// print_object_status.emplace(PrintObjectStatus(print_object, PrintObjectStatus::New));
new_objects = true;
@@ -1191,9 +1224,9 @@ static inline bool sequential_print_horizontal_clearance_valid(const Print &prin
// instance.shift is a position of a centered object, while model object may not be centered.
// Conver the shift from the PrintObject's coordinates into ModelObject's coordinates by removing the centering offset.
convex_hull.translate(instance.shift - print_object->center_offset());
- if (! intersection(convex_hulls_other, convex_hull).empty())
+ if (! intersection(convex_hulls_other, (Polygons)convex_hull).empty())
return false;
- polygons_append(convex_hulls_other, convex_hull);
+ convex_hulls_other.emplace_back(std::move(convex_hull));
}
}
return true;
@@ -1233,7 +1266,8 @@ std::string Print::validate() const
total_copies_count += object->instances().size();
// #4043
if (total_copies_count > 1 && ! m_config.complete_objects.value)
- return L("The Spiral Vase option can only be used when printing a single object.");
+ return L("Only a single object may be printed at a time in Spiral Vase mode. "
+ "Either remove all but the last object, or enable sequential mode by \"complete_objects\".");
assert(m_objects.size() == 1);
size_t num_regions = 0;
for (const std::vector<std::pair<t_layer_height_range, int>> &volumes_per_region : m_objects.front()->region_volumes)
@@ -1257,8 +1291,9 @@ std::string Print::validate() const
"and use filaments of the same diameter.");
}
- if (m_config.gcode_flavor != gcfRepRap && m_config.gcode_flavor != gcfRepetier && m_config.gcode_flavor != gcfMarlin)
- return L("The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter and Repetier G-code flavors.");
+ if (m_config.gcode_flavor != gcfRepRapSprinter && m_config.gcode_flavor != gcfRepRapFirmware &&
+ m_config.gcode_flavor != gcfRepetier && m_config.gcode_flavor != gcfMarlin)
+ return L("The Wipe Tower is currently only supported for the Marlin, RepRap/Sprinter, RepRapFirmware and Repetier G-code flavors.");
if (! m_config.use_relative_e_distances)
return L("The Wipe Tower is currently only supported with the relative extruder addressing (use_relative_e_distances=1).");
if (m_config.ooze_prevention)
@@ -1501,7 +1536,7 @@ BoundingBox Print::total_bounding_box() const
double Print::skirt_first_layer_height() const
{
if (m_objects.empty())
- throw std::invalid_argument("skirt_first_layer_height() can't be called without PrintObjects");
+ throw Slic3r::InvalidArgument("skirt_first_layer_height() can't be called without PrintObjects");
return m_objects.front()->config().get_abs_value("first_layer_height");
}
@@ -1570,20 +1605,24 @@ void Print::auto_assign_extruders(ModelObject* model_object) const
ModelVolume *volume = model_object->volumes[volume_id];
//FIXME Vojtech: This assigns an extruder ID even to a modifier volume, if it has a material assigned.
if ((volume->is_model_part() || volume->is_modifier()) && ! volume->material_id().empty() && ! volume->config.has("extruder"))
- volume->config.opt<ConfigOptionInt>("extruder", true)->value = int(volume_id + 1);
+ volume->config.set("extruder", int(volume_id + 1));
}
}
// Slicing process, running at a background thread.
void Print::process()
{
- BOOST_LOG_TRIVIAL(info) << "Staring the slicing process." << log_memory_info();
+ name_tbb_thread_pool_threads();
+
+ BOOST_LOG_TRIVIAL(info) << "Starting the slicing process." << log_memory_info();
for (PrintObject *obj : m_objects)
obj->make_perimeters();
this->set_status(70, L("Infilling layers"));
for (PrintObject *obj : m_objects)
obj->infill();
for (PrintObject *obj : m_objects)
+ obj->ironing();
+ for (PrintObject *obj : m_objects)
obj->generate_support_material();
if (this->set_started(psWipeTower)) {
m_wipe_tower_data.clear();
@@ -1595,12 +1634,14 @@ void Print::process()
// Initialize the tool ordering, so it could be used by the G-code preview slider for planning tool changes and filament switches.
m_tool_ordering = ToolOrdering(*this, -1, false);
if (m_tool_ordering.empty() || m_tool_ordering.last_extruder() == unsigned(-1))
- throw std::runtime_error("The print is empty. The model is not printable with current print settings.");
+ throw Slic3r::SlicingError("The print is empty. The model is not printable with current print settings.");
}
this->set_done(psWipeTower);
}
if (this->set_started(psSkirt)) {
m_skirt.clear();
+ m_skirt_convex_hull.clear();
+ m_first_layer_convex_hull.points.clear();
if (this->has_skirt()) {
this->set_status(88, L("Generating skirt"));
this->_make_skirt();
@@ -1609,11 +1650,15 @@ void Print::process()
}
if (this->set_started(psBrim)) {
m_brim.clear();
+ m_first_layer_convex_hull.points.clear();
if (m_config.brim_width > 0) {
this->set_status(88, L("Generating brim"));
this->_make_brim();
}
- this->set_done(psBrim);
+ // Brim depends on skirt (brim lines are trimmed by the skirt lines), therefore if
+ // the skirt gets invalidated, brim gets invalidated as well and the following line is called.
+ this->finalize_first_layer_convex_hull();
+ this->set_done(psBrim);
}
BOOST_LOG_TRIVIAL(info) << "Slicing process finished." << log_memory_info();
}
@@ -1622,17 +1667,13 @@ void Print::process()
// The export_gcode may die for various reasons (fails to process output_filename_format,
// write error into the G-code, cannot execute post-processing scripts).
// It is up to the caller to show an error message.
-#if ENABLE_THUMBNAIL_GENERATOR
-std::string Print::export_gcode(const std::string& path_template, GCodePreviewData* preview_data, ThumbnailsGeneratorCallback thumbnail_cb)
-#else
-std::string Print::export_gcode(const std::string &path_template, GCodePreviewData *preview_data)
-#endif // ENABLE_THUMBNAIL_GENERATOR
+std::string Print::export_gcode(const std::string& path_template, GCodeProcessor::Result* result, ThumbnailsGeneratorCallback thumbnail_cb)
{
// output everything to a G-code file
// The following call may die if the output_filename_format template substitution fails.
std::string path = this->output_filepath(path_template);
std::string message;
- if (! path.empty() && preview_data == nullptr) {
+ if (!path.empty() && result == nullptr) {
// Only show the path if preview_data is not set -> running from command line.
message = L("Exporting G-code");
message += " to ";
@@ -1643,11 +1684,7 @@ std::string Print::export_gcode(const std::string &path_template, GCodePreviewDa
// The following line may die for multiple reasons.
GCode gcode;
-#if ENABLE_THUMBNAIL_GENERATOR
- gcode.do_export(this, path.c_str(), preview_data, thumbnail_cb);
-#else
- gcode.do_export(this, path.c_str(), preview_data);
-#endif // ENABLE_THUMBNAIL_GENERATOR
+ gcode.do_export(this, path.c_str(), result, thumbnail_cb);
return path.c_str();
}
@@ -1700,22 +1737,7 @@ void Print::_make_skirt()
}
// Include the wipe tower.
- if (has_wipe_tower() && ! m_wipe_tower_data.tool_changes.empty()) {
- double width = m_config.wipe_tower_width + 2*m_wipe_tower_data.brim_width;
- double depth = m_wipe_tower_data.depth + 2*m_wipe_tower_data.brim_width;
- Vec2d pt = Vec2d(-m_wipe_tower_data.brim_width, -m_wipe_tower_data.brim_width);
-
- std::vector<Vec2d> pts;
- pts.push_back(Vec2d(pt.x(), pt.y()));
- pts.push_back(Vec2d(pt.x()+width, pt.y()));
- pts.push_back(Vec2d(pt.x()+width, pt.y()+depth));
- pts.push_back(Vec2d(pt.x(), pt.y()+depth));
- for (Vec2d& pt : pts) {
- pt = Eigen::Rotation2Dd(Geometry::deg2rad(m_config.wipe_tower_rotation_angle.value)) * pt;
- pt += Vec2d(m_config.wipe_tower_x.value, m_config.wipe_tower_y.value);
- points.push_back(Point(scale_(pt.x()), scale_(pt.y())));
- }
- }
+ append(points, this->first_layer_wipe_tower_corners());
if (points.size() < 3)
// At least three points required for a convex hull.
@@ -1799,28 +1821,19 @@ void Print::_make_skirt()
}
// Brims were generated inside out, reverse to print the outmost contour first.
m_skirt.reverse();
+
+ // Remember the outer edge of the last skirt line extruded as m_skirt_convex_hull.
+ for (Polygon &poly : offset(convex_hull, distance + 0.5f * float(scale_(spacing)), ClipperLib::jtRound, float(scale_(0.1))))
+ append(m_skirt_convex_hull, std::move(poly.points));
}
void Print::_make_brim()
{
// Brim is only printed on first layer and uses perimeter extruder.
+ Polygons islands = this->first_layer_islands();
+ Polygons loops;
Flow flow = this->brim_flow();
- Polygons islands;
- for (PrintObject *object : m_objects) {
- Polygons object_islands;
- for (ExPolygon &expoly : object->m_layers.front()->lslices)
- object_islands.push_back(expoly.contour);
- if (! object->support_layers().empty())
- object->support_layers().front()->support_fills.polygons_covered_by_spacing(object_islands, float(SCALED_EPSILON));
- islands.reserve(islands.size() + object_islands.size() * object->instances().size());
- for (const PrintInstance &instance : object->instances())
- for (Polygon &poly : object_islands) {
- islands.push_back(poly);
- islands.back().translate(instance.shift);
- }
- }
- Polygons loops;
- size_t num_loops = size_t(floor(m_config.brim_width.value / flow.spacing()));
+ size_t num_loops = size_t(floor(m_config.brim_width.value / flow.spacing()));
for (size_t i = 0; i < num_loops; ++ i) {
this->throw_if_canceled();
islands = offset(islands, float(flow.scaled_spacing()), jtSquare);
@@ -1831,12 +1844,14 @@ void Print::_make_brim()
p.pop_back();
poly.points = std::move(p);
}
+ if (i + 1 == num_loops) {
+ // Remember the outer edge of the last brim line extruded as m_first_layer_convex_hull.
+ for (Polygon &poly : islands)
+ append(m_first_layer_convex_hull.points, poly.points);
+ }
polygons_append(loops, offset(islands, -0.5f * float(flow.scaled_spacing())));
}
- loops = union_pt_chained(loops, false);
- // The function above produces ordering well suited for concentric infill (from outside to inside).
- // For Brim, the ordering should be reversed (from inside to outside).
- std::reverse(loops.begin(), loops.end());
+ loops = union_pt_chained_outside_in(loops, false);
// If there is a possibility that brim intersects skirt, go through loops and split those extrusions
// The result is either the original Polygon or a list of Polylines
@@ -1935,7 +1950,7 @@ void Print::_make_brim()
// Find all pieces that the initial loop was split into.
size_t j = i + 1;
for (; j < loops_trimmed_order.size() && loops_trimmed_order[i].second == loops_trimmed_order[j].second; ++ j) ;
- const ClipperLib_Z::Path &first_path = *loops_trimmed_order[i].first;
+ const ClipperLib_Z::Path &first_path = *loops_trimmed_order[i].first;
if (i + 1 == j && first_path.size() > 3 && first_path.front().X == first_path.back().X && first_path.front().Y == first_path.back().Y) {
auto *loop = new ExtrusionLoop();
m_brim.entities.emplace_back(loop);
@@ -1970,6 +1985,58 @@ void Print::_make_brim()
}
}
+Polygons Print::first_layer_islands() const
+{
+ Polygons islands;
+ for (PrintObject *object : m_objects) {
+ Polygons object_islands;
+ for (ExPolygon &expoly : object->m_layers.front()->lslices)
+ object_islands.push_back(expoly.contour);
+ if (! object->support_layers().empty())
+ object->support_layers().front()->support_fills.polygons_covered_by_spacing(object_islands, float(SCALED_EPSILON));
+ islands.reserve(islands.size() + object_islands.size() * object->instances().size());
+ for (const PrintInstance &instance : object->instances())
+ for (Polygon &poly : object_islands) {
+ islands.push_back(poly);
+ islands.back().translate(instance.shift);
+ }
+ }
+ return islands;
+}
+
+std::vector<Point> Print::first_layer_wipe_tower_corners() const
+{
+ std::vector<Point> corners;
+ if (has_wipe_tower() && ! m_wipe_tower_data.tool_changes.empty()) {
+ double width = m_config.wipe_tower_width + 2*m_wipe_tower_data.brim_width;
+ double depth = m_wipe_tower_data.depth + 2*m_wipe_tower_data.brim_width;
+ Vec2d pt0(-m_wipe_tower_data.brim_width, -m_wipe_tower_data.brim_width);
+ for (Vec2d pt : {
+ pt0,
+ Vec2d(pt0.x()+width, pt0.y() ),
+ Vec2d(pt0.x()+width, pt0.y()+depth),
+ Vec2d(pt0.x(), pt0.y()+depth)
+ }) {
+ pt = Eigen::Rotation2Dd(Geometry::deg2rad(m_config.wipe_tower_rotation_angle.value)) * pt;
+ pt += Vec2d(m_config.wipe_tower_x.value, m_config.wipe_tower_y.value);
+ corners.emplace_back(Point(scale_(pt.x()), scale_(pt.y())));
+ }
+ }
+ return corners;
+}
+
+void Print::finalize_first_layer_convex_hull()
+{
+ append(m_first_layer_convex_hull.points, m_skirt_convex_hull);
+ if (m_first_layer_convex_hull.empty()) {
+ // Neither skirt nor brim was extruded. Collect points of printed objects from 1st layer.
+ for (Polygon &poly : this->first_layer_islands())
+ append(m_first_layer_convex_hull.points, std::move(poly.points));
+ }
+ append(m_first_layer_convex_hull.points, this->first_layer_wipe_tower_corners());
+ m_first_layer_convex_hull = Geometry::convex_hull(m_first_layer_convex_hull.points);
+}
+
// Wipe tower support.
bool Print::has_wipe_tower() const
{
@@ -1994,7 +2061,6 @@ const WipeTowerData& Print::wipe_tower_data(size_t extruders_cnt, double first_l
return m_wipe_tower_data;
}
-
void Print::_make_wipe_tower()
{
m_wipe_tower_data.clear();
@@ -2123,7 +2189,7 @@ void Print::_make_wipe_tower()
wipe_tower.set_layer(float(m_wipe_tower_data.tool_ordering.back().print_z), float(layer_height), 0, false, true);
}
m_wipe_tower_data.final_purge = Slic3r::make_unique<WipeTower::ToolChangeResult>(
- wipe_tower.tool_change((unsigned int)-1, false));
+ wipe_tower.tool_change((unsigned int)(-1)));
m_wipe_tower_data.used_filament = wipe_tower.get_used_filament();
m_wipe_tower_data.number_of_toolchanges = wipe_tower.get_number_of_toolchanges();
@@ -2146,16 +2212,16 @@ DynamicConfig PrintStatistics::config() const
DynamicConfig config;
std::string normal_print_time = short_time(this->estimated_normal_print_time);
std::string silent_print_time = short_time(this->estimated_silent_print_time);
- config.set_key_value("print_time", new ConfigOptionString(normal_print_time));
- config.set_key_value("normal_print_time", new ConfigOptionString(normal_print_time));
- config.set_key_value("silent_print_time", new ConfigOptionString(silent_print_time));
- config.set_key_value("used_filament", new ConfigOptionFloat (this->total_used_filament / 1000.));
- config.set_key_value("extruded_volume", new ConfigOptionFloat (this->total_extruded_volume));
- config.set_key_value("total_cost", new ConfigOptionFloat (this->total_cost));
+ config.set_key_value("print_time", new ConfigOptionString(normal_print_time));
+ config.set_key_value("normal_print_time", new ConfigOptionString(normal_print_time));
+ config.set_key_value("silent_print_time", new ConfigOptionString(silent_print_time));
+ config.set_key_value("used_filament", new ConfigOptionFloat(this->total_used_filament / 1000.));
+ config.set_key_value("extruded_volume", new ConfigOptionFloat(this->total_extruded_volume));
+ config.set_key_value("total_cost", new ConfigOptionFloat(this->total_cost));
config.set_key_value("total_toolchanges", new ConfigOptionInt(this->total_toolchanges));
- config.set_key_value("total_weight", new ConfigOptionFloat (this->total_weight));
- config.set_key_value("total_wipe_tower_cost", new ConfigOptionFloat (this->total_wipe_tower_cost));
- config.set_key_value("total_wipe_tower_filament", new ConfigOptionFloat (this->total_wipe_tower_filament));
+ config.set_key_value("total_weight", new ConfigOptionFloat(this->total_weight));
+ config.set_key_value("total_wipe_tower_cost", new ConfigOptionFloat(this->total_wipe_tower_cost));
+ config.set_key_value("total_wipe_tower_filament", new ConfigOptionFloat(this->total_wipe_tower_filament));
return config;
}
diff --git a/src/libslic3r/Print.hpp b/src/libslic3r/Print.hpp
index 1ff6e097b..281ce35bc 100644
--- a/src/libslic3r/Print.hpp
+++ b/src/libslic3r/Print.hpp
@@ -4,16 +4,14 @@
#include "PrintBase.hpp"
#include "BoundingBox.hpp"
+#include "ExtrusionEntityCollection.hpp"
#include "Flow.hpp"
#include "Point.hpp"
-#include "Layer.hpp"
-#include "Model.hpp"
#include "Slicing.hpp"
#include "GCode/ToolOrdering.hpp"
#include "GCode/WipeTower.hpp"
-#if ENABLE_THUMBNAIL_GENERATOR
#include "GCode/ThumbnailData.hpp"
-#endif // ENABLE_THUMBNAIL_GENERATOR
+#include "GCode/GCodeProcessor.hpp"
#include "libslic3r.h"
@@ -23,27 +21,36 @@ class Print;
class PrintObject;
class ModelObject;
class GCode;
-class GCodePreviewData;
enum class SlicingMode : uint32_t;
+class Layer;
+class SupportLayer;
+
+namespace FillAdaptive {
+ struct Octree;
+ struct OctreeDeleter;
+ using OctreePtr = std::unique_ptr<Octree, OctreeDeleter>;
+};
// Print step IDs for keeping track of the print state.
+// The Print steps are applied in this order.
enum PrintStep {
- psSkirt,
- psBrim,
- // Synonym for the last step before the Wipe Tower / Tool Ordering, for the G-code preview slider to understand that
- // all the extrusions are there for the layer slider to add color changes etc.
- psExtrusionPaths = psBrim,
psWipeTower,
+ // Ordering of the tools on PrintObjects for a multi-material print.
// psToolOrdering is a synonym to psWipeTower, as the Wipe Tower calculates and modifies the ToolOrdering,
// while if printing without the Wipe Tower, the ToolOrdering is calculated as well.
psToolOrdering = psWipeTower,
+ psSkirt,
+ psBrim,
+ // Last step before G-code export, after this step is finished, the initial extrusion path preview
+ // should be refreshed.
+ psSlicingFinished = psBrim,
psGCodeExport,
psCount,
};
enum PrintObjectStep {
posSlice, posPerimeters, posPrepareInfill,
- posInfill, posSupportMaterial, posCount,
+ posInfill, posIroning, posSupportMaterial, posCount,
};
// A PrintRegion object represents a group of volumes to print
@@ -149,18 +156,13 @@ public:
const Layer* get_layer(int idx) const { return m_layers[idx]; }
Layer* get_layer(int idx) { return m_layers[idx]; }
// Get a layer exactly at print_z.
- const Layer* get_layer_at_printz(coordf_t print_z) const {
- auto it = Slic3r::lower_bound_by_predicate(m_layers.begin(), m_layers.end(), [print_z](const Layer *layer) { return layer->print_z < print_z; });
- return (it == m_layers.end() || (*it)->print_z != print_z) ? nullptr : *it;
- }
- Layer* get_layer_at_printz(coordf_t print_z) { return const_cast<Layer*>(std::as_const(*this).get_layer_at_printz(print_z)); }
+ const Layer* get_layer_at_printz(coordf_t print_z) const;
+ Layer* get_layer_at_printz(coordf_t print_z);
// Get a layer approximately at print_z.
- const Layer* get_layer_at_printz(coordf_t print_z, coordf_t epsilon) const {
- coordf_t limit = print_z - epsilon;
- auto it = Slic3r::lower_bound_by_predicate(m_layers.begin(), m_layers.end(), [limit](const Layer *layer) { return layer->print_z < limit; });
- return (it == m_layers.end() || (*it)->print_z > print_z + epsilon) ? nullptr : *it;
- }
- Layer* get_layer_at_printz(coordf_t print_z, coordf_t epsilon) { return const_cast<Layer*>(std::as_const(*this).get_layer_at_printz(print_z, epsilon)); }
+ const Layer* get_layer_at_printz(coordf_t print_z, coordf_t epsilon) const;
+ Layer* get_layer_at_printz(coordf_t print_z, coordf_t epsilon);
+ // Get the first layer approximately bellow print_z.
+ const Layer* get_first_layer_bellow_printz(coordf_t print_z, coordf_t epsilon) const;
// print_z: top of the layer; slice_z: center of the layer.
Layer* add_layer(int id, coordf_t height, coordf_t print_z, coordf_t slice_z);
@@ -186,7 +188,7 @@ public:
// returns 0-based indices of extruders used to print the object (without brim, support and other helper extrusions)
std::vector<unsigned int> object_extruders() const;
- // Called when slicing to SVG (see Print.pm sub export_svg), and used by perimeters.t
+ // Called by make_perimeters()
void slice();
// Helpers to slice support enforcer / blocker meshes by the support generator.
@@ -194,6 +196,9 @@ public:
std::vector<ExPolygons> slice_support_blockers() const { return this->slice_support_volumes(ModelVolumeType::SUPPORT_BLOCKER); }
std::vector<ExPolygons> slice_support_enforcers() const { return this->slice_support_volumes(ModelVolumeType::SUPPORT_ENFORCER); }
+ // Helpers to project custom facets on slices
+ void project_and_append_custom_facets(bool seam, EnforcerBlockerType type, std::vector<ExPolygons>& expolys) const;
+
private:
// to be called from Print only.
friend class Print;
@@ -220,6 +225,7 @@ private:
void make_perimeters();
void prepare_infill();
void infill();
+ void ironing();
void generate_support_material();
void _slice(const std::vector<coordf_t> &layer_height_profile);
@@ -234,6 +240,7 @@ private:
void discover_horizontal_shells();
void combine_infill();
void _generate_support_material();
+ std::pair<FillAdaptive::OctreePtr, FillAdaptive::OctreePtr> prepare_adaptive_infill_data();
// XYZ in scaled coordinates
Vec3crd m_size;
@@ -254,9 +261,16 @@ private:
// so that next call to make_perimeters() performs a union() before computing loops
bool m_typed_slices = false;
- std::vector<ExPolygons> slice_region(size_t region_id, const std::vector<float> &z, SlicingMode mode) const;
+ std::vector<ExPolygons> slice_region(size_t region_id, const std::vector<float> &z, SlicingMode mode, size_t slicing_mode_normal_below_layer, SlicingMode mode_below) const;
+ std::vector<ExPolygons> slice_region(size_t region_id, const std::vector<float> &z, SlicingMode mode) const
+ { return this->slice_region(region_id, z, mode, 0, mode); }
std::vector<ExPolygons> slice_modifiers(size_t region_id, const std::vector<float> &z) const;
- std::vector<ExPolygons> slice_volumes(const std::vector<float> &z, SlicingMode mode, const std::vector<const ModelVolume*> &volumes) const;
+ std::vector<ExPolygons> slice_volumes(
+ const std::vector<float> &z,
+ SlicingMode mode, size_t slicing_mode_normal_below_layer, SlicingMode mode_below,
+ const std::vector<const ModelVolume*> &volumes) const;
+ std::vector<ExPolygons> slice_volumes(const std::vector<float> &z, SlicingMode mode, const std::vector<const ModelVolume*> &volumes) const
+ { return this->slice_volumes(z, mode, 0, mode, volumes); }
std::vector<ExPolygons> slice_volume(const std::vector<float> &z, SlicingMode mode, const ModelVolume &volume) const;
std::vector<ExPolygons> slice_volume(const std::vector<float> &z, const std::vector<t_layer_height_range> &ranges, SlicingMode mode, const ModelVolume &volume) const;
};
@@ -302,8 +316,6 @@ struct PrintStatistics
PrintStatistics() { clear(); }
std::string estimated_normal_print_time;
std::string estimated_silent_print_time;
- std::vector<std::pair<CustomGcodeType, std::string>> estimated_normal_custom_gcode_print_times;
- std::vector<std::pair<CustomGcodeType, std::string>> estimated_silent_custom_gcode_print_times;
double total_used_filament;
double total_extruded_volume;
double total_cost;
@@ -321,10 +333,6 @@ struct PrintStatistics
std::string finalize_output_path(const std::string &path_in) const;
void clear() {
- estimated_normal_print_time.clear();
- estimated_silent_print_time.clear();
- estimated_normal_custom_gcode_print_times.clear();
- estimated_silent_custom_gcode_print_times.clear();
total_used_filament = 0.;
total_extruded_volume = 0.;
total_cost = 0.;
@@ -358,17 +366,15 @@ public:
// a cancellation callback is executed to stop the background processing before the operation.
void clear() override;
bool empty() const override { return m_objects.empty(); }
+ // List of existing PrintObject IDs, to remove notifications for non-existent IDs.
+ std::vector<ObjectID> print_object_ids() const override;
ApplyStatus apply(const Model &model, DynamicPrintConfig config) override;
void process() override;
// Exports G-code into a file name based on the path_template, returns the file path of the generated G-code file.
// If preview_data is not null, the preview_data is filled in for the G-code visualization (not used by the command line Slic3r).
-#if ENABLE_THUMBNAIL_GENERATOR
- std::string export_gcode(const std::string& path_template, GCodePreviewData* preview_data, ThumbnailsGeneratorCallback thumbnail_cb = nullptr);
-#else
- std::string export_gcode(const std::string &path_template, GCodePreviewData *preview_data);
-#endif // ENABLE_THUMBNAIL_GENERATOR
+ std::string export_gcode(const std::string& path_template, GCodeProcessor::Result* result, ThumbnailsGeneratorCallback thumbnail_cb = nullptr);
// methods for handling state
bool is_step_done(PrintStep step) const { return Inherited::is_step_done(step); }
@@ -401,6 +407,13 @@ public:
const PrintObjectPtrs& objects() const { return m_objects; }
PrintObject* get_object(size_t idx) { return m_objects[idx]; }
const PrintObject* get_object(size_t idx) const { return m_objects[idx]; }
+ // PrintObject by its ObjectID, to be used to uniquely bind slicing warnings to their source PrintObjects
+ // in the notification center.
+ const PrintObject* get_object(ObjectID object_id) const {
+ auto it = std::find_if(m_objects.begin(), m_objects.end(),
+ [object_id](const PrintObject *obj) { return obj->id() == object_id; });
+ return (it == m_objects.end()) ? nullptr : *it;
+ }
const PrintRegionPtrs& regions() const { return m_regions; }
// How many of PrintObject::copies() over all print objects are there?
// If zero, then the print is empty and the print shall not be executed.
@@ -408,8 +421,15 @@ public:
const ExtrusionEntityCollection& skirt() const { return m_skirt; }
const ExtrusionEntityCollection& brim() const { return m_brim; }
+ // Convex hull of the 1st layer extrusions, for bed leveling and placing the initial purge line.
+ // It encompasses the object extrusions, support extrusions, skirt, brim, wipe tower.
+ // It does NOT encompass user extrusions generated by custom G-code,
+ // therefore it does NOT encompass the initial purge line.
+ // It does NOT encompass MMU/MMU2 starting (wipe) areas.
+ const Polygon& first_layer_convex_hull() const { return m_first_layer_convex_hull; }
const PrintStatistics& print_statistics() const { return m_print_statistics; }
+ PrintStatistics& print_statistics() { return m_print_statistics; }
// Wipe tower support.
bool has_wipe_tower() const;
@@ -443,6 +463,12 @@ private:
void _make_skirt();
void _make_brim();
void _make_wipe_tower();
+ void finalize_first_layer_convex_hull();
+
+ // Islands of objects and their supports extruded at the 1st layer.
+ Polygons first_layer_islands() const;
+ // Return 4 wipe tower corners in the world coordinates (shifted and rotated), including the wipe tower brim.
+ std::vector<Point> first_layer_wipe_tower_corners() const;
// Declared here to have access to Model / ModelObject / ModelInstance
static void model_volume_list_update_supports(ModelObject &model_object_dst, const ModelObject &model_object_src);
@@ -456,6 +482,13 @@ private:
// Ordered collections of extrusion paths to build skirt loops and brim.
ExtrusionEntityCollection m_skirt;
ExtrusionEntityCollection m_brim;
+ // Convex hull of the 1st layer extrusions.
+ // It encompasses the object extrusions, support extrusions, skirt, brim, wipe tower.
+ // It does NOT encompass user extrusions generated by custom G-code,
+ // therefore it does NOT encompass the initial purge line.
+ // It does NOT encompass MMU/MMU2 starting (wipe) areas.
+ Polygon m_first_layer_convex_hull;
+ Points m_skirt_convex_hull;
// Following section will be consumed by the GCodeGenerator.
ToolOrdering m_tool_ordering;
diff --git a/src/libslic3r/PrintBase.cpp b/src/libslic3r/PrintBase.cpp
index 81affe04d..fb5e102c1 100644
--- a/src/libslic3r/PrintBase.cpp
+++ b/src/libslic3r/PrintBase.cpp
@@ -1,3 +1,4 @@
+#include "Exception.hpp"
#include "PrintBase.hpp"
#include <boost/filesystem.hpp>
@@ -68,7 +69,7 @@ std::string PrintBase::output_filename(const std::string &format, const std::str
filename = boost::filesystem::change_extension(filename, default_ext);
return filename.string();
} catch (std::runtime_error &err) {
- throw std::runtime_error(L("Failed processing of the output_filename_format template.") + "\n" + err.what());
+ throw Slic3r::PlaceholderParserError(L("Failed processing of the output_filename_format template.") + "\n" + err.what());
}
}
@@ -88,6 +89,14 @@ std::string PrintBase::output_filepath(const std::string &path, const std::strin
return path;
}
+void PrintBase::status_update_warnings(ObjectID object_id, int step, PrintStateBase::WarningLevel /* warning_level */, const std::string &message)
+{
+ if (this->m_status_callback)
+ m_status_callback(SlicingStatus(*this, step));
+ else if (! message.empty())
+ printf("%s warning: %s\n", (object_id == this->id()) ? "print" : "print object", message.c_str());
+}
+
tbb::mutex& PrintObjectBase::state_mutex(PrintBase *print)
{
return print->state_mutex();
@@ -98,4 +107,9 @@ std::function<void()> PrintObjectBase::cancel_callback(PrintBase *print)
return print->cancel_callback();
}
+void PrintObjectBase::status_update_warnings(PrintBase *print, int step, PrintStateBase::WarningLevel warning_level, const std::string &message)
+{
+ print->status_update_warnings(this->id(), step, warning_level, message);
+}
+
} // namespace Slic3r
diff --git a/src/libslic3r/PrintBase.hpp b/src/libslic3r/PrintBase.hpp
index 05d884cc8..bfbabd06b 100644
--- a/src/libslic3r/PrintBase.hpp
+++ b/src/libslic3r/PrintBase.hpp
@@ -13,6 +13,7 @@
#endif
#include "tbb/mutex.h"
+#include "ObjectID.hpp"
#include "Model.hpp"
#include "PlaceholderParser.hpp"
#include "PrintConfig.hpp"
@@ -32,6 +33,11 @@ public:
DONE,
};
+ enum class WarningLevel {
+ NON_CRITICAL,
+ CRITICAL
+ };
+
typedef size_t TimeStamp;
// A new unique timestamp is being assigned to the step every time the step changes its state.
@@ -42,6 +48,28 @@ public:
TimeStamp timestamp;
};
+ struct Warning
+ {
+ // Critical warnings will be displayed on G-code export in a modal dialog, so that the user cannot miss them.
+ WarningLevel level;
+ // If the warning is not current, then it is in an unknown state. It may or may not be valid.
+ // A current warning will become non-current if its milestone gets invalidated.
+ // A non-current warning will either become current or it will be removed at the end of a milestone.
+ bool current;
+ // Message to be shown to the user, UTF8, localized.
+ std::string message;
+ // If message_id == 0, then the message is expected to identify the warning uniquely.
+ // Otherwise message_id identifies the message. For example, if the message contains a varying number, then
+ // it cannot itself identify the message type.
+ int message_id;
+ };
+
+ struct StateWithWarnings : public StateWithTimeStamp
+ {
+ void mark_warnings_non_current() { for (auto &w : warnings) w.current = false; }
+ std::vector<Warning> warnings;
+ };
+
protected:
//FIXME last timestamp is shared between Print & SLAPrint,
// and if multiple Print or SLAPrint instances are executed in parallel, modification of g_last_timestamp
@@ -56,12 +84,18 @@ class PrintState : public PrintStateBase
public:
PrintState() {}
- StateWithTimeStamp state_with_timestamp(StepType step, tbb::mutex &mtx) const {
+ StateWithTimeStamp state_with_timestamp(StepType step, tbb::mutex &mtx) const {
tbb::mutex::scoped_lock lock(mtx);
StateWithTimeStamp state = m_state[step];
return state;
}
+ StateWithWarnings state_with_warnings(StepType step, tbb::mutex &mtx) const {
+ tbb::mutex::scoped_lock lock(mtx);
+ StateWithWarnings state = m_state[step];
+ return state;
+ }
+
bool is_started(StepType step, tbb::mutex &mtx) const {
return this->state_with_timestamp(step, mtx).state == STARTED;
}
@@ -91,24 +125,53 @@ public:
tbb::mutex::scoped_lock lock(mtx);
// If canceled, throw before changing the step state.
throw_if_canceled();
+#ifndef NDEBUG
+// The following test is not necessarily valid after the background processing thread
+// is stopped with throw_if_canceled(), as the CanceledException is not being catched
+// by the Print or PrintObject to update m_step_active or m_state[...].state.
+// This should not be a problem as long as the caller calls set_started() / set_done() /
+// active_step_add_warning() consistently. From the robustness point of view it would be
+// be better to catch CanceledException and do the updates. From the performance point of view,
+// the current implementation is optimal.
+//
+// assert(m_step_active == -1);
+// for (int i = 0; i < int(COUNT); ++ i)
+// assert(m_state[i].state != STARTED);
+#endif // NDEBUG
if (m_state[step].state == DONE)
return false;
- m_state[step].state = STARTED;
- m_state[step].timestamp = ++ g_last_timestamp;
+ PrintStateBase::StateWithWarnings &state = m_state[step];
+ state.state = STARTED;
+ state.timestamp = ++ g_last_timestamp;
+ state.mark_warnings_non_current();
+ m_step_active = static_cast<int>(step);
return true;
}
// Set the step as done. Block on mutex while the Print / PrintObject / PrintRegion objects are being
// modified by the UI thread.
+ // Return value:
+ // Timestamp when this stepentered the DONE state.
+ // bool indicates whether the UI has to update the slicing warnings of this step or not.
template<typename ThrowIfCanceled>
- TimeStamp set_done(StepType step, tbb::mutex &mtx, ThrowIfCanceled throw_if_canceled) {
+ std::pair<TimeStamp, bool> set_done(StepType step, tbb::mutex &mtx, ThrowIfCanceled throw_if_canceled) {
tbb::mutex::scoped_lock lock(mtx);
// If canceled, throw before changing the step state.
throw_if_canceled();
- assert(m_state[step].state != DONE);
- m_state[step].state = DONE;
- m_state[step].timestamp = ++ g_last_timestamp;
- return m_state[step].timestamp;
+ assert(m_state[step].state == STARTED);
+ assert(m_step_active == static_cast<int>(step));
+ PrintStateBase::StateWithWarnings &state = m_state[step];
+ state.state = DONE;
+ state.timestamp = ++ g_last_timestamp;
+ m_step_active = -1;
+ // Remove all non-current warnings.
+ auto it = std::remove_if(state.warnings.begin(), state.warnings.end(), [](const auto &w) { return ! w.current; });
+ bool update_warning_ui = false;
+ if (it != state.warnings.end()) {
+ state.warnings.erase(it, state.warnings.end());
+ update_warning_ui = true;
+ }
+ return std::make_pair(state.timestamp, update_warning_ui);
}
// Make the step invalid.
@@ -124,13 +187,18 @@ public:
printf("Not held!\n");
}
#endif
- m_state[step].state = INVALID;
- m_state[step].timestamp = ++ g_last_timestamp;
+ PrintStateBase::StateWithWarnings &state = m_state[step];
+ state.state = INVALID;
+ state.timestamp = ++ g_last_timestamp;
// Raise the mutex, so that the following cancel() callback could cancel
// the background processing.
// Internally the cancel() callback shall unlock the PrintBase::m_status_mutex to let
- // the working thread to proceed.
+ // the working thread proceed.
cancel();
+ // Now the worker thread should be stopped, therefore it cannot write into the warnings field.
+ // It is safe to modify it.
+ state.mark_warnings_non_current();
+ m_step_active = -1;
}
return invalidated;
}
@@ -157,6 +225,11 @@ public:
// Internally the cancel() callback shall unlock the PrintBase::m_status_mutex to let
// the working thread to proceed.
cancel();
+ // Now the worker thread should be stopped, therefore it cannot write into the warnings field.
+ // It is safe to modify the warnings.
+ for (StepTypeIterator it = step_begin; it != step_end; ++ it)
+ m_state[*it].mark_warnings_non_current();
+ m_step_active = -1;
}
return invalidated;
}
@@ -176,18 +249,62 @@ public:
state.timestamp = ++ g_last_timestamp;
}
}
- if (invalidated)
+ if (invalidated) {
cancel();
+ // Now the worker thread should be stopped, therefore it cannot write into the warnings field.
+ // It is safe to modify the warnings.
+ for (size_t i = 0; i < COUNT; ++ i)
+ m_state[i].mark_warnings_non_current();
+ m_step_active = -1;
+ }
return invalidated;
}
+ // Update list of warnings of the current milestone with a new warning.
+ // The warning may already exist in the list, marked as current or not current.
+ // If it already exists, mark it as current.
+ // Return value:
+ // Current milestone (StepType).
+ // bool indicates whether the UI has to be updated or not.
+ std::pair<StepType, bool> active_step_add_warning(PrintStateBase::WarningLevel warning_level, const std::string &message, int message_id, tbb::mutex &mtx)
+ {
+ tbb::mutex::scoped_lock lock(mtx);
+ assert(m_step_active != -1);
+ StateWithWarnings &state = m_state[m_step_active];
+ assert(state.state == STARTED);
+ std::pair<StepType, bool> retval(static_cast<StepType>(m_step_active), true);
+ // Does a warning of the same level and message or message_id exist already?
+ auto it = (message_id == 0) ?
+ std::find_if(state.warnings.begin(), state.warnings.end(), [&message](const auto &w) { return w.message_id == 0 && w.message == message; }) :
+ std::find_if(state.warnings.begin(), state.warnings.end(), [message_id](const auto& w) { return w.message_id == message_id; });
+ if (it == state.warnings.end())
+ // No, create a new warning and update UI.
+ state.warnings.emplace_back(PrintStateBase::Warning{ warning_level, true, message, message_id });
+ else if (it->message != message || it->level != warning_level) {
+ // Yes, however it needs an update.
+ it->message = message;
+ it->level = warning_level;
+ it->current = true;
+ } else if (it->current)
+ // Yes, and it is current. Don't update UI.
+ retval.second = false;
+ else
+ // Yes, but it is not current. Mark it as current.
+ it->current = true;
+ return retval;
+ }
+
private:
- StateWithTimeStamp m_state[COUNT];
+ StateWithWarnings m_state[COUNT];
+ // Active class StepType or -1 if none is active.
+ // If the background processing is canceled, m_step_active may not be resetted
+ // to -1, see the comment in this->set_started().
+ int m_step_active = -1;
};
class PrintBase;
-class PrintObjectBase
+class PrintObjectBase : public ObjectBase
{
public:
const ModelObject* model_object() const { return m_model_object; }
@@ -197,8 +314,12 @@ protected:
PrintObjectBase(ModelObject *model_object) : m_model_object(model_object) {}
virtual ~PrintObjectBase() {}
// Declared here to allow access from PrintBase through friendship.
- static tbb::mutex& state_mutex(PrintBase *print);
- static std::function<void()> cancel_callback(PrintBase *print);
+ static tbb::mutex& state_mutex(PrintBase *print);
+ static std::function<void()> cancel_callback(PrintBase *print);
+ // Notify UI about a new warning of a milestone "step" on this PrintObjectBase.
+ // The UI will be notified by calling a status callback registered on print.
+ // If no status callback is registered, the message is printed to console.
+ void status_update_warnings(PrintBase *print, int step, PrintStateBase::WarningLevel warning_level, const std::string &message);
ModelObject *m_model_object;
};
@@ -214,7 +335,7 @@ protected:
* The PrintBase class will abstract this flow for different technologies.
*
*/
-class PrintBase
+class PrintBase : public ObjectBase
{
public:
PrintBase() : m_placeholder_parser(&m_full_print_config) { this->restart(); }
@@ -227,6 +348,8 @@ public:
// The Print is empty either after clear() or after apply() over an empty model,
// or after apply() over a model, where no object is printable (all outside the print volume).
virtual bool empty() const = 0;
+ // List of existing PrintObject IDs, to remove notifications for non-existent IDs.
+ virtual std::vector<ObjectID> print_object_ids() const = 0;
// Validate the print, return empty string if valid, return error if process() cannot (or should not) be started.
virtual std::string validate() const { return std::string(); }
@@ -264,17 +387,29 @@ public:
struct SlicingStatus {
SlicingStatus(int percent, const std::string &text, unsigned int flags = 0) : percent(percent), text(text), flags(flags) {}
- int percent;
+ SlicingStatus(const PrintBase &print, int warning_step) :
+ flags(UPDATE_PRINT_STEP_WARNINGS), warning_object_id(print.id()), warning_step(warning_step) {}
+ SlicingStatus(const PrintObjectBase &print_object, int warning_step) :
+ flags(UPDATE_PRINT_OBJECT_STEP_WARNINGS), warning_object_id(print_object.id()), warning_step(warning_step) {}
+ int percent { -1 };
std::string text;
// Bitmap of flags.
enum FlagBits {
- DEFAULT = 0,
- RELOAD_SCENE = 1 << 1,
- RELOAD_SLA_SUPPORT_POINTS = 1 << 2,
- RELOAD_SLA_PREVIEW = 1 << 3,
+ DEFAULT = 0,
+ RELOAD_SCENE = 1 << 1,
+ RELOAD_SLA_SUPPORT_POINTS = 1 << 2,
+ RELOAD_SLA_PREVIEW = 1 << 3,
+ // UPDATE_PRINT_STEP_WARNINGS is mutually exclusive with UPDATE_PRINT_OBJECT_STEP_WARNINGS.
+ UPDATE_PRINT_STEP_WARNINGS = 1 << 4,
+ UPDATE_PRINT_OBJECT_STEP_WARNINGS = 1 << 5
};
// Bitmap of FlagBits
unsigned int flags;
+ // set to an ObjectID of a Print or a PrintObject based on flags
+ // (whether UPDATE_PRINT_STEP_WARNINGS or UPDATE_PRINT_OBJECT_STEP_WARNINGS is set).
+ ObjectID warning_object_id;
+ // For which Print or PrintObject step a new warning is being issued?
+ int warning_step { -1 };
};
typedef std::function<void(const SlicingStatus&)> status_callback_type;
// Default status console print out in the form of percent => message.
@@ -329,6 +464,10 @@ protected:
tbb::mutex& state_mutex() const { return m_state_mutex; }
std::function<void()> cancel_callback() { return m_cancel_callback; }
void call_cancel_callback() { m_cancel_callback(); }
+ // Notify UI about a new warning of a milestone "step" on this PrintBase.
+ // The UI will be notified by calling a status callback.
+ // If no status callback is registered, the message is printed to console.
+ void status_update_warnings(ObjectID object_id, int step, PrintStateBase::WarningLevel warning_level, const std::string &message);
// If the background processing stop was requested, throw CanceledException.
// To be called by the worker thread and its sub-threads (mostly launched on the TBB thread pool) regularly.
@@ -343,11 +482,12 @@ protected:
DynamicPrintConfig m_full_print_config;
PlaceholderParser m_placeholder_parser;
-private:
- tbb::atomic<CancelStatus> m_cancel_status;
// Callback to be evoked regularly to update state of the UI thread.
status_callback_type m_status_callback;
+private:
+ tbb::atomic<CancelStatus> m_cancel_status;
+
// Callback to be evoked to stop the background processing before a state is updated.
cancel_callback_type m_cancel_callback = [](){};
@@ -363,10 +503,16 @@ class PrintBaseWithState : public PrintBase
public:
bool is_step_done(PrintStepEnum step) const { return m_state.is_done(step, this->state_mutex()); }
PrintStateBase::StateWithTimeStamp step_state_with_timestamp(PrintStepEnum step) const { return m_state.state_with_timestamp(step, this->state_mutex()); }
+ PrintStateBase::StateWithWarnings step_state_with_warnings(PrintStepEnum step) const { return m_state.state_with_warnings(step, this->state_mutex()); }
protected:
bool set_started(PrintStepEnum step) { return m_state.set_started(step, this->state_mutex(), [this](){ this->throw_if_canceled(); }); }
- PrintStateBase::TimeStamp set_done(PrintStepEnum step) { return m_state.set_done(step, this->state_mutex(), [this](){ this->throw_if_canceled(); }); }
+ PrintStateBase::TimeStamp set_done(PrintStepEnum step) {
+ std::pair<PrintStateBase::TimeStamp, bool> status = m_state.set_done(step, this->state_mutex(), [this](){ this->throw_if_canceled(); });
+ if (status.second)
+ this->status_update_warnings(this->id(), static_cast<int>(step), PrintStateBase::WarningLevel::NON_CRITICAL, std::string());
+ return status.first;
+ }
bool invalidate_step(PrintStepEnum step)
{ return m_state.invalidate(step, this->cancel_callback()); }
template<typename StepTypeIterator>
@@ -380,6 +526,15 @@ protected:
bool is_step_started_unguarded(PrintStepEnum step) const { return m_state.is_started_unguarded(step); }
bool is_step_done_unguarded(PrintStepEnum step) const { return m_state.is_done_unguarded(step); }
+ // Add a slicing warning to the active Print step and send a status notification.
+ // This method could be called multiple times between this->set_started() and this->set_done().
+ void active_step_add_warning(PrintStateBase::WarningLevel warning_level, const std::string &message, int message_id = 0) {
+ std::pair<PrintStepEnum, bool> active_step = m_state.active_step_add_warning(warning_level, message, message_id, this->state_mutex());
+ if (active_step.second)
+ // Update UI.
+ this->status_update_warnings(this->id(), static_cast<int>(active_step.first), warning_level, message);
+ }
+
private:
PrintState<PrintStepEnum, COUNT> m_state;
};
@@ -394,14 +549,19 @@ public:
typedef PrintState<PrintObjectStepEnum, COUNT> PrintObjectState;
bool is_step_done(PrintObjectStepEnum step) const { return m_state.is_done(step, PrintObjectBase::state_mutex(m_print)); }
PrintStateBase::StateWithTimeStamp step_state_with_timestamp(PrintObjectStepEnum step) const { return m_state.state_with_timestamp(step, PrintObjectBase::state_mutex(m_print)); }
+ PrintStateBase::StateWithWarnings step_state_with_warnings(PrintObjectStepEnum step) const { return m_state.state_with_warnings(step, PrintObjectBase::state_mutex(m_print)); }
protected:
PrintObjectBaseWithState(PrintType *print, ModelObject *model_object) : PrintObjectBase(model_object), m_print(print) {}
bool set_started(PrintObjectStepEnum step)
{ return m_state.set_started(step, PrintObjectBase::state_mutex(m_print), [this](){ this->throw_if_canceled(); }); }
- PrintStateBase::TimeStamp set_done(PrintObjectStepEnum step)
- { return m_state.set_done(step, PrintObjectBase::state_mutex(m_print), [this](){ this->throw_if_canceled(); }); }
+ PrintStateBase::TimeStamp set_done(PrintObjectStepEnum step) {
+ std::pair<PrintStateBase::TimeStamp, bool> status = m_state.set_done(step, PrintObjectBase::state_mutex(m_print), [this](){ this->throw_if_canceled(); });
+ if (status.second)
+ this->status_update_warnings(m_print, static_cast<int>(step), PrintStateBase::WarningLevel::NON_CRITICAL, std::string());
+ return status.first;
+ }
bool invalidate_step(PrintObjectStepEnum step)
{ return m_state.invalidate(step, PrintObjectBase::cancel_callback(m_print)); }
@@ -416,6 +576,14 @@ protected:
bool is_step_started_unguarded(PrintObjectStepEnum step) const { return m_state.is_started_unguarded(step); }
bool is_step_done_unguarded(PrintObjectStepEnum step) const { return m_state.is_done_unguarded(step); }
+ // Add a slicing warning to the active PrintObject step and send a status notification.
+ // This method could be called multiple times between this->set_started() and this->set_done().
+ void active_step_add_warning(PrintStateBase::WarningLevel warning_level, const std::string &message, int message_id = 0) {
+ std::pair<PrintObjectStepEnum, bool> active_step = m_state.active_step_add_warning(warning_level, message, message_id, PrintObjectBase::state_mutex(m_print));
+ if (active_step.second)
+ this->status_update_warnings(m_print, static_cast<int>(active_step.first), warning_level, message);
+ }
+
protected:
// If the background processing stop was requested, throw CanceledException.
// To be called by the worker thread and its sub-threads (mostly launched on the TBB thread pool) regularly.
diff --git a/src/libslic3r/PrintConfig.cpp b/src/libslic3r/PrintConfig.cpp
index c7a7a9c8e..b3084f550 100644
--- a/src/libslic3r/PrintConfig.cpp
+++ b/src/libslic3r/PrintConfig.cpp
@@ -63,8 +63,10 @@ void PrintConfigDef::init_common_params()
def->set_default_value(new ConfigOptionString(""));
def = this->add("thumbnails", coPoints);
- def->label = L("Picture sizes to be stored into a .gcode and .sl1 files");
+ def->label = L("G-code thumbnails");
+ def->tooltip = L("Picture sizes to be stored into a .gcode and .sl1 files, in the following format: \"XxY, XxY, ...\"");
def->mode = comExpert;
+ def->gui_type = "one_string";
def->set_default_value(new ConfigOptionPoints());
def = this->add("layer_height", coFloat);
@@ -80,6 +82,8 @@ void PrintConfigDef::init_common_params()
def->label = L("Max print height");
def->tooltip = L("Set this to the maximum height that can be reached by your extruder while printing.");
def->sidetext = L("mm");
+ def->min = 0;
+ def->max = 1200;
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloat(200.0));
@@ -96,7 +100,9 @@ void PrintConfigDef::init_common_params()
def = this->add("print_host", coString);
def->label = L("Hostname, IP or URL");
def->tooltip = L("Slic3r can upload G-code files to a printer host. This field should contain "
- "the hostname, IP address or URL of the printer host instance.");
+ "the hostname, IP address or URL of the printer host instance. "
+ "Print host behind HAProxy with basic auth enabled can be accessed by putting the user name and password into the URL "
+ "in the following format: https://username:password@your-octopi-address/");
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionString(""));
@@ -106,7 +112,14 @@ void PrintConfigDef::init_common_params()
"the API Key or the password required for authentication.");
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionString(""));
-
+
+ def = this->add("printhost_port", coString);
+ def->label = L("Printer");
+ def->tooltip = L("Name of the printer");
+ def->gui_type = "select_open";
+ def->mode = comAdvanced;
+ def->set_default_value(new ConfigOptionString(""));
+
def = this->add("printhost_cafile", coString);
def->label = L("HTTPS CA File");
def->tooltip = L("Custom CA certificate file can be specified for HTTPS OctoPrint connections, in crt/pem format. "
@@ -123,6 +136,37 @@ void PrintConfigDef::init_common_params()
def->min = 0;
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloat(0.2));
+
+ // Options used by physical printers
+
+ def = this->add("printhost_user", coString);
+ def->label = L("User");
+// def->tooltip = L("");
+ def->mode = comAdvanced;
+ def->set_default_value(new ConfigOptionString(""));
+
+ def = this->add("printhost_password", coString);
+ def->label = L("Password");
+// def->tooltip = L("");
+ def->mode = comAdvanced;
+ def->set_default_value(new ConfigOptionString(""));
+
+ def = this->add("preset_name", coString);
+ def->label = L("Printer preset name");
+ def->tooltip = L("Related printer preset name");
+ def->mode = comAdvanced;
+ def->set_default_value(new ConfigOptionString(""));
+
+ def = this->add("printhost_authorization_type", coEnum);
+ def->label = L("Authorization Type");
+// def->tooltip = L("");
+ def->enum_keys_map = &ConfigOptionEnum<AuthorizationType>::get_enum_values();
+ def->enum_values.push_back("key");
+ def->enum_values.push_back("user");
+ def->enum_labels.push_back(L("API key"));
+ def->enum_labels.push_back(L("HTTP digest"));
+ def->mode = comAdvanced;
+ def->set_default_value(new ConfigOptionEnum<AuthorizationType>(atKeyPassword));
}
void PrintConfigDef::init_fff_params()
@@ -140,10 +184,22 @@ void PrintConfigDef::init_fff_params()
def->mode = comExpert;
def->set_default_value(new ConfigOptionBool(false));
+ def = this->add("avoid_crossing_perimeters_max_detour", coFloatOrPercent);
+ def->label = L("Avoid crossing perimeters - Max detour length");
+ def->category = L("Layers and Perimeters");
+ def->tooltip = L("The maximum detour length for avoid crossing perimeters. "
+ "If the detour is longer than this value, avoid crossing perimeters is not applied for this travel path. "
+ "Detour length could be specified either as an absolute value or as percentage (for example 50%) of a direct travel path.");
+ def->sidetext = L("mm or % (zero to disable)");
+ def->min = 0;
+ def->mode = comExpert;
+ def->set_default_value(new ConfigOptionFloatOrPercent(0., false));
+
def = this->add("bed_temperature", coInts);
def->label = L("Other layers");
def->tooltip = L("Bed temperature for layers after the first one. "
"Set this to zero to disable bed temperature control commands in the output.");
+ def->sidetext = L("°C");
def->full_label = L("Bed temperature");
def->min = 0;
def->max = 300;
@@ -418,18 +474,22 @@ void PrintConfigDef::init_fff_params()
def->cli = "top-fill-pattern|external-fill-pattern|solid-fill-pattern";
def->enum_keys_map = &ConfigOptionEnum<InfillPattern>::get_enum_values();
def->enum_values.push_back("rectilinear");
+ def->enum_values.push_back("monotonic");
+ def->enum_values.push_back("alignedrectilinear");
def->enum_values.push_back("concentric");
def->enum_values.push_back("hilbertcurve");
def->enum_values.push_back("archimedeanchords");
def->enum_values.push_back("octagramspiral");
def->enum_labels.push_back(L("Rectilinear"));
+ def->enum_labels.push_back(L("Monotonic"));
+ def->enum_labels.push_back(L("Aligned Rectilinear"));
def->enum_labels.push_back(L("Concentric"));
def->enum_labels.push_back(L("Hilbert Curve"));
def->enum_labels.push_back(L("Archimedean Chords"));
def->enum_labels.push_back(L("Octagram Spiral"));
// solid_fill_pattern is an obsolete equivalent to top_fill_pattern/bottom_fill_pattern.
def->aliases = { "solid_fill_pattern", "external_fill_pattern" };
- def->set_default_value(new ConfigOptionEnum<InfillPattern>(ipRectilinear));
+ def->set_default_value(new ConfigOptionEnum<InfillPattern>(ipMonotonic));
def = this->add("bottom_fill_pattern", coEnum);
def->label = L("Bottom fill pattern");
@@ -440,7 +500,7 @@ void PrintConfigDef::init_fff_params()
def->enum_values = def_top_fill_pattern->enum_values;
def->enum_labels = def_top_fill_pattern->enum_labels;
def->aliases = def_top_fill_pattern->aliases;
- def->set_default_value(new ConfigOptionEnum<InfillPattern>(ipRectilinear));
+ def->set_default_value(new ConfigOptionEnum<InfillPattern>(ipMonotonic));
def = this->add("external_perimeter_extrusion_width", coFloatOrPercent);
def->label = L("External perimeters");
@@ -489,7 +549,7 @@ void PrintConfigDef::init_fff_params()
def->tooltip = L("The extruder to use (unless more specific extruder settings are specified). "
"This value overrides perimeter and infill extruders, but not the support extruders.");
def->min = 0; // 0 = inherit defaults
- def->enum_labels.push_back("default"); // override label for item 0
+ def->enum_labels.push_back(L("default")); // override label for item 0
def->enum_labels.push_back("1");
def->enum_labels.push_back("2");
def->enum_labels.push_back("3");
@@ -547,6 +607,7 @@ void PrintConfigDef::init_fff_params()
"this setting to get nice surface finish and correct single wall widths. "
"Usual values are between 0.9 and 1.1. If you think you need to change this more, "
"check filament diameter and your firmware E steps.");
+ def->max = 2;
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloats { 1. });
@@ -559,6 +620,7 @@ void PrintConfigDef::init_fff_params()
"If expressed as percentage (for example: 230%), it will be computed over layer height.");
def->sidetext = L("mm or %");
def->min = 0;
+ def->max = 1000;
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionFloatOrPercent(0, false));
@@ -763,6 +825,16 @@ void PrintConfigDef::init_fff_params()
def->min = 0;
def->set_default_value(new ConfigOptionFloats { 0. });
+ def = this->add("filament_spool_weight", coFloats);
+ def->label = L("Spool weight");
+ def->tooltip = L("Enter weight of the empty filament spool. "
+ "One may weigh a partially consumed filament spool before printing and one may compare the measured weight "
+ "with the calculated weight of the filament with the spool to find out whether the amount "
+ "of filament on the spool is sufficient to finish the print.");
+ def->sidetext = L("g");
+ def->min = 0;
+ def->set_default_value(new ConfigOptionFloats { 0. });
+
def = this->add("filament_settings_id", coStrings);
def->set_default_value(new ConfigOptionStrings { "" });
def->cli = ConfigOptionDef::nocli;
@@ -828,6 +900,7 @@ void PrintConfigDef::init_fff_params()
def->tooltip = L("Fill pattern for general low-density infill.");
def->enum_keys_map = &ConfigOptionEnum<InfillPattern>::get_enum_values();
def->enum_values.push_back("rectilinear");
+ def->enum_values.push_back("alignedrectilinear");
def->enum_values.push_back("grid");
def->enum_values.push_back("triangles");
def->enum_values.push_back("stars");
@@ -840,7 +913,10 @@ void PrintConfigDef::init_fff_params()
def->enum_values.push_back("hilbertcurve");
def->enum_values.push_back("archimedeanchords");
def->enum_values.push_back("octagramspiral");
+ def->enum_values.push_back("adaptivecubic");
+ def->enum_values.push_back("supportcubic");
def->enum_labels.push_back(L("Rectilinear"));
+ def->enum_labels.push_back(L("Aligned Rectilinear"));
def->enum_labels.push_back(L("Grid"));
def->enum_labels.push_back(L("Triangles"));
def->enum_labels.push_back(L("Stars"));
@@ -853,6 +929,8 @@ void PrintConfigDef::init_fff_params()
def->enum_labels.push_back(L("Hilbert Curve"));
def->enum_labels.push_back(L("Archimedean Chords"));
def->enum_labels.push_back(L("Octagram Spiral"));
+ def->enum_labels.push_back(L("Adaptive Cubic"));
+ def->enum_labels.push_back(L("Support Cubic"));
def->set_default_value(new ConfigOptionEnum<InfillPattern>(ipStars));
def = this->add("first_layer_acceleration", coFloat);
@@ -866,8 +944,10 @@ void PrintConfigDef::init_fff_params()
def = this->add("first_layer_bed_temperature", coInts);
def->label = L("First layer");
+ def->full_label = L("First layer bed temperature");
def->tooltip = L("Heated build plate temperature for the first layer. Set this to zero to disable "
"bed temperature control commands in the output.");
+ def->sidetext = L("°C");
def->max = 0;
def->max = 300;
def->set_default_value(new ConfigOptionInts { 0 });
@@ -908,12 +988,25 @@ void PrintConfigDef::init_fff_params()
def = this->add("first_layer_temperature", coInts);
def->label = L("First layer");
- def->tooltip = L("Extruder temperature for first layer. If you want to control temperature manually "
- "during print, set this to zero to disable temperature control commands in the output file.");
+ def->full_label = L("First layer nozzle temperature");
+ def->tooltip = L("Nozzle temperature for the first layer. If you want to control temperature manually "
+ "during print, set this to zero to disable temperature control commands in the output G-code.");
+ def->sidetext = L("°C");
def->min = 0;
def->max = max_temp;
def->set_default_value(new ConfigOptionInts { 200 });
+ def = this->add("full_fan_speed_layer", coInts);
+ def->label = L("Full fan speed at layer");
+ def->tooltip = L("Fan speed will be ramped up linearly from zero at layer \"disable_fan_first_layers\" "
+ "to maximum at layer \"full_fan_speed_layer\". "
+ "\"full_fan_speed_layer\" will be ignored if lower than \"disable_fan_first_layers\", in which case "
+ "the fan will be running at maximum allowed speed at layer \"disable_fan_first_layers\" + 1.");
+ def->min = 0;
+ def->max = 1000;
+ def->mode = comExpert;
+ def->set_default_value(new ConfigOptionInts { 0 });
+
def = this->add("gap_fill_speed", coFloat);
def->label = L("Gap fill");
def->category = L("Speed");
@@ -939,6 +1032,7 @@ void PrintConfigDef::init_fff_params()
"The \"No extrusion\" flavor prevents PrusaSlicer from exporting any extrusion value at all.");
def->enum_keys_map = &ConfigOptionEnum<GCodeFlavor>::get_enum_values();
def->enum_values.push_back("reprap");
+ def->enum_values.push_back("reprapfirmware");
def->enum_values.push_back("repetier");
def->enum_values.push_back("teacup");
def->enum_values.push_back("makerware");
@@ -949,6 +1043,7 @@ void PrintConfigDef::init_fff_params()
def->enum_values.push_back("smoothie");
def->enum_values.push_back("no-extrusion");
def->enum_labels.push_back("RepRap/Sprinter");
+ def->enum_labels.push_back("RepRapFirmware");
def->enum_labels.push_back("Repetier");
def->enum_labels.push_back("Teacup");
def->enum_labels.push_back("MakerWare (MakerBot)");
@@ -959,7 +1054,7 @@ void PrintConfigDef::init_fff_params()
def->enum_labels.push_back("Smoothie");
def->enum_labels.push_back(L("No extrusion"));
def->mode = comExpert;
- def->set_default_value(new ConfigOptionEnum<GCodeFlavor>(gcfRepRap));
+ def->set_default_value(new ConfigOptionEnum<GCodeFlavor>(gcfRepRapSprinter));
def = this->add("gcode_label_objects", coBool);
def->label = L("Label objects");
@@ -997,6 +1092,55 @@ void PrintConfigDef::init_fff_params()
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionInt(1));
+ auto def_infill_anchor_min = def = this->add("infill_anchor", coFloatOrPercent);
+ def->label = L("Length of the infill anchor");
+ def->category = L("Advanced");
+ def->tooltip = L("Connect an infill line to an internal perimeter with a short segment of an additional perimeter. "
+ "If expressed as percentage (example: 15%) it is calculated over infill extrusion width. "
+ "PrusaSlicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment "
+ "shorter than infill_anchor_max is found, the infill line is connected to a perimeter segment at just one side "
+ "and the length of the perimeter segment taken is limited to this parameter, but no longer than anchor_length_max. "
+ "Set this parameter to zero to disable anchoring perimeters connected to a single infill line.");
+ def->sidetext = L("mm or %");
+ def->ratio_over = "infill_extrusion_width";
+ def->gui_type = "f_enum_open";
+ def->enum_values.push_back("0");
+ def->enum_values.push_back("1");
+ def->enum_values.push_back("2");
+ def->enum_values.push_back("5");
+ def->enum_values.push_back("10");
+ def->enum_values.push_back("1000");
+ def->enum_labels.push_back(L("0 (no open anchors)"));
+ def->enum_labels.push_back("1 mm");
+ def->enum_labels.push_back("2 mm");
+ def->enum_labels.push_back("5 mm");
+ def->enum_labels.push_back("10 mm");
+ def->enum_labels.push_back(L("1000 (unlimited)"));
+ def->mode = comAdvanced;
+ def->set_default_value(new ConfigOptionFloatOrPercent(600, true));
+
+ def = this->add("infill_anchor_max", coFloatOrPercent);
+ def->label = L("Maximum length of the infill anchor");
+ def->category = def_infill_anchor_min->category;
+ def->tooltip = L("Connect an infill line to an internal perimeter with a short segment of an additional perimeter. "
+ "If expressed as percentage (example: 15%) it is calculated over infill extrusion width. "
+ "PrusaSlicer tries to connect two close infill lines to a short perimeter segment. If no such perimeter segment "
+ "shorter than this parameter is found, the infill line is connected to a perimeter segment at just one side "
+ "and the length of the perimeter segment taken is limited to infill_anchor, but no longer than this parameter. "
+ "Set this parameter to zero to disable anchoring.");
+ def->sidetext = def_infill_anchor_min->sidetext;
+ def->ratio_over = def_infill_anchor_min->ratio_over;
+ def->gui_type = def_infill_anchor_min->gui_type;
+ def->enum_values = def_infill_anchor_min->enum_values;
+ def->enum_labels.push_back(L("0 (not anchored)"));
+ def->enum_labels.push_back("1 mm");
+ def->enum_labels.push_back("2 mm");
+ def->enum_labels.push_back("5 mm");
+ def->enum_labels.push_back("10 mm");
+ def->enum_labels.push_back(L("1000 (unlimited)"));
+ def->mode = def_infill_anchor_min->mode;
+ def->set_default_value(new ConfigOptionFloatOrPercent(50, false));
+
def = this->add("infill_extruder", coInt);
def->label = L("Infill extruder");
def->category = L("Extruders");
@@ -1076,6 +1220,55 @@ void PrintConfigDef::init_fff_params()
def->mode = comExpert;
def->set_default_value(new ConfigOptionBool(false));
+ def = this->add("ironing", coBool);
+ def->label = L("Enable ironing");
+ def->tooltip = L("Enable ironing of the top layers with the hot print head for smooth surface");
+ def->category = L("Ironing");
+ def->mode = comAdvanced;
+ def->set_default_value(new ConfigOptionBool(false));
+
+ def = this->add("ironing_type", coEnum);
+ def->label = L("Ironing Type");
+ def->category = L("Ironing");
+ def->tooltip = L("Ironing Type");
+ def->enum_keys_map = &ConfigOptionEnum<IroningType>::get_enum_values();
+ def->enum_values.push_back("top");
+ def->enum_values.push_back("topmost");
+ def->enum_values.push_back("solid");
+ def->enum_labels.push_back(L("All top surfaces"));
+ def->enum_labels.push_back(L("Topmost surface only"));
+ def->enum_labels.push_back(L("All solid surfaces"));
+ def->mode = comAdvanced;
+ def->set_default_value(new ConfigOptionEnum<IroningType>(IroningType::TopSurfaces));
+
+ def = this->add("ironing_flowrate", coPercent);
+ def->label = L("Flow rate");
+ def->category = L("Ironing");
+ def->tooltip = L("Percent of a flow rate relative to object's normal layer height.");
+ def->sidetext = L("%");
+ def->ratio_over = "layer_height";
+ def->min = 0;
+ def->mode = comExpert;
+ def->set_default_value(new ConfigOptionPercent(15));
+
+ def = this->add("ironing_spacing", coFloat);
+ def->label = L("Spacing between ironing passes");
+ def->category = L("Ironing");
+ def->tooltip = L("Distance between ironing lines");
+ def->sidetext = L("mm");
+ def->min = 0;
+ def->mode = comExpert;
+ def->set_default_value(new ConfigOptionFloat(0.1));
+
+ def = this->add("ironing_speed", coFloat);
+ def->label = L("Ironing");
+ def->category = L("Speed");
+ def->tooltip = L("Ironing");
+ def->sidetext = L("mm/s");
+ def->min = 0;
+ def->mode = comAdvanced;
+ def->set_default_value(new ConfigOptionFloat(15));
+
def = this->add("layer_gcode", coString);
def->label = L("After layer change G-code");
def->tooltip = L("This custom code is inserted at every layer change, right after the Z move "
@@ -1103,6 +1296,21 @@ void PrintConfigDef::init_fff_params()
def->mode = comExpert;
def->set_default_value(new ConfigOptionBool(true));
+ def = this->add("machine_limits_usage", coEnum);
+ def->label = L("How to apply limits");
+ def->full_label = L("Purpose of Machine Limits");
+ def->category = L("Machine limits");
+ def->tooltip = L("How to apply the Machine Limits");
+ def->enum_keys_map = &ConfigOptionEnum<MachineLimitsUsage>::get_enum_values();
+ def->enum_values.push_back("emit_to_gcode");
+ def->enum_values.push_back("time_estimate_only");
+ def->enum_values.push_back("ignore");
+ def->enum_labels.push_back(L("Emit to G-code"));
+ def->enum_labels.push_back(L("Use for time estimate"));
+ def->enum_labels.push_back(L("Ignore"));
+ def->mode = comAdvanced;
+ def->set_default_value(new ConfigOptionEnum<MachineLimitsUsage>(MachineLimitsUsage::EmitToGCode));
+
{
struct AxisDefault {
std::string name;
@@ -1337,10 +1545,12 @@ void PrintConfigDef::init_fff_params()
def->enum_values.push_back("duet");
def->enum_values.push_back("flashair");
def->enum_values.push_back("astrobox");
+ def->enum_values.push_back("repetier");
def->enum_labels.push_back("OctoPrint");
def->enum_labels.push_back("Duet");
def->enum_labels.push_back("FlashAir");
def->enum_labels.push_back("AstroBox");
+ def->enum_labels.push_back("Repetier");
def->mode = comAdvanced;
def->set_default_value(new ConfigOptionEnum<PrintHostType>(htOctoPrint));
@@ -1398,8 +1608,7 @@ void PrintConfigDef::init_fff_params()
def = this->add("perimeter_acceleration", coFloat);
def->label = L("Perimeters");
def->tooltip = L("This is the acceleration your printer will use for perimeters. "
- "A high value like 9000 usually gives good results if your hardware is up to the job. "
- "Set zero to disable acceleration control for perimeters.");
+ "Set zero to disable acceleration control for perimeters.");
def->sidetext = L("mm/s²");
def->mode = comExpert;
def->set_default_value(new ConfigOptionFloat(0));
@@ -1497,6 +1706,10 @@ void PrintConfigDef::init_fff_params()
def->set_default_value(new ConfigOptionString(""));
def->cli = ConfigOptionDef::nocli;
+ def = this->add("physical_printer_settings_id", coString);
+ def->set_default_value(new ConfigOptionString(""));
+ def->cli = ConfigOptionDef::nocli;
+
def = this->add("raft_layers", coInt);
def->label = L("Raft layers");
def->category = L("Support material");
@@ -1655,26 +1868,6 @@ void PrintConfigDef::init_fff_params()
def->set_default_value(new ConfigOptionFloat(30));
#endif
- def = this->add("serial_port", coString);
- def->gui_type = "select_open";
- def->label = "";
- def->full_label = L("Serial port");
- def->tooltip = L("USB/serial port for printer connection.");
- def->width = 20;
- def->set_default_value(new ConfigOptionString(""));
-
- def = this->add("serial_speed", coInt);
- def->gui_type = "i_enum_open";
- def->label = L("Speed");
- def->full_label = L("Serial port speed");
- def->tooltip = L("Speed (baud) of USB/serial port for printer connection.");
- def->min = 1;
- def->max = 300000;
- def->enum_values.push_back("115200");
- def->enum_values.push_back("250000");
- def->mode = comAdvanced;
- def->set_default_value(new ConfigOptionInt(250000));
-
def = this->add("skirt_distance", coFloat);
def->label = L("Distance from object");
def->tooltip = L("Distance between skirt and object(s). Set this to zero to attach the skirt "
@@ -1803,7 +1996,7 @@ void PrintConfigDef::init_fff_params()
"in order to remove any visible seam. This option requires a single perimeter, "
"no infill, no top solid layers and no support material. You can still set "
"any number of bottom solid layers as well as skirt/brim loops. "
- "It won't work when printing more than an object.");
+ "It won't work when printing more than one single object.");
def->set_default_value(new ConfigOptionBool(false));
def = this->add("standby_temperature_delta", coInt);
@@ -1848,6 +2041,33 @@ void PrintConfigDef::init_fff_params()
def->mode = comExpert;
def->set_default_value(new ConfigOptionStrings { "; Filament gcode\n" });
+ def = this->add("color_change_gcode", coString);
+ def->label = L("Color change G-code");
+ def->tooltip = L("This G-code will be used as a code for the color change");
+ def->multiline = true;
+ def->full_width = true;
+ def->height = 12;
+ def->mode = comExpert;
+ def->set_default_value(new ConfigOptionString("M600"));
+
+ def = this->add("pause_print_gcode", coString);
+ def->label = L("Pause Print G-code");
+ def->tooltip = L("This G-code will be used as a code for the pause print");
+ def->multiline = true;
+ def->full_width = true;
+ def->height = 12;
+ def->mode = comExpert;
+ def->set_default_value(new ConfigOptionString("M601"));
+
+ def = this->add("template_custom_gcode", coString);
+ def->label = L("Custom G-code");
+ def->tooltip = L("This G-code will be used as a custom code");
+ def->multiline = true;
+ def->full_width = true;
+ def->height = 12;
+ def->mode = comExpert;
+ def->set_default_value(new ConfigOptionString(""));
+
def = this->add("single_extruder_multi_material", coBool);
def->label = L("Single Extruder Multi Material");
def->tooltip = L("The printer multiplexes filaments into a single hot end.");
@@ -2069,9 +2289,10 @@ void PrintConfigDef::init_fff_params()
def = this->add("temperature", coInts);
def->label = L("Other layers");
- def->tooltip = L("Extruder temperature for layers after the first one. Set this to zero to disable "
- "temperature control commands in the output.");
- def->full_label = L("Temperature");
+ def->tooltip = L("Nozzle temperature for layers after the first one. Set this to zero to disable "
+ "temperature control commands in the output G-code.");
+ def->sidetext = L("°C");
+ def->full_label = L("Nozzle temperature");
def->min = 0;
def->max = max_temp;
def->set_default_value(new ConfigOptionInts { 200 });
@@ -2624,7 +2845,7 @@ void PrintConfigDef::init_sla_params()
def->set_default_value(new ConfigOptionBool(true));
def = this->add("support_head_front_diameter", coFloat);
- def->label = L("Support head front diameter");
+ def->label = L("Pinhead front diameter");
def->category = L("Supports");
def->tooltip = L("Diameter of the pointing side of the head");
def->sidetext = L("mm");
@@ -2633,7 +2854,7 @@ void PrintConfigDef::init_sla_params()
def->set_default_value(new ConfigOptionFloat(0.4));
def = this->add("support_head_penetration", coFloat);
- def->label = L("Support head penetration");
+ def->label = L("Head penetration");
def->category = L("Supports");
def->tooltip = L("How much the pinhead has to penetrate the model surface");
def->sidetext = L("mm");
@@ -2642,7 +2863,7 @@ void PrintConfigDef::init_sla_params()
def->set_default_value(new ConfigOptionFloat(0.2));
def = this->add("support_head_width", coFloat);
- def->label = L("Support head width");
+ def->label = L("Pinhead width");
def->category = L("Supports");
def->tooltip = L("Width from the back sphere center to the front sphere center");
def->sidetext = L("mm");
@@ -2652,7 +2873,7 @@ void PrintConfigDef::init_sla_params()
def->set_default_value(new ConfigOptionFloat(1.0));
def = this->add("support_pillar_diameter", coFloat);
- def->label = L("Support pillar diameter");
+ def->label = L("Pillar diameter");
def->category = L("Supports");
def->tooltip = L("Diameter in mm of the support pillars");
def->sidetext = L("mm");
@@ -2660,6 +2881,17 @@ void PrintConfigDef::init_sla_params()
def->max = 15;
def->mode = comSimple;
def->set_default_value(new ConfigOptionFloat(1.0));
+
+ def = this->add("support_small_pillar_diameter_percent", coPercent);
+ def->label = L("Small pillar diameter percent");
+ def->category = L("Supports");
+ def->tooltip = L("The percentage of smaller pillars compared to the normal pillar diameter "
+ "which are used in problematic areas where a normal pilla cannot fit.");
+ def->sidetext = L("%");
+ def->min = 1;
+ def->max = 100;
+ def->mode = comExpert;
+ def->set_default_value(new ConfigOptionPercent(50));
def = this->add("support_max_bridges_on_pillar", coInt);
def->label = L("Max bridges on a pillar");
@@ -2672,7 +2904,7 @@ void PrintConfigDef::init_sla_params()
def->set_default_value(new ConfigOptionInt(3));
def = this->add("support_pillar_connection_mode", coEnum);
- def->label = L("Support pillar connection mode");
+ def->label = L("Pillar connection mode");
def->tooltip = L("Controls the bridge type between two neighboring pillars."
" Can be zig-zag, cross (double zig-zag) or dynamic which"
" will automatically switch between the first two depending"
@@ -3027,10 +3259,15 @@ void PrintConfigDef::handle_legacy(t_config_option_key &opt_key, std::string &va
"seal_position", "vibration_limit", "bed_size",
"print_center", "g0", "threads", "pressure_advance", "wipe_tower_per_color_wipe"
#ifndef HAS_PRESSURE_EQUALIZER
- , "max_volumetric_extrusion_rate_slope_positive", "max_volumetric_extrusion_rate_slope_negative"
+ , "max_volumetric_extrusion_rate_slope_positive", "max_volumetric_extrusion_rate_slope_negative",
#endif /* HAS_PRESSURE_EQUALIZER */
+ "serial_port", "serial_speed"
};
+ // In PrusaSlicer 2.3.0-alpha0 the "monotonous" infill was introduced, which was later renamed to "monotonic".
+ if (value == "monotonous" && (opt_key == "top_fill_pattern" || opt_key == "bottom_fill_pattern" || opt_key == "fill_pattern"))
+ value = "monotonic";
+
if (ignore.find(opt_key) != ignore.end()) {
opt_key = "";
return;
@@ -3060,7 +3297,43 @@ DynamicPrintConfig* DynamicPrintConfig::new_from_defaults_keys(const std::vector
return out;
}
-void DynamicPrintConfig::normalize()
+double min_object_distance(const ConfigBase &cfg)
+{
+ double ret = 0.;
+
+ if (printer_technology(cfg) == ptSLA) ret = 6.;
+ else {
+ auto ecr_opt = cfg.option<ConfigOptionFloat>("extruder_clearance_radius");
+ auto dd_opt = cfg.option<ConfigOptionFloat>("duplicate_distance");
+ auto co_opt = cfg.option<ConfigOptionBool>("complete_objects");
+
+ if (!ecr_opt || !dd_opt || !co_opt) ret = 0.;
+ else {
+ // min object distance is max(duplicate_distance, clearance_radius)
+ ret = (co_opt->value && ecr_opt->value > dd_opt->value) ?
+ ecr_opt->value : dd_opt->value;
+ }
+ }
+
+ return ret;
+}
+
+PrinterTechnology printer_technology(const ConfigBase &cfg)
+{
+ const ConfigOptionEnum<PrinterTechnology> *opt = cfg.option<ConfigOptionEnum<PrinterTechnology>>("printer_technology");
+
+ if (opt) return opt->value;
+
+ const ConfigOptionBool *export_opt = cfg.option<ConfigOptionBool>("export_sla");
+ if (export_opt && export_opt->getBool()) return ptSLA;
+
+ export_opt = cfg.option<ConfigOptionBool>("export_gcode");
+ if (export_opt && export_opt->getBool()) return ptFFF;
+
+ return ptUnknown;
+}
+
+void DynamicPrintConfig::normalize_fdm()
{
if (this->has("extruder")) {
int extruder = this->option("extruder")->getInt();
@@ -3086,8 +3359,11 @@ void DynamicPrintConfig::normalize()
if (this->has("spiral_vase") && this->opt<ConfigOptionBool>("spiral_vase", true)->value) {
{
// this should be actually done only on the spiral layers instead of all
- ConfigOptionBools* opt = this->opt<ConfigOptionBools>("retract_layer_change", true);
+ auto* opt = this->opt<ConfigOptionBools>("retract_layer_change", true);
opt->values.assign(opt->values.size(), false); // set all values to false
+ // Disable retract on layer change also for filament overrides.
+ auto* opt_n = this->opt<ConfigOptionBoolsNullable>("filament_retract_layer_change", true);
+ opt_n->values.assign(opt_n->values.size(), false); // Set all values to false.
}
{
this->opt<ConfigOptionInt>("perimeters", true)->value = 1;
@@ -3102,6 +3378,8 @@ void DynamicPrintConfig::set_num_extruders(unsigned int num_extruders)
const auto &defaults = FullPrintConfig::defaults();
for (const std::string &key : print_config_def.extruder_option_keys()) {
if (key == "default_filament_profile")
+ // Don't resize this field, as it is presented to the user at the "Dependencies" page of the Printer profile and we don't want to present
+ // empty fields there, if not defined by the system profile.
continue;
auto *opt = this->option(key, false);
assert(opt != nullptr);
@@ -3130,22 +3408,6 @@ std::string DynamicPrintConfig::validate()
}
}
-double PrintConfig::min_object_distance() const
-{
- return PrintConfig::min_object_distance(static_cast<const ConfigBase*>(this));
-}
-
-double PrintConfig::min_object_distance(const ConfigBase *config)
-{
- double extruder_clearance_radius = config->option("extruder_clearance_radius")->getFloat();
- double duplicate_distance = config->option("duplicate_distance")->getFloat();
-
- // min object distance is max(duplicate_distance, clearance_radius)
- return (config->option("complete_objects")->getBool() && extruder_clearance_radius > duplicate_distance)
- ? extruder_clearance_radius
- : duplicate_distance;
-}
-
//FIXME localize this function.
std::string FullPrintConfig::validate()
{
@@ -3181,11 +3443,12 @@ std::string FullPrintConfig::validate()
if (this->use_firmware_retraction.value &&
this->gcode_flavor.value != gcfSmoothie &&
- this->gcode_flavor.value != gcfRepRap &&
+ this->gcode_flavor.value != gcfRepRapSprinter &&
+ this->gcode_flavor.value != gcfRepRapFirmware &&
this->gcode_flavor.value != gcfMarlin &&
this->gcode_flavor.value != gcfMachinekit &&
this->gcode_flavor.value != gcfRepetier)
- return "--use-firmware-retraction is only supported by Marlin, Smoothie, Repetier and Machinekit firmware";
+ return "--use-firmware-retraction is only supported by Marlin, Smoothie, RepRapFirmware, Repetier and Machinekit firmware";
if (this->use_firmware_retraction.value)
for (unsigned char wipe : this->wipe.values)
@@ -3324,7 +3587,6 @@ StaticPrintConfig::StaticCache<class Slic3r::PrintRegionConfig> PrintRegionConfi
StaticPrintConfig::StaticCache<class Slic3r::MachineEnvelopeConfig> MachineEnvelopeConfig::s_cache_MachineEnvelopeConfig;
StaticPrintConfig::StaticCache<class Slic3r::GCodeConfig> GCodeConfig::s_cache_GCodeConfig;
StaticPrintConfig::StaticCache<class Slic3r::PrintConfig> PrintConfig::s_cache_PrintConfig;
-StaticPrintConfig::StaticCache<class Slic3r::HostConfig> HostConfig::s_cache_HostConfig;
StaticPrintConfig::StaticCache<class Slic3r::FullPrintConfig> FullPrintConfig::s_cache_FullPrintConfig;
StaticPrintConfig::StaticCache<class Slic3r::SLAMaterialConfig> SLAMaterialConfig::s_cache_SLAMaterialConfig;
@@ -3377,6 +3639,12 @@ CLIActionsConfigDef::CLIActionsConfigDef()
def->cli = "export-gcode|gcode|g";
def->set_default_value(new ConfigOptionBool(false));
+ def = this->add("gcodeviewer", coBool);
+ def->label = L("G-code viewer");
+ def->tooltip = L("Visualize an already sliced and saved G-code");
+ def->cli = "gcodeviewer";
+ def->set_default_value(new ConfigOptionBool(false));
+
def = this->add("slice", coBool);
def->label = L("Slice");
def->tooltip = L("Slice the model as FFF or SLA based on the printer_technology configuration value.");
@@ -3516,6 +3784,12 @@ CLIMiscConfigDef::CLIMiscConfigDef()
def->tooltip = L("The file where the output will be written (if not specified, it will be based on the input file).");
def->cli = "output|o";
+ def = this->add("single_instance", coBool);
+ def->label = L("Single instance mode");
+ def->tooltip = L("If enabled, the command line arguments are sent to an existing instance of GUI PrusaSlicer, "
+ "or an existing PrusaSlicer window is activated. "
+ "Overrides the \"single_instance\" configuration value from application preferences.");
+
/*
def = this->add("autosave", coString);
def->label = L("Autosave");
@@ -3555,8 +3829,41 @@ void DynamicPrintAndCLIConfig::handle_legacy(t_config_option_key &opt_key, std::
}
}
+uint64_t ModelConfig::s_last_timestamp = 1;
+
+static Points to_points(const std::vector<Vec2d> &dpts)
+{
+ Points pts; pts.reserve(dpts.size());
+ for (auto &v : dpts)
+ pts.emplace_back( coord_t(scale_(v.x())), coord_t(scale_(v.y())) );
+ return pts;
+}
+
+Points get_bed_shape(const DynamicPrintConfig &config)
+{
+ const auto *bed_shape_opt = config.opt<ConfigOptionPoints>("bed_shape");
+ if (!bed_shape_opt) {
+
+ // Here, it is certain that the bed shape is missing, so an infinite one
+ // has to be used, but still, the center of bed can be queried
+ if (auto center_opt = config.opt<ConfigOptionPoint>("center"))
+ return { scaled(center_opt->value) };
+
+ return {};
+ }
+
+ return to_points(bed_shape_opt->values);
+}
+
+Points get_bed_shape(const PrintConfig &cfg)
+{
+ return to_points(cfg.bed_shape.values);
}
+Points get_bed_shape(const SLAPrinterConfig &cfg) { return to_points(cfg.bed_shape.values); }
+
+} // namespace Slic3r
+
#include <cereal/types/polymorphic.hpp>
CEREAL_REGISTER_TYPE(Slic3r::DynamicPrintConfig)
CEREAL_REGISTER_POLYMORPHIC_RELATION(Slic3r::DynamicConfig, Slic3r::DynamicPrintConfig)
diff --git a/src/libslic3r/PrintConfig.hpp b/src/libslic3r/PrintConfig.hpp
index ca509e37a..b5896891e 100644
--- a/src/libslic3r/PrintConfig.hpp
+++ b/src/libslic3r/PrintConfig.hpp
@@ -11,7 +11,6 @@
// PrintRegionConfig
// PrintConfig
// GCodeConfig
-// HostConfig
//
#ifndef slic3r_PrintConfig_hpp_
@@ -25,17 +24,35 @@
namespace Slic3r {
enum GCodeFlavor : unsigned char {
- gcfRepRap, gcfRepetier, gcfTeacup, gcfMakerWare, gcfMarlin, gcfSailfish, gcfMach3, gcfMachinekit,
+ gcfRepRapSprinter, gcfRepRapFirmware, gcfRepetier, gcfTeacup, gcfMakerWare, gcfMarlin, gcfSailfish, gcfMach3, gcfMachinekit,
gcfSmoothie, gcfNoExtrusion,
};
+enum class MachineLimitsUsage {
+ EmitToGCode,
+ TimeEstimateOnly,
+ Ignore,
+ Count,
+};
+
enum PrintHostType {
- htOctoPrint, htDuet, htFlashAir, htAstroBox
+ htOctoPrint, htDuet, htFlashAir, htAstroBox, htRepetier
+};
+
+enum AuthorizationType {
+ atKeyPassword, atUserPassword
};
-enum InfillPattern {
- ipRectilinear, ipGrid, ipTriangles, ipStars, ipCubic, ipLine, ipConcentric, ipHoneycomb, ip3DHoneycomb,
- ipGyroid, ipHilbertCurve, ipArchimedeanChords, ipOctagramSpiral, ipCount,
+enum InfillPattern : int {
+ ipRectilinear, ipMonotonic, ipAlignedRectilinear, ipGrid, ipTriangles, ipStars, ipCubic, ipLine, ipConcentric, ipHoneycomb, ip3DHoneycomb,
+ ipGyroid, ipHilbertCurve, ipArchimedeanChords, ipOctagramSpiral, ipAdaptiveCubic, ipSupportCubic, ipCount,
+};
+
+enum class IroningType {
+ TopSurfaces,
+ TopmostOnly,
+ AllSolid,
+ Count,
};
enum SupportMaterialPattern {
@@ -77,7 +94,8 @@ template<> inline const t_config_enum_values& ConfigOptionEnum<PrinterTechnology
template<> inline const t_config_enum_values& ConfigOptionEnum<GCodeFlavor>::get_enum_values() {
static t_config_enum_values keys_map;
if (keys_map.empty()) {
- keys_map["reprap"] = gcfRepRap;
+ keys_map["reprap"] = gcfRepRapSprinter;
+ keys_map["reprapfirmware"] = gcfRepRapFirmware;
keys_map["repetier"] = gcfRepetier;
keys_map["teacup"] = gcfTeacup;
keys_map["makerware"] = gcfMakerWare;
@@ -91,6 +109,16 @@ template<> inline const t_config_enum_values& ConfigOptionEnum<GCodeFlavor>::get
return keys_map;
}
+template<> inline const t_config_enum_values& ConfigOptionEnum<MachineLimitsUsage>::get_enum_values() {
+ static t_config_enum_values keys_map;
+ if (keys_map.empty()) {
+ keys_map["emit_to_gcode"] = int(MachineLimitsUsage::EmitToGCode);
+ keys_map["time_estimate_only"] = int(MachineLimitsUsage::TimeEstimateOnly);
+ keys_map["ignore"] = int(MachineLimitsUsage::Ignore);
+ }
+ return keys_map;
+}
+
template<> inline const t_config_enum_values& ConfigOptionEnum<PrintHostType>::get_enum_values() {
static t_config_enum_values keys_map;
if (keys_map.empty()) {
@@ -98,6 +126,16 @@ template<> inline const t_config_enum_values& ConfigOptionEnum<PrintHostType>::g
keys_map["duet"] = htDuet;
keys_map["flashair"] = htFlashAir;
keys_map["astrobox"] = htAstroBox;
+ keys_map["repetier"] = htRepetier;
+ }
+ return keys_map;
+}
+
+template<> inline const t_config_enum_values& ConfigOptionEnum<AuthorizationType>::get_enum_values() {
+ static t_config_enum_values keys_map;
+ if (keys_map.empty()) {
+ keys_map["key"] = atKeyPassword;
+ keys_map["user"] = atUserPassword;
}
return keys_map;
}
@@ -106,6 +144,8 @@ template<> inline const t_config_enum_values& ConfigOptionEnum<InfillPattern>::g
static t_config_enum_values keys_map;
if (keys_map.empty()) {
keys_map["rectilinear"] = ipRectilinear;
+ keys_map["monotonic"] = ipMonotonic;
+ keys_map["alignedrectilinear"] = ipAlignedRectilinear;
keys_map["grid"] = ipGrid;
keys_map["triangles"] = ipTriangles;
keys_map["stars"] = ipStars;
@@ -118,6 +158,18 @@ template<> inline const t_config_enum_values& ConfigOptionEnum<InfillPattern>::g
keys_map["hilbertcurve"] = ipHilbertCurve;
keys_map["archimedeanchords"] = ipArchimedeanChords;
keys_map["octagramspiral"] = ipOctagramSpiral;
+ keys_map["adaptivecubic"] = ipAdaptiveCubic;
+ keys_map["supportcubic"] = ipSupportCubic;
+ }
+ return keys_map;
+}
+
+template<> inline const t_config_enum_values& ConfigOptionEnum<IroningType>::get_enum_values() {
+ static t_config_enum_values keys_map;
+ if (keys_map.empty()) {
+ keys_map["top"] = int(IroningType::TopSurfaces);
+ keys_map["topmost"] = int(IroningType::TopmostOnly);
+ keys_map["solid"] = int(IroningType::AllSolid);
}
return keys_map;
}
@@ -194,6 +246,9 @@ extern const PrintConfigDef print_config_def;
class StaticPrintConfig;
+PrinterTechnology printer_technology(const ConfigBase &cfg);
+double min_object_distance(const ConfigBase &cfg);
+
// Slic3r dynamic configuration, used to override the configuration
// per object, per modification volume or per printing material.
// The dynamic configuration is also used to store user modifications of the print global parameters,
@@ -205,16 +260,20 @@ class DynamicPrintConfig : public DynamicConfig
public:
DynamicPrintConfig() {}
DynamicPrintConfig(const DynamicPrintConfig &rhs) : DynamicConfig(rhs) {}
+ DynamicPrintConfig(DynamicPrintConfig &&rhs) noexcept : DynamicConfig(std::move(rhs)) {}
explicit DynamicPrintConfig(const StaticPrintConfig &rhs);
explicit DynamicPrintConfig(const ConfigBase &rhs) : DynamicConfig(rhs) {}
+ DynamicPrintConfig& operator=(const DynamicPrintConfig &rhs) { DynamicConfig::operator=(rhs); return *this; }
+ DynamicPrintConfig& operator=(DynamicPrintConfig &&rhs) noexcept { DynamicConfig::operator=(std::move(rhs)); return *this; }
+
static DynamicPrintConfig full_print_config();
static DynamicPrintConfig* new_from_defaults_keys(const std::vector<std::string> &keys);
// Overrides ConfigBase::def(). Static configuration definition. Any value stored into this ConfigBase shall have its definition here.
const ConfigDef* def() const override { return &print_config_def; }
- void normalize();
+ void normalize_fdm();
void set_num_extruders(unsigned int num_extruders);
@@ -229,14 +288,6 @@ public:
{ PrintConfigDef::handle_legacy(opt_key, value); }
};
-template<typename CONFIG>
-void normalize_and_apply_config(CONFIG &dst, const DynamicPrintConfig &src)
-{
- DynamicPrintConfig src_normalized(src);
- src_normalized.normalize();
- dst.apply(src_normalized, true);
-}
-
class StaticPrintConfig : public StaticConfig
{
public:
@@ -480,11 +531,19 @@ public:
ConfigOptionPercent fill_density;
ConfigOptionEnum<InfillPattern> fill_pattern;
ConfigOptionFloat gap_fill_speed;
+ ConfigOptionFloatOrPercent infill_anchor;
+ ConfigOptionFloatOrPercent infill_anchor_max;
ConfigOptionInt infill_extruder;
ConfigOptionFloatOrPercent infill_extrusion_width;
ConfigOptionInt infill_every_layers;
ConfigOptionFloatOrPercent infill_overlap;
ConfigOptionFloat infill_speed;
+ // Ironing options
+ ConfigOptionBool ironing;
+ ConfigOptionEnum<IroningType> ironing_type;
+ ConfigOptionPercent ironing_flowrate;
+ ConfigOptionFloat ironing_spacing;
+ ConfigOptionFloat ironing_speed;
// Detect bridging perimeters
ConfigOptionBool overhangs;
ConfigOptionInt perimeter_extruder;
@@ -525,11 +584,18 @@ protected:
OPT_PTR(fill_density);
OPT_PTR(fill_pattern);
OPT_PTR(gap_fill_speed);
+ OPT_PTR(infill_anchor);
+ OPT_PTR(infill_anchor_max);
OPT_PTR(infill_extruder);
OPT_PTR(infill_extrusion_width);
OPT_PTR(infill_every_layers);
OPT_PTR(infill_overlap);
OPT_PTR(infill_speed);
+ OPT_PTR(ironing);
+ OPT_PTR(ironing_type);
+ OPT_PTR(ironing_flowrate);
+ OPT_PTR(ironing_spacing);
+ OPT_PTR(ironing_speed);
OPT_PTR(overhangs);
OPT_PTR(perimeter_extruder);
OPT_PTR(perimeter_extrusion_width);
@@ -554,6 +620,8 @@ class MachineEnvelopeConfig : public StaticPrintConfig
{
STATIC_PRINT_CONFIG_CACHE(MachineEnvelopeConfig)
public:
+ // Allowing the machine limits to be completely ignored or used just for time estimator.
+ ConfigOptionEnum<MachineLimitsUsage> machine_limits_usage;
// M201 X... Y... Z... E... [mm/sec^2]
ConfigOptionFloats machine_max_acceleration_x;
ConfigOptionFloats machine_max_acceleration_y;
@@ -581,6 +649,7 @@ public:
protected:
void initialize(StaticCacheBase &cache, const char *base_ptr)
{
+ OPT_PTR(machine_limits_usage);
OPT_PTR(machine_max_acceleration_x);
OPT_PTR(machine_max_acceleration_y);
OPT_PTR(machine_max_acceleration_z);
@@ -617,6 +686,7 @@ public:
ConfigOptionStrings filament_type;
ConfigOptionBools filament_soluble;
ConfigOptionFloats filament_cost;
+ ConfigOptionFloats filament_spool_weight;
ConfigOptionFloats filament_max_volumetric_speed;
ConfigOptionFloats filament_loading_speed;
ConfigOptionFloats filament_loading_speed_start;
@@ -667,6 +737,9 @@ public:
ConfigOptionBool remaining_times;
ConfigOptionBool silent_mode;
ConfigOptionFloat extra_loading_move;
+ ConfigOptionString color_change_gcode;
+ ConfigOptionString pause_print_gcode;
+ ConfigOptionString template_custom_gcode;
std::string get_extrusion_axis() const
{
@@ -690,6 +763,7 @@ protected:
OPT_PTR(filament_type);
OPT_PTR(filament_soluble);
OPT_PTR(filament_cost);
+ OPT_PTR(filament_spool_weight);
OPT_PTR(filament_max_volumetric_speed);
OPT_PTR(filament_loading_speed);
OPT_PTR(filament_loading_speed_start);
@@ -740,6 +814,9 @@ protected:
OPT_PTR(remaining_times);
OPT_PTR(silent_mode);
OPT_PTR(extra_loading_move);
+ OPT_PTR(color_change_gcode);
+ OPT_PTR(pause_print_gcode);
+ OPT_PTR(template_custom_gcode);
}
};
@@ -749,10 +826,9 @@ class PrintConfig : public MachineEnvelopeConfig, public GCodeConfig
STATIC_PRINT_CONFIG_CACHE_DERIVED(PrintConfig)
PrintConfig() : MachineEnvelopeConfig(0), GCodeConfig(0) { initialize_cache(); *this = s_cache_PrintConfig.defaults(); }
public:
- double min_object_distance() const;
- static double min_object_distance(const ConfigBase *config);
ConfigOptionBool avoid_crossing_perimeters;
+ ConfigOptionFloatOrPercent avoid_crossing_perimeters_max_detour;
ConfigOptionPoints bed_shape;
ConfigOptionInts bed_temperature;
ConfigOptionFloat bridge_acceleration;
@@ -777,6 +853,7 @@ public:
ConfigOptionFloatOrPercent first_layer_extrusion_width;
ConfigOptionFloatOrPercent first_layer_speed;
ConfigOptionInts first_layer_temperature;
+ ConfigOptionInts full_fan_speed_layer;
ConfigOptionFloat infill_acceleration;
ConfigOptionBool infill_first;
ConfigOptionInts max_fan_speed;
@@ -826,6 +903,7 @@ protected:
this->MachineEnvelopeConfig::initialize(cache, base_ptr);
this->GCodeConfig::initialize(cache, base_ptr);
OPT_PTR(avoid_crossing_perimeters);
+ OPT_PTR(avoid_crossing_perimeters_max_detour);
OPT_PTR(bed_shape);
OPT_PTR(bed_temperature);
OPT_PTR(bridge_acceleration);
@@ -850,6 +928,7 @@ protected:
OPT_PTR(first_layer_extrusion_width);
OPT_PTR(first_layer_speed);
OPT_PTR(first_layer_temperature);
+ OPT_PTR(full_fan_speed_layer);
OPT_PTR(infill_acceleration);
OPT_PTR(infill_first);
OPT_PTR(max_fan_speed);
@@ -894,38 +973,14 @@ protected:
}
};
-class HostConfig : public StaticPrintConfig
-{
- STATIC_PRINT_CONFIG_CACHE(HostConfig)
-public:
- ConfigOptionEnum<PrintHostType> host_type;
- ConfigOptionString print_host;
- ConfigOptionString printhost_apikey;
- ConfigOptionString printhost_cafile;
- ConfigOptionString serial_port;
- ConfigOptionInt serial_speed;
-
-protected:
- void initialize(StaticCacheBase &cache, const char *base_ptr)
- {
- OPT_PTR(host_type);
- OPT_PTR(print_host);
- OPT_PTR(printhost_apikey);
- OPT_PTR(printhost_cafile);
- OPT_PTR(serial_port);
- OPT_PTR(serial_speed);
- }
-};
-
// This object is mapped to Perl as Slic3r::Config::Full.
class FullPrintConfig :
public PrintObjectConfig,
public PrintRegionConfig,
- public PrintConfig,
- public HostConfig
+ public PrintConfig
{
STATIC_PRINT_CONFIG_CACHE_DERIVED(FullPrintConfig)
- FullPrintConfig() : PrintObjectConfig(0), PrintRegionConfig(0), PrintConfig(0), HostConfig(0) { initialize_cache(); *this = s_cache_FullPrintConfig.defaults(); }
+ FullPrintConfig() : PrintObjectConfig(0), PrintRegionConfig(0), PrintConfig(0) { initialize_cache(); *this = s_cache_FullPrintConfig.defaults(); }
public:
// Validate the FullPrintConfig. Returns an empty string on success, otherwise an error message is returned.
@@ -933,13 +988,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);
}
};
@@ -982,6 +1036,10 @@ public:
// Radius in mm of the support pillars.
ConfigOptionFloat support_pillar_diameter /*= 0.8*/;
+
+ // The percentage of smaller pillars compared to the normal pillar diameter
+ // which are used in problematic areas where a normal pilla cannot fit.
+ ConfigOptionPercent support_small_pillar_diameter_percent;
// How much bridge (supporting another pinhead) can be placed on a pillar.
ConfigOptionInt support_max_bridges_on_pillar;
@@ -1106,6 +1164,7 @@ protected:
OPT_PTR(support_head_penetration);
OPT_PTR(support_head_width);
OPT_PTR(support_pillar_diameter);
+ OPT_PTR(support_small_pillar_diameter_percent);
OPT_PTR(support_max_bridges_on_pillar);
OPT_PTR(support_pillar_connection_mode);
OPT_PTR(support_buildplate_only);
@@ -1305,6 +1364,99 @@ private:
static PrintAndCLIConfigDef s_def;
};
+Points get_bed_shape(const DynamicPrintConfig &cfg);
+Points get_bed_shape(const PrintConfig &cfg);
+Points get_bed_shape(const SLAPrinterConfig &cfg);
+
+// ModelConfig is a wrapper around DynamicPrintConfig with an addition of a timestamp.
+// Each change of ModelConfig is tracked by assigning a new timestamp from a global counter.
+// The counter is used for faster synchronization of the background slicing thread
+// with the front end by skipping synchronization of equal config dictionaries.
+// The global counter is also used for avoiding unnecessary serialization of config
+// dictionaries when taking an Undo snapshot.
+//
+// The global counter is NOT thread safe, therefore it is recommended to use ModelConfig from
+// the main thread only.
+//
+// As there is a global counter and it is being increased with each change to any ModelConfig,
+// if two ModelConfig dictionaries differ, they should differ with their timestamp as well.
+// Therefore copying the ModelConfig including its timestamp is safe as there is no harm
+// in having multiple ModelConfig with equal timestamps as long as their dictionaries are equal.
+//
+// The timestamp is used by the Undo/Redo stack. As zero timestamp means invalid timestamp
+// to the Undo/Redo stack (zero timestamp means the Undo/Redo stack needs to serialize and
+// compare serialized data for differences), zero timestamp shall never be used.
+// Timestamp==1 shall only be used for empty dictionaries.
+class ModelConfig
+{
+public:
+ void clear() { m_data.clear(); m_timestamp = 1; }
+
+ void assign_config(const ModelConfig &rhs) {
+ if (m_timestamp != rhs.m_timestamp) {
+ m_data = rhs.m_data;
+ m_timestamp = rhs.m_timestamp;
+ }
+ }
+ void assign_config(ModelConfig &&rhs) {
+ if (m_timestamp != rhs.m_timestamp) {
+ m_data = std::move(rhs.m_data);
+ m_timestamp = rhs.m_timestamp;
+ rhs.clear();
+ }
+ }
+
+ // Modification of the ModelConfig is not thread safe due to the global timestamp counter!
+ // Don't call modification methods from the back-end!
+ // Assign methods don't assign if src==dst to not having to bump the timestamp in case they are equal.
+ void assign_config(const DynamicPrintConfig &rhs) { if (m_data != rhs) { m_data = rhs; this->touch(); } }
+ void assign_config(DynamicPrintConfig &&rhs) { if (m_data != rhs) { m_data = std::move(rhs); this->touch(); } }
+ void apply(const ModelConfig &other, bool ignore_nonexistent = false) { this->apply(other.get(), ignore_nonexistent); }
+ void apply(const ConfigBase &other, bool ignore_nonexistent = false) { m_data.apply_only(other, other.keys(), ignore_nonexistent); this->touch(); }
+ void apply_only(const ModelConfig &other, const t_config_option_keys &keys, bool ignore_nonexistent = false) { this->apply_only(other.get(), keys, ignore_nonexistent); }
+ void apply_only(const ConfigBase &other, const t_config_option_keys &keys, bool ignore_nonexistent = false) { m_data.apply_only(other, keys, ignore_nonexistent); this->touch(); }
+ bool set_key_value(const std::string &opt_key, ConfigOption *opt) { bool out = m_data.set_key_value(opt_key, opt); this->touch(); return out; }
+ template<typename T>
+ void set(const std::string &opt_key, T value) { m_data.set(opt_key, value, true); this->touch(); }
+ void set_deserialize(const t_config_option_key &opt_key, const std::string &str, bool append = false)
+ { m_data.set_deserialize(opt_key, str, append); this->touch(); }
+ bool erase(const t_config_option_key &opt_key) { bool out = m_data.erase(opt_key); if (out) this->touch(); return out; }
+
+ // Getters are thread safe.
+ // The following implicit conversion breaks the Cereal serialization.
+// operator const DynamicPrintConfig&() const throw() { return this->get(); }
+ const DynamicPrintConfig& get() const throw() { return m_data; }
+ bool empty() const throw() { return m_data.empty(); }
+ size_t size() const throw() { return m_data.size(); }
+ auto cbegin() const { return m_data.cbegin(); }
+ auto cend() const { return m_data.cend(); }
+ t_config_option_keys keys() const { return m_data.keys(); }
+ bool has(const t_config_option_key &opt_key) const { return m_data.has(opt_key); }
+ const ConfigOption* option(const t_config_option_key &opt_key) const { return m_data.option(opt_key); }
+ int opt_int(const t_config_option_key &opt_key) const { return m_data.opt_int(opt_key); }
+ int extruder() const { return opt_int("extruder"); }
+ double opt_float(const t_config_option_key &opt_key) const { return m_data.opt_float(opt_key); }
+ std::string opt_serialize(const t_config_option_key &opt_key) const { return m_data.opt_serialize(opt_key); }
+
+ // Return an optional timestamp of this object.
+ // If the timestamp returned is non-zero, then the serialization framework will
+ // only save this object on the Undo/Redo stack if the timestamp is different
+ // from the timestmap of the object at the top of the Undo / Redo stack.
+ virtual uint64_t timestamp() const throw() { return m_timestamp; }
+ bool timestamp_matches(const ModelConfig &rhs) const throw() { return m_timestamp == rhs.m_timestamp; }
+ // Not thread safe! Should not be called from other than the main thread!
+ void touch() { m_timestamp = ++ s_last_timestamp; }
+
+private:
+ friend class cereal::access;
+ template<class Archive> void serialize(Archive& ar) { ar(m_timestamp); ar(m_data); }
+
+ uint64_t m_timestamp { 1 };
+ DynamicPrintConfig m_data;
+
+ static uint64_t s_last_timestamp;
+};
+
} // namespace Slic3r
// Serialization through the Cereal library
diff --git a/src/libslic3r/PrintObject.cpp b/src/libslic3r/PrintObject.cpp
index 5573f4ac3..99b4130f4 100644
--- a/src/libslic3r/PrintObject.cpp
+++ b/src/libslic3r/PrintObject.cpp
@@ -1,13 +1,18 @@
+#include "Exception.hpp"
#include "Print.hpp"
#include "BoundingBox.hpp"
#include "ClipperUtils.hpp"
#include "ElephantFootCompensation.hpp"
#include "Geometry.hpp"
#include "I18N.hpp"
+#include "Layer.hpp"
#include "SupportMaterial.hpp"
#include "Surface.hpp"
#include "Slicing.hpp"
+#include "Tesselate.hpp"
#include "Utils.hpp"
+#include "Fill/FillAdaptive.hpp"
+#include "Format/STL.hpp"
#include <utility>
#include <boost/log/trivial.hpp>
@@ -92,6 +97,7 @@ PrintBase::ApplyStatus PrintObject::set_instances(PrintInstances &&instances)
return status;
}
+// Called by make_perimeters()
// 1) Decides Z positions of the layers,
// 2) Initializes layers and their regions
// 3) Slices the object meshes
@@ -99,8 +105,6 @@ PrintBase::ApplyStatus PrintObject::set_instances(PrintInstances &&instances)
// 5) Applies size compensation (offsets the slices in XY plane)
// 6) Replaces bad slices by the slices reconstructed from the upper/lower layer
// Resulting expolygons of layer regions are marked as Internal.
-//
-// this should be idempotent
void PrintObject::slice()
{
if (! this->set_started(posSlice))
@@ -120,7 +124,7 @@ void PrintObject::slice()
// Simplify slices if required.
if (m_print->config().resolution)
this->simplify_slices(scale_(this->print()->config().resolution));
- // Update bounding boxes
+ // Update bounding boxes, back up raw slices of complex models.
tbb::parallel_for(
tbb::blocked_range<size_t>(0, m_layers.size()),
[this](const tbb::blocked_range<size_t>& range) {
@@ -131,10 +135,11 @@ void PrintObject::slice()
layer.lslices_bboxes.reserve(layer.lslices.size());
for (const ExPolygon &expoly : layer.lslices)
layer.lslices_bboxes.emplace_back(get_extents(expoly));
+ layer.backup_untyped_slices();
}
});
if (m_layers.empty())
- throw std::runtime_error("No layers were detected. You might want to repair your STL file(s) or check their size or thickness and retry.\n");
+ throw Slic3r::SlicingError("No layers were detected. You might want to repair your STL file(s) or check their size or thickness and retry.\n");
this->set_done(posSlice);
}
@@ -152,10 +157,10 @@ void PrintObject::make_perimeters()
m_print->set_status(20, L("Generating perimeters"));
BOOST_LOG_TRIVIAL(info) << "Generating perimeters..." << log_memory_info();
- // merge slices if they were split into types
+ // Revert the typed slices into untyped slices.
if (m_typed_slices) {
for (Layer *layer : m_layers) {
- layer->merge_slices();
+ layer->restore_untyped_slices();
m_print->throw_if_canceled();
}
m_typed_slices = false;
@@ -368,13 +373,15 @@ void PrintObject::infill()
this->prepare_infill();
if (this->set_started(posInfill)) {
+ auto [adaptive_fill_octree, support_fill_octree] = this->prepare_adaptive_infill_data();
+
BOOST_LOG_TRIVIAL(debug) << "Filling layers in parallel - start";
tbb::parallel_for(
tbb::blocked_range<size_t>(0, m_layers.size()),
- [this](const tbb::blocked_range<size_t>& range) {
+ [this, &adaptive_fill_octree = adaptive_fill_octree, &support_fill_octree = support_fill_octree](const tbb::blocked_range<size_t>& range) {
for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) {
m_print->throw_if_canceled();
- m_layers[layer_idx]->make_fills();
+ m_layers[layer_idx]->make_fills(adaptive_fill_octree.get(), support_fill_octree.get());
}
}
);
@@ -387,6 +394,25 @@ void PrintObject::infill()
}
}
+void PrintObject::ironing()
+{
+ if (this->set_started(posIroning)) {
+ BOOST_LOG_TRIVIAL(debug) << "Ironing in parallel - start";
+ tbb::parallel_for(
+ tbb::blocked_range<size_t>(1, m_layers.size()),
+ [this](const tbb::blocked_range<size_t>& range) {
+ for (size_t layer_idx = range.begin(); layer_idx < range.end(); ++ layer_idx) {
+ m_print->throw_if_canceled();
+ m_layers[layer_idx]->make_ironing();
+ }
+ }
+ );
+ m_print->throw_if_canceled();
+ BOOST_LOG_TRIVIAL(debug) << "Ironing in parallel - end";
+ this->set_done(posIroning);
+ }
+}
+
void PrintObject::generate_support_material()
{
if (this->set_started(posSupportMaterial)) {
@@ -401,13 +427,54 @@ void PrintObject::generate_support_material()
// therefore they cannot be printed without supports.
for (const Layer *layer : m_layers)
if (layer->empty())
- throw std::runtime_error("Levitating objects cannot be printed without supports.");
+ throw Slic3r::SlicingError("Levitating objects cannot be printed without supports.");
#endif
}
this->set_done(posSupportMaterial);
}
}
+std::pair<FillAdaptive::OctreePtr, FillAdaptive::OctreePtr> PrintObject::prepare_adaptive_infill_data()
+{
+ using namespace FillAdaptive;
+
+ auto [adaptive_line_spacing, support_line_spacing] = adaptive_fill_line_spacing(*this);
+ if ((adaptive_line_spacing == 0. && support_line_spacing == 0.) || this->layers().empty())
+ return std::make_pair(OctreePtr(), OctreePtr());
+
+ indexed_triangle_set mesh = this->model_object()->raw_indexed_triangle_set();
+ // Rotate mesh and build octree on it with axis-aligned (standart base) cubes.
+ Transform3d m = m_trafo;
+ m.pretranslate(Vec3d(- unscale<float>(m_center_offset.x()), - unscale<float>(m_center_offset.y()), 0));
+ auto to_octree = transform_to_octree().toRotationMatrix();
+ its_transform(mesh, to_octree * m, true);
+
+ // Triangulate internal bridging surfaces.
+ std::vector<std::vector<Vec3d>> overhangs(this->layers().size());
+ tbb::parallel_for(
+ tbb::blocked_range<int>(0, int(m_layers.size()) - 1),
+ [this, &to_octree, &overhangs](const tbb::blocked_range<int> &range) {
+ std::vector<Vec3d> &out = overhangs[range.begin()];
+ for (int idx_layer = range.begin(); idx_layer < range.end(); ++ idx_layer) {
+ m_print->throw_if_canceled();
+ const Layer *layer = this->layers()[idx_layer];
+ for (const LayerRegion *layerm : layer->regions())
+ for (const Surface &surface : layerm->fill_surfaces.surfaces)
+ if (surface.surface_type == stInternalBridge)
+ append(out, triangulate_expolygon_3d(surface.expolygon, layer->bottom_z()));
+ }
+ for (Vec3d &p : out)
+ p = (to_octree * p).eval();
+ });
+ // and gather them.
+ for (size_t i = 1; i < overhangs.size(); ++ i)
+ append(overhangs.front(), std::move(overhangs[i]));
+
+ return std::make_pair(
+ adaptive_line_spacing ? build_octree(mesh, overhangs.front(), adaptive_line_spacing, false) : OctreePtr(),
+ support_line_spacing ? build_octree(mesh, overhangs.front(), support_line_spacing, true) : OctreePtr());
+}
+
void PrintObject::clear_layers()
{
for (Layer *l : m_layers)
@@ -500,12 +567,18 @@ bool PrintObject::invalidate_state_by_config_options(const std::vector<t_config_
|| opt_key == "dont_support_bridges"
|| opt_key == "first_layer_extrusion_width") {
steps.emplace_back(posSupportMaterial);
+ } else if (opt_key == "bottom_solid_layers") {
+ steps.emplace_back(posPrepareInfill);
+ if(m_print->config().spiral_vase) {
+ // Changing the number of bottom layers when a spiral vase is enabled requires re-slicing the object again.
+ // Otherwise, holes in the bottom layers could be filled, as is reported in GH #5528.
+ steps.emplace_back(posSlice);
+ }
} else if (
opt_key == "interface_shells"
|| opt_key == "infill_only_where_needed"
|| opt_key == "infill_every_layers"
|| opt_key == "solid_infill_every_layers"
- || opt_key == "bottom_solid_layers"
|| opt_key == "bottom_solid_min_thickness"
|| opt_key == "top_solid_layers"
|| opt_key == "top_solid_min_thickness"
@@ -522,7 +595,8 @@ bool PrintObject::invalidate_state_by_config_options(const std::vector<t_config_
|| opt_key == "external_fill_link_max_length"
|| opt_key == "fill_angle"
|| opt_key == "fill_pattern"
- || opt_key == "fill_link_max_length"
+ || opt_key == "infill_anchor"
+ || opt_key == "infill_anchor_max"
|| opt_key == "top_infill_extrusion_width"
|| opt_key == "first_layer_extrusion_width") {
steps.emplace_back(posInfill);
@@ -582,14 +656,15 @@ bool PrintObject::invalidate_step(PrintObjectStep step)
// propagate to dependent steps
if (step == posPerimeters) {
- invalidated |= this->invalidate_steps({ posPrepareInfill, posInfill });
+ invalidated |= this->invalidate_steps({ posPrepareInfill, posInfill, posIroning });
invalidated |= m_print->invalidate_steps({ psSkirt, psBrim });
} else if (step == posPrepareInfill) {
- invalidated |= this->invalidate_step(posInfill);
+ invalidated |= this->invalidate_steps({ posInfill, posIroning });
} else if (step == posInfill) {
+ invalidated |= this->invalidate_steps({ posIroning });
invalidated |= m_print->invalidate_steps({ psSkirt, psBrim });
} else if (step == posSlice) {
- invalidated |= this->invalidate_steps({ posPerimeters, posPrepareInfill, posInfill, posSupportMaterial });
+ invalidated |= this->invalidate_steps({ posPerimeters, posPrepareInfill, posInfill, posIroning, posSupportMaterial });
invalidated |= m_print->invalidate_steps({ psSkirt, psBrim });
this->m_slicing_params.valid = false;
} else if (step == posSupportMaterial) {
@@ -651,7 +726,7 @@ void PrintObject::detect_surfaces_type()
// should be visible.
bool spiral_vase = this->print()->config().spiral_vase.value;
bool interface_shells = ! spiral_vase && m_config.interface_shells.value;
- size_t num_layers = spiral_vase ? first_printing_region(*this)->config().bottom_solid_layers : m_layers.size();
+ size_t num_layers = spiral_vase ? std::min(size_t(first_printing_region(*this)->config().bottom_solid_layers), m_layers.size()) : m_layers.size();
for (size_t idx_region = 0; idx_region < this->region_volumes.size(); ++ idx_region) {
BOOST_LOG_TRIVIAL(debug) << "Detecting solid surfaces for region " << idx_region << " in parallel - start";
@@ -939,7 +1014,7 @@ void PrintObject::discover_vertical_shells()
Polygons holes;
};
bool spiral_vase = this->print()->config().spiral_vase.value;
- size_t num_layers = spiral_vase ? first_printing_region(*this)->config().bottom_solid_layers : m_layers.size();
+ size_t num_layers = spiral_vase ? std::min(size_t(first_printing_region(*this)->config().bottom_solid_layers), m_layers.size()) : m_layers.size();
coordf_t min_layer_height = this->slicing_parameters().min_layer_height;
// Does this region possibly produce more than 1 top or bottom layer?
auto has_extra_layers_fn = [min_layer_height](const PrintRegionConfig &config) {
@@ -1411,7 +1486,7 @@ void PrintObject::bridge_over_infill()
}
#ifdef SLIC3R_DEBUG
- printf("Bridging " PRINTF_ZU " internal areas at layer " PRINTF_ZU "\n", to_bridge.size(), layer->id());
+ printf("Bridging %zu internal areas at layer %zu\n", to_bridge.size(), layer->id());
#endif
// compute the remaning internal solid surfaces as difference
@@ -1476,22 +1551,48 @@ static void clamp_exturder_to_default(ConfigOptionInt &opt, size_t num_extruders
PrintObjectConfig PrintObject::object_config_from_model_object(const PrintObjectConfig &default_object_config, const ModelObject &object, size_t num_extruders)
{
PrintObjectConfig config = default_object_config;
- normalize_and_apply_config(config, object.config);
+ {
+ DynamicPrintConfig src_normalized(object.config.get());
+ src_normalized.normalize_fdm();
+ config.apply(src_normalized, true);
+ }
// Clamp invalid extruders to the default extruder (with index 1).
clamp_exturder_to_default(config.support_material_extruder, num_extruders);
clamp_exturder_to_default(config.support_material_interface_extruder, num_extruders);
return config;
}
+static void apply_to_print_region_config(PrintRegionConfig &out, const DynamicPrintConfig &in)
+{
+ // 1) Copy the "extruder key to infill_extruder and perimeter_extruder.
+ std::string sextruder = "extruder";
+ auto *opt_extruder = in.opt<ConfigOptionInt>(sextruder);
+ if (opt_extruder) {
+ int extruder = opt_extruder->value;
+ if (extruder != 0) {
+ out.infill_extruder .value = extruder;
+ out.solid_infill_extruder.value = extruder;
+ out.perimeter_extruder .value = extruder;
+ }
+ }
+ // 2) Copy the rest of the values.
+ for (auto it = in.cbegin(); it != in.cend(); ++ it)
+ if (it->first != sextruder) {
+ ConfigOption *my_opt = out.option(it->first, false);
+ if (my_opt)
+ my_opt->set(it->second.get());
+ }
+}
+
PrintRegionConfig PrintObject::region_config_from_model_volume(const PrintRegionConfig &default_region_config, const DynamicPrintConfig *layer_range_config, const ModelVolume &volume, size_t num_extruders)
{
PrintRegionConfig config = default_region_config;
- normalize_and_apply_config(config, volume.get_object()->config);
+ apply_to_print_region_config(config, volume.get_object()->config.get());
if (layer_range_config != nullptr)
- normalize_and_apply_config(config, *layer_range_config);
- normalize_and_apply_config(config, volume.config);
+ apply_to_print_region_config(config, *layer_range_config);
+ apply_to_print_region_config(config, volume.config.get());
if (! volume.material_id().empty())
- normalize_and_apply_config(config, volume.material()->config);
+ apply_to_print_region_config(config, volume.material()->config.get());
// Clamp invalid extruders to the default extruder (with index 1).
clamp_exturder_to_default(config.infill_extruder, num_extruders);
clamp_exturder_to_default(config.perimeter_extruder, num_extruders);
@@ -1524,13 +1625,13 @@ SlicingParameters PrintObject::slicing_parameters(const DynamicPrintConfig& full
print_config,
region_config_from_model_volume(default_region_config, nullptr, *model_volume, num_extruders),
object_extruders);
- for (const std::pair<const t_layer_height_range, DynamicPrintConfig> &range_and_config : model_object.layer_config_ranges)
+ for (const std::pair<const t_layer_height_range, ModelConfig> &range_and_config : model_object.layer_config_ranges)
if (range_and_config.second.has("perimeter_extruder") ||
range_and_config.second.has("infill_extruder") ||
range_and_config.second.has("solid_infill_extruder"))
PrintRegion::collect_object_printing_extruders(
print_config,
- region_config_from_model_volume(default_region_config, &range_and_config.second, *model_volume, num_extruders),
+ region_config_from_model_volume(default_region_config, &range_and_config.second.get(), *model_volume, num_extruders),
object_extruders);
}
sort_remove_duplicates(object_extruders);
@@ -1557,7 +1658,9 @@ bool PrintObject::update_layer_height_profile(const ModelObject &model_object, c
bool updated = false;
if (layer_height_profile.empty()) {
- layer_height_profile = model_object.layer_height_profile;
+ // use the constructor because the assignement is crashing on ASAN OsX
+ layer_height_profile = std::vector<coordf_t>(model_object.layer_height_profile.get());
+// layer_height_profile = model_object.layer_height_profile;
updated = true;
}
@@ -1592,12 +1695,6 @@ void PrintObject::_slice(const std::vector<coordf_t> &layer_height_profile)
m_typed_slices = false;
-#ifdef SLIC3R_PROFILE
- // Disable parallelization so the Shiny profiler works
- static tbb::task_scheduler_init *tbb_init = nullptr;
- tbb_init = new tbb::task_scheduler_init(1);
-#endif
-
// 1) Initialize layers and their slice heights.
std::vector<float> slice_zs;
{
@@ -1657,14 +1754,24 @@ void PrintObject::_slice(const std::vector<coordf_t> &layer_height_profile)
// Slice all non-modifier volumes.
bool clipped = false;
bool upscaled = false;
- auto slicing_mode = this->print()->config().spiral_vase ? SlicingMode::PositiveLargestContour : SlicingMode::Regular;
+ bool spiral_vase = this->print()->config().spiral_vase;
+ auto slicing_mode = spiral_vase ? SlicingMode::PositiveLargestContour : SlicingMode::Regular;
if (! has_z_ranges && (! m_config.clip_multipart_objects.value || all_volumes_single_region >= 0)) {
// Cheap path: Slice regions without mutual clipping.
// The cheap path is possible if no clipping is allowed or if slicing volumes of just a single region.
for (size_t region_id = 0; region_id < this->region_volumes.size(); ++ region_id) {
BOOST_LOG_TRIVIAL(debug) << "Slicing objects - region " << region_id;
// slicing in parallel
- std::vector<ExPolygons> expolygons_by_layer = this->slice_region(region_id, slice_zs, slicing_mode);
+ size_t slicing_mode_normal_below_layer = 0;
+ if (spiral_vase) {
+ // Slice the bottom layers with SlicingMode::Regular.
+ // This needs to be in sync with LayerRegion::make_perimeters() spiral_vase!
+ const PrintRegionConfig &config = this->print()->regions()[region_id]->config();
+ slicing_mode_normal_below_layer = size_t(config.bottom_solid_layers.value);
+ for (; slicing_mode_normal_below_layer < slice_zs.size() && slice_zs[slicing_mode_normal_below_layer] < config.bottom_solid_min_thickness - EPSILON;
+ ++ slicing_mode_normal_below_layer);
+ }
+ std::vector<ExPolygons> expolygons_by_layer = this->slice_region(region_id, slice_zs, slicing_mode, slicing_mode_normal_below_layer, SlicingMode::Regular);
m_print->throw_if_canceled();
BOOST_LOG_TRIVIAL(debug) << "Slicing objects - append slices " << region_id << " start";
for (size_t layer_id = 0; layer_id < expolygons_by_layer.size(); ++ layer_id)
@@ -1897,10 +2004,9 @@ end:
layer->make_slices();
}
});
- if (elephant_foot_compensation_scaled > 0.f) {
+ if (elephant_foot_compensation_scaled > 0.f && ! m_layers.empty()) {
// The Elephant foot has been compensated, therefore the 1st layer's lslices are shrank with the Elephant foot compensation value.
// Store the uncompensated value there.
- assert(! m_layers.empty());
assert(m_layers.front()->id() == 0);
m_layers.front()->lslices = std::move(lslices_1st_layer);
}
@@ -1911,7 +2017,7 @@ end:
}
// To be used only if there are no layer span specific configurations applied, which would lead to z ranges being generated for this region.
-std::vector<ExPolygons> PrintObject::slice_region(size_t region_id, const std::vector<float> &z, SlicingMode mode) const
+std::vector<ExPolygons> PrintObject::slice_region(size_t region_id, const std::vector<float> &z, SlicingMode mode, size_t slicing_mode_normal_below_layer, SlicingMode mode_below) const
{
std::vector<const ModelVolume*> volumes;
if (region_id < this->region_volumes.size()) {
@@ -1921,10 +2027,10 @@ std::vector<ExPolygons> PrintObject::slice_region(size_t region_id, const std::v
volumes.emplace_back(volume);
}
}
- return this->slice_volumes(z, mode, volumes);
+ return this->slice_volumes(z, mode, slicing_mode_normal_below_layer, mode_below, volumes);
}
-// Z ranges are not applicable to modifier meshes, therefore a sinle volume will be found in volume_and_range at most once.
+// Z ranges are not applicable to modifier meshes, therefore a single volume will be found in volume_and_range at most once.
std::vector<ExPolygons> PrintObject::slice_modifiers(size_t region_id, const std::vector<float> &slice_zs) const
{
std::vector<ExPolygons> out;
@@ -1990,10 +2096,12 @@ std::vector<ExPolygons> PrintObject::slice_modifiers(size_t region_id, const std
ranges.emplace_back(volumes_and_ranges[j].first);
// slicing in parallel
std::vector<ExPolygons> this_slices = this->slice_volume(slice_zs, ranges, SlicingMode::Regular, *model_volume);
+ // Variable this_slices could be empty if no value of slice_zs is within any of the ranges of this volume.
if (out.empty()) {
out = std::move(this_slices);
merge.assign(out.size(), false);
- } else {
+ } else if (!this_slices.empty()) {
+ assert(out.size() == this_slices.size());
for (size_t i = 0; i < out.size(); ++ i)
if (! this_slices[i].empty()) {
if (! out[i].empty()) {
@@ -2031,7 +2139,10 @@ std::vector<ExPolygons> PrintObject::slice_support_volumes(const ModelVolumeType
return this->slice_volumes(zs, SlicingMode::Regular, volumes);
}
-std::vector<ExPolygons> PrintObject::slice_volumes(const std::vector<float> &z, SlicingMode mode, const std::vector<const ModelVolume*> &volumes) const
+std::vector<ExPolygons> PrintObject::slice_volumes(
+ const std::vector<float> &z,
+ SlicingMode mode, size_t slicing_mode_normal_below_layer, SlicingMode mode_below,
+ const std::vector<const ModelVolume*> &volumes) const
{
std::vector<ExPolygons> layers;
if (! volumes.empty()) {
@@ -2061,7 +2172,7 @@ std::vector<ExPolygons> PrintObject::slice_volumes(const std::vector<float> &z,
mesh.require_shared_vertices();
TriangleMeshSlicer mslicer;
mslicer.init(&mesh, callback);
- mslicer.slice(z, mode, float(m_config.slice_closing_radius.value), &layers, callback);
+ mslicer.slice(z, mode, slicing_mode_normal_below_layer, mode_below, float(m_config.slice_closing_radius.value), &layers, callback);
m_print->throw_if_canceled();
}
}
@@ -2098,7 +2209,7 @@ std::vector<ExPolygons> PrintObject::slice_volume(const std::vector<float> &z, S
return layers;
}
-// Filter the zs not inside the ranges. The ranges are closed at the botton and open at the top, they are sorted lexicographically and non overlapping.
+// Filter the zs not inside the ranges. The ranges are closed at the bottom and open at the top, they are sorted lexicographically and non overlapping.
std::vector<ExPolygons> PrintObject::slice_volume(const std::vector<float> &z, const std::vector<t_layer_height_range> &ranges, SlicingMode mode, const ModelVolume &volume) const
{
std::vector<ExPolygons> out;
@@ -2610,6 +2721,7 @@ void PrintObject::combine_infill()
// Because fill areas for rectilinear and honeycomb are grown
// later to overlap perimeters, we need to counteract that too.
((region->config().fill_pattern == ipRectilinear ||
+ region->config().fill_pattern == ipMonotonic ||
region->config().fill_pattern == ipGrid ||
region->config().fill_pattern == ipLine ||
region->config().fill_pattern == ipHoneycomb) ? 1.5f : 0.5f) *
@@ -2645,4 +2757,203 @@ void PrintObject::_generate_support_material()
support_material.generate(*this);
}
+
+void PrintObject::project_and_append_custom_facets(
+ bool seam, EnforcerBlockerType type, std::vector<ExPolygons>& expolys) const
+{
+ for (const ModelVolume* mv : this->model_object()->volumes) {
+ const indexed_triangle_set custom_facets = seam
+ ? mv->seam_facets.get_facets(*mv, type)
+ : mv->supported_facets.get_facets(*mv, type);
+ if (! mv->is_model_part() || custom_facets.indices.empty())
+ continue;
+
+ const Transform3f& tr1 = mv->get_matrix().cast<float>();
+ const Transform3f& tr2 = this->trafo().cast<float>();
+ const Transform3f tr = tr2 * tr1;
+ const float tr_det_sign = (tr.matrix().determinant() > 0. ? 1.f : -1.f);
+
+
+ // The projection will be at most a pentagon. Let's minimize heap
+ // reallocations by saving in in the following struct.
+ // Points are used so that scaling can be done in parallel
+ // and they can be moved from to create an ExPolygon later.
+ struct LightPolygon {
+ LightPolygon() { pts.reserve(5); }
+ Points pts;
+
+ void add(const Vec2f& pt) {
+ pts.emplace_back(scale_(pt.x()), scale_(pt.y()));
+ assert(pts.size() <= 5);
+ }
+ };
+
+ // Structure to collect projected polygons. One element for each triangle.
+ // Saves vector of polygons and layer_id of the first one.
+ struct TriangleProjections {
+ size_t first_layer_id;
+ std::vector<LightPolygon> polygons;
+ };
+
+ // Vector to collect resulting projections from each triangle.
+ std::vector<TriangleProjections> projections_of_triangles(custom_facets.indices.size());
+
+ // Iterate over all triangles.
+ tbb::parallel_for(
+ tbb::blocked_range<size_t>(0, custom_facets.indices.size()),
+ [&](const tbb::blocked_range<size_t>& range) {
+ for (size_t idx = range.begin(); idx < range.end(); ++ idx) {
+
+ std::array<Vec3f, 3> facet;
+
+ // Transform the triangle into worlds coords.
+ for (int i=0; i<3; ++i)
+ facet[i] = tr * custom_facets.vertices[custom_facets.indices[idx](i)];
+
+ // Ignore triangles with upward-pointing normal. Don't forget about mirroring.
+ float z_comp = (facet[1]-facet[0]).cross(facet[2]-facet[0]).z();
+ if (! seam && tr_det_sign * z_comp > 0.)
+ continue;
+
+ // Sort the three vertices according to z-coordinate.
+ std::sort(facet.begin(), facet.end(),
+ [](const Vec3f& pt1, const Vec3f&pt2) {
+ return pt1.z() < pt2.z();
+ });
+
+ std::array<Vec2f, 3> trianglef;
+ for (int i=0; i<3; ++i) {
+ trianglef[i] = Vec2f(facet[i].x(), facet[i].y());
+ trianglef[i] -= Vec2f(unscale<float>(this->center_offset().x()),
+ unscale<float>(this->center_offset().y()));
+ }
+
+ // Find lowest slice not below the triangle.
+ auto it = std::lower_bound(layers().begin(), layers().end(), facet[0].z()+EPSILON,
+ [](const Layer* l1, float z) {
+ return l1->slice_z < z;
+ });
+
+ // Count how many projections will be generated for this triangle
+ // and allocate respective amount in projections_of_triangles.
+ projections_of_triangles[idx].first_layer_id = it-layers().begin();
+ size_t last_layer_id = projections_of_triangles[idx].first_layer_id;
+ // The cast in the condition below is important. The comparison must
+ // be an exact opposite of the one lower in the code where
+ // the polygons are appended. And that one is on floats.
+ while (last_layer_id + 1 < layers().size()
+ && float(layers()[last_layer_id]->slice_z) <= facet[2].z())
+ ++last_layer_id;
+ projections_of_triangles[idx].polygons.resize(
+ last_layer_id - projections_of_triangles[idx].first_layer_id + 1);
+
+ // Calculate how to move points on triangle sides per unit z increment.
+ Vec2f ta(trianglef[1] - trianglef[0]);
+ Vec2f tb(trianglef[2] - trianglef[0]);
+ ta *= 1.f/(facet[1].z() - facet[0].z());
+ tb *= 1.f/(facet[2].z() - facet[0].z());
+
+ // Projection on current slice will be build directly in place.
+ LightPolygon* proj = &projections_of_triangles[idx].polygons[0];
+ proj->add(trianglef[0]);
+
+ bool passed_first = false;
+ bool stop = false;
+
+ // Project a sub-polygon on all slices intersecting the triangle.
+ while (it != layers().end()) {
+ const float z = float((*it)->slice_z);
+
+ // Projections of triangle sides intersections with slices.
+ // a moves along one side, b tracks the other.
+ Vec2f a;
+ Vec2f b;
+
+ // If the middle vertex was already passed, append the vertex
+ // and use ta for tracking the remaining side.
+ if (z > facet[1].z() && ! passed_first) {
+ proj->add(trianglef[1]);
+ ta = trianglef[2]-trianglef[1];
+ ta *= 1.f/(facet[2].z() - facet[1].z());
+ passed_first = true;
+ }
+
+ // This slice is above the triangle already.
+ if (z > facet[2].z() || it+1 == layers().end()) {
+ proj->add(trianglef[2]);
+ stop = true;
+ }
+ else {
+ // Move a, b along the side it currently tracks to get
+ // projected intersection with current slice.
+ a = passed_first ? (trianglef[1]+ta*(z-facet[1].z()))
+ : (trianglef[0]+ta*(z-facet[0].z()));
+ b = trianglef[0]+tb*(z-facet[0].z());
+ proj->add(a);
+ proj->add(b);
+ }
+
+ if (stop)
+ break;
+
+ // Advance to the next layer.
+ ++it;
+ ++proj;
+ assert(proj <= &projections_of_triangles[idx].polygons.back() );
+
+ // a, b are first two points of the polygon for the next layer.
+ proj->add(b);
+ proj->add(a);
+ }
+ }
+ }); // end of parallel_for
+
+ // Make sure that the output vector can be used.
+ expolys.resize(layers().size());
+
+ // Now append the collected polygons to respective layers.
+ for (auto& trg : projections_of_triangles) {
+ int layer_id = int(trg.first_layer_id);
+ for (const LightPolygon& poly : trg.polygons) {
+ if (layer_id >= int(expolys.size()))
+ break; // part of triangle could be projected above top layer
+ expolys[layer_id].emplace_back(std::move(poly.pts));
+ ++layer_id;
+ }
+ }
+
+ } // loop over ModelVolumes
+}
+
+
+
+const Layer* PrintObject::get_layer_at_printz(coordf_t print_z) const {
+ auto it = Slic3r::lower_bound_by_predicate(m_layers.begin(), m_layers.end(), [print_z](const Layer *layer) { return layer->print_z < print_z; });
+ return (it == m_layers.end() || (*it)->print_z != print_z) ? nullptr : *it;
+}
+
+
+
+Layer* PrintObject::get_layer_at_printz(coordf_t print_z) { return const_cast<Layer*>(std::as_const(*this).get_layer_at_printz(print_z)); }
+
+
+
+// Get a layer approximately at print_z.
+const Layer* PrintObject::get_layer_at_printz(coordf_t print_z, coordf_t epsilon) const {
+ coordf_t limit = print_z - epsilon;
+ auto it = Slic3r::lower_bound_by_predicate(m_layers.begin(), m_layers.end(), [limit](const Layer *layer) { return layer->print_z < limit; });
+ return (it == m_layers.end() || (*it)->print_z > print_z + epsilon) ? nullptr : *it;
+}
+
+
+
+Layer* PrintObject::get_layer_at_printz(coordf_t print_z, coordf_t epsilon) { return const_cast<Layer*>(std::as_const(*this).get_layer_at_printz(print_z, epsilon)); }
+
+const Layer *PrintObject::get_first_layer_bellow_printz(coordf_t print_z, coordf_t epsilon) const
+{
+ coordf_t limit = print_z + epsilon;
+ auto it = Slic3r::lower_bound_by_predicate(m_layers.begin(), m_layers.end(), [limit](const Layer *layer) { return layer->print_z < limit; });
+ return (it == m_layers.begin()) ? nullptr : *(--it);
+}
+
} // namespace Slic3r
diff --git a/src/libslic3r/PrintRegion.cpp b/src/libslic3r/PrintRegion.cpp
index b3ac6a4a5..2a75cd621 100644
--- a/src/libslic3r/PrintRegion.cpp
+++ b/src/libslic3r/PrintRegion.cpp
@@ -1,3 +1,4 @@
+#include "Exception.hpp"
#include "Print.hpp"
namespace Slic3r {
@@ -13,7 +14,7 @@ unsigned int PrintRegion::extruder(FlowRole role) const
else if (role == frSolidInfill || role == frTopSolidInfill)
extruder = m_config.solid_infill_extruder;
else
- throw std::invalid_argument("Unknown role");
+ throw Slic3r::InvalidArgument("Unknown role");
return extruder;
}
@@ -40,7 +41,7 @@ Flow PrintRegion::flow(FlowRole role, double layer_height, bool bridge, bool fir
} else if (role == frTopSolidInfill) {
config_width = m_config.top_infill_extrusion_width;
} else {
- throw std::invalid_argument("Unknown role");
+ throw Slic3r::InvalidArgument("Unknown role");
}
}
diff --git a/src/libslic3r/SLA/AGGRaster.hpp b/src/libslic3r/SLA/AGGRaster.hpp
new file mode 100644
index 000000000..917f718e9
--- /dev/null
+++ b/src/libslic3r/SLA/AGGRaster.hpp
@@ -0,0 +1,223 @@
+#ifndef AGGRASTER_HPP
+#define AGGRASTER_HPP
+
+#include <libslic3r/SLA/RasterBase.hpp>
+#include "libslic3r/ExPolygon.hpp"
+#include "libslic3r/MTUtils.hpp"
+#include <libnest2d/backends/clipper/clipper_polygon.hpp>
+
+// For rasterizing
+#include <agg/agg_basics.h>
+#include <agg/agg_rendering_buffer.h>
+#include <agg/agg_pixfmt_gray.h>
+#include <agg/agg_pixfmt_rgb.h>
+#include <agg/agg_renderer_base.h>
+#include <agg/agg_renderer_scanline.h>
+
+#include <agg/agg_scanline_p.h>
+#include <agg/agg_rasterizer_scanline_aa.h>
+#include <agg/agg_path_storage.h>
+
+namespace Slic3r {
+
+inline const Polygon& contour(const ExPolygon& p) { return p.contour; }
+inline const ClipperLib::Path& contour(const ClipperLib::Polygon& p) { return p.Contour; }
+
+inline const Polygons& holes(const ExPolygon& p) { return p.holes; }
+inline const ClipperLib::Paths& holes(const ClipperLib::Polygon& p) { return p.Holes; }
+
+namespace sla {
+
+template<class Color> struct Colors {
+ static const Color White;
+ static const Color Black;
+};
+
+template<class Color> const Color Colors<Color>::White = Color{255};
+template<class Color> const Color Colors<Color>::Black = Color{0};
+
+template<class PixelRenderer,
+ template<class /*agg::renderer_base<PixelRenderer>*/> class Renderer,
+ class Rasterizer = agg::rasterizer_scanline_aa<>,
+ class Scanline = agg::scanline_p8>
+class AGGRaster: public RasterBase {
+public:
+ using TColor = typename PixelRenderer::color_type;
+ using TValue = typename TColor::value_type;
+ using TPixel = typename PixelRenderer::pixel_type;
+ using TRawBuffer = agg::rendering_buffer;
+
+protected:
+
+ Resolution m_resolution;
+ PixelDim m_pxdim_scaled; // used for scaled coordinate polygons
+
+ std::vector<TPixel> m_buf;
+ agg::rendering_buffer m_rbuf;
+
+ PixelRenderer m_pixrenderer;
+
+ agg::renderer_base<PixelRenderer> m_raw_renderer;
+ Renderer<agg::renderer_base<PixelRenderer>> m_renderer;
+
+ Trafo m_trafo;
+ Scanline m_scanlines;
+ Rasterizer m_rasterizer;
+
+ void flipy(agg::path_storage &path) const
+ {
+ path.flip_y(0, double(m_resolution.height_px));
+ }
+
+ void flipx(agg::path_storage &path) const
+ {
+ path.flip_x(0, double(m_resolution.width_px));
+ }
+
+ double getPx(const Point &p) { return p(0) * m_pxdim_scaled.w_mm; }
+ double getPy(const Point &p) { return p(1) * m_pxdim_scaled.h_mm; }
+ agg::path_storage to_path(const Polygon &poly) { return to_path(poly.points); }
+ double getPx(const ClipperLib::IntPoint &p) { return p.X * m_pxdim_scaled.w_mm; }
+ double getPy(const ClipperLib::IntPoint& p) { return p.Y * m_pxdim_scaled.h_mm; }
+
+ template<class PointVec> agg::path_storage _to_path(const PointVec& v)
+ {
+ agg::path_storage path;
+
+ auto it = v.begin();
+ path.move_to(getPx(*it), getPy(*it));
+ while(++it != v.end()) path.line_to(getPx(*it), getPy(*it));
+ path.line_to(getPx(v.front()), getPy(v.front()));
+
+ return path;
+ }
+
+ template<class PointVec> agg::path_storage _to_path_flpxy(const PointVec& v)
+ {
+ agg::path_storage path;
+
+ auto it = v.begin();
+ path.move_to(getPy(*it), getPx(*it));
+ while(++it != v.end()) path.line_to(getPy(*it), getPx(*it));
+ path.line_to(getPy(v.front()), getPx(v.front()));
+
+ return path;
+ }
+
+ template<class PointVec> agg::path_storage to_path(const PointVec &v)
+ {
+ auto path = m_trafo.flipXY ? _to_path_flpxy(v) : _to_path(v);
+
+ path.translate_all_paths(m_trafo.center_x * m_pxdim_scaled.w_mm,
+ m_trafo.center_y * m_pxdim_scaled.h_mm);
+
+ if(m_trafo.mirror_x) flipx(path);
+ if(m_trafo.mirror_y) flipy(path);
+
+ return path;
+ }
+
+ template<class P> void _draw(const P &poly)
+ {
+ m_rasterizer.reset();
+
+ m_rasterizer.add_path(to_path(contour(poly)));
+ for(auto& h : holes(poly)) m_rasterizer.add_path(to_path(h));
+
+ agg::render_scanlines(m_rasterizer, m_scanlines, m_renderer);
+ }
+
+public:
+ template<class GammaFn>
+ AGGRaster(const Resolution &res,
+ const PixelDim & pd,
+ const Trafo & trafo,
+ const TColor & foreground,
+ const TColor & background,
+ GammaFn && gammafn)
+ : m_resolution(res)
+ , m_pxdim_scaled(SCALING_FACTOR / pd.w_mm, SCALING_FACTOR / pd.h_mm)
+ , m_buf(res.pixels())
+ , m_rbuf(reinterpret_cast<TValue *>(m_buf.data()),
+ unsigned(res.width_px),
+ unsigned(res.height_px),
+ int(res.width_px *PixelRenderer::num_components))
+ , m_pixrenderer(m_rbuf)
+ , m_raw_renderer(m_pixrenderer)
+ , m_renderer(m_raw_renderer)
+ , m_trafo(trafo)
+ {
+ m_renderer.color(foreground);
+ clear(background);
+
+ m_rasterizer.gamma(gammafn);
+ }
+
+ Trafo trafo() const override { return m_trafo; }
+ Resolution resolution() const override { return m_resolution; }
+ PixelDim pixel_dimensions() const override
+ {
+ return {SCALING_FACTOR / m_pxdim_scaled.w_mm,
+ SCALING_FACTOR / m_pxdim_scaled.h_mm};
+ }
+
+ void draw(const ExPolygon &poly) override { _draw(poly); }
+ void draw(const ClipperLib::Polygon &poly) override { _draw(poly); }
+
+ EncodedRaster encode(RasterEncoder encoder) const override
+ {
+ return encoder(m_buf.data(), m_resolution.width_px, m_resolution.height_px, 1);
+ }
+
+ void clear(const TColor color) { m_raw_renderer.clear(color); }
+};
+
+/*
+ * Captures an anti-aliased monochrome canvas where vectorial
+ * polygons can be rasterized. Fill color is always white and the background is
+ * black. Contours are anti-aliased.
+ *
+ * A gamma function can be specified at compile time to make it more flexible.
+ */
+using _RasterGrayscaleAA =
+ AGGRaster<agg::pixfmt_gray8, agg::renderer_scanline_aa_solid>;
+
+class RasterGrayscaleAA : public _RasterGrayscaleAA {
+ using Base = _RasterGrayscaleAA;
+ using typename Base::TColor;
+ using typename Base::TValue;
+public:
+ template<class GammaFn>
+ RasterGrayscaleAA(const RasterBase::Resolution &res,
+ const RasterBase::PixelDim & pd,
+ const RasterBase::Trafo & trafo,
+ GammaFn && fn)
+ : Base(res, pd, trafo, Colors<TColor>::White, Colors<TColor>::Black,
+ std::forward<GammaFn>(fn))
+ {}
+
+ uint8_t read_pixel(size_t col, size_t row) const
+ {
+ static_assert(std::is_same<TValue, uint8_t>::value, "Not grayscale pix");
+
+ uint8_t px;
+ Base::m_buf[row * Base::resolution().width_px + col].get(px);
+ return px;
+ }
+
+ void clear() { Base::clear(Colors<TColor>::Black); }
+};
+
+class RasterGrayscaleAAGammaPower: public RasterGrayscaleAA {
+public:
+ RasterGrayscaleAAGammaPower(const RasterBase::Resolution &res,
+ const RasterBase::PixelDim & pd,
+ const RasterBase::Trafo & trafo,
+ double gamma = 1.)
+ : RasterGrayscaleAA(res, pd, trafo, agg::gamma_power(gamma))
+ {}
+};
+
+}} // namespace Slic3r::sla
+
+#endif // AGGRASTER_HPP
diff --git a/src/libslic3r/SLA/BoostAdapter.hpp b/src/libslic3r/SLA/BoostAdapter.hpp
index b7b3c63a6..13e0465b1 100644
--- a/src/libslic3r/SLA/BoostAdapter.hpp
+++ b/src/libslic3r/SLA/BoostAdapter.hpp
@@ -1,7 +1,9 @@
#ifndef SLA_BOOSTADAPTER_HPP
#define SLA_BOOSTADAPTER_HPP
-#include <libslic3r/SLA/Common.hpp>
+#include <libslic3r/Point.hpp>
+#include <libslic3r/BoundingBox.hpp>
+
#include <boost/geometry.hpp>
namespace boost {
diff --git a/src/libslic3r/SLA/Clustering.cpp b/src/libslic3r/SLA/Clustering.cpp
new file mode 100644
index 000000000..41ff1d4f0
--- /dev/null
+++ b/src/libslic3r/SLA/Clustering.cpp
@@ -0,0 +1,152 @@
+#include "Clustering.hpp"
+#include "boost/geometry/index/rtree.hpp"
+
+#include <libslic3r/SLA/SpatIndex.hpp>
+#include <libslic3r/SLA/BoostAdapter.hpp>
+
+namespace Slic3r { namespace sla {
+
+namespace bgi = boost::geometry::index;
+using Index3D = bgi::rtree< PointIndexEl, bgi::rstar<16, 4> /* ? */ >;
+
+namespace {
+
+bool cmp_ptidx_elements(const PointIndexEl& e1, const PointIndexEl& e2)
+{
+ return e1.second < e2.second;
+};
+
+ClusteredPoints cluster(Index3D &sindex,
+ unsigned max_points,
+ std::function<std::vector<PointIndexEl>(
+ const Index3D &, const PointIndexEl &)> qfn)
+{
+ using Elems = std::vector<PointIndexEl>;
+
+ // Recursive function for visiting all the points in a given distance to
+ // each other
+ std::function<void(Elems&, Elems&)> group =
+ [&sindex, &group, max_points, qfn](Elems& pts, Elems& cluster)
+ {
+ for(auto& p : pts) {
+ std::vector<PointIndexEl> tmp = qfn(sindex, p);
+
+ std::sort(tmp.begin(), tmp.end(), cmp_ptidx_elements);
+
+ Elems newpts;
+ std::set_difference(tmp.begin(), tmp.end(),
+ cluster.begin(), cluster.end(),
+ std::back_inserter(newpts), cmp_ptidx_elements);
+
+ int c = max_points && newpts.size() + cluster.size() > max_points?
+ int(max_points - cluster.size()) : int(newpts.size());
+
+ cluster.insert(cluster.end(), newpts.begin(), newpts.begin() + c);
+ std::sort(cluster.begin(), cluster.end(), cmp_ptidx_elements);
+
+ if(!newpts.empty() && (!max_points || cluster.size() < max_points))
+ group(newpts, cluster);
+ }
+ };
+
+ std::vector<Elems> clusters;
+ for(auto it = sindex.begin(); it != sindex.end();) {
+ Elems cluster = {};
+ Elems pts = {*it};
+ group(pts, cluster);
+
+ for(auto& c : cluster) sindex.remove(c);
+ it = sindex.begin();
+
+ clusters.emplace_back(cluster);
+ }
+
+ ClusteredPoints result;
+ for(auto& cluster : clusters) {
+ result.emplace_back();
+ for(auto c : cluster) result.back().emplace_back(c.second);
+ }
+
+ return result;
+}
+
+std::vector<PointIndexEl> distance_queryfn(const Index3D& sindex,
+ const PointIndexEl& p,
+ double dist,
+ unsigned max_points)
+{
+ std::vector<PointIndexEl> tmp; tmp.reserve(max_points);
+ sindex.query(
+ bgi::nearest(p.first, max_points),
+ std::back_inserter(tmp)
+ );
+
+ for(auto it = tmp.begin(); it < tmp.end(); ++it)
+ if((p.first - it->first).norm() > dist) it = tmp.erase(it);
+
+ return tmp;
+}
+
+} // namespace
+
+// Clustering a set of points by the given criteria
+ClusteredPoints cluster(
+ const std::vector<unsigned>& indices,
+ std::function<Vec3d(unsigned)> pointfn,
+ double dist,
+ unsigned max_points)
+{
+ // A spatial index for querying the nearest points
+ Index3D sindex;
+
+ // Build the index
+ for(auto idx : indices) sindex.insert( std::make_pair(pointfn(idx), idx));
+
+ return cluster(sindex, max_points,
+ [dist, max_points](const Index3D& sidx, const PointIndexEl& p)
+ {
+ return distance_queryfn(sidx, p, dist, max_points);
+ });
+}
+
+// Clustering a set of points by the given criteria
+ClusteredPoints cluster(
+ const std::vector<unsigned>& indices,
+ std::function<Vec3d(unsigned)> pointfn,
+ std::function<bool(const PointIndexEl&, const PointIndexEl&)> predicate,
+ unsigned max_points)
+{
+ // A spatial index for querying the nearest points
+ Index3D sindex;
+
+ // Build the index
+ for(auto idx : indices) sindex.insert( std::make_pair(pointfn(idx), idx));
+
+ return cluster(sindex, max_points,
+ [max_points, predicate](const Index3D& sidx, const PointIndexEl& p)
+ {
+ std::vector<PointIndexEl> tmp; tmp.reserve(max_points);
+ sidx.query(bgi::satisfies([p, predicate](const PointIndexEl& e){
+ return predicate(p, e);
+ }), std::back_inserter(tmp));
+ return tmp;
+ });
+}
+
+ClusteredPoints cluster(const Eigen::MatrixXd& pts, double dist, unsigned max_points)
+{
+ // A spatial index for querying the nearest points
+ Index3D sindex;
+
+ // Build the index
+ for(Eigen::Index i = 0; i < pts.rows(); i++)
+ sindex.insert(std::make_pair(Vec3d(pts.row(i)), unsigned(i)));
+
+ return cluster(sindex, max_points,
+ [dist, max_points](const Index3D& sidx, const PointIndexEl& p)
+ {
+ return distance_queryfn(sidx, p, dist, max_points);
+ });
+}
+
+}} // namespace Slic3r::sla
diff --git a/src/libslic3r/SLA/Clustering.hpp b/src/libslic3r/SLA/Clustering.hpp
index 1b0d47d95..269ec2882 100644
--- a/src/libslic3r/SLA/Clustering.hpp
+++ b/src/libslic3r/SLA/Clustering.hpp
@@ -2,7 +2,8 @@
#define SLA_CLUSTERING_HPP
#include <vector>
-#include <libslic3r/SLA/Common.hpp>
+
+#include <libslic3r/Point.hpp>
#include <libslic3r/SLA/SpatIndex.hpp>
namespace Slic3r { namespace sla {
@@ -16,7 +17,7 @@ ClusteredPoints cluster(const std::vector<unsigned>& indices,
double dist,
unsigned max_points);
-ClusteredPoints cluster(const PointSet& points,
+ClusteredPoints cluster(const Eigen::MatrixXd& points,
double dist,
unsigned max_points);
@@ -26,5 +27,56 @@ ClusteredPoints cluster(
std::function<bool(const PointIndexEl&, const PointIndexEl&)> predicate,
unsigned max_points);
-}}
+// This function returns the position of the centroid in the input 'clust'
+// vector of point indices.
+template<class DistFn, class PointFn>
+long cluster_centroid(const ClusterEl &clust, PointFn pointfn, DistFn df)
+{
+ switch(clust.size()) {
+ case 0: /* empty cluster */ return -1;
+ case 1: /* only one element */ return 0;
+ case 2: /* if two elements, there is no center */ return 0;
+ default: ;
+ }
+
+ // The function works by calculating for each point the average distance
+ // from all the other points in the cluster. We create a selector bitmask of
+ // the same size as the cluster. The bitmask will have two true bits and
+ // false bits for the rest of items and we will loop through all the
+ // permutations of the bitmask (combinations of two points). Get the
+ // distance for the two points and add the distance to the averages.
+ // The point with the smallest average than wins.
+
+ // The complexity should be O(n^2) but we will mostly apply this function
+ // for small clusters only (cca 3 elements)
+
+ std::vector<bool> sel(clust.size(), false); // create full zero bitmask
+ std::fill(sel.end() - 2, sel.end(), true); // insert the two ones
+ std::vector<double> avgs(clust.size(), 0.0); // store the average distances
+
+ do {
+ std::array<size_t, 2> idx;
+ for(size_t i = 0, j = 0; i < clust.size(); i++)
+ if(sel[i]) idx[j++] = i;
+
+ double d = df(pointfn(clust[idx[0]]),
+ pointfn(clust[idx[1]]));
+
+ // add the distance to the sums for both associated points
+ for(auto i : idx) avgs[i] += d;
+
+ // now continue with the next permutation of the bitmask with two 1s
+ } while(std::next_permutation(sel.begin(), sel.end()));
+
+ // Divide by point size in the cluster to get the average (may be redundant)
+ for(auto& a : avgs) a /= clust.size();
+
+ // get the lowest average distance and return the index
+ auto minit = std::min_element(avgs.begin(), avgs.end());
+ return long(minit - avgs.begin());
+}
+
+
+}} // namespace Slic3r::sla
+
#endif // CLUSTERING_HPP
diff --git a/src/libslic3r/SLA/Common.cpp b/src/libslic3r/SLA/Common.cpp
deleted file mode 100644
index d2aac18fd..000000000
--- a/src/libslic3r/SLA/Common.cpp
+++ /dev/null
@@ -1,769 +0,0 @@
-#include <cmath>
-#include <libslic3r/SLA/Common.hpp>
-#include <libslic3r/SLA/Concurrency.hpp>
-#include <libslic3r/SLA/SupportTree.hpp>
-#include <libslic3r/SLA/SpatIndex.hpp>
-#include <libslic3r/SLA/EigenMesh3D.hpp>
-#include <libslic3r/SLA/Contour3D.hpp>
-#include <libslic3r/SLA/Clustering.hpp>
-#include <libslic3r/SLA/Hollowing.hpp>
-
-
-// Workaround: IGL signed_distance.h will define PI in the igl namespace.
-#undef PI
-
-// HEAVY headers... takes eternity to compile
-
-// for concave hull merging decisions
-#include <libslic3r/SLA/BoostAdapter.hpp>
-#include "boost/geometry/index/rtree.hpp"
-
-#ifdef _MSC_VER
-#pragma warning(push)
-#pragma warning(disable: 4244)
-#pragma warning(disable: 4267)
-#endif
-#include <igl/ray_mesh_intersect.h>
-#include <igl/point_mesh_squared_distance.h>
-#include <igl/remove_duplicate_vertices.h>
-#include <igl/collapse_small_triangles.h>
-#include <igl/signed_distance.h>
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
-
-#include <tbb/parallel_for.h>
-
-#include "ClipperUtils.hpp"
-
-namespace Slic3r {
-namespace sla {
-
-// Bring back PI from the igl namespace
-using igl::PI;
-
-/* **************************************************************************
- * PointIndex implementation
- * ************************************************************************** */
-
-class PointIndex::Impl {
-public:
- using BoostIndex = boost::geometry::index::rtree< PointIndexEl,
- boost::geometry::index::rstar<16, 4> /* ? */ >;
-
- BoostIndex m_store;
-};
-
-PointIndex::PointIndex(): m_impl(new Impl()) {}
-PointIndex::~PointIndex() {}
-
-PointIndex::PointIndex(const PointIndex &cpy): m_impl(new Impl(*cpy.m_impl)) {}
-PointIndex::PointIndex(PointIndex&& cpy): m_impl(std::move(cpy.m_impl)) {}
-
-PointIndex& PointIndex::operator=(const PointIndex &cpy)
-{
- m_impl.reset(new Impl(*cpy.m_impl));
- return *this;
-}
-
-PointIndex& PointIndex::operator=(PointIndex &&cpy)
-{
- m_impl.swap(cpy.m_impl);
- return *this;
-}
-
-void PointIndex::insert(const PointIndexEl &el)
-{
- m_impl->m_store.insert(el);
-}
-
-bool PointIndex::remove(const PointIndexEl& el)
-{
- return m_impl->m_store.remove(el) == 1;
-}
-
-std::vector<PointIndexEl>
-PointIndex::query(std::function<bool(const PointIndexEl &)> fn) const
-{
- namespace bgi = boost::geometry::index;
-
- std::vector<PointIndexEl> ret;
- m_impl->m_store.query(bgi::satisfies(fn), std::back_inserter(ret));
- return ret;
-}
-
-std::vector<PointIndexEl> PointIndex::nearest(const Vec3d &el, unsigned k = 1) const
-{
- namespace bgi = boost::geometry::index;
- std::vector<PointIndexEl> ret; ret.reserve(k);
- m_impl->m_store.query(bgi::nearest(el, k), std::back_inserter(ret));
- return ret;
-}
-
-size_t PointIndex::size() const
-{
- return m_impl->m_store.size();
-}
-
-void PointIndex::foreach(std::function<void (const PointIndexEl &)> fn)
-{
- for(auto& el : m_impl->m_store) fn(el);
-}
-
-void PointIndex::foreach(std::function<void (const PointIndexEl &)> fn) const
-{
- for(const auto &el : m_impl->m_store) fn(el);
-}
-
-/* **************************************************************************
- * BoxIndex implementation
- * ************************************************************************** */
-
-class BoxIndex::Impl {
-public:
- using BoostIndex = boost::geometry::index::
- rtree<BoxIndexEl, boost::geometry::index::rstar<16, 4> /* ? */>;
-
- BoostIndex m_store;
-};
-
-BoxIndex::BoxIndex(): m_impl(new Impl()) {}
-BoxIndex::~BoxIndex() {}
-
-BoxIndex::BoxIndex(const BoxIndex &cpy): m_impl(new Impl(*cpy.m_impl)) {}
-BoxIndex::BoxIndex(BoxIndex&& cpy): m_impl(std::move(cpy.m_impl)) {}
-
-BoxIndex& BoxIndex::operator=(const BoxIndex &cpy)
-{
- m_impl.reset(new Impl(*cpy.m_impl));
- return *this;
-}
-
-BoxIndex& BoxIndex::operator=(BoxIndex &&cpy)
-{
- m_impl.swap(cpy.m_impl);
- return *this;
-}
-
-void BoxIndex::insert(const BoxIndexEl &el)
-{
- m_impl->m_store.insert(el);
-}
-
-bool BoxIndex::remove(const BoxIndexEl& el)
-{
- return m_impl->m_store.remove(el) == 1;
-}
-
-std::vector<BoxIndexEl> BoxIndex::query(const BoundingBox &qrbb,
- BoxIndex::QueryType qt)
-{
- namespace bgi = boost::geometry::index;
-
- std::vector<BoxIndexEl> ret; ret.reserve(m_impl->m_store.size());
-
- switch (qt) {
- case qtIntersects:
- m_impl->m_store.query(bgi::intersects(qrbb), std::back_inserter(ret));
- break;
- case qtWithin:
- m_impl->m_store.query(bgi::within(qrbb), std::back_inserter(ret));
- }
-
- return ret;
-}
-
-size_t BoxIndex::size() const
-{
- return m_impl->m_store.size();
-}
-
-void BoxIndex::foreach(std::function<void (const BoxIndexEl &)> fn)
-{
- for(auto& el : m_impl->m_store) fn(el);
-}
-
-
-/* ****************************************************************************
- * EigenMesh3D implementation
- * ****************************************************************************/
-
-class EigenMesh3D::AABBImpl: public igl::AABB<Eigen::MatrixXd, 3> {
-public:
-#ifdef SLIC3R_SLA_NEEDS_WINDTREE
- igl::WindingNumberAABB<Vec3d, Eigen::MatrixXd, Eigen::MatrixXi> windtree;
-#endif /* SLIC3R_SLA_NEEDS_WINDTREE */
-};
-
-static const constexpr double MESH_EPS = 1e-6;
-
-void to_eigen_mesh(const TriangleMesh &tmesh, Eigen::MatrixXd &V, Eigen::MatrixXi &F)
-{
- const stl_file& stl = tmesh.stl;
-
- V.resize(3*stl.stats.number_of_facets, 3);
- F.resize(stl.stats.number_of_facets, 3);
- for (unsigned int i = 0; i < stl.stats.number_of_facets; ++i) {
- const stl_facet &facet = stl.facet_start[i];
- V.block<1, 3>(3 * i + 0, 0) = facet.vertex[0].cast<double>();
- V.block<1, 3>(3 * i + 1, 0) = facet.vertex[1].cast<double>();
- V.block<1, 3>(3 * i + 2, 0) = facet.vertex[2].cast<double>();
- F(i, 0) = int(3*i+0);
- F(i, 1) = int(3*i+1);
- F(i, 2) = int(3*i+2);
- }
-
- if (!tmesh.has_shared_vertices())
- {
- Eigen::MatrixXd rV;
- Eigen::MatrixXi rF;
- // We will convert this to a proper 3d mesh with no duplicate points.
- Eigen::VectorXi SVI, SVJ;
- igl::remove_duplicate_vertices(V, F, MESH_EPS, rV, SVI, SVJ, rF);
- V = std::move(rV);
- F = std::move(rF);
- }
-}
-
-void to_triangle_mesh(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, TriangleMesh &out)
-{
- Pointf3s points(size_t(V.rows()));
- std::vector<Vec3crd> facets(size_t(F.rows()));
-
- for (Eigen::Index i = 0; i < V.rows(); ++i)
- points[size_t(i)] = V.row(i);
-
- for (Eigen::Index i = 0; i < F.rows(); ++i)
- facets[size_t(i)] = F.row(i);
-
- out = {points, facets};
-}
-
-EigenMesh3D::EigenMesh3D(const TriangleMesh& tmesh): m_aabb(new AABBImpl()) {
- auto&& bb = tmesh.bounding_box();
- m_ground_level += bb.min(Z);
-
- to_eigen_mesh(tmesh, m_V, m_F);
-
- // Build the AABB accelaration tree
- m_aabb->init(m_V, m_F);
-#ifdef SLIC3R_SLA_NEEDS_WINDTREE
- m_aabb->windtree.set_mesh(m_V, m_F);
-#endif /* SLIC3R_SLA_NEEDS_WINDTREE */
-}
-
-EigenMesh3D::~EigenMesh3D() {}
-
-EigenMesh3D::EigenMesh3D(const EigenMesh3D &other):
- m_V(other.m_V), m_F(other.m_F), m_ground_level(other.m_ground_level),
- m_aabb( new AABBImpl(*other.m_aabb) ) {}
-
-EigenMesh3D::EigenMesh3D(const Contour3D &other)
-{
- m_V.resize(Eigen::Index(other.points.size()), 3);
- m_F.resize(Eigen::Index(other.faces3.size() + 2 * other.faces4.size()), 3);
-
- for (Eigen::Index i = 0; i < Eigen::Index(other.points.size()); ++i)
- m_V.row(i) = other.points[size_t(i)];
-
- for (Eigen::Index i = 0; i < Eigen::Index(other.faces3.size()); ++i)
- m_F.row(i) = other.faces3[size_t(i)];
-
- size_t N = other.faces3.size() + 2 * other.faces4.size();
- for (size_t i = other.faces3.size(); i < N; i += 2) {
- size_t quad_idx = (i - other.faces3.size()) / 2;
- auto & quad = other.faces4[quad_idx];
- m_F.row(Eigen::Index(i)) = Vec3i{quad(0), quad(1), quad(2)};
- m_F.row(Eigen::Index(i + 1)) = Vec3i{quad(2), quad(3), quad(0)};
- }
-}
-
-EigenMesh3D &EigenMesh3D::operator=(const EigenMesh3D &other)
-{
- m_V = other.m_V;
- m_F = other.m_F;
- m_ground_level = other.m_ground_level;
- m_aabb.reset(new AABBImpl(*other.m_aabb)); return *this;
-}
-
-EigenMesh3D &EigenMesh3D::operator=(EigenMesh3D &&other) = default;
-
-EigenMesh3D::EigenMesh3D(EigenMesh3D &&other) = default;
-
-EigenMesh3D::hit_result
-EigenMesh3D::query_ray_hit(const Vec3d &s, const Vec3d &dir) const
-{
- assert(is_approx(dir.norm(), 1.));
- igl::Hit hit;
- hit.t = std::numeric_limits<float>::infinity();
-
- if (m_holes.empty()) {
- m_aabb->intersect_ray(m_V, m_F, s, dir, hit);
- hit_result ret(*this);
- ret.m_t = double(hit.t);
- ret.m_dir = dir;
- ret.m_source = s;
- if(!std::isinf(hit.t) && !std::isnan(hit.t))
- ret.m_normal = this->normal_by_face_id(hit.id);
-
- return ret;
- }
- else {
- // If there are holes, the hit_results will be made by
- // query_ray_hits (object) and filter_hits (holes):
- return filter_hits(query_ray_hits(s, dir));
- }
-}
-
-std::vector<EigenMesh3D::hit_result>
-EigenMesh3D::query_ray_hits(const Vec3d &s, const Vec3d &dir) const
-{
- std::vector<EigenMesh3D::hit_result> outs;
- std::vector<igl::Hit> hits;
- m_aabb->intersect_ray(m_V, m_F, s, dir, hits);
-
- // The sort is necessary, the hits are not always sorted.
- std::sort(hits.begin(), hits.end(),
- [](const igl::Hit& a, const igl::Hit& b) { return a.t < b.t; });
-
- // Remove duplicates. They sometimes appear, for example when the ray is cast
- // along an axis of a cube due to floating-point approximations in igl (?)
- hits.erase(std::unique(hits.begin(), hits.end(),
- [](const igl::Hit& a, const igl::Hit& b)
- { return a.t == b.t; }),
- hits.end());
-
- // Convert the igl::Hit into hit_result
- outs.reserve(hits.size());
- for (const igl::Hit& hit : hits) {
- outs.emplace_back(EigenMesh3D::hit_result(*this));
- outs.back().m_t = double(hit.t);
- outs.back().m_dir = dir;
- outs.back().m_source = s;
- if(!std::isinf(hit.t) && !std::isnan(hit.t))
- outs.back().m_normal = this->normal_by_face_id(hit.id);
- }
-
- return outs;
-}
-
-EigenMesh3D::hit_result EigenMesh3D::filter_hits(
- const std::vector<EigenMesh3D::hit_result>& object_hits) const
-{
- assert(! m_holes.empty());
- hit_result out(*this);
-
- if (object_hits.empty())
- return out;
-
- const Vec3d& s = object_hits.front().source();
- const Vec3d& dir = object_hits.front().direction();
-
- // A helper struct to save an intersetion with a hole
- struct HoleHit {
- HoleHit(float t_p, const Vec3d& normal_p, bool entry_p) :
- t(t_p), normal(normal_p), entry(entry_p) {}
- float t;
- Vec3d normal;
- bool entry;
- };
- std::vector<HoleHit> hole_isects;
- hole_isects.reserve(m_holes.size());
-
- auto sf = s.cast<float>();
- auto dirf = dir.cast<float>();
-
- // Collect hits on all holes, preserve information about entry/exit
- for (const sla::DrainHole& hole : m_holes) {
- std::array<std::pair<float, Vec3d>, 2> isects;
- if (hole.get_intersections(sf, dirf, isects)) {
- // Ignore hole hits behind the source
- if (isects[0].first > 0.f) hole_isects.emplace_back(isects[0].first, isects[0].second, true);
- if (isects[1].first > 0.f) hole_isects.emplace_back(isects[1].first, isects[1].second, false);
- }
- }
-
- // Holes can intersect each other, sort the hits by t
- std::sort(hole_isects.begin(), hole_isects.end(),
- [](const HoleHit& a, const HoleHit& b) { return a.t < b.t; });
-
- // Now inspect the intersections with object and holes, in the order of
- // increasing distance. Keep track how deep are we nested in mesh/holes and
- // pick the correct intersection.
- // This needs to be done twice - first to find out how deep in the structure
- // the source is, then to pick the correct intersection.
- int hole_nested = 0;
- int object_nested = 0;
- for (int dry_run=1; dry_run>=0; --dry_run) {
- hole_nested = -hole_nested;
- object_nested = -object_nested;
-
- bool is_hole = false;
- bool is_entry = false;
- const HoleHit* next_hole_hit = hole_isects.empty() ? nullptr : &hole_isects.front();
- const hit_result* next_mesh_hit = &object_hits.front();
-
- while (next_hole_hit || next_mesh_hit) {
- if (next_hole_hit && next_mesh_hit) // still have hole and obj hits
- is_hole = (next_hole_hit->t < next_mesh_hit->m_t);
- else
- is_hole = next_hole_hit; // one or the other ran out
-
- // Is this entry or exit hit?
- is_entry = is_hole ? next_hole_hit->entry : ! next_mesh_hit->is_inside();
-
- if (! dry_run) {
- if (! is_hole && hole_nested == 0) {
- // This is a valid object hit
- return *next_mesh_hit;
- }
- if (is_hole && ! is_entry && object_nested != 0) {
- // This holehit is the one we seek
- out.m_t = next_hole_hit->t;
- out.m_normal = next_hole_hit->normal;
- out.m_source = s;
- out.m_dir = dir;
- return out;
- }
- }
-
- // Increase/decrease the counter
- (is_hole ? hole_nested : object_nested) += (is_entry ? 1 : -1);
-
- // Advance the respective pointer
- if (is_hole && next_hole_hit++ == &hole_isects.back())
- next_hole_hit = nullptr;
- if (! is_hole && next_mesh_hit++ == &object_hits.back())
- next_mesh_hit = nullptr;
- }
- }
-
- // if we got here, the ray ended up in infinity
- return out;
-}
-
-#ifdef SLIC3R_SLA_NEEDS_WINDTREE
-EigenMesh3D::si_result EigenMesh3D::signed_distance(const Vec3d &p) const {
- double sign = 0; double sqdst = 0; int i = 0; Vec3d c;
- igl::signed_distance_winding_number(*m_aabb, m_V, m_F, m_aabb->windtree,
- p, sign, sqdst, i, c);
-
- return si_result(sign * std::sqrt(sqdst), i, c);
-}
-
-bool EigenMesh3D::inside(const Vec3d &p) const {
- return m_aabb->windtree.inside(p);
-}
-#endif /* SLIC3R_SLA_NEEDS_WINDTREE */
-
-double EigenMesh3D::squared_distance(const Vec3d &p, int& i, Vec3d& c) const {
- double sqdst = 0;
- Eigen::Matrix<double, 1, 3> pp = p;
- Eigen::Matrix<double, 1, 3> cc;
- sqdst = m_aabb->squared_distance(m_V, m_F, pp, i, cc);
- c = cc;
- return sqdst;
-}
-
-/* ****************************************************************************
- * Misc functions
- * ****************************************************************************/
-
-namespace {
-
-bool point_on_edge(const Vec3d& p, const Vec3d& e1, const Vec3d& e2,
- double eps = 0.05)
-{
- using Line3D = Eigen::ParametrizedLine<double, 3>;
-
- auto line = Line3D::Through(e1, e2);
- double d = line.distance(p);
- return std::abs(d) < eps;
-}
-
-template<class Vec> double distance(const Vec& pp1, const Vec& pp2) {
- auto p = pp2 - pp1;
- return std::sqrt(p.transpose() * p);
-}
-
-}
-
-PointSet normals(const PointSet& points,
- const EigenMesh3D& mesh,
- double eps,
- std::function<void()> thr, // throw on cancel
- const std::vector<unsigned>& pt_indices)
-{
- if (points.rows() == 0 || mesh.V().rows() == 0 || mesh.F().rows() == 0)
- return {};
-
- std::vector<unsigned> range = pt_indices;
- if (range.empty()) {
- range.resize(size_t(points.rows()), 0);
- std::iota(range.begin(), range.end(), 0);
- }
-
- PointSet ret(range.size(), 3);
-
- // for (size_t ridx = 0; ridx < range.size(); ++ridx)
- ccr::enumerate(
- range.begin(), range.end(),
- [&ret, &mesh, &points, thr, eps](unsigned el, size_t ridx) {
- thr();
- auto eidx = Eigen::Index(el);
- int faceid = 0;
- Vec3d p;
-
- mesh.squared_distance(points.row(eidx), faceid, p);
-
- auto trindex = mesh.F().row(faceid);
-
- const Vec3d &p1 = mesh.V().row(trindex(0));
- const Vec3d &p2 = mesh.V().row(trindex(1));
- const Vec3d &p3 = mesh.V().row(trindex(2));
-
- // We should check if the point lies on an edge of the hosting
- // triangle. If it does then all the other triangles using the
- // same two points have to be searched and the final normal should
- // be some kind of aggregation of the participating triangle
- // normals. We should also consider the cases where the support
- // point lies right on a vertex of its triangle. The procedure is
- // the same, get the neighbor triangles and calculate an average
- // normal.
-
- // mark the vertex indices of the edge. ia and ib marks and edge
- // ic will mark a single vertex.
- int ia = -1, ib = -1, ic = -1;
-
- if (std::abs(distance(p, p1)) < eps) {
- ic = trindex(0);
- } else if (std::abs(distance(p, p2)) < eps) {
- ic = trindex(1);
- } else if (std::abs(distance(p, p3)) < eps) {
- ic = trindex(2);
- } else if (point_on_edge(p, p1, p2, eps)) {
- ia = trindex(0);
- ib = trindex(1);
- } else if (point_on_edge(p, p2, p3, eps)) {
- ia = trindex(1);
- ib = trindex(2);
- } else if (point_on_edge(p, p1, p3, eps)) {
- ia = trindex(0);
- ib = trindex(2);
- }
-
- // vector for the neigboring triangles including the detected one.
- std::vector<Vec3i> neigh;
- if (ic >= 0) { // The point is right on a vertex of the triangle
- for (int n = 0; n < mesh.F().rows(); ++n) {
- thr();
- Vec3i ni = mesh.F().row(n);
- if ((ni(X) == ic || ni(Y) == ic || ni(Z) == ic))
- neigh.emplace_back(ni);
- }
- } else if (ia >= 0 && ib >= 0) { // the point is on and edge
- // now get all the neigboring triangles
- for (int n = 0; n < mesh.F().rows(); ++n) {
- thr();
- Vec3i ni = mesh.F().row(n);
- if ((ni(X) == ia || ni(Y) == ia || ni(Z) == ia) &&
- (ni(X) == ib || ni(Y) == ib || ni(Z) == ib))
- neigh.emplace_back(ni);
- }
- }
-
- // Calculate the normals for the neighboring triangles
- std::vector<Vec3d> neighnorms;
- neighnorms.reserve(neigh.size());
- for (const Vec3i &tri : neigh) {
- const Vec3d & pt1 = mesh.V().row(tri(0));
- const Vec3d & pt2 = mesh.V().row(tri(1));
- const Vec3d & pt3 = mesh.V().row(tri(2));
- Eigen::Vector3d U = pt2 - pt1;
- Eigen::Vector3d V = pt3 - pt1;
- neighnorms.emplace_back(U.cross(V).normalized());
- }
-
- // Throw out duplicates. They would cause trouble with summing. We
- // will use std::unique which works on sorted ranges. We will sort
- // by the coefficient-wise sum of the normals. It should force the
- // same elements to be consecutive.
- std::sort(neighnorms.begin(), neighnorms.end(),
- [](const Vec3d &v1, const Vec3d &v2) {
- return v1.sum() < v2.sum();
- });
-
- auto lend = std::unique(neighnorms.begin(), neighnorms.end(),
- [](const Vec3d &n1, const Vec3d &n2) {
- // Compare normals for equivalence.
- // This is controvers stuff.
- auto deq = [](double a, double b) {
- return std::abs(a - b) < 1e-3;
- };
- return deq(n1(X), n2(X)) &&
- deq(n1(Y), n2(Y)) &&
- deq(n1(Z), n2(Z));
- });
-
- if (!neighnorms.empty()) { // there were neighbors to count with
- // sum up the normals and then normalize the result again.
- // This unification seems to be enough.
- Vec3d sumnorm(0, 0, 0);
- sumnorm = std::accumulate(neighnorms.begin(), lend, sumnorm);
- sumnorm.normalize();
- ret.row(long(ridx)) = sumnorm;
- } else { // point lies safely within its triangle
- Eigen::Vector3d U = p2 - p1;
- Eigen::Vector3d V = p3 - p1;
- ret.row(long(ridx)) = U.cross(V).normalized();
- }
- });
-
- return ret;
-}
-
-namespace bgi = boost::geometry::index;
-using Index3D = bgi::rtree< PointIndexEl, bgi::rstar<16, 4> /* ? */ >;
-
-namespace {
-
-bool cmp_ptidx_elements(const PointIndexEl& e1, const PointIndexEl& e2)
-{
- return e1.second < e2.second;
-};
-
-ClusteredPoints cluster(Index3D &sindex,
- unsigned max_points,
- std::function<std::vector<PointIndexEl>(
- const Index3D &, const PointIndexEl &)> qfn)
-{
- using Elems = std::vector<PointIndexEl>;
-
- // Recursive function for visiting all the points in a given distance to
- // each other
- std::function<void(Elems&, Elems&)> group =
- [&sindex, &group, max_points, qfn](Elems& pts, Elems& cluster)
- {
- for(auto& p : pts) {
- std::vector<PointIndexEl> tmp = qfn(sindex, p);
-
- std::sort(tmp.begin(), tmp.end(), cmp_ptidx_elements);
-
- Elems newpts;
- std::set_difference(tmp.begin(), tmp.end(),
- cluster.begin(), cluster.end(),
- std::back_inserter(newpts), cmp_ptidx_elements);
-
- int c = max_points && newpts.size() + cluster.size() > max_points?
- int(max_points - cluster.size()) : int(newpts.size());
-
- cluster.insert(cluster.end(), newpts.begin(), newpts.begin() + c);
- std::sort(cluster.begin(), cluster.end(), cmp_ptidx_elements);
-
- if(!newpts.empty() && (!max_points || cluster.size() < max_points))
- group(newpts, cluster);
- }
- };
-
- std::vector<Elems> clusters;
- for(auto it = sindex.begin(); it != sindex.end();) {
- Elems cluster = {};
- Elems pts = {*it};
- group(pts, cluster);
-
- for(auto& c : cluster) sindex.remove(c);
- it = sindex.begin();
-
- clusters.emplace_back(cluster);
- }
-
- ClusteredPoints result;
- for(auto& cluster : clusters) {
- result.emplace_back();
- for(auto c : cluster) result.back().emplace_back(c.second);
- }
-
- return result;
-}
-
-std::vector<PointIndexEl> distance_queryfn(const Index3D& sindex,
- const PointIndexEl& p,
- double dist,
- unsigned max_points)
-{
- std::vector<PointIndexEl> tmp; tmp.reserve(max_points);
- sindex.query(
- bgi::nearest(p.first, max_points),
- std::back_inserter(tmp)
- );
-
- for(auto it = tmp.begin(); it < tmp.end(); ++it)
- if(distance(p.first, it->first) > dist) it = tmp.erase(it);
-
- return tmp;
-}
-
-} // namespace
-
-// Clustering a set of points by the given criteria
-ClusteredPoints cluster(
- const std::vector<unsigned>& indices,
- std::function<Vec3d(unsigned)> pointfn,
- double dist,
- unsigned max_points)
-{
- // A spatial index for querying the nearest points
- Index3D sindex;
-
- // Build the index
- for(auto idx : indices) sindex.insert( std::make_pair(pointfn(idx), idx));
-
- return cluster(sindex, max_points,
- [dist, max_points](const Index3D& sidx, const PointIndexEl& p)
- {
- return distance_queryfn(sidx, p, dist, max_points);
- });
-}
-
-// Clustering a set of points by the given criteria
-ClusteredPoints cluster(
- const std::vector<unsigned>& indices,
- std::function<Vec3d(unsigned)> pointfn,
- std::function<bool(const PointIndexEl&, const PointIndexEl&)> predicate,
- unsigned max_points)
-{
- // A spatial index for querying the nearest points
- Index3D sindex;
-
- // Build the index
- for(auto idx : indices) sindex.insert( std::make_pair(pointfn(idx), idx));
-
- return cluster(sindex, max_points,
- [max_points, predicate](const Index3D& sidx, const PointIndexEl& p)
- {
- std::vector<PointIndexEl> tmp; tmp.reserve(max_points);
- sidx.query(bgi::satisfies([p, predicate](const PointIndexEl& e){
- return predicate(p, e);
- }), std::back_inserter(tmp));
- return tmp;
- });
-}
-
-ClusteredPoints cluster(const PointSet& pts, double dist, unsigned max_points)
-{
- // A spatial index for querying the nearest points
- Index3D sindex;
-
- // Build the index
- for(Eigen::Index i = 0; i < pts.rows(); i++)
- sindex.insert(std::make_pair(Vec3d(pts.row(i)), unsigned(i)));
-
- return cluster(sindex, max_points,
- [dist, max_points](const Index3D& sidx, const PointIndexEl& p)
- {
- return distance_queryfn(sidx, p, dist, max_points);
- });
-}
-
-} // namespace sla
-} // namespace Slic3r
diff --git a/src/libslic3r/SLA/Common.hpp b/src/libslic3r/SLA/Common.hpp
deleted file mode 100644
index e1c5930e2..000000000
--- a/src/libslic3r/SLA/Common.hpp
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifndef SLA_COMMON_HPP
-#define SLA_COMMON_HPP
-
-#include <memory>
-#include <vector>
-#include <numeric>
-#include <functional>
-#include <Eigen/Geometry>
-
-//#include "SLASpatIndex.hpp"
-
-//#include <libslic3r/ExPolygon.hpp>
-//#include <libslic3r/TriangleMesh.hpp>
-
-// #define SLIC3R_SLA_NEEDS_WINDTREE
-
-namespace Slic3r {
-
-// Typedefs from Point.hpp
-typedef Eigen::Matrix<float, 3, 1, Eigen::DontAlign> Vec3f;
-typedef Eigen::Matrix<double, 3, 1, Eigen::DontAlign> Vec3d;
-typedef Eigen::Matrix<int, 4, 1, Eigen::DontAlign> Vec4i;
-
-namespace sla {
-
-using PointSet = Eigen::MatrixXd;
-
-} // namespace sla
-} // namespace Slic3r
-
-
-#endif // SLASUPPORTTREE_HPP
diff --git a/src/libslic3r/SLA/Concurrency.hpp b/src/libslic3r/SLA/Concurrency.hpp
index 8620c67b1..300024c76 100644
--- a/src/libslic3r/SLA/Concurrency.hpp
+++ b/src/libslic3r/SLA/Concurrency.hpp
@@ -4,6 +4,12 @@
#include <tbb/spin_mutex.h>
#include <tbb/mutex.h>
#include <tbb/parallel_for.h>
+#include <tbb/parallel_reduce.h>
+
+#include <algorithm>
+#include <numeric>
+
+#include <libslic3r/libslic3r.h>
namespace Slic3r {
namespace sla {
@@ -17,18 +23,59 @@ template<bool> struct _ccr {};
template<> struct _ccr<true>
{
using SpinningMutex = tbb::spin_mutex;
- using BlockingMutex = tbb::mutex;
-
+ using BlockingMutex = tbb::mutex;
+
+ template<class Fn, class It>
+ static IteratorOnly<It, void> loop_(const tbb::blocked_range<It> &range, Fn &&fn)
+ {
+ for (auto &el : range) fn(el);
+ }
+
+ template<class Fn, class I>
+ static IntegerOnly<I, void> loop_(const tbb::blocked_range<I> &range, Fn &&fn)
+ {
+ for (I i = range.begin(); i < range.end(); ++i) fn(i);
+ }
+
template<class It, class Fn>
- static inline void enumerate(It from, It to, Fn fn)
+ static void for_each(It from, It to, Fn &&fn, size_t granularity = 1)
{
- auto iN = to - from;
- size_t N = iN < 0 ? 0 : size_t(iN);
-
- tbb::parallel_for(size_t(0), N, [from, fn](size_t n) {
- fn(*(from + decltype(iN)(n)), n);
+ tbb::parallel_for(tbb::blocked_range{from, to, granularity},
+ [&fn, from](const auto &range) {
+ loop_(range, std::forward<Fn>(fn));
});
}
+
+ template<class I, class MergeFn, class T, class AccessFn>
+ static T reduce(I from,
+ I to,
+ const T &init,
+ MergeFn &&mergefn,
+ AccessFn &&access,
+ size_t granularity = 1
+ )
+ {
+ return tbb::parallel_reduce(
+ tbb::blocked_range{from, to, granularity}, init,
+ [&](const auto &range, T subinit) {
+ T acc = subinit;
+ loop_(range, [&](auto &i) { acc = mergefn(acc, access(i)); });
+ return acc;
+ },
+ std::forward<MergeFn>(mergefn));
+ }
+
+ template<class I, class MergeFn, class T>
+ static IteratorOnly<I, T> reduce(I from,
+ I to,
+ const T & init,
+ MergeFn &&mergefn,
+ size_t granularity = 1)
+ {
+ return reduce(
+ from, to, init, std::forward<MergeFn>(mergefn),
+ [](typename I::value_type &i) { return i; }, granularity);
+ }
};
template<> struct _ccr<false>
@@ -39,11 +86,52 @@ private:
public:
using SpinningMutex = _Mtx;
using BlockingMutex = _Mtx;
-
+
+ template<class Fn, class It>
+ static IteratorOnly<It, void> loop_(It from, It to, Fn &&fn)
+ {
+ for (auto it = from; it != to; ++it) fn(*it);
+ }
+
+ template<class Fn, class I>
+ static IntegerOnly<I, void> loop_(I from, I to, Fn &&fn)
+ {
+ for (I i = from; i < to; ++i) fn(i);
+ }
+
template<class It, class Fn>
- static inline void enumerate(It from, It to, Fn fn)
+ static void for_each(It from,
+ It to,
+ Fn &&fn,
+ size_t /* ignore granularity */ = 1)
+ {
+ loop_(from, to, std::forward<Fn>(fn));
+ }
+
+ template<class I, class MergeFn, class T, class AccessFn>
+ static T reduce(I from,
+ I to,
+ const T & init,
+ MergeFn &&mergefn,
+ AccessFn &&access,
+ size_t /*granularity*/ = 1
+ )
+ {
+ T acc = init;
+ loop_(from, to, [&](auto &i) { acc = mergefn(acc, access(i)); });
+ return acc;
+ }
+
+ template<class I, class MergeFn, class T>
+ static IteratorOnly<I, T> reduce(I from,
+ I to,
+ const T &init,
+ MergeFn &&mergefn,
+ size_t /*granularity*/ = 1
+ )
{
- for (auto it = from; it != to; ++it) fn(*it, size_t(it - from));
+ return reduce(from, to, init, std::forward<MergeFn>(mergefn),
+ [](typename I::value_type &i) { return i; });
}
};
diff --git a/src/libslic3r/SLA/Contour3D.cpp b/src/libslic3r/SLA/Contour3D.cpp
index e39672b8b..96d10af20 100644
--- a/src/libslic3r/SLA/Contour3D.cpp
+++ b/src/libslic3r/SLA/Contour3D.cpp
@@ -1,5 +1,5 @@
#include <libslic3r/SLA/Contour3D.hpp>
-#include <libslic3r/SLA/EigenMesh3D.hpp>
+#include <libslic3r/SLA/IndexedMesh.hpp>
#include <libslic3r/Format/objparser.hpp>
@@ -27,15 +27,15 @@ Contour3D::Contour3D(TriangleMesh &&trmesh)
faces3.swap(trmesh.its.indices);
}
-Contour3D::Contour3D(const EigenMesh3D &emesh) {
- points.reserve(size_t(emesh.V().rows()));
- faces3.reserve(size_t(emesh.F().rows()));
+Contour3D::Contour3D(const IndexedMesh &emesh) {
+ points.reserve(emesh.vertices().size());
+ faces3.reserve(emesh.indices().size());
- for (int r = 0; r < emesh.V().rows(); r++)
- points.emplace_back(emesh.V().row(r).cast<double>());
+ for (const Vec3f& vert : emesh.vertices())
+ points.emplace_back(vert.cast<double>());
- for (int i = 0; i < emesh.F().rows(); i++)
- faces3.emplace_back(emesh.F().row(i));
+ for (const auto& ind : emesh.indices())
+ faces3.emplace_back(ind);
}
Contour3D &Contour3D::merge(const Contour3D &ctr)
diff --git a/src/libslic3r/SLA/Contour3D.hpp b/src/libslic3r/SLA/Contour3D.hpp
index 295612f19..3380cd6ab 100644
--- a/src/libslic3r/SLA/Contour3D.hpp
+++ b/src/libslic3r/SLA/Contour3D.hpp
@@ -1,13 +1,16 @@
#ifndef SLA_CONTOUR3D_HPP
#define SLA_CONTOUR3D_HPP
-#include <libslic3r/SLA/Common.hpp>
-
#include <libslic3r/TriangleMesh.hpp>
-namespace Slic3r { namespace sla {
+namespace Slic3r {
+
+// Used for quads (TODO: remove this, and convert quads to triangles in OpenVDBUtils)
+using Vec4i = Eigen::Matrix<int, 4, 1, Eigen::DontAlign>;
+
+namespace sla {
-class EigenMesh3D;
+class IndexedMesh;
/// Dumb vertex mesh consisting of triangles (or) quads. Capable of merging with
/// other meshes of this type and converting to and from other mesh formats.
@@ -19,7 +22,7 @@ struct Contour3D {
Contour3D() = default;
Contour3D(const TriangleMesh &trmesh);
Contour3D(TriangleMesh &&trmesh);
- Contour3D(const EigenMesh3D &emesh);
+ Contour3D(const IndexedMesh &emesh);
Contour3D& merge(const Contour3D& ctr);
Contour3D& merge(const Pointf3s& triangles);
diff --git a/src/libslic3r/SLA/Hollowing.cpp b/src/libslic3r/SLA/Hollowing.cpp
index c4a616d93..6df752fd3 100644
--- a/src/libslic3r/SLA/Hollowing.cpp
+++ b/src/libslic3r/SLA/Hollowing.cpp
@@ -3,11 +3,10 @@
#include <libslic3r/OpenVDBUtils.hpp>
#include <libslic3r/TriangleMesh.hpp>
#include <libslic3r/SLA/Hollowing.hpp>
-#include <libslic3r/SLA/Contour3D.hpp>
-#include <libslic3r/SLA/EigenMesh3D.hpp>
-#include <libslic3r/SLA/SupportTreeBuilder.hpp>
+#include <libslic3r/SLA/IndexedMesh.hpp>
#include <libslic3r/ClipperUtils.hpp>
#include <libslic3r/SimplifyMesh.hpp>
+#include <libslic3r/SLA/SupportTreeMesher.hpp>
#include <boost/log/trivial.hpp>
@@ -97,7 +96,7 @@ std::unique_ptr<TriangleMesh> generate_interior(const TriangleMesh & mesh,
_generate_interior(mesh, ctl, hc.min_thickness, voxel_scale,
hc.closing_distance));
- if (meshptr) {
+ if (meshptr && !meshptr->empty()) {
// This flips the normals to be outward facing...
meshptr->require_shared_vertices();
@@ -160,7 +159,7 @@ bool DrainHole::get_intersections(const Vec3f& s, const Vec3f& dir,
const Eigen::ParametrizedLine<float, 3> ray(s, dir.normalized());
for (size_t i=0; i<2; ++i)
- out[i] = std::make_pair(sla::EigenMesh3D::hit_result::infty(), Vec3d::Zero());
+ out[i] = std::make_pair(sla::IndexedMesh::hit_result::infty(), Vec3d::Zero());
const float sqr_radius = pow(radius, 2.f);
@@ -274,4 +273,13 @@ void cut_drainholes(std::vector<ExPolygons> & obj_slices,
obj_slices[i] = diff_ex(obj_slices[i], hole_slices[i]);
}
+void hollow_mesh(TriangleMesh &mesh, const HollowingConfig &cfg)
+{
+ std::unique_ptr<Slic3r::TriangleMesh> inter_ptr =
+ Slic3r::sla::generate_interior(mesh);
+
+ if (inter_ptr) mesh.merge(*inter_ptr);
+ mesh.require_shared_vertices();
+}
+
}} // namespace Slic3r::sla
diff --git a/src/libslic3r/SLA/Hollowing.hpp b/src/libslic3r/SLA/Hollowing.hpp
index cc7d310ea..949cc2393 100644
--- a/src/libslic3r/SLA/Hollowing.hpp
+++ b/src/libslic3r/SLA/Hollowing.hpp
@@ -2,7 +2,6 @@
#define SLA_HOLLOWING_HPP
#include <memory>
-#include <libslic3r/SLA/Common.hpp>
#include <libslic3r/SLA/Contour3D.hpp>
#include <libslic3r/SLA/JobController.hpp>
@@ -59,10 +58,14 @@ struct DrainHole
using DrainHoles = std::vector<DrainHole>;
+constexpr float HoleStickOutLength = 1.f;
+
std::unique_ptr<TriangleMesh> generate_interior(const TriangleMesh &mesh,
const HollowingConfig & = {},
const JobController &ctl = {});
+void hollow_mesh(TriangleMesh &mesh, const HollowingConfig &cfg);
+
void cut_drainholes(std::vector<ExPolygons> & obj_slices,
const std::vector<float> &slicegrid,
float closing_radius,
diff --git a/src/libslic3r/SLA/IndexedMesh.cpp b/src/libslic3r/SLA/IndexedMesh.cpp
new file mode 100644
index 000000000..efcf09873
--- /dev/null
+++ b/src/libslic3r/SLA/IndexedMesh.cpp
@@ -0,0 +1,433 @@
+#include "IndexedMesh.hpp"
+#include "Concurrency.hpp"
+
+#include <libslic3r/AABBTreeIndirect.hpp>
+#include <libslic3r/TriangleMesh.hpp>
+
+#include <numeric>
+
+#ifdef SLIC3R_HOLE_RAYCASTER
+#include <libslic3r/SLA/Hollowing.hpp>
+#endif
+
+namespace Slic3r { namespace sla {
+
+class IndexedMesh::AABBImpl {
+private:
+ AABBTreeIndirect::Tree3f m_tree;
+
+public:
+ void init(const TriangleMesh& tm)
+ {
+ m_tree = AABBTreeIndirect::build_aabb_tree_over_indexed_triangle_set(
+ tm.its.vertices, tm.its.indices);
+ }
+
+ void intersect_ray(const TriangleMesh& tm,
+ const Vec3d& s, const Vec3d& dir, igl::Hit& hit)
+ {
+ AABBTreeIndirect::intersect_ray_first_hit(tm.its.vertices,
+ tm.its.indices,
+ m_tree,
+ s, dir, hit);
+ }
+
+ void intersect_ray(const TriangleMesh& tm,
+ const Vec3d& s, const Vec3d& dir, std::vector<igl::Hit>& hits)
+ {
+ AABBTreeIndirect::intersect_ray_all_hits(tm.its.vertices,
+ tm.its.indices,
+ m_tree,
+ s, dir, hits);
+ }
+
+ double squared_distance(const TriangleMesh& tm,
+ const Vec3d& point, int& i, Eigen::Matrix<double, 1, 3>& closest) {
+ size_t idx_unsigned = 0;
+ Vec3d closest_vec3d(closest);
+ double dist = AABBTreeIndirect::squared_distance_to_indexed_triangle_set(
+ tm.its.vertices,
+ tm.its.indices,
+ m_tree, point, idx_unsigned, closest_vec3d);
+ i = int(idx_unsigned);
+ closest = closest_vec3d;
+ return dist;
+ }
+};
+
+static const constexpr double MESH_EPS = 1e-6;
+
+IndexedMesh::IndexedMesh(const TriangleMesh& tmesh)
+ : m_aabb(new AABBImpl()), m_tm(&tmesh)
+{
+ auto&& bb = tmesh.bounding_box();
+ m_ground_level += bb.min(Z);
+
+ // Build the AABB accelaration tree
+ m_aabb->init(tmesh);
+}
+
+IndexedMesh::~IndexedMesh() {}
+
+IndexedMesh::IndexedMesh(const IndexedMesh &other):
+ m_tm(other.m_tm), m_ground_level(other.m_ground_level),
+ m_aabb( new AABBImpl(*other.m_aabb) ) {}
+
+
+IndexedMesh &IndexedMesh::operator=(const IndexedMesh &other)
+{
+ m_tm = other.m_tm;
+ m_ground_level = other.m_ground_level;
+ m_aabb.reset(new AABBImpl(*other.m_aabb)); return *this;
+}
+
+IndexedMesh &IndexedMesh::operator=(IndexedMesh &&other) = default;
+
+IndexedMesh::IndexedMesh(IndexedMesh &&other) = default;
+
+
+
+const std::vector<Vec3f>& IndexedMesh::vertices() const
+{
+ return m_tm->its.vertices;
+}
+
+
+
+const std::vector<Vec3i>& IndexedMesh::indices() const
+{
+ return m_tm->its.indices;
+}
+
+
+
+const Vec3f& IndexedMesh::vertices(size_t idx) const
+{
+ return m_tm->its.vertices[idx];
+}
+
+
+
+const Vec3i& IndexedMesh::indices(size_t idx) const
+{
+ return m_tm->its.indices[idx];
+}
+
+
+
+Vec3d IndexedMesh::normal_by_face_id(int face_id) const {
+ return m_tm->stl.facet_start[face_id].normal.cast<double>();
+}
+
+
+IndexedMesh::hit_result
+IndexedMesh::query_ray_hit(const Vec3d &s, const Vec3d &dir) const
+{
+ assert(is_approx(dir.norm(), 1.));
+ igl::Hit hit;
+ hit.t = std::numeric_limits<float>::infinity();
+
+#ifdef SLIC3R_HOLE_RAYCASTER
+ if (! m_holes.empty()) {
+
+ // If there are holes, the hit_results will be made by
+ // query_ray_hits (object) and filter_hits (holes):
+ return filter_hits(query_ray_hits(s, dir));
+ }
+#endif
+
+ m_aabb->intersect_ray(*m_tm, s, dir, hit);
+ hit_result ret(*this);
+ ret.m_t = double(hit.t);
+ ret.m_dir = dir;
+ ret.m_source = s;
+ if(!std::isinf(hit.t) && !std::isnan(hit.t)) {
+ ret.m_normal = this->normal_by_face_id(hit.id);
+ ret.m_face_id = hit.id;
+ }
+
+ return ret;
+}
+
+std::vector<IndexedMesh::hit_result>
+IndexedMesh::query_ray_hits(const Vec3d &s, const Vec3d &dir) const
+{
+ std::vector<IndexedMesh::hit_result> outs;
+ std::vector<igl::Hit> hits;
+ m_aabb->intersect_ray(*m_tm, s, dir, hits);
+
+ // The sort is necessary, the hits are not always sorted.
+ std::sort(hits.begin(), hits.end(),
+ [](const igl::Hit& a, const igl::Hit& b) { return a.t < b.t; });
+
+ // Remove duplicates. They sometimes appear, for example when the ray is cast
+ // along an axis of a cube due to floating-point approximations in igl (?)
+ hits.erase(std::unique(hits.begin(), hits.end(),
+ [](const igl::Hit& a, const igl::Hit& b)
+ { return a.t == b.t; }),
+ hits.end());
+
+ // Convert the igl::Hit into hit_result
+ outs.reserve(hits.size());
+ for (const igl::Hit& hit : hits) {
+ outs.emplace_back(IndexedMesh::hit_result(*this));
+ outs.back().m_t = double(hit.t);
+ outs.back().m_dir = dir;
+ outs.back().m_source = s;
+ if(!std::isinf(hit.t) && !std::isnan(hit.t)) {
+ outs.back().m_normal = this->normal_by_face_id(hit.id);
+ outs.back().m_face_id = hit.id;
+ }
+ }
+
+ return outs;
+}
+
+
+#ifdef SLIC3R_HOLE_RAYCASTER
+IndexedMesh::hit_result IndexedMesh::filter_hits(
+ const std::vector<IndexedMesh::hit_result>& object_hits) const
+{
+ assert(! m_holes.empty());
+ hit_result out(*this);
+
+ if (object_hits.empty())
+ return out;
+
+ const Vec3d& s = object_hits.front().source();
+ const Vec3d& dir = object_hits.front().direction();
+
+ // A helper struct to save an intersetion with a hole
+ struct HoleHit {
+ HoleHit(float t_p, const Vec3d& normal_p, bool entry_p) :
+ t(t_p), normal(normal_p), entry(entry_p) {}
+ float t;
+ Vec3d normal;
+ bool entry;
+ };
+ std::vector<HoleHit> hole_isects;
+ hole_isects.reserve(m_holes.size());
+
+ auto sf = s.cast<float>();
+ auto dirf = dir.cast<float>();
+
+ // Collect hits on all holes, preserve information about entry/exit
+ for (const sla::DrainHole& hole : m_holes) {
+ std::array<std::pair<float, Vec3d>, 2> isects;
+ if (hole.get_intersections(sf, dirf, isects)) {
+ // Ignore hole hits behind the source
+ if (isects[0].first > 0.f) hole_isects.emplace_back(isects[0].first, isects[0].second, true);
+ if (isects[1].first > 0.f) hole_isects.emplace_back(isects[1].first, isects[1].second, false);
+ }
+ }
+
+ // Holes can intersect each other, sort the hits by t
+ std::sort(hole_isects.begin(), hole_isects.end(),
+ [](const HoleHit& a, const HoleHit& b) { return a.t < b.t; });
+
+ // Now inspect the intersections with object and holes, in the order of
+ // increasing distance. Keep track how deep are we nested in mesh/holes and
+ // pick the correct intersection.
+ // This needs to be done twice - first to find out how deep in the structure
+ // the source is, then to pick the correct intersection.
+ int hole_nested = 0;
+ int object_nested = 0;
+ for (int dry_run=1; dry_run>=0; --dry_run) {
+ hole_nested = -hole_nested;
+ object_nested = -object_nested;
+
+ bool is_hole = false;
+ bool is_entry = false;
+ const HoleHit* next_hole_hit = hole_isects.empty() ? nullptr : &hole_isects.front();
+ const hit_result* next_mesh_hit = &object_hits.front();
+
+ while (next_hole_hit || next_mesh_hit) {
+ if (next_hole_hit && next_mesh_hit) // still have hole and obj hits
+ is_hole = (next_hole_hit->t < next_mesh_hit->m_t);
+ else
+ is_hole = next_hole_hit; // one or the other ran out
+
+ // Is this entry or exit hit?
+ is_entry = is_hole ? next_hole_hit->entry : ! next_mesh_hit->is_inside();
+
+ if (! dry_run) {
+ if (! is_hole && hole_nested == 0) {
+ // This is a valid object hit
+ return *next_mesh_hit;
+ }
+ if (is_hole && ! is_entry && object_nested != 0) {
+ // This holehit is the one we seek
+ out.m_t = next_hole_hit->t;
+ out.m_normal = next_hole_hit->normal;
+ out.m_source = s;
+ out.m_dir = dir;
+ return out;
+ }
+ }
+
+ // Increase/decrease the counter
+ (is_hole ? hole_nested : object_nested) += (is_entry ? 1 : -1);
+
+ // Advance the respective pointer
+ if (is_hole && next_hole_hit++ == &hole_isects.back())
+ next_hole_hit = nullptr;
+ if (! is_hole && next_mesh_hit++ == &object_hits.back())
+ next_mesh_hit = nullptr;
+ }
+ }
+
+ // if we got here, the ray ended up in infinity
+ return out;
+}
+#endif
+
+
+double IndexedMesh::squared_distance(const Vec3d &p, int& i, Vec3d& c) const {
+ double sqdst = 0;
+ Eigen::Matrix<double, 1, 3> pp = p;
+ Eigen::Matrix<double, 1, 3> cc;
+ sqdst = m_aabb->squared_distance(*m_tm, pp, i, cc);
+ c = cc;
+ return sqdst;
+}
+
+
+static bool point_on_edge(const Vec3d& p, const Vec3d& e1, const Vec3d& e2,
+ double eps = 0.05)
+{
+ using Line3D = Eigen::ParametrizedLine<double, 3>;
+
+ auto line = Line3D::Through(e1, e2);
+ double d = line.distance(p);
+ return std::abs(d) < eps;
+}
+
+PointSet normals(const PointSet& points,
+ const IndexedMesh& mesh,
+ double eps,
+ std::function<void()> thr, // throw on cancel
+ const std::vector<unsigned>& pt_indices)
+{
+ if (points.rows() == 0 || mesh.vertices().empty() || mesh.indices().empty())
+ return {};
+
+ std::vector<unsigned> range = pt_indices;
+ if (range.empty()) {
+ range.resize(size_t(points.rows()), 0);
+ std::iota(range.begin(), range.end(), 0);
+ }
+
+ PointSet ret(range.size(), 3);
+
+ // for (size_t ridx = 0; ridx < range.size(); ++ridx)
+ ccr::for_each(size_t(0), range.size(),
+ [&ret, &mesh, &points, thr, eps, &range](size_t ridx) {
+ thr();
+ unsigned el = range[ridx];
+ auto eidx = Eigen::Index(el);
+ int faceid = 0;
+ Vec3d p;
+
+ mesh.squared_distance(points.row(eidx), faceid, p);
+
+ auto trindex = mesh.indices(faceid);
+
+ const Vec3d &p1 = mesh.vertices(trindex(0)).cast<double>();
+ const Vec3d &p2 = mesh.vertices(trindex(1)).cast<double>();
+ const Vec3d &p3 = mesh.vertices(trindex(2)).cast<double>();
+
+ // We should check if the point lies on an edge of the hosting
+ // triangle. If it does then all the other triangles using the
+ // same two points have to be searched and the final normal should
+ // be some kind of aggregation of the participating triangle
+ // normals. We should also consider the cases where the support
+ // point lies right on a vertex of its triangle. The procedure is
+ // the same, get the neighbor triangles and calculate an average
+ // normal.
+
+ // mark the vertex indices of the edge. ia and ib marks and edge
+ // ic will mark a single vertex.
+ int ia = -1, ib = -1, ic = -1;
+
+ if (std::abs((p - p1).norm()) < eps) {
+ ic = trindex(0);
+ } else if (std::abs((p - p2).norm()) < eps) {
+ ic = trindex(1);
+ } else if (std::abs((p - p3).norm()) < eps) {
+ ic = trindex(2);
+ } else if (point_on_edge(p, p1, p2, eps)) {
+ ia = trindex(0);
+ ib = trindex(1);
+ } else if (point_on_edge(p, p2, p3, eps)) {
+ ia = trindex(1);
+ ib = trindex(2);
+ } else if (point_on_edge(p, p1, p3, eps)) {
+ ia = trindex(0);
+ ib = trindex(2);
+ }
+
+ // vector for the neigboring triangles including the detected one.
+ std::vector<size_t> neigh;
+ if (ic >= 0) { // The point is right on a vertex of the triangle
+ for (size_t n = 0; n < mesh.indices().size(); ++n) {
+ thr();
+ Vec3i ni = mesh.indices(n);
+ if ((ni(X) == ic || ni(Y) == ic || ni(Z) == ic))
+ neigh.emplace_back(n);
+ }
+ } else if (ia >= 0 && ib >= 0) { // the point is on and edge
+ // now get all the neigboring triangles
+ for (size_t n = 0; n < mesh.indices().size(); ++n) {
+ thr();
+ Vec3i ni = mesh.indices(n);
+ if ((ni(X) == ia || ni(Y) == ia || ni(Z) == ia) &&
+ (ni(X) == ib || ni(Y) == ib || ni(Z) == ib))
+ neigh.emplace_back(n);
+ }
+ }
+
+ // Calculate the normals for the neighboring triangles
+ std::vector<Vec3d> neighnorms;
+ neighnorms.reserve(neigh.size());
+ for (size_t &tri_id : neigh)
+ neighnorms.emplace_back(mesh.normal_by_face_id(tri_id));
+
+ // Throw out duplicates. They would cause trouble with summing. We
+ // will use std::unique which works on sorted ranges. We will sort
+ // by the coefficient-wise sum of the normals. It should force the
+ // same elements to be consecutive.
+ std::sort(neighnorms.begin(), neighnorms.end(),
+ [](const Vec3d &v1, const Vec3d &v2) {
+ return v1.sum() < v2.sum();
+ });
+
+ auto lend = std::unique(neighnorms.begin(), neighnorms.end(),
+ [](const Vec3d &n1, const Vec3d &n2) {
+ // Compare normals for equivalence.
+ // This is controvers stuff.
+ auto deq = [](double a, double b) {
+ return std::abs(a - b) < 1e-3;
+ };
+ return deq(n1(X), n2(X)) &&
+ deq(n1(Y), n2(Y)) &&
+ deq(n1(Z), n2(Z));
+ });
+
+ if (!neighnorms.empty()) { // there were neighbors to count with
+ // sum up the normals and then normalize the result again.
+ // This unification seems to be enough.
+ Vec3d sumnorm(0, 0, 0);
+ sumnorm = std::accumulate(neighnorms.begin(), lend, sumnorm);
+ sumnorm.normalize();
+ ret.row(long(ridx)) = sumnorm;
+ } else { // point lies safely within its triangle
+ Eigen::Vector3d U = p2 - p1;
+ Eigen::Vector3d V = p3 - p1;
+ ret.row(long(ridx)) = U.cross(V).normalized();
+ }
+ });
+
+ return ret;
+}
+
+}} // namespace Slic3r::sla
diff --git a/src/libslic3r/SLA/EigenMesh3D.hpp b/src/libslic3r/SLA/IndexedMesh.hpp
index e8b869bb4..a72492b34 100644
--- a/src/libslic3r/SLA/EigenMesh3D.hpp
+++ b/src/libslic3r/SLA/IndexedMesh.hpp
@@ -1,8 +1,19 @@
-#ifndef SLA_EIGENMESH3D_H
-#define SLA_EIGENMESH3D_H
+#ifndef SLA_INDEXEDMESH_H
+#define SLA_INDEXEDMESH_H
-#include <libslic3r/SLA/Common.hpp>
-#include "libslic3r/SLA/Hollowing.hpp"
+#include <memory>
+#include <vector>
+
+#include <libslic3r/Point.hpp>
+
+// There is an implementation of a hole-aware raycaster that was eventually
+// not used in production version. It is now hidden under following define
+// for possible future use.
+// #define SLIC3R_HOLE_RAYCASTER
+
+#ifdef SLIC3R_HOLE_RAYCASTER
+ #include "libslic3r/SLA/Hollowing.hpp"
+#endif
namespace Slic3r {
@@ -10,60 +21,60 @@ class TriangleMesh;
namespace sla {
-struct Contour3D;
-
-void to_eigen_mesh(const TriangleMesh &mesh, Eigen::MatrixXd &V, Eigen::MatrixXi &F);
-void to_triangle_mesh(const Eigen::MatrixXd &V, const Eigen::MatrixXi &F, TriangleMesh &);
+using PointSet = Eigen::MatrixXd;
/// An index-triangle structure for libIGL functions. Also serves as an
/// alternative (raw) input format for the SLASupportTree.
// Implemented in libslic3r/SLA/Common.cpp
-class EigenMesh3D {
+class IndexedMesh {
class AABBImpl;
- Eigen::MatrixXd m_V;
- Eigen::MatrixXi m_F;
+ const TriangleMesh* m_tm;
double m_ground_level = 0, m_gnd_offset = 0;
std::unique_ptr<AABBImpl> m_aabb;
+#ifdef SLIC3R_HOLE_RAYCASTER
// This holds a copy of holes in the mesh. Initialized externally
// by load_mesh setter.
std::vector<DrainHole> m_holes;
+#endif
public:
- explicit EigenMesh3D(const TriangleMesh&);
- explicit EigenMesh3D(const Contour3D &other);
+ explicit IndexedMesh(const TriangleMesh&);
- EigenMesh3D(const EigenMesh3D& other);
- EigenMesh3D& operator=(const EigenMesh3D&);
+ IndexedMesh(const IndexedMesh& other);
+ IndexedMesh& operator=(const IndexedMesh&);
- EigenMesh3D(EigenMesh3D &&other);
- EigenMesh3D& operator=(EigenMesh3D &&other);
+ IndexedMesh(IndexedMesh &&other);
+ IndexedMesh& operator=(IndexedMesh &&other);
- ~EigenMesh3D();
+ ~IndexedMesh();
inline double ground_level() const { return m_ground_level + m_gnd_offset; }
inline void ground_level_offset(double o) { m_gnd_offset = o; }
inline double ground_level_offset() const { return m_gnd_offset; }
- inline const Eigen::MatrixXd& V() const { return m_V; }
- inline const Eigen::MatrixXi& F() const { return m_F; }
+ const std::vector<Vec3f>& vertices() const;
+ const std::vector<Vec3i>& indices() const;
+ const Vec3f& vertices(size_t idx) const;
+ const Vec3i& indices(size_t idx) const;
// Result of a raycast
class hit_result {
// m_t holds a distance from m_source to the intersection.
double m_t = infty();
- const EigenMesh3D *m_mesh = nullptr;
+ int m_face_id = -1;
+ const IndexedMesh *m_mesh = nullptr;
Vec3d m_dir;
Vec3d m_source;
Vec3d m_normal;
- friend class EigenMesh3D;
+ friend class IndexedMesh;
// A valid object of this class can only be obtained from
- // EigenMesh3D::query_ray_hit method.
- explicit inline hit_result(const EigenMesh3D& em): m_mesh(&em) {}
+ // IndexedMesh::query_ray_hit method.
+ explicit inline hit_result(const IndexedMesh& em): m_mesh(&em) {}
public:
// This denotes no hit on the mesh.
static inline constexpr double infty() { return std::numeric_limits<double>::infinity(); }
@@ -74,8 +85,9 @@ public:
inline const Vec3d& direction() const { return m_dir; }
inline const Vec3d& source() const { return m_source; }
inline Vec3d position() const { return m_source + m_dir * m_t; }
+ inline int face() const { return m_face_id; }
inline bool is_valid() const { return m_mesh != nullptr; }
- inline bool is_hit() const { return !std::isinf(m_t); }
+ inline bool is_hit() const { return m_face_id >= 0 && !std::isinf(m_t); }
inline const Vec3d& normal() const {
assert(is_valid());
@@ -86,48 +98,28 @@ public:
return is_hit() && normal().dot(m_dir) > 0;
}
};
-
+
+#ifdef SLIC3R_HOLE_RAYCASTER
// Inform the object about location of holes
// creates internal copy of the vector
void load_holes(const std::vector<DrainHole>& holes) {
m_holes = holes;
}
+ // Iterates over hits and holes and returns the true hit, possibly
+ // on the inside of a hole.
+ // This function is currently not used anywhere, it was written when the
+ // holes were subtracted on slices, that is, before we started using CGAL
+ // to actually cut the holes into the mesh.
+ hit_result filter_hits(const std::vector<IndexedMesh::hit_result>& obj_hits) const;
+#endif
+
// Casting a ray on the mesh, returns the distance where the hit occures.
hit_result query_ray_hit(const Vec3d &s, const Vec3d &dir) const;
// Casts a ray on the mesh and returns all hits
std::vector<hit_result> query_ray_hits(const Vec3d &s, const Vec3d &dir) const;
- // Iterates over hits and holes and returns the true hit, possibly
- // on the inside of a hole.
- hit_result filter_hits(const std::vector<EigenMesh3D::hit_result>& obj_hits) const;
-
- class si_result {
- double m_value;
- int m_fidx;
- Vec3d m_p;
- si_result(double val, int i, const Vec3d& c):
- m_value(val), m_fidx(i), m_p(c) {}
- friend class EigenMesh3D;
- public:
-
- si_result() = delete;
-
- double value() const { return m_value; }
- operator double() const { return m_value; }
- const Vec3d& point_on_mesh() const { return m_p; }
- int F_idx() const { return m_fidx; }
- };
-
-#ifdef SLIC3R_SLA_NEEDS_WINDTREE
- // The signed distance from a point to the mesh. Outputs the distance,
- // the index of the triangle and the closest point in mesh coordinate space.
- si_result signed_distance(const Vec3d& p) const;
-
- bool inside(const Vec3d& p) const;
-#endif /* SLIC3R_SLA_NEEDS_WINDTREE */
-
double squared_distance(const Vec3d& p, int& i, Vec3d& c) const;
inline double squared_distance(const Vec3d &p) const
{
@@ -136,25 +128,19 @@ public:
return squared_distance(p, i, c);
}
- Vec3d normal_by_face_id(int face_id) const {
- auto trindex = F().row(face_id);
- const Vec3d& p1 = V().row(trindex(0));
- const Vec3d& p2 = V().row(trindex(1));
- const Vec3d& p3 = V().row(trindex(2));
- Eigen::Vector3d U = p2 - p1;
- Eigen::Vector3d V = p3 - p1;
- return U.cross(V).normalized();
- }
+ Vec3d normal_by_face_id(int face_id) const;
+
+ const TriangleMesh * get_triangle_mesh() const { return m_tm; }
};
// Calculate the normals for the selected points (from 'points' set) on the
// mesh. This will call squared distance for each point.
PointSet normals(const PointSet& points,
- const EigenMesh3D& convert_mesh,
+ const IndexedMesh& convert_mesh,
double eps = 0.05, // min distance from edges
std::function<void()> throw_on_cancel = [](){},
const std::vector<unsigned>& selected_points = {});
}} // namespace Slic3r::sla
-#endif // EIGENMESH3D_H
+#endif // INDEXEDMESH_H
diff --git a/src/libslic3r/SLA/JobController.hpp b/src/libslic3r/SLA/JobController.hpp
index 3baa3d12d..b815e4d6f 100644
--- a/src/libslic3r/SLA/JobController.hpp
+++ b/src/libslic3r/SLA/JobController.hpp
@@ -2,6 +2,7 @@
#define SLA_JOBCONTROLLER_HPP
#include <functional>
+#include <string>
namespace Slic3r { namespace sla {
diff --git a/src/libslic3r/SLA/Pad.cpp b/src/libslic3r/SLA/Pad.cpp
index cf1786758..927c32589 100644
--- a/src/libslic3r/SLA/Pad.cpp
+++ b/src/libslic3r/SLA/Pad.cpp
@@ -1,5 +1,4 @@
#include <libslic3r/SLA/Pad.hpp>
-#include <libslic3r/SLA/Common.hpp>
#include <libslic3r/SLA/SpatIndex.hpp>
#include <libslic3r/SLA/BoostAdapter.hpp>
#include <libslic3r/SLA/Contour3D.hpp>
@@ -11,6 +10,8 @@
#include "Tesselate.hpp"
#include "MTUtils.hpp"
+#include "TriangulateWall.hpp"
+
// For debugging:
// #include <fstream>
// #include <libnest2d/tools/benchmark.h>
@@ -27,186 +28,27 @@ namespace Slic3r { namespace sla {
namespace {
-/// This function will return a triangulation of a sheet connecting an upper
-/// and a lower plate given as input polygons. It will not triangulate the
-/// plates themselves only the sheet. The caller has to specify the lower and
-/// upper z levels in world coordinates as well as the offset difference
-/// between the sheets. If the lower_z_mm is higher than upper_z_mm or the
-/// offset difference is negative, the resulting triangle orientation will be
-/// reversed.
-///
-/// IMPORTANT: This is not a universal triangulation algorithm. It assumes
-/// that the lower and upper polygons are offsetted versions of the same
-/// original polygon. In general, it assumes that one of the polygons is
-/// completely inside the other. The offset difference is the reference
-/// distance from the inner polygon's perimeter to the outer polygon's
-/// perimeter. The real distance will be variable as the clipper offset has
-/// different strategies (rounding, etc...). This algorithm should have
-/// O(2n + 3m) complexity where n is the number of upper vertices and m is the
-/// number of lower vertices.
Contour3D walls(
const Polygon &lower,
const Polygon &upper,
double lower_z_mm,
- double upper_z_mm,
- double offset_difference_mm,
- ThrowOnCancel thr = [] {})
+ double upper_z_mm)
{
- Contour3D ret;
-
- if(upper.points.size() < 3 || lower.size() < 3) return ret;
-
- // The concept of the algorithm is relatively simple. It will try to find
- // the closest vertices from the upper and the lower polygon and use those
- // as starting points. Then it will create the triangles sequentially using
- // an edge from the upper polygon and a vertex from the lower or vice versa,
- // depending on the resulting triangle's quality.
- // The quality is measured by a scalar value. So far it looks like it is
- // enough to derive it from the slope of the triangle's two edges connecting
- // the upper and the lower part. A reference slope is calculated from the
- // height and the offset difference.
-
- // Offset in the index array for the ceiling
- const auto offs = upper.points.size();
-
- // Shorthand for the vertex arrays
- auto& upts = upper.points, &lpts = lower.points;
- auto& rpts = ret.points; auto& ind = ret.faces3;
-
- // If the Z levels are flipped, or the offset difference is negative, we
- // will interpret that as the triangles normals should be inverted.
- bool inverted = upper_z_mm < lower_z_mm || offset_difference_mm < 0;
-
- // Copy the points into the mesh, convert them from 2D to 3D
- rpts.reserve(upts.size() + lpts.size());
- ind.reserve(2 * upts.size() + 2 * lpts.size());
- for (auto &p : upts)
- rpts.emplace_back(unscaled(p.x()), unscaled(p.y()), upper_z_mm);
- for (auto &p : lpts)
- rpts.emplace_back(unscaled(p.x()), unscaled(p.y()), lower_z_mm);
-
- // Create pointing indices into vertex arrays. u-upper, l-lower
- size_t uidx = 0, lidx = offs, unextidx = 1, lnextidx = offs + 1;
-
- // Simple squared distance calculation.
- auto distfn = [](const Vec3d& p1, const Vec3d& p2) {
- auto p = p1 - p2; return p.transpose() * p;
- };
-
- // We need to find the closest point on lower polygon to the first point on
- // the upper polygon. These will be our starting points.
- double distmin = std::numeric_limits<double>::max();
- for(size_t l = lidx; l < rpts.size(); ++l) {
- thr();
- double d = distfn(rpts[l], rpts[uidx]);
- if(d < distmin) { lidx = l; distmin = d; }
- }
-
- // Set up lnextidx to be ahead of lidx in cyclic mode
- lnextidx = lidx + 1;
- if(lnextidx == rpts.size()) lnextidx = offs;
-
- // This will be the flip switch to toggle between upper and lower triangle
- // creation mode
- enum class Proceed {
- UPPER, // A segment from the upper polygon and one vertex from the lower
- LOWER // A segment from the lower polygon and one vertex from the upper
- } proceed = Proceed::UPPER;
-
- // Flags to help evaluating loop termination.
- bool ustarted = false, lstarted = false;
-
- // The variables for the fitness values, one for the actual and one for the
- // previous.
- double current_fit = 0, prev_fit = 0;
-
- // Every triangle of the wall has two edges connecting the upper plate with
- // the lower plate. From the length of these two edges and the zdiff we
- // can calculate the momentary squared offset distance at a particular
- // position on the wall. The average of the differences from the reference
- // (squared) offset distance will give us the driving fitness value.
- const double offsdiff2 = std::pow(offset_difference_mm, 2);
- const double zdiff2 = std::pow(upper_z_mm - lower_z_mm, 2);
-
- // Mark the current vertex iterator positions. If the iterators return to
- // the same position, the loop can be terminated.
- size_t uendidx = uidx, lendidx = lidx;
-
- do { thr(); // check throw if canceled
-
- prev_fit = current_fit;
-
- switch(proceed) { // proceed depending on the current state
- case Proceed::UPPER:
- if(!ustarted || uidx != uendidx) { // there are vertices remaining
- // Get the 3D vertices in order
- const Vec3d& p_up1 = rpts[uidx];
- const Vec3d& p_low = rpts[lidx];
- const Vec3d& p_up2 = rpts[unextidx];
-
- // Calculate fitness: the average of the two connecting edges
- double a = offsdiff2 - (distfn(p_up1, p_low) - zdiff2);
- double b = offsdiff2 - (distfn(p_up2, p_low) - zdiff2);
- current_fit = (std::abs(a) + std::abs(b)) / 2;
-
- if(current_fit > prev_fit) { // fit is worse than previously
- proceed = Proceed::LOWER;
- } else { // good to go, create the triangle
- inverted
- ? ind.emplace_back(int(unextidx), int(lidx), int(uidx))
- : ind.emplace_back(int(uidx), int(lidx), int(unextidx));
-
- // Increment the iterators, rotate if necessary
- ++uidx; ++unextidx;
- if(unextidx == offs) unextidx = 0;
- if(uidx == offs) uidx = 0;
-
- ustarted = true; // mark the movement of the iterators
- // so that the comparison to uendidx can be made correctly
- }
- } else proceed = Proceed::LOWER;
-
- break;
- case Proceed::LOWER:
- // Mode with lower segment, upper vertex. Same structure:
- if(!lstarted || lidx != lendidx) {
- const Vec3d& p_low1 = rpts[lidx];
- const Vec3d& p_low2 = rpts[lnextidx];
- const Vec3d& p_up = rpts[uidx];
-
- double a = offsdiff2 - (distfn(p_up, p_low1) - zdiff2);
- double b = offsdiff2 - (distfn(p_up, p_low2) - zdiff2);
- current_fit = (std::abs(a) + std::abs(b)) / 2;
-
- if(current_fit > prev_fit) {
- proceed = Proceed::UPPER;
- } else {
- inverted
- ? ind.emplace_back(int(uidx), int(lnextidx), int(lidx))
- : ind.emplace_back(int(lidx), int(lnextidx), int(uidx));
-
- ++lidx; ++lnextidx;
- if(lnextidx == rpts.size()) lnextidx = offs;
- if(lidx == rpts.size()) lidx = offs;
-
- lstarted = true;
- }
- } else proceed = Proceed::UPPER;
-
- break;
- } // end of switch
- } while(!ustarted || !lstarted || uidx != uendidx || lidx != lendidx);
+ Wall w = triangulate_wall(lower, upper, lower_z_mm, upper_z_mm);
+ Contour3D ret;
+ ret.points = std::move(w.first);
+ ret.faces3 = std::move(w.second);
+
return ret;
}
// Same as walls() but with identical higher and lower polygons.
Contour3D inline straight_walls(const Polygon &plate,
double lo_z,
- double hi_z,
- ThrowOnCancel thr)
+ double hi_z)
{
- return walls(plate, plate, lo_z, hi_z, .0 /*offset_diff*/, thr);
+ return walls(plate, plate, lo_z, hi_z);
}
// Function to cut tiny connector cavities for a given polygon. The input poly
@@ -527,17 +369,15 @@ bool add_cavity(Contour3D &pad, ExPolygon &top_poly, const PadConfig3D &cfg,
if (inner_base.empty() || middle_base.empty()) { logerr(); return false; }
- ExPolygons pdiff = diff_ex(top_poly, middle_base.contour);
+ ExPolygons pdiff = diff_ex((Polygons)top_poly, (Polygons)middle_base.contour);
if (pdiff.size() != 1) { logerr(); return false; }
top_poly = pdiff.front();
double z_min = -cfg.wing_height, z_max = 0;
- double offset_difference = -wing_distance;
- pad.merge(walls(inner_base.contour, middle_base.contour, z_min, z_max,
- offset_difference, thr));
-
+ pad.merge(walls(inner_base.contour, middle_base.contour, z_min, z_max));
+ thr();
pad.merge(triangulate_expolygon_3d(inner_base, z_min, NORMALS_UP));
return true;
@@ -555,17 +395,17 @@ Contour3D create_outer_pad_geometry(const ExPolygons & skeleton,
offset_contour_only(pad_part, -scaled(cfg.bottom_offset()));
if (bottom_poly.empty()) continue;
-
+ thr();
+
double z_min = -cfg.height, z_max = 0;
- ret.merge(walls(top_poly.contour, bottom_poly.contour, z_max, z_min,
- cfg.bottom_offset(), thr));
+ ret.merge(walls(top_poly.contour, bottom_poly.contour, z_max, z_min));
if (cfg.wing_height > 0. && add_cavity(ret, top_poly, cfg, thr))
z_max = -cfg.wing_height;
for (auto &h : bottom_poly.holes)
- ret.merge(straight_walls(h, z_max, z_min, thr));
-
+ ret.merge(straight_walls(h, z_max, z_min));
+
ret.merge(triangulate_expolygon_3d(bottom_poly, z_min, NORMALS_DOWN));
ret.merge(triangulate_expolygon_3d(top_poly, NORMALS_UP));
}
@@ -581,11 +421,12 @@ Contour3D create_inner_pad_geometry(const ExPolygons & skeleton,
double z_max = 0., z_min = -cfg.height;
for (const ExPolygon &pad_part : skeleton) {
- ret.merge(straight_walls(pad_part.contour, z_max, z_min,thr));
+ thr();
+ ret.merge(straight_walls(pad_part.contour, z_max, z_min));
for (auto &h : pad_part.holes)
- ret.merge(straight_walls(h, z_max, z_min, thr));
-
+ ret.merge(straight_walls(h, z_max, z_min));
+
ret.merge(triangulate_expolygon_3d(pad_part, z_min, NORMALS_DOWN));
ret.merge(triangulate_expolygon_3d(pad_part, z_max, NORMALS_UP));
}
diff --git a/src/libslic3r/SLA/Raster.cpp b/src/libslic3r/SLA/Raster.cpp
deleted file mode 100644
index 9b7f1db7d..000000000
--- a/src/libslic3r/SLA/Raster.cpp
+++ /dev/null
@@ -1,320 +0,0 @@
-#ifndef SLARASTER_CPP
-#define SLARASTER_CPP
-
-#include <functional>
-
-#include <libslic3r/SLA/Raster.hpp>
-#include "libslic3r/ExPolygon.hpp"
-#include "libslic3r/MTUtils.hpp"
-#include <libnest2d/backends/clipper/clipper_polygon.hpp>
-
-// For rasterizing
-#include <agg/agg_basics.h>
-#include <agg/agg_rendering_buffer.h>
-#include <agg/agg_pixfmt_gray.h>
-#include <agg/agg_pixfmt_rgb.h>
-#include <agg/agg_renderer_base.h>
-#include <agg/agg_renderer_scanline.h>
-
-#include <agg/agg_scanline_p.h>
-#include <agg/agg_rasterizer_scanline_aa.h>
-#include <agg/agg_path_storage.h>
-
-// Experimental minz image write:
-#include <miniz.h>
-
-namespace Slic3r {
-
-inline const Polygon& contour(const ExPolygon& p) { return p.contour; }
-inline const ClipperLib::Path& contour(const ClipperLib::Polygon& p) { return p.Contour; }
-
-inline const Polygons& holes(const ExPolygon& p) { return p.holes; }
-inline const ClipperLib::Paths& holes(const ClipperLib::Polygon& p) { return p.Holes; }
-
-namespace sla {
-
-const Raster::TMirroring Raster::NoMirror = {false, false};
-const Raster::TMirroring Raster::MirrorX = {true, false};
-const Raster::TMirroring Raster::MirrorY = {false, true};
-const Raster::TMirroring Raster::MirrorXY = {true, true};
-
-
-using TPixelRenderer = agg::pixfmt_gray8; // agg::pixfmt_rgb24;
-using TRawRenderer = agg::renderer_base<TPixelRenderer>;
-using TPixel = TPixelRenderer::color_type;
-using TRawBuffer = agg::rendering_buffer;
-using TBuffer = std::vector<TPixelRenderer::pixel_type>;
-
-using TRendererAA = agg::renderer_scanline_aa_solid<TRawRenderer>;
-
-class Raster::Impl {
-public:
-
- static const TPixel ColorWhite;
- static const TPixel ColorBlack;
-
- using Format = Raster::RawData;
-
-private:
- Raster::Resolution m_resolution;
- Raster::PixelDim m_pxdim_scaled; // used for scaled coordinate polygons
- TBuffer m_buf;
- TRawBuffer m_rbuf;
- TPixelRenderer m_pixfmt;
- TRawRenderer m_raw_renderer;
- TRendererAA m_renderer;
-
- std::function<double(double)> m_gammafn;
- Trafo m_trafo;
-
- inline void flipy(agg::path_storage& path) const {
- path.flip_y(0, double(m_resolution.height_px));
- }
-
- inline void flipx(agg::path_storage& path) const {
- path.flip_x(0, double(m_resolution.width_px));
- }
-
-public:
- inline Impl(const Raster::Resolution & res,
- const Raster::PixelDim & pd,
- const Trafo &trafo)
- : m_resolution(res)
- , m_pxdim_scaled(SCALING_FACTOR / pd.w_mm, SCALING_FACTOR / pd.h_mm)
- , m_buf(res.pixels())
- , m_rbuf(reinterpret_cast<TPixelRenderer::value_type *>(m_buf.data()),
- unsigned(res.width_px),
- unsigned(res.height_px),
- int(res.width_px * TPixelRenderer::num_components))
- , m_pixfmt(m_rbuf)
- , m_raw_renderer(m_pixfmt)
- , m_renderer(m_raw_renderer)
- , m_trafo(trafo)
- {
- m_renderer.color(ColorWhite);
-
- if (trafo.gamma > 0) m_gammafn = agg::gamma_power(trafo.gamma);
- else m_gammafn = agg::gamma_threshold(0.5);
-
- clear();
- }
-
- template<class P> void draw(const P &poly) {
- agg::rasterizer_scanline_aa<> ras;
- agg::scanline_p8 scanlines;
-
- ras.gamma(m_gammafn);
-
- ras.add_path(to_path(contour(poly)));
- for(auto& h : holes(poly)) ras.add_path(to_path(h));
-
- agg::render_scanlines(ras, scanlines, m_renderer);
- }
-
- inline void clear() {
- m_raw_renderer.clear(ColorBlack);
- }
-
- inline TBuffer& buffer() { return m_buf; }
- inline const TBuffer& buffer() const { return m_buf; }
-
-
- inline const Raster::Resolution resolution() { return m_resolution; }
- inline const Raster::PixelDim pixdim()
- {
- return {SCALING_FACTOR / m_pxdim_scaled.w_mm,
- SCALING_FACTOR / m_pxdim_scaled.h_mm};
- }
-
-private:
- inline double getPx(const Point& p) {
- return p(0) * m_pxdim_scaled.w_mm;
- }
-
- inline double getPy(const Point& p) {
- return p(1) * m_pxdim_scaled.h_mm;
- }
-
- inline agg::path_storage to_path(const Polygon& poly)
- {
- return to_path(poly.points);
- }
-
- inline double getPx(const ClipperLib::IntPoint& p) {
- return p.X * m_pxdim_scaled.w_mm;
- }
-
- inline double getPy(const ClipperLib::IntPoint& p) {
- return p.Y * m_pxdim_scaled.h_mm;
- }
-
- template<class PointVec> agg::path_storage _to_path(const PointVec& v)
- {
- agg::path_storage path;
-
- auto it = v.begin();
- path.move_to(getPx(*it), getPy(*it));
- while(++it != v.end()) path.line_to(getPx(*it), getPy(*it));
- path.line_to(getPx(v.front()), getPy(v.front()));
-
- return path;
- }
-
- template<class PointVec> agg::path_storage _to_path_flpxy(const PointVec& v)
- {
- agg::path_storage path;
-
- auto it = v.begin();
- path.move_to(getPy(*it), getPx(*it));
- while(++it != v.end()) path.line_to(getPy(*it), getPx(*it));
- path.line_to(getPy(v.front()), getPx(v.front()));
-
- return path;
- }
-
- template<class PointVec> agg::path_storage to_path(const PointVec &v)
- {
- auto path = m_trafo.flipXY ? _to_path_flpxy(v) : _to_path(v);
-
- path.translate_all_paths(m_trafo.origin_x * m_pxdim_scaled.w_mm,
- m_trafo.origin_y * m_pxdim_scaled.h_mm);
-
- if(m_trafo.mirror_x) flipx(path);
- if(m_trafo.mirror_y) flipy(path);
-
- return path;
- }
-
-};
-
-const TPixel Raster::Impl::ColorWhite = TPixel(255);
-const TPixel Raster::Impl::ColorBlack = TPixel(0);
-
-Raster::Raster() { reset(); }
-
-Raster::Raster(const Raster::Resolution &r,
- const Raster::PixelDim & pd,
- const Raster::Trafo & tr)
-{
- reset(r, pd, tr);
-}
-
-Raster::~Raster() = default;
-
-Raster::Raster(Raster &&m) = default;
-Raster &Raster::operator=(Raster &&) = default;
-
-void Raster::reset(const Raster::Resolution &r, const Raster::PixelDim &pd,
- const Trafo &trafo)
-{
- m_impl.reset();
- m_impl.reset(new Impl(r, pd, trafo));
-}
-
-void Raster::reset()
-{
- m_impl.reset();
-}
-
-Raster::Resolution Raster::resolution() const
-{
- if (m_impl) return m_impl->resolution();
-
- return Resolution{0, 0};
-}
-
-Raster::PixelDim Raster::pixel_dimensions() const
-{
- if (m_impl) return m_impl->pixdim();
-
- return PixelDim{0., 0.};
-}
-
-void Raster::clear()
-{
- assert(m_impl);
- m_impl->clear();
-}
-
-void Raster::draw(const ExPolygon &expoly)
-{
- assert(m_impl);
- m_impl->draw(expoly);
-}
-
-void Raster::draw(const ClipperLib::Polygon &poly)
-{
- assert(m_impl);
- m_impl->draw(poly);
-}
-
-uint8_t Raster::read_pixel(size_t x, size_t y) const
-{
- assert (m_impl);
- TPixel::value_type px;
- m_impl->buffer()[y * resolution().width_px + x].get(px);
- return px;
-}
-
-PNGImage & PNGImage::serialize(const Raster &raster)
-{
- size_t s = 0;
- m_buffer.clear();
-
- void *rawdata = tdefl_write_image_to_png_file_in_memory(
- get_internals(raster).buffer().data(),
- int(raster.resolution().width_px),
- int(raster.resolution().height_px), 1, &s);
-
- // On error, data() will return an empty vector. No other info can be
- // retrieved from miniz anyway...
- if (rawdata == nullptr) return *this;
-
- auto ptr = static_cast<std::uint8_t*>(rawdata);
-
- m_buffer.reserve(s);
- std::copy(ptr, ptr + s, std::back_inserter(m_buffer));
-
- MZ_FREE(rawdata);
- return *this;
-}
-
-std::ostream &operator<<(std::ostream &stream, const Raster::RawData &bytes)
-{
- stream.write(reinterpret_cast<const char *>(bytes.data()),
- std::streamsize(bytes.size()));
-
- return stream;
-}
-
-Raster::RawData::~RawData() = default;
-
-PPMImage & PPMImage::serialize(const Raster &raster)
-{
- auto header = std::string("P5 ") +
- std::to_string(raster.resolution().width_px) + " " +
- std::to_string(raster.resolution().height_px) + " " + "255 ";
-
- const auto &impl = get_internals(raster);
- auto sz = impl.buffer().size() * sizeof(TBuffer::value_type);
- size_t s = sz + header.size();
-
- m_buffer.clear();
- m_buffer.reserve(s);
-
- auto buff = reinterpret_cast<const std::uint8_t*>(impl.buffer().data());
- std::copy(header.begin(), header.end(), std::back_inserter(m_buffer));
- std::copy(buff, buff+sz, std::back_inserter(m_buffer));
-
- return *this;
-}
-
-const Raster::Impl &Raster::RawData::get_internals(const Raster &raster)
-{
- return *raster.m_impl;
-}
-
-} // namespace sla
-} // namespace Slic3r
-
-#endif // SLARASTER_CPP
diff --git a/src/libslic3r/SLA/Raster.hpp b/src/libslic3r/SLA/Raster.hpp
deleted file mode 100644
index 4d76b3290..000000000
--- a/src/libslic3r/SLA/Raster.hpp
+++ /dev/null
@@ -1,157 +0,0 @@
-#ifndef SLA_RASTER_HPP
-#define SLA_RASTER_HPP
-
-#include <ostream>
-#include <memory>
-#include <vector>
-#include <array>
-#include <utility>
-#include <cstdint>
-
-#include <libslic3r/ExPolygon.hpp>
-
-namespace ClipperLib { struct Polygon; }
-
-namespace Slic3r {
-namespace sla {
-
-/**
- * @brief Raster captures an anti-aliased monochrome canvas where vectorial
- * polygons can be rasterized. Fill color is always white and the background is
- * black. Contours are anti-aliased.
- *
- * It also supports saving the raster data into a standard output stream in raw
- * or PNG format.
- */
-class Raster {
- class Impl;
- std::unique_ptr<Impl> m_impl;
-public:
-
- // Raw byte buffer paired with its size. Suitable for compressed image data.
- class RawData
- {
- protected:
- std::vector<std::uint8_t> m_buffer;
- const Impl& get_internals(const Raster& raster);
- public:
- RawData() = default;
- RawData(std::vector<std::uint8_t>&& data): m_buffer(std::move(data)) {}
- virtual ~RawData();
-
- RawData(const RawData &) = delete;
- RawData &operator=(const RawData &) = delete;
-
- RawData(RawData &&) = default;
- RawData &operator=(RawData &&) = default;
-
- size_t size() const { return m_buffer.size(); }
- const uint8_t * data() const { return m_buffer.data(); }
-
- virtual RawData& serialize(const Raster &/*raster*/) { return *this; }
- virtual std::string get_file_extension() const = 0;
- };
-
- /// Type that represents a resolution in pixels.
- struct Resolution {
- size_t width_px;
- size_t height_px;
-
- inline Resolution(size_t w = 0, size_t h = 0)
- : width_px(w), height_px(h)
- {}
-
- inline size_t pixels() const { return width_px * height_px; }
- };
-
- /// Types that represents the dimension of a pixel in millimeters.
- struct PixelDim {
- double w_mm;
- double h_mm;
- inline PixelDim(double px_width_mm = 0.0, double px_height_mm = 0.0):
- w_mm(px_width_mm), h_mm(px_height_mm) {}
- };
-
- enum Orientation { roLandscape, roPortrait };
-
- using TMirroring = std::array<bool, 2>;
- static const TMirroring NoMirror;
- static const TMirroring MirrorX;
- static const TMirroring MirrorY;
- static const TMirroring MirrorXY;
-
- struct Trafo {
- bool mirror_x = false, mirror_y = false, flipXY = false;
- coord_t origin_x = 0, origin_y = 0;
-
- // If gamma is zero, thresholding will be performed which disables AA.
- double gamma = 1.;
-
- // Portrait orientation will make sure the drawed polygons are rotated
- // by 90 degrees.
- Trafo(Orientation o = roLandscape, const TMirroring &mirror = NoMirror)
- // XY flipping implicitly does an X mirror
- : mirror_x(o == roPortrait ? !mirror[0] : mirror[0])
- , mirror_y(!mirror[1]) // Makes raster origin to be top left corner
- , flipXY(o == roPortrait)
- {}
- };
-
- Raster();
- Raster(const Resolution &r,
- const PixelDim & pd,
- const Trafo & tr = {});
-
- Raster(const Raster& cpy) = delete;
- Raster& operator=(const Raster& cpy) = delete;
- Raster(Raster&& m);
- Raster& operator=(Raster&&);
- ~Raster();
-
- /// Reallocated everything for the given resolution and pixel dimension.
- void reset(const Resolution& r,
- const PixelDim& pd,
- const Trafo &tr = {});
-
- /**
- * Release the allocated resources. Drawing in this state ends in
- * unspecified behavior.
- */
- void reset();
-
- /// Get the resolution of the raster.
- Resolution resolution() const;
- PixelDim pixel_dimensions() const;
-
- /// Clear the raster with black color.
- void clear();
-
- /// Draw a polygon with holes.
- void draw(const ExPolygon& poly);
- void draw(const ClipperLib::Polygon& poly);
-
- uint8_t read_pixel(size_t w, size_t h) const;
-
- inline bool empty() const { return ! bool(m_impl); }
-
-};
-
-class PNGImage: public Raster::RawData {
-public:
- PNGImage& serialize(const Raster &raster) override;
- std::string get_file_extension() const override { return "png"; }
-};
-
-class PPMImage: public Raster::RawData {
-public:
- PPMImage& serialize(const Raster &raster) override;
- std::string get_file_extension() const override { return "ppm"; }
-};
-
-std::ostream& operator<<(std::ostream &stream, const Raster::RawData &bytes);
-
-} // sla
-} // Slic3r
-
-
-#endif // SLARASTER_HPP
diff --git a/src/libslic3r/SLA/RasterBase.cpp b/src/libslic3r/SLA/RasterBase.cpp
new file mode 100644
index 000000000..581e84880
--- /dev/null
+++ b/src/libslic3r/SLA/RasterBase.cpp
@@ -0,0 +1,89 @@
+#ifndef SLARASTER_CPP
+#define SLARASTER_CPP
+
+#include <functional>
+
+#include <libslic3r/SLA/RasterBase.hpp>
+#include <libslic3r/SLA/AGGRaster.hpp>
+
+// minz image write:
+#include <miniz.h>
+
+namespace Slic3r { namespace sla {
+
+const RasterBase::TMirroring RasterBase::NoMirror = {false, false};
+const RasterBase::TMirroring RasterBase::MirrorX = {true, false};
+const RasterBase::TMirroring RasterBase::MirrorY = {false, true};
+const RasterBase::TMirroring RasterBase::MirrorXY = {true, true};
+
+EncodedRaster PNGRasterEncoder::operator()(const void *ptr, size_t w, size_t h,
+ size_t num_components)
+{
+ std::vector<uint8_t> buf;
+ size_t s = 0;
+
+ void *rawdata = tdefl_write_image_to_png_file_in_memory(
+ ptr, int(w), int(h), int(num_components), &s);
+
+ // On error, data() will return an empty vector. No other info can be
+ // retrieved from miniz anyway...
+ if (rawdata == nullptr) return EncodedRaster({}, "png");
+
+ auto pptr = static_cast<std::uint8_t*>(rawdata);
+
+ buf.reserve(s);
+ std::copy(pptr, pptr + s, std::back_inserter(buf));
+
+ MZ_FREE(rawdata);
+ return EncodedRaster(std::move(buf), "png");
+}
+
+std::ostream &operator<<(std::ostream &stream, const EncodedRaster &bytes)
+{
+ stream.write(reinterpret_cast<const char *>(bytes.data()),
+ std::streamsize(bytes.size()));
+
+ return stream;
+}
+
+EncodedRaster PPMRasterEncoder::operator()(const void *ptr, size_t w, size_t h,
+ size_t num_components)
+{
+ std::vector<uint8_t> buf;
+
+ auto header = std::string("P5 ") +
+ std::to_string(w) + " " +
+ std::to_string(h) + " " + "255 ";
+
+ auto sz = w * h * num_components;
+ size_t s = sz + header.size();
+
+ buf.reserve(s);
+
+ auto buff = reinterpret_cast<const std::uint8_t*>(ptr);
+ std::copy(header.begin(), header.end(), std::back_inserter(buf));
+ std::copy(buff, buff+sz, std::back_inserter(buf));
+
+ return EncodedRaster(std::move(buf), "ppm");
+}
+
+std::unique_ptr<RasterBase> create_raster_grayscale_aa(
+ const RasterBase::Resolution &res,
+ const RasterBase::PixelDim & pxdim,
+ double gamma,
+ const RasterBase::Trafo & tr)
+{
+ std::unique_ptr<RasterBase> rst;
+
+ if (gamma > 0)
+ rst = std::make_unique<RasterGrayscaleAAGammaPower>(res, pxdim, tr, gamma);
+ else
+ rst = std::make_unique<RasterGrayscaleAA>(res, pxdim, tr, agg::gamma_threshold(.5));
+
+ return rst;
+}
+
+} // namespace sla
+} // namespace Slic3r
+
+#endif // SLARASTER_CPP
diff --git a/src/libslic3r/SLA/RasterBase.hpp b/src/libslic3r/SLA/RasterBase.hpp
new file mode 100644
index 000000000..431c731a6
--- /dev/null
+++ b/src/libslic3r/SLA/RasterBase.hpp
@@ -0,0 +1,124 @@
+#ifndef SLA_RASTERBASE_HPP
+#define SLA_RASTERBASE_HPP
+
+#include <ostream>
+#include <memory>
+#include <vector>
+#include <array>
+#include <utility>
+#include <cstdint>
+
+#include <libslic3r/ExPolygon.hpp>
+#include <libslic3r/SLA/Concurrency.hpp>
+
+namespace ClipperLib { struct Polygon; }
+
+namespace Slic3r {
+
+template<class T> using uqptr = std::unique_ptr<T>;
+template<class T> using shptr = std::shared_ptr<T>;
+template<class T> using wkptr = std::weak_ptr<T>;
+
+namespace sla {
+
+// Raw byte buffer paired with its size. Suitable for compressed image data.
+class EncodedRaster {
+protected:
+ std::vector<uint8_t> m_buffer;
+ std::string m_ext;
+public:
+ EncodedRaster() = default;
+ explicit EncodedRaster(std::vector<uint8_t> &&buf, std::string ext)
+ : m_buffer(std::move(buf)), m_ext(std::move(ext))
+ {}
+
+ size_t size() const { return m_buffer.size(); }
+ const void * data() const { return m_buffer.data(); }
+ const char * extension() const { return m_ext.c_str(); }
+};
+
+using RasterEncoder =
+ std::function<EncodedRaster(const void *ptr, size_t w, size_t h, size_t num_components)>;
+
+class RasterBase {
+public:
+
+ enum Orientation { roLandscape, roPortrait };
+
+ using TMirroring = std::array<bool, 2>;
+ static const TMirroring NoMirror;
+ static const TMirroring MirrorX;
+ static const TMirroring MirrorY;
+ static const TMirroring MirrorXY;
+
+ struct Trafo {
+ bool mirror_x = false, mirror_y = false, flipXY = false;
+ coord_t center_x = 0, center_y = 0;
+
+ // Portrait orientation will make sure the drawed polygons are rotated
+ // by 90 degrees.
+ Trafo(Orientation o = roLandscape, const TMirroring &mirror = NoMirror)
+ // XY flipping implicitly does an X mirror
+ : mirror_x(o == roPortrait ? !mirror[0] : mirror[0])
+ , mirror_y(!mirror[1]) // Makes raster origin to be top left corner
+ , flipXY(o == roPortrait)
+ {}
+
+ TMirroring get_mirror() const { return { (roPortrait ? !mirror_x : mirror_x), mirror_y}; }
+ Orientation get_orientation() const { return flipXY ? roPortrait : roLandscape; }
+ Point get_center() const { return {center_x, center_y}; }
+ };
+
+ /// Type that represents a resolution in pixels.
+ struct Resolution {
+ size_t width_px = 0;
+ size_t height_px = 0;
+
+ Resolution(size_t w = 0, size_t h = 0) : width_px(w), height_px(h) {}
+ size_t pixels() const { return width_px * height_px; }
+ };
+
+ /// Types that represents the dimension of a pixel in millimeters.
+ struct PixelDim {
+ double w_mm = 0.;
+ double h_mm = 0.;
+
+ PixelDim(double px_width_mm = 0.0, double px_height_mm = 0.0)
+ : w_mm(px_width_mm), h_mm(px_height_mm)
+ {}
+ };
+
+ virtual ~RasterBase() = default;
+
+ /// Draw a polygon with holes.
+ virtual void draw(const ExPolygon& poly) = 0;
+ virtual void draw(const ClipperLib::Polygon& poly) = 0;
+
+ /// Get the resolution of the raster.
+ virtual Resolution resolution() const = 0;
+ virtual PixelDim pixel_dimensions() const = 0;
+ virtual Trafo trafo() const = 0;
+
+ virtual EncodedRaster encode(RasterEncoder encoder) const = 0;
+};
+
+struct PNGRasterEncoder {
+ EncodedRaster operator()(const void *ptr, size_t w, size_t h, size_t num_components);
+};
+
+struct PPMRasterEncoder {
+ EncodedRaster operator()(const void *ptr, size_t w, size_t h, size_t num_components);
+};
+
+std::ostream& operator<<(std::ostream &stream, const EncodedRaster &bytes);
+
+// If gamma is zero, thresholding will be performed which disables AA.
+uqptr<RasterBase> create_raster_grayscale_aa(
+ const RasterBase::Resolution &res,
+ const RasterBase::PixelDim & pxdim,
+ double gamma = 1.0,
+ const RasterBase::Trafo & tr = {});
+
+}} // namespace Slic3r::sla
+
+#endif // SLARASTERBASE_HPP
diff --git a/src/libslic3r/SLA/RasterToPolygons.cpp b/src/libslic3r/SLA/RasterToPolygons.cpp
new file mode 100644
index 000000000..cd84a3cb4
--- /dev/null
+++ b/src/libslic3r/SLA/RasterToPolygons.cpp
@@ -0,0 +1,91 @@
+#include "RasterToPolygons.hpp"
+
+#include "AGGRaster.hpp"
+#include "libslic3r/MarchingSquares.hpp"
+#include "MTUtils.hpp"
+#include "ClipperUtils.hpp"
+
+namespace marchsq {
+
+// Specialize this struct to register a raster type for the Marching squares alg
+template<> struct _RasterTraits<Slic3r::sla::RasterGrayscaleAA> {
+ using Rst = Slic3r::sla::RasterGrayscaleAA;
+
+ // The type of pixel cell in the raster
+ using ValueType = uint8_t;
+
+ // Value at a given position
+ static uint8_t get(const Rst &rst, size_t row, size_t col) { return rst.read_pixel(col, row); }
+
+ // Number of rows and cols of the raster
+ static size_t rows(const Rst &rst) { return rst.resolution().height_px; }
+ static size_t cols(const Rst &rst) { return rst.resolution().width_px; }
+};
+
+} // namespace Slic3r::marchsq
+
+namespace Slic3r { namespace sla {
+
+template<class Fn> void foreach_vertex(ExPolygon &poly, Fn &&fn)
+{
+ for (auto &p : poly.contour.points) fn(p);
+ for (auto &h : poly.holes)
+ for (auto &p : h.points) fn(p);
+}
+
+ExPolygons raster_to_polygons(const RasterGrayscaleAA &rst, Vec2i windowsize)
+{
+ size_t rows = rst.resolution().height_px, cols = rst.resolution().width_px;
+
+ if (rows < 2 || cols < 2) return {};
+
+ Polygons polys;
+ long w_rows = std::max(2l, long(windowsize.y()));
+ long w_cols = std::max(2l, long(windowsize.x()));
+
+ std::vector<marchsq::Ring> rings =
+ marchsq::execute(rst, 128, {w_rows, w_cols});
+
+ polys.reserve(rings.size());
+
+ auto pxd = rst.pixel_dimensions();
+ pxd.w_mm = (rst.resolution().width_px * pxd.w_mm) / (rst.resolution().width_px - 1);
+ pxd.h_mm = (rst.resolution().height_px * pxd.h_mm) / (rst.resolution().height_px - 1);
+
+ for (const marchsq::Ring &ring : rings) {
+ Polygon poly; Points &pts = poly.points;
+ pts.reserve(ring.size());
+
+ for (const marchsq::Coord &crd : ring)
+ pts.emplace_back(scaled(crd.c * pxd.w_mm), scaled(crd.r * pxd.h_mm));
+
+ polys.emplace_back(poly);
+ }
+
+ // reverse the raster transformations
+ ExPolygons unioned = union_ex(polys);
+ coord_t width = scaled(cols * pxd.h_mm), height = scaled(rows * pxd.w_mm);
+
+ auto tr = rst.trafo();
+ for (ExPolygon &expoly : unioned) {
+ if (tr.mirror_y)
+ foreach_vertex(expoly, [height](Point &p) {p.y() = height - p.y(); });
+
+ if (tr.mirror_x)
+ foreach_vertex(expoly, [width](Point &p) {p.x() = width - p.x(); });
+
+ expoly.translate(-tr.center_x, -tr.center_y);
+
+ if (tr.flipXY)
+ foreach_vertex(expoly, [](Point &p) { std::swap(p.x(), p.y()); });
+
+ if ((tr.mirror_x + tr.mirror_y + tr.flipXY) % 2) {
+ expoly.contour.reverse();
+ for (auto &h : expoly.holes) h.reverse();
+ }
+ }
+
+ return unioned;
+}
+
+}} // namespace Slic3r
diff --git a/src/libslic3r/SLA/RasterToPolygons.hpp b/src/libslic3r/SLA/RasterToPolygons.hpp
new file mode 100644
index 000000000..c0e1f4114
--- /dev/null
+++ b/src/libslic3r/SLA/RasterToPolygons.hpp
@@ -0,0 +1,15 @@
+#ifndef RASTERTOPOLYGONS_HPP
+#define RASTERTOPOLYGONS_HPP
+
+#include "libslic3r/ExPolygon.hpp"
+
+namespace Slic3r {
+namespace sla {
+
+class RasterGrayscaleAA;
+
+ExPolygons raster_to_polygons(const RasterGrayscaleAA &rst, Vec2i windowsize = {2, 2});
+
+}} // namespace Slic3r::sla
+
+#endif // RASTERTOPOLYGONS_HPP
diff --git a/src/libslic3r/SLA/RasterWriter.cpp b/src/libslic3r/SLA/RasterWriter.cpp
deleted file mode 100644
index 13aef7d8a..000000000
--- a/src/libslic3r/SLA/RasterWriter.cpp
+++ /dev/null
@@ -1,151 +0,0 @@
-#include <string_view>
-
-#include <libslic3r/SLA/RasterWriter.hpp>
-
-#include "libslic3r/PrintConfig.hpp"
-#include <libslic3r/Zipper.hpp>
-#include <libslic3r/Time.hpp>
-
-#include "ExPolygon.hpp"
-#include <libnest2d/backends/clipper/clipper_polygon.hpp>
-
-#include <boost/log/trivial.hpp>
-#include <boost/filesystem/path.hpp>
-
-namespace Slic3r { namespace sla {
-
-void RasterWriter::write_ini(const std::map<std::string, std::string> &m, std::string &ini)
-{
- for (auto &param : m) ini += param.first + " = " + param.second + "\n";
-}
-
-std::string RasterWriter::create_ini_content(const std::string& projectname) const
-{
- std::string out("action = print\njobDir = ");
- out += projectname + "\n";
- write_ini(m_config, out);
- return out;
-}
-
-RasterWriter::RasterWriter(const Raster::Resolution &res,
- const Raster::PixelDim & pixdim,
- const Raster::Trafo & trafo,
- double gamma)
- : m_res(res), m_pxdim(pixdim), m_trafo(trafo), m_gamma(gamma)
-{}
-
-void RasterWriter::save(const std::string &fpath, const std::string &prjname)
-{
- try {
- Zipper zipper(fpath); // zipper with no compression
- save(zipper, prjname);
- zipper.finalize();
- } catch(std::exception& e) {
- BOOST_LOG_TRIVIAL(error) << e.what();
- // Rethrow the exception
- throw;
- }
-}
-
-void RasterWriter::save(Zipper &zipper, const std::string &prjname)
-{
- try {
- std::string project =
- prjname.empty() ?
- boost::filesystem::path(zipper.get_filename()).stem().string() :
- prjname;
-
- zipper.add_entry("config.ini");
-
- zipper << create_ini_content(project);
-
- zipper.add_entry("prusaslicer.ini");
- std::string prusaslicer_ini;
- write_ini(m_slicer_config, prusaslicer_ini);
- zipper << prusaslicer_ini;
-
- for(unsigned i = 0; i < m_layers_rst.size(); i++)
- {
- if(m_layers_rst[i].rawbytes.size() > 0) {
- char lyrnum[6];
- std::sprintf(lyrnum, "%.5d", i);
- auto zfilename = project + lyrnum + ".png";
-
- // Add binary entry to the zipper
- zipper.add_entry(zfilename,
- m_layers_rst[i].rawbytes.data(),
- m_layers_rst[i].rawbytes.size());
- }
- }
- } catch(std::exception& e) {
- BOOST_LOG_TRIVIAL(error) << e.what();
- // Rethrow the exception
- throw;
- }
-}
-
-namespace {
-
-std::string get_cfg_value(const DynamicPrintConfig &cfg, const std::string &key)
-{
- std::string ret;
-
- if (cfg.has(key)) {
- auto opt = cfg.option(key);
- if (opt) ret = opt->serialize();
- }
-
- return ret;
-}
-
-void append_full_config(const DynamicPrintConfig &cfg, std::map<std::string, std::string> &keys)
-{
- using namespace std::literals::string_view_literals;
-
- // Sorted list of config keys, which shall not be stored into the ini.
- static constexpr auto banned_keys = {
- "compatible_printers"sv,
- "compatible_prints"sv,
- "print_host"sv,
- "printhost_apikey"sv,
- "printhost_cafile"sv
- };
-
- assert(std::is_sorted(banned_keys.begin(), banned_keys.end()));
- auto is_banned = [](const std::string &key) {
- return std::binary_search(banned_keys.begin(), banned_keys.end(), key);
- };
-
- for (const std::string &key : cfg.keys())
- if (! is_banned(key) && ! cfg.option(key)->is_nil())
- keys[key] = cfg.opt_serialize(key);
-}
-
-} // namespace
-
-void RasterWriter::set_config(const DynamicPrintConfig &cfg)
-{
- m_config["layerHeight"] = get_cfg_value(cfg, "layer_height");
- m_config["expTime"] = get_cfg_value(cfg, "exposure_time");
- m_config["expTimeFirst"] = get_cfg_value(cfg, "initial_exposure_time");
- m_config["materialName"] = get_cfg_value(cfg, "sla_material_settings_id");
- m_config["printerModel"] = get_cfg_value(cfg, "printer_model");
- m_config["printerVariant"] = get_cfg_value(cfg, "printer_variant");
- m_config["printerProfile"] = get_cfg_value(cfg, "printer_settings_id");
- m_config["printProfile"] = get_cfg_value(cfg, "sla_print_settings_id");
- m_config["fileCreationTimestamp"] = Utils::utc_timestamp();
- m_config["prusaSlicerVersion"] = SLIC3R_BUILD_ID;
- append_full_config(cfg, m_slicer_config);
-}
-
-void RasterWriter::set_statistics(const PrintStatistics &stats)
-{
- m_config["usedMaterial"] = std::to_string(stats.used_material);
- m_config["numFade"] = std::to_string(stats.num_fade);
- m_config["numSlow"] = std::to_string(stats.num_slow);
- m_config["numFast"] = std::to_string(stats.num_fast);
- m_config["printTime"] = std::to_string(stats.estimated_print_time_s);
-}
-
-} // namespace sla
-} // namespace Slic3r
diff --git a/src/libslic3r/SLA/RasterWriter.hpp b/src/libslic3r/SLA/RasterWriter.hpp
deleted file mode 100644
index 75162893d..000000000
--- a/src/libslic3r/SLA/RasterWriter.hpp
+++ /dev/null
@@ -1,130 +0,0 @@
-#ifndef SLA_RASTERWRITER_HPP
-#define SLA_RASTERWRITER_HPP
-
-// For png export of the sliced model
-#include <fstream>
-#include <string>
-#include <sstream>
-#include <vector>
-#include <map>
-#include <array>
-
-#include <libslic3r/SLA/Raster.hpp>
-#include <libslic3r/Zipper.hpp>
-
-namespace Slic3r {
-
-class DynamicPrintConfig;
-
-namespace sla {
-
-// API to write the zipped sla output layers and metadata.
-// Implementation uses PNG raster output.
-// Be aware that if a large number of layers are allocated, it can very well
-// exhaust the available memory especially on 32 bit platform.
-// This class is designed to be used in parallel mode. Layers have an ID and
-// each layer can be written and compressed independently (in parallel).
-// At the end when all layers where written, the save method can be used to
-// write out the result into a zipped archive.
-class RasterWriter
-{
-public:
-
- // Used for addressing parameters of set_statistics()
- struct PrintStatistics
- {
- double used_material = 0.;
- double estimated_print_time_s = 0.;
- size_t num_fade = 0;
- size_t num_slow = 0;
- size_t num_fast = 0;
- };
-
-private:
-
- // A struct to bind the raster image data and its compressed bytes together.
- struct Layer {
- Raster raster;
- PNGImage rawbytes;
-
- Layer() = default;
-
- // The image is big, do not copy by accident
- Layer(const Layer&) = delete;
- Layer& operator=(const Layer&) = delete;
-
- Layer(Layer &&m) = default;
- Layer &operator=(Layer &&) = default;
- };
-
- // We will save the compressed PNG data into RawBytes type buffers in
- // parallel. Later we can write every layer to the disk sequentially.
- std::vector<Layer> m_layers_rst;
- Raster::Resolution m_res;
- Raster::PixelDim m_pxdim;
- Raster::Trafo m_trafo;
- double m_gamma;
-
- std::map<std::string, std::string> m_config;
- std::map<std::string, std::string> m_slicer_config;
-
- static void write_ini(const std::map<std::string, std::string> &m, std::string &ini);
- std::string create_ini_content(const std::string& projectname) const;
-
-public:
-
- // SLARasterWriter is using Raster in custom mirroring mode
- RasterWriter(const Raster::Resolution &res,
- const Raster::PixelDim & pixdim,
- const Raster::Trafo & trafo,
- double gamma = 1.);
-
- RasterWriter(const RasterWriter& ) = delete;
- RasterWriter& operator=(const RasterWriter&) = delete;
- RasterWriter(RasterWriter&& m) = default;
- RasterWriter& operator=(RasterWriter&&) = default;
-
- inline void layers(unsigned cnt) { if(cnt > 0) m_layers_rst.resize(cnt); }
- inline unsigned layers() const { return unsigned(m_layers_rst.size()); }
-
- template<class Poly> void draw_polygon(const Poly& p, unsigned lyr)
- {
- assert(lyr < m_layers_rst.size());
- m_layers_rst[lyr].raster.draw(p);
- }
-
- inline void begin_layer(unsigned lyr) {
- if(m_layers_rst.size() <= lyr) m_layers_rst.resize(lyr+1);
- m_layers_rst[lyr].raster.reset(m_res, m_pxdim, m_trafo);
- }
-
- inline void begin_layer() {
- m_layers_rst.emplace_back();
- m_layers_rst.front().raster.reset(m_res, m_pxdim, m_trafo);
- }
-
- inline void finish_layer(unsigned lyr_id) {
- assert(lyr_id < m_layers_rst.size());
- m_layers_rst[lyr_id].rawbytes.serialize(m_layers_rst[lyr_id].raster);
- m_layers_rst[lyr_id].raster.reset();
- }
-
- inline void finish_layer() {
- if(!m_layers_rst.empty()) {
- m_layers_rst.back().rawbytes.serialize(m_layers_rst.back().raster);
- m_layers_rst.back().raster.reset();
- }
- }
-
- void save(const std::string &fpath, const std::string &prjname = "");
- void save(Zipper &zipper, const std::string &prjname = "");
-
- void set_statistics(const PrintStatistics &statistics);
-
- void set_config(const DynamicPrintConfig &cfg);
-};
-
-} // namespace sla
-} // namespace Slic3r
-
-#endif // SLARASTERWRITER_HPP
diff --git a/src/libslic3r/SLA/ReprojectPointsOnMesh.hpp b/src/libslic3r/SLA/ReprojectPointsOnMesh.hpp
new file mode 100644
index 000000000..20804193e
--- /dev/null
+++ b/src/libslic3r/SLA/ReprojectPointsOnMesh.hpp
@@ -0,0 +1,47 @@
+#ifndef REPROJECTPOINTSONMESH_HPP
+#define REPROJECTPOINTSONMESH_HPP
+
+#include "libslic3r/Point.hpp"
+#include "SupportPoint.hpp"
+#include "Hollowing.hpp"
+#include "IndexedMesh.hpp"
+#include "libslic3r/Model.hpp"
+
+#include <tbb/parallel_for.h>
+
+namespace Slic3r { namespace sla {
+
+template<class Pt> Vec3d pos(const Pt &p) { return p.pos.template cast<double>(); }
+template<class Pt> void pos(Pt &p, const Vec3d &pp) { p.pos = pp.cast<float>(); }
+
+template<class PointType>
+void reproject_support_points(const IndexedMesh &mesh, std::vector<PointType> &pts)
+{
+ tbb::parallel_for(size_t(0), pts.size(), [&mesh, &pts](size_t idx) {
+ int junk;
+ Vec3d new_pos;
+ mesh.squared_distance(pos(pts[idx]), junk, new_pos);
+ pos(pts[idx], new_pos);
+ });
+}
+
+inline void reproject_points_and_holes(ModelObject *object)
+{
+ bool has_sppoints = !object->sla_support_points.empty();
+ bool has_holes = !object->sla_drain_holes.empty();
+
+ if (!object || (!has_holes && !has_sppoints)) return;
+
+ TriangleMesh rmsh = object->raw_mesh();
+ rmsh.require_shared_vertices();
+ IndexedMesh emesh{rmsh};
+
+ if (has_sppoints)
+ reproject_support_points(emesh, object->sla_support_points);
+
+ if (has_holes)
+ reproject_support_points(emesh, object->sla_drain_holes);
+}
+
+}}
+#endif // REPROJECTPOINTSONMESH_HPP
diff --git a/src/libslic3r/SLA/Rotfinder.cpp b/src/libslic3r/SLA/Rotfinder.cpp
index 9ec9837e2..937897766 100644
--- a/src/libslic3r/SLA/Rotfinder.cpp
+++ b/src/libslic3r/SLA/Rotfinder.cpp
@@ -1,36 +1,259 @@
#include <limits>
-#include <exception>
-#include <libnest2d/optimizers/nlopt/genetic.hpp>
-#include <libslic3r/SLA/Common.hpp>
#include <libslic3r/SLA/Rotfinder.hpp>
-#include <libslic3r/SLA/SupportTree.hpp>
+#include <libslic3r/SLA/Concurrency.hpp>
+
+#include <libslic3r/Optimize/BruteforceOptimizer.hpp>
+
+#include "libslic3r/SLAPrint.hpp"
+#include "libslic3r/PrintConfig.hpp"
+
+#include <libslic3r/Geometry.hpp>
#include "Model.hpp"
-namespace Slic3r {
-namespace sla {
+#include <thread>
+
+namespace Slic3r { namespace sla {
+
+inline bool is_on_floor(const SLAPrintObject &mo)
+{
+ auto opt_elevation = mo.config().support_object_elevation.getFloat();
+ auto opt_padaround = mo.config().pad_around_object.getBool();
+
+ return opt_elevation < EPSILON || opt_padaround;
+}
+
+// Find transformed mesh ground level without copy and with parallel reduce.
+double find_ground_level(const TriangleMesh &mesh,
+ const Transform3d & tr,
+ size_t threads)
+{
+ size_t vsize = mesh.its.vertices.size();
+
+ auto minfn = [](double a, double b) { return std::min(a, b); };
+
+ auto accessfn = [&mesh, &tr] (size_t vi) {
+ return (tr * mesh.its.vertices[vi].template cast<double>()).z();
+ };
+
+ double zmin = std::numeric_limits<double>::max();
+ size_t granularity = vsize / threads;
+ return ccr_par::reduce(size_t(0), vsize, zmin, minfn, accessfn, granularity);
+}
+
+// Get the vertices of a triangle directly in an array of 3 points
+std::array<Vec3d, 3> get_triangle_vertices(const TriangleMesh &mesh,
+ size_t faceidx)
+{
+ const auto &face = mesh.its.indices[faceidx];
+ return {Vec3d{mesh.its.vertices[face(0)].cast<double>()},
+ Vec3d{mesh.its.vertices[face(1)].cast<double>()},
+ Vec3d{mesh.its.vertices[face(2)].cast<double>()}};
+}
+
+std::array<Vec3d, 3> get_transformed_triangle(const TriangleMesh &mesh,
+ const Transform3d & tr,
+ size_t faceidx)
+{
+ const auto &tri = get_triangle_vertices(mesh, faceidx);
+ return {tr * tri[0], tr * tri[1], tr * tri[2]};
+}
+
+// Get area and normal of a triangle
+struct Facestats {
+ Vec3d normal;
+ double area;
+
+ explicit Facestats(const std::array<Vec3d, 3> &triangle)
+ {
+ Vec3d U = triangle[1] - triangle[0];
+ Vec3d V = triangle[2] - triangle[0];
+ Vec3d C = U.cross(V);
+ normal = C.normalized();
+ area = 0.5 * C.norm();
+ }
+};
+
+inline const Vec3d DOWN = {0., 0., -1.};
+constexpr double POINTS_PER_UNIT_AREA = 1.;
+
+// The score function for a particular face
+inline double get_score(const Facestats &fc)
+{
+ // Simply get the angle (acos of dot product) between the face normal and
+ // the DOWN vector.
+ double phi = 1. - std::acos(fc.normal.dot(DOWN)) / PI;
+
+ // Only consider faces that have have slopes below 90 deg:
+ phi = phi * (phi > 0.5);
+
+ // Make the huge slopes more significant than the smaller slopes
+ phi = phi * phi * phi;
+
+ // Multiply with the area of the current face
+ return fc.area * POINTS_PER_UNIT_AREA * phi;
+}
+
+template<class AccessFn>
+double sum_score(AccessFn &&accessfn, size_t facecount, size_t Nthreads)
+{
+ double initv = 0.;
+ auto mergefn = std::plus<double>{};
+ size_t grainsize = facecount / Nthreads;
+ size_t from = 0, to = facecount;
+
+ return ccr_par::reduce(from, to, initv, mergefn, accessfn, grainsize);
+}
+
+// Try to guess the number of support points needed to support a mesh
+double get_model_supportedness(const TriangleMesh &mesh, const Transform3d &tr)
+{
+ if (mesh.its.vertices.empty()) return std::nan("");
+
+ auto accessfn = [&mesh, &tr](size_t fi) {
+ Facestats fc{get_transformed_triangle(mesh, tr, fi)};
+ return get_score(fc);
+ };
+
+ size_t facecount = mesh.its.indices.size();
+ size_t Nthreads = std::thread::hardware_concurrency();
+ return sum_score(accessfn, facecount, Nthreads) / facecount;
+}
+
+double get_model_supportedness_onfloor(const TriangleMesh &mesh,
+ const Transform3d & tr)
+{
+ if (mesh.its.vertices.empty()) return std::nan("");
+
+ size_t Nthreads = std::thread::hardware_concurrency();
+
+ double zmin = find_ground_level(mesh, tr, Nthreads);
+ double zlvl = zmin + 0.1; // Set up a slight tolerance from z level
+
+ auto accessfn = [&mesh, &tr, zlvl](size_t fi) {
+ std::array<Vec3d, 3> tri = get_transformed_triangle(mesh, tr, fi);
+ Facestats fc{tri};
+
+ if (tri[0].z() <= zlvl && tri[1].z() <= zlvl && tri[2].z() <= zlvl)
+ return -fc.area * POINTS_PER_UNIT_AREA;
+
+ return get_score(fc);
+ };
+
+ size_t facecount = mesh.its.indices.size();
+ return sum_score(accessfn, facecount, Nthreads) / facecount;
+}
+
+using XYRotation = std::array<double, 2>;
-std::array<double, 3> find_best_rotation(const ModelObject& modelobj,
- float accuracy,
- std::function<void(unsigned)> statuscb,
- std::function<bool()> stopcond)
+// prepare the rotation transformation
+Transform3d to_transform3d(const XYRotation &rot)
{
- using libnest2d::opt::Method;
- using libnest2d::opt::bound;
- using libnest2d::opt::Optimizer;
- using libnest2d::opt::TOptimizer;
- using libnest2d::opt::StopCriteria;
+ Transform3d rt = Transform3d::Identity();
+ rt.rotate(Eigen::AngleAxisd(rot[1], Vec3d::UnitY()));
+ rt.rotate(Eigen::AngleAxisd(rot[0], Vec3d::UnitX()));
+ return rt;
+}
+
+XYRotation from_transform3d(const Transform3d &tr)
+{
+ Vec3d rot3d = Geometry::Transformation {tr}.get_rotation();
+ return {rot3d.x(), rot3d.y()};
+}
+
+// Find the best score from a set of function inputs. Evaluate for every point.
+template<size_t N, class Fn, class It, class StopCond>
+std::array<double, N> find_min_score(Fn &&fn, It from, It to, StopCond &&stopfn)
+{
+ std::array<double, N> ret;
+
+ double score = std::numeric_limits<double>::max();
+
+ size_t Nthreads = std::thread::hardware_concurrency();
+ size_t dist = std::distance(from, to);
+ std::vector<double> scores(dist, score);
+
+ ccr_par::for_each(size_t(0), dist, [&stopfn, &scores, &fn, &from](size_t i) {
+ if (stopfn()) return;
+
+ scores[i] = fn(*(from + i));
+ }, dist / Nthreads);
- static const unsigned MAX_TRIES = 100000;
+ auto it = std::min_element(scores.begin(), scores.end());
+
+ if (it != scores.end()) ret = *(from + std::distance(scores.begin(), it));
+
+ return ret;
+}
+
+// collect the rotations for each face of the convex hull
+std::vector<XYRotation> get_chull_rotations(const TriangleMesh &mesh, size_t max_count)
+{
+ TriangleMesh chull = mesh.convex_hull_3d();
+ chull.require_shared_vertices();
+ double chull2d_area = chull.convex_hull().area();
+ double area_threshold = chull2d_area / (scaled<double>(1e3) * scaled(1.));
+
+ size_t facecount = chull.its.indices.size();
+
+ struct RotArea { XYRotation rot; double area; };
+
+ auto inputs = reserve_vector<RotArea>(facecount);
+
+ auto rotcmp = [](const RotArea &r1, const RotArea &r2) {
+ double xdiff = r1.rot[X] - r2.rot[X], ydiff = r1.rot[Y] - r2.rot[Y];
+ return std::abs(xdiff) < EPSILON ? ydiff < 0. : xdiff < 0.;
+ };
+
+ auto eqcmp = [](const XYRotation &r1, const XYRotation &r2) {
+ double xdiff = r1[X] - r2[X], ydiff = r1[Y] - r2[Y];
+ return std::abs(xdiff) < EPSILON && std::abs(ydiff) < EPSILON;
+ };
+
+ for (size_t fi = 0; fi < facecount; ++fi) {
+ Facestats fc{get_triangle_vertices(chull, fi)};
+
+ if (fc.area > area_threshold) {
+ auto q = Eigen::Quaterniond{}.FromTwoVectors(fc.normal, DOWN);
+ XYRotation rot = from_transform3d(Transform3d::Identity() * q);
+ RotArea ra = {rot, fc.area};
+
+ auto it = std::lower_bound(inputs.begin(), inputs.end(), ra, rotcmp);
+
+ if (it == inputs.end() || !eqcmp(it->rot, rot))
+ inputs.insert(it, ra);
+ }
+ }
+
+ inputs.shrink_to_fit();
+ if (!max_count) max_count = inputs.size();
+ std::sort(inputs.begin(), inputs.end(),
+ [](const RotArea &ra, const RotArea &rb) {
+ return ra.area > rb.area;
+ });
+
+ auto ret = reserve_vector<XYRotation>(std::min(max_count, inputs.size()));
+ for (const RotArea &ra : inputs) ret.emplace_back(ra.rot);
+
+ return ret;
+}
+
+Vec2d find_best_rotation(const SLAPrintObject & po,
+ float accuracy,
+ std::function<void(unsigned)> statuscb,
+ std::function<bool()> stopcond)
+{
+ static const unsigned MAX_TRIES = 1000;
// return value
- std::array<double, 3> rot;
+ XYRotation rot;
// We will use only one instance of this converted mesh to examine different
// rotations
- EigenMesh3D emesh(modelobj.raw_mesh());
+ TriangleMesh mesh = po.model_object()->raw_mesh();
+ mesh.require_shared_vertices();
- // For current iteration number
+ // To keep track of the number of iterations
unsigned status = 0;
// The maximum number of iterations
@@ -39,87 +262,61 @@ std::array<double, 3> find_best_rotation(const ModelObject& modelobj,
// call status callback with zero, because we are at the start
statuscb(status);
- // So this is the object function which is called by the solver many times
- // It has to yield a single value representing the current score. We will
- // call the status callback in each iteration but the actual value may be
- // the same for subsequent iterations (status goes from 0 to 100 but
- // iterations can be many more)
- auto objfunc = [&emesh, &status, &statuscb, &stopcond, max_tries]
- (double rx, double ry, double rz)
- {
- EigenMesh3D& m = emesh;
-
- // prepare the rotation transformation
- Transform3d rt = Transform3d::Identity();
-
- rt.rotate(Eigen::AngleAxisd(rz, Vec3d::UnitZ()));
- rt.rotate(Eigen::AngleAxisd(ry, Vec3d::UnitY()));
- rt.rotate(Eigen::AngleAxisd(rx, Vec3d::UnitX()));
-
- double score = 0;
+ auto statusfn = [&statuscb, &status, &max_tries] {
+ // report status
+ statuscb(unsigned(++status * 100.0/max_tries) );
+ };
- // For all triangles we calculate the normal and sum up the dot product
- // (a scalar indicating how much are two vectors aligned) with each axis
- // this will result in a value that is greater if a normal is aligned
- // with all axes. If the normal is aligned than the triangle itself is
- // orthogonal to the axes and that is good for print quality.
+ // Different search methods have to be used depending on the model elevation
+ if (is_on_floor(po)) {
- // TODO: some applications optimize for minimum z-axis cross section
- // area. The current function is only an example of how to optimize.
+ std::vector<XYRotation> inputs = get_chull_rotations(mesh, max_tries);
+ max_tries = inputs.size();
- // Later we can add more criteria like the number of overhangs, etc...
- for(int i = 0; i < m.F().rows(); i++) {
- auto idx = m.F().row(i);
+ // If the model can be placed on the bed directly, we only need to
+ // check the 3D convex hull face rotations.
- Vec3d p1 = m.V().row(idx(0));
- Vec3d p2 = m.V().row(idx(1));
- Vec3d p3 = m.V().row(idx(2));
+ auto objfn = [&mesh, &statusfn](const XYRotation &rot) {
+ statusfn();
+ Transform3d tr = to_transform3d(rot);
+ return get_model_supportedness_onfloor(mesh, tr);
+ };
- Eigen::Vector3d U = p2 - p1;
- Eigen::Vector3d V = p3 - p1;
+ rot = find_min_score<2>(objfn, inputs.begin(), inputs.end(), stopcond);
+ } else {
+ // Preparing the optimizer.
+ size_t gridsize = std::sqrt(max_tries); // 2D grid has gridsize^2 calls
+ opt::Optimizer<opt::AlgBruteForce> solver(opt::StopCriteria{}
+ .max_iterations(max_tries)
+ .stop_condition(stopcond),
+ gridsize);
- // So this is the normal
- auto n = U.cross(V).normalized();
+ // We are searching rotations around only two axes x, y. Thus the
+ // problem becomes a 2 dimensional optimization task.
+ // We can specify the bounds for a dimension in the following way:
+ auto bounds = opt::bounds({ {-PI, PI}, {-PI, PI} });
- // rotate the normal with the current rotation given by the solver
- n = rt * n;
+ auto result = solver.to_min().optimize(
+ [&mesh, &statusfn] (const XYRotation &rot)
+ {
+ statusfn();
+ return get_model_supportedness(mesh, to_transform3d(rot));
+ }, opt::initvals({0., 0.}), bounds);
- // We should score against the alignment with the reference planes
- score += std::abs(n.dot(Vec3d::UnitX()));
- score += std::abs(n.dot(Vec3d::UnitY()));
- score += std::abs(n.dot(Vec3d::UnitZ()));
- }
+ // Save the result and fck off
+ rot = result.optimum;
+ }
- // report status
- if(!stopcond()) statuscb( unsigned(++status * 100.0/max_tries) );
+ return {rot[0], rot[1]};
+}
- return score;
- };
+double get_model_supportedness(const SLAPrintObject &po, const Transform3d &tr)
+{
+ TriangleMesh mesh = po.model_object()->raw_mesh();
+ mesh.require_shared_vertices();
- // Firing up the genetic optimizer. For now it uses the nlopt library.
- StopCriteria stc;
- stc.max_iterations = max_tries;
- stc.relative_score_difference = 1e-3;
- stc.stop_condition = stopcond; // stop when stopcond returns true
- TOptimizer<Method::G_GENETIC> solver(stc);
-
- // We are searching rotations around the three axes x, y, z. Thus the
- // problem becomes a 3 dimensional optimization task.
- // We can specify the bounds for a dimension in the following way:
- auto b = bound(-PI/2, PI/2);
-
- // Now we start the optimization process with initial angles (0, 0, 0)
- auto result = solver.optimize_max(objfunc,
- libnest2d::opt::initvals(0.0, 0.0, 0.0),
- b, b, b);
-
- // Save the result and fck off
- rot[0] = std::get<0>(result.optimum);
- rot[1] = std::get<1>(result.optimum);
- rot[2] = std::get<2>(result.optimum);
-
- return rot;
+ return is_on_floor(po) ? get_model_supportedness_onfloor(mesh, tr) :
+ get_model_supportedness(mesh, tr);
}
-}
-}
+}} // namespace Slic3r::sla
diff --git a/src/libslic3r/SLA/Rotfinder.hpp b/src/libslic3r/SLA/Rotfinder.hpp
index 4469f9731..96561a890 100644
--- a/src/libslic3r/SLA/Rotfinder.hpp
+++ b/src/libslic3r/SLA/Rotfinder.hpp
@@ -4,9 +4,11 @@
#include <functional>
#include <array>
+#include <libslic3r/Point.hpp>
+
namespace Slic3r {
-class ModelObject;
+class SLAPrintObject;
namespace sla {
@@ -25,14 +27,17 @@ namespace sla {
*
* @return Returns the rotations around each axis (x, y, z)
*/
-std::array<double, 3> find_best_rotation(
- const ModelObject& modelobj,
+Vec2d find_best_rotation(
+ const SLAPrintObject& modelobj,
float accuracy = 1.0f,
std::function<void(unsigned)> statuscb = [] (unsigned) {},
std::function<bool()> stopcond = [] () { return false; }
);
-}
-}
+double get_model_supportedness(const SLAPrintObject &mesh,
+ const Transform3d & tr);
+
+} // namespace sla
+} // namespace Slic3r
#endif // SLAROTFINDER_HPP
diff --git a/src/libslic3r/SLA/SpatIndex.cpp b/src/libslic3r/SLA/SpatIndex.cpp
new file mode 100644
index 000000000..d95ba55be
--- /dev/null
+++ b/src/libslic3r/SLA/SpatIndex.cpp
@@ -0,0 +1,161 @@
+#include "SpatIndex.hpp"
+
+// for concave hull merging decisions
+#include <libslic3r/SLA/BoostAdapter.hpp>
+
+#ifdef _MSC_VER
+#pragma warning(push)
+#pragma warning(disable: 4244)
+#pragma warning(disable: 4267)
+#endif
+
+#include "boost/geometry/index/rtree.hpp"
+
+#ifdef _MSC_VER
+#pragma warning(pop)
+#endif
+
+namespace Slic3r { namespace sla {
+
+/* **************************************************************************
+ * PointIndex implementation
+ * ************************************************************************** */
+
+class PointIndex::Impl {
+public:
+ using BoostIndex = boost::geometry::index::rtree< PointIndexEl,
+ boost::geometry::index::rstar<16, 4> /* ? */ >;
+
+ BoostIndex m_store;
+};
+
+PointIndex::PointIndex(): m_impl(new Impl()) {}
+PointIndex::~PointIndex() {}
+
+PointIndex::PointIndex(const PointIndex &cpy): m_impl(new Impl(*cpy.m_impl)) {}
+PointIndex::PointIndex(PointIndex&& cpy): m_impl(std::move(cpy.m_impl)) {}
+
+PointIndex& PointIndex::operator=(const PointIndex &cpy)
+{
+ m_impl.reset(new Impl(*cpy.m_impl));
+ return *this;
+}
+
+PointIndex& PointIndex::operator=(PointIndex &&cpy)
+{
+ m_impl.swap(cpy.m_impl);
+ return *this;
+}
+
+void PointIndex::insert(const PointIndexEl &el)
+{
+ m_impl->m_store.insert(el);
+}
+
+bool PointIndex::remove(const PointIndexEl& el)
+{
+ return m_impl->m_store.remove(el) == 1;
+}
+
+std::vector<PointIndexEl>
+PointIndex::query(std::function<bool(const PointIndexEl &)> fn) const
+{
+ namespace bgi = boost::geometry::index;
+
+ std::vector<PointIndexEl> ret;
+ m_impl->m_store.query(bgi::satisfies(fn), std::back_inserter(ret));
+ return ret;
+}
+
+std::vector<PointIndexEl> PointIndex::nearest(const Vec3d &el, unsigned k = 1) const
+{
+ namespace bgi = boost::geometry::index;
+ std::vector<PointIndexEl> ret; ret.reserve(k);
+ m_impl->m_store.query(bgi::nearest(el, k), std::back_inserter(ret));
+ return ret;
+}
+
+size_t PointIndex::size() const
+{
+ return m_impl->m_store.size();
+}
+
+void PointIndex::foreach(std::function<void (const PointIndexEl &)> fn)
+{
+ for(auto& el : m_impl->m_store) fn(el);
+}
+
+void PointIndex::foreach(std::function<void (const PointIndexEl &)> fn) const
+{
+ for(const auto &el : m_impl->m_store) fn(el);
+}
+
+/* **************************************************************************
+ * BoxIndex implementation
+ * ************************************************************************** */
+
+class BoxIndex::Impl {
+public:
+ using BoostIndex = boost::geometry::index::
+ rtree<BoxIndexEl, boost::geometry::index::rstar<16, 4> /* ? */>;
+
+ BoostIndex m_store;
+};
+
+BoxIndex::BoxIndex(): m_impl(new Impl()) {}
+BoxIndex::~BoxIndex() {}
+
+BoxIndex::BoxIndex(const BoxIndex &cpy): m_impl(new Impl(*cpy.m_impl)) {}
+BoxIndex::BoxIndex(BoxIndex&& cpy): m_impl(std::move(cpy.m_impl)) {}
+
+BoxIndex& BoxIndex::operator=(const BoxIndex &cpy)
+{
+ m_impl.reset(new Impl(*cpy.m_impl));
+ return *this;
+}
+
+BoxIndex& BoxIndex::operator=(BoxIndex &&cpy)
+{
+ m_impl.swap(cpy.m_impl);
+ return *this;
+}
+
+void BoxIndex::insert(const BoxIndexEl &el)
+{
+ m_impl->m_store.insert(el);
+}
+
+bool BoxIndex::remove(const BoxIndexEl& el)
+{
+ return m_impl->m_store.remove(el) == 1;
+}
+
+std::vector<BoxIndexEl> BoxIndex::query(const BoundingBox &qrbb,
+ BoxIndex::QueryType qt)
+{
+ namespace bgi = boost::geometry::index;
+
+ std::vector<BoxIndexEl> ret; ret.reserve(m_impl->m_store.size());
+
+ switch (qt) {
+ case qtIntersects:
+ m_impl->m_store.query(bgi::intersects(qrbb), std::back_inserter(ret));
+ break;
+ case qtWithin:
+ m_impl->m_store.query(bgi::within(qrbb), std::back_inserter(ret));
+ }
+
+ return ret;
+}
+
+size_t BoxIndex::size() const
+{
+ return m_impl->m_store.size();
+}
+
+void BoxIndex::foreach(std::function<void (const BoxIndexEl &)> fn)
+{
+ for(auto& el : m_impl->m_store) fn(el);
+}
+
+}} // namespace Slic3r::sla
diff --git a/src/libslic3r/SLA/SpatIndex.hpp b/src/libslic3r/SLA/SpatIndex.hpp
index 2955cdcdf..ef059d3ae 100644
--- a/src/libslic3r/SLA/SpatIndex.hpp
+++ b/src/libslic3r/SLA/SpatIndex.hpp
@@ -73,7 +73,7 @@ public:
BoxIndex& operator=(BoxIndex&&);
void insert(const BoxIndexEl&);
- inline void insert(const BoundingBox& bb, unsigned idx)
+ void insert(const BoundingBox& bb, unsigned idx)
{
insert(std::make_pair(bb, unsigned(idx)));
}
diff --git a/src/libslic3r/SLA/SupportPoint.hpp b/src/libslic3r/SLA/SupportPoint.hpp
index 202a614c3..71849a364 100644
--- a/src/libslic3r/SLA/SupportPoint.hpp
+++ b/src/libslic3r/SLA/SupportPoint.hpp
@@ -1,9 +1,7 @@
#ifndef SLA_SUPPORTPOINT_HPP
#define SLA_SUPPORTPOINT_HPP
-#include <vector>
-#include <libslic3r/SLA/Common.hpp>
-#include <libslic3r/ExPolygon.hpp>
+#include <libslic3r/Point.hpp>
namespace Slic3r { namespace sla {
@@ -29,13 +27,13 @@ struct SupportPoint
float pos_y,
float pos_z,
float head_radius,
- bool new_island)
+ bool new_island = false)
: pos(pos_x, pos_y, pos_z)
, head_front_radius(head_radius)
, is_new_island(new_island)
{}
- SupportPoint(Vec3f position, float head_radius, bool new_island)
+ SupportPoint(Vec3f position, float head_radius, bool new_island = false)
: pos(position)
, head_front_radius(head_radius)
, is_new_island(new_island)
diff --git a/src/libslic3r/SLA/SupportPointGenerator.cpp b/src/libslic3r/SLA/SupportPointGenerator.cpp
index 78c2ced35..8f720339a 100644
--- a/src/libslic3r/SLA/SupportPointGenerator.cpp
+++ b/src/libslic3r/SLA/SupportPointGenerator.cpp
@@ -4,14 +4,19 @@
#include <tbb/parallel_for.h>
#include "SupportPointGenerator.hpp"
+#include "Concurrency.hpp"
#include "Model.hpp"
#include "ExPolygon.hpp"
#include "SVG.hpp"
#include "Point.hpp"
#include "ClipperUtils.hpp"
#include "Tesselate.hpp"
+#include "ExPolygonCollection.hpp"
#include "libslic3r.h"
+#include "libnest2d/backends/clipper/geometries.hpp"
+#include "libnest2d/utils/rotcalipers.hpp"
+
#include <iostream>
#include <random>
@@ -50,7 +55,7 @@ float SupportPointGenerator::distance_limit(float angle) const
}*/
SupportPointGenerator::SupportPointGenerator(
- const sla::EigenMesh3D &emesh,
+ const sla::IndexedMesh &emesh,
const std::vector<ExPolygons> &slices,
const std::vector<float> & heights,
const Config & config,
@@ -64,7 +69,7 @@ SupportPointGenerator::SupportPointGenerator(
}
SupportPointGenerator::SupportPointGenerator(
- const EigenMesh3D &emesh,
+ const IndexedMesh &emesh,
const SupportPointGenerator::Config &config,
std::function<void ()> throw_on_cancel,
std::function<void (int)> statusfn)
@@ -87,27 +92,28 @@ void SupportPointGenerator::project_onto_mesh(std::vector<sla::SupportPoint>& po
// The function makes sure that all the points are really exactly placed on the mesh.
// Use a reasonable granularity to account for the worker thread synchronization cost.
- tbb::parallel_for(tbb::blocked_range<size_t>(0, points.size(), 64),
- [this, &points](const tbb::blocked_range<size_t>& range) {
- for (size_t point_id = range.begin(); point_id < range.end(); ++ point_id) {
- if ((point_id % 16) == 0)
- // Don't call the following function too often as it flushes CPU write caches due to synchronization primitves.
- m_throw_on_cancel();
- Vec3f& p = points[point_id].pos;
- // Project the point upward and downward and choose the closer intersection with the mesh.
- sla::EigenMesh3D::hit_result hit_up = m_emesh.query_ray_hit(p.cast<double>(), Vec3d(0., 0., 1.));
- sla::EigenMesh3D::hit_result hit_down = m_emesh.query_ray_hit(p.cast<double>(), Vec3d(0., 0., -1.));
-
- bool up = hit_up.is_hit();
- bool down = hit_down.is_hit();
-
- if (!up && !down)
- continue;
-
- sla::EigenMesh3D::hit_result& hit = (!down || (hit_up.distance() < hit_down.distance())) ? hit_up : hit_down;
- p = p + (hit.distance() * hit.direction()).cast<float>();
- }
- });
+ static constexpr size_t gransize = 64;
+
+ ccr_par::for_each(size_t(0), points.size(), [this, &points](size_t idx)
+ {
+ if ((idx % 16) == 0)
+ // Don't call the following function too often as it flushes CPU write caches due to synchronization primitves.
+ m_throw_on_cancel();
+
+ Vec3f& p = points[idx].pos;
+ // Project the point upward and downward and choose the closer intersection with the mesh.
+ sla::IndexedMesh::hit_result hit_up = m_emesh.query_ray_hit(p.cast<double>(), Vec3d(0., 0., 1.));
+ sla::IndexedMesh::hit_result hit_down = m_emesh.query_ray_hit(p.cast<double>(), Vec3d(0., 0., -1.));
+
+ bool up = hit_up.is_hit();
+ bool down = hit_down.is_hit();
+
+ if (!up && !down)
+ return;
+
+ sla::IndexedMesh::hit_result& hit = (!down || (hit_up.distance() < hit_down.distance())) ? hit_up : hit_down;
+ p = p + (hit.distance() * hit.direction()).cast<float>();
+ }, gransize);
}
static std::vector<SupportPointGenerator::MyLayer> make_layers(
@@ -126,78 +132,97 @@ static std::vector<SupportPointGenerator::MyLayer> make_layers(
//const float pixel_area = pow(wxGetApp().preset_bundle->project_config.option<ConfigOptionFloat>("display_width") / wxGetApp().preset_bundle->project_config.option<ConfigOptionInt>("display_pixels_x"), 2.f); //
const float pixel_area = pow(0.047f, 2.f);
- // Use a reasonable granularity to account for the worker thread synchronization cost.
- tbb::parallel_for(tbb::blocked_range<size_t>(0, layers.size(), 32),
- [&layers, &slices, &heights, pixel_area, throw_on_cancel](const tbb::blocked_range<size_t>& range) {
- for (size_t layer_id = range.begin(); layer_id < range.end(); ++ layer_id) {
- if ((layer_id % 8) == 0)
- // Don't call the following function too often as it flushes CPU write caches due to synchronization primitves.
- throw_on_cancel();
- SupportPointGenerator::MyLayer &layer = layers[layer_id];
- const ExPolygons &islands = slices[layer_id];
- //FIXME WTF?
- const float height = (layer_id>2 ? heights[layer_id-3] : heights[0]-(heights[1]-heights[0]));
- layer.islands.reserve(islands.size());
- for (const ExPolygon &island : islands) {
- float area = float(island.area() * SCALING_FACTOR * SCALING_FACTOR);
- if (area >= pixel_area)
- //FIXME this is not a correct centroid of a polygon with holes.
- layer.islands.emplace_back(layer, island, get_extents(island.contour), Slic3r::unscale(island.contour.centroid()).cast<float>(), area, height);
- }
- }
- });
+ ccr_par::for_each(size_t(0), layers.size(),
+ [&layers, &slices, &heights, pixel_area, throw_on_cancel](size_t layer_id)
+ {
+ if ((layer_id % 8) == 0)
+ // Don't call the following function too often as it flushes
+ // CPU write caches due to synchronization primitves.
+ throw_on_cancel();
+
+ SupportPointGenerator::MyLayer &layer = layers[layer_id];
+ const ExPolygons & islands = slices[layer_id];
+ // FIXME WTF?
+ const float height = (layer_id > 2 ?
+ heights[layer_id - 3] :
+ heights[0] - (heights[1] - heights[0]));
+ layer.islands.reserve(islands.size());
+ for (const ExPolygon &island : islands) {
+ float area = float(island.area() * SCALING_FACTOR * SCALING_FACTOR);
+ if (area >= pixel_area)
+ // FIXME this is not a correct centroid of a polygon with holes.
+ layer.islands.emplace_back(layer, island, get_extents(island.contour),
+ unscaled<float>(island.contour.centroid()), area, height);
+ }
+ }, 32 /*gransize*/);
// Calculate overlap of successive layers. Link overlapping islands.
- tbb::parallel_for(tbb::blocked_range<size_t>(1, layers.size(), 8),
- [&layers, &heights, throw_on_cancel](const tbb::blocked_range<size_t>& range) {
- for (size_t layer_id = range.begin(); layer_id < range.end(); ++layer_id) {
- if ((layer_id % 2) == 0)
- // Don't call the following function too often as it flushes CPU write caches due to synchronization primitves.
- throw_on_cancel();
- SupportPointGenerator::MyLayer &layer_above = layers[layer_id];
- SupportPointGenerator::MyLayer &layer_below = layers[layer_id - 1];
- //FIXME WTF?
- const float layer_height = (layer_id!=0 ? heights[layer_id]-heights[layer_id-1] : heights[0]);
- const float safe_angle = 5.f * (float(M_PI)/180.f); // smaller number - less supports
- const float between_layers_offset = float(scale_(layer_height / std::tan(safe_angle)));
- const float slope_angle = 75.f * (float(M_PI)/180.f); // smaller number - less supports
- const float slope_offset = float(scale_(layer_height / std::tan(slope_angle)));
- //FIXME This has a quadratic time complexity, it will be excessively slow for many tiny islands.
- for (SupportPointGenerator::Structure &top : layer_above.islands) {
- for (SupportPointGenerator::Structure &bottom : layer_below.islands) {
- float overlap_area = top.overlap_area(bottom);
- if (overlap_area > 0) {
- top.islands_below.emplace_back(&bottom, overlap_area);
- bottom.islands_above.emplace_back(&top, overlap_area);
- }
- }
- if (! top.islands_below.empty()) {
- Polygons top_polygons = to_polygons(*top.polygon);
- Polygons bottom_polygons = top.polygons_below();
- top.overhangs = diff_ex(top_polygons, bottom_polygons);
- if (! top.overhangs.empty()) {
- top.overhangs_area = 0.f;
- std::vector<std::pair<ExPolygon*, float>> expolys_with_areas;
- for (ExPolygon &ex : top.overhangs) {
- float area = float(ex.area());
- expolys_with_areas.emplace_back(&ex, area);
- top.overhangs_area += area;
- }
- std::sort(expolys_with_areas.begin(), expolys_with_areas.end(),
+ ccr_par::for_each(size_t(1), layers.size(),
+ [&layers, &heights, throw_on_cancel] (size_t layer_id)
+ {
+ if ((layer_id % 2) == 0)
+ // Don't call the following function too often as it flushes CPU write caches due to synchronization primitves.
+ throw_on_cancel();
+ SupportPointGenerator::MyLayer &layer_above = layers[layer_id];
+ SupportPointGenerator::MyLayer &layer_below = layers[layer_id - 1];
+ //FIXME WTF?
+ const float layer_height = (layer_id!=0 ? heights[layer_id]-heights[layer_id-1] : heights[0]);
+ const float safe_angle = 35.f * (float(M_PI)/180.f); // smaller number - less supports
+ const float between_layers_offset = scaled<float>(layer_height * std::tan(safe_angle));
+ const float slope_angle = 75.f * (float(M_PI)/180.f); // smaller number - less supports
+ const float slope_offset = scaled<float>(layer_height * std::tan(slope_angle));
+ //FIXME This has a quadratic time complexity, it will be excessively slow for many tiny islands.
+ for (SupportPointGenerator::Structure &top : layer_above.islands) {
+ for (SupportPointGenerator::Structure &bottom : layer_below.islands) {
+ float overlap_area = top.overlap_area(bottom);
+ if (overlap_area > 0) {
+ top.islands_below.emplace_back(&bottom, overlap_area);
+ bottom.islands_above.emplace_back(&top, overlap_area);
+ }
+ }
+ if (! top.islands_below.empty()) {
+ Polygons top_polygons = to_polygons(*top.polygon);
+ Polygons bottom_polygons = top.polygons_below();
+ top.overhangs = diff_ex(top_polygons, bottom_polygons);
+ if (! top.overhangs.empty()) {
+
+ // Produce 2 bands around the island, a safe band for dangling overhangs
+ // and an unsafe band for sloped overhangs.
+ // These masks include the original island
+ auto dangl_mask = offset(bottom_polygons, between_layers_offset, ClipperLib::jtSquare);
+ auto overh_mask = offset(bottom_polygons, slope_offset, ClipperLib::jtSquare);
+
+ // Absolutely hopeless overhangs are those outside the unsafe band
+ top.overhangs = diff_ex(top_polygons, overh_mask);
+
+ // Now cut out the supported core from the safe band
+ // and cut the safe band from the unsafe band to get distinct
+ // zones.
+ overh_mask = diff(overh_mask, dangl_mask);
+ dangl_mask = diff(dangl_mask, bottom_polygons);
+
+ top.dangling_areas = intersection_ex(top_polygons, dangl_mask);
+ top.overhangs_slopes = intersection_ex(top_polygons, overh_mask);
+
+ top.overhangs_area = 0.f;
+ std::vector<std::pair<ExPolygon*, float>> expolys_with_areas;
+ for (ExPolygon &ex : top.overhangs) {
+ float area = float(ex.area());
+ expolys_with_areas.emplace_back(&ex, area);
+ top.overhangs_area += area;
+ }
+ std::sort(expolys_with_areas.begin(), expolys_with_areas.end(),
[](const std::pair<ExPolygon*, float> &p1, const std::pair<ExPolygon*, float> &p2)
- { return p1.second > p2.second; });
- ExPolygons overhangs_sorted;
- for (auto &p : expolys_with_areas)
- overhangs_sorted.emplace_back(std::move(*p.first));
- top.overhangs = std::move(overhangs_sorted);
- top.overhangs_area *= float(SCALING_FACTOR * SCALING_FACTOR);
- top.overhangs_slopes = diff_ex(top_polygons, offset(bottom_polygons, slope_offset));
- top.dangling_areas = diff_ex(top_polygons, offset(bottom_polygons, between_layers_offset));
- }
- }
- }
- }
- });
+ { return p1.second > p2.second; });
+ ExPolygons overhangs_sorted;
+ for (auto &p : expolys_with_areas)
+ overhangs_sorted.emplace_back(std::move(*p.first));
+ top.overhangs = std::move(overhangs_sorted);
+ top.overhangs_area *= float(SCALING_FACTOR * SCALING_FACTOR);
+ }
+ }
+ }
+ }, 8 /* gransize */);
return layers;
}
@@ -252,21 +277,9 @@ void SupportPointGenerator::process(const std::vector<ExPolygons>& slices, const
// Now iterate over all polygons and append new points if needed.
for (Structure &s : layer_top->islands) {
// Penalization resulting from large diff from the last layer:
-// s.supports_force_inherited /= std::max(1.f, (layer_height / 0.3f) * e_area / s.area);
s.supports_force_inherited /= std::max(1.f, 0.17f * (s.overhangs_area) / s.area);
- //float force_deficit = s.support_force_deficit(m_config.tear_pressure());
- if (s.islands_below.empty()) { // completely new island - needs support no doubt
- uniformly_cover({ *s.polygon }, s, point_grid, true);
- } else if (! s.dangling_areas.empty()) {
- // Let's see if there's anything that overlaps enough to need supports:
- // What we now have in polygons needs support, regardless of what the forces are, so we can add them.
- //FIXME is it an island point or not? Vojtech thinks it is.
- uniformly_cover(s.dangling_areas, s, point_grid);
- } else if (! s.overhangs_slopes.empty()) {
- //FIXME add the support force deficit as a parameter, only cover until the defficiency is covered.
- uniformly_cover(s.overhangs_slopes, s, point_grid);
- }
+ add_support_points(s, point_grid);
}
m_throw_on_cancel();
@@ -284,6 +297,45 @@ void SupportPointGenerator::process(const std::vector<ExPolygons>& slices, const
}
}
+void SupportPointGenerator::add_support_points(SupportPointGenerator::Structure &s, SupportPointGenerator::PointGrid3D &grid3d)
+{
+ // Select each type of surface (overrhang, dangling, slope), derive the support
+ // force deficit for it and call uniformly conver with the right params
+
+ float tp = m_config.tear_pressure();
+ float current = s.supports_force_total();
+ static constexpr float DANGL_DAMPING = .5f;
+ static constexpr float SLOPE_DAMPING = .1f;
+
+ if (s.islands_below.empty()) {
+ // completely new island - needs support no doubt
+ // deficit is full, there is nothing below that would hold this island
+ uniformly_cover({ *s.polygon }, s, s.area * tp, grid3d, IslandCoverageFlags(icfIsNew | icfWithBoundary) );
+ return;
+ }
+
+ if (! s.overhangs.empty()) {
+ uniformly_cover(s.overhangs, s, s.overhangs_area * tp, grid3d);
+ }
+
+ auto areafn = [](double sum, auto &p) { return sum + p.area() * SCALING_FACTOR * SCALING_FACTOR; };
+
+ current = s.supports_force_total();
+ if (! s.dangling_areas.empty()) {
+ // Let's see if there's anything that overlaps enough to need supports:
+ // What we now have in polygons needs support, regardless of what the forces are, so we can add them.
+
+ double a = std::accumulate(s.dangling_areas.begin(), s.dangling_areas.end(), 0., areafn);
+ uniformly_cover(s.dangling_areas, s, a * tp - a * current * s.area, grid3d, icfWithBoundary);
+ }
+
+ current = s.supports_force_total();
+ if (! s.overhangs_slopes.empty()) {
+ double a = std::accumulate(s.overhangs_slopes.begin(), s.overhangs_slopes.end(), 0., areafn);
+ uniformly_cover(s.overhangs_slopes, s, a * tp - a * current / s.area, grid3d, icfWithBoundary);
+ }
+}
+
std::vector<Vec2f> sample_expolygon(const ExPolygon &expoly, float samples_per_mm2, std::mt19937 &rng)
{
// Triangulate the polygon with holes into triplets of 3D points.
@@ -293,16 +345,16 @@ std::vector<Vec2f> sample_expolygon(const ExPolygon &expoly, float samples_per_m
if (! triangles.empty())
{
// Calculate area of each triangle.
- std::vector<float> areas;
- areas.reserve(triangles.size() / 3);
+ auto areas = reserve_vector<float>(triangles.size() / 3);
+ double aback = 0.;
for (size_t i = 0; i < triangles.size(); ) {
const Vec2f &a = triangles[i ++];
const Vec2f v1 = triangles[i ++] - a;
const Vec2f v2 = triangles[i ++] - a;
- areas.emplace_back(0.5f * std::abs(cross2(v1, v2)));
- if (i != 3)
- // Prefix sum of the areas.
- areas.back() += areas[areas.size() - 2];
+
+ // Prefix sum of the areas.
+ areas.emplace_back(aback + 0.5f * std::abs(cross2(v1, v2)));
+ aback = areas.back();
}
size_t num_samples = size_t(ceil(areas.back() * samples_per_mm2));
@@ -312,28 +364,62 @@ std::vector<Vec2f> sample_expolygon(const ExPolygon &expoly, float samples_per_m
double r = random_triangle(rng);
size_t idx_triangle = std::min<size_t>(std::upper_bound(areas.begin(), areas.end(), (float)r) - areas.begin(), areas.size() - 1) * 3;
// Select a random point on the triangle.
- double u = float(sqrt(random_float(rng)));
- double v = float(random_float(rng));
const Vec2f &a = triangles[idx_triangle ++];
const Vec2f &b = triangles[idx_triangle++];
const Vec2f &c = triangles[idx_triangle];
- const Vec2f x = a * (1.f - u) + b * (u * (1.f - v)) + c * (v * u);
- out.emplace_back(x);
+#if 1
+ // https://www.cs.princeton.edu/~funk/tog02.pdf
+ // page 814, formula 1.
+ double u = float(std::sqrt(random_float(rng)));
+ double v = float(random_float(rng));
+ out.emplace_back(a * (1.f - u) + b * (u * (1.f - v)) + c * (v * u));
+#else
+ // Greg Turk, Graphics Gems
+ // https://devsplorer.wordpress.com/2019/08/07/find-a-random-point-on-a-plane-using-barycentric-coordinates-in-unity/
+ double u = float(random_float(rng));
+ double v = float(random_float(rng));
+ if (u + v >= 1.f) {
+ u = 1.f - u;
+ v = 1.f - v;
+ }
+ out.emplace_back(a + u * (b - a) + v * (c - a));
+#endif
}
}
return out;
}
-std::vector<Vec2f> sample_expolygon_with_boundary(const ExPolygon &expoly, float samples_per_mm2, float samples_per_mm_boundary, std::mt19937 &rng)
+
+std::vector<Vec2f> sample_expolygon(const ExPolygons &expolys, float samples_per_mm2, std::mt19937 &rng)
{
- std::vector<Vec2f> out = sample_expolygon(expoly, samples_per_mm2, rng);
- double point_stepping_scaled = scale_(1.f) / samples_per_mm_boundary;
+ std::vector<Vec2f> out;
+ for (const ExPolygon &expoly : expolys)
+ append(out, sample_expolygon(expoly, samples_per_mm2, rng));
+
+ return out;
+}
+
+void sample_expolygon_boundary(const ExPolygon & expoly,
+ float samples_per_mm,
+ std::vector<Vec2f> &out,
+ std::mt19937 & rng)
+{
+ double point_stepping_scaled = scale_(1.f) / samples_per_mm;
for (size_t i_contour = 0; i_contour <= expoly.holes.size(); ++ i_contour) {
- const Polygon &contour = (i_contour == 0) ? expoly.contour : expoly.holes[i_contour - 1];
- const Points pts = contour.equally_spaced_points(point_stepping_scaled);
+ const Polygon &contour = (i_contour == 0) ? expoly.contour :
+ expoly.holes[i_contour - 1];
+
+ const Points pts = contour.equally_spaced_points(point_stepping_scaled);
for (size_t i = 0; i < pts.size(); ++ i)
- out.emplace_back(unscale<float>(pts[i].x()), unscale<float>(pts[i].y()));
+ out.emplace_back(unscale<float>(pts[i].x()),
+ unscale<float>(pts[i].y()));
}
+}
+
+std::vector<Vec2f> sample_expolygon_with_boundary(const ExPolygon &expoly, float samples_per_mm2, float samples_per_mm_boundary, std::mt19937 &rng)
+{
+ std::vector<Vec2f> out = sample_expolygon(expoly, samples_per_mm2, rng);
+ sample_expolygon_boundary(expoly, samples_per_mm_boundary, out, rng);
return out;
}
@@ -355,17 +441,17 @@ static inline std::vector<Vec2f> poisson_disk_from_samples(const std::vector<Vec
}
// Assign the raw samples to grid cells, sort the grid cells lexicographically.
- struct RawSample {
+ struct RawSample
+ {
Vec2f coord;
Vec2i cell_id;
+ RawSample(const Vec2f &crd = {}, const Vec2i &id = {}): coord{crd}, cell_id{id} {}
};
- std::vector<RawSample> raw_samples_sorted;
- RawSample sample;
- for (const Vec2f &pt : raw_samples) {
- sample.coord = pt;
- sample.cell_id = ((pt - corner_min) / radius).cast<int>();
- raw_samples_sorted.emplace_back(sample);
- }
+
+ auto raw_samples_sorted = reserve_vector<RawSample>(raw_samples.size());
+ for (const Vec2f &pt : raw_samples)
+ raw_samples_sorted.emplace_back(pt, ((pt - corner_min) / radius).cast<int>());
+
std::sort(raw_samples_sorted.begin(), raw_samples_sorted.end(), [](const RawSample &lhs, const RawSample &rhs)
{ return lhs.cell_id.x() < rhs.cell_id.x() || (lhs.cell_id.x() == rhs.cell_id.x() && lhs.cell_id.y() < rhs.cell_id.y()); });
@@ -460,11 +546,26 @@ static inline std::vector<Vec2f> poisson_disk_from_samples(const std::vector<Vec
return out;
}
-void SupportPointGenerator::uniformly_cover(const ExPolygons& islands, Structure& structure, PointGrid3D &grid3d, bool is_new_island, bool just_one)
+
+void SupportPointGenerator::uniformly_cover(const ExPolygons& islands, Structure& structure, float deficit, PointGrid3D &grid3d, IslandCoverageFlags flags)
{
//int num_of_points = std::max(1, (int)((island.area()*pow(SCALING_FACTOR, 2) * m_config.tear_pressure)/m_config.support_force));
- const float support_force_deficit = structure.support_force_deficit(m_config.tear_pressure());
+ float support_force_deficit = deficit;
+// auto bb = get_extents(islands);
+
+ if (flags & icfIsNew) {
+ auto chull_ex = ExPolygonCollection{islands}.convex_hull();
+ auto chull = Slic3rMultiPoint_to_ClipperPath(chull_ex);
+ auto rotbox = libnest2d::minAreaBoundingBox(chull);
+ Vec2d bbdim = {unscaled(rotbox.width()), unscaled(rotbox.height())};
+
+ if (bbdim.x() > bbdim.y()) std::swap(bbdim.x(), bbdim.y());
+ double aspectr = bbdim.y() / bbdim.x();
+
+ support_force_deficit *= (1 + aspectr / 2.);
+ }
+
if (support_force_deficit < 0)
return;
@@ -481,13 +582,18 @@ void SupportPointGenerator::uniformly_cover(const ExPolygons& islands, Structure
float min_spacing = poisson_radius;
//FIXME share the random generator. The random generator may be not so cheap to initialize, also we don't want the random generator to be restarted for each polygon.
-
- std::vector<Vec2f> raw_samples = sample_expolygon_with_boundary(islands, samples_per_mm2, 5.f / poisson_radius, m_rng);
+
+ std::vector<Vec2f> raw_samples =
+ flags & icfWithBoundary ?
+ sample_expolygon_with_boundary(islands, samples_per_mm2,
+ 5.f / poisson_radius, m_rng) :
+ sample_expolygon(islands, samples_per_mm2, m_rng);
+
std::vector<Vec2f> poisson_samples;
for (size_t iter = 0; iter < 4; ++ iter) {
poisson_samples = poisson_disk_from_samples(raw_samples, poisson_radius,
[&structure, &grid3d, min_spacing](const Vec2f &pos) {
- return grid3d.collides_with(pos, &structure, min_spacing);
+ return grid3d.collides_with(pos, structure.layer->print_z, min_spacing);
});
if (poisson_samples.size() >= poisson_samples_target || m_config.minimal_distance > poisson_radius-EPSILON)
break;
@@ -517,21 +623,19 @@ void SupportPointGenerator::uniformly_cover(const ExPolygons& islands, Structure
poisson_samples.erase(poisson_samples.begin() + poisson_samples_target, poisson_samples.end());
}
for (const Vec2f &pt : poisson_samples) {
- m_output.emplace_back(float(pt(0)), float(pt(1)), structure.height, m_config.head_diameter/2.f, is_new_island);
+ m_output.emplace_back(float(pt(0)), float(pt(1)), structure.zlevel, m_config.head_diameter/2.f, flags & icfIsNew);
structure.supports_force_this_layer += m_config.support_force();
grid3d.insert(pt, &structure);
}
}
-void remove_bottom_points(std::vector<SupportPoint> &pts, double gnd_lvl, double tolerance)
+
+void remove_bottom_points(std::vector<SupportPoint> &pts, float lvl)
{
// get iterator to the reorganized vector end
- auto endit =
- std::remove_if(pts.begin(), pts.end(),
- [tolerance, gnd_lvl](const sla::SupportPoint &sp) {
- double diff = std::abs(gnd_lvl -
- double(sp.pos(Z)));
- return diff <= tolerance;
+ auto endit = std::remove_if(pts.begin(), pts.end(), [lvl]
+ (const sla::SupportPoint &sp) {
+ return sp.pos.z() <= lvl;
});
// erase all elements after the new end
diff --git a/src/libslic3r/SLA/SupportPointGenerator.hpp b/src/libslic3r/SLA/SupportPointGenerator.hpp
index 738fc5730..ebb8cc373 100644
--- a/src/libslic3r/SLA/SupportPointGenerator.hpp
+++ b/src/libslic3r/SLA/SupportPointGenerator.hpp
@@ -3,13 +3,12 @@
#include <random>
-#include <libslic3r/SLA/Common.hpp>
#include <libslic3r/SLA/SupportPoint.hpp>
-#include <libslic3r/SLA/EigenMesh3D.hpp>
+#include <libslic3r/SLA/IndexedMesh.hpp>
+#include <libslic3r/BoundingBox.hpp>
#include <libslic3r/ClipperUtils.hpp>
#include <libslic3r/Point.hpp>
-#include <libslic3r/TriangleMesh.hpp>
#include <boost/container/small_vector.hpp>
@@ -23,15 +22,16 @@ public:
float density_relative {1.f};
float minimal_distance {1.f};
float head_diameter {0.4f};
- ///////////////
- inline float support_force() const { return 7.7f / density_relative; } // a force one point can support (arbitrary force unit)
+
+ // Originally calibrated to 7.7f, reduced density by Tamas to 70% which is 11.1 (7.7 / 0.7) to adjust for new algorithm changes in tm_suppt_gen_improve
+ inline float support_force() const { return 11.1f / density_relative; } // a force one point can support (arbitrary force unit)
inline float tear_pressure() const { return 1.f; } // pressure that the display exerts (the force unit per mm2)
};
- SupportPointGenerator(const EigenMesh3D& emesh, const std::vector<ExPolygons>& slices,
+ SupportPointGenerator(const IndexedMesh& emesh, const std::vector<ExPolygons>& slices,
const std::vector<float>& heights, const Config& config, std::function<void(void)> throw_on_cancel, std::function<void(int)> statusfn);
- SupportPointGenerator(const EigenMesh3D& emesh, const Config& config, std::function<void(void)> throw_on_cancel, std::function<void(int)> statusfn);
+ SupportPointGenerator(const IndexedMesh& emesh, const Config& config, std::function<void(void)> throw_on_cancel, std::function<void(int)> statusfn);
const std::vector<SupportPoint>& output() const { return m_output; }
std::vector<SupportPoint>& output() { return m_output; }
@@ -39,8 +39,8 @@ public:
struct MyLayer;
struct Structure {
- Structure(MyLayer &layer, const ExPolygon& poly, const BoundingBox &bbox, const Vec2f &centroid, float area, float h) :
- layer(&layer), polygon(&poly), bbox(bbox), centroid(centroid), area(area), height(h)
+ Structure(MyLayer &layer, const ExPolygon& poly, const BoundingBox &bbox, const Vec2f &centroid, float area, float h) :
+ layer(&layer), polygon(&poly), bbox(bbox), centroid(centroid), area(area), zlevel(h)
#ifdef SLA_SUPPORTPOINTGEN_DEBUG
, unique_id(std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::system_clock::now().time_since_epoch()))
#endif /* SLA_SUPPORTPOINTGEN_DEBUG */
@@ -50,7 +50,7 @@ public:
const BoundingBox bbox;
const Vec2f centroid = Vec2f::Zero();
const float area = 0.f;
- float height = 0;
+ float zlevel = 0;
// How well is this ExPolygon held to the print base?
// Positive number, the higher the better.
float supports_force_this_layer = 0.f;
@@ -160,8 +160,8 @@ public:
grid.emplace(cell_id(pt.position), pt);
}
- bool collides_with(const Vec2f &pos, Structure *island, float radius) {
- Vec3f pos3d(pos.x(), pos.y(), float(island->layer->print_z));
+ bool collides_with(const Vec2f &pos, float print_z, float radius) {
+ Vec3f pos3d(pos.x(), pos.y(), print_z);
Vec3i cell = cell_id(pos3d);
std::pair<Grid::const_iterator, Grid::const_iterator> it_pair = grid.equal_range(cell);
if (collides_with(pos3d, radius, it_pair.first, it_pair.second))
@@ -199,7 +199,16 @@ private:
SupportPointGenerator::Config m_config;
void process(const std::vector<ExPolygons>& slices, const std::vector<float>& heights);
- void uniformly_cover(const ExPolygons& islands, Structure& structure, PointGrid3D &grid3d, bool is_new_island = false, bool just_one = false);
+
+public:
+ enum IslandCoverageFlags : uint8_t { icfNone = 0x0, icfIsNew = 0x1, icfWithBoundary = 0x2 };
+
+private:
+
+ void uniformly_cover(const ExPolygons& islands, Structure& structure, float deficit, PointGrid3D &grid3d, IslandCoverageFlags flags = icfNone);
+
+ void add_support_points(Structure& structure, PointGrid3D &grid3d);
+
void project_onto_mesh(std::vector<SupportPoint>& points) const;
#ifdef SLA_SUPPORTPOINTGEN_DEBUG
@@ -207,14 +216,17 @@ private:
static void output_structures(const std::vector<Structure> &structures);
#endif // SLA_SUPPORTPOINTGEN_DEBUG
- const EigenMesh3D& m_emesh;
+ const IndexedMesh& m_emesh;
std::function<void(void)> m_throw_on_cancel;
std::function<void(int)> m_statusfn;
std::mt19937 m_rng;
};
-void remove_bottom_points(std::vector<SupportPoint> &pts, double gnd_lvl, double tolerance);
+void remove_bottom_points(std::vector<SupportPoint> &pts, float lvl);
+
+std::vector<Vec2f> sample_expolygon(const ExPolygon &expoly, float samples_per_mm2, std::mt19937 &rng);
+void sample_expolygon_boundary(const ExPolygon &expoly, float samples_per_mm, std::vector<Vec2f> &out, std::mt19937 &rng);
}} // namespace Slic3r::sla
diff --git a/src/libslic3r/SLA/SupportTree.cpp b/src/libslic3r/SLA/SupportTree.cpp
index 528778b68..1bb4cfab7 100644
--- a/src/libslic3r/SLA/SupportTree.cpp
+++ b/src/libslic3r/SLA/SupportTree.cpp
@@ -5,9 +5,9 @@
#include <numeric>
#include <libslic3r/SLA/SupportTree.hpp>
-#include <libslic3r/SLA/Common.hpp>
#include <libslic3r/SLA/SpatIndex.hpp>
#include <libslic3r/SLA/SupportTreeBuilder.hpp>
+#include <libslic3r/SLA/SupportTreeBuildsteps.hpp>
#include <libslic3r/MTUtils.hpp>
#include <libslic3r/ClipperUtils.hpp>
@@ -28,20 +28,6 @@
namespace Slic3r {
namespace sla {
-// Compile time configuration value definitions:
-
-// The max Z angle for a normal at which it will get completely ignored.
-const double SupportConfig::normal_cutoff_angle = 150.0 * M_PI / 180.0;
-
-// The shortest distance of any support structure from the model surface
-const double SupportConfig::safety_distance_mm = 0.5;
-
-const double SupportConfig::max_solo_pillar_height_mm = 15.0;
-const double SupportConfig::max_dual_pillar_height_mm = 35.0;
-const double SupportConfig::optimizer_rel_score_diff = 1e-6;
-const unsigned SupportConfig::optimizer_max_iterations = 1000;
-const unsigned SupportConfig::pillar_cascade_neighbors = 3;
-
void SupportTree::retrieve_full_mesh(TriangleMesh &outmesh) const {
outmesh.merge(retrieve_mesh(MeshType::Support));
outmesh.merge(retrieve_mesh(MeshType::Pad));
@@ -103,9 +89,11 @@ SupportTree::UPtr SupportTree::create(const SupportableMesh &sm,
builder->m_ctl = ctl;
if (sm.cfg.enabled) {
- builder->build(sm);
+ // Execute takes care about the ground_level
+ SupportTreeBuildsteps::execute(*builder, sm);
builder->merge_and_cleanup(); // clean metadata, leave only the meshes.
} else {
+ // If a pad gets added later, it will be in the right Z level
builder->ground_level = sm.emesh.ground_level();
}
diff --git a/src/libslic3r/SLA/SupportTree.hpp b/src/libslic3r/SLA/SupportTree.hpp
index c6255aa2f..4be90161d 100644
--- a/src/libslic3r/SLA/SupportTree.hpp
+++ b/src/libslic3r/SLA/SupportTree.hpp
@@ -5,9 +5,8 @@
#include <memory>
#include <Eigen/Geometry>
-#include <libslic3r/SLA/Common.hpp>
#include <libslic3r/SLA/Pad.hpp>
-#include <libslic3r/SLA/EigenMesh3D.hpp>
+#include <libslic3r/SLA/IndexedMesh.hpp>
#include <libslic3r/SLA/SupportPoint.hpp>
#include <libslic3r/SLA/JobController.hpp>
@@ -32,7 +31,7 @@ enum class PillarConnectionMode
dynamic
};
-struct SupportConfig
+struct SupportTreeConfig
{
bool enabled = true;
@@ -45,6 +44,8 @@ struct SupportConfig
// Radius of the back side of the 3d arrow.
double head_back_radius_mm = 0.5;
+ double head_fallback_radius_mm = 0.25;
+
// Width in mm from the back sphere center to the front sphere center.
double head_width_mm = 1.0;
@@ -95,36 +96,43 @@ struct SupportConfig
// /////////////////////////////////////////////////////////////////////////
// The max Z angle for a normal at which it will get completely ignored.
- static const double normal_cutoff_angle;
+ static const double constexpr normal_cutoff_angle = 150.0 * M_PI / 180.0;
// The shortest distance of any support structure from the model surface
- static const double safety_distance_mm;
+ static const double constexpr safety_distance_mm = 0.5;
- static const double max_solo_pillar_height_mm;
- static const double max_dual_pillar_height_mm;
- static const double optimizer_rel_score_diff;
- static const unsigned optimizer_max_iterations;
- static const unsigned pillar_cascade_neighbors;
+ static const double constexpr max_solo_pillar_height_mm = 15.0;
+ static const double constexpr max_dual_pillar_height_mm = 35.0;
+ static const double constexpr optimizer_rel_score_diff = 1e-6;
+ static const unsigned constexpr optimizer_max_iterations = 1000;
+ static const unsigned constexpr pillar_cascade_neighbors = 3;
};
+// TODO: Part of future refactor
+//class SupportConfig {
+// std::optional<SupportTreeConfig> tree_cfg {std::in_place_t{}}; // fill up
+// std::optional<PadConfig> pad_cfg;
+//};
+
enum class MeshType { Support, Pad };
struct SupportableMesh
{
- EigenMesh3D emesh;
+ IndexedMesh emesh;
SupportPoints pts;
- SupportConfig cfg;
+ SupportTreeConfig cfg;
+ PadConfig pad_cfg;
explicit SupportableMesh(const TriangleMesh & trmsh,
const SupportPoints &sp,
- const SupportConfig &c)
+ const SupportTreeConfig &c)
: emesh{trmsh}, pts{sp}, cfg{c}
{}
- explicit SupportableMesh(const EigenMesh3D &em,
+ explicit SupportableMesh(const IndexedMesh &em,
const SupportPoints &sp,
- const SupportConfig &c)
+ const SupportTreeConfig &c)
: emesh{em}, pts{sp}, cfg{c}
{}
};
diff --git a/src/libslic3r/SLA/SupportTreeBuilder.cpp b/src/libslic3r/SLA/SupportTreeBuilder.cpp
index d385e98a2..daa01ef24 100644
--- a/src/libslic3r/SLA/SupportTreeBuilder.cpp
+++ b/src/libslic3r/SLA/SupportTreeBuilder.cpp
@@ -1,338 +1,26 @@
+#define NOMINMAX
+
#include <libslic3r/SLA/SupportTreeBuilder.hpp>
#include <libslic3r/SLA/SupportTreeBuildsteps.hpp>
+#include <libslic3r/SLA/SupportTreeMesher.hpp>
#include <libslic3r/SLA/Contour3D.hpp>
namespace Slic3r {
namespace sla {
-Contour3D sphere(double rho, Portion portion, double fa) {
-
- Contour3D ret;
-
- // prohibit close to zero radius
- if(rho <= 1e-6 && rho >= -1e-6) return ret;
-
- auto& vertices = ret.points;
- auto& facets = ret.faces3;
-
- // Algorithm:
- // Add points one-by-one to the sphere grid and form facets using relative
- // coordinates. Sphere is composed effectively of a mesh of stacked circles.
-
- // adjust via rounding to get an even multiple for any provided angle.
- double angle = (2*PI / floor(2*PI / fa));
-
- // Ring to be scaled to generate the steps of the sphere
- std::vector<double> ring;
-
- for (double i = 0; i < 2*PI; i+=angle) ring.emplace_back(i);
-
- const auto sbegin = size_t(2*std::get<0>(portion)/angle);
- const auto send = size_t(2*std::get<1>(portion)/angle);
-
- const size_t steps = ring.size();
- const double increment = 1.0 / double(steps);
-
- // special case: first ring connects to 0,0,0
- // insert and form facets.
- if(sbegin == 0)
- vertices.emplace_back(Vec3d(0.0, 0.0, -rho + increment*sbegin*2.0*rho));
-
- auto id = coord_t(vertices.size());
- for (size_t i = 0; i < ring.size(); i++) {
- // Fixed scaling
- const double z = -rho + increment*rho*2.0 * (sbegin + 1.0);
- // radius of the circle for this step.
- const double r = std::sqrt(std::abs(rho*rho - z*z));
- Vec2d b = Eigen::Rotation2Dd(ring[i]) * Eigen::Vector2d(0, r);
- vertices.emplace_back(Vec3d(b(0), b(1), z));
-
- if (sbegin == 0)
- facets.emplace_back((i == 0) ?
- Vec3crd(coord_t(ring.size()), 0, 1) :
- Vec3crd(id - 1, 0, id));
- ++id;
- }
-
- // General case: insert and form facets for each step,
- // joining it to the ring below it.
- for (size_t s = sbegin + 2; s < send - 1; s++) {
- const double z = -rho + increment*double(s*2.0*rho);
- const double r = std::sqrt(std::abs(rho*rho - z*z));
-
- for (size_t i = 0; i < ring.size(); i++) {
- Vec2d b = Eigen::Rotation2Dd(ring[i]) * Eigen::Vector2d(0, r);
- vertices.emplace_back(Vec3d(b(0), b(1), z));
- auto id_ringsize = coord_t(id - int(ring.size()));
- if (i == 0) {
- // wrap around
- facets.emplace_back(Vec3crd(id - 1, id,
- id + coord_t(ring.size() - 1)));
- facets.emplace_back(Vec3crd(id - 1, id_ringsize, id));
- } else {
- facets.emplace_back(Vec3crd(id_ringsize - 1, id_ringsize, id));
- facets.emplace_back(Vec3crd(id - 1, id_ringsize - 1, id));
- }
- id++;
- }
- }
-
- // special case: last ring connects to 0,0,rho*2.0
- // only form facets.
- if(send >= size_t(2*PI / angle)) {
- vertices.emplace_back(Vec3d(0.0, 0.0, -rho + increment*send*2.0*rho));
- for (size_t i = 0; i < ring.size(); i++) {
- auto id_ringsize = coord_t(id - int(ring.size()));
- if (i == 0) {
- // third vertex is on the other side of the ring.
- facets.emplace_back(Vec3crd(id - 1, id_ringsize, id));
- } else {
- auto ci = coord_t(id_ringsize + coord_t(i));
- facets.emplace_back(Vec3crd(ci - 1, ci, id));
- }
- }
- }
- id++;
-
- return ret;
-}
-
-Contour3D cylinder(double r, double h, size_t ssteps, const Vec3d &sp)
-{
- Contour3D ret;
-
- auto steps = int(ssteps);
- auto& points = ret.points;
- auto& indices = ret.faces3;
- points.reserve(2*ssteps);
- double a = 2*PI/steps;
-
- Vec3d jp = sp;
- Vec3d endp = {sp(X), sp(Y), sp(Z) + h};
-
- // Upper circle points
- for(int i = 0; i < steps; ++i) {
- double phi = i*a;
- double ex = endp(X) + r*std::cos(phi);
- double ey = endp(Y) + r*std::sin(phi);
- points.emplace_back(ex, ey, endp(Z));
- }
-
- // Lower circle points
- for(int i = 0; i < steps; ++i) {
- double phi = i*a;
- double x = jp(X) + r*std::cos(phi);
- double y = jp(Y) + r*std::sin(phi);
- points.emplace_back(x, y, jp(Z));
- }
-
- // Now create long triangles connecting upper and lower circles
- indices.reserve(2*ssteps);
- auto offs = steps;
- for(int i = 0; i < steps - 1; ++i) {
- indices.emplace_back(i, i + offs, offs + i + 1);
- indices.emplace_back(i, offs + i + 1, i + 1);
- }
-
- // Last triangle connecting the first and last vertices
- auto last = steps - 1;
- indices.emplace_back(0, last, offs);
- indices.emplace_back(last, offs + last, offs);
-
- // According to the slicing algorithms, we need to aid them with generating
- // a watertight body. So we create a triangle fan for the upper and lower
- // ending of the cylinder to close the geometry.
- points.emplace_back(jp); int ci = int(points.size() - 1);
- for(int i = 0; i < steps - 1; ++i)
- indices.emplace_back(i + offs + 1, i + offs, ci);
-
- indices.emplace_back(offs, steps + offs - 1, ci);
-
- points.emplace_back(endp); ci = int(points.size() - 1);
- for(int i = 0; i < steps - 1; ++i)
- indices.emplace_back(ci, i, i + 1);
-
- indices.emplace_back(steps - 1, 0, ci);
-
- return ret;
-}
-
Head::Head(double r_big_mm,
double r_small_mm,
double length_mm,
double penetration,
const Vec3d &direction,
- const Vec3d &offset,
- const size_t circlesteps)
- : steps(circlesteps)
- , dir(direction)
- , tr(offset)
+ const Vec3d &offset)
+ : dir(direction)
+ , pos(offset)
, r_back_mm(r_big_mm)
, r_pin_mm(r_small_mm)
, width_mm(length_mm)
, penetration_mm(penetration)
{
- assert(width_mm > 0.);
- assert(r_back_mm > 0.);
- assert(r_pin_mm > 0.);
-
- // We create two spheres which will be connected with a robe that fits
- // both circles perfectly.
-
- // Set up the model detail level
- const double detail = 2*PI/steps;
-
- // We don't generate whole circles. Instead, we generate only the
- // portions which are visible (not covered by the robe) To know the
- // exact portion of the bottom and top circles we need to use some
- // rules of tangent circles from which we can derive (using simple
- // triangles the following relations:
-
- // The height of the whole mesh
- const double h = r_big_mm + r_small_mm + width_mm;
- double phi = PI/2 - std::acos( (r_big_mm - r_small_mm) / h );
-
- // To generate a whole circle we would pass a portion of (0, Pi)
- // To generate only a half horizontal circle we can pass (0, Pi/2)
- // The calculated phi is an offset to the half circles needed to smooth
- // the transition from the circle to the robe geometry
-
- auto&& s1 = sphere(r_big_mm, make_portion(0, PI/2 + phi), detail);
- auto&& s2 = sphere(r_small_mm, make_portion(PI/2 + phi, PI), detail);
-
- for(auto& p : s2.points) p.z() += h;
-
- mesh.merge(s1);
- mesh.merge(s2);
-
- for(size_t idx1 = s1.points.size() - steps, idx2 = s1.points.size();
- idx1 < s1.points.size() - 1;
- idx1++, idx2++)
- {
- coord_t i1s1 = coord_t(idx1), i1s2 = coord_t(idx2);
- coord_t i2s1 = i1s1 + 1, i2s2 = i1s2 + 1;
-
- mesh.faces3.emplace_back(i1s1, i2s1, i2s2);
- mesh.faces3.emplace_back(i1s1, i2s2, i1s2);
- }
-
- auto i1s1 = coord_t(s1.points.size()) - coord_t(steps);
- auto i2s1 = coord_t(s1.points.size()) - 1;
- auto i1s2 = coord_t(s1.points.size());
- auto i2s2 = coord_t(s1.points.size()) + coord_t(steps) - 1;
-
- mesh.faces3.emplace_back(i2s2, i2s1, i1s1);
- mesh.faces3.emplace_back(i1s2, i2s2, i1s1);
-
- // To simplify further processing, we translate the mesh so that the
- // last vertex of the pointing sphere (the pinpoint) will be at (0,0,0)
- for(auto& p : mesh.points) p.z() -= (h + r_small_mm - penetration_mm);
-}
-
-Pillar::Pillar(const Vec3d &jp, const Vec3d &endp, double radius, size_t st):
- r(radius), steps(st), endpt(endp), starts_from_head(false)
-{
- assert(steps > 0);
-
- height = jp(Z) - endp(Z);
- if(height > EPSILON) { // Endpoint is below the starting point
-
- // We just create a bridge geometry with the pillar parameters and
- // move the data.
- Contour3D body = cylinder(radius, height, st, endp);
- mesh.points.swap(body.points);
- mesh.faces3.swap(body.faces3);
- }
-}
-
-Pillar &Pillar::add_base(double baseheight, double radius)
-{
- if(baseheight <= 0) return *this;
- if(baseheight > height) baseheight = height;
-
- assert(steps >= 0);
- auto last = int(steps - 1);
-
- if(radius < r ) radius = r;
-
- double a = 2*PI/steps;
- double z = endpt(Z) + baseheight;
-
- for(size_t i = 0; i < steps; ++i) {
- double phi = i*a;
- double x = endpt(X) + r*std::cos(phi);
- double y = endpt(Y) + r*std::sin(phi);
- base.points.emplace_back(x, y, z);
- }
-
- for(size_t i = 0; i < steps; ++i) {
- double phi = i*a;
- double x = endpt(X) + radius*std::cos(phi);
- double y = endpt(Y) + radius*std::sin(phi);
- base.points.emplace_back(x, y, z - baseheight);
- }
-
- auto ep = endpt; ep(Z) += baseheight;
- base.points.emplace_back(endpt);
- base.points.emplace_back(ep);
-
- auto& indices = base.faces3;
- auto hcenter = int(base.points.size() - 1);
- auto lcenter = int(base.points.size() - 2);
- auto offs = int(steps);
- for(int i = 0; i < last; ++i) {
- indices.emplace_back(i, i + offs, offs + i + 1);
- indices.emplace_back(i, offs + i + 1, i + 1);
- indices.emplace_back(i, i + 1, hcenter);
- indices.emplace_back(lcenter, offs + i + 1, offs + i);
- }
-
- indices.emplace_back(0, last, offs);
- indices.emplace_back(last, offs + last, offs);
- indices.emplace_back(hcenter, last, 0);
- indices.emplace_back(offs, offs + last, lcenter);
- return *this;
-}
-
-Bridge::Bridge(const Vec3d &j1, const Vec3d &j2, double r_mm, size_t steps):
- r(r_mm), startp(j1), endp(j2)
-{
- using Quaternion = Eigen::Quaternion<double>;
- Vec3d dir = (j2 - j1).normalized();
- double d = distance(j2, j1);
-
- mesh = cylinder(r, d, steps);
-
- auto quater = Quaternion::FromTwoVectors(Vec3d{0,0,1}, dir);
- for(auto& p : mesh.points) p = quater * p + j1;
-}
-
-CompactBridge::CompactBridge(const Vec3d &sp,
- const Vec3d &ep,
- const Vec3d &n,
- double r,
- bool endball,
- size_t steps)
-{
- Vec3d startp = sp + r * n;
- Vec3d dir = (ep - startp).normalized();
- Vec3d endp = ep - r * dir;
-
- Bridge br(startp, endp, r, steps);
- mesh.merge(br.mesh);
-
- // now add the pins
- double fa = 2*PI/steps;
- auto upperball = sphere(r, Portion{PI / 2 - fa, PI}, fa);
- for(auto& p : upperball.points) p += startp;
-
- if(endball) {
- auto lowerball = sphere(r, Portion{0, PI/2 + 2*fa}, fa);
- for(auto& p : lowerball.points) p += endp;
- mesh.merge(lowerball);
- }
-
- mesh.merge(upperball);
}
Pad::Pad(const TriangleMesh &support_mesh,
@@ -370,7 +58,6 @@ SupportTreeBuilder::SupportTreeBuilder(SupportTreeBuilder &&o)
, m_pillars{std::move(o.m_pillars)}
, m_bridges{std::move(o.m_bridges)}
, m_crossbridges{std::move(o.m_crossbridges)}
- , m_compact_bridges{std::move(o.m_compact_bridges)}
, m_pad{std::move(o.m_pad)}
, m_meshcache{std::move(o.m_meshcache)}
, m_meshcache_valid{o.m_meshcache_valid}
@@ -384,7 +71,6 @@ SupportTreeBuilder::SupportTreeBuilder(const SupportTreeBuilder &o)
, m_pillars{o.m_pillars}
, m_bridges{o.m_bridges}
, m_crossbridges{o.m_crossbridges}
- , m_compact_bridges{o.m_compact_bridges}
, m_pad{o.m_pad}
, m_meshcache{o.m_meshcache}
, m_meshcache_valid{o.m_meshcache_valid}
@@ -399,7 +85,6 @@ SupportTreeBuilder &SupportTreeBuilder::operator=(SupportTreeBuilder &&o)
m_pillars = std::move(o.m_pillars);
m_bridges = std::move(o.m_bridges);
m_crossbridges = std::move(o.m_crossbridges);
- m_compact_bridges = std::move(o.m_compact_bridges);
m_pad = std::move(o.m_pad);
m_meshcache = std::move(o.m_meshcache);
m_meshcache_valid = o.m_meshcache_valid;
@@ -415,7 +100,6 @@ SupportTreeBuilder &SupportTreeBuilder::operator=(const SupportTreeBuilder &o)
m_pillars = o.m_pillars;
m_bridges = o.m_bridges;
m_crossbridges = o.m_crossbridges;
- m_compact_bridges = o.m_compact_bridges;
m_pad = o.m_pad;
m_meshcache = o.m_meshcache;
m_meshcache_valid = o.m_meshcache_valid;
@@ -424,7 +108,19 @@ SupportTreeBuilder &SupportTreeBuilder::operator=(const SupportTreeBuilder &o)
return *this;
}
-const TriangleMesh &SupportTreeBuilder::merged_mesh() const
+void SupportTreeBuilder::add_pillar_base(long pid, double baseheight, double radius)
+{
+ std::lock_guard<Mutex> lk(m_mutex);
+ assert(pid >= 0 && size_t(pid) < m_pillars.size());
+ Pillar& pll = m_pillars[size_t(pid)];
+ m_pedestals.emplace_back(pll.endpt, std::min(baseheight, pll.height),
+ std::max(radius, pll.r), pll.r);
+
+ m_pedestals.back().id = m_pedestals.size() - 1;
+ m_meshcache_valid = false;
+}
+
+const TriangleMesh &SupportTreeBuilder::merged_mesh(size_t steps) const
{
if (m_meshcache_valid) return m_meshcache;
@@ -432,35 +128,44 @@ const TriangleMesh &SupportTreeBuilder::merged_mesh() const
for (auto &head : m_heads) {
if (ctl().stopcondition()) break;
- if (head.is_valid()) merged.merge(head.mesh);
+ if (head.is_valid()) merged.merge(get_mesh(head, steps));
}
- for (auto &stick : m_pillars) {
+ for (auto &pill : m_pillars) {
if (ctl().stopcondition()) break;
- merged.merge(stick.mesh);
- merged.merge(stick.base);
+ merged.merge(get_mesh(pill, steps));
}
-
- for (auto &j : m_junctions) {
+
+ for (auto &pedest : m_pedestals) {
if (ctl().stopcondition()) break;
- merged.merge(j.mesh);
+ merged.merge(get_mesh(pedest, steps));
}
- for (auto &cb : m_compact_bridges) {
+ for (auto &j : m_junctions) {
if (ctl().stopcondition()) break;
- merged.merge(cb.mesh);
+ merged.merge(get_mesh(j, steps));
}
-
+
for (auto &bs : m_bridges) {
if (ctl().stopcondition()) break;
- merged.merge(bs.mesh);
+ merged.merge(get_mesh(bs, steps));
}
for (auto &bs : m_crossbridges) {
if (ctl().stopcondition()) break;
- merged.merge(bs.mesh);
+ merged.merge(get_mesh(bs, steps));
}
-
+
+ for (auto &bs : m_diffbridges) {
+ if (ctl().stopcondition()) break;
+ merged.merge(get_mesh(bs, steps));
+ }
+
+ for (auto &anch : m_anchors) {
+ if (ctl().stopcondition()) break;
+ merged.merge(get_mesh(anch, steps));
+ }
+
if (ctl().stopcondition()) {
// In case of failure we have to return an empty mesh
m_meshcache = TriangleMesh();
@@ -501,7 +206,6 @@ const TriangleMesh &SupportTreeBuilder::merge_and_cleanup()
m_pillars = {};
m_junctions = {};
m_bridges = {};
- m_compact_bridges = {};
return ret;
}
@@ -516,11 +220,4 @@ const TriangleMesh &SupportTreeBuilder::retrieve_mesh(MeshType meshtype) const
return m_meshcache;
}
-bool SupportTreeBuilder::build(const SupportableMesh &sm)
-{
- ground_level = sm.emesh.ground_level() - sm.cfg.object_elevation_mm;
- return SupportTreeBuildsteps::execute(*this, sm);
-}
-
-}
-}
+}} // namespace Slic3r::sla
diff --git a/src/libslic3r/SLA/SupportTreeBuilder.hpp b/src/libslic3r/SLA/SupportTreeBuilder.hpp
index 90cf417c8..f29263ca3 100644
--- a/src/libslic3r/SLA/SupportTreeBuilder.hpp
+++ b/src/libslic3r/SLA/SupportTreeBuilder.hpp
@@ -2,7 +2,6 @@
#define SLA_SUPPORTTREEBUILDER_HPP
#include <libslic3r/SLA/Concurrency.hpp>
-#include <libslic3r/SLA/Common.hpp>
#include <libslic3r/SLA/SupportTree.hpp>
#include <libslic3r/SLA/Contour3D.hpp>
#include <libslic3r/SLA/Pad.hpp>
@@ -50,13 +49,6 @@ namespace sla {
* nearby pillar.
*/
-using Coordf = double;
-using Portion = std::tuple<double, double>;
-
-inline Portion make_portion(double a, double b) {
- return std::make_tuple(a, b);
-}
-
template<class Vec> double distance(const Vec& p) {
return std::sqrt(p.transpose() * p);
}
@@ -66,33 +58,25 @@ template<class Vec> double distance(const Vec& pp1, const Vec& pp2) {
return distance(p);
}
-Contour3D sphere(double rho, Portion portion = make_portion(0.0, 2.0*PI),
- double fa=(2*PI/360));
+const Vec3d DOWN = {0.0, 0.0, -1.0};
-// Down facing cylinder in Z direction with arguments:
-// r: radius
-// h: Height
-// ssteps: how many edges will create the base circle
-// sp: starting point
-Contour3D cylinder(double r, double h, size_t ssteps = 45, const Vec3d &sp = {0,0,0});
+struct SupportTreeNode
+{
+ static const constexpr long ID_UNSET = -1;
-const constexpr long ID_UNSET = -1;
+ long id = ID_UNSET; // For identification withing a tree.
+};
-struct Head {
- Contour3D mesh;
-
- size_t steps = 45;
- Vec3d dir = {0, 0, -1};
- Vec3d tr = {0, 0, 0};
+// A pinhead originating from a support point
+struct Head: public SupportTreeNode {
+ Vec3d dir = DOWN;
+ Vec3d pos = {0, 0, 0};
double r_back_mm = 1;
double r_pin_mm = 0.5;
double width_mm = 2;
double penetration_mm = 0.5;
-
- // For identification purposes. This will be used as the index into the
- // container holding the head structures. See SLASupportTree::Impl
- long id = ID_UNSET;
+
// If there is a pillar connecting to this head, then the id will be set.
long pillar_id = ID_UNSET;
@@ -106,31 +90,23 @@ struct Head {
double r_small_mm,
double length_mm,
double penetration,
- const Vec3d &direction = {0, 0, -1}, // direction (normal to the dull end)
- const Vec3d &offset = {0, 0, 0}, // displacement
- const size_t circlesteps = 45);
-
- void transform()
+ const Vec3d &direction = DOWN, // direction (normal to the dull end)
+ const Vec3d &offset = {0, 0, 0} // displacement
+ );
+
+ inline double real_width() const
{
- using Quaternion = Eigen::Quaternion<double>;
-
- // We rotate the head to the specified direction The head's pointing
- // side is facing upwards so this means that it would hold a support
- // point with a normal pointing straight down. This is the reason of
- // the -1 z coordinate
- auto quatern = Quaternion::FromTwoVectors(Vec3d{0, 0, -1}, dir);
-
- for(auto& p : mesh.points) p = quatern * p + tr;
+ return 2 * r_pin_mm + width_mm + 2 * r_back_mm ;
}
-
+
inline double fullwidth() const
{
- return 2 * r_pin_mm + width_mm + 2*r_back_mm - penetration_mm;
+ return real_width() - penetration_mm;
}
inline Vec3d junction_point() const
{
- return tr + ( 2 * r_pin_mm + width_mm + r_back_mm - penetration_mm)*dir;
+ return pos + (fullwidth() - r_back_mm) * dir;
}
inline double request_pillar_radius(double radius) const
@@ -140,31 +116,17 @@ struct Head {
}
};
-struct Junction {
- Contour3D mesh;
+// A junction connecting bridges and pillars
+struct Junction: public SupportTreeNode {
double r = 1;
- size_t steps = 45;
Vec3d pos;
-
- long id = ID_UNSET;
-
- Junction(const Vec3d& tr, double r_mm, size_t stepnum = 45):
- r(r_mm), steps(stepnum), pos(tr)
- {
- mesh = sphere(r_mm, make_portion(0, PI), 2*PI/steps);
- for(auto& p : mesh.points) p += tr;
- }
+
+ Junction(const Vec3d &tr, double r_mm) : r(r_mm), pos(tr) {}
};
-struct Pillar {
- Contour3D mesh;
- Contour3D base;
- double r = 1;
- size_t steps = 0;
+struct Pillar: public SupportTreeNode {
+ double height, r;
Vec3d endpt;
- double height = 0;
-
- long id = ID_UNSET;
// If the pillar connects to a head, this is the id of that head
bool starts_from_head = true; // Could start from a junction as well
@@ -175,54 +137,52 @@ struct Pillar {
// How many pillars are cascaded with this one
unsigned links = 0;
-
- Pillar(const Vec3d& jp, const Vec3d& endp,
- double radius = 1, size_t st = 45);
-
- Pillar(const Junction &junc, const Vec3d &endp)
- : Pillar(junc.pos, endp, junc.r, junc.steps)
- {}
-
- Pillar(const Head &head, const Vec3d &endp, double radius = 1)
- : Pillar(head.junction_point(), endp,
- head.request_pillar_radius(radius), head.steps)
- {}
-
- inline Vec3d startpoint() const
+
+ Pillar(const Vec3d &endp, double h, double radius = 1.):
+ height{h}, r(radius), endpt(endp), starts_from_head(false) {}
+
+ Vec3d startpoint() const
{
- return {endpt(X), endpt(Y), endpt(Z) + height};
+ return {endpt.x(), endpt.y(), endpt.z() + height};
}
- inline const Vec3d& endpoint() const { return endpt; }
-
- Pillar& add_base(double baseheight = 3, double radius = 2);
+ const Vec3d& endpoint() const { return endpt; }
+};
+
+// A base for pillars or bridges that end on the ground
+struct Pedestal: public SupportTreeNode {
+ Vec3d pos;
+ double height, r_bottom, r_top;
+
+ Pedestal(const Vec3d &p, double h, double rbottom, double rtop)
+ : pos{p}, height{h}, r_bottom{rbottom}, r_top{rtop}
+ {}
};
+// This is the thing that anchors a pillar or bridge to the model body.
+// It is actually a reverse pinhead.
+struct Anchor: public Head { using Head::Head; };
+
// A Bridge between two pillars (with junction endpoints)
-struct Bridge {
- Contour3D mesh;
+struct Bridge: public SupportTreeNode {
double r = 0.8;
- long id = ID_UNSET;
Vec3d startp = Vec3d::Zero(), endp = Vec3d::Zero();
Bridge(const Vec3d &j1,
const Vec3d &j2,
- double r_mm = 0.8,
- size_t steps = 45);
+ double r_mm = 0.8): r{r_mm}, startp{j1}, endp{j2}
+ {}
+
+ double get_length() const { return (endp - startp).norm(); }
+ Vec3d get_dir() const { return (endp - startp).normalized(); }
};
-// A bridge that spans from model surface to model surface with small connecting
-// edges on the endpoints. Used for headless support points.
-struct CompactBridge {
- Contour3D mesh;
- long id = ID_UNSET;
-
- CompactBridge(const Vec3d& sp,
- const Vec3d& ep,
- const Vec3d& n,
- double r,
- bool endball = true,
- size_t steps = 45);
+struct DiffBridge: public Bridge {
+ double end_r;
+
+ DiffBridge(const Vec3d &p_s, const Vec3d &p_e, double r_s, double r_e)
+ : Bridge{p_s, p_e, r_s}, end_r{r_e}
+ {}
};
// A wrapper struct around the pad
@@ -258,13 +218,16 @@ struct Pad {
// merged mesh. It can be retrieved using a dedicated method (pad())
class SupportTreeBuilder: public SupportTree {
// For heads it is beneficial to use the same IDs as for the support points.
- std::vector<Head> m_heads;
- std::vector<size_t> m_head_indices;
- std::vector<Pillar> m_pillars;
- std::vector<Junction> m_junctions;
- std::vector<Bridge> m_bridges;
- std::vector<Bridge> m_crossbridges;
- std::vector<CompactBridge> m_compact_bridges;
+ std::vector<Head> m_heads;
+ std::vector<size_t> m_head_indices;
+ std::vector<Pillar> m_pillars;
+ std::vector<Junction> m_junctions;
+ std::vector<Bridge> m_bridges;
+ std::vector<Bridge> m_crossbridges;
+ std::vector<DiffBridge> m_diffbridges;
+ std::vector<Pedestal> m_pedestals;
+ std::vector<Anchor> m_anchors;
+
Pad m_pad;
using Mutex = ccr::SpinningMutex;
@@ -274,8 +237,8 @@ class SupportTreeBuilder: public SupportTree {
mutable bool m_meshcache_valid = false;
mutable double m_model_height = 0; // the full height of the model
- template<class...Args>
- const Bridge& _add_bridge(std::vector<Bridge> &br, Args&&... args)
+ template<class BridgeT, class...Args>
+ const BridgeT& _add_bridge(std::vector<BridgeT> &br, Args&&... args)
{
std::lock_guard<Mutex> lk(m_mutex);
br.emplace_back(std::forward<Args>(args)...);
@@ -306,7 +269,7 @@ public:
return m_heads.back();
}
- template<class...Args> long add_pillar(long headid, Args&&... args)
+ template<class...Args> long add_pillar(long headid, double length)
{
std::lock_guard<Mutex> lk(m_mutex);
if (m_pillars.capacity() < m_heads.size())
@@ -315,7 +278,9 @@ public:
assert(headid >= 0 && size_t(headid) < m_head_indices.size());
Head &head = m_heads[m_head_indices[size_t(headid)]];
- m_pillars.emplace_back(head, std::forward<Args>(args)...);
+ Vec3d hjp = head.junction_point() - Vec3d{0, 0, length};
+ m_pillars.emplace_back(hjp, length, head.r_back_mm);
+
Pillar& pillar = m_pillars.back();
pillar.id = long(m_pillars.size() - 1);
head.pillar_id = pillar.id;
@@ -326,11 +291,15 @@ public:
return pillar.id;
}
- void add_pillar_base(long pid, double baseheight = 3, double radius = 2)
+ void add_pillar_base(long pid, double baseheight = 3, double radius = 2);
+
+ template<class...Args> const Anchor& add_anchor(Args&&...args)
{
std::lock_guard<Mutex> lk(m_mutex);
- assert(pid >= 0 && size_t(pid) < m_pillars.size());
- m_pillars[size_t(pid)].add_base(baseheight, radius);
+ m_anchors.emplace_back(std::forward<Args>(args)...);
+ m_anchors.back().id = long(m_junctions.size() - 1);
+ m_meshcache_valid = false;
+ return m_anchors.back();
}
void increment_bridges(const Pillar& pillar)
@@ -371,17 +340,6 @@ public:
return pillar.id;
}
- const Pillar& head_pillar(unsigned headid) const
- {
- std::lock_guard<Mutex> lk(m_mutex);
- assert(headid < m_head_indices.size());
-
- const Head& h = m_heads[m_head_indices[headid]];
- assert(h.pillar_id >= 0 && h.pillar_id < long(m_pillars.size()));
-
- return m_pillars[size_t(h.pillar_id)];
- }
-
template<class...Args> const Junction& add_junction(Args&&... args)
{
std::lock_guard<Mutex> lk(m_mutex);
@@ -391,18 +349,18 @@ public:
return m_junctions.back();
}
- const Bridge& add_bridge(const Vec3d &s, const Vec3d &e, double r, size_t n = 45)
+ const Bridge& add_bridge(const Vec3d &s, const Vec3d &e, double r)
{
- return _add_bridge(m_bridges, s, e, r, n);
+ return _add_bridge(m_bridges, s, e, r);
}
- const Bridge& add_bridge(long headid, const Vec3d &endp, size_t s = 45)
+ const Bridge& add_bridge(long headid, const Vec3d &endp)
{
std::lock_guard<Mutex> lk(m_mutex);
assert(headid >= 0 && size_t(headid) < m_head_indices.size());
Head &h = m_heads[m_head_indices[size_t(headid)]];
- m_bridges.emplace_back(h.junction_point(), endp, h.r_back_mm, s);
+ m_bridges.emplace_back(h.junction_point(), endp, h.r_back_mm);
m_bridges.back().id = long(m_bridges.size() - 1);
h.bridge_id = m_bridges.back().id;
@@ -414,14 +372,10 @@ public:
{
return _add_bridge(m_crossbridges, std::forward<Args>(args)...);
}
-
- template<class...Args> const CompactBridge& add_compact_bridge(Args&&...args)
+
+ template<class...Args> const DiffBridge& add_diffbridge(Args&&... args)
{
- std::lock_guard<Mutex> lk(m_mutex);
- m_compact_bridges.emplace_back(std::forward<Args>(args)...);
- m_compact_bridges.back().id = long(m_compact_bridges.size() - 1);
- m_meshcache_valid = false;
- return m_compact_bridges.back();
+ return _add_bridge(m_diffbridges, std::forward<Args>(args)...);
}
Head &head(unsigned id)
@@ -439,7 +393,7 @@ public:
}
inline const std::vector<Pillar> &pillars() const { return m_pillars; }
- inline const std::vector<Head> &heads() const { return m_heads; }
+ inline const std::vector<Head> &heads() const { return m_heads; }
inline const std::vector<Bridge> &bridges() const { return m_bridges; }
inline const std::vector<Bridge> &crossbridges() const { return m_crossbridges; }
@@ -464,7 +418,7 @@ public:
const Pad& pad() const { return m_pad; }
// WITHOUT THE PAD!!!
- const TriangleMesh &merged_mesh() const;
+ const TriangleMesh &merged_mesh(size_t steps = 45) const;
// WITH THE PAD
double full_height() const;
@@ -488,8 +442,6 @@ public:
virtual const TriangleMesh &retrieve_mesh(
MeshType meshtype = MeshType::Support) const override;
-
- bool build(const SupportableMesh &supportable_mesh);
};
}} // namespace Slic3r::sla
diff --git a/src/libslic3r/SLA/SupportTreeBuildsteps.cpp b/src/libslic3r/SLA/SupportTreeBuildsteps.cpp
index 5d60d7513..3c39c64e6 100644
--- a/src/libslic3r/SLA/SupportTreeBuildsteps.cpp
+++ b/src/libslic3r/SLA/SupportTreeBuildsteps.cpp
@@ -1,19 +1,36 @@
#include <libslic3r/SLA/SupportTreeBuildsteps.hpp>
-#include <libnest2d/optimizers/nlopt/genetic.hpp>
-#include <libnest2d/optimizers/nlopt/subplex.hpp>
+#include <libslic3r/SLA/SpatIndex.hpp>
+#include <libslic3r/Optimize/NLoptOptimizer.hpp>
#include <boost/log/trivial.hpp>
namespace Slic3r {
namespace sla {
-static const Vec3d DOWN = {0.0, 0.0, -1.0};
+using Slic3r::opt::initvals;
+using Slic3r::opt::bounds;
+using Slic3r::opt::StopCriteria;
+using Slic3r::opt::Optimizer;
+using Slic3r::opt::AlgNLoptSubplex;
+using Slic3r::opt::AlgNLoptGenetic;
-using libnest2d::opt::initvals;
-using libnest2d::opt::bound;
-using libnest2d::opt::StopCriteria;
-using libnest2d::opt::GeneticOptimizer;
-using libnest2d::opt::SubplexOptimizer;
+StopCriteria get_criteria(const SupportTreeConfig &cfg)
+{
+ return StopCriteria{}
+ .rel_score_diff(cfg.optimizer_rel_score_diff)
+ .max_iterations(cfg.optimizer_max_iterations);
+}
+
+template<class C, class Hit = IndexedMesh::hit_result>
+static Hit min_hit(const C &hits)
+{
+ auto mit = std::min_element(hits.begin(), hits.end(),
+ [](const Hit &h1, const Hit &h2) {
+ return h1.distance() < h2.distance();
+ });
+
+ return *mit;
+}
SupportTreeBuildsteps::SupportTreeBuildsteps(SupportTreeBuilder & builder,
const SupportableMesh &sm)
@@ -27,7 +44,7 @@ SupportTreeBuildsteps::SupportTreeBuildsteps(SupportTreeBuilder & builder,
{
// Prepare the support points in Eigen/IGL format as well, we will use
// it mostly in this form.
-
+
long i = 0;
for (const SupportPoint &sp : m_support_pts) {
m_points.row(i)(X) = double(sp.pos(X));
@@ -41,9 +58,11 @@ bool SupportTreeBuildsteps::execute(SupportTreeBuilder & builder,
const SupportableMesh &sm)
{
if(sm.pts.empty()) return false;
-
+
+ builder.ground_level = sm.emesh.ground_level() - sm.cfg.object_elevation_mm;
+
SupportTreeBuildsteps alg(builder, sm);
-
+
// Let's define the individual steps of the processing. We can experiment
// later with the ordering and the dependencies between them.
enum Steps {
@@ -54,59 +73,52 @@ bool SupportTreeBuildsteps::execute(SupportTreeBuilder & builder,
ROUTING_GROUND,
ROUTING_NONGROUND,
CASCADE_PILLARS,
- HEADLESS,
MERGE_RESULT,
DONE,
ABORT,
NUM_STEPS
//...
};
-
+
// Collect the algorithm steps into a nice sequence
std::array<std::function<void()>, NUM_STEPS> program = {
[] () {
// Begin...
// Potentially clear up the shared data (not needed for now)
},
-
+
std::bind(&SupportTreeBuildsteps::filter, &alg),
-
+
std::bind(&SupportTreeBuildsteps::add_pinheads, &alg),
-
+
std::bind(&SupportTreeBuildsteps::classify, &alg),
-
+
std::bind(&SupportTreeBuildsteps::routing_to_ground, &alg),
-
+
std::bind(&SupportTreeBuildsteps::routing_to_model, &alg),
-
+
std::bind(&SupportTreeBuildsteps::interconnect_pillars, &alg),
-
- std::bind(&SupportTreeBuildsteps::routing_headless, &alg),
-
+
std::bind(&SupportTreeBuildsteps::merge_result, &alg),
-
+
[] () {
// Done
},
-
+
[] () {
// Abort
}
};
-
+
Steps pc = BEGIN;
-
+
if(sm.cfg.ground_facing_only) {
program[ROUTING_NONGROUND] = []() {
BOOST_LOG_TRIVIAL(info)
<< "Skipping model-facing supports as requested.";
};
- program[HEADLESS] = []() {
- BOOST_LOG_TRIVIAL(info) << "Skipping headless stick generation as"
- " requested.";
- };
}
-
+
// Let's define a simple automaton that will run our program.
auto progress = [&builder, &pc] () {
static const std::array<std::string, NUM_STEPS> stepstr {
@@ -117,12 +129,11 @@ bool SupportTreeBuildsteps::execute(SupportTreeBuilder & builder,
"Routing to ground",
"Routing supports to model surface",
"Interconnecting pillars",
- "Processing small holes",
"Merging support mesh",
"Done",
"Abort"
};
-
+
static const std::array<unsigned, NUM_STEPS> stepstate {
0,
10,
@@ -131,14 +142,13 @@ bool SupportTreeBuildsteps::execute(SupportTreeBuilder & builder,
60,
70,
80,
- 85,
99,
100,
0
};
-
+
if(builder.ctl().stopcondition()) pc = ABORT;
-
+
switch(pc) {
case BEGIN: pc = FILTER; break;
case FILTER: pc = PINHEADS; break;
@@ -146,143 +156,78 @@ bool SupportTreeBuildsteps::execute(SupportTreeBuilder & builder,
case CLASSIFY: pc = ROUTING_GROUND; break;
case ROUTING_GROUND: pc = ROUTING_NONGROUND; break;
case ROUTING_NONGROUND: pc = CASCADE_PILLARS; break;
- case CASCADE_PILLARS: pc = HEADLESS; break;
- case HEADLESS: pc = MERGE_RESULT; break;
+ case CASCADE_PILLARS: pc = MERGE_RESULT; break;
case MERGE_RESULT: pc = DONE; break;
case DONE:
case ABORT: break;
default: ;
}
-
+
builder.ctl().statuscb(stepstate[pc], stepstr[pc]);
};
-
+
// Just here we run the computation...
while(pc < DONE) {
progress();
program[pc]();
}
-
- return pc == ABORT;
-}
-// Give points on a 3D ring with given center, radius and orientation
-// method based on:
-// https://math.stackexchange.com/questions/73237/parametric-equation-of-a-circle-in-3d-space
-template<size_t N>
-class PointRing {
- std::array<double, N> m_phis;
-
- // Two vectors that will be perpendicular to each other and to the
- // axis. Values for a(X) and a(Y) are now arbitrary, a(Z) is just a
- // placeholder.
- // a and b vectors are perpendicular to the ring direction and to each other.
- // Together they define the plane where we have to iterate with the
- // given angles in the 'm_phis' vector
- Vec3d a = {0, 1, 0}, b;
- double m_radius = 0.;
-
- static inline bool constexpr is_one(double val)
- {
- return std::abs(std::abs(val) - 1) < 1e-20;
- }
-
-public:
-
- PointRing(const Vec3d &n)
- {
- m_phis = linspace_array<N>(0., 2 * PI);
-
- // We have to address the case when the direction vector v (same as
- // dir) is coincident with one of the world axes. In this case two of
- // its components will be completely zero and one is 1.0. Our method
- // becomes dangerous here due to division with zero. Instead, vector
- // 'a' can be an element-wise rotated version of 'v'
- if(is_one(n(X)) || is_one(n(Y)) || is_one(n(Z))) {
- a = {n(Z), n(X), n(Y)};
- b = {n(Y), n(Z), n(X)};
- }
- else {
- a(Z) = -(n(Y)*a(Y)) / n(Z); a.normalize();
- b = a.cross(n);
- }
- }
-
- Vec3d get(size_t idx, const Vec3d src, double r) const
- {
- double phi = m_phis[idx];
- double sinphi = std::sin(phi);
- double cosphi = std::cos(phi);
-
- double rpscos = r * cosphi;
- double rpssin = r * sinphi;
-
- // Point on the sphere
- return {src(X) + rpscos * a(X) + rpssin * b(X),
- src(Y) + rpscos * a(Y) + rpssin * b(Y),
- src(Z) + rpscos * a(Z) + rpssin * b(Z)};
- }
-};
-
-template<class C, class Hit = EigenMesh3D::hit_result>
-static Hit min_hit(const C &hits)
-{
- auto mit = std::min_element(hits.begin(), hits.end(),
- [](const Hit &h1, const Hit &h2) {
- return h1.distance() < h2.distance();
- });
-
- return *mit;
+ return pc == ABORT;
}
-EigenMesh3D::hit_result SupportTreeBuildsteps::pinhead_mesh_intersect(
- const Vec3d &s, const Vec3d &dir, double r_pin, double r_back, double width)
+IndexedMesh::hit_result SupportTreeBuildsteps::pinhead_mesh_intersect(
+ const Vec3d &s,
+ const Vec3d &dir,
+ double r_pin,
+ double r_back,
+ double width,
+ double sd)
{
static const size_t SAMPLES = 8;
-
+
// Move away slightly from the touching point to avoid raycasting on the
// inner surface of the mesh.
-
- const double& sd = m_cfg.safety_distance_mm;
-
+
auto& m = m_mesh;
- using HitResult = EigenMesh3D::hit_result;
-
+ using HitResult = IndexedMesh::hit_result;
+
// Hit results
std::array<HitResult, SAMPLES> hits;
-
+
struct Rings {
double rpin;
double rback;
Vec3d spin;
Vec3d sback;
PointRing<SAMPLES> ring;
-
+
Vec3d backring(size_t idx) { return ring.get(idx, sback, rback); }
Vec3d pinring(size_t idx) { return ring.get(idx, spin, rpin); }
} rings {r_pin + sd, r_back + sd, s, s + width * dir, dir};
-
+
// We will shoot multiple rays from the head pinpoint in the direction
// of the pinhead robe (side) surface. The result will be the smallest
// hit distance.
-
- ccr::enumerate(hits.begin(), hits.end(),
- [&m, &rings, sd](HitResult &hit, size_t i) {
-
+
+ ccr::for_each(size_t(0), hits.size(),
+ [&m, &rings, sd, &hits](size_t i) {
+
// Point on the circle on the pin sphere
Vec3d ps = rings.pinring(i);
// This is the point on the circle on the back sphere
Vec3d p = rings.backring(i);
-
+
+ auto &hit = hits[i];
+
// Point ps is not on mesh but can be inside or
// outside as well. This would cause many problems
// with ray-casting. To detect the position we will
// use the ray-casting result (which has an is_inside
- // predicate).
-
+ // predicate).
+
Vec3d n = (p - ps).normalized();
auto q = m.query_ray_hit(ps + sd * n, n);
-
+
if (q.is_inside()) { // the hit is inside the model
if (q.distance() > rings.rpin) {
// If we are inside the model and the hit
@@ -307,40 +252,40 @@ EigenMesh3D::hit_result SupportTreeBuildsteps::pinhead_mesh_intersect(
} else
hit = q;
});
-
+
return min_hit(hits);
}
-EigenMesh3D::hit_result SupportTreeBuildsteps::bridge_mesh_intersect(
- const Vec3d &src, const Vec3d &dir, double r, bool ins_check)
+IndexedMesh::hit_result SupportTreeBuildsteps::bridge_mesh_intersect(
+ const Vec3d &src, const Vec3d &dir, double r, double sd)
{
static const size_t SAMPLES = 8;
PointRing<SAMPLES> ring{dir};
-
- using Hit = EigenMesh3D::hit_result;
-
+
+ using Hit = IndexedMesh::hit_result;
+
// Hit results
std::array<Hit, SAMPLES> hits;
-
- ccr::enumerate(hits.begin(), hits.end(),
- [this, r, src, ins_check, &ring, dir] (Hit &hit, size_t i) {
-
- const double sd = m_cfg.safety_distance_mm;
-
+
+ ccr::for_each(size_t(0), hits.size(),
+ [this, r, src, /*ins_check,*/ &ring, dir, sd, &hits] (size_t i)
+ {
+ Hit &hit = hits[i];
+
// Point on the circle on the pin sphere
Vec3d p = ring.get(i, src, r + sd);
-
- auto hr = m_mesh.query_ray_hit(p + sd * dir, dir);
-
- if(ins_check && hr.is_inside()) {
+
+ auto hr = m_mesh.query_ray_hit(p + r * dir, dir);
+
+ if(/*ins_check && */hr.is_inside()) {
if(hr.distance() > 2 * r + sd) hit = Hit(0.0);
else {
// re-cast the ray from the outside of the object
- hit = m_mesh.query_ray_hit(p + (hr.distance() + 2 * sd) * dir, dir);
+ hit = m_mesh.query_ray_hit(p + (hr.distance() + EPSILON) * dir, dir);
}
} else hit = hr;
});
-
+
return min_hit(hits);
}
@@ -354,61 +299,61 @@ bool SupportTreeBuildsteps::interconnect(const Pillar &pillar,
// shorter pillar is too short to start a new bridge but the taller
// pillar could still be bridged with the shorter one.
bool was_connected = false;
-
+
Vec3d supper = pillar.startpoint();
Vec3d slower = nextpillar.startpoint();
Vec3d eupper = pillar.endpoint();
Vec3d elower = nextpillar.endpoint();
-
+
double zmin = m_builder.ground_level + m_cfg.base_height_mm;
eupper(Z) = std::max(eupper(Z), zmin);
elower(Z) = std::max(elower(Z), zmin);
-
+
// The usable length of both pillars should be positive
if(slower(Z) - elower(Z) < 0) return false;
if(supper(Z) - eupper(Z) < 0) return false;
-
+
double pillar_dist = distance(Vec2d{slower(X), slower(Y)},
Vec2d{supper(X), supper(Y)});
double bridge_distance = pillar_dist / std::cos(-m_cfg.bridge_slope);
double zstep = pillar_dist * std::tan(-m_cfg.bridge_slope);
-
+
if(pillar_dist < 2 * m_cfg.head_back_radius_mm ||
pillar_dist > m_cfg.max_pillar_link_distance_mm) return false;
-
+
if(supper(Z) < slower(Z)) supper.swap(slower);
if(eupper(Z) < elower(Z)) eupper.swap(elower);
-
+
double startz = 0, endz = 0;
-
+
startz = slower(Z) - zstep < supper(Z) ? slower(Z) - zstep : slower(Z);
endz = eupper(Z) + zstep > elower(Z) ? eupper(Z) + zstep : eupper(Z);
-
+
if(slower(Z) - eupper(Z) < std::abs(zstep)) {
// no space for even one cross
-
+
// Get max available space
startz = std::min(supper(Z), slower(Z) - zstep);
endz = std::max(eupper(Z) + zstep, elower(Z));
-
+
// Align to center
double available_dist = (startz - endz);
double rounds = std::floor(available_dist / std::abs(zstep));
startz -= 0.5 * (available_dist - rounds * std::abs(zstep));
}
-
+
auto pcm = m_cfg.pillar_connection_mode;
bool docrosses =
pcm == PillarConnectionMode::cross ||
(pcm == PillarConnectionMode::dynamic &&
pillar_dist > 2*m_cfg.base_radius_mm);
-
+
// 'sj' means starting junction, 'ej' is the end junction of a bridge.
// They will be swapped in every iteration thus the zig-zag pattern.
// According to a config parameter, a second bridge may be added which
// results in a cross connection between the pillars.
Vec3d sj = supper, ej = slower; sj(Z) = startz; ej(Z) = sj(Z) + zstep;
-
+
// TODO: This is a workaround to not have a faulty last bridge
while(ej(Z) >= eupper(Z) /*endz*/) {
if(bridge_mesh_distance(sj, dirv(sj, ej), pillar.r) >= bridge_distance)
@@ -416,7 +361,7 @@ bool SupportTreeBuildsteps::interconnect(const Pillar &pillar,
m_builder.add_crossbridge(sj, ej, pillar.r);
was_connected = true;
}
-
+
// double bridging: (crosses)
if(docrosses) {
Vec3d sjback(ej(X), ej(Y), sj(Z));
@@ -429,11 +374,11 @@ bool SupportTreeBuildsteps::interconnect(const Pillar &pillar,
was_connected = true;
}
}
-
+
sj.swap(ej);
ej(Z) = sj(Z) + zstep;
}
-
+
return was_connected;
}
@@ -443,228 +388,242 @@ bool SupportTreeBuildsteps::connect_to_nearpillar(const Head &head,
auto nearpillar = [this, nearpillar_id]() -> const Pillar& {
return m_builder.pillar(nearpillar_id);
};
-
- if (m_builder.bridgecount(nearpillar()) > m_cfg.max_bridges_on_pillar)
+
+ if (m_builder.bridgecount(nearpillar()) > m_cfg.max_bridges_on_pillar)
return false;
-
+
Vec3d headjp = head.junction_point();
Vec3d nearjp_u = nearpillar().startpoint();
Vec3d nearjp_l = nearpillar().endpoint();
-
+
double r = head.r_back_mm;
double d2d = distance(to_2d(headjp), to_2d(nearjp_u));
double d3d = distance(headjp, nearjp_u);
-
+
double hdiff = nearjp_u(Z) - headjp(Z);
double slope = std::atan2(hdiff, d2d);
-
+
Vec3d bridgestart = headjp;
Vec3d bridgeend = nearjp_u;
- double max_len = m_cfg.max_bridge_length_mm;
+ double max_len = r * m_cfg.max_bridge_length_mm / m_cfg.head_back_radius_mm;
double max_slope = m_cfg.bridge_slope;
double zdiff = 0.0;
-
+
// check the default situation if feasible for a bridge
if(d3d > max_len || slope > -max_slope) {
// not feasible to connect the two head junctions. We have to search
// for a suitable touch point.
-
+
double Zdown = headjp(Z) + d2d * std::tan(-max_slope);
Vec3d touchjp = bridgeend; touchjp(Z) = Zdown;
double D = distance(headjp, touchjp);
zdiff = Zdown - nearjp_u(Z);
-
+
if(zdiff > 0) {
Zdown -= zdiff;
bridgestart(Z) -= zdiff;
touchjp(Z) = Zdown;
-
+
double t = bridge_mesh_distance(headjp, DOWN, r);
-
+
// We can't insert a pillar under the source head to connect
// with the nearby pillar's starting junction
if(t < zdiff) return false;
}
-
+
if(Zdown <= nearjp_u(Z) && Zdown >= nearjp_l(Z) && D < max_len)
bridgeend(Z) = Zdown;
else
return false;
}
-
+
// There will be a minimum distance from the ground where the
// bridge is allowed to connect. This is an empiric value.
- double minz = m_builder.ground_level + 2 * m_cfg.head_width_mm;
+ double minz = m_builder.ground_level + 4 * head.r_back_mm;
if(bridgeend(Z) < minz) return false;
-
+
double t = bridge_mesh_distance(bridgestart, dirv(bridgestart, bridgeend), r);
-
+
// Cannot insert the bridge. (further search might not worth the hassle)
if(t < distance(bridgestart, bridgeend)) return false;
-
+
std::lock_guard<ccr::BlockingMutex> lk(m_bridge_mutex);
-
+
if (m_builder.bridgecount(nearpillar()) < m_cfg.max_bridges_on_pillar) {
// A partial pillar is needed under the starting head.
if(zdiff > 0) {
- m_builder.add_pillar(head.id, bridgestart, r);
+ m_builder.add_pillar(head.id, headjp.z() - bridgestart.z());
m_builder.add_junction(bridgestart, r);
- m_builder.add_bridge(bridgestart, bridgeend, head.r_back_mm);
+ m_builder.add_bridge(bridgestart, bridgeend, r);
} else {
m_builder.add_bridge(head.id, bridgeend);
}
-
+
m_builder.increment_bridges(nearpillar());
} else return false;
-
- return true;
-}
-bool SupportTreeBuildsteps::search_pillar_and_connect(const Head &head)
-{
- PointIndex spindex = m_pillar_index.guarded_clone();
-
- long nearest_id = ID_UNSET;
-
- Vec3d querypoint = head.junction_point();
-
- while(nearest_id < 0 && !spindex.empty()) { m_thr();
- // loop until a suitable head is not found
- // if there is a pillar closer than the cluster center
- // (this may happen as the clustering is not perfect)
- // than we will bridge to this closer pillar
-
- Vec3d qp(querypoint(X), querypoint(Y), m_builder.ground_level);
- auto qres = spindex.nearest(qp, 1);
- if(qres.empty()) break;
-
- auto ne = qres.front();
- nearest_id = ne.second;
-
- if(nearest_id >= 0) {
- if(size_t(nearest_id) < m_builder.pillarcount()) {
- if(!connect_to_nearpillar(head, nearest_id)) {
- nearest_id = ID_UNSET; // continue searching
- spindex.remove(ne); // without the current pillar
- }
- }
- }
- }
-
- return nearest_id >= 0;
+ return true;
}
-void SupportTreeBuildsteps::create_ground_pillar(const Vec3d &jp,
+bool SupportTreeBuildsteps::create_ground_pillar(const Vec3d &hjp,
const Vec3d &sourcedir,
double radius,
long head_id)
{
- const double SLOPE = 1. / std::cos(m_cfg.bridge_slope);
-
- double gndlvl = m_builder.ground_level;
- Vec3d endp = {jp(X), jp(Y), gndlvl};
- double sd = m_cfg.pillar_base_safety_distance_mm;
- long pillar_id = ID_UNSET;
- double min_dist = sd + m_cfg.base_radius_mm + EPSILON;
- double dist = 0;
- bool can_add_base = true;
- bool normal_mode = true;
-
- // If in zero elevation mode and the pillar is too close to the model body,
- // the support pillar can not be placed in the gap between the model and
- // the pad, and the pillar bases must not touch the model body either.
- // To solve this, a corrector bridge is inserted between the starting point
- // (jp) and the new pillar.
- if (m_cfg.object_elevation_mm < EPSILON
- && (dist = std::sqrt(m_mesh.squared_distance(endp))) < min_dist) {
- // Get the distance from the mesh. This can be later optimized
- // to get the distance in 2D plane because we are dealing with
- // the ground level only.
-
- normal_mode = false;
-
- // The min distance needed to move away from the model in XY plane.
- double current_d = min_dist - dist;
- double current_bride_d = SLOPE * current_d;
+ Vec3d jp = hjp, endp = jp, dir = sourcedir;
+ long pillar_id = SupportTreeNode::ID_UNSET;
+ bool can_add_base = false, non_head = false;
+
+ double gndlvl = 0.; // The Z level where pedestals should be
+ double jp_gnd = 0.; // The lowest Z where a junction center can be
+ double gap_dist = 0.; // The gap distance between the model and the pad
+
+ auto to_floor = [&gndlvl](const Vec3d &p) { return Vec3d{p.x(), p.y(), gndlvl}; };
+ auto eval_limits = [this, &radius, &can_add_base, &gndlvl, &gap_dist, &jp_gnd]
+ (bool base_en = true)
+ {
+ can_add_base = base_en && radius >= m_cfg.head_back_radius_mm;
+ double base_r = can_add_base ? m_cfg.base_radius_mm : 0.;
+ gndlvl = m_builder.ground_level;
+ if (!can_add_base) gndlvl -= m_mesh.ground_level_offset();
+ jp_gnd = gndlvl + (can_add_base ? 0. : m_cfg.head_back_radius_mm);
+ gap_dist = m_cfg.pillar_base_safety_distance_mm + base_r + EPSILON;
+ };
+
+ eval_limits();
+
+ // We are dealing with a mini pillar that's potentially too long
+ if (radius < m_cfg.head_back_radius_mm && jp.z() - gndlvl > 20 * radius)
+ {
+ std::optional<DiffBridge> diffbr =
+ search_widening_path(jp, dir, radius, m_cfg.head_back_radius_mm);
+
+ if (diffbr && diffbr->endp.z() > jp_gnd) {
+ auto &br = m_builder.add_diffbridge(*diffbr);
+ if (head_id >= 0) m_builder.head(head_id).bridge_id = br.id;
+ endp = diffbr->endp;
+ radius = diffbr->end_r;
+ m_builder.add_junction(endp, radius);
+ non_head = true;
+ dir = diffbr->get_dir();
+ eval_limits();
+ } else return false;
+ }
+
+ if (m_cfg.object_elevation_mm < EPSILON)
+ {
// get a suitable direction for the corrector bridge. It is the
// original sourcedir's azimuth but the polar angle is saturated to the
// configured bridge slope.
- auto [polar, azimuth] = dir_to_spheric(sourcedir);
+ auto [polar, azimuth] = dir_to_spheric(dir);
polar = PI - m_cfg.bridge_slope;
- auto dir = spheric_to_dir(polar, azimuth).normalized();
-
- StopCriteria scr;
- scr.stop_score = min_dist;
- SubplexOptimizer solver(scr);
-
- // Search for a distance along the corrector bridge to move the endpoint
- // sufficiently away form the model body. The first few optimization
- // cycles should succeed here.
- auto result = solver.optimize_max(
- [this, dir, jp, gndlvl](double mv) {
- Vec3d endpt = jp + mv * dir;
- endpt(Z) = gndlvl;
- return std::sqrt(m_mesh.squared_distance(endpt));
- },
- initvals(current_bride_d),
- bound(0.0, m_cfg.max_bridge_length_mm - current_bride_d));
-
- endp = jp + std::get<0>(result.optimum) * dir;
- Vec3d pgnd = {endp(X), endp(Y), gndlvl};
- can_add_base = result.score > min_dist;
-
- double gnd_offs = m_mesh.ground_level_offset();
- auto abort_in_shame =
- [gnd_offs, &normal_mode, &can_add_base, &endp, jp, gndlvl]()
- {
- normal_mode = true;
- can_add_base = false; // Nothing left to do, hope for the best
- endp = {jp(X), jp(Y), gndlvl - gnd_offs };
- };
-
- // We have to check if the bridge is feasible.
- if (bridge_mesh_distance(jp, dir, radius) < (endp - jp).norm())
- abort_in_shame();
- else {
- // If the new endpoint is below ground, do not make a pillar
- if (endp(Z) < gndlvl)
- endp = endp - SLOPE * (gndlvl - endp(Z)) * dir; // back off
- else {
-
- auto hit = bridge_mesh_intersect(endp, DOWN, radius);
- if (!std::isinf(hit.distance())) abort_in_shame();
-
- pillar_id = m_builder.add_pillar(endp, pgnd, radius);
-
- if (can_add_base)
- m_builder.add_pillar_base(pillar_id, m_cfg.base_height_mm,
- m_cfg.base_radius_mm);
+ Vec3d d = spheric_to_dir(polar, azimuth).normalized();
+ double t = bridge_mesh_distance(endp, dir, radius);
+ double tmax = std::min(m_cfg.max_bridge_length_mm, t);
+ t = 0.;
+
+ double zd = endp.z() - jp_gnd;
+ double tmax2 = zd / std::sqrt(1 - m_cfg.bridge_slope * m_cfg.bridge_slope);
+ tmax = std::min(tmax, tmax2);
+
+ Vec3d nexp = endp;
+ double dlast = 0.;
+ while (((dlast = std::sqrt(m_mesh.squared_distance(to_floor(nexp)))) < gap_dist ||
+ !std::isinf(bridge_mesh_distance(nexp, DOWN, radius))) && t < tmax) {
+ t += radius;
+ nexp = endp + t * d;
+ }
+
+ if (dlast < gap_dist && can_add_base) {
+ nexp = endp;
+ t = 0.;
+ can_add_base = false;
+ eval_limits(can_add_base);
+
+ zd = endp.z() - jp_gnd;
+ tmax2 = zd / std::sqrt(1 - m_cfg.bridge_slope * m_cfg.bridge_slope);
+ tmax = std::min(tmax, tmax2);
+
+ while (((dlast = std::sqrt(m_mesh.squared_distance(to_floor(nexp)))) < gap_dist ||
+ !std::isinf(bridge_mesh_distance(nexp, DOWN, radius))) && t < tmax) {
+ t += radius;
+ nexp = endp + t * d;
}
-
- m_builder.add_bridge(jp, endp, radius);
- m_builder.add_junction(endp, radius);
-
- // Add a degenerated pillar and the bridge.
- // The degenerate pillar will have zero length and it will
- // prevent from queries of head_pillar() to have non-existing
- // pillar when the head should have one.
- if (head_id >= 0)
- m_builder.add_pillar(head_id, jp, radius);
+ }
+
+ // Could not find a path to avoid the pad gap
+ if (dlast < gap_dist) return false;
+
+ if (t > 0.) { // Need to make additional bridge
+ const Bridge& br = m_builder.add_bridge(endp, nexp, radius);
+ if (head_id >= 0) m_builder.head(head_id).bridge_id = br.id;
+
+ m_builder.add_junction(nexp, radius);
+ endp = nexp;
+ non_head = true;
}
}
-
- if (normal_mode) {
- pillar_id = head_id >= 0 ? m_builder.add_pillar(head_id, endp, radius) :
- m_builder.add_pillar(jp, endp, radius);
-
- if (can_add_base)
- m_builder.add_pillar_base(pillar_id, m_cfg.base_height_mm,
- m_cfg.base_radius_mm);
- }
-
+
+ Vec3d gp = to_floor(endp);
+ double h = endp.z() - gp.z();
+
+ pillar_id = head_id >= 0 && !non_head ? m_builder.add_pillar(head_id, h) :
+ m_builder.add_pillar(gp, h, radius);
+
+ if (can_add_base)
+ add_pillar_base(pillar_id);
+
if(pillar_id >= 0) // Save the pillar endpoint in the spatial index
- m_pillar_index.guarded_insert(endp, unsigned(pillar_id));
+ m_pillar_index.guarded_insert(m_builder.pillar(pillar_id).endpt,
+ unsigned(pillar_id));
+
+ return true;
+}
+
+std::optional<DiffBridge> SupportTreeBuildsteps::search_widening_path(
+ const Vec3d &jp, const Vec3d &dir, double radius, double new_radius)
+{
+ double w = radius + 2 * m_cfg.head_back_radius_mm;
+ double stopval = w + jp.z() - m_builder.ground_level;
+ Optimizer<AlgNLoptSubplex> solver(get_criteria(m_cfg).stop_score(stopval));
+
+ auto [polar, azimuth] = dir_to_spheric(dir);
+
+ double fallback_ratio = radius / m_cfg.head_back_radius_mm;
+
+ auto oresult = solver.to_max().optimize(
+ [this, jp, radius, new_radius](const opt::Input<3> &input) {
+ auto &[plr, azm, t] = input;
+
+ auto d = spheric_to_dir(plr, azm).normalized();
+ double ret = pinhead_mesh_intersect(jp, d, radius, new_radius, t)
+ .distance();
+ double down = bridge_mesh_distance(jp + t * d, d, new_radius);
+
+ if (ret > t && std::isinf(down))
+ ret += jp.z() - m_builder.ground_level;
+
+ return ret;
+ },
+ initvals({polar, azimuth, w}), // start with what we have
+ bounds({
+ {PI - m_cfg.bridge_slope, PI}, // Must not exceed the slope limit
+ {-PI, PI}, // azimuth can be a full search
+ {radius + m_cfg.head_back_radius_mm,
+ fallback_ratio * m_cfg.max_bridge_length_mm}
+ }));
+
+ if (oresult.score >= stopval) {
+ polar = std::get<0>(oresult.optimum);
+ azimuth = std::get<1>(oresult.optimum);
+ double t = std::get<2>(oresult.optimum);
+ Vec3d endp = jp + t * spheric_to_dir(polar, azimuth);
+
+ return DiffBridge(jp, endp, radius, m_cfg.head_back_radius_mm);
+ }
+
+ return {};
}
void SupportTreeBuildsteps::filter()
@@ -672,7 +631,7 @@ void SupportTreeBuildsteps::filter()
// Get the points that are too close to each other and keep only the
// first one
auto aliases = cluster(m_points, D_SP, 2);
-
+
PtIndices filtered_indices;
filtered_indices.reserve(aliases.size());
m_iheads.reserve(aliases.size());
@@ -681,136 +640,130 @@ void SupportTreeBuildsteps::filter()
// Here we keep only the front point of the cluster.
filtered_indices.emplace_back(a.front());
}
-
+
// calculate the normals to the triangles for filtered points
auto nmls = sla::normals(m_points, m_mesh, m_cfg.head_front_radius_mm,
m_thr, filtered_indices);
-
+
// Not all of the support points have to be a valid position for
// support creation. The angle may be inappropriate or there may
// not be enough space for the pinhead. Filtering is applied for
// these reasons.
-
- ccr::SpinningMutex mutex;
- auto addfn = [&mutex](PtIndices &container, unsigned val) {
- std::lock_guard<ccr::SpinningMutex> lk(mutex);
- container.emplace_back(val);
- };
-
- auto filterfn = [this, &nmls, addfn](unsigned fidx, size_t i) {
+
+ std::vector<Head> heads; heads.reserve(m_support_pts.size());
+ for (const SupportPoint &sp : m_support_pts) {
m_thr();
-
+ heads.emplace_back(
+ std::nan(""),
+ sp.head_front_radius,
+ 0.,
+ m_cfg.head_penetration_mm,
+ Vec3d::Zero(), // dir
+ sp.pos.cast<double>() // displacement
+ );
+ }
+
+ std::function<void(unsigned, size_t, double)> filterfn;
+ filterfn = [this, &nmls, &heads, &filterfn](unsigned fidx, size_t i, double back_r) {
+ m_thr();
+
auto n = nmls.row(Eigen::Index(i));
-
+
// for all normals we generate the spherical coordinates and
// saturate the polar angle to 45 degrees from the bottom then
// convert back to standard coordinates to get the new normal.
// Then we just create a quaternion from the two normals
// (Quaternion::FromTwoVectors) and apply the rotation to the
// arrow head.
-
+
auto [polar, azimuth] = dir_to_spheric(n);
-
+
// skip if the tilt is not sane
- if(polar >= PI - m_cfg.normal_cutoff_angle) {
-
- // We saturate the polar angle to 3pi/4
- polar = std::max(polar, 3*PI / 4);
-
- // save the head (pinpoint) position
- Vec3d hp = m_points.row(fidx);
-
- double w = m_cfg.head_width_mm +
- m_cfg.head_back_radius_mm +
- 2*m_cfg.head_front_radius_mm;
-
- double pin_r = double(m_support_pts[fidx].head_front_radius);
-
- // Reassemble the now corrected normal
- auto nn = spheric_to_dir(polar, azimuth).normalized();
-
- // check available distance
- EigenMesh3D::hit_result t
- = pinhead_mesh_intersect(hp, // touching point
- nn, // normal
- pin_r,
- m_cfg.head_back_radius_mm,
- w);
-
- if(t.distance() <= w) {
-
- // Let's try to optimize this angle, there might be a
- // viable normal that doesn't collide with the model
- // geometry and its very close to the default.
-
- StopCriteria stc;
- stc.max_iterations = m_cfg.optimizer_max_iterations;
- stc.relative_score_difference = m_cfg.optimizer_rel_score_diff;
- stc.stop_score = w; // space greater than w is enough
- GeneticOptimizer solver(stc);
- solver.seed(0); // we want deterministic behavior
-
- auto oresult = solver.optimize_max(
- [this, pin_r, w, hp](double plr, double azm)
- {
- auto dir = spheric_to_dir(plr, azm).normalized();
-
- double score = pinhead_mesh_distance(
- hp, dir, pin_r, m_cfg.head_back_radius_mm, w);
-
- return score;
- },
- initvals(polar, azimuth), // start with what we have
- bound(3 * PI / 4, PI), // Must not exceed the tilt limit
- bound(-PI, PI) // azimuth can be a full search
- );
-
- if(oresult.score > w) {
- polar = std::get<0>(oresult.optimum);
- azimuth = std::get<1>(oresult.optimum);
- nn = spheric_to_dir(polar, azimuth).normalized();
- t = EigenMesh3D::hit_result(oresult.score);
- }
- }
-
- // save the verified and corrected normal
- m_support_nmls.row(fidx) = nn;
-
- if (t.distance() > w) {
- // Check distance from ground, we might have zero elevation.
- if (hp(Z) + w * nn(Z) < m_builder.ground_level) {
- addfn(m_iheadless, fidx);
- } else {
- // mark the point for needing a head.
- addfn(m_iheads, fidx);
- }
- } else if (polar >= 3 * PI / 4) {
- // Headless supports do not tilt like the headed ones
- // so the normal should point almost to the ground.
- addfn(m_iheadless, fidx);
+ if (polar < PI - m_cfg.normal_cutoff_angle) return;
+
+ // We saturate the polar angle to 3pi/4
+ polar = std::max(polar, PI - m_cfg.bridge_slope);
+
+ // save the head (pinpoint) position
+ Vec3d hp = m_points.row(fidx);
+
+ double lmin = m_cfg.head_width_mm, lmax = lmin;
+
+ if (back_r < m_cfg.head_back_radius_mm) {
+ lmin = 0., lmax = m_cfg.head_penetration_mm;
+ }
+
+ // The distance needed for a pinhead to not collide with model.
+ double w = lmin + 2 * back_r + 2 * m_cfg.head_front_radius_mm -
+ m_cfg.head_penetration_mm;
+
+ double pin_r = double(m_support_pts[fidx].head_front_radius);
+
+ // Reassemble the now corrected normal
+ auto nn = spheric_to_dir(polar, azimuth).normalized();
+
+ // check available distance
+ IndexedMesh::hit_result t = pinhead_mesh_intersect(hp, nn, pin_r,
+ back_r, w);
+
+ if (t.distance() < w) {
+ // Let's try to optimize this angle, there might be a
+ // viable normal that doesn't collide with the model
+ // geometry and its very close to the default.
+
+ Optimizer<AlgNLoptGenetic> solver(get_criteria(m_cfg));
+ solver.seed(0); // we want deterministic behavior
+
+ auto oresult = solver.to_max().optimize(
+ [this, pin_r, back_r, hp](const opt::Input<3> &input)
+ {
+ auto &[plr, azm, l] = input;
+
+ auto dir = spheric_to_dir(plr, azm).normalized();
+
+ return pinhead_mesh_intersect(
+ hp, dir, pin_r, back_r, l).distance();
+ },
+ initvals({polar, azimuth, (lmin + lmax) / 2.}), // start with what we have
+ bounds({
+ {PI - m_cfg.bridge_slope, PI}, // Must not exceed the slope limit
+ {-PI, PI}, // azimuth can be a full search
+ {lmin, lmax}
+ }));
+
+ if(oresult.score > w) {
+ polar = std::get<0>(oresult.optimum);
+ azimuth = std::get<1>(oresult.optimum);
+ nn = spheric_to_dir(polar, azimuth).normalized();
+ lmin = std::get<2>(oresult.optimum);
+ t = IndexedMesh::hit_result(oresult.score);
}
}
+
+ if (t.distance() > w && hp(Z) + w * nn(Z) >= m_builder.ground_level) {
+ Head &h = heads[fidx];
+ h.id = fidx; h.dir = nn; h.width_mm = lmin; h.r_back_mm = back_r;
+ } else if (back_r > m_cfg.head_fallback_radius_mm) {
+ filterfn(fidx, i, m_cfg.head_fallback_radius_mm);
+ }
};
-
- ccr::enumerate(filtered_indices.begin(), filtered_indices.end(), filterfn);
-
+
+ ccr::for_each(size_t(0), filtered_indices.size(),
+ [this, &filterfn, &filtered_indices] (size_t i) {
+ filterfn(filtered_indices[i], i, m_cfg.head_back_radius_mm);
+ });
+
+ for (size_t i = 0; i < heads.size(); ++i)
+ if (heads[i].is_valid()) {
+ m_builder.add_head(i, heads[i]);
+ m_iheads.emplace_back(i);
+ }
+
m_thr();
}
void SupportTreeBuildsteps::add_pinheads()
{
- for (unsigned i : m_iheads) {
- m_thr();
- m_builder.add_head(
- i,
- m_cfg.head_back_radius_mm,
- m_support_pts[i].head_front_radius,
- m_cfg.head_width_mm,
- m_cfg.head_penetration_mm,
- m_support_nmls.row(i), // dir
- m_support_pts[i].pos.cast<double>() // displacement
- );
- }
}
void SupportTreeBuildsteps::classify()
@@ -819,37 +772,37 @@ void SupportTreeBuildsteps::classify()
PtIndices ground_head_indices;
ground_head_indices.reserve(m_iheads.size());
m_iheads_onmodel.reserve(m_iheads.size());
-
+
// First we decide which heads reach the ground and can be full
// pillars and which shall be connected to the model surface (or
// search a suitable path around the surface that leads to the
// ground -- TODO)
for(unsigned i : m_iheads) {
m_thr();
-
- auto& head = m_builder.head(i);
+
+ Head &head = m_builder.head(i);
double r = head.r_back_mm;
Vec3d headjp = head.junction_point();
-
+
// collision check
auto hit = bridge_mesh_intersect(headjp, DOWN, r);
-
+
if(std::isinf(hit.distance())) ground_head_indices.emplace_back(i);
else if(m_cfg.ground_facing_only) head.invalidate();
else m_iheads_onmodel.emplace_back(i);
-
+
m_head_to_ground_scans[i] = hit;
}
-
+
// We want to search for clusters of points that are far enough
// from each other in the XY plane to not cross their pillar bases
// These clusters of support points will join in one pillar,
// possibly in their centroid support point.
-
+
auto pointfn = [this](unsigned i) {
return m_builder.head(i).junction_point();
};
-
+
auto predicate = [this](const PointIndexEl &e1,
const PointIndexEl &e2) {
double d2d = distance(to_2d(e1.first), to_2d(e2.first));
@@ -864,14 +817,12 @@ void SupportTreeBuildsteps::classify()
void SupportTreeBuildsteps::routing_to_ground()
{
- const double pradius = m_cfg.head_back_radius_mm;
-
ClusterEl cl_centroids;
cl_centroids.reserve(m_pillar_clusters.size());
-
+
for (auto &cl : m_pillar_clusters) {
m_thr();
-
+
// place all the centroid head positions into the index. We
// will query for alternative pillar positions. If a sidehead
// cannot connect to the cluster centroid, we have to search
@@ -879,9 +830,9 @@ void SupportTreeBuildsteps::routing_to_ground()
// elements in the cluster, the centroid is arbitrary and the
// sidehead is allowed to connect to a nearby pillar to
// increase structural stability.
-
+
if (cl.empty()) continue;
-
+
// get the current cluster centroid
auto & thr = m_thr;
const auto &points = m_points;
@@ -895,43 +846,44 @@ void SupportTreeBuildsteps::routing_to_ground()
assert(lcid >= 0);
unsigned hid = cl[size_t(lcid)]; // Head ID
-
+
cl_centroids.emplace_back(hid);
-
+
Head &h = m_builder.head(hid);
- h.transform();
-
- create_ground_pillar(h.junction_point(), h.dir, h.r_back_mm, h.id);
+
+ if (!create_ground_pillar(h.junction_point(), h.dir, h.r_back_mm, h.id)) {
+ BOOST_LOG_TRIVIAL(warning)
+ << "Pillar cannot be created for support point id: " << hid;
+ m_iheads_onmodel.emplace_back(h.id);
+ continue;
+ }
}
-
+
// now we will go through the clusters ones again and connect the
// sidepoints with the cluster centroid (which is a ground pillar)
// or a nearby pillar if the centroid is unreachable.
size_t ci = 0;
for (auto cl : m_pillar_clusters) {
m_thr();
-
+
auto cidx = cl_centroids[ci++];
-
- // TODO: don't consider the cluster centroid but calculate a
- // central position where the pillar can be placed. this way
- // the weight is distributed more effectively on the pillar.
-
- auto centerpillarID = m_builder.head_pillar(cidx).id;
-
- for (auto c : cl) {
- m_thr();
- if (c == cidx) continue;
-
- auto &sidehead = m_builder.head(c);
- sidehead.transform();
-
- if (!connect_to_nearpillar(sidehead, centerpillarID) &&
- !search_pillar_and_connect(sidehead)) {
- Vec3d pstart = sidehead.junction_point();
- // Vec3d pend = Vec3d{pstart(X), pstart(Y), gndlvl};
- // Could not find a pillar, create one
- create_ground_pillar(pstart, sidehead.dir, pradius, sidehead.id);
+
+ auto q = m_pillar_index.query(m_builder.head(cidx).junction_point(), 1);
+ if (!q.empty()) {
+ long centerpillarID = q.front().second;
+ for (auto c : cl) {
+ m_thr();
+ if (c == cidx) continue;
+
+ auto &sidehead = m_builder.head(c);
+
+ if (!connect_to_nearpillar(sidehead, centerpillarID) &&
+ !search_pillar_and_connect(sidehead)) {
+ Vec3d pstart = sidehead.junction_point();
+ // Vec3d pend = Vec3d{pstart(X), pstart(Y), gndlvl};
+ // Could not find a pillar, create one
+ create_ground_pillar(pstart, sidehead.dir, sidehead.r_back_mm, sidehead.id);
+ }
}
}
}
@@ -943,62 +895,66 @@ bool SupportTreeBuildsteps::connect_to_ground(Head &head, const Vec3d &dir)
double r = head.r_back_mm;
double t = bridge_mesh_distance(hjp, dir, head.r_back_mm);
double d = 0, tdown = 0;
- t = std::min(t, m_cfg.max_bridge_length_mm);
+ t = std::min(t, m_cfg.max_bridge_length_mm * r / m_cfg.head_back_radius_mm);
while (d < t && !std::isinf(tdown = bridge_mesh_distance(hjp + d * dir, DOWN, r)))
d += r;
-
+
if(!std::isinf(tdown)) return false;
-
+
Vec3d endp = hjp + d * dir;
- m_builder.add_bridge(head.id, endp);
- m_builder.add_junction(endp, head.r_back_mm);
-
- this->create_ground_pillar(endp, dir, head.r_back_mm);
-
- return true;
+ bool ret = false;
+
+ if ((ret = create_ground_pillar(endp, dir, head.r_back_mm))) {
+ m_builder.add_bridge(head.id, endp);
+ m_builder.add_junction(endp, head.r_back_mm);
+ }
+
+ return ret;
}
bool SupportTreeBuildsteps::connect_to_ground(Head &head)
{
if (connect_to_ground(head, head.dir)) return true;
-
+
// Optimize bridge direction:
// Straight path failed so we will try to search for a suitable
// direction out of the cavity.
auto [polar, azimuth] = dir_to_spheric(head.dir);
-
- StopCriteria stc;
- stc.max_iterations = m_cfg.optimizer_max_iterations;
- stc.relative_score_difference = m_cfg.optimizer_rel_score_diff;
- stc.stop_score = 1e6;
- GeneticOptimizer solver(stc);
+
+ Optimizer<AlgNLoptGenetic> solver(get_criteria(m_cfg).stop_score(1e6));
solver.seed(0); // we want deterministic behavior
-
+
double r_back = head.r_back_mm;
- Vec3d hjp = head.junction_point();
- auto oresult = solver.optimize_max(
- [this, hjp, r_back](double plr, double azm) {
+ Vec3d hjp = head.junction_point();
+ auto oresult = solver.to_max().optimize(
+ [this, hjp, r_back](const opt::Input<2> &input) {
+ auto &[plr, azm] = input;
Vec3d n = spheric_to_dir(plr, azm).normalized();
return bridge_mesh_distance(hjp, n, r_back);
},
- initvals(polar, azimuth), // let's start with what we have
- bound(3*PI/4, PI), // Must not exceed the slope limit
- bound(-PI, PI) // azimuth can be a full range search
- );
-
+ initvals({polar, azimuth}), // let's start with what we have
+ bounds({ {PI - m_cfg.bridge_slope, PI}, {-PI, PI} })
+ );
+
Vec3d bridgedir = spheric_to_dir(oresult.optimum).normalized();
return connect_to_ground(head, bridgedir);
}
bool SupportTreeBuildsteps::connect_to_model_body(Head &head)
{
- if (head.id <= ID_UNSET) return false;
-
+ if (head.id <= SupportTreeNode::ID_UNSET) return false;
+
auto it = m_head_to_ground_scans.find(unsigned(head.id));
if (it == m_head_to_ground_scans.end()) return false;
-
+
auto &hit = it->second;
+
+ if (!hit.is_hit()) {
+ // TODO scan for potential anchor points on model surface
+ return false;
+ }
+
Vec3d hjp = head.junction_point();
double zangle = std::asin(hit.direction()(Z));
zangle = std::max(zangle, PI/4);
@@ -1006,9 +962,11 @@ bool SupportTreeBuildsteps::connect_to_model_body(Head &head)
// The width of the tail head that we would like to have...
h = std::min(hit.distance() - head.r_back_mm, h);
-
- if(h <= 0.) return false;
-
+
+ // If this is a mini pillar dont bother with the tail width, can be 0.
+ if (head.r_back_mm < m_cfg.head_back_radius_mm) h = std::max(h, 0.);
+ else if (h <= 0.) return false;
+
Vec3d endp{hjp(X), hjp(Y), hjp(Z) - hit.distance() + h};
auto center_hit = m_mesh.query_ray_hit(hjp, DOWN);
@@ -1016,13 +974,11 @@ bool SupportTreeBuildsteps::connect_to_model_body(Head &head)
Vec3d hitp = std::abs(hitdiff) < 2*head.r_back_mm?
center_hit.position() : hit.position();
- head.transform();
-
- long pillar_id = m_builder.add_pillar(head.id, endp, head.r_back_mm);
+ long pillar_id = m_builder.add_pillar(head.id, hjp.z() - endp.z());
Pillar &pill = m_builder.pillar(pillar_id);
Vec3d taildir = endp - hitp;
- double dist = distance(endp, hitp) + m_cfg.head_penetration_mm;
+ double dist = (hitp - endp).norm() + m_cfg.head_penetration_mm;
double w = dist - 2 * head.r_pin_mm - head.r_back_mm;
if (w < 0.) {
@@ -1030,43 +986,77 @@ bool SupportTreeBuildsteps::connect_to_model_body(Head &head)
w = 0.;
}
- Head tailhead(head.r_back_mm, head.r_pin_mm, w,
- m_cfg.head_penetration_mm, taildir, hitp);
+ m_builder.add_anchor(head.r_back_mm, head.r_pin_mm, w,
+ m_cfg.head_penetration_mm, taildir, hitp);
- tailhead.transform();
- pill.base = tailhead.mesh;
-
m_pillar_index.guarded_insert(pill.endpoint(), pill.id);
-
+
return true;
}
+bool SupportTreeBuildsteps::search_pillar_and_connect(const Head &source)
+{
+ // Hope that a local copy takes less time than the whole search loop.
+ // We also need to remove elements progressively from the copied index.
+ PointIndex spindex = m_pillar_index.guarded_clone();
+
+ long nearest_id = SupportTreeNode::ID_UNSET;
+
+ Vec3d querypt = source.junction_point();
+
+ while(nearest_id < 0 && !spindex.empty()) { m_thr();
+ // loop until a suitable head is not found
+ // if there is a pillar closer than the cluster center
+ // (this may happen as the clustering is not perfect)
+ // than we will bridge to this closer pillar
+
+ Vec3d qp(querypt(X), querypt(Y), m_builder.ground_level);
+ auto qres = spindex.nearest(qp, 1);
+ if(qres.empty()) break;
+
+ auto ne = qres.front();
+ nearest_id = ne.second;
+
+ if(nearest_id >= 0) {
+ if (size_t(nearest_id) < m_builder.pillarcount()) {
+ if(!connect_to_nearpillar(source, nearest_id) ||
+ m_builder.pillar(nearest_id).r < source.r_back_mm) {
+ nearest_id = SupportTreeNode::ID_UNSET; // continue searching
+ spindex.remove(ne); // without the current pillar
+ }
+ }
+ }
+ }
+
+ return nearest_id >= 0;
+}
+
void SupportTreeBuildsteps::routing_to_model()
-{
+{
// We need to check if there is an easy way out to the bed surface.
// If it can be routed there with a bridge shorter than
// min_bridge_distance.
- ccr::enumerate(m_iheads_onmodel.begin(), m_iheads_onmodel.end(),
- [this] (const unsigned idx, size_t) {
+ ccr::for_each(m_iheads_onmodel.begin(), m_iheads_onmodel.end(),
+ [this] (const unsigned idx) {
m_thr();
-
+
auto& head = m_builder.head(idx);
-
+
// Search nearby pillar
- if(search_pillar_and_connect(head)) { head.transform(); return; }
-
+ if (search_pillar_and_connect(head)) { return; }
+
// Cannot connect to nearby pillar. We will try to search for
// a route to the ground.
- if(connect_to_ground(head)) { head.transform(); return; }
-
+ if (connect_to_ground(head)) { return; }
+
// No route to the ground, so connect to the model body as a last resort
if (connect_to_model_body(head)) { return; }
-
+
// We have failed to route this head.
BOOST_LOG_TRIVIAL(warning)
- << "Failed to route model facing support point. ID: " << idx;
-
+ << "Failed to route model facing support point. ID: " << idx;
+
head.invalidate();
});
}
@@ -1076,19 +1066,19 @@ void SupportTreeBuildsteps::interconnect_pillars()
// Now comes the algorithm that connects pillars with each other.
// Ideally every pillar should be connected with at least one of its
// neighbors if that neighbor is within max_pillar_link_distance
-
+
// Pillars with height exceeding H1 will require at least one neighbor
// to connect with. Height exceeding H2 require two neighbors.
double H1 = m_cfg.max_solo_pillar_height_mm;
double H2 = m_cfg.max_dual_pillar_height_mm;
double d = m_cfg.max_pillar_link_distance_mm;
-
+
//A connection between two pillars only counts if the height ratio is
// bigger than 50%
double min_height_ratio = 0.5;
-
+
std::set<unsigned long> pairs;
-
+
// A function to connect one pillar with its neighbors. THe number of
// neighbors is given in the configuration. This function if called
// for every pillar in the pillar index. A pair of pillar will not
@@ -1098,66 +1088,68 @@ void SupportTreeBuildsteps::interconnect_pillars()
[this, d, &pairs, min_height_ratio, H1] (const PointIndexEl& el)
{
Vec3d qp = el.first; // endpoint of the pillar
-
+
const Pillar& pillar = m_builder.pillar(el.second); // actual pillar
-
+
// Get the max number of neighbors a pillar should connect to
unsigned neighbors = m_cfg.pillar_cascade_neighbors;
-
+
// connections are already enough for the pillar
if(pillar.links >= neighbors) return;
-
+
+ double max_d = d * pillar.r / m_cfg.head_back_radius_mm;
// Query all remaining points within reach
- auto qres = m_pillar_index.query([qp, d](const PointIndexEl& e){
- return distance(e.first, qp) < d;
+ auto qres = m_pillar_index.query([qp, max_d](const PointIndexEl& e){
+ return distance(e.first, qp) < max_d;
});
-
+
// sort the result by distance (have to check if this is needed)
std::sort(qres.begin(), qres.end(),
[qp](const PointIndexEl& e1, const PointIndexEl& e2){
return distance(e1.first, qp) < distance(e2.first, qp);
});
-
+
for(auto& re : qres) { // process the queried neighbors
-
+
if(re.second == el.second) continue; // Skip self
-
+
auto a = el.second, b = re.second;
-
+
// Get unique hash for the given pair (order doesn't matter)
auto hashval = pairhash(a, b);
-
+
// Search for the pair amongst the remembered pairs
if(pairs.find(hashval) != pairs.end()) continue;
-
+
const Pillar& neighborpillar = m_builder.pillar(re.second);
-
+
// this neighbor is occupied, skip
- if(neighborpillar.links >= neighbors) continue;
-
+ if (neighborpillar.links >= neighbors) continue;
+ if (neighborpillar.r < pillar.r) continue;
+
if(interconnect(pillar, neighborpillar)) {
pairs.insert(hashval);
-
+
// If the interconnection length between the two pillars is
// less than 50% of the longer pillar's height, don't count
if(pillar.height < H1 ||
neighborpillar.height / pillar.height > min_height_ratio)
m_builder.increment_links(pillar);
-
+
if(neighborpillar.height < H1 ||
pillar.height / neighborpillar.height > min_height_ratio)
m_builder.increment_links(neighborpillar);
-
+
}
-
+
// connections are enough for one pillar
if(pillar.links >= neighbors) break;
}
};
-
+
// Run the cascade for the pillars in the index
m_pillar_index.foreach(cascadefn);
-
+
// We would be done here if we could allow some pillars to not be
// connected with any neighbors. But this might leave the support tree
// unprintable.
@@ -1165,16 +1157,16 @@ void SupportTreeBuildsteps::interconnect_pillars()
// The current solution is to insert additional pillars next to these
// lonely pillars. One or even two additional pillar might get inserted
// depending on the length of the lonely pillar.
-
+
size_t pillarcount = m_builder.pillarcount();
-
+
// Again, go through all pillars, this time in the whole support tree
// not just the index.
for(size_t pid = 0; pid < pillarcount; pid++) {
auto pillar = [this, pid]() { return m_builder.pillar(pid); };
-
+
// Decide how many additional pillars will be needed:
-
+
unsigned needpillars = 0;
if (pillar().bridges > m_cfg.max_bridges_on_pillar)
needpillars = 3;
@@ -1185,28 +1177,28 @@ void SupportTreeBuildsteps::interconnect_pillars()
// No neighbors could be found and the pillar is too long.
needpillars = 1;
}
-
+
needpillars = std::max(pillar().links, needpillars) - pillar().links;
if (needpillars == 0) continue;
-
+
// Search for new pillar locations:
-
+
bool found = false;
double alpha = 0; // goes to 2Pi
double r = 2 * m_cfg.base_radius_mm;
Vec3d pillarsp = pillar().startpoint();
-
+
// temp value for starting point detection
Vec3d sp(pillarsp(X), pillarsp(Y), pillarsp(Z) - r);
-
+
// A vector of bool for placement feasbility
std::vector<bool> canplace(needpillars, false);
std::vector<Vec3d> spts(needpillars); // vector of starting points
-
+
double gnd = m_builder.ground_level;
double min_dist = m_cfg.pillar_base_safety_distance_mm +
m_cfg.base_radius_mm + EPSILON;
-
+
while(!found && alpha < 2*PI) {
for (unsigned n = 0;
n < needpillars && (!n || canplace[n - 1]);
@@ -1217,36 +1209,38 @@ void SupportTreeBuildsteps::interconnect_pillars()
s(X) += std::cos(a) * r;
s(Y) += std::sin(a) * r;
spts[n] = s;
-
+
// Check the path vertically down
Vec3d check_from = s + Vec3d{0., 0., pillar().r};
auto hr = bridge_mesh_intersect(check_from, DOWN, pillar().r);
Vec3d gndsp{s(X), s(Y), gnd};
-
+
// If the path is clear, check for pillar base collisions
canplace[n] = std::isinf(hr.distance()) &&
std::sqrt(m_mesh.squared_distance(gndsp)) >
min_dist;
}
-
+
found = std::all_of(canplace.begin(), canplace.end(),
[](bool v) { return v; });
-
+
// 20 angles will be tried...
alpha += 0.1 * PI;
}
-
+
std::vector<long> newpills;
newpills.reserve(needpillars);
if (found)
for (unsigned n = 0; n < needpillars; n++) {
- Vec3d s = spts[n];
- Pillar p(s, Vec3d(s(X), s(Y), gnd), pillar().r);
- p.add_base(m_cfg.base_height_mm, m_cfg.base_radius_mm);
+ Vec3d s = spts[n];
+ Pillar p(Vec3d{s.x(), s.y(), gnd}, s.z() - gnd, pillar().r);
if (interconnect(pillar(), p)) {
Pillar &pp = m_builder.pillar(m_builder.add_pillar(p));
+
+ add_pillar_base(pp.id);
+
m_pillar_index.insert(pp.endpoint(), unsigned(pp.id));
m_builder.add_junction(s, pillar().r);
@@ -1255,9 +1249,8 @@ void SupportTreeBuildsteps::interconnect_pillars()
if (distance(pillarsp, s) < t)
m_builder.add_bridge(pillarsp, s, pillar().r);
- if (pillar().endpoint()(Z) > m_builder.ground_level)
- m_builder.add_junction(pillar().endpoint(),
- pillar().r);
+ if (pillar().endpoint()(Z) > m_builder.ground_level + pillar().r)
+ m_builder.add_junction(pillar().endpoint(), pillar().r);
newpills.emplace_back(pp.id);
m_builder.increment_links(pillar());
@@ -1275,51 +1268,10 @@ void SupportTreeBuildsteps::interconnect_pillars()
m_builder.increment_links(nxpll);
}
}
-
- m_pillar_index.foreach(cascadefn);
- }
- }
-}
-void SupportTreeBuildsteps::routing_headless()
-{
- // For now we will just generate smaller headless sticks with a sharp
- // ending point that connects to the mesh surface.
-
- // We will sink the pins into the model surface for a distance of 1/3 of
- // the pin radius
- for(unsigned i : m_iheadless) {
- m_thr();
-
- const auto R = double(m_support_pts[i].head_front_radius);
- const double HWIDTH_MM = m_cfg.head_penetration_mm;
-
- // Exact support position
- Vec3d sph = m_support_pts[i].pos.cast<double>();
- Vec3d n = m_support_nmls.row(i); // mesh outward normal
- Vec3d sp = sph - n * HWIDTH_MM; // stick head start point
-
- Vec3d sj = sp + R * n; // stick start point
-
- // This is only for checking
- double idist = bridge_mesh_distance(sph, DOWN, R, true);
- double realdist = ray_mesh_intersect(sj, DOWN).distance();
- double dist = realdist;
-
- if (std::isinf(dist)) dist = sph(Z) - m_builder.ground_level;
-
- if(std::isnan(idist) || idist < 2*R || std::isnan(dist) || dist < 2*R) {
- BOOST_LOG_TRIVIAL(warning) << "Can not find route for headless"
- << " support stick at: "
- << sj.transpose();
- continue;
+ m_pillar_index.foreach(cascadefn);
}
-
- bool use_endball = !std::isinf(realdist);
- Vec3d ej = sj + (dist + HWIDTH_MM) * DOWN ;
- m_builder.add_compact_bridge(sp, ej, n, R, use_endball);
}
}
-}
-}
+}} // namespace Slic3r::sla
diff --git a/src/libslic3r/SLA/SupportTreeBuildsteps.hpp b/src/libslic3r/SLA/SupportTreeBuildsteps.hpp
index cfe78fe97..013666f07 100644
--- a/src/libslic3r/SLA/SupportTreeBuildsteps.hpp
+++ b/src/libslic3r/SLA/SupportTreeBuildsteps.hpp
@@ -5,6 +5,7 @@
#include <libslic3r/SLA/SupportTreeBuilder.hpp>
#include <libslic3r/SLA/Clustering.hpp>
+#include <libslic3r/SLA/SpatIndex.hpp>
namespace Slic3r {
namespace sla {
@@ -16,9 +17,7 @@ enum { // For indexing Eigen vectors as v(X), v(Y), v(Z) instead of numbers
X, Y, Z
};
-inline Vec2d to_vec2(const Vec3d& v3) {
- return {v3(X), v3(Y)};
-}
+inline Vec2d to_vec2(const Vec3d &v3) { return {v3(X), v3(Y)}; }
inline std::pair<double, double> dir_to_spheric(const Vec3d &n, double norm = 1.)
{
@@ -46,55 +45,71 @@ inline Vec3d spheric_to_dir(const std::pair<double, double> &v)
return spheric_to_dir(v.first, v.second);
}
-// This function returns the position of the centroid in the input 'clust'
-// vector of point indices.
-template<class DistFn>
-long cluster_centroid(const ClusterEl& clust,
- const std::function<Vec3d(size_t)> &pointfn,
- DistFn df)
+inline Vec3d spheric_to_dir(const std::array<double, 2> &v)
{
- switch(clust.size()) {
- case 0: /* empty cluster */ return ID_UNSET;
- case 1: /* only one element */ return 0;
- case 2: /* if two elements, there is no center */ return 0;
- default: ;
- }
-
- // The function works by calculating for each point the average distance
- // from all the other points in the cluster. We create a selector bitmask of
- // the same size as the cluster. The bitmask will have two true bits and
- // false bits for the rest of items and we will loop through all the
- // permutations of the bitmask (combinations of two points). Get the
- // distance for the two points and add the distance to the averages.
- // The point with the smallest average than wins.
-
- // The complexity should be O(n^2) but we will mostly apply this function
- // for small clusters only (cca 3 elements)
+ return spheric_to_dir(v[0], v[1]);
+}
- std::vector<bool> sel(clust.size(), false); // create full zero bitmask
- std::fill(sel.end() - 2, sel.end(), true); // insert the two ones
- std::vector<double> avgs(clust.size(), 0.0); // store the average distances
+// Give points on a 3D ring with given center, radius and orientation
+// method based on:
+// https://math.stackexchange.com/questions/73237/parametric-equation-of-a-circle-in-3d-space
+template<size_t N>
+class PointRing {
+ std::array<double, N> m_phis;
+
+ // Two vectors that will be perpendicular to each other and to the
+ // axis. Values for a(X) and a(Y) are now arbitrary, a(Z) is just a
+ // placeholder.
+ // a and b vectors are perpendicular to the ring direction and to each other.
+ // Together they define the plane where we have to iterate with the
+ // given angles in the 'm_phis' vector
+ Vec3d a = {0, 1, 0}, b;
+ double m_radius = 0.;
+
+ static inline bool constexpr is_one(double val)
+ {
+ return std::abs(std::abs(val) - 1) < 1e-20;
+ }
- do {
- std::array<size_t, 2> idx;
- for(size_t i = 0, j = 0; i < clust.size(); i++) if(sel[i]) idx[j++] = i;
+public:
- double d = df(pointfn(clust[idx[0]]),
- pointfn(clust[idx[1]]));
+ PointRing(const Vec3d &n)
+ {
+ m_phis = linspace_array<N>(0., 2 * PI);
+
+ // We have to address the case when the direction vector v (same as
+ // dir) is coincident with one of the world axes. In this case two of
+ // its components will be completely zero and one is 1.0. Our method
+ // becomes dangerous here due to division with zero. Instead, vector
+ // 'a' can be an element-wise rotated version of 'v'
+ if(is_one(n(X)) || is_one(n(Y)) || is_one(n(Z))) {
+ a = {n(Z), n(X), n(Y)};
+ b = {n(Y), n(Z), n(X)};
+ }
+ else {
+ a(Z) = -(n(Y)*a(Y)) / n(Z); a.normalize();
+ b = a.cross(n);
+ }
+ }
- // add the distance to the sums for both associated points
- for(auto i : idx) avgs[i] += d;
+ Vec3d get(size_t idx, const Vec3d src, double r) const
+ {
+ double phi = m_phis[idx];
+ double sinphi = std::sin(phi);
+ double cosphi = std::cos(phi);
- // now continue with the next permutation of the bitmask with two 1s
- } while(std::next_permutation(sel.begin(), sel.end()));
+ double rpscos = r * cosphi;
+ double rpssin = r * sinphi;
- // Divide by point size in the cluster to get the average (may be redundant)
- for(auto& a : avgs) a /= clust.size();
+ // Point on the sphere
+ return {src(X) + rpscos * a(X) + rpssin * b(X),
+ src(Y) + rpscos * a(Y) + rpssin * b(Y),
+ src(Z) + rpscos * a(Z) + rpssin * b(Z)};
+ }
+};
- // get the lowest average distance and return the index
- auto minit = std::min_element(avgs.begin(), avgs.end());
- return long(minit - avgs.begin());
-}
+//IndexedMesh::hit_result query_hit(const SupportableMesh &msh, const Bridge &br, double safety_d = std::nan(""));
+//IndexedMesh::hit_result query_hit(const SupportableMesh &msh, const Head &br, double safety_d = std::nan(""));
inline Vec3d dirv(const Vec3d& startp, const Vec3d& endp) {
return (endp - startp).normalized();
@@ -170,8 +185,8 @@ IntegerOnly<DoubleI> pairhash(I a, I b)
}
class SupportTreeBuildsteps {
- const SupportConfig& m_cfg;
- const EigenMesh3D& m_mesh;
+ const SupportTreeConfig& m_cfg;
+ const IndexedMesh& m_mesh;
const std::vector<SupportPoint>& m_support_pts;
using PtIndices = std::vector<unsigned>;
@@ -180,7 +195,7 @@ class SupportTreeBuildsteps {
PtIndices m_iheads_onmodel;
PtIndices m_iheadless; // headless support points
- std::map<unsigned, EigenMesh3D::hit_result> m_head_to_ground_scans;
+ std::map<unsigned, IndexedMesh::hit_result> m_head_to_ground_scans;
// normals for support points from model faces.
PointSet m_support_nmls;
@@ -206,7 +221,7 @@ class SupportTreeBuildsteps {
// When bridging heads to pillars... TODO: find a cleaner solution
ccr::BlockingMutex m_bridge_mutex;
- inline EigenMesh3D::hit_result ray_mesh_intersect(const Vec3d& s,
+ inline IndexedMesh::hit_result ray_mesh_intersect(const Vec3d& s,
const Vec3d& dir)
{
return m_mesh.query_ray_hit(s, dir);
@@ -223,16 +238,24 @@ class SupportTreeBuildsteps {
// point was inside the model, an "invalid" hit_result will be returned
// with a zero distance value instead of a NAN. This way the result can
// be used safely for comparison with other distances.
- EigenMesh3D::hit_result pinhead_mesh_intersect(
+ IndexedMesh::hit_result pinhead_mesh_intersect(
const Vec3d& s,
const Vec3d& dir,
double r_pin,
double r_back,
- double width);
-
- template<class...Args>
- inline double pinhead_mesh_distance(Args&&...args) {
- return pinhead_mesh_intersect(std::forward<Args>(args)...).distance();
+ double width,
+ double safety_d);
+
+ IndexedMesh::hit_result pinhead_mesh_intersect(
+ const Vec3d& s,
+ const Vec3d& dir,
+ double r_pin,
+ double r_back,
+ double width)
+ {
+ return pinhead_mesh_intersect(s, dir, r_pin, r_back, width,
+ r_back * m_cfg.safety_distance_mm /
+ m_cfg.head_back_radius_mm);
}
// Checking bridge (pillar and stick as well) intersection with the model.
@@ -243,11 +266,21 @@ class SupportTreeBuildsteps {
// point was inside the model, an "invalid" hit_result will be returned
// with a zero distance value instead of a NAN. This way the result can
// be used safely for comparison with other distances.
- EigenMesh3D::hit_result bridge_mesh_intersect(
+ IndexedMesh::hit_result bridge_mesh_intersect(
const Vec3d& s,
const Vec3d& dir,
double r,
- bool ins_check = false);
+ double safety_d);
+
+ IndexedMesh::hit_result bridge_mesh_intersect(
+ const Vec3d& s,
+ const Vec3d& dir,
+ double r)
+ {
+ return bridge_mesh_intersect(s, dir, r,
+ r * m_cfg.safety_distance_mm /
+ m_cfg.head_back_radius_mm);
+ }
template<class...Args>
inline double bridge_mesh_distance(Args&&...args) {
@@ -268,20 +301,29 @@ class SupportTreeBuildsteps {
inline bool connect_to_ground(Head& head);
bool connect_to_model_body(Head &head);
-
- bool search_pillar_and_connect(const Head& head);
+
+ bool search_pillar_and_connect(const Head& source);
// This is a proxy function for pillar creation which will mind the gap
// between the pad and the model bottom in zero elevation mode.
// jp is the starting junction point which needs to be routed down.
// sourcedir is the allowed direction of an optional bridge between the
// jp junction and the final pillar.
- void create_ground_pillar(const Vec3d &jp,
+ bool create_ground_pillar(const Vec3d &jp,
const Vec3d &sourcedir,
double radius,
- long head_id = ID_UNSET);
-
-
+ long head_id = SupportTreeNode::ID_UNSET);
+
+ void add_pillar_base(long pid)
+ {
+ m_builder.add_pillar_base(pid, m_cfg.base_height_mm, m_cfg.base_radius_mm);
+ }
+
+ std::optional<DiffBridge> search_widening_path(const Vec3d &jp,
+ const Vec3d &dir,
+ double radius,
+ double new_radius);
+
public:
SupportTreeBuildsteps(SupportTreeBuilder & builder, const SupportableMesh &sm);
@@ -324,11 +366,6 @@ public:
void interconnect_pillars();
- // Step: process the support points where there is not enough space for a
- // full pinhead. In this case we will use a rounded sphere as a touching
- // point and use a thinner bridge (let's call it a stick).
- void routing_headless ();
-
inline void merge_result() { m_builder.merged_mesh(); }
static bool execute(SupportTreeBuilder & builder, const SupportableMesh &sm);
diff --git a/src/libslic3r/SLA/SupportTreeIGL.cpp b/src/libslic3r/SLA/SupportTreeIGL.cpp
deleted file mode 100644
index ea2be6be1..000000000
--- a/src/libslic3r/SLA/SupportTreeIGL.cpp
+++ /dev/null
@@ -1,621 +0,0 @@
-#include <cmath>
-#include "SLA/SLASupportTree.hpp"
-#include "SLA/SLACommon.hpp"
-#include "SLA/SLASpatIndex.hpp"
-
-// Workaround: IGL signed_distance.h will define PI in the igl namespace.
-#undef PI
-
-// HEAVY headers... takes eternity to compile
-
-// for concave hull merging decisions
-#include "SLABoostAdapter.hpp"
-#include "boost/geometry/index/rtree.hpp"
-
-#ifdef _MSC_VER
-#pragma warning(push)
-#pragma warning(disable: 4244)
-#pragma warning(disable: 4267)
-#endif
-#include <igl/ray_mesh_intersect.h>
-#include <igl/point_mesh_squared_distance.h>
-#include <igl/remove_duplicate_vertices.h>
-#include <igl/signed_distance.h>
-#ifdef _MSC_VER
-#pragma warning(pop)
-#endif
-
-#include <tbb/parallel_for.h>
-
-#include "SLASpatIndex.hpp"
-#include "ClipperUtils.hpp"
-
-namespace Slic3r {
-namespace sla {
-
-// Bring back PI from the igl namespace
-using igl::PI;
-
-/* **************************************************************************
- * PointIndex implementation
- * ************************************************************************** */
-
-class PointIndex::Impl {
-public:
- using BoostIndex = boost::geometry::index::rtree< PointIndexEl,
- boost::geometry::index::rstar<16, 4> /* ? */ >;
-
- BoostIndex m_store;
-};
-
-PointIndex::PointIndex(): m_impl(new Impl()) {}
-PointIndex::~PointIndex() {}
-
-PointIndex::PointIndex(const PointIndex &cpy): m_impl(new Impl(*cpy.m_impl)) {}
-PointIndex::PointIndex(PointIndex&& cpy): m_impl(std::move(cpy.m_impl)) {}
-
-PointIndex& PointIndex::operator=(const PointIndex &cpy)
-{
- m_impl.reset(new Impl(*cpy.m_impl));
- return *this;
-}
-
-PointIndex& PointIndex::operator=(PointIndex &&cpy)
-{
- m_impl.swap(cpy.m_impl);
- return *this;
-}
-
-void PointIndex::insert(const PointIndexEl &el)
-{
- m_impl->m_store.insert(el);
-}
-
-bool PointIndex::remove(const PointIndexEl& el)
-{
- return m_impl->m_store.remove(el) == 1;
-}
-
-std::vector<PointIndexEl>
-PointIndex::query(std::function<bool(const PointIndexEl &)> fn) const
-{
- namespace bgi = boost::geometry::index;
-
- std::vector<PointIndexEl> ret;
- m_impl->m_store.query(bgi::satisfies(fn), std::back_inserter(ret));
- return ret;
-}
-
-std::vector<PointIndexEl> PointIndex::nearest(const Vec3d &el, unsigned k = 1) const
-{
- namespace bgi = boost::geometry::index;
- std::vector<PointIndexEl> ret; ret.reserve(k);
- m_impl->m_store.query(bgi::nearest(el, k), std::back_inserter(ret));
- return ret;
-}
-
-size_t PointIndex::size() const
-{
- return m_impl->m_store.size();
-}
-
-void PointIndex::foreach(std::function<void (const PointIndexEl &)> fn)
-{
- for(auto& el : m_impl->m_store) fn(el);
-}
-
-void PointIndex::foreach(std::function<void (const PointIndexEl &)> fn) const
-{
- for(const auto &el : m_impl->m_store) fn(el);
-}
-
-/* **************************************************************************
- * BoxIndex implementation
- * ************************************************************************** */
-
-class BoxIndex::Impl {
-public:
- using BoostIndex = boost::geometry::index::
- rtree<BoxIndexEl, boost::geometry::index::rstar<16, 4> /* ? */>;
-
- BoostIndex m_store;
-};
-
-BoxIndex::BoxIndex(): m_impl(new Impl()) {}
-BoxIndex::~BoxIndex() {}
-
-BoxIndex::BoxIndex(const BoxIndex &cpy): m_impl(new Impl(*cpy.m_impl)) {}
-BoxIndex::BoxIndex(BoxIndex&& cpy): m_impl(std::move(cpy.m_impl)) {}
-
-BoxIndex& BoxIndex::operator=(const BoxIndex &cpy)
-{
- m_impl.reset(new Impl(*cpy.m_impl));
- return *this;
-}
-
-BoxIndex& BoxIndex::operator=(BoxIndex &&cpy)
-{
- m_impl.swap(cpy.m_impl);
- return *this;
-}
-
-void BoxIndex::insert(const BoxIndexEl &el)
-{
- m_impl->m_store.insert(el);
-}
-
-bool BoxIndex::remove(const BoxIndexEl& el)
-{
- return m_impl->m_store.remove(el) == 1;
-}
-
-std::vector<BoxIndexEl> BoxIndex::query(const BoundingBox &qrbb,
- BoxIndex::QueryType qt)
-{
- namespace bgi = boost::geometry::index;
-
- std::vector<BoxIndexEl> ret; ret.reserve(m_impl->m_store.size());
-
- switch (qt) {
- case qtIntersects:
- m_impl->m_store.query(bgi::intersects(qrbb), std::back_inserter(ret));
- break;
- case qtWithin:
- m_impl->m_store.query(bgi::within(qrbb), std::back_inserter(ret));
- }
-
- return ret;
-}
-
-size_t BoxIndex::size() const
-{
- return m_impl->m_store.size();
-}
-
-void BoxIndex::foreach(std::function<void (const BoxIndexEl &)> fn)
-{
- for(auto& el : m_impl->m_store) fn(el);
-}
-
-/* ****************************************************************************
- * EigenMesh3D implementation
- * ****************************************************************************/
-
-class EigenMesh3D::AABBImpl: public igl::AABB<Eigen::MatrixXd, 3> {
-public:
-#ifdef SLIC3R_SLA_NEEDS_WINDTREE
- igl::WindingNumberAABB<Vec3d, Eigen::MatrixXd, Eigen::MatrixXi> windtree;
-#endif /* SLIC3R_SLA_NEEDS_WINDTREE */
-};
-
-EigenMesh3D::EigenMesh3D(const TriangleMesh& tmesh): m_aabb(new AABBImpl()) {
- static const double dEPS = 1e-6;
-
- const stl_file& stl = tmesh.stl;
-
- auto&& bb = tmesh.bounding_box();
- m_ground_level += bb.min(Z);
-
- Eigen::MatrixXd V;
- Eigen::MatrixXi F;
-
- V.resize(3*stl.stats.number_of_facets, 3);
- F.resize(stl.stats.number_of_facets, 3);
- for (unsigned int i = 0; i < stl.stats.number_of_facets; ++i) {
- const stl_facet &facet = stl.facet_start[i];
- V.block<1, 3>(3 * i + 0, 0) = facet.vertex[0].cast<double>();
- V.block<1, 3>(3 * i + 1, 0) = facet.vertex[1].cast<double>();
- V.block<1, 3>(3 * i + 2, 0) = facet.vertex[2].cast<double>();
- F(i, 0) = int(3*i+0);
- F(i, 1) = int(3*i+1);
- F(i, 2) = int(3*i+2);
- }
-
- // We will convert this to a proper 3d mesh with no duplicate points.
- Eigen::VectorXi SVI, SVJ;
- igl::remove_duplicate_vertices(V, F, dEPS, m_V, SVI, SVJ, m_F);
-
- // Build the AABB accelaration tree
- m_aabb->init(m_V, m_F);
-#ifdef SLIC3R_SLA_NEEDS_WINDTREE
- m_aabb->windtree.set_mesh(m_V, m_F);
-#endif /* SLIC3R_SLA_NEEDS_WINDTREE */
-}
-
-EigenMesh3D::~EigenMesh3D() {}
-
-EigenMesh3D::EigenMesh3D(const EigenMesh3D &other):
- m_V(other.m_V), m_F(other.m_F), m_ground_level(other.m_ground_level),
- m_aabb( new AABBImpl(*other.m_aabb) ) {}
-
-EigenMesh3D::EigenMesh3D(const Contour3D &other)
-{
- m_V.resize(Eigen::Index(other.points.size()), 3);
- m_F.resize(Eigen::Index(other.faces3.size() + 2 * other.faces4.size()), 3);
-
- for (Eigen::Index i = 0; i < Eigen::Index(other.points.size()); ++i)
- m_V.row(i) = other.points[size_t(i)];
-
- for (Eigen::Index i = 0; i < Eigen::Index(other.faces3.size()); ++i)
- m_F.row(i) = other.faces3[size_t(i)];
-
- size_t N = other.faces3.size() + 2 * other.faces4.size();
- for (size_t i = other.faces3.size(); i < N; i += 2) {
- size_t quad_idx = (i - other.faces3.size()) / 2;
- auto & quad = other.faces4[quad_idx];
- m_F.row(Eigen::Index(i)) = Vec3i{quad(0), quad(1), quad(2)};
- m_F.row(Eigen::Index(i + 1)) = Vec3i{quad(2), quad(3), quad(0)};
- }
-}
-
-EigenMesh3D &EigenMesh3D::operator=(const EigenMesh3D &other)
-{
- m_V = other.m_V;
- m_F = other.m_F;
- m_ground_level = other.m_ground_level;
- m_aabb.reset(new AABBImpl(*other.m_aabb)); return *this;
-}
-
-EigenMesh3D::hit_result
-EigenMesh3D::query_ray_hit(const Vec3d &s, const Vec3d &dir) const
-{
- igl::Hit hit;
- hit.t = std::numeric_limits<float>::infinity();
- m_aabb->intersect_ray(m_V, m_F, s, dir, hit);
-
- hit_result ret(*this);
- ret.m_t = double(hit.t);
- ret.m_dir = dir;
- ret.m_source = s;
- if(!std::isinf(hit.t) && !std::isnan(hit.t)) ret.m_face_id = hit.id;
-
- return ret;
-}
-
-std::vector<EigenMesh3D::hit_result>
-EigenMesh3D::query_ray_hits(const Vec3d &s, const Vec3d &dir) const
-{
- std::vector<EigenMesh3D::hit_result> outs;
- std::vector<igl::Hit> hits;
- m_aabb->intersect_ray(m_V, m_F, s, dir, hits);
-
- // The sort is necessary, the hits are not always sorted.
- std::sort(hits.begin(), hits.end(),
- [](const igl::Hit& a, const igl::Hit& b) { return a.t < b.t; });
-
- // Convert the igl::Hit into hit_result
- outs.reserve(hits.size());
- for (const igl::Hit& hit : hits) {
- outs.emplace_back(EigenMesh3D::hit_result(*this));
- outs.back().m_t = double(hit.t);
- outs.back().m_dir = dir;
- outs.back().m_source = s;
- if(!std::isinf(hit.t) && !std::isnan(hit.t))
- outs.back().m_face_id = hit.id;
- }
-
- return outs;
-}
-
-#ifdef SLIC3R_SLA_NEEDS_WINDTREE
-EigenMesh3D::si_result EigenMesh3D::signed_distance(const Vec3d &p) const {
- double sign = 0; double sqdst = 0; int i = 0; Vec3d c;
- igl::signed_distance_winding_number(*m_aabb, m_V, m_F, m_aabb->windtree,
- p, sign, sqdst, i, c);
-
- return si_result(sign * std::sqrt(sqdst), i, c);
-}
-
-bool EigenMesh3D::inside(const Vec3d &p) const {
- return m_aabb->windtree.inside(p);
-}
-#endif /* SLIC3R_SLA_NEEDS_WINDTREE */
-
-double EigenMesh3D::squared_distance(const Vec3d &p, int& i, Vec3d& c) const {
- double sqdst = 0;
- Eigen::Matrix<double, 1, 3> pp = p;
- Eigen::Matrix<double, 1, 3> cc;
- sqdst = m_aabb->squared_distance(m_V, m_F, pp, i, cc);
- c = cc;
- return sqdst;
-}
-
-/* ****************************************************************************
- * Misc functions
- * ****************************************************************************/
-
-namespace {
-
-bool point_on_edge(const Vec3d& p, const Vec3d& e1, const Vec3d& e2,
- double eps = 0.05)
-{
- using Line3D = Eigen::ParametrizedLine<double, 3>;
-
- auto line = Line3D::Through(e1, e2);
- double d = line.distance(p);
- return std::abs(d) < eps;
-}
-
-template<class Vec> double distance(const Vec& pp1, const Vec& pp2) {
- auto p = pp2 - pp1;
- return std::sqrt(p.transpose() * p);
-}
-
-}
-
-PointSet normals(const PointSet& points,
- const EigenMesh3D& mesh,
- double eps,
- std::function<void()> thr, // throw on cancel
- const std::vector<unsigned>& pt_indices)
-{
- if(points.rows() == 0 || mesh.V().rows() == 0 || mesh.F().rows() == 0)
- return {};
-
- std::vector<unsigned> range = pt_indices;
- if(range.empty()) {
- range.resize(size_t(points.rows()), 0);
- std::iota(range.begin(), range.end(), 0);
- }
-
- PointSet ret(range.size(), 3);
-
-// for (size_t ridx = 0; ridx < range.size(); ++ridx)
- tbb::parallel_for(size_t(0), range.size(),
- [&ret, &range, &mesh, &points, thr, eps](size_t ridx)
- {
- thr();
- auto eidx = Eigen::Index(range[ridx]);
- int faceid = 0;
- Vec3d p;
-
- mesh.squared_distance(points.row(eidx), faceid, p);
-
- auto trindex = mesh.F().row(faceid);
-
- const Vec3d& p1 = mesh.V().row(trindex(0));
- const Vec3d& p2 = mesh.V().row(trindex(1));
- const Vec3d& p3 = mesh.V().row(trindex(2));
-
- // We should check if the point lies on an edge of the hosting triangle.
- // If it does then all the other triangles using the same two points
- // have to be searched and the final normal should be some kind of
- // aggregation of the participating triangle normals. We should also
- // consider the cases where the support point lies right on a vertex
- // of its triangle. The procedure is the same, get the neighbor
- // triangles and calculate an average normal.
-
- // mark the vertex indices of the edge. ia and ib marks and edge ic
- // will mark a single vertex.
- int ia = -1, ib = -1, ic = -1;
-
- if(std::abs(distance(p, p1)) < eps) {
- ic = trindex(0);
- }
- else if(std::abs(distance(p, p2)) < eps) {
- ic = trindex(1);
- }
- else if(std::abs(distance(p, p3)) < eps) {
- ic = trindex(2);
- }
- else if(point_on_edge(p, p1, p2, eps)) {
- ia = trindex(0); ib = trindex(1);
- }
- else if(point_on_edge(p, p2, p3, eps)) {
- ia = trindex(1); ib = trindex(2);
- }
- else if(point_on_edge(p, p1, p3, eps)) {
- ia = trindex(0); ib = trindex(2);
- }
-
- // vector for the neigboring triangles including the detected one.
- std::vector<Vec3i> neigh;
- if(ic >= 0) { // The point is right on a vertex of the triangle
- for(int n = 0; n < mesh.F().rows(); ++n) {
- thr();
- Vec3i ni = mesh.F().row(n);
- if((ni(X) == ic || ni(Y) == ic || ni(Z) == ic))
- neigh.emplace_back(ni);
- }
- }
- else if(ia >= 0 && ib >= 0) { // the point is on and edge
- // now get all the neigboring triangles
- for(int n = 0; n < mesh.F().rows(); ++n) {
- thr();
- Vec3i ni = mesh.F().row(n);
- if((ni(X) == ia || ni(Y) == ia || ni(Z) == ia) &&
- (ni(X) == ib || ni(Y) == ib || ni(Z) == ib))
- neigh.emplace_back(ni);
- }
- }
-
- // Calculate the normals for the neighboring triangles
- std::vector<Vec3d> neighnorms; neighnorms.reserve(neigh.size());
- for(const Vec3i& tri : neigh) {
- const Vec3d& pt1 = mesh.V().row(tri(0));
- const Vec3d& pt2 = mesh.V().row(tri(1));
- const Vec3d& pt3 = mesh.V().row(tri(2));
- Eigen::Vector3d U = pt2 - pt1;
- Eigen::Vector3d V = pt3 - pt1;
- neighnorms.emplace_back(U.cross(V).normalized());
- }
-
- // Throw out duplicates. They would cause trouble with summing. We will
- // use std::unique which works on sorted ranges. We will sort by the
- // coefficient-wise sum of the normals. It should force the same
- // elements to be consecutive.
- std::sort(neighnorms.begin(), neighnorms.end(),
- [](const Vec3d& v1, const Vec3d& v2){
- return v1.sum() < v2.sum();
- });
-
- auto lend = std::unique(neighnorms.begin(), neighnorms.end(),
- [](const Vec3d& n1, const Vec3d& n2) {
- // Compare normals for equivalence. This is controvers stuff.
- auto deq = [](double a, double b) { return std::abs(a-b) < 1e-3; };
- return deq(n1(X), n2(X)) && deq(n1(Y), n2(Y)) && deq(n1(Z), n2(Z));
- });
-
- if(!neighnorms.empty()) { // there were neighbors to count with
- // sum up the normals and then normalize the result again.
- // This unification seems to be enough.
- Vec3d sumnorm(0, 0, 0);
- sumnorm = std::accumulate(neighnorms.begin(), lend, sumnorm);
- sumnorm.normalize();
- ret.row(long(ridx)) = sumnorm;
- }
- else { // point lies safely within its triangle
- Eigen::Vector3d U = p2 - p1;
- Eigen::Vector3d V = p3 - p1;
- ret.row(long(ridx)) = U.cross(V).normalized();
- }
- });
-
- return ret;
-}
-
-namespace bgi = boost::geometry::index;
-using Index3D = bgi::rtree< PointIndexEl, bgi::rstar<16, 4> /* ? */ >;
-
-namespace {
-
-bool cmp_ptidx_elements(const PointIndexEl& e1, const PointIndexEl& e2)
-{
- return e1.second < e2.second;
-};
-
-ClusteredPoints cluster(Index3D &sindex,
- unsigned max_points,
- std::function<std::vector<PointIndexEl>(
- const Index3D &, const PointIndexEl &)> qfn)
-{
- using Elems = std::vector<PointIndexEl>;
-
- // Recursive function for visiting all the points in a given distance to
- // each other
- std::function<void(Elems&, Elems&)> group =
- [&sindex, &group, max_points, qfn](Elems& pts, Elems& cluster)
- {
- for(auto& p : pts) {
- std::vector<PointIndexEl> tmp = qfn(sindex, p);
-
- std::sort(tmp.begin(), tmp.end(), cmp_ptidx_elements);
-
- Elems newpts;
- std::set_difference(tmp.begin(), tmp.end(),
- cluster.begin(), cluster.end(),
- std::back_inserter(newpts), cmp_ptidx_elements);
-
- int c = max_points && newpts.size() + cluster.size() > max_points?
- int(max_points - cluster.size()) : int(newpts.size());
-
- cluster.insert(cluster.end(), newpts.begin(), newpts.begin() + c);
- std::sort(cluster.begin(), cluster.end(), cmp_ptidx_elements);
-
- if(!newpts.empty() && (!max_points || cluster.size() < max_points))
- group(newpts, cluster);
- }
- };
-
- std::vector<Elems> clusters;
- for(auto it = sindex.begin(); it != sindex.end();) {
- Elems cluster = {};
- Elems pts = {*it};
- group(pts, cluster);
-
- for(auto& c : cluster) sindex.remove(c);
- it = sindex.begin();
-
- clusters.emplace_back(cluster);
- }
-
- ClusteredPoints result;
- for(auto& cluster : clusters) {
- result.emplace_back();
- for(auto c : cluster) result.back().emplace_back(c.second);
- }
-
- return result;
-}
-
-std::vector<PointIndexEl> distance_queryfn(const Index3D& sindex,
- const PointIndexEl& p,
- double dist,
- unsigned max_points)
-{
- std::vector<PointIndexEl> tmp; tmp.reserve(max_points);
- sindex.query(
- bgi::nearest(p.first, max_points),
- std::back_inserter(tmp)
- );
-
- for(auto it = tmp.begin(); it < tmp.end(); ++it)
- if(distance(p.first, it->first) > dist) it = tmp.erase(it);
-
- return tmp;
-}
-
-} // namespace
-
-// Clustering a set of points by the given criteria
-ClusteredPoints cluster(
- const std::vector<unsigned>& indices,
- std::function<Vec3d(unsigned)> pointfn,
- double dist,
- unsigned max_points)
-{
- // A spatial index for querying the nearest points
- Index3D sindex;
-
- // Build the index
- for(auto idx : indices) sindex.insert( std::make_pair(pointfn(idx), idx));
-
- return cluster(sindex, max_points,
- [dist, max_points](const Index3D& sidx, const PointIndexEl& p)
- {
- return distance_queryfn(sidx, p, dist, max_points);
- });
-}
-
-// Clustering a set of points by the given criteria
-ClusteredPoints cluster(
- const std::vector<unsigned>& indices,
- std::function<Vec3d(unsigned)> pointfn,
- std::function<bool(const PointIndexEl&, const PointIndexEl&)> predicate,
- unsigned max_points)
-{
- // A spatial index for querying the nearest points
- Index3D sindex;
-
- // Build the index
- for(auto idx : indices) sindex.insert( std::make_pair(pointfn(idx), idx));
-
- return cluster(sindex, max_points,
- [max_points, predicate](const Index3D& sidx, const PointIndexEl& p)
- {
- std::vector<PointIndexEl> tmp; tmp.reserve(max_points);
- sidx.query(bgi::satisfies([p, predicate](const PointIndexEl& e){
- return predicate(p, e);
- }), std::back_inserter(tmp));
- return tmp;
- });
-}
-
-ClusteredPoints cluster(const PointSet& pts, double dist, unsigned max_points)
-{
- // A spatial index for querying the nearest points
- Index3D sindex;
-
- // Build the index
- for(Eigen::Index i = 0; i < pts.rows(); i++)
- sindex.insert(std::make_pair(Vec3d(pts.row(i)), unsigned(i)));
-
- return cluster(sindex, max_points,
- [dist, max_points](const Index3D& sidx, const PointIndexEl& p)
- {
- return distance_queryfn(sidx, p, dist, max_points);
- });
-}
-
-} // namespace sla
-} // namespace Slic3r
diff --git a/src/libslic3r/SLA/SupportTreeMesher.cpp b/src/libslic3r/SLA/SupportTreeMesher.cpp
new file mode 100644
index 000000000..15491775b
--- /dev/null
+++ b/src/libslic3r/SLA/SupportTreeMesher.cpp
@@ -0,0 +1,266 @@
+#include "SupportTreeMesher.hpp"
+
+namespace Slic3r { namespace sla {
+
+Contour3D sphere(double rho, Portion portion, double fa) {
+
+ Contour3D ret;
+
+ // prohibit close to zero radius
+ if(rho <= 1e-6 && rho >= -1e-6) return ret;
+
+ auto& vertices = ret.points;
+ auto& facets = ret.faces3;
+
+ // Algorithm:
+ // Add points one-by-one to the sphere grid and form facets using relative
+ // coordinates. Sphere is composed effectively of a mesh of stacked circles.
+
+ // adjust via rounding to get an even multiple for any provided angle.
+ double angle = (2*PI / floor(2*PI / fa));
+
+ // Ring to be scaled to generate the steps of the sphere
+ std::vector<double> ring;
+
+ for (double i = 0; i < 2*PI; i+=angle) ring.emplace_back(i);
+
+ const auto sbegin = size_t(2*std::get<0>(portion)/angle);
+ const auto send = size_t(2*std::get<1>(portion)/angle);
+
+ const size_t steps = ring.size();
+ const double increment = 1.0 / double(steps);
+
+ // special case: first ring connects to 0,0,0
+ // insert and form facets.
+ if(sbegin == 0)
+ vertices.emplace_back(Vec3d(0.0, 0.0, -rho + increment*sbegin*2.0*rho));
+
+ auto id = coord_t(vertices.size());
+ for (size_t i = 0; i < ring.size(); i++) {
+ // Fixed scaling
+ const double z = -rho + increment*rho*2.0 * (sbegin + 1.0);
+ // radius of the circle for this step.
+ const double r = std::sqrt(std::abs(rho*rho - z*z));
+ Vec2d b = Eigen::Rotation2Dd(ring[i]) * Eigen::Vector2d(0, r);
+ vertices.emplace_back(Vec3d(b(0), b(1), z));
+
+ if (sbegin == 0)
+ (i == 0) ? facets.emplace_back(coord_t(ring.size()), 0, 1) :
+ facets.emplace_back(id - 1, 0, id);
+ ++id;
+ }
+
+ // General case: insert and form facets for each step,
+ // joining it to the ring below it.
+ for (size_t s = sbegin + 2; s < send - 1; s++) {
+ const double z = -rho + increment*double(s*2.0*rho);
+ const double r = std::sqrt(std::abs(rho*rho - z*z));
+
+ for (size_t i = 0; i < ring.size(); i++) {
+ Vec2d b = Eigen::Rotation2Dd(ring[i]) * Eigen::Vector2d(0, r);
+ vertices.emplace_back(Vec3d(b(0), b(1), z));
+ auto id_ringsize = coord_t(id - int(ring.size()));
+ if (i == 0) {
+ // wrap around
+ facets.emplace_back(id - 1, id, id + coord_t(ring.size() - 1) );
+ facets.emplace_back(id - 1, id_ringsize, id);
+ } else {
+ facets.emplace_back(id_ringsize - 1, id_ringsize, id);
+ facets.emplace_back(id - 1, id_ringsize - 1, id);
+ }
+ id++;
+ }
+ }
+
+ // special case: last ring connects to 0,0,rho*2.0
+ // only form facets.
+ if(send >= size_t(2*PI / angle)) {
+ vertices.emplace_back(Vec3d(0.0, 0.0, -rho + increment*send*2.0*rho));
+ for (size_t i = 0; i < ring.size(); i++) {
+ auto id_ringsize = coord_t(id - int(ring.size()));
+ if (i == 0) {
+ // third vertex is on the other side of the ring.
+ facets.emplace_back(id - 1, id_ringsize, id);
+ } else {
+ auto ci = coord_t(id_ringsize + coord_t(i));
+ facets.emplace_back(ci - 1, ci, id);
+ }
+ }
+ }
+ id++;
+
+ return ret;
+}
+
+Contour3D cylinder(double r, double h, size_t ssteps, const Vec3d &sp)
+{
+ assert(ssteps > 0);
+
+ Contour3D ret;
+
+ auto steps = int(ssteps);
+ auto& points = ret.points;
+ auto& indices = ret.faces3;
+ points.reserve(2*ssteps);
+ double a = 2*PI/steps;
+
+ Vec3d jp = sp;
+ Vec3d endp = {sp(X), sp(Y), sp(Z) + h};
+
+ // Upper circle points
+ for(int i = 0; i < steps; ++i) {
+ double phi = i*a;
+ double ex = endp(X) + r*std::cos(phi);
+ double ey = endp(Y) + r*std::sin(phi);
+ points.emplace_back(ex, ey, endp(Z));
+ }
+
+ // Lower circle points
+ for(int i = 0; i < steps; ++i) {
+ double phi = i*a;
+ double x = jp(X) + r*std::cos(phi);
+ double y = jp(Y) + r*std::sin(phi);
+ points.emplace_back(x, y, jp(Z));
+ }
+
+ // Now create long triangles connecting upper and lower circles
+ indices.reserve(2*ssteps);
+ auto offs = steps;
+ for(int i = 0; i < steps - 1; ++i) {
+ indices.emplace_back(i, i + offs, offs + i + 1);
+ indices.emplace_back(i, offs + i + 1, i + 1);
+ }
+
+ // Last triangle connecting the first and last vertices
+ auto last = steps - 1;
+ indices.emplace_back(0, last, offs);
+ indices.emplace_back(last, offs + last, offs);
+
+ // According to the slicing algorithms, we need to aid them with generating
+ // a watertight body. So we create a triangle fan for the upper and lower
+ // ending of the cylinder to close the geometry.
+ points.emplace_back(jp); int ci = int(points.size() - 1);
+ for(int i = 0; i < steps - 1; ++i)
+ indices.emplace_back(i + offs + 1, i + offs, ci);
+
+ indices.emplace_back(offs, steps + offs - 1, ci);
+
+ points.emplace_back(endp); ci = int(points.size() - 1);
+ for(int i = 0; i < steps - 1; ++i)
+ indices.emplace_back(ci, i, i + 1);
+
+ indices.emplace_back(steps - 1, 0, ci);
+
+ return ret;
+}
+
+Contour3D pinhead(double r_pin, double r_back, double length, size_t steps)
+{
+ assert(steps > 0);
+ assert(length >= 0.);
+ assert(r_back > 0.);
+ assert(r_pin > 0.);
+
+ Contour3D mesh;
+
+ // We create two spheres which will be connected with a robe that fits
+ // both circles perfectly.
+
+ // Set up the model detail level
+ const double detail = 2 * PI / steps;
+
+ // We don't generate whole circles. Instead, we generate only the
+ // portions which are visible (not covered by the robe) To know the
+ // exact portion of the bottom and top circles we need to use some
+ // rules of tangent circles from which we can derive (using simple
+ // triangles the following relations:
+
+ // The height of the whole mesh
+ const double h = r_back + r_pin + length;
+ double phi = PI / 2. - std::acos((r_back - r_pin) / h);
+
+ // To generate a whole circle we would pass a portion of (0, Pi)
+ // To generate only a half horizontal circle we can pass (0, Pi/2)
+ // The calculated phi is an offset to the half circles needed to smooth
+ // the transition from the circle to the robe geometry
+
+ auto &&s1 = sphere(r_back, make_portion(0, PI / 2 + phi), detail);
+ auto &&s2 = sphere(r_pin, make_portion(PI / 2 + phi, PI), detail);
+
+ for (auto &p : s2.points) p.z() += h;
+
+ mesh.merge(s1);
+ mesh.merge(s2);
+
+ for (size_t idx1 = s1.points.size() - steps, idx2 = s1.points.size();
+ idx1 < s1.points.size() - 1; idx1++, idx2++) {
+ coord_t i1s1 = coord_t(idx1), i1s2 = coord_t(idx2);
+ coord_t i2s1 = i1s1 + 1, i2s2 = i1s2 + 1;
+
+ mesh.faces3.emplace_back(i1s1, i2s1, i2s2);
+ mesh.faces3.emplace_back(i1s1, i2s2, i1s2);
+ }
+
+ auto i1s1 = coord_t(s1.points.size()) - coord_t(steps);
+ auto i2s1 = coord_t(s1.points.size()) - 1;
+ auto i1s2 = coord_t(s1.points.size());
+ auto i2s2 = coord_t(s1.points.size()) + coord_t(steps) - 1;
+
+ mesh.faces3.emplace_back(i2s2, i2s1, i1s1);
+ mesh.faces3.emplace_back(i1s2, i2s2, i1s1);
+
+ return mesh;
+}
+
+Contour3D halfcone(double baseheight,
+ double r_bottom,
+ double r_top,
+ const Vec3d &pos,
+ size_t steps)
+{
+ assert(steps > 0);
+
+ if (baseheight <= 0 || steps <= 0) return {};
+
+ Contour3D base;
+
+ double a = 2 * PI / steps;
+ auto last = int(steps - 1);
+ Vec3d ep{pos.x(), pos.y(), pos.z() + baseheight};
+ for (size_t i = 0; i < steps; ++i) {
+ double phi = i * a;
+ double x = pos.x() + r_top * std::cos(phi);
+ double y = pos.y() + r_top * std::sin(phi);
+ base.points.emplace_back(x, y, ep.z());
+ }
+
+ for (size_t i = 0; i < steps; ++i) {
+ double phi = i * a;
+ double x = pos.x() + r_bottom * std::cos(phi);
+ double y = pos.y() + r_bottom * std::sin(phi);
+ base.points.emplace_back(x, y, pos.z());
+ }
+
+ base.points.emplace_back(pos);
+ base.points.emplace_back(ep);
+
+ auto &indices = base.faces3;
+ auto hcenter = int(base.points.size() - 1);
+ auto lcenter = int(base.points.size() - 2);
+ auto offs = int(steps);
+ for (int i = 0; i < last; ++i) {
+ indices.emplace_back(i, i + offs, offs + i + 1);
+ indices.emplace_back(i, offs + i + 1, i + 1);
+ indices.emplace_back(i, i + 1, hcenter);
+ indices.emplace_back(lcenter, offs + i + 1, offs + i);
+ }
+
+ indices.emplace_back(0, last, offs);
+ indices.emplace_back(last, offs + last, offs);
+ indices.emplace_back(hcenter, last, 0);
+ indices.emplace_back(offs, offs + last, lcenter);
+
+ return base;
+}
+
+}} // namespace Slic3r::sla
diff --git a/src/libslic3r/SLA/SupportTreeMesher.hpp b/src/libslic3r/SLA/SupportTreeMesher.hpp
new file mode 100644
index 000000000..63182745d
--- /dev/null
+++ b/src/libslic3r/SLA/SupportTreeMesher.hpp
@@ -0,0 +1,117 @@
+#ifndef SUPPORTTREEMESHER_HPP
+#define SUPPORTTREEMESHER_HPP
+
+#include "libslic3r/Point.hpp"
+
+#include "libslic3r/SLA/SupportTreeBuilder.hpp"
+#include "libslic3r/SLA/Contour3D.hpp"
+
+namespace Slic3r { namespace sla {
+
+using Portion = std::tuple<double, double>;
+
+inline Portion make_portion(double a, double b)
+{
+ return std::make_tuple(a, b);
+}
+
+Contour3D sphere(double rho,
+ Portion portion = make_portion(0., 2. * PI),
+ double fa = (2. * PI / 360.));
+
+// Down facing cylinder in Z direction with arguments:
+// r: radius
+// h: Height
+// ssteps: how many edges will create the base circle
+// sp: starting point
+Contour3D cylinder(double r,
+ double h,
+ size_t steps = 45,
+ const Vec3d &sp = Vec3d::Zero());
+
+Contour3D pinhead(double r_pin, double r_back, double length, size_t steps = 45);
+
+Contour3D halfcone(double baseheight,
+ double r_bottom,
+ double r_top,
+ const Vec3d &pt = Vec3d::Zero(),
+ size_t steps = 45);
+
+inline Contour3D get_mesh(const Head &h, size_t steps)
+{
+ Contour3D mesh = pinhead(h.r_pin_mm, h.r_back_mm, h.width_mm, steps);
+
+ for(auto& p : mesh.points) p.z() -= (h.fullwidth() - h.r_back_mm);
+
+ using Quaternion = Eigen::Quaternion<double>;
+
+ // We rotate the head to the specified direction. The head's pointing
+ // side is facing upwards so this means that it would hold a support
+ // point with a normal pointing straight down. This is the reason of
+ // the -1 z coordinate
+ auto quatern = Quaternion::FromTwoVectors(Vec3d{0, 0, -1}, h.dir);
+
+ for(auto& p : mesh.points) p = quatern * p + h.pos;
+
+ return mesh;
+}
+
+inline Contour3D get_mesh(const Pillar &p, size_t steps)
+{
+ if(p.height > EPSILON) { // Endpoint is below the starting point
+ // We just create a bridge geometry with the pillar parameters and
+ // move the data.
+ return cylinder(p.r, p.height, steps, p.endpoint());
+ }
+
+ return {};
+}
+
+inline Contour3D get_mesh(const Pedestal &p, size_t steps)
+{
+ return halfcone(p.height, p.r_bottom, p.r_top, p.pos, steps);
+}
+
+inline Contour3D get_mesh(const Junction &j, size_t steps)
+{
+ Contour3D mesh = sphere(j.r, make_portion(0, PI), 2 *PI / steps);
+ for(auto& p : mesh.points) p += j.pos;
+ return mesh;
+}
+
+inline Contour3D get_mesh(const Bridge &br, size_t steps)
+{
+ using Quaternion = Eigen::Quaternion<double>;
+ Vec3d v = (br.endp - br.startp);
+ Vec3d dir = v.normalized();
+ double d = v.norm();
+
+ Contour3D mesh = cylinder(br.r, d, steps);
+
+ auto quater = Quaternion::FromTwoVectors(Vec3d{0,0,1}, dir);
+ for(auto& p : mesh.points) p = quater * p + br.startp;
+
+ return mesh;
+}
+
+inline Contour3D get_mesh(const DiffBridge &br, size_t steps)
+{
+ double h = br.get_length();
+ Contour3D mesh = halfcone(h, br.r, br.end_r, Vec3d::Zero(), steps);
+
+ using Quaternion = Eigen::Quaternion<double>;
+
+ // We rotate the head to the specified direction. The head's pointing
+ // side is facing upwards so this means that it would hold a support
+ // point with a normal pointing straight down. This is the reason of
+ // the -1 z coordinate
+ auto quatern = Quaternion::FromTwoVectors(Vec3d{0, 0, 1}, br.get_dir());
+
+ for(auto& p : mesh.points) p = quatern * p + br.startp;
+
+ return mesh;
+}
+
+}} // namespace Slic3r::sla
+
+#endif // SUPPORTTREEMESHER_HPP
diff --git a/src/libslic3r/SLAPrint.cpp b/src/libslic3r/SLAPrint.cpp
index 4ec5aae29..65fac73f3 100644
--- a/src/libslic3r/SLAPrint.cpp
+++ b/src/libslic3r/SLAPrint.cpp
@@ -4,6 +4,7 @@
#include "ClipperUtils.hpp"
#include "Geometry.hpp"
#include "MTUtils.hpp"
+#include "Thread.hpp"
#include <unordered_set>
#include <numeric>
@@ -35,13 +36,16 @@ bool is_zero_elevation(const SLAPrintObjectConfig &c)
}
// Compile the argument for support creation from the static print config.
-sla::SupportConfig make_support_cfg(const SLAPrintObjectConfig& c)
+sla::SupportTreeConfig make_support_cfg(const SLAPrintObjectConfig& c)
{
- sla::SupportConfig scfg;
+ sla::SupportTreeConfig scfg;
scfg.enabled = c.supports_enable.getBool();
scfg.head_front_radius_mm = 0.5*c.support_head_front_diameter.getFloat();
- scfg.head_back_radius_mm = 0.5*c.support_pillar_diameter.getFloat();
+ double pillar_r = 0.5 * c.support_pillar_diameter.getFloat();
+ scfg.head_back_radius_mm = pillar_r;
+ scfg.head_fallback_radius_mm =
+ 0.01 * c.support_small_pillar_diameter_percent.getFloat() * pillar_r;
scfg.head_penetration_mm = c.support_head_penetration.getFloat();
scfg.head_width_mm = c.support_head_width.getFloat();
scfg.object_elevation_mm = is_zero_elevation(c) ?
@@ -172,6 +176,16 @@ static std::vector<SLAPrintObject::Instance> sla_instances(const ModelObject &mo
return instances;
}
+std::vector<ObjectID> SLAPrint::print_object_ids() const
+{
+ std::vector<ObjectID> out;
+ // Reserve one more for the caller to append the ID of the Print itself.
+ out.reserve(m_objects.size() + 1);
+ for (const SLAPrintObject *print_object : m_objects)
+ out.emplace_back(print_object->id());
+ return out;
+}
+
SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, DynamicPrintConfig config)
{
#ifdef _DEBUG
@@ -179,10 +193,10 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, DynamicPrintConfig con
#endif /* _DEBUG */
// Normalize the config.
- config.option("sla_print_settings_id", true);
- config.option("sla_material_settings_id", true);
- config.option("printer_settings_id", true);
- config.normalize();
+ config.option("sla_print_settings_id", true);
+ config.option("sla_material_settings_id", true);
+ config.option("printer_settings_id", true);
+ config.option("physical_printer_settings_id", true);
// Collect changes to print config.
t_config_option_keys print_diff = m_print_config.diff(config);
t_config_option_keys printer_diff = m_printer_config.diff(config);
@@ -215,9 +229,10 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, DynamicPrintConfig con
// update_apply_status(this->invalidate_step(slapsRasterize));
m_placeholder_parser.apply_config(config);
// Set the profile aliases for the PrintBase::output_filename()
- m_placeholder_parser.set("print_preset", config.option("sla_print_settings_id")->clone());
- m_placeholder_parser.set("material_preset", config.option("sla_material_settings_id")->clone());
- m_placeholder_parser.set("printer_preset", config.option("printer_settings_id")->clone());
+ m_placeholder_parser.set("print_preset", config.option("sla_print_settings_id")->clone());
+ m_placeholder_parser.set("material_preset", config.option("sla_material_settings_id")->clone());
+ m_placeholder_parser.set("printer_preset", config.option("printer_settings_id")->clone());
+ m_placeholder_parser.set("physical_printer_preset", config.option("physical_printer_settings_id")->clone());
}
// It is also safe to change m_config now after this->invalidate_state_by_config_options() call.
@@ -227,6 +242,8 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, DynamicPrintConfig con
m_material_config.apply_only(config, material_diff, true);
// Handle changes to object config defaults
m_default_object_config.apply_only(config, object_diff, true);
+
+ if (m_printer) m_printer->apply(m_printer_config);
struct ModelObjectStatus {
enum Status {
@@ -390,12 +407,12 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, DynamicPrintConfig con
model_object.assign_copy(model_object_new);
} else {
// Synchronize Object's config.
- bool object_config_changed = model_object.config != model_object_new.config;
+ bool object_config_changed = ! model_object.config.timestamp_matches(model_object_new.config);
if (object_config_changed)
- static_cast<DynamicPrintConfig&>(model_object.config) = static_cast<const DynamicPrintConfig&>(model_object_new.config);
+ model_object.config.assign_config(model_object_new.config);
if (! object_diff.empty() || object_config_changed) {
SLAPrintObjectConfig new_config = m_default_object_config;
- normalize_and_apply_config(new_config, model_object.config);
+ new_config.apply(model_object.config.get(), true);
if (it_print_object_status != print_object_status.end()) {
t_config_option_keys diff = it_print_object_status->print_object->config().diff(new_config);
if (! diff.empty()) {
@@ -459,9 +476,8 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, DynamicPrintConfig con
print_object->set_instances(std::move(new_instances));
- SLAPrintObjectConfig new_config = m_default_object_config;
- normalize_and_apply_config(new_config, model_object.config);
- print_object->config_apply(new_config, true);
+ print_object->config_apply(m_default_object_config, true);
+ print_object->config_apply(model_object.config.get(), true);
print_objects_new.emplace_back(print_object);
new_objects = true;
}
@@ -482,7 +498,6 @@ SLAPrint::ApplyStatus SLAPrint::apply(const Model &model, DynamicPrintConfig con
}
if(m_objects.empty()) {
- m_printer.reset();
m_printer_input = {};
m_print_statistics = {};
}
@@ -615,7 +630,7 @@ std::string SLAPrint::validate() const
return L("Cannot proceed without support points! "
"Add support points or disable support generation.");
- sla::SupportConfig cfg = make_support_cfg(po->config());
+ sla::SupportTreeConfig cfg = make_support_cfg(po->config());
double elv = cfg.object_elevation_mm;
@@ -657,6 +672,12 @@ std::string SLAPrint::validate() const
return "";
}
+void SLAPrint::set_printer(SLAPrinter *arch)
+{
+ invalidate_step(slapsRasterize);
+ m_printer = arch;
+}
+
bool SLAPrint::invalidate_step(SLAPrintStep step)
{
bool invalidated = Inherited::invalidate_step(step);
@@ -671,12 +692,15 @@ bool SLAPrint::invalidate_step(SLAPrintStep step)
void SLAPrint::process()
{
- if(m_objects.empty()) return;
+ if (m_objects.empty())
+ return;
+
+ name_tbb_thread_pool_threads();
// Assumption: at this point the print objects should be populated only with
// the model objects we have to process and the instances are also filtered
- Steps printsteps{this};
+ Steps printsteps(this);
// We want to first process all objects...
std::vector<SLAPrintObjectStep> level1_obj_steps = {
@@ -729,7 +753,7 @@ void SLAPrint::process()
throw_if_canceled();
po->set_done(step);
}
-
+
incr = printsteps.progressrange(step);
}
}
@@ -754,7 +778,7 @@ void SLAPrint::process()
throw_if_canceled();
set_done(currentstep);
}
-
+
st += printsteps.progressrange(currentstep);
}
@@ -855,36 +879,6 @@ bool SLAPrint::invalidate_state_by_config_options(const std::vector<t_config_opt
return invalidated;
}
-sla::RasterWriter & SLAPrint::init_printer()
-{
- sla::Raster::Resolution res;
- sla::Raster::PixelDim pxdim;
- std::array<bool, 2> mirror;
-
- double w = m_printer_config.display_width.getFloat();
- double h = m_printer_config.display_height.getFloat();
- auto pw = size_t(m_printer_config.display_pixels_x.getInt());
- auto ph = size_t(m_printer_config.display_pixels_y.getInt());
-
- mirror[X] = m_printer_config.display_mirror_x.getBool();
- mirror[Y] = m_printer_config.display_mirror_y.getBool();
-
- auto orientation = get_printer_orientation();
- if (orientation == sla::Raster::roPortrait) {
- std::swap(w, h);
- std::swap(pw, ph);
- }
-
- res = sla::Raster::Resolution{pw, ph};
- pxdim = sla::Raster::PixelDim{w / pw, h / ph};
- sla::Raster::Trafo tr{orientation, mirror};
- tr.gamma = m_printer_config.gamma_correction.getFloat();
-
- m_printer.reset(new sla::RasterWriter(res, pxdim, tr));
- m_printer->set_config(m_full_print_config);
- return *m_printer;
-}
-
// Returns true if an object step is done on all objects and there's at least one object.
bool SLAPrint::is_step_done(SLAPrintObjectStep step) const
{
@@ -948,6 +942,7 @@ bool SLAPrintObject::invalidate_state_by_config_options(const std::vector<t_conf
|| opt_key == "support_head_penetration"
|| opt_key == "support_head_width"
|| opt_key == "support_pillar_diameter"
+ || opt_key == "support_small_pillar_diameter_percent"
|| opt_key == "support_max_bridges_on_pillar"
|| opt_key == "support_pillar_connection_mode"
|| opt_key == "support_buildplate_only"
@@ -1200,6 +1195,12 @@ sla::DrainHoles SLAPrintObject::transformed_drainhole_points() const
hl.normal = Vec3f(hl.normal(0)/(sc(0)*sc(0)),
hl.normal(1)/(sc(1)*sc(1)),
hl.normal(2)/(sc(2)*sc(2)));
+
+ // Now shift the hole a bit above the object and make it deeper to
+ // compensate for it. This is to avoid problems when the hole is placed
+ // on (nearly) flat surface.
+ hl.pos -= hl.normal.normalized() * sla::HoleStickOutLength;
+ hl.height += sla::HoleStickOutLength;
}
return pts;
diff --git a/src/libslic3r/SLAPrint.hpp b/src/libslic3r/SLAPrint.hpp
index 70f773f6b..f69ed7b8e 100644
--- a/src/libslic3r/SLAPrint.hpp
+++ b/src/libslic3r/SLAPrint.hpp
@@ -1,9 +1,10 @@
#ifndef slic3r_SLAPrint_hpp_
#define slic3r_SLAPrint_hpp_
+#include <cstdint>
#include <mutex>
#include "PrintBase.hpp"
-#include "SLA/RasterWriter.hpp"
+#include "SLA/RasterBase.hpp"
#include "SLA/SupportTree.hpp"
#include "Point.hpp"
#include "MTUtils.hpp"
@@ -37,7 +38,7 @@ using _SLAPrintObjectBase =
// Layers according to quantized height levels. This will be consumed by
// the printer (rasterizer) in the SLAPrint class.
-// using coord_t = long long;
+// using coord_t = int64_t;
enum SliceOrigin { soSupport, soModel };
@@ -261,7 +262,7 @@ protected:
SLAPrintObject(SLAPrint* print, ModelObject* model_object);
~SLAPrintObject();
- void config_apply(const ConfigBase &other, bool ignore_nonexistent = false) { this->m_config.apply(other, ignore_nonexistent); }
+ void config_apply(const ConfigBase &other, bool ignore_nonexistent = false) { m_config.apply(other, ignore_nonexistent); }
void config_apply_only(const ConfigBase &other, const t_config_option_keys &keys, bool ignore_nonexistent = false)
{ this->m_config.apply_only(other, keys, ignore_nonexistent); }
@@ -350,6 +351,7 @@ struct SLAPrintStatistics
size_t fast_layers_count;
double total_cost;
double total_weight;
+ std::vector<double> layers_times;
// Config with the filled in print statistics.
DynamicConfig config() const;
@@ -366,6 +368,33 @@ struct SLAPrintStatistics
fast_layers_count = 0;
total_cost = 0.;
total_weight = 0.;
+ layers_times.clear();
+ }
+};
+
+class SLAPrinter {
+protected:
+ std::vector<sla::EncodedRaster> m_layers;
+
+ virtual uqptr<sla::RasterBase> create_raster() const = 0;
+ virtual sla::RasterEncoder get_encoder() const = 0;
+
+public:
+ virtual ~SLAPrinter() = default;
+
+ virtual void apply(const SLAPrinterConfig &cfg) = 0;
+
+ // Fn have to be thread safe: void(sla::RasterBase& raster, size_t lyrid);
+ template<class Fn> void draw_layers(size_t layer_num, Fn &&drawfn)
+ {
+ m_layers.resize(layer_num);
+ sla::ccr::for_each(size_t(0), m_layers.size(),
+ [this, &drawfn] (size_t idx) {
+ sla::EncodedRaster& enc = m_layers[idx];
+ auto rst = create_raster();
+ drawfn(*rst, idx);
+ enc = rst->encode(get_encoder());
+ });
}
};
@@ -394,6 +423,8 @@ public:
void clear() override;
bool empty() const override { return m_objects.empty(); }
+ // List of existing PrintObject IDs, to remove notifications for non-existent IDs.
+ std::vector<ObjectID> print_object_ids() const;
ApplyStatus apply(const Model &model, DynamicPrintConfig config) override;
void set_task(const TaskParams &params) override;
void process() override;
@@ -403,19 +434,14 @@ public:
// Returns true if the last step was finished with success.
bool finished() const override { return this->is_step_done(slaposSliceSupports) && this->Inherited::is_step_done(slapsRasterize); }
- inline void export_raster(const std::string& fpath,
- const std::string& projectname = "")
- {
- if(m_printer) m_printer->save(fpath, projectname);
- }
-
- inline void export_raster(Zipper &zipper,
- const std::string& projectname = "")
- {
- if(m_printer) m_printer->save(zipper, projectname);
- }
-
const PrintObjects& objects() const { return m_objects; }
+ // PrintObject by its ObjectID, to be used to uniquely bind slicing warnings to their source PrintObjects
+ // in the notification center.
+ const SLAPrintObject* get_object(ObjectID object_id) const {
+ auto it = std::find_if(m_objects.begin(), m_objects.end(),
+ [object_id](const SLAPrintObject *obj) { return obj->id() == object_id; });
+ return (it == m_objects.end()) ? nullptr : *it;
+ }
const SLAPrintConfig& print_config() const { return m_print_config; }
const SLAPrinterConfig& printer_config() const { return m_printer_config; }
@@ -445,14 +471,15 @@ public:
std::vector<ClipperLib::Polygon> m_transformed_slices;
- template<class Container> void transformed_slices(Container&& c) {
+ template<class Container> void transformed_slices(Container&& c)
+ {
m_transformed_slices = std::forward<Container>(c);
}
friend class SLAPrint::Steps;
public:
-
+
explicit PrintLayer(coord_t lvl) : m_level(lvl) {}
// for being sorted in their container (see m_printer_input)
@@ -474,8 +501,11 @@ public:
// The aggregated and leveled print records from various objects.
// TODO: use this structure for the preview in the future.
const std::vector<PrintLayer>& print_layers() const { return m_printer_input; }
-
+
+ void set_printer(SLAPrinter *archiver);
+
private:
+
// Implement same logic as in SLAPrintObject
bool invalidate_step(SLAPrintStep st);
@@ -491,13 +521,13 @@ private:
std::vector<bool> m_stepmask;
// Ready-made data for rasterization.
- std::vector<PrintLayer> m_printer_input;
-
- // The printer itself
- std::unique_ptr<sla::RasterWriter> m_printer;
-
+ std::vector<PrintLayer> m_printer_input;
+
+ // The archive object which collects the raster images after slicing
+ SLAPrinter *m_printer = nullptr;
+
// Estimated print time, material consumed.
- SLAPrintStatistics m_print_statistics;
+ SLAPrintStatistics m_print_statistics;
class StatusReporter
{
@@ -512,15 +542,6 @@ private:
double status() const { return m_st; }
} m_report_status;
-
- sla::RasterWriter &init_printer();
-
- inline sla::Raster::Orientation get_printer_orientation() const
- {
- auto ro = m_printer_config.display_orientation.getInt();
- return ro == sla::Raster::roPortrait ? sla::Raster::roPortrait :
- sla::Raster::roLandscape;
- }
friend SLAPrintObject;
};
@@ -529,7 +550,7 @@ private:
bool is_zero_elevation(const SLAPrintObjectConfig &c);
-sla::SupportConfig make_support_cfg(const SLAPrintObjectConfig& c);
+sla::SupportTreeConfig make_support_cfg(const SLAPrintObjectConfig& c);
sla::PadConfig::EmbedObject builtin_pad_cfg(const SLAPrintObjectConfig& c);
diff --git a/src/libslic3r/SLAPrintSteps.cpp b/src/libslic3r/SLAPrintSteps.cpp
index 01220a633..d8bea62ae 100644
--- a/src/libslic3r/SLAPrintSteps.cpp
+++ b/src/libslic3r/SLAPrintSteps.cpp
@@ -1,3 +1,4 @@
+#include <libslic3r/Exception.hpp>
#include <libslic3r/SLAPrintSteps.hpp>
#include <libslic3r/MeshBoolean.hpp>
@@ -92,9 +93,10 @@ void SLAPrint::Steps::apply_printer_corrections(SLAPrintObject &po, SliceOrigin
coord_t clpr_offs = scaled(doffs);
faded_lyrs = std::min(po.m_slice_index.size(), faded_lyrs);
+ size_t faded_lyrs_efc = std::max(size_t(1), faded_lyrs - 1);
- auto efc = [start_efc, faded_lyrs](size_t pos) {
- return (faded_lyrs - 1 - pos) * start_efc / (faded_lyrs - 1);
+ auto efc = [start_efc, faded_lyrs_efc](size_t pos) {
+ return (faded_lyrs_efc - pos) * start_efc / faded_lyrs_efc;
};
std::vector<ExPolygons> &slices = o == soModel ?
@@ -187,7 +189,7 @@ void SLAPrint::Steps::drill_holes(SLAPrintObject &po)
}
if (MeshBoolean::cgal::does_self_intersect(*holes_mesh_cgal))
- throw std::runtime_error(L("Too much overlapping holes."));
+ throw Slic3r::SlicingError(L("Too many overlapping holes."));
auto hollowed_mesh_cgal = MeshBoolean::cgal::triangle_mesh_to_cgal(hollowed_mesh);
@@ -195,7 +197,7 @@ void SLAPrint::Steps::drill_holes(SLAPrintObject &po)
MeshBoolean::cgal::minus(*hollowed_mesh_cgal, *holes_mesh_cgal);
hollowed_mesh = MeshBoolean::cgal::cgal_to_triangle_mesh(*hollowed_mesh_cgal);
} catch (const std::runtime_error &) {
- throw std::runtime_error(L(
+ throw Slic3r::SlicingError(L(
"Drilling holes into the mesh failed. "
"This is usually caused by broken model. Try to fix it first."));
}
@@ -241,7 +243,7 @@ void SLAPrint::Steps::slice_model(SLAPrintObject &po)
if(slindex_it == po.m_slice_index.end())
//TRN To be shown at the status bar on SLA slicing error.
- throw std::runtime_error(
+ throw Slic3r::RuntimeError(
L("Slicing had to be stopped due to an internal error: "
"Inconsistent slice index."));
@@ -264,11 +266,12 @@ void SLAPrint::Steps::slice_model(SLAPrintObject &po)
std::vector<ExPolygons> interior_slices;
interior_slicer.slice(slice_grid, SlicingMode::Regular, closing_r, &interior_slices, thr);
- sla::ccr::enumerate(interior_slices.begin(), interior_slices.end(),
- [&po](const ExPolygons &slice, size_t i) {
- po.m_model_slices[i] =
- diff_ex(po.m_model_slices[i], slice);
- });
+ sla::ccr::for_each(size_t(0), interior_slices.size(),
+ [&po, &interior_slices] (size_t i) {
+ const ExPolygons &slice = interior_slices[i];
+ po.m_model_slices[i] =
+ diff_ex(po.m_model_slices[i], slice);
+ });
}
auto mit = slindex_it;
@@ -360,18 +363,6 @@ void SLAPrint::Steps::support_points(SLAPrintObject &po)
// removed them on purpose. No calculation will be done.
po.m_supportdata->pts = po.transformed_support_points();
}
-
- // If the zero elevation mode is engaged, we have to filter out all the
- // points that are on the bottom of the object
- if (is_zero_elevation(po.config())) {
- double tolerance = po.config().pad_enable.getBool() ?
- po.m_config.pad_wall_thickness.getFloat() :
- po.m_config.support_base_height.getFloat();
-
- remove_bottom_points(po.m_supportdata->pts,
- po.m_supportdata->emesh.ground_level(),
- tolerance);
- }
}
void SLAPrint::Steps::support_tree(SLAPrintObject &po)
@@ -382,6 +373,13 @@ void SLAPrint::Steps::support_tree(SLAPrintObject &po)
if (pcfg.embed_object)
po.m_supportdata->emesh.ground_level_offset(pcfg.wall_thickness_mm);
+
+ // If the zero elevation mode is engaged, we have to filter out all the
+ // points that are on the bottom of the object
+ if (is_zero_elevation(po.config())) {
+ remove_bottom_points(po.m_supportdata->pts,
+ float(po.m_supportdata->emesh.ground_level() + EPSILON));
+ }
po.m_supportdata->cfg = make_support_cfg(po.m_config);
// po.m_supportdata->emesh.load_holes(po.transformed_drainhole_points());
@@ -449,7 +447,7 @@ void SLAPrint::Steps::generate_pad(SLAPrintObject &po) {
auto &pad_mesh = po.m_supportdata->support_tree_ptr->retrieve_mesh(sla::MeshType::Pad);
if (!validate_pad(pad_mesh, pcfg))
- throw std::runtime_error(
+ throw Slic3r::SlicingError(
L("No pad can be generated for this model with the "
"current configuration"));
@@ -617,7 +615,7 @@ void SLAPrint::Steps::initialize_printer_input()
for(const SliceRecord& slicerecord : o->get_slice_index()) {
if (!slicerecord.is_valid())
- throw std::runtime_error(
+ throw Slic3r::SlicingError(
L("There are unprintable objects. Try to "
"adjust support settings to make the "
"objects printable."));
@@ -673,6 +671,8 @@ void SLAPrint::Steps::merge_slices_and_eval_stats() {
double models_volume(0.0);
double estim_time(0.0);
+ std::vector<double> layers_times;
+ layers_times.reserve(printer_input.size());
size_t slow_layers = 0;
size_t fast_layers = 0;
@@ -684,14 +684,16 @@ void SLAPrint::Steps::merge_slices_and_eval_stats() {
using Lock = std::lock_guard<sla::ccr::SpinningMutex>;
// Going to parallel:
- auto printlayerfn = [
+ auto printlayerfn = [this,
// functions and read only vars
areafn, area_fill, display_area, exp_time, init_exp_time, fast_tilt, slow_tilt, delta_fade_time,
// write vars
&mutex, &models_volume, &supports_volume, &estim_time, &slow_layers,
- &fast_layers, &fade_layer_time](PrintLayer& layer, size_t sliced_layer_cnt)
+ &fast_layers, &fade_layer_time, &layers_times](size_t sliced_layer_cnt)
{
+ PrintLayer &layer = m_print->m_printer_input[sliced_layer_cnt];
+
// vector of slice record references
auto& slicerecord_references = layer.slices();
@@ -775,26 +777,27 @@ void SLAPrint::Steps::merge_slices_and_eval_stats() {
else
slow_layers++;
-
// Calculation of the printing time
-
+
+ double layer_times = 0.0;
if (sliced_layer_cnt < 3)
- estim_time += init_exp_time;
- else if (fade_layer_time > exp_time)
- {
+ layer_times += init_exp_time;
+ else if (fade_layer_time > exp_time) {
fade_layer_time -= delta_fade_time;
- estim_time += fade_layer_time;
+ layer_times += fade_layer_time;
}
else
- estim_time += exp_time;
-
- estim_time += tilt_time;
+ layer_times += exp_time;
+ layer_times += tilt_time;
+
+ layers_times.push_back(layer_times);
+ estim_time += layer_times;
}
};
// sequential version for debugging:
// for(size_t i = 0; i < m_printer_input.size(); ++i) printlayerfn(i);
- sla::ccr::enumerate(printer_input.begin(), printer_input.end(), printlayerfn);
+ sla::ccr::for_each(size_t(0), printer_input.size(), printlayerfn);
auto SCALING2 = SCALING_FACTOR * SCALING_FACTOR;
print_statistics.support_used_material = supports_volume * SCALING2;
@@ -804,8 +807,10 @@ void SLAPrint::Steps::merge_slices_and_eval_stats() {
// A layers count o the highest object
if (printer_input.size() == 0)
print_statistics.estimated_print_time = std::nan("");
- else
+ else {
print_statistics.estimated_print_time = estim_time;
+ print_statistics.layers_times = layers_times;
+ }
print_statistics.fast_layers_count = fast_layers;
print_statistics.slow_layers_count = slow_layers;
@@ -816,16 +821,7 @@ void SLAPrint::Steps::merge_slices_and_eval_stats() {
// Rasterizing the model objects, and their supports
void SLAPrint::Steps::rasterize()
{
- if(canceled()) return;
-
- auto &print_statistics = m_print->m_print_statistics;
- auto &printer_input = m_print->m_printer_input;
-
- // Set up the printer, allocate space for all the layers
- sla::RasterWriter &printer = m_print->init_printer();
-
- auto lvlcnt = unsigned(printer_input.size());
- printer.layers(lvlcnt);
+ if(canceled() || !m_print->m_printer) return;
// coefficient to map the rasterization state (0-99) to the allocated
// portion (slot) of the process state
@@ -837,7 +833,7 @@ void SLAPrint::Steps::rasterize()
// pst: previous state
double pst = current_status();
- double increment = (slot * sd) / printer_input.size();
+ double increment = (slot * sd) / m_print->m_printer_input.size();
double dstatus = current_status();
sla::ccr::SpinningMutex slck;
@@ -845,20 +841,14 @@ void SLAPrint::Steps::rasterize()
// procedure to process one height level. This will run in parallel
auto lvlfn =
- [this, &slck, &printer, increment, &dstatus, &pst]
- (PrintLayer& printlayer, size_t idx)
+ [this, &slck, increment, &dstatus, &pst]
+ (sla::RasterBase& raster, size_t idx)
{
+ PrintLayer& printlayer = m_print->m_printer_input[idx];
if(canceled()) return;
- auto level_id = unsigned(idx);
-
- // Switch to the appropriate layer in the printer
- printer.begin_layer(level_id);
-
- for(const ClipperLib::Polygon& poly : printlayer.transformed_slices())
- printer.draw_polygon(poly, level_id);
- // Finish the layer for later saving it.
- printer.finish_layer(level_id);
+ for (const ClipperLib::Polygon& poly : printlayer.transformed_slices())
+ raster.draw(poly);
// Status indication guarded with the spinlock
{
@@ -875,24 +865,8 @@ void SLAPrint::Steps::rasterize()
// last minute escape
if(canceled()) return;
- // Sequential version (for testing)
- // for(unsigned l = 0; l < lvlcnt; ++l) lvlfn(l);
-
// Print all the layers in parallel
- sla::ccr::enumerate(printer_input.begin(), printer_input.end(), lvlfn);
-
- // Set statistics values to the printer
- sla::RasterWriter::PrintStatistics stats;
- stats.used_material = (print_statistics.objects_used_material +
- print_statistics.support_used_material) / 1000;
-
- int num_fade = m_print->m_default_object_config.faded_layers.getInt();
- stats.num_fade = num_fade >= 0 ? size_t(num_fade) : size_t(0);
- stats.num_fast = print_statistics.fast_layers_count;
- stats.num_slow = print_statistics.slow_layers_count;
- stats.estimated_print_time_s = print_statistics.estimated_print_time;
-
- printer.set_statistics(stats);
+ m_print->m_printer->draw_layers(m_print->m_printer_input.size(), lvlfn);
}
std::string SLAPrint::Steps::label(SLAPrintObjectStep step)
diff --git a/src/libslic3r/SLAPrintSteps.hpp b/src/libslic3r/SLAPrintSteps.hpp
index d3341bc14..19b64d4a9 100644
--- a/src/libslic3r/SLAPrintSteps.hpp
+++ b/src/libslic3r/SLAPrintSteps.hpp
@@ -46,7 +46,7 @@ private:
void apply_printer_corrections(SLAPrintObject &po, SliceOrigin o);
public:
- Steps(SLAPrint *print);
+ explicit Steps(SLAPrint *print);
void hollow_model(SLAPrintObject &po);
void drill_holes (SLAPrintObject &po);
diff --git a/src/libslic3r/SVG.cpp b/src/libslic3r/SVG.cpp
index 6e4b973ea..da30a197f 100644
--- a/src/libslic3r/SVG.cpp
+++ b/src/libslic3r/SVG.cpp
@@ -3,8 +3,6 @@
#include <boost/nowide/cstdio.hpp>
-#define COORD(x) (unscale<float>((x))*10)
-
namespace Slic3r {
bool SVG::open(const char* afilename)
@@ -21,6 +19,7 @@ bool SVG::open(const char* afilename)
" <polyline fill=\"darkblue\" points=\"0,0 10,5 0,10 1,5\" />\n"
" </marker>\n"
);
+ fprintf(this->f, "<rect fill='white' stroke='none' x='0' y='0' width='%f' height='%f'/>\n", 2000.f, 2000.f);
return true;
}
@@ -32,8 +31,9 @@ bool SVG::open(const char* afilename, const BoundingBox &bbox, const coord_t bbo
this->f = boost::nowide::fopen(afilename, "w");
if (f == NULL)
return false;
- float w = COORD(bbox.max(0) - bbox.min(0) + 2 * bbox_offset);
- float h = COORD(bbox.max(1) - bbox.min(1) + 2 * bbox_offset);
+ float w = to_svg_coord(bbox.max(0) - bbox.min(0) + 2 * bbox_offset);
+ float h = to_svg_coord(bbox.max(1) - bbox.min(1) + 2 * bbox_offset);
+ this->height = h;
fprintf(this->f,
"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\n"
"<!DOCTYPE svg PUBLIC \"-//W3C//DTD SVG 1.0//EN\" \"http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd\">\n"
@@ -42,15 +42,15 @@ bool SVG::open(const char* afilename, const BoundingBox &bbox, const coord_t bbo
" <polyline fill=\"darkblue\" points=\"0,0 10,5 0,10 1,5\" />\n"
" </marker>\n",
h, w);
+ fprintf(this->f, "<rect fill='white' stroke='none' x='0' y='0' width='%f' height='%f'/>\n", w, h);
return true;
}
-void
-SVG::draw(const Line &line, std::string stroke, coordf_t stroke_width)
+void SVG::draw(const Line &line, std::string stroke, coordf_t stroke_width)
{
fprintf(this->f,
" <line x1=\"%f\" y1=\"%f\" x2=\"%f\" y2=\"%f\" style=\"stroke: %s; stroke-width: %f\"",
- COORD(line.a(0) - origin(0)), COORD(line.a(1) - origin(1)), COORD(line.b(0) - origin(0)), COORD(line.b(1) - origin(1)), stroke.c_str(), (stroke_width == 0) ? 1.f : COORD(stroke_width));
+ to_svg_x(line.a(0) - origin(0)), to_svg_y(line.a(1) - origin(1)), to_svg_x(line.b(0) - origin(0)), to_svg_y(line.b(1) - origin(1)), stroke.c_str(), (stroke_width == 0) ? 1.f : to_svg_coord(stroke_width));
if (this->arrows)
fprintf(this->f, " marker-end=\"url(#endArrow)\"");
fprintf(this->f, "/>\n");
@@ -65,34 +65,31 @@ void SVG::draw(const ThickLine &line, const std::string &fill, const std::string
coordf_t db = coordf_t(0.5)*line.b_width/len;
fprintf(this->f,
" <polygon points=\"%f,%f %f,%f %f,%f %f,%f\" style=\"fill:%s; stroke: %s; stroke-width: %f\"/>\n",
- COORD(line.a(0)-da*perp(0)-origin(0)),
- COORD(line.a(1)-da*perp(1)-origin(1)),
- COORD(line.b(0)-db*perp(0)-origin(0)),
- COORD(line.b(1)-db*perp(1)-origin(1)),
- COORD(line.b(0)+db*perp(0)-origin(0)),
- COORD(line.b(1)+db*perp(1)-origin(1)),
- COORD(line.a(0)+da*perp(0)-origin(0)),
- COORD(line.a(1)+da*perp(1)-origin(1)),
+ to_svg_x(line.a(0)-da*perp(0)-origin(0)),
+ to_svg_y(line.a(1)-da*perp(1)-origin(1)),
+ to_svg_x(line.b(0)-db*perp(0)-origin(0)),
+ to_svg_y(line.b(1)-db*perp(1)-origin(1)),
+ to_svg_x(line.b(0)+db*perp(0)-origin(0)),
+ to_svg_y(line.b(1)+db*perp(1)-origin(1)),
+ to_svg_x(line.a(0)+da*perp(0)-origin(0)),
+ to_svg_y(line.a(1)+da*perp(1)-origin(1)),
fill.c_str(), stroke.c_str(),
- (stroke_width == 0) ? 1.f : COORD(stroke_width));
+ (stroke_width == 0) ? 1.f : to_svg_coord(stroke_width));
}
-void
-SVG::draw(const Lines &lines, std::string stroke, coordf_t stroke_width)
+void SVG::draw(const Lines &lines, std::string stroke, coordf_t stroke_width)
{
- for (Lines::const_iterator it = lines.begin(); it != lines.end(); ++it)
- this->draw(*it, stroke, stroke_width);
+ for (const Line &l : lines)
+ this->draw(l, stroke, stroke_width);
}
-void
-SVG::draw(const IntersectionLines &lines, std::string stroke)
+void SVG::draw(const IntersectionLines &lines, std::string stroke)
{
- for (IntersectionLines::const_iterator it = lines.begin(); it != lines.end(); ++it)
- this->draw((Line)*it, stroke);
+ for (const IntersectionLine &il : lines)
+ this->draw((Line)il, stroke);
}
-void
-SVG::draw(const ExPolygon &expolygon, std::string fill, const float fill_opacity)
+void SVG::draw(const ExPolygon &expolygon, std::string fill, const float fill_opacity)
{
this->fill = fill;
@@ -104,8 +101,7 @@ SVG::draw(const ExPolygon &expolygon, std::string fill, const float fill_opacity
this->path(d, true, 0, fill_opacity);
}
-void
-SVG::draw_outline(const ExPolygon &expolygon, std::string stroke_outer, std::string stroke_holes, coordf_t stroke_width)
+void SVG::draw_outline(const ExPolygon &expolygon, std::string stroke_outer, std::string stroke_holes, coordf_t stroke_width)
{
draw_outline(expolygon.contour, stroke_outer, stroke_width);
for (Polygons::const_iterator it = expolygon.holes.begin(); it != expolygon.holes.end(); ++ it) {
@@ -113,83 +109,71 @@ SVG::draw_outline(const ExPolygon &expolygon, std::string stroke_outer, std::str
}
}
-void
-SVG::draw(const ExPolygons &expolygons, std::string fill, const float fill_opacity)
+void SVG::draw(const ExPolygons &expolygons, std::string fill, const float fill_opacity)
{
for (ExPolygons::const_iterator it = expolygons.begin(); it != expolygons.end(); ++it)
this->draw(*it, fill, fill_opacity);
}
-void
-SVG::draw_outline(const ExPolygons &expolygons, std::string stroke_outer, std::string stroke_holes, coordf_t stroke_width)
+void SVG::draw_outline(const ExPolygons &expolygons, std::string stroke_outer, std::string stroke_holes, coordf_t stroke_width)
{
for (ExPolygons::const_iterator it = expolygons.begin(); it != expolygons.end(); ++ it)
draw_outline(*it, stroke_outer, stroke_holes, stroke_width);
}
-void
-SVG::draw(const Surface &surface, std::string fill, const float fill_opacity)
+void SVG::draw(const Surface &surface, std::string fill, const float fill_opacity)
{
draw(surface.expolygon, fill, fill_opacity);
}
-void
-SVG::draw_outline(const Surface &surface, std::string stroke_outer, std::string stroke_holes, coordf_t stroke_width)
+void SVG::draw_outline(const Surface &surface, std::string stroke_outer, std::string stroke_holes, coordf_t stroke_width)
{
draw_outline(surface.expolygon, stroke_outer, stroke_holes, stroke_width);
}
-void
-SVG::draw(const Surfaces &surfaces, std::string fill, const float fill_opacity)
+void SVG::draw(const Surfaces &surfaces, std::string fill, const float fill_opacity)
{
for (Surfaces::const_iterator it = surfaces.begin(); it != surfaces.end(); ++it)
this->draw(*it, fill, fill_opacity);
}
-void
-SVG::draw_outline(const Surfaces &surfaces, std::string stroke_outer, std::string stroke_holes, coordf_t stroke_width)
+void SVG::draw_outline(const Surfaces &surfaces, std::string stroke_outer, std::string stroke_holes, coordf_t stroke_width)
{
for (Surfaces::const_iterator it = surfaces.begin(); it != surfaces.end(); ++ it)
draw_outline(*it, stroke_outer, stroke_holes, stroke_width);
}
-void
-SVG::draw(const SurfacesPtr &surfaces, std::string fill, const float fill_opacity)
+void SVG::draw(const SurfacesPtr &surfaces, std::string fill, const float fill_opacity)
{
for (SurfacesPtr::const_iterator it = surfaces.begin(); it != surfaces.end(); ++it)
this->draw(*(*it), fill, fill_opacity);
}
-void
-SVG::draw_outline(const SurfacesPtr &surfaces, std::string stroke_outer, std::string stroke_holes, coordf_t stroke_width)
+void SVG::draw_outline(const SurfacesPtr &surfaces, std::string stroke_outer, std::string stroke_holes, coordf_t stroke_width)
{
for (SurfacesPtr::const_iterator it = surfaces.begin(); it != surfaces.end(); ++ it)
draw_outline(*(*it), stroke_outer, stroke_holes, stroke_width);
}
-void
-SVG::draw(const Polygon &polygon, std::string fill)
+void SVG::draw(const Polygon &polygon, std::string fill)
{
this->fill = fill;
this->path(this->get_path_d(polygon, true), !fill.empty(), 0, 1.f);
}
-void
-SVG::draw(const Polygons &polygons, std::string fill)
+void SVG::draw(const Polygons &polygons, std::string fill)
{
for (Polygons::const_iterator it = polygons.begin(); it != polygons.end(); ++it)
this->draw(*it, fill);
}
-void
-SVG::draw(const Polyline &polyline, std::string stroke, coordf_t stroke_width)
+void SVG::draw(const Polyline &polyline, std::string stroke, coordf_t stroke_width)
{
this->stroke = stroke;
this->path(this->get_path_d(polyline, false), false, stroke_width, 1.f);
}
-void
-SVG::draw(const Polylines &polylines, std::string stroke, coordf_t stroke_width)
+void SVG::draw(const Polylines &polylines, std::string stroke, coordf_t stroke_width)
{
for (Polylines::const_iterator it = polylines.begin(); it != polylines.end(); ++it)
this->draw(*it, stroke, stroke_width);
@@ -201,73 +185,64 @@ void SVG::draw(const ThickLines &thicklines, const std::string &fill, const std:
this->draw(*it, fill, stroke, stroke_width);
}
-void
-SVG::draw(const ThickPolylines &polylines, const std::string &stroke, coordf_t stroke_width)
+void SVG::draw(const ThickPolylines &polylines, const std::string &stroke, coordf_t stroke_width)
{
for (ThickPolylines::const_iterator it = polylines.begin(); it != polylines.end(); ++it)
this->draw((Polyline)*it, stroke, stroke_width);
}
-void
-SVG::draw(const ThickPolylines &thickpolylines, const std::string &fill, const std::string &stroke, coordf_t stroke_width)
+void SVG::draw(const ThickPolylines &thickpolylines, const std::string &fill, const std::string &stroke, coordf_t stroke_width)
{
for (ThickPolylines::const_iterator it = thickpolylines.begin(); it != thickpolylines.end(); ++ it)
draw(it->thicklines(), fill, stroke, stroke_width);
}
-void
-SVG::draw(const Point &point, std::string fill, coord_t iradius)
+void SVG::draw(const Point &point, std::string fill, coord_t iradius)
{
- float radius = (iradius == 0) ? 3.f : COORD(iradius);
+ float radius = (iradius == 0) ? 3.f : to_svg_coord(iradius);
std::ostringstream svg;
- svg << " <circle cx=\"" << COORD(point(0) - origin(0)) << "\" cy=\"" << COORD(point(1) - origin(1))
+ svg << " <circle cx=\"" << to_svg_x(point(0) - origin(0)) << "\" cy=\"" << to_svg_y(point(1) - origin(1))
<< "\" r=\"" << radius << "\" "
<< "style=\"stroke: none; fill: " << fill << "\" />";
fprintf(this->f, "%s\n", svg.str().c_str());
}
-void
-SVG::draw(const Points &points, std::string fill, coord_t radius)
+void SVG::draw(const Points &points, std::string fill, coord_t radius)
{
for (Points::const_iterator it = points.begin(); it != points.end(); ++it)
this->draw(*it, fill, radius);
}
-void
-SVG::draw(const ClipperLib::Path &polygon, double scale, std::string stroke, coordf_t stroke_width)
+void SVG::draw(const ClipperLib::Path &polygon, double scale, std::string stroke, coordf_t stroke_width)
{
this->stroke = stroke;
this->path(this->get_path_d(polygon, scale, true), false, stroke_width, 1.f);
}
-void
-SVG::draw(const ClipperLib::Paths &polygons, double scale, std::string stroke, coordf_t stroke_width)
+void SVG::draw(const ClipperLib::Paths &polygons, double scale, std::string stroke, coordf_t stroke_width)
{
for (ClipperLib::Paths::const_iterator it = polygons.begin(); it != polygons.end(); ++ it)
draw(*it, scale, stroke, stroke_width);
}
-void
-SVG::draw_outline(const Polygon &polygon, std::string stroke, coordf_t stroke_width)
+void SVG::draw_outline(const Polygon &polygon, std::string stroke, coordf_t stroke_width)
{
this->stroke = stroke;
this->path(this->get_path_d(polygon, true), false, stroke_width, 1.f);
}
-void
-SVG::draw_outline(const Polygons &polygons, std::string stroke, coordf_t stroke_width)
+void SVG::draw_outline(const Polygons &polygons, std::string stroke, coordf_t stroke_width)
{
for (Polygons::const_iterator it = polygons.begin(); it != polygons.end(); ++ it)
draw_outline(*it, stroke, stroke_width);
}
-void
-SVG::path(const std::string &d, bool fill, coordf_t stroke_width, const float fill_opacity)
+void SVG::path(const std::string &d, bool fill, coordf_t stroke_width, const float fill_opacity)
{
float lineWidth = 0.f;
if (! fill)
- lineWidth = (stroke_width == 0) ? 2.f : COORD(stroke_width);
+ lineWidth = (stroke_width == 0) ? 2.f : to_svg_coord(stroke_width);
fprintf(
this->f,
@@ -281,27 +256,25 @@ SVG::path(const std::string &d, bool fill, coordf_t stroke_width, const float fi
);
}
-std::string
-SVG::get_path_d(const MultiPoint &mp, bool closed) const
+std::string SVG::get_path_d(const MultiPoint &mp, bool closed) const
{
std::ostringstream d;
d << "M ";
for (Points::const_iterator p = mp.points.begin(); p != mp.points.end(); ++p) {
- d << COORD((*p)(0) - origin(0)) << " ";
- d << COORD((*p)(1) - origin(1)) << " ";
+ d << to_svg_x((*p)(0) - origin(0)) << " ";
+ d << to_svg_y((*p)(1) - origin(1)) << " ";
}
if (closed) d << "z";
return d.str();
}
-std::string
-SVG::get_path_d(const ClipperLib::Path &path, double scale, bool closed) const
+std::string SVG::get_path_d(const ClipperLib::Path &path, double scale, bool closed) const
{
std::ostringstream d;
d << "M ";
for (ClipperLib::Path::const_iterator p = path.begin(); p != path.end(); ++p) {
- d << COORD(scale * p->X - origin(0)) << " ";
- d << COORD(scale * p->Y - origin(1)) << " ";
+ d << to_svg_x(scale * p->X - origin(0)) << " ";
+ d << to_svg_y(scale * p->Y - origin(1)) << " ";
}
if (closed) d << "z";
return d.str();
@@ -311,8 +284,8 @@ void SVG::draw_text(const Point &pt, const char *text, const char *color)
{
fprintf(this->f,
"<text x=\"%f\" y=\"%f\" font-family=\"sans-serif\" font-size=\"20px\" fill=\"%s\">%s</text>",
- COORD(pt(0)-origin(0)),
- COORD(pt(1)-origin(1)),
+ to_svg_x(pt(0)-origin(0)),
+ to_svg_y(pt(1)-origin(1)),
color, text);
}
@@ -320,18 +293,17 @@ void SVG::draw_legend(const Point &pt, const char *text, const char *color)
{
fprintf(this->f,
"<circle cx=\"%f\" cy=\"%f\" r=\"10\" fill=\"%s\"/>",
- COORD(pt(0)-origin(0)),
- COORD(pt(1)-origin(1)),
+ to_svg_x(pt(0)-origin(0)),
+ to_svg_y(pt(1)-origin(1)),
color);
fprintf(this->f,
"<text x=\"%f\" y=\"%f\" font-family=\"sans-serif\" font-size=\"10px\" fill=\"%s\">%s</text>",
- COORD(pt(0)-origin(0)) + 20.f,
- COORD(pt(1)-origin(1)),
+ to_svg_x(pt(0)-origin(0)) + 20.f,
+ to_svg_y(pt(1)-origin(1)),
"black", text);
}
-void
-SVG::Close()
+void SVG::Close()
{
fprintf(this->f, "</svg>\n");
fclose(this->f);
diff --git a/src/libslic3r/SVG.hpp b/src/libslic3r/SVG.hpp
index c1b387554..1ebd8d918 100644
--- a/src/libslic3r/SVG.hpp
+++ b/src/libslic3r/SVG.hpp
@@ -16,27 +16,28 @@ public:
bool arrows;
std::string fill, stroke;
Point origin;
- bool flipY;
+ float height;
+ bool flipY;
SVG(const char* afilename) :
arrows(false), fill("grey"), stroke("black"), filename(afilename), flipY(false)
{ open(filename); }
- SVG(const char* afilename, const BoundingBox &bbox, const coord_t bbox_offset = scale_(1.), bool aflipY = false) :
- arrows(false), fill("grey"), stroke("black"), filename(afilename), origin(bbox.min - Point(bbox_offset, bbox_offset)), flipY(aflipY)
- { open(filename, bbox, bbox_offset, aflipY); }
+ SVG(const char* afilename, const BoundingBox &bbox, const coord_t bbox_offset = scale_(1.), bool flipY = true) :
+ arrows(false), fill("grey"), stroke("black"), filename(afilename), origin(bbox.min - Point(bbox_offset, bbox_offset)), flipY(flipY)
+ { open(filename, bbox, bbox_offset, flipY); }
SVG(const std::string &filename) :
arrows(false), fill("grey"), stroke("black"), filename(filename), flipY(false)
{ open(filename); }
- SVG(const std::string &filename, const BoundingBox &bbox, const coord_t bbox_offset = scale_(1.), bool aflipY = false) :
- arrows(false), fill("grey"), stroke("black"), filename(filename), origin(bbox.min - Point(bbox_offset, bbox_offset)), flipY(aflipY)
- { open(filename, bbox, bbox_offset, aflipY); }
+ SVG(const std::string &filename, const BoundingBox &bbox, const coord_t bbox_offset = scale_(1.), bool flipY = true) :
+ arrows(false), fill("grey"), stroke("black"), filename(filename), origin(bbox.min - Point(bbox_offset, bbox_offset)), flipY(flipY)
+ { open(filename, bbox, bbox_offset, flipY); }
~SVG() { if (f != NULL) Close(); }
bool open(const char* filename);
- bool open(const char* filename, const BoundingBox &bbox, const coord_t bbox_offset = scale_(1.), bool flipY = false);
+ bool open(const char* filename, const BoundingBox &bbox, const coord_t bbox_offset = scale_(1.), bool flipY = true);
bool open(const std::string &filename)
{ return open(filename.c_str()); }
- bool open(const std::string &filename, const BoundingBox &bbox, const coord_t bbox_offset = scale_(1.), bool flipY = false)
+ bool open(const std::string &filename, const BoundingBox &bbox, const coord_t bbox_offset = scale_(1.), bool flipY = true)
{ return open(filename.c_str(), bbox, bbox_offset, flipY); }
void draw(const Line &line, std::string stroke = "black", coordf_t stroke_width = 0);
@@ -127,6 +128,11 @@ public:
};
static void export_expolygons(const char *path, const std::vector<std::pair<Slic3r::ExPolygons, ExPolygonAttributes>> &expolygons_with_attributes);
+
+private:
+ static float to_svg_coord(float x) throw() { return unscale<float>(x) * 10.f; }
+ static float to_svg_x(float x) throw() { return to_svg_coord(x); }
+ float to_svg_y(float x) const throw() { return flipY ? this->height - to_svg_coord(x) : to_svg_coord(x); }
};
}
diff --git a/src/libslic3r/Semver.hpp b/src/libslic3r/Semver.hpp
index 24ca74f83..f55fa9f9f 100644
--- a/src/libslic3r/Semver.hpp
+++ b/src/libslic3r/Semver.hpp
@@ -10,6 +10,8 @@
#include "semver/semver.h"
+#include "Exception.hpp"
+
namespace Slic3r {
@@ -38,7 +40,7 @@ public:
{
auto parsed = parse(str);
if (! parsed) {
- throw std::runtime_error(std::string("Could not parse version string: ") + str);
+ throw Slic3r::RuntimeError(std::string("Could not parse version string: ") + str);
}
ver = parsed->ver;
parsed->ver = semver_zero();
diff --git a/src/libslic3r/ShortestPath.cpp b/src/libslic3r/ShortestPath.cpp
index 0aa897fd7..3d5903df1 100644
--- a/src/libslic3r/ShortestPath.cpp
+++ b/src/libslic3r/ShortestPath.cpp
@@ -38,11 +38,12 @@ std::vector<std::pair<size_t, bool>> chain_segments_closest_point(std::vector<En
// Ignore the starting point as the starting point is considered to be occupied, no end point coud connect to it.
size_t next_idx = find_closest_point(kdtree, this_point.pos,
[this_idx, &end_points, &could_reverse_func](size_t idx) {
- return (idx ^ this_idx) > 1 && end_points[idx].chain_id == 0 && ((idx ^ 1) == 0 || could_reverse_func(idx >> 1));
+ return (idx ^ this_idx) > 1 && end_points[idx].chain_id == 0 && ((idx & 1) == 0 || could_reverse_func(idx >> 1));
});
assert(next_idx < end_points.size());
EndPointType &end_point = end_points[next_idx];
end_point.chain_id = 1;
+ assert((next_idx & 1) == 0 || could_reverse_func(next_idx >> 1));
out.emplace_back(next_idx / 2, (next_idx & 1) != 0);
this_idx = next_idx ^ 1;
}
@@ -165,7 +166,9 @@ std::vector<std::pair<size_t, bool>> chain_segments_greedy_constrained_reversals
EndPoint *first_point = nullptr;
size_t first_point_idx = std::numeric_limits<size_t>::max();
if (start_near != nullptr) {
- size_t idx = find_closest_point(kdtree, start_near->template cast<double>());
+ size_t idx = find_closest_point(kdtree, start_near->template cast<double>(),
+ // Don't start with a reverse segment, if flipping of the segment is not allowed.
+ [&could_reverse_func](size_t idx) { return (idx & 1) == 0 || could_reverse_func(idx >> 1); });
assert(idx < end_points.size());
first_point = &end_points[idx];
first_point->distance_out = 0.;
@@ -1970,4 +1973,59 @@ std::vector<const PrintInstance*> chain_print_object_instances(const Print &prin
return out;
}
+Polylines chain_lines(const std::vector<Line> &lines, const double point_distance_epsilon)
+{
+ // Create line end point lookup.
+ struct LineEnd {
+ LineEnd(const Line *line, bool start) : line(line), start(start) {}
+ const Line *line;
+ // Is it the start or end point?
+ bool start;
+ const Point& point() const { return start ? line->a : line->b; }
+ const Point& other_point() const { return start ? line->b : line->a; }
+ LineEnd other_end() const { return LineEnd(line, ! start); }
+ bool operator==(const LineEnd &rhs) const { return this->line == rhs.line && this->start == rhs.start; }
+ };
+ struct LineEndAccessor {
+ const Point* operator()(const LineEnd &pt) const { return &pt.point(); }
+ };
+ typedef ClosestPointInRadiusLookup<LineEnd, LineEndAccessor> ClosestPointLookupType;
+ ClosestPointLookupType closest_end_point_lookup(point_distance_epsilon);
+ for (const Line &line : lines) {
+ closest_end_point_lookup.insert(LineEnd(&line, true));
+ closest_end_point_lookup.insert(LineEnd(&line, false));
+ }
+
+ // Chain the lines.
+ std::vector<char> line_consumed(lines.size(), false);
+ static const double point_distance_epsilon2 = point_distance_epsilon * point_distance_epsilon;
+ Polylines out;
+ for (const Line &seed : lines)
+ if (! line_consumed[&seed - lines.data()]) {
+ line_consumed[&seed - lines.data()] = true;
+ closest_end_point_lookup.erase(LineEnd(&seed, false));
+ closest_end_point_lookup.erase(LineEnd(&seed, true));
+ Polyline pl { seed.a, seed.b };
+ for (size_t round = 0; round < 2; ++ round) {
+ for (;;) {
+ auto [line_end, dist2] = closest_end_point_lookup.find(pl.last_point());
+ if (line_end == nullptr || dist2 >= point_distance_epsilon2)
+ // Cannot extent in this direction.
+ break;
+ // Average the last point.
+ pl.points.back() = (0.5 * (pl.points.back().cast<double>() + line_end->point().cast<double>())).cast<coord_t>();
+ // and extend with the new line segment.
+ pl.points.emplace_back(line_end->other_point());
+ closest_end_point_lookup.erase(*line_end);
+ closest_end_point_lookup.erase(line_end->other_end());
+ line_consumed[line_end->line - lines.data()] = true;
+ }
+ // reverse and try the oter direction.
+ pl.reverse();
+ }
+ out.emplace_back(std::move(pl));
+ }
+ return out;
+}
+
} // namespace Slic3r
diff --git a/src/libslic3r/ShortestPath.hpp b/src/libslic3r/ShortestPath.hpp
index 65d8b7f23..14912ee85 100644
--- a/src/libslic3r/ShortestPath.hpp
+++ b/src/libslic3r/ShortestPath.hpp
@@ -33,6 +33,8 @@ class Print;
struct PrintInstance;
std::vector<const PrintInstance*> chain_print_object_instances(const Print &print);
+// Chain lines into polylines.
+Polylines chain_lines(const std::vector<Line> &lines, const double point_distance_epsilon);
} // namespace Slic3r
diff --git a/src/libslic3r/SlicesToTriangleMesh.cpp b/src/libslic3r/SlicesToTriangleMesh.cpp
new file mode 100644
index 000000000..d6a546961
--- /dev/null
+++ b/src/libslic3r/SlicesToTriangleMesh.cpp
@@ -0,0 +1,128 @@
+
+#include "SlicesToTriangleMesh.hpp"
+
+#include "libslic3r/MTUtils.hpp"
+#include "libslic3r/SLA/Contour3D.hpp"
+#include "libslic3r/ClipperUtils.hpp"
+#include "libslic3r/Tesselate.hpp"
+
+#include <tbb/parallel_for.h>
+#include <tbb/parallel_reduce.h>
+
+namespace Slic3r {
+
+inline sla::Contour3D wall_strip(const Polygon &poly,
+ double lower_z_mm,
+ double upper_z_mm)
+{
+ sla::Contour3D ret;
+
+ size_t startidx = ret.points.size();
+ size_t offs = poly.points.size();
+
+ ret.points.reserve(ret.points.size() + 2 *offs);
+
+ for (const Point &p : poly.points)
+ ret.points.emplace_back(to_3d(unscaled(p), lower_z_mm));
+
+ for (const Point &p : poly.points)
+ ret.points.emplace_back(to_3d(unscaled(p), upper_z_mm));
+
+ for (size_t i = startidx + 1; i < startidx + offs; ++i) {
+ ret.faces3.emplace_back(i - 1, i, i + offs - 1);
+ ret.faces3.emplace_back(i, i + offs, i + offs - 1);
+ }
+
+ ret.faces3.emplace_back(startidx + offs - 1, startidx, startidx + 2 * offs - 1);
+ ret.faces3.emplace_back(startidx, startidx + offs, startidx + 2 * offs - 1);
+
+ return ret;
+}
+
+// Same as walls() but with identical higher and lower polygons.
+sla::Contour3D inline straight_walls(const Polygon &plate,
+ double lo_z,
+ double hi_z)
+{
+ return wall_strip(plate, lo_z, hi_z);
+}
+
+sla::Contour3D inline straight_walls(const ExPolygon &plate,
+ double lo_z,
+ double hi_z)
+{
+ sla::Contour3D ret;
+ ret.merge(straight_walls(plate.contour, lo_z, hi_z));
+ for (auto &h : plate.holes) ret.merge(straight_walls(h, lo_z, hi_z));
+ return ret;
+}
+
+sla::Contour3D inline straight_walls(const ExPolygons &slice,
+ double lo_z,
+ double hi_z)
+{
+ sla::Contour3D ret;
+ for (const ExPolygon &poly : slice)
+ ret.merge(straight_walls(poly, lo_z, hi_z));
+
+ return ret;
+}
+
+sla::Contour3D slices_to_triangle_mesh(const std::vector<ExPolygons> &slices,
+ double zmin,
+ const std::vector<float> & grid)
+{
+ assert(slices.size() == grid.size());
+
+ using Layers = std::vector<sla::Contour3D>;
+ std::vector<sla::Contour3D> layers(slices.size());
+ size_t len = slices.size() - 1;
+
+ tbb::parallel_for(size_t(0), len, [&slices, &layers, &grid](size_t i) {
+ const ExPolygons &upper = slices[i + 1];
+ const ExPolygons &lower = slices[i];
+
+ ExPolygons dff1 = diff_ex(lower, upper);
+ ExPolygons dff2 = diff_ex(upper, lower);
+ layers[i].merge(triangulate_expolygons_3d(dff1, grid[i], NORMALS_UP));
+ layers[i].merge(triangulate_expolygons_3d(dff2, grid[i], NORMALS_DOWN));
+ layers[i].merge(straight_walls(upper, grid[i], grid[i + 1]));
+
+ });
+
+ sla::Contour3D ret = tbb::parallel_reduce(
+ tbb::blocked_range(layers.begin(), layers.end()),
+ sla::Contour3D{},
+ [](const tbb::blocked_range<Layers::iterator>& r, sla::Contour3D init) {
+ for(auto it = r.begin(); it != r.end(); ++it ) init.merge(*it);
+ return init;
+ },
+ []( const sla::Contour3D &a, const sla::Contour3D &b ) {
+ sla::Contour3D res{a}; res.merge(b); return res;
+ });
+
+ ret.merge(triangulate_expolygons_3d(slices.front(), zmin, NORMALS_DOWN));
+ ret.merge(straight_walls(slices.front(), zmin, grid.front()));
+ ret.merge(triangulate_expolygons_3d(slices.back(), grid.back(), NORMALS_UP));
+
+ return ret;
+}
+
+void slices_to_triangle_mesh(TriangleMesh & mesh,
+ const std::vector<ExPolygons> &slices,
+ double zmin,
+ double lh,
+ double ilh)
+{
+ std::vector<sla::Contour3D> wall_meshes(slices.size());
+ std::vector<float> grid(slices.size(), zmin + ilh);
+
+ for (size_t i = 1; i < grid.size(); ++i) grid[i] = grid[i - 1] + lh;
+
+ sla::Contour3D cntr = slices_to_triangle_mesh(slices, zmin, grid);
+ mesh.merge(sla::to_triangle_mesh(cntr));
+ mesh.repaired = true;
+ mesh.require_shared_vertices();
+}
+
+} // namespace Slic3r
diff --git a/src/libslic3r/SlicesToTriangleMesh.hpp b/src/libslic3r/SlicesToTriangleMesh.hpp
new file mode 100644
index 000000000..133312d56
--- /dev/null
+++ b/src/libslic3r/SlicesToTriangleMesh.hpp
@@ -0,0 +1,24 @@
+#ifndef SLICESTOTRIANGLEMESH_HPP
+#define SLICESTOTRIANGLEMESH_HPP
+
+#include "libslic3r/TriangleMesh.hpp"
+#include "libslic3r/ExPolygon.hpp"
+
+namespace Slic3r {
+
+void slices_to_triangle_mesh(TriangleMesh & mesh,
+ const std::vector<ExPolygons> &slices,
+ double zmin,
+ double lh,
+ double ilh);
+
+inline TriangleMesh slices_to_triangle_mesh(
+ const std::vector<ExPolygons> &slices, double zmin, double lh, double ilh)
+{
+ TriangleMesh out; slices_to_triangle_mesh(out, slices, zmin, lh, ilh);
+ return out;
+}
+
+} // namespace Slic3r
+
+#endif // SLICESTOTRIANGLEMESH_HPP
diff --git a/src/libslic3r/Slicing.cpp b/src/libslic3r/Slicing.cpp
index 82d2d1989..16068dde4 100644
--- a/src/libslic3r/Slicing.cpp
+++ b/src/libslic3r/Slicing.cpp
@@ -170,24 +170,15 @@ SlicingParameters SlicingParameters::create_from_config(
return params;
}
-std::vector<std::pair<t_layer_height_range, coordf_t>> layer_height_ranges(const t_layer_config_ranges &config_ranges)
-{
- std::vector<std::pair<t_layer_height_range, coordf_t>> out;
- out.reserve(config_ranges.size());
- for (const auto &kvp : config_ranges)
- out.emplace_back(kvp.first, kvp.second.option("layer_height")->getFloat());
- return out;
-}
-
// Convert layer_config_ranges to layer_height_profile. Both are referenced to z=0, meaning the raft layers are not accounted for
// in the height profile and the printed object may be lifted by the raft thickness at the time of the G-code generation.
std::vector<coordf_t> layer_height_profile_from_ranges(
const SlicingParameters &slicing_params,
- const t_layer_config_ranges &layer_config_ranges) // #ys_FIXME_experiment
+ const t_layer_config_ranges &layer_config_ranges)
{
// 1) If there are any height ranges, trim one by the other to make them non-overlapping. Insert the 1st layer if fixed.
std::vector<std::pair<t_layer_height_range,coordf_t>> ranges_non_overlapping;
- ranges_non_overlapping.reserve(layer_config_ranges.size() * 4); // #ys_FIXME_experiment
+ ranges_non_overlapping.reserve(layer_config_ranges.size() * 4);
if (slicing_params.first_object_layer_height_fixed())
ranges_non_overlapping.push_back(std::pair<t_layer_height_range,coordf_t>(
t_layer_height_range(0., slicing_params.first_object_layer_height),
diff --git a/src/libslic3r/Slicing.hpp b/src/libslic3r/Slicing.hpp
index 95cf6891b..e151b208f 100644
--- a/src/libslic3r/Slicing.hpp
+++ b/src/libslic3r/Slicing.hpp
@@ -11,14 +11,15 @@
#include "libslic3r.h"
#include "Utils.hpp"
-#include "PrintConfig.hpp"
namespace Slic3r
{
class PrintConfig;
class PrintObjectConfig;
+class ModelConfig;
class ModelObject;
+class DynamicPrintConfig;
// Parameters to guide object slicing and support generation.
// The slicing parameters account for a raft and whether the 1st object layer is printed with a normal or a bridging flow
@@ -128,9 +129,7 @@ inline bool equal_layering(const SlicingParameters &sp1, const SlicingParameters
}
typedef std::pair<coordf_t,coordf_t> t_layer_height_range;
-typedef std::map<t_layer_height_range, DynamicPrintConfig> t_layer_config_ranges;
-
-extern std::vector<std::pair<t_layer_height_range, coordf_t>> layer_height_ranges(const t_layer_config_ranges &config_ranges);
+typedef std::map<t_layer_height_range, ModelConfig> t_layer_config_ranges;
extern std::vector<coordf_t> layer_height_profile_from_ranges(
const SlicingParameters &slicing_params,
diff --git a/src/libslic3r/SupportMaterial.cpp b/src/libslic3r/SupportMaterial.cpp
index 1d98bb0e6..95c429754 100644
--- a/src/libslic3r/SupportMaterial.cpp
+++ b/src/libslic3r/SupportMaterial.cpp
@@ -409,7 +409,7 @@ void PrintObjectSupportMaterial::generate(PrintObject &object)
export_print_z_polygons_and_extrusions_to_svg(
debug_out_path("support-w-fills-%d-%lf.svg", iRun, layers_sorted[i]->print_z).c_str(),
layers_sorted.data() + i, j - i,
- *object.support_layers[layer_id]);
+ *object.support_layers()[layer_id]);
++layer_id;
}
i = j;
@@ -597,8 +597,8 @@ public:
::fwrite(&n_points, 4, 1, file);
for (uint32_t j = 0; j < n_points; ++ j) {
const Point &pt = poly.points[j];
- ::fwrite(&pt.x, sizeof(coord_t), 1, file);
- ::fwrite(&pt.y, sizeof(coord_t), 1, file);
+ ::fwrite(&pt.x(), sizeof(coord_t), 1, file);
+ ::fwrite(&pt.y(), sizeof(coord_t), 1, file);
}
}
n_polygons = m_trimming_polygons->size();
@@ -609,8 +609,8 @@ public:
::fwrite(&n_points, 4, 1, file);
for (uint32_t j = 0; j < n_points; ++ j) {
const Point &pt = poly.points[j];
- ::fwrite(&pt.x, sizeof(coord_t), 1, file);
- ::fwrite(&pt.y, sizeof(coord_t), 1, file);
+ ::fwrite(&pt.x(), sizeof(coord_t), 1, file);
+ ::fwrite(&pt.y(), sizeof(coord_t), 1, file);
}
}
::fclose(file);
@@ -906,13 +906,15 @@ namespace SupportMaterialInternal {
polyline.extend_start(fw);
polyline.extend_end(fw);
// Is the straight perimeter segment supported at both sides?
- for (size_t i = 0; i < lower_layer.lslices.size(); ++ i)
- if (lower_layer.lslices_bboxes[i].contains(polyline.first_point()) && lower_layer.lslices_bboxes[i].contains(polyline.last_point()) &&
- lower_layer.lslices[i].contains(polyline.first_point()) && lower_layer.lslices[i].contains(polyline.last_point())) {
- // Offset a polyline into a thick line.
- polygons_append(bridges, offset(polyline, 0.5f * w + 10.f));
- break;
- }
+ Point pts[2] = { polyline.first_point(), polyline.last_point() };
+ bool supported[2] = { false, false };
+ for (size_t i = 0; i < lower_layer.lslices.size() && ! (supported[0] && supported[1]); ++ i)
+ for (int j = 0; j < 2; ++ j)
+ if (! supported[j] && lower_layer.lslices_bboxes[i].contains(pts[j]) && lower_layer.lslices[i].contains(pts[j]))
+ supported[j] = true;
+ if (supported[0] && supported[1])
+ // Offset a polyline into a thick line.
+ polygons_append(bridges, offset(polyline, 0.5f * w + 10.f));
}
bridges = union_(bridges);
}
@@ -971,6 +973,10 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_
std::vector<ExPolygons> enforcers = object.slice_support_enforcers();
std::vector<ExPolygons> blockers = object.slice_support_blockers();
+ // Append custom supports.
+ object.project_and_append_custom_facets(false, EnforcerBlockerType::ENFORCER, enforcers);
+ object.project_and_append_custom_facets(false, EnforcerBlockerType::BLOCKER, blockers);
+
// Output layers, sorted by top Z.
MyLayersPtr contact_out;
@@ -1097,10 +1103,10 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_
if (! enforcers.empty()) {
// Apply the "support enforcers".
//FIXME add the "enforcers" to the sparse support regions only.
- const ExPolygons &enforcer = enforcers[layer_id - 1];
+ const ExPolygons &enforcer = enforcers[layer_id];
if (! enforcer.empty()) {
// Enforce supports (as if with 90 degrees of slope) for the regions covered by the enforcer meshes.
- Polygons new_contacts = diff(intersection(layerm_polygons, to_polygons(enforcer)),
+ Polygons new_contacts = diff(intersection(layerm_polygons, to_polygons(std::move(enforcer))),
offset(lower_layer_polygons, 0.05f * fw, SUPPORT_SURFACES_OFFSET_PARAMETERS));
if (! new_contacts.empty()) {
if (diff_polygons.empty())
@@ -1111,19 +1117,26 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_
}
}
}
- // Apply the "support blockers".
- if (! diff_polygons.empty() && ! blockers.empty() && ! blockers[layer_id].empty()) {
- // Enforce supports (as if with 90 degrees of slope) for the regions covered by the enforcer meshes.
- diff_polygons = diff(diff_polygons, to_polygons(blockers[layer_id]));
- }
+
if (diff_polygons.empty())
continue;
+ // Apply the "support blockers".
+ if (! blockers.empty() && ! blockers[layer_id].empty()) {
+ // Expand the blocker a bit. Custom blockers produce strips
+ // spanning just the projection between the two slices.
+ // Subtracting them as they are may leave unwanted narrow
+ // residues of diff_polygons that would then be supported.
+ diff_polygons = diff(diff_polygons,
+ offset(union_(to_polygons(std::move(blockers[layer_id]))),
+ 1000.*SCALED_EPSILON));
+ }
+
#ifdef SLIC3R_DEBUG
{
::Slic3r::SVG svg(debug_out_path("support-top-contacts-raw-run%d-layer%d-region%d.svg",
iRun, layer_id,
- std::find_if(layer.regions.begin(), layer.regions.end(), [layerm](const LayerRegion* other){return other == layerm;}) - layer.regions.begin()),
+ std::find_if(layer.regions().begin(), layer.regions().end(), [layerm](const LayerRegion* other){return other == layerm;}) - layer.regions().begin()),
get_extents(diff_polygons));
Slic3r::ExPolygons expolys = union_ex(diff_polygons, false);
svg.draw(expolys);
@@ -1141,7 +1154,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::top_contact_
Slic3r::SVG::export_expolygons(
debug_out_path("support-top-contacts-filtered-run%d-layer%d-region%d-z%f.svg",
iRun, layer_id,
- std::find_if(layer.regions.begin(), layer.regions.end(), [layerm](const LayerRegion* other){return other == layerm;}) - layer.regions.begin(),
+ std::find_if(layer.regions().begin(), layer.regions().end(), [layerm](const LayerRegion* other){return other == layerm;}) - layer.regions().begin(),
layer.print_z),
union_ex(diff_polygons, false));
#endif /* SLIC3R_DEBUG */
@@ -1471,7 +1484,7 @@ PrintObjectSupportMaterial::MyLayersPtr PrintObjectSupportMaterial::bottom_conta
svg.draw(union_ex(top, false), "blue", 0.5f);
svg.draw(union_ex(projection_raw, true), "red", 0.5f);
svg.draw_outline(union_ex(projection_raw, true), "red", "blue", scale_(0.1f));
- svg.draw(layer.slices, "green", 0.5f);
+ svg.draw(layer.lslices, "green", 0.5f);
}
#endif /* SLIC3R_DEBUG */
@@ -2313,14 +2326,18 @@ static inline void fill_expolygons_generate_paths(
{
FillParams fill_params;
fill_params.density = density;
- fill_params.complete = true;
fill_params.dont_adjust = true;
for (const ExPolygon &expoly : expolygons) {
Surface surface(stInternal, expoly);
+ Polylines polylines;
+ try {
+ polylines = filler->fill_surface(&surface, fill_params);
+ } catch (InfillFailedException &) {
+ }
extrusion_entities_append_paths(
dst,
- filler->fill_surface(&surface, fill_params),
- role,
+ std::move(polylines),
+ role,
flow.mm3_per_mm(), flow.width, flow.height);
}
}
@@ -2335,13 +2352,17 @@ static inline void fill_expolygons_generate_paths(
{
FillParams fill_params;
fill_params.density = density;
- fill_params.complete = true;
fill_params.dont_adjust = true;
for (ExPolygon &expoly : expolygons) {
Surface surface(stInternal, std::move(expoly));
+ Polylines polylines;
+ try {
+ polylines = filler->fill_surface(&surface, fill_params);
+ } catch (InfillFailedException &) {
+ }
extrusion_entities_append_paths(
dst,
- filler->fill_surface(&surface, fill_params),
+ std::move(polylines),
role,
flow.mm3_per_mm(), flow.width, flow.height);
}
@@ -2494,7 +2515,7 @@ void LoopInterfaceProcessor::generate(MyLayerExtruded &top_contact_layer, const
Polygon &contour = (i_contour == 0) ? it_contact_expoly->contour : it_contact_expoly->holes[i_contour - 1];
const Point *seg_current_pt = nullptr;
coordf_t seg_current_t = 0.;
- if (! intersection_pl(contour.split_at_first_point(), overhang_with_margin).empty()) {
+ if (! intersection_pl((Polylines)contour.split_at_first_point(), overhang_with_margin).empty()) {
// The contour is below the overhang at least to some extent.
//FIXME ideally one would place the circles below the overhang only.
// Walk around the contour and place circles so their centers are not closer than circle_distance from each other.
diff --git a/src/libslic3r/Technologies.hpp b/src/libslic3r/Technologies.hpp
index 76625d626..ec0dac541 100644
--- a/src/libslic3r/Technologies.hpp
+++ b/src/libslic3r/Technologies.hpp
@@ -1,9 +1,9 @@
-#ifndef _technologies_h_
-#define _technologies_h_
+#ifndef _prusaslicer_technologies_h_
+#define _prusaslicer_technologies_h_
-//============
+//=============
// debug techs
-//============
+//=============
// Shows camera target in the 3D scene
#define ENABLE_SHOW_CAMERA_TARGET 0
@@ -15,69 +15,96 @@
#define ENABLE_RENDER_STATISTICS 0
// Shows an imgui dialog with camera related data
#define ENABLE_CAMERA_STATISTICS 0
-// Render the picking pass instead of the main scene (use [T] key to toggle between regular rendering and picking pass only rendering)
+// Render the picking pass instead of the main scene (use [T] key to toggle between regular rendering and picking pass only rendering)
#define ENABLE_RENDER_PICKING_PASS 0
+// Enable extracting thumbnails from selected gcode and save them as png files
+#define ENABLE_THUMBNAIL_GENERATOR_DEBUG 0
+// Disable synchronization of unselected instances
+#define DISABLE_INSTANCES_SYNCH 0
+// Use wxDataViewRender instead of wxDataViewCustomRenderer
+#define ENABLE_NONCUSTOM_DATA_VIEW_RENDERING 0
+// Enable G-Code viewer statistics imgui dialog
+#define ENABLE_GCODE_VIEWER_STATISTICS 0
+// Enable G-Code viewer comparison between toolpaths height and width detected from gcode and calculated at gcode generation
+#define ENABLE_GCODE_VIEWER_DATA_CHECKING 0
+
+
+//=================
+// 2.2.0.rc1 techs
+//=================
+#define ENABLE_2_2_0_RC1 1
+
+// Enable hack to remove crash when closing on OSX 10.9.5
+#define ENABLE_HACK_CLOSING_ON_OSX_10_9_5 (1 && ENABLE_2_2_0_RC1)
//====================
-// 1.42.0.alpha1 techs
+// 2.3.0.alpha1 techs
//====================
-#define ENABLE_1_42_0_ALPHA1 1
+#define ENABLE_2_3_0_ALPHA1 1
-// Disable synchronization of unselected instances
-#define DISABLE_INSTANCES_SYNCH (0 && ENABLE_1_42_0_ALPHA1)
-// Use wxDataViewRender instead of wxDataViewCustomRenderer
-#define ENABLE_NONCUSTOM_DATA_VIEW_RENDERING (0 && ENABLE_1_42_0_ALPHA1)
+// Enable rendering of objects using environment map
+#define ENABLE_ENVIRONMENT_MAP (0 && ENABLE_2_3_0_ALPHA1)
+
+// Enable smoothing of objects normals
+#define ENABLE_SMOOTH_NORMALS (0 && ENABLE_2_3_0_ALPHA1)
+
+// Enable error logging for OpenGL calls when SLIC3R_LOGLEVEL >= 5
+#define ENABLE_OPENGL_ERROR_LOGGING (1 && ENABLE_2_3_0_ALPHA1)
+
+// Enable built-in DPI changed event handler of wxWidgets 3.1.3
+#define ENABLE_WX_3_1_3_DPI_CHANGED_EVENT (1 && ENABLE_2_3_0_ALPHA1)
//====================
-// 2.2.0.alpha1 techs
+// 2.3.0.alpha3 techs
//====================
-#define ENABLE_2_2_0_ALPHA1 1
+#define ENABLE_2_3_0_ALPHA3 1
-// Enable thumbnail generator
-// When removing this technology, remove it also from stable branch,
-// where it has been partially copied for patch 2.1.1
-#define ENABLE_THUMBNAIL_GENERATOR (1 && ENABLE_2_2_0_ALPHA1)
-#define ENABLE_THUMBNAIL_GENERATOR_DEBUG (0 && ENABLE_THUMBNAIL_GENERATOR)
+#define ENABLE_CTRL_M_ON_WINDOWS (1 && ENABLE_2_3_0_ALPHA3)
-//================
-// 2.2.0.rc1 techs
-//================
-#define ENABLE_2_2_0_RC1 1
+//====================
+// 2.3.0.alpha4 techs
+//====================
+#define ENABLE_2_3_0_ALPHA4 1
-// Enable hack to remove crash when closing on OSX 10.9.5
-#define ENABLE_HACK_CLOSING_ON_OSX_10_9_5 (1 && ENABLE_2_2_0_RC1)
+#define ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS (1 && ENABLE_2_3_0_ALPHA4)
+
+
+//===================
+// 2.3.0.beta1 techs
+//===================
+#define ENABLE_2_3_0_BETA1 1
+
+#define ENABLE_DRAG_AND_DROP_FIX (1 && ENABLE_2_3_0_BETA1)
+#define ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN (1 && ENABLE_2_3_0_BETA1)
+
+
+//===================
+// 2.3.0.beta2 techs
+//===================
+#define ENABLE_2_3_0_BETA2 1
+#define ENABLE_ARROW_KEYS_WITH_SLIDERS (1 && ENABLE_2_3_0_BETA2)
+#define ENABLE_NEW_NOTIFICATIONS_FADE_OUT (1 && ENABLE_2_3_0_BETA2)
+#define ENABLE_PREVIEW_TYPE_CHANGE (1 && ENABLE_2_3_0_BETA2)
-//============
-// 2.2.0 techs
-//============
-#define ENABLE_2_2_0 1
-// Enable automatic switch to constrained camera when manipulating the scene using regular mouse
-// while 3D mouse is connected and free camera is not selected
-#define ENABLE_AUTO_CONSTRAINED_CAMERA (1 && ENABLE_2_2_0)
+//===================
+// 2.3.0.beta3 techs
+//===================
+#define ENABLE_2_3_0_BETA3 1
+#define ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE (1 && ENABLE_2_3_0_BETA3)
+#define ENABLE_RENDER_PATH_REFRESH_AFTER_OPTIONS_CHANGE (1 && ENABLE_2_3_0_BETA3)
-//==================
-// 2.2.0.final techs
-//==================
-#define ENABLE_2_2_0_FINAL 1
-// Enable tooltips for GLCanvas3D using ImGUI
-#define ENABLE_CANVAS_TOOLTIP_USING_IMGUI (1 && ENABLE_2_2_0_FINAL)
-// Enable constraining tooltips for GLCanvas3D using ImGUI into canvas area
-#define ENABLE_CANVAS_CONSTRAINED_TOOLTIP_USING_IMGUI (1 && ENABLE_CANVAS_TOOLTIP_USING_IMGUI)
-// Enable delay for showing tooltips for GLCanvas3D using ImGUI
-#define ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI (1 && ENABLE_CANVAS_TOOLTIP_USING_IMGUI)
-// Enable modified mouse events handling for toolbars
-#define ENABLE_MODIFIED_TOOLBAR_MOUSE_EVENT_HANDLING (1 && ENABLE_CANVAS_TOOLTIP_USING_IMGUI)
-// Enable modified mouse events handling for gizmobar
-#define ENABLE_MODIFIED_GIZMOBAR_MOUSE_EVENT_HANDLING (1 && ENABLE_CANVAS_TOOLTIP_USING_IMGUI)
-// Enable fix for dragging mouse event handling for gizmobar
-#define ENABLE_GIZMO_TOOLBAR_DRAGGING_FIX (1 && ENABLE_2_2_0_FINAL)
+//=================
+// 2.3.0.rc1 techs
+//=================
+#define ENABLE_2_3_0_RC1 1
+#define ENABLE_VOLUMETRIC_EXTRUSION_PROCESSING (1 && ENABLE_2_3_0_RC1)
-#endif // _technologies_h_
+#endif // _prusaslicer_technologies_h_
diff --git a/src/libslic3r/Thread.cpp b/src/libslic3r/Thread.cpp
new file mode 100644
index 000000000..d203acb90
--- /dev/null
+++ b/src/libslic3r/Thread.cpp
@@ -0,0 +1,242 @@
+#ifdef _WIN32
+ #include <windows.h>
+ #include <boost/nowide/convert.hpp>
+#else
+ // any posix system
+ #include <pthread.h>
+#endif
+
+#include <atomic>
+#include <condition_variable>
+#include <mutex>
+#include <tbb/parallel_for.h>
+#include <tbb/tbb_thread.h>
+#include <tbb/task_arena.h>
+#include <tbb/task_scheduler_init.h>
+
+#include "Thread.hpp"
+
+namespace Slic3r {
+
+#ifdef _WIN32
+// The new API is better than the old SEH style thread naming since the names also show up in crash dumpsand ETW traces.
+// Because the new API is only available on newer Windows 10, look it up dynamically.
+
+typedef HRESULT(__stdcall* SetThreadDescriptionType)(HANDLE, PCWSTR);
+typedef HRESULT(__stdcall* GetThreadDescriptionType)(HANDLE, PWSTR*);
+
+static bool s_SetGetThreadDescriptionInitialized = false;
+static HMODULE s_hKernel32 = nullptr;
+static SetThreadDescriptionType s_fnSetThreadDescription = nullptr;
+static GetThreadDescriptionType s_fnGetThreadDescription = nullptr;
+
+static bool WindowsGetSetThreadNameAPIInitialize()
+{
+ if (! s_SetGetThreadDescriptionInitialized) {
+ // Not thread safe! It is therefore a good idea to name the main thread before spawning worker threads
+ // to initialize
+ s_hKernel32 = LoadLibraryW(L"Kernel32.dll");
+ if (s_hKernel32) {
+ s_fnSetThreadDescription = (SetThreadDescriptionType)::GetProcAddress(s_hKernel32, "SetThreadDescription");
+ s_fnGetThreadDescription = (GetThreadDescriptionType)::GetProcAddress(s_hKernel32, "GetThreadDescription");
+ }
+ s_SetGetThreadDescriptionInitialized = true;
+ }
+ return s_fnSetThreadDescription && s_fnGetThreadDescription;
+}
+
+#ifndef NDEBUG
+ // Use the old way by throwing an exception, so at least in Debug mode the thread names are shown by the debugger.
+ static constexpr DWORD MSVC_SEH_EXCEPTION_NAME_THREAD = 0x406D1388;
+
+#pragma pack(push,8)
+ typedef struct tagTHREADNAME_INFO
+ {
+ DWORD dwType; // Must be 0x1000.
+ LPCSTR szName; // Pointer to name (in user addr space).
+ DWORD dwThreadID; // Thread ID (-1=caller thread).
+ DWORD dwFlags; // Reserved for future use, must be zero.
+ } THREADNAME_INFO;
+#pragma pack(pop)
+
+ static void WindowsSetThreadNameSEH(HANDLE hThread, const char* thread_name)
+ {
+ THREADNAME_INFO info;
+ info.dwType = 0x1000;
+ info.szName = thread_name;
+ info.dwThreadID = ::GetThreadId(hThread);
+ info.dwFlags = 0;
+ __try {
+ RaiseException(MSVC_SEH_EXCEPTION_NAME_THREAD, 0, sizeof(info) / sizeof(ULONG_PTR), (ULONG_PTR*)&info);
+ } __except (EXCEPTION_EXECUTE_HANDLER) {
+ }
+ }
+#endif // NDEBUG
+
+static bool WindowsSetThreadName(HANDLE hThread, const char *thread_name)
+{
+ if (! WindowsGetSetThreadNameAPIInitialize()) {
+#ifdef NDEBUG
+ return false;
+#else // NDEBUG
+ // Running on Windows 7 or old Windows 7 in debug mode,
+ // inform the debugger about the thread name by throwing an SEH.
+ WindowsSetThreadNameSEH(hThread, thread_name);
+ return true;
+#endif // NDEBUG
+ }
+
+ size_t len = strlen(thread_name);
+ if (len < 1024) {
+ // Allocate the temp string on stack.
+ wchar_t buf[1024];
+ s_fnSetThreadDescription(hThread, boost::nowide::widen(buf, 1024, thread_name));
+ } else {
+ // Allocate dynamically.
+ s_fnSetThreadDescription(hThread, boost::nowide::widen(thread_name).c_str());
+ }
+ return true;
+}
+
+bool set_thread_name(std::thread &thread, const char *thread_name)
+{
+ return WindowsSetThreadName(static_cast<HANDLE>(thread.native_handle()), thread_name);
+}
+
+bool set_thread_name(boost::thread &thread, const char *thread_name)
+{
+ return WindowsSetThreadName(static_cast<HANDLE>(thread.native_handle()), thread_name);
+}
+
+bool set_current_thread_name(const char *thread_name)
+{
+ return WindowsSetThreadName(::GetCurrentThread(), thread_name);
+}
+
+std::optional<std::string> get_current_thread_name()
+{
+ if (! WindowsGetSetThreadNameAPIInitialize())
+ return std::nullopt;
+
+ wchar_t *ptr = nullptr;
+ s_fnGetThreadDescription(::GetCurrentThread(), &ptr);
+ return (ptr == nullptr) ? std::string() : boost::nowide::narrow(ptr);
+}
+
+#else // _WIN32
+
+#ifdef __APPLE__
+
+// Appe screwed the Posix norm.
+bool set_thread_name(std::thread &thread, const char *thread_name)
+{
+// not supported
+// pthread_setname_np(thread.native_handle(), thread_name);
+ return false;
+}
+
+bool set_thread_name(boost::thread &thread, const char *thread_name)
+{
+// not supported
+// pthread_setname_np(thread.native_handle(), thread_name);
+ return false;
+}
+
+bool set_current_thread_name(const char *thread_name)
+{
+ pthread_setname_np(thread_name);
+ return true;
+}
+
+std::optional<std::string> get_current_thread_name()
+{
+// not supported
+// char buf[16];
+// return std::string(thread_getname_np(buf, 16) == 0 ? buf : "");
+ return std::nullopt;
+}
+
+#else
+
+// posix
+bool set_thread_name(std::thread &thread, const char *thread_name)
+{
+ pthread_setname_np(thread.native_handle(), thread_name);
+ return true;
+}
+
+bool set_thread_name(boost::thread &thread, const char *thread_name)
+{
+ pthread_setname_np(thread.native_handle(), thread_name);
+ return true;
+}
+
+bool set_current_thread_name(const char *thread_name)
+{
+ pthread_setname_np(pthread_self(), thread_name);
+ return true;
+}
+
+std::optional<std::string> get_current_thread_name()
+{
+ char buf[16];
+ return std::string(pthread_getname_np(pthread_self(), buf, 16) == 0 ? buf : "");
+}
+
+#endif
+
+#endif // _WIN32
+
+// Spawn (n - 1) worker threads on Intel TBB thread pool and name them by an index and a system thread ID.
+void name_tbb_thread_pool_threads()
+{
+ static bool initialized = false;
+ if (initialized)
+ return;
+ initialized = true;
+
+ // see GH issue #5661 PrusaSlicer hangs on Linux when run with non standard task affinity
+ // TBB will respect the task affinity mask on Linux and spawn less threads than std::thread::hardware_concurrency().
+// const size_t nthreads_hw = std::thread::hardware_concurrency();
+ const size_t nthreads_hw = tbb::this_task_arena::max_concurrency();
+ size_t nthreads = nthreads_hw;
+
+#ifdef SLIC3R_PROFILE
+ // Shiny profiler is not thread safe, thus disable parallelization.
+ nthreads = 1;
+#endif
+
+ if (nthreads != nthreads_hw)
+ new tbb::task_scheduler_init(int(nthreads));
+
+ std::atomic<size_t> nthreads_running(0);
+ std::condition_variable cv;
+ std::mutex cv_m;
+ auto master_thread_id = tbb::this_tbb_thread::get_id();
+ tbb::parallel_for(
+ tbb::blocked_range<size_t>(0, nthreads, 1),
+ [&nthreads_running, nthreads, &master_thread_id, &cv, &cv_m](const tbb::blocked_range<size_t> &range) {
+ assert(range.begin() + 1 == range.end());
+ if (nthreads_running.fetch_add(1) + 1 == nthreads) {
+ // All threads are spinning.
+ // Wake them up.
+ cv.notify_all();
+ } else {
+ // Wait for the last thread to wake the others.
+ std::unique_lock<std::mutex> lk(cv_m);
+ cv.wait(lk, [&nthreads_running, nthreads]{return nthreads_running == nthreads;});
+ }
+ auto thread_id = tbb::this_tbb_thread::get_id();
+ if (thread_id == master_thread_id) {
+ // The calling thread runs the 0'th task.
+ assert(range.begin() == 0);
+ } else {
+ assert(range.begin() > 0);
+ std::ostringstream name;
+ name << "slic3r_tbb_" << range.begin();
+ set_current_thread_name(name.str().c_str());
+ }
+ });
+}
+
+}
diff --git a/src/libslic3r/Thread.hpp b/src/libslic3r/Thread.hpp
new file mode 100644
index 000000000..a86123796
--- /dev/null
+++ b/src/libslic3r/Thread.hpp
@@ -0,0 +1,57 @@
+#ifndef GUI_THREAD_HPP
+#define GUI_THREAD_HPP
+
+#include <utility>
+#include <string>
+#include <thread>
+#include <boost/thread.hpp>
+
+namespace Slic3r {
+
+// Set / get thread name.
+// Returns false if the API is not supported.
+//
+// It is a good idea to name the main thread before spawning children threads, because dynamic linking is used on Windows 10
+// to initialize Get/SetThreadDescription functions, which is not thread safe.
+//
+// pthread_setname_np supports maximum 15 character thread names! (16th character is the null terminator)
+//
+// Methods taking the thread as an argument are not supported by OSX.
+// Naming threads is only supported on newer Windows 10.
+
+bool set_thread_name(std::thread &thread, const char *thread_name);
+inline bool set_thread_name(std::thread &thread, const std::string &thread_name) { return set_thread_name(thread, thread_name.c_str()); }
+bool set_thread_name(boost::thread &thread, const char *thread_name);
+inline bool set_thread_name(boost::thread &thread, const std::string &thread_name) { return set_thread_name(thread, thread_name.c_str()); }
+bool set_current_thread_name(const char *thread_name);
+inline bool set_current_thread_name(const std::string &thread_name) { return set_current_thread_name(thread_name.c_str()); }
+
+// Returns nullopt if not supported.
+// Not supported by OSX.
+// Naming threads is only supported on newer Windows 10.
+std::optional<std::string> get_current_thread_name();
+
+// To be called somewhere before the TBB threads are spinned for the first time, to
+// give them names recognizible in the debugger.
+void name_tbb_thread_pool_threads();
+
+template<class Fn>
+inline boost::thread create_thread(boost::thread::attributes &attrs, Fn &&fn)
+{
+ // Duplicating the stack allocation size of Thread Building Block worker
+ // threads of the thread pool: allocate 4MB on a 64bit system, allocate 2MB
+ // on a 32bit system by default.
+
+ attrs.set_stack_size((sizeof(void*) == 4) ? (2048 * 1024) : (4096 * 1024));
+ return boost::thread{attrs, std::forward<Fn>(fn)};
+}
+
+template<class Fn> inline boost::thread create_thread(Fn &&fn)
+{
+ boost::thread::attributes attrs;
+ return create_thread(attrs, std::forward<Fn>(fn));
+}
+
+}
+
+#endif // GUI_THREAD_HPP
diff --git a/src/libslic3r/TriangleMesh.cpp b/src/libslic3r/TriangleMesh.cpp
index ee5e96f3d..b99a21f11 100644
--- a/src/libslic3r/TriangleMesh.cpp
+++ b/src/libslic3r/TriangleMesh.cpp
@@ -1,3 +1,4 @@
+#include "Exception.hpp"
#include "TriangleMesh.hpp"
#include "ClipperUtils.hpp"
#include "Geometry.hpp"
@@ -42,7 +43,7 @@
namespace Slic3r {
-TriangleMesh::TriangleMesh(const Pointf3s &points, const std::vector<Vec3crd>& facets) : repaired(false)
+TriangleMesh::TriangleMesh(const Pointf3s &points, const std::vector<Vec3i> &facets) : repaired(false)
{
stl_file &stl = this->stl;
stl.stats.type = inmemory;
@@ -70,7 +71,7 @@ TriangleMesh::TriangleMesh(const Pointf3s &points, const std::vector<Vec3crd>& f
stl_get_size(&stl);
}
-TriangleMesh::TriangleMesh(const indexed_triangle_set &M)
+TriangleMesh::TriangleMesh(const indexed_triangle_set &M) : repaired(false)
{
stl.stats.type = inmemory;
@@ -420,7 +421,7 @@ std::deque<uint32_t> TriangleMesh::find_unvisited_neighbors(std::vector<unsigned
{
// Make sure we're not operating on a broken mesh.
if (!this->repaired)
- throw std::runtime_error("find_unvisited_neighbors() requires repair()");
+ throw Slic3r::RuntimeError("find_unvisited_neighbors() requires repair()");
// If the visited list is empty, populate it with false for every facet.
if (facet_visited.empty())
@@ -600,7 +601,7 @@ TriangleMesh TriangleMesh::convex_hull_3d() const
// Let's collect results:
Pointf3s dst_vertices;
- std::vector<Vec3crd> facets;
+ std::vector<Vec3i> facets;
auto facet_list = qhull.facetList().toStdVector();
for (const orgQhull::QhullFacet& facet : facet_list)
{ // iterate through facets
@@ -683,7 +684,7 @@ void TriangleMeshSlicer::init(const TriangleMesh *_mesh, throw_on_cancel_callbac
{
mesh = _mesh;
if (! mesh->has_shared_vertices())
- throw std::invalid_argument("TriangleMeshSlicer was passed a mesh without shared vertices.");
+ throw Slic3r::InvalidArgument("TriangleMeshSlicer was passed a mesh without shared vertices.");
throw_on_cancel();
facets_edges.assign(_mesh->stl.stats.number_of_facets * 3, -1);
@@ -774,9 +775,10 @@ void TriangleMeshSlicer::set_up_direction(const Vec3f& up)
m_use_quaternion = true;
}
-
-
-void TriangleMeshSlicer::slice(const std::vector<float> &z, SlicingMode mode, std::vector<Polygons>* layers, throw_on_cancel_callback_type throw_on_cancel) const
+void TriangleMeshSlicer::slice(
+ const std::vector<float> &z,
+ SlicingMode mode, size_t alternate_mode_first_n_layers, SlicingMode alternate_mode,
+ std::vector<Polygons>* layers, throw_on_cancel_callback_type throw_on_cancel) const
{
BOOST_LOG_TRIVIAL(debug) << "TriangleMeshSlicer::slice";
@@ -831,20 +833,21 @@ void TriangleMeshSlicer::slice(const std::vector<float> &z, SlicingMode mode, st
layers->resize(z.size());
tbb::parallel_for(
tbb::blocked_range<size_t>(0, z.size()),
- [&lines, &layers, mode, throw_on_cancel, this](const tbb::blocked_range<size_t>& range) {
+ [&lines, &layers, mode, alternate_mode_first_n_layers, alternate_mode, throw_on_cancel, this](const tbb::blocked_range<size_t>& range) {
for (size_t line_idx = range.begin(); line_idx < range.end(); ++ line_idx) {
if ((line_idx & 0x0ffff) == 0)
throw_on_cancel();
- Polygons &polygons = (*layers)[line_idx];
+ Polygons &polygons = (*layers)[line_idx];
this->make_loops(lines[line_idx], &polygons);
+ auto this_mode = line_idx < alternate_mode_first_n_layers ? alternate_mode : mode;
if (! polygons.empty()) {
- if (mode == SlicingMode::Positive) {
+ if (this_mode == SlicingMode::Positive) {
// Reorient all loops to be CCW.
for (Polygon& p : polygons)
p.make_counter_clockwise();
- } else if (mode == SlicingMode::PositiveLargestContour) {
+ } else if (this_mode == SlicingMode::PositiveLargestContour) {
// Keep just the largest polygon, make it CCW.
double max_area = 0.;
Polygon* max_area_polygon = nullptr;
@@ -940,24 +943,32 @@ void TriangleMeshSlicer::_slice_do(size_t facet_idx, std::vector<IntersectionLin
}
}
-void TriangleMeshSlicer::slice(const std::vector<float> &z, SlicingMode mode, const float closing_radius, std::vector<ExPolygons>* layers, throw_on_cancel_callback_type throw_on_cancel) const
+void TriangleMeshSlicer::slice(
+ const std::vector<float> &z, SlicingMode mode, size_t alternate_mode_first_n_layers, SlicingMode alternate_mode, const float closing_radius,
+ std::vector<ExPolygons>* layers, throw_on_cancel_callback_type throw_on_cancel) const
{
std::vector<Polygons> layers_p;
- this->slice(z, (mode == SlicingMode::PositiveLargestContour) ? SlicingMode::Positive : mode, &layers_p, throw_on_cancel);
+ this->slice(z,
+ (mode == SlicingMode::PositiveLargestContour) ? SlicingMode::Positive : mode,
+ alternate_mode_first_n_layers,
+ (alternate_mode == SlicingMode::PositiveLargestContour) ? SlicingMode::Positive : alternate_mode,
+ &layers_p, throw_on_cancel);
BOOST_LOG_TRIVIAL(debug) << "TriangleMeshSlicer::make_expolygons in parallel - start";
layers->resize(z.size());
tbb::parallel_for(
tbb::blocked_range<size_t>(0, z.size()),
- [&layers_p, mode, closing_radius, layers, throw_on_cancel, this](const tbb::blocked_range<size_t>& range) {
+ [&layers_p, mode, alternate_mode_first_n_layers, alternate_mode, closing_radius, layers, throw_on_cancel, this]
+ (const tbb::blocked_range<size_t>& range) {
for (size_t layer_id = range.begin(); layer_id < range.end(); ++ layer_id) {
#ifdef SLIC3R_TRIANGLEMESH_DEBUG
- printf("Layer " PRINTF_ZU " (slice_z = %.2f):\n", layer_id, z[layer_id]);
+ printf("Layer %zu (slice_z = %.2f):\n", layer_id, z[layer_id]);
#endif
throw_on_cancel();
ExPolygons &expolygons = (*layers)[layer_id];
this->make_expolygons(layers_p[layer_id], closing_radius, &expolygons);
- if (mode == SlicingMode::PositiveLargestContour)
+ const auto this_mode = layer_id < alternate_mode_first_n_layers ? alternate_mode : mode;
+ if (this_mode == SlicingMode::PositiveLargestContour)
keep_largest_contour_only(expolygons);
}
});
@@ -1779,7 +1790,7 @@ void TriangleMeshSlicer::make_expolygons(const Polygons &loops, const float clos
size_t holes_count = 0;
for (ExPolygons::const_iterator e = ex_slices.begin(); e != ex_slices.end(); ++ e)
holes_count += e->holes.size();
- printf(PRINTF_ZU " surface(s) having " PRINTF_ZU " holes detected from " PRINTF_ZU " polylines\n",
+ printf("%zu surface(s) having %zu holes detected from %zu polylines\n",
ex_slices.size(), holes_count, loops.size());
#endif
@@ -1931,22 +1942,18 @@ void TriangleMeshSlicer::cut(float z, TriangleMesh* upper, TriangleMesh* lower)
// Generate the vertex list for a cube solid of arbitrary size in X/Y/Z.
TriangleMesh make_cube(double x, double y, double z)
{
- Vec3d pv[8] = {
- Vec3d(x, y, 0), Vec3d(x, 0, 0), Vec3d(0, 0, 0),
- Vec3d(0, y, 0), Vec3d(x, y, z), Vec3d(0, y, z),
- Vec3d(0, 0, z), Vec3d(x, 0, z)
- };
- Vec3crd fv[12] = {
- Vec3crd(0, 1, 2), Vec3crd(0, 2, 3), Vec3crd(4, 5, 6),
- Vec3crd(4, 6, 7), Vec3crd(0, 4, 7), Vec3crd(0, 7, 1),
- Vec3crd(1, 7, 6), Vec3crd(1, 6, 2), Vec3crd(2, 6, 5),
- Vec3crd(2, 5, 3), Vec3crd(4, 0, 3), Vec3crd(4, 3, 5)
- };
-
- std::vector<Vec3crd> facets(&fv[0], &fv[0]+12);
- Pointf3s vertices(&pv[0], &pv[0]+8);
-
- TriangleMesh mesh(vertices ,facets);
+ TriangleMesh mesh(
+ {
+ {x, y, 0}, {x, 0, 0}, {0, 0, 0},
+ {0, y, 0}, {x, y, z}, {0, y, z},
+ {0, 0, z}, {x, 0, z}
+ },
+ {
+ {0, 1, 2}, {0, 2, 3}, {4, 5, 6},
+ {4, 6, 7}, {0, 4, 7}, {0, 7, 1},
+ {1, 7, 6}, {1, 6, 2}, {2, 6, 5},
+ {2, 5, 3}, {4, 0, 3}, {4, 3, 5}
+ });
mesh.repair();
return mesh;
}
@@ -1959,8 +1966,8 @@ TriangleMesh make_cylinder(double r, double h, double fa)
size_t n_steps = (size_t)ceil(2. * PI / fa);
double angle_step = 2. * PI / n_steps;
- Pointf3s vertices;
- std::vector<Vec3crd> facets;
+ Pointf3s vertices;
+ std::vector<Vec3i> facets;
vertices.reserve(2 * n_steps + 2);
facets.reserve(4 * n_steps);
@@ -1980,17 +1987,17 @@ TriangleMesh make_cylinder(double r, double h, double fa)
vertices.emplace_back(Vec3d(p(0), p(1), 0.));
vertices.emplace_back(Vec3d(p(0), p(1), h));
int id = (int)vertices.size() - 1;
- facets.emplace_back(Vec3crd( 0, id - 1, id - 3)); // top
- facets.emplace_back(Vec3crd(id, 1, id - 2)); // bottom
- facets.emplace_back(Vec3crd(id, id - 2, id - 3)); // upper-right of side
- facets.emplace_back(Vec3crd(id, id - 3, id - 1)); // bottom-left of side
+ facets.emplace_back( 0, id - 1, id - 3); // top
+ facets.emplace_back(id, 1, id - 2); // bottom
+ facets.emplace_back(id, id - 2, id - 3); // upper-right of side
+ facets.emplace_back(id, id - 3, id - 1); // bottom-left of side
}
// Connect the last set of vertices with the first.
int id = (int)vertices.size() - 1;
- facets.emplace_back(Vec3crd( 0, 2, id - 1));
- facets.emplace_back(Vec3crd( 3, 1, id));
- facets.emplace_back(Vec3crd(id, 2, 3));
- facets.emplace_back(Vec3crd(id, id - 1, 2));
+ facets.emplace_back( 0, 2, id - 1);
+ facets.emplace_back( 3, 1, id);
+ facets.emplace_back(id, 2, 3);
+ facets.emplace_back(id, id - 1, 2);
TriangleMesh mesh(std::move(vertices), std::move(facets));
mesh.repair();
@@ -2025,7 +2032,7 @@ TriangleMesh make_sphere(double radius, double fa)
}
}
- std::vector<Vec3crd> facets;
+ std::vector<Vec3i> facets;
facets.reserve(2 * (stackCount - 1) * sectorCount);
for (int i = 0; i < stackCount; ++ i) {
// Beginning of current stack.
@@ -2040,11 +2047,11 @@ TriangleMesh make_sphere(double radius, double fa)
int k2_next = k2;
if (i != 0) {
k1_next = (j + 1 == sectorCount) ? k1_first : (k1 + 1);
- facets.emplace_back(Vec3crd(k1, k2, k1_next));
+ facets.emplace_back(k1, k2, k1_next);
}
if (i + 1 != stackCount) {
k2_next = (j + 1 == sectorCount) ? k2_first : (k2 + 1);
- facets.emplace_back(Vec3crd(k1_next, k2, k2_next));
+ facets.emplace_back(k1_next, k2, k2_next);
}
k1 = k1_next;
k2 = k2_next;
diff --git a/src/libslic3r/TriangleMesh.hpp b/src/libslic3r/TriangleMesh.hpp
index bd872a975..71cd231c3 100644
--- a/src/libslic3r/TriangleMesh.hpp
+++ b/src/libslic3r/TriangleMesh.hpp
@@ -22,7 +22,7 @@ class TriangleMesh
{
public:
TriangleMesh() : repaired(false) {}
- TriangleMesh(const Pointf3s &points, const std::vector<Vec3crd> &facets);
+ TriangleMesh(const Pointf3s &points, const std::vector<Vec3i> &facets);
explicit TriangleMesh(const indexed_triangle_set &M);
void clear() { this->stl.clear(); this->its.clear(); this->repaired = false; }
bool ReadSTLFile(const char* input_file) { return stl_open(&stl, input_file); }
@@ -179,8 +179,17 @@ public:
TriangleMeshSlicer() : mesh(nullptr) {}
TriangleMeshSlicer(const TriangleMesh* mesh) { this->init(mesh, [](){}); }
void init(const TriangleMesh *mesh, throw_on_cancel_callback_type throw_on_cancel);
- void slice(const std::vector<float> &z, SlicingMode mode, std::vector<Polygons>* layers, throw_on_cancel_callback_type throw_on_cancel) const;
- void slice(const std::vector<float> &z, SlicingMode mode, const float closing_radius, std::vector<ExPolygons>* layers, throw_on_cancel_callback_type throw_on_cancel) const;
+ void slice(
+ const std::vector<float> &z, SlicingMode mode, size_t alternate_mode_first_n_layers, SlicingMode alternate_mode,
+ std::vector<Polygons>* layers, throw_on_cancel_callback_type throw_on_cancel) const;
+ void slice(const std::vector<float> &z, SlicingMode mode, std::vector<Polygons>* layers, throw_on_cancel_callback_type throw_on_cancel) const
+ { return this->slice(z, mode, 0, mode, layers, throw_on_cancel); }
+ void slice(
+ const std::vector<float> &z, SlicingMode mode, size_t alternate_mode_first_n_layers, SlicingMode alternate_mode, const float closing_radius,
+ std::vector<ExPolygons>* layers, throw_on_cancel_callback_type throw_on_cancel) const;
+ void slice(const std::vector<float> &z, SlicingMode mode, const float closing_radius,
+ std::vector<ExPolygons>* layers, throw_on_cancel_callback_type throw_on_cancel) const
+ { this->slice(z, mode, 0, mode, closing_radius, layers, throw_on_cancel); }
enum FacetSliceType {
NoSlice = 0,
Slicing = 1,
diff --git a/src/libslic3r/TriangleSelector.cpp b/src/libslic3r/TriangleSelector.cpp
new file mode 100644
index 000000000..3fe688195
--- /dev/null
+++ b/src/libslic3r/TriangleSelector.cpp
@@ -0,0 +1,768 @@
+#include "TriangleSelector.hpp"
+#include "Model.hpp"
+
+
+namespace Slic3r {
+
+
+
+// sides_to_split==-1 : just restore previous split
+void TriangleSelector::Triangle::set_division(int sides_to_split, int special_side_idx)
+{
+ assert(sides_to_split >=-1 && sides_to_split <= 3);
+ assert(special_side_idx >=-1 && special_side_idx < 3);
+
+ // If splitting one or two sides, second argument must be provided.
+ assert(sides_to_split != 1 || special_side_idx != -1);
+ assert(sides_to_split != 2 || special_side_idx != -1);
+
+ if (sides_to_split != -1) {
+ this->number_of_splits = sides_to_split;
+ if (sides_to_split != 0) {
+ assert(old_number_of_splits == 0);
+ this->special_side_idx = special_side_idx;
+ this->old_number_of_splits = sides_to_split;
+ }
+ }
+ else {
+ assert(old_number_of_splits != 0);
+ this->number_of_splits = old_number_of_splits;
+ // indices of children should still be there.
+ }
+}
+
+
+
+void TriangleSelector::select_patch(const Vec3f& hit, int facet_start,
+ const Vec3f& source, float radius,
+ CursorType cursor_type, EnforcerBlockerType new_state,
+ const Transform3d& trafo)
+{
+ assert(facet_start < m_orig_size_indices);
+
+ // Save current cursor center, squared radius and camera direction, so we don't
+ // have to pass it around.
+ m_cursor = Cursor(hit, source, radius, cursor_type, trafo);
+
+ // In case user changed cursor size since last time, update triangle edge limit.
+ // It is necessary to compare the internal radius in m_cursor! radius is in
+ // world coords and does not change after scaling.
+ if (m_old_cursor_radius_sqr != m_cursor.radius_sqr) {
+ set_edge_limit(std::sqrt(m_cursor.radius_sqr) / 5.f);
+ m_old_cursor_radius_sqr = m_cursor.radius_sqr;
+ }
+
+ // Now start with the facet the pointer points to and check all adjacent facets.
+ std::vector<int> facets_to_check{facet_start};
+ std::vector<bool> visited(m_orig_size_indices, false); // keep track of facets we already processed
+ int facet_idx = 0; // index into facets_to_check
+ while (facet_idx < int(facets_to_check.size())) {
+ int facet = facets_to_check[facet_idx];
+ if (! visited[facet]) {
+ if (select_triangle(facet, new_state)) {
+ // add neighboring facets to list to be proccessed later
+ for (int n=0; n<3; ++n) {
+ int neighbor_idx = m_mesh->stl.neighbors_start[facet].neighbor[n];
+ if (neighbor_idx >=0 && (m_cursor.type == SPHERE || faces_camera(neighbor_idx)))
+ facets_to_check.push_back(neighbor_idx);
+ }
+ }
+ }
+ visited[facet] = true;
+ ++facet_idx;
+ }
+}
+
+
+
+// Selects either the whole triangle (discarding any children it had), or divides
+// the triangle recursively, selecting just subtriangles truly inside the circle.
+// This is done by an actual recursive call. Returns false if the triangle is
+// outside the cursor.
+bool TriangleSelector::select_triangle(int facet_idx, EnforcerBlockerType type, bool recursive_call)
+{
+ assert(facet_idx < int(m_triangles.size()));
+
+ Triangle* tr = &m_triangles[facet_idx];
+ if (! tr->valid)
+ return false;
+
+ int num_of_inside_vertices = vertices_inside(facet_idx);
+
+ if (num_of_inside_vertices == 0
+ && ! is_pointer_in_triangle(facet_idx)
+ && ! is_edge_inside_cursor(facet_idx))
+ return false;
+
+ if (num_of_inside_vertices == 3) {
+ // dump any subdivision and select whole triangle
+ undivide_triangle(facet_idx);
+ tr->set_state(type);
+ } else {
+ // the triangle is partially inside, let's recursively divide it
+ // (if not already) and try selecting its children.
+
+ if (! tr->is_split() && tr->get_state() == type) {
+ // This is leaf triangle that is already of correct type as a whole.
+ // No need to split, all children would end up selected anyway.
+ return true;
+ }
+
+ split_triangle(facet_idx);
+ tr = &m_triangles[facet_idx]; // might have been invalidated
+
+
+ int num_of_children = tr->number_of_split_sides() + 1;
+ if (num_of_children != 1) {
+ for (int i=0; i<num_of_children; ++i) {
+ assert(i < int(tr->children.size()));
+ assert(tr->children[i] < int(m_triangles.size()));
+
+ select_triangle(tr->children[i], type, true);
+ tr = &m_triangles[facet_idx]; // might have been invalidated
+ }
+ }
+ }
+
+ if (! recursive_call) {
+ // In case that all children are leafs and have the same state now,
+ // they may be removed and substituted by the parent triangle.
+ remove_useless_children(facet_idx);
+
+ // Make sure that we did not lose track of invalid triangles.
+ assert(m_invalid_triangles == std::count_if(m_triangles.begin(), m_triangles.end(),
+ [](const Triangle& tr) { return ! tr.valid; }));
+
+ // Do garbage collection maybe?
+ if (2*m_invalid_triangles > int(m_triangles.size()))
+ garbage_collect();
+ }
+ return true;
+}
+
+
+
+void TriangleSelector::set_facet(int facet_idx, EnforcerBlockerType state)
+{
+ assert(facet_idx < m_orig_size_indices);
+ undivide_triangle(facet_idx);
+ assert(! m_triangles[facet_idx].is_split());
+ m_triangles[facet_idx].set_state(state);
+}
+
+void TriangleSelector::split_triangle(int facet_idx)
+{
+ if (m_triangles[facet_idx].is_split()) {
+ // The triangle is divided already.
+ return;
+ }
+
+ Triangle* tr = &m_triangles[facet_idx];
+
+ EnforcerBlockerType old_type = tr->get_state();
+
+ if (tr->was_split_before() != 0) {
+ // This triangle is not split at the moment, but was at one point
+ // in history. We can just restore it and resurrect its children.
+ tr->set_division(-1);
+ for (int i=0; i<=tr->number_of_split_sides(); ++i) {
+ m_triangles[tr->children[i]].set_state(old_type);
+ m_triangles[tr->children[i]].valid = true;
+ --m_invalid_triangles;
+ }
+ return;
+ }
+
+ // If we got here, we are about to actually split the triangle.
+ const double limit_squared = m_edge_limit_sqr;
+
+ std::array<int, 3>& facet = tr->verts_idxs;
+ std::array<const stl_vertex*, 3> pts = { &m_vertices[facet[0]].v,
+ &m_vertices[facet[1]].v,
+ &m_vertices[facet[2]].v};
+ std::array<stl_vertex, 3> pts_transformed; // must stay in scope of pts !!!
+
+ // In case the object is non-uniformly scaled, transform the
+ // points to world coords.
+ if (! m_cursor.uniform_scaling) {
+ for (size_t i=0; i<pts.size(); ++i) {
+ pts_transformed[i] = m_cursor.trafo * (*pts[i]);
+ pts[i] = &pts_transformed[i];
+ }
+ }
+
+ std::array<double, 3> sides;
+ sides = { (*pts[2]-*pts[1]).squaredNorm(),
+ (*pts[0]-*pts[2]).squaredNorm(),
+ (*pts[1]-*pts[0]).squaredNorm() };
+
+ std::vector<int> sides_to_split;
+ int side_to_keep = -1;
+ for (int pt_idx = 0; pt_idx<3; ++pt_idx) {
+ if (sides[pt_idx] > limit_squared)
+ sides_to_split.push_back(pt_idx);
+ else
+ side_to_keep = pt_idx;
+ }
+ if (sides_to_split.empty()) {
+ // This shall be unselected.
+ tr->set_division(0);
+ return;
+ }
+
+ // Save how the triangle will be split. Second argument makes sense only for one
+ // or two split sides, otherwise the value is ignored.
+ tr->set_division(sides_to_split.size(),
+ sides_to_split.size() == 2 ? side_to_keep : sides_to_split[0]);
+
+ perform_split(facet_idx, old_type);
+}
+
+
+
+// Is pointer in a triangle?
+bool TriangleSelector::is_pointer_in_triangle(int facet_idx) const
+{
+ const Vec3f& p1 = m_vertices[m_triangles[facet_idx].verts_idxs[0]].v;
+ const Vec3f& p2 = m_vertices[m_triangles[facet_idx].verts_idxs[1]].v;
+ const Vec3f& p3 = m_vertices[m_triangles[facet_idx].verts_idxs[2]].v;
+ return m_cursor.is_pointer_in_triangle(p1, p2, p3);
+}
+
+
+
+// Determine whether this facet is potentially visible (still can be obscured).
+bool TriangleSelector::faces_camera(int facet) const
+{
+ assert(facet < m_orig_size_indices);
+ // The normal is cached in mesh->stl, use it.
+ Vec3f normal = m_mesh->stl.facet_start[facet].normal;
+
+ if (! m_cursor.uniform_scaling) {
+ // Transform the normal into world coords.
+ normal = m_cursor.trafo_normal * normal;
+ }
+ return (normal.dot(m_cursor.dir) < 0.);
+}
+
+
+// How many vertices of a triangle are inside the circle?
+int TriangleSelector::vertices_inside(int facet_idx) const
+{
+ int inside = 0;
+ for (size_t i=0; i<3; ++i) {
+ if (m_cursor.is_mesh_point_inside(m_vertices[m_triangles[facet_idx].verts_idxs[i]].v))
+ ++inside;
+ }
+ return inside;
+}
+
+
+// Is edge inside cursor?
+bool TriangleSelector::is_edge_inside_cursor(int facet_idx) const
+{
+ std::array<Vec3f, 3> pts;
+ for (int i=0; i<3; ++i) {
+ pts[i] = m_vertices[m_triangles[facet_idx].verts_idxs[i]].v;
+ if (! m_cursor.uniform_scaling)
+ pts[i] = m_cursor.trafo * pts[i];
+ }
+
+ const Vec3f& p = m_cursor.center;
+
+ for (int side = 0; side < 3; ++side) {
+ const Vec3f& a = pts[side];
+ const Vec3f& b = pts[side<2 ? side+1 : 0];
+ Vec3f s = (b-a).normalized();
+ float t = (p-a).dot(s);
+ Vec3f vector = a+t*s - p;
+
+ // vector is 3D vector from center to the intersection. What we want to
+ // measure is length of its projection onto plane perpendicular to dir.
+ float dist_sqr = vector.squaredNorm() - std::pow(vector.dot(m_cursor.dir), 2.f);
+ if (dist_sqr < m_cursor.radius_sqr && t>=0.f && t<=(b-a).norm())
+ return true;
+ }
+ return false;
+}
+
+
+
+// Recursively remove all subtriangles.
+void TriangleSelector::undivide_triangle(int facet_idx)
+{
+ assert(facet_idx < int(m_triangles.size()));
+ Triangle& tr = m_triangles[facet_idx];
+
+ if (tr.is_split()) {
+ for (int i=0; i<=tr.number_of_split_sides(); ++i) {
+ undivide_triangle(tr.children[i]);
+ m_triangles[tr.children[i]].valid = false;
+ ++m_invalid_triangles;
+ }
+ tr.set_division(0); // not split
+ }
+}
+
+
+void TriangleSelector::remove_useless_children(int facet_idx)
+{
+ // Check that all children are leafs of the same type. If not, try to
+ // make them (recursive call). Remove them if sucessful.
+
+ assert(facet_idx < int(m_triangles.size()) && m_triangles[facet_idx].valid);
+ Triangle& tr = m_triangles[facet_idx];
+
+ if (! tr.is_split()) {
+ // This is a leaf, there nothing to do. This can happen during the
+ // first (non-recursive call). Shouldn't otherwise.
+ return;
+ }
+
+ // Call this for all non-leaf children.
+ for (int child_idx=0; child_idx<=tr.number_of_split_sides(); ++child_idx) {
+ assert(child_idx < int(m_triangles.size()) && m_triangles[child_idx].valid);
+ if (m_triangles[tr.children[child_idx]].is_split())
+ remove_useless_children(tr.children[child_idx]);
+ }
+
+
+ // Return if a child is not leaf or two children differ in type.
+ EnforcerBlockerType first_child_type = EnforcerBlockerType::NONE;
+ for (int child_idx=0; child_idx<=tr.number_of_split_sides(); ++child_idx) {
+ if (m_triangles[tr.children[child_idx]].is_split())
+ return;
+ if (child_idx == 0)
+ first_child_type = m_triangles[tr.children[0]].get_state();
+ else if (m_triangles[tr.children[child_idx]].get_state() != first_child_type)
+ return;
+ }
+
+ // If we got here, the children can be removed.
+ undivide_triangle(facet_idx);
+ tr.set_state(first_child_type);
+}
+
+
+
+void TriangleSelector::garbage_collect()
+{
+ // First make a map from old to new triangle indices.
+ int new_idx = m_orig_size_indices;
+ std::vector<int> new_triangle_indices(m_triangles.size(), -1);
+ for (int i = m_orig_size_indices; i<int(m_triangles.size()); ++i) {
+ if (m_triangles[i].valid) {
+ new_triangle_indices[i] = new_idx;
+ ++new_idx;
+ } else {
+ // Decrement reference counter for the vertices.
+ for (int j=0; j<3; ++j)
+ --m_vertices[m_triangles[i].verts_idxs[j]].ref_cnt;
+ }
+ }
+
+ // Now we know which vertices are not referenced anymore. Make a map
+ // from old idxs to new ones, like we did for triangles.
+ new_idx = m_orig_size_vertices;
+ std::vector<int> new_vertices_indices(m_vertices.size(), -1);
+ for (int i=m_orig_size_vertices; i<int(m_vertices.size()); ++i) {
+ assert(m_vertices[i].ref_cnt >= 0);
+ if (m_vertices[i].ref_cnt != 0) {
+ new_vertices_indices[i] = new_idx;
+ ++new_idx;
+ }
+ }
+
+ // We can remove all invalid triangles and vertices that are no longer referenced.
+ m_triangles.erase(std::remove_if(m_triangles.begin()+m_orig_size_indices, m_triangles.end(),
+ [](const Triangle& tr) { return ! tr.valid; }),
+ m_triangles.end());
+ m_vertices.erase(std::remove_if(m_vertices.begin()+m_orig_size_vertices, m_vertices.end(),
+ [](const Vertex& vert) { return vert.ref_cnt == 0; }),
+ m_vertices.end());
+
+ // Now go through all remaining triangles and update changed indices.
+ for (Triangle& tr : m_triangles) {
+ assert(tr.valid);
+
+ if (tr.is_split()) {
+ // There are children. Update their indices.
+ for (int j=0; j<=tr.number_of_split_sides(); ++j) {
+ assert(new_triangle_indices[tr.children[j]] != -1);
+ tr.children[j] = new_triangle_indices[tr.children[j]];
+ }
+ }
+
+ // Update indices into m_vertices. The original vertices are never
+ // touched and need not be reindexed.
+ for (int& idx : tr.verts_idxs) {
+ if (idx >= m_orig_size_vertices) {
+ assert(new_vertices_indices[idx] != -1);
+ idx = new_vertices_indices[idx];
+ }
+ }
+
+ // If this triangle was split before, forget it.
+ // Children referenced in the cache are dead by now.
+ tr.forget_history();
+ }
+
+ m_invalid_triangles = 0;
+}
+
+TriangleSelector::TriangleSelector(const TriangleMesh& mesh)
+ : m_mesh{&mesh}
+{
+ reset();
+}
+
+
+void TriangleSelector::reset()
+{
+ if (! m_orig_size_indices != 0) // unless this is run from constructor
+ garbage_collect();
+ m_vertices.clear();
+ m_triangles.clear();
+ for (const stl_vertex& vert : m_mesh->its.vertices)
+ m_vertices.emplace_back(vert);
+ for (const stl_triangle_vertex_indices& ind : m_mesh->its.indices)
+ push_triangle(ind[0], ind[1], ind[2]);
+ m_orig_size_vertices = m_vertices.size();
+ m_orig_size_indices = m_triangles.size();
+ m_invalid_triangles = 0;
+}
+
+
+
+
+
+void TriangleSelector::set_edge_limit(float edge_limit)
+{
+ float new_limit_sqr = std::pow(edge_limit, 2.f);
+
+ if (new_limit_sqr != m_edge_limit_sqr) {
+ m_edge_limit_sqr = new_limit_sqr;
+
+ // The way how triangles split may be different now, forget
+ // all cached splits.
+ garbage_collect();
+ }
+}
+
+
+
+void TriangleSelector::push_triangle(int a, int b, int c)
+{
+ for (int i : {a, b, c}) {
+ assert(i >= 0 && i < int(m_vertices.size()));
+ ++m_vertices[i].ref_cnt;
+ }
+ m_triangles.emplace_back(a, b, c);
+}
+
+
+void TriangleSelector::perform_split(int facet_idx, EnforcerBlockerType old_state)
+{
+ Triangle* tr = &m_triangles[facet_idx];
+
+ assert(tr->is_split());
+
+ // Read info about how to split this triangle.
+ int sides_to_split = tr->number_of_split_sides();
+
+ // indices of triangle vertices
+ std::vector<int> verts_idxs;
+ int idx = tr->special_side();
+ for (int j=0; j<3; ++j) {
+ verts_idxs.push_back(tr->verts_idxs[idx++]);
+ if (idx == 3)
+ idx = 0;
+ }
+
+ if (sides_to_split == 1) {
+ m_vertices.emplace_back((m_vertices[verts_idxs[1]].v + m_vertices[verts_idxs[2]].v)/2.);
+ verts_idxs.insert(verts_idxs.begin()+2, m_vertices.size() - 1);
+
+ push_triangle(verts_idxs[0], verts_idxs[1], verts_idxs[2]);
+ push_triangle(verts_idxs[2], verts_idxs[3], verts_idxs[0]);
+ }
+
+ if (sides_to_split == 2) {
+ m_vertices.emplace_back((m_vertices[verts_idxs[0]].v + m_vertices[verts_idxs[1]].v)/2.);
+ verts_idxs.insert(verts_idxs.begin()+1, m_vertices.size() - 1);
+
+ m_vertices.emplace_back((m_vertices[verts_idxs[0]].v + m_vertices[verts_idxs[3]].v)/2.);
+ verts_idxs.insert(verts_idxs.begin()+4, m_vertices.size() - 1);
+
+ push_triangle(verts_idxs[0], verts_idxs[1], verts_idxs[4]);
+ push_triangle(verts_idxs[1], verts_idxs[2], verts_idxs[4]);
+ push_triangle(verts_idxs[2], verts_idxs[3], verts_idxs[4]);
+ }
+
+ if (sides_to_split == 3) {
+ m_vertices.emplace_back((m_vertices[verts_idxs[0]].v + m_vertices[verts_idxs[1]].v)/2.);
+ verts_idxs.insert(verts_idxs.begin()+1, m_vertices.size() - 1);
+ m_vertices.emplace_back((m_vertices[verts_idxs[2]].v + m_vertices[verts_idxs[3]].v)/2.);
+ verts_idxs.insert(verts_idxs.begin()+3, m_vertices.size() - 1);
+ m_vertices.emplace_back((m_vertices[verts_idxs[4]].v + m_vertices[verts_idxs[0]].v)/2.);
+ verts_idxs.insert(verts_idxs.begin()+5, m_vertices.size() - 1);
+
+ push_triangle(verts_idxs[0], verts_idxs[1], verts_idxs[5]);
+ push_triangle(verts_idxs[1], verts_idxs[2], verts_idxs[3]);
+ push_triangle(verts_idxs[3], verts_idxs[4], verts_idxs[5]);
+ push_triangle(verts_idxs[1], verts_idxs[3], verts_idxs[5]);
+ }
+
+ tr = &m_triangles[facet_idx]; // may have been invalidated
+
+ // And save the children. All children should start in the same state as the triangle we just split.
+ assert(sides_to_split <= 3);
+ for (int i=0; i<=sides_to_split; ++i) {
+ tr->children[i] = m_triangles.size()-1-i;
+ m_triangles[tr->children[i]].set_state(old_state);
+ }
+}
+
+
+
+indexed_triangle_set TriangleSelector::get_facets(EnforcerBlockerType state) const
+{
+ indexed_triangle_set out;
+ for (const Triangle& tr : m_triangles) {
+ if (tr.valid && ! tr.is_split() && tr.get_state() == state) {
+ stl_triangle_vertex_indices indices;
+ for (int i=0; i<3; ++i) {
+ out.vertices.emplace_back(m_vertices[tr.verts_idxs[i]].v);
+ indices[i] = out.vertices.size() - 1;
+ }
+ out.indices.emplace_back(indices);
+ }
+ }
+ return out;
+}
+
+
+
+std::map<int, std::vector<bool>> TriangleSelector::serialize() const
+{
+ // Each original triangle of the mesh is assigned a number encoding its state
+ // or how it is split. Each triangle is encoded by 4 bits (xxyy):
+ // leaf triangle: xx = EnforcerBlockerType, yy = 0
+ // non-leaf: xx = special side, yy = number of split sides
+ // These are bitwise appended and formed into one 64-bit integer.
+
+ // The function returns a map from original triangle indices to
+ // stream of bits encoding state and offsprings.
+
+ std::map<int, std::vector<bool>> out;
+ for (int i=0; i<m_orig_size_indices; ++i) {
+ const Triangle& tr = m_triangles[i];
+
+ if (! tr.is_split() && tr.get_state() == EnforcerBlockerType::NONE)
+ continue; // no need to save anything, unsplit and unselected is default
+
+ std::vector<bool> data; // complete encoding of this mesh triangle
+ int stored_triangles = 0; // how many have been already encoded
+
+ std::function<void(int)> serialize_recursive;
+ serialize_recursive = [this, &serialize_recursive, &stored_triangles, &data](int facet_idx) {
+ const Triangle& tr = m_triangles[facet_idx];
+
+ // Always save number of split sides. It is zero for unsplit triangles.
+ int split_sides = tr.number_of_split_sides();
+ assert(split_sides >= 0 && split_sides <= 3);
+
+ //data |= (split_sides << (stored_triangles * 4));
+ data.push_back(split_sides & 0b01);
+ data.push_back(split_sides & 0b10);
+
+ if (tr.is_split()) {
+ // If this triangle is split, save which side is split (in case
+ // of one split) or kept (in case of two splits). The value will
+ // be ignored for 3-side split.
+ assert(split_sides > 0);
+ assert(tr.special_side() >= 0 && tr.special_side() <= 3);
+ data.push_back(tr.special_side() & 0b01);
+ data.push_back(tr.special_side() & 0b10);
+ ++stored_triangles;
+ // Now save all children.
+ for (int child_idx=0; child_idx<=split_sides; ++child_idx)
+ serialize_recursive(tr.children[child_idx]);
+ } else {
+ // In case this is leaf, we better save information about its state.
+ assert(int(tr.get_state()) <= 3);
+ data.push_back(int(tr.get_state()) & 0b01);
+ data.push_back(int(tr.get_state()) & 0b10);
+ ++stored_triangles;
+ }
+ };
+
+ serialize_recursive(i);
+ out[i] = data;
+ }
+
+ return out;
+}
+
+void TriangleSelector::deserialize(const std::map<int, std::vector<bool>> data)
+{
+ reset(); // dump any current state
+ for (const auto& [triangle_id, code] : data) {
+ assert(triangle_id < int(m_triangles.size()));
+ assert(! code.empty());
+ int processed_triangles = 0;
+ struct ProcessingInfo {
+ int facet_id = 0;
+ int processed_children = 0;
+ int total_children = 0;
+ };
+
+ // Vector to store all parents that have offsprings.
+ std::vector<ProcessingInfo> parents;
+
+ while (true) {
+ // Read next triangle info.
+ int next_code = 0;
+ for (int i=3; i>=0; --i) {
+ next_code = next_code << 1;
+ next_code |= int(code[4 * processed_triangles + i]);
+ }
+ ++processed_triangles;
+
+ int num_of_split_sides = (next_code & 0b11);
+ int num_of_children = num_of_split_sides != 0 ? num_of_split_sides + 1 : 0;
+ bool is_split = num_of_children != 0;
+ EnforcerBlockerType state = EnforcerBlockerType(next_code >> 2);
+ int special_side = (next_code >> 2);
+
+ // Take care of the first iteration separately, so handling of the others is simpler.
+ if (parents.empty()) {
+ if (! is_split) {
+ // root is not split. just set the state and that's it.
+ m_triangles[triangle_id].set_state(state);
+ break;
+ } else {
+ // root is split, add it into list of parents and split it.
+ // then go to the next.
+ parents.push_back({triangle_id, 0, num_of_children});
+ m_triangles[triangle_id].set_division(num_of_children-1, special_side);
+ perform_split(triangle_id, EnforcerBlockerType::NONE);
+ continue;
+ }
+ }
+
+ // This is not the first iteration. This triangle is a child of last seen parent.
+ assert(! parents.empty());
+ assert(parents.back().processed_children < parents.back().total_children);
+
+ if (is_split) {
+ // split the triangle and save it as parent of the next ones.
+ const ProcessingInfo& last = parents.back();
+ int this_idx = m_triangles[last.facet_id].children[last.processed_children];
+ m_triangles[this_idx].set_division(num_of_children-1, special_side);
+ perform_split(this_idx, EnforcerBlockerType::NONE);
+ parents.push_back({this_idx, 0, num_of_children});
+ } else {
+ // this triangle belongs to last split one
+ m_triangles[m_triangles[parents.back().facet_id].children[parents.back().processed_children]].set_state(state);
+ ++parents.back().processed_children;
+ }
+
+
+ // If all children of the past parent triangle are claimed, move to grandparent.
+ while (parents.back().processed_children == parents.back().total_children) {
+ parents.pop_back();
+
+ if (parents.empty())
+ break;
+
+ // And increment the grandparent children counter, because
+ // we have just finished that branch and got back here.
+ ++parents.back().processed_children;
+ }
+
+ // In case we popped back the root, we should be done.
+ if (parents.empty())
+ break;
+ }
+
+ }
+}
+
+
+TriangleSelector::Cursor::Cursor(
+ const Vec3f& center_, const Vec3f& source_, float radius_world,
+ CursorType type_, const Transform3d& trafo_)
+ : center{center_},
+ source{source_},
+ type{type_},
+ trafo{trafo_.cast<float>()}
+{
+ Vec3d sf = Geometry::Transformation(trafo_).get_scaling_factor();
+ if (is_approx(sf(0), sf(1)) && is_approx(sf(1), sf(2))) {
+ radius_sqr = std::pow(radius_world / sf(0), 2);
+ uniform_scaling = true;
+ }
+ else {
+ // In case that the transformation is non-uniform, all checks whether
+ // something is inside the cursor should be done in world coords.
+ // First transform center, source and dir in world coords and remember
+ // that we did this.
+ center = trafo * center;
+ source = trafo * source;
+ uniform_scaling = false;
+ radius_sqr = radius_world * radius_world;
+ trafo_normal = trafo.linear().inverse().transpose();
+ }
+
+ // Calculate dir, in whatever coords is appropriate.
+ dir = (center - source).normalized();
+}
+
+
+// Is a point (in mesh coords) inside a cursor?
+bool TriangleSelector::Cursor::is_mesh_point_inside(Vec3f point) const
+{
+ if (! uniform_scaling)
+ point = trafo * point;
+
+ Vec3f diff = center - point;
+
+ if (type == CIRCLE)
+ return (diff - diff.dot(dir) * dir).squaredNorm() < radius_sqr;
+ else // SPHERE
+ return diff.squaredNorm() < radius_sqr;
+}
+
+
+
+// p1, p2, p3 are in mesh coords!
+bool TriangleSelector::Cursor::is_pointer_in_triangle(const Vec3f& p1_,
+ const Vec3f& p2_,
+ const Vec3f& p3_) const
+{
+ const Vec3f& q1 = center + dir;
+ const Vec3f& q2 = center - dir;
+
+ auto signed_volume_sign = [](const Vec3f& a, const Vec3f& b,
+ const Vec3f& c, const Vec3f& d) -> bool {
+ return ((b-a).cross(c-a)).dot(d-a) > 0.;
+ };
+
+ // In case the object is non-uniformly scaled, do the check in world coords.
+ const Vec3f& p1 = uniform_scaling ? p1_ : Vec3f(trafo * p1_);
+ const Vec3f& p2 = uniform_scaling ? p2_ : Vec3f(trafo * p2_);
+ const Vec3f& p3 = uniform_scaling ? p3_ : Vec3f(trafo * p3_);
+
+ if (signed_volume_sign(q1,p1,p2,p3) != signed_volume_sign(q2,p1,p2,p3)) {
+ bool pos = signed_volume_sign(q1,q2,p1,p2);
+ if (signed_volume_sign(q1,q2,p2,p3) == pos && signed_volume_sign(q1,q2,p3,p1) == pos)
+ return true;
+ }
+ return false;
+}
+
+
+
+
+} // namespace Slic3r
diff --git a/src/libslic3r/TriangleSelector.hpp b/src/libslic3r/TriangleSelector.hpp
new file mode 100644
index 000000000..11387c766
--- /dev/null
+++ b/src/libslic3r/TriangleSelector.hpp
@@ -0,0 +1,170 @@
+#ifndef libslic3r_TriangleSelector_hpp_
+#define libslic3r_TriangleSelector_hpp_
+
+// #define PRUSASLICER_TRIANGLE_SELECTOR_DEBUG
+
+
+#include "Point.hpp"
+#include "TriangleMesh.hpp"
+
+namespace Slic3r {
+
+enum class EnforcerBlockerType : int8_t;
+
+
+
+// Following class holds information about selected triangles. It also has power
+// to recursively subdivide the triangles and make the selection finer.
+class TriangleSelector {
+public:
+ enum CursorType {
+ CIRCLE,
+ SPHERE
+ };
+
+ void set_edge_limit(float edge_limit);
+
+ // Create new object on a TriangleMesh. The referenced mesh must
+ // stay valid, a ptr to it is saved and used.
+ explicit TriangleSelector(const TriangleMesh& mesh);
+
+ // Select all triangles fully inside the circle, subdivide where needed.
+ void select_patch(const Vec3f& hit, // point where to start
+ int facet_start, // facet that point belongs to
+ const Vec3f& source, // camera position (mesh coords)
+ float radius, // radius of the cursor
+ CursorType type, // current type of cursor
+ EnforcerBlockerType new_state, // enforcer or blocker?
+ const Transform3d& trafo); // matrix to get from mesh to world
+
+ // Get facets currently in the given state.
+ indexed_triangle_set get_facets(EnforcerBlockerType state) const;
+
+ // Set facet of the mesh to a given state. Only works for original triangles.
+ void set_facet(int facet_idx, EnforcerBlockerType state);
+
+ // Clear everything and make the tree empty.
+ void reset();
+
+ // Remove all unnecessary data.
+ void garbage_collect();
+
+ // Store the division trees in compact form (a long stream of
+ // bits for each triangle of the original mesh).
+ std::map<int, std::vector<bool>> serialize() const;
+
+ // Load serialized data. Assumes that correct mesh is loaded.
+ void deserialize(const std::map<int, std::vector<bool>> data);
+
+
+protected:
+ // Triangle and info about how it's split.
+ class Triangle {
+ public:
+ // Use TriangleSelector::push_triangle to create a new triangle.
+ // It increments/decrements reference counter on vertices.
+ Triangle(int a, int b, int c)
+ : verts_idxs{a, b, c},
+ state{EnforcerBlockerType(0)},
+ number_of_splits{0},
+ special_side_idx{0},
+ old_number_of_splits{0}
+ {}
+ // Indices into m_vertices.
+ std::array<int, 3> verts_idxs;
+
+ // Is this triangle valid or marked to be removed?
+ bool valid{true};
+
+ // Children triangles.
+ std::array<int, 4> children;
+
+ // Set the division type.
+ void set_division(int sides_to_split, int special_side_idx = -1);
+
+ // Get/set current state.
+ void set_state(EnforcerBlockerType type) { assert(! is_split()); state = type; }
+ EnforcerBlockerType get_state() const { assert(! is_split()); return state; }
+
+ // Get info on how it's split.
+ bool is_split() const { return number_of_split_sides() != 0; }
+ int number_of_split_sides() const { return number_of_splits; }
+ int special_side() const { assert(is_split()); return special_side_idx; }
+ bool was_split_before() const { return old_number_of_splits != 0; }
+ void forget_history() { old_number_of_splits = 0; }
+
+ private:
+ int number_of_splits;
+ int special_side_idx;
+ EnforcerBlockerType state;
+
+ // How many children were spawned during last split?
+ // Is not reset on remerging the triangle.
+ int old_number_of_splits;
+ };
+
+ struct Vertex {
+ explicit Vertex(const stl_vertex& vert)
+ : v{vert},
+ ref_cnt{0}
+ {}
+ stl_vertex v;
+ int ref_cnt;
+ };
+
+ // Lists of vertices and triangles, both original and new
+ std::vector<Vertex> m_vertices;
+ std::vector<Triangle> m_triangles;
+ const TriangleMesh* m_mesh;
+
+ // Number of invalid triangles (to trigger garbage collection).
+ int m_invalid_triangles;
+
+ // Limiting length of triangle side (squared).
+ float m_edge_limit_sqr = 1.f;
+
+ // Number of original vertices and triangles.
+ int m_orig_size_vertices = 0;
+ int m_orig_size_indices = 0;
+
+ // Cache for cursor position, radius and direction.
+ struct Cursor {
+ Cursor() = default;
+ Cursor(const Vec3f& center_, const Vec3f& source_, float radius_world,
+ CursorType type_, const Transform3d& trafo_);
+ bool is_mesh_point_inside(Vec3f pt) const;
+ bool is_pointer_in_triangle(const Vec3f& p1, const Vec3f& p2, const Vec3f& p3) const;
+
+ Vec3f center;
+ Vec3f source;
+ Vec3f dir;
+ float radius_sqr;
+ CursorType type;
+ Transform3f trafo;
+ Transform3f trafo_normal;
+ bool uniform_scaling;
+ };
+
+ Cursor m_cursor;
+ float m_old_cursor_radius_sqr;
+
+ // Private functions:
+ bool select_triangle(int facet_idx, EnforcerBlockerType type,
+ bool recursive_call = false);
+ int vertices_inside(int facet_idx) const;
+ bool faces_camera(int facet) const;
+ void undivide_triangle(int facet_idx);
+ void split_triangle(int facet_idx);
+ void remove_useless_children(int facet_idx); // No hidden meaning. Triangles are meant.
+ bool is_pointer_in_triangle(int facet_idx) const;
+ bool is_edge_inside_cursor(int facet_idx) const;
+ void push_triangle(int a, int b, int c);
+ void perform_split(int facet_idx, EnforcerBlockerType old_state);
+};
+
+
+
+
+} // namespace Slic3r
+
+#endif // libslic3r_TriangleSelector_hpp_
diff --git a/src/libslic3r/TriangulateWall.cpp b/src/libslic3r/TriangulateWall.cpp
new file mode 100644
index 000000000..ec2945b10
--- /dev/null
+++ b/src/libslic3r/TriangulateWall.cpp
@@ -0,0 +1,133 @@
+#include "TriangulateWall.hpp"
+#include "MTUtils.hpp"
+
+namespace Slic3r {
+
+class Ring {
+ size_t idx = 0, nextidx = 1, startidx = 0, begin = 0, end = 0;
+
+public:
+ explicit Ring(size_t from, size_t to) : begin(from), end(to) { init(begin); }
+
+ size_t size() const { return end - begin; }
+ std::pair<size_t, size_t> pos() const { return {idx, nextidx}; }
+ bool is_lower() const { return idx < size(); }
+
+ void inc()
+ {
+ if (nextidx != startidx) nextidx++;
+ if (nextidx == end) nextidx = begin;
+ idx ++;
+ if (idx == end) idx = begin;
+ }
+
+ void init(size_t pos)
+ {
+ startidx = begin + (pos - begin) % size();
+ idx = startidx;
+ nextidx = begin + (idx + 1 - begin) % size();
+ }
+
+ bool is_finished() const { return nextidx == idx; }
+};
+
+static double sq_dst(const Vec3d &v1, const Vec3d& v2)
+{
+ Vec3d v = v1 - v2;
+ return v.x() * v.x() + v.y() * v.y() /*+ v.z() * v.z()*/;
+}
+
+static double score(const Ring& onring, const Ring &offring,
+ const std::vector<Vec3d> &pts)
+{
+ double a = sq_dst(pts[onring.pos().first], pts[offring.pos().first]);
+ double b = sq_dst(pts[onring.pos().second], pts[offring.pos().first]);
+ return (std::abs(a) + std::abs(b)) / 2.;
+}
+
+class Triangulator {
+ const std::vector<Vec3d> *pts;
+ Ring *onring, *offring;
+
+ double calc_score() const
+ {
+ return Slic3r::score(*onring, *offring, *pts);
+ }
+
+ void synchronize_rings()
+ {
+ Ring lring = *offring;
+ auto minsc = Slic3r::score(*onring, lring, *pts);
+ size_t imin = lring.pos().first;
+
+ lring.inc();
+
+ while(!lring.is_finished()) {
+ double score = Slic3r::score(*onring, lring, *pts);
+ if (score < minsc) { minsc = score; imin = lring.pos().first; }
+ lring.inc();
+ }
+
+ offring->init(imin);
+ }
+
+ void emplace_indices(std::vector<Vec3i> &indices)
+ {
+ Vec3i tr{int(onring->pos().first), int(onring->pos().second),
+ int(offring->pos().first)};
+ if (onring->is_lower()) std::swap(tr(0), tr(1));
+ indices.emplace_back(tr);
+ }
+
+public:
+ void run(std::vector<Vec3i> &indices)
+ {
+ synchronize_rings();
+
+ double score = 0, prev_score = 0;
+ while (!onring->is_finished() || !offring->is_finished()) {
+ prev_score = score;
+ if (onring->is_finished() || (score = calc_score()) > prev_score) {
+ std::swap(onring, offring);
+ } else {
+ emplace_indices(indices);
+ onring->inc();
+ }
+ }
+ }
+
+ explicit Triangulator(const std::vector<Vec3d> *points,
+ Ring & lower,
+ Ring & upper)
+ : pts{points}, onring{&upper}, offring{&lower}
+ {}
+};
+
+Wall triangulate_wall(
+ const Polygon & lower,
+ const Polygon & upper,
+ double lower_z_mm,
+ double upper_z_mm)
+{
+ if (upper.points.size() < 3 || lower.points.size() < 3) return {};
+
+ Wall wall;
+ auto &pts = wall.first;
+ auto &ind = wall.second;
+
+ pts.reserve(lower.points.size() + upper.points.size());
+ for (auto &p : lower.points)
+ wall.first.emplace_back(unscaled(p.x()), unscaled(p.y()), lower_z_mm);
+ for (auto &p : upper.points)
+ wall.first.emplace_back(unscaled(p.x()), unscaled(p.y()), upper_z_mm);
+
+ ind.reserve(2 * (lower.size() + upper.size()));
+
+ Ring lring{0, lower.points.size()}, uring{lower.points.size(), pts.size()};
+ Triangulator t{&pts, lring, uring};
+ t.run(ind);
+
+ return wall;
+}
+
+} // namespace Slic3r
diff --git a/src/libslic3r/TriangulateWall.hpp b/src/libslic3r/TriangulateWall.hpp
new file mode 100644
index 000000000..68bf4b0ac
--- /dev/null
+++ b/src/libslic3r/TriangulateWall.hpp
@@ -0,0 +1,17 @@
+#ifndef TRIANGULATEWALL_HPP
+#define TRIANGULATEWALL_HPP
+
+#include "libslic3r/Polygon.hpp"
+
+namespace Slic3r {
+
+using Wall = std::pair<std::vector<Vec3d>, std::vector<Vec3i>>;
+
+Wall triangulate_wall(
+ const Polygon & lower,
+ const Polygon & upper,
+ double lower_z_mm,
+ double upper_z_mm);
+}
+
+#endif // TRIANGULATEWALL_HPP
diff --git a/src/libslic3r/Utils.hpp b/src/libslic3r/Utils.hpp
index 5cdf75037..0979d7f76 100644
--- a/src/libslic3r/Utils.hpp
+++ b/src/libslic3r/Utils.hpp
@@ -7,6 +7,8 @@
#include <type_traits>
#include <system_error>
+#include <boost/system/error_code.hpp>
+
#include "libslic3r.h"
namespace boost { namespace filesystem { class directory_entry; }}
@@ -73,11 +75,12 @@ enum CopyFileResult {
FAIL_CHECK_TARGET_NOT_OPENED
};
// Copy a file, adjust the access attributes, so that the target is writable.
-CopyFileResult copy_file_inner(const std::string &from, const std::string &to);
+CopyFileResult copy_file_inner(const std::string &from, const std::string &to, std::string& error_message);
// Copy file to a temp file first, then rename it to the final file name.
// If with_check is true, then the content of the copied file is compared to the content
// of the source file before renaming.
-extern CopyFileResult copy_file(const std::string &from, const std::string &to, const bool with_check = false);
+// Additional error info is passed in error message.
+extern CopyFileResult copy_file(const std::string &from, const std::string &to, std::string& error_message, const bool with_check = false);
// Compares two files if identical.
extern CopyFileResult check_copy(const std::string& origin, const std::string& copy);
@@ -87,6 +90,7 @@ extern CopyFileResult check_copy(const std::string& origin, const std::string& c
extern bool is_plain_file(const boost::filesystem::directory_entry &path);
extern bool is_ini_file(const boost::filesystem::directory_entry &path);
extern bool is_idx_file(const boost::filesystem::directory_entry &path);
+extern bool is_gcode_file(const std::string &path);
// File path / name / extension splitting utilities, working with UTF-8,
// to be published to Perl.
@@ -107,23 +111,13 @@ std::string string_printf(const char *format, ...);
// to be placed at the top of Slic3r generated files.
std::string header_slic3r_generated();
+// Standard "generated by PrusaGCodeViewer version xxx timestamp xxx" header string,
+// to be placed at the top of Slic3r generated files.
+std::string header_gcodeviewer_generated();
+
// getpid platform wrapper
extern unsigned get_current_pid();
-template <typename Real>
-Real round_nearest(Real value, unsigned int decimals)
-{
- Real res = (Real)0;
- if (decimals == 0)
- res = ::round(value);
- else
- {
- Real power = ::pow((Real)10, (int)decimals);
- res = ::round(value * power + (Real)0.5) / power;
- }
- return res;
-}
-
// Compute the next highest power of 2 of 32-bit v
// http://graphics.stanford.edu/~seander/bithacks.html
inline uint16_t next_highest_power_of_2(uint16_t v)
@@ -337,12 +331,35 @@ inline std::string get_time_dhms(float time_in_secs)
return buffer;
}
+inline std::string get_time_dhm(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);
+
+ char buffer[64];
+ if (days > 0)
+ ::sprintf(buffer, "%dd %dh %dm", days, hours, minutes);
+ else if (hours > 0)
+ ::sprintf(buffer, "%dh %dm", hours, minutes);
+ else if (minutes > 0)
+ ::sprintf(buffer, "%dm", minutes);
+
+ return buffer;
+}
+
} // namespace Slic3r
#if WIN32
#define SLIC3R_STDVEC_MEMSIZE(NAME, TYPE) NAME.capacity() * ((sizeof(TYPE) + __alignof(TYPE) - 1) / __alignof(TYPE)) * __alignof(TYPE)
+ //FIXME this is an inprecise hack. Add the hash table size and possibly some estimate of the linked list at each of the used bin.
+ #define SLIC3R_STDUNORDEREDSET_MEMSIZE(NAME, TYPE) NAME.size() * ((sizeof(TYPE) + __alignof(TYPE) - 1) / __alignof(TYPE)) * __alignof(TYPE)
#else
#define SLIC3R_STDVEC_MEMSIZE(NAME, TYPE) NAME.capacity() * ((sizeof(TYPE) + alignof(TYPE) - 1) / alignof(TYPE)) * alignof(TYPE)
+ //FIXME this is an inprecise hack. Add the hash table size and possibly some estimate of the linked list at each of the used bin.
+ #define SLIC3R_STDUNORDEREDSET_MEMSIZE(NAME, TYPE) NAME.size() * ((sizeof(TYPE) + alignof(TYPE) - 1) / alignof(TYPE)) * alignof(TYPE)
#endif
#endif // slic3r_Utils_hpp_
diff --git a/src/libslic3r/VoronoiOffset.cpp b/src/libslic3r/VoronoiOffset.cpp
new file mode 100644
index 000000000..c0541bd9f
--- /dev/null
+++ b/src/libslic3r/VoronoiOffset.cpp
@@ -0,0 +1,855 @@
+// Polygon offsetting using Voronoi diagram prodiced by boost::polygon.
+
+#include "VoronoiOffset.hpp"
+
+#include <cmath>
+
+// #define VORONOI_DEBUG_OUT
+
+#ifdef VORONOI_DEBUG_OUT
+#include <libslic3r/VoronoiVisualUtils.hpp>
+#endif
+
+namespace Slic3r {
+
+using VD = Geometry::VoronoiDiagram;
+
+namespace detail {
+ // Intersect a circle with a ray, return the two parameters.
+ // Currently used for unbounded Voronoi edges only.
+ double first_circle_segment_intersection_parameter(
+ const Vec2d &center, const double r, const Vec2d &pt, const Vec2d &v)
+ {
+ const Vec2d d = pt - center;
+#ifndef NDEBUG
+ double d0 = (pt - center).norm();
+ double d1 = (pt + v - center).norm();
+ assert(r < std::max(d0, d1) + EPSILON);
+#endif /* NDEBUG */
+ const double a = v.squaredNorm();
+ const double b = 2. * d.dot(v);
+ const double c = d.squaredNorm() - r * r;
+ std::pair<int, std::array<double, 2>> out;
+ double u = b * b - 4. * a * c;
+ assert(u > - EPSILON);
+ double t;
+ if (u <= 0) {
+ // Degenerate to a single closest point.
+ t = - b / (2. * a);
+ assert(t >= - EPSILON && t <= 1. + EPSILON);
+ return Slic3r::clamp(0., 1., t);
+ } else {
+ u = sqrt(u);
+ out.first = 2;
+ double t0 = (- b - u) / (2. * a);
+ double t1 = (- b + u) / (2. * a);
+ // One of the intersections shall be found inside the segment.
+ assert((t0 >= - EPSILON && t0 <= 1. + EPSILON) || (t1 >= - EPSILON && t1 <= 1. + EPSILON));
+ if (t1 < 0.)
+ return 0.;
+ if (t0 > 1.)
+ return 1.;
+ return (t0 > 0.) ? t0 : t1;
+ }
+ }
+
+ struct Intersections
+ {
+ int count;
+ Vec2d pts[2];
+ };
+
+ // Return maximum two points, that are at distance "d" from both points
+ Intersections point_point_equal_distance_points(const Point &pt1, const Point &pt2, const double d)
+ {
+ // Calculate the two intersection points.
+ // With the help of Python package sympy:
+ // res = solve([(x - cx)**2 + (y - cy)**2 - d**2, x**2 + y**2 - d**2], [x, y])
+ // ccode(cse((res[0][0], res[0][1], res[1][0], res[1][1])))
+ // where cx, cy is the center of pt1 relative to pt2,
+ // d is distance from the line and the point (0, 0).
+ // The result is then shifted to pt2.
+ auto cx = double(pt1.x() - pt2.x());
+ auto cy = double(pt1.y() - pt2.y());
+ double cl = cx * cx + cy * cy;
+ double discr = 4. * d * d - cl;
+ if (discr < 0.) {
+ // No intersection point found, the two circles are too far away.
+ return Intersections { 0, { Vec2d(), Vec2d() } };
+ }
+ // Avoid division by zero if a gets too small.
+ bool xy_swapped = std::abs(cx) < std::abs(cy);
+ if (xy_swapped)
+ std::swap(cx, cy);
+ double u;
+ int cnt;
+ if (discr == 0.) {
+ cnt = 1;
+ u = 0;
+ } else {
+ cnt = 2;
+ u = 0.5 * cx * sqrt(cl * discr) / cl;
+ }
+ double v = 0.5 * cy - u;
+ double w = 2. * cy;
+ double e = 0.5 / cx;
+ double f = 0.5 * cy + u;
+ Intersections out { cnt, { Vec2d(-e * (v * w - cl), v),
+ Vec2d(-e * (w * f - cl), f) } };
+ if (xy_swapped) {
+ std::swap(out.pts[0].x(), out.pts[0].y());
+ std::swap(out.pts[1].x(), out.pts[1].y());
+ }
+ out.pts[0] += pt2.cast<double>();
+ out.pts[1] += pt2.cast<double>();
+
+ assert(std::abs((out.pts[0] - pt1.cast<double>()).norm() - d) < SCALED_EPSILON);
+ assert(std::abs((out.pts[1] - pt1.cast<double>()).norm() - d) < SCALED_EPSILON);
+ assert(std::abs((out.pts[0] - pt2.cast<double>()).norm() - d) < SCALED_EPSILON);
+ assert(std::abs((out.pts[1] - pt2.cast<double>()).norm() - d) < SCALED_EPSILON);
+ return out;
+ }
+
+ // Return maximum two points, that are at distance "d" from both the line and point.
+ Intersections line_point_equal_distance_points(const Line &line, const Point &ipt, const double d)
+ {
+ assert(line.a != ipt && line.b != ipt);
+ // Calculating two points of distance "d" to a ray and a point.
+ // Point.
+ Vec2d pt = ipt.cast<double>();
+ Vec2d lv = (line.b - line.a).cast<double>();
+ double l2 = lv.squaredNorm();
+ Vec2d lpv = (line.a - ipt).cast<double>();
+ double c = cross2(lpv, lv);
+ if (c < 0) {
+ lv = - lv;
+ c = - c;
+ }
+
+ // Line equation (ax + by + c - d * sqrt(l2)).
+ auto a = - lv.y();
+ auto b = lv.x();
+ // Line point shifted by -ipt is on the line.
+ assert(std::abs(lpv.x() * a + lpv.y() * b + c) < SCALED_EPSILON);
+ // Line vector (a, b) points towards ipt.
+ assert(a * lpv.x() + b * lpv.y() < - SCALED_EPSILON);
+
+#ifndef NDEBUG
+ {
+ // Foot point of ipt on line.
+ Vec2d ft = Geometry::foot_pt(line, ipt);
+ // Center point between ipt and line, its distance to both line and ipt is equal.
+ Vec2d centerpt = 0.5 * (ft + pt) - pt;
+ double dcenter = 0.5 * (ft - pt).norm();
+ // Verify that the center point
+ assert(std::abs(centerpt.x() * a + centerpt.y() * b + c - dcenter * sqrt(l2)) < SCALED_EPSILON * sqrt(l2));
+ }
+#endif // NDEBUG
+
+ // Calculate the two intersection points.
+ // With the help of Python package sympy:
+ // res = solve([a * x + b * y + c - d * sqrt(a**2 + b**2), x**2 + y**2 - d**2], [x, y])
+ // ccode(cse((res[0][0], res[0][1], res[1][0], res[1][1])))
+ // where (a, b, c, d) is the line equation, not normalized (vector a,b is not normalized),
+ // d is distance from the line and the point (0, 0).
+ // The result is then shifted to ipt.
+
+ double dscaled = d * sqrt(l2);
+ double s = c * (2. * dscaled - c);
+ if (s < 0.)
+ // Distance of pt from line is bigger than 2 * d.
+ return Intersections { 0 };
+ double u;
+ int cnt;
+ // Avoid division by zero if a gets too small.
+ bool xy_swapped = std::abs(a) < std::abs(b);
+ if (xy_swapped)
+ std::swap(a, b);
+ if (s == 0.) {
+ // Distance of pt from line is 2 * d.
+ cnt = 1;
+ u = 0.;
+ } else {
+ // Distance of pt from line is smaller than 2 * d.
+ cnt = 2;
+ u = a * sqrt(s) / l2;
+ }
+ double e = dscaled - c;
+ double f = b * e / l2;
+ double g = f - u;
+ double h = f + u;
+ Intersections out { cnt, { Vec2d((- b * g + e) / a, g),
+ Vec2d((- b * h + e) / a, h) } };
+ if (xy_swapped) {
+ std::swap(out.pts[0].x(), out.pts[0].y());
+ std::swap(out.pts[1].x(), out.pts[1].y());
+ }
+ out.pts[0] += pt;
+ out.pts[1] += pt;
+
+ assert(std::abs(Geometry::ray_point_distance<Vec2d>(line.a.cast<double>(), (line.b - line.a).cast<double>(), out.pts[0]) - d) < SCALED_EPSILON);
+ assert(std::abs(Geometry::ray_point_distance<Vec2d>(line.a.cast<double>(), (line.b - line.a).cast<double>(), out.pts[1]) - d) < SCALED_EPSILON);
+ assert(std::abs((out.pts[0] - ipt.cast<double>()).norm() - d) < SCALED_EPSILON);
+ assert(std::abs((out.pts[1] - ipt.cast<double>()).norm() - d) < SCALED_EPSILON);
+ return out;
+ }
+
+} // namespace detail
+
+Polygons voronoi_offset(
+ const Geometry::VoronoiDiagram &vd,
+ const Lines &lines,
+ double offset_distance,
+ double discretization_error)
+{
+#ifndef NDEBUG
+ // Verify that twin halfedges are stored next to the other in vd.
+ for (size_t i = 0; i < vd.num_edges(); i += 2) {
+ const VD::edge_type &e = vd.edges()[i];
+ const VD::edge_type &e2 = vd.edges()[i + 1];
+ assert(e.twin() == &e2);
+ assert(e2.twin() == &e);
+ assert(e.is_secondary() == e2.is_secondary());
+ if (e.is_secondary()) {
+ assert(e.cell()->contains_point() != e2.cell()->contains_point());
+ const VD::edge_type &ex = (e.cell()->contains_point() ? e : e2);
+ // Verify that the Point defining the cell left of ex is an end point of a segment
+ // defining the cell right of ex.
+ const Line &line0 = lines[ex.cell()->source_index()];
+ const Line &line1 = lines[ex.twin()->cell()->source_index()];
+ const Point &pt = (ex.cell()->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b;
+ assert(pt == line1.a || pt == line1.b);
+ }
+ }
+#endif // NDEBUG
+
+ enum class EdgeState : unsigned char {
+ // Initial state, don't know.
+ Unknown,
+ // This edge will certainly not be intersected by the offset curve.
+ Inactive,
+ // This edge will certainly be intersected by the offset curve.
+ Active,
+ // This edge will possibly be intersected by the offset curve.
+ Possible
+ };
+
+ enum class CellState : unsigned char {
+ // Initial state, don't know.
+ Unknown,
+ // Inactive cell is inside for outside curves and outside for inside curves.
+ Inactive,
+ // Active cell is outside for outside curves and inside for inside curves.
+ Active,
+ // Boundary cell is intersected by the input segment, part of it is active.
+ Boundary
+ };
+
+ // Mark edges with outward vertex pointing outside the polygons, thus there is a chance
+ // that such an edge will have an intersection with our desired offset curve.
+ bool outside = offset_distance > 0.;
+ std::vector<EdgeState> edge_state(vd.num_edges(), EdgeState::Unknown);
+ std::vector<CellState> cell_state(vd.num_cells(), CellState::Unknown);
+ const VD::edge_type *front_edge = &vd.edges().front();
+ const VD::cell_type *front_cell = &vd.cells().front();
+ auto set_edge_state_initial = [&edge_state, front_edge](const VD::edge_type *edge, EdgeState new_edge_type) {
+ EdgeState &edge_type = edge_state[edge - front_edge];
+ assert(edge_type == EdgeState::Unknown || edge_type == new_edge_type);
+ assert(new_edge_type == EdgeState::Possible || new_edge_type == EdgeState::Inactive);
+ edge_type = new_edge_type;
+ };
+ auto set_edge_state_final = [&edge_state, front_edge](const size_t edge_id, EdgeState new_edge_type) {
+ EdgeState &edge_type = edge_state[edge_id];
+ assert(edge_type == EdgeState::Possible || edge_type == new_edge_type);
+ assert(new_edge_type == EdgeState::Active || new_edge_type == EdgeState::Inactive);
+ edge_type = new_edge_type;
+ };
+ auto set_cell_state = [&cell_state, front_cell](const VD::cell_type *cell, CellState new_cell_type) -> bool {
+ CellState &cell_type = cell_state[cell - front_cell];
+ assert(cell_type == CellState::Active || cell_type == CellState::Inactive || cell_type == CellState::Boundary || cell_type == CellState::Unknown);
+ assert(new_cell_type == CellState::Active || new_cell_type == CellState::Inactive || new_cell_type == CellState::Boundary);
+ switch (cell_type) {
+ case CellState::Unknown:
+ break;
+ case CellState::Active:
+ if (new_cell_type == CellState::Inactive)
+ new_cell_type = CellState::Boundary;
+ break;
+ case CellState::Inactive:
+ if (new_cell_type == CellState::Active)
+ new_cell_type = CellState::Boundary;
+ break;
+ case CellState::Boundary:
+ return false;
+ }
+ if (cell_type != new_cell_type) {
+ cell_type = new_cell_type;
+ return true;
+ }
+ return false;
+ };
+
+ for (const VD::edge_type &edge : vd.edges())
+ if (edge.vertex1() == nullptr) {
+ // Infinite Voronoi edge separating two Point sites or a Point site and a Segment site.
+ // Infinite edge is always outside and it has at least one valid vertex.
+ assert(edge.vertex0() != nullptr);
+ set_edge_state_initial(&edge, outside ? EdgeState::Possible : EdgeState::Inactive);
+ // Opposite edge of an infinite edge is certainly not active.
+ set_edge_state_initial(edge.twin(), EdgeState::Inactive);
+ if (edge.is_secondary()) {
+ // edge.vertex0() must lie on source contour.
+ const VD::cell_type *cell = edge.cell();
+ const VD::cell_type *cell2 = edge.twin()->cell();
+ if (cell->contains_segment())
+ std::swap(cell, cell2);
+ // State of a cell containing a boundary point is known.
+ assert(cell->contains_point());
+ set_cell_state(cell, outside ? CellState::Active : CellState::Inactive);
+ // State of a cell containing a boundary edge is Boundary.
+ assert(cell2->contains_segment());
+ set_cell_state(cell2, CellState::Boundary);
+ }
+ } else if (edge.vertex0() != nullptr) {
+ // Finite edge.
+ const VD::cell_type *cell = edge.cell();
+ const Line *line = cell->contains_segment() ? &lines[cell->source_index()] : nullptr;
+ if (line == nullptr) {
+ cell = edge.twin()->cell();
+ line = cell->contains_segment() ? &lines[cell->source_index()] : nullptr;
+ }
+ if (line) {
+ const VD::vertex_type *v1 = edge.vertex1();
+ const VD::cell_type *cell2 = (cell == edge.cell()) ? edge.twin()->cell() : edge.cell();
+ assert(v1);
+ const Point *pt_on_contour = nullptr;
+ if (cell == edge.cell() && edge.twin()->cell()->contains_segment()) {
+ // Constrained bisector of two segments.
+ // If the two segments share a point, then one end of the current Voronoi edge shares this point as well.
+ // Find pt_on_contour if it exists.
+ const Line &line2 = lines[cell2->source_index()];
+ if (line->a == line2.b)
+ pt_on_contour = &line->a;
+ else if (line->b == line2.a)
+ pt_on_contour = &line->b;
+ } else if (edge.is_secondary()) {
+ assert(edge.is_linear());
+ // One end of the current Voronoi edge shares a point of a contour.
+ assert(edge.cell()->contains_point() != edge.twin()->cell()->contains_point());
+ const Line &line2 = lines[cell2->source_index()];
+ pt_on_contour = &((cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line2.a : line2.b);
+ }
+ if (pt_on_contour) {
+ // One end of the current Voronoi edge shares a point of a contour.
+ // Find out which one it is.
+ const VD::vertex_type *v0 = edge.vertex0();
+ Vec2d vec0(v0->x() - pt_on_contour->x(), v0->y() - pt_on_contour->y());
+ Vec2d vec1(v1->x() - pt_on_contour->x(), v1->y() - pt_on_contour->y());
+ double d0 = vec0.squaredNorm();
+ double d1 = vec1.squaredNorm();
+ assert(std::min(d0, d1) < SCALED_EPSILON * SCALED_EPSILON);
+ if (d0 < d1) {
+ // v0 is equal to pt.
+ } else {
+ // Skip secondary edge pointing to a contour point.
+ set_edge_state_initial(&edge, EdgeState::Inactive);
+ continue;
+ }
+ }
+ Vec2d l0(line->a.cast<double>());
+ Vec2d lv((line->b - line->a).cast<double>());
+ double side = cross2(lv, Vec2d(v1->x(), v1->y()) - l0);
+ bool edge_active = outside ? (side < 0.) : (side > 0.);
+ set_edge_state_initial(&edge, edge_active ? EdgeState::Possible : EdgeState::Inactive);
+ assert(cell->contains_segment());
+ set_cell_state(cell,
+ pt_on_contour ? CellState::Boundary :
+ edge_active ? CellState::Active : CellState::Inactive);
+ set_cell_state(cell2,
+ (pt_on_contour && cell2->contains_segment()) ?
+ CellState::Boundary :
+ edge_active ? CellState::Active : CellState::Inactive);
+ }
+ }
+ {
+ // Perform one round of expansion marking Voronoi edges and cells next to boundary cells as active / inactive.
+ std::vector<const VD::cell_type*> cell_queue;
+ for (const VD::edge_type &edge : vd.edges())
+ if (edge_state[&edge - front_edge] == EdgeState::Unknown) {
+ assert(edge.cell()->contains_point() && edge.twin()->cell()->contains_point());
+ // Edge separating two point sources, not yet classified as inside / outside.
+ CellState cs = cell_state[edge.cell() - front_cell];
+ CellState cs2 = cell_state[edge.twin()->cell() - front_cell];
+ if (cs != CellState::Unknown || cs2 != CellState::Unknown) {
+ if (cs == CellState::Unknown) {
+ cs = cs2;
+ if (set_cell_state(edge.cell(), cs))
+ cell_queue.emplace_back(edge.cell());
+ } else if (set_cell_state(edge.twin()->cell(), cs))
+ cell_queue.emplace_back(edge.twin()->cell());
+ EdgeState es = (cs == CellState::Active) ? EdgeState::Possible : EdgeState::Inactive;
+ set_edge_state_initial(&edge, es);
+ set_edge_state_initial(edge.twin(), es);
+ } else {
+ const VD::edge_type *e = edge.twin()->rot_prev();
+ do {
+ EdgeState es = edge_state[e->twin() - front_edge];
+ if (es != EdgeState::Unknown) {
+ assert(es == EdgeState::Possible || es == EdgeState::Inactive);
+ set_edge_state_initial(&edge, es);
+ CellState cs = (es == EdgeState::Possible) ? CellState::Active : CellState::Inactive;
+ if (set_cell_state(edge.cell(), cs))
+ cell_queue.emplace_back(edge.cell());
+ if (set_cell_state(edge.twin()->cell(), cs))
+ cell_queue.emplace_back(edge.twin()->cell());
+ break;
+ }
+ e = e->rot_prev();
+ } while (e != edge.twin());
+ }
+ }
+ // Do a final seed fill over Voronoi cells and unmarked Voronoi edges.
+ while (! cell_queue.empty()) {
+ const VD::cell_type *cell = cell_queue.back();
+ const CellState cs = cell_state[cell - front_cell];
+ cell_queue.pop_back();
+ const VD::edge_type *first_edge = cell->incident_edge();
+ const VD::edge_type *edge = cell->incident_edge();
+ EdgeState es = (cs == CellState::Active) ? EdgeState::Possible : EdgeState::Inactive;
+ do {
+ if (set_cell_state(edge->twin()->cell(), cs)) {
+ set_edge_state_initial(edge, es);
+ set_edge_state_initial(edge->twin(), es);
+ cell_queue.emplace_back(edge->twin()->cell());
+ }
+ edge = edge->next();
+ } while (edge != first_edge);
+ }
+ }
+
+ if (! outside)
+ offset_distance = - offset_distance;
+
+#ifdef VORONOI_DEBUG_OUT
+ BoundingBox bbox;
+ {
+ bbox.merge(get_extents(lines));
+ bbox.min -= (0.01 * bbox.size().cast<double>()).cast<coord_t>();
+ bbox.max += (0.01 * bbox.size().cast<double>()).cast<coord_t>();
+ }
+ static int irun = 0;
+ ++ irun;
+ {
+ Lines helper_lines;
+ for (const VD::edge_type &edge : vd.edges())
+ if (edge_state[&edge - front_edge] == EdgeState::Possible) {
+ const VD::vertex_type *v0 = edge.vertex0();
+ const VD::vertex_type *v1 = edge.vertex1();
+ assert(v0 != nullptr);
+ Vec2d pt1(v0->x(), v0->y());
+ Vec2d pt2;
+ if (v1 == nullptr) {
+ // Unconstrained edge. Calculate a trimmed position.
+ assert(edge.is_linear());
+ const VD::cell_type *cell = edge.cell();
+ const VD::cell_type *cell2 = edge.twin()->cell();
+ const Line &line0 = lines[cell->source_index()];
+ const Line &line1 = lines[cell2->source_index()];
+ if (cell->contains_point() && cell2->contains_point()) {
+ const Point &pt0 = (cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b;
+ const Point &pt1 = (cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b;
+ // Direction vector of this unconstrained Voronoi edge.
+ Vec2d dir(double(pt0.y() - pt1.y()), double(pt1.x() - pt0.x()));
+ pt2 = Vec2d(v0->x(), v0->y()) + dir.normalized() * scale_(10.);
+ } else {
+ // Infinite edges could not be created by two segment sites.
+ assert(cell->contains_point() != cell2->contains_point());
+ // Linear edge goes through the endpoint of a segment.
+ assert(edge.is_secondary());
+ const Point &ipt = cell->contains_segment() ?
+ ((cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b) :
+ ((cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b);
+ // Infinite edge starts at an input contour, therefore there is always an intersection with an offset curve.
+ const Line &line = cell->contains_segment() ? line0 : line1;
+ assert(line.a == ipt || line.b == ipt);
+ // dir is perpendicular to line.
+ Vec2d dir(line.a.y() - line.b.y(), line.b.x() - line.a.x());
+ assert(dir.norm() > 0.);
+ if (((line.a == ipt) == cell->contains_point()) == (v0 == nullptr))
+ dir = - dir;
+ pt2 = ipt.cast<double>() + dir.normalized() * scale_(10.);
+ }
+ } else {
+ pt2 = Vec2d(v1->x(), v1->y());
+ // Clip the line by the bounding box, so that the coloring of the line will be visible.
+ Geometry::liang_barsky_line_clipping(pt1, pt2, BoundingBoxf(bbox.min.cast<double>(), bbox.max.cast<double>()));
+ }
+ helper_lines.emplace_back(Line(Point(pt1.cast<coord_t>()), Point(((pt1 + pt2) * 0.5).cast<coord_t>())));
+ }
+ dump_voronoi_to_svg(debug_out_path("voronoi-offset-candidates1-%d.svg", irun).c_str(), vd, Points(), lines, Polygons(), helper_lines);
+ }
+#endif // VORONOI_DEBUG_OUT
+
+ std::vector<Vec2d> edge_offset_point(vd.num_edges(), Vec2d());
+ const double offset_distance2 = offset_distance * offset_distance;
+ for (const VD::edge_type &edge : vd.edges()) {
+ assert(edge_state[&edge - front_edge] != EdgeState::Unknown);
+ size_t edge_idx = &edge - front_edge;
+ if (edge_state[edge_idx] == EdgeState::Possible) {
+ // Edge candidate, intersection points were not calculated yet.
+ const VD::vertex_type *v0 = edge.vertex0();
+ const VD::vertex_type *v1 = edge.vertex1();
+ assert(v0 != nullptr);
+ const VD::cell_type *cell = edge.cell();
+ const VD::cell_type *cell2 = edge.twin()->cell();
+ const Line &line0 = lines[cell->source_index()];
+ const Line &line1 = lines[cell2->source_index()];
+ size_t edge_idx2 = edge.twin() - front_edge;
+ if (v1 == nullptr) {
+ assert(edge.is_infinite());
+ assert(edge.is_linear());
+ assert(edge_state[edge_idx2] == EdgeState::Inactive);
+ if (cell->contains_point() && cell2->contains_point()) {
+ assert(! edge.is_secondary());
+ const Point &pt0 = (cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b;
+ const Point &pt1 = (cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b;
+ double dmin2 = (Vec2d(v0->x(), v0->y()) - pt0.cast<double>()).squaredNorm();
+ assert(dmin2 >= SCALED_EPSILON * SCALED_EPSILON);
+ if (dmin2 <= offset_distance2) {
+ // There shall be an intersection of this unconstrained edge with the offset curve.
+ // Direction vector of this unconstrained Voronoi edge.
+ Vec2d dir(double(pt0.y() - pt1.y()), double(pt1.x() - pt0.x()));
+ Vec2d pt(v0->x(), v0->y());
+ double t = detail::first_circle_segment_intersection_parameter(Vec2d(pt0.x(), pt0.y()), offset_distance, pt, dir);
+ edge_offset_point[edge_idx] = pt + t * dir;
+ set_edge_state_final(edge_idx, EdgeState::Active);
+ } else
+ set_edge_state_final(edge_idx, EdgeState::Inactive);
+ } else {
+ // Infinite edges could not be created by two segment sites.
+ assert(cell->contains_point() != cell2->contains_point());
+ // Linear edge goes through the endpoint of a segment.
+ assert(edge.is_secondary());
+ const Point &ipt = cell->contains_segment() ?
+ ((cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b) :
+ ((cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b);
+ #ifndef NDEBUG
+ if (cell->contains_segment()) {
+ const Point &pt1 = (cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b;
+ assert((pt1.x() == line0.a.x() && pt1.y() == line0.a.y()) ||
+ (pt1.x() == line0.b.x() && pt1.y() == line0.b.y()));
+ } else {
+ const Point &pt0 = (cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b;
+ assert((pt0.x() == line1.a.x() && pt0.y() == line1.a.y()) ||
+ (pt0.x() == line1.b.x() && pt0.y() == line1.b.y()));
+ }
+ assert((Vec2d(v0->x(), v0->y()) - ipt.cast<double>()).norm() < SCALED_EPSILON);
+ #endif /* NDEBUG */
+ // Infinite edge starts at an input contour, therefore there is always an intersection with an offset curve.
+ const Line &line = cell->contains_segment() ? line0 : line1;
+ assert(line.a == ipt || line.b == ipt);
+ edge_offset_point[edge_idx] = ipt.cast<double>() + offset_distance * Vec2d(line.b.y() - line.a.y(), line.a.x() - line.b.x()).normalized();
+ set_edge_state_final(edge_idx, EdgeState::Active);
+ }
+ // The other edge of an unconstrained edge starting with null vertex shall never be intersected.
+ set_edge_state_final(edge_idx2, EdgeState::Inactive);
+ } else if (edge.is_secondary()) {
+ assert(edge.is_linear());
+ assert(cell->contains_point() != cell2->contains_point());
+ const Line &line0 = lines[edge.cell()->source_index()];
+ const Line &line1 = lines[edge.twin()->cell()->source_index()];
+ const Point &pt = cell->contains_point() ?
+ ((cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b) :
+ ((cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b);
+ const Line &line = cell->contains_segment() ? line0 : line1;
+ assert(pt == line.a || pt == line.b);
+ assert((pt.cast<double>() - Vec2d(v0->x(), v0->y())).norm() < SCALED_EPSILON);
+ Vec2d dir(v1->x() - v0->x(), v1->y() - v0->y());
+ double l2 = dir.squaredNorm();
+ if (offset_distance2 <= l2) {
+ edge_offset_point[edge_idx] = pt.cast<double>() + (offset_distance / sqrt(l2)) * dir;
+ set_edge_state_final(edge_idx, EdgeState::Active);
+ } else {
+ set_edge_state_final(edge_idx, EdgeState::Inactive);
+ }
+ set_edge_state_final(edge_idx2, EdgeState::Inactive);
+ } else {
+ // Finite edge has valid points at both sides.
+ bool done = false;
+ if (cell->contains_segment() && cell2->contains_segment()) {
+ // This edge is a bisector of two line segments. Project v0, v1 onto one of the line segments.
+ Vec2d pt(line0.a.cast<double>());
+ Vec2d dir(line0.b.cast<double>() - pt);
+ Vec2d vec0 = Vec2d(v0->x(), v0->y()) - pt;
+ Vec2d vec1 = Vec2d(v1->x(), v1->y()) - pt;
+ double l2 = dir.squaredNorm();
+ assert(l2 > 0.);
+ double dmin = (dir * (vec0.dot(dir) / l2) - vec0).squaredNorm();
+ double dmax = (dir * (vec1.dot(dir) / l2) - vec1).squaredNorm();
+ bool flip = dmin > dmax;
+ if (flip)
+ std::swap(dmin, dmax);
+ if (offset_distance2 >= dmin && offset_distance2 <= dmax) {
+ // Intersect. Maximum one intersection will be found.
+ // This edge is a bisector of two line segments. Distance to the input polygon increases/decreases monotonically.
+ dmin = sqrt(dmin);
+ dmax = sqrt(dmax);
+ assert(offset_distance > dmin - EPSILON && offset_distance < dmax + EPSILON);
+ double ddif = dmax - dmin;
+ if (ddif == 0.) {
+ // line, line2 are exactly parallel. This is a singular case, the offset curve should miss it.
+ } else {
+ if (flip) {
+ std::swap(edge_idx, edge_idx2);
+ std::swap(v0, v1);
+ }
+ double t = clamp(0., 1., (offset_distance - dmin) / ddif);
+ edge_offset_point[edge_idx] = Vec2d(lerp(v0->x(), v1->x(), t), lerp(v0->y(), v1->y(), t));
+ set_edge_state_final(edge_idx, EdgeState::Active);
+ set_edge_state_final(edge_idx2, EdgeState::Inactive);
+ done = true;
+ }
+ }
+ } else {
+ assert(cell->contains_point() || cell2->contains_point());
+ bool point_vs_segment = cell->contains_point() != cell2->contains_point();
+ const Point &pt0 = cell->contains_point() ?
+ ((cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b) :
+ ((cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b);
+ // Project p0 to line segment <v0, v1>.
+ Vec2d p0(v0->x(), v0->y());
+ Vec2d p1(v1->x(), v1->y());
+ Vec2d px(pt0.x(), pt0.y());
+ double d0 = (p0 - px).squaredNorm();
+ double d1 = (p1 - px).squaredNorm();
+ double dmin = std::min(d0, d1);
+ double dmax = std::max(d0, d1);
+ bool has_intersection = false;
+ bool possibly_two_points = false;
+ if (offset_distance2 <= dmax) {
+ if (offset_distance2 >= dmin) {
+ has_intersection = true;
+ } else {
+ double dmin_new = dmin;
+ if (point_vs_segment) {
+ // Project on the source segment.
+ const Line &line = cell->contains_segment() ? line0 : line1;
+ const Vec2d pt_line = line.a.cast<double>();
+ const Vec2d v_line = (line.b - line.a).cast<double>();
+ double t0 = (p0 - pt_line).dot(v_line);
+ double t1 = (p1 - pt_line).dot(v_line);
+ double tx = (px - pt_line).dot(v_line);
+ if ((tx >= t0 && tx <= t1) || (tx >= t1 && tx <= t0)) {
+ // Projection of the Point site falls between the projections of the Voronoi edge end points
+ // onto the Line site.
+ Vec2d ft = pt_line + (tx / v_line.squaredNorm()) * v_line;
+ dmin_new = (ft - px).squaredNorm() * 0.25;
+ }
+ } else {
+ // Point-Point Voronoi sites. Project point site onto the current Voronoi edge.
+ Vec2d v = p1 - p0;
+ auto l2 = v.squaredNorm();
+ assert(l2 > 0);
+ auto t = v.dot(px - p0);
+ if (t >= 0. && t <= l2) {
+ // Projection falls onto the Voronoi edge. Calculate foot point and distance.
+ Vec2d ft = p0 + (t / l2) * v;
+ dmin_new = (ft - px).squaredNorm();
+ }
+ }
+ assert(dmin_new < dmax + SCALED_EPSILON);
+ assert(dmin_new < dmin + SCALED_EPSILON);
+ if (dmin_new < dmin) {
+ dmin = dmin_new;
+ has_intersection = possibly_two_points = offset_distance2 >= dmin;
+ }
+ }
+ }
+ if (has_intersection) {
+ detail::Intersections intersections;
+ if (point_vs_segment) {
+ assert(cell->contains_point() || cell2->contains_point());
+ intersections = detail::line_point_equal_distance_points(cell->contains_segment() ? line0 : line1, pt0, offset_distance);
+ } else {
+ const Point &pt1 = (cell2->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line1.a : line1.b;
+ intersections = detail::point_point_equal_distance_points(pt0, pt1, offset_distance);
+ }
+ // If the span of distances of start / end point / foot point to the point site indicate an intersection,
+ // we should find one.
+ assert(intersections.count > 0);
+ if (intersections.count == 2) {
+ // Now decide which points fall on this Voronoi edge.
+ // Tangential points (single intersection) are ignored.
+ if (possibly_two_points) {
+ Vec2d v = p1 - p0;
+ double l2 = v.squaredNorm();
+ double t0 = v.dot(intersections.pts[0] - p0);
+ double t1 = v.dot(intersections.pts[1] - p0);
+ if (t0 > t1) {
+ std::swap(t0, t1);
+ std::swap(intersections.pts[0], intersections.pts[1]);
+ }
+ // Remove points outside of the line range.
+ if (t0 < 0. || t0 > l2) {
+ if (t1 < 0. || t1 > l2)
+ intersections.count = 0;
+ else {
+ -- intersections.count;
+ t0 = t1;
+ intersections.pts[0] = intersections.pts[1];
+ }
+ } else if (t1 < 0. || t1 > l2)
+ -- intersections.count;
+ } else {
+ // Take the point furthest from the end points of the Voronoi edge or a Voronoi parabolic arc.
+ double d0 = std::max((intersections.pts[0] - p0).squaredNorm(), (intersections.pts[0] - p1).squaredNorm());
+ double d1 = std::max((intersections.pts[1] - p0).squaredNorm(), (intersections.pts[1] - p1).squaredNorm());
+ if (d0 > d1)
+ intersections.pts[0] = intersections.pts[1];
+ -- intersections.count;
+ }
+ assert(intersections.count > 0);
+ if (intersections.count == 2) {
+ set_edge_state_final(edge_idx, EdgeState::Active);
+ set_edge_state_final(edge_idx2, EdgeState::Active);
+ edge_offset_point[edge_idx] = intersections.pts[1];
+ edge_offset_point[edge_idx2] = intersections.pts[0];
+ done = true;
+ } else if (intersections.count == 1) {
+ if (d1 < d0)
+ std::swap(edge_idx, edge_idx2);
+ set_edge_state_final(edge_idx, EdgeState::Active);
+ set_edge_state_final(edge_idx2, EdgeState::Inactive);
+ edge_offset_point[edge_idx] = intersections.pts[0];
+ done = true;
+ }
+ }
+ }
+ }
+ if (! done) {
+ set_edge_state_final(edge_idx, EdgeState::Inactive);
+ set_edge_state_final(edge_idx2, EdgeState::Inactive);
+ }
+ }
+ }
+ }
+
+#ifndef NDEBUG
+ for (const VD::edge_type &edge : vd.edges()) {
+ assert(edge_state[&edge - front_edge] == EdgeState::Inactive || edge_state[&edge - front_edge] == EdgeState::Active);
+ // None of a new edge candidate may start with null vertex.
+ assert(edge_state[&edge - front_edge] == EdgeState::Inactive || edge.vertex0() != nullptr);
+ assert(edge_state[edge.twin() - front_edge] == EdgeState::Inactive || edge.twin()->vertex0() != nullptr);
+ }
+#endif // NDEBUG
+
+#ifdef VORONOI_DEBUG_OUT
+ {
+ Lines helper_lines;
+ for (const VD::edge_type &edge : vd.edges())
+ if (edge_state[&edge - front_edge] == EdgeState::Active)
+ helper_lines.emplace_back(Line(Point(edge.vertex0()->x(), edge.vertex0()->y()), Point(edge_offset_point[&edge - front_edge].cast<coord_t>())));
+ dump_voronoi_to_svg(debug_out_path("voronoi-offset-candidates2-%d.svg", irun).c_str(), vd, Points(), lines, Polygons(), helper_lines);
+ }
+#endif // VORONOI_DEBUG_OUT
+
+ auto next_offset_edge = [&edge_state, front_edge](const VD::edge_type *start_edge) -> const VD::edge_type* {
+ for (const VD::edge_type *edge = start_edge->next(); edge != start_edge; edge = edge->next())
+ if (edge_state[edge->twin() - front_edge] == EdgeState::Active)
+ return edge->twin();
+ // assert(false);
+ return nullptr;
+ };
+
+#ifndef NDEBUG
+ auto dist_to_site = [&lines](const VD::cell_type &cell, const Vec2d &point) {
+ const Line &line = lines[cell.source_index()];
+ return cell.contains_point() ?
+ (((cell.source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line.a : line.b).cast<double>() - point).norm() :
+ (Geometry::foot_pt<Vec2d>(line.a.cast<double>(), (line.b - line.a).cast<double>(), point) - point).norm();
+ };
+#endif /* NDEBUG */
+
+ // Track the offset curves.
+ Polygons out;
+ double angle_step = 2. * acos((offset_distance - discretization_error) / offset_distance);
+ double cos_threshold = cos(angle_step);
+ for (size_t seed_edge_idx = 0; seed_edge_idx < vd.num_edges(); ++ seed_edge_idx)
+ if (edge_state[seed_edge_idx] == EdgeState::Active) {
+ const VD::edge_type *start_edge = &vd.edges()[seed_edge_idx];
+ const VD::edge_type *edge = start_edge;
+ Polygon poly;
+ do {
+ // find the next edge
+ const VD::edge_type *next_edge = next_offset_edge(edge);
+#ifdef VORONOI_DEBUG_OUT
+ if (next_edge == nullptr) {
+ Lines helper_lines;
+ dump_voronoi_to_svg(debug_out_path("voronoi-offset-open-loop-%d.svg", irun).c_str(), vd, Points(), lines, Polygons(), to_lines(poly));
+ }
+#endif // VORONOI_DEBUG_OUT
+ assert(next_edge);
+ //std::cout << "offset-output: "; print_edge(edge); std::cout << " to "; print_edge(next_edge); std::cout << "\n";
+ // Interpolate a circular segment or insert a linear segment between edge and next_edge.
+ const VD::cell_type *cell = edge->cell();
+ edge_state[next_edge - front_edge] = EdgeState::Inactive;
+ Vec2d p1 = edge_offset_point[edge - front_edge];
+ Vec2d p2 = edge_offset_point[next_edge - front_edge];
+#ifndef NDEBUG
+ {
+ double err = dist_to_site(*cell, p1) - offset_distance;
+ double err2 = dist_to_site(*cell, p2) - offset_distance;
+#ifdef VORONOI_DEBUG_OUT
+ if (std::max(err, err2) >= SCALED_EPSILON) {
+ Lines helper_lines;
+ dump_voronoi_to_svg(debug_out_path("voronoi-offset-incorrect_pt-%d.svg", irun).c_str(), vd, Points(), lines, Polygons(), to_lines(poly));
+ }
+#endif // VORONOI_DEBUG_OUT
+ assert(std::abs(err) < SCALED_EPSILON);
+ assert(std::abs(err2) < SCALED_EPSILON);
+ }
+#endif /* NDEBUG */
+ if (cell->contains_point()) {
+ // Discretize an arc from p1 to p2 with radius = offset_distance and discretization_error.
+ // The extracted contour is CCW oriented, extracted holes are CW oriented.
+ // The extracted arc will have the same orientation. As the Voronoi regions are convex, the angle covered by the arc will be convex as well.
+ const Line &line0 = lines[cell->source_index()];
+ const Vec2d &center = ((cell->source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ? line0.a : line0.b).cast<double>();
+ const Vec2d v1 = p1 - center;
+ const Vec2d v2 = p2 - center;
+ bool ccw = cross2(v1, v2) > 0;
+ double cos_a = v1.dot(v2);
+ double norm = v1.norm() * v2.norm();
+ assert(norm > 0.);
+ if (cos_a < cos_threshold * norm) {
+ // Angle is bigger than the threshold, therefore the arc will be discretized.
+ cos_a /= norm;
+ assert(cos_a > -1. - EPSILON && cos_a < 1. + EPSILON);
+ double angle = acos(std::max(-1., std::min(1., cos_a)));
+ size_t n_steps = size_t(ceil(angle / angle_step));
+ double astep = angle / n_steps;
+ if (! ccw)
+ astep *= -1.;
+ double a = astep;
+ for (size_t i = 1; i < n_steps; ++ i, a += astep) {
+ double c = cos(a);
+ double s = sin(a);
+ Vec2d p = center + Vec2d(c * v1.x() - s * v1.y(), s * v1.x() + c * v1.y());
+ poly.points.emplace_back(Point(coord_t(p.x()), coord_t(p.y())));
+ }
+ }
+ }
+ {
+ Point pt_last(coord_t(p2.x()), coord_t(p2.y()));
+ if (poly.empty() || poly.points.back() != pt_last)
+ poly.points.emplace_back(pt_last);
+ }
+ edge = next_edge;
+ } while (edge != start_edge);
+ out.emplace_back(std::move(poly));
+ }
+
+ return out;
+}
+
+} // namespace Slic3r
diff --git a/src/libslic3r/VoronoiOffset.hpp b/src/libslic3r/VoronoiOffset.hpp
new file mode 100644
index 000000000..a21b44f93
--- /dev/null
+++ b/src/libslic3r/VoronoiOffset.hpp
@@ -0,0 +1,25 @@
+// Polygon offsetting using Voronoi diagram prodiced by boost::polygon.
+
+#ifndef slic3r_VoronoiOffset_hpp_
+#define slic3r_VoronoiOffset_hpp_
+
+#include "libslic3r.h"
+
+#include "Geometry.hpp"
+
+namespace Slic3r {
+
+// Offset a polygon or a set of polygons possibly with holes by traversing a Voronoi diagram.
+// The input polygons are stored in lines and lines are referenced by vd.
+// Outer curve will be extracted for a positive offset_distance,
+// inner curve will be extracted for a negative offset_distance.
+// Circular arches will be discretized to achieve discretization_error.
+Polygons voronoi_offset(
+ const Geometry::VoronoiDiagram &vd,
+ const Lines &lines,
+ double offset_distance,
+ double discretization_error);
+
+} // namespace Slic3r
+
+#endif // slic3r_VoronoiOffset_hpp_
diff --git a/src/libslic3r/VoronoiVisualUtils.hpp b/src/libslic3r/VoronoiVisualUtils.hpp
new file mode 100644
index 000000000..fa6a34241
--- /dev/null
+++ b/src/libslic3r/VoronoiVisualUtils.hpp
@@ -0,0 +1,415 @@
+#include <stack>
+
+#include <libslic3r/Geometry.hpp>
+#include <libslic3r/Line.hpp>
+#include <libslic3r/Polygon.hpp>
+#include <libslic3r/SVG.hpp>
+
+namespace boost { namespace polygon {
+
+// The following code for the visualization of the boost Voronoi diagram is based on:
+//
+// Boost.Polygon library voronoi_graphic_utils.hpp header file
+// Copyright Andrii Sydorchuk 2010-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+template <typename CT>
+class voronoi_visual_utils {
+ public:
+ // Discretize parabolic Voronoi edge.
+ // Parabolic Voronoi edges are always formed by one point and one segment
+ // from the initial input set.
+ //
+ // Args:
+ // point: input point.
+ // segment: input segment.
+ // max_dist: maximum discretization distance.
+ // discretization: point discretization of the given Voronoi edge.
+ //
+ // Template arguments:
+ // InCT: coordinate type of the input geometries (usually integer).
+ // Point: point type, should model point concept.
+ // Segment: segment type, should model segment concept.
+ //
+ // Important:
+ // discretization should contain both edge endpoints initially.
+ template <class InCT1, class InCT2,
+ template<class> class Point,
+ template<class> class Segment>
+ static
+ typename enable_if<
+ typename gtl_and<
+ typename gtl_if<
+ typename is_point_concept<
+ typename geometry_concept< Point<InCT1> >::type
+ >::type
+ >::type,
+ typename gtl_if<
+ typename is_segment_concept<
+ typename geometry_concept< Segment<InCT2> >::type
+ >::type
+ >::type
+ >::type,
+ void
+ >::type discretize(
+ const Point<InCT1>& point,
+ const Segment<InCT2>& segment,
+ const CT max_dist,
+ std::vector< Point<CT> >* discretization) {
+ // Apply the linear transformation to move start point of the segment to
+ // the point with coordinates (0, 0) and the direction of the segment to
+ // coincide the positive direction of the x-axis.
+ CT segm_vec_x = cast(x(high(segment))) - cast(x(low(segment)));
+ CT segm_vec_y = cast(y(high(segment))) - cast(y(low(segment)));
+ CT sqr_segment_length = segm_vec_x * segm_vec_x + segm_vec_y * segm_vec_y;
+
+ // Compute x-coordinates of the endpoints of the edge
+ // in the transformed space.
+ CT projection_start = sqr_segment_length *
+ get_point_projection((*discretization)[0], segment);
+ CT projection_end = sqr_segment_length *
+ get_point_projection((*discretization)[1], segment);
+
+ // Compute parabola parameters in the transformed space.
+ // Parabola has next representation:
+ // f(x) = ((x-rot_x)^2 + rot_y^2) / (2.0*rot_y).
+ CT point_vec_x = cast(x(point)) - cast(x(low(segment)));
+ CT point_vec_y = cast(y(point)) - cast(y(low(segment)));
+ CT rot_x = segm_vec_x * point_vec_x + segm_vec_y * point_vec_y;
+ CT rot_y = segm_vec_x * point_vec_y - segm_vec_y * point_vec_x;
+
+ // Save the last point.
+ Point<CT> last_point = (*discretization)[1];
+ discretization->pop_back();
+
+ // Use stack to avoid recursion.
+ std::stack<CT> point_stack;
+ point_stack.push(projection_end);
+ CT cur_x = projection_start;
+ CT cur_y = parabola_y(cur_x, rot_x, rot_y);
+
+ // Adjust max_dist parameter in the transformed space.
+ const CT max_dist_transformed = max_dist * max_dist * sqr_segment_length;
+ while (!point_stack.empty()) {
+ CT new_x = point_stack.top();
+ CT new_y = parabola_y(new_x, rot_x, rot_y);
+
+ // Compute coordinates of the point of the parabola that is
+ // furthest from the current line segment.
+ CT mid_x = (new_y - cur_y) / (new_x - cur_x) * rot_y + rot_x;
+ CT mid_y = parabola_y(mid_x, rot_x, rot_y);
+
+ // Compute maximum distance between the given parabolic arc
+ // and line segment that discretize it.
+ CT dist = (new_y - cur_y) * (mid_x - cur_x) -
+ (new_x - cur_x) * (mid_y - cur_y);
+ dist = dist * dist / ((new_y - cur_y) * (new_y - cur_y) +
+ (new_x - cur_x) * (new_x - cur_x));
+ if (dist <= max_dist_transformed) {
+ // Distance between parabola and line segment is less than max_dist.
+ point_stack.pop();
+ CT inter_x = (segm_vec_x * new_x - segm_vec_y * new_y) /
+ sqr_segment_length + cast(x(low(segment)));
+ CT inter_y = (segm_vec_x * new_y + segm_vec_y * new_x) /
+ sqr_segment_length + cast(y(low(segment)));
+ discretization->push_back(Point<CT>(inter_x, inter_y));
+ cur_x = new_x;
+ cur_y = new_y;
+ } else {
+ point_stack.push(mid_x);
+ }
+ }
+
+ // Update last point.
+ discretization->back() = last_point;
+ }
+
+ private:
+ // Compute y(x) = ((x - a) * (x - a) + b * b) / (2 * b).
+ static CT parabola_y(CT x, CT a, CT b) {
+ return ((x - a) * (x - a) + b * b) / (b + b);
+ }
+
+ // Get normalized length of the distance between:
+ // 1) point projection onto the segment
+ // 2) start point of the segment
+ // Return this length divided by the segment length. This is made to avoid
+ // sqrt computation during transformation from the initial space to the
+ // transformed one and vice versa. The assumption is made that projection of
+ // the point lies between the start-point and endpoint of the segment.
+ template <class InCT,
+ template<class> class Point,
+ template<class> class Segment>
+ static
+ typename enable_if<
+ typename gtl_and<
+ typename gtl_if<
+ typename is_point_concept<
+ typename geometry_concept< Point<int> >::type
+ >::type
+ >::type,
+ typename gtl_if<
+ typename is_segment_concept<
+ typename geometry_concept< Segment<long> >::type
+ >::type
+ >::type
+ >::type,
+ CT
+ >::type get_point_projection(
+ const Point<CT>& point, const Segment<InCT>& segment) {
+ CT segment_vec_x = cast(x(high(segment))) - cast(x(low(segment)));
+ CT segment_vec_y = cast(y(high(segment))) - cast(y(low(segment)));
+ CT point_vec_x = x(point) - cast(x(low(segment)));
+ CT point_vec_y = y(point) - cast(y(low(segment)));
+ CT sqr_segment_length =
+ segment_vec_x * segment_vec_x + segment_vec_y * segment_vec_y;
+ CT vec_dot = segment_vec_x * point_vec_x + segment_vec_y * point_vec_y;
+ return vec_dot / sqr_segment_length;
+ }
+
+ template <typename InCT>
+ static CT cast(const InCT& value) {
+ return static_cast<CT>(value);
+ }
+};
+
+} } // namespace boost::polygon
+
+
+namespace Slic3r
+{
+
+// The following code for the visualization of the boost Voronoi diagram is based on:
+//
+// Boost.Polygon library voronoi_visualizer.cpp file
+// Copyright Andrii Sydorchuk 2010-2012.
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+namespace Voronoi { namespace Internal {
+
+ using VD = Geometry::VoronoiDiagram;
+ typedef double coordinate_type;
+ typedef boost::polygon::point_data<coordinate_type> point_type;
+ typedef boost::polygon::segment_data<coordinate_type> segment_type;
+ typedef boost::polygon::rectangle_data<coordinate_type> rect_type;
+ typedef VD::cell_type cell_type;
+ typedef VD::cell_type::source_index_type source_index_type;
+ typedef VD::cell_type::source_category_type source_category_type;
+ typedef VD::edge_type edge_type;
+ typedef VD::cell_container_type cell_container_type;
+ typedef VD::cell_container_type vertex_container_type;
+ typedef VD::edge_container_type edge_container_type;
+ typedef VD::const_cell_iterator const_cell_iterator;
+ typedef VD::const_vertex_iterator const_vertex_iterator;
+ typedef VD::const_edge_iterator const_edge_iterator;
+
+ static const std::size_t EXTERNAL_COLOR = 1;
+
+ inline void color_exterior(const VD::edge_type* edge)
+ {
+ if (edge->color() == EXTERNAL_COLOR)
+ return;
+ edge->color(EXTERNAL_COLOR);
+ edge->twin()->color(EXTERNAL_COLOR);
+ const VD::vertex_type* v = edge->vertex1();
+ if (v == NULL || !edge->is_primary())
+ return;
+ v->color(EXTERNAL_COLOR);
+ const VD::edge_type* e = v->incident_edge();
+ do {
+ color_exterior(e);
+ e = e->rot_next();
+ } while (e != v->incident_edge());
+ }
+
+ inline point_type retrieve_point(const Points &points, const std::vector<segment_type> &segments, const cell_type& cell)
+ {
+ assert(cell.source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT || cell.source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_END_POINT ||
+ cell.source_category() == boost::polygon::SOURCE_CATEGORY_SINGLE_POINT);
+ return cell.source_category() == boost::polygon::SOURCE_CATEGORY_SINGLE_POINT ?
+ Voronoi::Internal::point_type(double(points[cell.source_index()].x()), double(points[cell.source_index()].y())) :
+ (cell.source_category() == boost::polygon::SOURCE_CATEGORY_SEGMENT_START_POINT) ?
+ low(segments[cell.source_index()]) : high(segments[cell.source_index()]);
+ }
+
+ inline void clip_infinite_edge(const Points &points, const std::vector<segment_type> &segments, const edge_type& edge, coordinate_type bbox_max_size, std::vector<point_type>* clipped_edge)
+ {
+ const cell_type& cell1 = *edge.cell();
+ const cell_type& cell2 = *edge.twin()->cell();
+ point_type origin, direction;
+ // Infinite edges could not be created by two segment sites.
+ if (! cell1.contains_point() && ! cell2.contains_point()) {
+ printf("Error! clip_infinite_edge - infinite edge separates two segment cells\n");
+ return;
+ }
+ if (cell1.contains_point() && cell2.contains_point()) {
+ point_type p1 = retrieve_point(points, segments, cell1);
+ point_type p2 = retrieve_point(points, segments, cell2);
+ origin.x((p1.x() + p2.x()) * 0.5);
+ origin.y((p1.y() + p2.y()) * 0.5);
+ direction.x(p1.y() - p2.y());
+ direction.y(p2.x() - p1.x());
+ } else {
+ origin = cell1.contains_segment() ? retrieve_point(points, segments, cell2) : retrieve_point(points, segments, cell1);
+ segment_type segment = cell1.contains_segment() ? segments[cell1.source_index()] : segments[cell2.source_index()];
+ coordinate_type dx = high(segment).x() - low(segment).x();
+ coordinate_type dy = high(segment).y() - low(segment).y();
+ if ((low(segment) == origin) ^ cell1.contains_point()) {
+ direction.x(dy);
+ direction.y(-dx);
+ } else {
+ direction.x(-dy);
+ direction.y(dx);
+ }
+ }
+ coordinate_type koef = bbox_max_size / (std::max)(fabs(direction.x()), fabs(direction.y()));
+ if (edge.vertex0() == NULL) {
+ clipped_edge->push_back(point_type(
+ origin.x() - direction.x() * koef,
+ origin.y() - direction.y() * koef));
+ } else {
+ clipped_edge->push_back(
+ point_type(edge.vertex0()->x(), edge.vertex0()->y()));
+ }
+ if (edge.vertex1() == NULL) {
+ clipped_edge->push_back(point_type(
+ origin.x() + direction.x() * koef,
+ origin.y() + direction.y() * koef));
+ } else {
+ clipped_edge->push_back(
+ point_type(edge.vertex1()->x(), edge.vertex1()->y()));
+ }
+ }
+
+ inline void sample_curved_edge(const Points &points, const std::vector<segment_type> &segments, const edge_type& edge, std::vector<point_type> &sampled_edge, coordinate_type max_dist)
+ {
+ point_type point = edge.cell()->contains_point() ?
+ retrieve_point(points, segments, *edge.cell()) :
+ retrieve_point(points, segments, *edge.twin()->cell());
+ segment_type segment = edge.cell()->contains_point() ?
+ segments[edge.twin()->cell()->source_index()] :
+ segments[edge.cell()->source_index()];
+ ::boost::polygon::voronoi_visual_utils<coordinate_type>::discretize(point, segment, max_dist, &sampled_edge);
+ }
+
+} /* namespace Internal */ } // namespace Voronoi
+
+BoundingBox get_extents(const Lines &lines);
+
+static inline void dump_voronoi_to_svg(
+ const char *path,
+ const Geometry::VoronoiDiagram &vd,
+ const Points &points,
+ const Lines &lines,
+ const Polygons &offset_curves = Polygons(),
+ const Lines &helper_lines = Lines(),
+ double scale = 0)
+{
+ BoundingBox bbox;
+ bbox.merge(get_extents(points));
+ bbox.merge(get_extents(lines));
+ bbox.merge(get_extents(offset_curves));
+ bbox.merge(get_extents(helper_lines));
+ bbox.min -= (0.01 * bbox.size().cast<double>()).cast<coord_t>();
+ bbox.max += (0.01 * bbox.size().cast<double>()).cast<coord_t>();
+
+ if (scale == 0)
+ scale =
+// 0.1
+ 0.01
+ * std::min(bbox.size().x(), bbox.size().y());
+ else
+ scale /= SCALING_FACTOR;
+
+ const std::string inputSegmentPointColor = "lightseagreen";
+ const coord_t inputSegmentPointRadius = coord_t(0.09 * scale);
+ const std::string inputSegmentColor = "lightseagreen";
+ const coord_t inputSegmentLineWidth = coord_t(0.03 * scale);
+
+ const std::string voronoiPointColor = "black";
+ const coord_t voronoiPointRadius = coord_t(0.06 * scale);
+ const std::string voronoiLineColorPrimary = "black";
+ const std::string voronoiLineColorSecondary = "green";
+ const std::string voronoiArcColor = "red";
+ const coord_t voronoiLineWidth = coord_t(0.02 * scale);
+
+ const std::string offsetCurveColor = "magenta";
+ const coord_t offsetCurveLineWidth = coord_t(0.02 * scale);
+
+ const std::string helperLineColor = "orange";
+ const coord_t helperLineWidth = coord_t(0.04 * scale);
+
+ const bool internalEdgesOnly = false;
+ const bool primaryEdgesOnly = false;
+
+ ::Slic3r::SVG svg(path, bbox);
+
+ // For clipping of half-lines to some reasonable value.
+ // The line will then be clipped by the SVG viewer anyway.
+ const double bbox_dim_max = double(std::max(bbox.size().x(), bbox.size().y()));
+ // For the discretization of the Voronoi parabolic segments.
+ const double discretization_step = 0.0002 * bbox_dim_max;
+
+ // Make a copy of the input segments with the double type.
+ std::vector<Voronoi::Internal::segment_type> segments;
+ for (Lines::const_iterator it = lines.begin(); it != lines.end(); ++ it)
+ segments.push_back(Voronoi::Internal::segment_type(
+ Voronoi::Internal::point_type(double(it->a(0)), double(it->a(1))),
+ Voronoi::Internal::point_type(double(it->b(0)), double(it->b(1)))));
+
+ // Color exterior edges.
+ for (boost::polygon::voronoi_diagram<double>::const_edge_iterator it = vd.edges().begin(); it != vd.edges().end(); ++it)
+ if (!it->is_finite())
+ Voronoi::Internal::color_exterior(&(*it));
+
+ // Draw the end points of the input polygon.
+ for (Lines::const_iterator it = lines.begin(); it != lines.end(); ++it) {
+ svg.draw(it->a, inputSegmentPointColor, inputSegmentPointRadius);
+ svg.draw(it->b, inputSegmentPointColor, inputSegmentPointRadius);
+ }
+ // Draw the input polygon.
+ for (Lines::const_iterator it = lines.begin(); it != lines.end(); ++it)
+ svg.draw(Line(Point(coord_t(it->a(0)), coord_t(it->a(1))), Point(coord_t(it->b(0)), coord_t(it->b(1)))), inputSegmentColor, inputSegmentLineWidth);
+
+#if 1
+ // Draw voronoi vertices.
+ for (boost::polygon::voronoi_diagram<double>::const_vertex_iterator it = vd.vertices().begin(); it != vd.vertices().end(); ++it)
+ if (! internalEdgesOnly || it->color() != Voronoi::Internal::EXTERNAL_COLOR)
+ svg.draw(Point(coord_t(it->x()), coord_t(it->y())), voronoiPointColor, voronoiPointRadius);
+
+ for (boost::polygon::voronoi_diagram<double>::const_edge_iterator it = vd.edges().begin(); it != vd.edges().end(); ++it) {
+ if (primaryEdgesOnly && !it->is_primary())
+ continue;
+ if (internalEdgesOnly && (it->color() == Voronoi::Internal::EXTERNAL_COLOR))
+ continue;
+ std::vector<Voronoi::Internal::point_type> samples;
+ std::string color = voronoiLineColorPrimary;
+ if (!it->is_finite()) {
+ Voronoi::Internal::clip_infinite_edge(points, segments, *it, bbox_dim_max, &samples);
+ if (! it->is_primary())
+ color = voronoiLineColorSecondary;
+ } else {
+ // Store both points of the segment into samples. sample_curved_edge will split the initial line
+ // until the discretization_step is reached.
+ samples.push_back(Voronoi::Internal::point_type(it->vertex0()->x(), it->vertex0()->y()));
+ samples.push_back(Voronoi::Internal::point_type(it->vertex1()->x(), it->vertex1()->y()));
+ if (it->is_curved()) {
+ Voronoi::Internal::sample_curved_edge(points, segments, *it, samples, discretization_step);
+ color = voronoiArcColor;
+ } else if (! it->is_primary())
+ color = voronoiLineColorSecondary;
+ }
+ for (std::size_t i = 0; i + 1 < samples.size(); ++i)
+ svg.draw(Line(Point(coord_t(samples[i].x()), coord_t(samples[i].y())), Point(coord_t(samples[i+1].x()), coord_t(samples[i+1].y()))), color, voronoiLineWidth);
+ }
+#endif
+
+ svg.draw_outline(offset_curves, offsetCurveColor, offsetCurveLineWidth);
+ svg.draw(helper_lines, helperLineColor, helperLineWidth);
+
+ svg.Close();
+}
+
+} // namespace Slic3r
diff --git a/src/libslic3r/Zipper.cpp b/src/libslic3r/Zipper.cpp
index a5b53584d..cebafa633 100644
--- a/src/libslic3r/Zipper.cpp
+++ b/src/libslic3r/Zipper.cpp
@@ -1,5 +1,6 @@
#include <exception>
+#include "Exception.hpp"
#include "Zipper.hpp"
#include "miniz_extension.hpp"
#include <boost/log/trivial.hpp>
@@ -17,95 +18,19 @@
namespace Slic3r {
-class Zipper::Impl {
+class Zipper::Impl: public MZ_Archive {
public:
- mz_zip_archive arch;
std::string m_zipname;
- static std::string get_errorstr(mz_zip_error mz_err)
- {
- switch (mz_err)
- {
- case MZ_ZIP_NO_ERROR:
- return "no error";
- case MZ_ZIP_UNDEFINED_ERROR:
- return L("undefined error");
- case MZ_ZIP_TOO_MANY_FILES:
- return L("too many files");
- case MZ_ZIP_FILE_TOO_LARGE:
- return L("file too large");
- case MZ_ZIP_UNSUPPORTED_METHOD:
- return L("unsupported method");
- case MZ_ZIP_UNSUPPORTED_ENCRYPTION:
- return L("unsupported encryption");
- case MZ_ZIP_UNSUPPORTED_FEATURE:
- return L("unsupported feature");
- case MZ_ZIP_FAILED_FINDING_CENTRAL_DIR:
- return L("failed finding central directory");
- case MZ_ZIP_NOT_AN_ARCHIVE:
- return L("not a ZIP archive");
- case MZ_ZIP_INVALID_HEADER_OR_CORRUPTED:
- return L("invalid header or archive is corrupted");
- case MZ_ZIP_UNSUPPORTED_MULTIDISK:
- return L("unsupported multidisk archive");
- case MZ_ZIP_DECOMPRESSION_FAILED:
- return L("decompression failed or archive is corrupted");
- case MZ_ZIP_COMPRESSION_FAILED:
- return L("compression failed");
- case MZ_ZIP_UNEXPECTED_DECOMPRESSED_SIZE:
- return L("unexpected decompressed size");
- case MZ_ZIP_CRC_CHECK_FAILED:
- return L("CRC-32 check failed");
- case MZ_ZIP_UNSUPPORTED_CDIR_SIZE:
- return L("unsupported central directory size");
- case MZ_ZIP_ALLOC_FAILED:
- return L("allocation failed");
- case MZ_ZIP_FILE_OPEN_FAILED:
- return L("file open failed");
- case MZ_ZIP_FILE_CREATE_FAILED:
- return L("file create failed");
- case MZ_ZIP_FILE_WRITE_FAILED:
- return L("file write failed");
- case MZ_ZIP_FILE_READ_FAILED:
- return L("file read failed");
- case MZ_ZIP_FILE_CLOSE_FAILED:
- return L("file close failed");
- case MZ_ZIP_FILE_SEEK_FAILED:
- return L("file seek failed");
- case MZ_ZIP_FILE_STAT_FAILED:
- return L("file stat failed");
- case MZ_ZIP_INVALID_PARAMETER:
- return L("invalid parameter");
- case MZ_ZIP_INVALID_FILENAME:
- return L("invalid filename");
- case MZ_ZIP_BUF_TOO_SMALL:
- return L("buffer too small");
- case MZ_ZIP_INTERNAL_ERROR:
- return L("internal error");
- case MZ_ZIP_FILE_NOT_FOUND:
- return L("file not found");
- case MZ_ZIP_ARCHIVE_TOO_LARGE:
- return L("archive is too large");
- case MZ_ZIP_VALIDATION_FAILED:
- return L("validation failed");
- case MZ_ZIP_WRITE_CALLBACK_FAILED:
- return L("write calledback failed");
- default:
- break;
- }
-
- return "unknown error";
- }
-
std::string formatted_errorstr() const
{
return L("Error with zip archive") + " " + m_zipname + ": " +
- get_errorstr(arch.m_last_error) + "!";
+ get_errorstr();
}
SLIC3R_NORETURN void blow_up() const
{
- throw std::runtime_error(formatted_errorstr());
+ throw Slic3r::ExportError(formatted_errorstr());
}
bool is_alive()
@@ -167,7 +92,7 @@ void Zipper::add_entry(const std::string &name)
m_entry = name;
}
-void Zipper::add_entry(const std::string &name, const uint8_t *data, size_t l)
+void Zipper::add_entry(const std::string &name, const void *data, size_t l)
{
if(!m_impl->is_alive()) return;
diff --git a/src/libslic3r/Zipper.hpp b/src/libslic3r/Zipper.hpp
index be1e69b5c..bbaf2f05e 100644
--- a/src/libslic3r/Zipper.hpp
+++ b/src/libslic3r/Zipper.hpp
@@ -28,7 +28,7 @@ public:
// Will blow up in a runtime exception if the file cannot be created.
explicit Zipper(const std::string& zipfname,
- e_compression level = NO_COMPRESSION);
+ e_compression level = FAST_COMPRESSION);
~Zipper();
// No copies allwed, this is a file resource...
@@ -49,7 +49,7 @@ public:
/// Add a new binary file entry with an instantly given byte buffer.
/// This method throws exactly like finish_entry() does.
- void add_entry(const std::string& name, const std::uint8_t* data, size_t l);
+ void add_entry(const std::string& name, const void* data, size_t bytes);
// Writing data to the archive works like with standard streams. The target
// within the zip file is the entry created with the add_entry method.
diff --git a/src/libslic3r/format.hpp b/src/libslic3r/format.hpp
new file mode 100644
index 000000000..c3747677b
--- /dev/null
+++ b/src/libslic3r/format.hpp
@@ -0,0 +1,57 @@
+#ifndef slic3r_format_hpp_
+#define slic3r_format_hpp_
+
+// Functional wrapper around boost::format.
+// One day we may replace this wrapper with C++20 format
+// https://en.cppreference.com/w/cpp/utility/format/format
+// though C++20 format uses a different template pattern for position independent parameters.
+//
+// Boost::format works around the missing variadic templates by an ugly % chaining operator. The usage of boost::format looks like this:
+// (boost::format("template") % arg1 %arg2).str()
+// This wrapper allows for a nicer syntax:
+// Slic3r::format("template", arg1, arg2)
+// One can also override Slic3r::internal::format::cook() function to convert a Slic3r::format() argument to something that
+// boost::format may convert to string, see slic3r/GUI/I18N.hpp for a "cook" function to convert wxString to UTF8.
+
+#include <boost/format.hpp>
+
+namespace Slic3r {
+
+// https://gist.github.com/gchudnov/6a90d51af004d97337ec
+namespace internal {
+ namespace format {
+ // Default "cook" function - just forward.
+ template<typename T>
+ inline T&& cook(T&& arg) {
+ return std::forward<T>(arg);
+ }
+
+ // End of the recursive chain.
+ inline std::string format_recursive(boost::format& message) {
+ return message.str();
+ }
+
+ template<typename TValue, typename... TArgs>
+ std::string format_recursive(boost::format& message, TValue&& arg, TArgs&&... args) {
+ // Format, possibly convert the argument by the "cook" function.
+ message % cook(std::forward<TValue>(arg));
+ return format_recursive(message, std::forward<TArgs>(args)...);
+ }
+ }
+};
+
+template<typename... TArgs>
+inline std::string format(const char* fmt, TArgs&&... args) {
+ boost::format message(fmt);
+ return internal::format::format_recursive(message, std::forward<TArgs>(args)...);
+}
+
+template<typename... TArgs>
+inline std::string format(const std::string& fmt, TArgs&&... args) {
+ boost::format message(fmt);
+ return internal::format::format_recursive(message, std::forward<TArgs>(args)...);
+}
+
+} // namespace Slic3r
+
+#endif // slic3r_format_hpp_
diff --git a/src/libslic3r/libslic3r.h b/src/libslic3r/libslic3r.h
index 41d9ac1ff..2ef258a4c 100644
--- a/src/libslic3r/libslic3r.h
+++ b/src/libslic3r/libslic3r.h
@@ -2,9 +2,13 @@
#define _libslic3r_h_
#include "libslic3r_version.h"
+#define GCODEVIEWER_APP_NAME "PrusaSlicer G-code Viewer"
+#define GCODEVIEWER_APP_KEY "PrusaSlicerGcodeViewer"
+#define GCODEVIEWER_BUILD_ID std::string("PrusaSlicer G-code Viewer-") + std::string(SLIC3R_VERSION) + std::string("-UNKNOWN")
// this needs to be included early for MSVC (listing it in Build.PL is not enough)
#include <memory>
+#include <array>
#include <algorithm>
#include <ostream>
#include <iostream>
@@ -17,35 +21,44 @@
#include <vector>
#include <cassert>
#include <cmath>
+#include <type_traits>
#include "Technologies.hpp"
#include "Semver.hpp"
-typedef int32_t coord_t;
-typedef double coordf_t;
+#if 1
+// Saves around 32% RAM after slicing step, 6.7% after G-code export (tested on PrusaSlicer 2.2.0 final).
+using coord_t = int32_t;
+#else
+//FIXME At least FillRectilinear2 and std::boost Voronoi require coord_t to be 32bit.
+typedef int64_t coord_t;
+#endif
+
+using coordf_t = double;
//FIXME This epsilon value is used for many non-related purposes:
// For a threshold of a squared Euclidean distance,
// for a trheshold in a difference of radians,
// for a threshold of a cross product of two non-normalized vectors etc.
-#define EPSILON 1e-4
+static constexpr double EPSILON = 1e-4;
// Scaling factor for a conversion from coord_t to coordf_t: 10e-6
// This scaling generates a following fixed point representation with for a 32bit integer:
// 0..4294mm with 1nm resolution
// int32_t fits an interval of (-2147.48mm, +2147.48mm)
-#define SCALING_FACTOR 0.000001
+// with int64_t we don't have to worry anymore about the size of the int.
+static constexpr double SCALING_FACTOR = 0.000001;
// RESOLUTION, SCALED_RESOLUTION: Used as an error threshold for a Douglas-Peucker polyline simplification algorithm.
-#define RESOLUTION 0.0125
-#define SCALED_RESOLUTION (RESOLUTION / SCALING_FACTOR)
-#define PI 3.141592653589793238
+static constexpr double RESOLUTION = 0.0125;
+#define SCALED_RESOLUTION (RESOLUTION / SCALING_FACTOR)
+static constexpr double PI = 3.141592653589793238;
// When extruding a closed loop, the loop is interrupted and shortened a bit to reduce the seam.
-#define LOOP_CLIPPING_LENGTH_OVER_NOZZLE_DIAMETER 0.15
+static constexpr double LOOP_CLIPPING_LENGTH_OVER_NOZZLE_DIAMETER = 0.15;
// Maximum perimeter length for the loop to apply the small perimeter speed.
-#define SMALL_PERIMETER_LENGTH (6.5 / SCALING_FACTOR) * 2 * PI
-#define INSET_OVERLAP_TOLERANCE 0.4
+#define SMALL_PERIMETER_LENGTH ((6.5 / SCALING_FACTOR) * 2 * PI)
+static constexpr double INSET_OVERLAP_TOLERANCE = 0.4;
// 3mm ring around the top / bottom / bridging areas.
//FIXME This is quite a lot.
-#define EXTERNAL_INFILL_MARGIN 3.
+static constexpr double EXTERNAL_INFILL_MARGIN = 3.;
//FIXME Better to use an inline function with an explicit return type.
//inline coord_t scale_(coordf_t v) { return coord_t(floor(v / SCALING_FACTOR + 0.5f)); }
#define scale_(val) ((val) / SCALING_FACTOR)
@@ -54,14 +67,6 @@ typedef double coordf_t;
#define SLIC3R_DEBUG_OUT_PATH_PREFIX "out/"
-#if defined(_MSC_VER) && _MSC_VER < 1900
-# define SLIC3R_CONSTEXPR
-# define SLIC3R_NOEXCEPT
-#else
-#define SLIC3R_CONSTEXPR constexpr
-#define SLIC3R_NOEXCEPT noexcept
-#endif
-
inline std::string debug_out_path(const char *name, ...)
{
char buffer[2048];
@@ -72,22 +77,10 @@ inline std::string debug_out_path(const char *name, ...)
return std::string(SLIC3R_DEBUG_OUT_PATH_PREFIX) + std::string(buffer);
}
-#ifdef _MSC_VER
- // Visual Studio older than 2015 does not support the prinf type specifier %zu. Use %Iu instead.
- #define PRINTF_ZU "%Iu"
-#else
- #define PRINTF_ZU "%zu"
-#endif
-
#ifndef UNUSED
#define UNUSED(x) (void)(x)
#endif /* UNUSED */
-// Detect whether the compiler supports C++11 noexcept exception specifications.
-#if defined(_MSC_VER) && _MSC_VER < 1900
- #define noexcept throw()
-#endif
-
// Write slices as SVG images into out directory during the 2D processing of the slices.
// #define SLIC3R_DEBUG_SLICE_PROCESSING
@@ -110,12 +103,6 @@ enum Axis {
NUM_AXES_WITH_UNKNOWN,
};
-template <class T>
-inline void append_to(std::vector<T> &dst, const std::vector<T> &src)
-{
- dst.insert(dst.end(), src.begin(), src.end());
-}
-
template <typename T>
inline void append(std::vector<T>& dest, const std::vector<T>& src)
{
@@ -130,8 +117,34 @@ inline void append(std::vector<T>& dest, std::vector<T>&& src)
{
if (dest.empty())
dest = std::move(src);
- else
+ else {
+ dest.reserve(dest.size() + src.size());
std::move(std::begin(src), std::end(src), std::back_inserter(dest));
+ }
+ src.clear();
+ src.shrink_to_fit();
+}
+
+// Append the source in reverse.
+template <typename T>
+inline void append_reversed(std::vector<T>& dest, const std::vector<T>& src)
+{
+ if (dest.empty())
+ dest = src;
+ else
+ dest.insert(dest.end(), src.rbegin(), src.rend());
+}
+
+// Append the source in reverse.
+template <typename T>
+inline void append_reversed(std::vector<T>& dest, std::vector<T>&& src)
+{
+ if (dest.empty())
+ dest = std::move(src);
+ else {
+ dest.reserve(dest.size() + src.size());
+ std::move(std::rbegin(src), std::rend(src), std::back_inserter(dest));
+ }
src.clear();
src.shrink_to_fit();
}
@@ -171,7 +184,7 @@ inline std::unique_ptr<T> make_unique(Args&&... args) {
// Variant of std::lower_bound() with compare predicate, but without the key.
// This variant is very useful in case that the T type is large or it does not even have a public constructor.
template<class ForwardIt, class LowerThanKeyPredicate>
-ForwardIt lower_bound_by_predicate(ForwardIt first, ForwardIt last, LowerThanKeyPredicate lower_thank_key)
+ForwardIt lower_bound_by_predicate(ForwardIt first, ForwardIt last, LowerThanKeyPredicate lower_than_key)
{
ForwardIt it;
typename std::iterator_traits<ForwardIt>::difference_type count, step;
@@ -181,7 +194,7 @@ ForwardIt lower_bound_by_predicate(ForwardIt first, ForwardIt last, LowerThanKey
it = first;
step = count / 2;
std::advance(it, step);
- if (lower_thank_key(*it)) {
+ if (lower_than_key(*it)) {
first = ++it;
count -= step + 1;
}
@@ -240,6 +253,51 @@ static inline bool is_approx(Number value, Number test_value)
return std::fabs(double(value) - double(test_value)) < double(EPSILON);
}
+// A meta-predicate which is true for integers wider than or equal to coord_t
+template<class I> struct is_scaled_coord
+{
+ static const constexpr bool value =
+ std::is_integral<I>::value &&
+ std::numeric_limits<I>::digits >=
+ std::numeric_limits<coord_t>::digits;
+};
+
+// Meta predicates for floating, 'scaled coord' and generic arithmetic types
+// Can be used to restrict templates to work for only the specified set of types.
+// parameter T is the type we want to restrict
+// parameter O (Optional defaults to T) is the type that the whole expression
+// will be evaluated to.
+// e.g. template<class T> FloatingOnly<T, bool> is_nan(T val);
+// The whole template will be defined only for floating point types and the
+// return type will be bool.
+// For more info how to use, see docs for std::enable_if
+//
+template<class T, class O = T>
+using FloatingOnly = std::enable_if_t<std::is_floating_point<T>::value, O>;
+
+template<class T, class O = T>
+using ScaledCoordOnly = std::enable_if_t<is_scaled_coord<T>::value, O>;
+
+template<class T, class O = T>
+using IntegerOnly = std::enable_if_t<std::is_integral<T>::value, O>;
+
+template<class T, class O = T>
+using ArithmeticOnly = std::enable_if_t<std::is_arithmetic<T>::value, O>;
+
+template<class T, class O = T>
+using IteratorOnly = std::enable_if_t<
+ !std::is_same_v<typename std::iterator_traits<T>::value_type, void>, O
+>;
+
+template<class T, class I, class... Args> // Arbitrary allocator can be used
+IntegerOnly<I, std::vector<T, Args...>> reserve_vector(I capacity)
+{
+ std::vector<T, Args...> ret;
+ if (capacity > I(0)) ret.reserve(size_t(capacity));
+
+ return ret;
+}
+
} // namespace Slic3r
#endif
diff --git a/src/libslic3r/miniz_extension.cpp b/src/libslic3r/miniz_extension.cpp
index 17cc136fc..76b4cb4e5 100644
--- a/src/libslic3r/miniz_extension.cpp
+++ b/src/libslic3r/miniz_extension.cpp
@@ -1,9 +1,17 @@
+#include <exception>
+
#include "miniz_extension.hpp"
#if defined(_MSC_VER) || defined(__MINGW64__)
#include "boost/nowide/cstdio.hpp"
#endif
+#include "I18N.hpp"
+
+//! macro used to mark string used at localization,
+//! return same string
+#define L(s) Slic3r::I18N::translate(s)
+
namespace Slic3r {
namespace {
@@ -68,4 +76,84 @@ bool open_zip_writer(mz_zip_archive *zip, const std::string &fname)
bool close_zip_reader(mz_zip_archive *zip) { return close_zip(zip, true); }
bool close_zip_writer(mz_zip_archive *zip) { return close_zip(zip, false); }
+MZ_Archive::MZ_Archive()
+{
+ mz_zip_zero_struct(&arch);
}
+
+std::string MZ_Archive::get_errorstr(mz_zip_error mz_err)
+{
+ switch (mz_err)
+ {
+ case MZ_ZIP_NO_ERROR:
+ return "no error";
+ case MZ_ZIP_UNDEFINED_ERROR:
+ return L("undefined error");
+ case MZ_ZIP_TOO_MANY_FILES:
+ return L("too many files");
+ case MZ_ZIP_FILE_TOO_LARGE:
+ return L("file too large");
+ case MZ_ZIP_UNSUPPORTED_METHOD:
+ return L("unsupported method");
+ case MZ_ZIP_UNSUPPORTED_ENCRYPTION:
+ return L("unsupported encryption");
+ case MZ_ZIP_UNSUPPORTED_FEATURE:
+ return L("unsupported feature");
+ case MZ_ZIP_FAILED_FINDING_CENTRAL_DIR:
+ return L("failed finding central directory");
+ case MZ_ZIP_NOT_AN_ARCHIVE:
+ return L("not a ZIP archive");
+ case MZ_ZIP_INVALID_HEADER_OR_CORRUPTED:
+ return L("invalid header or archive is corrupted");
+ case MZ_ZIP_UNSUPPORTED_MULTIDISK:
+ return L("unsupported multidisk archive");
+ case MZ_ZIP_DECOMPRESSION_FAILED:
+ return L("decompression failed or archive is corrupted");
+ case MZ_ZIP_COMPRESSION_FAILED:
+ return L("compression failed");
+ case MZ_ZIP_UNEXPECTED_DECOMPRESSED_SIZE:
+ return L("unexpected decompressed size");
+ case MZ_ZIP_CRC_CHECK_FAILED:
+ return L("CRC-32 check failed");
+ case MZ_ZIP_UNSUPPORTED_CDIR_SIZE:
+ return L("unsupported central directory size");
+ case MZ_ZIP_ALLOC_FAILED:
+ return L("allocation failed");
+ case MZ_ZIP_FILE_OPEN_FAILED:
+ return L("file open failed");
+ case MZ_ZIP_FILE_CREATE_FAILED:
+ return L("file create failed");
+ case MZ_ZIP_FILE_WRITE_FAILED:
+ return L("file write failed");
+ case MZ_ZIP_FILE_READ_FAILED:
+ return L("file read failed");
+ case MZ_ZIP_FILE_CLOSE_FAILED:
+ return L("file close failed");
+ case MZ_ZIP_FILE_SEEK_FAILED:
+ return L("file seek failed");
+ case MZ_ZIP_FILE_STAT_FAILED:
+ return L("file stat failed");
+ case MZ_ZIP_INVALID_PARAMETER:
+ return L("invalid parameter");
+ case MZ_ZIP_INVALID_FILENAME:
+ return L("invalid filename");
+ case MZ_ZIP_BUF_TOO_SMALL:
+ return L("buffer too small");
+ case MZ_ZIP_INTERNAL_ERROR:
+ return L("internal error");
+ case MZ_ZIP_FILE_NOT_FOUND:
+ return L("file not found");
+ case MZ_ZIP_ARCHIVE_TOO_LARGE:
+ return L("archive is too large");
+ case MZ_ZIP_VALIDATION_FAILED:
+ return L("validation failed");
+ case MZ_ZIP_WRITE_CALLBACK_FAILED:
+ return L("write calledback failed");
+ default:
+ break;
+ }
+
+ return "unknown error";
+}
+
+} // namespace Slic3r
diff --git a/src/libslic3r/miniz_extension.hpp b/src/libslic3r/miniz_extension.hpp
index 8d0967cbc..006226bf2 100644
--- a/src/libslic3r/miniz_extension.hpp
+++ b/src/libslic3r/miniz_extension.hpp
@@ -11,6 +11,25 @@ bool open_zip_writer(mz_zip_archive *zip, const std::string &fname_utf8);
bool close_zip_reader(mz_zip_archive *zip);
bool close_zip_writer(mz_zip_archive *zip);
-}
+class MZ_Archive {
+public:
+ mz_zip_archive arch;
+
+ MZ_Archive();
+
+ static std::string get_errorstr(mz_zip_error mz_err);
+
+ std::string get_errorstr() const
+ {
+ return get_errorstr(arch.m_last_error) + "!";
+ }
+
+ bool is_alive() const
+ {
+ return arch.m_zip_mode != MZ_ZIP_MODE_WRITING_HAS_BEEN_FINALIZED;
+ }
+};
+
+} // namespace Slic3r
#endif // MINIZ_EXTENSION_HPP
diff --git a/src/libslic3r/pchheader.hpp b/src/libslic3r/pchheader.hpp
index 1339368bd..a1d6da5fe 100644
--- a/src/libslic3r/pchheader.hpp
+++ b/src/libslic3r/pchheader.hpp
@@ -111,6 +111,7 @@
#include "BoundingBox.hpp"
#include "ClipperUtils.hpp"
#include "Config.hpp"
+#include "format.hpp"
#include "I18N.hpp"
#include "MultiPoint.hpp"
#include "Point.hpp"
diff --git a/src/libslic3r/utils.cpp b/src/libslic3r/utils.cpp
index ad91e5239..0c26d42c8 100644
--- a/src/libslic3r/utils.cpp
+++ b/src/libslic3r/utils.cpp
@@ -39,9 +39,9 @@
#include <tbb/task_scheduler_init.h>
-#if defined(__linux) || defined(__GNUC__ )
+#if defined(__linux__) || defined(__GNUC__ )
#include <strings.h>
-#endif /* __linux */
+#endif /* __linux__ */
#ifdef _MSC_VER
#define strcasecmp _stricmp
@@ -417,7 +417,7 @@ std::error_code rename_file(const std::string &from, const std::string &to)
#endif
}
-CopyFileResult copy_file_inner(const std::string& from, const std::string& to)
+CopyFileResult copy_file_inner(const std::string& from, const std::string& to, std::string& error_message)
{
const boost::filesystem::path source(from);
const boost::filesystem::path target(to);
@@ -431,18 +431,25 @@ CopyFileResult copy_file_inner(const std::string& from, const std::string& to)
// or when the target file doesn't exist.
boost::system::error_code ec;
boost::filesystem::permissions(target, perms, ec);
+ if (ec)
+ BOOST_LOG_TRIVIAL(debug) << "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();
boost::filesystem::permissions(target, perms, ec);
+ if (ec)
+ BOOST_LOG_TRIVIAL(debug) << "boost::filesystem::permisions after copy error message (this could be irrelevant message based on file system): " << ec.message();
return SUCCESS;
}
-CopyFileResult copy_file(const std::string &from, const std::string &to, const bool with_check)
+CopyFileResult copy_file(const std::string &from, const std::string &to, std::string& error_message, const bool with_check)
{
std::string to_temp = to + ".tmp";
- CopyFileResult ret_val = copy_file_inner(from,to_temp);
+ CopyFileResult ret_val = copy_file_inner(from, to_temp, error_message);
if(ret_val == SUCCESS)
{
if (with_check)
@@ -515,6 +522,12 @@ bool is_idx_file(const boost::filesystem::directory_entry &dir_entry)
return is_plain_file(dir_entry) && strcasecmp(dir_entry.path().extension().string().c_str(), ".idx") == 0;
}
+bool is_gcode_file(const std::string &path)
+{
+ return boost::iends_with(path, ".gcode") || boost::iends_with(path, ".gco") ||
+ boost::iends_with(path, ".g") || boost::iends_with(path, ".ngc");
+}
+
} // namespace Slic3r
#ifdef WIN32
@@ -545,6 +558,7 @@ std::string encode_path(const char *src)
}
// Encode an 8-bit string from a local code page to UTF-8.
+// Multibyte to utf8
std::string decode_path(const char *src)
{
#ifdef WIN32
@@ -604,7 +618,12 @@ std::string string_printf(const char *format, ...)
std::string header_slic3r_generated()
{
- return std::string("generated by " SLIC3R_APP_NAME " " SLIC3R_VERSION " on " ) + Utils::utc_timestamp();
+ return std::string("generated by " SLIC3R_APP_NAME " " SLIC3R_VERSION " on " ) + Utils::utc_timestamp();
+}
+
+std::string header_gcodeviewer_generated()
+{
+ return std::string("generated by " GCODEVIEWER_APP_NAME " " SLIC3R_VERSION " on ") + Utils::utc_timestamp();
}
unsigned get_current_pid()
diff --git a/src/platform/msw/PrusaSlicer-gcodeviewer.rc.in b/src/platform/msw/PrusaSlicer-gcodeviewer.rc.in
new file mode 100644
index 000000000..eed737cb7
--- /dev/null
+++ b/src/platform/msw/PrusaSlicer-gcodeviewer.rc.in
@@ -0,0 +1,25 @@
+1 VERSIONINFO
+FILEVERSION @SLIC3R_RC_VERSION@
+PRODUCTVERSION @SLIC3R_RC_VERSION@
+{
+ BLOCK "StringFileInfo"
+ {
+ BLOCK "040904E4"
+ {
+ VALUE "CompanyName", "Prusa Research"
+ VALUE "FileDescription", "@SLIC3R_APP_NAME@ G-code Viewer"
+ VALUE "FileVersion", "@SLIC3R_BUILD_ID@"
+ VALUE "ProductName", "@SLIC3R_APP_NAME@ G-code Viewer"
+ VALUE "ProductVersion", "@SLIC3R_BUILD_ID@"
+ VALUE "InternalName", "@SLIC3R_APP_NAME@ G-code Viewer"
+ VALUE "LegalCopyright", "Copyright \251 2016-2020 Prusa Research, \251 2011-2018 Alessandro Ranellucci"
+ VALUE "OriginalFilename", "prusa-gcodeviewer.exe"
+ }
+ }
+ BLOCK "VarFileInfo"
+ {
+ VALUE "Translation", 0x409, 1252
+ }
+}
+2 ICON "@SLIC3R_RESOURCES_DIR@/icons/PrusaSlicer-gcodeviewer.ico"
+1 24 "PrusaSlicer.manifest"
diff --git a/src/platform/msw/PrusaSlicer.rc.in b/src/platform/msw/PrusaSlicer.rc.in
index fb75305c8..a4520c6d7 100644
--- a/src/platform/msw/PrusaSlicer.rc.in
+++ b/src/platform/msw/PrusaSlicer.rc.in
@@ -12,7 +12,7 @@ PRODUCTVERSION @SLIC3R_RC_VERSION@
VALUE "ProductName", "@SLIC3R_APP_NAME@"
VALUE "ProductVersion", "@SLIC3R_BUILD_ID@"
VALUE "InternalName", "@SLIC3R_APP_NAME@"
- VALUE "LegalCopyright", "Copyright \251 2016-2020 Prusa Research, \251 2011-2018 Alessandro Ranelucci"
+ VALUE "LegalCopyright", "Copyright \251 2016-2020 Prusa Research, \251 2011-2018 Alessandro Ranellucci"
VALUE "OriginalFilename", "prusa-slicer.exe"
}
}
diff --git a/src/platform/osx/Info.plist.in b/src/platform/osx/Info.plist.in
index fc4b6a875..e922b23f5 100644
--- a/src/platform/osx/Info.plist.in
+++ b/src/platform/osx/Info.plist.in
@@ -103,7 +103,7 @@
<key>CFBundleTypeName</key>
<string>GCODE</string>
<key>CFBundleTypeRole</key>
- <string>Editor</string>
+ <string>Viewer</string>
<key>LISsAppleDefaultForType</key>
<true/>
<key>LSHandlerRank</key>
diff --git a/src/platform/unix/PrusaGcodeviewer.desktop b/src/platform/unix/PrusaGcodeviewer.desktop
new file mode 100644
index 000000000..f878e92d3
--- /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-gcodeviewer
+Terminal=false
+Type=Application
+MimeType=text/x.gcode;
+Categories=Graphics;3DGraphics;
+Keywords=3D;Printing;Slicer;
diff --git a/src/platform/unix/PrusaSlicer.desktop b/src/platform/unix/PrusaSlicer.desktop
new file mode 100644
index 000000000..ead8539ee
--- /dev/null
+++ b/src/platform/unix/PrusaSlicer.desktop
@@ -0,0 +1,12 @@
+[Desktop Entry]
+Name=PrusaSlicer
+GenericName=3D Printing Software
+Icon=PrusaSlicer
+Exec=prusa-slicer %F
+Terminal=false
+Type=Application
+MimeType=model/stl;application/vnd.ms-3mfdocument;application/prs.wavefront-obj;application/x-amf;
+Categories=Graphics;3DGraphics;Engineering;
+Keywords=3D;Printing;Slicer;slice;3D;printer;convert;gcode;stl;obj;amf;SLA
+StartupNotify=false
+StartupWMClass=prusa-slicer
diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt
index 5e0c34da0..e040de727 100644
--- a/src/slic3r/CMakeLists.txt
+++ b/src/slic3r/CMakeLists.txt
@@ -1,4 +1,4 @@
-cmake_minimum_required(VERSION 3.8)
+cmake_minimum_required(VERSION 3.13)
project(libslic3r_gui)
include(PrecompiledHeader)
@@ -12,8 +12,6 @@ set(SLIC3R_GUI_SOURCES
GUI/SysInfoDialog.hpp
GUI/KBShortcutsDialog.cpp
GUI/KBShortcutsDialog.hpp
- GUI/AppConfig.cpp
- GUI/AppConfig.hpp
GUI/BackgroundSlicingProcess.cpp
GUI/BackgroundSlicingProcess.hpp
GUI/BitmapCache.cpp
@@ -22,17 +20,21 @@ set(SLIC3R_GUI_SOURCES
GUI/ConfigSnapshotDialog.hpp
GUI/3DScene.cpp
GUI/3DScene.hpp
+ GUI/format.hpp
+ GUI/GLShadersManager.hpp
+ GUI/GLShadersManager.cpp
GUI/GLShader.cpp
GUI/GLShader.hpp
GUI/GLCanvas3D.hpp
GUI/GLCanvas3D.cpp
- GUI/GLCanvas3DManager.hpp
- GUI/GLCanvas3DManager.cpp
+ GUI/OpenGLManager.hpp
+ GUI/OpenGLManager.cpp
GUI/Selection.hpp
GUI/Selection.cpp
- GUI/Gizmos/GLGizmos.hpp
GUI/Gizmos/GLGizmosManager.cpp
GUI/Gizmos/GLGizmosManager.hpp
+ GUI/Gizmos/GLGizmosCommon.cpp
+ GUI/Gizmos/GLGizmosCommon.hpp
GUI/Gizmos/GLGizmoBase.cpp
GUI/Gizmos/GLGizmoBase.hpp
GUI/Gizmos/GLGizmoMove.cpp
@@ -43,28 +45,36 @@ set(SLIC3R_GUI_SOURCES
GUI/Gizmos/GLGizmoScale.hpp
GUI/Gizmos/GLGizmoSlaSupports.cpp
GUI/Gizmos/GLGizmoSlaSupports.hpp
+ GUI/Gizmos/GLGizmoFdmSupports.cpp
+ GUI/Gizmos/GLGizmoFdmSupports.hpp
GUI/Gizmos/GLGizmoFlatten.cpp
GUI/Gizmos/GLGizmoFlatten.hpp
GUI/Gizmos/GLGizmoCut.cpp
GUI/Gizmos/GLGizmoCut.hpp
GUI/Gizmos/GLGizmoHollow.cpp
GUI/Gizmos/GLGizmoHollow.hpp
+ GUI/Gizmos/GLGizmoPainterBase.cpp
+ GUI/Gizmos/GLGizmoPainterBase.hpp
+ GUI/Gizmos/GLGizmoSeam.cpp
+ GUI/Gizmos/GLGizmoSeam.hpp
GUI/GLSelectionRectangle.cpp
GUI/GLSelectionRectangle.hpp
+ GUI/GLModel.hpp
+ GUI/GLModel.cpp
GUI/GLTexture.hpp
GUI/GLTexture.cpp
GUI/GLToolbar.hpp
GUI/GLToolbar.cpp
+ GUI/GCodeViewer.hpp
+ GUI/GCodeViewer.cpp
GUI/Preferences.cpp
GUI/Preferences.hpp
- GUI/Preset.cpp
- GUI/Preset.hpp
- GUI/PresetBundle.cpp
- GUI/PresetBundle.hpp
GUI/PresetHints.cpp
GUI/PresetHints.hpp
GUI/GUI.cpp
GUI/GUI.hpp
+ GUI/GUI_Init.cpp
+ GUI/GUI_Init.hpp
GUI/GUI_Preview.cpp
GUI/GUI_Preview.hpp
GUI/GUI_App.cpp
@@ -77,6 +87,12 @@ set(SLIC3R_GUI_SOURCES
GUI/MainFrame.hpp
GUI/Plater.cpp
GUI/Plater.hpp
+ GUI/PresetComboBoxes.hpp
+ GUI/PresetComboBoxes.cpp
+ GUI/SavePresetDialog.hpp
+ GUI/SavePresetDialog.cpp
+ GUI/PhysicalPrinterDialog.hpp
+ GUI/PhysicalPrinterDialog.cpp
GUI/GUI_ObjectList.cpp
GUI/GUI_ObjectList.hpp
GUI/GUI_ObjectManipulation.cpp
@@ -85,8 +101,6 @@ set(SLIC3R_GUI_SOURCES
GUI/GUI_ObjectSettings.hpp
GUI/GUI_ObjectLayers.cpp
GUI/GUI_ObjectLayers.hpp
- GUI/LambdaObjectDialog.cpp
- GUI/LambdaObjectDialog.hpp
GUI/MeshUtils.cpp
GUI/MeshUtils.hpp
GUI/Tab.cpp
@@ -97,6 +111,8 @@ set(SLIC3R_GUI_SOURCES
GUI/Field.hpp
GUI/OptionsGroup.cpp
GUI/OptionsGroup.hpp
+ GUI/OG_CustomCtrl.cpp
+ GUI/OG_CustomCtrl.hpp
GUI/BedShapeDialog.cpp
GUI/BedShapeDialog.hpp
GUI/2DBed.cpp
@@ -138,18 +154,37 @@ set(SLIC3R_GUI_SOURCES
GUI/UpdateDialogs.hpp
GUI/FirmwareDialog.cpp
GUI/FirmwareDialog.hpp
- GUI/ProgressIndicator.hpp
- GUI/ProgressStatusBar.hpp
- GUI/ProgressStatusBar.cpp
GUI/PrintHostDialogs.cpp
GUI/PrintHostDialogs.hpp
- GUI/Job.hpp
+ GUI/Jobs/Job.hpp
+ GUI/Jobs/Job.cpp
+ GUI/Jobs/ArrangeJob.hpp
+ GUI/Jobs/ArrangeJob.cpp
+ GUI/Jobs/RotoptimizeJob.hpp
+ GUI/Jobs/RotoptimizeJob.cpp
+ GUI/Jobs/FillBedJob.hpp
+ GUI/Jobs/FillBedJob.cpp
+ GUI/Jobs/SLAImportJob.hpp
+ GUI/Jobs/SLAImportJob.cpp
+ GUI/Jobs/ProgressIndicator.hpp
+ GUI/ProgressStatusBar.hpp
+ GUI/ProgressStatusBar.cpp
GUI/Mouse3DController.cpp
GUI/Mouse3DController.hpp
GUI/DoubleSlider.cpp
GUI/DoubleSlider.hpp
GUI/ObjectDataViewModel.cpp
GUI/ObjectDataViewModel.hpp
+ GUI/InstanceCheck.cpp
+ GUI/InstanceCheck.hpp
+ GUI/Search.cpp
+ GUI/Search.hpp
+ GUI/NotificationManager.cpp
+ GUI/NotificationManager.hpp
+ GUI/UnsavedChangesDialog.cpp
+ GUI/UnsavedChangesDialog.hpp
+ GUI/ExtraRenderers.cpp
+ GUI/ExtraRenderers.hpp
Utils/Http.cpp
Utils/Http.hpp
Utils/FixModelByWin10.cpp
@@ -162,17 +197,21 @@ set(SLIC3R_GUI_SOURCES
Utils/FlashAir.hpp
Utils/AstroBox.cpp
Utils/AstroBox.hpp
+ Utils/Repetier.cpp
+ Utils/Repetier.hpp
Utils/PrintHost.cpp
Utils/PrintHost.hpp
Utils/Bonjour.cpp
Utils/Bonjour.hpp
Utils/PresetUpdater.cpp
Utils/PresetUpdater.hpp
+ Utils/Process.cpp
+ Utils/Process.hpp
+ Utils/Profile.hpp
Utils/UndoRedo.cpp
Utils/UndoRedo.hpp
Utils/HexFile.cpp
Utils/HexFile.hpp
- Utils/Thread.hpp
)
if (APPLE)
@@ -182,6 +221,8 @@ if (APPLE)
GUI/RemovableDriveManagerMM.mm
GUI/RemovableDriveManagerMM.h
GUI/Mouse3DHandlerMac.mm
+ GUI/InstanceCheckMac.mm
+ GUI/InstanceCheckMac.h
)
FIND_LIBRARY(DISKARBITRATION_LIBRARY DiskArbitration)
@@ -193,10 +234,33 @@ encoding_check(libslic3r_gui)
target_link_libraries(libslic3r_gui libslic3r avrdude cereal imgui GLEW::GLEW OpenGL::GL OpenGL::GLU hidapi libcurl ${wxWidgets_LIBRARIES})
+if (CMAKE_SYSTEM_NAME STREQUAL "Linux")
+ target_link_libraries(libslic3r_gui ${DBUS_LIBRARIES})
+endif()
+
+if (SLIC3R_STATIC)
+ # FIXME: This was previously exported by wx-config but the wxWidgets
+ # cmake build forgets this and the build fails in debug mode (or on raspberry release)
+ target_compile_definitions(libslic3r_gui PUBLIC -DwxDEBUG_LEVEL=0)
+endif()
+
if(APPLE)
target_link_libraries(libslic3r_gui ${DISKARBITRATION_LIBRARY})
endif()
+if (SLIC3R_STATIC AND UNIX AND NOT APPLE)
+ target_compile_definitions(libslic3r_gui PRIVATE OPENSSL_CERT_OVERRIDE)
+endif ()
+
if (SLIC3R_PCH AND NOT SLIC3R_SYNTAXONLY)
add_precompiled_header(libslic3r_gui pchheader.hpp FORCEINCLUDE)
endif ()
+
+# We need to implement some hacks for wxWidgets and touch the underlying GTK
+# layer and sub-libraries. This forces us to use the include locations and
+# link these libraries.
+if (UNIX AND NOT APPLE)
+ find_package(GTK${SLIC3R_GTK} REQUIRED)
+ target_include_directories(libslic3r_gui PRIVATE ${GTK${SLIC3R_GTK}_INCLUDE_DIRS})
+ target_link_libraries(libslic3r_gui ${GTK${SLIC3R_GTK}_LIBRARIES})
+endif ()
diff --git a/src/slic3r/Config/Snapshot.cpp b/src/slic3r/Config/Snapshot.cpp
index fa756f49d..900172d3e 100644
--- a/src/slic3r/Config/Snapshot.cpp
+++ b/src/slic3r/Config/Snapshot.cpp
@@ -1,16 +1,15 @@
#include "Snapshot.hpp"
-#include "../GUI/AppConfig.hpp"
-#include "../GUI/PresetBundle.hpp"
#include <time.h>
#include <boost/algorithm/string/predicate.hpp>
-#include <boost/algorithm/string/trim.hpp>
#include <boost/nowide/cstdio.hpp>
#include <boost/nowide/fstream.hpp>
#include <boost/property_tree/ini_parser.hpp>
-#include <boost/property_tree/ptree.hpp>
+#include <boost/property_tree/ptree_fwd.hpp>
+#include <boost/filesystem/operations.hpp>
+#include "libslic3r/PresetBundle.hpp"
#include "libslic3r/libslic3r.h"
#include "libslic3r/Time.hpp"
#include "libslic3r/Config.hpp"
@@ -32,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)
@@ -95,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) {
@@ -102,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()) {
@@ -173,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) {
@@ -200,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
@@ -218,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
{
@@ -244,16 +260,18 @@ 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<std::string> files1, files2;
- for (auto &dir_entry : boost::filesystem::directory_iterator(path1))
- if (Slic3r::is_ini_file(dir_entry))
- files1.emplace_back(dir_entry.path().filename().string());
- for (auto &dir_entry : boost::filesystem::directory_iterator(path2))
- if (Slic3r::is_ini_file(dir_entry))
- files2.emplace_back(dir_entry.path().filename().string());
+ if (boost::filesystem::is_directory(path1))
+ for (auto &dir_entry : boost::filesystem::directory_iterator(path1))
+ if (Slic3r::is_ini_file(dir_entry))
+ files1.emplace_back(dir_entry.path().filename().string());
+ if (boost::filesystem::is_directory(path2))
+ for (auto &dir_entry : boost::filesystem::directory_iterator(path2))
+ if (Slic3r::is_ini_file(dir_entry))
+ files2.emplace_back(dir_entry.path().filename().string());
std::sort(files1.begin(), files1.end());
std::sort(files2.begin(), files2.end());
if (files1 != files2)
@@ -316,7 +334,7 @@ size_t SnapshotDB::load_db()
// Sort the snapshots by their date/time.
std::sort(m_snapshots.begin(), m_snapshots.end(), [](const Snapshot &s1, const Snapshot &s2) { return s1.time_captured < s2.time_captured; });
if (! errors_cummulative.empty())
- throw std::runtime_error(errors_cummulative);
+ throw Slic3r::RuntimeError(errors_cummulative);
return m_snapshots.size();
}
@@ -340,7 +358,7 @@ static void copy_config_dir_single_level(const boost::filesystem::path &path_src
{
if (! boost::filesystem::is_directory(path_dst) &&
! boost::filesystem::create_directory(path_dst))
- throw std::runtime_error(std::string("Slic3r was unable to create a directory at ") + path_dst.string());
+ throw Slic3r::RuntimeError(std::string("Slic3r was unable to create a directory at ") + path_dst.string());
for (auto &dir_entry : boost::filesystem::directory_iterator(path_src))
if (Slic3r::is_ini_file(dir_entry))
@@ -370,9 +388,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);
@@ -415,7 +436,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);
@@ -430,7 +451,7 @@ const Snapshot& SnapshotDB::restore_snapshot(const std::string &id, AppConfig &a
this->restore_snapshot(snapshot, app_config);
return snapshot;
}
- throw std::runtime_error(std::string("Snapshot with id " + id + " was not found."));
+ throw Slic3r::RuntimeError(std::string("Snapshot with id " + id + " was not found."));
}
void SnapshotDB::restore_snapshot(const Snapshot &snapshot, AppConfig &app_config)
@@ -439,11 +460,14 @@ 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" }) {
- delete_existing_ini_files(data_dir / subdir);
- copy_config_dir_single_level(snapshot_dir / subdir, data_dir / subdir);
+ for (const char *subdir : snapshot_subdirs) {
+ boost::filesystem::path src = snapshot_dir / subdir;
+ boost::filesystem::path dst = data_dir / subdir;
+ delete_existing_ini_files(dst);
+ if (boost::filesystem::is_directory(src))
+ copy_config_dir_single_level(src, dst);
}
- // 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);
@@ -502,7 +526,7 @@ boost::filesystem::path SnapshotDB::create_db_dir()
subdir.make_preferred();
if (! boost::filesystem::is_directory(subdir) &&
! boost::filesystem::create_directory(subdir))
- throw std::runtime_error(std::string("Slic3r was unable to create a directory at ") + subdir.string());
+ throw Slic3r::RuntimeError(std::string("Slic3r was unable to create a directory at ") + subdir.string());
}
return snapshots_dir;
}
diff --git a/src/slic3r/Config/Snapshot.hpp b/src/slic3r/Config/Snapshot.hpp
index 9a7391691..48add8a1a 100644
--- a/src/slic3r/Config/Snapshot.hpp
+++ b/src/slic3r/Config/Snapshot.hpp
@@ -6,7 +6,7 @@
#include <string>
#include <vector>
-#include <boost/filesystem.hpp>
+#include <boost/filesystem/path.hpp>
#include "libslic3r/Semver.hpp"
#include "Version.hpp"
@@ -18,14 +18,16 @@ class AppConfig;
namespace GUI {
namespace Config {
-class Index;
// A snapshot contains:
// Slic3r.ini
// vendor/
// print/
+// sla_print/
// filament/
+// sla_material
// printer/
+// physical_printer/
class Snapshot
{
public:
@@ -43,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;
@@ -66,8 +68,11 @@ public:
// Active presets at the time of the snapshot.
std::string print;
+ std::string sla_print;
std::vector<std::string> 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
@@ -98,7 +103,7 @@ public:
size_t load_db();
void update_slic3r_versions(std::vector<Index> &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/Config/Version.cpp b/src/slic3r/Config/Version.cpp
index 2d036e9f3..04ce05ab5 100644
--- a/src/slic3r/Config/Version.cpp
+++ b/src/slic3r/Config/Version.cpp
@@ -2,8 +2,7 @@
#include <cctype>
-#include <boost/algorithm/string/predicate.hpp>
-#include <boost/algorithm/string/trim.hpp>
+#include <boost/filesystem/operations.hpp>
#include <boost/nowide/fstream.hpp>
#include "libslic3r/libslic3r.h"
@@ -325,7 +324,7 @@ std::vector<Index> Index::load_db()
}
if (! errors_cummulative.empty())
- throw std::runtime_error(errors_cummulative);
+ throw Slic3r::RuntimeError(errors_cummulative);
return index_db;
}
diff --git a/src/slic3r/Config/Version.hpp b/src/slic3r/Config/Version.hpp
index 881b856ff..8249573de 100644
--- a/src/slic3r/Config/Version.hpp
+++ b/src/slic3r/Config/Version.hpp
@@ -4,7 +4,7 @@
#include <string>
#include <vector>
-#include <boost/filesystem.hpp>
+#include <boost/filesystem/path.hpp>
#include "libslic3r/FileParserError.hpp"
#include "libslic3r/Semver.hpp"
@@ -54,7 +54,7 @@ struct Version
class Index
{
public:
- typedef std::vector<Version>::const_iterator const_iterator;
+ typedef std::vector<Version>::const_iterator const_iterator;
// Read a config index file in the simple format described in the Index class comment.
// Throws Slic3r::file_parser_error and the standard std file access exceptions.
size_t load(const boost::filesystem::path &path);
diff --git a/src/slic3r/GUI/2DBed.cpp b/src/slic3r/GUI/2DBed.cpp
index d2075f673..ea6720356 100644
--- a/src/slic3r/GUI/2DBed.cpp
+++ b/src/slic3r/GUI/2DBed.cpp
@@ -87,7 +87,7 @@ void Bed_2D::repaint(const std::vector<Vec2d>& shape)
for (auto y = bb.min(1) - fmod(bb.min(1), step) + step; y < bb.max(1); y += step) {
polylines.push_back(Polyline::new_scale({ Vec2d(bb.min(0), y), Vec2d(bb.max(0), y) }));
}
- polylines = intersection_pl(polylines, bed_polygon);
+ polylines = intersection_pl(polylines, (Polygons)bed_polygon);
dc.SetPen(wxPen(wxColour(230, 230, 230), 1, wxPENSTYLE_SOLID));
for (auto pl : polylines)
@@ -166,4 +166,4 @@ void Bed_2D::set_pos(const Vec2d& pos)
}
} // GUI
-} // Slic3r \ No newline at end of file
+} // Slic3r
diff --git a/src/slic3r/GUI/3DBed.cpp b/src/slic3r/GUI/3DBed.cpp
index 23acd18ef..4277aeb36 100644
--- a/src/slic3r/GUI/3DBed.cpp
+++ b/src/slic3r/GUI/3DBed.cpp
@@ -5,16 +5,18 @@
#include "libslic3r/Polygon.hpp"
#include "libslic3r/ClipperUtils.hpp"
#include "libslic3r/BoundingBox.hpp"
+#include "libslic3r/Geometry.hpp"
#include "GUI_App.hpp"
-#include "PresetBundle.hpp"
-#include "Gizmos/GLGizmoBase.hpp"
+#include "libslic3r/PresetBundle.hpp"
#include "GLCanvas3D.hpp"
+#include "3DScene.hpp"
#include <GL/glew.h>
#include <boost/algorithm/string/predicate.hpp>
#include <boost/filesystem/operations.hpp>
+#include <boost/log/trivial.hpp>
static const float GROUND_Z = -0.02f;
@@ -37,10 +39,8 @@ bool GeometryBuffer::set_from_triangles(const Polygons& triangles, float z, bool
float max_y = min_y;
unsigned int v_count = 0;
- for (const Polygon& t : triangles)
- {
- for (unsigned int i = 0; i < 3; ++i)
- {
+ for (const Polygon& t : triangles) {
+ for (unsigned int i = 0; i < 3; ++i) {
Vertex& v = m_vertices[v_count];
const Point& p = t.points[i];
@@ -51,8 +51,7 @@ bool GeometryBuffer::set_from_triangles(const Polygons& triangles, float z, bool
v.position[1] = y;
v.position[2] = z;
- if (generate_tex_coords)
- {
+ if (generate_tex_coords) {
v.tex_coords[0] = x;
v.tex_coords[1] = y;
@@ -66,17 +65,14 @@ bool GeometryBuffer::set_from_triangles(const Polygons& triangles, float z, bool
}
}
- if (generate_tex_coords)
- {
+ if (generate_tex_coords) {
float size_x = max_x - min_x;
float size_y = max_y - min_y;
- if ((size_x != 0.0f) && (size_y != 0.0f))
- {
+ if ((size_x != 0.0f) && (size_y != 0.0f)) {
float inv_size_x = 1.0f / size_x;
float inv_size_y = -1.0f / size_y;
- for (Vertex& v : m_vertices)
- {
+ for (Vertex& v : m_vertices) {
v.tex_coords[0] = (v.tex_coords[0] - min_x) * inv_size_x;
v.tex_coords[1] = (v.tex_coords[1] - min_y) * inv_size_y;
}
@@ -97,8 +93,7 @@ bool GeometryBuffer::set_from_lines(const Lines& lines, float z)
m_vertices = std::vector<Vertex>(v_size, Vertex());
unsigned int v_count = 0;
- for (const Line& l : lines)
- {
+ for (const Line& l : lines) {
Vertex& v1 = m_vertices[v_count];
v1.position[0] = unscale<float>(l.a(0));
v1.position[1] = unscale<float>(l.a(1));
@@ -120,71 +115,54 @@ const float* GeometryBuffer::get_vertices_data() const
return (m_vertices.size() > 0) ? (const float*)m_vertices.data() : nullptr;
}
-const double Bed3D::Axes::Radius = 0.5;
-const double Bed3D::Axes::ArrowBaseRadius = 2.5 * Bed3D::Axes::Radius;
-const double Bed3D::Axes::ArrowLength = 5.0;
-
-Bed3D::Axes::Axes()
-: origin(Vec3d::Zero())
-, length(25.0 * Vec3d::Ones())
-{
- m_quadric = ::gluNewQuadric();
- if (m_quadric != nullptr)
- ::gluQuadricDrawStyle(m_quadric, GLU_FILL);
-}
+const float Bed3D::Axes::DefaultStemRadius = 0.5f;
+const float Bed3D::Axes::DefaultStemLength = 25.0f;
+const float Bed3D::Axes::DefaultTipRadius = 2.5f * Bed3D::Axes::DefaultStemRadius;
+const float Bed3D::Axes::DefaultTipLength = 5.0f;
-Bed3D::Axes::~Axes()
+void Bed3D::Axes::set_stem_length(float length)
{
- if (m_quadric != nullptr)
- ::gluDeleteQuadric(m_quadric);
+ m_stem_length = length;
+ m_arrow.reset();
}
void Bed3D::Axes::render() const
{
- if (m_quadric == nullptr)
+ auto render_axis = [this](const Transform3f& transform) {
+ glsafe(::glPushMatrix());
+ glsafe(::glMultMatrixf(transform.data()));
+ m_arrow.render();
+ glsafe(::glPopMatrix());
+ };
+
+ m_arrow.init_from(stilized_arrow(16, DefaultTipRadius, DefaultTipLength, DefaultStemRadius, m_stem_length));
+
+ GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light");
+ if (shader == nullptr)
return;
glsafe(::glEnable(GL_DEPTH_TEST));
- glsafe(::glEnable(GL_LIGHTING));
+
+ shader->start_using();
// x axis
- glsafe(::glColor3fv(AXES_COLOR[0]));
- glsafe(::glPushMatrix());
- glsafe(::glTranslated(origin(0), origin(1), origin(2)));
- glsafe(::glRotated(90.0, 0.0, 1.0, 0.0));
- render_axis(length(0));
- glsafe(::glPopMatrix());
+ std::array<float, 4> color = { 0.75f, 0.0f, 0.0f, 1.0f };
+ shader->set_uniform("uniform_color", color);
+ render_axis(Geometry::assemble_transform(m_origin, { 0.0, 0.5 * M_PI, 0.0f }).cast<float>());
// y axis
- glsafe(::glColor3fv(AXES_COLOR[1]));
- glsafe(::glPushMatrix());
- glsafe(::glTranslated(origin(0), origin(1), origin(2)));
- glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0));
- render_axis(length(1));
- glsafe(::glPopMatrix());
+ color = { 0.0f, 0.75f, 0.0f, 1.0f };
+ shader->set_uniform("uniform_color", color);
+ render_axis(Geometry::assemble_transform(m_origin, { -0.5 * M_PI, 0.0, 0.0f }).cast<float>());
// z axis
- glsafe(::glColor3fv(AXES_COLOR[2]));
- glsafe(::glPushMatrix());
- glsafe(::glTranslated(origin(0), origin(1), origin(2)));
- render_axis(length(2));
- glsafe(::glPopMatrix());
+ color = { 0.0f, 0.0f, 0.75f, 1.0f };
+ shader->set_uniform("uniform_color", color);
+ render_axis(Geometry::assemble_transform(m_origin).cast<float>());
- glsafe(::glDisable(GL_LIGHTING));
- glsafe(::glDisable(GL_DEPTH_TEST));
-}
+ shader->stop_using();
-void Bed3D::Axes::render_axis(double length) const
-{
- ::gluQuadricOrientation(m_quadric, GLU_OUTSIDE);
- ::gluCylinder(m_quadric, Radius, Radius, length, 32, 1);
- ::gluQuadricOrientation(m_quadric, GLU_INSIDE);
- ::gluDisk(m_quadric, 0.0, Radius, 32, 1);
- glsafe(::glTranslated(0.0, 0.0, length));
- ::gluQuadricOrientation(m_quadric, GLU_OUTSIDE);
- ::gluCylinder(m_quadric, ArrowBaseRadius, 0.0, ArrowLength, 32, 1);
- ::gluQuadricOrientation(m_quadric, GLU_INSIDE);
- ::gluDisk(m_quadric, 0.0, ArrowBaseRadius, 32, 1);
+ glsafe(::glDisable(GL_DEPTH_TEST));
}
Bed3D::Bed3D()
@@ -194,7 +172,7 @@ Bed3D::Bed3D()
{
}
-bool Bed3D::set_shape(const Pointfs& shape, const std::string& custom_texture, const std::string& custom_model)
+bool Bed3D::set_shape(const Pointfs& shape, const std::string& custom_texture, const std::string& custom_model, bool force_as_custom)
{
auto check_texture = [](const std::string& texture) {
return !texture.empty() && (boost::algorithm::iends_with(texture, ".png") || boost::algorithm::iends_with(texture, ".svg")) && boost::filesystem::exists(texture);
@@ -204,30 +182,39 @@ bool Bed3D::set_shape(const Pointfs& shape, const std::string& custom_texture, c
return !model.empty() && boost::algorithm::iends_with(model, ".stl") && boost::filesystem::exists(model);
};
- auto [new_type, system_model, system_texture] = detect_type(shape);
+ EType type;
+ std::string model;
+ std::string texture;
+ if (force_as_custom)
+ type = Custom;
+ else {
+ auto [new_type, system_model, system_texture] = detect_type(shape);
+ type = new_type;
+ model = system_model;
+ texture = system_texture;
+ }
- std::string texture_filename = custom_texture.empty() ? system_texture : custom_texture;
+ std::string texture_filename = custom_texture.empty() ? texture : custom_texture;
if (!check_texture(texture_filename))
texture_filename.clear();
- std::string model_filename = custom_model.empty() ? system_model : custom_model;
+ std::string model_filename = custom_model.empty() ? model : custom_model;
if (!check_model(model_filename))
model_filename.clear();
- if ((m_shape == shape) && (m_type == new_type) && (m_texture_filename == texture_filename) && (m_model_filename == model_filename))
+ if (m_shape == shape && m_type == type && m_texture_filename == texture_filename && m_model_filename == model_filename)
// No change, no need to update the UI.
return false;
m_shape = shape;
m_texture_filename = texture_filename;
m_model_filename = model_filename;
- m_type = new_type;
+ m_type = type;
calc_bounding_boxes();
ExPolygon poly;
- for (const Vec2d& p : m_shape)
- {
+ for (const Vec2d& p : m_shape) {
poly.contour.append(Point(scale_(p(0)), scale_(p(1))));
}
@@ -243,8 +230,8 @@ bool Bed3D::set_shape(const Pointfs& shape, const std::string& custom_texture, c
m_model.reset();
// Set the origin and size for rendering the coordinate system axes.
- m_axes.origin = Vec3d(0.0, 0.0, (double)GROUND_Z);
- m_axes.length = 0.1 * m_bounding_box.max_size() * Vec3d::Ones();
+ m_axes.set_origin({ 0.0, 0.0, static_cast<double>(GROUND_Z) });
+ m_axes.set_stem_length(0.1f * static_cast<float>(m_bounding_box.max_size()));
// Let the calee to update the UI.
return true;
@@ -260,7 +247,8 @@ Point Bed3D::point_projection(const Point& point) const
return m_polygon.point_projection(point);
}
-void Bed3D::render(GLCanvas3D& canvas, bool bottom, float scale_factor, bool show_axes) const
+void Bed3D::render(GLCanvas3D& canvas, bool bottom, float scale_factor,
+ bool show_axes, bool show_texture) const
{
m_scale_factor = scale_factor;
@@ -271,9 +259,9 @@ void Bed3D::render(GLCanvas3D& canvas, bool bottom, float scale_factor, bool sho
switch (m_type)
{
- case System: { render_system(canvas, bottom); break; }
+ case System: { render_system(canvas, bottom, show_texture); break; }
default:
- case Custom: { render_custom(canvas, bottom); break; }
+ case Custom: { render_custom(canvas, bottom, show_texture); break; }
}
glsafe(::glDisable(GL_DEPTH_TEST));
@@ -282,25 +270,28 @@ void Bed3D::render(GLCanvas3D& canvas, bool bottom, float scale_factor, bool sho
void Bed3D::calc_bounding_boxes() const
{
m_bounding_box = BoundingBoxf3();
- for (const Vec2d& p : m_shape)
- {
+ for (const Vec2d& p : m_shape) {
m_bounding_box.merge(Vec3d(p(0), p(1), 0.0));
}
m_extended_bounding_box = m_bounding_box;
// extend to contain axes
- m_extended_bounding_box.merge(m_axes.length + Axes::ArrowLength * Vec3d::Ones());
+ m_extended_bounding_box.merge(m_axes.get_origin() + m_axes.get_total_length() * Vec3d::Ones());
+ m_extended_bounding_box.merge(m_extended_bounding_box.min + Vec3d(-Axes::DefaultTipRadius, -Axes::DefaultTipRadius, m_extended_bounding_box.max(2)));
// extend to contain model, if any
- if (!m_model.get_filename().empty())
- m_extended_bounding_box.merge(m_model.get_transformed_bounding_box());
+ BoundingBoxf3 model_bb = m_model.get_bounding_box();
+ if (model_bb.defined) {
+ model_bb.translate(m_model_offset);
+ m_extended_bounding_box.merge(model_bb);
+ }
}
void Bed3D::calc_triangles(const ExPolygon& poly)
{
Polygons triangles;
- poly.triangulate(&triangles);
+ poly.triangulate_p2t(&triangles);
if (!m_triangles.set_from_triangles(triangles, GROUND_Z, true))
printf("Unable to create bed triangles\n");
@@ -309,15 +300,13 @@ void Bed3D::calc_triangles(const ExPolygon& poly)
void Bed3D::calc_gridlines(const ExPolygon& poly, const BoundingBox& bed_bbox)
{
Polylines axes_lines;
- for (coord_t x = bed_bbox.min(0); x <= bed_bbox.max(0); x += scale_(10.0))
- {
+ for (coord_t x = bed_bbox.min(0); x <= bed_bbox.max(0); x += scale_(10.0)) {
Polyline line;
line.append(Point(x, bed_bbox.min(1)));
line.append(Point(x, bed_bbox.max(1)));
axes_lines.push_back(line);
}
- for (coord_t y = bed_bbox.min(1); y <= bed_bbox.max(1); y += scale_(10.0))
- {
+ for (coord_t y = bed_bbox.min(1); y <= bed_bbox.max(1); y += scale_(10.0)) {
Polyline line;
line.append(Point(bed_bbox.min(0), y));
line.append(Point(bed_bbox.max(0), y));
@@ -335,40 +324,19 @@ void Bed3D::calc_gridlines(const ExPolygon& poly, const BoundingBox& bed_bbox)
printf("Unable to create bed grid lines\n");
}
-static std::string system_print_bed_model(const Preset &preset)
-{
- std::string out;
- const VendorProfile::PrinterModel *pm = PresetUtils::system_printer_model(preset);
- if (pm != nullptr && ! pm->bed_model.empty())
- out = Slic3r::resources_dir() + "/profiles/" + preset.vendor->id + "/" + pm->bed_model;
- return out;
-}
-
-static std::string system_print_bed_texture(const Preset &preset)
-{
- std::string out;
- const VendorProfile::PrinterModel *pm = PresetUtils::system_printer_model(preset);
- if (pm != nullptr && ! pm->bed_texture.empty())
- out = Slic3r::resources_dir() + "/profiles/" + preset.vendor->id + "/" + pm->bed_texture;
- return out;
-}
std::tuple<Bed3D::EType, std::string, std::string> Bed3D::detect_type(const Pointfs& shape) const
{
auto bundle = wxGetApp().preset_bundle;
- if (bundle != nullptr)
- {
+ if (bundle != nullptr) {
const Preset* curr = &bundle->printers.get_selected_preset();
- while (curr != nullptr)
- {
- if (curr->config.has("bed_shape"))
- {
- if (shape == dynamic_cast<const ConfigOptionPoints*>(curr->config.option("bed_shape"))->values)
- {
- std::string model_filename = system_print_bed_model(*curr);
- std::string texture_filename = system_print_bed_texture(*curr);
+ while (curr != nullptr) {
+ if (curr->config.has("bed_shape")) {
+ if (shape == dynamic_cast<const ConfigOptionPoints*>(curr->config.option("bed_shape"))->values) {
+ std::string model_filename = PresetUtils::system_printer_bed_model(*curr);
+ std::string texture_filename = PresetUtils::system_printer_bed_texture(*curr);
if (!model_filename.empty() && !texture_filename.empty())
- return std::make_tuple(System, model_filename, texture_filename);
+ return { System, model_filename, texture_filename };
}
}
@@ -376,7 +344,7 @@ std::tuple<Bed3D::EType, std::string, std::string> Bed3D::detect_type(const Poin
}
}
- return std::make_tuple(Custom, "", "");
+ return { Custom, "", "" };
}
void Bed3D::render_axes() const
@@ -385,36 +353,32 @@ void Bed3D::render_axes() const
m_axes.render();
}
-void Bed3D::render_system(GLCanvas3D& canvas, bool bottom) const
+void Bed3D::render_system(GLCanvas3D& canvas, bool bottom, bool show_texture) const
{
if (!bottom)
render_model();
- render_texture(bottom, canvas);
+ if (show_texture)
+ render_texture(bottom, canvas);
}
void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) const
{
- if (m_texture_filename.empty())
- {
+ if (m_texture_filename.empty()) {
m_texture.reset();
render_default(bottom);
return;
}
- if ((m_texture.get_id() == 0) || (m_texture.get_source() != m_texture_filename))
- {
+ if ((m_texture.get_id() == 0) || (m_texture.get_source() != m_texture_filename)) {
m_texture.reset();
- if (boost::algorithm::iends_with(m_texture_filename, ".svg"))
- {
+ if (boost::algorithm::iends_with(m_texture_filename, ".svg")) {
// use higher resolution images if graphic card and opengl version allow
- GLint max_tex_size = GLCanvas3DManager::get_gl_info().get_max_tex_size();
- if ((m_temp_texture.get_id() == 0) || (m_temp_texture.get_source() != m_texture_filename))
- {
+ GLint max_tex_size = OpenGLManager::get_gl_info().get_max_tex_size();
+ if ((m_temp_texture.get_id() == 0) || (m_temp_texture.get_source() != m_texture_filename)) {
// generate a temporary lower resolution texture to show while no main texture levels have been compressed
- if (!m_temp_texture.load_from_svg_file(m_texture_filename, false, false, false, max_tex_size / 8))
- {
+ if (!m_temp_texture.load_from_svg_file(m_texture_filename, false, false, false, max_tex_size / 8)) {
render_default(bottom);
return;
}
@@ -422,19 +386,15 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) const
}
// starts generating the main texture, compression will run asynchronously
- if (!m_texture.load_from_svg_file(m_texture_filename, true, true, true, max_tex_size))
- {
+ if (!m_texture.load_from_svg_file(m_texture_filename, true, true, true, max_tex_size)) {
render_default(bottom);
return;
}
- }
- else if (boost::algorithm::iends_with(m_texture_filename, ".png"))
- {
+ }
+ else if (boost::algorithm::iends_with(m_texture_filename, ".png")) {
// generate a temporary lower resolution texture to show while no main texture levels have been compressed
- if ((m_temp_texture.get_id() == 0) || (m_temp_texture.get_source() != m_texture_filename))
- {
- if (!m_temp_texture.load_from_file(m_texture_filename, false, GLTexture::None, false))
- {
+ if ((m_temp_texture.get_id() == 0) || (m_temp_texture.get_source() != m_texture_filename)) {
+ if (!m_temp_texture.load_from_file(m_texture_filename, false, GLTexture::None, false)) {
render_default(bottom);
return;
}
@@ -442,20 +402,17 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) const
}
// starts generating the main texture, compression will run asynchronously
- if (!m_texture.load_from_file(m_texture_filename, true, GLTexture::MultiThreaded, true))
- {
+ if (!m_texture.load_from_file(m_texture_filename, true, GLTexture::MultiThreaded, true)) {
render_default(bottom);
return;
}
}
- else
- {
+ else {
render_default(bottom);
return;
}
}
- else if (m_texture.unsent_compressed_data_available())
- {
+ else if (m_texture.unsent_compressed_data_available()) {
// sends to gpu the already available compressed levels of the main texture
m_texture.send_compressed_data_to_gpu();
@@ -467,19 +424,14 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) const
}
- if (m_triangles.get_vertices_count() > 0)
- {
- if (m_shader.get_shader_program_id() == 0)
- m_shader.init("printbed.vs", "printbed.fs");
-
- if (m_shader.is_initialized())
- {
- m_shader.start_using();
- m_shader.set_uniform("transparent_background", bottom);
- m_shader.set_uniform("svg_source", boost::algorithm::iends_with(m_texture.get_source(), ".svg"));
+ if (m_triangles.get_vertices_count() > 0) {
+ GLShaderProgram* shader = wxGetApp().get_shader("printbed");
+ if (shader != nullptr) {
+ shader->start_using();
+ shader->set_uniform("transparent_background", bottom);
+ shader->set_uniform("svg_source", boost::algorithm::iends_with(m_texture.get_source(), ".svg"));
- if (m_vbo_id == 0)
- {
+ if (m_vbo_id == 0) {
glsafe(::glGenBuffers(1, &m_vbo_id));
glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_vbo_id));
glsafe(::glBufferData(GL_ARRAY_BUFFER, (GLsizeiptr)m_triangles.get_vertices_data_size(), (const GLvoid*)m_triangles.get_vertices_data(), GL_STATIC_DRAW));
@@ -497,8 +449,8 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) const
unsigned int stride = m_triangles.get_vertex_data_size();
- GLint position_id = m_shader.get_attrib_location("v_position");
- GLint tex_coords_id = m_shader.get_attrib_location("v_tex_coords");
+ GLint position_id = shader->get_attrib_location("v_position");
+ GLint tex_coords_id = shader->get_attrib_location("v_tex_coords");
// show the temporary texture while no compressed data is available
GLuint tex_id = (GLuint)m_temp_texture.get_id();
@@ -508,13 +460,11 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) const
glsafe(::glBindTexture(GL_TEXTURE_2D, tex_id));
glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_vbo_id));
- if (position_id != -1)
- {
+ if (position_id != -1) {
glsafe(::glEnableVertexAttribArray(position_id));
glsafe(::glVertexAttribPointer(position_id, 3, GL_FLOAT, GL_FALSE, stride, (GLvoid*)(intptr_t)m_triangles.get_position_offset()));
}
- if (tex_coords_id != -1)
- {
+ if (tex_coords_id != -1) {
glsafe(::glEnableVertexAttribArray(tex_coords_id));
glsafe(::glVertexAttribPointer(tex_coords_id, 2, GL_FLOAT, GL_FALSE, stride, (GLvoid*)(intptr_t)m_triangles.get_tex_coords_offset()));
}
@@ -536,7 +486,7 @@ void Bed3D::render_texture(bool bottom, GLCanvas3D& canvas) const
glsafe(::glDisable(GL_BLEND));
glsafe(::glDepthMask(GL_TRUE));
- m_shader.stop_using();
+ shader->stop_using();
}
}
}
@@ -546,29 +496,33 @@ void Bed3D::render_model() const
if (m_model_filename.empty())
return;
- if ((m_model.get_filename() != m_model_filename) && m_model.init_from_file(m_model_filename))
- {
+ if ((m_model.get_filename() != m_model_filename) && m_model.init_from_file(m_model_filename)) {
// move the model so that its origin (0.0, 0.0, 0.0) goes into the bed shape center and a bit down to avoid z-fighting with the texture quad
Vec3d shift = m_bounding_box.center();
shift(2) = -0.03;
- m_model.set_offset(shift);
+ m_model_offset = shift;
// update extended bounding box
calc_bounding_boxes();
}
- if (!m_model.get_filename().empty())
- {
- glsafe(::glEnable(GL_LIGHTING));
- m_model.render();
- glsafe(::glDisable(GL_LIGHTING));
+ if (!m_model.get_filename().empty()) {
+ GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light");
+ if (shader != nullptr) {
+ shader->start_using();
+ shader->set_uniform("uniform_color", m_model_color);
+ ::glPushMatrix();
+ ::glTranslated(m_model_offset(0), m_model_offset(1), m_model_offset(2));
+ m_model.render();
+ ::glPopMatrix();
+ shader->stop_using();
+ }
}
}
-void Bed3D::render_custom(GLCanvas3D& canvas, bool bottom) const
+void Bed3D::render_custom(GLCanvas3D& canvas, bool bottom, bool show_texture) const
{
- if (m_texture_filename.empty() && m_model_filename.empty())
- {
+ if (m_texture_filename.empty() && m_model_filename.empty()) {
render_default(bottom);
return;
}
@@ -576,7 +530,8 @@ void Bed3D::render_custom(GLCanvas3D& canvas, bool bottom) const
if (!bottom)
render_model();
- render_texture(bottom, canvas);
+ if (show_texture)
+ render_texture(bottom, canvas);
}
void Bed3D::render_default(bool bottom) const
@@ -584,8 +539,7 @@ void Bed3D::render_default(bool bottom) const
m_texture.reset();
unsigned int triangles_vcount = m_triangles.get_vertices_count();
- if (triangles_vcount > 0)
- {
+ if (triangles_vcount > 0) {
bool has_model = !m_model.get_filename().empty();
glsafe(::glEnable(GL_DEPTH_TEST));
@@ -594,11 +548,10 @@ void Bed3D::render_default(bool bottom) const
glsafe(::glEnableClientState(GL_VERTEX_ARRAY));
- if (!has_model && !bottom)
- {
+ if (!has_model && !bottom) {
// draw background
glsafe(::glDepthMask(GL_FALSE));
- glsafe(::glColor4f(0.35f, 0.35f, 0.35f, 0.4f));
+ glsafe(::glColor4fv(m_model_color.data()));
glsafe(::glNormal3d(0.0f, 0.0f, 1.0f));
glsafe(::glVertexPointer(3, GL_FLOAT, m_triangles.get_vertex_data_size(), (GLvoid*)m_triangles.get_vertices_data()));
glsafe(::glDrawArrays(GL_TRIANGLES, 0, (GLsizei)triangles_vcount));
@@ -606,11 +559,11 @@ void Bed3D::render_default(bool bottom) const
}
// draw grid
- glsafe(::glLineWidth(3.0f * m_scale_factor));
+ glsafe(::glLineWidth(1.5f * m_scale_factor));
if (has_model && !bottom)
- glsafe(::glColor4f(0.75f, 0.75f, 0.75f, 1.0f));
+ glsafe(::glColor4f(0.9f, 0.9f, 0.9f, 1.0f));
else
- glsafe(::glColor4f(0.2f, 0.2f, 0.2f, 0.4f));
+ glsafe(::glColor4f(0.9f, 0.9f, 0.9f, 0.6f));
glsafe(::glVertexPointer(3, GL_FLOAT, m_triangles.get_vertex_data_size(), (GLvoid*)m_gridlines.get_vertices_data()));
glsafe(::glDrawArrays(GL_LINES, 0, (GLsizei)m_gridlines.get_vertices_count()));
@@ -622,12 +575,11 @@ void Bed3D::render_default(bool bottom) const
void Bed3D::reset()
{
- if (m_vbo_id > 0)
- {
+ if (m_vbo_id > 0) {
glsafe(::glDeleteBuffers(1, &m_vbo_id));
m_vbo_id = 0;
}
}
} // GUI
-} // Slic3r \ No newline at end of file
+} // Slic3r
diff --git a/src/slic3r/GUI/3DBed.hpp b/src/slic3r/GUI/3DBed.hpp
index 3a5f95978..b5b063e6f 100644
--- a/src/slic3r/GUI/3DBed.hpp
+++ b/src/slic3r/GUI/3DBed.hpp
@@ -3,12 +3,10 @@
#include "GLTexture.hpp"
#include "3DScene.hpp"
-#include "GLShader.hpp"
+#include "GLModel.hpp"
#include <tuple>
-
-class GLUquadric;
-typedef class GLUquadric GLUquadricObj;
+#include <array>
namespace Slic3r {
namespace GUI {
@@ -45,22 +43,25 @@ public:
class Bed3D
{
- struct Axes
+ class Axes
{
- static const double Radius;
- static const double ArrowBaseRadius;
- static const double ArrowLength;
- Vec3d origin;
- Vec3d length;
- GLUquadricObj* m_quadric;
-
- Axes();
- ~Axes();
-
- void render() const;
+ public:
+ static const float DefaultStemRadius;
+ static const float DefaultStemLength;
+ static const float DefaultTipRadius;
+ static const float DefaultTipLength;
private:
- void render_axis(double length) const;
+ Vec3d m_origin{ Vec3d::Zero() };
+ float m_stem_length{ DefaultStemLength };
+ mutable GLModel m_arrow;
+
+ public:
+ const Vec3d& get_origin() const { return m_origin; }
+ void set_origin(const Vec3d& origin) { m_origin = origin; }
+ void set_stem_length(float length);
+ float get_total_length() const { return m_stem_length + DefaultTipLength; }
+ void render() const;
};
public:
@@ -82,10 +83,11 @@ private:
GeometryBuffer m_triangles;
GeometryBuffer m_gridlines;
mutable GLTexture m_texture;
- mutable GLBed m_model;
+ mutable GLModel m_model;
+ mutable Vec3d m_model_offset{ Vec3d::Zero() };
+ std::array<float, 4> m_model_color{ 0.235f, 0.235f, 0.235f, 1.0f };
// temporary texture shown until the main texture has still no levels compressed
mutable GLTexture m_temp_texture;
- mutable Shader m_shader;
mutable unsigned int m_vbo_id;
Axes m_axes;
@@ -101,13 +103,17 @@ public:
const Pointfs& get_shape() const { return m_shape; }
// Return true if the bed shape changed, so the calee will update the UI.
- bool set_shape(const Pointfs& shape, const std::string& custom_texture, const std::string& custom_model);
+ bool set_shape(const Pointfs& shape, const std::string& custom_texture, const std::string& custom_model, bool force_as_custom = false);
+
+ const BoundingBoxf3& get_bounding_box(bool extended) const {
+ return extended ? m_extended_bounding_box : m_bounding_box;
+ }
- const BoundingBoxf3& get_bounding_box(bool extended) const { return extended ? m_extended_bounding_box : m_bounding_box; }
bool contains(const Point& point) const;
Point point_projection(const Point& point) const;
- void render(GLCanvas3D& canvas, bool bottom, float scale_factor, bool show_axes) const;
+ void render(GLCanvas3D& canvas, bool bottom, float scale_factor,
+ bool show_axes, bool show_texture) const;
private:
void calc_bounding_boxes() const;
@@ -115,10 +121,10 @@ private:
void calc_gridlines(const ExPolygon& poly, const BoundingBox& bed_bbox);
std::tuple<EType, std::string, std::string> detect_type(const Pointfs& shape) const;
void render_axes() const;
- void render_system(GLCanvas3D& canvas, bool bottom) const;
+ void render_system(GLCanvas3D& canvas, bool bottom, bool show_texture) const;
void render_texture(bool bottom, GLCanvas3D& canvas) const;
void render_model() const;
- void render_custom(GLCanvas3D& canvas, bool bottom) const;
+ void render_custom(GLCanvas3D& canvas, bool bottom, bool show_texture) const;
void render_default(bool bottom) const;
void reset();
};
diff --git a/src/slic3r/GUI/3DScene.cpp b/src/slic3r/GUI/3DScene.cpp
index 9f36ab537..ddfbca436 100644
--- a/src/slic3r/GUI/3DScene.cpp
+++ b/src/slic3r/GUI/3DScene.cpp
@@ -1,46 +1,57 @@
#include <GL/glew.h>
+#if ENABLE_SMOOTH_NORMALS
+#include <igl/per_face_normals.h>
+#include <igl/per_corner_normals.h>
+#include <igl/per_vertex_normals.h>
+#endif // ENABLE_SMOOTH_NORMALS
+
#include "3DScene.hpp"
+#include "GLShader.hpp"
+#include "GUI_App.hpp"
+#if ENABLE_ENVIRONMENT_MAP
+#include "Plater.hpp"
+#endif // ENABLE_ENVIRONMENT_MAP
#include "libslic3r/ExtrusionEntity.hpp"
#include "libslic3r/ExtrusionEntityCollection.hpp"
#include "libslic3r/Geometry.hpp"
-#include "libslic3r/GCode/PreviewData.hpp"
#include "libslic3r/Print.hpp"
#include "libslic3r/SLAPrint.hpp"
#include "libslic3r/Slicing.hpp"
-#include "libslic3r/GCode/Analyzer.hpp"
#include "slic3r/GUI/BitmapCache.hpp"
#include "libslic3r/Format/STL.hpp"
#include "libslic3r/Utils.hpp"
+#include "libslic3r/AppConfig.hpp"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-#include <utility>
#include <assert.h>
#include <boost/log/trivial.hpp>
#include <boost/filesystem/operations.hpp>
-#include <boost/algorithm/string.hpp>
+#include <boost/algorithm/string/predicate.hpp>
#include <boost/nowide/cstdio.hpp>
-#include <tbb/parallel_for.h>
-#include <tbb/spin_mutex.h>
-
#include <Eigen/Dense>
-#include "GUI.hpp"
-
#ifdef HAS_GLSAFE
-void glAssertRecentCallImpl(const char *file_name, unsigned int line, const char *function_name)
+void glAssertRecentCallImpl(const char* file_name, unsigned int line, const char* function_name)
{
+#if defined(NDEBUG) && ENABLE_OPENGL_ERROR_LOGGING
+ // In release mode, if OpenGL debugging was forced by ENABLE_OPENGL_ERROR_LOGGING, only show
+ // OpenGL errors if sufficiently high loglevel.
+ if (Slic3r::get_logging_level() < 5)
+ return;
+#endif // ENABLE_OPENGL_ERROR_LOGGING
+
GLenum err = glGetError();
if (err == GL_NO_ERROR)
return;
- const char *sErr = 0;
+ const char* sErr = 0;
switch (err) {
case GL_INVALID_ENUM: sErr = "Invalid Enum"; break;
case GL_INVALID_VALUE: sErr = "Invalid Value"; break;
@@ -51,30 +62,114 @@ void glAssertRecentCallImpl(const char *file_name, unsigned int line, const char
case GL_OUT_OF_MEMORY: sErr = "Out Of Memory"; break;
default: sErr = "Unknown"; break;
}
- BOOST_LOG_TRIVIAL(error) << "OpenGL error in " << file_name << ":" << line << ", function " << function_name << "() : " << (int)err << " - " << sErr;
+ BOOST_LOG_TRIVIAL(error) << "OpenGL error in " << file_name << ":" << line << ", function " << function_name << "() : " << (int)err << " - " << sErr;
assert(false);
}
-#endif
+#endif // HAS_GLSAFE
namespace Slic3r {
-void GLIndexedVertexArray::load_mesh_full_shading(const TriangleMesh &mesh)
+#if ENABLE_SMOOTH_NORMALS
+static void smooth_normals_corner(TriangleMesh& mesh, std::vector<stl_normal>& normals)
+{
+ mesh.repair();
+
+ using MapMatrixXfUnaligned = Eigen::Map<const Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor | Eigen::DontAlign>>;
+ using MapMatrixXiUnaligned = Eigen::Map<const Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor | Eigen::DontAlign>>;
+
+ std::vector<stl_normal> face_normals(mesh.stl.stats.number_of_facets);
+ for (uint32_t i = 0; i < mesh.stl.stats.number_of_facets; ++i) {
+ face_normals[i] = mesh.stl.facet_start[i].normal;
+ }
+
+ Eigen::MatrixXd vertices = MapMatrixXfUnaligned(mesh.its.vertices.front().data(),
+ Eigen::Index(mesh.its.vertices.size()), 3).cast<double>();
+ Eigen::MatrixXi indices = MapMatrixXiUnaligned(mesh.its.indices.front().data(),
+ Eigen::Index(mesh.its.indices.size()), 3);
+ Eigen::MatrixXd in_normals = MapMatrixXfUnaligned(face_normals.front().data(),
+ Eigen::Index(face_normals.size()), 3).cast<double>();
+ Eigen::MatrixXd out_normals;
+
+ igl::per_corner_normals(vertices, indices, in_normals, 1.0, out_normals);
+
+ normals = std::vector<stl_normal>(mesh.its.vertices.size());
+ for (size_t i = 0; i < mesh.its.indices.size(); ++i) {
+ for (size_t j = 0; j < 3; ++j) {
+ normals[mesh.its.indices[i][j]] = out_normals.row(i * 3 + j).cast<float>();
+ }
+ }
+}
+
+static void smooth_normals_vertex(TriangleMesh& mesh, std::vector<stl_normal>& normals)
+{
+ mesh.repair();
+
+ using MapMatrixXfUnaligned = Eigen::Map<const Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor | Eigen::DontAlign>>;
+ using MapMatrixXiUnaligned = Eigen::Map<const Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor | Eigen::DontAlign>>;
+
+ Eigen::MatrixXd vertices = MapMatrixXfUnaligned(mesh.its.vertices.front().data(),
+ Eigen::Index(mesh.its.vertices.size()), 3).cast<double>();
+ Eigen::MatrixXi indices = MapMatrixXiUnaligned(mesh.its.indices.front().data(),
+ Eigen::Index(mesh.its.indices.size()), 3);
+ Eigen::MatrixXd out_normals;
+
+// igl::per_vertex_normals(vertices, indices, igl::PER_VERTEX_NORMALS_WEIGHTING_TYPE_UNIFORM, out_normals);
+// igl::per_vertex_normals(vertices, indices, igl::PER_VERTEX_NORMALS_WEIGHTING_TYPE_AREA, out_normals);
+ igl::per_vertex_normals(vertices, indices, igl::PER_VERTEX_NORMALS_WEIGHTING_TYPE_ANGLE, out_normals);
+// igl::per_vertex_normals(vertices, indices, igl::PER_VERTEX_NORMALS_WEIGHTING_TYPE_DEFAULT, out_normals);
+
+ normals = std::vector<stl_normal>(mesh.its.vertices.size());
+ for (size_t i = 0; i < static_cast<size_t>(out_normals.rows()); ++i) {
+ normals[i] = out_normals.row(i).cast<float>();
+ }
+}
+#endif // ENABLE_SMOOTH_NORMALS
+
+#if ENABLE_SMOOTH_NORMALS
+void GLIndexedVertexArray::load_mesh_full_shading(const TriangleMesh& mesh, bool smooth_normals)
+#else
+void GLIndexedVertexArray::load_mesh_full_shading(const TriangleMesh& mesh)
+#endif // ENABLE_SMOOTH_NORMALS
{
assert(triangle_indices.empty() && vertices_and_normals_interleaved_size == 0);
assert(quad_indices.empty() && triangle_indices_size == 0);
assert(vertices_and_normals_interleaved.size() % 6 == 0 && quad_indices_size == vertices_and_normals_interleaved.size());
- this->vertices_and_normals_interleaved.reserve(this->vertices_and_normals_interleaved.size() + 3 * 3 * 2 * mesh.facets_count());
+#if ENABLE_SMOOTH_NORMALS
+ if (smooth_normals) {
+ TriangleMesh new_mesh(mesh);
+ std::vector<stl_normal> normals;
+ smooth_normals_corner(new_mesh, normals);
+// smooth_normals_vertex(new_mesh, normals);
+
+ this->vertices_and_normals_interleaved.reserve(this->vertices_and_normals_interleaved.size() + 3 * 2 * new_mesh.its.vertices.size());
+ for (size_t i = 0; i < new_mesh.its.vertices.size(); ++i) {
+ const stl_vertex& v = new_mesh.its.vertices[i];
+ const stl_normal& n = normals[i];
+ this->push_geometry(v(0), v(1), v(2), n(0), n(1), n(2));
+ }
+
+ for (size_t i = 0; i < new_mesh.its.indices.size(); ++i) {
+ const stl_triangle_vertex_indices& idx = new_mesh.its.indices[i];
+ this->push_triangle(idx(0), idx(1), idx(2));
+ }
+ }
+ else {
+#endif // ENABLE_SMOOTH_NORMALS
+ this->vertices_and_normals_interleaved.reserve(this->vertices_and_normals_interleaved.size() + 3 * 3 * 2 * mesh.facets_count());
- unsigned int vertices_count = 0;
- for (int i = 0; i < (int)mesh.stl.stats.number_of_facets; ++i) {
- const stl_facet &facet = mesh.stl.facet_start[i];
- for (int j = 0; j < 3; ++j)
- this->push_geometry(facet.vertex[j](0), facet.vertex[j](1), facet.vertex[j](2), facet.normal(0), facet.normal(1), facet.normal(2));
+ unsigned int vertices_count = 0;
+ for (int i = 0; i < (int)mesh.stl.stats.number_of_facets; ++i) {
+ const stl_facet& facet = mesh.stl.facet_start[i];
+ for (int j = 0; j < 3; ++j)
+ this->push_geometry(facet.vertex[j](0), facet.vertex[j](1), facet.vertex[j](2), facet.normal(0), facet.normal(1), facet.normal(2));
- this->push_triangle(vertices_count, vertices_count + 1, vertices_count + 2);
- vertices_count += 3;
+ this->push_triangle(vertices_count, vertices_count + 1, vertices_count + 2);
+ vertices_count += 3;
+ }
+#if ENABLE_SMOOTH_NORMALS
}
+#endif // ENABLE_SMOOTH_NORMALS
}
void GLIndexedVertexArray::finalize_geometry(bool opengl_initialized)
@@ -205,6 +300,7 @@ const float GLVolume::MODEL_COLOR[4][4] = {
};
const float GLVolume::SLA_SUPPORT_COLOR[4] = { 0.75f, 0.75f, 0.75f, 1.0f };
const float GLVolume::SLA_PAD_COLOR[4] = { 0.0f, 0.2f, 0.0f, 1.0f };
+const float GLVolume::NEUTRAL_COLOR[4] = { 0.9f, 0.9f, 0.9f, 1.0f };
GLVolume::GLVolume(float r, float g, float b, float a)
: m_transformed_bounding_box_dirty(true)
@@ -226,6 +322,7 @@ GLVolume::GLVolume(float r, float g, float b, float a)
, is_extrusion_path(false)
, force_transparent(false)
, force_native_color(false)
+ , force_neutral_color(false)
, tverts_range(0, size_t(-1))
, qverts_range(0, size_t(-1))
{
@@ -251,12 +348,16 @@ void GLVolume::set_render_color(const float* rgba, unsigned int size)
void GLVolume::set_render_color()
{
- if (force_native_color)
+ if (force_native_color || force_neutral_color)
{
if (is_outside && shader_outside_printer_detection_enabled)
set_render_color(OUTSIDE_COLOR, 4);
- else
- set_render_color(color, 4);
+ else {
+ if (force_native_color)
+ set_render_color(color, 4);
+ else
+ set_render_color(NEUTRAL_COLOR, 4);
+ }
}
else {
if (hover == HS_Select)
@@ -346,7 +447,6 @@ BoundingBoxf3 GLVolume::transformed_convex_hull_bounding_box(const Transform3d &
bounding_box().transformed(trafo);
}
-
void GLVolume::set_range(double min_z, double max_z)
{
this->qverts_range.first = 0;
@@ -400,22 +500,6 @@ void GLVolume::render() const
glFrontFace(GL_CCW);
}
-void GLVolume::render(int color_id, int detection_id, int worldmatrix_id) const
-{
- if (color_id >= 0)
- glsafe(::glUniform4fv(color_id, 1, (const GLfloat*)render_color));
- else
- glsafe(::glColor4fv(render_color));
-
- if (detection_id != -1)
- glsafe(::glUniform1i(detection_id, shader_outside_printer_detection_enabled ? 1 : 0));
-
- if (worldmatrix_id != -1)
- glsafe(::glUniformMatrix4fv(worldmatrix_id, 1, GL_FALSE, (const GLfloat*)world_matrix().cast<float>().data()));
-
- render();
-}
-
bool GLVolume::is_sla_support() const { return this->composite_id.volume_id == -int(slaposSupportTree); }
bool GLVolume::is_sla_pad() const { return this->composite_id.volume_id == -int(slaposPad); }
@@ -461,7 +545,11 @@ int GLVolumeCollection::load_object_volume(
this->volumes.emplace_back(new GLVolume(color));
GLVolume& v = *this->volumes.back();
v.set_color_from_model_volume(model_volume);
+#if ENABLE_SMOOTH_NORMALS
+ v.indexed_vertex_array.load_mesh(mesh, true);
+#else
v.indexed_vertex_array.load_mesh(mesh);
+#endif // ENABLE_SMOOTH_NORMALS
v.indexed_vertex_array.finalize_geometry(opengl_initialized);
v.composite_id = GLVolume::CompositeID(obj_idx, volume_idx, instance_idx);
if (model_volume->is_model_part())
@@ -503,8 +591,12 @@ void GLVolumeCollection::load_object_auxiliary(
const ModelInstance& model_instance = *print_object->model_object()->instances[instance_idx.first];
this->volumes.emplace_back(new GLVolume((milestone == slaposPad) ? GLVolume::SLA_PAD_COLOR : GLVolume::SLA_SUPPORT_COLOR));
GLVolume& v = *this->volumes.back();
+#if ENABLE_SMOOTH_NORMALS
+ v.indexed_vertex_array.load_mesh(mesh, true);
+#else
v.indexed_vertex_array.load_mesh(mesh);
- v.indexed_vertex_array.finalize_geometry(opengl_initialized);
+#endif // ENABLE_SMOOTH_NORMALS
+ v.indexed_vertex_array.finalize_geometry(opengl_initialized);
v.composite_id = GLVolume::CompositeID(obj_idx, -int(milestone), (int)instance_idx.first);
v.geometry_id = std::pair<size_t, size_t>(timestamp, model_instance.id().id);
// Create a copy of the convex hull mesh for each instance. Use a move operator on the last instance.
@@ -541,16 +633,16 @@ int GLVolumeCollection::load_wipe_tower_preview(
// We'll now create the box with jagged edge. y-coordinates of the pre-generated model are shifted so that the front
// edge has y=0 and centerline of the back edge has y=depth:
Pointf3s points;
- std::vector<Vec3crd> facets;
+ std::vector<Vec3i> facets;
float out_points_idx[][3] = { { 0, -depth, 0 }, { 0, 0, 0 }, { 38.453f, 0, 0 }, { 61.547f, 0, 0 }, { 100.0f, 0, 0 }, { 100.0f, -depth, 0 }, { 55.7735f, -10.0f, 0 }, { 44.2265f, 10.0f, 0 },
{ 38.453f, 0, 1 }, { 0, 0, 1 }, { 0, -depth, 1 }, { 100.0f, -depth, 1 }, { 100.0f, 0, 1 }, { 61.547f, 0, 1 }, { 55.7735f, -10.0f, 1 }, { 44.2265f, 10.0f, 1 } };
int out_facets_idx[][3] = { { 0, 1, 2 }, { 3, 4, 5 }, { 6, 5, 0 }, { 3, 5, 6 }, { 6, 2, 7 }, { 6, 0, 2 }, { 8, 9, 10 }, { 11, 12, 13 }, { 10, 11, 14 }, { 14, 11, 13 }, { 15, 8, 14 },
{8, 10, 14}, {3, 12, 4}, {3, 13, 12}, {6, 13, 3}, {6, 14, 13}, {7, 14, 6}, {7, 15, 14}, {2, 15, 7}, {2, 8, 15}, {1, 8, 2}, {1, 9, 8},
{0, 9, 1}, {0, 10, 9}, {5, 10, 0}, {5, 11, 10}, {4, 11, 5}, {4, 12, 11} };
for (int i = 0; i < 16; ++i)
- points.push_back(Vec3d(out_points_idx[i][0] / (100.f / min_width), out_points_idx[i][1] + depth, out_points_idx[i][2]));
+ points.emplace_back(out_points_idx[i][0] / (100.f / min_width), out_points_idx[i][1] + depth, out_points_idx[i][2]);
for (int i = 0; i < 28; ++i)
- facets.push_back(Vec3crd(out_facets_idx[i][0], out_facets_idx[i][1], out_facets_idx[i][2]));
+ facets.emplace_back(out_facets_idx[i][0], out_facets_idx[i][1], out_facets_idx[i][2]);
TriangleMesh tooth_mesh(points, facets);
// We have the mesh ready. It has one tooth and width of min_width. We will now append several of these together until we are close to
@@ -641,6 +733,10 @@ GLVolumeWithIdAndZList volumes_to_render(const GLVolumePtrs& volumes, GLVolumeCo
void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disable_cullface, const Transform3d& view_matrix, std::function<bool(const GLVolume&)> filter_func) const
{
+ GLShaderProgram* shader = GUI::wxGetApp().get_current_shader();
+ if (shader == nullptr)
+ return;
+
glsafe(::glEnable(GL_BLEND));
glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
@@ -651,35 +747,38 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab
glsafe(::glEnableClientState(GL_VERTEX_ARRAY));
glsafe(::glEnableClientState(GL_NORMAL_ARRAY));
- GLint current_program_id;
- glsafe(::glGetIntegerv(GL_CURRENT_PROGRAM, &current_program_id));
- GLint color_id = (current_program_id > 0) ? ::glGetUniformLocation(current_program_id, "uniform_color") : -1;
- GLint z_range_id = (current_program_id > 0) ? ::glGetUniformLocation(current_program_id, "z_range") : -1;
- GLint clipping_plane_id = (current_program_id > 0) ? ::glGetUniformLocation(current_program_id, "clipping_plane") : -1;
- GLint print_box_min_id = (current_program_id > 0) ? ::glGetUniformLocation(current_program_id, "print_box.min") : -1;
- GLint print_box_max_id = (current_program_id > 0) ? ::glGetUniformLocation(current_program_id, "print_box.max") : -1;
- GLint print_box_detection_id = (current_program_id > 0) ? ::glGetUniformLocation(current_program_id, "print_box.volume_detection") : -1;
- GLint print_box_worldmatrix_id = (current_program_id > 0) ? ::glGetUniformLocation(current_program_id, "print_box.volume_world_matrix") : -1;
+ shader->set_uniform("print_box.min", m_print_box_min, 3);
+ shader->set_uniform("print_box.max", m_print_box_max, 3);
+ shader->set_uniform("z_range", m_z_range, 2);
+ shader->set_uniform("clipping_plane", m_clipping_plane, 4);
+ shader->set_uniform("slope.normal_z", m_slope.normal_z);
+
+#if ENABLE_ENVIRONMENT_MAP
+ unsigned int environment_texture_id = GUI::wxGetApp().plater()->get_environment_texture_id();
+ bool use_environment_texture = environment_texture_id > 0 && GUI::wxGetApp().app_config->get("use_environment_map") == "1";
+ shader->set_uniform("use_environment_tex", use_environment_texture);
+ if (use_environment_texture)
+ glsafe(::glBindTexture(GL_TEXTURE_2D, environment_texture_id));
+#endif // ENABLE_ENVIRONMENT_MAP
glcheck();
- if (print_box_min_id != -1)
- glsafe(::glUniform3fv(print_box_min_id, 1, (const GLfloat*)print_box_min));
-
- if (print_box_max_id != -1)
- glsafe(::glUniform3fv(print_box_max_id, 1, (const GLfloat*)print_box_max));
-
- if (z_range_id != -1)
- glsafe(::glUniform2fv(z_range_id, 1, (const GLfloat*)z_range));
-
- if (clipping_plane_id != -1)
- glsafe(::glUniform4fv(clipping_plane_id, 1, (const GLfloat*)clipping_plane));
-
GLVolumeWithIdAndZList to_render = volumes_to_render(this->volumes, type, view_matrix, filter_func);
for (GLVolumeWithIdAndZ& volume : to_render) {
volume.first->set_render_color();
- volume.first->render(color_id, print_box_detection_id, print_box_worldmatrix_id);
+ shader->set_uniform("uniform_color", volume.first->render_color, 4);
+ shader->set_uniform("print_box.actived", volume.first->shader_outside_printer_detection_enabled);
+ shader->set_uniform("print_box.volume_world_matrix", volume.first->world_matrix());
+ shader->set_uniform("slope.actived", m_slope.active && !volume.first->is_modifier && !volume.first->is_wipe_tower);
+ shader->set_uniform("slope.volume_world_normal_matrix", static_cast<Matrix3f>(volume.first->world_matrix().matrix().block(0, 0, 3, 3).inverse().transpose().cast<float>()));
+
+ volume.first->render();
}
+#if ENABLE_ENVIRONMENT_MAP
+ if (use_environment_texture)
+ glsafe(::glBindTexture(GL_TEXTURE_2D, 0));
+#endif // ENABLE_ENVIRONMENT_MAP
+
glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0));
glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
@@ -692,7 +791,7 @@ void GLVolumeCollection::render(GLVolumeCollection::ERenderType type, bool disab
glsafe(::glDisable(GL_BLEND));
}
-bool GLVolumeCollection::check_outside_state(const DynamicPrintConfig* config, ModelInstance::EPrintVolumeState* out_state)
+bool GLVolumeCollection::check_outside_state(const DynamicPrintConfig* config, ModelInstanceEPrintVolumeState* out_state)
{
if (config == nullptr)
return false;
@@ -705,8 +804,12 @@ bool GLVolumeCollection::check_outside_state(const DynamicPrintConfig* config, M
BoundingBoxf3 print_volume(Vec3d(unscale<double>(bed_box_2D.min(0)), unscale<double>(bed_box_2D.min(1)), 0.0), Vec3d(unscale<double>(bed_box_2D.max(0)), unscale<double>(bed_box_2D.max(1)), config->opt_float("max_print_height")));
// Allow the objects to protrude below the print bed
print_volume.min(2) = -1e10;
+ print_volume.min(0) -= BedEpsilon;
+ print_volume.min(1) -= BedEpsilon;
+ print_volume.max(0) += BedEpsilon;
+ print_volume.max(1) += BedEpsilon;
- ModelInstance::EPrintVolumeState state = ModelInstance::PVS_Inside;
+ ModelInstanceEPrintVolumeState state = ModelInstancePVS_Inside;
bool contained_min_one = false;
@@ -725,11 +828,11 @@ bool GLVolumeCollection::check_outside_state(const DynamicPrintConfig* config, M
if (contained)
contained_min_one = true;
- if ((state == ModelInstance::PVS_Inside) && volume->is_outside)
- state = ModelInstance::PVS_Fully_Outside;
+ if ((state == ModelInstancePVS_Inside) && volume->is_outside)
+ state = ModelInstancePVS_Fully_Outside;
- if ((state == ModelInstance::PVS_Fully_Outside) && volume->is_outside && print_volume.intersects(bb))
- state = ModelInstance::PVS_Partly_Outside;
+ if ((state == ModelInstancePVS_Fully_Outside) && volume->is_outside && print_volume.intersects(bb))
+ state = ModelInstancePVS_Partly_Outside;
}
if (out_state != nullptr)
@@ -894,288 +997,6 @@ bool GLVolumeCollection::has_toolpaths_to_export() const
return false;
}
-void GLVolumeCollection::export_toolpaths_to_obj(const char* filename) const
-{
- if (filename == nullptr)
- return;
-
- if (!has_toolpaths_to_export())
- return;
-
- // collect color information to generate materials
- typedef std::array<float, 4> Color;
- std::set<Color> colors;
- for (const GLVolume* volume : this->volumes)
- {
- if (!can_export_to_obj(*volume))
- continue;
-
- Color color;
- ::memcpy((void*)color.data(), (const void*)volume->color, 4 * sizeof(float));
- colors.insert(color);
- }
-
- // save materials file
- boost::filesystem::path mat_filename(filename);
- mat_filename.replace_extension("mtl");
- FILE* fp = boost::nowide::fopen(mat_filename.string().c_str(), "w");
- if (fp == nullptr) {
- BOOST_LOG_TRIVIAL(error) << "GLVolumeCollection::export_toolpaths_to_obj: Couldn't open " << mat_filename.string().c_str() << " for writing";
- return;
- }
-
- fprintf(fp, "# G-Code Toolpaths Materials\n");
- fprintf(fp, "# Generated by %s based on Slic3r\n", SLIC3R_BUILD_ID);
-
- unsigned int colors_count = 1;
- for (const Color& color : colors)
- {
- fprintf(fp, "\nnewmtl material_%d\n", colors_count++);
- fprintf(fp, "Ka 1 1 1\n");
- fprintf(fp, "Kd %f %f %f\n", color[0], color[1], color[2]);
- fprintf(fp, "Ks 0 0 0\n");
- }
-
- fclose(fp);
-
- // save geometry file
- fp = boost::nowide::fopen(filename, "w");
- if (fp == nullptr) {
- BOOST_LOG_TRIVIAL(error) << "GLVolumeCollection::export_toolpaths_to_obj: Couldn't open " << filename << " for writing";
- return;
- }
-
- fprintf(fp, "# G-Code Toolpaths\n");
- fprintf(fp, "# Generated by %s based on Slic3r\n", SLIC3R_BUILD_ID);
- fprintf(fp, "\nmtllib ./%s\n", mat_filename.filename().string().c_str());
-
- unsigned int vertices_count = 0;
- unsigned int normals_count = 0;
- unsigned int volumes_count = 0;
-
- for (const GLVolume* volume : this->volumes)
- {
- if (!can_export_to_obj(*volume))
- continue;
-
- std::vector<float> src_vertices_and_normals_interleaved;
- std::vector<int> src_triangle_indices;
- std::vector<int> src_quad_indices;
-
- if (!volume->indexed_vertex_array.vertices_and_normals_interleaved.empty())
- // data are in CPU memory
- src_vertices_and_normals_interleaved = volume->indexed_vertex_array.vertices_and_normals_interleaved;
- else if ((volume->indexed_vertex_array.vertices_and_normals_interleaved_VBO_id != 0) && (volume->indexed_vertex_array.vertices_and_normals_interleaved_size != 0))
- {
- // data are in GPU memory
- src_vertices_and_normals_interleaved = std::vector<float>(volume->indexed_vertex_array.vertices_and_normals_interleaved_size, 0.0f);
-
- glsafe(::glBindBuffer(GL_ARRAY_BUFFER, volume->indexed_vertex_array.vertices_and_normals_interleaved_VBO_id));
- glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, 0, src_vertices_and_normals_interleaved.size() * sizeof(float), src_vertices_and_normals_interleaved.data()));
- glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0));
- }
- else
- continue;
-
- if (!volume->indexed_vertex_array.triangle_indices.empty())
- {
- // data are in CPU memory
- size_t size = std::min(volume->indexed_vertex_array.triangle_indices.size(), volume->tverts_range.second - volume->tverts_range.first);
- if (size != 0)
- {
- std::vector<int>::const_iterator it_begin = volume->indexed_vertex_array.triangle_indices.begin() + volume->tverts_range.first;
- std::vector<int>::const_iterator it_end = volume->indexed_vertex_array.triangle_indices.begin() + volume->tverts_range.first + size;
- std::copy(it_begin, it_end, std::back_inserter(src_triangle_indices));
- }
- }
- else if ((volume->indexed_vertex_array.triangle_indices_VBO_id != 0) && (volume->indexed_vertex_array.triangle_indices_size != 0))
- {
- // data are in GPU memory
- size_t size = std::min(volume->indexed_vertex_array.triangle_indices_size, volume->tverts_range.second - volume->tverts_range.first);
- if (size != 0)
- {
- src_triangle_indices = std::vector<int>(size, 0);
-
- glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, volume->indexed_vertex_array.triangle_indices_VBO_id));
- glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, volume->tverts_range.first * sizeof(int), size * sizeof(int), src_triangle_indices.data()));
- glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
- }
- }
-
- if (!volume->indexed_vertex_array.quad_indices.empty())
- {
- // data are in CPU memory
- size_t size = std::min(volume->indexed_vertex_array.quad_indices.size(), volume->qverts_range.second - volume->qverts_range.first);
- if (size != 0)
- {
- std::vector<int>::const_iterator it_begin = volume->indexed_vertex_array.quad_indices.begin() + volume->qverts_range.first;
- std::vector<int>::const_iterator it_end = volume->indexed_vertex_array.quad_indices.begin() + volume->qverts_range.first + size;
- std::copy(it_begin, it_end, std::back_inserter(src_quad_indices));
- }
- }
- else if ((volume->indexed_vertex_array.quad_indices_VBO_id != 0) && (volume->indexed_vertex_array.quad_indices_size != 0))
- {
- // data are in GPU memory
- size_t size = std::min(volume->indexed_vertex_array.quad_indices_size, volume->qverts_range.second - volume->qverts_range.first);
- if (size != 0)
- {
- src_quad_indices = std::vector<int>(size, 0);
-
- glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, volume->indexed_vertex_array.quad_indices_VBO_id));
- glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, volume->qverts_range.first * sizeof(int), size * sizeof(int), src_quad_indices.data()));
- glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
- }
- }
-
- if (src_triangle_indices.empty() && src_quad_indices.empty())
- continue;
-
- ++volumes_count;
-
- // reduce output size by keeping only used vertices and normals
-
- struct Vector
- {
- std::array<coord_t, 3> vector;
-
- explicit Vector(float* ptr)
- {
- vector[0] = scale_(*(ptr + 0));
- vector[1] = scale_(*(ptr + 1));
- vector[2] = scale_(*(ptr + 2));
- }
- };
- typedef std::vector<Vector> Vectors;
-
- auto vector_less = [](const Vector& v1, const Vector& v2)->bool {
- return v1.vector < v2.vector;
- };
-
- auto vector_equal = [](const Vector& v1, const Vector& v2)->bool {
- return (v1.vector[0] == v2.vector[0]) && (v1.vector[1] == v2.vector[1]) && (v1.vector[2] == v2.vector[2]);
- };
-
- // copy used vertices and normals data
- Vectors dst_normals;
- Vectors dst_vertices;
-
- unsigned int src_triangle_indices_size = (unsigned int)src_triangle_indices.size();
- for (unsigned int i = 0; i < src_triangle_indices_size; ++i)
- {
- float* src_ptr = src_vertices_and_normals_interleaved.data() + src_triangle_indices[i] * 6;
- dst_normals.emplace_back(src_ptr + 0);
- dst_vertices.emplace_back(src_ptr + 3);
- }
-
- unsigned int src_quad_indices_size = (unsigned int)src_quad_indices.size();
- for (unsigned int i = 0; i < src_quad_indices_size; ++i)
- {
- float* src_ptr = src_vertices_and_normals_interleaved.data() + src_quad_indices[i] * 6;
- dst_normals.emplace_back(src_ptr + 0);
- dst_vertices.emplace_back(src_ptr + 3);
- }
-
- // sort vertices and normals
- std::sort(dst_normals.begin(), dst_normals.end(), vector_less);
- std::sort(dst_vertices.begin(), dst_vertices.end(), vector_less);
-
- // remove duplicated vertices and normals
- dst_normals.erase(std::unique(dst_normals.begin(), dst_normals.end(), vector_equal), dst_normals.end());
- dst_vertices.erase(std::unique(dst_vertices.begin(), dst_vertices.end(), vector_equal), dst_vertices.end());
-
- // reindex triangles and quads
- struct IndicesPair
- {
- int vertex;
- int normal;
- IndicesPair(int vertex, int normal) : vertex(vertex), normal(normal) {}
- };
- typedef std::vector<IndicesPair> Indices;
-
- unsigned int src_vertices_count = (unsigned int)src_vertices_and_normals_interleaved.size() / 6;
- std::vector<int> src_dst_vertex_indices_map(src_vertices_count, -1);
- std::vector<int> src_dst_normal_indices_map(src_vertices_count, -1);
-
- for (unsigned int i = 0; i < src_vertices_count; ++i)
- {
- float* src_ptr = src_vertices_and_normals_interleaved.data() + i * 6;
- src_dst_normal_indices_map[i] = std::distance(dst_normals.begin(), std::lower_bound(dst_normals.begin(), dst_normals.end(), Vector(src_ptr + 0), vector_less));
- src_dst_vertex_indices_map[i] = std::distance(dst_vertices.begin(), std::lower_bound(dst_vertices.begin(), dst_vertices.end(), Vector(src_ptr + 3), vector_less));
- }
-
- Indices dst_triangle_indices;
- if (src_triangle_indices_size > 0)
- dst_triangle_indices.reserve(src_triangle_indices_size);
-
- for (unsigned int i = 0; i < src_triangle_indices_size; ++i)
- {
- int id = src_triangle_indices[i];
- dst_triangle_indices.emplace_back(src_dst_vertex_indices_map[id], src_dst_normal_indices_map[id]);
- }
-
- Indices dst_quad_indices;
- if (src_quad_indices_size > 0)
- dst_quad_indices.reserve(src_quad_indices_size);
-
- for (unsigned int i = 0; i < src_quad_indices_size; ++i)
- {
- int id = src_quad_indices[i];
- dst_quad_indices.emplace_back(src_dst_vertex_indices_map[id], src_dst_normal_indices_map[id]);
- }
-
- // save to file
- fprintf(fp, "\n# vertices volume %d\n", volumes_count);
- for (const Vector& v : dst_vertices)
- {
- fprintf(fp, "v %g %g %g\n", unscale<float>(v.vector[0]), unscale<float>(v.vector[1]), unscale<float>(v.vector[2]));
- }
-
- fprintf(fp, "\n# normals volume %d\n", volumes_count);
- for (const Vector& n : dst_normals)
- {
- fprintf(fp, "vn %g %g %g\n", unscale<float>(n.vector[0]), unscale<float>(n.vector[1]), unscale<float>(n.vector[2]));
- }
-
- Color color;
- ::memcpy((void*)color.data(), (const void*)volume->color, 4 * sizeof(float));
- fprintf(fp, "\n# material volume %d\n", volumes_count);
- fprintf(fp, "usemtl material_%lld\n", (long long)(1 + std::distance(colors.begin(), colors.find(color))));
-
- int base_vertex_id = vertices_count + 1;
- int base_normal_id = normals_count + 1;
-
- if (!dst_triangle_indices.empty())
- {
- fprintf(fp, "\n# triangular facets volume %d\n", volumes_count);
- for (unsigned int i = 0; i < (unsigned int)dst_triangle_indices.size(); i += 3)
- {
- fprintf(fp, "f %d//%d %d//%d %d//%d\n",
- base_vertex_id + dst_triangle_indices[i + 0].vertex, base_normal_id + dst_triangle_indices[i + 0].normal,
- base_vertex_id + dst_triangle_indices[i + 1].vertex, base_normal_id + dst_triangle_indices[i + 1].normal,
- base_vertex_id + dst_triangle_indices[i + 2].vertex, base_normal_id + dst_triangle_indices[i + 2].normal);
- }
- }
-
- if (!dst_quad_indices.empty())
- {
- fprintf(fp, "\n# quadrangular facets volume %d\n", volumes_count);
- for (unsigned int i = 0; i < (unsigned int)src_quad_indices.size(); i += 4)
- {
- fprintf(fp, "f %d//%d %d//%d %d//%d %d//%d\n",
- base_vertex_id + dst_quad_indices[i + 0].vertex, base_normal_id + dst_quad_indices[i + 0].normal,
- base_vertex_id + dst_quad_indices[i + 1].vertex, base_normal_id + dst_quad_indices[i + 1].normal,
- base_vertex_id + dst_quad_indices[i + 2].vertex, base_normal_id + dst_quad_indices[i + 2].normal,
- base_vertex_id + dst_quad_indices[i + 3].vertex, base_normal_id + dst_quad_indices[i + 3].normal);
- }
- }
-
- vertices_count += (unsigned int)dst_vertices.size();
- normals_count += (unsigned int)dst_normals.size();
- }
-
- fclose(fp);
-}
-
// caller is responsible for supplying NO lines with zero length
static void thick_lines_to_indexed_vertex_array(
const Lines &lines,
@@ -1801,7 +1622,7 @@ void _3DScene::extrusionentity_to_verts(const ExtrusionEntity *extrusion_entity,
if (extrusion_entity_collection != nullptr)
extrusionentity_to_verts(*extrusion_entity_collection, print_z, copy, volume);
else {
- throw std::runtime_error("Unexpected extrusion_entity type in to_verts()");
+ throw Slic3r::RuntimeError("Unexpected extrusion_entity type in to_verts()");
}
}
}
@@ -1822,322 +1643,4 @@ void _3DScene::point3_to_verts(const Vec3crd& point, double width, double height
thick_point_to_verts(point, width, height, volume);
}
-GUI::GLCanvas3DManager _3DScene::s_canvas_mgr;
-
-GLModel::GLModel()
- : m_filename("")
-{
- m_volume.shader_outside_printer_detection_enabled = false;
-}
-
-GLModel::~GLModel()
-{
- reset();
-}
-
-void GLModel::set_color(const float* color, unsigned int size)
-{
- ::memcpy((void*)m_volume.color, (const void*)color, (size_t)(std::min((unsigned int)4, size) * sizeof(float)));
- m_volume.set_render_color(color, size);
-}
-
-const Vec3d& GLModel::get_offset() const
-{
- return m_volume.get_volume_offset();
-}
-
-void GLModel::set_offset(const Vec3d& offset)
-{
- m_volume.set_volume_offset(offset);
-}
-
-const Vec3d& GLModel::get_rotation() const
-{
- return m_volume.get_volume_rotation();
-}
-
-void GLModel::set_rotation(const Vec3d& rotation)
-{
- m_volume.set_volume_rotation(rotation);
-}
-
-const Vec3d& GLModel::get_scale() const
-{
- return m_volume.get_volume_scaling_factor();
-}
-
-void GLModel::set_scale(const Vec3d& scale)
-{
- m_volume.set_volume_scaling_factor(scale);
-}
-
-void GLModel::reset()
-{
- m_volume.indexed_vertex_array.release_geometry();
- m_filename = "";
-}
-
-void GLModel::render() const
-{
- glsafe(::glEnable(GL_BLEND));
- glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
-
- glsafe(::glCullFace(GL_BACK));
- glsafe(::glEnableClientState(GL_VERTEX_ARRAY));
- glsafe(::glEnableClientState(GL_NORMAL_ARRAY));
-
- GLint current_program_id;
- glsafe(::glGetIntegerv(GL_CURRENT_PROGRAM, &current_program_id));
- GLint color_id = (current_program_id > 0) ? ::glGetUniformLocation(current_program_id, "uniform_color") : -1;
- glcheck();
-
- m_volume.render(color_id, -1, -1);
-
- glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0));
- glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
-
- glsafe(::glDisableClientState(GL_VERTEX_ARRAY));
- glsafe(::glDisableClientState(GL_NORMAL_ARRAY));
-
- glsafe(::glDisable(GL_BLEND));
-}
-
-bool GLArrow::on_init()
-{
- Pointf3s vertices;
- std::vector<Vec3crd> triangles;
-
- // bottom face
- vertices.emplace_back(0.5, 0.0, -0.1);
- vertices.emplace_back(0.5, 2.0, -0.1);
- vertices.emplace_back(1.0, 2.0, -0.1);
- vertices.emplace_back(0.0, 3.0, -0.1);
- vertices.emplace_back(-1.0, 2.0, -0.1);
- vertices.emplace_back(-0.5, 2.0, -0.1);
- vertices.emplace_back(-0.5, 0.0, -0.1);
-
- // top face
- vertices.emplace_back(0.5, 0.0, 0.1);
- vertices.emplace_back(0.5, 2.0, 0.1);
- vertices.emplace_back(1.0, 2.0, 0.1);
- vertices.emplace_back(0.0, 3.0, 0.1);
- vertices.emplace_back(-1.0, 2.0, 0.1);
- vertices.emplace_back(-0.5, 2.0, 0.1);
- vertices.emplace_back(-0.5, 0.0, 0.1);
-
- // bottom face
- triangles.emplace_back(0, 6, 1);
- triangles.emplace_back(6, 5, 1);
- triangles.emplace_back(5, 4, 3);
- triangles.emplace_back(5, 3, 1);
- triangles.emplace_back(1, 3, 2);
-
- // top face
- triangles.emplace_back(7, 8, 13);
- triangles.emplace_back(13, 8, 12);
- triangles.emplace_back(12, 10, 11);
- triangles.emplace_back(8, 10, 12);
- triangles.emplace_back(8, 9, 10);
-
- // side face
- triangles.emplace_back(0, 1, 8);
- triangles.emplace_back(8, 7, 0);
- triangles.emplace_back(1, 2, 9);
- triangles.emplace_back(9, 8, 1);
- triangles.emplace_back(2, 3, 10);
- triangles.emplace_back(10, 9, 2);
- triangles.emplace_back(3, 4, 11);
- triangles.emplace_back(11, 10, 3);
- triangles.emplace_back(4, 5, 12);
- triangles.emplace_back(12, 11, 4);
- triangles.emplace_back(5, 6, 13);
- triangles.emplace_back(13, 12, 5);
- triangles.emplace_back(6, 0, 7);
- triangles.emplace_back(7, 13, 6);
-
- m_volume.indexed_vertex_array.load_mesh(TriangleMesh(vertices, triangles));
- m_volume.indexed_vertex_array.finalize_geometry(true);
- return true;
-}
-
-GLCurvedArrow::GLCurvedArrow(unsigned int resolution)
- : GLModel()
- , m_resolution(resolution)
-{
- if (m_resolution == 0)
- m_resolution = 1;
-}
-
-bool GLCurvedArrow::on_init()
-{
- Pointf3s vertices;
- std::vector<Vec3crd> triangles;
-
- double ext_radius = 2.5;
- double int_radius = 1.5;
- double step = 0.5 * (double)PI / (double)m_resolution;
-
- unsigned int vertices_per_level = 4 + 2 * m_resolution;
-
- // bottom face
- vertices.emplace_back(0.0, 1.5, -0.1);
- vertices.emplace_back(0.0, 1.0, -0.1);
- vertices.emplace_back(-1.0, 2.0, -0.1);
- vertices.emplace_back(0.0, 3.0, -0.1);
- vertices.emplace_back(0.0, 2.5, -0.1);
-
- for (unsigned int i = 1; i <= m_resolution; ++i)
- {
- double angle = (double)i * step;
- double x = ext_radius * ::sin(angle);
- double y = ext_radius * ::cos(angle);
-
- vertices.emplace_back(x, y, -0.1);
- }
-
- for (unsigned int i = 0; i < m_resolution; ++i)
- {
- double angle = (double)i * step;
- double x = int_radius * ::cos(angle);
- double y = int_radius * ::sin(angle);
-
- vertices.emplace_back(x, y, -0.1);
- }
-
- // top face
- vertices.emplace_back(0.0, 1.5, 0.1);
- vertices.emplace_back(0.0, 1.0, 0.1);
- vertices.emplace_back(-1.0, 2.0, 0.1);
- vertices.emplace_back(0.0, 3.0, 0.1);
- vertices.emplace_back(0.0, 2.5, 0.1);
-
- for (unsigned int i = 1; i <= m_resolution; ++i)
- {
- double angle = (double)i * step;
- double x = ext_radius * ::sin(angle);
- double y = ext_radius * ::cos(angle);
-
- vertices.emplace_back(x, y, 0.1);
- }
-
- for (unsigned int i = 0; i < m_resolution; ++i)
- {
- double angle = (double)i * step;
- double x = int_radius * ::cos(angle);
- double y = int_radius * ::sin(angle);
-
- vertices.emplace_back(x, y, 0.1);
- }
-
- // bottom face
- triangles.emplace_back(0, 1, 2);
- triangles.emplace_back(0, 2, 4);
- triangles.emplace_back(4, 2, 3);
-
- int first_id = 4;
- int last_id = (int)vertices_per_level;
- triangles.emplace_back(last_id, 0, first_id);
- triangles.emplace_back(last_id, first_id, first_id + 1);
- for (unsigned int i = 1; i < m_resolution; ++i)
- {
- triangles.emplace_back(last_id - i, last_id - i + 1, first_id + i);
- triangles.emplace_back(last_id - i, first_id + i, first_id + i + 1);
- }
-
- // top face
- last_id += 1;
- triangles.emplace_back(last_id + 0, last_id + 2, last_id + 1);
- triangles.emplace_back(last_id + 0, last_id + 4, last_id + 2);
- triangles.emplace_back(last_id + 4, last_id + 3, last_id + 2);
-
- first_id = last_id + 4;
- last_id = last_id + 4 + 2 * (int)m_resolution;
- triangles.emplace_back(last_id, first_id, (int)vertices_per_level + 1);
- triangles.emplace_back(last_id, first_id + 1, first_id);
- for (unsigned int i = 1; i < m_resolution; ++i)
- {
- triangles.emplace_back(last_id - i, first_id + i, last_id - i + 1);
- triangles.emplace_back(last_id - i, first_id + i + 1, first_id + i);
- }
-
- // side face
- for (unsigned int i = 0; i < 4 + 2 * (unsigned int)m_resolution; ++i)
- {
- triangles.emplace_back(i, vertices_per_level + 2 + i, i + 1);
- triangles.emplace_back(i, vertices_per_level + 1 + i, vertices_per_level + 2 + i);
- }
- triangles.emplace_back(vertices_per_level, vertices_per_level + 1, 0);
- triangles.emplace_back(vertices_per_level, 2 * vertices_per_level + 1, vertices_per_level + 1);
-
- m_volume.indexed_vertex_array.load_mesh(TriangleMesh(vertices, triangles));
- m_volume.indexed_vertex_array.finalize_geometry(true);
- return true;
-}
-
-bool GLBed::on_init_from_file(const std::string& filename)
-{
- reset();
-
- if (!boost::filesystem::exists(filename))
- return false;
-
- if (!boost::algorithm::iends_with(filename, ".stl"))
- return false;
-
- Model model;
- try
- {
- model = Model::read_from_file(filename);
- }
- catch (std::exception & /* ex */)
- {
- return false;
- }
-
- m_filename = filename;
-
- m_volume.indexed_vertex_array.load_mesh(model.mesh());
- m_volume.indexed_vertex_array.finalize_geometry(true);
-
- float color[4] = { 0.235f, 0.235f, 0.235f, 1.0f };
- set_color(color, 4);
-
- return true;
-}
-
-std::string _3DScene::get_gl_info(bool format_as_html, bool extensions)
-{
- return Slic3r::GUI::GLCanvas3DManager::get_gl_info().to_string(format_as_html, extensions);
-}
-
-bool _3DScene::add_canvas(wxGLCanvas* canvas, GUI::Bed3D& bed, GUI::Camera& camera, GUI::GLToolbar& view_toolbar)
-{
- return s_canvas_mgr.add(canvas, bed, camera, view_toolbar);
-}
-
-bool _3DScene::remove_canvas(wxGLCanvas* canvas)
-{
- return s_canvas_mgr.remove(canvas);
-}
-
-void _3DScene::remove_all_canvases()
-{
- s_canvas_mgr.remove_all();
-}
-
-bool _3DScene::init(wxGLCanvas* canvas)
-{
- return s_canvas_mgr.init(canvas);
-}
-
-void _3DScene::destroy()
-{
- s_canvas_mgr.destroy();
-}
-
-GUI::GLCanvas3D* _3DScene::get_canvas(wxGLCanvas* canvas)
-{
- return s_canvas_mgr.get_canvas(canvas);
-}
-
} // namespace Slic3r
diff --git a/src/slic3r/GUI/3DScene.hpp b/src/slic3r/GUI/3DScene.hpp
index aed907004..6565d5c09 100644
--- a/src/slic3r/GUI/3DScene.hpp
+++ b/src/slic3r/GUI/3DScene.hpp
@@ -6,47 +6,37 @@
#include "libslic3r/Line.hpp"
#include "libslic3r/TriangleMesh.hpp"
#include "libslic3r/Utils.hpp"
-#include "libslic3r/Model.hpp"
-#include "slic3r/GUI/GLCanvas3DManager.hpp"
+#include "libslic3r/Geometry.hpp"
#include <functional>
-#include <memory>
-#ifndef NDEBUG
-#define HAS_GLSAFE
+#if ENABLE_OPENGL_ERROR_LOGGING || ! defined(NDEBUG)
+ #define HAS_GLSAFE
#endif
#ifdef HAS_GLSAFE
-extern void glAssertRecentCallImpl(const char *file_name, unsigned int line, const char *function_name);
-inline void glAssertRecentCall() { glAssertRecentCallImpl(__FILE__, __LINE__, __FUNCTION__); }
-#define glsafe(cmd) do { cmd; glAssertRecentCallImpl(__FILE__, __LINE__, __FUNCTION__); } while (false)
-#define glcheck() do { glAssertRecentCallImpl(__FILE__, __LINE__, __FUNCTION__); } while (false)
-#else
-inline void glAssertRecentCall() { }
-#define glsafe(cmd) cmd
-#define glcheck()
-#endif
+ extern void glAssertRecentCallImpl(const char *file_name, unsigned int line, const char *function_name);
+ inline void glAssertRecentCall() { glAssertRecentCallImpl(__FILE__, __LINE__, __FUNCTION__); }
+ #define glsafe(cmd) do { cmd; glAssertRecentCallImpl(__FILE__, __LINE__, __FUNCTION__); } while (false)
+ #define glcheck() do { glAssertRecentCallImpl(__FILE__, __LINE__, __FUNCTION__); } while (false)
+#else // HAS_GLSAFE
+ inline void glAssertRecentCall() { }
+ #define glsafe(cmd) cmd
+ #define glcheck()
+#endif // HAS_GLSAFE
namespace Slic3r {
-namespace GUI {
-class Bed3D;
-struct Camera;
-class GLToolbar;
-} // namespace GUI
-
-class Print;
-class PrintObject;
-class SLAPrint;
class SLAPrintObject;
enum SLAPrintObjectStep : unsigned int;
-class Model;
-class ModelObject;
class DynamicPrintConfig;
class ExtrusionPath;
class ExtrusionMultiPath;
class ExtrusionLoop;
class ExtrusionEntity;
class ExtrusionEntityCollection;
+class ModelObject;
+class ModelVolume;
+enum ModelInstanceEPrintVolumeState : unsigned char;
// A container for interleaved arrays of 3D vertices and normals,
// possibly indexed by triangles and / or quads.
@@ -129,8 +119,13 @@ public:
unsigned int triangle_indices_VBO_id{ 0 };
unsigned int quad_indices_VBO_id{ 0 };
- void load_mesh_full_shading(const TriangleMesh &mesh);
+#if ENABLE_SMOOTH_NORMALS
+ void load_mesh_full_shading(const TriangleMesh& mesh, bool smooth_normals = false);
+ void load_mesh(const TriangleMesh& mesh, bool smooth_normals = false) { this->load_mesh_full_shading(mesh, smooth_normals); }
+#else
+ void load_mesh_full_shading(const TriangleMesh& mesh);
void load_mesh(const TriangleMesh& mesh) { this->load_mesh_full_shading(mesh); }
+#endif // ENABLE_SMOOTH_NORMALS
inline bool has_VBOs() const { return vertices_and_normals_interleaved_VBO_id != 0; }
@@ -256,6 +251,7 @@ public:
static const float MODEL_COLOR[4][4];
static const float SLA_SUPPORT_COLOR[4];
static const float SLA_PAD_COLOR[4];
+ static const float NEUTRAL_COLOR[4];
enum EHoverState : unsigned char
{
@@ -341,6 +337,8 @@ public:
bool force_transparent : 1;
// Whether or not always use the volume's own color (not using SELECTED/HOVER/DISABLED/OUTSIDE)
bool force_native_color : 1;
+ // Whether or not render this volume in neutral
+ bool force_neutral_color : 1;
};
// Is mouse or rectangle selection over this object to select/deselect it ?
@@ -449,7 +447,6 @@ public:
void set_range(double low, double high);
void render() const;
- void render(int color_id, int detection_id, int worldmatrix_id) const;
void finalize_geometry(bool opengl_initialized) { this->indexed_vertex_array.finalize_geometry(opengl_initialized); }
void release_geometry() { this->indexed_vertex_array.release_geometry(); }
@@ -485,20 +482,29 @@ public:
private:
// min and max vertex of the print box volume
- float print_box_min[3];
- float print_box_max[3];
+ float m_print_box_min[3];
+ float m_print_box_max[3];
// z range for clipping in shaders
- float z_range[2];
+ float m_z_range[2];
// plane coeffs for clipping in shaders
- float clipping_plane[4];
+ float m_clipping_plane[4];
+
+ struct Slope
+ {
+ // toggle for slope rendering
+ bool active{ false };
+ float normal_z;
+ };
+
+ Slope m_slope;
public:
GLVolumePtrs volumes;
- GLVolumeCollection() {};
- ~GLVolumeCollection() { clear(); };
+ GLVolumeCollection() { set_default_slope_normal_z(); }
+ ~GLVolumeCollection() { clear(); }
std::vector<int> load_object(
const ModelObject *model_object,
@@ -549,16 +555,23 @@ public:
void set_range(double low, double high) { for (GLVolume *vol : this->volumes) vol->set_range(low, high); }
void set_print_box(float min_x, float min_y, float min_z, float max_x, float max_y, float max_z) {
- print_box_min[0] = min_x; print_box_min[1] = min_y; print_box_min[2] = min_z;
- print_box_max[0] = max_x; print_box_max[1] = max_y; print_box_max[2] = max_z;
+ m_print_box_min[0] = min_x; m_print_box_min[1] = min_y; m_print_box_min[2] = min_z;
+ m_print_box_max[0] = max_x; m_print_box_max[1] = max_y; m_print_box_max[2] = max_z;
}
- void set_z_range(float min_z, float max_z) { z_range[0] = min_z; z_range[1] = max_z; }
- void set_clipping_plane(const double* coeffs) { clipping_plane[0] = coeffs[0]; clipping_plane[1] = coeffs[1]; clipping_plane[2] = coeffs[2]; clipping_plane[3] = coeffs[3]; }
+ void set_z_range(float min_z, float max_z) { m_z_range[0] = min_z; m_z_range[1] = max_z; }
+ void set_clipping_plane(const double* coeffs) { m_clipping_plane[0] = coeffs[0]; m_clipping_plane[1] = coeffs[1]; m_clipping_plane[2] = coeffs[2]; m_clipping_plane[3] = coeffs[3]; }
+
+ bool is_slope_active() const { return m_slope.active; }
+ void set_slope_active(bool active) { m_slope.active = active; }
+
+ float get_slope_normal_z() const { return m_slope.normal_z; }
+ void set_slope_normal_z(float normal_z) { m_slope.normal_z = normal_z; }
+ void set_default_slope_normal_z() { m_slope.normal_z = -::cos(Geometry::deg2rad(90.0f - 45.0f)); }
// returns true if all the volumes are completely contained in the print volume
// returns the containment state in the given out_state, if non-null
- bool check_outside_state(const DynamicPrintConfig* config, ModelInstance::EPrintVolumeState* out_state);
+ bool check_outside_state(const DynamicPrintConfig* config, ModelInstanceEPrintVolumeState* out_state);
void reset_outside_state();
void update_colors_by_extruder(const DynamicPrintConfig* config);
@@ -575,8 +588,6 @@ public:
std::string log_memory_info() const;
bool has_toolpaths_to_export() const;
- // Export the geometry of the GLVolumes toolpaths of this collection into the file with the given path, in obj format
- void export_toolpaths_to_obj(const char* filename) const;
private:
GLVolumeCollection(const GLVolumeCollection &other);
@@ -585,82 +596,8 @@ private:
GLVolumeWithIdAndZList volumes_to_render(const GLVolumePtrs& volumes, GLVolumeCollection::ERenderType type, const Transform3d& view_matrix, std::function<bool(const GLVolume&)> filter_func = nullptr);
-class GLModel
-{
-protected:
- GLVolume m_volume;
- std::string m_filename;
-
-public:
- GLModel();
- virtual ~GLModel();
-
- // init() / init_from_file() shall be called with the OpenGL context active!
- bool init() { return on_init(); }
- bool init_from_file(const std::string& filename) { return on_init_from_file(filename); }
-
- void center_around(const Vec3d& center) { m_volume.set_volume_offset(center - m_volume.bounding_box().center()); }
- void set_color(const float* color, unsigned int size);
-
- const Vec3d& get_offset() const;
- void set_offset(const Vec3d& offset);
- const Vec3d& get_rotation() const;
- void set_rotation(const Vec3d& rotation);
- const Vec3d& get_scale() const;
- void set_scale(const Vec3d& scale);
-
- const std::string& get_filename() const { return m_filename; }
- const BoundingBoxf3& get_bounding_box() const { return m_volume.bounding_box(); }
- const BoundingBoxf3& get_transformed_bounding_box() const { return m_volume.transformed_bounding_box(); }
-
- void reset();
-
- void render() const;
-
-protected:
- virtual bool on_init() { return false; }
- virtual bool on_init_from_file(const std::string& filename) { return false; }
-};
-
-class GLArrow : public GLModel
-{
-protected:
- bool on_init() override;
-};
-
-class GLCurvedArrow : public GLModel
-{
- unsigned int m_resolution;
-
-public:
- explicit GLCurvedArrow(unsigned int resolution);
-
-protected:
- bool on_init() override;
-};
-
-class GLBed : public GLModel
+struct _3DScene
{
-protected:
- bool on_init_from_file(const std::string& filename) override;
-};
-
-class _3DScene
-{
- static GUI::GLCanvas3DManager s_canvas_mgr;
-
-public:
- static std::string get_gl_info(bool format_as_html, bool extensions);
-
- static bool add_canvas(wxGLCanvas* canvas, GUI::Bed3D& bed, GUI::Camera& camera, GUI::GLToolbar& view_toolbar);
- static bool remove_canvas(wxGLCanvas* canvas);
- static void remove_all_canvases();
-
- static bool init(wxGLCanvas* canvas);
- static void destroy();
-
- static GUI::GLCanvas3D* get_canvas(wxGLCanvas* canvas);
-
static void thick_lines_to_verts(const Lines& lines, const std::vector<double>& widths, const std::vector<double>& heights, bool closed, double top_z, GLVolume& volume);
static void thick_lines_to_verts(const Lines3& lines, const std::vector<double>& widths, const std::vector<double>& heights, bool closed, GLVolume& volume);
static void extrusionentity_to_verts(const Polyline &polyline, float width, float height, float print_z, GLVolume& volume);
@@ -674,6 +611,8 @@ public:
static void point3_to_verts(const Vec3crd& point, double width, double height, GLVolume& volume);
};
+static constexpr float BedEpsilon = 3.f * float(EPSILON);
+
}
#endif
diff --git a/src/slic3r/GUI/AboutDialog.cpp b/src/slic3r/GUI/AboutDialog.cpp
index 98b04a63d..5152260f5 100644
--- a/src/slic3r/GUI/AboutDialog.cpp
+++ b/src/slic3r/GUI/AboutDialog.cpp
@@ -2,8 +2,12 @@
#include "I18N.hpp"
#include "libslic3r/Utils.hpp"
+#include "GUI.hpp"
#include "GUI_App.hpp"
-#include "wxExtensions.hpp"
+#include "MainFrame.hpp"
+#include "format.hpp"
+
+#include <wx/clipbrd.h>
namespace Slic3r {
namespace GUI {
@@ -36,10 +40,10 @@ void AboutDialogLogo::onRepaint(wxEvent &event)
// CopyrightsDialog
// -----------------------------------------
CopyrightsDialog::CopyrightsDialog()
- : DPIDialog(NULL, wxID_ANY, from_u8((boost::format("%1% - %2%")
- % SLIC3R_APP_NAME
- % _utf8(L("Portions copyright"))).str()),
- wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
+ : DPIDialog(static_cast<wxWindow*>(wxGetApp().mainframe), wxID_ANY, from_u8((boost::format("%1% - %2%")
+ % (wxGetApp().is_editor() ? SLIC3R_APP_NAME : GCODEVIEWER_APP_NAME)
+ % _utf8(L("Portions copyright"))).str()),
+ wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
{
this->SetFont(wxGetApp().normal_font());
this->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
@@ -51,7 +55,7 @@ CopyrightsDialog::CopyrightsDialog()
m_html = new wxHtmlWindow(this, wxID_ANY, wxDefaultPosition,
wxSize(40 * em_unit(), 20 * em_unit()), wxHW_SCROLLBAR_AUTO);
- wxFont font = GetFont();
+ wxFont font = get_default_font(this);
const int fs = font.GetPointSize();
const int fs2 = static_cast<int>(1.2f*fs);
int size[] = { fs, fs, fs, fs, fs2, fs2, fs2 };
@@ -114,7 +118,9 @@ void CopyrightsDialog::fill_entries()
{ "Icons for STL and GCODE files."
, "Akira Yasuda" , "http://3dp0.com/icons-for-stl-and-gcode/" },
{ "AppImage packaging for Linux using AppImageKit"
- , "2004-2019 Simon Peter and contributors" , "https://appimage.org/" }
+ , "2004-2019 Simon Peter and contributors" , "https://appimage.org/" },
+ { "lib_fts"
+ , "Forrest Smith" , "https://www.forrestthewoods.com/" }
};
}
@@ -147,9 +153,8 @@ wxString CopyrightsDialog::get_html_text()
, entry.link, entry.lib_name);
if (!entry.copyright.empty())
- text += wxString::Format(
- "%s %s"
- "<br/><br/>"
+ text += format_wxstr(
+ "%1% %2%<br/><br/>"
, copyright_str, entry.copyright);
}
@@ -198,8 +203,8 @@ void CopyrightsDialog::onCloseDialog(wxEvent &)
}
AboutDialog::AboutDialog()
- : DPIDialog(NULL, wxID_ANY, from_u8((boost::format(_utf8(L("About %s"))) % SLIC3R_APP_NAME).str()), wxDefaultPosition,
- wxDefaultSize, /*wxCAPTION*/wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
+ : DPIDialog(static_cast<wxWindow*>(wxGetApp().mainframe), wxID_ANY, from_u8((boost::format(_utf8(L("About %s"))) % (wxGetApp().is_editor() ? SLIC3R_APP_NAME : GCODEVIEWER_APP_NAME)).str()), wxDefaultPosition,
+ wxDefaultSize, /*wxCAPTION*/wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
{
SetFont(wxGetApp().normal_font());
@@ -211,7 +216,7 @@ AboutDialog::AboutDialog()
main_sizer->Add(hsizer, 0, wxEXPAND | wxALL, 20);
// logo
- m_logo_bitmap = ScalableBitmap(this, "PrusaSlicer_192px.png", 192);
+ m_logo_bitmap = ScalableBitmap(this, wxGetApp().is_editor() ? "PrusaSlicer_192px.png" : "PrusaSlicer-gcodeviewer_192px.png", 192);
m_logo = new wxStaticBitmap(this, wxID_ANY, m_logo_bitmap.bmp());
hsizer->Add(m_logo, 1, wxALIGN_CENTER_VERTICAL);
@@ -220,7 +225,7 @@ AboutDialog::AboutDialog()
// title
{
- wxStaticText* title = new wxStaticText(this, wxID_ANY, SLIC3R_APP_NAME, wxDefaultPosition, wxDefaultSize);
+ wxStaticText* title = new wxStaticText(this, wxID_ANY, wxGetApp().is_editor() ? SLIC3R_APP_NAME : GCODEVIEWER_APP_NAME, wxDefaultPosition, wxDefaultSize);
wxFont title_font = GUI::wxGetApp().bold_font();
title_font.SetFamily(wxFONTFAMILY_ROMAN);
title_font.SetPointSize(24);
@@ -230,7 +235,7 @@ AboutDialog::AboutDialog()
// version
{
- auto version_string = _(L("Version"))+ " " + std::string(SLIC3R_VERSION);
+ auto version_string = _L("Version") + " " + std::string(SLIC3R_VERSION);
wxStaticText* version = new wxStaticText(this, wxID_ANY, version_string.c_str(), wxDefaultPosition, wxDefaultSize);
wxFont version_font = GetFont();
#ifdef __WXMSW__
@@ -246,7 +251,7 @@ AboutDialog::AboutDialog()
m_html = new wxHtmlWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_AUTO/*NEVER*/);
{
m_html->SetMinSize(wxSize(-1, 16 * wxGetApp().em_unit()));
- wxFont font = GetFont();
+ wxFont font = get_default_font(this);
const auto text_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
auto text_clr_str = wxString::Format(wxT("#%02X%02X%02X"), text_clr.Red(), text_clr.Green(), text_clr.Blue());
auto bgr_clr_str = wxString::Format(wxT("#%02X%02X%02X"), bgr_clr.Red(), bgr_clr.Green(), bgr_clr.Blue());
@@ -291,9 +296,14 @@ AboutDialog::AboutDialog()
wxStdDialogButtonSizer* buttons = this->CreateStdDialogButtonSizer(wxCLOSE);
m_copy_rights_btn_id = NewControlId();
- auto copy_rights_btn = new wxButton(this, m_copy_rights_btn_id, _(L("Portions copyright"))+dots);
+ auto copy_rights_btn = new wxButton(this, m_copy_rights_btn_id, _L("Portions copyright")+dots);
buttons->Insert(0, copy_rights_btn, 0, wxLEFT, 5);
copy_rights_btn->Bind(wxEVT_BUTTON, &AboutDialog::onCopyrightBtn, this);
+
+ m_copy_version_btn_id = NewControlId();
+ auto copy_version_btn = new wxButton(this, m_copy_version_btn_id, _L("Copy Version Info"));
+ buttons->Insert(1, copy_version_btn, 0, wxLEFT, 5);
+ copy_version_btn->Bind(wxEVT_BUTTON, &AboutDialog::onCopyToClipboard, this);
this->SetEscapeId(wxID_CLOSE);
this->Bind(wxEVT_BUTTON, &AboutDialog::onCloseDialog, this, wxID_CLOSE);
@@ -345,5 +355,12 @@ void AboutDialog::onCopyrightBtn(wxEvent &)
dlg.ShowModal();
}
+void AboutDialog::onCopyToClipboard(wxEvent&)
+{
+ wxTheClipboard->Open();
+ wxTheClipboard->SetData(new wxTextDataObject(_L("Version") + " " + std::string(SLIC3R_VERSION)));
+ wxTheClipboard->Close();
+}
+
} // namespace GUI
} // namespace Slic3r
diff --git a/src/slic3r/GUI/AboutDialog.hpp b/src/slic3r/GUI/AboutDialog.hpp
index 5fec21495..8774d8ce8 100644
--- a/src/slic3r/GUI/AboutDialog.hpp
+++ b/src/slic3r/GUI/AboutDialog.hpp
@@ -1,8 +1,6 @@
#ifndef slic3r_GUI_AboutDialog_hpp_
#define slic3r_GUI_AboutDialog_hpp_
-#include "GUI.hpp"
-
#include <wx/wx.h>
#include <wx/intl.h>
#include <wx/html/htmlwin.h>
@@ -62,6 +60,7 @@ class AboutDialog : public DPIDialog
wxHtmlWindow* m_html;
wxStaticBitmap* m_logo;
int m_copy_rights_btn_id { wxID_ANY };
+ int m_copy_version_btn_id { wxID_ANY };
public:
AboutDialog();
@@ -72,6 +71,7 @@ private:
void onLinkClicked(wxHtmlLinkEvent &event);
void onCloseDialog(wxEvent &);
void onCopyrightBtn(wxEvent &);
+ void onCopyToClipboard(wxEvent&);
};
} // namespace GUI
diff --git a/src/slic3r/GUI/BackgroundSlicingProcess.cpp b/src/slic3r/GUI/BackgroundSlicingProcess.cpp
index 35a55d767..2cc9f84a3 100644
--- a/src/slic3r/GUI/BackgroundSlicingProcess.cpp
+++ b/src/slic3r/GUI/BackgroundSlicingProcess.cpp
@@ -1,6 +1,7 @@
#include "BackgroundSlicingProcess.hpp"
#include "GUI_App.hpp"
#include "GUI.hpp"
+#include "MainFrame.hpp"
#include <wx/app.h>
#include <wx/panel.h>
@@ -11,34 +12,84 @@
#include <wx/wfstream.h>
#include <wx/zipstrm.h>
-#if ENABLE_THUMBNAIL_GENERATOR
#include <miniz.h>
-#endif // ENABLE_THUMBNAIL_GENERATOR
// Print now includes tbb, and tbb includes Windows. This breaks compilation of wxWidgets if included before wx.
#include "libslic3r/Print.hpp"
#include "libslic3r/SLAPrint.hpp"
#include "libslic3r/Utils.hpp"
#include "libslic3r/GCode/PostProcessor.hpp"
-#include "libslic3r/GCode/PreviewData.hpp"
+#include "libslic3r/Format/SL1.hpp"
+#include "libslic3r/Thread.hpp"
#include "libslic3r/libslic3r.h"
#include <cassert>
#include <stdexcept>
#include <cctype>
-#include <algorithm>
-#include <boost/format.hpp>
-#include <boost/filesystem/path.hpp>
-#include <boost/filesystem.hpp>
+#include <boost/format/format_fwd.hpp>
+#include <boost/filesystem/operations.hpp>
#include <boost/log/trivial.hpp>
#include <boost/nowide/cstdio.hpp>
#include "I18N.hpp"
-#include "GUI.hpp"
#include "RemovableDriveManager.hpp"
+#include "slic3r/GUI/Plater.hpp"
+
namespace Slic3r {
+bool SlicingProcessCompletedEvent::critical_error() const
+{
+ try {
+ this->rethrow_exception();
+ } catch (const Slic3r::SlicingError &) {
+ // Exception derived from SlicingError is non-critical.
+ return false;
+ } catch (...) {
+ }
+ 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::pair<std::string, bool> SlicingProcessCompletedEvent::format_error_message() const
+{
+ std::string error;
+ bool monospace = false;
+ try {
+ this->rethrow_exception();
+ } catch (const std::bad_alloc& ex) {
+ wxString errmsg = GUI::from_u8((boost::format(_utf8(L("%s has encountered an error. It was likely caused by running out of memory. "
+ "If you are sure you have enough RAM on your system, this may also be a bug and we would "
+ "be glad if you reported it."))) % SLIC3R_APP_NAME).str());
+ error = std::string(errmsg.ToUTF8()) + "\n\n" + std::string(ex.what());
+ } catch (PlaceholderParserError &ex) {
+ error = ex.what();
+ monospace = true;
+ } catch (std::exception &ex) {
+ error = ex.what();
+ } catch (...) {
+ error = "Unknown C++ exception.";
+ }
+ return std::make_pair(std::move(error), monospace);
+}
+
BackgroundSlicingProcess::BackgroundSlicingProcess()
{
boost::filesystem::path temp_path(wxStandardPaths::Get().GetTempDir().utf8_str().data());
@@ -89,45 +140,55 @@ void BackgroundSlicingProcess::process_fff()
{
assert(m_print == m_fff_print);
m_print->process();
- wxQueueEvent(GUI::wxGetApp().mainframe->m_plater, new wxCommandEvent(m_event_slicing_completed_id));
-#if ENABLE_THUMBNAIL_GENERATOR
- m_fff_print->export_gcode(m_temp_output_path, m_gcode_preview_data, m_thumbnail_cb);
-#else
- m_fff_print->export_gcode(m_temp_output_path, m_gcode_preview_data);
-#endif // ENABLE_THUMBNAIL_GENERATOR
-
+ wxCommandEvent evt(m_event_slicing_completed_id);
+ // Post the Slicing Finished message for the G-code viewer to update.
+ // Passing the timestamp
+ evt.SetInt((int)(m_fff_print->step_state_with_timestamp(PrintStep::psSlicingFinished).timestamp));
+ wxQueueEvent(GUI::wxGetApp().mainframe->m_plater, evt.Clone());
+ m_fff_print->export_gcode(m_temp_output_path, m_gcode_result, m_thumbnail_cb);
if (this->set_step_started(bspsGCodeFinalize)) {
if (! m_export_path.empty()) {
+ wxQueueEvent(GUI::wxGetApp().mainframe->m_plater, new wxCommandEvent(m_event_export_began_id));
//FIXME localize the messages
// Perform the final post-processing of the export path by applying the print statistics over the file name.
std::string export_path = m_fff_print->print_statistics().finalize_output_path(m_export_path);
- int copy_ret_val = copy_file(m_temp_output_path, export_path, m_export_path_on_removable_media);
+ std::string error_message;
+ int copy_ret_val = CopyFileResult::SUCCESS;
+ try
+ {
+ copy_ret_val = copy_file(m_temp_output_path, export_path, error_message, m_export_path_on_removable_media);
+ }
+ catch (...)
+ {
+ throw Slic3r::ExportError(_utf8(L("Unknown error occured during exporting G-code.")));
+ }
switch (copy_ret_val) {
- case SUCCESS: break; // no error
- case FAIL_COPY_FILE:
- throw std::runtime_error(_utf8(L("Copying of the temporary G-code to the output G-code failed. Maybe the SD card is write locked?")));
+ case CopyFileResult::SUCCESS: break; // no error
+ case CopyFileResult::FAIL_COPY_FILE:
+ 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 std::runtime_error((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());
+ case CopyFileResult::FAIL_FILES_DIFFERENT:
+ 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 std::runtime_error((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());
+ case CopyFileResult::FAIL_RENAMING:
+ 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 std::runtime_error((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());
+ case CopyFileResult::FAIL_CHECK_ORIGIN_NOT_OPENED:
+ 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 std::runtime_error((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());
+ case CopyFileResult::FAIL_CHECK_TARGET_NOT_OPENED:
+ 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:
- BOOST_LOG_TRIVIAL(warning) << "Unexpected fail code(" << (int)copy_ret_val << ") durring copy_file() to " << export_path << ".";
+ throw Slic3r::ExportError(_utf8(L("Unknown error occured during exporting G-code.")));
+ BOOST_LOG_TRIVIAL(error) << "Unexpected fail code(" << (int)copy_ret_val << ") durring copy_file() to " << export_path << ".";
break;
}
-
m_print->set_status(95, _utf8(L("Running post-processing scripts")));
- run_post_process_scripts(export_path, m_fff_print->config());
+ run_post_process_scripts(export_path, m_fff_print->full_print_config());
m_print->set_status(100, (boost::format(_utf8(L("G-code file exported to %1%"))) % export_path).str());
} else if (! m_upload_job.empty()) {
+ wxQueueEvent(GUI::wxGetApp().mainframe->m_plater, new wxCommandEvent(m_event_export_began_id));
prepare_upload();
} else {
m_print->set_status(100, _utf8(L("Slicing complete")));
@@ -136,7 +197,6 @@ void BackgroundSlicingProcess::process_fff()
}
}
-#if ENABLE_THUMBNAIL_GENERATOR
static void write_thumbnail(Zipper& zipper, const ThumbnailData& data)
{
size_t png_size = 0;
@@ -147,7 +207,6 @@ static void write_thumbnail(Zipper& zipper, const ThumbnailData& data)
mz_free(png_data);
}
}
-#endif // ENABLE_THUMBNAIL_GENERATOR
void BackgroundSlicingProcess::process_sla()
{
@@ -155,12 +214,13 @@ void BackgroundSlicingProcess::process_sla()
m_print->process();
if (this->set_step_started(bspsGCodeFinalize)) {
if (! m_export_path.empty()) {
+ wxQueueEvent(GUI::wxGetApp().mainframe->m_plater, new wxCommandEvent(m_event_export_began_id));
+
const std::string export_path = m_sla_print->print_statistics().finalize_output_path(m_export_path);
Zipper zipper(export_path);
- m_sla_print->export_raster(zipper);
+ m_sla_archive.export_print(zipper, *m_sla_print);
-#if ENABLE_THUMBNAIL_GENERATOR
if (m_thumbnail_cb != nullptr)
{
ThumbnailsList thumbnails;
@@ -172,12 +232,12 @@ void BackgroundSlicingProcess::process_sla()
write_thumbnail(zipper, data);
}
}
-#endif // ENABLE_THUMBNAIL_GENERATOR
zipper.finalize();
m_print->set_status(100, (boost::format(_utf8(L("Masked SLA file exported to %1%"))) % export_path).str());
} else if (! m_upload_job.empty()) {
+ wxQueueEvent(GUI::wxGetApp().mainframe->m_plater, new wxCommandEvent(m_event_export_began_id));
prepare_upload();
} else {
m_print->set_status(100, _utf8(L("Slicing complete")));
@@ -188,6 +248,9 @@ void BackgroundSlicingProcess::process_sla()
void BackgroundSlicingProcess::thread_proc()
{
+ set_current_thread_name("slic3r_BgSlcPcs");
+ name_tbb_thread_pool_threads();
+
assert(m_print != nullptr);
assert(m_print == m_fff_print || m_print == m_sla_print);
std::unique_lock<std::mutex> lck(m_mutex);
@@ -206,7 +269,7 @@ void BackgroundSlicingProcess::thread_proc()
// Process the background slicing task.
m_state = STATE_RUNNING;
lck.unlock();
- std::string error;
+ std::exception_ptr exception;
try {
assert(m_print != nullptr);
switch(m_print->technology()) {
@@ -217,15 +280,8 @@ void BackgroundSlicingProcess::thread_proc()
} catch (CanceledException & /* ex */) {
// Canceled, this is all right.
assert(m_print->canceled());
- } catch (const std::bad_alloc& ex) {
- wxString errmsg = GUI::from_u8((boost::format(_utf8(L("%s has encountered an error. It was likely caused by running out of memory. "
- "If you are sure you have enough RAM on your system, this may also be a bug and we would "
- "be glad if you reported it."))) % SLIC3R_APP_NAME).str());
- error = std::string(errmsg.ToUTF8()) + "\n\n" + std::string(ex.what());
- } catch (std::exception &ex) {
- error = ex.what();
} catch (...) {
- error = "Unknown C++ exception.";
+ exception = std::current_exception();
}
m_print->finalize();
lck.lock();
@@ -233,9 +289,9 @@ void BackgroundSlicingProcess::thread_proc()
if (m_print->cancel_status() != Print::CANCELED_INTERNAL) {
// Only post the canceled event, if canceled by user.
// Don't post the canceled event, if canceled from Print::apply().
- wxCommandEvent evt(m_event_finished_id);
- evt.SetString(GUI::from_u8(error));
- evt.SetInt(m_print->canceled() ? -1 : (error.empty() ? 1 : 0));
+ SlicingProcessCompletedEvent evt(m_event_finished_id, 0,
+ (m_state == STATE_CANCELED) ? SlicingProcessCompletedEvent::Cancelled :
+ exception ? SlicingProcessCompletedEvent::Error : SlicingProcessCompletedEvent::Finished, exception);
wxQueueEvent(GUI::wxGetApp().mainframe->m_plater, evt.Clone());
}
m_print->restart();
@@ -295,7 +351,7 @@ bool BackgroundSlicingProcess::start()
// The background processing thread is already running.
return false;
if (! this->idle())
- throw std::runtime_error("Cannot start a background task, the worker thread is not idle.");
+ throw Slic3r::RuntimeError("Cannot start a background task, the worker thread is not idle.");
m_state = STATE_STARTED;
m_print->set_cancel_callback([this](){ this->stop_internal(); });
lck.unlock();
@@ -385,11 +441,12 @@ Print::ApplyStatus BackgroundSlicingProcess::apply(const Model &model, const Dyn
assert(config.opt_enum<PrinterTechnology>("printer_technology") == m_print->technology());
Print::ApplyStatus invalidated = m_print->apply(model, config);
if ((invalidated & PrintBase::APPLY_STATUS_INVALIDATED) != 0 && m_print->technology() == ptFFF &&
- m_gcode_preview_data != nullptr && ! this->m_fff_print->is_step_done(psGCodeExport)) {
+ !this->m_fff_print->is_step_done(psGCodeExport)) {
// Some FFF status was invalidated, and the G-code was not exported yet.
// Let the G-code preview UI know that the final G-code preview is not valid.
// In addition, this early memory deallocation reduces memory footprint.
- m_gcode_preview_data->reset();
+ if (m_gcode_result != nullptr)
+ m_gcode_result->reset();
}
return invalidated;
}
@@ -477,17 +534,17 @@ void BackgroundSlicingProcess::prepare_upload()
if (m_print == m_fff_print) {
m_print->set_status(95, _utf8(L("Running post-processing scripts")));
- if (copy_file(m_temp_output_path, source_path.string()) != SUCCESS) {
- throw std::runtime_error(_utf8(L("Copying of the temporary G-code to the output G-code failed")));
+ std::string error_message;
+ if (copy_file(m_temp_output_path, source_path.string(), error_message) != SUCCESS) {
+ throw Slic3r::RuntimeError(_utf8(L("Copying of the temporary G-code to the output G-code failed")));
}
- run_post_process_scripts(source_path.string(), m_fff_print->config());
+ run_post_process_scripts(source_path.string(), m_fff_print->full_print_config());
m_upload_job.upload_data.upload_path = m_fff_print->print_statistics().finalize_output_path(m_upload_job.upload_data.upload_path.string());
} else {
m_upload_job.upload_data.upload_path = m_sla_print->print_statistics().finalize_output_path(m_upload_job.upload_data.upload_path.string());
-
+
Zipper zipper{source_path.string()};
- m_sla_print->export_raster(zipper, m_upload_job.upload_data.upload_path.string());
-#if ENABLE_THUMBNAIL_GENERATOR
+ m_sla_archive.export_print(zipper, *m_sla_print, m_upload_job.upload_data.upload_path.string());
if (m_thumbnail_cb != nullptr)
{
ThumbnailsList thumbnails;
@@ -499,7 +556,6 @@ void BackgroundSlicingProcess::prepare_upload()
write_thumbnail(zipper, data);
}
}
-#endif // ENABLE_THUMBNAIL_GENERATOR
zipper.finalize();
}
diff --git a/src/slic3r/GUI/BackgroundSlicingProcess.hpp b/src/slic3r/GUI/BackgroundSlicingProcess.hpp
index d091ecb31..b3f8a0a6b 100644
--- a/src/slic3r/GUI/BackgroundSlicingProcess.hpp
+++ b/src/slic3r/GUI/BackgroundSlicingProcess.hpp
@@ -5,18 +5,20 @@
#include <condition_variable>
#include <mutex>
-#include <boost/filesystem.hpp>
-
#include <wx/event.h>
-#include "libslic3r/Print.hpp"
+#include "libslic3r/PrintBase.hpp"
+#include "libslic3r/GCode/ThumbnailData.hpp"
+#include "libslic3r/Format/SL1.hpp"
#include "slic3r/Utils/PrintHost.hpp"
-#include "slic3r/Utils/Thread.hpp"
+#include "libslic3r/GCode/GCodeProcessor.hpp"
+
+
+namespace boost { namespace filesystem { class path; } }
namespace Slic3r {
class DynamicPrintConfig;
-class GCodePreviewData;
class Model;
class SLAPrint;
@@ -30,6 +32,39 @@ public:
PrintBase::SlicingStatus status;
};
+class SlicingProcessCompletedEvent : public wxEvent
+{
+public:
+ enum StatusType {
+ Finished,
+ Cancelled,
+ Error
+ };
+
+ SlicingProcessCompletedEvent(wxEventType eventType, int winid, StatusType status, std::exception_ptr exception) :
+ wxEvent(winid, eventType), m_status(status), m_exception(exception) {}
+ virtual wxEvent* Clone() const { return new SlicingProcessCompletedEvent(*this); }
+
+ StatusType status() const { return m_status; }
+ bool finished() const { return m_status == Finished; }
+ bool success() const { return m_status == Finished; }
+ bool cancelled() const { return m_status == Cancelled; }
+ 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.
+ // 2nd parameter defines whether the output should be displayed with a monospace font.
+ std::pair<std::string, bool> format_error_message() const;
+
+private:
+ StatusType m_status;
+ std::exception_ptr m_exception;
+};
+
wxDEFINE_EVENT(EVT_SLICING_UPDATE, SlicingStatusEvent);
// Print step IDs for keeping track of the print state.
@@ -47,11 +82,9 @@ public:
~BackgroundSlicingProcess();
void set_fff_print(Print *print) { m_fff_print = print; }
- void set_sla_print(SLAPrint *print) { m_sla_print = print; }
- void set_gcode_preview_data(GCodePreviewData *gpd) { m_gcode_preview_data = gpd; }
-#if ENABLE_THUMBNAIL_GENERATOR
- void set_thumbnail_cb(ThumbnailsGeneratorCallback cb) { m_thumbnail_cb = cb; }
-#endif // ENABLE_THUMBNAIL_GENERATOR
+ void set_sla_print(SLAPrint *print) { m_sla_print = print; m_sla_print->set_printer(&m_sla_archive); }
+ void set_thumbnail_cb(ThumbnailsGeneratorCallback cb) { m_thumbnail_cb = cb; }
+ void set_gcode_result(GCodeProcessor::Result* result) { m_gcode_result = result; }
// The following wxCommandEvent will be sent to the UI thread / Plater window, when the slicing is finished
// and the background processing will transition into G-code export.
@@ -60,6 +93,10 @@ public:
// The following wxCommandEvent will be sent to the UI thread / Plater window, when the G-code export is finished.
// The wxCommandEvent is sent to the UI thread asynchronously without waiting for the event to be processed.
void set_finished_event(int event_id) { m_event_finished_id = event_id; }
+ // The following wxCommandEvent will be sent to the UI thread / Plater window, when the G-code is being exported to
+ // specified path or uploaded.
+ // The wxCommandEvent is sent to the UI thread asynchronously without waiting for the event to be processed.
+ void set_export_began_event(int event_id) { m_event_export_began_id = event_id; }
// Activate either m_fff_print or m_sla_print.
// Return true if changed.
@@ -86,7 +123,7 @@ public:
// Apply config over the print. Returns false, if the new config values caused any of the already
// processed steps to be invalidated, therefore the task will need to be restarted.
- Print::ApplyStatus apply(const Model &model, const DynamicPrintConfig &config);
+ PrintBase::ApplyStatus apply(const Model &model, const DynamicPrintConfig &config);
// After calling the apply() function, set_task() may be called to limit the task to be processed by process().
// This is useful for calculating SLA supports for a single object only.
void set_task(const PrintBase::TaskParams &params);
@@ -154,12 +191,11 @@ private:
Print *m_fff_print = nullptr;
SLAPrint *m_sla_print = nullptr;
// Data structure, to which the G-code export writes its annotations.
- GCodePreviewData *m_gcode_preview_data = nullptr;
-#if ENABLE_THUMBNAIL_GENERATOR
- // Callback function, used to write thumbnails into gcode.
- ThumbnailsGeneratorCallback m_thumbnail_cb = nullptr;
-#endif // ENABLE_THUMBNAIL_GENERATOR
- // Temporary G-code, there is one defined for the BackgroundSlicingProcess, differentiated from the other processes by a process ID.
+ GCodeProcessor::Result *m_gcode_result = nullptr;
+ // Callback function, used to write thumbnails into gcode.
+ ThumbnailsGeneratorCallback m_thumbnail_cb = nullptr;
+ SL1Archive m_sla_archive;
+ // Temporary G-code, there is one defined for the BackgroundSlicingProcess, differentiated from the other processes by a process ID.
std::string m_temp_output_path;
// Output path provided by the user. The output path may be set even if the slicing is running,
// but once set, it cannot be re-set.
@@ -191,6 +227,9 @@ private:
int m_event_slicing_completed_id = 0;
// wxWidgets command ID to be sent to the plater to inform that the task finished.
int m_event_finished_id = 0;
+ // wxWidgets command ID to be sent to the plater to inform that the G-code is being exported.
+ int m_event_export_began_id = 0;
+
};
}; // namespace Slic3r
diff --git a/src/slic3r/GUI/BedShapeDialog.cpp b/src/slic3r/GUI/BedShapeDialog.cpp
index 58c76fe26..781838233 100644
--- a/src/slic3r/GUI/BedShapeDialog.cpp
+++ b/src/slic3r/GUI/BedShapeDialog.cpp
@@ -1,4 +1,6 @@
#include "BedShapeDialog.hpp"
+#include "GUI_App.hpp"
+#include "OptionsGroup.hpp"
#include <wx/wx.h>
#include <wx/numformatter.h>
@@ -19,6 +21,160 @@
namespace Slic3r {
namespace GUI {
+BedShape::BedShape(const ConfigOptionPoints& points)
+{
+ auto polygon = Polygon::new_scale(points.values);
+
+ // is this a rectangle ?
+ if (points.size() == 4) {
+ auto lines = polygon.lines();
+ if (lines[0].parallel_to(lines[2]) && lines[1].parallel_to(lines[3])) {
+ // okay, it's a rectangle
+ // find origin
+ coordf_t x_min, x_max, y_min, y_max;
+ x_max = x_min = points.values[0](0);
+ y_max = y_min = points.values[0](1);
+ for (auto pt : points.values)
+ {
+ x_min = std::min(x_min, pt(0));
+ x_max = std::max(x_max, pt(0));
+ y_min = std::min(y_min, pt(1));
+ y_max = std::max(y_max, pt(1));
+ }
+
+ m_type = Type::Rectangular;
+ m_rectSize = Vec2d(x_max - x_min, y_max - y_min);
+ m_rectOrigin = Vec2d(-x_min, -y_min);
+
+ return;
+ }
+ }
+
+ // is this a circle ?
+ {
+ // Analyze the array of points.Do they reside on a circle ?
+ auto center = polygon.bounding_box().center();
+ std::vector<double> vertex_distances;
+ double avg_dist = 0;
+ for (auto pt : polygon.points)
+ {
+ double distance = (pt - center).cast<double>().norm();
+ vertex_distances.push_back(distance);
+ avg_dist += distance;
+ }
+
+ avg_dist /= vertex_distances.size();
+ bool defined_value = true;
+ for (auto el : vertex_distances)
+ {
+ if (abs(el - avg_dist) > 10 * SCALED_EPSILON)
+ defined_value = false;
+ break;
+ }
+ if (defined_value) {
+ // all vertices are equidistant to center
+ m_type = Type::Circular;
+ m_diameter = unscale<double>(avg_dist * 2);
+
+ return;
+ }
+ }
+
+ if (points.size() < 3)
+ return;
+
+ // This is a custom bed shape, use the polygon provided.
+ m_type = Type::Custom;
+}
+
+static std::string get_option_label(BedShape::Parameter param)
+{
+ switch (param) {
+ case BedShape::Parameter::RectSize : return L("Size");
+ case BedShape::Parameter::RectOrigin: return L("Origin");
+ case BedShape::Parameter::Diameter : return L("Diameter");
+ default: return "";
+ }
+}
+
+void BedShape::append_option_line(ConfigOptionsGroupShp optgroup, Parameter param)
+{
+ ConfigOptionDef def;
+
+ if (param == Parameter::RectSize) {
+ def.type = coPoints;
+ def.set_default_value(new ConfigOptionPoints{ Vec2d(200, 200) });
+ def.min = 0;
+ def.max = 1200;
+ def.label = get_option_label(param);
+ def.tooltip = L("Size in X and Y of the rectangular plate.");
+
+ Option option(def, "rect_size");
+ optgroup->append_single_option_line(option);
+ }
+ else if (param == Parameter::RectOrigin) {
+ def.type = coPoints;
+ def.set_default_value(new ConfigOptionPoints{ Vec2d(0, 0) });
+ def.min = -600;
+ def.max = 600;
+ def.label = get_option_label(param);
+ def.tooltip = L("Distance of the 0,0 G-code coordinate from the front left corner of the rectangle.");
+
+ Option option(def, "rect_origin");
+ optgroup->append_single_option_line(option);
+ }
+ else if (param == Parameter::Diameter) {
+ def.type = coFloat;
+ def.set_default_value(new ConfigOptionFloat(200));
+ def.sidetext = L("mm");
+ def.label = get_option_label(param);
+ def.tooltip = L("Diameter of the print bed. It is assumed that origin (0,0) is located in the center.");
+
+ Option option(def, "diameter");
+ optgroup->append_single_option_line(option);
+ }
+}
+
+wxString BedShape::get_name(Type type)
+{
+ switch (type) {
+ case Type::Rectangular : return _L("Rectangular");
+ case Type::Circular : return _L("Circular");
+ case Type::Custom : return _L("Custom");
+ case Type::Invalid :
+ default : return _L("Invalid");
+ }
+}
+
+size_t BedShape::get_type()
+{
+ return static_cast<size_t>(m_type == Type::Invalid ? Type::Rectangular : m_type);
+}
+
+wxString BedShape::get_full_name_with_params()
+{
+ wxString out = _L("Shape") + ": " + get_name(m_type);
+
+ if (m_type == Type::Rectangular) {
+ out += "\n" + _(get_option_label(Parameter::RectSize)) + ": [" + ConfigOptionPoint(m_rectSize).serialize() + "]";
+ out += "\n" + _(get_option_label(Parameter::RectOrigin))+ ": [" + ConfigOptionPoint(m_rectOrigin).serialize() + "]";
+ }
+ else if (m_type == Type::Circular)
+ out += "\n" + _L(get_option_label(Parameter::Diameter)) + ": [" + double_to_string(m_diameter) + "]";
+
+ return out;
+}
+
+void BedShape::apply_optgroup_values(ConfigOptionsGroupShp optgroup)
+{
+ if (m_type == Type::Rectangular || m_type == Type::Invalid) {
+ optgroup->set_value("rect_size" , new ConfigOptionPoints{ m_rectSize });
+ optgroup->set_value("rect_origin" , new ConfigOptionPoints{ m_rectOrigin });
+ }
+ else if (m_type == Type::Circular)
+ optgroup->set_value("diameter", double_to_string(m_diameter));
+}
+
void BedShapeDialog::build_dialog(const ConfigOptionPoints& default_pt, const ConfigOptionString& custom_texture, const ConfigOptionString& custom_model)
{
SetFont(wxGetApp().normal_font());
@@ -70,50 +226,35 @@ void BedShapePanel::build_panel(const ConfigOptionPoints& default_pt, const Conf
m_shape_options_book = new wxChoicebook(this, wxID_ANY, wxDefaultPosition, wxSize(25*wxGetApp().em_unit(), -1), wxCHB_TOP);
sbsizer->Add(m_shape_options_book);
- auto optgroup = init_shape_options_page(_(L("Rectangular")));
- ConfigOptionDef def;
- def.type = coPoints;
- def.set_default_value(new ConfigOptionPoints{ Vec2d(200, 200) });
- def.label = L("Size");
- def.tooltip = L("Size in X and Y of the rectangular plate.");
- Option option(def, "rect_size");
- optgroup->append_single_option_line(option);
-
- def.type = coPoints;
- def.set_default_value(new ConfigOptionPoints{ Vec2d(0, 0) });
- def.label = L("Origin");
- def.tooltip = L("Distance of the 0,0 G-code coordinate from the front left corner of the rectangle.");
- option = Option(def, "rect_origin");
- optgroup->append_single_option_line(option);
-
- optgroup = init_shape_options_page(_(L("Circular")));
- def.type = coFloat;
- def.set_default_value(new ConfigOptionFloat(200));
- def.sidetext = L("mm");
- def.label = L("Diameter");
- def.tooltip = L("Diameter of the print bed. It is assumed that origin (0,0) is located in the center.");
- option = Option(def, "diameter");
- optgroup->append_single_option_line(option);
-
- optgroup = init_shape_options_page(_(L("Custom")));
+ auto optgroup = init_shape_options_page(BedShape::get_name(BedShape::Type::Rectangular));
+ BedShape::append_option_line(optgroup, BedShape::Parameter::RectSize);
+ BedShape::append_option_line(optgroup, BedShape::Parameter::RectOrigin);
+ activate_options_page(optgroup);
+
+ optgroup = init_shape_options_page(BedShape::get_name(BedShape::Type::Circular));
+ BedShape::append_option_line(optgroup, BedShape::Parameter::Diameter);
+ activate_options_page(optgroup);
+
+ optgroup = init_shape_options_page(BedShape::get_name(BedShape::Type::Custom));
+
Line line{ "", "" };
line.full_width = 1;
line.widget = [this](wxWindow* parent) {
- wxButton* shape_btn = new wxButton(parent, wxID_ANY, _(L("Load shape from STL...")));
+ wxButton* shape_btn = new wxButton(parent, wxID_ANY, _L("Load shape from STL..."));
wxSizer* shape_sizer = new wxBoxSizer(wxHORIZONTAL);
shape_sizer->Add(shape_btn, 1, wxEXPAND);
wxSizer* sizer = new wxBoxSizer(wxVERTICAL);
sizer->Add(shape_sizer, 1, wxEXPAND);
- shape_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent& e)
- {
+ shape_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) {
load_stl();
- }));
+ });
return sizer;
};
optgroup->append_line(line);
+ activate_options_page(optgroup);
wxPanel* texture_panel = init_texture_panel();
wxPanel* model_panel = init_model_panel();
@@ -143,10 +284,6 @@ void BedShapePanel::build_panel(const ConfigOptionPoints& default_pt, const Conf
update_preview();
}
-#define SHAPE_RECTANGULAR 0
-#define SHAPE_CIRCULAR 1
-#define SHAPE_CUSTOM 2
-
// Called from the constructor.
// Create a panel for a rectangular / circular / custom bed shape.
ConfigOptionsGroupShp BedShapePanel::init_shape_options_page(const wxString& title)
@@ -160,12 +297,18 @@ ConfigOptionsGroupShp BedShapePanel::init_shape_options_page(const wxString& tit
};
m_optgroups.push_back(optgroup);
- panel->SetSizerAndFit(optgroup->sizer);
+// panel->SetSizerAndFit(optgroup->sizer);
m_shape_options_book->AddPage(panel, title);
return optgroup;
}
+void BedShapePanel::activate_options_page(ConfigOptionsGroupShp options_group)
+{
+ options_group->activate();
+ options_group->parent()->SetSizerAndFit(options_group->sizer);
+}
+
wxPanel* BedShapePanel::init_texture_panel()
{
wxPanel* panel = new wxPanel(this);
@@ -239,6 +382,7 @@ wxPanel* BedShapePanel::init_texture_panel()
return sizer;
};
optgroup->append_line(line);
+ optgroup->activate();
panel->SetSizerAndFit(optgroup->sizer);
@@ -318,6 +462,7 @@ wxPanel* BedShapePanel::init_model_panel()
return sizer;
};
optgroup->append_line(line);
+ optgroup->activate();
panel->SetSizerAndFit(optgroup->sizer);
@@ -331,83 +476,18 @@ wxPanel* BedShapePanel::init_model_panel()
// with the list of points in the ini file directly.
void BedShapePanel::set_shape(const ConfigOptionPoints& points)
{
- auto polygon = Polygon::new_scale(points.values);
-
- // is this a rectangle ?
- if (points.size() == 4) {
- auto lines = polygon.lines();
- if (lines[0].parallel_to(lines[2]) && lines[1].parallel_to(lines[3])) {
- // okay, it's a rectangle
- // find origin
- coordf_t x_min, x_max, y_min, y_max;
- x_max = x_min = points.values[0](0);
- y_max = y_min = points.values[0](1);
- for (auto pt : points.values)
- {
- x_min = std::min(x_min, pt(0));
- x_max = std::max(x_max, pt(0));
- y_min = std::min(y_min, pt(1));
- y_max = std::max(y_max, pt(1));
- }
+ BedShape shape(points);
- auto origin = new ConfigOptionPoints{ Vec2d(-x_min, -y_min) };
+ m_shape_options_book->SetSelection(shape.get_type());
+ shape.apply_optgroup_values(m_optgroups[shape.get_type()]);
- m_shape_options_book->SetSelection(SHAPE_RECTANGULAR);
- auto optgroup = m_optgroups[SHAPE_RECTANGULAR];
- optgroup->set_value("rect_size", new ConfigOptionPoints{ Vec2d(x_max - x_min, y_max - y_min) });//[x_max - x_min, y_max - y_min]);
- optgroup->set_value("rect_origin", origin);
- update_shape();
- return;
- }
- }
-
- // is this a circle ?
- {
- // Analyze the array of points.Do they reside on a circle ?
- auto center = polygon.bounding_box().center();
- std::vector<double> vertex_distances;
- double avg_dist = 0;
- for (auto pt: polygon.points)
- {
- double distance = (pt - center).cast<double>().norm();
- vertex_distances.push_back(distance);
- avg_dist += distance;
- }
+ // Copy the polygon to the canvas, make a copy of the array, if custom shape is selected
+ if (shape.is_custom())
+ m_loaded_shape = points.values;
- avg_dist /= vertex_distances.size();
- bool defined_value = true;
- for (auto el: vertex_distances)
- {
- if (abs(el - avg_dist) > 10 * SCALED_EPSILON)
- defined_value = false;
- break;
- }
- if (defined_value) {
- // all vertices are equidistant to center
- m_shape_options_book->SetSelection(SHAPE_CIRCULAR);
- auto optgroup = m_optgroups[SHAPE_CIRCULAR];
- boost::any ret = wxNumberFormatter::ToString(unscale<double>(avg_dist * 2), 0);
- optgroup->set_value("diameter", ret);
- update_shape();
- return;
- }
- }
-
- if (points.size() < 3) {
- // Invalid polygon.Revert to default bed dimensions.
- m_shape_options_book->SetSelection(SHAPE_RECTANGULAR);
- auto optgroup = m_optgroups[SHAPE_RECTANGULAR];
- optgroup->set_value("rect_size", new ConfigOptionPoints{ Vec2d(200, 200) });
- optgroup->set_value("rect_origin", new ConfigOptionPoints{ Vec2d(0, 0) });
- update_shape();
- return;
- }
-
- // This is a custom bed shape, use the polygon provided.
- m_shape_options_book->SetSelection(SHAPE_CUSTOM);
- // Copy the polygon to the canvas, make a copy of the array.
- m_loaded_shape = points.values;
update_shape();
+
+ return;
}
void BedShapePanel::update_preview()
@@ -420,21 +500,20 @@ void BedShapePanel::update_preview()
void BedShapePanel::update_shape()
{
auto page_idx = m_shape_options_book->GetSelection();
- if (page_idx == SHAPE_RECTANGULAR) {
+ auto opt_group = m_optgroups[page_idx];
+
+ BedShape::Type page_type = static_cast<BedShape::Type>(page_idx);
+
+ if (page_type == BedShape::Type::Rectangular) {
Vec2d rect_size(Vec2d::Zero());
Vec2d rect_origin(Vec2d::Zero());
- try{
- rect_size = boost::any_cast<Vec2d>(m_optgroups[SHAPE_RECTANGULAR]->get_value("rect_size")); }
- catch (const std::exception & /* e */) {
- return;
- }
- try {
- rect_origin = boost::any_cast<Vec2d>(m_optgroups[SHAPE_RECTANGULAR]->get_value("rect_origin"));
- }
- catch (const std::exception & /* e */) {
- return;
- }
-
+
+ try { rect_size = boost::any_cast<Vec2d>(opt_group->get_value("rect_size")); }
+ catch (const std::exception& /* e */) { return; }
+
+ try { rect_origin = boost::any_cast<Vec2d>(opt_group->get_value("rect_origin")); }
+ catch (const std::exception & /* e */) { return; }
+
auto x = rect_size(0);
auto y = rect_size(1);
// empty strings or '-' or other things
@@ -456,14 +535,11 @@ void BedShapePanel::update_shape()
Vec2d(x1, y1),
Vec2d(x0, y1) };
}
- else if(page_idx == SHAPE_CIRCULAR) {
+ else if (page_type == BedShape::Type::Circular) {
double diameter;
- try{
- diameter = boost::any_cast<double>(m_optgroups[SHAPE_CIRCULAR]->get_value("diameter"));
- }
- catch (const std::exception & /* e */) {
- return;
- }
+ try { diameter = boost::any_cast<double>(opt_group->get_value("diameter")); }
+ catch (const std::exception & /* e */) { return; }
+
if (diameter == 0.0) return ;
auto r = diameter / 2;
auto twopi = 2 * PI;
@@ -475,7 +551,7 @@ void BedShapePanel::update_shape()
}
m_shape = points;
}
- else if (page_idx == SHAPE_CUSTOM)
+ else if (page_type == BedShape::Type::Custom)
m_shape = m_loaded_shape;
update_preview();
diff --git a/src/slic3r/GUI/BedShapeDialog.hpp b/src/slic3r/GUI/BedShapeDialog.hpp
index bf12cc893..370129f2e 100644
--- a/src/slic3r/GUI/BedShapeDialog.hpp
+++ b/src/slic3r/GUI/BedShapeDialog.hpp
@@ -3,7 +3,7 @@
// The bed shape dialog.
// The dialog opens from Print Settins tab->Bed Shape : Set...
-#include "OptionsGroup.hpp"
+#include "GUI_Utils.hpp"
#include "2DBed.hpp"
#include "I18N.hpp"
@@ -13,7 +13,45 @@
namespace Slic3r {
namespace GUI {
+class ConfigOptionsGroup;
+
using ConfigOptionsGroupShp = std::shared_ptr<ConfigOptionsGroup>;
+
+struct BedShape
+{
+ enum class Type {
+ Rectangular = 0,
+ Circular,
+ Custom,
+ Invalid
+ };
+
+ enum class Parameter {
+ RectSize,
+ RectOrigin,
+ Diameter
+ };
+
+ BedShape(const ConfigOptionPoints& points);
+
+ bool is_custom() { return m_type == Type::Custom; }
+
+ static void append_option_line(ConfigOptionsGroupShp optgroup, Parameter param);
+ static wxString get_name(Type type);
+
+ // convert Type to size_t
+ size_t get_type();
+
+ wxString get_full_name_with_params();
+ void apply_optgroup_values(ConfigOptionsGroupShp optgroup);
+
+private:
+ Type m_type {Type::Invalid};
+ Vec2d m_rectSize {200, 200};
+ Vec2d m_rectOrigin {0, 0};
+ double m_diameter {0};
+};
+
class BedShapePanel : public wxPanel
{
static const std::string NONE;
@@ -37,6 +75,7 @@ public:
private:
ConfigOptionsGroupShp init_shape_options_page(const wxString& title);
+ void activate_options_page(ConfigOptionsGroupShp options_group);
wxPanel* init_texture_panel();
wxPanel* init_model_panel();
void set_shape(const ConfigOptionPoints& points);
diff --git a/src/slic3r/GUI/BitmapCache.cpp b/src/slic3r/GUI/BitmapCache.cpp
index 8627ef4cb..c553f3728 100644
--- a/src/slic3r/GUI/BitmapCache.cpp
+++ b/src/slic3r/GUI/BitmapCache.cpp
@@ -3,23 +3,20 @@
#include "libslic3r/Utils.hpp"
#include "../Utils/MacDarkMode.hpp"
#include "GUI.hpp"
+#include "GUI_Utils.hpp"
#include <boost/filesystem.hpp>
-#if ! defined(WIN32) && ! defined(__APPLE__)
-#define BROKEN_ALPHA
-#endif
-
-#ifdef BROKEN_ALPHA
+#ifdef __WXGTK2__
+ // Broken alpha workaround
#include <wx/mstream.h>
#include <wx/rawbmp.h>
-#endif /* BROKEN_ALPHA */
+#endif /* __WXGTK2__ */
#define NANOSVG_IMPLEMENTATION
#include "nanosvg/nanosvg.h"
#define NANOSVGRAST_IMPLEMENTATION
#include "nanosvg/nanosvgrast.h"
-//#include "GUI_App.hpp"
namespace Slic3r { namespace GUI {
@@ -43,7 +40,8 @@ void BitmapCache::clear()
static wxBitmap wxImage_to_wxBitmap_with_alpha(wxImage &&image, float scale = 1.0f)
{
-#ifdef BROKEN_ALPHA
+#ifdef __WXGTK2__
+ // Broken alpha workaround
wxMemoryOutputStream stream;
image.SaveFile(stream, wxBITMAP_TYPE_PNG);
wxStreamBuffer *buf = stream.GetOutputStreamBuffer();
@@ -67,7 +65,11 @@ wxBitmap* BitmapCache::insert(const std::string &bitmap_key, size_t width, size_
wxBitmap *bitmap = nullptr;
auto it = m_map.find(bitmap_key);
if (it == m_map.end()) {
- bitmap = new wxBitmap(width, height);
+ bitmap = new wxBitmap(width, height
+#ifdef __WXGTK3__
+ , 32
+#endif
+ );
#ifdef __APPLE__
// Contrary to intuition, the `scale` argument isn't "please scale this to such and such"
// but rather "the wxImage is sized for backing scale such and such".
@@ -82,7 +84,8 @@ wxBitmap* BitmapCache::insert(const std::string &bitmap_key, size_t width, size_
if (size_t(bitmap->GetWidth()) != width || size_t(bitmap->GetHeight()) != height)
bitmap->Create(width, height);
}
-#ifndef BROKEN_ALPHA
+#if defined(WIN32) || defined(__APPLE__)
+ // Not needed or harmful for GTK2 and GTK3.
bitmap->UseAlpha();
#endif
return bitmap;
@@ -130,8 +133,8 @@ wxBitmap* BitmapCache::insert(const std::string &bitmap_key, const wxBitmap *beg
#endif
}
-#ifdef BROKEN_ALPHA
-
+#ifdef __WXGTK2__
+ // Broken alpha workaround
wxImage image(width, height);
image.InitAlpha();
// Fill in with a white color.
@@ -281,16 +284,19 @@ wxBitmap* BitmapCache::load_svg(const std::string &bitmap_name, unsigned target_
auto it = m_map.find(folder + bitmap_key);
if (it != m_map.end())
return it->second;
- else {
+ // It's expensive to check if the bitmap exists every time, but otherwise:
+ // For the case, when application was started in Light mode and then switched to the Dark,
+ // we will never get a white bitmaps, if check m_map.find(bitmap_key)
+ // before boost::filesystem::exists(var(folder + bitmap_name + ".svg"))
+ if (!boost::filesystem::exists(var(folder + bitmap_name + ".svg"))) {
+ folder.clear();
+
it = m_map.find(bitmap_key);
if (it != m_map.end())
return it->second;
}
- if (!boost::filesystem::exists(Slic3r::var(folder + bitmap_name + ".svg")))
- folder.clear();
- else
- bitmap_key = folder + bitmap_key;
+ bitmap_key = folder + bitmap_key;
}
else
{
@@ -351,15 +357,6 @@ wxBitmap BitmapCache::mksolid(size_t width, size_t height, unsigned char r, unsi
return wxImage_to_wxBitmap_with_alpha(std::move(image), scale);
}
-
-static inline int hex_digit_to_int(const char c)
-{
- return
- (c >= '0' && c <= '9') ? int(c - '0') :
- (c >= 'A' && c <= 'F') ? int(c - 'A') + 10 :
- (c >= 'a' && c <= 'f') ? int(c - 'a') + 10 : -1;
-}
-
bool BitmapCache::parse_color(const std::string& scolor, unsigned char* rgb_out)
{
rgb_out[0] = rgb_out[1] = rgb_out[2] = 0;
diff --git a/src/slic3r/GUI/BitmapCache.hpp b/src/slic3r/GUI/BitmapCache.hpp
index 3f29c2fd6..429b7dfd9 100644
--- a/src/slic3r/GUI/BitmapCache.hpp
+++ b/src/slic3r/GUI/BitmapCache.hpp
@@ -35,11 +35,11 @@ public:
// Load svg from resources/icons. bitmap_key is given without the .svg suffix. SVG will be rasterized to provided height/width.
wxBitmap* load_svg(const std::string &bitmap_key, unsigned width = 0, unsigned height = 0, const bool grayscale = false, const bool dark_mode = false);
- /*static */wxBitmap mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling = false);
- /*static */wxBitmap mksolid(size_t width, size_t height, const unsigned char rgb[3], bool suppress_scaling = false) { return mksolid(width, height, rgb[0], rgb[1], rgb[2], wxALPHA_OPAQUE, suppress_scaling); }
- /*static */wxBitmap mkclear(size_t width, size_t height) { return mksolid(width, height, 0, 0, 0, wxALPHA_TRANSPARENT); }
+ wxBitmap mksolid(size_t width, size_t height, unsigned char r, unsigned char g, unsigned char b, unsigned char transparency, bool suppress_scaling = false);
+ wxBitmap mksolid(size_t width, size_t height, const unsigned char rgb[3], bool suppress_scaling = false) { return mksolid(width, height, rgb[0], rgb[1], rgb[2], wxALPHA_OPAQUE, suppress_scaling); }
+ wxBitmap mkclear(size_t width, size_t height) { return mksolid(width, height, 0, 0, 0, wxALPHA_TRANSPARENT); }
- static bool parse_color(const std::string& scolor, unsigned char* rgb_out);
+ static bool parse_color(const std::string& scolor, unsigned char* rgb_out);
private:
std::map<std::string, wxBitmap*> m_map;
diff --git a/src/slic3r/GUI/Camera.cpp b/src/slic3r/GUI/Camera.cpp
index 74c21d3e8..1e589f1a1 100644
--- a/src/slic3r/GUI/Camera.cpp
+++ b/src/slic3r/GUI/Camera.cpp
@@ -1,13 +1,11 @@
#include "libslic3r/libslic3r.h"
+#include "libslic3r/AppConfig.hpp"
#include "Camera.hpp"
-#if !ENABLE_THUMBNAIL_GENERATOR
-#include "3DScene.hpp"
-#endif // !ENABLE_THUMBNAIL_GENERATOR
#include "GUI_App.hpp"
-#include "AppConfig.hpp"
#if ENABLE_CAMERA_STATISTICS
#include "Mouse3DController.hpp"
+#include "Plater.hpp"
#endif // ENABLE_CAMERA_STATISTICS
#include <GL/glew.h>
@@ -25,10 +23,8 @@ namespace Slic3r {
namespace GUI {
const double Camera::DefaultDistance = 1000.0;
-#if ENABLE_THUMBNAIL_GENERATOR
const double Camera::DefaultZoomToBoxMarginFactor = 1.025;
const double Camera::DefaultZoomToVolumesMarginFactor = 1.025;
-#endif // ENABLE_THUMBNAIL_GENERATOR
double Camera::FrustrumMinZRange = 50.0;
double Camera::FrustrumMinNearZ = 100.0;
double Camera::FrustrumZMargin = 10.0;
@@ -36,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();
}
@@ -62,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();
+ }
}
}
@@ -219,18 +207,10 @@ void Camera::apply_projection(const BoundingBoxf3& box, double near_z, double fa
glsafe(::glMatrixMode(GL_MODELVIEW));
}
-#if ENABLE_THUMBNAIL_GENERATOR
void Camera::zoom_to_box(const BoundingBoxf3& box, double margin_factor)
-#else
-void Camera::zoom_to_box(const BoundingBoxf3& box, int canvas_w, int canvas_h)
-#endif // ENABLE_THUMBNAIL_GENERATOR
{
// Calculate the zoom factor needed to adjust the view around the given box.
-#if ENABLE_THUMBNAIL_GENERATOR
double zoom = calc_zoom_to_bounding_box_factor(box, margin_factor);
-#else
- double zoom = calc_zoom_to_bounding_box_factor(box, canvas_w, canvas_h);
-#endif // ENABLE_THUMBNAIL_GENERATOR
if (zoom > 0.0)
{
m_zoom = zoom;
@@ -239,7 +219,6 @@ void Camera::zoom_to_box(const BoundingBoxf3& box, int canvas_w, int canvas_h)
}
}
-#if ENABLE_THUMBNAIL_GENERATOR
void Camera::zoom_to_volumes(const GLVolumePtrs& volumes, double margin_factor)
{
Vec3d center;
@@ -251,7 +230,6 @@ void Camera::zoom_to_volumes(const GLVolumePtrs& volumes, double margin_factor)
set_target(center);
}
}
-#endif // ENABLE_THUMBNAIL_GENERATOR
#if ENABLE_CAMERA_STATISTICS
void Camera::debug_render() const
@@ -387,11 +365,7 @@ std::pair<double, double> Camera::calc_tight_frustrum_zs_around(const BoundingBo
return ret;
}
-#if ENABLE_THUMBNAIL_GENERATOR
double Camera::calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, double margin_factor) const
-#else
-double Camera::calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, int canvas_w, int canvas_h) const
-#endif // ENABLE_THUMBNAIL_GENERATOR
{
double max_bb_size = box.max_size();
if (max_bb_size == 0.0)
@@ -423,11 +397,6 @@ double Camera::calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, int ca
double max_x = -DBL_MAX;
double max_y = -DBL_MAX;
-#if !ENABLE_THUMBNAIL_GENERATOR
- // margin factor to give some empty space around the box
- double margin_factor = 1.25;
-#endif // !ENABLE_THUMBNAIL_GENERATOR
-
for (const Vec3d& v : vertices)
{
// project vertex on the plane perpendicular to camera forward axis
@@ -449,16 +418,12 @@ double Camera::calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, int ca
if ((dx <= 0.0) || (dy <= 0.0))
return -1.0f;
- double med_x = 0.5 * (max_x + min_x);
- double med_y = 0.5 * (max_y + min_y);
-
dx *= margin_factor;
dy *= margin_factor;
return std::min((double)m_viewport[2] / dx, (double)m_viewport[3] / dy);
}
-#if ENABLE_THUMBNAIL_GENERATOR
double Camera::calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, Vec3d& center, double margin_factor) const
{
if (volumes.empty())
@@ -519,7 +484,6 @@ double Camera::calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, Vec3d& c
return std::min((double)m_viewport[2] / dx, (double)m_viewport[3] / dy);
}
-#endif // ENABLE_THUMBNAIL_GENERATOR
void Camera::set_distance(double distance) const
{
diff --git a/src/slic3r/GUI/Camera.hpp b/src/slic3r/GUI/Camera.hpp
index b784e7b96..91f4661b4 100644
--- a/src/slic3r/GUI/Camera.hpp
+++ b/src/slic3r/GUI/Camera.hpp
@@ -2,9 +2,7 @@
#define slic3r_Camera_hpp_
#include "libslic3r/BoundingBox.hpp"
-#if ENABLE_THUMBNAIL_GENERATOR
#include "3DScene.hpp"
-#endif // ENABLE_THUMBNAIL_GENERATOR
#include <array>
namespace Slic3r {
@@ -13,10 +11,8 @@ namespace GUI {
struct Camera
{
static const double DefaultDistance;
-#if ENABLE_THUMBNAIL_GENERATOR
static const double DefaultZoomToBoxMarginFactor;
static const double DefaultZoomToVolumesMarginFactor;
-#endif // ENABLE_THUMBNAIL_GENERATOR
static double FrustrumMinZRange;
static double FrustrumMinNearZ;
static double FrustrumZMargin;
@@ -33,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<int, 4> 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<double, double> m_frustrum_zs;
BoundingBoxf3 m_scene_box;
@@ -60,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);
@@ -88,6 +87,7 @@ public:
double get_near_z() const { return m_frustrum_zs.first; }
double get_far_z() const { return m_frustrum_zs.second; }
+ const std::pair<double, double>& get_z_range() const { return m_frustrum_zs; }
double get_fov() const;
@@ -97,12 +97,8 @@ public:
// If larger z span is needed, pass the desired values of near and far z (negative values are ignored)
void apply_projection(const BoundingBoxf3& box, double near_z = -1.0, double far_z = -1.0) const;
-#if ENABLE_THUMBNAIL_GENERATOR
void zoom_to_box(const BoundingBoxf3& box, double margin_factor = DefaultZoomToBoxMarginFactor);
void zoom_to_volumes(const GLVolumePtrs& volumes, double margin_factor = DefaultZoomToVolumesMarginFactor);
-#else
- void zoom_to_box(const BoundingBoxf3& box, int canvas_w, int canvas_h);
-#endif // ENABLE_THUMBNAIL_GENERATOR
#if ENABLE_CAMERA_STATISTICS
void debug_render() const;
@@ -131,19 +127,15 @@ public:
void look_at(const Vec3d& position, const Vec3d& target, const Vec3d& up);
- double max_zoom() const { return 100.0; }
+ double max_zoom() const { return 250.0; }
double min_zoom() const;
private:
// returns tight values for nearZ and farZ plane around the given bounding box
// the camera MUST be outside of the bounding box in eye coordinate of the given box
std::pair<double, double> calc_tight_frustrum_zs_around(const BoundingBoxf3& box) const;
-#if ENABLE_THUMBNAIL_GENERATOR
double calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, double margin_factor = DefaultZoomToBoxMarginFactor) const;
double calc_zoom_to_volumes_factor(const GLVolumePtrs& volumes, Vec3d& center, double margin_factor = DefaultZoomToVolumesMarginFactor) const;
-#else
- double calc_zoom_to_bounding_box_factor(const BoundingBoxf3& box, int canvas_w, int canvas_h) const;
-#endif // ENABLE_THUMBNAIL_GENERATOR
void set_distance(double distance) const;
void set_default_orientation();
diff --git a/src/slic3r/GUI/ConfigExceptions.hpp b/src/slic3r/GUI/ConfigExceptions.hpp
index 9038d3445..181442d4e 100644
--- a/src/slic3r/GUI/ConfigExceptions.hpp
+++ b/src/slic3r/GUI/ConfigExceptions.hpp
@@ -1,15 +1,15 @@
#include <exception>
namespace Slic3r {
-class ConfigError : public std::runtime_error {
-using std::runtime_error::runtime_error;
+class ConfigError : public Slic3r::RuntimeError {
+ using Slic3r::RuntimeError::RuntimeError;
};
namespace GUI {
class ConfigGUITypeError : public ConfigError {
-using ConfigError::ConfigError;
+ using ConfigError::ConfigError;
};
-}
-}
+} // namespace GUI
+} // namespace Slic3r
diff --git a/src/slic3r/GUI/ConfigManipulation.cpp b/src/slic3r/GUI/ConfigManipulation.cpp
index 8d1daeb8e..aba26b203 100644
--- a/src/slic3r/GUI/ConfigManipulation.cpp
+++ b/src/slic3r/GUI/ConfigManipulation.cpp
@@ -2,7 +2,9 @@
#include "ConfigManipulation.hpp"
#include "I18N.hpp"
#include "GUI_App.hpp"
-#include "PresetBundle.hpp"
+#include "format.hpp"
+#include "libslic3r/Model.hpp"
+#include "libslic3r/PresetBundle.hpp"
#include <wx/msgdlg.h>
@@ -27,9 +29,7 @@ void ConfigManipulation::toggle_field(const std::string& opt_key, const bool tog
if (local_config->option(opt_key) == nullptr)
return;
}
- Field* field = get_field(opt_key, opt_index);
- if (field==nullptr) return;
- field->toggle(toggle);
+ cb_toggle_field(opt_key, toggle, opt_index);
}
void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, const bool is_global_config)
@@ -185,30 +185,21 @@ void ConfigManipulation::update_print_fff_config(DynamicPrintConfig* config, con
}
if (config->option<ConfigOptionPercent>("fill_density")->value == 100) {
- auto fill_pattern = config->option<ConfigOptionEnum<InfillPattern>>("fill_pattern")->value;
- std::string str_fill_pattern = "";
- t_config_enum_values map_names = config->option<ConfigOptionEnum<InfillPattern>>("fill_pattern")->get_enum_values();
- for (auto it : map_names) {
- if (fill_pattern == it.second) {
- str_fill_pattern = it.first;
- break;
- }
- }
- if (!str_fill_pattern.empty()) {
- const std::vector<std::string>& external_fill_pattern = config->def()->get("top_fill_pattern")->enum_values;
- bool correct_100p_fill = false;
- for (const std::string& fill : external_fill_pattern)
- {
- if (str_fill_pattern == fill)
- correct_100p_fill = true;
- }
+ std::string fill_pattern = config->option<ConfigOptionEnum<InfillPattern>>("fill_pattern")->serialize();
+ const auto &top_fill_pattern_values = config->def()->get("top_fill_pattern")->enum_values;
+ bool correct_100p_fill = std::find(top_fill_pattern_values.begin(), top_fill_pattern_values.end(), fill_pattern) != top_fill_pattern_values.end();
+ if (!correct_100p_fill) {
// get fill_pattern name from enum_labels for using this one at dialog_msg
- str_fill_pattern = _utf8(config->def()->get("fill_pattern")->enum_labels[fill_pattern]);
- if (!correct_100p_fill) {
- wxString msg_text = GUI::from_u8((boost::format(_utf8(L("The %1% infill pattern is not supposed to work at 100%% density."))) % str_fill_pattern).str());
+ const ConfigOptionDef *fill_pattern_def = config->def()->get("fill_pattern");
+ assert(fill_pattern_def != nullptr);
+ auto it_pattern = std::find(fill_pattern_def->enum_values.begin(), fill_pattern_def->enum_values.end(), fill_pattern);
+ assert(it_pattern != fill_pattern_def->enum_values.end());
+ if (it_pattern != fill_pattern_def->enum_values.end()) {
+ wxString msg_text = GUI::format_wxstr(_L("The %1% infill pattern is not supposed to work at 100%% density."),
+ _(fill_pattern_def->enum_labels[it_pattern - fill_pattern_def->enum_values.begin()]));
if (is_global_config)
- msg_text += "\n\n" + _(L("Shall I switch to rectilinear fill pattern?"));
- wxMessageDialog dialog(nullptr, msg_text, _(L("Infill")),
+ msg_text += "\n\n" + _L("Shall I switch to rectilinear fill pattern?");
+ wxMessageDialog dialog(nullptr, msg_text, _L("Infill"),
wxICON_WARNING | (is_global_config ? wxYES | wxNO : wxOK) );
DynamicPrintConfig new_conf = *config;
auto answer = dialog.ShowModal();
@@ -238,8 +229,11 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config)
bool have_infill = config->option<ConfigOptionPercent>("fill_density")->value > 0;
// infill_extruder uses the same logic as in Print::extruders()
for (auto el : { "fill_pattern", "infill_every_layers", "infill_only_where_needed",
- "solid_infill_every_layers", "solid_infill_below_area", "infill_extruder" })
+ "solid_infill_every_layers", "solid_infill_below_area", "infill_extruder", "infill_anchor_max" })
toggle_field(el, have_infill);
+ // Only allow configuration of open anchors if the anchoring is enabled.
+ bool has_infill_anchors = have_infill && config->option<ConfigOptionFloatOrPercent>("infill_anchor_max")->value > 0;
+ toggle_field("infill_anchor", has_infill_anchors);
bool has_spiral_vase = config->opt_bool("spiral_vase");
bool has_top_solid_infill = config->opt_int("top_solid_layers") > 0;
@@ -298,6 +292,10 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config)
toggle_field("support_material_extruder", have_support_material || have_skirt);
toggle_field("support_material_speed", have_support_material || have_brim || have_skirt);
+ bool has_ironing = config->opt_bool("ironing");
+ for (auto el : { "ironing_type", "ironing_flowrate", "ironing_spacing", "ironing_speed" })
+ toggle_field(el, has_ironing);
+
bool have_sequential_printing = config->opt_bool("complete_objects");
for (auto el : { "extruder_clearance_radius", "extruder_clearance_height" })
toggle_field(el, have_sequential_printing);
@@ -306,8 +304,12 @@ void ConfigManipulation::toggle_print_fff_options(DynamicPrintConfig* config)
toggle_field("standby_temperature_delta", have_ooze_prevention);
bool have_wipe_tower = config->opt_bool("wipe_tower");
- for (auto el : { "wipe_tower_x", "wipe_tower_y", "wipe_tower_width", "wipe_tower_rotation_angle", "wipe_tower_bridging" })
+ for (auto el : { "wipe_tower_x", "wipe_tower_y", "wipe_tower_width", "wipe_tower_rotation_angle",
+ "wipe_tower_bridging", "wipe_tower_no_sparse_layers", "single_extruder_multi_material_priming" })
toggle_field(el, have_wipe_tower);
+
+ bool have_avoid_crossing_perimeters = config->opt_bool("avoid_crossing_perimeters");
+ toggle_field("avoid_crossing_perimeters_max_detour", have_avoid_crossing_perimeters);
}
void ConfigManipulation::update_print_sla_config(DynamicPrintConfig* config, const bool is_global_config/* = false*/)
@@ -348,6 +350,7 @@ void ConfigManipulation::toggle_print_sla_options(DynamicPrintConfig* config)
toggle_field("support_head_penetration", supports_en);
toggle_field("support_head_width", supports_en);
toggle_field("support_pillar_diameter", supports_en);
+ toggle_field("support_small_pillar_diameter_percent", supports_en);
toggle_field("support_max_bridges_on_pillar", supports_en);
toggle_field("support_pillar_connection_mode", supports_en);
toggle_field("support_buildplate_only", supports_en);
diff --git a/src/slic3r/GUI/ConfigManipulation.hpp b/src/slic3r/GUI/ConfigManipulation.hpp
index 7344f758b..1e91dbec2 100644
--- a/src/slic3r/GUI/ConfigManipulation.hpp
+++ b/src/slic3r/GUI/ConfigManipulation.hpp
@@ -10,9 +10,11 @@
#include "libslic3r/PrintConfig.hpp"
#include "Field.hpp"
-//#include <boost-1_70/boost/any.hpp>
namespace Slic3r {
+
+class ModelConfig;
+
namespace GUI {
class ConfigManipulation
@@ -21,25 +23,25 @@ class ConfigManipulation
// function to loading of changed configuration
std::function<void()> load_config = nullptr;
- std::function<Field* (const std::string&, int opt_index)> get_field = nullptr;
+ std::function<void (const std::string&, bool toggle, int opt_index)> cb_toggle_field = nullptr;
// callback to propagation of changed value, if needed
std::function<void(const std::string&, const boost::any&)> cb_value_change = nullptr;
- DynamicPrintConfig* local_config = nullptr;
+ ModelConfig* local_config = nullptr;
public:
ConfigManipulation(std::function<void()> load_config,
- std::function<Field* (const std::string&, int opt_index)> get_field,
+ std::function<void(const std::string&, bool toggle, int opt_index)> cb_toggle_field,
std::function<void(const std::string&, const boost::any&)> cb_value_change,
- DynamicPrintConfig* local_config = nullptr) :
+ ModelConfig* local_config = nullptr) :
load_config(load_config),
- get_field(get_field),
+ cb_toggle_field(cb_toggle_field),
cb_value_change(cb_value_change),
local_config(local_config) {}
ConfigManipulation() {}
~ConfigManipulation() {
load_config = nullptr;
- get_field = nullptr;
+ cb_toggle_field = nullptr;
cb_value_change = nullptr;
}
diff --git a/src/slic3r/GUI/ConfigSnapshotDialog.cpp b/src/slic3r/GUI/ConfigSnapshotDialog.cpp
index 6a44b96dc..487604b1c 100644
--- a/src/slic3r/GUI/ConfigSnapshotDialog.cpp
+++ b/src/slic3r/GUI/ConfigSnapshotDialog.cpp
@@ -6,6 +6,7 @@
#include "libslic3r/Utils.hpp"
#include "libslic3r/Time.hpp"
#include "GUI_App.hpp"
+#include "MainFrame.hpp"
#include "wxExtensions.hpp"
namespace Slic3r {
@@ -48,9 +49,17 @@ static wxString generate_html_row(const Config::Snapshot &snapshot, bool row_eve
text += "</b></font><br>";
// End of row header.
text += _(L("PrusaSlicer version")) + ": " + snapshot.slic3r_version_captured.to_string() + "<br>";
- text += _(L("print")) + ": " + snapshot.print + "<br>";
- text += _(L("filaments")) + ": " + snapshot.filaments.front() + "<br>";
- text += _(L("printer")) + ": " + snapshot.printer + "<br>";
+ 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 + "<br>";
+ text += _(L("filaments")) + ": " + snapshot.filaments.front() + "<br>";
+ }
+ if (has_sla) {
+ text += _(L("SLA print")) + ": " + snapshot.sla_print + "<br>";
+ text += _(L("SLA material")) + ": " + snapshot.sla_material + "<br>";
+ }
+ text += _(L("printer")) + ": " + (snapshot.physical_printer.empty() ? snapshot.printer : snapshot.physical_printer) + "<br>";
bool compatible = true;
for (const Config::Snapshot::VendorConfig &vc : snapshot.vendor_configs) {
@@ -101,7 +110,7 @@ static wxString generate_html_page(const Config::SnapshotDB &snapshot_db, const
}
ConfigSnapshotDialog::ConfigSnapshotDialog(const Config::SnapshotDB &snapshot_db, const wxString &on_snapshot)
- : DPIDialog(NULL, wxID_ANY, _(L("Configuration Snapshots")), wxDefaultPosition,
+ : DPIDialog(static_cast<wxWindow*>(wxGetApp().mainframe), wxID_ANY, _(L("Configuration Snapshots")), wxDefaultPosition,
wxSize(45 * wxGetApp().em_unit(), 40 * wxGetApp().em_unit()),
wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxMAXIMIZE_BOX)
{
@@ -114,7 +123,7 @@ ConfigSnapshotDialog::ConfigSnapshotDialog(const Config::SnapshotDB &snapshot_db
// text
html = new wxHtmlWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_AUTO);
{
- wxFont font = wxGetApp().normal_font();//wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
+ wxFont font = get_default_font(this);
#ifdef __WXMSW__
const int fs = font.GetPointSize();
const int fs1 = static_cast<int>(0.8f*fs);
@@ -140,7 +149,7 @@ ConfigSnapshotDialog::ConfigSnapshotDialog(const Config::SnapshotDB &snapshot_db
void ConfigSnapshotDialog::on_dpi_changed(const wxRect &suggested_rect)
{
- wxFont font = GetFont();
+ wxFont font = get_default_font(this);
const int fs = font.GetPointSize();
const int fs1 = static_cast<int>(0.8f*fs);
const int fs2 = static_cast<int>(1.1f*fs);
diff --git a/src/slic3r/GUI/ConfigWizard.cpp b/src/slic3r/GUI/ConfigWizard.cpp
index 19067738a..5af48ee36 100644
--- a/src/slic3r/GUI/ConfigWizard.cpp
+++ b/src/slic3r/GUI/ConfigWizard.cpp
@@ -10,6 +10,7 @@
#include <boost/format.hpp>
#include <boost/log/trivial.hpp>
#include <boost/algorithm/string/predicate.hpp>
+#include <boost/nowide/convert.hpp>
#include <wx/settings.h>
#include <wx/stattext.h>
@@ -26,11 +27,19 @@
#include <wx/debug.h>
#include "libslic3r/Utils.hpp"
+#include "libslic3r/Config.hpp"
#include "GUI.hpp"
+#include "GUI_App.hpp"
#include "GUI_Utils.hpp"
+#include "GUI_ObjectManipulation.hpp"
#include "slic3r/Config/Snapshot.hpp"
#include "slic3r/Utils/PresetUpdater.hpp"
+#if defined(__linux__) && defined(__WXGTK3__)
+#define wxLinux_gtk3 true
+#else
+#define wxLinux_gtk3 false
+#endif //defined(__linux__) && defined(__WXGTK3__)
namespace Slic3r {
namespace GUI {
@@ -120,7 +129,7 @@ Bundle& BundleMap::prusa_bundle()
{
auto it = find(PresetBundle::PRUSA_BUNDLE);
if (it == end()) {
- throw std::runtime_error("ConfigWizard: Internal error in BundleMap: PRUSA_BUNDLE not loaded");
+ throw Slic3r::RuntimeError("ConfigWizard: Internal error in BundleMap: PRUSA_BUNDLE not loaded");
}
return it->second;
@@ -188,24 +197,24 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, wxSt
wxBitmap bitmap;
int bitmap_width = 0;
- const wxString bitmap_file = GUI::from_u8(Slic3r::resources_dir() + "/profiles/" + vendor.id + "/" + model.id + "_thumbnail.png");
- if (wxFileExists(bitmap_file)) {
- bitmap.LoadFile(bitmap_file, wxBITMAP_TYPE_PNG);
- bitmap_width = bitmap.GetWidth();
- } else {
- BOOST_LOG_TRIVIAL(warning) << boost::format("Can't find bitmap file `%1%` for vendor `%2%`, printer `%3%`, using placeholder icon instead")
- % bitmap_file
- % vendor.id
- % model.id;
-
- const wxString placeholder_file = GUI::from_u8(Slic3r::var(PRINTER_PLACEHOLDER));
- if (wxFileExists(placeholder_file)) {
- bitmap.LoadFile(placeholder_file, wxBITMAP_TYPE_PNG);
+ auto load_bitmap = [](const wxString& bitmap_file, wxBitmap& bitmap, int& bitmap_width)->bool {
+ if (wxFileExists(bitmap_file)) {
+ bitmap.LoadFile(bitmap_file, wxBITMAP_TYPE_PNG);
bitmap_width = bitmap.GetWidth();
+ return true;
+ }
+ return false;
+ };
+ if (!load_bitmap(GUI::from_u8(Slic3r::data_dir() + "/vendor/" + vendor.id + "/" + model.id + "_thumbnail.png"), bitmap, bitmap_width)) {
+ if (!load_bitmap(GUI::from_u8(Slic3r::resources_dir() + "/profiles/" + vendor.id + "/" + model.id + "_thumbnail.png"), bitmap, bitmap_width)) {
+ BOOST_LOG_TRIVIAL(warning) << boost::format("Can't find bitmap file `%1%` for vendor `%2%`, printer `%3%`, using placeholder icon instead")
+ % (Slic3r::resources_dir() + "/profiles/" + vendor.id + "/" + model.id + "_thumbnail.png")
+ % vendor.id
+ % model.id;
+ load_bitmap(Slic3r::var(PRINTER_PLACEHOLDER), bitmap, bitmap_width);
}
}
-
- auto *title = new wxStaticText(this, wxID_ANY, model.name, wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
+ auto *title = new wxStaticText(this, wxID_ANY, from_u8(model.name), wxDefaultPosition, wxDefaultSize, wxALIGN_LEFT);
title->SetFont(font_name);
const int wrap_width = std::max((int)MODEL_MIN_WRAP, bitmap_width);
title->Wrap(wrap_width);
@@ -234,7 +243,7 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, wxSt
: from_u8(model.name);
if (i == 1) {
- auto *alt_label = new wxStaticText(variants_panel, wxID_ANY, _(L("Alternate nozzles:")));
+ auto *alt_label = new wxStaticText(variants_panel, wxID_ANY, _L("Alternate nozzles:"));
alt_label->SetFont(font_alt_nozzle);
variants_sizer->Add(alt_label, 0, wxBOTTOM, 3);
is_variants = true;
@@ -267,25 +276,22 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, wxSt
const size_t odd_items = titles.size() % cols;
for (size_t i = 0; i < titles.size() - odd_items; i += cols) {
- for (size_t j = i; j < i + cols; j++) { printer_grid->Add(titles[j], 0, wxBOTTOM, 3); }
for (size_t j = i; j < i + cols; j++) { printer_grid->Add(bitmaps[j], 0, wxBOTTOM, 20); }
+ for (size_t j = i; j < i + cols; j++) { printer_grid->Add(titles[j], 0, wxBOTTOM, 3); }
for (size_t j = i; j < i + cols; j++) { printer_grid->Add(variants_panels[j]); }
- // Add separator space
- if (i > 0) {
- for (size_t j = i; j < i + cols; j++) { printer_grid->Add(1, 100); }
+ // Add separator space to multiliners
+ if (titles.size() > cols) {
+ for (size_t j = i; j < i + cols; j++) { printer_grid->Add(1, 30); }
}
}
-
if (odd_items > 0) {
- for (size_t i = 0; i < cols; i++) { printer_grid->Add(1, 100); }
-
const size_t rem = titles.size() - odd_items;
- for (size_t i = rem; i < titles.size(); i++) { printer_grid->Add(titles[i], 0, wxBOTTOM, 3); }
- for (size_t i = 0; i < cols - odd_items; i++) { printer_grid->AddSpacer(1); }
for (size_t i = rem; i < titles.size(); i++) { printer_grid->Add(bitmaps[i], 0, wxBOTTOM, 20); }
for (size_t i = 0; i < cols - odd_items; i++) { printer_grid->AddSpacer(1); }
+ for (size_t i = rem; i < titles.size(); i++) { printer_grid->Add(titles[i], 0, wxBOTTOM, 3); }
+ for (size_t i = 0; i < cols - odd_items; i++) { printer_grid->AddSpacer(1); }
for (size_t i = rem; i < titles.size(); i++) { printer_grid->Add(variants_panels[i]); }
}
}
@@ -301,9 +307,9 @@ PrinterPicker::PrinterPicker(wxWindow *parent, const VendorProfile &vendor, wxSt
if (/*titles.size() > 1*/is_variants) {
// It only makes sense to add the All / None buttons if there's multiple printers
- auto *sel_all_std = new wxButton(this, wxID_ANY, titles.size() > 1 ? _(L("All standard")) : _(L("Standard")));
- auto *sel_all = new wxButton(this, wxID_ANY, _(L("All")));
- auto *sel_none = new wxButton(this, wxID_ANY, _(L("None")));
+ auto *sel_all_std = new wxButton(this, wxID_ANY, titles.size() > 1 ? _L("All standard") : _L("Standard"));
+ auto *sel_all = new wxButton(this, wxID_ANY, _L("All"));
+ auto *sel_none = new wxButton(this, wxID_ANY, _L("None"));
sel_all_std->Bind(wxEVT_BUTTON, [this](const wxCommandEvent &event) { this->select_all(true, false); });
sel_all->Bind(wxEVT_BUTTON, [this](const wxCommandEvent &event) { this->select_all(true, true); });
sel_none->Bind(wxEVT_BUTTON, [this](const wxCommandEvent &event) { this->select_all(false); });
@@ -408,7 +414,11 @@ ConfigWizardPage::ConfigWizardPage(ConfigWizard *parent, wxString title, wxStrin
SetSizer(sizer);
- this->Hide();
+ // There is strange layout on Linux with GTK3,
+ // see https://github.com/prusa3d/PrusaSlicer/issues/5103 and https://github.com/prusa3d/PrusaSlicer/issues/4861
+ // So, non-active pages will be hidden later, on wxEVT_SHOW, after completed Layout() for all pages
+ if (!wxLinux_gtk3)
+ this->Hide();
Bind(wxEVT_SIZE, [this](wxSizeEvent &event) {
this->Layout();
@@ -443,14 +453,14 @@ PageWelcome::PageWelcome(ConfigWizard *parent)
#else
_utf8(L("Welcome to the %s Configuration Wizard"))
#endif
- ) % SLIC3R_APP_NAME).str()), _(L("Welcome")))
+ ) % SLIC3R_APP_NAME).str()), _L("Welcome"))
, welcome_text(append_text(from_u8((boost::format(
_utf8(L("Hello, welcome to %s! This %s helps you with the initial configuration; just a few settings and you will be ready to print.")))
% SLIC3R_APP_NAME
% _utf8(ConfigWizard::name())).str())
))
, cbox_reset(append(
- new wxCheckBox(this, wxID_ANY, _(L("Remove user profiles (a snapshot will be taken beforehand)")))
+ new wxCheckBox(this, wxID_ANY, _L("Remove user profiles (a snapshot will be taken beforehand)"))
))
{
welcome_text->Hide();
@@ -559,152 +569,498 @@ const std::string PageMaterials::EMPTY;
PageMaterials::PageMaterials(ConfigWizard *parent, Materials *materials, wxString title, wxString shortname, wxString list1name)
: ConfigWizardPage(parent, std::move(title), std::move(shortname))
, materials(materials)
- , list_l1(new StringList(this))
- , list_l2(new StringList(this))
- , list_l3(new PresetList(this))
+ , list_printer(new StringList(this, wxLB_MULTIPLE))
+ , list_type(new StringList(this))
+ , list_vendor(new StringList(this))
+ , list_profile(new PresetList(this))
{
append_spacer(VERTICAL_SPACING);
const int em = parent->em_unit();
const int list_h = 30*em;
- list_l1->SetMinSize(wxSize(8*em, list_h));
- list_l2->SetMinSize(wxSize(13*em, list_h));
- list_l3->SetMinSize(wxSize(25*em, list_h));
- auto *grid = new wxFlexGridSizer(3, em/2, em);
- grid->AddGrowableCol(2, 1);
+ list_printer->SetMinSize(wxSize(23*em, list_h));
+ list_type->SetMinSize(wxSize(8*em, list_h));
+ list_vendor->SetMinSize(wxSize(13*em, list_h));
+ list_profile->SetMinSize(wxSize(23*em, list_h));
+
+
+
+ grid = new wxFlexGridSizer(4, em/2, em);
+ grid->AddGrowableCol(3, 1);
grid->AddGrowableRow(1, 1);
+ grid->Add(new wxStaticText(this, wxID_ANY, _L("Printer:")));
grid->Add(new wxStaticText(this, wxID_ANY, list1name));
- grid->Add(new wxStaticText(this, wxID_ANY, _(L("Vendor:"))));
- grid->Add(new wxStaticText(this, wxID_ANY, _(L("Profile:"))));
+ grid->Add(new wxStaticText(this, wxID_ANY, _L("Vendor:")));
+ grid->Add(new wxStaticText(this, wxID_ANY, _L("Profile:")));
- grid->Add(list_l1, 0, wxEXPAND);
- grid->Add(list_l2, 0, wxEXPAND);
- grid->Add(list_l3, 1, wxEXPAND);
+ grid->Add(list_printer, 0, wxEXPAND);
+ grid->Add(list_type, 0, wxEXPAND);
+ grid->Add(list_vendor, 0, wxEXPAND);
+ grid->Add(list_profile, 1, wxEXPAND);
auto *btn_sizer = new wxBoxSizer(wxHORIZONTAL);
- auto *sel_all = new wxButton(this, wxID_ANY, _(L("All")));
- auto *sel_none = new wxButton(this, wxID_ANY, _(L("None")));
+ auto *sel_all = new wxButton(this, wxID_ANY, _L("All"));
+ auto *sel_none = new wxButton(this, wxID_ANY, _L("None"));
btn_sizer->Add(sel_all, 0, wxRIGHT, em / 2);
btn_sizer->Add(sel_none);
+
+ grid->Add(new wxBoxSizer(wxHORIZONTAL));
grid->Add(new wxBoxSizer(wxHORIZONTAL));
grid->Add(new wxBoxSizer(wxHORIZONTAL));
grid->Add(btn_sizer, 0, wxALIGN_RIGHT);
append(grid, 1, wxEXPAND);
- list_l1->Bind(wxEVT_LISTBOX, [this](wxCommandEvent &) {
- update_lists(list_l1->GetSelection(), list_l2->GetSelection());
+ append_spacer(VERTICAL_SPACING);
+
+ html_window = new wxHtmlWindow(this, wxID_ANY, wxDefaultPosition,
+ wxSize(60 * em, 20 * em), wxHW_SCROLLBAR_AUTO);
+ append(html_window, 0, wxEXPAND);
+
+ list_printer->Bind(wxEVT_LISTBOX, [this](wxCommandEvent& evt) {
+ update_lists(evt.GetInt(), list_type->GetSelection(), list_vendor->GetSelection());
+ });
+ list_type->Bind(wxEVT_LISTBOX, [this](wxCommandEvent &) {
+ update_lists(list_printer->GetSelection(), list_type->GetSelection(), list_vendor->GetSelection());
});
- list_l2->Bind(wxEVT_LISTBOX, [this](wxCommandEvent &) {
- update_lists(list_l1->GetSelection(), list_l2->GetSelection());
+ list_vendor->Bind(wxEVT_LISTBOX, [this](wxCommandEvent &) {
+ update_lists(list_printer->GetSelection(), list_type->GetSelection(), list_vendor->GetSelection());
});
- list_l3->Bind(wxEVT_CHECKLISTBOX, [this](wxCommandEvent &evt) { select_material(evt.GetInt()); });
+ list_profile->Bind(wxEVT_CHECKLISTBOX, [this](wxCommandEvent &evt) { select_material(evt.GetInt()); });
+ list_profile->Bind(wxEVT_LISTBOX, [this](wxCommandEvent& evt) { on_material_highlighted(evt.GetInt()); });
sel_all->Bind(wxEVT_BUTTON, [this](wxCommandEvent &) { select_all(true); });
sel_none->Bind(wxEVT_BUTTON, [this](wxCommandEvent &) { select_all(false); });
+ /*
+ Bind(wxEVT_PAINT, [this](wxPaintEvent& evt) {on_paint();});
+ list_profile->Bind(wxEVT_MOTION, [this](wxMouseEvent& evt) { on_mouse_move_on_profiles(evt); });
+ list_profile->Bind(wxEVT_ENTER_WINDOW, [this](wxMouseEvent& evt) { on_mouse_enter_profiles(evt); });
+ list_profile->Bind(wxEVT_LEAVE_WINDOW, [this](wxMouseEvent& evt) { on_mouse_leave_profiles(evt); });
+ */
reload_presets();
+ set_compatible_printers_html_window(std::vector<std::string>(), false);
+}
+void PageMaterials::on_paint()
+{
+}
+void PageMaterials::on_mouse_move_on_profiles(wxMouseEvent& evt)
+{
+ const wxClientDC dc(list_profile);
+ const wxPoint pos = evt.GetLogicalPosition(dc);
+ int item = list_profile->HitTest(pos);
+ on_material_hovered(item);
+}
+void PageMaterials::on_mouse_enter_profiles(wxMouseEvent& evt)
+{}
+void PageMaterials::on_mouse_leave_profiles(wxMouseEvent& evt)
+{
+ on_material_hovered(-1);
}
-
void PageMaterials::reload_presets()
{
clear();
- list_l1->append(_(L("(All)")), &EMPTY);
-
- for (const std::string &type : materials->types) {
- list_l1->append(type, &type);
- }
-
- if (list_l1->GetCount() > 0) {
- list_l1->SetSelection(0);
- sel1_prev = wxNOT_FOUND;
- sel2_prev = wxNOT_FOUND;
- update_lists(0, 0);
+ list_printer->append(_L("(All)"), &EMPTY);
+ //list_printer->SetLabelMarkup("<b>bald</b>");
+ for (const Preset* printer : materials->printers) {
+ list_printer->append(printer->name, &printer->name);
+ }
+ sort_list_data(list_printer, true, false);
+ if (list_printer->GetCount() > 0) {
+ list_printer->SetSelection(0);
+ sel_printer_count_prev = wxNOT_FOUND;
+ sel_printer_item_prev = wxNOT_FOUND;
+ sel_type_prev = wxNOT_FOUND;
+ sel_vendor_prev = wxNOT_FOUND;
+ update_lists(0, 0, 0);
}
presets_loaded = true;
}
-void PageMaterials::update_lists(int sel1, int sel2)
+void PageMaterials::set_compatible_printers_html_window(const std::vector<std::string>& printer_names, bool all_printers)
{
- wxWindowUpdateLocker freeze_guard(this);
- (void)freeze_guard;
-
- if (sel1 != sel1_prev) {
- // Refresh the second list
+ const auto bgr_clr =
+#if defined(__APPLE__)
+ wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
+#else
+ wxSystemSettings::GetColour(wxSYS_COLOUR_MENU);
+#endif
+ const auto bgr_clr_str = wxString::Format(wxT("#%02X%02X%02X"), bgr_clr.Red(), bgr_clr.Green(), bgr_clr.Blue());
+ const auto text_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
+ const auto text_clr_str = wxString::Format(wxT("#%02X%02X%02X"), text_clr.Red(), text_clr.Green(), text_clr.Blue());
+ wxString first_line = _L("Filaments marked with <b>*</b> are <b>not</b> compatible with some installed printers.");
+ wxString text;
+ if (all_printers) {
+ wxString second_line = _L("All installed printers are compatible with the selected filament.");
+ text = wxString::Format(
+ "<html>"
+ "<style>"
+ "table{border-spacing: 1px;}"
+ "</style>"
+ "<body bgcolor= %s>"
+ "<font color=%s>"
+ "<font size=\"3\">"
+ "%s<br /><br />%s"
+ "</font>"
+ "</font>"
+ "</body>"
+ "</html>"
+ , bgr_clr_str
+ , text_clr_str
+ , first_line
+ , second_line
+ );
+ } else {
+ wxString second_line = _L("Only the following installed printers are compatible with the selected filament:");
+ text = wxString::Format(
+ "<html>"
+ "<style>"
+ "table{border-spacing: 1px;}"
+ "</style>"
+ "<body bgcolor= %s>"
+ "<font color=%s>"
+ "<font size=\"3\">"
+ "%s<br /><br />%s"
+ "<table>"
+ "<tr>"
+ , bgr_clr_str
+ , text_clr_str
+ , first_line
+ , second_line);
+ for (int i = 0; i < printer_names.size(); ++i)
+ {
+ text += wxString::Format("<td>%s</td>", boost::nowide::widen(printer_names[i]));
+ if (i % 3 == 2) {
+ text += wxString::Format(
+ "</tr>"
+ "<tr>");
+ }
+ }
+ text += wxString::Format(
+ "</tr>"
+ "</table>"
+ "</font>"
+ "</font>"
+ "</body>"
+ "</html>"
+ );
+ }
+
+ wxFont font = get_default_font_for_dpi(this, get_dpi_for_window(this));
+ const int fs = font.GetPointSize();
+ int size[] = { fs,fs,fs,fs,fs,fs,fs };
+ html_window->SetFonts(font.GetFaceName(), font.GetFaceName(), size);
+ html_window->SetPage(text);
+}
- // XXX: The vendor list is created with quadratic complexity here,
- // but the number of vendors is going to be very small this shouldn't be a problem.
+void PageMaterials::clear_compatible_printers_label()
+{
+ set_compatible_printers_html_window(std::vector<std::string>(), false);
+}
- list_l2->Clear();
- list_l2->append(_(L("(All)")), &EMPTY);
- if (sel1 != wxNOT_FOUND) {
- const std::string &type = list_l1->get_data(sel1);
+void PageMaterials::on_material_hovered(int sel_material)
+{
- materials->filter_presets(type, EMPTY, [this](const Preset *p) {
- const std::string &vendor = this->materials->get_vendor(p);
+}
- if (list_l2->find(vendor) == wxNOT_FOUND) {
- list_l2->append(vendor, &vendor);
- }
- });
+void PageMaterials::on_material_highlighted(int sel_material)
+{
+ if (sel_material == last_hovered_item)
+ return;
+ if (sel_material == -1) {
+ clear_compatible_printers_label();
+ return;
+ }
+ last_hovered_item = sel_material;
+ std::vector<std::string> tabs;
+ tabs.push_back(std::string());
+ tabs.push_back(std::string());
+ tabs.push_back(std::string());
+ //selected material string
+ std::string material_name = list_profile->get_data(sel_material);
+ // get material preset
+ const std::vector<const Preset*> matching_materials = materials->get_presets_by_alias(material_name);
+ if (matching_materials.empty())
+ {
+ clear_compatible_printers_label();
+ return;
+ }
+ //find matching printers
+ std::vector<std::string> names;
+ for (const Preset* printer : materials->printers) {
+ for (const Preset* material : matching_materials) {
+ if (is_compatible_with_printer(PresetWithVendorProfile(*material, material->vendor), PresetWithVendorProfile(*printer, printer->vendor))) {
+ names.push_back(printer->name);
+ break;
+ }
}
-
- sel1_prev = sel1;
- sel2 = 0;
- sel2_prev = wxNOT_FOUND;
- list_l2->SetSelection(sel2);
- list_l3->Clear();
}
+ set_compatible_printers_html_window(names, names.size() == materials->printers.size());
+}
- if (sel2 != sel2_prev) {
- // Refresh the third list
+void PageMaterials::update_lists(int sel_printer, int sel_type, int sel_vendor)
+{
+ wxWindowUpdateLocker freeze_guard(this);
+ (void)freeze_guard;
- list_l3->Clear();
- if (sel1 != wxNOT_FOUND && sel2 != wxNOT_FOUND) {
- const std::string &type = list_l1->get_data(sel1);
- const std::string &vendor = list_l2->get_data(sel2);
+ wxArrayInt sel_printers;
+ int sel_printers_count = list_printer->GetSelections(sel_printers);
- materials->filter_presets(type, vendor, [this](const Preset *p) {
- bool was_checked = false;
+ if (sel_printers_count != sel_printer_count_prev || (sel_printers_count == 1 && sel_printer_item_prev != sel_printer && sel_printer != -1)) {
+ // Refresh type list
+ list_type->Clear();
+ list_type->append(_L("(All)"), &EMPTY);
+ if (sel_printers_count > 0) {
+ // If all is selected with other printers
+ // unselect "all" or all printers depending on last value
+ if (sel_printers[0] == 0 && sel_printers_count > 1) {
+ if (sel_printer == 0) {
+ list_printer->SetSelection(wxNOT_FOUND);
+ list_printer->SetSelection(0);
+ } else {
+ list_printer->SetSelection(0, false);
+ sel_printers_count = list_printer->GetSelections(sel_printers);
+ }
+ }
+ if (sel_printers[0] != 0) {
+ for (size_t i = 0; i < sel_printers_count; i++) {
+ const std::string& printer_name = list_printer->get_data(sel_printers[i]);
+ const Preset* printer = nullptr;
+ for (const Preset* it : materials->printers) {
+ if (it->name == printer_name) {
+ printer = it;
+ break;
+ }
+ }
+ materials->filter_presets(printer, EMPTY, EMPTY, [this](const Preset* p) {
+ const std::string& type = this->materials->get_type(p);
+ if (list_type->find(type) == wxNOT_FOUND) {
+ list_type->append(type, &type);
+ }
+ });
+ }
+ } else {
+ //clear selection except "ALL"
+ list_printer->SetSelection(wxNOT_FOUND);
+ list_printer->SetSelection(0);
+ sel_printers_count = list_printer->GetSelections(sel_printers);
+
+ materials->filter_presets(nullptr, EMPTY, EMPTY, [this](const Preset* p) {
+ const std::string& type = this->materials->get_type(p);
+ if (list_type->find(type) == wxNOT_FOUND) {
+ list_type->append(type, &type);
+ }
+ });
+ }
+ sort_list_data(list_type, true, true);
+ }
- int cur_i = list_l3->find(p->alias);
- if (cur_i == wxNOT_FOUND)
- cur_i = list_l3->append(p->alias, &p->alias);
- else
- was_checked = list_l3->IsChecked(cur_i);
+ sel_printer_count_prev = sel_printers_count;
+ sel_printer_item_prev = sel_printer;
+ sel_type = 0;
+ sel_type_prev = wxNOT_FOUND;
+ list_type->SetSelection(sel_type);
+ list_profile->Clear();
+ }
+
+ if (sel_type != sel_type_prev) {
+ // Refresh vendor list
+
+ // XXX: The vendor list is created with quadratic complexity here,
+ // but the number of vendors is going to be very small this shouldn't be a problem.
+
+ list_vendor->Clear();
+ list_vendor->append(_L("(All)"), &EMPTY);
+ if (sel_printers_count != 0 && sel_type != wxNOT_FOUND) {
+ const std::string& type = list_type->get_data(sel_type);
+ // find printer preset
+ for (size_t i = 0; i < sel_printers_count; i++) {
+ const std::string& printer_name = list_printer->get_data(sel_printers[i]);
+ const Preset* printer = nullptr;
+ for (const Preset* it : materials->printers) {
+ if (it->name == printer_name) {
+ printer = it;
+ break;
+ }
+ }
+ materials->filter_presets(printer, type, EMPTY, [this](const Preset* p) {
+ const std::string& vendor = this->materials->get_vendor(p);
+ if (list_vendor->find(vendor) == wxNOT_FOUND) {
+ list_vendor->append(vendor, &vendor);
+ }
+ });
+ }
+ sort_list_data(list_vendor, true, false);
+ }
- const std::string& section = materials->appconfig_section();
+ sel_type_prev = sel_type;
+ sel_vendor = 0;
+ sel_vendor_prev = wxNOT_FOUND;
+ list_vendor->SetSelection(sel_vendor);
+ list_profile->Clear();
+ }
+
+ if (sel_vendor != sel_vendor_prev) {
+ // Refresh material list
+
+ list_profile->Clear();
+ clear_compatible_printers_label();
+ if (sel_printers_count != 0 && sel_type != wxNOT_FOUND && sel_vendor != wxNOT_FOUND) {
+ const std::string& type = list_type->get_data(sel_type);
+ const std::string& vendor = list_vendor->get_data(sel_vendor);
+ // finst printer preset
+ std::vector<ProfilePrintData> to_list;
+ for (size_t i = 0; i < sel_printers_count; i++) {
+ const std::string& printer_name = list_printer->get_data(sel_printers[i]);
+ const Preset* printer = nullptr;
+ for (const Preset* it : materials->printers) {
+ if (it->name == printer_name) {
+ printer = it;
+ break;
+ }
+ }
+
+ materials->filter_presets(printer, type, vendor, [this, &to_list](const Preset* p) {
+ bool was_checked = false;
+ //size_t printer_counter = materials->get_printer_counter(p);
+ int cur_i = list_profile->find(p->alias);
+ bool emplace_to_to_list = false;
+ if (cur_i == wxNOT_FOUND) {
+ cur_i = list_profile->append(p->alias + (materials->get_omnipresent(p) ? "" : " *"), &p->alias);
+ emplace_to_to_list = true;
+ } else
+ was_checked = list_profile->IsChecked(cur_i);
+
+ const std::string& section = materials->appconfig_section();
+
+ const bool checked = wizard_p()->appconfig_new.has(section, p->name);
+ list_profile->Check(cur_i, checked || was_checked);
+ if (emplace_to_to_list)
+ to_list.emplace_back(p->alias, materials->get_omnipresent(p), checked || was_checked);
+
+ /* Update preset selection in config.
+ * If one preset from aliases bundle is selected,
+ * than mark all presets with this aliases as selected
+ * */
+ if (checked && !was_checked)
+ wizard_p()->update_presets_in_config(section, p->alias, true);
+ else if (!checked && was_checked)
+ wizard_p()->appconfig_new.set(section, p->name, "1");
+ });
+ }
+ sort_list_data(list_profile, to_list);
+ }
- const bool checked = wizard_p()->appconfig_new.has(section, p->name);
- list_l3->Check(cur_i, checked | was_checked);
+ sel_vendor_prev = sel_vendor;
+ }
+}
- /* Update preset selection in config.
- * If one preset from aliases bundle is selected,
- * than mark all presets with this aliases as selected
- * */
- if (checked && !was_checked)
- wizard_p()->update_presets_in_config(section, p->alias, true);
- else if (!checked && was_checked)
- wizard_p()->appconfig_new.set(section, p->name, "1");
- } );
+void PageMaterials::sort_list_data(StringList* list, bool add_All_item, bool material_type_ordering)
+{
+// get data from list
+// sort data
+// first should be <all>
+// then prusa profiles
+// then the rest
+// in alphabetical order
+
+ std::vector<std::reference_wrapper<const std::string>> prusa_profiles;
+ std::vector<std::reference_wrapper<const std::string>> other_profiles;
+ for (int i = 0 ; i < list->size(); ++i) {
+ const std::string& data = list->get_data(i);
+ if (data == EMPTY) // do not sort <all> item
+ continue;
+ if (!material_type_ordering && data.find("Prusa") != std::string::npos)
+ prusa_profiles.push_back(data);
+ else
+ other_profiles.push_back(data);
+ }
+ if(material_type_ordering) {
+
+ const ConfigOptionDef* def = print_config_def.get("filament_type");
+ std::vector<std::string>enum_values = def->enum_values;
+ int end_of_sorted = 0;
+ for (size_t vals = 0; vals < enum_values.size(); vals++) {
+ for (size_t profs = end_of_sorted; profs < other_profiles.size(); profs++)
+ {
+ // find instead compare because PET vs PETG
+ if (other_profiles[profs].get().find(enum_values[vals]) != std::string::npos) {
+ //swap
+ if(profs != end_of_sorted) {
+ std::reference_wrapper<const std::string> aux = other_profiles[end_of_sorted];
+ other_profiles[end_of_sorted] = other_profiles[profs];
+ other_profiles[profs] = aux;
+ }
+ end_of_sorted++;
+ break;
+ }
+ }
}
-
- sel2_prev = sel2;
+ } else {
+ std::sort(prusa_profiles.begin(), prusa_profiles.end(), [](std::reference_wrapper<const std::string> a, std::reference_wrapper<const std::string> b) {
+ return a.get() < b.get();
+ });
+ std::sort(other_profiles.begin(), other_profiles.end(), [](std::reference_wrapper<const std::string> a, std::reference_wrapper<const std::string> b) {
+ return a.get() < b.get();
+ });
+ }
+
+ list->Clear();
+ if (add_All_item)
+ list->append(_L("(All)"), &EMPTY);
+ for (const auto& item : prusa_profiles)
+ list->append(item, &const_cast<std::string&>(item.get()));
+ for (const auto& item : other_profiles)
+ list->append(item, &const_cast<std::string&>(item.get()));
+}
+
+void PageMaterials::sort_list_data(PresetList* list, const std::vector<ProfilePrintData>& data)
+{
+ // sort data
+ // then prusa profiles
+ // then the rest
+ // in alphabetical order
+ std::vector<ProfilePrintData> prusa_profiles;
+ std::vector<ProfilePrintData> other_profiles;
+ //for (int i = 0; i < data.size(); ++i) {
+ for (const auto& item : data) {
+ const std::string& name = item.name;
+ if (name.find("Prusa") != std::string::npos)
+ prusa_profiles.emplace_back(item);
+ else
+ other_profiles.emplace_back(item);
+ }
+ std::sort(prusa_profiles.begin(), prusa_profiles.end(), [](ProfilePrintData a, ProfilePrintData b) {
+ return a.name.get() < b.name.get();
+ });
+ std::sort(other_profiles.begin(), other_profiles.end(), [](ProfilePrintData a, ProfilePrintData b) {
+ return a.name.get() < b.name.get();
+ });
+ list->Clear();
+ //for (const auto& item : prusa_profiles)
+ for (int i = 0; i < prusa_profiles.size(); ++i) {
+ list->append(std::string(prusa_profiles[i].name) + (prusa_profiles[i].omnipresent ? "" : " *"), &const_cast<std::string&>(prusa_profiles[i].name.get()));
+ list->Check(i, prusa_profiles[i].checked);
+ }
+ //for (const auto& item : other_profiles)
+ for (int i = 0; i < other_profiles.size(); ++i) {
+ list->append(std::string(other_profiles[i].name) + (other_profiles[i].omnipresent ? "" : " *"), &const_cast<std::string&>(other_profiles[i].name.get()));
+ list->Check(i + prusa_profiles.size(), other_profiles[i].checked);
}
}
void PageMaterials::select_material(int i)
{
- const bool checked = list_l3->IsChecked(i);
+ const bool checked = list_profile->IsChecked(i);
- const std::string& alias_key = list_l3->get_data(i);
+ const std::string& alias_key = list_profile->get_data(i);
wizard_p()->update_presets_in_config(materials->appconfig_section(), alias_key, checked);
}
@@ -713,10 +1069,10 @@ void PageMaterials::select_all(bool select)
wxWindowUpdateLocker freeze_guard(this);
(void)freeze_guard;
- for (unsigned i = 0; i < list_l3->GetCount(); i++) {
- const bool current = list_l3->IsChecked(i);
+ for (unsigned i = 0; i < list_profile->GetCount(); i++) {
+ const bool current = list_profile->IsChecked(i);
if (current != select) {
- list_l3->Check(i, select);
+ list_profile->Check(i, select);
select_material(i);
}
}
@@ -724,11 +1080,14 @@ void PageMaterials::select_all(bool select)
void PageMaterials::clear()
{
- list_l1->Clear();
- list_l2->Clear();
- list_l3->Clear();
- sel1_prev = wxNOT_FOUND;
- sel2_prev = wxNOT_FOUND;
+ list_printer->Clear();
+ list_type->Clear();
+ list_vendor->Clear();
+ list_profile->Clear();
+ sel_printer_count_prev = wxNOT_FOUND;
+ sel_printer_item_prev = wxNOT_FOUND;
+ sel_type_prev = wxNOT_FOUND;
+ sel_vendor_prev = wxNOT_FOUND;
presets_loaded = false;
}
@@ -738,17 +1097,18 @@ void PageMaterials::on_activate()
wizard_p()->update_materials(materials->technology);
reload_presets();
}
+ first_paint = true;
}
const char *PageCustom::default_profile_name = "My Settings";
PageCustom::PageCustom(ConfigWizard *parent)
- : ConfigWizardPage(parent, _(L("Custom Printer Setup")), _(L("Custom Printer")))
+ : ConfigWizardPage(parent, _L("Custom Printer Setup"), _L("Custom Printer"))
{
- cb_custom = new wxCheckBox(this, wxID_ANY, _(L("Define a custom printer profile")));
+ cb_custom = new wxCheckBox(this, wxID_ANY, _L("Define a custom printer profile"));
tc_profile_name = new wxTextCtrl(this, wxID_ANY, default_profile_name);
- auto *label = new wxStaticText(this, wxID_ANY, _(L("Custom profile name:")));
+ auto *label = new wxStaticText(this, wxID_ANY, _L("Custom profile name:"));
tc_profile_name->Enable(false);
tc_profile_name->Bind(wxEVT_KILL_FOCUS, [this](wxFocusEvent &evt) {
@@ -773,7 +1133,7 @@ PageCustom::PageCustom(ConfigWizard *parent)
}
PageUpdate::PageUpdate(ConfigWizard *parent)
- : ConfigWizardPage(parent, _(L("Automatic updates")), _(L("Updates")))
+ : ConfigWizardPage(parent, _L("Automatic updates"), _L("Updates"))
, version_check(true)
, preset_update(true)
{
@@ -781,64 +1141,84 @@ PageUpdate::PageUpdate(ConfigWizard *parent)
auto boldfont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
boldfont.SetWeight(wxFONTWEIGHT_BOLD);
- auto *box_slic3r = new wxCheckBox(this, wxID_ANY, _(L("Check for application updates")));
+ auto *box_slic3r = new wxCheckBox(this, wxID_ANY, _L("Check for application updates"));
box_slic3r->SetValue(app_config->get("version_check") == "1");
append(box_slic3r);
- append_text(wxString::Format(_(L(
+ append_text(wxString::Format(_L(
"If enabled, %s checks for new application versions online. When a new version becomes available, "
"a notification is displayed at the next application startup (never during program usage). "
- "This is only a notification mechanisms, no automatic installation is done.")), SLIC3R_APP_NAME));
+ "This is only a notification mechanisms, no automatic installation is done."), SLIC3R_APP_NAME));
append_spacer(VERTICAL_SPACING);
- auto *box_presets = new wxCheckBox(this, wxID_ANY, _(L("Update built-in Presets automatically")));
+ auto *box_presets = new wxCheckBox(this, wxID_ANY, _L("Update built-in Presets automatically"));
box_presets->SetValue(app_config->get("preset_update") == "1");
append(box_presets);
- append_text(wxString::Format(_(L(
+ append_text(wxString::Format(_L(
"If enabled, %s downloads updates of built-in system presets in the background."
"These updates are downloaded into a separate temporary location."
- "When a new preset version becomes available it is offered at application startup.")), SLIC3R_APP_NAME));
- const auto text_bold = _(L("Updates are never applied without user's consent and never overwrite user's customized settings."));
+ "When a new preset version becomes available it is offered at application startup."), SLIC3R_APP_NAME));
+ const auto text_bold = _L("Updates are never applied without user's consent and never overwrite user's customized settings.");
auto *label_bold = new wxStaticText(this, wxID_ANY, text_bold);
label_bold->SetFont(boldfont);
label_bold->Wrap(WRAP_WIDTH);
append(label_bold);
- append_text(_(L("Additionally a backup snapshot of the whole configuration is created before an update is applied.")));
+ append_text(_L("Additionally a backup snapshot of the whole configuration is created before an update is applied."));
box_slic3r->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent &event) { this->version_check = event.IsChecked(); });
box_presets->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent &event) { this->preset_update = event.IsChecked(); });
}
PageReloadFromDisk::PageReloadFromDisk(ConfigWizard* parent)
- : ConfigWizardPage(parent, _(L("Reload from disk")), _(L("Reload from disk")))
+ : ConfigWizardPage(parent, _L("Reload from disk"), _L("Reload from disk"))
, full_pathnames(false)
{
- auto* box_pathnames = new wxCheckBox(this, wxID_ANY, _(L("Export full pathnames of models and parts sources into 3mf and amf files")));
+ auto* box_pathnames = new wxCheckBox(this, wxID_ANY, _L("Export full pathnames of models and parts sources into 3mf and amf files"));
box_pathnames->SetValue(wxGetApp().app_config->get("export_sources_full_pathnames") == "1");
append(box_pathnames);
- append_text(_(L(
+ append_text(_L(
"If enabled, allows the Reload from disk command to automatically find and load the files when invoked.\n"
"If not enabled, the Reload from disk command will ask to select each file using an open file dialog."
- )));
+ ));
box_pathnames->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent& event) { this->full_pathnames = event.IsChecked(); });
}
+#if ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+#ifdef _WIN32
+PageFilesAssociation::PageFilesAssociation(ConfigWizard* parent)
+ : ConfigWizardPage(parent, _L("Files association"), _L("Files association"))
+{
+ cb_3mf = new wxCheckBox(this, wxID_ANY, _L("Associate .3mf files to PrusaSlicer"));
+ cb_stl = new wxCheckBox(this, wxID_ANY, _L("Associate .stl files to PrusaSlicer"));
+// cb_gcode = new wxCheckBox(this, wxID_ANY, _L("Associate .gcode files to PrusaSlicer G-code Viewer"));
+
+ append(cb_3mf);
+ append(cb_stl);
+// append(cb_gcode);
+}
+#endif // _WIN32
+#endif // ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+
PageMode::PageMode(ConfigWizard *parent)
- : ConfigWizardPage(parent, _(L("View mode")), _(L("View mode")))
+ : ConfigWizardPage(parent, _L("View mode"), _L("View mode"))
{
- append_text(_(L("PrusaSlicer's user interfaces comes in three variants:\nSimple, Advanced, and Expert.\n"
+ append_text(_L("PrusaSlicer's user interfaces comes in three variants:\nSimple, Advanced, and Expert.\n"
"The Simple mode shows only the most frequently used settings relevant for regular 3D printing. "
"The other two offer progressively more sophisticated fine-tuning, "
- "they are suitable for advanced and expert users, respectively.")));
+ "they are suitable for advanced and expert users, respectively."));
- radio_simple = new wxRadioButton(this, wxID_ANY, _(L("Simple mode")));
- radio_advanced = new wxRadioButton(this, wxID_ANY, _(L("Advanced mode")));
- radio_expert = new wxRadioButton(this, wxID_ANY, _(L("Expert mode")));
+ radio_simple = new wxRadioButton(this, wxID_ANY, _L("Simple mode"));
+ radio_advanced = new wxRadioButton(this, wxID_ANY, _L("Advanced mode"));
+ radio_expert = new wxRadioButton(this, wxID_ANY, _L("Expert mode"));
append(radio_simple);
append(radio_advanced);
append(radio_expert);
+
+ append_text("\n" + _L("The size of the object can be specified in inches"));
+ check_inch = new wxCheckBox(this, wxID_ANY, _L("Use inches"));
+ append(check_inch);
}
void PageMode::on_activate()
@@ -849,6 +1229,8 @@ void PageMode::on_activate()
if (mode == "advanced") { radio_advanced->SetValue(true); }
else if (mode == "expert") { radio_expert->SetValue(true); }
else { radio_simple->SetValue(true); }
+
+ check_inch->SetValue(wxGetApp().app_config->get("use_inches") == "1");
}
void PageMode::serialize_mode(AppConfig *app_config) const
@@ -865,14 +1247,15 @@ void PageMode::serialize_mode(AppConfig *app_config) const
return;
app_config->set("view_mode", mode);
+ app_config->set("use_inches", check_inch->GetValue() ? "1" : "0");
}
PageVendors::PageVendors(ConfigWizard *parent)
- : ConfigWizardPage(parent, _(L("Other Vendors")), _(L("Other Vendors")))
+ : ConfigWizardPage(parent, _L("Other Vendors"), _L("Other Vendors"))
{
const AppConfig &appconfig = this->wizard_p()->appconfig_new;
- append_text(wxString::Format(_(L("Pick another vendor supported by %s")), SLIC3R_APP_NAME) + ":");
+ append_text(wxString::Format(_L("Pick another vendor supported by %s"), SLIC3R_APP_NAME) + ":");
auto boldfont = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
boldfont.SetWeight(wxFONTWEIGHT_BOLD);
@@ -903,11 +1286,11 @@ PageVendors::PageVendors(ConfigWizard *parent)
}
PageFirmware::PageFirmware(ConfigWizard *parent)
- : ConfigWizardPage(parent, _(L("Firmware Type")), _(L("Firmware")), 1)
+ : ConfigWizardPage(parent, _L("Firmware Type"), _L("Firmware"), 1)
, gcode_opt(*print_config_def.get("gcode_flavor"))
, gcode_picker(nullptr)
{
- append_text(_(L("Choose the type of firmware used by your printer.")));
+ append_text(_L("Choose the type of firmware used by your printer."));
append_text(_(gcode_opt.tooltip));
wxArrayString choices;
@@ -941,10 +1324,10 @@ void PageFirmware::apply_custom_config(DynamicPrintConfig &config)
}
PageBedShape::PageBedShape(ConfigWizard *parent)
- : ConfigWizardPage(parent, _(L("Bed Shape and Size")), _(L("Bed Shape")), 1)
+ : ConfigWizardPage(parent, _L("Bed Shape and Size"), _L("Bed Shape"), 1)
, shape_panel(new BedShapePanel(this))
{
- append_text(_(L("Set the shape of your printer's bed.")));
+ append_text(_L("Set the shape of your printer's bed."));
shape_panel->build_panel(*wizard_p()->custom_config->option<ConfigOptionPoints>("bed_shape"),
*wizard_p()->custom_config->option<ConfigOptionString>("bed_custom_texture"),
@@ -964,7 +1347,7 @@ void PageBedShape::apply_custom_config(DynamicPrintConfig &config)
}
PageDiameters::PageDiameters(ConfigWizard *parent)
- : ConfigWizardPage(parent, _(L("Filament and Nozzle Diameters")), _(L("Print Diameters")), 1)
+ : ConfigWizardPage(parent, _L("Filament and Nozzle Diameters"), _L("Print Diameters"), 1)
, spin_nozzle(new wxSpinCtrlDouble(this, wxID_ANY))
, spin_filam(new wxSpinCtrlDouble(this, wxID_ANY))
{
@@ -978,11 +1361,11 @@ PageDiameters::PageDiameters(ConfigWizard *parent)
auto *default_filam = print_config_def.get("filament_diameter")->get_default_value<ConfigOptionFloats>();
spin_filam->SetValue(default_filam != nullptr && default_filam->size() > 0 ? default_filam->get_at(0) : 3.0);
- append_text(_(L("Enter the diameter of your printer's hot end nozzle.")));
+ append_text(_L("Enter the diameter of your printer's hot end nozzle."));
auto *sizer_nozzle = new wxFlexGridSizer(3, 5, 5);
- auto *text_nozzle = new wxStaticText(this, wxID_ANY, _(L("Nozzle Diameter:")));
- auto *unit_nozzle = new wxStaticText(this, wxID_ANY, _(L("mm")));
+ auto *text_nozzle = new wxStaticText(this, wxID_ANY, _L("Nozzle Diameter:"));
+ auto *unit_nozzle = new wxStaticText(this, wxID_ANY, _L("mm"));
sizer_nozzle->AddGrowableCol(0, 1);
sizer_nozzle->Add(text_nozzle, 0, wxALIGN_CENTRE_VERTICAL);
sizer_nozzle->Add(spin_nozzle);
@@ -991,12 +1374,12 @@ PageDiameters::PageDiameters(ConfigWizard *parent)
append_spacer(VERTICAL_SPACING);
- append_text(_(L("Enter the diameter of your filament.")));
- append_text(_(L("Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average.")));
+ append_text(_L("Enter the diameter of your filament."));
+ append_text(_L("Good precision is required, so use a caliper and do multiple measurements along the filament, then compute the average."));
auto *sizer_filam = new wxFlexGridSizer(3, 5, 5);
- auto *text_filam = new wxStaticText(this, wxID_ANY, _(L("Filament Diameter:")));
- auto *unit_filam = new wxStaticText(this, wxID_ANY, _(L("mm")));
+ auto *text_filam = new wxStaticText(this, wxID_ANY, _L("Filament Diameter:"));
+ auto *unit_filam = new wxStaticText(this, wxID_ANY, _L("mm"));
sizer_filam->AddGrowableCol(0, 1);
sizer_filam->Add(text_filam, 0, wxALIGN_CENTRE_VERTICAL);
sizer_filam->Add(spin_filam);
@@ -1029,7 +1412,7 @@ void PageDiameters::apply_custom_config(DynamicPrintConfig &config)
}
PageTemperatures::PageTemperatures(ConfigWizard *parent)
- : ConfigWizardPage(parent, _(L("Extruder and Bed Temperatures")), _(L("Temperatures")), 1)
+ : ConfigWizardPage(parent, _L("Nozzle and Bed Temperatures"), _L("Temperatures"), 1)
, spin_extr(new wxSpinCtrlDouble(this, wxID_ANY))
, spin_bed(new wxSpinCtrlDouble(this, wxID_ANY))
{
@@ -1045,12 +1428,12 @@ PageTemperatures::PageTemperatures(ConfigWizard *parent)
auto *default_bed = def_bed.get_default_value<ConfigOptionInts>();
spin_bed->SetValue(default_bed != nullptr && default_bed->size() > 0 ? default_bed->get_at(0) : 0);
- append_text(_(L("Enter the temperature needed for extruding your filament.")));
- append_text(_(L("A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS.")));
+ append_text(_L("Enter the temperature needed for extruding your filament."));
+ append_text(_L("A rule of thumb is 160 to 230 °C for PLA, and 215 to 250 °C for ABS."));
auto *sizer_extr = new wxFlexGridSizer(3, 5, 5);
- auto *text_extr = new wxStaticText(this, wxID_ANY, _(L("Extrusion Temperature:")));
- auto *unit_extr = new wxStaticText(this, wxID_ANY, _(L("°C")));
+ auto *text_extr = new wxStaticText(this, wxID_ANY, _L("Extrusion Temperature:"));
+ auto *unit_extr = new wxStaticText(this, wxID_ANY, _L("°C"));
sizer_extr->AddGrowableCol(0, 1);
sizer_extr->Add(text_extr, 0, wxALIGN_CENTRE_VERTICAL);
sizer_extr->Add(spin_extr);
@@ -1059,12 +1442,12 @@ PageTemperatures::PageTemperatures(ConfigWizard *parent)
append_spacer(VERTICAL_SPACING);
- append_text(_(L("Enter the bed temperature needed for getting your filament to stick to your heated bed.")));
- append_text(_(L("A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have no heated bed.")));
+ append_text(_L("Enter the bed temperature needed for getting your filament to stick to your heated bed."));
+ append_text(_L("A rule of thumb is 60 °C for PLA and 110 °C for ABS. Leave zero if you have no heated bed."));
auto *sizer_bed = new wxFlexGridSizer(3, 5, 5);
- auto *text_bed = new wxStaticText(this, wxID_ANY, _(L("Bed Temperature:")));
- auto *unit_bed = new wxStaticText(this, wxID_ANY, _(L("°C")));
+ auto *text_bed = new wxStaticText(this, wxID_ANY, _L("Bed Temperature:"));
+ auto *unit_bed = new wxStaticText(this, wxID_ANY, _L("°C"));
sizer_bed->AddGrowableCol(0, 1);
sizer_bed->Add(text_bed, 0, wxALIGN_CENTRE_VERTICAL);
sizer_bed->Add(spin_bed);
@@ -1305,16 +1688,23 @@ const std::string Materials::UNKNOWN = "(Unknown)";
void Materials::push(const Preset *preset)
{
- presets.push_back(preset);
+ presets.emplace_back(preset);
types.insert(technology & T_FFF
? Materials::get_filament_type(preset)
: Materials::get_material_type(preset));
}
+void Materials::add_printer(const Preset* preset)
+{
+ printers.insert(preset);
+}
+
void Materials::clear()
{
presets.clear();
types.clear();
+ printers.clear();
+ compatibility_counter.clear();
}
const std::string& Materials::appconfig_section() const
@@ -1364,7 +1754,6 @@ const std::string& Materials::get_material_vendor(const Preset *preset)
return opt != nullptr ? opt->value : UNKNOWN;
}
-
// priv
static const std::unordered_map<std::string, std::pair<std::string, std::string>> legacy_preset_map {{
@@ -1416,6 +1805,11 @@ void ConfigWizard::priv::load_pages()
index->add_page(page_update);
index->add_page(page_reload_from_disk);
+#if ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+#ifdef _WIN32
+ index->add_page(page_files_association);
+#endif // _WIN32
+#endif // ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
index->add_page(page_mode);
index->go_to(former_active); // Will restore the active item/page if possible
@@ -1512,7 +1906,7 @@ void ConfigWizard::priv::load_vendors()
void ConfigWizard::priv::add_page(ConfigWizardPage *page)
{
- const int proportion = (page->shortname == _(L("Filaments"))) || (page->shortname == _(L("SLA Materials"))) ? 1 : 0;
+ const int proportion = (page->shortname == _L("Filaments")) || (page->shortname == _L("SLA Materials")) ? 1 : 0;
hscroll_sizer->Add(page, proportion, wxEXPAND);
all_pages.push_back(page);
}
@@ -1566,12 +1960,12 @@ void ConfigWizard::priv::create_3rdparty_pages()
PagePrinters* pageSLA = nullptr;
if (is_fff_technology) {
- pageFFF = new PagePrinters(q, vendor->name + " " +_(L("FFF Technology Printers")), vendor->name+" FFF", *vendor, 1, T_FFF);
+ pageFFF = new PagePrinters(q, vendor->name + " " +_L("FFF Technology Printers"), vendor->name+" FFF", *vendor, 1, T_FFF);
add_page(pageFFF);
}
if (is_sla_technology) {
- pageSLA = new PagePrinters(q, vendor->name + " " + _(L("SLA Technology Printers")), vendor->name+" MSLA", *vendor, 1, T_SLA);
+ pageSLA = new PagePrinters(q, vendor->name + " " + _L("SLA Technology Printers"), vendor->name+" MSLA", *vendor, 1, T_SLA);
add_page(pageSLA);
}
@@ -1592,28 +1986,62 @@ void ConfigWizard::priv::update_materials(Technology technology)
if (any_fff_selected && (technology & T_FFF)) {
filaments.clear();
aliases_fff.clear();
-
// Iterate filaments in all bundles
for (const auto &pair : bundles) {
for (const auto &filament : pair.second.preset_bundle->filaments) {
// Check if filament is already added
- if (filaments.containts(&filament))
- continue;
+ if (filaments.containts(&filament))
+ continue;
// Iterate printers in all bundles
- // For now, we only allow the profiles to be compatible with another profiles inside the same bundle.
-// for (const auto &pair : bundles)
- for (const auto &printer : pair.second.preset_bundle->printers)
- // Filter out inapplicable printers
- if (printer.is_visible && printer.printer_technology() == ptFFF &&
- is_compatible_with_printer(PresetWithVendorProfile(filament, nullptr), PresetWithVendorProfile(printer, nullptr)) &&
- // Check if filament is already added
- ! filaments.containts(&filament)) {
- filaments.push(&filament);
- if (!filament.alias.empty())
- aliases_fff[filament.alias].insert(filament.name);
- }
+ for (const auto &printer : pair.second.preset_bundle->printers) {
+ if (!printer.is_visible || printer.printer_technology() != ptFFF)
+ continue;
+ // Filter out inapplicable printers
+ if (is_compatible_with_printer(PresetWithVendorProfile(filament, filament.vendor), PresetWithVendorProfile(printer, printer.vendor))) {
+ if (!filaments.containts(&filament)) {
+ filaments.push(&filament);
+ if (!filament.alias.empty())
+ aliases_fff[filament.alias].insert(filament.name);
+ }
+ filaments.add_printer(&printer);
+ }
+ }
+
}
}
+ // count compatible printers
+ for (const auto& preset : filaments.presets) {
+
+ const auto filter = [preset](const std::pair<std::string, size_t> element) {
+ return preset->alias == element.first;
+ };
+ if (std::find_if(filaments.compatibility_counter.begin(), filaments.compatibility_counter.end(), filter) != filaments.compatibility_counter.end()) {
+ continue;
+ }
+ std::vector<size_t> idx_with_same_alias;
+ for (size_t i = 0; i < filaments.presets.size(); ++i) {
+ if (preset->alias == filaments.presets[i]->alias)
+ idx_with_same_alias.push_back(i);
+ }
+ size_t counter = 0;
+ for (const auto& printer : filaments.printers) {
+ if (!(*printer).is_visible || (*printer).printer_technology() != ptFFF)
+ continue;
+ bool compatible = false;
+ // Test otrher materials with same alias
+ for (size_t i = 0; i < idx_with_same_alias.size() && !compatible; ++i) {
+ const Preset& prst = *(filaments.presets[idx_with_same_alias[i]]);
+ const Preset& prntr = *printer;
+ if (is_compatible_with_printer(PresetWithVendorProfile(prst, prst.vendor), PresetWithVendorProfile(prntr, prntr.vendor))) {
+ compatible = true;
+ break;
+ }
+ }
+ if (compatible)
+ counter++;
+ }
+ filaments.compatibility_counter.emplace_back(preset->alias, counter);
+ }
}
if (any_sla_selected && (technology & T_SLA)) {
@@ -1628,18 +2056,54 @@ void ConfigWizard::priv::update_materials(Technology technology)
continue;
// Iterate printers in all bundles
// For now, we only allow the profiles to be compatible with another profiles inside the same bundle.
-// for (const auto &pair : bundles)
- for (const auto &printer : pair.second.preset_bundle->printers)
- // Filter out inapplicable printers
- if (printer.is_visible && printer.printer_technology() == ptSLA &&
- is_compatible_with_printer(PresetWithVendorProfile(material, nullptr), PresetWithVendorProfile(printer, nullptr)) &&
- // Check if material is already added
- ! sla_materials.containts(&material)) {
+ for (const auto& printer : pair.second.preset_bundle->printers) {
+ if(!printer.is_visible || printer.printer_technology() != ptSLA)
+ continue;
+ // Filter out inapplicable printers
+ if (is_compatible_with_printer(PresetWithVendorProfile(material, nullptr), PresetWithVendorProfile(printer, nullptr))) {
+ // Check if material is already added
+ if(!sla_materials.containts(&material)) {
sla_materials.push(&material);
if (!material.alias.empty())
aliases_sla[material.alias].insert(material.name);
}
+ sla_materials.add_printer(&printer);
+ }
+ }
+ }
+ }
+ // count compatible printers
+ for (const auto& preset : sla_materials.presets) {
+
+ const auto filter = [preset](const std::pair<std::string, size_t> element) {
+ return preset->alias == element.first;
+ };
+ if (std::find_if(sla_materials.compatibility_counter.begin(), sla_materials.compatibility_counter.end(), filter) != sla_materials.compatibility_counter.end()) {
+ continue;
+ }
+ std::vector<size_t> idx_with_same_alias;
+ for (size_t i = 0; i < sla_materials.presets.size(); ++i) {
+ if(preset->alias == sla_materials.presets[i]->alias)
+ idx_with_same_alias.push_back(i);
+ }
+ size_t counter = 0;
+ for (const auto& printer : sla_materials.printers) {
+ if (!(*printer).is_visible || (*printer).printer_technology() != ptSLA)
+ continue;
+ bool compatible = false;
+ // Test otrher materials with same alias
+ for (size_t i = 0; i < idx_with_same_alias.size() && !compatible; ++i) {
+ const Preset& prst = *(sla_materials.presets[idx_with_same_alias[i]]);
+ const Preset& prntr = *printer;
+ if (is_compatible_with_printer(PresetWithVendorProfile(prst, prst.vendor), PresetWithVendorProfile(prntr, prntr.vendor))) {
+ compatible = true;
+ break;
+ }
+ }
+ if (compatible)
+ counter++;
}
+ sla_materials.compatibility_counter.emplace_back(preset->alias, counter);
}
}
}
@@ -1755,7 +2219,7 @@ bool ConfigWizard::priv::on_bnt_finish()
page_sla_materials->reload_presets();
// theres no need to check that filament is selected if we have only custom printer
- if (custom_printer_selected && !any_fff_selected && !any_sla_selected) return true;
+ if (custom_printer_selected && !any_fff_selected && !any_sla_selected) return true;
// check, that there is selected at least one filament/material
return check_and_install_missing_materials(T_ANY);
}
@@ -1807,7 +2271,7 @@ bool ConfigWizard::priv::check_and_install_missing_materials(Technology technolo
const auto ask_and_select_default_materials = [this](const wxString &message, const std::set<const VendorProfile::PrinterModel*> &printer_models, Technology technology)
{
- wxMessageDialog msg(q, message, _(L("Notice")), wxYES_NO);
+ wxMessageDialog msg(q, message, _L("Notice"), wxYES_NO);
if (msg.ShowModal() == wxID_YES)
select_default_materials_for_printer_models(technology, printer_models);
};
@@ -1815,8 +2279,9 @@ bool ConfigWizard::priv::check_and_install_missing_materials(Technology technolo
const auto printer_model_list = [](const std::set<const VendorProfile::PrinterModel*> &printer_models) -> wxString {
wxString out;
for (const VendorProfile::PrinterModel *printer_model : printer_models) {
+ wxString name = from_u8(printer_model->name);
out += "\t\t";
- out += from_u8(printer_model->name);
+ out += name;
out += "\n";
}
return out;
@@ -1938,6 +2403,26 @@ void ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese
app_config->set("preset_update", page_update->preset_update ? "1" : "0");
app_config->set("export_sources_full_pathnames", page_reload_from_disk->full_pathnames ? "1" : "0");
+#if ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+#ifdef _WIN32
+ app_config->set("associate_3mf", page_files_association->associate_3mf() ? "1" : "0");
+ app_config->set("associate_stl", page_files_association->associate_stl() ? "1" : "0");
+// app_config->set("associate_gcode", page_files_association->associate_gcode() ? "1" : "0");
+
+ if (wxGetApp().is_editor()) {
+ if (page_files_association->associate_3mf())
+ wxGetApp().associate_3mf_files();
+ if (page_files_association->associate_stl())
+ wxGetApp().associate_stl_files();
+ }
+// else {
+// if (page_files_association->associate_gcode())
+// wxGetApp().associate_gcode_files();
+// }
+
+#endif // _WIN32
+#endif // ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+
page_mode->serialize_mode(app_config);
std::string preferred_model;
@@ -1982,7 +2467,7 @@ void ConfigWizard::priv::apply_config(AppConfig *app_config, PresetBundle *prese
page_temps->apply_custom_config(*custom_config);
const std::string profile_name = page_custom->profile_name();
- preset_bundle->load_config(profile_name, *custom_config);
+ preset_bundle->load_config_from_wizard(profile_name, *custom_config);
}
// Update the selections from the compatibilty.
@@ -2057,13 +2542,13 @@ ConfigWizard::ConfigWizard(wxWindow *parent)
topsizer->AddSpacer(INDEX_MARGIN);
topsizer->Add(p->hscroll, 1, wxEXPAND);
- p->btn_sel_all = new wxButton(this, wxID_ANY, _(L("Select all standard printers")));
+ p->btn_sel_all = new wxButton(this, wxID_ANY, _L("Select all standard printers"));
p->btnsizer->Add(p->btn_sel_all);
- p->btn_prev = new wxButton(this, wxID_ANY, _(L("< &Back")));
- p->btn_next = new wxButton(this, wxID_ANY, _(L("&Next >")));
- p->btn_finish = new wxButton(this, wxID_APPLY, _(L("&Finish")));
- p->btn_cancel = new wxButton(this, wxID_CANCEL, _(L("Cancel"))); // Note: The label needs to be present, otherwise we get accelerator bugs on Mac
+ p->btn_prev = new wxButton(this, wxID_ANY, _L("< &Back"));
+ p->btn_next = new wxButton(this, wxID_ANY, _L("&Next >"));
+ p->btn_finish = new wxButton(this, wxID_APPLY, _L("&Finish"));
+ p->btn_cancel = new wxButton(this, wxID_CANCEL, _L("Cancel")); // Note: The label needs to be present, otherwise we get accelerator bugs on Mac
p->btnsizer->AddStretchSpacer();
p->btnsizer->Add(p->btn_prev, 0, wxLEFT, BTN_SPACING);
p->btnsizer->Add(p->btn_next, 0, wxLEFT, BTN_SPACING);
@@ -2076,10 +2561,10 @@ ConfigWizard::ConfigWizard(wxWindow *parent)
p->add_page(p->page_welcome = new PageWelcome(this));
- p->page_fff = new PagePrinters(this, _(L("Prusa FFF Technology Printers")), "Prusa FFF", *vendor_prusa, 0, T_FFF);
+ p->page_fff = new PagePrinters(this, _L("Prusa FFF Technology Printers"), "Prusa FFF", *vendor_prusa, 0, T_FFF);
p->add_page(p->page_fff);
- p->page_msla = new PagePrinters(this, _(L("Prusa MSLA Technology Printers")), "Prusa MSLA", *vendor_prusa, 0, T_SLA);
+ p->page_msla = new PagePrinters(this, _L("Prusa MSLA Technology Printers"), "Prusa MSLA", *vendor_prusa, 0, T_SLA);
p->add_page(p->page_msla);
// Pages for 3rd party vendors
@@ -2094,13 +2579,18 @@ ConfigWizard::ConfigWizard(wxWindow *parent)
p->update_materials(T_ANY);
p->add_page(p->page_filaments = new PageMaterials(this, &p->filaments,
- _(L("Filament Profiles Selection")), _(L("Filaments")), _(L("Type:")) ));
+ _L("Filament Profiles Selection"), _L("Filaments"), _L("Type:") ));
p->add_page(p->page_sla_materials = new PageMaterials(this, &p->sla_materials,
- _(L("SLA Material Profiles Selection")) + " ", _(L("SLA Materials")), _(L("Layer height:")) ));
+ _L("SLA Material Profiles Selection") + " ", _L("SLA Materials"), _L("Type:") ));
p->add_page(p->page_update = new PageUpdate(this));
p->add_page(p->page_reload_from_disk = new PageReloadFromDisk(this));
+#if ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+#ifdef _WIN32
+ p->add_page(p->page_files_association = new PageFilesAssociation(this));
+#endif // _WIN32
+#endif // ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
p->add_page(p->page_mode = new PageMode(this));
p->add_page(p->page_firmware = new PageFirmware(this));
p->add_page(p->page_bed = new PageBedShape(this));
@@ -2161,6 +2651,20 @@ ConfigWizard::ConfigWizard(wxWindow *parent)
Layout();
});
+
+ if (wxLinux_gtk3)
+ this->Bind(wxEVT_SHOW, [this, vsizer](const wxShowEvent& e) {
+ ConfigWizardPage* active_page = p->index->active_page();
+ if (!active_page)
+ return;
+ for (auto page : p->all_pages)
+ if (page != active_page)
+ page->Hide();
+ // update best size for the dialog after hiding of the non-active pages
+ vsizer->SetSizeHints(this);
+ // set initial dialog size
+ p->init_dialog_size();
+ });
}
ConfigWizard::~ConfigWizard() {}
@@ -2178,6 +2682,7 @@ bool ConfigWizard::run(RunReason reason, StartPage start_page)
p->apply_config(app.app_config, app.preset_bundle, app.preset_updater);
app.app_config->set_legacy_datadir(false);
app.update_mode();
+ app.obj_manipul()->update_ui_from_settings();
BOOST_LOG_TRIVIAL(info) << "ConfigWizard applied";
return true;
} else {
diff --git a/src/slic3r/GUI/ConfigWizard_private.hpp b/src/slic3r/GUI/ConfigWizard_private.hpp
index 49993bfb1..62ec6b18b 100644
--- a/src/slic3r/GUI/ConfigWizard_private.hpp
+++ b/src/slic3r/GUI/ConfigWizard_private.hpp
@@ -8,6 +8,7 @@
#include <unordered_map>
#include <functional>
#include <boost/filesystem.hpp>
+#include <boost/log/trivial.hpp>
#include <wx/sizer.h>
#include <wx/panel.h>
@@ -18,12 +19,15 @@
#include <wx/listbox.h>
#include <wx/checklst.h>
#include <wx/radiobut.h>
+#include <wx/html/htmlwin.h>
#include "libslic3r/PrintConfig.hpp"
+#include "libslic3r/PresetBundle.hpp"
#include "slic3r/Utils/PresetUpdater.hpp"
-#include "AppConfig.hpp"
-#include "PresetBundle.hpp"
#include "BedShapeDialog.hpp"
+#include "GUI.hpp"
+#include "wxExtensions.hpp"
+
namespace fs = boost::filesystem;
@@ -55,32 +59,91 @@ enum Technology {
T_ANY = ~0,
};
+struct Bundle
+{
+ std::unique_ptr<PresetBundle> preset_bundle;
+ VendorProfile* vendor_profile{ nullptr };
+ bool is_in_resources{ false };
+ bool is_prusa_bundle{ false };
+
+ Bundle() = default;
+ Bundle(Bundle&& other);
+
+ // Returns false if not loaded. Reason for that is logged as boost::log error.
+ bool load(fs::path source_path, bool is_in_resources, bool is_prusa_bundle = false);
+
+ const std::string& vendor_id() const { return vendor_profile->id; }
+};
+
+struct BundleMap : std::unordered_map<std::string /* = vendor ID */, Bundle>
+{
+ static BundleMap load();
+
+ Bundle& prusa_bundle();
+ const Bundle& prusa_bundle() const;
+};
+
struct Materials
{
Technology technology;
// use vector for the presets to purpose of save of presets sorting in the bundle
std::vector<const Preset*> presets;
+ // String is alias of material, size_t number of compatible counters
+ std::vector<std::pair<std::string, size_t>> compatibility_counter;
std::set<std::string> types;
+ std::set<const Preset*> printers;
Materials(Technology technology) : technology(technology) {}
void push(const Preset *preset);
+ void add_printer(const Preset* preset);
void clear();
bool containts(const Preset *preset) const {
- return std::find(presets.begin(), presets.end(), preset) != presets.end();
+ //return std::find(presets.begin(), presets.end(), preset) != presets.end();
+ return std::find_if(presets.begin(), presets.end(),
+ [preset](const Preset* element) { return element == preset; }) != presets.end();
+
+ }
+
+ bool get_omnipresent(const Preset* preset) {
+ return get_printer_counter(preset) == printers.size();
+ }
+
+ const std::vector<const Preset*> get_presets_by_alias(const std::string name) {
+ std::vector<const Preset*> ret_vec;
+ for (auto it = presets.begin(); it != presets.end(); ++it) {
+ if ((*it)->alias == name)
+ ret_vec.push_back((*it));
+ }
+ return ret_vec;
}
+
+
+ size_t get_printer_counter(const Preset* preset) {
+ for (auto it : compatibility_counter) {
+ if (it.first == preset->alias)
+ return it.second;
+ }
+ return 0;
+ }
+
const std::string& appconfig_section() const;
const std::string& get_type(const Preset *preset) const;
const std::string& get_vendor(const Preset *preset) const;
-
- template<class F> void filter_presets(const std::string &type, const std::string &vendor, F cb) {
- for (const Preset *preset : presets) {
- if ((type.empty() || get_type(preset) == type) && (vendor.empty() || get_vendor(preset) == vendor)) {
- cb(preset);
- }
- }
- }
+
+ template<class F> void filter_presets(const Preset* printer, const std::string& type, const std::string& vendor, F cb) {
+ for (auto preset : presets) {
+ const Preset& prst = *(preset);
+ const Preset& prntr = *printer;
+ if ((printer == nullptr || is_compatible_with_printer(PresetWithVendorProfile(prst, prst.vendor), PresetWithVendorProfile(prntr, prntr.vendor))) &&
+ (type.empty() || get_type(preset) == type) &&
+ (vendor.empty() || get_vendor(preset) == vendor)) {
+
+ cb(preset);
+ }
+ }
+ }
static const std::string UNKNOWN;
static const std::string& get_filament_type(const Preset *preset);
@@ -89,33 +152,9 @@ struct Materials
static const std::string& get_material_vendor(const Preset *preset);
};
-struct Bundle
-{
- std::unique_ptr<PresetBundle> preset_bundle;
- VendorProfile *vendor_profile { nullptr };
- bool is_in_resources { false };
- bool is_prusa_bundle { false };
-
- Bundle() = default;
- Bundle(Bundle &&other);
-
- // Returns false if not loaded. Reason for that is logged as boost::log error.
- bool load(fs::path source_path, bool is_in_resources, bool is_prusa_bundle = false);
-
- const std::string& vendor_id() const { return vendor_profile->id; }
-};
-
-struct BundleMap: std::unordered_map<std::string /* = vendor ID */, Bundle>
-{
- static BundleMap load();
-
- Bundle& prusa_bundle();
- const Bundle& prusa_bundle() const;
-};
struct PrinterPickerEvent;
-
// GUI elements
typedef std::function<bool(const VendorProfile::PrinterModel&)> ModelFilter;
@@ -223,6 +262,7 @@ struct PagePrinters: ConfigWizardPage
template<class T, class D> struct DataList : public T
{
DataList(wxWindow *parent) : T(parent, wxID_ANY) {}
+ DataList(wxWindow* parent, int style) : T(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0, NULL, style) {}
// Note: We're _not_ using wxLB_SORT here because it doesn't do the right thing,
// eg. "ABS" is sorted before "(All)"
@@ -250,29 +290,74 @@ template<class T, class D> struct DataList : public T
}
int size() { return this->GetCount(); }
+
+ void on_mouse_move(const wxPoint& position) {
+ int item = T::HitTest(position);
+
+ if(item == wxHitTest::wxHT_WINDOW_INSIDE)
+ BOOST_LOG_TRIVIAL(error) << "hit test wxHT_WINDOW_INSIDE";
+ else if (item == wxHitTest::wxHT_WINDOW_OUTSIDE)
+ BOOST_LOG_TRIVIAL(error) << "hit test wxHT_WINDOW_OUTSIDE";
+ else if(item == wxHitTest::wxHT_WINDOW_CORNER)
+ BOOST_LOG_TRIVIAL(error) << "hit test wxHT_WINDOW_CORNER";
+ else if (item == wxHitTest::wxHT_WINDOW_VERT_SCROLLBAR)
+ BOOST_LOG_TRIVIAL(error) << "hit test wxHT_WINDOW_VERT_SCROLLBAR";
+ else if (item == wxHitTest::wxHT_NOWHERE)
+ BOOST_LOG_TRIVIAL(error) << "hit test wxHT_NOWHERE";
+ else if (item == wxHitTest::wxHT_MAX)
+ BOOST_LOG_TRIVIAL(error) << "hit test wxHT_MAX";
+ else
+ BOOST_LOG_TRIVIAL(error) << "hit test: " << item;
+ }
};
typedef DataList<wxListBox, std::string> StringList;
typedef DataList<wxCheckListBox, std::string> PresetList;
+struct ProfilePrintData
+{
+ std::reference_wrapper<const std::string> name;
+ bool omnipresent;
+ bool checked;
+ ProfilePrintData(const std::string& n, bool o, bool c) : name(n), omnipresent(o), checked(c) {}
+};
+
struct PageMaterials: ConfigWizardPage
{
Materials *materials;
- StringList *list_l1, *list_l2;
- PresetList *list_l3;
- int sel1_prev, sel2_prev;
+ StringList *list_printer, *list_type, *list_vendor;
+ PresetList *list_profile;
+ int sel_printer_count_prev, sel_printer_item_prev, sel_type_prev, sel_vendor_prev;
bool presets_loaded;
+ wxFlexGridSizer *grid;
+ wxHtmlWindow* html_window;
+
+ int compatible_printers_width = { 100 };
+ std::string empty_printers_label;
+ bool first_paint = { false };
static const std::string EMPTY;
+ int last_hovered_item = { -1 } ;
PageMaterials(ConfigWizard *parent, Materials *materials, wxString title, wxString shortname, wxString list1name);
void reload_presets();
- void update_lists(int sel1, int sel2);
+ void update_lists(int sel1, int sel2, int sel3);
+ void on_material_highlighted(int sel_material);
+ void on_material_hovered(int sel_material);
void select_material(int i);
void select_all(bool select);
void clear();
+ void set_compatible_printers_html_window(const std::vector<std::string>& printer_names, bool all_printers = false);
+ void clear_compatible_printers_label();
+
+ void sort_list_data(StringList* list, bool add_All_item, bool material_type_ordering);
+ void sort_list_data(PresetList* list, const std::vector<ProfilePrintData>& data);
+ void on_paint();
+ void on_mouse_move_on_profiles(wxMouseEvent& evt);
+ void on_mouse_enter_profiles(wxMouseEvent& evt);
+ void on_mouse_leave_profiles(wxMouseEvent& evt);
virtual void on_activate() override;
};
@@ -307,12 +392,33 @@ struct PageReloadFromDisk : ConfigWizardPage
PageReloadFromDisk(ConfigWizard* parent);
};
+#if ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+#ifdef _WIN32
+struct PageFilesAssociation : ConfigWizardPage
+{
+private:
+ wxCheckBox* cb_3mf{ nullptr };
+ wxCheckBox* cb_stl{ nullptr };
+// wxCheckBox* cb_gcode;
+
+public:
+ PageFilesAssociation(ConfigWizard* parent);
+
+ bool associate_3mf() const { return cb_3mf->IsChecked(); }
+ bool associate_stl() const { return cb_stl->IsChecked(); }
+// bool associate_gcode() const { return cb_gcode->IsChecked(); }
+};
+#endif // _WIN32
+#endif // ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+
struct PageMode: ConfigWizardPage
{
wxRadioButton *radio_simple;
wxRadioButton *radio_advanced;
wxRadioButton *radio_expert;
+ wxCheckBox *check_inch;
+
PageMode(ConfigWizard *parent);
void serialize_mode(AppConfig *app_config) const;
@@ -463,6 +569,11 @@ struct ConfigWizard::priv
PageCustom *page_custom = nullptr;
PageUpdate *page_update = nullptr;
PageReloadFromDisk *page_reload_from_disk = nullptr;
+#if ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+#ifdef _WIN32
+ PageFilesAssociation* page_files_association = nullptr;
+#endif // _WIN32
+#endif // ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
PageMode *page_mode = nullptr;
PageVendors *page_vendors = nullptr;
Pages3rdparty pages_3rdparty;
@@ -478,6 +589,7 @@ struct ConfigWizard::priv
priv(ConfigWizard *q)
: q(q)
+ , appconfig_new(AppConfig::EAppMode::Editor)
, filaments(T_FFF)
, sla_materials(T_SLA)
{}
diff --git a/src/slic3r/GUI/DoubleSlider.cpp b/src/slic3r/GUI/DoubleSlider.cpp
index 7318153ef..8a2257274 100644
--- a/src/slic3r/GUI/DoubleSlider.cpp
+++ b/src/slic3r/GUI/DoubleSlider.cpp
@@ -1,10 +1,14 @@
-#include "wxExtensions.hpp"
-#include "libslic3r/GCode/PreviewData.hpp"
+#include "libslic3r/libslic3r.h"
+#include "DoubleSlider.hpp"
+#include "libslic3r/GCode.hpp"
#include "GUI.hpp"
#include "GUI_App.hpp"
+#include "Plater.hpp"
#include "I18N.hpp"
#include "ExtruderSequenceDialog.hpp"
#include "libslic3r/Print.hpp"
+#include "libslic3r/AppConfig.hpp"
+#include "GUI_Utils.hpp"
#include <wx/button.h>
#include <wx/dialog.h>
@@ -14,22 +18,35 @@
#include <wx/bmpcbox.h>
#include <wx/statline.h>
#include <wx/dcclient.h>
-#include <wx/numformatter.h>
#include <wx/colordlg.h>
#include <cmath>
#include <boost/algorithm/string/replace.hpp>
#include "Field.hpp"
+#include "format.hpp"
+#include "NotificationManager.hpp"
namespace Slic3r {
using GUI::from_u8;
using GUI::into_u8;
+using GUI::format_wxstr;
namespace DoubleSlider {
wxDEFINE_EVENT(wxCUSTOMEVT_TICKSCHANGED, wxEvent);
+static std::string gcode(Type type)
+{
+ const PrintConfig& config = GUI::wxGetApp().plater()->fff_print().config();
+ switch (type) {
+ case ColorChange: return config.color_change_gcode;
+ case PausePrint: return config.pause_print_gcode;
+ case Template: return config.template_custom_gcode;
+ default: return "";
+ }
+}
+
Control::Control( wxWindow *parent,
wxWindowID id,
int lowerValue,
@@ -46,7 +63,8 @@ Control::Control( wxWindow *parent,
m_higher_value (higherValue),
m_min_value(minValue),
m_max_value(maxValue),
- m_style(style == wxSL_HORIZONTAL || style == wxSL_VERTICAL ? style: wxSL_HORIZONTAL)
+ m_style(style == wxSL_HORIZONTAL || style == wxSL_VERTICAL ? style: wxSL_HORIZONTAL),
+ m_extra_style(style == wxSL_VERTICAL ? wxSL_AUTOTICKS | wxSL_VALUE_LABEL : 0)
{
#ifdef __WXOSX__
is_osx = true;
@@ -54,8 +72,8 @@ Control::Control( wxWindow *parent,
if (!is_osx)
SetDoubleBuffered(true);// SetDoubleBuffered exists on Win and Linux/GTK, but is missing on OSX
- m_bmp_thumb_higher = (style == wxSL_HORIZONTAL ? ScalableBitmap(this, "right_half_circle.png") : ScalableBitmap(this, "thumb_up"));
- m_bmp_thumb_lower = (style == wxSL_HORIZONTAL ? ScalableBitmap(this, "left_half_circle.png" ) : ScalableBitmap(this, "thumb_down"));
+ m_bmp_thumb_higher = (style == wxSL_HORIZONTAL ? ScalableBitmap(this, "thumb_right") : ScalableBitmap(this, "thumb_up"));
+ m_bmp_thumb_lower = (style == wxSL_HORIZONTAL ? ScalableBitmap(this, "thumb_left") : ScalableBitmap(this, "thumb_down"));
m_thumb_size = m_bmp_thumb_lower.GetBmpSize();
m_bmp_add_tick_on = ScalableBitmap(this, "colorchange_add");
@@ -107,14 +125,13 @@ Control::Control( wxWindow *parent,
m_line_pens = { &DARK_GREY_PEN, &GREY_PEN, &LIGHT_GREY_PEN };
m_segm_pens = { &DARK_ORANGE_PEN, &ORANGE_PEN, &LIGHT_ORANGE_PEN };
- const wxFont& font = GetFont();
- m_font = is_osx ? font.Smaller().Smaller() : font.Smaller();
+ m_font = GetFont();
+ this->SetMinSize(get_min_size());
}
void Control::msw_rescale()
{
- const wxFont& font = GUI::wxGetApp().normal_font();
- m_font = is_osx ? font.Smaller().Smaller() : font.Smaller();
+ m_font = GUI::wxGetApp().normal_font();
m_bmp_thumb_higher.msw_rescale();
m_bmp_thumb_lower .msw_rescale();
@@ -152,8 +169,7 @@ int Control::GetActiveValue() const
wxSize Control::get_min_size() const
{
- const int min_side = GUI::wxGetApp().em_unit() * ( is_horizontal() ? (is_osx ? 8 : 6) : 10 );
-
+ const int min_side = GUI::wxGetApp().em_unit() * ( is_horizontal() ? 5 : 11 );
return wxSize(min_side, min_side);
}
@@ -213,6 +229,12 @@ void Control::SetMaxValue(const int max_value)
Update();
}
+void Control::SetSliderValues(const std::vector<double>& values)
+{
+ m_values = values;
+ m_ruler.count = std::count(m_values.begin(), m_values.end(), m_values.front());
+}
+
void Control::draw_scroll_line(wxDC& dc, const int lower_pos, const int higher_pos)
{
int width;
@@ -229,8 +251,7 @@ void Control::draw_scroll_line(wxDC& dc, const int lower_pos, const int higher_p
wxCoord segm_end_x = is_horizontal() ? higher_pos : width*0.5 - 1;
wxCoord segm_end_y = is_horizontal() ? height*0.5 - 1 : higher_pos-1;
- for (size_t id = 0; id < m_line_pens.size(); id++)
- {
+ for (size_t id = 0; id < m_line_pens.size(); id++) {
dc.SetPen(*m_line_pens[id]);
dc.DrawLine(line_beg_x, line_beg_y, line_end_x, line_end_y);
dc.SetPen(*m_segm_pens[id]);
@@ -257,16 +278,18 @@ wxCoord Control::get_position_from_value(const int value)
return wxCoord(SLIDER_MARGIN + int(val*step + 0.5));
}
-wxSize Control::get_size()
+wxSize Control::get_size() const
{
int w, h;
get_size(&w, &h);
return wxSize(w, h);
}
-void Control::get_size(int *w, int *h)
+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;
}
@@ -281,18 +304,17 @@ double Control::get_double_value(const SelectedSlider& selection)
return m_values[selection == ssLower ? m_lower_value : m_higher_value];
}
-using t_custom_code = CustomGCode::Item;
-CustomGCode::Info Control::GetTicksValues() const
+Info Control::GetTicksValues() const
{
- CustomGCode::Info custom_gcode_per_print_z;
- std::vector<t_custom_code>& values = custom_gcode_per_print_z.gcodes;
+ Info custom_gcode_per_print_z;
+ std::vector<CustomGCode::Item>& values = custom_gcode_per_print_z.gcodes;
const int val_size = m_values.size();
if (!m_values.empty())
for (const TickCode& tick : m_ticks.ticks) {
if (tick.tick > val_size)
break;
- values.emplace_back(t_custom_code{m_values[tick.tick], tick.gcode, tick.extruder, tick.color});
+ values.emplace_back(CustomGCode::Item{ m_values[tick.tick], tick.type, tick.extruder, tick.color, tick.extra });
}
if (m_force_mode_apply)
@@ -301,10 +323,9 @@ CustomGCode::Info Control::GetTicksValues() const
return custom_gcode_per_print_z;
}
-void Control::SetTicksValues(const CustomGCode::Info& custom_gcode_per_print_z)
+void Control::SetTicksValues(const Info& custom_gcode_per_print_z)
{
- if (m_values.empty())
- {
+ if (m_values.empty()) {
m_ticks.mode = m_mode;
return;
}
@@ -312,14 +333,14 @@ void Control::SetTicksValues(const CustomGCode::Info& custom_gcode_per_print_z)
const bool was_empty = m_ticks.empty();
m_ticks.ticks.clear();
- const std::vector<t_custom_code>& heights = custom_gcode_per_print_z.gcodes;
+ const std::vector<CustomGCode::Item>& heights = custom_gcode_per_print_z.gcodes;
for (auto h : heights) {
auto it = std::lower_bound(m_values.begin(), m_values.end(), h.print_z - epsilon());
if (it == m_values.end())
continue;
- m_ticks.ticks.emplace(TickCode{int(it-m_values.begin()), h.gcode, h.extruder, h.color});
+ m_ticks.ticks.emplace(TickCode{int(it-m_values.begin()), h.type, h.extruder, h.color, h.extra});
}
if (!was_empty && m_ticks.empty())
@@ -333,6 +354,24 @@ void Control::SetTicksValues(const CustomGCode::Info& custom_gcode_per_print_z)
Update();
}
+void Control::SetLayersTimes(const std::vector<float>& layers_times)
+{
+ m_layers_times.clear();
+ if (layers_times.empty())
+ return;
+ m_layers_times.resize(layers_times.size(), 0.0);
+ m_layers_times[0] = layers_times[0];
+ for (size_t i = 1; i < layers_times.size(); i++)
+ m_layers_times[i] = m_layers_times[i - 1] + layers_times[i];
+}
+
+void Control::SetLayersTimes(const std::vector<double>& layers_times)
+{
+ m_layers_times = layers_times;
+ for (size_t i = 1; i < m_layers_times.size(); i++)
+ m_layers_times[i] += m_layers_times[i - 1];
+}
+
void Control::SetDrawMode(bool is_sla_print, bool is_sequential_print)
{
m_draw_mode = is_sla_print ? dmSlaPrint :
@@ -342,14 +381,14 @@ void Control::SetDrawMode(bool is_sla_print, bool is_sequential_print)
void Control::SetModeAndOnlyExtruder(const bool is_one_extruder_printed_model, const int only_extruder)
{
- m_mode = !is_one_extruder_printed_model ? t_mode::MultiExtruder :
- only_extruder < 0 ? t_mode::SingleExtruder :
- t_mode::MultiAsSingle;
+ m_mode = !is_one_extruder_printed_model ? MultiExtruder :
+ only_extruder < 0 ? SingleExtruder :
+ MultiAsSingle;
if (!m_ticks.mode)
m_ticks.mode = m_mode;
m_only_extruder = only_extruder;
- UseDefaultColors(m_mode == t_mode::SingleExtruder);
+ UseDefaultColors(m_mode == SingleExtruder);
}
void Control::SetExtruderColors( const std::vector<std::string>& extruder_colors)
@@ -384,7 +423,11 @@ void Control::draw_focus_rect()
void Control::render()
{
+#ifdef _WIN32
+ SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
+#else
SetBackgroundColour(GetParent()->GetBackgroundColour());
+#endif // _WIN32
draw_focus_rect();
wxPaintDC dc(this);
@@ -397,32 +440,40 @@ void Control::render()
// and only in a case of no-empty m_values
draw_colored_band(dc);
- // draw line
- draw_scroll_line(dc, lower_pos, higher_pos);
+ if (m_extra_style & wxSL_AUTOTICKS)
+ draw_ruler(dc);
+
+ if (!m_render_as_disabled) {
+ // draw line
+ draw_scroll_line(dc, lower_pos, higher_pos);
- //draw color print ticks
- draw_ticks(dc);
+ // draw color print ticks
+ draw_ticks(dc);
- // draw both sliders
- draw_thumbs(dc, lower_pos, higher_pos);
+ // draw both sliders
+ draw_thumbs(dc, lower_pos, higher_pos);
- //draw lock/unlock
- draw_one_layer_icon(dc);
+ // draw lock/unlock
+ draw_one_layer_icon(dc);
- //draw revert bitmap (if it's shown)
- draw_revert_icon(dc);
+ // draw revert bitmap (if it's shown)
+ draw_revert_icon(dc);
- //draw cog bitmap (if it's shown)
- draw_cog_icon(dc);
+ // draw cog bitmap (if it's shown)
+ draw_cog_icon(dc);
- //draw mouse position
- draw_tick_on_mouse_position(dc);
+ // draw mouse position
+ draw_tick_on_mouse_position(dc);
+ }
}
void Control::draw_action_icon(wxDC& dc, const wxPoint pt_beg, const wxPoint pt_end)
{
const int tick = m_selection == ssLower ? m_lower_value : m_higher_value;
+ if (!m_enable_action_icon)
+ return;
+
// suppress add tick on first layer
if (tick == 0)
return;
@@ -507,7 +558,7 @@ void Control::draw_tick_on_mouse_position(wxDC& dc)
}
tick = get_value_from_position(m_moving_pos);
- if (tick >= m_max_value || tick <= m_min_value || tick == m_higher_value || tick == m_lower_value)
+ if (tick > m_max_value || tick < m_min_value || tick == m_higher_value || tick == m_lower_value)
return;
wxCoord new_pos = get_position_from_value(tick);
@@ -516,9 +567,57 @@ void Control::draw_tick_on_mouse_position(wxDC& dc)
//draw info line
dc.SetPen(LIGHT_GREY_PEN);
draw_ticks(dc, pos);
+
+ if (m_extra_style & wxSL_VALUE_LABEL) {
+ wxColour old_clr = dc.GetTextForeground();
+ dc.SetTextForeground(GREY_PEN.GetColour());
+ draw_tick_text(dc, pos, tick, ltEstimatedTime, false);
+ dc.SetTextForeground(old_clr);
+ }
+}
+
+static std::string short_and_splitted_time(const std::string& time)
+{
+ // Parse the dhms time format.
+ int days = 0;
+ int hours = 0;
+ int minutes = 0;
+ int seconds = 0;
+ if (time.find('d') != std::string::npos)
+ ::sscanf(time.c_str(), "%dd %dh %dm %ds", &days, &hours, &minutes, &seconds);
+ else if (time.find('h') != std::string::npos)
+ ::sscanf(time.c_str(), "%dh %dm %ds", &hours, &minutes, &seconds);
+ else if (time.find('m') != std::string::npos)
+ ::sscanf(time.c_str(), "%dm %ds", &minutes, &seconds);
+ else if (time.find('s') != std::string::npos)
+ ::sscanf(time.c_str(), "%ds", &seconds);
+
+ // Format the dhm time.
+ char buffer[64];
+ if (days > 0)
+ ::sprintf(buffer, "%dd%dh\n%dm", days, hours, minutes);
+ else if (hours > 0) {
+ if (hours < 10 && minutes < 10 && seconds < 10)
+ ::sprintf(buffer, "%dh%dm%ds", hours, minutes, seconds);
+ else if (hours > 10 && minutes > 10 && seconds > 10)
+ ::sprintf(buffer, "%dh\n%dm\n%ds", hours, minutes, seconds);
+ else if (minutes < 10 && seconds > 10 || minutes > 10 && seconds < 10)
+ ::sprintf(buffer, "%dh\n%dm%ds", hours, minutes, seconds);
+ else
+ ::sprintf(buffer, "%dh%dm\n%ds", hours, minutes, seconds);
+ }
+ else if (minutes > 0) {
+ if (minutes > 10 && seconds > 10)
+ ::sprintf(buffer, "%dm\n%ds", minutes, seconds);
+ else
+ ::sprintf(buffer, "%dm%ds", minutes, seconds);
+ }
+ else
+ ::sprintf(buffer, "%ds", seconds);
+ return buffer;
}
-wxString Control::get_label(int tick) const
+wxString Control::get_label(int tick, LabelType label_type/* = ltHeightWithLayer*/) const
{
const int value = tick;
@@ -527,55 +626,68 @@ wxString Control::get_label(int tick) const
if (value >= m_values.size())
return "ErrVal";
- const wxString str = m_values.empty() ?
- wxNumberFormatter::ToString(m_label_koef*value, 2, wxNumberFormatter::Style_None) :
- wxNumberFormatter::ToString(m_values[value], 2, wxNumberFormatter::Style_None);
- return from_u8((boost::format("%1%\n(%2%)") % str % (m_values.empty() ? value : value+1)).str());
+ if (m_draw_mode == dmSequentialGCodeView)
+ return wxString::Format("%d", static_cast<unsigned int>(m_values[value]));
+ else {
+ if (label_type == ltEstimatedTime) {
+ return (value < m_layers_times.size()) ? short_and_splitted_time(get_time_dhms(m_layers_times[value])) : "";
+ }
+ wxString str = m_values.empty() ?
+ wxString::Format("%.*f", 2, m_label_koef * value) :
+ wxString::Format("%.*f", 2, m_values[value]);
+ if (label_type == ltHeight)
+ return str;
+ if (label_type == ltHeightWithLayer)
+ return format_wxstr("%1%\n(%2%)", str, m_values.empty() ? value : value + 1);
+ }
+
+ return wxEmptyString;
}
-void Control::draw_tick_text(wxDC& dc, const wxPoint& pos, int tick, bool right_side/*=true*/) const
+void Control::draw_tick_text(wxDC& dc, const wxPoint& pos, int tick, LabelType label_type/* = ltHeight*/, bool right_side/*=true*/) const
{
wxCoord text_width, text_height;
- const wxString label = get_label(tick);
+ const wxString label = get_label(tick, label_type);
dc.GetMultiLineTextExtent(label, &text_width, &text_height);
wxPoint text_pos;
- if (right_side)
- text_pos = is_horizontal() ? wxPoint(pos.x + 1, pos.y + m_thumb_size.x) :
- wxPoint(pos.x + m_thumb_size.x+1, pos.y - 0.5*text_height - 1);
+ if (right_side) {
+ if (is_horizontal()) {
+ int width;
+ int height;
+ get_size(&width, &height);
+
+ int x_right = pos.x + 1 + text_width;
+ int xx = (x_right < width) ? pos.x + 1 : pos.x - text_width - 1;
+ text_pos = wxPoint(xx, pos.y + m_thumb_size.x / 2 + 1);
+ }
+ else
+ text_pos = wxPoint(pos.x + m_thumb_size.x + 1, pos.y - 0.5 * text_height - 1);
+ }
+ else {
+ if (is_horizontal()) {
+ int x = pos.x - text_width - 1;
+ int xx = (x > 0) ? x : pos.x + 1;
+ text_pos = wxPoint(xx, pos.y - m_thumb_size.x / 2 - text_height - 1);
+ }
+ else
+ text_pos = wxPoint(std::max(2, pos.x - text_width - 1 - m_thumb_size.x), pos.y - 0.5 * text_height + 1);
+ }
+
+ if (label_type == ltEstimatedTime)
+ dc.DrawLabel(label, wxRect(text_pos, wxSize(text_width, text_height)), wxALIGN_RIGHT);
else
- text_pos = is_horizontal() ? wxPoint(pos.x - text_width - 1, pos.y - m_thumb_size.x - text_height) :
- wxPoint(pos.x - text_width - 1 - m_thumb_size.x, pos.y - 0.5*text_height + 1);
- dc.DrawText(label, text_pos);
+ dc.DrawText(label, text_pos);
}
void Control::draw_thumb_text(wxDC& dc, const wxPoint& pos, const SelectedSlider& selection) const
{
- draw_tick_text(dc, pos, selection == ssLower ? m_lower_value : m_higher_value, selection == ssLower);
+ draw_tick_text(dc, pos, selection == ssLower ? m_lower_value : m_higher_value, ltHeightWithLayer, selection == ssLower);
}
void Control::draw_thumb_item(wxDC& dc, const wxPoint& pos, const SelectedSlider& selection)
{
- wxCoord x_draw, y_draw;
- if (selection == ssLower) {
- if (is_horizontal()) {
- x_draw = pos.x - m_thumb_size.x;
- y_draw = pos.y - int(0.5*m_thumb_size.y);
- }
- else {
- x_draw = pos.x - int(0.5*m_thumb_size.x);
- y_draw = pos.y - int(0.5*m_thumb_size.y);
- }
- }
- else{
- if (is_horizontal()) {
- x_draw = pos.x;
- y_draw = pos.y - int(0.5*m_thumb_size.y);
- }
- else {
- x_draw = pos.x - int(0.5*m_thumb_size.x);
- y_draw = pos.y - int(0.5*m_thumb_size.y);
- }
- }
+ wxCoord x_draw = pos.x - int(0.5 * m_thumb_size.x);
+ wxCoord y_draw = pos.y - int(0.5 * m_thumb_size.y);
dc.DrawBitmap(selection == ssLower ? m_bmp_thumb_lower.bmp() : m_bmp_thumb_higher.bmp(), x_draw, y_draw);
// Update thumb rect
@@ -623,6 +735,15 @@ void Control::draw_thumbs(wxDC& dc, const wxCoord& lower_pos, const wxCoord& hig
draw_thumb_text(dc, pos_l, ssLower);
}
+void Control::draw_ticks_pair(wxDC& dc, wxCoord pos, wxCoord mid, int tick_len)
+{
+ int mid_space = 9;
+ is_horizontal() ? dc.DrawLine(pos, mid - (mid_space + tick_len), pos, mid - mid_space) :
+ dc.DrawLine(mid - (mid_space + tick_len), pos, mid - mid_space, pos);
+ is_horizontal() ? dc.DrawLine(pos, mid + (mid_space + tick_len), pos, mid + mid_space) :
+ dc.DrawLine(mid + (mid_space + tick_len), pos, mid + mid_space, pos);
+};
+
void Control::draw_ticks(wxDC& dc)
{
if (m_draw_mode == dmSlaPrint)
@@ -632,14 +753,14 @@ void Control::draw_ticks(wxDC& dc)
int height, width;
get_size(&width, &height);
const wxCoord mid = is_horizontal() ? 0.5*height : 0.5*width;
- for (auto tick : m_ticks.ticks)
- {
- const wxCoord pos = get_position_from_value(tick.tick);
+ for (auto tick : m_ticks.ticks) {
+ if (tick.tick >= m_values.size()) {
+ // The case when OnPaint is called before m_ticks.ticks data are updated (specific for the vase mode)
+ break;
+ }
- is_horizontal() ? dc.DrawLine(pos, mid-14, pos, mid-9) :
- dc.DrawLine(mid - 14, pos/* - 1*/, mid - 9, pos/* - 1*/);
- is_horizontal() ? dc.DrawLine(pos, mid+14, pos, mid+9) :
- dc.DrawLine(mid + 14, pos/* - 1*/, mid + 9, pos/* - 1*/);
+ const wxCoord pos = get_position_from_value(tick.tick);
+ draw_ticks_pair(dc, pos, mid, 7);
// if current tick if focused, we should to use a specific "focused" icon
bool focused_tick = m_moving_pos != wxDefaultPosition && tick.tick == get_tick_near_point(m_moving_pos);
@@ -650,18 +771,17 @@ void Control::draw_ticks(wxDC& dc)
// if we have non-regular draw mode, all ticks should be marked with error icon
if (m_draw_mode != dmRegular)
icon_name = focused_tick ? "error_tick_f" : "error_tick";
- else if (tick.gcode == ColorChangeCode || tick.gcode == ToolChangeCode) {
+ else if (tick.type == ColorChange || tick.type == ToolChange) {
if (m_ticks.is_conflict_tick(tick, m_mode, m_only_extruder, m_values[tick.tick]))
icon_name = focused_tick ? "error_tick_f" : "error_tick";
}
- else if (tick.gcode == PausePrintCode)
+ else if (tick.type == PausePrint)
icon_name = focused_tick ? "pause_print_f" : "pause_print";
else
icon_name = focused_tick ? "edit_gcode_f" : "edit_gcode";
// Draw icon for "Pause print", "Custom Gcode" or conflict tick
- if (!icon_name.empty())
- {
+ if (!icon_name.empty()) {
wxBitmap icon = create_scaled_bitmap(icon_name);
wxCoord x_draw, y_draw;
is_horizontal() ? x_draw = pos - 0.5 * m_tick_icon_dim : y_draw = pos - 0.5 * m_tick_icon_dim;
@@ -679,7 +799,7 @@ std::string Control::get_color_for_tool_change_tick(std::set<TickCode>::const_it
auto it_n = it;
while (it_n != m_ticks.ticks.begin()) {
--it_n;
- if (it_n->gcode == ColorChangeCode && it_n->extruder == current_extruder)
+ if (it_n->type == ColorChange && it_n->extruder == current_extruder)
return it_n->color;
}
@@ -693,13 +813,13 @@ std::string Control::get_color_for_color_change_tick(std::set<TickCode>::const_i
bool is_tool_change = false;
while (it_n != m_ticks.ticks.begin()) {
--it_n;
- if (it_n->gcode == ToolChangeCode) {
+ if (it_n->type == ToolChange) {
is_tool_change = true;
if (it_n->extruder == it->extruder)
return it->color;
break;
}
- if (it_n->gcode == ColorChangeCode && it_n->extruder == it->extruder)
+ if (it_n->type == ColorChange && it_n->extruder == it->extruder)
return it->color;
}
if (!is_tool_change && it->extruder == def_extruder)
@@ -737,28 +857,31 @@ void Control::draw_colored_band(wxDC& dc)
wxRect main_band = get_colored_band_rect();
// don't color a band for MultiExtruder mode
- if (m_ticks.empty() || m_mode == t_mode::MultiExtruder)
- {
+ if (m_ticks.empty() || m_mode == MultiExtruder) {
+#ifdef _WIN32
+ draw_band(dc, wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW), main_band);
+#else
draw_band(dc, GetParent()->GetBackgroundColour(), main_band);
+#endif // _WIN32
return;
}
- const int default_color_idx = m_mode==t_mode::MultiAsSingle ? std::max<int>(m_only_extruder - 1, 0) : 0;
+ const int default_color_idx = m_mode==MultiAsSingle ? std::max<int>(m_only_extruder - 1, 0) : 0;
draw_band(dc, wxColour(m_extruder_colors[default_color_idx]), main_band);
std::set<TickCode>::const_iterator tick_it = m_ticks.ticks.begin();
while (tick_it != m_ticks.ticks.end())
{
- if ( (m_mode == t_mode::SingleExtruder && tick_it->gcode == ColorChangeCode ) ||
- (m_mode == t_mode::MultiAsSingle && (tick_it->gcode == ToolChangeCode || tick_it->gcode == ColorChangeCode)) )
+ if ( (m_mode == SingleExtruder && tick_it->type == ColorChange ) ||
+ (m_mode == MultiAsSingle && (tick_it->type == ToolChange || tick_it->type == ColorChange)) )
{
const wxCoord pos = get_position_from_value(tick_it->tick);
is_horizontal() ? main_band.SetLeft(SLIDER_MARGIN + pos) :
main_band.SetBottom(pos - 1);
- const std::string clr_str = m_mode == t_mode::SingleExtruder ? tick_it->color :
- tick_it->gcode == ToolChangeCode ?
+ const std::string clr_str = m_mode == SingleExtruder ? tick_it->color :
+ tick_it->type == ToolChange ?
get_color_for_tool_change_tick(tick_it) :
get_color_for_color_change_tick(tick_it);
@@ -769,8 +892,141 @@ void Control::draw_colored_band(wxDC& dc)
}
}
+void Control::Ruler::update(wxWindow* win, const std::vector<double>& values, double scroll_step)
+{
+ int DPI = GUI::get_dpi_for_window(win);
+ int pixels_per_sm = lround((double)(DPI) * 5.0/25.4);
+
+ if (lround(scroll_step) > pixels_per_sm) {
+ long_step = -1.0;
+ return;
+ }
+
+ int pow = -2;
+ int step = 0;
+ auto end_it = count == 1 ? values.end() : values.begin() + lround(values.size() / count);
+
+ while (pow < 3) {
+ int tick = 0;
+ for (int istep : {1, 2, 5}) {
+ double val = (double)istep * std::pow(10,pow);
+ auto val_it = std::lower_bound(values.begin(), end_it, val - epsilon());
+
+ if (val_it == values.end())
+ break;
+ int tick = val_it - values.begin();
+
+ // find next tick with istep
+ val *= 2;
+ val_it = std::lower_bound(values.begin(), end_it, val - epsilon());
+ // count of short ticks between ticks
+ int short_ticks_cnt = val_it == values.end() ? tick : val_it - values.begin() - tick;
+
+ if (lround(short_ticks_cnt * scroll_step) > pixels_per_sm) {
+ step = istep;
+ // there couldn't be more then 10 short ticks between ticks
+ short_step = 0.1 * short_ticks_cnt;
+ break;
+ }
+ }
+ if (step > 0)
+ break;
+ pow++;
+ }
+
+ long_step = step == 0 ? -1.0 : (double)step* std::pow(10, pow);
+}
+
+void Control::draw_ruler(wxDC& dc)
+{
+ m_ruler.update(this->GetParent(), m_values, get_scroll_step());
+
+ int height, width;
+ get_size(&width, &height);
+ const wxCoord mid = is_horizontal() ? 0.5 * height : 0.5 * width;
+
+ dc.SetPen(GREY_PEN);
+ wxColour old_clr = dc.GetTextForeground();
+ dc.SetTextForeground(GREY_PEN.GetColour());
+
+ if (m_ruler.long_step < 0)
+ for (int tick = 1; tick < m_values.size(); tick++) {
+ wxCoord pos = get_position_from_value(tick);
+ draw_ticks_pair(dc, pos, mid, 5);
+ draw_tick_text(dc, wxPoint(mid, pos), tick);
+ }
+ else {
+ auto draw_short_ticks = [this, mid](wxDC& dc, double& current_tick, int max_tick) {
+ while (current_tick < max_tick) {
+ wxCoord pos = get_position_from_value(lround(current_tick));
+ draw_ticks_pair(dc, pos, mid, 2);
+ current_tick += m_ruler.short_step;
+ if (current_tick > m_max_value)
+ break;
+ }
+ };
+
+ double short_tick;
+ int tick = 0;
+ double value = 0.0;
+ int sequence = 0;
+
+ int prev_y_pos = -1;
+ wxCoord label_height = dc.GetMultiLineTextExtent("0").y - 2;
+ int values_size = (int)m_values.size();
+
+ while (tick <= m_max_value) {
+ value += m_ruler.long_step;
+ if (value > m_values.back() && sequence < m_ruler.count) {
+ value = m_ruler.long_step;
+ for (; tick < values_size; tick++)
+ if (m_values[tick] < value)
+ break;
+ // short ticks from the last tick to the end of current sequence
+ draw_short_ticks(dc, short_tick, tick);
+ sequence++;
+ }
+ short_tick = tick;
+
+ for (; tick < values_size; tick++) {
+ if (m_values[tick] == value)
+ break;
+ if (m_values[tick] > value) {
+ if (tick > 0)
+ tick--;
+ break;
+ }
+ }
+ if (tick > m_max_value)
+ break;
+
+ wxCoord pos = get_position_from_value(tick);
+ draw_ticks_pair(dc, pos, mid, 5);
+ if (prev_y_pos < 0 || prev_y_pos - pos >= label_height) {
+ draw_tick_text(dc, wxPoint(mid, pos), tick);
+ prev_y_pos = pos;
+ }
+
+ draw_short_ticks(dc, short_tick, tick);
+
+ if (value == m_values.back() && sequence < m_ruler.count) {
+ value = 0.0;
+ sequence++;
+ tick++;
+ }
+ }
+ // short ticks from the last tick to the end
+ draw_short_ticks(dc, short_tick, m_max_value);
+ }
+
+ dc.SetTextForeground(old_clr);
+}
+
void Control::draw_one_layer_icon(wxDC& dc)
{
+ if (m_draw_mode == dmSequentialGCodeView)
+ return;
+
const wxBitmap& icon = m_is_one_layer ?
m_focus == fiOneLayerIcon ? m_bmp_one_layer_lock_off.bmp() : m_bmp_one_layer_lock_on.bmp() :
m_focus == fiOneLayerIcon ? m_bmp_one_layer_unlock_off.bmp() : m_bmp_one_layer_unlock_on.bmp();
@@ -808,12 +1064,21 @@ void Control::draw_revert_icon(wxDC& dc)
void Control::draw_cog_icon(wxDC& dc)
{
+ if (m_draw_mode == dmSequentialGCodeView)
+ return;
+
int width, height;
get_size(&width, &height);
wxCoord x_draw, y_draw;
- is_horizontal() ? x_draw = width-2 : x_draw = width - m_cog_icon_dim - 2;
- is_horizontal() ? y_draw = height - m_cog_icon_dim - 2 : y_draw = height-2;
+ if (m_draw_mode == dmSequentialGCodeView) {
+ is_horizontal() ? x_draw = width - 2 : x_draw = 0.5 * width - 0.5 * m_cog_icon_dim;
+ is_horizontal() ? y_draw = 0.5 * height - 0.5 * m_cog_icon_dim : y_draw = height - 2;
+ }
+ else {
+ is_horizontal() ? x_draw = width - 2 : x_draw = width - m_cog_icon_dim - 2;
+ is_horizontal() ? y_draw = height - m_cog_icon_dim - 2 : y_draw = height - 2;
+ }
dc.DrawBitmap(m_bmp_cog.bmp(), x_draw, y_draw);
@@ -821,9 +1086,12 @@ void Control::draw_cog_icon(wxDC& dc)
m_rect_cog_icon = wxRect(x_draw, y_draw, m_cog_icon_dim, m_cog_icon_dim);
}
-void Control::update_thumb_rect(const wxCoord& begin_x, const wxCoord& begin_y, const SelectedSlider& selection)
+void Control::update_thumb_rect(const wxCoord begin_x, const wxCoord begin_y, const SelectedSlider& selection)
{
- const wxRect& rect = wxRect(begin_x, begin_y + (selection == ssLower ? int(m_thumb_size.y * 0.5) : 0), m_thumb_size.x, int(m_thumb_size.y*0.5));
+ const wxRect rect = is_horizontal() ?
+ wxRect(begin_x + (selection == ssHigher ? m_thumb_size.x / 2 : 0), begin_y, m_thumb_size.x / 2, m_thumb_size.y) :
+ wxRect(begin_x, begin_y + (selection == ssLower ? m_thumb_size.y / 2 : 0), m_thumb_size.x, m_thumb_size.y / 2);
+
if (selection == ssLower)
m_rect_lower_thumb = rect;
else
@@ -841,10 +1109,17 @@ 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))
- m_selection = ssLower;
+ m_selection = is_lower_thumb_editable() ? ssLower : ssUndef;
else if(is_point_in_rect(pt, m_rect_higher_thumb))
m_selection = ssHigher;
else
@@ -904,8 +1179,7 @@ void Control::OnLeftDown(wxMouseEvent& event)
m_mouse = maOneLayerIconClick;
else if (is_point_in_rect(pos, m_rect_cog_icon))
m_mouse = maCogIconClick;
- else if (m_draw_mode == dmRegular)
- {
+ else if (m_draw_mode == dmRegular) {
if (is_point_in_rect(pos, m_rect_tick_action)) {
auto it = m_ticks.ticks.find(TickCode{ m_selection == ssLower ? m_lower_value : m_higher_value });
m_mouse = it == m_ticks.ticks.end() ? maAddTick : maDeleteTick;
@@ -947,17 +1221,24 @@ wxString Control::get_tooltip(int tick/*=-1*/)
if (m_focus == fiNone)
return "";
if (m_focus == fiOneLayerIcon)
- return _(L("One layer mode"));
+ return _L("One layer mode");
if (m_focus == fiRevertIcon)
- return _(L("Discard all custom changes"));
+ return _L("Discard all custom changes");
if (m_focus == fiCogIcon)
- return m_mode == t_mode::MultiAsSingle ?
- GUI::from_u8((boost::format(_utf8(L("Jump to height %s or "
- "Set extruder sequence for the entire print"))) % " (Shift + G)\n").str()) :
- _(L("Jump to height")) + " (Shift + G)";
+ {
+ if (m_draw_mode == dmSequentialGCodeView)
+ return _L("Jump to move") + " (Shift + G)";
+ else
+ return m_mode == MultiAsSingle ?
+ GUI::from_u8((boost::format(_u8L("Jump to height %s\n"
+ "Set ruler mode\n"
+ "or Set extruder sequence for the entire print")) % "(Shift + G)").str()) :
+ GUI::from_u8((boost::format(_u8L("Jump to height %s\n"
+ "or Set ruler mode")) % "(Shift + G)").str());
+ }
if (m_focus == fiColorBand)
- return m_mode != t_mode::SingleExtruder ? "" :
- _(L("Edit current color - Right click the colored slider segment"));
+ return m_mode != SingleExtruder ? "" :
+ _L("Edit current color - Right click the colored slider segment");
if (m_draw_mode == dmSlaPrint)
return ""; // no drawn ticks and no tooltips for them in SlaPrinting mode
@@ -967,10 +1248,10 @@ wxString Control::get_tooltip(int tick/*=-1*/)
if (tick_code_it == m_ticks.ticks.end() && m_focus == fiActionIcon) // tick doesn't exist
{
// Show mode as a first string of tooltop
- tooltip = " " + _(L("Print mode")) + ": ";
- tooltip += (m_mode == t_mode::SingleExtruder ? CustomGCode::SingleExtruderMode :
- m_mode == t_mode::MultiAsSingle ? CustomGCode::MultiAsSingleMode :
- CustomGCode::MultiExtruderMode );
+ tooltip = " " + _L("Print mode") + ": ";
+ tooltip += (m_mode == SingleExtruder ? SingleExtruderMode :
+ m_mode == MultiAsSingle ? MultiAsSingleMode :
+ MultiExtruderMode );
tooltip += "\n\n";
/* Note: just on OSX!!!
@@ -980,68 +1261,70 @@ wxString Control::get_tooltip(int tick/*=-1*/)
* */
// Show list of actions with new tick
- tooltip += ( m_mode == t_mode::MultiAsSingle ?
- _(L("Add extruder change - Left click")) :
- m_mode == t_mode::SingleExtruder ?
- _(L("Add color change - Left click for predefined color or "
- "Shift + Left click for custom color selection")) :
- _(L("Add color change - Left click")) ) + " " +
- _(L("or press \"+\" key")) + "\n" + (
- is_osx ?
- _(L("Add another code - Ctrl + Left click")) :
- _(L("Add another code - Right click")) );
+ tooltip += ( m_mode == MultiAsSingle ?
+ _L("Add extruder change - Left click") :
+ m_mode == SingleExtruder ?
+ _L("Add color change - Left click for predefined color or "
+ "Shift + Left click for custom color selection") :
+ _L("Add color change - Left click") ) + " " +
+ _L("or press \"+\" key") + "\n" + (
+ is_osx ?
+ _L("Add another code - Ctrl + Left click") :
+ _L("Add another code - Right click") );
}
if (tick_code_it != m_ticks.ticks.end()) // tick exists
{
if (m_draw_mode == dmSequentialFffPrint)
- return _(L("The sequential print is on.\n"
+ return _L("The sequential print is on.\n"
"It's impossible to apply any custom G-code for objects printing sequentually.\n"
- "This code won't be processed during G-code generation."));
-
+ "This code won't be processed during G-code generation.");
+
// Show custom Gcode as a first string of tooltop
tooltip = " ";
- tooltip += tick_code_it->gcode == ColorChangeCode ? ( m_mode == t_mode::SingleExtruder ?
- from_u8((boost::format(_utf8(L("Color change (\"%1%\")"))) % tick_code_it->gcode ).str()) :
- from_u8((boost::format(_utf8(L("Color change (\"%1%\") for Extruder %2%"))) %
- tick_code_it->gcode % tick_code_it->extruder).str()) ) :
- tick_code_it->gcode == PausePrintCode ?
- from_u8((boost::format(_utf8(L("Pause print (\"%1%\")"))) % tick_code_it->gcode ).str()) :
- tick_code_it->gcode == ToolChangeCode ?
- from_u8((boost::format(_utf8(L("Extruder (tool) is changed to Extruder \"%1%\""))) %
- tick_code_it->extruder ).str()) :
- from_u8(tick_code_it->gcode);
+ tooltip +=
+ tick_code_it->type == ColorChange ?
+ (m_mode == SingleExtruder ?
+ format_wxstr(_L("Color change (\"%1%\")"), gcode(ColorChange)) :
+ format_wxstr(_L("Color change (\"%1%\") for Extruder %2%"), gcode(ColorChange), tick_code_it->extruder)) :
+ tick_code_it->type == PausePrint ?
+ format_wxstr(_L("Pause print (\"%1%\")"), gcode(PausePrint)) :
+ tick_code_it->type == Template ?
+ format_wxstr(_L("Custom template (\"%1%\")"), gcode(Template)) :
+ tick_code_it->type == ToolChange ?
+ format_wxstr(_L("Extruder (tool) is changed to Extruder \"%1%\""), tick_code_it->extruder) :
+ from_u8(tick_code_it->extra);// tick_code_it->type == Custom
// If tick is marked as a conflict (exclamation icon),
// we should to explain why
ConflictType conflict = m_ticks.is_conflict_tick(*tick_code_it, m_mode, m_only_extruder, m_values[tick]);
if (conflict != ctNone)
- tooltip += "\n\n" + _(L("Note")) + "! ";
+ tooltip += "\n\n" + _L("Note") + "! ";
if (conflict == ctModeConflict)
- tooltip += _(L("G-code associated to this tick mark is in a conflict with print mode.\n"
- "Editing it will cause changes of Slider data."));
+ tooltip += _L("G-code associated to this tick mark is in a conflict with print mode.\n"
+ "Editing it will cause changes of Slider data.");
else if (conflict == ctMeaninglessColorChange)
- tooltip += _(L("There is a color change for extruder that won't be used till the end of print job.\n"
- "This code won't be processed during G-code generation."));
+ tooltip += _L("There is a color change for extruder that won't be used till the end of print job.\n"
+ "This code won't be processed during G-code generation.");
else if (conflict == ctMeaninglessToolChange)
- tooltip += _(L("There is an extruder change set to the same extruder.\n"
- "This code won't be processed during G-code generation."));
+ tooltip += _L("There is an extruder change set to the same extruder.\n"
+ "This code won't be processed during G-code generation.");
else if (conflict == ctRedundant)
- tooltip += _(L("There is a color change for extruder that has not been used before.\n"
- "Check your settings to avoid redundant color changes."));
+ tooltip += _L("There is a color change for extruder that has not been used before.\n"
+ "Check your settings to avoid redundant color changes.");
// Show list of actions with existing tick
if (m_focus == fiActionIcon)
- tooltip += "\n\n" + _(L("Delete tick mark - Left click or press \"-\" key")) + "\n" + (
+ tooltip += "\n\n" + _L("Delete tick mark - Left click or press \"-\" key") + "\n" + (
is_osx ?
- _(L("Edit tick mark - Ctrl + Left click")) :
- _(L("Edit tick mark - Right click")) );
+ _L("Edit tick mark - Ctrl + Left click") :
+ _L("Edit tick mark - Right click") );
}
return tooltip;
}
-int Control::get_edited_tick_for_position(const wxPoint pos, const std::string& gcode /*= ColorChangeCode*/)
+int Control::get_edited_tick_for_position(const wxPoint pos, Type type /*= ColorChange*/)
{
if (m_ticks.empty())
return -1;
@@ -1051,7 +1334,7 @@ int Control::get_edited_tick_for_position(const wxPoint pos, const std::string&
while (it != m_ticks.ticks.begin()) {
--it;
- if (it->gcode == gcode)
+ if (it->type == type)
return it->tick;
}
@@ -1065,8 +1348,7 @@ void Control::OnMotion(wxMouseEvent& event)
const wxPoint pos = event.GetLogicalPosition(wxClientDC(this));
int tick = -1;
- if (!m_is_left_down && !m_is_right_down)
- {
+ if (!m_is_left_down && !m_is_right_down) {
if (is_point_in_rect(pos, m_rect_one_layer_icon))
m_focus = fiOneLayerIcon;
else if (is_point_in_rect(pos, m_rect_tick_action)) {
@@ -1077,9 +1359,13 @@ void Control::OnMotion(wxMouseEvent& event)
m_focus = fiRevertIcon;
else if (is_point_in_rect(pos, m_rect_cog_icon))
m_focus = fiCogIcon;
- else if (m_mode == t_mode::SingleExtruder && is_point_in_rect(pos, get_colored_band_rect()) &&
+ else if (m_mode == SingleExtruder && is_point_in_rect(pos, get_colored_band_rect()) &&
get_edited_tick_for_position(pos) >= 0 )
m_focus = fiColorBand;
+ else if (is_point_in_rect(pos, m_rect_lower_thumb))
+ m_focus = fiLowerThumb;
+ else if (is_point_in_rect(pos, m_rect_higher_thumb))
+ m_focus = fiHigherThumb;
else {
m_focus = fiTick;
tick = get_tick_near_point(pos);
@@ -1108,8 +1394,7 @@ void Control::OnMotion(wxMouseEvent& event)
// Set tooltips with information for each icon
this->SetToolTip(get_tooltip(tick));
- if (action)
- {
+ if (action) {
wxCommandEvent e(wxEVT_SCROLL_CHANGED);
e.SetEventObject(this);
e.SetString("moving");
@@ -1120,35 +1405,33 @@ void Control::OnMotion(wxMouseEvent& event)
void Control::append_change_extruder_menu_item(wxMenu* menu, bool switch_current_code/* = false*/)
{
const int extruders_cnt = GUI::wxGetApp().extruders_edited_cnt();
- if (extruders_cnt > 1)
- {
+ if (extruders_cnt > 1) {
std::array<int, 2> active_extruders = get_active_extruders_for_tick(m_selection == ssLower ? m_lower_value : m_higher_value);
std::vector<wxBitmap*> icons = get_extruder_color_icons(true);
wxMenu* change_extruder_menu = new wxMenu();
- for (int i = 1; i <= extruders_cnt; i++)
- {
+ for (int i = 1; i <= extruders_cnt; i++) {
const bool is_active_extruder = i == active_extruders[0] || i == active_extruders[1];
- const wxString item_name = wxString::Format(_(L("Extruder %d")), i) +
- (is_active_extruder ? " (" + _(L("active")) + ")" : "");
+ const wxString item_name = wxString::Format(_L("Extruder %d"), i) +
+ (is_active_extruder ? " (" + _L("active") + ")" : "");
- if (m_mode == t_mode::MultiAsSingle)
+ if (m_mode == MultiAsSingle)
append_menu_item(change_extruder_menu, wxID_ANY, item_name, "",
- [this, i](wxCommandEvent&) { add_code_as_tick(ToolChangeCode, i); }, *icons[i-1], menu,
+ [this, i](wxCommandEvent&) { add_code_as_tick(ToolChange, i); }, *icons[i-1], menu,
[is_active_extruder]() { return !is_active_extruder; }, GUI::wxGetApp().plater());
}
- const wxString change_extruder_menu_name = m_mode == t_mode::MultiAsSingle ?
- (switch_current_code ? _(L("Switch code to Change extruder")) : _(L("Change extruder")) ) :
- _(L("Change extruder (N/A)"));
+ const wxString change_extruder_menu_name = m_mode == MultiAsSingle ?
+ (switch_current_code ? _L("Switch code to Change extruder") : _L("Change extruder") ) :
+ _L("Change extruder (N/A)");
- wxMenuItem* change_extruder_menu_item = menu->AppendSubMenu(change_extruder_menu, change_extruder_menu_name, _(L("Use another extruder")));
+ wxMenuItem* change_extruder_menu_item = menu->AppendSubMenu(change_extruder_menu, change_extruder_menu_name, _L("Use another extruder"));
change_extruder_menu_item->SetBitmap(create_scaled_bitmap(active_extruders[1] > 0 ? "edit_uni" : "change_extruder"));
GUI::wxGetApp().plater()->Bind(wxEVT_UPDATE_UI, [this, change_extruder_menu_item](wxUpdateUIEvent& evt) {
- enable_menu_item(evt, [this]() {return m_mode == t_mode::MultiAsSingle; }, change_extruder_menu_item, this); },
+ enable_menu_item(evt, [this]() {return m_mode == MultiAsSingle; }, change_extruder_menu_item, this); },
change_extruder_menu_item->GetId());
}
}
@@ -1156,28 +1439,26 @@ void Control::append_change_extruder_menu_item(wxMenu* menu, bool switch_current
void Control::append_add_color_change_menu_item(wxMenu* menu, bool switch_current_code/* = false*/)
{
const int extruders_cnt = GUI::wxGetApp().extruders_edited_cnt();
- if (extruders_cnt > 1)
- {
+ if (extruders_cnt > 1) {
int tick = m_selection == ssLower ? m_lower_value : m_higher_value;
std::set<int> used_extruders_for_tick = m_ticks.get_used_extruders_for_tick(tick, m_only_extruder, m_values[tick]);
wxMenu* add_color_change_menu = new wxMenu();
- for (int i = 1; i <= extruders_cnt; i++)
- {
+ for (int i = 1; i <= extruders_cnt; i++) {
const bool is_used_extruder = used_extruders_for_tick.empty() ? true : // #ys_FIXME till used_extruders_for_tick doesn't filled correct for mmMultiExtruder
used_extruders_for_tick.find(i) != used_extruders_for_tick.end();
- const wxString item_name = wxString::Format(_(L("Extruder %d")), i) +
- (is_used_extruder ? " (" + _(L("used")) + ")" : "");
+ const wxString item_name = wxString::Format(_L("Extruder %d"), i) +
+ (is_used_extruder ? " (" + _L("used") + ")" : "");
append_menu_item(add_color_change_menu, wxID_ANY, item_name, "",
- [this, i](wxCommandEvent&) { add_code_as_tick(ColorChangeCode, i); }, "", menu,
+ [this, i](wxCommandEvent&) { add_code_as_tick(ColorChange, i); }, "", menu,
[]() { return true; }, GUI::wxGetApp().plater());
}
const wxString menu_name = switch_current_code ?
- from_u8((boost::format(_utf8(L("Switch code to Color change (%1%) for:"))) % ColorChangeCode).str()) :
- from_u8((boost::format(_utf8(L("Add color change (%1%) for:"))) % ColorChangeCode).str());
+ format_wxstr(_L("Switch code to Color change (%1%) for:"), gcode(ColorChange)) :
+ format_wxstr(_L("Add color change (%1%) for:"), gcode(ColorChange));
wxMenuItem* add_color_change_menu_item = menu->AppendSubMenu(add_color_change_menu, menu_name, "");
add_color_change_menu_item->SetBitmap(create_scaled_bitmap("colorchange_add_m"));
}
@@ -1201,10 +1482,7 @@ void Control::OnLeftUp(wxMouseEvent& event)
add_current_tick();
break;
case maCogIconClick :
- if (m_mode == t_mode::MultiAsSingle && m_draw_mode == dmRegular)
- show_cog_icon_context_menu();
- else
- jump_to_print_z();
+ show_cog_icon_context_menu();
break;
case maOneLayerIconClick:
switch_one_layer_mode();
@@ -1243,6 +1521,19 @@ void Control::move_current_thumb(const bool condition)
if (is_horizontal())
delta *= -1;
+ // accelerators
+ int accelerator = 0;
+ if (wxGetKeyState(WXK_SHIFT))
+ accelerator += 5;
+ if (wxGetKeyState(WXK_CONTROL))
+ accelerator += 5;
+ if (accelerator > 0)
+ delta *= accelerator;
+
+#if ENABLE_ARROW_KEYS_WITH_SLIDERS
+ if (m_selection == ssUndef) m_selection = ssHigher;
+#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS
+
if (m_selection == ssLower) {
m_lower_value -= delta;
correct_lower_value();
@@ -1262,8 +1553,7 @@ void Control::move_current_thumb(const bool condition)
void Control::OnWheel(wxMouseEvent& event)
{
// Set nearest to the mouse thumb as a selected, if there is not selected thumb
- if (m_selection == ssUndef)
- {
+ if (m_selection == ssUndef) {
const wxPoint& pt = event.GetLogicalPosition(wxClientDC(this));
if (is_horizontal())
@@ -1276,42 +1566,73 @@ void Control::OnWheel(wxMouseEvent& event)
ssLower : ssHigher;
}
- move_current_thumb(event.GetWheelRotation() > 0);
+ if (m_selection == ssLower && !is_lower_thumb_editable())
+ m_selection = ssUndef;
+
+ move_current_thumb((m_draw_mode == dmSequentialGCodeView) ? event.GetWheelRotation() < 0 : event.GetWheelRotation() > 0);
}
void Control::OnKeyDown(wxKeyEvent &event)
{
const int key = event.GetKeyCode();
- if (key == WXK_NUMPAD_ADD) {
+ if (m_draw_mode != dmSequentialGCodeView && key == WXK_NUMPAD_ADD) {
// OnChar() is called immediately after OnKeyDown(), which can cause call of add_tick() twice.
// To avoid this case we should suppress second add_tick() call.
m_ticks.suppress_plus(true);
add_current_tick(true);
}
- else if (key == 390 || key == WXK_DELETE || key == WXK_BACK) {
+ else if (m_draw_mode != dmSequentialGCodeView && (key == WXK_NUMPAD_SUBTRACT || key == WXK_DELETE || key == WXK_BACK)) {
// OnChar() is called immediately after OnKeyDown(), which can cause call of delete_tick() twice.
// To avoid this case we should suppress second delete_tick() call.
m_ticks.suppress_minus(true);
delete_current_tick();
}
- else if (event.GetKeyCode() == WXK_SHIFT)
+ else if (m_draw_mode != dmSequentialGCodeView && event.GetKeyCode() == WXK_SHIFT)
UseDefaultColors(false);
- else if (is_horizontal())
- {
- if (key == WXK_LEFT || key == WXK_RIGHT)
- move_current_thumb(key == WXK_LEFT);
- else if (key == WXK_UP || key == WXK_DOWN) {
- m_selection = key == WXK_UP ? ssHigher : ssLower;
- Refresh();
+ else if (is_horizontal()) {
+ if (m_is_focused) {
+ if (key == WXK_LEFT || key == WXK_RIGHT)
+ move_current_thumb(key == WXK_LEFT);
+ else if (key == WXK_UP || key == WXK_DOWN) {
+#if ENABLE_ARROW_KEYS_WITH_SLIDERS
+ if (key == WXK_DOWN)
+ m_selection = ssHigher;
+ else if (key == WXK_UP && is_lower_thumb_editable())
+ m_selection = ssLower;
+#else
+ if (key == WXK_UP)
+ m_selection = ssHigher;
+ else if (key == WXK_DOWN && is_lower_thumb_editable())
+ m_selection = ssLower;
+#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS
+ Refresh();
+ }
+ }
+#if ENABLE_ARROW_KEYS_WITH_SLIDERS
+ else {
+ if (key == WXK_LEFT || key == WXK_RIGHT)
+ move_current_thumb(key == WXK_LEFT);
}
+#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS
}
else {
- if (key == WXK_LEFT || key == WXK_RIGHT) {
- m_selection = key == WXK_LEFT ? ssHigher : ssLower;
- Refresh();
+ if (m_is_focused) {
+ if (key == WXK_LEFT || key == WXK_RIGHT) {
+ if (key == WXK_LEFT)
+ m_selection = ssHigher;
+ else if (key == WXK_RIGHT && is_lower_thumb_editable())
+ m_selection = ssLower;
+ Refresh();
+ }
+ else if (key == WXK_UP || key == WXK_DOWN)
+ move_current_thumb(key == WXK_UP);
+ }
+#if ENABLE_ARROW_KEYS_WITH_SLIDERS
+ else {
+ if (key == WXK_UP || key == WXK_DOWN)
+ move_current_thumb(key == WXK_UP);
}
- else if (key == WXK_UP || key == WXK_DOWN)
- move_current_thumb(key == WXK_UP);
+#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS
}
event.Skip(); // !Needed to have EVT_CHAR generated as well
@@ -1332,16 +1653,18 @@ void Control::OnKeyUp(wxKeyEvent &event)
void Control::OnChar(wxKeyEvent& event)
{
const int key = event.GetKeyCode();
- if (key == '+' && !m_ticks.suppressed_plus()) {
- add_current_tick(true);
- m_ticks.suppress_plus(false);
- }
- else if (key == '-' && !m_ticks.suppressed_minus()) {
- delete_current_tick();
- m_ticks.suppress_minus(false);
+ if (m_draw_mode != dmSequentialGCodeView) {
+ if (key == '+' && !m_ticks.suppressed_plus()) {
+ add_current_tick(true);
+ m_ticks.suppress_plus(false);
+ }
+ else if (key == '-' && !m_ticks.suppressed_minus()) {
+ delete_current_tick();
+ m_ticks.suppress_minus(false);
+ }
}
if (key == 'G')
- jump_to_print_z();
+ jump_to_value();
}
void Control::OnRightDown(wxMouseEvent& event)
@@ -1353,15 +1676,14 @@ void Control::OnRightDown(wxMouseEvent& event)
m_mouse = maNone;
if (m_draw_mode == dmRegular) {
- if (is_point_in_rect(pos, m_rect_tick_action))
- {
+ if (is_point_in_rect(pos, m_rect_tick_action)) {
const int tick = m_selection == ssLower ? m_lower_value : m_higher_value;
m_mouse = m_ticks.ticks.find(TickCode{ tick }) == m_ticks.ticks.end() ?
maAddMenu : maEditMenu;
}
- else if (m_mode == t_mode::SingleExtruder && !detect_selected_slider(pos) && is_point_in_rect(pos, get_colored_band_rect()))
+ else if (m_mode == SingleExtruder && !detect_selected_slider(pos) && is_point_in_rect(pos, get_colored_band_rect()))
m_mouse = maForceColorEdit;
- else if (m_mode == t_mode::MultiAsSingle && is_point_in_rect(pos, m_rect_cog_icon))
+ else if (m_mode == MultiAsSingle && is_point_in_rect(pos, m_rect_cog_icon))
m_mouse = maCogIconMenu;
}
if (m_mouse != maNone || !detect_selected_slider(pos))
@@ -1382,11 +1704,11 @@ void Control::OnRightDown(wxMouseEvent& event)
// Get active extruders for tick.
// Means one current extruder for not existing tick OR
-// 2 extruders - for existing tick (extruder before ToolChangeCode and extruder of current existing tick)
+// 2 extruders - for existing tick (extruder before ToolChange and extruder of current existing tick)
// Use those values to disable selection of active extruders
std::array<int, 2> Control::get_active_extruders_for_tick(int tick) const
{
- int default_initial_extruder = m_mode == t_mode::MultiAsSingle ? std::max<int>(1, m_only_extruder) : 1;
+ int default_initial_extruder = m_mode == MultiAsSingle ? std::max<int>(1, m_only_extruder) : 1;
std::array<int, 2> extruders = { default_initial_extruder, -1 };
if (m_ticks.empty())
return extruders;
@@ -1398,7 +1720,7 @@ std::array<int, 2> Control::get_active_extruders_for_tick(int tick) const
while (it != m_ticks.ticks.begin()) {
--it;
- if(it->gcode == ToolChangeCode) {
+ if(it->type == ToolChange) {
extruders[0] = it->extruder;
break;
}
@@ -1409,12 +1731,11 @@ std::array<int, 2> Control::get_active_extruders_for_tick(int tick) const
// Get used extruders for tick.
// Means all extruders(tools) which will be used during printing from current tick to the end
-std::set<int> TickCodeInfo::get_used_extruders_for_tick(int tick, int only_extruder, double print_z, t_mode force_mode/* = t_mode::Undef*/) const
+std::set<int> TickCodeInfo::get_used_extruders_for_tick(int tick, int only_extruder, double print_z, Mode force_mode/* = Undef*/) const
{
- t_mode e_mode = !force_mode ? mode : force_mode;
+ Mode e_mode = !force_mode ? mode : force_mode;
- if (e_mode == t_mode::MultiExtruder)
- {
+ if (e_mode == MultiExtruder) {
// #ys_FIXME: get tool ordering from _correct_ place
const ToolOrdering& tool_ordering = GUI::wxGetApp().plater()->fff_print().get_tool_ordering();
@@ -1424,8 +1745,7 @@ std::set<int> TickCodeInfo::get_used_extruders_for_tick(int tick, int only_extru
std::set<int> used_extruders;
auto it_layer_tools = std::lower_bound(tool_ordering.begin(), tool_ordering.end(), LayerTools(print_z));
- for (; it_layer_tools != tool_ordering.end(); ++it_layer_tools)
- {
+ for (; it_layer_tools != tool_ordering.end(); ++it_layer_tools) {
const std::vector<unsigned>& extruders = it_layer_tools->extruders;
for (const auto& extruder : extruders)
used_extruders.emplace(extruder+1);
@@ -1434,15 +1754,15 @@ std::set<int> TickCodeInfo::get_used_extruders_for_tick(int tick, int only_extru
return used_extruders;
}
- const int default_initial_extruder = e_mode == t_mode::MultiAsSingle ? std::max(only_extruder, 1) : 1;
- if (ticks.empty() || e_mode == t_mode::SingleExtruder)
+ const int default_initial_extruder = e_mode == MultiAsSingle ? std::max(only_extruder, 1) : 1;
+ if (ticks.empty() || e_mode == SingleExtruder)
return {default_initial_extruder};
std::set<int> used_extruders;
auto it_start = ticks.lower_bound(TickCode{tick});
auto it = it_start;
- if (it == ticks.begin() && it->gcode == ToolChangeCode &&
+ if (it == ticks.begin() && it->type == ToolChange &&
tick != it->tick ) // In case of switch of ToolChange to ColorChange, when tick exists,
// we shouldn't change color for extruder, which will be deleted
{
@@ -1453,7 +1773,7 @@ std::set<int> TickCodeInfo::get_used_extruders_for_tick(int tick, int only_extru
while (it != ticks.begin()) {
--it;
- if (it->gcode == ToolChangeCode && tick != it->tick) {
+ if (it->type == ToolChange && tick != it->tick) {
used_extruders.emplace(it->extruder);
break;
}
@@ -1463,7 +1783,7 @@ std::set<int> TickCodeInfo::get_used_extruders_for_tick(int tick, int only_extru
used_extruders.emplace(default_initial_extruder);
for (it = it_start; it != ticks.end(); ++it)
- if (it->gcode == ToolChangeCode && tick != it->tick)
+ if (it->type == ToolChange && tick != it->tick)
used_extruders.emplace(it->extruder);
return used_extruders;
@@ -1473,9 +1793,9 @@ void Control::show_add_context_menu()
{
wxMenu menu;
- if (m_mode == t_mode::SingleExtruder) {
- append_menu_item(&menu, wxID_ANY, _(L("Add color change")) + " (M600)", "",
- [this](wxCommandEvent&) { add_code_as_tick(ColorChangeCode); }, "colorchange_add_m", &menu);
+ if (m_mode == SingleExtruder) {
+ append_menu_item(&menu, wxID_ANY, _L("Add color change") + " (" + gcode(ColorChange) + ")", "",
+ [this](wxCommandEvent&) { add_code_as_tick(ColorChange); }, "colorchange_add_m", &menu);
UseDefaultColors(false);
}
@@ -1484,11 +1804,16 @@ void Control::show_add_context_menu()
append_add_color_change_menu_item(&menu);
}
- append_menu_item(&menu, wxID_ANY, _(L("Add pause print")) + " (M601)", "",
- [this](wxCommandEvent&) { add_code_as_tick(PausePrintCode); }, "pause_print", &menu);
+ if (!gcode(PausePrint).empty())
+ append_menu_item(&menu, wxID_ANY, _L("Add pause print") + " (" + gcode(PausePrint) + ")", "",
+ [this](wxCommandEvent&) { add_code_as_tick(PausePrint); }, "pause_print", &menu);
- append_menu_item(&menu, wxID_ANY, _(L("Add custom G-code")), "",
- [this](wxCommandEvent&) { add_code_as_tick(""); }, "edit_gcode", &menu);
+ if (!gcode(Template).empty())
+ append_menu_item(&menu, wxID_ANY, _L("Add custom template") + " (" + gcode(Template) + ")", "",
+ [this](wxCommandEvent&) { add_code_as_tick(Template); }, "edit_gcode", &menu);
+
+ append_menu_item(&menu, wxID_ANY, _L("Add custom G-code"), "",
+ [this](wxCommandEvent&) { add_code_as_tick(Custom); }, "edit_gcode", &menu);
GUI::wxGetApp().plater()->PopupMenu(&menu);
}
@@ -1499,24 +1824,24 @@ void Control::show_edit_context_menu()
std::set<TickCode>::iterator it = m_ticks.ticks.find(TickCode{ m_selection == ssLower ? m_lower_value : m_higher_value });
- if (it->gcode == ToolChangeCode) {
- if (m_mode == t_mode::MultiAsSingle)
+ if (it->type == ToolChange) {
+ if (m_mode == MultiAsSingle)
append_change_extruder_menu_item(&menu);
append_add_color_change_menu_item(&menu, true);
}
else
- append_menu_item(&menu, wxID_ANY, it->gcode == ColorChangeCode ? _(L("Edit color")) :
- it->gcode == PausePrintCode ? _(L("Edit pause print message")) :
- _(L("Edit custom G-code")), "",
+ append_menu_item(&menu, wxID_ANY, it->type == ColorChange ? _L("Edit color") :
+ it->type == PausePrint ? _L("Edit pause print message") :
+ _L("Edit custom G-code"), "",
[this](wxCommandEvent&) { edit_tick(); }, "edit_uni", &menu);
- if (it->gcode == ColorChangeCode && m_mode == t_mode::MultiAsSingle)
+ if (it->type == ColorChange && m_mode == MultiAsSingle)
append_change_extruder_menu_item(&menu, true);
- append_menu_item(&menu, wxID_ANY, it->gcode == ColorChangeCode ? _(L("Delete color change")) :
- it->gcode == ToolChangeCode ? _(L("Delete tool change")) :
- it->gcode == PausePrintCode ? _(L("Delete pause print")) :
- _(L("Delete custom G-code")), "",
+ append_menu_item(&menu, wxID_ANY, it->type == ColorChange ? _L("Delete color change") :
+ it->type == ToolChange ? _L("Delete tool change") :
+ it->type == PausePrint ? _L("Delete pause print") :
+ _L("Delete custom G-code"), "",
[this](wxCommandEvent&) { delete_current_tick();}, "colorchange_del_f", &menu);
GUI::wxGetApp().plater()->PopupMenu(&menu);
@@ -1526,11 +1851,30 @@ void Control::show_cog_icon_context_menu()
{
wxMenu menu;
- append_menu_item(&menu, wxID_ANY, _(L("Jump to height")) + " (Shift+G)", "",
- [this](wxCommandEvent&) { jump_to_print_z(); }, "", &menu);
+ append_menu_item(&menu, wxID_ANY, _L("Jump to height") + " (Shift+G)", "",
+ [this](wxCommandEvent&) { jump_to_value(); }, "", & menu);
+
+ wxMenu* ruler_mode_menu = new wxMenu();
+ if (ruler_mode_menu) {
+ append_menu_check_item(ruler_mode_menu, wxID_ANY, _L("None"), _L("Hide ruler"),
+ [this](wxCommandEvent&) { if (m_extra_style != 0) m_extra_style = 0; }, ruler_mode_menu,
+ []() { return true; }, [this]() { return m_extra_style == 0; }, GUI::wxGetApp().plater());
+
+ append_menu_check_item(ruler_mode_menu, wxID_ANY, _L("Show object height"), _L("Show object height on the ruler"),
+ [this](wxCommandEvent&) { m_extra_style & wxSL_AUTOTICKS ? m_extra_style &= wxSL_AUTOTICKS : m_extra_style |= wxSL_AUTOTICKS; }, ruler_mode_menu,
+ []() { return true; }, [this]() { return m_extra_style & wxSL_AUTOTICKS; }, GUI::wxGetApp().plater());
- append_menu_item(&menu, wxID_ANY, _(L("Set extruder sequence for the entire print")), "",
- [this](wxCommandEvent&) { edit_extruder_sequence(); }, "", &menu);
+ append_menu_check_item(ruler_mode_menu, wxID_ANY, _L("Show estimated print time"), _L("Show estimated print time on the ruler"),
+ [this](wxCommandEvent&) { m_extra_style & wxSL_VALUE_LABEL ? m_extra_style &= wxSL_VALUE_LABEL : m_extra_style |= wxSL_VALUE_LABEL; }, ruler_mode_menu,
+ []() { return true; }, [this]() { return m_extra_style & wxSL_VALUE_LABEL; }, GUI::wxGetApp().plater());
+
+ append_submenu(&menu, ruler_mode_menu, wxID_ANY, _L("Ruler mode"), _L("Set ruler mode"), "",
+ [this]() { return true; }, this);
+ }
+
+ if (m_mode == MultiAsSingle && m_draw_mode == dmRegular)
+ append_menu_item(&menu, wxID_ANY, _L("Set extruder sequence for the entire print"), "",
+ [this](wxCommandEvent&) { edit_extruder_sequence(); }, "", &menu);
GUI::wxGetApp().plater()->PopupMenu(&menu);
}
@@ -1542,8 +1886,7 @@ void Control::OnRightUp(wxMouseEvent& event)
this->ReleaseMouse();
m_is_right_down = m_is_one_layer = false;
- if (m_mouse == maForceColorEdit)
- {
+ if (m_mouse == maForceColorEdit) {
wxPoint pos = event.GetLogicalPosition(wxClientDC(this));
int edited_tick = get_edited_tick_for_position(pos);
if (edited_tick >= 0)
@@ -1596,17 +1939,18 @@ static void upgrade_text_entry_dialog(wxTextEntryDialog* dlg, double min = -1.0,
if (!textctrl)
return;
+ textctrl->SetInsertionPointEnd();
+
wxButton* btn_OK = static_cast<wxButton*>(dlg->FindWindowById(wxID_OK));
btn_OK->Bind(wxEVT_UPDATE_UI, [textctrl, min, max](wxUpdateUIEvent& evt)
{
bool disable = textctrl->IsEmpty();
- if (!disable && min >= 0.0 && max >= 0.0)
- {
+ if (!disable && min >= 0.0 && max >= 0.0) {
double value = -1.0;
if (!textctrl->GetValue().ToCDouble(&value)) // input value couldn't be converted to double
disable = true;
else
- disable = value < min || value > max; // is input value is out of valid range ?
+ disable = value < min - epsilon() || value > max + epsilon(); // is input value is out of valid range ?
}
evt.Enable(!disable);
@@ -1615,8 +1959,8 @@ static void upgrade_text_entry_dialog(wxTextEntryDialog* dlg, double min = -1.0,
static std::string get_custom_code(const std::string& code_in, double height)
{
- wxString msg_text = from_u8(_utf8(L("Enter custom G-code used on current layer"))) + ":";
- wxString msg_header = from_u8((boost::format(_utf8(L("Custom G-code on current layer (%1% mm)."))) % height).str());
+ wxString msg_text = _L("Enter custom G-code used on current layer") + ":";
+ wxString msg_header = format_wxstr(_L("Custom G-code on current layer (%1% mm)."), height);
// get custom gcode
wxTextEntryDialog dlg(nullptr, msg_text, msg_header, code_in,
@@ -1631,8 +1975,8 @@ static std::string get_custom_code(const std::string& code_in, double height)
static std::string get_pause_print_msg(const std::string& msg_in, double height)
{
- wxString msg_text = from_u8(_utf8(L("Enter short message shown on Printer display when a print is paused"))) + ":";
- wxString msg_header = from_u8((boost::format(_utf8(L("Message for pause print on current layer (%1% mm)."))) % height).str());
+ wxString msg_text = _L("Enter short message shown on Printer display when a print is paused") + ":";
+ wxString msg_header = format_wxstr(_L("Message for pause print on current layer (%1% mm)."), height);
// get custom gcode
wxTextEntryDialog dlg(nullptr, msg_text, msg_header, from_u8(msg_in),
@@ -1645,11 +1989,11 @@ static std::string get_pause_print_msg(const std::string& msg_in, double height)
return into_u8(dlg.GetValue());
}
-static double get_print_z_to_jump(double active_print_z, double min_z, double max_z)
+static double get_value_to_jump(double active_value, double min_z, double max_z, DrawMode mode)
{
- wxString msg_text = _(L("Enter the height you want to jump to")) + ":";
- wxString msg_header = _(L("Jump to height"));
- wxString msg_in = GUI::double_to_string(active_print_z);
+ wxString msg_text = (mode == dmSequentialGCodeView) ? _L("Enter the move you want to jump to") + ":" : _L("Enter the height you want to jump to") + ":";
+ wxString msg_header = (mode == dmSequentialGCodeView) ? _L("Jump to move") : _L("Jump to height");
+ wxString msg_in = GUI::double_to_string(active_value);
// get custom gcode
wxTextEntryDialog dlg(nullptr, msg_text, msg_header, msg_in, wxTextEntryDialogStyle);
@@ -1662,32 +2006,35 @@ static double get_print_z_to_jump(double active_print_z, double min_z, double ma
return dlg.GetValue().ToCDouble(&value) ? value : -1.0;
}
-void Control::add_code_as_tick(std::string code, int selected_extruder/* = -1*/)
+void Control::add_code_as_tick(Type type, int selected_extruder/* = -1*/)
{
if (m_selection == ssUndef)
return;
const int tick = m_selection == ssLower ? m_lower_value : m_higher_value;
- if ( !check_ticks_changed_event(code) )
+ if ( !check_ticks_changed_event(type) )
return;
+ if (type == ColorChange && gcode(ColorChange).empty())
+ GUI::wxGetApp().plater()->get_notification_manager()->push_notification(GUI::NotificationType::EmptyColorChangeCode);
+
const int extruder = selected_extruder > 0 ? selected_extruder : std::max<int>(1, m_only_extruder);
const auto it = m_ticks.ticks.find(TickCode{ tick });
if ( it == m_ticks.ticks.end() ) {
// try to add tick
- if (!m_ticks.add_tick(tick, code, extruder, m_values[tick]))
+ if (!m_ticks.add_tick(tick, type, extruder, m_values[tick]))
return;
}
- else if (code == ToolChangeCode || code == ColorChangeCode) {
- // try to switch tick code to ToolChangeCode or ColorChangeCode accordingly
- if (!m_ticks.switch_code_for_tick(it, code, extruder))
+ else if (type == ToolChange || type == ColorChange) {
+ // try to switch tick code to ToolChange or ColorChange accordingly
+ if (!m_ticks.switch_code_for_tick(it, type, extruder))
return;
}
else
return;
- post_ticks_changed_event(code);
+ post_ticks_changed_event(type);
}
void Control::add_current_tick(bool call_from_keyboard /*= false*/)
@@ -1698,16 +2045,16 @@ void Control::add_current_tick(bool call_from_keyboard /*= false*/)
auto it = m_ticks.ticks.find(TickCode{ tick });
if (it != m_ticks.ticks.end() || // this tick is already exist
- !check_ticks_changed_event(m_mode == t_mode::MultiAsSingle ? ToolChangeCode : ColorChangeCode))
+ !check_ticks_changed_event(m_mode == MultiAsSingle ? ToolChange : ColorChange))
return;
- if (m_mode == t_mode::SingleExtruder)
- add_code_as_tick(ColorChangeCode);
+ if (m_mode == SingleExtruder)
+ add_code_as_tick(ColorChange);
else
{
wxMenu menu;
- if (m_mode == t_mode::MultiAsSingle)
+ if (m_mode == MultiAsSingle)
append_change_extruder_menu_item(&menu);
else
append_add_color_change_menu_item(&menu);
@@ -1716,8 +2063,7 @@ void Control::add_current_tick(bool call_from_keyboard /*= false*/)
/* Menu position will be calculated from mouse click position, but...
* if function is called from keyboard (pressing "+"), we should to calculate it
* */
- if (call_from_keyboard)
- {
+ if (call_from_keyboard) {
int width, height;
get_size(&width, &height);
@@ -1740,12 +2086,12 @@ void Control::delete_current_tick()
auto it = m_ticks.ticks.find(TickCode{ m_selection == ssLower ? m_lower_value : m_higher_value });
if (it == m_ticks.ticks.end() ||
- !check_ticks_changed_event(it->gcode))
+ !check_ticks_changed_event(it->type))
return;
- const std::string code = it->gcode;
+ Type type = it->type;
m_ticks.ticks.erase(it);
- post_ticks_changed_event(code);
+ post_ticks_changed_event(type);
}
void Control::edit_tick(int tick/* = -1*/)
@@ -1755,12 +2101,12 @@ void Control::edit_tick(int tick/* = -1*/)
const std::set<TickCode>::iterator it = m_ticks.ticks.find(TickCode{ tick });
if (it == m_ticks.ticks.end() ||
- !check_ticks_changed_event(it->gcode))
+ !check_ticks_changed_event(it->type))
return;
- const std::string code = it->gcode;
+ Type type = it->type;
if (m_ticks.edit_tick(it, m_values[it->tick]))
- post_ticks_changed_event(code);
+ post_ticks_changed_event(type);
}
// switch on/off one layer mode
@@ -1772,7 +2118,7 @@ void Control::switch_one_layer_mode()
SetHigherValue(m_max_value);
}
m_selection == ssLower ? correct_lower_value() : correct_higher_value();
- if (!m_selection) m_selection = ssHigher;
+ if (m_selection == ssUndef) m_selection = ssHigher;
}
// discard all custom changes on DoubleSlider
@@ -1782,7 +2128,7 @@ void Control::discard_all_thicks()
SetHigherValue(m_max_value);
m_selection == ssLower ? correct_lower_value() : correct_higher_value();
- if (!m_selection) m_selection = ssHigher;
+ if (m_selection == ssUndef) m_selection = ssHigher;
m_ticks.ticks.clear();
post_ticks_changed_event();
@@ -1796,26 +2142,21 @@ void Control::move_current_thumb_to_pos(wxPoint pos)
const int tick_val = get_tick_near_point(pos);
const int mouse_val = tick_val >= 0 && m_draw_mode == dmRegular ? tick_val :
get_value_from_position(pos);
- if (mouse_val >= 0)
- {
- // if (abs(mouse_val - m_lower_value) < abs(mouse_val - m_higher_value)) {
- // if (mouse_val <= m_lower_value) {
+ if (mouse_val >= 0) {
if (m_selection == ssLower) {
SetLowerValue(mouse_val);
correct_lower_value();
- // m_selection = ssLower;
}
- else {
+ else { // even m_selection is ssUndef, upper thumb should be selected
SetHigherValue(mouse_val);
correct_higher_value();
- m_selection = ssHigher;
}
}
}
void Control::edit_extruder_sequence()
{
- if (!check_ticks_changed_event(ToolChangeCode))
+ if (!check_ticks_changed_event(ToolChange))
return;
GUI::ExtruderSequenceDialog dlg(m_extruders_sequence);
@@ -1823,7 +2164,7 @@ void Control::edit_extruder_sequence()
return;
m_extruders_sequence = dlg.GetValue();
- m_ticks.erase_all_ticks_with_code(ToolChangeCode);
+ m_ticks.erase_all_ticks_with_code(ToolChange);
int tick = 0;
double value = 0.0;
@@ -1836,13 +2177,12 @@ void Control::edit_extruder_sequence()
bool meaningless_tick = tick == 0.0 && cur_extruder == extruder;
if (!meaningless_tick)
- m_ticks.ticks.emplace(TickCode{tick, ToolChangeCode, cur_extruder + 1, m_extruder_colors[cur_extruder]});
+ m_ticks.ticks.emplace(TickCode{tick, ToolChange,cur_extruder + 1, m_extruder_colors[cur_extruder]});
extruder++;
if (extruder == extr_cnt)
extruder = 0;
- if (m_extruders_sequence.is_mm_intervals)
- {
+ if (m_extruders_sequence.is_mm_intervals) {
value += m_extruders_sequence.interval_by_mm;
auto val_it = std::lower_bound(m_values.begin(), m_values.end(), value - epsilon());
@@ -1855,17 +2195,17 @@ void Control::edit_extruder_sequence()
tick += m_extruders_sequence.interval_by_layers;
}
- post_ticks_changed_event(ToolChangeCode);
+ post_ticks_changed_event(ToolChange);
}
-void Control::jump_to_print_z()
+void Control::jump_to_value()
{
- double print_z = get_print_z_to_jump(m_values[m_selection == ssLower ? m_lower_value : m_higher_value],
- m_values[m_min_value], m_values[m_max_value]);
- if (print_z < 0)
+ double value = get_value_to_jump(m_values[m_selection == ssLower ? m_lower_value : m_higher_value],
+ m_values[m_min_value], m_values[m_max_value], m_draw_mode);
+ if (value < 0.0)
return;
- auto it = std::lower_bound(m_values.begin(), m_values.end(), print_z - epsilon());
+ auto it = std::lower_bound(m_values.begin(), m_values.end(), value - epsilon());
int tick_value = it - m_values.begin();
if (m_selection == ssLower)
@@ -1874,64 +2214,63 @@ void Control::jump_to_print_z()
SetHigherValue(tick_value);
}
-void Control::post_ticks_changed_event(const std::string& gcode /*= ""*/)
+void Control::post_ticks_changed_event(Type type /*= Custom*/)
{
- m_force_mode_apply = (gcode.empty() || gcode == ColorChangeCode || gcode == ToolChangeCode);
+// m_force_mode_apply = type != ToolChange; // It looks like this condition is no needed now. Leave it for the testing
wxPostEvent(this->GetParent(), wxCommandEvent(wxCUSTOMEVT_TICKSCHANGED));
}
-bool Control::check_ticks_changed_event(const std::string& gcode)
+bool Control::check_ticks_changed_event(Type type)
{
if ( m_ticks.mode == m_mode ||
- (gcode != ColorChangeCode && gcode != ToolChangeCode) ||
- (m_ticks.mode == t_mode::SingleExtruder && m_mode == t_mode::MultiAsSingle) || // All ColorChanges will be applied for 1st extruder
- (m_ticks.mode == t_mode::MultiExtruder && m_mode == t_mode::MultiAsSingle) ) // Just mark ColorChanges for all unused extruders
+ (type != ColorChange && type != ToolChange) ||
+ (m_ticks.mode == SingleExtruder && m_mode == MultiAsSingle) || // All ColorChanges will be applied for 1st extruder
+ (m_ticks.mode == MultiExtruder && m_mode == MultiAsSingle) ) // Just mark ColorChanges for all unused extruders
return true;
- if ((m_ticks.mode == t_mode::SingleExtruder && m_mode == t_mode::MultiExtruder ) ||
- (m_ticks.mode == t_mode::MultiExtruder && m_mode == t_mode::SingleExtruder) )
+ if ((m_ticks.mode == SingleExtruder && m_mode == MultiExtruder ) ||
+ (m_ticks.mode == MultiExtruder && m_mode == SingleExtruder) )
{
- if (!m_ticks.has_tick_with_code(ColorChangeCode))
+ if (!m_ticks.has_tick_with_code(ColorChange))
return true;
- wxString message = (m_ticks.mode == t_mode::SingleExtruder ?
- _(L("The last color change data was saved for a single extruder printing.")) :
- _(L("The last color change data was saved for a multi extruder printing."))
+ wxString message = (m_ticks.mode == SingleExtruder ?
+ _L("The last color change data was saved for a single extruder printing.") :
+ _L("The last color change data was saved for a multi extruder printing.")
) + "\n" +
- _(L("Your current changes will delete all saved color changes.")) + "\n\n\t" +
- _(L("Are you sure you want to continue?"));
+ _L("Your current changes will delete all saved color changes.") + "\n\n\t" +
+ _L("Are you sure you want to continue?");
- wxMessageDialog msg(this, message, _(L("Notice")), wxYES_NO);
+ wxMessageDialog msg(this, message, _L("Notice"), wxYES_NO);
if (msg.ShowModal() == wxID_YES) {
- m_ticks.erase_all_ticks_with_code(ColorChangeCode);
- post_ticks_changed_event(ColorChangeCode);
+ m_ticks.erase_all_ticks_with_code(ColorChange);
+ post_ticks_changed_event(ColorChange);
}
return false;
}
- // m_ticks_mode == t_mode::MultiAsSingle
- if( m_ticks.has_tick_with_code(ToolChangeCode) )
- {
- wxString message = m_mode == t_mode::SingleExtruder ? (
- _(L("The last color change data was saved for a multi extruder printing.")) + "\n\n" +
- _(L("Select YES if you want to delete all saved tool changes, \n"
- "NO if you want all tool changes switch to color changes, \n"
- "or CANCEL to leave it unchanged.")) + "\n\n\t" +
- _(L("Do you want to delete all saved tool changes?"))
- ) : ( // t_mode::MultiExtruder
- _(L("The last color change data was saved for a multi extruder printing with tool changes for whole print.")) + "\n\n" +
- _(L("Your current changes will delete all saved extruder (tool) changes.")) + "\n\n\t" +
- _(L("Are you sure you want to continue?")) ) ;
-
- wxMessageDialog msg(this, message, _(L("Notice")), wxYES_NO | (m_mode == t_mode::SingleExtruder ? wxCANCEL : 0));
+ // m_ticks_mode == MultiAsSingle
+ if( m_ticks.has_tick_with_code(ToolChange) ) {
+ wxString message = m_mode == SingleExtruder ? (
+ _L("The last color change data was saved for a multi extruder printing.") + "\n\n" +
+ _L("Select YES if you want to delete all saved tool changes, \n"
+ "NO if you want all tool changes switch to color changes, \n"
+ "or CANCEL to leave it unchanged.") + "\n\n\t" +
+ _L("Do you want to delete all saved tool changes?")
+ ): ( // MultiExtruder
+ _L("The last color change data was saved for a multi extruder printing with tool changes for whole print.") + "\n\n" +
+ _L("Your current changes will delete all saved extruder (tool) changes.") + "\n\n\t" +
+ _L("Are you sure you want to continue?") ) ;
+
+ wxMessageDialog msg(this, message, _L("Notice"), wxYES_NO | (m_mode == SingleExtruder ? wxCANCEL : 0));
const int answer = msg.ShowModal();
if (answer == wxID_YES) {
- m_ticks.erase_all_ticks_with_code(ToolChangeCode);
- post_ticks_changed_event(ToolChangeCode);
+ m_ticks.erase_all_ticks_with_code(ToolChange);
+ post_ticks_changed_event(ToolChange);
}
- else if (m_mode == t_mode::SingleExtruder && answer == wxID_NO) {
- m_ticks.switch_code(ToolChangeCode, ColorChangeCode);
- post_ticks_changed_event(ColorChangeCode);
+ else if (m_mode == SingleExtruder && answer == wxID_NO) {
+ m_ticks.switch_code(ToolChange, ColorChange);
+ post_ticks_changed_event(ColorChange);
}
return false;
}
@@ -1939,11 +2278,10 @@ bool Control::check_ticks_changed_event(const std::string& gcode)
return true;
}
-std::string TickCodeInfo::get_color_for_tick(TickCode tick, const std::string& code, const int extruder)
+std::string TickCodeInfo::get_color_for_tick(TickCode tick, Type type, const int extruder)
{
- if (mode == t_mode::SingleExtruder && code == ColorChangeCode && m_use_default_colors)
- {
- const std::vector<std::string>& colors = GCodePreviewData::ColorPrintColors();
+ if (mode == SingleExtruder && type == ColorChange && m_use_default_colors) {
+ const std::vector<std::string>& colors = ColorPrintColors::get();
if (ticks.empty())
return colors[0];
m_default_color_idx++;
@@ -1953,14 +2291,12 @@ std::string TickCodeInfo::get_color_for_tick(TickCode tick, const std::string& c
std::string color = (*m_colors)[extruder - 1];
- if (code == ColorChangeCode)
- {
- if (!ticks.empty())
- {
+ if (type == ColorChange) {
+ if (!ticks.empty()) {
auto before_tick_it = std::lower_bound(ticks.begin(), ticks.end(), tick );
while (before_tick_it != ticks.begin()) {
--before_tick_it;
- if (before_tick_it->gcode == ColorChangeCode && before_tick_it->extruder == extruder) {
+ if (before_tick_it->type == ColorChange && before_tick_it->extruder == extruder) {
color = before_tick_it->color;
break;
}
@@ -1972,63 +2308,65 @@ std::string TickCodeInfo::get_color_for_tick(TickCode tick, const std::string& c
return color;
}
-bool TickCodeInfo::add_tick(const int tick, std::string& code, const int extruder, double print_z)
+bool TickCodeInfo::add_tick(const int tick, Type type, const int extruder, double print_z)
{
std::string color;
- if (code.empty()) // custom Gcode
+ std::string extra;
+ if (type == Custom) // custom Gcode
{
- code = get_custom_code(custom_gcode, print_z);
- if (code.empty())
+ extra = get_custom_code(custom_gcode, print_z);
+ if (extra.empty())
return false;
- custom_gcode = code;
+ custom_gcode = extra;
}
- else if (code == PausePrintCode)
- {
- /* PausePrintCode doesn't need a color, so
- * this field is used for save a short message shown on Printer display
- * */
- color = get_pause_print_msg(pause_print_msg, print_z);
- if (color.empty())
+ else if (type == PausePrint) {
+ extra = get_pause_print_msg(pause_print_msg, print_z);
+ if (extra.empty())
return false;
- pause_print_msg = color;
+ pause_print_msg = extra;
}
- else
- {
- color = get_color_for_tick(TickCode{ tick }, code, extruder);
+ else {
+ color = get_color_for_tick(TickCode{ tick }, type, extruder);
if (color.empty())
return false;
}
- if (mode == t_mode::SingleExtruder)
+ if (mode == SingleExtruder)
m_use_default_colors = true;
- ticks.emplace(TickCode{ tick, code, extruder, color });
+ ticks.emplace(TickCode{ tick, type, extruder, color, extra });
return true;
}
bool TickCodeInfo::edit_tick(std::set<TickCode>::iterator it, double print_z)
{
std::string edited_value;
- if (it->gcode == ColorChangeCode)
+ if (it->type == ColorChange)
edited_value = get_new_color(it->color);
- else if (it->gcode == PausePrintCode)
- edited_value = get_pause_print_msg(it->color, print_z);
+ else if (it->type == PausePrint)
+ edited_value = get_pause_print_msg(it->extra, print_z);
else
- edited_value = get_custom_code(it->gcode, print_z);
+ edited_value = get_custom_code(it->type == Template ? gcode(Template) : it->extra, print_z);
if (edited_value.empty())
return false;
TickCode changed_tick = *it;
- if (it->gcode == ColorChangeCode || it->gcode == PausePrintCode) {
+ if (it->type == ColorChange) {
if (it->color == edited_value)
return false;
changed_tick.color = edited_value;
}
- else {
- if (it->gcode == edited_value)
+ else if (it->type == Template) {
+ if (gcode(Template) == edited_value)
return false;
- changed_tick.gcode = edited_value;
+ changed_tick.extra = edited_value;
+ changed_tick.type = Custom;
+ }
+ else if (it->type == Custom || it->type == PausePrint) {
+ if (it->extra == edited_value)
+ return false;
+ changed_tick.extra = edited_value;
}
ticks.erase(it);
@@ -2037,13 +2375,12 @@ bool TickCodeInfo::edit_tick(std::set<TickCode>::iterator it, double print_z)
return true;
}
-void TickCodeInfo::switch_code(const std::string& code_from, const std::string& code_to)
+void TickCodeInfo::switch_code(Type type_from, Type type_to)
{
for (auto it{ ticks.begin() }, end{ ticks.end() }; it != end; )
- if (it->gcode == code_from)
- {
+ if (it->type == type_from) {
TickCode tick = *it;
- tick.gcode = code_to;
+ tick.type = type_to;
tick.extruder = 1;
ticks.erase(it);
it = ticks.emplace(tick).first;
@@ -2052,14 +2389,14 @@ void TickCodeInfo::switch_code(const std::string& code_from, const std::string&
++it;
}
-bool TickCodeInfo::switch_code_for_tick(std::set<TickCode>::iterator it, const std::string& code_to, const int extruder)
+bool TickCodeInfo::switch_code_for_tick(std::set<TickCode>::iterator it, Type type_to, const int extruder)
{
- const std::string color = get_color_for_tick(*it, code_to, extruder);
+ const std::string color = get_color_for_tick(*it, type_to, extruder);
if (color.empty())
return false;
- TickCode changed_tick = *it;
- changed_tick.gcode = code_to;
+ TickCode changed_tick = *it;
+ changed_tick.type = type_to;
changed_tick.extruder = extruder;
changed_tick.color = color;
@@ -2069,37 +2406,36 @@ bool TickCodeInfo::switch_code_for_tick(std::set<TickCode>::iterator it, const s
return true;
}
-void TickCodeInfo::erase_all_ticks_with_code(const std::string& gcode)
+void TickCodeInfo::erase_all_ticks_with_code(Type type)
{
for (auto it{ ticks.begin() }, end{ ticks.end() }; it != end; ) {
- if (it->gcode == gcode)
+ if (it->type == type)
it = ticks.erase(it);
else
++it;
}
}
-bool TickCodeInfo::has_tick_with_code(const std::string& gcode)
+bool TickCodeInfo::has_tick_with_code(Type type)
{
for (const TickCode& tick : ticks)
- if (tick.gcode == gcode)
+ if (tick.type == type)
return true;
return false;
}
-ConflictType TickCodeInfo::is_conflict_tick(const TickCode& tick, t_mode out_mode, int only_extruder, double print_z)
+ConflictType TickCodeInfo::is_conflict_tick(const TickCode& tick, Mode out_mode, int only_extruder, double print_z)
{
- if ((tick.gcode == ColorChangeCode && (
- (mode == t_mode::SingleExtruder && out_mode == t_mode::MultiExtruder ) ||
- (mode == t_mode::MultiExtruder && out_mode == t_mode::SingleExtruder) )) ||
- (tick.gcode == ToolChangeCode &&
- (mode == t_mode::MultiAsSingle && out_mode != t_mode::MultiAsSingle)) )
+ if ((tick.type == ColorChange && (
+ (mode == SingleExtruder && out_mode == MultiExtruder ) ||
+ (mode == MultiExtruder && out_mode == SingleExtruder) )) ||
+ (tick.type == ToolChange &&
+ (mode == MultiAsSingle && out_mode != MultiAsSingle)) )
return ctModeConflict;
// check ColorChange tick
- if (tick.gcode == ColorChangeCode)
- {
+ if (tick.type == ColorChange) {
// We should mark a tick as a "MeaninglessColorChange",
// if it has a ColorChange for unused extruder from current print to end of the print
std::set<int> used_extruders_for_tick = get_used_extruders_for_tick(tick.tick, only_extruder, print_z, out_mode);
@@ -2109,15 +2445,15 @@ ConflictType TickCodeInfo::is_conflict_tick(const TickCode& tick, t_mode out_mod
// We should mark a tick as a "Redundant",
// if it has a ColorChange for extruder that has not been used before
- if (mode == t_mode::MultiAsSingle && tick.extruder != std::max<int>(only_extruder, 1) )
+ if (mode == MultiAsSingle && tick.extruder != std::max<int>(only_extruder, 1) )
{
auto it = ticks.lower_bound( tick );
- if (it == ticks.begin() && it->gcode == ToolChangeCode && tick.extruder == it->extruder)
+ if (it == ticks.begin() && it->type == ToolChange && tick.extruder == it->extruder)
return ctNone;
while (it != ticks.begin()) {
--it;
- if (it->gcode == ToolChangeCode && tick.extruder == it->extruder)
+ if (it->type == ToolChange && tick.extruder == it->extruder)
return ctNone;
}
@@ -2126,8 +2462,7 @@ ConflictType TickCodeInfo::is_conflict_tick(const TickCode& tick, t_mode out_mod
}
// check ToolChange tick
- if (mode == t_mode::MultiAsSingle && tick.gcode == ToolChangeCode)
- {
+ if (mode == MultiAsSingle && tick.type == ToolChange) {
// We should mark a tick as a "MeaninglessToolChange",
// if it has a ToolChange to the same extruder
auto it = ticks.find(tick);
@@ -2136,7 +2471,7 @@ ConflictType TickCodeInfo::is_conflict_tick(const TickCode& tick, t_mode out_mod
while (it != ticks.begin()) {
--it;
- if (it->gcode == ToolChangeCode)
+ if (it->type == ToolChange)
return tick.extruder == it->extruder ? ctMeaninglessToolChange : ctNone;
}
}
diff --git a/src/slic3r/GUI/DoubleSlider.hpp b/src/slic3r/GUI/DoubleSlider.hpp
index bf8f54d6c..56baef6cf 100644
--- a/src/slic3r/GUI/DoubleSlider.hpp
+++ b/src/slic3r/GUI/DoubleSlider.hpp
@@ -4,7 +4,6 @@
#include "libslic3r/CustomGCode.hpp"
#include "wxExtensions.hpp"
-#include <wx/wx.h>
#include <wx/window.h>
#include <wx/control.h>
#include <wx/dc.h>
@@ -17,12 +16,14 @@ class wxMenu;
namespace Slic3r {
+using namespace CustomGCode;
+
namespace DoubleSlider {
/* For exporting GCode in GCodeWriter is used XYZF_NUM(val) = PRECISION(val, 3) for XYZ values.
* So, let use same value as a permissible error for layer height.
*/
-static double epsilon() { return 0.0011;}
+constexpr double epsilon() { return 0.0011; }
// custom message the slider sends to its parent to notify a tick-change:
wxDECLARE_EVENT(wxCUSTOMEVT_TICKSCHANGED, wxEvent);
@@ -40,6 +41,8 @@ enum FocusedItem {
fiCogIcon,
fiColorBand,
fiActionIcon,
+ fiLowerThumb,
+ fiHigherThumb,
fiTick
};
@@ -71,9 +74,15 @@ enum DrawMode
dmRegular,
dmSlaPrint,
dmSequentialFffPrint,
+ dmSequentialGCodeView,
};
-using t_mode = CustomGCode::Mode;
+enum LabelType
+{
+ ltHeightWithLayer,
+ ltHeight,
+ ltEstimatedTime,
+};
struct TickCode
{
@@ -81,9 +90,10 @@ struct TickCode
bool operator>(const TickCode& other) const { return other.tick < this->tick; }
int tick = 0;
- std::string gcode = ColorChangeCode;
+ Type type = ColorChange;
int extruder = 0;
std::string color;
+ std::string extra;
};
class TickCodeInfo
@@ -97,27 +107,27 @@ class TickCodeInfo
std::vector<std::string>* m_colors {nullptr};
- std::string get_color_for_tick(TickCode tick, const std::string& code, const int extruder);
+ std::string get_color_for_tick(TickCode tick, Type type, const int extruder);
public:
std::set<TickCode> ticks {};
- t_mode mode = t_mode::Undef;
+ Mode mode = Undef;
bool empty() const { return ticks.empty(); }
void set_pause_print_msg(const std::string& message) { pause_print_msg = message; }
- bool add_tick(const int tick, std::string& code, int extruder, double print_z);
+ bool add_tick(const int tick, Type type, int extruder, double print_z);
bool edit_tick(std::set<TickCode>::iterator it, double print_z);
- void switch_code(const std::string& code_from, const std::string& code_to);
- bool switch_code_for_tick(std::set<TickCode>::iterator it, const std::string& code_to, const int extruder);
- void erase_all_ticks_with_code(const std::string& gcode);
+ void switch_code(Type type_from, Type type_to);
+ bool switch_code_for_tick(std::set<TickCode>::iterator it, Type type_to, const int extruder);
+ void erase_all_ticks_with_code(Type type);
- bool has_tick_with_code(const std::string& gcode);
- ConflictType is_conflict_tick(const TickCode& tick, t_mode out_mode, int only_extruder, double print_z);
+ bool has_tick_with_code(Type type);
+ ConflictType is_conflict_tick(const TickCode& tick, Mode out_mode, int only_extruder, double print_z);
// Get used extruders for tick.
// Means all extruders(tools) which will be used during printing from current tick to the end
- std::set<int> get_used_extruders_for_tick(int tick, int only_extruder, double print_z, t_mode force_mode = t_mode::Undef) const;
+ std::set<int> get_used_extruders_for_tick(int tick, int only_extruder, double print_z, Mode force_mode = Undef) const;
void suppress_plus (bool suppress) { m_suppress_plus = suppress; }
void suppress_minus(bool suppress) { m_suppress_minus = suppress; }
@@ -202,26 +212,32 @@ public:
void SetMaxValue(const int max_value);
void SetKoefForLabels(const double koef) { m_label_koef = koef; }
- void SetSliderValues(const std::vector<double>& values) { m_values = values; }
+ void SetSliderValues(const std::vector<double>& values);
void ChangeOneLayerLock();
- CustomGCode::Info GetTicksValues() const;
- void SetTicksValues(const Slic3r::CustomGCode::Info &custom_gcode_per_print_z);
+ Info GetTicksValues() const;
+ void SetTicksValues(const Info &custom_gcode_per_print_z);
+ void SetLayersTimes(const std::vector<float>& layers_times);
+ void SetLayersTimes(const std::vector<double>& layers_times);
void SetDrawMode(bool is_sla_print, bool is_sequential_print);
+ void SetDrawMode(DrawMode mode) { m_draw_mode = mode; }
- void SetManipulationMode(t_mode mode) { m_mode = mode; }
- t_mode GetManipulationMode() const { return m_mode; }
+ void SetManipulationMode(Mode mode) { m_mode = mode; }
+ Mode GetManipulationMode() const { return m_mode; }
void SetModeAndOnlyExtruder(const bool is_one_extruder_printed_model, const int only_extruder);
void SetExtruderColors(const std::vector<std::string>& extruder_colors);
+ void set_render_as_disabled(bool value) { m_render_as_disabled = value; }
+ bool is_rendering_as_disabled() const { return m_render_as_disabled; }
+
bool is_horizontal() const { return m_style == wxSL_HORIZONTAL; }
bool is_one_layer() const { return m_is_one_layer; }
bool is_lower_at_min() const { return m_lower_value == m_min_value; }
bool is_higher_at_max() const { return m_higher_value == m_max_value; }
bool is_full_span() const { return this->is_lower_at_min() && this->is_higher_at_max(); }
- void OnPaint(wxPaintEvent& ) { render();}
+ void OnPaint(wxPaintEvent& ) { render(); }
void OnLeftDown(wxMouseEvent& event);
void OnMotion(wxMouseEvent& event);
void OnLeftUp(wxMouseEvent& event);
@@ -235,7 +251,7 @@ public:
void OnRightDown(wxMouseEvent& event);
void OnRightUp(wxMouseEvent& event);
- void add_code_as_tick(std::string code, int selected_extruder = -1);
+ void add_code_as_tick(Type type, int selected_extruder = -1);
// add default action for tick, when press "+"
void add_current_tick(bool call_from_keyboard = false);
// delete current tick, when press "-"
@@ -245,7 +261,8 @@ public:
void discard_all_thicks();
void move_current_thumb_to_pos(wxPoint pos);
void edit_extruder_sequence();
- void jump_to_print_z();
+ void jump_to_value();
+ void enable_action_icon(bool enable) { m_enable_action_icon = enable; }
void show_add_context_menu();
void show_edit_context_menu();
void show_cog_icon_context_menu();
@@ -260,18 +277,21 @@ protected:
void draw_scroll_line(wxDC& dc, const int lower_pos, const int higher_pos);
void draw_thumb(wxDC& dc, const wxCoord& pos_coord, const SelectedSlider& selection);
void draw_thumbs(wxDC& dc, const wxCoord& lower_pos, const wxCoord& higher_pos);
+ void draw_ticks_pair(wxDC& dc, wxCoord pos, wxCoord mid, int tick_len);
void draw_ticks(wxDC& dc);
void draw_colored_band(wxDC& dc);
+ void draw_ruler(wxDC& dc);
void draw_one_layer_icon(wxDC& dc);
void draw_revert_icon(wxDC& dc);
void draw_cog_icon(wxDC &dc);
void draw_thumb_item(wxDC& dc, const wxPoint& pos, const SelectedSlider& selection);
void draw_info_line_with_icon(wxDC& dc, const wxPoint& pos, SelectedSlider selection);
void draw_tick_on_mouse_position(wxDC &dc);
- void draw_tick_text(wxDC& dc, const wxPoint& pos, int tick, bool right_side = true) const;
+ void draw_tick_text(wxDC& dc, const wxPoint& pos, int tick, LabelType label_type = ltHeight, bool right_side = true) const;
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);
+ 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();
@@ -284,16 +304,16 @@ private:
int get_tick_near_point(const wxPoint& pt);
double get_scroll_step();
- wxString get_label(int tick) const;
+ wxString get_label(int tick, LabelType label_type = ltHeightWithLayer) const;
void get_lower_and_higher_position(int& lower_pos, int& higher_pos);
int get_value_from_position(const wxCoord x, const wxCoord y);
int get_value_from_position(const wxPoint pos) { return get_value_from_position(pos.x, pos.y); }
wxCoord get_position_from_value(const int value);
- wxSize get_size();
- void get_size(int *w, int *h);
+ wxSize get_size() const;
+ void get_size(int* w, int* h) const;
double get_double_value(const SelectedSlider& selection);
wxString get_tooltip(int tick = -1);
- int get_edited_tick_for_position(wxPoint pos, const std::string& gcode = ColorChangeCode);
+ int get_edited_tick_for_position(wxPoint pos, Type type = ColorChange);
std::string get_color_for_tool_change_tick(std::set<TickCode>::const_iterator it) const;
std::string get_color_for_color_change_tick(std::set<TickCode>::const_iterator it) const;
@@ -305,8 +325,8 @@ private:
// Use those values to disable selection of active extruders
std::array<int, 2> get_active_extruders_for_tick(int tick) const;
- void post_ticks_changed_event(const std::string& gcode = "");
- bool check_ticks_changed_event(const std::string& gcode);
+ void post_ticks_changed_event(Type type = Custom);
+ bool check_ticks_changed_event(Type type);
void append_change_extruder_menu_item (wxMenu*, bool switch_current_code = false);
void append_add_color_change_menu_item(wxMenu*, bool switch_current_code = false);
@@ -317,6 +337,9 @@ private:
int m_max_value;
int m_lower_value;
int m_higher_value;
+
+ bool m_render_as_disabled{ false };
+
ScalableBitmap m_bmp_thumb_higher;
ScalableBitmap m_bmp_thumb_lower;
ScalableBitmap m_bmp_add_tick_on;
@@ -335,10 +358,11 @@ private:
bool m_is_one_layer = false;
bool m_is_focused = false;
bool m_force_mode_apply = true;
+ bool m_enable_action_icon = true;
DrawMode m_draw_mode = dmRegular;
- t_mode m_mode = t_mode::SingleExtruder;
+ Mode m_mode = SingleExtruder;
int m_only_extruder = -1;
MouseAction m_mouse = maNone;
@@ -357,10 +381,12 @@ private:
int m_revert_icon_dim;
int m_cog_icon_dim;
long m_style;
+ long m_extra_style;
float m_label_koef = 1.0;
std::vector<double> m_values;
TickCodeInfo m_ticks;
+ std::vector<double> m_layers_times;
std::vector<std::string> m_extruder_colors;
@@ -377,6 +403,15 @@ private:
std::vector<wxPen*> m_line_pens;
std::vector<wxPen*> m_segm_pens;
+
+ struct Ruler {
+ double long_step;
+ double short_step;
+ int count { 1 }; // > 1 for sequential print
+
+ void update(wxWindow* win, const std::vector<double>& values, double scroll_step);
+ bool is_ok() { return long_step > 0 && short_step > 0; }
+ } m_ruler;
};
} // DoubleSlider;
diff --git a/src/slic3r/GUI/ExtraRenderers.cpp b/src/slic3r/GUI/ExtraRenderers.cpp
new file mode 100644
index 000000000..27e2c1224
--- /dev/null
+++ b/src/slic3r/GUI/ExtraRenderers.cpp
@@ -0,0 +1,333 @@
+#include "ExtraRenderers.hpp"
+#include "wxExtensions.hpp"
+#include "GUI.hpp"
+#include "I18N.hpp"
+
+#include <wx/dc.h>
+#ifdef wxHAS_GENERIC_DATAVIEWCTRL
+#include "wx/generic/private/markuptext.h"
+#include "wx/generic/private/rowheightcache.h"
+#include "wx/generic/private/widthcalc.h"
+#endif
+/*
+#ifdef __WXGTK__
+#include "wx/gtk/private.h"
+#include "wx/gtk/private/value.h"
+#endif
+*/
+#if wxUSE_ACCESSIBILITY
+#include "wx/private/markupparser.h"
+#endif // wxUSE_ACCESSIBILITY
+
+using Slic3r::GUI::from_u8;
+using Slic3r::GUI::into_u8;
+
+
+//-----------------------------------------------------------------------------
+// DataViewBitmapText
+//-----------------------------------------------------------------------------
+
+wxIMPLEMENT_DYNAMIC_CLASS(DataViewBitmapText, wxObject)
+
+IMPLEMENT_VARIANT_OBJECT(DataViewBitmapText)
+
+// ---------------------------------------------------------
+// BitmapTextRenderer
+// ---------------------------------------------------------
+
+#if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING
+BitmapTextRenderer::BitmapTextRenderer(wxDataViewCellMode mode /*= wxDATAVIEW_CELL_EDITABLE*/,
+ int align /*= wxDVR_DEFAULT_ALIGNMENT*/):
+wxDataViewRenderer(wxT("PrusaDataViewBitmapText"), mode, align)
+{
+ SetMode(mode);
+ SetAlignment(align);
+}
+#endif // ENABLE_NONCUSTOM_DATA_VIEW_RENDERING
+
+BitmapTextRenderer::~BitmapTextRenderer()
+{
+#ifdef SUPPORTS_MARKUP
+ #ifdef wxHAS_GENERIC_DATAVIEWCTRL
+ if (m_markupText)
+ delete m_markupText;
+ #endif //wxHAS_GENERIC_DATAVIEWCTRL
+#endif // SUPPORTS_MARKUP
+}
+
+void BitmapTextRenderer::EnableMarkup(bool enable)
+{
+#ifdef SUPPORTS_MARKUP
+#ifdef wxHAS_GENERIC_DATAVIEWCTRL
+ if (enable) {
+ if (!m_markupText)
+ m_markupText = new wxItemMarkupText(wxString());
+ }
+ else {
+ if (m_markupText) {
+ delete m_markupText;
+ m_markupText = nullptr;
+ }
+ }
+#else
+ is_markupText = enable;
+#endif //wxHAS_GENERIC_DATAVIEWCTRL
+#endif // SUPPORTS_MARKUP
+}
+
+bool BitmapTextRenderer::SetValue(const wxVariant &value)
+{
+ m_value << value;
+
+#ifdef SUPPORTS_MARKUP
+#ifdef wxHAS_GENERIC_DATAVIEWCTRL
+ if (m_markupText)
+ m_markupText->SetMarkup(m_value.GetText());
+ /*
+#else
+#if defined(__WXGTK__)
+ GValue gvalue = G_VALUE_INIT;
+ g_value_init(&gvalue, G_TYPE_STRING);
+ g_value_set_string(&gvalue, wxGTK_CONV_FONT(str.GetText(), GetOwner()->GetOwner()->GetFont()));
+ g_object_set_property(G_OBJECT(m_renderer/ *.GetText()* /), is_markupText ? "markup" : "text", &gvalue);
+ g_value_unset(&gvalue);
+#endif // __WXGTK__
+ */
+#endif // wxHAS_GENERIC_DATAVIEWCTRL
+#endif // SUPPORTS_MARKUP
+
+ return true;
+}
+
+bool BitmapTextRenderer::GetValue(wxVariant& WXUNUSED(value)) const
+{
+ return false;
+}
+
+#if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING && wxUSE_ACCESSIBILITY
+wxString BitmapTextRenderer::GetAccessibleDescription() const
+{
+#ifdef SUPPORTS_MARKUP
+ if (m_markupText)
+ return wxMarkupParser::Strip(m_text);
+#endif // SUPPORTS_MARKUP
+
+ return m_value.GetText();
+}
+#endif // wxUSE_ACCESSIBILITY && ENABLE_NONCUSTOM_DATA_VIEW_RENDERING
+
+bool BitmapTextRenderer::Render(wxRect rect, wxDC *dc, int state)
+{
+ int xoffset = 0;
+
+ const wxBitmap& icon = m_value.GetBitmap();
+ if (icon.IsOk())
+ {
+#ifdef __APPLE__
+ wxSize icon_sz = icon.GetScaledSize();
+#else
+ wxSize icon_sz = icon.GetSize();
+#endif
+ dc->DrawBitmap(icon, rect.x, rect.y + (rect.height - icon_sz.y) / 2);
+ xoffset = icon_sz.x + 4;
+ }
+
+#if defined(SUPPORTS_MARKUP) && defined(wxHAS_GENERIC_DATAVIEWCTRL)
+ if (m_markupText)
+ {
+ rect.x += xoffset;
+ m_markupText->Render(GetView(), *dc, rect, 0, GetEllipsizeMode());
+ }
+ else
+#endif // SUPPORTS_MARKUP && wxHAS_GENERIC_DATAVIEWCTRL
+ RenderText(m_value.GetText(), xoffset, rect, dc, state);
+
+ return true;
+}
+
+wxSize BitmapTextRenderer::GetSize() const
+{
+ if (!m_value.GetText().empty())
+ {
+ wxSize size;
+#if defined(SUPPORTS_MARKUP) && defined(wxHAS_GENERIC_DATAVIEWCTRL)
+ if (m_markupText)
+ {
+ wxDataViewCtrl* const view = GetView();
+ wxClientDC dc(view);
+ if (GetAttr().HasFont())
+ dc.SetFont(GetAttr().GetEffectiveFont(view->GetFont()));
+
+ size = m_markupText->Measure(dc);
+
+ int lines = m_value.GetText().Freq('\n') + 1;
+ size.SetHeight(size.GetHeight() * lines);
+ }
+ else
+#endif // SUPPORTS_MARKUP && wxHAS_GENERIC_DATAVIEWCTRL
+ size = GetTextExtent(m_value.GetText());
+
+ if (m_value.GetBitmap().IsOk())
+ size.x += m_value.GetBitmap().GetWidth() + 4;
+ return size;
+ }
+ return wxSize(80, 20);
+}
+
+
+wxWindow* BitmapTextRenderer::CreateEditorCtrl(wxWindow* parent, wxRect labelRect, const wxVariant& value)
+{
+ if (can_create_editor_ctrl && !can_create_editor_ctrl())
+ return nullptr;
+
+ DataViewBitmapText data;
+ data << value;
+
+ m_was_unusable_symbol = false;
+
+ wxPoint position = labelRect.GetPosition();
+ if (data.GetBitmap().IsOk()) {
+ const int bmp_width = data.GetBitmap().GetWidth();
+ position.x += bmp_width;
+ labelRect.SetWidth(labelRect.GetWidth() - bmp_width);
+ }
+
+ wxTextCtrl* text_editor = new wxTextCtrl(parent, wxID_ANY, data.GetText(),
+ position, labelRect.GetSize(), wxTE_PROCESS_ENTER);
+ text_editor->SetInsertionPointEnd();
+ text_editor->SelectAll();
+
+ return text_editor;
+}
+
+bool BitmapTextRenderer::GetValueFromEditorCtrl(wxWindow* ctrl, wxVariant& value)
+{
+ wxTextCtrl* text_editor = wxDynamicCast(ctrl, wxTextCtrl);
+ if (!text_editor || text_editor->GetValue().IsEmpty())
+ return false;
+
+ std::string chosen_name = into_u8(text_editor->GetValue());
+ const char* unusable_symbols = "<>:/\\|?*\"";
+ for (size_t i = 0; i < std::strlen(unusable_symbols); i++) {
+ if (chosen_name.find_first_of(unusable_symbols[i]) != std::string::npos) {
+ m_was_unusable_symbol = true;
+ return false;
+ }
+ }
+
+ // The icon can't be edited so get its old value and reuse it.
+ wxVariant valueOld;
+ GetView()->GetModel()->GetValue(valueOld, m_item, /*colName*/0);
+
+ DataViewBitmapText bmpText;
+ bmpText << valueOld;
+
+ // But replace the text with the value entered by user.
+ bmpText.SetText(text_editor->GetValue());
+
+ value << bmpText;
+ return true;
+}
+
+// ----------------------------------------------------------------------------
+// BitmapChoiceRenderer
+// ----------------------------------------------------------------------------
+
+bool BitmapChoiceRenderer::SetValue(const wxVariant& value)
+{
+ m_value << value;
+ return true;
+}
+
+bool BitmapChoiceRenderer::GetValue(wxVariant& value) const
+{
+ value << m_value;
+ return true;
+}
+
+bool BitmapChoiceRenderer::Render(wxRect rect, wxDC* dc, int state)
+{
+ int xoffset = 0;
+
+ const wxBitmap& icon = m_value.GetBitmap();
+ if (icon.IsOk())
+ {
+ dc->DrawBitmap(icon, rect.x, rect.y + (rect.height - icon.GetHeight()) / 2);
+ xoffset = icon.GetWidth() + 4;
+
+ if (rect.height==0)
+ rect.height= icon.GetHeight();
+ }
+
+ RenderText(m_value.GetText(), xoffset, rect, dc, state);
+
+ return true;
+}
+
+wxSize BitmapChoiceRenderer::GetSize() const
+{
+ wxSize sz = GetTextExtent(m_value.GetText());
+
+ if (m_value.GetBitmap().IsOk())
+ sz.x += m_value.GetBitmap().GetWidth() + 4;
+
+ return sz;
+}
+
+
+wxWindow* BitmapChoiceRenderer::CreateEditorCtrl(wxWindow* parent, wxRect labelRect, const wxVariant& value)
+{
+ if (can_create_editor_ctrl && !can_create_editor_ctrl())
+ return nullptr;
+
+ std::vector<wxBitmap*> icons = get_extruder_color_icons();
+ if (icons.empty())
+ return nullptr;
+
+ DataViewBitmapText data;
+ data << value;
+
+ auto c_editor = new wxBitmapComboBox(parent, wxID_ANY, wxEmptyString,
+ labelRect.GetTopLeft(), wxSize(labelRect.GetWidth(), -1),
+ 0, nullptr , wxCB_READONLY);
+
+ int i=0;
+ for (wxBitmap* bmp : icons) {
+ if (i==0) {
+ c_editor->Append(_L("default"), *bmp);
+ ++i;
+ }
+
+ c_editor->Append(wxString::Format("%d", i), *bmp);
+ ++i;
+ }
+ c_editor->SetSelection(atoi(data.GetText().c_str()));
+
+ // to avoid event propagation to other sidebar items
+ c_editor->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent& evt) {
+ evt.StopPropagation();
+ // FinishEditing grabs new selection and triggers config update. We better call
+ // it explicitly, automatic update on KILL_FOCUS didn't work on Linux.
+ this->FinishEditing();
+ });
+
+ return c_editor;
+}
+
+bool BitmapChoiceRenderer::GetValueFromEditorCtrl(wxWindow* ctrl, wxVariant& value)
+{
+ wxBitmapComboBox* c = static_cast<wxBitmapComboBox*>(ctrl);
+ int selection = c->GetSelection();
+ if (selection < 0)
+ return false;
+
+ DataViewBitmapText bmpText;
+
+ bmpText.SetText(c->GetString(selection));
+ bmpText.SetBitmap(c->GetItemBitmap(selection));
+
+ value << bmpText;
+ return true;
+}
+
+
diff --git a/src/slic3r/GUI/ExtraRenderers.hpp b/src/slic3r/GUI/ExtraRenderers.hpp
new file mode 100644
index 000000000..6593963b7
--- /dev/null
+++ b/src/slic3r/GUI/ExtraRenderers.hpp
@@ -0,0 +1,162 @@
+#ifndef slic3r_GUI_ExtraRenderers_hpp_
+#define slic3r_GUI_ExtraRenderers_hpp_
+
+#include <functional>
+
+#include <wx/dataview.h>
+
+#if wxUSE_MARKUP && wxCHECK_VERSION(3, 1, 1)
+ #define SUPPORTS_MARKUP
+#endif
+
+// ----------------------------------------------------------------------------
+// DataViewBitmapText: helper class used by BitmapTextRenderer
+// ----------------------------------------------------------------------------
+
+class DataViewBitmapText : public wxObject
+{
+public:
+ DataViewBitmapText( const wxString &text = wxEmptyString,
+ const wxBitmap& bmp = wxNullBitmap) :
+ m_text(text),
+ m_bmp(bmp)
+ { }
+
+ DataViewBitmapText(const DataViewBitmapText &other)
+ : wxObject(),
+ m_text(other.m_text),
+ m_bmp(other.m_bmp)
+ { }
+
+ void SetText(const wxString &text) { m_text = text; }
+ wxString GetText() const { return m_text; }
+ void SetBitmap(const wxBitmap &bmp) { m_bmp = bmp; }
+ const wxBitmap &GetBitmap() const { return m_bmp; }
+
+ bool IsSameAs(const DataViewBitmapText& other) const {
+ return m_text == other.m_text && m_bmp.IsSameAs(other.m_bmp);
+ }
+
+ bool operator==(const DataViewBitmapText& other) const {
+ return IsSameAs(other);
+ }
+
+ bool operator!=(const DataViewBitmapText& other) const {
+ return !IsSameAs(other);
+ }
+
+private:
+ wxString m_text;
+ wxBitmap m_bmp;
+
+ wxDECLARE_DYNAMIC_CLASS(DataViewBitmapText);
+};
+DECLARE_VARIANT_OBJECT(DataViewBitmapText)
+
+// ----------------------------------------------------------------------------
+// BitmapTextRenderer
+// ----------------------------------------------------------------------------
+#if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING
+class BitmapTextRenderer : public wxDataViewRenderer
+#else
+class BitmapTextRenderer : public wxDataViewCustomRenderer
+#endif //ENABLE_NONCUSTOM_DATA_VIEW_RENDERING
+{
+public:
+ BitmapTextRenderer(bool use_markup = false,
+ wxDataViewCellMode mode =
+#ifdef __WXOSX__
+ wxDATAVIEW_CELL_INERT
+#else
+ wxDATAVIEW_CELL_EDITABLE
+#endif
+
+ , int align = wxDVR_DEFAULT_ALIGNMENT
+#if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING
+ );
+#else
+ ) :
+ wxDataViewCustomRenderer(wxT("DataViewBitmapText"), mode, align)
+ {
+ EnableMarkup(use_markup);
+ }
+#endif //ENABLE_NONCUSTOM_DATA_VIEW_RENDERING
+
+ ~BitmapTextRenderer();
+
+ void EnableMarkup(bool enable = true);
+
+ bool SetValue(const wxVariant& value) override;
+ bool GetValue(wxVariant& value) const override;
+#if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING && wxUSE_ACCESSIBILITY
+ virtual wxString GetAccessibleDescription() const override;
+#endif // wxUSE_ACCESSIBILITY && ENABLE_NONCUSTOM_DATA_VIEW_RENDERING
+
+ virtual bool Render(wxRect cell, wxDC* dc, int state) override;
+ virtual wxSize GetSize() const override;
+
+ bool HasEditorCtrl() const override
+ {
+#ifdef __WXOSX__
+ return false;
+#else
+ return true;
+#endif
+ }
+ wxWindow* CreateEditorCtrl(wxWindow* parent, wxRect labelRect, const wxVariant& value) override;
+ bool GetValueFromEditorCtrl(wxWindow* ctrl, wxVariant& value) override;
+ bool WasCanceled() const { return m_was_unusable_symbol; }
+
+ void set_can_create_editor_ctrl_function(std::function<bool()> can_create_fn) { can_create_editor_ctrl = can_create_fn; }
+
+private:
+ DataViewBitmapText m_value;
+ bool m_was_unusable_symbol{ false };
+
+ std::function<bool()> can_create_editor_ctrl { nullptr };
+
+#ifdef SUPPORTS_MARKUP
+ #ifdef wxHAS_GENERIC_DATAVIEWCTRL
+ class wxItemMarkupText* m_markupText { nullptr };;
+ #else
+ bool is_markupText {false};
+ #endif
+#endif // SUPPORTS_MARKUP
+};
+
+
+// ----------------------------------------------------------------------------
+// BitmapChoiceRenderer
+// ----------------------------------------------------------------------------
+
+class BitmapChoiceRenderer : public wxDataViewCustomRenderer
+{
+public:
+ BitmapChoiceRenderer(wxDataViewCellMode mode =
+#ifdef __WXOSX__
+ wxDATAVIEW_CELL_INERT
+#else
+ wxDATAVIEW_CELL_EDITABLE
+#endif
+ , int align = wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL
+ ) : wxDataViewCustomRenderer(wxT("DataViewBitmapText"), mode, align) {}
+
+ bool SetValue(const wxVariant& value) override;
+ bool GetValue(wxVariant& value) const override;
+
+ virtual bool Render(wxRect cell, wxDC* dc, int state) override;
+ virtual wxSize GetSize() const override;
+
+ bool HasEditorCtrl() const override { return true; }
+ wxWindow* CreateEditorCtrl(wxWindow* parent, wxRect labelRect, const wxVariant& value) override;
+ bool GetValueFromEditorCtrl(wxWindow* ctrl, wxVariant& value) override;
+
+ void set_can_create_editor_ctrl_function(std::function<bool()> can_create_fn) { can_create_editor_ctrl = can_create_fn; }
+
+private:
+ DataViewBitmapText m_value;
+ std::function<bool()> can_create_editor_ctrl { nullptr };
+};
+
+
+#endif // slic3r_GUI_ExtraRenderers_hpp_
diff --git a/src/slic3r/GUI/ExtruderSequenceDialog.cpp b/src/slic3r/GUI/ExtruderSequenceDialog.cpp
index a850ac192..e505f1470 100644
--- a/src/slic3r/GUI/ExtruderSequenceDialog.cpp
+++ b/src/slic3r/GUI/ExtruderSequenceDialog.cpp
@@ -14,13 +14,14 @@
#include "GUI_App.hpp"
#include "I18N.hpp"
#include "OptionsGroup.hpp"
+#include "MainFrame.hpp"
namespace Slic3r {
namespace GUI {
ExtruderSequenceDialog::ExtruderSequenceDialog(const DoubleSlider::ExtrudersSequence& sequence)
- : DPIDialog(NULL, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _(L("Set extruder sequence")),
+ : DPIDialog(static_cast<wxWindow*>(wxGetApp().mainframe), wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _(L("Set extruder sequence")),
wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER),
m_sequence(sequence)
{
@@ -36,7 +37,7 @@ ExtruderSequenceDialog::ExtruderSequenceDialog(const DoubleSlider::ExtrudersSequ
auto option_sizer = new wxBoxSizer(wxVERTICAL);
- auto intervals_box = new wxStaticBox(this, wxID_ANY, _(L("Set extruder change for every"))+ " : ");
+ auto intervals_box = new wxStaticBox(this, wxID_ANY, _(L("Set extruder change for every"))+ ": ");
auto intervals_box_sizer = new wxStaticBoxSizer(intervals_box, wxVERTICAL);
m_intervals_grid_sizer = new wxFlexGridSizer(3, 5, em);
@@ -114,26 +115,26 @@ ExtruderSequenceDialog::ExtruderSequenceDialog(const DoubleSlider::ExtrudersSequ
rb_by_mm->SetValue(true);
});
- m_interval_by_mm->Bind(wxEVT_KILL_FOCUS, [this, change_value](wxFocusEvent& event)
+ m_interval_by_mm->Bind(wxEVT_KILL_FOCUS, [change_value](wxFocusEvent& event)
{
change_value();
event.Skip();
});
- m_interval_by_mm->Bind(wxEVT_TEXT_ENTER, [this, change_value](wxEvent&)
+ m_interval_by_mm->Bind(wxEVT_TEXT_ENTER, [change_value](wxEvent&)
{
change_value();
});
m_intervals_grid_sizer->Add(rb_by_mm, 0, wxALIGN_CENTER_VERTICAL);
- m_intervals_grid_sizer->Add(m_interval_by_mm,0, wxALIGN_CENTER_VERTICAL);
+ m_intervals_grid_sizer->Add(m_interval_by_mm, 0, wxALIGN_CENTER_VERTICAL);
m_intervals_grid_sizer->Add(st_by_mm,0, wxALIGN_CENTER_VERTICAL);
intervals_box_sizer->Add(m_intervals_grid_sizer, 0, wxLEFT, em);
option_sizer->Add(intervals_box_sizer, 0, wxEXPAND);
- auto extruders_box = new wxStaticBox(this, wxID_ANY, _(L("Set extruder(tool) sequence"))+ " : ");
+ auto extruders_box = new wxStaticBox(this, wxID_ANY, _(L("Set extruder(tool) sequence"))+ ": ");
auto extruders_box_sizer = new wxStaticBoxSizer(extruders_box, wxVERTICAL);
m_extruders_grid_sizer = new wxFlexGridSizer(3, 5, em);
diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp
index d7944d4de..88c833187 100644
--- a/src/slic3r/GUI/Field.cpp
+++ b/src/slic3r/GUI/Field.cpp
@@ -3,13 +3,19 @@
#include "I18N.hpp"
#include "Field.hpp"
#include "wxExtensions.hpp"
+#include "Plater.hpp"
+#include "MainFrame.hpp"
+#include "format.hpp"
#include "libslic3r/PrintConfig.hpp"
#include <regex>
#include <wx/numformatter.h>
#include <wx/tooltip.h>
+#include <wx/notebook.h>
+#include <wx/tokenzr.h>
#include <boost/algorithm/string/predicate.hpp>
+#include "OG_CustomCtrl.hpp"
#ifdef __WXOSX__
#define wxOSX true
@@ -48,14 +54,39 @@ wxString double_to_string(double const value, const int max_precision /*= 4*/)
return s;
}
+wxString get_thumbnails_string(const std::vector<Vec2d>& values)
+{
+ wxString ret_str;
+ for (size_t i = 0; i < values.size(); ++ i) {
+ const Vec2d& el = values[i];
+ ret_str += wxString::Format((i == 0) ? "%ix%i" : ", %ix%i", int(el[0]), int(el[1]));
+ }
+ return ret_str;
+}
+
+
+Field::~Field()
+{
+ if (m_on_kill_focus)
+ m_on_kill_focus = nullptr;
+ if (m_on_set_focus)
+ m_on_set_focus = nullptr;
+ if (m_on_change)
+ m_on_change = nullptr;
+ if (m_back_to_initial_value)
+ 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(); }));
switch (m_opt.type)
{
@@ -75,13 +106,43 @@ void Field::PostInitialize()
// initialize m_unit_value
m_em_unit = em_unit(m_parent);
+ parent_is_custom_ctrl = dynamic_cast<OG_CustomCtrl*>(m_parent) != nullptr;
BUILD();
+
+ // For the mode, when settings are in non-modal dialog, neither dialog nor tabpanel doesn't receive wxEVT_KEY_UP event, when some field is selected.
+ // So, like a workaround check wxEVT_KEY_UP event for the Filed and switch between tabs if Ctrl+(1-4) was pressed
+ if (getWindow())
+ getWindow()->Bind(wxEVT_KEY_UP, [](wxKeyEvent& evt) {
+ if ((evt.GetModifiers() & wxMOD_CONTROL) != 0) {
+ int tab_id = -1;
+ switch (evt.GetKeyCode()) {
+ case '1': { tab_id = 0; break; }
+ case '2': { tab_id = 1; break; }
+ case '3': { tab_id = 2; break; }
+ case '4': { tab_id = 3; break; }
+#ifdef __APPLE__
+ case 'f':
+#else /* __APPLE__ */
+ case WXK_CONTROL_F:
+#endif /* __APPLE__ */
+ case 'F': { wxGetApp().plater()->search(false); break; }
+ default: break;
+ }
+ if (tab_id >= 0)
+ wxGetApp().mainframe->select_tab(tab_id);
+ if (tab_id > 0)
+ // tab panel should be focused for correct navigation between tabs
+ wxGetApp().tab_panel()->SetFocus();
+ }
+
+ evt.Skip();
+ });
}
// Values of width to alignments of fields
-int Field::def_width() { return wxOSX ? 8 : 7; }
-int Field::def_width_wider() { return 14; }
+int Field::def_width() { return 8; }
+int Field::def_width_wider() { return 16; }
int Field::def_width_thinner() { return 4; }
void Field::on_kill_focus()
@@ -168,10 +229,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 = double(m_opt.min);
@@ -201,10 +259,28 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true
m_value.clear();
break;
}
- show_error(m_parent, _(L("Input value is out of range")));
- if (m_opt.min > val) val = m_opt.min;
- if (val > m_opt.max) val = m_opt.max;
- set_value(double_to_string(val), true);
+ if (m_opt_id == "extrusion_multiplier") {
+ if (m_value.empty() || boost::any_cast<double>(m_value) != val) {
+ wxString msg_text = format_wxstr(_L("Input value is out of range\n"
+ "Are you sure that %s is a correct value and that you want to continue?"), str);
+ wxMessageDialog dialog(m_parent, msg_text, _L("Parameter validation") + ": " + m_opt_id, wxICON_WARNING | wxYES | wxNO);
+ if (dialog.ShowModal() == wxID_NO) {
+ if (m_value.empty()) {
+ if (m_opt.min > val) val = m_opt.min;
+ if (val > m_opt.max) val = m_opt.max;
+ }
+ else
+ val = boost::any_cast<double>(m_value);
+ set_value(double_to_string(val), true);
+ }
+ }
+ }
+ else {
+ show_error(m_parent, _L("Input value is out of range"));
+ if (m_opt.min > val) val = m_opt.min;
+ if (val > m_opt.max) val = m_opt.max;
+ set_value(double_to_string(val), true);
+ }
}
}
m_value = val;
@@ -217,6 +293,11 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true
double val = 0.;
// Replace the first occurence of comma in decimal number.
str.Replace(",", ".", false);
+
+ // remove space and "mm" substring, if any exists
+ str.Replace(" ", "", true);
+ str.Replace("m", "", true);
+
if (!str.ToCDouble(&val))
{
if (!check_value) {
@@ -235,13 +316,15 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true
break;
}
+ bool infill_anchors = m_opt.opt_key == "infill_anchor" || m_opt.opt_key == "infill_anchor_max";
+
const std::string sidetext = m_opt.sidetext.rfind("mm/s") != std::string::npos ? "mm/s" : "mm";
const wxString stVal = double_to_string(val, 2);
const wxString msg_text = from_u8((boost::format(_utf8(L("Do you mean %s%% instead of %s %s?\n"
"Select YES if you want to change this value to %s%%, \n"
"or NO if you are sure that %s %s is a correct value."))) % stVal % stVal % sidetext % stVal % stVal % sidetext).str());
wxMessageDialog dialog(m_parent, msg_text, _(L("Parameter validation")) + ": " + m_opt_id , wxICON_WARNING | wxYES | wxNO);
- if (dialog.ShowModal() == wxID_YES) {
+ if ((!infill_anchors || val > 100) && dialog.ShowModal() == wxID_YES) {
set_value(from_u8((boost::format("%s%%") % stVal).str()), false/*true*/);
str += "%%";
}
@@ -252,32 +335,75 @@ void Field::get_value_by_opt_type(wxString& str, const bool check_value/* = true
m_value = std::string(str.ToUTF8().data());
break; }
+
+ case coPoints: {
+ std::vector<Vec2d> out_values;
+ str.Replace(" ", wxEmptyString, true);
+ if (!str.IsEmpty()) {
+ bool invalid_val = false;
+ bool out_of_range_val = false;
+ wxStringTokenizer thumbnails(str, ",");
+ while (thumbnails.HasMoreTokens()) {
+ wxString token = thumbnails.GetNextToken();
+ double x, y;
+ wxStringTokenizer thumbnail(token, "x");
+ if (thumbnail.HasMoreTokens()) {
+ wxString x_str = thumbnail.GetNextToken();
+ if (x_str.ToDouble(&x) && thumbnail.HasMoreTokens()) {
+ wxString y_str = thumbnail.GetNextToken();
+ if (y_str.ToDouble(&y) && !thumbnail.HasMoreTokens()) {
+ if (0 < x && x < 1000 && 0 < y && y < 1000) {
+ out_values.push_back(Vec2d(x, y));
+ continue;
+ }
+ out_of_range_val = true;
+ break;
+ }
+ }
+ }
+ invalid_val = true;
+ break;
+ }
+
+ if (out_of_range_val) {
+ wxString text_value;
+ if (!m_value.empty())
+ text_value = get_thumbnails_string(boost::any_cast<std::vector<Vec2d>>(m_value));
+ set_value(text_value, true);
+ show_error(m_parent, _L("Input value is out of range")
+ );
+ }
+ else if (invalid_val) {
+ wxString text_value;
+ if (!m_value.empty())
+ text_value = get_thumbnails_string(boost::any_cast<std::vector<Vec2d>>(m_value));
+ set_value(text_value, true);
+ show_error(m_parent, format_wxstr(_L("Invalid input format. Expected vector of dimensions in the following format: \"%1%\""),"XxY, XxY, ..." ));
+ }
+ }
+
+ m_value = out_values;
+ break; }
+
default:
break;
}
}
-void Field::msw_rescale(bool rescale_sidetext)
+void Field::msw_rescale()
{
- m_Undo_to_sys_btn->msw_rescale();
- m_Undo_btn->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()
+{
}
template<class T>
bool is_defined_input_value(wxWindow* win, const ConfigOptionType& type)
{
- if (static_cast<T*>(win)->GetValue().empty() && type != coString && type != coStrings)
+ if (!win || (static_cast<T*>(win)->GetValue().empty() && type != coString && type != coStrings))
return false;
return true;
}
@@ -326,13 +452,20 @@ void TextCtrl::BUILD() {
text_value = vec->get_at(m_opt_idx);
break;
}
+ case coPoints:
+ text_value = get_thumbnails_string(m_opt.get_default_value<ConfigOptionPoints>()->values);
+ break;
default:
break;
}
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);
- temp->SetFont(Slic3r::GUI::wxGetApp().normal_font());
+ 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());
if (! m_opt.multiline && !wxOSX)
// Only disable background refresh for single line input fields, as they are completely painted over by the edit control.
@@ -395,7 +528,7 @@ void TextCtrl::BUILD() {
bKilledFocus = false;
#endif // __WXOSX__
}), temp->GetId());
-
+/*
// select all text using Ctrl+A
temp->Bind(wxEVT_CHAR, ([temp](wxKeyEvent& event)
{
@@ -403,7 +536,7 @@ void TextCtrl::BUILD() {
temp->SetSelection(-1, -1); //select all
event.Skip();
}));
-
+*/
// recast as a wxWindow to fit the calling convention
window = dynamic_cast<wxWindow*>(temp);
}
@@ -493,17 +626,24 @@ 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<wxTextCtrl*>(window);
- field->SetMinSize(size);
+ if (parent_is_custom_ctrl)
+ field->SetSize(size);
+ else
+ field->SetMinSize(size);
}
}
@@ -514,7 +654,7 @@ void TextCtrl::disable() { dynamic_cast<wxTextCtrl*>(window)->Disable(); dynamic
#ifdef __WXGTK__
void TextCtrl::change_field_value(wxEvent& event)
{
- if (bChangedValueEvent = (event.GetEventType()==wxEVT_KEY_UP))
+ if ((bChangedValueEvent = (event.GetEventType()==wxEVT_KEY_UP)))
on_change_field();
event.Skip();
};
@@ -593,7 +733,7 @@ boost::any& CheckBox::get_value()
return m_value;
}
-void CheckBox::msw_rescale(bool rescale_sidetext/* = false*/)
+void CheckBox::msw_rescale()
{
Field::msw_rescale();
@@ -644,9 +784,17 @@ void SpinCtrl::BUILD() {
auto temp = new wxSpinCtrl(m_parent, wxID_ANY, text_value, wxDefaultPosition, size,
0|wxTE_PROCESS_ENTER, min_val, max_val, default_value);
+#ifdef __WXGTK3__
+ wxSize best_sz = temp->GetBestSize();
+ if (best_sz.x > size.x)
+ temp->SetSize(wxSize(size.x + 2 * best_sz.y, best_sz.y));
+#endif //__WXGTK3__
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.)
@@ -728,23 +876,32 @@ 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();
wxSpinCtrl* field = dynamic_cast<wxSpinCtrl*>(window);
- field->SetMinSize(wxSize(def_width() * m_em_unit, int(1.9f*field->GetFont().GetPixelSize().y)));
+ 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__
@@ -752,14 +909,20 @@ 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__
}
+#ifdef __WXGTK3__
+ wxSize best_sz = temp->GetBestSize();
+ if (best_sz.x > size.x)
+ temp->SetSize(best_sz);
+#endif //__WXGTK3__
+
temp->SetFont(Slic3r::GUI::wxGetApp().normal_font());
if (!wxOSX) temp->SetBackgroundStyle(wxBG_STYLE_PAINT);
@@ -779,7 +942,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,
@@ -794,8 +958,16 @@ void Choice::BUILD() {
temp->SetItemBitmap(0, empty_bmp);
#endif
-// temp->Bind(wxEVT_TEXT, ([this](wxCommandEvent e) { on_change_field(); }), temp->GetId());
- temp->Bind(wxEVT_COMBOBOX, ([this](wxCommandEvent e) { on_change_field(); }), temp->GetId());
+ temp->Bind(wxEVT_MOUSEWHEEL, [this](wxMouseEvent& e) {
+ if (m_suppress_scroll && !m_is_dropped)
+ e.StopPropagation();
+ else
+ e.Skip();
+ });
+ temp->Bind(wxEVT_COMBOBOX_DROPDOWN, [this](wxCommandEvent&) { m_is_dropped = true; });
+ temp->Bind(wxEVT_COMBOBOX_CLOSEUP, [this](wxCommandEvent&) { m_is_dropped = false; });
+
+ temp->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent&) { on_change_field(); }, temp->GetId());
if (m_is_editable) {
temp->Bind(wxEVT_KILL_FOCUS, ([this](wxEvent& e) {
@@ -805,12 +977,18 @@ void Choice::BUILD() {
return;
}
- double old_val = !m_value.empty() ? boost::any_cast<double>(m_value) : -99999;
- if (is_defined_input_value<wxBitmapComboBox>(window, m_opt.type)) {
- if (fabs(old_val - boost::any_cast<double>(get_value())) <= 0.0001)
- return;
- else
- on_change_field();
+ if (is_defined_input_value<choice_ctrl>(window, m_opt.type)) {
+ if (m_opt.type == coFloatOrPercent) {
+ std::string old_val = !m_value.empty() ? boost::any_cast<std::string>(m_value) : "";
+ if (old_val == boost::any_cast<std::string>(get_value()))
+ return;
+ }
+ else {
+ double old_val = !m_value.empty() ? boost::any_cast<double>(m_value) : -99999;
+ if (fabs(old_val - boost::any_cast<double>(get_value())) <= 0.0001)
+ return;
+ }
+ on_change_field();
}
else
on_kill_focus();
@@ -820,6 +998,11 @@ void Choice::BUILD() {
temp->SetToolTip(get_tooltip_text(temp->GetValue()));
}
+void Choice::suppress_scroll()
+{
+ m_suppress_scroll = true;
+}
+
void Choice::set_selection()
{
/* To prevent earlier control updating under OSX set m_disable_change_event to true
@@ -829,61 +1012,44 @@ void Choice::set_selection()
wxString text_value = wxString("");
- wxBitmapComboBox* field = dynamic_cast<wxBitmapComboBox*>(window);
+ choice_ctrl* field = dynamic_cast<choice_ctrl*>(window);
switch (m_opt.type) {
+ case coEnum:{
+ int id_value = m_opt.get_default_value<ConfigOptionEnum<SeamPosition>>()->value; //!!
+ field->SetSelection(id_value);
+ break;
+ }
case coFloat:
case coPercent: {
double val = m_opt.default_value->getFloat();
text_value = val - int(val) == 0 ? wxString::Format(_T("%i"), int(val)) : wxNumberFormatter::ToString(val, 1);
- size_t idx = 0;
- for (auto el : m_opt.enum_values)
- {
- if (el == text_value)
- break;
- ++idx;
- }
-// if (m_opt.type == coPercent) text_value += "%";
- idx == m_opt.enum_values.size() ?
- field->SetValue(text_value) :
- field->SetSelection(idx);
- break;
- }
- case coEnum:{
- int id_value = m_opt.get_default_value<ConfigOptionEnum<SeamPosition>>()->value; //!!
- field->SetSelection(id_value);
break;
}
case coInt:{
- int val = m_opt.default_value->getInt(); //!!
- text_value = wxString::Format(_T("%i"), int(val));
- size_t idx = 0;
- for (auto el : m_opt.enum_values)
- {
- if (el == text_value)
- break;
- ++idx;
- }
- idx == m_opt.enum_values.size() ?
- field->SetValue(text_value) :
- field->SetSelection(idx);
+ text_value = wxString::Format(_T("%i"), int(m_opt.default_value->getInt()));
break;
}
case coStrings:{
text_value = m_opt.get_default_value<ConfigOptionStrings>()->get_at(m_opt_idx);
+ break;
+ }
+ case coFloatOrPercent: {
+ text_value = double_to_string(m_opt.default_value->getFloat());
+ if (m_opt.get_default_value<ConfigOptionFloatOrPercent>()->percent)
+ text_value += "%";
+ break;
+ }
+ default: break;
+ }
- size_t idx = 0;
- for (auto el : m_opt.enum_values)
- {
+ if (!text_value.IsEmpty()) {
+ int idx = 0;
+ for (auto el : m_opt.enum_values) {
if (el == text_value)
break;
++idx;
}
- idx == m_opt.enum_values.size() ?
- field->SetValue(text_value) :
- field->SetSelection(idx);
- break;
- }
- default: break;
+ idx == m_opt.enum_values.size() ? field->SetValue(text_value) : field->SetSelection(idx);
}
}
@@ -899,7 +1065,7 @@ void Choice::set_value(const std::string& value, bool change_event) //! Redunda
++idx;
}
- wxBitmapComboBox* field = dynamic_cast<wxBitmapComboBox*>(window);
+ choice_ctrl* field = dynamic_cast<choice_ctrl*>(window);
idx == m_opt.enum_values.size() ?
field->SetValue(value) :
field->SetSelection(idx);
@@ -911,12 +1077,13 @@ void Choice::set_value(const boost::any& value, bool change_event)
{
m_disable_change_event = !change_event;
- wxBitmapComboBox* field = dynamic_cast<wxBitmapComboBox*>(window);
+ choice_ctrl* field = dynamic_cast<choice_ctrl*>(window);
switch (m_opt.type) {
case coInt:
case coFloat:
case coPercent:
+ case coFloatOrPercent:
case coString:
case coStrings: {
wxString text_value;
@@ -925,13 +1092,14 @@ void Choice::set_value(const boost::any& value, bool change_event)
else
text_value = boost::any_cast<wxString>(value);
size_t idx = 0;
- for (auto el : m_opt.enum_values)
+ const std::vector<std::string>& enums = m_opt.enum_values.empty() ? m_opt.enum_labels : m_opt.enum_values;
+ for (auto el : enums)
{
if (el == text_value)
break;
++idx;
}
- if (idx == m_opt.enum_values.size()) {
+ if (idx == enums.size()) {
// For editable Combobox under OSX is needed to set selection to -1 explicitly,
// otherwise selection doesn't be changed
field->SetSelection(-1);
@@ -943,7 +1111,7 @@ void Choice::set_value(const boost::any& value, bool change_event)
}
case coEnum: {
int val = boost::any_cast<int>(value);
- if (m_opt_id == "top_fill_pattern" || m_opt_id == "bottom_fill_pattern")
+ if (m_opt_id == "top_fill_pattern" || m_opt_id == "bottom_fill_pattern" || m_opt_id == "fill_pattern")
{
if (!m_opt.enum_values.empty()) {
std::string key;
@@ -987,20 +1155,40 @@ void Choice::set_values(const std::vector<std::string>& values)
// # it looks that Clear() also clears the text field in recent wxWidgets versions,
// # but we want to preserve it
- auto ww = dynamic_cast<wxBitmapComboBox*>(window);
+ auto ww = dynamic_cast<choice_ctrl*>(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);
m_disable_change_event = false;
}
+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<choice_ctrl*>(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<wxBitmapComboBox*>(window);
+ choice_ctrl* field = dynamic_cast<choice_ctrl*>(window);
wxString ret_str = field->GetValue();
@@ -1013,7 +1201,7 @@ boost::any& Choice::get_value()
if (m_opt.type == coEnum)
{
int ret_enum = field->GetSelection();
- if (m_opt_id == "top_fill_pattern" || m_opt_id == "bottom_fill_pattern")
+ if (m_opt_id == "top_fill_pattern" || m_opt_id == "bottom_fill_pattern" || m_opt_id == "fill_pattern")
{
if (!m_opt.enum_values.empty()) {
std::string key = m_opt.enum_values[ret_enum];
@@ -1025,10 +1213,12 @@ boost::any& Choice::get_value()
else
m_value = static_cast<InfillPattern>(0);
}
- if (m_opt_id.compare("fill_pattern") == 0)
- m_value = static_cast<InfillPattern>(ret_enum);
+ else if (m_opt_id.compare("ironing_type") == 0)
+ m_value = static_cast<IroningType>(ret_enum);
else if (m_opt_id.compare("gcode_flavor") == 0)
m_value = static_cast<GCodeFlavor>(ret_enum);
+ else if (m_opt_id.compare("machine_limits_usage") == 0)
+ m_value = static_cast<MachineLimitsUsage>(ret_enum);
else if (m_opt_id.compare("support_material_pattern") == 0)
m_value = static_cast<SupportMaterialPattern>(ret_enum);
else if (m_opt_id.compare("seam_position") == 0)
@@ -1039,6 +1229,8 @@ boost::any& Choice::get_value()
m_value = static_cast<SLADisplayOrientation>(ret_enum);
else if (m_opt_id.compare("support_pillar_connection_mode") == 0)
m_value = static_cast<SLAPillarConnectionMode>(ret_enum);
+ else if (m_opt_id == "printhost_authorization_type")
+ m_value = static_cast<AuthorizationType>(ret_enum);
}
else if (m_opt.gui_type == "f_enum_open") {
const int ret_enum = field->GetSelection();
@@ -1046,7 +1238,9 @@ boost::any& Choice::get_value()
(ret_str != m_opt.enum_values[ret_enum] && ret_str != _(m_opt.enum_labels[ret_enum])))
// modifies ret_string!
get_value_by_opt_type(ret_str);
- else
+ else if (m_opt.type == coFloatOrPercent)
+ m_value = m_opt.enum_values[ret_enum];
+ else
m_value = atof(m_opt.enum_values[ret_enum].c_str());
}
else
@@ -1056,17 +1250,20 @@ boost::any& Choice::get_value()
return m_value;
}
-void Choice::msw_rescale(bool rescale_sidetext/* = false*/)
+void Choice::enable() { dynamic_cast<choice_ctrl*>(window)->Enable(); };
+void Choice::disable() { dynamic_cast<choice_ctrl*>(window)->Disable(); };
+
+void Choice::msw_rescale()
{
Field::msw_rescale();
- wxBitmapComboBox* field = dynamic_cast<wxBitmapComboBox*>(window);
-
- const wxString selection = field->GetString(field->GetSelection());
+ choice_ctrl* field = dynamic_cast<choice_ctrl*>(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
*/
@@ -1099,6 +1296,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()
@@ -1115,6 +1322,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);
@@ -1171,15 +1380,21 @@ 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<wxColourPickerCtrl*>(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);
- field->SetMinSize(size);
+ if (parent_is_custom_ctrl)
+ field->SetSize(size);
+ else
+ field->SetMinSize(size);
if (field->GetColour() == wxTransparentColour)
set_undef_value(field);
@@ -1199,6 +1414,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());
@@ -1216,9 +1434,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());
@@ -1232,22 +1447,41 @@ 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)
+{
+ if (m_value.empty())
+ return true;
+
+ boost::any val = m_value;
+ // update m_value!
+ get_value();
- x_textctrl->SetMinSize(field_size);
- y_textctrl->SetMinSize(field_size);
+ return boost::any_cast<Vec2d>(m_value) != boost::any_cast<Vec2d>(val);
}
void PointCtrl::propagate_value(wxTextCtrl* win)
{
- if (!win->GetValue().empty())
- on_change_field();
- else
+ if (win->GetValue().empty())
on_kill_focus();
+ else if (value_was_changed(win))
+ on_change_field();
}
void PointCtrl::set_value(const Vec2d& value, bool change_event)
@@ -1279,8 +1513,25 @@ void PointCtrl::set_value(const boost::any& value, bool change_event)
boost::any& PointCtrl::get_value()
{
double x, y;
- x_textctrl->GetValue().ToDouble(&x);
- y_textctrl->GetValue().ToDouble(&y);
+ if (!x_textctrl->GetValue().ToDouble(&x) ||
+ !y_textctrl->GetValue().ToDouble(&y))
+ {
+ set_value(m_value.empty() ? Vec2d(0.0, 0.0) : m_value, true);
+ show_error(m_parent, _L("Invalid numeric input."));
+ }
+ else
+ if (m_opt.min > x || x > m_opt.max ||
+ m_opt.min > y || y > m_opt.max)
+ {
+ if (m_opt.min > x) x = m_opt.min;
+ if (x > m_opt.max) x = m_opt.max;
+ if (m_opt.min > y) y = m_opt.min;
+ if (y > m_opt.max) y = m_opt.max;
+ set_value(Vec2d(x, y), true);
+
+ show_error(m_parent, _L("Input value is out of range"));
+ }
+
return m_value = Vec2d(x, y);
}
@@ -1302,7 +1553,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 1f8b642b1..5b01c92c9 100644
--- a/src/slic3r/GUI/Field.hpp
+++ b/src/slic3r/GUI/Field.hpp
@@ -37,39 +37,7 @@ using t_change = std::function<void(const t_config_option_key&, const boost::any
using t_back_to_init = std::function<void(const std::string&)>;
wxString double_to_string(double const value, const int max_precision = 4);
-
-class RevertButton : public ScalableButton
-{
- bool hidden = false; // never show button if it's hidden ones
-public:
-// RevertButton() {}
-// RevertButton(wxWindow* parent, wxWindowID id, const wxString& label = wxEmptyString,
-// const wxPoint& pos = wxDefaultPosition,
-// const wxSize& size = wxDefaultSize, long style = 0,
-// const wxValidator& validator = wxDefaultValidator,
-// const wxString& name = wxTextCtrlNameStr)
-// {
-// this->Create(parent, id, label, pos, size, style, validator, name);
-// }
- RevertButton(
- wxWindow *parent,
- const std::string& icon_name = ""
- ) :
- ScalableButton(parent, wxID_ANY, icon_name) {}
-
- // overridden from wxWindow base class
- virtual bool
- AcceptsFocusFromKeyboard() const { return false; }
-
- void set_as_hidden() {
- Hide();
- hidden = true;
- }
-
- virtual bool Show(bool show = true) override {
- return wxButton::Show(hidden ? false : show);
- }
-};
+wxString get_thumbnails_string(const std::vector<Vec2d>& values);
class Field {
protected:
@@ -87,6 +55,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 +89,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,12 +113,9 @@ 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() {}
+ virtual ~Field();
/// If you don't know what you are getting back, check both methods for nullptr.
virtual wxSizer* getSizer() { return nullptr; }
@@ -166,7 +136,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;
@@ -175,33 +144,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;
@@ -210,17 +167,17 @@ 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; }
void set_enter_pressed(bool pressed) { bEnterPressed = pressed; }
@@ -230,22 +187,26 @@ public:
static int def_width_wider() ;
static int def_width_thinner() ;
+ 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;
- wxStaticText* m_Label = nullptr;
+ bool m_blink{ false };
+
// 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
@@ -290,18 +251,18 @@ public:
void propagate_value();
wxWindow* window {nullptr};
- virtual void set_value(const std::string& value, bool change_event = false) {
+ void set_value(const std::string& value, bool change_event = false) {
m_disable_change_event = !change_event;
dynamic_cast<wxTextCtrl*>(window)->SetValue(wxString(value));
m_disable_change_event = false;
}
- virtual void set_value(const boost::any& value, bool change_event = false) override;
- virtual void set_last_meaningful_value() override;
- virtual void set_na_value() override;
+ void set_value(const boost::any& value, bool change_event = false) override;
+ void set_last_meaningful_value() override;
+ 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;
void disable() override;
@@ -329,7 +290,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<wxCheckBox*>(window)->Enable(); }
void disable() override { dynamic_cast<wxCheckBox*>(window)->Disable(); }
@@ -372,7 +333,7 @@ public:
return m_value = value;
}
- void msw_rescale(bool rescale_sidetext = false) override;
+ void msw_rescale() override;
void enable() override { dynamic_cast<wxSpinCtrl*>(window)->Enable(); }
void disable() override { dynamic_cast<wxSpinCtrl*>(window)->Disable(); }
@@ -392,19 +353,25 @@ public:
/* Under OSX: wxBitmapComboBox->GetWindowStyle() returns some weard value,
* so let use a flag, which has TRUE value for a control without wxCB_READONLY style
*/
- bool m_is_editable { false };
+ bool m_is_editable { false };
+ bool m_is_dropped { false };
+ bool m_suppress_scroll { false };
+ int m_last_selected { wxNOT_FOUND };
void set_selection();
void set_value(const std::string& value, bool change_event = false);
- void set_value(const boost::any& value, bool change_event = false);
+ void set_value(const boost::any& value, bool change_event = false) override;
void set_values(const std::vector<std::string> &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<wxBitmapComboBox*>(window)->Enable(); };
- void disable() override{ dynamic_cast<wxBitmapComboBox*>(window)->Disable(); };
+ void enable() override ;//{ dynamic_cast<wxBitmapComboBox*>(window)->Enable(); };
+ void disable() override;//{ dynamic_cast<wxBitmapComboBox*>(window)->Disable(); };
wxWindow* getWindow() override { return window; }
+
+ void suppress_scroll();
};
class ColourPicker : public Field {
@@ -426,7 +393,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<wxColourPickerCtrl*>(window)->Enable(); };
void disable() override{ dynamic_cast<wxColourPickerCtrl*>(window)->Disable(); };
@@ -445,13 +412,14 @@ public:
wxTextCtrl* y_textctrl{ nullptr };
void BUILD() override;
+ bool value_was_changed(wxTextCtrl* win);
// Propagate value from field to the OptionGroupe and Config after kill_focus/ENTER
void propagate_value(wxTextCtrl* win);
void set_value(const Vec2d& value, bool change_event = false);
- void set_value(const boost::any& value, bool change_event = false);
+ void set_value(const boost::any& value, bool change_event = false) override;
boost::any& get_value() override;
- void msw_rescale(bool rescale_sidetext = false) override;
+ void msw_rescale() override;
void enable() override {
x_textctrl->Enable();
@@ -460,6 +428,7 @@ public:
x_textctrl->Disable();
y_textctrl->Disable(); }
wxSizer* getSizer() override { return sizer; }
+ wxWindow* getWindow() override { return dynamic_cast<wxWindow*>(x_textctrl); }
};
class StaticText : public Field {
@@ -477,7 +446,7 @@ public:
dynamic_cast<wxStaticText*>(window)->SetLabel(wxString::FromUTF8(value.data()));
m_disable_change_event = false;
}
- void set_value(const boost::any& value, bool change_event = false) {
+ void set_value(const boost::any& value, bool change_event = false) override {
m_disable_change_event = !change_event;
dynamic_cast<wxStaticText*>(window)->SetLabel(boost::any_cast<wxString>(value));
m_disable_change_event = false;
@@ -485,7 +454,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<wxStaticText*>(window)->Enable(); };
void disable() override{ dynamic_cast<wxStaticText*>(window)->Disable(); };
@@ -508,7 +477,7 @@ public:
void BUILD() override;
void set_value(const int value, bool change_event = false);
- void set_value(const boost::any& value, bool change_event = false);
+ void set_value(const boost::any& value, bool change_event = false) override;
boost::any& get_value() override;
void enable() override {
diff --git a/src/slic3r/GUI/FirmwareDialog.cpp b/src/slic3r/GUI/FirmwareDialog.cpp
index fe7ff4e5d..879e7fe34 100644
--- a/src/slic3r/GUI/FirmwareDialog.cpp
+++ b/src/slic3r/GUI/FirmwareDialog.cpp
@@ -766,7 +766,7 @@ const char* FirmwareDialog::priv::avr109_dev_name(Avr109Pid usb_pid) {
return "Original Prusa CW1";
break;
- default: throw std::runtime_error((boost::format("Invalid avr109 device USB PID: %1%") % usb_pid.boot).str());
+ default: throw Slic3r::RuntimeError((boost::format("Invalid avr109 device USB PID: %1%") % usb_pid.boot).str());
}
}
@@ -790,7 +790,7 @@ FirmwareDialog::FirmwareDialog(wxWindow *parent) :
SetFont(font);
wxFont status_font = font;//wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
status_font.MakeBold();
- wxFont mono_font(wxFontInfo().Family(wxFONTFAMILY_TELETYPE));
+ wxFont mono_font = GUI::wxGetApp().code_font();
mono_font.MakeSmaller();
// Create GUI components and layout
diff --git a/src/slic3r/GUI/GCodeViewer.cpp b/src/slic3r/GUI/GCodeViewer.cpp
new file mode 100644
index 000000000..0af10270e
--- /dev/null
+++ b/src/slic3r/GUI/GCodeViewer.cpp
@@ -0,0 +1,2958 @@
+#include "libslic3r/libslic3r.h"
+#include "GCodeViewer.hpp"
+
+#include "libslic3r/Print.hpp"
+#include "libslic3r/Geometry.hpp"
+#include "libslic3r/Model.hpp"
+#include "libslic3r/Utils.hpp"
+#include "GUI_App.hpp"
+#include "MainFrame.hpp"
+#include "Plater.hpp"
+#include "libslic3r/PresetBundle.hpp"
+#include "Camera.hpp"
+#include "I18N.hpp"
+#include "GUI_Utils.hpp"
+#include "GUI.hpp"
+#include "DoubleSlider.hpp"
+#include "GLCanvas3D.hpp"
+#include "GLToolbar.hpp"
+#include "GUI_Preview.hpp"
+#include <imgui/imgui_internal.h>
+
+#include <GL/glew.h>
+#include <boost/log/trivial.hpp>
+#include <boost/nowide/cstdio.hpp>
+#include <wx/progdlg.h>
+#include <wx/numformatter.h>
+
+#include <array>
+#include <algorithm>
+#include <chrono>
+
+namespace Slic3r {
+namespace GUI {
+
+static unsigned char buffer_id(EMoveType type) {
+ return static_cast<unsigned char>(type) - static_cast<unsigned char>(EMoveType::Retract);
+}
+
+static EMoveType buffer_type(unsigned char id) {
+ return static_cast<EMoveType>(static_cast<unsigned char>(EMoveType::Retract) + id);
+}
+
+static std::array<float, 3> decode_color(const std::string& color) {
+ static const float INV_255 = 1.0f / 255.0f;
+
+ std::array<float, 3> ret = { 0.0f, 0.0f, 0.0f };
+ const char* c = color.data() + 1;
+ if (color.size() == 7 && color.front() == '#') {
+ for (size_t j = 0; j < 3; ++j) {
+ int digit1 = hex_digit_to_int(*c++);
+ int digit2 = hex_digit_to_int(*c++);
+ if (digit1 == -1 || digit2 == -1)
+ break;
+
+ ret[j] = float(digit1 * 16 + digit2) * INV_255;
+ }
+ }
+ return ret;
+}
+
+static std::vector<std::array<float, 3>> decode_colors(const std::vector<std::string>& colors) {
+ std::vector<std::array<float, 3>> output(colors.size(), { 0.0f, 0.0f, 0.0f });
+ for (size_t i = 0; i < colors.size(); ++i) {
+ output[i] = decode_color(colors[i]);
+ }
+ return output;
+}
+
+static float round_to_nearest(float value, unsigned int decimals)
+{
+ float res = 0.0f;
+ if (decimals == 0)
+ res = std::round(value);
+ else {
+ char buf[64];
+ sprintf(buf, "%.*g", decimals, value);
+ res = std::stof(buf);
+ }
+ return res;
+}
+
+void GCodeViewer::VBuffer::reset()
+{
+ // release gpu memory
+ if (id > 0) {
+ glsafe(::glDeleteBuffers(1, &id));
+ id = 0;
+ }
+
+ count = 0;
+}
+
+void GCodeViewer::IBuffer::reset()
+{
+ // release gpu memory
+ if (id > 0) {
+ glsafe(::glDeleteBuffers(1, &id));
+ id = 0;
+ }
+
+ count = 0;
+}
+
+bool GCodeViewer::Path::matches(const GCodeProcessor::MoveVertex& move) const
+{
+#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ auto matches_percent = [](float value1, float value2, float max_percent) {
+ return std::abs(value2 - value1) / value1 <= max_percent;
+ };
+#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+
+ switch (move.type)
+ {
+ case EMoveType::Tool_change:
+ case EMoveType::Color_change:
+ case EMoveType::Pause_Print:
+ case EMoveType::Custom_GCode:
+ case EMoveType::Retract:
+ case EMoveType::Unretract:
+ case EMoveType::Extrude: {
+ // use rounding to reduce the number of generated paths
+#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ return type == move.type && extruder_id == move.extruder_id && cp_color_id == move.cp_color_id && role == move.extrusion_role &&
+ move.position[2] <= first.position[2] && feedrate == move.feedrate && fan_speed == move.fan_speed &&
+ height == round_to_nearest(move.height, 2) && width == round_to_nearest(move.width, 2) &&
+ matches_percent(volumetric_rate, move.volumetric_rate(), 0.05f);
+#else
+ return type == move.type && move.position[2] <= first.position[2] && role == move.extrusion_role && height == round_to_nearest(move.height, 2) &&
+ width == round_to_nearest(move.width, 2) && feedrate == move.feedrate && fan_speed == move.fan_speed &&
+ volumetric_rate == round_to_nearest(move.volumetric_rate(), 2) && extruder_id == move.extruder_id &&
+ cp_color_id == move.cp_color_id;
+#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ }
+ case EMoveType::Travel: {
+ return type == move.type && feedrate == move.feedrate && extruder_id == move.extruder_id && cp_color_id == move.cp_color_id;
+ }
+ default: { return false; }
+ }
+}
+
+void GCodeViewer::TBuffer::reset()
+{
+ // release gpu memory
+ vertices.reset();
+ for (IBuffer& buffer : indices) {
+ buffer.reset();
+ }
+
+ // release cpu memory
+ indices.clear();
+ paths.clear();
+ render_paths.clear();
+}
+
+void GCodeViewer::TBuffer::add_path(const GCodeProcessor::MoveVertex& move, unsigned int b_id, size_t i_id, size_t s_id)
+{
+ Path::Endpoint endpoint = { b_id, i_id, s_id, move.position };
+ // use rounding to reduce the number of generated paths
+#if ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+ paths.push_back({ move.type, move.extrusion_role, endpoint, endpoint, move.delta_extruder,
+ round_to_nearest(move.height, 2), round_to_nearest(move.width, 2), move.feedrate, move.fan_speed,
+ move.volumetric_rate(), move.extruder_id, move.cp_color_id });
+#else
+ paths.push_back({ move.type, move.extrusion_role, endpoint, endpoint, move.delta_extruder,
+ round_to_nearest(move.height, 2), round_to_nearest(move.width, 2), move.feedrate, move.fan_speed,
+ round_to_nearest(move.volumetric_rate(), 2), move.extruder_id, move.cp_color_id });
+#endif // ENABLE_TOOLPATHS_WIDTH_HEIGHT_FROM_GCODE
+}
+
+GCodeViewer::Color GCodeViewer::Extrusions::Range::get_color_at(float value) const
+{
+ // Input value scaled to the colors range
+ const float step = step_size();
+ const float global_t = (step != 0.0f) ? std::max(0.0f, value - min) / step : 0.0f; // lower limit of 0.0f
+
+ const size_t color_max_idx = Range_Colors.size() - 1;
+
+ // Compute the two colors just below (low) and above (high) the input value
+ const size_t color_low_idx = std::clamp<size_t>(static_cast<size_t>(global_t), 0, color_max_idx);
+ const size_t color_high_idx = std::clamp<size_t>(color_low_idx + 1, 0, color_max_idx);
+
+ // Compute how far the value is between the low and high colors so that they can be interpolated
+ const float local_t = std::clamp(global_t - static_cast<float>(color_low_idx), 0.0f, 1.0f);
+
+ // Interpolate between the low and high colors to find exactly which color the input value should get
+ Color ret;
+ for (unsigned int i = 0; i < 3; ++i) {
+ ret[i] = lerp(Range_Colors[color_low_idx][i], Range_Colors[color_high_idx][i], local_t);
+ }
+ return ret;
+}
+
+void GCodeViewer::SequentialView::Marker::init()
+{
+ m_model.init_from(stilized_arrow(16, 2.0f, 4.0f, 1.0f, 8.0f));
+}
+
+void GCodeViewer::SequentialView::Marker::set_world_position(const Vec3f& position)
+{
+ m_world_position = position;
+ m_world_transform = (Geometry::assemble_transform((position + m_z_offset * Vec3f::UnitZ()).cast<double>()) * Geometry::assemble_transform(m_model.get_bounding_box().size()[2] * Vec3d::UnitZ(), { M_PI, 0.0, 0.0 })).cast<float>();
+}
+
+void GCodeViewer::SequentialView::Marker::render() const
+{
+ if (!m_visible)
+ return;
+
+ GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light");
+ if (shader == nullptr)
+ return;
+
+ glsafe(::glEnable(GL_BLEND));
+ glsafe(::glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));
+
+ shader->start_using();
+ shader->set_uniform("uniform_color", m_color);
+
+ glsafe(::glPushMatrix());
+ glsafe(::glMultMatrixf(m_world_transform.data()));
+
+ m_model.render();
+
+ glsafe(::glPopMatrix());
+
+ shader->stop_using();
+
+ glsafe(::glDisable(GL_BLEND));
+
+ static float last_window_width = 0.0f;
+ static size_t last_text_length = 0;
+
+ ImGuiWrapper& imgui = *wxGetApp().imgui();
+ Size cnv_size = wxGetApp().plater()->get_current_canvas3D()->get_canvas_size();
+ imgui.set_next_window_pos(0.5f * static_cast<float>(cnv_size.get_width()), static_cast<float>(cnv_size.get_height()), ImGuiCond_Always, 0.5f, 1.0f);
+ ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
+ ImGui::SetNextWindowBgAlpha(0.25f);
+ imgui.begin(std::string("ToolPosition"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove);
+ imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _u8L("Tool position") + ":");
+ ImGui::SameLine();
+ char buf[1024];
+ sprintf(buf, "X: %.2f, Y: %.2f, Z: %.2f", m_world_position(0), m_world_position(1), m_world_position(2));
+ imgui.text(std::string(buf));
+
+ // force extra frame to automatically update window size
+ float width = ImGui::GetWindowWidth();
+ size_t length = strlen(buf);
+ if (width != last_window_width || length != last_text_length) {
+ last_window_width = width;
+ last_text_length = length;
+ wxGetApp().plater()->get_current_canvas3D()->set_as_dirty();
+ wxGetApp().plater()->get_current_canvas3D()->request_extra_frame();
+ }
+
+ imgui.end();
+ ImGui::PopStyleVar();
+}
+
+const std::vector<GCodeViewer::Color> GCodeViewer::Extrusion_Role_Colors {{
+ { 0.75f, 0.75f, 0.75f }, // erNone
+ { 1.00f, 0.90f, 0.30f }, // erPerimeter
+ { 1.00f, 0.49f, 0.22f }, // erExternalPerimeter
+ { 0.12f, 0.12f, 1.00f }, // erOverhangPerimeter
+ { 0.69f, 0.19f, 0.16f }, // erInternalInfill
+ { 0.59f, 0.33f, 0.80f }, // erSolidInfill
+ { 0.94f, 0.25f, 0.25f }, // erTopSolidInfill
+ { 1.00f, 0.55f, 0.41f }, // erIroning
+ { 0.30f, 0.50f, 0.73f }, // erBridgeInfill
+ { 1.00f, 1.00f, 1.00f }, // erGapFill
+ { 0.00f, 0.53f, 0.43f }, // erSkirt
+ { 0.00f, 1.00f, 0.00f }, // erSupportMaterial
+ { 0.00f, 0.50f, 0.00f }, // erSupportMaterialInterface
+ { 0.70f, 0.89f, 0.67f }, // erWipeTower
+ { 0.37f, 0.82f, 0.58f }, // erCustom
+ { 0.00f, 0.00f, 0.00f } // erMixed
+}};
+
+const std::vector<GCodeViewer::Color> GCodeViewer::Options_Colors {{
+ { 0.803f, 0.135f, 0.839f }, // Retractions
+ { 0.287f, 0.679f, 0.810f }, // Unretractions
+ { 0.758f, 0.744f, 0.389f }, // ToolChanges
+ { 0.856f, 0.582f, 0.546f }, // ColorChanges
+ { 0.322f, 0.942f, 0.512f }, // PausePrints
+ { 0.886f, 0.825f, 0.262f } // CustomGCodes
+}};
+
+const std::vector<GCodeViewer::Color> GCodeViewer::Travel_Colors {{
+ { 0.219f, 0.282f, 0.609f }, // Move
+ { 0.112f, 0.422f, 0.103f }, // Extrude
+ { 0.505f, 0.064f, 0.028f } // Retract
+}};
+
+const GCodeViewer::Color GCodeViewer::Wipe_Color = { 1.0f, 1.0f, 0.0f };
+
+const std::vector<GCodeViewer::Color> GCodeViewer::Range_Colors {{
+ { 0.043f, 0.173f, 0.478f }, // bluish
+ { 0.075f, 0.349f, 0.522f },
+ { 0.110f, 0.533f, 0.569f },
+ { 0.016f, 0.839f, 0.059f },
+ { 0.667f, 0.949f, 0.000f },
+ { 0.988f, 0.975f, 0.012f },
+ { 0.961f, 0.808f, 0.039f },
+ { 0.890f, 0.533f, 0.125f },
+ { 0.820f, 0.408f, 0.188f },
+ { 0.761f, 0.322f, 0.235f },
+ { 0.581f, 0.149f, 0.087f } // reddish
+}};
+
+void GCodeViewer::load(const GCodeProcessor::Result& gcode_result, const Print& print, bool initialized)
+{
+ init();
+
+ // avoid processing if called with the same gcode_result
+ if (m_last_result_id == gcode_result.id)
+ return;
+
+ m_last_result_id = gcode_result.id;
+
+ // release gpu memory, if used
+ reset();
+
+ load_toolpaths(gcode_result);
+ if (m_layers.empty())
+ return;
+
+ m_settings_ids = gcode_result.settings_ids;
+
+ if (wxGetApp().is_editor())
+ load_shells(print, initialized);
+ else {
+ Pointfs bed_shape;
+ std::string texture;
+ std::string model;
+
+ if (!gcode_result.bed_shape.empty()) {
+ // bed shape detected in the gcode
+ bed_shape = gcode_result.bed_shape;
+ auto bundle = wxGetApp().preset_bundle;
+ if (bundle != nullptr && !m_settings_ids.printer.empty()) {
+ const Preset* preset = bundle->printers.find_preset(m_settings_ids.printer);
+ if (preset != nullptr) {
+ model = PresetUtils::system_printer_bed_model(*preset);
+ texture = PresetUtils::system_printer_bed_texture(*preset);
+ }
+ }
+ }
+ else {
+ // adjust printbed size in dependence of toolpaths bbox
+ const double margin = 10.0;
+ Vec2d min(m_paths_bounding_box.min(0) - margin, m_paths_bounding_box.min(1) - margin);
+ Vec2d max(m_paths_bounding_box.max(0) + margin, m_paths_bounding_box.max(1) + margin);
+
+ Vec2d size = max - min;
+ bed_shape = {
+ { min(0), min(1) },
+ { max(0), min(1) },
+ { max(0), min(1) + 0.442265 * size[1]},
+ { max(0) - 10.0, min(1) + 0.4711325 * size[1]},
+ { max(0) + 10.0, min(1) + 0.5288675 * size[1]},
+ { max(0), min(1) + 0.557735 * size[1]},
+ { max(0), max(1) },
+ { min(0) + 0.557735 * size[0], max(1)},
+ { min(0) + 0.5288675 * size[0], max(1) - 10.0},
+ { min(0) + 0.4711325 * size[0], max(1) + 10.0},
+ { min(0) + 0.442265 * size[0], max(1)},
+ { min(0), max(1) } };
+ }
+
+ wxGetApp().plater()->set_bed_shape(bed_shape, texture, model, gcode_result.bed_shape.empty());
+ }
+
+ m_time_statistics = gcode_result.time_statistics;
+
+ if (m_time_estimate_mode != PrintEstimatedTimeStatistics::ETimeMode::Normal) {
+ float time = m_time_statistics.modes[static_cast<size_t>(m_time_estimate_mode)].time;
+ if (time == 0.0f ||
+ short_time(get_time_dhms(time)) == short_time(get_time_dhms(m_time_statistics.modes[static_cast<size_t>(PrintEstimatedTimeStatistics::ETimeMode::Normal)].time)))
+ m_time_estimate_mode = PrintEstimatedTimeStatistics::ETimeMode::Normal;
+ }
+}
+
+void GCodeViewer::refresh(const GCodeProcessor::Result& gcode_result, const std::vector<std::string>& str_tool_colors)
+{
+#if ENABLE_GCODE_VIEWER_STATISTICS
+ auto start_time = std::chrono::high_resolution_clock::now();
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+
+ if (m_moves_count == 0)
+ return;
+
+ wxBusyCursor busy;
+
+ if (m_view_type == EViewType::Tool && !gcode_result.extruder_colors.empty())
+ // update tool colors from config stored in the gcode
+ m_tool_colors = decode_colors(gcode_result.extruder_colors);
+ else
+ // update tool colors
+ m_tool_colors = decode_colors(str_tool_colors);
+
+ // ensure at least one (default) color is defined
+ if (m_tool_colors.empty())
+ m_tool_colors.push_back(decode_color("#FF8000"));
+
+ // update ranges for coloring / legend
+ m_extrusions.reset_ranges();
+ for (size_t i = 0; i < m_moves_count; ++i) {
+ // skip first vertex
+ if (i == 0)
+ continue;
+
+ const GCodeProcessor::MoveVertex& curr = gcode_result.moves[i];
+
+ switch (curr.type)
+ {
+ case EMoveType::Extrude:
+ {
+ m_extrusions.ranges.height.update_from(round_to_nearest(curr.height, 2));
+ m_extrusions.ranges.width.update_from(round_to_nearest(curr.width, 2));
+ m_extrusions.ranges.fan_speed.update_from(curr.fan_speed);
+ m_extrusions.ranges.volumetric_rate.update_from(round_to_nearest(curr.volumetric_rate(), 2));
+ [[fallthrough]];
+ }
+ case EMoveType::Travel:
+ {
+ if (m_buffers[buffer_id(curr.type)].visible)
+ m_extrusions.ranges.feedrate.update_from(curr.feedrate);
+
+ break;
+ }
+ default: { break; }
+ }
+ }
+
+#if ENABLE_GCODE_VIEWER_STATISTICS
+ m_statistics.refresh_time = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - start_time).count();
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+
+ // update buffers' render paths
+#if ENABLE_RENDER_PATH_REFRESH_AFTER_OPTIONS_CHANGE
+ refresh_render_paths();
+#else
+ refresh_render_paths(false, false);
+#endif // ENABLE_RENDER_PATH_REFRESH_AFTER_OPTIONS_CHANGE
+
+ log_memory_used("Refreshed G-code extrusion paths, ");
+}
+
+#if ENABLE_RENDER_PATH_REFRESH_AFTER_OPTIONS_CHANGE
+void GCodeViewer::refresh_render_paths()
+{
+ refresh_render_paths(false, false);
+}
+#endif // ENABLE_RENDER_PATH_REFRESH_AFTER_OPTIONS_CHANGE
+
+void GCodeViewer::update_shells_color_by_extruder(const DynamicPrintConfig* config)
+{
+ if (config != nullptr)
+ m_shells.volumes.update_colors_by_extruder(config);
+}
+
+void GCodeViewer::reset()
+{
+ m_initialized = false;
+ m_gl_data_initialized = false;
+
+ m_moves_count = 0;
+ for (TBuffer& buffer : m_buffers) {
+ buffer.reset();
+ }
+
+ m_paths_bounding_box = BoundingBoxf3();
+ m_max_bounding_box = BoundingBoxf3();
+ m_tool_colors = std::vector<Color>();
+ m_extruders_count = 0;
+ m_extruder_ids = std::vector<unsigned char>();
+ m_extrusions.reset_role_visibility_flags();
+ m_extrusions.reset_ranges();
+ m_shells.volumes.clear();
+ m_layers.reset();
+ m_layers_z_range = { 0, 0 };
+ m_roles = std::vector<ExtrusionRole>();
+ m_time_statistics.reset();
+
+#if ENABLE_GCODE_VIEWER_STATISTICS
+ m_statistics.reset_all();
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+}
+
+void GCodeViewer::render() const
+{
+ auto init_gl_data = [this]() {
+ // initializes opengl data of TBuffers
+ for (size_t i = 0; i < m_buffers.size(); ++i) {
+ TBuffer& buffer = m_buffers[i];
+ switch (buffer_type(i)) {
+ 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::Wipe:
+ 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<int, 2> point_sizes;
+ ::glGetIntegerv(GL_ALIASED_POINT_SIZE_RANGE, point_sizes.data());
+ m_detected_point_sizes = { static_cast<float>(point_sizes[0]), static_cast<float>(point_sizes[1]) };
+ m_gl_data_initialized = true;
+ };
+
+#if ENABLE_GCODE_VIEWER_STATISTICS
+ m_statistics.reset_opengl();
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+
+ // OpenGL data must be initialized after the glContext has been created.
+ // This is ensured when this method is called by GLCanvas3D::_render_gcode().
+ if (!m_gl_data_initialized)
+ init_gl_data();
+
+ if (m_roles.empty())
+ return;
+
+ 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
+ render_statistics();
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+}
+
+void GCodeViewer::update_sequential_view_current(unsigned int first, unsigned int last)
+{
+ auto is_visible = [this](unsigned int id) {
+ for (const TBuffer& buffer : m_buffers) {
+ if (buffer.visible) {
+ for (const Path& path : buffer.paths) {
+ if (path.first.s_id <= id && id <= path.last.s_id)
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ int first_diff = static_cast<int>(first) - static_cast<int>(m_sequential_view.last_current.first);
+ int last_diff = static_cast<int>(last) - static_cast<int>(m_sequential_view.last_current.last);
+
+ unsigned int new_first = first;
+ unsigned int new_last = last;
+
+ if (m_sequential_view.skip_invisible_moves) {
+ while (!is_visible(new_first)) {
+ if (first_diff > 0)
+ ++new_first;
+ else
+ --new_first;
+ }
+
+ while (!is_visible(new_last)) {
+ if (last_diff > 0)
+ ++new_last;
+ else
+ --new_last;
+ }
+ }
+
+ m_sequential_view.current.first = new_first;
+ m_sequential_view.current.last = new_last;
+ m_sequential_view.last_current = m_sequential_view.current;
+
+ refresh_render_paths(true, true);
+
+ if (new_first != first || new_last != last)
+ wxGetApp().plater()->update_preview_moves_slider();
+}
+
+bool GCodeViewer::is_toolpath_move_type_visible(EMoveType type) const
+{
+ size_t id = static_cast<size_t>(buffer_id(type));
+ return (id < m_buffers.size()) ? m_buffers[id].visible : false;
+}
+
+void GCodeViewer::set_toolpath_move_type_visible(EMoveType type, bool visible)
+{
+ size_t id = static_cast<size_t>(buffer_id(type));
+ if (id < m_buffers.size())
+ m_buffers[id].visible = visible;
+}
+
+unsigned int GCodeViewer::get_options_visibility_flags() const
+{
+ auto set_flag = [](unsigned int flags, unsigned int flag, bool active) {
+ return active ? (flags | (1 << flag)) : flags;
+ };
+
+ unsigned int flags = 0;
+ flags = set_flag(flags, static_cast<unsigned int>(Preview::OptionType::Travel), is_toolpath_move_type_visible(EMoveType::Travel));
+ flags = set_flag(flags, static_cast<unsigned int>(Preview::OptionType::Wipe), is_toolpath_move_type_visible(EMoveType::Wipe));
+ flags = set_flag(flags, static_cast<unsigned int>(Preview::OptionType::Retractions), is_toolpath_move_type_visible(EMoveType::Retract));
+ flags = set_flag(flags, static_cast<unsigned int>(Preview::OptionType::Unretractions), is_toolpath_move_type_visible(EMoveType::Unretract));
+ flags = set_flag(flags, static_cast<unsigned int>(Preview::OptionType::ToolChanges), is_toolpath_move_type_visible(EMoveType::Tool_change));
+ flags = set_flag(flags, static_cast<unsigned int>(Preview::OptionType::ColorChanges), is_toolpath_move_type_visible(EMoveType::Color_change));
+ flags = set_flag(flags, static_cast<unsigned int>(Preview::OptionType::PausePrints), is_toolpath_move_type_visible(EMoveType::Pause_Print));
+ flags = set_flag(flags, static_cast<unsigned int>(Preview::OptionType::CustomGCodes), is_toolpath_move_type_visible(EMoveType::Custom_GCode));
+ flags = set_flag(flags, static_cast<unsigned int>(Preview::OptionType::Shells), m_shells.visible);
+ flags = set_flag(flags, static_cast<unsigned int>(Preview::OptionType::ToolMarker), m_sequential_view.marker.is_visible());
+ flags = set_flag(flags, static_cast<unsigned int>(Preview::OptionType::Legend), is_legend_enabled());
+ return flags;
+}
+
+void GCodeViewer::set_options_visibility_from_flags(unsigned int flags)
+{
+ auto is_flag_set = [flags](unsigned int flag) {
+ return (flags & (1 << flag)) != 0;
+ };
+
+ set_toolpath_move_type_visible(EMoveType::Travel, is_flag_set(static_cast<unsigned int>(Preview::OptionType::Travel)));
+ set_toolpath_move_type_visible(EMoveType::Wipe, is_flag_set(static_cast<unsigned int>(Preview::OptionType::Wipe)));
+ set_toolpath_move_type_visible(EMoveType::Retract, is_flag_set(static_cast<unsigned int>(Preview::OptionType::Retractions)));
+ set_toolpath_move_type_visible(EMoveType::Unretract, is_flag_set(static_cast<unsigned int>(Preview::OptionType::Unretractions)));
+ set_toolpath_move_type_visible(EMoveType::Tool_change, is_flag_set(static_cast<unsigned int>(Preview::OptionType::ToolChanges)));
+ set_toolpath_move_type_visible(EMoveType::Color_change, is_flag_set(static_cast<unsigned int>(Preview::OptionType::ColorChanges)));
+ set_toolpath_move_type_visible(EMoveType::Pause_Print, is_flag_set(static_cast<unsigned int>(Preview::OptionType::PausePrints)));
+ set_toolpath_move_type_visible(EMoveType::Custom_GCode, is_flag_set(static_cast<unsigned int>(Preview::OptionType::CustomGCodes)));
+ m_shells.visible = is_flag_set(static_cast<unsigned int>(Preview::OptionType::Shells));
+ m_sequential_view.marker.set_visible(is_flag_set(static_cast<unsigned int>(Preview::OptionType::ToolMarker)));
+ enable_legend(is_flag_set(static_cast<unsigned int>(Preview::OptionType::Legend)));
+}
+
+void GCodeViewer::set_layers_z_range(const std::array<unsigned int, 2>& layers_z_range)
+{
+ bool keep_sequential_current_first = layers_z_range[0] >= m_layers_z_range[0];
+ bool keep_sequential_current_last = layers_z_range[1] <= m_layers_z_range[1];
+ m_layers_z_range = layers_z_range;
+ refresh_render_paths(keep_sequential_current_first, keep_sequential_current_last);
+ wxGetApp().plater()->update_preview_moves_slider();
+}
+
+void GCodeViewer::export_toolpaths_to_obj(const char* filename) const
+{
+ if (filename == nullptr)
+ return;
+
+ if (!has_data())
+ return;
+
+ wxBusyCursor busy;
+
+ // the data needed is contained into the Extrude TBuffer
+ const TBuffer& buffer = m_buffers[buffer_id(EMoveType::Extrude)];
+ if (!buffer.has_data())
+ return;
+
+ // collect color information to generate materials
+ std::vector<Color> colors;
+ for (const RenderPath& path : buffer.render_paths) {
+ colors.push_back(path.color);
+ }
+
+ // save materials file
+ boost::filesystem::path mat_filename(filename);
+ mat_filename.replace_extension("mtl");
+ FILE* fp = boost::nowide::fopen(mat_filename.string().c_str(), "w");
+ if (fp == nullptr) {
+ BOOST_LOG_TRIVIAL(error) << "GCodeViewer::export_toolpaths_to_obj: Couldn't open " << mat_filename.string().c_str() << " for writing";
+ return;
+ }
+
+ fprintf(fp, "# G-Code Toolpaths Materials\n");
+ fprintf(fp, "# Generated by %s based on Slic3r\n", SLIC3R_BUILD_ID);
+
+ unsigned int colors_count = 1;
+ for (const Color& color : colors) {
+ fprintf(fp, "\nnewmtl material_%d\n", colors_count++);
+ fprintf(fp, "Ka 1 1 1\n");
+ fprintf(fp, "Kd %f %f %f\n", color[0], color[1], color[2]);
+ fprintf(fp, "Ks 0 0 0\n");
+ }
+
+ fclose(fp);
+
+ // save geometry file
+ fp = boost::nowide::fopen(filename, "w");
+ if (fp == nullptr) {
+ BOOST_LOG_TRIVIAL(error) << "GCodeViewer::export_toolpaths_to_obj: Couldn't open " << filename << " for writing";
+ return;
+ }
+
+ fprintf(fp, "# G-Code Toolpaths\n");
+ fprintf(fp, "# Generated by %s based on Slic3r\n", SLIC3R_BUILD_ID);
+ fprintf(fp, "\nmtllib ./%s\n", mat_filename.filename().string().c_str());
+
+ // get vertices data from vertex buffer on gpu
+ size_t floats_per_vertex = buffer.vertices.vertex_size_floats();
+ std::vector<float> vertices = std::vector<float>(buffer.vertices.count * floats_per_vertex);
+ glsafe(::glBindBuffer(GL_ARRAY_BUFFER, buffer.vertices.id));
+ glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, 0, buffer.vertices.data_size_bytes(), vertices.data()));
+ glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0));
+
+ // get indices data from index buffer on gpu
+ MultiIndexBuffer indices;
+ for (size_t i = 0; i < buffer.indices.size(); ++i) {
+ indices.push_back(IndexBuffer(buffer.indices[i].count));
+ glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer.indices[i].id));
+ glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, 0, static_cast<GLsizeiptr>(indices.back().size() * sizeof(unsigned int)), indices.back().data()));
+ glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
+ }
+
+ auto get_vertex = [&vertices, floats_per_vertex](unsigned int id) {
+ // extract vertex from vector of floats
+ unsigned int base_id = id * floats_per_vertex;
+ return Vec3f(vertices[base_id + 0], vertices[base_id + 1], vertices[base_id + 2]);
+ };
+
+ struct Segment
+ {
+ Vec3f v1;
+ Vec3f v2;
+ Vec3f dir;
+ Vec3f right;
+ Vec3f up;
+ Vec3f rl_displacement;
+ Vec3f tb_displacement;
+ float length;
+ };
+
+ auto generate_segment = [get_vertex](unsigned int start_id, unsigned int end_id, float half_width, float half_height) {
+ auto local_basis = [](const Vec3f& dir) {
+ // calculate local basis (dir, right, up) on given segment
+ std::array<Vec3f, 3> ret;
+ ret[0] = dir.normalized();
+ if (std::abs(ret[0][2]) < EPSILON) {
+ // segment parallel to XY plane
+ ret[1] = { ret[0][1], -ret[0][0], 0.0f };
+ ret[2] = Vec3f::UnitZ();
+ }
+ else if (std::abs(std::abs(ret[0].dot(Vec3f::UnitZ())) - 1.0f) < EPSILON) {
+ // segment parallel to Z axis
+ ret[1] = Vec3f::UnitX();
+ ret[2] = Vec3f::UnitY();
+ }
+ else {
+ ret[0] = dir.normalized();
+ ret[1] = ret[0].cross(Vec3f::UnitZ()).normalized();
+ ret[2] = ret[1].cross(ret[0]);
+ }
+ return ret;
+ };
+
+ Vec3f v1 = get_vertex(start_id) - half_height * Vec3f::UnitZ();
+ Vec3f v2 = get_vertex(end_id) - half_height * Vec3f::UnitZ();
+ float length = (v2 - v1).norm();
+ const auto&& [dir, right, up] = local_basis(v2 - v1);
+ return Segment({ v1, v2, dir, right, up, half_width * right, half_height * up, length });
+ };
+
+ size_t out_vertices_count = 0;
+ unsigned int indices_per_segment = buffer.indices_per_segment();
+ unsigned int start_vertex_offset = buffer.start_segment_vertex_offset();
+ unsigned int end_vertex_offset = buffer.end_segment_vertex_offset();
+
+ size_t i = 0;
+ for (const RenderPath& render_path : buffer.render_paths) {
+ // get paths segments from buffer paths
+ const IndexBuffer& ibuffer = indices[render_path.index_buffer_id];
+ const Path& path = buffer.paths[render_path.path_id];
+ float half_width = 0.5f * path.width;
+ // clamp height to avoid artifacts due to z-fighting when importing the obj file into blender and similar
+ float half_height = std::max(0.5f * path.height, 0.005f);
+
+ // generates vertices/normals/triangles
+ std::vector<Vec3f> out_vertices;
+ std::vector<Vec3f> out_normals;
+ using Triangle = std::array<size_t, 3>;
+ std::vector<Triangle> out_triangles;
+ for (size_t j = 0; j < render_path.offsets.size(); ++j) {
+ unsigned int start = static_cast<unsigned int>(render_path.offsets[j] / sizeof(unsigned int));
+ unsigned int end = start + render_path.sizes[j];
+
+ for (size_t k = start; k < end; k += static_cast<size_t>(indices_per_segment)) {
+ Segment curr = generate_segment(ibuffer[k + start_vertex_offset], ibuffer[k + end_vertex_offset], half_width, half_height);
+ if (k == start) {
+ // starting endpoint vertices/normals
+ out_vertices.push_back(curr.v1 + curr.rl_displacement); out_normals.push_back(curr.right); // right
+ out_vertices.push_back(curr.v1 + curr.tb_displacement); out_normals.push_back(curr.up); // top
+ out_vertices.push_back(curr.v1 - curr.rl_displacement); out_normals.push_back(-curr.right); // left
+ out_vertices.push_back(curr.v1 - curr.tb_displacement); out_normals.push_back(-curr.up); // bottom
+ out_vertices_count += 4;
+
+ // starting cap triangles
+ size_t base_id = out_vertices_count - 4 + 1;
+ out_triangles.push_back({ base_id + 0, base_id + 1, base_id + 2 });
+ out_triangles.push_back({ base_id + 0, base_id + 2, base_id + 3 });
+ }
+ else {
+ // for the endpoint shared by the current and the previous segments
+ // we keep the top and bottom vertices of the previous vertices
+ // and add new left/right vertices for the current segment
+ out_vertices.push_back(curr.v1 + curr.rl_displacement); out_normals.push_back(curr.right); // right
+ out_vertices.push_back(curr.v1 - curr.rl_displacement); out_normals.push_back(-curr.right); // left
+ out_vertices_count += 2;
+
+ size_t first_vertex_id = k - static_cast<size_t>(indices_per_segment);
+ Segment prev = generate_segment(ibuffer[first_vertex_id + start_vertex_offset], ibuffer[first_vertex_id + end_vertex_offset], half_width, half_height);
+ float disp = 0.0f;
+ float cos_dir = prev.dir.dot(curr.dir);
+ if (cos_dir > -0.9998477f) {
+ // if the angle between adjacent segments is smaller than 179 degrees
+ Vec3f med_dir = (prev.dir + curr.dir).normalized();
+ disp = half_width * ::tan(::acos(std::clamp(curr.dir.dot(med_dir), -1.0f, 1.0f)));
+ }
+
+ Vec3f disp_vec = disp * prev.dir;
+
+ bool is_right_turn = prev.up.dot(prev.dir.cross(curr.dir)) <= 0.0f;
+ if (cos_dir < 0.7071068f) {
+ // if the angle between two consecutive segments is greater than 45 degrees
+ // we add a cap in the outside corner
+ // and displace the vertices in the inside corner to the same position, if possible
+ if (is_right_turn) {
+ // corner cap triangles (left)
+ size_t base_id = out_vertices_count - 6 + 1;
+ out_triangles.push_back({ base_id + 5, base_id + 2, base_id + 1 });
+ out_triangles.push_back({ base_id + 5, base_id + 3, base_id + 2 });
+
+ // update right vertices
+ if (disp > 0.0f && disp < prev.length && disp < curr.length) {
+ base_id = out_vertices.size() - 6;
+ out_vertices[base_id + 0] -= disp_vec;
+ out_vertices[base_id + 4] = out_vertices[base_id + 0];
+ }
+ }
+ else {
+ // corner cap triangles (right)
+ size_t base_id = out_vertices_count - 6 + 1;
+ out_triangles.push_back({ base_id + 0, base_id + 4, base_id + 1 });
+ out_triangles.push_back({ base_id + 0, base_id + 3, base_id + 4 });
+
+ // update left vertices
+ if (disp > 0.0f && disp < prev.length && disp < curr.length) {
+ base_id = out_vertices.size() - 6;
+ out_vertices[base_id + 2] -= disp_vec;
+ out_vertices[base_id + 5] = out_vertices[base_id + 2];
+ }
+ }
+ }
+ else {
+ // if the angle between two consecutive segments is lesser than 45 degrees
+ // displace the vertices to the same position
+ if (is_right_turn) {
+ size_t base_id = out_vertices.size() - 6;
+ // right
+ out_vertices[base_id + 0] -= disp_vec;
+ out_vertices[base_id + 4] = out_vertices[base_id + 0];
+ // left
+ out_vertices[base_id + 2] += disp_vec;
+ out_vertices[base_id + 5] = out_vertices[base_id + 2];
+ }
+ else {
+ size_t base_id = out_vertices.size() - 6;
+ // right
+ out_vertices[base_id + 0] += disp_vec;
+ out_vertices[base_id + 4] = out_vertices[base_id + 0];
+ // left
+ out_vertices[base_id + 2] -= disp_vec;
+ out_vertices[base_id + 5] = out_vertices[base_id + 2];
+ }
+ }
+ }
+
+ // current second endpoint vertices/normals
+ out_vertices.push_back(curr.v2 + curr.rl_displacement); out_normals.push_back(curr.right); // right
+ out_vertices.push_back(curr.v2 + curr.tb_displacement); out_normals.push_back(curr.up); // top
+ out_vertices.push_back(curr.v2 - curr.rl_displacement); out_normals.push_back(-curr.right); // left
+ out_vertices.push_back(curr.v2 - curr.tb_displacement); out_normals.push_back(-curr.up); // bottom
+ out_vertices_count += 4;
+
+ // sides triangles
+ if (k == start) {
+ size_t base_id = out_vertices_count - 8 + 1;
+ out_triangles.push_back({ base_id + 0, base_id + 4, base_id + 5 });
+ out_triangles.push_back({ base_id + 0, base_id + 5, base_id + 1 });
+ out_triangles.push_back({ base_id + 1, base_id + 5, base_id + 6 });
+ out_triangles.push_back({ base_id + 1, base_id + 6, base_id + 2 });
+ out_triangles.push_back({ base_id + 2, base_id + 6, base_id + 7 });
+ out_triangles.push_back({ base_id + 2, base_id + 7, base_id + 3 });
+ out_triangles.push_back({ base_id + 3, base_id + 7, base_id + 4 });
+ out_triangles.push_back({ base_id + 3, base_id + 4, base_id + 0 });
+ }
+ else {
+ size_t base_id = out_vertices_count - 10 + 1;
+ out_triangles.push_back({ base_id + 4, base_id + 6, base_id + 7 });
+ out_triangles.push_back({ base_id + 4, base_id + 7, base_id + 1 });
+ out_triangles.push_back({ base_id + 1, base_id + 7, base_id + 8 });
+ out_triangles.push_back({ base_id + 1, base_id + 8, base_id + 5 });
+ out_triangles.push_back({ base_id + 5, base_id + 8, base_id + 9 });
+ out_triangles.push_back({ base_id + 5, base_id + 9, base_id + 3 });
+ out_triangles.push_back({ base_id + 3, base_id + 9, base_id + 6 });
+ out_triangles.push_back({ base_id + 3, base_id + 6, base_id + 4 });
+ }
+
+ if (k + 2 == end) {
+ // ending cap triangles
+ size_t base_id = out_vertices_count - 4 + 1;
+ out_triangles.push_back({ base_id + 0, base_id + 2, base_id + 1 });
+ out_triangles.push_back({ base_id + 0, base_id + 3, base_id + 2 });
+ }
+ }
+ }
+
+ // save to file
+ fprintf(fp, "\n# vertices path %zu\n", i + 1);
+ for (const Vec3f& v : out_vertices) {
+ fprintf(fp, "v %g %g %g\n", v[0], v[1], v[2]);
+ }
+
+ fprintf(fp, "\n# normals path %zu\n", i + 1);
+ for (const Vec3f& n : out_normals) {
+ fprintf(fp, "vn %g %g %g\n", n[0], n[1], n[2]);
+ }
+
+ fprintf(fp, "\n# material path %zu\n", i + 1);
+ fprintf(fp, "usemtl material_%zu\n", i + 1);
+
+ fprintf(fp, "\n# triangles path %zu\n", i + 1);
+ for (const Triangle& t : out_triangles) {
+ fprintf(fp, "f %zu//%zu %zu//%zu %zu//%zu\n", t[0], t[0], t[1], t[1], t[2], t[2]);
+ }
+
+ ++ i;
+ }
+
+ fclose(fp);
+}
+
+void GCodeViewer::init()
+{
+ if (m_initialized)
+ return;
+
+ // initializes non opengl data of TBuffers
+ for (size_t i = 0; i < m_buffers.size(); ++i) {
+ TBuffer& buffer = m_buffers[i];
+ switch (buffer_type(i))
+ {
+ default: { break; }
+ case EMoveType::Tool_change:
+ case EMoveType::Color_change:
+ case EMoveType::Pause_Print:
+ case EMoveType::Custom_GCode:
+ case EMoveType::Retract:
+ case EMoveType::Unretract:
+ {
+ buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Point;
+ buffer.vertices.format = VBuffer::EFormat::Position;
+ break;
+ }
+ case EMoveType::Wipe:
+ case EMoveType::Extrude:
+ {
+ buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Triangle;
+ buffer.vertices.format = VBuffer::EFormat::PositionNormal3;
+ break;
+ }
+ case EMoveType::Travel:
+ {
+ buffer.render_primitive_type = TBuffer::ERenderPrimitiveType::Line;
+ buffer.vertices.format = VBuffer::EFormat::PositionNormal1;
+ break;
+ }
+ }
+ }
+
+ set_toolpath_move_type_visible(EMoveType::Extrude, true);
+// m_sequential_view.skip_invisible_moves = true;
+
+ m_initialized = true;
+}
+
+void GCodeViewer::load_toolpaths(const GCodeProcessor::Result& gcode_result)
+{
+#if ENABLE_GCODE_VIEWER_STATISTICS
+ auto start_time = std::chrono::high_resolution_clock::now();
+ m_statistics.results_size = SLIC3R_STDVEC_MEMSIZE(gcode_result.moves, GCodeProcessor::MoveVertex);
+ m_statistics.results_time = gcode_result.time;
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+
+ // vertices data
+ m_moves_count = gcode_result.moves.size();
+ if (m_moves_count == 0)
+ return;
+
+ unsigned int progress_count = 0;
+ static const unsigned int progress_threshold = 1000;
+ wxProgressDialog* progress_dialog = wxGetApp().is_gcode_viewer() ?
+ new wxProgressDialog(_L("Generating toolpaths"), "...",
+ 100, wxGetApp().plater(), wxPD_AUTO_HIDE | wxPD_APP_MODAL) : nullptr;
+
+ m_extruders_count = gcode_result.extruders_count;
+
+ for (size_t i = 0; i < m_moves_count; ++i) {
+ const GCodeProcessor::MoveVertex& move = gcode_result.moves[i];
+ if (wxGetApp().is_gcode_viewer())
+ // for the gcode viewer we need all moves to correctly size the printbed
+ m_paths_bounding_box.merge(move.position.cast<double>());
+ else {
+ if (move.type == EMoveType::Extrude && move.width != 0.0f && move.height != 0.0f)
+ m_paths_bounding_box.merge(move.position.cast<double>());
+ }
+ }
+
+ // max bounding box (account for tool marker)
+ m_max_bounding_box = m_paths_bounding_box;
+ m_max_bounding_box.merge(m_paths_bounding_box.max + m_sequential_view.marker.get_bounding_box().size()[2] * Vec3d::UnitZ());
+
+ auto log_memory_usage = [this](const std::string& label, const std::vector<std::vector<float>>& vertices, const std::vector<MultiIndexBuffer>& indices) {
+ int64_t vertices_size = 0;
+ for (size_t i = 0; i < vertices.size(); ++i) {
+ vertices_size += SLIC3R_STDVEC_MEMSIZE(vertices[i], float);
+ }
+ int64_t indices_size = 0;
+ for (size_t i = 0; i < indices.size(); ++i) {
+ for (size_t j = 0; j < indices[i].size(); ++j) {
+ indices_size += SLIC3R_STDVEC_MEMSIZE(indices[i][j], unsigned int);
+ }
+ }
+ log_memory_used(label, vertices_size + indices_size);
+ };
+
+ // format data into the buffers to be rendered as points
+ auto add_vertices_as_point = [](const GCodeProcessor::MoveVertex& curr, std::vector<float>& buffer_vertices) {
+ for (int j = 0; j < 3; ++j) {
+ buffer_vertices.push_back(curr.position[j]);
+ }
+ };
+ auto add_indices_as_point = [](const GCodeProcessor::MoveVertex& curr, TBuffer& buffer,
+ unsigned int index_buffer_id, IndexBuffer& buffer_indices, size_t move_id) {
+ buffer.add_path(curr, index_buffer_id, buffer_indices.size(), move_id);
+ buffer_indices.push_back(static_cast<unsigned int>(buffer_indices.size()));
+ };
+
+ // format data into the buffers to be rendered as lines
+ auto add_vertices_as_line = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr,
+ TBuffer& buffer, std::vector<float>& buffer_vertices) {
+ // x component of the normal to the current segment (the normal is parallel to the XY plane)
+ float normal_x = (curr.position - prev.position).normalized()[1];
+
+ auto add_vertex = [&buffer_vertices, normal_x](const GCodeProcessor::MoveVertex& vertex) {
+ // add position
+ for (int j = 0; j < 3; ++j) {
+ buffer_vertices.push_back(vertex.position[j]);
+ }
+ // add normal x component
+ buffer_vertices.push_back(normal_x);
+ };
+
+ // add previous vertex
+ add_vertex(prev);
+ // add current vertex
+ add_vertex(curr);
+ };
+ auto add_indices_as_line = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer,
+ unsigned int index_buffer_id, IndexBuffer& buffer_indices, size_t move_id) {
+ // x component of the normal to the current segment (the normal is parallel to the XY plane)
+ float normal_x = (curr.position - prev.position).normalized()[1];
+
+ if (prev.type != curr.type || !buffer.paths.back().matches(curr)) {
+ // add starting index
+ buffer_indices.push_back(static_cast<unsigned int>(buffer_indices.size()));
+ buffer.add_path(curr, index_buffer_id, buffer_indices.size() - 1, move_id - 1);
+ buffer.paths.back().first.position = prev.position;
+ }
+
+ Path& last_path = buffer.paths.back();
+ if (last_path.first.i_id != last_path.last.i_id) {
+ // add previous index
+ buffer_indices.push_back(static_cast<unsigned int>(buffer_indices.size()));
+ }
+
+ // add current index
+ buffer_indices.push_back(static_cast<unsigned int>(buffer_indices.size()));
+ last_path.last = { index_buffer_id, buffer_indices.size() - 1, move_id, curr.position };
+ };
+
+ // format data into the buffers to be rendered as solid
+ auto add_vertices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer,
+ std::vector<float>& buffer_vertices, size_t move_id) {
+ static Vec3f prev_dir;
+ static Vec3f prev_up;
+ static float prev_length;
+ auto store_vertex = [](std::vector<float>& buffer_vertices, const Vec3f& position, const Vec3f& normal) {
+ // append position
+ for (int j = 0; j < 3; ++j) {
+ buffer_vertices.push_back(position[j]);
+ }
+ // append normal
+ for (int j = 0; j < 3; ++j) {
+ buffer_vertices.push_back(normal[j]);
+ }
+ };
+ auto extract_position_at = [](const std::vector<float>& vertices, size_t id) {
+ return Vec3f(vertices[id + 0], vertices[id + 1], vertices[id + 2]);
+ };
+ auto update_position_at = [](std::vector<float>& vertices, size_t id, const Vec3f& position) {
+ vertices[id + 0] = position[0];
+ vertices[id + 1] = position[1];
+ vertices[id + 2] = position[2];
+ };
+
+ if (prev.type != curr.type || !buffer.paths.back().matches(curr)) {
+ buffer.add_path(curr, 0, 0, move_id - 1);
+ buffer.paths.back().first.position = prev.position;
+ }
+
+ unsigned int starting_vertices_size = static_cast<unsigned int>(buffer_vertices.size() / buffer.vertices.vertex_size_floats());
+
+ Vec3f dir = (curr.position - prev.position).normalized();
+ Vec3f right = (std::abs(std::abs(dir.dot(Vec3f::UnitZ())) - 1.0f) < EPSILON) ? -Vec3f::UnitY() : Vec3f(dir[1], -dir[0], 0.0f).normalized();
+ Vec3f left = -right;
+ Vec3f up = right.cross(dir);
+ Vec3f down = -up;
+
+ Path& last_path = buffer.paths.back();
+
+ float half_width = 0.5f * last_path.width;
+ float half_height = 0.5f * last_path.height;
+
+ Vec3f prev_pos = prev.position - half_height * up;
+ Vec3f curr_pos = curr.position - half_height * up;
+
+ float length = (curr_pos - prev_pos).norm();
+ if (last_path.vertices_count() == 1) {
+ // 1st segment
+
+ // vertices 1st endpoint
+ store_vertex(buffer_vertices, prev_pos + half_height * up, up);
+ store_vertex(buffer_vertices, prev_pos + half_width * right, right);
+ store_vertex(buffer_vertices, prev_pos + half_height * down, down);
+ store_vertex(buffer_vertices, prev_pos + half_width * left, left);
+
+ // vertices 2nd endpoint
+ store_vertex(buffer_vertices, curr_pos + half_height * up, up);
+ store_vertex(buffer_vertices, curr_pos + half_width * right, right);
+ store_vertex(buffer_vertices, curr_pos + half_height * down, down);
+ store_vertex(buffer_vertices, curr_pos + half_width * left, left);
+ }
+ else {
+ // any other segment
+ float displacement = 0.0f;
+ float cos_dir = prev_dir.dot(dir);
+ if (cos_dir > -0.9998477f) {
+ // if the angle between adjacent segments is smaller than 179 degrees
+ Vec3f med_dir = (prev_dir + dir).normalized();
+ displacement = half_width * ::tan(::acos(std::clamp(dir.dot(med_dir), -1.0f, 1.0f)));
+ }
+
+ Vec3f displacement_vec = displacement * prev_dir;
+ bool can_displace = displacement > 0.0f && displacement < prev_length&& displacement < length;
+
+ size_t prev_right_id = (starting_vertices_size - 3) * buffer.vertices.vertex_size_floats();
+ size_t prev_left_id = (starting_vertices_size - 1) * buffer.vertices.vertex_size_floats();
+ Vec3f prev_right_pos = extract_position_at(buffer_vertices, prev_right_id);
+ Vec3f prev_left_pos = extract_position_at(buffer_vertices, prev_left_id);
+
+ bool is_right_turn = prev_up.dot(prev_dir.cross(dir)) <= 0.0f;
+ // whether the angle between adjacent segments is greater than 45 degrees
+ bool is_sharp = cos_dir < 0.7071068f;
+
+ bool right_displaced = false;
+ bool left_displaced = false;
+
+ // displace the vertex (inner with respect to the corner) of the previous segment 2nd enpoint, if possible
+ if (can_displace) {
+ if (is_right_turn) {
+ prev_right_pos -= displacement_vec;
+ update_position_at(buffer_vertices, prev_right_id, prev_right_pos);
+ right_displaced = true;
+ }
+ else {
+ prev_left_pos -= displacement_vec;
+ update_position_at(buffer_vertices, prev_left_id, prev_left_pos);
+ left_displaced = true;
+ }
+ }
+
+ if (!is_sharp) {
+ // displace the vertex (outer with respect to the corner) of the previous segment 2nd enpoint, if possible
+ if (can_displace) {
+ if (is_right_turn) {
+ prev_left_pos += displacement_vec;
+ update_position_at(buffer_vertices, prev_left_id, prev_left_pos);
+ left_displaced = true;
+ }
+ else {
+ prev_right_pos += displacement_vec;
+ update_position_at(buffer_vertices, prev_right_id, prev_right_pos);
+ right_displaced = true;
+ }
+ }
+
+ // vertices 1st endpoint (top and bottom are from previous segment 2nd endpoint)
+ // vertices position matches that of the previous segment 2nd endpoint, if displaced
+ store_vertex(buffer_vertices, right_displaced ? prev_right_pos : prev_pos + half_width * right, right);
+ store_vertex(buffer_vertices, left_displaced ? prev_left_pos : prev_pos + half_width * left, left);
+ }
+ else {
+ // vertices 1st endpoint (top and bottom are from previous segment 2nd endpoint)
+ // the inner corner vertex position matches that of the previous segment 2nd endpoint, if displaced
+ if (is_right_turn) {
+ store_vertex(buffer_vertices, right_displaced ? prev_right_pos : prev_pos + half_width * right, right);
+ store_vertex(buffer_vertices, prev_pos + half_width * left, left);
+ }
+ else {
+ store_vertex(buffer_vertices, prev_pos + half_width * right, right);
+ store_vertex(buffer_vertices, left_displaced ? prev_left_pos : prev_pos + half_width * left, left);
+ }
+ }
+
+ // vertices 2nd endpoint
+ store_vertex(buffer_vertices, curr_pos + half_height * up, up);
+ store_vertex(buffer_vertices, curr_pos + half_width * right, right);
+ store_vertex(buffer_vertices, curr_pos + half_height * down, down);
+ store_vertex(buffer_vertices, curr_pos + half_width * left, left);
+ }
+
+ last_path.last = { 0, 0, move_id, curr.position };
+ prev_dir = dir;
+ prev_up = up;
+ prev_length = length;
+ };
+
+ auto add_indices_as_solid = [](const GCodeProcessor::MoveVertex& prev, const GCodeProcessor::MoveVertex& curr, TBuffer& buffer,
+ size_t& buffer_vertices_size, unsigned int index_buffer_id, IndexBuffer& buffer_indices, size_t move_id) {
+ static Vec3f prev_dir;
+ static Vec3f prev_up;
+ static float prev_length;
+ auto store_triangle = [](IndexBuffer& buffer_indices, unsigned int i1, unsigned int i2, unsigned int i3) {
+ buffer_indices.push_back(i1);
+ buffer_indices.push_back(i2);
+ buffer_indices.push_back(i3);
+ };
+ auto append_dummy_cap = [store_triangle](IndexBuffer& buffer_indices, unsigned int id) {
+ store_triangle(buffer_indices, id, id, id);
+ store_triangle(buffer_indices, id, id, id);
+ };
+
+ if (prev.type != curr.type || !buffer.paths.back().matches(curr)) {
+ buffer.add_path(curr, index_buffer_id, buffer_indices.size(), move_id - 1);
+ buffer.paths.back().first.position = prev.position;
+ }
+
+ unsigned int starting_vertices_size = static_cast<unsigned int>(buffer_vertices_size);
+
+ Vec3f dir = (curr.position - prev.position).normalized();
+ Vec3f right = (std::abs(std::abs(dir.dot(Vec3f::UnitZ())) - 1.0f) < EPSILON) ? -Vec3f::UnitY() : Vec3f(dir[1], -dir[0], 0.0f).normalized();
+ Vec3f up = right.cross(dir);
+
+ Path& last_path = buffer.paths.back();
+
+ float half_width = 0.5f * last_path.width;
+ float half_height = 0.5f * last_path.height;
+
+ Vec3f prev_pos = prev.position - half_height * up;
+ Vec3f curr_pos = curr.position - half_height * up;
+
+ float length = (curr_pos - prev_pos).norm();
+ if (last_path.vertices_count() == 1) {
+ // 1st segment
+ buffer_vertices_size += 8;
+
+ // triangles starting cap
+ store_triangle(buffer_indices, starting_vertices_size + 0, starting_vertices_size + 2, starting_vertices_size + 1);
+ store_triangle(buffer_indices, starting_vertices_size + 0, starting_vertices_size + 3, starting_vertices_size + 2);
+
+ // dummy triangles outer corner cap
+ append_dummy_cap(buffer_indices, starting_vertices_size);
+
+ // triangles sides
+ store_triangle(buffer_indices, starting_vertices_size + 0, starting_vertices_size + 1, starting_vertices_size + 4);
+ store_triangle(buffer_indices, starting_vertices_size + 1, starting_vertices_size + 5, starting_vertices_size + 4);
+ store_triangle(buffer_indices, starting_vertices_size + 1, starting_vertices_size + 2, starting_vertices_size + 5);
+ store_triangle(buffer_indices, starting_vertices_size + 2, starting_vertices_size + 6, starting_vertices_size + 5);
+ store_triangle(buffer_indices, starting_vertices_size + 2, starting_vertices_size + 3, starting_vertices_size + 6);
+ store_triangle(buffer_indices, starting_vertices_size + 3, starting_vertices_size + 7, starting_vertices_size + 6);
+ store_triangle(buffer_indices, starting_vertices_size + 3, starting_vertices_size + 0, starting_vertices_size + 7);
+ store_triangle(buffer_indices, starting_vertices_size + 0, starting_vertices_size + 4, starting_vertices_size + 7);
+
+ // triangles ending cap
+ store_triangle(buffer_indices, starting_vertices_size + 4, starting_vertices_size + 6, starting_vertices_size + 7);
+ store_triangle(buffer_indices, starting_vertices_size + 4, starting_vertices_size + 5, starting_vertices_size + 6);
+ }
+ else {
+ // any other segment
+ float displacement = 0.0f;
+ float cos_dir = prev_dir.dot(dir);
+ if (cos_dir > -0.9998477f) {
+ // if the angle between adjacent segments is smaller than 179 degrees
+ Vec3f med_dir = (prev_dir + dir).normalized();
+ displacement = half_width * ::tan(::acos(std::clamp(dir.dot(med_dir), -1.0f, 1.0f)));
+ }
+
+ Vec3f displacement_vec = displacement * prev_dir;
+ bool can_displace = displacement > 0.0f && displacement < prev_length && displacement < length;
+
+ bool is_right_turn = prev_up.dot(prev_dir.cross(dir)) <= 0.0f;
+ // whether the angle between adjacent segments is greater than 45 degrees
+ bool is_sharp = cos_dir < 0.7071068f;
+
+ bool right_displaced = false;
+ bool left_displaced = false;
+
+ if (!is_sharp) {
+ if (can_displace) {
+ if (is_right_turn)
+ left_displaced = true;
+ else
+ right_displaced = true;
+ }
+ }
+
+ buffer_vertices_size += 6;
+
+ // triangles starting cap
+ store_triangle(buffer_indices, starting_vertices_size - 4, starting_vertices_size - 2, starting_vertices_size + 0);
+ store_triangle(buffer_indices, starting_vertices_size - 4, starting_vertices_size + 1, starting_vertices_size - 2);
+
+ // triangles outer corner cap
+ if (is_right_turn) {
+ if (left_displaced)
+ // dummy triangles
+ append_dummy_cap(buffer_indices, starting_vertices_size);
+ else {
+ store_triangle(buffer_indices, starting_vertices_size - 4, starting_vertices_size + 1, starting_vertices_size - 1);
+ store_triangle(buffer_indices, starting_vertices_size + 1, starting_vertices_size - 2, starting_vertices_size - 1);
+ }
+ }
+ else {
+ if (right_displaced)
+ // dummy triangles
+ append_dummy_cap(buffer_indices, starting_vertices_size);
+ else {
+ store_triangle(buffer_indices, starting_vertices_size - 4, starting_vertices_size - 3, starting_vertices_size + 0);
+ store_triangle(buffer_indices, starting_vertices_size - 3, starting_vertices_size - 2, starting_vertices_size + 0);
+ }
+ }
+
+ // triangles sides
+ store_triangle(buffer_indices, starting_vertices_size - 4, starting_vertices_size + 0, starting_vertices_size + 2);
+ store_triangle(buffer_indices, starting_vertices_size + 0, starting_vertices_size + 3, starting_vertices_size + 2);
+ store_triangle(buffer_indices, starting_vertices_size + 0, starting_vertices_size - 2, starting_vertices_size + 3);
+ store_triangle(buffer_indices, starting_vertices_size - 2, starting_vertices_size + 4, starting_vertices_size + 3);
+ store_triangle(buffer_indices, starting_vertices_size - 2, starting_vertices_size + 1, starting_vertices_size + 4);
+ store_triangle(buffer_indices, starting_vertices_size + 1, starting_vertices_size + 5, starting_vertices_size + 4);
+ store_triangle(buffer_indices, starting_vertices_size + 1, starting_vertices_size - 4, starting_vertices_size + 5);
+ store_triangle(buffer_indices, starting_vertices_size - 4, starting_vertices_size + 2, starting_vertices_size + 5);
+
+ // triangles ending cap
+ store_triangle(buffer_indices, starting_vertices_size + 2, starting_vertices_size + 4, starting_vertices_size + 5);
+ store_triangle(buffer_indices, starting_vertices_size + 2, starting_vertices_size + 3, starting_vertices_size + 4);
+ }
+
+ last_path.last = { index_buffer_id, buffer_indices.size() - 1, move_id, curr.position };
+ prev_dir = dir;
+ prev_up = up;
+ prev_length = length;
+ };
+
+ wxBusyCursor busy;
+
+ // to reduce the peak in memory usage, we split the generation of the vertex and index buffers in two steps.
+ // the data are deleted as soon as they are sent to the gpu.
+ std::vector<std::vector<float>> vertices(m_buffers.size());
+ std::vector<MultiIndexBuffer> indices(m_buffers.size());
+ std::vector<float> options_zs;
+
+ // toolpaths data -> extract vertices from result
+ for (size_t i = 0; i < m_moves_count; ++i) {
+ // skip first vertex
+ if (i == 0)
+ continue;
+
+ ++progress_count;
+ if (progress_dialog != nullptr && progress_count % progress_threshold == 0) {
+ progress_dialog->Update(int(100.0f * float(i) / (2.0f * float(m_moves_count))),
+ _L("Generating vertex buffer") + ": " + wxNumberFormatter::ToString(100.0 * double(i) / double(m_moves_count), 0, wxNumberFormatter::Style_None) + "%");
+ progress_dialog->Fit();
+ progress_count = 0;
+ }
+
+ const GCodeProcessor::MoveVertex& prev = gcode_result.moves[i - 1];
+ const GCodeProcessor::MoveVertex& curr = gcode_result.moves[i];
+
+ unsigned char id = buffer_id(curr.type);
+ TBuffer& buffer = m_buffers[id];
+ std::vector<float>& buffer_vertices = vertices[id];
+
+ switch (buffer.render_primitive_type)
+ {
+ case TBuffer::ERenderPrimitiveType::Point: {
+ add_vertices_as_point(curr, buffer_vertices);
+ break;
+ }
+ case TBuffer::ERenderPrimitiveType::Line: {
+ add_vertices_as_line(prev, curr, buffer, buffer_vertices);
+ break;
+ }
+ case TBuffer::ERenderPrimitiveType::Triangle: {
+ add_vertices_as_solid(prev, curr, buffer, buffer_vertices, i);
+ break;
+ }
+ }
+
+ EMoveType type = buffer_type(id);
+ if (type == EMoveType::Pause_Print || type == EMoveType::Custom_GCode) {
+ const float* const last_z = options_zs.empty() ? nullptr : &options_zs.back();
+ float z = static_cast<double>(curr.position[2]);
+ if (last_z == nullptr || z < *last_z - EPSILON || *last_z + EPSILON < z)
+ options_zs.emplace_back(curr.position[2]);
+ }
+ }
+
+ // move the wipe toolpaths half height up to render them on proper position
+ std::vector<float>& wipe_vertices = vertices[buffer_id(EMoveType::Wipe)];
+ for (size_t i = 2; i < wipe_vertices.size(); i += 3) {
+ wipe_vertices[i] += 0.5f * GCodeProcessor::Wipe_Height;
+ }
+
+ log_memory_usage("Loaded G-code generated vertex buffers, ", vertices, indices);
+
+ // toolpaths data -> send vertices data to gpu
+ for (size_t i = 0; i < m_buffers.size(); ++i) {
+ TBuffer& buffer = m_buffers[i];
+
+ const std::vector<float>& buffer_vertices = vertices[i];
+ buffer.vertices.count = buffer_vertices.size() / buffer.vertices.vertex_size_floats();
+#if ENABLE_GCODE_VIEWER_STATISTICS
+ m_statistics.total_vertices_gpu_size += buffer_vertices.size() * sizeof(float);
+ m_statistics.max_vbuffer_gpu_size = std::max(m_statistics.max_vbuffer_gpu_size, static_cast<int64_t>(buffer_vertices.size() * sizeof(float)));
+ m_statistics.max_vertices_in_vertex_buffer = std::max(m_statistics.max_vertices_in_vertex_buffer, static_cast<int64_t>(buffer.vertices.count));
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+
+ if (buffer.vertices.count > 0) {
+#if ENABLE_GCODE_VIEWER_STATISTICS
+ ++m_statistics.vbuffers_count;
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+ glsafe(::glGenBuffers(1, &buffer.vertices.id));
+ glsafe(::glBindBuffer(GL_ARRAY_BUFFER, buffer.vertices.id));
+ glsafe(::glBufferData(GL_ARRAY_BUFFER, buffer_vertices.size() * sizeof(float), buffer_vertices.data(), GL_STATIC_DRAW));
+ glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0));
+ }
+ }
+
+ // dismiss vertices data, no more needed
+ std::vector<std::vector<float>>().swap(vertices);
+
+ // toolpaths data -> extract indices from result
+ // paths may have been filled while extracting vertices,
+ // so reset them, they will be filled again while extracting indices
+ for (TBuffer& buffer : m_buffers) {
+ buffer.paths.clear();
+ }
+
+ // max index buffer size
+ const size_t IBUFFER_THRESHOLD = 1024 * 1024 * 32;
+
+ // variable used to keep track of the current size (in vertices) of the vertex buffer
+ std::vector<size_t> curr_buffer_vertices_size(m_buffers.size(), 0);
+ for (size_t i = 0; i < m_moves_count; ++i) {
+ // skip first vertex
+ if (i == 0)
+ continue;
+
+ ++progress_count;
+ if (progress_dialog != nullptr && progress_count % progress_threshold == 0) {
+ progress_dialog->Update(int(100.0f * float(m_moves_count + i) / (2.0f * float(m_moves_count))),
+ _L("Generating index buffers") + ": " + wxNumberFormatter::ToString(100.0 * double(i) / double(m_moves_count), 0, wxNumberFormatter::Style_None) + "%");
+ progress_dialog->Fit();
+ progress_count = 0;
+ }
+
+ const GCodeProcessor::MoveVertex& prev = gcode_result.moves[i - 1];
+ const GCodeProcessor::MoveVertex& curr = gcode_result.moves[i];
+
+ unsigned char id = buffer_id(curr.type);
+ TBuffer& buffer = m_buffers[id];
+ MultiIndexBuffer& buffer_indices = indices[id];
+ if (buffer_indices.empty())
+ buffer_indices.push_back(IndexBuffer());
+
+ // if adding the indices for the current segment exceeds the threshold size of the current index buffer
+ // create another index buffer, and move the current path indices into it
+ if (buffer_indices.back().size() >= IBUFFER_THRESHOLD - static_cast<size_t>(buffer.indices_per_segment())) {
+ buffer_indices.push_back(IndexBuffer());
+ if (buffer.render_primitive_type != TBuffer::ERenderPrimitiveType::Point) {
+ if (!(prev.type != curr.type || !buffer.paths.back().matches(curr))) {
+ Path& last_path = buffer.paths.back();
+ size_t delta_id = last_path.last.i_id - last_path.first.i_id;
+
+ // move indices of the last path from the previous into the new index buffer
+ IndexBuffer& src_buffer = buffer_indices[buffer_indices.size() - 2];
+ IndexBuffer& dst_buffer = buffer_indices[buffer_indices.size() - 1];
+ std::move(src_buffer.begin() + last_path.first.i_id, src_buffer.end(), std::back_inserter(dst_buffer));
+ src_buffer.erase(src_buffer.begin() + last_path.first.i_id, src_buffer.end());
+
+ // updates path indices
+ last_path.first.b_id = buffer_indices.size() - 1;
+ last_path.first.i_id = 0;
+ last_path.last.b_id = buffer_indices.size() - 1;
+ last_path.last.i_id = delta_id;
+ }
+ }
+ }
+
+ switch (buffer.render_primitive_type)
+ {
+ case TBuffer::ERenderPrimitiveType::Point: {
+ add_indices_as_point(curr, buffer, static_cast<unsigned int>(buffer_indices.size()) - 1, buffer_indices.back(), i);
+ break;
+ }
+ case TBuffer::ERenderPrimitiveType::Line: {
+ add_indices_as_line(prev, curr, buffer, static_cast<unsigned int>(buffer_indices.size()) - 1, buffer_indices.back(), i);
+ break;
+ }
+ case TBuffer::ERenderPrimitiveType::Triangle: {
+ add_indices_as_solid(prev, curr, buffer, curr_buffer_vertices_size[id], static_cast<unsigned int>(buffer_indices.size()) - 1, buffer_indices.back(), i);
+ break;
+ }
+ }
+ }
+
+ if (progress_dialog != nullptr) {
+ progress_dialog->Update(100, "");
+ progress_dialog->Fit();
+ }
+
+ log_memory_usage("Loaded G-code generated indices buffers, ", vertices, indices);
+
+ // toolpaths data -> send indices data to gpu
+ for (size_t i = 0; i < m_buffers.size(); ++i) {
+ TBuffer& buffer = m_buffers[i];
+
+ for (size_t j = 0; j < indices[i].size(); ++j) {
+ const IndexBuffer& buffer_indices = indices[i][j];
+ buffer.indices.push_back(IBuffer());
+ IBuffer& ibuffer = buffer.indices.back();
+ ibuffer.count = buffer_indices.size();
+#if ENABLE_GCODE_VIEWER_STATISTICS
+ m_statistics.total_indices_gpu_size += ibuffer.count * sizeof(unsigned int);
+ m_statistics.max_ibuffer_gpu_size = std::max(m_statistics.max_ibuffer_gpu_size, static_cast<int64_t>(ibuffer.count * sizeof(unsigned int)));
+ m_statistics.max_indices_in_index_buffer = std::max(m_statistics.max_indices_in_index_buffer, static_cast<int64_t>(ibuffer.count));
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+
+ if (ibuffer.count > 0) {
+#if ENABLE_GCODE_VIEWER_STATISTICS
+ ++m_statistics.ibuffers_count;
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+ glsafe(::glGenBuffers(1, &ibuffer.id));
+ glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibuffer.id));
+ glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, buffer_indices.size() * sizeof(unsigned int), buffer_indices.data(), GL_STATIC_DRAW));
+ glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
+ }
+ }
+ }
+
+#if ENABLE_GCODE_VIEWER_STATISTICS
+ for (const TBuffer& buffer : m_buffers) {
+ m_statistics.paths_size += SLIC3R_STDVEC_MEMSIZE(buffer.paths, Path);
+ }
+ unsigned int travel_buffer_id = buffer_id(EMoveType::Travel);
+ const MultiIndexBuffer& travel_buffer_indices = indices[travel_buffer_id];
+ for (size_t i = 0; i < travel_buffer_indices.size(); ++i) {
+ m_statistics.travel_segments_count = travel_buffer_indices[i].size() / m_buffers[travel_buffer_id].indices_per_segment();
+ }
+ unsigned int wipe_buffer_id = buffer_id(EMoveType::Wipe);
+ const MultiIndexBuffer& wipe_buffer_indices = indices[wipe_buffer_id];
+ for (size_t i = 0; i < wipe_buffer_indices.size(); ++i) {
+ m_statistics.wipe_segments_count = wipe_buffer_indices[i].size() / m_buffers[wipe_buffer_id].indices_per_segment();
+ }
+ unsigned int extrude_buffer_id = buffer_id(EMoveType::Extrude);
+ const MultiIndexBuffer& extrude_buffer_indices = indices[extrude_buffer_id];
+ for (size_t i = 0; i < extrude_buffer_indices.size(); ++i) {
+ m_statistics.extrude_segments_count = extrude_buffer_indices[i].size() / m_buffers[extrude_buffer_id].indices_per_segment();
+ }
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+
+ // dismiss indices data, no more needed
+ std::vector<MultiIndexBuffer>().swap(indices);
+
+ // layers zs / roles / extruder ids / cp color ids -> extract from result
+ size_t last_travel_s_id = 0;
+ for (size_t i = 0; i < m_moves_count; ++i) {
+ const GCodeProcessor::MoveVertex& move = gcode_result.moves[i];
+ if (move.type == EMoveType::Extrude) {
+ // layers zs
+ const double* const last_z = m_layers.empty() ? nullptr : &m_layers.get_zs().back();
+ double z = static_cast<double>(move.position[2]);
+ if (last_z == nullptr || z < *last_z - EPSILON || *last_z + EPSILON < z)
+ m_layers.append(z, { last_travel_s_id, i });
+ else
+ m_layers.get_endpoints().back().last = i;
+ // extruder ids
+ m_extruder_ids.emplace_back(move.extruder_id);
+ // roles
+ if (i > 0)
+ m_roles.emplace_back(move.extrusion_role);
+ }
+ else if (move.type == EMoveType::Travel) {
+ if (i - last_travel_s_id > 1 && !m_layers.empty())
+ m_layers.get_endpoints().back().last = i;
+
+ last_travel_s_id = i;
+ }
+ }
+
+ // set layers z range
+ if (!m_layers.empty())
+ m_layers_z_range = { 0, static_cast<unsigned int>(m_layers.size() - 1) };
+
+ // change color of paths whose layer contains option points
+ if (!options_zs.empty()) {
+ TBuffer& extrude_buffer = m_buffers[buffer_id(EMoveType::Extrude)];
+ for (Path& path : extrude_buffer.paths) {
+ float z = path.first.position[2];
+ if (std::find_if(options_zs.begin(), options_zs.end(), [z](float f) { return f - EPSILON <= z && z <= f + EPSILON; }) != options_zs.end())
+ path.cp_color_id = 255 - path.cp_color_id;
+ }
+ }
+
+ // roles -> remove duplicates
+ std::sort(m_roles.begin(), m_roles.end());
+ m_roles.erase(std::unique(m_roles.begin(), m_roles.end()), m_roles.end());
+ m_roles.shrink_to_fit();
+
+ // extruder ids -> remove duplicates
+ std::sort(m_extruder_ids.begin(), m_extruder_ids.end());
+ m_extruder_ids.erase(std::unique(m_extruder_ids.begin(), m_extruder_ids.end()), m_extruder_ids.end());
+ m_extruder_ids.shrink_to_fit();
+
+ log_memory_usage("Loaded G-code generated extrusion paths, ", vertices, indices);
+
+#if ENABLE_GCODE_VIEWER_STATISTICS
+ m_statistics.load_time = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - start_time).count();
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+
+ if (progress_dialog != nullptr)
+ progress_dialog->Destroy();
+}
+
+void GCodeViewer::load_shells(const Print& print, bool initialized)
+{
+ if (print.objects().empty())
+ // no shells, return
+ return;
+
+ // adds objects' volumes
+ int object_id = 0;
+ for (const PrintObject* obj : print.objects()) {
+ const ModelObject* model_obj = obj->model_object();
+
+ std::vector<int> instance_ids(model_obj->instances.size());
+ for (int i = 0; i < (int)model_obj->instances.size(); ++i) {
+ instance_ids[i] = i;
+ }
+
+ m_shells.volumes.load_object(model_obj, object_id, instance_ids, "object", initialized);
+
+ ++object_id;
+ }
+
+ if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptFFF) {
+ // adds wipe tower's volume
+ double max_z = print.objects()[0]->model_object()->get_model()->bounding_box().max(2);
+ const PrintConfig& config = print.config();
+ size_t extruders_count = config.nozzle_diameter.size();
+ if ((extruders_count > 1) && config.wipe_tower && !config.complete_objects) {
+ const DynamicPrintConfig& print_config = wxGetApp().preset_bundle->prints.get_edited_preset().config;
+ double layer_height = print_config.opt_float("layer_height");
+ double first_layer_height = print_config.get_abs_value("first_layer_height", layer_height);
+ double nozzle_diameter = print.config().nozzle_diameter.values[0];
+ float depth = print.wipe_tower_data(extruders_count, first_layer_height, nozzle_diameter).depth;
+ float brim_width = print.wipe_tower_data(extruders_count, first_layer_height, nozzle_diameter).brim_width;
+
+ m_shells.volumes.load_wipe_tower_preview(1000, config.wipe_tower_x, config.wipe_tower_y, config.wipe_tower_width, depth, max_z, config.wipe_tower_rotation_angle,
+ !print.is_step_done(psWipeTower), brim_width, initialized);
+ }
+ }
+
+ // remove modifiers
+ while (true) {
+ GLVolumePtrs::iterator it = std::find_if(m_shells.volumes.volumes.begin(), m_shells.volumes.volumes.end(), [](GLVolume* volume) { return volume->is_modifier; });
+ if (it != m_shells.volumes.volumes.end()) {
+ delete (*it);
+ m_shells.volumes.volumes.erase(it);
+ }
+ else
+ break;
+ }
+
+ for (GLVolume* volume : m_shells.volumes.volumes) {
+ volume->zoom_to_volumes = false;
+ volume->color[3] = 0.25f;
+ volume->force_native_color = true;
+ volume->set_render_color();
+ }
+}
+
+void GCodeViewer::refresh_render_paths(bool keep_sequential_current_first, bool keep_sequential_current_last) const
+{
+#if ENABLE_GCODE_VIEWER_STATISTICS
+ auto start_time = std::chrono::high_resolution_clock::now();
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+
+ auto extrusion_color = [this](const Path& path) {
+ Color color;
+ switch (m_view_type)
+ {
+ case EViewType::FeatureType: { color = Extrusion_Role_Colors[static_cast<unsigned int>(path.role)]; break; }
+ case EViewType::Height: { color = m_extrusions.ranges.height.get_color_at(path.height); break; }
+ case EViewType::Width: { color = m_extrusions.ranges.width.get_color_at(path.width); break; }
+ case EViewType::Feedrate: { color = m_extrusions.ranges.feedrate.get_color_at(path.feedrate); break; }
+ case EViewType::FanSpeed: { color = m_extrusions.ranges.fan_speed.get_color_at(path.fan_speed); break; }
+ case EViewType::VolumetricRate: { color = m_extrusions.ranges.volumetric_rate.get_color_at(path.volumetric_rate); break; }
+ case EViewType::Tool: { color = m_tool_colors[path.extruder_id]; break; }
+ case EViewType::ColorPrint: {
+ if (path.cp_color_id >= static_cast<unsigned char>(m_tool_colors.size())) {
+ color = { 0.5f, 0.5f, 0.5f };
+// // complementary color
+// color = m_tool_colors[255 - path.cp_color_id];
+// color = { 1.0f - color[0], 1.0f - color[1], 1.0f - color[2] };
+ }
+ else
+ color = m_tool_colors[path.cp_color_id];
+
+ break;
+ }
+ default: { color = { 1.0f, 1.0f, 1.0f }; break; }
+ }
+
+ return color;
+ };
+
+ auto travel_color = [this](const Path& path) {
+ return (path.delta_extruder < 0.0f) ? Travel_Colors[2] /* Retract */ :
+ ((path.delta_extruder > 0.0f) ? Travel_Colors[1] /* Extrude */ :
+ Travel_Colors[0] /* Move */);
+ };
+
+ auto is_in_layers_range = [this](const Path& path, size_t min_id, size_t max_id) {
+ auto in_layers_range = [this, min_id, max_id](size_t id) {
+ return m_layers.get_endpoints_at(min_id).first <= id && id <= m_layers.get_endpoints_at(max_id).last;
+ };
+
+ return in_layers_range(path.first.s_id) || in_layers_range(path.last.s_id);
+ };
+
+ auto is_travel_in_layers_range = [this](size_t path_id, size_t min_id, size_t max_id) {
+ auto is_in_z_range = [](const Path& path, double min_z, double max_z) {
+ auto in_z_range = [min_z, max_z](double z) {
+ return min_z - EPSILON < z&& z < max_z + EPSILON;
+ };
+
+ return in_z_range(path.first.position[2]) || in_z_range(path.last.position[2]);
+ };
+
+ const TBuffer& buffer = m_buffers[buffer_id(EMoveType::Travel)];
+ if (path_id >= buffer.paths.size())
+ return false;
+
+ Path path = buffer.paths[path_id];
+ size_t first = path_id;
+ size_t last = path_id;
+
+ // check adjacent paths
+ while (first > 0 && path.first.position.isApprox(buffer.paths[first - 1].last.position)) {
+ --first;
+ path.first = buffer.paths[first].first;
+ }
+ while (last < buffer.paths.size() - 1 && path.last.position.isApprox(buffer.paths[last + 1].first.position)) {
+ ++last;
+ path.last = buffer.paths[last].last;
+ }
+
+ size_t min_s_id = m_layers.get_endpoints_at(min_id).first;
+ size_t max_s_id = m_layers.get_endpoints_at(max_id).last;
+
+ return (min_s_id <= path.first.s_id && path.first.s_id <= max_s_id) ||
+ (min_s_id <= path.last.s_id && path.last.s_id <= max_s_id);
+ };
+
+#if ENABLE_GCODE_VIEWER_STATISTICS
+ m_statistics.render_paths_size = 0;
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+
+ bool top_layer_only = get_app_config()->get("seq_top_layer_only") == "1";
+
+ SequentialView::Endpoints global_endpoints = { m_moves_count , 0 };
+ SequentialView::Endpoints top_layer_endpoints = global_endpoints;
+ if (top_layer_only || !keep_sequential_current_first) m_sequential_view.current.first = 0;
+ if (!keep_sequential_current_last) m_sequential_view.current.last = m_moves_count;
+
+ // first pass: collect visible paths and update sequential view data
+ std::vector<std::tuple<TBuffer*, unsigned int, unsigned int>> paths;
+ for (TBuffer& buffer : m_buffers) {
+ // reset render paths
+ buffer.render_paths.clear();
+
+ if (!buffer.visible)
+ continue;
+
+ for (size_t i = 0; i < buffer.paths.size(); ++i) {
+ const Path& path = buffer.paths[i];
+ if (path.type == EMoveType::Travel) {
+ if (!is_travel_in_layers_range(i, m_layers_z_range[0], m_layers_z_range[1]))
+ continue;
+ }
+ else if (!is_in_layers_range(path, m_layers_z_range[0], m_layers_z_range[1]))
+ continue;
+
+ if (path.type == EMoveType::Extrude && !is_visible(path))
+ continue;
+
+ // store valid path
+ paths.push_back({ &buffer, path.first.b_id, static_cast<unsigned int>(i) });
+
+ global_endpoints.first = std::min(global_endpoints.first, path.first.s_id);
+ global_endpoints.last = std::max(global_endpoints.last, path.last.s_id);
+
+ if (top_layer_only) {
+ if (path.type == EMoveType::Travel) {
+ if (is_travel_in_layers_range(i, m_layers_z_range[1], m_layers_z_range[1])) {
+ top_layer_endpoints.first = std::min(top_layer_endpoints.first, path.first.s_id);
+ top_layer_endpoints.last = std::max(top_layer_endpoints.last, path.last.s_id);
+ }
+ }
+ else if (is_in_layers_range(path, m_layers_z_range[1], m_layers_z_range[1])) {
+ top_layer_endpoints.first = std::min(top_layer_endpoints.first, path.first.s_id);
+ top_layer_endpoints.last = std::max(top_layer_endpoints.last, path.last.s_id);
+ }
+ }
+ }
+ }
+
+ // update current sequential position
+ m_sequential_view.current.first = !top_layer_only && keep_sequential_current_first ? std::clamp(m_sequential_view.current.first, global_endpoints.first, global_endpoints.last) : global_endpoints.first;
+ m_sequential_view.current.last = keep_sequential_current_last ? std::clamp(m_sequential_view.current.last, global_endpoints.first, global_endpoints.last) : global_endpoints.last;
+
+ // get the world position from gpu
+ bool found = false;
+ for (const TBuffer& buffer : m_buffers) {
+ // searches the path containing the current position
+ for (const Path& path : buffer.paths) {
+ if (path.contains(m_sequential_view.current.last)) {
+ unsigned int offset = static_cast<unsigned int>(m_sequential_view.current.last - path.first.s_id);
+ if (offset > 0) {
+ if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Line)
+ offset = 2 * offset - 1;
+ else if (buffer.render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle) {
+ unsigned int indices_count = buffer.indices_per_segment();
+ offset = indices_count * (offset - 1) + (indices_count - 6);
+ }
+ }
+ offset += static_cast<unsigned int>(path.first.i_id);
+
+ // gets the index from the index buffer on gpu
+ unsigned int index = 0;
+ glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer.indices[path.first.b_id].id));
+ glsafe(::glGetBufferSubData(GL_ELEMENT_ARRAY_BUFFER, static_cast<GLintptr>(offset * sizeof(unsigned int)), static_cast<GLsizeiptr>(sizeof(unsigned int)), static_cast<void*>(&index)));
+ glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
+
+ // gets the position from the vertices buffer on gpu
+ glsafe(::glBindBuffer(GL_ARRAY_BUFFER, buffer.vertices.id));
+ glsafe(::glGetBufferSubData(GL_ARRAY_BUFFER, static_cast<GLintptr>(index * buffer.vertices.vertex_size_bytes()), static_cast<GLsizeiptr>(3 * sizeof(float)), static_cast<void*>(m_sequential_view.current_position.data())));
+ glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0));
+ found = true;
+ break;
+ }
+ }
+ if (found)
+ break;
+ }
+
+ // second pass: filter paths by sequential data and collect them by color
+ RenderPath *render_path = nullptr;
+ for (const auto& [buffer, index_buffer_id, path_id] : paths) {
+ const Path& path = buffer->paths[path_id];
+ if (m_sequential_view.current.last <= path.first.s_id || path.last.s_id <= m_sequential_view.current.first)
+ continue;
+
+ Color color;
+ switch (path.type)
+ {
+ case EMoveType::Extrude: {
+ if (!top_layer_only ||
+ m_sequential_view.current.last == global_endpoints.last ||
+ is_in_layers_range(path, m_layers_z_range[1], m_layers_z_range[1]))
+ color = extrusion_color(path);
+ else
+ color = { 0.25f, 0.25f, 0.25f };
+
+ break;
+ }
+ case EMoveType::Travel: {
+ if (!top_layer_only || m_sequential_view.current.last == global_endpoints.last || is_travel_in_layers_range(path_id, m_layers_z_range[1], m_layers_z_range[1]))
+ color = (m_view_type == EViewType::Feedrate || m_view_type == EViewType::Tool || m_view_type == EViewType::ColorPrint) ? extrusion_color(path) : travel_color(path);
+ else
+ color = { 0.25f, 0.25f, 0.25f };
+
+ break;
+ }
+ case EMoveType::Wipe: { color = Wipe_Color; break; }
+ default: { color = { 0.0f, 0.0f, 0.0f }; break; }
+ }
+
+ RenderPath key{ color, static_cast<unsigned int>(index_buffer_id), path_id };
+ if (render_path == nullptr || ! RenderPathPropertyEqual()(*render_path, key))
+ render_path = const_cast<RenderPath*>(&(*buffer->render_paths.emplace(key).first));
+ unsigned int segments_count = std::min(m_sequential_view.current.last, path.last.s_id) - std::max(m_sequential_view.current.first, path.first.s_id) + 1;
+ unsigned int size_in_indices = 0;
+ switch (buffer->render_primitive_type)
+ {
+ case TBuffer::ERenderPrimitiveType::Point: { size_in_indices = segments_count; break; }
+ case TBuffer::ERenderPrimitiveType::Line:
+ case TBuffer::ERenderPrimitiveType::Triangle: { size_in_indices = buffer->indices_per_segment() * (segments_count - 1); break; }
+ }
+ render_path->sizes.push_back(size_in_indices);
+
+ unsigned int delta_1st = 0;
+ if (path.first.s_id < m_sequential_view.current.first && m_sequential_view.current.first <= path.last.s_id)
+ delta_1st = m_sequential_view.current.first - path.first.s_id;
+
+ if (buffer->render_primitive_type == TBuffer::ERenderPrimitiveType::Triangle)
+ delta_1st *= buffer->indices_per_segment();
+
+ render_path->offsets.push_back(static_cast<size_t>((path.first.i_id + delta_1st) * sizeof(unsigned int)));
+ }
+
+ // set sequential data to their final value
+ m_sequential_view.endpoints = top_layer_only ? top_layer_endpoints : global_endpoints;
+ m_sequential_view.current.first = !top_layer_only && keep_sequential_current_first ? std::clamp(m_sequential_view.current.first, m_sequential_view.endpoints.first, m_sequential_view.endpoints.last) : m_sequential_view.endpoints.first;
+
+ wxGetApp().plater()->enable_preview_moves_slider(!paths.empty());
+
+#if ENABLE_GCODE_VIEWER_STATISTICS
+ for (const TBuffer& buffer : m_buffers) {
+ m_statistics.render_paths_size += SLIC3R_STDVEC_MEMSIZE(buffer.render_paths, RenderPath);
+ for (const RenderPath& path : buffer.render_paths) {
+ m_statistics.render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.sizes, unsigned int);
+ m_statistics.render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.offsets, size_t);
+ }
+ }
+ m_statistics.refresh_paths_time = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::high_resolution_clock::now() - start_time).count();
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+}
+
+void GCodeViewer::render_toolpaths() const
+{
+#if ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS
+ float point_size = 20.0f;
+#else
+ float point_size = 0.8f;
+#endif // ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS
+ std::array<float, 4> light_intensity = { 0.25f, 0.70f, 0.75f, 0.75f };
+ const Camera& camera = wxGetApp().plater()->get_camera();
+ double zoom = camera.get_zoom();
+ const std::array<int, 4>& viewport = camera.get_viewport();
+ float near_plane_height = camera.get_type() == Camera::Perspective ? static_cast<float>(viewport[3]) / (2.0f * static_cast<float>(2.0 * std::tan(0.5 * Geometry::deg2rad(camera.get_fov())))) :
+ static_cast<float>(viewport[3]) * 0.0005;
+
+ auto set_uniform_color = [](const std::array<float, 3>& color, GLShaderProgram& shader) {
+ std::array<float, 4> color4 = { color[0], color[1], color[2], 1.0f };
+ shader.set_uniform("uniform_color", color4);
+ };
+
+ auto render_as_points = [this, zoom, point_size, near_plane_height, set_uniform_color]
+ (const TBuffer& buffer, unsigned int index_buffer_id, EOptionsColors color_id, GLShaderProgram& shader) {
+ set_uniform_color(Options_Colors[static_cast<unsigned int>(color_id)], shader);
+#if ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS
+ shader.set_uniform("use_fixed_screen_size", 1);
+#else
+ shader.set_uniform("use_fixed_screen_size", 0);
+#endif // ENABLE_FIXED_SCREEN_SIZE_POINT_MARKERS
+ shader.set_uniform("zoom", zoom);
+ shader.set_uniform("percent_outline_radius", 0.0f);
+ shader.set_uniform("percent_center_radius", 0.33f);
+ shader.set_uniform("point_size", point_size);
+ shader.set_uniform("near_plane_height", near_plane_height);
+
+ glsafe(::glEnable(GL_VERTEX_PROGRAM_POINT_SIZE));
+ glsafe(::glEnable(GL_POINT_SPRITE));
+
+ for (const RenderPath& path : buffer.render_paths) {
+ if (path.index_buffer_id == index_buffer_id) {
+ glsafe(::glMultiDrawElements(GL_POINTS, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_INT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size()));
+#if ENABLE_GCODE_VIEWER_STATISTICS
+ ++m_statistics.gl_multi_points_calls_count;
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+ }
+ }
+
+ glsafe(::glDisable(GL_POINT_SPRITE));
+ glsafe(::glDisable(GL_VERTEX_PROGRAM_POINT_SIZE));
+ };
+
+ auto render_as_lines = [this, light_intensity, set_uniform_color](const TBuffer& buffer, unsigned int index_buffer_id, GLShaderProgram& shader) {
+ shader.set_uniform("light_intensity", light_intensity);
+ for (const RenderPath& path : buffer.render_paths) {
+ if (path.index_buffer_id == index_buffer_id) {
+ set_uniform_color(path.color, shader);
+ glsafe(::glMultiDrawElements(GL_LINES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_INT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size()));
+#if ENABLE_GCODE_VIEWER_STATISTICS
+ ++m_statistics.gl_multi_lines_calls_count;
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+ }
+ }
+ };
+
+ auto render_as_triangles = [this, set_uniform_color](const TBuffer& buffer, unsigned int index_buffer_id, GLShaderProgram& shader) {
+ for (const RenderPath& path : buffer.render_paths) {
+ if (path.index_buffer_id == index_buffer_id) {
+ set_uniform_color(path.color, shader);
+ glsafe(::glMultiDrawElements(GL_TRIANGLES, (const GLsizei*)path.sizes.data(), GL_UNSIGNED_INT, (const void* const*)path.offsets.data(), (GLsizei)path.sizes.size()));
+#if ENABLE_GCODE_VIEWER_STATISTICS
+ ++m_statistics.gl_multi_triangles_calls_count;
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+ }
+ }
+ };
+
+ auto line_width = [](double zoom) {
+ return (zoom < 5.0) ? 1.0 : (1.0 + 5.0 * (zoom - 5.0) / (100.0 - 5.0));
+ };
+
+ glsafe(::glLineWidth(static_cast<GLfloat>(line_width(zoom))));
+
+ unsigned char begin_id = buffer_id(EMoveType::Retract);
+ unsigned char end_id = buffer_id(EMoveType::Count);
+
+ for (unsigned char i = begin_id; i < end_id; ++i) {
+ const TBuffer& buffer = m_buffers[i];
+ if (!buffer.visible || !buffer.has_data())
+ continue;
+
+ GLShaderProgram* shader = wxGetApp().get_shader(buffer.shader.c_str());
+ if (shader != nullptr) {
+ shader->start_using();
+
+ glsafe(::glBindBuffer(GL_ARRAY_BUFFER, buffer.vertices.id));
+ glsafe(::glVertexPointer(buffer.vertices.position_size_floats(), GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.position_offset_size()));
+ glsafe(::glEnableClientState(GL_VERTEX_ARRAY));
+ bool has_normals = buffer.vertices.normal_size_floats() > 0;
+ if (has_normals) {
+ glsafe(::glNormalPointer(GL_FLOAT, buffer.vertices.vertex_size_bytes(), (const void*)buffer.vertices.normal_offset_size()));
+ glsafe(::glEnableClientState(GL_NORMAL_ARRAY));
+ }
+
+ for (size_t j = 0; j < buffer.indices.size(); ++j) {
+ glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer.indices[j].id));
+
+ switch (buffer.render_primitive_type)
+ {
+ case TBuffer::ERenderPrimitiveType::Point:
+ {
+ EOptionsColors color;
+ switch (buffer_type(i))
+ {
+ case EMoveType::Tool_change: { color = EOptionsColors::ToolChanges; break; }
+ case EMoveType::Color_change: { color = EOptionsColors::ColorChanges; break; }
+ case EMoveType::Pause_Print: { color = EOptionsColors::PausePrints; break; }
+ case EMoveType::Custom_GCode: { color = EOptionsColors::CustomGCodes; break; }
+ case EMoveType::Retract: { color = EOptionsColors::Retractions; break; }
+ case EMoveType::Unretract: { color = EOptionsColors::Unretractions; break; }
+ }
+ render_as_points(buffer, static_cast<unsigned int>(j), color, *shader);
+ break;
+ }
+ case TBuffer::ERenderPrimitiveType::Line:
+ {
+ render_as_lines(buffer, static_cast<unsigned int>(j), *shader);
+ break;
+ }
+ case TBuffer::ERenderPrimitiveType::Triangle:
+ {
+ render_as_triangles(buffer, static_cast<unsigned int>(j), *shader);
+ break;
+ }
+ }
+
+ glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
+ }
+
+ if (has_normals)
+ glsafe(::glDisableClientState(GL_NORMAL_ARRAY));
+
+ glsafe(::glDisableClientState(GL_VERTEX_ARRAY));
+ glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0));
+
+ shader->stop_using();
+ }
+ }
+}
+
+void GCodeViewer::render_shells() const
+{
+ if (!m_shells.visible || m_shells.volumes.empty())
+ return;
+
+ GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light");
+ if (shader == nullptr)
+ return;
+
+// glsafe(::glDepthMask(GL_FALSE));
+
+ shader->start_using();
+ m_shells.volumes.render(GLVolumeCollection::Transparent, true, wxGetApp().plater()->get_camera().get_view_matrix());
+ shader->stop_using();
+
+// glsafe(::glDepthMask(GL_TRUE));
+}
+
+void GCodeViewer::render_legend() const
+{
+ if (!m_legend_enabled)
+ return;
+
+ ImGuiWrapper& imgui = *wxGetApp().imgui();
+
+ imgui.set_next_window_pos(0.0f, 0.0f, ImGuiCond_Always);
+ ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
+ ImGui::SetNextWindowBgAlpha(0.6f);
+ imgui.begin(std::string("Legend"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoMove);
+
+ ImDrawList* draw_list = ImGui::GetWindowDrawList();
+
+ enum class EItemType : unsigned char
+ {
+ Rect,
+ Circle,
+ Hexagon,
+ Line
+ };
+
+ const PrintEstimatedTimeStatistics::Mode& time_mode = m_time_statistics.modes[static_cast<size_t>(m_time_estimate_mode)];
+
+ float icon_size = ImGui::GetTextLineHeight();
+ float percent_bar_size = 2.0f * ImGui::GetTextLineHeight();
+
+ auto append_item = [this, draw_list, icon_size, percent_bar_size, &imgui](EItemType type, const Color& color, const std::string& label,
+ bool visible = true, const std::string& time = "", float percent = 0.0f, float max_percent = 0.0f, const std::array<float, 2>& offsets = { 0.0f, 0.0f },
+ std::function<void()> callback = nullptr) {
+ if (!visible)
+ ImGui::PushStyleVar(ImGuiStyleVar_Alpha, 0.3333f);
+ ImVec2 pos = ImGui::GetCursorScreenPos();
+ switch (type) {
+ default:
+ case EItemType::Rect: {
+ draw_list->AddRectFilled({ pos.x + 1.0f, pos.y + 1.0f }, { pos.x + icon_size - 1.0f, pos.y + icon_size - 1.0f },
+ ImGui::GetColorU32({ color[0], color[1], color[2], 1.0f }));
+ break;
+ }
+ case EItemType::Circle: {
+ ImVec2 center(0.5f * (pos.x + pos.x + icon_size), 0.5f * (pos.y + pos.y + icon_size));
+ if (m_buffers[buffer_id(EMoveType::Retract)].shader == "options_120") {
+ draw_list->AddCircleFilled(center, 0.5f * icon_size,
+ ImGui::GetColorU32({ 0.5f * color[0], 0.5f * color[1], 0.5f * color[2], 1.0f }), 16);
+ float radius = 0.5f * icon_size;
+ draw_list->AddCircleFilled(center, radius, ImGui::GetColorU32({ color[0], color[1], color[2], 1.0f }), 16);
+ radius = 0.5f * icon_size * 0.01f * 33.0f;
+ draw_list->AddCircleFilled(center, radius, ImGui::GetColorU32({ 0.5f * color[0], 0.5f * color[1], 0.5f * color[2], 1.0f }), 16);
+ }
+ else
+ draw_list->AddCircleFilled(center, 0.5f * icon_size, ImGui::GetColorU32({ color[0], color[1], color[2], 1.0f }), 16);
+
+ break;
+ }
+ case EItemType::Hexagon: {
+ ImVec2 center(0.5f * (pos.x + pos.x + icon_size), 0.5f * (pos.y + pos.y + icon_size));
+ draw_list->AddNgonFilled(center, 0.5f * icon_size, ImGui::GetColorU32({ color[0], color[1], color[2], 1.0f }), 6);
+ break;
+ }
+ case EItemType::Line: {
+ draw_list->AddLine({ pos.x + 1, pos.y + icon_size - 1 }, { pos.x + icon_size - 1, pos.y + 1 }, ImGui::GetColorU32({ color[0], color[1], color[2], 1.0f }), 3.0f);
+ break;
+ }
+ }
+
+ // draw text
+ ImGui::Dummy({ icon_size, icon_size });
+ ImGui::SameLine();
+ if (callback != nullptr) {
+ if (ImGui::MenuItem(label.c_str()))
+ callback();
+ else {
+ // show tooltip
+ if (ImGui::IsItemHovered()) {
+ if (!visible)
+ ImGui::PopStyleVar();
+ ImGui::PushStyleColor(ImGuiCol_PopupBg, ImGuiWrapper::COL_WINDOW_BACKGROUND);
+ ImGui::BeginTooltip();
+ imgui.text(visible ? _u8L("Click to hide") : _u8L("Click to show"));
+ ImGui::EndTooltip();
+ ImGui::PopStyleColor();
+ if (!visible)
+ ImGui::PushStyleVar(ImGuiStyleVar_Alpha, 0.3333f);
+
+ // to avoid the tooltip to change size when moving the mouse
+ wxGetApp().plater()->get_current_canvas3D()->set_as_dirty();
+ wxGetApp().plater()->get_current_canvas3D()->request_extra_frame();
+ }
+ }
+
+ if (!time.empty()) {
+ ImGui::SameLine(offsets[0]);
+ imgui.text(time);
+ ImGui::SameLine(offsets[1]);
+ pos = ImGui::GetCursorScreenPos();
+ float width = std::max(1.0f, percent_bar_size * percent / max_percent);
+ draw_list->AddRectFilled({ pos.x, pos.y + 2.0f }, { pos.x + width, pos.y + icon_size - 2.0f },
+ ImGui::GetColorU32(ImGuiWrapper::COL_ORANGE_LIGHT));
+ ImGui::Dummy({ percent_bar_size, icon_size });
+ ImGui::SameLine();
+ char buf[64];
+ ::sprintf(buf, "%.1f%%", 100.0f * percent);
+ ImGui::TextUnformatted((percent > 0.0f) ? buf : "");
+ }
+ }
+ else
+ imgui.text(label);
+
+ if (!visible)
+ ImGui::PopStyleVar();
+ };
+
+ auto append_range = [this, draw_list, &imgui, append_item](const Extrusions::Range& range, unsigned int decimals) {
+ auto append_range_item = [this, draw_list, &imgui, append_item](int i, float value, unsigned int decimals) {
+ char buf[1024];
+ ::sprintf(buf, "%.*f", decimals, value);
+ append_item(EItemType::Rect, Range_Colors[i], buf);
+ };
+
+ if (range.count == 1)
+ // single item use case
+ append_range_item(0, range.min, decimals);
+ else if (range.count == 2) {
+ append_range_item(static_cast<int>(Range_Colors.size()) - 1, range.max, decimals);
+ append_range_item(0, range.min, decimals);
+ }
+ else {
+ float step_size = range.step_size();
+ for (int i = static_cast<int>(Range_Colors.size()) - 1; i >= 0; --i) {
+ append_range_item(i, range.min + static_cast<float>(i) * step_size, decimals);
+ }
+ }
+ };
+
+ auto append_headers = [&imgui](const std::array<std::string, 3>& texts, const std::array<float, 2>& offsets) {
+ imgui.text(texts[0]);
+ ImGui::SameLine(offsets[0]);
+ imgui.text(texts[1]);
+ ImGui::SameLine(offsets[1]);
+ imgui.text(texts[2]);
+ ImGui::Separator();
+ };
+
+ auto max_width = [](const std::vector<std::string>& items, const std::string& title, float extra_size = 0.0f) {
+ float ret = ImGui::CalcTextSize(title.c_str()).x;
+ for (const std::string& item : items) {
+ ret = std::max(ret, extra_size + ImGui::CalcTextSize(item.c_str()).x);
+ }
+ return ret;
+ };
+
+ auto calculate_offsets = [max_width](const std::vector<std::string>& labels, const std::vector<std::string>& times,
+ const std::array<std::string, 2>& titles, float extra_size = 0.0f) {
+ const ImGuiStyle& style = ImGui::GetStyle();
+ std::array<float, 2> ret = { 0.0f, 0.0f };
+ ret[0] = max_width(labels, titles[0], extra_size) + 3.0f * style.ItemSpacing.x;
+ ret[1] = ret[0] + max_width(times, titles[1]) + style.ItemSpacing.x;
+ return ret;
+ };
+
+ auto color_print_ranges = [this](unsigned char extruder_id, const std::vector<CustomGCode::Item>& custom_gcode_per_print_z) {
+ std::vector<std::pair<Color, std::pair<double, double>>> ret;
+ ret.reserve(custom_gcode_per_print_z.size());
+
+ for (const auto& item : custom_gcode_per_print_z) {
+ if (extruder_id + 1 != static_cast<unsigned char>(item.extruder))
+ continue;
+
+ if (item.type != ColorChange)
+ continue;
+
+ const std::vector<double> zs = m_layers.get_zs();
+ auto lower_b = std::lower_bound(zs.begin(), zs.end(), item.print_z - Slic3r::DoubleSlider::epsilon());
+ if (lower_b == zs.end())
+ continue;
+
+ double current_z = *lower_b;
+ double previous_z = (lower_b == zs.begin()) ? 0.0 : *(--lower_b);
+
+ // to avoid duplicate values, check adding values
+ if (ret.empty() || !(ret.back().second.first == previous_z && ret.back().second.second == current_z))
+ ret.push_back({ decode_color(item.color), { previous_z, current_z } });
+ }
+
+ return ret;
+ };
+
+ auto upto_label = [](double z) {
+ char buf[64];
+ ::sprintf(buf, "%.2f", z);
+ return _u8L("up to") + " " + std::string(buf) + " " + _u8L("mm");
+ };
+
+ auto above_label = [](double z) {
+ char buf[64];
+ ::sprintf(buf, "%.2f", z);
+ return _u8L("above") + " " + std::string(buf) + " " + _u8L("mm");
+ };
+
+ auto fromto_label = [](double z1, double z2) {
+ char buf1[64];
+ ::sprintf(buf1, "%.2f", z1);
+ char buf2[64];
+ ::sprintf(buf2, "%.2f", z2);
+ return _u8L("from") + " " + std::string(buf1) + " " + _u8L("to") + " " + std::string(buf2) + " " + _u8L("mm");
+ };
+
+ auto role_time_and_percent = [this, time_mode](ExtrusionRole role) {
+ auto it = std::find_if(time_mode.roles_times.begin(), time_mode.roles_times.end(), [role](const std::pair<ExtrusionRole, float>& item) { return role == item.first; });
+ return (it != time_mode.roles_times.end()) ? std::make_pair(it->second, it->second / time_mode.time) : std::make_pair(0.0f, 0.0f);
+ };
+
+ // data used to properly align items in columns when showing time
+ std::array<float, 2> offsets = { 0.0f, 0.0f };
+ std::vector<std::string> labels;
+ std::vector<std::string> times;
+ std::vector<float> percents;
+ float max_percent = 0.0f;
+
+ if (m_view_type == EViewType::FeatureType) {
+ // calculate offsets to align time/percentage data
+ for (size_t i = 0; i < m_roles.size(); ++i) {
+ ExtrusionRole role = m_roles[i];
+ if (role < erCount) {
+ labels.push_back(_u8L(ExtrusionEntity::role_to_string(role)));
+ auto [time, percent] = role_time_and_percent(role);
+ times.push_back((time > 0.0f) ? short_time(get_time_dhms(time)) : "");
+ percents.push_back(percent);
+ max_percent = std::max(max_percent, percent);
+ }
+ }
+
+ offsets = calculate_offsets(labels, times, { _u8L("Feature type"), _u8L("Time") }, icon_size);
+ }
+
+ // extrusion paths section -> title
+ switch (m_view_type)
+ {
+ case EViewType::FeatureType:
+ {
+ append_headers({ _u8L("Feature type"), _u8L("Time"), _u8L("Percentage") }, offsets);
+ break;
+ }
+ case EViewType::Height: { imgui.title(_u8L("Height (mm)")); break; }
+ case EViewType::Width: { imgui.title(_u8L("Width (mm)")); break; }
+ case EViewType::Feedrate: { imgui.title(_u8L("Speed (mm/s)")); break; }
+ case EViewType::FanSpeed: { imgui.title(_u8L("Fan Speed (%)")); break; }
+ case EViewType::VolumetricRate: { imgui.title(_u8L("Volumetric flow rate (mm³/s)")); break; }
+ case EViewType::Tool: { imgui.title(_u8L("Tool")); break; }
+ case EViewType::ColorPrint: { imgui.title(_u8L("Color Print")); break; }
+ default: { break; }
+ }
+
+ // extrusion paths section -> items
+ switch (m_view_type)
+ {
+ case EViewType::FeatureType:
+ {
+ for (size_t i = 0; i < m_roles.size(); ++i) {
+ ExtrusionRole role = m_roles[i];
+ if (role >= erCount)
+ continue;
+ bool visible = is_visible(role);
+ append_item(EItemType::Rect, Extrusion_Role_Colors[static_cast<unsigned int>(role)], labels[i],
+ visible, times[i], percents[i], max_percent, offsets, [this, role, visible]() {
+ m_extrusions.role_visibility_flags = visible ? m_extrusions.role_visibility_flags & ~(1 << role) : m_extrusions.role_visibility_flags | (1 << role);
+ // update buffers' render paths
+ refresh_render_paths(false, false);
+ wxGetApp().plater()->update_preview_moves_slider();
+ wxGetApp().plater()->get_current_canvas3D()->set_as_dirty();
+ wxGetApp().plater()->update_preview_bottom_toolbar();
+ }
+ );
+ }
+ break;
+ }
+ case EViewType::Height: { append_range(m_extrusions.ranges.height, 3); break; }
+ case EViewType::Width: { append_range(m_extrusions.ranges.width, 3); break; }
+ case EViewType::Feedrate: { append_range(m_extrusions.ranges.feedrate, 1); break; }
+ case EViewType::FanSpeed: { append_range(m_extrusions.ranges.fan_speed, 0); break; }
+ case EViewType::VolumetricRate: { append_range(m_extrusions.ranges.volumetric_rate, 3); break; }
+ case EViewType::Tool:
+ {
+ // shows only extruders actually used
+ for (unsigned char i : m_extruder_ids) {
+ append_item(EItemType::Rect, m_tool_colors[i], _u8L("Extruder") + " " + std::to_string(i + 1));
+ }
+ break;
+ }
+ case EViewType::ColorPrint:
+ {
+ const std::vector<CustomGCode::Item>& custom_gcode_per_print_z = wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes;
+ if (m_extruders_count == 1) { // single extruder use case
+ std::vector<std::pair<Color, std::pair<double, double>>> cp_values = color_print_ranges(0, custom_gcode_per_print_z);
+ const int items_cnt = static_cast<int>(cp_values.size());
+ if (items_cnt == 0) { // There are no color changes, but there are some pause print or custom Gcode
+ append_item(EItemType::Rect, m_tool_colors.front(), _u8L("Default color"));
+ }
+ else {
+ for (int i = items_cnt; i >= 0; --i) {
+ // create label for color change item
+ if (i == 0) {
+ append_item(EItemType::Rect, m_tool_colors[0], upto_label(cp_values.front().second.first));
+ break;
+ }
+ else if (i == items_cnt) {
+ append_item(EItemType::Rect, cp_values[i - 1].first, above_label(cp_values[i - 1].second.second));
+ continue;
+ }
+ append_item(EItemType::Rect, cp_values[i - 1].first, fromto_label(cp_values[i - 1].second.second, cp_values[i].second.first));
+ }
+ }
+ }
+ else // multi extruder use case
+ {
+ // shows only extruders actually used
+ for (unsigned char i : m_extruder_ids) {
+ std::vector<std::pair<Color, std::pair<double, double>>> cp_values = color_print_ranges(i, custom_gcode_per_print_z);
+ const int items_cnt = static_cast<int>(cp_values.size());
+ if (items_cnt == 0) { // There are no color changes, but there are some pause print or custom Gcode
+ append_item(EItemType::Rect, m_tool_colors[i], _u8L("Extruder") + " " + std::to_string(i + 1) + " " + _u8L("default color"));
+ }
+ else {
+ for (int j = items_cnt; j >= 0; --j) {
+ // create label for color change item
+ std::string label = _u8L("Extruder") + " " + std::to_string(i + 1);
+ if (j == 0) {
+ label += " " + upto_label(cp_values.front().second.first);
+ append_item(EItemType::Rect, m_tool_colors[i], label);
+ break;
+ }
+ else if (j == items_cnt) {
+ label += " " + above_label(cp_values[j - 1].second.second);
+ append_item(EItemType::Rect, cp_values[j - 1].first, label);
+ continue;
+ }
+
+ label += " " + fromto_label(cp_values[j - 1].second.second, cp_values[j].second.first);
+ append_item(EItemType::Rect, cp_values[j - 1].first, label);
+ }
+ }
+ }
+ }
+
+ break;
+ }
+ default: { break; }
+ }
+
+ // partial estimated printing time section
+ if (m_view_type == EViewType::ColorPrint) {
+ using Times = std::pair<float, float>;
+ using TimesList = std::vector<std::pair<CustomGCode::Type, Times>>;
+
+ // helper structure containig the data needed to render the time items
+ struct PartialTime
+ {
+ enum class EType : unsigned char
+ {
+ Print,
+ ColorChange,
+ Pause
+ };
+ EType type;
+ int extruder_id;
+ Color color1;
+ Color color2;
+ Times times;
+ };
+ using PartialTimes = std::vector<PartialTime>;
+
+ auto generate_partial_times = [this](const TimesList& times) {
+ PartialTimes items;
+
+ std::vector<CustomGCode::Item> custom_gcode_per_print_z = wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes;
+ int extruders_count = wxGetApp().extruders_edited_cnt();
+ std::vector<Color> last_color(extruders_count);
+ for (int i = 0; i < extruders_count; ++i) {
+ last_color[i] = m_tool_colors[i];
+ }
+ int last_extruder_id = 1;
+ for (const auto& time_rec : times) {
+ switch (time_rec.first)
+ {
+ case CustomGCode::PausePrint: {
+ auto it = std::find_if(custom_gcode_per_print_z.begin(), custom_gcode_per_print_z.end(), [time_rec](const CustomGCode::Item& item) { return item.type == time_rec.first; });
+ if (it != custom_gcode_per_print_z.end()) {
+ items.push_back({ PartialTime::EType::Print, it->extruder, last_color[it->extruder - 1], Color(), time_rec.second });
+ items.push_back({ PartialTime::EType::Pause, it->extruder, Color(), Color(), time_rec.second });
+ custom_gcode_per_print_z.erase(it);
+ }
+ break;
+ }
+ case CustomGCode::ColorChange: {
+ auto it = std::find_if(custom_gcode_per_print_z.begin(), custom_gcode_per_print_z.end(), [time_rec](const CustomGCode::Item& item) { return item.type == time_rec.first; });
+ if (it != custom_gcode_per_print_z.end()) {
+ items.push_back({ PartialTime::EType::Print, it->extruder, last_color[it->extruder - 1], Color(), time_rec.second });
+ items.push_back({ PartialTime::EType::ColorChange, it->extruder, last_color[it->extruder - 1], decode_color(it->color), time_rec.second });
+ last_color[it->extruder - 1] = decode_color(it->color);
+ last_extruder_id = it->extruder;
+ custom_gcode_per_print_z.erase(it);
+ }
+ else
+ items.push_back({ PartialTime::EType::Print, last_extruder_id, last_color[last_extruder_id - 1], Color(), time_rec.second });
+
+ break;
+ }
+ default: { break; }
+ }
+ }
+
+ return items;
+ };
+
+ auto append_color_change = [this, &imgui](const Color& color1, const Color& color2, const std::array<float, 2>& offsets, const Times& times) {
+ imgui.text(_u8L("Color change"));
+ ImGui::SameLine();
+
+ float icon_size = ImGui::GetTextLineHeight();
+ ImDrawList* draw_list = ImGui::GetWindowDrawList();
+ ImVec2 pos = ImGui::GetCursorScreenPos();
+ pos.x -= 0.5f * ImGui::GetStyle().ItemSpacing.x;
+
+ draw_list->AddRectFilled({ pos.x + 1.0f, pos.y + 1.0f }, { pos.x + icon_size - 1.0f, pos.y + icon_size - 1.0f },
+ ImGui::GetColorU32({ color1[0], color1[1], color1[2], 1.0f }));
+ pos.x += icon_size;
+ draw_list->AddRectFilled({ pos.x + 1.0f, pos.y + 1.0f }, { pos.x + icon_size - 1.0f, pos.y + icon_size - 1.0f },
+ ImGui::GetColorU32({ color2[0], color2[1], color2[2], 1.0f }));
+
+ ImGui::SameLine(offsets[0]);
+ imgui.text(short_time(get_time_dhms(times.second - times.first)));
+ };
+
+ auto append_print = [this, &imgui](const Color& color, const std::array<float, 2>& offsets, const Times& times) {
+ imgui.text(_u8L("Print"));
+ ImGui::SameLine();
+
+ float icon_size = ImGui::GetTextLineHeight();
+ ImDrawList* draw_list = ImGui::GetWindowDrawList();
+ ImVec2 pos = ImGui::GetCursorScreenPos();
+ pos.x -= 0.5f * ImGui::GetStyle().ItemSpacing.x;
+
+ draw_list->AddRectFilled({ pos.x + 1.0f, pos.y + 1.0f }, { pos.x + icon_size - 1.0f, pos.y + icon_size - 1.0f },
+ ImGui::GetColorU32({ color[0], color[1], color[2], 1.0f }));
+
+ ImGui::SameLine(offsets[0]);
+ imgui.text(short_time(get_time_dhms(times.second)));
+ ImGui::SameLine(offsets[1]);
+ imgui.text(short_time(get_time_dhms(times.first)));
+ };
+
+ PartialTimes partial_times = generate_partial_times(time_mode.custom_gcode_times);
+ if (!partial_times.empty()) {
+ labels.clear();
+ times.clear();
+
+ for (const PartialTime& item : partial_times) {
+ switch (item.type)
+ {
+ case PartialTime::EType::Print: { labels.push_back(_u8L("Print")); break; }
+ case PartialTime::EType::Pause: { labels.push_back(_u8L("Pause")); break; }
+ case PartialTime::EType::ColorChange: { labels.push_back(_u8L("Color change")); break; }
+ }
+ times.push_back(short_time(get_time_dhms(item.times.second)));
+ }
+ offsets = calculate_offsets(labels, times, { _u8L("Event"), _u8L("Remaining time") }, 2.0f * icon_size);
+
+ ImGui::Spacing();
+ append_headers({ _u8L("Event"), _u8L("Remaining time"), _u8L("Duration") }, offsets);
+ for (const PartialTime& item : partial_times) {
+ switch (item.type)
+ {
+ case PartialTime::EType::Print: {
+ append_print(item.color1, offsets, item.times);
+ break;
+ }
+ case PartialTime::EType::Pause: {
+ imgui.text(_u8L("Pause"));
+ ImGui::SameLine(offsets[0]);
+ imgui.text(short_time(get_time_dhms(item.times.second - item.times.first)));
+ break;
+ }
+ case PartialTime::EType::ColorChange: {
+ append_color_change(item.color1, item.color2, offsets, item.times);
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // travel paths section
+ if (m_buffers[buffer_id(EMoveType::Travel)].visible) {
+ switch (m_view_type)
+ {
+ case EViewType::Feedrate:
+ case EViewType::Tool:
+ case EViewType::ColorPrint: {
+ break;
+ }
+ default: {
+ // title
+ ImGui::Spacing();
+ imgui.title(_u8L("Travel"));
+
+ // items
+ append_item(EItemType::Line, Travel_Colors[0], _u8L("Movement"));
+ append_item(EItemType::Line, Travel_Colors[1], _u8L("Extrusion"));
+ append_item(EItemType::Line, Travel_Colors[2], _u8L("Retraction"));
+
+ break;
+ }
+ }
+ }
+
+ // wipe paths section
+ if (m_buffers[buffer_id(EMoveType::Wipe)].visible) {
+ switch (m_view_type)
+ {
+ case EViewType::Feedrate:
+ case EViewType::Tool:
+ case EViewType::ColorPrint: { break; }
+ default: {
+ // title
+ ImGui::Spacing();
+ imgui.title(_u8L("Wipe"));
+
+ // items
+ append_item(EItemType::Line, Wipe_Color, _u8L("Wipe"));
+
+ break;
+ }
+ }
+ }
+
+ auto any_option_available = [this]() {
+ auto available = [this](EMoveType type) {
+ const TBuffer& buffer = m_buffers[buffer_id(type)];
+ return buffer.visible && buffer.has_data();
+ };
+
+ return available(EMoveType::Color_change) ||
+ available(EMoveType::Custom_GCode) ||
+ available(EMoveType::Pause_Print) ||
+ available(EMoveType::Retract) ||
+ available(EMoveType::Tool_change) ||
+ available(EMoveType::Unretract);
+ };
+
+ auto add_option = [this, append_item](EMoveType move_type, EOptionsColors color, const std::string& text) {
+ const TBuffer& buffer = m_buffers[buffer_id(move_type)];
+ if (buffer.visible && buffer.has_data())
+ append_item((buffer.shader == "options_110") ? EItemType::Rect : EItemType::Circle, Options_Colors[static_cast<unsigned int>(color)], text);
+ };
+
+ // options section
+ if (any_option_available()) {
+ // title
+ ImGui::Spacing();
+ imgui.title(_u8L("Options"));
+
+ // items
+ add_option(EMoveType::Retract, EOptionsColors::Retractions, _u8L("Retractions"));
+ add_option(EMoveType::Unretract, EOptionsColors::Unretractions, _u8L("Deretractions"));
+ add_option(EMoveType::Tool_change, EOptionsColors::ToolChanges, _u8L("Tool changes"));
+ add_option(EMoveType::Color_change, EOptionsColors::ColorChanges, _u8L("Color changes"));
+ add_option(EMoveType::Pause_Print, EOptionsColors::PausePrints, _u8L("Print pauses"));
+ add_option(EMoveType::Custom_GCode, EOptionsColors::CustomGCodes, _u8L("Custom G-codes"));
+ }
+
+ // settings section
+ if (wxGetApp().is_gcode_viewer() &&
+ (m_view_type == EViewType::FeatureType || m_view_type == EViewType::Tool) &&
+ (!m_settings_ids.print.empty() || !m_settings_ids.filament.empty() || !m_settings_ids.printer.empty())) {
+
+ auto calc_offset = [this]() {
+ float ret = 0.0f;
+ if (!m_settings_ids.printer.empty())
+ ret = std::max(ret, ImGui::CalcTextSize((_u8L("Printer") + std::string(":")).c_str()).x);
+ if (!m_settings_ids.print.empty())
+ ret = std::max(ret, ImGui::CalcTextSize((_u8L("Print settings") + std::string(":")).c_str()).x);
+ if (!m_settings_ids.filament.empty()) {
+ for (unsigned char i : m_extruder_ids) {
+ ret = std::max(ret, ImGui::CalcTextSize((_u8L("Filament") + " " + std::to_string(i + 1) + ":").c_str()).x);
+ }
+ }
+ if (ret > 0.0f)
+ ret += 2.0f * ImGui::GetStyle().ItemSpacing.x;
+ return ret;
+ };
+
+
+ ImGui::Spacing();
+ ImGui::Spacing();
+ ImGui::PushStyleColor(ImGuiCol_Separator, { 1.0f, 1.0f, 1.0f, 1.0f });
+ ImGui::Separator();
+ ImGui::PopStyleColor();
+ ImGui::Spacing();
+
+ float offset = calc_offset();
+
+ if (!m_settings_ids.printer.empty()) {
+ imgui.text(_u8L("Printer") + ":");
+ ImGui::SameLine(offset);
+ imgui.text(m_settings_ids.printer);
+ }
+ if (!m_settings_ids.print.empty()) {
+ imgui.text(_u8L("Print settings") + ":");
+ ImGui::SameLine(offset);
+ imgui.text(m_settings_ids.print);
+ }
+ if (!m_settings_ids.filament.empty()) {
+ for (unsigned char i : m_extruder_ids) {
+ std::string txt = _u8L("Filament");
+ txt += (m_extruder_ids.size() == 1) ? ":" : " " + std::to_string(i + 1);
+ imgui.text(txt);
+ ImGui::SameLine(offset);
+ imgui.text(m_settings_ids.filament[i]);
+ }
+ }
+ }
+
+ // total estimated printing time section
+ if (time_mode.time > 0.0f && (m_view_type == EViewType::FeatureType ||
+ (m_view_type == EViewType::ColorPrint && !time_mode.custom_gcode_times.empty()))) {
+
+ ImGui::Spacing();
+ ImGui::Spacing();
+ ImGui::PushStyleColor(ImGuiCol_Separator, { 1.0f, 1.0f, 1.0f, 1.0f });
+ ImGui::Separator();
+ ImGui::PopStyleColor();
+ ImGui::Spacing();
+
+ ImGui::AlignTextToFramePadding();
+ switch (m_time_estimate_mode)
+ {
+ case PrintEstimatedTimeStatistics::ETimeMode::Normal:
+ {
+ imgui.text(_u8L("Estimated printing time") + " [" + _u8L("Normal mode") + "]:");
+ break;
+ }
+ case PrintEstimatedTimeStatistics::ETimeMode::Stealth:
+ {
+ imgui.text(_u8L("Estimated printing time") + " [" + _u8L("Stealth mode") + "]:");
+ break;
+ }
+ }
+ ImGui::SameLine();
+ imgui.text(short_time(get_time_dhms(time_mode.time)));
+
+ auto show_mode_button = [this, &imgui](const wxString& label, PrintEstimatedTimeStatistics::ETimeMode mode) {
+ bool show = false;
+ for (size_t i = 0; i < m_time_statistics.modes.size(); ++i) {
+ if (i != static_cast<size_t>(mode) &&
+ short_time(get_time_dhms(m_time_statistics.modes[static_cast<size_t>(mode)].time)) != short_time(get_time_dhms(m_time_statistics.modes[i].time))) {
+ show = true;
+ break;
+ }
+ }
+ if (show && m_time_statistics.modes[static_cast<size_t>(mode)].roles_times.size() > 0) {
+ if (imgui.button(label)) {
+ m_time_estimate_mode = mode;
+ wxGetApp().plater()->get_current_canvas3D()->set_as_dirty();
+ wxGetApp().plater()->get_current_canvas3D()->request_extra_frame();
+ }
+ }
+ };
+
+ switch (m_time_estimate_mode) {
+ case PrintEstimatedTimeStatistics::ETimeMode::Normal: {
+ show_mode_button(_L("Show stealth mode"), PrintEstimatedTimeStatistics::ETimeMode::Stealth);
+ break;
+ }
+ case PrintEstimatedTimeStatistics::ETimeMode::Stealth: {
+ show_mode_button(_L("Show normal mode"), PrintEstimatedTimeStatistics::ETimeMode::Normal);
+ break;
+ }
+ }
+ }
+
+ imgui.end();
+ ImGui::PopStyleVar();
+}
+
+#if ENABLE_GCODE_VIEWER_STATISTICS
+void GCodeViewer::render_statistics() const
+{
+ static const float offset = 275.0f;
+
+ ImGuiWrapper& imgui = *wxGetApp().imgui();
+
+ auto add_time = [this, &imgui](const std::string& label, int64_t time) {
+ char buf[1024];
+ sprintf(buf, "%lld ms (%s)", time, get_time_dhms(static_cast<float>(time) * 0.001f).c_str());
+ imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, label);
+ ImGui::SameLine(offset);
+ imgui.text(buf);
+ };
+
+ auto add_memory = [this, &imgui](const std::string& label, int64_t memory) {
+ auto format_string = [memory](const std::string& units, float value) {
+ char buf[1024];
+ sprintf(buf, "%lld bytes (%.3f %s)", memory, static_cast<float>(memory) * value, units.c_str());
+ return std::string(buf);
+ };
+
+ static const float kb = 1024.0f;
+ static const float inv_kb = 1.0f / kb;
+ static const float mb = 1024.0f * kb;
+ static const float inv_mb = 1.0f / mb;
+ static const float gb = 1024.0f * mb;
+ static const float inv_gb = 1.0f / gb;
+ imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, label);
+ ImGui::SameLine(offset);
+ if (static_cast<float>(memory) < mb)
+ imgui.text(format_string("KB", inv_kb));
+ else if (static_cast<float>(memory) < gb)
+ imgui.text(format_string("MB", inv_mb));
+ else
+ imgui.text(format_string("GB", inv_gb));
+ };
+
+ auto add_counter = [this, &imgui](const std::string& label, int64_t counter) {
+ char buf[1024];
+ sprintf(buf, "%lld", counter);
+ imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, label);
+ ImGui::SameLine(offset);
+ imgui.text(buf);
+ };
+
+ imgui.set_next_window_pos(0.5f * wxGetApp().plater()->get_current_canvas3D()->get_canvas_size().get_width(), 0.0f, ImGuiCond_Once, 0.5f, 0.0f);
+ ImGui::SetNextWindowSizeConstraints({ 300.0f, 100.0f }, { 600.0f, 900.0f });
+ imgui.begin(std::string("GCodeViewer Statistics"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize);
+ ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow());
+
+ if (ImGui::CollapsingHeader("Time")) {
+ add_time(std::string("GCodeProcessor:"), m_statistics.results_time);
+
+ ImGui::Separator();
+ add_time(std::string("Load:"), m_statistics.load_time);
+ add_time(std::string("Refresh:"), m_statistics.refresh_time);
+ add_time(std::string("Refresh paths:"), m_statistics.refresh_paths_time);
+ wxGetApp().plater()->get_current_canvas3D()->set_as_dirty();
+ wxGetApp().plater()->get_current_canvas3D()->request_extra_frame();
+ }
+
+ if (ImGui::CollapsingHeader("OpenGL calls")) {
+ add_counter(std::string("Multi GL_POINTS:"), m_statistics.gl_multi_points_calls_count);
+ add_counter(std::string("Multi GL_LINES:"), m_statistics.gl_multi_lines_calls_count);
+ add_counter(std::string("Multi GL_TRIANGLES:"), m_statistics.gl_multi_triangles_calls_count);
+ wxGetApp().plater()->get_current_canvas3D()->set_as_dirty();
+ wxGetApp().plater()->get_current_canvas3D()->request_extra_frame();
+ }
+
+ if (ImGui::CollapsingHeader("CPU memory")) {
+ add_memory(std::string("GCodeProcessor results:"), m_statistics.results_size);
+
+ ImGui::Separator();
+ add_memory(std::string("Paths:"), m_statistics.paths_size);
+ add_memory(std::string("Render paths:"), m_statistics.render_paths_size);
+ wxGetApp().plater()->get_current_canvas3D()->set_as_dirty();
+ wxGetApp().plater()->get_current_canvas3D()->request_extra_frame();
+ }
+
+ if (ImGui::CollapsingHeader("GPU memory")) {
+ add_memory(std::string("Vertices:"), m_statistics.total_vertices_gpu_size);
+ add_memory(std::string("Indices:"), m_statistics.total_indices_gpu_size);
+ ImGui::Separator();
+ add_memory(std::string("Max VBuffer:"), m_statistics.max_vbuffer_gpu_size);
+ add_memory(std::string("Max IBuffer:"), m_statistics.max_ibuffer_gpu_size);
+ wxGetApp().plater()->get_current_canvas3D()->set_as_dirty();
+ wxGetApp().plater()->get_current_canvas3D()->request_extra_frame();
+ }
+
+ if (ImGui::CollapsingHeader("Other")) {
+ add_counter(std::string("Travel segments count:"), m_statistics.travel_segments_count);
+ add_counter(std::string("Wipe segments count:"), m_statistics.wipe_segments_count);
+ add_counter(std::string("Extrude segments count:"), m_statistics.extrude_segments_count);
+ ImGui::Separator();
+ add_counter(std::string("VBuffers count:"), m_statistics.vbuffers_count);
+ add_counter(std::string("IBuffers count:"), m_statistics.ibuffers_count);
+ ImGui::Separator();
+ add_counter(std::string("Max vertices in VBuffer:"), m_statistics.max_vertices_in_vertex_buffer);
+ add_counter(std::string("Max indices in IBuffer:"), m_statistics.max_indices_in_index_buffer);
+ wxGetApp().plater()->get_current_canvas3D()->set_as_dirty();
+ wxGetApp().plater()->get_current_canvas3D()->request_extra_frame();
+ }
+
+ imgui.end();
+}
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+
+void GCodeViewer::log_memory_used(const std::string& label, int64_t additional) const
+{
+ if (Slic3r::get_logging_level() >= 5) {
+ int64_t paths_size = 0;
+ int64_t render_paths_size = 0;
+ for (const TBuffer& buffer : m_buffers) {
+ paths_size += SLIC3R_STDVEC_MEMSIZE(buffer.paths, Path);
+ render_paths_size += SLIC3R_STDUNORDEREDSET_MEMSIZE(buffer.render_paths, RenderPath);
+ for (const RenderPath& path : buffer.render_paths) {
+ render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.sizes, unsigned int);
+ render_paths_size += SLIC3R_STDVEC_MEMSIZE(path.offsets, size_t);
+ }
+ }
+ int64_t layers_size = SLIC3R_STDVEC_MEMSIZE(m_layers.get_zs(), double);
+ layers_size += SLIC3R_STDVEC_MEMSIZE(m_layers.get_endpoints(), Layers::Endpoints);
+ BOOST_LOG_TRIVIAL(trace) << label
+ << format_memsize_MB(additional + paths_size + render_paths_size + layers_size)
+ << log_memory_info();
+ }
+}
+
+} // namespace GUI
+} // namespace Slic3r
+
diff --git a/src/slic3r/GUI/GCodeViewer.hpp b/src/slic3r/GUI/GCodeViewer.hpp
new file mode 100644
index 000000000..31092e30d
--- /dev/null
+++ b/src/slic3r/GUI/GCodeViewer.hpp
@@ -0,0 +1,560 @@
+#ifndef slic3r_GCodeViewer_hpp_
+#define slic3r_GCodeViewer_hpp_
+
+#include "3DScene.hpp"
+#include "libslic3r/GCode/GCodeProcessor.hpp"
+#include "GLModel.hpp"
+
+#include <cstdint>
+#include <float.h>
+#include <set>
+#include <unordered_set>
+
+namespace Slic3r {
+
+class Print;
+class TriangleMesh;
+
+namespace GUI {
+
+class GCodeViewer
+{
+ using Color = std::array<float, 3>;
+ using IndexBuffer = std::vector<unsigned int>;
+ using MultiIndexBuffer = std::vector<IndexBuffer>;
+
+ static const std::vector<Color> Extrusion_Role_Colors;
+ static const std::vector<Color> Options_Colors;
+ static const std::vector<Color> Travel_Colors;
+ static const Color Wipe_Color;
+ static const std::vector<Color> Range_Colors;
+
+ enum class EOptionsColors : unsigned char
+ {
+ Retractions,
+ Unretractions,
+ ToolChanges,
+ ColorChanges,
+ PausePrints,
+ CustomGCodes
+ };
+
+ // vbo buffer containing vertices data used to rendder a specific toolpath type
+ struct VBuffer
+ {
+ enum class EFormat : unsigned char
+ {
+ // vertex format: 3 floats -> position.x|position.y|position.z
+ Position,
+ // vertex format: 4 floats -> position.x|position.y|position.z|normal.x
+ PositionNormal1,
+ // vertex format: 6 floats -> position.x|position.y|position.z|normal.x|normal.y|normal.z
+ PositionNormal3
+ };
+
+ EFormat format{ EFormat::Position };
+ // vbo id
+ unsigned int id{ 0 };
+ // count of vertices, updated after data are sent to gpu
+ size_t count{ 0 };
+
+ size_t data_size_bytes() const { return count * vertex_size_bytes(); }
+
+ size_t vertex_size_floats() const { return position_size_floats() + normal_size_floats(); }
+ size_t vertex_size_bytes() const { return vertex_size_floats() * sizeof(float); }
+
+ size_t position_offset_floats() const { return 0; }
+ size_t position_offset_size() const { return position_offset_floats() * sizeof(float); }
+ size_t position_size_floats() const
+ {
+ switch (format)
+ {
+ case EFormat::Position:
+ case EFormat::PositionNormal3: { return 3; }
+ case EFormat::PositionNormal1: { return 4; }
+ default: { return 0; }
+ }
+ }
+ size_t position_size_bytes() const { return position_size_floats() * sizeof(float); }
+
+ size_t normal_offset_floats() const
+ {
+ switch (format)
+ {
+ case EFormat::Position:
+ case EFormat::PositionNormal1: { return 0; }
+ case EFormat::PositionNormal3: { return 3; }
+ default: { return 0; }
+ }
+ }
+ size_t normal_offset_size() const { return normal_offset_floats() * sizeof(float); }
+ size_t normal_size_floats() const {
+ switch (format)
+ {
+ default:
+ case EFormat::Position:
+ case EFormat::PositionNormal1: { return 0; }
+ case EFormat::PositionNormal3: { return 3; }
+ }
+ }
+ size_t normal_size_bytes() const { return normal_size_floats() * sizeof(float); }
+
+ void reset();
+ };
+
+ // ibo buffer containing indices data (lines/triangles) used to render a specific toolpath type
+ struct IBuffer
+ {
+ // ibo id
+ unsigned int id{ 0 };
+ // count of indices, updated after data are sent to gpu
+ size_t count{ 0 };
+
+ void reset();
+ };
+
+ // Used to identify different toolpath sub-types inside a IBuffer
+ struct Path
+ {
+ struct Endpoint
+ {
+ // index of the index buffer
+ unsigned int b_id{ 0 };
+ // index into the index buffer
+ size_t i_id{ 0 };
+ // sequential id (index into the vertex buffer)
+ size_t s_id{ 0 };
+ Vec3f position{ Vec3f::Zero() };
+ };
+
+ EMoveType type{ EMoveType::Noop };
+ ExtrusionRole role{ erNone };
+ Endpoint first;
+ Endpoint last;
+ float delta_extruder{ 0.0f };
+ float height{ 0.0f };
+ float width{ 0.0f };
+ float feedrate{ 0.0f };
+ float fan_speed{ 0.0f };
+ float volumetric_rate{ 0.0f };
+ unsigned char extruder_id{ 0 };
+ unsigned char cp_color_id{ 0 };
+
+ bool matches(const GCodeProcessor::MoveVertex& move) const;
+ size_t vertices_count() const { return last.s_id - first.s_id + 1; }
+ bool contains(size_t id) const { return first.s_id <= id && id <= last.s_id; }
+ };
+
+ // Used to batch the indices needed to render paths
+ struct RenderPath
+ {
+ // Render path property
+ Color color;
+ unsigned int index_buffer_id;
+ // Render path content
+ unsigned int path_id;
+ std::vector<unsigned int> sizes;
+ std::vector<size_t> offsets; // use size_t because we need an unsigned int whose size matches pointer's size (used in the call glMultiDrawElements())
+ };
+ struct RenderPathPropertyHash {
+ size_t operator() (const RenderPath &p) const {
+ // Conver the RGB value to an integer hash.
+// return (size_t(int(p.color[0] * 255) + 255 * int(p.color[1] * 255) + (255 * 255) * int(p.color[2] * 255)) * 7919) ^ size_t(p.index_buffer_id);
+ return size_t(int(p.color[0] * 255) + 255 * int(p.color[1] * 255) + (255 * 255) * int(p.color[2] * 255)) ^ size_t(p.index_buffer_id);
+ }
+ };
+ struct RenderPathPropertyLower {
+ bool operator() (const RenderPath &l, const RenderPath &r) const {
+ for (int i = 0; i < 3; ++ i)
+ if (l.color[i] < r.color[i])
+ return true;
+ else if (l.color[i] > r.color[i])
+ return false;
+ return l.index_buffer_id < r.index_buffer_id;
+ }
+ };
+ struct RenderPathPropertyEqual {
+ bool operator() (const RenderPath &l, const RenderPath &r) const {
+ return l.color == r.color && l.index_buffer_id == r.index_buffer_id;
+ }
+ };
+
+ // buffer containing data for rendering a specific toolpath type
+ struct TBuffer
+ {
+ enum class ERenderPrimitiveType : unsigned char
+ {
+ Point,
+ Line,
+ Triangle
+ };
+
+ ERenderPrimitiveType render_primitive_type;
+ VBuffer vertices;
+ std::vector<IBuffer> indices;
+
+ std::string shader;
+ std::vector<Path> paths;
+ // std::set seems to perform singificantly better, at least on Windows.
+// std::unordered_set<RenderPath, RenderPathPropertyHash, RenderPathPropertyEqual> render_paths;
+ std::set<RenderPath, RenderPathPropertyLower> render_paths;
+ bool visible{ false };
+
+ void reset();
+ // b_id index of buffer contained in this->indices
+ // i_id index of first index contained in this->indices[b_id]
+ // s_id index of first vertex contained in this->vertices
+ void add_path(const GCodeProcessor::MoveVertex& move, unsigned int b_id, size_t i_id, size_t s_id);
+ unsigned int indices_per_segment() const {
+ switch (render_primitive_type)
+ {
+ case ERenderPrimitiveType::Point: { return 1; }
+ case ERenderPrimitiveType::Line: { return 2; }
+ case ERenderPrimitiveType::Triangle: { return 42; } // 3 indices x 14 triangles
+ default: { return 0; }
+ }
+ }
+ unsigned int start_segment_vertex_offset() const {
+ switch (render_primitive_type)
+ {
+ case ERenderPrimitiveType::Point:
+ case ERenderPrimitiveType::Line:
+ case ERenderPrimitiveType::Triangle:
+ default: { return 0; }
+ }
+ }
+ unsigned int end_segment_vertex_offset() const {
+ switch (render_primitive_type)
+ {
+ case ERenderPrimitiveType::Point: { return 0; }
+ case ERenderPrimitiveType::Line: { return 1; }
+ case ERenderPrimitiveType::Triangle: { return 36; } // 1 vertex of 13th triangle
+ default: { return 0; }
+ }
+ }
+
+ bool has_data() const { return vertices.id != 0 && !indices.empty() && indices.front().id != 0; }
+ };
+
+ // helper to render shells
+ struct Shells
+ {
+ GLVolumeCollection volumes;
+ bool visible{ false };
+ };
+
+ // helper to render extrusion paths
+ struct Extrusions
+ {
+ struct Range
+ {
+ float min;
+ float max;
+ unsigned int count;
+
+ Range() { reset(); }
+
+ void update_from(const float value) {
+ if (value != max && value != min)
+ ++count;
+ min = std::min(min, value);
+ max = std::max(max, value);
+ }
+ void reset() { min = FLT_MAX; max = -FLT_MAX; count = 0; }
+
+ float step_size() const { return (max - min) / (static_cast<float>(Range_Colors.size()) - 1.0f); }
+ Color get_color_at(float value) const;
+ };
+
+ struct Ranges
+ {
+ // Color mapping by layer height.
+ Range height;
+ // Color mapping by extrusion width.
+ Range width;
+ // Color mapping by feedrate.
+ Range feedrate;
+ // Color mapping by fan speed.
+ Range fan_speed;
+ // Color mapping by volumetric extrusion rate.
+ Range volumetric_rate;
+
+ void reset() {
+ height.reset();
+ width.reset();
+ feedrate.reset();
+ fan_speed.reset();
+ volumetric_rate.reset();
+ }
+ };
+
+ unsigned int role_visibility_flags{ 0 };
+ Ranges ranges;
+
+ void reset_role_visibility_flags() {
+ role_visibility_flags = 0;
+ for (unsigned int i = 0; i < erCount; ++i) {
+ role_visibility_flags |= 1 << i;
+ }
+ }
+
+ void reset_ranges() { ranges.reset(); }
+ };
+
+ class Layers
+ {
+ public:
+ struct Endpoints
+ {
+ size_t first{ 0 };
+ size_t last{ 0 };
+ };
+
+ private:
+ std::vector<double> m_zs;
+ std::vector<Endpoints> m_endpoints;
+
+ public:
+ void append(double z, Endpoints endpoints)
+ {
+ m_zs.emplace_back(z);
+ m_endpoints.emplace_back(endpoints);
+ }
+
+ void reset()
+ {
+ m_zs = std::vector<double>();
+ m_endpoints = std::vector<Endpoints>();
+ }
+
+ size_t size() const { return m_zs.size(); }
+ bool empty() const { return m_zs.empty(); }
+ const std::vector<double>& get_zs() const { return m_zs; }
+ const std::vector<Endpoints>& get_endpoints() const { return m_endpoints; }
+ std::vector<Endpoints>& get_endpoints() { return m_endpoints; }
+ double get_z_at(unsigned int id) const { return (id < m_zs.size()) ? m_zs[id] : 0.0; }
+ Endpoints get_endpoints_at(unsigned int id) const { return (id < m_endpoints.size()) ? m_endpoints[id] : Endpoints(); }
+ };
+
+#if ENABLE_GCODE_VIEWER_STATISTICS
+ struct Statistics
+ {
+ // time
+ int64_t results_time{ 0 };
+ int64_t load_time{ 0 };
+ int64_t refresh_time{ 0 };
+ int64_t refresh_paths_time{ 0 };
+ // opengl calls
+ int64_t gl_multi_points_calls_count{ 0 };
+ int64_t gl_multi_lines_calls_count{ 0 };
+ int64_t gl_multi_triangles_calls_count{ 0 };
+ // memory
+ int64_t results_size{ 0 };
+ int64_t total_vertices_gpu_size{ 0 };
+ int64_t total_indices_gpu_size{ 0 };
+ int64_t max_vbuffer_gpu_size{ 0 };
+ int64_t max_ibuffer_gpu_size{ 0 };
+ int64_t paths_size{ 0 };
+ int64_t render_paths_size{ 0 };
+ // other
+ int64_t travel_segments_count{ 0 };
+ int64_t wipe_segments_count{ 0 };
+ int64_t extrude_segments_count{ 0 };
+ int64_t vbuffers_count{ 0 };
+ int64_t ibuffers_count{ 0 };
+ int64_t max_vertices_in_vertex_buffer{ 0 };
+ int64_t max_indices_in_index_buffer{ 0 };
+
+ void reset_all() {
+ reset_times();
+ reset_opengl();
+ reset_sizes();
+ reset_others();
+ }
+
+ void reset_times() {
+ results_time = 0;
+ load_time = 0;
+ refresh_time = 0;
+ refresh_paths_time = 0;
+ }
+
+ void reset_opengl() {
+ gl_multi_points_calls_count = 0;
+ gl_multi_lines_calls_count = 0;
+ gl_multi_triangles_calls_count = 0;
+ }
+
+ void reset_sizes() {
+ results_size = 0;
+ total_vertices_gpu_size = 0;
+ total_indices_gpu_size = 0;
+ max_vbuffer_gpu_size = 0;
+ max_ibuffer_gpu_size = 0;
+ paths_size = 0;
+ render_paths_size = 0;
+ }
+
+ void reset_others() {
+ travel_segments_count = 0;
+ wipe_segments_count = 0;
+ extrude_segments_count = 0;
+ vbuffers_count = 0;
+ ibuffers_count = 0;
+ max_vertices_in_vertex_buffer = 0;
+ max_indices_in_index_buffer = 0;
+ }
+ };
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+
+public:
+ struct SequentialView
+ {
+ class Marker
+ {
+ GLModel m_model;
+ Vec3f m_world_position;
+ Transform3f m_world_transform;
+ float m_z_offset{ 0.5f };
+ std::array<float, 4> m_color{ 1.0f, 1.0f, 1.0f, 0.5f };
+ bool m_visible{ true };
+
+ public:
+ void init();
+
+ const BoundingBoxf3& get_bounding_box() const { return m_model.get_bounding_box(); }
+
+ void set_world_position(const Vec3f& position);
+ void set_color(const std::array<float, 4>& color) { m_color = color; }
+
+ bool is_visible() const { return m_visible; }
+ void set_visible(bool visible) { m_visible = visible; }
+
+ void render() const;
+ };
+
+ struct Endpoints
+ {
+ size_t first{ 0 };
+ size_t last{ 0 };
+ };
+
+ bool skip_invisible_moves{ false };
+ Endpoints endpoints;
+ Endpoints current;
+ Endpoints last_current;
+ Vec3f current_position{ Vec3f::Zero() };
+ Marker marker;
+ };
+
+ enum class EViewType : unsigned char
+ {
+ FeatureType,
+ Height,
+ Width,
+ Feedrate,
+ FanSpeed,
+ VolumetricRate,
+ Tool,
+ ColorPrint,
+ Count
+ };
+
+private:
+ bool m_initialized{ false };
+ mutable bool m_gl_data_initialized{ false };
+ unsigned int m_last_result_id{ 0 };
+ size_t m_moves_count{ 0 };
+ mutable std::vector<TBuffer> m_buffers{ static_cast<size_t>(EMoveType::Extrude) };
+ // bounding box of toolpaths
+ BoundingBoxf3 m_paths_bounding_box;
+ // bounding box of toolpaths + marker tools
+ BoundingBoxf3 m_max_bounding_box;
+ std::vector<Color> m_tool_colors;
+ Layers m_layers;
+ std::array<unsigned int, 2> m_layers_z_range;
+ std::vector<ExtrusionRole> m_roles;
+ size_t m_extruders_count;
+ std::vector<unsigned char> m_extruder_ids;
+ mutable Extrusions m_extrusions;
+ mutable SequentialView m_sequential_view;
+ Shells m_shells;
+ EViewType m_view_type{ EViewType::FeatureType };
+ bool m_legend_enabled{ true };
+ PrintEstimatedTimeStatistics m_time_statistics;
+ mutable PrintEstimatedTimeStatistics::ETimeMode m_time_estimate_mode{ PrintEstimatedTimeStatistics::ETimeMode::Normal };
+#if ENABLE_GCODE_VIEWER_STATISTICS
+ mutable Statistics m_statistics;
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+ mutable std::array<float, 2> m_detected_point_sizes = { 0.0f, 0.0f };
+ GCodeProcessor::Result::SettingsIds m_settings_ids;
+
+public:
+ GCodeViewer() = default;
+ ~GCodeViewer() { reset(); }
+
+ // extract rendering data from the given parameters
+ void load(const GCodeProcessor::Result& gcode_result, const Print& print, bool initialized);
+ // recalculate ranges in dependence of what is visible and sets tool/print colors
+ void refresh(const GCodeProcessor::Result& gcode_result, const std::vector<std::string>& str_tool_colors);
+#if ENABLE_RENDER_PATH_REFRESH_AFTER_OPTIONS_CHANGE
+ void refresh_render_paths();
+#endif // ENABLE_RENDER_PATH_REFRESH_AFTER_OPTIONS_CHANGE
+ void update_shells_color_by_extruder(const DynamicPrintConfig* config);
+
+ void reset();
+ void render() const;
+
+ bool has_data() const { return !m_roles.empty(); }
+
+ const BoundingBoxf3& get_paths_bounding_box() const { return m_paths_bounding_box; }
+ const BoundingBoxf3& get_max_bounding_box() const { return m_max_bounding_box; }
+ const std::vector<double>& get_layers_zs() const { return m_layers.get_zs(); };
+
+ const SequentialView& get_sequential_view() const { return m_sequential_view; }
+ void update_sequential_view_current(unsigned int first, unsigned int last);
+
+ EViewType get_view_type() const { return m_view_type; }
+ void set_view_type(EViewType type) {
+ if (type == EViewType::Count)
+ type = EViewType::FeatureType;
+
+ m_view_type = type;
+ }
+
+ bool is_toolpath_move_type_visible(EMoveType type) const;
+ void set_toolpath_move_type_visible(EMoveType type, bool visible);
+ unsigned int get_toolpath_role_visibility_flags() const { return m_extrusions.role_visibility_flags; }
+ void set_toolpath_role_visibility_flags(unsigned int flags) { m_extrusions.role_visibility_flags = flags; }
+ unsigned int get_options_visibility_flags() const;
+ void set_options_visibility_from_flags(unsigned int flags);
+ void set_layers_z_range(const std::array<unsigned int, 2>& layers_z_range);
+
+ bool is_legend_enabled() const { return m_legend_enabled; }
+ void enable_legend(bool enable) { m_legend_enabled = enable; }
+
+ void export_toolpaths_to_obj(const char* filename) const;
+
+private:
+ void init();
+ void load_toolpaths(const GCodeProcessor::Result& gcode_result);
+ void load_shells(const Print& print, bool initialized);
+ void refresh_render_paths(bool keep_sequential_current_first, bool keep_sequential_current_last) const;
+ void render_toolpaths() const;
+ void render_shells() const;
+ void render_legend() const;
+#if ENABLE_GCODE_VIEWER_STATISTICS
+ void render_statistics() const;
+#endif // ENABLE_GCODE_VIEWER_STATISTICS
+ bool is_visible(ExtrusionRole role) const {
+ return role < erCount && (m_extrusions.role_visibility_flags & (1 << role)) != 0;
+ }
+ bool is_visible(const Path& path) const { return is_visible(path.role); }
+ void log_memory_used(const std::string& label, int64_t additional = 0) const;
+};
+
+} // namespace GUI
+} // namespace Slic3r
+
+#endif // slic3r_GCodeViewer_hpp_
+
diff --git a/src/slic3r/GUI/GLCanvas3D.cpp b/src/slic3r/GUI/GLCanvas3D.cpp
index 1e58032d8..03d6b94ce 100644
--- a/src/slic3r/GUI/GLCanvas3D.cpp
+++ b/src/slic3r/GUI/GLCanvas3D.cpp
@@ -1,33 +1,37 @@
#include "libslic3r/libslic3r.h"
-#include "slic3r/GUI/Gizmos/GLGizmos.hpp"
#include "GLCanvas3D.hpp"
#include "admesh/stl.h"
#include "polypartition.h"
#include "libslic3r/ClipperUtils.hpp"
#include "libslic3r/PrintConfig.hpp"
-#include "libslic3r/GCode/PreviewData.hpp"
-#if ENABLE_THUMBNAIL_GENERATOR
#include "libslic3r/GCode/ThumbnailData.hpp"
-#endif // ENABLE_THUMBNAIL_GENERATOR
#include "libslic3r/Geometry.hpp"
#include "libslic3r/ExtrusionEntity.hpp"
+#include "libslic3r/Layer.hpp"
#include "libslic3r/Utils.hpp"
#include "libslic3r/Technologies.hpp"
#include "libslic3r/Tesselate.hpp"
+#include "libslic3r/PresetBundle.hpp"
#include "slic3r/GUI/3DScene.hpp"
#include "slic3r/GUI/BackgroundSlicingProcess.hpp"
#include "slic3r/GUI/GLShader.hpp"
#include "slic3r/GUI/GUI.hpp"
-#include "slic3r/GUI/PresetBundle.hpp"
#include "slic3r/GUI/Tab.hpp"
#include "slic3r/GUI/GUI_Preview.hpp"
+#include "slic3r/GUI/OpenGLManager.hpp"
+#include "slic3r/GUI/3DBed.hpp"
+#include "slic3r/GUI/Camera.hpp"
+#include "slic3r/GUI/Plater.hpp"
+#include "slic3r/GUI/MainFrame.hpp"
#include "GUI_App.hpp"
#include "GUI_ObjectList.hpp"
#include "GUI_ObjectManipulation.hpp"
#include "Mouse3DController.hpp"
#include "I18N.hpp"
+#include "NotificationManager.hpp"
+#include "format.hpp"
#if ENABLE_RETINA_GL
#include "slic3r/Utils/RetinaHelper.hpp"
@@ -61,11 +65,6 @@
#include <algorithm>
#include <cmath>
#include "DoubleSlider.hpp"
-#if !ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
-#if ENABLE_RENDER_STATISTICS
-#include <chrono>
-#endif // ENABLE_RENDER_STATISTICS
-#endif // !ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
#include <imgui/imgui_internal.h>
@@ -87,6 +86,13 @@ static const size_t VERTEX_BUFFER_RESERVE_SIZE_SUM_MAX = 1024 * 1024 * 128 / 4;
namespace Slic3r {
namespace GUI {
+#ifdef __WXGTK3__
+// wxGTK3 seems to simulate OSX behavior in regard to HiDPI scaling support.
+RetinaHelper::RetinaHelper(wxWindow* window) : m_window(window), m_self(nullptr) {}
+RetinaHelper::~RetinaHelper() {}
+float RetinaHelper::get_scale_factor() { return float(m_window->GetContentScaleFactor()); }
+#endif // __WXGTK3__
+
Size::Size()
: m_width(0)
, m_height(0)
@@ -159,11 +165,8 @@ GLCanvas3D::LayersEditing::~LayersEditing()
const float GLCanvas3D::LayersEditing::THICKNESS_BAR_WIDTH = 70.0f;
-bool GLCanvas3D::LayersEditing::init(const std::string& vertex_shader_filename, const std::string& fragment_shader_filename)
+void GLCanvas3D::LayersEditing::init()
{
- if (!m_shader.init(vertex_shader_filename, fragment_shader_filename))
- return false;
-
glsafe(::glGenTextures(1, (GLuint*)&m_z_texture_id));
glsafe(::glBindTexture(GL_TEXTURE_2D, m_z_texture_id));
glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP));
@@ -172,12 +175,10 @@ bool GLCanvas3D::LayersEditing::init(const std::string& vertex_shader_filename,
glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST));
glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 1));
glsafe(::glBindTexture(GL_TEXTURE_2D, 0));
-
- return true;
}
void GLCanvas3D::LayersEditing::set_config(const DynamicPrintConfig* config)
-{
+{
m_config = config;
delete m_slicing_parameters;
m_slicing_parameters = nullptr;
@@ -206,7 +207,7 @@ void GLCanvas3D::LayersEditing::select_object(const Model &model, int object_id)
bool GLCanvas3D::LayersEditing::is_allowed() const
{
- return m_shader.is_initialized() && m_shader.get_shader()->shader_program_id > 0 && m_z_texture_id > 0;
+ return wxGetApp().get_shader("variable_layer_height") != nullptr && m_z_texture_id > 0;
}
bool GLCanvas3D::LayersEditing::is_enabled() const
@@ -219,64 +220,52 @@ void GLCanvas3D::LayersEditing::set_enabled(bool enabled)
m_enabled = is_allowed() && enabled;
}
+float GLCanvas3D::LayersEditing::s_overelay_window_width;
+
void GLCanvas3D::LayersEditing::render_overlay(const GLCanvas3D& canvas) const
{
if (!m_enabled)
return;
- static const ImVec4 ORANGE(1.0f, 0.49f, 0.22f, 1.0f);
-
const Size& cnv_size = canvas.get_canvas_size();
- float canvas_w = (float)cnv_size.get_width();
- float canvas_h = (float)cnv_size.get_height();
ImGuiWrapper& imgui = *wxGetApp().imgui();
- imgui.set_next_window_pos(canvas_w - imgui.get_style_scaling() * THICKNESS_BAR_WIDTH, canvas_h, ImGuiCond_Always, 1.0f, 1.0f);
+ imgui.set_next_window_pos(static_cast<float>(cnv_size.get_width()) - imgui.get_style_scaling() * THICKNESS_BAR_WIDTH,
+ static_cast<float>(cnv_size.get_height()), ImGuiCond_Always, 1.0f, 1.0f);
- imgui.begin(_(L("Variable layer height")), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoCollapse);
+ imgui.begin(_L("Variable layer height"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoCollapse);
- ImGui::PushStyleColor(ImGuiCol_Text, ORANGE);
- imgui.text(_(L("Left mouse button:")));
- ImGui::PopStyleColor();
+ imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _L("Left mouse button:"));
ImGui::SameLine();
- imgui.text(_(L("Add detail")));
+ imgui.text(_L("Add detail"));
- ImGui::PushStyleColor(ImGuiCol_Text, ORANGE);
- imgui.text(_(L("Right mouse button:")));
- ImGui::PopStyleColor();
+ imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _L("Right mouse button:"));
ImGui::SameLine();
- imgui.text(_(L("Remove detail")));
+ imgui.text(_L("Remove detail"));
- ImGui::PushStyleColor(ImGuiCol_Text, ORANGE);
- imgui.text(_(L("Shift + Left mouse button:")));
- ImGui::PopStyleColor();
+ imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _L("Shift + Left mouse button:"));
ImGui::SameLine();
- imgui.text(_(L("Reset to base")));
+ imgui.text(_L("Reset to base"));
- ImGui::PushStyleColor(ImGuiCol_Text, ORANGE);
- imgui.text(_(L("Shift + Right mouse button:")));
- ImGui::PopStyleColor();
+ imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _L("Shift + Right mouse button:"));
ImGui::SameLine();
- imgui.text(_(L("Smoothing")));
+ imgui.text(_L("Smoothing"));
- ImGui::PushStyleColor(ImGuiCol_Text, ORANGE);
- imgui.text(_(L("Mouse wheel:")));
- ImGui::PopStyleColor();
+ imgui.text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, _L("Mouse wheel:"));
ImGui::SameLine();
- imgui.text(_(L("Increase/decrease edit area")));
+ imgui.text(_L("Increase/decrease edit area"));
ImGui::Separator();
- if (imgui.button(_(L("Adaptive"))))
+ if (imgui.button(_L("Adaptive")))
wxPostEvent((wxEvtHandler*)canvas.get_wxglcanvas(), Event<float>(EVT_GLCANVAS_ADAPTIVE_LAYER_HEIGHT_PROFILE, m_adaptive_quality));
ImGui::SameLine();
float text_align = ImGui::GetCursorPosX();
ImGui::AlignTextToFramePadding();
- imgui.text(_(L("Quality / Speed")));
- if (ImGui::IsItemHovered())
- {
+ imgui.text(_L("Quality / Speed"));
+ if (ImGui::IsItemHovered()) {
ImGui::BeginTooltip();
- ImGui::TextUnformatted(_(L("Higher print quality versus higher print speed.")).ToUTF8());
+ ImGui::TextUnformatted(_L("Higher print quality versus higher print speed.").ToUTF8());
ImGui::EndTooltip();
}
@@ -287,13 +276,13 @@ void GLCanvas3D::LayersEditing::render_overlay(const GLCanvas3D& canvas) const
ImGui::SliderFloat("", &m_adaptive_quality, 0.0f, 1.f, "%.2f");
ImGui::Separator();
- if (imgui.button(_(L("Smooth"))))
+ if (imgui.button(_L("Smooth")))
wxPostEvent((wxEvtHandler*)canvas.get_wxglcanvas(), HeightProfileSmoothEvent(EVT_GLCANVAS_SMOOTH_LAYER_HEIGHT_PROFILE, m_smooth_params));
ImGui::SameLine();
ImGui::SetCursorPosX(text_align);
ImGui::AlignTextToFramePadding();
- imgui.text(_(L("Radius")));
+ imgui.text(_L("Radius"));
ImGui::SameLine();
ImGui::SetCursorPosX(widget_align);
ImGui::PushItemWidth(imgui.get_style_scaling() * 120.0f);
@@ -303,7 +292,7 @@ void GLCanvas3D::LayersEditing::render_overlay(const GLCanvas3D& canvas) const
ImGui::SetCursorPosX(text_align);
ImGui::AlignTextToFramePadding();
- imgui.text(_(L("Keep min")));
+ imgui.text(_L("Keep min"));
ImGui::SameLine();
if (ImGui::GetCursorPosX() < widget_align) // because of line lenght after localization
ImGui::SetCursorPosX(widget_align);
@@ -312,9 +301,10 @@ void GLCanvas3D::LayersEditing::render_overlay(const GLCanvas3D& canvas) const
imgui.checkbox("##2", m_smooth_params.keep_min);
ImGui::Separator();
- if (imgui.button(_(L("Reset"))))
+ if (imgui.button(_L("Reset")))
wxPostEvent((wxEvtHandler*)canvas.get_wxglcanvas(), SimpleEvent(EVT_GLCANVAS_RESET_LAYER_HEIGHT_PROFILE));
+ GLCanvas3D::LayersEditing::s_overelay_window_width = ImGui::GetWindowSize().x /*+ (float)m_layers_texture.width/4*/;
imgui.end();
const Rect& bar_rect = get_bar_rect_viewport(canvas);
@@ -358,34 +348,28 @@ Rect GLCanvas3D::LayersEditing::get_bar_rect_viewport(const GLCanvas3D& canvas)
const Size& cnv_size = canvas.get_canvas_size();
float half_w = 0.5f * (float)cnv_size.get_width();
float half_h = 0.5f * (float)cnv_size.get_height();
-
- float inv_zoom = (float)canvas.get_camera().get_inv_zoom();
-
+ float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom();
return Rect((half_w - thickness_bar_width(canvas)) * inv_zoom, half_h * inv_zoom, half_w * inv_zoom, -half_h * inv_zoom);
}
bool GLCanvas3D::LayersEditing::is_initialized() const
{
- return m_shader.is_initialized();
+ return wxGetApp().get_shader("variable_layer_height") != nullptr;
}
std::string GLCanvas3D::LayersEditing::get_tooltip(const GLCanvas3D& canvas) const
{
std::string ret;
- if (m_enabled && (m_layer_height_profile.size() >= 4))
- {
+ if (m_enabled && m_layer_height_profile.size() >= 4) {
float z = get_cursor_z_relative(canvas);
- if (z != -1000.0f)
- {
+ if (z != -1000.0f) {
z *= m_object_max_z;
float h = 0.0f;
- for (size_t i = m_layer_height_profile.size() - 2; i >= 2; i -= 2)
- {
+ for (size_t i = m_layer_height_profile.size() - 2; i >= 2; i -= 2) {
float zi = m_layer_height_profile[i];
float zi_1 = m_layer_height_profile[i - 2];
- if ((zi_1 <= z) && (z <= zi))
- {
+ if (zi_1 <= z && z <= zi) {
float dz = zi - zi_1;
h = (dz != 0.0f) ? lerp(m_layer_height_profile[i - 1], m_layer_height_profile[i + 1], (z - zi_1) / dz) : m_layer_height_profile[i + 1];
break;
@@ -400,13 +384,17 @@ std::string GLCanvas3D::LayersEditing::get_tooltip(const GLCanvas3D& canvas) con
void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3D& canvas, const Rect& bar_rect) const
{
- m_shader.start_using();
+ GLShaderProgram* shader = wxGetApp().get_shader("variable_layer_height");
+ if (shader == nullptr)
+ return;
- m_shader.set_uniform("z_to_texture_row", float(m_layers_texture.cells - 1) / (float(m_layers_texture.width) * m_object_max_z));
- m_shader.set_uniform("z_texture_row_to_normalized", 1.0f / (float)m_layers_texture.height);
- m_shader.set_uniform("z_cursor", m_object_max_z * this->get_cursor_z_relative(canvas));
- m_shader.set_uniform("z_cursor_band_width", band_width);
- m_shader.set_uniform("object_max_z", m_object_max_z);
+ shader->start_using();
+
+ shader->set_uniform("z_to_texture_row", float(m_layers_texture.cells - 1) / (float(m_layers_texture.width) * m_object_max_z));
+ shader->set_uniform("z_texture_row_to_normalized", 1.0f / (float)m_layers_texture.height);
+ shader->set_uniform("z_cursor", m_object_max_z * this->get_cursor_z_relative(canvas));
+ shader->set_uniform("z_cursor_band_width", band_width);
+ shader->set_uniform("object_max_z", m_object_max_z);
glsafe(::glPixelStorei(GL_UNPACK_ALIGNMENT, 1));
glsafe(::glBindTexture(GL_TEXTURE_2D, m_z_texture_id));
@@ -426,7 +414,7 @@ void GLCanvas3D::LayersEditing::render_active_object_annotations(const GLCanvas3
glsafe(::glEnd());
glsafe(::glBindTexture(GL_TEXTURE_2D, 0));
- m_shader.stop_using();
+ shader->stop_using();
}
void GLCanvas3D::LayersEditing::render_profile(const Rect& bar_rect) const
@@ -460,73 +448,50 @@ void GLCanvas3D::LayersEditing::render_volumes(const GLCanvas3D& canvas, const G
{
assert(this->is_allowed());
assert(this->last_object_id != -1);
- GLint shader_id = m_shader.get_shader()->shader_program_id;
- assert(shader_id > 0);
+ GLShaderProgram* shader = wxGetApp().get_shader("variable_layer_height");
+ if (shader == nullptr)
+ return;
- GLint current_program_id;
- glsafe(::glGetIntegerv(GL_CURRENT_PROGRAM, &current_program_id));
- if (shader_id > 0 && shader_id != current_program_id)
+ GLShaderProgram* current_shader = wxGetApp().get_current_shader();
+ if (shader->get_id() != current_shader->get_id())
// The layer editing shader is not yet active. Activate it.
- glsafe(::glUseProgram(shader_id));
+ shader->start_using();
else
// The layer editing shader was already active.
- current_program_id = -1;
+ current_shader = nullptr;
- GLint z_to_texture_row_id = ::glGetUniformLocation(shader_id, "z_to_texture_row");
- GLint z_texture_row_to_normalized_id = ::glGetUniformLocation(shader_id, "z_texture_row_to_normalized");
- GLint z_cursor_id = ::glGetUniformLocation(shader_id, "z_cursor");
- GLint z_cursor_band_width_id = ::glGetUniformLocation(shader_id, "z_cursor_band_width");
- GLint world_matrix_id = ::glGetUniformLocation(shader_id, "volume_world_matrix");
- GLint object_max_z_id = ::glGetUniformLocation(shader_id, "object_max_z");
- glcheck();
+ const_cast<LayersEditing*>(this)->generate_layer_height_texture();
- if (z_to_texture_row_id != -1 && z_texture_row_to_normalized_id != -1 && z_cursor_id != -1 && z_cursor_band_width_id != -1 && world_matrix_id != -1)
- {
- const_cast<LayersEditing*>(this)->generate_layer_height_texture();
-
- // Uniforms were resolved, go ahead using the layer editing shader.
- glsafe(::glUniform1f(z_to_texture_row_id, GLfloat(m_layers_texture.cells - 1) / (GLfloat(m_layers_texture.width) * GLfloat(m_object_max_z))));
- glsafe(::glUniform1f(z_texture_row_to_normalized_id, GLfloat(1.0f / m_layers_texture.height)));
- glsafe(::glUniform1f(z_cursor_id, GLfloat(m_object_max_z) * GLfloat(this->get_cursor_z_relative(canvas))));
- glsafe(::glUniform1f(z_cursor_band_width_id, GLfloat(this->band_width)));
- // Initialize the layer height texture mapping.
- GLsizei w = (GLsizei)m_layers_texture.width;
- GLsizei h = (GLsizei)m_layers_texture.height;
- GLsizei half_w = w / 2;
- GLsizei half_h = h / 2;
- glsafe(::glPixelStorei(GL_UNPACK_ALIGNMENT, 1));
- glsafe(::glBindTexture(GL_TEXTURE_2D, m_z_texture_id));
- glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0));
- glsafe(::glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, half_w, half_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0));
- glsafe(::glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, m_layers_texture.data.data()));
- glsafe(::glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, half_w, half_h, GL_RGBA, GL_UNSIGNED_BYTE, m_layers_texture.data.data() + m_layers_texture.width * m_layers_texture.height * 4));
- for (const GLVolume* glvolume : volumes.volumes) {
- // Render the object using the layer editing shader and texture.
- if (! glvolume->is_active || glvolume->composite_id.object_id != this->last_object_id || glvolume->is_modifier)
- continue;
- if (world_matrix_id != -1)
- glsafe(::glUniformMatrix4fv(world_matrix_id, 1, GL_FALSE, (const GLfloat*)glvolume->world_matrix().cast<float>().data()));
- if (object_max_z_id != -1)
- glsafe(::glUniform1f(object_max_z_id, GLfloat(0)));
- glvolume->render();
- }
- // Revert back to the previous shader.
- glBindTexture(GL_TEXTURE_2D, 0);
- if (current_program_id > 0)
- glsafe(::glUseProgram(current_program_id));
- }
- else
- {
- // Something went wrong. Just render the object.
- assert(false);
- for (const GLVolume* glvolume : volumes.volumes) {
- // Render the object using the layer editing shader and texture.
- if (!glvolume->is_active || glvolume->composite_id.object_id != this->last_object_id || glvolume->is_modifier)
- continue;
- glsafe(::glUniformMatrix4fv(world_matrix_id, 1, GL_FALSE, (const GLfloat*)glvolume->world_matrix().cast<float>().data()));
- glvolume->render();
- }
- }
+ // Uniforms were resolved, go ahead using the layer editing shader.
+ shader->set_uniform("z_to_texture_row", float(m_layers_texture.cells - 1) / (float(m_layers_texture.width) * float(m_object_max_z)));
+ shader->set_uniform("z_texture_row_to_normalized", 1.0f / float(m_layers_texture.height));
+ shader->set_uniform("z_cursor", float(m_object_max_z) * float(this->get_cursor_z_relative(canvas)));
+ shader->set_uniform("z_cursor_band_width", float(this->band_width));
+
+ // Initialize the layer height texture mapping.
+ GLsizei w = (GLsizei)m_layers_texture.width;
+ GLsizei h = (GLsizei)m_layers_texture.height;
+ GLsizei half_w = w / 2;
+ GLsizei half_h = h / 2;
+ glsafe(::glPixelStorei(GL_UNPACK_ALIGNMENT, 1));
+ glsafe(::glBindTexture(GL_TEXTURE_2D, m_z_texture_id));
+ glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0));
+ glsafe(::glTexImage2D(GL_TEXTURE_2D, 1, GL_RGBA, half_w, half_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0));
+ glsafe(::glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, w, h, GL_RGBA, GL_UNSIGNED_BYTE, m_layers_texture.data.data()));
+ glsafe(::glTexSubImage2D(GL_TEXTURE_2D, 1, 0, 0, half_w, half_h, GL_RGBA, GL_UNSIGNED_BYTE, m_layers_texture.data.data() + m_layers_texture.width * m_layers_texture.height * 4));
+ for (const GLVolume* glvolume : volumes.volumes) {
+ // Render the object using the layer editing shader and texture.
+ if (! glvolume->is_active || glvolume->composite_id.object_id != this->last_object_id || glvolume->is_modifier)
+ continue;
+
+ shader->set_uniform("volume_world_matrix", glvolume->world_matrix());
+ shader->set_uniform("object_max_z", GLfloat(0));
+ glvolume->render();
+ }
+ // Revert back to the previous shader.
+ glBindTexture(GL_TEXTURE_2D, 0);
+ if (current_shader != nullptr)
+ current_shader->start_using();
}
void GLCanvas3D::LayersEditing::adjust_layer_height_profile()
@@ -550,7 +515,7 @@ void GLCanvas3D::LayersEditing::adaptive_layer_height_profile(GLCanvas3D& canvas
{
this->update_slicing_parameters();
m_layer_height_profile = layer_height_profile_adaptive(*m_slicing_parameters, *m_model_object, quality_factor);
- const_cast<ModelObject*>(m_model_object)->layer_height_profile = m_layer_height_profile;
+ const_cast<ModelObject*>(m_model_object)->layer_height_profile.set(m_layer_height_profile);
m_layers_texture.valid = false;
canvas.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS));
}
@@ -559,7 +524,7 @@ void GLCanvas3D::LayersEditing::smooth_layer_height_profile(GLCanvas3D& canvas,
{
this->update_slicing_parameters();
m_layer_height_profile = smooth_height_profile(m_layer_height_profile, *m_slicing_parameters, smoothing_params);
- const_cast<ModelObject*>(m_model_object)->layer_height_profile = m_layer_height_profile;
+ const_cast<ModelObject*>(m_model_object)->layer_height_profile.set(m_layer_height_profile);
m_layers_texture.valid = false;
canvas.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS));
}
@@ -599,7 +564,7 @@ void GLCanvas3D::LayersEditing::accept_changes(GLCanvas3D& canvas)
if (last_object_id >= 0) {
if (m_layer_height_profile_modified) {
wxGetApp().plater()->take_snapshot(_(L("Variable layer height - Manual edit")));
- const_cast<ModelObject*>(m_model_object)->layer_height_profile = m_layer_height_profile;
+ const_cast<ModelObject*>(m_model_object)->layer_height_profile.set(m_layer_height_profile);
canvas.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS));
}
}
@@ -659,13 +624,44 @@ GLCanvas3D::WarningTexture::WarningTexture()
void GLCanvas3D::WarningTexture::activate(WarningTexture::Warning warning, bool state, const GLCanvas3D& canvas)
{
+ // Since we have NotificationsManager.hpp the warning textures are no loger needed.
+ // However i have left the infrastructure here and only commented the rendering.
+ // The plater warning / error notifications are added and closed from here.
+
+ std::string text;
+ bool error = false;
+ switch (warning) {
+ case ObjectOutside: text = L("An object outside the print area was detected."); break;
+ case ToolpathOutside: text = L("A toolpath outside the print area was detected."); error = true; break;
+ case SlaSupportsOutside: text = L("SLA supports outside the print area were detected."); error = true; break;
+ case SomethingNotShown: text = L("Some objects are not visible."); break;
+ case ObjectClashed:
+ text = L( "An object outside the print area was detected.\n"
+ "Resolve the current problem to continue slicing.");
+ error = true;
+ break;
+ }
+ auto &notification_manager = *wxGetApp().plater()->get_notification_manager();
+ if (state) {
+ if(error)
+ notification_manager.push_plater_error_notification(text);
+ else
+ notification_manager.push_plater_warning_notification(text);
+ } else {
+ if (error)
+ notification_manager.close_plater_error_notification(text);
+ else
+ notification_manager.close_plater_warning_notification(text);
+ }
+
+ /*
auto it = std::find(m_warnings.begin(), m_warnings.end(), warning);
if (state) {
if (it != m_warnings.end()) // this warning is already set to be shown
return;
- m_warnings.emplace_back(warning);
+ m_warnings.push_back(warning);
std::sort(m_warnings.begin(), m_warnings.end());
}
else {
@@ -687,7 +683,7 @@ void GLCanvas3D::WarningTexture::activate(WarningTexture::Warning warning, bool
case ObjectOutside : text = L("An object outside the print area was detected"); break;
case ToolpathOutside : text = L("A toolpath outside the print area was detected"); break;
case SlaSupportsOutside : text = L("SLA supports outside the print area were detected"); break;
- case SomethingNotShown : text = L("Some objects are not visible"); break;
+ case SomethingNotShown : text = L("Some objects are not visible when editing supports"); break;
case ObjectClashed: {
text = L("An object outside the print area was detected\n"
"Resolve the current problem to continue slicing");
@@ -701,6 +697,7 @@ void GLCanvas3D::WarningTexture::activate(WarningTexture::Warning warning, bool
// save information for rescaling
m_msg_text = text;
m_is_colored_red = red_colored;
+ */
}
@@ -774,6 +771,13 @@ bool GLCanvas3D::WarningTexture::generate(const std::string& msg_utf8, const GLC
#else
// select default font
const float scale = canvas.get_canvas_size().get_scale_factor();
+#if ENABLE_RETINA_GL
+ // For non-visible or non-created window getBackingScaleFactor function return 0.0 value.
+ // And using of the zero scale causes a crash, when we trying to draw text to the (0,0) rectangle
+ // https://github.com/prusa3d/PrusaSlicer/issues/3916
+ if (scale <= 0.0f)
+ return false;
+#endif
wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Scale(scale);
#endif
@@ -809,11 +813,9 @@ bool GLCanvas3D::WarningTexture::generate(const std::string& msg_utf8, const GLC
// prepare buffer
std::vector<unsigned char> data(4 * m_width * m_height, 0);
const unsigned char *src = image.GetData();
- for (int h = 0; h < m_height; ++h)
- {
+ for (int h = 0; h < m_height; ++h) {
unsigned char* dst = data.data() + 4 * h * m_width;
- for (int w = 0; w < m_width; ++w)
- {
+ for (int w = 0; w < m_width; ++w) {
*dst++ = 255;
if (red_colored) {
*dst++ = 72; // 204
@@ -848,10 +850,9 @@ void GLCanvas3D::WarningTexture::render(const GLCanvas3D& canvas) const
if (m_warnings.empty())
return;
- if ((m_id > 0) && (m_original_width > 0) && (m_original_height > 0) && (m_width > 0) && (m_height > 0))
- {
+ if (m_id > 0 && m_original_width > 0 && m_original_height > 0 && m_width > 0 && m_height > 0) {
const Size& cnv_size = canvas.get_canvas_size();
- float inv_zoom = (float)canvas.get_camera().get_inv_zoom();
+ float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom();
float left = (-0.5f * (float)m_original_width) * inv_zoom;
float top = (-0.5f * (float)cnv_size.get_height() + (float)m_original_height + 2.0f) * inv_zoom;
float right = left + (float)m_original_width * inv_zoom;
@@ -880,371 +881,12 @@ void GLCanvas3D::WarningTexture::msw_rescale(const GLCanvas3D& canvas)
generate(m_msg_text, canvas, true, m_is_colored_red);
}
-const unsigned char GLCanvas3D::LegendTexture::Squares_Border_Color[3] = { 64, 64, 64 };
-const unsigned char GLCanvas3D::LegendTexture::Default_Background_Color[3] = { (unsigned char)(DEFAULT_BG_LIGHT_COLOR[0] * 255.0f), (unsigned char)(DEFAULT_BG_LIGHT_COLOR[1] * 255.0f), (unsigned char)(DEFAULT_BG_LIGHT_COLOR[2] * 255.0f) };
-const unsigned char GLCanvas3D::LegendTexture::Error_Background_Color[3] = { (unsigned char)(ERROR_BG_LIGHT_COLOR[0] * 255.0f), (unsigned char)(ERROR_BG_LIGHT_COLOR[1] * 255.0f), (unsigned char)(ERROR_BG_LIGHT_COLOR[2] * 255.0f) };
-const unsigned char GLCanvas3D::LegendTexture::Opacity = 255;
-
-GLCanvas3D::LegendTexture::LegendTexture()
- : GUI::GLTexture()
- , m_original_width(0)
- , m_original_height(0)
-{
-}
-
-void GLCanvas3D::LegendTexture::fill_color_print_legend_items( const GLCanvas3D& canvas,
- const std::vector<float>& colors_in,
- std::vector<float>& colors,
- std::vector<std::string>& cp_legend_items)
-{
- std::vector<CustomGCode::Item> custom_gcode_per_print_z = wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes;
-
- const int extruders_cnt = wxGetApp().extruders_edited_cnt();
- if (extruders_cnt == 1)
- {
- if (custom_gcode_per_print_z.empty()) {
- cp_legend_items.emplace_back(I18N::translate_utf8(L("Default print color")));
- colors = colors_in;
- return;
- }
- std::vector<std::pair<double, double>> cp_values;
- cp_values.reserve(custom_gcode_per_print_z.size());
-
- std::vector<double> print_zs = canvas.get_current_print_zs(true);
- for (auto custom_code : custom_gcode_per_print_z)
- {
- if (custom_code.gcode != ColorChangeCode)
- continue;
- auto lower_b = std::lower_bound(print_zs.begin(), print_zs.end(), custom_code.print_z - Slic3r::DoubleSlider::epsilon());
-
- if (lower_b == print_zs.end())
- continue;
-
- double current_z = *lower_b;
- double previous_z = lower_b == print_zs.begin() ? 0.0 : *(--lower_b);
-
- // to avoid duplicate values, check adding values
- if (cp_values.empty() ||
- !(cp_values.back().first == previous_z && cp_values.back().second == current_z))
- cp_values.emplace_back(std::pair<double, double>(previous_z, current_z));
- }
-
- const auto items_cnt = (int)cp_values.size();
- if (items_cnt == 0) // There is no one color change, but there is/are some pause print or custom Gcode
- {
- cp_legend_items.emplace_back(I18N::translate_utf8(L("Default print color")));
- cp_legend_items.emplace_back(I18N::translate_utf8(L("Pause print or custom G-code")));
- colors = colors_in;
- return;
- }
-
- const int color_cnt = (int)colors_in.size() / 4;
- colors.resize(colors_in.size(), 0.0);
-
- ::memcpy((void*)(colors.data()), (const void*)(colors_in.data() + (color_cnt - 1) * 4), 4 * sizeof(float));
- cp_legend_items.emplace_back(I18N::translate_utf8(L("Pause print or custom G-code")));
- size_t color_pos = 4;
-
- for (int i = items_cnt; i >= 0; --i, color_pos+=4)
- {
- // update colors for color print item
- ::memcpy((void*)(colors.data() + color_pos), (const void*)(colors_in.data() + i * 4), 4 * sizeof(float));
-
- // create label for color print item
- std::string id_str = std::to_string(i + 1) + ": ";
-
- if (i == 0) {
- cp_legend_items.emplace_back(id_str + (boost::format(I18N::translate_utf8(L("up to %.2f mm"))) % cp_values[0].first).str());
- break;
- }
- if (i == items_cnt) {
- cp_legend_items.emplace_back(id_str + (boost::format(I18N::translate_utf8(L("above %.2f mm"))) % cp_values[i - 1].second).str());
- continue;
- }
-
- cp_legend_items.emplace_back(id_str + (boost::format(I18N::translate_utf8(L("%.2f - %.2f mm"))) % cp_values[i - 1].second % cp_values[i].first).str());
- }
- }
- else
- {
- // colors = colors_in;
- const int color_cnt = (int)colors_in.size() / 4;
- colors.resize(colors_in.size(), 0.0);
-
- ::memcpy((void*)(colors.data()), (const void*)(colors_in.data()), 4 * extruders_cnt * sizeof(float));
- size_t color_pos = 4 * extruders_cnt;
- size_t color_in_pos = 4 * (color_cnt - 1);
-
- for (unsigned int i = 0; i < (unsigned int)extruders_cnt; ++i)
- cp_legend_items.emplace_back((boost::format(I18N::translate_utf8(L("Extruder %d"))) % (i + 1)).str());
-
- ::memcpy((void*)(colors.data() + color_pos), (const void*)(colors_in.data() + color_in_pos), 4 * sizeof(float));
- color_pos += 4;
- color_in_pos -= 4;
- cp_legend_items.emplace_back(I18N::translate_utf8(L("Pause print or custom G-code")));
-
- int cnt = custom_gcode_per_print_z.size();
- int color_change_idx = color_cnt - extruders_cnt;
- for (int i = cnt-1; i >= 0; --i)
- if (custom_gcode_per_print_z[i].gcode == ColorChangeCode) {
- ::memcpy((void*)(colors.data() + color_pos), (const void*)(colors_in.data() + color_in_pos), 4 * sizeof(float));
- color_pos += 4;
- color_in_pos -= 4;
-
- // create label for color change item
- std::string id_str = std::to_string(color_change_idx--) + ": ";
-
- cp_legend_items.emplace_back(id_str + (boost::format(I18N::translate_utf8(L("Color change for Extruder %d at %.2f mm"))) % custom_gcode_per_print_z[i].extruder % custom_gcode_per_print_z[i].print_z).str());
- }
- }
-}
-
-bool GLCanvas3D::LegendTexture::generate(const GCodePreviewData& preview_data, const std::vector<float>& tool_colors_in, const GLCanvas3D& canvas, bool compress)
-{
- reset();
-
- // collects items to render
- auto title = _(preview_data.get_legend_title());
-
- std::vector<std::string> cp_legend_items;
- std::vector<float> cp_colors;
-
- if (preview_data.extrusion.view_type == GCodePreviewData::Extrusion::ColorPrint)
- {
- cp_legend_items.reserve(cp_colors.size());
- fill_color_print_legend_items(canvas, tool_colors_in, cp_colors, cp_legend_items);
- }
-
- const std::vector<float>& tool_colors = preview_data.extrusion.view_type == GCodePreviewData::Extrusion::ColorPrint ? cp_colors : tool_colors_in;
- const GCodePreviewData::LegendItemsList& items = preview_data.get_legend_items(tool_colors, cp_legend_items);
-
- unsigned int items_count = (unsigned int)items.size();
- if (items_count == 0)
- // nothing to render, return
- return false;
-
- wxMemoryDC memDC;
- wxMemoryDC mask_memDC;
-
- // calculate scaling
- const float scale_gl = canvas.get_canvas_size().get_scale_factor();
-#if ENABLE_RETINA_GL
- // For non-visible or non-created window getBackingScaleFactor function return 0.0 value.
- // And using of the zero scale causes a crash, when we trying to draw text to the (0,0) rectangle
- if (scale_gl <= 0.0f)
- return false;
-#endif
- const float scale = scale_gl * wxGetApp().em_unit()*0.1; // get scale from em_unit() value, because of get_scale_factor() return 1
- const int scaled_square = std::floor((float)Px_Square * scale);
- const int scaled_title_offset = Px_Title_Offset * scale;
- const int scaled_text_offset = Px_Text_Offset * scale;
- const int scaled_square_contour = Px_Square_Contour * scale;
- const int scaled_border = Px_Border * scale;
-
-#ifdef __WXMSW__
- // set scaled application normal font as default font
- wxFont font = wxGetApp().normal_font();
-
- // Disabling ClearType works, but the font returned is very different (much thicker) from the default.
-// msw_disable_cleartype(font);
-// bool cleartype = is_font_cleartype(font);
-#else
- // select default font
- wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Scale(scale_gl);
-// bool cleartype = false;
-#endif /* __WXMSW__ */
-
- memDC.SetFont(font);
- mask_memDC.SetFont(font);
-
- // calculates texture size
- wxCoord w, h;
- memDC.GetTextExtent(title, &w, &h);
- int title_width = (int)w;
- int title_height = (int)h;
-
- int max_text_width = 0;
- int max_text_height = 0;
- for (const GCodePreviewData::LegendItem& item : items)
- {
- memDC.GetTextExtent(GUI::from_u8(item.text), &w, &h);
- max_text_width = std::max(max_text_width, (int)w);
- max_text_height = std::max(max_text_height, (int)h);
- }
-
- m_original_width = std::max(2 * scaled_border + title_width, 2 * (scaled_border + scaled_square_contour) + scaled_square + scaled_text_offset + max_text_width);
- m_original_height = 2 * (scaled_border + scaled_square_contour) + title_height + scaled_title_offset + items_count * scaled_square;
- if (items_count > 1)
- m_original_height += (items_count - 1) * scaled_square_contour;
-
- m_width = (int)next_highest_power_of_2((uint32_t)m_original_width);
- m_height = (int)next_highest_power_of_2((uint32_t)m_original_height);
-
- // generates bitmap
- wxBitmap bitmap(m_width, m_height);
- wxBitmap mask(m_width, m_height);
-
- memDC.SelectObject(bitmap);
- mask_memDC.SelectObject(mask);
-
- memDC.SetBackground(wxBrush(*wxBLACK));
- mask_memDC.SetBackground(wxBrush(*wxBLACK));
-
- memDC.Clear();
- mask_memDC.Clear();
-
- // draw title
- memDC.SetTextForeground(*wxWHITE);
- mask_memDC.SetTextForeground(*wxRED);
-
- int title_x = scaled_border;
- int title_y = scaled_border;
- memDC.DrawText(title, title_x, title_y);
- mask_memDC.DrawText(title, title_x, title_y);
-
- // draw icons contours as background
- int squares_contour_x = scaled_border;
- int squares_contour_y = scaled_border + title_height + scaled_title_offset;
- int squares_contour_width = scaled_square + 2 * scaled_square_contour;
- int squares_contour_height = items_count * scaled_square + 2 * scaled_square_contour;
- if (items_count > 1)
- squares_contour_height += (items_count - 1) * scaled_square_contour;
-
- wxColour color(Squares_Border_Color[0], Squares_Border_Color[1], Squares_Border_Color[2]);
- wxPen pen(color);
- wxBrush brush(color);
- memDC.SetPen(pen);
- memDC.SetBrush(brush);
- memDC.DrawRectangle(wxRect(squares_contour_x, squares_contour_y, squares_contour_width, squares_contour_height));
-
- // draw items (colored icon + text)
- int icon_x = squares_contour_x + scaled_square_contour;
- int icon_x_inner = icon_x + 1;
- int icon_y = squares_contour_y + scaled_square_contour;
- int icon_y_step = scaled_square + scaled_square_contour;
-
- int text_x = icon_x + scaled_square + scaled_text_offset;
- int text_y_offset = (scaled_square - max_text_height) / 2;
-
- int px_inner_square = scaled_square - 2;
-
- for (const GCodePreviewData::LegendItem& item : items)
- {
- // draw darker icon perimeter
- const std::vector<unsigned char>& item_color_bytes = item.color.as_bytes();
- wxImage::HSVValue dark_hsv = wxImage::RGBtoHSV(wxImage::RGBValue(item_color_bytes[0], item_color_bytes[1], item_color_bytes[2]));
- dark_hsv.value *= 0.75;
- wxImage::RGBValue dark_rgb = wxImage::HSVtoRGB(dark_hsv);
- color.Set(dark_rgb.red, dark_rgb.green, dark_rgb.blue, item_color_bytes[3]);
- pen.SetColour(color);
- brush.SetColour(color);
- memDC.SetPen(pen);
- memDC.SetBrush(brush);
- memDC.DrawRectangle(wxRect(icon_x, icon_y, scaled_square, scaled_square));
-
- // draw icon interior
- color.Set(item_color_bytes[0], item_color_bytes[1], item_color_bytes[2], item_color_bytes[3]);
- pen.SetColour(color);
- brush.SetColour(color);
- memDC.SetPen(pen);
- memDC.SetBrush(brush);
- memDC.DrawRectangle(wxRect(icon_x_inner, icon_y + 1, px_inner_square, px_inner_square));
-
- // draw text
- mask_memDC.DrawText(GUI::from_u8(item.text), text_x, icon_y + text_y_offset);
-
- // update y
- icon_y += icon_y_step;
- }
-
- memDC.SelectObject(wxNullBitmap);
- mask_memDC.SelectObject(wxNullBitmap);
-
- // Convert the bitmap into a linear data ready to be loaded into the GPU.
- wxImage image = bitmap.ConvertToImage();
- wxImage mask_image = mask.ConvertToImage();
-
- // prepare buffer
- std::vector<unsigned char> data(4 * m_width * m_height, 0);
- const unsigned char *src_image = image.GetData();
- const unsigned char *src_mask = mask_image.GetData();
- for (int h = 0; h < m_height; ++h)
- {
- int hh = h * m_width;
- unsigned char* px_ptr = data.data() + 4 * hh;
- for (int w = 0; w < m_width; ++w)
- {
- if (w >= squares_contour_x && w < squares_contour_x + squares_contour_width &&
- h >= squares_contour_y && h < squares_contour_y + squares_contour_height) {
- // Color palette, use the color verbatim.
- *px_ptr++ = *src_image++;
- *px_ptr++ = *src_image++;
- *px_ptr++ = *src_image++;
- *px_ptr++ = 255;
- } else {
- // Text or background
- unsigned char alpha = *src_mask;
- // Compensate the white color for the 50% opacity reduction at the character edges.
- //unsigned char color = (unsigned char)floor(alpha * 255.f / (128.f + 0.5f * alpha));
- unsigned char color = alpha;
- *px_ptr++ = color;
- *px_ptr++ = color; // *src_mask ++;
- *px_ptr++ = color; // *src_mask ++;
- *px_ptr++ = 128 + (alpha / 2); // (alpha > 0) ? 255 : 128;
- src_image += 3;
- }
- src_mask += 3;
- }
- }
-
- // sends buffer to gpu
- glsafe(::glPixelStorei(GL_UNPACK_ALIGNMENT, 1));
- glsafe(::glGenTextures(1, &m_id));
- glsafe(::glBindTexture(GL_TEXTURE_2D, (GLuint)m_id));
- if (compress && GLEW_EXT_texture_compression_s3tc)
- glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, (GLsizei)m_width, (GLsizei)m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data()));
- else
- glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)m_width, (GLsizei)m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data()));
- glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR));
- glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR));
- glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0));
- glsafe(::glBindTexture(GL_TEXTURE_2D, 0));
-
- return true;
-}
-
-void GLCanvas3D::LegendTexture::render(const GLCanvas3D& canvas) const
-{
- if ((m_id > 0) && (m_original_width > 0) && (m_original_height > 0) && (m_width > 0) && (m_height > 0))
- {
- const Size& cnv_size = canvas.get_canvas_size();
- float inv_zoom = (float)canvas.get_camera().get_inv_zoom();
- float left = (-0.5f * (float)cnv_size.get_width()) * inv_zoom;
- float top = (0.5f * (float)cnv_size.get_height()) * inv_zoom;
- float right = left + (float)m_original_width * inv_zoom;
- float bottom = top - (float)m_original_height * inv_zoom;
-
- float uv_left = 0.0f;
- float uv_top = 0.0f;
- float uv_right = (float)m_original_width / (float)m_width;
- float uv_bottom = (float)m_original_height / (float)m_height;
-
- GLTexture::Quad_UVs uvs;
- uvs.left_top = { uv_left, uv_top };
- uvs.left_bottom = { uv_left, uv_bottom };
- uvs.right_bottom = { uv_right, uv_bottom };
- uvs.right_top = { uv_right, uv_top };
-
- GLTexture::render_sub_texture(m_id, left, right, bottom, top, uvs);
- }
-}
-
void GLCanvas3D::Labels::render(const std::vector<const ModelInstance*>& sorted_instances) const
{
if (!m_enabled || !is_shown())
return;
- const Camera& camera = m_canvas.get_camera();
+ const Camera& camera = wxGetApp().plater()->get_camera();
const Model* model = m_canvas.get_model();
if (model == nullptr)
return;
@@ -1298,7 +940,7 @@ void GLCanvas3D::Labels::render(const std::vector<const ModelInstance*>& sorted_
// updates print order strings
if (sorted_instances.size() > 1) {
- for (int i = 0; i < sorted_instances.size(); ++i) {
+ for (size_t i = 0; i < sorted_instances.size(); ++i) {
size_t id = sorted_instances[i]->id().id;
std::vector<Owner>::iterator it = std::find_if(owners.begin(), owners.end(), [id](const Owner& owner) {
return owner.model_instance_id == id;
@@ -1353,8 +995,7 @@ void GLCanvas3D::Labels::render(const std::vector<const ModelInstance*>& sorted_
ImGui::AlignTextToFramePadding();
imgui.text(owner.label);
- if (!owner.print_order.empty())
- {
+ if (!owner.print_order.empty()) {
ImGui::Separator();
float po_len = imgui.calc_text_size(owner.print_order).x;
ImGui::SetCursorPosX(0.5f * (win_w - po_len));
@@ -1372,29 +1013,20 @@ void GLCanvas3D::Labels::render(const std::vector<const ModelInstance*>& sorted_
}
}
-#if ENABLE_CANVAS_TOOLTIP_USING_IMGUI
-#if ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
void GLCanvas3D::Tooltip::set_text(const std::string& text)
{
// If the mouse is inside an ImGUI dialog, then the tooltip is suppressed.
const std::string &new_text = m_in_imgui ? std::string() : text;
- if (m_text != new_text)
- {
+ if (m_text != new_text) {
if (m_text.empty())
m_start_time = std::chrono::steady_clock::now();
m_text = new_text;
}
}
-#endif // ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
-#if ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
void GLCanvas3D::Tooltip::render(const Vec2d& mouse_position, GLCanvas3D& canvas) const
-#else
-void GLCanvas3D::Tooltip::render(const Vec2d& mouse_position) const
-#endif // ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
{
-#if ENABLE_CANVAS_CONSTRAINED_TOOLTIP_USING_IMGUI
static ImVec2 size(0.0f, 0.0f);
auto validate_position = [](const Vec2d& position, const GLCanvas3D& canvas, const ImVec2& wnd_size) {
@@ -1403,56 +1035,36 @@ void GLCanvas3D::Tooltip::render(const Vec2d& mouse_position) const
float y = std::clamp((float)position(1) + 16, 0.0f, (float)cnv_size.get_height() - wnd_size.y);
return Vec2f(x, y);
};
-#endif // ENABLE_CANVAS_CONSTRAINED_TOOLTIP_USING_IMGUI
-#if ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
if (m_text.empty())
return;
// draw the tooltip as hidden until the delay is expired
- float alpha = (std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - m_start_time).count() < 500) ? 0.0f : 1.0;
-#else
- if (m_text.empty())
- return;
-#endif // ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
+ // use a value of alpha slightly different from 0.0f because newer imgui does not calculate properly the window size if alpha == 0.0f
+ float alpha = (std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - m_start_time).count() < 500) ? 0.01f : 1.0f;
-#if ENABLE_CANVAS_CONSTRAINED_TOOLTIP_USING_IMGUI
Vec2f position = validate_position(mouse_position, canvas, size);
-#endif // ENABLE_CANVAS_CONSTRAINED_TOOLTIP_USING_IMGUI
ImGuiWrapper& imgui = *wxGetApp().imgui();
ImGui::PushStyleVar(ImGuiStyleVar_WindowRounding, 0.0f);
-#if ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
ImGui::PushStyleVar(ImGuiStyleVar_Alpha, alpha);
-#endif // ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
-#if ENABLE_CANVAS_CONSTRAINED_TOOLTIP_USING_IMGUI
imgui.set_next_window_pos(position(0), position(1), ImGuiCond_Always, 0.0f, 0.0f);
-#else
- imgui.set_next_window_pos(mouse_position(0), mouse_position(1) + 16, ImGuiCond_Always, 0.0f, 0.0f);
-#endif // ENABLE_CANVAS_CONSTRAINED_TOOLTIP_USING_IMGUI
- imgui.begin(_(L("canvas_tooltip")), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoFocusOnAppearing);
+ imgui.begin(wxString("canvas_tooltip"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMouseInputs | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoDecoration | ImGuiWindowFlags_NoFocusOnAppearing);
ImGui::BringWindowToDisplayFront(ImGui::GetCurrentWindow());
ImGui::TextUnformatted(m_text.c_str());
-#if ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
// force re-render while the windows gets to its final size (it may take several frames) or while hidden
- if (alpha == 0.0f || ImGui::GetWindowContentRegionWidth() + 2.0f * ImGui::GetStyle().WindowPadding.x != ImGui::CalcWindowExpectedSize(ImGui::GetCurrentWindow()).x)
+ if (alpha < 1.0f || ImGui::GetWindowContentRegionWidth() + 2.0f * ImGui::GetStyle().WindowPadding.x != ImGui::CalcWindowExpectedSize(ImGui::GetCurrentWindow()).x)
canvas.request_extra_frame();
-#endif // ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
-#if ENABLE_CANVAS_CONSTRAINED_TOOLTIP_USING_IMGUI
size = ImGui::GetWindowSize();
-#endif // ENABLE_CANVAS_CONSTRAINED_TOOLTIP_USING_IMGUI
imgui.end();
-#if ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
ImGui::PopStyleVar(2);
-#else
- ImGui::PopStyleVar();
-#endif // ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
}
-#endif // ENABLE_CANVAS_TOOLTIP_USING_IMGUI
+
+float GLCanvas3D::Slope::s_window_width;
wxDEFINE_EVENT(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS, SimpleEvent);
wxDEFINE_EVENT(EVT_GLCANVAS_OBJECT_SELECT, SimpleEvent);
@@ -1474,31 +1086,77 @@ wxDEFINE_EVENT(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED, SimpleEvent);
wxDEFINE_EVENT(EVT_GLCANVAS_UPDATE_BED_SHAPE, SimpleEvent);
wxDEFINE_EVENT(EVT_GLCANVAS_TAB, SimpleEvent);
wxDEFINE_EVENT(EVT_GLCANVAS_RESETGIZMOS, SimpleEvent);
-wxDEFINE_EVENT(EVT_GLCANVAS_MOVE_DOUBLE_SLIDER, wxKeyEvent);
+#if ENABLE_ARROW_KEYS_WITH_SLIDERS
+wxDEFINE_EVENT(EVT_GLCANVAS_MOVE_SLIDERS, wxKeyEvent);
+#else
+wxDEFINE_EVENT(EVT_GLCANVAS_MOVE_LAYERS_SLIDER, wxKeyEvent);
+#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS
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);
wxDEFINE_EVENT(EVT_GLCANVAS_RESET_LAYER_HEIGHT_PROFILE, SimpleEvent);
wxDEFINE_EVENT(EVT_GLCANVAS_ADAPTIVE_LAYER_HEIGHT_PROFILE, Event<float>);
wxDEFINE_EVENT(EVT_GLCANVAS_SMOOTH_LAYER_HEIGHT_PROFILE, HeightProfileSmoothEvent);
wxDEFINE_EVENT(EVT_GLCANVAS_RELOAD_FROM_DISK, SimpleEvent);
+wxDEFINE_EVENT(EVT_GLCANVAS_RENDER_TIMER, wxTimerEvent/*RenderTimerEvent*/);
-#if ENABLE_THUMBNAIL_GENERATOR
const double GLCanvas3D::DefaultCameraZoomToBoxMarginFactor = 1.25;
-#endif // ENABLE_THUMBNAIL_GENERATOR
-GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar)
+void GLCanvas3D::load_arrange_settings()
+{
+ std::string dist_fff_str =
+ wxGetApp().app_config->get("arrange", "min_object_distance_fff");
+
+ std::string dist_fff_seq_print_str =
+ wxGetApp().app_config->get("arrange", "min_object_distance_fff_seq_print");
+
+ std::string dist_sla_str =
+ wxGetApp().app_config->get("arrange", "min_object_distance_sla");
+
+ std::string en_rot_fff_str =
+ wxGetApp().app_config->get("arrange", "enable_rotation_fff");
+
+ std::string en_rot_fff_seqp_str =
+ wxGetApp().app_config->get("arrange", "enable_rotation_fff_seq_print");
+
+ std::string en_rot_sla_str =
+ wxGetApp().app_config->get("arrange", "enable_rotation_sla");
+
+ if (!dist_fff_str.empty())
+ m_arrange_settings_fff.distance = std::stof(dist_fff_str);
+
+ if (!dist_fff_seq_print_str.empty())
+ m_arrange_settings_fff_seq_print.distance = std::stof(dist_fff_seq_print_str);
+
+ if (!dist_sla_str.empty())
+ m_arrange_settings_sla.distance = std::stof(dist_sla_str);
+
+ if (!en_rot_fff_str.empty())
+ m_arrange_settings_fff.enable_rotation = (en_rot_fff_str == "1" || en_rot_fff_str == "yes");
+
+ if (!en_rot_fff_seqp_str.empty())
+ m_arrange_settings_fff_seq_print.enable_rotation = (en_rot_fff_seqp_str == "1" || en_rot_fff_seqp_str == "yes");
+
+ if (!en_rot_sla_str.empty())
+ m_arrange_settings_sla.enable_rotation = (en_rot_sla_str == "1" || en_rot_sla_str == "yes");
+}
+
+PrinterTechnology GLCanvas3D::current_printer_technology() const
+{
+ return m_process->current_printer_technology();
+}
+
+GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas)
: m_canvas(canvas)
, m_context(nullptr)
#if ENABLE_RETINA_GL
, m_retina_helper(nullptr)
#endif
, m_in_render(false)
- , m_bed(bed)
- , m_camera(camera)
- , m_view_toolbar(view_toolbar)
- , m_main_toolbar(GLToolbar::Normal, "Top")
- , m_undoredo_toolbar(GLToolbar::Normal, "Top")
+ , m_main_toolbar(GLToolbar::Normal, "Main")
+ , m_undoredo_toolbar(GLToolbar::Normal, "Undo_Redo")
, m_gizmos(*this)
, m_use_clipping_planes(false)
, m_sidebar_field("")
@@ -1509,7 +1167,6 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar
, m_dirty(true)
, m_initialized(false)
, m_apply_zoom_to_volumes_filter(false)
- , m_legend_texture_enabled(false)
, m_picking_enabled(false)
, m_moving_enabled(false)
, m_dynamic_background_enabled(false)
@@ -1524,16 +1181,18 @@ GLCanvas3D::GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar
#endif // ENABLE_RENDER_PICKING_PASS
, m_render_sla_auxiliaries(true)
, m_labels(*this)
+ , m_slope(*this, m_volumes)
{
if (m_canvas != nullptr) {
m_timer.SetOwner(m_canvas);
+ m_render_timer.SetOwner(m_canvas);
#if ENABLE_RETINA_GL
m_retina_helper.reset(new RetinaHelper(canvas));
- // set default view_toolbar icons size equal to GLGizmosManager::Default_Icons_Size
- m_view_toolbar.set_icons_size(GLGizmosManager::Default_Icons_Size);
-#endif
+#endif // ENABLE_RETINA_GL
}
+ load_arrange_settings();
+
m_selection.set_volumes(&m_volumes.volumes);
}
@@ -1553,7 +1212,7 @@ bool GLCanvas3D::init()
if (m_initialized)
return true;
- if ((m_canvas == nullptr) || (m_context == nullptr))
+ if (m_canvas == nullptr || m_context == nullptr)
return false;
glsafe(::glClearColor(1.0f, 1.0f, 1.0f, 1.0f));
@@ -1599,17 +1258,8 @@ bool GLCanvas3D::init()
if (m_multisample_allowed)
glsafe(::glEnable(GL_MULTISAMPLE));
- if (!m_shader.init("gouraud.vs", "gouraud.fs"))
- {
- std::cout << "Unable to initialize gouraud shader: please, check that the files gouraud.vs and gouraud.fs are available" << std::endl;
- return false;
- }
-
- if (m_main_toolbar.is_enabled() && !m_layers_editing.init("variable_layer_height.vs", "variable_layer_height.fs"))
- {
- std::cout << "Unable to initialize variable_layer_height shader: please, check that the files variable_layer_height.vs and variable_layer_height.fs are available" << std::endl;
- return false;
- }
+ if (m_main_toolbar.is_enabled())
+ m_layers_editing.init();
// on linux the gl context is not valid until the canvas is not shown on screen
// we defer the geometry finalization of volumes until the first call to render()
@@ -1644,21 +1294,21 @@ void GLCanvas3D::reset_volumes()
if (!m_initialized)
return;
+ if (m_volumes.empty())
+ return;
+
_set_current();
- if (!m_volumes.empty())
- {
- m_selection.clear();
- m_volumes.clear();
- m_dirty = true;
- }
+ m_selection.clear();
+ m_volumes.clear();
+ m_dirty = true;
_set_warning_texture(WarningTexture::ObjectOutside, false);
}
int GLCanvas3D::check_volumes_outside_state() const
{
- ModelInstance::EPrintVolumeState state;
+ ModelInstanceEPrintVolumeState state;
m_volumes.check_outside_state(m_config, &state);
return (int)state;
}
@@ -1668,6 +1318,8 @@ void GLCanvas3D::toggle_sla_auxiliaries_visibility(bool visible, const ModelObje
m_render_sla_auxiliaries = visible;
for (GLVolume* vol : m_volumes.volumes) {
+ if (vol->composite_id.object_id == 1000)
+ continue; // the wipe tower
if ((mo == nullptr || m_model->objects[vol->composite_id.object_id] == mo)
&& (instance_idx == -1 || vol->composite_id.instance_id == instance_idx)
&& vol->composite_id.volume_id < 0)
@@ -1678,10 +1330,28 @@ void GLCanvas3D::toggle_sla_auxiliaries_visibility(bool visible, const ModelObje
void GLCanvas3D::toggle_model_objects_visibility(bool visible, const ModelObject* mo, int instance_idx)
{
for (GLVolume* vol : m_volumes.volumes) {
- if ((mo == nullptr || m_model->objects[vol->composite_id.object_id] == mo)
- && (instance_idx == -1 || vol->composite_id.instance_id == instance_idx)) {
- vol->is_active = visible;
- vol->force_native_color = (instance_idx != -1);
+ if (vol->composite_id.object_id == 1000) { // wipe tower
+ vol->is_active = (visible && mo == nullptr);
+ }
+ else {
+ if ((mo == nullptr || m_model->objects[vol->composite_id.object_id] == mo)
+ && (instance_idx == -1 || vol->composite_id.instance_id == instance_idx)) {
+ vol->is_active = visible;
+
+ if (instance_idx == -1) {
+ vol->force_native_color = false;
+ vol->force_neutral_color = false;
+ } else {
+ const GLGizmosManager& gm = get_gizmos_manager();
+ auto gizmo_type = gm.get_current_type();
+ if ( (gizmo_type == GLGizmosManager::FdmSupports
+ || gizmo_type == GLGizmosManager::Seam)
+ && ! vol->is_modifier)
+ vol->force_neutral_color = true;
+ else
+ vol->force_native_color = true;
+ }
+ }
}
}
if (visible && !mo)
@@ -1697,12 +1367,10 @@ void GLCanvas3D::toggle_model_objects_visibility(bool visible, const ModelObject
void GLCanvas3D::update_instance_printable_state_for_object(const size_t obj_idx)
{
ModelObject* model_object = m_model->objects[obj_idx];
- for (int inst_idx = 0; inst_idx < (int)model_object->instances.size(); ++inst_idx)
- {
+ for (int inst_idx = 0; inst_idx < (int)model_object->instances.size(); ++inst_idx) {
ModelInstance* instance = model_object->instances[inst_idx];
- for (GLVolume* volume : m_volumes.volumes)
- {
+ for (GLVolume* volume : m_volumes.volumes) {
if ((volume->object_idx() == (int)obj_idx) && (volume->instance_idx() == inst_idx))
volume->printable = instance->printable;
}
@@ -1735,7 +1403,7 @@ void GLCanvas3D::set_model(Model* model)
void GLCanvas3D::bed_shape_changed()
{
refresh_camera_scene_box();
- m_camera.requires_zoom_to_bed = true;
+ wxGetApp().plater()->get_camera().requires_zoom_to_bed = true;
m_dirty = true;
}
@@ -1744,11 +1412,15 @@ void GLCanvas3D::set_color_by(const std::string& value)
m_color_by = value;
}
+void GLCanvas3D::refresh_camera_scene_box()
+{
+ wxGetApp().plater()->get_camera().set_scene_box(scene_bounding_box());
+}
+
BoundingBoxf3 GLCanvas3D::volumes_bounding_box() const
{
BoundingBoxf3 bb;
- for (const GLVolume* volume : m_volumes.volumes)
- {
+ for (const GLVolume* volume : m_volumes.volumes) {
if (!m_apply_zoom_to_volumes_filter || ((volume != nullptr) && volume->zoom_to_volumes))
bb.merge(volume->transformed_bounding_box());
}
@@ -1758,10 +1430,8 @@ BoundingBoxf3 GLCanvas3D::volumes_bounding_box() const
BoundingBoxf3 GLCanvas3D::scene_bounding_box() const
{
BoundingBoxf3 bb = volumes_bounding_box();
- bb.merge(m_bed.get_bounding_box(true));
-
- if (m_config != nullptr)
- {
+ bb.merge(wxGetApp().plater()->get_bed().get_bounding_box(true));
+ if (m_config != nullptr) {
double h = m_config->opt_float("max_print_height");
bb.min(2) = std::min(bb.min(2), -h);
bb.max(2) = std::max(bb.max(2), h);
@@ -1782,7 +1452,7 @@ bool GLCanvas3D::is_layers_editing_allowed() const
void GLCanvas3D::reset_layer_height_profile()
{
- wxGetApp().plater()->take_snapshot(_(L("Variable layer height - Reset")));
+ wxGetApp().plater()->take_snapshot(_L("Variable layer height - Reset"));
m_layers_editing.reset_layer_height_profile(*this);
m_layers_editing.state = LayersEditing::Completed;
m_dirty = true;
@@ -1790,7 +1460,7 @@ void GLCanvas3D::reset_layer_height_profile()
void GLCanvas3D::adaptive_layer_height_profile(float quality_factor)
{
- wxGetApp().plater()->take_snapshot(_(L("Variable layer height - Adaptive")));
+ wxGetApp().plater()->take_snapshot(_L("Variable layer height - Adaptive"));
m_layers_editing.adaptive_layer_height_profile(*this, quality_factor);
m_layers_editing.state = LayersEditing::Completed;
m_dirty = true;
@@ -1798,7 +1468,7 @@ void GLCanvas3D::adaptive_layer_height_profile(float quality_factor)
void GLCanvas3D::smooth_layer_height_profile(const HeightProfileSmoothingParams& smoothing_params)
{
- wxGetApp().plater()->take_snapshot(_(L("Variable layer height - Smooth all")));
+ wxGetApp().plater()->take_snapshot(_L("Variable layer height - Smooth all"));
m_layers_editing.smooth_layer_height_profile(*this, smoothing_params);
m_layers_editing.state = LayersEditing::Completed;
m_dirty = true;
@@ -1813,8 +1483,7 @@ void GLCanvas3D::enable_layers_editing(bool enable)
{
m_layers_editing.set_enabled(enable);
const Selection::IndicesList& idxs = m_selection.get_volume_idxs();
- for (unsigned int idx : idxs)
- {
+ for (unsigned int idx : idxs) {
GLVolume* v = m_volumes.volumes[idx];
if (v->is_modifier)
v->force_transparent = enable;
@@ -1825,7 +1494,7 @@ void GLCanvas3D::enable_layers_editing(bool enable)
void GLCanvas3D::enable_legend_texture(bool enable)
{
- m_legend_texture_enabled = enable;
+ m_gcode_viewer.enable_legend(enable);
}
void GLCanvas3D::enable_picking(bool enable)
@@ -1871,7 +1540,7 @@ void GLCanvas3D::allow_multisample(bool allow)
void GLCanvas3D::zoom_to_bed()
{
- _zoom_to_box(m_bed.get_bounding_box(false));
+ _zoom_to_box(wxGetApp().plater()->get_bed().get_bounding_box(false));
}
void GLCanvas3D::zoom_to_volumes()
@@ -1887,9 +1556,14 @@ void GLCanvas3D::zoom_to_selection()
_zoom_to_box(m_selection.get_bounding_box());
}
+void GLCanvas3D::zoom_to_gcode()
+{
+ _zoom_to_box(m_gcode_viewer.get_paths_bounding_box(), 1.05);
+}
+
void GLCanvas3D::select_view(const std::string& direction)
{
- m_camera.select_view(direction);
+ wxGetApp().plater()->get_camera().select_view(direction);
if (m_canvas != nullptr)
m_canvas->Refresh();
}
@@ -1902,8 +1576,7 @@ void GLCanvas3D::update_volumes_colors_by_extruder()
void GLCanvas3D::render()
{
- if (m_in_render)
- {
+ if (m_in_render) {
// if called recursively, return
m_dirty = true;
return;
@@ -1917,36 +1590,46 @@ void GLCanvas3D::render()
return;
// ensures this canvas is current and initialized
- if (! _is_shown_on_screen() || !_set_current() || !_3DScene::init(m_canvas))
+ if (!_is_shown_on_screen() || !_set_current() || !wxGetApp().init_opengl())
+ return;
+
+ if (!is_initialized() && !init())
return;
#if ENABLE_RENDER_STATISTICS
auto start_time = std::chrono::high_resolution_clock::now();
#endif // ENABLE_RENDER_STATISTICS
- if (m_bed.get_shape().empty())
- {
+ if (wxGetApp().plater()->get_bed().get_shape().empty()) {
// this happens at startup when no data is still saved under <>\AppData\Roaming\Slic3rPE
post_event(SimpleEvent(EVT_GLCANVAS_UPDATE_BED_SHAPE));
return;
}
+#if ENABLE_ENVIRONMENT_MAP
+ if (wxGetApp().is_editor())
+ wxGetApp().plater()->init_environment_texture();
+#endif // ENABLE_ENVIRONMENT_MAP
+
+ m_render_timer.Stop();
+ m_extra_frame_requested_delayed = std::numeric_limits<int>::max();
+
const Size& cnv_size = get_canvas_size();
// Probably due to different order of events on Linux/GTK2, when one switched from 3D scene
// to preview, this was called before canvas had its final size. It reported zero width
// and the viewport was set incorrectly, leading to tripping glAsserts further down
// the road (in apply_projection). That's why the minimum size is forced to 10.
- m_camera.apply_viewport(0, 0, std::max(10u, (unsigned int)cnv_size.get_width()), std::max(10u, (unsigned int)cnv_size.get_height()));
+ Camera& camera = wxGetApp().plater()->get_camera();
+ camera.apply_viewport(0, 0, std::max(10u, (unsigned int)cnv_size.get_width()), std::max(10u, (unsigned int)cnv_size.get_height()));
- if (m_camera.requires_zoom_to_bed)
- {
+ if (camera.requires_zoom_to_bed) {
zoom_to_bed();
_resize((unsigned int)cnv_size.get_width(), (unsigned int)cnv_size.get_height());
- m_camera.requires_zoom_to_bed = false;
+ camera.requires_zoom_to_bed = false;
}
- m_camera.apply_view_matrix();
- m_camera.apply_projection(_max_bounding_box(true, true));
+ camera.apply_view_matrix();
+ camera.apply_projection(_max_bounding_box(true, true));
GLfloat position_cam[4] = { 1.0f, 0.0f, 1.0f, 0.0f };
glsafe(::glLightfv(GL_LIGHT1, GL_POSITION, position_cam));
@@ -1955,8 +1638,7 @@ void GLCanvas3D::render()
wxGetApp().imgui()->new_frame();
- if (m_picking_enabled)
- {
+ if (m_picking_enabled) {
if (m_rectangle_selection.is_dragging())
// picking pass using rectangle selection
_rectangular_selection_picking_pass();
@@ -1966,17 +1648,18 @@ void GLCanvas3D::render()
}
#if ENABLE_RENDER_PICKING_PASS
- if (!m_picking_enabled || !m_show_picking_texture)
- {
+ if (!m_picking_enabled || !m_show_picking_texture) {
#endif // ENABLE_RENDER_PICKING_PASS
// draw scene
glsafe(::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT));
_render_background();
_render_objects();
+ if (!m_main_toolbar.is_enabled())
+ _render_gcode();
_render_sla_slices();
_render_selection();
- _render_bed(!m_camera.is_looking_downward(), true);
+ _render_bed(!camera.is_looking_downward(), true);
#if ENABLE_RENDER_SELECTION_CENTER
_render_selection_center();
@@ -1985,7 +1668,8 @@ void GLCanvas3D::render()
// we need to set the mouse's scene position here because the depth buffer
// could be invalidated by the following gizmo render methods
// this position is used later into on_mouse() to drag the objects
- m_mouse.scene_position = _mouse_to_3d(m_mouse.position.cast<int>());
+ if (m_picking_enabled)
+ m_mouse.scene_position = _mouse_to_3d(m_mouse.position.cast<coord_t>());
_render_current_gizmo();
_render_selection_sidebar_hints();
@@ -2004,34 +1688,38 @@ void GLCanvas3D::render()
_render_overlays();
#if ENABLE_RENDER_STATISTICS
- ImGuiWrapper& imgui = *wxGetApp().imgui();
- imgui.begin(std::string("Render statistics"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse);
- imgui.text("Last frame: ");
- ImGui::SameLine();
- imgui.text(std::to_string(m_render_stats.last_frame));
- ImGui::SameLine();
- imgui.text(" ms");
- ImGui::Separator();
- imgui.text("Compressed textures: ");
- ImGui::SameLine();
- imgui.text(GLCanvas3DManager::are_compressed_textures_supported() ? "supported" : "not supported");
- imgui.text("Max texture size: ");
- ImGui::SameLine();
- imgui.text(std::to_string(GLCanvas3DManager::get_gl_info().get_max_tex_size()));
- imgui.end();
+ if (wxGetApp().plater()->is_render_statistic_dialog_visible()) {
+ ImGuiWrapper& imgui = *wxGetApp().imgui();
+ imgui.begin(std::string("Render statistics"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse);
+ imgui.text("Last frame:");
+ ImGui::SameLine();
+ int64_t average = m_render_stats.get_average();
+ imgui.text(std::to_string(average));
+ ImGui::SameLine();
+ imgui.text("ms");
+ imgui.text("FPS:");
+ ImGui::SameLine();
+ imgui.text(std::to_string((average == 0) ? 0 : static_cast<int>(1000.0f / static_cast<float>(average))));
+ ImGui::Separator();
+ imgui.text("Compressed textures:");
+ ImGui::SameLine();
+ imgui.text(OpenGLManager::are_compressed_textures_supported() ? "supported" : "not supported");
+ imgui.text("Max texture size:");
+ ImGui::SameLine();
+ imgui.text(std::to_string(OpenGLManager::get_gl_info().get_max_tex_size()));
+ imgui.end();
+ }
#endif // ENABLE_RENDER_STATISTICS
#if ENABLE_CAMERA_STATISTICS
- m_camera.debug_render();
+ camera.debug_render();
#endif // ENABLE_CAMERA_STATISTICS
-#if ENABLE_CANVAS_TOOLTIP_USING_IMGUI
std::string tooltip;
// Negative coordinate means out of the window, likely because the window was deactivated.
// In that case the tooltip should be hidden.
- if (m_mouse.position.x() >= 0. && m_mouse.position.y() >= 0.)
- {
+ if (m_mouse.position.x() >= 0. && m_mouse.position.y() >= 0.) {
if (tooltip.empty())
tooltip = m_layers_editing.get_tooltip(*this);
@@ -2045,19 +1733,19 @@ void GLCanvas3D::render()
tooltip = m_undoredo_toolbar.get_tooltip();
if (tooltip.empty())
- tooltip = m_view_toolbar.get_tooltip();
- }
+ tooltip = wxGetApp().plater()->get_collapse_toolbar().get_tooltip();
+
+ if (tooltip.empty())
+ tooltip = wxGetApp().plater()->get_view_toolbar().get_tooltip();
+ }
set_tooltip(tooltip);
-#if ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
- m_tooltip.render(m_mouse.position, *this);
-#else
- m_tooltip.render(m_mouse.position);
-#endif // ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
-#endif // ENABLE_CANVAS_TOOLTIP_USING_IMGUI
+ if (m_tooltip_enabled)
+ m_tooltip.render(m_mouse.position, *this);
wxGetApp().plater()->get_mouse3d_controller().render_settings_dialog(*this);
+ wxGetApp().plater()->get_notification_manager()->render_notifications(get_overlay_window_width());
wxGetApp().imgui()->render();
@@ -2065,42 +1753,19 @@ void GLCanvas3D::render()
#if ENABLE_RENDER_STATISTICS
auto end_time = std::chrono::high_resolution_clock::now();
- m_render_stats.last_frame = std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time).count();
+ m_render_stats.add_frame(std::chrono::duration_cast<std::chrono::milliseconds>(end_time - start_time).count());
#endif // ENABLE_RENDER_STATISTICS
-
-#if !ENABLE_CANVAS_TOOLTIP_USING_IMGUI
- std::string tooltip = "";
-
- if (tooltip.empty())
- tooltip = m_layers_editing.get_tooltip(*this);
-
- if (tooltip.empty())
- tooltip = m_gizmos.get_tooltip();
-
- if (tooltip.empty())
- tooltip = m_main_toolbar.get_tooltip();
-
- if (tooltip.empty())
- tooltip = m_undoredo_toolbar.get_tooltip();
-
- if (tooltip.empty())
- tooltip = m_view_toolbar.get_tooltip();
-
- set_tooltip(tooltip);
-#endif // !ENABLE_CANVAS_TOOLTIP_USING_IMGUI
}
-#if ENABLE_THUMBNAIL_GENERATOR
void GLCanvas3D::render_thumbnail(ThumbnailData& thumbnail_data, unsigned int w, unsigned int h, bool printable_only, bool parts_only, bool show_bed, bool transparent_background) const
{
- switch (GLCanvas3DManager::get_framebuffers_type())
+ switch (OpenGLManager::get_framebuffers_type())
{
- case GLCanvas3DManager::FB_Arb: { _render_thumbnail_framebuffer(thumbnail_data, w, h, printable_only, parts_only, show_bed, transparent_background); break; }
- case GLCanvas3DManager::FB_Ext: { _render_thumbnail_framebuffer_ext(thumbnail_data, w, h, printable_only, parts_only, show_bed, transparent_background); break; }
+ case OpenGLManager::EFramebufferType::Arb: { _render_thumbnail_framebuffer(thumbnail_data, w, h, printable_only, parts_only, show_bed, transparent_background); break; }
+ case OpenGLManager::EFramebufferType::Ext: { _render_thumbnail_framebuffer_ext(thumbnail_data, w, h, printable_only, parts_only, show_bed, transparent_background); break; }
default: { _render_thumbnail_legacy(thumbnail_data, w, h, printable_only, parts_only, show_bed, transparent_background); break; }
}
}
-#endif // ENABLE_THUMBNAIL_GENERATOR
void GLCanvas3D::select_all()
{
@@ -2127,10 +1792,8 @@ void GLCanvas3D::ensure_on_bed(unsigned int object_idx)
typedef std::map<std::pair<int, int>, double> InstancesToZMap;
InstancesToZMap instances_min_z;
- for (GLVolume* volume : m_volumes.volumes)
- {
- if ((volume->object_idx() == (int)object_idx) && !volume->is_modifier)
- {
+ for (GLVolume* volume : m_volumes.volumes) {
+ if (volume->object_idx() == (int)object_idx && !volume->is_modifier) {
double min_z = volume->transformed_convex_hull_bounding_box().min(2);
std::pair<int, int> instance = std::make_pair(volume->object_idx(), volume->instance_idx());
InstancesToZMap::iterator it = instances_min_z.find(instance);
@@ -2141,8 +1804,7 @@ void GLCanvas3D::ensure_on_bed(unsigned int object_idx)
}
}
- for (GLVolume* volume : m_volumes.volumes)
- {
+ for (GLVolume* volume : m_volumes.volumes) {
std::pair<int, int> instance = std::make_pair(volume->object_idx(), volume->instance_idx());
InstancesToZMap::iterator it = instances_min_z.find(instance);
if (it != instances_min_z.end())
@@ -2150,22 +1812,47 @@ void GLCanvas3D::ensure_on_bed(unsigned int object_idx)
}
}
-std::vector<double> GLCanvas3D::get_current_print_zs(bool active_only) const
+
+const std::vector<double>& GLCanvas3D::get_gcode_layers_zs() const
+{
+ return m_gcode_viewer.get_layers_zs();
+}
+
+std::vector<double> GLCanvas3D::get_volumes_print_zs(bool active_only) const
{
return m_volumes.get_current_print_zs(active_only);
}
-void GLCanvas3D::set_toolpaths_range(double low, double high)
+void GLCanvas3D::set_gcode_options_visibility_from_flags(unsigned int flags)
+{
+ m_gcode_viewer.set_options_visibility_from_flags(flags);
+}
+
+void GLCanvas3D::set_toolpath_role_visibility_flags(unsigned int flags)
+{
+ m_gcode_viewer.set_toolpath_role_visibility_flags(flags);
+}
+
+void GLCanvas3D::set_toolpath_view_type(GCodeViewer::EViewType type)
{
- m_volumes.set_range(low, high);
+ m_gcode_viewer.set_view_type(type);
+}
+
+void GLCanvas3D::set_volumes_z_range(const std::array<double, 2>& range)
+{
+ m_volumes.set_range(range[0] - 1e-6, range[1] + 1e-6);
+}
+
+void GLCanvas3D::set_toolpaths_z_range(const std::array<unsigned int, 2>& range)
+{
+ if (m_gcode_viewer.has_data())
+ m_gcode_viewer.set_layers_z_range(range);
}
std::vector<int> GLCanvas3D::load_object(const ModelObject& model_object, int obj_idx, std::vector<int> instance_idxs)
{
- if (instance_idxs.empty())
- {
- for (unsigned int i = 0; i < model_object.instances.size(); ++i)
- {
+ if (instance_idxs.empty()) {
+ for (unsigned int i = 0; i < model_object.instances.size(); ++i) {
instance_idxs.emplace_back(i);
}
}
@@ -2174,8 +1861,7 @@ std::vector<int> GLCanvas3D::load_object(const ModelObject& model_object, int ob
std::vector<int> GLCanvas3D::load_object(const Model& model, int obj_idx)
{
- if ((0 <= obj_idx) && (obj_idx < (int)model.objects.size()))
- {
+ if (0 <= obj_idx && obj_idx < (int)model.objects.size()) {
const ModelObject* model_object = model.objects[obj_idx];
if (model_object != nullptr)
return load_object(*model_object, obj_idx, std::vector<int>());
@@ -2199,11 +1885,13 @@ void GLCanvas3D::mirror_selection(Axis axis)
// 5) Out of bed collision status & message overlay (texture)
void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_refresh)
{
- if ((m_canvas == nullptr) || (m_config == nullptr) || (m_model == nullptr))
+ if (m_canvas == nullptr || m_config == nullptr || m_model == nullptr)
return;
- if (m_initialized)
- _set_current();
+ if (!m_initialized)
+ return;
+
+ _set_current();
struct ModelVolumeState {
ModelVolumeState(const GLVolume* volume) :
@@ -2446,11 +2134,19 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re
TriangleMesh mesh = print_object->get_mesh(slaposDrillHoles);
assert(! mesh.empty());
mesh.transform(sla_print->sla_trafo(*m_model->objects[volume.object_idx()]).inverse());
+#if ENABLE_SMOOTH_NORMALS
+ volume.indexed_vertex_array.load_mesh(mesh, true);
+#else
volume.indexed_vertex_array.load_mesh(mesh);
- } else {
+#endif // ENABLE_SMOOTH_NORMALS
+ } else {
// Reload the original volume.
+#if ENABLE_SMOOTH_NORMALS
+ volume.indexed_vertex_array.load_mesh(m_model->objects[volume.object_idx()]->volumes[volume.volume_idx()]->mesh(), true);
+#else
volume.indexed_vertex_array.load_mesh(m_model->objects[volume.object_idx()]->volumes[volume.volume_idx()]->mesh());
- }
+#endif // ENABLE_SMOOTH_NORMALS
+ }
volume.finalize_geometry(true);
}
//FIXME it is an ugly hack to write the timestamp into the "offsets" field to not have to add another member variable
@@ -2488,16 +2184,14 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re
volume->set_sla_shift_z(shift_zs[volume->object_idx()]);
}
- if (printer_technology == ptFFF && m_config->has("nozzle_diameter"))
- {
+ if (printer_technology == ptFFF && m_config->has("nozzle_diameter")) {
// Should the wipe tower be visualized ?
unsigned int extruders_count = (unsigned int)dynamic_cast<const ConfigOptionFloats*>(m_config->option("nozzle_diameter"))->values.size();
bool wt = dynamic_cast<const ConfigOptionBool*>(m_config->option("wipe_tower"))->value;
bool co = dynamic_cast<const ConfigOptionBool*>(m_config->option("complete_objects"))->value;
- if ((extruders_count > 1) && wt && !co)
- {
+ if ((extruders_count > 1) && wt && !co) {
// Height of a print (Show at least a slab)
double height = std::max(m_model->bounding_box().max(2), 10.0);
@@ -2538,29 +2232,29 @@ void GLCanvas3D::reload_scene(bool refresh_immediately, bool force_full_scene_re
post_event(SimpleEvent(EVT_GLCANVAS_OBJECT_SELECT));
// checks for geometry outside the print volume to render it accordingly
- if (!m_volumes.empty())
- {
- ModelInstance::EPrintVolumeState state;
+ if (!m_volumes.empty()) {
+ ModelInstanceEPrintVolumeState state;
const bool contained_min_one = m_volumes.check_outside_state(m_config, &state);
- _set_warning_texture(WarningTexture::ObjectClashed, state == ModelInstance::PVS_Partly_Outside);
- _set_warning_texture(WarningTexture::ObjectOutside, state == ModelInstance::PVS_Fully_Outside);
+ _set_warning_texture(WarningTexture::ObjectClashed, state == ModelInstancePVS_Partly_Outside);
+ _set_warning_texture(WarningTexture::ObjectOutside, state == ModelInstancePVS_Fully_Outside);
+ if(printer_technology != ptSLA || state == ModelInstancePVS_Inside)
+ _set_warning_texture(WarningTexture::SlaSupportsOutside, false);
post_event(Event<bool>(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS,
- contained_min_one && !m_model->objects.empty() && state != ModelInstance::PVS_Partly_Outside));
+ contained_min_one && !m_model->objects.empty() && state != ModelInstancePVS_Partly_Outside));
}
- else
- {
+ else {
_set_warning_texture(WarningTexture::ObjectOutside, false);
_set_warning_texture(WarningTexture::ObjectClashed, false);
+ _set_warning_texture(WarningTexture::SlaSupportsOutside, false);
post_event(Event<bool>(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, false));
}
refresh_camera_scene_box();
- if (m_selection.is_empty())
- {
+ if (m_selection.is_empty()) {
// If no object is selected, deactivate the active gizmo, if any
// Otherwise it may be shown after cleaning the scene (if it was active while the objects were deleted)
m_gizmos.reset_all_states();
@@ -2591,111 +2285,36 @@ static void reserve_new_volume_finalize_old_volume(GLVolume& vol_new, GLVolume&
vol_old.finalize_geometry(gl_initialized);
}
-static void load_gcode_retractions(const GCodePreviewData::Retraction& retractions, GLCanvas3D::GCodePreviewVolumeIndex::EType extrusion_type, GLVolumeCollection &volumes, GLCanvas3D::GCodePreviewVolumeIndex &volume_index, bool gl_initialized)
+void GLCanvas3D::load_gcode_preview(const GCodeProcessor::Result& gcode_result)
{
- // nothing to render, return
- if (retractions.positions.empty())
- return;
-
- volume_index.first_volumes.emplace_back(extrusion_type, 0, (unsigned int)volumes.volumes.size());
-
- GLVolume *volume = volumes.new_nontoolpath_volume(retractions.color.rgba.data(), VERTEX_BUFFER_RESERVE_SIZE);
+ m_gcode_viewer.load(gcode_result, *this->fff_print(), m_initialized);
- GCodePreviewData::Retraction::PositionsList copy(retractions.positions);
- std::sort(copy.begin(), copy.end(), [](const GCodePreviewData::Retraction::Position& p1, const GCodePreviewData::Retraction::Position& p2) { return p1.position(2) < p2.position(2); });
-
- for (const GCodePreviewData::Retraction::Position& position : copy)
- {
- volume->print_zs.emplace_back(unscale<double>(position.position(2)));
- volume->offsets.emplace_back(volume->indexed_vertex_array.quad_indices.size());
- volume->offsets.emplace_back(volume->indexed_vertex_array.triangle_indices.size());
-
- _3DScene::point3_to_verts(position.position, position.width, position.height, *volume);
-
- // Ensure that no volume grows over the limits. If the volume is too large, allocate a new one.
- if (volume->indexed_vertex_array.vertices_and_normals_interleaved.size() > MAX_VERTEX_BUFFER_SIZE) {
- GLVolume &vol = *volume;
- volume = volumes.new_nontoolpath_volume(vol.color);
- reserve_new_volume_finalize_old_volume(*volume, vol, gl_initialized);
- }
- }
- volume->indexed_vertex_array.finalize_geometry(gl_initialized);
+ if (wxGetApp().is_editor()) {
+ m_gcode_viewer.update_shells_color_by_extruder(m_config);
+ _show_warning_texture_if_needed(WarningTexture::ToolpathOutside);
+ }
}
-void GLCanvas3D::load_gcode_preview(const GCodePreviewData& preview_data, const std::vector<std::string>& str_tool_colors)
+void GLCanvas3D::refresh_gcode_preview(const GCodeProcessor::Result& gcode_result, const std::vector<std::string>& str_tool_colors)
{
- const Print *print = this->fff_print();
- if ((m_canvas != nullptr) && (print != nullptr))
- {
- _set_current();
-
- std::vector<float> tool_colors = _parse_colors(str_tool_colors);
-
- if (m_volumes.empty())
- {
- m_gcode_preview_volume_index.reset();
-
- _load_gcode_extrusion_paths(preview_data, tool_colors);
- _load_gcode_travel_paths(preview_data, tool_colors);
- load_gcode_retractions(preview_data.retraction, GCodePreviewVolumeIndex::Retraction, m_volumes, m_gcode_preview_volume_index, m_initialized);
- load_gcode_retractions(preview_data.unretraction, GCodePreviewVolumeIndex::Unretraction, m_volumes, m_gcode_preview_volume_index, m_initialized);
-
- if (!m_volumes.empty())
- {
- // Remove empty volumes from both m_volumes, update m_gcode_preview_volume_index.
- {
- size_t idx_volume_src = 0;
- size_t idx_volume_dst = 0;
- size_t idx_volume_index_src = 0;
- size_t idx_volume_index_dst = 0;
- size_t idx_volume_of_this_type_last = (idx_volume_index_src + 1 == m_gcode_preview_volume_index.first_volumes.size()) ? m_volumes.volumes.size() : m_gcode_preview_volume_index.first_volumes[idx_volume_index_src + 1].id;
- size_t idx_volume_of_this_type_first_new = 0;
- for (;;) {
- if (idx_volume_src == idx_volume_of_this_type_last) {
- if (idx_volume_of_this_type_first_new < idx_volume_dst) {
- // There are some volumes of this type left, therefore their entry in the index has to be maintained.
- if (idx_volume_index_dst < idx_volume_index_src)
- m_gcode_preview_volume_index.first_volumes[idx_volume_index_dst] = m_gcode_preview_volume_index.first_volumes[idx_volume_index_src];
- m_gcode_preview_volume_index.first_volumes[idx_volume_index_dst].id = idx_volume_of_this_type_first_new;
- ++ idx_volume_index_dst;
- }
- if (idx_volume_of_this_type_last == m_volumes.volumes.size())
- break;
- ++ idx_volume_index_src;
- idx_volume_of_this_type_last = (idx_volume_index_src + 1 == m_gcode_preview_volume_index.first_volumes.size()) ? m_volumes.volumes.size() : m_gcode_preview_volume_index.first_volumes[idx_volume_index_src + 1].id;
- idx_volume_of_this_type_first_new = idx_volume_dst;
- if (idx_volume_src == idx_volume_of_this_type_last)
- // Empty sequence of volumes for the current index item.
- continue;
- }
- if (! m_volumes.volumes[idx_volume_src]->print_zs.empty())
- m_volumes.volumes[idx_volume_dst ++] = m_volumes.volumes[idx_volume_src];
- ++ idx_volume_src;
- }
- m_volumes.volumes.erase(m_volumes.volumes.begin() + idx_volume_dst, m_volumes.volumes.end());
- m_gcode_preview_volume_index.first_volumes.erase(m_gcode_preview_volume_index.first_volumes.begin() + idx_volume_index_dst, m_gcode_preview_volume_index.first_volumes.end());
- }
-
- _load_fff_shells();
- }
- _update_toolpath_volumes_outside_state();
- }
-
- _update_gcode_volumes_visibility(preview_data);
- _show_warning_texture_if_needed(WarningTexture::ToolpathOutside);
+ m_gcode_viewer.refresh(gcode_result, str_tool_colors);
+ set_as_dirty();
+ request_extra_frame();
+}
- if (m_volumes.empty())
- reset_legend_texture();
- else
- _generate_legend_texture(preview_data, tool_colors);
- }
+#if ENABLE_RENDER_PATH_REFRESH_AFTER_OPTIONS_CHANGE
+void GLCanvas3D::refresh_gcode_preview_render_paths()
+{
+ m_gcode_viewer.refresh_render_paths();
+ set_as_dirty();
+ request_extra_frame();
}
+#endif // ENABLE_RENDER_PATH_REFRESH_AFTER_OPTIONS_CHANGE
void GLCanvas3D::load_sla_preview()
{
const SLAPrint* print = this->sla_print();
- if ((m_canvas != nullptr) && (print != nullptr))
- {
+ if (m_canvas != nullptr && print != nullptr) {
_set_current();
// Release OpenGL data before generating new data.
this->reset_volumes();
@@ -2723,20 +2342,11 @@ void GLCanvas3D::load_preview(const std::vector<std::string>& str_tool_colors, c
_update_toolpath_volumes_outside_state();
_show_warning_texture_if_needed(WarningTexture::ToolpathOutside);
- if (color_print_values.empty())
- reset_legend_texture();
- else {
- auto preview_data = GCodePreviewData();
- preview_data.extrusion.view_type = GCodePreviewData::Extrusion::ColorPrint;
- const std::vector<float> tool_colors = _parse_colors(str_tool_colors);
- _generate_legend_texture(preview_data, tool_colors);
- }
}
void GLCanvas3D::bind_event_handlers()
{
- if (m_canvas != nullptr)
- {
+ if (m_canvas != nullptr) {
m_canvas->Bind(wxEVT_SIZE, &GLCanvas3D::on_size, this);
m_canvas->Bind(wxEVT_IDLE, &GLCanvas3D::on_idle, this);
m_canvas->Bind(wxEVT_CHAR, &GLCanvas3D::on_char, this);
@@ -2744,6 +2354,7 @@ void GLCanvas3D::bind_event_handlers()
m_canvas->Bind(wxEVT_KEY_UP, &GLCanvas3D::on_key, this);
m_canvas->Bind(wxEVT_MOUSEWHEEL, &GLCanvas3D::on_mouse_wheel, this);
m_canvas->Bind(wxEVT_TIMER, &GLCanvas3D::on_timer, this);
+ m_canvas->Bind(EVT_GLCANVAS_RENDER_TIMER, &GLCanvas3D::on_render_timer, this);
m_canvas->Bind(wxEVT_LEFT_DOWN, &GLCanvas3D::on_mouse, this);
m_canvas->Bind(wxEVT_LEFT_UP, &GLCanvas3D::on_mouse, this);
m_canvas->Bind(wxEVT_MIDDLE_DOWN, &GLCanvas3D::on_mouse, this);
@@ -2757,13 +2368,15 @@ void GLCanvas3D::bind_event_handlers()
m_canvas->Bind(wxEVT_MIDDLE_DCLICK, &GLCanvas3D::on_mouse, this);
m_canvas->Bind(wxEVT_RIGHT_DCLICK, &GLCanvas3D::on_mouse, this);
m_canvas->Bind(wxEVT_PAINT, &GLCanvas3D::on_paint, this);
+ m_canvas->Bind(wxEVT_SET_FOCUS, &GLCanvas3D::on_set_focus, this);
+
+ m_event_handlers_bound = true;
}
}
void GLCanvas3D::unbind_event_handlers()
{
- if (m_canvas != nullptr)
- {
+ if (m_canvas != nullptr && m_event_handlers_bound) {
m_canvas->Unbind(wxEVT_SIZE, &GLCanvas3D::on_size, this);
m_canvas->Unbind(wxEVT_IDLE, &GLCanvas3D::on_idle, this);
m_canvas->Unbind(wxEVT_CHAR, &GLCanvas3D::on_char, this);
@@ -2771,6 +2384,7 @@ void GLCanvas3D::unbind_event_handlers()
m_canvas->Unbind(wxEVT_KEY_UP, &GLCanvas3D::on_key, this);
m_canvas->Unbind(wxEVT_MOUSEWHEEL, &GLCanvas3D::on_mouse_wheel, this);
m_canvas->Unbind(wxEVT_TIMER, &GLCanvas3D::on_timer, this);
+ m_canvas->Unbind(EVT_GLCANVAS_RENDER_TIMER, &GLCanvas3D::on_render_timer, this);
m_canvas->Unbind(wxEVT_LEFT_DOWN, &GLCanvas3D::on_mouse, this);
m_canvas->Unbind(wxEVT_LEFT_UP, &GLCanvas3D::on_mouse, this);
m_canvas->Unbind(wxEVT_MIDDLE_DOWN, &GLCanvas3D::on_mouse, this);
@@ -2784,6 +2398,9 @@ void GLCanvas3D::unbind_event_handlers()
m_canvas->Unbind(wxEVT_MIDDLE_DCLICK, &GLCanvas3D::on_mouse, this);
m_canvas->Unbind(wxEVT_RIGHT_DCLICK, &GLCanvas3D::on_mouse, this);
m_canvas->Unbind(wxEVT_PAINT, &GLCanvas3D::on_paint, this);
+ m_canvas->Unbind(wxEVT_SET_FOCUS, &GLCanvas3D::on_set_focus, this);
+
+ m_event_handlers_bound = false;
}
}
@@ -2791,25 +2408,39 @@ void GLCanvas3D::on_size(wxSizeEvent& evt)
{
m_dirty = true;
}
-
+
void GLCanvas3D::on_idle(wxIdleEvent& evt)
{
if (!m_initialized)
return;
-
+#if ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+ /*NotificationManager* notification_mgr = wxGetApp().plater()->get_notification_manager();
+ if (notification_mgr->requires_update())
+ notification_mgr->update_notifications();
+
+ m_dirty |= notification_mgr->requires_render();*/
+#endif // ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+ // FIXME
m_dirty |= m_main_toolbar.update_items_state();
m_dirty |= m_undoredo_toolbar.update_items_state();
- m_dirty |= m_view_toolbar.update_items_state();
- bool mouse3d_controller_applied = wxGetApp().plater()->get_mouse3d_controller().apply(m_camera);
+ m_dirty |= wxGetApp().plater()->get_view_toolbar().update_items_state();
+ m_dirty |= wxGetApp().plater()->get_collapse_toolbar().update_items_state();
+ bool mouse3d_controller_applied = wxGetApp().plater()->get_mouse3d_controller().apply(wxGetApp().plater()->get_camera());
m_dirty |= mouse3d_controller_applied;
+#if ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+ /*
+ if (notification_mgr->requires_update()) {
+ evt.RequestMore();
+ }*/
+#endif // ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+
if (!m_dirty)
return;
_refresh_if_shown_on_screen();
- if (m_extra_frame_requested || mouse3d_controller_applied)
- {
+ if (m_extra_frame_requested || mouse3d_controller_applied) {
m_dirty = true;
m_extra_frame_requested = false;
evt.RequestMore();
@@ -2826,6 +2457,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)) {
@@ -2833,16 +2465,14 @@ void GLCanvas3D::on_char(wxKeyEvent& evt)
return;
}
- if ((keyCode == WXK_ESCAPE) && _deactivate_undo_redo_toolbar_items())
+ if (keyCode == WXK_ESCAPE && (_deactivate_undo_redo_toolbar_items() || _deactivate_search_toolbar_item() || _deactivate_arrange_menu()))
return;
if (m_gizmos.on_char(evt))
return;
-//#ifdef __APPLE__
-// ctrlMask |= wxMOD_RAW_CONTROL;
-//#endif /* __APPLE__ */
if ((evt.GetModifiers() & ctrlMask) != 0) {
+ // CTRL is pressed
switch (keyCode) {
#ifdef __APPLE__
case 'a':
@@ -2850,7 +2480,7 @@ void GLCanvas3D::on_char(wxKeyEvent& evt)
#else /* __APPLE__ */
case WXK_CONTROL_A:
#endif /* __APPLE__ */
- post_event(SimpleEvent(EVT_GLCANVAS_SELECT_ALL));
+ post_event(SimpleEvent(EVT_GLCANVAS_SELECT_ALL));
break;
#ifdef __APPLE__
case 'c':
@@ -2861,18 +2491,36 @@ void GLCanvas3D::on_char(wxKeyEvent& evt)
post_event(SimpleEvent(EVT_GLTOOLBAR_COPY));
break;
+#if ENABLE_CTRL_M_ON_WINDOWS
#ifdef __APPLE__
case 'm':
case 'M':
#else /* __APPLE__ */
case WXK_CONTROL_M:
#endif /* __APPLE__ */
- {
+ {
+#ifdef _WIN32
+ if (wxGetApp().app_config->get("use_legacy_3DConnexion") == "1") {
+#endif //_WIN32
Mouse3DController& controller = wxGetApp().plater()->get_mouse3d_controller();
controller.show_settings_dialog(!controller.is_settings_dialog_shown());
m_dirty = true;
- break;
+#ifdef _WIN32
}
+#endif //_WIN32
+ break;
+ }
+#else
+#if defined(__linux__) || defined(__APPLE__)
+ case WXK_CONTROL_M:
+ {
+ Mouse3DController& controller = wxGetApp().plater()->get_mouse3d_controller();
+ controller.show_settings_dialog(!controller.is_settings_dialog_shown());
+ m_dirty = true;
+ break;
+ }
+#endif /* __linux__ */
+#endif // ENABLE_CTRL_M_ON_WINDOWS
#ifdef __APPLE__
case 'v':
@@ -2885,6 +2533,16 @@ void GLCanvas3D::on_char(wxKeyEvent& evt)
#ifdef __APPLE__
+ case 'f':
+ case 'F':
+#else /* __APPLE__ */
+ case WXK_CONTROL_F:
+#endif /* __APPLE__ */
+ _activate_search_toolbar_item();
+ break;
+
+
+#ifdef __APPLE__
case 'y':
case 'Y':
#else /* __APPLE__ */
@@ -2904,19 +2562,20 @@ void GLCanvas3D::on_char(wxKeyEvent& evt)
case WXK_BACK:
case WXK_DELETE:
post_event(SimpleEvent(EVT_GLTOOLBAR_DELETE_ALL)); break;
- default: evt.Skip();
+ default: evt.Skip();
}
- } else if (evt.HasModifiers()) {
- evt.Skip();
} else {
switch (keyCode)
{
case WXK_BACK:
- case WXK_DELETE:
- post_event(SimpleEvent(EVT_GLTOOLBAR_DELETE));
- break;
+ case WXK_DELETE: { post_event(SimpleEvent(EVT_GLTOOLBAR_DELETE)); break; }
case WXK_ESCAPE: { deselect_all(); break; }
- case WXK_F5: { post_event(SimpleEvent(EVT_GLCANVAS_RELOAD_FROM_DISK)); break; }
+ case WXK_F5: {
+ if ((wxGetApp().is_editor() && !wxGetApp().plater()->model().objects.empty()) ||
+ (wxGetApp().is_gcode_viewer() && !wxGetApp().plater()->get_last_loaded_gcode().empty()))
+ post_event(SimpleEvent(EVT_GLCANVAS_RELOAD_FROM_DISK));
+ break;
+ }
case '0': { select_view("iso"); break; }
case '1': { select_view("top"); break; }
case '2': { select_view("bottom"); break; }
@@ -2924,18 +2583,20 @@ void GLCanvas3D::on_char(wxKeyEvent& evt)
case '4': { select_view("rear"); break; }
case '5': { select_view("left"); break; }
case '6': { select_view("right"); break; }
- case '+': {
- if (dynamic_cast<Preview*>(m_canvas->GetParent()) != nullptr)
- post_event(wxKeyEvent(EVT_GLCANVAS_EDIT_COLOR_CHANGE, evt));
- else
- post_event(Event<int>(EVT_GLCANVAS_INCREASE_INSTANCES, +1));
- break; }
- case '-': {
- if (dynamic_cast<Preview*>(m_canvas->GetParent()) != nullptr)
- post_event(wxKeyEvent(EVT_GLCANVAS_EDIT_COLOR_CHANGE, evt));
- else
- post_event(Event<int>(EVT_GLCANVAS_INCREASE_INSTANCES, -1));
- break; }
+ case '+': {
+ if (dynamic_cast<Preview*>(m_canvas->GetParent()) != nullptr)
+ post_event(wxKeyEvent(EVT_GLCANVAS_EDIT_COLOR_CHANGE, evt));
+ else
+ post_event(Event<int>(EVT_GLCANVAS_INCREASE_INSTANCES, +1));
+ break;
+ }
+ case '-': {
+ if (dynamic_cast<Preview*>(m_canvas->GetParent()) != nullptr)
+ post_event(wxKeyEvent(EVT_GLCANVAS_EDIT_COLOR_CHANGE, evt));
+ else
+ post_event(Event<int>(EVT_GLCANVAS_INCREASE_INSTANCES, -1));
+ break;
+ }
case '?': { post_event(SimpleEvent(EVT_GLCANVAS_QUESTION_MARK)); break; }
case 'A':
case 'a': { post_event(SimpleEvent(EVT_GLCANVAS_ARRANGE)); break; }
@@ -2943,22 +2604,49 @@ void GLCanvas3D::on_char(wxKeyEvent& evt)
case 'b': { zoom_to_bed(); break; }
case 'E':
case 'e': { m_labels.show(!m_labels.is_shown()); m_dirty = true; break; }
+ case 'G':
+ case 'g': {
+ if ((evt.GetModifiers() & shiftMask) != 0) {
+ if (dynamic_cast<Preview*>(m_canvas->GetParent()) != nullptr)
+ post_event(wxKeyEvent(EVT_GLCANVAS_JUMP_TO, evt));
+ }
+ break;
+ }
case 'I':
case 'i': { _update_camera_zoom(1.0); break; }
case 'K':
- case 'k': { m_camera.select_next_type(); m_dirty = true; break; }
+ case 'k': { wxGetApp().plater()->get_camera().select_next_type(); m_dirty = true; break; }
+ case 'L':
+ case 'l': {
+ if (!m_main_toolbar.is_enabled()) {
+ m_gcode_viewer.enable_legend(!m_gcode_viewer.is_legend_enabled());
+ m_dirty = true;
+ wxGetApp().plater()->update_preview_bottom_toolbar();
+ }
+ break;
+ }
case 'O':
case 'o': { _update_camera_zoom(-1.0); break; }
#if ENABLE_RENDER_PICKING_PASS
- case 'T':
- case 't': {
+ case 'P':
+ case 'p': {
m_show_picking_texture = !m_show_picking_texture;
- m_dirty = true;
+ m_dirty = true;
break;
}
#endif // ENABLE_RENDER_PICKING_PASS
case 'Z':
- case 'z': { m_selection.is_empty() ? zoom_to_volumes() : zoom_to_selection(); break; }
+ case 'z': {
+ if (!m_selection.is_empty())
+ zoom_to_selection();
+ else {
+ if (!m_volumes.empty())
+ zoom_to_volumes();
+ else
+ _zoom_to_box(m_gcode_viewer.get_paths_bounding_box());
+ }
+ break;
+ }
default: { evt.Skip(); break; }
}
}
@@ -3071,9 +2759,8 @@ void GLCanvas3D::on_key(wxKeyEvent& evt)
double multiplier = slow ? 1.0 : 10.0;
Vec3d displacement;
- if (camera_space)
- {
- Eigen::Matrix<double, 3, 3, Eigen::DontAlign> inv_view_3x3 = m_camera.get_view_matrix().inverse().matrix().block(0, 0, 3, 3);
+ if (camera_space) {
+ Eigen::Matrix<double, 3, 3, Eigen::DontAlign> inv_view_3x3 = wxGetApp().plater()->get_camera().get_view_matrix().inverse().matrix().block(0, 0, 3, 3);
displacement = multiplier * (inv_view_3x3 * direction);
displacement(2) = 0.0;
}
@@ -3093,20 +2780,29 @@ void GLCanvas3D::on_key(wxKeyEvent& evt)
}
else
{
- if (!m_gizmos.on_key(evt))
- {
+ if (!m_gizmos.on_key(evt)) {
if (evt.GetEventType() == wxEVT_KEY_UP) {
+#if ENABLE_RENDER_STATISTICS
+ if (evt.ShiftDown() && evt.ControlDown() && keyCode == WXK_SPACE) {
+ wxGetApp().plater()->toggle_render_statistic_dialog();
+ m_dirty = true;
+ }
+ if (m_tab_down && keyCode == WXK_TAB && !evt.HasAnyModifiers()) {
+#else
if (m_tab_down && keyCode == WXK_TAB && !evt.HasAnyModifiers()) {
+#endif // ENABLE_RENDER_STATISTICS
// Enable switching between 3D and Preview with Tab
// m_canvas->HandleAsNavigationKey(evt); // XXX: Doesn't work in some cases / on Linux
post_event(SimpleEvent(EVT_GLCANVAS_TAB));
}
- else if (keyCode == WXK_SHIFT)
- {
+ else if (keyCode == WXK_TAB && evt.ShiftDown() && ! wxGetApp().is_gcode_viewer()) {
+ // Collapse side-panel with Shift+Tab
+ post_event(SimpleEvent(EVT_GLCANVAS_COLLAPSE_SIDEBAR));
+ }
+ else if (keyCode == WXK_SHIFT) {
translationProcessor.process(evt);
- if (m_picking_enabled && m_rectangle_selection.is_dragging())
- {
+ if (m_picking_enabled && m_rectangle_selection.is_dragging()) {
_update_selection_from_hover();
m_rectangle_selection.stop_dragging();
m_mouse.ignore_left_up = true;
@@ -3114,10 +2810,8 @@ void GLCanvas3D::on_key(wxKeyEvent& evt)
}
// set_cursor(Standard);
}
- else if (keyCode == WXK_ALT)
- {
- if (m_picking_enabled && m_rectangle_selection.is_dragging())
- {
+ else if (keyCode == WXK_ALT) {
+ if (m_picking_enabled && m_rectangle_selection.is_dragging()) {
_update_selection_from_hover();
m_rectangle_selection.stop_dragging();
m_mouse.ignore_left_up = true;
@@ -3154,8 +2848,7 @@ void GLCanvas3D::on_key(wxKeyEvent& evt)
}
else if (evt.GetEventType() == wxEVT_KEY_DOWN) {
m_tab_down = keyCode == WXK_TAB && !evt.HasAnyModifiers();
- if (keyCode == WXK_SHIFT)
- {
+ if (keyCode == WXK_SHIFT) {
translationProcessor.process(evt);
if (m_picking_enabled && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports))
@@ -3164,8 +2857,7 @@ void GLCanvas3D::on_key(wxKeyEvent& evt)
// set_cursor(Cross);
}
}
- else if (keyCode == WXK_ALT)
- {
+ else if (keyCode == WXK_ALT) {
if (m_picking_enabled && (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports))
{
m_mouse.ignore_left_up = false;
@@ -3174,8 +2866,7 @@ void GLCanvas3D::on_key(wxKeyEvent& evt)
}
else if (keyCode == WXK_CONTROL)
m_dirty = true;
- else if (m_gizmos.is_enabled() && !m_selection.is_empty())
- {
+ else if (m_gizmos.is_enabled() && !m_selection.is_empty()) {
auto do_rotate = [this](double angle_z_rad) {
m_selection.start_dragging();
m_selection.rotate(Vec3d(0.0, 0.0, angle_z_rad), TransformationType(TransformationType::World_Relative_Joint));
@@ -3192,16 +2883,18 @@ void GLCanvas3D::on_key(wxKeyEvent& evt)
default: { break; }
}
}
- else if (!m_gizmos.is_enabled())
- {
+ else if (!m_gizmos.is_enabled()) {
// DoubleSlider navigation in Preview
if (keyCode == WXK_LEFT ||
keyCode == WXK_RIGHT ||
keyCode == WXK_UP ||
- keyCode == WXK_DOWN)
- {
+ keyCode == WXK_DOWN) {
if (dynamic_cast<Preview*>(m_canvas->GetParent()) != nullptr)
- post_event(wxKeyEvent(EVT_GLCANVAS_MOVE_DOUBLE_SLIDER, evt));
+#if ENABLE_ARROW_KEYS_WITH_SLIDERS
+ post_event(wxKeyEvent(EVT_GLCANVAS_MOVE_SLIDERS, evt));
+#else
+ post_event(wxKeyEvent(EVT_GLCANVAS_MOVE_LAYERS_SLIDER, evt));
+#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS
}
}
}
@@ -3238,6 +2931,11 @@ void GLCanvas3D::on_mouse_wheel(wxMouseEvent& evt)
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.
@@ -3246,14 +2944,11 @@ void GLCanvas3D::on_mouse_wheel(wxMouseEvent& evt)
#endif /* __WXMSW__ */
// Performs layers editing updates, if enabled
- if (is_layers_editing_enabled())
- {
+ if (is_layers_editing_enabled()) {
int object_idx_selected = m_selection.get_object_idx();
- if (object_idx_selected != -1)
- {
+ if (object_idx_selected != -1) {
// A volume is selected. Test, whether hovering over a layer thickness bar.
- if (m_layers_editing.bar_rect_contains(*this, (float)evt.GetX(), (float)evt.GetY()))
- {
+ if (m_layers_editing.bar_rect_contains(*this, (float)evt.GetX(), (float)evt.GetY())) {
// Adjust the width of the selection.
m_layers_editing.band_width = std::max(std::min(m_layers_editing.band_width * (1.0f + 0.1f * (float)evt.GetWheelRotation() / (float)evt.GetWheelDelta()), 10.0f), 1.5f);
if (m_canvas != nullptr)
@@ -3264,12 +2959,22 @@ void GLCanvas3D::on_mouse_wheel(wxMouseEvent& evt)
}
}
+ // If the Search window or Undo/Redo list is opened,
+ // update them according to the event
+ if (m_main_toolbar.is_item_pressed("search") ||
+ m_undoredo_toolbar.is_item_pressed("undo") ||
+ m_undoredo_toolbar.is_item_pressed("redo")) {
+ m_mouse_wheel = int((double)evt.GetWheelRotation() / (double)evt.GetWheelDelta());
+ return;
+ }
+
// Inform gizmos about the event so they have the opportunity to react.
if (m_gizmos.on_mouse_wheel(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)
@@ -3278,6 +2983,40 @@ void GLCanvas3D::on_timer(wxTimerEvent& evt)
_perform_layer_editing_action();
}
+void GLCanvas3D::on_render_timer(wxTimerEvent& evt)
+{
+ // If slicer is not top window -> restart timer with one second to try again
+ wxWindow* p = dynamic_cast<wxWindow*>(wxGetApp().plater());
+ while (p->GetParent() != nullptr)
+ p = p->GetParent();
+ wxTopLevelWindow* top_level_wnd = dynamic_cast<wxTopLevelWindow*>(p);
+ if (!top_level_wnd->IsActive()) {
+ request_extra_frame_delayed(1000);
+ return;
+ }
+ //render();
+ m_dirty = true;
+ wxWakeUpIdle();
+}
+
+void GLCanvas3D::request_extra_frame_delayed(int miliseconds)
+{
+ int64_t now = timestamp_now();
+ if (! m_render_timer.IsRunning()) {
+ m_extra_frame_requested_delayed = miliseconds;
+ m_render_timer.StartOnce(miliseconds);
+ m_render_timer_start = now;
+ } else {
+ const int64_t remaining_time = (m_render_timer_start + m_extra_frame_requested_delayed) - now;
+ if (miliseconds < remaining_time) {
+ m_render_timer.Stop();
+ m_extra_frame_requested_delayed = miliseconds;
+ m_render_timer.StartOnce(miliseconds);
+ m_render_timer_start = now;
+ }
+ }
+}
+
#ifndef NDEBUG
// #define SLIC3R_DEBUG_MOUSE_EVENTS
#endif
@@ -3340,6 +3079,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
Point pos(evt.GetX(), evt.GetY());
ImGuiWrapper* imgui = wxGetApp().imgui();
+ if (m_tooltip.is_in_imgui() && evt.LeftUp())
+ // ignore left up events coming from imgui windows and not processed by them
+ m_mouse.ignore_left_up = true;
m_tooltip.set_in_imgui(false);
if (imgui->update_mouse_data(evt)) {
m_mouse.position = evt.Leaving() ? Vec2d(-1.0, -1.0) : pos.cast<double>();
@@ -3348,12 +3090,9 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
#ifdef SLIC3R_DEBUG_MOUSE_EVENTS
printf((format_mouse_event_debug_message(evt) + " - Consumed by ImGUI\n").c_str());
#endif /* SLIC3R_DEBUG_MOUSE_EVENTS */
+ m_dirty = true;
// do not return if dragging or tooltip not empty to allow for tooltip update
-#if ENABLE_CANVAS_TOOLTIP_USING_IMGUI
if (!m_mouse.dragging && m_tooltip.is_empty())
-#else
- if (!m_mouse.dragging && m_canvas->GetToolTipText().empty())
-#endif // ENABLE_CANVAS_TOOLTIP_USING_IMGUI
return;
}
@@ -3375,48 +3114,54 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
#endif /* SLIC3R_DEBUG_MOUSE_EVENTS */
}
- if (m_main_toolbar.on_mouse(evt, *this))
- {
+ if (m_main_toolbar.on_mouse(evt, *this)) {
if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp())
mouse_up_cleanup();
m_mouse.set_start_position_3D_as_invalid();
return;
}
- if (m_undoredo_toolbar.on_mouse(evt, *this))
- {
+ if (m_undoredo_toolbar.on_mouse(evt, *this)) {
if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp())
mouse_up_cleanup();
m_mouse.set_start_position_3D_as_invalid();
return;
}
- if (m_view_toolbar.on_mouse(evt, *this))
- {
+ if (wxGetApp().plater()->get_collapse_toolbar().on_mouse(evt, *this)) {
if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp())
mouse_up_cleanup();
m_mouse.set_start_position_3D_as_invalid();
return;
}
- if (m_gizmos.on_mouse(evt))
- {
+ if (wxGetApp().plater()->get_view_toolbar().on_mouse(evt, *this)) {
+ if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp())
+ mouse_up_cleanup();
+ m_mouse.set_start_position_3D_as_invalid();
+ return;
+ }
+
+ if (m_gizmos.on_mouse(evt)) {
+ if (wxWindow::FindFocus() != this->m_canvas)
+ // Grab keyboard focus for input in gizmo dialogs.
+ m_canvas->SetFocus();
+
if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp())
mouse_up_cleanup();
m_mouse.set_start_position_3D_as_invalid();
-#if ENABLE_CANVAS_TOOLTIP_USING_IMGUI
m_mouse.position = pos.cast<double>();
-#endif /// ENABLE_CANVAS_TOOLTIP_USING_IMGUI
return;
}
+ bool any_gizmo_active = m_gizmos.get_current() != nullptr;
+
int selected_object_idx = m_selection.get_object_idx();
int layer_editing_object_idx = is_layers_editing_enabled() ? selected_object_idx : -1;
m_layers_editing.select_object(*m_model, layer_editing_object_idx);
- if (m_mouse.drag.move_requires_threshold && m_mouse.is_move_start_threshold_position_2D_defined() && m_mouse.is_move_threshold_met(pos))
- {
+ if (m_mouse.drag.move_requires_threshold && m_mouse.is_move_start_threshold_position_2D_defined() && m_mouse.is_move_threshold_met(pos)) {
m_mouse.drag.move_requires_threshold = false;
m_mouse.set_move_start_threshold_position_2D_as_invalid();
}
@@ -3425,8 +3170,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
// Grab keyboard focus on any mouse click event.
m_canvas->SetFocus();
- if (evt.Entering())
- {
+ if (evt.Entering()) {
//#if defined(__WXMSW__) || defined(__linux__)
// // On Windows and Linux needs focus in order to catch key events
// Set focus in order to remove it from sidebar fields
@@ -3439,57 +3183,53 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
if (top_level_wnd && top_level_wnd->IsActive())
m_canvas->SetFocus();
m_mouse.position = pos.cast<double>();
+ m_tooltip_enabled = false;
// 1) forces a frame render to ensure that m_hover_volume_idxs is updated even when the user right clicks while
// the context menu is shown, ensuring it to disappear if the mouse is outside any volume and to
// change the volume hover state if any is under the mouse
// 2) when switching between 3d view and preview the size of the canvas changes if the side panels are visible,
// so forces a resize to avoid multiple renders with different sizes (seen as flickering)
_refresh_if_shown_on_screen();
+ m_tooltip_enabled = true;
}
m_mouse.set_start_position_2D_as_invalid();
//#endif
}
- else if (evt.Leaving())
- {
+ else if (evt.Leaving()) {
_deactivate_undo_redo_toolbar_items();
// to remove hover on objects when the mouse goes out of this canvas
m_mouse.position = Vec2d(-1.0, -1.0);
m_dirty = true;
}
- else if (evt.LeftDown() || evt.RightDown() || evt.MiddleDown())
- {
- if (_deactivate_undo_redo_toolbar_items())
+ else if (evt.LeftDown() || evt.RightDown() || evt.MiddleDown()) {
+ if (_deactivate_undo_redo_toolbar_items() || _deactivate_search_toolbar_item() || _deactivate_arrange_menu())
return;
// If user pressed left or right button we first check whether this happened
// on a volume or not.
m_layers_editing.state = LayersEditing::Unknown;
- if ((layer_editing_object_idx != -1) && m_layers_editing.bar_rect_contains(*this, pos(0), pos(1)))
- {
+ if (layer_editing_object_idx != -1 && m_layers_editing.bar_rect_contains(*this, pos(0), pos(1))) {
// A volume is selected and the mouse is inside the layer thickness bar.
// Start editing the layer height.
m_layers_editing.state = LayersEditing::Editing;
_perform_layer_editing_action(&evt);
}
- else if (evt.LeftDown() && (evt.ShiftDown() || evt.AltDown()) && m_picking_enabled)
- {
- if (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports)
- {
+ else if (evt.LeftDown() && (evt.ShiftDown() || evt.AltDown()) && m_picking_enabled) {
+ if (m_gizmos.get_current_type() != GLGizmosManager::SlaSupports
+ && m_gizmos.get_current_type() != GLGizmosManager::FdmSupports
+ && m_gizmos.get_current_type() != GLGizmosManager::Seam) {
m_rectangle_selection.start_dragging(m_mouse.position, evt.ShiftDown() ? GLSelectionRectangle::Select : GLSelectionRectangle::Deselect);
m_dirty = true;
}
}
- else
- {
+ else {
// Select volume in this 3D canvas.
- // Don't deselect a volume if layer editing is enabled. We want the object to stay selected
+ // Don't deselect a volume if layer editing is enabled or any gizmo is active. We want the object to stay selected
// during the scene manipulation.
- if (m_picking_enabled && (!m_hover_volume_idxs.empty() || !is_layers_editing_enabled()))
- {
- if (evt.LeftDown() && !m_hover_volume_idxs.empty())
- {
+ if (m_picking_enabled && (!any_gizmo_active || !evt.CmdDown()) && (!m_hover_volume_idxs.empty() || !is_layers_editing_enabled())) {
+ if (evt.LeftDown() && !m_hover_volume_idxs.empty()) {
int volume_idx = get_first_hover_volume_idx();
bool already_selected = m_selection.contains_volume(volume_idx);
bool ctrl_down = evt.CmdDown();
@@ -3498,8 +3238,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
if (already_selected && ctrl_down)
m_selection.remove(volume_idx);
- else
- {
+ else {
m_selection.add(volume_idx, !ctrl_down, true);
m_mouse.drag.move_requires_threshold = !already_selected;
if (already_selected)
@@ -3509,8 +3248,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
}
// propagate event through callback
- if (curr_idxs != m_selection.get_volume_idxs())
- {
+ if (curr_idxs != m_selection.get_volume_idxs()) {
if (m_selection.is_empty())
m_gizmos.reset_all_states();
else
@@ -3523,16 +3261,13 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
}
}
- if (!m_hover_volume_idxs.empty())
- {
- if (evt.LeftDown() && m_moving_enabled && (m_mouse.drag.move_volume_idx == -1))
- {
+ if (!m_hover_volume_idxs.empty()) {
+ if (evt.LeftDown() && m_moving_enabled && m_mouse.drag.move_volume_idx == -1) {
// Only accept the initial position, if it is inside the volume bounding box.
int volume_idx = get_first_hover_volume_idx();
BoundingBoxf3 volume_bbox = m_volumes.volumes[volume_idx]->transformed_bounding_box();
volume_bbox.offset(1.0);
- if (volume_bbox.contains(m_mouse.scene_position))
- {
+ if ((!any_gizmo_active || !evt.CmdDown()) && volume_bbox.contains(m_mouse.scene_position)) {
m_volumes.volumes[volume_idx]->hover = GLVolume::HS_None;
// The dragging operation is initiated.
m_mouse.drag.move_volume_idx = volume_idx;
@@ -3544,18 +3279,14 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
}
}
}
- else if (evt.Dragging() && evt.LeftIsDown() && (m_layers_editing.state == LayersEditing::Unknown) && (m_mouse.drag.move_volume_idx != -1))
- {
- if (!m_mouse.drag.move_requires_threshold)
- {
+ else if (evt.Dragging() && evt.LeftIsDown() && m_layers_editing.state == LayersEditing::Unknown && m_mouse.drag.move_volume_idx != -1) {
+ if (!m_mouse.drag.move_requires_threshold) {
m_mouse.dragging = true;
-
Vec3d cur_pos = m_mouse.drag.start_position_3D;
// we do not want to translate objects if the user just clicked on an object while pressing shift to remove it from the selection and then drag
- if (m_selection.contains_volume(get_first_hover_volume_idx()))
- {
- if (std::abs(m_camera.get_dir_forward()(2)) < EPSILON)
- {
+ if (m_selection.contains_volume(get_first_hover_volume_idx())) {
+ const Camera& camera = wxGetApp().plater()->get_camera();
+ if (std::abs(camera.get_dir_forward()(2)) < EPSILON) {
// side view -> move selected volumes orthogonally to camera view direction
Linef3 ray = mouse_ray(pos);
Vec3d dir = ray.unit_vector();
@@ -3567,8 +3298,8 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
// vector from the starting position to the found intersection
Vec3d inters_vec = inters - m_mouse.drag.start_position_3D;
- Vec3d camera_right = m_camera.get_dir_right();
- Vec3d camera_up = m_camera.get_dir_up();
+ Vec3d camera_right = camera.get_dir_right();
+ Vec3d camera_up = camera.get_dir_up();
// finds projection of the vector along the camera axes
double projection_x = inters_vec.dot(camera_right);
@@ -3577,8 +3308,7 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
// apply offset
cur_pos = m_mouse.drag.start_position_3D + projection_x * camera_right + projection_z * camera_up;
}
- else
- {
+ else {
// Generic view
// Get new position at the same Z of the initial click point.
float z0 = 0.0f;
@@ -3592,115 +3322,93 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
m_dirty = true;
}
}
- else if (evt.Dragging() && evt.LeftIsDown() && m_picking_enabled && m_rectangle_selection.is_dragging())
- {
+ else if (evt.Dragging() && evt.LeftIsDown() && m_picking_enabled && m_rectangle_selection.is_dragging()) {
m_rectangle_selection.dragging(pos.cast<double>());
m_dirty = true;
}
- else if (evt.Dragging())
- {
+ else if (evt.Dragging()) {
m_mouse.dragging = true;
- if ((m_layers_editing.state != LayersEditing::Unknown) && (layer_editing_object_idx != -1))
- {
- set_tooltip("");
- if (m_layers_editing.state == LayersEditing::Editing)
+ if (m_layers_editing.state != LayersEditing::Unknown && layer_editing_object_idx != -1) {
+ if (m_layers_editing.state == LayersEditing::Editing) {
_perform_layer_editing_action(&evt);
+ m_mouse.position = pos.cast<double>();
+ }
}
// do not process the dragging if the left mouse was set down in another canvas
- else if (evt.LeftIsDown())
- {
+ else if (evt.LeftIsDown()) {
// if dragging over blank area with left button, rotate
- if (m_hover_volume_idxs.empty() && m_mouse.is_start_position_3D_defined())
- {
+ if ((any_gizmo_active || m_hover_volume_idxs.empty()) && m_mouse.is_start_position_3D_defined()) {
const Vec3d rot = (Vec3d(pos.x(), pos.y(), 0.) - m_mouse.drag.start_position_3D) * (PI * TRACKBALLSIZE / 180.);
-#if ENABLE_AUTO_CONSTRAINED_CAMERA
if (wxGetApp().app_config->get("use_free_camera") == "1")
// Virtual track ball (similar to the 3DConnexion mouse).
- m_camera.rotate_local_around_target(Vec3d(rot.y(), rot.x(), 0.));
- else
- {
- // Forces camera right vector to be parallel to XY plane in case it has been misaligned using the 3D mouse free rotation.
- // It is cheaper to call this function right away instead of testing wxGetApp().plater()->get_mouse3d_controller().connected(),
- // which checks an atomics (flushes CPU caches).
- // See GH issue #3816.
- m_camera.recover_from_free_camera();
- m_camera.rotate_on_sphere(rot.x(), rot.y(), wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA);
+ wxGetApp().plater()->get_camera().rotate_local_around_target(Vec3d(rot.y(), rot.x(), 0.));
+ else {
+ // Forces camera right vector to be parallel to XY plane in case it has been misaligned using the 3D mouse free rotation.
+ // It is cheaper to call this function right away instead of testing wxGetApp().plater()->get_mouse3d_controller().connected(),
+ // which checks an atomics (flushes CPU caches).
+ // See GH issue #3816.
+ Camera& camera = wxGetApp().plater()->get_camera();
+ camera.recover_from_free_camera();
+ camera.rotate_on_sphere(rot.x(), rot.y(), wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA);
}
-#else
- if (wxGetApp().plater()->get_mouse3d_controller().connected() || (wxGetApp().app_config->get("use_free_camera") == "1"))
- // Virtual track ball (similar to the 3DConnexion mouse).
- m_camera.rotate_local_around_target(Vec3d(rot.y(), rot.x(), 0.));
- else
- m_camera.rotate_on_sphere(rot.x(), rot.y(), wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA);
-#endif // ENABLE_AUTO_CONSTRAINED_CAMERA
m_dirty = true;
}
m_mouse.drag.start_position_3D = Vec3d((double)pos(0), (double)pos(1), 0.0);
}
- else if (evt.MiddleIsDown() || evt.RightIsDown())
- {
+ else if (evt.MiddleIsDown() || evt.RightIsDown()) {
// If dragging over blank area with right button, pan.
- if (m_mouse.is_start_position_2D_defined())
- {
+ if (m_mouse.is_start_position_2D_defined()) {
// get point in model space at Z = 0
float z = 0.0f;
const Vec3d& cur_pos = _mouse_to_3d(pos, &z);
Vec3d orig = _mouse_to_3d(m_mouse.drag.start_position_2D, &z);
-#if ENABLE_AUTO_CONSTRAINED_CAMERA
+ Camera& camera = wxGetApp().plater()->get_camera();
if (wxGetApp().app_config->get("use_free_camera") != "1")
- // Forces camera right vector to be parallel to XY plane in case it has been misaligned using the 3D mouse free rotation.
- // It is cheaper to call this function right away instead of testing wxGetApp().plater()->get_mouse3d_controller().connected(),
- // which checks an atomics (flushes CPU caches).
- // See GH issue #3816.
- m_camera.recover_from_free_camera();
-#endif // ENABLE_AUTO_CONSTRAINED_CAMERA
-
- m_camera.set_target(m_camera.get_target() + orig - cur_pos);
+ // Forces camera right vector to be parallel to XY plane in case it has been misaligned using the 3D mouse free rotation.
+ // It is cheaper to call this function right away instead of testing wxGetApp().plater()->get_mouse3d_controller().connected(),
+ // which checks an atomics (flushes CPU caches).
+ // See GH issue #3816.
+ camera.recover_from_free_camera();
+
+ camera.set_target(camera.get_target() + orig - cur_pos);
m_dirty = true;
}
-
+
m_mouse.drag.start_position_2D = pos;
}
}
- else if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp())
- {
- if (m_layers_editing.state != LayersEditing::Unknown)
- {
+ else if (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()) {
+ if (m_layers_editing.state != LayersEditing::Unknown) {
m_layers_editing.state = LayersEditing::Unknown;
_stop_timer();
m_layers_editing.accept_changes(*this);
}
- else if ((m_mouse.drag.move_volume_idx != -1) && m_mouse.dragging)
- {
+ else if (m_mouse.drag.move_volume_idx != -1 && m_mouse.dragging) {
do_move(L("Move Object"));
wxGetApp().obj_manipul()->set_dirty();
// Let the plater know that the dragging finished, so a delayed refresh
// of the scene with the background processing data should be performed.
post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED));
}
- else if (evt.LeftUp() && m_picking_enabled && m_rectangle_selection.is_dragging())
- {
+ else if (evt.LeftUp() && m_picking_enabled && m_rectangle_selection.is_dragging()) {
if (evt.ShiftDown() || evt.AltDown())
_update_selection_from_hover();
m_rectangle_selection.stop_dragging();
}
- else if (evt.LeftUp() && !m_mouse.ignore_left_up && !m_mouse.dragging && m_hover_volume_idxs.empty() && !is_layers_editing_enabled())
- {
+ else if (evt.LeftUp() && !m_mouse.ignore_left_up && !m_mouse.dragging && m_hover_volume_idxs.empty() && !is_layers_editing_enabled()) {
// deselect and propagate event through callback
- if (!evt.ShiftDown() && m_picking_enabled)
+ if (!evt.ShiftDown() && (!any_gizmo_active || !evt.CmdDown()) && m_picking_enabled)
deselect_all();
}
- else if (evt.RightUp())
- {
+ else if (evt.RightUp()) {
m_mouse.position = pos.cast<double>();
// forces a frame render to ensure that m_hover_volume_idxs is updated even when the user right clicks while
// the context menu is already shown
render();
- if (!m_hover_volume_idxs.empty())
- {
+ if (!m_hover_volume_idxs.empty()) {
// if right clicking on volume, propagate event through callback (shows context menu)
int volume_idx = get_first_hover_volume_idx();
if (!m_volumes.volumes[volume_idx]->is_wipe_tower // no context menu for the wipe tower
@@ -3725,24 +3433,25 @@ void GLCanvas3D::on_mouse(wxMouseEvent& evt)
const float factor = m_retina_helper->get_scale_factor();
logical_pos = logical_pos.cwiseQuotient(Vec2d(factor, factor));
#endif // ENABLE_RETINA_GL
- if (!m_mouse.dragging)
+ if (!m_mouse.dragging) {
// do not post the event if the user is panning the scene
- post_event(RBtnEvent(EVT_GLCANVAS_RIGHT_CLICK, { logical_pos, m_hover_volume_idxs.empty() }));
+ // or if right click was done over the wipe tower
+ bool post_right_click_event = m_hover_volume_idxs.empty() || !m_volumes.volumes[get_first_hover_volume_idx()]->is_wipe_tower;
+ if (post_right_click_event)
+ post_event(RBtnEvent(EVT_GLCANVAS_RIGHT_CLICK, { logical_pos, m_hover_volume_idxs.empty() }));
+ }
}
mouse_up_cleanup();
}
- else if (evt.Moving())
- {
+ else if (evt.Moving()) {
m_mouse.position = pos.cast<double>();
// updates gizmos overlay
if (m_selection.is_empty())
m_gizmos.reset_all_states();
- // Only refresh if picking is enabled, in that case the objects may get highlighted if the mouse cursor hovers over.
- if (m_picking_enabled)
- m_dirty = true;
+ m_dirty = true;
}
else
evt.Skip();
@@ -3762,6 +3471,13 @@ void GLCanvas3D::on_paint(wxPaintEvent& evt)
this->render();
}
+void GLCanvas3D::on_set_focus(wxFocusEvent& evt)
+{
+ m_tooltip_enabled = false;
+ _refresh_if_shown_on_screen();
+ m_tooltip_enabled = true;
+}
+
Size GLCanvas3D::get_canvas_size() const
{
int w = 0;
@@ -3796,38 +3512,10 @@ Vec2d GLCanvas3D::get_local_mouse_position() const
return Vec2d(factor * mouse_pos.x, factor * mouse_pos.y);
}
-void GLCanvas3D::reset_legend_texture()
-{
- if (m_legend_texture.get_id() != 0)
- {
- _set_current();
- m_legend_texture.reset();
- }
-}
-
void GLCanvas3D::set_tooltip(const std::string& tooltip) const
{
if (m_canvas != nullptr)
- {
-#if ENABLE_CANVAS_TOOLTIP_USING_IMGUI
m_tooltip.set_text(tooltip);
-#else
- wxString txt = wxString::FromUTF8(tooltip.data());
- if (m_canvas->GetToolTipText() != txt)
- m_canvas->SetToolTip(txt);
-
-// wxToolTip* t = m_canvas->GetToolTip();
-// if (t != nullptr)
-// {
-// if (tooltip.empty())
-// m_canvas->UnsetToolTip();
-// else
-// t->SetTip(wxString::FromUTF8(tooltip.data()));
-// }
-// else if (!tooltip.empty()) // Avoid "empty" tooltips => unset of the empty tooltip leads to application crash under OSX
-// m_canvas->SetToolTip(wxString::FromUTF8(tooltip.data()));
-#endif // ENABLE_CANVAS_TOOLTIP_USING_IMGUI
- }
}
void GLCanvas3D::do_move(const std::string& snapshot_type)
@@ -4095,7 +3783,8 @@ void GLCanvas3D::update_ui_from_settings()
{
m_dirty = true;
-#if ENABLE_RETINA_GL
+#if __APPLE__
+ // Update OpenGL scaling on OSX after the user toggled the "use_retina_opengl" settings in Preferences dialog.
const float orig_scaling = m_retina_helper->get_scale_factor();
const bool use_retina = wxGetApp().app_config->get("use_retina_opengl") == "1";
@@ -4106,13 +3795,15 @@ void GLCanvas3D::update_ui_from_settings()
if (new_scaling != orig_scaling) {
BOOST_LOG_TRIVIAL(debug) << "GLCanvas3D: Scaling factor: " << new_scaling;
- m_camera.set_zoom(m_camera.get_zoom() * new_scaling / orig_scaling);
+ Camera& camera = wxGetApp().plater()->get_camera();
+ camera.set_zoom(camera.get_zoom() * new_scaling / orig_scaling);
_refresh_if_shown_on_screen();
}
-#endif
-}
-
+#endif // ENABLE_RETINA_GL
+ if (wxGetApp().is_editor())
+ wxGetApp().plater()->enable_collapse_toolbar(wxGetApp().app_config->get("show_collapse_button") == "1");
+}
GLCanvas3D::WipeTowerInfo GLCanvas3D::get_wipe_tower_info() const
{
@@ -4124,7 +3815,7 @@ GLCanvas3D::WipeTowerInfo GLCanvas3D::get_wipe_tower_info() const
m_config->opt_float("wipe_tower_y"));
wti.m_rotation = (M_PI/180.) * m_config->opt_float("wipe_tower_rotation_angle");
const BoundingBoxf3& bb = vol->bounding_box();
- wti.m_bb_size = Vec2d(bb.size().x(), bb.size().y());
+ wti.m_bb = BoundingBoxf{to_2d(bb.min), to_2d(bb.max)};
break;
}
}
@@ -4141,7 +3832,7 @@ Linef3 GLCanvas3D::mouse_ray(const Point& mouse_pos)
double GLCanvas3D::get_size_proportional_to_max_bed_size(double factor) const
{
- return factor * m_bed.get_bounding_box(false).max_size();
+ return factor * wxGetApp().plater()->get_bed().get_bounding_box(false).max_size();
}
void GLCanvas3D::set_cursor(ECursorType type)
@@ -4163,14 +3854,24 @@ void GLCanvas3D::msw_rescale()
m_warning_texture.msw_rescale(*this);
}
+void GLCanvas3D::update_tooltip_for_settings_item_in_main_toolbar()
+{
+ std::string new_tooltip = _u8L("Switch to Settings") +
+ "\n" + "[" + GUI::shortkey_ctrl_prefix() + "2] - " + _u8L("Print Settings Tab") +
+ "\n" + "[" + GUI::shortkey_ctrl_prefix() + "3] - " + (m_process->current_printer_technology() == ptFFF ? _u8L("Filament Settings Tab") : _u8L("Material Settings Tab")) +
+ "\n" + "[" + GUI::shortkey_ctrl_prefix() + "4] - " + _u8L("Printer Settings Tab") ;
+
+ m_main_toolbar.set_tooltip(get_main_toolbar_item_id("settings"), new_tooltip);
+}
+
bool GLCanvas3D::has_toolpaths_to_export() const
{
- return m_volumes.has_toolpaths_to_export();
+ return m_gcode_viewer.has_data();
}
void GLCanvas3D::export_toolpaths_to_obj(const char* filename) const
{
- m_volumes.export_toolpaths_to_obj(filename);
+ m_gcode_viewer.export_toolpaths_to_obj(filename);
}
void GLCanvas3D::mouse_up_cleanup()
@@ -4198,11 +3899,13 @@ static bool string_getter(const bool is_undo, int idx, const char** out_text)
return wxGetApp().plater()->undo_redo_string_getter(is_undo, idx, out_text);
}
-void GLCanvas3D::_render_undo_redo_stack(const bool is_undo, float pos_x) const
+bool GLCanvas3D::_render_undo_redo_stack(const bool is_undo, float pos_x) const
{
+ bool action_taken = false;
+
ImGuiWrapper* imgui = wxGetApp().imgui();
- const float x = pos_x * (float)get_camera().get_zoom() + 0.5f * (float)get_canvas_size().get_width();
+ const float x = pos_x * (float)wxGetApp().plater()->get_camera().get_zoom() + 0.5f * (float)get_canvas_size().get_width();
imgui->set_next_window_pos(x, m_undoredo_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f);
std::string title = is_undo ? L("Undo History") : L("Redo History");
imgui->begin(_(title), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse);
@@ -4214,20 +3917,156 @@ void GLCanvas3D::_render_undo_redo_stack(const bool is_undo, float pos_x) const
em *= m_retina_helper->get_scale_factor();
#endif
- if (imgui->undo_redo_list(ImVec2(18 * em, 26 * em), is_undo, &string_getter, hovered, selected))
+ if (imgui->undo_redo_list(ImVec2(18 * em, 26 * em), is_undo, &string_getter, hovered, selected, m_mouse_wheel))
m_imgui_undo_redo_hovered_pos = hovered;
else
m_imgui_undo_redo_hovered_pos = -1;
if (selected >= 0)
+ {
is_undo ? wxGetApp().plater()->undo_to(selected) : wxGetApp().plater()->redo_to(selected);
+ action_taken = true;
+ }
imgui->text(wxString::Format(is_undo ? _L_PLURAL("Undo %1$d Action", "Undo %1$d Actions", hovered + 1) : _L_PLURAL("Redo %1$d Action", "Redo %1$d Actions", hovered + 1), hovered + 1));
imgui->end();
+
+ return action_taken;
+}
+
+// Getter for the const char*[] for the search list
+static bool search_string_getter(int idx, const char** label, const char** tooltip)
+{
+ return wxGetApp().plater()->search_string_getter(idx, label, tooltip);
+}
+
+bool GLCanvas3D::_render_search_list(float pos_x) const
+{
+ bool action_taken = false;
+ ImGuiWrapper* imgui = wxGetApp().imgui();
+
+ const float x = /*pos_x * (float)wxGetApp().plater()->get_camera().get_zoom() + */0.5f * (float)get_canvas_size().get_width();
+ imgui->set_next_window_pos(x, m_main_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f);
+ std::string title = L("Search");
+ imgui->begin(_(title), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse);
+
+ int selected = -1;
+ bool edited = false;
+ float em = static_cast<float>(wxGetApp().em_unit());
+#if ENABLE_RETINA_GL
+ em *= m_retina_helper->get_scale_factor();
+#endif // ENABLE_RETINA_GL
+
+ Sidebar& sidebar = wxGetApp().sidebar();
+
+ std::string& search_line = sidebar.get_search_line();
+ char *s = new char[255];
+ strcpy(s, search_line.empty() ? _u8L("Enter a search term").c_str() : search_line.c_str());
+
+ imgui->search_list(ImVec2(45 * em, 30 * em), &search_string_getter, s,
+ sidebar.get_searcher().view_params,
+ selected, edited, m_mouse_wheel, wxGetApp().is_localized());
+
+ search_line = s;
+ delete [] s;
+ if (search_line == _u8L("Enter a search term"))
+ search_line.clear();
+
+ if (edited)
+ sidebar.search();
+
+ if (selected >= 0) {
+ // selected == 9999 means that Esc kye was pressed
+ /*// revert commit https://github.com/prusa3d/PrusaSlicer/commit/91897589928789b261ca0dc735ffd46f2b0b99f2
+ if (selected == 9999)
+ action_taken = true;
+ else
+ sidebar.jump_to_option(selected);*/
+ if (selected != 9999)
+ sidebar.jump_to_option(selected);
+ action_taken = true;
+ }
+
+ imgui->end();
+
+ return action_taken;
+}
+
+bool GLCanvas3D::_render_arrange_menu(float pos_x)
+{
+ ImGuiWrapper *imgui = wxGetApp().imgui();
+
+ auto canvas_w = float(get_canvas_size().get_width());
+ const float x = pos_x * float(wxGetApp().plater()->get_camera().get_zoom()) + 0.5f * canvas_w;
+ imgui->set_next_window_pos(x, m_main_toolbar.get_height(), ImGuiCond_Always, 0.5f, 0.0f);
+
+ imgui->begin(_L("Arrange options"), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse);
+
+ ArrangeSettings settings = get_arrange_settings();
+ ArrangeSettings &settings_out = get_arrange_settings();
+
+ auto &appcfg = wxGetApp().app_config;
+ PrinterTechnology ptech = m_process->current_printer_technology();
+
+ bool settings_changed = false;
+ float dist_min = 0.f;
+ std::string dist_key = "min_object_distance", rot_key = "enable_rotation";
+ std::string postfix;
+
+ if (ptech == ptSLA) {
+ dist_min = 0.f;
+ postfix = "_sla";
+ } else if (ptech == ptFFF) {
+ auto co_opt = m_config->option<ConfigOptionBool>("complete_objects");
+ if (co_opt && co_opt->value) {
+ dist_min = float(min_object_distance(*m_config));
+ postfix = "_fff_seq_print";
+ } else {
+ dist_min = 0.f;
+ postfix = "_fff";
+ }
+ }
+
+ dist_key += postfix;
+ rot_key += postfix;
+
+ imgui->text(GUI::format_wxstr(_L("Press %1%left mouse button to enter the exact value"), shortkey_ctrl_prefix()));
+
+ if (imgui->slider_float(_L("Spacing"), &settings.distance, dist_min, 100.0f, "%5.2f") || dist_min > settings.distance) {
+ settings.distance = std::max(dist_min, settings.distance);
+ settings_out.distance = settings.distance;
+ appcfg->set("arrange", dist_key.c_str(), std::to_string(settings_out.distance));
+ settings_changed = true;
+ }
+
+ if (imgui->checkbox(_L("Enable rotations (slow)"), settings.enable_rotation)) {
+ settings_out.enable_rotation = settings.enable_rotation;
+ appcfg->set("arrange", rot_key.c_str(), settings_out.enable_rotation? "1" : "0");
+ settings_changed = true;
+ }
+
+ ImGui::Separator();
+
+ if (imgui->button(_L("Reset"))) {
+ settings_out = ArrangeSettings{};
+ settings_out.distance = std::max(dist_min, settings_out.distance);
+ appcfg->set("arrange", dist_key.c_str(), std::to_string(settings_out.distance));
+ appcfg->set("arrange", rot_key.c_str(), settings_out.enable_rotation? "1" : "0");
+ settings_changed = true;
+ }
+
+ ImGui::SameLine();
+
+ if (imgui->button(_L("Arrange"))) {
+ wxGetApp().plater()->arrange();
+ }
+
+ imgui->end();
+
+ return settings_changed;
}
-#if ENABLE_THUMBNAIL_GENERATOR
#define ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT 0
#if ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT
static void debug_output_thumbnail(const ThumbnailData& thumbnail_data)
@@ -4253,22 +4092,19 @@ static void debug_output_thumbnail(const ThumbnailData& thumbnail_data)
void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, bool printable_only, bool parts_only, bool show_bed, bool transparent_background) const
{
- auto is_visible = [](const GLVolume& v) -> bool
- {
+ auto is_visible = [](const GLVolume& v) {
bool ret = v.printable;
ret &= (!v.shader_outside_printer_detection_enabled || !v.is_outside);
return ret;
};
- static const GLfloat orange[] = { 0.923f, 0.504f, 0.264f, 1.0f };
- static const GLfloat gray[] = { 0.64f, 0.64f, 0.64f, 1.0f };
+ static const std::array<float, 4> orange = { 0.923f, 0.504f, 0.264f, 1.0f };
+ static const std::array<float, 4> gray = { 0.64f, 0.64f, 0.64f, 1.0f };
GLVolumePtrs visible_volumes;
- for (GLVolume* vol : m_volumes.volumes)
- {
- if (!vol->is_modifier && !vol->is_wipe_tower && (!parts_only || (vol->composite_id.volume_id >= 0)))
- {
+ for (GLVolume* vol : m_volumes.volumes) {
+ if (!vol->is_modifier && !vol->is_wipe_tower && (!parts_only || (vol->composite_id.volume_id >= 0))) {
if (!printable_only || is_visible(*vol))
visible_volumes.emplace_back(vol);
}
@@ -4278,8 +4114,7 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, bool
return;
BoundingBoxf3 box;
- for (const GLVolume* vol : visible_volumes)
- {
+ for (const GLVolume* vol : visible_volumes) {
box.merge(vol->transformed_bounding_box());
}
@@ -4293,51 +4128,47 @@ void GLCanvas3D::_render_thumbnail_internal(ThumbnailData& thumbnail_data, bool
double near_z = -1.0;
double far_z = -1.0;
- if (show_bed)
- {
+ if (show_bed) {
// extends the near and far z of the frustrum to avoid the bed being clipped
// box in eye space
- BoundingBoxf3 t_bed_box = m_bed.get_bounding_box(true).transformed(camera.get_view_matrix());
+ BoundingBoxf3 t_bed_box = wxGetApp().plater()->get_bed().get_bounding_box(true).transformed(camera.get_view_matrix());
near_z = -t_bed_box.max(2);
far_z = -t_bed_box.min(2);
}
camera.apply_projection(box, near_z, far_z);
+ GLShaderProgram* shader = wxGetApp().get_shader("gouraud_light");
+ if (shader == nullptr)
+ return;
+
if (transparent_background)
glsafe(::glClearColor(0.0f, 0.0f, 0.0f, 0.0f));
glsafe(::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT));
glsafe(::glEnable(GL_DEPTH_TEST));
- m_shader.start_using();
-
- GLint shader_id = m_shader.get_shader_program_id();
- GLint color_id = ::glGetUniformLocation(shader_id, "uniform_color");
- GLint print_box_detection_id = ::glGetUniformLocation(shader_id, "print_box.volume_detection");
- glcheck();
-
- if (print_box_detection_id != -1)
- glsafe(::glUniform1i(print_box_detection_id, 0));
-
- for (const GLVolume* vol : visible_volumes)
- {
- if (color_id >= 0)
- glsafe(::glUniform4fv(color_id, 1, (vol->printable && !vol->is_outside) ? orange : gray));
- else
- glsafe(::glColor4fv((vol->printable && !vol->is_outside) ? orange : gray));
+ shader->start_using();
+ shader->set_uniform("print_box.volume_detection", 0);
+ for (GLVolume* vol : visible_volumes) {
+ shader->set_uniform("uniform_color", (vol->printable && !vol->is_outside) ? orange : gray);
+ // the volume may have been deactivated by an active gizmo
+ bool is_active = vol->is_active;
+ vol->is_active = true;
vol->render();
+ vol->is_active = is_active;
}
- m_shader.stop_using();
+ shader->stop_using();
glsafe(::glDisable(GL_DEPTH_TEST));
if (show_bed)
_render_bed(!camera.is_looking_downward(), false);
+ // restore background color
if (transparent_background)
glsafe(::glClearColor(1.0f, 1.0f, 1.0f, 1.0f));
}
@@ -4575,9 +4406,8 @@ void GLCanvas3D::_render_thumbnail_legacy(ThumbnailData& thumbnail_data, unsigne
#endif // ENABLE_THUMBNAIL_GENERATOR_DEBUG_OUTPUT
// restore the default framebuffer size to avoid flickering on the 3D scene
- m_camera.apply_viewport(0, 0, cnv_size.get_width(), cnv_size.get_height());
+ wxGetApp().plater()->get_camera().apply_viewport(0, 0, cnv_size.get_width(), cnv_size.get_height());
}
-#endif // ENABLE_THUMBNAIL_GENERATOR
bool GLCanvas3D::_init_toolbars()
{
@@ -4590,6 +4420,9 @@ bool GLCanvas3D::_init_toolbars()
if (!_init_view_toolbar())
return false;
+ if (!_init_collapse_toolbar())
+ return false;
+
return true;
}
@@ -4618,7 +4451,7 @@ bool GLCanvas3D::_init_main_toolbar()
m_main_toolbar.set_vertical_orientation(GLToolbar::Layout::VO_Top);
m_main_toolbar.set_border(5.0f);
m_main_toolbar.set_separator_size(5);
- m_main_toolbar.set_gap_size(2);
+ m_main_toolbar.set_gap_size(4);
GLToolbarItem::Data item;
@@ -4650,13 +4483,23 @@ bool GLCanvas3D::_init_main_toolbar()
item.name = "arrange";
item.icon_filename = "arrange.svg";
- item.tooltip = _utf8(L("Arrange")) + " [A]\n" + _utf8(L("Arrange selection")) + " [Shift+A]";
+ item.tooltip = _utf8(L("Arrange")) + " [A]\n" + _utf8(L("Arrange selection")) + " [Shift+A]\n" + _utf8(L("Click right mouse button to show arrangement options"));
item.sprite_id = 3;
item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_ARRANGE)); };
item.enabling_callback = []()->bool { return wxGetApp().plater()->can_arrange(); };
+ item.right.toggable = true;
+ item.right.render_callback = [this](float left, float right, float, float) {
+ if (m_canvas != nullptr)
+ {
+ _render_arrange_menu(0.5f * (left + right));
+ }
+ };
if (!m_main_toolbar.add_item(item))
return false;
+ item.right.toggable = false;
+ item.right.render_callback = GLToolbarItem::Default_Render_Callback;
+
if (!m_main_toolbar.add_separator())
return false;
@@ -4728,14 +4571,51 @@ bool GLCanvas3D::_init_main_toolbar()
if (!m_main_toolbar.add_separator())
return false;
+ item.name = "settings";
+ item.icon_filename = "settings.svg";
+ item.tooltip = _u8L("Switch to Settings") + "\n" + "[" + GUI::shortkey_ctrl_prefix() + "2] - " + _u8L("Print Settings Tab") +
+ "\n" + "[" + GUI::shortkey_ctrl_prefix() + "3] - " + (m_process->current_printer_technology() == ptFFF ? _u8L("Filament Settings Tab") : _u8L("Material Settings Tab")) +
+ "\n" + "[" + GUI::shortkey_ctrl_prefix() + "4] - " + _u8L("Printer Settings Tab") ;
+ item.sprite_id = 10;
+ item.enabling_callback = GLToolbarItem::Default_Enabling_Callback;
+ item.visibility_callback = [this]() { return (wxGetApp().app_config->get("new_settings_layout_mode") == "1" ||
+ wxGetApp().app_config->get("dlg_settings_layout_mode") == "1"); };
+ item.left.action_callback = [this]() { wxGetApp().mainframe->select_tab(); };
+ if (!m_main_toolbar.add_item(item))
+ return false;
+
+ /*
+ if (!m_main_toolbar.add_separator())
+ return false;
+ */
+
+ item.name = "search";
+ item.icon_filename = "search_.svg";
+ item.tooltip = _utf8(L("Search")) + " [" + GUI::shortkey_ctrl_prefix() + "F]";
+ item.sprite_id = 11;
+ item.left.toggable = true;
+ item.left.render_callback = [this](float left, float right, float, float) {
+ if (m_canvas != nullptr)
+ {
+ if (_render_search_list(0.5f * (left + right)))
+ _deactivate_search_toolbar_item();
+ }
+ };
+ item.left.action_callback = GLToolbarItem::Default_Action_Callback;
+ item.visibility_callback = GLToolbarItem::Default_Visibility_Callback;
+ item.enabling_callback = GLToolbarItem::Default_Enabling_Callback;
+ if (!m_main_toolbar.add_item(item))
+ return false;
+
+ if (!m_main_toolbar.add_separator())
+ return false;
+
item.name = "layersediting";
item.icon_filename = "layers_white.svg";
item.tooltip = _utf8(L("Variable layer height"));
- item.sprite_id = 10;
- item.left.toggable = true;
+ item.sprite_id = 12;
item.left.action_callback = [this]() { if (m_canvas != nullptr) wxPostEvent(m_canvas, SimpleEvent(EVT_GLTOOLBAR_LAYERSEDITING)); };
- item.visibility_callback = [this]()->bool
- {
+ item.visibility_callback = [this]()->bool {
bool res = m_process->current_printer_technology() == ptFFF;
// turns off if changing printer technology
if (!res && m_main_toolbar.is_item_visible("layersediting") && m_main_toolbar.is_item_pressed("layersediting"))
@@ -4743,7 +4623,8 @@ bool GLCanvas3D::_init_main_toolbar()
return res;
};
- item.enabling_callback = []()->bool { return wxGetApp().plater()->can_layers_editing(); };
+ item.enabling_callback = []()->bool { return wxGetApp().plater()->can_layers_editing(); };
+ item.left.render_callback = GLToolbarItem::Default_Render_Callback;
if (!m_main_toolbar.add_item(item))
return false;
@@ -4775,18 +4656,24 @@ bool GLCanvas3D::_init_undoredo_toolbar()
m_undoredo_toolbar.set_vertical_orientation(GLToolbar::Layout::VO_Top);
m_undoredo_toolbar.set_border(5.0f);
m_undoredo_toolbar.set_separator_size(5);
- m_undoredo_toolbar.set_gap_size(2);
+ m_undoredo_toolbar.set_gap_size(4);
GLToolbarItem::Data item;
item.name = "undo";
item.icon_filename = "undo_toolbar.svg";
- item.tooltip = _utf8(L("Undo")) + " [" + GUI::shortkey_ctrl_prefix() + "Z]\n" + _utf8(L("Click right mouse button to open History"));
+ item.tooltip = _utf8(L("Undo")) + " [" + GUI::shortkey_ctrl_prefix() + "Z]\n" + _utf8(L("Click right mouse button to open/close History"));
item.sprite_id = 0;
item.left.action_callback = [this]() { post_event(SimpleEvent(EVT_GLCANVAS_UNDO)); };
item.right.toggable = true;
item.right.action_callback = [this]() { m_imgui_undo_redo_hovered_pos = -1; };
- item.right.render_callback = [this](float left, float right, float, float) { if (m_canvas != nullptr) _render_undo_redo_stack(true, 0.5f * (left + right)); };
+ item.right.render_callback = [this](float left, float right, float, float) {
+ if (m_canvas != nullptr)
+ {
+ if (_render_undo_redo_stack(true, 0.5f * (left + right)))
+ _deactivate_undo_redo_toolbar_items();
+ }
+ };
item.enabling_callback = [this]()->bool {
bool can_undo = wxGetApp().plater()->can_undo();
int id = m_undoredo_toolbar.get_item_id("undo");
@@ -4814,11 +4701,17 @@ bool GLCanvas3D::_init_undoredo_toolbar()
item.name = "redo";
item.icon_filename = "redo_toolbar.svg";
- item.tooltip = _utf8(L("Redo")) + " [" + GUI::shortkey_ctrl_prefix() + "Y]\n" + _utf8(L("Click right mouse button to open History"));
+ item.tooltip = _utf8(L("Redo")) + " [" + GUI::shortkey_ctrl_prefix() + "Y]\n" + _utf8(L("Click right mouse button to open/close History"));
item.sprite_id = 1;
item.left.action_callback = [this]() { post_event(SimpleEvent(EVT_GLCANVAS_REDO)); };
item.right.action_callback = [this]() { m_imgui_undo_redo_hovered_pos = -1; };
- item.right.render_callback = [this](float left, float right, float, float) { if (m_canvas != nullptr) _render_undo_redo_stack(false, 0.5f * (left + right)); };
+ item.right.render_callback = [this](float left, float right, float, float) {
+ if (m_canvas != nullptr)
+ {
+ if (_render_undo_redo_stack(false, 0.5f * (left + right)))
+ _deactivate_undo_redo_toolbar_items();
+ }
+ };
item.enabling_callback = [this]()->bool {
bool can_redo = wxGetApp().plater()->can_redo();
int id = m_undoredo_toolbar.get_item_id("redo");
@@ -4843,7 +4736,10 @@ bool GLCanvas3D::_init_undoredo_toolbar()
if (!m_undoredo_toolbar.add_item(item))
return false;
-
+ /*
+ if (!m_undoredo_toolbar.add_separator())
+ return false;
+ */
return true;
}
@@ -4852,6 +4748,11 @@ bool GLCanvas3D::_init_view_toolbar()
return wxGetApp().plater()->init_view_toolbar();
}
+bool GLCanvas3D::_init_collapse_toolbar()
+{
+ return wxGetApp().plater()->init_collapse_toolbar();
+}
+
bool GLCanvas3D::_set_current()
{
return m_context != nullptr && m_canvas->SetCurrent(*m_context);
@@ -4859,7 +4760,7 @@ bool GLCanvas3D::_set_current()
void GLCanvas3D::_resize(unsigned int w, unsigned int h)
{
- if ((m_canvas == nullptr) && (m_context == nullptr))
+ if (m_canvas == nullptr && m_context == nullptr)
return;
auto *imgui = wxGetApp().imgui();
@@ -4889,28 +4790,23 @@ BoundingBoxf3 GLCanvas3D::_max_bounding_box(bool include_gizmos, bool include_be
bb.merge(BoundingBoxf3(sel_bb_center - extend_by, sel_bb_center + extend_by));
}
- bb.merge(m_bed.get_bounding_box(include_bed_model));
+ bb.merge(wxGetApp().plater()->get_bed().get_bounding_box(include_bed_model));
+
+ if (!m_main_toolbar.is_enabled())
+ bb.merge(m_gcode_viewer.get_max_bounding_box());
+
return bb;
}
-#if ENABLE_THUMBNAIL_GENERATOR
void GLCanvas3D::_zoom_to_box(const BoundingBoxf3& box, double margin_factor)
{
- m_camera.zoom_to_box(box, margin_factor);
+ wxGetApp().plater()->get_camera().zoom_to_box(box, margin_factor);
m_dirty = true;
}
-#else
-void GLCanvas3D::_zoom_to_box(const BoundingBoxf3& box)
-{
- const Size& cnv_size = get_canvas_size();
- m_camera.zoom_to_box(box, cnv_size.get_width(), cnv_size.get_height());
- m_dirty = true;
-}
-#endif // ENABLE_THUMBNAIL_GENERATOR
void GLCanvas3D::_update_camera_zoom(double zoom)
{
- m_camera.update_zoom(zoom);
+ wxGetApp().plater()->get_camera().update_zoom(zoom);
m_dirty = true;
}
@@ -4929,8 +4825,7 @@ void GLCanvas3D::_refresh_if_shown_on_screen()
void GLCanvas3D::_picking_pass() const
{
- if (m_picking_enabled && !m_mouse.dragging && (m_mouse.position != Vec2d(DBL_MAX, DBL_MAX)))
- {
+ if (m_picking_enabled && !m_mouse.dragging && m_mouse.position != Vec2d(DBL_MAX, DBL_MAX)) {
m_hover_volume_idxs.clear();
// Render the object for picking.
@@ -4946,7 +4841,7 @@ void GLCanvas3D::_picking_pass() const
glsafe(::glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT));
- m_camera_clipping_plane = m_gizmos.get_sla_clipping_plane();
+ m_camera_clipping_plane = m_gizmos.get_clipping_plane();
if (m_camera_clipping_plane.is_active()) {
::glClipPlane(GL_CLIP_PLANE0, (GLdouble*)m_camera_clipping_plane.get_data());
::glEnable(GL_CLIP_PLANE0);
@@ -4964,17 +4859,17 @@ void GLCanvas3D::_picking_pass() const
GLubyte color[4] = { 0, 0, 0, 0 };
const Size& cnv_size = get_canvas_size();
- bool inside = (0 <= m_mouse.position(0)) && (m_mouse.position(0) < cnv_size.get_width()) && (0 <= m_mouse.position(1)) && (m_mouse.position(1) < cnv_size.get_height());
- if (inside)
- {
+ bool inside = 0 <= m_mouse.position(0) && m_mouse.position(0) < cnv_size.get_width() && 0 <= m_mouse.position(1) && m_mouse.position(1) < cnv_size.get_height();
+ if (inside) {
glsafe(::glReadPixels(m_mouse.position(0), cnv_size.get_height() - m_mouse.position(1) - 1, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, (void*)color));
if (picking_checksum_alpha_channel(color[0], color[1], color[2]) == color[3])
// Only non-interpolated colors are valid, those have their lowest three bits zeroed.
volume_id = color[0] + (color[1] << 8) + (color[2] << 16);
}
- if ((0 <= volume_id) && (volume_id < (int)m_volumes.volumes.size()))
- {
- m_hover_volume_idxs.emplace_back(volume_id);
+ if (0 <= volume_id && volume_id < (int)m_volumes.volumes.size()) {
+ // do not add the volume id if any gizmo is active and CTRL is pressed
+ if (m_gizmos.get_current_type() == GLGizmosManager::EType::Undefined || !wxGetKeyState(WXK_CONTROL))
+ m_hover_volume_idxs.emplace_back(volume_id);
m_gizmos.set_hover_id(-1);
}
else
@@ -5059,8 +4954,38 @@ void GLCanvas3D::_rectangular_selection_picking_pass() const
_update_volumes_hover_state();
}
+static BoundingBoxf3 print_volume(const DynamicPrintConfig& config)
+{
+ // tolerance to avoid false detection at bed edges
+ const double tolerance_x = 0.05;
+ const double tolerance_y = 0.05;
+
+ BoundingBoxf3 ret;
+ const ConfigOptionPoints* opt = dynamic_cast<const ConfigOptionPoints*>(config.option("bed_shape"));
+ if (opt != nullptr) {
+ BoundingBox bed_box_2D = get_extents(Polygon::new_scale(opt->values));
+ ret = BoundingBoxf3(Vec3d(unscale<double>(bed_box_2D.min(0)) - tolerance_x, unscale<double>(bed_box_2D.min(1)) - tolerance_y, 0.0), Vec3d(unscale<double>(bed_box_2D.max(0)) + tolerance_x, unscale<double>(bed_box_2D.max(1)) + tolerance_y, config.opt_float("max_print_height")));
+ // Allow the objects to protrude below the print bed
+ ret.min(2) = -1e10;
+ }
+ return ret;
+}
+
void GLCanvas3D::_render_background() const
{
+ bool use_error_color = false;
+ if (wxGetApp().is_editor()) {
+ use_error_color = m_dynamic_background_enabled &&
+ (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA || !m_volumes.empty());
+
+ if (!m_volumes.empty())
+ use_error_color &= _is_any_volume_outside();
+ else {
+ BoundingBoxf3 test_volume = (m_config != nullptr) ? print_volume(*m_config) : BoundingBoxf3();
+ use_error_color &= (test_volume.radius() > 0.0) ? !test_volume.contains(m_gcode_viewer.get_paths_bounding_box()) : false;
+ }
+ }
+
glsafe(::glPushMatrix());
glsafe(::glLoadIdentity());
glsafe(::glMatrixMode(GL_PROJECTION));
@@ -5071,7 +4996,7 @@ void GLCanvas3D::_render_background() const
glsafe(::glDisable(GL_DEPTH_TEST));
::glBegin(GL_QUADS);
- if (m_dynamic_background_enabled && _is_any_volume_outside())
+ if (use_error_color)
::glColor3fv(ERROR_BG_DARK_COLOR);
else
::glColor3fv(DEFAULT_BG_DARK_COLOR);
@@ -5079,7 +5004,7 @@ void GLCanvas3D::_render_background() const
::glVertex2f(-1.0f, -1.0f);
::glVertex2f(1.0f, -1.0f);
- if (m_dynamic_background_enabled && _is_any_volume_outside())
+ if (use_error_color)
::glColor3fv(ERROR_BG_LIGHT_COLOR);
else
::glColor3fv(DEFAULT_BG_LIGHT_COLOR);
@@ -5095,13 +5020,20 @@ void GLCanvas3D::_render_background() const
glsafe(::glPopMatrix());
}
-void GLCanvas3D::_render_bed(float theta, bool show_axes) const
+void GLCanvas3D::_render_bed(bool bottom, bool show_axes) const
{
float scale_factor = 1.0;
#if ENABLE_RETINA_GL
scale_factor = m_retina_helper->get_scale_factor();
#endif // ENABLE_RETINA_GL
- m_bed.render(const_cast<GLCanvas3D&>(*this), theta, scale_factor, show_axes);
+
+ bool show_texture = ! bottom ||
+ (m_gizmos.get_current_type() != GLGizmosManager::FdmSupports
+ && m_gizmos.get_current_type() != GLGizmosManager::SlaSupports
+ && m_gizmos.get_current_type() != GLGizmosManager::Hollow
+ && m_gizmos.get_current_type() != GLGizmosManager::Seam);
+
+ wxGetApp().plater()->get_bed().render(const_cast<GLCanvas3D&>(*this), bottom, scale_factor, show_axes, show_texture);
}
void GLCanvas3D::_render_objects() const
@@ -5109,22 +5041,17 @@ void GLCanvas3D::_render_objects() const
if (m_volumes.empty())
return;
-#if !ENABLE_THUMBNAIL_GENERATOR
- glsafe(::glEnable(GL_LIGHTING));
-#endif // !ENABLE_THUMBNAIL_GENERATOR
glsafe(::glEnable(GL_DEPTH_TEST));
- m_camera_clipping_plane = m_gizmos.get_sla_clipping_plane();
+ m_camera_clipping_plane = m_gizmos.get_clipping_plane();
- if (m_picking_enabled)
- {
+ if (m_picking_enabled) {
// Update the layer editing selection to the first object selected, update the current object maximum Z.
const_cast<LayersEditing&>(m_layers_editing).select_object(*m_model, this->is_layers_editing_enabled() ? m_selection.get_object_idx() : -1);
- if (m_config != nullptr)
- {
- const BoundingBoxf3& bed_bb = m_bed.get_bounding_box(false);
- m_volumes.set_print_box((float)bed_bb.min(0), (float)bed_bb.min(1), 0.0f, (float)bed_bb.max(0), (float)bed_bb.max(1), (float)m_config->opt_float("max_print_height"));
+ if (m_config != nullptr) {
+ const BoundingBoxf3& bed_bb = wxGetApp().plater()->get_bed().get_bounding_box(false);
+ m_volumes.set_print_box((float)bed_bb.min(0) - BedEpsilon, (float)bed_bb.min(1) - BedEpsilon, 0.0f, (float)bed_bb.max(0) + BedEpsilon, (float)bed_bb.max(1) + BedEpsilon, (float)m_config->opt_float("max_print_height"));
m_volumes.check_outside_state(m_config, nullptr);
}
}
@@ -5136,28 +5063,49 @@ void GLCanvas3D::_render_objects() const
m_volumes.set_clipping_plane(m_camera_clipping_plane.get_data());
- m_shader.start_using();
- if (m_picking_enabled && !m_gizmos.is_dragging() && m_layers_editing.is_enabled() && (m_layers_editing.last_object_id != -1) && (m_layers_editing.object_max_z() > 0.0f)) {
- int object_id = m_layers_editing.last_object_id;
- m_volumes.render(GLVolumeCollection::Opaque, false, m_camera.get_view_matrix(), [object_id](const GLVolume& volume) {
- // Which volume to paint without the layer height profile shader?
- return volume.is_active && (volume.is_modifier || volume.composite_id.object_id != object_id);
- });
- // Let LayersEditing handle rendering of the active object using the layer height profile shader.
- m_layers_editing.render_volumes(*this, this->m_volumes);
- } else {
+ GLShaderProgram* shader = wxGetApp().get_shader("gouraud");
+ if (shader != nullptr) {
+ shader->start_using();
+
+ if (m_picking_enabled && !m_gizmos.is_dragging() && m_layers_editing.is_enabled() && (m_layers_editing.last_object_id != -1) && (m_layers_editing.object_max_z() > 0.0f)) {
+ int object_id = m_layers_editing.last_object_id;
+ m_volumes.render(GLVolumeCollection::Opaque, false, wxGetApp().plater()->get_camera().get_view_matrix(), [object_id](const GLVolume& volume) {
+ // Which volume to paint without the layer height profile shader?
+ return volume.is_active && (volume.is_modifier || volume.composite_id.object_id != object_id);
+ });
+ // Let LayersEditing handle rendering of the active object using the layer height profile shader.
+ m_layers_editing.render_volumes(*this, this->m_volumes);
+ } else {
// do not cull backfaces to show broken geometry, if any
- m_volumes.render(GLVolumeCollection::Opaque, m_picking_enabled, m_camera.get_view_matrix(), [this](const GLVolume& volume) {
+ m_volumes.render(GLVolumeCollection::Opaque, m_picking_enabled, wxGetApp().plater()->get_camera().get_view_matrix(), [this](const GLVolume& volume) {
return (m_render_sla_auxiliaries || volume.composite_id.volume_id >= 0);
- });
+ });
+ }
+
+ // In case a painting gizmo is open, it should render the painted triangles
+ // before transparent objects are rendered. Otherwise they would not be
+ // visible when inside modifier meshes etc.
+ {
+ const GLGizmosManager& gm = get_gizmos_manager();
+ GLGizmosManager::EType type = gm.get_current_type();
+ if (type == GLGizmosManager::FdmSupports
+ || type == GLGizmosManager::Seam) {
+ shader->stop_using();
+ gm.render_painter_gizmo();
+ shader->start_using();
+ }
+ }
+
+ m_volumes.render(GLVolumeCollection::Transparent, false, wxGetApp().plater()->get_camera().get_view_matrix());
+ shader->stop_using();
}
- m_volumes.render(GLVolumeCollection::Transparent, false, m_camera.get_view_matrix());
- m_shader.stop_using();
m_camera_clipping_plane = ClippingPlane::ClipsNothing();
-#if !ENABLE_THUMBNAIL_GENERATOR
- glsafe(::glDisable(GL_LIGHTING));
-#endif // !ENABLE_THUMBNAIL_GENERATOR
+}
+
+void GLCanvas3D::_render_gcode() const
+{
+ m_gcode_viewer.render();
}
void GLCanvas3D::_render_selection() const
@@ -5165,7 +5113,7 @@ void GLCanvas3D::_render_selection() const
float scale_factor = 1.0;
#if ENABLE_RETINA_GL
scale_factor = m_retina_helper->get_scale_factor();
-#endif
+#endif // ENABLE_RETINA_GL
if (!m_gizmos.is_running())
m_selection.render(scale_factor);
@@ -5178,35 +5126,86 @@ void GLCanvas3D::_render_selection_center() const
}
#endif // ENABLE_RENDER_SELECTION_CENTER
+void GLCanvas3D::_check_and_update_toolbar_icon_scale() const
+{
+ // Don't update a toolbar scale, when we are on a Preview
+ if (wxGetApp().plater()->is_preview_shown())
+ return;
+
+ float scale = wxGetApp().toolbar_icon_scale();
+ Size cnv_size = get_canvas_size();
+
+ float size = GLToolbar::Default_Icons_Size * scale;
+
+ // Set current size for all top toolbars. It will be used for next calculations
+ GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar();
+#if ENABLE_RETINA_GL
+ const float sc = m_retina_helper->get_scale_factor() * scale;
+ m_main_toolbar.set_scale(sc);
+ m_undoredo_toolbar.set_scale(sc);
+ collapse_toolbar.set_scale(sc);
+ size *= m_retina_helper->get_scale_factor();
+#else
+ m_main_toolbar.set_icons_size(size);
+ m_undoredo_toolbar.set_icons_size(size);
+ collapse_toolbar.set_icons_size(size);
+#endif // ENABLE_RETINA_GL
+
+ float top_tb_width = m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar.get_width();
+ int items_cnt = m_main_toolbar.get_visible_items_cnt() + m_undoredo_toolbar.get_visible_items_cnt() + collapse_toolbar.get_visible_items_cnt();
+ float noitems_width = top_tb_width - size * items_cnt; // width of separators and borders in top toolbars
+
+ // calculate scale needed for items in all top toolbars
+ float new_h_scale = (cnv_size.get_width() - noitems_width) / (items_cnt * GLToolbar::Default_Icons_Size);
+
+ items_cnt = m_gizmos.get_selectable_icons_cnt() + 3; // +3 means a place for top and view toolbars and separators in gizmos toolbar
+
+ // calculate scale needed for items in the gizmos toolbar
+ float new_v_scale = cnv_size.get_height() / (items_cnt * GLGizmosManager::Default_Icons_Size);
+
+ // set minimum scale as a auto scale for the toolbars
+ float new_scale = std::min(new_h_scale, new_v_scale);
+#if ENABLE_RETINA_GL
+ new_scale /= m_retina_helper->get_scale_factor();
+#endif
+ if (fabs(new_scale - scale) > 0.01) // scale is changed by 1% and more
+ wxGetApp().set_auto_toolbar_icon_scale(new_scale);
+}
+
void GLCanvas3D::_render_overlays() const
{
glsafe(::glDisable(GL_DEPTH_TEST));
glsafe(::glPushMatrix());
glsafe(::glLoadIdentity());
// ensure that the textures are renderered inside the frustrum
- glsafe(::glTranslated(0.0, 0.0, -(m_camera.get_near_z() + 0.005)));
+ const Camera& camera = wxGetApp().plater()->get_camera();
+ glsafe(::glTranslated(0.0, 0.0, -(camera.get_near_z() + 0.005)));
// ensure that the overlay fits the frustrum near z plane
- double gui_scale = m_camera.get_gui_scale();
+ double gui_scale = camera.get_gui_scale();
glsafe(::glScaled(gui_scale, gui_scale, 1.0));
+ _check_and_update_toolbar_icon_scale();
+
_render_gizmos_overlay();
_render_warning_texture();
- _render_legend_texture();
// main toolbar and undoredo toolbar need to be both updated before rendering because both their sizes are needed
// to correctly place them
#if ENABLE_RETINA_GL
- const float scale = m_retina_helper->get_scale_factor() * wxGetApp().toolbar_icon_scale(true);
+ const float scale = m_retina_helper->get_scale_factor() * wxGetApp().toolbar_icon_scale(/*true*/);
m_main_toolbar.set_scale(scale);
m_undoredo_toolbar.set_scale(scale);
+ wxGetApp().plater()->get_collapse_toolbar().set_scale(scale);
#else
- const float size = int(GLToolbar::Default_Icons_Size * wxGetApp().toolbar_icon_scale(true));
+ const float size = int(GLToolbar::Default_Icons_Size * wxGetApp().toolbar_icon_scale(/*true*/));
m_main_toolbar.set_icons_size(size);
m_undoredo_toolbar.set_icons_size(size);
+ wxGetApp().plater()->get_collapse_toolbar().set_icons_size(size);
#endif // ENABLE_RETINA_GL
_render_main_toolbar();
_render_undoredo_toolbar();
+ _render_collapse_toolbar();
_render_view_toolbar();
if ((m_layers_editing.last_object_id >= 0) && (m_layers_editing.object_max_z() > 0.0f))
@@ -5231,14 +5230,6 @@ void GLCanvas3D::_render_warning_texture() const
m_warning_texture.render(*this);
}
-void GLCanvas3D::_render_legend_texture() const
-{
- if (!m_legend_texture_enabled)
- return;
-
- m_legend_texture.render(*this);
-}
-
void GLCanvas3D::_render_volumes_for_picking() const
{
static const GLfloat INV_255 = 1.0f / 255.0f;
@@ -5249,7 +5240,7 @@ void GLCanvas3D::_render_volumes_for_picking() const
glsafe(::glEnableClientState(GL_VERTEX_ARRAY));
glsafe(::glEnableClientState(GL_NORMAL_ARRAY));
- const Transform3d& view_matrix = m_camera.get_view_matrix();
+ const Transform3d& view_matrix = wxGetApp().plater()->get_camera().get_view_matrix();
for (size_t type = 0; type < 2; ++ type) {
GLVolumeWithIdAndZList to_render = volumes_to_render(m_volumes.volumes, (type == 0) ? GLVolumeCollection::Opaque : GLVolumeCollection::Transparent, view_matrix);
for (const GLVolumeWithIdAndZ& volume : to_render)
@@ -5298,10 +5289,12 @@ void GLCanvas3D::_render_main_toolbar() const
return;
Size cnv_size = get_canvas_size();
- float inv_zoom = (float)m_camera.get_inv_zoom();
+ float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom();
float top = 0.5f * (float)cnv_size.get_height() * inv_zoom;
- float left = -0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width()) * inv_zoom;
+ const GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar();
+ float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : 0.0f;
+ float left = -0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar_width) * inv_zoom;
m_main_toolbar.set_position(top, left);
m_main_toolbar.render(*this);
@@ -5313,35 +5306,57 @@ void GLCanvas3D::_render_undoredo_toolbar() const
return;
Size cnv_size = get_canvas_size();
- float inv_zoom = (float)m_camera.get_inv_zoom();
+ float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom();
float top = 0.5f * (float)cnv_size.get_height() * inv_zoom;
- float left = (m_main_toolbar.get_width() - 0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width())) * inv_zoom;
+ const GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar();
+ float collapse_toolbar_width = collapse_toolbar.is_enabled() ? collapse_toolbar.get_width() : 0.0f;
+ float left = (m_main_toolbar.get_width() - 0.5f * (m_main_toolbar.get_width() + m_undoredo_toolbar.get_width() + collapse_toolbar_width)) * inv_zoom;
m_undoredo_toolbar.set_position(top, left);
m_undoredo_toolbar.render(*this);
}
+void GLCanvas3D::_render_collapse_toolbar() const
+{
+ GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar();
+
+ Size cnv_size = get_canvas_size();
+ float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom();
+
+ float band = m_layers_editing.is_enabled() ? (wxGetApp().imgui()->get_style_scaling() * LayersEditing::THICKNESS_BAR_WIDTH) : 0.0;
+
+ float top = 0.5f * (float)cnv_size.get_height() * inv_zoom;
+ float left = (0.5f * (float)cnv_size.get_width() - (float)collapse_toolbar.get_width() - band) * inv_zoom;
+
+ collapse_toolbar.set_position(top, left);
+ collapse_toolbar.render(*this);
+}
+
void GLCanvas3D::_render_view_toolbar() const
{
+ GLToolbar& view_toolbar = wxGetApp().plater()->get_view_toolbar();
+
#if ENABLE_RETINA_GL
-// m_view_toolbar.set_scale(m_retina_helper->get_scale_factor());
const float scale = m_retina_helper->get_scale_factor() * wxGetApp().toolbar_icon_scale();
- m_view_toolbar.set_scale(scale); //! #ys_FIXME_experiment
+#if __APPLE__
+ view_toolbar.set_scale(scale);
+#else // if GTK3
+ const float size = int(GLGizmosManager::Default_Icons_Size * scale);
+ view_toolbar.set_icons_size(size);
+#endif // __APPLE__
#else
-// m_view_toolbar.set_scale(m_canvas->GetContentScaleFactor());
-// m_view_toolbar.set_scale(wxGetApp().em_unit()*0.1f);
const float size = int(GLGizmosManager::Default_Icons_Size * wxGetApp().toolbar_icon_scale());
- m_view_toolbar.set_icons_size(size); //! #ys_FIXME_experiment
+ view_toolbar.set_icons_size(size);
#endif // ENABLE_RETINA_GL
Size cnv_size = get_canvas_size();
- float inv_zoom = (float)m_camera.get_inv_zoom();
+ float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom();
// places the toolbar on the bottom-left corner of the 3d scene
- float top = (-0.5f * (float)cnv_size.get_height() + m_view_toolbar.get_height()) * inv_zoom;
+ float top = (-0.5f * (float)cnv_size.get_height() + view_toolbar.get_height()) * inv_zoom;
float left = -0.5f * (float)cnv_size.get_width() * inv_zoom;
- m_view_toolbar.set_position(top, left);
- m_view_toolbar.render(*this);
+ view_toolbar.set_position(top, left);
+ view_toolbar.render(*this);
}
#if ENABLE_SHOW_CAMERA_TARGET
@@ -5493,7 +5508,7 @@ void GLCanvas3D::_render_sla_slices() const
void GLCanvas3D::_render_selection_sidebar_hints() const
{
- m_selection.render_sidebar_hints(m_sidebar_field, m_shader);
+ m_selection.render_sidebar_hints(m_sidebar_field);
}
void GLCanvas3D::_update_volumes_hover_state() const
@@ -5620,10 +5635,10 @@ Vec3d GLCanvas3D::_mouse_to_3d(const Point& mouse_pos, float* z)
if (m_canvas == nullptr)
return Vec3d(DBL_MAX, DBL_MAX, DBL_MAX);
-
- const std::array<int, 4>& viewport = m_camera.get_viewport();
- const Transform3d& modelview_matrix = m_camera.get_view_matrix();
- const Transform3d& projection_matrix = m_camera.get_projection_matrix();
+ const Camera& camera = wxGetApp().plater()->get_camera();
+ const std::array<int, 4>& viewport = camera.get_viewport();
+ const Transform3d& modelview_matrix = camera.get_view_matrix();
+ const Transform3d& projection_matrix = camera.get_projection_matrix();
GLint y = viewport[3] - (GLint)mouse_pos(1);
GLfloat mouse_z;
@@ -5738,7 +5753,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c
// For coloring by a color_print(M600), return a parsed color.
bool color_by_color_print() const { return color_print_values!=nullptr; }
const size_t color_print_color_idx_by_layer_idx(const size_t layer_idx) const {
- const CustomGCode::Item value{layers[layer_idx]->print_z + EPSILON, "", 0, ""};
+ const CustomGCode::Item value{layers[layer_idx]->print_z + EPSILON, CustomGCode::Custom, 0, ""};
auto it = std::lower_bound(color_print_values->begin(), color_print_values->end(), value);
return (it - color_print_values->begin()) % number_tools();
}
@@ -5752,36 +5767,36 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c
{ return fabs(code.print_z - print_z) < EPSILON; });
if (it != color_print_values->end())
{
- const std::string& code = it->gcode;
+ CustomGCode::Type type = it->type;
// pause print or custom Gcode
- if (code == PausePrintCode ||
- (code != ColorChangeCode && code != ToolChangeCode))
+ if (type == CustomGCode::PausePrint ||
+ (type != CustomGCode::ColorChange && type != CustomGCode::ToolChange))
return number_tools()-1; // last color item is a gray color for pause print or custom G-code
// change tool (extruder)
- if (code == ToolChangeCode)
+ if (type == CustomGCode::ToolChange)
return get_color_idx_for_tool_change(it, extruder);
// change color for current extruder
- if (code == ColorChangeCode) {
+ if (type == CustomGCode::ColorChange) {
int color_idx = get_color_idx_for_color_change(it, extruder);
if (color_idx >= 0)
return color_idx;
}
}
- const CustomGCode::Item value{print_z + EPSILON, "", 0, ""};
+ const CustomGCode::Item value{print_z + EPSILON, CustomGCode::Custom, 0, ""};
it = std::lower_bound(color_print_values->begin(), color_print_values->end(), value);
while (it != color_print_values->begin())
{
--it;
// change color for current extruder
- if (it->gcode == ColorChangeCode) {
+ if (it->type == CustomGCode::ColorChange) {
int color_idx = get_color_idx_for_color_change(it, extruder);
if (color_idx >= 0)
return color_idx;
}
// change tool (extruder)
- if (it->gcode == ToolChangeCode)
+ if (it->type == CustomGCode::ToolChange)
return get_color_idx_for_tool_change(it, extruder);
}
@@ -5794,7 +5809,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c
int shift = 0;
while (it != color_print_values->begin()) {
--it;
- if (it->gcode == ColorChangeCode)
+ if (it->type == CustomGCode::ColorChange)
shift++;
}
return extruders_cnt + shift;
@@ -5809,7 +5824,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c
auto it_n = it;
while (it_n != color_print_values->begin()) {
--it_n;
- if (it_n->gcode == ColorChangeCode && it_n->extruder == current_extruder)
+ if (it_n->type == CustomGCode::ColorChange && it_n->extruder == current_extruder)
return get_m600_color_idx(it_n);
}
@@ -5825,7 +5840,7 @@ void GLCanvas3D::_load_print_object_toolpaths(const PrintObject& print_object, c
bool is_tool_change = false;
while (it_n != color_print_values->begin()) {
--it_n;
- if (it_n->gcode == ToolChangeCode) {
+ if (it_n->type == CustomGCode::ToolChange) {
is_tool_change = true;
if (it_n->extruder == it->extruder || (it_n->extruder == 0 && it->extruder == extruder))
return get_m600_color_idx(it);
@@ -6163,334 +6178,6 @@ void GLCanvas3D::_load_wipe_tower_toolpaths(const std::vector<std::string>& str_
BOOST_LOG_TRIVIAL(debug) << "Loading wipe tower toolpaths in parallel - end" << m_volumes.log_memory_info() << log_memory_info();
}
-static inline int hex_digit_to_int(const char c)
-{
- return
- (c >= '0' && c <= '9') ? int(c - '0') :
- (c >= 'A' && c <= 'F') ? int(c - 'A') + 10 :
- (c >= 'a' && c <= 'f') ? int(c - 'a') + 10 : -1;
-}
-
-void GLCanvas3D::_load_gcode_extrusion_paths(const GCodePreviewData& preview_data, const std::vector<float>& tool_colors)
-{
- BOOST_LOG_TRIVIAL(debug) << "Loading G-code extrusion paths - start" << m_volumes.log_memory_info() << log_memory_info();
-
- // helper functions to select data in dependence of the extrusion view type
- struct Helper
- {
- static float path_filter(GCodePreviewData::Extrusion::EViewType type, const GCodePreviewData::Extrusion::Path& path)
- {
- switch (type)
- {
- case GCodePreviewData::Extrusion::FeatureType:
- // The role here is used for coloring.
- return (float)path.extrusion_role;
- case GCodePreviewData::Extrusion::Height:
- return path.height;
- case GCodePreviewData::Extrusion::Width:
- return path.width;
- case GCodePreviewData::Extrusion::Feedrate:
- return path.feedrate;
- case GCodePreviewData::Extrusion::FanSpeed:
- return path.fan_speed;
- case GCodePreviewData::Extrusion::VolumetricRate:
- return path.feedrate * (float)path.mm3_per_mm;
- case GCodePreviewData::Extrusion::Tool:
- return (float)path.extruder_id;
- case GCodePreviewData::Extrusion::ColorPrint:
- return (float)path.cp_color_id;
- default:
- return 0.0f;
- }
-
- return 0.0f;
- }
-
- static Color path_color(const GCodePreviewData& data, const std::vector<float>& tool_colors, float value)
- {
- switch (data.extrusion.view_type)
- {
- case GCodePreviewData::Extrusion::FeatureType:
- return data.get_extrusion_role_color((ExtrusionRole)(int)value);
- case GCodePreviewData::Extrusion::Height:
- return data.get_height_color(value);
- case GCodePreviewData::Extrusion::Width:
- return data.get_width_color(value);
- case GCodePreviewData::Extrusion::Feedrate:
- return data.get_feedrate_color(value);
- case GCodePreviewData::Extrusion::FanSpeed:
- return data.get_fan_speed_color(value);
- case GCodePreviewData::Extrusion::VolumetricRate:
- return data.get_volumetric_rate_color(value);
- case GCodePreviewData::Extrusion::Tool:
- {
- Color color;
- ::memcpy((void*)color.rgba.data(), (const void*)(tool_colors.data() + (unsigned int)value * 4), 4 * sizeof(float));
- return color;
- }
- case GCodePreviewData::Extrusion::ColorPrint:
- {
- int color_cnt = (int)tool_colors.size() / 4;
- int val = value > color_cnt ? color_cnt - 1 : value;
-
- Color color;
- ::memcpy((void*)color.rgba.data(), (const void*)(tool_colors.data() + val * 4), 4 * sizeof(float));
-
- return color;
- }
- default:
- return Color{};
- }
-
- return Color{};
- }
- };
-
- size_t initial_volumes_count = m_volumes.volumes.size();
- size_t initial_volume_index_count = m_gcode_preview_volume_index.first_volumes.size();
-
- try
- {
- BOOST_LOG_TRIVIAL(debug) << "Loading G-code extrusion paths - create volumes" << m_volumes.log_memory_info() << log_memory_info();
-
- // detects filters
- size_t vertex_buffer_prealloc_size = 0;
- std::vector<std::vector<std::pair<float, GLVolume*>>> roles_filters;
- {
- std::vector<size_t> num_paths_per_role(size_t(erCount), 0);
- for (const GCodePreviewData::Extrusion::Layer &layer : preview_data.extrusion.layers)
- for (const GCodePreviewData::Extrusion::Path &path : layer.paths)
- ++ num_paths_per_role[size_t(path.extrusion_role)];
- std::vector<std::vector<float>> roles_values;
- roles_values.assign(size_t(erCount), std::vector<float>());
- for (size_t i = 0; i < roles_values.size(); ++ i)
- roles_values[i].reserve(num_paths_per_role[i]);
- for (const GCodePreviewData::Extrusion::Layer& layer : preview_data.extrusion.layers)
- for (const GCodePreviewData::Extrusion::Path &path : layer.paths)
- roles_values[size_t(path.extrusion_role)].emplace_back(Helper::path_filter(preview_data.extrusion.view_type, path));
- roles_filters.reserve(size_t(erCount));
- size_t num_buffers = 0;
- for (std::vector<float> &values : roles_values) {
- sort_remove_duplicates(values);
- num_buffers += values.size();
- }
- if (num_buffers == 0)
- // nothing to render, return
- return;
- vertex_buffer_prealloc_size = (uint64_t(num_buffers) * uint64_t(VERTEX_BUFFER_RESERVE_SIZE) < VERTEX_BUFFER_RESERVE_SIZE_SUM_MAX) ?
- VERTEX_BUFFER_RESERVE_SIZE : next_highest_power_of_2(VERTEX_BUFFER_RESERVE_SIZE_SUM_MAX / num_buffers) / 2;
- for (std::vector<float> &values : roles_values) {
- size_t role = &values - &roles_values.front();
- roles_filters.emplace_back();
- if (! values.empty()) {
- m_gcode_preview_volume_index.first_volumes.emplace_back(GCodePreviewVolumeIndex::Extrusion, role, (unsigned int)m_volumes.volumes.size());
- for (const float value : values)
- roles_filters.back().emplace_back(value, m_volumes.new_toolpath_volume(Helper::path_color(preview_data, tool_colors, value).rgba.data(), vertex_buffer_prealloc_size));
- }
- }
- }
-
- BOOST_LOG_TRIVIAL(debug) << "Loading G-code extrusion paths - populate volumes" << m_volumes.log_memory_info() << log_memory_info();
-
- // populates volumes
- const bool is_selected_separate_extruder = m_selected_extruder > 0 && preview_data.extrusion.view_type == GCodePreviewData::Extrusion::ColorPrint;
- for (const GCodePreviewData::Extrusion::Layer& layer : preview_data.extrusion.layers)
- {
- for (const GCodePreviewData::Extrusion::Path& path : layer.paths)
- {
- if (is_selected_separate_extruder && path.extruder_id != m_selected_extruder - 1)
- continue;
- std::vector<std::pair<float, GLVolume*>> &filters = roles_filters[size_t(path.extrusion_role)];
- auto key = std::make_pair<float, GLVolume*>(Helper::path_filter(preview_data.extrusion.view_type, path), nullptr);
- auto it_filter = std::lower_bound(filters.begin(), filters.end(), key);
- assert(it_filter != filters.end() && key.first == it_filter->first);
-
- GLVolume& vol = *it_filter->second;
- vol.print_zs.emplace_back(layer.z);
- vol.offsets.emplace_back(vol.indexed_vertex_array.quad_indices.size());
- vol.offsets.emplace_back(vol.indexed_vertex_array.triangle_indices.size());
-
- _3DScene::extrusionentity_to_verts(path.polyline, path.width, path.height, layer.z, vol);
- }
- // Ensure that no volume grows over the limits. If the volume is too large, allocate a new one.
- for (std::vector<std::pair<float, GLVolume*>> &filters : roles_filters) {
- unsigned int role = (unsigned int)(&filters - &roles_filters.front());
- for (std::pair<float, GLVolume*> &filter : filters)
- if (filter.second->indexed_vertex_array.vertices_and_normals_interleaved.size() > MAX_VERTEX_BUFFER_SIZE) {
- if (m_gcode_preview_volume_index.first_volumes.back().type != GCodePreviewVolumeIndex::Extrusion || m_gcode_preview_volume_index.first_volumes.back().flag != role)
- m_gcode_preview_volume_index.first_volumes.emplace_back(GCodePreviewVolumeIndex::Extrusion, role, (unsigned int)m_volumes.volumes.size());
- GLVolume& vol = *filter.second;
- filter.second = m_volumes.new_toolpath_volume(vol.color);
- reserve_new_volume_finalize_old_volume(*filter.second, vol, m_initialized, vertex_buffer_prealloc_size);
- }
- }
- }
-
- // Finalize volumes and sends geometry to gpu
- for (std::vector<std::pair<float, GLVolume*>> &filters : roles_filters)
- for (std::pair<float, GLVolume*> &filter : filters)
- filter.second->indexed_vertex_array.finalize_geometry(m_initialized);
-
- BOOST_LOG_TRIVIAL(debug) << "Loading G-code extrusion paths - end" << m_volumes.log_memory_info() << log_memory_info();
- }
- catch (const std::bad_alloc & /* err */)
- {
- // an error occourred - restore to previous state and return
- GLVolumePtrs::iterator begin = m_volumes.volumes.begin() + initial_volumes_count;
- GLVolumePtrs::iterator end = m_volumes.volumes.end();
- for (GLVolumePtrs::iterator it = begin; it < end; ++it)
- delete *it;
- m_volumes.volumes.erase(begin, end);
- m_gcode_preview_volume_index.first_volumes.erase(m_gcode_preview_volume_index.first_volumes.begin() + initial_volume_index_count, m_gcode_preview_volume_index.first_volumes.end());
- BOOST_LOG_TRIVIAL(debug) << "Loading G-code extrusion paths - failed on low memory" << m_volumes.log_memory_info() << log_memory_info();
- //FIXME rethrow bad_alloc?
- }
-}
-
-template<typename TYPE, typename FUNC_VALUE, typename FUNC_COLOR>
-inline void travel_paths_internal(
- // input
- const GCodePreviewData &preview_data,
- // accessors
- FUNC_VALUE func_value, FUNC_COLOR func_color,
- // output
- GLVolumeCollection &volumes, bool gl_initialized)
-
-{
- // colors travels by type
- std::vector<std::pair<TYPE, GLVolume*>> by_type;
- {
- std::vector<TYPE> values;
- values.reserve(preview_data.travel.polylines.size());
- for (const GCodePreviewData::Travel::Polyline& polyline : preview_data.travel.polylines)
- values.emplace_back(func_value(polyline));
- sort_remove_duplicates(values);
- by_type.reserve(values.size());
- // creates a new volume for each feedrate
- for (TYPE type : values)
- by_type.emplace_back(type, volumes.new_nontoolpath_volume(func_color(type).rgba.data(), VERTEX_BUFFER_RESERVE_SIZE));
- }
-
- // populates volumes
- std::pair<TYPE, GLVolume*> key(0.f, nullptr);
- for (const GCodePreviewData::Travel::Polyline& polyline : preview_data.travel.polylines)
- {
- key.first = func_value(polyline);
- auto it = std::lower_bound(by_type.begin(), by_type.end(), key, [](const std::pair<TYPE, GLVolume*>& l, const std::pair<TYPE, GLVolume*>& r) { return l.first < r.first; });
- assert(it != by_type.end() && it->first == func_value(polyline));
-
- GLVolume& vol = *it->second;
- vol.print_zs.emplace_back(unscale<double>(polyline.polyline.bounding_box().min(2)));
- vol.offsets.emplace_back(vol.indexed_vertex_array.quad_indices.size());
- vol.offsets.emplace_back(vol.indexed_vertex_array.triangle_indices.size());
-
- _3DScene::polyline3_to_verts(polyline.polyline, preview_data.travel.width, preview_data.travel.height, vol);
-
- // Ensure that no volume grows over the limits. If the volume is too large, allocate a new one.
- if (vol.indexed_vertex_array.vertices_and_normals_interleaved.size() > MAX_VERTEX_BUFFER_SIZE) {
- it->second = volumes.new_nontoolpath_volume(vol.color);
- reserve_new_volume_finalize_old_volume(*it->second, vol, gl_initialized);
- }
- }
-
- for (auto &feedrate : by_type)
- feedrate.second->finalize_geometry(gl_initialized);
-}
-
-void GLCanvas3D::_load_gcode_travel_paths(const GCodePreviewData& preview_data, const std::vector<float>& tool_colors)
-{
- // nothing to render, return
- if (preview_data.travel.polylines.empty())
- return;
-
- size_t initial_volumes_count = m_volumes.volumes.size();
- size_t volume_index_allocated = false;
-
- try {
- m_gcode_preview_volume_index.first_volumes.emplace_back(GCodePreviewVolumeIndex::Travel, 0, (unsigned int)initial_volumes_count);
- volume_index_allocated = true;
-
- switch (preview_data.extrusion.view_type)
- {
- case GCodePreviewData::Extrusion::Feedrate:
- travel_paths_internal<float>(preview_data,
- [](const GCodePreviewData::Travel::Polyline &polyline) { return polyline.feedrate; },
- [&preview_data](const float feedrate) -> const Color { return preview_data.get_feedrate_color(feedrate); },
- m_volumes, m_initialized);
- break;
- case GCodePreviewData::Extrusion::Tool:
- travel_paths_internal<unsigned int>(preview_data,
- [](const GCodePreviewData::Travel::Polyline &polyline) { return polyline.extruder_id; },
- [&tool_colors](const unsigned int extruder_id) -> const Color { assert((extruder_id + 1) * 4 <= tool_colors.size()); return Color(tool_colors.data() + extruder_id * 4); },
- m_volumes, m_initialized);
- break;
- default:
- travel_paths_internal<unsigned int>(preview_data,
- [](const GCodePreviewData::Travel::Polyline &polyline) { return polyline.type; },
- [&preview_data](const unsigned int type) -> const Color& { return preview_data.travel.type_colors[type]; },
- m_volumes, m_initialized);
- break;
- }
- } catch (const std::bad_alloc & /* ex */) {
- // an error occourred - restore to previous state and return
- GLVolumePtrs::iterator begin = m_volumes.volumes.begin() + initial_volumes_count;
- GLVolumePtrs::iterator end = m_volumes.volumes.end();
- for (GLVolumePtrs::iterator it = begin; it < end; ++it)
- delete *it;
- m_volumes.volumes.erase(begin, end);
- if (volume_index_allocated)
- m_gcode_preview_volume_index.first_volumes.pop_back();
- //FIXME report the memory issue?
- }
-}
-
-void GLCanvas3D::_load_fff_shells()
-{
- size_t initial_volumes_count = m_volumes.volumes.size();
- m_gcode_preview_volume_index.first_volumes.emplace_back(GCodePreviewVolumeIndex::Shell, 0, (unsigned int)initial_volumes_count);
-
- const Print *print = this->fff_print();
- if (print->objects().empty())
- // nothing to render, return
- return;
-
- // adds objects' volumes
- int object_id = 0;
- for (const PrintObject* obj : print->objects())
- {
- const ModelObject* model_obj = obj->model_object();
-
- std::vector<int> instance_ids(model_obj->instances.size());
- for (int i = 0; i < (int)model_obj->instances.size(); ++i)
- {
- instance_ids[i] = i;
- }
-
- m_volumes.load_object(model_obj, object_id, instance_ids, "object", m_initialized);
-
- ++object_id;
- }
-
- if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptFFF) {
- // adds wipe tower's volume
- double max_z = print->objects()[0]->model_object()->get_model()->bounding_box().max(2);
- const PrintConfig& config = print->config();
- size_t extruders_count = config.nozzle_diameter.size();
- if ((extruders_count > 1) && config.wipe_tower && !config.complete_objects) {
-
- const DynamicPrintConfig &print_config = wxGetApp().preset_bundle->prints.get_edited_preset().config;
- double layer_height = print_config.opt_float("layer_height");
- double first_layer_height = print_config.get_abs_value("first_layer_height", layer_height);
- double nozzle_diameter = print->config().nozzle_diameter.values[0];
- float depth = print->wipe_tower_data(extruders_count, first_layer_height, nozzle_diameter).depth;
- float brim_width = print->wipe_tower_data(extruders_count, first_layer_height, nozzle_diameter).brim_width;
-
- m_volumes.load_wipe_tower_preview(1000, config.wipe_tower_x, config.wipe_tower_y, config.wipe_tower_width, depth, max_z, config.wipe_tower_rotation_angle,
- !print->is_step_done(psWipeTower), brim_width, m_initialized);
- }
- }
-}
-
// While it looks like we can call
// this->reload_scene(true, true)
// the two functions are quite different:
@@ -6508,7 +6195,11 @@ void GLCanvas3D::_load_sla_shells()
const TriangleMesh &mesh, const float color[4], bool outside_printer_detection_enabled) {
m_volumes.volumes.emplace_back(new GLVolume(color));
GLVolume& v = *m_volumes.volumes.back();
+#if ENABLE_SMOOTH_NORMALS
+ v.indexed_vertex_array.load_mesh(mesh, true);
+#else
v.indexed_vertex_array.load_mesh(mesh);
+#endif // ENABLE_SMOOTH_NORMALS
v.indexed_vertex_array.finalize_geometry(this->m_initialized);
v.shader_outside_printer_detection_enabled = outside_printer_detection_enabled;
v.composite_id.volume_id = volume_id;
@@ -6543,118 +6234,37 @@ void GLCanvas3D::_load_sla_shells()
update_volumes_colors_by_extruder();
}
-void GLCanvas3D::_update_gcode_volumes_visibility(const GCodePreviewData& preview_data)
-{
- unsigned int size = (unsigned int)m_gcode_preview_volume_index.first_volumes.size();
- for (unsigned int i = 0; i < size; ++i)
- {
- GLVolumePtrs::iterator begin = m_volumes.volumes.begin() + m_gcode_preview_volume_index.first_volumes[i].id;
- GLVolumePtrs::iterator end = (i + 1 < size) ? m_volumes.volumes.begin() + m_gcode_preview_volume_index.first_volumes[i + 1].id : m_volumes.volumes.end();
-
- for (GLVolumePtrs::iterator it = begin; it != end; ++it)
- {
- GLVolume* volume = *it;
-
- switch (m_gcode_preview_volume_index.first_volumes[i].type)
- {
- case GCodePreviewVolumeIndex::Extrusion:
- {
- if ((ExtrusionRole)m_gcode_preview_volume_index.first_volumes[i].flag == erCustom)
- volume->zoom_to_volumes = false;
-
- volume->is_active = preview_data.extrusion.is_role_flag_set((ExtrusionRole)m_gcode_preview_volume_index.first_volumes[i].flag);
- break;
- }
- case GCodePreviewVolumeIndex::Travel:
- {
- volume->is_active = preview_data.travel.is_visible;
- volume->zoom_to_volumes = false;
- break;
- }
- case GCodePreviewVolumeIndex::Retraction:
- {
- volume->is_active = preview_data.retraction.is_visible;
- volume->zoom_to_volumes = false;
- break;
- }
- case GCodePreviewVolumeIndex::Unretraction:
- {
- volume->is_active = preview_data.unretraction.is_visible;
- volume->zoom_to_volumes = false;
- break;
- }
- case GCodePreviewVolumeIndex::Shell:
- {
- volume->is_active = preview_data.shell.is_visible;
- volume->color[3] = 0.25f;
- volume->zoom_to_volumes = false;
- break;
- }
- default:
- {
- volume->is_active = false;
- volume->zoom_to_volumes = false;
- break;
- }
- }
- }
- }
-}
-
void GLCanvas3D::_update_toolpath_volumes_outside_state()
{
- // tolerance to avoid false detection at bed edges
- static const double tolerance_x = 0.05;
- static const double tolerance_y = 0.05;
-
- BoundingBoxf3 print_volume;
- if (m_config != nullptr)
- {
- const ConfigOptionPoints* opt = dynamic_cast<const ConfigOptionPoints*>(m_config->option("bed_shape"));
- if (opt != nullptr)
- {
- BoundingBox bed_box_2D = get_extents(Polygon::new_scale(opt->values));
- print_volume = BoundingBoxf3(Vec3d(unscale<double>(bed_box_2D.min(0)) - tolerance_x, unscale<double>(bed_box_2D.min(1)) - tolerance_y, 0.0), Vec3d(unscale<double>(bed_box_2D.max(0)) + tolerance_x, unscale<double>(bed_box_2D.max(1)) + tolerance_y, m_config->opt_float("max_print_height")));
- // Allow the objects to protrude below the print bed
- print_volume.min(2) = -1e10;
- }
- }
-
- for (GLVolume* volume : m_volumes.volumes)
- {
- volume->is_outside = ((print_volume.radius() > 0.0) && volume->is_extrusion_path) ? !print_volume.contains(volume->bounding_box()) : false;
+ BoundingBoxf3 test_volume = (m_config != nullptr) ? print_volume(*m_config) : BoundingBoxf3();
+ for (GLVolume* volume : m_volumes.volumes) {
+ volume->is_outside = ((test_volume.radius() > 0.0) && volume->is_extrusion_path) ? !test_volume.contains(volume->bounding_box()) : false;
}
}
void GLCanvas3D::_update_sla_shells_outside_state()
{
- // tolerance to avoid false detection at bed edges
- static const double tolerance_x = 0.05;
- static const double tolerance_y = 0.05;
-
- BoundingBoxf3 print_volume;
- if (m_config != nullptr)
- {
- const ConfigOptionPoints* opt = dynamic_cast<const ConfigOptionPoints*>(m_config->option("bed_shape"));
- if (opt != nullptr)
- {
- BoundingBox bed_box_2D = get_extents(Polygon::new_scale(opt->values));
- print_volume = BoundingBoxf3(Vec3d(unscale<double>(bed_box_2D.min(0)) - tolerance_x, unscale<double>(bed_box_2D.min(1)) - tolerance_y, 0.0), Vec3d(unscale<double>(bed_box_2D.max(0)) + tolerance_x, unscale<double>(bed_box_2D.max(1)) + tolerance_y, m_config->opt_float("max_print_height")));
- // Allow the objects to protrude below the print bed
- print_volume.min(2) = -1e10;
- }
- }
-
- for (GLVolume* volume : m_volumes.volumes)
- {
- volume->is_outside = ((print_volume.radius() > 0.0) && volume->shader_outside_printer_detection_enabled) ? !print_volume.contains(volume->transformed_convex_hull_bounding_box()) : false;
+ BoundingBoxf3 test_volume = (m_config != nullptr) ? print_volume(*m_config) : BoundingBoxf3();
+ for (GLVolume* volume : m_volumes.volumes) {
+ volume->is_outside = ((test_volume.radius() > 0.0) && volume->shader_outside_printer_detection_enabled) ? !test_volume.contains(volume->transformed_convex_hull_bounding_box()) : false;
}
}
void GLCanvas3D::_show_warning_texture_if_needed(WarningTexture::Warning warning)
{
_set_current();
- _set_warning_texture(warning, _is_any_volume_outside());
+ bool show = false;
+ if (!m_volumes.empty())
+ show = _is_any_volume_outside();
+ else {
+ if (wxGetApp().is_editor()) {
+ BoundingBoxf3 test_volume = (m_config != nullptr) ? print_volume(*m_config) : BoundingBoxf3();
+ const BoundingBoxf3& paths_volume = m_gcode_viewer.get_paths_bounding_box();
+ if (test_volume.radius() > 0.0 && paths_volume.radius() > 0.0)
+ show = !test_volume.contains(paths_volume);
+ }
+ }
+ _set_warning_texture(warning, show);
}
std::vector<float> GLCanvas3D::_parse_colors(const std::vector<std::string>& colors)
@@ -6682,11 +6292,6 @@ std::vector<float> GLCanvas3D::_parse_colors(const std::vector<std::string>& col
return output;
}
-void GLCanvas3D::_generate_legend_texture(const GCodePreviewData& preview_data, const std::vector<float>& tool_colors)
-{
- m_legend_texture.generate(preview_data, tool_colors, *this, true);
-}
-
void GLCanvas3D::_set_warning_texture(WarningTexture::Warning warning, bool state)
{
m_warning_texture.activate(warning, state, *this);
@@ -6694,8 +6299,7 @@ void GLCanvas3D::_set_warning_texture(WarningTexture::Warning warning, bool stat
bool GLCanvas3D::_is_any_volume_outside() const
{
- for (const GLVolume* volume : m_volumes.volumes)
- {
+ for (const GLVolume* volume : m_volumes.volumes) {
if ((volume != nullptr) && volume->is_outside)
return true;
}
@@ -6817,6 +6421,55 @@ bool GLCanvas3D::_deactivate_undo_redo_toolbar_items()
return false;
}
+bool GLCanvas3D::is_search_pressed() const
+{
+ return m_main_toolbar.is_item_pressed("search");
+}
+
+bool GLCanvas3D::_deactivate_arrange_menu()
+{
+ if (m_main_toolbar.is_item_pressed("arrange")) {
+ m_main_toolbar.force_right_action(m_main_toolbar.get_item_id("arrange"), *this);
+ return true;
+ }
+
+ return false;
+}
+
+bool GLCanvas3D::_deactivate_search_toolbar_item()
+{
+ if (is_search_pressed())
+ {
+ m_main_toolbar.force_left_action(m_main_toolbar.get_item_id("search"), *this);
+ return true;
+ }
+
+ return false;
+}
+
+bool GLCanvas3D::_activate_search_toolbar_item()
+{
+ if (!m_main_toolbar.is_item_pressed("search"))
+ {
+ m_main_toolbar.force_left_action(m_main_toolbar.get_item_id("search"), *this);
+ return true;
+ }
+
+ return false;
+}
+
+bool GLCanvas3D::_deactivate_collapse_toolbar_items()
+{
+ GLToolbar& collapse_toolbar = wxGetApp().plater()->get_collapse_toolbar();
+ if (collapse_toolbar.is_item_pressed("print"))
+ {
+ collapse_toolbar.force_left_action(collapse_toolbar.get_item_id("print"), *this);
+ return true;
+ }
+
+ return false;
+}
+
const Print* GLCanvas3D::fff_print() const
{
return (m_process == nullptr) ? nullptr : m_process->fff_print();
@@ -6836,5 +6489,10 @@ void GLCanvas3D::WipeTowerInfo::apply_wipe_tower() const
wxGetApp().get_tab(Preset::TYPE_PRINT)->load_config(cfg);
}
+
+void GLCanvas3D::RenderTimer::Notify()
+{
+ wxPostEvent((wxEvtHandler*)GetOwner(), RenderTimerEvent( EVT_GLCANVAS_RENDER_TIMER, *this));
+}
} // namespace GUI
} // namespace Slic3r
diff --git a/src/slic3r/GUI/GLCanvas3D.hpp b/src/slic3r/GUI/GLCanvas3D.hpp
index 0f9cf7d63..fee136087 100644
--- a/src/slic3r/GUI/GLCanvas3D.hpp
+++ b/src/slic3r/GUI/GLCanvas3D.hpp
@@ -3,25 +3,25 @@
#include <stddef.h>
#include <memory>
-#if ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
#include <chrono>
-#endif // ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
+#include <cstdint>
-#include "3DScene.hpp"
#include "GLToolbar.hpp"
#include "Event.hpp"
-#include "3DBed.hpp"
-#include "Camera.hpp"
#include "Selection.hpp"
#include "Gizmos/GLGizmosManager.hpp"
#include "GUI_ObjectLayers.hpp"
+#include "GLSelectionRectangle.hpp"
#include "MeshUtils.hpp"
+#include "libslic3r/GCode/GCodeProcessor.hpp"
+#include "GCodeViewer.hpp"
+
+#include "libslic3r/Slicing.hpp"
#include <float.h>
#include <wx/timer.h>
-class wxWindow;
class wxSizeEvent;
class wxIdleEvent;
class wxKeyEvent;
@@ -29,26 +29,26 @@ class wxMouseEvent;
class wxTimerEvent;
class wxPaintEvent;
class wxGLCanvas;
+class wxGLContext;
-// Support for Retina OpenGL on Mac OS
-#define ENABLE_RETINA_GL __APPLE__
+// Support for Retina OpenGL on Mac OS.
+// wxGTK3 seems to simulate OSX behavior in regard to HiDPI scaling support, enable it as well.
+#define ENABLE_RETINA_GL (__APPLE__ || __WXGTK3__)
namespace Slic3r {
-class GLShader;
-class ExPolygon;
+struct Camera;
class BackgroundSlicingProcess;
-class GCodePreviewData;
-#if ENABLE_THUMBNAIL_GENERATOR
struct ThumbnailData;
-#endif // ENABLE_THUMBNAIL_GENERATOR
-struct SlicingParameters;
-enum LayerHeightEditActionType : unsigned int;
+class ModelObject;
+class ModelInstance;
+class PrintObject;
+class Print;
+class SLAPrint;
+namespace CustomGCode { struct Item; }
namespace GUI {
-class GLGizmoBase;
-
#if ENABLE_RETINA_GL
class RetinaHelper;
#endif
@@ -74,6 +74,25 @@ public:
};
+class RenderTimerEvent : public wxEvent
+{
+public:
+ RenderTimerEvent(wxEventType type, wxTimer& timer)
+ : wxEvent(timer.GetId(), type),
+ m_timer(&timer)
+ {
+ SetEventObject(timer.GetOwner());
+ }
+ int GetInterval() const { return m_timer->GetInterval(); }
+ wxTimer& GetTimer() const { return *m_timer; }
+
+ virtual wxEvent* Clone() const { return new RenderTimerEvent(*this); }
+ virtual wxEventCategory GetEventCategory() const { return wxEVT_CATEGORY_TIMER; }
+private:
+ wxTimer* m_timer;
+};
+
+
wxDECLARE_EVENT(EVT_GLCANVAS_OBJECT_SELECT, SimpleEvent);
using Vec2dEvent = Event<Vec2d>;
@@ -105,50 +124,26 @@ wxDECLARE_EVENT(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED, SimpleEvent);
wxDECLARE_EVENT(EVT_GLCANVAS_UPDATE_BED_SHAPE, SimpleEvent);
wxDECLARE_EVENT(EVT_GLCANVAS_TAB, SimpleEvent);
wxDECLARE_EVENT(EVT_GLCANVAS_RESETGIZMOS, SimpleEvent);
-wxDECLARE_EVENT(EVT_GLCANVAS_MOVE_DOUBLE_SLIDER, wxKeyEvent);
+#if ENABLE_ARROW_KEYS_WITH_SLIDERS
+wxDECLARE_EVENT(EVT_GLCANVAS_MOVE_SLIDERS, wxKeyEvent);
+#else
+wxDECLARE_EVENT(EVT_GLCANVAS_MOVE_LAYERS_SLIDER, wxKeyEvent);
+#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS
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);
wxDECLARE_EVENT(EVT_GLCANVAS_RESET_LAYER_HEIGHT_PROFILE, SimpleEvent);
wxDECLARE_EVENT(EVT_GLCANVAS_ADAPTIVE_LAYER_HEIGHT_PROFILE, Event<float>);
wxDECLARE_EVENT(EVT_GLCANVAS_SMOOTH_LAYER_HEIGHT_PROFILE, HeightProfileSmoothEvent);
wxDECLARE_EVENT(EVT_GLCANVAS_RELOAD_FROM_DISK, SimpleEvent);
+wxDECLARE_EVENT(EVT_GLCANVAS_RENDER_TIMER, wxTimerEvent/*RenderTimerEvent*/);
class GLCanvas3D
{
-#if ENABLE_THUMBNAIL_GENERATOR
static const double DefaultCameraZoomToBoxMarginFactor;
-#endif // ENABLE_THUMBNAIL_GENERATOR
-public:
- struct GCodePreviewVolumeIndex
- {
- enum EType
- {
- Extrusion,
- Travel,
- Retraction,
- Unretraction,
- Shell,
- Num_Geometry_Types
- };
-
- struct FirstVolume
- {
- EType type;
- unsigned int flag;
- // Index of the first volume in a GLVolumeCollection.
- unsigned int id;
-
- FirstVolume(EType type, unsigned int flag, unsigned int id) : type(type), flag(flag), id(id) {}
- };
-
- std::vector<FirstVolume> first_volumes;
-
- void reset() { first_volumes.clear(); }
- };
-
-private:
class LayersEditing
{
public:
@@ -160,11 +155,10 @@ private:
Num_States
};
- private:
static const float THICKNESS_BAR_WIDTH;
+ private:
bool m_enabled;
- Shader m_shader;
unsigned int m_z_texture_id;
// Not owned by LayersEditing.
const DynamicPrintConfig *m_config;
@@ -179,6 +173,8 @@ private:
mutable float m_adaptive_quality;
mutable HeightProfileSmoothingParams m_smooth_params;
+
+ static float s_overelay_window_width;
class LayersTexture
{
@@ -211,8 +207,9 @@ private:
LayersEditing();
~LayersEditing();
- bool init(const std::string& vertex_shader_filename, const std::string& fragment_shader_filename);
- void set_config(const DynamicPrintConfig* config);
+ void init();
+
+ void set_config(const DynamicPrintConfig* config);
void select_object(const Model &model, int object_id);
bool is_allowed() const;
@@ -233,6 +230,7 @@ private:
static bool bar_rect_contains(const GLCanvas3D& canvas, float x, float y);
static Rect get_bar_rect_screen(const GLCanvas3D& canvas);
static Rect get_bar_rect_viewport(const GLCanvas3D& canvas);
+ static float get_overlay_window_width() { return LayersEditing::s_overelay_window_width; }
float object_max_z() const { return m_object_max_z; }
@@ -246,6 +244,7 @@ private:
void update_slicing_parameters();
static float thickness_bar_width(const GLCanvas3D &canvas);
+
};
struct Mouse
@@ -342,39 +341,23 @@ private:
bool generate(const std::string& msg, const GLCanvas3D& canvas, bool compress, bool red_colored = false);
};
- class LegendTexture : public GUI::GLTexture
- {
- static const int Px_Title_Offset = 5;
- static const int Px_Text_Offset = 5;
- static const int Px_Square = 20;
- static const int Px_Square_Contour = 1;
- static const int Px_Border = Px_Square / 2;
- static const unsigned char Squares_Border_Color[3];
- static const unsigned char Default_Background_Color[3];
- static const unsigned char Error_Background_Color[3];
- static const unsigned char Opacity;
-
- int m_original_width;
- int m_original_height;
-
- public:
- LegendTexture();
- void fill_color_print_legend_items(const GLCanvas3D& canvas,
- const std::vector<float>& colors_in,
- std::vector<float>& colors,
- std::vector<std::string>& cp_legend_items);
-
- bool generate(const GCodePreviewData& preview_data, const std::vector<float>& tool_colors, const GLCanvas3D& canvas, bool compress);
-
- void render(const GLCanvas3D& canvas) const;
- };
-
#if ENABLE_RENDER_STATISTICS
- struct RenderStats
+ class RenderStats
{
- long long last_frame;
+ std::queue<std::pair<int64_t, int64_t>> m_frames;
+ int64_t m_curr_total{ 0 };
- RenderStats() : last_frame(0) {}
+ public:
+ void add_frame(int64_t frame) {
+ int64_t now = GLCanvas3D::timestamp_now();
+ if (!m_frames.empty() && now - m_frames.front().first > 1000) {
+ m_curr_total -= m_frames.front().second;
+ m_frames.pop();
+ }
+ m_curr_total += frame;
+ m_frames.push({ now, frame });
+ }
+ int64_t get_average() const { return m_frames.empty() ? 0 : m_curr_total / m_frames.size(); }
};
#endif // ENABLE_RENDER_STATISTICS
@@ -392,29 +375,46 @@ private:
void render(const std::vector<const ModelInstance*>& sorted_instances) const;
};
-#if ENABLE_CANVAS_TOOLTIP_USING_IMGUI
class Tooltip
{
std::string m_text;
-#if ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
std::chrono::steady_clock::time_point m_start_time;
-#endif // ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
// Indicator that the mouse is inside an ImGUI dialog, therefore the tooltip should be suppressed.
- bool m_in_imgui = false;
+ bool m_in_imgui = false;
public:
bool is_empty() const { return m_text.empty(); }
-#if ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
void set_text(const std::string& text);
void render(const Vec2d& mouse_position, GLCanvas3D& canvas) const;
-#else
- void set_text(const std::string& text) { m_text = text; }
- void render(const Vec2d& mouse_position) const;
-#endif // ENABLE_CANVAS_DELAYED_TOOLTIP_USING_IMGUI
// Indicates that the mouse is inside an ImGUI dialog, therefore the tooltip should be suppressed.
void set_in_imgui(bool b) { m_in_imgui = b; }
+ bool is_in_imgui() const { return m_in_imgui; }
+ };
+
+ class Slope
+ {
+ bool m_enabled{ false };
+ bool m_dialog_shown{ false };
+ GLCanvas3D& m_canvas;
+ GLVolumeCollection& m_volumes;
+ static float s_window_width;
+ public:
+ Slope(GLCanvas3D& canvas, GLVolumeCollection& volumes) : m_canvas(canvas), m_volumes(volumes) {}
+
+ void enable(bool enable) { m_enabled = enable; }
+ bool is_enabled() const { return m_enabled; }
+ void use(bool use) { m_volumes.set_slope_active(m_enabled ? use : false); }
+ bool is_used() const { return m_volumes.is_slope_active(); }
+ void set_normal_angle(float angle_in_deg) const {
+ m_volumes.set_slope_normal_z(-::cos(Geometry::deg2rad(90.0f - angle_in_deg)));
+ }
+ static float get_window_width() { return s_window_width; };
+ };
+
+ class RenderTimer : public wxTimer {
+ private:
+ virtual void Notify() override;
};
-#endif // ENABLE_CANVAS_TOOLTIP_USING_IMGUI
public:
enum ECursorType : unsigned char
@@ -423,6 +423,15 @@ public:
Cross
};
+ struct ArrangeSettings
+ {
+ float distance = 6.;
+// float distance_seq_print = 6.; // Used when sequential print is ON
+// float distance_sla = 6.;
+ float accuracy = 0.65f; // Unused currently
+ bool enable_rotation = false;
+ };
+
private:
wxGLCanvas* m_canvas;
wxGLContext* m_context;
@@ -430,14 +439,9 @@ private:
std::unique_ptr<RetinaHelper> m_retina_helper;
#endif
bool m_in_render;
- LegendTexture m_legend_texture;
WarningTexture m_warning_texture;
wxTimer m_timer;
- Bed3D& m_bed;
- Camera& m_camera;
- GLToolbar& m_view_toolbar;
LayersEditing m_layers_editing;
- Shader m_shader;
Mouse m_mouse;
mutable GLGizmosManager m_gizmos;
mutable GLToolbar m_main_toolbar;
@@ -449,9 +453,16 @@ private:
std::string m_sidebar_field;
// when true renders an extra frame by not resetting m_dirty to false
// see request_extra_frame()
- bool m_extra_frame_requested;
+ bool m_extra_frame_requested;
+ int m_extra_frame_requested_delayed { std::numeric_limits<int>::max() };
+ bool m_event_handlers_bound{ false };
mutable GLVolumeCollection m_volumes;
+ GCodeViewer m_gcode_viewer;
+
+ RenderTimer m_render_timer;
+ int64_t m_render_timer_start;
+
Selection m_selection;
const DynamicPrintConfig* m_config;
Model* m_model;
@@ -462,7 +473,6 @@ private:
bool m_initialized;
bool m_apply_zoom_to_volumes_filter;
mutable std::vector<int> m_hover_volume_idxs;
- bool m_legend_texture_enabled;
bool m_picking_enabled;
bool m_moving_enabled;
bool m_dynamic_background_enabled;
@@ -480,8 +490,6 @@ private:
bool m_reload_delayed;
- GCodePreviewVolumeIndex m_gcode_preview_volume_index;
-
#if ENABLE_RENDER_PICKING_PASS
bool m_show_picking_texture;
#endif // ENABLE_RENDER_PICKING_PASS
@@ -491,17 +499,50 @@ private:
#endif // ENABLE_RENDER_STATISTICS
mutable int m_imgui_undo_redo_hovered_pos{ -1 };
+ mutable int m_mouse_wheel {0};
int m_selected_extruder;
Labels m_labels;
-#if ENABLE_CANVAS_TOOLTIP_USING_IMGUI
mutable Tooltip m_tooltip;
-#endif // ENABLE_CANVAS_TOOLTIP_USING_IMGUI
+ mutable bool m_tooltip_enabled{ true };
+ Slope m_slope;
+
+ ArrangeSettings m_arrange_settings_fff, m_arrange_settings_sla,
+ m_arrange_settings_fff_seq_print;
+
+ PrinterTechnology current_printer_technology() const;
+
+ template<class Self>
+ static auto & get_arrange_settings(Self *self)
+ {
+ PrinterTechnology ptech = self->current_printer_technology();
+
+ auto *ptr = &self->m_arrange_settings_fff;
+
+ if (ptech == ptSLA) {
+ ptr = &self->m_arrange_settings_sla;
+ } else if (ptech == ptFFF) {
+ auto co_opt = self->m_config->template option<ConfigOptionBool>("complete_objects");
+ if (co_opt && co_opt->value) {
+ ptr = &self->m_arrange_settings_fff_seq_print;
+ } else {
+ ptr = &self->m_arrange_settings_fff;
+ }
+ }
+
+ return *ptr;
+ }
+
+ ArrangeSettings &get_arrange_settings() { return get_arrange_settings(this); }
+
+ void load_arrange_settings();
public:
- GLCanvas3D(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar);
+ explicit GLCanvas3D(wxGLCanvas* canvas);
~GLCanvas3D();
+ bool is_initialized() const { return m_initialized; }
+
void set_context(wxGLContext* context) { m_context = context; }
wxGLCanvas* get_wxglcanvas() { return m_canvas; }
@@ -517,6 +558,10 @@ public:
void reset_volumes();
int check_volumes_outside_state() const;
+ void reset_gcode_toolpaths() { m_gcode_viewer.reset(); }
+ const GCodeViewer::SequentialView& get_gcode_sequential_view() const { return m_gcode_viewer.get_sequential_view(); }
+ void update_gcode_sequential_view_current(unsigned int first, unsigned int last) { m_gcode_viewer.update_sequential_view_current(first, last); }
+
void toggle_sla_auxiliaries_visibility(bool visible, const ModelObject* mo = nullptr, int instance_idx = -1);
void toggle_model_objects_visibility(bool visible, const ModelObject* mo = nullptr, int instance_idx = -1);
void update_instance_printable_state_for_object(size_t obj_idx);
@@ -548,15 +593,14 @@ public:
void set_color_by(const std::string& value);
- const Camera& get_camera() const { return m_camera; }
- const Shader& get_shader() const { return m_shader; }
- Camera& get_camera() { return m_camera; }
+ void refresh_camera_scene_box();
BoundingBoxf3 volumes_bounding_box() const;
BoundingBoxf3 scene_bounding_box() const;
bool is_layers_editing_enabled() const;
bool is_layers_editing_allowed() const;
+ bool is_search_pressed() const;
void reset_layer_height_profile();
void adaptive_layer_height_profile(float quality_factor);
@@ -574,11 +618,13 @@ public:
void enable_undoredo_toolbar(bool enable);
void enable_dynamic_background(bool enable);
void enable_labels(bool enable) { m_labels.enable(enable); }
+ void enable_slope(bool enable) { m_slope.enable(enable); }
void allow_multisample(bool allow);
void zoom_to_bed();
void zoom_to_volumes();
void zoom_to_selection();
+ void zoom_to_gcode();
void select_view(const std::string& direction);
void update_volumes_colors_by_extruder();
@@ -586,19 +632,26 @@ public:
bool is_dragging() const { return m_gizmos.is_dragging() || m_moving; }
void render();
-#if ENABLE_THUMBNAIL_GENERATOR
// printable_only == false -> render also non printable volumes as grayed
// parts_only == false -> render also sla support and pad
void render_thumbnail(ThumbnailData& thumbnail_data, unsigned int w, unsigned int h, bool printable_only, bool parts_only, bool show_bed, bool transparent_background) const;
-#endif // ENABLE_THUMBNAIL_GENERATOR
void select_all();
void deselect_all();
void delete_selected();
void ensure_on_bed(unsigned int object_idx);
- std::vector<double> get_current_print_zs(bool active_only) const;
- void set_toolpaths_range(double low, double high);
+ bool is_gcode_legend_enabled() const { return m_gcode_viewer.is_legend_enabled(); }
+ GCodeViewer::EViewType get_gcode_view_type() const { return m_gcode_viewer.get_view_type(); }
+ const std::vector<double>& get_gcode_layers_zs() const;
+ std::vector<double> get_volumes_print_zs(bool active_only) const;
+ unsigned int get_gcode_options_visibility_flags() const { return m_gcode_viewer.get_options_visibility_flags(); }
+ void set_gcode_options_visibility_from_flags(unsigned int flags);
+ unsigned int get_toolpath_role_visibility_flags() const { return m_gcode_viewer.get_toolpath_role_visibility_flags(); }
+ void set_toolpath_role_visibility_flags(unsigned int flags);
+ void set_toolpath_view_type(GCodeViewer::EViewType type);
+ void set_volumes_z_range(const std::array<double, 2>& range);
+ void set_toolpaths_z_range(const std::array<unsigned int, 2>& range);
std::vector<int> load_object(const ModelObject& model_object, int obj_idx, std::vector<int> instance_idxs);
std::vector<int> load_object(const Model& model, int obj_idx);
@@ -607,7 +660,13 @@ public:
void reload_scene(bool refresh_immediately, bool force_full_scene_refresh = false);
- void load_gcode_preview(const GCodePreviewData& preview_data, const std::vector<std::string>& str_tool_colors);
+ void load_gcode_preview(const GCodeProcessor::Result& gcode_result);
+ void refresh_gcode_preview(const GCodeProcessor::Result& gcode_result, const std::vector<std::string>& str_tool_colors);
+#if ENABLE_RENDER_PATH_REFRESH_AFTER_OPTIONS_CHANGE
+ void refresh_gcode_preview_render_paths();
+#endif // ENABLE_RENDER_PATH_REFRESH_AFTER_OPTIONS_CHANGE
+ void set_gcode_view_preview_type(GCodeViewer::EViewType type) { return m_gcode_viewer.set_view_type(type); }
+ GCodeViewer::EViewType get_gcode_view_preview_type() const { return m_gcode_viewer.get_view_type(); }
void load_sla_preview();
void load_preview(const std::vector<std::string>& str_tool_colors, const std::vector<CustomGCode::Item>& color_print_values);
void bind_event_handlers();
@@ -619,14 +678,14 @@ public:
void on_key(wxKeyEvent& evt);
void on_mouse_wheel(wxMouseEvent& evt);
void on_timer(wxTimerEvent& evt);
+ void on_render_timer(wxTimerEvent& evt);
void on_mouse(wxMouseEvent& evt);
void on_paint(wxPaintEvent& evt);
+ void on_set_focus(wxFocusEvent& evt);
Size get_canvas_size() const;
Vec2d get_local_mouse_position() const;
- void reset_legend_texture();
-
void set_tooltip(const std::string& tooltip) const;
// the following methods add a snapshot to the undo/redo stack, unless the given string is empty
@@ -644,8 +703,6 @@ public:
void update_ui_from_settings();
- float get_view_toolbar_height() const { return m_view_toolbar.get_height(); }
-
int get_move_volume_id() const { return m_mouse.drag.move_volume_idx; }
int get_first_hover_volume_idx() const { return m_hover_volume_idxs.empty() ? -1 : m_hover_volume_idxs.front(); }
void set_selected_extruder(int extruder) { m_selected_extruder = extruder;}
@@ -653,8 +710,8 @@ public:
class WipeTowerInfo {
protected:
Vec2d m_pos = {std::nan(""), std::nan("")};
- Vec2d m_bb_size = {0., 0.};
double m_rotation = 0.;
+ BoundingBoxf m_bb;
friend class GLCanvas3D;
public:
@@ -665,7 +722,7 @@ public:
inline const Vec2d& pos() const { return m_pos; }
inline double rotation() const { return m_rotation; }
- inline const Vec2d bb_size() const { return m_bb_size; }
+ inline const Vec2d bb_size() const { return m_bb.size(); }
void apply_wipe_tower() const;
};
@@ -676,7 +733,6 @@ public:
Linef3 mouse_ray(const Point& mouse_pos);
void set_mouse_as_dragging() { m_mouse.dragging = true; }
- void refresh_camera_scene_box() { m_camera.set_scene_box(scene_bounding_box()); }
bool is_mouse_dragging() const { return m_mouse.dragging; }
double get_size_proportional_to_max_bed_size(double factor) const;
@@ -685,10 +741,12 @@ public:
void msw_rescale();
void request_extra_frame() { m_extra_frame_requested = true; }
+ void request_extra_frame_delayed(int miliseconds);
int get_main_toolbar_item_id(const std::string& name) const { return m_main_toolbar.get_item_id(name); }
void force_main_toolbar_left_action(int item_id) { m_main_toolbar.force_left_action(item_id, *this); }
void force_main_toolbar_right_action(int item_id) { m_main_toolbar.force_right_action(item_id, *this); }
+ void update_tooltip_for_settings_item_in_main_toolbar();
bool has_toolpaths_to_export() const;
void export_toolpaths_to_obj(const char* filename) const;
@@ -698,6 +756,33 @@ public:
bool are_labels_shown() const { return m_labels.is_shown(); }
void show_labels(bool show) { m_labels.show(show); }
+ bool is_using_slope() const { return m_slope.is_used(); }
+ void use_slope(bool use) { m_slope.use(use); }
+ void set_slope_normal_angle(float angle_in_deg) { m_slope.set_normal_angle(angle_in_deg); }
+
+ ArrangeSettings get_arrange_settings() const
+ {
+ const ArrangeSettings &settings = get_arrange_settings(this);
+ ArrangeSettings ret = settings;
+ if (&settings == &m_arrange_settings_fff_seq_print) {
+ ret.distance = std::max(ret.distance,
+ float(min_object_distance(*m_config)));
+ }
+
+ return ret;
+ }
+
+ // Timestamp for FPS calculation and notification fade-outs.
+ static int64_t timestamp_now() {
+#ifdef _WIN32
+ // Cheaper on Windows, calls GetSystemTimeAsFileTime()
+ return wxGetUTCTimeMillis().GetValue();
+#else
+ // calls clock()
+ return wxGetLocalTimeMillis().GetValue();
+#endif
+ }
+
private:
bool _is_shown_on_screen() const;
@@ -705,17 +790,14 @@ private:
bool _init_main_toolbar();
bool _init_undoredo_toolbar();
bool _init_view_toolbar();
+ bool _init_collapse_toolbar();
bool _set_current();
void _resize(unsigned int w, unsigned int h);
BoundingBoxf3 _max_bounding_box(bool include_gizmos, bool include_bed_model) const;
-#if ENABLE_THUMBNAIL_GENERATOR
void _zoom_to_box(const BoundingBoxf3& box, double margin_factor = DefaultCameraZoomToBoxMarginFactor);
-#else
- void _zoom_to_box(const BoundingBoxf3& box);
-#endif // ENABLE_THUMBNAIL_GENERATOR
void _update_camera_zoom(double zoom);
void _refresh_if_shown_on_screen();
@@ -723,28 +805,31 @@ private:
void _picking_pass() const;
void _rectangular_selection_picking_pass() const;
void _render_background() const;
- void _render_bed(float theta, bool show_axes) const;
+ void _render_bed(bool bottom, bool show_axes) const;
void _render_objects() const;
+ void _render_gcode() const;
void _render_selection() const;
#if ENABLE_RENDER_SELECTION_CENTER
void _render_selection_center() const;
#endif // ENABLE_RENDER_SELECTION_CENTER
+ void _check_and_update_toolbar_icon_scale() const;
void _render_overlays() const;
void _render_warning_texture() const;
- void _render_legend_texture() const;
void _render_volumes_for_picking() const;
void _render_current_gizmo() const;
void _render_gizmos_overlay() const;
void _render_main_toolbar() const;
void _render_undoredo_toolbar() const;
+ void _render_collapse_toolbar() const;
void _render_view_toolbar() const;
#if ENABLE_SHOW_CAMERA_TARGET
void _render_camera_target() const;
#endif // ENABLE_SHOW_CAMERA_TARGET
void _render_sla_slices() const;
void _render_selection_sidebar_hints() const;
- void _render_undo_redo_stack(const bool is_undo, float pos_x) const;
-#if ENABLE_THUMBNAIL_GENERATOR
+ bool _render_undo_redo_stack(const bool is_undo, float pos_x) const;
+ bool _render_search_list(float pos_x) const;
+ bool _render_arrange_menu(float pos_x);
void _render_thumbnail_internal(ThumbnailData& thumbnail_data, bool printable_only, bool parts_only, bool show_bed, bool transparent_background) const;
// render thumbnail using an off-screen framebuffer
void _render_thumbnail_framebuffer(ThumbnailData& thumbnail_data, unsigned int w, unsigned int h, bool printable_only, bool parts_only, bool show_bed, bool transparent_background) const;
@@ -752,7 +837,6 @@ private:
void _render_thumbnail_framebuffer_ext(ThumbnailData& thumbnail_data, unsigned int w, unsigned int h, bool printable_only, bool parts_only, bool show_bed, bool transparent_background) const;
// render thumbnail using the default framebuffer
void _render_thumbnail_legacy(ThumbnailData& thumbnail_data, unsigned int w, unsigned int h, bool printable_only, bool parts_only, bool show_bed, bool transparent_background) const;
-#endif // ENABLE_THUMBNAIL_GENERATOR
void _update_volumes_hover_state() const;
@@ -779,23 +863,12 @@ private:
// Create 3D thick extrusion lines for wipe tower extrusions
void _load_wipe_tower_toolpaths(const std::vector<std::string>& str_tool_colors);
- // generates gcode extrusion paths geometry
- void _load_gcode_extrusion_paths(const GCodePreviewData& preview_data, const std::vector<float>& tool_colors);
- // generates gcode travel paths geometry
- void _load_gcode_travel_paths(const GCodePreviewData& preview_data, const std::vector<float>& tool_colors);
- // generates objects and wipe tower geometry
- void _load_fff_shells();
// Load SLA objects and support structures for objects, for which the slaposSliceSupports step has been finished.
void _load_sla_shells();
- // sets gcode geometry visibility according to user selection
- void _update_gcode_volumes_visibility(const GCodePreviewData& preview_data);
void _update_toolpath_volumes_outside_state();
void _update_sla_shells_outside_state();
void _show_warning_texture_if_needed(WarningTexture::Warning warning);
- // generates the legend texture in dependence of the current shown view type
- void _generate_legend_texture(const GCodePreviewData& preview_data, const std::vector<float>& tool_colors);
-
// generates a warning texture containing the given message
void _set_warning_texture(WarningTexture::Warning warning, bool state);
@@ -805,6 +878,12 @@ private:
void _update_selection_from_hover();
bool _deactivate_undo_redo_toolbar_items();
+ bool _deactivate_search_toolbar_item();
+ bool _activate_search_toolbar_item();
+ bool _deactivate_collapse_toolbar_items();
+ bool _deactivate_arrange_menu();
+
+ float get_overlay_window_width() { return LayersEditing::get_overlay_window_width(); }
static std::vector<float> _parse_colors(const std::vector<std::string>& colors);
diff --git a/src/slic3r/GUI/GLCanvas3DManager.cpp b/src/slic3r/GUI/GLCanvas3DManager.cpp
deleted file mode 100644
index 02585c5f7..000000000
--- a/src/slic3r/GUI/GLCanvas3DManager.cpp
+++ /dev/null
@@ -1,411 +0,0 @@
-#include "GLCanvas3DManager.hpp"
-#include "../../slic3r/GUI/GUI.hpp"
-#include "../../slic3r/GUI/AppConfig.hpp"
-#include "../../slic3r/GUI/GLCanvas3D.hpp"
-
-#include <GL/glew.h>
-
-#include <boost/algorithm/string/split.hpp>
-#include <boost/algorithm/string/classification.hpp>
-
-#include <wx/glcanvas.h>
-#include <wx/timer.h>
-#include <wx/msgdlg.h>
-
-#include <vector>
-#include <string>
-#include <iostream>
-
-#if ENABLE_HACK_CLOSING_ON_OSX_10_9_5
-// Part of temporary hack to remove crash when closing on OSX 10.9.5
-#include <wx/platinfo.h>
-#endif // ENABLE_HACK_CLOSING_ON_OSX_10_9_5
-
-#ifdef __APPLE__
-#include "../Utils/MacDarkMode.hpp"
-#endif // __APPLE__
-
-namespace Slic3r {
-namespace GUI {
-
-GLCanvas3DManager::GLInfo::GLInfo()
- : m_detected(false)
- , m_version("")
- , m_glsl_version("")
- , m_vendor("")
- , m_renderer("")
- , m_max_tex_size(0)
- , m_max_anisotropy(0.0f)
-{
-}
-
-const std::string& GLCanvas3DManager::GLInfo::get_version() const
-{
- if (!m_detected)
- detect();
-
- return m_version;
-}
-
-const std::string& GLCanvas3DManager::GLInfo::get_glsl_version() const
-{
- if (!m_detected)
- detect();
-
- return m_glsl_version;
-}
-
-const std::string& GLCanvas3DManager::GLInfo::get_vendor() const
-{
- if (!m_detected)
- detect();
-
- return m_vendor;
-}
-
-const std::string& GLCanvas3DManager::GLInfo::get_renderer() const
-{
- if (!m_detected)
- detect();
-
- return m_renderer;
-}
-
-int GLCanvas3DManager::GLInfo::get_max_tex_size() const
-{
- if (!m_detected)
- detect();
-
- // clamp to avoid the texture generation become too slow and use too much GPU memory
-#ifdef __APPLE__
- // and use smaller texture for non retina systems
- return (Slic3r::GUI::mac_max_scaling_factor() > 1.0) ? std::min(m_max_tex_size, 8192) : std::min(m_max_tex_size / 2, 4096);
-#else
- // and use smaller texture for older OpenGL versions
- return is_version_greater_or_equal_to(3, 0) ? std::min(m_max_tex_size, 8192) : std::min(m_max_tex_size / 2, 4096);
-#endif // __APPLE__
-}
-
-float GLCanvas3DManager::GLInfo::get_max_anisotropy() const
-{
- if (!m_detected)
- detect();
-
- return m_max_anisotropy;
-}
-
-void GLCanvas3DManager::GLInfo::detect() const
-{
- const char* data = (const char*)::glGetString(GL_VERSION);
- if (data != nullptr)
- m_version = data;
-
- data = (const char*)::glGetString(GL_SHADING_LANGUAGE_VERSION);
- if (data != nullptr)
- m_glsl_version = data;
-
- data = (const char*)::glGetString(GL_VENDOR);
- if (data != nullptr)
- m_vendor = data;
-
- data = (const char*)::glGetString(GL_RENDERER);
- if (data != nullptr)
- m_renderer = data;
-
- glsafe(::glGetIntegerv(GL_MAX_TEXTURE_SIZE, &m_max_tex_size));
-
- m_max_tex_size /= 2;
-
- if (Slic3r::total_physical_memory() / (1024 * 1024 * 1024) < 6)
- m_max_tex_size /= 2;
-
- if (GLEW_EXT_texture_filter_anisotropic)
- glsafe(::glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &m_max_anisotropy));
-
- m_detected = true;
-}
-
-bool GLCanvas3DManager::GLInfo::is_version_greater_or_equal_to(unsigned int major, unsigned int minor) const
-{
- if (!m_detected)
- detect();
-
- std::vector<std::string> tokens;
- boost::split(tokens, m_version, boost::is_any_of(" "), boost::token_compress_on);
-
- if (tokens.empty())
- return false;
-
- std::vector<std::string> numbers;
- boost::split(numbers, tokens[0], boost::is_any_of("."), boost::token_compress_on);
-
- unsigned int gl_major = 0;
- unsigned int gl_minor = 0;
-
- if (numbers.size() > 0)
- gl_major = ::atoi(numbers[0].c_str());
-
- if (numbers.size() > 1)
- gl_minor = ::atoi(numbers[1].c_str());
-
- if (gl_major < major)
- return false;
- else if (gl_major > major)
- return true;
- else
- return gl_minor >= minor;
-}
-
-std::string GLCanvas3DManager::GLInfo::to_string(bool format_as_html, bool extensions) const
-{
- if (!m_detected)
- detect();
-
- std::stringstream out;
-
- std::string h2_start = format_as_html ? "<b>" : "";
- std::string h2_end = format_as_html ? "</b>" : "";
- std::string b_start = format_as_html ? "<b>" : "";
- std::string b_end = format_as_html ? "</b>" : "";
- std::string line_end = format_as_html ? "<br>" : "\n";
-
- out << h2_start << "OpenGL installation" << h2_end << line_end;
- out << b_start << "GL version: " << b_end << (m_version.empty() ? "N/A" : m_version) << line_end;
- out << b_start << "Vendor: " << b_end << (m_vendor.empty() ? "N/A" : m_vendor) << line_end;
- out << b_start << "Renderer: " << b_end << (m_renderer.empty() ? "N/A" : m_renderer) << line_end;
- out << b_start << "GLSL version: " << b_end << (m_glsl_version.empty() ? "N/A" : m_glsl_version) << line_end;
-
- if (extensions)
- {
- std::vector<std::string> extensions_list;
- std::string extensions_str = (const char*)::glGetString(GL_EXTENSIONS);
- boost::split(extensions_list, extensions_str, boost::is_any_of(" "), boost::token_compress_off);
-
- if (!extensions_list.empty())
- {
- out << h2_start << "Installed extensions:" << h2_end << line_end;
-
- std::sort(extensions_list.begin(), extensions_list.end());
- for (const std::string& ext : extensions_list)
- {
- out << ext << line_end;
- }
- }
- }
-
- return out.str();
-}
-
-GLCanvas3DManager::EMultisampleState GLCanvas3DManager::s_multisample = GLCanvas3DManager::MS_Unknown;
-bool GLCanvas3DManager::s_compressed_textures_supported = false;
-GLCanvas3DManager::EFramebufferType GLCanvas3DManager::s_framebuffers_type = GLCanvas3DManager::FB_None;
-GLCanvas3DManager::GLInfo GLCanvas3DManager::s_gl_info;
-#if ENABLE_HACK_CLOSING_ON_OSX_10_9_5
-#ifdef __APPLE__
-GLCanvas3DManager::OSInfo GLCanvas3DManager::s_os_info;
-#endif // __APPLE__
-#endif // ENABLE_HACK_CLOSING_ON_OSX_10_9_5
-
-GLCanvas3DManager::GLCanvas3DManager()
- : m_context(nullptr)
- , m_gl_initialized(false)
-{
-}
-
-GLCanvas3DManager::~GLCanvas3DManager()
-{
- this->destroy();
-}
-
-bool GLCanvas3DManager::add(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar)
-{
- if (canvas == nullptr)
- return false;
-
- if (do_get_canvas(canvas) != m_canvases.end())
- return false;
-
- GLCanvas3D* canvas3D = new GLCanvas3D(canvas, bed, camera, view_toolbar);
- if (canvas3D == nullptr)
- return false;
-
- canvas3D->bind_event_handlers();
-
- if (m_context == nullptr)
- {
- m_context = new wxGLContext(canvas);
- if (m_context == nullptr)
- return false;
-
-#if ENABLE_HACK_CLOSING_ON_OSX_10_9_5
-#ifdef __APPLE__
- // Part of temporary hack to remove crash when closing on OSX 10.9.5
- s_os_info.major = wxPlatformInfo::Get().GetOSMajorVersion();
- s_os_info.minor = wxPlatformInfo::Get().GetOSMinorVersion();
- s_os_info.micro = wxPlatformInfo::Get().GetOSMicroVersion();
-#endif //__APPLE__
-#endif // ENABLE_HACK_CLOSING_ON_OSX_10_9_5
- }
-
- canvas3D->set_context(m_context);
-
- m_canvases.insert(CanvasesMap::value_type(canvas, canvas3D));
-
- return true;
-}
-
-bool GLCanvas3DManager::remove(wxGLCanvas* canvas)
-{
- CanvasesMap::iterator it = do_get_canvas(canvas);
- if (it == m_canvases.end())
- return false;
-
- it->second->unbind_event_handlers();
- delete it->second;
- m_canvases.erase(it);
-
- return true;
-}
-
-void GLCanvas3DManager::remove_all()
-{
- for (CanvasesMap::value_type& item : m_canvases)
- {
- item.second->unbind_event_handlers();
- delete item.second;
- }
- m_canvases.clear();
-}
-
-unsigned int GLCanvas3DManager::count() const
-{
- return (unsigned int)m_canvases.size();
-}
-
-void GLCanvas3DManager::init_gl()
-{
- if (!m_gl_initialized)
- {
- glewInit();
- m_gl_initialized = true;
- if (GLEW_EXT_texture_compression_s3tc)
- s_compressed_textures_supported = true;
- else
- s_compressed_textures_supported = false;
-
- if (GLEW_ARB_framebuffer_object)
- s_framebuffers_type = FB_Arb;
- else if (GLEW_EXT_framebuffer_object)
- s_framebuffers_type = FB_Ext;
- else
- s_framebuffers_type = FB_None;
-
- if (! s_gl_info.is_version_greater_or_equal_to(2, 0)) {
- // Complain about the OpenGL version.
- wxString message = from_u8((boost::format(
- _utf8(L("PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n"
- "while OpenGL version %s, render %s, vendor %s was detected."))) % s_gl_info.get_version() % s_gl_info.get_renderer() % s_gl_info.get_vendor()).str());
- message += "\n";
- message += _(L("You may need to update your graphics card driver."));
-#ifdef _WIN32
- message += "\n";
- message += _(L("As a workaround, you may run PrusaSlicer with a software rendered 3D graphics by running prusa-slicer.exe with the --sw_renderer parameter."));
-#endif
- wxMessageBox(message, wxString("PrusaSlicer - ") + _(L("Unsupported OpenGL version")), wxOK | wxICON_ERROR);
- }
- }
-}
-
-bool GLCanvas3DManager::init(wxGLCanvas* canvas)
-{
- CanvasesMap::const_iterator it = do_get_canvas(canvas);
- if (it != m_canvases.end())
- return (it->second != nullptr) ? init(*it->second) : false;
- else
- return false;
-}
-
-void GLCanvas3DManager::destroy()
-{
- if (m_context != nullptr)
- {
-#if ENABLE_HACK_CLOSING_ON_OSX_10_9_5
-#ifdef __APPLE__
- // this is a temporary ugly hack to solve the crash happening when closing the application on OSX 10.9.5
- // the crash is inside wxGLContext destructor
- if (s_os_info.major == 10 && s_os_info.minor == 9 && s_os_info.micro == 5)
- return;
-#endif //__APPLE__
-#endif // ENABLE_HACK_CLOSING_ON_OSX_10_9_5
-
- delete m_context;
- m_context = nullptr;
- }
-}
-
-GLCanvas3D* GLCanvas3DManager::get_canvas(wxGLCanvas* canvas)
-{
- CanvasesMap::const_iterator it = do_get_canvas(canvas);
- return (it != m_canvases.end()) ? it->second : nullptr;
-}
-
-wxGLCanvas* GLCanvas3DManager::create_wxglcanvas(wxWindow *parent)
-{
- int attribList[] = {
- WX_GL_RGBA,
- WX_GL_DOUBLEBUFFER,
- // RGB channels each should be allocated with 8 bit depth. One should almost certainly get these bit depths by default.
- WX_GL_MIN_RED, 8,
- WX_GL_MIN_GREEN, 8,
- WX_GL_MIN_BLUE, 8,
- // Requesting an 8 bit alpha channel. Interestingly, the NVIDIA drivers would most likely work with some alpha plane, but glReadPixels would not return
- // the alpha channel on NVIDIA if not requested when the GL context is created.
- WX_GL_MIN_ALPHA, 8,
- WX_GL_DEPTH_SIZE, 24,
- WX_GL_SAMPLE_BUFFERS, GL_TRUE,
- WX_GL_SAMPLES, 4,
- 0
- };
-
- if (s_multisample == MS_Unknown)
- {
- detect_multisample(attribList);
-// // debug output
-// std::cout << "Multisample " << (can_multisample() ? "enabled" : "disabled") << std::endl;
- }
-
- if (! can_multisample())
- attribList[12] = 0;
-
- return new wxGLCanvas(parent, wxID_ANY, attribList, wxDefaultPosition, wxDefaultSize, wxWANTS_CHARS);
-}
-
-GLCanvas3DManager::CanvasesMap::iterator GLCanvas3DManager::do_get_canvas(wxGLCanvas* canvas)
-{
- return (canvas == nullptr) ? m_canvases.end() : m_canvases.find(canvas);
-}
-
-GLCanvas3DManager::CanvasesMap::const_iterator GLCanvas3DManager::do_get_canvas(wxGLCanvas* canvas) const
-{
- return (canvas == nullptr) ? m_canvases.end() : m_canvases.find(canvas);
-}
-
-bool GLCanvas3DManager::init(GLCanvas3D& canvas)
-{
- if (!m_gl_initialized)
- init_gl();
-
- return canvas.init();
-}
-
-void GLCanvas3DManager::detect_multisample(int* attribList)
-{
- int wxVersion = wxMAJOR_VERSION * 10000 + wxMINOR_VERSION * 100 + wxRELEASE_NUMBER;
- bool enable_multisample = wxVersion >= 30003;
- s_multisample = (enable_multisample && wxGLCanvas::IsDisplaySupported(attribList)) ? MS_Enabled : MS_Disabled;
- // Alternative method: it was working on previous version of wxWidgets but not with the latest, at least on Windows
- // s_multisample = enable_multisample && wxGLCanvas::IsExtensionSupported("WGL_ARB_multisample");
-}
-
-} // namespace GUI
-} // namespace Slic3r
diff --git a/src/slic3r/GUI/GLModel.cpp b/src/slic3r/GUI/GLModel.cpp
new file mode 100644
index 000000000..e738aa3c4
--- /dev/null
+++ b/src/slic3r/GUI/GLModel.cpp
@@ -0,0 +1,531 @@
+#include "libslic3r/libslic3r.h"
+#include "GLModel.hpp"
+
+#include "3DScene.hpp"
+#include "libslic3r/TriangleMesh.hpp"
+#include "libslic3r/Model.hpp"
+
+#include <boost/filesystem/operations.hpp>
+#include <boost/algorithm/string/predicate.hpp>
+
+#include <GL/glew.h>
+
+namespace Slic3r {
+namespace GUI {
+
+void GLModel::init_from(const GLModelInitializationData& data)
+{
+ assert(!data.positions.empty() && !data.triangles.empty());
+ assert(data.positions.size() == data.normals.size());
+
+ if (m_vbo_id > 0) // call reset() if you want to reuse this model
+ return;
+
+ // vertices/normals data
+ std::vector<float> vertices(6 * data.positions.size());
+ for (size_t i = 0; i < data.positions.size(); ++i) {
+ size_t offset = i * 6;
+ ::memcpy(static_cast<void*>(&vertices[offset]), static_cast<const void*>(data.positions[i].data()), 3 * sizeof(float));
+ ::memcpy(static_cast<void*>(&vertices[3 + offset]), static_cast<const void*>(data.normals[i].data()), 3 * sizeof(float));
+ }
+
+ // indices data
+ std::vector<unsigned int> indices(3 * data.triangles.size());
+ for (size_t i = 0; i < data.triangles.size(); ++i) {
+ for (size_t j = 0; j < 3; ++j) {
+ indices[i * 3 + j] = static_cast<unsigned int>(data.triangles[i][j]);
+ }
+ }
+
+ m_indices_count = static_cast<unsigned int>(indices.size());
+ m_bounding_box = BoundingBoxf3();
+ for (size_t i = 0; i < data.positions.size(); ++i) {
+ m_bounding_box.merge(data.positions[i].cast<double>());
+ }
+
+ send_to_gpu(vertices, indices);
+}
+
+void GLModel::init_from(const TriangleMesh& mesh)
+{
+ if (m_vbo_id > 0) // call reset() if you want to reuse this model
+ return;
+
+ std::vector<float> vertices = std::vector<float>(18 * mesh.stl.stats.number_of_facets);
+ std::vector<unsigned int> indices = std::vector<unsigned int>(3 * mesh.stl.stats.number_of_facets);
+
+ unsigned int vertices_count = 0;
+ for (uint32_t i = 0; i < mesh.stl.stats.number_of_facets; ++i) {
+ const stl_facet& facet = mesh.stl.facet_start[i];
+ for (uint32_t j = 0; j < 3; ++j) {
+ uint32_t offset = i * 18 + j * 6;
+ ::memcpy(static_cast<void*>(&vertices[offset]), static_cast<const void*>(facet.vertex[j].data()), 3 * sizeof(float));
+ ::memcpy(static_cast<void*>(&vertices[3 + offset]), static_cast<const void*>(facet.normal.data()), 3 * sizeof(float));
+ }
+ for (uint32_t j = 0; j < 3; ++j) {
+ indices[i * 3 + j] = vertices_count + j;
+ }
+ vertices_count += 3;
+ }
+
+ m_indices_count = static_cast<unsigned int>(indices.size());
+ m_bounding_box = mesh.bounding_box();
+
+ send_to_gpu(vertices, indices);
+}
+
+bool GLModel::init_from_file(const std::string& filename)
+{
+ if (!boost::filesystem::exists(filename))
+ return false;
+
+ if (!boost::algorithm::iends_with(filename, ".stl"))
+ return false;
+
+ Model model;
+ try
+ {
+ model = Model::read_from_file(filename);
+ }
+ catch (std::exception&)
+ {
+ return false;
+ }
+
+ init_from(model.mesh());
+
+ m_filename = filename;
+
+ return true;
+}
+
+void GLModel::reset()
+{
+ // release gpu memory
+ if (m_ibo_id > 0) {
+ glsafe(::glDeleteBuffers(1, &m_ibo_id));
+ m_ibo_id = 0;
+ }
+
+ if (m_vbo_id > 0) {
+ glsafe(::glDeleteBuffers(1, &m_vbo_id));
+ m_vbo_id = 0;
+ }
+
+ m_indices_count = 0;
+ m_bounding_box = BoundingBoxf3();
+ m_filename = std::string();
+}
+
+void GLModel::render() const
+{
+ if (m_vbo_id == 0 || m_ibo_id == 0)
+ return;
+
+ glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_vbo_id));
+ glsafe(::glVertexPointer(3, GL_FLOAT, 6 * sizeof(float), (const void*)0));
+ glsafe(::glNormalPointer(GL_FLOAT, 6 * sizeof(float), (const void*)(3 * sizeof(float))));
+
+ glsafe(::glEnableClientState(GL_VERTEX_ARRAY));
+ glsafe(::glEnableClientState(GL_NORMAL_ARRAY));
+
+ glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo_id));
+ glsafe(::glDrawElements(GL_TRIANGLES, static_cast<GLsizei>(m_indices_count), GL_UNSIGNED_INT, (const void*)0));
+ glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
+
+ glsafe(::glDisableClientState(GL_NORMAL_ARRAY));
+ glsafe(::glDisableClientState(GL_VERTEX_ARRAY));
+
+ glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0));
+}
+
+void GLModel::send_to_gpu(const std::vector<float>& vertices, const std::vector<unsigned int>& indices)
+{
+ // vertex data -> send to gpu
+ glsafe(::glGenBuffers(1, &m_vbo_id));
+ glsafe(::glBindBuffer(GL_ARRAY_BUFFER, m_vbo_id));
+ glsafe(::glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(float), vertices.data(), GL_STATIC_DRAW));
+ glsafe(::glBindBuffer(GL_ARRAY_BUFFER, 0));
+
+ // indices data -> send to gpu
+ glsafe(::glGenBuffers(1, &m_ibo_id));
+ glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, m_ibo_id));
+ glsafe(::glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(unsigned int), indices.data(), GL_STATIC_DRAW));
+ glsafe(::glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0));
+}
+
+GLModelInitializationData stilized_arrow(int resolution, float tip_radius, float tip_height, float stem_radius, float stem_height)
+{
+ auto append_vertex = [](GLModelInitializationData& data, const Vec3f& position, const Vec3f& normal) {
+ data.positions.emplace_back(position);
+ data.normals.emplace_back(normal);
+ };
+
+ resolution = std::max(4, resolution);
+
+ GLModelInitializationData data;
+
+ const float angle_step = 2.0f * M_PI / static_cast<float>(resolution);
+ std::vector<float> cosines(resolution);
+ std::vector<float> sines(resolution);
+
+ for (int i = 0; i < resolution; ++i)
+ {
+ float angle = angle_step * static_cast<float>(i);
+ cosines[i] = ::cos(angle);
+ sines[i] = -::sin(angle);
+ }
+
+ const float total_height = tip_height + stem_height;
+
+ // tip vertices/normals
+ append_vertex(data, { 0.0f, 0.0f, total_height }, Vec3f::UnitZ());
+ for (int i = 0; i < resolution; ++i)
+ {
+ append_vertex(data, { tip_radius * sines[i], tip_radius * cosines[i], stem_height }, { sines[i], cosines[i], 0.0f });
+ }
+
+ // tip triangles
+ for (int i = 0; i < resolution; ++i)
+ {
+ int v3 = (i < resolution - 1) ? i + 2 : 1;
+ data.triangles.emplace_back(0, i + 1, v3);
+ }
+
+ // tip cap outer perimeter vertices
+ for (int i = 0; i < resolution; ++i)
+ {
+ append_vertex(data, { tip_radius * sines[i], tip_radius * cosines[i], stem_height }, -Vec3f::UnitZ());
+ }
+
+ // tip cap inner perimeter vertices
+ for (int i = 0; i < resolution; ++i)
+ {
+ append_vertex(data, { stem_radius * sines[i], stem_radius * cosines[i], stem_height }, -Vec3f::UnitZ());
+ }
+
+ // tip cap triangles
+ for (int i = 0; i < resolution; ++i)
+ {
+ int v2 = (i < resolution - 1) ? i + resolution + 2 : resolution + 1;
+ int v3 = (i < resolution - 1) ? i + 2 * resolution + 2 : 2 * resolution + 1;
+ data.triangles.emplace_back(i + resolution + 1, v3, v2);
+ data.triangles.emplace_back(i + resolution + 1, i + 2 * resolution + 1, v3);
+ }
+
+ // stem bottom vertices
+ for (int i = 0; i < resolution; ++i)
+ {
+ append_vertex(data, { stem_radius * sines[i], stem_radius * cosines[i], stem_height }, { sines[i], cosines[i], 0.0f });
+ }
+
+ // stem top vertices
+ for (int i = 0; i < resolution; ++i)
+ {
+ append_vertex(data, { stem_radius * sines[i], stem_radius * cosines[i], 0.0f }, { sines[i], cosines[i], 0.0f });
+ }
+
+ // stem triangles
+ for (int i = 0; i < resolution; ++i)
+ {
+ int v2 = (i < resolution - 1) ? i + 3 * resolution + 2 : 3 * resolution + 1;
+ int v3 = (i < resolution - 1) ? i + 4 * resolution + 2 : 4 * resolution + 1;
+ data.triangles.emplace_back(i + 3 * resolution + 1, v3, v2);
+ data.triangles.emplace_back(i + 3 * resolution + 1, i + 4 * resolution + 1, v3);
+ }
+
+ // stem cap vertices
+ append_vertex(data, Vec3f::Zero(), -Vec3f::UnitZ());
+ for (int i = 0; i < resolution; ++i)
+ {
+ append_vertex(data, { stem_radius * sines[i], stem_radius * cosines[i], 0.0f }, -Vec3f::UnitZ());
+ }
+
+ // stem cap triangles
+ for (int i = 0; i < resolution; ++i)
+ {
+ int v3 = (i < resolution - 1) ? i + 5 * resolution + 3 : 5 * resolution + 2;
+ data.triangles.emplace_back(5 * resolution + 1, v3, i + 5 * resolution + 2);
+ }
+
+ return data;
+}
+
+GLModelInitializationData circular_arrow(int resolution, float radius, float tip_height, float tip_width, float stem_width, float thickness)
+{
+ auto append_vertex = [](GLModelInitializationData& data, const Vec3f& position, const Vec3f& normal) {
+ data.positions.emplace_back(position);
+ data.normals.emplace_back(normal);
+ };
+
+ resolution = std::max(2, resolution);
+
+ GLModelInitializationData data;
+
+ const float half_thickness = 0.5f * thickness;
+ const float half_stem_width = 0.5f * stem_width;
+ const float half_tip_width = 0.5f * tip_width;
+
+ const float outer_radius = radius + half_stem_width;
+ const float inner_radius = radius - half_stem_width;
+ const float step_angle = 0.5f * PI / static_cast<float>(resolution);
+
+ // tip
+ // top face vertices
+ append_vertex(data, { 0.0f, outer_radius, half_thickness }, Vec3f::UnitZ());
+ append_vertex(data, { 0.0f, radius + half_tip_width, half_thickness }, Vec3f::UnitZ());
+ append_vertex(data, { -tip_height, radius, half_thickness }, Vec3f::UnitZ());
+ append_vertex(data, { 0.0f, radius - half_tip_width, half_thickness }, Vec3f::UnitZ());
+ append_vertex(data, { 0.0f, inner_radius, half_thickness }, Vec3f::UnitZ());
+
+ // top face triangles
+ data.triangles.emplace_back(0, 1, 2);
+ data.triangles.emplace_back(0, 2, 4);
+ data.triangles.emplace_back(4, 2, 3);
+
+ // bottom face vertices
+ append_vertex(data, { 0.0f, outer_radius, -half_thickness }, -Vec3f::UnitZ());
+ append_vertex(data, { 0.0f, radius + half_tip_width, -half_thickness }, -Vec3f::UnitZ());
+ append_vertex(data, { -tip_height, radius, -half_thickness }, -Vec3f::UnitZ());
+ append_vertex(data, { 0.0f, radius - half_tip_width, -half_thickness }, -Vec3f::UnitZ());
+ append_vertex(data, { 0.0f, inner_radius, -half_thickness }, -Vec3f::UnitZ());
+
+ // bottom face triangles
+ data.triangles.emplace_back(5, 7, 6);
+ data.triangles.emplace_back(5, 9, 7);
+ data.triangles.emplace_back(9, 8, 7);
+
+ // side faces vertices
+ append_vertex(data, { 0.0f, outer_radius, -half_thickness }, Vec3f::UnitX());
+ append_vertex(data, { 0.0f, radius + half_tip_width, -half_thickness }, Vec3f::UnitX());
+ append_vertex(data, { 0.0f, outer_radius, half_thickness }, Vec3f::UnitX());
+ append_vertex(data, { 0.0f, radius + half_tip_width, half_thickness }, Vec3f::UnitX());
+
+ Vec3f normal(-half_tip_width, tip_height, 0.0f);
+ normal.normalize();
+ append_vertex(data, { 0.0f, radius + half_tip_width, -half_thickness }, normal);
+ append_vertex(data, { -tip_height, radius, -half_thickness }, normal);
+ append_vertex(data, { 0.0f, radius + half_tip_width, half_thickness }, normal);
+ append_vertex(data, { -tip_height, radius, half_thickness }, normal);
+
+ normal = Vec3f(-half_tip_width, -tip_height, 0.0f);
+ normal.normalize();
+ append_vertex(data, { -tip_height, radius, -half_thickness }, normal);
+ append_vertex(data, { 0.0f, radius - half_tip_width, -half_thickness }, normal);
+ append_vertex(data, { -tip_height, radius, half_thickness }, normal);
+ append_vertex(data, { 0.0f, radius - half_tip_width, half_thickness }, normal);
+
+ append_vertex(data, { 0.0f, radius - half_tip_width, -half_thickness }, Vec3f::UnitX());
+ append_vertex(data, { 0.0f, inner_radius, -half_thickness }, Vec3f::UnitX());
+ append_vertex(data, { 0.0f, radius - half_tip_width, half_thickness }, Vec3f::UnitX());
+ append_vertex(data, { 0.0f, inner_radius, half_thickness }, Vec3f::UnitX());
+
+ // side face triangles
+ for (int i = 0; i < 4; ++i)
+ {
+ int ii = i * 4;
+ data.triangles.emplace_back(10 + ii, 11 + ii, 13 + ii);
+ data.triangles.emplace_back(10 + ii, 13 + ii, 12 + ii);
+ }
+
+ // stem
+ // top face vertices
+ for (int i = 0; i <= resolution; ++i)
+ {
+ float angle = static_cast<float>(i) * step_angle;
+ append_vertex(data, { inner_radius * ::sin(angle), inner_radius * ::cos(angle), half_thickness }, Vec3f::UnitZ());
+ }
+
+ for (int i = 0; i <= resolution; ++i)
+ {
+ float angle = static_cast<float>(i) * step_angle;
+ append_vertex(data, { outer_radius * ::sin(angle), outer_radius * ::cos(angle), half_thickness }, Vec3f::UnitZ());
+ }
+
+ // top face triangles
+ for (int i = 0; i < resolution; ++i)
+ {
+ data.triangles.emplace_back(26 + i, 27 + i, 27 + resolution + i);
+ data.triangles.emplace_back(27 + i, 28 + resolution + i, 27 + resolution + i);
+ }
+
+ // bottom face vertices
+ for (int i = 0; i <= resolution; ++i)
+ {
+ float angle = static_cast<float>(i) * step_angle;
+ append_vertex(data, { inner_radius * ::sin(angle), inner_radius * ::cos(angle), -half_thickness }, -Vec3f::UnitZ());
+ }
+
+ for (int i = 0; i <= resolution; ++i)
+ {
+ float angle = static_cast<float>(i) * step_angle;
+ append_vertex(data, { outer_radius * ::sin(angle), outer_radius * ::cos(angle), -half_thickness }, -Vec3f::UnitZ());
+ }
+
+ // bottom face triangles
+ for (int i = 0; i < resolution; ++i)
+ {
+ data.triangles.emplace_back(28 + 2 * resolution + i, 29 + 3 * resolution + i, 29 + 2 * resolution + i);
+ data.triangles.emplace_back(29 + 2 * resolution + i, 29 + 3 * resolution + i, 30 + 3 * resolution + i);
+ }
+
+ // side faces vertices and triangles
+ for (int i = 0; i <= resolution; ++i)
+ {
+ float angle = static_cast<float>(i) * step_angle;
+ float c = ::cos(angle);
+ float s = ::sin(angle);
+ append_vertex(data, { inner_radius * s, inner_radius * c, -half_thickness }, { -s, -c, 0.0f });
+ }
+
+ for (int i = 0; i <= resolution; ++i)
+ {
+ float angle = static_cast<float>(i) * step_angle;
+ float c = ::cos(angle);
+ float s = ::sin(angle);
+ append_vertex(data, { inner_radius * s, inner_radius * c, half_thickness }, { -s, -c, 0.0f });
+ }
+
+ int first_id = 26 + 4 * (resolution + 1);
+ for (int i = 0; i < resolution; ++i)
+ {
+ int ii = first_id + i;
+ data.triangles.emplace_back(ii, ii + 1, ii + resolution + 2);
+ data.triangles.emplace_back(ii, ii + resolution + 2, ii + resolution + 1);
+ }
+
+ append_vertex(data, { inner_radius, 0.0f, -half_thickness }, -Vec3f::UnitY());
+ append_vertex(data, { outer_radius, 0.0f, -half_thickness }, -Vec3f::UnitY());
+ append_vertex(data, { inner_radius, 0.0f, half_thickness }, -Vec3f::UnitY());
+ append_vertex(data, { outer_radius, 0.0f, half_thickness }, -Vec3f::UnitY());
+
+ first_id = 26 + 6 * (resolution + 1);
+ data.triangles.emplace_back(first_id, first_id + 1, first_id + 3);
+ data.triangles.emplace_back(first_id, first_id + 3, first_id + 2);
+
+ for (int i = resolution; i >= 0; --i)
+ {
+ float angle = static_cast<float>(i) * step_angle;
+ float c = ::cos(angle);
+ float s = ::sin(angle);
+ append_vertex(data, { outer_radius * s, outer_radius * c, -half_thickness }, { s, c, 0.0f });
+ }
+
+ for (int i = resolution; i >= 0; --i)
+ {
+ float angle = static_cast<float>(i) * step_angle;
+ float c = ::cos(angle);
+ float s = ::sin(angle);
+ append_vertex(data, { outer_radius * s, outer_radius * c, +half_thickness }, { s, c, 0.0f });
+ }
+
+ first_id = 30 + 6 * (resolution + 1);
+ for (int i = 0; i < resolution; ++i)
+ {
+ int ii = first_id + i;
+ data.triangles.emplace_back(ii, ii + 1, ii + resolution + 2);
+ data.triangles.emplace_back(ii, ii + resolution + 2, ii + resolution + 1);
+ }
+
+ return data;
+}
+
+GLModelInitializationData straight_arrow(float tip_width, float tip_height, float stem_width, float stem_height, float thickness)
+{
+ auto append_vertex = [](GLModelInitializationData& data, const Vec3f& position, const Vec3f& normal) {
+ data.positions.emplace_back(position);
+ data.normals.emplace_back(normal);
+ };
+
+ GLModelInitializationData data;
+
+ const float half_thickness = 0.5f * thickness;
+ const float half_stem_width = 0.5f * stem_width;
+ const float half_tip_width = 0.5f * tip_width;
+ const float total_height = tip_height + stem_height;
+
+ // top face vertices
+ append_vertex(data, { half_stem_width, 0.0, half_thickness }, Vec3f::UnitZ());
+ append_vertex(data, { half_stem_width, stem_height, half_thickness }, Vec3f::UnitZ());
+ append_vertex(data, { half_tip_width, stem_height, half_thickness }, Vec3f::UnitZ());
+ append_vertex(data, { 0.0, total_height, half_thickness }, Vec3f::UnitZ());
+ append_vertex(data, { -half_tip_width, stem_height, half_thickness }, Vec3f::UnitZ());
+ append_vertex(data, { -half_stem_width, stem_height, half_thickness }, Vec3f::UnitZ());
+ append_vertex(data, { -half_stem_width, 0.0, half_thickness }, Vec3f::UnitZ());
+
+ // top face triangles
+ data.triangles.emplace_back(0, 1, 6);
+ data.triangles.emplace_back(6, 1, 5);
+ data.triangles.emplace_back(4, 5, 3);
+ data.triangles.emplace_back(5, 1, 3);
+ data.triangles.emplace_back(1, 2, 3);
+
+ // bottom face vertices
+ append_vertex(data, { half_stem_width, 0.0, -half_thickness }, -Vec3f::UnitZ());
+ append_vertex(data, { half_stem_width, stem_height, -half_thickness }, -Vec3f::UnitZ());
+ append_vertex(data, { half_tip_width, stem_height, -half_thickness }, -Vec3f::UnitZ());
+ append_vertex(data, { 0.0, total_height, -half_thickness }, -Vec3f::UnitZ());
+ append_vertex(data, { -half_tip_width, stem_height, -half_thickness }, -Vec3f::UnitZ());
+ append_vertex(data, { -half_stem_width, stem_height, -half_thickness }, -Vec3f::UnitZ());
+ append_vertex(data, { -half_stem_width, 0.0, -half_thickness }, -Vec3f::UnitZ());
+
+ // bottom face triangles
+ data.triangles.emplace_back(7, 13, 8);
+ data.triangles.emplace_back(13, 12, 8);
+ data.triangles.emplace_back(12, 11, 10);
+ data.triangles.emplace_back(8, 12, 10);
+ data.triangles.emplace_back(9, 8, 10);
+
+ // side faces vertices
+ append_vertex(data, { half_stem_width, 0.0, -half_thickness }, Vec3f::UnitX());
+ append_vertex(data, { half_stem_width, stem_height, -half_thickness }, Vec3f::UnitX());
+ append_vertex(data, { half_stem_width, 0.0, half_thickness }, Vec3f::UnitX());
+ append_vertex(data, { half_stem_width, stem_height, half_thickness }, Vec3f::UnitX());
+
+ append_vertex(data, { half_stem_width, stem_height, -half_thickness }, -Vec3f::UnitY());
+ append_vertex(data, { half_tip_width, stem_height, -half_thickness }, -Vec3f::UnitY());
+ append_vertex(data, { half_stem_width, stem_height, half_thickness }, -Vec3f::UnitY());
+ append_vertex(data, { half_tip_width, stem_height, half_thickness }, -Vec3f::UnitY());
+
+ Vec3f normal(tip_height, half_tip_width, 0.0f);
+ normal.normalize();
+ append_vertex(data, { half_tip_width, stem_height, -half_thickness }, normal);
+ append_vertex(data, { 0.0, total_height, -half_thickness }, normal);
+ append_vertex(data, { half_tip_width, stem_height, half_thickness }, normal);
+ append_vertex(data, { 0.0, total_height, half_thickness }, normal);
+
+ normal = Vec3f(-tip_height, half_tip_width, 0.0f);
+ normal.normalize();
+ append_vertex(data, { 0.0, total_height, -half_thickness }, normal);
+ append_vertex(data, { -half_tip_width, stem_height, -half_thickness }, normal);
+ append_vertex(data, { 0.0, total_height, half_thickness }, normal);
+ append_vertex(data, { -half_tip_width, stem_height, half_thickness }, normal);
+
+ append_vertex(data, { -half_tip_width, stem_height, -half_thickness }, -Vec3f::UnitY());
+ append_vertex(data, { -half_stem_width, stem_height, -half_thickness }, -Vec3f::UnitY());
+ append_vertex(data, { -half_tip_width, stem_height, half_thickness }, -Vec3f::UnitY());
+ append_vertex(data, { -half_stem_width, stem_height, half_thickness }, -Vec3f::UnitY());
+
+ append_vertex(data, { -half_stem_width, stem_height, -half_thickness }, -Vec3f::UnitX());
+ append_vertex(data, { -half_stem_width, 0.0, -half_thickness }, -Vec3f::UnitX());
+ append_vertex(data, { -half_stem_width, stem_height, half_thickness }, -Vec3f::UnitX());
+ append_vertex(data, { -half_stem_width, 0.0, half_thickness }, -Vec3f::UnitX());
+
+ append_vertex(data, { -half_stem_width, 0.0, -half_thickness }, -Vec3f::UnitY());
+ append_vertex(data, { half_stem_width, 0.0, -half_thickness }, -Vec3f::UnitY());
+ append_vertex(data, { -half_stem_width, 0.0, half_thickness }, -Vec3f::UnitY());
+ append_vertex(data, { half_stem_width, 0.0, half_thickness }, -Vec3f::UnitY());
+
+ // side face triangles
+ for (int i = 0; i < 7; ++i)
+ {
+ int ii = i * 4;
+ data.triangles.emplace_back(14 + ii, 15 + ii, 17 + ii);
+ data.triangles.emplace_back(14 + ii, 17 + ii, 16 + ii);
+ }
+
+ return data;
+}
+
+} // namespace GUI
+} // namespace Slic3r
diff --git a/src/slic3r/GUI/GLModel.hpp b/src/slic3r/GUI/GLModel.hpp
new file mode 100644
index 000000000..0b4a69bdb
--- /dev/null
+++ b/src/slic3r/GUI/GLModel.hpp
@@ -0,0 +1,68 @@
+#ifndef slic3r_GLModel_hpp_
+#define slic3r_GLModel_hpp_
+
+#include "libslic3r/Point.hpp"
+#include "libslic3r/BoundingBox.hpp"
+#include <vector>
+#include <string>
+
+namespace Slic3r {
+
+class TriangleMesh;
+
+namespace GUI {
+
+ struct GLModelInitializationData
+ {
+ std::vector<Vec3f> positions;
+ std::vector<Vec3f> normals;
+ std::vector<Vec3i> triangles;
+ };
+
+ class GLModel
+ {
+ unsigned int m_vbo_id{ 0 };
+ unsigned int m_ibo_id{ 0 };
+ size_t m_indices_count{ 0 };
+
+ BoundingBoxf3 m_bounding_box;
+ std::string m_filename;
+
+ public:
+ virtual ~GLModel() { reset(); }
+
+ void init_from(const GLModelInitializationData& data);
+ void init_from(const TriangleMesh& mesh);
+ bool init_from_file(const std::string& filename);
+ void reset();
+ void render() const;
+
+ const BoundingBoxf3& get_bounding_box() const { return m_bounding_box; }
+
+ const std::string& get_filename() const { return m_filename; }
+
+ private:
+ void send_to_gpu(const std::vector<float>& vertices, const std::vector<unsigned int>& indices);
+ };
+
+
+ // create an arrow with cylindrical stem and conical tip, with the given dimensions and resolution
+ // the origin of the arrow is in the center of the stem cap
+ // the arrow has its axis of symmetry along the Z axis and is pointing upward
+ GLModelInitializationData stilized_arrow(int resolution, float tip_radius, float tip_height, float stem_radius, float stem_height);
+
+ // create an arrow whose stem is a quarter of circle, with the given dimensions and resolution
+ // the origin of the arrow is in the center of the circle
+ // the arrow is contained in the 1st quadrant of the XY plane and is pointing counterclockwise
+ GLModelInitializationData circular_arrow(int resolution, float radius, float tip_height, float tip_width, float stem_width, float thickness);
+
+ // create an arrow with the given dimensions
+ // the origin of the arrow is in the center of the stem cap
+ // the arrow is contained in XY plane and has its main axis along the Y axis
+ GLModelInitializationData straight_arrow(float tip_width, float tip_height, float stem_width, float stem_height, float thickness);
+
+} // namespace GUI
+} // namespace Slic3r
+
+#endif // slic3r_GLModel_hpp_
+
diff --git a/src/slic3r/GUI/GLSelectionRectangle.cpp b/src/slic3r/GUI/GLSelectionRectangle.cpp
index a8b69d75a..d7f3f7a3a 100644
--- a/src/slic3r/GUI/GLSelectionRectangle.cpp
+++ b/src/slic3r/GUI/GLSelectionRectangle.cpp
@@ -2,6 +2,8 @@
#include "Camera.hpp"
#include "3DScene.hpp"
#include "GLCanvas3D.hpp"
+#include "GUI_App.hpp"
+#include "Plater.hpp"
#include <GL/glew.h>
@@ -35,13 +37,13 @@ namespace GUI {
m_state = Off;
- const Camera& camera = canvas.get_camera();
+ const Camera& camera = wxGetApp().plater()->get_camera();
const std::array<int, 4>& viewport = camera.get_viewport();
const Transform3d& modelview_matrix = camera.get_view_matrix();
const Transform3d& projection_matrix = camera.get_projection_matrix();
// bounding box created from the rectangle corners - will take care of order of the corners
- BoundingBox rectangle(Points{ Point(m_start_corner.cast<int>()), Point(m_end_corner.cast<int>()) });
+ BoundingBox rectangle(Points{ Point(m_start_corner.cast<coord_t>()), Point(m_end_corner.cast<coord_t>()) });
// Iterate over all points and determine whether they're in the rectangle.
for (unsigned int i = 0; i<points.size(); ++i) {
@@ -68,7 +70,7 @@ namespace GUI {
if (!is_dragging())
return;
- const Camera& camera = canvas.get_camera();
+ const Camera& camera = wxGetApp().plater()->get_camera();
float inv_zoom = (float)camera.get_inv_zoom();
Size cnv_size = canvas.get_canvas_size();
diff --git a/src/slic3r/GUI/GLShader.cpp b/src/slic3r/GUI/GLShader.cpp
index c31076060..0473e5344 100644
--- a/src/slic3r/GUI/GLShader.cpp
+++ b/src/slic3r/GUI/GLShader.cpp
@@ -1,366 +1,369 @@
-#include <GL/glew.h>
-
+#include "libslic3r/libslic3r.h"
#include "GLShader.hpp"
-#include "libslic3r/Utils.hpp"
#include "3DScene.hpp"
+#include "libslic3r/Utils.hpp"
+#include "libslic3r/format.hpp"
+
#include <boost/nowide/fstream.hpp>
+#include <GL/glew.h>
+#include <cassert>
-#include <string>
-#include <utility>
-#include <assert.h>
+#include <boost/log/trivial.hpp>
namespace Slic3r {
-GLShader::~GLShader()
+GLShaderProgram::~GLShaderProgram()
{
- assert(fragment_program_id == 0);
- assert(vertex_program_id == 0);
- assert(shader_program_id == 0);
+ if (m_id > 0)
+ glsafe(::glDeleteProgram(m_id));
}
-// A safe wrapper around glGetString to report a "N/A" string in case glGetString returns nullptr.
-inline std::string gl_get_string_safe(GLenum param)
+bool GLShaderProgram::init_from_files(const std::string& name, const ShaderFilenames& filenames, const std::initializer_list<std::string_view> &defines)
{
- const char *value = (const char*)glGetString(param);
- return std::string(value ? value : "N/A");
+ // Load a shader program from file, prepend defs block.
+ auto load_from_file = [](const std::string& filename, const std::string &defs) {
+ std::string path = resources_dir() + "/shaders/" + filename;
+ boost::nowide::ifstream s(path, boost::nowide::ifstream::binary);
+ if (!s.good()) {
+ BOOST_LOG_TRIVIAL(error) << "Couldn't open file: '" << path << "'";
+ return std::string();
+ }
+
+ s.seekg(0, s.end);
+ int file_length = static_cast<int>(s.tellg());
+ s.seekg(0, s.beg);
+ std::string source(defs.size() + file_length, '\0');
+ memcpy(source.data(), defs.c_str(), defs.size());
+ s.read(source.data() + defs.size(), file_length);
+ if (!s.good()) {
+ BOOST_LOG_TRIVIAL(error) << "Error while loading file: '" << path << "'";
+ return std::string();
+ }
+ s.close();
+
+ if (! defs.empty()) {
+ // Extract the version and flip the order of "defines" and version in the source block.
+ size_t idx = source.find("\n", defs.size());
+ if (idx != std::string::npos && strncmp(source.c_str() + defs.size(), "#version", 8) == 0) {
+ // Swap the version line with the defines.
+ size_t len = idx - defs.size() + 1;
+ memmove(source.data(), source.c_str() + defs.size(), len);
+ memcpy(source.data() + len, defs.c_str(), defs.size());
+ }
+ }
+
+ return source;
+ };
+
+ // Create a block of C "defines" from list of symbols.
+ std::string defines_program;
+ for (std::string_view def : defines)
+ // Our shaders are stored with "\r\n", thus replicate the same here for consistency. Likely "\n" would suffice,
+ // but we don't know all the OpenGL shader compilers around.
+ defines_program += format("#define %s\r\n", def);
+
+ ShaderSources sources = {};
+ for (size_t i = 0; i < static_cast<size_t>(EShaderType::Count); ++i) {
+ sources[i] = filenames[i].empty() ? std::string() : load_from_file(filenames[i], defines_program);
+ }
+
+ bool valid = !sources[static_cast<size_t>(EShaderType::Vertex)].empty() && !sources[static_cast<size_t>(EShaderType::Fragment)].empty() && sources[static_cast<size_t>(EShaderType::Compute)].empty();
+ valid |= !sources[static_cast<size_t>(EShaderType::Compute)].empty() && sources[static_cast<size_t>(EShaderType::Vertex)].empty() && sources[static_cast<size_t>(EShaderType::Fragment)].empty() &&
+ sources[static_cast<size_t>(EShaderType::Geometry)].empty() && sources[static_cast<size_t>(EShaderType::TessEvaluation)].empty() && sources[static_cast<size_t>(EShaderType::TessControl)].empty();
+
+ return valid ? init_from_texts(name, sources) : false;
}
-bool GLShader::load_from_text(const char *fragment_shader, const char *vertex_shader)
+bool GLShaderProgram::init_from_texts(const std::string& name, const ShaderSources& sources)
{
- std::string gl_version = gl_get_string_safe(GL_VERSION);
- int major = atoi(gl_version.c_str());
- //int minor = atoi(gl_version.c_str() + gl_version.find('.') + 1);
- if (major < 2) {
- // Cannot create a shader object on OpenGL 1.x.
- // Form an error message.
- std::string gl_vendor = gl_get_string_safe(GL_VENDOR);
- std::string gl_renderer = gl_get_string_safe(GL_RENDERER);
- std::string glsl_version = gl_get_string_safe(GL_SHADING_LANGUAGE_VERSION);
- last_error = "Your computer does not support OpenGL shaders.\n";
-#ifdef _WIN32
- if (gl_vendor == "Microsoft Corporation" && gl_renderer == "GDI Generic") {
- last_error = "Windows is using a software OpenGL renderer.\n"
- "You are either connected over remote desktop,\n"
- "or a hardware acceleration is not available.\n";
+ auto shader_type_as_string = [](EShaderType type) {
+ switch (type)
+ {
+ case EShaderType::Vertex: { return "vertex"; }
+ case EShaderType::Fragment: { return "fragment"; }
+ case EShaderType::Geometry: { return "geometry"; }
+ case EShaderType::TessEvaluation: { return "tesselation evaluation"; }
+ case EShaderType::TessControl: { return "tesselation control"; }
+ case EShaderType::Compute: { return "compute"; }
+ default: { return "unknown"; }
}
-#endif
- last_error += "GL version: " + gl_version + "\n";
- last_error += "vendor: " + gl_vendor + "\n";
- last_error += "renderer: " + gl_renderer + "\n";
- last_error += "GLSL version: " + glsl_version + "\n";
- return false;
- }
+ };
- if (fragment_shader != nullptr) {
- this->fragment_program_id = ::glCreateShader(GL_FRAGMENT_SHADER);
- glcheck();
- if (this->fragment_program_id == 0) {
- last_error = "glCreateShader(GL_FRAGMENT_SHADER) failed.";
- return false;
+ auto create_shader = [](EShaderType type) {
+ GLuint id = 0;
+ switch (type)
+ {
+ case EShaderType::Vertex: { id = ::glCreateShader(GL_VERTEX_SHADER); glcheck(); break; }
+ case EShaderType::Fragment: { id = ::glCreateShader(GL_FRAGMENT_SHADER); glcheck(); break; }
+ case EShaderType::Geometry: { id = ::glCreateShader(GL_GEOMETRY_SHADER); glcheck(); break; }
+ case EShaderType::TessEvaluation: { id = ::glCreateShader(GL_TESS_EVALUATION_SHADER); glcheck(); break; }
+ case EShaderType::TessControl: { id = ::glCreateShader(GL_TESS_CONTROL_SHADER); glcheck(); break; }
+ case EShaderType::Compute: { id = ::glCreateShader(GL_COMPUTE_SHADER); glcheck(); break; }
+ default: { break; }
}
- GLint len = (GLint)strlen(fragment_shader);
- glsafe(::glShaderSource(this->fragment_program_id, 1, &fragment_shader, &len));
- glsafe(::glCompileShader(this->fragment_program_id));
- GLint params;
- glsafe(::glGetShaderiv(this->fragment_program_id, GL_COMPILE_STATUS, &params));
- if (params == GL_FALSE) {
- // Compilation failed. Get the log.
- glsafe(::glGetShaderiv(this->fragment_program_id, GL_INFO_LOG_LENGTH, &params));
- std::vector<char> msg(params);
- glsafe(::glGetShaderInfoLog(this->fragment_program_id, params, &params, msg.data()));
- this->last_error = std::string("Fragment shader compilation failed:\n") + msg.data();
- this->release();
- return false;
+
+ return (id == 0) ? std::make_pair(false, GLuint(0)) : std::make_pair(true, id);
+ };
+
+ auto release_shaders = [](const std::array<GLuint, static_cast<size_t>(EShaderType::Count)>& shader_ids) {
+ for (size_t i = 0; i < static_cast<size_t>(EShaderType::Count); ++i) {
+ if (shader_ids[i] > 0)
+ glsafe(::glDeleteShader(shader_ids[i]));
}
- }
+ };
- if (vertex_shader != nullptr) {
- this->vertex_program_id = ::glCreateShader(GL_VERTEX_SHADER);
- glcheck();
- if (this->vertex_program_id == 0) {
- last_error = "glCreateShader(GL_VERTEX_SHADER) failed.";
- this->release();
- return false;
- }
- GLint len = (GLint)strlen(vertex_shader);
- glsafe(::glShaderSource(this->vertex_program_id, 1, &vertex_shader, &len));
- glsafe(::glCompileShader(this->vertex_program_id));
- GLint params;
- glsafe(::glGetShaderiv(this->vertex_program_id, GL_COMPILE_STATUS, &params));
- if (params == GL_FALSE) {
- // Compilation failed. Get the log.
- glsafe(::glGetShaderiv(this->vertex_program_id, GL_INFO_LOG_LENGTH, &params));
- std::vector<char> msg(params);
- glsafe(::glGetShaderInfoLog(this->vertex_program_id, params, &params, msg.data()));
- this->last_error = std::string("Vertex shader compilation failed:\n") + msg.data();
- this->release();
- return false;
+ assert(m_id == 0);
+
+ m_name = name;
+
+ std::array<GLuint, static_cast<size_t>(EShaderType::Count)> shader_ids = { 0 };
+
+ for (size_t i = 0; i < static_cast<size_t>(EShaderType::Count); ++i) {
+ const std::string& source = sources[i];
+ if (!source.empty())
+ {
+ EShaderType type = static_cast<EShaderType>(i);
+ auto [result, id] = create_shader(type);
+ if (result)
+ shader_ids[i] = id;
+ else {
+ BOOST_LOG_TRIVIAL(error) << "glCreateShader() failed for " << shader_type_as_string(type) << " shader of shader program '" << name << "'";
+
+ // release shaders
+ release_shaders(shader_ids);
+ return false;
+ }
+
+ const char* source_ptr = source.c_str();
+ glsafe(::glShaderSource(id, 1, &source_ptr, nullptr));
+ glsafe(::glCompileShader(id));
+ GLint params;
+ glsafe(::glGetShaderiv(id, GL_COMPILE_STATUS, &params));
+ if (params == GL_FALSE) {
+ // Compilation failed.
+ glsafe(::glGetShaderiv(id, GL_INFO_LOG_LENGTH, &params));
+ std::vector<char> msg(params);
+ glsafe(::glGetShaderInfoLog(id, params, &params, msg.data()));
+ BOOST_LOG_TRIVIAL(error) << "Unable to compile " << shader_type_as_string(type) << " shader of shader program '" << name << "':\n" << msg.data();
+
+ // release shaders
+ release_shaders(shader_ids);
+ return false;
+ }
}
}
- // Link shaders
- this->shader_program_id = ::glCreateProgram();
+ m_id = ::glCreateProgram();
glcheck();
- if (this->shader_program_id == 0) {
- last_error = "glCreateProgram() failed.";
- this->release();
+ if (m_id == 0) {
+ BOOST_LOG_TRIVIAL(error) << "glCreateProgram() failed for shader program '" << name << "'";
+
+ // release shaders
+ release_shaders(shader_ids);
return false;
}
- if (this->fragment_program_id)
- glsafe(::glAttachShader(this->shader_program_id, this->fragment_program_id));
- if (this->vertex_program_id)
- glsafe(::glAttachShader(this->shader_program_id, this->vertex_program_id));
- glsafe(::glLinkProgram(this->shader_program_id));
+ for (size_t i = 0; i < static_cast<size_t>(EShaderType::Count); ++i) {
+ if (shader_ids[i] > 0)
+ glsafe(::glAttachShader(m_id, shader_ids[i]));
+ }
+ glsafe(::glLinkProgram(m_id));
GLint params;
- glsafe(::glGetProgramiv(this->shader_program_id, GL_LINK_STATUS, &params));
+ glsafe(::glGetProgramiv(m_id, GL_LINK_STATUS, &params));
if (params == GL_FALSE) {
- // Linking failed. Get the log.
- glsafe(::glGetProgramiv(this->shader_program_id, GL_INFO_LOG_LENGTH, &params));
+ // Linking failed.
+ glsafe(::glGetProgramiv(m_id, GL_INFO_LOG_LENGTH, &params));
std::vector<char> msg(params);
- glsafe(::glGetProgramInfoLog(this->shader_program_id, params, &params, msg.data()));
- this->last_error = std::string("Shader linking failed:\n") + msg.data();
- this->release();
- return false;
- }
+ glsafe(::glGetProgramInfoLog(m_id, params, &params, msg.data()));
+ BOOST_LOG_TRIVIAL(error) << "Unable to link shader program '" << name << "':\n" << msg.data();
- last_error.clear();
- return true;
-}
-
-bool GLShader::load_from_file(const char* fragment_shader_filename, const char* vertex_shader_filename)
-{
- const std::string& path = resources_dir() + "/shaders/";
+ // release shaders
+ release_shaders(shader_ids);
- boost::nowide::ifstream vs(path + std::string(vertex_shader_filename), boost::nowide::ifstream::binary);
- if (!vs.good())
- return false;
-
- vs.seekg(0, vs.end);
- int file_length = (int)vs.tellg();
- vs.seekg(0, vs.beg);
- std::string vertex_shader(file_length, '\0');
- vs.read(vertex_shader.data(), file_length);
- if (!vs.good())
- return false;
-
- vs.close();
-
- boost::nowide::ifstream fs(path + std::string(fragment_shader_filename), boost::nowide::ifstream::binary);
- if (!fs.good())
- return false;
+ // release shader program
+ glsafe(::glDeleteProgram(m_id));
+ m_id = 0;
- fs.seekg(0, fs.end);
- file_length = (int)fs.tellg();
- fs.seekg(0, fs.beg);
- std::string fragment_shader(file_length, '\0');
- fs.read(fragment_shader.data(), file_length);
- if (!fs.good())
return false;
-
- fs.close();
-
- return load_from_text(fragment_shader.c_str(), vertex_shader.c_str());
-}
-
-void GLShader::release()
-{
- if (this->shader_program_id) {
- if (this->vertex_program_id)
- glsafe(::glDetachShader(this->shader_program_id, this->vertex_program_id));
- if (this->fragment_program_id)
- glsafe(::glDetachShader(this->shader_program_id, this->fragment_program_id));
- glsafe(::glDeleteProgram(this->shader_program_id));
- this->shader_program_id = 0;
}
- if (this->vertex_program_id) {
- glsafe(::glDeleteShader(this->vertex_program_id));
- this->vertex_program_id = 0;
- }
- if (this->fragment_program_id) {
- glsafe(::glDeleteShader(this->fragment_program_id));
- this->fragment_program_id = 0;
- }
+ // release shaders, they are no more needed
+ release_shaders(shader_ids);
+
+ return true;
}
-void GLShader::enable() const
+void GLShaderProgram::start_using() const
{
- glsafe(::glUseProgram(this->shader_program_id));
+ assert(m_id > 0);
+ glsafe(::glUseProgram(m_id));
}
-void GLShader::disable() const
+void GLShaderProgram::stop_using() const
{
glsafe(::glUseProgram(0));
}
-// Return shader vertex attribute ID
-int GLShader::get_attrib_location(const char *name) const
+bool GLShaderProgram::set_uniform(const char* name, int value) const
{
- return this->shader_program_id ? glGetAttribLocation(this->shader_program_id, name) : -1;
+ int id = get_uniform_location(name);
+ if (id >= 0) {
+ glsafe(::glUniform1i(id, static_cast<GLint>(value)));
+ return true;
+ }
+ return false;
}
-// Return shader uniform variable ID
-int GLShader::get_uniform_location(const char *name) const
+bool GLShaderProgram::set_uniform(const char* name, bool value) const
{
- return this->shader_program_id ? glGetUniformLocation(this->shader_program_id, name) : -1;
+ return set_uniform(name, value ? 1 : 0);
}
-bool GLShader::set_uniform(const char *name, float value) const
+bool GLShaderProgram::set_uniform(const char* name, float value) const
{
- int id = this->get_uniform_location(name);
- if (id >= 0) {
- glsafe(::glUniform1fARB(id, value));
+ int id = get_uniform_location(name);
+ if (id >= 0) {
+ glsafe(::glUniform1f(id, static_cast<GLfloat>(value)));
return true;
}
return false;
}
-bool GLShader::set_uniform(const char* name, const float* matrix) const
+bool GLShaderProgram::set_uniform(const char* name, double value) const
+{
+ return set_uniform(name, static_cast<float>(value));
+}
+
+bool GLShaderProgram::set_uniform(const char* name, const std::array<int, 2>& value) const
{
int id = get_uniform_location(name);
- if (id >= 0)
- {
- glsafe(::glUniformMatrix4fv(id, 1, GL_FALSE, (const GLfloat*)matrix));
+ if (id >= 0) {
+ glsafe(::glUniform2iv(id, 1, static_cast<const GLint*>(value.data())));
return true;
}
return false;
}
-bool GLShader::set_uniform(const char* name, int value) const
+bool GLShaderProgram::set_uniform(const char* name, const std::array<int, 3>& value) const
{
int id = get_uniform_location(name);
- if (id >= 0)
- {
- glsafe(::glUniform1i(id, value));
+ if (id >= 0) {
+ glsafe(::glUniform3iv(id, 1, static_cast<const GLint*>(value.data())));
return true;
}
return false;
}
-/*
-# Set shader vector
-sub SetVector
-{
- my($self,$var,@values) = @_;
-
- my $id = $self->Map($var);
- return 'Unable to map $var' if (!defined($id));
-
- my $count = scalar(@values);
- eval('glUniform'.$count.'fARB($id,@values)');
-
- return '';
-}
-
-# Set shader 4x4 matrix
-sub SetMatrix
-{
- my($self,$var,$oga) = @_;
-
- my $id = $self->Map($var);
- return 'Unable to map $var' if (!defined($id));
-
- glUniformMatrix4fvARB_c($id,1,0,$oga->ptr());
- return '';
-}
-*/
-
-Shader::Shader()
- : m_shader(nullptr)
+bool GLShaderProgram::set_uniform(const char* name, const std::array<int, 4>& value) const
{
+ int id = get_uniform_location(name);
+ if (id >= 0) {
+ glsafe(::glUniform4iv(id, 1, static_cast<const GLint*>(value.data())));
+ return true;
+ }
+ return false;
}
-Shader::~Shader()
-{
- reset();
-}
-
-bool Shader::init(const std::string& vertex_shader_filename, const std::string& fragment_shader_filename)
+bool GLShaderProgram::set_uniform(const char* name, const std::array<float, 2>& value) const
{
- if (is_initialized())
+ int id = get_uniform_location(name);
+ if (id >= 0) {
+ glsafe(::glUniform2fv(id, 1, static_cast<const GLfloat*>(value.data())));
return true;
-
- m_shader = new GLShader();
- if (m_shader != nullptr)
- {
- if (!m_shader->load_from_file(fragment_shader_filename.c_str(), vertex_shader_filename.c_str()))
- {
- std::cout << "Compilaton of shader failed:" << std::endl;
- std::cout << m_shader->last_error << std::endl;
- reset();
- return false;
- }
}
-
- return true;
+ return false;
}
-bool Shader::is_initialized() const
+bool GLShaderProgram::set_uniform(const char* name, const std::array<float, 3>& value) const
{
- return (m_shader != nullptr);
+ int id = get_uniform_location(name);
+ if (id >= 0) {
+ glsafe(::glUniform3fv(id, 1, static_cast<const GLfloat*>(value.data())));
+ return true;
+ }
+ return false;
}
-bool Shader::start_using() const
+bool GLShaderProgram::set_uniform(const char* name, const std::array<float, 4>& value) const
{
- if (is_initialized())
- {
- m_shader->enable();
+ int id = get_uniform_location(name);
+ if (id >= 0) {
+ glsafe(::glUniform4fv(id, 1, static_cast<const GLfloat*>(value.data())));
return true;
}
- else
- return false;
+ return false;
}
-void Shader::stop_using() const
+bool GLShaderProgram::set_uniform(const char* name, const float* value, size_t size) const
{
- if (m_shader != nullptr)
- m_shader->disable();
+ if (size == 1)
+ return set_uniform(name, value[0]);
+ else if (size < 5) {
+ int id = get_uniform_location(name);
+ if (id >= 0) {
+ if (size == 2)
+ glsafe(::glUniform2fv(id, 1, static_cast<const GLfloat*>(value)));
+ else if (size == 3)
+ glsafe(::glUniform3fv(id, 1, static_cast<const GLfloat*>(value)));
+ else
+ glsafe(::glUniform4fv(id, 1, static_cast<const GLfloat*>(value)));
+
+ return true;
+ }
+ }
+ return false;
}
-int Shader::get_attrib_location(const std::string& name) const
+bool GLShaderProgram::set_uniform(const char* name, const Transform3f& value) const
{
- return (m_shader != nullptr) ? m_shader->get_attrib_location(name.c_str()) : -1;
+ int id = get_uniform_location(name);
+ if (id >= 0) {
+ glsafe(::glUniformMatrix4fv(id, 1, GL_FALSE, static_cast<const GLfloat*>(value.matrix().data())));
+ return true;
+ }
+ return false;
}
-int Shader::get_uniform_location(const std::string& name) const
+bool GLShaderProgram::set_uniform(const char* name, const Transform3d& value) const
{
- return (m_shader != nullptr) ? m_shader->get_uniform_location(name.c_str()) : -1;
+ return set_uniform(name, value.cast<float>());
}
-void Shader::set_uniform(const std::string& name, float value) const
+bool GLShaderProgram::set_uniform(const char* name, const Matrix3f& value) const
{
- if (m_shader != nullptr)
- m_shader->set_uniform(name.c_str(), value);
+ int id = get_uniform_location(name);
+ if (id >= 0) {
+ glsafe(::glUniformMatrix3fv(id, 1, GL_FALSE, static_cast<const GLfloat*>(value.data())));
+ return true;
+ }
+ return false;
}
-void Shader::set_uniform(const std::string& name, const float* matrix) const
+bool GLShaderProgram::set_uniform(const char* name, const Vec3f& value) const
{
- if (m_shader != nullptr)
- m_shader->set_uniform(name.c_str(), matrix);
+ int id = get_uniform_location(name);
+ if (id >= 0) {
+ glsafe(::glUniform3fv(id, 1, static_cast<const GLfloat*>(value.data())));
+ return true;
+ }
+ return false;
}
-void Shader::set_uniform(const std::string& name, bool value) const
+bool GLShaderProgram::set_uniform(const char* name, const Vec3d& value) const
{
- if (m_shader != nullptr)
- m_shader->set_uniform(name.c_str(), value ? 1 : 0);
+ return set_uniform(name, static_cast<Vec3f>(value.cast<float>()));
}
-unsigned int Shader::get_shader_program_id() const
+int GLShaderProgram::get_attrib_location(const char* name) const
{
- return (m_shader != nullptr) ? m_shader->shader_program_id : 0;
+ return (m_id > 0) ? ::glGetAttribLocation(m_id, name) : -1;
}
-void Shader::reset()
+int GLShaderProgram::get_uniform_location(const char* name) const
{
- if (m_shader != nullptr)
- {
- m_shader->release();
- delete m_shader;
- m_shader = nullptr;
- }
+ return (m_id > 0) ? ::glGetUniformLocation(m_id, name) : -1;
}
} // namespace Slic3r
diff --git a/src/slic3r/GUI/GLShader.hpp b/src/slic3r/GUI/GLShader.hpp
index df2a23f15..c92ea274a 100644
--- a/src/slic3r/GUI/GLShader.hpp
+++ b/src/slic3r/GUI/GLShader.hpp
@@ -1,71 +1,70 @@
#ifndef slic3r_GLShader_hpp_
#define slic3r_GLShader_hpp_
-#include "libslic3r/libslic3r.h"
+#include <array>
+#include <string>
+#include <string_view>
+
#include "libslic3r/Point.hpp"
namespace Slic3r {
-class GLShader
+class GLShaderProgram
{
public:
- GLShader() :
- fragment_program_id(0),
- vertex_program_id(0),
- shader_program_id(0)
- {}
- ~GLShader();
-
- bool load_from_text(const char *fragment_shader, const char *vertex_shader);
- bool load_from_file(const char* fragment_shader_filename, const char* vertex_shader_filename);
-
- void release();
-
- int get_attrib_location(const char *name) const;
- int get_uniform_location(const char *name) const;
-
- bool set_uniform(const char *name, float value) const;
- bool set_uniform(const char* name, const float* matrix) const;
- bool set_uniform(const char* name, int value) const;
-
- void enable() const;
- void disable() const;
-
- unsigned int fragment_program_id;
- unsigned int vertex_program_id;
- unsigned int shader_program_id;
- std::string last_error;
-};
+ enum class EShaderType
+ {
+ Vertex,
+ Fragment,
+ Geometry,
+ TessEvaluation,
+ TessControl,
+ Compute,
+ Count
+ };
+
+ typedef std::array<std::string, static_cast<size_t>(EShaderType::Count)> ShaderFilenames;
+ typedef std::array<std::string, static_cast<size_t>(EShaderType::Count)> ShaderSources;
-class Shader
-{
- GLShader* m_shader;
+private:
+ std::string m_name;
+ unsigned int m_id{ 0 };
public:
- Shader();
- ~Shader();
+ ~GLShaderProgram();
- bool init(const std::string& vertex_shader_filename, const std::string& fragment_shader_filename);
+ bool init_from_files(const std::string& name, const ShaderFilenames& filenames, const std::initializer_list<std::string_view> &defines = {});
+ bool init_from_texts(const std::string& name, const ShaderSources& sources);
- bool is_initialized() const;
+ const std::string& get_name() const { return m_name; }
+ unsigned int get_id() const { return m_id; }
- bool start_using() const;
+ void start_using() const;
void stop_using() const;
- int get_attrib_location(const std::string& name) const;
- int get_uniform_location(const std::string& name) const;
-
- void set_uniform(const std::string& name, float value) const;
- void set_uniform(const std::string& name, const float* matrix) const;
- void set_uniform(const std::string& name, bool value) const;
-
- const GLShader* get_shader() const { return m_shader; }
- unsigned int get_shader_program_id() const;
-
-private:
- void reset();
+ bool set_uniform(const char* name, int value) const;
+ bool set_uniform(const char* name, bool value) const;
+ bool set_uniform(const char* name, float value) const;
+ bool set_uniform(const char* name, double value) const;
+ bool set_uniform(const char* name, const std::array<int, 2>& value) const;
+ bool set_uniform(const char* name, const std::array<int, 3>& value) const;
+ bool set_uniform(const char* name, const std::array<int, 4>& value) const;
+ bool set_uniform(const char* name, const std::array<float, 2>& value) const;
+ bool set_uniform(const char* name, const std::array<float, 3>& value) const;
+ bool set_uniform(const char* name, const std::array<float, 4>& value) const;
+ bool set_uniform(const char* name, const float* value, size_t size) const;
+ bool set_uniform(const char* name, const Transform3f& value) const;
+ bool set_uniform(const char* name, const Transform3d& value) const;
+ bool set_uniform(const char* name, const Matrix3f& value) const;
+ bool set_uniform(const char* name, const Vec3f& value) const;
+ bool set_uniform(const char* name, const Vec3d& value) const;
+
+ // returns -1 if not found
+ int get_attrib_location(const char* name) const;
+ // returns -1 if not found
+ int get_uniform_location(const char* name) const;
};
-}
+} // namespace Slic3r
#endif /* slic3r_GLShader_hpp_ */
diff --git a/src/slic3r/GUI/GLShadersManager.cpp b/src/slic3r/GUI/GLShadersManager.cpp
new file mode 100644
index 000000000..5ee14c526
--- /dev/null
+++ b/src/slic3r/GUI/GLShadersManager.cpp
@@ -0,0 +1,80 @@
+#include "libslic3r/libslic3r.h"
+#include "GLShadersManager.hpp"
+#include "3DScene.hpp"
+#include "GUI_App.hpp"
+
+#include <cassert>
+#include <algorithm>
+#include <string_view>
+using namespace std::literals;
+
+#include <GL/glew.h>
+
+namespace Slic3r {
+
+std::pair<bool, std::string> GLShadersManager::init()
+{
+ std::string error;
+
+ auto append_shader = [this, &error](const std::string& name, const GLShaderProgram::ShaderFilenames& filenames,
+ const std::initializer_list<std::string_view> &defines = {}) {
+ m_shaders.push_back(std::make_unique<GLShaderProgram>());
+ if (!m_shaders.back()->init_from_files(name, filenames, defines)) {
+ error += name + "\n";
+ // if any error happens while initializating the shader, we remove it from the list
+ m_shaders.pop_back();
+ return false;
+ }
+ return true;
+ };
+
+ assert(m_shaders.empty());
+
+ bool valid = true;
+
+ // used to render bed axes and model, selection hints, gcode sequential view marker model, preview shells
+ valid &= append_shader("gouraud_light", { "gouraud_light.vs", "gouraud_light.fs" });
+ // used to render printbed
+ valid &= append_shader("printbed", { "printbed.vs", "printbed.fs" });
+ // used to render options in gcode preview
+ valid &= append_shader("options_110", { "options_110.vs", "options_110.fs" });
+ if (GUI::wxGetApp().is_glsl_version_greater_or_equal_to(1, 20))
+ valid &= append_shader("options_120", { "options_120.vs", "options_120.fs" });
+ // used to render extrusion and travel paths as lines in gcode preview
+ valid &= append_shader("toolpaths_lines", { "toolpaths_lines.vs", "toolpaths_lines.fs" });
+ // used to render objects in 3d editor
+ valid &= append_shader("gouraud", { "gouraud.vs", "gouraud.fs" }
+#if ENABLE_ENVIRONMENT_MAP
+ , { "ENABLE_ENVIRONMENT_MAP"sv }
+#endif
+ );
+ // used to render variable layers heights in 3d editor
+ valid &= append_shader("variable_layer_height", { "variable_layer_height.vs", "variable_layer_height.fs" });
+
+ return { valid, error };
+}
+
+void GLShadersManager::shutdown()
+{
+ m_shaders.clear();
+}
+
+GLShaderProgram* GLShadersManager::get_shader(const std::string& shader_name)
+{
+ auto it = std::find_if(m_shaders.begin(), m_shaders.end(), [&shader_name](std::unique_ptr<GLShaderProgram>& p) { return p->get_name() == shader_name; });
+ return (it != m_shaders.end()) ? it->get() : nullptr;
+}
+
+GLShaderProgram* GLShadersManager::get_current_shader()
+{
+ GLint id = 0;
+ glsafe(::glGetIntegerv(GL_CURRENT_PROGRAM, &id));
+ if (id == 0)
+ return nullptr;
+
+ auto it = std::find_if(m_shaders.begin(), m_shaders.end(), [id](std::unique_ptr<GLShaderProgram>& p) { return static_cast<GLint>(p->get_id()) == id; });
+ return (it != m_shaders.end()) ? it->get() : nullptr;
+}
+
+} // namespace Slic3r
+
diff --git a/src/slic3r/GUI/GLShadersManager.hpp b/src/slic3r/GUI/GLShadersManager.hpp
new file mode 100644
index 000000000..b2bbc140b
--- /dev/null
+++ b/src/slic3r/GUI/GLShadersManager.hpp
@@ -0,0 +1,30 @@
+#ifndef slic3r_GLShadersManager_hpp_
+#define slic3r_GLShadersManager_hpp_
+
+#include "GLShader.hpp"
+
+#include <vector>
+#include <string>
+#include <memory>
+
+namespace Slic3r {
+
+class GLShadersManager
+{
+ std::vector<std::unique_ptr<GLShaderProgram>> m_shaders;
+
+public:
+ std::pair<bool, std::string> init();
+ // call this method before to release the OpenGL context
+ void shutdown();
+
+ // returns nullptr if not found
+ GLShaderProgram* get_shader(const std::string& shader_name);
+
+ // returns currently active shader, nullptr if none
+ GLShaderProgram* get_current_shader();
+};
+
+} // namespace Slic3r
+
+#endif // slic3r_GLShadersManager_hpp_
diff --git a/src/slic3r/GUI/GLTexture.cpp b/src/slic3r/GUI/GLTexture.cpp
index f178ddc73..b97d8ae48 100644
--- a/src/slic3r/GUI/GLTexture.cpp
+++ b/src/slic3r/GUI/GLTexture.cpp
@@ -2,6 +2,7 @@
#include "GLTexture.hpp"
#include "3DScene.hpp"
+#include "OpenGLManager.hpp"
#include <GL/glew.h>
@@ -74,11 +75,9 @@ void GLTexture::Compressor::send_compressed_data_to_gpu()
glsafe(::glBindTexture(GL_TEXTURE_2D, m_texture.m_id));
// Querying the atomic m_num_levels_compressed value synchronizes processor caches, so that the dat of m_levels modified by the worker thread are accessible to the calling thread.
int num_compressed = (int)m_num_levels_compressed;
- for (int i = 0; i < num_compressed; ++ i)
- {
+ for (int i = 0; i < num_compressed; ++ i) {
Level& level = m_levels[i];
- if (! level.sent_to_gpu && ! level.compressed_data.empty())
- {
+ if (! level.sent_to_gpu && ! level.compressed_data.empty()) {
glsafe(::glCompressedTexSubImage2D(GL_TEXTURE_2D, (GLint)i, 0, 0, (GLsizei)level.w, (GLsizei)level.h, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, (GLsizei)level.compressed_data.size(), (const GLvoid*)level.compressed_data.data()));
glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, i));
glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, (i > 0) ? GL_LINEAR_MIPMAP_LINEAR : GL_LINEAR));
@@ -101,14 +100,13 @@ void GLTexture::Compressor::compress()
assert(m_num_levels_compressed == 0);
assert(m_abort_compressing == false);
- for (Level& level : m_levels)
- {
+ for (Level& level : m_levels) {
if (m_abort_compressing)
break;
// stb_dxt library, despite claiming that the needed size of the destination buffer is equal to (source buffer size)/4,
- // crashes if doing so, requiring a minimum of 16 bytes and up to a third of the source buffer size, so we set the destination buffer initial size to be half the source buffer size
- level.compressed_data = std::vector<unsigned char>(std::max((unsigned int)16, level.w * level.h * 2), 0);
+ // crashes if doing so, requiring a minimum of 64 bytes and up to a third of the source buffer size, so we set the destination buffer initial size to be half the source buffer size
+ level.compressed_data = std::vector<unsigned char>(std::max((unsigned int)64, (unsigned int)level.src_data.size() / 2), 0);
int compressed_size = 0;
rygCompress(level.compressed_data.data(), level.src_data.data(), level.w, level.h, 1, compressed_size);
level.compressed_data.resize(compressed_size);
@@ -165,7 +163,7 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vector<std::stri
{
reset();
- if (filenames.empty() || states.empty() || (sprite_size_px == 0))
+ if (filenames.empty() || states.empty() || sprite_size_px == 0)
return false;
// every tile needs to have a 1px border around it to avoid artifacts when linear sampling on its edges
@@ -179,8 +177,7 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vector<std::stri
int sprite_stride = sprite_size_px_ex * 4;
int sprite_bytes = sprite_n_pixels * 4;
- if (n_pixels <= 0)
- {
+ if (n_pixels <= 0) {
reset();
return false;
}
@@ -192,15 +189,13 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vector<std::stri
std::vector<unsigned char> output_data(sprite_bytes, 0);
NSVGrasterizer* rast = nsvgCreateRasterizer();
- if (rast == nullptr)
- {
+ if (rast == nullptr) {
reset();
return false;
}
int sprite_id = -1;
- for (const std::string& filename : filenames)
- {
+ for (const std::string& filename : filenames) {
++sprite_id;
if (!boost::filesystem::exists(filename))
@@ -220,8 +215,7 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vector<std::stri
// makes white only copy of the sprite
::memcpy((void*)sprite_white_only_data.data(), (const void*)sprite_data.data(), sprite_bytes);
- for (int i = 0; i < sprite_n_pixels; ++i)
- {
+ for (int i = 0; i < sprite_n_pixels; ++i) {
int offset = i * 4;
if (sprite_white_only_data.data()[offset] != 0)
::memset((void*)&sprite_white_only_data.data()[offset], 255, 3);
@@ -229,8 +223,7 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vector<std::stri
// makes gray only copy of the sprite
::memcpy((void*)sprite_gray_only_data.data(), (const void*)sprite_data.data(), sprite_bytes);
- for (int i = 0; i < sprite_n_pixels; ++i)
- {
+ for (int i = 0; i < sprite_n_pixels; ++i) {
int offset = i * 4;
if (sprite_gray_only_data.data()[offset] != 0)
::memset((void*)&sprite_gray_only_data.data()[offset], 128, 3);
@@ -238,30 +231,26 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vector<std::stri
int sprite_offset_px = sprite_id * (int)sprite_size_px_ex * m_width;
int state_id = -1;
- for (const std::pair<int, bool>& state : states)
- {
+ for (const std::pair<int, bool>& state : states) {
++state_id;
// select the sprite variant
std::vector<unsigned char>* src = nullptr;
switch (state.first)
{
- case 1: { src = &sprite_white_only_data; break; }
- case 2: { src = &sprite_gray_only_data; break; }
+ case 1: { src = &sprite_white_only_data; break; }
+ case 2: { src = &sprite_gray_only_data; break; }
default: { src = &sprite_data; break; }
}
::memcpy((void*)output_data.data(), (const void*)src->data(), sprite_bytes);
// applies background, if needed
- if (state.second)
- {
+ if (state.second) {
float inv_255 = 1.0f / 255.0f;
// offset by 1 to leave the first pixel empty (both in x and y)
- for (unsigned int r = 1; r <= sprite_size_px; ++r)
- {
+ for (unsigned int r = 1; r <= sprite_size_px; ++r) {
unsigned int offset_r = r * sprite_size_px_ex;
- for (unsigned int c = 1; c <= sprite_size_px; ++c)
- {
+ for (unsigned int c = 1; c <= sprite_size_px; ++c) {
unsigned int offset = (offset_r + c) * 4;
float alpha = (float)output_data.data()[offset + 3] * inv_255;
output_data.data()[offset + 0] = (unsigned char)(output_data.data()[offset + 0] * alpha);
@@ -273,8 +262,7 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vector<std::stri
}
int state_offset_px = sprite_offset_px + state_id * sprite_size_px_ex;
- for (int j = 0; j < (int)sprite_size_px_ex; ++j)
- {
+ for (int j = 0; j < (int)sprite_size_px_ex; ++j) {
::memcpy((void*)&data.data()[(state_offset_px + j * m_width) * 4], (const void*)&output_data.data()[j * sprite_stride], sprite_stride);
}
}
@@ -308,11 +296,9 @@ bool GLTexture::load_from_svg_files_as_sprites_array(const std::vector<std::stri
wxImage output(m_width, m_height);
output.InitAlpha();
- for (int h = 0; h < m_height; ++h)
- {
+ for (int h = 0; h < m_height; ++h) {
int px_h = h * m_width;
- for (int w = 0; w < m_width; ++w)
- {
+ for (int w = 0; w < m_width; ++w) {
int offset = (px_h + w) * 4;
output.SetRGB(w, h, data.data()[offset + 0], data.data()[offset + 1], data.data()[offset + 2]);
output.SetAlpha(w, h, data.data()[offset + 3]);
@@ -372,8 +358,7 @@ bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps, ECo
// Load a PNG with an alpha channel.
wxImage image;
- if (!image.LoadFile(wxString::FromUTF8(filename.c_str()), wxBITMAP_TYPE_PNG))
- {
+ if (!image.LoadFile(wxString::FromUTF8(filename.c_str()), wxBITMAP_TYPE_PNG)) {
reset();
return false;
}
@@ -383,20 +368,17 @@ bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps, ECo
bool requires_rescale = false;
- if (compression_enabled && (compression_type == MultiThreaded))
- {
+ if (compression_enabled && compression_type == MultiThreaded) {
// the stb_dxt compression library seems to like only texture sizes which are a multiple of 4
int width_rem = m_width % 4;
int height_rem = m_height % 4;
- if (width_rem != 0)
- {
+ if (width_rem != 0) {
m_width += (4 - width_rem);
requires_rescale = true;
}
- if (height_rem != 0)
- {
+ if (height_rem != 0) {
m_height += (4 - height_rem);
requires_rescale = true;
}
@@ -406,16 +388,14 @@ bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps, ECo
image = image.ResampleBicubic(m_width, m_height);
int n_pixels = m_width * m_height;
- if (n_pixels <= 0)
- {
+ if (n_pixels <= 0) {
reset();
return false;
}
// Get RGB & alpha raw data from wxImage, pack them into an array.
unsigned char* img_rgb = image.GetData();
- if (img_rgb == nullptr)
- {
+ if (img_rgb == nullptr) {
reset();
return false;
}
@@ -423,8 +403,7 @@ bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps, ECo
unsigned char* img_alpha = image.GetAlpha();
std::vector<unsigned char> data(n_pixels * 4, 0);
- for (int i = 0; i < n_pixels; ++i)
- {
+ for (int i = 0; i < n_pixels; ++i) {
int data_id = i * 4;
int img_id = i * 3;
data[data_id + 0] = img_rgb[img_id + 0];
@@ -438,19 +417,16 @@ bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps, ECo
glsafe(::glGenTextures(1, &m_id));
glsafe(::glBindTexture(GL_TEXTURE_2D, m_id));
- if (apply_anisotropy)
- {
- GLfloat max_anisotropy = GLCanvas3DManager::get_gl_info().get_max_anisotropy();
+ if (apply_anisotropy) {
+ GLfloat max_anisotropy = OpenGLManager::get_gl_info().get_max_anisotropy();
if (max_anisotropy > 1.0f)
glsafe(::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, max_anisotropy));
}
- if (compression_enabled)
- {
+ if (compression_enabled) {
if (compression_type == SingleThreaded)
glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, (GLsizei)m_width, (GLsizei)m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data()));
- else
- {
+ else {
// initializes the texture on GPU
glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, (GLsizei)m_width, (GLsizei)m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0));
// and send the uncompressed data to the compressor
@@ -460,14 +436,12 @@ bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps, ECo
else
glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)m_width, (GLsizei)m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data()));
- if (use_mipmaps)
- {
+ if (use_mipmaps) {
// we manually generate mipmaps because glGenerateMipmap() function is not reliable on all graphics cards
int lod_w = m_width;
int lod_h = m_height;
GLint level = 0;
- while ((lod_w > 1) || (lod_h > 1))
- {
+ while (lod_w > 1 || lod_h > 1) {
++level;
lod_w = std::max(lod_w / 2, 1);
@@ -481,8 +455,7 @@ bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps, ECo
img_rgb = image.GetData();
img_alpha = image.GetAlpha();
- for (int i = 0; i < n_pixels; ++i)
- {
+ for (int i = 0; i < n_pixels; ++i) {
int data_id = i * 4;
int img_id = i * 3;
data[data_id + 0] = img_rgb[img_id + 0];
@@ -491,12 +464,10 @@ bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps, ECo
data[data_id + 3] = (img_alpha != nullptr) ? img_alpha[i] : 255;
}
- if (compression_enabled)
- {
+ if (compression_enabled) {
if (compression_type == SingleThreaded)
glsafe(::glTexImage2D(GL_TEXTURE_2D, level, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, (GLsizei)m_width, (GLsizei)m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data()));
- else
- {
+ else {
// initializes the texture on GPU
glsafe(::glTexImage2D(GL_TEXTURE_2D, level, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, (GLsizei)lod_w, (GLsizei)lod_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0));
// and send the uncompressed data to the compressor
@@ -507,14 +478,12 @@ bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps, ECo
glsafe(::glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, (GLsizei)lod_w, (GLsizei)lod_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data()));
}
- if (!compression_enabled)
- {
+ if (!compression_enabled) {
glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, level));
glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR));
}
}
- else
- {
+ else {
glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR));
glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0));
}
@@ -525,7 +494,7 @@ bool GLTexture::load_from_png(const std::string& filename, bool use_mipmaps, ECo
m_source = filename;
- if (compression_enabled && (compression_type == MultiThreaded))
+ if (compression_enabled && compression_type == MultiThreaded)
// start asynchronous compression
m_compressor.start_compressing();
@@ -537,8 +506,7 @@ bool GLTexture::load_from_svg(const std::string& filename, bool use_mipmaps, boo
bool compression_enabled = compress && GLEW_EXT_texture_compression_s3tc;
NSVGimage* image = nsvgParseFromFile(filename.c_str(), "px", 96.0f);
- if (image == nullptr)
- {
+ if (image == nullptr) {
reset();
return false;
}
@@ -548,8 +516,7 @@ bool GLTexture::load_from_svg(const std::string& filename, bool use_mipmaps, boo
m_width = (int)(scale * image->width);
m_height = (int)(scale * image->height);
- if (compression_enabled)
- {
+ if (compression_enabled) {
// the stb_dxt compression library seems to like only texture sizes which are a multiple of 4
int width_rem = m_width % 4;
int height_rem = m_height % 4;
@@ -563,16 +530,14 @@ bool GLTexture::load_from_svg(const std::string& filename, bool use_mipmaps, boo
int n_pixels = m_width * m_height;
- if (n_pixels <= 0)
- {
+ if (n_pixels <= 0) {
reset();
nsvgDelete(image);
return false;
}
NSVGrasterizer* rast = nsvgCreateRasterizer();
- if (rast == nullptr)
- {
+ if (rast == nullptr) {
nsvgDelete(image);
reset();
return false;
@@ -587,15 +552,13 @@ bool GLTexture::load_from_svg(const std::string& filename, bool use_mipmaps, boo
glsafe(::glGenTextures(1, &m_id));
glsafe(::glBindTexture(GL_TEXTURE_2D, m_id));
- if (apply_anisotropy)
- {
- GLfloat max_anisotropy = GLCanvas3DManager::get_gl_info().get_max_anisotropy();
+ if (apply_anisotropy) {
+ GLfloat max_anisotropy = OpenGLManager::get_gl_info().get_max_anisotropy();
if (max_anisotropy > 1.0f)
glsafe(::glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAX_ANISOTROPY_EXT, max_anisotropy));
}
- if (compression_enabled)
- {
+ if (compression_enabled) {
// initializes the texture on GPU
glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, (GLsizei)m_width, (GLsizei)m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0));
// and send the uncompressed data to the compressor
@@ -604,14 +567,12 @@ bool GLTexture::load_from_svg(const std::string& filename, bool use_mipmaps, boo
else
glsafe(::glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)m_width, (GLsizei)m_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data()));
- if (use_mipmaps)
- {
+ if (use_mipmaps) {
// we manually generate mipmaps because glGenerateMipmap() function is not reliable on all graphics cards
int lod_w = m_width;
int lod_h = m_height;
GLint level = 0;
- while ((lod_w > 1) || (lod_h > 1))
- {
+ while (lod_w > 1 || lod_h > 1) {
++level;
lod_w = std::max(lod_w / 2, 1);
@@ -621,8 +582,7 @@ bool GLTexture::load_from_svg(const std::string& filename, bool use_mipmaps, boo
data.resize(lod_w * lod_h * 4);
nsvgRasterize(rast, image, 0, 0, scale, data.data(), lod_w, lod_h, lod_w * 4);
- if (compression_enabled)
- {
+ if (compression_enabled) {
// initializes the texture on GPU
glsafe(::glTexImage2D(GL_TEXTURE_2D, level, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT, (GLsizei)lod_w, (GLsizei)lod_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0));
// and send the uncompressed data to the compressor
@@ -632,14 +592,12 @@ bool GLTexture::load_from_svg(const std::string& filename, bool use_mipmaps, boo
glsafe(::glTexImage2D(GL_TEXTURE_2D, level, GL_RGBA, (GLsizei)lod_w, (GLsizei)lod_h, 0, GL_RGBA, GL_UNSIGNED_BYTE, (const void*)data.data()));
}
- if (!compression_enabled)
- {
+ if (!compression_enabled) {
glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, level));
glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR));
}
}
- else
- {
+ else {
glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR));
glsafe(::glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, 0));
}
diff --git a/src/slic3r/GUI/GLToolbar.cpp b/src/slic3r/GUI/GLToolbar.cpp
index c7b391cd6..79e7ea1c6 100644
--- a/src/slic3r/GUI/GLToolbar.cpp
+++ b/src/slic3r/GUI/GLToolbar.cpp
@@ -3,9 +3,10 @@
#include "GLToolbar.hpp"
-#include "../../slic3r/GUI/GLCanvas3D.hpp"
-
-#include <GL/glew.h>
+#include "slic3r/GUI/GLCanvas3D.hpp"
+#include "slic3r/GUI/GUI_App.hpp"
+#include "slic3r/GUI/Camera.hpp"
+#include "slic3r/GUI/Plater.hpp"
#include <wx/event.h>
#include <wx/bitmap.h>
@@ -16,7 +17,6 @@
namespace Slic3r {
namespace GUI {
-
wxDEFINE_EVENT(EVT_GLTOOLBAR_ADD, SimpleEvent);
wxDEFINE_EVENT(EVT_GLTOOLBAR_DELETE, SimpleEvent);
wxDEFINE_EVENT(EVT_GLTOOLBAR_DELETE_ALL, SimpleEvent);
@@ -70,8 +70,8 @@ bool GLToolbarItem::update_visibility()
bool ret = (m_data.visible != visible);
if (ret)
m_data.visible = visible;
-
- return ret;
+ // Return false for separator as it would always return true.
+ return is_separator() ? false : ret;
}
bool GLToolbarItem::update_enabled_state()
@@ -86,7 +86,7 @@ bool GLToolbarItem::update_enabled_state()
void GLToolbarItem::render(unsigned int tex_id, float left, float right, float bottom, float top, unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) const
{
- auto uvs = [this](unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) ->GLTexture::Quad_UVs
+ auto uvs = [this](unsigned int tex_width, unsigned int tex_height, unsigned int icon_size) -> GLTexture::Quad_UVs
{
assert((tex_width != 0) && (tex_height != 0));
GLTexture::Quad_UVs ret;
@@ -154,7 +154,6 @@ GLToolbar::GLToolbar(GLToolbar::EType type, const std::string& name)
, m_name(name)
, m_enabled(false)
, m_icons_texture_dirty(true)
- , m_tooltip("")
, m_pressed_toggable_id(-1)
{
}
@@ -231,24 +230,13 @@ void GLToolbar::set_icons_size(float size)
void GLToolbar::set_scale(float scale)
{
- if (m_layout.scale != scale)
- {
+ if (m_layout.scale != scale) {
m_layout.scale = scale;
m_layout.dirty = true;
m_icons_texture_dirty = true;
}
}
-bool GLToolbar::is_enabled() const
-{
- return m_enabled;
-}
-
-void GLToolbar::set_enabled(bool enable)
-{
- m_enabled = true;
-}
-
bool GLToolbar::add_item(const GLToolbarItem::Data& data)
{
GLToolbarItem* item = new GLToolbarItem(GLToolbarItem::Action, data);
@@ -358,29 +346,50 @@ int GLToolbar::get_item_id(const std::string& name) const
return -1;
}
-void GLToolbar::get_additional_tooltip(int item_id, std::string& text)
+std::string GLToolbar::get_tooltip() const
{
- if ((0 <= item_id) && (item_id < (int)m_items.size()))
+ std::string tooltip;
+
+ for (GLToolbarItem* item : m_items)
{
- GLToolbarItem* item = m_items[item_id];
- if (item != nullptr)
+ if (item->is_hovered())
{
- text = item->get_additional_tooltip();
- return;
+ tooltip = item->get_tooltip();
+ if (!item->is_pressed())
+ {
+ const std::string& additional_tooltip = item->get_additional_tooltip();
+ if (!additional_tooltip.empty())
+ tooltip += "\n" + additional_tooltip;
+
+ break;
+ }
}
}
- text.clear();
+ return tooltip;
}
-void GLToolbar::set_additional_tooltip(int item_id, const std::string& text)
+void GLToolbar::get_additional_tooltip(int item_id, std::string& text)
{
- if ((0 <= item_id) && (item_id < (int)m_items.size()))
+ if (0 <= item_id && item_id < (int)m_items.size())
{
- GLToolbarItem* item = m_items[item_id];
- if (item != nullptr)
- item->set_additional_tooltip(text);
+ text = m_items[item_id]->get_additional_tooltip();
+ return;
}
+
+ text.clear();
+}
+
+void GLToolbar::set_additional_tooltip(int item_id, const std::string& text)
+{
+ if (0 <= item_id && item_id < (int)m_items.size())
+ m_items[item_id]->set_additional_tooltip(text);
+}
+
+void GLToolbar::set_tooltip(int item_id, const std::string& text)
+{
+ if (0 <= item_id && item_id < (int)m_items.size())
+ m_items[item_id]->set_tooltip(text);
}
bool GLToolbar::update_items_state()
@@ -425,17 +434,13 @@ bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent)
// prevents loosing selection into the scene if mouse down was done inside the toolbar and mouse up was down outside it,
// as when switching between views
m_mouse_capture.reset();
- if (contains_mouse(mouse_pos, parent) == -1)
- // mouse is outside the toolbar
- m_tooltip.clear();
return true;
}
m_mouse_capture.reset();
}
-#if ENABLE_MODIFIED_TOOLBAR_MOUSE_EVENT_HANDLING
if (evt.Moving())
- m_tooltip = update_hover_state(mouse_pos, parent);
+ update_hover_state(mouse_pos, parent);
else if (evt.LeftUp())
{
if (m_mouse_capture.left)
@@ -474,27 +479,9 @@ bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent)
else
return false;
}
-#else
- if (evt.Moving())
- m_tooltip = update_hover_state(mouse_pos, parent);
- else if (evt.LeftUp())
- m_mouse_capture.left = false;
- else if (evt.MiddleUp())
- m_mouse_capture.middle = false;
- else if (evt.RightUp())
- m_mouse_capture.right = false;
- else if (evt.Dragging() && m_mouse_capture.any())
- // if the button down was done on this toolbar, prevent from dragging into the scene
- processed = true;
-#endif // ENABLE_MODIFIED_TOOLBAR_MOUSE_EVENT_HANDLING
int item_id = contains_mouse(mouse_pos, parent);
- if (item_id == -1)
- {
- // mouse is outside the toolbar
- m_tooltip.clear();
- }
- else
+ if (item_id != -1)
{
// mouse inside toolbar
if (evt.LeftDown() || evt.LeftDClick())
@@ -502,7 +489,8 @@ bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent)
m_mouse_capture.left = true;
m_mouse_capture.parent = &parent;
processed = true;
- if ((item_id != -2) && !m_items[item_id]->is_separator() && ((m_pressed_toggable_id == -1) || (m_items[item_id]->get_last_action_type() == GLToolbarItem::Left)))
+ if ((item_id != -2) && !m_items[item_id]->is_separator() && !m_items[item_id]->is_disabled() &&
+ ((m_pressed_toggable_id == -1) || (m_items[item_id]->get_last_action_type() == GLToolbarItem::Left)))
{
// mouse is inside an icon
do_action(GLToolbarItem::Left, item_id, parent, true);
@@ -519,17 +507,14 @@ bool GLToolbar::on_mouse(wxMouseEvent& evt, GLCanvas3D& parent)
m_mouse_capture.right = true;
m_mouse_capture.parent = &parent;
processed = true;
- if ((item_id != -2) && !m_items[item_id]->is_separator() && ((m_pressed_toggable_id == -1) || (m_items[item_id]->get_last_action_type() == GLToolbarItem::Right)))
+ if ((item_id != -2) && !m_items[item_id]->is_separator() && !m_items[item_id]->is_disabled() &&
+ ((m_pressed_toggable_id == -1) || (m_items[item_id]->get_last_action_type() == GLToolbarItem::Right)))
{
// mouse is inside an icon
do_action(GLToolbarItem::Right, item_id, parent, true);
parent.set_as_dirty();
}
}
-#if !ENABLE_MODIFIED_TOOLBAR_MOUSE_EVENT_HANDLING
- else if (evt.LeftUp())
- processed = true;
-#endif // !ENABLE_MODIFIED_TOOLBAR_MOUSE_EVENT_HANDLING
}
return processed;
@@ -597,6 +582,16 @@ float GLToolbar::get_main_size() const
return size * m_layout.scale;
}
+int GLToolbar::get_visible_items_cnt() const
+{
+ int cnt = 0;
+ for (unsigned int i = 0; i < (unsigned int)m_items.size(); ++i)
+ if (m_items[i]->is_visible() && !m_items[i]->is_separator())
+ cnt++;
+
+ return cnt;
+}
+
void GLToolbar::do_action(GLToolbarItem::EActionType type, int item_id, GLCanvas3D& parent, bool check_hover)
{
if ((m_pressed_toggable_id == -1) || (m_pressed_toggable_id == item_id))
@@ -604,7 +599,7 @@ void GLToolbar::do_action(GLToolbarItem::EActionType type, int item_id, GLCanvas
if ((0 <= item_id) && (item_id < (int)m_items.size()))
{
GLToolbarItem* item = m_items[item_id];
- if ((item != nullptr) && !item->is_separator() && (!check_hover || item->is_hovered()))
+ if ((item != nullptr) && !item->is_separator() && !item->is_disabled() && (!check_hover || item->is_hovered()))
{
if (((type == GLToolbarItem::Right) && item->is_right_toggable()) ||
((type == GLToolbarItem::Left) && item->is_left_toggable()))
@@ -658,24 +653,24 @@ void GLToolbar::do_action(GLToolbarItem::EActionType type, int item_id, GLCanvas
}
}
-std::string GLToolbar::update_hover_state(const Vec2d& mouse_pos, GLCanvas3D& parent)
+void GLToolbar::update_hover_state(const Vec2d& mouse_pos, GLCanvas3D& parent)
{
if (!m_enabled)
- return "";
+ return;
switch (m_layout.type)
{
default:
- case Layout::Horizontal: { return update_hover_state_horizontal(mouse_pos, parent); }
- case Layout::Vertical: { return update_hover_state_vertical(mouse_pos, parent); }
+ case Layout::Horizontal: { update_hover_state_horizontal(mouse_pos, parent); break; }
+ case Layout::Vertical: { update_hover_state_vertical(mouse_pos, parent); break; }
}
}
-std::string GLToolbar::update_hover_state_horizontal(const Vec2d& mouse_pos, GLCanvas3D& parent)
+void GLToolbar::update_hover_state_horizontal(const Vec2d& mouse_pos, GLCanvas3D& parent)
{
// NB: mouse_pos is already scaled appropriately
- float inv_zoom = (float)parent.get_camera().get_inv_zoom();
+ float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom();
float factor = m_layout.scale * inv_zoom;
Size cnv_size = parent.get_canvas_size();
@@ -692,8 +687,6 @@ std::string GLToolbar::update_hover_state_horizontal(const Vec2d& mouse_pos, GLC
float left = m_layout.left + scaled_border;
float top = m_layout.top - scaled_border;
- std::string tooltip = "";
-
for (GLToolbarItem* item : m_items)
{
if (!item->is_visible())
@@ -708,16 +701,6 @@ std::string GLToolbar::update_hover_state_horizontal(const Vec2d& mouse_pos, GLC
GLToolbarItem::EState state = item->get_state();
bool inside = (left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top);
- if (inside)
- {
- tooltip = item->get_tooltip();
- if (!item->is_pressed())
- {
- const std::string& additional_tooltip = item->get_additional_tooltip();
- if (!additional_tooltip.empty())
- tooltip += "\n" + additional_tooltip;
- }
- }
switch (state)
{
@@ -761,9 +744,28 @@ std::string GLToolbar::update_hover_state_horizontal(const Vec2d& mouse_pos, GLC
break;
}
- default:
case GLToolbarItem::Disabled:
{
+ if (inside)
+ {
+ item->set_state(GLToolbarItem::HoverDisabled);
+ parent.set_as_dirty();
+ }
+
+ break;
+ }
+ case GLToolbarItem::HoverDisabled:
+ {
+ if (!inside)
+ {
+ item->set_state(GLToolbarItem::Disabled);
+ parent.set_as_dirty();
+ }
+
+ break;
+ }
+ default:
+ {
break;
}
}
@@ -771,15 +773,13 @@ std::string GLToolbar::update_hover_state_horizontal(const Vec2d& mouse_pos, GLC
left += icon_stride;
}
}
-
- return tooltip;
}
-std::string GLToolbar::update_hover_state_vertical(const Vec2d& mouse_pos, GLCanvas3D& parent)
+void GLToolbar::update_hover_state_vertical(const Vec2d& mouse_pos, GLCanvas3D& parent)
{
// NB: mouse_pos is already scaled appropriately
- float inv_zoom = (float)parent.get_camera().get_inv_zoom();
+ float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom();
float factor = m_layout.scale * inv_zoom;
Size cnv_size = parent.get_canvas_size();
@@ -795,8 +795,6 @@ std::string GLToolbar::update_hover_state_vertical(const Vec2d& mouse_pos, GLCan
float left = m_layout.left + scaled_border;
float top = m_layout.top - scaled_border;
- std::string tooltip = "";
-
for (GLToolbarItem* item : m_items)
{
if (!item->is_visible())
@@ -811,16 +809,6 @@ std::string GLToolbar::update_hover_state_vertical(const Vec2d& mouse_pos, GLCan
GLToolbarItem::EState state = item->get_state();
bool inside = (left <= (float)scaled_mouse_pos(0)) && ((float)scaled_mouse_pos(0) <= right) && (bottom <= (float)scaled_mouse_pos(1)) && ((float)scaled_mouse_pos(1) <= top);
- if (inside)
- {
- tooltip = item->get_tooltip();
- if (!item->is_pressed())
- {
- const std::string& additional_tooltip = item->get_additional_tooltip();
- if (!additional_tooltip.empty())
- tooltip += "\n" + additional_tooltip;
- }
- }
switch (state)
{
@@ -864,9 +852,28 @@ std::string GLToolbar::update_hover_state_vertical(const Vec2d& mouse_pos, GLCan
break;
}
- default:
case GLToolbarItem::Disabled:
{
+ if (inside)
+ {
+ item->set_state(GLToolbarItem::HoverDisabled);
+ parent.set_as_dirty();
+ }
+
+ break;
+ }
+ case GLToolbarItem::HoverDisabled:
+ {
+ if (!inside)
+ {
+ item->set_state(GLToolbarItem::Disabled);
+ parent.set_as_dirty();
+ }
+
+ break;
+ }
+ default:
+ {
break;
}
}
@@ -874,8 +881,6 @@ std::string GLToolbar::update_hover_state_vertical(const Vec2d& mouse_pos, GLCan
top -= icon_stride;
}
}
-
- return tooltip;
}
int GLToolbar::contains_mouse(const Vec2d& mouse_pos, const GLCanvas3D& parent) const
@@ -895,7 +900,7 @@ int GLToolbar::contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3
{
// NB: mouse_pos is already scaled appropriately
- float inv_zoom = (float)parent.get_camera().get_inv_zoom();
+ float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom();
float factor = m_layout.scale * inv_zoom;
Size cnv_size = parent.get_canvas_size();
@@ -968,7 +973,7 @@ int GLToolbar::contains_mouse_vertical(const Vec2d& mouse_pos, const GLCanvas3D&
{
// NB: mouse_pos is already scaled appropriately
- float inv_zoom = (float)parent.get_camera().get_inv_zoom();
+ float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom();
float factor = m_layout.scale * inv_zoom;
Size cnv_size = parent.get_canvas_size();
@@ -1120,7 +1125,7 @@ void GLToolbar::render_horizontal(const GLCanvas3D& parent) const
int tex_width = m_icons_texture.get_width();
int tex_height = m_icons_texture.get_height();
- float inv_zoom = (float)parent.get_camera().get_inv_zoom();
+ float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom();
float factor = inv_zoom * m_layout.scale;
float scaled_icons_size = m_layout.icons_size * factor;
@@ -1168,7 +1173,7 @@ void GLToolbar::render_vertical(const GLCanvas3D& parent) const
int tex_width = m_icons_texture.get_width();
int tex_height = m_icons_texture.get_height();
- float inv_zoom = (float)parent.get_camera().get_inv_zoom();
+ float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom();
float factor = inv_zoom * m_layout.scale;
float scaled_icons_size = m_layout.icons_size * factor;
@@ -1222,21 +1227,23 @@ bool GLToolbar::generate_icons_texture() const
}
std::vector<std::pair<int, bool>> states;
- if (m_name == "Top")
+ if (m_type == Normal)
{
- states.push_back(std::make_pair(1, false));
- states.push_back(std::make_pair(0, false));
- states.push_back(std::make_pair(2, false));
- states.push_back(std::make_pair(0, false));
- states.push_back(std::make_pair(0, false));
+ states.push_back({ 1, false }); // Normal
+ states.push_back({ 0, false }); // Pressed
+ states.push_back({ 2, false }); // Disabled
+ states.push_back({ 0, false }); // Hover
+ states.push_back({ 0, false }); // HoverPressed
+ states.push_back({ 2, false }); // HoverDisabled
}
- else if (m_name == "View")
+ else
{
- states.push_back(std::make_pair(1, false));
- states.push_back(std::make_pair(1, true));
- states.push_back(std::make_pair(1, false));
- states.push_back(std::make_pair(0, false));
- states.push_back(std::make_pair(1, true));
+ states.push_back({ 1, false }); // Normal
+ states.push_back({ 1, true }); // Pressed
+ states.push_back({ 1, false }); // Disabled
+ states.push_back({ 0, false }); // Hover
+ states.push_back({ 1, true }); // HoverPressed
+ states.push_back({ 1, false }); // HoverDisabled
}
unsigned int sprite_size_px = (unsigned int)(m_layout.icons_size * m_layout.scale);
diff --git a/src/slic3r/GUI/GLToolbar.hpp b/src/slic3r/GUI/GLToolbar.hpp
index 6f24e22cf..74e18de97 100644
--- a/src/slic3r/GUI/GLToolbar.hpp
+++ b/src/slic3r/GUI/GLToolbar.hpp
@@ -61,6 +61,7 @@ public:
Disabled,
Hover,
HoverPressed,
+ HoverDisabled,
Num_States
};
@@ -115,13 +116,14 @@ public:
const std::string& get_tooltip() const { return m_data.tooltip; }
const std::string& get_additional_tooltip() const { return m_data.additional_tooltip; }
void set_additional_tooltip(const std::string& text) { m_data.additional_tooltip = text; }
+ void set_tooltip(const std::string& text) { m_data.tooltip = text; }
void do_left_action() { m_last_action_type = Left; m_data.left.action_callback(); }
void do_right_action() { m_last_action_type = Right; m_data.right.action_callback(); }
- bool is_enabled() const { return m_state != Disabled; }
- bool is_disabled() const { return m_state == Disabled; }
- bool is_hovered() const { return (m_state == Hover) || (m_state == HoverPressed); }
+ bool is_enabled() const { return (m_state != Disabled) && (m_state != HoverDisabled); }
+ bool is_disabled() const { return (m_state == Disabled) || (m_state == HoverDisabled); }
+ bool is_hovered() const { return (m_state == Hover) || (m_state == HoverPressed) || (m_state == HoverDisabled); }
bool is_pressed() const { return (m_state == Pressed) || (m_state == HoverPressed); }
bool is_visible() const { return m_data.visible; }
bool is_separator() const { return m_type == Separator; }
@@ -252,7 +254,6 @@ private:
};
MouseCapture m_mouse_capture;
- std::string m_tooltip;
int m_pressed_toggable_id;
public:
@@ -275,8 +276,8 @@ public:
void set_icons_size(float size);
void set_scale(float scale);
- bool is_enabled() const;
- void set_enabled(bool enable);
+ bool is_enabled() const { return m_enabled; }
+ void set_enabled(bool enable) { m_enabled = enable; }
bool add_item(const GLToolbarItem::Data& data);
bool add_separator();
@@ -298,10 +299,12 @@ public:
void force_left_action(int item_id, GLCanvas3D& parent) { do_action(GLToolbarItem::Left, item_id, parent, false); }
void force_right_action(int item_id, GLCanvas3D& parent) { do_action(GLToolbarItem::Right, item_id, parent, false); }
- const std::string& get_tooltip() const { return m_tooltip; }
+ std::string get_tooltip() const;
void get_additional_tooltip(int item_id, std::string& text);
void set_additional_tooltip(int item_id, const std::string& text);
+ void set_tooltip(int item_id, const std::string& text);
+ int get_visible_items_cnt() const;
// returns true if any item changed its state
bool update_items_state();
@@ -318,9 +321,9 @@ private:
float get_height_vertical() const;
float get_main_size() const;
void do_action(GLToolbarItem::EActionType type, int item_id, GLCanvas3D& parent, bool check_hover);
- std::string update_hover_state(const Vec2d& mouse_pos, GLCanvas3D& parent);
- std::string update_hover_state_horizontal(const Vec2d& mouse_pos, GLCanvas3D& parent);
- std::string update_hover_state_vertical(const Vec2d& mouse_pos, GLCanvas3D& parent);
+ void update_hover_state(const Vec2d& mouse_pos, GLCanvas3D& parent);
+ void update_hover_state_horizontal(const Vec2d& mouse_pos, GLCanvas3D& parent);
+ void update_hover_state_vertical(const Vec2d& mouse_pos, GLCanvas3D& parent);
// returns the id of the item under the given mouse position or -1 if none
int contains_mouse(const Vec2d& mouse_pos, const GLCanvas3D& parent) const;
int contains_mouse_horizontal(const Vec2d& mouse_pos, const GLCanvas3D& parent) const;
diff --git a/src/slic3r/GUI/GUI.cpp b/src/slic3r/GUI/GUI.cpp
index caeb8da03..dea226012 100644
--- a/src/slic3r/GUI/GUI.cpp
+++ b/src/slic3r/GUI/GUI.cpp
@@ -1,13 +1,11 @@
#include "GUI.hpp"
#include "GUI_App.hpp"
#include "I18N.hpp"
-#include "WipeTowerDialog.hpp"
-#include <assert.h>
#include <string>
-#include <boost/lexical_cast.hpp>
#include <boost/algorithm/string.hpp>
+#include <boost/any.hpp>
#if __APPLE__
#import <IOKit/pwr_mgt/IOPMLib.h>
@@ -18,22 +16,16 @@
#include "boost/nowide/convert.hpp"
#endif
-#include <wx/display.h>
-
-#include "wxExtensions.hpp"
-#include "GUI_Preview.hpp"
#include "AboutDialog.hpp"
-#include "AppConfig.hpp"
-#include "ConfigWizard.hpp"
-#include "PresetBundle.hpp"
-#include "UpdateDialogs.hpp"
+#include "MsgDialog.hpp"
-#include "libslic3r/Utils.hpp"
#include "libslic3r/Print.hpp"
-#include "Tab.hpp"
-#include "GUI_ObjectList.hpp"
-namespace Slic3r { namespace GUI {
+namespace Slic3r {
+
+class AppConfig;
+
+namespace GUI {
#if __APPLE__
IOPMAssertionID assertionID;
@@ -188,8 +180,12 @@ void change_opt_value(DynamicPrintConfig& config, const t_config_option_key& opt
opt_key == "bottom_fill_pattern" ||
opt_key == "fill_pattern")
config.set_key_value(opt_key, new ConfigOptionEnum<InfillPattern>(boost::any_cast<InfillPattern>(value)));
+ else if (opt_key.compare("ironing_type") == 0)
+ config.set_key_value(opt_key, new ConfigOptionEnum<IroningType>(boost::any_cast<IroningType>(value)));
else if (opt_key.compare("gcode_flavor") == 0)
config.set_key_value(opt_key, new ConfigOptionEnum<GCodeFlavor>(boost::any_cast<GCodeFlavor>(value)));
+ else if (opt_key.compare("machine_limits_usage") == 0)
+ config.set_key_value(opt_key, new ConfigOptionEnum<MachineLimitsUsage>(boost::any_cast<MachineLimitsUsage>(value)));
else if (opt_key.compare("support_material_pattern") == 0)
config.set_key_value(opt_key, new ConfigOptionEnum<SupportMaterialPattern>(boost::any_cast<SupportMaterialPattern>(value)));
else if (opt_key.compare("seam_position") == 0)
@@ -200,10 +196,12 @@ void change_opt_value(DynamicPrintConfig& config, const t_config_option_key& opt
config.set_key_value(opt_key, new ConfigOptionEnum<SLADisplayOrientation>(boost::any_cast<SLADisplayOrientation>(value)));
else if(opt_key.compare("support_pillar_connection_mode") == 0)
config.set_key_value(opt_key, new ConfigOptionEnum<SLAPillarConnectionMode>(boost::any_cast<SLAPillarConnectionMode>(value)));
+ else if(opt_key == "printhost_authorization_type")
+ config.set_key_value(opt_key, new ConfigOptionEnum<AuthorizationType>(boost::any_cast<AuthorizationType>(value)));
}
break;
case coPoints:{
- if (opt_key.compare("bed_shape") == 0) {
+ if (opt_key == "bed_shape" || opt_key == "thumbnails") {
config.option<ConfigOptionPoints>(opt_key)->values = boost::any_cast<std::vector<Vec2d>>(value);
break;
}
@@ -223,16 +221,16 @@ void change_opt_value(DynamicPrintConfig& config, const t_config_option_key& opt
}
}
-void show_error(wxWindow* parent, const wxString& message)
+void show_error(wxWindow* parent, const wxString& message, bool monospaced_font)
{
- ErrorDialog msg(parent, message);
+ ErrorDialog msg(parent, message, monospaced_font);
msg.ShowModal();
}
-void show_error(wxWindow* parent, const char* message)
+void show_error(wxWindow* parent, const char* message, bool monospaced_font)
{
assert(message);
- show_error(parent, wxString::FromUTF8(message));
+ show_error(parent, wxString::FromUTF8(message), monospaced_font);
}
void show_error_id(int id, const std::string& message)
@@ -243,7 +241,7 @@ void show_error_id(int id, const std::string& message)
void show_info(wxWindow* parent, const wxString& message, const wxString& title)
{
- wxMessageDialog msg_wingow(parent, message, wxString(SLIC3R_APP_NAME " - ") + (title.empty() ? _(L("Notice")) : title), wxOK | wxICON_INFORMATION);
+ wxMessageDialog msg_wingow(parent, message, wxString(SLIC3R_APP_NAME " - ") + (title.empty() ? _L("Notice") : title), wxOK | wxICON_INFORMATION);
msg_wingow.ShowModal();
}
@@ -255,60 +253,74 @@ void show_info(wxWindow* parent, const char* message, const char* title)
void warning_catcher(wxWindow* parent, const wxString& message)
{
- wxMessageDialog msg(parent, message, _(L("Warning")), wxOK | wxICON_WARNING);
+ wxMessageDialog msg(parent, message, _L("Warning"), wxOK | wxICON_WARNING);
msg.ShowModal();
}
-void create_combochecklist(wxComboCtrl* comboCtrl, std::string text, std::string items, bool initial_value)
+void create_combochecklist(wxComboCtrl* comboCtrl, const std::string& text, const std::string& items)
{
if (comboCtrl == nullptr)
return;
wxCheckListBoxComboPopup* popup = new wxCheckListBoxComboPopup;
- if (popup != nullptr)
- {
- // FIXME If the following line is removed, the combo box popup list will not react to mouse clicks.
+ if (popup != nullptr) {
+ // FIXME If the following line is removed, the combo box popup list will not react to mouse clicks.
// On the other side, with this line the combo box popup cannot be closed by clicking on the combo button on Windows 10.
comboCtrl->UseAltPopupWindow();
- comboCtrl->EnablePopupAnimation(false);
- comboCtrl->SetPopupControl(popup);
- popup->SetStringValue(from_u8(text));
- popup->Bind(wxEVT_CHECKLISTBOX, [popup](wxCommandEvent& evt) { popup->OnCheckListBox(evt); });
- popup->Bind(wxEVT_LISTBOX, [popup](wxCommandEvent& evt) { popup->OnListBoxSelection(evt); });
+ int max_width = 0;
+
+ // the following line messes up the popup size the first time it is shown on wxWidgets 3.1.3
+// comboCtrl->EnablePopupAnimation(false);
+ comboCtrl->SetPopupControl(popup);
+ wxString title = from_u8(text);
+ max_width = std::max(max_width, 60 + comboCtrl->GetTextExtent(title).x);
+ popup->SetStringValue(title);
+ popup->Bind(wxEVT_CHECKLISTBOX, [popup](wxCommandEvent& evt) { popup->OnCheckListBox(evt); });
+ popup->Bind(wxEVT_LISTBOX, [popup](wxCommandEvent& evt) { popup->OnListBoxSelection(evt); });
popup->Bind(wxEVT_KEY_DOWN, [popup](wxKeyEvent& evt) { popup->OnKeyEvent(evt); });
popup->Bind(wxEVT_KEY_UP, [popup](wxKeyEvent& evt) { popup->OnKeyEvent(evt); });
std::vector<std::string> items_str;
boost::split(items_str, items, boost::is_any_of("|"), boost::token_compress_off);
- for (const std::string& item : items_str)
- {
- popup->Append(from_u8(item));
- }
+ // each item must be composed by 2 parts
+ assert(items_str.size() %2 == 0);
- for (unsigned int i = 0; i < popup->GetCount(); ++i)
- {
- popup->Check(i, initial_value);
- }
- }
+ for (size_t i = 0; i < items_str.size(); i += 2) {
+ wxString label = from_u8(items_str[i]);
+ max_width = std::max(max_width, 60 + popup->GetTextExtent(label).x);
+ popup->Append(label);
+ popup->Check(i / 2, items_str[i + 1] == "1");
+ }
+
+ comboCtrl->SetMinClientSize(wxSize(max_width, -1));
+ }
}
-int combochecklist_get_flags(wxComboCtrl* comboCtrl)
+unsigned int combochecklist_get_flags(wxComboCtrl* comboCtrl)
{
- int flags = 0;
-
- wxCheckListBoxComboPopup* popup = wxDynamicCast(comboCtrl->GetPopupControl(), wxCheckListBoxComboPopup);
- if (popup != nullptr)
- {
- for (unsigned int i = 0; i < popup->GetCount(); ++i)
- {
- if (popup->IsChecked(i))
- flags |= 1 << i;
- }
- }
+ unsigned int flags = 0;
- return flags;
+ wxCheckListBoxComboPopup* popup = wxDynamicCast(comboCtrl->GetPopupControl(), wxCheckListBoxComboPopup);
+ if (popup != nullptr) {
+ for (unsigned int i = 0; i < popup->GetCount(); ++i) {
+ if (popup->IsChecked(i))
+ flags |= 1 << i;
+ }
+ }
+
+ return flags;
+}
+
+void combochecklist_set_flags(wxComboCtrl* comboCtrl, unsigned int flags)
+{
+ wxCheckListBoxComboPopup* popup = wxDynamicCast(comboCtrl->GetPopupControl(), wxCheckListBoxComboPopup);
+ if (popup != nullptr) {
+ for (unsigned int i = 0; i < popup->GetCount(); ++i) {
+ popup->Check(i, (flags & (1 << i)) != 0);
+ }
+ }
}
AppConfig* get_app_config()
diff --git a/src/slic3r/GUI/GUI.hpp b/src/slic3r/GUI/GUI.hpp
index a54288df4..a90115933 100644
--- a/src/slic3r/GUI/GUI.hpp
+++ b/src/slic3r/GUI/GUI.hpp
@@ -39,9 +39,11 @@ extern void add_menus(wxMenuBar *menu, int event_preferences_changed, int event_
// Change option value in config
void change_opt_value(DynamicPrintConfig& config, const t_config_option_key& opt_key, const boost::any& value, int opt_index = 0);
-void show_error(wxWindow* parent, const wxString& message);
-void show_error(wxWindow* parent, const char* message);
-inline void show_error(wxWindow* parent, const std::string& message) { show_error(parent, message.c_str()); }
+// If monospaced_font is true, the error message is displayed using html <code><pre></pre></code> tags,
+// so that the code formatting will be preserved. This is useful for reporting errors from the placeholder parser.
+void show_error(wxWindow* parent, const wxString& message, bool monospaced_font = false);
+void show_error(wxWindow* parent, const char* message, bool monospaced_font = false);
+inline void show_error(wxWindow* parent, const std::string& message, bool monospaced_font = false) { show_error(parent, message.c_str(), monospaced_font); }
void show_error_id(int id, const std::string& message); // For Perl
void show_info(wxWindow* parent, const wxString& message, const wxString& title = wxString());
void show_info(wxWindow* parent, const char* message, const char* title = nullptr);
@@ -49,13 +51,17 @@ inline void show_info(wxWindow* parent, const std::string& message,const std::st
void warning_catcher(wxWindow* parent, const wxString& message);
// Creates a wxCheckListBoxComboPopup inside the given wxComboCtrl, filled with the given text and items.
-// Items are all initialized to the given value.
-// Items must be separated by '|', for example "Item1|Item2|Item3", and so on.
-void create_combochecklist(wxComboCtrl* comboCtrl, std::string text, std::string items, bool initial_value);
+// Items data must be separated by '|', and contain the item name to be shown followed by its initial value (0 for false, 1 for true).
+// For example "Item1|0|Item2|1|Item3|0", and so on.
+void create_combochecklist(wxComboCtrl* comboCtrl, const std::string& text, const std::string& items);
// Returns the current state of the items listed in the wxCheckListBoxComboPopup contained in the given wxComboCtrl,
-// encoded inside an int.
-int combochecklist_get_flags(wxComboCtrl* comboCtrl);
+// encoded inside an unsigned int.
+unsigned int combochecklist_get_flags(wxComboCtrl* comboCtrl);
+
+// Sets the current state of the items listed in the wxCheckListBoxComboPopup contained in the given wxComboCtrl,
+// with the flags encoded in the given unsigned int.
+void combochecklist_set_flags(wxComboCtrl* comboCtrl, unsigned int flags);
// wxString conversions:
diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp
index cc6c06690..1be2495ca 100644
--- a/src/slic3r/GUI/GUI_App.cpp
+++ b/src/slic3r/GUI/GUI_App.cpp
@@ -1,14 +1,19 @@
+#include "libslic3r/Technologies.hpp"
#include "GUI_App.hpp"
+#include "GUI_Init.hpp"
#include "GUI_ObjectList.hpp"
#include "GUI_ObjectManipulation.hpp"
+#include "format.hpp"
#include "I18N.hpp"
#include <algorithm>
#include <iterator>
#include <exception>
#include <cstdlib>
-#include <boost/lexical_cast.hpp>
+#include <regex>
#include <boost/algorithm/string.hpp>
+#include <boost/format.hpp>
+#include <boost/lexical_cast.hpp>
#include <boost/log/trivial.hpp>
#include <boost/nowide/convert.hpp>
@@ -23,21 +28,30 @@
#include <wx/wupdlock.h>
#include <wx/filefn.h>
#include <wx/sysopt.h>
-#include <wx/msgdlg.h>
+#include <wx/richmsgdlg.h>
#include <wx/log.h>
#include <wx/intl.h>
+#include <wx/dialog.h>
+#include <wx/textctrl.h>
+#include <wx/splash.h>
+#include <wx/fontutil.h>
+
#include "libslic3r/Utils.hpp"
#include "libslic3r/Model.hpp"
#include "libslic3r/I18N.hpp"
+#include "libslic3r/PresetBundle.hpp"
#include "GUI.hpp"
#include "GUI_Utils.hpp"
-#include "AppConfig.hpp"
-#include "PresetBundle.hpp"
+#include "3DScene.hpp"
+#include "MainFrame.hpp"
+#include "Plater.hpp"
+#include "GLCanvas3D.hpp"
#include "../Utils/PresetUpdater.hpp"
#include "../Utils/PrintHost.hpp"
+#include "../Utils/Process.hpp"
#include "../Utils/MacDarkMode.hpp"
#include "slic3r/Config/Snapshot.hpp"
#include "ConfigSnapshotDialog.hpp"
@@ -47,11 +61,19 @@
#include "SysInfoDialog.hpp"
#include "KBShortcutsDialog.hpp"
#include "UpdateDialogs.hpp"
+#include "Mouse3DController.hpp"
#include "RemovableDriveManager.hpp"
+#include "InstanceCheck.hpp"
+#include "NotificationManager.hpp"
+#include "UnsavedChangesDialog.hpp"
+#include "SavePresetDialog.hpp"
+#include "PrintHostDialogs.hpp"
+
+#include "BitmapCache.hpp"
#ifdef __WXMSW__
-#include <Shlobj.h>
#include <dbt.h>
+#include <shlobj.h>
#endif // __WXMSW__
#if ENABLE_THUMBNAIL_GENERATOR_DEBUG
@@ -64,6 +86,330 @@ namespace GUI {
class MainFrame;
+class SplashScreen : public wxSplashScreen
+{
+public:
+ SplashScreen(const wxBitmap& bitmap, long splashStyle, int milliseconds, wxPoint pos = wxDefaultPosition)
+ : wxSplashScreen(bitmap, splashStyle, milliseconds, static_cast<wxWindow*>(wxGetApp().mainframe), wxID_ANY, wxDefaultPosition, wxDefaultSize,
+#ifdef __APPLE__
+ wxSIMPLE_BORDER | wxFRAME_NO_TASKBAR | wxSTAY_ON_TOP
+#else
+ wxSIMPLE_BORDER | wxFRAME_NO_TASKBAR
+#endif // !__APPLE__
+ )
+ {
+ wxASSERT(bitmap.IsOk());
+
+ int init_dpi = get_dpi_for_window(this);
+ this->SetPosition(pos);
+ this->CenterOnScreen();
+ int new_dpi = get_dpi_for_window(this);
+
+ m_scale = (float)(new_dpi) / (float)(init_dpi);
+ m_main_bitmap = bitmap;
+
+ scale_bitmap(m_main_bitmap, m_scale);
+
+ // init constant texts and scale fonts
+ init_constant_text();
+
+ // this font will be used for the action string
+ m_action_font = m_constant_text.credits_font.Bold();
+
+ // draw logo and constant info text
+ Decorate(m_main_bitmap);
+ }
+
+ void SetText(const wxString& text)
+ {
+ set_bitmap(m_main_bitmap);
+ if (!text.empty()) {
+ wxBitmap bitmap(m_main_bitmap);
+
+ wxMemoryDC memDC;
+ memDC.SelectObject(bitmap);
+
+ memDC.SetFont(m_action_font);
+ memDC.SetTextForeground(wxColour(237, 107, 33));
+ memDC.DrawText(text, int(m_scale * 60), m_action_line_y_position);
+
+ memDC.SelectObject(wxNullBitmap);
+ set_bitmap(bitmap);
+#ifdef __WXOSX__
+ // without this code splash screen wouldn't be updated under OSX
+ wxYield();
+#endif
+ }
+ }
+
+ static wxBitmap MakeBitmap(wxBitmap bmp)
+ {
+ if (!bmp.IsOk())
+ return wxNullBitmap;
+
+ // create dark grey background for the splashscreen
+ // It will be 5/3 of the weight of the bitmap
+ int width = lround((double)5 / 3 * bmp.GetWidth());
+ int height = bmp.GetHeight();
+
+ wxImage image(width, height);
+ unsigned char* imgdata_ = image.GetData();
+ for (int i = 0; i < width * height; ++i) {
+ *imgdata_++ = 51;
+ *imgdata_++ = 51;
+ *imgdata_++ = 51;
+ }
+
+ wxBitmap new_bmp(image);
+
+ wxMemoryDC memDC;
+ memDC.SelectObject(new_bmp);
+ memDC.DrawBitmap(bmp, width - bmp.GetWidth(), 0, true);
+
+ return new_bmp;
+ }
+
+ void Decorate(wxBitmap& bmp)
+ {
+ if (!bmp.IsOk())
+ return;
+
+ // draw text to the box at the left of the splashscreen.
+ // this box will be 2/5 of the weight of the bitmap, and be at the left.
+ int width = lround(bmp.GetWidth() * 0.4);
+
+ // load bitmap for logo
+ BitmapCache bmp_cache;
+ int logo_size = lround(width * 0.25);
+ wxBitmap logo_bmp = *bmp_cache.load_svg(wxGetApp().is_editor() ? "prusa_slicer_logo" : "add_gcode", logo_size, logo_size);
+
+ wxCoord margin = int(m_scale * 20);
+
+ wxRect banner_rect(wxPoint(0, logo_size), wxPoint(width, bmp.GetHeight()));
+ banner_rect.Deflate(margin, 2 * margin);
+
+ // use a memory DC to draw directly onto the bitmap
+ wxMemoryDC memDc(bmp);
+
+ // draw logo
+ memDc.DrawBitmap(logo_bmp, margin, margin, true);
+
+ // draw the (white) labels inside of our black box (at the left of the splashscreen)
+ memDc.SetTextForeground(wxColour(255, 255, 255));
+
+ memDc.SetFont(m_constant_text.title_font);
+ memDc.DrawLabel(m_constant_text.title, banner_rect, wxALIGN_TOP | wxALIGN_LEFT);
+
+ int title_height = memDc.GetTextExtent(m_constant_text.title).GetY();
+ banner_rect.SetTop(banner_rect.GetTop() + title_height);
+ banner_rect.SetHeight(banner_rect.GetHeight() - title_height);
+
+ memDc.SetFont(m_constant_text.version_font);
+ memDc.DrawLabel(m_constant_text.version, banner_rect, wxALIGN_TOP | wxALIGN_LEFT);
+ int version_height = memDc.GetTextExtent(m_constant_text.version).GetY();
+
+ memDc.SetFont(m_constant_text.credits_font);
+ memDc.DrawLabel(m_constant_text.credits, banner_rect, wxALIGN_BOTTOM | wxALIGN_LEFT);
+ int credits_height = memDc.GetMultiLineTextExtent(m_constant_text.credits).GetY();
+ int text_height = memDc.GetTextExtent("text").GetY();
+
+ // calculate position for the dynamic text
+ int logo_and_header_height = margin + logo_size + title_height + version_height;
+ m_action_line_y_position = logo_and_header_height + 0.5 * (bmp.GetHeight() - margin - credits_height - logo_and_header_height - text_height);
+ }
+
+private:
+ wxBitmap m_main_bitmap;
+ wxFont m_action_font;
+ int m_action_line_y_position;
+ float m_scale {1.0};
+
+ struct ConstantText
+ {
+ wxString title;
+ wxString version;
+ wxString credits;
+
+ wxFont title_font;
+ wxFont version_font;
+ wxFont credits_font;
+
+ void init(wxFont init_font)
+ {
+ // title
+ title = wxGetApp().is_editor() ? SLIC3R_APP_NAME : GCODEVIEWER_APP_NAME;
+
+ // dynamically get the version to display
+ version = _L("Version") + " " + std::string(SLIC3R_VERSION);
+
+ // credits infornation
+ credits = title + " " +
+ _L("is based on Slic3r by Alessandro Ranellucci and the RepRap community.") + "\n\n" +
+ title + " " + _L("is licensed under the") + " " + _L("GNU Affero General Public License, version 3") + "\n\n" +
+ _L("Contributions by Vojtech Bubnik, Enrico Turri, Oleksandra Iushchenko, Tamas Meszaros, Lukas Matena, Vojtech Kral, David Kocik and numerous others.") + "\n\n" +
+ _L("Artwork model by Nora Al-Badri and Jan Nikolai Nelles");
+
+ title_font = version_font = credits_font = init_font;
+ }
+ }
+ m_constant_text;
+
+ void init_constant_text()
+ {
+ m_constant_text.init(get_default_font(this));
+
+ // As default we use a system font for current display.
+ // Scale fonts in respect to banner width
+
+ int text_banner_width = lround(0.4 * m_main_bitmap.GetWidth()) - roundl(m_scale * 50); // banner_width - margins
+
+ float title_font_scale = (float)text_banner_width / GetTextExtent(m_constant_text.title).GetX();
+ scale_font(m_constant_text.title_font, title_font_scale > 3.5f ? 3.5f : title_font_scale);
+
+ float version_font_scale = (float)text_banner_width / GetTextExtent(m_constant_text.version).GetX();
+ scale_font(m_constant_text.version_font, version_font_scale > 2.f ? 2.f : version_font_scale);
+
+ // The width of the credits information string doesn't respect to the banner width some times.
+ // So, scale credits_font in the respect to the longest string width
+ int longest_string_width = word_wrap_string(m_constant_text.credits);
+ float font_scale = (float)text_banner_width / longest_string_width;
+ scale_font(m_constant_text.credits_font, font_scale);
+ }
+
+ void set_bitmap(wxBitmap& bmp)
+ {
+ m_window->SetBitmap(bmp);
+ m_window->Refresh();
+ m_window->Update();
+ }
+
+ void scale_bitmap(wxBitmap& bmp, float scale)
+ {
+ if (scale == 1.0)
+ return;
+
+ wxImage image = bmp.ConvertToImage();
+ if (!image.IsOk() || image.GetWidth() == 0 || image.GetHeight() == 0)
+ return;
+
+ int width = int(scale * image.GetWidth());
+ int height = int(scale * image.GetHeight());
+ image.Rescale(width, height, wxIMAGE_QUALITY_BILINEAR);
+
+ bmp = wxBitmap(std::move(image));
+ }
+
+ void scale_font(wxFont& font, float scale)
+ {
+#ifdef __WXMSW__
+ // Workaround for the font scaling in respect to the current active display,
+ // not for the primary display, as it's implemented in Font.cpp
+ // See https://github.com/wxWidgets/wxWidgets/blob/master/src/msw/font.cpp
+ // void wxNativeFontInfo::SetFractionalPointSize(float pointSizeNew)
+ wxNativeFontInfo nfi= *font.GetNativeFontInfo();
+ float pointSizeNew = scale * font.GetPointSize();
+ nfi.lf.lfHeight = nfi.GetLogFontHeightAtPPI(pointSizeNew, get_dpi_for_window(this));
+ nfi.pointSize = pointSizeNew;
+ font = wxFont(nfi);
+#else
+ font.Scale(scale);
+#endif //__WXMSW__
+ }
+
+ // wrap a string for the strings no longer then 55 symbols
+ // return extent of the longest string
+ int word_wrap_string(wxString& input)
+ {
+ size_t line_len = 55;// count of symbols in one line
+ int idx = -1;
+ size_t cur_len = 0;
+
+ wxString longest_sub_string;
+ auto get_longest_sub_string = [longest_sub_string, input](wxString &longest_sub_str, int cur_len, size_t i) {
+ if (cur_len > longest_sub_str.Len())
+ longest_sub_str = input.SubString(i - cur_len + 1, i);
+ };
+
+ for (size_t i = 0; i < input.Len(); i++)
+ {
+ cur_len++;
+ if (input[i] == ' ')
+ idx = i;
+ if (input[i] == '\n')
+ {
+ get_longest_sub_string(longest_sub_string, cur_len, i);
+ idx = -1;
+ cur_len = 0;
+ }
+ if (cur_len >= line_len && idx >= 0)
+ {
+ get_longest_sub_string(longest_sub_string, cur_len, i);
+ input[idx] = '\n';
+ cur_len = i - static_cast<size_t>(idx);
+ }
+ }
+
+ return GetTextExtent(longest_sub_string).GetX();
+ }
+};
+
+
+#ifdef __linux__
+bool static check_old_linux_datadir(const wxString& app_name) {
+ // If we are on Linux and the datadir does not exist yet, look into the old
+ // location where the datadir was before version 2.3. If we find it there,
+ // tell the user that he might wanna migrate to the new location.
+ // (https://github.com/prusa3d/PrusaSlicer/issues/2911)
+ // To be precise, the datadir should exist, it is created when single instance
+ // lock happens. Instead of checking for existence, check the contents.
+
+ namespace fs = boost::filesystem;
+
+ std::string new_path = Slic3r::data_dir();
+
+ wxString dir;
+ if (! wxGetEnv(wxS("XDG_CONFIG_HOME"), &dir) || dir.empty() )
+ dir = wxFileName::GetHomeDir() + wxS("/.config");
+ std::string default_path = (dir + "/" + app_name).ToUTF8().data();
+
+ if (new_path != default_path) {
+ // This happens when the user specifies a custom --datadir.
+ // Do not show anything in that case.
+ return true;
+ }
+
+ fs::path data_dir = fs::path(new_path);
+ if (! fs::is_directory(data_dir))
+ return true; // This should not happen.
+
+ int file_count = std::distance(fs::directory_iterator(data_dir), fs::directory_iterator());
+
+ if (file_count <= 1) { // just cache dir with an instance lock
+ std::string old_path = wxStandardPaths::Get().GetUserDataDir().ToUTF8().data();
+
+ if (fs::is_directory(old_path)) {
+ wxString msg = from_u8((boost::format(_u8L("Starting with %1% 2.3, configuration "
+ "directory on Linux has changed (according to XDG Base Directory Specification) to \n%2%.\n\n"
+ "This directory did not exist yet (maybe you run the new version for the first time).\nHowever, "
+ "an old %1% configuration directory was detected in \n%3%.\n\n"
+ "Consider moving the contents of the old directory to the new location in order to access "
+ "your profiles, etc.\nNote that if you decide to downgrade %1% in future, it will use the old "
+ "location again.\n\n"
+ "What do you want to do now?")) % SLIC3R_APP_NAME % new_path % old_path).str());
+ wxString caption = from_u8((boost::format(_u8L("%s - BREAKING CHANGE")) % SLIC3R_APP_NAME).str());
+ wxRichMessageDialog dlg(nullptr, msg, caption, wxYES_NO);
+ dlg.SetYesNoLabels(_L("Quit, I will move my data now"), _L("Start the application"));
+ if (dlg.ShowModal() != wxID_NO)
+ return false;
+ }
+ } else {
+ // If the new directory exists, be silent. The user likely already saw the message.
+ }
+ return true;
+}
+#endif
+
+
wxString file_wildcards(FileType file_type, const std::string &custom_extension)
{
static const std::string defaults[FT_SIZE] = {
@@ -100,6 +446,7 @@ wxString file_wildcards(FileType file_type, const std::string &custom_extension)
static std::string libslic3r_translate_callback(const char *s) { return wxGetTranslation(wxString(s, wxConvUTF8)).utf8_str().data(); }
#ifdef WIN32
+#if !wxVERSION_EQUAL_OR_GREATER_THAN(3,1,3)
static void register_win32_dpi_event()
{
enum { WM_DPICHANGED_ = 0x02e0 };
@@ -115,13 +462,12 @@ static void register_win32_dpi_event()
return true;
});
}
+#endif // !wxVERSION_EQUAL_OR_GREATER_THAN
static GUID GUID_DEVINTERFACE_HID = { 0x4D1E55B2, 0xF16F, 0x11CF, 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 };
static void register_win32_device_notification_event()
{
- enum { WM_DPICHANGED_ = 0x02e0 };
-
wxWindow::MSWRegisterMessageHandler(WM_DEVICECHANGE, [](wxWindow *win, WXUINT /* nMsg */, WXWPARAM wParam, WXLPARAM lParam) {
// Some messages are sent to top level windows by default, some messages are sent to only registered windows, and we explictely register on MainFrame only.
auto main_frame = dynamic_cast<MainFrame*>(win);
@@ -158,6 +504,65 @@ static void register_win32_device_notification_event()
}
return true;
});
+
+ wxWindow::MSWRegisterMessageHandler(MainFrame::WM_USER_MEDIACHANGED, [](wxWindow *win, WXUINT /* nMsg */, WXWPARAM wParam, WXLPARAM lParam) {
+ // Some messages are sent to top level windows by default, some messages are sent to only registered windows, and we explictely register on MainFrame only.
+ auto main_frame = dynamic_cast<MainFrame*>(win);
+ auto plater = (main_frame == nullptr) ? nullptr : main_frame->plater();
+ if (plater == nullptr)
+ // Maybe some other top level window like a dialog or maybe a pop-up menu?
+ return true;
+ wchar_t sPath[MAX_PATH];
+ if (lParam == SHCNE_MEDIAINSERTED || lParam == SHCNE_MEDIAREMOVED) {
+ struct _ITEMIDLIST* pidl = *reinterpret_cast<struct _ITEMIDLIST**>(wParam);
+ if (! SHGetPathFromIDList(pidl, sPath)) {
+ BOOST_LOG_TRIVIAL(error) << "MediaInserted: SHGetPathFromIDList failed";
+ return false;
+ }
+ }
+ switch (lParam) {
+ case SHCNE_MEDIAINSERTED:
+ {
+ //printf("SHCNE_MEDIAINSERTED %S\n", sPath);
+ plater->GetEventHandler()->AddPendingEvent(VolumeAttachedEvent(EVT_VOLUME_ATTACHED));
+ break;
+ }
+ case SHCNE_MEDIAREMOVED:
+ {
+ //printf("SHCNE_MEDIAREMOVED %S\n", sPath);
+ plater->GetEventHandler()->AddPendingEvent(VolumeDetachedEvent(EVT_VOLUME_DETACHED));
+ break;
+ }
+ default:
+// printf("Unknown\n");
+ break;
+ }
+ return true;
+ });
+
+ wxWindow::MSWRegisterMessageHandler(WM_INPUT, [](wxWindow *win, WXUINT /* nMsg */, WXWPARAM wParam, WXLPARAM lParam) {
+ auto main_frame = dynamic_cast<MainFrame*>(Slic3r::GUI::find_toplevel_parent(win));
+ auto plater = (main_frame == nullptr) ? nullptr : main_frame->plater();
+// if (wParam == RIM_INPUTSINK && plater != nullptr && main_frame->IsActive()) {
+ if (wParam == RIM_INPUT && plater != nullptr && main_frame->IsActive()) {
+ RAWINPUT raw;
+ UINT rawSize = sizeof(RAWINPUT);
+ ::GetRawInputData((HRAWINPUT)lParam, RID_INPUT, &raw, &rawSize, sizeof(RAWINPUTHEADER));
+ if (raw.header.dwType == RIM_TYPEHID && plater->get_mouse3d_controller().handle_raw_input_win32(raw.data.hid.bRawData, raw.data.hid.dwSizeHid))
+ return true;
+ }
+ return false;
+ });
+
+ wxWindow::MSWRegisterMessageHandler(WM_COPYDATA, [](wxWindow* win, WXUINT /* nMsg */, WXWPARAM wParam, WXLPARAM lParam) {
+ COPYDATASTRUCT* copy_data_structure = { 0 };
+ copy_data_structure = (COPYDATASTRUCT*)lParam;
+ if (copy_data_structure->dwData == 1) {
+ LPCWSTR arguments = (LPCWSTR)copy_data_structure->lpData;
+ Slic3r::GUI::wxGetApp().other_instance_message_handler()->handle_message(boost::nowide::narrow(arguments));
+ }
+ return true;
+ });
}
#endif // WIN32
@@ -181,12 +586,20 @@ static void generic_exception_handle()
} catch (const std::bad_alloc& ex) {
// bad_alloc in main thread is most likely fatal. Report immediately to the user (wxLogError would be delayed)
// and terminate the app so it is at least certain to happen now.
- wxString errmsg = wxString::Format(_(L("%s has encountered an error. It was likely caused by running out of memory. "
+ wxString errmsg = wxString::Format(_L("%s has encountered an error. It was likely caused by running out of memory. "
"If you are sure you have enough RAM on your system, this may also be a bug and we would "
- "be glad if you reported it.\n\nThe application will now terminate.")), SLIC3R_APP_NAME);
- wxMessageBox(errmsg + "\n\n" + wxString(ex.what()), _(L("Fatal error")), wxOK | wxICON_ERROR);
+ "be glad if you reported it.\n\nThe application will now terminate."), SLIC3R_APP_NAME);
+ wxMessageBox(errmsg + "\n\n" + wxString(ex.what()), _L("Fatal error"), wxOK | wxICON_ERROR);
BOOST_LOG_TRIVIAL(error) << boost::format("std::bad_alloc exception: %1%") % ex.what();
std::terminate();
+ } catch (const boost::io::bad_format_string& ex) {
+ wxString errmsg = _L("PrusaSlicer has encountered a localization error. "
+ "Please report to PrusaSlicer team, what language was active and in which scenario "
+ "this issue happened. Thank you.\n\nThe application will now terminate.");
+ wxMessageBox(errmsg + "\n\n" + wxString(ex.what()), _L("Critical error"), wxOK | wxICON_ERROR);
+ BOOST_LOG_TRIVIAL(error) << boost::format("Uncaught exception: %1%") % ex.what();
+ std::terminate();
+ throw;
} catch (const std::exception& ex) {
wxLogError("Internal error: %s", ex.what());
BOOST_LOG_TRIVIAL(error) << boost::format("Uncaught exception: %1%") % ex.what();
@@ -194,15 +607,52 @@ static void generic_exception_handle()
}
}
+void GUI_App::post_init()
+{
+ assert(initialized());
+ if (! this->initialized())
+ throw Slic3r::RuntimeError("Calling post_init() while not yet initialized");
+
+ if (this->init_params->start_as_gcodeviewer) {
+ if (! this->init_params->input_files.empty())
+ this->plater()->load_gcode(wxString::FromUTF8(this->init_params->input_files[0].c_str()));
+ }
+ else {
+#if 0
+ // Load the cummulative config over the currently active profiles.
+ //FIXME if multiple configs are loaded, only the last one will have an effect.
+ // We need to decide what to do about loading of separate presets (just print preset, just filament preset etc).
+ // As of now only the full configs are supported here.
+ if (!m_print_config.empty())
+ this->gui->mainframe->load_config(m_print_config);
+#endif
+ if (! this->init_params->load_configs.empty())
+ // Load the last config to give it a name at the UI. The name of the preset may be later
+ // changed by loading an AMF or 3MF.
+ //FIXME this is not strictly correct, as one may pass a print/filament/printer profile here instead of a full config.
+ this->mainframe->load_config_file(this->init_params->load_configs.back());
+ // If loading a 3MF file, the config is loaded from the last one.
+ if (! this->init_params->input_files.empty())
+ this->plater()->load_files(this->init_params->input_files, true, true);
+ if (! this->init_params->extra_config.empty())
+ this->mainframe->load_config(this->init_params->extra_config);
+ }
+}
+
IMPLEMENT_APP(GUI_App)
-GUI_App::GUI_App()
+GUI_App::GUI_App(EAppMode mode)
: wxApp()
+ , m_app_mode(mode)
, m_em_unit(10)
, m_imgui(new ImGuiWrapper())
, m_wizard(nullptr)
, m_removable_drive_manager(std::make_unique<RemovableDriveManager>())
-{}
+ , m_other_instance_message_handler(std::make_unique<OtherInstanceMessageHandler>())
+{
+ //app config initializes early becasuse it is used in instance checking in PrusaSlicer.cpp
+ this->init_app_config();
+}
GUI_App::~GUI_App()
{
@@ -216,6 +666,83 @@ GUI_App::~GUI_App()
delete preset_updater;
}
+std::string GUI_App::get_gl_info(bool format_as_html, bool extensions)
+{
+ return OpenGLManager::get_gl_info().to_string(format_as_html, extensions);
+}
+
+wxGLContext* GUI_App::init_glcontext(wxGLCanvas& canvas)
+{
+ return m_opengl_mgr.init_glcontext(canvas);
+}
+
+bool GUI_App::init_opengl()
+{
+#ifdef __linux__
+ bool status = m_opengl_mgr.init_gl();
+ m_opengl_initialized = true;
+ return status;
+#else
+ return m_opengl_mgr.init_gl();
+#endif
+}
+
+void GUI_App::init_app_config()
+{
+ // Profiles for the alpha are stored into the PrusaSlicer-alpha directory to not mix with the current release.
+ SetAppName(SLIC3R_APP_KEY);
+// SetAppName(SLIC3R_APP_KEY "-beta");
+// SetAppDisplayName(SLIC3R_APP_NAME);
+
+ // Set the Slic3r data directory at the Slic3r XS module.
+ // Unix: ~/ .Slic3r
+ // Windows : "C:\Users\username\AppData\Roaming\Slic3r" or "C:\Documents and Settings\username\Application Data\Slic3r"
+ // Mac : "~/Library/Application Support/Slic3r"
+
+ if (data_dir().empty()) {
+ #ifndef __linux__
+ set_data_dir(wxStandardPaths::Get().GetUserDataDir().ToUTF8().data());
+ #else
+ // Since version 2.3, config dir on Linux is in ${XDG_CONFIG_HOME}.
+ // https://github.com/prusa3d/PrusaSlicer/issues/2911
+ wxString dir;
+ if (! wxGetEnv(wxS("XDG_CONFIG_HOME"), &dir) || dir.empty() )
+ dir = wxFileName::GetHomeDir() + wxS("/.config");
+ set_data_dir((dir + "/" + GetAppName()).ToUTF8().data());
+ #endif
+ }
+
+ if (!app_config)
+ app_config = new AppConfig(is_editor() ? AppConfig::EAppMode::Editor : AppConfig::EAppMode::GCodeViewer);
+
+ // load settings
+ m_app_conf_exists = app_config->exists();
+ if (m_app_conf_exists) {
+ 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 (is_editor()) {
+ throw Slic3r::RuntimeError(
+ _u8L("Error parsing PrusaSlicer config file, it is probably corrupted. "
+ "Try to manually delete the file to recover from the error. Your user profiles will not be affected.") +
+ "\n\n" + app_config->config_path() + "\n\n" + error);
+ }
+ else {
+ 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);
+ }
+ }
+ }
+}
+
+void GUI_App::init_single_instance_checker(const std::string &name, const std::string &path)
+{
+ BOOST_LOG_TRIVIAL(debug) << "init wx instance checker " << name << " "<< path;
+ m_single_instance_checker = std::make_unique<wxSingleInstanceChecker>(boost::nowide::widen(name), boost::nowide::widen(path));
+}
+
bool GUI_App::OnInit()
{
try {
@@ -233,51 +760,106 @@ bool GUI_App::on_init_inner()
wxCHECK_MSG(wxDirExists(resources_dir), false,
wxString::Format("Resources path does not exist or is not a directory: %s", resources_dir));
- // Profiles for the alpha are stored into the PrusaSlicer-alpha directory to not mix with the current release.
- SetAppName(SLIC3R_APP_KEY);
-// SetAppName(SLIC3R_APP_KEY "-beta");
- SetAppDisplayName(SLIC3R_APP_NAME);
+#ifdef __linux__
+ if (! check_old_linux_datadir(GetAppName())) {
+ std::cerr << "Quitting, user chose to move their data to new location." << std::endl;
+ return false;
+ }
+#endif
-// Enable this to get the default Win32 COMCTRL32 behavior of static boxes.
+ // Enable this to get the default Win32 COMCTRL32 behavior of static boxes.
// wxSystemOptions::SetOption("msw.staticbox.optimized-paint", 0);
-// Enable this to disable Windows Vista themes for all wxNotebooks. The themes seem to lead to terrible
-// performance when working on high resolution multi-display setups.
+ // Enable this to disable Windows Vista themes for all wxNotebooks. The themes seem to lead to terrible
+ // performance when working on high resolution multi-display setups.
// wxSystemOptions::SetOption("msw.notebook.themed-background", 0);
// Slic3r::debugf "wxWidgets version %s, Wx version %s\n", wxVERSION_STRING, wxVERSION;
- // Set the Slic3r data directory at the Slic3r XS module.
- // Unix: ~/ .Slic3r
- // Windows : "C:\Users\username\AppData\Roaming\Slic3r" or "C:\Documents and Settings\username\Application Data\Slic3r"
- // Mac : "~/Library/Application Support/Slic3r"
- if (data_dir().empty())
- set_data_dir(wxStandardPaths::Get().GetUserDataDir().ToUTF8().data());
+ if (is_editor()) {
+ std::string msg = Http::tls_global_init();
+ std::string ssl_cert_store = app_config->get("tls_accepted_cert_store_location");
+ bool ssl_accept = app_config->get("tls_cert_store_accepted") == "yes" && ssl_cert_store == Http::tls_system_cert_store();
+
+ if (!msg.empty() && !ssl_accept) {
+ wxRichMessageDialog
+ dlg(nullptr,
+ wxString::Format(_L("%s\nDo you want to continue?"), msg),
+ "PrusaSlicer", wxICON_QUESTION | wxYES_NO);
+ dlg.ShowCheckBox(_L("Remember my choice"));
+ if (dlg.ShowModal() != wxID_YES) return false;
+
+ app_config->set("tls_cert_store_accepted",
+ dlg.IsCheckBoxChecked() ? "yes" : "no");
+ app_config->set("tls_accepted_cert_store_location",
+ dlg.IsCheckBoxChecked() ? Http::tls_system_cert_store() : "");
+ }
+ }
+
+ app_config->set("version", SLIC3R_VERSION);
+ app_config->save();
+
+ wxInitAllImageHandlers();
+
+ SplashScreen* scrn = nullptr;
+ if (app_config->get("show_splash_screen") == "1") {
+ // make a bitmap with dark grey banner on the left side
+ wxBitmap bmp = SplashScreen::MakeBitmap(wxBitmap(from_u8(var(is_editor() ? "splashscreen.jpg" : "splashscreen-gcodepreview.jpg")), wxBITMAP_TYPE_JPEG));
+
+ // Detect position (display) to show the splash screen
+ // Now this position is equal to the mainframe position
+ wxPoint splashscreen_pos = wxDefaultPosition;
+ if (app_config->has("window_mainframe")) {
+ auto metrics = WindowMetrics::deserialize(app_config->get("window_mainframe"));
+ if (metrics)
+ splashscreen_pos = metrics->get_rect().GetPosition();
+ }
+
+ // create splash screen with updated bmp
+ scrn = new SplashScreen(bmp.IsOk() ? bmp : create_scaled_bitmap("prusa_slicer_logo", nullptr, 400),
+ wxSPLASH_CENTRE_ON_SCREEN | wxSPLASH_TIMEOUT, 4000, splashscreen_pos);
+#ifndef __linux__
+ wxYield();
+#endif
+ scrn->SetText(_L("Loading configuration")+ dots);
+ }
- app_config = new AppConfig();
preset_bundle = new PresetBundle();
// just checking for existence of Slic3r::data_dir is not enough : it may be an empty directory
// supplied as argument to --datadir; in that case we should still run the wizard
preset_bundle->setup_directories();
- // load settings
- app_conf_exists = app_config->exists();
- if (app_conf_exists) {
- app_config->load();
- }
-
- app_config->set("version", SLIC3R_VERSION);
- app_config->save();
-
-#ifdef __WXMSW__
- associate_3mf_files();
+ if (is_editor()) {
+#ifdef __WXMSW__
+#if ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+ if (app_config->get("associate_3mf") == "1")
+#endif // ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+ associate_3mf_files();
+#if ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+ if (app_config->get("associate_stl") == "1")
+ associate_stl_files();
+#endif // ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
#endif // __WXMSW__
- preset_updater = new PresetUpdater();
- Bind(EVT_SLIC3R_VERSION_ONLINE, [this](const wxCommandEvent &evt) {
- app_config->set("version_online", into_u8(evt.GetString()));
- app_config->save();
- });
+ preset_updater = new PresetUpdater();
+ Bind(EVT_SLIC3R_VERSION_ONLINE, [this](const wxCommandEvent& evt) {
+ app_config->set("version_online", into_u8(evt.GetString()));
+ app_config->save();
+ if (this->plater_ != nullptr) {
+ if (*Semver::parse(SLIC3R_VERSION) < *Semver::parse(into_u8(evt.GetString()))) {
+ this->plater_->get_notification_manager()->push_notification(NotificationType::NewAppAvailable);
+ }
+ }
+ });
+ }
+ else {
+#ifdef __WXMSW__
+#if ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+ if (app_config->get("associate_gcode") == "1")
+#endif // ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+ associate_gcode_files();
+#endif // __WXMSW__
+ }
// initialize label colors and fonts
init_label_colours();
@@ -295,7 +877,9 @@ bool GUI_App::on_init_inner()
}
#ifdef WIN32
+#if !wxVERSION_EQUAL_OR_GREATER_THAN(3,1,3)
register_win32_dpi_event();
+#endif // !wxVERSION_EQUAL_OR_GREATER_THAN
register_win32_device_notification_event();
#endif // WIN32
@@ -303,59 +887,92 @@ bool GUI_App::on_init_inner()
Slic3r::I18N::set_translate_callback(libslic3r_translate_callback);
// application frame
- if (wxImage::FindHandler(wxBITMAP_TYPE_PNG) == nullptr)
- wxImage::AddHandler(new wxPNGHandler());
+ if (scrn && is_editor())
+ scrn->SetText(_L("Preparing settings tabs") + dots);
+
mainframe = new MainFrame();
+ // hide settings tabs after first Layout
+ if (is_editor())
+ mainframe->select_tab(size_t(0));
+
sidebar().obj_list()->init_objects(); // propagate model objects to object list
// update_mode(); // !!! do that later
SetTopWindow(mainframe);
m_printhost_job_queue.reset(new PrintHostJobQueue(mainframe->printhost_queue_dlg()));
+ if (is_gcode_viewer()) {
+ mainframe->update_layout();
+ if (plater_ != nullptr)
+ // ensure the selected technology is ptFFF
+ plater_->set_printer_technology(ptFFF);
+ }
+ else
+ load_current_presets();
+ mainframe->Show(true);
+
+ obj_list()->set_min_height();
+
+ update_mode(); // update view mode after fix of the object_list size
+
+#ifdef __APPLE__
+ other_instance_message_handler()->bring_instance_forward();
+#endif //__APPLE__
Bind(wxEVT_IDLE, [this](wxIdleEvent& event)
{
if (! plater_)
return;
+
if (app_config->dirty() && app_config->get("autosave") == "1")
app_config->save();
this->obj_manipul()->update_if_dirty();
- // Preset updating & Configwizard are done after the above initializations,
- // and after MainFrame is created & shown.
- // The extra CallAfter() is needed because of Mac, where this is the only way
- // to popup a modal dialog on start without screwing combo boxes.
- // This is ugly but I honestly found no better way to do it.
- // Neither wxShowEvent nor wxWindowCreateEvent work reliably.
+ static bool update_gui_after_init = true;
+
+ // An ugly solution to GH #5537 in which GUI_App::init_opengl (normally called from events wxEVT_PAINT
+ // and wxEVT_SET_FOCUS before GUI_App::post_init is called) wasn't called before GUI_App::post_init and OpenGL wasn't initialized.
+#ifdef __linux__
+ if (update_gui_after_init && m_opengl_initialized) {
+#else
+ if (update_gui_after_init) {
+#endif
+ update_gui_after_init = false;
+#ifdef WIN32
+ this->mainframe->register_win32_callbacks();
+#endif
+ this->post_init();
+ }
+
+ // Preset updating & Configwizard are done after the above initializations,
+ // and after MainFrame is created & shown.
+ // The extra CallAfter() is needed because of Mac, where this is the only way
+ // to popup a modal dialog on start without screwing combo boxes.
+ // This is ugly but I honestly found no better way to do it.
+ // Neither wxShowEvent nor wxWindowCreateEvent work reliably.
static bool once = true;
if (once) {
once = false;
- check_updates(false);
- CallAfter([this] {
- config_wizard_startup();
- preset_updater->slic3r_update_notify();
- preset_updater->sync(preset_bundle);
- });
- }
- });
-
- load_current_presets();
+ if (preset_updater != nullptr) {
+ check_updates(false);
- mainframe->Show(true);
-
- /* Temporary workaround for the correct behavior of the Scrolled sidebar panel:
- * change min hight of object list to the normal min value (15 * wxGetApp().em_unit())
- * after first whole Mainframe updating/layouting
- */
- const int list_min_height = 15 * em_unit();
- if (obj_list()->GetMinSize().GetY() > list_min_height)
- obj_list()->SetMinSize(wxSize(-1, list_min_height));
+ CallAfter([this] {
+ config_wizard_startup();
+ preset_updater->slic3r_update_notify();
+ preset_updater->sync(preset_bundle);
+ });
+ }
- update_mode(); // update view mode after fix of the object_list size
+#ifdef _WIN32
+ //sets window property to mainframe so other instances can indentify it
+ OtherInstanceMessageHandler::init_windows_properties(mainframe, m_instance_hash_int);
+#endif //WIN32
+ }
+ });
m_initialized = true;
return true;
@@ -426,6 +1043,11 @@ void GUI_App::init_fonts()
m_small_font.SetPointSize(11);
m_bold_font.SetPointSize(13);
#endif /*__WXMAC__*/
+
+ // wxSYS_OEM_FIXED_FONT and wxSYS_ANSI_FIXED_FONT use the same as
+ // DEFAULT in wxGtk. Use the TELETYPE family as a work-around
+ m_code_font = wxFont(wxFontInfo().Family(wxFONTFAMILY_TELETYPE));
+ m_code_font.SetPointSize(m_normal_font.GetPointSize());
}
void GUI_App::update_fonts(const MainFrame *main_frame)
@@ -441,6 +1063,7 @@ void GUI_App::update_fonts(const MainFrame *main_frame)
m_small_font = m_normal_font;
m_bold_font = main_frame->normal_font().Bold();
m_em_unit = main_frame->em_unit();
+ m_code_font.SetPointSize(m_normal_font.GetPointSize());
}
void GUI_App::set_label_clr_modified(const wxColour& clr) {
@@ -459,6 +1082,11 @@ void GUI_App::set_label_clr_sys(const wxColour& clr) {
app_config->save();
}
+wxSize GUI_App::get_min_size() const
+{
+ return wxSize(76*m_em_unit, 49 * m_em_unit);
+}
+
float GUI_App::toolbar_icon_scale(const bool is_limited/* = false*/) const
{
#ifdef __APPLE__
@@ -469,50 +1097,88 @@ float GUI_App::toolbar_icon_scale(const bool is_limited/* = false*/) const
const std::string& use_val = app_config->get("use_custom_toolbar_size");
const std::string& val = app_config->get("custom_toolbar_size");
+ const std::string& auto_val = app_config->get("auto_toolbar_size");
- if (val.empty() || use_val.empty() || use_val == "0")
+ if (val.empty() || auto_val.empty() || use_val.empty())
return icon_sc;
- int int_val = atoi(val.c_str());
+ int int_val = use_val == "0" ? 100 : atoi(val.c_str());
+ // correct value in respect to auto_toolbar_size
+ int_val = std::min(atoi(auto_val.c_str()), int_val);
+
if (is_limited && int_val < 50)
int_val = 50;
return 0.01f * int_val * icon_sc;
}
-void GUI_App::recreate_GUI()
+void GUI_App::set_auto_toolbar_icon_scale(float scale) const
+{
+#ifdef __APPLE__
+ const float icon_sc = 1.0f; // for Retina display will be used its own scale
+#else
+ const float icon_sc = m_em_unit * 0.1f;
+#endif // __APPLE__
+
+ long int_val = std::min(int(std::lround(scale / icon_sc * 100)), 100);
+ std::string val = std::to_string(int_val);
+
+ app_config->set("auto_toolbar_size", val);
+}
+
+// check user printer_presets for the containing information about "Print Host upload"
+void GUI_App::check_printer_presets()
{
+ std::vector<std::string> preset_names = PhysicalPrinter::presets_with_print_host_information(preset_bundle->printers);
+ if (preset_names.empty())
+ return;
+
+ wxString msg_text = _L("You have the following presets with saved options for \"Print Host upload\"") + ":";
+ for (const std::string& preset_name : preset_names)
+ msg_text += "\n \"" + from_u8(preset_name) + "\",";
+ msg_text.RemoveLast();
+ msg_text += "\n\n" + _L("But since this version of PrusaSlicer we don't show this information in Printer Settings anymore.\n"
+ "Settings will be available in physical printers settings.") + "\n\n" +
+ _L("By default new Printer devices will be named as \"Printer N\" during its creation.\n"
+ "Note: This name can be changed later from the physical printers settings");
+
+ wxMessageDialog(nullptr, msg_text, _L("Information"), wxOK | wxICON_INFORMATION).ShowModal();
+
+ preset_bundle->physical_printers.load_printers_from_presets(preset_bundle->printers);
+}
+
+void GUI_App::recreate_GUI(const wxString& msg_name)
+{
+ m_is_recreating_gui = true;
+
mainframe->shutdown();
- const auto msg_name = _(L("Changing of an application language")) + dots;
- wxProgressDialog dlg(msg_name, msg_name);
+ wxProgressDialog dlg(msg_name, msg_name, 100, nullptr, wxPD_AUTO_HIDE);
dlg.Pulse();
- dlg.Update(10, _(L("Recreating")) + dots);
+ dlg.Update(10, _L("Recreating") + dots);
MainFrame *old_main_frame = mainframe;
mainframe = new MainFrame();
+ if (is_editor())
+ // hide settings tabs after first Layout
+ mainframe->select_tab(size_t(0));
// Propagate model objects to object list.
sidebar().obj_list()->init_objects();
SetTopWindow(mainframe);
- dlg.Update(30, _(L("Recreating")) + dots);
+ dlg.Update(30, _L("Recreating") + dots);
old_main_frame->Destroy();
// For this moment ConfigWizard is deleted, invalidate it.
m_wizard = nullptr;
- dlg.Update(80, _(L("Loading of current presets")) + dots);
+ dlg.Update(80, _L("Loading of current presets") + dots);
m_printhost_job_queue.reset(new PrintHostJobQueue(mainframe->printhost_queue_dlg()));
load_current_presets();
mainframe->Show(true);
- dlg.Update(90, _(L("Loading of a mode view")) + dots);
- /* Temporary workaround for the correct behavior of the Scrolled sidebar panel:
- * change min hight of object list to the normal min value (15 * wxGetApp().em_unit())
- * after first whole Mainframe updating/layouting
- */
- const int list_min_height = 15 * em_unit();
- if (obj_list()->GetMinSize().GetY() > list_min_height)
- obj_list()->SetMinSize(wxSize(-1, list_min_height));
+ dlg.Update(90, _L("Loading of a mode view") + dots);
+
+ obj_list()->set_min_height();
update_mode();
// #ys_FIXME_delete_after_testing Do we still need this ?
@@ -520,6 +1186,8 @@ void GUI_App::recreate_GUI()
// // Run the config wizard, don't offer the "reset user profile" checkbox.
// config_wizard_startup(true);
// });
+
+ m_is_recreating_gui = false;
}
void GUI_App::system_info()
@@ -559,9 +1227,9 @@ void fatal_error(wxWindow* parent)
// Called after the Preferences dialog is closed and the program settings are saved.
// Update the UI based on the current preferences.
-void GUI_App::update_ui_from_settings()
+void GUI_App::update_ui_from_settings(bool apply_free_camera_correction)
{
- mainframe->update_ui_from_settings();
+ mainframe->update_ui_from_settings(apply_free_camera_correction);
}
void GUI_App::persist_window_geometry(wxTopLevelWindow *window, bool default_maximized)
@@ -584,7 +1252,7 @@ void GUI_App::load_project(wxWindow *parent, wxString& input_file) const
{
input_file.Clear();
wxFileDialog dialog(parent ? parent : GetTopWindow(),
- _(L("Choose one file (3MF/AMF):")),
+ _L("Choose one file (3MF/AMF):"),
app_config->get_last_dir(), "",
file_wildcards(FT_PROJECT), wxFD_OPEN | wxFD_FILE_MUST_EXIST);
@@ -596,7 +1264,7 @@ void GUI_App::import_model(wxWindow *parent, wxArrayString& input_files) const
{
input_files.Clear();
wxFileDialog dialog(parent ? parent : GetTopWindow(),
- _(L("Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):")),
+ _L("Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):"),
from_u8(app_config->get_last_dir()), "",
file_wildcards(FT_MODEL), wxFD_OPEN | wxFD_MULTIPLE | wxFD_FILE_MUST_EXIST);
@@ -604,16 +1272,101 @@ void GUI_App::import_model(wxWindow *parent, wxArrayString& input_files) const
dialog.GetPaths(input_files);
}
+void GUI_App::load_gcode(wxWindow* parent, wxString& input_file) const
+{
+ input_file.Clear();
+ wxFileDialog dialog(parent ? parent : GetTopWindow(),
+ _L("Choose one file (GCODE/.GCO/.G/.ngc/NGC):"),
+ app_config->get_last_dir(), "",
+ file_wildcards(FT_GCODE), wxFD_OPEN | wxFD_FILE_MUST_EXIST);
+
+ if (dialog.ShowModal() == wxID_OK)
+ input_file = dialog.GetPath();
+}
+
bool GUI_App::switch_language()
{
if (select_language()) {
- recreate_GUI();
+ recreate_GUI(_L("Changing of an application language") + dots);
return true;
} else {
return false;
}
}
+#ifdef __linux__
+static const wxLanguageInfo* linux_get_existing_locale_language(const wxLanguageInfo* language,
+ const wxLanguageInfo* system_language)
+{
+ constexpr size_t max_len = 50;
+ char path[max_len] = "";
+ std::vector<std::string> locales;
+ const std::string lang_prefix = into_u8(language->CanonicalName.BeforeFirst('_'));
+
+ // Call locale -a so we can parse the output to get the list of available locales
+ // We expect lines such as "en_US.utf8". Pick ones starting with the language code
+ // we are switching to. Lines with different formatting will be removed later.
+ FILE* fp = popen("locale -a", "r");
+ if (fp != NULL) {
+ while (fgets(path, max_len, fp) != NULL) {
+ std::string line(path);
+ line = line.substr(0, line.find('\n'));
+ if (boost::starts_with(line, lang_prefix))
+ locales.push_back(line);
+ }
+ pclose(fp);
+ }
+
+ // locales now contain all candidates for this language.
+ // Sort them so ones containing anything about UTF-8 are at the end.
+ std::sort(locales.begin(), locales.end(), [](const std::string& a, const std::string& b)
+ {
+ auto has_utf8 = [](const std::string & s) {
+ auto S = boost::to_upper_copy(s);
+ return S.find("UTF8") != std::string::npos || S.find("UTF-8") != std::string::npos;
+ };
+ return ! has_utf8(a) && has_utf8(b);
+ });
+
+ // Remove the suffix behind a dot, if there is one.
+ for (std::string& s : locales)
+ s = s.substr(0, s.find("."));
+
+ // We just hope that dear Linux "locale -a" returns country codes
+ // in ISO 3166-1 alpha-2 code (two letter) format.
+ // https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes
+ // To be sure, remove anything not looking as expected
+ // (any number of lowercase letters, underscore, two uppercase letters).
+ locales.erase(std::remove_if(locales.begin(),
+ locales.end(),
+ [](const std::string& s) {
+ return ! std::regex_match(s,
+ std::regex("^[a-z]+_[A-Z]{2}$"));
+ }),
+ locales.end());
+
+ // Is there a candidate matching a country code of a system language? Move it to the end,
+ // while maintaining the order of matches, so that the best match ends up at the very end.
+ std::string system_country = "_" + into_u8(system_language->CanonicalName.AfterFirst('_')).substr(0, 2);
+ int cnt = locales.size();
+ for (int i=0; i<cnt; ++i)
+ if (locales[i].find(system_country) != std::string::npos) {
+ locales.emplace_back(std::move(locales[i]));
+ locales[i].clear();
+ }
+
+ // Now try them one by one.
+ for (auto it = locales.rbegin(); it != locales.rend(); ++ it)
+ if (! it->empty()) {
+ const std::string &locale = *it;
+ const wxLanguageInfo* lang = wxLocale::FindLanguageInfo(from_u8(locale));
+ if (wxLocale::IsAvailable(lang->Language))
+ return lang;
+ }
+ return language;
+}
+#endif
+
// select language from the list of installed languages
bool GUI_App::select_language()
{
@@ -657,19 +1410,20 @@ bool GUI_App::select_language()
// This is the language to highlight in the choice dialog initially.
init_selection_default = init_selection;
- const long index = wxGetSingleChoiceIndex(_(L("Select the language")), _(L("Language")), names, init_selection_default);
+ const long index = wxGetSingleChoiceIndex(_L("Select the language"), _L("Language"), names, init_selection_default);
// Try to load a new language.
if (index != -1 && (init_selection == -1 || init_selection != index)) {
const wxLanguageInfo *new_language_info = language_infos[index];
- if (new_language_info == m_language_info_best || new_language_info == m_language_info_system) {
- // The newly selected profile matches user's default profile exactly. That's great.
- } else if (m_language_info_best != nullptr && new_language_info->CanonicalName.BeforeFirst('_') == m_language_info_best->CanonicalName.BeforeFirst('_'))
- new_language_info = m_language_info_best;
- else if (m_language_info_system != nullptr && new_language_info->CanonicalName.BeforeFirst('_') == m_language_info_system->CanonicalName.BeforeFirst('_'))
- new_language_info = m_language_info_system;
if (this->load_language(new_language_info->CanonicalName, false)) {
// Save language at application config.
- app_config->set("translation_language", m_wxLocale->GetCanonicalName().ToUTF8().data());
+ // Which language to save as the selected dictionary language?
+ // 1) Hopefully the language set to wxTranslations by this->load_language(), but that API is weird and we don't want to rely on its
+ // stability in the future:
+ // wxTranslations::Get()->GetBestTranslation(SLIC3R_APP_KEY, wxLANGUAGE_ENGLISH);
+ // 2) Current locale language may not match the dictionary name, see GH issue #3901
+ // m_wxLocale->GetCanonicalName()
+ // 3) new_language_info->CanonicalName is a safe bet. It points to a valid dictionary name.
+ app_config->set("translation_language", new_language_info->CanonicalName.ToUTF8().data());
app_config->save();
return true;
}
@@ -698,7 +1452,6 @@ bool GUI_App::load_language(wxString language, bool initial)
BOOST_LOG_TRIVIAL(trace) << boost::format("System language detected (user locales and such): %1%") % m_language_info_system->CanonicalName.ToUTF8().data();
}
}
-#if defined(__WXMSW__) || defined(__WXOSX__)
{
// Allocating a temporary locale will switch the default wxTranslations to its internal wxTranslations instance.
wxLocale temp_locale;
@@ -714,8 +1467,15 @@ bool GUI_App::load_language(wxString language, bool initial)
m_language_info_best = wxLocale::FindLanguageInfo(best_language);
BOOST_LOG_TRIVIAL(trace) << boost::format("Best translation language detected (may be different from user locales): %1%") % m_language_info_best->CanonicalName.ToUTF8().data();
}
+ #ifdef __linux__
+ wxString lc_all;
+ if (wxGetEnv("LC_ALL", &lc_all) && ! lc_all.IsEmpty()) {
+ // Best language returned by wxWidgets on Linux apparently does not respect LC_ALL.
+ // Disregard the "best" suggestion in case LC_ALL is provided.
+ m_language_info_best = nullptr;
+ }
+ #endif
}
-#endif
}
const wxLanguageInfo *language_info = language.empty() ? nullptr : wxLocale::FindLanguageInfo(language);
@@ -731,6 +1491,7 @@ bool GUI_App::load_language(wxString language, bool initial)
}
if (language_info == nullptr) {
+ // PrusaSlicer does not support the Right to Left languages yet.
if (m_language_info_system != nullptr && m_language_info_system->LayoutDirection != wxLayout_RightToLeft)
language_info = m_language_info_system;
if (m_language_info_best != nullptr && m_language_info_best->LayoutDirection != wxLayout_RightToLeft)
@@ -749,6 +1510,27 @@ bool GUI_App::load_language(wxString language, bool initial)
BOOST_LOG_TRIVIAL(trace) << "Using Czech dictionaries for Slovak language";
}
+ // Select language for locales. This language may be different from the language of the dictionary.
+ if (language_info == m_language_info_best || language_info == m_language_info_system) {
+ // The current language matches user's default profile exactly. That's great.
+ } else if (m_language_info_best != nullptr && language_info->CanonicalName.BeforeFirst('_') == m_language_info_best->CanonicalName.BeforeFirst('_')) {
+ // Use whatever the operating system recommends, if it the language code of the dictionary matches the recommended language.
+ // This allows a Swiss guy to use a German dictionary without forcing him to German locales.
+ language_info = m_language_info_best;
+ } else if (m_language_info_system != nullptr && language_info->CanonicalName.BeforeFirst('_') == m_language_info_system->CanonicalName.BeforeFirst('_'))
+ language_info = m_language_info_system;
+
+#ifdef __linux__
+ // If we can't find this locale , try to use different one for the language
+ // instead of just reporting that it is impossible to switch.
+ if (! wxLocale::IsAvailable(language_info->Language)) {
+ std::string original_lang = into_u8(language_info->CanonicalName);
+ language_info = linux_get_existing_locale_language(language_info, m_language_info_system);
+ BOOST_LOG_TRIVIAL(trace) << boost::format("Can't switch language to %1% (missing locales). Using %2% instead.")
+ % original_lang % language_info->CanonicalName.ToUTF8().data();
+ }
+#endif
+
if (! wxLocale::IsAvailable(language_info->Language)) {
// Loading the language dictionary failed.
wxString message = "Switching PrusaSlicer to language " + language_info->CanonicalName + " failed.";
@@ -775,9 +1557,9 @@ bool GUI_App::load_language(wxString language, bool initial)
wxTranslations::Get()->SetLanguage(language_dict);
m_wxLocale->AddCatalog(SLIC3R_APP_KEY);
m_imgui->set_language(into_u8(language_info->CanonicalName));
- //FIXME This is a temporary workaround, the correct solution is to switch to "C" locale during file import / export only.
+ //FIXME This is a temporary workaround, the correct solution is to switch to "C" locale during file import / export only.
wxSetlocale(LC_NUMERIC, "C");
- Preset::update_suffix_modified();
+ Preset::update_suffix_modified((" (" + _L("modified") + ")").ToUTF8().data());
return true;
}
@@ -817,6 +1599,7 @@ void GUI_App::update_mode()
tab->update_mode();
plater()->update_object_menu();
+ plater()->canvas3D()->update_gizmos_on_off_state();
}
void GUI_App::add_config_menu(wxMenuBar *menu)
@@ -827,34 +1610,42 @@ void GUI_App::add_config_menu(wxMenuBar *menu)
const auto config_wizard_name = _(ConfigWizard::name(true));
const auto config_wizard_tooltip = from_u8((boost::format(_utf8(L("Run %s"))) % config_wizard_name).str());
// Cmd+, is standard on OS X - what about other operating systems?
- local_menu->Append(config_id_base + ConfigMenuWizard, config_wizard_name + dots, config_wizard_tooltip);
- local_menu->Append(config_id_base + ConfigMenuSnapshots, _(L("&Configuration Snapshots")) + dots, _(L("Inspect / activate configuration snapshots")));
- local_menu->Append(config_id_base + ConfigMenuTakeSnapshot, _(L("Take Configuration &Snapshot")), _(L("Capture a configuration snapshot")));
- local_menu->Append(config_id_base + ConfigMenuUpdate, _(L("Check for updates")), _(L("Check for configuration updates")));
- local_menu->AppendSeparator();
- local_menu->Append(config_id_base + ConfigMenuPreferences, _(L("&Preferences")) + dots +
+ if (is_editor()) {
+ local_menu->Append(config_id_base + ConfigMenuWizard, config_wizard_name + dots, config_wizard_tooltip);
+ local_menu->Append(config_id_base + ConfigMenuSnapshots, _L("&Configuration Snapshots") + dots, _L("Inspect / activate configuration snapshots"));
+ local_menu->Append(config_id_base + ConfigMenuTakeSnapshot, _L("Take Configuration &Snapshot"), _L("Capture a configuration snapshot"));
+ local_menu->Append(config_id_base + ConfigMenuUpdate, _L("Check for updates"), _L("Check for configuration updates"));
+ local_menu->AppendSeparator();
+ }
+ local_menu->Append(config_id_base + ConfigMenuPreferences, _L("&Preferences") + dots +
#ifdef __APPLE__
"\tCtrl+,",
#else
"\tCtrl+P",
#endif
- _(L("Application preferences")));
- local_menu->AppendSeparator();
- auto mode_menu = new wxMenu();
- mode_menu->AppendRadioItem(config_id_base + ConfigMenuModeSimple, _(L("Simple")), _(L("Simple View Mode")));
- mode_menu->AppendRadioItem(config_id_base + ConfigMenuModeAdvanced, _(L("Advanced")), _(L("Advanced View Mode")));
- mode_menu->AppendRadioItem(config_id_base + ConfigMenuModeExpert, _(L("Expert")), _(L("Expert View Mode")));
- Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { if(get_mode() == comSimple) evt.Check(true); }, config_id_base + ConfigMenuModeSimple);
- Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { if(get_mode() == comAdvanced) evt.Check(true); }, config_id_base + ConfigMenuModeAdvanced);
- Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { if(get_mode() == comExpert) evt.Check(true); }, config_id_base + ConfigMenuModeExpert);
-
- local_menu->AppendSubMenu(mode_menu, _(L("Mode")), wxString::Format(_(L("%s View Mode")), SLIC3R_APP_NAME));
- local_menu->AppendSeparator();
- local_menu->Append(config_id_base + ConfigMenuLanguage, _(L("&Language")));
+ _L("Application preferences"));
+ wxMenu* mode_menu = nullptr;
+ if (is_editor()) {
+ local_menu->AppendSeparator();
+ mode_menu = new wxMenu();
+ mode_menu->AppendRadioItem(config_id_base + ConfigMenuModeSimple, _L("Simple"), _L("Simple View Mode"));
+// mode_menu->AppendRadioItem(config_id_base + ConfigMenuModeAdvanced, _L("Advanced"), _L("Advanced View Mode"));
+ mode_menu->AppendRadioItem(config_id_base + ConfigMenuModeAdvanced, _CTX(L_CONTEXT("Advanced", "Mode"), "Mode"), _L("Advanced View Mode"));
+ mode_menu->AppendRadioItem(config_id_base + ConfigMenuModeExpert, _L("Expert"), _L("Expert View Mode"));
+ Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { if (get_mode() == comSimple) evt.Check(true); }, config_id_base + ConfigMenuModeSimple);
+ Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { if (get_mode() == comAdvanced) evt.Check(true); }, config_id_base + ConfigMenuModeAdvanced);
+ Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { if (get_mode() == comExpert) evt.Check(true); }, config_id_base + ConfigMenuModeExpert);
+
+ local_menu->AppendSubMenu(mode_menu, _L("Mode"), wxString::Format(_L("%s View Mode"), SLIC3R_APP_NAME));
+ }
local_menu->AppendSeparator();
- local_menu->Append(config_id_base + ConfigMenuFlashFirmware, _(L("Flash printer &firmware")), _(L("Upload a firmware image into an Arduino based printer")));
- // TODO: for when we're able to flash dictionaries
- // local_menu->Append(config_id_base + FirmwareMenuDict, _(L("Flash language file")), _(L("Upload a language dictionary file into a Prusa printer")));
+ local_menu->Append(config_id_base + ConfigMenuLanguage, _L("&Language"));
+ if (is_editor()) {
+ local_menu->AppendSeparator();
+ local_menu->Append(config_id_base + ConfigMenuFlashFirmware, _L("Flash printer &firmware"), _L("Upload a firmware image into an Arduino based printer"));
+ // TODO: for when we're able to flash dictionaries
+ // local_menu->Append(config_id_base + FirmwareMenuDict, _L("Flash language file"), _L("Upload a language dictionary file into a Prusa printer"));
+ }
local_menu->Bind(wxEVT_MENU, [this, config_id_base](wxEvent &event) {
switch (event.GetId() - config_id_base) {
@@ -867,7 +1658,7 @@ void GUI_App::add_config_menu(wxMenuBar *menu)
case ConfigMenuTakeSnapshot:
// Take a configuration snapshot.
if (check_unsaved_changes()) {
- wxTextEntryDialog dlg(nullptr, _(L("Taking configuration snapshot")), _(L("Snapshot name")));
+ wxTextEntryDialog dlg(nullptr, _L("Taking configuration snapshot"), _L("Snapshot name"));
// set current normal font for dialog children,
// because of just dlg.SetFont(normal_font()) has no result;
@@ -888,20 +1679,52 @@ void GUI_App::add_config_menu(wxMenuBar *menu)
ConfigSnapshotDialog dlg(Slic3r::GUI::Config::SnapshotDB::singleton(), on_snapshot);
dlg.ShowModal();
if (!dlg.snapshot_to_activate().empty()) {
- if (!Config::SnapshotDB::singleton().is_on_snapshot(*app_config))
+ if (! Config::SnapshotDB::singleton().is_on_snapshot(*app_config))
Config::SnapshotDB::singleton().take_snapshot(*app_config, Config::Snapshot::SNAPSHOT_BEFORE_ROLLBACK);
- app_config->set("on_snapshot",
- Config::SnapshotDB::singleton().restore_snapshot(dlg.snapshot_to_activate(), *app_config).id);
- preset_bundle->load_presets(*app_config);
- // Load the currently selected preset into the GUI, update the preset selection box.
- load_current_presets();
+ try {
+ app_config->set("on_snapshot", Config::SnapshotDB::singleton().restore_snapshot(dlg.snapshot_to_activate(), *app_config).id);
+ preset_bundle->load_presets(*app_config);
+ // Load the currently selected preset into the GUI, update the preset selection box.
+ load_current_presets();
+ } catch (std::exception &ex) {
+ GUI::show_error(nullptr, _L("Failed to activate configuration snapshot.") + "\n" + into_u8(ex.what()));
+ }
}
}
break;
case ConfigMenuPreferences:
{
- PreferencesDialog dlg(mainframe);
- dlg.ShowModal();
+ bool app_layout_changed = false;
+ {
+ // the dialog needs to be destroyed before the call to recreate_GUI()
+ // or sometimes the application crashes into wxDialogBase() destructor
+ // so we put it into an inner scope
+ PreferencesDialog dlg(mainframe);
+ dlg.ShowModal();
+ app_layout_changed = dlg.settings_layout_changed();
+ if (dlg.seq_top_layer_only_changed())
+ this->plater_->refresh_print();
+#if ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+#ifdef _WIN32
+ if (is_editor()) {
+ if (app_config->get("associate_3mf") == "1")
+ associate_3mf_files();
+ if (app_config->get("associate_stl") == "1")
+ associate_stl_files();
+ }
+ else {
+ if (app_config->get("associate_gcode") == "1")
+ associate_gcode_files();
+ }
+#endif // _WIN32
+#endif // ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+ }
+ if (app_layout_changed) {
+ // hide full main_sizer for mainFrame
+ mainframe->GetSizer()->Show(false);
+ mainframe->update_layout();
+ mainframe->select_tab(size_t(0));
+ }
break;
}
case ConfigMenuLanguage:
@@ -913,11 +1736,13 @@ void GUI_App::add_config_menu(wxMenuBar *menu)
// the dialog needs to be destroyed before the call to switch_language()
// or sometimes the application crashes into wxDialogBase() destructor
// so we put it into an inner scope
+ wxString title = is_editor() ? wxString(SLIC3R_APP_NAME) : wxString(GCODEVIEWER_APP_NAME);
+ title += " - " + _L("Language selection");
wxMessageDialog dialog(nullptr,
- _(L("Switching the language will trigger application restart.\n"
- "You will lose content of the plater.")) + "\n\n" +
- _(L("Do you want to proceed?")),
- wxString(SLIC3R_APP_NAME) + " - " + _(L("Language selection")),
+ _L("Switching the language will trigger application restart.\n"
+ "You will lose content of the plater.") + "\n\n" +
+ _L("Do you want to proceed?"),
+ title,
wxICON_QUESTION | wxOK | wxCANCEL);
if (dialog.ShowModal() == wxID_CANCEL)
return;
@@ -935,42 +1760,77 @@ void GUI_App::add_config_menu(wxMenuBar *menu)
});
using std::placeholders::_1;
-
- auto modfn = [this](int mode, wxCommandEvent&) { if(get_mode() != mode) save_mode(mode); };
- mode_menu->Bind(wxEVT_MENU, std::bind(modfn, comSimple, _1), config_id_base + ConfigMenuModeSimple);
- mode_menu->Bind(wxEVT_MENU, std::bind(modfn, comAdvanced, _1), config_id_base + ConfigMenuModeAdvanced);
- mode_menu->Bind(wxEVT_MENU, std::bind(modfn, comExpert, _1), config_id_base + ConfigMenuModeExpert);
- menu->Append(local_menu, _(L("&Configuration")));
+ if (mode_menu != nullptr) {
+ auto modfn = [this](int mode, wxCommandEvent&) { if (get_mode() != mode) save_mode(mode); };
+ mode_menu->Bind(wxEVT_MENU, std::bind(modfn, comSimple, _1), config_id_base + ConfigMenuModeSimple);
+ mode_menu->Bind(wxEVT_MENU, std::bind(modfn, comAdvanced, _1), config_id_base + ConfigMenuModeAdvanced);
+ mode_menu->Bind(wxEVT_MENU, std::bind(modfn, comExpert, _1), config_id_base + ConfigMenuModeExpert);
+ }
+
+ menu->Append(local_menu, _L("&Configuration"));
}
// This is called when closing the application, when loading a config file or when starting the config wizard
// to notify the user whether he is aware that some preset changes will be lost.
bool GUI_App::check_unsaved_changes(const wxString &header)
{
- wxString dirty;
PrinterTechnology printer_technology = preset_bundle->printers.get_edited_preset().printer_technology();
- for (Tab *tab : tabs_list)
+
+ bool has_unsaved_changes = false;
+ for (Tab* tab : tabs_list)
if (tab->supports_printer_technology(printer_technology) && tab->current_preset_is_dirty()) {
- if (dirty.empty())
- dirty = tab->title();
- else
- dirty += wxString(", ") + tab->title();
+ has_unsaved_changes = true;
+ break;
}
- if (dirty.empty())
- // No changes, the application may close or reload presets.
+ if (has_unsaved_changes)
+ {
+ UnsavedChangesDialog dlg(header);
+ if (wxGetApp().app_config->get("default_action_on_close_application") == "none" && dlg.ShowModal() == wxID_CANCEL)
+ return false;
+
+ if (dlg.save_preset()) // save selected changes
+ {
+ for (const std::pair<std::string, Preset::Type>& nt : dlg.get_names_and_types())
+ preset_bundle->save_changes_for_preset(nt.first, nt.second, dlg.get_unselected_options(nt.second));
+
+ // if we saved changes to the new presets, we should to
+ // synchronize config.ini with the current selections.
+ preset_bundle->export_selections(*app_config);
+
+ wxMessageBox(_L("The preset(s) modifications are successfully saved"));
+ }
+ }
+
+ return true;
+}
+
+bool GUI_App::check_print_host_queue()
+{
+ wxString dirty;
+ std::vector<std::pair<std::string, std::string>> jobs;
+ // Get ongoing jobs from dialog
+ mainframe->m_printhost_queue_dlg->get_active_jobs(jobs);
+ if (jobs.empty())
return true;
- // Ask the user.
+ // Show dialog
+ wxString job_string = wxString();
+ for (const auto& job : jobs) {
+ job_string += format_wxstr(" %1% : %2% \n", job.first, job.second);
+ }
wxString message;
- if (! header.empty())
- message = header + "\n\n";
- message += _(L("The presets on the following tabs were modified")) + ": " + dirty + "\n\n" + _(L("Discard changes and continue anyway?"));
+ message += _(L("The uploads are still ongoing")) + ":\n\n" + job_string +"\n" + _(L("Stop them and continue anyway?"));
wxMessageDialog dialog(mainframe,
message,
- wxString(SLIC3R_APP_NAME) + " - " + _(L("Unsaved Presets")),
+ wxString(SLIC3R_APP_NAME) + " - " + _(L("Ongoing uploads")),
wxICON_QUESTION | wxYES_NO | wxNO_DEFAULT);
- return dialog.ShowModal() == wxID_YES;
+ if (dialog.ShowModal() == wxID_YES)
+ return true;
+
+ // TODO: If already shown, bring forward
+ mainframe->m_printhost_queue_dlg->Show();
+ return false;
}
bool GUI_App::checked_tab(Tab* tab)
@@ -982,8 +1842,13 @@ bool GUI_App::checked_tab(Tab* tab)
}
// Update UI / Tabs to reflect changes in the currently loaded presets
-void GUI_App::load_current_presets()
+void GUI_App::load_current_presets(bool check_printer_presets_ /*= true*/)
{
+ // check printer_presets for the containing information about "Print Host upload"
+ // and create physical printer from it, if any exists
+ if (check_printer_presets_)
+ check_printer_presets();
+
PrinterTechnology printer_technology = preset_bundle->printers.get_edited_preset().printer_technology();
this->plater()->set_printer_technology(printer_technology);
for (Tab *tab : tabs_list)
@@ -1004,13 +1869,64 @@ bool GUI_App::OnExceptionInMainLoop()
}
#ifdef __APPLE__
+// This callback is called from wxEntry()->wxApp::CallOnInit()->NSApplication run
+// that is, before GUI_App::OnInit(), so we have a chance to switch GUI_App
+// to a G-code viewer.
+void GUI_App::OSXStoreOpenFiles(const wxArrayString &fileNames)
+{
+ size_t num_gcodes = 0;
+ for (const wxString &filename : fileNames)
+ if (is_gcode_file(into_u8(filename)))
+ ++ num_gcodes;
+ if (fileNames.size() == num_gcodes) {
+ // Opening PrusaSlicer by drag & dropping a G-Code onto PrusaSlicer icon in Finder,
+ // just G-codes were passed. Switch to G-code viewer mode.
+ m_app_mode = EAppMode::GCodeViewer;
+ unlock_lockfile(get_instance_hash_string() + ".lock", data_dir() + "/cache/");
+ if(app_config != nullptr)
+ delete app_config;
+ app_config = nullptr;
+ init_app_config();
+ }
+ wxApp::OSXStoreOpenFiles(fileNames);
+}
// wxWidgets override to get an event on open files.
void GUI_App::MacOpenFiles(const wxArrayString &fileNames)
{
std::vector<std::string> files;
- for (size_t i = 0; i < fileNames.GetCount(); ++ i)
- files.emplace_back(fileNames[i].ToUTF8().data());
- this->plater()->load_files(files, true, true);
+ std::vector<wxString> gcode_files;
+ std::vector<wxString> non_gcode_files;
+ for (const auto& filename : fileNames) {
+ if (is_gcode_file(into_u8(filename)))
+ gcode_files.emplace_back(filename);
+ else {
+ files.emplace_back(into_u8(filename));
+ non_gcode_files.emplace_back(filename);
+ }
+ }
+ if (m_app_mode == EAppMode::GCodeViewer) {
+ // Running in G-code viewer.
+ // Load the first G-code into the G-code viewer.
+ // Or if no G-codes, send other files to slicer.
+ if (! gcode_files.empty())
+ this->plater()->load_gcode(gcode_files.front());
+ if (!non_gcode_files.empty())
+ start_new_slicer(non_gcode_files, true);
+ } else {
+ if (! files.empty()) {
+#if ENABLE_DRAG_AND_DROP_FIX
+ wxArrayString input_files;
+ for (size_t i = 0; i < non_gcode_files.size(); ++i) {
+ input_files.push_back(non_gcode_files[i]);
+ }
+ this->plater()->load_files(input_files);
+#else
+ this->plater()->load_files(files, true, true);
+#endif
+ }
+ for (const wxString &filename : gcode_files)
+ start_new_gcodeviewer(&filename);
+ }
}
#endif /* __APPLE */
@@ -1086,6 +2002,7 @@ wxString GUI_App::current_language_code_safe() const
{ "pl", "pl_PL", },
{ "uk", "uk_UA", },
{ "zh", "zh_CN", },
+ { "ru", "ru_RU", },
};
wxString language_code = this->current_language_code().BeforeFirst('_');
auto it = mapping.find(language_code);
@@ -1117,9 +2034,9 @@ bool GUI_App::run_wizard(ConfigWizard::RunReason reason, ConfigWizard::StartPage
if (preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA
&& Slic3r::model_has_multi_part_objects(wxGetApp().model())) {
GUI::show_info(nullptr,
- _(L("It's impossible to print multi-part object(s) with SLA technology.")) + "\n\n" +
- _(L("Please check and fix your object list.")),
- _(L("Attention!")));
+ _L("It's impossible to print multi-part object(s) with SLA technology.") + "\n\n" +
+ _L("Please check and fix your object list."),
+ _L("Attention!"));
}
}
@@ -1136,7 +2053,7 @@ void GUI_App::gcode_thumbnails_debug()
unsigned int width = 0;
unsigned int height = 0;
- wxFileDialog dialog(GetTopWindow(), _(L("Select a gcode file:")), "", "", "G-code files (*.gcode)|*.gcode;*.GCODE;", wxFD_OPEN | wxFD_FILE_MUST_EXIST);
+ wxFileDialog dialog(GetTopWindow(), _L("Select a gcode file:"), "", "", "G-code files (*.gcode)|*.gcode;*.GCODE;", wxFD_OPEN | wxFD_FILE_MUST_EXIST);
if (dialog.ShowModal() != wxID_OK)
return;
@@ -1218,7 +2135,9 @@ void GUI_App::window_pos_restore(wxTopLevelWindow* window, const std::string &na
return;
}
- window->SetSize(metrics->get_rect());
+ const wxRect& rect = metrics->get_rect();
+ window->SetPosition(rect.GetPosition());
+ window->SetSize(rect.GetSize());
window->Maximize(metrics->get_maximized());
}
@@ -1242,7 +2161,7 @@ void GUI_App::window_pos_sanitize(wxTopLevelWindow* window)
bool GUI_App::config_wizard_startup()
{
- if (!app_conf_exists || preset_bundle->printers.size() <= 1) {
+ if (!m_app_conf_exists || preset_bundle->printers.size() <= 1) {
run_wizard(ConfigWizard::RR_DATA_EMPTY);
return true;
} else if (get_app_config()->legacy_datadir()) {
@@ -1259,19 +2178,17 @@ bool GUI_App::config_wizard_startup()
}
void GUI_App::check_updates(const bool verbose)
-{
-
+{
PresetUpdater::UpdateResult updater_result;
try {
- updater_result = preset_updater->config_update(app_config->orig_version());
+ updater_result = preset_updater->config_update(app_config->orig_version(), verbose);
if (updater_result == PresetUpdater::R_INCOMPAT_EXIT) {
mainframe->Close();
}
else if (updater_result == PresetUpdater::R_INCOMPAT_CONFIGURED) {
- app_conf_exists = true;
+ m_app_conf_exists = true;
}
- else if(verbose && updater_result == PresetUpdater::R_NOOP)
- {
+ else if (verbose && updater_result == PresetUpdater::R_NOOP) {
MsgNoUpdates dlg;
dlg.ShowModal();
}
@@ -1279,9 +2196,8 @@ void GUI_App::check_updates(const bool verbose)
catch (const std::exception & ex) {
show_error(nullptr, ex.what());
}
-
-
}
+
// static method accepting a wxWindow object as first parameter
// void warning_catcher{
// my($self, $message_dialog) = @_;
@@ -1309,50 +2225,47 @@ void GUI_App::check_updates(const bool verbose)
#ifdef __WXMSW__
-void GUI_App::associate_3mf_files()
+static bool set_into_win_registry(HKEY hkeyHive, const wchar_t* pszVar, const wchar_t* pszValue)
{
// see as reference: https://stackoverflow.com/questions/20245262/c-program-needs-an-file-association
+ wchar_t szValueCurrent[1000];
+ DWORD dwType;
+ DWORD dwSize = sizeof(szValueCurrent);
- auto reg_set = [](HKEY hkeyHive, const wchar_t* pszVar, const wchar_t* pszValue)->bool
- {
- wchar_t szValueCurrent[1000];
- DWORD dwType;
- DWORD dwSize = sizeof(szValueCurrent);
+ int iRC = ::RegGetValueW(hkeyHive, pszVar, nullptr, RRF_RT_ANY, &dwType, szValueCurrent, &dwSize);
- int iRC = ::RegGetValueW(hkeyHive, pszVar, nullptr, RRF_RT_ANY, &dwType, szValueCurrent, &dwSize);
+ bool bDidntExist = iRC == ERROR_FILE_NOT_FOUND;
- bool bDidntExist = iRC == ERROR_FILE_NOT_FOUND;
+ if ((iRC != ERROR_SUCCESS) && !bDidntExist)
+ // an error occurred
+ return false;
- if ((iRC != ERROR_SUCCESS) && !bDidntExist)
- // an error occurred
+ if (!bDidntExist) {
+ if (dwType != REG_SZ)
+ // invalid type
return false;
- if (!bDidntExist)
- {
- if (dwType != REG_SZ)
- // invalid type
- return false;
-
- if (::wcscmp(szValueCurrent, pszValue) == 0)
- // value already set
- return false;
- }
+ if (::wcscmp(szValueCurrent, pszValue) == 0)
+ // value already set
+ return false;
+ }
- DWORD dwDisposition;
- HKEY hkey;
- iRC = ::RegCreateKeyExW(hkeyHive, pszVar, 0, 0, 0, KEY_ALL_ACCESS, nullptr, &hkey, &dwDisposition);
- bool ret = false;
+ DWORD dwDisposition;
+ HKEY hkey;
+ iRC = ::RegCreateKeyExW(hkeyHive, pszVar, 0, 0, 0, KEY_ALL_ACCESS, nullptr, &hkey, &dwDisposition);
+ bool ret = false;
+ if (iRC == ERROR_SUCCESS) {
+ iRC = ::RegSetValueExW(hkey, L"", 0, REG_SZ, (BYTE*)pszValue, (::wcslen(pszValue) + 1) * sizeof(wchar_t));
if (iRC == ERROR_SUCCESS)
- {
- iRC = ::RegSetValueExW(hkey, L"", 0, REG_SZ, (BYTE*)pszValue, (::wcslen(pszValue) + 1) * sizeof(wchar_t));
- if (iRC == ERROR_SUCCESS)
- ret = true;
- }
+ ret = true;
+ }
- RegCloseKey(hkey);
- return ret;
- };
+ RegCloseKey(hkey);
+ return ret;
+}
+void GUI_App::associate_3mf_files()
+{
wchar_t app_path[MAX_PATH];
::GetModuleFileNameW(nullptr, app_path, sizeof(app_path));
@@ -1366,9 +2279,59 @@ void GUI_App::associate_3mf_files()
std::wstring reg_prog_id_command = reg_prog_id + L"\\Shell\\Open\\Command";
bool is_new = false;
- is_new |= reg_set(HKEY_CURRENT_USER, reg_extension.c_str(), prog_id.c_str());
- is_new |= reg_set(HKEY_CURRENT_USER, reg_prog_id.c_str(), prog_desc.c_str());
- is_new |= reg_set(HKEY_CURRENT_USER, reg_prog_id_command.c_str(), prog_command.c_str());
+ is_new |= set_into_win_registry(HKEY_CURRENT_USER, reg_extension.c_str(), prog_id.c_str());
+ is_new |= set_into_win_registry(HKEY_CURRENT_USER, reg_prog_id.c_str(), prog_desc.c_str());
+ is_new |= set_into_win_registry(HKEY_CURRENT_USER, reg_prog_id_command.c_str(), prog_command.c_str());
+
+ if (is_new)
+ // notify Windows only when any of the values gets changed
+ ::SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nullptr, nullptr);
+}
+
+#if ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+void GUI_App::associate_stl_files()
+{
+ wchar_t app_path[MAX_PATH];
+ ::GetModuleFileNameW(nullptr, app_path, sizeof(app_path));
+
+ std::wstring prog_path = L"\"" + std::wstring(app_path) + L"\"";
+ std::wstring prog_id = L"Prusa.Slicer.1";
+ std::wstring prog_desc = L"PrusaSlicer";
+ std::wstring prog_command = prog_path + L" \"%1\"";
+ std::wstring reg_base = L"Software\\Classes";
+ std::wstring reg_extension = reg_base + L"\\.stl";
+ std::wstring reg_prog_id = reg_base + L"\\" + prog_id;
+ std::wstring reg_prog_id_command = reg_prog_id + L"\\Shell\\Open\\Command";
+
+ bool is_new = false;
+ is_new |= set_into_win_registry(HKEY_CURRENT_USER, reg_extension.c_str(), prog_id.c_str());
+ is_new |= set_into_win_registry(HKEY_CURRENT_USER, reg_prog_id.c_str(), prog_desc.c_str());
+ is_new |= set_into_win_registry(HKEY_CURRENT_USER, reg_prog_id_command.c_str(), prog_command.c_str());
+
+ if (is_new)
+ // notify Windows only when any of the values gets changed
+ ::SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nullptr, nullptr);
+}
+#endif // ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+
+void GUI_App::associate_gcode_files()
+{
+ wchar_t app_path[MAX_PATH];
+ ::GetModuleFileNameW(nullptr, app_path, sizeof(app_path));
+
+ std::wstring prog_path = L"\"" + std::wstring(app_path) + L"\"";
+ std::wstring prog_id = L"PrusaSlicer.GCodeViewer.1";
+ std::wstring prog_desc = L"PrusaSlicerGCodeViewer";
+ std::wstring prog_command = prog_path + L" \"%1\"";
+ std::wstring reg_base = L"Software\\Classes";
+ std::wstring reg_extension = reg_base + L"\\.gcode";
+ std::wstring reg_prog_id = reg_base + L"\\" + prog_id;
+ std::wstring reg_prog_id_command = reg_prog_id + L"\\Shell\\Open\\Command";
+
+ bool is_new = false;
+ is_new |= set_into_win_registry(HKEY_CURRENT_USER, reg_extension.c_str(), prog_id.c_str());
+ is_new |= set_into_win_registry(HKEY_CURRENT_USER, reg_prog_id.c_str(), prog_desc.c_str());
+ is_new |= set_into_win_registry(HKEY_CURRENT_USER, reg_prog_id_command.c_str(), prog_command.c_str());
if (is_new)
// notify Windows only when any of the values gets changed
diff --git a/src/slic3r/GUI/GUI_App.hpp b/src/slic3r/GUI/GUI_App.hpp
index d02a60ba9..8aceb7a69 100644
--- a/src/slic3r/GUI/GUI_App.hpp
+++ b/src/slic3r/GUI/GUI_App.hpp
@@ -3,15 +3,16 @@
#include <memory>
#include <string>
-#include "libslic3r/PrintConfig.hpp"
-#include "MainFrame.hpp"
#include "ImGuiWrapper.hpp"
#include "ConfigWizard.hpp"
+#include "OpenGLManager.hpp"
+#include "libslic3r/Preset.hpp"
#include <wx/app.h>
#include <wx/colour.h>
#include <wx/font.h>
#include <wx/string.h>
+#include <wx/snglinst.h>
#include <mutex>
#include <stack>
@@ -23,15 +24,29 @@ class wxNotebook;
struct wxLanguageInfo;
namespace Slic3r {
+
class AppConfig;
class PresetBundle;
class PresetUpdater;
class ModelObject;
class PrintHostJobQueue;
-
+class Model;
namespace GUI{
+
class RemovableDriveManager;
+class OtherInstanceMessageHandler;
+class MainFrame;
+class Sidebar;
+class ObjectManipulation;
+class ObjectSettings;
+class ObjectList;
+class ObjectLayers;
+class Plater;
+struct GUI_InitParams;
+
+
+
enum FileType
{
FT_STL,
@@ -74,10 +89,29 @@ class ConfigWizard;
static wxString dots("…", wxConvUTF8);
+// Does our wxWidgets version support markup?
+// https://github.com/prusa3d/PrusaSlicer/issues/4282#issuecomment-634676371
+#if wxUSE_MARKUP && wxCHECK_VERSION(3, 1, 1)
+ #define SUPPORTS_MARKUP
+#endif
+
class GUI_App : public wxApp
{
+public:
+ enum class EAppMode : unsigned char
+ {
+ Editor,
+ GCodeViewer
+ };
+
+private:
bool m_initialized { false };
- bool app_conf_exists{ false };
+ bool m_app_conf_exists{ false };
+ EAppMode m_app_mode{ EAppMode::Editor };
+ bool m_is_recreating_gui{ false };
+#ifdef __linux__
+ bool m_opengl_initialized{ false };
+#endif
wxColour m_color_label_modified;
wxColour m_color_label_sys;
@@ -86,8 +120,9 @@ class GUI_App : public wxApp
wxFont m_small_font;
wxFont m_bold_font;
wxFont m_normal_font;
+ wxFont m_code_font;
- int m_em_unit; // width of a "m"-symbol in pixels for current system font
+ int m_em_unit; // width of a "m"-symbol in pixels for current system font
// Note: for 100% Scale m_em_unit = 10 -> it's a good enough coefficient for a size setting of controls
std::unique_ptr<wxLocale> m_wxLocale;
@@ -96,19 +131,38 @@ class GUI_App : public wxApp
// Best translation language, provided by Windows or OSX, owned by wxWidgets.
const wxLanguageInfo *m_language_info_best = nullptr;
- std::unique_ptr<RemovableDriveManager> m_removable_drive_manager;
+ OpenGLManager m_opengl_mgr;
+
+ std::unique_ptr<RemovableDriveManager> m_removable_drive_manager;
std::unique_ptr<ImGuiWrapper> m_imgui;
std::unique_ptr<PrintHostJobQueue> m_printhost_job_queue;
ConfigWizard* m_wizard; // Managed by wxWindow tree
+ std::unique_ptr <OtherInstanceMessageHandler> m_other_instance_message_handler;
+ std::unique_ptr <wxSingleInstanceChecker> m_single_instance_checker;
+ std::string m_instance_hash_string;
+ size_t m_instance_hash_int;
public:
bool OnInit() override;
bool initialized() const { return m_initialized; }
- GUI_App();
+ explicit GUI_App(EAppMode mode = EAppMode::Editor);
~GUI_App() override;
+ EAppMode get_app_mode() const { return m_app_mode; }
+ bool is_editor() const { return m_app_mode == EAppMode::Editor; }
+ bool is_gcode_viewer() const { return m_app_mode == EAppMode::GCodeViewer; }
+ bool is_recreating_gui() const { return m_is_recreating_gui; }
+
+ // To be called after the GUI is fully built up.
+ // Process command line parameters cached in this->init_params,
+ // load configs, STLs etc.
+ void post_init();
+ static std::string get_gl_info(bool format_as_html, bool extensions);
+ wxGLContext* init_glcontext(wxGLCanvas& canvas);
+ bool init_opengl();
+
static unsigned get_colour_approx_luma(const wxColour &colour);
static bool dark_mode();
void init_label_colours();
@@ -125,18 +179,24 @@ public:
const wxFont& small_font() { return m_small_font; }
const wxFont& bold_font() { return m_bold_font; }
const wxFont& normal_font() { return m_normal_font; }
+ const wxFont& code_font() { return m_code_font; }
int em_unit() const { return m_em_unit; }
+ wxSize get_min_size() const;
float toolbar_icon_scale(const bool is_limited = false) const;
+ void set_auto_toolbar_icon_scale(float scale) const;
+ void check_printer_presets();
- void recreate_GUI();
+ void recreate_GUI(const wxString& message);
void system_info();
void keyboard_shortcuts();
void load_project(wxWindow *parent, wxString& input_file) const;
void import_model(wxWindow *parent, wxArrayString& input_files) const;
+ void load_gcode(wxWindow* parent, wxString& input_file) const;
+
static bool catch_error(std::function<void()> cb, const std::string& err);
void persist_window_geometry(wxTopLevelWindow *window, bool default_maximized = false);
- void update_ui_from_settings();
+ void update_ui_from_settings(bool apply_free_camera_correction = true);
bool switch_language();
bool load_language(wxString language, bool initial);
@@ -148,16 +208,19 @@ public:
void add_config_menu(wxMenuBar *menu);
bool check_unsaved_changes(const wxString &header = wxString());
+ bool check_print_host_queue();
bool checked_tab(Tab* tab);
- void load_current_presets();
+ void load_current_presets(bool check_printer_presets = true);
wxString current_language_code() const { return m_wxLocale->GetCanonicalName(); }
// Translate the language code to a code, for which Prusa Research maintains translations. Defaults to "en_US".
wxString current_language_code_safe() const;
+ bool is_localized() const { return m_wxLocale->GetLocale() != "English"; }
virtual bool OnExceptionInMainLoop() override;
#ifdef __APPLE__
+ void OSXStoreOpenFiles(const wxArrayString &files) override;
// wxWidgets override to get an event on open files.
void MacOpenFiles(const wxArrayString &fileNames) override;
#endif /* __APPLE */
@@ -170,12 +233,18 @@ public:
Plater* plater();
Model& model();
+
+ // Parameters extracted from the command line to be passed to GUI after initialization.
+ const GUI_InitParams* init_params { nullptr };
+
AppConfig* app_config{ nullptr };
PresetBundle* preset_bundle{ nullptr };
PresetUpdater* preset_updater{ nullptr };
MainFrame* mainframe{ nullptr };
Plater* plater_{ nullptr };
+ PresetUpdater* get_preset_updater() { return preset_updater; }
+
wxNotebook* tab_panel() const ;
int extruders_cnt() const;
int extruders_edited_cnt() const;
@@ -183,6 +252,13 @@ public:
std::vector<Tab *> tabs_list;
RemovableDriveManager* removable_drive_manager() { return m_removable_drive_manager.get(); }
+ OtherInstanceMessageHandler* other_instance_message_handler() { return m_other_instance_message_handler.get(); }
+ wxSingleInstanceChecker* single_instance_checker() {return m_single_instance_checker.get();}
+
+ void init_single_instance_checker(const std::string &name, const std::string &path);
+ void set_instance_hash (const size_t hash) { m_instance_hash_int = hash; m_instance_hash_string = std::to_string(hash); }
+ std::string get_instance_hash_string () { return m_instance_hash_string; }
+ size_t get_instance_hash_int () { return m_instance_hash_int; }
ImGuiWrapper* imgui() { return m_imgui.get(); }
@@ -196,8 +272,23 @@ public:
void gcode_thumbnails_debug();
#endif // ENABLE_THUMBNAIL_GENERATOR_DEBUG
+ GLShaderProgram* get_shader(const std::string& shader_name) { return m_opengl_mgr.get_shader(shader_name); }
+ GLShaderProgram* get_current_shader() { return m_opengl_mgr.get_current_shader(); }
+
+ bool is_gl_version_greater_or_equal_to(unsigned int major, unsigned int minor) const { return m_opengl_mgr.get_gl_info().is_version_greater_or_equal_to(major, minor); }
+ bool is_glsl_version_greater_or_equal_to(unsigned int major, unsigned int minor) const { return m_opengl_mgr.get_gl_info().is_glsl_version_greater_or_equal_to(major, minor); }
+
+#if ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+#ifdef __WXMSW__
+ void associate_3mf_files();
+ void associate_stl_files();
+ void associate_gcode_files();
+#endif // __WXMSW__
+#endif // ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+
private:
bool on_init_inner();
+ void init_app_config();
void window_pos_save(wxTopLevelWindow* window, const std::string &name);
void window_pos_restore(wxTopLevelWindow* window, const std::string &name, bool default_maximized = false);
void window_pos_sanitize(wxTopLevelWindow* window);
@@ -206,13 +297,17 @@ private:
bool config_wizard_startup();
void check_updates(const bool verbose);
+#if !ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
#ifdef __WXMSW__
void associate_3mf_files();
+ void associate_gcode_files();
#endif // __WXMSW__
+#endif // !ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
};
+
DECLARE_APP(GUI_App)
} // GUI
-} //Slic3r
+} // Slic3r
#endif // slic3r_GUI_App_hpp_
diff --git a/src/slic3r/GUI/GUI_Init.cpp b/src/slic3r/GUI/GUI_Init.cpp
new file mode 100644
index 000000000..839782741
--- /dev/null
+++ b/src/slic3r/GUI/GUI_Init.cpp
@@ -0,0 +1,99 @@
+#include "GUI_Init.hpp"
+
+#include "libslic3r/AppConfig.hpp"
+
+#include "slic3r/GUI/GUI.hpp"
+#include "slic3r/GUI/GUI_App.hpp"
+#include "slic3r/GUI/3DScene.hpp"
+#include "slic3r/GUI/InstanceCheck.hpp"
+#include "slic3r/GUI/format.hpp"
+#include "slic3r/GUI/MainFrame.hpp"
+#include "slic3r/GUI/Plater.hpp"
+
+// To show a message box if GUI initialization ends up with an exception thrown.
+#include <wx/msgdlg.h>
+
+#include <boost/nowide/iostream.hpp>
+#include <boost/nowide/convert.hpp>
+
+#if __APPLE__
+ #include <signal.h>
+#endif // __APPLE__
+
+namespace Slic3r {
+namespace GUI {
+
+int GUI_Run(GUI_InitParams &params)
+{
+#if __APPLE__
+ // On OSX, we use boost::process::spawn() to launch new instances of PrusaSlicer from another PrusaSlicer.
+ // boost::process::spawn() sets SIGCHLD to SIGIGN for the child process, thus if a child PrusaSlicer spawns another
+ // subprocess and the subrocess dies, the child PrusaSlicer will not receive information on end of subprocess
+ // (posix waitpid() call will always fail).
+ // https://jmmv.dev/2008/10/boostprocess-and-sigchld.html
+ // The child instance of PrusaSlicer has to reset SIGCHLD to its default, so that posix waitpid() and similar continue to work.
+ // See GH issue #5507
+ signal(SIGCHLD, SIG_DFL);
+#endif // __APPLE__
+
+ try {
+ GUI::GUI_App* gui = new GUI::GUI_App(params.start_as_gcodeviewer ? GUI::GUI_App::EAppMode::GCodeViewer : GUI::GUI_App::EAppMode::Editor);
+ if (gui->get_app_mode() != GUI::GUI_App::EAppMode::GCodeViewer) {
+ // G-code viewer is currently not performing instance check, a new G-code viewer is started every time.
+ bool gui_single_instance_setting = gui->app_config->get("single_instance") == "1";
+ if (Slic3r::instance_check(params.argc, params.argv, gui_single_instance_setting)) {
+ //TODO: do we have delete gui and other stuff?
+ return -1;
+ }
+ }
+
+// gui->autosave = m_config.opt_string("autosave");
+ GUI::GUI_App::SetInstance(gui);
+ gui->init_params = &params;
+/*
+ gui->CallAfter([gui, this, &load_configs, params.start_as_gcodeviewer] {
+ if (!gui->initialized()) {
+ return;
+ }
+
+ if (params.start_as_gcodeviewer) {
+ if (!m_input_files.empty())
+ gui->plater()->load_gcode(wxString::FromUTF8(m_input_files[0].c_str()));
+ } else {
+#if 0
+ // Load the cummulative config over the currently active profiles.
+ //FIXME if multiple configs are loaded, only the last one will have an effect.
+ // We need to decide what to do about loading of separate presets (just print preset, just filament preset etc).
+ // As of now only the full configs are supported here.
+ if (!m_print_config.empty())
+ gui->mainframe->load_config(m_print_config);
+#endif
+ if (!load_configs.empty())
+ // Load the last config to give it a name at the UI. The name of the preset may be later
+ // changed by loading an AMF or 3MF.
+ //FIXME this is not strictly correct, as one may pass a print/filament/printer profile here instead of a full config.
+ gui->mainframe->load_config_file(load_configs.back());
+ // If loading a 3MF file, the config is loaded from the last one.
+ if (!m_input_files.empty())
+ gui->plater()->load_files(m_input_files, true, true);
+ if (!m_extra_config.empty())
+ gui->mainframe->load_config(m_extra_config);
+ }
+ });
+*/
+ int result = wxEntry(params.argc, params.argv);
+ return result;
+ } catch (const Slic3r::Exception &ex) {
+ boost::nowide::cerr << ex.what() << std::endl;
+ wxMessageBox(boost::nowide::widen(ex.what()), _L("PrusaSlicer GUI initialization failed"), wxICON_STOP);
+ } catch (const std::exception &ex) {
+ boost::nowide::cerr << "PrusaSlicer GUI initialization failed: " << ex.what() << std::endl;
+ wxMessageBox(format_wxstr(_L("Fatal error, exception catched: %1%"), ex.what()), _L("PrusaSlicer GUI initialization failed"), wxICON_STOP);
+ }
+
+ // error
+ return 1;
+}
+
+}
+}
diff --git a/src/slic3r/GUI/GUI_Init.hpp b/src/slic3r/GUI/GUI_Init.hpp
new file mode 100644
index 000000000..c420c9554
--- /dev/null
+++ b/src/slic3r/GUI/GUI_Init.hpp
@@ -0,0 +1,27 @@
+#ifndef slic3r_GUI_Init_hpp_
+#define slic3r_GUI_Init_hpp_
+
+#include <libslic3r/PrintConfig.hpp>
+
+namespace Slic3r {
+
+namespace GUI {
+
+struct GUI_InitParams
+{
+ int argc;
+ char **argv;
+
+ std::vector<std::string> load_configs;
+ DynamicPrintConfig extra_config;
+ std::vector<std::string> input_files;
+
+ bool start_as_gcodeviewer;
+};
+
+int GUI_Run(GUI_InitParams &params);
+
+} // namespace GUI
+} // namespace Slic3r
+
+#endif // slic3r_GUI_Init_hpp_
diff --git a/src/slic3r/GUI/GUI_ObjectLayers.cpp b/src/slic3r/GUI/GUI_ObjectLayers.cpp
index 157e45ab4..7d8643c7f 100644
--- a/src/slic3r/GUI/GUI_ObjectLayers.cpp
+++ b/src/slic3r/GUI/GUI_ObjectLayers.cpp
@@ -2,9 +2,11 @@
#include "GUI_ObjectList.hpp"
#include "OptionsGroup.hpp"
-#include "PresetBundle.hpp"
+#include "GUI_App.hpp"
+#include "libslic3r/PresetBundle.hpp"
#include "libslic3r/Model.hpp"
#include "GLCanvas3D.hpp"
+#include "Plater.hpp"
#include <boost/algorithm/string.hpp>
@@ -32,6 +34,7 @@ ObjectLayers::ObjectLayers(wxWindow* parent) :
m_grid_sizer->Add(temp);
}
+ m_og->activate();
m_og->sizer->Clear(true);
m_og->sizer->Add(m_grid_sizer, 0, wxEXPAND | wxALL, wxOSX ? 0 : 5);
@@ -151,7 +154,7 @@ wxSizer* ObjectLayers::create_layer(const t_layer_height_range& range, PlusMinus
void ObjectLayers::create_layers_list()
{
- for (const auto layer : m_object->layer_config_ranges)
+ for (const auto &layer : m_object->layer_config_ranges)
{
const t_layer_height_range& range = layer.first;
auto del_btn = new PlusMinusButton(m_parent, m_bmp_delete, range);
@@ -272,6 +275,33 @@ void ObjectLayers::msw_rescale()
m_grid_sizer->Layout();
}
+void ObjectLayers::sys_color_changed()
+{
+ m_bmp_delete.msw_rescale();
+ m_bmp_add.msw_rescale();
+
+ m_grid_sizer->SetHGap(wxGetApp().em_unit());
+
+ // rescale edit-boxes
+ const int cells_cnt = m_grid_sizer->GetCols() * m_grid_sizer->GetEffectiveRowsCount();
+ for (int i = 0; i < cells_cnt; i++)
+ {
+ const wxSizerItem* item = m_grid_sizer->GetItem(i);
+ if (item->IsSizer()) {// case when we have editor with buttons
+ const std::vector<size_t> btns = {2, 3}; // del_btn, add_btn
+ for (auto btn : btns) {
+ wxSizerItem* b_item = item->GetSizer()->GetItem(btn);
+ if (b_item->IsWindow()) {
+ auto button = dynamic_cast<PlusMinusButton*>(b_item->GetWindow());
+ if (button != nullptr)
+ button->msw_rescale();
+ }
+ }
+ }
+ }
+ m_grid_sizer->Layout();
+}
+
void ObjectLayers::reset_selection()
{
m_selectable_range = { 0.0, 0.0 };
diff --git a/src/slic3r/GUI/GUI_ObjectLayers.hpp b/src/slic3r/GUI/GUI_ObjectLayers.hpp
index 08b594910..736b5844d 100644
--- a/src/slic3r/GUI/GUI_ObjectLayers.hpp
+++ b/src/slic3r/GUI/GUI_ObjectLayers.hpp
@@ -94,6 +94,7 @@ public:
void UpdateAndShow(const bool show) override;
void msw_rescale();
+ void sys_color_changed();
void reset_selection();
void set_selectable_range(const t_layer_height_range& range) { m_selectable_range = range; }
diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp
index 1dcfae3bc..3d08b26f1 100644
--- a/src/slic3r/GUI/GUI_ObjectList.cpp
+++ b/src/slic3r/GUI/GUI_ObjectList.cpp
@@ -1,16 +1,16 @@
#include "libslic3r/libslic3r.h"
+#include "libslic3r/PresetBundle.hpp"
#include "GUI_ObjectList.hpp"
#include "GUI_ObjectManipulation.hpp"
#include "GUI_ObjectLayers.hpp"
#include "GUI_App.hpp"
#include "I18N.hpp"
+#include "Plater.hpp"
#include "OptionsGroup.hpp"
-#include "PresetBundle.hpp"
#include "Tab.hpp"
#include "wxExtensions.hpp"
#include "libslic3r/Model.hpp"
-#include "LambdaObjectDialog.hpp"
#include "GLCanvas3D.hpp"
#include "Selection.hpp"
@@ -88,12 +88,10 @@ ObjectList::ObjectList(wxWindow* parent) :
{
// Fill CATEGORY_ICON
{
- // Note: `this` isn't passed to create_scaled_bitmap() here because of bugs in the widget,
- // see note in PresetBundle::load_compatible_bitmaps()
-
// ptFFF
CATEGORY_ICON[L("Layers and Perimeters")] = create_scaled_bitmap("layers");
CATEGORY_ICON[L("Infill")] = create_scaled_bitmap("infill");
+ CATEGORY_ICON[L("Ironing")] = create_scaled_bitmap("ironing");
CATEGORY_ICON[L("Support material")] = create_scaled_bitmap("support");
CATEGORY_ICON[L("Speed")] = create_scaled_bitmap("time");
CATEGORY_ICON[L("Extruders")] = create_scaled_bitmap("funnel");
@@ -193,7 +191,7 @@ ObjectList::ObjectList(wxWindow* parent) :
// Bind(wxEVT_KEY_DOWN, &ObjectList::OnChar, this);
{
// Accelerators
- wxAcceleratorEntry entries[8];
+ wxAcceleratorEntry entries[10];
entries[0].Set(wxACCEL_CTRL, (int) 'C', wxID_COPY);
entries[1].Set(wxACCEL_CTRL, (int) 'X', wxID_CUT);
entries[2].Set(wxACCEL_CTRL, (int) 'V', wxID_PASTE);
@@ -202,7 +200,9 @@ ObjectList::ObjectList(wxWindow* parent) :
entries[5].Set(wxACCEL_CTRL, (int) 'Y', wxID_REDO);
entries[6].Set(wxACCEL_NORMAL, WXK_DELETE, wxID_DELETE);
entries[7].Set(wxACCEL_NORMAL, WXK_BACK, wxID_DELETE);
- wxAcceleratorTable accel(8, entries);
+ entries[8].Set(wxACCEL_NORMAL, int('+'), wxID_ADD);
+ entries[9].Set(wxACCEL_NORMAL, int('-'), wxID_REMOVE);
+ wxAcceleratorTable accel(10, entries);
SetAcceleratorTable(accel);
this->Bind(wxEVT_MENU, [this](wxCommandEvent &evt) { this->copy(); }, wxID_COPY);
@@ -211,6 +211,8 @@ ObjectList::ObjectList(wxWindow* parent) :
this->Bind(wxEVT_MENU, [this](wxCommandEvent &evt) { this->remove(); }, wxID_DELETE);
this->Bind(wxEVT_MENU, [this](wxCommandEvent &evt) { this->undo(); }, wxID_UNDO);
this->Bind(wxEVT_MENU, [this](wxCommandEvent &evt) { this->redo(); }, wxID_REDO);
+ this->Bind(wxEVT_MENU, [this](wxCommandEvent &evt) { this->increase_instances(); }, wxID_ADD);
+ this->Bind(wxEVT_MENU, [this](wxCommandEvent &evt) { this->decrease_instances(); }, wxID_REMOVE);
}
#else //__WXOSX__
Bind(wxEVT_CHAR, [this](wxKeyEvent& event) { key_event(event); }); // doesn't work on OSX
@@ -256,11 +258,23 @@ ObjectList::~ObjectList()
{
}
+void ObjectList::set_min_height()
+{
+ /* Temporary workaround for the correct behavior of the Scrolled sidebar panel:
+ * change min hight of object list to the normal min value (20 * wxGetApp().em_unit())
+ * after first whole Mainframe updating/layouting
+ */
+ const int list_min_height = 20 * wxGetApp().em_unit();
+ if (this->GetMinSize().GetY() > list_min_height)
+ this->SetMinSize(wxSize(-1, list_min_height));
+}
+
+
void ObjectList::create_objects_ctrl()
{
/* Temporary workaround for the correct behavior of the Scrolled sidebar panel:
* 1. set a height of the list to some big value
- * 2. change it to the normal min value (15 * wxGetApp().em_unit()) after first whole Mainframe updating/layouting
+ * 2. change it to the normal min value (20 * wxGetApp().em_unit()) after first whole Mainframe updating/layouting
*/
SetMinSize(wxSize(-1, 3000));
@@ -279,7 +293,11 @@ void ObjectList::create_objects_ctrl()
// column ItemName(Icon+Text) of the view control:
// And Icon can be consisting of several bitmaps
- AppendColumn(new wxDataViewColumn(_(L("Name")), new BitmapTextRenderer(this),
+ BitmapTextRenderer* bmp_text_renderer = new BitmapTextRenderer();
+ bmp_text_renderer->set_can_create_editor_ctrl_function([this]() {
+ return m_objects_model->GetItemType(GetSelection()) & (itVolume | itObject);
+ });
+ AppendColumn(new wxDataViewColumn(_L("Name"), bmp_text_renderer,
colName, 20*em, wxALIGN_LEFT, wxDATAVIEW_COL_RESIZABLE));
// column PrintableProperty (Icon) of the view control:
@@ -287,11 +305,15 @@ void ObjectList::create_objects_ctrl()
wxALIGN_CENTER_HORIZONTAL, wxDATAVIEW_COL_RESIZABLE);
// column Extruder of the view control:
- AppendColumn(new wxDataViewColumn(_(L("Extruder")), new BitmapChoiceRenderer(),
+ BitmapChoiceRenderer* bmp_choice_renderer = new BitmapChoiceRenderer();
+ bmp_choice_renderer->set_can_create_editor_ctrl_function([this]() {
+ return m_objects_model->GetItemType(GetSelection()) & (itVolume | itLayer | itObject);
+ });
+ AppendColumn(new wxDataViewColumn(_L("Extruder"), bmp_choice_renderer,
colExtruder, 8*em, wxALIGN_CENTER_HORIZONTAL, wxDATAVIEW_COL_RESIZABLE));
// column ItemEditing of the view control:
- AppendBitmapColumn(_(L("Editing")), colEditing, wxDATAVIEW_CELL_INERT, 3*em,
+ AppendBitmapColumn(_L("Editing"), colEditing, wxDATAVIEW_CELL_INERT, 3*em,
wxALIGN_CENTER_HORIZONTAL, wxDATAVIEW_COL_RESIZABLE);
// For some reason under OSX on 4K(5K) monitors in wxDataViewColumn constructor doesn't set width of column.
@@ -333,6 +355,34 @@ void ObjectList::get_selected_item_indexes(int& obj_idx, int& vol_idx, const wxD
vol_idx = type & itVolume ? m_objects_model->GetVolumeIdByItem(item) : -1;
}
+void ObjectList::get_selection_indexes(std::vector<int>& obj_idxs, std::vector<int>& vol_idxs)
+{
+ wxDataViewItemArray sels;
+ GetSelections(sels);
+ assert(!sels.IsEmpty());
+
+ if (m_objects_model->GetItemType(sels[0]) & itVolume) {
+ for (wxDataViewItem item : sels) {
+ obj_idxs.emplace_back(m_objects_model->GetIdByItem(m_objects_model->GetTopParent(item)));
+
+ assert(m_objects_model->GetItemType(item) & itVolume);
+ vol_idxs.emplace_back(m_objects_model->GetVolumeIdByItem(item));
+ }
+ }
+ else {
+ for (wxDataViewItem item : sels) {
+ const ItemType type = m_objects_model->GetItemType(item);
+ assert(type & (itObject | itInstance | itInstanceRoot));
+
+ obj_idxs.emplace_back(type & itObject ? m_objects_model->GetIdByItem(item) :
+ m_objects_model->GetIdByItem(m_objects_model->GetTopParent(item)));
+ }
+ }
+
+ std::sort(obj_idxs.begin(), obj_idxs.end(), std::greater<int>());
+ obj_idxs.erase(std::unique(obj_idxs.begin(), obj_idxs.end()), obj_idxs.end());
+}
+
int ObjectList::get_mesh_errors_count(const int obj_idx, const int vol_idx /*= -1*/) const
{
if (obj_idx < 0)
@@ -434,7 +484,7 @@ int ObjectList::get_selected_obj_idx() const
return -1;
}
-DynamicPrintConfig& ObjectList::get_item_config(const wxDataViewItem& item) const
+ModelConfig& ObjectList::get_item_config(const wxDataViewItem& item) const
{
assert(item);
const ItemType type = m_objects_model->GetItemType(item);
@@ -458,10 +508,10 @@ void ObjectList::update_extruder_values_for_items(const size_t max_extruder)
auto object = (*m_objects)[i];
wxString extruder;
if (!object->config.has("extruder") ||
- size_t(object->config.option<ConfigOptionInt>("extruder")->value) > max_extruder)
+ size_t(object->config.extruder()) > max_extruder)
extruder = _(L("default"));
else
- extruder = wxString::Format("%d", object->config.option<ConfigOptionInt>("extruder")->value);
+ extruder = wxString::Format("%d", object->config.extruder());
m_objects_model->SetExtruder(extruder, item);
@@ -470,10 +520,10 @@ void ObjectList::update_extruder_values_for_items(const size_t max_extruder)
item = m_objects_model->GetItemByVolumeId(i, id);
if (!item) continue;
if (!object->volumes[id]->config.has("extruder") ||
- size_t(object->volumes[id]->config.option<ConfigOptionInt>("extruder")->value) > max_extruder)
+ size_t(object->volumes[id]->config.extruder()) > max_extruder)
extruder = _(L("default"));
else
- extruder = wxString::Format("%d", object->volumes[id]->config.option<ConfigOptionInt>("extruder")->value);
+ extruder = wxString::Format("%d", object->volumes[id]->config.extruder());
m_objects_model->SetExtruder(extruder, item);
}
@@ -483,7 +533,6 @@ void ObjectList::update_extruder_values_for_items(const size_t max_extruder)
void ObjectList::update_objects_list_extruder_column(size_t extruders_count)
{
- if (!this) return; // #ys_FIXME
if (printer_technology() == ptSLA)
extruders_count = 1;
@@ -617,6 +666,7 @@ void ObjectList::msw_rescale_icons()
// ptFFF
CATEGORY_ICON[L("Layers and Perimeters")] = create_scaled_bitmap("layers");
CATEGORY_ICON[L("Infill")] = create_scaled_bitmap("infill");
+ CATEGORY_ICON[L("Ironing")] = create_scaled_bitmap("ironing");
CATEGORY_ICON[L("Support material")] = create_scaled_bitmap("support");
CATEGORY_ICON[L("Speed")] = create_scaled_bitmap("time");
CATEGORY_ICON[L("Extruders")] = create_scaled_bitmap("funnel");
@@ -668,33 +718,41 @@ void ObjectList::selection_changed()
part_selection_changed();
}
-void ObjectList::fill_layer_config_ranges_cache()
+void ObjectList::copy_layers_to_clipboard()
{
wxDataViewItemArray sel_layers;
GetSelections(sel_layers);
- const int obj_idx = m_objects_model->GetObjectIdByItem(sel_layers[0]);
+ const int obj_idx = m_objects_model->GetObjectIdByItem(sel_layers.front());
if (obj_idx < 0 || (int)m_objects->size() <= obj_idx)
return;
const t_layer_config_ranges& ranges = object(obj_idx)->layer_config_ranges;
- m_layer_config_ranges_cache.clear();
+ t_layer_config_ranges& cache_ranges = m_clipboard.get_ranges_cache();
+
+ if (sel_layers.Count() == 1 && m_objects_model->GetItemType(sel_layers.front()) & itLayerRoot)
+ {
+ cache_ranges.clear();
+ cache_ranges = ranges;
+ return;
+ }
for (const auto layer_item : sel_layers)
if (m_objects_model->GetItemType(layer_item) & itLayer) {
auto range = m_objects_model->GetLayerRangeByItem(layer_item);
auto it = ranges.find(range);
if (it != ranges.end())
- m_layer_config_ranges_cache[it->first] = it->second;
+ cache_ranges[it->first] = it->second;
}
}
void ObjectList::paste_layers_into_list()
{
const int obj_idx = m_objects_model->GetObjectIdByItem(GetSelection());
+ t_layer_config_ranges& cache_ranges = m_clipboard.get_ranges_cache();
if (obj_idx < 0 || (int)m_objects->size() <= obj_idx ||
- m_layer_config_ranges_cache.empty() || printer_technology() == ptSLA)
+ cache_ranges.empty() || printer_technology() == ptSLA)
return;
const wxDataViewItem object_item = m_objects_model->GetItemById(obj_idx);
@@ -705,7 +763,7 @@ void ObjectList::paste_layers_into_list()
t_layer_config_ranges& ranges = object(obj_idx)->layer_config_ranges;
// and create Layer item(s) according to the layer_config_ranges
- for (const auto range : m_layer_config_ranges_cache)
+ for (const auto range : cache_ranges)
ranges.emplace(range);
layers_item = add_layer_root_item(object_item);
@@ -718,6 +776,47 @@ void ObjectList::paste_layers_into_list()
#endif //no __WXOSX__
}
+void ObjectList::copy_settings_to_clipboard()
+{
+ wxDataViewItem item = GetSelection();
+ assert(item.IsOk());
+ if (m_objects_model->GetItemType(item) & itSettings)
+ item = m_objects_model->GetParent(item);
+
+ m_clipboard.get_config_cache() = get_item_config(item).get();
+}
+
+void ObjectList::paste_settings_into_list()
+{
+ wxDataViewItem item = GetSelection();
+ assert(item.IsOk());
+ if (m_objects_model->GetItemType(item) & itSettings)
+ item = m_objects_model->GetParent(item);
+
+ ItemType item_type = m_objects_model->GetItemType(item);
+ if(!(item_type & (itObject | itVolume |itLayer)))
+ return;
+
+ DynamicPrintConfig& config_cache = m_clipboard.get_config_cache();
+ assert(!config_cache.empty());
+
+ auto keys = config_cache.keys();
+ auto part_options = get_options(true);
+
+ for (const std::string& opt_key: keys) {
+ if (item_type & (itVolume | itLayer) &&
+ std::find(part_options.begin(), part_options.end(), opt_key) == part_options.end())
+ continue; // we can't to add object specific options for the part's(itVolume | itLayer) config
+
+ const ConfigOption* option = config_cache.option(opt_key);
+ if (option)
+ m_config->set_key_value(opt_key, option->clone());
+ }
+
+ // Add settings item for object/sub-object and show them
+ show_settings(add_settings_item(item, &m_config->get()));
+}
+
void ObjectList::paste_volumes_into_list(int obj_idx, const ModelVolumePtrs& volumes)
{
if ((obj_idx < 0) || ((int)m_objects->size() <= obj_idx))
@@ -734,8 +833,8 @@ void ObjectList::paste_volumes_into_list(int obj_idx, const ModelVolumePtrs& vol
{
const wxDataViewItem& vol_item = m_objects_model->AddVolumeChild(object_item, wxString::FromUTF8(volume->name.c_str()), volume->type(),
volume->get_mesh_errors_count()>0 ,
- volume->config.has("extruder") ? volume->config.option<ConfigOptionInt>("extruder")->value : 0);
- add_settings_item(vol_item, &volume->config);
+ volume->config.has("extruder") ? volume->config.extruder() : 0);
+ add_settings_item(vol_item, &volume->config.get());
items.Add(vol_item);
}
@@ -906,6 +1005,8 @@ void ObjectList::show_context_menu(const bool evt_context_menu)
m_objects_model->GetParent(item) != wxDataViewItem(nullptr) ? &m_menu_part :
printer_technology() == ptFFF ? &m_menu_object : &m_menu_sla_object;
+ if (type & (itObject | itVolume))
+ append_menu_item_convert_unit(menu);
if (!(type & itInstance))
append_menu_item_settings(menu);
}
@@ -957,20 +1058,48 @@ void ObjectList::extruder_editing()
void ObjectList::copy()
{
- // if (m_selection_mode & smLayer)
- // fill_layer_config_ranges_cache();
- // else {
- // m_layer_config_ranges_cache.clear();
- wxPostEvent((wxEvtHandler*)wxGetApp().plater()->canvas3D()->get_wxglcanvas(), SimpleEvent(EVT_GLTOOLBAR_COPY));
- // }
+ wxPostEvent((wxEvtHandler*)wxGetApp().plater()->canvas3D()->get_wxglcanvas(), SimpleEvent(EVT_GLTOOLBAR_COPY));
}
void ObjectList::paste()
{
- // if (!m_layer_config_ranges_cache.empty())
- // paste_layers_into_list();
- // else
- wxPostEvent((wxEvtHandler*)wxGetApp().plater()->canvas3D()->get_wxglcanvas(), SimpleEvent(EVT_GLTOOLBAR_PASTE));
+ wxPostEvent((wxEvtHandler*)wxGetApp().plater()->canvas3D()->get_wxglcanvas(), SimpleEvent(EVT_GLTOOLBAR_PASTE));
+}
+
+bool ObjectList::copy_to_clipboard()
+{
+ wxDataViewItemArray sels;
+ GetSelections(sels);
+ if (sels.IsEmpty())
+ return false;
+ ItemType type = m_objects_model->GetItemType(sels.front());
+ if (!(type & (itSettings | itLayer | itLayerRoot))) {
+ m_clipboard.reset();
+ return false;
+ }
+
+ if (type & itSettings)
+ copy_settings_to_clipboard();
+ if (type & (itLayer | itLayerRoot))
+ copy_layers_to_clipboard();
+
+ m_clipboard.set_type(type);
+ return true;
+}
+
+bool ObjectList::paste_from_clipboard()
+{
+ if (!(m_clipboard.get_type() & (itSettings | itLayer | itLayerRoot))) {
+ m_clipboard.reset();
+ return false;
+ }
+
+ if (m_clipboard.get_type() & itSettings)
+ paste_settings_into_list();
+ if (m_clipboard.get_type() & (itLayer | itLayerRoot))
+ paste_layers_into_list();
+
+ return true;
}
void ObjectList::undo()
@@ -983,6 +1112,16 @@ void ObjectList::redo()
wxGetApp().plater()->redo();
}
+void ObjectList::increase_instances()
+{
+ wxGetApp().plater()->increase_instances(1);
+}
+
+void ObjectList::decrease_instances()
+{
+ wxGetApp().plater()->decrease_instances(1);
+}
+
#ifndef __WXOSX__
void ObjectList::key_event(wxKeyEvent& event)
{
@@ -1007,6 +1146,10 @@ void ObjectList::key_event(wxKeyEvent& event)
redo();
else if (wxGetKeyState(wxKeyCode('Z')) && wxGetKeyState(WXK_CONTROL))
undo();
+ else if (event.GetUnicodeKey() == '+')
+ increase_instances();
+ else if (event.GetUnicodeKey() == '-')
+ decrease_instances();
else
event.Skip();
}
@@ -1054,7 +1197,7 @@ void ObjectList::OnBeginDrag(wxDataViewEvent &event)
**/
m_prevent_list_events = true;//it's needed for GTK
- /* Under GTK, DnD requires to the wxTextDataObject been initialized with some valid value,
+ /* Under GTK, DnD requires to the wxTextDataObject been initialized with some valid vaSome textlue,
* so set some nonempty string
*/
wxTextDataObject* obj = new wxTextDataObject;
@@ -1086,8 +1229,10 @@ void ObjectList::OnDropPossible(wxDataViewEvent &event)
{
const wxDataViewItem& item = event.GetItem();
- if (!can_drop(item))
+ if (!can_drop(item)) {
event.Veto();
+ m_prevent_list_events = false;
+ }
}
void ObjectList::OnDrop(wxDataViewEvent &event)
@@ -1112,7 +1257,7 @@ void ObjectList::OnDrop(wxDataViewEvent &event)
// It looks like a fixed in current version of the wxWidgets
// #ifdef __WXGTK__
// /* Under GTK, DnD moves an item between another two items.
-// * And event.GetItem() return item, which is under "insertion line"
+// * And event.GetItem() return item, which is under "insertion line"Some text
// * So, if we move item down we should to decrease the to_volume_id value
// **/
// if (to_volume_id > from_volume_id) to_volume_id--;
@@ -1210,6 +1355,13 @@ static bool improper_category(const std::string& category, const int extruders_c
(!is_object_settings && category == "Support material");
}
+static bool is_object_item(ItemType item_type)
+{
+ return item_type & itObject || item_type & itInstance ||
+ // multi-selection in ObjectList, but full_object in Selection
+ (item_type == itUndef && scene_selection().is_single_full_object());
+}
+
void ObjectList::get_options_menu(settings_menu_hierarchy& settings_menu, const bool is_part)
{
auto options = get_options(is_part);
@@ -1363,7 +1515,7 @@ void ObjectList::get_settings_choice(const wxString& category_name)
// Add settings item for object/sub-object and show them
if (!(item_type & (itObject | itVolume | itLayer)))
item = m_objects_model->GetTopParent(item);
- show_settings(add_settings_item(item, m_config));
+ show_settings(add_settings_item(item, &m_config->get()));
}
void ObjectList::get_freq_settings_choice(const wxString& bundle_name)
@@ -1420,7 +1572,7 @@ void ObjectList::get_freq_settings_choice(const wxString& bundle_name)
// Add settings item for object/sub-object and show them
if (!(item_type & (itObject | itVolume | itLayer)))
item = m_objects_model->GetTopParent(item);
- show_settings(add_settings_item(item, m_config));
+ show_settings(add_settings_item(item, &m_config->get()));
}
void ObjectList::show_settings(const wxDataViewItem settings_item)
@@ -1558,7 +1710,7 @@ wxMenuItem* ObjectList::append_menu_item_settings(wxMenu* menu_)
// If there are selected more then one instance but not all of them
// don't add settings menu items
const Selection& selection = scene_selection();
- if (selection.is_multiple_full_instance() && !selection.is_single_full_object() ||
+ if ((selection.is_multiple_full_instance() && !selection.is_single_full_object()) ||
selection.is_multiple_volume() || selection.is_mixed() ) // more than one volume(part) is selected on the scene
return nullptr;
@@ -1580,9 +1732,7 @@ wxMenuItem* ObjectList::append_menu_item_settings(wxMenu* menu_)
const ItemType item_type = m_objects_model->GetItemType(GetSelection());
if (item_type == itUndef && !selection.is_single_full_object())
return nullptr;
- const bool is_object_settings = item_type & itObject || item_type & itInstance ||
- // multi-selection in ObjectList, but full_object in Selection
- (item_type == itUndef && selection.is_single_full_object());
+ const bool is_object_settings = is_object_item(item_type);
create_freq_settings_popupmenu(menu, is_object_settings);
if (mode == comAdvanced)
@@ -1706,9 +1856,8 @@ void ObjectList::append_menu_item_change_extruder(wxMenu* menu)
int initial_extruder = -1; // negative value for multiple object/part selection
if (sels.Count()==1) {
- DynamicPrintConfig& config = get_item_config(sels[0]);
- initial_extruder = !config.has("extruder") ? 0 :
- config.option<ConfigOptionInt>("extruder")->value;
+ const ModelConfig &config = get_item_config(sels[0]);
+ initial_extruder = config.has("extruder") ? config.extruder() : 0;
}
for (int i = 0; i <= extruders_cnt; i++)
@@ -1740,6 +1889,75 @@ void ObjectList::append_menu_item_scale_selection_to_fit_print_volume(wxMenu* me
[](wxCommandEvent&) { wxGetApp().plater()->scale_selection_to_fit_print_volume(); }, "", menu);
}
+void ObjectList::append_menu_item_convert_unit(wxMenu* menu, int insert_pos/* = 1*/)
+{
+ std::vector<int> obj_idxs, vol_idxs;
+ get_selection_indexes(obj_idxs, vol_idxs);
+ if (obj_idxs.empty() && vol_idxs.empty())
+ return;
+
+ auto can_append = [this, obj_idxs, vol_idxs](bool from_imperial_unit) {
+ ModelObjectPtrs objects;
+ for (int obj_idx : obj_idxs) {
+ ModelObject* object = (*m_objects)[obj_idx];
+ if (vol_idxs.empty()) {
+ for (ModelVolume* volume : object->volumes)
+ if (volume->source.is_converted_from_inches == from_imperial_unit)
+ return false;
+ }
+ else {
+ for (int vol_idx : vol_idxs)
+ if (object->volumes[vol_idx]->source.is_converted_from_inches == from_imperial_unit)
+ return false;
+ }
+ }
+ return true;
+ };
+
+ wxString convert_menu_name = _L("Convert from imperial units");
+ int convert_menu_id = menu->FindItem(convert_menu_name);
+ wxString revert_menu_name = _L("Revert conversion from imperial units");
+ int revert_menu_id = menu->FindItem(revert_menu_name);
+
+ if (can_append(true)) {
+ // Delete revert menu item
+ if (revert_menu_id != wxNOT_FOUND)
+ menu->Destroy(revert_menu_id);
+ // Add convert menu item if it doesn't exist
+ if (convert_menu_id == wxNOT_FOUND)
+ append_menu_item(menu, wxID_ANY, convert_menu_name, convert_menu_name,
+ [](wxCommandEvent&) { wxGetApp().plater()->convert_unit(true); }, "", menu,
+ []() {return true;}, nullptr, insert_pos);
+ }
+
+ if (can_append(false)) {
+ // Delete convert menu item
+ if (convert_menu_id != wxNOT_FOUND)
+ menu->Destroy(convert_menu_id);
+ // Add convert menu item if it doesn't exist
+ if (revert_menu_id == wxNOT_FOUND)
+ append_menu_item(menu, wxID_ANY, revert_menu_name, revert_menu_name,
+ [](wxCommandEvent&) { wxGetApp().plater()->convert_unit(false); }, "", menu,
+ []() {return true;}, nullptr, insert_pos);
+ }
+}
+
+void ObjectList::append_menu_item_merge_to_multipart_object(wxMenu* menu)
+{
+ menu->AppendSeparator();
+ append_menu_item(menu, wxID_ANY, _L("Merge"), _L("Merge objects to the one multipart object"),
+ [this](wxCommandEvent&) { merge(true); }, "", menu,
+ [this]() { return this->can_merge_to_multipart_object(); }, wxGetApp().plater());
+}
+
+void ObjectList::append_menu_item_merge_to_single_object(wxMenu* menu)
+{
+ menu->AppendSeparator();
+ append_menu_item(menu, wxID_ANY, _L("Merge"), _L("Merge objects to the one single object"),
+ [this](wxCommandEvent&) { merge(false); }, "", menu,
+ [this]() { return this->can_merge_to_single_object(); }, wxGetApp().plater());
+}
+
void ObjectList::create_object_popupmenu(wxMenu *menu)
{
#ifdef __WXOSX__
@@ -1753,6 +1971,10 @@ void ObjectList::create_object_popupmenu(wxMenu *menu)
// Split object to parts
append_menu_item_split(menu);
+// menu->AppendSeparator();
+
+ // Merge multipart object to the single object
+// append_menu_item_merge_to_single_object(menu);
menu->AppendSeparator();
// Layers Editing for object
@@ -1822,8 +2044,7 @@ wxMenu* ObjectList::create_settings_popupmenu(wxMenu *parent_menu)
const wxDataViewItem selected_item = GetSelection();
wxDataViewItem item = m_objects_model->GetItemType(selected_item) & itSettings ? m_objects_model->GetParent(selected_item) : selected_item;
- const bool is_part = !(m_objects_model->GetItemType(item) == itObject || scene_selection().is_single_full_object());
- get_options_menu(settings_menu, is_part);
+ get_options_menu(settings_menu, !is_object_item(m_objects_model->GetItemType(item)));
for (auto cat : settings_menu) {
append_menu_item(menu, wxID_ANY, _(cat.first), "",
@@ -2045,8 +2266,8 @@ void ObjectList::load_generic_subobject(const std::string& type_name, const Mode
wxGetApp().plater()->canvas3D()->update_instance_printable_state_for_object((size_t)obj_idx);
const auto object_item = m_objects_model->GetTopParent(GetSelection());
- select_item(m_objects_model->AddVolumeChild(object_item, name, type,
- new_volume->get_mesh_errors_count()>0));
+ select_item([this, object_item, name, type, new_volume]() { return m_objects_model->AddVolumeChild(object_item, name, type,
+ new_volume->get_mesh_errors_count() > 0); });
//#ifndef __WXOSX__ //#ifdef __WXMSW__ // #ys_FIXME
selection_changed();
//#endif //no __WXOSX__ //__WXMSW__
@@ -2068,37 +2289,45 @@ void ObjectList::load_shape_object(const std::string& type_name)
// Create mesh
BoundingBoxf3 bb;
TriangleMesh mesh = create_mesh(type_name, bb);
+ load_mesh_object(mesh, _(L("Shape")) + "-" + _(type_name));
+}
+void ObjectList::load_mesh_object(const TriangleMesh &mesh, const wxString &name, bool center)
+{
// Add mesh to model as a new object
Model& model = wxGetApp().plater()->model();
- const wxString name = _(L("Shape")) + "-" + _(type_name);
#ifdef _DEBUG
check_model_ids_validity(model);
#endif /* _DEBUG */
-
+
std::vector<size_t> object_idxs;
+ auto bb = mesh.bounding_box();
ModelObject* new_object = model.add_object();
new_object->name = into_u8(name);
new_object->add_instance(); // each object should have at list one instance
-
+
ModelVolume* new_volume = new_object->add_volume(mesh);
new_volume->name = into_u8(name);
// set a default extruder value, since user can't add it manually
new_volume->config.set_key_value("extruder", new ConfigOptionInt(0));
new_object->invalidate_bounding_box();
+ new_object->translate(-bb.center());
- new_object->center_around_origin();
- new_object->ensure_on_bed();
+ if (center) {
+ const BoundingBoxf bed_shape = wxGetApp().plater()->bed_shape_bb();
+ new_object->instances[0]->set_offset(Slic3r::to_3d(bed_shape.center().cast<double>(), -new_object->origin_translation(2)));
+ } else {
+ new_object->instances[0]->set_offset(bb.center());
+ }
- const BoundingBoxf bed_shape = wxGetApp().plater()->bed_shape_bb();
- new_object->instances[0]->set_offset(Slic3r::to_3d(bed_shape.center().cast<double>(), -new_object->origin_translation(2)));
+ new_object->ensure_on_bed();
object_idxs.push_back(model.objects.size() - 1);
#ifdef _DEBUG
check_model_ids_validity(model);
#endif /* _DEBUG */
-
+
paste_objects_into_list(object_idxs);
#ifdef _DEBUG
@@ -2140,19 +2369,7 @@ void ObjectList::del_subobject_item(wxDataViewItem& item)
if (type & itVolume && (*m_objects)[obj_idx]->get_mesh_errors_count() == 0)
m_objects_model->DeleteWarningIcon(m_objects_model->GetParent(item));
- // If last two Instances of object is selected, show the message about impossible action
- bool show_msg = false;
- if (type & itInstance) {
- wxDataViewItemArray instances;
- m_objects_model->GetChildren(m_objects_model->GetParent(item), instances);
- if (instances.Count() == 2 && IsSelected(instances[0]) && IsSelected(instances[1]))
- show_msg = true;
- }
-
m_objects_model->Delete(item);
-
- if (show_msg)
- Slic3r::GUI::show_error(nullptr, _(L("Last instance of an object cannot be deleted.")));
}
void ObjectList::del_settings_from_config(const wxDataViewItem& parent_item)
@@ -2166,9 +2383,7 @@ void ObjectList::del_settings_from_config(const wxDataViewItem& parent_item)
take_snapshot(_(L("Delete Settings")));
- int extruder = -1;
- if (m_config->has("extruder"))
- extruder = m_config->option<ConfigOptionInt>("extruder")->value;
+ int extruder = m_config->has("extruder") ? m_config->extruder() : -1;
coordf_t layer_height = 0.0;
if (is_layer_settings)
@@ -2180,6 +2395,8 @@ void ObjectList::del_settings_from_config(const wxDataViewItem& parent_item)
m_config->set_key_value("extruder", new ConfigOptionInt(extruder));
if (is_layer_settings)
m_config->set_key_value("layer_height", new ConfigOptionFloat(layer_height));
+
+ changed_object();
}
void ObjectList::del_instances_from_object(const int obj_idx)
@@ -2220,8 +2437,9 @@ void ObjectList::del_layers_from_object(const int obj_idx)
bool ObjectList::del_subobject_from_object(const int obj_idx, const int idx, const int type)
{
- if (obj_idx == 1000)
- // Cannot delete a wipe tower.
+ assert(idx >= 0);
+ if (obj_idx == 1000 || idx<0)
+ // Cannot delete a wipe tower or volume with negative id
return false;
ModelObject* object = (*m_objects)[obj_idx];
@@ -2304,11 +2522,10 @@ void ObjectList::split()
const wxDataViewItem& vol_item = m_objects_model->AddVolumeChild(parent, from_u8(volume->name),
volume->is_modifier() ? ModelVolumeType::PARAMETER_MODIFIER : ModelVolumeType::MODEL_PART,
volume->get_mesh_errors_count()>0,
- volume->config.has("extruder") ?
- volume->config.option<ConfigOptionInt>("extruder")->value : 0,
+ volume->config.has("extruder") ? volume->config.extruder() : 0,
false);
// add settings to the part, if it has those
- add_settings_item(vol_item, &volume->config);
+ add_settings_item(vol_item, &volume->config.get());
}
model_object->input_file.clear();
@@ -2319,6 +2536,205 @@ void ObjectList::split()
changed_object(obj_idx);
}
+void ObjectList::merge(bool to_multipart_object)
+{
+ // merge selected objects to the multipart object
+ if (to_multipart_object)
+ {
+ auto get_object_idxs = [this](std::vector<int>& obj_idxs, wxDataViewItemArray& sels)
+ {
+ // check selections and split instances to the separated objects...
+ bool instance_selection = false;
+ for (wxDataViewItem item : sels)
+ if (m_objects_model->GetItemType(item) & itInstance) {
+ instance_selection = true;
+ break;
+ }
+
+ if (!instance_selection)
+ {
+ for (wxDataViewItem item : sels) {
+ assert(m_objects_model->GetItemType(item) & itObject);
+ obj_idxs.emplace_back(m_objects_model->GetIdByItem(item));
+ }
+ return;
+ }
+
+ // map of obj_idx -> set of selected instance_idxs
+ std::map<int, std::set<int>> sel_map;
+ std::set<int> empty_set;
+ for (wxDataViewItem item : sels) {
+ if (m_objects_model->GetItemType(item) & itObject)
+ {
+ int obj_idx = m_objects_model->GetIdByItem(item);
+ int inst_cnt = (*m_objects)[obj_idx]->instances.size();
+ if (inst_cnt == 1)
+ sel_map.emplace(obj_idx, empty_set);
+ else
+ for (int i = 0; i < inst_cnt; i++)
+ sel_map[obj_idx].emplace(i);
+ continue;
+ }
+ int obj_idx = m_objects_model->GetIdByItem(m_objects_model->GetTopParent(item));
+ sel_map[obj_idx].emplace(m_objects_model->GetInstanceIdByItem(item));
+ }
+
+ // all objects, created from the instances will be added to the end of list
+ int new_objects_cnt = 0; // count of this new objects
+
+ for (auto map_item : sel_map)
+ {
+ int obj_idx = map_item.first;
+ // object with just 1 instance
+ if (map_item.second.empty()) {
+ obj_idxs.emplace_back(obj_idx);
+ continue;
+ }
+
+ // object with selected all instances
+ if ((*m_objects)[map_item.first]->instances.size() == map_item.second.size()) {
+ instances_to_separated_objects(obj_idx);
+ // first instance stay on its own place and another all add to the end of list :
+ obj_idxs.emplace_back(obj_idx);
+ new_objects_cnt += map_item.second.size() - 1;
+ continue;
+ }
+
+ // object with selected some of instances
+ instances_to_separated_object(obj_idx, map_item.second);
+
+ if (map_item.second.size() == 1)
+ new_objects_cnt += 1;
+ else {// we should split to separate instances last object
+ instances_to_separated_objects(m_objects->size() - 1);
+ // all instances will stay at the end of list :
+ new_objects_cnt += map_item.second.size();
+ }
+ }
+
+ // all instatnces are extracted to the separate objects and should be selected
+ m_prevent_list_events = true;
+ sels.Clear();
+ for (int obj_idx : obj_idxs)
+ sels.Add(m_objects_model->GetItemById(obj_idx));
+ int obj_cnt = m_objects->size();
+ for (int obj_idx = obj_cnt - new_objects_cnt; obj_idx < obj_cnt; obj_idx++) {
+ sels.Add(m_objects_model->GetItemById(obj_idx));
+ obj_idxs.emplace_back(obj_idx);
+ }
+ UnselectAll();
+ SetSelections(sels);
+ assert(!sels.IsEmpty());
+ m_prevent_list_events = false;
+ };
+
+ std::vector<int> obj_idxs;
+ wxDataViewItemArray sels;
+ GetSelections(sels);
+ assert(!sels.IsEmpty());
+
+ Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Merge"));
+
+ get_object_idxs(obj_idxs, sels);
+
+ // resulted objects merge to the one
+ Model* model = (*m_objects)[0]->get_model();
+ ModelObject* new_object = model->add_object();
+ new_object->name = _u8L("Merged");
+ ModelConfig &config = new_object->config;
+
+ for (int obj_idx : obj_idxs)
+ {
+ ModelObject* object = (*m_objects)[obj_idx];
+
+ const Geometry::Transformation& transformation = object->instances[0]->get_transformation();
+ Vec3d scale = transformation.get_scaling_factor();
+ Vec3d mirror = transformation.get_mirror();
+ Vec3d rotation = transformation.get_rotation();
+
+ if (object->id() == (*m_objects)[obj_idxs.front()]->id())
+ new_object->add_instance();
+ Transform3d volume_offset_correction = new_object->instances[0]->get_transformation().get_matrix().inverse() * transformation.get_matrix();
+
+ // merge volumes
+ for (const ModelVolume* volume : object->volumes) {
+ ModelVolume* new_volume = new_object->add_volume(*volume);
+
+ //set rotation
+ Vec3d vol_rot = new_volume->get_rotation() + rotation;
+ new_volume->set_rotation(vol_rot);
+
+ // set scale
+ Vec3d vol_sc_fact = new_volume->get_scaling_factor().cwiseProduct(scale);
+ new_volume->set_scaling_factor(vol_sc_fact);
+
+ // set mirror
+ Vec3d vol_mirror = new_volume->get_mirror().cwiseProduct(mirror);
+ new_volume->set_mirror(vol_mirror);
+
+ // set offset
+ Vec3d vol_offset = volume_offset_correction* new_volume->get_offset();
+ new_volume->set_offset(vol_offset);
+ }
+
+ // merge settings
+ auto new_opt_keys = config.keys();
+ const ModelConfig& from_config = object->config;
+ auto opt_keys = from_config.keys();
+
+ for (auto& opt_key : opt_keys) {
+ if (find(new_opt_keys.begin(), new_opt_keys.end(), opt_key) == new_opt_keys.end()) {
+ const ConfigOption* option = from_config.option(opt_key);
+ if (!option) {
+ // if current option doesn't exist in prints.get_edited_preset(),
+ // get it from default config values
+ option = DynamicPrintConfig::new_from_defaults_keys({ opt_key })->option(opt_key);
+ }
+ config.set_key_value(opt_key, option->clone());
+ }
+ }
+ // save extruder value if it was set
+ if (object->volumes.size() == 1 && find(opt_keys.begin(), opt_keys.end(), "extruder") != opt_keys.end()) {
+ ModelVolume* volume = new_object->volumes.back();
+ const ConfigOption* option = from_config.option("extruder");
+ if (option)
+ volume->config.set_key_value("extruder", option->clone());
+ }
+
+ // merge layers
+ for (const auto& range : object->layer_config_ranges)
+ new_object->layer_config_ranges.emplace(range);
+ }
+ // remove selected objects
+ remove();
+
+ // Add new object(merged) to the object_list
+ add_object_to_list(m_objects->size() - 1);
+ select_item(m_objects_model->GetItemById(m_objects->size() - 1));
+ update_selections_on_canvas();
+ }
+ // merge all parts to the one single object
+ // all part's settings will be lost
+ else
+ {
+ wxDataViewItem item = GetSelection();
+ if (!item)
+ return;
+ const int obj_idx = m_objects_model->GetIdByItem(item);
+ if (obj_idx == -1)
+ return;
+
+ Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Merge all parts to the one single object"));
+
+ ModelObject* model_object = (*m_objects)[obj_idx];
+ model_object->merge();
+
+ m_objects_model->DeleteVolumeChildren(item);
+
+ changed_object(obj_idx);
+ }
+}
+
void ObjectList::layers_editing()
{
const Selection& selection = scene_selection();
@@ -2341,7 +2757,7 @@ void ObjectList::layers_editing()
// set some default value
if (ranges.empty()) {
take_snapshot(_(L("Add Layers")));
- ranges[{ 0.0f, 2.0f }] = get_default_layer_config(obj_idx);
+ ranges[{ 0.0f, 2.0f }].assign_config(get_default_layer_config(obj_idx));
}
// create layer root item
@@ -2444,6 +2860,34 @@ bool ObjectList::can_split_instances()
return selection.is_multiple_full_instance() || selection.is_single_full_instance();
}
+bool ObjectList::can_merge_to_multipart_object() const
+{
+ if (printer_technology() == ptSLA)
+ return false;
+
+ wxDataViewItemArray sels;
+ GetSelections(sels);
+ if (sels.IsEmpty())
+ return false;
+
+ // should be selected just objects
+ for (wxDataViewItem item : sels)
+ if (!(m_objects_model->GetItemType(item) & (itObject | itInstance)))
+ return false;
+
+ return true;
+}
+
+bool ObjectList::can_merge_to_single_object() const
+{
+ int obj_idx = get_selected_obj_idx();
+ if (obj_idx < 0)
+ return false;
+
+ // selected object should be multipart
+ return (*m_objects)[obj_idx]->volumes.size() > 1;
+}
+
// NO_PARAMETERS function call means that changed object index will be determine from Selection()
void ObjectList::changed_object(const int obj_idx/* = -1*/) const
{
@@ -2629,8 +3073,7 @@ void ObjectList::add_object_to_list(size_t obj_idx, bool call_selection_changed)
auto model_object = (*m_objects)[obj_idx];
const wxString& item_name = from_u8(model_object->name);
const auto item = m_objects_model->Add(item_name,
- !model_object->config.has("extruder") ? 0 :
- model_object->config.option<ConfigOptionInt>("extruder")->value,
+ model_object->config.has("extruder") ? model_object->config.extruder() : 0,
get_mesh_errors_count(obj_idx) > 0);
// add volumes to the object
@@ -2640,10 +3083,9 @@ void ObjectList::add_object_to_list(size_t obj_idx, bool call_selection_changed)
from_u8(volume->name),
volume->type(),
volume->get_mesh_errors_count()>0,
- !volume->config.has("extruder") ? 0 :
- volume->config.option<ConfigOptionInt>("extruder")->value,
+ volume->config.has("extruder") ? volume->config.extruder() : 0,
false);
- add_settings_item(vol_item, &volume->config);
+ add_settings_item(vol_item, &volume->config.get());
}
Expand(item);
}
@@ -2663,7 +3105,7 @@ void ObjectList::add_object_to_list(size_t obj_idx, bool call_selection_changed)
m_objects_model->SetPrintableState(model_object->instances[0]->printable ? piPrintable : piUnprintable, obj_idx);
// add settings to the object, if it has those
- add_settings_item(item, &model_object->config);
+ add_settings_item(item, &model_object->config.get());
// Add layers if it has
add_layer_root_item(item);
@@ -2680,24 +3122,24 @@ void ObjectList::delete_object_from_list()
if (!item)
return;
if (m_objects_model->GetParent(item) == wxDataViewItem(nullptr))
- select_item(m_objects_model->Delete(item));
+ select_item([this, item]() { return m_objects_model->Delete(item); });
else
- select_item(m_objects_model->Delete(m_objects_model->GetParent(item)));
+ select_item([this, item]() { return m_objects_model->Delete(m_objects_model->GetParent(item)); });
}
void ObjectList::delete_object_from_list(const size_t obj_idx)
{
- select_item(m_objects_model->Delete(m_objects_model->GetItemById(obj_idx)));
+ select_item([this, obj_idx]() { return m_objects_model->Delete(m_objects_model->GetItemById(obj_idx)); });
}
void ObjectList::delete_volume_from_list(const size_t obj_idx, const size_t vol_idx)
{
- select_item(m_objects_model->Delete(m_objects_model->GetItemByVolumeId(obj_idx, vol_idx)));
+ select_item([this, obj_idx, vol_idx]() { return m_objects_model->Delete(m_objects_model->GetItemByVolumeId(obj_idx, vol_idx)); });
}
void ObjectList::delete_instance_from_list(const size_t obj_idx, const size_t inst_idx)
{
- select_item(m_objects_model->Delete(m_objects_model->GetItemByInstanceId(obj_idx, inst_idx)));
+ select_item([this, obj_idx, inst_idx]() { return m_objects_model->Delete(m_objects_model->GetItemByInstanceId(obj_idx, inst_idx)); });
}
void ObjectList::delete_from_model_and_list(const ItemType type, const int obj_idx, const int sub_obj_idx)
@@ -2724,6 +3166,7 @@ void ObjectList::delete_from_model_and_list(const std::vector<ItemForDelete>& it
if (items_for_delete.empty())
return;
+ m_prevent_list_events = true;
for (std::vector<ItemForDelete>::const_reverse_iterator item = items_for_delete.rbegin(); item != items_for_delete.rend(); ++item)
{
if (!(item->type&(itObject | itVolume | itInstance)))
@@ -2741,7 +3184,7 @@ void ObjectList::delete_from_model_and_list(const std::vector<ItemForDelete>& it
if ((*m_objects)[item->obj_idx]->volumes.size() == 1 &&
(*m_objects)[item->obj_idx]->config.has("extruder"))
{
- const wxString extruder = wxString::Format("%d", (*m_objects)[item->obj_idx]->config.option<ConfigOptionInt>("extruder")->value);
+ const wxString extruder = wxString::Format("%d", (*m_objects)[item->obj_idx]->config.extruder());
m_objects_model->SetExtruder(extruder, m_objects_model->GetItemById(item->obj_idx));
}
wxGetApp().plater()->canvas3D()->ensure_on_bed(item->obj_idx);
@@ -2750,6 +3193,7 @@ void ObjectList::delete_from_model_and_list(const std::vector<ItemForDelete>& it
m_objects_model->Delete(m_objects_model->GetItemByInstanceId(item->obj_idx, item->sub_obj_idx));
}
}
+ m_prevent_list_events = true;
part_selection_changed();
}
@@ -2764,12 +3208,13 @@ void ObjectList::delete_all_objects_from_list()
void ObjectList::increase_object_instances(const size_t obj_idx, const size_t num)
{
- select_item(m_objects_model->AddInstanceChild(m_objects_model->GetItemById(obj_idx), num));
+ select_item([this, obj_idx, num]() { return m_objects_model->AddInstanceChild(m_objects_model->GetItemById(obj_idx), num); });
+ selection_changed();
}
void ObjectList::decrease_object_instances(const size_t obj_idx, const size_t num)
{
- select_item(m_objects_model->DeleteLastInstance(m_objects_model->GetItemById(obj_idx), num));
+ select_item([this, obj_idx, num]() { return m_objects_model->DeleteLastInstance(m_objects_model->GetItemById(obj_idx), num); });
}
void ObjectList::unselect_objects()
@@ -2807,6 +3252,50 @@ void ObjectList::select_current_volume(int idx, int vol_idx)
m_prevent_list_events = false;
}
+static void update_selection(wxDataViewItemArray& sels, ObjectList::SELECTION_MODE mode, ObjectDataViewModel* model)
+{
+ if (mode == ObjectList::smInstance)
+ {
+ for (auto& item : sels)
+ {
+ ItemType type = model->GetItemType(item);
+ if (type == itObject)
+ continue;
+ if (type == itInstanceRoot) {
+ wxDataViewItem obj_item = model->GetParent(item);
+ sels.Remove(item);
+ sels.Add(obj_item);
+ update_selection(sels, mode, model);
+ return;
+ }
+ if (type == itInstance)
+ {
+ wxDataViewItemArray instances;
+ model->GetChildren(model->GetParent(item), instances);
+ assert(instances.Count() > 0);
+ size_t selected_instances_cnt = 0;
+ for (auto& inst : instances) {
+ if (sels.Index(inst) == wxNOT_FOUND)
+ break;
+ selected_instances_cnt++;
+ }
+
+ if (selected_instances_cnt == instances.Count())
+ {
+ wxDataViewItem obj_item = model->GetTopParent(item);
+ for (auto& inst : instances)
+ sels.Remove(inst);
+ sels.Add(obj_item);
+ update_selection(sels, mode, model);
+ return;
+ }
+ }
+ else
+ return;
+ }
+ }
+}
+
void ObjectList::remove()
{
if (GetSelectedItemsCount() == 0)
@@ -2842,6 +3331,10 @@ void ObjectList::remove()
parent = delete_item(GetSelection());
else
{
+ SELECTION_MODE sels_mode = m_selection_mode;
+ UnselectAll();
+ update_selection(sels, sels_mode, m_objects_model);
+
Plater::TakeSnapshot snapshot = Plater::TakeSnapshot(wxGetApp().plater(), _(L("Delete Selected")));
for (auto& item : sels)
@@ -2906,7 +3399,7 @@ void ObjectList::add_layer_range_after_current(const t_layer_height_range curren
const wxDataViewItem layers_item = GetSelection();
- t_layer_config_ranges& ranges = object(obj_idx)->layer_config_ranges;
+ auto& ranges = object(obj_idx)->layer_config_ranges;
auto it_range = ranges.find(current_range);
assert(it_range != ranges.end());
if (it_range == ranges.end())
@@ -2922,7 +3415,7 @@ void ObjectList::add_layer_range_after_current(const t_layer_height_range curren
changed = true;
const t_layer_height_range new_range = { current_range.second, current_range.second + 2. };
- ranges[new_range] = get_default_layer_config(obj_idx);
+ ranges[new_range].assign_config(get_default_layer_config(obj_idx));
add_layer_item(new_range, layers_item);
}
else if (const std::pair<coordf_t, coordf_t> &next_range = it_next_range->first; current_range.second <= next_range.first)
@@ -2959,7 +3452,7 @@ void ObjectList::add_layer_range_after_current(const t_layer_height_range curren
add_layer_item(new_range, layers_item, layer_idx);
new_range = { current_range.second, middle_layer_z };
- ranges[new_range] = get_default_layer_config(obj_idx);
+ ranges[new_range].assign_config(get_default_layer_config(obj_idx));
add_layer_item(new_range, layers_item, layer_idx);
}
}
@@ -2970,7 +3463,7 @@ void ObjectList::add_layer_range_after_current(const t_layer_height_range curren
changed = true;
const t_layer_height_range new_range = { current_range.second, next_range.first };
- ranges[new_range] = get_default_layer_config(obj_idx);
+ ranges[new_range].assign_config(get_default_layer_config(obj_idx));
add_layer_item(new_range, layers_item, layer_idx);
}
}
@@ -2996,7 +3489,7 @@ wxString ObjectList::can_add_new_range_after_current(const t_layer_height_range
// This should not happen.
return "ObjectList assert";
- t_layer_config_ranges& ranges = object(obj_idx)->layer_config_ranges;
+ auto& ranges = object(obj_idx)->layer_config_ranges;
auto it_range = ranges.find(current_range);
assert(it_range != ranges.end());
if (it_range == ranges.end())
@@ -3035,7 +3528,7 @@ void ObjectList::add_layer_item(const t_layer_height_range& range,
const int obj_idx = m_objects_model->GetObjectIdByItem(layers_item);
if (obj_idx < 0) return;
- const DynamicPrintConfig& config = object(obj_idx)->layer_config_ranges[range];
+ const DynamicPrintConfig& config = object(obj_idx)->layer_config_ranges[range].get();
if (!config.has("extruder"))
return;
@@ -3055,7 +3548,7 @@ bool ObjectList::edit_layer_range(const t_layer_height_range& range, coordf_t la
if (obj_idx < 0)
return false;
- DynamicPrintConfig* config = &object(obj_idx)->layer_config_ranges[range];
+ ModelConfig* config = &object(obj_idx)->layer_config_ranges[range];
if (fabs(layer_height - config->opt_float("layer_height")) < EPSILON)
return false;
@@ -3084,12 +3577,14 @@ bool ObjectList::edit_layer_range(const t_layer_height_range& range, const t_lay
const ItemType sel_type = m_objects_model->GetItemType(GetSelection());
- t_layer_config_ranges& ranges = object(obj_idx)->layer_config_ranges;
+ auto& ranges = object(obj_idx)->layer_config_ranges;
- const DynamicPrintConfig config = ranges[range];
+ {
+ ModelConfig config = std::move(ranges[range]);
+ ranges.erase(range);
+ ranges[new_range] = std::move(config);
+ }
- ranges.erase(range);
- ranges[new_range] = config;
changed_object(obj_idx);
wxDataViewItem root_item = m_objects_model->GetLayerRootItem(m_objects_model->GetItemById(obj_idx));
@@ -3402,6 +3897,23 @@ void ObjectList::select_item(const wxDataViewItem& item)
m_prevent_list_events = false;
}
+void ObjectList::select_item(std::function<wxDataViewItem()> get_item)
+{
+ if (!get_item)
+ return;
+
+ m_prevent_list_events = true;
+
+ wxDataViewItem item = get_item();
+ if (item.IsOk()) {
+ UnselectAll();
+ Select(item);
+ part_selection_changed();
+ }
+
+ m_prevent_list_events = false;
+}
+
void ObjectList::select_items(const wxDataViewItemArray& sels)
{
m_prevent_list_events = true;
@@ -3657,7 +4169,7 @@ void ObjectList::change_part_type()
}
else if (!settings_item &&
(new_type == ModelVolumeType::MODEL_PART || new_type == ModelVolumeType::PARAMETER_MODIFIER)) {
- add_settings_item(item, &volume->config);
+ add_settings_item(item, &volume->config.get());
}
}
@@ -3682,14 +4194,14 @@ void ObjectList::update_and_show_object_settings_item()
if (!item) return;
const wxDataViewItem& obj_item = m_objects_model->IsSettingsItem(item) ? m_objects_model->GetParent(item) : item;
- select_item(add_settings_item(obj_item, &get_item_config(obj_item)));
+ select_item([this, obj_item](){ return add_settings_item(obj_item, &get_item_config(obj_item).get()); });
}
// Update settings item for item had it
void ObjectList::update_settings_item_and_selection(wxDataViewItem item, wxDataViewItemArray& selections)
{
const wxDataViewItem old_settings_item = m_objects_model->GetSettingsItem(item);
- const wxDataViewItem new_settings_item = add_settings_item(item, &get_item_config(item));
+ const wxDataViewItem new_settings_item = add_settings_item(item, &get_item_config(item).get());
if (!new_settings_item && old_settings_item)
m_objects_model->Delete(old_settings_item);
@@ -3982,6 +4494,26 @@ void ObjectList::msw_rescale()
Layout();
}
+void ObjectList::sys_color_changed()
+{
+ // msw_rescale_icons() updates icons, so use it
+ msw_rescale_icons();
+
+ // update existing items with bitmaps
+ m_objects_model->Rescale();
+
+ // msw_rescale_menu updates just icons, so use it
+ for (MenuWithSeparators* menu : { &m_menu_object,
+ &m_menu_part,
+ &m_menu_sla_object,
+ &m_menu_instance,
+ &m_menu_layer,
+ &m_menu_default})
+ msw_rescale_menu(menu);
+
+ Layout();
+}
+
void ObjectList::ItemValueChanged(wxDataViewEvent &event)
{
if (event.GetColumn() == colName)
@@ -4043,6 +4575,10 @@ void ObjectList::show_multi_selection_menu()
return wxGetApp().plater()->can_reload_from_disk();
}, wxGetApp().plater());
+ append_menu_item_convert_unit(menu);
+ if (can_merge_to_multipart_object())
+ append_menu_item_merge_to_multipart_object(menu);
+
wxGetApp().plater()->PopupMenu(menu);
}
@@ -4083,19 +4619,19 @@ void ObjectList::set_extruder_for_selected_items(const int extruder) const
for (const wxDataViewItem& item : sels)
{
- DynamicPrintConfig& config = get_item_config(item);
+ ModelConfig& config = get_item_config(item);
if (config.has("extruder")) {
if (extruder == 0)
config.erase("extruder");
else
- config.option<ConfigOptionInt>("extruder")->value = extruder;
+ config.set("extruder", extruder);
}
else if (extruder > 0)
config.set_key_value("extruder", new ConfigOptionInt(extruder));
const wxString extruder_str = extruder == 0 ? wxString (_(L("default"))) :
- wxString::Format("%d", config.option<ConfigOptionInt>("extruder")->value);
+ wxString::Format("%d", config.extruder());
auto const type = m_objects_model->GetItemType(item);
diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp
index 609411cd5..52aefe0e6 100644
--- a/src/slic3r/GUI/GUI_ObjectList.hpp
+++ b/src/slic3r/GUI/GUI_ObjectList.hpp
@@ -13,6 +13,8 @@
#include "wxExtensions.hpp"
#include "ObjectDataViewModel.hpp"
+#include "libslic3r/PrintConfig.hpp"
+
class wxBoxSizer;
class wxBitmapComboBox;
class wxMenuItem;
@@ -22,8 +24,10 @@ class MenuWithSeparators;
namespace Slic3r {
class ConfigOptionsGroup;
class DynamicPrintConfig;
+class ModelConfig;
class ModelObject;
class ModelVolume;
+class TriangleMesh;
enum class ModelVolumeType : int;
// FIXME: broken build on mac os because of this is missing:
@@ -36,9 +40,9 @@ typedef std::map< std::string, std::vector< std::pair<std::string, std::string>
typedef std::vector<ModelVolume*> ModelVolumePtrs;
-typedef double coordf_t;
-typedef std::pair<coordf_t, coordf_t> t_layer_height_range;
-typedef std::map<t_layer_height_range, DynamicPrintConfig> t_layer_config_ranges;
+typedef double coordf_t;
+typedef std::pair<coordf_t, coordf_t> t_layer_height_range;
+typedef std::map<t_layer_height_range, ModelConfig> t_layer_config_ranges;
namespace GUI {
@@ -80,10 +84,32 @@ public:
smLayerRoot = 16, // used for undo/redo
};
+ struct Clipboard
+ {
+ void reset() {
+ m_type = itUndef;
+ m_layer_config_ranges_cache .clear();
+ m_config_cache.clear();
+ }
+ bool empty() const { return m_type == itUndef; }
+ ItemType get_type() const { return m_type; }
+ void set_type(ItemType type) { m_type = type; }
+
+ t_layer_config_ranges& get_ranges_cache() { return m_layer_config_ranges_cache; }
+ DynamicPrintConfig& get_config_cache() { return m_config_cache; }
+
+ private:
+ ItemType m_type {itUndef};
+ t_layer_config_ranges m_layer_config_ranges_cache;
+ DynamicPrintConfig m_config_cache;
+ };
+
private:
SELECTION_MODE m_selection_mode {smUndef};
int m_selected_layers_range_idx;
+ Clipboard m_clipboard;
+
struct dragged_item_data
{
void init(const int obj_idx, const int subobj_idx, const ItemType type) {
@@ -140,15 +166,13 @@ private:
wxMenuItem* m_menu_item_split_instances { nullptr };
ObjectDataViewModel *m_objects_model{ nullptr };
- DynamicPrintConfig *m_config {nullptr};
+ ModelConfig *m_config {nullptr};
std::vector<ModelObject*> *m_objects{ nullptr };
wxBitmapComboBox *m_extruder_editor { nullptr };
std::vector<wxBitmap*> m_bmp_vector;
- t_layer_config_ranges m_layer_config_ranges_cache;
-
int m_selected_object_id = -1;
bool m_prevent_list_events = false; // We use this flag to avoid circular event handling Select()
// happens to fire a wxEVT_LIST_ITEM_SELECTED on OSX, whose event handler
@@ -183,11 +207,12 @@ public:
ObjectList(wxWindow* parent);
~ObjectList();
+ void set_min_height();
std::map<std::string, wxBitmap> CATEGORY_ICON;
ObjectDataViewModel* GetModel() const { return m_objects_model; }
- DynamicPrintConfig* config() const { return m_config; }
+ ModelConfig* config() const { return m_config; }
std::vector<ModelObject*>* objects() const { return m_objects; }
ModelObject* object(const int obj_idx) const ;
@@ -209,6 +234,7 @@ public:
// Get obj_idx and vol_idx values for the selected (by default) or an adjusted item
void get_selected_item_indexes(int& obj_idx, int& vol_idx, const wxDataViewItem& item = wxDataViewItem(0));
+ void get_selection_indexes(std::vector<int>& obj_idxs, std::vector<int>& vol_idxs);
// Get count of errors in the mesh
int get_mesh_errors_count(const int obj_idx, const int vol_idx = -1) const;
/* Get list of errors in the mesh. Return value is a string, used for the tooltip
@@ -228,8 +254,12 @@ public:
void copy();
void paste();
+ bool copy_to_clipboard();
+ bool paste_from_clipboard();
void undo();
void redo();
+ void increase_instances();
+ void decrease_instances();
void get_settings_choice(const wxString& category_name);
void get_freq_settings_choice(const wxString& bundle_name);
@@ -251,6 +281,9 @@ public:
void append_menu_item_change_extruder(wxMenu* menu);
void append_menu_item_delete(wxMenu* menu);
void append_menu_item_scale_selection_to_fit_print_volume(wxMenu* menu);
+ void append_menu_item_convert_unit(wxMenu* menu, int insert_pos = 1); // Add "Conver/Revert..." menu item after "Reload From Disk"
+ void append_menu_item_merge_to_multipart_object(wxMenu *menu);
+ void append_menu_item_merge_to_single_object(wxMenu *menu);
void create_object_popupmenu(wxMenu *menu);
void create_sla_object_popupmenu(wxMenu*menu);
void create_part_popupmenu(wxMenu*menu);
@@ -265,6 +298,7 @@ public:
void load_part(ModelObject* model_object, std::vector<std::pair<wxString, bool>> &volumes_info, ModelVolumeType type);
void load_generic_subobject(const std::string& type_name, const ModelVolumeType type);
void load_shape_object(const std::string &type_name);
+ void load_mesh_object(const TriangleMesh &mesh, const wxString &name, bool center = true);
void del_object(const int obj_idx);
void del_subobject_item(wxDataViewItem& item);
void del_settings_from_config(const wxDataViewItem& parent_item);
@@ -273,6 +307,7 @@ public:
void del_layers_from_object(const int obj_idx);
bool del_subobject_from_object(const int obj_idx, const int idx, const int type);
void split();
+ void merge(bool to_multipart_object);
void layers_editing();
wxDataViewItem add_layer_root_item(const wxDataViewItem obj_item);
@@ -283,11 +318,13 @@ public:
bool is_splittable();
bool selected_instances_of_same_object();
bool can_split_instances();
+ bool can_merge_to_multipart_object() const;
+ bool can_merge_to_single_object() const;
wxPoint get_mouse_position_in_control() const { return wxGetMousePosition() - this->GetScreenPosition(); }
wxBoxSizer* get_sizer() {return m_sizer;}
int get_selected_obj_idx() const;
- DynamicPrintConfig& get_item_config(const wxDataViewItem& item) const;
+ ModelConfig& get_item_config(const wxDataViewItem& item) const;
SettingsBundle get_item_settings_bundle(const DynamicPrintConfig* config, const bool is_object_settings);
void changed_object(const int obj_idx = -1) const;
@@ -351,6 +388,7 @@ public:
void update_selections();
void update_selections_on_canvas();
void select_item(const wxDataViewItem& item);
+ void select_item(std::function<wxDataViewItem()> get_item);
void select_items(const wxDataViewItemArray& sels);
void select_all();
void select_item_all_children();
@@ -376,12 +414,16 @@ public:
void fix_through_netfabb();
void update_item_error_icon(const int obj_idx, int vol_idx) const ;
- void fill_layer_config_ranges_cache();
+ void copy_layers_to_clipboard();
void paste_layers_into_list();
+ void copy_settings_to_clipboard();
+ void paste_settings_into_list();
+ bool clipboard_is_empty() const { return m_clipboard.empty(); }
void paste_volumes_into_list(int obj_idx, const ModelVolumePtrs& volumes);
void paste_objects_into_list(const std::vector<size_t>& object_idxs);
void msw_rescale();
+ void sys_color_changed();
void update_after_undo_redo();
//update printable state for item from objects model
diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.cpp b/src/slic3r/GUI/GUI_ObjectManipulation.cpp
index 36293525a..8a4c28096 100644
--- a/src/slic3r/GUI/GUI_ObjectManipulation.cpp
+++ b/src/slic3r/GUI/GUI_ObjectManipulation.cpp
@@ -2,12 +2,16 @@
#include "GUI_ObjectList.hpp"
#include "I18N.hpp"
+#include "GLCanvas3D.hpp"
#include "OptionsGroup.hpp"
+#include "GUI_App.hpp"
#include "wxExtensions.hpp"
-#include "PresetBundle.hpp"
+#include "libslic3r/PresetBundle.hpp"
#include "libslic3r/Model.hpp"
#include "libslic3r/Geometry.hpp"
#include "Selection.hpp"
+#include "Plater.hpp"
+#include "MainFrame.hpp"
#include <boost/algorithm/string.hpp>
#include "slic3r/Utils/FixModelByWin10.hpp"
@@ -17,6 +21,8 @@ namespace Slic3r
namespace GUI
{
+const double ObjectManipulation::in_to_mm = 25.4;
+const double ObjectManipulation::mm_to_in = 0.0393700787;
// Helper function to be used by drop to bed button. Returns lowest point of this
// volume in world coordinate system.
@@ -59,8 +65,8 @@ static wxBitmapComboBox* create_word_local_combo(wxWindow *parent)
temp->SetFont(Slic3r::GUI::wxGetApp().normal_font());
if (!wxOSX) temp->SetBackgroundStyle(wxBG_STYLE_PAINT);
- temp->Append(_(L("World coordinates")));
- temp->Append(_(L("Local coordinates")));
+ temp->Append(_L("World coordinates"));
+ temp->Append(_L("Local coordinates"));
temp->SetSelection(0);
temp->SetValue(temp->GetString(0));
@@ -79,7 +85,7 @@ static wxBitmapComboBox* create_word_local_combo(wxWindow *parent)
temp->SetItemBitmap(0, empty_bmp);
#endif
- temp->SetToolTip(_(L("Select coordinate space, in which the transformation will be performed.")));
+ temp->SetToolTip(_L("Select coordinate space, in which the transformation will be performed."));
return temp;
}
@@ -102,8 +108,8 @@ void msw_rescale_word_local_combo(wxBitmapComboBox* combo)
// Set rescaled size
combo->SetSize(size);
- combo->Append(_(L("World coordinates")));
- combo->Append(_(L("Local coordinates")));
+ combo->Append(_L("World coordinates"));
+ combo->Append(_L("Local coordinates"));
wxBitmap empty_bmp(1, combo->GetFont().GetPixelSize().y + 2);
empty_bmp.SetWidth(0);
@@ -121,6 +127,8 @@ static void set_font_and_background_style(wxWindow* win, const wxFont& font)
ObjectManipulation::ObjectManipulation(wxWindow* parent) :
OG_Settings(parent, true)
{
+ m_imperial_units = wxGetApp().app_config->get("use_inches") == "1";
+
m_manifold_warning_bmp = ScalableBitmap(parent, "exclamation");
// Load bitmaps to be used for the mirroring buttons:
@@ -150,9 +158,9 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) :
sizer->Add(m_fix_throught_netfab_bitmap);
- auto name_label = new wxStaticText(m_parent, wxID_ANY, _(L("Name"))+":");
+ auto name_label = new wxStaticText(m_parent, wxID_ANY, _L("Name")+":");
set_font_and_background_style(name_label, wxGetApp().normal_font());
- name_label->SetToolTip(_(L("Object name")));
+ name_label->SetToolTip(_L("Object name"));
sizer->Add(name_label);
m_main_grid_sizer->Add(sizer);
@@ -260,7 +268,7 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) :
// We will add a button to toggle mirroring to each axis:
auto btn = new ScalableButton(parent, wxID_ANY, "mirroring_off", wxEmptyString, wxDefaultSize, wxDefaultPosition, wxBU_EXACTFIT | wxNO_BORDER | wxTRANSPARENT_WINDOW);
- btn->SetToolTip(wxString::Format(_(L("Toggle %c axis mirroring")), (int)label));
+ btn->SetToolTip(wxString::Format(_L("Toggle %c axis mirroring"), (int)label));
btn->SetBitmapDisabled_(m_mirror_bitmap_hidden);
m_mirror_buttons[axis_idx].first = btn;
@@ -314,15 +322,15 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) :
};
// add Units
- auto add_unit_text = [this, parent, editors_grid_sizer, height](std::string unit)
+ auto add_unit_text = [this, parent, editors_grid_sizer, height](std::string unit, wxStaticText** unit_text)
{
- wxStaticText* unit_text = new wxStaticText(parent, wxID_ANY, _(unit));
- set_font_and_background_style(unit_text, wxGetApp().normal_font());
+ *unit_text = new wxStaticText(parent, wxID_ANY, _(unit));
+ set_font_and_background_style(*unit_text, wxGetApp().normal_font());
// Unit text should be the same height as labels
wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL);
sizer->SetMinSize(wxSize(-1, height));
- sizer->Add(unit_text, 0, wxALIGN_CENTER_VERTICAL);
+ sizer->Add(*unit_text, 0, wxALIGN_CENTER_VERTICAL);
editors_grid_sizer->Add(sizer);
m_rescalable_sizers.push_back(sizer);
@@ -330,11 +338,11 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) :
for (size_t axis_idx = 0; axis_idx < sizeof(axes); axis_idx++)
add_edit_boxes("position", axis_idx);
- add_unit_text(L("mm"));
+ add_unit_text(m_imperial_units ? L("in") : L("mm"), &m_position_unit);
// Add drop to bed button
m_drop_to_bed_button = new ScalableButton(parent, wxID_ANY, ScalableBitmap(parent, "drop_to_bed"));
- m_drop_to_bed_button->SetToolTip(_(L("Drop to bed")));
+ m_drop_to_bed_button->SetToolTip(_L("Drop to bed"));
m_drop_to_bed_button->Bind(wxEVT_BUTTON, [=](wxCommandEvent& e) {
// ???
GLCanvas3D* canvas = wxGetApp().plater()->canvas3D();
@@ -346,7 +354,7 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) :
const Geometry::Transformation& instance_trafo = volume->get_instance_transformation();
Vec3d diff = m_cache.position - instance_trafo.get_matrix(true).inverse() * Vec3d(0., 0., get_volume_min_z(volume));
- Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Drop to bed")));
+ Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Drop to bed"));
change_position_value(0, diff.x());
change_position_value(1, diff.y());
change_position_value(2, diff.z());
@@ -356,11 +364,12 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) :
for (size_t axis_idx = 0; axis_idx < sizeof(axes); axis_idx++)
add_edit_boxes("rotation", axis_idx);
- add_unit_text("°");
+ wxStaticText* rotation_unit{ nullptr };
+ add_unit_text("°", &rotation_unit);
// Add reset rotation button
m_reset_rotation_button = new ScalableButton(parent, wxID_ANY, ScalableBitmap(parent, "undo"));
- m_reset_rotation_button->SetToolTip(_(L("Reset rotation")));
+ m_reset_rotation_button->SetToolTip(_L("Reset rotation"));
m_reset_rotation_button->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) {
GLCanvas3D* canvas = wxGetApp().plater()->canvas3D();
Selection& selection = canvas->get_selection();
@@ -390,13 +399,14 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) :
for (size_t axis_idx = 0; axis_idx < sizeof(axes); axis_idx++)
add_edit_boxes("scale", axis_idx);
- add_unit_text("%");
+ wxStaticText* scale_unit{ nullptr };
+ add_unit_text("%", &scale_unit);
// Add reset scale button
m_reset_scale_button = new ScalableButton(parent, wxID_ANY, ScalableBitmap(parent, "undo"));
- m_reset_scale_button->SetToolTip(_(L("Reset scale")));
+ m_reset_scale_button->SetToolTip(_L("Reset scale"));
m_reset_scale_button->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) {
- Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Reset scale")));
+ Plater::TakeSnapshot snapshot(wxGetApp().plater(), _L("Reset scale"));
change_scale_value(0, 100.);
change_scale_value(1, 100.);
change_scale_value(2, 100.);
@@ -405,11 +415,23 @@ ObjectManipulation::ObjectManipulation(wxWindow* parent) :
for (size_t axis_idx = 0; axis_idx < sizeof(axes); axis_idx++)
add_edit_boxes("size", axis_idx);
- add_unit_text("mm");
+ add_unit_text(m_imperial_units ? L("in") : L("mm"), &m_size_unit);
editors_grid_sizer->AddStretchSpacer(1);
m_main_grid_sizer->Add(editors_grid_sizer, 1, wxEXPAND);
+ m_check_inch = new wxCheckBox(parent, wxID_ANY, _L("Inches"));
+ m_check_inch->SetFont(wxGetApp().normal_font());
+
+ m_check_inch->SetValue(m_imperial_units);
+ m_check_inch->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent&) {
+ wxGetApp().app_config->set("use_inches", m_check_inch->GetValue() ? "1" : "0");
+ wxGetApp().sidebar().update_ui_from_settings();
+ });
+
+ m_main_grid_sizer->Add(m_check_inch, 1, wxEXPAND);
+
+ m_og->activate();
m_og->sizer->Clear(true);
m_og->sizer->Add(m_main_grid_sizer, 1, wxEXPAND | wxALL, border);
}
@@ -452,6 +474,32 @@ void ObjectManipulation::UpdateAndShow(const bool show)
OG_Settings::UpdateAndShow(show);
}
+void ObjectManipulation::update_ui_from_settings()
+{
+ if (m_imperial_units != (wxGetApp().app_config->get("use_inches") == "1")) {
+ m_imperial_units = wxGetApp().app_config->get("use_inches") == "1";
+
+ auto update_unit_text = [](const wxString& new_unit_text, wxStaticText* widget) {
+ widget->SetLabel(new_unit_text);
+ if (wxOSX) set_font_and_background_style(widget, wxGetApp().normal_font());
+ };
+ update_unit_text(m_imperial_units ? _L("in") : _L("mm"), m_position_unit);
+ update_unit_text(m_imperial_units ? _L("in") : _L("mm"), m_size_unit);
+
+ for (int i = 0; i < 3; ++i) {
+ auto update = [this, i](/*ManipulationEditorKey*/int key_id, const Vec3d& new_value) {
+ wxString new_text = double_to_string(m_imperial_units ? new_value(i) * mm_to_in : new_value(i), 2);
+ const int id = key_id * 3 + i;
+ if (id >= 0) m_editors[id]->set_value(new_text);
+ };
+ update(0/*mePosition*/, m_new_position);
+ update(3/*meSize*/, m_new_size);
+ }
+ }
+
+ m_check_inch->SetValue(m_imperial_units);
+}
+
void ObjectManipulation::update_settings_value(const Selection& selection)
{
m_new_move_label_string = L("Position");
@@ -462,8 +510,7 @@ void ObjectManipulation::update_settings_value(const Selection& selection)
m_world_coordinates = true;
ObjectList* obj_list = wxGetApp().obj_list();
- if (selection.is_single_full_instance())
- {
+ if (selection.is_single_full_instance()) {
// all volumes in the selection belongs to the same instance, any of them contains the needed instance data, so we take the first one
const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin());
m_new_position = volume->get_instance_offset();
@@ -481,7 +528,8 @@ void ObjectManipulation::update_settings_value(const Selection& selection)
m_new_rotation = Vec3d::Zero();
m_new_size = selection.get_scaled_instance_bounding_box().size();
m_new_scale = m_new_size.cwiseProduct(selection.get_unscaled_instance_bounding_box().size().cwiseInverse()) * 100.;
- } else {
+ }
+ else {
m_new_rotation = volume->get_instance_rotation() * (180. / M_PI);
m_new_size = volume->get_instance_transformation().get_scaling_factor().cwiseProduct(wxGetApp().model().objects[volume->object_idx()]->raw_mesh_bounding_box().size());
m_new_scale = volume->get_instance_scaling_factor() * 100.;
@@ -489,8 +537,7 @@ void ObjectManipulation::update_settings_value(const Selection& selection)
m_new_enabled = true;
}
- else if (selection.is_single_full_object() && obj_list->is_selected(itObject))
- {
+ else if (selection.is_single_full_object() && obj_list->is_selected(itObject)) {
const BoundingBoxf3& box = selection.get_bounding_box();
m_new_position = box.center();
m_new_rotation = Vec3d::Zero();
@@ -500,18 +547,16 @@ void ObjectManipulation::update_settings_value(const Selection& selection)
m_new_scale_label_string = L("Scale");
m_new_enabled = true;
}
- else if (selection.is_single_modifier() || selection.is_single_volume())
- {
+ else if (selection.is_single_modifier() || selection.is_single_volume()) {
// the selection contains a single volume
const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin());
m_new_position = volume->get_volume_offset();
m_new_rotation = volume->get_volume_rotation() * (180. / M_PI);
m_new_scale = volume->get_volume_scaling_factor() * 100.;
- m_new_size = volume->get_volume_transformation().get_scaling_factor().cwiseProduct(volume->bounding_box().size());
+ m_new_size = volume->get_instance_transformation().get_scaling_factor().cwiseProduct(volume->get_volume_transformation().get_scaling_factor().cwiseProduct(volume->bounding_box().size()));
m_new_enabled = true;
}
- else if (obj_list->multiple_selection() || obj_list->is_selected(itInstanceRoot))
- {
+ else if (obj_list->multiple_selection() || obj_list->is_selected(itInstanceRoot)) {
reset_settings_value();
m_new_move_label_string = L("Translate");
m_new_rotate_label_string = L("Rotate");
@@ -562,6 +607,8 @@ void ObjectManipulation::update_if_dirty()
if (std::abs(cached_rounded(i) - new_rounded) > EPSILON) {
cached_rounded(i) = new_rounded;
const int id = key_id*3+i;
+ if (m_imperial_units && (key_id == mePosition || key_id == meSize))
+ new_text = double_to_string(new_value(i)*mm_to_in, 2);
if (id >= 0) m_editors[id]->set_value(new_text);
}
cached(i) = new_value(i);
@@ -575,7 +622,7 @@ void ObjectManipulation::update_if_dirty()
if (selection.requires_uniform_scale()) {
m_lock_bnt->SetLock(true);
- m_lock_bnt->SetToolTip(_(L("You cannot use non-uniform scaling mode for multiple objects/parts selection")));
+ m_lock_bnt->SetToolTip(_L("You cannot use non-uniform scaling mode for multiple objects/parts selection"));
m_lock_bnt->disable();
}
else {
@@ -851,6 +898,9 @@ void ObjectManipulation::on_change(const std::string& opt_key, int axis, double
if (!m_cache.is_valid())
return;
+ if (m_imperial_units && (opt_key == "position" || opt_key == "size"))
+ new_value *= in_to_mm;
+
if (opt_key == "position")
change_position_value(axis, new_value);
else if (opt_key == "rotation")
@@ -872,11 +922,11 @@ void ObjectManipulation::set_uniform_scaling(const bool new_value)
if (! Geometry::is_rotation_ninety_degrees(volume->get_instance_rotation())) {
// Cannot apply scaling in the world coordinate system.
wxMessageDialog dlg(GUI::wxGetApp().mainframe,
- _(L("The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n"
+ _L("The currently manipulated object is tilted (rotation angles are not multiples of 90°).\n"
"Non-uniform scaling of tilted objects is only possible in the World coordinate system,\n"
- "once the rotation is embedded into the object coordinates.")) + "\n" +
- _(L("This operation is irreversible.\n"
- "Do you want to proceed?")),
+ "once the rotation is embedded into the object coordinates.") + "\n" +
+ _L("This operation is irreversible.\n"
+ "Do you want to proceed?"),
SLIC3R_APP_NAME,
wxYES_NO | wxCANCEL | wxCANCEL_DEFAULT | wxICON_QUESTION);
if (dlg.ShowModal() != wxID_YES) {
@@ -929,15 +979,35 @@ void ObjectManipulation::msw_rescale()
for (ManipulationEditor* editor : m_editors)
editor->msw_rescale();
+ // rescale "inches" checkbox
+ m_check_inch->SetMinSize(wxSize(-1, int(1.5f * m_check_inch->GetFont().GetPixelSize().y + 0.5f)));
+
get_og()->msw_rescale();
}
+void ObjectManipulation::sys_color_changed()
+{
+ // btn...->msw_rescale() updates icon on button, so use it
+ m_mirror_bitmap_on.msw_rescale();
+ m_mirror_bitmap_off.msw_rescale();
+ m_mirror_bitmap_hidden.msw_rescale();
+ m_reset_scale_button->msw_rescale();
+ m_reset_rotation_button->msw_rescale();
+ m_drop_to_bed_button->msw_rescale();
+ m_lock_bnt->msw_rescale();
+
+ for (int id = 0; id < 3; ++id)
+ m_mirror_buttons[id].first->msw_rescale();
+
+ get_og()->sys_color_changed();
+}
+
static const char axes[] = { 'x', 'y', 'z' };
ManipulationEditor::ManipulationEditor(ObjectManipulation* parent,
const std::string& opt_key,
int axis) :
wxTextCtrl(parent->parent(), wxID_ANY, wxEmptyString, wxDefaultPosition,
- wxSize(5*int(wxGetApp().em_unit()), wxDefaultCoord), wxTE_PROCESS_ENTER),
+ wxSize((wxOSX ? 5 : 6)*int(wxGetApp().em_unit()), wxDefaultCoord), wxTE_PROCESS_ENTER),
m_opt_key(opt_key),
m_axis(axis)
{
diff --git a/src/slic3r/GUI/GUI_ObjectManipulation.hpp b/src/slic3r/GUI/GUI_ObjectManipulation.hpp
index e6f99ab2a..560fbb400 100644
--- a/src/slic3r/GUI/GUI_ObjectManipulation.hpp
+++ b/src/slic3r/GUI/GUI_ObjectManipulation.hpp
@@ -4,12 +4,14 @@
#include <memory>
#include "GUI_ObjectSettings.hpp"
-#include "GLCanvas3D.hpp"
+#include "libslic3r/Point.hpp"
+#include <float.h>
class wxBitmapComboBox;
class wxStaticText;
class LockButton;
class wxStaticBitmap;
+class wxCheckBox;
namespace Slic3r {
namespace GUI {
@@ -41,6 +43,11 @@ private:
class ObjectManipulation : public OG_Settings
{
+public:
+ static const double in_to_mm;
+ static const double mm_to_in;
+
+private:
struct Cache
{
Vec3d position;
@@ -76,6 +83,10 @@ class ObjectManipulation : public OG_Settings
wxStaticText* m_scale_Label = nullptr;
wxStaticText* m_rotate_Label = nullptr;
+ bool m_imperial_units { false };
+ wxStaticText* m_position_unit { nullptr };
+ wxStaticText* m_size_unit { nullptr };
+
wxStaticText* m_item_name = nullptr;
wxStaticText* m_empty_str = nullptr;
@@ -84,6 +95,8 @@ class ObjectManipulation : public OG_Settings
ScalableButton* m_reset_rotation_button = nullptr;
ScalableButton* m_drop_to_bed_button = nullptr;
+ wxCheckBox* m_check_inch {nullptr};
+
// Mirroring buttons and their current state
enum MirrorButtonState {
mbHidden,
@@ -138,6 +151,7 @@ public:
void Show(const bool show) override;
bool IsShown() override;
void UpdateAndShow(const bool show) override;
+ void update_ui_from_settings();
void set_dirty() { m_dirty = true; }
// Called from the App to update the UI if dirty.
@@ -160,6 +174,7 @@ public:
void update_item_name(const wxString &item_name);
void update_warning_icon_state(const wxString& tooltip);
void msw_rescale();
+ void sys_color_changed();
void on_change(const std::string& opt_key, int axis, double new_value);
void set_focused_editor(ManipulationEditor* focused_editor) {
#ifndef __APPLE__
diff --git a/src/slic3r/GUI/GUI_ObjectSettings.cpp b/src/slic3r/GUI/GUI_ObjectSettings.cpp
index 1447e0768..2501ea499 100644
--- a/src/slic3r/GUI/GUI_ObjectSettings.cpp
+++ b/src/slic3r/GUI/GUI_ObjectSettings.cpp
@@ -2,8 +2,10 @@
#include "GUI_ObjectList.hpp"
#include "OptionsGroup.hpp"
+#include "GUI_App.hpp"
#include "wxExtensions.hpp"
-#include "PresetBundle.hpp"
+#include "Plater.hpp"
+#include "libslic3r/PresetBundle.hpp"
#include "libslic3r/Model.hpp"
#include <boost/algorithm/string.hpp>
@@ -56,6 +58,7 @@ wxSizer* OG_Settings::get_sizer()
ObjectSettings::ObjectSettings(wxWindow* parent) :
OG_Settings(parent, true)
{
+ m_og->activate();
m_og->set_name(_(L("Additional Settings")));
m_settings_list_sizer = new wxBoxSizer(wxVERTICAL);
@@ -80,7 +83,7 @@ bool ObjectSettings::update_settings_list()
return false;
const bool is_object_settings = objects_model->GetItemType(objects_model->GetParent(item)) == itObject;
- SettingsBundle cat_options = objects_ctrl->get_item_settings_bundle(config, is_object_settings);
+ SettingsBundle cat_options = objects_ctrl->get_item_settings_bundle(&config->get(), is_object_settings);
if (!cat_options.empty())
{
@@ -146,14 +149,15 @@ bool ObjectSettings::update_settings_list()
if (is_extruders_cat)
option.opt.max = wxGetApp().extruders_edited_cnt();
optgroup->append_single_option_line(option);
-
+ }
+ optgroup->activate();
+ for (auto& opt : cat.second)
optgroup->get_field(opt)->m_on_change = [optgroup](const std::string& opt_id, const boost::any& value) {
// first of all take a snapshot and then change value in configuration
wxGetApp().plater()->take_snapshot(from_u8((boost::format(_utf8(L("Change Option %s"))) % opt_id).str()));
optgroup->on_change_OG(opt_id, value);
};
- }
optgroup->reload_config();
m_settings_list_sizer->Add(optgroup->sizer, 0, wxEXPAND | wxALL, 0);
@@ -174,7 +178,7 @@ bool ObjectSettings::update_settings_list()
return true;
}
-bool ObjectSettings::add_missed_options(DynamicPrintConfig* config_to, const DynamicPrintConfig& config_from)
+bool ObjectSettings::add_missed_options(ModelConfig* config_to, const DynamicPrintConfig& config_from)
{
bool is_added = false;
if (wxGetApp().plater()->printer_technology() == ptFFF)
@@ -191,7 +195,7 @@ bool ObjectSettings::add_missed_options(DynamicPrintConfig* config_to, const Dyn
return is_added;
}
-void ObjectSettings::update_config_values(DynamicPrintConfig* config)
+void ObjectSettings::update_config_values(ModelConfig* config)
{
const auto objects_model = wxGetApp().obj_list()->GetModel();
const auto item = wxGetApp().obj_list()->GetSelection();
@@ -231,31 +235,30 @@ void ObjectSettings::update_config_values(DynamicPrintConfig* config)
}
};
- auto get_field = [this](const t_config_option_key & opt_key, int opt_index)
+ auto toggle_field = [this](const t_config_option_key & opt_key, bool toggle, int opt_index)
{
Field* field = nullptr;
for (auto og : m_og_settings) {
field = og->get_fieldc(opt_key, opt_index);
if (field != nullptr)
- return field;
+ break;
}
- return field;
+ if (field)
+ field->toggle(toggle);
};
- ConfigManipulation config_manipulation(load_config, get_field, nullptr, config);
+ ConfigManipulation config_manipulation(load_config, toggle_field, nullptr, config);
if (!is_object_settings)
{
const int obj_idx = objects_model->GetObjectIdByItem(item);
assert(obj_idx >= 0);
- DynamicPrintConfig* obj_config = &wxGetApp().model().objects[obj_idx]->config;
-
- main_config.apply(*obj_config, true);
+ main_config.apply(wxGetApp().model().objects[obj_idx]->config.get(), true);
printer_technology == ptFFF ? config_manipulation.update_print_fff_config(&main_config) :
config_manipulation.update_print_sla_config(&main_config) ;
}
- main_config.apply(*config, true);
+ main_config.apply(config->get(), true);
printer_technology == ptFFF ? config_manipulation.update_print_fff_config(&main_config) :
config_manipulation.update_print_sla_config(&main_config) ;
diff --git a/src/slic3r/GUI/GUI_ObjectSettings.hpp b/src/slic3r/GUI/GUI_ObjectSettings.hpp
index ff187eddc..91cfe1dda 100644
--- a/src/slic3r/GUI/GUI_ObjectSettings.hpp
+++ b/src/slic3r/GUI/GUI_ObjectSettings.hpp
@@ -10,6 +10,7 @@ class wxBoxSizer;
namespace Slic3r {
class DynamicPrintConfig;
+class ModelConfig;
namespace GUI {
class ConfigOptionsGroup;
@@ -52,8 +53,8 @@ public:
* Example: if Infill is set to 100%, and Fill Pattern is missed in config_to,
* we should add fill_pattern to avoid endless loop in update
*/
- bool add_missed_options(DynamicPrintConfig *config_to, const DynamicPrintConfig &config_from);
- void update_config_values(DynamicPrintConfig*config);
+ bool add_missed_options(ModelConfig *config_to, const DynamicPrintConfig &config_from);
+ void update_config_values(ModelConfig *config);
void UpdateAndShow(const bool show) override;
void msw_rescale();
};
diff --git a/src/slic3r/GUI/GUI_Preview.cpp b/src/slic3r/GUI/GUI_Preview.cpp
index 1ae73a192..bca27fa21 100644
--- a/src/slic3r/GUI/GUI_Preview.cpp
+++ b/src/slic3r/GUI/GUI_Preview.cpp
@@ -1,16 +1,16 @@
#include "libslic3r/libslic3r.h"
-#include "libslic3r/GCode/PreviewData.hpp"
#include "GUI_Preview.hpp"
#include "GUI_App.hpp"
#include "GUI.hpp"
#include "I18N.hpp"
-#include "AppConfig.hpp"
#include "3DScene.hpp"
#include "BackgroundSlicingProcess.hpp"
-#include "GLCanvas3DManager.hpp"
+#include "OpenGLManager.hpp"
#include "GLCanvas3D.hpp"
-#include "PresetBundle.hpp"
+#include "libslic3r/PresetBundle.hpp"
#include "DoubleSlider.hpp"
+#include "Plater.hpp"
+#include "MainFrame.hpp"
#include <wx/notebook.h>
#include <wx/glcanvas.h>
@@ -27,33 +27,35 @@
namespace Slic3r {
namespace GUI {
-View3D::View3D(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process)
+View3D::View3D(wxWindow* parent, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process)
: m_canvas_widget(nullptr)
, m_canvas(nullptr)
{
- init(parent, bed, camera, view_toolbar, model, config, process);
+ init(parent, model, config, process);
}
View3D::~View3D()
{
+ if (m_canvas != nullptr)
+ delete m_canvas;
+
if (m_canvas_widget != nullptr)
- {
- _3DScene::remove_canvas(m_canvas_widget);
delete m_canvas_widget;
- m_canvas = nullptr;
- }
}
-bool View3D::init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process)
+bool View3D::init(wxWindow* parent, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process)
{
if (!Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 /* disable wxTAB_TRAVERSAL */))
return false;
- m_canvas_widget = GLCanvas3DManager::create_wxglcanvas(this);
- _3DScene::add_canvas(m_canvas_widget, bed, camera, view_toolbar);
- m_canvas = _3DScene::get_canvas(this->m_canvas_widget);
+ m_canvas_widget = OpenGLManager::create_wxglcanvas(*this);
+ if (m_canvas_widget == nullptr)
+ return false;
+
+ m_canvas = new GLCanvas3D(m_canvas_widget);
+ m_canvas->set_context(wxGetApp().init_glcontext(*m_canvas_widget));
- m_canvas->allow_multisample(GLCanvas3DManager::can_multisample());
+ m_canvas->allow_multisample(OpenGLManager::can_multisample());
// XXX: If have OpenGL
m_canvas->enable_picking(true);
m_canvas->enable_moving(true);
@@ -66,6 +68,7 @@ bool View3D::init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_
m_canvas->enable_main_toolbar(true);
m_canvas->enable_undoredo_toolbar(true);
m_canvas->enable_labels(true);
+ m_canvas->enable_slope(true);
wxBoxSizer* main_sizer = new wxBoxSizer(wxVERTICAL);
main_sizer->Add(m_canvas_widget, 1, wxALL | wxEXPAND, 0);
@@ -164,123 +167,130 @@ void View3D::render()
}
Preview::Preview(
- wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model, DynamicPrintConfig* config,
- BackgroundSlicingProcess* process, GCodePreviewData* gcode_preview_data, std::function<void()> schedule_background_process_func)
- : m_canvas_widget(nullptr)
- , m_canvas(nullptr)
- , m_double_slider_sizer(nullptr)
- , m_label_view_type(nullptr)
- , m_choice_view_type(nullptr)
- , m_label_show_features(nullptr)
- , m_combochecklist_features(nullptr)
- , m_checkbox_travel(nullptr)
- , m_checkbox_retractions(nullptr)
- , m_checkbox_unretractions(nullptr)
- , m_checkbox_shells(nullptr)
- , m_checkbox_legend(nullptr)
- , m_config(config)
+ wxWindow* parent, Model* model, DynamicPrintConfig* config,
+ BackgroundSlicingProcess* process, GCodeProcessor::Result* gcode_result, std::function<void()> schedule_background_process_func)
+ : m_config(config)
, m_process(process)
- , m_gcode_preview_data(gcode_preview_data)
- , m_number_extruders(1)
+ , m_gcode_result(gcode_result)
+#if !ENABLE_PREVIEW_TYPE_CHANGE
, m_preferred_color_mode("feature")
- , m_loaded(false)
- , m_enabled(false)
+#endif // !ENABLE_PREVIEW_TYPE_CHANGE
, m_schedule_background_process(schedule_background_process_func)
-#ifdef __linux__
- , m_volumes_cleanup_required(false)
-#endif // __linux__
{
- if (init(parent, bed, camera, view_toolbar, model))
- {
- show_hide_ui_elements("none");
+ if (init(parent, model))
load_print();
- }
}
-bool Preview::init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model)
+bool Preview::init(wxWindow* parent, Model* model)
{
if (!Create(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, 0 /* disable wxTAB_TRAVERSAL */))
return false;
- m_canvas_widget = GLCanvas3DManager::create_wxglcanvas(this);
- _3DScene::add_canvas(m_canvas_widget, bed, camera, view_toolbar);
- m_canvas = _3DScene::get_canvas(this->m_canvas_widget);
- m_canvas->allow_multisample(GLCanvas3DManager::can_multisample());
+ // to match the background of the sliders
+#ifdef _WIN32
+ SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
+#else
+ SetBackgroundColour(GetParent()->GetBackgroundColour());
+#endif // _WIN32
+
+ m_canvas_widget = OpenGLManager::create_wxglcanvas(*this);
+ if (m_canvas_widget == nullptr)
+ return false;
+
+ m_canvas = new GLCanvas3D(m_canvas_widget);
+ m_canvas->set_context(wxGetApp().init_glcontext(*m_canvas_widget));
+ m_canvas->allow_multisample(OpenGLManager::can_multisample());
m_canvas->set_config(m_config);
m_canvas->set_model(model);
m_canvas->set_process(m_process);
m_canvas->enable_legend_texture(true);
m_canvas->enable_dynamic_background(true);
- m_double_slider_sizer = new wxBoxSizer(wxHORIZONTAL);
- create_double_slider();
-
- m_label_view_type = new wxStaticText(this, wxID_ANY, _(L("View")));
-
- m_choice_view_type = new wxChoice(this, wxID_ANY);
- m_choice_view_type->Append(_(L("Feature type")));
- m_choice_view_type->Append(_(L("Height")));
- m_choice_view_type->Append(_(L("Width")));
- m_choice_view_type->Append(_(L("Speed")));
- m_choice_view_type->Append(_(L("Fan speed")));
- m_choice_view_type->Append(_(L("Volumetric flow rate")));
- m_choice_view_type->Append(_(L("Tool")));
- m_choice_view_type->Append(_(L("Color Print")));
+ m_layers_slider_sizer = create_layers_slider_sizer();
+
+ m_bottom_toolbar_panel = new wxPanel(this);
+ m_label_view_type = new wxStaticText(m_bottom_toolbar_panel, wxID_ANY, _L("View"));
+ m_choice_view_type = new wxChoice(m_bottom_toolbar_panel, wxID_ANY);
+ m_choice_view_type->Append(_L("Feature type"));
+ m_choice_view_type->Append(_L("Height"));
+ m_choice_view_type->Append(_L("Width"));
+ m_choice_view_type->Append(_L("Speed"));
+ m_choice_view_type->Append(_L("Fan speed"));
+ m_choice_view_type->Append(_L("Volumetric flow rate"));
+ m_choice_view_type->Append(_L("Tool"));
+ m_choice_view_type->Append(_L("Color Print"));
m_choice_view_type->SetSelection(0);
- m_label_show_features = new wxStaticText(this, wxID_ANY, _(L("Show")));
+ m_label_show = new wxStaticText(m_bottom_toolbar_panel, wxID_ANY, _L("Show"));
m_combochecklist_features = new wxComboCtrl();
- m_combochecklist_features->Create(this, wxID_ANY, _(L("Feature types")), wxDefaultPosition, wxSize(15 * wxGetApp().em_unit(), -1), wxCB_READONLY);
- std::string feature_text = GUI::into_u8(_(L("Feature types")));
+ m_combochecklist_features->Create(m_bottom_toolbar_panel, wxID_ANY, _L("Feature types"), wxDefaultPosition, wxDefaultSize, wxCB_READONLY);
std::string feature_items = GUI::into_u8(
- _(L("Perimeter")) + "|" +
- _(L("External perimeter")) + "|" +
- _(L("Overhang perimeter")) + "|" +
- _(L("Internal infill")) + "|" +
- _(L("Solid infill")) + "|" +
- _(L("Top solid infill")) + "|" +
- _(L("Bridge infill")) + "|" +
- _(L("Gap fill")) + "|" +
- _(L("Skirt")) + "|" +
- _(L("Support material")) + "|" +
- _(L("Support material interface")) + "|" +
- _(L("Wipe tower")) + "|" +
- _(L("Custom"))
+ _L("Unknown") + "|1|" +
+ _L("Perimeter") + "|1|" +
+ _L("External perimeter") + "|1|" +
+ _L("Overhang perimeter") + "|1|" +
+ _L("Internal infill") + "|1|" +
+ _L("Solid infill") + "|1|" +
+ _L("Top solid infill") + "|1|" +
+ _L("Ironing") + "|1|" +
+ _L("Bridge infill") + "|1|" +
+ _L("Gap fill") + "|1|" +
+ _L("Skirt") + "|1|" +
+ _L("Support material") + "|1|" +
+ _L("Support material interface") + "|1|" +
+ _L("Wipe tower") + "|1|" +
+ _L("Custom") + "|1"
);
- Slic3r::GUI::create_combochecklist(m_combochecklist_features, feature_text, feature_items, true);
-
- m_checkbox_travel = new wxCheckBox(this, wxID_ANY, _(L("Travel")));
- m_checkbox_retractions = new wxCheckBox(this, wxID_ANY, _(L("Retractions")));
- m_checkbox_unretractions = new wxCheckBox(this, wxID_ANY, _(L("Unretractions")));
- m_checkbox_shells = new wxCheckBox(this, wxID_ANY, _(L("Shells")));
- m_checkbox_legend = new wxCheckBox(this, wxID_ANY, _(L("Legend")));
- m_checkbox_legend->SetValue(true);
-
- wxBoxSizer* top_sizer = new wxBoxSizer(wxHORIZONTAL);
- top_sizer->Add(m_canvas_widget, 1, wxALL | wxEXPAND, 0);
- top_sizer->Add(m_double_slider_sizer, 0, wxEXPAND, 0);
-
- wxBoxSizer* bottom_sizer = new wxBoxSizer(wxHORIZONTAL);
- bottom_sizer->Add(m_label_view_type, 0, wxALIGN_CENTER_VERTICAL, 5);
- bottom_sizer->Add(m_choice_view_type, 0, wxEXPAND | wxALL, 5);
- bottom_sizer->AddSpacer(10);
- bottom_sizer->Add(m_label_show_features, 0, wxALIGN_CENTER_VERTICAL, 5);
- bottom_sizer->Add(m_combochecklist_features, 0, wxEXPAND | wxALL, 5);
- bottom_sizer->AddSpacer(20);
- bottom_sizer->Add(m_checkbox_travel, 0, wxEXPAND | wxALL, 5);
- bottom_sizer->AddSpacer(10);
- bottom_sizer->Add(m_checkbox_retractions, 0, wxEXPAND | wxALL, 5);
- bottom_sizer->AddSpacer(10);
- bottom_sizer->Add(m_checkbox_unretractions, 0, wxEXPAND | wxALL, 5);
- bottom_sizer->AddSpacer(10);
- bottom_sizer->Add(m_checkbox_shells, 0, wxEXPAND | wxALL, 5);
- bottom_sizer->AddSpacer(20);
- bottom_sizer->Add(m_checkbox_legend, 0, wxEXPAND | wxALL, 5);
-
- wxBoxSizer* main_sizer = new wxBoxSizer(wxVERTICAL);
- main_sizer->Add(top_sizer, 1, wxALL | wxEXPAND, 0);
- main_sizer->Add(bottom_sizer, 0, wxALL | wxEXPAND, 0);
+ Slic3r::GUI::create_combochecklist(m_combochecklist_features, GUI::into_u8(_L("Feature types")), feature_items);
+
+ m_combochecklist_options = new wxComboCtrl();
+ m_combochecklist_options->Create(m_bottom_toolbar_panel, wxID_ANY, _L("Options"), wxDefaultPosition, wxDefaultSize, wxCB_READONLY);
+ std::string options_items = GUI::into_u8(
+ get_option_type_string(OptionType::Travel) + "|0|" +
+ get_option_type_string(OptionType::Wipe) + "|0|" +
+ get_option_type_string(OptionType::Retractions) + "|0|" +
+ get_option_type_string(OptionType::Unretractions) + "|0|" +
+ get_option_type_string(OptionType::ToolChanges) + "|0|" +
+ get_option_type_string(OptionType::ColorChanges) + "|0|" +
+ 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) + "|1|" +
+ get_option_type_string(OptionType::Legend) + "|1"
+ );
+ Slic3r::GUI::create_combochecklist(m_combochecklist_options, GUI::into_u8(_L("Options")), options_items);
+
+ m_left_sizer = new wxBoxSizer(wxVERTICAL);
+ m_left_sizer->Add(m_canvas_widget, 1, wxALL | wxEXPAND, 0);
+
+ wxBoxSizer* right_sizer = new wxBoxSizer(wxVERTICAL);
+ right_sizer->Add(m_layers_slider_sizer, 1, wxEXPAND, 0);
+
+ m_moves_slider = new DoubleSlider::Control(m_bottom_toolbar_panel, wxID_ANY, 0, 0, 0, 100, wxDefaultPosition, wxDefaultSize, wxSL_HORIZONTAL);
+ m_moves_slider->SetDrawMode(DoubleSlider::dmSequentialGCodeView);
+
+ wxBoxSizer* bottom_toolbar_sizer = new wxBoxSizer(wxHORIZONTAL);
+ bottom_toolbar_sizer->AddSpacer(5);
+ bottom_toolbar_sizer->Add(m_label_view_type, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 5);
+ bottom_toolbar_sizer->Add(m_choice_view_type, 0, wxALIGN_CENTER_VERTICAL, 0);
+ bottom_toolbar_sizer->AddSpacer(5);
+ bottom_toolbar_sizer->Add(m_label_show, 0, wxALIGN_CENTER_VERTICAL | wxLEFT | wxRIGHT, 5);
+ bottom_toolbar_sizer->Add(m_combochecklist_options, 0, wxALIGN_CENTER_VERTICAL, 0);
+ // change the following number if editing the layout of the bottom toolbar sizer. It is used into update_bottom_toolbar()
+ m_combochecklist_features_pos = 6;
+ bottom_toolbar_sizer->Add(m_combochecklist_features, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, 5);
+ bottom_toolbar_sizer->Hide(m_combochecklist_features);
+ bottom_toolbar_sizer->AddSpacer(5);
+ bottom_toolbar_sizer->Add(m_moves_slider, 1, wxALL | wxEXPAND, 0);
+ m_bottom_toolbar_panel->SetSizer(bottom_toolbar_sizer);
+
+ m_left_sizer->Add(m_bottom_toolbar_panel, 0, wxALL | wxEXPAND, 0);
+ m_left_sizer->Hide(m_bottom_toolbar_panel);
+
+ wxBoxSizer* main_sizer = new wxBoxSizer(wxHORIZONTAL);
+ main_sizer->Add(m_left_sizer, 1, wxALL | wxEXPAND, 0);
+ main_sizer->Add(right_sizer, 0, wxALL | wxEXPAND, 0);
SetSizer(main_sizer);
SetMinSize(GetSize());
@@ -288,24 +298,6 @@ bool Preview::init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view
bind_event_handlers();
- // sets colors for gcode preview extrusion roles
- std::vector<std::string> extrusion_roles_colors = {
- "Perimeter", "FFFF66",
- "External perimeter", "FFA500",
- "Overhang perimeter", "0000FF",
- "Internal infill", "B1302A",
- "Solid infill", "D732D7",
- "Top solid infill", "FF1A1A",
- "Bridge infill", "9999FF",
- "Gap fill", "FFFFFF",
- "Skirt", "845321",
- "Support material", "00FF00",
- "Support material interface", "008000",
- "Wipe tower", "B3E3AB",
- "Custom", "28CC94"
- };
- m_gcode_preview_data->set_extrusion_paths_colors(extrusion_roles_colors);
-
return true;
}
@@ -313,12 +305,11 @@ Preview::~Preview()
{
unbind_event_handlers();
+ if (m_canvas != nullptr)
+ delete m_canvas;
+
if (m_canvas_widget != nullptr)
- {
- _3DScene::remove_canvas(m_canvas_widget);
delete m_canvas_widget;
- m_canvas = nullptr;
- }
}
void Preview::set_as_dirty()
@@ -327,25 +318,21 @@ void Preview::set_as_dirty()
m_canvas->set_as_dirty();
}
+#if !ENABLE_PREVIEW_TYPE_CHANGE
void Preview::set_number_extruders(unsigned int number_extruders)
{
- if (m_number_extruders != number_extruders)
- {
+ if (m_number_extruders != number_extruders) {
m_number_extruders = number_extruders;
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 ((0 <= type) && (type < (int)GCodePreviewData::Extrusion::Num_View_Types))
- m_gcode_preview_data->extrusion.view_type = (GCodePreviewData::Extrusion::EViewType)type;
+ if (0 <= type && (type < static_cast<int>(GCodeViewer::EViewType::Count)))
+ m_canvas->set_gcode_view_preview_type(static_cast<GCodeViewer::EViewType>(type));
m_preferred_color_mode = (type == tool_idx) ? "tool_or_feature" : "feature";
}
}
-
-void Preview::set_enabled(bool enabled)
-{
- m_enabled = enabled;
-}
+#endif // !ENABLE_PREVIEW_TYPE_CHANGE
void Preview::bed_shape_changed()
{
@@ -372,6 +359,7 @@ void Preview::load_print(bool keep_z_range)
else if (tech == ptSLA)
load_print_as_sla();
+ update_bottom_toolbar();
Layout();
}
@@ -385,7 +373,7 @@ void Preview::reload_print(bool keep_volumes)
m_volumes_cleanup_required = !keep_volumes;
return;
}
-#endif /* __linux __ */
+#endif /* __linux__ */
if (
#ifdef __linux__
m_volumes_cleanup_required ||
@@ -393,7 +381,6 @@ void Preview::reload_print(bool keep_volumes)
!keep_volumes)
{
m_canvas->reset_volumes();
- m_canvas->reset_legend_texture();
m_loaded = false;
#ifdef __linux__
m_volumes_cleanup_required = false;
@@ -416,7 +403,8 @@ void Preview::refresh_print()
void Preview::msw_rescale()
{
// rescale slider
- if (m_slider) m_slider->msw_rescale();
+ if (m_layers_slider != nullptr) m_layers_slider->msw_rescale();
+ if (m_moves_slider != nullptr) m_moves_slider->msw_rescale();
// rescale warning legend on the canvas
get_canvas3d()->msw_rescale();
@@ -425,16 +413,19 @@ void Preview::msw_rescale()
refresh_print();
}
-void Preview::move_double_slider(wxKeyEvent& evt)
+void Preview::jump_layers_slider(wxKeyEvent& evt)
{
- if (m_slider)
- m_slider->OnKeyDown(evt);
+ if (m_layers_slider) m_layers_slider->OnChar(evt);
}
-void Preview::edit_double_slider(wxKeyEvent& evt)
+void Preview::move_layers_slider(wxKeyEvent& evt)
{
- if (m_slider)
- m_slider->OnChar(evt);
+ if (m_layers_slider != nullptr) m_layers_slider->OnKeyDown(evt);
+}
+
+void Preview::edit_layers_slider(wxKeyEvent& evt)
+{
+ if (m_layers_slider != nullptr) m_layers_slider->OnChar(evt);
}
void Preview::bind_event_handlers()
@@ -442,11 +433,8 @@ void Preview::bind_event_handlers()
this->Bind(wxEVT_SIZE, &Preview::on_size, this);
m_choice_view_type->Bind(wxEVT_CHOICE, &Preview::on_choice_view_type, this);
m_combochecklist_features->Bind(wxEVT_CHECKLISTBOX, &Preview::on_combochecklist_features, this);
- m_checkbox_travel->Bind(wxEVT_CHECKBOX, &Preview::on_checkbox_travel, this);
- m_checkbox_retractions->Bind(wxEVT_CHECKBOX, &Preview::on_checkbox_retractions, this);
- m_checkbox_unretractions->Bind(wxEVT_CHECKBOX, &Preview::on_checkbox_unretractions, this);
- m_checkbox_shells->Bind(wxEVT_CHECKBOX, &Preview::on_checkbox_shells, this);
- m_checkbox_legend->Bind(wxEVT_CHECKBOX, &Preview::on_checkbox_legend, this);
+ m_combochecklist_options->Bind(wxEVT_CHECKLISTBOX, &Preview::on_combochecklist_options, this);
+ m_moves_slider->Bind(wxEVT_SCROLL_CHANGED, &Preview::on_moves_slider_scroll_changed, this);
}
void Preview::unbind_event_handlers()
@@ -454,57 +442,20 @@ void Preview::unbind_event_handlers()
this->Unbind(wxEVT_SIZE, &Preview::on_size, this);
m_choice_view_type->Unbind(wxEVT_CHOICE, &Preview::on_choice_view_type, this);
m_combochecklist_features->Unbind(wxEVT_CHECKLISTBOX, &Preview::on_combochecklist_features, this);
- m_checkbox_travel->Unbind(wxEVT_CHECKBOX, &Preview::on_checkbox_travel, this);
- m_checkbox_retractions->Unbind(wxEVT_CHECKBOX, &Preview::on_checkbox_retractions, this);
- m_checkbox_unretractions->Unbind(wxEVT_CHECKBOX, &Preview::on_checkbox_unretractions, this);
- m_checkbox_shells->Unbind(wxEVT_CHECKBOX, &Preview::on_checkbox_shells, this);
- m_checkbox_legend->Unbind(wxEVT_CHECKBOX, &Preview::on_checkbox_legend, this);
-}
-
-void Preview::show_hide_ui_elements(const std::string& what)
-{
- bool enable = (what == "full");
- m_label_show_features->Enable(enable);
- m_combochecklist_features->Enable(enable);
- m_checkbox_travel->Enable(enable);
- m_checkbox_retractions->Enable(enable);
- m_checkbox_unretractions->Enable(enable);
- m_checkbox_shells->Enable(enable);
- m_checkbox_legend->Enable(enable);
-
- enable = (what != "none");
- m_label_view_type->Enable(enable);
- m_choice_view_type->Enable(enable);
-
- bool visible = (what != "none");
- m_label_show_features->Show(visible);
- m_combochecklist_features->Show(visible);
- m_checkbox_travel->Show(visible);
- m_checkbox_retractions->Show(visible);
- m_checkbox_unretractions->Show(visible);
- m_checkbox_shells->Show(visible);
- m_checkbox_legend->Show(visible);
- m_label_view_type->Show(visible);
- m_choice_view_type->Show(visible);
-}
-
-void Preview::reset_sliders(bool reset_all)
-{
- m_enabled = false;
-// reset_double_slider();
- if (reset_all)
- m_double_slider_sizer->Hide((size_t)0);
- else
- m_double_slider_sizer->GetItem(size_t(0))->GetSizer()->Hide(1);
+ m_combochecklist_options->Unbind(wxEVT_CHECKLISTBOX, &Preview::on_combochecklist_options, this);
+ m_moves_slider->Unbind(wxEVT_SCROLL_CHANGED, &Preview::on_moves_slider_scroll_changed, this);
}
-void Preview::update_sliders(const std::vector<double>& layers_z, bool keep_z_range)
+#if ENABLE_ARROW_KEYS_WITH_SLIDERS
+void Preview::move_moves_slider(wxKeyEvent& evt)
{
- m_enabled = true;
-
- update_double_slider(layers_z, keep_z_range);
- m_double_slider_sizer->Show((size_t)0);
+ if (m_moves_slider != nullptr) m_moves_slider->OnKeyDown(evt);
+}
+#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS
+void Preview::hide_layers_slider()
+{
+ m_layers_slider_sizer->Hide((size_t)0);
Layout();
}
@@ -516,102 +467,147 @@ void Preview::on_size(wxSizeEvent& evt)
void Preview::on_choice_view_type(wxCommandEvent& evt)
{
+#if !ENABLE_PREVIEW_TYPE_CHANGE
m_preferred_color_mode = (m_choice_view_type->GetStringSelection() == L("Tool")) ? "tool" : "feature";
+#endif // !ENABLE_PREVIEW_TYPE_CHANGE
int selection = m_choice_view_type->GetCurrentSelection();
- if ((0 <= selection) && (selection < (int)GCodePreviewData::Extrusion::Num_View_Types))
- m_gcode_preview_data->extrusion.view_type = (GCodePreviewData::Extrusion::EViewType)selection;
+#if ENABLE_PREVIEW_TYPE_CHANGE
+ if (0 <= selection && selection < static_cast<int>(GCodeViewer::EViewType::Count)) {
+ m_canvas->set_toolpath_view_type(static_cast<GCodeViewer::EViewType>(selection));
+ m_keep_current_preview_type = true;
+ }
+#else
+ if (0 <= selection && selection < static_cast<int>(GCodeViewer::EViewType::Count))
+ m_canvas->set_toolpath_view_type(static_cast<GCodeViewer::EViewType>(selection));
+#endif // ENABLE_PREVIEW_TYPE_CHANGE
- reload_print();
+ refresh_print();
}
void Preview::on_combochecklist_features(wxCommandEvent& evt)
{
- int flags = Slic3r::GUI::combochecklist_get_flags(m_combochecklist_features);
- m_gcode_preview_data->extrusion.role_flags = (unsigned int)flags;
+ unsigned int flags = Slic3r::GUI::combochecklist_get_flags(m_combochecklist_features);
+ m_canvas->set_toolpath_role_visibility_flags(flags);
refresh_print();
}
-void Preview::on_checkbox_travel(wxCommandEvent& evt)
+void Preview::on_combochecklist_options(wxCommandEvent& evt)
{
- m_gcode_preview_data->travel.is_visible = m_checkbox_travel->IsChecked();
- m_gcode_preview_data->ranges.feedrate.set_mode(GCodePreviewData::FeedrateKind::TRAVEL, m_gcode_preview_data->travel.is_visible);
- // Rather than refresh, reload print so that speed color ranges get recomputed (affected by travel visibility)
- reload_print();
-}
+ auto xored = [](unsigned int flags1, unsigned int flags2, unsigned int flag) {
+ auto is_flag_set = [](unsigned int flags, unsigned int flag) {
+ return (flags & (1 << flag)) != 0;
+ };
+ return !is_flag_set(flags1, flag) != !is_flag_set(flags2, flag);
+ };
-void Preview::on_checkbox_retractions(wxCommandEvent& evt)
-{
- m_gcode_preview_data->retraction.is_visible = m_checkbox_retractions->IsChecked();
- refresh_print();
-}
+ unsigned int curr_flags = m_canvas->get_gcode_options_visibility_flags();
+ unsigned int new_flags = Slic3r::GUI::combochecklist_get_flags(m_combochecklist_options);
+ if (curr_flags == new_flags)
+ return;
-void Preview::on_checkbox_unretractions(wxCommandEvent& evt)
-{
- m_gcode_preview_data->unretraction.is_visible = m_checkbox_unretractions->IsChecked();
- refresh_print();
-}
+ m_canvas->set_gcode_options_visibility_from_flags(new_flags);
-void Preview::on_checkbox_shells(wxCommandEvent& evt)
-{
- m_gcode_preview_data->shell.is_visible = m_checkbox_shells->IsChecked();
- refresh_print();
-}
+#if ENABLE_RENDER_PATH_REFRESH_AFTER_OPTIONS_CHANGE
+ m_canvas->refresh_gcode_preview_render_paths();
+#else
+ bool skip_refresh = xored(curr_flags, new_flags, static_cast<unsigned int>(OptionType::Shells)) ||
+ xored(curr_flags, new_flags, static_cast<unsigned int>(OptionType::ToolMarker));
-void Preview::on_checkbox_legend(wxCommandEvent& evt)
-{
- m_canvas->enable_legend_texture(m_checkbox_legend->IsChecked());
- m_canvas_widget->Refresh();
+ if (!skip_refresh)
+ refresh_print();
+ else
+ m_canvas->set_as_dirty();
+#endif // ENABLE_RENDER_PATH_REFRESH_AFTER_OPTIONS_CHANGE
}
-void Preview::update_view_type(bool slice_completed)
+#if !ENABLE_PREVIEW_TYPE_CHANGE
+void Preview::update_view_type(bool keep_volumes)
{
const DynamicPrintConfig& config = wxGetApp().preset_bundle->project_config;
const wxString& choice = !wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes.empty() /*&&
(wxGetApp().extruders_edited_cnt()==1 || !slice_completed) */?
- _(L("Color Print")) :
+ _L("Color Print") :
config.option<ConfigOptionFloats>("wiping_volumes_matrix")->values.size() > 1 ?
- _(L("Tool")) :
- _(L("Feature type"));
+ _L("Tool") :
+ _L("Feature type");
int type = m_choice_view_type->FindString(choice);
if (m_choice_view_type->GetSelection() != type) {
m_choice_view_type->SetSelection(type);
- if (0 <= type && type < (int)GCodePreviewData::Extrusion::Num_View_Types)
- m_gcode_preview_data->extrusion.view_type = (GCodePreviewData::Extrusion::EViewType)type;
+ if (0 <= type && type < static_cast<int>(GCodeViewer::EViewType::Count))
+ m_canvas->set_gcode_view_preview_type(static_cast<GCodeViewer::EViewType>(type));
m_preferred_color_mode = "feature";
}
+
+ reload_print(keep_volumes);
}
+#endif // !ENABLE_PREVIEW_TYPE_CHANGE
-void Preview::create_double_slider()
+void Preview::update_bottom_toolbar()
{
- m_slider = new DoubleSlider::Control(this, wxID_ANY, 0, 0, 0, 100);
- bool sla_print_technology = wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA;
- bool sequential_print = wxGetApp().preset_bundle->prints.get_edited_preset().config.opt_bool("complete_objects");
- m_slider->SetDrawMode(sla_print_technology, sequential_print);
+ combochecklist_set_flags(m_combochecklist_features, m_canvas->get_toolpath_role_visibility_flags());
+ combochecklist_set_flags(m_combochecklist_options, m_canvas->get_gcode_options_visibility_flags());
+
+ // updates visibility of features combobox
+ if (m_bottom_toolbar_panel->IsShown()) {
+ wxSizer* sizer = m_bottom_toolbar_panel->GetSizer();
+ bool show = !m_canvas->is_gcode_legend_enabled() || m_canvas->get_gcode_view_type() != GCodeViewer::EViewType::FeatureType;
+
+ if (show) {
+ if (sizer->GetItem(m_combochecklist_features) == nullptr) {
+ sizer->Insert(m_combochecklist_features_pos, m_combochecklist_features, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, 5);
+ sizer->Show(m_combochecklist_features);
+ sizer->Layout();
+ Refresh();
+ }
+ }
+ else {
+ if (sizer->GetItem(m_combochecklist_features) != nullptr) {
+ sizer->Hide(m_combochecklist_features);
+ sizer->Detach(m_combochecklist_features);
+ sizer->Layout();
+ Refresh();
+ }
+ }
+ }
+}
+
+wxBoxSizer* Preview::create_layers_slider_sizer()
+{
+ wxBoxSizer* sizer = new wxBoxSizer(wxHORIZONTAL);
+ m_layers_slider = new DoubleSlider::Control(this, wxID_ANY, 0, 0, 0, 100);
+
+ m_layers_slider->SetDrawMode(wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA,
+ wxGetApp().preset_bundle->prints.get_edited_preset().config.opt_bool("complete_objects"));
+ m_layers_slider->enable_action_icon(wxGetApp().is_editor());
- m_double_slider_sizer->Add(m_slider, 0, wxEXPAND, 0);
+ sizer->Add(m_layers_slider, 0, wxEXPAND, 0);
// sizer, m_canvas_widget
- m_canvas_widget->Bind(wxEVT_KEY_DOWN, &Preview::update_double_slider_from_canvas, this);
+ m_canvas_widget->Bind(wxEVT_KEY_DOWN, &Preview::update_layers_slider_from_canvas, this);
m_canvas_widget->Bind(wxEVT_KEY_UP, [this](wxKeyEvent& event) {
if (event.GetKeyCode() == WXK_SHIFT)
- m_slider->UseDefaultColors(true);
+ m_layers_slider->UseDefaultColors(true);
event.Skip();
- });
-
- m_slider->Bind(wxEVT_SCROLL_CHANGED, &Preview::on_sliders_scroll_changed, this);
+ });
+ m_layers_slider->Bind(wxEVT_SCROLL_CHANGED, &Preview::on_layers_slider_scroll_changed, this);
Bind(DoubleSlider::wxCUSTOMEVT_TICKSCHANGED, [this](wxEvent&) {
Model& model = wxGetApp().plater()->model();
- model.custom_gcode_per_print_z = m_slider->GetTicksValues();
+ model.custom_gcode_per_print_z = m_layers_slider->GetTicksValues();
m_schedule_background_process();
+#if ENABLE_PREVIEW_TYPE_CHANGE
+ m_keep_current_preview_type = false;
+ reload_print(false);
+#else
update_view_type(false);
+#endif // ENABLE_PREVIEW_TYPE_CHANGE
+ });
- reload_print();
- });
+ return sizer;
}
// Find an index of a value in a sorted vector, which is in <z-eps, z+eps>.
@@ -641,8 +637,7 @@ static int find_close_layer_idx(const std::vector<double>& zs, double &z, double
return -1;
}
-void Preview::check_slider_values(std::vector<CustomGCode::Item>& ticks_from_model,
- const std::vector<double>& layers_z)
+void Preview::check_layers_slider_values(std::vector<CustomGCode::Item>& ticks_from_model, const std::vector<double>& layers_z)
{
// All ticks that would end up outside the slider range should be erased.
// TODO: this should be placed into more appropriate part of code,
@@ -659,57 +654,64 @@ void Preview::check_slider_values(std::vector<CustomGCode::Item>& ticks_from_mod
m_schedule_background_process();
}
-void Preview::update_double_slider(const std::vector<double>& layers_z, bool keep_z_range)
+void Preview::update_layers_slider(const std::vector<double>& layers_z, bool keep_z_range)
{
// Save the initial slider span.
- double z_low = m_slider->GetLowerValueD();
- double z_high = m_slider->GetHigherValueD();
- bool was_empty = m_slider->GetMaxValue() == 0;
+ double z_low = m_layers_slider->GetLowerValueD();
+ double z_high = m_layers_slider->GetHigherValueD();
+ bool was_empty = m_layers_slider->GetMaxValue() == 0;
+
bool force_sliders_full_range = was_empty;
if (!keep_z_range)
{
- bool span_changed = layers_z.empty() || std::abs(layers_z.back() - m_slider->GetMaxValueD()) > DoubleSlider::epsilon()/*1e-6*/;
+ bool span_changed = layers_z.empty() || std::abs(layers_z.back() - m_layers_slider->GetMaxValueD()) > DoubleSlider::epsilon()/*1e-6*/;
force_sliders_full_range |= span_changed;
}
- bool snap_to_min = force_sliders_full_range || m_slider->is_lower_at_min();
- bool snap_to_max = force_sliders_full_range || m_slider->is_higher_at_max();
+ bool snap_to_min = force_sliders_full_range || m_layers_slider->is_lower_at_min();
+ bool snap_to_max = force_sliders_full_range || m_layers_slider->is_higher_at_max();
// Detect and set manipulation mode for double slider
- update_double_slider_mode();
+ update_layers_slider_mode();
- CustomGCode::Info &ticks_info_from_model = wxGetApp().plater()->model().custom_gcode_per_print_z;
- check_slider_values(ticks_info_from_model.gcodes, layers_z);
+ Plater* plater = wxGetApp().plater();
+ CustomGCode::Info& ticks_info_from_model = plater->model().custom_gcode_per_print_z;
+ check_layers_slider_values(ticks_info_from_model.gcodes, layers_z);
- m_slider->SetSliderValues(layers_z);
- assert(m_slider->GetMinValue() == 0);
- m_slider->SetMaxValue(layers_z.empty() ? 0 : layers_z.size() - 1);
+ m_layers_slider->SetSliderValues(layers_z);
+ assert(m_layers_slider->GetMinValue() == 0);
+ m_layers_slider->SetMaxValue(layers_z.empty() ? 0 : layers_z.size() - 1);
- int idx_low = 0;
- int idx_high = m_slider->GetMaxValue();
- if (! layers_z.empty()) {
- if (! snap_to_min) {
+ int idx_low = 0;
+ int idx_high = m_layers_slider->GetMaxValue();
+ if (!layers_z.empty()) {
+ if (!snap_to_min) {
int idx_new = find_close_layer_idx(layers_z, z_low, DoubleSlider::epsilon()/*1e-6*/);
if (idx_new != -1)
idx_low = idx_new;
}
- if (! snap_to_max) {
+ if (!snap_to_max) {
int idx_new = find_close_layer_idx(layers_z, z_high, DoubleSlider::epsilon()/*1e-6*/);
if (idx_new != -1)
idx_high = idx_new;
}
}
- m_slider->SetSelectionSpan(idx_low, idx_high);
+ m_layers_slider->SetSelectionSpan(idx_low, idx_high);
+ m_layers_slider->SetTicksValues(ticks_info_from_model);
- m_slider->SetTicksValues(ticks_info_from_model);
-
- bool sla_print_technology = wxGetApp().plater()->printer_technology() == ptSLA;
+ bool sla_print_technology = plater->printer_technology() == ptSLA;
bool sequential_print = wxGetApp().preset_bundle->prints.get_edited_preset().config.opt_bool("complete_objects");
- m_slider->SetDrawMode(sla_print_technology, sequential_print);
+ m_layers_slider->SetDrawMode(sla_print_technology, sequential_print);
+ m_layers_slider->SetExtruderColors(plater->get_extruder_colors_from_plater_config());
+ if (sla_print_technology)
+ m_layers_slider->SetLayersTimes(plater->sla_print().print_statistics().layers_times);
+ else
+ m_layers_slider->SetLayersTimes(m_gcode_result->time_statistics.modes.front().layers_times);
- m_slider->SetExtruderColors(wxGetApp().plater()->get_extruder_colors_from_plater_config());
+ m_layers_slider_sizer->Show((size_t)0);
+ Layout();
}
-void Preview::update_double_slider_mode()
+void Preview::update_layers_slider_mode()
{
// true -> single-extruder printer profile OR
// multi-extruder printer profile , but whole model is printed by only one extruder
@@ -758,16 +760,16 @@ void Preview::update_double_slider_mode()
}
}
- m_slider->SetModeAndOnlyExtruder(one_extruder_printed_model, only_extruder);
+ m_layers_slider->SetModeAndOnlyExtruder(one_extruder_printed_model, only_extruder);
}
-void Preview::reset_double_slider()
+void Preview::reset_layers_slider()
{
- m_slider->SetHigherValue(0);
- m_slider->SetLowerValue(0);
+ m_layers_slider->SetHigherValue(0);
+ m_layers_slider->SetLowerValue(0);
}
-void Preview::update_double_slider_from_canvas(wxKeyEvent& event)
+void Preview::update_layers_slider_from_canvas(wxKeyEvent& event)
{
if (event.HasModifiers()) {
event.Skip();
@@ -776,26 +778,66 @@ void Preview::update_double_slider_from_canvas(wxKeyEvent& event)
const auto key = event.GetKeyCode();
+#if ENABLE_ARROW_KEYS_WITH_SLIDERS
+ if (key == 'S' || key == 'W') {
+ const int new_pos = key == 'W' ? m_layers_slider->GetHigherValue() + 1 : m_layers_slider->GetHigherValue() - 1;
+#else
if (key == 'U' || key == 'D') {
- const int new_pos = key == 'U' ? m_slider->GetHigherValue() + 1 : m_slider->GetHigherValue() - 1;
- m_slider->SetHigherValue(new_pos);
- if (event.ShiftDown() || m_slider->is_one_layer()) m_slider->SetLowerValue(m_slider->GetHigherValue());
+ const int new_pos = key == 'U' ? m_layers_slider->GetHigherValue() + 1 : m_layers_slider->GetHigherValue() - 1;
+#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS
+ m_layers_slider->SetHigherValue(new_pos);
+ if (event.ShiftDown() || m_layers_slider->is_one_layer()) m_layers_slider->SetLowerValue(m_layers_slider->GetHigherValue());
}
- else if (key == 'L') {
- m_checkbox_legend->SetValue(!m_checkbox_legend->GetValue());
- auto evt = wxCommandEvent();
- on_checkbox_legend(evt);
+#if ENABLE_ARROW_KEYS_WITH_SLIDERS
+ else if (key == 'A' || key == 'D') {
+ const int new_pos = key == 'D' ? m_moves_slider->GetHigherValue() + 1 : m_moves_slider->GetHigherValue() - 1;
+ m_moves_slider->SetHigherValue(new_pos);
+ if (event.ShiftDown() || m_moves_slider->is_one_layer()) m_moves_slider->SetLowerValue(m_moves_slider->GetHigherValue());
}
+ else if (key == 'X')
+#else
else if (key == 'S')
- m_slider->ChangeOneLayerLock();
+#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS
+ m_layers_slider->ChangeOneLayerLock();
else if (key == WXK_SHIFT)
- m_slider->UseDefaultColors(false);
+ m_layers_slider->UseDefaultColors(false);
else
event.Skip();
}
+void Preview::update_moves_slider()
+{
+ const GCodeViewer::SequentialView& view = m_canvas->get_gcode_sequential_view();
+ // this should not be needed, but it is here to try to prevent rambling crashes on Mac Asan
+ if (view.endpoints.last < view.endpoints.first)
+ return;
+
+ std::vector<double> values(view.endpoints.last - view.endpoints.first + 1);
+ unsigned int count = 0;
+ for (unsigned int i = view.endpoints.first; i <= view.endpoints.last; ++i) {
+ values[count++] = static_cast<double>(i + 1);
+ }
+
+ m_moves_slider->SetSliderValues(values);
+ m_moves_slider->SetMaxValue(view.endpoints.last - view.endpoints.first);
+ m_moves_slider->SetSelectionSpan(view.current.first - view.endpoints.first, view.current.last - view.endpoints.first);
+}
+
+void Preview::enable_moves_slider(bool enable)
+{
+ bool render_as_disabled = !enable;
+ if (m_moves_slider != nullptr && m_moves_slider->is_rendering_as_disabled() != render_as_disabled) {
+ m_moves_slider->set_render_as_disabled(render_as_disabled);
+ m_moves_slider->Refresh();
+ }
+}
+
void Preview::load_print_as_fff(bool keep_z_range)
{
+ if (wxGetApp().mainframe == nullptr || wxGetApp().is_recreating_gui())
+ // avoid processing while mainframe is being constructed
+ return;
+
if (m_loaded || m_process->current_printer_technology() != ptFFF)
return;
@@ -819,68 +861,95 @@ void Preview::load_print_as_fff(bool keep_z_range)
}
}
- if (! has_layers)
- {
- reset_sliders(true);
- m_canvas->reset_legend_texture();
+ if (wxGetApp().is_editor() && !has_layers) {
+ hide_layers_slider();
+ m_left_sizer->Hide(m_bottom_toolbar_panel);
+ m_left_sizer->Layout();
+ Refresh();
m_canvas_widget->Refresh();
return;
}
- if (m_preferred_color_mode == "tool_or_feature")
- {
+#if !ENABLE_PREVIEW_TYPE_CHANGE
+ if (m_preferred_color_mode == "tool_or_feature") {
// 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 ((0 <= type) && (type < (int)GCodePreviewData::Extrusion::Num_View_Types))
- m_gcode_preview_data->extrusion.view_type = (GCodePreviewData::Extrusion::EViewType)type;
+ if (0 <= type && type < static_cast<int>(GCodeViewer::EViewType::Count))
+ m_canvas->set_gcode_view_preview_type(static_cast<GCodeViewer::EViewType>(type));
// If the->SetSelection changed the following line, revert it to "decide yourself".
m_preferred_color_mode = "tool_or_feature";
}
+#endif // !ENABLE_PREVIEW_TYPE_CHANGE
- bool gcode_preview_data_valid = print->is_step_done(psGCodeExport) && ! m_gcode_preview_data->empty();
+ GCodeViewer::EViewType gcode_view_type = m_canvas->get_gcode_view_preview_type();
+ bool gcode_preview_data_valid = !m_gcode_result->moves.empty();
// Collect colors per extruder.
std::vector<std::string> colors;
std::vector<CustomGCode::Item> color_print_values = {};
// set color print values, if it si selected "ColorPrint" view type
- if (m_gcode_preview_data->extrusion.view_type == GCodePreviewData::Extrusion::ColorPrint)
- {
- colors = wxGetApp().plater()->get_colors_for_color_print();
- colors.push_back("#808080"); // gray color for pause print or custom G-code
+ if (gcode_view_type == GCodeViewer::EViewType::ColorPrint) {
+ colors = wxGetApp().plater()->get_colors_for_color_print(m_gcode_result);
- if (!gcode_preview_data_valid)
+ if (!gcode_preview_data_valid) {
color_print_values = wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes;
+ colors.push_back("#808080"); // gray color for pause print or custom G-code
+ }
}
- else if (gcode_preview_data_valid || (m_gcode_preview_data->extrusion.view_type == GCodePreviewData::Extrusion::Tool) )
- {
- colors = wxGetApp().plater()->get_extruder_colors_from_plater_config();
+ else if (gcode_preview_data_valid || gcode_view_type == GCodeViewer::EViewType::Tool) {
+ colors = wxGetApp().plater()->get_extruder_colors_from_plater_config(m_gcode_result);
color_print_values.clear();
}
- if (IsShown())
- {
+ if (IsShown()) {
+ std::vector<double> zs;
+
m_canvas->set_selected_extruder(0);
if (gcode_preview_data_valid) {
// Load the real G-code preview.
- m_canvas->load_gcode_preview(*m_gcode_preview_data, colors);
+ m_canvas->load_gcode_preview(*m_gcode_result);
+ m_canvas->refresh_gcode_preview(*m_gcode_result, colors);
+ m_left_sizer->Show(m_bottom_toolbar_panel);
+ m_left_sizer->Layout();
+ Refresh();
+ zs = m_canvas->get_gcode_layers_zs();
m_loaded = true;
} else {
// Load the initial preview based on slices, not the final G-code.
m_canvas->load_preview(colors, color_print_values);
+ m_left_sizer->Hide(m_bottom_toolbar_panel);
+ m_left_sizer->Layout();
+ Refresh();
+ zs = m_canvas->get_volumes_print_zs(true);
}
- show_hide_ui_elements(gcode_preview_data_valid ? "full" : "simple");
- // recalculates zs and update sliders accordingly
- std::vector<double> zs = m_canvas->get_current_print_zs(true);
if (zs.empty()) {
// all layers filtered out
- reset_sliders(true);
+ hide_layers_slider();
m_canvas_widget->Refresh();
} else
- update_sliders(zs, keep_z_range);
+ update_layers_slider(zs, keep_z_range);
}
+
+#if ENABLE_PREVIEW_TYPE_CHANGE
+ unsigned int number_extruders = (unsigned int)print->extruders().size();
+
+ if (!m_keep_current_preview_type) {
+ const wxString choice = !wxGetApp().plater()->model().custom_gcode_per_print_z.gcodes.empty() ?
+ _L("Color Print") :
+ (number_extruders > 1) ? _L("Tool") : _L("Feature type");
+
+ int type = m_choice_view_type->FindString(choice);
+ if (m_choice_view_type->GetSelection() != type) {
+ if (0 <= type && type < static_cast<int>(GCodeViewer::EViewType::Count)) {
+ m_choice_view_type->SetSelection(type);
+ m_canvas->set_gcode_view_preview_type(static_cast<GCodeViewer::EViewType>(type));
+ }
+ }
+ }
+#endif // ENABLE_PREVIEW_TYPE_CHANGE
}
void Preview::load_print_as_sla()
@@ -894,8 +963,7 @@ void Preview::load_print_as_sla()
std::vector<double> zs;
double initial_layer_height = print->material_config().initial_layer_height.value;
for (const SLAPrintObject* obj : print->objects())
- if (obj->is_step_done(slaposSliceSupports) && !obj->get_slice_index().empty())
- {
+ if (obj->is_step_done(slaposSliceSupports) && !obj->get_slice_index().empty()) {
auto low_coord = obj->get_slice_index().front().print_level();
for (auto& rec : obj->get_slice_index())
zs.emplace_back(initial_layer_height + (rec.print_level() - low_coord) * SCALING_FACTOR);
@@ -905,45 +973,67 @@ void Preview::load_print_as_sla()
m_canvas->reset_clipping_planes_cache();
n_layers = (unsigned int)zs.size();
- if (n_layers == 0)
- {
- reset_sliders(true);
+ if (n_layers == 0) {
+ hide_layers_slider();
m_canvas_widget->Refresh();
}
- if (IsShown())
- {
+ if (IsShown()) {
m_canvas->load_sla_preview();
- show_hide_ui_elements("none");
+ m_left_sizer->Hide(m_bottom_toolbar_panel);
+ m_left_sizer->Hide(m_bottom_toolbar_panel);
+ m_left_sizer->Layout();
+ Refresh();
if (n_layers > 0)
- update_sliders(zs);
+ update_layers_slider(zs);
m_loaded = true;
}
}
-void Preview::on_sliders_scroll_changed(wxCommandEvent& event)
+void Preview::on_layers_slider_scroll_changed(wxCommandEvent& event)
{
- if (IsShown())
- {
+ if (IsShown()) {
PrinterTechnology tech = m_process->current_printer_technology();
- if (tech == ptFFF)
- {
- m_canvas->set_toolpaths_range(m_slider->GetLowerValueD() - 1e-6, m_slider->GetHigherValueD() + 1e-6);
- m_canvas->render();
- m_canvas->set_use_clipping_planes(false);
+ if (tech == ptFFF) {
+ m_canvas->set_volumes_z_range({ m_layers_slider->GetLowerValueD(), m_layers_slider->GetHigherValueD() });
+ m_canvas->set_toolpaths_z_range({ static_cast<unsigned int>(m_layers_slider->GetLowerValue()), static_cast<unsigned int>(m_layers_slider->GetHigherValue()) });
+ m_canvas->set_as_dirty();
}
- else if (tech == ptSLA)
- {
- m_canvas->set_clipping_plane(0, ClippingPlane(Vec3d::UnitZ(), -m_slider->GetLowerValueD()));
- m_canvas->set_clipping_plane(1, ClippingPlane(-Vec3d::UnitZ(), m_slider->GetHigherValueD()));
- m_canvas->set_use_clipping_planes(m_slider->GetHigherValue() != 0);
+ else if (tech == ptSLA) {
+ m_canvas->set_clipping_plane(0, ClippingPlane(Vec3d::UnitZ(), -m_layers_slider->GetLowerValueD()));
+ m_canvas->set_clipping_plane(1, ClippingPlane(-Vec3d::UnitZ(), m_layers_slider->GetHigherValueD()));
+ m_canvas->set_use_clipping_planes(m_layers_slider->GetHigherValue() != 0);
m_canvas->render();
}
}
}
+void Preview::on_moves_slider_scroll_changed(wxCommandEvent& event)
+{
+ m_canvas->update_gcode_sequential_view_current(static_cast<unsigned int>(m_moves_slider->GetLowerValueD() - 1.0), static_cast<unsigned int>(m_moves_slider->GetHigherValueD() - 1.0));
+ m_canvas->render();
+}
+
+wxString Preview::get_option_type_string(OptionType type) const
+{
+ switch (type)
+ {
+ case OptionType::Travel: { return _L("Travel"); }
+ case OptionType::Wipe: { return _L("Wipe"); }
+ case OptionType::Retractions: { return _L("Retractions"); }
+ case OptionType::Unretractions: { return _L("Deretractions"); }
+ case OptionType::ToolChanges: { return _L("Tool changes"); }
+ case OptionType::ColorChanges: { return _L("Color changes"); }
+ case OptionType::PausePrints: { return _L("Print pauses"); }
+ case OptionType::CustomGCodes: { return _L("Custom G-codes"); }
+ case OptionType::Shells: { return _L("Shells"); }
+ case OptionType::ToolMarker: { return _L("Tool marker"); }
+ case OptionType::Legend: { return _L("Legend/Estimated printing time"); }
+ default: { return ""; }
+ }
+}
} // namespace GUI
} // namespace Slic3r
diff --git a/src/slic3r/GUI/GUI_Preview.hpp b/src/slic3r/GUI/GUI_Preview.hpp
index cc8f15325..0060bfcff 100644
--- a/src/slic3r/GUI/GUI_Preview.hpp
+++ b/src/slic3r/GUI/GUI_Preview.hpp
@@ -2,10 +2,12 @@
#define slic3r_GUI_Preview_hpp_
#include <wx/panel.h>
+
#include "libslic3r/Point.hpp"
+#include "libslic3r/CustomGCode.hpp"
#include <string>
-#include "libslic3r/Model.hpp"
+#include "libslic3r/GCode/GCodeProcessor.hpp"
class wxNotebook;
class wxGLCanvas;
@@ -21,7 +23,6 @@ namespace Slic3r {
class DynamicPrintConfig;
class Print;
class BackgroundSlicingProcess;
-class GCodePreviewData;
class Model;
namespace DoubleSlider {
@@ -34,6 +35,7 @@ class GLCanvas3D;
class GLToolbar;
class Bed3D;
struct Camera;
+class Plater;
class View3D : public wxPanel
{
@@ -41,7 +43,7 @@ class View3D : public wxPanel
GLCanvas3D* m_canvas;
public:
- View3D(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process);
+ View3D(wxWindow* parent, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process);
virtual ~View3D();
wxGLCanvas* get_wxglcanvas() { return m_canvas_widget; }
@@ -69,48 +71,66 @@ public:
void render();
private:
- bool init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process);
+ bool init(wxWindow* parent, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process);
};
class Preview : public wxPanel
{
- wxGLCanvas* m_canvas_widget;
- GLCanvas3D* m_canvas;
- wxBoxSizer* m_double_slider_sizer;
- wxStaticText* m_label_view_type;
- wxChoice* m_choice_view_type;
- wxStaticText* m_label_show_features;
- wxComboCtrl* m_combochecklist_features;
- wxCheckBox* m_checkbox_travel;
- wxCheckBox* m_checkbox_retractions;
- wxCheckBox* m_checkbox_unretractions;
- wxCheckBox* m_checkbox_shells;
- wxCheckBox* m_checkbox_legend;
+ wxGLCanvas* m_canvas_widget { nullptr };
+ GLCanvas3D* m_canvas { nullptr };
+ wxBoxSizer* m_left_sizer { nullptr };
+ wxBoxSizer* m_layers_slider_sizer { nullptr };
+ wxPanel* m_bottom_toolbar_panel { nullptr };
+ wxStaticText* m_label_view_type { nullptr };
+ wxChoice* m_choice_view_type { nullptr };
+ wxStaticText* m_label_show { nullptr };
+ wxComboCtrl* m_combochecklist_features { nullptr };
+ size_t m_combochecklist_features_pos { 0 };
+ wxComboCtrl* m_combochecklist_options { nullptr };
DynamicPrintConfig* m_config;
BackgroundSlicingProcess* m_process;
- GCodePreviewData* m_gcode_preview_data;
+ GCodeProcessor::Result* m_gcode_result;
#ifdef __linux__
// We are getting mysterious crashes on Linux in gtk due to OpenGL context activation GH #1874 #1955.
// So we are applying a workaround here.
- bool m_volumes_cleanup_required;
+ bool m_volumes_cleanup_required { false };
#endif /* __linux__ */
// Calling this function object forces Plater::schedule_background_process.
std::function<void()> m_schedule_background_process;
- unsigned int m_number_extruders;
+ unsigned int m_number_extruders { 1 };
+#if ENABLE_PREVIEW_TYPE_CHANGE
+ bool m_keep_current_preview_type{ false };
+#else
std::string m_preferred_color_mode;
+#endif // ENABLE_PREVIEW_TYPE_CHANGE
- bool m_loaded;
- bool m_enabled;
+ bool m_loaded { false };
- DoubleSlider::Control* m_slider {nullptr};
+ DoubleSlider::Control* m_layers_slider{ nullptr };
+ DoubleSlider::Control* m_moves_slider{ nullptr };
public:
- Preview(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model, DynamicPrintConfig* config,
- BackgroundSlicingProcess* process, GCodePreviewData* gcode_preview_data, std::function<void()> schedule_background_process = [](){});
+ enum class OptionType : unsigned int
+ {
+ Travel,
+ Wipe,
+ Retractions,
+ Unretractions,
+ ToolChanges,
+ ColorChanges,
+ PausePrints,
+ CustomGCodes,
+ Shells,
+ ToolMarker,
+ Legend
+ };
+
+ Preview(wxWindow* parent, Model* model, DynamicPrintConfig* config, BackgroundSlicingProcess* process,
+ GCodeProcessor::Result* gcode_result, std::function<void()> schedule_background_process = []() {});
virtual ~Preview();
wxGLCanvas* get_wxglcanvas() { return m_canvas_widget; }
@@ -118,8 +138,9 @@ public:
void set_as_dirty();
+#if !ENABLE_PREVIEW_TYPE_CHANGE
void set_number_extruders(unsigned int number_extruders);
- void set_enabled(bool enabled);
+#endif // !ENABLE_PREVIEW_TYPE_CHANGE
void bed_shape_changed();
void select_view(const std::string& direction);
void set_drop_target(wxDropTarget* target);
@@ -129,48 +150,51 @@ public:
void refresh_print();
void msw_rescale();
- void move_double_slider(wxKeyEvent& evt);
- void edit_double_slider(wxKeyEvent& evt);
+ void jump_layers_slider(wxKeyEvent& evt);
+ void move_layers_slider(wxKeyEvent& evt);
+ void edit_layers_slider(wxKeyEvent& evt);
- void update_view_type(bool slice_completed);
+#if !ENABLE_PREVIEW_TYPE_CHANGE
+ void update_view_type(bool keep_volumes);
+#endif // !ENABLE_PREVIEW_TYPE_CHANGE
bool is_loaded() const { return m_loaded; }
+ void update_bottom_toolbar();
+ void update_moves_slider();
+ void enable_moves_slider(bool enable);
+#if ENABLE_ARROW_KEYS_WITH_SLIDERS
+ void move_moves_slider(wxKeyEvent& evt);
+#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS
+ void hide_layers_slider();
+
private:
- bool init(wxWindow* parent, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar, Model* model);
+ bool init(wxWindow* parent, Model* model);
void bind_event_handlers();
void unbind_event_handlers();
- void show_hide_ui_elements(const std::string& what);
-
- void reset_sliders(bool reset_all);
- void update_sliders(const std::vector<double>& layers_z, bool keep_z_range = false);
-
void on_size(wxSizeEvent& evt);
void on_choice_view_type(wxCommandEvent& evt);
void on_combochecklist_features(wxCommandEvent& evt);
- void on_checkbox_travel(wxCommandEvent& evt);
- void on_checkbox_retractions(wxCommandEvent& evt);
- void on_checkbox_unretractions(wxCommandEvent& evt);
- void on_checkbox_shells(wxCommandEvent& evt);
- void on_checkbox_legend(wxCommandEvent& evt);
+ void on_combochecklist_options(wxCommandEvent& evt);
// Create/Update/Reset double slider on 3dPreview
- void create_double_slider();
- void check_slider_values(std::vector<CustomGCode::Item> &ticks_from_model,
- const std::vector<double> &layers_z);
- void reset_double_slider();
- void update_double_slider(const std::vector<double>& layers_z, bool keep_z_range = false);
- void update_double_slider_mode();
- // update DoubleSlider after keyDown in canvas
- void update_double_slider_from_canvas(wxKeyEvent& event);
+ wxBoxSizer* create_layers_slider_sizer();
+ void check_layers_slider_values(std::vector<CustomGCode::Item>& ticks_from_model,
+ const std::vector<double>& layers_z);
+ void reset_layers_slider();
+ void update_layers_slider(const std::vector<double>& layers_z, bool keep_z_range = false);
+ void update_layers_slider_mode();
+ // update vertical DoubleSlider after keyDown in canvas
+ void update_layers_slider_from_canvas(wxKeyEvent& event);
void load_print_as_fff(bool keep_z_range = false);
void load_print_as_sla();
- void on_sliders_scroll_changed(wxCommandEvent& event);
-
+ void on_layers_slider_scroll_changed(wxCommandEvent& event);
+ void on_moves_slider_scroll_changed(wxCommandEvent& event);
+ wxString get_option_type_string(OptionType type) const;
};
} // namespace GUI
diff --git a/src/slic3r/GUI/GUI_Utils.cpp b/src/slic3r/GUI/GUI_Utils.cpp
index dc64141ba..e2a6ccb88 100644
--- a/src/slic3r/GUI/GUI_Utils.cpp
+++ b/src/slic3r/GUI/GUI_Utils.cpp
@@ -61,7 +61,9 @@ void on_window_geometry(wxTopLevelWindow *tlw, std::function<void()> callback)
#endif
}
+#if !wxVERSION_EQUAL_OR_GREATER_THAN(3,1,3)
wxDEFINE_EVENT(EVT_DPI_CHANGED_SLICER, DpiChangedEvent);
+#endif // !wxVERSION_EQUAL_OR_GREATER_THAN
#ifdef _WIN32
template<class F> typename F::FN winapi_get_function(const wchar_t *dll, const char *fn_name) {
@@ -73,7 +75,7 @@ template<class F> typename F::FN winapi_get_function(const wchar_t *dll, const c
#endif
// If called with nullptr, a DPI for the primary monitor is returned.
-int get_dpi_for_window(wxWindow *window)
+int get_dpi_for_window(const wxWindow *window)
{
#ifdef _WIN32
enum MONITOR_DPI_TYPE_ {
@@ -124,7 +126,7 @@ int get_dpi_for_window(wxWindow *window)
#endif
}
-wxFont get_default_font_for_dpi(int dpi)
+wxFont get_default_font_for_dpi(const wxWindow *window, int dpi)
{
#ifdef _WIN32
// First try to load the font with the Windows 10 specific way.
@@ -134,11 +136,8 @@ wxFont get_default_font_for_dpi(int dpi)
NONCLIENTMETRICS nm;
memset(&nm, 0, sizeof(NONCLIENTMETRICS));
nm.cbSize = sizeof(NONCLIENTMETRICS);
- if (SystemParametersInfoForDpi_fn(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &nm, 0, dpi)) {
- wxNativeFontInfo info;
- info.lf = nm.lfMessageFont;
- return wxFont(info);
- }
+ if (SystemParametersInfoForDpi_fn(SPI_GETNONCLIENTMETRICS, sizeof(NONCLIENTMETRICS), &nm, 0, dpi))
+ return wxFont(wxNativeFontInfo(nm.lfMessageFont, window));
}
// Then try to guesstimate the font DPI scaling on Windows 8.
// Let's hope that the font returned by the SystemParametersInfo(), which is used by wxWidgets internally, makes sense.
@@ -268,5 +267,26 @@ std::ostream& operator<<(std::ostream &os, const WindowMetrics& metrics)
}
+TaskTimer::TaskTimer(std::string task_name):
+ task_name(task_name.empty() ? "task" : task_name)
+{
+ start_timer = std::chrono::duration_cast<std::chrono::milliseconds>(
+ std::chrono::system_clock::now().time_since_epoch());
+}
+
+TaskTimer::~TaskTimer()
+{
+ std::chrono::milliseconds stop_timer = std::chrono::duration_cast<std::chrono::milliseconds>(
+ std::chrono::system_clock::now().time_since_epoch());
+ auto process_duration = std::chrono::milliseconds(stop_timer - start_timer).count();
+ std::string out = (boost::format("\n!!! %1% duration = %2% ms \n\n") % task_name % process_duration).str();
+ printf("%s", out.c_str());
+#ifdef __WXMSW__
+ std::wstring stemp = std::wstring(out.begin(), out.end());
+ OutputDebugString(stemp.c_str());
+#endif
+}
+
+
}
}
diff --git a/src/slic3r/GUI/GUI_Utils.hpp b/src/slic3r/GUI/GUI_Utils.hpp
index 0d5249e25..3235d6e9e 100644
--- a/src/slic3r/GUI/GUI_Utils.hpp
+++ b/src/slic3r/GUI/GUI_Utils.hpp
@@ -18,12 +18,19 @@
#include <wx/debug.h>
#include <wx/settings.h>
+#include <chrono>
+
#include "Event.hpp"
class wxCheckBox;
class wxTopLevelWindow;
class wxRect;
+#if ENABLE_WX_3_1_3_DPI_CHANGED_EVENT
+#define wxVERSION_EQUAL_OR_GREATER_THAN(major, minor, release) ((wxMAJOR_VERSION > major) || ((wxMAJOR_VERSION == major) && (wxMINOR_VERSION > minor)) || ((wxMAJOR_VERSION == major) && (wxMINOR_VERSION == minor) && (wxRELEASE_NUMBER >= release)))
+#else
+#define wxVERSION_EQUAL_OR_GREATER_THAN(major, minor, release) 0
+#endif // ENABLE_WX_3_1_3_DPI_CHANGED_EVENT
namespace Slic3r {
namespace GUI {
@@ -48,9 +55,11 @@ void on_window_geometry(wxTopLevelWindow *tlw, std::function<void()> callback);
enum { DPI_DEFAULT = 96 };
-int get_dpi_for_window(wxWindow *window);
-wxFont get_default_font_for_dpi(int dpi);
+int get_dpi_for_window(const wxWindow *window);
+wxFont get_default_font_for_dpi(const wxWindow* window, int dpi);
+inline wxFont get_default_font(const wxWindow* window) { return get_default_font_for_dpi(window, get_dpi_for_window(window)); }
+#if !wxVERSION_EQUAL_OR_GREATER_THAN(3,1,3)
struct DpiChangedEvent : public wxEvent {
int dpi;
wxRect rect;
@@ -66,6 +75,7 @@ struct DpiChangedEvent : public wxEvent {
};
wxDECLARE_EVENT(EVT_DPI_CHANGED_SLICER, DpiChangedEvent);
+#endif // !wxVERSION_EQUAL_OR_GREATER_THAN
template<class P> class DPIAware : public P
{
@@ -77,7 +87,7 @@ public:
int dpi = get_dpi_for_window(this);
m_scale_factor = (float)dpi / (float)DPI_DEFAULT;
m_prev_scale_factor = m_scale_factor;
- m_normal_font = get_default_font_for_dpi(dpi);
+ m_normal_font = get_default_font_for_dpi(this, dpi);
/* Because of default window font is a primary display font,
* We should set correct font for window before getting em_unit value.
@@ -85,22 +95,39 @@ public:
#ifndef __WXOSX__ // Don't call SetFont under OSX to avoid name cutting in ObjectList
this->SetFont(m_normal_font);
#endif
+ this->CenterOnParent();
+
+ // Linux specific issue : get_dpi_for_window(this) still doesn't responce to the Display's scale in new wxWidgets(3.1.3).
+ // So, calculate the m_em_unit value from the font size, as before
+#if ENABLE_WX_3_1_3_DPI_CHANGED_EVENT && !defined(__WXGTK__)
+ m_em_unit = std::max<size_t>(10, 10.0f * m_scale_factor);
+#else
// initialize default width_unit according to the width of the one symbol ("m") of the currently active font of this window.
m_em_unit = std::max<size_t>(10, this->GetTextExtent("m").x - 1);
+#endif // ENABLE_WX_3_1_3_DPI_CHANGED_EVENT
// recalc_font();
- this->Bind(EVT_DPI_CHANGED_SLICER, [this](const DpiChangedEvent &evt) {
+#if wxVERSION_EQUAL_OR_GREATER_THAN(3,1,3)
+ this->Bind(wxEVT_DPI_CHANGED, [this](wxDPIChangedEvent& evt) {
+ m_scale_factor = (float)evt.GetNewDPI().x / (float)DPI_DEFAULT;
+ m_new_font_point_size = get_default_font_for_dpi(this, evt.GetNewDPI().x).GetPointSize();
+ if (m_can_rescale && (m_force_rescale || is_new_scale_factor()))
+ rescale(wxRect());
+ });
+#else
+ this->Bind(EVT_DPI_CHANGED_SLICER, [this](const DpiChangedEvent& evt) {
m_scale_factor = (float)evt.dpi / (float)DPI_DEFAULT;
- m_new_font_point_size = get_default_font_for_dpi(evt.dpi).GetPointSize();
+ m_new_font_point_size = get_default_font_for_dpi(this, evt.dpi).GetPointSize();
if (!m_can_rescale)
return;
- if (is_new_scale_factor())
+ if (m_force_rescale || is_new_scale_factor())
rescale(evt.rect);
- });
+ });
+#endif // wxVERSION_EQUAL_OR_GREATER_THAN
this->Bind(wxEVT_MOVE_START, [this](wxMoveEvent& event)
{
@@ -124,6 +151,12 @@ public:
// set value to _true_ in purpose of possibility of a display dpi changing from System Settings
m_can_rescale = true;
});
+
+ this->Bind(wxEVT_SYS_COLOUR_CHANGED, [this](wxSysColourChangedEvent& event)
+ {
+ event.Skip();
+ on_sys_color_changed();
+ });
}
virtual ~DPIAware() {}
@@ -134,9 +167,11 @@ public:
int em_unit() const { return m_em_unit; }
// int font_size() const { return m_font_size; }
const wxFont& normal_font() const { return m_normal_font; }
+ void enable_force_rescale() { m_force_rescale = true; }
protected:
virtual void on_dpi_changed(const wxRect &suggested_rect) = 0;
+ virtual void on_sys_color_changed() {};
private:
float m_scale_factor;
@@ -146,6 +181,7 @@ private:
wxFont m_normal_font;
float m_prev_scale_factor;
bool m_can_rescale{ true };
+ bool m_force_rescale{ false };
int m_new_font_point_size;
@@ -185,17 +221,23 @@ private:
{
this->Freeze();
+ m_force_rescale = false;
+#if !wxVERSION_EQUAL_OR_GREATER_THAN(3,1,3)
// rescale fonts of all controls
scale_controls_fonts(this, m_new_font_point_size);
// rescale current window font
scale_win_font(this, m_new_font_point_size);
-
+#endif // wxVERSION_EQUAL_OR_GREATER_THAN
// set normal application font as a current window font
m_normal_font = this->GetFont();
// update em_unit value for new window font
+#if ENABLE_WX_3_1_3_DPI_CHANGED_EVENT
+ m_em_unit = std::max<int>(10, 10.0f * m_scale_factor);
+#else
m_em_unit = std::max<size_t>(10, this->GetTextExtent("m").x - 1);
+#endif // ENABLE_WX_3_1_3_DPI_CHANGED_EVENT
// rescale missed controls sizes and images
on_dpi_changed(suggested_rect);
@@ -334,7 +376,7 @@ public:
static WindowMetrics from_window(wxTopLevelWindow *window);
static boost::optional<WindowMetrics> deserialize(const std::string &str);
- wxRect get_rect() const { return rect; }
+ const wxRect& get_rect() const { return rect; }
bool get_maximized() const { return maximized; }
void sanitize_for_display(const wxRect &screen_rect);
@@ -343,6 +385,23 @@ public:
std::ostream& operator<<(std::ostream &os, const WindowMetrics& metrics);
+inline int hex_digit_to_int(const char c)
+{
+ return
+ (c >= '0' && c <= '9') ? int(c - '0') :
+ (c >= 'A' && c <= 'F') ? int(c - 'A') + 10 :
+ (c >= 'a' && c <= 'f') ? int(c - 'a') + 10 : -1;
+}
+
+class TaskTimer
+{
+ std::chrono::milliseconds start_timer;
+ std::string task_name;
+public:
+ TaskTimer(std::string task_name);
+
+ ~TaskTimer();
+};
}}
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp
index 46abe8a95..9bc34f990 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.cpp
@@ -4,14 +4,9 @@
#include <GL/glew.h>
#include "slic3r/GUI/GUI_App.hpp"
-#include "slic3r/GUI/GLCanvas3D.hpp"
-
-
// TODO: Display tooltips quicker on Linux
-
-
namespace Slic3r {
namespace GUI {
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp
index 0d19a86af..44f0a6972 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoBase.hpp
@@ -4,7 +4,6 @@
#include "libslic3r/Point.hpp"
#include "slic3r/GUI/I18N.hpp"
-#include "slic3r/GUI/Selection.hpp"
#include <cereal/archives/binary.hpp>
@@ -31,7 +30,9 @@ static const float CONSTRAINED_COLOR[4] = { 0.5f, 0.5f, 0.5f, 1.0f };
class ImGuiWrapper;
class GLCanvas3D;
-class ClippingPlane;
+enum class CommonGizmosDataID;
+class CommonGizmosDataPool;
+class Selection;
class GLGizmoBase
{
@@ -101,6 +102,7 @@ protected:
ImGuiWrapper* m_imgui;
bool m_first_input_window_render;
mutable std::string m_tooltip;
+ CommonGizmosDataPool* m_c;
public:
GLGizmoBase(GLCanvas3D& parent,
@@ -122,12 +124,13 @@ public:
void set_state(EState state) { m_state = state; on_set_state(); }
int get_shortcut_key() const { return m_shortcut_key; }
- void set_shortcut_key(int key) { m_shortcut_key = key; }
const std::string& get_icon_filename() const { return m_icon_filename; }
bool is_activable() const { return on_is_activable(); }
bool is_selectable() const { return on_is_selectable(); }
+ CommonGizmosDataID get_requirements() const { return on_get_requirements(); }
+ void set_common_data_pool(CommonGizmosDataPool* ptr) { m_c = ptr; }
unsigned int get_sprite_id() const { return m_sprite_id; }
@@ -161,6 +164,7 @@ protected:
virtual void on_set_hover_id() {}
virtual bool on_is_activable() const { return true; }
virtual bool on_is_selectable() const { return true; }
+ virtual CommonGizmosDataID on_get_requirements() const { return CommonGizmosDataID(0); }
virtual void on_enable_grabber(unsigned int id) {}
virtual void on_disable_grabber(unsigned int id) {}
virtual void on_start_dragging() {}
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp
index 9382579ea..d43b0f24e 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoCut.cpp
@@ -12,6 +12,9 @@
#include <algorithm>
#include "slic3r/GUI/GUI_App.hpp"
+#include "slic3r/GUI/Plater.hpp"
+#include "slic3r/GUI/GUI_ObjectManipulation.hpp"
+#include "libslic3r/AppConfig.hpp"
namespace Slic3r {
@@ -32,7 +35,11 @@ GLGizmoCut::GLGizmoCut(GLCanvas3D& parent, const std::string& icon_filename, uns
std::string GLGizmoCut::get_tooltip() const
{
- return (m_hover_id == 0 || m_grabbers[0].dragging) ? "Z: " + format(m_cut_z, 2) : "";
+ double cut_z = m_cut_z;
+ if (wxGetApp().app_config->get("use_inches") == "1")
+ cut_z *= ObjectManipulation::mm_to_in;
+
+ return (m_hover_id == 0 || m_grabbers[0].dragging) ? "Z: " + format(cut_z, 2) : "";
}
bool GLGizmoCut::on_init()
@@ -77,9 +84,8 @@ void GLGizmoCut::on_start_dragging()
void GLGizmoCut::on_update(const UpdateData& data)
{
- if (m_hover_id != -1) {
+ if (m_hover_id != -1)
set_cut_z(m_start_z + calc_projection(data.mouse_ray));
- }
}
void GLGizmoCut::on_render() const
@@ -142,14 +148,15 @@ void GLGizmoCut::on_render_input_window(float x, float y, float bottom_limit)
static float last_y = 0.0f;
static float last_h = 0.0f;
- m_imgui->begin(_(L("Cut")), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse);
+ m_imgui->begin(_L("Cut"), ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoCollapse);
+
+ bool imperial_units = wxGetApp().app_config->get("use_inches") == "1";
// adjust window position to avoid overlap the view toolbar
float win_h = ImGui::GetWindowHeight();
y = std::min(y, bottom_limit - win_h);
ImGui::SetWindowPos(ImVec2(x, y), ImGuiCond_Always);
- if ((last_h != win_h) || (last_y != y))
- {
+ if (last_h != win_h || last_y != y) {
// ask canvas for another frame to render the window in the correct position
m_parent.request_extra_frame();
if (last_h != win_h)
@@ -162,25 +169,33 @@ void GLGizmoCut::on_render_input_window(float x, float y, float bottom_limit)
m_imgui->text("Z");
ImGui::SameLine();
ImGui::PushItemWidth(m_imgui->get_style_scaling() * 150.0f);
- ImGui::InputDouble("", &m_cut_z, 0.0f, 0.0f, "%.2f");
+
+ double cut_z = m_cut_z;
+ if (imperial_units)
+ cut_z *= ObjectManipulation::mm_to_in;
+ ImGui::InputDouble("", &cut_z, 0.0f, 0.0f, "%.2f");
+
+ ImGui::SameLine();
+ m_imgui->text(imperial_units ? _L("in") : _L("mm"));
+
+ m_cut_z = cut_z * (imperial_units ? ObjectManipulation::in_to_mm : 1.0);
ImGui::Separator();
- m_imgui->checkbox(_(L("Keep upper part")), m_keep_upper);
- m_imgui->checkbox(_(L("Keep lower part")), m_keep_lower);
- m_imgui->checkbox(_(L("Rotate lower part upwards")), m_rotate_lower);
+ m_imgui->checkbox(_L("Keep upper part"), m_keep_upper);
+ m_imgui->checkbox(_L("Keep lower part"), m_keep_lower);
+ m_imgui->checkbox(_L("Rotate lower part upwards"), m_rotate_lower);
ImGui::Separator();
- m_imgui->disabled_begin(!m_keep_upper && !m_keep_lower);
- const bool cut_clicked = m_imgui->button(_(L("Perform cut")));
+ m_imgui->disabled_begin((!m_keep_upper && !m_keep_lower) || m_cut_z <= 0.0 || m_max_z < m_cut_z);
+ const bool cut_clicked = m_imgui->button(_L("Perform cut"));
m_imgui->disabled_end();
m_imgui->end();
- if (cut_clicked && (m_keep_upper || m_keep_lower)) {
+ if (cut_clicked && (m_keep_upper || m_keep_lower))
perform_cut(m_parent.get_selection());
- }
}
void GLGizmoCut::update_max_z(const Selection& selection) const
@@ -197,12 +212,20 @@ void GLGizmoCut::set_cut_z(double cut_z) const
void GLGizmoCut::perform_cut(const Selection& selection)
{
- const auto instance_idx = selection.get_instance_idx();
- const auto object_idx = selection.get_object_idx();
+ const int instance_idx = selection.get_instance_idx();
+ const int object_idx = selection.get_object_idx();
wxCHECK_RET(instance_idx >= 0 && object_idx >= 0, "GLGizmoCut: Invalid object selection");
- wxGetApp().plater()->cut(object_idx, instance_idx, m_cut_z, m_keep_upper, m_keep_lower, m_rotate_lower);
+ // m_cut_z is the distance from the bed. Subtract possible SLA elevation.
+ const GLVolume* first_glvolume = selection.get_volume(*selection.get_volume_idxs().begin());
+ coordf_t object_cut_z = m_cut_z - first_glvolume->get_sla_shift_z();
+
+ if (object_cut_z > 0.)
+ wxGetApp().plater()->cut(object_idx, instance_idx, object_cut_z, m_keep_upper, m_keep_lower, m_rotate_lower);
+ else {
+ // the object is SLA-elevated and the plane is under it.
+ }
}
double GLGizmoCut::calc_projection(const Linef3& mouse_ray) const
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp
new file mode 100644
index 000000000..8f2703faa
--- /dev/null
+++ b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.cpp
@@ -0,0 +1,353 @@
+#include "GLGizmoFdmSupports.hpp"
+
+#include "libslic3r/Model.hpp"
+
+//#include "slic3r/GUI/3DScene.hpp"
+#include "slic3r/GUI/GLCanvas3D.hpp"
+#include "slic3r/GUI/GUI_App.hpp"
+#include "slic3r/GUI/ImGuiWrapper.hpp"
+#include "slic3r/GUI/Plater.hpp"
+
+
+#include <GL/glew.h>
+
+
+namespace Slic3r {
+
+namespace GUI {
+
+
+
+void GLGizmoFdmSupports::on_shutdown()
+{
+ if (m_setting_angle) {
+ m_setting_angle = false;
+ m_parent.use_slope(false);
+ }
+}
+
+
+
+std::string GLGizmoFdmSupports::on_get_name() const
+{
+ return (_L("Paint-on supports") + " [L]").ToUTF8().data();
+}
+
+
+
+bool GLGizmoFdmSupports::on_init()
+{
+ m_shortcut_key = WXK_CONTROL_L;
+
+ m_desc["clipping_of_view"] = _L("Clipping of view") + ": ";
+ m_desc["reset_direction"] = _L("Reset direction");
+ m_desc["cursor_size"] = _L("Brush size") + ": ";
+ m_desc["cursor_type"] = _L("Brush shape") + ": ";
+ m_desc["enforce_caption"] = _L("Left mouse button") + ": ";
+ m_desc["enforce"] = _L("Enforce supports");
+ m_desc["block_caption"] = _L("Right mouse button") + ": ";
+ m_desc["block"] = _L("Block supports");
+ m_desc["remove_caption"] = _L("Shift + Left mouse button") + ": ";
+ m_desc["remove"] = _L("Remove selection");
+ m_desc["remove_all"] = _L("Remove all selection");
+ m_desc["circle"] = _L("Circle");
+ m_desc["sphere"] = _L("Sphere");
+
+ return true;
+}
+
+
+
+void GLGizmoFdmSupports::render_painter_gizmo() const
+{
+ const Selection& selection = m_parent.get_selection();
+
+ glsafe(::glEnable(GL_BLEND));
+ glsafe(::glEnable(GL_DEPTH_TEST));
+
+ if (! m_setting_angle)
+ render_triangles(selection);
+
+ m_c->object_clipper()->render_cut();
+ render_cursor();
+
+ glsafe(::glDisable(GL_BLEND));
+}
+
+
+
+void GLGizmoFdmSupports::on_render_input_window(float x, float y, float bottom_limit)
+{
+ if (! m_c->selection_info()->model_object())
+ return;
+
+ const float approx_height = m_imgui->scaled(14.0f);
+ y = std::min(y, bottom_limit - approx_height);
+ m_imgui->set_next_window_pos(x, y, ImGuiCond_Always);
+
+ if (! m_setting_angle) {
+ m_imgui->begin(on_get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse);
+
+ // First calculate width of all the texts that are could possibly be shown. We will decide set the dialog width based on that:
+ const float clipping_slider_left = std::max(m_imgui->calc_text_size(m_desc.at("clipping_of_view")).x,
+ m_imgui->calc_text_size(m_desc.at("reset_direction")).x)
+ + m_imgui->scaled(1.5f);
+ const float cursor_slider_left = m_imgui->calc_text_size(m_desc.at("cursor_size")).x + m_imgui->scaled(1.f);
+ const float cursor_type_radio_left = m_imgui->calc_text_size(m_desc.at("cursor_type")).x + m_imgui->scaled(1.f);
+ const float cursor_type_radio_width1 = m_imgui->calc_text_size(m_desc["circle"]).x
+ + m_imgui->scaled(2.5f);
+ const float cursor_type_radio_width2 = m_imgui->calc_text_size(m_desc["sphere"]).x
+ + m_imgui->scaled(2.5f);
+ const float button_width = m_imgui->calc_text_size(m_desc.at("remove_all")).x + m_imgui->scaled(1.f);
+ const float minimal_slider_width = m_imgui->scaled(4.f);
+
+ float caption_max = 0.f;
+ float total_text_max = 0.;
+ for (const std::string& t : {"enforce", "block", "remove"}) {
+ caption_max = std::max(caption_max, m_imgui->calc_text_size(m_desc.at(t+"_caption")).x);
+ total_text_max = std::max(total_text_max, caption_max + m_imgui->calc_text_size(m_desc.at(t)).x);
+ }
+ caption_max += m_imgui->scaled(1.f);
+ total_text_max += m_imgui->scaled(1.f);
+
+ float window_width = minimal_slider_width + std::max(cursor_slider_left, clipping_slider_left);
+ window_width = std::max(window_width, total_text_max);
+ window_width = std::max(window_width, button_width);
+ window_width = std::max(window_width, cursor_type_radio_left + cursor_type_radio_width1 + cursor_type_radio_width2);
+
+ auto draw_text_with_caption = [this, &caption_max](const wxString& caption, const wxString& text) {
+ m_imgui->text_colored(ImGuiWrapper::COL_ORANGE_LIGHT, caption);
+ ImGui::SameLine(caption_max);
+ m_imgui->text(text);
+ };
+
+ for (const std::string& t : {"enforce", "block", "remove"})
+ draw_text_with_caption(m_desc.at(t + "_caption"), m_desc.at(t));
+
+ m_imgui->text("");
+
+ if (m_imgui->button(_L("Autoset by angle") + "...")) {
+ m_setting_angle = true;
+ }
+
+ ImGui::SameLine();
+
+ if (m_imgui->button(m_desc.at("remove_all"))) {
+ Plater::TakeSnapshot(wxGetApp().plater(), wxString(_L("Reset selection")));
+ ModelObject* mo = m_c->selection_info()->model_object();
+ int idx = -1;
+ for (ModelVolume* mv : mo->volumes) {
+ if (mv->is_model_part()) {
+ ++idx;
+ m_triangle_selectors[idx]->reset();
+ }
+ }
+
+ update_model_object();
+ m_parent.set_as_dirty();
+ }
+
+ const float max_tooltip_width = ImGui::GetFontSize() * 20.0f;
+
+ ImGui::AlignTextToFramePadding();
+ m_imgui->text(m_desc.at("cursor_size"));
+ ImGui::SameLine(cursor_slider_left);
+ ImGui::PushItemWidth(window_width - cursor_slider_left);
+ ImGui::SliderFloat(" ", &m_cursor_radius, CursorRadiusMin, CursorRadiusMax, "%.2f");
+ if (ImGui::IsItemHovered()) {
+ ImGui::BeginTooltip();
+ ImGui::PushTextWrapPos(max_tooltip_width);
+ ImGui::TextUnformatted(_L("Alt + Mouse wheel").ToUTF8().data());
+ ImGui::PopTextWrapPos();
+ ImGui::EndTooltip();
+ }
+
+
+ ImGui::AlignTextToFramePadding();
+ m_imgui->text(m_desc.at("cursor_type"));
+ ImGui::SameLine(cursor_type_radio_left + m_imgui->scaled(0.f));
+ ImGui::PushItemWidth(cursor_type_radio_width1);
+
+ bool sphere_sel = m_cursor_type == TriangleSelector::CursorType::SPHERE;
+ if (m_imgui->radio_button(m_desc["sphere"], sphere_sel))
+ sphere_sel = true;
+
+ if (ImGui::IsItemHovered()) {
+ ImGui::BeginTooltip();
+ ImGui::PushTextWrapPos(max_tooltip_width);
+ ImGui::TextUnformatted(_L("Paints all facets inside, regardless of their orientation.").ToUTF8().data());
+ ImGui::PopTextWrapPos();
+ ImGui::EndTooltip();
+ }
+
+ ImGui::SameLine(cursor_type_radio_left + cursor_type_radio_width2 + m_imgui->scaled(0.f));
+ ImGui::PushItemWidth(cursor_type_radio_width2);
+
+ if (m_imgui->radio_button(m_desc["circle"], ! sphere_sel))
+ sphere_sel = false;
+
+ if (ImGui::IsItemHovered()) {
+ ImGui::BeginTooltip();
+ ImGui::PushTextWrapPos(max_tooltip_width);
+ ImGui::TextUnformatted(_L("Ignores facets facing away from the camera.").ToUTF8().data());
+ ImGui::PopTextWrapPos();
+ ImGui::EndTooltip();
+ }
+
+ m_cursor_type = sphere_sel
+ ? TriangleSelector::CursorType::SPHERE
+ : TriangleSelector::CursorType::CIRCLE;
+
+
+
+
+ ImGui::Separator();
+ if (m_c->object_clipper()->get_position() == 0.f) {
+ ImGui::AlignTextToFramePadding();
+ m_imgui->text(m_desc.at("clipping_of_view"));
+ }
+ else {
+ if (m_imgui->button(m_desc.at("reset_direction"))) {
+ wxGetApp().CallAfter([this](){
+ m_c->object_clipper()->set_position(-1., false);
+ });
+ }
+ }
+
+ ImGui::SameLine(clipping_slider_left);
+ ImGui::PushItemWidth(window_width - clipping_slider_left);
+ float clp_dist = m_c->object_clipper()->get_position();
+ if (ImGui::SliderFloat(" ", &clp_dist, 0.f, 1.f, "%.2f"))
+ m_c->object_clipper()->set_position(clp_dist, true);
+ if (ImGui::IsItemHovered()) {
+ ImGui::BeginTooltip();
+ ImGui::PushTextWrapPos(max_tooltip_width);
+ ImGui::TextUnformatted(_L("Ctrl + Mouse wheel").ToUTF8().data());
+ ImGui::PopTextWrapPos();
+ ImGui::EndTooltip();
+ }
+
+ m_imgui->end();
+ }
+ else {
+ m_imgui->begin(_L("Autoset custom supports"), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse);
+ ImGui::AlignTextToFramePadding();
+ m_imgui->text(_L("Threshold:"));
+ std::string format_str = std::string("%.f") + I18N::translate_utf8("°",
+ "Degree sign to use in the respective slider in FDM supports gizmo,"
+ "placed after the number with no whitespace in between.");
+ ImGui::SameLine();
+ if (m_imgui->slider_float("", &m_angle_threshold_deg, 0.f, 90.f, format_str.data()))
+ m_parent.set_slope_normal_angle(90.f - m_angle_threshold_deg);
+ if (m_imgui->button(_L("Enforce")))
+ select_facets_by_angle(m_angle_threshold_deg, false);
+ ImGui::SameLine();
+ if (m_imgui->button(_L("Block")))
+ select_facets_by_angle(m_angle_threshold_deg, true);
+ ImGui::SameLine();
+ if (m_imgui->button(_L("Cancel")))
+ m_setting_angle = false;
+ m_imgui->end();
+ bool needs_update = !(m_setting_angle && m_parent.is_using_slope());
+ if (needs_update) {
+ m_parent.use_slope(m_setting_angle);
+ m_parent.set_as_dirty();
+ }
+ }
+}
+
+
+
+void GLGizmoFdmSupports::select_facets_by_angle(float threshold_deg, bool block)
+{
+ float threshold = (M_PI/180.)*threshold_deg;
+ const Selection& selection = m_parent.get_selection();
+ const ModelObject* mo = m_c->selection_info()->model_object();
+ const ModelInstance* mi = mo->instances[selection.get_instance_idx()];
+
+ int mesh_id = -1;
+ for (const ModelVolume* mv : mo->volumes) {
+ if (! mv->is_model_part())
+ continue;
+
+ ++mesh_id;
+
+ const Transform3d trafo_matrix = mi->get_matrix(true) * mv->get_matrix(true);
+ Vec3f down = (trafo_matrix.inverse() * (-Vec3d::UnitZ())).cast<float>().normalized();
+ Vec3f limit = (trafo_matrix.inverse() * Vec3d(std::sin(threshold), 0, -std::cos(threshold))).cast<float>().normalized();
+
+ float dot_limit = limit.dot(down);
+
+ // Now calculate dot product of vert_direction and facets' normals.
+ int idx = -1;
+ for (const stl_facet& facet : mv->mesh().stl.facet_start) {
+ ++idx;
+ if (facet.normal.dot(down) > dot_limit)
+ m_triangle_selectors[mesh_id]->set_facet(idx,
+ block
+ ? EnforcerBlockerType::BLOCKER
+ : EnforcerBlockerType::ENFORCER);
+ }
+ }
+
+ activate_internal_undo_redo_stack(true);
+
+ Plater::TakeSnapshot(wxGetApp().plater(), block ? _L("Block supports by angle")
+ : _L("Add supports by angle"));
+ update_model_object();
+ m_parent.set_as_dirty();
+ m_setting_angle = false;
+}
+
+
+
+void GLGizmoFdmSupports::update_model_object() const
+{
+ bool updated = false;
+ ModelObject* mo = m_c->selection_info()->model_object();
+ int idx = -1;
+ for (ModelVolume* mv : mo->volumes) {
+ if (! mv->is_model_part())
+ continue;
+ ++idx;
+ updated |= mv->supported_facets.set(*m_triangle_selectors[idx].get());
+ }
+
+ if (updated)
+ m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS));
+}
+
+
+
+void GLGizmoFdmSupports::update_from_model_object()
+{
+ wxBusyCursor wait;
+
+ const ModelObject* mo = m_c->selection_info()->model_object();
+ m_triangle_selectors.clear();
+
+ int volume_id = -1;
+ for (const ModelVolume* mv : mo->volumes) {
+ if (! mv->is_model_part())
+ continue;
+
+ ++volume_id;
+
+ // This mesh does not account for the possible Z up SLA offset.
+ const TriangleMesh* mesh = &mv->mesh();
+
+ m_triangle_selectors.emplace_back(std::make_unique<TriangleSelectorGUI>(*mesh));
+ m_triangle_selectors.back()->deserialize(mv->supported_facets.get_data());
+ }
+}
+
+
+
+PainterGizmoType GLGizmoFdmSupports::get_painter_type() const
+{
+ return PainterGizmoType::FDM_SUPPORTS;
+}
+
+
+} // namespace GUI
+} // namespace Slic3r
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp
new file mode 100644
index 000000000..fc9770787
--- /dev/null
+++ b/src/slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp
@@ -0,0 +1,47 @@
+#ifndef slic3r_GLGizmoFdmSupports_hpp_
+#define slic3r_GLGizmoFdmSupports_hpp_
+
+#include "GLGizmoPainterBase.hpp"
+
+namespace Slic3r {
+
+namespace GUI {
+
+class GLGizmoFdmSupports : public GLGizmoPainterBase
+{
+public:
+ GLGizmoFdmSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id)
+ : GLGizmoPainterBase(parent, icon_filename, sprite_id) {}
+
+ void render_painter_gizmo() const override;
+
+protected:
+ void on_render_input_window(float x, float y, float bottom_limit) override;
+ std::string on_get_name() const override;
+
+private:
+ bool on_init() override;
+
+ void update_model_object() const override;
+ void update_from_model_object() override;
+
+ void on_opening() override {}
+ void on_shutdown() override;
+ PainterGizmoType get_painter_type() const override;
+
+ void select_facets_by_angle(float threshold, bool block);
+ float m_angle_threshold_deg = 45.f;
+ bool m_setting_angle = false;
+
+ // This map holds all translated description texts, so they can be easily referenced during layout calculations
+ // etc. When language changes, GUI is recreated and this class constructed again, so the change takes effect.
+ std::map<std::string, wxString> m_desc;
+};
+
+
+
+} // namespace GUI
+} // namespace Slic3r
+
+
+#endif // slic3r_GLGizmoFdmSupports_hpp_
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp
index 9fae8893a..fc5edff6d 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.cpp
@@ -1,7 +1,9 @@
// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro.
#include "GLGizmoFlatten.hpp"
#include "slic3r/GUI/GLCanvas3D.hpp"
-#include "slic3r/GUI/GUI_App.hpp"
+#include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp"
+
+#include "libslic3r/Model.hpp"
#include <numeric>
@@ -26,23 +28,16 @@ bool GLGizmoFlatten::on_init()
void GLGizmoFlatten::on_set_state()
{
- // m_model_object pointer can be invalid (for instance because of undo/redo action),
- // we should recover it from the object id
- m_model_object = nullptr;
- for (const auto mo : wxGetApp().model().objects) {
- if (mo->id() == m_model_object_id) {
- m_model_object = mo;
- break;
- }
- }
+}
- if (m_state == On && is_plane_update_necessary())
- update_planes();
+CommonGizmosDataID GLGizmoFlatten::on_get_requirements() const
+{
+ return CommonGizmosDataID::SelectionInfo;
}
std::string GLGizmoFlatten::on_get_name() const
{
- return (_(L("Place on face")) + " [F]").ToUTF8().data();
+ return (_L("Place on face") + " [F]").ToUTF8().data();
}
bool GLGizmoFlatten::on_is_activable() const
@@ -52,8 +47,7 @@ bool GLGizmoFlatten::on_is_activable() const
void GLGizmoFlatten::on_start_dragging()
{
- if (m_hover_id != -1)
- {
+ if (m_hover_id != -1) {
assert(m_planes_valid);
m_normal = m_planes[m_hover_id].normal;
m_starting_center = m_parent.get_selection().get_bounding_box().center();
@@ -69,27 +63,21 @@ void GLGizmoFlatten::on_render() const
glsafe(::glEnable(GL_DEPTH_TEST));
glsafe(::glEnable(GL_BLEND));
- if (selection.is_single_full_instance())
- {
+ if (selection.is_single_full_instance()) {
const Transform3d& m = selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix();
glsafe(::glPushMatrix());
glsafe(::glTranslatef(0.f, 0.f, selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z()));
glsafe(::glMultMatrixd(m.data()));
if (this->is_plane_update_necessary())
const_cast<GLGizmoFlatten*>(this)->update_planes();
- for (int i = 0; i < (int)m_planes.size(); ++i)
- {
+ for (int i = 0; i < (int)m_planes.size(); ++i) {
if (i == m_hover_id)
glsafe(::glColor4f(0.9f, 0.9f, 0.9f, 0.75f));
else
glsafe(::glColor4f(0.9f, 0.9f, 0.9f, 0.5f));
- ::glBegin(GL_POLYGON);
- for (const Vec3d& vertex : m_planes[i].vertices)
- {
- ::glVertex3dv(vertex.data());
- }
- glsafe(::glEnd());
+ if (m_planes[i].vbo.has_VBOs())
+ m_planes[i].vbo.render();
}
glsafe(::glPopMatrix());
}
@@ -105,23 +93,16 @@ void GLGizmoFlatten::on_render_for_picking() const
glsafe(::glDisable(GL_DEPTH_TEST));
glsafe(::glDisable(GL_BLEND));
- if (selection.is_single_full_instance())
- {
+ if (selection.is_single_full_instance() && !wxGetKeyState(WXK_CONTROL)) {
const Transform3d& m = selection.get_volume(*selection.get_volume_idxs().begin())->get_instance_transformation().get_matrix();
glsafe(::glPushMatrix());
glsafe(::glTranslatef(0.f, 0.f, selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z()));
glsafe(::glMultMatrixd(m.data()));
if (this->is_plane_update_necessary())
const_cast<GLGizmoFlatten*>(this)->update_planes();
- for (int i = 0; i < (int)m_planes.size(); ++i)
- {
+ for (int i = 0; i < (int)m_planes.size(); ++i) {
glsafe(::glColor4fv(picking_color_component(i).data()));
- ::glBegin(GL_POLYGON);
- for (const Vec3d& vertex : m_planes[i].vertices)
- {
- ::glVertex3dv(vertex.data());
- }
- glsafe(::glEnd());
+ m_planes[i].vbo.render();
}
glsafe(::glPopMatrix());
}
@@ -132,19 +113,17 @@ void GLGizmoFlatten::on_render_for_picking() const
void GLGizmoFlatten::set_flattening_data(const ModelObject* model_object)
{
m_starting_center = Vec3d::Zero();
- if (m_model_object != model_object) {
+ if (model_object != m_old_model_object) {
m_planes.clear();
m_planes_valid = false;
}
- m_model_object = model_object;
- m_model_object_id = model_object ? model_object->id() : 0;
}
void GLGizmoFlatten::update_planes()
{
+ const ModelObject* mo = m_c->selection_info()->model_object();
TriangleMesh ch;
- for (const ModelVolume* vol : m_model_object->volumes)
- {
+ for (const ModelVolume* vol : mo->volumes) {
if (vol->type() != ModelVolumeType::MODEL_PART)
continue;
TriangleMesh vol_ch = vol->get_convex_hull();
@@ -153,7 +132,7 @@ void GLGizmoFlatten::update_planes()
}
ch = ch.convex_hull_3d();
m_planes.clear();
- const Transform3d& inst_matrix = m_model_object->instances.front()->get_matrix(true);
+ const Transform3d& inst_matrix = mo->instances.front()->get_matrix(true);
// Following constants are used for discarding too small polygons.
const float minimal_area = 5.f; // in square mm (world coordinates)
@@ -186,7 +165,7 @@ void GLGizmoFlatten::update_planes()
if (std::abs(this_normal(0) - (*normal_ptr)(0)) < 0.001 && std::abs(this_normal(1) - (*normal_ptr)(1)) < 0.001 && std::abs(this_normal(2) - (*normal_ptr)(2)) < 0.001) {
stl_vertex* first_vertex = ch.stl.facet_start[facet_idx].vertex;
for (int j=0; j<3; ++j)
- m_planes.back().vertices.emplace_back((double)first_vertex[j](0), (double)first_vertex[j](1), (double)first_vertex[j](2));
+ m_planes.back().vertices.emplace_back(first_vertex[j].cast<double>());
facet_visited[facet_idx] = true;
for (int j = 0; j < 3; ++ j) {
@@ -198,15 +177,16 @@ void GLGizmoFlatten::update_planes()
}
m_planes.back().normal = normal_ptr->cast<double>();
+ Pointf3s& verts = m_planes.back().vertices;
// Now we'll transform all the points into world coordinates, so that the areas, angles and distances
// make real sense.
- m_planes.back().vertices = transform(m_planes.back().vertices, inst_matrix);
+ verts = transform(verts, inst_matrix);
// if this is a just a very small triangle, remove it to speed up further calculations (it would be rejected later anyway):
- if (m_planes.back().vertices.size() == 3 &&
- ((m_planes.back().vertices[0] - m_planes.back().vertices[1]).norm() < minimal_side
- || (m_planes.back().vertices[0] - m_planes.back().vertices[2]).norm() < minimal_side
- || (m_planes.back().vertices[1] - m_planes.back().vertices[2]).norm() < minimal_side))
+ if (verts.size() == 3 &&
+ ((verts[0] - verts[1]).norm() < minimal_side
+ || (verts[0] - verts[2]).norm() < minimal_side
+ || (verts[1] - verts[2]).norm() < minimal_side))
m_planes.pop_back();
}
@@ -331,12 +311,28 @@ void GLGizmoFlatten::update_planes()
// Planes are finished - let's save what we calculated it from:
m_volumes_matrices.clear();
m_volumes_types.clear();
- for (const ModelVolume* vol : m_model_object->volumes) {
+ for (const ModelVolume* vol : mo->volumes) {
m_volumes_matrices.push_back(vol->get_matrix());
m_volumes_types.push_back(vol->type());
}
- m_first_instance_scale = m_model_object->instances.front()->get_scaling_factor();
- m_first_instance_mirror = m_model_object->instances.front()->get_mirror();
+ m_first_instance_scale = mo->instances.front()->get_scaling_factor();
+ m_first_instance_mirror = mo->instances.front()->get_mirror();
+ m_old_model_object = mo;
+
+ // And finally create respective VBOs. The polygon is convex with
+ // the vertices in order, so triangulation is trivial.
+ for (auto& plane : m_planes) {
+ plane.vbo.reserve(plane.vertices.size());
+ for (const auto& vert : plane.vertices)
+ plane.vbo.push_geometry(vert, plane.normal);
+ for (size_t i=1; i<plane.vertices.size()-1; ++i)
+ plane.vbo.push_triangle(0, i, i+1); // triangle fan
+ plane.vbo.finalize_geometry(true);
+ // FIXME: vertices should really be local, they need not
+ // persist now when we use VBOs
+ plane.vertices.clear();
+ plane.vertices.shrink_to_fit();
+ }
m_planes_valid = true;
}
@@ -344,20 +340,22 @@ void GLGizmoFlatten::update_planes()
bool GLGizmoFlatten::is_plane_update_necessary() const
{
- if (m_state != On || !m_model_object || m_model_object->instances.empty())
+ const ModelObject* mo = m_c->selection_info()->model_object();
+ if (m_state != On || ! mo || mo->instances.empty())
return false;
- if (! m_planes_valid || m_model_object->volumes.size() != m_volumes_matrices.size())
+ if (! m_planes_valid || mo != m_old_model_object
+ || mo->volumes.size() != m_volumes_matrices.size())
return true;
// We want to recalculate when the scale changes - some planes could (dis)appear.
- if (! m_model_object->instances.front()->get_scaling_factor().isApprox(m_first_instance_scale)
- || ! m_model_object->instances.front()->get_mirror().isApprox(m_first_instance_mirror))
+ if (! mo->instances.front()->get_scaling_factor().isApprox(m_first_instance_scale)
+ || ! mo->instances.front()->get_mirror().isApprox(m_first_instance_mirror))
return true;
- for (unsigned int i=0; i < m_model_object->volumes.size(); ++i)
- if (! m_model_object->volumes[i]->get_matrix().isApprox(m_volumes_matrices[i])
- || m_model_object->volumes[i]->type() != m_volumes_types[i])
+ for (unsigned int i=0; i < mo->volumes.size(); ++i)
+ if (! mo->volumes[i]->get_matrix().isApprox(m_volumes_matrices[i])
+ || mo->volumes[i]->type() != m_volumes_types[i])
return true;
return false;
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp
index 9cd2ab6bb..f6fe06451 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoFlatten.hpp
@@ -2,9 +2,14 @@
#define slic3r_GLGizmoFlatten_hpp_
#include "GLGizmoBase.hpp"
+#include "slic3r/GUI/3DScene.hpp"
namespace Slic3r {
+
+enum class ModelVolumeType : int;
+
+
namespace GUI {
@@ -16,7 +21,8 @@ private:
mutable Vec3d m_normal;
struct PlaneData {
- std::vector<Vec3d> vertices;
+ std::vector<Vec3d> vertices; // should be in fact local in update_planes()
+ GLIndexedVertexArray vbo;
Vec3d normal;
float area;
};
@@ -30,8 +36,7 @@ private:
std::vector<PlaneData> m_planes;
bool m_planes_valid = false;
mutable Vec3d m_starting_center;
- const ModelObject* m_model_object = nullptr;
- ObjectID m_model_object_id = 0;
+ const ModelObject* m_old_model_object = nullptr;
std::vector<const Transform3d*> instances_matrices;
void update_planes();
@@ -51,6 +56,7 @@ protected:
virtual void on_render() const override;
virtual void on_render_for_picking() const override;
virtual void on_set_state() override;
+ virtual CommonGizmosDataID on_get_requirements() const override;
};
} // namespace GUI
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
index f33a7bd8b..3d0d9c79a 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.cpp
@@ -1,17 +1,17 @@
#include "GLGizmoHollow.hpp"
#include "slic3r/GUI/GLCanvas3D.hpp"
-#include "slic3r/GUI/Gizmos/GLGizmos.hpp"
+#include "slic3r/GUI/Camera.hpp"
+#include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp"
#include <GL/glew.h>
#include "slic3r/GUI/GUI_App.hpp"
#include "slic3r/GUI/GUI_ObjectSettings.hpp"
#include "slic3r/GUI/GUI_ObjectList.hpp"
-#include "slic3r/GUI/MeshUtils.hpp"
#include "slic3r/GUI/Plater.hpp"
-#include "slic3r/GUI/PresetBundle.hpp"
-#include "libslic3r/SLAPrint.hpp"
-#include "libslic3r/TriangleMesh.hpp"
+#include "libslic3r/PresetBundle.hpp"
+
+#include "libslic3r/Model.hpp"
namespace Slic3r {
@@ -55,32 +55,17 @@ bool GLGizmoHollow::on_init()
void GLGizmoHollow::set_sla_support_data(ModelObject*, const Selection&)
{
- if (m_c->recent_update) {
-
- if (m_state == On)
- m_c->build_AABB_if_needed();
-
- update_clipping_plane(m_c->m_clipping_plane_was_moved);
-
- // This is a temporary and not very nice hack, to make sure that
- // if the cp was moved by the data returned by backend, it will
- // remember its direction. FIXME: Refactor this mess and make
- // the clipping plane itself part of the shared data.
- if (! m_c->m_clipping_plane_was_moved && m_c->m_clipping_plane_distance == 0.25f)
- m_c->m_clipping_plane_was_moved = true;
-
+ if (! m_c->selection_info())
+ return;
- if (m_c->m_model_object) {
+ const ModelObject* mo = m_c->selection_info()->model_object();
+ if (m_state == On && mo) {
+ if (m_old_mo_id != mo->id()) {
reload_cache();
- if (m_c->has_drilled_mesh())
- m_holes_in_drilled_mesh = m_c->m_model_object->sla_drain_holes;
+ m_old_mo_id = mo->id();
}
- }
-
- if (m_state == On) {
- m_parent.toggle_model_objects_visibility(false);
- m_parent.toggle_model_objects_visibility(true, m_c->m_model_object, m_c->m_active_instance);
- m_parent.toggle_sla_auxiliaries_visibility(m_show_supports, m_c->m_model_object, m_c->m_active_instance);
+ if (m_c->hollowed_mesh() && m_c->hollowed_mesh()->get_hollowed_mesh())
+ m_holes_in_drilled_mesh = mo->sla_drain_holes;
}
}
@@ -89,137 +74,30 @@ void GLGizmoHollow::set_sla_support_data(ModelObject*, const Selection&)
void GLGizmoHollow::on_render() const
{
const Selection& selection = m_parent.get_selection();
+ const CommonGizmosDataObjects::SelectionInfo* sel_info = m_c->selection_info();
// If current m_c->m_model_object does not match selection, ask GLCanvas3D to turn us off
if (m_state == On
- && (m_c->m_model_object != selection.get_model()->objects[selection.get_object_idx()]
- || m_c->m_active_instance != selection.get_instance_idx()
- || m_c->m_model_object_id != m_c->m_model_object->id())) {
+ && (sel_info->model_object() != selection.get_model()->objects[selection.get_object_idx()]
+ || sel_info->get_active_instance() != selection.get_instance_idx())) {
m_parent.post_event(SimpleEvent(EVT_GLCANVAS_RESETGIZMOS));
return;
}
- // !!! is it necessary?
- //const_cast<GLGizmoHollow*>(this)->m_c->update_from_backend(m_parent, m_c->m_model_object);
-
glsafe(::glEnable(GL_BLEND));
glsafe(::glEnable(GL_DEPTH_TEST));
- m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z();
-
- render_hollowed_mesh();
-
if (m_quadric != nullptr && selection.is_from_single_instance())
render_points(selection, false);
m_selection_rectangle.render(m_parent);
- render_clipping_plane(selection);
+ m_c->object_clipper()->render_cut();
+ m_c->supports_clipper()->render_cut();
glsafe(::glDisable(GL_BLEND));
}
-
-void GLGizmoHollow::render_hollowed_mesh() const
-{
- /*if (m_c->m_volume_with_cavity) {
- m_c->m_volume_with_cavity->set_sla_shift_z(m_z_shift);
- m_parent.get_shader().start_using();
-
- GLint current_program_id;
- glsafe(::glGetIntegerv(GL_CURRENT_PROGRAM, &current_program_id));
- GLint color_id = (current_program_id > 0) ? ::glGetUniformLocation(current_program_id, "uniform_color") : -1;
- GLint print_box_detection_id = (current_program_id > 0) ? ::glGetUniformLocation(current_program_id, "print_box.volume_detection") : -1;
- GLint print_box_worldmatrix_id = (current_program_id > 0) ? ::glGetUniformLocation(current_program_id, "print_box.volume_world_matrix") : -1;
- glcheck();
- m_c->m_volume_with_cavity->set_render_color();
- const Geometry::Transformation& volume_trafo = m_c->m_model_object->volumes.front()->get_transformation();
- m_c->m_volume_with_cavity->set_volume_transformation(volume_trafo);
- m_c->m_volume_with_cavity->set_instance_transformation(m_c->m_model_object->instances[size_t(m_c->m_active_instance)]->get_transformation());
- m_c->m_volume_with_cavity->render(color_id, print_box_detection_id, print_box_worldmatrix_id);
- m_parent.get_shader().stop_using();
- }*/
-}
-
-
-void GLGizmoHollow::render_clipping_plane(const Selection& selection) const
-{
- if (m_c->m_clipping_plane_distance == 0.f)
- return;
-
- // Get transformation of the instance
- const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin());
- Geometry::Transformation trafo = vol->get_instance_transformation();
- trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_z_shift));
-
- // Get transformation of supports
- Geometry::Transformation supports_trafo;
- supports_trafo.set_offset(Vec3d(trafo.get_offset()(0), trafo.get_offset()(1), vol->get_sla_shift_z()));
- supports_trafo.set_rotation(Vec3d(0., 0., trafo.get_rotation()(2)));
- // I don't know why, but following seems to be correct.
- supports_trafo.set_mirror(Vec3d(trafo.get_mirror()(0) * trafo.get_mirror()(1) * trafo.get_mirror()(2),
- 1,
- 1.));
-
- // Now initialize the TMS for the object, perform the cut and save the result.
- if (! m_c->m_object_clipper) {
- m_c->m_object_clipper.reset(new MeshClipper);
- m_c->m_object_clipper->set_mesh(*m_c->mesh());
- }
- m_c->m_object_clipper->set_plane(*m_c->m_clipping_plane);
- m_c->m_object_clipper->set_transformation(trafo);
-
-
- // Next, ask the backend if supports are already calculated. If so, we are gonna cut them too.
- //if (m_c->m_print_object_idx < 0)
- // m_c->update_from_backend(m_parent, m_c->m_model_object);
-
- if (m_c->m_print_object_idx >= 0) {
- const SLAPrintObject* print_object = m_parent.sla_print()->objects()[m_c->m_print_object_idx];
-
- if (print_object->is_step_done(slaposSupportTree) && !print_object->get_mesh(slaposSupportTree).empty()) {
- // If the supports are already calculated, save the timestamp of the respective step
- // so we can later tell they were recalculated.
- size_t timestamp = print_object->step_state_with_timestamp(slaposSupportTree).timestamp;
-
- if (! m_c->m_supports_clipper || (int)timestamp != m_c->m_old_timestamp) {
- // The timestamp has changed.
- m_c->m_supports_clipper.reset(new MeshClipper);
- // The mesh should already have the shared vertices calculated.
- m_c->m_supports_clipper->set_mesh(print_object->support_mesh());
- m_c->m_old_timestamp = timestamp;
- }
- m_c->m_supports_clipper->set_plane(*m_c->m_clipping_plane);
- m_c->m_supports_clipper->set_transformation(supports_trafo);
- }
- else
- // The supports are not valid. We better dump the cached data.
- m_c->m_supports_clipper.reset();
- }
-
- // At this point we have the triangulated cuts for both the object and supports - let's render.
- if (! m_c->m_object_clipper->get_triangles().empty()) {
- ::glPushMatrix();
- ::glColor3f(1.0f, 0.37f, 0.0f);
- ::glBegin(GL_TRIANGLES);
- for (const Vec3f& point : m_c->m_object_clipper->get_triangles())
- ::glVertex3f(point(0), point(1), point(2));
- ::glEnd();
- ::glPopMatrix();
- }
-
- if (m_show_supports && m_c->m_supports_clipper && ! m_c->m_supports_clipper->get_triangles().empty()) {
- ::glPushMatrix();
- ::glColor3f(1.0f, 0.f, 0.37f);
- ::glBegin(GL_TRIANGLES);
- for (const Vec3f& point : m_c->m_supports_clipper->get_triangles())
- ::glVertex3f(point(0), point(1), point(2));
- ::glEnd();
- ::glPopMatrix();
- }
-}
-
-
void GLGizmoHollow::on_render_for_picking() const
{
const Selection& selection = m_parent.get_selection();
@@ -229,7 +107,6 @@ void GLGizmoHollow::on_render_for_picking() const
glsafe(::glEnable(GL_DEPTH_TEST));
render_points(selection, true);
- render_hollowed_mesh();
}
void GLGizmoHollow::render_points(const Selection& selection, bool picking) const
@@ -242,17 +119,18 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons
const Transform3d& instance_matrix = vol->get_instance_transformation().get_matrix();
glsafe(::glPushMatrix());
- glsafe(::glTranslated(0.0, 0.0, m_z_shift));
+ glsafe(::glTranslated(0.0, 0.0, m_c->selection_info()->get_sla_shift()));
glsafe(::glMultMatrixd(instance_matrix.data()));
float render_color[4];
- size_t cache_size = m_c->m_model_object->sla_drain_holes.size();
+ const sla::DrainHoles& drain_holes = m_c->selection_info()->model_object()->sla_drain_holes;
+ size_t cache_size = drain_holes.size();
for (size_t i = 0; i < cache_size; ++i)
{
- const sla::DrainHole& drain_hole = m_c->m_model_object->sla_drain_holes[i];
+ const sla::DrainHole& drain_hole = drain_holes[i];
const bool& point_selected = m_selected[i];
- if (is_mesh_point_clipped((drain_hole.pos+m_c->HoleStickOutLength*drain_hole.normal).cast<double>()))
+ if (is_mesh_point_clipped(drain_hole.pos.cast<double>()))
continue;
// First decide about the color of the point.
@@ -290,17 +168,16 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons
glFrontFace(GL_CW);
// Matrices set, we can render the point mark now.
-
Eigen::Quaterniond q;
q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * (-drain_hole.normal).cast<double>());
Eigen::AngleAxisd aa(q);
glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2)));
glsafe(::glPushMatrix());
glsafe(::glTranslated(0., 0., -drain_hole.height));
- ::gluCylinder(m_quadric, drain_hole.radius, drain_hole.radius, drain_hole.height, 24, 1);
- glsafe(::glTranslated(0., 0., drain_hole.height));
+ ::gluCylinder(m_quadric, drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength, 24, 1);
+ glsafe(::glTranslated(0., 0., drain_hole.height + sla::HoleStickOutLength));
::gluDisk(m_quadric, 0.0, drain_hole.radius, 24, 1);
- glsafe(::glTranslated(0., 0., -drain_hole.height));
+ glsafe(::glTranslated(0., 0., -drain_hole.height - sla::HoleStickOutLength));
glsafe(::glRotatef(180.f, 1.f, 0.f, 0.f));
::gluDisk(m_quadric, 0.0, drain_hole.radius, 24, 1);
glsafe(::glPopMatrix());
@@ -326,12 +203,17 @@ void GLGizmoHollow::render_points(const Selection& selection, bool picking) cons
bool GLGizmoHollow::is_mesh_point_clipped(const Vec3d& point) const
{
- if (m_c->m_clipping_plane_distance == 0.f)
+ if (m_c->object_clipper()->get_position() == 0.)
return false;
- Vec3d transformed_point = m_c->m_model_object->instances[m_c->m_active_instance]->get_transformation().get_matrix() * point;
- transformed_point(2) += m_z_shift;
- return m_c->m_clipping_plane->is_point_clipped(transformed_point);
+ auto sel_info = m_c->selection_info();
+ int active_inst = m_c->selection_info()->get_active_instance();
+ const ModelInstance* mi = sel_info->model_object()->instances[active_inst];
+ const Transform3d& trafo = mi->get_transformation().get_matrix();
+
+ Vec3d transformed_point = trafo * point;
+ transformed_point(2) += sel_info->get_sla_shift();
+ return m_c->object_clipper()->get_clipping_plane()->is_point_clipped(transformed_point);
}
@@ -340,31 +222,30 @@ bool GLGizmoHollow::is_mesh_point_clipped(const Vec3d& point) const
// Return false if no intersection was found, true otherwise.
bool GLGizmoHollow::unproject_on_mesh(const Vec2d& mouse_pos, std::pair<Vec3f, Vec3f>& pos_and_normal)
{
- if (! m_c->m_mesh_raycaster)
+ if (! m_c->raycaster()->raycaster())
return false;
- // if the gizmo doesn't have the V, F structures for igl, calculate them first:
- // !!! is it really necessary?
- //m_c->update_from_backend(m_parent, m_c->m_model_object);
-
- const Camera& camera = m_parent.get_camera();
+ const Camera& camera = wxGetApp().plater()->get_camera();
const Selection& selection = m_parent.get_selection();
const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin());
Geometry::Transformation trafo = volume->get_instance_transformation();
- trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_z_shift));
+ trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_c->selection_info()->get_sla_shift()));
+
+ double clp_dist = m_c->object_clipper()->get_position();
+ const ClippingPlane* clp = m_c->object_clipper()->get_clipping_plane();
// The raycaster query
Vec3f hit;
Vec3f normal;
- if (m_c->m_mesh_raycaster->unproject_on_mesh(
+ if (m_c->raycaster()->raycaster()->unproject_on_mesh(
mouse_pos,
trafo.get_matrix(),
camera,
hit,
normal,
- m_c->m_clipping_plane_distance != 0.f ? m_c->m_clipping_plane.get() : nullptr))
+ clp_dist != 0. ? clp : nullptr))
{
- if (m_c->has_drilled_mesh()) {
+ if (m_c->hollowed_mesh() && m_c->hollowed_mesh()->get_hollowed_mesh()) {
// in this case the raycaster sees the hollowed and drilled mesh.
// if the point lies on the surface created by the hole, we want
// to ignore it.
@@ -391,6 +272,10 @@ bool GLGizmoHollow::unproject_on_mesh(const Vec2d& mouse_pos, std::pair<Vec3f, V
// concludes that the event was not intended for it, it should return false.
bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down)
{
+ ModelObject* mo = m_c->selection_info()->model_object();
+ int active_inst = m_c->selection_info()->get_active_instance();
+
+
// left down with shift - show the selection rectangle:
if (action == SLAGizmoEventType::LeftDown && (shift_down || alt_down || control_down)) {
if (m_hover_id == -1) {
@@ -422,15 +307,10 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos
if (unproject_on_mesh(mouse_position, pos_and_normal)) { // we got an intersection
Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Add drainage hole")));
- Vec3d scaling = m_c->m_model_object->instances[m_c->m_active_instance]->get_scaling_factor();
- Vec3f normal_transformed(pos_and_normal.second(0)/scaling(0),
- pos_and_normal.second(1)/scaling(1),
- pos_and_normal.second(2)/scaling(2));
-
- m_c->m_model_object->sla_drain_holes.emplace_back(pos_and_normal.first + m_c->HoleStickOutLength * pos_and_normal.second/* normal_transformed.normalized()*/,
- -pos_and_normal.second, m_new_hole_radius, m_new_hole_height);
+ mo->sla_drain_holes.emplace_back(pos_and_normal.first,
+ -pos_and_normal.second, m_new_hole_radius, m_new_hole_height);
m_selected.push_back(false);
- assert(m_selected.size() == m_c->m_model_object->sla_drain_holes.size());
+ assert(m_selected.size() == mo->sla_drain_holes.size());
m_parent.set_as_dirty();
m_wait_for_up_event = true;
}
@@ -449,11 +329,11 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos
GLSelectionRectangle::EState rectangle_status = m_selection_rectangle.get_state();
// First collect positions of all the points in world coordinates.
- Geometry::Transformation trafo = m_c->m_model_object->instances[m_c->m_active_instance]->get_transformation();
- trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_z_shift));
+ Geometry::Transformation trafo = mo->instances[active_inst]->get_transformation();
+ trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_c->selection_info()->get_sla_shift()));
std::vector<Vec3d> points;
- for (unsigned int i=0; i<m_c->m_model_object->sla_drain_holes.size(); ++i)
- points.push_back(trafo.get_matrix() * m_c->m_model_object->sla_drain_holes[i].pos.cast<double>());
+ for (unsigned int i=0; i<mo->sla_drain_holes.size(); ++i)
+ points.push_back(trafo.get_matrix() * mo->sla_drain_holes[i].pos.cast<double>());
// Now ask the rectangle which of the points are inside.
std::vector<Vec3f> points_inside;
@@ -462,7 +342,9 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos
points_inside.push_back(points[idx].cast<float>());
// Only select/deselect points that are actually visible
- for (size_t idx : m_c->m_mesh_raycaster->get_unobscured_idxs(trafo, m_parent.get_camera(), points_inside, m_c->m_clipping_plane.get()))
+ for (size_t idx : m_c->raycaster()->raycaster()->get_unobscured_idxs(
+ trafo, wxGetApp().plater()->get_camera(), points_inside,
+ m_c->object_clipper()->get_clipping_plane()))
{
if (rectangle_status == GLSelectionRectangle::Deselect)
unselect_point(points_idxs[idx]);
@@ -516,20 +398,21 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos
}
if (action == SLAGizmoEventType::MouseWheelUp && control_down) {
- m_c->m_clipping_plane_distance = std::min(1.f, m_c->m_clipping_plane_distance + 0.01f);
- update_clipping_plane(m_c->m_clipping_plane_was_moved);
- m_c->m_clipping_plane_was_moved = true;
+ double pos = m_c->object_clipper()->get_position();
+ pos = std::min(1., pos + 0.01);
+ m_c->object_clipper()->set_position(pos, true);
return true;
}
if (action == SLAGizmoEventType::MouseWheelDown && control_down) {
- m_c->m_clipping_plane_distance = std::max(0.f, m_c->m_clipping_plane_distance - 0.01f);
- update_clipping_plane(true);
+ double pos = m_c->object_clipper()->get_position();
+ pos = std::max(0., pos - 0.01);
+ m_c->object_clipper()->set_position(pos, true);
return true;
}
if (action == SLAGizmoEventType::ResetClippingPlane) {
- update_clipping_plane();
+ m_c->object_clipper()->set_position(-1., false);
return true;
}
@@ -539,11 +422,12 @@ bool GLGizmoHollow::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_pos
void GLGizmoHollow::delete_selected_points()
{
Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Delete drainage hole")));
+ sla::DrainHoles& drain_holes = m_c->selection_info()->model_object()->sla_drain_holes;
- for (unsigned int idx=0; idx<m_c->m_model_object->sla_drain_holes.size(); ++idx) {
+ for (unsigned int idx=0; idx<drain_holes.size(); ++idx) {
if (m_selected[idx]) {
m_selected.erase(m_selected.begin()+idx);
- m_c->m_model_object->sla_drain_holes.erase(m_c->m_model_object->sla_drain_holes.begin() + (idx--));
+ drain_holes.erase(drain_holes.begin() + (idx--));
}
}
@@ -552,104 +436,37 @@ void GLGizmoHollow::delete_selected_points()
void GLGizmoHollow::on_update(const UpdateData& data)
{
+ sla::DrainHoles& drain_holes = m_c->selection_info()->model_object()->sla_drain_holes;
+
if (m_hover_id != -1) {
std::pair<Vec3f, Vec3f> pos_and_normal;
if (! unproject_on_mesh(data.mouse_pos.cast<double>(), pos_and_normal))
return;
- m_c->m_model_object->sla_drain_holes[m_hover_id].pos = pos_and_normal.first + m_c->HoleStickOutLength * pos_and_normal.second;
- m_c->m_model_object->sla_drain_holes[m_hover_id].normal = -pos_and_normal.second;
+ drain_holes[m_hover_id].pos = pos_and_normal.first;
+ drain_holes[m_hover_id].normal = -pos_and_normal.second;
}
}
-std::pair<const TriangleMesh *, sla::HollowingConfig> GLGizmoHollow::get_hollowing_parameters() const
-{
- // FIXME this function is probably obsolete, caller could
- // get the data from model config himself
- auto opts = get_config_options({"hollowing_min_thickness", "hollowing_quality", "hollowing_closing_distance"});
- double offset = static_cast<const ConfigOptionFloat*>(opts[0].first)->value;
- double quality = static_cast<const ConfigOptionFloat*>(opts[1].first)->value;
- double closing_d = static_cast<const ConfigOptionFloat*>(opts[2].first)->value;
- return std::make_pair(m_c->m_mesh, sla::HollowingConfig{offset, quality, closing_d});
-}
-
-void GLGizmoHollow::update_mesh_raycaster(std::unique_ptr<MeshRaycaster> &&rc)
-{
- m_c->m_mesh_raycaster = std::move(rc);
- m_c->m_object_clipper.reset();
- //m_c->m_volume_with_cavity.reset();
-}
void GLGizmoHollow::hollow_mesh(bool postpone_error_messages)
{
- // Trigger a UI job to hollow the mesh.
- // wxGetApp().plater()->hollow();
-
wxGetApp().CallAfter([this, postpone_error_messages]() {
- wxGetApp().plater()->reslice_SLA_hollowing(*m_c->m_model_object, postpone_error_messages);
+ wxGetApp().plater()->reslice_SLA_hollowing(
+ *m_c->selection_info()->model_object(), postpone_error_messages);
});
}
-void GLGizmoHollow::update_hollowed_mesh(std::unique_ptr<TriangleMesh> &&mesh)
-{
- // Called from Plater when the UI job finishes
- /*m_c->m_cavity_mesh = std::move(mesh);
-
- if(m_c->m_cavity_mesh) {
- // First subtract the holes:
- if (! m_c->m_model_object->sla_drain_holes.empty()) {
- TriangleMesh holes_mesh;
- for (const sla::DrainHole& hole : m_c->m_model_object->sla_drain_holes) {
- TriangleMesh hole_mesh = make_cylinder(hole.radius, hole.height, 2*M_PI/32);
-
- Vec3d scaling = m_c->m_model_object->instances[m_c->m_active_instance]->get_scaling_factor();
- Vec3d normal_transformed = Vec3d(hole.normal(0)/scaling(0), hole.normal(1)/scaling(1), hole.normal(2)/scaling(2));
- normal_transformed.normalize();
-
- // Rotate the cylinder appropriately
- Eigen::Quaterniond q;
- Transform3d m = Transform3d::Identity();
- m.matrix().block(0, 0, 3, 3) = q.setFromTwoVectors(Vec3d::UnitZ(), normal_transformed).toRotationMatrix();
- hole_mesh.transform(m);
-
- // If the instance is scaled, undo the scaling of the hole
- hole_mesh.scale(Vec3d(1/scaling(0), 1/scaling(1), 1/scaling(2)));
-
- // Translate the hole into position and merge with the others
- hole_mesh.translate(hole.pos);
- holes_mesh.merge(hole_mesh);
- holes_mesh.repair();
- }
- MeshBoolean::minus(*m_c->m_cavity_mesh.get(), holes_mesh);
- }
-
- // create a new GLVolume that only has the cavity inside
- m_c->m_volume_with_cavity.reset(new GLVolume(GLVolume::MODEL_COLOR[2]));
- m_c->m_volume_with_cavity->indexed_vertex_array.load_mesh(*m_c->m_cavity_mesh.get());
- m_c->m_volume_with_cavity->finalize_geometry(true);
- m_c->m_volume_with_cavity->force_transparent = false;
-
- m_parent.toggle_model_objects_visibility(false, m_c->m_model_object, m_c->m_active_instance);
- m_parent.toggle_sla_auxiliaries_visibility(true, m_c->m_model_object, m_c->m_active_instance);
-
- // Reset raycaster so it works with the new mesh:
- m_c->m_mesh_raycaster.reset(new MeshRaycaster(*m_c->mesh()));
- }
-
- if (m_c->m_clipping_plane_distance == 0.f) {
- m_c->m_clipping_plane_distance = 0.5f;
- update_clipping_plane();
- }*/
-}
-
-std::vector<std::pair<const ConfigOption*, const ConfigOptionDef*>> GLGizmoHollow::get_config_options(const std::vector<std::string>& keys) const
+std::vector<std::pair<const ConfigOption*, const ConfigOptionDef*>>
+GLGizmoHollow::get_config_options(const std::vector<std::string>& keys) const
{
std::vector<std::pair<const ConfigOption*, const ConfigOptionDef*>> out;
+ const ModelObject* mo = m_c->selection_info()->model_object();
- if (!m_c->m_model_object)
+ if (! mo)
return out;
- const DynamicPrintConfig& object_cfg = m_c->m_model_object->config;
+ const DynamicPrintConfig& object_cfg = mo->config.get();
const DynamicPrintConfig& print_cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config;
std::unique_ptr<DynamicPrintConfig> default_cfg = nullptr;
@@ -670,18 +487,10 @@ std::vector<std::pair<const ConfigOption*, const ConfigOptionDef*>> GLGizmoHollo
}
-ClippingPlane GLGizmoHollow::get_sla_clipping_plane() const
-{
- if (!m_c->m_model_object || m_state == Off || m_c->m_clipping_plane_distance == 0.f)
- return ClippingPlane::ClipsNothing();
- else
- return ClippingPlane(-m_c->m_clipping_plane->get_normal(), m_c->m_clipping_plane->get_data()[3]);
-}
-
-
void GLGizmoHollow::on_render_input_window(float x, float y, float bottom_limit)
{
- if (! m_c->m_model_object)
+ ModelObject* mo = m_c->selection_info()->model_object();
+ if (! mo)
return;
bool first_run = true; // This is a hack to redraw the button when all points are removed,
@@ -747,7 +556,7 @@ RENDER_AGAIN:
auto opts = get_config_options({"hollowing_enable"});
m_enable_hollowing = static_cast<const ConfigOptionBool*>(opts[0].first)->value;
if (m_imgui->checkbox(m_desc["enable"], m_enable_hollowing)) {
- m_c->m_model_object->config.opt<ConfigOptionBool>("hollowing_enable", true)->value = m_enable_hollowing;
+ mo->config.set("hollowing_enable", m_enable_hollowing);
wxGetApp().obj_list()->update_and_show_object_settings_item();
config_changed = true;
}
@@ -809,14 +618,14 @@ RENDER_AGAIN:
}
if (slider_edited || slider_released) {
if (slider_released) {
- m_c->m_model_object->config.opt<ConfigOptionFloat>("hollowing_min_thickness", true)->value = m_offset_stash;
- m_c->m_model_object->config.opt<ConfigOptionFloat>("hollowing_quality", true)->value = m_quality_stash;
- m_c->m_model_object->config.opt<ConfigOptionFloat>("hollowing_closing_distance", true)->value = m_closing_d_stash;
+ mo->config.set("hollowing_min_thickness", m_offset_stash);
+ mo->config.set("hollowing_quality", m_quality_stash);
+ mo->config.set("hollowing_closing_distance", m_closing_d_stash);
Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Hollowing parameter change")));
}
- m_c->m_model_object->config.opt<ConfigOptionFloat>("hollowing_min_thickness", true)->value = offset;
- m_c->m_model_object->config.opt<ConfigOptionFloat>("hollowing_quality", true)->value = quality;
- m_c->m_model_object->config.opt<ConfigOptionFloat>("hollowing_closing_distance", true)->value = closing_d;
+ mo->config.set("hollowing_min_thickness", offset);
+ mo->config.set("hollowing_quality", quality);
+ mo->config.set("hollowing_closing_distance", closing_d);
if (slider_released) {
wxGetApp().obj_list()->update_and_show_object_settings_item();
config_changed = true;
@@ -829,7 +638,6 @@ RENDER_AGAIN:
bool remove_selected = false;
bool remove_all = false;
- // m_imgui->text(" "); // vertical gap
ImGui::Separator();
float diameter_upper_cap = 15.;
@@ -848,9 +656,7 @@ RENDER_AGAIN:
m_imgui->text(m_desc["hole_depth"]);
ImGui::SameLine(diameter_slider_left);
- m_new_hole_height -= m_c->HoleStickOutLength;
ImGui::SliderFloat(" ", &m_new_hole_height, 0.f, 10.f, "%.1f mm");
- m_new_hole_height += m_c->HoleStickOutLength;
clicked |= ImGui::IsItemClicked();
edited |= ImGui::IsItemEdited();
@@ -862,19 +668,19 @@ RENDER_AGAIN:
// - take correct undo/redo snapshot after the user is done with moving the slider
if (! m_selection_empty) {
if (clicked) {
- m_holes_stash = m_c->m_model_object->sla_drain_holes;
+ m_holes_stash = mo->sla_drain_holes;
}
if (edited) {
for (size_t idx=0; idx<m_selected.size(); ++idx)
if (m_selected[idx]) {
- m_c->m_model_object->sla_drain_holes[idx].radius = m_new_hole_radius;
- m_c->m_model_object->sla_drain_holes[idx].height = m_new_hole_height;
+ mo->sla_drain_holes[idx].radius = m_new_hole_radius;
+ mo->sla_drain_holes[idx].height = m_new_hole_height;
}
}
if (deactivated) {
// momentarily restore the old value to take snapshot
- sla::DrainHoles new_holes = m_c->m_model_object->sla_drain_holes;
- m_c->m_model_object->sla_drain_holes = m_holes_stash;
+ sla::DrainHoles new_holes = mo->sla_drain_holes;
+ mo->sla_drain_holes = m_holes_stash;
float backup_rad = m_new_hole_radius;
float backup_hei = m_new_hole_height;
for (size_t i=0; i<m_holes_stash.size(); ++i) {
@@ -887,7 +693,7 @@ RENDER_AGAIN:
Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Change drainage hole diameter")));
m_new_hole_radius = backup_rad;
m_new_hole_height = backup_hei;
- m_c->m_model_object->sla_drain_holes = new_holes;
+ mo->sla_drain_holes = new_holes;
}
}
@@ -895,33 +701,33 @@ RENDER_AGAIN:
remove_selected = m_imgui->button(m_desc.at("remove_selected"));
m_imgui->disabled_end();
- m_imgui->disabled_begin(m_c->m_model_object->sla_drain_holes.empty());
+ m_imgui->disabled_begin(mo->sla_drain_holes.empty());
remove_all = m_imgui->button(m_desc.at("remove_all"));
m_imgui->disabled_end();
// Following is rendered in both editing and non-editing mode:
// m_imgui->text("");
ImGui::Separator();
- if (m_c->m_clipping_plane_distance == 0.f)
+ if (m_c->object_clipper()->get_position() == 0.f)
m_imgui->text(m_desc.at("clipping_of_view"));
else {
if (m_imgui->button(m_desc.at("reset_direction"))) {
wxGetApp().CallAfter([this](){
- update_clipping_plane();
+ m_c->object_clipper()->set_position(-1., false);
});
}
}
ImGui::SameLine(clipping_slider_left);
ImGui::PushItemWidth(window_width - clipping_slider_left);
- if (ImGui::SliderFloat(" ", &m_c->m_clipping_plane_distance, 0.f, 1.f, "%.2f")) {
- update_clipping_plane(m_c->m_clipping_plane_was_moved);
- m_c->m_clipping_plane_was_moved = true;
- }
+ float clp_dist = m_c->object_clipper()->get_position();
+ if (ImGui::SliderFloat(" ", &clp_dist, 0.f, 1.f, "%.2f"))
+ m_c->object_clipper()->set_position(clp_dist, true);
// make sure supports are shown/hidden as appropriate
- if (m_imgui->checkbox(m_desc["show_supports"], m_show_supports)) {
- m_parent.toggle_sla_auxiliaries_visibility(m_show_supports, m_c->m_model_object, m_c->m_active_instance);
+ bool show_sups = m_c->instances_hider()->are_supports_shown();
+ if (m_imgui->checkbox(m_desc["show_supports"], show_sups)) {
+ m_c->instances_hider()->show_supports(show_sups);
force_refresh = true;
}
@@ -980,58 +786,25 @@ std::string GLGizmoHollow::on_get_name() const
}
+CommonGizmosDataID GLGizmoHollow::on_get_requirements() const
+{
+ return CommonGizmosDataID(
+ int(CommonGizmosDataID::SelectionInfo)
+ | int(CommonGizmosDataID::InstancesHider)
+ | int(CommonGizmosDataID::Raycaster)
+ | int(CommonGizmosDataID::HollowedMesh)
+ | int(CommonGizmosDataID::ObjectClipper)
+ | int(CommonGizmosDataID::SupportsClipper));
+}
+
void GLGizmoHollow::on_set_state()
{
- // m_c->m_model_object pointer can be invalid (for instance because of undo/redo action),
- // we should recover it from the object id
- m_c->m_model_object = nullptr;
- for (const auto mo : wxGetApp().model().objects) {
- if (mo->id() == m_c->m_model_object_id) {
- m_c->m_model_object = mo;
- break;
- }
- }
-
if (m_state == m_old_state)
return;
- if (m_state == On && m_old_state != On) { // the gizmo was just turned on
- //Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned on")));
- //m_c->update_from_backend(m_parent, m_c->m_model_object);
- m_c->unstash_clipping_plane();
- update_clipping_plane(m_c->m_clipping_plane_was_moved);
-
- m_c->build_AABB_if_needed();
-
- // we'll now reload support points:
- if (m_c->m_model_object)
- reload_cache();
-
- m_parent.toggle_model_objects_visibility(false);
- if (m_c->m_model_object) {
- m_parent.toggle_model_objects_visibility(true, m_c->m_model_object, m_c->m_active_instance);
- m_parent.toggle_sla_auxiliaries_visibility(m_show_supports, m_c->m_model_object, m_c->m_active_instance);
- }
-
- // Set default head diameter from config.
- //const DynamicPrintConfig& cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config;
- //m_new_hole_radius = static_cast<const ConfigOptionFloat*>(cfg.option("support_head_front_diameter"))->value;
- }
- if (m_state == Off && m_old_state != Off) { // the gizmo was just turned Off
- //Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned off")));
+ if (m_state == Off && m_old_state != Off) // the gizmo was just turned Off
m_parent.post_event(SimpleEvent(EVT_GLCANVAS_FORCE_UPDATE));
- m_parent.toggle_model_objects_visibility(true);
- m_c->stash_clipping_plane();
- m_c->m_clipping_plane_distance = 0.f;
- update_clipping_plane(true);
- // Release clippers and the AABB raycaster.
- m_c->m_object_clipper.reset();
- m_c->m_supports_clipper.reset();
- //m_c->m_mesh_raycaster.reset();
- //m_c->m_cavity_mesh.reset();
- //m_c->m_volume_with_cavity.reset();
- }
m_old_state = m_state;
}
@@ -1042,7 +815,7 @@ void GLGizmoHollow::on_start_dragging()
if (m_hover_id != -1) {
select_point(NoPoints);
select_point(m_hover_id);
- m_hole_before_drag = m_c->m_model_object->sla_drain_holes[m_hover_id].pos;
+ m_hole_before_drag = m_c->selection_info()->model_object()->sla_drain_holes[m_hover_id].pos;
}
else
m_hole_before_drag = Vec3f::Zero();
@@ -1051,15 +824,16 @@ void GLGizmoHollow::on_start_dragging()
void GLGizmoHollow::on_stop_dragging()
{
+ sla::DrainHoles& drain_holes = m_c->selection_info()->model_object()->sla_drain_holes;
if (m_hover_id != -1) {
- Vec3f backup = m_c->m_model_object->sla_drain_holes[m_hover_id].pos;
+ Vec3f backup = drain_holes[m_hover_id].pos;
if (m_hole_before_drag != Vec3f::Zero() // some point was touched
&& backup != m_hole_before_drag) // and it was moved, not just selected
{
- m_c->m_model_object->sla_drain_holes[m_hover_id].pos = m_hole_before_drag;
+ drain_holes[m_hover_id].pos = m_hole_before_drag;
Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Move drainage hole")));
- m_c->m_model_object->sla_drain_holes[m_hover_id].pos = backup;
+ drain_holes[m_hover_id].pos = backup;
}
}
m_hole_before_drag = Vec3f::Zero();
@@ -1069,10 +843,7 @@ void GLGizmoHollow::on_stop_dragging()
void GLGizmoHollow::on_load(cereal::BinaryInputArchive& ar)
{
- ar(m_c->m_clipping_plane_distance,
- *m_c->m_clipping_plane,
- m_c->m_model_object_id,
- m_new_hole_radius,
+ ar(m_new_hole_radius,
m_new_hole_height,
m_selected,
m_selection_empty
@@ -1083,10 +854,7 @@ void GLGizmoHollow::on_load(cereal::BinaryInputArchive& ar)
void GLGizmoHollow::on_save(cereal::BinaryOutputArchive& ar) const
{
- ar(m_c->m_clipping_plane_distance,
- *m_c->m_clipping_plane,
- m_c->m_model_object_id,
- m_new_hole_radius,
+ ar(m_new_hole_radius,
m_new_hole_height,
m_selected,
m_selection_empty
@@ -1097,13 +865,15 @@ void GLGizmoHollow::on_save(cereal::BinaryOutputArchive& ar) const
void GLGizmoHollow::select_point(int i)
{
+ const sla::DrainHoles& drain_holes = m_c->selection_info()->model_object()->sla_drain_holes;
+
if (i == AllPoints || i == NoPoints) {
m_selected.assign(m_selected.size(), i == AllPoints);
m_selection_empty = (i == NoPoints);
if (i == AllPoints) {
- m_new_hole_radius = m_c->m_model_object->sla_drain_holes[0].radius;
- m_new_hole_height = m_c->m_model_object->sla_drain_holes[0].height;
+ m_new_hole_radius = drain_holes[0].radius;
+ m_new_hole_height = drain_holes[0].height;
}
}
else {
@@ -1111,8 +881,8 @@ void GLGizmoHollow::select_point(int i)
m_selected.push_back(false);
m_selected[i] = true;
m_selection_empty = false;
- m_new_hole_radius = m_c->m_model_object->sla_drain_holes[i].radius;
- m_new_hole_height = m_c->m_model_object->sla_drain_holes[i].height;
+ m_new_hole_radius = drain_holes[i].radius;
+ m_new_hole_height = drain_holes[i].height;
}
}
@@ -1132,26 +902,13 @@ void GLGizmoHollow::unselect_point(int i)
void GLGizmoHollow::reload_cache()
{
m_selected.clear();
- m_selected.assign(m_c->m_model_object->sla_drain_holes.size(), false);
-}
-
-void GLGizmoHollow::update_clipping_plane(bool keep_normal) const
-{
- if (! m_c->m_model_object)
- return;
- Vec3d normal = (keep_normal && m_c->m_clipping_plane->get_normal() != Vec3d::Zero() ?
- m_c->m_clipping_plane->get_normal() : -m_parent.get_camera().get_dir_forward());
-
- const Vec3d& center = m_c->m_model_object->instances[m_c->m_active_instance]->get_offset() + Vec3d(0., 0., m_z_shift);
- float dist = normal.dot(center);
- *m_c->m_clipping_plane = ClippingPlane(normal, (dist - (-m_c->m_active_instance_bb_radius) - m_c->m_clipping_plane_distance * 2*m_c->m_active_instance_bb_radius));
- m_parent.set_as_dirty();
+ m_selected.assign(m_c->selection_info()->model_object()->sla_drain_holes.size(), false);
}
void GLGizmoHollow::on_set_hover_id()
{
- if (int(m_c->m_model_object->sla_drain_holes.size()) <= m_hover_id)
+ if (int(m_c->selection_info()->model_object()->sla_drain_holes.size()) <= m_hover_id)
m_hover_id = -1;
}
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp
index bc4549a0e..5d34f04d6 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoHollow.hpp
@@ -5,24 +5,24 @@
#include "slic3r/GUI/GLSelectionRectangle.hpp"
#include <libslic3r/SLA/Hollowing.hpp>
+#include <libslic3r/ObjectID.hpp>
#include <wx/dialog.h>
#include <cereal/types/vector.hpp>
namespace Slic3r {
+
+class ConfigOption;
+class ConfigOptionDef;
+
namespace GUI {
-class ClippingPlane;
-class MeshClipper;
-class MeshRaycaster;
-class CommonGizmosData;
enum class SLAGizmoEventType : unsigned char;
class GLGizmoHollow : public GLGizmoBase
{
private:
- mutable double m_z_shift = 0.;
bool unproject_on_mesh(const Vec2d& mouse_pos, std::pair<Vec3f, Vec3f>& pos_and_normal);
GLUquadricObj* m_quadric;
@@ -33,17 +33,10 @@ public:
~GLGizmoHollow() override;
void set_sla_support_data(ModelObject* model_object, const Selection& selection);
bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down);
- void delete_selected_points();
- ClippingPlane get_sla_clipping_plane() const;
-
-
- std::pair<const TriangleMesh *, sla::HollowingConfig> get_hollowing_parameters() const;
- void update_mesh_raycaster(std::unique_ptr<MeshRaycaster> &&rc);
- void update_hollowed_mesh(std::unique_ptr<TriangleMesh> &&mesh);
-
- bool is_selection_rectangle_dragging() const { return m_selection_rectangle.is_dragging(); }
- void update_clipping_plane(bool keep_normal = false) const;
- void set_common_data_ptr(CommonGizmosData* ptr) { m_c = ptr; }
+ void delete_selected_points();
+ bool is_selection_rectangle_dragging() const {
+ return m_selection_rectangle.is_dragging();
+ }
private:
bool on_init() override;
@@ -52,12 +45,12 @@ private:
void on_render_for_picking() const override;
void render_points(const Selection& selection, bool picking = false) const;
- void render_clipping_plane(const Selection& selection) const;
- void render_hollowed_mesh() const;
void hollow_mesh(bool postpone_error_messages = false);
bool unsaved_changes() const;
- bool m_show_supports = true;
+ ObjectID m_old_mo_id = -1;
+
+ // bool m_show_supports = true;
float m_new_hole_radius = 2.f; // Size of a new hole.
float m_new_hole_height = 6.f;
mutable std::vector<bool> m_selected; // which holes are currently selected
@@ -73,10 +66,6 @@ private:
sla::DrainHoles m_holes_in_drilled_mesh;
sla::DrainHoles m_holes_stash;
-
- CommonGizmosData* m_c = nullptr;
-
- //std::unique_ptr<ClippingPlane> m_clipping_plane;
// This map holds all translated description texts, so they can be easily referenced during layout calculations
// etc. When language changes, GUI is recreated and this class constructed again, so the change takes effect.
@@ -107,6 +96,7 @@ protected:
void on_start_dragging() override;
void on_stop_dragging() override;
void on_render_input_window(float x, float y, float bottom_limit) override;
+ virtual CommonGizmosDataID on_get_requirements() const override;
std::string on_get_name() const override;
bool on_is_activable() const override;
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp
new file mode 100644
index 000000000..819d014e8
--- /dev/null
+++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.cpp
@@ -0,0 +1,667 @@
+// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro.
+#include "GLGizmoPainterBase.hpp"
+#include "slic3r/GUI/GLCanvas3D.hpp"
+#include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp"
+
+#include <GL/glew.h>
+
+#include "slic3r/GUI/GUI_App.hpp"
+#include "slic3r/GUI/Camera.hpp"
+#include "slic3r/GUI/Plater.hpp"
+#include "libslic3r/PresetBundle.hpp"
+#include "libslic3r/Model.hpp"
+
+
+
+namespace Slic3r {
+namespace GUI {
+
+
+GLGizmoPainterBase::GLGizmoPainterBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id)
+ : GLGizmoBase(parent, icon_filename, sprite_id)
+{
+ // Make sphere and save it into a vertex buffer.
+ const TriangleMesh sphere_mesh = make_sphere(1., (2*M_PI)/24.);
+ for (size_t i=0; i<sphere_mesh.its.vertices.size(); ++i)
+ m_vbo_sphere.push_geometry(sphere_mesh.its.vertices[i].cast<double>(),
+ sphere_mesh.stl.facet_start[i].normal.cast<double>());
+ for (const stl_triangle_vertex_indices& indices : sphere_mesh.its.indices)
+ m_vbo_sphere.push_triangle(indices(0), indices(1), indices(2));
+ m_vbo_sphere.finalize_geometry(true);
+}
+
+
+
+void GLGizmoPainterBase::activate_internal_undo_redo_stack(bool activate)
+{
+ if (activate && ! m_internal_stack_active) {
+ wxString str = get_painter_type() == PainterGizmoType::FDM_SUPPORTS
+ ? _L("Entering Paint-on supports")
+ : _L("Entering Seam painting");
+ Plater::TakeSnapshot(wxGetApp().plater(), str);
+ wxGetApp().plater()->enter_gizmos_stack();
+ m_internal_stack_active = true;
+ }
+ if (! activate && m_internal_stack_active) {
+ wxString str = get_painter_type() == PainterGizmoType::SEAM
+ ? _L("Leaving Seam painting")
+ : _L("Leaving Paint-on supports");
+ wxGetApp().plater()->leave_gizmos_stack();
+ Plater::TakeSnapshot(wxGetApp().plater(), str);
+ m_internal_stack_active = false;
+ }
+}
+
+
+
+void GLGizmoPainterBase::set_painter_gizmo_data(const Selection& selection)
+{
+ if (m_state != On)
+ return;
+
+ const ModelObject* mo = m_c->selection_info() ? m_c->selection_info()->model_object() : nullptr;
+
+ if (mo && selection.is_from_single_instance()
+ && (m_schedule_update || mo->id() != m_old_mo_id || mo->volumes.size() != m_old_volumes_size))
+ {
+ update_from_model_object();
+ m_old_mo_id = mo->id();
+ m_old_volumes_size = mo->volumes.size();
+ m_schedule_update = false;
+ }
+}
+
+
+
+void GLGizmoPainterBase::render_triangles(const Selection& selection) const
+{
+ const ModelObject* mo = m_c->selection_info()->model_object();
+
+ glsafe(::glEnable(GL_POLYGON_OFFSET_FILL));
+ ScopeGuard offset_fill_guard([]() { glsafe(::glDisable(GL_POLYGON_OFFSET_FILL)); } );
+ glsafe(::glPolygonOffset(-5.0, -5.0));
+
+ // Take care of the clipping plane. The normal of the clipping plane is
+ // saved with opposite sign than we need to pass to OpenGL (FIXME)
+ bool clipping_plane_active = m_c->object_clipper()->get_position() != 0.;
+ if (clipping_plane_active) {
+ const ClippingPlane* clp = m_c->object_clipper()->get_clipping_plane();
+ double clp_data[4];
+ memcpy(clp_data, clp->get_data(), 4 * sizeof(double));
+ for (int i=0; i<3; ++i)
+ clp_data[i] = -1. * clp_data[i];
+
+ glsafe(::glClipPlane(GL_CLIP_PLANE0, (GLdouble*)clp_data));
+ glsafe(::glEnable(GL_CLIP_PLANE0));
+ }
+
+ int mesh_id = -1;
+ for (const ModelVolume* mv : mo->volumes) {
+ if (! mv->is_model_part())
+ continue;
+
+ ++mesh_id;
+
+ const Transform3d trafo_matrix =
+ mo->instances[selection.get_instance_idx()]->get_transformation().get_matrix() *
+ mv->get_matrix();
+
+ bool is_left_handed = trafo_matrix.matrix().determinant() < 0.;
+ if (is_left_handed)
+ glsafe(::glFrontFace(GL_CW));
+
+ glsafe(::glPushMatrix());
+ glsafe(::glMultMatrixd(trafo_matrix.data()));
+
+ m_triangle_selectors[mesh_id]->render(m_imgui);
+
+ glsafe(::glPopMatrix());
+ if (is_left_handed)
+ glsafe(::glFrontFace(GL_CCW));
+ }
+ if (clipping_plane_active)
+ glsafe(::glDisable(GL_CLIP_PLANE0));
+}
+
+
+void GLGizmoPainterBase::render_cursor() const
+{
+ // First check that the mouse pointer is on an object.
+ const ModelObject* mo = m_c->selection_info()->model_object();
+ const Selection& selection = m_parent.get_selection();
+ const ModelInstance* mi = mo->instances[selection.get_instance_idx()];
+ const Camera& camera = wxGetApp().plater()->get_camera();
+
+ // Precalculate transformations of individual meshes.
+ std::vector<Transform3d> trafo_matrices;
+ for (const ModelVolume* mv : mo->volumes) {
+ if (mv->is_model_part())
+ trafo_matrices.emplace_back(mi->get_transformation().get_matrix() * mv->get_matrix());
+ }
+ // Raycast and return if there's no hit.
+ update_raycast_cache(m_parent.get_local_mouse_position(), camera, trafo_matrices);
+ if (m_rr.mesh_id == -1)
+ return;
+
+
+ if (m_cursor_type == TriangleSelector::SPHERE)
+ render_cursor_sphere(trafo_matrices[m_rr.mesh_id]);
+ else
+ render_cursor_circle();
+}
+
+
+
+void GLGizmoPainterBase::render_cursor_circle() const
+{
+ const Camera& camera = wxGetApp().plater()->get_camera();
+ float zoom = (float)camera.get_zoom();
+ float inv_zoom = (zoom != 0.0f) ? 1.0f / zoom : 0.0f;
+
+ Size cnv_size = m_parent.get_canvas_size();
+ float cnv_half_width = 0.5f * (float)cnv_size.get_width();
+ float cnv_half_height = 0.5f * (float)cnv_size.get_height();
+ if ((cnv_half_width == 0.0f) || (cnv_half_height == 0.0f))
+ return;
+ Vec2d mouse_pos(m_parent.get_local_mouse_position()(0), m_parent.get_local_mouse_position()(1));
+ Vec2d center(mouse_pos(0) - cnv_half_width, cnv_half_height - mouse_pos(1));
+ center = center * inv_zoom;
+
+ glsafe(::glLineWidth(1.5f));
+ float color[3];
+ color[0] = 0.f;
+ color[1] = 1.f;
+ color[2] = 0.3f;
+ glsafe(::glColor3fv(color));
+ glsafe(::glDisable(GL_DEPTH_TEST));
+
+ glsafe(::glPushMatrix());
+ glsafe(::glLoadIdentity());
+ // ensure that the circle is renderered inside the frustrum
+ glsafe(::glTranslated(0.0, 0.0, -(camera.get_near_z() + 0.5)));
+ // ensure that the overlay fits the frustrum near z plane
+ double gui_scale = camera.get_gui_scale();
+ glsafe(::glScaled(gui_scale, gui_scale, 1.0));
+
+ glsafe(::glPushAttrib(GL_ENABLE_BIT));
+ glsafe(::glLineStipple(4, 0xAAAA));
+ glsafe(::glEnable(GL_LINE_STIPPLE));
+
+ ::glBegin(GL_LINE_LOOP);
+ for (double angle=0; angle<2*M_PI; angle+=M_PI/20.)
+ ::glVertex2f(GLfloat(center.x()+m_cursor_radius*cos(angle)), GLfloat(center.y()+m_cursor_radius*sin(angle)));
+ glsafe(::glEnd());
+
+ glsafe(::glPopAttrib());
+ glsafe(::glPopMatrix());
+ glsafe(::glEnable(GL_DEPTH_TEST));
+}
+
+
+void GLGizmoPainterBase::render_cursor_sphere(const Transform3d& trafo) const
+{
+ const Transform3d complete_scaling_matrix_inverse = Geometry::Transformation(trafo).get_matrix(true, true, false, true).inverse();
+ const bool is_left_handed = Geometry::Transformation(trafo).is_left_handed();
+
+ glsafe(::glPushMatrix());
+ glsafe(::glMultMatrixd(trafo.data()));
+ // Inverse matrix of the instance scaling is applied so that the mark does not scale with the object.
+ glsafe(::glTranslatef(m_rr.hit(0), m_rr.hit(1), m_rr.hit(2)));
+ glsafe(::glMultMatrixd(complete_scaling_matrix_inverse.data()));
+ glsafe(::glScaled(m_cursor_radius, m_cursor_radius, m_cursor_radius));
+
+ if (is_left_handed)
+ glFrontFace(GL_CW);
+
+ float render_color[4] = { 0.f, 0.f, 0.f, 0.25f };
+ if (m_button_down == Button::Left)
+ render_color[2] = 1.f;
+ else if (m_button_down == Button::Right)
+ render_color[0] = 1.f;
+ glsafe(::glColor4fv(render_color));
+
+ m_vbo_sphere.render();
+
+ if (is_left_handed)
+ glFrontFace(GL_CCW);
+
+ glsafe(::glPopMatrix());
+}
+
+
+bool GLGizmoPainterBase::is_mesh_point_clipped(const Vec3d& point, const Transform3d& trafo) const
+{
+ if (m_c->object_clipper()->get_position() == 0.)
+ return false;
+
+ auto sel_info = m_c->selection_info();
+ Vec3d transformed_point = trafo * point;
+ transformed_point(2) += sel_info->get_sla_shift();
+ return m_c->object_clipper()->get_clipping_plane()->is_point_clipped(transformed_point);
+}
+
+
+// Following function is called from GLCanvas3D to inform the gizmo about a mouse/keyboard event.
+// The gizmo has an opportunity to react - if it does, it should return true so that the Canvas3D is
+// aware that the event was reacted to and stops trying to make different sense of it. If the gizmo
+// concludes that the event was not intended for it, it should return false.
+bool GLGizmoPainterBase::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down)
+{
+ if (action == SLAGizmoEventType::MouseWheelUp
+ || action == SLAGizmoEventType::MouseWheelDown) {
+ if (control_down) {
+ double pos = m_c->object_clipper()->get_position();
+ pos = action == SLAGizmoEventType::MouseWheelDown
+ ? std::max(0., pos - 0.01)
+ : std::min(1., pos + 0.01);
+ m_c->object_clipper()->set_position(pos, true);
+ return true;
+ }
+ else if (alt_down) {
+ m_cursor_radius = action == SLAGizmoEventType::MouseWheelDown
+ ? std::max(m_cursor_radius - CursorRadiusStep, CursorRadiusMin)
+ : std::min(m_cursor_radius + CursorRadiusStep, CursorRadiusMax);
+ m_parent.set_as_dirty();
+ return true;
+ }
+ }
+
+ if (action == SLAGizmoEventType::ResetClippingPlane) {
+ m_c->object_clipper()->set_position(-1., false);
+ return true;
+ }
+
+ if (action == SLAGizmoEventType::LeftDown
+ || action == SLAGizmoEventType::RightDown
+ || (action == SLAGizmoEventType::Dragging && m_button_down != Button::None)) {
+
+ if (m_triangle_selectors.empty())
+ return false;
+
+ EnforcerBlockerType new_state = EnforcerBlockerType::NONE;
+ if (! shift_down) {
+ if (action == SLAGizmoEventType::Dragging)
+ new_state = m_button_down == Button::Left
+ ? EnforcerBlockerType::ENFORCER
+ : EnforcerBlockerType::BLOCKER;
+ else
+ new_state = action == SLAGizmoEventType::LeftDown
+ ? EnforcerBlockerType::ENFORCER
+ : EnforcerBlockerType::BLOCKER;
+ }
+
+ const Camera& camera = wxGetApp().plater()->get_camera();
+ const Selection& selection = m_parent.get_selection();
+ const ModelObject* mo = m_c->selection_info()->model_object();
+ const ModelInstance* mi = mo->instances[selection.get_instance_idx()];
+ const Transform3d& instance_trafo = mi->get_transformation().get_matrix();
+
+ // List of mouse positions that will be used as seeds for painting.
+ std::vector<Vec2d> mouse_positions{mouse_position};
+
+ // In case current mouse position is far from the last one,
+ // add several positions from between into the list, so there
+ // are no gaps in the painted region.
+ {
+ if (m_last_mouse_click == Vec2d::Zero())
+ m_last_mouse_click = mouse_position;
+ // resolution describes minimal distance limit using circle radius
+ // as a unit (e.g., 2 would mean the patches will be touching).
+ double resolution = 0.7;
+ double diameter_px = resolution * m_cursor_radius * camera.get_zoom();
+ int patches_in_between = int(((mouse_position - m_last_mouse_click).norm() - diameter_px) / diameter_px);
+ if (patches_in_between > 0) {
+ Vec2d diff = (mouse_position - m_last_mouse_click)/(patches_in_between+1);
+ for (int i=1; i<=patches_in_between; ++i)
+ mouse_positions.emplace_back(m_last_mouse_click + i*diff);
+ }
+ }
+ m_last_mouse_click = Vec2d::Zero(); // only actual hits should be saved
+
+ // Precalculate transformations of individual meshes.
+ std::vector<Transform3d> trafo_matrices;
+ for (const ModelVolume* mv : mo->volumes) {
+ if (mv->is_model_part())
+ trafo_matrices.emplace_back(instance_trafo * mv->get_matrix());
+ }
+
+ // Now "click" into all the prepared points and spill paint around them.
+ for (const Vec2d& mp : mouse_positions) {
+ update_raycast_cache(mp, camera, trafo_matrices);
+
+ bool dragging_while_painting = (action == SLAGizmoEventType::Dragging && m_button_down != Button::None);
+
+ // The mouse button click detection is enabled when there is a valid hit.
+ // Missing the object entirely
+ // shall not capture the mouse.
+ if (m_rr.mesh_id != -1) {
+ if (m_button_down == Button::None)
+ m_button_down = ((action == SLAGizmoEventType::LeftDown) ? Button::Left : Button::Right);
+ }
+
+ if (m_rr.mesh_id == -1) {
+ // In case we have no valid hit, we can return. The event will be stopped when
+ // dragging while painting (to prevent scene rotations and moving the object)
+ return dragging_while_painting;
+ }
+
+ const Transform3d& trafo_matrix = trafo_matrices[m_rr.mesh_id];
+
+ // Calculate direction from camera to the hit (in mesh coords):
+ Vec3f camera_pos = (trafo_matrix.inverse() * camera.get_position()).cast<float>();
+
+ assert(m_rr.mesh_id < int(m_triangle_selectors.size()));
+ m_triangle_selectors[m_rr.mesh_id]->select_patch(m_rr.hit, m_rr.facet, camera_pos,
+ m_cursor_radius, m_cursor_type, new_state, trafo_matrix);
+ m_last_mouse_click = mouse_position;
+ }
+
+ return true;
+ }
+
+ if ((action == SLAGizmoEventType::LeftUp || action == SLAGizmoEventType::RightUp)
+ && m_button_down != Button::None) {
+ // Take snapshot and update ModelVolume data.
+ wxString action_name;
+ if (get_painter_type() == PainterGizmoType::FDM_SUPPORTS) {
+ if (shift_down)
+ action_name = _L("Remove selection");
+ else {
+ if (m_button_down == Button::Left)
+ action_name = _L("Add supports");
+ else
+ action_name = _L("Block supports");
+ }
+ }
+ if (get_painter_type() == PainterGizmoType::SEAM) {
+ if (shift_down)
+ action_name = _L("Remove selection");
+ else {
+ if (m_button_down == Button::Left)
+ action_name = _L("Enforce seam");
+ else
+ action_name = _L("Block seam");
+ }
+ }
+
+ activate_internal_undo_redo_stack(true);
+ Plater::TakeSnapshot(wxGetApp().plater(), action_name);
+ update_model_object();
+
+ m_button_down = Button::None;
+ m_last_mouse_click = Vec2d::Zero();
+ return true;
+ }
+
+ return false;
+}
+
+
+
+void GLGizmoPainterBase::update_raycast_cache(const Vec2d& mouse_position,
+ const Camera& camera,
+ const std::vector<Transform3d>& trafo_matrices) const
+{
+ if (m_rr.mouse_position == mouse_position) {
+ // Same query as last time - the answer is already in the cache.
+ return;
+ }
+
+ Vec3f normal = Vec3f::Zero();
+ Vec3f hit = Vec3f::Zero();
+ size_t facet = 0;
+ Vec3f closest_hit = Vec3f::Zero();
+ double closest_hit_squared_distance = std::numeric_limits<double>::max();
+ size_t closest_facet = 0;
+ int closest_hit_mesh_id = -1;
+
+ // Cast a ray on all meshes, pick the closest hit and save it for the respective mesh
+ for (int mesh_id = 0; mesh_id < int(trafo_matrices.size()); ++mesh_id) {
+
+ if (m_c->raycaster()->raycasters()[mesh_id]->unproject_on_mesh(
+ mouse_position,
+ trafo_matrices[mesh_id],
+ camera,
+ hit,
+ normal,
+ m_c->object_clipper()->get_clipping_plane(),
+ &facet))
+ {
+ // In case this hit is clipped, skip it.
+ if (is_mesh_point_clipped(hit.cast<double>(), trafo_matrices[mesh_id]))
+ continue;
+
+ // Is this hit the closest to the camera so far?
+ double hit_squared_distance = (camera.get_position()-trafo_matrices[mesh_id]*hit.cast<double>()).squaredNorm();
+ if (hit_squared_distance < closest_hit_squared_distance) {
+ closest_hit_squared_distance = hit_squared_distance;
+ closest_facet = facet;
+ closest_hit_mesh_id = mesh_id;
+ closest_hit = hit;
+ }
+ }
+ }
+
+ m_rr = {mouse_position, closest_hit_mesh_id, closest_hit, closest_facet};
+}
+
+bool GLGizmoPainterBase::on_is_activable() const
+{
+ const Selection& selection = m_parent.get_selection();
+
+ if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptFFF
+ || !selection.is_single_full_instance())
+ return false;
+
+ // Check that none of the selected volumes is outside. Only SLA auxiliaries (supports) are allowed outside.
+ const Selection::IndicesList& list = selection.get_volume_idxs();
+ for (const auto& idx : list)
+ if (selection.get_volume(idx)->is_outside)
+ return false;
+
+ return true;
+}
+
+bool GLGizmoPainterBase::on_is_selectable() const
+{
+ return (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptFFF
+ && wxGetApp().get_mode() != comSimple );
+}
+
+
+CommonGizmosDataID GLGizmoPainterBase::on_get_requirements() const
+{
+ return CommonGizmosDataID(
+ int(CommonGizmosDataID::SelectionInfo)
+ | int(CommonGizmosDataID::InstancesHider)
+ | int(CommonGizmosDataID::Raycaster)
+ | int(CommonGizmosDataID::ObjectClipper));
+}
+
+
+void GLGizmoPainterBase::on_set_state()
+{
+ if (m_state == m_old_state)
+ return;
+
+ if (m_state == On && m_old_state != On) { // the gizmo was just turned on
+ on_opening();
+ if (! m_parent.get_gizmos_manager().is_serializing()) {
+ wxGetApp().CallAfter([this]() {
+ activate_internal_undo_redo_stack(true);
+ });
+ }
+ }
+ if (m_state == Off && m_old_state != Off) { // the gizmo was just turned Off
+ // we are actually shutting down
+ on_shutdown();
+ activate_internal_undo_redo_stack(false);
+ m_old_mo_id = -1;
+ //m_iva.release_geometry();
+ m_triangle_selectors.clear();
+ }
+ m_old_state = m_state;
+}
+
+
+
+void GLGizmoPainterBase::on_load(cereal::BinaryInputArchive&)
+{
+ // We should update the gizmo from current ModelObject, but it is not
+ // possible at this point. That would require having updated selection and
+ // common gizmos data, which is not done at this point. Instead, save
+ // a flag to do the update in set_painter_gizmo_data, which will be called
+ // soon after.
+ m_schedule_update = true;
+}
+
+
+
+void TriangleSelectorGUI::render(ImGuiWrapper* imgui)
+{
+ int enf_cnt = 0;
+ int blc_cnt = 0;
+
+ m_iva_enforcers.release_geometry();
+ m_iva_blockers.release_geometry();
+
+ for (const Triangle& tr : m_triangles) {
+ if (! tr.valid || tr.is_split() || tr.get_state() == EnforcerBlockerType::NONE)
+ continue;
+
+ GLIndexedVertexArray& va = tr.get_state() == EnforcerBlockerType::ENFORCER
+ ? m_iva_enforcers
+ : m_iva_blockers;
+ int& cnt = tr.get_state() == EnforcerBlockerType::ENFORCER
+ ? enf_cnt
+ : blc_cnt;
+
+ for (int i=0; i<3; ++i)
+ va.push_geometry(double(m_vertices[tr.verts_idxs[i]].v[0]),
+ double(m_vertices[tr.verts_idxs[i]].v[1]),
+ double(m_vertices[tr.verts_idxs[i]].v[2]),
+ 0., 0., 1.);
+ va.push_triangle(cnt,
+ cnt+1,
+ cnt+2);
+ cnt += 3;
+ }
+
+ m_iva_enforcers.finalize_geometry(true);
+ m_iva_blockers.finalize_geometry(true);
+
+ if (m_iva_enforcers.has_VBOs()) {
+ ::glColor4f(0.f, 0.f, 1.f, 0.4f);
+ m_iva_enforcers.render();
+ }
+
+
+ if (m_iva_blockers.has_VBOs()) {
+ ::glColor4f(1.f, 0.f, 0.f, 0.4f);
+ m_iva_blockers.render();
+ }
+
+
+#ifdef PRUSASLICER_TRIANGLE_SELECTOR_DEBUG
+ if (imgui)
+ render_debug(imgui);
+ else
+ assert(false); // If you want debug output, pass ptr to ImGuiWrapper.
+#endif
+}
+
+
+
+#ifdef PRUSASLICER_TRIANGLE_SELECTOR_DEBUG
+void TriangleSelectorGUI::render_debug(ImGuiWrapper* imgui)
+{
+ imgui->begin(std::string("TriangleSelector dialog (DEV ONLY)"),
+ ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse);
+ static float edge_limit = 1.f;
+ imgui->text("Edge limit (mm): ");
+ imgui->slider_float("", &edge_limit, 0.1f, 8.f);
+ set_edge_limit(edge_limit);
+ imgui->checkbox("Show split triangles: ", m_show_triangles);
+ imgui->checkbox("Show invalid triangles: ", m_show_invalid);
+
+ int valid_triangles = m_triangles.size() - m_invalid_triangles;
+ imgui->text("Valid triangles: " + std::to_string(valid_triangles) +
+ "/" + std::to_string(m_triangles.size()));
+ imgui->text("Vertices: " + std::to_string(m_vertices.size()));
+ if (imgui->button("Force garbage collection"))
+ garbage_collect();
+
+ if (imgui->button("Serialize - deserialize")) {
+ auto map = serialize();
+ deserialize(map);
+ }
+
+ imgui->end();
+
+ if (! m_show_triangles)
+ return;
+
+ enum vtype {
+ ORIGINAL = 0,
+ SPLIT,
+ INVALID
+ };
+
+ for (auto& va : m_varrays)
+ va.release_geometry();
+
+ std::array<int, 3> cnts;
+
+ ::glScalef(1.01f, 1.01f, 1.01f);
+
+ for (int tr_id=0; tr_id<int(m_triangles.size()); ++tr_id) {
+ const Triangle& tr = m_triangles[tr_id];
+ GLIndexedVertexArray* va = nullptr;
+ int* cnt = nullptr;
+ if (tr_id < m_orig_size_indices) {
+ va = &m_varrays[ORIGINAL];
+ cnt = &cnts[ORIGINAL];
+ }
+ else if (tr.valid) {
+ va = &m_varrays[SPLIT];
+ cnt = &cnts[SPLIT];
+ }
+ else {
+ if (! m_show_invalid)
+ continue;
+ va = &m_varrays[INVALID];
+ cnt = &cnts[INVALID];
+ }
+
+ for (int i=0; i<3; ++i)
+ va->push_geometry(double(m_vertices[tr.verts_idxs[i]].v[0]),
+ double(m_vertices[tr.verts_idxs[i]].v[1]),
+ double(m_vertices[tr.verts_idxs[i]].v[2]),
+ 0., 0., 1.);
+ va->push_triangle(*cnt,
+ *cnt+1,
+ *cnt+2);
+ *cnt += 3;
+ }
+
+ ::glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );
+ for (vtype i : {ORIGINAL, SPLIT, INVALID}) {
+ GLIndexedVertexArray& va = m_varrays[i];
+ va.finalize_geometry(true);
+ if (va.has_VBOs()) {
+ switch (i) {
+ case ORIGINAL : ::glColor3f(0.f, 0.f, 1.f); break;
+ case SPLIT : ::glColor3f(1.f, 0.f, 0.f); break;
+ case INVALID : ::glColor3f(1.f, 1.f, 0.f); break;
+ }
+ va.render();
+ }
+ }
+ ::glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );
+}
+#endif
+
+
+
+} // namespace GUI
+} // namespace Slic3r
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp
new file mode 100644
index 000000000..6f8cbec60
--- /dev/null
+++ b/src/slic3r/GUI/Gizmos/GLGizmoPainterBase.hpp
@@ -0,0 +1,150 @@
+#ifndef slic3r_GLGizmoPainterBase_hpp_
+#define slic3r_GLGizmoPainterBase_hpp_
+
+#include "GLGizmoBase.hpp"
+
+#include "slic3r/GUI/3DScene.hpp"
+
+#include "libslic3r/ObjectID.hpp"
+#include "libslic3r/TriangleSelector.hpp"
+
+#include <cereal/types/vector.hpp>
+
+
+
+
+namespace Slic3r {
+
+enum class EnforcerBlockerType : int8_t;
+
+namespace GUI {
+
+enum class SLAGizmoEventType : unsigned char;
+class ClippingPlane;
+struct Camera;
+
+enum class PainterGizmoType {
+ FDM_SUPPORTS,
+ SEAM
+};
+
+
+class TriangleSelectorGUI : public TriangleSelector {
+public:
+ explicit TriangleSelectorGUI(const TriangleMesh& mesh)
+ : TriangleSelector(mesh) {}
+
+ // Render current selection. Transformation matrices are supposed
+ // to be already set.
+ void render(ImGuiWrapper* imgui = nullptr);
+
+#ifdef PRUSASLICER_TRIANGLE_SELECTOR_DEBUG
+ void render_debug(ImGuiWrapper* imgui);
+ bool m_show_triangles{false};
+ bool m_show_invalid{false};
+#endif
+
+private:
+ GLIndexedVertexArray m_iva_enforcers;
+ GLIndexedVertexArray m_iva_blockers;
+ std::array<GLIndexedVertexArray, 3> m_varrays;
+};
+
+
+// Following class is a base class for a gizmo with ability to paint on mesh
+// using circular blush (such as FDM supports gizmo and seam painting gizmo).
+// The purpose is not to duplicate code related to mesh painting.
+class GLGizmoPainterBase : public GLGizmoBase
+{
+private:
+ ObjectID m_old_mo_id;
+ size_t m_old_volumes_size = 0;
+ virtual void on_render() const {}
+ virtual void on_render_for_picking() const {}
+
+public:
+ GLGizmoPainterBase(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id);
+ ~GLGizmoPainterBase() override {}
+ void set_painter_gizmo_data(const Selection& selection);
+ bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down);
+
+ // Following function renders the triangles and cursor. Having this separated
+ // from usual on_render method allows to render them before transparent objects,
+ // so they can be seen inside them. The usual on_render is called after all
+ // volumes (including transparent ones) are rendered.
+ virtual void render_painter_gizmo() const = 0;
+
+protected:
+ void render_triangles(const Selection& selection) const;
+ void render_cursor() const;
+ void render_cursor_circle() const;
+ void render_cursor_sphere(const Transform3d& trafo) const;
+ virtual void update_model_object() const = 0;
+ virtual void update_from_model_object() = 0;
+ void activate_internal_undo_redo_stack(bool activate);
+ void set_cursor_type(TriangleSelector::CursorType);
+
+ float m_cursor_radius = 2.f;
+ static constexpr float CursorRadiusMin = 0.4f; // cannot be zero
+ static constexpr float CursorRadiusMax = 8.f;
+ static constexpr float CursorRadiusStep = 0.2f;
+
+ // For each model-part volume, store status and division of the triangles.
+ std::vector<std::unique_ptr<TriangleSelectorGUI>> m_triangle_selectors;
+
+ TriangleSelector::CursorType m_cursor_type = TriangleSelector::SPHERE;
+
+
+private:
+ bool is_mesh_point_clipped(const Vec3d& point, const Transform3d& trafo) const;
+ void update_raycast_cache(const Vec2d& mouse_position,
+ const Camera& camera,
+ const std::vector<Transform3d>& trafo_matrices) const;
+
+ GLIndexedVertexArray m_vbo_sphere;
+
+ bool m_internal_stack_active = false;
+ bool m_schedule_update = false;
+ Vec2d m_last_mouse_click = Vec2d::Zero();
+
+ enum class Button {
+ None,
+ Left,
+ Right
+ };
+
+ Button m_button_down = Button::None;
+ EState m_old_state = Off; // to be able to see that the gizmo has just been closed (see on_set_state)
+
+ // Following cache holds result of a raycast query. The queries are asked
+ // during rendering the sphere cursor and painting, this saves repeated
+ // raycasts when the mouse position is the same as before.
+ struct RaycastResult {
+ Vec2d mouse_position;
+ int mesh_id;
+ Vec3f hit;
+ size_t facet;
+ };
+ mutable RaycastResult m_rr;
+
+protected:
+ void on_set_state() override;
+ void on_start_dragging() override {}
+ void on_stop_dragging() override {}
+
+ virtual void on_opening() = 0;
+ virtual void on_shutdown() = 0;
+ virtual PainterGizmoType get_painter_type() const = 0;
+
+ bool on_is_activable() const override;
+ bool on_is_selectable() const override;
+ void on_load(cereal::BinaryInputArchive& ar) override;
+ void on_save(cereal::BinaryOutputArchive& ar) const override {}
+ CommonGizmosDataID on_get_requirements() const override;
+};
+
+
+} // namespace GUI
+} // namespace Slic3r
+
+#endif // slic3r_GLGizmoPainterBase_hpp_
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp
index f3e565686..c5060a88e 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.cpp
@@ -1,9 +1,15 @@
// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro.
#include "GLGizmoRotate.hpp"
#include "slic3r/GUI/GLCanvas3D.hpp"
+#include "slic3r/GUI/ImGuiWrapper.hpp"
#include <GL/glew.h>
+#include "slic3r/GUI/GUI_App.hpp"
+#include "slic3r/GUI/GUI.hpp"
+#include "libslic3r/PresetBundle.hpp"
+
+#include "libslic3r/SLA/Rotfinder.hpp"
namespace Slic3r {
namespace GUI {
@@ -194,6 +200,12 @@ void GLGizmoRotate::on_render_for_picking() const
glsafe(::glPopMatrix());
}
+void GLGizmoRotate3D::on_render_input_window(float x, float y, float bottom_limit)
+{
+ if (wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA)
+ return;
+}
+
void GLGizmoRotate::render_circle() const
{
::glBegin(GL_LINE_LOOP);
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp
index 7365a20c3..126c97b1d 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoRotate.hpp
@@ -52,12 +52,12 @@ public:
std::string get_tooltip() const override;
protected:
- virtual bool on_init();
- virtual std::string on_get_name() const { return ""; }
- virtual void on_start_dragging();
- virtual void on_update(const UpdateData& data);
- virtual void on_render() const;
- virtual void on_render_for_picking() const;
+ bool on_init() override;
+ std::string on_get_name() const override { return ""; }
+ void on_start_dragging() override;
+ void on_update(const UpdateData& data) override;
+ void on_render() const override;
+ void on_render_for_picking() const override;
private:
void render_circle() const;
@@ -94,46 +94,48 @@ public:
}
protected:
- virtual bool on_init();
- virtual std::string on_get_name() const;
- virtual void on_set_state()
+ bool on_init() override;
+ std::string on_get_name() const override;
+ void on_set_state() override
{
for (GLGizmoRotate& g : m_gizmos)
g.set_state(m_state);
}
- virtual void on_set_hover_id()
+ void on_set_hover_id() override
{
for (int i = 0; i < 3; ++i)
m_gizmos[i].set_hover_id((m_hover_id == i) ? 0 : -1);
}
- virtual void on_enable_grabber(unsigned int id)
+ void on_enable_grabber(unsigned int id) override
{
if (id < 3)
m_gizmos[id].enable_grabber(0);
}
- virtual void on_disable_grabber(unsigned int id)
+ void on_disable_grabber(unsigned int id) override
{
if (id < 3)
m_gizmos[id].disable_grabber(0);
}
- virtual bool on_is_activable() const;
- virtual void on_start_dragging();
- virtual void on_stop_dragging();
- virtual void on_update(const UpdateData& data)
+ bool on_is_activable() const override;
+ void on_start_dragging() override;
+ void on_stop_dragging() override;
+ void on_update(const UpdateData& data) override
{
for (GLGizmoRotate& g : m_gizmos)
{
g.update(data);
}
}
- virtual void on_render() const;
- virtual void on_render_for_picking() const
+ void on_render() const override;
+ void on_render_for_picking() const override
{
for (const GLGizmoRotate& g : m_gizmos)
{
g.render_for_picking();
}
}
+
+ void on_render_input_window(float x, float y, float bottom_limit) override;
};
} // namespace GUI
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp
index 80cc16ba2..fa2069d0a 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.cpp
@@ -26,7 +26,6 @@ std::string GLGizmoScale3D::get_tooltip() const
bool single_instance = selection.is_single_full_instance();
bool single_volume = selection.is_single_modifier() || selection.is_single_volume();
- bool single_selection = single_instance || single_volume;
Vec3f scale = 100.0f * Vec3f::Ones();
if (single_instance)
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp
index 71f793279..0d8f3f7fa 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoScale.hpp
@@ -3,6 +3,8 @@
#include "GLGizmoBase.hpp"
+#include "libslic3r/BoundingBox.hpp"
+
namespace Slic3r {
namespace GUI {
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp
new file mode 100644
index 000000000..6c3a8ddd3
--- /dev/null
+++ b/src/slic3r/GUI/Gizmos/GLGizmoSeam.cpp
@@ -0,0 +1,262 @@
+#include "GLGizmoSeam.hpp"
+
+#include "libslic3r/Model.hpp"
+
+//#include "slic3r/GUI/3DScene.hpp"
+#include "slic3r/GUI/GLCanvas3D.hpp"
+#include "slic3r/GUI/GUI_App.hpp"
+#include "slic3r/GUI/ImGuiWrapper.hpp"
+#include "slic3r/GUI/Plater.hpp"
+
+
+#include <GL/glew.h>
+
+
+namespace Slic3r {
+
+namespace GUI {
+
+
+
+bool GLGizmoSeam::on_init()
+{
+ m_shortcut_key = WXK_CONTROL_P;
+
+ m_desc["clipping_of_view"] = _L("Clipping of view") + ": ";
+ m_desc["reset_direction"] = _L("Reset direction");
+ m_desc["cursor_size"] = _L("Brush size") + ": ";
+ m_desc["cursor_type"] = _L("Brush shape") + ": ";
+ m_desc["enforce_caption"] = _L("Left mouse button") + ": ";
+ m_desc["enforce"] = _L("Enforce seam");
+ m_desc["block_caption"] = _L("Right mouse button") + ": ";
+ m_desc["block"] = _L("Block seam");
+ m_desc["remove_caption"] = _L("Shift + Left mouse button") + ": ";
+ m_desc["remove"] = _L("Remove selection");
+ m_desc["remove_all"] = _L("Remove all selection");
+ m_desc["circle"] = _L("Circle");
+ m_desc["sphere"] = _L("Sphere");
+
+ return true;
+}
+
+
+
+std::string GLGizmoSeam::on_get_name() const
+{
+ return (_L("Seam painting") + " [P]").ToUTF8().data();
+}
+
+
+
+void GLGizmoSeam::render_painter_gizmo() const
+{
+ const Selection& selection = m_parent.get_selection();
+
+ glsafe(::glEnable(GL_BLEND));
+ glsafe(::glEnable(GL_DEPTH_TEST));
+
+ render_triangles(selection);
+
+ m_c->object_clipper()->render_cut();
+ render_cursor();
+
+ glsafe(::glDisable(GL_BLEND));
+}
+
+
+
+void GLGizmoSeam::on_render_input_window(float x, float y, float bottom_limit)
+{
+ if (! m_c->selection_info()->model_object())
+ return;
+
+ const float approx_height = m_imgui->scaled(14.0f);
+ y = std::min(y, bottom_limit - approx_height);
+ m_imgui->set_next_window_pos(x, y, ImGuiCond_Always);
+ m_imgui->begin(on_get_name(), ImGuiWindowFlags_NoMove | ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoCollapse);
+
+ // First calculate width of all the texts that are could possibly be shown. We will decide set the dialog width based on that:
+ const float clipping_slider_left = std::max(m_imgui->calc_text_size(m_desc.at("clipping_of_view")).x,
+ m_imgui->calc_text_size(m_desc.at("reset_direction")).x)
+ + m_imgui->scaled(1.5f);
+ const float cursor_size_slider_left = m_imgui->calc_text_size(m_desc.at("cursor_size")).x + m_imgui->scaled(1.f);
+ const float cursor_type_radio_left = m_imgui->calc_text_size(m_desc.at("cursor_type")).x + m_imgui->scaled(1.f);
+ const float cursor_type_radio_width1 = m_imgui->calc_text_size(m_desc["circle"]).x
+ + m_imgui->scaled(2.5f);
+ const float cursor_type_radio_width2 = m_imgui->calc_text_size(m_desc["sphere"]).x
+ + m_imgui->scaled(2.5f);
+ const float button_width = m_imgui->calc_text_size(m_desc.at("remove_all")).x + m_imgui->scaled(1.f);
+ const float minimal_slider_width = m_imgui->scaled(4.f);
+
+ float caption_max = 0.f;
+ float total_text_max = 0.;
+ for (const std::string& t : {"enforce", "block", "remove"}) {
+ caption_max = std::max(caption_max, m_imgui->calc_text_size(m_desc.at(t+"_caption")).x);
+ total_text_max = std::max(total_text_max, caption_max + m_imgui->calc_text_size(m_desc.at(t)).x);
+ }
+ caption_max += m_imgui->scaled(1.f);
+ total_text_max += m_imgui->scaled(1.f);
+
+ float window_width = minimal_slider_width + std::max(cursor_size_slider_left, clipping_slider_left);
+ window_width = std::max(window_width, total_text_max);
+ window_width = std::max(window_width, button_width);
+ window_width = std::max(window_width, cursor_type_radio_left + cursor_type_radio_width1 + cursor_type_radio_width2);
+
+ auto draw_text_with_caption = [this, &caption_max](const wxString& caption, const wxString& text) {
+ static const ImVec4 ORANGE(1.0f, 0.49f, 0.22f, 1.0f);
+ m_imgui->text_colored(ORANGE, caption);
+ ImGui::SameLine(caption_max);
+ m_imgui->text(text);
+ };
+
+ for (const std::string& t : {"enforce", "block", "remove"})
+ draw_text_with_caption(m_desc.at(t + "_caption"), m_desc.at(t));
+
+ m_imgui->text("");
+
+ if (m_imgui->button(m_desc.at("remove_all"))) {
+ Plater::TakeSnapshot(wxGetApp().plater(), wxString(_L("Reset selection")));
+ ModelObject* mo = m_c->selection_info()->model_object();
+ int idx = -1;
+ for (ModelVolume* mv : mo->volumes) {
+ if (mv->is_model_part()) {
+ ++idx;
+ m_triangle_selectors[idx]->reset();
+ }
+ }
+
+ update_model_object();
+ m_parent.set_as_dirty();
+ }
+
+ const float max_tooltip_width = ImGui::GetFontSize() * 20.0f;
+
+ m_imgui->text(m_desc.at("cursor_size"));
+ ImGui::SameLine(cursor_size_slider_left);
+ ImGui::PushItemWidth(window_width - cursor_size_slider_left);
+ ImGui::SliderFloat(" ", &m_cursor_radius, CursorRadiusMin, CursorRadiusMax, "%.2f");
+ if (ImGui::IsItemHovered()) {
+ ImGui::BeginTooltip();
+ ImGui::PushTextWrapPos(max_tooltip_width);
+ ImGui::TextUnformatted(_L("Alt + Mouse wheel").ToUTF8().data());
+ ImGui::PopTextWrapPos();
+ ImGui::EndTooltip();
+ }
+
+
+ ImGui::AlignTextToFramePadding();
+ m_imgui->text(m_desc.at("cursor_type"));
+ ImGui::SameLine(cursor_type_radio_left + m_imgui->scaled(0.f));
+ ImGui::PushItemWidth(cursor_type_radio_width1);
+
+ bool sphere_sel = m_cursor_type == TriangleSelector::CursorType::SPHERE;
+ if (m_imgui->radio_button(m_desc["sphere"], sphere_sel))
+ sphere_sel = true;
+
+ if (ImGui::IsItemHovered()) {
+ ImGui::BeginTooltip();
+ ImGui::PushTextWrapPos(max_tooltip_width);
+ ImGui::TextUnformatted(_L("Paints all facets inside, regardless of their orientation.").ToUTF8().data());
+ ImGui::PopTextWrapPos();
+ ImGui::EndTooltip();
+ }
+
+ ImGui::SameLine(cursor_type_radio_left + cursor_type_radio_width2 + m_imgui->scaled(0.f));
+ ImGui::PushItemWidth(cursor_type_radio_width2);
+
+ if (m_imgui->radio_button(m_desc["circle"], ! sphere_sel))
+ sphere_sel = false;
+
+ if (ImGui::IsItemHovered()) {
+ ImGui::BeginTooltip();
+ ImGui::PushTextWrapPos(max_tooltip_width);
+ ImGui::TextUnformatted(_L("Ignores facets facing away from the camera.").ToUTF8().data());
+ ImGui::PopTextWrapPos();
+ ImGui::EndTooltip();
+ }
+
+ m_cursor_type = sphere_sel
+ ? TriangleSelector::CursorType::SPHERE
+ : TriangleSelector::CursorType::CIRCLE;
+
+
+
+ ImGui::Separator();
+ if (m_c->object_clipper()->get_position() == 0.f)
+ m_imgui->text(m_desc.at("clipping_of_view"));
+ else {
+ if (m_imgui->button(m_desc.at("reset_direction"))) {
+ wxGetApp().CallAfter([this](){
+ m_c->object_clipper()->set_position(-1., false);
+ });
+ }
+ }
+
+ ImGui::SameLine(clipping_slider_left);
+ ImGui::PushItemWidth(window_width - clipping_slider_left);
+ float clp_dist = m_c->object_clipper()->get_position();
+ if (ImGui::SliderFloat(" ", &clp_dist, 0.f, 1.f, "%.2f"))
+ m_c->object_clipper()->set_position(clp_dist, true);
+ if (ImGui::IsItemHovered()) {
+ ImGui::BeginTooltip();
+ ImGui::PushTextWrapPos(max_tooltip_width);
+ ImGui::TextUnformatted(_L("Ctrl + Mouse wheel").ToUTF8().data());
+ ImGui::PopTextWrapPos();
+ ImGui::EndTooltip();
+ }
+
+ m_imgui->end();
+}
+
+
+
+void GLGizmoSeam::update_model_object() const
+{
+ bool updated = false;
+ ModelObject* mo = m_c->selection_info()->model_object();
+ int idx = -1;
+ for (ModelVolume* mv : mo->volumes) {
+ if (! mv->is_model_part())
+ continue;
+ ++idx;
+ updated |= mv->seam_facets.set(*m_triangle_selectors[idx].get());
+ }
+
+ if (updated)
+ m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS));
+}
+
+
+
+void GLGizmoSeam::update_from_model_object()
+{
+ wxBusyCursor wait;
+
+ const ModelObject* mo = m_c->selection_info()->model_object();
+ m_triangle_selectors.clear();
+
+ int volume_id = -1;
+ for (const ModelVolume* mv : mo->volumes) {
+ if (! mv->is_model_part())
+ continue;
+
+ ++volume_id;
+
+ // This mesh does not account for the possible Z up SLA offset.
+ const TriangleMesh* mesh = &mv->mesh();
+
+ m_triangle_selectors.emplace_back(std::make_unique<TriangleSelectorGUI>(*mesh));
+ m_triangle_selectors.back()->deserialize(mv->seam_facets.get_data());
+ }
+}
+
+
+PainterGizmoType GLGizmoSeam::get_painter_type() const
+{
+ return PainterGizmoType::SEAM;
+}
+
+
+
+} // namespace GUI
+} // namespace Slic3r
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp
new file mode 100644
index 000000000..dfadec0da
--- /dev/null
+++ b/src/slic3r/GUI/Gizmos/GLGizmoSeam.hpp
@@ -0,0 +1,43 @@
+#ifndef slic3r_GLGizmoSeam_hpp_
+#define slic3r_GLGizmoSeam_hpp_
+
+#include "GLGizmoPainterBase.hpp"
+
+namespace Slic3r {
+
+namespace GUI {
+
+class GLGizmoSeam : public GLGizmoPainterBase
+{
+public:
+ GLGizmoSeam(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id)
+ : GLGizmoPainterBase(parent, icon_filename, sprite_id) {}
+
+ void render_painter_gizmo() const override;
+
+protected:
+ void on_render_input_window(float x, float y, float bottom_limit) override;
+ std::string on_get_name() const override;
+ PainterGizmoType get_painter_type() const override;
+
+private:
+ bool on_init() override;
+
+ void update_model_object() const override;
+ void update_from_model_object() override;
+
+ void on_opening() override {}
+ void on_shutdown() override {}
+
+ // This map holds all translated description texts, so they can be easily referenced during layout calculations
+ // etc. When language changes, GUI is recreated and this class constructed again, so the change takes effect.
+ std::map<std::string, wxString> m_desc;
+};
+
+
+
+} // namespace GUI
+} // namespace Slic3r
+
+
+#endif // slic3r_GLGizmoSeam_hpp_
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
index 0e98f7364..e626aa7f8 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.cpp
@@ -1,7 +1,9 @@
// Include GLGizmoBase.hpp before I18N.hpp as it includes some libigl code, which overrides our localization "L" macro.
#include "GLGizmoSlaSupports.hpp"
#include "slic3r/GUI/GLCanvas3D.hpp"
-#include "slic3r/GUI/Gizmos/GLGizmos.hpp"
+#include "slic3r/GUI/Camera.hpp"
+#include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp"
+#include "slic3r/GUI/MainFrame.hpp"
#include <GL/glew.h>
@@ -13,9 +15,8 @@
#include "slic3r/GUI/GUI.hpp"
#include "slic3r/GUI/GUI_ObjectSettings.hpp"
#include "slic3r/GUI/GUI_ObjectList.hpp"
-#include "slic3r/GUI/MeshUtils.hpp"
#include "slic3r/GUI/Plater.hpp"
-#include "slic3r/GUI/PresetBundle.hpp"
+#include "libslic3r/PresetBundle.hpp"
#include "libslic3r/SLAPrint.hpp"
@@ -25,7 +26,6 @@ namespace GUI {
GLGizmoSlaSupports::GLGizmoSlaSupports(GLCanvas3D& parent, const std::string& icon_filename, unsigned int sprite_id)
: GLGizmoBase(parent, icon_filename, sprite_id)
, m_quadric(nullptr)
- , m_its(nullptr)
{
m_quadric = ::gluNewQuadric();
if (m_quadric != nullptr)
@@ -62,26 +62,21 @@ bool GLGizmoSlaSupports::on_init()
void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const Selection& selection)
{
- if (m_c->recent_update) {
- if (m_state == On)
- m_c->build_AABB_if_needed();
+ if (! m_c->selection_info())
+ return;
- update_clipping_plane(m_c->m_clipping_plane_was_moved);
+ ModelObject* mo = m_c->selection_info()->model_object();
+ if (m_state == On && mo && mo->id() != m_old_mo_id) {
disable_editing_mode();
- if (m_c->m_model_object)
- reload_cache();
- }
-
- if (m_state == On) {
- m_parent.toggle_model_objects_visibility(false);
- m_parent.toggle_model_objects_visibility(true, m_c->m_model_object, m_c->m_active_instance);
- m_parent.toggle_sla_auxiliaries_visibility(! m_editing_mode, m_c->m_model_object, m_c->m_active_instance);
+ reload_cache();
+ m_old_mo_id = mo->id();
+ m_c->instances_hider()->show_supports(true);
}
// If we triggered autogeneration before, check backend and fetch results if they are there
- if (m_c->m_model_object) {
- if (m_c->m_model_object->sla_points_status == sla::PointsStatus::Generating)
+ if (mo) {
+ if (mo->sla_points_status == sla::PointsStatus::Generating)
get_data_from_backend();
}
}
@@ -90,13 +85,13 @@ void GLGizmoSlaSupports::set_sla_support_data(ModelObject* model_object, const S
void GLGizmoSlaSupports::on_render() const
{
+ ModelObject* mo = m_c->selection_info()->model_object();
const Selection& selection = m_parent.get_selection();
// If current m_c->m_model_object does not match selection, ask GLCanvas3D to turn us off
if (m_state == On
- && (m_c->m_model_object != selection.get_model()->objects[selection.get_object_idx()]
- || m_c->m_active_instance != selection.get_instance_idx()
- || m_c->m_model_object_id != m_c->m_model_object->id())) {
+ && (mo != selection.get_model()->objects[selection.get_object_idx()]
+ || m_c->selection_info()->get_active_instance() != selection.get_instance_idx())) {
m_parent.post_event(SimpleEvent(EVT_GLCANVAS_RESETGIZMOS));
return;
}
@@ -104,141 +99,22 @@ void GLGizmoSlaSupports::on_render() const
glsafe(::glEnable(GL_BLEND));
glsafe(::glEnable(GL_DEPTH_TEST));
- m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z();
-
- render_hollowed_mesh();
-
if (m_quadric != nullptr && selection.is_from_single_instance())
render_points(selection, false);
m_selection_rectangle.render(m_parent);
- render_clipping_plane(selection);
+ m_c->object_clipper()->render_cut();
+ m_c->supports_clipper()->render_cut();
glsafe(::glDisable(GL_BLEND));
}
-
-void GLGizmoSlaSupports::render_hollowed_mesh() const
-{
- /*if (m_c->m_volume_with_cavity) {
- m_c->m_volume_with_cavity->set_sla_shift_z(m_z_shift);
- m_parent.get_shader().start_using();
-
- GLint current_program_id;
- glsafe(::glGetIntegerv(GL_CURRENT_PROGRAM, &current_program_id));
- GLint color_id = (current_program_id > 0) ? ::glGetUniformLocation(current_program_id, "uniform_color") : -1;
- GLint print_box_detection_id = (current_program_id > 0) ? ::glGetUniformLocation(current_program_id, "print_box.volume_detection") : -1;
- GLint print_box_worldmatrix_id = (current_program_id > 0) ? ::glGetUniformLocation(current_program_id, "print_box.volume_world_matrix") : -1;
- glcheck();
- m_c->m_volume_with_cavity->set_render_color();
- const Geometry::Transformation& volume_trafo = m_c->m_model_object->volumes.front()->get_transformation();
- m_c->m_volume_with_cavity->set_volume_transformation(volume_trafo);
- m_c->m_volume_with_cavity->set_instance_transformation(m_c->m_model_object->instances[size_t(m_c->m_active_instance)]->get_transformation());
- m_c->m_volume_with_cavity->render(color_id, print_box_detection_id, print_box_worldmatrix_id);
- m_parent.get_shader().stop_using();
- }*/
-}
-
-
-
-void GLGizmoSlaSupports::render_clipping_plane(const Selection& selection) const
-{
- if (m_c->m_clipping_plane_distance == 0.f || m_c->m_mesh->empty())
- return;
-
- // Get transformation of the instance
- const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin());
- Geometry::Transformation trafo = vol->get_instance_transformation();
- trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_z_shift));
-
- // Get transformation of supports
- Geometry::Transformation supports_trafo;
- supports_trafo.set_offset(Vec3d(trafo.get_offset()(0), trafo.get_offset()(1), vol->get_sla_shift_z()));
- supports_trafo.set_rotation(Vec3d(0., 0., trafo.get_rotation()(2)));
- // I don't know why, but following seems to be correct.
- supports_trafo.set_mirror(Vec3d(trafo.get_mirror()(0) * trafo.get_mirror()(1) * trafo.get_mirror()(2),
- 1,
- 1.));
-
- // Now initialize the TMS for the object, perform the cut and save the result.
- if (! m_c->m_object_clipper) {
- m_c->m_object_clipper.reset(new MeshClipper);
- m_c->m_object_clipper->set_mesh(*m_c->mesh());
- }
- m_c->m_object_clipper->set_plane(*m_c->m_clipping_plane);
- m_c->m_object_clipper->set_transformation(trafo);
-
-
- // Next, ask the backend if supports are already calculated. If so, we are gonna cut them too.
- // First we need a pointer to the respective SLAPrintObject. The index into objects vector is
- // cached so we don't have todo it on each render. We only search for the po if needed:
- if (m_c->m_print_object_idx < 0 || (int)m_parent.sla_print()->objects().size() != m_c->m_print_objects_count) {
- m_c->m_print_objects_count = m_parent.sla_print()->objects().size();
- m_c->m_print_object_idx = -1;
- for (const SLAPrintObject* po : m_parent.sla_print()->objects()) {
- ++m_c->m_print_object_idx;
- if (po->model_object()->id() == m_c->m_model_object->id())
- break;
- }
- }
- if (m_c->m_print_object_idx >= 0) {
- const SLAPrintObject* print_object = m_parent.sla_print()->objects()[m_c->m_print_object_idx];
-
- if (print_object->is_step_done(slaposSupportTree) && !print_object->get_mesh(slaposSupportTree).empty()) {
- // If the supports are already calculated, save the timestamp of the respective step
- // so we can later tell they were recalculated.
- size_t timestamp = print_object->step_state_with_timestamp(slaposSupportTree).timestamp;
-
- if (! m_c->m_supports_clipper || (int)timestamp != m_c->m_old_timestamp) {
- // The timestamp has changed.
- m_c->m_supports_clipper.reset(new MeshClipper);
- // The mesh should already have the shared vertices calculated.
- m_c->m_supports_clipper->set_mesh(print_object->support_mesh());
- m_c->m_old_timestamp = timestamp;
- }
- m_c->m_supports_clipper->set_plane(*m_c->m_clipping_plane);
- m_c->m_supports_clipper->set_transformation(supports_trafo);
- }
- else
- // The supports are not valid. We better dump the cached data.
- m_c->m_supports_clipper.reset();
- }
-
- // At this point we have the triangulated cuts for both the object and supports - let's render.
- if (! m_c->m_object_clipper->get_triangles().empty()) {
- ::glPushMatrix();
- ::glColor3f(1.0f, 0.37f, 0.0f);
- ::glBegin(GL_TRIANGLES);
- for (const Vec3f& point : m_c->m_object_clipper->get_triangles())
- ::glVertex3f(point(0), point(1), point(2));
- ::glEnd();
- ::glPopMatrix();
- }
-
- if (m_c->m_supports_clipper && ! m_c->m_supports_clipper->get_triangles().empty() && !m_editing_mode) {
- // The supports are hidden in the editing mode, so it makes no sense to render the cuts.
- ::glPushMatrix();
- ::glColor3f(1.0f, 0.f, 0.37f);
- ::glBegin(GL_TRIANGLES);
- for (const Vec3f& point : m_c->m_supports_clipper->get_triangles())
- ::glVertex3f(point(0), point(1), point(2));
- ::glEnd();
- ::glPopMatrix();
- }
-}
-
-
void GLGizmoSlaSupports::on_render_for_picking() const
{
const Selection& selection = m_parent.get_selection();
-#if ENABLE_RENDER_PICKING_PASS
- m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z();
-#endif
-
glsafe(::glEnable(GL_DEPTH_TEST));
render_points(selection, true);
- render_hollowed_mesh();
}
void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking) const
@@ -249,9 +125,10 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking)
const GLVolume* vol = selection.get_volume(*selection.get_volume_idxs().begin());
const Transform3d& instance_scaling_matrix_inverse = vol->get_instance_transformation().get_matrix(true, true, false, true).inverse();
const Transform3d& instance_matrix = vol->get_instance_transformation().get_matrix();
+ float z_shift = m_c->selection_info()->get_sla_shift();
glsafe(::glPushMatrix());
- glsafe(::glTranslated(0.0, 0.0, m_z_shift));
+ glsafe(::glTranslated(0.0, 0.0, z_shift));
glsafe(::glMultMatrixd(instance_matrix.data()));
float render_color[4];
@@ -307,7 +184,7 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking)
if (m_editing_mode) {
// in case the normal is not yet cached, find and cache it
if (m_editing_cache[i].normal == Vec3f::Zero())
- m_c->m_mesh_raycaster->get_closest_point(m_editing_cache[i].support_point.pos, &m_editing_cache[i].normal);
+ m_c->raycaster()->raycaster()->get_closest_point(m_editing_cache[i].support_point.pos, &m_editing_cache[i].normal);
Eigen::Quaterniond q;
q.setFromTwoVectors(Vec3d{0., 0., 1.}, instance_scaling_matrix_inverse * m_editing_cache[i].normal.cast<double>());
@@ -337,14 +214,15 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking)
}
// Now render the drain holes:
- if (! m_c->has_drilled_mesh()) {
+ //if (! m_c->has_drilled_mesh()) {
+ if (! m_c->hollowed_mesh()->get_hollowed_mesh()) {
render_color[0] = 0.7f;
render_color[1] = 0.7f;
render_color[2] = 0.7f;
render_color[3] = 0.7f;
glsafe(::glColor4fv(render_color));
- for (const sla::DrainHole& drain_hole : m_c->m_model_object->sla_drain_holes) {
- if (is_mesh_point_clipped((drain_hole.pos+m_c->HoleStickOutLength*drain_hole.normal).cast<double>()))
+ for (const sla::DrainHole& drain_hole : m_c->selection_info()->model_object()->sla_drain_holes) {
+ if (is_mesh_point_clipped(drain_hole.pos.cast<double>()))
continue;
// Inverse matrix of the instance scaling is applied so that the mark does not scale with the object.
@@ -363,10 +241,10 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking)
glsafe(::glRotated(aa.angle() * (180. / M_PI), aa.axis()(0), aa.axis()(1), aa.axis()(2)));
glsafe(::glPushMatrix());
glsafe(::glTranslated(0., 0., -drain_hole.height));
- ::gluCylinder(m_quadric, drain_hole.radius, drain_hole.radius, drain_hole.height, 24, 1);
- glsafe(::glTranslated(0., 0., drain_hole.height));
+ ::gluCylinder(m_quadric, drain_hole.radius, drain_hole.radius, drain_hole.height + sla::HoleStickOutLength, 24, 1);
+ glsafe(::glTranslated(0., 0., drain_hole.height + sla::HoleStickOutLength));
::gluDisk(m_quadric, 0.0, drain_hole.radius, 24, 1);
- glsafe(::glTranslated(0., 0., -drain_hole.height));
+ glsafe(::glTranslated(0., 0., -drain_hole.height - sla::HoleStickOutLength));
glsafe(::glRotatef(180.f, 1.f, 0.f, 0.f));
::gluDisk(m_quadric, 0.0, drain_hole.radius, 24, 1);
glsafe(::glPopMatrix());
@@ -387,12 +265,17 @@ void GLGizmoSlaSupports::render_points(const Selection& selection, bool picking)
bool GLGizmoSlaSupports::is_mesh_point_clipped(const Vec3d& point) const
{
- if (m_c->m_clipping_plane_distance == 0.f)
+ if (m_c->object_clipper()->get_position() == 0.)
return false;
- Vec3d transformed_point = m_c->m_model_object->instances[m_c->m_active_instance]->get_transformation().get_matrix() * point;
- transformed_point(2) += m_z_shift;
- return m_c->m_clipping_plane->is_point_clipped(transformed_point);
+ auto sel_info = m_c->selection_info();
+ int active_inst = m_c->selection_info()->get_active_instance();
+ const ModelInstance* mi = sel_info->model_object()->instances[active_inst];
+ const Transform3d& trafo = mi->get_transformation().get_matrix();
+
+ Vec3d transformed_point = trafo * point;
+ transformed_point(2) += sel_info->get_sla_shift();
+ return m_c->object_clipper()->get_clipping_plane()->is_point_clipped(transformed_point);
}
@@ -401,33 +284,37 @@ bool GLGizmoSlaSupports::is_mesh_point_clipped(const Vec3d& point) const
// Return false if no intersection was found, true otherwise.
bool GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos, std::pair<Vec3f, Vec3f>& pos_and_normal)
{
- if (! m_c->m_mesh_raycaster)
+ if (! m_c->raycaster()->raycaster())
return false;
- const Camera& camera = m_parent.get_camera();
+ const Camera& camera = wxGetApp().plater()->get_camera();
const Selection& selection = m_parent.get_selection();
const GLVolume* volume = selection.get_volume(*selection.get_volume_idxs().begin());
Geometry::Transformation trafo = volume->get_instance_transformation();
- trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_z_shift));
+ trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_c->selection_info()->get_sla_shift()));
+
+ double clp_dist = m_c->object_clipper()->get_position();
+ const ClippingPlane* clp = m_c->object_clipper()->get_clipping_plane();
// The raycaster query
Vec3f hit;
Vec3f normal;
- if (m_c->m_mesh_raycaster->unproject_on_mesh(
+ if (m_c->raycaster()->raycaster()->unproject_on_mesh(
mouse_pos,
trafo.get_matrix(),
camera,
hit,
normal,
- m_c->m_clipping_plane_distance != 0.f ? m_c->m_clipping_plane.get() : nullptr))
+ clp_dist != 0. ? clp : nullptr))
{
// Check whether the hit is in a hole
bool in_hole = false;
// In case the hollowed and drilled mesh is available, we can allow
// placing points in holes, because they should never end up
// on surface that's been drilled away.
- if (! m_c->has_drilled_mesh()) {
- for (const sla::DrainHole& hole : m_c->m_model_object->sla_drain_holes) {
+ if (! m_c->hollowed_mesh()->get_hollowed_mesh()) {
+ sla::DrainHoles drain_holes = m_c->selection_info()->model_object()->sla_drain_holes;
+ for (const sla::DrainHole& hole : drain_holes) {
if (hole.is_inside(hit)) {
in_hole = true;
break;
@@ -450,6 +337,9 @@ bool GLGizmoSlaSupports::unproject_on_mesh(const Vec2d& mouse_pos, std::pair<Vec
// concludes that the event was not intended for it, it should return false.
bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down)
{
+ ModelObject* mo = m_c->selection_info()->model_object();
+ int active_inst = m_c->selection_info()->get_active_instance();
+
if (m_editing_mode) {
// left down with shift - show the selection rectangle:
@@ -501,8 +391,8 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous
GLSelectionRectangle::EState rectangle_status = m_selection_rectangle.get_state();
// First collect positions of all the points in world coordinates.
- Geometry::Transformation trafo = m_c->m_model_object->instances[m_c->m_active_instance]->get_transformation();
- trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_z_shift));
+ Geometry::Transformation trafo = mo->instances[active_inst]->get_transformation();
+ trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., m_c->selection_info()->get_sla_shift()));
std::vector<Vec3d> points;
for (unsigned int i=0; i<m_editing_cache.size(); ++i)
points.push_back(trafo.get_matrix() * m_editing_cache[i].support_point.pos.cast<double>());
@@ -514,7 +404,9 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous
points_inside.push_back(points[idx].cast<float>());
// Only select/deselect points that are actually visible
- for (size_t idx : m_c->m_mesh_raycaster->get_unobscured_idxs(trafo, m_parent.get_camera(), points_inside, m_c->m_clipping_plane.get()))
+ for (size_t idx : m_c->raycaster()->raycaster()->get_unobscured_idxs(
+ trafo, wxGetApp().plater()->get_camera(), points_inside,
+ m_c->object_clipper()->get_clipping_plane()))
{
if (rectangle_status == GLSelectionRectangle::Deselect)
unselect_point(points_idxs[idx]);
@@ -591,20 +483,21 @@ bool GLGizmoSlaSupports::gizmo_event(SLAGizmoEventType action, const Vec2d& mous
}
if (action == SLAGizmoEventType::MouseWheelUp && control_down) {
- m_c->m_clipping_plane_distance = std::min(1.f, m_c->m_clipping_plane_distance + 0.01f);
- update_clipping_plane(m_c->m_clipping_plane_was_moved);
- m_c->m_clipping_plane_was_moved = true;
+ double pos = m_c->object_clipper()->get_position();
+ pos = std::min(1., pos + 0.01);
+ m_c->object_clipper()->set_position(pos, true);
return true;
}
if (action == SLAGizmoEventType::MouseWheelDown && control_down) {
- m_c->m_clipping_plane_distance = std::max(0.f, m_c->m_clipping_plane_distance - 0.01f);
- update_clipping_plane(true);
+ double pos = m_c->object_clipper()->get_position();
+ pos = std::max(0., pos - 0.01);
+ m_c->object_clipper()->set_position(pos, true);
return true;
}
if (action == SLAGizmoEventType::ResetClippingPlane) {
- update_clipping_plane();
+ m_c->object_clipper()->set_position(-1., false);
return true;
}
@@ -627,8 +520,6 @@ void GLGizmoSlaSupports::delete_selected_points(bool force)
}
select_point(NoPoints);
-
- //m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS));
}
void GLGizmoSlaSupports::on_update(const UpdateData& data)
@@ -643,8 +534,6 @@ void GLGizmoSlaSupports::on_update(const UpdateData& data)
m_editing_cache[m_hover_id].support_point.pos = pos_and_normal.first;
m_editing_cache[m_hover_id].support_point.is_new_island = false;
m_editing_cache[m_hover_id].normal = pos_and_normal.second;
- // Do not update immediately, wait until the mouse is released.
- // m_parent.post_event(SimpleEvent(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS));
}
}
}
@@ -652,11 +541,12 @@ void GLGizmoSlaSupports::on_update(const UpdateData& data)
std::vector<const ConfigOption*> GLGizmoSlaSupports::get_config_options(const std::vector<std::string>& keys) const
{
std::vector<const ConfigOption*> out;
+ const ModelObject* mo = m_c->selection_info()->model_object();
- if (!m_c->m_model_object)
+ if (! mo)
return out;
- const DynamicPrintConfig& object_cfg = m_c->m_model_object->config;
+ const DynamicPrintConfig& object_cfg = mo->config.get();
const DynamicPrintConfig& print_cfg = wxGetApp().preset_bundle->sla_prints.get_edited_preset().config;
std::unique_ptr<DynamicPrintConfig> default_cfg = nullptr;
@@ -677,14 +567,6 @@ std::vector<const ConfigOption*> GLGizmoSlaSupports::get_config_options(const st
}
-ClippingPlane GLGizmoSlaSupports::get_sla_clipping_plane() const
-{
- if (!m_c->m_model_object || m_state == Off || m_c->m_clipping_plane_distance == 0.f)
- return ClippingPlane::ClipsNothing();
- else
- return ClippingPlane(-m_c->m_clipping_plane->get_normal(), m_c->m_clipping_plane->get_data()[3]);
-}
-
/*
void GLGizmoSlaSupports::find_intersecting_facets(const igl::AABB<Eigen::MatrixXf, 3>* aabb, const Vec3f& normal, double offset, std::vector<unsigned int>& idxs) const
@@ -732,7 +614,9 @@ void GLGizmoSlaSupports::on_render_input_window(float x, float y, float bottom_l
static float last_y = 0.0f;
static float last_h = 0.0f;
- if (! m_c->m_model_object)
+ ModelObject* mo = m_c->selection_info()->model_object();
+
+ if (! mo)
return;
bool first_run = true; // This is a hack to redraw the button when all points are removed,
@@ -869,15 +753,15 @@ RENDER_AGAIN:
m_density_stash = density;
}
if (slider_edited) {
- m_c->m_model_object->config.opt<ConfigOptionFloat>("support_points_minimal_distance", true)->value = minimal_point_distance;
- m_c->m_model_object->config.opt<ConfigOptionInt>("support_points_density_relative", true)->value = (int)density;
+ mo->config.set("support_points_minimal_distance", minimal_point_distance);
+ mo->config.set("support_points_density_relative", (int)density);
}
if (slider_released) {
- m_c->m_model_object->config.opt<ConfigOptionFloat>("support_points_minimal_distance", true)->value = m_minimal_point_distance_stash;
- m_c->m_model_object->config.opt<ConfigOptionInt>("support_points_density_relative", true)->value = (int)m_density_stash;
+ mo->config.set("support_points_minimal_distance", m_minimal_point_distance_stash);
+ mo->config.set("support_points_density_relative", (int)m_density_stash);
Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Support parameter change")));
- m_c->m_model_object->config.opt<ConfigOptionFloat>("support_points_minimal_distance", true)->value = minimal_point_distance;
- m_c->m_model_object->config.opt<ConfigOptionInt>("support_points_density_relative", true)->value = (int)density;
+ mo->config.set("support_points_minimal_distance", minimal_point_distance);
+ mo->config.set("support_points_density_relative", (int)density);
wxGetApp().obj_list()->update_and_show_object_settings_item();
}
@@ -904,7 +788,7 @@ RENDER_AGAIN:
// Following is rendered in both editing and non-editing mode:
ImGui::Separator();
- if (m_c->m_clipping_plane_distance == 0.f)
+ if (m_c->object_clipper()->get_position() == 0.f)
{
ImGui::AlignTextToFramePadding();
m_imgui->text(m_desc.at("clipping_of_view"));
@@ -912,17 +796,16 @@ RENDER_AGAIN:
else {
if (m_imgui->button(m_desc.at("reset_direction"))) {
wxGetApp().CallAfter([this](){
- update_clipping_plane();
+ m_c->object_clipper()->set_position(-1., false);
});
}
}
ImGui::SameLine(clipping_slider_left);
ImGui::PushItemWidth(window_width - clipping_slider_left);
- if (ImGui::SliderFloat(" ", &m_c->m_clipping_plane_distance, 0.f, 1.f, "%.2f")) {
- update_clipping_plane(m_c->m_clipping_plane_was_moved);
- m_c->m_clipping_plane_was_moved = true;
- }
+ float clp_dist = m_c->object_clipper()->get_position();
+ if (ImGui::SliderFloat(" ", &clp_dist, 0.f, 1.f, "%.2f"))
+ m_c->object_clipper()->set_position(clp_dist, true);
if (m_imgui->button("?")) {
@@ -987,39 +870,32 @@ std::string GLGizmoSlaSupports::on_get_name() const
}
+CommonGizmosDataID GLGizmoSlaSupports::on_get_requirements() const
+{
+ return CommonGizmosDataID(
+ int(CommonGizmosDataID::SelectionInfo)
+ | int(CommonGizmosDataID::InstancesHider)
+ | int(CommonGizmosDataID::Raycaster)
+ | int(CommonGizmosDataID::HollowedMesh)
+ | int(CommonGizmosDataID::ObjectClipper)
+ | int(CommonGizmosDataID::SupportsClipper));
+}
+
+
void GLGizmoSlaSupports::on_set_state()
{
- // m_c->m_model_object pointer can be invalid (for instance because of undo/redo action),
- // we should recover it from the object id
- m_c->m_model_object = nullptr;
- for (const auto mo : wxGetApp().model().objects) {
- if (mo->id() == m_c->m_model_object_id) {
- m_c->m_model_object = mo;
- break;
- }
- }
-
if (m_state == m_old_state)
return;
if (m_state == On && m_old_state != On) { // the gizmo was just turned on
- Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned on")));
-
- m_c->unstash_clipping_plane();
- update_clipping_plane(m_c->m_clipping_plane_was_moved);
-
- m_c->build_AABB_if_needed();
-
-
- // we'll now reload support points:
- if (m_c->m_model_object)
- reload_cache();
-
- m_parent.toggle_model_objects_visibility(false);
- if (m_c->m_model_object) {
- m_parent.toggle_model_objects_visibility(true, m_c->m_model_object, m_c->m_active_instance);
- m_parent.toggle_sla_auxiliaries_visibility(! m_editing_mode, m_c->m_model_object, m_c->m_active_instance);
+ if (! m_parent.get_gizmos_manager().is_serializing()) {
+ // Only take the snapshot when the USER opens the gizmo. Common gizmos
+ // data are not yet available, the CallAfter will postpone taking the
+ // snapshot until they are. No, it does not feel right.
+ wxGetApp().CallAfter([this]() {
+ Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned on")));
+ });
}
// Set default head diameter from config.
@@ -1027,7 +903,7 @@ void GLGizmoSlaSupports::on_set_state()
m_new_point_head_diameter = static_cast<const ConfigOptionFloat*>(cfg.option("support_head_front_diameter"))->value;
}
if (m_state == Off && m_old_state != Off) { // the gizmo was just turned Off
- bool will_ask = m_c->m_model_object && m_editing_mode && unsaved_changes();
+ bool will_ask = m_editing_mode && unsaved_changes();
if (will_ask) {
wxGetApp().CallAfter([this]() {
// Following is called through CallAfter, because otherwise there was a problem
@@ -1046,16 +922,8 @@ void GLGizmoSlaSupports::on_set_state()
// we are actually shutting down
disable_editing_mode(); // so it is not active next time the gizmo opens
Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("SLA gizmo turned off")));
- m_parent.toggle_model_objects_visibility(true);
m_normal_cache.clear();
- m_c->stash_clipping_plane();
- m_c->m_clipping_plane_distance = 0.f;
- update_clipping_plane(true);
- // Release clippers and the AABB raycaster.
- m_its = nullptr;
- m_c->m_object_clipper.reset();
- m_c->m_supports_clipper.reset();
- //m_c->m_mesh_raycaster.reset();
+ m_old_mo_id = -1;
}
}
m_old_state = m_state;
@@ -1095,10 +963,7 @@ void GLGizmoSlaSupports::on_stop_dragging()
void GLGizmoSlaSupports::on_load(cereal::BinaryInputArchive& ar)
{
- ar(m_c->m_clipping_plane_distance,
- *m_c->m_clipping_plane,
- m_c->m_model_object_id,
- m_new_point_head_diameter,
+ ar(m_new_point_head_diameter,
m_normal_cache,
m_editing_cache,
m_selection_empty
@@ -1109,10 +974,7 @@ void GLGizmoSlaSupports::on_load(cereal::BinaryInputArchive& ar)
void GLGizmoSlaSupports::on_save(cereal::BinaryOutputArchive& ar) const
{
- ar(m_c->m_clipping_plane_distance,
- *m_c->m_clipping_plane,
- m_c->m_model_object_id,
- m_new_point_head_diameter,
+ ar(m_new_point_head_diameter,
m_normal_cache,
m_editing_cache,
m_selection_empty
@@ -1189,9 +1051,10 @@ void GLGizmoSlaSupports::editing_mode_apply_changes()
for (const CacheEntry& ce : m_editing_cache)
m_normal_cache.push_back(ce.support_point);
- m_c->m_model_object->sla_points_status = sla::PointsStatus::UserModified;
- m_c->m_model_object->sla_support_points.clear();
- m_c->m_model_object->sla_support_points = m_normal_cache;
+ ModelObject* mo = m_c->selection_info()->model_object();
+ mo->sla_points_status = sla::PointsStatus::UserModified;
+ mo->sla_support_points.clear();
+ mo->sla_support_points = m_normal_cache;
reslice_SLA_supports();
}
@@ -1201,23 +1064,25 @@ void GLGizmoSlaSupports::editing_mode_apply_changes()
void GLGizmoSlaSupports::reload_cache()
{
+ const ModelObject* mo = m_c->selection_info()->model_object();
m_normal_cache.clear();
- if (m_c->m_model_object->sla_points_status == sla::PointsStatus::AutoGenerated || m_c->m_model_object->sla_points_status == sla::PointsStatus::Generating)
+ if (mo->sla_points_status == sla::PointsStatus::AutoGenerated || mo->sla_points_status == sla::PointsStatus::Generating)
get_data_from_backend();
else
- for (const sla::SupportPoint& point : m_c->m_model_object->sla_support_points)
+ for (const sla::SupportPoint& point : mo->sla_support_points)
m_normal_cache.emplace_back(point);
}
bool GLGizmoSlaSupports::has_backend_supports() const
{
- if (! m_c->m_model_object)
+ const ModelObject* mo = m_c->selection_info()->model_object();
+ if (! mo)
return false;
// find SlaPrintObject with this ID
for (const SLAPrintObject* po : m_parent.sla_print()->objects()) {
- if (po->model_object()->id() == m_c->m_model_object->id())
+ if (po->model_object()->id() == mo->id())
return po->is_step_done(slaposSupportPoints);
}
return false;
@@ -1225,24 +1090,28 @@ bool GLGizmoSlaSupports::has_backend_supports() const
void GLGizmoSlaSupports::reslice_SLA_supports(bool postpone_error_messages) const
{
- wxGetApp().CallAfter([this, postpone_error_messages]() { wxGetApp().plater()->reslice_SLA_supports(*m_c->m_model_object, postpone_error_messages); });
+ wxGetApp().CallAfter([this, postpone_error_messages]() {
+ wxGetApp().plater()->reslice_SLA_supports(
+ *m_c->selection_info()->model_object(), postpone_error_messages);
+ });
}
void GLGizmoSlaSupports::get_data_from_backend()
{
if (! has_backend_supports())
return;
+ ModelObject* mo = m_c->selection_info()->model_object();
// find the respective SLAPrintObject, we need a pointer to it
for (const SLAPrintObject* po : m_parent.sla_print()->objects()) {
- if (po->model_object()->id() == m_c->m_model_object->id()) {
+ if (po->model_object()->id() == mo->id()) {
m_normal_cache.clear();
const std::vector<sla::SupportPoint>& points = po->get_support_points();
auto mat = po->trafo().inverse().cast<float>();
for (unsigned int i=0; i<points.size();++i)
m_normal_cache.emplace_back(sla::SupportPoint(mat * points[i].pos, points[i].head_front_radius, points[i].is_new_island));
- m_c->m_model_object->sla_points_status = sla::PointsStatus::AutoGenerated;
+ mo->sla_points_status = sla::PointsStatus::AutoGenerated;
break;
}
}
@@ -1259,10 +1128,12 @@ void GLGizmoSlaSupports::auto_generate()
_(L("Are you sure you want to do it?")) + "\n",
_(L("Warning")), wxICON_WARNING | wxYES | wxNO);
- if (m_c->m_model_object->sla_points_status != sla::PointsStatus::UserModified || m_normal_cache.empty() || dlg.ShowModal() == wxID_YES) {
+ ModelObject* mo = m_c->selection_info()->model_object();
+
+ if (mo->sla_points_status != sla::PointsStatus::UserModified || m_normal_cache.empty() || dlg.ShowModal() == wxID_YES) {
Plater::TakeSnapshot snapshot(wxGetApp().plater(), _(L("Autogenerate support points")));
wxGetApp().CallAfter([this]() { reslice_SLA_supports(); });
- m_c->m_model_object->sla_points_status = sla::PointsStatus::Generating;
+ mo->sla_points_status = sla::PointsStatus::Generating;
}
}
@@ -1277,7 +1148,7 @@ void GLGizmoSlaSupports::switch_to_editing_mode()
m_editing_cache.emplace_back(sp);
select_point(NoPoints);
- m_parent.toggle_sla_auxiliaries_visibility(false, m_c->m_model_object, m_c->m_active_instance);
+ m_c->instances_hider()->show_supports(false);
m_parent.set_as_dirty();
}
@@ -1287,7 +1158,7 @@ void GLGizmoSlaSupports::disable_editing_mode()
if (m_editing_mode) {
m_editing_mode = false;
wxGetApp().plater()->leave_gizmos_stack();
- m_parent.toggle_sla_auxiliaries_visibility(true, m_c->m_model_object, m_c->m_active_instance);
+ m_c->instances_hider()->show_supports(true);
m_parent.set_as_dirty();
}
}
@@ -1306,20 +1177,6 @@ bool GLGizmoSlaSupports::unsaved_changes() const
return false;
}
-
-void GLGizmoSlaSupports::update_clipping_plane(bool keep_normal) const
-{
- if (! m_c->m_model_object)
- return;
- Vec3d normal = (keep_normal && m_c->m_clipping_plane->get_normal() != Vec3d::Zero() ?
- m_c->m_clipping_plane->get_normal() : -m_parent.get_camera().get_dir_forward());
-
- const Vec3d& center = m_c->m_model_object->instances[m_c->m_active_instance]->get_offset() + Vec3d(0., 0., m_z_shift);
- float dist = normal.dot(center);
- *m_c->m_clipping_plane = ClippingPlane(normal, (dist - (-m_c->m_active_instance_bb_radius) - m_c->m_clipping_plane_distance * 2*m_c->m_active_instance_bb_radius));
- m_parent.set_as_dirty();
-}
-
SlaGizmoHelpDialog::SlaGizmoHelpDialog()
: wxDialog(nullptr, wxID_ANY, _(L("SLA gizmo keyboard shortcuts")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER)
{
diff --git a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp
index deddabe5f..f9cf2f935 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp
@@ -4,43 +4,30 @@
#include "GLGizmoBase.hpp"
#include "slic3r/GUI/GLSelectionRectangle.hpp"
-#include "libslic3r/SLA/Common.hpp"
+#include "libslic3r/SLA/SupportPoint.hpp"
+#include "libslic3r/ObjectID.hpp"
#include <wx/dialog.h>
#include <cereal/types/vector.hpp>
namespace Slic3r {
+
+class ConfigOption;
+
namespace GUI {
-class ClippingPlane;
-class MeshClipper;
-class MeshRaycaster;
-class CommonGizmosData;
enum class SLAGizmoEventType : unsigned char;
class GLGizmoSlaSupports : public GLGizmoBase
{
private:
- //ModelObject* m_model_object = nullptr;
- //ObjectID m_model_object_id = 0;
- //int m_active_instance = -1;
- //float m_active_instance_bb_radius; // to cache the bb
- mutable double m_z_shift = 0.f;
+
bool unproject_on_mesh(const Vec2d& mouse_pos, std::pair<Vec3f, Vec3f>& pos_and_normal);
const float RenderPointScale = 1.f;
GLUquadricObj* m_quadric;
- typedef Eigen::Map<const Eigen::Matrix<float, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor | Eigen::DontAlign>> MapMatrixXfUnaligned;
- typedef Eigen::Map<const Eigen::Matrix<int, Eigen::Dynamic, Eigen::Dynamic, Eigen::RowMajor | Eigen::DontAlign>> MapMatrixXiUnaligned;
-
- //std::unique_ptr<MeshRaycaster> m_mesh_raycaster;
- //const TriangleMesh* m_mesh;
- const indexed_triangle_set* m_its;
- //mutable int m_old_timestamp = -1;
- //mutable int m_print_object_idx = -1;
- //mutable int m_print_objects_count = -1;
class CacheEntry {
public:
@@ -75,14 +62,12 @@ public:
void set_sla_support_data(ModelObject* model_object, const Selection& selection);
bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position, bool shift_down, bool alt_down, bool control_down);
void delete_selected_points(bool force = false);
- ClippingPlane get_sla_clipping_plane() const;
+ //ClippingPlane get_sla_clipping_plane() const;
bool is_in_editing_mode() const { return m_editing_mode; }
bool is_selection_rectangle_dragging() const { return m_selection_rectangle.is_dragging(); }
bool has_backend_supports() const;
void reslice_SLA_supports(bool postpone_error_messages = false) const;
- void update_clipping_plane(bool keep_normal = false) const;
- void set_common_data_ptr(CommonGizmosData* ptr) { m_c = ptr; }
private:
bool on_init() override;
@@ -90,10 +75,7 @@ private:
void on_render() const override;
void on_render_for_picking() const override;
- //void render_selection_rectangle() const;
void render_points(const Selection& selection, bool picking = false) const;
- void render_clipping_plane(const Selection& selection) const;
- void render_hollowed_mesh() const;
bool unsaved_changes() const;
bool m_lock_unique_islands = false;
@@ -105,8 +87,7 @@ private:
float m_density_stash = 0.f; // and again
mutable std::vector<CacheEntry> m_editing_cache; // a support point and whether it is currently selected
std::vector<sla::SupportPoint> m_normal_cache; // to restore after discarding changes or undo/redo
-
- //std::unique_ptr<ClippingPlane> m_clipping_plane;
+ ObjectID m_old_mo_id;
// This map holds all translated description texts, so they can be easily referenced during layout calculations
// etc. When language changes, GUI is recreated and this class constructed again, so the change takes effect.
@@ -118,11 +99,6 @@ private:
bool m_selection_empty = true;
EState m_old_state = Off; // to be able to see that the gizmo has just been closed (see on_set_state)
- CommonGizmosData* m_c = nullptr;
-
- //mutable std::unique_ptr<MeshClipper> m_object_clipper;
- //mutable std::unique_ptr<MeshClipper> m_supports_clipper;
-
std::vector<const ConfigOption*> get_config_options(const std::vector<std::string>& keys) const;
bool is_mesh_point_clipped(const Vec3d& point) const;
bool is_point_in_hole(const Vec3f& pt) const;
@@ -143,7 +119,6 @@ private:
void auto_generate();
void switch_to_editing_mode();
void disable_editing_mode();
- void reset_clipping_plane_normal() const;
protected:
void on_set_state() override;
@@ -160,6 +135,7 @@ protected:
std::string on_get_name() const override;
bool on_is_activable() const override;
bool on_is_selectable() const override;
+ virtual CommonGizmosDataID on_get_requirements() const override;
void on_load(cereal::BinaryInputArchive& ar) override;
void on_save(cereal::BinaryOutputArchive& ar) const override;
};
diff --git a/src/slic3r/GUI/Gizmos/GLGizmos.hpp b/src/slic3r/GUI/Gizmos/GLGizmos.hpp
index 9f97c42b4..e8e73959c 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmos.hpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmos.hpp
@@ -31,6 +31,7 @@ enum class SLAGizmoEventType : unsigned char {
#include "slic3r/GUI/Gizmos/GLGizmoRotate.hpp"
#include "slic3r/GUI/Gizmos/GLGizmoFlatten.hpp"
#include "slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp"
+#include "slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp"
#include "slic3r/GUI/Gizmos/GLGizmoCut.hpp"
#include "slic3r/GUI/Gizmos/GLGizmoHollow.hpp"
diff --git a/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp b/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp
new file mode 100644
index 000000000..a34c7562e
--- /dev/null
+++ b/src/slic3r/GUI/Gizmos/GLGizmosCommon.cpp
@@ -0,0 +1,465 @@
+#include "GLGizmosCommon.hpp"
+
+#include <cassert>
+
+#include "slic3r/GUI/GLCanvas3D.hpp"
+#include "libslic3r/SLAPrint.hpp"
+#include "slic3r/GUI/GUI_App.hpp"
+#include "slic3r/GUI/Camera.hpp"
+#include "slic3r/GUI/Plater.hpp"
+
+#include "libslic3r/PresetBundle.hpp"
+
+#include <GL/glew.h>
+
+namespace Slic3r {
+namespace GUI {
+
+using namespace CommonGizmosDataObjects;
+
+CommonGizmosDataPool::CommonGizmosDataPool(GLCanvas3D* canvas)
+ : m_canvas(canvas)
+{
+ using c = CommonGizmosDataID;
+ m_data[c::SelectionInfo].reset( new SelectionInfo(this));
+ m_data[c::InstancesHider].reset( new InstancesHider(this));
+ m_data[c::HollowedMesh].reset( new HollowedMesh(this));
+ m_data[c::Raycaster].reset( new Raycaster(this));
+ m_data[c::ObjectClipper].reset( new ObjectClipper(this));
+ m_data[c::SupportsClipper].reset( new SupportsClipper(this));
+
+}
+
+void CommonGizmosDataPool::update(CommonGizmosDataID required)
+{
+ assert(check_dependencies(required));
+ for (auto& [id, data] : m_data) {
+ if (int(required) & int(CommonGizmosDataID(id)))
+ data->update();
+ else
+ if (data->is_valid())
+ data->release();
+
+ }
+}
+
+
+SelectionInfo* CommonGizmosDataPool::selection_info() const
+{
+ SelectionInfo* sel_info = dynamic_cast<SelectionInfo*>(m_data.at(CommonGizmosDataID::SelectionInfo).get());
+ assert(sel_info);
+ return sel_info->is_valid() ? sel_info : nullptr;
+}
+
+
+InstancesHider* CommonGizmosDataPool::instances_hider() const
+{
+ InstancesHider* inst_hider = dynamic_cast<InstancesHider*>(m_data.at(CommonGizmosDataID::InstancesHider).get());
+ assert(inst_hider);
+ return inst_hider->is_valid() ? inst_hider : nullptr;
+}
+
+HollowedMesh* CommonGizmosDataPool::hollowed_mesh() const
+{
+ HollowedMesh* hol_mesh = dynamic_cast<HollowedMesh*>(m_data.at(CommonGizmosDataID::HollowedMesh).get());
+ assert(hol_mesh);
+ return hol_mesh->is_valid() ? hol_mesh : nullptr;
+}
+
+Raycaster* CommonGizmosDataPool::raycaster() const
+{
+ Raycaster* rc = dynamic_cast<Raycaster*>(m_data.at(CommonGizmosDataID::Raycaster).get());
+ assert(rc);
+ return rc->is_valid() ? rc : nullptr;
+}
+
+ObjectClipper* CommonGizmosDataPool::object_clipper() const
+{
+ ObjectClipper* oc = dynamic_cast<ObjectClipper*>(m_data.at(CommonGizmosDataID::ObjectClipper).get());
+ // ObjectClipper is used from outside the gizmos to report current clipping plane.
+ // This function can be called when oc is nullptr.
+ return (oc && oc->is_valid()) ? oc : nullptr;
+}
+
+SupportsClipper* CommonGizmosDataPool::supports_clipper() const
+{
+ SupportsClipper* sc = dynamic_cast<SupportsClipper*>(m_data.at(CommonGizmosDataID::SupportsClipper).get());
+ assert(sc);
+ return sc->is_valid() ? sc : nullptr;
+}
+
+#ifndef NDEBUG
+// Check the required resources one by one and return true if all
+// dependencies are met.
+bool CommonGizmosDataPool::check_dependencies(CommonGizmosDataID required) const
+{
+ // This should iterate over currently required data. Each of them should
+ // be asked about its dependencies and it must check that all dependencies
+ // are also in required and before the current one.
+ for (auto& [id, data] : m_data) {
+ // in case we don't use this, the deps are irrelevant
+ if (! (int(required) & int(CommonGizmosDataID(id))))
+ continue;
+
+
+ CommonGizmosDataID deps = data->get_dependencies();
+ assert(int(deps) == (int(deps) & int(required)));
+ }
+
+
+ return true;
+}
+#endif // NDEBUG
+
+
+
+
+void SelectionInfo::on_update()
+{
+ const Selection& selection = get_pool()->get_canvas()->get_selection();
+ if (selection.is_single_full_instance()) {
+ m_model_object = selection.get_model()->objects[selection.get_object_idx()];
+ m_z_shift = selection.get_volume(*selection.get_volume_idxs().begin())->get_sla_shift_z();
+ }
+ else
+ m_model_object = nullptr;
+}
+
+void SelectionInfo::on_release()
+{
+ m_model_object = nullptr;
+}
+
+int SelectionInfo::get_active_instance() const
+{
+ const Selection& selection = get_pool()->get_canvas()->get_selection();
+ return selection.get_instance_idx();
+}
+
+
+
+
+
+void InstancesHider::on_update()
+{
+ const ModelObject* mo = get_pool()->selection_info()->model_object();
+ int active_inst = get_pool()->selection_info()->get_active_instance();
+ GLCanvas3D* canvas = get_pool()->get_canvas();
+
+ if (mo && active_inst != -1) {
+ canvas->toggle_model_objects_visibility(false);
+ canvas->toggle_model_objects_visibility(true, mo, active_inst);
+ canvas->toggle_sla_auxiliaries_visibility(m_show_supports, mo, active_inst);
+ }
+ else
+ canvas->toggle_model_objects_visibility(true);
+}
+
+void InstancesHider::on_release()
+{
+ get_pool()->get_canvas()->toggle_model_objects_visibility(true);
+}
+
+void InstancesHider::show_supports(bool show) {
+ if (m_show_supports != show) {
+ m_show_supports = show;
+ on_update();
+ }
+}
+
+
+
+void HollowedMesh::on_update()
+{
+ const ModelObject* mo = get_pool()->selection_info()->model_object();
+ bool is_sla = wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology() == ptSLA;
+ if (! mo || ! is_sla)
+ return;
+
+ const GLCanvas3D* canvas = get_pool()->get_canvas();
+ const PrintObjects& print_objects = canvas->sla_print()->objects();
+ const SLAPrintObject* print_object = m_print_object_idx != -1
+ ? print_objects[m_print_object_idx]
+ : nullptr;
+
+ // Find the respective SLAPrintObject.
+ if (m_print_object_idx < 0 || m_print_objects_count != int(print_objects.size())) {
+ m_print_objects_count = print_objects.size();
+ m_print_object_idx = -1;
+ for (const SLAPrintObject* po : print_objects) {
+ ++m_print_object_idx;
+ if (po->model_object()->id() == mo->id()) {
+ print_object = po;
+ break;
+ }
+ }
+ }
+
+ // If there is a valid SLAPrintObject, check state of Hollowing step.
+ if (print_object) {
+ if (print_object->is_step_done(slaposDrillHoles) && print_object->has_mesh(slaposDrillHoles)) {
+ size_t timestamp = print_object->step_state_with_timestamp(slaposDrillHoles).timestamp;
+ if (timestamp > m_old_hollowing_timestamp) {
+ const TriangleMesh& backend_mesh = print_object->get_mesh_to_print();
+ if (! backend_mesh.empty()) {
+ m_hollowed_mesh_transformed.reset(new TriangleMesh(backend_mesh));
+ Transform3d trafo_inv = canvas->sla_print()->sla_trafo(*mo).inverse();
+ m_hollowed_mesh_transformed->transform(trafo_inv);
+ m_old_hollowing_timestamp = timestamp;
+ }
+ else
+ m_hollowed_mesh_transformed.reset(nullptr);
+ }
+ }
+ else
+ m_hollowed_mesh_transformed.reset(nullptr);
+ }
+}
+
+
+void HollowedMesh::on_release()
+{
+ m_hollowed_mesh_transformed.reset();
+ m_old_hollowing_timestamp = 0;
+ m_print_object_idx = -1;
+}
+
+
+const TriangleMesh* HollowedMesh::get_hollowed_mesh() const
+{
+ return m_hollowed_mesh_transformed.get();
+}
+
+
+
+
+
+void Raycaster::on_update()
+{
+ wxBusyCursor wait;
+ const ModelObject* mo = get_pool()->selection_info()->model_object();
+
+ if (! mo)
+ return;
+
+ std::vector<const TriangleMesh*> meshes;
+ const std::vector<ModelVolume*>& mvs = mo->volumes;
+ if (mvs.size() == 1) {
+ assert(mvs.front()->is_model_part());
+ const HollowedMesh* hollowed_mesh_tracker = get_pool()->hollowed_mesh();
+ if (hollowed_mesh_tracker && hollowed_mesh_tracker->get_hollowed_mesh())
+ meshes.push_back(hollowed_mesh_tracker->get_hollowed_mesh());
+ }
+ if (meshes.empty()) {
+ for (const ModelVolume* mv : mvs) {
+ if (mv->is_model_part())
+ meshes.push_back(&mv->mesh());
+ }
+ }
+
+ if (meshes != m_old_meshes) {
+ m_raycasters.clear();
+ for (const TriangleMesh* mesh : meshes)
+ m_raycasters.emplace_back(new MeshRaycaster(*mesh));
+ m_old_meshes = meshes;
+ }
+}
+
+void Raycaster::on_release()
+{
+ m_raycasters.clear();
+ m_old_meshes.clear();
+}
+
+std::vector<const MeshRaycaster*> Raycaster::raycasters() const
+{
+ std::vector<const MeshRaycaster*> mrcs;
+ for (const auto& raycaster_unique_ptr : m_raycasters)
+ mrcs.push_back(raycaster_unique_ptr.get());
+ return mrcs;
+}
+
+
+
+
+
+void ObjectClipper::on_update()
+{
+ const ModelObject* mo = get_pool()->selection_info()->model_object();
+ if (! mo)
+ return;
+
+ // which mesh should be cut?
+ std::vector<const TriangleMesh*> meshes;
+ bool has_hollowed = get_pool()->hollowed_mesh() && get_pool()->hollowed_mesh()->get_hollowed_mesh();
+ if (has_hollowed)
+ meshes.push_back(get_pool()->hollowed_mesh()->get_hollowed_mesh());
+
+ if (meshes.empty())
+ for (const ModelVolume* mv : mo->volumes)
+ meshes.push_back(&mv->mesh());
+
+ if (meshes != m_old_meshes) {
+ m_clippers.clear();
+ for (const TriangleMesh* mesh : meshes) {
+ m_clippers.emplace_back(new MeshClipper);
+ m_clippers.back()->set_mesh(*mesh);
+ }
+ m_old_meshes = meshes;
+ m_active_inst_bb_radius =
+ mo->instance_bounding_box(get_pool()->selection_info()->get_active_instance()).radius();
+ //if (has_hollowed && m_clp_ratio != 0.)
+ // m_clp_ratio = 0.25;
+ }
+}
+
+
+void ObjectClipper::on_release()
+{
+ m_clippers.clear();
+ m_old_meshes.clear();
+ m_clp.reset();
+ m_clp_ratio = 0.;
+
+}
+
+void ObjectClipper::render_cut() const
+{
+ if (m_clp_ratio == 0.)
+ return;
+ const SelectionInfo* sel_info = get_pool()->selection_info();
+ const ModelObject* mo = sel_info->model_object();
+ Geometry::Transformation inst_trafo = mo->instances[sel_info->get_active_instance()]->get_transformation();
+
+ size_t clipper_id = 0;
+ for (const ModelVolume* mv : mo->volumes) {
+ Geometry::Transformation vol_trafo = mv->get_transformation();
+ Geometry::Transformation trafo = inst_trafo * vol_trafo;
+ trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., sel_info->get_sla_shift()));
+
+ auto& clipper = m_clippers[clipper_id];
+ clipper->set_plane(*m_clp);
+ clipper->set_transformation(trafo);
+
+ ::glPushMatrix();
+ ::glColor3f(1.0f, 0.37f, 0.0f);
+ clipper->render_cut();
+ ::glPopMatrix();
+
+ ++clipper_id;
+ }
+}
+
+
+void ObjectClipper::set_position(double pos, bool keep_normal)
+{
+ const ModelObject* mo = get_pool()->selection_info()->model_object();
+ int active_inst = get_pool()->selection_info()->get_active_instance();
+ double z_shift = get_pool()->selection_info()->get_sla_shift();
+
+ Vec3d normal = (keep_normal && m_clp) ? m_clp->get_normal() : -wxGetApp().plater()->get_camera().get_dir_forward();
+ const Vec3d& center = mo->instances[active_inst]->get_offset() + Vec3d(0., 0., z_shift);
+ float dist = normal.dot(center);
+
+ if (pos < 0.)
+ pos = m_clp_ratio;
+
+ m_clp_ratio = pos;
+ m_clp.reset(new ClippingPlane(normal, (dist - (-m_active_inst_bb_radius) - m_clp_ratio * 2*m_active_inst_bb_radius)));
+ get_pool()->get_canvas()->set_as_dirty();
+}
+
+
+
+void SupportsClipper::on_update()
+{
+ const ModelObject* mo = get_pool()->selection_info()->model_object();
+ bool is_sla = wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology() == ptSLA;
+ if (! mo || ! is_sla)
+ return;
+
+ const GLCanvas3D* canvas = get_pool()->get_canvas();
+ const PrintObjects& print_objects = canvas->sla_print()->objects();
+ const SLAPrintObject* print_object = m_print_object_idx != -1
+ ? print_objects[m_print_object_idx]
+ : nullptr;
+
+ // Find the respective SLAPrintObject.
+ if (m_print_object_idx < 0 || m_print_objects_count != int(print_objects.size())) {
+ m_print_objects_count = print_objects.size();
+ m_print_object_idx = -1;
+ for (const SLAPrintObject* po : print_objects) {
+ ++m_print_object_idx;
+ if (po->model_object()->id() == mo->id()) {
+ print_object = po;
+ break;
+ }
+ }
+ }
+
+ if (print_object
+ && print_object->is_step_done(slaposSupportTree)
+ && ! print_object->support_mesh().empty())
+ {
+ // If the supports are already calculated, save the timestamp of the respective step
+ // so we can later tell they were recalculated.
+ size_t timestamp = print_object->step_state_with_timestamp(slaposSupportTree).timestamp;
+ if (! m_clipper || timestamp != m_old_timestamp) {
+ // The timestamp has changed.
+ m_clipper.reset(new MeshClipper);
+ // The mesh should already have the shared vertices calculated.
+ m_clipper->set_mesh(print_object->support_mesh());
+ m_old_timestamp = timestamp;
+ }
+ }
+ else
+ // The supports are not valid. We better dump the cached data.
+ m_clipper.reset();
+}
+
+
+void SupportsClipper::on_release()
+{
+ m_clipper.reset();
+ m_old_timestamp = 0;
+ m_print_object_idx = -1;
+}
+
+void SupportsClipper::render_cut() const
+{
+ const CommonGizmosDataObjects::ObjectClipper* ocl = get_pool()->object_clipper();
+ if (ocl->get_position() == 0.
+ || ! get_pool()->instances_hider()->are_supports_shown()
+ || ! m_clipper)
+ return;
+
+ const SelectionInfo* sel_info = get_pool()->selection_info();
+ const ModelObject* mo = sel_info->model_object();
+ Geometry::Transformation inst_trafo = mo->instances[sel_info->get_active_instance()]->get_transformation();
+ //Geometry::Transformation vol_trafo = mo->volumes.front()->get_transformation();
+ Geometry::Transformation trafo = inst_trafo;// * vol_trafo;
+ trafo.set_offset(trafo.get_offset() + Vec3d(0., 0., sel_info->get_sla_shift()));
+
+
+ // Get transformation of supports
+ Geometry::Transformation supports_trafo = trafo;
+ supports_trafo.set_scaling_factor(Vec3d::Ones());
+ supports_trafo.set_offset(Vec3d(trafo.get_offset()(0), trafo.get_offset()(1), sel_info->get_sla_shift()));
+ supports_trafo.set_rotation(Vec3d(0., 0., trafo.get_rotation()(2)));
+ // I don't know why, but following seems to be correct.
+ supports_trafo.set_mirror(Vec3d(trafo.get_mirror()(0) * trafo.get_mirror()(1) * trafo.get_mirror()(2),
+ 1,
+ 1.));
+
+ m_clipper->set_plane(*ocl->get_clipping_plane());
+ m_clipper->set_transformation(supports_trafo);
+
+ ::glPushMatrix();
+ ::glColor3f(1.0f, 0.f, 0.37f);
+ m_clipper->render_cut();
+ ::glPopMatrix();
+}
+
+
+} // namespace GUI
+} // namespace Slic3r
diff --git a/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp b/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp
new file mode 100644
index 000000000..aedf782e8
--- /dev/null
+++ b/src/slic3r/GUI/Gizmos/GLGizmosCommon.hpp
@@ -0,0 +1,307 @@
+#ifndef slic3r_GUI_GLGizmosCommon_hpp_
+#define slic3r_GUI_GLGizmosCommon_hpp_
+
+#include <memory>
+#include <map>
+
+#include "slic3r/GUI/MeshUtils.hpp"
+
+namespace Slic3r {
+
+class ModelObject;
+
+
+namespace GUI {
+
+class GLCanvas3D;
+
+enum class SLAGizmoEventType : unsigned char {
+ LeftDown = 1,
+ LeftUp,
+ RightDown,
+ RightUp,
+ Dragging,
+ Delete,
+ SelectAll,
+ ShiftUp,
+ AltUp,
+ ApplyChanges,
+ DiscardChanges,
+ AutomaticGeneration,
+ ManualEditing,
+ MouseWheelUp,
+ MouseWheelDown,
+ ResetClippingPlane
+};
+
+
+
+class CommonGizmosDataBase;
+namespace CommonGizmosDataObjects {
+ class SelectionInfo;
+ class InstancesHider;
+ class HollowedMesh;
+ class Raycaster;
+ class ObjectClipper;
+ class SupportsClipper;
+}
+
+// Some of the gizmos use the same data that need to be updated ocassionally.
+// It is also desirable that the data are not recalculated when the gizmos
+// are just switched, but on the other hand, they should be released when
+// they are not in use by any gizmo anymore.
+
+// Enumeration of various data types that the data pool can contain.
+// Each gizmo can tell which of the data it wants to use through
+// on_get_requirements() method.
+enum class CommonGizmosDataID {
+ None = 0,
+ SelectionInfo = 1 << 0,
+ InstancesHider = 1 << 1,
+ HollowedMesh = 1 << 2,
+ Raycaster = 1 << 3,
+ ObjectClipper = 1 << 4,
+ SupportsClipper = 1 << 5,
+
+};
+
+
+// Following class holds pointers to the common data objects and triggers
+// their updating/releasing. There is just one object of this type (managed
+// by GLGizmoManager, the gizmos keep a pointer to it.
+class CommonGizmosDataPool {
+public:
+ CommonGizmosDataPool(GLCanvas3D* canvas);
+
+ // Update all resources and release what is not used.
+ // Accepts a bitmask of currently required resources.
+ void update(CommonGizmosDataID required);
+
+ // Getters for the data that need to be accessed from the gizmos directly.
+ CommonGizmosDataObjects::SelectionInfo* selection_info() const;
+ CommonGizmosDataObjects::InstancesHider* instances_hider() const;
+ CommonGizmosDataObjects::HollowedMesh* hollowed_mesh() const;
+ CommonGizmosDataObjects::Raycaster* raycaster() const;
+ CommonGizmosDataObjects::ObjectClipper* object_clipper() const;
+ CommonGizmosDataObjects::SupportsClipper* supports_clipper() const;
+
+
+ GLCanvas3D* get_canvas() const { return m_canvas; }
+
+private:
+ std::map<CommonGizmosDataID, std::unique_ptr<CommonGizmosDataBase>> m_data;
+ GLCanvas3D* m_canvas;
+
+#ifndef NDEBUG
+ bool check_dependencies(CommonGizmosDataID required) const;
+#endif
+};
+
+
+
+
+
+// Base class for a wrapper object managing a single resource.
+// Each of the enum values above (safe None) will have an object of this kind.
+class CommonGizmosDataBase {
+public:
+ // Pass a backpointer to the pool, so the individual
+ // objects can communicate with one another.
+ explicit CommonGizmosDataBase(CommonGizmosDataPool* cgdp)
+ : m_common{cgdp} {}
+ virtual ~CommonGizmosDataBase() {}
+
+ // Update the resource.
+ void update() { on_update(); m_is_valid = true; }
+
+ // Release any data that are stored internally.
+ void release() { on_release(); m_is_valid = false; }
+
+ // Returns whether the resource is currently maintained.
+ bool is_valid() const { return m_is_valid; }
+
+#ifndef NDEBUG
+ // Return a bitmask of all resources that this one relies on.
+ // The dependent resource must have higher ID than the one
+ // it depends on.
+ virtual CommonGizmosDataID get_dependencies() const { return CommonGizmosDataID::None; }
+#endif // NDEBUG
+
+protected:
+ virtual void on_release() = 0;
+ virtual void on_update() = 0;
+ CommonGizmosDataPool* get_pool() const { return m_common; }
+
+
+private:
+ bool m_is_valid = false;
+ CommonGizmosDataPool* m_common = nullptr;
+};
+
+
+
+// The specializations of the CommonGizmosDataBase class live in this
+// namespace to avoid clashes in GUI namespace.
+namespace CommonGizmosDataObjects
+{
+
+class SelectionInfo : public CommonGizmosDataBase
+{
+public:
+ explicit SelectionInfo(CommonGizmosDataPool* cgdp)
+ : CommonGizmosDataBase(cgdp) {}
+
+ ModelObject* model_object() const { return m_model_object; }
+ int get_active_instance() const;
+ float get_sla_shift() const { return m_z_shift; }
+
+protected:
+ void on_update() override;
+ void on_release() override;
+
+private:
+ ModelObject* m_model_object = nullptr;
+ int m_active_inst = -1;
+ float m_z_shift = 0.f;
+};
+
+
+
+class InstancesHider : public CommonGizmosDataBase
+{
+public:
+ explicit InstancesHider(CommonGizmosDataPool* cgdp)
+ : CommonGizmosDataBase(cgdp) {}
+#ifndef NDEBUG
+ CommonGizmosDataID get_dependencies() const override { return CommonGizmosDataID::SelectionInfo; }
+#endif // NDEBUG
+
+ void show_supports(bool show);
+ bool are_supports_shown() const { return m_show_supports; }
+
+protected:
+ void on_update() override;
+ void on_release() override;
+
+private:
+ bool m_show_supports = false;
+};
+
+
+
+class HollowedMesh : public CommonGizmosDataBase
+{
+public:
+ explicit HollowedMesh(CommonGizmosDataPool* cgdp)
+ : CommonGizmosDataBase(cgdp) {}
+#ifndef NDEBUG
+ CommonGizmosDataID get_dependencies() const override { return CommonGizmosDataID::SelectionInfo; }
+#endif // NDEBUG
+
+ const TriangleMesh* get_hollowed_mesh() const;
+
+protected:
+ void on_update() override;
+ void on_release() override;
+
+private:
+ std::unique_ptr<TriangleMesh> m_hollowed_mesh_transformed;
+ size_t m_old_hollowing_timestamp = 0;
+ int m_print_object_idx = -1;
+ int m_print_objects_count = 0;
+};
+
+
+
+class Raycaster : public CommonGizmosDataBase
+{
+public:
+ explicit Raycaster(CommonGizmosDataPool* cgdp)
+ : CommonGizmosDataBase(cgdp) {}
+#ifndef NDEBUG
+ CommonGizmosDataID get_dependencies() const override { return CommonGizmosDataID::SelectionInfo; }
+#endif // NDEBUG
+
+ const MeshRaycaster* raycaster() const { assert(m_raycasters.size() == 1); return m_raycasters.front().get(); }
+ std::vector<const MeshRaycaster*> raycasters() const;
+
+protected:
+ void on_update() override;
+ void on_release() override;
+
+private:
+ std::vector<std::unique_ptr<MeshRaycaster>> m_raycasters;
+ std::vector<const TriangleMesh*> m_old_meshes;
+};
+
+
+
+class ObjectClipper : public CommonGizmosDataBase
+{
+public:
+ explicit ObjectClipper(CommonGizmosDataPool* cgdp)
+ : CommonGizmosDataBase(cgdp) {}
+#ifndef NDEBUG
+ CommonGizmosDataID get_dependencies() const override { return CommonGizmosDataID::SelectionInfo; }
+#endif // NDEBUG
+
+ void set_position(double pos, bool keep_normal);
+ double get_position() const { return m_clp_ratio; }
+ ClippingPlane* get_clipping_plane() const { return m_clp.get(); }
+ void render_cut() const;
+
+
+protected:
+ void on_update() override;
+ void on_release() override;
+
+private:
+ std::vector<const TriangleMesh*> m_old_meshes;
+ std::vector<std::unique_ptr<MeshClipper>> m_clippers;
+ std::unique_ptr<ClippingPlane> m_clp;
+ double m_clp_ratio = 0.;
+ double m_active_inst_bb_radius = 0.;
+};
+
+
+
+class SupportsClipper : public CommonGizmosDataBase
+{
+public:
+ explicit SupportsClipper(CommonGizmosDataPool* cgdp)
+ : CommonGizmosDataBase(cgdp) {}
+#ifndef NDEBUG
+ CommonGizmosDataID get_dependencies() const override {
+ return CommonGizmosDataID(
+ int(CommonGizmosDataID::SelectionInfo)
+ | int(CommonGizmosDataID::ObjectClipper)
+ );
+ }
+#endif // NDEBUG
+
+ void render_cut() const;
+
+
+protected:
+ void on_update() override;
+ void on_release() override;
+
+private:
+ size_t m_old_timestamp = 0;
+ int m_print_object_idx = -1;
+ int m_print_objects_count = 0;
+ std::unique_ptr<MeshClipper> m_clipper;
+};
+
+} // namespace CommonGizmosDataObjects
+
+
+
+
+
+
+} // namespace GUI
+} // namespace Slic3r
+
+
+#endif // slic3r_GUI_GLGizmosCommon_hpp_
diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp
index 3df079a4d..e3bb964ad 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.cpp
@@ -2,14 +2,25 @@
#include "GLGizmosManager.hpp"
#include "slic3r/GUI/GLCanvas3D.hpp"
#include "slic3r/GUI/3DScene.hpp"
+#include "slic3r/GUI/Camera.hpp"
#include "slic3r/GUI/GUI_App.hpp"
#include "slic3r/GUI/GUI_ObjectManipulation.hpp"
-#include "slic3r/GUI/PresetBundle.hpp"
+#include "slic3r/GUI/Plater.hpp"
#include "slic3r/Utils/UndoRedo.hpp"
-#include "libslic3r/SLAPrint.hpp"
-#include "slic3r/GUI/MeshUtils.hpp"
-#include <GL/glew.h>
+#include "slic3r/GUI/Gizmos/GLGizmoMove.hpp"
+#include "slic3r/GUI/Gizmos/GLGizmoScale.hpp"
+#include "slic3r/GUI/Gizmos/GLGizmoRotate.hpp"
+#include "slic3r/GUI/Gizmos/GLGizmoFlatten.hpp"
+#include "slic3r/GUI/Gizmos/GLGizmoSlaSupports.hpp"
+#include "slic3r/GUI/Gizmos/GLGizmoFdmSupports.hpp"
+#include "slic3r/GUI/Gizmos/GLGizmoCut.hpp"
+#include "slic3r/GUI/Gizmos/GLGizmoHollow.hpp"
+#include "slic3r/GUI/Gizmos/GLGizmoSeam.hpp"
+
+#include "libslic3r/Model.hpp"
+#include "libslic3r/PresetBundle.hpp"
+
#include <wx/glcanvas.h>
namespace Slic3r {
@@ -93,16 +104,17 @@ 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, "fdm_supports.svg", 7));
+ m_gizmos.emplace_back(new GLGizmoSeam(m_parent, "seam.svg", 8));
- m_common_gizmos_data.reset(new CommonGizmosData());
- dynamic_cast<GLGizmoHollow*>(m_gizmos[Hollow].get())->set_common_data_ptr(m_common_gizmos_data.get());
- dynamic_cast<GLGizmoSlaSupports*>(m_gizmos[SlaSupports].get())->set_common_data_ptr(m_common_gizmos_data.get());
+ m_common_gizmos_data.reset(new CommonGizmosDataPool(&m_parent));
for (auto& gizmo : m_gizmos) {
if (! gizmo->init()) {
m_gizmos.clear();
return false;
}
+ gizmo->set_common_data_pool(m_common_gizmos_data.get());
}
m_current = Undefined;
@@ -134,8 +146,11 @@ void GLGizmosManager::refresh_on_off_state()
if (m_serializing || m_current == Undefined || m_gizmos.empty())
return;
- if (m_current != Undefined && ! m_gizmos[m_current]->is_activable())
+ if (m_current != Undefined
+ && (! m_gizmos[m_current]->is_activable() || ! m_gizmos[m_current]->is_selectable())) {
activate_gizmo(Undefined);
+ update_data();
+ }
}
void GLGizmosManager::reset_all_states()
@@ -194,6 +209,11 @@ void GLGizmosManager::update_data()
enable_grabber(Scale, i, enable_scale_xyz);
}
+ if (m_common_gizmos_data)
+ m_common_gizmos_data->update(get_current()
+ ? get_current()->get_requirements()
+ : CommonGizmosDataID(0));
+
if (selection.is_single_full_instance())
{
// all volumes in the selection belongs to the same instance, any of them contains the needed data, so we take the first
@@ -203,6 +223,7 @@ void GLGizmosManager::update_data()
ModelObject* model_object = selection.get_model()->objects[selection.get_object_idx()];
set_flattening_data(model_object);
set_sla_support_data(model_object);
+ set_painter_gizmo_data();
}
else if (selection.is_single_volume() || selection.is_single_modifier())
{
@@ -211,6 +232,7 @@ void GLGizmosManager::update_data()
set_rotation(Vec3d::Zero());
set_flattening_data(nullptr);
set_sla_support_data(nullptr);
+ set_painter_gizmo_data();
}
else if (is_wipe_tower)
{
@@ -219,6 +241,7 @@ void GLGizmosManager::update_data()
set_rotation(Vec3d(0., 0., (M_PI/180.) * dynamic_cast<const ConfigOptionFloat*>(config.option("wipe_tower_rotation_angle"))->value));
set_flattening_data(nullptr);
set_sla_support_data(nullptr);
+ set_painter_gizmo_data();
}
else
{
@@ -226,6 +249,7 @@ void GLGizmosManager::update_data()
set_rotation(Vec3d::Zero());
set_flattening_data(selection.is_from_single_object() ? selection.get_model()->objects[selection.get_object_idx()] : nullptr);
set_sla_support_data(selection.is_from_single_instance() ? selection.get_model()->objects[selection.get_object_idx()] : nullptr);
+ set_painter_gizmo_data();
}
}
@@ -354,15 +378,19 @@ void GLGizmosManager::set_sla_support_data(ModelObject* model_object)
|| wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() != ptSLA)
return;
- m_common_gizmos_data->update_from_backend(m_parent, model_object);
-
- auto* gizmo_supports = dynamic_cast<GLGizmoSlaSupports*>(m_gizmos[SlaSupports].get());
auto* gizmo_hollow = dynamic_cast<GLGizmoHollow*>(m_gizmos[Hollow].get());
-
- // note: sla support gizmo takes care of updating the common data.
- // following lines are thus dependent
- gizmo_supports->set_sla_support_data(model_object, m_parent.get_selection());
+ auto* gizmo_supports = dynamic_cast<GLGizmoSlaSupports*>(m_gizmos[SlaSupports].get());
gizmo_hollow->set_sla_support_data(model_object, m_parent.get_selection());
+ gizmo_supports->set_sla_support_data(model_object, m_parent.get_selection());
+}
+
+void GLGizmosManager::set_painter_gizmo_data()
+{
+ if (!m_enabled || m_gizmos.empty())
+ return;
+
+ dynamic_cast<GLGizmoFdmSupports*>(m_gizmos[FdmSupports].get())->set_painter_gizmo_data(m_parent.get_selection());
+ dynamic_cast<GLGizmoSeam*>(m_gizmos[Seam].get())->set_painter_gizmo_data(m_parent.get_selection());
}
// Returns true if the gizmo used the event to do something, false otherwise.
@@ -373,20 +401,26 @@ bool GLGizmosManager::gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_p
if (m_current == SlaSupports)
return dynamic_cast<GLGizmoSlaSupports*>(m_gizmos[SlaSupports].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down);
- if (m_current == Hollow)
+ else if (m_current == Hollow)
return dynamic_cast<GLGizmoHollow*>(m_gizmos[Hollow].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down);
- return false;
+ else if (m_current == FdmSupports)
+ return dynamic_cast<GLGizmoFdmSupports*>(m_gizmos[FdmSupports].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down);
+ else if (m_current == Seam)
+ return dynamic_cast<GLGizmoSeam*>(m_gizmos[Seam].get())->gizmo_event(action, mouse_position, shift_down, alt_down, control_down);
+ else
+ return false;
}
-ClippingPlane GLGizmosManager::get_sla_clipping_plane() const
+ClippingPlane GLGizmosManager::get_clipping_plane() const
{
- if (!m_enabled || (m_current != SlaSupports && m_current != Hollow) || m_gizmos.empty())
+ if (! m_common_gizmos_data
+ || ! m_common_gizmos_data->object_clipper()
+ || m_common_gizmos_data->object_clipper()->get_position() == 0.)
return ClippingPlane::ClipsNothing();
-
- if (m_current == SlaSupports)
- return dynamic_cast<GLGizmoSlaSupports*>(m_gizmos[SlaSupports].get())->get_sla_clipping_plane();
- else
- return dynamic_cast<GLGizmoHollow*>(m_gizmos[Hollow].get())->get_sla_clipping_plane();
+ else {
+ const ClippingPlane& clp = *m_common_gizmos_data->object_clipper()->get_clipping_plane();
+ return ClippingPlane(-clp.get_normal(), clp.get_data()[3]);
+ }
}
bool GLGizmosManager::wants_reslice_supports_on_undo() const
@@ -403,9 +437,23 @@ void GLGizmosManager::render_current_gizmo() const
m_gizmos[m_current]->render();
}
+void GLGizmosManager::render_painter_gizmo() const
+{
+ // This function shall only be called when current gizmo is
+ // derived from GLGizmoPainterBase.
+
+ if (!m_enabled || m_current == Undefined)
+ return;
+
+ auto* gizmo = dynamic_cast<GLGizmoPainterBase*>(get_current());
+ assert(gizmo); // check the precondition
+ gizmo->render_painter_gizmo();
+}
+
void GLGizmosManager::render_current_gizmo_for_picking_pass() const
{
if (! m_enabled || m_current == Undefined)
+
return;
m_gizmos[m_current]->render_for_picking();
@@ -435,7 +483,7 @@ bool GLGizmosManager::on_mouse_wheel(wxMouseEvent& evt)
{
bool processed = false;
- if (m_current == SlaSupports || m_current == Hollow) {
+ if (m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports || m_current == Seam) {
float rot = (float)evt.GetWheelRotation() / (float)evt.GetWheelDelta();
if (gizmo_event((rot > 0.f ? SLAGizmoEventType::MouseWheelUp : SLAGizmoEventType::MouseWheelDown), Vec2d::Zero(), evt.ShiftDown(), evt.AltDown(), evt.ControlDown()))
processed = true;
@@ -456,35 +504,22 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt)
int selected_object_idx = selection.get_object_idx();
bool processed = false;
-#if !ENABLE_MODIFIED_GIZMOBAR_MOUSE_EVENT_HANDLING
- // mouse anywhere
- if (!evt.Dragging() && !evt.Leaving() && !evt.Entering() && (m_mouse_capture.parent != nullptr))
- {
- if (m_mouse_capture.any() && (evt.LeftUp() || evt.MiddleUp() || evt.RightUp()))
- // prevents loosing selection into the scene if mouse down was done inside the toolbar and mouse up was down outside it
- processed = true;
-
- m_mouse_capture.reset();
- }
-#endif // !ENABLE_MODIFIED_GIZMOBAR_MOUSE_EVENT_HANDLING
+ // when control is down we allow scene pan and rotation even when clicking over some object
+ bool control_down = evt.CmdDown();
// mouse anywhere
if (evt.Moving())
m_tooltip = update_hover_state(mouse_pos);
-#if ENABLE_MODIFIED_GIZMOBAR_MOUSE_EVENT_HANDLING
- else if (evt.LeftUp())
- {
- if (m_mouse_capture.left)
- {
+ else if (evt.LeftUp()) {
+ if (m_mouse_capture.left) {
processed = true;
m_mouse_capture.left = false;
}
- else if (is_dragging())
- {
+ else if (is_dragging()) {
switch (m_current) {
- case Move: m_parent.do_move(L("Gizmo-Move")); break;
- case Scale: m_parent.do_scale(L("Gizmo-Scale")); break;
- case Rotate: m_parent.do_rotate(L("Gizmo-Rotate")); break;
+ case Move: { m_parent.do_move(L("Gizmo-Move")); break; }
+ case Scale: { m_parent.do_scale(L("Gizmo-Scale")); break; }
+ case Rotate: { m_parent.do_rotate(L("Gizmo-Rotate")); break; }
default: break;
}
@@ -503,64 +538,34 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt)
// else
// return false;
}
- else if (evt.MiddleUp())
- {
- if (m_mouse_capture.middle)
- {
+ else if (evt.MiddleUp()) {
+ if (m_mouse_capture.middle) {
processed = true;
m_mouse_capture.middle = false;
}
else
return false;
}
- else if (evt.RightUp())
- {
- if (pending_right_up)
- {
+ else if (evt.RightUp()) {
+ if (pending_right_up) {
pending_right_up = false;
return true;
}
- if (m_mouse_capture.right)
- {
+ if (m_mouse_capture.right) {
processed = true;
m_mouse_capture.right = false;
}
- else
- return false;
+// else
+// return false;
}
-#if ENABLE_GIZMO_TOOLBAR_DRAGGING_FIX
- else if (evt.Dragging() && !is_dragging())
-#else
- else if (evt.Dragging()))
-#endif // ENABLE_GIZMO_TOOLBAR_DRAGGING_FIX
- {
+ else if (evt.Dragging() && !is_dragging()) {
if (m_mouse_capture.any())
// if the button down was done on this toolbar, prevent from dragging into the scene
processed = true;
// else
// return false;
}
-#else
- else if (evt.LeftUp())
- m_mouse_capture.left = false;
- else if (evt.MiddleUp())
- m_mouse_capture.middle = false;
- else if (evt.RightUp())
- {
- m_mouse_capture.right = false;
- if (pending_right_up)
- {
- pending_right_up = false;
- processed = true;
- }
- }
- else if (evt.Dragging() && m_mouse_capture.any())
- // if the button down was done on this toolbar, prevent from dragging into the scene
- processed = true;
-#endif // ENABLE_MODIFIED_GIZMOBAR_MOUSE_EVENT_HANDLING
-#if ENABLE_GIZMO_TOOLBAR_DRAGGING_FIX
- else if (evt.Dragging() && is_dragging())
- {
+ else if (evt.Dragging() && is_dragging()) {
if (!m_parent.get_wxglcanvas()->HasCapture())
m_parent.get_wxglcanvas()->CaptureMouse();
@@ -583,7 +588,7 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt)
if (evt.AltDown())
transformation_type.set_independent();
selection.scale(get_scale(), transformation_type);
- if (evt.ControlDown())
+ if (control_down)
selection.translate(get_scale_offset(), true);
wxGetApp().obj_manipul()->set_dirty();
break;
@@ -605,16 +610,14 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt)
m_parent.set_as_dirty();
processed = true;
}
-#endif // ENABLE_GIZMO_TOOLBAR_DRAGGING_FIX
- if (get_gizmo_idx_from_mouse(mouse_pos) == Undefined)
- {
+ if (get_gizmo_idx_from_mouse(mouse_pos) == Undefined) {
// mouse is outside the toolbar
m_tooltip = "";
- if (evt.LeftDown())
- {
- if ((m_current == SlaSupports || m_current == Hollow) && gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown()))
+ if (evt.LeftDown() && (!control_down || grabber_contains_mouse())) {
+ if ((m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports || m_current == Seam)
+ && gizmo_event(SLAGizmoEventType::LeftDown, mouse_pos, evt.ShiftDown(), evt.AltDown()))
// the gizmo got the event and took some action, there is no need to do anything more
processed = true;
else if (!selection.is_empty() && grabber_contains_mouse()) {
@@ -632,135 +635,70 @@ bool GLGizmosManager::on_mouse(wxMouseEvent& evt)
processed = true;
}
}
- else if (evt.RightDown() && (selected_object_idx != -1) && (m_current == SlaSupports || m_current == Hollow) && gizmo_event(SLAGizmoEventType::RightDown))
- {
+ else if (evt.RightDown() && selected_object_idx != -1 && (m_current == SlaSupports || m_current == Hollow)
+ && gizmo_event(SLAGizmoEventType::RightDown, mouse_pos)) {
// we need to set the following right up as processed to avoid showing the context menu if the user release the mouse over the object
pending_right_up = true;
// event was taken care of by the SlaSupports gizmo
processed = true;
}
- else if (evt.Dragging() && (m_parent.get_move_volume_id() != -1) && (m_current == SlaSupports || m_current == Hollow))
+ else if (evt.RightDown() && !control_down && selected_object_idx != -1 && (m_current == FdmSupports || m_current == Seam)
+ && gizmo_event(SLAGizmoEventType::RightDown, mouse_pos)) {
+ // event was taken care of by the FdmSupports / Seam gizmo
+ processed = true;
+ }
+ else if (evt.Dragging() && m_parent.get_move_volume_id() != -1
+ && (m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports || m_current == Seam))
// don't allow dragging objects with the Sla gizmo on
processed = true;
- else if (evt.Dragging() && (m_current == SlaSupports || m_current == Hollow) && gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown()))
- {
+ else if (evt.Dragging() && !control_down && (m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports || m_current == Seam)
+ && gizmo_event(SLAGizmoEventType::Dragging, mouse_pos, evt.ShiftDown(), evt.AltDown())) {
// the gizmo got the event and took some action, no need to do anything more here
m_parent.set_as_dirty();
processed = true;
}
-#if !ENABLE_GIZMO_TOOLBAR_DRAGGING_FIX
- else if (evt.Dragging() && is_dragging())
- {
- if (!m_parent.get_wxglcanvas()->HasCapture())
- m_parent.get_wxglcanvas()->CaptureMouse();
-
- m_parent.set_mouse_as_dragging();
- update(m_parent.mouse_ray(pos), pos);
-
- switch (m_current)
- {
- case Move:
- {
- // Apply new temporary offset
- selection.translate(get_displacement());
- wxGetApp().obj_manipul()->set_dirty();
- break;
- }
- case Scale:
- {
- // Apply new temporary scale factors
- TransformationType transformation_type(TransformationType::Local_Absolute_Joint);
- if (evt.AltDown())
- transformation_type.set_independent();
- selection.scale(get_scale(), transformation_type);
- if (evt.ControlDown())
- selection.translate(get_scale_offset(), true);
- wxGetApp().obj_manipul()->set_dirty();
- break;
- }
- case Rotate:
- {
- // Apply new temporary rotations
- TransformationType transformation_type(TransformationType::World_Relative_Joint);
- if (evt.AltDown())
- transformation_type.set_independent();
- selection.rotate(get_rotation(), transformation_type);
- wxGetApp().obj_manipul()->set_dirty();
- break;
- }
- default:
- break;
- }
-
- m_parent.set_as_dirty();
- processed = true;
+ else if (evt.Dragging() && control_down && (evt.LeftIsDown() || evt.RightIsDown())) {
+ // CTRL has been pressed while already dragging -> stop current action
+ if (evt.LeftIsDown())
+ gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, evt.ShiftDown(), evt.AltDown(), true);
+ else if (evt.RightIsDown())
+ gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, evt.ShiftDown(), evt.AltDown(), true);
}
-#endif // !ENABLE_GIZMO_TOOLBAR_DRAGGING_FIX
-#if !ENABLE_MODIFIED_GIZMOBAR_MOUSE_EVENT_HANDLING
- else if (evt.LeftUp() && is_dragging())
- {
- switch (m_current) {
- case Move : m_parent.do_move(L("Gizmo-Move")); break;
- case Scale : m_parent.do_scale(L("Gizmo-Scale")); break;
- case Rotate : m_parent.do_rotate(L("Gizmo-Rotate")); break;
- default : break;
- }
-
- stop_dragging();
- update_data();
-
- wxGetApp().obj_manipul()->set_dirty();
- // Let the plater know that the dragging finished, so a delayed refresh
- // of the scene with the background processing data should be performed.
- m_parent.post_event(SimpleEvent(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED));
- // updates camera target constraints
- m_parent.refresh_camera_scene_box();
-
- processed = true;
- }
-#endif // !ENABLE_MODIFIED_GIZMOBAR_MOUSE_EVENT_HANDLING
- else if (evt.LeftUp() && (m_current == SlaSupports || m_current == Hollow) && !m_parent.is_mouse_dragging())
- {
- // in case SLA gizmo is selected, we just pass the LeftUp event and stop processing - neither
+ else if (evt.LeftUp() && (m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports || m_current == Seam) && !m_parent.is_mouse_dragging()) {
+ // in case SLA/FDM gizmo is selected, we just pass the LeftUp event and stop processing - neither
// object moving or selecting is suppressed in that case
- gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, evt.ShiftDown(), evt.AltDown(), evt.ControlDown());
+ gizmo_event(SLAGizmoEventType::LeftUp, mouse_pos, evt.ShiftDown(), evt.AltDown(), control_down);
processed = true;
}
- else if (evt.LeftUp() && (m_current == Flatten) && (m_gizmos[m_current]->get_hover_id() != -1))
- {
+ else if (evt.LeftUp() && m_current == Flatten && m_gizmos[m_current]->get_hover_id() != -1) {
// to avoid to loose the selection when user clicks an the white faces of a different object while the Flatten gizmo is active
processed = true;
}
+ else if (evt.RightUp() && (m_current == FdmSupports || m_current == Seam) && !m_parent.is_mouse_dragging()) {
+ gizmo_event(SLAGizmoEventType::RightUp, mouse_pos, evt.ShiftDown(), evt.AltDown(), control_down);
+ processed = true;
+ }
}
- else
- {
+ else {
// mouse inside toolbar
- if (evt.LeftDown() || evt.LeftDClick())
- {
+ if (evt.LeftDown() || evt.LeftDClick()) {
m_mouse_capture.left = true;
m_mouse_capture.parent = &m_parent;
processed = true;
- if (!selection.is_empty())
- {
+ if (!selection.is_empty()) {
update_on_off_state(mouse_pos);
update_data();
m_parent.set_as_dirty();
}
}
- else if (evt.MiddleDown())
- {
+ else if (evt.MiddleDown()) {
m_mouse_capture.middle = true;
m_mouse_capture.parent = &m_parent;
}
- else if (evt.RightDown())
- {
+ else if (evt.RightDown()) {
m_mouse_capture.right = true;
m_mouse_capture.parent = &m_parent;
}
-#if !ENABLE_MODIFIED_GIZMOBAR_MOUSE_EVENT_HANDLING
- else if (evt.LeftUp())
- processed = true;
-#endif // !ENABLE_MODIFIED_GIZMOBAR_MOUSE_EVENT_HANDLING
}
return processed;
@@ -820,7 +758,7 @@ bool GLGizmosManager::on_char(wxKeyEvent& evt)
case 'r' :
case 'R' :
{
- if ((m_current == SlaSupports || m_current == Hollow) && gizmo_event(SLAGizmoEventType::ResetClippingPlane))
+ if ((m_current == SlaSupports || m_current == Hollow || m_current == FdmSupports || m_current == Seam) && gizmo_event(SLAGizmoEventType::ResetClippingPlane))
processed = true;
break;
@@ -1028,8 +966,8 @@ void GLGizmosManager::do_render_overlay() const
float cnv_w = (float)m_parent.get_canvas_size().get_width();
float cnv_h = (float)m_parent.get_canvas_size().get_height();
- float zoom = (float)m_parent.get_camera().get_zoom();
- float inv_zoom = (float)m_parent.get_camera().get_inv_zoom();
+ float zoom = (float)wxGetApp().plater()->get_camera().get_zoom();
+ float inv_zoom = (float)wxGetApp().plater()->get_camera().get_inv_zoom();
float height = get_scaled_total_height();
float width = get_scaled_total_width();
@@ -1080,7 +1018,7 @@ void GLGizmosManager::do_render_overlay() const
GLTexture::render_sub_texture(icons_texture_id, zoomed_top_x, zoomed_top_x + zoomed_icons_size, zoomed_top_y - zoomed_icons_size, zoomed_top_y, { { u_left, v_bottom }, { u_right, v_bottom }, { u_right, v_top }, { u_left, v_top } });
if (idx == m_current) {
- float toolbar_top = cnv_h - m_parent.get_view_toolbar_height();
+ float toolbar_top = cnv_h - wxGetApp().plater()->get_view_toolbar().get_height();
gizmo->render_input_window(width, 0.5f * cnv_h - zoomed_top_y * zoom, toolbar_top);
}
zoomed_top_y -= zoomed_stride_y;
@@ -1175,10 +1113,20 @@ void GLGizmosManager::activate_gizmo(EType type)
return; // gizmo refused to be turned off, do nothing.
}
+ m_current = type;
+
+ // Updating common data should be left to the update_data function, which
+ // is always called after this one. activate_gizmo can be called by undo/redo,
+ // when selection is not yet deserialized, so the common data would update
+ // incorrectly (or crash if relying on unempty selection). Undo/redo stack
+ // will also call update_data, after selection is restored.
+
+ //m_common_gizmos_data->update(get_current()
+ // ? get_current()->get_requirements()
+ // : CommonGizmosDataID(0));
+
if (type != Undefined)
m_gizmos[type]->set_state(GLGizmoBase::On);
-
- m_current = type;
}
@@ -1191,135 +1139,5 @@ bool GLGizmosManager::grabber_contains_mouse() const
return (curr != nullptr) ? (curr->get_hover_id() != -1) : false;
}
-
-
-CommonGizmosData::CommonGizmosData()
-{
- m_clipping_plane.reset(new ClippingPlane(Vec3d::Zero(), 0.));
-}
-
-
-
-bool CommonGizmosData::update_from_backend(GLCanvas3D& canvas, ModelObject* model_object)
-{
- recent_update = false;
- bool object_changed = false;
-
- if (m_model_object != model_object
- || (model_object && m_model_object_id != model_object->id())) {
- m_model_object = model_object;
- m_print_object_idx = -1;
- m_mesh_raycaster.reset();
- m_object_clipper.reset();
- m_supports_clipper.reset();
- m_old_mesh = nullptr;
- m_mesh = nullptr;
- m_backend_mesh_transformed.clear();
-
- object_changed = true;
- recent_update = true;
- }
-
- if (m_model_object) {
- int active_inst = canvas.get_selection().get_instance_idx();
- if (m_active_instance != active_inst) {
- m_active_instance = active_inst;
- m_active_instance_bb_radius = m_model_object->instance_bounding_box(m_active_instance).radius();
- recent_update = true;
- }
- }
-
-
- if (! m_model_object || ! canvas.get_selection().is_from_single_instance())
- return false;
-
- int old_po_idx = m_print_object_idx;
-
- // First we need a pointer to the respective SLAPrintObject. The index into objects vector is
- // cached so we don't have todo it on each render. We only search for the po if needed:
- if (m_print_object_idx < 0 || (int)canvas.sla_print()->objects().size() != m_print_objects_count) {
- m_print_objects_count = canvas.sla_print()->objects().size();
- m_print_object_idx = -1;
- for (const SLAPrintObject* po : canvas.sla_print()->objects()) {
- ++m_print_object_idx;
- if (po->model_object()->id() == m_model_object->id())
- break;
- }
- }
-
- bool mesh_exchanged = false;
- m_mesh = nullptr;
- // Load either the model_object mesh, or one provided by the backend
- // This mesh does not account for the possible Z up SLA offset.
- // The backend mesh needs to be transformed and because a pointer to it is
- // saved, a copy is stored as a member (FIXME)
- if (m_print_object_idx >=0) {
- const SLAPrintObject* po = canvas.sla_print()->objects()[m_print_object_idx];
- if (po->is_step_done(slaposDrillHoles)) {
- m_backend_mesh_transformed = po->get_mesh_to_print();
- m_backend_mesh_transformed.transform(canvas.sla_print()->sla_trafo(*m_model_object).inverse());
- m_mesh = &m_backend_mesh_transformed;
- m_has_drilled_mesh = true;
- mesh_exchanged = true;
- }
- }
-
- if (! m_mesh) {
- m_mesh = &m_model_object->volumes.front()->mesh();
- m_backend_mesh_transformed.clear();
- m_has_drilled_mesh = false;
- }
-
- m_model_object_id = m_model_object->id();
-
- if (m_mesh != m_old_mesh) {
- // Update clipping plane position.
- float new_clp_pos = m_clipping_plane_distance;
- if (object_changed) {
- new_clp_pos = 0.f;
- m_clipping_plane_was_moved = false;
- } else {
- // After we got a drilled mesh, move the cp to 25%. This only applies when
- // the hollowing gizmo is active and hollowing is enabled
- if (m_clipping_plane_distance == 0.f && mesh_exchanged && m_has_drilled_mesh) {
- const DynamicPrintConfig& cfg =
- (m_model_object && m_model_object->config.has("hollowing_enable"))
- ? m_model_object->config
- : wxGetApp().preset_bundle->sla_prints.get_edited_preset().config;
-
- if (cfg.has("hollowing_enable") && cfg.opt_bool("hollowing_enable")
- && canvas.get_gizmos_manager().get_current_type() == GLGizmosManager::Hollow) {
- new_clp_pos = 0.25f;
- m_clipping_plane_was_moved = false; // so it uses current camera direction
- }
- }
- }
- m_clipping_plane_distance = new_clp_pos;
- m_clipping_plane_distance_stash = new_clp_pos;
-
- m_schedule_aabb_calculation = true;
- recent_update = true;
- return true;
- }
- if (! recent_update)
- recent_update = m_print_object_idx < 0 && old_po_idx >= 0;
-
- return recent_update;
-}
-
-
-void CommonGizmosData::build_AABB_if_needed()
-{
- if (! m_schedule_aabb_calculation)
- return;
-
- wxBusyCursor wait;
- m_mesh_raycaster.reset(new MeshRaycaster(*m_mesh));
- m_object_clipper.reset();
- m_supports_clipper.reset();
- m_old_mesh = m_mesh;
- m_schedule_aabb_calculation = false;
-}
-
} // namespace GUI
} // namespace Slic3r
diff --git a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp
index 614712d1d..7f47167e9 100644
--- a/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp
+++ b/src/slic3r/GUI/Gizmos/GLGizmosManager.hpp
@@ -3,7 +3,9 @@
#include "slic3r/GUI/GLTexture.hpp"
#include "slic3r/GUI/GLToolbar.hpp"
-#include "slic3r/GUI/Gizmos/GLGizmos.hpp"
+#include "slic3r/GUI/Gizmos/GLGizmoBase.hpp"
+#include "slic3r/GUI/Gizmos/GLGizmosCommon.hpp"
+
#include "libslic3r/ObjectID.hpp"
#include <map>
@@ -18,6 +20,8 @@ namespace GUI {
class GLCanvas3D;
class ClippingPlane;
+enum class SLAGizmoEventType : unsigned char;
+class CommonGizmosDataPool;
class Rect
{
@@ -62,6 +66,8 @@ public:
Cut,
Hollow,
SlaSupports,
+ FdmSupports,
+ Seam,
Undefined
};
@@ -113,7 +119,8 @@ private:
MouseCapture m_mouse_capture;
std::string m_tooltip;
bool m_serializing;
- std::unique_ptr<CommonGizmosData> m_common_gizmos_data;
+ //std::unique_ptr<CommonGizmosData> m_common_gizmos_data;
+ std::unique_ptr<CommonGizmosDataPool> m_common_gizmos_data;
public:
explicit GLGizmosManager(GLCanvas3D& parent);
@@ -163,6 +170,7 @@ public:
void refresh_on_off_state();
void reset_all_states();
+ bool is_serializing() const { return m_serializing; }
void set_hover_id(int id);
void enable_grabber(EType type, unsigned int id, bool enable);
@@ -195,12 +203,16 @@ public:
void set_flattening_data(const ModelObject* model_object);
void set_sla_support_data(ModelObject* model_object);
+
+ void set_painter_gizmo_data();
+
bool gizmo_event(SLAGizmoEventType action, const Vec2d& mouse_position = Vec2d::Zero(), bool shift_down = false, bool alt_down = false, bool control_down = false);
- ClippingPlane get_sla_clipping_plane() const;
+ ClippingPlane get_clipping_plane() const;
bool wants_reslice_supports_on_undo() const;
void render_current_gizmo() const;
void render_current_gizmo_for_picking_pass() const;
+ void render_painter_gizmo() const;
void render_overlay() const;
@@ -213,6 +225,8 @@ public:
void update_after_undo_redo(const UndoRedo::Snapshot& snapshot);
+ int get_selectable_icons_cnt() const { return get_selectable_idxs().size(); }
+
private:
void render_background(float left, float top, float right, float bottom, float border) const;
void do_render_overlay() const;
@@ -229,63 +243,6 @@ private:
-class MeshRaycaster;
-class MeshClipper;
-
-// This class is only for sharing SLA related data between SLA gizmos
-// and its synchronization with backend data. It should not be misused
-// for anything else.
-class CommonGizmosData {
-public:
- CommonGizmosData();
- const TriangleMesh* mesh() const {
- return (! m_mesh ? nullptr : m_mesh); //(m_cavity_mesh ? m_cavity_mesh.get() : m_mesh));
- }
-
- bool update_from_backend(GLCanvas3D& canvas, ModelObject* model_object);
- bool recent_update = false;
- static constexpr float HoleStickOutLength = 1.f;
-
- ModelObject* m_model_object = nullptr;
- const TriangleMesh* m_mesh;
- std::unique_ptr<MeshRaycaster> m_mesh_raycaster;
- std::unique_ptr<MeshClipper> m_object_clipper;
- std::unique_ptr<MeshClipper> m_supports_clipper;
-
- //std::unique_ptr<TriangleMesh> m_cavity_mesh;
- //std::unique_ptr<GLVolume> m_volume_with_cavity;
-
- int m_active_instance = -1;
- float m_active_instance_bb_radius = 0;
- ObjectID m_model_object_id = 0;
- int m_print_object_idx = -1;
- int m_print_objects_count = -1;
- int m_old_timestamp = -1;
-
- float m_clipping_plane_distance = 0.f;
- std::unique_ptr<ClippingPlane> m_clipping_plane;
- bool m_clipping_plane_was_moved = false;
-
- void stash_clipping_plane() {
- m_clipping_plane_distance_stash = m_clipping_plane_distance;
- }
-
- void unstash_clipping_plane() {
- m_clipping_plane_distance = m_clipping_plane_distance_stash;
- }
-
- bool has_drilled_mesh() const { return m_has_drilled_mesh; }
-
- void build_AABB_if_needed();
-
-private:
- const TriangleMesh* m_old_mesh;
- TriangleMesh m_backend_mesh_transformed;
- float m_clipping_plane_distance_stash = 0.f;
- bool m_has_drilled_mesh = false;
- bool m_schedule_aabb_calculation = false;
-};
-
} // namespace GUI
} // namespace Slic3r
diff --git a/src/slic3r/GUI/I18N.hpp b/src/slic3r/GUI/I18N.hpp
index 25e46930b..7bad6880e 100644
--- a/src/slic3r/GUI/I18N.hpp
+++ b/src/slic3r/GUI/I18N.hpp
@@ -12,7 +12,7 @@
#ifndef L
// !!! If you needed to translate some wxString,
-// !!! please use _(L(string))
+// !!! please use _L(string)
// !!! _() - is a standard wxWidgets macro to translate
// !!! L() is used only for marking localizable string
// !!! It will be used in "xgettext" to create a Locating Message Catalog.
diff --git a/src/slic3r/GUI/ImGuiWrapper.cpp b/src/slic3r/GUI/ImGuiWrapper.cpp
index a44e843b8..ff8ba8f48 100644
--- a/src/slic3r/GUI/ImGuiWrapper.cpp
+++ b/src/slic3r/GUI/ImGuiWrapper.cpp
@@ -7,6 +7,7 @@
#include <boost/format.hpp>
#include <boost/log/trivial.hpp>
+#include <boost/filesystem.hpp>
#include <wx/string.h>
#include <wx/event.h>
@@ -15,17 +16,53 @@
#include <GL/glew.h>
+#ifndef IMGUI_DEFINE_MATH_OPERATORS
+#define IMGUI_DEFINE_MATH_OPERATORS
+#endif
#include <imgui/imgui_internal.h>
#include "libslic3r/libslic3r.h"
#include "libslic3r/Utils.hpp"
#include "3DScene.hpp"
#include "GUI.hpp"
+#include "I18N.hpp"
+#include "Search.hpp"
+
+#include "../Utils/MacDarkMode.hpp"
+#include "nanosvg/nanosvg.h"
+#include "nanosvg/nanosvgrast.h"
namespace Slic3r {
namespace GUI {
+static const std::map<const char, std::string> font_icons = {
+ {ImGui::PrintIconMarker , "cog" },
+ {ImGui::PrinterIconMarker , "printer" },
+ {ImGui::PrinterSlaIconMarker , "sla_printer" },
+ {ImGui::FilamentIconMarker , "spool" },
+ {ImGui::MaterialIconMarker , "resin" },
+ {ImGui::MinimalizeButton , "notification_minimalize" },
+ {ImGui::MinimalizeHoverButton , "notification_minimalize_hover" }
+};
+static const std::map<const char, std::string> font_icons_large = {
+ {ImGui::CloseNotifButton , "notification_close" },
+ {ImGui::CloseNotifHoverButton , "notification_close_hover" },
+ {ImGui::EjectButton , "notification_eject_sd" },
+ {ImGui::EjectHoverButton , "notification_eject_sd_hover" },
+ {ImGui::WarningMarker , "notification_warning" },
+ {ImGui::ErrorMarker , "notification_error" }
+};
+
+const ImVec4 ImGuiWrapper::COL_GREY_DARK = { 0.333f, 0.333f, 0.333f, 1.0f };
+const ImVec4 ImGuiWrapper::COL_GREY_LIGHT = { 0.4f, 0.4f, 0.4f, 1.0f };
+const ImVec4 ImGuiWrapper::COL_ORANGE_DARK = { 0.757f, 0.404f, 0.216f, 1.0f };
+const ImVec4 ImGuiWrapper::COL_ORANGE_LIGHT = { 1.0f, 0.49f, 0.216f, 1.0f };
+const ImVec4 ImGuiWrapper::COL_WINDOW_BACKGROUND = { 0.133f, 0.133f, 0.133f, 0.8f };
+const ImVec4 ImGuiWrapper::COL_BUTTON_BACKGROUND = COL_ORANGE_DARK;
+const ImVec4 ImGuiWrapper::COL_BUTTON_HOVERED = COL_ORANGE_LIGHT;
+const ImVec4 ImGuiWrapper::COL_BUTTON_ACTIVE = ImGuiWrapper::COL_BUTTON_HOVERED;
+
ImGuiWrapper::ImGuiWrapper()
: m_glyph_ranges(nullptr)
, m_font_cjk(false)
@@ -158,6 +195,9 @@ bool ImGuiWrapper::update_mouse_data(wxMouseEvent& evt)
io.MouseDown[0] = evt.LeftIsDown();
io.MouseDown[1] = evt.RightIsDown();
io.MouseDown[2] = evt.MiddleIsDown();
+ float wheel_delta = static_cast<float>(evt.GetWheelDelta());
+ if (wheel_delta != 0.0f)
+ io.MouseWheel = static_cast<float>(evt.GetWheelRotation()) / wheel_delta;
unsigned buttons = (evt.LeftIsDown() ? 1 : 0) | (evt.RightIsDown() ? 2 : 0) | (evt.MiddleIsDown() ? 4 : 0);
m_mouse_buttons = buttons;
@@ -244,6 +284,11 @@ void ImGuiWrapper::set_next_window_bg_alpha(float alpha)
ImGui::SetNextWindowBgAlpha(alpha);
}
+void ImGuiWrapper::set_next_window_size(float x, float y, ImGuiCond cond)
+{
+ ImGui::SetNextWindowSize(ImVec2(x, y), cond);
+}
+
bool ImGuiWrapper::begin(const std::string &name, int flags)
{
return ImGui::Begin(name.c_str(), nullptr, (ImGuiWindowFlags)flags);
@@ -275,12 +320,23 @@ bool ImGuiWrapper::button(const wxString &label)
return ImGui::Button(label_utf8.c_str());
}
+bool ImGuiWrapper::button(const wxString& label, float width, float height)
+{
+ auto label_utf8 = into_u8(label);
+ return ImGui::Button(label_utf8.c_str(), ImVec2(width, height));
+}
+
bool ImGuiWrapper::radio_button(const wxString &label, bool active)
{
auto label_utf8 = into_u8(label);
return ImGui::RadioButton(label_utf8.c_str(), active);
}
+bool ImGuiWrapper::image_button()
+{
+ return false;
+}
+
bool ImGuiWrapper::input_double(const std::string &label, const double &value, const std::string &format)
{
return ImGui::InputDouble(label.c_str(), const_cast<double*>(&value), 0.0f, 0.0f, format.c_str());
@@ -319,7 +375,7 @@ bool ImGuiWrapper::checkbox(const wxString &label, bool &value)
void ImGuiWrapper::text(const char *label)
{
- ImGui::Text(label, NULL);
+ ImGui::Text("%s", label);
}
void ImGuiWrapper::text(const std::string &label)
@@ -333,6 +389,22 @@ void ImGuiWrapper::text(const wxString &label)
this->text(label_utf8.c_str());
}
+void ImGuiWrapper::text_colored(const ImVec4& color, const char* label)
+{
+ ImGui::TextColored(color, "%s", label);
+}
+
+void ImGuiWrapper::text_colored(const ImVec4& color, const std::string& label)
+{
+ this->text_colored(color, label.c_str());
+}
+
+void ImGuiWrapper::text_colored(const ImVec4& color, const wxString& label)
+{
+ auto label_utf8 = into_u8(label);
+ this->text_colored(color, label_utf8.c_str());
+}
+
bool ImGuiWrapper::slider_float(const char* label, float* v, float v_min, float v_max, const char* format/* = "%.3f"*/, float power/* = 1.0f*/)
{
return ImGui::SliderFloat(label, v, v_min, v_max, format, power);
@@ -355,10 +427,10 @@ bool ImGuiWrapper::combo(const wxString& label, const std::vector<std::string>&
text(label);
ImGui::SameLine();
- int selection_out = -1;
+ int selection_out = selection;
bool res = false;
- const char *selection_str = selection < (int)options.size() ? options[selection].c_str() : "";
+ const char *selection_str = selection < int(options.size()) && selection >= 0 ? options[selection].c_str() : "";
if (ImGui::BeginCombo("", selection_str)) {
for (int i = 0; i < (int)options.size(); i++) {
if (ImGui::Selectable(options[i].c_str(), i == selection)) {
@@ -374,7 +446,40 @@ bool ImGuiWrapper::combo(const wxString& label, const std::vector<std::string>&
return res;
}
-bool ImGuiWrapper::undo_redo_list(const ImVec2& size, const bool is_undo, bool (*items_getter)(const bool , int , const char**), int& hovered, int& selected)
+// Scroll up for one item
+static void scroll_up()
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+
+ float item_size_y = window->DC.PrevLineSize.y + g.Style.ItemSpacing.y;
+ float win_top = window->Scroll.y;
+
+ ImGui::SetScrollY(win_top - item_size_y);
+}
+
+// Scroll down for one item
+static void scroll_down()
+{
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+
+ float item_size_y = window->DC.PrevLineSize.y + g.Style.ItemSpacing.y;
+ float win_top = window->Scroll.y;
+
+ ImGui::SetScrollY(win_top + item_size_y);
+}
+
+static void process_mouse_wheel(int& mouse_wheel)
+{
+ if (mouse_wheel > 0)
+ scroll_up();
+ else if (mouse_wheel < 0)
+ scroll_down();
+ mouse_wheel = 0;
+}
+
+bool ImGuiWrapper::undo_redo_list(const ImVec2& size, const bool is_undo, bool (*items_getter)(const bool , int , const char**), int& hovered, int& selected, int& mouse_wheel)
{
bool is_hovered = false;
ImGui::ListBoxHeader("", size);
@@ -396,10 +501,318 @@ bool ImGuiWrapper::undo_redo_list(const ImVec2& size, const bool is_undo, bool (
i++;
}
+ if (is_hovered)
+ process_mouse_wheel(mouse_wheel);
+
ImGui::ListBoxFooter();
return is_hovered;
}
+// It's a copy of IMGui::Selactable function.
+// But a little beat modified to change a label text.
+// If item is hovered we should use another color for highlighted letters.
+// To do that we push a ColorMarkerHovered symbol at the very beginning of the label
+// This symbol will be used to a color selection for the highlighted letters.
+// see imgui_draw.cpp, void ImFont::RenderText()
+static bool selectable(const char* label, bool selected, ImGuiSelectableFlags flags = 0, const ImVec2& size_arg = ImVec2(0, 0))
+{
+ ImGuiWindow* window = ImGui::GetCurrentWindow();
+ if (window->SkipItems)
+ return false;
+
+ ImGuiContext& g = *GImGui;
+ const ImGuiStyle& style = g.Style;
+
+ if ((flags & ImGuiSelectableFlags_SpanAllColumns) && window->DC.CurrentColumns) // FIXME-OPT: Avoid if vertically clipped.
+ ImGui::PushColumnsBackground();
+
+ ImGuiID id = window->GetID(label);
+ ImVec2 label_size = ImGui::CalcTextSize(label, NULL, true);
+ ImVec2 size(size_arg.x != 0.0f ? size_arg.x : label_size.x, size_arg.y != 0.0f ? size_arg.y : label_size.y);
+ ImVec2 pos = window->DC.CursorPos;
+ pos.y += window->DC.CurrLineTextBaseOffset;
+ ImRect bb_inner(pos, pos + size);
+ ImGui::ItemSize(size, 0.0f);
+
+ // Fill horizontal space.
+ ImVec2 window_padding = window->WindowPadding;
+ float max_x = (flags & ImGuiSelectableFlags_SpanAllColumns) ? ImGui::GetWindowContentRegionMax().x : ImGui::GetContentRegionMax().x;
+ float w_draw = ImMax(label_size.x, window->Pos.x + max_x - window_padding.x - pos.x);
+ ImVec2 size_draw((size_arg.x != 0 && !(flags & ImGuiSelectableFlags_DrawFillAvailWidth)) ? size_arg.x : w_draw, size_arg.y != 0.0f ? size_arg.y : size.y);
+ ImRect bb(pos, pos + size_draw);
+ if (size_arg.x == 0.0f || (flags & ImGuiSelectableFlags_DrawFillAvailWidth))
+ bb.Max.x += window_padding.x;
+
+ // Selectables are tightly packed together so we extend the box to cover spacing between selectable.
+ const float spacing_x = style.ItemSpacing.x;
+ const float spacing_y = style.ItemSpacing.y;
+ const float spacing_L = IM_FLOOR(spacing_x * 0.50f);
+ const float spacing_U = IM_FLOOR(spacing_y * 0.50f);
+ bb.Min.x -= spacing_L;
+ bb.Min.y -= spacing_U;
+ bb.Max.x += (spacing_x - spacing_L);
+ bb.Max.y += (spacing_y - spacing_U);
+
+ bool item_add;
+ if (flags & ImGuiSelectableFlags_Disabled)
+ {
+ ImGuiItemFlags backup_item_flags = window->DC.ItemFlags;
+ window->DC.ItemFlags |= ImGuiItemFlags_Disabled | ImGuiItemFlags_NoNavDefaultFocus;
+ item_add = ImGui::ItemAdd(bb, id);
+ window->DC.ItemFlags = backup_item_flags;
+ }
+ else
+ {
+ item_add = ImGui::ItemAdd(bb, id);
+ }
+ if (!item_add)
+ {
+ if ((flags & ImGuiSelectableFlags_SpanAllColumns) && window->DC.CurrentColumns)
+ ImGui::PopColumnsBackground();
+ return false;
+ }
+
+ // We use NoHoldingActiveID on menus so user can click and _hold_ on a menu then drag to browse child entries
+ ImGuiButtonFlags button_flags = 0;
+ if (flags & ImGuiSelectableFlags_NoHoldingActiveID) { button_flags |= ImGuiButtonFlags_NoHoldingActiveId; }
+ if (flags & ImGuiSelectableFlags_PressedOnClick) { button_flags |= ImGuiButtonFlags_PressedOnClick; }
+ if (flags & ImGuiSelectableFlags_PressedOnRelease) { button_flags |= ImGuiButtonFlags_PressedOnRelease; }
+ if (flags & ImGuiSelectableFlags_Disabled) { button_flags |= ImGuiButtonFlags_Disabled; }
+ if (flags & ImGuiSelectableFlags_AllowDoubleClick) { button_flags |= ImGuiButtonFlags_PressedOnClickRelease | ImGuiButtonFlags_PressedOnDoubleClick; }
+ if (flags & ImGuiSelectableFlags_AllowItemOverlap) { button_flags |= ImGuiButtonFlags_AllowItemOverlap; }
+
+ if (flags & ImGuiSelectableFlags_Disabled)
+ selected = false;
+
+ const bool was_selected = selected;
+ bool hovered, held;
+ bool pressed = ImGui::ButtonBehavior(bb, id, &hovered, &held, button_flags);
+
+ // Update NavId when clicking or when Hovering (this doesn't happen on most widgets), so navigation can be resumed with gamepad/keyboard
+ if (pressed || (hovered && (flags & ImGuiSelectableFlags_SetNavIdOnHover)))
+ {
+ if (!g.NavDisableMouseHover && g.NavWindow == window && g.NavLayer == window->DC.NavLayerCurrent)
+ {
+ g.NavDisableHighlight = true;
+ ImGui::SetNavID(id, window->DC.NavLayerCurrent, window->DC.NavFocusScopeIdCurrent);
+ }
+ }
+ if (pressed)
+ ImGui::MarkItemEdited(id);
+
+ if (flags & ImGuiSelectableFlags_AllowItemOverlap)
+ ImGui::SetItemAllowOverlap();
+
+ // In this branch, Selectable() cannot toggle the selection so this will never trigger.
+ if (selected != was_selected) //-V547
+ window->DC.LastItemStatusFlags |= ImGuiItemStatusFlags_ToggledSelection;
+
+ // Render
+ if (held && (flags & ImGuiSelectableFlags_DrawHoveredWhenHeld))
+ hovered = true;
+ if (hovered || selected)
+ {
+ const ImU32 col = ImGui::GetColorU32((held && hovered) ? ImGuiCol_HeaderActive : hovered ? ImGuiCol_HeaderHovered : ImGuiCol_Header);
+ ImGui::RenderFrame(bb.Min, bb.Max, col, false, 0.0f);
+ ImGui::RenderNavHighlight(bb, id, ImGuiNavHighlightFlags_TypeThin | ImGuiNavHighlightFlags_NoRounding);
+ }
+
+ if ((flags & ImGuiSelectableFlags_SpanAllColumns) && window->DC.CurrentColumns)
+ {
+ ImGui::PopColumnsBackground();
+ bb.Max.x -= (ImGui::GetContentRegionMax().x - max_x);
+ }
+
+ // mark a label with a ImGui::ColorMarkerHovered, if item is hovered
+ char* marked_label = new char[512]; //255 symbols is not enough for translated string (e.t. to Russian)
+ if (hovered)
+ sprintf(marked_label, "%c%s", ImGui::ColorMarkerHovered, label);
+ else
+ strcpy(marked_label, label);
+
+ if (flags & ImGuiSelectableFlags_Disabled) ImGui::PushStyleColor(ImGuiCol_Text, style.Colors[ImGuiCol_TextDisabled]);
+ ImGui::RenderTextClipped(bb_inner.Min, bb_inner.Max, marked_label, NULL, &label_size, style.SelectableTextAlign, &bb);
+ if (flags & ImGuiSelectableFlags_Disabled) ImGui::PopStyleColor();
+
+ delete[] marked_label;
+
+ // Automatically close popups
+ if (pressed && (window->Flags & ImGuiWindowFlags_Popup) && !(flags & ImGuiSelectableFlags_DontClosePopups) && !(window->DC.ItemFlags & ImGuiItemFlags_SelectableDontClosePopup)) ImGui::CloseCurrentPopup();
+
+ IMGUI_TEST_ENGINE_ITEM_INFO(id, label, window->DC.ItemFlags);
+ return pressed;
+}
+
+// Scroll so that the hovered item is at the top of the window
+static void scroll_y(int hover_id)
+{
+ if (hover_id < 0)
+ return;
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = g.CurrentWindow;
+
+ float item_size_y = window->DC.PrevLineSize.y + g.Style.ItemSpacing.y;
+ float item_delta = 0.5 * item_size_y;
+
+ float item_top = item_size_y * hover_id;
+ float item_bottom = item_top + item_size_y;
+
+ float win_top = window->Scroll.y;
+ float win_bottom = window->Scroll.y + window->Size.y;
+
+ if (item_bottom + item_delta >= win_bottom)
+ ImGui::SetScrollY(win_top + item_size_y);
+ else if (item_top - item_delta <= win_top)
+ ImGui::SetScrollY(win_top - item_size_y);
+}
+
+// Use this function instead of ImGui::IsKeyPressed.
+// ImGui::IsKeyPressed is related for *GImGui.IO.KeysDownDuration[user_key_index]
+// And after first key pressing IsKeyPressed() return "true" always even if key wasn't pressed
+static void process_key_down(ImGuiKey imgui_key, std::function<void()> f)
+{
+ if (ImGui::IsKeyDown(ImGui::GetKeyIndex(imgui_key)))
+ {
+ f();
+ // set KeysDown to false to avoid redundant key down processing
+ ImGuiContext& g = *GImGui;
+ g.IO.KeysDown[ImGui::GetKeyIndex(imgui_key)] = false;
+ }
+}
+
+void ImGuiWrapper::search_list(const ImVec2& size_, bool (*items_getter)(int, const char** label, const char** tooltip), char* search_str,
+ Search::OptionViewParameters& view_params, int& selected, bool& edited, int& mouse_wheel, bool is_localized)
+{
+ int& hovered_id = view_params.hovered_id;
+ // ImGui::ListBoxHeader("", size);
+ {
+ // rewrote part of function to add a TextInput instead of label Text
+ ImGuiContext& g = *GImGui;
+ ImGuiWindow* window = ImGui::GetCurrentWindow();
+ if (window->SkipItems)
+ return ;
+
+ const ImGuiStyle& style = g.Style;
+
+ // Size default to hold ~7 items. Fractional number of items helps seeing that we can scroll down/up without looking at scrollbar.
+ ImVec2 size = ImGui::CalcItemSize(size_, ImGui::CalcItemWidth(), ImGui::GetTextLineHeightWithSpacing() * 7.4f + style.ItemSpacing.y);
+ ImRect frame_bb(window->DC.CursorPos, ImVec2(window->DC.CursorPos.x + size.x, window->DC.CursorPos.y + size.y));
+
+ ImRect bb(frame_bb.Min, frame_bb.Max);
+ window->DC.LastItemRect = bb; // Forward storage for ListBoxFooter.. dodgy.
+ g.NextItemData.ClearFlags();
+
+ if (!ImGui::IsRectVisible(bb.Min, bb.Max))
+ {
+ ImGui::ItemSize(bb.GetSize(), style.FramePadding.y);
+ ImGui::ItemAdd(bb, 0, &frame_bb);
+ return ;
+ }
+
+ ImGui::BeginGroup();
+
+ const ImGuiID id = ImGui::GetID(search_str);
+ ImVec2 search_size = ImVec2(size.x, ImGui::GetTextLineHeightWithSpacing() + style.ItemSpacing.y);
+
+ if (!ImGui::IsAnyItemFocused() && !ImGui::IsAnyItemActive() && !ImGui::IsMouseClicked(0))
+ ImGui::SetKeyboardFocusHere(0);
+
+ // The press on Esc key invokes editing of InputText (removes last changes)
+ // So we should save previous value...
+ std::string str = search_str;
+ ImGui::InputTextEx("", NULL, search_str, 40, search_size, ImGuiInputTextFlags_AutoSelectAll, NULL, NULL);
+ edited = ImGui::IsItemEdited();
+ if (edited)
+ hovered_id = 0;
+
+ process_key_down(ImGuiKey_Escape, [&selected, search_str, str]() {
+ // use 9999 to mark selection as a Esc key
+ selected = 9999;
+ // ... and when Esc key was pressed, than revert search_str value
+ strcpy(search_str, str.c_str());
+ });
+
+ ImGui::BeginChildFrame(id, frame_bb.GetSize());
+ }
+
+ int i = 0;
+ const char* item_text;
+ const char* tooltip;
+ int mouse_hovered = -1;
+
+ while (items_getter(i, &item_text, &tooltip))
+ {
+ selectable(item_text, i == hovered_id);
+
+ if (ImGui::IsItemHovered()) {
+ ImGui::SetTooltip("%s", /*item_text*/tooltip);
+ hovered_id = -1;
+ mouse_hovered = i;
+ }
+
+ if (ImGui::IsItemClicked())
+ selected = i;
+ i++;
+ }
+
+ // Process mouse wheel
+ if (mouse_hovered > 0)
+ process_mouse_wheel(mouse_wheel);
+
+ // process Up/DownArrows and Enter
+ process_key_down(ImGuiKey_UpArrow, [&hovered_id, mouse_hovered]() {
+ if (mouse_hovered > 0)
+ scroll_up();
+ else {
+ if (hovered_id > 0)
+ --hovered_id;
+ scroll_y(hovered_id);
+ }
+ });
+
+ process_key_down(ImGuiKey_DownArrow, [&hovered_id, mouse_hovered, i]() {
+ if (mouse_hovered > 0)
+ scroll_down();
+ else {
+ if (hovered_id < 0)
+ hovered_id = 0;
+ else if (hovered_id < i - 1)
+ ++hovered_id;
+ scroll_y(hovered_id);
+ }
+ });
+
+ process_key_down(ImGuiKey_Enter, [&selected, hovered_id]() {
+ selected = hovered_id;
+ });
+
+ ImGui::ListBoxFooter();
+
+ auto check_box = [&edited, this](const wxString& label, bool& check) {
+ ImGui::SameLine();
+ bool ch = check;
+ checkbox(label, ch);
+ if (ImGui::IsItemClicked()) {
+ check = !check;
+ edited = true;
+ }
+ };
+
+ ImGui::AlignTextToFramePadding();
+
+ // add checkboxes for show/hide Categories and Groups
+ text(_L("Use for search")+":");
+ check_box(_L("Category"), view_params.category);
+ if (is_localized)
+ check_box(_L("Search in English"), view_params.english);
+}
+
+void ImGuiWrapper::title(const std::string& str)
+{
+ text(str);
+ ImGui::Separator();
+}
+
void ImGuiWrapper::disabled_begin(bool disabled)
{
wxCHECK_RET(!m_disabled, "ImGUI: Unbalanced disabled_begin() call");
@@ -451,6 +864,49 @@ static const ImWchar ranges_keyboard_shortcuts[] =
};
#endif // __APPLE__
+
+std::vector<unsigned char> ImGuiWrapper::load_svg(const std::string& bitmap_name, unsigned target_width, unsigned target_height)
+{
+ std::vector<unsigned char> empty_vector;
+
+#ifdef __WXMSW__
+ std::string folder = "white\\";
+#else
+ std::string folder = "white/";
+#endif
+ if (!boost::filesystem::exists(Slic3r::var(folder + bitmap_name + ".svg")))
+ folder.clear();
+
+ NSVGimage* image = ::nsvgParseFromFile(Slic3r::var(folder + bitmap_name + ".svg").c_str(), "px", 96.0f);
+ if (image == nullptr)
+ return empty_vector;
+
+ float svg_scale = target_height != 0 ?
+ (float)target_height / image->height : target_width != 0 ?
+ (float)target_width / image->width : 1;
+
+ int width = (int)(svg_scale * image->width + 0.5f);
+ int height = (int)(svg_scale * image->height + 0.5f);
+ int n_pixels = width * height;
+ if (n_pixels <= 0) {
+ ::nsvgDelete(image);
+ return empty_vector;
+ }
+
+ NSVGrasterizer* rast = ::nsvgCreateRasterizer();
+ if (rast == nullptr) {
+ ::nsvgDelete(image);
+ return empty_vector;
+ }
+
+ std::vector<unsigned char> data(n_pixels * 4, 0);
+ ::nsvgRasterize(rast, image, 0, 0, svg_scale, data.data(), width, height, width * 4);
+ ::nsvgDeleteRasterizer(rast);
+ ::nsvgDelete(image);
+
+ return data;
+}
+
void ImGuiWrapper::init_font(bool compress)
{
destroy_font();
@@ -475,7 +931,7 @@ void ImGuiWrapper::init_font(bool compress)
if (font == nullptr) {
font = io.Fonts->AddFontDefault();
if (font == nullptr) {
- throw std::runtime_error("ImGui: Could not load deafult font");
+ throw Slic3r::RuntimeError("ImGui: Could not load deafult font");
}
}
@@ -489,11 +945,53 @@ void ImGuiWrapper::init_font(bool compress)
}
#endif
+ float font_scale = m_font_size/15;
+ int icon_sz = lround(16 * font_scale); // default size of icon is 16 px
+
+ int rect_id = io.Fonts->CustomRects.Size; // id of the rectangle added next
+ // add rectangles for the icons to the font atlas
+ for (auto& icon : font_icons)
+ io.Fonts->AddCustomRectFontGlyph(font, icon.first, icon_sz, icon_sz, 3.0 * font_scale + icon_sz);
+ for (auto& icon : font_icons_large)
+ io.Fonts->AddCustomRectFontGlyph(font, icon.first, icon_sz * 2, icon_sz * 2, 3.0 * font_scale + icon_sz * 2);
+
// Build texture atlas
unsigned char* pixels;
int width, height;
io.Fonts->GetTexDataAsRGBA32(&pixels, &width, &height); // Load as RGBA 32-bits (75% of the memory is wasted, but default font is so small) because it is more likely to be compatible with user's existing shaders. If your ImTextureId represent a higher-level concept than just a GL texture id, consider calling GetTexDataAsAlpha8() instead to save on GPU memory.
+ // Fill rectangles from the SVG-icons
+ for (auto icon : font_icons) {
+ if (const ImFontAtlas::CustomRect* rect = io.Fonts->GetCustomRectByIndex(rect_id)) {
+ assert(rect->Width == icon_sz);
+ assert(rect->Height == icon_sz);
+ std::vector<unsigned char> raw_data = load_svg(icon.second, icon_sz, icon_sz);
+ const ImU32* pIn = (ImU32*)raw_data.data();
+ for (int y = 0; y < icon_sz; y++) {
+ ImU32* pOut = (ImU32*)pixels + (rect->Y + y) * width + (rect->X);
+ for (int x = 0; x < icon_sz; x++)
+ *pOut++ = *pIn++;
+ }
+ }
+ rect_id++;
+ }
+
+ icon_sz *= 2; // default size of large icon is 32 px
+ for (auto icon : font_icons_large) {
+ if (const ImFontAtlas::CustomRect* rect = io.Fonts->GetCustomRectByIndex(rect_id)) {
+ assert(rect->Width == icon_sz);
+ assert(rect->Height == icon_sz);
+ std::vector<unsigned char> raw_data = load_svg(icon.second, icon_sz, icon_sz);
+ const ImU32* pIn = (ImU32*)raw_data.data();
+ for (int y = 0; y < icon_sz; y++) {
+ ImU32* pOut = (ImU32*)pixels + (rect->Y + y) * width + (rect->X);
+ for (int x = 0; x < icon_sz; x++)
+ *pOut++ = *pIn++;
+ }
+ }
+ rect_id++;
+ }
+
// Upload texture to graphics system
GLint last_texture;
glsafe(::glGetIntegerv(GL_TEXTURE_BINDING_2D, &last_texture));
@@ -554,23 +1052,13 @@ void ImGuiWrapper::init_style()
{
ImGuiStyle &style = ImGui::GetStyle();
- auto set_color = [&](ImGuiCol_ col, unsigned hex_color) {
- style.Colors[col] = ImVec4(
- ((hex_color >> 24) & 0xff) / 255.0f,
- ((hex_color >> 16) & 0xff) / 255.0f,
- ((hex_color >> 8) & 0xff) / 255.0f,
- (hex_color & 0xff) / 255.0f);
+ auto set_color = [&](ImGuiCol_ entity, ImVec4 color) {
+ style.Colors[entity] = color;
};
- static const unsigned COL_WINDOW_BACKGROND = 0x222222cc;
- static const unsigned COL_GREY_DARK = 0x555555ff;
- static const unsigned COL_GREY_LIGHT = 0x666666ff;
- static const unsigned COL_ORANGE_DARK = 0xc16737ff;
- static const unsigned COL_ORANGE_LIGHT = 0xff7d38ff;
-
// Window
style.WindowRounding = 4.0f;
- set_color(ImGuiCol_WindowBg, COL_WINDOW_BACKGROND);
+ set_color(ImGuiCol_WindowBg, COL_WINDOW_BACKGROUND);
set_color(ImGuiCol_TitleBgActive, COL_ORANGE_DARK);
// Generics
@@ -582,9 +1070,9 @@ void ImGuiWrapper::init_style()
set_color(ImGuiCol_TextSelectedBg, COL_ORANGE_DARK);
// Buttons
- set_color(ImGuiCol_Button, COL_ORANGE_DARK);
- set_color(ImGuiCol_ButtonHovered, COL_ORANGE_LIGHT);
- set_color(ImGuiCol_ButtonActive, COL_ORANGE_LIGHT);
+ set_color(ImGuiCol_Button, COL_BUTTON_BACKGROUND);
+ set_color(ImGuiCol_ButtonHovered, COL_BUTTON_HOVERED);
+ set_color(ImGuiCol_ButtonActive, COL_BUTTON_ACTIVE);
// Checkbox
set_color(ImGuiCol_CheckMark, COL_ORANGE_LIGHT);
@@ -600,6 +1088,13 @@ void ImGuiWrapper::init_style()
// Separator
set_color(ImGuiCol_Separator, COL_ORANGE_LIGHT);
+
+ // Tabs
+ set_color(ImGuiCol_Tab, COL_ORANGE_DARK);
+ set_color(ImGuiCol_TabHovered, COL_ORANGE_LIGHT);
+ set_color(ImGuiCol_TabActive, COL_ORANGE_LIGHT);
+ set_color(ImGuiCol_TabUnfocused, COL_GREY_DARK);
+ set_color(ImGuiCol_TabUnfocusedActive, COL_GREY_LIGHT);
}
void ImGuiWrapper::render_draw_data(ImDrawData *draw_data)
diff --git a/src/slic3r/GUI/ImGuiWrapper.hpp b/src/slic3r/GUI/ImGuiWrapper.hpp
index 417561881..5484e46c6 100644
--- a/src/slic3r/GUI/ImGuiWrapper.hpp
+++ b/src/slic3r/GUI/ImGuiWrapper.hpp
@@ -8,6 +8,10 @@
#include "libslic3r/Point.hpp"
+namespace Slic3r {namespace Search {
+struct OptionViewParameters;
+}}
+
class wxString;
class wxMouseEvent;
class wxKeyEvent;
@@ -53,6 +57,7 @@ public:
void set_next_window_pos(float x, float y, int flag, float pivot_x = 0.0f, float pivot_y = 0.0f);
void set_next_window_bg_alpha(float alpha);
+ void set_next_window_size(float x, float y, ImGuiCond cond);
bool begin(const std::string &name, int flags = 0);
bool begin(const wxString &name, int flags = 0);
@@ -61,7 +66,9 @@ public:
void end();
bool button(const wxString &label);
+ bool button(const wxString& label, float width, float height);
bool radio_button(const wxString &label, bool active);
+ bool image_button();
bool input_double(const std::string &label, const double &value, const std::string &format = "%.3f");
bool input_double(const wxString &label, const double &value, const std::string &format = "%.3f");
bool input_vec3(const std::string &label, const Vec3d &value, float width, const std::string &format = "%.3f");
@@ -69,11 +76,17 @@ public:
void text(const char *label);
void text(const std::string &label);
void text(const wxString &label);
+ void text_colored(const ImVec4& color, const char* label);
+ void text_colored(const ImVec4& color, const std::string& label);
+ void text_colored(const ImVec4& color, const wxString& label);
bool slider_float(const char* label, float* v, float v_min, float v_max, const char* format = "%.3f", float power = 1.0f);
bool slider_float(const std::string& label, float* v, float v_min, float v_max, const char* format = "%.3f", float power = 1.0f);
bool slider_float(const wxString& label, float* v, float v_min, float v_max, const char* format = "%.3f", float power = 1.0f);
bool combo(const wxString& label, const std::vector<std::string>& options, int& selection); // Use -1 to not mark any option as selected
- bool undo_redo_list(const ImVec2& size, const bool is_undo, bool (*items_getter)(const bool, int, const char**), int& hovered, int& selected);
+ bool undo_redo_list(const ImVec2& size, const bool is_undo, bool (*items_getter)(const bool, int, const char**), int& hovered, int& selected, int& mouse_wheel);
+ void search_list(const ImVec2& size, bool (*items_getter)(int, const char** label, const char** tooltip), char* search_str,
+ Search::OptionViewParameters& view_params, int& selected, bool& edited, int& mouse_wheel, bool is_localized);
+ void title(const std::string& str);
void disabled_begin(bool disabled);
void disabled_end();
@@ -83,6 +96,15 @@ public:
bool want_text_input() const;
bool want_any_input() const;
+ static const ImVec4 COL_GREY_DARK;
+ static const ImVec4 COL_GREY_LIGHT;
+ static const ImVec4 COL_ORANGE_DARK;
+ static const ImVec4 COL_ORANGE_LIGHT;
+ static const ImVec4 COL_WINDOW_BACKGROUND;
+ static const ImVec4 COL_BUTTON_BACKGROUND;
+ static const ImVec4 COL_BUTTON_HOVERED;
+ static const ImVec4 COL_BUTTON_ACTIVE;
+
private:
void init_font(bool compress);
void init_input();
@@ -90,6 +112,7 @@ private:
void render_draw_data(ImDrawData *draw_data);
bool display_initialized() const;
void destroy_font();
+ std::vector<unsigned char> load_svg(const std::string& bitmap_name, unsigned target_width, unsigned target_height);
static const char* clipboard_get(void* user_data);
static void clipboard_set(void* user_data, const char* text);
diff --git a/src/slic3r/GUI/InstanceCheck.cpp b/src/slic3r/GUI/InstanceCheck.cpp
new file mode 100644
index 000000000..6cfa879c8
--- /dev/null
+++ b/src/slic3r/GUI/InstanceCheck.cpp
@@ -0,0 +1,623 @@
+#include "GUI_App.hpp"
+#include "InstanceCheck.hpp"
+#include "Plater.hpp"
+
+#ifdef _WIN32
+ #include "MainFrame.hpp"
+#endif
+
+#include "libslic3r/Utils.hpp"
+#include "libslic3r/Config.hpp"
+
+#include "boost/nowide/convert.hpp"
+#include <boost/log/trivial.hpp>
+#include <boost/filesystem/operations.hpp>
+#include <iostream>
+#include <unordered_map>
+#include <fcntl.h>
+#include <errno.h>
+#include <optional>
+#include <cstdint>
+
+#ifdef _WIN32
+#include <strsafe.h>
+#endif //WIN32
+
+#if __linux__
+#include <dbus/dbus.h> /* Pull in all of D-Bus headers. */
+#endif //__linux__
+
+namespace Slic3r {
+namespace instance_check_internal
+{
+ struct CommandLineAnalysis
+ {
+ std::optional<bool> should_send;
+ std::string cl_string;
+ };
+ static CommandLineAnalysis process_command_line(int argc, char** argv)
+ {
+ CommandLineAnalysis ret;
+ //if (argc < 2)
+ // return ret;
+ std::vector<std::string> arguments { argv[0] };
+ for (size_t i = 1; i < argc; ++i) {
+ const std::string token = argv[i];
+ // Processing of boolean command line arguments shall match DynamicConfig::read_cli().
+ if (token == "--single-instance")
+ ret.should_send = true;
+ else if (token == "--no-single-instance")
+ ret.should_send = false;
+ else
+ arguments.emplace_back(token);
+ }
+ ret.cl_string = escape_strings_cstyle(arguments);
+ BOOST_LOG_TRIVIAL(debug) << "single instance: " <<
+ (ret.should_send.has_value() ? (*ret.should_send ? "true" : "false") : "undefined") <<
+ ". other params: " << ret.cl_string;
+ return ret;
+ }
+
+
+
+#ifdef _WIN32
+
+ static HWND l_prusa_slicer_hwnd;
+ static BOOL CALLBACK EnumWindowsProc(_In_ HWND hwnd, _In_ LPARAM lParam)
+ {
+ //checks for other instances of prusaslicer, if found brings it to front and return false to stop enumeration and quit this instance
+ //search is done by classname(wxWindowNR is wxwidgets thing, so probably not unique) and name in window upper panel
+ //other option would be do a mutex and check for its existence
+ //BOOST_LOG_TRIVIAL(error) << "ewp: version: " << l_version_wstring;
+ TCHAR wndText[1000];
+ TCHAR className[1000];
+ int err;
+ err = GetClassName(hwnd, className, 1000);
+ if (err == 0)
+ return true;
+ err = GetWindowText(hwnd, wndText, 1000);
+ if (err == 0)
+ return true;
+ std::wstring classNameString(className);
+ std::wstring wndTextString(wndText);
+ if (wndTextString.find(L"PrusaSlicer") != std::wstring::npos && classNameString == L"wxWindowNR") {
+ //check if other instances has same instance hash
+ //if not it is not same version(binary) as this version
+ HANDLE handle = GetProp(hwnd, L"Instance_Hash_Minor");
+ uint64_t other_instance_hash = PtrToUint(handle);
+ uint64_t other_instance_hash_major;
+ uint64_t my_instance_hash = GUI::wxGetApp().get_instance_hash_int();
+ handle = GetProp(hwnd, L"Instance_Hash_Major");
+ other_instance_hash_major = PtrToUint(handle);
+ other_instance_hash_major = other_instance_hash_major << 32;
+ other_instance_hash += other_instance_hash_major;
+ if(my_instance_hash == other_instance_hash)
+ {
+ BOOST_LOG_TRIVIAL(debug) << "win enum - found correct instance";
+ l_prusa_slicer_hwnd = hwnd;
+ ShowWindow(hwnd, SW_SHOWMAXIMIZED);
+ SetForegroundWindow(hwnd);
+ return false;
+ }
+ BOOST_LOG_TRIVIAL(debug) << "win enum - found wrong instance";
+ }
+ return true;
+ }
+ static bool send_message(const std::string& message, const std::string &version)
+ {
+ if (!EnumWindows(EnumWindowsProc, 0)) {
+ std::wstring wstr = boost::nowide::widen(message);
+ std::unique_ptr<LPWSTR> command_line_args = std::make_unique<LPWSTR>(const_cast<LPWSTR>(wstr.c_str()));
+ /*LPWSTR command_line_args = new wchar_t[wstr.size() + 1];
+ copy(wstr.begin(), wstr.end(), command_line_args);
+ command_line_args[wstr.size()] = 0;*/
+
+ //Create a COPYDATASTRUCT to send the information
+ //cbData represents the size of the information we want to send.
+ //lpData represents the information we want to send.
+ //dwData is an ID defined by us(this is a type of ID different than WM_COPYDATA).
+ COPYDATASTRUCT data_to_send = { 0 };
+ data_to_send.dwData = 1;
+ data_to_send.cbData = sizeof(TCHAR) * (wcslen(*command_line_args.get()) + 1);
+ data_to_send.lpData = *command_line_args.get();
+ SendMessage(l_prusa_slicer_hwnd, WM_COPYDATA, 0, (LPARAM)&data_to_send);
+ return true;
+ }
+ return false;
+ }
+
+#else
+
+ static bool get_lock(const std::string& name, const std::string& path)
+ {
+ std::string dest_dir = path + name;
+ BOOST_LOG_TRIVIAL(debug) <<"full lock path: "<< dest_dir;
+ struct flock fl;
+ int fdlock;
+ fl.l_type = F_WRLCK;
+ fl.l_whence = SEEK_SET;
+ fl.l_start = 0;
+ fl.l_len = 1;
+
+ if (! boost::filesystem::is_directory(path)) {
+ BOOST_LOG_TRIVIAL(debug) << "get_lock(): datadir does not exist yet, creating...";
+ if (! boost::filesystem::create_directories(path))
+ BOOST_LOG_TRIVIAL(debug) << "get_lock(): unable to create datadir !!!";
+ }
+
+ if ((fdlock = open(dest_dir.c_str(), O_WRONLY | O_CREAT, 0666)) == -1)
+ return true;
+
+ if (fcntl(fdlock, F_SETLK, &fl) == -1)
+ return true;
+
+ return false;
+ }
+
+#endif //WIN32
+#if defined(__APPLE__)
+
+ static bool send_message(const std::string &message_text, const std::string &version)
+ {
+ //std::string v(version);
+ //std::replace(v.begin(), v.end(), '.', '-');
+ //if (!instance_check_internal::get_lock(v))
+ {
+ send_message_mac(message_text, version);
+ return true;
+ }
+ return false;
+ }
+
+#elif defined(__linux__)
+
+ static bool send_message(const std::string &message_text, const std::string &version)
+ {
+ /*std::string v(version);
+ std::replace(v.begin(), v.end(), '.', '-');
+ if (!instance_check_internal::get_lock(v))*/
+ /*auto checker = new wxSingleInstanceChecker;
+ if ( !checker->IsAnotherRunning() ) */
+ {
+ DBusMessage* msg;
+ DBusMessageIter args;
+ DBusConnection* conn;
+ DBusError err;
+ dbus_uint32_t serial = 0;
+ const char* sigval = message_text.c_str();
+ //std::string interface_name = "com.prusa3d.prusaslicer.InstanceCheck";
+ std::string interface_name = "com.prusa3d.prusaslicer.InstanceCheck.Object" + version;
+ std::string method_name = "AnotherInstance";
+ //std::string object_name = "/com/prusa3d/prusaslicer/InstanceCheck";
+ std::string object_name = "/com/prusa3d/prusaslicer/InstanceCheck/Object" + version;
+
+
+ // initialise the error value
+ dbus_error_init(&err);
+
+ // connect to bus, and check for errors (use SESSION bus everywhere!)
+ conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
+ if (dbus_error_is_set(&err)) {
+ BOOST_LOG_TRIVIAL(error) << "DBus Connection Error. Message to another instance wont be send.";
+ BOOST_LOG_TRIVIAL(error) << "DBus Connection Error: " << err.message;
+ dbus_error_free(&err);
+ return true;
+ }
+ if (NULL == conn) {
+ BOOST_LOG_TRIVIAL(error) << "DBus Connection is NULL. Message to another instance wont be send.";
+ return true;
+ }
+
+ //some sources do request interface ownership before constructing msg but i think its wrong.
+
+ //create new method call message
+ msg = dbus_message_new_method_call(interface_name.c_str(), object_name.c_str(), interface_name.c_str(), method_name.c_str());
+ if (NULL == msg) {
+ BOOST_LOG_TRIVIAL(error) << "DBus Message is NULL. Message to another instance wont be send.";
+ dbus_connection_unref(conn);
+ return true;
+ }
+ //the AnotherInstance method is not sending reply.
+ dbus_message_set_no_reply(msg, TRUE);
+
+ //append arguments to message
+ if (!dbus_message_append_args(msg, DBUS_TYPE_STRING, &sigval, DBUS_TYPE_INVALID)) {
+ BOOST_LOG_TRIVIAL(error) << "Ran out of memory while constructing args for DBus message. Message to another instance wont be send.";
+ dbus_message_unref(msg);
+ dbus_connection_unref(conn);
+ return true;
+ }
+
+ // send the message and flush the connection
+ if (!dbus_connection_send(conn, msg, &serial)) {
+ BOOST_LOG_TRIVIAL(error) << "Ran out of memory while sending DBus message.";
+ dbus_message_unref(msg);
+ dbus_connection_unref(conn);
+ return true;
+ }
+ dbus_connection_flush(conn);
+
+ BOOST_LOG_TRIVIAL(trace) << "DBus message sent.";
+
+ // free the message and close the connection
+ dbus_message_unref(msg);
+ dbus_connection_unref(conn);
+ return true;
+ }
+ return false;
+ }
+
+#endif //__APPLE__/__linux__
+} //namespace instance_check_internal
+
+bool instance_check(int argc, char** argv, bool app_config_single_instance)
+{
+ std::size_t hashed_path;
+#ifdef _WIN32
+ hashed_path = std::hash<std::string>{}(boost::filesystem::system_complete(argv[0]).string());
+#else
+ boost::system::error_code ec;
+#ifdef __linux__
+ // If executed by an AppImage, start the AppImage, not the main process.
+ // see https://docs.appimage.org/packaging-guide/environment-variables.html#id2
+ const char *appimage_env = std::getenv("APPIMAGE");
+ bool appimage_env_valid = false;
+ if (appimage_env) {
+ try {
+ auto appimage_path = boost::filesystem::canonical(boost::filesystem::path(appimage_env));
+ if (boost::filesystem::exists(appimage_path)) {
+ hashed_path = std::hash<std::string>{}(appimage_path.string());
+ appimage_env_valid = true;
+ }
+ } catch (std::exception &) {
+ }
+ if (! appimage_env_valid)
+ BOOST_LOG_TRIVIAL(error) << "APPIMAGE environment variable was set, but it does not point to a valid file: " << appimage_env;
+ }
+ if (! appimage_env_valid)
+#endif // __linux__
+ hashed_path = std::hash<std::string>{}(boost::filesystem::canonical(boost::filesystem::system_complete(argv[0]), ec).string());
+ if (ec.value() > 0) { // canonical was not able to find the executable (can happen with appimage on some systems. Does it fail on Fuse file systems?)
+ ec.clear();
+ // Compose path with boost canonical of folder and filename
+ hashed_path = std::hash<std::string>{}(boost::filesystem::canonical(boost::filesystem::system_complete(argv[0]).parent_path(), ec).string() + "/" + boost::filesystem::system_complete(argv[0]).filename().string());
+ if (ec.value() > 0) {
+ // Still not valid, process without canonical
+ hashed_path = std::hash<std::string>{}(boost::filesystem::system_complete(argv[0]).string());
+ }
+ }
+#endif // _WIN32
+
+ std::string lock_name = std::to_string(hashed_path);
+ GUI::wxGetApp().set_instance_hash(hashed_path);
+ BOOST_LOG_TRIVIAL(debug) <<"full path: "<< lock_name;
+ instance_check_internal::CommandLineAnalysis cla = instance_check_internal::process_command_line(argc, argv);
+ if (! cla.should_send.has_value())
+ cla.should_send = app_config_single_instance;
+#ifdef _WIN32
+ GUI::wxGetApp().init_single_instance_checker(lock_name + ".lock", data_dir() + "/cache/");
+ if (cla.should_send.value() && GUI::wxGetApp().single_instance_checker()->IsAnotherRunning()) {
+#else // mac & linx
+ // get_lock() creates the lockfile therefore *cla.should_send is checked after
+ if (instance_check_internal::get_lock(lock_name + ".lock", data_dir() + "/cache/") && *cla.should_send) {
+#endif
+ instance_check_internal::send_message(cla.cl_string, lock_name);
+ BOOST_LOG_TRIVIAL(info) << "instance check: Another instance found. This instance will terminate.";
+ return true;
+ }
+ BOOST_LOG_TRIVIAL(info) << "instance check: Another instance not found or single-instance not set.";
+ return false;
+}
+
+#ifdef __APPLE__
+bool unlock_lockfile(const std::string& name, const std::string& path)
+{
+ std::string dest_dir = path + name;
+ //BOOST_LOG_TRIVIAL(debug) << "full lock path: " << dest_dir;
+ struct flock fl;
+ int fdlock;
+ fl.l_type = F_UNLCK;
+ fl.l_whence = SEEK_SET;
+ fl.l_start = 0;
+ fl.l_len = 1;
+ if ((fdlock = open(dest_dir.c_str(), O_WRONLY | O_CREAT, 0666)) == -1)
+ return false;
+
+ if (fcntl(fdlock, F_SETLK, &fl) == -1)
+ return false;
+
+ return true;
+}
+#endif //__APPLE__
+namespace GUI {
+
+wxDEFINE_EVENT(EVT_LOAD_MODEL_OTHER_INSTANCE, LoadFromOtherInstanceEvent);
+wxDEFINE_EVENT(EVT_INSTANCE_GO_TO_FRONT, InstanceGoToFrontEvent);
+
+void OtherInstanceMessageHandler::init(wxEvtHandler* callback_evt_handler)
+{
+ assert(!m_initialized);
+ assert(m_callback_evt_handler == nullptr);
+ if (m_initialized)
+ return;
+
+ m_initialized = true;
+ m_callback_evt_handler = callback_evt_handler;
+
+#if defined(__APPLE__)
+ this->register_for_messages(wxGetApp().get_instance_hash_string());
+#endif //__APPLE__
+
+#ifdef BACKGROUND_MESSAGE_LISTENER
+ m_thread = boost::thread((boost::bind(&OtherInstanceMessageHandler::listen, this)));
+#endif //BACKGROUND_MESSAGE_LISTENER
+}
+void OtherInstanceMessageHandler::shutdown(MainFrame* main_frame)
+{
+ BOOST_LOG_TRIVIAL(debug) << "message handler shutdown().";
+ assert(m_initialized);
+ if (m_initialized) {
+#ifdef _WIN32
+ HWND hwnd = main_frame->GetHandle();
+ RemoveProp(hwnd, L"Instance_Hash_Minor");
+ RemoveProp(hwnd, L"Instance_Hash_Major");
+#endif //_WIN32
+#if __APPLE__
+ //delete macos implementation
+ this->unregister_for_messages();
+#endif //__APPLE__
+#ifdef BACKGROUND_MESSAGE_LISTENER
+ if (m_thread.joinable()) {
+ // Stop the worker thread, if running.
+ {
+ // Notify the worker thread to cancel wait on detection polling.
+ std::lock_guard<std::mutex> lck(m_thread_stop_mutex);
+ m_stop = true;
+ }
+ m_thread_stop_condition.notify_all();
+ // Wait for the worker thread to stop.
+ m_thread.join();
+ m_stop = false;
+ }
+#endif //BACKGROUND_MESSAGE_LISTENER
+ m_callback_evt_handler = nullptr;
+ m_initialized = false;
+ }
+}
+
+#ifdef _WIN32
+void OtherInstanceMessageHandler::init_windows_properties(MainFrame* main_frame, size_t instance_hash)
+{
+ size_t minor_hash = instance_hash & 0xFFFFFFFF;
+ size_t major_hash = (instance_hash & 0xFFFFFFFF00000000) >> 32;
+ HWND hwnd = main_frame->GetHandle();
+ HANDLE handle_minor = UIntToPtr(minor_hash);
+ HANDLE handle_major = UIntToPtr(major_hash);
+ SetProp(hwnd, L"Instance_Hash_Minor", handle_minor);
+ SetProp(hwnd, L"Instance_Hash_Major", handle_major);
+ //BOOST_LOG_TRIVIAL(debug) << "window properties initialized " << instance_hash << " (" << minor_hash << " & "<< major_hash;
+}
+
+#if 0
+
+void OtherInstanceMessageHandler::print_window_info(HWND hwnd)
+{
+ std::wstring instance_hash = boost::nowide::widen(wxGetApp().get_instance_hash_string());
+ TCHAR wndText[1000];
+ TCHAR className[1000];
+ GetClassName(hwnd, className, 1000);
+ GetWindowText(hwnd, wndText, 1000);
+ std::wstring classNameString(className);
+ std::wstring wndTextString(wndText);
+ HANDLE handle = GetProp(hwnd, L"Instance_Hash_Minor");
+ size_t result = PtrToUint(handle);
+ handle = GetProp(hwnd, L"Instance_Hash_Major");
+ size_t r2 = PtrToUint(handle);
+ r2 = (r2 << 32);
+ result += r2;
+ BOOST_LOG_TRIVIAL(info) << "window info: " << result;
+}
+#endif //0
+#endif //WIN32
+namespace MessageHandlerInternal
+{
+ // returns ::path to possible model or empty ::path if input string is not existing path
+ static boost::filesystem::path get_path(const std::string& possible_path)
+ {
+ BOOST_LOG_TRIVIAL(debug) << "message part:" << possible_path;
+
+ if (possible_path.empty() || possible_path.size() < 3) {
+ BOOST_LOG_TRIVIAL(debug) << "empty";
+ return boost::filesystem::path();
+ }
+ if (boost::filesystem::exists(possible_path)) {
+ BOOST_LOG_TRIVIAL(debug) << "is path";
+ return boost::filesystem::path(possible_path);
+ } else if (possible_path[0] == '\"') {
+ if(boost::filesystem::exists(possible_path.substr(1, possible_path.size() - 2))) {
+ BOOST_LOG_TRIVIAL(debug) << "is path in quotes";
+ return boost::filesystem::path(possible_path.substr(1, possible_path.size() - 2));
+ }
+ }
+ BOOST_LOG_TRIVIAL(debug) << "is NOT path";
+ return boost::filesystem::path();
+ }
+} //namespace MessageHandlerInternal
+
+void OtherInstanceMessageHandler::handle_message(const std::string& message)
+{
+ BOOST_LOG_TRIVIAL(info) << "message from other instance: " << message;
+
+ std::vector<std::string> args;
+ bool parsed = unescape_strings_cstyle(message, args);
+ assert(parsed);
+ if (! parsed) {
+ BOOST_LOG_TRIVIAL(error) << "message from other instance is incorrectly formatted: " << message;
+ return;
+ }
+
+ std::vector<boost::filesystem::path> paths;
+ // Skip the first argument, it is the path to the slicer executable.
+ auto it = args.begin();
+ for (++ it; it != args.end(); ++ it) {
+ boost::filesystem::path p = MessageHandlerInternal::get_path(*it);
+ if (! p.string().empty())
+ paths.emplace_back(p);
+ }
+ if (! paths.empty()) {
+ //wxEvtHandler* evt_handler = wxGetApp().plater(); //assert here?
+ //if (evt_handler) {
+ wxPostEvent(m_callback_evt_handler, LoadFromOtherInstanceEvent(GUI::EVT_LOAD_MODEL_OTHER_INSTANCE, std::vector<boost::filesystem::path>(std::move(paths))));
+ //}
+ }
+}
+
+#ifdef BACKGROUND_MESSAGE_LISTENER
+
+namespace MessageHandlerDBusInternal
+{
+ //reply to introspect makes our DBus object visible for other programs like D-Feet
+ static void respond_to_introspect(DBusConnection *connection, DBusMessage *request)
+ {
+ DBusMessage *reply;
+ const char *introspection_data =
+ " <!DOCTYPE node PUBLIC \"-//freedesktop//DTD D-BUS Object Introspection 1.0//EN\" "
+ "\"http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd\">"
+ " <!-- dbus-sharp 0.8.1 -->"
+ " <node>"
+ " <interface name=\"org.freedesktop.DBus.Introspectable\">"
+ " <method name=\"Introspect\">"
+ " <arg name=\"data\" direction=\"out\" type=\"s\" />"
+ " </method>"
+ " </interface>"
+ " <interface name=\"com.prusa3d.prusaslicer.InstanceCheck\">"
+ " <method name=\"AnotherInstance\">"
+ " <arg name=\"data\" direction=\"in\" type=\"s\" />"
+ " </method>"
+ " </interface>"
+ " </node>";
+
+ reply = dbus_message_new_method_return(request);
+ dbus_message_append_args(reply, DBUS_TYPE_STRING, &introspection_data, DBUS_TYPE_INVALID);
+ dbus_connection_send(connection, reply, NULL);
+ dbus_message_unref(reply);
+ }
+ //method AnotherInstance receives message from another PrusaSlicer instance
+ static void handle_method_another_instance(DBusConnection *connection, DBusMessage *request)
+ {
+ DBusError err;
+ char* text = nullptr;
+ wxEvtHandler* evt_handler;
+
+ dbus_error_init(&err);
+ dbus_message_get_args(request, &err, DBUS_TYPE_STRING, &text, DBUS_TYPE_INVALID);
+ if (dbus_error_is_set(&err)) {
+ BOOST_LOG_TRIVIAL(trace) << "Dbus method AnotherInstance received with wrong arguments.";
+ dbus_error_free(&err);
+ return;
+ }
+ wxGetApp().other_instance_message_handler()->handle_message(text);
+
+ evt_handler = wxGetApp().plater();
+ if (evt_handler) {
+ wxPostEvent(evt_handler, InstanceGoToFrontEvent(EVT_INSTANCE_GO_TO_FRONT));
+ }
+ }
+ //every dbus message received comes here
+ static DBusHandlerResult handle_dbus_object_message(DBusConnection *connection, DBusMessage *message, void *user_data)
+ {
+ const char* interface_name = dbus_message_get_interface(message);
+ const char* member_name = dbus_message_get_member(message);
+ std::string our_interface = "com.prusa3d.prusaslicer.InstanceCheck.Object" + wxGetApp().get_instance_hash_string();
+ BOOST_LOG_TRIVIAL(trace) << "DBus message received: interface: " << interface_name << ", member: " << member_name;
+ if (0 == strcmp("org.freedesktop.DBus.Introspectable", interface_name) && 0 == strcmp("Introspect", member_name)) {
+ respond_to_introspect(connection, message);
+ return DBUS_HANDLER_RESULT_HANDLED;
+ } else if (0 == strcmp(our_interface.c_str(), interface_name) && 0 == strcmp("AnotherInstance", member_name)) {
+ handle_method_another_instance(connection, message);
+ return DBUS_HANDLER_RESULT_HANDLED;
+ }
+ return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;
+ }
+} //namespace MessageHandlerDBusInternal
+
+void OtherInstanceMessageHandler::listen()
+{
+ DBusConnection* conn;
+ DBusError err;
+ int name_req_val;
+ DBusObjectPathVTable vtable;
+ std::string instance_hash = wxGetApp().get_instance_hash_string();
+ std::string interface_name = "com.prusa3d.prusaslicer.InstanceCheck.Object" + instance_hash;
+ std::string object_name = "/com/prusa3d/prusaslicer/InstanceCheck/Object" + instance_hash;
+
+ //BOOST_LOG_TRIVIAL(debug) << "init dbus listen " << interface_name << " " << object_name;
+ dbus_error_init(&err);
+
+ // connect to the bus and check for errors (use SESSION bus everywhere!)
+ conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
+ if (dbus_error_is_set(&err)) {
+ BOOST_LOG_TRIVIAL(error) << "DBus Connection Error: "<< err.message;
+ BOOST_LOG_TRIVIAL(error) << "Dbus Messages listening terminating.";
+ dbus_error_free(&err);
+ return;
+ }
+ if (NULL == conn) {
+ BOOST_LOG_TRIVIAL(error) << "DBus Connection is NULL. Dbus Messages listening terminating.";
+ return;
+ }
+
+ // request our name on the bus and check for errors
+ name_req_val = dbus_bus_request_name(conn, interface_name.c_str(), DBUS_NAME_FLAG_REPLACE_EXISTING , &err);
+ if (dbus_error_is_set(&err)) {
+ BOOST_LOG_TRIVIAL(error) << "DBus Request name Error: "<< err.message;
+ BOOST_LOG_TRIVIAL(error) << "Dbus Messages listening terminating.";
+ dbus_error_free(&err);
+ dbus_connection_unref(conn);
+ return;
+ }
+ if (DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER != name_req_val) {
+ BOOST_LOG_TRIVIAL(error) << "Not primary owner of DBus name - probably another PrusaSlicer instance is running.";
+ BOOST_LOG_TRIVIAL(error) << "Dbus Messages listening terminating.";
+ dbus_connection_unref(conn);
+ return;
+ }
+
+ // Set callbacks. Unregister function should not be nessary.
+ vtable.message_function = MessageHandlerDBusInternal::handle_dbus_object_message;
+ vtable.unregister_function = NULL;
+
+ // register new object - this is our access to DBus
+ dbus_connection_try_register_object_path(conn, object_name.c_str(), &vtable, NULL, &err);
+ if ( dbus_error_is_set(&err) ) {
+ BOOST_LOG_TRIVIAL(error) << "DBus Register object Error: "<< err.message;
+ BOOST_LOG_TRIVIAL(error) << "Dbus Messages listening terminating.";
+ dbus_connection_unref(conn);
+ dbus_error_free(&err);
+ return;
+ }
+
+ BOOST_LOG_TRIVIAL(trace) << "Dbus object "<< object_name <<" registered. Starting listening for messages.";
+
+ for (;;) {
+ // Wait for 1 second
+ // Cancellable.
+ {
+ std::unique_lock<std::mutex> lck(m_thread_stop_mutex);
+ m_thread_stop_condition.wait_for(lck, std::chrono::seconds(1), [this] { return m_stop; });
+ }
+ if (m_stop)
+ // Stop the worker thread.
+
+ break;
+ //dispatch should do all the work with incoming messages
+ //second parameter is blocking time that funciton waits for new messages
+ //that is handled here with our own event loop above
+ dbus_connection_read_write_dispatch(conn, 0);
+ }
+
+ dbus_connection_unref(conn);
+}
+#endif //BACKGROUND_MESSAGE_LISTENER
+} // namespace GUI
+} // namespace Slic3r
diff --git a/src/slic3r/GUI/InstanceCheck.hpp b/src/slic3r/GUI/InstanceCheck.hpp
new file mode 100644
index 000000000..9fb74b0a9
--- /dev/null
+++ b/src/slic3r/GUI/InstanceCheck.hpp
@@ -0,0 +1,101 @@
+#ifndef slic3r_InstanceCheck_hpp_
+#define slic3r_InstanceCheck_hpp_
+
+#include "Event.hpp"
+
+#if _WIN32
+#include <windows.h>
+#endif //_WIN32
+
+#include <string>
+
+#include <boost/filesystem.hpp>
+
+#if __linux__
+#include <boost/thread.hpp>
+#include <tbb/mutex.h>
+#include <condition_variable>
+#endif // __linux__
+
+
+namespace Slic3r {
+// checks for other running instances and sends them argv,
+// if there is --single-instance argument or AppConfig is set to single_instance=1
+// returns true if this instance should terminate
+bool instance_check(int argc, char** argv, bool app_config_single_instance);
+
+#if __APPLE__
+// apple implementation of inner functions of instance_check
+// in InstanceCheckMac.mm
+void send_message_mac(const std::string& msg, const std::string& version);
+
+bool unlock_lockfile(const std::string& name, const std::string& path);
+#endif //__APPLE__
+
+namespace GUI {
+
+class MainFrame;
+
+#if __linux__
+ #define BACKGROUND_MESSAGE_LISTENER
+#endif // __linux__
+
+using LoadFromOtherInstanceEvent = Event<std::vector<boost::filesystem::path>>;
+wxDECLARE_EVENT(EVT_LOAD_MODEL_OTHER_INSTANCE, LoadFromOtherInstanceEvent);
+
+using InstanceGoToFrontEvent = SimpleEvent;
+wxDECLARE_EVENT(EVT_INSTANCE_GO_TO_FRONT, InstanceGoToFrontEvent);
+
+class OtherInstanceMessageHandler
+{
+public:
+ OtherInstanceMessageHandler() = default;
+ OtherInstanceMessageHandler(OtherInstanceMessageHandler const&) = delete;
+ void operator=(OtherInstanceMessageHandler const&) = delete;
+ ~OtherInstanceMessageHandler() { assert(!m_initialized); }
+
+ // inits listening, on each platform different. On linux starts background thread
+ void init(wxEvtHandler* callback_evt_handler);
+ // stops listening, on linux stops the background thread
+ void shutdown(MainFrame* main_frame);
+
+ //finds paths to models in message(= command line arguments, first should be prusaSlicer executable)
+ //and sends them to plater via LoadFromOtherInstanceEvent
+ //security of messages: from message all existing paths are proccesed to load model
+ // win32 - anybody who has hwnd can send message.
+ // mac - anybody who posts notification with name:@"OtherPrusaSlicerTerminating"
+ // linux - instrospectable on dbus
+ void handle_message(const std::string& message);
+#ifdef _WIN32
+ static void init_windows_properties(MainFrame* main_frame, size_t instance_hash);
+#endif //WIN32
+private:
+ bool m_initialized { false };
+ wxEvtHandler* m_callback_evt_handler { nullptr };
+
+#ifdef BACKGROUND_MESSAGE_LISTENER
+ //worker thread to listen incoming dbus communication
+ boost::thread m_thread;
+ std::condition_variable m_thread_stop_condition;
+ mutable std::mutex m_thread_stop_mutex;
+ bool m_stop{ false };
+ bool m_start{ true };
+
+ // background thread method
+ void listen();
+#endif //BACKGROUND_MESSAGE_LISTENER
+
+#if __APPLE__
+ //implemented at InstanceCheckMac.mm
+ void register_for_messages(const std::string &version_hash);
+ void unregister_for_messages();
+ // Opaque pointer to RemovableDriveManagerMM
+ void* m_impl_osx;
+public:
+ void bring_instance_forward();
+#endif //__APPLE__
+
+};
+} // namespace GUI
+} // namespace Slic3r
+#endif // slic3r_InstanceCheck_hpp_
diff --git a/src/slic3r/GUI/InstanceCheckMac.h b/src/slic3r/GUI/InstanceCheckMac.h
new file mode 100644
index 000000000..30943c4d5
--- /dev/null
+++ b/src/slic3r/GUI/InstanceCheckMac.h
@@ -0,0 +1,9 @@
+#import <Cocoa/Cocoa.h>
+
+@interface OtherInstanceMessageHandlerMac : NSObject
+
+-(instancetype) init;
+-(void) add_observer:(NSString *)version;
+-(void) message_update:(NSNotification *)note;
+-(void) bring_forward;
+@end
diff --git a/src/slic3r/GUI/InstanceCheckMac.mm b/src/slic3r/GUI/InstanceCheckMac.mm
new file mode 100644
index 000000000..9969b1a7b
--- /dev/null
+++ b/src/slic3r/GUI/InstanceCheckMac.mm
@@ -0,0 +1,84 @@
+#import "InstanceCheck.hpp"
+#import "InstanceCheckMac.h"
+#import "GUI_App.hpp"
+
+@implementation OtherInstanceMessageHandlerMac
+
+-(instancetype) init
+{
+ self = [super init];
+ return self;
+}
+-(void)add_observer:(NSString *)version_hash
+{
+ //NSLog(@"adding observer");
+ //NSString *nsver = @"OtherPrusaSlicerInstanceMessage" + version_hash;
+ NSString *nsver = [NSString stringWithFormat: @"%@%@", @"OtherPrusaSlicerInstanceMessage", version_hash];
+ [[NSDistributedNotificationCenter defaultCenter] addObserver:self selector:@selector(message_update:) name:nsver object:nil suspensionBehavior:NSNotificationSuspensionBehaviorDeliverImmediately];
+}
+
+-(void)message_update:(NSNotification *)msg
+{
+ [self bring_forward];
+ //pass message
+ Slic3r::GUI::wxGetApp().other_instance_message_handler()->handle_message(std::string([msg.userInfo[@"data"] UTF8String]));
+}
+
+-(void) bring_forward
+{
+ //demiaturize all windows
+ for(NSWindow* win in [NSApp windows])
+ {
+ if([win isMiniaturized])
+ {
+ [win deminiaturize:self];
+ }
+ }
+ //bring window to front
+ [[NSApplication sharedApplication] activateIgnoringOtherApps : YES];
+}
+
+@end
+
+namespace Slic3r {
+
+void send_message_mac(const std::string &msg, const std::string &version)
+{
+ NSString *nsmsg = [NSString stringWithCString:msg.c_str() encoding:[NSString defaultCStringEncoding]];
+ //NSString *nsver = @"OtherPrusaSlicerInstanceMessage" + [NSString stringWithCString:version.c_str() encoding:[NSString defaultCStringEncoding]];
+ NSString *nsver = [NSString stringWithCString:version.c_str() encoding:[NSString defaultCStringEncoding]];
+ NSString *notifname = [NSString stringWithFormat: @"%@%@", @"OtherPrusaSlicerInstanceMessage", nsver];
+ [[NSDistributedNotificationCenter defaultCenter] postNotificationName:notifname object:nil userInfo:[NSDictionary dictionaryWithObject:nsmsg forKey:@"data"] deliverImmediately:YES];
+}
+
+namespace GUI {
+void OtherInstanceMessageHandler::register_for_messages(const std::string &version_hash)
+{
+ m_impl_osx = [[OtherInstanceMessageHandlerMac alloc] init];
+ if(m_impl_osx) {
+ NSString *nsver = [NSString stringWithCString:version_hash.c_str() encoding:[NSString defaultCStringEncoding]];
+ [m_impl_osx add_observer:nsver];
+ }
+}
+
+void OtherInstanceMessageHandler::unregister_for_messages()
+{
+ //NSLog(@"unreegistering other instance messages");
+ if (m_impl_osx) {
+ [m_impl_osx release];
+ m_impl_osx = nullptr;
+ } else {
+ NSLog(@"warning: unregister instance InstanceCheck notifications not required");
+ }
+}
+
+void OtherInstanceMessageHandler::bring_instance_forward()
+{
+ if (m_impl_osx) {
+ [m_impl_osx bring_forward];
+ }
+}
+}//namespace GUI
+}//namespace Slicer
+
+
diff --git a/src/slic3r/GUI/Job.hpp b/src/slic3r/GUI/Job.hpp
deleted file mode 100644
index ac31b9bdb..000000000
--- a/src/slic3r/GUI/Job.hpp
+++ /dev/null
@@ -1,155 +0,0 @@
-#ifndef JOB_HPP
-#define JOB_HPP
-
-#include <atomic>
-
-#include <slic3r/Utils/Thread.hpp>
-#include <slic3r/GUI/I18N.hpp>
-#include <slic3r/GUI/ProgressIndicator.hpp>
-
-#include <wx/event.h>
-
-#include <boost/thread.hpp>
-
-namespace Slic3r { namespace GUI {
-
-// A class to handle UI jobs like arranging and optimizing rotation.
-// These are not instant jobs, the user has to be informed about their
-// state in the status progress indicator. On the other hand they are
-// separated from the background slicing process. Ideally, these jobs should
-// run when the background process is not running.
-//
-// TODO: A mechanism would be useful for blocking the plater interactions:
-// objects would be frozen for the user. In case of arrange, an animation
-// could be shown, or with the optimize orientations, partial results
-// could be displayed.
-class Job : public wxEvtHandler
-{
- int m_range = 100;
- boost::thread m_thread;
- std::atomic<bool> m_running{false}, m_canceled{false};
- bool m_finalized = false;
- std::shared_ptr<ProgressIndicator> m_progress;
-
- void run()
- {
- m_running.store(true);
- process();
- m_running.store(false);
-
- // ensure to call the last status to finalize the job
- update_status(status_range(), "");
- }
-
-protected:
- // status range for a particular job
- virtual int status_range() const { return 100; }
-
- // status update, to be used from the work thread (process() method)
- void update_status(int st, const wxString &msg = "")
- {
- auto evt = new wxThreadEvent();
- evt->SetInt(st);
- evt->SetString(msg);
- wxQueueEvent(this, evt);
- }
-
- bool was_canceled() const { return m_canceled.load(); }
-
- // Launched just before start(), a job can use it to prepare internals
- virtual void prepare() {}
-
- // Launched when the job is finished. It refreshes the 3Dscene by def.
- virtual void finalize() { m_finalized = true; }
-
-
-public:
- Job(std::shared_ptr<ProgressIndicator> pri) : m_progress(pri)
- {
- Bind(wxEVT_THREAD, [this](const wxThreadEvent &evt) {
- auto msg = evt.GetString();
- if (!msg.empty())
- m_progress->set_status_text(msg.ToUTF8().data());
-
- if (m_finalized) return;
-
- m_progress->set_progress(evt.GetInt());
- if (evt.GetInt() == status_range()) {
- // set back the original range and cancel callback
- m_progress->set_range(m_range);
- m_progress->set_cancel_callback();
- wxEndBusyCursor();
-
- finalize();
-
- // dont do finalization again for the same process
- m_finalized = true;
- }
- });
- }
-
- bool is_finalized() const { return m_finalized; }
-
- Job(const Job &) = delete;
- Job(Job &&) = delete;
- Job &operator=(const Job &) = delete;
- Job &operator=(Job &&) = delete;
-
- virtual void process() = 0;
-
- void start()
- { // Start the job. No effect if the job is already running
- if (!m_running.load()) {
- prepare();
-
- // Save the current status indicatior range and push the new one
- m_range = m_progress->get_range();
- m_progress->set_range(status_range());
-
- // init cancellation flag and set the cancel callback
- m_canceled.store(false);
- m_progress->set_cancel_callback(
- [this]() { m_canceled.store(true); });
-
- m_finalized = false;
-
- // Changing cursor to busy
- wxBeginBusyCursor();
-
- try { // Execute the job
- m_thread = create_thread([this] { this->run(); });
- } catch (std::exception &) {
- update_status(status_range(),
- _(L("ERROR: not enough resources to "
- "execute a new job.")));
- }
-
- // The state changes will be undone when the process hits the
- // last status value, in the status update handler (see ctor)
- }
- }
-
- // To wait for the running job and join the threads. False is
- // returned if the timeout has been reached and the job is still
- // running. Call cancel() before this fn if you want to explicitly
- // end the job.
- bool join(int timeout_ms = 0)
- {
- if (!m_thread.joinable()) return true;
-
- if (timeout_ms <= 0)
- m_thread.join();
- else if (!m_thread.try_join_for(boost::chrono::milliseconds(timeout_ms)))
- return false;
-
- return true;
- }
-
- bool is_running() const { return m_running.load(); }
- void cancel() { m_canceled.store(true); }
-};
-
-}
-}
-
-#endif // JOB_HPP
diff --git a/src/slic3r/GUI/Jobs/ArrangeJob.cpp b/src/slic3r/GUI/Jobs/ArrangeJob.cpp
new file mode 100644
index 000000000..0f17e6e9f
--- /dev/null
+++ b/src/slic3r/GUI/Jobs/ArrangeJob.cpp
@@ -0,0 +1,227 @@
+#include "ArrangeJob.hpp"
+
+#include "libslic3r/MTUtils.hpp"
+#include "libslic3r/Model.hpp"
+
+#include "slic3r/GUI/Plater.hpp"
+#include "slic3r/GUI/GLCanvas3D.hpp"
+#include "slic3r/GUI/GUI.hpp"
+
+namespace Slic3r { namespace GUI {
+
+// Cache the wti info
+class WipeTower: public GLCanvas3D::WipeTowerInfo {
+ using ArrangePolygon = arrangement::ArrangePolygon;
+public:
+ explicit WipeTower(const GLCanvas3D::WipeTowerInfo &wti)
+ : GLCanvas3D::WipeTowerInfo(wti)
+ {}
+
+ explicit WipeTower(GLCanvas3D::WipeTowerInfo &&wti)
+ : GLCanvas3D::WipeTowerInfo(std::move(wti))
+ {}
+
+ void apply_arrange_result(const Vec2d& tr, double rotation)
+ {
+ m_pos = unscaled(tr); m_rotation = rotation;
+ apply_wipe_tower();
+ }
+
+ ArrangePolygon get_arrange_polygon() const
+ {
+ Polygon ap({
+ {scaled(m_bb.min)},
+ {scaled(m_bb.max.x()), scaled(m_bb.min.y())},
+ {scaled(m_bb.max)},
+ {scaled(m_bb.min.x()), scaled(m_bb.max.y())}
+ });
+
+ ArrangePolygon ret;
+ ret.poly.contour = std::move(ap);
+ ret.translation = scaled(m_pos);
+ ret.rotation = m_rotation;
+ ++ret.priority;
+
+ return ret;
+ }
+};
+
+static WipeTower get_wipe_tower(const Plater &plater)
+{
+ return WipeTower{plater.canvas3D()->get_wipe_tower_info()};
+}
+
+void ArrangeJob::clear_input()
+{
+ const Model &model = m_plater->model();
+
+ size_t count = 0, cunprint = 0; // To know how much space to reserve
+ for (auto obj : model.objects)
+ for (auto mi : obj->instances)
+ mi->printable ? count++ : cunprint++;
+
+ m_selected.clear();
+ m_unselected.clear();
+ m_unprintable.clear();
+ m_selected.reserve(count + 1 /* for optional wti */);
+ m_unselected.reserve(count + 1 /* for optional wti */);
+ m_unprintable.reserve(cunprint /* for optional wti */);
+}
+
+void ArrangeJob::prepare_all() {
+ clear_input();
+
+ for (ModelObject *obj: m_plater->model().objects)
+ for (ModelInstance *mi : obj->instances) {
+ ArrangePolygons & cont = mi->printable ? m_selected : m_unprintable;
+ cont.emplace_back(get_arrange_poly(PtrWrapper{mi}, m_plater));
+ }
+
+ if (auto wti = get_wipe_tower_arrangepoly(*m_plater))
+ m_selected.emplace_back(std::move(*wti));
+}
+
+void ArrangeJob::prepare_selected() {
+ clear_input();
+
+ Model &model = m_plater->model();
+ double stride = bed_stride(m_plater);
+
+ std::vector<const Selection::InstanceIdxsList *>
+ obj_sel(model.objects.size(), nullptr);
+
+ for (auto &s : m_plater->get_selection().get_content())
+ if (s.first < int(obj_sel.size()))
+ obj_sel[size_t(s.first)] = &s.second;
+
+ // Go through the objects and check if inside the selection
+ for (size_t oidx = 0; oidx < model.objects.size(); ++oidx) {
+ const Selection::InstanceIdxsList * instlist = obj_sel[oidx];
+ ModelObject *mo = model.objects[oidx];
+
+ std::vector<bool> inst_sel(mo->instances.size(), false);
+
+ if (instlist)
+ for (auto inst_id : *instlist)
+ inst_sel[size_t(inst_id)] = true;
+
+ for (size_t i = 0; i < inst_sel.size(); ++i) {
+ ArrangePolygon &&ap =
+ get_arrange_poly(PtrWrapper{mo->instances[i]}, m_plater);
+
+ ArrangePolygons &cont = mo->instances[i]->printable ?
+ (inst_sel[i] ? m_selected :
+ m_unselected) :
+ m_unprintable;
+
+ cont.emplace_back(std::move(ap));
+ }
+ }
+
+ if (auto wti = get_wipe_tower(*m_plater)) {
+ ArrangePolygon &&ap = get_arrange_poly(wti, m_plater);
+
+ auto &cont = m_plater->get_selection().is_wipe_tower() ? m_selected :
+ m_unselected;
+ cont.emplace_back(std::move(ap));
+ }
+
+ // If the selection was empty arrange everything
+ if (m_selected.empty()) m_selected.swap(m_unselected);
+
+ // The strides have to be removed from the fixed items. For the
+ // arrangeable (selected) items bed_idx is ignored and the
+ // translation is irrelevant.
+ for (auto &p : m_unselected) p.translation(X) -= p.bed_idx * stride;
+}
+
+void ArrangeJob::prepare()
+{
+ wxGetKeyState(WXK_SHIFT) ? prepare_selected() : prepare_all();
+}
+
+void ArrangeJob::process()
+{
+ static const auto arrangestr = _(L("Arranging"));
+
+ const GLCanvas3D::ArrangeSettings &settings =
+ static_cast<const GLCanvas3D*>(m_plater->canvas3D())->get_arrange_settings();
+
+ arrangement::ArrangeParams params;
+ params.allow_rotations = settings.enable_rotation;
+ params.min_obj_distance = scaled(settings.distance);
+
+
+ auto count = unsigned(m_selected.size() + m_unprintable.size());
+ Points bedpts = get_bed_shape(*m_plater->config());
+
+ params.stopcondition = [this]() { return was_canceled(); };
+
+ try {
+ params.progressind = [this, count](unsigned st) {
+ st += m_unprintable.size();
+ if (st > 0) update_status(int(count - st), arrangestr);
+ };
+
+ arrangement::arrange(m_selected, m_unselected, bedpts, params);
+
+ params.progressind = [this, count](unsigned st) {
+ if (st > 0) update_status(int(count - st), arrangestr);
+ };
+
+ arrangement::arrange(m_unprintable, {}, bedpts, params);
+ } catch (std::exception & /*e*/) {
+ GUI::show_error(m_plater,
+ _(L("Could not arrange model objects! "
+ "Some geometries may be invalid.")));
+ }
+
+ // finalize just here.
+ update_status(int(count),
+ was_canceled() ? _(L("Arranging canceled."))
+ : _(L("Arranging done.")));
+}
+
+void ArrangeJob::finalize() {
+ // Ignore the arrange result if aborted.
+ if (was_canceled()) return;
+
+ // Unprintable items go to the last virtual bed
+ int beds = 0;
+
+ // Apply the arrange result to all selected objects
+ for (ArrangePolygon &ap : m_selected) {
+ beds = std::max(ap.bed_idx, beds);
+ ap.apply();
+ }
+
+ // Get the virtual beds from the unselected items
+ for (ArrangePolygon &ap : m_unselected)
+ beds = std::max(ap.bed_idx, beds);
+
+ // Move the unprintable items to the last virtual bed.
+ for (ArrangePolygon &ap : m_unprintable) {
+ ap.bed_idx += beds + 1;
+ ap.apply();
+ }
+
+ m_plater->update();
+
+ Job::finalize();
+}
+
+std::optional<arrangement::ArrangePolygon>
+get_wipe_tower_arrangepoly(const Plater &plater)
+{
+ if (auto wti = get_wipe_tower(plater))
+ return get_arrange_poly(wti, &plater);
+
+ return {};
+}
+
+double bed_stride(const Plater *plater) {
+ double bedwidth = plater->bed_shape_bb().size().x();
+ return scaled<double>((1. + LOGICAL_BED_GAP) * bedwidth);
+}
+
+}} // namespace Slic3r::GUI
diff --git a/src/slic3r/GUI/Jobs/ArrangeJob.hpp b/src/slic3r/GUI/Jobs/ArrangeJob.hpp
new file mode 100644
index 000000000..73540c230
--- /dev/null
+++ b/src/slic3r/GUI/Jobs/ArrangeJob.hpp
@@ -0,0 +1,97 @@
+#ifndef ARRANGEJOB_HPP
+#define ARRANGEJOB_HPP
+
+#include "Job.hpp"
+#include "libslic3r/Arrange.hpp"
+
+namespace Slic3r { namespace GUI {
+
+class Plater;
+
+class ArrangeJob : public Job
+{
+ Plater *m_plater;
+
+ using ArrangePolygon = arrangement::ArrangePolygon;
+ using ArrangePolygons = arrangement::ArrangePolygons;
+
+ ArrangePolygons m_selected, m_unselected, m_unprintable;
+
+ // clear m_selected and m_unselected, reserve space for next usage
+ void clear_input();
+
+ // Prepare all objects on the bed regardless of the selection
+ void prepare_all();
+
+ // Prepare the selected and unselected items separately. If nothing is
+ // selected, behaves as if everything would be selected.
+ void prepare_selected();
+
+protected:
+
+ void prepare() override;
+
+public:
+ ArrangeJob(std::shared_ptr<ProgressIndicator> pri, Plater *plater)
+ : Job{std::move(pri)}, m_plater{plater}
+ {}
+
+ int status_range() const override
+ {
+ return int(m_selected.size() + m_unprintable.size());
+ }
+
+ void process() override;
+
+ void finalize() override;
+};
+
+std::optional<arrangement::ArrangePolygon> get_wipe_tower_arrangepoly(const Plater &);
+
+// The gap between logical beds in the x axis expressed in ratio of
+// the current bed width.
+static const constexpr double LOGICAL_BED_GAP = 1. / 5.;
+
+// Stride between logical beds
+double bed_stride(const Plater *plater);
+
+template<class T> struct PtrWrapper
+{
+ T *ptr;
+
+ explicit PtrWrapper(T *p) : ptr{p} {}
+
+ arrangement::ArrangePolygon get_arrange_polygon() const
+ {
+ return ptr->get_arrange_polygon();
+ }
+
+ void apply_arrange_result(const Vec2d &t, double rot)
+ {
+ ptr->apply_arrange_result(t, rot);
+ }
+};
+
+// Set up arrange polygon for a ModelInstance and Wipe tower
+template<class T>
+arrangement::ArrangePolygon get_arrange_poly(T obj, const Plater *plater)
+{
+ using ArrangePolygon = arrangement::ArrangePolygon;
+
+ ArrangePolygon ap = obj.get_arrange_polygon();
+ ap.bed_idx = ap.translation.x() / bed_stride(plater);
+ ap.setter = [obj, plater](const ArrangePolygon &p) {
+ if (p.is_arranged()) {
+ Vec2d t = p.translation.cast<double>();
+ t.x() += p.bed_idx * bed_stride(plater);
+ T{obj}.apply_arrange_result(t, p.rotation);
+ }
+ };
+
+ return ap;
+}
+
+
+}} // namespace Slic3r::GUI
+
+#endif // ARRANGEJOB_HPP
diff --git a/src/slic3r/GUI/Jobs/FillBedJob.cpp b/src/slic3r/GUI/Jobs/FillBedJob.cpp
new file mode 100644
index 000000000..1948c8fbb
--- /dev/null
+++ b/src/slic3r/GUI/Jobs/FillBedJob.cpp
@@ -0,0 +1,172 @@
+#include "FillBedJob.hpp"
+
+#include "libslic3r/Model.hpp"
+#include "libslic3r/ClipperUtils.hpp"
+
+#include "slic3r/GUI/Plater.hpp"
+#include "slic3r/GUI/GLCanvas3D.hpp"
+#include "slic3r/GUI/GUI_ObjectList.hpp"
+
+#include <numeric>
+
+namespace Slic3r {
+namespace GUI {
+
+void FillBedJob::prepare()
+{
+ m_selected.clear();
+ m_unselected.clear();
+ m_bedpts.clear();
+
+ m_object_idx = m_plater->get_selected_object_idx();
+ if (m_object_idx == -1)
+ return;
+
+ ModelObject *model_object = m_plater->model().objects[m_object_idx];
+ if (model_object->instances.empty()) return;
+
+ m_selected.reserve(model_object->instances.size());
+ for (ModelInstance *inst : model_object->instances)
+ if (inst->printable) {
+ ArrangePolygon ap = get_arrange_poly(PtrWrapper{inst}, m_plater);
+ // Existing objects need to be included in the result. Only
+ // the needed amount of object will be added, no more.
+ ++ap.priority;
+ m_selected.emplace_back(ap);
+ }
+
+ if (m_selected.empty()) return;
+
+ m_bedpts = get_bed_shape(*m_plater->config());
+
+ auto &objects = m_plater->model().objects;
+ BoundingBox bedbb = get_extents(m_bedpts);
+
+ for (size_t idx = 0; idx < objects.size(); ++idx)
+ if (int(idx) != m_object_idx)
+ for (ModelInstance *mi : objects[idx]->instances) {
+ ArrangePolygon ap = get_arrange_poly(PtrWrapper{mi}, m_plater);
+ auto ap_bb = ap.transformed_poly().contour.bounding_box();
+
+ if (ap.bed_idx == 0 && !bedbb.contains(ap_bb))
+ ap.bed_idx = arrangement::UNARRANGED;
+
+ m_unselected.emplace_back(ap);
+ }
+
+ if (auto wt = get_wipe_tower_arrangepoly(*m_plater))
+ m_unselected.emplace_back(std::move(*wt));
+
+ double sc = scaled<double>(1.) * scaled(1.);
+
+ ExPolygon poly = m_selected.front().poly;
+ double poly_area = poly.area() / sc;
+ double unsel_area = std::accumulate(m_unselected.begin(),
+ m_unselected.end(), 0.,
+ [](double s, const auto &ap) {
+ return s + (ap.bed_idx == 0) * ap.poly.area();
+ }) / sc;
+
+ double fixed_area = unsel_area + m_selected.size() * poly_area;
+ double bed_area = Polygon{m_bedpts}.area() / sc;
+
+ // This is the maximum number of items, the real number will always be close but less.
+ int needed_items = (bed_area - fixed_area) / poly_area;
+
+ int sel_id = m_plater->get_selection().get_instance_idx();
+ // if the selection is not a single instance, choose the first as template
+ sel_id = std::max(sel_id, 0);
+ ModelInstance *mi = model_object->instances[sel_id];
+ ArrangePolygon template_ap = get_arrange_poly(PtrWrapper{mi}, m_plater);
+
+ for (int i = 0; i < needed_items; ++i) {
+ ArrangePolygon ap = template_ap;
+ ap.poly = m_selected.front().poly;
+ ap.bed_idx = arrangement::UNARRANGED;
+ ap.setter = [this, mi](const ArrangePolygon &p) {
+ ModelObject *mo = m_plater->model().objects[m_object_idx];
+ ModelInstance *inst = mo->add_instance(*mi);
+ inst->apply_arrange_result(p.translation.cast<double>(), p.rotation);
+ };
+ m_selected.emplace_back(ap);
+ }
+
+ m_status_range = m_selected.size();
+
+ // The strides have to be removed from the fixed items. For the
+ // arrangeable (selected) items bed_idx is ignored and the
+ // translation is irrelevant.
+ double stride = bed_stride(m_plater);
+ for (auto &p : m_unselected)
+ if (p.bed_idx > 0)
+ p.translation(X) -= p.bed_idx * stride;
+}
+
+void FillBedJob::process()
+{
+ if (m_object_idx == -1 || m_selected.empty()) return;
+
+ const GLCanvas3D::ArrangeSettings &settings =
+ static_cast<const GLCanvas3D*>(m_plater->canvas3D())->get_arrange_settings();
+
+ arrangement::ArrangeParams params;
+ params.allow_rotations = settings.enable_rotation;
+ params.min_obj_distance = scaled(settings.distance);
+
+ bool do_stop = false;
+ params.stopcondition = [this, &do_stop]() {
+ return was_canceled() || do_stop;
+ };
+
+ params.progressind = [this](unsigned st) {
+ if (st > 0)
+ update_status(int(m_status_range - st), _(L("Filling bed")));
+ };
+
+ params.on_packed = [&do_stop] (const ArrangePolygon &ap) {
+ do_stop = ap.bed_idx > 0 && ap.priority == 0;
+ };
+
+ arrangement::arrange(m_selected, m_unselected, m_bedpts, params);
+
+ // finalize just here.
+ update_status(m_status_range, was_canceled() ?
+ _(L("Bed filling canceled.")) :
+ _(L("Bed filling done.")));
+}
+
+void FillBedJob::finalize()
+{
+ // Ignore the arrange result if aborted.
+ if (was_canceled()) return;
+
+ if (m_object_idx == -1) return;
+
+ ModelObject *model_object = m_plater->model().objects[m_object_idx];
+ if (model_object->instances.empty()) return;
+
+ size_t inst_cnt = model_object->instances.size();
+
+ for (ArrangePolygon &ap : m_selected) {
+ if (ap.bed_idx != arrangement::UNARRANGED && (ap.priority != 0 || ap.bed_idx == 0))
+ ap.apply();
+ }
+
+ model_object->ensure_on_bed();
+
+ m_plater->update();
+
+ int added_cnt = std::accumulate(m_selected.begin(), m_selected.end(), 0,
+ [](int s, auto &ap) {
+ return s + int(ap.priority == 0 && ap.bed_idx == 0);
+ });
+
+ // FIXME: somebody explain why this is needed for increase_object_instances
+ if (inst_cnt == 1) added_cnt++;
+
+ if (added_cnt > 0)
+ m_plater->sidebar()
+ .obj_list()->increase_object_instances(m_object_idx, size_t(added_cnt));
+}
+
+}} // namespace Slic3r::GUI
diff --git a/src/slic3r/GUI/Jobs/FillBedJob.hpp b/src/slic3r/GUI/Jobs/FillBedJob.hpp
new file mode 100644
index 000000000..448ae53d4
--- /dev/null
+++ b/src/slic3r/GUI/Jobs/FillBedJob.hpp
@@ -0,0 +1,46 @@
+#ifndef FILLBEDJOB_HPP
+#define FILLBEDJOB_HPP
+
+#include "ArrangeJob.hpp"
+
+namespace Slic3r { namespace GUI {
+
+class Plater;
+
+class FillBedJob : public Job
+{
+ Plater *m_plater;
+ int m_object_idx = -1;
+
+ using ArrangePolygon = arrangement::ArrangePolygon;
+ using ArrangePolygons = arrangement::ArrangePolygons;
+
+ ArrangePolygons m_selected;
+ ArrangePolygons m_unselected;
+
+ Points m_bedpts;
+
+ int m_status_range = 0;
+
+protected:
+
+ void prepare() override;
+
+public:
+ FillBedJob(std::shared_ptr<ProgressIndicator> pri, Plater *plater)
+ : Job{std::move(pri)}, m_plater{plater}
+ {}
+
+ int status_range() const override
+ {
+ return m_status_range;
+ }
+
+ void process() override;
+
+ void finalize() override;
+};
+
+}} // namespace Slic3r::GUI
+
+#endif // FILLBEDJOB_HPP
diff --git a/src/slic3r/GUI/Jobs/Job.cpp b/src/slic3r/GUI/Jobs/Job.cpp
new file mode 100644
index 000000000..fedb6f4ac
--- /dev/null
+++ b/src/slic3r/GUI/Jobs/Job.cpp
@@ -0,0 +1,122 @@
+#include <algorithm>
+
+#include "Job.hpp"
+#include <libslic3r/Thread.hpp>
+#include <boost/log/trivial.hpp>
+
+namespace Slic3r {
+
+void GUI::Job::run()
+{
+ m_running.store(true);
+ process();
+ m_running.store(false);
+
+ // ensure to call the last status to finalize the job
+ update_status(status_range(), "");
+}
+
+void GUI::Job::update_status(int st, const wxString &msg)
+{
+ auto evt = new wxThreadEvent();
+ evt->SetInt(st);
+ evt->SetString(msg);
+ wxQueueEvent(this, evt);
+}
+
+GUI::Job::Job(std::shared_ptr<ProgressIndicator> pri)
+ : m_progress(std::move(pri))
+{
+ Bind(wxEVT_THREAD, [this](const wxThreadEvent &evt) {
+ auto msg = evt.GetString();
+ if (!msg.empty())
+ m_progress->set_status_text(msg.ToUTF8().data());
+
+ if (m_finalized) return;
+
+ m_progress->set_progress(evt.GetInt());
+ if (evt.GetInt() == status_range()) {
+ // set back the original range and cancel callback
+ m_progress->set_range(m_range);
+ m_progress->set_cancel_callback();
+ wxEndBusyCursor();
+
+ finalize();
+
+ // dont do finalization again for the same process
+ m_finalized = true;
+ }
+ });
+}
+
+void GUI::Job::start()
+{ // Start the job. No effect if the job is already running
+ if (!m_running.load()) {
+ prepare();
+
+ // Save the current status indicatior range and push the new one
+ m_range = m_progress->get_range();
+ m_progress->set_range(status_range());
+
+ // init cancellation flag and set the cancel callback
+ m_canceled.store(false);
+ m_progress->set_cancel_callback(
+ [this]() { m_canceled.store(true); });
+
+ m_finalized = false;
+
+ // Changing cursor to busy
+ wxBeginBusyCursor();
+
+ try { // Execute the job
+ m_thread = create_thread([this] { this->run(); });
+ } catch (std::exception &) {
+ update_status(status_range(),
+ _(L("ERROR: not enough resources to "
+ "execute a new job.")));
+ }
+
+ // The state changes will be undone when the process hits the
+ // last status value, in the status update handler (see ctor)
+ }
+}
+
+bool GUI::Job::join(int timeout_ms)
+{
+ if (!m_thread.joinable()) return true;
+
+ if (timeout_ms <= 0)
+ m_thread.join();
+ else if (!m_thread.try_join_for(boost::chrono::milliseconds(timeout_ms)))
+ return false;
+
+ return true;
+}
+
+void GUI::ExclusiveJobGroup::start(size_t jid) {
+ assert(jid < m_jobs.size());
+ stop_all();
+ m_jobs[jid]->start();
+}
+
+void GUI::ExclusiveJobGroup::join_all(int wait_ms)
+{
+ std::vector<bool> aborted(m_jobs.size(), false);
+
+ for (size_t jid = 0; jid < m_jobs.size(); ++jid)
+ aborted[jid] = m_jobs[jid]->join(wait_ms);
+
+ if (!std::all_of(aborted.begin(), aborted.end(), [](bool t) { return t; }))
+ BOOST_LOG_TRIVIAL(error) << "Could not abort a job!";
+}
+
+bool GUI::ExclusiveJobGroup::is_any_running() const
+{
+ return std::any_of(m_jobs.begin(), m_jobs.end(),
+ [](const std::unique_ptr<GUI::Job> &j) {
+ return j->is_running();
+ });
+}
+
+}
+
diff --git a/src/slic3r/GUI/Jobs/Job.hpp b/src/slic3r/GUI/Jobs/Job.hpp
new file mode 100644
index 000000000..aea7692e7
--- /dev/null
+++ b/src/slic3r/GUI/Jobs/Job.hpp
@@ -0,0 +1,111 @@
+#ifndef JOB_HPP
+#define JOB_HPP
+
+#include <atomic>
+
+#include "libslic3r/libslic3r.h"
+
+#include <slic3r/GUI/I18N.hpp>
+
+#include "ProgressIndicator.hpp"
+
+#include <wx/event.h>
+
+#include <boost/thread.hpp>
+
+namespace Slic3r { namespace GUI {
+
+// A class to handle UI jobs like arranging and optimizing rotation.
+// These are not instant jobs, the user has to be informed about their
+// state in the status progress indicator. On the other hand they are
+// separated from the background slicing process. Ideally, these jobs should
+// run when the background process is not running.
+//
+// TODO: A mechanism would be useful for blocking the plater interactions:
+// objects would be frozen for the user. In case of arrange, an animation
+// could be shown, or with the optimize orientations, partial results
+// could be displayed.
+class Job : public wxEvtHandler
+{
+ int m_range = 100;
+ boost::thread m_thread;
+ std::atomic<bool> m_running{false}, m_canceled{false};
+ bool m_finalized = false;
+ std::shared_ptr<ProgressIndicator> m_progress;
+
+ void run();
+
+protected:
+ // status range for a particular job
+ virtual int status_range() const { return 100; }
+
+ // status update, to be used from the work thread (process() method)
+ void update_status(int st, const wxString &msg = "");
+
+ bool was_canceled() const { return m_canceled.load(); }
+
+ // Launched just before start(), a job can use it to prepare internals
+ virtual void prepare() {}
+
+ // Launched when the job is finished. It refreshes the 3Dscene by def.
+ virtual void finalize() { m_finalized = true; }
+
+public:
+ Job(std::shared_ptr<ProgressIndicator> pri);
+
+ bool is_finalized() const { return m_finalized; }
+
+ Job(const Job &) = delete;
+ Job(Job &&) = delete;
+ Job &operator=(const Job &) = delete;
+ Job &operator=(Job &&) = delete;
+
+ virtual void process() = 0;
+
+ void start();
+
+ // To wait for the running job and join the threads. False is
+ // returned if the timeout has been reached and the job is still
+ // running. Call cancel() before this fn if you want to explicitly
+ // end the job.
+ bool join(int timeout_ms = 0);
+
+ bool is_running() const { return m_running.load(); }
+ void cancel() { m_canceled.store(true); }
+};
+
+// Jobs defined inside the group class will be managed so that only one can
+// run at a time. Also, the background process will be stopped if a job is
+// started.
+class ExclusiveJobGroup
+{
+ static const int ABORT_WAIT_MAX_MS = 10000;
+
+ std::vector<std::unique_ptr<GUI::Job>> m_jobs;
+
+protected:
+ virtual void before_start() {}
+
+public:
+ virtual ~ExclusiveJobGroup() = default;
+
+ size_t add_job(std::unique_ptr<GUI::Job> &&job)
+ {
+ m_jobs.emplace_back(std::move(job));
+ return m_jobs.size() - 1;
+ }
+
+ void start(size_t jid);
+
+ void cancel_all() { for (auto& j : m_jobs) j->cancel(); }
+
+ void join_all(int wait_ms = 0);
+
+ void stop_all() { cancel_all(); join_all(ABORT_WAIT_MAX_MS); }
+
+ bool is_any_running() const;
+};
+
+}} // namespace Slic3r::GUI
+
+#endif // JOB_HPP
diff --git a/src/slic3r/GUI/ProgressIndicator.hpp b/src/slic3r/GUI/Jobs/ProgressIndicator.hpp
index 674a81ba2..674a81ba2 100644
--- a/src/slic3r/GUI/ProgressIndicator.hpp
+++ b/src/slic3r/GUI/Jobs/ProgressIndicator.hpp
diff --git a/src/slic3r/GUI/Jobs/RotoptimizeJob.cpp b/src/slic3r/GUI/Jobs/RotoptimizeJob.cpp
new file mode 100644
index 000000000..978ccf8fc
--- /dev/null
+++ b/src/slic3r/GUI/Jobs/RotoptimizeJob.cpp
@@ -0,0 +1,85 @@
+#include "RotoptimizeJob.hpp"
+
+#include "libslic3r/MTUtils.hpp"
+#include "libslic3r/SLA/Rotfinder.hpp"
+#include "libslic3r/MinAreaBoundingBox.hpp"
+#include "libslic3r/Model.hpp"
+#include "libslic3r/SLAPrint.hpp"
+
+#include "slic3r/GUI/Plater.hpp"
+
+namespace Slic3r { namespace GUI {
+
+void RotoptimizeJob::process()
+{
+ int obj_idx = m_plater->get_selected_object_idx();
+ if (obj_idx < 0 || int(m_plater->sla_print().objects().size()) <= obj_idx)
+ return;
+
+ ModelObject *o = m_plater->model().objects[size_t(obj_idx)];
+ const SLAPrintObject *po = m_plater->sla_print().objects()[size_t(obj_idx)];
+
+ if (!o || !po) return;
+
+ TriangleMesh mesh = o->raw_mesh();
+ mesh.require_shared_vertices();
+
+// for (auto inst : o->instances) {
+// Transform3d tr = Transform3d::Identity();
+// tr.rotate(Eigen::AngleAxisd(inst->get_rotation(Z), Vec3d::UnitZ()));
+// tr.rotate(Eigen::AngleAxisd(inst->get_rotation(Y), Vec3d::UnitY()));
+// tr.rotate(Eigen::AngleAxisd(inst->get_rotation(X), Vec3d::UnitX()));
+
+// double score = sla::get_model_supportedness(*po, tr);
+
+// std::cout << "Model supportedness before: " << score << std::endl;
+// }
+
+ Vec2d r = sla::find_best_rotation(*po, 0.75f,
+ [this](unsigned s) {
+ if (s < 100)
+ update_status(int(s), _(L("Searching for optimal orientation")));
+ },
+ [this] () { return was_canceled(); });
+
+
+ double mindist = 6.0; // FIXME
+
+ if (!was_canceled()) {
+ for(ModelInstance * oi : o->instances) {
+ oi->set_rotation({r[X], r[Y], 0.});
+
+ auto trmatrix = oi->get_transformation().get_matrix();
+ Polygon trchull = o->convex_hull_2d(trmatrix);
+
+ MinAreaBoundigBox rotbb(trchull, MinAreaBoundigBox::pcConvex);
+ double phi = rotbb.angle_to_X();
+
+ // The box should be landscape
+ if(rotbb.width() < rotbb.height()) phi += PI / 2;
+
+ Vec3d rt = oi->get_rotation(); rt(Z) += phi;
+
+ oi->set_rotation(rt);
+ }
+
+ m_plater->find_new_position(o->instances, scaled(mindist));
+
+ // Correct the z offset of the object which was corrupted be
+ // the rotation
+ o->ensure_on_bed();
+ }
+
+ update_status(100, was_canceled() ? _(L("Orientation search canceled.")) :
+ _(L("Orientation found.")));
+}
+
+void RotoptimizeJob::finalize()
+{
+ if (!was_canceled())
+ m_plater->update();
+
+ Job::finalize();
+}
+
+}}
diff --git a/src/slic3r/GUI/Jobs/RotoptimizeJob.hpp b/src/slic3r/GUI/Jobs/RotoptimizeJob.hpp
new file mode 100644
index 000000000..983c43c68
--- /dev/null
+++ b/src/slic3r/GUI/Jobs/RotoptimizeJob.hpp
@@ -0,0 +1,24 @@
+#ifndef ROTOPTIMIZEJOB_HPP
+#define ROTOPTIMIZEJOB_HPP
+
+#include "Job.hpp"
+
+namespace Slic3r { namespace GUI {
+
+class Plater;
+
+class RotoptimizeJob : public Job
+{
+ Plater *m_plater;
+public:
+ RotoptimizeJob(std::shared_ptr<ProgressIndicator> pri, Plater *plater)
+ : Job{std::move(pri)}, m_plater{plater}
+ {}
+
+ void process() override;
+ void finalize() override;
+};
+
+}} // namespace Slic3r::GUI
+
+#endif // ROTOPTIMIZEJOB_HPP
diff --git a/src/slic3r/GUI/Jobs/SLAImportJob.cpp b/src/slic3r/GUI/Jobs/SLAImportJob.cpp
new file mode 100644
index 000000000..ec289ae34
--- /dev/null
+++ b/src/slic3r/GUI/Jobs/SLAImportJob.cpp
@@ -0,0 +1,230 @@
+#include "SLAImportJob.hpp"
+
+#include "libslic3r/Format/SL1.hpp"
+
+#include "slic3r/GUI/GUI.hpp"
+#include "slic3r/GUI/GUI_App.hpp"
+#include "slic3r/GUI/Plater.hpp"
+#include "slic3r/GUI/GUI_ObjectList.hpp"
+
+#include "libslic3r/Model.hpp"
+#include "libslic3r/PresetBundle.hpp"
+
+#include <wx/dialog.h>
+#include <wx/stattext.h>
+#include <wx/combobox.h>
+#include <wx/filename.h>
+#include <wx/filepicker.h>
+
+namespace Slic3r { namespace GUI {
+
+enum class Sel { modelAndProfile, profileOnly, modelOnly};
+
+class ImportDlg: public wxDialog {
+ wxFilePickerCtrl *m_filepicker;
+ wxComboBox *m_import_dropdown, *m_quality_dropdown;
+
+public:
+ ImportDlg(Plater *plater)
+ : wxDialog{plater, wxID_ANY, "Import SLA archive"}
+ {
+ auto szvert = new wxBoxSizer{wxVERTICAL};
+ auto szfilepck = new wxBoxSizer{wxHORIZONTAL};
+
+ m_filepicker = new wxFilePickerCtrl(this, wxID_ANY,
+ from_u8(wxGetApp().app_config->get_last_dir()), _(L("Choose SLA archive:")),
+ "SL1 archive files (*.sl1, *.zip)|*.sl1;*.SL1;*.zip;*.ZIP",
+ wxDefaultPosition, wxDefaultSize, wxFLP_DEFAULT_STYLE | wxFD_OPEN | wxFD_FILE_MUST_EXIST);
+
+ szfilepck->Add(new wxStaticText(this, wxID_ANY, _L("Import file") + ": "), 0, wxALIGN_CENTER);
+ szfilepck->Add(m_filepicker, 1);
+ szvert->Add(szfilepck, 0, wxALL | wxEXPAND, 5);
+
+ auto szchoices = new wxBoxSizer{wxHORIZONTAL};
+
+ static const std::vector<wxString> inp_choices = {
+ _(L("Import model and profile")),
+ _(L("Import profile only")),
+ _(L("Import model only"))
+ };
+
+ m_import_dropdown = new wxComboBox(
+ this, wxID_ANY, inp_choices[0], wxDefaultPosition, wxDefaultSize,
+ inp_choices.size(), inp_choices.data(), wxCB_READONLY | wxCB_DROPDOWN);
+
+ szchoices->Add(m_import_dropdown);
+ szchoices->Add(new wxStaticText(this, wxID_ANY, _L("Quality") + ": "), 0, wxALIGN_CENTER | wxALL, 5);
+
+ static const std::vector<wxString> qual_choices = {
+ _(L("Accurate")),
+ _(L("Balanced")),
+ _(L("Quick"))
+ };
+
+ m_quality_dropdown = new wxComboBox(
+ this, wxID_ANY, qual_choices[0], wxDefaultPosition, wxDefaultSize,
+ qual_choices.size(), qual_choices.data(), wxCB_READONLY | wxCB_DROPDOWN);
+ szchoices->Add(m_quality_dropdown);
+
+ m_import_dropdown->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &) {
+ if (get_selection() == Sel::profileOnly)
+ m_quality_dropdown->Disable();
+ else m_quality_dropdown->Enable();
+ });
+
+ szvert->Add(szchoices, 0, wxALL, 5);
+ szvert->AddStretchSpacer(1);
+ auto szbtn = new wxBoxSizer(wxHORIZONTAL);
+ szbtn->Add(new wxButton{this, wxID_CANCEL});
+ szbtn->Add(new wxButton{this, wxID_OK});
+ szvert->Add(szbtn, 0, wxALIGN_RIGHT | wxALL, 5);
+
+ SetSizerAndFit(szvert);
+ }
+
+ Sel get_selection() const
+ {
+ int sel = m_import_dropdown->GetSelection();
+ return Sel(std::min(int(Sel::modelOnly), std::max(0, sel)));
+ }
+
+ Vec2i get_marchsq_windowsize() const
+ {
+ enum { Accurate, Balanced, Fast};
+
+ switch(m_quality_dropdown->GetSelection())
+ {
+ case Fast: return {8, 8};
+ case Balanced: return {4, 4};
+ default:
+ case Accurate:
+ return {2, 2};
+ }
+ }
+
+ wxString get_path() const
+ {
+ return m_filepicker->GetPath();
+ }
+};
+
+class SLAImportJob::priv {
+public:
+ Plater *plater;
+
+ Sel sel = Sel::modelAndProfile;
+
+ TriangleMesh mesh;
+ DynamicPrintConfig profile;
+ wxString path;
+ Vec2i win = {2, 2};
+ std::string err;
+
+ priv(Plater *plt): plater{plt} {}
+};
+
+SLAImportJob::SLAImportJob(std::shared_ptr<ProgressIndicator> pri, Plater *plater)
+ : Job{std::move(pri)}, p{std::make_unique<priv>(plater)}
+{}
+
+SLAImportJob::~SLAImportJob() = default;
+
+void SLAImportJob::process()
+{
+ auto progr = [this](int s) {
+ if (s < 100) update_status(int(s), _(L("Importing SLA archive")));
+ return !was_canceled();
+ };
+
+ if (p->path.empty()) return;
+
+ std::string path = p->path.ToUTF8().data();
+ try {
+ switch (p->sel) {
+ case Sel::modelAndProfile:
+ import_sla_archive(path, p->win, p->mesh, p->profile, progr);
+ break;
+ case Sel::modelOnly:
+ import_sla_archive(path, p->win, p->mesh, progr);
+ break;
+ case Sel::profileOnly:
+ import_sla_archive(path, p->profile);
+ break;
+ }
+
+ } catch (std::exception &ex) {
+ p->err = ex.what();
+ }
+
+ update_status(100, was_canceled() ? _(L("Importing canceled.")) :
+ _(L("Importing done.")));
+}
+
+void SLAImportJob::reset()
+{
+ p->sel = Sel::modelAndProfile;
+ p->mesh = {};
+ p->profile = {};
+ p->win = {2, 2};
+ p->path.Clear();
+}
+
+void SLAImportJob::prepare()
+{
+ reset();
+
+ ImportDlg dlg{p->plater};
+
+ if (dlg.ShowModal() == wxID_OK) {
+ auto path = dlg.get_path();
+ auto nm = wxFileName(path);
+ p->path = !nm.Exists(wxFILE_EXISTS_REGULAR) ? "" : path.ToUTF8();
+ p->sel = dlg.get_selection();
+ p->win = dlg.get_marchsq_windowsize();
+ } else {
+ p->path = "";
+ }
+}
+
+void SLAImportJob::finalize()
+{
+ // Ignore the arrange result if aborted.
+ if (was_canceled()) return;
+
+ if (!p->err.empty()) {
+ show_error(p->plater, p->err);
+ p->err = "";
+ return;
+ }
+
+ std::string name = wxFileName(p->path).GetName().ToUTF8().data();
+
+ if (!p->profile.empty()) {
+ const ModelObjectPtrs& objects = p->plater->model().objects;
+ for (auto object : objects)
+ if (object->volumes.size() > 1)
+ {
+ Slic3r::GUI::show_info(nullptr,
+ _(L("You cannot load SLA project with a multi-part object on the bed")) + "\n\n" +
+ _(L("Please check your object list before preset changing.")),
+ _(L("Attention!")) );
+ return;
+ }
+
+ DynamicPrintConfig config = {};
+ config.apply(SLAFullPrintConfig::defaults());
+ config += std::move(p->profile);
+
+ wxGetApp().preset_bundle->load_config_model(name, std::move(config));
+ wxGetApp().load_current_presets();
+ }
+
+ if (!p->mesh.empty()) {
+ bool is_centered = false;
+ p->plater->sidebar().obj_list()->load_mesh_object(p->mesh, name, is_centered);
+ }
+
+ reset();
+}
+
+}}
diff --git a/src/slic3r/GUI/Jobs/SLAImportJob.hpp b/src/slic3r/GUI/Jobs/SLAImportJob.hpp
new file mode 100644
index 000000000..cff6cc899
--- /dev/null
+++ b/src/slic3r/GUI/Jobs/SLAImportJob.hpp
@@ -0,0 +1,31 @@
+#ifndef SLAIMPORTJOB_HPP
+#define SLAIMPORTJOB_HPP
+
+#include "Job.hpp"
+
+namespace Slic3r { namespace GUI {
+
+class Plater;
+
+class SLAImportJob : public Job {
+ class priv;
+
+ std::unique_ptr<priv> p;
+
+public:
+ SLAImportJob(std::shared_ptr<ProgressIndicator> pri, Plater *plater);
+ ~SLAImportJob();
+
+ void process() override;
+
+ void reset();
+
+protected:
+ void prepare() override;
+
+ void finalize() override;
+};
+
+}} // namespace Slic3r::GUI
+
+#endif // SLAIMPORTJOB_HPP
diff --git a/src/slic3r/GUI/KBShortcutsDialog.cpp b/src/slic3r/GUI/KBShortcutsDialog.cpp
index 842cec5e2..11bf7f687 100644
--- a/src/slic3r/GUI/KBShortcutsDialog.cpp
+++ b/src/slic3r/GUI/KBShortcutsDialog.cpp
@@ -1,3 +1,4 @@
+#include "libslic3r/libslic3r.h"
#include "KBShortcutsDialog.hpp"
#include "I18N.hpp"
#include "libslic3r/Utils.hpp"
@@ -6,44 +7,15 @@
#include <wx/display.h>
#include "GUI_App.hpp"
#include "wxExtensions.hpp"
-
-#define NOTEBOOK_TOP 1
-#define NOTEBOOK_LEFT 2
-#define LISTBOOK_TOP 3
-#define LISTBOOK_LEFT 4
-#define TOOLBOOK 5
-#define CHOICEBOOK 6
-#define BOOK_TYPE NOTEBOOK_TOP
-
-#if (BOOK_TYPE == NOTEBOOK_TOP) || (BOOK_TYPE == NOTEBOOK_LEFT)
+#include "MainFrame.hpp"
#include <wx/notebook.h>
-#elif (BOOK_TYPE == LISTBOOK_TOP) || (BOOK_TYPE == LISTBOOK_LEFT)
-#include <wx/listbook.h>
-#elif BOOK_TYPE == TOOLBOOK
-#include <wx/toolbook.h>
-#elif BOOK_TYPE == CHOICEBOOK
-#include <wx/choicebk.h>
-#endif // BOOK_TYPE
-
-#if ENABLE_SCROLLABLE
-static wxSize get_screen_size(wxWindow* window)
-{
- const auto idx = wxDisplay::GetFromWindow(window);
- wxDisplay display(idx != wxNOT_FOUND ? idx : 0u);
- return display.GetClientArea().GetSize();
-}
-#endif // ENABLE_SCROLLABLE
namespace Slic3r {
namespace GUI {
KBShortcutsDialog::KBShortcutsDialog()
- : DPIDialog(NULL, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _(L("Keyboard Shortcuts")),
-#if ENABLE_SCROLLABLE
+ : DPIDialog(static_cast<wxWindow*>(wxGetApp().mainframe), wxID_ANY, wxString(wxGetApp().is_editor() ? SLIC3R_APP_NAME : GCODEVIEWER_APP_NAME) + " - " + _L("Keyboard Shortcuts"),
wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
-#else
- wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE)
-#endif // ENABLE_SCROLLABLE
{
SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
@@ -56,31 +28,14 @@ KBShortcutsDialog::KBShortcutsDialog()
main_sizer->Add(create_header(this, bold_font), 0, wxEXPAND | wxALL, 10);
-#if BOOK_TYPE == NOTEBOOK_TOP
wxNotebook* book = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_TOP);
-#elif BOOK_TYPE == NOTEBOOK_LEFT
- wxNotebook* book = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_LEFT);
-#elif BOOK_TYPE == LISTBOOK_TOP
- wxListbook* book = new wxListbook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLB_TOP);
-#elif BOOK_TYPE == LISTBOOK_LEFT
- wxListbook* book = new wxListbook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLB_LEFT);
-#elif BOOK_TYPE == TOOLBOOK
- wxToolbook* book = new wxToolbook(this, wxID_ANY);
-#elif BOOK_TYPE == CHOICEBOOK
- wxChoicebook* book = new wxChoicebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxCHB_TOP);
-#endif // BOOK_TYPE
-main_sizer->Add(book, 1, wxEXPAND | wxALL, 10);
+ main_sizer->Add(book, 1, wxEXPAND | wxALL, 10);
fill_shortcuts();
- for (size_t i = 0; i < m_full_shortcuts.size(); ++i)
- {
-#if ENABLE_SCROLLABLE
+ for (size_t i = 0; i < m_full_shortcuts.size(); ++i) {
wxPanel* page = create_page(book, m_full_shortcuts[i], font, bold_font);
m_pages.push_back(page);
- book->AddPage(page, m_full_shortcuts[i].first, i == 0);
-#else
- book->AddPage(create_page(book, m_full_shortcuts[i], font, bold_font), m_full_shortcuts[i].first, i == 0);
-#endif // ENABLE_SCROLLABLE
+ book->AddPage(page, m_full_shortcuts[i].first.first, i == 0);
}
wxStdDialogButtonSizer* buttons = this->CreateStdDialogButtonSizer(wxOK);
@@ -89,6 +44,7 @@ main_sizer->Add(book, 1, wxEXPAND | wxALL, 10);
SetSizer(main_sizer);
main_sizer->SetSizeHints(this);
+ this->CenterOnParent();
}
void KBShortcutsDialog::on_dpi_changed(const wxRect& suggested_rect)
@@ -107,119 +63,194 @@ void KBShortcutsDialog::fill_shortcuts()
const std::string& ctrl = GUI::shortkey_ctrl_prefix();
const std::string& alt = GUI::shortkey_alt_prefix();
- Shortcuts commands_shortcuts = {
- // File
- { ctrl + "N", L("New project, clear plater") },
- { ctrl + "O", L("Open project STL/OBJ/AMF/3MF with config, clear plater") },
- { ctrl + "S", L("Save project (3mf)") },
- { ctrl + alt + "S", L("Save project as (3mf)") },
- { ctrl + "R", L("(Re)slice") },
- // File>Import
- { ctrl + "I", L("Import STL/OBJ/AMF/3MF without config, keep plater") },
- { ctrl + "L", L("Import Config from ini/amf/3mf/gcode") },
- { ctrl + alt + "L", L("Load Config from ini/amf/3mf/gcode and merge") },
- // File>Export
- { ctrl + "G", L("Export G-code") },
- { ctrl + "Shift+" + "G", L("Send G-code") },
- { ctrl + "E", L("Export config") },
- { ctrl + "U", L("Export to SD card / Flash drive") },
- { ctrl + "T", L("Eject SD card / Flash drive") },
- // Edit
- { ctrl + "A", L("Select all objects") },
- { "Esc", L("Deselect all") },
- { "Del", L("Delete selected") },
- { ctrl + "Del", L("Delete all") },
- { ctrl + "Z", L("Undo") },
- { ctrl + "Y", L("Redo") },
- { ctrl + "C", L("Copy to clipboard") },
- { ctrl + "V", L("Paste from clipboard") },
- { "F5", L("Reload plater from disk") },
- // Window
- { ctrl + "1", L("Select Plater Tab") },
- { ctrl + "2", L("Select Print Settings Tab") },
- { ctrl + "3", L("Select Filament Settings Tab") },
- { ctrl + "4", L("Select Printer Settings Tab") },
- { ctrl + "5", L("Switch to 3D") },
- { ctrl + "6", L("Switch to Preview") },
- { ctrl + "J", L("Print host upload queue") },
- // View
- { "0-6", L("Camera view") },
- { "E", L("Show/Hide object/instance labels") },
- // Configuration
- { ctrl + "P", L("Preferences") },
- // Help
- { "?", L("Show keyboard shortcuts list") }
- };
-
- m_full_shortcuts.push_back(std::make_pair(_(L("Commands")), commands_shortcuts));
-
- Shortcuts plater_shortcuts = {
- { "A", L("Arrange") },
- { "Shift+A", L("Arrange selection") },
- { "+", L("Add Instance of the selected object") },
- { "-", L("Remove Instance of the selected object") },
- { ctrl, L("Press to select multiple objects\nor move multiple objects with mouse") },
- { "Shift+", L("Press to activate selection rectangle") },
- { alt, L("Press to activate deselection rectangle") },
- { L("Arrow Up"), L("Move selection 10 mm in positive Y direction") },
- { L("Arrow Down"), L("Move selection 10 mm in negative Y direction") },
- { L("Arrow Left"), L("Move selection 10 mm in negative X direction") },
- { L("Arrow Right"), L("Move selection 10 mm in positive X direction") },
- { std::string("Shift+") + L("Any arrow"), L("Movement step set to 1 mm") },
- { ctrl + L("Any arrow"), L("Movement in camera space") },
- { L("Page Up"), L("Rotate selection 45 degrees CCW") },
- { L("Page Down"), L("Rotate selection 45 degrees CW") },
- { "M", L("Gizmo move") },
- { "S", L("Gizmo scale") },
- { "R", L("Gizmo rotate") },
- { "C", L("Gizmo cut") },
- { "F", L("Gizmo Place face on bed") },
- { "H", L("Gizmo SLA hollow") },
- { "L", L("Gizmo SLA support points") },
- { "Esc", L("Unselect gizmo or clear selection") },
- { "K", L("Change camera type (perspective, orthographic)") },
- { "B", L("Zoom to Bed") },
- { "Z", L("Zoom to selected object\nor all objects in scene, if none selected") },
- { "I", L("Zoom in") },
- { "O", L("Zoom out") },
- { ctrl + "M", L("Show/Hide 3Dconnexion devices settings dialog") }
+ if (wxGetApp().is_editor()) {
+ Shortcuts commands_shortcuts = {
+ // File
+ { ctrl + "N", L("New project, clear plater") },
+ { ctrl + "O", L("Open project STL/OBJ/AMF/3MF with config, clear plater") },
+ { ctrl + "S", L("Save project (3mf)") },
+ { ctrl + alt + "S", L("Save project as (3mf)") },
+ { ctrl + "R", L("(Re)slice") },
+ // File>Import
+ { ctrl + "I", L("Import STL/OBJ/AMF/3MF without config, keep plater") },
+ { ctrl + "L", L("Import Config from ini/amf/3mf/gcode") },
+ { ctrl + alt + "L", L("Load Config from ini/amf/3mf/gcode and merge") },
+ // File>Export
+ { ctrl + "G", L("Export G-code") },
+ { ctrl + "Shift+" + "G", L("Send G-code") },
+ { ctrl + "E", L("Export config") },
+ { ctrl + "U", L("Export to SD card / Flash drive") },
+ { ctrl + "T", L("Eject SD card / Flash drive") },
+ // Edit
+ { ctrl + "A", L("Select all objects") },
+ { "Esc", L("Deselect all") },
+ { "Del", L("Delete selected") },
+ { ctrl + "Del", L("Delete all") },
+ { ctrl + "Z", L("Undo") },
+ { ctrl + "Y", L("Redo") },
+ { ctrl + "C", L("Copy to clipboard") },
+ { ctrl + "V", L("Paste from clipboard") },
+#ifdef __APPLE__
+ { ctrl + "Shift+" + "R", L("Reload plater from disk") },
+#else
+ { "F5", L("Reload plater from disk") },
+#endif // __APPLE__
+ { ctrl + "F", L("Search") },
+ // Window
+ { ctrl + "1", L("Select Plater Tab") },
+ { ctrl + "2", L("Select Print Settings Tab") },
+ { ctrl + "3", L("Select Filament Settings Tab") },
+ { ctrl + "4", L("Select Printer Settings Tab") },
+ { ctrl + "5", L("Switch to 3D") },
+ { ctrl + "6", L("Switch to Preview") },
+ { ctrl + "J", L("Print host upload queue") },
+ { ctrl + "Shift+" + "I", L("Open new instance") },
+ // View
+ { "0-6", L("Camera view") },
+ { "E", L("Show/Hide object/instance labels") },
+ // Configuration
+ { ctrl + "P", L("Preferences") },
+ // Help
+ { "?", L("Show keyboard shortcuts list") }
+ };
+
+ m_full_shortcuts.push_back({ { _L("Commands"), "" }, commands_shortcuts });
+
+ Shortcuts plater_shortcuts = {
+ { "A", L("Arrange") },
+ { "Shift+A", L("Arrange selection") },
+ { "+", L("Add Instance of the selected object") },
+ { "-", L("Remove Instance of the selected object") },
+ { ctrl, L("Press to select multiple objects\nor move multiple objects with mouse") },
+ { "Shift+", L("Press to activate selection rectangle") },
+ { alt, L("Press to activate deselection rectangle") },
+ { L("Arrow Up"), L("Move selection 10 mm in positive Y direction") },
+ { L("Arrow Down"), L("Move selection 10 mm in negative Y direction") },
+ { L("Arrow Left"), L("Move selection 10 mm in negative X direction") },
+ { L("Arrow Right"), L("Move selection 10 mm in positive X direction") },
+ { std::string("Shift+") + L("Any arrow"), L("Movement step set to 1 mm") },
+ { ctrl + L("Any arrow"), L("Movement in camera space") },
+ { L("Page Up"), L("Rotate selection 45 degrees CCW") },
+ { L("Page Down"), L("Rotate selection 45 degrees CW") },
+ { "M", L("Gizmo move") },
+ { "S", L("Gizmo scale") },
+ { "R", L("Gizmo rotate") },
+ { "C", L("Gizmo cut") },
+ { "F", L("Gizmo Place face on bed") },
+ { "H", L("Gizmo SLA hollow") },
+ { "L", L("Gizmo SLA support points") },
+ { "Esc", L("Unselect gizmo or clear selection") },
+ { "K", L("Change camera type (perspective, orthographic)") },
+ { "B", L("Zoom to Bed") },
+ { "Z", L("Zoom to selected object\nor all objects in scene, if none selected") },
+ { "I", L("Zoom in") },
+ { "O", L("Zoom out") },
+ { "Tab", L("Switch between Editor/Preview") },
+ { "Shift+Tab", L("Collapse/Expand the sidebar") },
+#if ENABLE_CTRL_M_ON_WINDOWS
+#ifdef _WIN32
+ { ctrl + "M", L("Show/Hide 3Dconnexion devices settings dialog, if enabled") },
+#else
+ { ctrl + "M", L("Show/Hide 3Dconnexion devices settings dialog") },
+#endif // _WIN32
+#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.
- , { "T", "Toggle picking pass texture rendering on/off" }
+ // Don't localize debugging texts.
+ { "P", "Toggle picking pass texture rendering on/off" },
#endif // ENABLE_RENDER_PICKING_PASS
- };
+ };
- m_full_shortcuts.push_back(std::make_pair(_(L("Plater")), plater_shortcuts));
+ m_full_shortcuts.push_back({ { _L("Plater"), "" }, plater_shortcuts });
- Shortcuts gizmos_shortcuts = {
- { "Shift+", L("Press to snap by 5% in Gizmo scale\nor to snap by 1mm in Gizmo move") },
- { "F", L("Scale selection to fit print volume\nin Gizmo scale") },
- { ctrl, L("Press to activate one direction scaling in Gizmo scale") },
- { alt, L("Press to scale (in Gizmo scale) or rotate (in Gizmo rotate)\nselected objects around their own center") },
- };
+ Shortcuts gizmos_shortcuts = {
+ { ctrl, L("All gizmos: Rotate - left mouse button; Pan - right mouse button") },
+ { "Shift+", L("Gizmo move: Press to snap by 1mm") },
+ { "Shift+", L("Gizmo scale: Press to snap by 5%") },
+ { "F", L("Gizmo scale: Scale selection to fit print volume") },
+ { ctrl, L("Gizmo scale: Press to activate one direction scaling") },
+ { alt, L("Gizmo scale: Press to scale selected objects around their own center") },
+ { alt, L("Gizmo rotate: Press to rotate selected objects around their own center") },
+ };
+
+ m_full_shortcuts.push_back({ { _L("Gizmos"), _L("The following shortcuts are applicable when the specified gizmo is active") }, gizmos_shortcuts });
+ }
+ else {
+ Shortcuts commands_shortcuts = {
+ { ctrl + "O", L("Open a G-code file") },
+#ifdef __APPLE__
+ { ctrl + "Shift+" + "R", L("Reload the plater from disk") },
+#else
+ { "F5", L("Reload plater from disk") },
+#endif // __APPLE__
+ };
- m_full_shortcuts.push_back(std::make_pair(_(L("Gizmos")), gizmos_shortcuts));
+ m_full_shortcuts.push_back({ { _L("Commands"), "" }, commands_shortcuts });
+ }
Shortcuts preview_shortcuts = {
- { L("Arrow Up"), L("Upper Layer") },
- { L("Arrow Down"), L("Lower Layer") },
+#if ENABLE_ARROW_KEYS_WITH_SLIDERS
+ { L("Arrow Up"), L("Vertical slider - Move active thumb Up") },
+ { L("Arrow Down"), L("Vertical slider - Move active thumb Down") },
+ { L("Arrow Left"), L("Horizontal slider - Move active thumb Left") },
+ { L("Arrow Right"), L("Horizontal slider - Move active thumb Right") },
+ { "W", L("Vertical slider - Move active thumb Up") },
+ { "S", L("Vertical slider - Move active thumb Down") },
+ { "A", L("Horizontal slider - Move active thumb Left") },
+ { "D", L("Horizontal slider - Move active thumb Right") },
+ { "X", L("On/Off one layer mode of the vertical slider") },
+ { "L", L("Show/Hide Legend and Estimated printing time") },
+#else
+ { L("Arrow Up"), L("Upper layer") },
+ { L("Arrow Down"), L("Lower layer") },
{ "U", L("Upper Layer") },
{ "D", L("Lower Layer") },
- { "L", L("Show/Hide Legend") }
+ { "L", L("Show/Hide Legend & Estimated printing time") },
+#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS
};
- m_full_shortcuts.push_back(std::make_pair(_(L("Preview")), preview_shortcuts));
+ m_full_shortcuts.push_back({ { _L("Preview"), "" }, preview_shortcuts });
Shortcuts layers_slider_shortcuts = {
+#if ENABLE_ARROW_KEYS_WITH_SLIDERS
+ { L("Arrow Up"), L("Move active thumb Up") },
+ { L("Arrow Down"), L("Move active thumb Down") },
+ { L("Arrow Left"), L("Set upper thumb as active") },
+ { L("Arrow Right"), L("Set lower thumb as active") },
+ { "+", L("Add color change marker for current layer") },
+ { "-", L("Delete color change marker for current layer") },
+#else
{ L("Arrow Up"), L("Move current slider thumb Up") },
{ L("Arrow Down"), L("Move current slider thumb Down") },
{ L("Arrow Left"), L("Set upper thumb to current slider thumb") },
{ L("Arrow Right"), L("Set lower thumb to current slider thumb") },
{ "+", L("Add color change marker for current layer") },
- { "-", L("Delete color change marker for current layer") }
+ { "-", L("Delete color change marker for current layer") },
+#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS
+ { "Shift+", L("Press to speed up 5 times while moving thumb\nwith arrow keys or mouse wheel") },
+ { ctrl, L("Press to speed up 5 times while moving thumb\nwith arrow keys or mouse wheel") },
+ };
+
+ m_full_shortcuts.push_back({ { _L("Vertical Slider"), _L("The following shortcuts are applicable in G-code preview when the vertical slider is active") }, layers_slider_shortcuts });
+
+ Shortcuts sequential_slider_shortcuts = {
+#if ENABLE_ARROW_KEYS_WITH_SLIDERS
+ { L("Arrow Left"), L("Move active thumb Left") },
+ { L("Arrow Right"), L("Move active thumb Right") },
+ { L("Arrow Up"), L("Set left thumb as active") },
+ { L("Arrow Down"), L("Set right thumb as active") },
+#else
+ { L("Arrow Left"), L("Move active slider thumb Left") },
+ { L("Arrow Right"), L("Move active slider thumb Right") },
+#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS
+ { "Shift+", L("Press to speed up 5 times while moving thumb\nwith arrow keys or mouse wheel") },
+ { ctrl, L("Press to speed up 5 times while moving thumb\nwith arrow keys or mouse wheel") },
};
- m_full_shortcuts.push_back(std::make_pair(_(L("Layers Slider")), layers_slider_shortcuts));
+ m_full_shortcuts.push_back({ { _L("Horizontal Slider"), _L("The following shortcuts are applicable in G-code preview when the horizontal slider is active") }, sequential_slider_shortcuts });
}
wxPanel* KBShortcutsDialog::create_header(wxWindow* parent, const wxFont& bold_font)
@@ -237,12 +268,12 @@ wxPanel* KBShortcutsDialog::create_header(wxWindow* parent, const wxFont& bold_f
sizer->AddStretchSpacer();
// logo
- m_logo_bmp = ScalableBitmap(this, "PrusaSlicer_32px.png", 32);
+ m_logo_bmp = ScalableBitmap(this, wxGetApp().is_editor() ? "PrusaSlicer_32px.png" : "PrusaSlicer-gcodeviewer_32px.png", 32);
m_header_bitmap = new wxStaticBitmap(panel, wxID_ANY, m_logo_bmp.bmp());
sizer->Add(m_header_bitmap, 0, wxEXPAND | wxLEFT | wxRIGHT, 10);
// text
- wxStaticText* text = new wxStaticText(panel, wxID_ANY, _(L("Keyboard shortcuts")));
+ wxStaticText* text = new wxStaticText(panel, wxID_ANY, _L("Keyboard shortcuts"));
text->SetFont(header_font);
sizer->Add(text, 0, wxALIGN_CENTER_VERTICAL);
@@ -252,52 +283,61 @@ wxPanel* KBShortcutsDialog::create_header(wxWindow* parent, const wxFont& bold_f
return panel;
}
-wxPanel* KBShortcutsDialog::create_page(wxWindow* parent, const std::pair<wxString, Shortcuts>& shortcuts, const wxFont& font, const wxFont& bold_font)
+wxPanel* KBShortcutsDialog::create_page(wxWindow* parent, const ShortcutsItem& shortcuts, const wxFont& font, const wxFont& bold_font)
{
- static const int max_items_per_column = 20;
- int columns_count = 1 + (int)shortcuts.second.size() / max_items_per_column;
+ wxPanel* main_page = new wxPanel(parent);
+ wxBoxSizer* main_sizer = new wxBoxSizer(wxVERTICAL);
+
+ if (!shortcuts.first.second.empty()) {
+ main_sizer->AddSpacer(10);
+ wxBoxSizer* info_sizer = new wxBoxSizer(wxHORIZONTAL);
+ info_sizer->AddStretchSpacer();
+ info_sizer->Add(new wxStaticText(main_page, wxID_ANY, shortcuts.first.second), 0);
+ info_sizer->AddStretchSpacer();
+ main_sizer->Add(info_sizer, 0, wxEXPAND);
+ main_sizer->AddSpacer(10);
+ }
-#if ENABLE_SCROLLABLE
- wxScrolledWindow* page = new wxScrolledWindow(parent);
- page->SetScrollbars(20, 20, 50, 50);
- page->SetInitialSize(wxSize(850, 450));
-#else
- wxPanel* page = new wxPanel(parent);
-#endif // ENABLE_SCROLLABLE
+ static const int max_items_per_column = 20;
+ int columns_count = 1 + static_cast<int>(shortcuts.second.size()) / max_items_per_column;
-#if (BOOK_TYPE == LISTBOOK_TOP) || (BOOK_TYPE == LISTBOOK_LEFT)
- wxStaticBoxSizer* sizer = new wxStaticBoxSizer(wxVERTICAL, page, " " + shortcuts.first + " ");
- sizer->GetStaticBox()->SetFont(bold_font);
-#else
- wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
-#endif // BOOK_TYPE
+ wxScrolledWindow* scrollable_panel = new wxScrolledWindow(main_page);
+ scrollable_panel->SetScrollbars(20, 20, 50, 50);
+ scrollable_panel->SetInitialSize(wxSize(850, 450));
+ wxBoxSizer* scrollable_panel_sizer = new wxBoxSizer(wxVERTICAL);
wxFlexGridSizer* grid_sizer = new wxFlexGridSizer(2 * columns_count, 5, 15);
int items_count = (int)shortcuts.second.size();
- for (int i = 0; i < max_items_per_column; ++i)
- {
- for (int j = 0; j < columns_count; ++j)
- {
+ for (int i = 0; i < max_items_per_column; ++i) {
+ for (int j = 0; j < columns_count; ++j) {
int id = j * max_items_per_column + i;
- if (id >= items_count)
- break;
-
- const auto& [shortcut, description] = shortcuts.second[id];
- auto key = new wxStaticText(page, wxID_ANY, _(shortcut));
- key->SetFont(bold_font);
- grid_sizer->Add(key, 0, wxALIGN_CENTRE_VERTICAL);
-
- auto desc = new wxStaticText(page, wxID_ANY, _(description));
- desc->SetFont(font);
- grid_sizer->Add(desc, 0, wxALIGN_CENTRE_VERTICAL);
+ if (id < items_count) {
+ const auto& [shortcut, description] = shortcuts.second[id];
+ auto key = new wxStaticText(scrollable_panel, wxID_ANY, _(shortcut));
+ key->SetFont(bold_font);
+ grid_sizer->Add(key, 0, wxALIGN_CENTRE_VERTICAL);
+
+ auto desc = new wxStaticText(scrollable_panel, wxID_ANY, _(description));
+ desc->SetFont(font);
+ grid_sizer->Add(desc, 0, wxALIGN_CENTRE_VERTICAL);
+ }
+ else {
+ if (columns_count > 1) {
+ grid_sizer->Add(new wxStaticText(scrollable_panel, wxID_ANY, ""), 0, wxALIGN_CENTRE_VERTICAL);
+ grid_sizer->Add(new wxStaticText(scrollable_panel, wxID_ANY, ""), 0, wxALIGN_CENTRE_VERTICAL);
+ }
+ }
}
}
- sizer->Add(grid_sizer, 1, wxEXPAND | wxALL, 10);
+ scrollable_panel_sizer->Add(grid_sizer, 1, wxEXPAND | wxALL, 10);
+ scrollable_panel->SetSizer(scrollable_panel_sizer);
+
+ main_sizer->Add(scrollable_panel, 1, wxEXPAND);
+ main_page->SetSizer(main_sizer);
- page->SetSizer(sizer);
- return page;
+ return main_page;
}
} // namespace GUI
diff --git a/src/slic3r/GUI/KBShortcutsDialog.hpp b/src/slic3r/GUI/KBShortcutsDialog.hpp
index 70820ae77..86ddd0a06 100644
--- a/src/slic3r/GUI/KBShortcutsDialog.hpp
+++ b/src/slic3r/GUI/KBShortcutsDialog.hpp
@@ -8,8 +8,6 @@
#include "GUI_Utils.hpp"
#include "wxExtensions.hpp"
-#define ENABLE_SCROLLABLE 1
-
namespace Slic3r {
namespace GUI {
@@ -17,14 +15,13 @@ class KBShortcutsDialog : public DPIDialog
{
typedef std::pair<std::string, std::string> Shortcut;
typedef std::vector<Shortcut> Shortcuts;
- typedef std::vector<std::pair<wxString, Shortcuts>> ShortcutsVec;
+ typedef std::pair<std::pair<wxString, wxString>, Shortcuts> ShortcutsItem;
+ typedef std::vector<ShortcutsItem> ShortcutsVec;
ShortcutsVec m_full_shortcuts;
ScalableBitmap m_logo_bmp;
wxStaticBitmap* m_header_bitmap;
-#if ENABLE_SCROLLABLE
std::vector<wxPanel*> m_pages;
-#endif // ENABLE_SCROLLABLE
public:
KBShortcutsDialog();
@@ -36,8 +33,7 @@ private:
void fill_shortcuts();
wxPanel* create_header(wxWindow* parent, const wxFont& bold_font);
- wxPanel* create_page(wxWindow* parent, const std::pair<wxString, Shortcuts>& shortcuts, const wxFont& font, const wxFont& bold_font);
-
+ wxPanel* create_page(wxWindow* parent, const ShortcutsItem& shortcuts, const wxFont& font, const wxFont& bold_font);
};
} // namespace GUI
diff --git a/src/slic3r/GUI/LambdaObjectDialog.cpp b/src/slic3r/GUI/LambdaObjectDialog.cpp
deleted file mode 100644
index 63c8d329c..000000000
--- a/src/slic3r/GUI/LambdaObjectDialog.cpp
+++ /dev/null
@@ -1,200 +0,0 @@
-#include "LambdaObjectDialog.hpp"
-
-#include <wx/window.h>
-#include <wx/button.h>
-#include "OptionsGroup.hpp"
-#include "I18N.hpp"
-
-namespace Slic3r
-{
-namespace GUI
-{
-
-LambdaObjectDialog::LambdaObjectDialog(wxWindow* parent,
- const wxString type_name):
- m_type_name(type_name)
-{
- Create(parent, wxID_ANY, _(L("Lambda Object")),
- parent->GetScreenPosition(), wxDefaultSize,
- wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER);
-
- // instead of double dim[3] = { 1.0, 1.0, 1.0 };
- object_parameters.dim[0] = 1.0;
- object_parameters.dim[1] = 1.0;
- object_parameters.dim[2] = 1.0;
-
- sizer = new wxBoxSizer(wxVERTICAL);
-
- // modificator options
- if (m_type_name == wxEmptyString) {
- m_modificator_options_book = new wxChoicebook( this, wxID_ANY, wxDefaultPosition,
- wxDefaultSize, wxCHB_TOP);
- sizer->Add(m_modificator_options_book, 1, wxEXPAND | wxALL, 10);
- }
- else {
- m_panel = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxDefaultSize);
- sizer->Add(m_panel, 1, wxEXPAND | wxALL, 10);
- }
-
- ConfigOptionDef def;
- def.width = 70;
- auto optgroup = init_modificator_options_page(_(L("Box")));
- if (optgroup) {
- optgroup->m_on_change = [this](t_config_option_key opt_key, boost::any value) {
- int opt_id = opt_key == "l" ? 0 :
- opt_key == "w" ? 1 :
- opt_key == "h" ? 2 : -1;
- if (opt_id < 0) return;
- object_parameters.dim[opt_id] = boost::any_cast<double>(value);
- };
-
- def.type = coFloat;
- def.set_default_value(new ConfigOptionFloat{ 1.0 });
- def.label = L("Length");
- Option option(def, "l");
- optgroup->append_single_option_line(option);
-
- def.label = L("Width");
- option = Option(def, "w");
- optgroup->append_single_option_line(option);
-
- def.label = L("Height");
- option = Option(def, "h");
- optgroup->append_single_option_line(option);
- }
-
- optgroup = init_modificator_options_page(_(L("Cylinder")));
- if (optgroup) {
- optgroup->m_on_change = [this](t_config_option_key opt_key, boost::any value) {
- int val = boost::any_cast<int>(value);
- if (opt_key == "cyl_r")
- object_parameters.cyl_r = val;
- else if (opt_key == "cyl_h")
- object_parameters.cyl_h = val;
- else return;
- };
-
- def.type = coInt;
- def.set_default_value(new ConfigOptionInt{ 1 });
- def.label = L("Radius");
- auto option = Option(def, "cyl_r");
- optgroup->append_single_option_line(option);
-
- def.label = L("Height");
- option = Option(def, "cyl_h");
- optgroup->append_single_option_line(option);
- }
-
- optgroup = init_modificator_options_page(_(L("Sphere")));
- if (optgroup) {
- optgroup->m_on_change = [this](t_config_option_key opt_key, boost::any value) {
- if (opt_key == "sph_rho")
- object_parameters.sph_rho = boost::any_cast<double>(value);
- else return;
- };
-
- def.type = coFloat;
- def.set_default_value(new ConfigOptionFloat{ 1.0 });
- def.label = L("Rho");
- auto option = Option(def, "sph_rho");
- optgroup->append_single_option_line(option);
- }
-
- optgroup = init_modificator_options_page(_(L("Slab")));
- if (optgroup) {
- optgroup->m_on_change = [this](t_config_option_key opt_key, boost::any value) {
- double val = boost::any_cast<double>(value);
- if (opt_key == "slab_z")
- object_parameters.slab_z = val;
- else if (opt_key == "slab_h")
- object_parameters.slab_h = val;
- else return;
- };
-
- def.type = coFloat;
- def.set_default_value(new ConfigOptionFloat{ 1.0 });
- def.label = L("Height");
- auto option = Option(def, "slab_h");
- optgroup->append_single_option_line(option);
-
- def.label = L("Initial Z");
- option = Option(def, "slab_z");
- optgroup->append_single_option_line(option);
- }
-
- Bind(wxEVT_CHOICEBOOK_PAGE_CHANGED, ([this](wxCommandEvent e)
- {
- auto page_idx = m_modificator_options_book->GetSelection();
- if (page_idx < 0) return;
- switch (page_idx)
- {
- case 0:
- object_parameters.type = LambdaTypeBox;
- break;
- case 1:
- object_parameters.type = LambdaTypeCylinder;
- break;
- case 2:
- object_parameters.type = LambdaTypeSphere;
- break;
- case 3:
- object_parameters.type = LambdaTypeSlab;
- break;
- default:
- break;
- }
- }));
-
- const auto button_sizer = CreateStdDialogButtonSizer(wxOK | wxCANCEL);
-
- wxButton* btn_OK = static_cast<wxButton*>(FindWindowById(wxID_OK, this));
- btn_OK->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) {
- // validate user input
- if (!CanClose())return;
- EndModal(wxID_OK);
- Destroy();
- });
-
- wxButton* btn_CANCEL = static_cast<wxButton*>(FindWindowById(wxID_CANCEL, this));
- btn_CANCEL->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) {
- // validate user input
- if (!CanClose())return;
- EndModal(wxID_CANCEL);
- Destroy();
- });
-
- sizer->Add(button_sizer, 0, wxALIGN_CENTER_HORIZONTAL | wxBOTTOM, 10);
-
- SetSizer(sizer);
- sizer->Fit(this);
- sizer->SetSizeHints(this);
-}
-
-// Called from the constructor.
-// Create a panel for a rectangular / circular / custom bed shape.
-ConfigOptionsGroupShp LambdaObjectDialog::init_modificator_options_page(const wxString& title)
-{
- if (!m_type_name.IsEmpty() && m_type_name != title)
- return nullptr;
-
- auto panel = m_type_name.IsEmpty() ? new wxPanel(m_modificator_options_book) : m_panel;
-
- ConfigOptionsGroupShp optgroup;
- optgroup = std::make_shared<ConfigOptionsGroup>(panel, _(L("Add")) + " " +title + " " +dots);
- optgroup->label_width = 100;
-
- m_optgroups.push_back(optgroup);
-
- if (m_type_name.IsEmpty()) {
- panel->SetSizerAndFit(optgroup->sizer);
- m_modificator_options_book->AddPage(panel, title);
- }
- else
- panel->SetSizer(optgroup->sizer);
-
- return optgroup;
-}
-
-
-} //namespace GUI
-} //namespace Slic3r
diff --git a/src/slic3r/GUI/LambdaObjectDialog.hpp b/src/slic3r/GUI/LambdaObjectDialog.hpp
deleted file mode 100644
index 5bc2d19a5..000000000
--- a/src/slic3r/GUI/LambdaObjectDialog.hpp
+++ /dev/null
@@ -1,59 +0,0 @@
-#ifndef slic3r_LambdaObjectDialog_hpp_
-#define slic3r_LambdaObjectDialog_hpp_
-
-#include <vector>
-#include <memory>
-
-#include <wx/dialog.h>
-#include <wx/sizer.h>
-#include <wx/choicebk.h>
-
-class wxPanel;
-
-namespace Slic3r
-{
-namespace GUI
-{
-enum LambdaTypeIDs{
- LambdaTypeBox,
- LambdaTypeCylinder,
- LambdaTypeSphere,
- LambdaTypeSlab
-};
-
-struct OBJECT_PARAMETERS
-{
- LambdaTypeIDs type = LambdaTypeBox;
- double dim[3];// = { 1.0, 1.0, 1.0 };
- int cyl_r = 1;
- int cyl_h = 1;
- double sph_rho = 1.0;
- double slab_h = 1.0;
- double slab_z = 0.0;
-};
-class ConfigOptionsGroup;
-using ConfigOptionsGroupShp = std::shared_ptr<ConfigOptionsGroup>;
-class LambdaObjectDialog : public wxDialog
-{
- wxChoicebook* m_modificator_options_book = nullptr;
- std::vector <ConfigOptionsGroupShp> m_optgroups;
- wxString m_type_name;
- wxPanel* m_panel = nullptr;
-public:
- LambdaObjectDialog(wxWindow* parent,
- const wxString type_name = wxEmptyString);
- ~LambdaObjectDialog() {}
-
- bool CanClose() { return true; } // ???
- OBJECT_PARAMETERS& ObjectParameters() { return object_parameters; }
-
- ConfigOptionsGroupShp init_modificator_options_page(const wxString& title);
-
- // Note whether the window was already closed, so a pending update is not executed.
- bool m_already_closed = false;
- OBJECT_PARAMETERS object_parameters;
- wxBoxSizer* sizer = nullptr;
-};
-} //namespace GUI
-} //namespace Slic3r
-#endif //slic3r_LambdaObjectDialog_hpp_
diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp
index 1e22359ab..8e6b1c5ef 100644
--- a/src/slic3r/GUI/MainFrame.cpp
+++ b/src/slic3r/GUI/MainFrame.cpp
@@ -7,7 +7,8 @@
#include <wx/menu.h>
#include <wx/progdlg.h>
#include <wx/tooltip.h>
-#include <wx/glcanvas.h>
+//#include <wx/glcanvas.h>
+#include <wx/filename.h>
#include <wx/debug.h>
#include <boost/algorithm/string/predicate.hpp>
@@ -15,33 +16,105 @@
#include "libslic3r/Print.hpp"
#include "libslic3r/Polygon.hpp"
#include "libslic3r/SLAPrint.hpp"
+#include "libslic3r/PresetBundle.hpp"
#include "Tab.hpp"
-#include "PresetBundle.hpp"
#include "ProgressStatusBar.hpp"
#include "3DScene.hpp"
-#include "AppConfig.hpp"
#include "PrintHostDialogs.hpp"
#include "wxExtensions.hpp"
#include "GUI_ObjectList.hpp"
#include "Mouse3DController.hpp"
#include "RemovableDriveManager.hpp"
+#include "InstanceCheck.hpp"
#include "I18N.hpp"
+#include "GLCanvas3D.hpp"
+#include "Plater.hpp"
+#include "../Utils/Process.hpp"
+#include "format.hpp"
#include <fstream>
+#include <string_view>
+
#include "GUI_App.hpp"
#ifdef _WIN32
#include <dbt.h>
+#include <shlobj.h>
#endif // _WIN32
namespace Slic3r {
namespace GUI {
+enum class ERescaleTarget
+{
+ Mainframe,
+ SettingsDialog
+};
+
+#ifdef __APPLE__
+class PrusaSlicerTaskBarIcon : public wxTaskBarIcon
+{
+public:
+ PrusaSlicerTaskBarIcon(wxTaskBarIconType iconType = wxTBI_DEFAULT_TYPE) : wxTaskBarIcon(iconType) {}
+ wxMenu *CreatePopupMenu() override {
+ wxMenu *menu = new wxMenu;
+ if(wxGetApp().app_config->get("single_instance") == "0") {
+ // Only allow opening a new PrusaSlicer instance on OSX if "single_instance" is disabled,
+ // as starting new instances would interfere with the locking mechanism of "single_instance" support.
+ append_menu_item(menu, wxID_ANY, _L("Open new instance"), _L("Open a new PrusaSlicer instance"),
+ [this](wxCommandEvent&) { start_new_slicer(); }, "", nullptr);
+ }
+ append_menu_item(menu, wxID_ANY, _L("G-code preview") + dots, _L("Open G-code viewer"),
+ [this](wxCommandEvent&) { start_new_gcodeviewer_open_file(); }, "", nullptr);
+ return menu;
+ }
+};
+class GCodeViewerTaskBarIcon : public wxTaskBarIcon
+{
+public:
+ GCodeViewerTaskBarIcon(wxTaskBarIconType iconType = wxTBI_DEFAULT_TYPE) : wxTaskBarIcon(iconType) {}
+ wxMenu *CreatePopupMenu() override {
+ wxMenu *menu = new wxMenu;
+ append_menu_item(menu, wxID_ANY, _L("Open PrusaSlicer"), _L("Open a new PrusaSlicer instance"),
+ [this](wxCommandEvent&) { start_new_slicer(nullptr, true); }, "", nullptr);
+ append_menu_item(menu, wxID_ANY, _L("G-code preview") + dots, _L("Open new G-code viewer"),
+ [this](wxCommandEvent&) { start_new_gcodeviewer_open_file(); }, "", nullptr);
+ return menu;
+ }
+};
+#endif // __APPLE__
+
+// Load the icon either from the exe, or from the ico file.
+static wxIcon main_frame_icon(GUI_App::EAppMode app_mode)
+{
+#if _WIN32
+ std::wstring path(size_t(MAX_PATH), wchar_t(0));
+ int len = int(::GetModuleFileName(nullptr, path.data(), MAX_PATH));
+ if (len > 0 && len < MAX_PATH) {
+ path.erase(path.begin() + len, path.end());
+ if (app_mode == GUI_App::EAppMode::GCodeViewer) {
+ // Only in case the slicer was started with --gcodeviewer parameter try to load the icon from prusa-gcodeviewer.exe
+ // Otherwise load it from the exe.
+ for (const std::wstring_view exe_name : { std::wstring_view(L"prusa-slicer.exe"), std::wstring_view(L"prusa-slicer-console.exe") })
+ if (boost::iends_with(path, exe_name)) {
+ path.erase(path.end() - exe_name.size(), path.end());
+ path += L"prusa-gcodeviewer.exe";
+ break;
+ }
+ }
+ }
+ return wxIcon(path, wxBITMAP_TYPE_ICO);
+#else // _WIN32
+ return wxIcon(Slic3r::var(app_mode == GUI_App::EAppMode::Editor ? "PrusaSlicer_128px.png" : "PrusaSlicer-gcodeviewer_128px.png"), wxBITMAP_TYPE_PNG);
+#endif // _WIN32
+}
+
MainFrame::MainFrame() :
DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_STYLE, "mainframe"),
m_printhost_queue_dlg(new PrintHostQueueDialog(this))
, m_recent_projects(9)
+ , m_settings_dialog(this)
{
// Fonts were created by the DPIFrame constructor for the monitor, on which the window opened.
wxGetApp().update_fonts(this);
@@ -51,33 +124,53 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S
#endif
// Font is already set in DPIFrame constructor
*/
- // Load the icon either from the exe, or from the ico file.
-#if _WIN32
- {
- TCHAR szExeFileName[MAX_PATH];
- GetModuleFileName(nullptr, szExeFileName, MAX_PATH);
- SetIcon(wxIcon(szExeFileName, wxBITMAP_TYPE_ICO));
+
+#ifdef __APPLE__
+ // Initialize the docker task bar icon.
+ switch (wxGetApp().get_app_mode()) {
+ default:
+ case GUI_App::EAppMode::Editor:
+ m_taskbar_icon = std::make_unique<PrusaSlicerTaskBarIcon>(wxTBI_DOCK);
+ m_taskbar_icon->SetIcon(wxIcon(Slic3r::var("PrusaSlicer_128px.png"), wxBITMAP_TYPE_PNG), "PrusaSlicer");
+ break;
+ case GUI_App::EAppMode::GCodeViewer:
+ m_taskbar_icon = std::make_unique<GCodeViewerTaskBarIcon>(wxTBI_DOCK);
+ m_taskbar_icon->SetIcon(wxIcon(Slic3r::var("PrusaSlicer-gcodeviewer_128px.png"), wxBITMAP_TYPE_PNG), "G-code Viewer");
+ break;
}
-#else
- SetIcon(wxIcon(Slic3r::var("PrusaSlicer_128px.png"), wxBITMAP_TYPE_PNG));
-#endif // _WIN32
+#endif // __APPLE__
+
+ // Load the icon either from the exe, or from the ico file.
+ SetIcon(main_frame_icon(wxGetApp().get_app_mode()));
// initialize status bar
- m_statusbar = std::make_shared<ProgressStatusBar>(this);
+ m_statusbar = std::make_shared<ProgressStatusBar>(this);
m_statusbar->set_font(GUI::wxGetApp().normal_font());
- m_statusbar->embed(this);
- m_statusbar->set_status_text(_(L("Version")) + " " +
- SLIC3R_VERSION +
- _(L(" - Remember to check for updates at http://github.com/prusa3d/PrusaSlicer/releases")));
-
- /* Load default preset bitmaps before a tabpanel initialization,
- * but after filling of an em_unit value
- */
- wxGetApp().preset_bundle->load_default_preset_bitmaps();
+ if (wxGetApp().is_editor())
+ m_statusbar->embed(this);
+ m_statusbar->set_status_text(_L("Version") + " " +
+ SLIC3R_VERSION + " - " +
+ _L("Remember to check for updates at https://github.com/prusa3d/PrusaSlicer/releases"));
// initialize tabpanel and menubar
init_tabpanel();
- init_menubar();
+ if (wxGetApp().is_gcode_viewer())
+ init_menubar_as_gcodeviewer();
+ else
+ init_menubar_as_editor();
+
+#if _WIN32
+ // This is needed on Windows to fake the CTRL+# of the window menu when using the numpad
+ wxAcceleratorEntry entries[6];
+ entries[0].Set(wxACCEL_CTRL, WXK_NUMPAD1, wxID_HIGHEST + 1);
+ entries[1].Set(wxACCEL_CTRL, WXK_NUMPAD2, wxID_HIGHEST + 2);
+ entries[2].Set(wxACCEL_CTRL, WXK_NUMPAD3, wxID_HIGHEST + 3);
+ entries[3].Set(wxACCEL_CTRL, WXK_NUMPAD4, wxID_HIGHEST + 4);
+ entries[4].Set(wxACCEL_CTRL, WXK_NUMPAD5, wxID_HIGHEST + 5);
+ entries[5].Set(wxACCEL_CTRL, WXK_NUMPAD6, wxID_HIGHEST + 6);
+ wxAcceleratorTable accel(6, entries);
+ SetAcceleratorTable(accel);
+#endif // _WIN32
// set default tooltip timer in msec
// SetAutoPop supposedly accepts long integers but some bug doesn't allow for larger values
@@ -87,14 +180,16 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S
m_loaded = true;
// initialize layout
- auto sizer = new wxBoxSizer(wxVERTICAL);
- if (m_tabpanel)
- sizer->Add(m_tabpanel, 1, wxEXPAND);
- sizer->SetSizeHints(this);
+ m_main_sizer = new wxBoxSizer(wxVERTICAL);
+ wxSizer* sizer = new wxBoxSizer(wxVERTICAL);
+ sizer->Add(m_main_sizer, 1, wxEXPAND);
SetSizer(sizer);
+ // initialize layout from config
+ update_layout();
+ sizer->SetSizeHints(this);
Fit();
- const wxSize min_size = wxSize(76*wxGetApp().em_unit(), 49*wxGetApp().em_unit());
+ const wxSize min_size = wxGetApp().get_min_size(); //wxSize(76*wxGetApp().em_unit(), 49*wxGetApp().em_unit());
#ifdef __APPLE__
// Using SetMinSize() on Mac messes up the window position in some cases
// cf. https://groups.google.com/forum/#!topic/wx-users/yUKPBBfXWO0
@@ -108,65 +203,245 @@ DPIFrame(NULL, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxDEFAULT_FRAME_S
update_title();
// declare events
- Bind(wxEVT_CREATE, [this](wxWindowCreateEvent& event) {
-
-#ifdef _WIN32
- //static GUID GUID_DEVINTERFACE_USB_DEVICE = { 0xA5DCBF10, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED };
- //static GUID GUID_DEVINTERFACE_DISK = { 0x53f56307, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b };
- //static GUID GUID_DEVINTERFACE_VOLUME = { 0x71a27cdd, 0x812a, 0x11d0, 0xbe, 0xc7, 0x08, 0x00, 0x2b, 0xe2, 0x09, 0x2f };
- static GUID GUID_DEVINTERFACE_HID = { 0x4D1E55B2, 0xF16F, 0x11CF, 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 };
-
- // Register USB HID (Human Interface Devices) notifications to trigger the 3DConnexion enumeration.
- DEV_BROADCAST_DEVICEINTERFACE NotificationFilter = { 0 };
- NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
- NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
- NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_HID;
- m_hDeviceNotify = ::RegisterDeviceNotification(this->GetHWND(), &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
-
-// or register for file handle change?
-// DEV_BROADCAST_HANDLE NotificationFilter = { 0 };
-// NotificationFilter.dbch_size = sizeof(DEV_BROADCAST_HANDLE);
-// NotificationFilter.dbch_devicetype = DBT_DEVTYP_HANDLE;
-#endif // _WIN32
-
- // propagate event
- event.Skip();
- });
-
Bind(wxEVT_CLOSE_WINDOW, [this](wxCloseEvent& event) {
if (event.CanVeto() && !wxGetApp().check_unsaved_changes()) {
event.Veto();
return;
}
+ if (event.CanVeto() && !wxGetApp().check_print_host_queue()) {
+ event.Veto();
+ return;
+ }
this->shutdown();
// propagate event
event.Skip();
});
+ //FIXME it seems this method is not called on application start-up, at least not on Windows. Why?
+ // The same applies to wxEVT_CREATE, it is not being called on startup on Windows.
Bind(wxEVT_ACTIVATE, [this](wxActivateEvent& event) {
if (m_plater != nullptr && event.GetActive())
m_plater->on_activate();
event.Skip();
});
+// OSX specific issue:
+// When we move application between Retina and non-Retina displays, The legend on a canvas doesn't redraw
+// So, redraw explicitly canvas, when application is moved
+//FIXME maybe this is useful for __WXGTK3__ as well?
+#if __APPLE__
+ Bind(wxEVT_MOVE, [this](wxMoveEvent& event) {
+ wxGetApp().plater()->get_current_canvas3D()->set_as_dirty();
+ wxGetApp().plater()->get_current_canvas3D()->request_extra_frame();
+ event.Skip();
+ });
+#endif
+
wxGetApp().persist_window_geometry(this, true);
+ wxGetApp().persist_window_geometry(&m_settings_dialog, true);
update_ui_from_settings(); // FIXME (?)
- if (m_plater != nullptr)
+ if (m_plater != nullptr) {
+ m_plater->get_collapse_toolbar().set_enabled(wxGetApp().app_config->get("show_collapse_button") == "1");
m_plater->show_action_buttons(true);
+ }
+}
+
+void MainFrame::update_layout()
+{
+ auto restore_to_creation = [this]() {
+ auto clean_sizer = [](wxSizer* sizer) {
+ while (!sizer->GetChildren().IsEmpty()) {
+ sizer->Detach(0);
+ }
+ };
+
+ // On Linux m_plater needs to be removed from m_tabpanel before to reparent it
+ int plater_page_id = m_tabpanel->FindPage(m_plater);
+ if (plater_page_id != wxNOT_FOUND)
+ m_tabpanel->RemovePage(plater_page_id);
+
+ if (m_plater->GetParent() != this)
+ m_plater->Reparent(this);
+
+ if (m_tabpanel->GetParent() != this)
+ m_tabpanel->Reparent(this);
+
+ plater_page_id = (m_plater_page != nullptr) ? m_tabpanel->FindPage(m_plater_page) : wxNOT_FOUND;
+ if (plater_page_id != wxNOT_FOUND) {
+ m_tabpanel->DeletePage(plater_page_id);
+ m_plater_page = nullptr;
+ }
+
+ clean_sizer(m_main_sizer);
+ clean_sizer(m_settings_dialog.GetSizer());
+
+ if (m_settings_dialog.IsShown())
+ m_settings_dialog.Close();
+
+ m_tabpanel->Hide();
+ m_plater->Hide();
+
+ Layout();
+ };
+
+ ESettingsLayout layout = wxGetApp().is_gcode_viewer() ? ESettingsLayout::GCodeViewer :
+ (wxGetApp().app_config->get("old_settings_layout_mode") == "1" ? ESettingsLayout::Old :
+ wxGetApp().app_config->get("new_settings_layout_mode") == "1" ? ESettingsLayout::New :
+ wxGetApp().app_config->get("dlg_settings_layout_mode") == "1" ? ESettingsLayout::Dlg : ESettingsLayout::Old);
+
+ if (m_layout == layout)
+ return;
+
+ wxBusyCursor busy;
+
+ Freeze();
+
+ // Remove old settings
+ if (m_layout != ESettingsLayout::Unknown)
+ restore_to_creation();
+
+#ifdef __WXMSW__
+ enum class State {
+ noUpdate,
+ fromDlg,
+ toDlg
+ };
+ State update_scaling_state = //m_layout == ESettingsLayout::Unknown ? State::noUpdate : // don't scale settings dialog from the application start
+ m_layout == ESettingsLayout::Dlg ? State::fromDlg :
+ layout == ESettingsLayout::Dlg ? State::toDlg : State::noUpdate;
+#endif //__WXMSW__
+
+ m_layout = layout;
+
+ // From the very beginning the Print settings should be selected
+ m_last_selected_tab = m_layout == ESettingsLayout::Dlg ? 0 : 1;
+
+ // Set new settings
+ switch (m_layout)
+ {
+ case ESettingsLayout::Unknown:
+ {
+ break;
+ }
+ case ESettingsLayout::Old:
+ {
+ m_plater->Reparent(m_tabpanel);
+ m_tabpanel->InsertPage(0, m_plater, _L("Plater"));
+ m_main_sizer->Add(m_tabpanel, 1, wxEXPAND);
+ m_plater->Show();
+ m_tabpanel->Show();
+ break;
+ }
+ case ESettingsLayout::New:
+ {
+ m_main_sizer->Add(m_plater, 1, wxEXPAND);
+ m_tabpanel->Hide();
+ m_main_sizer->Add(m_tabpanel, 1, wxEXPAND);
+ m_plater_page = new wxPanel(m_tabpanel);
+ m_tabpanel->InsertPage(0, m_plater_page, _L("Plater")); // empty panel just for Plater tab */
+ m_plater->Show();
+ break;
+ }
+ case ESettingsLayout::Dlg:
+ {
+ m_main_sizer->Add(m_plater, 1, wxEXPAND);
+ m_tabpanel->Reparent(&m_settings_dialog);
+ m_settings_dialog.GetSizer()->Add(m_tabpanel, 1, wxEXPAND);
+ m_tabpanel->Show();
+ m_plater->Show();
+ break;
+ }
+ case ESettingsLayout::GCodeViewer:
+ {
+ m_main_sizer->Add(m_plater, 1, wxEXPAND);
+ m_plater->set_bed_shape({ { 0.0, 0.0 }, { 200.0, 0.0 }, { 200.0, 200.0 }, { 0.0, 200.0 } }, "", "", true);
+ m_plater->get_collapse_toolbar().set_enabled(false);
+ m_plater->collapse_sidebar(true);
+ m_plater->Show();
+ break;
+ }
+ }
+
+#ifdef __WXMSW__
+ if (update_scaling_state != State::noUpdate)
+ {
+ int mainframe_dpi = get_dpi_for_window(this);
+ int dialog_dpi = get_dpi_for_window(&m_settings_dialog);
+ if (mainframe_dpi != dialog_dpi) {
+ wxSize oldDPI = update_scaling_state == State::fromDlg ? wxSize(dialog_dpi, dialog_dpi) : wxSize(mainframe_dpi, mainframe_dpi);
+ wxSize newDPI = update_scaling_state == State::toDlg ? wxSize(dialog_dpi, dialog_dpi) : wxSize(mainframe_dpi, mainframe_dpi);
+
+ if (update_scaling_state == State::fromDlg)
+ this->enable_force_rescale();
+ else
+ (&m_settings_dialog)->enable_force_rescale();
+
+ wxWindow* win { nullptr };
+ if (update_scaling_state == State::fromDlg)
+ win = this;
+ else
+ win = &m_settings_dialog;
+
+#if wxVERSION_EQUAL_OR_GREATER_THAN(3,1,3)
+ m_tabpanel->MSWUpdateOnDPIChange(oldDPI, newDPI);
+ win->GetEventHandler()->AddPendingEvent(wxDPIChangedEvent(oldDPI, newDPI));
+#else
+ win->GetEventHandler()->AddPendingEvent(DpiChangedEvent(EVT_DPI_CHANGED_SLICER, newDPI, win->GetRect()));
+#endif // wxVERSION_EQUAL_OR_GREATER_THAN
+ }
+ }
+#endif //__WXMSW__
+
+//#ifdef __APPLE__
+// // Using SetMinSize() on Mac messes up the window position in some cases
+// // cf. https://groups.google.com/forum/#!topic/wx-users/yUKPBBfXWO0
+// // So, if we haven't possibility to set MinSize() for the MainFrame,
+// // set the MinSize() as a half of regular for the m_plater and m_tabpanel, when settings layout is in slNew mode
+// // Otherwise, MainFrame will be maximized by height
+// if (m_layout == ESettingsLayout::New) {
+// wxSize size = wxGetApp().get_min_size();
+// size.SetHeight(int(0.5 * size.GetHeight()));
+// m_plater->SetMinSize(size);
+// m_tabpanel->SetMinSize(size);
+// }
+//#endif
+
+#ifdef __APPLE__
+ m_plater->sidebar().change_top_border_for_mode_sizer(m_layout != ESettingsLayout::Old);
+#endif
+
+ Layout();
+ Thaw();
}
// Called when closing the application and when switching the application language.
void MainFrame::shutdown()
{
#ifdef _WIN32
- ::UnregisterDeviceNotification(HDEVNOTIFY(m_hDeviceNotify));
- m_hDeviceNotify = nullptr;
+ if (m_hDeviceNotify) {
+ ::UnregisterDeviceNotification(HDEVNOTIFY(m_hDeviceNotify));
+ m_hDeviceNotify = nullptr;
+ }
+ if (m_ulSHChangeNotifyRegister) {
+ SHChangeNotifyDeregister(m_ulSHChangeNotifyRegister);
+ m_ulSHChangeNotifyRegister = 0;
+ }
#endif // _WIN32
- if (m_plater)
- m_plater->stop_jobs();
+ if (m_plater != nullptr) {
+ m_plater->stop_jobs();
+
+ // Unbinding of wxWidgets event handling in canvases needs to be done here because on MAC,
+ // when closing the application using Command+Q, a mouse event is triggered after this lambda is completed,
+ // causing a crash
+ m_plater->unbind_canvas_event_handlers();
+
+ // Cleanup of canvases' volumes needs to be done here or a crash may happen on some Linux Debian flavours
+ // see: https://github.com/prusa3d/PrusaSlicer/issues/3964
+ m_plater->reset_canvas_volumes();
+ }
// Weird things happen as the Paint messages are floating around the windows being destructed.
// Avoid the Paint messages by hiding the main window.
@@ -174,21 +449,27 @@ void MainFrame::shutdown()
// In addition, there were some crashes due to the Paint events sent to already destructed windows.
this->Show(false);
- // Stop the background thread (Windows and Linux).
- // Disconnect from a 3DConnextion driver (OSX).
- m_plater->get_mouse3d_controller().shutdown();
- // Store the device parameter database back to appconfig.
- m_plater->get_mouse3d_controller().save_config(*wxGetApp().app_config);
+ if (m_settings_dialog.IsShown())
+ // call Close() to trigger call to lambda defined into GUI_App::persist_window_geometry()
+ m_settings_dialog.Close();
+
+ if (m_plater != nullptr) {
+ // Stop the background thread (Windows and Linux).
+ // Disconnect from a 3DConnextion driver (OSX).
+ m_plater->get_mouse3d_controller().shutdown();
+ // Store the device parameter database back to appconfig.
+ m_plater->get_mouse3d_controller().save_config(*wxGetApp().app_config);
+ }
// Stop the background thread of the removable drive manager, so that no new updates will be sent to the Plater.
wxGetApp().removable_drive_manager()->shutdown();
-
+ //stop listening for messages from other instances
+ wxGetApp().other_instance_message_handler()->shutdown(this);
// Save the slic3r.ini.Usually the ini file is saved from "on idle" callback,
// but in rare cases it may not have been called yet.
wxGetApp().app_config->save();
// if (m_plater)
// m_plater->print = undef;
- _3DScene::remove_all_canvases();
// Slic3r::GUI::deregister_on_request_update_callback();
// set to null tabs and a plater
@@ -200,8 +481,7 @@ void MainFrame::shutdown()
void MainFrame::update_title()
{
wxString title = wxEmptyString;
- if (m_plater != nullptr)
- {
+ if (m_plater != nullptr) {
// m_plater->get_project_filename() produces file name including path, but excluding extension.
// Don't try to remove the extension, it would remove part of the file name after the last dot!
wxString project = from_path(into_path(m_plater->get_project_filename()).filename());
@@ -209,12 +489,13 @@ void MainFrame::update_title()
title += (project + " - ");
}
- std::string build_id = SLIC3R_BUILD_ID;
+ std::string build_id = wxGetApp().is_editor() ? SLIC3R_BUILD_ID : GCODEVIEWER_BUILD_ID;
size_t idx_plus = build_id.find('+');
if (idx_plus != build_id.npos) {
// Parse what is behind the '+'. If there is a number, then it is a build number after the label, and full build ID is shown.
int commit_after_label;
- if (! boost::starts_with(build_id.data() + idx_plus + 1, "UNKNOWN") && sscanf(build_id.data() + idx_plus + 1, "%d-", &commit_after_label) == 0) {
+ if (! boost::starts_with(build_id.data() + idx_plus + 1, "UNKNOWN") &&
+ (build_id.at(idx_plus + 1) == '-' || sscanf(build_id.data() + idx_plus + 1, "%d-", &commit_after_label) == 0)) {
// It is a release build.
build_id.erase(build_id.begin() + idx_plus, build_id.end());
#if defined(_WIN32) && ! defined(_WIN64)
@@ -223,7 +504,10 @@ void MainFrame::update_title()
#endif
}
}
- title += (wxString(build_id) + " " + _(L("based on Slic3r")));
+
+ title += wxString(build_id);
+ if (wxGetApp().is_editor())
+ title += (" " + _L("based on Slic3r"));
SetTitle(title);
}
@@ -236,35 +520,37 @@ void MainFrame::init_tabpanel()
#ifndef __WXOSX__ // Don't call SetFont under OSX to avoid name cutting in ObjectList
m_tabpanel->SetFont(Slic3r::GUI::wxGetApp().normal_font());
#endif
+ m_tabpanel->Hide();
+ m_settings_dialog.set_tabpanel(m_tabpanel);
m_tabpanel->Bind(wxEVT_NOTEBOOK_PAGE_CHANGED, [this](wxEvent&) {
- auto panel = m_tabpanel->GetCurrentPage();
+ wxWindow* panel = m_tabpanel->GetCurrentPage();
+ Tab* tab = dynamic_cast<Tab*>(panel);
- if (panel == nullptr)
+ // There shouldn't be a case, when we try to select a tab, which doesn't support a printer technology
+ if (panel == nullptr || (tab != nullptr && !tab->supports_printer_technology(m_plater->printer_technology())))
return;
auto& tabs_list = wxGetApp().tabs_list;
- if (find(tabs_list.begin(), tabs_list.end(), panel) != tabs_list.end()) {
+ if (tab && std::find(tabs_list.begin(), tabs_list.end(), tab) != tabs_list.end()) {
// On GTK, the wxEVT_NOTEBOOK_PAGE_CHANGED event is triggered
// before the MainFrame is fully set up.
- static_cast<Tab*>(panel)->OnActivate();
+ tab->OnActivate();
+ m_last_selected_tab = m_tabpanel->GetSelection();
}
+ else
+ select_tab(size_t(0)); // select Plater
});
- m_plater = new Slic3r::GUI::Plater(m_tabpanel, this);
+ m_plater = new Plater(this, this);
+ m_plater->Hide();
+
wxGetApp().plater_ = m_plater;
- m_tabpanel->AddPage(m_plater, _(L("Plater")));
wxGetApp().obj_list()->create_popup_menus();
- // The following event is emited by Tab implementation on config value change.
- Bind(EVT_TAB_VALUE_CHANGED, &MainFrame::on_value_changed, this); // #ys_FIXME_to_delete
-
- // The following event is emited by Tab on preset selection,
- // or when the preset's "modified" status changes.
- Bind(EVT_TAB_PRESETS_CHANGED, &MainFrame::on_presets_changed, this); // #ys_FIXME_to_delete
-
- create_preset_tabs();
+ if (wxGetApp().is_editor())
+ create_preset_tabs();
if (m_plater) {
// load initial config
@@ -279,6 +565,62 @@ void MainFrame::init_tabpanel()
}
}
+#ifdef WIN32
+void MainFrame::register_win32_callbacks()
+{
+ //static GUID GUID_DEVINTERFACE_USB_DEVICE = { 0xA5DCBF10, 0x6530, 0x11D2, 0x90, 0x1F, 0x00, 0xC0, 0x4F, 0xB9, 0x51, 0xED };
+ //static GUID GUID_DEVINTERFACE_DISK = { 0x53f56307, 0xb6bf, 0x11d0, 0x94, 0xf2, 0x00, 0xa0, 0xc9, 0x1e, 0xfb, 0x8b };
+ //static GUID GUID_DEVINTERFACE_VOLUME = { 0x71a27cdd, 0x812a, 0x11d0, 0xbe, 0xc7, 0x08, 0x00, 0x2b, 0xe2, 0x09, 0x2f };
+ static GUID GUID_DEVINTERFACE_HID = { 0x4D1E55B2, 0xF16F, 0x11CF, 0x88, 0xCB, 0x00, 0x11, 0x11, 0x00, 0x00, 0x30 };
+
+ // Register USB HID (Human Interface Devices) notifications to trigger the 3DConnexion enumeration.
+ DEV_BROADCAST_DEVICEINTERFACE NotificationFilter = { 0 };
+ NotificationFilter.dbcc_size = sizeof(DEV_BROADCAST_DEVICEINTERFACE);
+ NotificationFilter.dbcc_devicetype = DBT_DEVTYP_DEVICEINTERFACE;
+ NotificationFilter.dbcc_classguid = GUID_DEVINTERFACE_HID;
+ m_hDeviceNotify = ::RegisterDeviceNotification(this->GetHWND(), &NotificationFilter, DEVICE_NOTIFY_WINDOW_HANDLE);
+
+// or register for file handle change?
+// DEV_BROADCAST_HANDLE NotificationFilter = { 0 };
+// NotificationFilter.dbch_size = sizeof(DEV_BROADCAST_HANDLE);
+// NotificationFilter.dbch_devicetype = DBT_DEVTYP_HANDLE;
+
+ // Using Win32 Shell API to register for media insert / removal events.
+ LPITEMIDLIST ppidl;
+ if (SHGetSpecialFolderLocation(this->GetHWND(), CSIDL_DESKTOP, &ppidl) == NOERROR) {
+ SHChangeNotifyEntry shCNE;
+ shCNE.pidl = ppidl;
+ shCNE.fRecursive = TRUE;
+ // Returns a positive integer registration identifier (ID).
+ // Returns zero if out of memory or in response to invalid parameters.
+ m_ulSHChangeNotifyRegister = SHChangeNotifyRegister(this->GetHWND(), // Hwnd to receive notification
+ SHCNE_DISKEVENTS, // Event types of interest (sources)
+ SHCNE_MEDIAINSERTED | SHCNE_MEDIAREMOVED,
+ //SHCNE_UPDATEITEM, // Events of interest - use SHCNE_ALLEVENTS for all events
+ WM_USER_MEDIACHANGED, // Notification message to be sent upon the event
+ 1, // Number of entries in the pfsne array
+ &shCNE); // Array of SHChangeNotifyEntry structures that
+ // contain the notifications. This array should
+ // always be set to one when calling SHChnageNotifyRegister
+ // or SHChangeNotifyDeregister will not work properly.
+ assert(m_ulSHChangeNotifyRegister != 0); // Shell notification failed
+ } else {
+ // Failed to get desktop location
+ assert(false);
+ }
+
+ {
+ static constexpr int device_count = 1;
+ RAWINPUTDEVICE devices[device_count] = { 0 };
+ // multi-axis mouse (SpaceNavigator, etc.)
+ devices[0].usUsagePage = 0x01;
+ devices[0].usUsage = 0x08;
+ if (! RegisterRawInputDevices(devices, device_count, sizeof(RAWINPUTDEVICE)))
+ BOOST_LOG_TRIVIAL(error) << "RegisterRawInputDevices failed";
+ }
+}
+#endif // _WIN32
+
void MainFrame::create_preset_tabs()
{
wxGetApp().update_label_colours_from_appconfig();
@@ -299,6 +641,22 @@ void MainFrame::add_created_tab(Tab* panel)
m_tabpanel->AddPage(panel, panel->title());
}
+bool MainFrame::is_active_and_shown_tab(Tab* tab)
+{
+ int page_id = m_tabpanel->FindPage(tab);
+
+ if (m_tabpanel->GetSelection() != page_id)
+ return false;
+
+ if (m_layout == ESettingsLayout::Dlg)
+ return m_settings_dialog.IsShown();
+
+ if (m_layout == ESettingsLayout::New)
+ return m_main_sizer->IsShown(m_tabpanel);
+
+ return true;
+}
+
bool MainFrame::can_start_new_project() const
{
return (m_plater != nullptr) && !m_plater->model().objects.empty();
@@ -355,14 +713,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<ConfigOptionString>("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<ConfigOptionString>("print_host"); print_host_opt)
+ return ! print_host_opt->value.empty();
+ return false;
}
bool MainFrame::can_export_gcode_sd() const
@@ -394,8 +749,17 @@ bool MainFrame::can_slice() const
bool MainFrame::can_change_view() const
{
- int page_id = m_tabpanel->GetSelection();
- return page_id != wxNOT_FOUND && dynamic_cast<const Slic3r::GUI::Plater*>(m_tabpanel->GetPage((size_t)page_id)) != nullptr;
+ switch (m_layout)
+ {
+ default: { return false; }
+ case ESettingsLayout::New: { return m_plater->IsShown(); }
+ case ESettingsLayout::Dlg: { return true; }
+ case ESettingsLayout::Old: {
+ int page_id = m_tabpanel->GetSelection();
+ return page_id != wxNOT_FOUND && dynamic_cast<const Slic3r::GUI::Plater*>(m_tabpanel->GetPage((size_t)page_id)) != nullptr;
+ }
+ case ESettingsLayout::GCodeViewer: { return true; }
+ }
}
bool MainFrame::can_select() const
@@ -423,22 +787,22 @@ bool MainFrame::can_reslice() const
return (m_plater != nullptr) && !m_plater->model().objects.empty();
}
-void MainFrame::on_dpi_changed(const wxRect &suggested_rect)
+void MainFrame::on_dpi_changed(const wxRect& suggested_rect)
{
+#if ENABLE_WX_3_1_3_DPI_CHANGED_EVENT
+ wxGetApp().update_fonts(this);
+#else
wxGetApp().update_fonts();
+#endif // ENABLE_WX_3_1_3_DPI_CHANGED_EVENT
this->SetFont(this->normal_font());
- /* Load default preset bitmaps before a tabpanel initialization,
- * but after filling of an em_unit value
- */
- wxGetApp().preset_bundle->load_default_preset_bitmaps();
-
// update Plater
wxGetApp().plater()->msw_rescale();
// update Tabs
- for (auto tab : wxGetApp().tabs_list)
- tab->msw_rescale();
+ if (m_layout != ESettingsLayout::Dlg) // Do not update tabs if the Settings are in the separated dialog
+ for (auto tab : wxGetApp().tabs_list)
+ tab->msw_rescale();
wxMenuBar* menu_bar = this->GetMenuBar();
for (size_t id = 0; id < menu_bar->GetMenuCount(); id++)
@@ -446,7 +810,7 @@ void MainFrame::on_dpi_changed(const wxRect &suggested_rect)
// Workarounds for correct Window rendering after rescale
- /* Even if Window is maximized during moving,
+ /* Even if Window is maximized during moving,
* first of all we should imitate Window resizing. So:
* 1. cancel maximization, if it was set
* 2. imitate resizing
@@ -466,7 +830,101 @@ void MainFrame::on_dpi_changed(const wxRect &suggested_rect)
this->Maximize(is_maximized);
}
-void MainFrame::init_menubar()
+void MainFrame::on_sys_color_changed()
+{
+ wxBusyCursor wait;
+
+ // update label colors in respect to the system mode
+ wxGetApp().init_label_colours();
+
+ // update Plater
+ wxGetApp().plater()->sys_color_changed();
+
+ // update Tabs
+ for (auto tab : wxGetApp().tabs_list)
+ tab->sys_color_changed();
+
+ // msw_rescale_menu updates just icons, so use it
+ wxMenuBar* menu_bar = this->GetMenuBar();
+ for (size_t id = 0; id < menu_bar->GetMenuCount(); id++)
+ msw_rescale_menu(menu_bar->GetMenu(id));
+}
+
+#ifdef _MSC_VER
+ // \xA0 is a non-breaking space. It is entered here to spoil the automatic accelerators,
+ // as the simple numeric accelerators spoil all numeric data entry.
+static const wxString sep = "\t\xA0";
+static const wxString sep_space = "\xA0";
+#else
+static const wxString sep = " - ";
+static const wxString sep_space = "";
+#endif
+
+static wxMenu* generate_help_menu()
+{
+ wxMenu* helpMenu = new wxMenu();
+ append_menu_item(helpMenu, wxID_ANY, _L("Prusa 3D &Drivers"), _L("Open the Prusa3D drivers download page in your browser"),
+ [](wxCommandEvent&) { wxGetApp().open_web_page_localized("https://www.prusa3d.com/downloads"); });
+ append_menu_item(helpMenu, wxID_ANY, _L("Software &Releases"), _L("Open the software releases page in your browser"),
+ [](wxCommandEvent&) { wxLaunchDefaultBrowser("https://github.com/prusa3d/PrusaSlicer/releases"); });
+//# my $versioncheck = $self->_append_menu_item($helpMenu, "Check for &Updates...", "Check for new Slic3r versions", sub{
+//# wxTheApp->check_version(1);
+//# });
+//# $versioncheck->Enable(wxTheApp->have_version_check);
+ append_menu_item(helpMenu, wxID_ANY, wxString::Format(_L("%s &Website"), SLIC3R_APP_NAME),
+ wxString::Format(_L("Open the %s website in your browser"), SLIC3R_APP_NAME),
+ [](wxCommandEvent&) { wxGetApp().open_web_page_localized("https://www.prusa3d.com/slicerweb"); });
+// append_menu_item(helpMenu, wxID_ANY, wxString::Format(_L("%s &Manual"), SLIC3R_APP_NAME),
+// wxString::Format(_L("Open the %s manual in your browser"), SLIC3R_APP_NAME),
+// [this](wxCommandEvent&) { wxLaunchDefaultBrowser("http://manual.slic3r.org/"); });
+ helpMenu->AppendSeparator();
+ append_menu_item(helpMenu, wxID_ANY, _L("System &Info"), _L("Show system information"),
+ [](wxCommandEvent&) { wxGetApp().system_info(); });
+ append_menu_item(helpMenu, wxID_ANY, _L("Show &Configuration Folder"), _L("Show user configuration folder (datadir)"),
+ [](wxCommandEvent&) { Slic3r::GUI::desktop_open_datadir_folder(); });
+ append_menu_item(helpMenu, wxID_ANY, _L("Report an I&ssue"), wxString::Format(_L("Report an issue on %s"), SLIC3R_APP_NAME),
+ [](wxCommandEvent&) { wxLaunchDefaultBrowser("https://github.com/prusa3d/slic3r/issues/new"); });
+ if (wxGetApp().is_editor())
+ append_menu_item(helpMenu, wxID_ANY, wxString::Format(_L("&About %s"), SLIC3R_APP_NAME), _L("Show about dialog"),
+ [](wxCommandEvent&) { Slic3r::GUI::about(); });
+ else
+ append_menu_item(helpMenu, wxID_ANY, wxString::Format(_L("&About %s"), GCODEVIEWER_APP_NAME), _L("Show about dialog"),
+ [](wxCommandEvent&) { Slic3r::GUI::about(); });
+ helpMenu->AppendSeparator();
+ append_menu_item(helpMenu, wxID_ANY, _L("Keyboard Shortcuts") + sep + "&?", _L("Show the list of the keyboard shortcuts"),
+ [](wxCommandEvent&) { wxGetApp().keyboard_shortcuts(); });
+#if ENABLE_THUMBNAIL_GENERATOR_DEBUG
+ helpMenu->AppendSeparator();
+ append_menu_item(helpMenu, wxID_ANY, "DEBUG gcode thumbnails", "DEBUG ONLY - read the selected gcode file and generates png for the contained thumbnails",
+ [](wxCommandEvent&) { wxGetApp().gcode_thumbnails_debug(); });
+#endif // ENABLE_THUMBNAIL_GENERATOR_DEBUG
+
+ return helpMenu;
+}
+
+static void add_common_view_menu_items(wxMenu* view_menu, MainFrame* mainFrame, std::function<bool(void)> can_change_view)
+{
+ // The camera control accelerators are captured by GLCanvas3D::on_char().
+ append_menu_item(view_menu, wxID_ANY, _L("Iso") + sep + "&0", _L("Iso View"), [mainFrame](wxCommandEvent&) { mainFrame->select_view("iso"); },
+ "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame);
+ view_menu->AppendSeparator();
+ //TRN To be shown in the main menu View->Top
+ append_menu_item(view_menu, wxID_ANY, _L("Top") + sep + "&1", _L("Top View"), [mainFrame](wxCommandEvent&) { mainFrame->select_view("top"); },
+ "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame);
+ //TRN To be shown in the main menu View->Bottom
+ append_menu_item(view_menu, wxID_ANY, _L("Bottom") + sep + "&2", _L("Bottom View"), [mainFrame](wxCommandEvent&) { mainFrame->select_view("bottom"); },
+ "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame);
+ append_menu_item(view_menu, wxID_ANY, _L("Front") + sep + "&3", _L("Front View"), [mainFrame](wxCommandEvent&) { mainFrame->select_view("front"); },
+ "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame);
+ append_menu_item(view_menu, wxID_ANY, _L("Rear") + sep + "&4", _L("Rear View"), [mainFrame](wxCommandEvent&) { mainFrame->select_view("rear"); },
+ "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame);
+ append_menu_item(view_menu, wxID_ANY, _L("Left") + sep + "&5", _L("Left View"), [mainFrame](wxCommandEvent&) { mainFrame->select_view("left"); },
+ "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame);
+ append_menu_item(view_menu, wxID_ANY, _L("Right") + sep + "&6", _L("Right View"), [mainFrame](wxCommandEvent&) { mainFrame->select_view("right"); },
+ "", nullptr, [can_change_view]() { return can_change_view(); }, mainFrame);
+}
+
+void MainFrame::init_menubar_as_editor()
{
#ifdef __APPLE__
wxMenuBar::SetAutoWindowMenu(false);
@@ -475,15 +933,15 @@ void MainFrame::init_menubar()
// File menu
wxMenu* fileMenu = new wxMenu;
{
- append_menu_item(fileMenu, wxID_ANY, _(L("&New Project")) + "\tCtrl+N", _(L("Start a new project")),
+ append_menu_item(fileMenu, wxID_ANY, _L("&New Project") + "\tCtrl+N", _L("Start a new project"),
[this](wxCommandEvent&) { if (m_plater) m_plater->new_project(); }, "", nullptr,
[this](){return m_plater != nullptr && can_start_new_project(); }, this);
- append_menu_item(fileMenu, wxID_ANY, _(L("&Open Project")) + dots + "\tCtrl+O", _(L("Open a project file")),
+ append_menu_item(fileMenu, wxID_ANY, _L("&Open Project") + dots + "\tCtrl+O", _L("Open a project file"),
[this](wxCommandEvent&) { if (m_plater) m_plater->load_project(); }, "open", nullptr,
[this](){return m_plater != nullptr; }, this);
wxMenu* recent_projects_menu = new wxMenu();
- wxMenuItem* recent_projects_submenu = append_submenu(fileMenu, recent_projects_menu, wxID_ANY, _(L("Recent projects")), "");
+ wxMenuItem* recent_projects_submenu = append_submenu(fileMenu, recent_projects_menu, wxID_ANY, _L("Recent projects"), "");
m_recent_projects.UseMenu(recent_projects_menu);
Bind(wxEVT_MENU, [this](wxCommandEvent& evt) {
size_t file_id = evt.GetId() - wxID_FILE1;
@@ -492,7 +950,7 @@ void MainFrame::init_menubar()
m_plater->load_project(filename);
else
{
- wxMessageDialog msg(this, _(L("The selected project is no longer available.\nDo you want to remove it from the recent projects list?")), _(L("Error")), wxYES_NO | wxYES_DEFAULT);
+ wxMessageDialog msg(this, _L("The selected project is no longer available.\nDo you want to remove it from the recent projects list?"), _L("Error"), wxYES_NO | wxYES_DEFAULT);
if (msg.ShowModal() == wxID_YES)
{
m_recent_projects.RemoveFileFromHistory(file_id);
@@ -517,13 +975,13 @@ void MainFrame::init_menubar()
Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(m_recent_projects.GetCount() > 0); }, recent_projects_submenu->GetId());
- append_menu_item(fileMenu, wxID_ANY, _(L("&Save Project")) + "\tCtrl+S", _(L("Save current project file")),
+ append_menu_item(fileMenu, wxID_ANY, _L("&Save Project") + "\tCtrl+S", _L("Save current project file"),
[this](wxCommandEvent&) { if (m_plater) m_plater->export_3mf(into_path(m_plater->get_project_filename(".3mf"))); }, "save", nullptr,
[this](){return m_plater != nullptr && can_save(); }, this);
#ifdef __APPLE__
- append_menu_item(fileMenu, wxID_ANY, _(L("Save Project &as")) + dots + "\tCtrl+Shift+S", _(L("Save current project file as")),
+ append_menu_item(fileMenu, wxID_ANY, _L("Save Project &as") + dots + "\tCtrl+Shift+S", _L("Save current project file as"),
#else
- append_menu_item(fileMenu, wxID_ANY, _(L("Save Project &as")) + dots + "\tCtrl+Alt+S", _(L("Save current project file as")),
+ append_menu_item(fileMenu, wxID_ANY, _L("Save Project &as") + dots + "\tCtrl+Alt+S", _L("Save current project file as"),
#endif // __APPLE__
[this](wxCommandEvent&) { if (m_plater) m_plater->export_3mf(); }, "save", nullptr,
[this](){return m_plater != nullptr && can_save(); }, this);
@@ -531,58 +989,70 @@ void MainFrame::init_menubar()
fileMenu->AppendSeparator();
wxMenu* import_menu = new wxMenu();
- append_menu_item(import_menu, wxID_ANY, _(L("Import STL/OBJ/AM&F/3MF")) + dots + "\tCtrl+I", _(L("Load a model")),
+ append_menu_item(import_menu, wxID_ANY, _L("Import STL/OBJ/AM&F/3MF") + dots + "\tCtrl+I", _L("Load a model"),
[this](wxCommandEvent&) { if (m_plater) m_plater->add_model(); }, "import_plater", nullptr,
[this](){return m_plater != nullptr; }, this);
+
+ append_menu_item(import_menu, wxID_ANY, _L("Import STL (imperial units)"), _L("Load an model saved with imperial units"),
+ [this](wxCommandEvent&) { if (m_plater) m_plater->add_model(true); }, "import_plater", nullptr,
+ [this](){return m_plater != nullptr; }, this);
+
+ append_menu_item(import_menu, wxID_ANY, _L("Import SL1 archive") + dots, _L("Load an SL1 archive"),
+ [this](wxCommandEvent&) { if (m_plater) m_plater->import_sl1_archive(); }, "import_plater", nullptr,
+ [this](){return m_plater != nullptr; }, this);
+
import_menu->AppendSeparator();
- append_menu_item(import_menu, wxID_ANY, _(L("Import &Config")) + dots + "\tCtrl+L", _(L("Load exported configuration file")),
+ append_menu_item(import_menu, wxID_ANY, _L("Import &Config") + dots + "\tCtrl+L", _L("Load exported configuration file"),
[this](wxCommandEvent&) { load_config_file(); }, "import_config", nullptr,
- [this]() {return true; }, this);
- append_menu_item(import_menu, wxID_ANY, _(L("Import Config from &project")) + dots +"\tCtrl+Alt+L", _(L("Load configuration from project file")),
+ []() {return true; }, this);
+ append_menu_item(import_menu, wxID_ANY, _L("Import Config from &project") + dots +"\tCtrl+Alt+L", _L("Load configuration from project file"),
[this](wxCommandEvent&) { if (m_plater) m_plater->extract_config_from_project(); }, "import_config", nullptr,
- [this]() {return true; }, this);
+ []() {return true; }, this);
import_menu->AppendSeparator();
- append_menu_item(import_menu, wxID_ANY, _(L("Import Config &Bundle")) + dots, _(L("Load presets from a bundle")),
+ append_menu_item(import_menu, wxID_ANY, _L("Import Config &Bundle") + dots, _L("Load presets from a bundle"),
[this](wxCommandEvent&) { load_configbundle(); }, "import_config_bundle", nullptr,
- [this]() {return true; }, this);
- append_submenu(fileMenu, import_menu, wxID_ANY, _(L("&Import")), "");
+ []() {return true; }, this);
+ append_submenu(fileMenu, import_menu, wxID_ANY, _L("&Import"), "");
wxMenu* export_menu = new wxMenu();
- wxMenuItem* item_export_gcode = append_menu_item(export_menu, wxID_ANY, _(L("Export &G-code")) + dots +"\tCtrl+G", _(L("Export current plate as G-code")),
- [this](wxCommandEvent&) { if (m_plater) m_plater->export_gcode(); }, "export_gcode", nullptr,
+ wxMenuItem* item_export_gcode = append_menu_item(export_menu, wxID_ANY, _L("Export &G-code") + dots + "\tCtrl+G", _L("Export current plate as G-code"),
+ [this](wxCommandEvent&) { if (m_plater) m_plater->export_gcode(false); }, "export_gcode", nullptr,
[this](){return can_export_gcode(); }, this);
m_changeable_menu_items.push_back(item_export_gcode);
- wxMenuItem* item_send_gcode = append_menu_item(export_menu, wxID_ANY, _(L("S&end G-code")) + dots +"\tCtrl+Shift+G", _(L("Send to print current plate as G-code")),
+ wxMenuItem* item_send_gcode = append_menu_item(export_menu, wxID_ANY, _L("S&end G-code") + dots + "\tCtrl+Shift+G", _L("Send to print current plate as G-code"),
[this](wxCommandEvent&) { if (m_plater) m_plater->send_gcode(); }, "export_gcode", nullptr,
[this](){return can_send_gcode(); }, this);
m_changeable_menu_items.push_back(item_send_gcode);
- append_menu_item(export_menu, wxID_ANY, _(L("Export G-code to SD card / Flash drive")) + dots + "\tCtrl+U", _(L("Export current plate as G-code to SD card / Flash drive")),
+ append_menu_item(export_menu, wxID_ANY, _L("Export G-code to SD card / Flash drive") + dots + "\tCtrl+U", _L("Export current plate as G-code to SD card / Flash drive"),
[this](wxCommandEvent&) { if (m_plater) m_plater->export_gcode(true); }, "export_to_sd", nullptr,
[this]() {return can_export_gcode_sd(); }, this);
export_menu->AppendSeparator();
- append_menu_item(export_menu, wxID_ANY, _(L("Export plate as &STL")) + dots, _(L("Export current plate as STL")),
+ append_menu_item(export_menu, wxID_ANY, _L("Export plate as &STL") + dots, _L("Export current plate as STL"),
[this](wxCommandEvent&) { if (m_plater) m_plater->export_stl(); }, "export_plater", nullptr,
[this](){return can_export_model(); }, this);
- append_menu_item(export_menu, wxID_ANY, _(L("Export plate as STL &including supports")) + dots, _(L("Export current plate as STL including supports")),
+ append_menu_item(export_menu, wxID_ANY, _L("Export plate as STL &including supports") + dots, _L("Export current plate as STL including supports"),
[this](wxCommandEvent&) { if (m_plater) m_plater->export_stl(true); }, "export_plater", nullptr,
[this](){return can_export_supports(); }, this);
- append_menu_item(export_menu, wxID_ANY, _(L("Export plate as &AMF")) + dots, _(L("Export current plate as AMF")),
+ append_menu_item(export_menu, wxID_ANY, _L("Export plate as &AMF") + dots, _L("Export current plate as AMF"),
[this](wxCommandEvent&) { if (m_plater) m_plater->export_amf(); }, "export_plater", nullptr,
[this](){return can_export_model(); }, this);
export_menu->AppendSeparator();
- append_menu_item(export_menu, wxID_ANY, _(L("Export &toolpaths as OBJ")) + dots, _(L("Export toolpaths as OBJ")),
+ append_menu_item(export_menu, wxID_ANY, _L("Export &toolpaths as OBJ") + dots, _L("Export toolpaths as OBJ"),
[this](wxCommandEvent&) { if (m_plater) m_plater->export_toolpaths_to_obj(); }, "export_plater", nullptr,
[this]() {return can_export_toolpaths(); }, this);
export_menu->AppendSeparator();
- append_menu_item(export_menu, wxID_ANY, _(L("Export &Config")) +dots +"\tCtrl+E", _(L("Export current configuration to file")),
+ append_menu_item(export_menu, wxID_ANY, _L("Export &Config") + dots +"\tCtrl+E", _L("Export current configuration to file"),
[this](wxCommandEvent&) { export_config(); }, "export_config", nullptr,
- [this]() {return true; }, this);
- append_menu_item(export_menu, wxID_ANY, _(L("Export Config &Bundle")) + dots, _(L("Export all presets to file")),
+ []() {return true; }, this);
+ append_menu_item(export_menu, wxID_ANY, _L("Export Config &Bundle") + dots, _L("Export all presets to file"),
[this](wxCommandEvent&) { export_configbundle(); }, "export_config_bundle", nullptr,
- [this]() {return true; }, this);
- append_submenu(fileMenu, export_menu, wxID_ANY, _(L("&Export")), "");
+ []() {return true; }, this);
+ append_menu_item(export_menu, wxID_ANY, _L("Export Config Bundle With Physical Printers") + dots, _L("Export all presets including physical printers to file"),
+ [this](wxCommandEvent&) { export_configbundle(true); }, "export_config_bundle", nullptr,
+ []() {return true; }, this);
+ append_submenu(fileMenu, export_menu, wxID_ANY, _L("&Export"), "");
- append_menu_item(fileMenu, wxID_ANY, _(L("Ejec&t SD card / Flash drive")) + dots + "\tCtrl+T", _(L("Eject SD card / Flash drive after the G-code was exported to it.")),
+ append_menu_item(fileMenu, wxID_ANY, _L("Ejec&t SD card / Flash drive") + dots + "\tCtrl+T", _L("Eject SD card / Flash drive after the G-code was exported to it."),
[this](wxCommandEvent&) { if (m_plater) m_plater->eject_drive(); }, "eject_sd", nullptr,
[this]() {return can_eject(); }, this);
@@ -590,19 +1060,19 @@ void MainFrame::init_menubar()
#if 0
m_menu_item_repeat = nullptr;
- append_menu_item(fileMenu, wxID_ANY, _(L("Quick Slice")) +dots+ "\tCtrl+U", _(L("Slice a file into a G-code")),
+ append_menu_item(fileMenu, wxID_ANY, _L("Quick Slice") +dots+ "\tCtrl+U", _L("Slice a file into a G-code"),
[this](wxCommandEvent&) {
wxTheApp->CallAfter([this]() {
quick_slice();
m_menu_item_repeat->Enable(is_last_input_file());
}); }, "cog_go.png");
- append_menu_item(fileMenu, wxID_ANY, _(L("Quick Slice and Save As")) +dots +"\tCtrl+Alt+U", _(L("Slice a file into a G-code, save as")),
+ append_menu_item(fileMenu, wxID_ANY, _L("Quick Slice and Save As") +dots +"\tCtrl+Alt+U", _L("Slice a file into a G-code, save as"),
[this](wxCommandEvent&) {
wxTheApp->CallAfter([this]() {
quick_slice(qsSaveAs);
m_menu_item_repeat->Enable(is_last_input_file());
}); }, "cog_go.png");
- m_menu_item_repeat = append_menu_item(fileMenu, wxID_ANY, _(L("Repeat Last Quick Slice")) +"\tCtrl+Shift+U", _(L("Repeat last quick slice")),
+ m_menu_item_repeat = append_menu_item(fileMenu, wxID_ANY, _L("Repeat Last Quick Slice") +"\tCtrl+Shift+U", _L("Repeat last quick slice"),
[this](wxCommandEvent&) {
wxTheApp->CallAfter([this]() {
quick_slice(qsReslice);
@@ -610,28 +1080,21 @@ void MainFrame::init_menubar()
m_menu_item_repeat->Enable(false);
fileMenu->AppendSeparator();
#endif
- m_menu_item_reslice_now = append_menu_item(fileMenu, wxID_ANY, _(L("(Re)Slice No&w")) + "\tCtrl+R", _(L("Start new slicing process")),
+ m_menu_item_reslice_now = append_menu_item(fileMenu, wxID_ANY, _L("(Re)Slice No&w") + "\tCtrl+R", _L("Start new slicing process"),
[this](wxCommandEvent&) { reslice_now(); }, "re_slice", nullptr,
- [this](){return m_plater != nullptr && can_reslice(); }, this);
+ [this]() { return m_plater != nullptr && can_reslice(); }, this);
fileMenu->AppendSeparator();
- append_menu_item(fileMenu, wxID_ANY, _(L("&Repair STL file")) + dots, _(L("Automatically repair an STL file")),
+ append_menu_item(fileMenu, wxID_ANY, _L("&Repair STL file") + dots, _L("Automatically repair an STL file"),
[this](wxCommandEvent&) { repair_stl(); }, "wrench", nullptr,
- [this]() {return true; }, this);
+ []() { return true; }, this);
fileMenu->AppendSeparator();
- append_menu_item(fileMenu, wxID_EXIT, _(L("&Quit")), wxString::Format(_(L("Quit %s")), SLIC3R_APP_NAME),
- [this](wxCommandEvent&) { Close(false); });
+ append_menu_item(fileMenu, wxID_ANY, _L("&G-code preview") + dots, _L("Open G-code viewer"),
+ [this](wxCommandEvent&) { start_new_gcodeviewer_open_file(this); }, "", nullptr);
+ fileMenu->AppendSeparator();
+ append_menu_item(fileMenu, wxID_EXIT, _L("&Quit"), wxString::Format(_L("Quit %s"), SLIC3R_APP_NAME),
+ [this](wxCommandEvent&) { Close(false); }, "exit");
}
-#ifdef _MSC_VER
- // \xA0 is a non-breaking space. It is entered here to spoil the automatic accelerators,
- // as the simple numeric accelerators spoil all numeric data entry.
- wxString sep = "\t\xA0";
- wxString sep_space = "\xA0";
-#else
- wxString sep = " - ";
- wxString sep_space = "";
-#endif
-
// Edit menu
wxMenu* editMenu = nullptr;
if (m_plater != nullptr)
@@ -643,195 +1106,209 @@ void MainFrame::init_menubar()
#else
wxString hotkey_delete = "Del";
#endif
- append_menu_item(editMenu, wxID_ANY, _(L("&Select all")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + "A",
- _(L("Selects all objects")), [this](wxCommandEvent&) { m_plater->select_all(); },
+ append_menu_item(editMenu, wxID_ANY, _L("&Select all") + sep + GUI::shortkey_ctrl_prefix() + sep_space + "A",
+ _L("Selects all objects"), [this](wxCommandEvent&) { m_plater->select_all(); },
"", nullptr, [this](){return can_select(); }, this);
- append_menu_item(editMenu, wxID_ANY, _(L("D&eselect all")) + sep + "Esc",
- _(L("Deselects all objects")), [this](wxCommandEvent&) { m_plater->deselect_all(); },
+ append_menu_item(editMenu, wxID_ANY, _L("D&eselect all") + sep + "Esc",
+ _L("Deselects all objects"), [this](wxCommandEvent&) { m_plater->deselect_all(); },
"", nullptr, [this](){return can_deselect(); }, this);
editMenu->AppendSeparator();
- append_menu_item(editMenu, wxID_ANY, _(L("&Delete selected")) + sep + hotkey_delete,
- _(L("Deletes the current selection")),[this](wxCommandEvent&) { m_plater->remove_selected(); },
+ append_menu_item(editMenu, wxID_ANY, _L("&Delete selected") + sep + hotkey_delete,
+ _L("Deletes the current selection"),[this](wxCommandEvent&) { m_plater->remove_selected(); },
"remove_menu", nullptr, [this](){return can_delete(); }, this);
- append_menu_item(editMenu, wxID_ANY, _(L("Delete &all")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + hotkey_delete,
- _(L("Deletes all objects")), [this](wxCommandEvent&) { m_plater->reset_with_confirm(); },
+ append_menu_item(editMenu, wxID_ANY, _L("Delete &all") + sep + GUI::shortkey_ctrl_prefix() + sep_space + hotkey_delete,
+ _L("Deletes all objects"), [this](wxCommandEvent&) { m_plater->reset_with_confirm(); },
"delete_all_menu", nullptr, [this](){return can_delete_all(); }, this);
editMenu->AppendSeparator();
- append_menu_item(editMenu, wxID_ANY, _(L("&Undo")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + "Z",
- _(L("Undo")), [this](wxCommandEvent&) { m_plater->undo(); },
+ append_menu_item(editMenu, wxID_ANY, _L("&Undo") + sep + GUI::shortkey_ctrl_prefix() + sep_space + "Z",
+ _L("Undo"), [this](wxCommandEvent&) { m_plater->undo(); },
"undo_menu", nullptr, [this](){return m_plater->can_undo(); }, this);
- append_menu_item(editMenu, wxID_ANY, _(L("&Redo")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + "Y",
- _(L("Redo")), [this](wxCommandEvent&) { m_plater->redo(); },
+ append_menu_item(editMenu, wxID_ANY, _L("&Redo") + sep + GUI::shortkey_ctrl_prefix() + sep_space + "Y",
+ _L("Redo"), [this](wxCommandEvent&) { m_plater->redo(); },
"redo_menu", nullptr, [this](){return m_plater->can_redo(); }, this);
editMenu->AppendSeparator();
- append_menu_item(editMenu, wxID_ANY, _(L("&Copy")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + "C",
- _(L("Copy selection to clipboard")), [this](wxCommandEvent&) { m_plater->copy_selection_to_clipboard(); },
+ append_menu_item(editMenu, wxID_ANY, _L("&Copy") + sep + GUI::shortkey_ctrl_prefix() + sep_space + "C",
+ _L("Copy selection to clipboard"), [this](wxCommandEvent&) { m_plater->copy_selection_to_clipboard(); },
"copy_menu", nullptr, [this](){return m_plater->can_copy_to_clipboard(); }, this);
- append_menu_item(editMenu, wxID_ANY, _(L("&Paste")) + sep + GUI::shortkey_ctrl_prefix() + sep_space + "V",
- _(L("Paste clipboard")), [this](wxCommandEvent&) { m_plater->paste_from_clipboard(); },
+ append_menu_item(editMenu, wxID_ANY, _L("&Paste") + sep + GUI::shortkey_ctrl_prefix() + sep_space + "V",
+ _L("Paste clipboard"), [this](wxCommandEvent&) { m_plater->paste_from_clipboard(); },
"paste_menu", nullptr, [this](){return m_plater->can_paste_from_clipboard(); }, this);
editMenu->AppendSeparator();
- append_menu_item(editMenu, wxID_ANY, _(L("Re&load from disk")) + sep + "F5",
- _(L("Reload the plater from disk")), [this](wxCommandEvent&) { m_plater->reload_all_from_disk(); },
+#ifdef __APPLE__
+ append_menu_item(editMenu, wxID_ANY, _L("Re&load from disk") + dots + "\tCtrl+Shift+R",
+ _L("Reload the plater from disk"), [this](wxCommandEvent&) { m_plater->reload_all_from_disk(); },
"", nullptr, [this]() {return !m_plater->model().objects.empty(); }, this);
+#else
+ append_menu_item(editMenu, wxID_ANY, _L("Re&load from disk") + sep + "F5",
+ _L("Reload the plater from disk"), [this](wxCommandEvent&) { m_plater->reload_all_from_disk(); },
+ "", nullptr, [this]() {return !m_plater->model().objects.empty(); }, this);
+#endif // __APPLE__
+
+ editMenu->AppendSeparator();
+ append_menu_item(editMenu, wxID_ANY, _L("Searc&h") + "\tCtrl+F",
+ _L("Search in settings"), [this](wxCommandEvent&) { m_plater->search(/*m_tabpanel->GetCurrentPage() == */m_plater->IsShown()); },
+ "search", nullptr, []() {return true; }, this);
}
// Window menu
auto windowMenu = new wxMenu();
{
- size_t tab_offset = 0;
if (m_plater) {
- append_menu_item(windowMenu, wxID_HIGHEST + 1, _(L("&Plater Tab")) + "\tCtrl+1", _(L("Show the plater")),
- [this](wxCommandEvent&) { select_tab(0); }, "plater", nullptr,
- [this]() {return true; }, this);
- tab_offset += 1;
- }
- if (tab_offset > 0) {
+ append_menu_item(windowMenu, wxID_HIGHEST + 1, _L("&Plater Tab") + "\tCtrl+1", _L("Show the plater"),
+ [this](wxCommandEvent&) { select_tab(size_t(0)); }, "plater", nullptr,
+ []() {return true; }, this);
windowMenu->AppendSeparator();
}
- append_menu_item(windowMenu, wxID_HIGHEST + 2, _(L("P&rint Settings Tab")) + "\tCtrl+2", _(L("Show the print settings")),
- [this, tab_offset](wxCommandEvent&) { select_tab(tab_offset + 0); }, "cog", nullptr,
- [this]() {return true; }, this);
- wxMenuItem* item_material_tab = append_menu_item(windowMenu, wxID_HIGHEST + 3, _(L("&Filament Settings Tab")) + "\tCtrl+3", _(L("Show the filament settings")),
- [this, tab_offset](wxCommandEvent&) { select_tab(tab_offset + 1); }, "spool", nullptr,
- [this]() {return true; }, this);
+ append_menu_item(windowMenu, wxID_HIGHEST + 2, _L("P&rint Settings Tab") + "\tCtrl+2", _L("Show the print settings"),
+ [this/*, tab_offset*/](wxCommandEvent&) { select_tab(1); }, "cog", nullptr,
+ []() {return true; }, this);
+ wxMenuItem* item_material_tab = append_menu_item(windowMenu, wxID_HIGHEST + 3, _L("&Filament Settings Tab") + "\tCtrl+3", _L("Show the filament settings"),
+ [this/*, tab_offset*/](wxCommandEvent&) { select_tab(2); }, "spool", nullptr,
+ []() {return true; }, this);
m_changeable_menu_items.push_back(item_material_tab);
- append_menu_item(windowMenu, wxID_HIGHEST + 4, _(L("Print&er Settings Tab")) + "\tCtrl+4", _(L("Show the printer settings")),
- [this, tab_offset](wxCommandEvent&) { select_tab(tab_offset + 2); }, "printer", nullptr,
- [this]() {return true; }, this);
+ wxMenuItem* item_printer_tab = append_menu_item(windowMenu, wxID_HIGHEST + 4, _L("Print&er Settings Tab") + "\tCtrl+4", _L("Show the printer settings"),
+ [this/*, tab_offset*/](wxCommandEvent&) { select_tab(3); }, "printer", nullptr,
+ []() {return true; }, this);
+ m_changeable_menu_items.push_back(item_printer_tab);
if (m_plater) {
windowMenu->AppendSeparator();
- append_menu_item(windowMenu, wxID_HIGHEST + 5, _(L("3&D")) + "\tCtrl+5", _(L("Show the 3D editing view")),
+ append_menu_item(windowMenu, wxID_HIGHEST + 5, _L("3&D") + "\tCtrl+5", _L("Show the 3D editing view"),
[this](wxCommandEvent&) { m_plater->select_view_3D("3D"); }, "editor_menu", nullptr,
[this](){return can_change_view(); }, this);
- append_menu_item(windowMenu, wxID_HIGHEST + 6, _(L("Pre&view")) + "\tCtrl+6", _(L("Show the 3D slices preview")),
+ append_menu_item(windowMenu, wxID_HIGHEST + 6, _L("Pre&view") + "\tCtrl+6", _L("Show the 3D slices preview"),
[this](wxCommandEvent&) { m_plater->select_view_3D("Preview"); }, "preview_menu", nullptr,
[this](){return can_change_view(); }, this);
}
-#if _WIN32
- // This is needed on Windows to fake the CTRL+# of the window menu when using the numpad
- wxAcceleratorEntry entries[6];
- entries[0].Set(wxACCEL_CTRL, WXK_NUMPAD1, wxID_HIGHEST + 1);
- entries[1].Set(wxACCEL_CTRL, WXK_NUMPAD2, wxID_HIGHEST + 2);
- entries[2].Set(wxACCEL_CTRL, WXK_NUMPAD3, wxID_HIGHEST + 3);
- entries[3].Set(wxACCEL_CTRL, WXK_NUMPAD4, wxID_HIGHEST + 4);
- entries[4].Set(wxACCEL_CTRL, WXK_NUMPAD5, wxID_HIGHEST + 5);
- entries[5].Set(wxACCEL_CTRL, WXK_NUMPAD6, wxID_HIGHEST + 6);
- wxAcceleratorTable accel(6, entries);
- SetAcceleratorTable(accel);
-#endif // _WIN32
-
windowMenu->AppendSeparator();
- append_menu_item(windowMenu, wxID_ANY, _(L("Print &Host Upload Queue")) + "\tCtrl+J", _(L("Display the Print Host Upload Queue window")),
- [this](wxCommandEvent&) { m_printhost_queue_dlg->Show(); }, "upload_queue", nullptr,
- [this]() {return true; }, this);
+ append_menu_item(windowMenu, wxID_ANY, _L("Print &Host Upload Queue") + "\tCtrl+J", _L("Display the Print Host Upload Queue window"),
+ [this](wxCommandEvent&) { m_printhost_queue_dlg->Show(); }, "upload_queue", nullptr, []() {return true; }, this);
+
+ windowMenu->AppendSeparator();
+ append_menu_item(windowMenu, wxID_ANY, _L("Open new instance") + "\tCtrl+Shift+I", _L("Open a new PrusaSlicer instance"),
+ [this](wxCommandEvent&) { start_new_slicer(); }, "", nullptr, [this]() {return m_plater != nullptr && wxGetApp().app_config->get("single_instance") != "1"; }, this);
}
// View menu
wxMenu* viewMenu = nullptr;
if (m_plater) {
viewMenu = new wxMenu();
- // The camera control accelerators are captured by GLCanvas3D::on_char().
- append_menu_item(viewMenu, wxID_ANY, _(L("Iso")) + sep + "&0", _(L("Iso View")),[this](wxCommandEvent&) { select_view("iso"); },
- "", nullptr, [this](){return can_change_view(); }, this);
+ add_common_view_menu_items(viewMenu, this, std::bind(&MainFrame::can_change_view, this));
viewMenu->AppendSeparator();
- //TRN To be shown in the main menu View->Top
- append_menu_item(viewMenu, wxID_ANY, _(L("Top")) + sep + "&1", _(L("Top View")), [this](wxCommandEvent&) { select_view("top"); },
- "", nullptr, [this](){return can_change_view(); }, this);
- //TRN To be shown in the main menu View->Bottom
- append_menu_item(viewMenu, wxID_ANY, _(L("Bottom")) + sep + "&2", _(L("Bottom View")), [this](wxCommandEvent&) { select_view("bottom"); },
- "", nullptr, [this](){return can_change_view(); }, this);
- append_menu_item(viewMenu, wxID_ANY, _(L("Front")) + sep + "&3", _(L("Front View")), [this](wxCommandEvent&) { select_view("front"); },
- "", nullptr, [this](){return can_change_view(); }, this);
- append_menu_item(viewMenu, wxID_ANY, _(L("Rear")) + sep + "&4", _(L("Rear View")), [this](wxCommandEvent&) { select_view("rear"); },
- "", nullptr, [this](){return can_change_view(); }, this);
- append_menu_item(viewMenu, wxID_ANY, _(L("Left")) + sep + "&5", _(L("Left View")), [this](wxCommandEvent&) { select_view("left"); },
- "", nullptr, [this](){return can_change_view(); }, this);
- append_menu_item(viewMenu, wxID_ANY, _(L("Right")) + sep + "&6", _(L("Right View")), [this](wxCommandEvent&) { select_view("right"); },
- "", nullptr, [this](){return can_change_view(); }, this);
- viewMenu->AppendSeparator();
- append_menu_check_item(viewMenu, wxID_ANY, _(L("Show &labels")) + sep + "E", _(L("Show object/instance labels in 3D scene")),
+ 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") + 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);
}
// Help menu
- auto helpMenu = new wxMenu();
- {
- append_menu_item(helpMenu, wxID_ANY, _(L("Prusa 3D &Drivers")), _(L("Open the Prusa3D drivers download page in your browser")),
- [this](wxCommandEvent&) { wxGetApp().open_web_page_localized("https://www.prusa3d.com/downloads"); });
- append_menu_item(helpMenu, wxID_ANY, _(L("Software &Releases")), _(L("Open the software releases page in your browser")),
- [this](wxCommandEvent&) { wxLaunchDefaultBrowser("http://github.com/prusa3d/PrusaSlicer/releases"); });
-//# my $versioncheck = $self->_append_menu_item($helpMenu, "Check for &Updates...", "Check for new Slic3r versions", sub{
-//# wxTheApp->check_version(1);
-//# });
-//# $versioncheck->Enable(wxTheApp->have_version_check);
- append_menu_item(helpMenu, wxID_ANY, wxString::Format(_(L("%s &Website")), SLIC3R_APP_NAME),
- wxString::Format(_(L("Open the %s website in your browser")), SLIC3R_APP_NAME),
- [this](wxCommandEvent&) { wxGetApp().open_web_page_localized("https://www.prusa3d.com/slicerweb"); });
-// append_menu_item(helpMenu, wxID_ANY, wxString::Format(_(L("%s &Manual")), SLIC3R_APP_NAME),
-// wxString::Format(_(L("Open the %s manual in your browser")), SLIC3R_APP_NAME),
-// [this](wxCommandEvent&) { wxLaunchDefaultBrowser("http://manual.slic3r.org/"); });
- helpMenu->AppendSeparator();
- append_menu_item(helpMenu, wxID_ANY, _(L("System &Info")), _(L("Show system information")),
- [this](wxCommandEvent&) { wxGetApp().system_info(); });
- append_menu_item(helpMenu, wxID_ANY, _(L("Show &Configuration Folder")), _(L("Show user configuration folder (datadir)")),
- [this](wxCommandEvent&) { Slic3r::GUI::desktop_open_datadir_folder(); });
- append_menu_item(helpMenu, wxID_ANY, _(L("Report an I&ssue")), wxString::Format(_(L("Report an issue on %s")), SLIC3R_APP_NAME),
- [this](wxCommandEvent&) { wxLaunchDefaultBrowser("http://github.com/prusa3d/slic3r/issues/new"); });
- append_menu_item(helpMenu, wxID_ANY, wxString::Format(_(L("&About %s")), SLIC3R_APP_NAME), _(L("Show about dialog")),
- [this](wxCommandEvent&) { Slic3r::GUI::about(); });
- helpMenu->AppendSeparator();
- append_menu_item(helpMenu, wxID_ANY, _(L("Keyboard Shortcuts")) + sep + "&?", _(L("Show the list of the keyboard shortcuts")),
- [this](wxCommandEvent&) { wxGetApp().keyboard_shortcuts(); });
-#if ENABLE_THUMBNAIL_GENERATOR_DEBUG
- helpMenu->AppendSeparator();
- append_menu_item(helpMenu, wxID_ANY, "DEBUG gcode thumbnails", "DEBUG ONLY - read the selected gcode file and generates png for the contained thumbnails",
- [this](wxCommandEvent&) { wxGetApp().gcode_thumbnails_debug(); });
-#endif // ENABLE_THUMBNAIL_GENERATOR_DEBUG
- }
+ auto helpMenu = generate_help_menu();
// menubar
// assign menubar to frame after appending items, otherwise special items
// will not be handled correctly
- auto menubar = new wxMenuBar();
- menubar->Append(fileMenu, _(L("&File")));
- if (editMenu) menubar->Append(editMenu, _(L("&Edit")));
- menubar->Append(windowMenu, _(L("&Window")));
- if (viewMenu) menubar->Append(viewMenu, _(L("&View")));
+ m_menubar = new wxMenuBar();
+ m_menubar->Append(fileMenu, _L("&File"));
+ if (editMenu) m_menubar->Append(editMenu, _L("&Edit"));
+ m_menubar->Append(windowMenu, _L("&Window"));
+ if (viewMenu) m_menubar->Append(viewMenu, _L("&View"));
// Add additional menus from C++
- wxGetApp().add_config_menu(menubar);
- menubar->Append(helpMenu, _(L("&Help")));
- SetMenuBar(menubar);
+ wxGetApp().add_config_menu(m_menubar);
+ m_menubar->Append(helpMenu, _L("&Help"));
+ SetMenuBar(m_menubar);
#ifdef __APPLE__
// This fixes a bug on Mac OS where the quit command doesn't emit window close events
// wx bug: https://trac.wxwidgets.org/ticket/18328
- wxMenu *apple_menu = menubar->OSXGetAppleMenu();
+ wxMenu* apple_menu = m_menubar->OSXGetAppleMenu();
if (apple_menu != nullptr) {
apple_menu->Bind(wxEVT_MENU, [this](wxCommandEvent &) {
Close();
}, wxID_EXIT);
}
-#endif
+#endif // __APPLE__
if (plater()->printer_technology() == ptSLA)
update_menubar();
}
+void MainFrame::init_menubar_as_gcodeviewer()
+{
+ wxMenu* fileMenu = new wxMenu;
+ {
+ append_menu_item(fileMenu, wxID_ANY, _L("&Open G-code") + dots + "\tCtrl+O", _L("Open a G-code file"),
+ [this](wxCommandEvent&) { if (m_plater != nullptr) m_plater->load_gcode(); }, "open", nullptr,
+ [this]() {return m_plater != nullptr; }, this);
+#ifdef __APPLE__
+ append_menu_item(fileMenu, wxID_ANY, _L("Re&load from disk") + dots + "\tCtrl+Shift+R",
+ _L("Reload the plater from disk"), [this](wxCommandEvent&) { m_plater->reload_gcode_from_disk(); },
+ "", nullptr, [this]() { return !m_plater->get_last_loaded_gcode().empty(); }, this);
+#else
+ append_menu_item(fileMenu, wxID_ANY, _L("Re&load from disk") + sep + "F5",
+ _L("Reload the plater from disk"), [this](wxCommandEvent&) { m_plater->reload_gcode_from_disk(); },
+ "", nullptr, [this]() { return !m_plater->get_last_loaded_gcode().empty(); }, this);
+#endif // __APPLE__
+ fileMenu->AppendSeparator();
+ append_menu_item(fileMenu, wxID_ANY, _L("Export &toolpaths as OBJ") + dots, _L("Export toolpaths as OBJ"),
+ [this](wxCommandEvent&) { if (m_plater != nullptr) m_plater->export_toolpaths_to_obj(); }, "export_plater", nullptr,
+ [this]() {return can_export_toolpaths(); }, this);
+ append_menu_item(fileMenu, wxID_ANY, _L("Open &PrusaSlicer") + dots, _L("Open PrusaSlicer"),
+ [this](wxCommandEvent&) { start_new_slicer(); }, "", nullptr,
+ [this]() {return true; }, this);
+ fileMenu->AppendSeparator();
+ append_menu_item(fileMenu, wxID_EXIT, _L("&Quit"), wxString::Format(_L("Quit %s"), SLIC3R_APP_NAME),
+ [this](wxCommandEvent&) { Close(false); });
+ }
+
+ // View menu
+ wxMenu* viewMenu = nullptr;
+ if (m_plater != nullptr) {
+ viewMenu = new wxMenu();
+ add_common_view_menu_items(viewMenu, this, std::bind(&MainFrame::can_change_view, this));
+ }
+
+ // helpmenu
+ auto helpMenu = generate_help_menu();
+
+ m_menubar = new wxMenuBar();
+ m_menubar->Append(fileMenu, _L("&File"));
+ if (viewMenu != nullptr) m_menubar->Append(viewMenu, _L("&View"));
+ // Add additional menus from C++
+ wxGetApp().add_config_menu(m_menubar);
+ m_menubar->Append(helpMenu, _L("&Help"));
+ SetMenuBar(m_menubar);
+
+#ifdef __APPLE__
+ // This fixes a bug on Mac OS where the quit command doesn't emit window close events
+ // wx bug: https://trac.wxwidgets.org/ticket/18328
+ wxMenu* apple_menu = m_menubar->OSXGetAppleMenu();
+ if (apple_menu != nullptr) {
+ apple_menu->Bind(wxEVT_MENU, [this](wxCommandEvent&) {
+ Close();
+ }, wxID_EXIT);
+ }
+#endif // __APPLE__
+}
+
void MainFrame::update_menubar()
{
+ if (wxGetApp().is_gcode_viewer())
+ return;
+
const bool is_fff = plater()->printer_technology() == ptFFF;
- m_changeable_menu_items[miExport] ->SetItemLabel((is_fff ? _(L("Export &G-code")) : _(L("E&xport")) ) + dots + "\tCtrl+G");
- m_changeable_menu_items[miSend] ->SetItemLabel((is_fff ? _(L("S&end G-code")) : _(L("S&end to print"))) + dots + "\tCtrl+Shift+G");
+ m_changeable_menu_items[miExport] ->SetItemLabel((is_fff ? _L("Export &G-code") : _L("E&xport")) + dots + "\tCtrl+G");
+ m_changeable_menu_items[miSend] ->SetItemLabel((is_fff ? _L("S&end G-code") : _L("S&end to print")) + dots + "\tCtrl+Shift+G");
+
+ m_changeable_menu_items[miMaterialTab] ->SetItemLabel((is_fff ? _L("&Filament Settings Tab") : _L("Mate&rial Settings Tab")) + "\tCtrl+3");
+ m_changeable_menu_items[miMaterialTab] ->SetBitmap(create_scaled_bitmap(is_fff ? "spool" : "resin"));
- m_changeable_menu_items[miMaterialTab] ->SetItemLabel((is_fff ? _(L("&Filament Settings Tab")) : _(L("Mate&rial Settings Tab"))) + "\tCtrl+3");
- m_changeable_menu_items[miMaterialTab] ->SetBitmap(create_scaled_bitmap(is_fff ? "spool": "resin"));
+ m_changeable_menu_items[miPrinterTab] ->SetBitmap(create_scaled_bitmap(is_fff ? "printer" : "sla_printer"));
}
// To perform the "Quck Slice", "Quick Slice and Save As", "Repeat last Quick Slice" and "Slice to SVG".
@@ -851,7 +1328,7 @@ void MainFrame::quick_slice(const int qs)
// select input file
if (!(qs & qsReslice)) {
- wxFileDialog dlg(this, _(L("Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):")),
+ wxFileDialog dlg(this, _L("Choose a file to slice (STL/OBJ/AMF/3MF/PRUSA):"),
wxGetApp().app_config->get_last_dir(), "",
file_wildcards(FT_MODEL), wxFD_OPEN | wxFD_FILE_MUST_EXIST);
if (dlg.ShowModal() != wxID_OK)
@@ -862,14 +1339,14 @@ void MainFrame::quick_slice(const int qs)
}
else {
if (m_qs_last_input_file.IsEmpty()) {
- wxMessageDialog dlg(this, _(L("No previously sliced file.")),
- _(L("Error")), wxICON_ERROR | wxOK);
+ wxMessageDialog dlg(this, _L("No previously sliced file."),
+ _L("Error"), wxICON_ERROR | wxOK);
dlg.ShowModal();
return;
}
if (std::ifstream(m_qs_last_input_file.ToUTF8().data())) {
- wxMessageDialog dlg(this, _(L("Previously sliced file ("))+m_qs_last_input_file+_(L(") not found.")),
- _(L("File Not Found")), wxICON_ERROR | wxOK);
+ wxMessageDialog dlg(this, _L("Previously sliced file (")+m_qs_last_input_file+_L(") not found."),
+ _L("File Not Found"), wxICON_ERROR | wxOK);
dlg.ShowModal();
return;
}
@@ -904,7 +1381,7 @@ void MainFrame::quick_slice(const int qs)
}
else if (qs & qsSaveAs) {
// The following line may die if the output_filename_format template substitution fails.
- wxFileDialog dlg(this, from_u8((boost::format(_utf8(L("Save %s file as:"))) % ((qs & qsExportSVG) ? _(L("SVG")) : _(L("G-code")))).str()),
+ wxFileDialog dlg(this, from_u8((boost::format(_utf8(L("Save %s file as:"))) % ((qs & qsExportSVG) ? _L("SVG") : _L("G-code"))).str()),
wxGetApp().app_config->get_last_output_dir(get_dir_name(output_file)), get_base_name(input_file),
qs & qsExportSVG ? file_wildcards(FT_SVG) : file_wildcards(FT_GCODE),
wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
@@ -916,7 +1393,7 @@ void MainFrame::quick_slice(const int qs)
wxGetApp().app_config->update_last_output_dir(get_dir_name(output_file));
}
else if (qs & qsExportPNG) {
- wxFileDialog dlg(this, _(L("Save zip file as:")),
+ wxFileDialog dlg(this, _L("Save zip file as:"),
wxGetApp().app_config->get_last_output_dir(get_dir_name(output_file)),
get_base_name(output_file), "*.sl1", wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
if (dlg.ShowModal() != wxID_OK)
@@ -925,10 +1402,10 @@ void MainFrame::quick_slice(const int qs)
}
// show processbar dialog
- m_progress_dialog = new wxProgressDialog(_(L("Slicing")) + dots,
- // TRN "Processing input_file_basename"
- from_u8((boost::format(_utf8(L("Processing %s"))) % (input_file_basename + dots)).str()),
- 100, this, 4);
+ m_progress_dialog = new wxProgressDialog(_L("Slicing") + dots,
+ // TRN "Processing input_file_basename"
+ from_u8((boost::format(_utf8(L("Processing %s"))) % (input_file_basename + dots)).str()),
+ 100, nullptr, wxPD_AUTO_HIDE);
m_progress_dialog->Pulse();
{
// my @warnings = ();
@@ -950,9 +1427,9 @@ void MainFrame::quick_slice(const int qs)
m_progress_dialog->Destroy();
m_progress_dialog = nullptr;
- auto message = input_file_basename + _(L(" was successfully sliced."));
+ auto message = format(_L("%1% was successfully sliced."), input_file_basename);
// wxTheApp->notify(message);
- wxMessageDialog(this, message, _(L("Slicing Done!")), wxOK | wxICON_INFORMATION).ShowModal();
+ wxMessageDialog(this, message, _L("Slicing Done!"), wxOK | wxICON_INFORMATION).ShowModal();
// };
// Slic3r::GUI::catch_error(this, []() { if (m_progress_dialog) m_progress_dialog->Destroy(); });
}
@@ -967,7 +1444,7 @@ void MainFrame::repair_stl()
{
wxString input_file;
{
- wxFileDialog dlg(this, _(L("Select the STL file to repair:")),
+ wxFileDialog dlg(this, _L("Select the STL file to repair:"),
wxGetApp().app_config->get_last_dir(), "",
file_wildcards(FT_STL), wxFD_OPEN | wxFD_FILE_MUST_EXIST);
if (dlg.ShowModal() != wxID_OK)
@@ -1003,7 +1480,7 @@ void MainFrame::export_config()
return;
}
// Ask user for the file name for the config file.
- wxFileDialog dlg(this, _(L("Save configuration as:")),
+ wxFileDialog dlg(this, _L("Save configuration as:"),
!m_last_config.IsEmpty() ? get_dir_name(m_last_config) : wxGetApp().app_config->get_last_dir(),
!m_last_config.IsEmpty() ? get_base_name(m_last_config) : "config.ini",
file_wildcards(FT_INI), wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
@@ -1022,7 +1499,7 @@ void MainFrame::load_config_file()
{
if (!wxGetApp().check_unsaved_changes())
return;
- wxFileDialog dlg(this, _(L("Select configuration to load:")),
+ wxFileDialog dlg(this, _L("Select configuration to load:"),
!m_last_config.IsEmpty() ? get_dir_name(m_last_config) : wxGetApp().app_config->get_last_dir(),
"config.ini", "INI files (*.ini, *.gcode)|*.ini;*.INI;*.gcode;*.g", wxFD_OPEN | wxFD_FILE_MUST_EXIST);
wxString file;
@@ -1047,7 +1524,7 @@ bool MainFrame::load_config_file(const std::string &path)
return true;
}
-void MainFrame::export_configbundle()
+void MainFrame::export_configbundle(bool export_physical_printers /*= false*/)
{
if (!wxGetApp().check_unsaved_changes())
return;
@@ -1058,7 +1535,7 @@ void MainFrame::export_configbundle()
return;
}
// Ask user for a file name.
- wxFileDialog dlg(this, _(L("Save presets bundle as:")),
+ wxFileDialog dlg(this, _L("Save presets bundle as:"),
!m_last_config.IsEmpty() ? get_dir_name(m_last_config) : wxGetApp().app_config->get_last_dir(),
SLIC3R_APP_KEY "_config_bundle.ini",
file_wildcards(FT_INI), wxFD_SAVE | wxFD_OVERWRITE_PROMPT);
@@ -1069,7 +1546,7 @@ void MainFrame::export_configbundle()
// Export the config bundle.
wxGetApp().app_config->update_config_dir(get_dir_name(file));
try {
- wxGetApp().preset_bundle->export_configbundle(file.ToUTF8().data());
+ wxGetApp().preset_bundle->export_configbundle(file.ToUTF8().data(), false, export_physical_printers);
} catch (const std::exception &ex) {
show_error(this, ex.what());
}
@@ -1084,7 +1561,7 @@ void MainFrame::load_configbundle(wxString file/* = wxEmptyString, const bool re
if (!wxGetApp().check_unsaved_changes())
return;
if (file.IsEmpty()) {
- wxFileDialog dlg(this, _(L("Select configuration to load:")),
+ wxFileDialog dlg(this, _L("Select configuration to load:"),
!m_last_config.IsEmpty() ? get_dir_name(m_last_config) : wxGetApp().app_config->get_last_dir(),
"config.ini", file_wildcards(FT_INI), wxFD_OPEN | wxFD_FILE_MUST_EXIST);
if (dlg.ShowModal() != wxID_OK)
@@ -1105,7 +1582,7 @@ void MainFrame::load_configbundle(wxString file/* = wxEmptyString, const bool re
// Load the currently selected preset into the GUI, update the preset selection box.
wxGetApp().load_current_presets();
- const auto message = wxString::Format(_(L("%d presets successfully imported.")), presets_imported);
+ const auto message = wxString::Format(_L("%d presets successfully imported."), presets_imported);
Slic3r::GUI::show_info(this, message, wxString("Info"));
}
@@ -1147,9 +1624,95 @@ void MainFrame::load_config(const DynamicPrintConfig& config)
#endif
}
-void MainFrame::select_tab(size_t tab) const
+void MainFrame::select_tab(Tab* tab)
+{
+ if (!tab)
+ return;
+ int page_idx = m_tabpanel->FindPage(tab);
+ if (page_idx != wxNOT_FOUND && m_layout == ESettingsLayout::Dlg)
+ page_idx++;
+ select_tab(size_t(page_idx));
+}
+
+void MainFrame::select_tab(size_t tab/* = size_t(-1)*/)
{
- m_tabpanel->SetSelection(tab);
+ bool tabpanel_was_hidden = false;
+
+ // Controls on page are created on active page of active tab now.
+ // We should select/activate tab before its showing to avoid an UI-flickering
+ auto select = [this, tab](bool was_hidden) {
+ // when tab == -1, it means we should show the last selected tab
+ size_t new_selection = tab == (size_t)(-1) ? m_last_selected_tab : (m_layout == ESettingsLayout::Dlg && tab != 0) ? tab - 1 : tab;
+
+ if (m_tabpanel->GetSelection() != (int)new_selection)
+ m_tabpanel->SetSelection(new_selection);
+ else if (was_hidden) {
+ Tab* cur_tab = dynamic_cast<Tab*>(m_tabpanel->GetPage(new_selection));
+ if (cur_tab)
+ cur_tab->OnActivate();
+ }
+ };
+
+ if (m_layout == ESettingsLayout::Dlg) {
+ if (tab==0) {
+ if (m_settings_dialog.IsShown())
+ this->SetFocus();
+ // plater should be focused for correct navigation inside search window
+ if (m_plater->canvas3D()->is_search_pressed())
+ m_plater->SetFocus();
+ return;
+ }
+ // Show/Activate Settings Dialog
+#ifdef __WXOSX__ // Don't call SetFont under OSX to avoid name cutting in ObjectList
+ if (m_settings_dialog.IsShown())
+ m_settings_dialog.Hide();
+ else
+ tabpanel_was_hidden = true;
+
+ select(tabpanel_was_hidden);
+ m_tabpanel->Show();
+ m_settings_dialog.Show();
+#else
+ if (m_settings_dialog.IsShown()) {
+ select(false);
+ m_settings_dialog.SetFocus();
+ }
+ else {
+ tabpanel_was_hidden = true;
+ select(tabpanel_was_hidden);
+ m_tabpanel->Show();
+ m_settings_dialog.Show();
+ }
+#endif
+ }
+ else if (m_layout == ESettingsLayout::New) {
+ m_main_sizer->Show(m_plater, tab == 0);
+ tabpanel_was_hidden = !m_main_sizer->IsShown(m_tabpanel);
+ select(tabpanel_was_hidden);
+ m_main_sizer->Show(m_tabpanel, tab != 0);
+
+ // plater should be focused for correct navigation inside search window
+ if (tab == 0 && m_plater->canvas3D()->is_search_pressed())
+ m_plater->SetFocus();
+ Layout();
+ }
+ else
+ select(false);
+
+ // When we run application in ESettingsLayout::New or ESettingsLayout::Dlg mode, tabpanel is hidden from the very beginning
+ // and as a result Tab::update_changed_tree_ui() function couldn't update m_is_nonsys_values values,
+ // which are used for update TreeCtrl and "revert_buttons".
+ // So, force the call of this function for Tabs, if tab panel was hidden
+ if (tabpanel_was_hidden)
+ for (auto cur_tab : wxGetApp().tabs_list)
+ cur_tab->update_changed_tree_ui();
+
+ //// when tab == -1, it means we should show the last selected tab
+ //size_t new_selection = tab == (size_t)(-1) ? m_last_selected_tab : (m_layout == ESettingsLayout::Dlg && tab != 0) ? tab - 1 : tab;
+ //if (m_tabpanel->GetSelection() != new_selection)
+ // m_tabpanel->SetSelection(new_selection);
+ //if (tabpanel_was_hidden)
+ // static_cast<Tab*>(m_tabpanel->GetPage(new_selection))->OnActivate();
}
// Set a camera direction, zoom to all objects.
@@ -1227,7 +1790,7 @@ void MainFrame::add_to_recent_projects(const wxString& filename)
//
// Called after the Preferences dialog is closed and the program settings are saved.
// Update the UI based on the current preferences.
-void MainFrame::update_ui_from_settings()
+void MainFrame::update_ui_from_settings(bool apply_free_camera_correction)
{
// const bool bp_on = wxGetApp().app_config->get("background_processing") == "1";
// m_menu_item_reslice_now->Enable(!bp_on);
@@ -1236,7 +1799,7 @@ void MainFrame::update_ui_from_settings()
// m_plater->sidebar().Layout();
if (m_plater)
- m_plater->update_ui_from_settings();
+ m_plater->update_ui_from_settings(apply_free_camera_correction);
for (auto tab: wxGetApp().tabs_list)
tab->update_ui_from_settings();
}
@@ -1254,5 +1817,105 @@ std::string MainFrame::get_dir_name(const wxString &full_name) const
return boost::filesystem::path(full_name.wx_str()).parent_path().string();
}
+
+// ----------------------------------------------------------------------------
+// SettingsDialog
+// ----------------------------------------------------------------------------
+
+SettingsDialog::SettingsDialog(MainFrame* mainframe)
+: DPIDialog(mainframe, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _L("Settings"), wxDefaultPosition, wxDefaultSize,
+ wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER | wxMINIMIZE_BOX | wxMAXIMIZE_BOX, "settings_dialog"),
+ m_main_frame(mainframe)
+{
+ if (wxGetApp().is_gcode_viewer())
+ return;
+
+#if ENABLE_WX_3_1_3_DPI_CHANGED_EVENT && defined(__WXMSW__)
+ // ys_FIXME! temporary workaround for correct font scaling
+ // Because of from wxWidgets 3.1.3 auto rescaling is implemented for the Fonts,
+ // From the very beginning set dialog font to the wxSYS_DEFAULT_GUI_FONT
+ this->SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
+#else
+ this->SetFont(wxGetApp().normal_font());
+#endif // ENABLE_WX_3_1_3_DPI_CHANGED_EVENT
+ this->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
+
+ // Load the icon either from the exe, or from the ico file.
+#if _WIN32
+ {
+ TCHAR szExeFileName[MAX_PATH];
+ GetModuleFileName(nullptr, szExeFileName, MAX_PATH);
+ SetIcon(wxIcon(szExeFileName, wxBITMAP_TYPE_ICO));
+ }
+#else
+ SetIcon(wxIcon(var("PrusaSlicer_128px.png"), wxBITMAP_TYPE_PNG));
+#endif // _WIN32
+
+ this->Bind(wxEVT_SHOW, [this](wxShowEvent& evt) {
+
+ auto key_up_handker = [this](wxKeyEvent& evt) {
+ if ((evt.GetModifiers() & wxMOD_CONTROL) != 0) {
+ switch (evt.GetKeyCode()) {
+ case '1': { m_main_frame->select_tab(size_t(0)); break; }
+ case '2': { m_main_frame->select_tab(1); break; }
+ case '3': { m_main_frame->select_tab(2); break; }
+ case '4': { m_main_frame->select_tab(3); break; }
+#ifdef __APPLE__
+ case 'f':
+#else /* __APPLE__ */
+ case WXK_CONTROL_F:
+#endif /* __APPLE__ */
+ case 'F': { m_main_frame->plater()->search(false); break; }
+ default:break;
+ }
+ }
+ };
+
+ if (evt.IsShown()) {
+ if (m_tabpanel != nullptr)
+ m_tabpanel->Bind(wxEVT_KEY_UP, key_up_handker);
+ }
+ else {
+ if (m_tabpanel != nullptr)
+ m_tabpanel->Unbind(wxEVT_KEY_UP, key_up_handker);
+ }
+ });
+
+ // initialize layout
+ auto sizer = new wxBoxSizer(wxVERTICAL);
+ sizer->SetSizeHints(this);
+ SetSizer(sizer);
+ Fit();
+
+ const wxSize min_size = wxSize(85 * em_unit(), 50 * em_unit());
+#ifdef __APPLE__
+ // Using SetMinSize() on Mac messes up the window position in some cases
+ // cf. https://groups.google.com/forum/#!topic/wx-users/yUKPBBfXWO0
+ SetSize(min_size);
+#else
+ SetMinSize(min_size);
+ SetSize(GetMinSize());
+#endif
+ Layout();
+}
+
+void SettingsDialog::on_dpi_changed(const wxRect& suggested_rect)
+{
+ if (wxGetApp().is_gcode_viewer())
+ return;
+
+ const int& em = em_unit();
+ const wxSize& size = wxSize(85 * em, 50 * em);
+
+ // update Tabs
+ for (auto tab : wxGetApp().tabs_list)
+ tab->msw_rescale();
+
+ SetMinSize(size);
+ Fit();
+ Refresh();
+}
+
+
} // GUI
} // Slic3r
diff --git a/src/slic3r/GUI/MainFrame.hpp b/src/slic3r/GUI/MainFrame.hpp
index 8c8b98090..9504376b4 100644
--- a/src/slic3r/GUI/MainFrame.hpp
+++ b/src/slic3r/GUI/MainFrame.hpp
@@ -7,12 +7,14 @@
#include <wx/settings.h>
#include <wx/string.h>
#include <wx/filehistory.h>
+#ifdef __APPLE__
+#include <wx/taskbar.h>
+#endif // __APPLE__
#include <string>
#include <map>
#include "GUI_Utils.hpp"
-#include "Plater.hpp"
#include "Event.hpp"
class wxNotebook;
@@ -27,6 +29,8 @@ namespace GUI
class Tab;
class PrintHostQueueDialog;
+class Plater;
+class MainFrame;
enum QuickSlice
{
@@ -43,6 +47,23 @@ struct PresetTab {
PrinterTechnology technology;
};
+// ----------------------------------------------------------------------------
+// SettingsDialog
+// ----------------------------------------------------------------------------
+
+class SettingsDialog : public DPIDialog
+{
+ wxNotebook* m_tabpanel { nullptr };
+ MainFrame* m_main_frame { nullptr };
+public:
+ SettingsDialog(MainFrame* mainframe);
+ ~SettingsDialog() = default;
+ void set_tabpanel(wxNotebook* tabpanel) { m_tabpanel = tabpanel; }
+
+protected:
+ void on_dpi_changed(const wxRect& suggested_rect) override;
+};
+
class MainFrame : public DPIFrame
{
bool m_loaded {false};
@@ -50,12 +71,17 @@ class MainFrame : public DPIFrame
wxString m_qs_last_input_file = wxEmptyString;
wxString m_qs_last_output_file = wxEmptyString;
wxString m_last_config = wxEmptyString;
+ wxMenuBar* m_menubar{ nullptr };
+
#if 0
wxMenuItem* m_menu_item_repeat { nullptr }; // doesn't used now
#endif
wxMenuItem* m_menu_item_reslice_now { nullptr };
+ wxSizer* m_main_sizer{ nullptr };
+
+
- PrintHostQueueDialog *m_printhost_queue_dlg;
+ size_t m_last_selected_tab;
std::string get_base_name(const wxString &full_name, const char *extension = nullptr) const;
std::string get_dir_name(const wxString &full_name) const;
@@ -86,6 +112,7 @@ class MainFrame : public DPIFrame
miExport = 0, // Export G-code Export
miSend, // Send G-code Send to print
miMaterialTab, // Filament Settings Material Settings
+ miPrinterTab, // Different bitmap for Printer Settings
};
// vector of a MenuBar items changeable in respect to printer technology
@@ -93,13 +120,27 @@ class MainFrame : public DPIFrame
wxFileHistory m_recent_projects;
+ enum class ESettingsLayout
+ {
+ Unknown,
+ Old,
+ New,
+ Dlg,
+ GCodeViewer
+ };
+
+ ESettingsLayout m_layout{ ESettingsLayout::Unknown };
+
protected:
virtual void on_dpi_changed(const wxRect &suggested_rect);
+ virtual void on_sys_color_changed() override;
public:
MainFrame();
~MainFrame() = default;
+ void update_layout();
+
// Called when closing the application and when switching the application language.
void shutdown();
@@ -110,12 +151,18 @@ public:
void init_tabpanel();
void create_preset_tabs();
void add_created_tab(Tab* panel);
- void init_menubar();
+ bool is_active_and_shown_tab(Tab* tab);
+ // Register Win32 RawInput callbacks (3DConnexion) and removable media insert / remove callbacks.
+ // Called from wxEVT_ACTIVATE, as wxEVT_CREATE was not reliable (bug in wxWidgets?).
+ void register_win32_callbacks();
+ void init_menubar_as_editor();
+ void init_menubar_as_gcodeviewer();
void update_menubar();
- void update_ui_from_settings();
+ void update_ui_from_settings(bool apply_free_camera_correction = true);
bool is_loaded() const { return m_loaded; }
bool is_last_input_file() const { return !m_qs_last_input_file.IsEmpty(); }
+ bool is_dlg_layout() const { return m_layout == ESettingsLayout::Dlg; }
void quick_slice(const int qs = qsUndef);
void reslice_now();
@@ -125,10 +172,13 @@ public:
void load_config_file();
// Open a config file. Return true if loaded.
bool load_config_file(const std::string &path);
- void export_configbundle();
+ void export_configbundle(bool export_physical_printers = false);
void load_configbundle(wxString file = wxEmptyString);
void load_config(const DynamicPrintConfig& config);
- void select_tab(size_t tab) const;
+ // Select tab in m_tabpanel
+ // When tab == -1, will be selected last selected tab
+ void select_tab(Tab* tab);
+ void select_tab(size_t tab = size_t(-1));
void select_view(const std::string& direction);
// Propagate changed configuration from the Tab to the Plater and save changes to the AppConfig
void on_config_changed(DynamicPrintConfig* cfg) const ;
@@ -137,13 +187,22 @@ public:
PrintHostQueueDialog* printhost_queue_dlg() { return m_printhost_queue_dlg; }
- Plater* m_plater { nullptr };
- wxNotebook* m_tabpanel { nullptr };
- wxProgressDialog* m_progress_dialog { nullptr };
+ Plater* m_plater { nullptr };
+ wxNotebook* m_tabpanel { nullptr };
+ SettingsDialog m_settings_dialog;
+ wxWindow* m_plater_page{ nullptr };
+ wxProgressDialog* m_progress_dialog { nullptr };
+ PrintHostQueueDialog* m_printhost_queue_dlg;
std::shared_ptr<ProgressStatusBar> m_statusbar;
+#ifdef __APPLE__
+ std::unique_ptr<wxTaskBarIcon> m_taskbar_icon;
+#endif // __APPLE__
+
#ifdef _WIN32
void* m_hDeviceNotify { nullptr };
+ uint32_t m_ulSHChangeNotifyRegister { 0 };
+ static constexpr int WM_USER_MEDIACHANGED { 0x7FFF }; // WM_USER from 0x0400 to 0x7FFF, picking the last one to not interfere with wxWidgets allocation
#endif // _WIN32
};
diff --git a/src/slic3r/GUI/MeshUtils.cpp b/src/slic3r/GUI/MeshUtils.cpp
index 37b6efd87..ee0abe76f 100644
--- a/src/slic3r/GUI/MeshUtils.cpp
+++ b/src/slic3r/GUI/MeshUtils.cpp
@@ -27,7 +27,6 @@ void MeshClipper::set_mesh(const TriangleMesh& mesh)
m_mesh = &mesh;
m_triangles_valid = false;
m_triangles2d.resize(0);
- m_triangles3d.resize(0);
m_tms.reset(nullptr);
}
}
@@ -40,18 +39,18 @@ void MeshClipper::set_transformation(const Geometry::Transformation& trafo)
m_trafo = trafo;
m_triangles_valid = false;
m_triangles2d.resize(0);
- m_triangles3d.resize(0);
}
}
-const std::vector<Vec3f>& MeshClipper::get_triangles()
+void MeshClipper::render_cut()
{
if (! m_triangles_valid)
recalculate_triangles();
- return m_triangles3d;
+ if (m_vertex_array.has_VBOs())
+ m_vertex_array.render();
}
@@ -67,37 +66,47 @@ void MeshClipper::recalculate_triangles()
const Vec3f& scaling = m_trafo.get_scaling_factor().cast<float>();
// Calculate clipping plane normal in mesh coordinates.
Vec3f up_noscale = instance_matrix_no_translation_no_scaling.inverse() * m_plane.get_normal().cast<float>();
- Vec3f up (up_noscale(0)*scaling(0), up_noscale(1)*scaling(1), up_noscale(2)*scaling(2));
+ Vec3d up (up_noscale(0)*scaling(0), up_noscale(1)*scaling(1), up_noscale(2)*scaling(2));
// Calculate distance from mesh origin to the clipping plane (in mesh coordinates).
float height_mesh = m_plane.distance(m_trafo.get_offset()) * (up_noscale.norm()/up.norm());
// Now do the cutting
std::vector<ExPolygons> list_of_expolys;
- m_tms->set_up_direction(up);
+ m_tms->set_up_direction(up.cast<float>());
m_tms->slice(std::vector<float>{height_mesh}, SlicingMode::Regular, 0.f, &list_of_expolys, [](){});
m_triangles2d = triangulate_expolygons_2f(list_of_expolys[0], m_trafo.get_matrix().matrix().determinant() < 0.);
// Rotate the cut into world coords:
- Eigen::Quaternionf q;
- q.setFromTwoVectors(Vec3f::UnitZ(), up);
- Transform3f tr = Transform3f::Identity();
+ Eigen::Quaterniond q;
+ q.setFromTwoVectors(Vec3d::UnitZ(), up);
+ Transform3d tr = Transform3d::Identity();
tr.rotate(q);
- tr = m_trafo.get_matrix().cast<float>() * tr;
-
- m_triangles3d.clear();
- m_triangles3d.reserve(m_triangles2d.size());
- for (const Vec2f& pt : m_triangles2d) {
- m_triangles3d.push_back(Vec3f(pt(0), pt(1), height_mesh+0.001f));
- m_triangles3d.back() = tr * m_triangles3d.back();
+ tr = m_trafo.get_matrix() * tr;
+
+ // to avoid z-fighting
+ height_mesh += 0.001f;
+
+ m_vertex_array.release_geometry();
+ for (auto it=m_triangles2d.cbegin(); it != m_triangles2d.cend(); it=it+3) {
+ m_vertex_array.push_geometry(tr * Vec3d((*(it+0))(0), (*(it+0))(1), height_mesh), up);
+ m_vertex_array.push_geometry(tr * Vec3d((*(it+1))(0), (*(it+1))(1), height_mesh), up);
+ m_vertex_array.push_geometry(tr * Vec3d((*(it+2))(0), (*(it+2))(1), height_mesh), up);
+ size_t idx = it - m_triangles2d.cbegin();
+ m_vertex_array.push_triangle(idx, idx+1, idx+2);
}
+ m_vertex_array.finalize_geometry(true);
m_triangles_valid = true;
}
+Vec3f MeshRaycaster::get_triangle_normal(size_t facet_idx) const
+{
+ return m_normals[facet_idx];
+}
-bool MeshRaycaster::unproject_on_mesh(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera,
- Vec3f& position, Vec3f& normal, const ClippingPlane* clipping_plane) const
+void MeshRaycaster::line_from_mouse_pos(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera,
+ Vec3d& point, Vec3d& direction) const
{
const std::array<int, 4>& viewport = camera.get_viewport();
const Transform3d& model_mat = camera.get_view_matrix();
@@ -112,7 +121,21 @@ bool MeshRaycaster::unproject_on_mesh(const Vec2d& mouse_pos, const Transform3d&
pt1 = inv * pt1;
pt2 = inv * pt2;
- std::vector<sla::EigenMesh3D::hit_result> hits = m_emesh.query_ray_hits(pt1, pt2-pt1);
+ point = pt1;
+ direction = pt2-pt1;
+}
+
+
+bool MeshRaycaster::unproject_on_mesh(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera,
+ Vec3f& position, Vec3f& normal, const ClippingPlane* clipping_plane,
+ size_t* facet_idx) const
+{
+ Vec3d point;
+ Vec3d direction;
+ line_from_mouse_pos(mouse_pos, trafo, camera, point, direction);
+
+ std::vector<sla::IndexedMesh::hit_result> hits = m_emesh.query_ray_hits(point, direction);
+
if (hits.empty())
return false; // no intersection found
@@ -134,6 +157,10 @@ bool MeshRaycaster::unproject_on_mesh(const Vec2d& mouse_pos, const Transform3d&
// Now stuff the points in the provided vector and calculate normals if asked about them:
position = hits[i].position().cast<float>();
normal = hits[i].normal().cast<float>();
+
+ if (facet_idx)
+ *facet_idx = hits[i].face();
+
return true;
}
@@ -157,7 +184,7 @@ std::vector<unsigned> MeshRaycaster::get_unobscured_idxs(const Geometry::Transfo
bool is_obscured = false;
// Cast a ray in the direction of the camera and look for intersection with the mesh:
- std::vector<sla::EigenMesh3D::hit_result> hits;
+ std::vector<sla::IndexedMesh::hit_result> hits;
// Offset the start of the ray by EPSILON to account for numerical inaccuracies.
hits = m_emesh.query_ray_hits((inverse_trafo * pt + direction_to_camera_mesh * EPSILON).cast<double>(),
direction_to_camera.cast<double>());
@@ -194,12 +221,9 @@ Vec3f MeshRaycaster::get_closest_point(const Vec3f& point, Vec3f* normal) const
int idx = 0;
Vec3d closest_point;
m_emesh.squared_distance(point.cast<double>(), idx, closest_point);
- if (normal) {
- auto indices = m_emesh.F().row(idx);
- Vec3d a(m_emesh.V().row(indices(1)) - m_emesh.V().row(indices(0)));
- Vec3d b(m_emesh.V().row(indices(2)) - m_emesh.V().row(indices(0)));
- *normal = Vec3f(a.cross(b).cast<float>());
- }
+ if (normal)
+ *normal = m_normals[idx];
+
return closest_point.cast<float>();
}
diff --git a/src/slic3r/GUI/MeshUtils.hpp b/src/slic3r/GUI/MeshUtils.hpp
index b4ad03011..60dcb30c8 100644
--- a/src/slic3r/GUI/MeshUtils.hpp
+++ b/src/slic3r/GUI/MeshUtils.hpp
@@ -3,8 +3,10 @@
#include "libslic3r/Point.hpp"
#include "libslic3r/Geometry.hpp"
-#include "libslic3r/SLA/EigenMesh3D.hpp"
+#include "libslic3r/SLA/IndexedMesh.hpp"
+#include "admesh/stl.h"
+#include "slic3r/GUI/3DScene.hpp"
#include <cfloat>
@@ -26,10 +28,7 @@ class ClippingPlane
public:
ClippingPlane()
{
- m_data[0] = 0.0;
- m_data[1] = 0.0;
- m_data[2] = 1.0;
- m_data[3] = 0.0;
+ *this = ClipsNothing();
}
ClippingPlane(const Vec3d& direction, double offset)
@@ -83,9 +82,9 @@ public:
// into world coordinates.
void set_transformation(const Geometry::Transformation& trafo);
- // Return the triangulated cut. The points are returned directly
- // in world coordinates.
- const std::vector<Vec3f>& get_triangles();
+ // Render the triangulated cut. Transformation matrices should
+ // be set in world coords.
+ void render_cut();
private:
void recalculate_triangles();
@@ -94,7 +93,7 @@ private:
const TriangleMesh* m_mesh = nullptr;
ClippingPlane m_plane;
std::vector<Vec2f> m_triangles2d;
- std::vector<Vec3f> m_triangles3d;
+ GLIndexedVertexArray m_vertex_array;
bool m_triangles_valid = false;
std::unique_ptr<TriangleMeshSlicer> m_tms;
};
@@ -105,11 +104,18 @@ private:
// whether certain points are visible or obscured by the mesh etc.
class MeshRaycaster {
public:
- // The class makes a copy of the mesh as EigenMesh3D.
- // The pointer can be invalidated after constructor returns.
+ // The class references extern TriangleMesh, which must stay alive
+ // during MeshRaycaster existence.
MeshRaycaster(const TriangleMesh& mesh)
: m_emesh(mesh)
- {}
+ {
+ m_normals.reserve(mesh.stl.facet_start.size());
+ for (const stl_facet& facet : mesh.stl.facet_start)
+ m_normals.push_back(facet.normal);
+ }
+
+ void line_from_mouse_pos(const Vec2d& mouse_pos, const Transform3d& trafo, const Camera& camera,
+ Vec3d& point, Vec3d& direction) const;
// Given a mouse position, this returns true in case it is on the mesh.
bool unproject_on_mesh(
@@ -118,7 +124,8 @@ public:
const Camera& camera, // current camera position
Vec3f& position, // where to save the positibon of the hit (mesh coords)
Vec3f& normal, // normal of the triangle that was hit
- const ClippingPlane* clipping_plane = nullptr // clipping plane (if active)
+ const ClippingPlane* clipping_plane = nullptr, // clipping plane (if active)
+ size_t* facet_idx = nullptr // index of the facet hit
) const;
// Given a vector of points in woorld coordinates, this returns vector
@@ -134,10 +141,14 @@ public:
// Given a point in world coords, the method returns closest point on the mesh.
// The output is in mesh coords.
// normal* can be used to also get normal of the respective triangle.
+
Vec3f get_closest_point(const Vec3f& point, Vec3f* normal = nullptr) const;
+ Vec3f get_triangle_normal(size_t facet_idx) const;
+
private:
- sla::EigenMesh3D m_emesh;
+ sla::IndexedMesh m_emesh;
+ std::vector<stl_normal> m_normals;
};
diff --git a/src/slic3r/GUI/Mouse3DController.cpp b/src/slic3r/GUI/Mouse3DController.cpp
index 75ec9c3bc..692ae7f1b 100644
--- a/src/slic3r/GUI/Mouse3DController.cpp
+++ b/src/slic3r/GUI/Mouse3DController.cpp
@@ -1,11 +1,12 @@
#include "libslic3r/libslic3r.h"
+#include "libslic3r/PresetBundle.hpp"
#include "Mouse3DController.hpp"
#include "Camera.hpp"
#include "GUI_App.hpp"
-#include "PresetBundle.hpp"
-#include "AppConfig.hpp"
#include "GLCanvas3D.hpp"
+#include "Plater.hpp"
+#include "NotificationManager.hpp"
#include <wx/glcanvas.h>
@@ -98,7 +99,166 @@ void Mouse3DController::State::append_button(unsigned int id, size_t /* input_qu
#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
}
-#ifdef WIN32
+#ifdef _WIN32
+#if ENABLE_CTRL_M_ON_WINDOWS
+static std::string format_device_string(int vid, int pid)
+{
+ std::string ret;
+
+ switch (vid)
+ {
+ case 0x046d: { ret = "LOGITECH"; break; }
+ case 0x256F: { ret = "3DCONNECTION"; break; }
+ default: { ret = "UNKNOWN"; break; }
+ }
+
+ ret += "::";
+
+ switch (pid)
+ {
+ case 0xc603: { ret += "spacemouse plus XT"; break; }
+ case 0xc605: { ret += "cadman"; break; }
+ case 0xc606: { ret += "spacemouse classic"; break; }
+ case 0xc621: { ret += "spaceball 5000"; break; }
+ case 0xc623: { ret += "space traveller"; break; }
+ case 0xc625: { ret += "space pilot"; break; }
+ case 0xc626: { ret += "space navigator"; break; }
+ case 0xc627: { ret += "space explorer"; break; }
+ case 0xc628: { ret += "space navigator for notebooks"; break; }
+ case 0xc629: { ret += "space pilot pro"; break; }
+ case 0xc62b: { ret += "space mouse pro"; break; }
+ case 0xc62e: { ret += "spacemouse wireless (USB cable)"; break; }
+ case 0xc62f: { ret += "spacemouse wireless receiver"; break; }
+ case 0xc631: { ret += "spacemouse pro wireless"; break; }
+ case 0xc632: { ret += "spacemouse pro wireless receiver"; break; }
+ case 0xc633: { ret += "spacemouse enterprise"; break; }
+ case 0xc635: { ret += "spacemouse compact"; break; }
+ case 0xc636: { ret += "spacemouse module"; break; }
+ case 0xc640: { ret += "nulooq"; break; }
+ case 0xc652: { ret += "3Dconnexion universal receiver"; break; }
+ default: { ret += "UNKNOWN"; break; }
+ }
+
+ return ret;
+}
+
+static std::string detect_attached_device()
+{
+ std::string ret;
+
+ // Initialize the hidapi library
+ int res = hid_init();
+ if (res != 0)
+ BOOST_LOG_TRIVIAL(error) << "Unable to initialize hidapi library";
+ else {
+ // Enumerates devices
+ hid_device_info* devices = hid_enumerate(0, 0);
+ if (devices == nullptr)
+ BOOST_LOG_TRIVIAL(trace) << "detect_attached_device() - no HID device enumerated.";
+ else {
+ // Searches for 1st connected 3Dconnexion device
+ struct DeviceData
+ {
+ unsigned short usage_page{ 0 };
+ unsigned short usage{ 0 };
+
+ DeviceData(unsigned short usage_page, unsigned short usage)
+ : usage_page(usage_page), usage(usage)
+ {}
+
+ // https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf
+ // Usage page 1 - Generic Desktop Controls
+ // Usage page 1, usage 8 - Multi-axis Controller
+ bool has_valid_usage() const { return usage_page == 1 && usage == 8; }
+ };
+
+ // When using 3Dconnexion universal receiver, multiple devices are detected sharing the same vendor_id and product_id.
+ // To choose from them the right one we use: usage_page == 1 and usage == 8
+ // When only a single device is detected, as for wired connections, vendor_id and product_id are enough
+
+ // First we count all the valid devices from the enumerated list,
+
+ hid_device_info* current = devices;
+ typedef std::pair<unsigned short, unsigned short> DeviceIds;
+ typedef std::vector<DeviceData> DeviceDataList;
+ typedef std::map<DeviceIds, DeviceDataList> DetectedDevices;
+ DetectedDevices detected_devices;
+ while (current != nullptr) {
+ unsigned short vendor_id = 0;
+ unsigned short product_id = 0;
+
+ for (size_t i = 0; i < _3DCONNEXION_VENDORS.size(); ++i) {
+ if (_3DCONNEXION_VENDORS[i] == current->vendor_id) {
+ vendor_id = current->vendor_id;
+ break;
+ }
+ }
+
+ if (vendor_id != 0) {
+ for (size_t i = 0; i < _3DCONNEXION_DEVICES.size(); ++i) {
+ if (_3DCONNEXION_DEVICES[i] == current->product_id) {
+ product_id = current->product_id;
+ DeviceIds detected_device(vendor_id, product_id);
+ DetectedDevices::iterator it = detected_devices.find(detected_device);
+ if (it == detected_devices.end())
+ it = detected_devices.insert(DetectedDevices::value_type(detected_device, DeviceDataList())).first;
+
+ it->second.emplace_back(current->usage_page, current->usage);
+ }
+ }
+ }
+
+ current = current->next;
+ }
+
+ // Free enumerated devices
+ hid_free_enumeration(devices);
+
+ unsigned short vendor_id = 0;
+ unsigned short product_id = 0;
+ if (!detected_devices.empty()) {
+ // Then we'll decide the choosing logic to apply in dependence of the device count and operating system
+ for (const DetectedDevices::value_type& device : detected_devices) {
+ if (device.second.size() == 1) {
+ if (device.second.front().has_valid_usage()) {
+ vendor_id = device.first.first;
+ product_id = device.first.second;
+ break;
+ }
+ }
+ else {
+ bool found = false;
+ for (const DeviceData& data : device.second) {
+ if (data.has_valid_usage()) {
+ vendor_id = device.first.first;
+ product_id = device.first.second;
+ found = true;
+ break;
+ }
+ }
+
+ if (found)
+ break;
+ }
+ }
+ }
+
+ if (vendor_id != 0 && product_id != 0) {
+ ret = format_device_string(static_cast<int>(vendor_id), static_cast<int>(product_id));
+ BOOST_LOG_TRIVIAL(trace) << "Detected device: " << std::hex << vendor_id << std::dec << "::" << std::hex << product_id << std::dec << " " << ret;
+ }
+ else
+ BOOST_LOG_TRIVIAL(trace) << "No 3DConnexion device detected";
+ }
+
+ // Finalize the hidapi library
+ hid_exit();
+ }
+
+ return ret;
+}
+#endif // ENABLE_CTRL_M_ON_WINDOWS
+
// Called by Win32 HID enumeration callback.
void Mouse3DController::device_attached(const std::string &device)
{
@@ -114,10 +274,36 @@ 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_device_str = format_device_string(vid, pid);
+ if (auto it_params = m_params_by_device.find(m_device_str); it_params != m_params_by_device.end()) {
+ tbb::mutex::scoped_lock lock(m_params_ui_mutex);
+ m_params = m_params_ui = it_params->second;
+ }
+ else
+ m_params_by_device[format_device_string(vid, pid)] = Params();
+ m_connected = true;
+#endif // ENABLE_CTRL_M_ON_WINDOWS
+ }
}
}
+#if ENABLE_CTRL_M_ON_WINDOWS
+void Mouse3DController::device_detached(const std::string& device)
+{
+ int vid = 0;
+ int pid = 0;
+ if (sscanf(device.c_str(), "\\\\?\\HID#VID_%x&PID_%x&", &vid, &pid) == 2) {
+ if (std::find(_3DCONNEXION_VENDORS.begin(), _3DCONNEXION_VENDORS.end(), vid) != _3DCONNEXION_VENDORS.end()) {
+ tbb::mutex::scoped_lock lock(m_params_ui_mutex);
+ m_params_by_device[format_device_string(vid, pid)] = m_params_ui;
+ }
+ }
+ m_device_str = "";
+ 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()
{
@@ -133,7 +319,7 @@ bool Mouse3DController::State::process_mouse_wheel()
m_mouse_wheel_counter = 0;
return true;
}
-#endif // WIN32
+#endif // _WIN32
bool Mouse3DController::State::apply(const Mouse3DController::Params &params, Camera& camera)
{
@@ -160,7 +346,6 @@ bool Mouse3DController::State::apply(const Mouse3DController::Params &params, Ca
if (params.swap_yz)
rot = Vec3d(rot.x(), -rot.z(), rot.y());
camera.rotate_local_around_target(Vec3d(rot.x(), - rot.z(), rot.y()));
- break;
} else {
assert(input_queue_item.is_buttons());
switch (input_queue_item.type_or_buttons) {
@@ -211,6 +396,7 @@ void Mouse3DController::save_config(AppConfig &appconfig) const
{
// We do not synchronize m_params_by_device with the background thread explicitely
// as there should be a full memory barrier executed once the background thread is stopped.
+
for (const std::pair<std::string, Params> &key_value_pair : m_params_by_device) {
const std::string &device_name = key_value_pair.first;
const Params &params = key_value_pair.second;
@@ -228,6 +414,19 @@ bool Mouse3DController::apply(Camera& camera)
m_show_settings_dialog = false;
m_settings_dialog_closed_by_user = false;
}
+
+#if ENABLE_CTRL_M_ON_WINDOWS
+#ifdef _WIN32
+ {
+ tbb::mutex::scoped_lock lock(m_params_ui_mutex);
+ if (m_params_ui_changed) {
+ m_params = m_params_ui;
+ m_params_ui_changed = false;
+ }
+ }
+#endif // _WIN32
+#endif // ENABLE_CTRL_M_ON_WINDOWS
+
return m_state.apply(m_params, camera);
}
@@ -238,8 +437,7 @@ void Mouse3DController::render_settings_dialog(GLCanvas3D& canvas) const
// when the user clicks on [X] or [Close] button we need to trigger
// an extra frame to let the dialog disappear
- if (m_settings_dialog_closed_by_user)
- {
+ if (m_settings_dialog_closed_by_user) {
m_show_settings_dialog = false;
m_settings_dialog_closed_by_user = false;
canvas.request_extra_frame();
@@ -260,13 +458,10 @@ void Mouse3DController::render_settings_dialog(GLCanvas3D& canvas) const
static ImVec2 last_win_size(0.0f, 0.0f);
bool shown = true;
- if (imgui.begin(_(L("3Dconnexion settings")), &shown, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoCollapse))
- {
- if (shown)
- {
+ if (imgui.begin(_L("3Dconnexion settings"), &shown, ImGuiWindowFlags_AlwaysAutoResize | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoCollapse)) {
+ if (shown) {
ImVec2 win_size = ImGui::GetWindowSize();
- if ((last_win_size.x != win_size.x) || (last_win_size.y != win_size.y))
- {
+ if (last_win_size.x != win_size.x || last_win_size.y != win_size.y) {
// when the user clicks on [X] button, the next time the dialog is shown
// has a dummy size, so we trigger an extra frame to let it have the correct size
last_win_size = win_size;
@@ -274,59 +469,51 @@ void Mouse3DController::render_settings_dialog(GLCanvas3D& canvas) const
}
const ImVec4& color = ImGui::GetStyleColorVec4(ImGuiCol_Separator);
- ImGui::PushStyleColor(ImGuiCol_Text, color);
- imgui.text(_(L("Device:")));
- ImGui::PopStyleColor();
+ imgui.text_colored(color, _L("Device:"));
ImGui::SameLine();
imgui.text(m_device_str);
ImGui::Separator();
- ImGui::PushStyleColor(ImGuiCol_Text, color);
- imgui.text(_(L("Speed:")));
- ImGui::PopStyleColor();
+ imgui.text_colored(color, _L("Speed:"));
float translation_scale = (float)params_copy.translation.scale / Params::DefaultTranslationScale;
- if (imgui.slider_float(_(L("Translation")) + "##1", &translation_scale, 0.1f, 10.0f, "%.1f")) {
+ if (imgui.slider_float(_L("Translation") + "##1", &translation_scale, 0.1f, 10.0f, "%.1f")) {
params_copy.translation.scale = Params::DefaultTranslationScale * (double)translation_scale;
params_changed = true;
}
float rotation_scale = params_copy.rotation.scale / Params::DefaultRotationScale;
- if (imgui.slider_float(_(L("Rotation")) + "##1", &rotation_scale, 0.1f, 10.0f, "%.1f")) {
+ if (imgui.slider_float(_L("Rotation") + "##1", &rotation_scale, 0.1f, 10.0f, "%.1f")) {
params_copy.rotation.scale = Params::DefaultRotationScale * rotation_scale;
params_changed = true;
}
float zoom_scale = params_copy.zoom.scale / Params::DefaultZoomScale;
- if (imgui.slider_float(_(L("Zoom")), &zoom_scale, 0.1f, 10.0f, "%.1f")) {
+ if (imgui.slider_float(_L("Zoom"), &zoom_scale, 0.1f, 10.0f, "%.1f")) {
params_copy.zoom.scale = Params::DefaultZoomScale * zoom_scale;
params_changed = true;
}
ImGui::Separator();
- ImGui::PushStyleColor(ImGuiCol_Text, color);
- imgui.text(_(L("Deadzone:")));
- ImGui::PopStyleColor();
+ imgui.text_colored(color, _L("Deadzone:"));
float translation_deadzone = (float)params_copy.translation.deadzone;
- if (imgui.slider_float(_(L("Translation")) + "/" + _(L("Zoom")), &translation_deadzone, 0.0f, (float)Params::MaxTranslationDeadzone, "%.2f")) {
+ if (imgui.slider_float(_L("Translation") + "/" + _L("Zoom"), &translation_deadzone, 0.0f, (float)Params::MaxTranslationDeadzone, "%.2f")) {
params_copy.translation.deadzone = (double)translation_deadzone;
params_changed = true;
}
float rotation_deadzone = params_copy.rotation.deadzone;
- if (imgui.slider_float(_(L("Rotation")) + "##2", &rotation_deadzone, 0.0f, Params::MaxRotationDeadzone, "%.2f")) {
+ if (imgui.slider_float(_L("Rotation") + "##2", &rotation_deadzone, 0.0f, Params::MaxRotationDeadzone, "%.2f")) {
params_copy.rotation.deadzone = rotation_deadzone;
params_changed = true;
}
ImGui::Separator();
- ImGui::PushStyleColor(ImGuiCol_Text, color);
- imgui.text(_(L("Options:")));
- ImGui::PopStyleColor();
+ imgui.text_colored(color, _L("Options:"));
bool swap_yz = params_copy.swap_yz;
- if (imgui.checkbox("Swap Y/Z axes", swap_yz)) {
+ if (imgui.checkbox(_L("Swap Y/Z axes"), swap_yz)) {
params_copy.swap_yz = swap_yz;
params_changed = true;
}
@@ -334,25 +521,20 @@ void Mouse3DController::render_settings_dialog(GLCanvas3D& canvas) const
#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
ImGui::Separator();
ImGui::Separator();
- ImGui::PushStyleColor(ImGuiCol_Text, color);
- imgui.text("DEBUG:");
- imgui.text("Vectors:");
- ImGui::PopStyleColor();
+ imgui.text_colored(color, "DEBUG:");
+ imgui.text_colored(color, "Vectors:");
Vec3f translation = m_state.get_first_vector_of_type(State::QueueItem::TranslationType).cast<float>();
Vec3f rotation = m_state.get_first_vector_of_type(State::QueueItem::RotationType).cast<float>();
ImGui::InputFloat3("Translation##3", translation.data(), "%.3f", ImGuiInputTextFlags_ReadOnly);
ImGui::InputFloat3("Rotation##3", rotation.data(), "%.3f", ImGuiInputTextFlags_ReadOnly);
- ImGui::PushStyleColor(ImGuiCol_Text, color);
- imgui.text("Queue size:");
- ImGui::PopStyleColor();
+ imgui.text_colored(color, "Queue size:");
int input_queue_size_current[2] = { int(m_state.input_queue_size_current()), int(m_state.input_queue_max_size_achieved) };
ImGui::InputInt2("Current##4", input_queue_size_current, ImGuiInputTextFlags_ReadOnly);
int input_queue_size_param = int(params_copy.input_queue_max_size);
- if (ImGui::InputInt("Max size", &input_queue_size_param, 1, 1, ImGuiInputTextFlags_ReadOnly))
- {
+ if (ImGui::InputInt("Max size", &input_queue_size_param, 1, 1, ImGuiInputTextFlags_ReadOnly)) {
if (input_queue_size_param > 0) {
params_copy.input_queue_max_size = input_queue_size_param;
params_changed = true;
@@ -360,23 +542,19 @@ void Mouse3DController::render_settings_dialog(GLCanvas3D& canvas) const
}
ImGui::Separator();
- ImGui::PushStyleColor(ImGuiCol_Text, color);
- imgui.text("Camera:");
- ImGui::PopStyleColor();
+ imgui.text_colored(color, "Camera:");
Vec3f target = wxGetApp().plater()->get_camera().get_target().cast<float>();
ImGui::InputFloat3("Target", target.data(), "%.3f", ImGuiInputTextFlags_ReadOnly);
#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
ImGui::Separator();
- if (imgui.button(_(L("Close"))))
- {
+ if (imgui.button(_L("Close"))) {
// the user clicked on the [Close] button
m_settings_dialog_closed_by_user = true;
canvas.set_as_dirty();
}
}
- else
- {
+ else {
// the user clicked on the [X] button
m_settings_dialog_closed_by_user = true;
canvas.set_as_dirty();
@@ -386,7 +564,7 @@ void Mouse3DController::render_settings_dialog(GLCanvas3D& canvas) const
imgui.end();
if (params_changed) {
- // Synchronize front end parameters to back end.
+ // Synchronize front end parameters to back end.
tbb::mutex::scoped_lock lock(m_params_ui_mutex);
auto pthis = const_cast<Mouse3DController*>(this);
#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
@@ -423,6 +601,8 @@ void Mouse3DController::disconnected()
m_params_by_device[m_device_str] = m_params_ui;
m_device_str.clear();
m_connected = false;
+ wxGetApp().plater()->get_notification_manager()->push_notification(NotificationType::Mouse3dDisconnected);
+
wxGetApp().plater()->CallAfter([]() {
Plater *plater = wxGetApp().plater();
if (plater != nullptr) {
@@ -481,10 +661,24 @@ bool Mouse3DController::handle_input(const DataPacketAxis& packet)
// Initialize the application.
void Mouse3DController::init()
{
+#if ENABLE_CTRL_M_ON_WINDOWS
+#ifdef _WIN32
+ m_device_str = detect_attached_device();
+ if (!m_device_str.empty()) {
+ m_connected = true;
+ if (auto it_params = m_params_by_device.find(m_device_str); it_params != m_params_by_device.end())
+ m_params = m_params_ui = it_params->second;
+ }
+#endif // _WIN32
+#endif // ENABLE_CTRL_M_ON_WINDOWS
+
assert(! m_thread.joinable());
if (! m_thread.joinable()) {
m_stop = false;
+#ifndef _WIN32
+ // Don't start the background thread on Windows, as the HID messages are sent as Windows messages.
m_thread = std::thread(&Mouse3DController::run, this);
+#endif // _WIN32
}
}
@@ -503,6 +697,13 @@ void Mouse3DController::shutdown()
m_thread.join();
m_stop = false;
}
+
+#if ENABLE_CTRL_M_ON_WINDOWS
+#ifdef _WIN32
+ if (!m_device_str.empty())
+ m_params_by_device[m_device_str] = m_params_ui;
+#endif // _WIN32
+#endif // ENABLE_CTRL_M_ON_WINDOWS
}
// Main routine of the worker thread.
@@ -536,7 +737,7 @@ void Mouse3DController::run()
if (m_stop)
break;
if (m_params_ui_changed) {
- m_params = m_params_ui;
+ m_params = m_params_ui;
m_params_ui_changed = false;
}
}
@@ -576,8 +777,7 @@ bool Mouse3DController::connect_device()
// Enumerates devices
hid_device_info* devices = hid_enumerate(0, 0);
- if (devices == nullptr)
- {
+ if (devices == nullptr) {
BOOST_LOG_TRIVIAL(trace) << "Mouse3DController::connect_device() - no HID device enumerated.";
return false;
}
@@ -600,15 +800,17 @@ bool Mouse3DController::connect_device()
: path(path), usage_page(usage_page), usage(usage)
{}
- bool has_valid_usage() const { return (usage_page == 1) && (usage == 8); }
+ // https://www.usb.org/sites/default/files/documents/hut1_12v2.pdf
+ // Usage page 1 - Generic Desktop Controls
+ // Usage page 1, usage 8 - Multi-axis Controller
+ bool has_valid_usage() const { return usage_page == 1 && usage == 8; }
};
#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
hid_device_info* cur = devices;
std::cout << std::endl << "======================================================================================================================================" << std::endl;
std::cout << "Detected devices:" << std::endl;
- while (cur != nullptr)
- {
+ while (cur != nullptr) {
std::cout << "\"";
std::wcout << ((cur->manufacturer_string != nullptr) ? cur->manufacturer_string : L"Unknown");
std::cout << "/";
@@ -638,26 +840,20 @@ bool Mouse3DController::connect_device()
#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
std::cout << std::endl << "Detected 3D connexion devices:" << std::endl;
#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
- while (current != nullptr)
- {
+ while (current != nullptr) {
unsigned short vendor_id = 0;
unsigned short product_id = 0;
- for (size_t i = 0; i < _3DCONNEXION_VENDORS.size(); ++i)
- {
- if (_3DCONNEXION_VENDORS[i] == current->vendor_id)
- {
+ for (size_t i = 0; i < _3DCONNEXION_VENDORS.size(); ++i) {
+ if (_3DCONNEXION_VENDORS[i] == current->vendor_id) {
vendor_id = current->vendor_id;
break;
}
}
- if (vendor_id != 0)
- {
- for (size_t i = 0; i < _3DCONNEXION_DEVICES.size(); ++i)
- {
- if (_3DCONNEXION_DEVICES[i] == current->product_id)
- {
+ if (vendor_id != 0) {
+ for (size_t i = 0; i < _3DCONNEXION_DEVICES.size(); ++i) {
+ if (_3DCONNEXION_DEVICES[i] == current->product_id) {
product_id = current->product_id;
DeviceIds detected_device(vendor_id, product_id);
DetectedDevices::iterator it = detected_devices.find(detected_device);
@@ -688,46 +884,42 @@ bool Mouse3DController::connect_device()
if (detected_devices.empty())
return false;
- std::string path = "";
+ std::string path;
unsigned short vendor_id = 0;
unsigned short product_id = 0;
// Then we'll decide the choosing logic to apply in dependence of the device count and operating system
- for (const DetectedDevices::value_type& device : detected_devices)
- {
- if (device.second.size() == 1)
- {
+ for (const DetectedDevices::value_type& device : detected_devices) {
+ if (device.second.size() == 1) {
#if defined(__linux__)
hid_device* test_device = hid_open(device.first.first, device.first.second, nullptr);
- if (test_device != nullptr)
- {
+ if (test_device == nullptr) {
+ BOOST_LOG_TRIVIAL(error) << "3DConnexion device cannot be opened: " << device.second.front().path <<
+ " You may need to update /etc/udev/rules.d";
+ } else {
hid_close(test_device);
#else
- if (device.second.front().has_valid_usage())
- {
+ if (device.second.front().has_valid_usage()) {
#endif // __linux__
vendor_id = device.first.first;
product_id = device.first.second;
break;
}
}
- else
- {
+ else {
bool found = false;
#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
std::cout << std::endl;
#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
- for (const DeviceData& data : device.second)
- {
+ for (const DeviceData& data : device.second) {
#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
std::cout << "Test device: " << std::hex << device.first.first << std::dec << "/" << std::hex << device.first.second << std::dec << " \"" << data.path << "\"";
#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
#ifdef __linux__
hid_device* test_device = hid_open_path(data.path.c_str());
- if (test_device != nullptr)
- {
+ if (test_device != nullptr) {
path = data.path;
vendor_id = device.first.first;
product_id = device.first.second;
@@ -739,8 +931,7 @@ bool Mouse3DController::connect_device()
break;
}
#else // !__linux__
- if (data.has_valid_usage())
- {
+ if (data.has_valid_usage()) {
path = data.path;
vendor_id = device.first.first;
product_id = device.first.second;
@@ -751,10 +942,13 @@ bool Mouse3DController::connect_device()
break;
}
#endif // __linux__
+ else {
+ BOOST_LOG_TRIVIAL(error) << "3DConnexion device cannot be opened: " << data.path <<
+ " You may need to update /etc/udev/rules.d";
#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
- else
std::cout << "-> NOT PASSED" << std::endl;
#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
+ }
}
if (found)
@@ -762,10 +956,8 @@ bool Mouse3DController::connect_device()
}
}
- if (path.empty())
- {
- if ((vendor_id != 0) && (product_id != 0))
- {
+ if (path.empty()) {
+ if ((vendor_id != 0) && (product_id != 0)) {
// Open the 3Dconnexion device using vendor_id and product_id
#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
std::cout << std::endl << "Opening device: " << std::hex << vendor_id << std::dec << "/" << std::hex << product_id << std::dec << " using hid_open()" << std::endl;
@@ -775,8 +967,7 @@ bool Mouse3DController::connect_device()
else
return false;
}
- else
- {
+ else {
// Open the 3Dconnexion device using the device path
#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
std::cout << std::endl << "Opening device: " << std::hex << vendor_id << std::dec << "/" << std::hex << product_id << std::dec << "\"" << path << "\" using hid_open_path()" << std::endl;
@@ -784,8 +975,7 @@ bool Mouse3DController::connect_device()
m_device = hid_open_path(path.c_str());
}
- if (m_device != nullptr)
- {
+ if (m_device != nullptr) {
wchar_t buffer[1024];
hid_get_manufacturer_string(m_device, buffer, 1024);
m_device_str = boost::nowide::narrow(buffer);
@@ -813,8 +1003,7 @@ bool Mouse3DController::connect_device()
}
}
#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
- else
- {
+ else {
std::cout << std::endl << "Unable to connect to device:" << std::endl;
std::cout << "Manufacturer/product: " << m_device_str << std::endl;
std::cout << "Manufacturer id.....: " << vendor_id << " (" << std::hex << vendor_id << std::dec << ")" << std::endl;
@@ -865,45 +1054,63 @@ void Mouse3DController::collect_input()
this->handle_input(packet, res, m_params, m_state);
}
+#ifdef _WIN32
+bool Mouse3DController::handle_raw_input_win32(const unsigned char *data, const int packet_length)
+{
+ if (! wxGetApp().IsActive())
+ return false;
+
+ if (packet_length == 7 || packet_length == 13) {
+ 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;
+}
+#endif /* _WIN32 */
+
// Unpack raw 3DConnexion HID packet of a wired 3D mouse into m_state. Called by the worker thread.
-bool Mouse3DController::handle_input(const DataPacketRaw& packet, const int packet_lenght, const Params &params, State &state_in_out)
+bool Mouse3DController::handle_input(const DataPacketRaw& packet, const int packet_length, const Params &params, State &state_in_out)
{
if (! wxGetApp().IsActive())
return false;
- int res = packet_lenght;
+ int res = packet_length;
bool updated = false;
- if (res == 7)
- updated = handle_packet(packet, params, state_in_out);
- else if (res == 13)
- updated = handle_wireless_packet(packet, params, state_in_out);
- else if ((res == 3) && (packet[0] == 3))
+ if (res == 7 || res == 13 ||
// On Mac button packets can be 3 bytes long
- updated = handle_packet(packet, params, state_in_out);
+ ((res == 3) && (packet[0] == 3)))
+ updated = handle_packet(packet, res, params, state_in_out);
#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
else if (res > 0)
std::cout << "Got unknown data packet of length: " << res << ", code:" << (int)packet[0] << std::endl;
#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
-#if 1
if (updated) {
wxGetApp().plater()->set_current_canvas_as_dirty();
// ask for an idle event to update 3D scene
wxWakeUpIdle();
}
-#endif
return updated;
}
// Unpack raw 3DConnexion HID packet of a wired 3D mouse into m_state. Called by handle_input() from the worker thread.
-bool Mouse3DController::handle_packet(const DataPacketRaw& packet, const Params &params, State &state_in_out)
+bool Mouse3DController::handle_packet(const DataPacketRaw& packet, const int packet_length, const Params &params, State &state_in_out)
{
switch (packet[0])
{
- case 1: // Translation
+ case 1: // Translation + Rotation
{
- if (handle_packet_translation(packet, params, state_in_out))
+ bool updated = handle_packet_translation(packet, params, state_in_out);
+ if (packet_length == 13)
+ updated |= handle_packet_rotation(packet, 7, params, state_in_out);
+
+ if (updated)
return true;
break;
@@ -941,47 +1148,6 @@ bool Mouse3DController::handle_packet(const DataPacketRaw& packet, const Params
return false;
}
-// Unpack raw 3DConnexion HID packet of a wireless 3D mouse into m_state. Called by handle_input() from the worker thread.
-bool Mouse3DController::handle_wireless_packet(const DataPacketRaw& packet, const Params &params, State &state_in_out)
-{
- switch (packet[0])
- {
- case 1: // Translation + Rotation
- {
- bool updated = handle_packet_translation(packet, params, state_in_out);
- updated |= handle_packet_rotation(packet, 7, params, state_in_out);
-
- if (updated)
- return true;
-
- break;
- }
- case 3: // Button
- {
- if (params.buttons_enabled && handle_packet_button(packet, 12, params, state_in_out))
- return true;
-
- break;
- }
- case 23: // Battery charge
- {
-#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
- std::cout << "3DConnexion - battery level: " << (int)packet[1] << " percent" << std::endl;
-#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
- break;
- }
- default:
- {
-#if ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
- std::cout << "3DConnexion - Got unknown data packet of code: " << (int)packet[0] << std::endl;
-#endif // ENABLE_3DCONNEXION_DEVICES_DEBUG_OUTPUT
- break;
- }
- }
-
- return false;
-}
-
// Convert a signed 16bit word from a 3DConnexion mouse HID packet into a double coordinate, apply a dead zone.
static double convert_input(int coord_byte_low, int coord_byte_high, double deadzone)
{
diff --git a/src/slic3r/GUI/Mouse3DController.hpp b/src/slic3r/GUI/Mouse3DController.hpp
index eb1425b88..af131992c 100644
--- a/src/slic3r/GUI/Mouse3DController.hpp
+++ b/src/slic3r/GUI/Mouse3DController.hpp
@@ -9,6 +9,7 @@
#include "hidapi.h"
#include <queue>
+#include <atomic>
#include <thread>
#include <vector>
#include <chrono>
@@ -33,12 +34,12 @@ class Mouse3DController
struct Params
{
static constexpr double DefaultTranslationScale = 2.5;
- static constexpr double MaxTranslationDeadzone = 0.2;
- static constexpr double DefaultTranslationDeadzone = 0.5 * MaxTranslationDeadzone;
- static constexpr float DefaultRotationScale = 1.0f;
- static constexpr float MaxRotationDeadzone = 0.2f;
- static constexpr float DefaultRotationDeadzone = 0.5f * MaxRotationDeadzone;
- static constexpr double DefaultZoomScale = 0.1;
+ static constexpr double MaxTranslationDeadzone = 0.2;
+ static constexpr double DefaultTranslationDeadzone = 0.0;
+ static constexpr float DefaultRotationScale = 1.0f;
+ static constexpr float MaxRotationDeadzone = 0.2f;
+ static constexpr float DefaultRotationDeadzone = 0.0f;
+ static constexpr double DefaultZoomScale = 0.1;
template <typename Number>
struct CustomParameters
@@ -189,15 +190,20 @@ public:
bool handle_input(const DataPacketAxis& packet);
#endif // __APPLE__
-#ifdef WIN32
+#ifdef _WIN32
+ bool handle_raw_input_win32(const unsigned char *data, const int packet_lenght);
+
// 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
// mouse wheel events.
bool process_mouse_wheel() { return m_state.process_mouse_wheel(); }
-#endif // WIN32
+#endif // _WIN32
// Apply the received 3DConnexion mouse events to the camera. Called from the UI rendering thread.
bool apply(Camera& camera);
@@ -218,10 +224,9 @@ private:
typedef std::array<unsigned char, 13> DataPacketRaw;
// Unpack raw 3DConnexion HID packet of a wired 3D mouse into m_state. Called by the worker thread.
- static bool handle_input(const DataPacketRaw& packet, const int packet_lenght, const Params &params, State &state_in_out);
+ static bool handle_input(const DataPacketRaw& packet, const int packet_length, const Params &params, State &state_in_out);
// The following is called by handle_input() from the worker thread.
- static bool handle_packet(const DataPacketRaw& packet, const Params &params, State &state_in_out);
- static bool handle_wireless_packet(const DataPacketRaw& packet, const Params &params, State &state_in_out);
+ static bool handle_packet(const DataPacketRaw& packet, const int packet_length, const Params &params, State &state_in_out);
static bool handle_packet_translation(const DataPacketRaw& packet, const Params &params, State &state_in_out);
static bool handle_packet_rotation(const DataPacketRaw& packet, unsigned int first_byte, const Params &params, State &state_in_out);
static bool handle_packet_button(const DataPacketRaw& packet, unsigned int packet_size, const Params &params, State &state_in_out);
diff --git a/src/slic3r/GUI/MsgDialog.cpp b/src/slic3r/GUI/MsgDialog.cpp
index 5b583ba2a..d90f4de10 100644
--- a/src/slic3r/GUI/MsgDialog.cpp
+++ b/src/slic3r/GUI/MsgDialog.cpp
@@ -64,12 +64,9 @@ MsgDialog::MsgDialog(wxWindow *parent, const wxString &title, const wxString &he
SetSizerAndFit(topsizer);
}
-MsgDialog::~MsgDialog() {}
-
-
// ErrorDialog
-ErrorDialog::ErrorDialog(wxWindow *parent, const wxString &msg)
+ErrorDialog::ErrorDialog(wxWindow *parent, const wxString &msg, bool monospaced_font)
: MsgDialog(parent, wxString::Format(_(L("%s error")), SLIC3R_APP_NAME),
wxString::Format(_(L("%s has encountered an error")), SLIC3R_APP_NAME),
wxID_NONE)
@@ -78,19 +75,23 @@ ErrorDialog::ErrorDialog(wxWindow *parent, const wxString &msg)
// Text shown as HTML, so that mouse selection and Ctrl-V to copy will work.
wxHtmlWindow* html = new wxHtmlWindow(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxHW_SCROLLBAR_AUTO);
{
- html->SetMinSize(wxSize(40 * wxGetApp().em_unit(), -1));
+ html->SetMinSize(wxSize(40 * wxGetApp().em_unit(), monospaced_font ? 30 * wxGetApp().em_unit() : -1));
wxFont font = wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT);
+ wxFont monospace = wxGetApp().code_font();
wxColour text_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
wxColour bgr_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
auto text_clr_str = wxString::Format(wxT("#%02X%02X%02X"), text_clr.Red(), text_clr.Green(), text_clr.Blue());
auto bgr_clr_str = wxString::Format(wxT("#%02X%02X%02X"), bgr_clr.Red(), bgr_clr.Green(), bgr_clr.Blue());
const int font_size = font.GetPointSize()-1;
int size[] = {font_size, font_size, font_size, font_size, font_size, font_size, font_size};
- html->SetFonts(font.GetFaceName(), font.GetFaceName(), size);
+ html->SetFonts(font.GetFaceName(), monospace.GetFaceName(), size);
html->SetBorders(2);
std::string msg_escaped = xml_escape(msg.ToUTF8().data());
boost::replace_all(msg_escaped, "\r\n", "<br>");
boost::replace_all(msg_escaped, "\n", "<br>");
+ if (monospaced_font)
+ // Code formatting will be preserved. This is useful for reporting errors from the placeholder parser.
+ msg_escaped = std::string("<pre><code>") + msg_escaped + "</code></pre>";
html->SetPage("<html><body bgcolor=\"" + bgr_clr_str + "\"><font color=\"" + text_clr_str + "\">" + wxString::FromUTF8(msg_escaped.data()) + "</font></body></html>");
content_sizer->Add(html, 1, wxEXPAND);
}
@@ -99,15 +100,12 @@ ErrorDialog::ErrorDialog(wxWindow *parent, const wxString &msg)
btn_ok->SetFocus();
btn_sizer->Add(btn_ok, 0, wxRIGHT, HORIZ_SPACING);
- logo->SetBitmap(create_scaled_bitmap("PrusaSlicer_192px_grayscale.png", this, 192));
+ // Use a small bitmap with monospaced font, as the error text will not be wrapped.
+ logo->SetBitmap(create_scaled_bitmap("PrusaSlicer_192px_grayscale.png", this, monospaced_font ? 48 : 192));
SetMaxSize(wxSize(-1, CONTENT_MAX_HEIGHT*wxGetApp().em_unit()));
Fit();
}
-ErrorDialog::~ErrorDialog() {}
-
-
-
}
}
diff --git a/src/slic3r/GUI/MsgDialog.hpp b/src/slic3r/GUI/MsgDialog.hpp
index 5a4929849..70032089b 100644
--- a/src/slic3r/GUI/MsgDialog.hpp
+++ b/src/slic3r/GUI/MsgDialog.hpp
@@ -25,7 +25,7 @@ struct MsgDialog : wxDialog
MsgDialog(const MsgDialog &) = delete;
MsgDialog &operator=(MsgDialog &&) = delete;
MsgDialog &operator=(const MsgDialog &) = delete;
- virtual ~MsgDialog();
+ virtual ~MsgDialog() = default;
// TODO: refactor with CreateStdDialogButtonSizer usage
@@ -52,12 +52,14 @@ protected:
class ErrorDialog : public MsgDialog
{
public:
- ErrorDialog(wxWindow *parent, const wxString &msg);
+ // If monospaced_font is true, the error message is displayed using html <code><pre></pre></code> tags,
+ // so that the code formatting will be preserved. This is useful for reporting errors from the placeholder parser.
+ ErrorDialog(wxWindow *parent, const wxString &msg, bool courier_font);
ErrorDialog(ErrorDialog &&) = delete;
ErrorDialog(const ErrorDialog &) = delete;
ErrorDialog &operator=(ErrorDialog &&) = delete;
ErrorDialog &operator=(const ErrorDialog &) = delete;
- virtual ~ErrorDialog();
+ virtual ~ErrorDialog() = default;
private:
wxString msg;
diff --git a/src/slic3r/GUI/NotificationManager.cpp b/src/slic3r/GUI/NotificationManager.cpp
new file mode 100644
index 000000000..98cbf1e55
--- /dev/null
+++ b/src/slic3r/GUI/NotificationManager.cpp
@@ -0,0 +1,1512 @@
+#include "NotificationManager.hpp"
+
+#include "GUI_App.hpp"
+#include "GUI.hpp"
+#include "Plater.hpp"
+#include "GLCanvas3D.hpp"
+#include "ImGuiWrapper.hpp"
+
+#include "wxExtensions.hpp"
+
+#include <boost/algorithm/string.hpp>
+#include <boost/log/trivial.hpp>
+#include <boost/bind/placeholders.hpp>
+
+#include <iostream>
+
+#include <wx/glcanvas.h>
+
+static constexpr float GAP_WIDTH = 10.0f;
+static constexpr float SPACE_RIGHT_PANEL = 10.0f;
+#if ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+static constexpr float FADING_OUT_DURATION = 2.0f;
+// Time in Miliseconds after next render when fading out is requested
+static constexpr int FADING_OUT_TIMEOUT = 100;
+// If timeout is changed to higher than 1 second, substract_time call should be revorked
+//static constexpr int MAX_TIMEOUT_MILISECONDS = 1000;
+//static constexpr int MAX_TIMEOUT_SECONDS = 1;
+#endif // ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+
+namespace Slic3r {
+namespace GUI {
+
+wxDEFINE_EVENT(EVT_EJECT_DRIVE_NOTIFICAION_CLICKED, EjectDriveNotificationClickedEvent);
+wxDEFINE_EVENT(EVT_EXPORT_GCODE_NOTIFICAION_CLICKED, ExportGcodeNotificationClickedEvent);
+wxDEFINE_EVENT(EVT_PRESET_UPDATE_AVAILABLE_CLICKED, PresetUpdateAvailableClickedEvent);
+
+namespace Notifications_Internal{
+ ImFont* add_default_font(float pixel_size)
+ {
+ ImGuiIO& io = ImGui::GetIO();
+ ImFontConfig config;
+ config.SizePixels = pixel_size;
+ config.OversampleH = config.OversampleV = 1;
+ config.PixelSnapH = true;
+ ImFont* font = io.Fonts->AddFontDefault(&config);
+ return font;
+ }
+
+ static inline void push_style_color(ImGuiCol idx, const ImVec4& col, bool fading_out, float current_fade_opacity)
+ {
+ if (fading_out)
+ ImGui::PushStyleColor(idx, ImVec4(col.x, col.y, col.z, col.w * current_fade_opacity));
+ 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<wchar_t**>(argv), wxEXEC_ASYNC, nullptr);
+#elif __APPLE__
+ const char* argv[] = { "open", path.data(), nullptr };
+ ::wxExecute(const_cast<char**>(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<char**>(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<char**>(argv), wxEXEC_ASYNC, nullptr, nullptr);
+ }
+#endif
+ }
+}
+
+#if 1
+// Reuse ImGUI Windows.
+int NotificationManager::NotificationIDProvider::allocate_id()
+{
+ int id;
+ if (m_released_ids.empty())
+ id = ++m_next_id;
+ else {
+ id = m_released_ids.back();
+ m_released_ids.pop_back();
+ }
+ return id;
+}
+void NotificationManager::NotificationIDProvider::release_id(int id)
+{
+ m_released_ids.push_back(id);
+}
+#else
+// Don't reuse ImGUI Windows, allocate a new ID every time.
+int NotificationManager::NotificationIDProvider::allocate_id() { return ++ m_next_id; }
+void NotificationManager::NotificationIDProvider::release_id(int) {}
+#endif
+
+//------PopNotification--------
+NotificationManager::PopNotification::PopNotification(const NotificationData &n, NotificationIDProvider &id_provider, wxEvtHandler* evt_handler) :
+ m_data (n)
+ , m_id_provider (id_provider)
+ , m_remaining_time (n.duration)
+ , m_last_remaining_time (n.duration)
+ , m_counting_down (n.duration != 0)
+ , m_text1 (n.text1)
+ , m_hypertext (n.hypertext)
+ , m_text2 (n.text2)
+ , m_evt_handler (evt_handler)
+ , m_notification_start (GLCanvas3D::timestamp_now())
+{
+ //init();
+}
+#if ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+void NotificationManager::PopNotification::render(GLCanvas3D& canvas, float initial_y, bool move_from_overlay, float overlay_width)
+{
+ if (!m_initialized) {
+ init();
+ }
+
+ if (m_hidden) {
+ m_top_y = initial_y - GAP_WIDTH;
+ return;
+ }
+
+ if (m_fading_out)
+ m_last_render_fading = GLCanvas3D::timestamp_now();
+
+ Size cnv_size = canvas.get_canvas_size();
+ ImGuiWrapper& imgui = *wxGetApp().imgui();
+ ImVec2 mouse_pos = ImGui::GetMousePos();
+ float right_gap = SPACE_RIGHT_PANEL + (move_from_overlay ? overlay_width + m_line_height * 5 : 0);
+
+ if (m_line_height != ImGui::CalcTextSize("A").y)
+ init();
+
+ set_next_window_size(imgui);
+
+ // top y of window
+ m_top_y = initial_y + m_window_height;
+
+ ImVec2 win_pos(1.0f * (float)cnv_size.get_width() - right_gap, 1.0f * (float)cnv_size.get_height() - m_top_y);
+ imgui.set_next_window_pos(win_pos.x, win_pos.y, ImGuiCond_Always, 1.0f, 0.0f);
+ imgui.set_next_window_size(m_window_width, m_window_height, ImGuiCond_Always);
+
+ // find if hovered
+ m_hovered = false;
+ if (mouse_pos.x < win_pos.x && mouse_pos.x > win_pos.x - m_window_width && mouse_pos.y > win_pos.y && mouse_pos.y < win_pos.y + m_window_height) {
+ ImGui::SetNextWindowFocus();
+ m_hovered = true;
+ }
+
+ // color change based on fading out
+ bool fading_pop = false;
+ if (m_fading_out) {
+ Notifications_Internal::push_style_color(ImGuiCol_WindowBg, ImGui::GetStyleColorVec4(ImGuiCol_WindowBg), m_fading_out, m_current_fade_opacity);
+ Notifications_Internal::push_style_color(ImGuiCol_Text, ImGui::GetStyleColorVec4(ImGuiCol_Text), m_fading_out, m_current_fade_opacity);
+ fading_pop = true;
+ }
+
+ // background color
+ if (m_is_gray) {
+ ImVec4 backcolor(0.7f, 0.7f, 0.7f, 0.5f);
+ Notifications_Internal::push_style_color(ImGuiCol_WindowBg, backcolor, m_fading_out, m_current_fade_opacity);
+ }
+ else if (m_data.level == NotificationLevel::ErrorNotification) {
+ ImVec4 backcolor = ImGui::GetStyleColorVec4(ImGuiCol_WindowBg);
+ backcolor.x += 0.3f;
+ Notifications_Internal::push_style_color(ImGuiCol_WindowBg, backcolor, m_fading_out, m_current_fade_opacity);
+ }
+ else if (m_data.level == NotificationLevel::WarningNotification) {
+ ImVec4 backcolor = ImGui::GetStyleColorVec4(ImGuiCol_WindowBg);
+ backcolor.x += 0.3f;
+ backcolor.y += 0.15f;
+ Notifications_Internal::push_style_color(ImGuiCol_WindowBg, backcolor, m_fading_out, m_current_fade_opacity);
+ }
+
+ // name of window - probably indentifies window and is shown so last_end add whitespaces according to id
+ if (m_id == 0)
+ m_id = m_id_provider.allocate_id();
+ std::string name = "!!Ntfctn" + std::to_string(m_id);
+ if (imgui.begin(name, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar)) {
+ ImVec2 win_size = ImGui::GetWindowSize();
+
+ //FIXME: dont forget to us this for texts
+ //GUI::format(_utf8(L()));
+
+ /*
+ //countdown numbers
+ ImGui::SetCursorPosX(15);
+ ImGui::SetCursorPosY(15);
+ imgui.text(std::to_string(m_remaining_time).c_str());
+ */
+
+ 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);
+ }
+ imgui.end();
+
+ if (m_is_gray || m_data.level == NotificationLevel::ErrorNotification || m_data.level == NotificationLevel::WarningNotification)
+ ImGui::PopStyleColor();
+
+ if (fading_pop)
+ ImGui::PopStyleColor(2);
+}
+#else
+NotificationManager::PopNotification::RenderResult NotificationManager::PopNotification::render(GLCanvas3D& canvas, const float& initial_y, bool move_from_overlay, float overlay_width)
+{
+ if (!m_initialized) {
+ init();
+ }
+ if (m_finished)
+ return RenderResult::Finished;
+ if (m_close_pending) {
+ // request of extra frame will be done in caller function by ret val ClosePending
+ m_finished = true;
+ return RenderResult::ClosePending;
+ }
+ if (m_hidden) {
+ m_top_y = initial_y - GAP_WIDTH;
+ return RenderResult::Static;
+ }
+ RenderResult ret_val = m_counting_down ? RenderResult::Countdown : RenderResult::Static;
+ Size cnv_size = canvas.get_canvas_size();
+ ImGuiWrapper& imgui = *wxGetApp().imgui();
+ bool shown = true;
+ ImVec2 mouse_pos = ImGui::GetMousePos();
+ float right_gap = SPACE_RIGHT_PANEL + (move_from_overlay ? overlay_width + m_line_height * 5 : 0);
+
+ if (m_line_height != ImGui::CalcTextSize("A").y)
+ init();
+
+ set_next_window_size(imgui);
+
+ //top y of window
+ m_top_y = initial_y + m_window_height;
+ //top right position
+
+ ImVec2 win_pos(1.0f * (float)cnv_size.get_width() - right_gap, 1.0f * (float)cnv_size.get_height() - m_top_y);
+ imgui.set_next_window_pos(win_pos.x, win_pos.y, ImGuiCond_Always, 1.0f, 0.0f);
+ imgui.set_next_window_size(m_window_width, m_window_height, ImGuiCond_Always);
+
+ //find if hovered
+ if (mouse_pos.x < win_pos.x && mouse_pos.x > win_pos.x - m_window_width && mouse_pos.y > win_pos.y&& mouse_pos.y < win_pos.y + m_window_height)
+ {
+ ImGui::SetNextWindowFocus();
+ ret_val = RenderResult::Hovered;
+ //reset fading
+ m_fading_out = false;
+ m_current_fade_opacity = 1.f;
+ m_remaining_time = m_data.duration;
+ m_countdown_frame = 0;
+ }
+
+ if (m_counting_down && m_remaining_time < 0)
+ m_close_pending = true;
+
+ if (m_close_pending) {
+ // request of extra frame will be done in caller function by ret val ClosePending
+ m_finished = true;
+ return RenderResult::ClosePending;
+ }
+
+ // color change based on fading out
+ bool fading_pop = false;
+ if (m_fading_out) {
+ if (!m_paused)
+ m_current_fade_opacity -= 1.f / ((m_fading_time + 1.f) * 60.f);
+ Notifications_Internal::push_style_color(ImGuiCol_WindowBg, ImGui::GetStyleColorVec4(ImGuiCol_WindowBg), m_fading_out, m_current_fade_opacity);
+ Notifications_Internal::push_style_color(ImGuiCol_Text, ImGui::GetStyleColorVec4(ImGuiCol_Text), m_fading_out, m_current_fade_opacity);
+ fading_pop = true;
+ }
+ // background color
+ if (m_is_gray) {
+ ImVec4 backcolor(0.7f, 0.7f, 0.7f, 0.5f);
+ Notifications_Internal::push_style_color(ImGuiCol_WindowBg, backcolor, m_fading_out, m_current_fade_opacity);
+ } else if (m_data.level == NotificationLevel::ErrorNotification) {
+ ImVec4 backcolor = ImGui::GetStyleColorVec4(ImGuiCol_WindowBg);
+ backcolor.x += 0.3f;
+ Notifications_Internal::push_style_color(ImGuiCol_WindowBg, backcolor, m_fading_out, m_current_fade_opacity);
+ } else if (m_data.level == NotificationLevel::WarningNotification) {
+ ImVec4 backcolor = ImGui::GetStyleColorVec4(ImGuiCol_WindowBg);
+ backcolor.x += 0.3f;
+ backcolor.y += 0.15f;
+ Notifications_Internal::push_style_color(ImGuiCol_WindowBg, backcolor, m_fading_out, m_current_fade_opacity);
+ }
+
+ //name of window - probably indentifies window and is shown so last_end add whitespaces according to id
+ if (! m_id)
+ m_id = m_id_provider.allocate_id();
+ std::string name;
+ {
+ // Create a unique ImGUI window name. The name may be recycled using a name of an already released notification.
+ char buf[32];
+ sprintf(buf, "!!Ntfctn%d", m_id);
+ name = buf;
+ }
+ if (imgui.begin(name, &shown, ImGuiWindowFlags_NoCollapse | ImGuiWindowFlags_NoTitleBar | ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoResize | ImGuiWindowFlags_NoScrollbar )) {
+ if (shown) {
+
+ ImVec2 win_size = ImGui::GetWindowSize();
+
+
+ //FIXME: dont forget to us this for texts
+ //GUI::format(_utf8(L()));
+
+ /*
+ //countdown numbers
+ ImGui::SetCursorPosX(15);
+ ImGui::SetCursorPosY(15);
+ imgui.text(std::to_string(m_remaining_time).c_str());
+ */
+ if(m_counting_down)
+ render_countdown(imgui, win_size.x, win_size.y, win_pos.x, win_pos.y);
+ 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 {
+ // the user clicked on the [X] button ( ImGuiWindowFlags_NoTitleBar means theres no [X] button)
+ m_close_pending = true;
+ canvas.set_as_dirty();
+ }
+ }
+ imgui.end();
+
+ if (fading_pop) {
+ ImGui::PopStyleColor();
+ ImGui::PopStyleColor();
+ }
+ if (m_is_gray)
+ ImGui::PopStyleColor();
+ else if (m_data.level == NotificationLevel::ErrorNotification)
+ ImGui::PopStyleColor();
+ else if (m_data.level == NotificationLevel::WarningNotification)
+ ImGui::PopStyleColor();
+ return ret_val;
+}
+#endif // ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+void NotificationManager::PopNotification::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;
+ }
+ 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();
+ while (last_end < text.length() - 1)
+ {
+ int next_hard_end = text.find_first_of('\n', last_end);
+ if (next_hard_end > 0 && ImGui::CalcTextSize(text.substr(last_end, next_hard_end - last_end).c_str()).x < m_window_width - m_window_width_offset) {
+ //next line is ended by '/n'
+ m_endlines.push_back(next_hard_end);
+ last_end = next_hard_end + 1;
+ } else {
+ // find next suitable endline
+ if (ImGui::CalcTextSize(text.substr(last_end).c_str()).x >= m_window_width - m_window_width_offset) {
+ // more than one line till end
+ int next_space = text.find_first_of(' ', last_end);
+ if (next_space > 0) {
+ int next_space_candidate = text.find_first_of(' ', next_space + 1);
+ while (next_space_candidate > 0 && ImGui::CalcTextSize(text.substr(last_end, next_space_candidate - last_end).c_str()).x < m_window_width - m_window_width_offset) {
+ next_space = next_space_candidate;
+ next_space_candidate = text.find_first_of(' ', next_space + 1);
+ }
+ // 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 {
+ m_endlines.push_back(text.length());
+ last_end = text.length();
+ }
+
+ }
+ m_lines_count++;
+ }
+ if (m_lines_count == 3)
+ m_multiline = true;
+ m_initialized = true;
+}
+void NotificationManager::PopNotification::set_next_window_size(ImGuiWrapper& imgui)
+{
+ m_window_height = m_multiline ?
+ m_lines_count * m_line_height :
+ 2 * m_line_height;
+ m_window_height += 1 * m_line_height; // top and bottom
+}
+
+void NotificationManager::PopNotification::render_text(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y)
+{
+ ImVec2 win_size(win_size_x, win_size_y);
+ ImVec2 win_pos(win_pos_x, win_pos_y);
+ float x_offset = m_left_indentation;
+ std::string fulltext = m_text1 + m_hypertext; //+ m_text2;
+ ImVec2 text_size = ImGui::CalcTextSize(fulltext.c_str());
+ // text posistions are calculated by lines count
+ // large texts has "more" button or are displayed whole
+ // smaller texts are divided as one liners and two liners
+ if (m_lines_count > 2) {
+ if (m_multiline) {
+
+ 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 (!m_hypertext.empty())
+ {
+ render_hypertext(imgui, x_offset + ImGui::CalcTextSize(m_text1.substr(m_endlines[m_lines_count - 2] + 1, m_endlines[m_lines_count - 1] - m_endlines[m_lines_count - 2] - 1).c_str()).x, starting_y + (m_lines_count - 1) * shift_y, m_hypertext);
+ }
+
+
+ } else {
+ // line1
+ ImGui::SetCursorPosX(x_offset);
+ 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] + (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);
+ line += "..";
+ }else
+ line += " ";
+ ImGui::SetCursorPosX(x_offset);
+ ImGui::SetCursorPosY(win_size.y / 2 + win_size.y / 6 - m_line_height / 2);
+ imgui.text(line.c_str());
+ // "More" hypertext
+ render_hypertext(imgui, x_offset + ImGui::CalcTextSize(line.c_str()).x, win_size.y / 2 + win_size.y / 6 - m_line_height / 2, _u8L("More"), true);
+ }
+ } else {
+ //text 1
+ float cursor_y = win_size.y / 2 - text_size.y / 2;
+ float cursor_x = x_offset;
+ if(m_lines_count > 1) {
+ // line1
+ ImGui::SetCursorPosX(x_offset);
+ 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] + (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);
+ imgui.text(line.c_str());
+ cursor_x = x_offset + ImGui::CalcTextSize(line.c_str()).x;
+ } else {
+ ImGui::SetCursorPosX(x_offset);
+ ImGui::SetCursorPosY(cursor_y);
+ imgui.text(m_text1.c_str());
+ cursor_x = x_offset + ImGui::CalcTextSize(m_text1.c_str()).x;
+ }
+ //hyperlink text
+ if (!m_hypertext.empty())
+ {
+ render_hypertext(imgui, cursor_x + 4, cursor_y, m_hypertext);
+ }
+
+ //notification text 2
+ //text 2 is suposed to be after the hyperlink - currently it is not used
+ /*
+ if (!m_text2.empty())
+ {
+ ImVec2 part_size = ImGui::CalcTextSize(m_hypertext.c_str());
+ ImGui::SetCursorPosX(win_size.x / 2 + text_size.x / 2 - part_size.x + 8 - x_offset);
+ ImGui::SetCursorPosY(cursor_y);
+ imgui.text(m_text2.c_str());
+ }
+ */
+ }
+}
+
+void NotificationManager::PopNotification::render_hypertext(ImGuiWrapper& imgui, const float text_x, const float text_y, const std::string text, bool more)
+{
+ //invisible button
+ ImVec2 part_size = ImGui::CalcTextSize(text.c_str());
+ ImGui::SetCursorPosX(text_x -4);
+ ImGui::SetCursorPosY(text_y -5);
+ ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(.0f, .0f, .0f, .0f));
+ ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(.0f, .0f, .0f, .0f));
+ ImGui::PushStyleColor(ImGuiCol_ButtonActive, ImVec4(.0f, .0f, .0f, .0f));
+ if (imgui.button(" ", part_size.x + 6, part_size.y + 10))
+ {
+ if (more)
+ {
+ m_multiline = true;
+ set_next_window_size(imgui);
+ }
+ else {
+ m_close_pending = on_text_click();
+ }
+ }
+ ImGui::PopStyleColor();
+ ImGui::PopStyleColor();
+ ImGui::PopStyleColor();
+
+ //hover color
+ ImVec4 orange_color = ImVec4(.99f, .313f, .0f, 1.0f);//ImGui::GetStyleColorVec4(ImGuiCol_Button);
+ if (ImGui::IsItemHovered(ImGuiHoveredFlags_RectOnly))
+ orange_color.y += 0.2f;
+
+ //text
+ Notifications_Internal::push_style_color(ImGuiCol_Text, orange_color, m_fading_out, m_current_fade_opacity);
+ ImGui::SetCursorPosX(text_x);
+ ImGui::SetCursorPosY(text_y);
+ imgui.text(text.c_str());
+ ImGui::PopStyleColor();
+
+ //underline
+ ImVec2 lineEnd = ImGui::GetItemRectMax();
+ lineEnd.y -= 2;
+ ImVec2 lineStart = lineEnd;
+ lineStart.x = ImGui::GetItemRectMin().x;
+ ImGui::GetWindowDrawList()->AddLine(lineStart, lineEnd, IM_COL32((int)(orange_color.x * 255), (int)(orange_color.y * 255), (int)(orange_color.z * 255), (int)(orange_color.w * 255.f * (m_fading_out ? m_current_fade_opacity : 1.f))));
+
+}
+
+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);
+ 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));
+
+
+ //button - if part if treggered
+ std::string button_text;
+ button_text = ImGui::CloseNotifButton;
+
+ 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_minimize_b_visible ? 2 * m_line_height : 0)),
+ true))
+ {
+ button_text = ImGui::CloseNotifHoverButton;
+ }
+ 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 * 2.75f);
+ ImGui::SetCursorPosY(win_size.y / 2 - button_size.y);
+ if (imgui.button(button_text.c_str(), button_size.x, button_size.y))
+ {
+ m_close_pending = true;
+ }
+
+ //invisible large button
+ ImGui::SetCursorPosX(win_size.x - m_line_height * 2.35f);
+ ImGui::SetCursorPosY(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;
+ }
+ ImGui::PopStyleColor();
+ ImGui::PopStyleColor();
+ ImGui::PopStyleColor();
+ ImGui::PopStyleColor();
+ ImGui::PopStyleColor();
+}
+#if !ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+void NotificationManager::PopNotification::render_countdown(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);
+
+ //countdown dots
+ std::string dot_text;
+ dot_text = m_remaining_time <= (float)m_data.duration / 4 * 3 ? ImGui::TimerDotEmptyMarker : ImGui::TimerDotMarker;
+ ImGui::SetCursorPosX(win_size.x - m_line_height);
+ //ImGui::SetCursorPosY(win_size.y / 2 - 24);
+ ImGui::SetCursorPosY(0);
+ imgui.text(dot_text.c_str());
+
+ dot_text = m_remaining_time < m_data.duration / 2 ? ImGui::TimerDotEmptyMarker : ImGui::TimerDotMarker;
+ ImGui::SetCursorPosX(win_size.x - m_line_height);
+ //ImGui::SetCursorPosY(win_size.y / 2 - 9);
+ ImGui::SetCursorPosY(win_size.y / 2 - m_line_height / 2);
+ imgui.text(dot_text.c_str());
+
+ dot_text = m_remaining_time <= m_data.duration / 4 ? ImGui::TimerDotEmptyMarker : ImGui::TimerDotMarker;
+ ImGui::SetCursorPosX(win_size.x - m_line_height);
+ //ImGui::SetCursorPosY(win_size.y / 2 + 6);
+ ImGui::SetCursorPosY(win_size.y - m_line_height);
+ imgui.text(dot_text.c_str());
+ */
+ if (!m_fading_out && m_remaining_time <= m_data.duration / 4) {
+ m_fading_out = true;
+ m_fading_time = m_remaining_time;
+ }
+
+ if (m_last_remaining_time != m_remaining_time) {
+ m_last_remaining_time = m_remaining_time;
+ m_countdown_frame = 0;
+ }
+ /*
+ //countdown line
+ ImVec4 orange_color = ImGui::GetStyleColorVec4(ImGuiCol_Button);
+ float invisible_length = ((float)(m_data.duration - m_remaining_time) / (float)m_data.duration * win_size_x);
+ invisible_length -= win_size_x / ((float)m_data.duration * 60.f) * (60 - m_countdown_frame);
+ ImVec2 lineEnd = ImVec2(win_pos_x - invisible_length, win_pos_y + win_size_y - 5);
+ ImVec2 lineStart = ImVec2(win_pos_x - win_size_x, win_pos_y + win_size_y - 5);
+ ImGui::GetWindowDrawList()->AddLine(lineStart, lineEnd, IM_COL32((int)(orange_color.x * 255), (int)(orange_color.y * 255), (int)(orange_color.z * 255), (int)(orange_color.picture_width * 255.f * (m_fading_out ? m_current_fade_opacity : 1.f))), 2.f);
+ if (!m_paused)
+ m_countdown_frame++;
+ */
+}
+#endif // !ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+void NotificationManager::PopNotification::render_left_sign(ImGuiWrapper& imgui)
+{
+ if (m_data.level == NotificationLevel::ErrorNotification || m_data.level == NotificationLevel::WarningNotification) {
+ std::string text;
+ text = (m_data.level == NotificationLevel::ErrorNotification ? ImGui::ErrorMarker : ImGui::WarningMarker);
+ ImGui::SetCursorPosX(m_line_height / 3);
+ ImGui::SetCursorPosY(m_window_height / 2 - m_line_height);
+ imgui.text(text.c_str());
+ }
+}
+void NotificationManager::PopNotification::render_minimize_button(ImGuiWrapper& imgui, const float win_pos_x, const float win_pos_y)
+{
+ ImGui::PushStyleColor(ImGuiCol_Button, ImVec4(.0f, .0f, .0f, .0f));
+ ImGui::PushStyleColor(ImGuiCol_ButtonHovered, ImVec4(.0f, .0f, .0f, .0f));
+ Notifications_Internal::push_style_color(ImGuiCol_ButtonActive, ImGui::GetStyleColorVec4(ImGuiCol_WindowBg), m_fading_out, m_current_fade_opacity);
+ 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);
+
+
+ //button - if part if treggered
+ std::string button_text;
+ button_text = ImGui::MinimalizeButton;
+ if (ImGui::IsMouseHoveringRect(ImVec2(win_pos_x - m_window_width / 10.f, win_pos_y + m_window_height - 2 * m_line_height + 1),
+ ImVec2(win_pos_x, win_pos_y + m_window_height),
+ true))
+ {
+ button_text = ImGui::MinimalizeHoverButton;
+ }
+ 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(m_window_width - m_line_height * 1.8f);
+ ImGui::SetCursorPosY(m_window_height - button_size.y - 5);
+ if (imgui.button(button_text.c_str(), button_size.x, button_size.y))
+ {
+ m_multiline = false;
+ }
+
+ ImGui::PopStyleColor();
+ ImGui::PopStyleColor();
+ ImGui::PopStyleColor();
+ ImGui::PopStyleColor();
+ ImGui::PopStyleColor();
+ m_minimize_b_visible = true;
+}
+bool NotificationManager::PopNotification::on_text_click()
+{
+ if(m_data.callback != nullptr)
+ return m_data.callback(m_evt_handler);
+ return false;
+}
+void NotificationManager::PopNotification::update(const NotificationData& n)
+{
+ m_text1 = n.text1;
+ m_hypertext = n.hypertext;
+ m_text2 = n.text2;
+ init();
+}
+bool NotificationManager::PopNotification::compare_text(const std::string& text)
+{
+ std::string t1(m_text1);
+ std::string t2(text);
+ t1.erase(std::remove_if(t1.begin(), t1.end(), ::isspace), t1.end());
+ t2.erase(std::remove_if(t2.begin(), t2.end(), ::isspace), t2.end());
+ if (t1.compare(t2) == 0)
+ return true;
+ return false;
+}
+
+#if ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+void NotificationManager::PopNotification::update_state()
+{
+ if (!m_initialized)
+ init();
+
+ m_next_render = std::numeric_limits<int64_t>::max();
+
+ if (m_hidden) {
+ m_state = EState::Hidden;
+ return;
+ }
+
+ int64_t now = GLCanvas3D::timestamp_now();
+
+ if (m_hovered) {
+ // reset fading
+ m_fading_out = false;
+ m_current_fade_opacity = 1.0f;
+ m_remaining_time = m_data.duration;
+ m_notification_start = now;
+ }
+
+
+
+ if (m_counting_down) {
+ int64_t up_time = now - m_notification_start;
+
+ if (m_fading_out && m_current_fade_opacity <= 0.0f)
+ m_finished = true;
+ else if (!m_fading_out && /*m_remaining_time <=0*/up_time >= m_data.duration * 1000) {
+ m_fading_out = true;
+ m_fading_start = now;
+ m_last_render_fading = now;
+ } else if (!m_fading_out) {
+ m_next_render = m_data.duration * 1000 - up_time;//std::min<int64_t>(/*m_data.duration * 1000 - up_time*/m_remaining_time * 1000, MAX_TIMEOUT_MILISECONDS);
+ }
+
+ }
+
+ if (m_finished) {
+ m_state = EState::Finished;
+ m_next_render = 0;
+ return;
+ }
+ if (m_close_pending) {
+ m_finished = true;
+ m_state = EState::ClosePending;
+ m_next_render = 0;
+ return;
+ }
+ if (m_fading_out) {
+ if (!m_paused) {
+ m_state = EState::FadingOutStatic;
+ int64_t curr_time = now - m_fading_start;
+ int64_t no_render_time = now - m_last_render_fading;
+ m_current_fade_opacity = std::clamp(1.0f - 0.001f * static_cast<float>(curr_time) / FADING_OUT_DURATION, 0.0f, 1.0f);
+ auto next_render = FADING_OUT_TIMEOUT - no_render_time;
+ if (next_render <= 0) {
+ //m_last_render_fading = GLCanvas3D::timestamp_now();
+ m_state = EState::FadingOutRender;
+ m_next_render = 0;
+ } else
+ m_next_render = next_render;
+ }
+ }
+}
+#endif // ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+
+NotificationManager::SlicingCompleteLargeNotification::SlicingCompleteLargeNotification(const NotificationData& n, NotificationIDProvider& id_provider, wxEvtHandler* evt_handler, bool large) :
+ NotificationManager::PopNotification(n, id_provider, evt_handler)
+{
+ set_large(large);
+}
+void NotificationManager::SlicingCompleteLargeNotification::render_text(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y)
+{
+ if (!m_is_large)
+ PopNotification::render_text(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y);
+ else {
+ ImVec2 win_size(win_size_x, win_size_y);
+ ImVec2 win_pos(win_pos_x, win_pos_y);
+
+ ImVec2 text1_size = ImGui::CalcTextSize(m_text1.c_str());
+ float x_offset = m_left_indentation;
+ std::string fulltext = m_text1 + m_hypertext + m_text2;
+ ImVec2 text_size = ImGui::CalcTextSize(fulltext.c_str());
+ float cursor_y = win_size.y / 2 - text_size.y / 2;
+ if (m_has_print_info) {
+ x_offset = 20;
+ cursor_y = win_size.y / 2 + win_size.y / 6 - text_size.y / 2;
+ ImGui::SetCursorPosX(x_offset);
+ ImGui::SetCursorPosY(cursor_y);
+ imgui.text(m_print_info.c_str());
+ cursor_y = win_size.y / 2 - win_size.y / 6 - text_size.y / 2;
+ }
+ ImGui::SetCursorPosX(x_offset);
+ ImGui::SetCursorPosY(cursor_y);
+ imgui.text(m_text1.c_str());
+
+ render_hypertext(imgui, x_offset + text1_size.x + 4, cursor_y, m_hypertext);
+ }
+}
+void NotificationManager::SlicingCompleteLargeNotification::set_print_info(const std::string &info)
+{
+ m_print_info = info;
+ m_has_print_info = true;
+ if (m_is_large)
+ m_lines_count = 2;
+}
+void NotificationManager::SlicingCompleteLargeNotification::set_large(bool l)
+{
+ m_is_large = l;
+ m_counting_down = !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 ? 6.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::EjectButton;
+
+ if (ImGui::IsMouseHoveringRect(ImVec2(win_pos.x - m_line_height * 5.f, win_pos.y),
+ ImVec2(win_pos.x - m_line_height * 2.5f, win_pos.y + win_size.y),
+ true))
+ {
+ button_text = ImGui::EjectHoverButton;
+ // 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") + " " + GUI::shortkey_ctrl_prefix() + "T");
+ 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 * 5.0f);
+ ImGui::SetCursorPosY(win_size.y / 2 - button_size.y);
+ 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;
+}
+//------ProgressBar----------------
+void NotificationManager::ProgressBarNotification::init()
+{
+ PopNotification::init();
+ m_lines_count++;
+ m_endlines.push_back(m_endlines.back());
+}
+void NotificationManager::ProgressBarNotification::render_text(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y)
+{
+ PopNotification::render_text(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y);
+ render_bar(imgui, win_size_x, win_size_y, win_pos_x, win_pos_y);
+}
+void NotificationManager::ProgressBarNotification::render_bar(ImGuiWrapper& imgui, const float win_size_x, const float win_size_y, const float win_pos_x, const float win_pos_y)
+{
+ float bar_y = win_size_y / 2 - win_size_y / 6 + m_line_height;
+ ImVec4 orange_color = ImVec4(.99f, .313f, .0f, 1.0f);
+ float invisible_length = 0;//((float)(m_data.duration - m_remaining_time) / (float)m_data.duration * win_size_x);
+ //invisible_length -= win_size_x / ((float)m_data.duration * 60.f) * (60 - m_countdown_frame);
+ ImVec2 lineEnd = ImVec2(win_pos_x - invisible_length - m_window_width_offset, win_pos_y + win_size_y/2 + m_line_height / 2);
+ ImVec2 lineStart = ImVec2(win_pos_x - win_size_x + m_left_indentation, win_pos_y + win_size_y/2 + m_line_height / 2);
+ ImGui::GetWindowDrawList()->AddLine(lineStart, lineEnd, IM_COL32((int)(orange_color.x * 255), (int)(orange_color.y * 255), (int)(orange_color.z * 255), (1.0f * 255.f)), m_line_height * 0.7f);
+ /*
+ //countdown line
+ ImVec4 orange_color = ImGui::GetStyleColorVec4(ImGuiCol_Button);
+ float invisible_length = ((float)(m_data.duration - m_remaining_time) / (float)m_data.duration * win_size_x);
+ invisible_length -= win_size_x / ((float)m_data.duration * 60.f) * (60 - m_countdown_frame);
+ ImVec2 lineEnd = ImVec2(win_pos_x - invisible_length, win_pos_y + win_size_y - 5);
+ ImVec2 lineStart = ImVec2(win_pos_x - win_size_x, win_pos_y + win_size_y - 5);
+ ImGui::GetWindowDrawList()->AddLine(lineStart, lineEnd, IM_COL32((int)(orange_color.x * 255), (int)(orange_color.y * 255), (int)(orange_color.z * 255), (int)(orange_color.picture_width * 255.f * (m_fading_out ? m_current_fade_opacity : 1.f))), 2.f);
+ if (!m_paused)
+ m_countdown_frame++;
+ */
+}
+//------NotificationManager--------
+NotificationManager::NotificationManager(wxEvtHandler* evt_handler) :
+ m_evt_handler(evt_handler)
+{
+}
+void NotificationManager::push_notification(const NotificationType type, int timestamp)
+{
+ auto it = std::find_if(basic_notifications.begin(), basic_notifications.end(),
+ boost::bind(&NotificationData::type, boost::placeholders::_1) == type);
+ assert(it != basic_notifications.end());
+ if (it != basic_notifications.end())
+ push_notification_data(*it, timestamp);
+}
+void NotificationManager::push_notification(const std::string& text, int timestamp)
+{
+ push_notification_data({ NotificationType::CustomNotification, NotificationLevel::RegularNotification, 10, text }, timestamp);
+}
+
+void NotificationManager::push_notification(NotificationType type,
+ NotificationLevel level,
+ const std::string& text,
+ const std::string& hypertext,
+ std::function<bool(wxEvtHandler*)> callback,
+ int timestamp)
+{
+ int duration = 0;
+ switch (level) {
+ case NotificationLevel::RegularNotification: duration = 10; break;
+ case NotificationLevel::ErrorNotification: break;
+ case NotificationLevel::ImportantNotification: break;
+ default:
+ assert(false);
+ return;
+ }
+ push_notification_data({ type, level, duration, text, hypertext, callback }, timestamp);
+}
+void NotificationManager::push_slicing_error_notification(const std::string& text)
+{
+ set_all_slicing_errors_gray(false);
+ push_notification_data({ NotificationType::SlicingError, NotificationLevel::ErrorNotification, 0, _u8L("ERROR:") + "\n" + text }, 0);
+ close_notification_of_type(NotificationType::SlicingComplete);
+}
+void NotificationManager::push_slicing_warning_notification(const std::string& text, bool gray, ObjectID oid, int warning_step)
+{
+ NotificationData data { NotificationType::SlicingWarning, NotificationLevel::WarningNotification, 0, _u8L("WARNING:") + "\n" + text };
+
+ auto notification = std::make_unique<NotificationManager::SlicingWarningNotification>(data, m_id_provider, m_evt_handler);
+ notification->object_id = oid;
+ notification->warning_step = warning_step;
+ if (push_notification_data(std::move(notification), 0)) {
+ m_pop_notifications.back()->set_gray(gray);
+ }
+}
+void NotificationManager::push_plater_error_notification(const std::string& text)
+{
+ push_notification_data({ NotificationType::PlaterError, NotificationLevel::ErrorNotification, 0, _u8L("ERROR:") + "\n" + text }, 0);
+}
+void NotificationManager::push_plater_warning_notification(const std::string& text)
+{
+ push_notification_data({ NotificationType::PlaterWarning, NotificationLevel::WarningNotification, 0, _u8L("WARNING:") + "\n" + text }, 0);
+ // dissaper if in preview
+ set_in_preview(m_in_preview);
+}
+void NotificationManager::close_plater_error_notification(const std::string& text)
+{
+ for (std::unique_ptr<PopNotification> &notification : m_pop_notifications) {
+ if (notification->get_type() == NotificationType::PlaterError && notification->compare_text(_u8L("ERROR:") + "\n" + text)) {
+ notification->close();
+ }
+ }
+}
+void NotificationManager::close_plater_warning_notification(const std::string& text)
+{
+ for (std::unique_ptr<PopNotification> &notification : m_pop_notifications) {
+ if (notification->get_type() == NotificationType::PlaterWarning && notification->compare_text(_u8L("WARNING:") + "\n" + text)) {
+ notification->close();
+ }
+ }
+}
+void NotificationManager::set_all_slicing_errors_gray(bool g)
+{
+ for (std::unique_ptr<PopNotification> &notification : m_pop_notifications) {
+ if (notification->get_type() == NotificationType::SlicingError) {
+ notification->set_gray(g);
+ }
+ }
+}
+void NotificationManager::set_all_slicing_warnings_gray(bool g)
+{
+ for (std::unique_ptr<PopNotification> &notification : m_pop_notifications) {
+ if (notification->get_type() == NotificationType::SlicingWarning) {
+ notification->set_gray(g);
+ }
+ }
+}
+/*
+void NotificationManager::set_slicing_warning_gray(const std::string& text, bool g)
+{
+ for (std::unique_ptr<PopNotification> &notification : m_pop_notifications) {
+ if (notification->get_type() == NotificationType::SlicingWarning && notification->compare_text(text)) {
+ notification->set_gray(g);
+ }
+ }
+}
+*/
+void NotificationManager::close_slicing_errors_and_warnings()
+{
+ for (std::unique_ptr<PopNotification> &notification : m_pop_notifications) {
+ if (notification->get_type() == NotificationType::SlicingError || notification->get_type() == NotificationType::SlicingWarning) {
+ notification->close();
+ }
+ }
+}
+void NotificationManager::push_slicing_complete_notification(int timestamp, bool large)
+{
+ std::string hypertext;
+ int time = 10;
+ if (has_slicing_error_notification())
+ return;
+ if (large) {
+ hypertext = _u8L("Export G-Code.");
+ time = 0;
+ }
+ NotificationData data{ NotificationType::SlicingComplete, NotificationLevel::RegularNotification, time, _u8L("Slicing finished."), hypertext, [](wxEvtHandler* evnthndlr){
+ if (evnthndlr != nullptr) wxPostEvent(evnthndlr, ExportGcodeNotificationClickedEvent(EVT_EXPORT_GCODE_NOTIFICAION_CLICKED)); return true; } };
+ push_notification_data(std::make_unique<NotificationManager::SlicingCompleteLargeNotification>(data, m_id_provider, m_evt_handler, large), timestamp);
+}
+void NotificationManager::set_slicing_complete_print_time(const std::string &info)
+{
+ for (std::unique_ptr<PopNotification> &notification : m_pop_notifications) {
+ if (notification->get_type() == NotificationType::SlicingComplete) {
+ dynamic_cast<SlicingCompleteLargeNotification*>(notification.get())->set_print_info(info);
+ break;
+ }
+ }
+}
+void NotificationManager::set_slicing_complete_large(bool large)
+{
+ for (std::unique_ptr<PopNotification> &notification : m_pop_notifications) {
+ if (notification->get_type() == NotificationType::SlicingComplete) {
+ dynamic_cast<SlicingCompleteLargeNotification*>(notification.get())->set_large(large);
+ break;
+ }
+ }
+}
+void NotificationManager::close_notification_of_type(const NotificationType type)
+{
+ for (std::unique_ptr<PopNotification> &notification : m_pop_notifications) {
+ if (notification->get_type() == type) {
+ notification->close();
+ }
+ }
+}
+void NotificationManager::remove_slicing_warnings_of_released_objects(const std::vector<ObjectID>& living_oids)
+{
+ for (std::unique_ptr<PopNotification> &notification : m_pop_notifications)
+ if (notification->get_type() == NotificationType::SlicingWarning) {
+ if (! std::binary_search(living_oids.begin(), living_oids.end(),
+ static_cast<SlicingWarningNotification*>(notification.get())->object_id))
+ notification->close();
+ }
+}
+void NotificationManager::push_exporting_finished_notification(const std::string& path, const std::string& dir_path, bool on_removable)
+{
+ close_notification_of_type(NotificationType::ExportFinished);
+ NotificationData data{ NotificationType::ExportFinished, NotificationLevel::RegularNotification, on_removable ? 0 : 20, _u8L("Exporting finished.") + "\n" + path };
+ push_notification_data(std::make_unique<NotificationManager::ExportFinishedNotification>(data, m_id_provider, m_evt_handler, on_removable, path, dir_path), 0);
+}
+void NotificationManager::push_progress_bar_notification(const std::string& text, float percentage)
+{
+ NotificationData data{ NotificationType::ProgressBar, NotificationLevel::ProgressBarNotification, 0, text };
+ push_notification_data(std::make_unique<NotificationManager::ProgressBarNotification>(data, m_id_provider, m_evt_handler, 0), 0);
+}
+void NotificationManager::set_progress_bar_percentage(const std::string& text, float percentage)
+{
+ bool found = false;
+ for (std::unique_ptr<PopNotification>& notification : m_pop_notifications) {
+ if (notification->get_type() == NotificationType::ProgressBar && notification->compare_text(text)) {
+ dynamic_cast<ProgressBarNotification*>(notification.get())->set_percentage(percentage);
+ wxGetApp().plater()->get_current_canvas3D()->request_extra_frame();
+ found = true;
+ }
+ }
+ if (!found) {
+ push_progress_bar_notification(text, percentage);
+ }
+}
+bool NotificationManager::push_notification_data(const NotificationData& notification_data, int timestamp)
+{
+ return push_notification_data(std::make_unique<PopNotification>(notification_data, m_id_provider, m_evt_handler), timestamp);
+}
+bool NotificationManager::push_notification_data(std::unique_ptr<NotificationManager::PopNotification> notification, int timestamp)
+{
+/*
+#if ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+ m_requires_update = true;
+#endif // ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+*/
+ // if timestamped notif, push only new one
+ if (timestamp != 0) {
+ if (m_used_timestamps.find(timestamp) == m_used_timestamps.end()) {
+ m_used_timestamps.insert(timestamp);
+ } else {
+ return false;
+ }
+ }
+
+ GLCanvas3D& canvas = *wxGetApp().plater()->get_current_canvas3D();
+
+ if (this->activate_existing(notification.get())) {
+ m_pop_notifications.back()->update(notification->get_data());
+ canvas.request_extra_frame_delayed(33);
+ return false;
+ } else {
+ m_pop_notifications.emplace_back(std::move(notification));
+ canvas.request_extra_frame_delayed(33);
+ return true;
+ }
+}
+#if ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+void NotificationManager::render_notifications(float overlay_width)
+{
+
+ sort_notifications();
+
+ GLCanvas3D& canvas = *wxGetApp().plater()->get_current_canvas3D();
+ float last_y = 0.0f;
+
+ for (const auto& notification : m_pop_notifications) {
+ if (notification->get_state() != PopNotification::EState::Hidden) {
+ notification->render(canvas, last_y, m_move_from_overlay && !m_in_preview, overlay_width);
+ if (notification->get_state() != PopNotification::EState::Finished)
+ last_y = notification->get_top() + GAP_WIDTH;
+ }
+
+ }
+ update_notifications();
+}
+#else
+void NotificationManager::render_notifications(float overlay_width)
+{
+ float last_x = 0.0f;
+ float current_height = 0.0f;
+ bool request_next_frame = false;
+ bool render_main = false;
+ bool hovered = false;
+ sort_notifications();
+
+ GLCanvas3D& canvas = *wxGetApp().plater()->get_current_canvas3D();
+
+ // iterate thru notifications and render them / erase them
+ for (auto it = m_pop_notifications.begin(); it != m_pop_notifications.end();) {
+ if ((*it)->is_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 && !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());
+ render_main = true;
+ }
+ if (res == PopNotification::RenderResult::Countdown || res == PopNotification::RenderResult::ClosePending || res == PopNotification::RenderResult::Finished)
+ request_next_frame = true;
+ if (res == PopNotification::RenderResult::Hovered)
+ hovered = true;
+ ++it;
+ }
+ }
+ m_hovered = hovered;
+
+ //actualizate timers and request frame if needed
+ wxWindow* p = dynamic_cast<wxWindow*> (wxGetApp().plater());
+ while (p->GetParent())
+ p = p->GetParent();
+ wxTopLevelWindow* top_level_wnd = dynamic_cast<wxTopLevelWindow*>(p);
+ if (!top_level_wnd->IsActive())
+ return;
+
+ {
+ // Control the fade-out.
+ // time in seconds
+ long now = wxGetLocalTime();
+ // Pausing fade-out when the mouse is over some notification.
+ if (!m_hovered && m_last_time < now)
+ {
+ if (now - m_last_time == 1)
+ {
+ for (auto &notification : m_pop_notifications)
+ {
+ notification->substract_remaining_time();
+ }
+ }
+ m_last_time = now;
+ }
+ }
+
+ if (request_next_frame)
+ //FIXME this is very expensive for fade-out control.
+ // If any of the notifications is fading out, 100% of the CPU/GPU is consumed.
+ canvas.request_extra_frame();
+}
+#endif // ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+
+void NotificationManager::sort_notifications()
+{
+ // Stable sorting, so that the order of equal ranges is stable.
+ std::stable_sort(m_pop_notifications.begin(), m_pop_notifications.end(), [](const std::unique_ptr<PopNotification> &n1, const std::unique_ptr<PopNotification> &n2) {
+ int n1l = (int)n1->get_data().level;
+ int n2l = (int)n2->get_data().level;
+ if (n1l == n2l && n1->is_gray() && !n2->is_gray())
+ return true;
+ return (n1l < n2l);
+ });
+}
+
+bool NotificationManager::activate_existing(const NotificationManager::PopNotification* notification)
+{
+ NotificationType new_type = notification->get_type();
+ const std::string &new_text = notification->get_data().text1;
+ for (auto it = m_pop_notifications.begin(); it != m_pop_notifications.end(); ++it) {
+ if ((*it)->get_type() == new_type && !(*it)->is_finished()) {
+ if (new_type == NotificationType::CustomNotification || new_type == NotificationType::PlaterWarning) {
+ if (!(*it)->compare_text(new_text))
+ continue;
+ } else if (new_type == NotificationType::SlicingWarning) {
+ auto w1 = dynamic_cast<const SlicingWarningNotification*>(notification);
+ auto w2 = dynamic_cast<const SlicingWarningNotification*>(it->get());
+ if (w1 != nullptr && w2 != nullptr) {
+ if (!(*it)->compare_text(new_text) || w1->object_id != w2->object_id) {
+ continue;
+ }
+ } else {
+ continue;
+ }
+ }
+
+ if (it != m_pop_notifications.end() - 1)
+ std::rotate(it, it + 1, m_pop_notifications.end());
+ return true;
+ }
+ }
+ return false;
+}
+
+void NotificationManager::set_in_preview(bool preview)
+{
+ m_in_preview = preview;
+ for (std::unique_ptr<PopNotification> &notification : m_pop_notifications) {
+ if (notification->get_type() == NotificationType::PlaterWarning)
+ notification->hide(preview);
+ }
+}
+
+#if ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+void NotificationManager::update_notifications()
+{
+ // no update if not top window
+ wxWindow* p = dynamic_cast<wxWindow*>(wxGetApp().plater());
+ while (p->GetParent() != nullptr)
+ p = p->GetParent();
+ wxTopLevelWindow* top_level_wnd = dynamic_cast<wxTopLevelWindow*>(p);
+ if (!top_level_wnd->IsActive())
+ return;
+
+ //static size_t last_size = m_pop_notifications.size();
+
+ //request frames
+ int64_t next_render = std::numeric_limits<int64_t>::max();
+ for (auto it = m_pop_notifications.begin(); it != m_pop_notifications.end();) {
+ std::unique_ptr<PopNotification>& notification = *it;
+ notification->set_paused(m_hovered);
+ notification->update_state();
+ next_render = std::min<int64_t>(next_render, notification->next_render());
+ if (notification->get_state() == PopNotification::EState::Finished)
+ it = m_pop_notifications.erase(it);
+ else {
+
+ ++it;
+ }
+ }
+ /*
+ m_requires_update = false;
+ for (const std::unique_ptr<PopNotification>& notification : m_pop_notifications) {
+ if (notification->requires_update()) {
+ m_requires_update = true;
+ break;
+ }
+ }
+ */
+ // update hovering state
+ m_hovered = false;
+ for (const std::unique_ptr<PopNotification>& notification : m_pop_notifications) {
+ if (notification->is_hovered()) {
+ m_hovered = true;
+ break;
+ }
+ }
+
+ /*
+ // Reuire render if some notification was just deleted.
+ size_t curr_size = m_pop_notifications.size();
+ m_requires_render = m_hovered || (last_size != curr_size);
+ last_size = curr_size;
+
+ // Ask notification if it needs render
+ if (!m_requires_render) {
+ for (const std::unique_ptr<PopNotification>& notification : m_pop_notifications) {
+ if (notification->requires_render()) {
+ m_requires_render = true;
+ break;
+ }
+ }
+ }
+ // Make sure there will be update after last notification erased
+ if (m_requires_render)
+ m_requires_update = true;
+ */
+
+
+ if (next_render == 0)
+ wxGetApp().plater()->get_current_canvas3D()->request_extra_frame_delayed(33); //few milliseconds to get from GLCanvas::render
+ else if (next_render < std::numeric_limits<int64_t>::max())
+ wxGetApp().plater()->get_current_canvas3D()->request_extra_frame_delayed(int(next_render));
+
+ /*
+ // actualizate timers
+ wxWindow* p = dynamic_cast<wxWindow*>(wxGetApp().plater());
+ while (p->GetParent() != nullptr)
+ p = p->GetParent();
+ wxTopLevelWindow* top_level_wnd = dynamic_cast<wxTopLevelWindow*>(p);
+ if (!top_level_wnd->IsActive())
+ return;
+
+ {
+ // Control the fade-out.
+ // time in seconds
+ long now = wxGetLocalTime();
+ // Pausing fade-out when the mouse is over some notification.
+ if (!m_hovered && m_last_time < now) {
+ if (now - m_last_time >= MAX_TIMEOUT_SECONDS) {
+ for (auto& notification : m_pop_notifications) {
+ //if (notification->get_state() != PopNotification::EState::Static)
+ notification->substract_remaining_time(MAX_TIMEOUT_SECONDS);
+ }
+ m_last_time = now;
+ }
+ }
+ }
+ */
+}
+#endif // ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+
+bool NotificationManager::has_slicing_error_notification()
+{
+ return std::any_of(m_pop_notifications.begin(), m_pop_notifications.end(), [](auto &n) {
+ return n->get_type() == NotificationType::SlicingError;
+ });
+}
+
+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<PopNotification>& 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<PopNotification>& notification : m_pop_notifications) {
+ if (notification->get_type() == NotificationType::ExportFinished && dynamic_cast<ExportFinishedNotification*>(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
new file mode 100644
index 000000000..9252190ef
--- /dev/null
+++ b/src/slic3r/GUI/NotificationManager.hpp
@@ -0,0 +1,490 @@
+#ifndef slic3r_GUI_NotificationManager_hpp_
+#define slic3r_GUI_NotificationManager_hpp_
+
+#include "Event.hpp"
+#include "I18N.hpp"
+
+#include <libslic3r/ObjectID.hpp>
+#include <libslic3r/Technologies.hpp>
+
+#include <wx/time.h>
+
+#include <string>
+#include <vector>
+#include <deque>
+#include <unordered_set>
+
+namespace Slic3r {
+namespace GUI {
+
+using EjectDriveNotificationClickedEvent = SimpleEvent;
+wxDECLARE_EVENT(EVT_EJECT_DRIVE_NOTIFICAION_CLICKED, EjectDriveNotificationClickedEvent);
+using ExportGcodeNotificationClickedEvent = SimpleEvent;
+wxDECLARE_EVENT(EVT_EXPORT_GCODE_NOTIFICAION_CLICKED, ExportGcodeNotificationClickedEvent);
+using PresetUpdateAvailableClickedEvent = SimpleEvent;
+wxDECLARE_EVENT(EVT_PRESET_UPDATE_AVAILABLE_CLICKED, PresetUpdateAvailableClickedEvent);
+
+class GLCanvas3D;
+class ImGuiWrapper;
+
+enum class NotificationType
+{
+ CustomNotification,
+ // Notification on end of slicing and G-code processing (the full G-code preview is available).
+ // Contains a hyperlink to export the G-code to a removable media.
+ SlicingComplete,
+// SlicingNotPossible,
+ // Notification on end of export to a removable media, with hyperling to eject the external media.
+ // 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,
+// Mouse3dConnected,
+// NewPresetsAviable,
+ // Notification on the start of PrusaSlicer, when a new PrusaSlicer version is published.
+ // Contains a hyperlink to open a web browser pointing to the PrusaSlicer download location.
+ NewAppAvailable,
+ // Notification on the start of PrusaSlicer, when updates of system profiles are detected.
+ // Contains a hyperlink to execute installation of the new system profiles.
+ PresetUpdateAvailable,
+// LoadingFailed,
+ // Not used - instead Slicing error is used for both slicing and validate errors.
+// ValidateError,
+ // Slicing error produced by BackgroundSlicingProcess::validate() or by the BackgroundSlicingProcess background
+ // thread thowing a SlicingError exception.
+ SlicingError,
+ // Slicing warnings, issued by the slicing process.
+ // Slicing warnings are registered for a particular Print milestone or a PrintObject and its milestone.
+ SlicingWarning,
+ // Object partially outside the print volume. Cannot slice.
+ PlaterError,
+ // Object fully outside the print volume, or extrusion outside the print volume. Slicing is not disabled.
+ PlaterWarning,
+ // Progress bar instead of text.
+ ProgressBar,
+ // Notification, when Color Change G-code is empty and user try to add color change on DoubleSlider.
+ EmptyColorChangeCode,
+ // Notification that custom supports/seams were deleted after mesh repair.
+ CustomSupportsAndSeamRemovedAfterRepair
+};
+
+class NotificationManager
+{
+public:
+ enum class NotificationLevel : int
+ {
+ // The notifications will be presented in the order of importance, thus these enum values
+ // are sorted by the importance.
+ // "Good to know" notification, usually but not always with a quick fade-out.
+ RegularNotification = 1,
+ // Information notification without a fade-out or with a longer fade-out.
+ ImportantNotification,
+ // Important notification with progress bar, no fade-out, might appear again after closing.
+ ProgressBarNotification,
+ // Warning, no fade-out.
+ WarningNotification,
+ // Error, no fade-out.
+ ErrorNotification,
+ };
+
+ NotificationManager(wxEvtHandler* evt_handler);
+
+ // Push a prefabricated notification from basic_notifications (see the table at the end of this file).
+ void push_notification(const NotificationType type, int timestamp = 0);
+ // Push a NotificationType::CustomNotification with NotificationLevel::RegularNotification and 10s fade out interval.
+ void push_notification(const std::string& text, int timestamp = 0);
+ // Push a NotificationType::CustomNotification with provided notification level and 10s for RegularNotification.
+ // ErrorNotification and ImportantNotification are never faded out.
+ void push_notification(NotificationType type, NotificationLevel level, const std::string& text, const std::string& hypertext = "",
+ std::function<bool(wxEvtHandler*)> callback = std::function<bool(wxEvtHandler*)>(), int timestamp = 0);
+ // Creates Slicing Error notification with a custom text and no fade out.
+ void push_slicing_error_notification(const std::string& text);
+ // Creates Slicing Warning notification with a custom text and no fade out.
+ void push_slicing_warning_notification(const std::string& text, bool gray, ObjectID oid, int warning_step);
+ // marks slicing errors as gray
+ void set_all_slicing_errors_gray(bool g);
+ // marks slicing warings as gray
+ void set_all_slicing_warnings_gray(bool g);
+// void set_slicing_warning_gray(const std::string& text, bool g);
+ // immediately stops showing slicing errors
+ void close_slicing_errors_and_warnings();
+ // Release those slicing warnings, which refer to an ObjectID, which is not in the list.
+ // living_oids is expected to be sorted.
+ void remove_slicing_warnings_of_released_objects(const std::vector<ObjectID>& living_oids);
+ // Object partially outside of the printer working space, cannot print. No fade out.
+ void push_plater_error_notification(const std::string& text);
+ // Object fully out of the printer working space and such. No fade out.
+ void push_plater_warning_notification(const std::string& text);
+ // Closes error or warning of the same text
+ void close_plater_error_notification(const std::string& text);
+ void close_plater_warning_notification(const std::string& text);
+ // Creates special notification slicing complete.
+ // If large = true (Plater side bar is closed), then printing time and export button is shown
+ // at the notification and fade-out is disabled. Otherwise the fade out time is set to 10s.
+ void push_slicing_complete_notification(int timestamp, bool large);
+ // Add a print time estimate to an existing SlicingComplete notification.
+ void set_slicing_complete_print_time(const std::string &info);
+ // 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(const std::string& path, const std::string& dir_path, bool on_removable);
+ // notification with progress bar
+ void push_progress_bar_notification(const std::string& text, float percentage = 0);
+ void set_progress_bar_percentage(const std::string& text, float percentage);
+ // 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(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.
+ void set_move_from_overlay(bool move) { m_move_from_overlay = move; }
+/*
+#if ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+
+ bool requires_update() const { return m_requires_update; }
+ bool requires_render() const { return m_requires_render; }
+#endif // ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+*/
+private:
+ // duration 0 means not disapearing
+ struct NotificationData {
+ NotificationType type;
+ NotificationLevel level;
+ // Fade out time
+ const int duration;
+ const std::string text1;
+ const std::string hypertext;
+ // Callback for hypertext - returns true if notification should close after triggering
+ // Usually sends event to UI thread thru wxEvtHandler.
+ // Examples in basic_notifications.
+ std::function<bool(wxEvtHandler*)> callback { nullptr };
+ const std::string text2;
+ };
+
+ // Cache of IDs to identify and reuse ImGUI windows.
+ class NotificationIDProvider
+ {
+ public:
+ int allocate_id();
+ void release_id(int id);
+
+ private:
+ // Next ID used for naming the ImGUI windows.
+ int m_next_id{ 1 };
+ // IDs of ImGUI windows, which were released and they are ready for reuse.
+ std::vector<int> m_released_ids;
+ };
+
+ //Pop notification - shows only once to user.
+ class PopNotification
+ {
+ public:
+
+#if ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+ enum class EState
+ {
+ Unknown,
+ Hidden,
+ FadingOutRender, // Requesting Render
+ FadingOutStatic,
+ ClosePending, // Requesting Render
+ Finished, // Requesting Render
+ };
+#else
+ enum class RenderResult
+ {
+ Finished,
+ ClosePending,
+ Static,
+ Countdown,
+ Hovered
+ };
+#endif // ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+
+ PopNotification(const NotificationData &n, NotificationIDProvider &id_provider, wxEvtHandler* evt_handler);
+ virtual ~PopNotification() { if (m_id) m_id_provider.release_id(m_id); }
+#if ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+ void render(GLCanvas3D& canvas, float initial_y, bool move_from_overlay, float overlay_width);
+#else
+ RenderResult render(GLCanvas3D& canvas, const float& initial_y, bool move_from_overlay, float overlay_width);
+#endif // ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+ // close will dissapear notification on next render
+ void close() { m_close_pending = true; }
+ // data from newer notification of same type
+ void update(const NotificationData& n);
+ bool is_finished() const { return m_finished || m_close_pending; }
+#if ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+ bool is_hovered() const { return m_hovered; }
+#endif // ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+ // returns top after movement
+ float get_top() const { return m_top_y; }
+ //returns top in actual frame
+ float get_current_top() const { return m_top_y; }
+ const NotificationType get_type() const { return m_data.type; }
+ const NotificationData get_data() const { return m_data; }
+ const bool is_gray() const { return m_is_gray; }
+ // Call equals one second down
+ void substract_remaining_time(int seconds) { m_remaining_time -= seconds; }
+ void set_gray(bool g) { m_is_gray = g; }
+ void set_paused(bool p) { m_paused = p; }
+ bool compare_text(const std::string& text);
+ void hide(bool h) { m_hidden = h; }
+#if ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+ // sets m_next_render with time of next mandatory rendering
+ void update_state();
+ int64_t next_render() const { return m_next_render; }
+ /*
+ bool requires_render() const { return m_state == EState::FadingOutRender || m_state == EState::ClosePending || m_state == EState::Finished; }
+ bool requires_update() const { return m_state != EState::Hidden; }
+ */
+ EState get_state() const { return m_state; }
+#endif // ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+ 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);
+ 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);
+#if !ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+ 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);
+#endif // !ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+ 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);
+ virtual void render_minimize_button(ImGuiWrapper& imgui,
+ const float win_pos_x, const float win_pos_y);
+ // Hypertext action, returns true if notification should close.
+ // Action is stored in NotificationData::callback as std::function<bool(wxEvtHandler*)>
+ virtual bool on_text_click();
+
+ const NotificationData m_data;
+
+ // For reusing ImGUI windows.
+ NotificationIDProvider &m_id_provider;
+
+#if ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+ EState m_state { EState::Unknown };
+#endif // ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+
+ int m_id { 0 };
+ bool m_initialized { false };
+ // Main text
+ std::string m_text1;
+ // Clickable text
+ std::string m_hypertext;
+ // Aditional text after hypertext - currently not used
+ std::string m_text2;
+ // Countdown variables
+ long m_remaining_time;
+ bool m_counting_down;
+ long m_last_remaining_time;
+ bool m_paused { false };
+ int m_countdown_frame { 0 };
+ bool m_fading_out { false };
+#if ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+ int64_t m_fading_start { 0LL };
+ // time of last done render when fading
+ int64_t m_last_render_fading { 0LL };
+ // first appereance of notification or last hover;
+ int64_t m_notification_start;
+ // time to next must-do render
+ int64_t m_next_render { std::numeric_limits<int64_t>::max() };
+#else
+ // total time left when fading beggins
+ float m_fading_time{ 0.0f };
+#endif // ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+ float m_current_fade_opacity { 1.0f };
+ // If hidden the notif is alive but not visible to user
+ bool m_hidden { false };
+ // m_finished = true - does not render, marked to delete
+ bool m_finished { false };
+ // Will go to m_finished next render
+ bool m_close_pending { false };
+#if ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+ bool m_hovered { false };
+#endif // ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+ // 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 };
+ float m_window_width { 450.0f };
+ //Distance from bottom of notifications to top of this notification
+ float m_top_y { 0.0f };
+
+ // Height of text
+ // Used as basic scaling unit!
+ float m_line_height;
+ std::vector<int> m_endlines;
+ // Gray are f.e. eorrors when its uknown if they are still valid
+ bool m_is_gray { false };
+ //if multiline = true, notification is showing all lines(>2)
+ bool m_multiline { false };
+ // True if minimized button is rendered, helps to decide where is area for invisible close button
+ bool m_minimize_b_visible { false };
+ int m_lines_count{ 1 };
+ // Target for wxWidgets events sent by clicking on the hyperlink available at some notifications.
+ wxEvtHandler* m_evt_handler;
+ };
+
+ class SlicingCompleteLargeNotification : public PopNotification
+ {
+ public:
+ SlicingCompleteLargeNotification(const NotificationData& n, NotificationIDProvider& id_provider, wxEvtHandler* evt_handler, bool largeds);
+ void set_large(bool l);
+ bool get_large() { return m_is_large; }
+
+ void set_print_info(const std::string &info);
+ protected:
+ 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;
+ bool m_is_large;
+ bool m_has_print_info { false };
+ std::string m_print_info { std::string() };
+ };
+
+ class SlicingWarningNotification : public PopNotification
+ {
+ public:
+ SlicingWarningNotification(const NotificationData& n, NotificationIDProvider& id_provider, wxEvtHandler* evt_handler) : PopNotification(n, id_provider, evt_handler) {}
+ ObjectID object_id;
+ int warning_step;
+ };
+
+ class ProgressBarNotification : public PopNotification
+ {
+ public:
+ ProgressBarNotification(const NotificationData& n, NotificationIDProvider& id_provider, wxEvtHandler* evt_handler, float percentage) : PopNotification(n, id_provider, evt_handler) { set_percentage(percentage); }
+ void set_percentage(float percent) { m_percentage = percent; if (percent >= 1.0f) m_progress_complete = true; else m_progress_complete = false; }
+ protected:
+ virtual void init();
+ 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_bar(ImGuiWrapper& imgui,
+ const float win_size_x, const float win_size_y,
+ const float win_pos_x, const float win_pos_y);
+ bool m_progress_complete{ false };
+ float m_percentage;
+ };
+
+ 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, int timestamp);
+ bool push_notification_data(std::unique_ptr<NotificationManager::PopNotification> notification, int timestamp);
+ //finds older notification of same type and moves it to the end of queue. returns true if found
+ bool activate_existing(const NotificationManager::PopNotification* notification);
+ // Put the more important notifications to the bottom of the list.
+ void sort_notifications();
+ // If there is some error notification active, then the "Export G-code" notification after the slicing is finished is suppressed.
+ bool has_slicing_error_notification();
+#if ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+ // perform update_state on each notification and ask for more frames if needed
+ void update_notifications();
+#endif // ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+
+ // Target for wxWidgets events sent by clicking on the hyperlink available at some notifications.
+ wxEvtHandler* m_evt_handler;
+ // Cache of IDs to identify and reuse ImGUI windows.
+ NotificationIDProvider m_id_provider;
+ std::deque<std::unique_ptr<PopNotification>> m_pop_notifications;
+ // Last render time in seconds for fade out control.
+ long m_last_time { 0 };
+ // When mouse hovers over some notification, the fade-out of all notifications is suppressed.
+ bool m_hovered { false };
+ //timestamps used for slicing finished - notification could be gone so it needs to be stored here
+ std::unordered_set<int> m_used_timestamps;
+ // True if G-code preview is active. False if the Plater is active.
+ bool m_in_preview { false };
+ // True if the layer editing is enabled in Plater, so that the notifications are shifted left of it.
+ bool m_move_from_overlay { false };
+/*
+#if ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+ bool m_requires_update{ false };
+ bool m_requires_render{ false };
+#endif // ENABLE_NEW_NOTIFICATIONS_FADE_OUT
+*/
+ //prepared (basic) notifications
+ const std::vector<NotificationData> basic_notifications = {
+// {NotificationType::SlicingNotPossible, NotificationLevel::RegularNotification, 10, _u8L("Slicing is not possible.")},
+// {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.") },
+ {NotificationType::PresetUpdateAvailable, NotificationLevel::ImportantNotification, 20, _u8L("Configuration update is available."), _u8L("See more."), [](wxEvtHandler* evnthndlr){
+ if (evnthndlr != nullptr) wxPostEvent(evnthndlr, PresetUpdateAvailableClickedEvent(EVT_PRESET_UPDATE_AVAILABLE_CLICKED)); return true; }},
+ {NotificationType::NewAppAvailable, NotificationLevel::ImportantNotification, 20, _u8L("New version is available."), _u8L("See Releases page."), [](wxEvtHandler* evnthndlr){
+ wxLaunchDefaultBrowser("https://github.com/prusa3d/PrusaSlicer/releases"); return true; }},
+ {NotificationType::EmptyColorChangeCode, NotificationLevel::RegularNotification, 10,
+ _u8L("You have just added a G-code for color change, but its value is empty.\n"
+ "To export the G-code correctly, check the \"Color Change G-code\" in \"Printer Settings > Custom G-code\"") },
+ //{NotificationType::NewAppAvailable, NotificationLevel::ImportantNotification, 20, _u8L("New vesion of PrusaSlicer is available.", _u8L("Download page.") },
+ //{NotificationType::LoadingFailed, NotificationLevel::RegularNotification, 20, _u8L("Loading of model has Failed") },
+ //{NotificationType::DeviceEjected, NotificationLevel::RegularNotification, 10, _u8L("Removable device has been safely ejected")} // if we want changeble text (like here name of device), we need to do it as CustomNotification
+ };
+};
+
+}//namespace GUI
+}//namespace Slic3r
+
+#endif //slic3r_GUI_NotificationManager_hpp_
diff --git a/src/slic3r/GUI/OG_CustomCtrl.cpp b/src/slic3r/GUI/OG_CustomCtrl.cpp
new file mode 100644
index 000000000..07b96755d
--- /dev/null
+++ b/src/slic3r/GUI/OG_CustomCtrl.cpp
@@ -0,0 +1,745 @@
+#include "OG_CustomCtrl.hpp"
+#include "OptionsGroup.hpp"
+#include "Plater.hpp"
+#include "GUI_App.hpp"
+#include "libslic3r/AppConfig.hpp"
+
+#include <wx/utils.h>
+#include <boost/algorithm/string/split.hpp>
+#include "libslic3r/Utils.hpp"
+#include "I18N.hpp"
+#include "format.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<Line>& 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<Option>& option_set = line.get_options();
+ wxCoord height;
+
+ // if we have a single option with no label, no sidetext just add it directly to sizer
+ if (option_set.size() == 1 && opt_group->label_width == 0 && option_set.front().opt.full_width &&
+ option_set.front().opt.label.empty() &&
+ option_set.front().opt.sidetext.size() == 0 && option_set.front().side_widget == nullptr &&
+ line.get_extra_widgets().size() == 0)
+ {
+ height = m_bmp_blinking_sz.GetHeight() + m_v_gap;
+ ctrl_lines.emplace_back(CtrlLine(height, this, line, true));
+ }
+ else if (opt_group->label_width != 0 && (!line.label.IsEmpty() || option_set.front().opt.gui_type == "legend") )
+ {
+ wxSize label_sz = GetTextExtent(line.label);
+ height = label_sz.y * (label_sz.GetWidth() > int(opt_group->label_width * m_em_unit) ? 2 : 1) + m_v_gap;
+ ctrl_lines.emplace_back(CtrlLine(height, this, line, false, opt_group->staticbox));
+ }
+ else
+ int i = 0;
+ }
+}
+
+int OG_CustomCtrl::get_height(const Line& line)
+{
+ for (auto ctrl_line : ctrl_lines)
+ if (&ctrl_line.og_line == &line)
+ return ctrl_line.height;
+
+ return 0;
+}
+
+wxPoint OG_CustomCtrl::get_pos(const Line& line, Field* field_in/* = nullptr*/)
+{
+ wxCoord v_pos = 0;
+ wxCoord h_pos = 0;
+
+ auto correct_line_height = [](int& line_height, wxWindow* win)
+ {
+ int win_height = win->GetSize().GetHeight();
+ if (line_height < win_height)
+ line_height = win_height;
+ };
+
+ for (CtrlLine& ctrl_line : ctrl_lines) {
+ if (&ctrl_line.og_line == &line)
+ {
+ h_pos = m_bmp_mode_sz.GetWidth() + m_h_gap;
+ if (line.near_label_widget_win) {
+ wxSize near_label_widget_sz = line.near_label_widget_win->GetSize();
+ if (field_in)
+ h_pos += near_label_widget_sz.GetWidth() + m_h_gap;
+ else
+ break;
+ }
+
+ wxString label = line.label;
+ if (opt_group->label_width != 0)
+ h_pos += opt_group->label_width * m_em_unit + m_h_gap;
+
+ int blinking_button_width = m_bmp_blinking_sz.GetWidth() + m_h_gap;
+
+ if (line.widget) {
+ h_pos += blinking_button_width;
+
+ for (auto child : line.widget_sizer->GetChildren())
+ if (child->IsWindow())
+ correct_line_height(ctrl_line.height, child->GetWindow());
+ break;
+ }
+
+ // If we have a single option with no sidetext
+ const std::vector<Option>& option_set = line.get_options();
+ if (option_set.size() == 1 && option_set.front().opt.sidetext.size() == 0 &&
+ option_set.front().opt.label.empty() &&
+ option_set.front().side_widget == nullptr && line.get_extra_widgets().size() == 0)
+ {
+ h_pos += 3 * blinking_button_width;
+ Field* field = opt_group->get_field(option_set.front().opt_id);
+ correct_line_height(ctrl_line.height, field->getWindow());
+ break;
+ }
+
+ for (auto opt : option_set) {
+ Field* field = opt_group->get_field(opt.opt_id);
+ correct_line_height(ctrl_line.height, field->getWindow());
+
+ ConfigOptionDef option = opt.opt;
+ // add label if any
+ if (!option.label.empty()) {
+ //! To correct translation by context have to use wxGETTEXT_IN_CONTEXT macro from wxWidget 3.1.1
+ label = (option.label == L_CONTEXT("Top", "Layers") || option.label == L_CONTEXT("Bottom", "Layers")) ?
+ _CTX(option.label, "Layers") : _(option.label);
+ label += ":";
+
+ wxCoord label_w, label_h;
+#ifdef __WXMSW__
+ // when we use 2 monitors with different DPIs, GetTextExtent() return value for the primary display
+ // so, use dc.GetMultiLineTextExtent on Windows
+ wxClientDC dc(this);
+ dc.SetFont(m_font);
+ dc.GetMultiLineTextExtent(label, &label_w, &label_h);
+#else
+ GetTextExtent(label, &label_w, &label_h, 0, 0, &m_font);
+#endif //__WXMSW__
+ h_pos += label_w + 1 + m_h_gap;
+ }
+ h_pos += (opt.opt.gui_type == "legend" ? 1 : 3) * blinking_button_width;
+
+ if (field == field_in)
+ break;
+ if (opt.opt.gui_type == "legend")
+ h_pos += 2 * blinking_button_width;
+
+ h_pos += field->getWindow()->GetSize().x;
+
+ if (option_set.size() == 1 && option_set.front().opt.full_width)
+ break;
+
+ // add sidetext if any
+ if (!option.sidetext.empty() || opt_group->sidetext_width > 0)
+ h_pos += opt_group->sidetext_width * m_em_unit + m_h_gap;
+
+ if (opt.opt_id != option_set.back().opt_id) //! istead of (opt != option_set.back())
+ h_pos += lround(0.6 * m_em_unit);
+ }
+ break;
+ }
+ if (ctrl_line.is_visible)
+ v_pos += ctrl_line.height;
+ }
+
+ return wxPoint(h_pos, v_pos);
+}
+
+
+void OG_CustomCtrl::OnPaint(wxPaintEvent&)
+{
+ // case, when custom controll is destroyed but doesn't deleted from the evet loop
+ if(!this->opt_group->custom_ctrl)
+ return;
+
+ wxPaintDC dc(this);
+ dc.SetFont(m_font);
+
+ wxCoord v_pos = 0;
+ for (CtrlLine& line : ctrl_lines) {
+ if (!line.is_visible)
+ continue;
+ line.render(dc, v_pos);
+ v_pos += line.height;
+ }
+}
+
+void OG_CustomCtrl::OnMotion(wxMouseEvent& event)
+{
+ const wxPoint pos = event.GetLogicalPosition(wxClientDC(this));
+ wxString tooltip;
+
+ wxString language = wxGetApp().app_config->get("translation_language");
+
+ bool suppress_hyperlinks = get_app_config()->get("suppress_hyperlinks") == "1";
+
+ for (CtrlLine& line : ctrl_lines) {
+ line.is_focused = is_point_in_rect(pos, line.rect_label);
+ if (line.is_focused) {
+ if (!suppress_hyperlinks && !line.og_line.label_path.empty())
+ tooltip = get_url(line.og_line.label_path) +"\n\n";
+ tooltip += line.og_line.label_tooltip;
+ break;
+ }
+
+ for (size_t opt_idx = 0; opt_idx < line.rects_undo_icon.size(); opt_idx++)
+ if (is_point_in_rect(pos, line.rects_undo_icon[opt_idx])) {
+ const std::vector<Option>& option_set = line.og_line.get_options();
+ Field* field = opt_group->get_field(option_set[opt_idx].opt_id);
+ if (field)
+ tooltip = *field->undo_tooltip();
+ break;
+ }
+ for (size_t opt_idx = 0; opt_idx < line.rects_undo_to_sys_icon.size(); opt_idx++)
+ if (is_point_in_rect(pos, line.rects_undo_to_sys_icon[opt_idx])) {
+ const std::vector<Option>& option_set = line.og_line.get_options();
+ Field* field = opt_group->get_field(option_set[opt_idx].opt_id);
+ if (field)
+ tooltip = *field->undo_to_sys_tooltip();
+ break;
+ }
+ if (!tooltip.IsEmpty())
+ break;
+ }
+
+ // Set tooltips with information for each icon
+ this->SetToolTip(tooltip);
+
+ Refresh();
+ Update();
+ event.Skip();
+}
+
+void OG_CustomCtrl::OnLeftDown(wxMouseEvent& event)
+{
+ const wxPoint pos = event.GetLogicalPosition(wxClientDC(this));
+
+ for (const CtrlLine& line : ctrl_lines) {
+ if (line.launch_browser())
+ return;
+ for (size_t opt_idx = 0; opt_idx < line.rects_undo_icon.size(); opt_idx++)
+ if (is_point_in_rect(pos, line.rects_undo_icon[opt_idx])) {
+ const std::vector<Option>& option_set = line.og_line.get_options();
+ Field* field = opt_group->get_field(option_set[opt_idx].opt_id);
+ if (field)
+ field->on_back_to_initial_value();
+ event.Skip();
+ return;
+ }
+ for (size_t opt_idx = 0; opt_idx < line.rects_undo_to_sys_icon.size(); opt_idx++)
+ if (is_point_in_rect(pos, line.rects_undo_to_sys_icon[opt_idx])) {
+ const std::vector<Option>& option_set = line.og_line.get_options();
+ Field* field = opt_group->get_field(option_set[opt_idx].opt_id);
+ if (field)
+ field->on_back_to_sys_value();
+ event.Skip();
+ return;
+ }
+ }
+
+}
+
+void OG_CustomCtrl::OnLeaveWin(wxMouseEvent& event)
+{
+ for (CtrlLine& line : ctrl_lines)
+ line.is_focused = false;
+
+ Refresh();
+ Update();
+ event.Skip();
+}
+
+bool OG_CustomCtrl::update_visibility(ConfigOptionMode mode)
+{
+ wxCoord v_pos = 0;
+
+ size_t invisible_lines = 0;
+ for (CtrlLine& line : ctrl_lines) {
+ line.update_visibility(mode);
+ if (line.is_visible)
+ v_pos += (wxCoord)line.height;
+ else
+ invisible_lines++;
+ }
+
+ this->SetMinSize(wxSize(wxDefaultCoord, v_pos));
+
+ return invisible_lines != ctrl_lines.size();
+}
+
+void OG_CustomCtrl::correct_window_position(wxWindow* win, const Line& line, Field* field/* = nullptr*/)
+{
+ wxPoint pos = get_pos(line, field);
+ int line_height = get_height(line);
+ pos.y += std::max(0, int(0.5 * (line_height - win->GetSize().y)));
+ win->SetPosition(pos);
+};
+
+void OG_CustomCtrl::correct_widgets_position(wxSizer* widget, const Line& line, Field* field/* = nullptr*/) {
+ auto children = widget->GetChildren();
+ wxPoint line_pos = get_pos(line, field);
+ int line_height = get_height(line);
+ for (auto child : children)
+ if (child->IsWindow()) {
+ wxPoint pos = line_pos;
+ wxSize sz = child->GetWindow()->GetSize();
+ pos.y += std::max(0, int(0.5 * (line_height - sz.y)));
+ child->GetWindow()->SetPosition(pos);
+ line_pos.x += sz.x + m_h_gap;
+ }
+};
+
+void OG_CustomCtrl::msw_rescale()
+{
+ 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 = create_scaled_bitmap("mode_simple", this, wxOSX ? 10 : 12).GetSize();
+ m_bmp_blinking_sz = create_scaled_bitmap("search_blink", this).GetSize();
+
+ wxCoord v_pos = 0;
+ for (CtrlLine& line : ctrl_lines) {
+ line.msw_rescale();
+ if (line.is_visible)
+ v_pos += (wxCoord)line.height;
+ }
+ this->SetMinSize(wxSize(wxDefaultCoord, v_pos));
+
+ GetParent()->Layout();
+}
+
+void OG_CustomCtrl::sys_color_changed()
+{
+ msw_rescale();
+}
+
+OG_CustomCtrl::CtrlLine::CtrlLine( wxCoord height,
+ OG_CustomCtrl* ctrl,
+ const Line& og_line,
+ bool draw_just_act_buttons /* = false*/,
+ bool draw_mode_bitmap/* = true*/):
+ height(height),
+ ctrl(ctrl),
+ og_line(og_line),
+ draw_just_act_buttons(draw_just_act_buttons),
+ draw_mode_bitmap(draw_mode_bitmap)
+{
+
+ for (size_t i = 0; i < og_line.get_options().size(); i++) {
+ rects_undo_icon.emplace_back(wxRect());
+ rects_undo_to_sys_icon.emplace_back(wxRect());
+ }
+}
+
+void OG_CustomCtrl::CtrlLine::correct_items_positions()
+{
+ if (draw_just_act_buttons || !is_visible)
+ return;
+
+ if (og_line.near_label_widget_win)
+ ctrl->correct_window_position(og_line.near_label_widget_win, og_line);
+ if (og_line.widget_sizer)
+ ctrl->correct_widgets_position(og_line.widget_sizer, og_line);
+ if (og_line.extra_widget_sizer)
+ ctrl->correct_widgets_position(og_line.extra_widget_sizer, og_line);
+
+ const std::vector<Option>& option_set = og_line.get_options();
+ for (auto opt : option_set) {
+ Field* field = ctrl->opt_group->get_field(opt.opt_id);
+ if (!field)
+ continue;
+ if (field->getSizer())
+ ctrl->correct_widgets_position(field->getSizer(), og_line, field);
+ else if (field->getWindow())
+ ctrl->correct_window_position(field->getWindow(), og_line, field);
+ }
+}
+
+void OG_CustomCtrl::CtrlLine::msw_rescale()
+{
+ // if we have a single option with no label, no sidetext
+ if (draw_just_act_buttons)
+ height = get_bitmap_size(create_scaled_bitmap("empty")).GetHeight();
+
+ if (ctrl->opt_group->label_width != 0 && !og_line.label.IsEmpty()) {
+ wxSize label_sz = ctrl->GetTextExtent(og_line.label);
+ height = label_sz.y * (label_sz.GetWidth() > int(ctrl->opt_group->label_width * ctrl->m_em_unit) ? 2 : 1) + ctrl->m_v_gap;
+ }
+
+ correct_items_positions();
+}
+
+void OG_CustomCtrl::CtrlLine::update_visibility(ConfigOptionMode mode)
+{
+ const std::vector<Option>& option_set = og_line.get_options();
+
+ const ConfigOptionMode& line_mode = option_set.front().opt.mode;
+ is_visible = line_mode <= mode;
+
+ if (draw_just_act_buttons)
+ return;
+
+ if (og_line.near_label_widget_win)
+ og_line.near_label_widget_win->Show(is_visible);
+ if (og_line.widget_sizer)
+ og_line.widget_sizer->ShowItems(is_visible);
+ if (og_line.extra_widget_sizer)
+ og_line.extra_widget_sizer->ShowItems(is_visible);
+
+ for (auto opt : option_set) {
+ Field* field = ctrl->opt_group->get_field(opt.opt_id);
+ if (!field)
+ continue;
+
+ if (field->getSizer()) {
+ auto children = field->getSizer()->GetChildren();
+ for (auto child : children)
+ if (child->IsWindow())
+ child->GetWindow()->Show(is_visible);
+ }
+ else if (field->getWindow())
+ field->getWindow()->Show(is_visible);
+ }
+
+ correct_items_positions();
+}
+
+void OG_CustomCtrl::CtrlLine::render(wxDC& dc, wxCoord v_pos)
+{
+ Field* field = ctrl->opt_group->get_field(og_line.get_options().front().opt_id);
+
+ bool suppress_hyperlinks = get_app_config()->get("suppress_hyperlinks") == "1";
+ if (draw_just_act_buttons) {
+ if (field)
+ draw_act_bmps(dc, wxPoint(0, v_pos), field->undo_to_sys_bitmap()->bmp(), field->undo_bitmap()->bmp(), field->blink());
+ return;
+ }
+
+ wxCoord h_pos = draw_mode_bmp(dc, v_pos);
+
+ if (og_line.near_label_widget_win)
+ h_pos += og_line.near_label_widget_win->GetSize().x + ctrl->m_h_gap;
+
+ const std::vector<Option>& option_set = og_line.get_options();
+
+ wxString label = og_line.label;
+ bool is_url_string = false;
+ if (ctrl->opt_group->label_width != 0 && !label.IsEmpty()) {
+ const wxColour* text_clr = (option_set.size() == 1 && field ? field->label_color() : og_line.full_Label_color);
+ is_url_string = !suppress_hyperlinks && !og_line.label_path.IsEmpty();
+ h_pos = draw_text(dc, wxPoint(h_pos, v_pos), label + ":", text_clr, ctrl->opt_group->label_width * ctrl->m_em_unit, is_url_string);
+ }
+
+ // If there's a widget, build it and set result to the correct position.
+ if (og_line.widget != nullptr) {
+ draw_blinking_bmp(dc, wxPoint(h_pos, v_pos), og_line.blink);
+ return;
+ }
+
+ // If we're here, we have more than one option or a single option with sidetext
+ // so we need a horizontal sizer to arrange these things
+
+ // If we have a single option with no sidetext just add it directly to the grid sizer
+ if (option_set.size() == 1 && option_set.front().opt.sidetext.size() == 0 &&
+ option_set.front().opt.label.empty() &&
+ option_set.front().side_widget == nullptr && og_line.get_extra_widgets().size() == 0)
+ {
+ if (field && field->undo_to_sys_bitmap())
+ h_pos = draw_act_bmps(dc, wxPoint(h_pos, v_pos), field->undo_to_sys_bitmap()->bmp(), field->undo_bitmap()->bmp(), field->blink()) + ctrl->m_h_gap;
+ // update width for full_width fields
+ if (option_set.front().opt.full_width && field->getWindow())
+ field->getWindow()->SetSize(ctrl->GetSize().x - h_pos, -1);
+ return;
+ }
+
+ size_t bmp_rect_id = 0;
+ for (const Option& opt : option_set) {
+ field = ctrl->opt_group->get_field(opt.opt_id);
+ ConfigOptionDef option = opt.opt;
+ // add label if any
+ if (!option.label.empty()) {
+ //! To correct translation by context have to use wxGETTEXT_IN_CONTEXT macro from wxWidget 3.1.1
+ label = (option.label == L_CONTEXT("Top", "Layers") || option.label == L_CONTEXT("Bottom", "Layers")) ?
+ _CTX(option.label, "Layers") : _(option.label);
+ label += ":";
+
+ if (is_url_string)
+ is_url_string = false;
+ else if(opt == option_set.front())
+ is_url_string = !suppress_hyperlinks && !og_line.label_path.IsEmpty();
+ h_pos = draw_text(dc, wxPoint(h_pos, v_pos), label, field ? field->label_color() : nullptr, ctrl->opt_group->sublabel_width * ctrl->m_em_unit, is_url_string);
+ }
+
+ if (field && field->undo_to_sys_bitmap()) {
+ h_pos = draw_act_bmps(dc, wxPoint(h_pos, v_pos), field->undo_to_sys_bitmap()->bmp(), field->undo_bitmap()->bmp(), field->blink(), bmp_rect_id++);
+ if (field->getSizer())
+ {
+ auto children = field->getSizer()->GetChildren();
+ for (auto child : children)
+ if (child->IsWindow())
+ h_pos += child->GetWindow()->GetSize().x + ctrl->m_h_gap;
+ }
+ else if (field->getWindow())
+ h_pos += field->getWindow()->GetSize().x + ctrl->m_h_gap;
+ }
+
+ // add field
+ if (option_set.size() == 1 && option_set.front().opt.full_width)
+ break;
+
+ // add sidetext if any
+ if (!option.sidetext.empty() || ctrl->opt_group->sidetext_width > 0)
+ h_pos = draw_text(dc, wxPoint(h_pos, v_pos), _(option.sidetext), nullptr, ctrl->opt_group->sidetext_width * ctrl->m_em_unit);
+
+ if (opt.opt_id != option_set.back().opt_id) //! istead of (opt != option_set.back())
+ h_pos += lround(0.6 * ctrl->m_em_unit);
+ }
+}
+
+wxCoord OG_CustomCtrl::CtrlLine::draw_mode_bmp(wxDC& dc, wxCoord v_pos)
+{
+ if (!draw_mode_bitmap)
+ return ctrl->m_h_gap;
+
+ ConfigOptionMode mode = og_line.get_options()[0].opt.mode;
+ const std::string& bmp_name = mode == ConfigOptionMode::comSimple ? "mode_simple" :
+ mode == ConfigOptionMode::comAdvanced ? "mode_advanced" : "mode_expert";
+ wxBitmap bmp = create_scaled_bitmap(bmp_name, ctrl, wxOSX ? 10 : 12);
+ wxCoord y_draw = v_pos + lround((height - get_bitmap_size(bmp).GetHeight()) / 2);
+
+ if (og_line.get_options().front().opt.gui_type != "legend")
+ dc.DrawBitmap(bmp, 0, y_draw);
+
+ return get_bitmap_size(bmp).GetWidth() + ctrl->m_h_gap;
+}
+
+wxCoord OG_CustomCtrl::CtrlLine::draw_text(wxDC& dc, wxPoint pos, const wxString& text, const wxColour* color, int width, bool is_url/* = false*/)
+{
+ wxString multiline_text;
+ if (width > 0 && dc.GetTextExtent(text).x > width) {
+ multiline_text = text;
+
+ size_t idx = size_t(-1);
+ for (size_t i = 0; i < multiline_text.Len(); i++)
+ {
+ if (multiline_text[i] == ' ')
+ {
+ if (dc.GetTextExtent(multiline_text.SubString(0, i)).x < width)
+ idx = i;
+ else {
+ if (idx != size_t(-1))
+ multiline_text[idx] = '\n';
+ else
+ multiline_text[i] = '\n';
+ break;
+ }
+ }
+ }
+
+ if (idx != size_t(-1))
+ multiline_text[idx] = '\n';
+ }
+
+ if (!text.IsEmpty()) {
+ const wxString& out_text = multiline_text.IsEmpty() ? text : multiline_text;
+ wxCoord text_width, text_height;
+ dc.GetMultiLineTextExtent(out_text, &text_width, &text_height);
+
+ pos.y = pos.y + lround((height - text_height) / 2);
+ if (width > 0)
+ rect_label = wxRect(pos, wxSize(text_width, text_height));
+
+ wxColour old_clr = dc.GetTextForeground();
+ wxFont old_font = dc.GetFont();
+ if (is_focused && is_url)
+ // temporary workaround for the OSX because of strange Bold font behavior on BigSerf
+#ifdef __APPLE__
+ dc.SetFont(old_font.Underlined());
+#else
+ dc.SetFont(old_font.Bold().Underlined());
+#endif
+ dc.SetTextForeground(color ? *color : wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT));
+ dc.DrawText(out_text, pos);
+ dc.SetTextForeground(old_clr);
+ dc.SetFont(old_font);
+
+ if (width < 1)
+ width = text_width;
+ }
+
+ return pos.x + width + ctrl->m_h_gap;
+}
+
+wxPoint OG_CustomCtrl::CtrlLine::draw_blinking_bmp(wxDC& dc, wxPoint pos, bool is_blinking)
+{
+ wxBitmap bmp_blinking = create_scaled_bitmap(is_blinking ? "search_blink" : "empty", ctrl);
+ wxCoord h_pos = pos.x;
+ wxCoord v_pos = pos.y + lround((height - get_bitmap_size(bmp_blinking).GetHeight()) / 2);
+
+ dc.DrawBitmap(bmp_blinking, h_pos, v_pos);
+
+ int bmp_dim = get_bitmap_size(bmp_blinking).GetWidth();
+
+ h_pos += bmp_dim + ctrl->m_h_gap;
+ return wxPoint(h_pos, v_pos);
+}
+
+wxCoord OG_CustomCtrl::CtrlLine::draw_act_bmps(wxDC& dc, wxPoint pos, const wxBitmap& bmp_undo_to_sys, const wxBitmap& bmp_undo, bool is_blinking, size_t rect_id)
+{
+ pos = draw_blinking_bmp(dc, pos, is_blinking);
+ wxCoord h_pos = pos.x;
+ wxCoord v_pos = pos.y;
+
+ dc.DrawBitmap(bmp_undo_to_sys, h_pos, v_pos);
+
+ int bmp_dim = get_bitmap_size(bmp_undo_to_sys).GetWidth();
+ rects_undo_to_sys_icon[rect_id] = wxRect(h_pos, v_pos, bmp_dim, bmp_dim);
+
+ h_pos += bmp_dim + ctrl->m_h_gap;
+ dc.DrawBitmap(bmp_undo, h_pos, v_pos);
+
+ bmp_dim = get_bitmap_size(bmp_undo).GetWidth();
+ rects_undo_icon[rect_id] = wxRect(h_pos, v_pos, bmp_dim, bmp_dim);
+
+ h_pos += bmp_dim + ctrl->m_h_gap;
+
+ return h_pos;
+}
+
+bool OG_CustomCtrl::CtrlLine::launch_browser() const
+{
+ if (!is_focused || og_line.label_path.IsEmpty())
+ return false;
+
+ bool launch = true;
+
+ if (get_app_config()->get("suppress_hyperlinks").empty()) {
+ RememberChoiceDialog dialog(nullptr, _L("Should we open this hyperlink in your default browser?"), _L("PrusaSlicer: Open hyperlink"));
+ int answer = dialog.ShowModal();
+ launch = answer == wxID_YES;
+
+ get_app_config()->set("suppress_hyperlinks", dialog.remember_choice() ? (answer == wxID_NO ? "1" : "0") : "");
+ }
+ if (launch)
+ launch = get_app_config()->get("suppress_hyperlinks") != "1";
+
+ return launch && wxLaunchDefaultBrowser(get_url(og_line.label_path));
+}
+
+
+RememberChoiceDialog::RememberChoiceDialog(wxWindow* parent, const wxString& msg_text, const wxString& caption)
+ : wxDialog(parent, wxID_ANY, caption, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxICON_INFORMATION)
+{
+ this->SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
+ this->SetEscapeId(wxID_CLOSE);
+
+ wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL);
+
+ m_remember_choice = new wxCheckBox(this, wxID_ANY, _L("Remember my choice"));
+ m_remember_choice->SetValue(false);
+ m_remember_choice->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent& evt)
+ {
+ if (!evt.IsChecked())
+ return;
+ wxString preferences_item = _L("Suppress to open hyperlink in browser");
+ wxString msg =
+ _L("PrusaSlicer will remember your choice.") + "\n\n" +
+ _L("You will not be asked about it again on label hovering.") + "\n\n" +
+ format_wxstr(_L("Visit \"Preferences\" and check \"%1%\"\nto changes your choice."), preferences_item);
+
+ wxMessageDialog dialog(nullptr, msg, _L("PrusaSlicer: Don't ask me again"), wxOK | wxCANCEL | wxICON_INFORMATION);
+ if (dialog.ShowModal() == wxID_CANCEL)
+ m_remember_choice->SetValue(false);
+ });
+
+
+ // Add dialog's buttons
+ wxStdDialogButtonSizer* btns = this->CreateStdDialogButtonSizer(wxYES | wxNO);
+ wxButton* btnYES = static_cast<wxButton*>(this->FindWindowById(wxID_YES, this));
+ wxButton* btnNO = static_cast<wxButton*>(this->FindWindowById(wxID_NO, this));
+ btnYES->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { this->EndModal(wxID_YES); });
+ btnNO->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { this->EndModal(wxID_NO); });
+
+ topSizer->Add(new wxStaticText(this, wxID_ANY, msg_text), 0, wxEXPAND | wxALL, 10);
+ topSizer->Add(m_remember_choice, 0, wxEXPAND | wxALL, 10);
+ topSizer->Add(btns, 0, wxEXPAND | wxALL, 10);
+
+ this->SetSizer(topSizer);
+ topSizer->SetSizeHints(this);
+
+ this->CenterOnScreen();
+}
+
+} // GUI
+} // Slic3r
diff --git a/src/slic3r/GUI/OG_CustomCtrl.hpp b/src/slic3r/GUI/OG_CustomCtrl.hpp
new file mode 100644
index 000000000..afbc6c930
--- /dev/null
+++ b/src/slic3r/GUI/OG_CustomCtrl.hpp
@@ -0,0 +1,116 @@
+#ifndef slic3r_OG_CustomCtrl_hpp_
+#define slic3r_OG_CustomCtrl_hpp_
+
+#include <wx/stattext.h>
+#include <wx/settings.h>
+
+#include <map>
+#include <functional>
+
+#include "libslic3r/Config.hpp"
+#include "libslic3r/PrintConfig.hpp"
+
+#include "OptionsGroup.hpp"
+#include "I18N.hpp"
+
+// Translate the ifdef
+#ifdef __WXOSX__
+ #define wxOSX true
+#else
+ #define wxOSX false
+#endif
+
+namespace Slic3r { namespace GUI {
+
+// Static text shown among the options.
+class OG_CustomCtrl :public wxPanel
+{
+ wxFont m_font;
+ int m_v_gap;
+ int m_h_gap;
+ int m_em_unit;
+
+ wxSize m_bmp_mode_sz;
+ wxSize m_bmp_blinking_sz;
+
+ struct CtrlLine {
+ wxCoord height { wxDefaultCoord };
+ OG_CustomCtrl* ctrl { nullptr };
+ const Line& og_line;
+
+ bool draw_just_act_buttons { false };
+ bool draw_mode_bitmap { true };
+ bool is_visible { true };
+ bool is_focused { false };
+
+ CtrlLine( wxCoord height,
+ OG_CustomCtrl* ctrl,
+ const Line& og_line,
+ bool draw_just_act_buttons = false,
+ bool draw_mode_bitmap = true);
+ ~CtrlLine() { ctrl = nullptr; }
+
+ void correct_items_positions();
+ void msw_rescale();
+ void update_visibility(ConfigOptionMode mode);
+
+ void render(wxDC& dc, wxCoord v_pos);
+ wxCoord draw_mode_bmp(wxDC& dc, wxCoord v_pos);
+ wxCoord draw_text (wxDC& dc, wxPoint pos, const wxString& text, const wxColour* color, int width, bool is_url = false);
+ wxPoint draw_blinking_bmp(wxDC& dc, wxPoint pos, bool is_blinking);
+ wxCoord draw_act_bmps(wxDC& dc, wxPoint pos, const wxBitmap& bmp_undo_to_sys, const wxBitmap& bmp_undo, bool is_blinking, size_t rect_id = 0);
+ bool launch_browser() const;
+
+ std::vector<wxRect> rects_undo_icon;
+ std::vector<wxRect> rects_undo_to_sys_icon;
+ wxRect rect_label;
+ };
+
+ std::vector<CtrlLine> ctrl_lines;
+
+public:
+ OG_CustomCtrl( wxWindow* parent,
+ OptionsGroup* og,
+ const wxPoint& pos = wxDefaultPosition,
+ const wxSize& size = wxDefaultSize,
+ const wxValidator& val = wxDefaultValidator,
+ const wxString& name = wxEmptyString);
+ ~OG_CustomCtrl() {}
+
+ void OnPaint(wxPaintEvent&);
+ void OnMotion(wxMouseEvent& event);
+ void OnLeftDown(wxMouseEvent& event);
+ void OnLeaveWin(wxMouseEvent& event);
+
+ void init_ctrl_lines();
+ bool update_visibility(ConfigOptionMode mode);
+ void correct_window_position(wxWindow* win, const Line& line, Field* field = nullptr);
+ void correct_widgets_position(wxSizer* widget, const Line& line, Field* field = nullptr);
+
+ void msw_rescale();
+ void sys_color_changed();
+
+ wxPoint get_pos(const Line& line, Field* field = nullptr);
+ int get_height(const Line& line);
+
+ OptionsGroup* opt_group;
+
+};
+
+//-----------------------------------------------
+// RememberChoiceDialog
+//-----------------------------------------------
+
+class RememberChoiceDialog : public wxDialog
+{
+ wxCheckBox* m_remember_choice;
+public:
+ RememberChoiceDialog(wxWindow* parent, const wxString& msg_text, const wxString& caption);
+ ~RememberChoiceDialog() {}
+
+ bool remember_choice() const { return m_remember_choice->GetValue(); }
+};
+
+}}
+
+#endif /* slic3r_OG_CustomCtrl_hpp_ */
diff --git a/src/slic3r/GUI/ObjectDataViewModel.cpp b/src/slic3r/GUI/ObjectDataViewModel.cpp
index 649b3c32e..ef65f5974 100644
--- a/src/slic3r/GUI/ObjectDataViewModel.cpp
+++ b/src/slic3r/GUI/ObjectDataViewModel.cpp
@@ -5,6 +5,8 @@
#include "GUI_ObjectList.hpp"
#include "I18N.hpp"
+#include "libslic3r/Model.hpp"
+
#include <wx/bmpcbox.h>
#include <wx/dc.h>
@@ -113,10 +115,15 @@ void ObjectDataViewModelNode::set_action_and_extruder_icons()
m_type & (itVolume | itLayer) ? "cog" : /*m_type & itInstance*/ "set_separate_obj";
m_action_icon = create_scaled_bitmap(m_action_icon_name); // FIXME: pass window ptr
+ // set extruder bitmap
+ set_extruder_icon();
+}
+
+void ObjectDataViewModelNode::set_extruder_icon()
+{
if (m_type & itInstance)
return; // don't set colored bitmap for Instance
- // set extruder bitmap
int extruder_idx = atoi(m_extruder.c_str());
if (extruder_idx > 0) --extruder_idx;
m_extruder_bmp = get_extruder_color_icon(extruder_idx);
@@ -136,7 +143,7 @@ void ObjectDataViewModelNode::update_settings_digest_bitmaps()
std::map<std::string, wxBitmap>& categories_icon = Slic3r::GUI::wxGetApp().obj_list()->CATEGORY_ICON;
std::string scaled_bitmap_name = m_name.ToUTF8().data();
- scaled_bitmap_name += "-em" + std::to_string(Slic3r::GUI::wxGetApp().em_unit());
+ scaled_bitmap_name += "-em" + std::to_string(wxGetApp().em_unit()) + (wxGetApp().dark_mode() ? "-dm" : "");
wxBitmap *bmp = m_bitmap_cache->find(scaled_bitmap_name);
if (bmp == nullptr) {
@@ -178,6 +185,8 @@ void ObjectDataViewModelNode::msw_rescale()
if (!m_opt_categories.empty())
update_settings_digest_bitmaps();
+
+ set_extruder_icon();
}
bool ObjectDataViewModelNode::SetValue(const wxVariant& variant, unsigned col)
@@ -276,7 +285,7 @@ wxDataViewItem ObjectDataViewModel::AddVolumeChild( const wxDataViewItem &parent
const int extruder/* = 0*/,
const bool create_frst_child/* = true*/)
{
- ObjectDataViewModelNode *root = (ObjectDataViewModelNode*)parent_item.GetID();
+ ObjectDataViewModelNode *root = static_cast<ObjectDataViewModelNode*>(parent_item.GetID());
if (!root) return wxDataViewItem(0);
wxString extruder_str = extruder == 0 ? _(L("default")) : wxString::Format("%d", extruder);
@@ -322,7 +331,7 @@ wxDataViewItem ObjectDataViewModel::AddVolumeChild( const wxDataViewItem &parent
wxDataViewItem ObjectDataViewModel::AddSettingsChild(const wxDataViewItem &parent_item)
{
- ObjectDataViewModelNode *root = (ObjectDataViewModelNode*)parent_item.GetID();
+ ObjectDataViewModelNode *root = static_cast<ObjectDataViewModelNode*>(parent_item.GetID());
if (!root) return wxDataViewItem(0);
const auto node = new ObjectDataViewModelNode(root, itSettings);
@@ -361,7 +370,7 @@ static bool append_root_node(ObjectDataViewModelNode *parent_node,
wxDataViewItem ObjectDataViewModel::AddRoot(const wxDataViewItem &parent_item, ItemType root_type)
{
- ObjectDataViewModelNode *parent_node = (ObjectDataViewModelNode*)parent_item.GetID();
+ ObjectDataViewModelNode *parent_node = static_cast<ObjectDataViewModelNode*>(parent_item.GetID());
if (!parent_node) return wxDataViewItem(0);
// get InstanceRoot node
@@ -399,7 +408,7 @@ wxDataViewItem ObjectDataViewModel::AddInstanceChild(const wxDataViewItem& paren
const wxDataViewItem inst_root_item = AddInstanceRoot(parent_item);
if (!inst_root_item) return wxDataViewItem(0);
- ObjectDataViewModelNode* inst_root_node = (ObjectDataViewModelNode*)inst_root_item.GetID();
+ ObjectDataViewModelNode* inst_root_node = static_cast<ObjectDataViewModelNode*>(inst_root_item.GetID());
// Add instance nodes
ObjectDataViewModelNode *instance_node = nullptr;
@@ -428,7 +437,7 @@ void ObjectDataViewModel::UpdateObjectPrintable(wxDataViewItem parent_item)
if (!inst_root_item)
return;
- ObjectDataViewModelNode* inst_root_node = (ObjectDataViewModelNode*)inst_root_item.GetID();
+ ObjectDataViewModelNode* inst_root_node = static_cast<ObjectDataViewModelNode*>(inst_root_item.GetID());
const size_t child_cnt = inst_root_node->GetChildren().Count();
PrintIndicator obj_pi = piUnprintable;
@@ -438,7 +447,7 @@ void ObjectDataViewModel::UpdateObjectPrintable(wxDataViewItem parent_item)
break;
}
// and set printable state for object_node to piUndef
- ObjectDataViewModelNode* obj_node = (ObjectDataViewModelNode*)parent_item.GetID();
+ ObjectDataViewModelNode* obj_node = static_cast<ObjectDataViewModelNode*>(parent_item.GetID());
obj_node->set_printable_icon(obj_pi);
ItemChanged(parent_item);
}
@@ -450,10 +459,10 @@ void ObjectDataViewModel::UpdateInstancesPrintable(wxDataViewItem parent_item)
if (!inst_root_item)
return;
- ObjectDataViewModelNode* obj_node = (ObjectDataViewModelNode*)parent_item.GetID();
+ ObjectDataViewModelNode* obj_node = static_cast<ObjectDataViewModelNode*>(parent_item.GetID());
const PrintIndicator obj_pi = obj_node->IsPrintable();
- ObjectDataViewModelNode* inst_root_node = (ObjectDataViewModelNode*)inst_root_item.GetID();
+ ObjectDataViewModelNode* inst_root_node = static_cast<ObjectDataViewModelNode*>(inst_root_item.GetID());
const size_t child_cnt = inst_root_node->GetChildren().Count();
for (size_t i=0; i < child_cnt; i++)
@@ -467,7 +476,7 @@ void ObjectDataViewModel::UpdateInstancesPrintable(wxDataViewItem parent_item)
bool ObjectDataViewModel::IsPrintable(const wxDataViewItem& item) const
{
- ObjectDataViewModelNode* node = (ObjectDataViewModelNode*)item.GetID();
+ ObjectDataViewModelNode* node = static_cast<ObjectDataViewModelNode*>(item.GetID());
if (!node)
return false;
@@ -484,7 +493,7 @@ wxDataViewItem ObjectDataViewModel::AddLayersChild(const wxDataViewItem &parent_
const int extruder/* = 0*/,
const int index /* = -1*/)
{
- ObjectDataViewModelNode *parent_node = (ObjectDataViewModelNode*)parent_item.GetID();
+ ObjectDataViewModelNode *parent_node = static_cast<ObjectDataViewModelNode*>(parent_item.GetID());
if (!parent_node) return wxDataViewItem(0);
wxString extruder_str = extruder == 0 ? _(L("default")) : wxString::Format("%d", extruder);
@@ -521,7 +530,7 @@ wxDataViewItem ObjectDataViewModel::AddLayersChild(const wxDataViewItem &parent_
wxDataViewItem ObjectDataViewModel::Delete(const wxDataViewItem &item)
{
auto ret_item = wxDataViewItem(0);
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(item.GetID());
if (!node) // happens if item.IsOk()==false
return ret_item;
@@ -692,7 +701,7 @@ wxDataViewItem ObjectDataViewModel::Delete(const wxDataViewItem &item)
wxDataViewItem ObjectDataViewModel::DeleteLastInstance(const wxDataViewItem &parent_item, size_t num)
{
auto ret_item = wxDataViewItem(0);
- ObjectDataViewModelNode *parent_node = (ObjectDataViewModelNode*)parent_item.GetID();
+ ObjectDataViewModelNode *parent_node = static_cast<ObjectDataViewModelNode*>(parent_item.GetID());
if (!parent_node) return ret_item;
const int inst_root_id = get_root_idx(parent_node, itInstanceRoot);
@@ -746,7 +755,7 @@ void ObjectDataViewModel::DeleteAll()
void ObjectDataViewModel::DeleteChildren(wxDataViewItem& parent)
{
- ObjectDataViewModelNode *root = (ObjectDataViewModelNode*)parent.GetID();
+ ObjectDataViewModelNode *root = static_cast<ObjectDataViewModelNode*>(parent.GetID());
if (!root) // happens if item.IsOk()==false
return;
@@ -778,7 +787,7 @@ void ObjectDataViewModel::DeleteChildren(wxDataViewItem& parent)
void ObjectDataViewModel::DeleteVolumeChildren(wxDataViewItem& parent)
{
- ObjectDataViewModelNode *root = (ObjectDataViewModelNode*)parent.GetID();
+ ObjectDataViewModelNode *root = static_cast<ObjectDataViewModelNode*>(parent.GetID());
if (!root) // happens if item.IsOk()==false
return;
@@ -812,7 +821,7 @@ void ObjectDataViewModel::DeleteVolumeChildren(wxDataViewItem& parent)
void ObjectDataViewModel::DeleteSettings(const wxDataViewItem& parent)
{
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)parent.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(parent.GetID());
if (!node) return;
// if volume has a "settings"item, than delete it before volume deleting
@@ -871,7 +880,7 @@ wxDataViewItem ObjectDataViewModel::GetItemById(const int obj_idx, const int sub
if (!item)
return wxDataViewItem(0);
- auto parent = (ObjectDataViewModelNode*)item.GetID();
+ auto parent = static_cast<ObjectDataViewModelNode*>(item.GetID());
for (size_t i = 0; i < parent->GetChildCount(); i++)
if (parent->GetNthChild(i)->m_idx == sub_obj_idx)
return wxDataViewItem(parent->GetNthChild(i));
@@ -900,7 +909,7 @@ wxDataViewItem ObjectDataViewModel::GetItemByLayerRange(const int obj_idx, const
if (!item)
return wxDataViewItem(0);
- auto parent = (ObjectDataViewModelNode*)item.GetID();
+ auto parent = static_cast<ObjectDataViewModelNode*>(item.GetID());
for (size_t i = 0; i < parent->GetChildCount(); i++)
if (parent->GetNthChild(i)->m_layer_range == layer_range)
return wxDataViewItem(parent->GetNthChild(i));
@@ -922,7 +931,7 @@ int ObjectDataViewModel::GetIdByItem(const wxDataViewItem& item) const
if(!item.IsOk())
return -1;
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(item.GetID());
auto it = find(m_objects.begin(), m_objects.end(), node);
if (it == m_objects.end())
return -1;
@@ -934,7 +943,7 @@ int ObjectDataViewModel::GetIdByItemAndType(const wxDataViewItem& item, const It
{
wxASSERT(item.IsOk());
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(item.GetID());
if (!node || node->m_type != type)
return -1;
return node->GetIdx();
@@ -964,7 +973,7 @@ t_layer_height_range ObjectDataViewModel::GetLayerRangeByItem(const wxDataViewIt
{
wxASSERT(item.IsOk());
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(item.GetID());
if (!node || node->m_type != itLayer)
return { 0.0f, 0.0f };
return node->GetLayerRange();
@@ -1020,7 +1029,7 @@ void ObjectDataViewModel::GetItemInfo(const wxDataViewItem& item, ItemType& type
wxASSERT(item.IsOk());
type = itUndef;
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(item.GetID());
if (!node ||
node->GetIdx() <-1 ||
( node->GetIdx() == -1 &&
@@ -1089,7 +1098,7 @@ bool ObjectDataViewModel::InvalidItem(const wxDataViewItem& item)
if (!item)
return true;
- ObjectDataViewModelNode* node = (ObjectDataViewModelNode*)item.GetID();
+ ObjectDataViewModelNode* node = static_cast<ObjectDataViewModelNode*>(item.GetID());
if (!node || node->invalid())
return true;
@@ -1098,7 +1107,7 @@ bool ObjectDataViewModel::InvalidItem(const wxDataViewItem& item)
wxString ObjectDataViewModel::GetName(const wxDataViewItem &item) const
{
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(item.GetID());
if (!node) // happens if item.IsOk()==false
return wxEmptyString;
@@ -1107,13 +1116,13 @@ wxString ObjectDataViewModel::GetName(const wxDataViewItem &item) const
wxBitmap& ObjectDataViewModel::GetBitmap(const wxDataViewItem &item) const
{
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(item.GetID());
return node->m_bmp;
}
wxString ObjectDataViewModel::GetExtruder(const wxDataViewItem& item) const
{
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(item.GetID());
if (!node) // happens if item.IsOk()==false
return wxEmptyString;
@@ -1122,7 +1131,7 @@ wxString ObjectDataViewModel::GetExtruder(const wxDataViewItem& item) const
int ObjectDataViewModel::GetExtruderNumber(const wxDataViewItem& item) const
{
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(item.GetID());
if (!node) // happens if item.IsOk()==false
return 0;
@@ -1133,7 +1142,7 @@ void ObjectDataViewModel::GetValue(wxVariant &variant, const wxDataViewItem &ite
{
wxASSERT(item.IsOk());
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(item.GetID());
switch (col)
{
case colPrint:
@@ -1157,7 +1166,7 @@ bool ObjectDataViewModel::SetValue(const wxVariant &variant, const wxDataViewIte
{
wxASSERT(item.IsOk());
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(item.GetID());
return node->SetValue(variant, col);
}
@@ -1187,7 +1196,7 @@ void ObjectDataViewModel::SetExtruder(const wxString& extruder, wxDataViewItem i
void ObjectDataViewModel::AddAllChildren(const wxDataViewItem& parent)
{
- ObjectDataViewModelNode* node = (ObjectDataViewModelNode*)parent.GetID();
+ ObjectDataViewModelNode* node = static_cast<ObjectDataViewModelNode*>(parent.GetID());
if (!node || node->GetChildCount() == 0)
return;
@@ -1213,7 +1222,7 @@ wxDataViewItem ObjectDataViewModel::ReorganizeChildren( const int current_volume
if (current_volume_id == new_volume_id)
return ret_item;
wxASSERT(parent.IsOk());
- ObjectDataViewModelNode *node_parent = (ObjectDataViewModelNode*)parent.GetID();
+ ObjectDataViewModelNode *node_parent = static_cast<ObjectDataViewModelNode*>(parent.GetID());
if (!node_parent) // happens if item.IsOk()==false
return ret_item;
@@ -1261,7 +1270,7 @@ wxDataViewItem ObjectDataViewModel::ReorganizeObjects( const int current_id, co
bool ObjectDataViewModel::IsEnabled(const wxDataViewItem &item, unsigned int col) const
{
wxASSERT(item.IsOk());
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(item.GetID());
// disable extruder selection for the non "itObject|itVolume" item
return !(col == colExtruder && node->m_extruder.IsEmpty());
@@ -1273,7 +1282,7 @@ wxDataViewItem ObjectDataViewModel::GetParent(const wxDataViewItem &item) const
if (!item.IsOk())
return wxDataViewItem(0);
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(item.GetID());
assert(node != nullptr && node->valid());
// objects nodes has no parent too
@@ -1289,7 +1298,7 @@ wxDataViewItem ObjectDataViewModel::GetTopParent(const wxDataViewItem &item) con
if (!item.IsOk())
return wxDataViewItem(0);
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(item.GetID());
if (node->m_type == itObject)
return item;
@@ -1306,13 +1315,13 @@ bool ObjectDataViewModel::IsContainer(const wxDataViewItem &item) const
if (!item.IsOk())
return true;
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(item.GetID());
return node->IsContainer();
}
unsigned int ObjectDataViewModel::GetChildren(const wxDataViewItem &parent, wxDataViewItemArray &array) const
{
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)parent.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(parent.GetID());
if (!node)
{
for (auto object : m_objects)
@@ -1337,7 +1346,7 @@ unsigned int ObjectDataViewModel::GetChildren(const wxDataViewItem &parent, wxDa
void ObjectDataViewModel::GetAllChildren(const wxDataViewItem &parent, wxDataViewItemArray &array) const
{
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)parent.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(parent.GetID());
if (!node) {
for (auto object : m_objects)
array.Add(wxDataViewItem((void*)object));
@@ -1365,7 +1374,7 @@ ItemType ObjectDataViewModel::GetItemType(const wxDataViewItem &item) const
{
if (!item.IsOk())
return itUndef;
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(item.GetID());
return node->m_type < 0 ? itUndef : node->m_type;
}
@@ -1374,7 +1383,7 @@ wxDataViewItem ObjectDataViewModel::GetItemByType(const wxDataViewItem &parent_i
if (!parent_item.IsOk())
return wxDataViewItem(0);
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)parent_item.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(parent_item.GetID());
if (node->GetChildCount() == 0)
return wxDataViewItem(0);
@@ -1405,7 +1414,7 @@ bool ObjectDataViewModel::IsSettingsItem(const wxDataViewItem &item) const
{
if (!item.IsOk())
return false;
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(item.GetID());
return node->m_type == itSettings;
}
@@ -1413,7 +1422,7 @@ void ObjectDataViewModel::UpdateSettingsDigest(const wxDataViewItem &item,
const std::vector<std::string>& categories)
{
if (!item.IsOk()) return;
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(item.GetID());
if (!node->update_settings_digest(categories))
return;
ItemChanged(item);
@@ -1424,7 +1433,7 @@ void ObjectDataViewModel::SetVolumeType(const wxDataViewItem &item, const Slic3r
if (!item.IsOk() || GetItemType(item) != itVolume)
return;
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(item.GetID());
node->SetBitmap(*m_volume_bmps[int(type)]);
ItemChanged(item);
}
@@ -1442,7 +1451,7 @@ wxDataViewItem ObjectDataViewModel::SetPrintableState(
item = subobj_type&itInstance ? GetItemByInstanceId(obj_idx, subobj_idx) :
GetItemByVolumeId(obj_idx, subobj_idx);
- ObjectDataViewModelNode* node = (ObjectDataViewModelNode*)item.GetID();
+ ObjectDataViewModelNode* node = static_cast<ObjectDataViewModelNode*>(item.GetID());
if (!node)
return wxDataViewItem(0);
node->set_printable_icon(printable);
@@ -1458,7 +1467,7 @@ wxDataViewItem ObjectDataViewModel::SetObjectPrintableState(
PrintIndicator printable,
wxDataViewItem obj_item)
{
- ObjectDataViewModelNode* node = (ObjectDataViewModelNode*)obj_item.GetID();
+ ObjectDataViewModelNode* node = static_cast<ObjectDataViewModelNode*>(obj_item.GetID());
if (!node)
return wxDataViewItem(0);
node->set_printable_icon(printable);
@@ -1479,7 +1488,7 @@ void ObjectDataViewModel::Rescale()
if (!item.IsOk())
continue;
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(item.GetID());
node->msw_rescale();
switch (node->m_type)
@@ -1528,7 +1537,7 @@ void ObjectDataViewModel::DeleteWarningIcon(const wxDataViewItem& item, const bo
if (!item.IsOk())
return;
- ObjectDataViewModelNode *node = (ObjectDataViewModelNode*)item.GetID();
+ ObjectDataViewModelNode *node = static_cast<ObjectDataViewModelNode*>(item.GetID());
if (!node->GetBitmap().IsOk() || !(node->GetType() & (itVolume | itObject)))
return;
@@ -1547,244 +1556,6 @@ void ObjectDataViewModel::DeleteWarningIcon(const wxDataViewItem& item, const bo
DeleteWarningIcon(child);
}
}
-/*
-}
-}
-*/
-//-----------------------------------------------------------------------------
-// DataViewBitmapText
-//-----------------------------------------------------------------------------
-
-wxIMPLEMENT_DYNAMIC_CLASS(DataViewBitmapText, wxObject)
-
-IMPLEMENT_VARIANT_OBJECT(DataViewBitmapText)
-
-// ---------------------------------------------------------
-// BitmapTextRenderer
-// ---------------------------------------------------------
-
-#if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING
-BitmapTextRenderer::BitmapTextRenderer(wxDataViewCellMode mode /*= wxDATAVIEW_CELL_EDITABLE*/,
- int align /*= wxDVR_DEFAULT_ALIGNMENT*/):
-wxDataViewRenderer(wxT("PrusaDataViewBitmapText"), mode, align)
-{
- SetMode(mode);
- SetAlignment(align);
-}
-#endif // ENABLE_NONCUSTOM_DATA_VIEW_RENDERING
-
-bool BitmapTextRenderer::SetValue(const wxVariant &value)
-{
- m_value << value;
- return true;
-}
-
-bool BitmapTextRenderer::GetValue(wxVariant& WXUNUSED(value)) const
-{
- return false;
-}
-
-#if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING && wxUSE_ACCESSIBILITY
-wxString BitmapTextRenderer::GetAccessibleDescription() const
-{
- return m_value.GetText();
-}
-#endif // wxUSE_ACCESSIBILITY && ENABLE_NONCUSTOM_DATA_VIEW_RENDERING
-
-bool BitmapTextRenderer::Render(wxRect rect, wxDC *dc, int state)
-{
- int xoffset = 0;
-
- const wxBitmap& icon = m_value.GetBitmap();
- if (icon.IsOk())
- {
-#ifdef __APPLE__
- wxSize icon_sz = icon.GetScaledSize();
-#else
- wxSize icon_sz = icon.GetSize();
-#endif
- dc->DrawBitmap(icon, rect.x, rect.y + (rect.height - icon_sz.y) / 2);
- xoffset = icon_sz.x + 4;
- }
-
- RenderText(m_value.GetText(), xoffset, rect, dc, state);
-
- return true;
-}
-
-wxSize BitmapTextRenderer::GetSize() const
-{
- if (!m_value.GetText().empty())
- {
- wxSize size = GetTextExtent(m_value.GetText());
-
- if (m_value.GetBitmap().IsOk())
- size.x += m_value.GetBitmap().GetWidth() + 4;
- return size;
- }
- return wxSize(80, 20);
-}
-
-
-wxWindow* BitmapTextRenderer::CreateEditorCtrl(wxWindow* parent, wxRect labelRect, const wxVariant& value)
-{
- wxDataViewCtrl* const dv_ctrl = GetOwner()->GetOwner();
- ObjectDataViewModel* const model = dynamic_cast<ObjectDataViewModel*>(dv_ctrl->GetModel());
-
- if ( !(model->GetItemType(dv_ctrl->GetSelection()) & (itVolume | itObject)) )
- return nullptr;
-
- DataViewBitmapText data;
- data << value;
-
- m_was_unusable_symbol = false;
-
- wxPoint position = labelRect.GetPosition();
- if (data.GetBitmap().IsOk()) {
- const int bmp_width = data.GetBitmap().GetWidth();
- position.x += bmp_width;
- labelRect.SetWidth(labelRect.GetWidth() - bmp_width);
- }
-
- wxTextCtrl* text_editor = new wxTextCtrl(parent, wxID_ANY, data.GetText(),
- position, labelRect.GetSize(), wxTE_PROCESS_ENTER);
- text_editor->SetInsertionPointEnd();
- text_editor->SelectAll();
-
- return text_editor;
-}
-
-bool BitmapTextRenderer::GetValueFromEditorCtrl(wxWindow* ctrl, wxVariant& value)
-{
- wxTextCtrl* text_editor = wxDynamicCast(ctrl, wxTextCtrl);
- if (!text_editor || text_editor->GetValue().IsEmpty())
- return false;
-
- std::string chosen_name = Slic3r::normalize_utf8_nfc(text_editor->GetValue().ToUTF8());
- const char* unusable_symbols = "<>:/\\|?*\"";
- for (size_t i = 0; i < std::strlen(unusable_symbols); i++) {
- if (chosen_name.find_first_of(unusable_symbols[i]) != std::string::npos) {
- m_was_unusable_symbol = true;
- return false;
- }
- }
-
- // The icon can't be edited so get its old value and reuse it.
- wxVariant valueOld;
- GetView()->GetModel()->GetValue(valueOld, m_item, colName);
-
- DataViewBitmapText bmpText;
- bmpText << valueOld;
-
- // But replace the text with the value entered by user.
- bmpText.SetText(text_editor->GetValue());
-
- value << bmpText;
- return true;
-}
-
-// ----------------------------------------------------------------------------
-// BitmapChoiceRenderer
-// ----------------------------------------------------------------------------
-
-bool BitmapChoiceRenderer::SetValue(const wxVariant& value)
-{
- m_value << value;
- return true;
-}
-
-bool BitmapChoiceRenderer::GetValue(wxVariant& value) const
-{
- value << m_value;
- return true;
-}
-
-bool BitmapChoiceRenderer::Render(wxRect rect, wxDC* dc, int state)
-{
- int xoffset = 0;
-
- const wxBitmap& icon = m_value.GetBitmap();
- if (icon.IsOk())
- {
- dc->DrawBitmap(icon, rect.x, rect.y + (rect.height - icon.GetHeight()) / 2);
- xoffset = icon.GetWidth() + 4;
- }
-
- if (rect.height==0)
- rect.height= icon.GetHeight();
- RenderText(m_value.GetText(), xoffset, rect, dc, state);
-
- return true;
-}
-
-wxSize BitmapChoiceRenderer::GetSize() const
-{
- wxSize sz = GetTextExtent(m_value.GetText());
-
- if (m_value.GetBitmap().IsOk())
- sz.x += m_value.GetBitmap().GetWidth() + 4;
-
- return sz;
-}
-
-
-wxWindow* BitmapChoiceRenderer::CreateEditorCtrl(wxWindow* parent, wxRect labelRect, const wxVariant& value)
-{
- wxDataViewCtrl* const dv_ctrl = GetOwner()->GetOwner();
- ObjectDataViewModel* const model = dynamic_cast<ObjectDataViewModel*>(dv_ctrl->GetModel());
-
- if (!(model->GetItemType(dv_ctrl->GetSelection()) & (itVolume | itLayer | itObject)))
- return nullptr;
-
- std::vector<wxBitmap*> icons = get_extruder_color_icons();
- if (icons.empty())
- return nullptr;
-
- DataViewBitmapText data;
- data << value;
-
- auto c_editor = new wxBitmapComboBox(parent, wxID_ANY, wxEmptyString,
- labelRect.GetTopLeft(), wxSize(labelRect.GetWidth(), -1),
- 0, nullptr , wxCB_READONLY);
-
- int i=0;
- for (wxBitmap* bmp : icons) {
- if (i==0) {
- c_editor->Append(_(L("default")), *bmp);
- ++i;
- }
-
- c_editor->Append(wxString::Format("%d", i), *bmp);
- ++i;
- }
- c_editor->SetSelection(atoi(data.GetText().c_str()));
-
- // to avoid event propagation to other sidebar items
- c_editor->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent& evt) {
- evt.StopPropagation();
- // FinishEditing grabs new selection and triggers config update. We better call
- // it explicitly, automatic update on KILL_FOCUS didn't work on Linux.
- this->FinishEditing();
- });
-
- return c_editor;
-}
-
-bool BitmapChoiceRenderer::GetValueFromEditorCtrl(wxWindow* ctrl, wxVariant& value)
-{
- wxBitmapComboBox* c = (wxBitmapComboBox*)ctrl;
- int selection = c->GetSelection();
- if (selection < 0)
- return false;
-
- DataViewBitmapText bmpText;
-
- bmpText.SetText(c->GetString(selection));
- bmpText.SetBitmap(c->GetItemBitmap(selection));
-
- value << bmpText;
- return true;
-}
} // namespace GUI
} // namespace Slic3r
diff --git a/src/slic3r/GUI/ObjectDataViewModel.hpp b/src/slic3r/GUI/ObjectDataViewModel.hpp
index c18484266..17ad2047f 100644
--- a/src/slic3r/GUI/ObjectDataViewModel.hpp
+++ b/src/slic3r/GUI/ObjectDataViewModel.hpp
@@ -2,9 +2,10 @@
#define slic3r_GUI_ObjectDataViewModel_hpp_
#include <wx/dataview.h>
-
#include <vector>
+#include "ExtraRenderers.hpp"
+
namespace Slic3r {
enum class ModelVolumeType : int;
@@ -15,143 +16,6 @@ typedef double coordf_t;
typedef std::pair<coordf_t, coordf_t> t_layer_height_range;
// ----------------------------------------------------------------------------
-// DataViewBitmapText: helper class used by BitmapTextRenderer
-// ----------------------------------------------------------------------------
-
-class DataViewBitmapText : public wxObject
-{
-public:
- DataViewBitmapText( const wxString &text = wxEmptyString,
- const wxBitmap& bmp = wxNullBitmap) :
- m_text(text),
- m_bmp(bmp)
- { }
-
- DataViewBitmapText(const DataViewBitmapText &other)
- : wxObject(),
- m_text(other.m_text),
- m_bmp(other.m_bmp)
- { }
-
- void SetText(const wxString &text) { m_text = text; }
- wxString GetText() const { return m_text; }
- void SetBitmap(const wxBitmap &bmp) { m_bmp = bmp; }
- const wxBitmap &GetBitmap() const { return m_bmp; }
-
- bool IsSameAs(const DataViewBitmapText& other) const {
- return m_text == other.m_text && m_bmp.IsSameAs(other.m_bmp);
- }
-
- bool operator==(const DataViewBitmapText& other) const {
- return IsSameAs(other);
- }
-
- bool operator!=(const DataViewBitmapText& other) const {
- return !IsSameAs(other);
- }
-
-private:
- wxString m_text;
- wxBitmap m_bmp;
-
- wxDECLARE_DYNAMIC_CLASS(DataViewBitmapText);
-};
-DECLARE_VARIANT_OBJECT(DataViewBitmapText)
-
-// ----------------------------------------------------------------------------
-// BitmapTextRenderer
-// ----------------------------------------------------------------------------
-#if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING
-class BitmapTextRenderer : public wxDataViewRenderer
-#else
-class BitmapTextRenderer : public wxDataViewCustomRenderer
-#endif //ENABLE_NONCUSTOM_DATA_VIEW_RENDERING
-{
-public:
- BitmapTextRenderer(wxWindow* parent,
- wxDataViewCellMode mode =
-#ifdef __WXOSX__
- wxDATAVIEW_CELL_INERT
-#else
- wxDATAVIEW_CELL_EDITABLE
-#endif
-
- , int align = wxDVR_DEFAULT_ALIGNMENT
-#if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING
- );
-#else
- ) :
- wxDataViewCustomRenderer(wxT("DataViewBitmapText"), mode, align),
- m_parent(parent)
- {}
-#endif //ENABLE_NONCUSTOM_DATA_VIEW_RENDERING
-
- bool SetValue(const wxVariant& value);
- bool GetValue(wxVariant& value) const;
-#if ENABLE_NONCUSTOM_DATA_VIEW_RENDERING && wxUSE_ACCESSIBILITY
- virtual wxString GetAccessibleDescription() const override;
-#endif // wxUSE_ACCESSIBILITY && ENABLE_NONCUSTOM_DATA_VIEW_RENDERING
-
- virtual bool Render(wxRect cell, wxDC* dc, int state) override;
- virtual wxSize GetSize() const override;
-
- bool HasEditorCtrl() const override
- {
-#ifdef __WXOSX__
- return false;
-#else
- return true;
-#endif
- }
- wxWindow* CreateEditorCtrl(wxWindow* parent,
- wxRect labelRect,
- const wxVariant& value) override;
- bool GetValueFromEditorCtrl(wxWindow* ctrl,
- wxVariant& value) override;
- bool WasCanceled() const { return m_was_unusable_symbol; }
-
-private:
- DataViewBitmapText m_value;
- bool m_was_unusable_symbol{ false };
- wxWindow* m_parent{ nullptr };
-};
-
-
-// ----------------------------------------------------------------------------
-// BitmapChoiceRenderer
-// ----------------------------------------------------------------------------
-
-class BitmapChoiceRenderer : public wxDataViewCustomRenderer
-{
-public:
- BitmapChoiceRenderer(wxDataViewCellMode mode =
-#ifdef __WXOSX__
- wxDATAVIEW_CELL_INERT
-#else
- wxDATAVIEW_CELL_EDITABLE
-#endif
- , int align = wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL
- ) : wxDataViewCustomRenderer(wxT("DataViewBitmapText"), mode, align) {}
-
- bool SetValue(const wxVariant& value);
- bool GetValue(wxVariant& value) const;
-
- virtual bool Render(wxRect cell, wxDC* dc, int state) override;
- virtual wxSize GetSize() const override;
-
- bool HasEditorCtrl() const override { return true; }
- wxWindow* CreateEditorCtrl(wxWindow* parent,
- wxRect labelRect,
- const wxVariant& value) override;
- bool GetValueFromEditorCtrl(wxWindow* ctrl,
- wxVariant& value) override;
-
-private:
- DataViewBitmapText m_value;
-};
-
-
-// ----------------------------------------------------------------------------
// ObjectDataViewModelNode: a node inside ObjectDataViewModel
// ----------------------------------------------------------------------------
enum ItemType {
@@ -345,8 +209,10 @@ public:
return true;
}
- // Set action icons for node
+ // Set action and extruder(if any exist) icons for node
void set_action_and_extruder_icons();
+ // set extruder icon for node
+ void set_extruder_icon();
// Set printable icon for node
void set_printable_icon(PrintIndicator printable);
@@ -434,15 +300,15 @@ public:
// helper methods to change the model
- virtual unsigned int GetColumnCount() const override { return 3;}
- virtual wxString GetColumnType(unsigned int col) const override{ return wxT("string"); }
+ unsigned int GetColumnCount() const override { return 3;}
+ wxString GetColumnType(unsigned int col) const override{ return wxT("string"); }
- virtual void GetValue( wxVariant &variant,
- const wxDataViewItem &item,
- unsigned int col) const override;
- virtual bool SetValue( const wxVariant &variant,
- const wxDataViewItem &item,
- unsigned int col) override;
+ void GetValue( wxVariant &variant,
+ const wxDataViewItem &item,
+ unsigned int col) const override;
+ bool SetValue( const wxVariant &variant,
+ const wxDataViewItem &item,
+ unsigned int col) override;
bool SetValue( const wxVariant &variant,
const int item_idx,
unsigned int col);
@@ -456,18 +322,17 @@ public:
const wxDataViewItem &parent);
wxDataViewItem ReorganizeObjects( int current_id, int new_id);
- virtual bool IsEnabled(const wxDataViewItem &item, unsigned int col) const override;
+ bool IsEnabled(const wxDataViewItem &item, unsigned int col) const override;
- virtual wxDataViewItem GetParent(const wxDataViewItem &item) const override;
+ wxDataViewItem GetParent(const wxDataViewItem &item) const override;
// get object item
wxDataViewItem GetTopParent(const wxDataViewItem &item) const;
- virtual bool IsContainer(const wxDataViewItem &item) const override;
- virtual unsigned int GetChildren(const wxDataViewItem &parent,
- wxDataViewItemArray &array) const override;
+ bool IsContainer(const wxDataViewItem &item) const override;
+ unsigned int GetChildren(const wxDataViewItem &parent, wxDataViewItemArray &array) const override;
void GetAllChildren(const wxDataViewItem &parent,wxDataViewItemArray &array) const;
// Is the container just a header or an item with all columns
// In our case it is an item with all columns
- virtual bool HasContainerColumns(const wxDataViewItem& WXUNUSED(item)) const override { return true; }
+ bool HasContainerColumns(const wxDataViewItem& WXUNUSED(item)) const override { return true; }
ItemType GetItemType(const wxDataViewItem &item) const ;
wxDataViewItem GetItemByType( const wxDataViewItem &parent_item,
diff --git a/src/slic3r/GUI/OpenGLManager.cpp b/src/slic3r/GUI/OpenGLManager.cpp
new file mode 100644
index 000000000..4f1e00793
--- /dev/null
+++ b/src/slic3r/GUI/OpenGLManager.cpp
@@ -0,0 +1,342 @@
+#include "libslic3r/libslic3r.h"
+#include "OpenGLManager.hpp"
+
+#include "GUI.hpp"
+#include "I18N.hpp"
+#include "3DScene.hpp"
+
+#include <GL/glew.h>
+
+#include <boost/algorithm/string/split.hpp>
+#include <boost/algorithm/string/classification.hpp>
+#include <boost/log/trivial.hpp>
+
+#include <wx/glcanvas.h>
+#include <wx/msgdlg.h>
+
+#if ENABLE_HACK_CLOSING_ON_OSX_10_9_5
+#ifdef __APPLE__
+// Part of hack to remove crash when closing the application on OSX 10.9.5 when building against newer wxWidgets
+#include <wx/platinfo.h>
+#endif // __APPLE__
+#endif // ENABLE_HACK_CLOSING_ON_OSX_10_9_5
+
+#ifdef __APPLE__
+#include "../Utils/MacDarkMode.hpp"
+#endif // __APPLE__
+
+namespace Slic3r {
+namespace GUI {
+
+// A safe wrapper around glGetString to report a "N/A" string in case glGetString returns nullptr.
+inline std::string gl_get_string_safe(GLenum param, const std::string& default_value)
+{
+ const char* value = (const char*)::glGetString(param);
+ return std::string((value != nullptr) ? value : default_value);
+}
+
+const std::string& OpenGLManager::GLInfo::get_version() const
+{
+ if (!m_detected)
+ detect();
+
+ return m_version;
+}
+
+const std::string& OpenGLManager::GLInfo::get_glsl_version() const
+{
+ if (!m_detected)
+ detect();
+
+ return m_glsl_version;
+}
+
+const std::string& OpenGLManager::GLInfo::get_vendor() const
+{
+ if (!m_detected)
+ detect();
+
+ return m_vendor;
+}
+
+const std::string& OpenGLManager::GLInfo::get_renderer() const
+{
+ if (!m_detected)
+ detect();
+
+ return m_renderer;
+}
+
+int OpenGLManager::GLInfo::get_max_tex_size() const
+{
+ if (!m_detected)
+ detect();
+
+ // clamp to avoid the texture generation become too slow and use too much GPU memory
+#ifdef __APPLE__
+ // and use smaller texture for non retina systems
+ return (Slic3r::GUI::mac_max_scaling_factor() > 1.0) ? std::min(m_max_tex_size, 8192) : std::min(m_max_tex_size / 2, 4096);
+#else
+ // and use smaller texture for older OpenGL versions
+ return is_version_greater_or_equal_to(3, 0) ? std::min(m_max_tex_size, 8192) : std::min(m_max_tex_size / 2, 4096);
+#endif // __APPLE__
+}
+
+float OpenGLManager::GLInfo::get_max_anisotropy() const
+{
+ if (!m_detected)
+ detect();
+
+ return m_max_anisotropy;
+}
+
+void OpenGLManager::GLInfo::detect() const
+{
+ m_version = gl_get_string_safe(GL_VERSION, "N/A");
+ m_glsl_version = gl_get_string_safe(GL_SHADING_LANGUAGE_VERSION, "N/A");
+ m_vendor = gl_get_string_safe(GL_VENDOR, "N/A");
+ m_renderer = gl_get_string_safe(GL_RENDERER, "N/A");
+
+ glsafe(::glGetIntegerv(GL_MAX_TEXTURE_SIZE, &m_max_tex_size));
+
+ m_max_tex_size /= 2;
+
+ if (Slic3r::total_physical_memory() / (1024 * 1024 * 1024) < 6)
+ m_max_tex_size /= 2;
+
+ if (GLEW_EXT_texture_filter_anisotropic)
+ glsafe(::glGetFloatv(GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &m_max_anisotropy));
+
+ m_detected = true;
+}
+
+static bool version_greater_or_equal_to(const std::string& version, unsigned int major, unsigned int minor)
+{
+ if (version == "N/A")
+ return false;
+
+ std::vector<std::string> tokens;
+ boost::split(tokens, version, boost::is_any_of(" "), boost::token_compress_on);
+
+ if (tokens.empty())
+ return false;
+
+ std::vector<std::string> numbers;
+ boost::split(numbers, tokens[0], boost::is_any_of("."), boost::token_compress_on);
+
+ unsigned int gl_major = 0;
+ unsigned int gl_minor = 0;
+
+ if (numbers.size() > 0)
+ gl_major = ::atoi(numbers[0].c_str());
+
+ if (numbers.size() > 1)
+ gl_minor = ::atoi(numbers[1].c_str());
+
+ if (gl_major < major)
+ return false;
+ else if (gl_major > major)
+ return true;
+ else
+ return gl_minor >= minor;
+}
+
+bool OpenGLManager::GLInfo::is_version_greater_or_equal_to(unsigned int major, unsigned int minor) const
+{
+ if (!m_detected)
+ detect();
+
+ return version_greater_or_equal_to(m_version, major, minor);
+}
+
+bool OpenGLManager::GLInfo::is_glsl_version_greater_or_equal_to(unsigned int major, unsigned int minor) const
+{
+ if (!m_detected)
+ detect();
+
+ return version_greater_or_equal_to(m_glsl_version, major, minor);
+}
+
+std::string OpenGLManager::GLInfo::to_string(bool format_as_html, bool extensions) const
+{
+ if (!m_detected)
+ detect();
+
+ std::stringstream out;
+
+ std::string h2_start = format_as_html ? "<b>" : "";
+ std::string h2_end = format_as_html ? "</b>" : "";
+ std::string b_start = format_as_html ? "<b>" : "";
+ std::string b_end = format_as_html ? "</b>" : "";
+ std::string line_end = format_as_html ? "<br>" : "\n";
+
+ out << h2_start << "OpenGL installation" << h2_end << line_end;
+ out << b_start << "GL version: " << b_end << m_version << line_end;
+ out << b_start << "Vendor: " << b_end << m_vendor << line_end;
+ out << b_start << "Renderer: " << b_end << m_renderer << line_end;
+ out << b_start << "GLSL version: " << b_end << m_glsl_version << line_end;
+
+ if (extensions)
+ {
+ std::vector<std::string> extensions_list;
+ std::string extensions_str = gl_get_string_safe(GL_EXTENSIONS, "");
+ boost::split(extensions_list, extensions_str, boost::is_any_of(" "), boost::token_compress_off);
+
+ if (!extensions_list.empty())
+ {
+ out << h2_start << "Installed extensions:" << h2_end << line_end;
+
+ std::sort(extensions_list.begin(), extensions_list.end());
+ for (const std::string& ext : extensions_list)
+ {
+ out << ext << line_end;
+ }
+ }
+ }
+
+ return out.str();
+}
+
+OpenGLManager::GLInfo OpenGLManager::s_gl_info;
+bool OpenGLManager::s_compressed_textures_supported = false;
+OpenGLManager::EMultisampleState OpenGLManager::s_multisample = OpenGLManager::EMultisampleState::Unknown;
+OpenGLManager::EFramebufferType OpenGLManager::s_framebuffers_type = OpenGLManager::EFramebufferType::Unknown;
+
+#if ENABLE_HACK_CLOSING_ON_OSX_10_9_5
+#ifdef __APPLE__
+// Part of hack to remove crash when closing the application on OSX 10.9.5 when building against newer wxWidgets
+OpenGLManager::OSInfo OpenGLManager::s_os_info;
+#endif // __APPLE__
+#endif // ENABLE_HACK_CLOSING_ON_OSX_10_9_5
+
+OpenGLManager::~OpenGLManager()
+{
+ m_shaders_manager.shutdown();
+
+#if ENABLE_HACK_CLOSING_ON_OSX_10_9_5
+#ifdef __APPLE__
+ // This is an ugly hack needed to solve the crash happening when closing the application on OSX 10.9.5 with newer wxWidgets
+ // The crash is triggered inside wxGLContext destructor
+ if (s_os_info.major != 10 || s_os_info.minor != 9 || s_os_info.micro != 5)
+ {
+#endif //__APPLE__
+#endif // ENABLE_HACK_CLOSING_ON_OSX_10_9_5
+
+ if (m_context != nullptr)
+ delete m_context;
+
+#if ENABLE_HACK_CLOSING_ON_OSX_10_9_5
+#ifdef __APPLE__
+ }
+#endif //__APPLE__
+#endif // ENABLE_HACK_CLOSING_ON_OSX_10_9_5
+}
+
+bool OpenGLManager::init_gl()
+{
+ if (!m_gl_initialized) {
+ if (glewInit() != GLEW_OK) {
+ BOOST_LOG_TRIVIAL(error) << "Unable to init glew library";
+ return false;
+ }
+ m_gl_initialized = true;
+ if (GLEW_EXT_texture_compression_s3tc)
+ s_compressed_textures_supported = true;
+ else
+ s_compressed_textures_supported = false;
+
+ if (GLEW_ARB_framebuffer_object)
+ s_framebuffers_type = EFramebufferType::Arb;
+ else if (GLEW_EXT_framebuffer_object)
+ s_framebuffers_type = EFramebufferType::Ext;
+ else
+ s_framebuffers_type = EFramebufferType::Unknown;
+
+ bool valid_version = s_gl_info.is_version_greater_or_equal_to(2, 0);
+ if (!valid_version) {
+ // Complain about the OpenGL version.
+ wxString message = from_u8((boost::format(
+ _utf8(L("PrusaSlicer requires OpenGL 2.0 capable graphics driver to run correctly, \n"
+ "while OpenGL version %s, render %s, vendor %s was detected."))) % s_gl_info.get_version() % s_gl_info.get_renderer() % s_gl_info.get_vendor()).str());
+ message += "\n";
+ message += _L("You may need to update your graphics card driver.");
+#ifdef _WIN32
+ message += "\n";
+ message += _L("As a workaround, you may run PrusaSlicer with a software rendered 3D graphics by running prusa-slicer.exe with the --sw_renderer parameter.");
+#endif
+ wxMessageBox(message, wxString("PrusaSlicer - ") + _L("Unsupported OpenGL version"), wxOK | wxICON_ERROR);
+ }
+
+ if (valid_version) {
+ // load shaders
+ auto [result, error] = m_shaders_manager.init();
+ if (!result) {
+ wxString message = from_u8((boost::format(
+ _utf8(L("Unable to load the following shaders:\n%s"))) % error).str());
+ wxMessageBox(message, wxString("PrusaSlicer - ") + _L("Error loading shaders"), wxOK | wxICON_ERROR);
+ }
+ }
+ }
+
+ return true;
+}
+
+wxGLContext* OpenGLManager::init_glcontext(wxGLCanvas& canvas)
+{
+ if (m_context == nullptr) {
+ m_context = new wxGLContext(&canvas);
+
+#if ENABLE_HACK_CLOSING_ON_OSX_10_9_5
+#ifdef __APPLE__
+ // Part of hack to remove crash when closing the application on OSX 10.9.5 when building against newer wxWidgets
+ s_os_info.major = wxPlatformInfo::Get().GetOSMajorVersion();
+ s_os_info.minor = wxPlatformInfo::Get().GetOSMinorVersion();
+ s_os_info.micro = wxPlatformInfo::Get().GetOSMicroVersion();
+#endif //__APPLE__
+#endif // ENABLE_HACK_CLOSING_ON_OSX_10_9_5
+ }
+ return m_context;
+}
+
+wxGLCanvas* OpenGLManager::create_wxglcanvas(wxWindow& parent)
+{
+ int attribList[] = {
+ WX_GL_RGBA,
+ WX_GL_DOUBLEBUFFER,
+ // RGB channels each should be allocated with 8 bit depth. One should almost certainly get these bit depths by default.
+ WX_GL_MIN_RED, 8,
+ WX_GL_MIN_GREEN, 8,
+ WX_GL_MIN_BLUE, 8,
+ // Requesting an 8 bit alpha channel. Interestingly, the NVIDIA drivers would most likely work with some alpha plane, but glReadPixels would not return
+ // the alpha channel on NVIDIA if not requested when the GL context is created.
+ WX_GL_MIN_ALPHA, 8,
+ WX_GL_DEPTH_SIZE, 24,
+ WX_GL_SAMPLE_BUFFERS, GL_TRUE,
+ WX_GL_SAMPLES, 4,
+ 0
+ };
+
+ if (s_multisample == EMultisampleState::Unknown)
+ {
+ detect_multisample(attribList);
+// // debug output
+// std::cout << "Multisample " << (can_multisample() ? "enabled" : "disabled") << std::endl;
+ }
+
+ if (! can_multisample())
+ attribList[12] = 0;
+
+ return new wxGLCanvas(&parent, wxID_ANY, attribList, wxDefaultPosition, wxDefaultSize, wxWANTS_CHARS);
+}
+
+void OpenGLManager::detect_multisample(int* attribList)
+{
+ int wxVersion = wxMAJOR_VERSION * 10000 + wxMINOR_VERSION * 100 + wxRELEASE_NUMBER;
+ bool enable_multisample = wxVersion >= 30003;
+ s_multisample = (enable_multisample && wxGLCanvas::IsDisplaySupported(attribList)) ? EMultisampleState::Enabled : EMultisampleState::Disabled;
+ // Alternative method: it was working on previous version of wxWidgets but not with the latest, at least on Windows
+ // s_multisample = enable_multisample && wxGLCanvas::IsExtensionSupported("WGL_ARB_multisample");
+}
+
+} // namespace GUI
+} // namespace Slic3r
diff --git a/src/slic3r/GUI/GLCanvas3DManager.hpp b/src/slic3r/GUI/OpenGLManager.hpp
index c7301f2b4..c89cdf3a6 100644
--- a/src/slic3r/GUI/GLCanvas3DManager.hpp
+++ b/src/slic3r/GUI/OpenGLManager.hpp
@@ -1,56 +1,38 @@
-#ifndef slic3r_GLCanvas3DManager_hpp_
-#define slic3r_GLCanvas3DManager_hpp_
+#ifndef slic3r_OpenGLManager_hpp_
+#define slic3r_OpenGLManager_hpp_
-#include "libslic3r/BoundingBox.hpp"
-
-#include <map>
-#include <vector>
+#include "GLShadersManager.hpp"
class wxWindow;
class wxGLCanvas;
class wxGLContext;
namespace Slic3r {
-
-class BackgroundSlicingProcess;
-class DynamicPrintConfig;
-class Model;
-class ExPolygon;
-typedef std::vector<ExPolygon> ExPolygons;
-class ModelObject;
-class PrintObject;
-
namespace GUI {
-class GLCanvas3D;
-class Bed3D;
-class GLToolbar;
-struct Camera;
-
-class GLCanvas3DManager
+class OpenGLManager
{
public:
- enum EFramebufferType : unsigned char
+ enum class EFramebufferType : unsigned char
{
- FB_None,
- FB_Arb,
- FB_Ext
+ Unknown,
+ Arb,
+ Ext
};
class GLInfo
{
- mutable bool m_detected;
+ mutable bool m_detected{ false };
+ mutable int m_max_tex_size{ 0 };
+ mutable float m_max_anisotropy{ 0.0f };
mutable std::string m_version;
mutable std::string m_glsl_version;
mutable std::string m_vendor;
mutable std::string m_renderer;
- mutable int m_max_tex_size;
- mutable float m_max_anisotropy;
-
public:
- GLInfo();
+ GLInfo() = default;
const std::string& get_version() const;
const std::string& get_glsl_version() const;
@@ -61,6 +43,7 @@ public:
float get_max_anisotropy() const;
bool is_version_greater_or_equal_to(unsigned int major, unsigned int minor) const;
+ bool is_glsl_version_greater_or_equal_to(unsigned int major, unsigned int minor) const;
std::string to_string(bool format_as_html, bool extensions) const;
@@ -70,6 +53,7 @@ public:
#if ENABLE_HACK_CLOSING_ON_OSX_10_9_5
#ifdef __APPLE__
+ // Part of hack to remove crash when closing the application on OSX 10.9.5 when building against newer wxWidgets
struct OSInfo
{
int major{ 0 };
@@ -80,63 +64,49 @@ public:
#endif // ENABLE_HACK_CLOSING_ON_OSX_10_9_5
private:
- enum EMultisampleState : unsigned char
+ enum class EMultisampleState : unsigned char
{
- MS_Unknown,
- MS_Enabled,
- MS_Disabled
+ Unknown,
+ Enabled,
+ Disabled
};
- typedef std::map<wxGLCanvas*, GLCanvas3D*> CanvasesMap;
-
- CanvasesMap m_canvases;
- wxGLContext* m_context;
+ bool m_gl_initialized{ false };
+ wxGLContext* m_context{ nullptr };
+ GLShadersManager m_shaders_manager;
static GLInfo s_gl_info;
#if ENABLE_HACK_CLOSING_ON_OSX_10_9_5
#ifdef __APPLE__
+ // Part of hack to remove crash when closing the application on OSX 10.9.5 when building against newer wxWidgets
static OSInfo s_os_info;
#endif //__APPLE__
#endif // ENABLE_HACK_CLOSING_ON_OSX_10_9_5
- bool m_gl_initialized;
- static EMultisampleState s_multisample;
static bool s_compressed_textures_supported;
+ static EMultisampleState s_multisample;
static EFramebufferType s_framebuffers_type;
public:
- GLCanvas3DManager();
- ~GLCanvas3DManager();
-
- bool add(wxGLCanvas* canvas, Bed3D& bed, Camera& camera, GLToolbar& view_toolbar);
- bool remove(wxGLCanvas* canvas);
- void remove_all();
-
- unsigned int count() const;
-
- void init_gl();
+ OpenGLManager() = default;
+ ~OpenGLManager();
- bool init(wxGLCanvas* canvas);
- void destroy();
+ bool init_gl();
+ wxGLContext* init_glcontext(wxGLCanvas& canvas);
- GLCanvas3D* get_canvas(wxGLCanvas* canvas);
+ GLShaderProgram* get_shader(const std::string& shader_name) { return m_shaders_manager.get_shader(shader_name); }
+ GLShaderProgram* get_current_shader() { return m_shaders_manager.get_current_shader(); }
- static bool can_multisample() { return s_multisample == MS_Enabled; }
static bool are_compressed_textures_supported() { return s_compressed_textures_supported; }
- static bool are_framebuffers_supported() { return (s_framebuffers_type != FB_None); }
+ static bool can_multisample() { return s_multisample == EMultisampleState::Enabled; }
+ static bool are_framebuffers_supported() { return (s_framebuffers_type != EFramebufferType::Unknown); }
static EFramebufferType get_framebuffers_type() { return s_framebuffers_type; }
-
- static wxGLCanvas* create_wxglcanvas(wxWindow *parent);
-
+ static wxGLCanvas* create_wxglcanvas(wxWindow& parent);
static const GLInfo& get_gl_info() { return s_gl_info; }
private:
- CanvasesMap::iterator do_get_canvas(wxGLCanvas* canvas);
- CanvasesMap::const_iterator do_get_canvas(wxGLCanvas* canvas) const;
-
- bool init(GLCanvas3D& canvas);
static void detect_multisample(int* attribList);
};
} // namespace GUI
} // namespace Slic3r
-#endif // slic3r_GLCanvas3DManager_hpp_
+#endif // slic3r_OpenGLManager_hpp_
diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp
index 207d42b5b..10774abe3 100644
--- a/src/slic3r/GUI/OptionsGroup.cpp
+++ b/src/slic3r/GUI/OptionsGroup.cpp
@@ -1,40 +1,46 @@
#include "OptionsGroup.hpp"
#include "ConfigExceptions.hpp"
+#include "Plater.hpp"
+#include "GUI_App.hpp"
+#include "OG_CustomCtrl.hpp"
#include <utility>
#include <wx/numformatter.h>
#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/classification.hpp>
+#include "libslic3r/Exception.hpp"
#include "libslic3r/Utils.hpp"
#include "I18N.hpp"
namespace Slic3r { namespace GUI {
-const t_field& OptionsGroup::build_field(const Option& opt, wxStaticText* label/* = nullptr*/) {
- return build_field(opt.opt_id, opt.opt, label);
+const t_field& OptionsGroup::build_field(const Option& opt) {
+ return build_field(opt.opt_id, opt.opt);
}
-const t_field& OptionsGroup::build_field(const t_config_option_key& id, wxStaticText* label/* = nullptr*/) {
+const t_field& OptionsGroup::build_field(const t_config_option_key& id) {
const ConfigOptionDef& opt = m_options.at(id).opt;
- return build_field(id, opt, label);
+ return build_field(id, opt);
}
-const t_field& OptionsGroup::build_field(const t_config_option_key& id, const ConfigOptionDef& opt, wxStaticText* label/* = nullptr*/) {
+const t_field& OptionsGroup::build_field(const t_config_option_key& id, const ConfigOptionDef& opt) {
// Check the gui_type field first, fall through
// is the normal type.
- if (opt.gui_type.compare("select") == 0) {
- } else if (opt.gui_type.compare("select_open") == 0) {
+ if (opt.gui_type == "select") {
+ } else if (opt.gui_type == "select_open") {
m_fields.emplace(id, std::move(Choice::Create<Choice>(this->ctrl_parent(), opt, id)));
- } else if (opt.gui_type.compare("color") == 0) {
+ } else if (opt.gui_type == "color") {
m_fields.emplace(id, std::move(ColourPicker::Create<ColourPicker>(this->ctrl_parent(), opt, id)));
- } else if (opt.gui_type.compare("f_enum_open") == 0 ||
- opt.gui_type.compare("i_enum_open") == 0 ||
- opt.gui_type.compare("i_enum_closed") == 0) {
+ } else if (opt.gui_type == "f_enum_open" ||
+ opt.gui_type == "i_enum_open" ||
+ opt.gui_type == "i_enum_closed") {
m_fields.emplace(id, std::move(Choice::Create<Choice>(this->ctrl_parent(), opt, id)));
- } else if (opt.gui_type.compare("slider") == 0) {
+ } else if (opt.gui_type == "slider") {
m_fields.emplace(id, std::move(SliderCtrl::Create<SliderCtrl>(this->ctrl_parent(), opt, id)));
- } else if (opt.gui_type.compare("i_spin") == 0) { // Spinctrl
- } else if (opt.gui_type.compare("legend") == 0) { // StaticText
+ } else if (opt.gui_type == "i_spin") { // Spinctrl
+ } else if (opt.gui_type == "legend") { // StaticText
m_fields.emplace(id, std::move(StaticText::Create<StaticText>(this->ctrl_parent(), opt, id)));
+ } else if (opt.gui_type == "one_string") {
+ m_fields.emplace(id, std::move(TextCtrl::Create<TextCtrl>(this->ctrl_parent(), opt, id)));
} else {
switch (opt.type) {
case coFloatOrPercent:
@@ -62,7 +68,7 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co
break;
case coNone: break;
default:
- throw /*//!ConfigGUITypeError("")*/std::logic_error("This control doesn't exist till now"); break;
+ throw Slic3r::LogicError("This control doesn't exist till now"); break;
}
}
// Grab a reference to fields for convenience
@@ -84,9 +90,7 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co
this->on_set_focus(opt_id);
};
field->m_parent = parent();
-
- //! Label to change background color, when option is modified
- field->m_Label = label;
+
field->m_back_to_initial_value = [this](std::string opt_id) {
if (!m_disabled)
this->back_to_initial_value(opt_id);
@@ -100,29 +104,98 @@ const t_field& OptionsGroup::build_field(const t_config_option_key& id, const Co
return field;
}
-void OptionsGroup::add_undo_buttuns_to_sizer(wxSizer* sizer, const t_field& field)
+OptionsGroup::OptionsGroup( wxWindow* _parent, const wxString& title,
+ bool is_tab_opt /* = false */,
+ column_t extra_clmn /* = nullptr */) :
+ m_parent(_parent), title(title),
+ m_use_custom_ctrl(is_tab_opt),
+ staticbox(title!=""), extra_column(extra_clmn)
{
- if (!m_show_modified_btns) {
- field->m_Undo_btn->set_as_hidden();
- field->m_Undo_to_sys_btn->set_as_hidden();
- return;
+}
+
+wxWindow* OptionsGroup::ctrl_parent() const
+{
+ return this->custom_ctrl && m_use_custom_ctrl_as_parent ? static_cast<wxWindow*>(this->custom_ctrl) : (this->stb ? static_cast<wxWindow*>(this->stb) : this->parent());
+}
+
+bool OptionsGroup::is_legend_line()
+{
+ if (m_lines.size() == 1) {
+ const std::vector<Option>& option_set = m_lines.front().get_options();
+ return !option_set.empty() && option_set.front().opt.gui_type == "legend";
}
+ return false;
+}
- sizer->Add(field->m_Undo_to_sys_btn, 0, wxALIGN_CENTER_VERTICAL);
- sizer->Add(field->m_Undo_btn, 0, wxALIGN_CENTER_VERTICAL);
+void OptionsGroup::show_field(const t_config_option_key& opt_key, bool show/* = true*/)
+{
+ Field* field = get_field(opt_key);
+ if (!field) return;
+ wxWindow* win = field->getWindow();
+ if (!win) return;
+ wxSizerItem* win_item = m_grid_sizer->GetItem(win, true);
+ if (!win_item) return;
+
+ const size_t cols = (size_t)m_grid_sizer->GetCols();
+ const size_t rows = (size_t)m_grid_sizer->GetEffectiveRowsCount();
+
+ auto show_row = [this, show, cols, win_item](wxSizerItem* item, size_t row_shift) {
+ // check if item contanes required win
+ if (!item->IsWindow() || item != win_item)
+ return false;
+ // show/hide hole line contanes this window
+ for (size_t i = 0; i < cols; ++i)
+ m_grid_sizer->Show(row_shift + i, show);
+ return true;
+ };
+
+ size_t row_shift = 0;
+ for (size_t j = 0; j < rows; ++j) {
+ for (size_t i = 0; i < cols; ++i) {
+ wxSizerItem* item = m_grid_sizer->GetItem(row_shift + i);
+ if (!item)
+ continue;
+ if (item->IsSizer()) {
+ for (wxSizerItem* child_item : item->GetSizer()->GetChildren())
+ if (show_row(child_item, row_shift))
+ return;
+ }
+ else if (show_row(item, row_shift))
+ return;
+ }
+ row_shift += cols;
+ }
}
-void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = nullptr*/) {
- if ( line.full_width && (
- line.sizer != nullptr ||
- line.widget != nullptr ||
- !line.get_extra_widgets().empty() )
+void OptionsGroup::append_line(const Line& line)
+{
+ m_lines.emplace_back(line);
+
+ if (line.full_width && (
+ line.widget != nullptr ||
+ !line.get_extra_widgets().empty())
+ )
+ return;
+
+ auto option_set = line.get_options();
+ for (auto opt : option_set)
+ m_options.emplace(opt.opt_id, opt);
+
+ // add mode value for current line to m_options_mode
+ if (!option_set.empty())
+ m_options_mode.push_back(option_set[0].opt.mode);
+}
+
+void OptionsGroup::activate_line(Line& line)
+{
+ m_use_custom_ctrl_as_parent = false;
+
+ if (line.full_width && (
+ line.widget != nullptr ||
+ !line.get_extra_widgets().empty())
) {
- if (line.sizer != nullptr) {
- sizer->Add(line.sizer, 0, wxEXPAND | wxALL, wxOSX ? 0 : 15);
- return;
- }
if (line.widget != nullptr) {
+ // description lines
sizer->Add(line.widget(this->ctrl_parent()), 0, wxEXPAND | wxALL, wxOSX ? 0 : 15);
return;
}
@@ -140,140 +213,128 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = n
}
auto option_set = line.get_options();
- for (auto opt : option_set)
- m_options.emplace(opt.opt_id, opt);
+ bool is_legend_line = option_set.front().opt.gui_type == "legend";
+
+ if (!custom_ctrl && m_use_custom_ctrl) {
+ custom_ctrl = new OG_CustomCtrl(is_legend_line || !staticbox ? this->parent() : static_cast<wxWindow*>(this->stb), this);
+ if (is_legend_line)
+ sizer->Add(custom_ctrl, 0, wxEXPAND | wxLEFT, wxOSX ? 0 : 10);
+ else
+ sizer->Add(custom_ctrl, 0, wxEXPAND | wxALL, wxOSX || !staticbox ? 0 : 5);
+ }
// Set sidetext width for a better alignment of options in line
// "m_show_modified_btns==true" means that options groups are in tabs
- if (option_set.size() > 1 && m_show_modified_btns) {
+ if (option_set.size() > 1 && m_use_custom_ctrl) {
sidetext_width = Field::def_width_thinner();
- /* Temporary commented till UI-review will be completed
- if (m_show_modified_btns) // means that options groups are in tabs
- sublabel_width = Field::def_width();
- */
}
- // add mode value for current line to m_options_mode
- if (!option_set.empty())
- m_options_mode.push_back(option_set[0].opt.mode);
-
// if we have a single option with no label, no sidetext just add it directly to sizer
if (option_set.size() == 1 && label_width == 0 && option_set.front().opt.full_width &&
option_set.front().opt.label.empty() &&
option_set.front().opt.sidetext.size() == 0 && option_set.front().side_widget == nullptr &&
line.get_extra_widgets().size() == 0) {
- wxSizer* tmp_sizer;
-#if 0//#ifdef __WXGTK__
- tmp_sizer = new wxBoxSizer(wxVERTICAL);
- m_panel->SetSizer(tmp_sizer);
- m_panel->Layout();
-#else
- tmp_sizer = sizer;
-#endif /* __WXGTK__ */
const auto& option = option_set.front();
const auto& field = build_field(option);
- auto btn_sizer = new wxBoxSizer(wxHORIZONTAL);
- add_undo_buttuns_to_sizer(btn_sizer, field);
- tmp_sizer->Add(btn_sizer, 0, wxEXPAND | wxALL, 0);
if (is_window_field(field))
- tmp_sizer->Add(field->getWindow(), 0, wxEXPAND | wxALL, wxOSX ? 0 : 5);
+ sizer->Add(field->getWindow(), 0, wxEXPAND | wxALL, wxOSX ? 0 : 5);
if (is_sizer_field(field))
- tmp_sizer->Add(field->getSizer(), 0, wxEXPAND | wxALL, wxOSX ? 0 : 5);
+ sizer->Add(field->getSizer(), 0, wxEXPAND | wxALL, wxOSX ? 0 : 5);
return;
}
auto grid_sizer = m_grid_sizer;
-#if 0//#ifdef __WXGTK__
- m_panel->SetSizer(m_grid_sizer);
- m_panel->Layout();
-#endif /* __WXGTK__ */
+
+ if (custom_ctrl)
+ m_use_custom_ctrl_as_parent = true;
// if we have an extra column, build it
- if (extra_column)
- {
- m_extra_column_item_ptrs.push_back(extra_column(this->ctrl_parent(), line));
- grid_sizer->Add(m_extra_column_item_ptrs.back(), 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 3);
- }
+ if (extra_column)
+ {
+ m_extra_column_item_ptrs.push_back(extra_column(this->ctrl_parent(), line));
+ grid_sizer->Add(m_extra_column_item_ptrs.back(), 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, 3);
+ }
- // Build a label if we have it
+ // Build a label if we have it
wxStaticText* label=nullptr;
if (label_width != 0) {
- if (! line.near_label_widget || ! line.label.IsEmpty()) {
- // Only create the label if it is going to be displayed.
- long label_style = staticbox ? 0 : wxALIGN_RIGHT;
+ if (custom_ctrl) {
+ if (line.near_label_widget)
+ line.near_label_widget_win = line.near_label_widget(this->ctrl_parent());
+ }
+ else {
+ if (!line.near_label_widget || !line.label.IsEmpty()) {
+ // Only create the label if it is going to be displayed.
+ long label_style = staticbox ? 0 : wxALIGN_RIGHT;
#ifdef __WXGTK__
- // workaround for correct text align of the StaticBox on Linux
- // flags wxALIGN_RIGHT and wxALIGN_CENTRE don't work when Ellipsize flags are _not_ given.
- // Text is properly aligned only when Ellipsize is checked.
- label_style |= staticbox ? 0 : wxST_ELLIPSIZE_END;
+ // workaround for correct text align of the StaticBox on Linux
+ // flags wxALIGN_RIGHT and wxALIGN_CENTRE don't work when Ellipsize flags are _not_ given.
+ // Text is properly aligned only when Ellipsize is checked.
+ label_style |= staticbox ? 0 : wxST_ELLIPSIZE_END;
#endif /* __WXGTK__ */
- label = new wxStaticText(this->ctrl_parent(), wxID_ANY, line.label + (line.label.IsEmpty() ? "" : ": "),
- wxDefaultPosition, wxSize(label_width*wxGetApp().em_unit(), -1), label_style);
- label->SetBackgroundStyle(wxBG_STYLE_PAINT);
- label->SetFont(wxGetApp().normal_font());
- label->Wrap(label_width*wxGetApp().em_unit()); // avoid a Linux/GTK bug
- }
- if (!line.near_label_widget)
- grid_sizer->Add(label, 0, (staticbox ? 0 : wxALIGN_RIGHT | wxRIGHT) | wxALIGN_CENTER_VERTICAL, line.label.IsEmpty() ? 0 : 5);
- else {
- m_near_label_widget_ptrs.push_back(line.near_label_widget(this->ctrl_parent()));
-
- if (line.label.IsEmpty())
- grid_sizer->Add(m_near_label_widget_ptrs.back(), 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 7);
- else {
+ label = new wxStaticText(this->ctrl_parent(), wxID_ANY, line.label + (line.label.IsEmpty() ? "" : ": "),
+ wxDefaultPosition, wxSize(label_width * wxGetApp().em_unit(), -1), label_style);
+ label->SetBackgroundStyle(wxBG_STYLE_PAINT);
+ label->SetFont(wxGetApp().normal_font());
+ label->Wrap(label_width * wxGetApp().em_unit()); // avoid a Linux/GTK bug
+ }
+ if (!line.near_label_widget)
+ grid_sizer->Add(label, 0, (staticbox ? 0 : wxALIGN_RIGHT | wxRIGHT) | wxALIGN_CENTER_VERTICAL, line.label.IsEmpty() ? 0 : 5);
+ else if (!line.label.IsEmpty()) {
// If we're here, we have some widget near the label
// so we need a horizontal sizer to arrange these things
auto sizer = new wxBoxSizer(wxHORIZONTAL);
grid_sizer->Add(sizer, 0, wxEXPAND | (staticbox ? wxALL : wxBOTTOM | wxTOP | wxLEFT), staticbox ? 0 : 1);
- sizer->Add(m_near_label_widget_ptrs.back(), 0, wxRIGHT | wxALIGN_CENTER_VERTICAL, 7);
sizer->Add(label, 0, (staticbox ? 0 : wxALIGN_RIGHT | wxRIGHT) | wxALIGN_CENTER_VERTICAL, 5);
}
+ if (label != nullptr && line.label_tooltip != "")
+ label->SetToolTip(line.label_tooltip);
}
- if (label != nullptr && line.label_tooltip != "")
- label->SetToolTip(line.label_tooltip);
}
- if (full_Label != nullptr)
- *full_Label = label; // Initiate the pointer to the control of the full label, if we need this one.
- // If there's a widget, build it and add the result to the sizer.
+ // If there's a widget, build it and add the result to the sizer.
if (line.widget != nullptr) {
auto wgt = line.widget(this->ctrl_parent());
- // If widget doesn't have label, don't use border
- grid_sizer->Add(wgt, 0, wxEXPAND | wxBOTTOM | wxTOP, (wxOSX || line.label.IsEmpty()) ? 0 : 5);
+ if (custom_ctrl)
+ line.widget_sizer = wgt;
+ else
+ grid_sizer->Add(wgt, 0, wxEXPAND | wxBOTTOM | wxTOP, (wxOSX || line.label.IsEmpty()) ? 0 : 5);
return;
}
-
+
// If we're here, we have more than one option or a single option with sidetext
// so we need a horizontal sizer to arrange these things
auto sizer = new wxBoxSizer(wxHORIZONTAL);
- grid_sizer->Add(sizer, 0, wxEXPAND | (staticbox ? wxALL : wxBOTTOM | wxTOP | wxLEFT), staticbox ? 0 : 1);
+ if (!custom_ctrl)
+ grid_sizer->Add(sizer, 0, wxEXPAND | (staticbox ? wxALL : wxBOTTOM | wxTOP | wxLEFT), staticbox ? 0 : 1);
// If we have a single option with no sidetext just add it directly to the grid sizer
if (option_set.size() == 1 && option_set.front().opt.sidetext.size() == 0 &&
option_set.front().opt.label.empty() &&
option_set.front().side_widget == nullptr && line.get_extra_widgets().size() == 0) {
const auto& option = option_set.front();
- const auto& field = build_field(option, label);
-
- add_undo_buttuns_to_sizer(sizer, field);
- if (is_window_field(field))
- sizer->Add(field->getWindow(), option.opt.full_width ? 1 : 0, //(option.opt.full_width ? wxEXPAND : 0) |
- wxBOTTOM | wxTOP | (option.opt.full_width ? wxEXPAND : wxALIGN_CENTER_VERTICAL), (wxOSX || !staticbox) ? 0 : 2);
- if (is_sizer_field(field))
- sizer->Add(field->getSizer(), 1, /*(*/option.opt.full_width ? wxEXPAND : /*0) |*/ wxALIGN_CENTER_VERTICAL, 0);
- return;
+ const auto& field = build_field(option);
+
+ if (!custom_ctrl) {
+ if (is_window_field(field))
+ sizer->Add(field->getWindow(), option.opt.full_width ? 1 : 0,
+ wxBOTTOM | wxTOP | (option.opt.full_width ? wxEXPAND : wxALIGN_CENTER_VERTICAL), (wxOSX || !staticbox) ? 0 : 2);
+ if (is_sizer_field(field))
+ sizer->Add(field->getSizer(), 1, option.opt.full_width ? wxEXPAND : wxALIGN_CENTER_VERTICAL, 0);
+ }
+ return;
}
for (auto opt : option_set) {
ConfigOptionDef option = opt.opt;
wxSizer* sizer_tmp = sizer;
// add label if any
- if (!option.label.empty()) {
+ if (!option.label.empty() && !custom_ctrl) {
//! To correct translation by context have to use wxGETTEXT_IN_CONTEXT macro from wxWidget 3.1.1
wxString str_label = (option.label == L_CONTEXT("Top", "Layers") || option.label == L_CONTEXT("Bottom", "Layers")) ?
- _CTX(option.label, "Layers") :
- _(option.label);
+ _CTX(option.label, "Layers") :
+ _(option.label);
label = new wxStaticText(this->ctrl_parent(), wxID_ANY, str_label + ": ", wxDefaultPosition, //wxDefaultSize);
wxSize(sublabel_width != -1 ? sublabel_width * wxGetApp().em_unit() : -1, -1), wxALIGN_RIGHT);
label->SetBackgroundStyle(wxBG_STYLE_PAINT);
@@ -283,42 +344,41 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = n
// add field
const Option& opt_ref = opt;
- auto& field = build_field(opt_ref, label);
- add_undo_buttuns_to_sizer(sizer_tmp, field);
- if (option_set.size() == 1 && option_set.front().opt.full_width)
- {
- const auto v_sizer = new wxBoxSizer(wxVERTICAL);
- sizer_tmp->Add(v_sizer, 1, wxEXPAND);
- is_sizer_field(field) ?
- v_sizer->Add(field->getSizer(), 0, wxEXPAND) :
- v_sizer->Add(field->getWindow(), 0, wxEXPAND);
- break;//return;
- }
+ auto& field = build_field(opt_ref);
+ if (!custom_ctrl) {
+ if (option_set.size() == 1 && option_set.front().opt.full_width)
+ {
+ const auto v_sizer = new wxBoxSizer(wxVERTICAL);
+ sizer_tmp->Add(v_sizer, 1, wxEXPAND);
+ is_sizer_field(field) ?
+ v_sizer->Add(field->getSizer(), 0, wxEXPAND) :
+ v_sizer->Add(field->getWindow(), 0, wxEXPAND);
+ break;
+ }
- is_sizer_field(field) ?
- sizer_tmp->Add(field->getSizer(), 0, wxALIGN_CENTER_VERTICAL, 0) :
- sizer_tmp->Add(field->getWindow(), 0, wxALIGN_CENTER_VERTICAL, 0);
-
- // add sidetext if any
- if (!option.sidetext.empty() || sidetext_width > 0) {
- auto sidetext = new wxStaticText( this->ctrl_parent(), wxID_ANY, _(option.sidetext), wxDefaultPosition,
- wxSize(sidetext_width != -1 ? sidetext_width*wxGetApp().em_unit() : -1, -1), wxALIGN_LEFT);
- sidetext->SetBackgroundStyle(wxBG_STYLE_PAINT);
- sidetext->SetFont(wxGetApp().normal_font());
- sizer_tmp->Add(sidetext, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 4);
- field->set_side_text_ptr(sidetext);
- }
+ is_sizer_field(field) ?
+ sizer_tmp->Add(field->getSizer(), 0, wxALIGN_CENTER_VERTICAL, 0) :
+ sizer_tmp->Add(field->getWindow(), 0, wxALIGN_CENTER_VERTICAL, 0);
+
+ // add sidetext if any
+ if (!option.sidetext.empty() || sidetext_width > 0) {
+ auto sidetext = new wxStaticText(this->ctrl_parent(), wxID_ANY, _(option.sidetext), wxDefaultPosition,
+ wxSize(sidetext_width != -1 ? sidetext_width * wxGetApp().em_unit() : -1, -1), wxALIGN_LEFT);
+ sidetext->SetBackgroundStyle(wxBG_STYLE_PAINT);
+ sidetext->SetFont(wxGetApp().normal_font());
+ sizer_tmp->Add(sidetext, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 4);
+ }
- // add side widget if any
- if (opt.side_widget != nullptr) {
- sizer_tmp->Add(opt.side_widget(this->ctrl_parent())/*!.target<wxWindow>()*/, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 1); //! requires verification
- }
+ // add side widget if any
+ if (opt.side_widget != nullptr) {
+ sizer_tmp->Add(opt.side_widget(this->ctrl_parent())/*!.target<wxWindow>()*/, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 1); //! requires verification
+ }
- if (opt.opt_id != option_set.back().opt_id) //! istead of (opt != option_set.back())
- {
- sizer_tmp->AddSpacer(6);
- }
+ if (opt.opt_id != option_set.back().opt_id) //! istead of (opt != option_set.back())
+ sizer_tmp->AddSpacer(6);
+ }
}
+
// add extra sizers if any
for (auto extra_widget : line.get_extra_widgets())
{
@@ -331,15 +391,108 @@ void OptionsGroup::append_line(const Line& line, wxStaticText** full_Label/* = n
return;
}
- sizer->Add(extra_widget(this->ctrl_parent())/*!.target<wxWindow>()*/, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 4); //! requires verification
+ line.extra_widget_sizer = extra_widget(this->ctrl_parent());
+ if (!custom_ctrl)
+ sizer->Add(line.extra_widget_sizer, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 4); //! requires verification
+ }
+}
+
+// create all controls for the option group from the m_lines
+bool OptionsGroup::activate(std::function<void()> throw_if_canceled)
+{
+ if (sizer)//(!sizer->IsEmpty())
+ return false;
+
+ try {
+ if (staticbox) {
+ stb = new wxStaticBox(m_parent, wxID_ANY, _(title));
+ if (!wxOSX) stb->SetBackgroundStyle(wxBG_STYLE_PAINT);
+ stb->SetFont(wxOSX ? wxGetApp().normal_font() : wxGetApp().bold_font());
+ }
+ else
+ stb = nullptr;
+ sizer = (staticbox ? new wxStaticBoxSizer(stb, wxVERTICAL) : new wxBoxSizer(wxVERTICAL));
+
+ auto num_columns = 1U;
+ size_t grow_col = 1;
+
+ if (label_width == 0)
+ grow_col = 0;
+ else
+ num_columns++;
+
+ if (extra_column) {
+ num_columns++;
+ grow_col++;
+ }
+
+ m_grid_sizer = new wxFlexGridSizer(0, num_columns, 1, 0);
+ static_cast<wxFlexGridSizer*>(m_grid_sizer)->SetFlexibleDirection(wxBOTH);
+ static_cast<wxFlexGridSizer*>(m_grid_sizer)->AddGrowableCol(grow_col);
+
+ sizer->Add(m_grid_sizer, 0, wxEXPAND | wxALL, wxOSX || !staticbox ? 0 : 5);
+
+ // activate lines
+ for (Line& line: m_lines) {
+ throw_if_canceled();
+ activate_line(line);
+ }
+ } catch (UIBuildCanceled&) {
+ auto p = sizer;
+ this->clear();
+ p->Clear(true);
+ delete p;
+ throw;
+ }
+
+ return true;
+}
+// delete all controls from the option group
+void OptionsGroup::clear(bool destroy_custom_ctrl)
+{
+ if (!sizer)
+ return;
+
+ m_grid_sizer = nullptr;
+ sizer = nullptr;
+
+ for (Line& line : m_lines) {
+ if (line.near_label_widget_win)
+ line.near_label_widget_win = nullptr;
+
+ if (line.widget_sizer) {
+ line.widget_sizer->Clear(true);
+ line.widget_sizer = nullptr;
+ }
+
+ if (line.extra_widget_sizer) {
+ line.extra_widget_sizer->Clear(true);
+ line.extra_widget_sizer = nullptr;
+ }
}
+
+ if (custom_ctrl) {
+ for (auto const &item : m_fields) {
+ wxWindow* win = item.second.get()->getWindow();
+ if (win)
+ win = nullptr;
+ }
+ if (destroy_custom_ctrl)
+ custom_ctrl->Destroy();
+ else
+ custom_ctrl = nullptr;
+ }
+
+ m_extra_column_item_ptrs.clear();
+ m_fields.clear();
}
-Line OptionsGroup::create_single_option_line(const Option& option) const {
+Line OptionsGroup::create_single_option_line(const Option& option, const wxString& path/* = wxEmptyString*/) const {
// Line retval{ _(option.opt.label), _(option.opt.tooltip) };
wxString tooltip = _(option.opt.tooltip);
edit_tooltip(tooltip);
Line retval{ _(option.opt.label), tooltip };
+ retval.label_path = path;
Option tmp(option);
tmp.opt.label = std::string("");
retval.append_option(tmp);
@@ -378,6 +531,9 @@ Option ConfigOptionsGroup::get_option(const std::string& opt_key, int opt_index
std::pair<std::string, int> pair(opt_key, opt_index);
m_opt_map.emplace(opt_id, pair);
+ if (m_use_custom_ctrl) // fill group and category values just for options from Settings Tab
+ wxGetApp().sidebar().get_searcher().add_key(opt_id, title, this->config_category());
+
return Option(*m_config->def()->get(opt_key), opt_id);
}
@@ -392,13 +548,11 @@ void ConfigOptionsGroup::on_change_OG(const t_config_option_key& opt_id, const b
return;
}
- auto itOption = it->second;
- std::string opt_key = itOption.first;
- int opt_index = itOption.second;
+ auto itOption = it->second;
+ const std::string &opt_key = itOption.first;
+ int opt_index = itOption.second;
- auto option = m_options.at(opt_id).opt;
-
- change_opt_value(*m_config, opt_key, value, opt_index == -1 ? 0 : opt_index);
+ this->change_opt_value(opt_key, value, opt_index == -1 ? 0 : opt_index);
}
OptionsGroup::on_change_OG(opt_id, value);
@@ -429,9 +583,10 @@ void ConfigOptionsGroup::back_to_config_value(const DynamicPrintConfig& config,
}
else if (m_opt_map.find(opt_key) == m_opt_map.end() ||
// This option don't have corresponded field
- opt_key == "bed_shape" || opt_key == "compatible_printers" || opt_key == "compatible_prints" ) {
+ opt_key == "bed_shape" || opt_key == "filament_ramming_parameters" ||
+ opt_key == "compatible_printers" || opt_key == "compatible_prints" ) {
value = get_config_value(config, opt_key);
- change_opt_value(*m_config, opt_key, value);
+ this->change_opt_value(opt_key, value);
return;
}
else
@@ -482,15 +637,38 @@ void ConfigOptionsGroup::Show(const bool show)
#endif /* __WXGTK__ */
}
-bool ConfigOptionsGroup::update_visibility(ConfigOptionMode mode) {
+bool ConfigOptionsGroup::is_visible(ConfigOptionMode mode)
+{
if (m_options_mode.empty())
return true;
- int opt_mode_size = m_options_mode.size();
- if (m_grid_sizer->GetEffectiveRowsCount() != opt_mode_size &&
- opt_mode_size == 1)
+ if (m_options_mode.size() == 1)
return m_options_mode[0] <= mode;
- Show(true);
+ size_t hidden_row_cnt = 0;
+ for (auto opt_mode : m_options_mode)
+ if (opt_mode > mode)
+ hidden_row_cnt++;
+
+ return hidden_row_cnt != m_options_mode.size();
+}
+
+bool ConfigOptionsGroup::update_visibility(ConfigOptionMode mode)
+{
+ if (m_options_mode.empty() || !m_grid_sizer)
+ return true;
+
+ if (custom_ctrl) {
+ bool show = custom_ctrl->update_visibility(mode);
+ this->Show(show);
+ return show;
+ }
+
+ int opt_mode_size = m_options_mode.size();
+ if (m_grid_sizer->GetEffectiveRowsCount() != opt_mode_size &&
+ opt_mode_size == 1)
+ return m_options_mode[0] <= mode;
+
+ Show(true);
int coef = 0;
int hidden_row_cnt = 0;
@@ -519,48 +697,53 @@ void ConfigOptionsGroup::msw_rescale()
for (auto extra_col : m_extra_column_item_ptrs)
rescale_extra_column_item(extra_col);
- // update bitmaps for near label widgets (like "Set uniform scale" button on settings panel)
- if (rescale_near_label_widget)
- for (auto near_label_widget : m_near_label_widget_ptrs)
- rescale_near_label_widget(near_label_widget);
-
// update undo buttons : rescale bitmaps
for (const auto& field : m_fields)
- field.second->msw_rescale(sidetext_width>0);
-
- const int em = em_unit(parent());
-
- // rescale width of label column
- if (!m_options_mode.empty() && label_width > 1)
- {
- const int cols = m_grid_sizer->GetCols();
- const int rows = m_grid_sizer->GetEffectiveRowsCount();
- const int label_col = extra_column == nullptr ? 0 : 1;
-
- for (int i = 0; i < rows; i++)
- {
- const wxSizerItem* label_item = m_grid_sizer->GetItem(i*cols+label_col);
- if (label_item->IsWindow())
- {
- auto label = dynamic_cast<wxStaticText*>(label_item->GetWindow());
- if (label != nullptr) {
- label->SetMinSize(wxSize(label_width*em, -1));
+ field.second->msw_rescale();
+
+ auto rescale = [](wxSizer* sizer) {
+ for (wxSizerItem* item : sizer->GetChildren())
+ if (item->IsWindow()) {
+ wxWindow* win = item->GetWindow();
+ // check if window is ScalableButton
+ ScalableButton* sc_btn = dynamic_cast<ScalableButton*>(win);
+ if (sc_btn) {
+ sc_btn->msw_rescale();
+ sc_btn->SetSize(sc_btn->GetBestSize());
+ return;
}
- }
- else if (label_item->IsSizer()) // case when we have near_label_widget
- {
- const wxSizerItem* l_item = label_item->GetSizer()->GetItem(1);
- if (l_item->IsWindow())
- {
- auto label = dynamic_cast<wxStaticText*>(l_item->GetWindow());
- if (label != nullptr) {
- label->SetMinSize(wxSize(label_width*em, -1));
- }
+ // check if window is wxButton
+ wxButton* btn = dynamic_cast<wxButton*>(win);
+ if (btn) {
+ btn->SetSize(btn->GetBestSize());
+ return;
}
}
- }
- m_grid_sizer->Layout();
+ };
+
+ // scale widgets and extra widgets if any exists
+ for (const Line& line : m_lines) {
+ if (line.widget_sizer)
+ rescale(line.widget_sizer);
+ if (line.extra_widget_sizer)
+ rescale(line.extra_widget_sizer);
}
+
+ if (custom_ctrl)
+ custom_ctrl->msw_rescale();
+}
+
+void ConfigOptionsGroup::sys_color_changed()
+{
+ // update undo buttons : rescale bitmaps
+ for (const auto& field : m_fields)
+ field.second->sys_color_changed();
+}
+
+void ConfigOptionsGroup::refresh()
+{
+ if (custom_ctrl)
+ custom_ctrl->Refresh();
}
boost::any ConfigOptionsGroup::config_value(const std::string& opt_key, int opt_index, bool deserialize) {
@@ -570,7 +753,7 @@ boost::any ConfigOptionsGroup::config_value(const std::string& opt_key, int opt_
// Aggregate the strings the old way.
// Currently used for the post_process config value only.
if (opt_index != -1)
- throw std::out_of_range("Can't deserialize option indexed value");
+ throw Slic3r::OutOfRange("Can't deserialize option indexed value");
// return join(';', m_config->get(opt_key)});
return get_config_value(*m_config, opt_key);
}
@@ -650,11 +833,15 @@ boost::any ConfigOptionsGroup::get_config_value(const DynamicPrintConfig& config
ret = config.option<ConfigOptionStrings>(opt_key)->values;
break;
}
+ if (opt_key == "filament_ramming_parameters") {
+ ret = config.opt_string(opt_key, static_cast<unsigned int>(idx));
+ break;
+ }
if (config.option<ConfigOptionStrings>(opt_key)->values.empty())
ret = text_value;
- else if (opt->gui_flags.compare("serialized") == 0) {
+ else if (opt->gui_flags == "serialized") {
std::vector<std::string> values = config.option<ConfigOptionStrings>(opt_key)->values;
- if (!values.empty() && values[0].compare("") != 0)
+ if (!values.empty() && !values[0].empty())
for (auto el : values)
text_value += el + ";";
ret = text_value;
@@ -680,29 +867,40 @@ boost::any ConfigOptionsGroup::get_config_value(const DynamicPrintConfig& config
opt_key == "fill_pattern" ) {
ret = static_cast<int>(config.option<ConfigOptionEnum<InfillPattern>>(opt_key)->value);
}
- else if (opt_key.compare("gcode_flavor") == 0 ) {
+ else if (opt_key == "ironing_type") {
+ ret = static_cast<int>(config.option<ConfigOptionEnum<IroningType>>(opt_key)->value);
+ }
+ else if (opt_key == "gcode_flavor") {
ret = static_cast<int>(config.option<ConfigOptionEnum<GCodeFlavor>>(opt_key)->value);
}
- else if (opt_key.compare("support_material_pattern") == 0) {
+ else if (opt_key == "machine_limits_usage") {
+ ret = static_cast<int>(config.option<ConfigOptionEnum<MachineLimitsUsage>>(opt_key)->value);
+ }
+ else if (opt_key == "support_material_pattern") {
ret = static_cast<int>(config.option<ConfigOptionEnum<SupportMaterialPattern>>(opt_key)->value);
}
- else if (opt_key.compare("seam_position") == 0) {
+ else if (opt_key == "seam_position") {
ret = static_cast<int>(config.option<ConfigOptionEnum<SeamPosition>>(opt_key)->value);
}
- else if (opt_key.compare("host_type") == 0) {
+ else if (opt_key == "host_type") {
ret = static_cast<int>(config.option<ConfigOptionEnum<PrintHostType>>(opt_key)->value);
}
- else if (opt_key.compare("display_orientation") == 0) {
+ else if (opt_key == "display_orientation") {
ret = static_cast<int>(config.option<ConfigOptionEnum<SLADisplayOrientation>>(opt_key)->value);
}
- else if (opt_key.compare("support_pillar_connection_mode") == 0) {
+ else if (opt_key == "support_pillar_connection_mode") {
ret = static_cast<int>(config.option<ConfigOptionEnum<SLAPillarConnectionMode>>(opt_key)->value);
}
+ else if (opt_key == "printhost_authorization_type") {
+ ret = static_cast<int>(config.option<ConfigOptionEnum<AuthorizationType>>(opt_key)->value);
+ }
}
break;
case coPoints:
- if (opt_key.compare("bed_shape") == 0)
+ if (opt_key == "bed_shape")
ret = config.option<ConfigOptionPoints>(opt_key)->values;
+ if (opt_key == "thumbnails")
+ ret = get_thumbnails_string(config.option<ConfigOptionPoints>(opt_key)->values);
else
ret = config.option<ConfigOptionPoints>(opt_key)->get_at(idx);
break;
@@ -728,6 +926,40 @@ Field* ConfigOptionsGroup::get_fieldc(const t_config_option_key& opt_key, int op
return opt_id.empty() ? nullptr : get_field(opt_id);
}
+std::pair<OG_CustomCtrl*, bool*> ConfigOptionsGroup::get_custom_ctrl_with_blinking_ptr(const t_config_option_key& opt_key, int opt_index/* = -1*/)
+{
+ Field* field = get_fieldc(opt_key, opt_index);
+
+ if (field)
+ return {custom_ctrl, field->get_blink_ptr()};
+
+ for (Line& line : m_lines)
+ for (const Option& opt : line.get_options())
+ if (opt.opt_id == opt_key && line.widget)
+ return { custom_ctrl, line.get_blink_ptr() };
+
+ return { nullptr, nullptr };
+}
+
+// Change an option on m_config, possibly call ModelConfig::touch().
+void ConfigOptionsGroup::change_opt_value(const t_config_option_key& opt_key, const boost::any& value, int opt_index /*= 0*/)
+
+{
+ Slic3r::GUI::change_opt_value(const_cast<DynamicPrintConfig&>(*m_config), opt_key, value, opt_index);
+ if (m_modelconfig)
+ m_modelconfig->touch();
+}
+
+ogStaticText::ogStaticText(wxWindow* parent, const wxString& text) :
+ wxStaticText(parent, wxID_ANY, text, wxDefaultPosition, wxDefaultSize)
+{
+ if (!text.IsEmpty()) {
+ Wrap(60 * wxGetApp().em_unit());
+ GetParent()->Layout();
+ }
+}
+
+
void ogStaticText::SetText(const wxString& value, bool wrap/* = true*/)
{
SetLabel(value);
diff --git a/src/slic3r/GUI/OptionsGroup.hpp b/src/slic3r/GUI/OptionsGroup.hpp
index 536eb72a5..5bc2d4595 100644
--- a/src/slic3r/GUI/OptionsGroup.hpp
+++ b/src/slic3r/GUI/OptionsGroup.hpp
@@ -11,7 +11,7 @@
#include "libslic3r/PrintConfig.hpp"
#include "Field.hpp"
-#include "GUI_App.hpp"
+#include "I18N.hpp"
// Translate the ifdef
#ifdef __WXOSX__
@@ -24,12 +24,13 @@
namespace Slic3r { namespace GUI {
+// Thrown if the building of a parameter page is canceled.
+class UIBuildCanceled : public std::exception {};
+class OG_CustomCtrl;
+
/// Widget type describes a function object that returns a wxWindow (our widget) and accepts a wxWidget (parent window).
using widget_t = std::function<wxSizer*(wxWindow*)>;//!std::function<wxWindow*(wxWindow*)>;
-//auto default_label_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_3DLIGHT); //GetSystemColour
-//auto modified_label_clr = *new wxColour(254, 189, 101);
-
/// Wraps a ConfigOptionDef and adds function object for creating a side_widget.
struct Option {
ConfigOptionDef opt { ConfigOptionDef() };
@@ -37,6 +38,10 @@ struct Option {
widget_t side_widget {nullptr};
bool readonly {false};
+ bool operator==(const Option& rhs) const {
+ return (rhs.opt_id == this->opt_id);
+ }
+
Option(const ConfigOptionDef& _opt, t_config_option_key id) :
opt(_opt), opt_id(id) {}
};
@@ -45,12 +50,18 @@ using t_option = std::unique_ptr<Option>; //!
/// Represents option lines
class Line {
public:
- wxString label {wxString("")};
- wxString label_tooltip {wxString("")};
+ wxString label;
+ wxString label_tooltip;
+ wxString label_path;
+
size_t full_width {0};
- wxSizer* sizer {nullptr};
+ wxColour* full_Label_color {nullptr};
+ bool blink {false};
widget_t widget {nullptr};
std::function<wxWindow*(wxWindow*)> near_label_widget{ nullptr };
+ wxWindow* near_label_widget_win {nullptr};
+ wxSizer* widget_sizer {nullptr};
+ wxSizer* extra_widget_sizer {nullptr};
void append_option(const Option& option) {
m_options.push_back(option);
@@ -59,10 +70,11 @@ public:
m_extra_widgets.push_back(widget);
}
Line(wxString label, wxString tooltip) :
- label(label), label_tooltip(tooltip) {}
+ label(_(label)), label_tooltip(_(tooltip)) {}
const std::vector<widget_t>& get_extra_widgets() const {return m_extra_widgets;}
const std::vector<Option>& get_options() const { return m_options; }
+ bool* get_blink_ptr() { return &blink; }
private:
std::vector<Option> m_options;//! {std::vector<Option>()};
@@ -78,9 +90,10 @@ class OptionsGroup {
wxStaticBox* stb;
public:
const bool staticbox {true};
- const wxString title {wxString("")};
+ const wxString title;
size_t label_width = 20 ;// {200};
wxSizer* sizer {nullptr};
+ OG_CustomCtrl* custom_ctrl{ nullptr };
column_t extra_column {nullptr};
t_change m_on_change { nullptr };
// To be called when the field loses focus, to assign a new initial value to the field.
@@ -102,26 +115,21 @@ public:
/// Returns a copy of the pointer of the parent wxWindow.
/// Accessor function is because users are not allowed to change the parent
/// but defining it as const means a lot of const_casts to deal with wx functions.
- inline wxWindow* parent() const {
-#if 0//#ifdef __WXGTK__
- return m_panel;
-#else
- return m_parent;
-#endif /* __WXGTK__ */
- }
-#if 0//#ifdef __WXGTK__
- wxWindow* get_parent() const {
- return m_parent;
- }
-#endif /* __WXGTK__ */
+ inline wxWindow* parent() const { return m_parent; }
- wxWindow* ctrl_parent() const {
- return this->stb ? (wxWindow*)this->stb : this->parent();
- }
+ wxWindow* ctrl_parent() const;
+
+ void append_line(const Line& line);
+ // create controls for the option group
+ void activate_line(Line& line);
+
+ // create all controls for the option group from the m_lines
+ bool activate(std::function<void()> throw_if_canceled = [](){});
+ // delete all controls from the option group
+ void clear(bool destroy_custom_ctrl = false);
- void append_line(const Line& line, wxStaticText** full_Label = nullptr);
- Line create_single_option_line(const Option& option) const;
- void append_single_option_line(const Option& option) { append_line(create_single_option_line(option)); }
+ Line create_single_option_line(const Option& option, const wxString& path = wxEmptyString) const;
+ void append_single_option_line(const Option& option, const wxString& path = wxEmptyString) { append_line(create_single_option_line(option, path)); }
// return a non-owning pointer reference
inline Field* get_field(const t_config_option_key& id) const{
@@ -141,13 +149,8 @@ public:
return out;
}
- bool set_side_text(const t_config_option_key& opt_key, const wxString& side_text) {
- if (m_fields.find(opt_key) == m_fields.end()) return false;
- auto st = m_fields.at(opt_key)->m_side_text;
- if (!st) return false;
- st->SetLabel(side_text);
- return true;
- }
+ void show_field(const t_config_option_key& opt_key, bool show = true);
+ void hide_field(const t_config_option_key& opt_key) { show_field(opt_key, false); }
void set_name(const wxString& new_name) {
stb->SetLabel(new_name);
@@ -157,53 +160,25 @@ public:
inline void disable() { for (auto& field : m_fields) field.second->disable(); }
void set_grid_vgap(int gap) { m_grid_sizer->SetVGap(gap); }
- void set_show_modified_btns_val(bool show) {
- m_show_modified_btns = show;
- }
-
void clear_fields_except_of(const std::vector<std::string> left_fields);
- void hide_labels() {
- label_width = 0;
- m_grid_sizer->SetCols(m_grid_sizer->GetEffectiveColsCount()-1);
- static_cast<wxFlexGridSizer*>(m_grid_sizer)->AddGrowableCol(!extra_column ? 0 : 1);
- }
+ void hide_labels() { label_width = 0; }
OptionsGroup( wxWindow* _parent, const wxString& title, bool is_tab_opt = false,
- column_t extra_clmn = nullptr) :
- m_parent(_parent), title(title),
- m_show_modified_btns(is_tab_opt),
- staticbox(title!=""), extra_column(extra_clmn) {
- if (staticbox) {
- stb = new wxStaticBox(_parent, wxID_ANY, title);
- if (!wxOSX) stb->SetBackgroundStyle(wxBG_STYLE_PAINT);
- stb->SetFont(wxGetApp().bold_font());
- } else
- stb = nullptr;
- sizer = (staticbox ? new wxStaticBoxSizer(stb, wxVERTICAL) : new wxBoxSizer(wxVERTICAL));
- auto num_columns = 1U;
- if (label_width != 0) num_columns++;
- if (extra_column != nullptr) num_columns++;
- m_grid_sizer = new wxFlexGridSizer(0, num_columns, 1,0);
- static_cast<wxFlexGridSizer*>(m_grid_sizer)->SetFlexibleDirection(wxBOTH/*wxHORIZONTAL*/);
- static_cast<wxFlexGridSizer*>(m_grid_sizer)->AddGrowableCol(label_width == 0 ? 0 : !extra_column ? 1 : 2 );
-#if 0//#ifdef __WXGTK__
- m_panel = new wxPanel( _parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL );
- sizer->Fit(m_panel);
- sizer->Add(m_panel, 0, wxEXPAND | wxALL, wxOSX||!staticbox ? 0: 5);
-#else
- sizer->Add(m_grid_sizer, 0, wxEXPAND | wxALL, wxOSX||!staticbox ? 0: 5);
-#endif /* __WXGTK__ */
- }
+ column_t extra_clmn = nullptr);
+ ~OptionsGroup() { clear(true); }
wxGridSizer* get_grid_sizer() { return m_grid_sizer; }
+ const std::vector<Line>& get_lines() { return m_lines; }
+ bool is_legend_line();
protected:
std::map<t_config_option_key, Option> m_options;
wxWindow* m_parent {nullptr};
std::vector<ConfigOptionMode> m_options_mode;
std::vector<wxWindow*> m_extra_column_item_ptrs;
- std::vector<wxWindow*> m_near_label_widget_ptrs;
+
+ std::vector<Line> m_lines;
/// Field list, contains unique_ptrs of the derived type.
/// using types that need to know what it is beyond the public interface
@@ -212,7 +187,10 @@ protected:
bool m_disabled {false};
wxGridSizer* m_grid_sizer {nullptr};
// "true" if option is created in preset tabs
- bool m_show_modified_btns{ false };
+ bool m_use_custom_ctrl{ false };
+
+ // "true" if control should be created on custom_ctrl
+ bool m_use_custom_ctrl_as_parent { false };
// This panel is needed for correct showing of the ToolTips for Button, StaticText and CheckBox
// Tooltips on GTK doesn't work inside wxStaticBoxSizer unless you insert a panel
@@ -224,10 +202,9 @@ protected:
/// Generate a wxSizer or wxWindow from a configuration option
/// Precondition: opt resolves to a known ConfigOption
/// Postcondition: fields contains a wx gui object.
- const t_field& build_field(const t_config_option_key& id, const ConfigOptionDef& opt, wxStaticText* label = nullptr);
- const t_field& build_field(const t_config_option_key& id, wxStaticText* label = nullptr);
- const t_field& build_field(const Option& opt, wxStaticText* label = nullptr);
- void add_undo_buttuns_to_sizer(wxSizer* sizer, const t_field& field);
+ const t_field& build_field(const t_config_option_key& id, const ConfigOptionDef& opt);
+ const t_field& build_field(const t_config_option_key& id);
+ const t_field& build_field(const Option& opt);
virtual void on_kill_focus(const std::string& opt_key) {};
virtual void on_set_focus(const std::string& opt_key);
@@ -238,31 +215,35 @@ protected:
class ConfigOptionsGroup: public OptionsGroup {
public:
- ConfigOptionsGroup( wxWindow* parent, const wxString& title, DynamicPrintConfig* _config = nullptr,
+ ConfigOptionsGroup( wxWindow* parent, const wxString& title, DynamicPrintConfig* config = nullptr,
bool is_tab_opt = false, column_t extra_clmn = nullptr) :
- OptionsGroup(parent, title, is_tab_opt, extra_clmn), m_config(_config) {}
+ OptionsGroup(parent, title, is_tab_opt, extra_clmn), m_config(config) {}
+ ConfigOptionsGroup( wxWindow* parent, const wxString& title, ModelConfig* config,
+ bool is_tab_opt = false, column_t extra_clmn = nullptr) :
+ OptionsGroup(parent, title, is_tab_opt, extra_clmn), m_config(&config->get()), m_modelconfig(config) {}
+ ConfigOptionsGroup( wxWindow* parent) :
+ OptionsGroup(parent, wxEmptyString, true, nullptr) {}
- /// reference to libslic3r config, non-owning pointer (?).
- DynamicPrintConfig* m_config {nullptr};
- bool m_full_labels {0};
- t_opt_map m_opt_map;
+ const std::string& config_category() const throw() { return m_config_category; }
+ const t_opt_map& opt_map() const throw() { return m_opt_map; }
- void set_config(DynamicPrintConfig* config) { m_config = config; }
+ void set_config_category(const std::string &category) { this->m_config_category = category; }
+ void set_config(DynamicPrintConfig* config) { m_config = config; m_modelconfig = nullptr; }
Option get_option(const std::string& opt_key, int opt_index = -1);
- Line create_single_option_line(const std::string& title, int idx = -1) /*const*/{
+ Line create_single_option_line(const std::string& title, const wxString& path = wxEmptyString, int idx = -1) /*const*/{
Option option = get_option(title, idx);
- return OptionsGroup::create_single_option_line(option);
+ return OptionsGroup::create_single_option_line(option, path);
}
- Line create_single_option_line(const Option& option) const {
- return OptionsGroup::create_single_option_line(option);
+ Line create_single_option_line(const Option& option, const wxString& path = wxEmptyString) const {
+ return OptionsGroup::create_single_option_line(option, path);
}
- void append_single_option_line(const Option& option) {
- OptionsGroup::append_single_option_line(option);
+ void append_single_option_line(const Option& option, const wxString& path = wxEmptyString) {
+ OptionsGroup::append_single_option_line(option, path);
}
- void append_single_option_line(const std::string title, int idx = -1)
+ void append_single_option_line(const std::string title, const wxString& path = wxEmptyString, int idx = -1)
{
Option option = get_option(title, idx);
- append_single_option_line(option);
+ append_single_option_line(option, path);
}
void on_change_OG(const t_config_option_key& opt_id, const boost::any& value) override;
@@ -274,19 +255,37 @@ public:
// return value shows visibility : false => all options are hidden
void Hide();
void Show(const bool show);
+ bool is_visible(ConfigOptionMode mode);
bool update_visibility(ConfigOptionMode mode);
void msw_rescale();
+ void sys_color_changed();
+ void refresh();
boost::any config_value(const std::string& opt_key, int opt_index, bool deserialize);
// return option value from config
boost::any get_config_value(const DynamicPrintConfig& config, const std::string& opt_key, int opt_index = -1);
Field* get_fieldc(const t_config_option_key& opt_key, int opt_index);
+ std::pair<OG_CustomCtrl*, bool*> get_custom_ctrl_with_blinking_ptr(const t_config_option_key& opt_key, int opt_index/* = -1*/);
+
+private:
+ // Reference to libslic3r config or ModelConfig::get(), non-owning pointer.
+ // The reference is const, so that the spots which modify m_config are clearly
+ // demarcated by const_cast and m_config_changed_callback is called afterwards.
+ const DynamicPrintConfig* m_config {nullptr};
+ // If the config is modelconfig, then ModelConfig::touch() has to be called after value change.
+ ModelConfig* m_modelconfig { nullptr };
+ bool m_full_labels{ 0 };
+ t_opt_map m_opt_map;
+ std::string m_config_category;
+
+ // Change an option on m_config, possibly call ModelConfig::touch().
+ void change_opt_value(const t_config_option_key& opt_key, const boost::any& value, int opt_index = 0);
};
// Static text shown among the options.
class ogStaticText :public wxStaticText{
public:
ogStaticText() {}
- ogStaticText(wxWindow* parent, const char *text) : wxStaticText(parent, wxID_ANY, text, wxDefaultPosition, wxDefaultSize) {}
+ ogStaticText(wxWindow* parent, const wxString& text);
~ogStaticText() {}
void SetText(const wxString& value, bool wrap = true);
diff --git a/src/slic3r/GUI/PhysicalPrinterDialog.cpp b/src/slic3r/GUI/PhysicalPrinterDialog.cpp
new file mode 100644
index 000000000..620a3ddca
--- /dev/null
+++ b/src/slic3r/GUI/PhysicalPrinterDialog.cpp
@@ -0,0 +1,649 @@
+#include "PhysicalPrinterDialog.hpp"
+#include "PresetComboBoxes.hpp"
+
+#include <cstddef>
+#include <vector>
+#include <string>
+#include <boost/algorithm/string.hpp>
+
+#include <wx/sizer.h>
+#include <wx/stattext.h>
+#include <wx/textctrl.h>
+#include <wx/button.h>
+#include <wx/statbox.h>
+#include <wx/wupdlock.h>
+
+#include "libslic3r/libslic3r.h"
+#include "libslic3r/PrintConfig.hpp"
+#include "libslic3r/PresetBundle.hpp"
+
+#include "GUI.hpp"
+#include "GUI_App.hpp"
+#include "MainFrame.hpp"
+#include "format.hpp"
+#include "Tab.hpp"
+#include "wxExtensions.hpp"
+#include "PrintHostDialogs.hpp"
+#include "../Utils/ASCIIFolding.hpp"
+#include "../Utils/PrintHost.hpp"
+#include "../Utils/FixModelByWin10.hpp"
+#include "../Utils/UndoRedo.hpp"
+#include "RemovableDriveManager.hpp"
+#include "BitmapCache.hpp"
+#include "BonjourDialog.hpp"
+
+namespace Slic3r {
+namespace GUI {
+
+#define BORDER_W 10
+
+//------------------------------------------
+// PresetForPrinter
+//------------------------------------------
+
+PresetForPrinter::PresetForPrinter(PhysicalPrinterDialog* parent, const std::string& preset_name) :
+ m_parent(parent)
+{
+ m_sizer = new wxBoxSizer(wxVERTICAL);
+
+ m_delete_preset_btn = new ScalableButton(parent, wxID_ANY, "cross", "", wxDefaultSize, wxDefaultPosition, /*wxBU_LEFT | */wxBU_EXACTFIT);
+ m_delete_preset_btn->SetFont(wxGetApp().normal_font());
+ m_delete_preset_btn->SetToolTip(_L("Delete this preset from this printer device"));
+ m_delete_preset_btn->Bind(wxEVT_BUTTON, &PresetForPrinter::DeletePreset, this);
+
+ m_presets_list = new PresetComboBox(parent, Preset::TYPE_PRINTER);
+ m_presets_list->set_printer_technology(parent->get_printer_technology());
+
+ m_presets_list->set_selection_changed_function([this](int selection) {
+ std::string selected_string = Preset::remove_suffix_modified(m_presets_list->GetString(selection).ToUTF8().data());
+ Preset* preset = wxGetApp().preset_bundle->printers.find_preset(selected_string);
+ assert(preset);
+ Preset& edited_preset = wxGetApp().preset_bundle->printers.get_edited_preset();
+ if (preset->name == edited_preset.name)
+ preset = &edited_preset;
+
+ // if created physical printer doesn't have any settings, use the settings from the selected preset
+ if (m_parent->get_printer()->has_empty_config()) {
+ // update Print Host upload from the selected preset
+ m_parent->get_printer()->update_from_preset(*preset);
+ // update values in parent (PhysicalPrinterDialog)
+ m_parent->update();
+ }
+
+ // update PrinterTechnology if it was changed
+ if (m_presets_list->set_printer_technology(preset->printer_technology()))
+ m_parent->set_printer_technology(preset->printer_technology());
+
+ update_full_printer_name();
+ });
+ m_presets_list->update(preset_name);
+
+ m_info_line = new wxStaticText(parent, wxID_ANY, _L("This printer will be shown in the presets list as") + ":");
+
+ m_full_printer_name = new wxStaticText(parent, wxID_ANY, "");
+ m_full_printer_name->SetFont(wxGetApp().bold_font());
+
+ wxBoxSizer* preset_sizer = new wxBoxSizer(wxHORIZONTAL);
+ preset_sizer->Add(m_presets_list , 1, wxEXPAND);
+ preset_sizer->Add(m_delete_preset_btn , 0, wxEXPAND | wxLEFT, BORDER_W);
+
+ wxBoxSizer* name_sizer = new wxBoxSizer(wxHORIZONTAL);
+ name_sizer->Add(m_info_line, 0, wxEXPAND);
+ name_sizer->Add(m_full_printer_name, 0, wxEXPAND | wxLEFT, BORDER_W);
+
+ m_sizer->Add(preset_sizer , 0, wxEXPAND);
+ m_sizer->Add(name_sizer, 0, wxEXPAND);
+}
+
+PresetForPrinter::~PresetForPrinter()
+{
+ m_presets_list->Destroy();
+ m_delete_preset_btn->Destroy();
+ m_info_line->Destroy();
+ m_full_printer_name->Destroy();
+}
+
+void PresetForPrinter::DeletePreset(wxEvent& event)
+{
+ m_parent->DeletePreset(this);
+}
+
+void PresetForPrinter::update_full_printer_name()
+{
+ wxString printer_name = m_parent->get_printer_name();
+ wxString preset_name = m_presets_list->GetString(m_presets_list->GetSelection());
+
+ m_full_printer_name->SetLabelText(printer_name + " * " + preset_name);
+}
+
+std::string PresetForPrinter::get_preset_name()
+{
+ return into_u8(m_presets_list->GetString(m_presets_list->GetSelection()));
+}
+
+void PresetForPrinter::SuppressDelete()
+{
+ m_delete_preset_btn->Enable(false);
+
+ // this case means that now we have only one related preset for the printer
+ // So, allow any selection
+ m_presets_list->set_printer_technology(ptAny);
+ m_presets_list->update();
+}
+
+void PresetForPrinter::AllowDelete()
+{
+ if (!m_delete_preset_btn->IsEnabled())
+ m_delete_preset_btn->Enable();
+
+ m_presets_list->set_printer_technology(m_parent->get_printer_technology());
+ m_presets_list->update();
+}
+
+void PresetForPrinter::msw_rescale()
+{
+ m_presets_list->msw_rescale();
+ m_delete_preset_btn->msw_rescale();
+}
+
+
+//------------------------------------------
+// PhysicalPrinterDialog
+//------------------------------------------
+
+PhysicalPrinterDialog::PhysicalPrinterDialog(wxWindow* parent, wxString printer_name) :
+ DPIDialog(parent, wxID_ANY, _L("Physical Printer"), wxDefaultPosition, wxSize(45 * wxGetApp().em_unit(), -1), wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER),
+ m_printer("", wxGetApp().preset_bundle->physical_printers.default_config())
+{
+ SetFont(wxGetApp().normal_font());
+ SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
+
+ m_default_name = _L("Type here the name of your printer device");
+ bool new_printer = true;
+
+ if (printer_name.IsEmpty())
+ printer_name = m_default_name;
+ else {
+ std::string full_name = into_u8(printer_name);
+ printer_name = from_u8(PhysicalPrinter::get_short_name(full_name));
+ new_printer = false;
+ }
+
+ wxStaticText* label_top = new wxStaticText(this, wxID_ANY, _L("Descriptive name for the printer") + ":");
+
+ m_add_preset_btn = new ScalableButton(this, wxID_ANY, "add_copies", "", wxDefaultSize, wxDefaultPosition, /*wxBU_LEFT | */wxBU_EXACTFIT);
+ m_add_preset_btn->SetFont(wxGetApp().normal_font());
+ m_add_preset_btn->SetToolTip(_L("Add preset for this printer device"));
+ m_add_preset_btn->Bind(wxEVT_BUTTON, &PhysicalPrinterDialog::AddPreset, this);
+
+ m_printer_name = new wxTextCtrl(this, wxID_ANY, printer_name, wxDefaultPosition, wxDefaultSize);
+ m_printer_name->Bind(wxEVT_TEXT, [this](wxEvent&) { this->update_full_printer_names(); });
+
+ PhysicalPrinterCollection& printers = wxGetApp().preset_bundle->physical_printers;
+ PhysicalPrinter* printer = printers.find_printer(into_u8(printer_name));
+ if (!printer) {
+ const Preset& preset = wxGetApp().preset_bundle->printers.get_edited_preset();
+ m_printer = PhysicalPrinter(into_u8(printer_name), m_printer.config, preset);
+ // if printer_name is empty it means that new printer is created, so enable all items in the preset list
+ m_presets.emplace_back(new PresetForPrinter(this, preset.name));
+ }
+ else
+ {
+ m_printer = *printer;
+ const std::set<std::string>& preset_names = printer->get_preset_names();
+ for (const std::string& preset_name : preset_names)
+ m_presets.emplace_back(new PresetForPrinter(this, preset_name));
+ }
+
+ if (m_presets.size() == 1)
+ m_presets.front()->SuppressDelete();
+
+ update_full_printer_names();
+
+ m_config = &m_printer.config;
+
+ m_optgroup = new ConfigOptionsGroup(this, _L("Print Host upload"), m_config);
+ build_printhost_settings(m_optgroup);
+
+ wxStdDialogButtonSizer* btns = this->CreateStdDialogButtonSizer(wxOK | wxCANCEL);
+ wxButton* btnOK = static_cast<wxButton*>(this->FindWindowById(wxID_OK, this));
+ btnOK->Bind(wxEVT_BUTTON, &PhysicalPrinterDialog::OnOK, this);
+
+ wxBoxSizer* nameSizer = new wxBoxSizer(wxHORIZONTAL);
+ nameSizer->Add(m_printer_name, 1, wxEXPAND);
+ nameSizer->Add(m_add_preset_btn, 0, wxEXPAND | wxLEFT, BORDER_W);
+
+ m_presets_sizer = new wxBoxSizer(wxVERTICAL);
+ for (PresetForPrinter* preset : m_presets)
+ m_presets_sizer->Add(preset->sizer(), 1, wxEXPAND | wxTOP, BORDER_W);
+
+ wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL);
+
+ topSizer->Add(label_top , 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, BORDER_W);
+ topSizer->Add(nameSizer , 0, wxEXPAND | wxLEFT | wxRIGHT, BORDER_W);
+ topSizer->Add(m_presets_sizer , 0, wxEXPAND | wxLEFT | wxRIGHT, BORDER_W);
+ topSizer->Add(m_optgroup->sizer , 1, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, BORDER_W);
+ topSizer->Add(btns , 0, wxEXPAND | wxALL, BORDER_W);
+
+ SetSizer(topSizer);
+ topSizer->SetSizeHints(this);
+
+ if (new_printer) {
+ m_printer_name->SetFocus();
+ m_printer_name->SelectAll();
+ }
+
+ this->CenterOnScreen();
+}
+
+PhysicalPrinterDialog::~PhysicalPrinterDialog()
+{
+ for (PresetForPrinter* preset : m_presets) {
+ delete preset;
+ preset = nullptr;
+ }
+}
+
+void PhysicalPrinterDialog::update_printers()
+{
+ wxBusyCursor wait;
+
+ std::unique_ptr<PrintHost> host(PrintHost::get_print_host(m_config));
+
+ wxArrayString printers;
+ Field *rs = m_optgroup->get_field("printhost_port");
+ try {
+ if (! host->get_printers(printers))
+ printers.clear();
+ } catch (const HostNetworkError &err) {
+ printers.clear();
+ show_error(this, _L("Connection to printers connected via the print host failed.") + "\n\n" + from_u8(err.what()));
+ }
+ Choice *choice = dynamic_cast<Choice*>(rs);
+ choice->set_values(printers);
+ printers.empty() ? rs->disable() : rs->enable();
+}
+
+void PhysicalPrinterDialog::build_printhost_settings(ConfigOptionsGroup* m_optgroup)
+{
+ m_optgroup->m_on_change = [this](t_config_option_key opt_key, boost::any value) {
+ if (opt_key == "host_type" || opt_key == "printhost_authorization_type")
+ this->update();
+ if (opt_key == "print_host")
+ this->update_printhost_buttons();
+ };
+
+ m_optgroup->append_single_option_line("host_type");
+
+ auto create_sizer_with_btn = [this](wxWindow* parent, ScalableButton** btn, const std::string& icon_name, const wxString& label) {
+ *btn = new ScalableButton(parent, wxID_ANY, icon_name, label, wxDefaultSize, wxDefaultPosition, wxBU_LEFT | wxBU_EXACTFIT);
+ (*btn)->SetFont(wxGetApp().normal_font());
+
+ auto sizer = new wxBoxSizer(wxHORIZONTAL);
+ sizer->Add(*btn);
+ return sizer;
+ };
+
+ auto printhost_browse = [=](wxWindow* parent)
+ {
+ auto sizer = create_sizer_with_btn(parent, &m_printhost_browse_btn, "browse", _L("Browse") + " " + dots);
+ m_printhost_browse_btn->Bind(wxEVT_BUTTON, [=](wxCommandEvent& e) {
+ BonjourDialog dialog(this, Preset::printer_technology(m_printer.config));
+ if (dialog.show_and_lookup()) {
+ m_optgroup->set_value("print_host", std::move(dialog.get_selected()), true);
+ m_optgroup->get_field("print_host")->field_changed();
+ }
+ });
+
+ return sizer;
+ };
+
+ auto print_host_test = [=](wxWindow* parent) {
+ auto sizer = create_sizer_with_btn(parent, &m_printhost_test_btn, "test", _L("Test"));
+
+ m_printhost_test_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) {
+ std::unique_ptr<PrintHost> host(PrintHost::get_print_host(m_config));
+ if (!host) {
+ const wxString text = _L("Could not get a valid Printer Host reference");
+ show_error(this, text);
+ return;
+ }
+ wxString msg;
+ bool result;
+ {
+ // Show a wait cursor during the connection test, as it is blocking UI.
+ wxBusyCursor wait;
+ result = host->test(msg);
+ }
+ if (result)
+ show_info(this, host->get_test_ok_msg(), _L("Success!"));
+ else
+ show_error(this, host->get_test_failed_msg(msg));
+ });
+
+ return sizer;
+ };
+
+ auto print_host_printers = [this, create_sizer_with_btn](wxWindow* parent) {
+ //add_scaled_button(parent, &m_printhost_port_browse_btn, "browse", _(L("Refresh Printers")), wxBU_LEFT | wxBU_EXACTFIT);
+ auto sizer = create_sizer_with_btn(parent, &m_printhost_port_browse_btn, "browse", _(L("Refresh Printers")));
+ ScalableButton* btn = m_printhost_port_browse_btn;
+ btn->SetFont(Slic3r::GUI::wxGetApp().normal_font());
+ btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent e) { update_printers(); });
+ return sizer;
+ };
+
+ // Set a wider width for a better alignment
+ Option option = m_optgroup->get_option("print_host");
+ option.opt.width = Field::def_width_wider();
+ Line host_line = m_optgroup->create_single_option_line(option);
+ host_line.append_widget(printhost_browse);
+ host_line.append_widget(print_host_test);
+ m_optgroup->append_line(host_line);
+
+ m_optgroup->append_single_option_line("printhost_authorization_type");
+
+ option = m_optgroup->get_option("printhost_apikey");
+ option.opt.width = Field::def_width_wider();
+ m_optgroup->append_single_option_line(option);
+
+ option = m_optgroup->get_option("printhost_port");
+ option.opt.width = Field::def_width_wider();
+ Line port_line = m_optgroup->create_single_option_line(option);
+ port_line.append_widget(print_host_printers);
+ m_optgroup->append_line(port_line);
+
+ const auto ca_file_hint = _u8L("HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate.");
+
+ if (Http::ca_file_supported()) {
+ option = m_optgroup->get_option("printhost_cafile");
+ option.opt.width = Field::def_width_wider();
+ Line cafile_line = m_optgroup->create_single_option_line(option);
+
+ auto printhost_cafile_browse = [=](wxWindow* parent) {
+ auto sizer = create_sizer_with_btn(parent, &m_printhost_cafile_browse_btn, "browse", _L("Browse") + " " + dots);
+ m_printhost_cafile_browse_btn->Bind(wxEVT_BUTTON, [this, m_optgroup](wxCommandEvent e) {
+ static const auto filemasks = _L("Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*");
+ wxFileDialog openFileDialog(this, _L("Open CA certificate file"), "", "", filemasks, wxFD_OPEN | wxFD_FILE_MUST_EXIST);
+ if (openFileDialog.ShowModal() != wxID_CANCEL) {
+ m_optgroup->set_value("printhost_cafile", std::move(openFileDialog.GetPath()), true);
+ m_optgroup->get_field("printhost_cafile")->field_changed();
+ }
+ });
+
+ return sizer;
+ };
+
+ cafile_line.append_widget(printhost_cafile_browse);
+ m_optgroup->append_line(cafile_line);
+
+ Line cafile_hint{ "", "" };
+ cafile_hint.full_width = 1;
+ cafile_hint.widget = [this, ca_file_hint](wxWindow* parent) {
+ auto txt = new wxStaticText(parent, wxID_ANY, ca_file_hint);
+ auto sizer = new wxBoxSizer(wxHORIZONTAL);
+ sizer->Add(txt);
+ return sizer;
+ };
+ m_optgroup->append_line(cafile_hint);
+ }
+ else {
+ Line line{ "", "" };
+ line.full_width = 1;
+
+ line.widget = [ca_file_hint](wxWindow* parent) {
+ std::string info = _u8L("HTTPS CA File") + ":\n\t" +
+ (boost::format(_u8L("On this system, %s uses HTTPS certificates from the system Certificate Store or Keychain.")) % SLIC3R_APP_NAME).str() +
+ "\n\t" + _u8L("To use a custom CA file, please import your CA file into Certificate Store / Keychain.");
+
+ //auto txt = new wxStaticText(parent, wxID_ANY, from_u8((boost::format("%1%\n\n\t%2%") % info % ca_file_hint).str()));
+ auto txt = new wxStaticText(parent, wxID_ANY, from_u8((boost::format("%1%\n\t%2%") % info % ca_file_hint).str()));
+ txt->SetFont(wxGetApp().normal_font());
+ auto sizer = new wxBoxSizer(wxHORIZONTAL);
+ sizer->Add(txt, 1, wxEXPAND);
+ return sizer;
+ };
+
+ m_optgroup->append_line(line);
+ }
+
+ for (const std::string& opt_key : std::vector<std::string>{ "printhost_user", "printhost_password" }) {
+ option = m_optgroup->get_option(opt_key);
+ option.opt.width = Field::def_width_wider();
+ m_optgroup->append_single_option_line(option);
+ }
+
+ m_optgroup->activate();
+
+ Field* printhost_field = m_optgroup->get_field("print_host");
+ if (printhost_field)
+ {
+ wxTextCtrl* temp = dynamic_cast<wxTextCtrl*>(printhost_field->getWindow());
+ if (temp)
+ temp->Bind(wxEVT_TEXT, ([this, printhost_field, temp](wxEvent& e)
+ {
+#ifndef __WXGTK__
+ e.Skip();
+ temp->GetToolTip()->Enable(true);
+#endif // __WXGTK__
+ TextCtrl* field = dynamic_cast<TextCtrl*>(printhost_field);
+ if (field)
+ field->propagate_value();
+ }), temp->GetId());
+ }
+
+ // Always fill in the "printhost_port" combo box from the config and select it.
+ {
+ Choice* choice = dynamic_cast<Choice*>(m_optgroup->get_field("printhost_port"));
+ choice->set_values({ m_config->opt_string("printhost_port") });
+ choice->set_selection();
+ }
+
+ update();
+}
+
+void PhysicalPrinterDialog::update_printhost_buttons()
+{
+ std::unique_ptr<PrintHost> host(PrintHost::get_print_host(m_config));
+ m_printhost_test_btn->Enable(!m_config->opt_string("print_host").empty() && host->can_test());
+ m_printhost_browse_btn->Enable(host->has_auto_discovery());
+}
+
+void PhysicalPrinterDialog::update()
+{
+ m_optgroup->reload_config();
+
+ const PrinterTechnology tech = Preset::printer_technology(*m_config);
+ // Only offer the host type selection for FFF, for SLA it's always the SL1 printer (at the moment)
+ bool supports_multiple_printers = false;
+ if (tech == ptFFF) {
+ m_optgroup->show_field("host_type");
+ m_optgroup->hide_field("printhost_authorization_type");
+ m_optgroup->show_field("printhost_apikey", true);
+ for (const std::string& opt_key : std::vector<std::string>{ "printhost_user", "printhost_password" })
+ m_optgroup->hide_field(opt_key);
+ const auto opt = m_config->option<ConfigOptionEnum<PrintHostType>>("host_type");
+ supports_multiple_printers = opt && opt->value == htRepetier;
+ }
+ else {
+ m_optgroup->set_value("host_type", int(PrintHostType::htOctoPrint), false);
+ m_optgroup->hide_field("host_type");
+
+ m_optgroup->show_field("printhost_authorization_type");
+
+ AuthorizationType auth_type = m_config->option<ConfigOptionEnum<AuthorizationType>>("printhost_authorization_type")->value;
+ m_optgroup->show_field("printhost_apikey", auth_type == AuthorizationType::atKeyPassword);
+
+ for (const char *opt_key : { "printhost_user", "printhost_password" })
+ m_optgroup->show_field(opt_key, auth_type == AuthorizationType::atUserPassword);
+ }
+
+ m_optgroup->show_field("printhost_port", supports_multiple_printers);
+ m_printhost_port_browse_btn->Show(supports_multiple_printers);
+
+ update_printhost_buttons();
+
+ this->SetSize(this->GetBestSize());
+ this->Layout();
+}
+
+
+wxString PhysicalPrinterDialog::get_printer_name()
+{
+ return m_printer_name->GetValue();
+}
+
+void PhysicalPrinterDialog::update_full_printer_names()
+{
+ for (PresetForPrinter* preset : m_presets)
+ preset->update_full_printer_name();
+
+ this->Layout();
+}
+
+void PhysicalPrinterDialog::set_printer_technology(PrinterTechnology pt)
+{
+ m_config->set_key_value("printer_technology", new ConfigOptionEnum<PrinterTechnology>(pt));
+ update();
+}
+
+PrinterTechnology PhysicalPrinterDialog::get_printer_technology()
+{
+ return m_printer.printer_technology();
+}
+
+void PhysicalPrinterDialog::on_dpi_changed(const wxRect& suggested_rect)
+{
+ const int& em = em_unit();
+
+ m_add_preset_btn->msw_rescale();
+ m_printhost_browse_btn->msw_rescale();
+ m_printhost_test_btn->msw_rescale();
+ if (m_printhost_cafile_browse_btn)
+ m_printhost_cafile_browse_btn->msw_rescale();
+
+ m_optgroup->msw_rescale();
+
+ msw_buttons_rescale(this, em, { wxID_OK, wxID_CANCEL });
+
+ for (PresetForPrinter* preset : m_presets)
+ preset->msw_rescale();
+
+ const wxSize& size = wxSize(45 * em, 35 * em);
+ SetMinSize(size);
+
+ Fit();
+ Refresh();
+}
+
+void PhysicalPrinterDialog::OnOK(wxEvent& event)
+{
+ wxString printer_name = m_printer_name->GetValue();
+ if (printer_name.IsEmpty()) {
+ warning_catcher(this, _L("The supplied name is empty. It can't be saved."));
+ return;
+ }
+ if (printer_name == m_default_name) {
+ warning_catcher(this, _L("You should change the name of your printer device."));
+ return;
+ }
+
+ PhysicalPrinterCollection& printers = wxGetApp().preset_bundle->physical_printers;
+ const PhysicalPrinter* existing = printers.find_printer(into_u8(printer_name), false);
+ if (existing && into_u8(printer_name) != printers.get_selected_printer_name())
+ {
+ wxString msg_text = from_u8((boost::format(_u8L("Printer with name \"%1%\" already exists.")) % existing->name/*printer_name*/).str());
+ msg_text += "\n" + _L("Replace?");
+ wxMessageDialog dialog(nullptr, msg_text, _L("Warning"), wxICON_WARNING | wxYES | wxNO);
+
+ if (dialog.ShowModal() == wxID_NO)
+ return;
+
+ m_printer.name = existing->name;
+ }
+
+ std::set<std::string> repeat_presets;
+ m_printer.reset_presets();
+ for (PresetForPrinter* preset : m_presets) {
+ if (!m_printer.add_preset(preset->get_preset_name()))
+ repeat_presets.emplace(preset->get_preset_name());
+ }
+
+ if (!repeat_presets.empty())
+ {
+ wxString repeatable_presets = "\n";
+ for (const std::string& preset_name : repeat_presets)
+ repeatable_presets += " " + from_u8(preset_name) + "\n";
+ repeatable_presets += "\n";
+
+ wxString msg_text = from_u8((boost::format(_u8L("Following printer preset(s) is duplicated:%1%"
+ "The above preset for printer \"%2%\" will be used just once.")) % repeatable_presets % printer_name).str());
+ wxMessageDialog dialog(nullptr, msg_text, _L("Warning"), wxICON_WARNING | wxOK | wxCANCEL);
+ if (dialog.ShowModal() == wxID_CANCEL)
+ return;
+ }
+
+ std::string renamed_from;
+ // temporary save previous printer name if it was edited
+ if (m_printer.name != into_u8(m_default_name) &&
+ m_printer.name != into_u8(printer_name))
+ renamed_from = m_printer.name;
+
+ //update printer name, if it was changed
+ m_printer.set_name(into_u8(printer_name));
+
+ // save new physical printer
+ printers.save_printer(m_printer, renamed_from);
+
+ if (m_printer.preset_names.find(printers.get_selected_printer_preset_name()) == m_printer.preset_names.end()) {
+ // select first preset for this printer
+ printers.select_printer(m_printer);
+ // refresh preset list on Printer Settings Tab
+ wxGetApp().get_tab(Preset::TYPE_PRINTER)->select_preset(printers.get_selected_printer_preset_name());
+ }
+ else
+ wxGetApp().get_tab(Preset::TYPE_PRINTER)->update_preset_choice();
+
+ event.Skip();
+}
+
+void PhysicalPrinterDialog::AddPreset(wxEvent& event)
+{
+ m_presets.emplace_back(new PresetForPrinter(this));
+ // enable DELETE button for the first preset, if was disabled
+ m_presets.front()->AllowDelete();
+
+ m_presets_sizer->Add(m_presets.back()->sizer(), 1, wxEXPAND | wxTOP, BORDER_W);
+ update_full_printer_names();
+
+ this->Fit();
+}
+
+void PhysicalPrinterDialog::DeletePreset(PresetForPrinter* preset_for_printer)
+{
+ if (m_presets.size() == 1) {
+ wxString msg_text = _L("It's not possible to delete the last related preset for the printer.");
+ wxMessageDialog dialog(nullptr, msg_text, _L("Information"), wxICON_INFORMATION | wxOK);
+ dialog.ShowModal();
+ return;
+ }
+
+ assert(preset_for_printer);
+ auto it = std::find(m_presets.begin(), m_presets.end(), preset_for_printer);
+ if (it == m_presets.end())
+ return;
+
+ const int remove_id = it - m_presets.begin();
+ m_presets_sizer->Remove(remove_id);
+ delete preset_for_printer;
+ m_presets.erase(it);
+
+ if (m_presets.size() == 1)
+ m_presets.front()->SuppressDelete();
+
+ this->Layout();
+ this->Fit();
+}
+
+
+}} // namespace Slic3r::GUI
diff --git a/src/slic3r/GUI/PhysicalPrinterDialog.hpp b/src/slic3r/GUI/PhysicalPrinterDialog.hpp
new file mode 100644
index 000000000..7ee1f7d92
--- /dev/null
+++ b/src/slic3r/GUI/PhysicalPrinterDialog.hpp
@@ -0,0 +1,108 @@
+#ifndef slic3r_PhysicalPrinterDialog_hpp_
+#define slic3r_PhysicalPrinterDialog_hpp_
+
+#include <vector>
+
+#include <wx/gdicmn.h>
+
+#include "libslic3r/Preset.hpp"
+#include "GUI_Utils.hpp"
+
+class wxString;
+class wxTextCtrl;
+class wxStaticText;
+class ScalableButton;
+class wxBoxSizer;
+
+namespace Slic3r {
+
+namespace GUI {
+
+class PresetComboBox;
+
+//------------------------------------------
+// PresetForPrinter
+//------------------------------------------
+//static std::string g_info_string = " (modified)";
+class PhysicalPrinterDialog;
+class PresetForPrinter
+{
+ PhysicalPrinterDialog* m_parent { nullptr };
+
+ PresetComboBox* m_presets_list { nullptr };
+ ScalableButton* m_delete_preset_btn { nullptr };
+ wxStaticText* m_info_line { nullptr };
+ wxStaticText* m_full_printer_name { nullptr };
+
+ wxBoxSizer* m_sizer { nullptr };
+
+ void DeletePreset(wxEvent& event);
+
+public:
+ PresetForPrinter(PhysicalPrinterDialog* parent, const std::string& preset_name = "");
+ ~PresetForPrinter();
+
+ wxBoxSizer* sizer() { return m_sizer; }
+ void update_full_printer_name();
+ std::string get_preset_name();
+ void SuppressDelete();
+ void AllowDelete();
+
+ void msw_rescale();
+ void on_sys_color_changed() {};
+};
+
+
+//------------------------------------------
+// PhysicalPrinterDialog
+//------------------------------------------
+
+class ConfigOptionsGroup;
+class PhysicalPrinterDialog : public DPIDialog
+{
+ PhysicalPrinter m_printer;
+ wxString m_default_name;
+ DynamicPrintConfig* m_config { nullptr };
+
+ wxTextCtrl* m_printer_name { nullptr };
+ std::vector<PresetForPrinter*> m_presets;
+
+ ConfigOptionsGroup* m_optgroup { nullptr };
+
+ ScalableButton* m_add_preset_btn {nullptr};
+ ScalableButton* m_printhost_browse_btn {nullptr};
+ ScalableButton* m_printhost_test_btn {nullptr};
+ ScalableButton* m_printhost_cafile_browse_btn {nullptr};
+ ScalableButton* m_printhost_port_browse_btn {nullptr};
+
+ wxBoxSizer* m_presets_sizer {nullptr};
+
+ void build_printhost_settings(ConfigOptionsGroup* optgroup);
+ void OnOK(wxEvent& event);
+ void AddPreset(wxEvent& event);
+
+public:
+ PhysicalPrinterDialog(wxWindow* parent, wxString printer_name);
+ ~PhysicalPrinterDialog();
+
+ void update();
+ void update_printhost_buttons();
+ void update_printers();
+ wxString get_printer_name();
+ void update_full_printer_names();
+ PhysicalPrinter* get_printer() {return &m_printer; }
+ void set_printer_technology(PrinterTechnology pt);
+ PrinterTechnology get_printer_technology();
+
+ void DeletePreset(PresetForPrinter* preset_for_printer);
+
+protected:
+ void on_dpi_changed(const wxRect& suggested_rect) override;
+ void on_sys_color_changed() override {};
+};
+
+
+} // namespace GUI
+} // namespace Slic3r
+
+#endif
diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp
index 8388c1cfd..7824dcfdf 100644
--- a/src/slic3r/GUI/Plater.cpp
+++ b/src/slic3r/GUI/Plater.cpp
@@ -12,6 +12,7 @@
#include <boost/filesystem/path.hpp>
#include <boost/filesystem/operations.hpp>
#include <boost/log/trivial.hpp>
+#include <boost/nowide/convert.hpp>
#include <wx/sizer.h>
#include <wx/stattext.h>
@@ -23,7 +24,6 @@
#include <wx/dnd.h>
#include <wx/progdlg.h>
#include <wx/wupdlock.h>
-#include <wx/colordlg.h>
#include <wx/numdlg.h>
#include <wx/debug.h>
#include <wx/busyinfo.h>
@@ -32,26 +32,17 @@
#include "libslic3r/Format/STL.hpp"
#include "libslic3r/Format/AMF.hpp"
#include "libslic3r/Format/3mf.hpp"
-#include "libslic3r/GCode/PreviewData.hpp"
-#if ENABLE_THUMBNAIL_GENERATOR
#include "libslic3r/GCode/ThumbnailData.hpp"
-#endif // ENABLE_THUMBNAIL_GENERATOR
#include "libslic3r/Model.hpp"
#include "libslic3r/SLA/Hollowing.hpp"
-#include "libslic3r/SLA/Rotfinder.hpp"
#include "libslic3r/SLA/SupportPoint.hpp"
+#include "libslic3r/SLA/ReprojectPointsOnMesh.hpp"
#include "libslic3r/Polygon.hpp"
#include "libslic3r/Print.hpp"
#include "libslic3r/PrintConfig.hpp"
#include "libslic3r/SLAPrint.hpp"
#include "libslic3r/Utils.hpp"
-
-//#include "libslic3r/ClipperUtils.hpp"
-
-// #include "libnest2d/optimizers/nlopt/genetic.hpp"
-// #include "libnest2d/backends/clipper/geometries.hpp"
-// #include "libnest2d/utils/rotcalipers.hpp"
-#include "libslic3r/MinAreaBoundingBox.hpp"
+#include "libslic3r/PresetBundle.hpp"
#include "GUI.hpp"
#include "GUI_App.hpp"
@@ -61,6 +52,7 @@
#include "GUI_Utils.hpp"
#include "wxExtensions.hpp"
#include "MainFrame.hpp"
+#include "format.hpp"
#include "3DScene.hpp"
#include "GLCanvas3D.hpp"
#include "Selection.hpp"
@@ -70,8 +62,10 @@
#include "Camera.hpp"
#include "Mouse3DController.hpp"
#include "Tab.hpp"
-#include "Job.hpp"
-#include "PresetBundle.hpp"
+#include "Jobs/ArrangeJob.hpp"
+#include "Jobs/FillBedJob.hpp"
+#include "Jobs/RotoptimizeJob.hpp"
+#include "Jobs/SLAImportJob.hpp"
#include "BackgroundSlicingProcess.hpp"
#include "ProgressStatusBar.hpp"
#include "PrintHostDialogs.hpp"
@@ -80,8 +74,16 @@
#include "../Utils/PrintHost.hpp"
#include "../Utils/FixModelByWin10.hpp"
#include "../Utils/UndoRedo.hpp"
-#include "../Utils/Thread.hpp"
+#include "../Utils/PresetUpdater.hpp"
+#include "../Utils/Process.hpp"
#include "RemovableDriveManager.hpp"
+#include "InstanceCheck.hpp"
+#include "NotificationManager.hpp"
+#include "PresetComboBoxes.hpp"
+
+#ifdef __APPLE__
+#include "Gizmos/GLGizmosManager.hpp"
+#endif // __APPLE__
#include <wx/glcanvas.h> // Needs to be last because reasons :-/
#include "WipeTowerDialog.hpp"
@@ -92,10 +94,9 @@ namespace fs = boost::filesystem;
using Slic3r::_3DScene;
using Slic3r::Preset;
using Slic3r::PrintHostJob;
+using Slic3r::GUI::format_wxstr;
-#if ENABLE_THUMBNAIL_GENERATOR
static const std::pair<unsigned int, unsigned int> THUMBNAIL_SIZE_3MF = { 256, 256 };
-#endif // ENABLE_THUMBNAIL_GENERATOR
namespace Slic3r {
namespace GUI {
@@ -103,7 +104,8 @@ namespace GUI {
wxDEFINE_EVENT(EVT_SCHEDULE_BACKGROUND_PROCESS, SimpleEvent);
wxDEFINE_EVENT(EVT_SLICING_UPDATE, SlicingStatusEvent);
wxDEFINE_EVENT(EVT_SLICING_COMPLETED, wxCommandEvent);
-wxDEFINE_EVENT(EVT_PROCESS_COMPLETED, wxCommandEvent);
+wxDEFINE_EVENT(EVT_PROCESS_COMPLETED, SlicingProcessCompletedEvent);
+wxDEFINE_EVENT(EVT_EXPORT_BEGAN, wxCommandEvent);
// Sidebar widgets
@@ -138,7 +140,7 @@ public:
};
ObjectInfo::ObjectInfo(wxWindow *parent) :
- wxStaticBoxSizer(new wxStaticBox(parent, wxID_ANY, _(L("Info"))), wxVERTICAL)
+ wxStaticBoxSizer(new wxStaticBox(parent, wxID_ANY, _L("Info")), wxVERTICAL)
{
GetStaticBox()->SetFont(wxGetApp().bold_font());
@@ -157,13 +159,13 @@ ObjectInfo::ObjectInfo(wxWindow *parent) :
return text;
};
- init_info_label(&info_size, _(L("Size")));
- label_volume = init_info_label(&info_volume, _(L("Volume")));
- init_info_label(&info_facets, _(L("Facets")));
- label_materials = init_info_label(&info_materials, _(L("Materials")));
+ init_info_label(&info_size, _L("Size"));
+ label_volume = init_info_label(&info_volume, _L("Volume"));
+ init_info_label(&info_facets, _L("Facets"));
+ label_materials = init_info_label(&info_materials, _L("Materials"));
Add(grid_sizer, 0, wxEXPAND);
- auto *info_manifold_text = new wxStaticText(parent, wxID_ANY, _(L("Manifold")) + ":");
+ auto *info_manifold_text = new wxStaticText(parent, wxID_ANY, _L("Manifold") + ":");
info_manifold_text->SetFont(wxGetApp().small_font());
info_manifold = new wxStaticText(parent, wxID_ANY, "");
info_manifold->SetFont(wxGetApp().small_font());
@@ -213,7 +215,7 @@ private:
};
SlicedInfo::SlicedInfo(wxWindow *parent) :
- wxStaticBoxSizer(new wxStaticBox(parent, wxID_ANY, _(L("Sliced Info"))), wxVERTICAL)
+ wxStaticBoxSizer(new wxStaticBox(parent, wxID_ANY, _L("Sliced Info")), wxVERTICAL)
{
GetStaticBox()->SetFont(wxGetApp().bold_font());
@@ -232,13 +234,13 @@ SlicedInfo::SlicedInfo(wxWindow *parent) :
info_vec.push_back(std::pair<wxStaticText*, wxStaticText*>(text, info_label));
};
- init_info_label(_(L("Used Filament (m)")));
- init_info_label(_(L("Used Filament (mm³)")));
- init_info_label(_(L("Used Filament (g)")));
- init_info_label(_(L("Used Material (unit)")));
- init_info_label(_(L("Cost (money)")));
- init_info_label(_(L("Estimated printing time")));
- init_info_label(_(L("Number of tool changes")));
+ init_info_label(_L("Used Filament (m)"));
+ init_info_label(_L("Used Filament (mm³)"));
+ init_info_label(_L("Used Filament (g)"));
+ init_info_label(_L("Used Material (unit)"));
+ init_info_label(_L("Cost (money)"));
+ init_info_label(_L("Estimated printing time"));
+ init_info_label(_L("Number of tool changes"));
Add(grid_sizer, 0, wxEXPAND);
this->Show(false);
@@ -255,150 +257,6 @@ void SlicedInfo::SetTextAndShow(SlicedInfoIdx idx, const wxString& text, const w
info_vec[idx].second->Show(show);
}
-PresetComboBox::PresetComboBox(wxWindow *parent, Preset::Type preset_type) :
-PresetBitmapComboBox(parent, wxSize(15 * wxGetApp().em_unit(), -1)),
- preset_type(preset_type),
- last_selected(wxNOT_FOUND),
- m_em_unit(wxGetApp().em_unit())
-{
- SetFont(wxGetApp().normal_font());
-#ifdef _WIN32
- // Workaround for ignoring CBN_EDITCHANGE events, which are processed after the content of the combo box changes, so that
- // the index of the item inside CBN_EDITCHANGE may no more be valid.
- EnableTextChangedEvents(false);
-#endif /* _WIN32 */
- Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &evt) {
- auto selected_item = this->GetSelection();
-
- auto marker = reinterpret_cast<Marker>(this->GetClientData(selected_item));
- if (marker >= LABEL_ITEM_MARKER && marker < LABEL_ITEM_MAX) {
- this->SetSelection(this->last_selected);
- evt.StopPropagation();
- if (marker >= LABEL_ITEM_WIZARD_PRINTERS) {
- ConfigWizard::StartPage sp = ConfigWizard::SP_WELCOME;
- switch (marker) {
- case LABEL_ITEM_WIZARD_PRINTERS: sp = ConfigWizard::SP_PRINTERS; break;
- case LABEL_ITEM_WIZARD_FILAMENTS: sp = ConfigWizard::SP_FILAMENTS; break;
- case LABEL_ITEM_WIZARD_MATERIALS: sp = ConfigWizard::SP_MATERIALS; break;
- }
- wxTheApp->CallAfter([sp]() { wxGetApp().run_wizard(ConfigWizard::RR_USER, sp); });
- }
- } else if ( this->last_selected != selected_item ||
- wxGetApp().get_tab(this->preset_type)->get_presets()->current_is_dirty() ) {
- this->last_selected = selected_item;
- evt.SetInt(this->preset_type);
- evt.Skip();
- } else {
- evt.StopPropagation();
- }
- });
-
- if (preset_type == Slic3r::Preset::TYPE_FILAMENT)
- {
- Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent &event) {
- PresetBundle* preset_bundle = wxGetApp().preset_bundle;
- const Preset* selected_preset = preset_bundle->filaments.find_preset(preset_bundle->filament_presets[extruder_idx]);
- // Wide icons are shown if the currently selected preset is not compatible with the current printer,
- // and red flag is drown in front of the selected preset.
- bool wide_icons = selected_preset != nullptr && !selected_preset->is_compatible;
- float scale = m_em_unit*0.1f;
-
- int shifl_Left = wide_icons ? int(scale * 16 + 0.5) : 0;
-#if defined(wxBITMAPCOMBOBOX_OWNERDRAWN_BASED)
- shifl_Left += int(scale * 4 + 0.5f); // IMAGE_SPACING_RIGHT = 4 for wxBitmapComboBox -> Space left of image
-#endif
- int icon_right_pos = shifl_Left + int(scale * (24+4) + 0.5);
- int mouse_pos = event.GetLogicalPosition(wxClientDC(this)).x;
- if (mouse_pos < shifl_Left || mouse_pos > icon_right_pos ) {
- // Let the combo box process the mouse click.
- event.Skip();
- return;
- }
-
- // Swallow the mouse click and open the color picker.
-
- // get current color
- DynamicPrintConfig* cfg = wxGetApp().get_tab(Preset::TYPE_PRINTER)->get_config();
- auto colors = static_cast<ConfigOptionStrings*>(cfg->option("extruder_colour")->clone());
- wxColour clr(colors->values[extruder_idx]);
- if (!clr.IsOk())
- clr = wxColour(0,0,0); // Don't set alfa to transparence
-
- auto data = new wxColourData();
- data->SetChooseFull(1);
- data->SetColour(clr);
-
- wxColourDialog dialog(this, data);
- dialog.CenterOnParent();
- if (dialog.ShowModal() == wxID_OK)
- {
- colors->values[extruder_idx] = dialog.GetColourData().GetColour().GetAsString(wxC2S_HTML_SYNTAX).ToStdString();
-
- DynamicPrintConfig cfg_new = *cfg;
- cfg_new.set_key_value("extruder_colour", colors);
-
- wxGetApp().get_tab(Preset::TYPE_PRINTER)->load_config(cfg_new);
- preset_bundle->update_plater_filament_ui(extruder_idx, this);
- wxGetApp().plater()->on_config_change(cfg_new);
- }
- });
- }
-
- edit_btn = new ScalableButton(parent, wxID_ANY, "cog");
- edit_btn->SetToolTip(_(L("Click to edit preset")));
-
- edit_btn->Bind(wxEVT_BUTTON, ([preset_type, this](wxCommandEvent)
- {
- Tab* tab = wxGetApp().get_tab(preset_type);
- if (!tab)
- return;
-
- int page_id = wxGetApp().tab_panel()->FindPage(tab);
- if (page_id == wxNOT_FOUND)
- return;
-
- wxGetApp().tab_panel()->ChangeSelection(page_id);
-
- /* In a case of a multi-material printing, for editing another Filament Preset
- * it's needed to select this preset for the "Filament settings" Tab
- */
- if (preset_type == Preset::TYPE_FILAMENT && wxGetApp().extruders_edited_cnt() > 1)
- {
- const std::string& selected_preset = GetString(GetSelection()).ToUTF8().data();
-
- // Call select_preset() only if there is new preset and not just modified
- if ( !boost::algorithm::ends_with(selected_preset, Preset::suffix_modified()) )
- {
- const std::string& preset_name = wxGetApp().preset_bundle->filaments.get_preset_name_by_alias(selected_preset);
- tab->select_preset(/*selected_preset*/preset_name);
- }
- }
- }));
-}
-
-PresetComboBox::~PresetComboBox()
-{
- if (edit_btn)
- edit_btn->Destroy();
-}
-
-
-void PresetComboBox::set_label_marker(int item, LabelItemType label_item_type)
-{
- this->SetClientData(item, (void*)label_item_type);
-}
-
-void PresetComboBox::check_selection()
-{
- this->last_selected = GetSelection();
-}
-
-void PresetComboBox::msw_rescale()
-{
- m_em_unit = wxGetApp().em_unit();
- edit_btn->msw_rescale();
-}
-
// Frequently changed parameters
class FreqChangedParams : public OG_Settings
@@ -444,11 +302,12 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent) :
if (!tab_print) return;
if (opt_key == "fill_density") {
- value = m_og->get_config_value(*config, opt_key);
- tab_print->set_value(opt_key, value);
+ tab_print->update_dirty();
+ tab_print->reload_config();
tab_print->update();
}
- else{
+ else
+ {
DynamicPrintConfig new_conf = *config;
if (opt_key == "brim") {
double new_val;
@@ -489,8 +348,6 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent) :
}
tab_print->load_config(new_conf);
}
-
- tab_print->update_dirty();
};
@@ -530,7 +387,7 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent) :
option = m_og->get_option("fill_density");
option.opt.label = L("Infill");
- option.opt.width = 7/*6*/;
+ option.opt.width = 8;
option.opt.sidetext = " ";
line.append_option(option);
@@ -546,7 +403,7 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent) :
line.append_option(option);
auto wiping_dialog_btn = [this](wxWindow* parent) {
- m_wiping_dialog_button = new wxButton(parent, wxID_ANY, _(L("Purging volumes")) + dots, wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT);
+ m_wiping_dialog_button = new wxButton(parent, wxID_ANY, _L("Purging volumes") + dots, wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT);
m_wiping_dialog_button->SetFont(wxGetApp().normal_font());
auto sizer = new wxBoxSizer(wxHORIZONTAL);
sizer->Add(m_wiping_dialog_button, 0, wxALIGN_CENTER_VERTICAL);
@@ -578,9 +435,12 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent) :
return sizer;
};
line.append_widget(wiping_dialog_btn);
-
m_og->append_line(line);
+ m_og->activate();
+
+ Choice* choice = dynamic_cast<Choice*>(m_og->get_field("support"));
+ choice->suppress_scroll();
// Frequently changed parameters for SLA_technology
m_og_sla = std::make_shared<ConfigOptionsGroup>(parent, "");
@@ -588,7 +448,7 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent) :
DynamicPrintConfig* config_sla = &wxGetApp().preset_bundle->sla_prints.get_edited_preset().config;
m_og_sla->set_config(config_sla);
- m_og_sla->m_on_change = [config_sla, this](t_config_option_key opt_key, boost::any value) {
+ m_og_sla->m_on_change = [config_sla](t_config_option_key opt_key, boost::any value) {
Tab* tab = wxGetApp().get_tab(Preset::TYPE_SLA_PRINT);
if (!tab) return;
@@ -652,6 +512,12 @@ FreqChangedParams::FreqChangedParams(wxWindow* parent) :
m_og_sla->append_line(line);
+ m_og_sla->activate();
+ choice = dynamic_cast<Choice*>(m_og_sla->get_field("support"));
+ choice->suppress_scroll();
+ choice = dynamic_cast<Choice*>(m_og_sla->get_field("pad"));
+ choice->suppress_scroll();
+
m_sizer = new wxBoxSizer(wxVERTICAL);
m_sizer->Add(m_og->sizer, 0, wxEXPAND);
m_sizer->Add(m_og_sla->sizer, 0, wxEXPAND);
@@ -696,12 +562,12 @@ struct Sidebar::priv
ModeSizer *mode_sizer;
wxFlexGridSizer *sizer_presets;
- PresetComboBox *combo_print;
- std::vector<PresetComboBox*> combos_filament;
+ PlaterPresetComboBox *combo_print;
+ std::vector<PlaterPresetComboBox*> combos_filament;
wxBoxSizer *sizer_filaments;
- PresetComboBox *combo_sla_print;
- PresetComboBox *combo_sla_material;
- PresetComboBox *combo_printer;
+ PlaterPresetComboBox *combo_sla_print;
+ PlaterPresetComboBox *combo_sla_material;
+ PlaterPresetComboBox *combo_printer;
wxBoxSizer *sizer_params;
FreqChangedParams *frequently_changed_parameters{ nullptr };
@@ -715,9 +581,12 @@ struct Sidebar::priv
wxButton *btn_export_gcode;
wxButton *btn_reslice;
ScalableButton *btn_send_gcode;
- ScalableButton *btn_remove_device;
+ //ScalableButton *btn_eject_device;
ScalableButton* btn_export_gcode_removable; //exports to removable drives (appears only if removable drive is connected)
+ bool is_collapsed {false};
+ Search::OptionsSearcher searcher;
+
priv(Plater *plater) : plater(plater) {}
~priv();
@@ -761,11 +630,15 @@ void Sidebar::priv::show_preset_comboboxes()
// Sidebar / public
Sidebar::Sidebar(Plater *parent)
- : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(40 * wxGetApp().em_unit(), -1)), p(new priv(parent))
+ : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(42 * wxGetApp().em_unit(), -1)), p(new priv(parent))
{
p->scrolled = new wxScrolledWindow(this);
p->scrolled->SetScrollbars(0, 100, 1, 2);
+ SetFont(wxGetApp().normal_font());
+#ifndef __APPLE__
+ SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
+#endif
// Sizer in the scrolled area
auto *scrolled_sizer = new wxBoxSizer(wxVERTICAL);
@@ -793,10 +666,10 @@ Sidebar::Sidebar(Plater *parent)
p->sizer_filaments = new wxBoxSizer(wxVERTICAL);
- auto init_combo = [this](PresetComboBox **combo, wxString label, Preset::Type preset_type, bool filament) {
+ auto init_combo = [this](PlaterPresetComboBox **combo, wxString label, Preset::Type preset_type, bool filament) {
auto *text = new wxStaticText(p->presets_panel, wxID_ANY, label + " :");
text->SetFont(wxGetApp().small_font());
- *combo = new PresetComboBox(p->presets_panel, preset_type);
+ *combo = new PlaterPresetComboBox(p->presets_panel, preset_type);
auto combo_and_btn_sizer = new wxBoxSizer(wxHORIZONTAL);
combo_and_btn_sizer->Add(*combo, 1, wxEXPAND);
@@ -817,11 +690,11 @@ Sidebar::Sidebar(Plater *parent)
};
p->combos_filament.push_back(nullptr);
- init_combo(&p->combo_print, _(L("Print settings")), Preset::TYPE_PRINT, false);
- init_combo(&p->combos_filament[0], _(L("Filament")), Preset::TYPE_FILAMENT, true);
- init_combo(&p->combo_sla_print, _(L("SLA print settings")), Preset::TYPE_SLA_PRINT, false);
- init_combo(&p->combo_sla_material, _(L("SLA material")), Preset::TYPE_SLA_MATERIAL, false);
- init_combo(&p->combo_printer, _(L("Printer")), Preset::TYPE_PRINTER, false);
+ init_combo(&p->combo_print, _L("Print settings"), Preset::TYPE_PRINT, false);
+ init_combo(&p->combos_filament[0], _L("Filament"), Preset::TYPE_FILAMENT, true);
+ init_combo(&p->combo_sla_print, _L("SLA print settings"), Preset::TYPE_SLA_PRINT, false);
+ init_combo(&p->combo_sla_material, _L("SLA material"), Preset::TYPE_SLA_MATERIAL, false);
+ init_combo(&p->combo_printer, _L("Printer"), Preset::TYPE_PRINTER, false);
const int margin_5 = int(0.5*wxGetApp().em_unit());// 5;
@@ -880,21 +753,22 @@ Sidebar::Sidebar(Plater *parent)
(*btn)->Hide();
};
- init_scalable_btn(&p->btn_send_gcode , "export_gcode", _(L("Send to printer")) + "\tCtrl+Shift+G");
- init_scalable_btn(&p->btn_remove_device, "eject_sd" , _(L("Remove device")) + "\tCtrl+T");
- init_scalable_btn(&p->btn_export_gcode_removable, "export_to_sd", _(L("Export to SD card / Flash drive")) + "\tCtrl+U");
+ init_scalable_btn(&p->btn_send_gcode , "export_gcode", _L("Send to printer") + " " +GUI::shortkey_ctrl_prefix() + "Shift+G");
+// init_scalable_btn(&p->btn_eject_device, "eject_sd" , _L("Remove device ") + GUI::shortkey_ctrl_prefix() + "T");
+ init_scalable_btn(&p->btn_export_gcode_removable, "export_to_sd", _L("Export to SD card / Flash drive") + " " + GUI::shortkey_ctrl_prefix() + "U");
// regular buttons "Slice now" and "Export G-code"
- const int scaled_height = p->btn_remove_device->GetBitmapHeight() + 4;
+// const int scaled_height = p->btn_eject_device->GetBitmapHeight() + 4;
+ const int scaled_height = p->btn_export_gcode_removable->GetBitmapHeight() + 4;
auto init_btn = [this](wxButton **btn, wxString label, const int button_height) {
*btn = new wxButton(this, wxID_ANY, label, wxDefaultPosition,
wxSize(-1, button_height), wxBU_EXACTFIT);
(*btn)->SetFont(wxGetApp().bold_font());
};
- init_btn(&p->btn_export_gcode, _(L("Export G-code")) + dots , scaled_height);
- init_btn(&p->btn_reslice , _(L("Slice now")) , scaled_height);
+ init_btn(&p->btn_export_gcode, _L("Export G-code") + dots , scaled_height);
+ init_btn(&p->btn_reslice , _L("Slice now") , scaled_height);
enable_buttons(false);
@@ -904,7 +778,7 @@ Sidebar::Sidebar(Plater *parent)
complect_btns_sizer->Add(p->btn_export_gcode, 1, wxEXPAND);
complect_btns_sizer->Add(p->btn_send_gcode);
complect_btns_sizer->Add(p->btn_export_gcode_removable);
- complect_btns_sizer->Add(p->btn_remove_device);
+// complect_btns_sizer->Add(p->btn_eject_device);
btns_sizer->Add(p->btn_reslice, 0, wxEXPAND | wxTOP, margin_5);
@@ -921,20 +795,20 @@ Sidebar::Sidebar(Plater *parent)
{
const bool export_gcode_after_slicing = wxGetKeyState(WXK_SHIFT);
if (export_gcode_after_slicing)
- p->plater->export_gcode();
+ p->plater->export_gcode(true);
else
p->plater->reslice();
p->plater->select_view_3D("Preview");
});
p->btn_send_gcode->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { p->plater->send_gcode(); });
- p->btn_remove_device->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { p->plater->eject_drive(); });
+// p->btn_eject_device->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { p->plater->eject_drive(); });
p->btn_export_gcode_removable->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { p->plater->export_gcode(true); });
}
Sidebar::~Sidebar() {}
-void Sidebar::init_filament_combo(PresetComboBox **combo, const int extr_idx) {
- *combo = new PresetComboBox(p->presets_panel, Slic3r::Preset::TYPE_FILAMENT);
+void Sidebar::init_filament_combo(PlaterPresetComboBox **combo, const int extr_idx) {
+ *combo = new PlaterPresetComboBox(p->presets_panel, Slic3r::Preset::TYPE_FILAMENT);
// # copy icons from first choice
// $choice->SetItemBitmap($_, $choices->[0]->GetItemBitmap($_)) for 0..$#presets;
@@ -969,18 +843,18 @@ void Sidebar::update_all_preset_comboboxes()
// Update the print choosers to only contain the compatible presets, update the dirty flags.
if (print_tech == ptFFF)
- preset_bundle.prints.update_plater_ui(p->combo_print);
+ p->combo_print->update();
else {
- preset_bundle.sla_prints.update_plater_ui(p->combo_sla_print);
- preset_bundle.sla_materials.update_plater_ui(p->combo_sla_material);
+ p->combo_sla_print->update();
+ p->combo_sla_material->update();
}
// Update the printer choosers, update the dirty flags.
- preset_bundle.printers.update_plater_ui(p->combo_printer);
+ p->combo_printer->update();
// Update the filament choosers to only contain the compatible presets, update the color preview,
// update the dirty flags.
if (print_tech == ptFFF) {
- for (size_t i = 0; i < p->combos_filament.size(); ++i)
- preset_bundle.update_plater_filament_ui(i, p->combos_filament[i]);
+ for (PlaterPresetComboBox* cb : p->combos_filament)
+ cb->update();
}
}
@@ -1002,23 +876,22 @@ void Sidebar::update_presets(Preset::Type preset_type)
preset_bundle.set_filament_preset(0, name);
}
- for (size_t i = 0; i < filament_cnt; i++) {
- preset_bundle.update_plater_filament_ui(i, p->combos_filament[i]);
- }
+ for (size_t i = 0; i < filament_cnt; i++)
+ p->combos_filament[i]->update();
break;
}
case Preset::TYPE_PRINT:
- preset_bundle.prints.update_plater_ui(p->combo_print);
+ p->combo_print->update();
break;
case Preset::TYPE_SLA_PRINT:
- preset_bundle.sla_prints.update_plater_ui(p->combo_sla_print);
+ p->combo_sla_print->update();
break;
case Preset::TYPE_SLA_MATERIAL:
- preset_bundle.sla_materials.update_plater_ui(p->combo_sla_material);
+ p->combo_sla_material->update();
break;
case Preset::TYPE_PRINTER:
@@ -1040,11 +913,17 @@ void Sidebar::update_mode_sizer() const
p->mode_sizer->SetMode(m_mode);
}
+void Sidebar::change_top_border_for_mode_sizer(bool increase_border)
+{
+ p->mode_sizer->set_items_flag(increase_border ? wxTOP : 0);
+ p->mode_sizer->set_items_border(increase_border ? int(0.5 * wxGetApp().em_unit()) : 0);
+}
+
void Sidebar::update_reslice_btn_tooltip() const
{
wxString tooltip = wxString("Slice") + " [" + GUI::shortkey_ctrl_prefix() + "R]";
if (m_mode != comSimple)
- tooltip += wxString("\n") + _(L("Hold Shift to Slice & Export G-code"));
+ tooltip += wxString("\n") + _L("Hold Shift to Slice & Export G-code");
p->btn_reslice->SetToolTip(tooltip);
}
@@ -1054,18 +933,14 @@ void Sidebar::msw_rescale()
p->mode_sizer->msw_rescale();
- // Rescale preset comboboxes in respect to the current em_unit ...
- for (PresetComboBox* combo : std::vector<PresetComboBox*> { p->combo_print,
+ for (PlaterPresetComboBox* combo : std::vector<PlaterPresetComboBox*> { p->combo_print,
p->combo_sla_print,
p->combo_sla_material,
p->combo_printer } )
combo->msw_rescale();
- for (PresetComboBox* combo : p->combos_filament)
+ for (PlaterPresetComboBox* combo : p->combos_filament)
combo->msw_rescale();
- // ... then refill them and set min size to correct layout of the sidebar
- update_all_preset_comboboxes();
-
p->frequently_changed_parameters->msw_rescale();
p->object_list->msw_rescale();
p->object_manipulation->msw_rescale();
@@ -1075,15 +950,51 @@ void Sidebar::msw_rescale()
p->object_info->msw_rescale();
p->btn_send_gcode->msw_rescale();
- p->btn_remove_device->msw_rescale();
+// p->btn_eject_device->msw_rescale();
p->btn_export_gcode_removable->msw_rescale();
- const int scaled_height = p->btn_remove_device->GetBitmap().GetHeight() + 4;
+ const int scaled_height = p->btn_export_gcode_removable->GetBitmap().GetHeight() + 4;
p->btn_export_gcode->SetMinSize(wxSize(-1, scaled_height));
p->btn_reslice ->SetMinSize(wxSize(-1, scaled_height));
p->scrolled->Layout();
}
+void Sidebar::sys_color_changed()
+{
+ for (PlaterPresetComboBox* combo : std::vector<PlaterPresetComboBox*>{ p->combo_print,
+ p->combo_sla_print,
+ p->combo_sla_material,
+ p->combo_printer })
+ combo->msw_rescale();
+ for (PlaterPresetComboBox* combo : p->combos_filament)
+ combo->msw_rescale();
+
+ p->object_list->sys_color_changed();
+ p->object_manipulation->sys_color_changed();
+ p->object_layers->sys_color_changed();
+
+ // btn...->msw_rescale() updates icon on button, so use it
+ p->btn_send_gcode->msw_rescale();
+// p->btn_eject_device->msw_rescale();
+ p->btn_export_gcode_removable->msw_rescale();
+
+ p->scrolled->Layout();
+}
+
+void Sidebar::search()
+{
+ p->searcher.search();
+}
+
+void Sidebar::jump_to_option(size_t selected)
+{
+ const Search::Option& opt = p->searcher.get_option(selected);
+ wxGetApp().get_tab(opt.type)->activate_option(boost::nowide::narrow(opt.opt_key), boost::nowide::narrow(opt.category));
+
+ // Switch to the Settings NotePad
+// wxGetApp().mainframe->select_tab();
+}
+
ObjectManipulation* Sidebar::obj_manipul()
{
return p->object_manipulation;
@@ -1148,22 +1059,25 @@ void Sidebar::show_info_sizer()
return;
}
+ bool imperial_units = wxGetApp().app_config->get("use_inches") == "1";
+ double koef = imperial_units ? ObjectManipulation::mm_to_in : 1.0f;
+
auto size = model_object->bounding_box().size();
- p->object_info->info_size->SetLabel(wxString::Format("%.2f x %.2f x %.2f",size(0), size(1), size(2)));
+ p->object_info->info_size->SetLabel(wxString::Format("%.2f x %.2f x %.2f",size(0)*koef, size(1)*koef, size(2)*koef));
p->object_info->info_materials->SetLabel(wxString::Format("%d", static_cast<int>(model_object->materials_count())));
const auto& stats = model_object->get_object_stl_stats();//model_object->volumes.front()->mesh.stl.stats;
- p->object_info->info_volume->SetLabel(wxString::Format("%.2f", stats.volume));
- p->object_info->info_facets->SetLabel(wxString::Format(_(L("%d (%d shells)")), static_cast<int>(model_object->facets_count()), stats.number_of_parts));
+ p->object_info->info_volume->SetLabel(wxString::Format("%.2f", stats.volume*pow(koef,3)));
+ p->object_info->info_facets->SetLabel(wxString::Format(_L("%d (%d shells)"), static_cast<int>(model_object->facets_count()), stats.number_of_parts));
int errors = stats.degenerate_facets + stats.edges_fixed + stats.facets_removed +
stats.facets_added + stats.facets_reversed + stats.backwards_edges;
if (errors > 0) {
- wxString tooltip = wxString::Format(_(L("Auto-repaired (%d errors)")), errors);
+ wxString tooltip = wxString::Format(_L("Auto-repaired (%d errors)"), errors);
p->object_info->info_manifold->SetLabel(tooltip);
- tooltip += ":\n" + wxString::Format(_(L("%d degenerate facets, %d edges fixed, %d facets removed, "
- "%d facets added, %d facets reversed, %d backwards edges")),
+ tooltip += ":\n" + wxString::Format(_L("%d degenerate facets, %d edges fixed, %d facets removed, "
+ "%d facets added, %d facets reversed, %d backwards edges"),
stats.degenerate_facets, stats.edges_fixed, stats.facets_removed,
stats.facets_added, stats.facets_reversed, stats.backwards_edges);
@@ -1172,7 +1086,7 @@ void Sidebar::show_info_sizer()
p->object_info->manifold_warning_icon->SetToolTip(tooltip);
}
else {
- p->object_info->info_manifold->SetLabel(_(L("Yes")));
+ p->object_info->info_manifold->SetLabel(_L("Yes"));
p->object_info->showing_manifold_warning_icon = false;
p->object_info->info_manifold->SetToolTip("");
p->object_info->manifold_warning_icon->SetToolTip("");
@@ -1193,10 +1107,10 @@ void Sidebar::update_sliced_info_sizer()
if (p->plater->printer_technology() == ptSLA)
{
const SLAPrintStatistics& ps = p->plater->sla_print().print_statistics();
- wxString new_label = _(L("Used Material (ml)")) + ":";
+ wxString new_label = _L("Used Material (ml)") + ":";
const bool is_supports = ps.support_used_material > 0.0;
if (is_supports)
- new_label += from_u8((boost::format("\n - %s\n - %s") % _utf8(L("object(s)")) % _utf8(L("supports and pad"))).str());
+ new_label += format_wxstr("\n - %s\n - %s", _L("object(s)"), _L("supports and pad"));
wxString info_text = is_supports ?
wxString::Format("%.2f \n%.2f \n%.2f", (ps.objects_used_material + ps.support_used_material) / 1000,
@@ -1218,7 +1132,7 @@ void Sidebar::update_sliced_info_sizer()
p->sliced_info->SetTextAndShow(siCost, str_total_cost, "Cost");
wxString t_est = std::isnan(ps.estimated_print_time) ? "N/A" : get_time_dhms(float(ps.estimated_print_time));
- p->sliced_info->SetTextAndShow(siEstimatedTime, t_est, _(L("Estimated printing time")) + ":");
+ p->sliced_info->SetTextAndShow(siEstimatedTime, t_est, _L("Estimated printing time") + ":");
// Hide non-SLA sliced info parameters
p->sliced_info->SetTextAndShow(siFilament_m, "N/A");
@@ -1231,23 +1145,65 @@ void Sidebar::update_sliced_info_sizer()
const PrintStatistics& ps = p->plater->fff_print().print_statistics();
const bool is_wipe_tower = ps.total_wipe_tower_filament > 0;
- wxString new_label = _(L("Used Filament (m)"));
+ bool imperial_units = wxGetApp().app_config->get("use_inches") == "1";
+ double koef = imperial_units ? ObjectManipulation::in_to_mm : 1000.0;
+
+ wxString new_label = imperial_units ? _L("Used Filament (in)") : _L("Used Filament (m)");
if (is_wipe_tower)
- new_label += from_u8((boost::format(":\n - %1%\n - %2%") % _utf8(L("objects")) % _utf8(L("wipe tower"))).str());
+ new_label += format_wxstr(":\n - %1%\n - %2%", _L("objects"), _L("wipe tower"));
wxString info_text = is_wipe_tower ?
- wxString::Format("%.2f \n%.2f \n%.2f", ps.total_used_filament / 1000,
- (ps.total_used_filament - ps.total_wipe_tower_filament) / 1000,
- ps.total_wipe_tower_filament / 1000) :
- wxString::Format("%.2f", ps.total_used_filament / 1000);
+ wxString::Format("%.2f \n%.2f \n%.2f", ps.total_used_filament / /*1000*/koef,
+ (ps.total_used_filament - ps.total_wipe_tower_filament) / /*1000*/koef,
+ ps.total_wipe_tower_filament / /*1000*/koef) :
+ wxString::Format("%.2f", ps.total_used_filament / /*1000*/koef);
p->sliced_info->SetTextAndShow(siFilament_m, info_text, new_label);
- p->sliced_info->SetTextAndShow(siFilament_mm3, wxString::Format("%.2f", ps.total_extruded_volume));
- p->sliced_info->SetTextAndShow(siFilament_g, ps.total_weight == 0.0 ? "N/A" : wxString::Format("%.2f", ps.total_weight));
+ koef = imperial_units ? pow(ObjectManipulation::mm_to_in, 3) : 1.0f;
+ new_label = imperial_units ? _L("Used Filament (in³)") : _L("Used Filament (mm³)");
+ info_text = wxString::Format("%.2f", imperial_units ? ps.total_extruded_volume * koef : ps.total_extruded_volume);
+ p->sliced_info->SetTextAndShow(siFilament_mm3, info_text, new_label);
+
+ if (ps.total_weight == 0.0)
+ p->sliced_info->SetTextAndShow(siFilament_g, "N/A");
+ else {
+ new_label = _L("Used Filament (g)");
+ info_text = wxString::Format("%.2f", ps.total_weight);
+
+ const std::vector<std::string>& filament_presets = wxGetApp().preset_bundle->filament_presets;
+ const PresetCollection& filaments = wxGetApp().preset_bundle->filaments;
+
+ if (ps.filament_stats.size() > 1)
+ new_label += ":";
+
+ for (auto filament : ps.filament_stats) {
+ const Preset* filament_preset = filaments.find_preset(filament_presets[filament.first], false);
+ if (filament_preset) {
+ double filament_weight;
+ if (ps.filament_stats.size() == 1)
+ filament_weight = ps.total_weight;
+ else {
+ double filament_density = filament_preset->config.opt_float("filament_density", 0);
+ filament_weight = filament.second * filament_density * 2.4052f * 0.001; // assumes 1.75mm filament diameter;
+
+ new_label += "\n - " + format_wxstr(_L("Filament at extruder %1%"), filament.first + 1);
+ info_text += wxString::Format("\n%.2f", filament_weight);
+ }
+
+ double spool_weight = filament_preset->config.opt_float("filament_spool_weight", 0);
+ if (spool_weight != 0.0) {
+ new_label += "\n " + _L("(including spool)");
+ info_text += wxString::Format(" (%.2f)\n", filament_weight + spool_weight);
+ }
+ }
+ }
+
+ p->sliced_info->SetTextAndShow(siFilament_g, info_text, new_label);
+ }
- new_label = _(L("Cost"));
+ new_label = _L("Cost");
if (is_wipe_tower)
- new_label += from_u8((boost::format(":\n - %1%\n - %2%") % _utf8(L("objects")) % _utf8(L("wipe tower"))).str());
+ new_label += format_wxstr(":\n - %1%\n - %2%", _L("objects"), _L("wipe tower"));
info_text = ps.total_cost == 0.0 ? "N/A" :
is_wipe_tower ?
@@ -1260,44 +1216,23 @@ void Sidebar::update_sliced_info_sizer()
if (ps.estimated_normal_print_time == "N/A" && ps.estimated_silent_print_time == "N/A")
p->sliced_info->SetTextAndShow(siEstimatedTime, "N/A");
else {
- new_label = _(L("Estimated printing time")) +":";
info_text = "";
- wxString str_color = _(L("Color"));
- wxString str_pause = _(L("Pause"));
-
- auto fill_labels = [str_color, str_pause](const std::vector<std::pair<CustomGcodeType, std::string>>& times,
- wxString& new_label, wxString& info_text)
- {
- int color_change_count = 0;
- for (auto time : times)
- if (time.first == cgtColorChange)
- color_change_count++;
-
- for (int i = (int)times.size() - 1; i >= 0; --i)
- {
- if (i == 0 || times[i - 1].first == cgtPausePrint)
- new_label += from_u8((boost::format("\n - %1%%2%") % (std::string(str_color.ToUTF8()) + " ") % color_change_count).str());
- else if (times[i - 1].first == cgtColorChange)
- new_label += from_u8((boost::format("\n - %1%%2%") % (std::string(str_color.ToUTF8()) + " ") % color_change_count--).str());
-
- if (i != (int)times.size() - 1 && times[i].first == cgtPausePrint)
- new_label += from_u8((boost::format(" -> %1%") % std::string(str_pause.ToUTF8())).str());
+ new_label = _L("Estimated printing time") + ":";
+ if (ps.estimated_normal_print_time != "N/A") {
+ new_label += format_wxstr("\n - %1%", _L("normal mode"));
+ info_text += format_wxstr("\n%1%", short_time(ps.estimated_normal_print_time));
- info_text += from_u8((boost::format("\n%1%") % times[i].second).str());
- }
- };
+ // uncomment next line to not disappear slicing finished notif when colapsing sidebar before time estimate
+ //if (p->plater->is_sidebar_collapsed())
+ p->plater->get_notification_manager()->set_slicing_complete_large(p->plater->is_sidebar_collapsed());
+ p->plater->get_notification_manager()->set_slicing_complete_print_time("Estimated printing time: " + ps.estimated_normal_print_time);
- if (ps.estimated_normal_print_time != "N/A") {
- new_label += from_u8((boost::format("\n - %1%") % _utf8(L("normal mode"))).str());
- info_text += from_u8((boost::format("\n%1%") % ps.estimated_normal_print_time).str());
- fill_labels(ps.estimated_normal_custom_gcode_print_times, new_label, info_text);
}
if (ps.estimated_silent_print_time != "N/A") {
- new_label += from_u8((boost::format("\n - %1%") % _utf8(L("stealth mode"))).str());
- info_text += from_u8((boost::format("\n%1%") % ps.estimated_silent_print_time).str());
- fill_labels(ps.estimated_silent_custom_gcode_print_times, new_label, info_text);
+ new_label += format_wxstr("\n - %1%", _L("stealth mode"));
+ info_text += format_wxstr("\n%1%", short_time(ps.estimated_silent_print_time));
}
- p->sliced_info->SetTextAndShow(siEstimatedTime, info_text, new_label);
+ p->sliced_info->SetTextAndShow(siEstimatedTime, info_text, new_label);
}
// if there is a wipe tower, insert number of toolchanges info into the array:
@@ -1307,6 +1242,8 @@ void Sidebar::update_sliced_info_sizer()
p->sliced_info->SetTextAndShow(siMateril_unit, "N/A");
}
}
+
+ Layout();
}
void Sidebar::show_sliced_info_sizer(const bool show)
@@ -1326,21 +1263,39 @@ void Sidebar::enable_buttons(bool enable)
p->btn_reslice->Enable(enable);
p->btn_export_gcode->Enable(enable);
p->btn_send_gcode->Enable(enable);
- p->btn_remove_device->Enable(enable);
+// p->btn_eject_device->Enable(enable);
p->btn_export_gcode_removable->Enable(enable);
}
-bool Sidebar::show_reslice(bool show) const { return p->btn_reslice->Show(show); }
-bool Sidebar::show_export(bool show) const { return p->btn_export_gcode->Show(show); }
-bool Sidebar::show_send(bool show) const { return p->btn_send_gcode->Show(show); }
-bool Sidebar::show_disconnect(bool show) const { return p->btn_remove_device->Show(show); }
-bool Sidebar::show_export_removable(bool show)const { return p->btn_export_gcode_removable->Show(show); }
+bool Sidebar::show_reslice(bool show) const { return p->btn_reslice->Show(show); }
+bool Sidebar::show_export(bool show) const { return p->btn_export_gcode->Show(show); }
+bool Sidebar::show_send(bool show) const { return p->btn_send_gcode->Show(show); }
+bool Sidebar::show_export_removable(bool show) const { return p->btn_export_gcode_removable->Show(show); }
+//bool Sidebar::show_eject(bool show) const { return p->btn_eject_device->Show(show); }
+//bool Sidebar::get_eject_shown() const { return p->btn_eject_device->IsShown(); }
bool Sidebar::is_multifilament()
{
return p->combos_filament.size() > 1;
}
+static std::vector<Search::InputInfo> get_search_inputs(ConfigOptionMode mode)
+{
+ std::vector<Search::InputInfo> ret {};
+
+ auto& tabs_list = wxGetApp().tabs_list;
+ auto print_tech = wxGetApp().preset_bundle->printers.get_selected_preset().printer_technology();
+ for (auto tab : tabs_list)
+ if (tab->supports_printer_technology(print_tech))
+ ret.emplace_back(Search::InputInfo {tab->get_config(), tab->type(), mode});
+
+ return ret;
+}
+
+void Sidebar::update_searcher()
+{
+ p->searcher.init(get_search_inputs(m_mode));
+}
void Sidebar::update_mode()
{
@@ -1348,6 +1303,7 @@ void Sidebar::update_mode()
update_reslice_btn_tooltip();
update_mode_sizer();
+ update_searcher();
wxWindowUpdateLocker noUpdates(this);
@@ -1360,81 +1316,260 @@ void Sidebar::update_mode()
Layout();
}
-std::vector<PresetComboBox*>& Sidebar::combos_filament()
+bool Sidebar::is_collapsed() { return p->is_collapsed; }
+
+void Sidebar::collapse(bool collapse)
+{
+ p->is_collapsed = collapse;
+
+ this->Show(!collapse);
+ p->plater->Layout();
+
+ // save collapsing state to the AppConfig
+ if (wxGetApp().is_editor())
+ wxGetApp().app_config->set("collapsed_sidebar", collapse ? "1" : "0");
+}
+
+
+void Sidebar::update_ui_from_settings()
+{
+ p->object_manipulation->update_ui_from_settings();
+ show_info_sizer();
+ update_sliced_info_sizer();
+ // update Cut gizmo, if it's open
+ p->plater->canvas3D()->update_gizmos_on_off_state();
+ p->plater->canvas3D()->request_extra_frame();
+}
+
+std::vector<PlaterPresetComboBox*>& Sidebar::combos_filament()
{
return p->combos_filament;
}
+Search::OptionsSearcher& Sidebar::get_searcher()
+{
+ return p->searcher;
+}
+
+std::string& Sidebar::get_search_line()
+{
+ return p->searcher.search_string();
+}
+
// Plater::DropTarget
class PlaterDropTarget : public wxFileDropTarget
{
public:
- PlaterDropTarget(Plater *plater) : plater(plater) { this->SetDefaultAction(wxDragCopy); }
+ PlaterDropTarget(Plater* plater) : m_plater(plater) { this->SetDefaultAction(wxDragCopy); }
virtual bool OnDropFiles(wxCoord x, wxCoord y, const wxArrayString &filenames);
private:
- Plater *plater;
+ Plater* m_plater;
+#if !ENABLE_DRAG_AND_DROP_FIX
static const std::regex pattern_drop;
+ static const std::regex pattern_gcode_drop;
+#endif // !ENABLE_DRAG_AND_DROP_FIX
};
+#if !ENABLE_DRAG_AND_DROP_FIX
const std::regex PlaterDropTarget::pattern_drop(".*[.](stl|obj|amf|3mf|prusa)", std::regex::icase);
+const std::regex PlaterDropTarget::pattern_gcode_drop(".*[.](gcode|g)", std::regex::icase);
+
+enum class LoadType : unsigned char
+{
+ Unknown,
+ OpenProject,
+ LoadGeometry,
+ LoadConfig
+};
+
+class ProjectDropDialog : public DPIDialog
+{
+ wxRadioBox* m_action{ nullptr };
+public:
+ ProjectDropDialog(const std::string& filename);
+
+ int get_action() const { return m_action->GetSelection() + 1; }
+
+protected:
+ void on_dpi_changed(const wxRect& suggested_rect) override;
+};
+
+ProjectDropDialog::ProjectDropDialog(const std::string& filename)
+ : DPIDialog(static_cast<wxWindow*>(wxGetApp().mainframe), wxID_ANY,
+ from_u8((boost::format(_utf8(L("%s - Drop project file"))) % SLIC3R_APP_NAME).str()), wxDefaultPosition,
+ wxDefaultSize, wxDEFAULT_DIALOG_STYLE)
+{
+ SetFont(wxGetApp().normal_font());
+
+ wxBoxSizer* main_sizer = new wxBoxSizer(wxVERTICAL);
+
+ const wxString choices[] = { _L("Open as project"),
+ _L("Import geometry only"),
+ _L("Import config only") };
+
+ main_sizer->Add(new wxStaticText(this, wxID_ANY,
+ _L("Select an action to apply to the file") + ": " + from_u8(filename)), 0, wxEXPAND | wxALL, 10);
+ m_action = new wxRadioBox(this, wxID_ANY, _L("Action"), wxDefaultPosition, wxDefaultSize,
+ WXSIZEOF(choices), choices, 0, wxRA_SPECIFY_ROWS);
+ int action = std::clamp(std::stoi(wxGetApp().app_config->get("drop_project_action")),
+ static_cast<int>(LoadType::OpenProject), static_cast<int>(LoadType::LoadConfig)) - 1;
+ m_action->SetSelection(action);
+ main_sizer->Add(m_action, 1, wxEXPAND | wxRIGHT | wxLEFT, 10);
+
+ wxBoxSizer* bottom_sizer = new wxBoxSizer(wxHORIZONTAL);
+ wxCheckBox* check = new wxCheckBox(this, wxID_ANY, _L("Don't show again"));
+ check->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent& evt) {
+ wxGetApp().app_config->set("show_drop_project_dialog", evt.IsChecked() ? "0" : "1");
+ });
+
+ bottom_sizer->Add(check, 0, wxEXPAND | wxRIGHT, 5);
+ bottom_sizer->Add(CreateStdDialogButtonSizer(wxOK | wxCANCEL), 0, wxEXPAND | wxLEFT, 5);
+ main_sizer->Add(bottom_sizer, 0, wxEXPAND | wxALL, 10);
+
+ SetSizer(main_sizer);
+ main_sizer->SetSizeHints(this);
+}
+
+void ProjectDropDialog::on_dpi_changed(const wxRect& suggested_rect)
+{
+ const int em = em_unit();
+ SetMinSize(wxSize(65 * em, 30 * em));
+ Fit();
+ Refresh();
+}
+#endif // !ENABLE_DRAG_AND_DROP_FIX
bool PlaterDropTarget::OnDropFiles(wxCoord x, wxCoord y, const wxArrayString &filenames)
{
+#if !ENABLE_DRAG_AND_DROP_FIX
std::vector<fs::path> paths;
+#endif // !ENABLE_DRAG_AND_DROP_FIX
+
+#ifdef WIN32
+ // hides the system icon
+ this->MSWUpdateDragImageOnLeave();
+#endif // WIN32
+
+#if ENABLE_DRAG_AND_DROP_FIX
+ return (m_plater != nullptr) ? m_plater->load_files(filenames) : false;
+#else
+ // gcode viewer section
+ if (wxGetApp().is_gcode_viewer()) {
+ for (const auto& filename : filenames) {
+ fs::path path(into_path(filename));
+ if (std::regex_match(path.string(), pattern_gcode_drop))
+ paths.push_back(std::move(path));
+ }
+
+ if (paths.size() > 1) {
+ wxMessageDialog(static_cast<wxWindow*>(m_plater), _L("You can open only one .gcode file at a time."),
+ wxString(SLIC3R_APP_NAME) + " - " + _L("Drag and drop G-code file"), wxCLOSE | wxICON_WARNING | wxCENTRE).ShowModal();
+ return false;
+ }
+ else if (paths.size() == 1) {
+ m_plater->load_gcode(from_path(paths.front()));
+ return true;
+ }
+ return false;
+ }
+
+ // editor section
for (const auto &filename : filenames) {
fs::path path(into_path(filename));
- if (std::regex_match(path.string(), pattern_drop)) {
+ if (std::regex_match(path.string(), pattern_drop))
paths.push_back(std::move(path));
- } else {
+ else if (std::regex_match(path.string(), pattern_gcode_drop))
+ start_new_gcodeviewer(&filename);
+ else
return false;
+ }
+ if (paths.empty())
+ // Likely all paths processed were gcodes, for which a G-code viewer instance has hopefully been started.
+ return false;
+
+ // searches for project files
+ for (std::vector<fs::path>::const_reverse_iterator it = paths.rbegin(); it != paths.rend(); ++it) {
+ std::string filename = (*it).filename().string();
+ if (boost::algorithm::iends_with(filename, ".3mf") || boost::algorithm::iends_with(filename, ".amf")) {
+ LoadType load_type = LoadType::Unknown;
+ if (!m_plater->model().objects.empty()) {
+ if (wxGetApp().app_config->get("show_drop_project_dialog") == "1") {
+ ProjectDropDialog dlg(filename);
+ if (dlg.ShowModal() == wxID_OK) {
+ int choice = dlg.get_action();
+ load_type = static_cast<LoadType>(choice);
+ wxGetApp().app_config->set("drop_project_action", std::to_string(choice));
+ }
+ }
+ else
+ load_type = static_cast<LoadType>(std::clamp(std::stoi(wxGetApp().app_config->get("drop_project_action")),
+ static_cast<int>(LoadType::OpenProject), static_cast<int>(LoadType::LoadConfig)));
+ }
+ else
+ load_type = LoadType::OpenProject;
+
+ if (load_type == LoadType::Unknown)
+ return false;
+
+ switch (load_type) {
+ case LoadType::OpenProject: {
+ m_plater->load_project(from_path(*it));
+ break;
+ }
+ case LoadType::LoadGeometry: {
+ Plater::TakeSnapshot snapshot(m_plater, _L("Import Object"));
+ std::vector<fs::path> in_paths;
+ in_paths.emplace_back(*it);
+ m_plater->load_files(in_paths, true, false);
+ break;
+ }
+ case LoadType::LoadConfig: {
+ std::vector<fs::path> in_paths;
+ in_paths.emplace_back(*it);
+ m_plater->load_files(in_paths, false, true);
+ break;
+ }
+ }
+
+ return true;
}
}
+ // other files
wxString snapshot_label;
- assert(! paths.empty());
+ assert(!paths.empty());
if (paths.size() == 1) {
- snapshot_label = _(L("Load File"));
+ snapshot_label = _L("Load File");
snapshot_label += ": ";
snapshot_label += wxString::FromUTF8(paths.front().filename().string().c_str());
- } else {
- snapshot_label = _(L("Load Files"));
+ }
+ else {
+ snapshot_label = _L("Load Files");
snapshot_label += ": ";
snapshot_label += wxString::FromUTF8(paths.front().filename().string().c_str());
- for (size_t i = 1; i < paths.size(); ++ i) {
+ for (size_t i = 1; i < paths.size(); ++i) {
snapshot_label += ", ";
snapshot_label += wxString::FromUTF8(paths[i].filename().string().c_str());
}
}
- Plater::TakeSnapshot snapshot(plater, snapshot_label);
-
- // FIXME: when drag and drop is done on a .3mf or a .amf file we should clear the plater for consistence with the open project command
- // (the following call to plater->load_files() will load the config data, if present)
-
- std::vector<size_t> res = plater->load_files(paths);
-
- // because right now the plater is not cleared, we set the project file (from the latest imported .3mf or .amf file)
- // only if not set yet
- // if res is empty no data has been loaded
- if (!res.empty() && plater->get_project_filename().empty())
- {
- for (std::vector<fs::path>::const_reverse_iterator it = paths.rbegin(); it != paths.rend(); ++it)
- {
- std::string filename = (*it).filename().string();
- if (boost::algorithm::iends_with(filename, ".3mf") || boost::algorithm::iends_with(filename, ".amf"))
- {
- plater->set_project_filename(from_path(*it));
- break;
- }
- }
- }
+ Plater::TakeSnapshot snapshot(m_plater, snapshot_label);
+ m_plater->load_files(paths);
return true;
+#endif // ENABLE_DRAG_AND_DROP_FIX
}
+// State to manage showing after export notifications and device ejecting
+enum ExportingStatus{
+ NOT_EXPORTING,
+ EXPORTING_TO_REMOVABLE,
+ EXPORTING_TO_LOCAL
+};
+
// Plater / private
struct Plater::priv
{
@@ -1466,7 +1601,7 @@ struct Plater::priv
Slic3r::SLAPrint sla_print;
Slic3r::Model model;
PrinterTechnology printer_technology = ptFFF;
- Slic3r::GCodePreviewData gcode_preview_data;
+ Slic3r::GCodeProcessor::Result gcode_result;
// GUI elements
wxSizer* panel_sizer{ nullptr };
@@ -1475,338 +1610,64 @@ struct Plater::priv
Sidebar *sidebar;
Bed3D bed;
Camera camera;
+#if ENABLE_ENVIRONMENT_MAP
+ GLTexture environment_texture;
+#endif // ENABLE_ENVIRONMENT_MAP
Mouse3DController mouse3d_controller;
View3D* view3D;
GLToolbar view_toolbar;
+ GLToolbar collapse_toolbar;
Preview *preview;
+ NotificationManager* notification_manager { nullptr };
BackgroundSlicingProcess background_process;
bool suppressed_backround_processing_update { false };
- // Cache the wti info
- class WipeTower: public GLCanvas3D::WipeTowerInfo {
- using ArrangePolygon = arrangement::ArrangePolygon;
- friend priv;
- public:
-
- void apply_arrange_result(const Vec2crd& tr, double rotation)
- {
- m_pos = unscaled(tr); m_rotation = rotation;
- apply_wipe_tower();
- }
-
- ArrangePolygon get_arrange_polygon() const
- {
- Polygon p({
- {coord_t(0), coord_t(0)},
- {scaled(m_bb_size(X)), coord_t(0)},
- {scaled(m_bb_size)},
- {coord_t(0), scaled(m_bb_size(Y))},
- {coord_t(0), coord_t(0)},
- });
-
- ArrangePolygon ret;
- ret.poly.contour = std::move(p);
- ret.translation = scaled(m_pos);
- ret.rotation = m_rotation;
- ret.priority++;
- return ret;
- }
- } wipetower;
-
- WipeTower& updated_wipe_tower() {
- auto wti = view3D->get_canvas3d()->get_wipe_tower_info();
- wipetower.m_pos = wti.pos();
- wipetower.m_rotation = wti.rotation();
- wipetower.m_bb_size = wti.bb_size();
- return wipetower;
- }
-
- // A class to handle UI jobs like arranging and optimizing rotation.
- // These are not instant jobs, the user has to be informed about their
- // state in the status progress indicator. On the other hand they are
- // separated from the background slicing process. Ideally, these jobs should
- // run when the background process is not running.
- //
- // TODO: A mechanism would be useful for blocking the plater interactions:
- // objects would be frozen for the user. In case of arrange, an animation
- // could be shown, or with the optimize orientations, partial results
- // could be displayed.
- class PlaterJob: public Job
+ // Jobs defined inside the group class will be managed so that only one can
+ // run at a time. Also, the background process will be stopped if a job is
+ // started. It is up the the plater to ensure that the background slicing
+ // can't be restarted while a ui job is still running.
+ class Jobs: public ExclusiveJobGroup
{
- priv *m_plater;
- protected:
-
- priv & plater() { return *m_plater; }
- const priv &plater() const { return *m_plater; }
-
- // Launched when the job is finished. It refreshes the 3Dscene by def.
- void finalize() override
- {
- // Do a full refresh of scene tree, including regenerating
- // all the GLVolumes. FIXME The update function shall just
- // reload the modified matrices.
- if (!Job::was_canceled())
- plater().update(unsigned(UpdateParams::FORCE_FULL_SCREEN_REFRESH));
-
- Job::finalize();
- }
-
+ priv *m;
+ size_t m_arrange_id, m_fill_bed_id, m_rotoptimize_id, m_sla_import_id;
+
+ void before_start() override { m->background_process.stop(); }
+
public:
- PlaterJob(priv *_plater)
- : Job(_plater->statusbar()), m_plater(_plater)
- {}
- };
-
- enum class Jobs : size_t {
- Arrange,
- Rotoptimize,
- Hollow
- };
-
- class ArrangeJob : public PlaterJob
- {
- using ArrangePolygon = arrangement::ArrangePolygon;
- using ArrangePolygons = arrangement::ArrangePolygons;
-
- // The gap between logical beds in the x axis expressed in ratio of
- // the current bed width.
- static const constexpr double LOGICAL_BED_GAP = 1. / 5.;
-
- ArrangePolygons m_selected, m_unselected, m_unprintable;
-
- // clear m_selected and m_unselected, reserve space for next usage
- void clear_input() {
- const Model &model = plater().model;
-
- size_t count = 0, cunprint = 0; // To know how much space to reserve
- for (auto obj : model.objects)
- for (auto mi : obj->instances)
- mi->printable ? count++ : cunprint++;
-
- m_selected.clear();
- m_unselected.clear();
- m_unprintable.clear();
- m_selected.reserve(count + 1 /* for optional wti */);
- m_unselected.reserve(count + 1 /* for optional wti */);
- m_unprintable.reserve(cunprint /* for optional wti */);
- }
-
- // Stride between logical beds
- coord_t bed_stride() const {
- double bedwidth = plater().bed_shape_bb().size().x();
- return scaled((1. + LOGICAL_BED_GAP) * bedwidth);
- }
-
- // Set up arrange polygon for a ModelInstance and Wipe tower
- template<class T> ArrangePolygon get_arrange_poly(T *obj) const {
- ArrangePolygon ap = obj->get_arrange_polygon();
- ap.priority = 0;
- ap.bed_idx = ap.translation.x() / bed_stride();
- ap.setter = [obj, this](const ArrangePolygon &p) {
- if (p.is_arranged()) {
- auto t = p.translation;
- t.x() += p.bed_idx * bed_stride();
- obj->apply_arrange_result(t, p.rotation);
- }
- };
- return ap;
- }
-
- // Prepare all objects on the bed regardless of the selection
- void prepare_all() {
- clear_input();
-
- for (ModelObject *obj: plater().model.objects)
- for (ModelInstance *mi : obj->instances) {
- ArrangePolygons & cont = mi->printable ? m_selected : m_unprintable;
- cont.emplace_back(get_arrange_poly(mi));
- }
-
- auto& wti = plater().updated_wipe_tower();
- if (wti) m_selected.emplace_back(get_arrange_poly(&wti));
- }
-
- // Prepare the selected and unselected items separately. If nothing is
- // selected, behaves as if everything would be selected.
- void prepare_selected() {
- clear_input();
-
- Model &model = plater().model;
- coord_t stride = bed_stride();
-
- std::vector<const Selection::InstanceIdxsList *>
- obj_sel(model.objects.size(), nullptr);
-
- for (auto &s : plater().get_selection().get_content())
- if (s.first < int(obj_sel.size()))
- obj_sel[size_t(s.first)] = &s.second;
-
- // Go through the objects and check if inside the selection
- for (size_t oidx = 0; oidx < model.objects.size(); ++oidx) {
- const Selection::InstanceIdxsList * instlist = obj_sel[oidx];
- ModelObject *mo = model.objects[oidx];
-
- std::vector<bool> inst_sel(mo->instances.size(), false);
-
- if (instlist)
- for (auto inst_id : *instlist)
- inst_sel[size_t(inst_id)] = true;
-
- for (size_t i = 0; i < inst_sel.size(); ++i) {
- ArrangePolygon &&ap = get_arrange_poly(mo->instances[i]);
-
- ArrangePolygons &cont = mo->instances[i]->printable ?
- (inst_sel[i] ? m_selected :
- m_unselected) :
- m_unprintable;
-
- cont.emplace_back(std::move(ap));
- }
- }
-
- auto& wti = plater().updated_wipe_tower();
- if (wti) {
- ArrangePolygon &&ap = get_arrange_poly(&wti);
-
- plater().get_selection().is_wipe_tower() ?
- m_selected.emplace_back(std::move(ap)) :
- m_unselected.emplace_back(std::move(ap));
- }
-
- // If the selection was empty arrange everything
- if (m_selected.empty()) m_selected.swap(m_unselected);
-
- // The strides have to be removed from the fixed items. For the
- // arrangeable (selected) items bed_idx is ignored and the
- // translation is irrelevant.
- for (auto &p : m_unselected) p.translation(X) -= p.bed_idx * stride;
- }
-
- protected:
-
- void prepare() override
+ Jobs(priv *_m) : m(_m)
{
- wxGetKeyState(WXK_SHIFT) ? prepare_selected() : prepare_all();
+ m_arrange_id = add_job(std::make_unique<ArrangeJob>(m->statusbar(), m->q));
+ m_fill_bed_id = add_job(std::make_unique<FillBedJob>(m->statusbar(), m->q));
+ m_rotoptimize_id = add_job(std::make_unique<RotoptimizeJob>(m->statusbar(), m->q));
+ m_sla_import_id = add_job(std::make_unique<SLAImportJob>(m->statusbar(), m->q));
}
-
- public:
- using PlaterJob::PlaterJob;
-
- int status_range() const override
+
+ void arrange()
{
- return int(m_selected.size() + m_unprintable.size());
+ m->take_snapshot(_(L("Arrange")));
+ start(m_arrange_id);
}
- void process() override;
-
- void finalize() override {
- // Ignore the arrange result if aborted.
- if (was_canceled()) return;
-
- // Unprintable items go to the last virtual bed
- int beds = 0;
-
- // Apply the arrange result to all selected objects
- for (ArrangePolygon &ap : m_selected) {
- beds = std::max(ap.bed_idx, beds);
- ap.apply();
- }
-
- // Get the virtual beds from the unselected items
- for (ArrangePolygon &ap : m_unselected)
- beds = std::max(ap.bed_idx, beds);
-
- // Move the unprintable items to the last virtual bed.
- for (ArrangePolygon &ap : m_unprintable) {
- ap.bed_idx += beds + 1;
- ap.apply();
- }
-
- plater().update();
+ void fill_bed()
+ {
+ m->take_snapshot(_(L("Fill bed")));
+ start(m_fill_bed_id);
}
- };
-
- class RotoptimizeJob : public PlaterJob
- {
- public:
- using PlaterJob::PlaterJob;
- void process() override;
- };
-
- class HollowJob : public PlaterJob
- {
- public:
- using PlaterJob::PlaterJob;
- void prepare() override;
- void process() override;
- void finalize() override;
- private:
- GLGizmoHollow * get_gizmo();
- const GLGizmoHollow * get_gizmo() const;
- std::unique_ptr<TriangleMesh> m_output_mesh;
- std::unique_ptr<MeshRaycaster> m_output_raycaster;
- const TriangleMesh* m_object_mesh = nullptr;
- sla::HollowingConfig m_cfg;
- };
-
- // Jobs defined inside the group class will be managed so that only one can
- // run at a time. Also, the background process will be stopped if a job is
- // started.
- class ExclusiveJobGroup {
-
- static const int ABORT_WAIT_MAX_MS = 10000;
-
- priv * m_plater;
-
- ArrangeJob arrange_job{m_plater};
- RotoptimizeJob rotoptimize_job{m_plater};
- HollowJob hollow_job{m_plater};
-
- // To create a new job, just define a new subclass of Job, implement
- // the process and the optional prepare() and finalize() methods
- // Register the instance of the class in the m_jobs container
- // if it cannot run concurrently with other jobs in this group
-
- std::vector<std::reference_wrapper<Job>> m_jobs{arrange_job,
- rotoptimize_job,
- hollow_job};
-
- public:
- ExclusiveJobGroup(priv *_plater) : m_plater(_plater) {}
-
- void start(Jobs jid) {
- m_plater->background_process.stop();
- stop_all();
- m_jobs[size_t(jid)].get().start();
- }
-
- void cancel_all() { for (Job& j : m_jobs) j.cancel(); }
-
- void join_all(int wait_ms = 0)
+ void optimize_rotation()
{
- std::vector<bool> aborted(m_jobs.size(), false);
-
- for (size_t jid = 0; jid < m_jobs.size(); ++jid)
- aborted[jid] = m_jobs[jid].get().join(wait_ms);
-
- if (!all_of(aborted))
- BOOST_LOG_TRIVIAL(error) << "Could not abort a job!";
+ m->take_snapshot(_(L("Optimize Rotation")));
+ start(m_rotoptimize_id);
}
-
- void stop_all() { cancel_all(); join_all(ABORT_WAIT_MAX_MS); }
-
- const Job& get(Jobs jobid) const { return m_jobs[size_t(jobid)]; }
-
- bool is_any_running() const
+
+ void import_sla_arch()
{
- return std::any_of(m_jobs.begin(),
- m_jobs.end(),
- [](const Job &j) { return j.is_running(); });
+ m->take_snapshot(_(L("Import SLA archive")));
+ start(m_sla_import_id);
}
-
- } m_ui_jobs{this};
+
+ } m_ui_jobs;
bool delayed_scene_refresh;
std::string delayed_error_message;
@@ -1816,6 +1677,10 @@ struct Plater::priv
std::string label_btn_export;
std::string label_btn_send;
+#if ENABLE_RENDER_STATISTICS
+ bool show_render_statistic_dialog{ false };
+#endif // ENABLE_RENDER_STATISTICS
+
static const std::regex pattern_bundle;
static const std::regex pattern_3mf;
static const std::regex pattern_zip_amf;
@@ -1825,10 +1690,10 @@ struct Plater::priv
priv(Plater *q, MainFrame *main_frame);
~priv();
- enum class UpdateParams {
- FORCE_FULL_SCREEN_REFRESH = 1,
- FORCE_BACKGROUND_PROCESSING_UPDATE = 2,
- POSTPONE_VALIDATION_ERROR_MESSAGE = 4,
+ enum class UpdateParams {
+ FORCE_FULL_SCREEN_REFRESH = 1,
+ FORCE_BACKGROUND_PROCESSING_UPDATE = 2,
+ POSTPONE_VALIDATION_ERROR_MESSAGE = 4,
};
void update(unsigned int flags = 0);
void select_view(const std::string& direction);
@@ -1842,21 +1707,34 @@ struct Plater::priv
bool are_view3D_labels_shown() const { return (current_panel == view3D) && view3D->get_canvas3d()->are_labels_shown(); }
void show_view3D_labels(bool show) { if (current_panel == view3D) view3D->get_canvas3d()->show_labels(show); }
+ bool is_sidebar_collapsed() const { return sidebar->is_collapsed(); }
+ void collapse_sidebar(bool collapse);
+
+ bool is_view3D_layers_editing_enabled() const { return (current_panel == view3D) && view3D->get_canvas3d()->is_layers_editing_enabled(); }
+
void set_current_canvas_as_dirty();
GLCanvas3D* get_current_canvas3D();
+ void unbind_canvas_event_handlers();
+ void reset_canvas_volumes();
bool init_view_toolbar();
+ bool init_collapse_toolbar();
+
+ void update_preview_bottom_toolbar();
+ void update_preview_moves_slider();
+ void enable_preview_moves_slider(bool enable);
+
+ void reset_gcode_toolpaths();
void reset_all_gizmos();
- void update_ui_from_settings();
+ void update_ui_from_settings(bool apply_free_camera_correction = true);
+ void update_main_toolbar_tooltips();
std::shared_ptr<ProgressStatusBar> statusbar();
std::string get_config(const std::string &key) const;
BoundingBoxf bed_shape_bb() const;
BoundingBox scaled_bed_shape_bb() const;
- arrangement::BedShapeHint get_bed_shape_hint() const;
- void find_new_position(const ModelInstancePtrs &instances, coord_t min_d);
- std::vector<size_t> load_files(const std::vector<fs::path>& input_files, bool load_model, bool load_config);
+ std::vector<size_t> load_files(const std::vector<fs::path>& input_files, bool load_model, bool load_config, bool used_inches = false);
std::vector<size_t> load_model_objects(const ModelObjectPtrs &model_objects);
wxString get_export_file(GUI::FileType file_type);
@@ -1873,9 +1751,6 @@ struct Plater::priv
void delete_object_from_model(size_t obj_idx);
void reset();
void mirror(Axis axis);
- void arrange();
- void hollow();
- void sla_optimize_rotation();
void split_object();
void split_volume();
void scale_selection_to_fit_print_volume();
@@ -1939,8 +1814,19 @@ struct Plater::priv
void on_select_preset(wxCommandEvent&);
void on_slicing_update(SlicingStatusEvent&);
void on_slicing_completed(wxCommandEvent&);
- void on_process_completed(wxCommandEvent&);
+ void on_process_completed(SlicingProcessCompletedEvent&);
+ void on_export_began(wxCommandEvent&);
void on_layer_editing_toggled(bool enable);
+ void on_slicing_began();
+
+ void clear_warnings();
+ void add_warning(const Slic3r::PrintStateBase::Warning &warning, size_t oid);
+ // Update notification manager with the current state of warnings produced by the background process (slicing).
+ void actualize_slicing_warnings(const PrintBase &print);
+ // Displays dialog window with list of warnings.
+ // Returns true if user clicks OK.
+ // Returns true if current_warnings vector is empty without showning the dialog
+ bool warnings_dialog();
void on_action_add(SimpleEvent&);
void on_action_split_objects(SimpleEvent&);
@@ -1961,7 +1847,7 @@ struct Plater::priv
// triangulate the bed and store the triangles into m_bed.m_triangles,
// fills the m_bed.m_grid_lines and sets m_bed.m_origin.
// Sets m_bed.m_polygon to limit the object placement.
- void set_bed_shape(const Pointfs& shape, const std::string& custom_texture, const std::string& custom_model);
+ void set_bed_shape(const Pointfs& shape, const std::string& custom_texture, const std::string& custom_model, bool force_as_custom = false);
bool can_delete() const;
bool can_delete_all() const;
@@ -1976,13 +1862,13 @@ struct Plater::priv
bool can_mirror() const;
bool can_reload_from_disk() const;
-#if ENABLE_THUMBNAIL_GENERATOR
void generate_thumbnail(ThumbnailData& data, unsigned int w, unsigned int h, bool printable_only, bool parts_only, bool show_bed, bool transparent_background);
void generate_thumbnails(ThumbnailsList& thumbnails, const Vec2ds& sizes, bool printable_only, bool parts_only, bool show_bed, bool transparent_background);
-#endif // ENABLE_THUMBNAIL_GENERATOR
void msw_rescale_object_menu();
+ void bring_instance_forward() const;
+
// returns the path to project file with the given extension (none if extension == wxEmptyString)
// extension should contain the leading dot, i.e.: ".3mf"
wxString get_project_filename(const wxString& extension = wxEmptyString) const;
@@ -1991,9 +1877,11 @@ struct Plater::priv
// Caching last value of show_action_buttons parameter for show_action_buttons(), so that a callback which does not know this state will not override it.
mutable bool ready_to_slice = { false };
// Flag indicating that the G-code export targets a removable device, therefore the show_action_buttons() needs to be called at any case when the background processing finishes.
- bool writing_to_removable_device = { false };
+ ExportingStatus exporting_status { NOT_EXPORTING };
+ std::string last_output_path;
+ std::string last_output_dir_path;
bool inside_snapshot_capture() { return m_prevent_snapshots != 0; }
-
+ bool process_completed_with_error { false };
private:
bool init_object_menu();
bool init_common_menu(wxMenu* menu, const bool is_part = false);
@@ -2021,6 +1909,11 @@ private:
* */
std::string m_last_fff_printer_profile_name;
std::string m_last_sla_printer_profile_name;
+
+ // vector of all warnings generated by last slicing
+ std::vector<std::pair<Slic3r::PrintStateBase::Warning, size_t>> current_warnings;
+ bool show_warning_dialog { false };
+
};
const std::regex Plater::priv::pattern_bundle(".*[.](amf|amf[.]xml|zip[.]amf|3mf|prusa)", std::regex::icase);
@@ -2034,8 +1927,7 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
, main_frame(main_frame)
, config(Slic3r::DynamicPrintConfig::new_from_defaults_keys({
"bed_shape", "bed_custom_texture", "bed_custom_model", "complete_objects", "duplicate_distance", "extruder_clearance_radius", "skirts", "skirt_distance",
- "brim_width", "variable_layer_height", "serial_port", "serial_speed", "host_type", "print_host",
- "printhost_apikey", "printhost_cafile", "nozzle_diameter", "single_extruder_multi_material",
+ "brim_width", "variable_layer_height", "nozzle_diameter", "single_extruder_multi_material",
"wipe_tower", "wipe_tower_x", "wipe_tower_y", "wipe_tower_width", "wipe_tower_rotation_angle",
"extruder_colour", "filament_colour", "max_print_height", "printer_model", "printer_technology",
// These values are necessary to construct SlicingParameters by the Canvas3D variable layer height editor.
@@ -2044,16 +1936,17 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
"support_material", "support_material_extruder", "support_material_interface_extruder", "support_material_contact_distance", "raft_layers"
}))
, sidebar(new Sidebar(q))
+ , m_ui_jobs(this)
, delayed_scene_refresh(false)
, view_toolbar(GLToolbar::Radio, "View")
+ , collapse_toolbar(GLToolbar::Normal, "Collapse")
, m_project_filename(wxEmptyString)
{
this->q->SetFont(Slic3r::GUI::wxGetApp().normal_font());
background_process.set_fff_print(&fff_print);
background_process.set_sla_print(&sla_print);
- background_process.set_gcode_preview_data(&gcode_preview_data);
-#if ENABLE_THUMBNAIL_GENERATOR
+ background_process.set_gcode_result(&gcode_result);
background_process.set_thumbnail_cb([this](ThumbnailsList& thumbnails, const Vec2ds& sizes, bool printable_only, bool parts_only, bool show_bed, bool transparent_background)
{
std::packaged_task<void(ThumbnailsList&, const Vec2ds&, bool, bool, bool, bool)> task([this](ThumbnailsList& thumbnails, const Vec2ds& sizes, bool printable_only, bool parts_only, bool show_bed, bool transparent_background) {
@@ -2063,9 +1956,9 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
wxTheApp->CallAfter([&]() { task(thumbnails, sizes, printable_only, parts_only, show_bed, transparent_background); });
result.wait();
});
-#endif // ENABLE_THUMBNAIL_GENERATOR
background_process.set_slicing_completed_event(EVT_SLICING_COMPLETED);
background_process.set_finished_event(EVT_PROCESS_COMPLETED);
+ background_process.set_export_began_event(EVT_EXPORT_BEGAN);
// Default printer technology for default config.
background_process.select_technology(this->printer_technology);
// Register progress callback from the Print class to the Plater.
@@ -2077,8 +1970,13 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
sla_print.set_status_callback(statuscb);
this->q->Bind(EVT_SLICING_UPDATE, &priv::on_slicing_update, this);
- view3D = new View3D(q, bed, camera, view_toolbar, &model, config, &background_process);
- preview = new Preview(q, bed, camera, view_toolbar, &model, config, &background_process, &gcode_preview_data, [this](){ schedule_background_process(); });
+ view3D = new View3D(q, &model, config, &background_process);
+ preview = new Preview(q, &model, config, &background_process, &gcode_result, [this]() { schedule_background_process(); });
+
+#ifdef __APPLE__
+ // set default view_toolbar icons size equal to GLGizmosManager::Default_Icons_Size
+ view_toolbar.set_icons_size(GLGizmosManager::Default_Icons_Size);
+#endif // __APPLE__
panels.push_back(view3D);
panels.push_back(preview);
@@ -2104,86 +2002,98 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
// Events:
- // Preset change event
- sidebar->Bind(wxEVT_COMBOBOX, &priv::on_select_preset, this);
-
- sidebar->Bind(EVT_OBJ_LIST_OBJECT_SELECT, [this](wxEvent&) { priv::selection_changed(); });
- sidebar->Bind(EVT_SCHEDULE_BACKGROUND_PROCESS, [this](SimpleEvent&) { this->schedule_background_process(); });
+ if (wxGetApp().is_editor()) {
+ // Preset change event
+ sidebar->Bind(wxEVT_COMBOBOX, &priv::on_select_preset, this);
+ sidebar->Bind(EVT_OBJ_LIST_OBJECT_SELECT, [this](wxEvent&) { priv::selection_changed(); });
+ sidebar->Bind(EVT_SCHEDULE_BACKGROUND_PROCESS, [this](SimpleEvent&) { this->schedule_background_process(); });
+ }
wxGLCanvas* view3D_canvas = view3D->get_wxglcanvas();
- // 3DScene events:
- view3D_canvas->Bind(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS, [this](SimpleEvent&) { this->schedule_background_process(); });
- view3D_canvas->Bind(EVT_GLCANVAS_OBJECT_SELECT, &priv::on_object_select, this);
- view3D_canvas->Bind(EVT_GLCANVAS_RIGHT_CLICK, &priv::on_right_click, this);
- view3D_canvas->Bind(EVT_GLCANVAS_REMOVE_OBJECT, [q](SimpleEvent&) { q->remove_selected(); });
- view3D_canvas->Bind(EVT_GLCANVAS_ARRANGE, [this](SimpleEvent&) { arrange(); });
- view3D_canvas->Bind(EVT_GLCANVAS_SELECT_ALL, [this](SimpleEvent&) { this->q->select_all(); });
- view3D_canvas->Bind(EVT_GLCANVAS_QUESTION_MARK, [this](SimpleEvent&) { wxGetApp().keyboard_shortcuts(); });
- view3D_canvas->Bind(EVT_GLCANVAS_INCREASE_INSTANCES, [this](Event<int> &evt)
- { if (evt.data == 1) this->q->increase_instances(); else if (this->can_decrease_instances()) this->q->decrease_instances(); });
- view3D_canvas->Bind(EVT_GLCANVAS_INSTANCE_MOVED, [this](SimpleEvent&) { update(); });
- view3D_canvas->Bind(EVT_GLCANVAS_FORCE_UPDATE, [this](SimpleEvent&) { update(); });
- view3D_canvas->Bind(EVT_GLCANVAS_WIPETOWER_MOVED, &priv::on_wipetower_moved, this);
- view3D_canvas->Bind(EVT_GLCANVAS_WIPETOWER_ROTATED, &priv::on_wipetower_rotated, this);
- view3D_canvas->Bind(EVT_GLCANVAS_INSTANCE_ROTATED, [this](SimpleEvent&) { update(); });
- view3D_canvas->Bind(EVT_GLCANVAS_INSTANCE_SCALED, [this](SimpleEvent&) { update(); });
- view3D_canvas->Bind(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, [this](Event<bool> &evt) { this->sidebar->enable_buttons(evt.data); });
- view3D_canvas->Bind(EVT_GLCANVAS_UPDATE_GEOMETRY, &priv::on_update_geometry, this);
- view3D_canvas->Bind(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED, &priv::on_3dcanvas_mouse_dragging_finished, this);
- view3D_canvas->Bind(EVT_GLCANVAS_TAB, [this](SimpleEvent&) { select_next_view_3D(); });
- view3D_canvas->Bind(EVT_GLCANVAS_RESETGIZMOS, [this](SimpleEvent&) { reset_all_gizmos(); });
- view3D_canvas->Bind(EVT_GLCANVAS_UNDO, [this](SimpleEvent&) { this->undo(); });
- view3D_canvas->Bind(EVT_GLCANVAS_REDO, [this](SimpleEvent&) { this->redo(); });
- view3D_canvas->Bind(EVT_GLCANVAS_RESET_LAYER_HEIGHT_PROFILE, [this](SimpleEvent&) { this->view3D->get_canvas3d()->reset_layer_height_profile(); });
- view3D_canvas->Bind(EVT_GLCANVAS_ADAPTIVE_LAYER_HEIGHT_PROFILE, [this](Event<float>& evt) { this->view3D->get_canvas3d()->adaptive_layer_height_profile(evt.data); });
- view3D_canvas->Bind(EVT_GLCANVAS_SMOOTH_LAYER_HEIGHT_PROFILE, [this](HeightProfileSmoothEvent& evt) { this->view3D->get_canvas3d()->smooth_layer_height_profile(evt.data); });
- view3D_canvas->Bind(EVT_GLCANVAS_RELOAD_FROM_DISK, [this](SimpleEvent&) { this->reload_all_from_disk(); });
-
- // 3DScene/Toolbar:
- view3D_canvas->Bind(EVT_GLTOOLBAR_ADD, &priv::on_action_add, this);
- view3D_canvas->Bind(EVT_GLTOOLBAR_DELETE, [q](SimpleEvent&) { q->remove_selected(); });
- view3D_canvas->Bind(EVT_GLTOOLBAR_DELETE_ALL, [q](SimpleEvent&) { q->reset_with_confirm(); });
- view3D_canvas->Bind(EVT_GLTOOLBAR_ARRANGE, [this](SimpleEvent&) { arrange(); });
- view3D_canvas->Bind(EVT_GLTOOLBAR_COPY, [q](SimpleEvent&) { q->copy_selection_to_clipboard(); });
- view3D_canvas->Bind(EVT_GLTOOLBAR_PASTE, [q](SimpleEvent&) { q->paste_from_clipboard(); });
- view3D_canvas->Bind(EVT_GLTOOLBAR_MORE, [q](SimpleEvent&) { q->increase_instances(); });
- view3D_canvas->Bind(EVT_GLTOOLBAR_FEWER, [q](SimpleEvent&) { q->decrease_instances(); });
- view3D_canvas->Bind(EVT_GLTOOLBAR_SPLIT_OBJECTS, &priv::on_action_split_objects, this);
- view3D_canvas->Bind(EVT_GLTOOLBAR_SPLIT_VOLUMES, &priv::on_action_split_volumes, this);
- view3D_canvas->Bind(EVT_GLTOOLBAR_LAYERSEDITING, &priv::on_action_layersediting, this);
- view3D_canvas->Bind(EVT_GLCANVAS_UPDATE_BED_SHAPE, [this](SimpleEvent&)
- {
- set_bed_shape(config->option<ConfigOptionPoints>("bed_shape")->values,
- config->option<ConfigOptionString>("bed_custom_texture")->value,
- config->option<ConfigOptionString>("bed_custom_model")->value);
- });
+
+ if (wxGetApp().is_editor()) {
+ // 3DScene events:
+ view3D_canvas->Bind(EVT_GLCANVAS_SCHEDULE_BACKGROUND_PROCESS, [this](SimpleEvent&) { this->schedule_background_process(); });
+ view3D_canvas->Bind(EVT_GLCANVAS_OBJECT_SELECT, &priv::on_object_select, this);
+ view3D_canvas->Bind(EVT_GLCANVAS_RIGHT_CLICK, &priv::on_right_click, this);
+ view3D_canvas->Bind(EVT_GLCANVAS_REMOVE_OBJECT, [q](SimpleEvent&) { q->remove_selected(); });
+ view3D_canvas->Bind(EVT_GLCANVAS_ARRANGE, [this](SimpleEvent&) { this->q->arrange(); });
+ view3D_canvas->Bind(EVT_GLCANVAS_SELECT_ALL, [this](SimpleEvent&) { this->q->select_all(); });
+ view3D_canvas->Bind(EVT_GLCANVAS_QUESTION_MARK, [](SimpleEvent&) { wxGetApp().keyboard_shortcuts(); });
+ view3D_canvas->Bind(EVT_GLCANVAS_INCREASE_INSTANCES, [this](Event<int>& evt)
+ { if (evt.data == 1) this->q->increase_instances(); else if (this->can_decrease_instances()) this->q->decrease_instances(); });
+ view3D_canvas->Bind(EVT_GLCANVAS_INSTANCE_MOVED, [this](SimpleEvent&) { update(); });
+ view3D_canvas->Bind(EVT_GLCANVAS_FORCE_UPDATE, [this](SimpleEvent&) { update(); });
+ view3D_canvas->Bind(EVT_GLCANVAS_WIPETOWER_MOVED, &priv::on_wipetower_moved, this);
+ view3D_canvas->Bind(EVT_GLCANVAS_WIPETOWER_ROTATED, &priv::on_wipetower_rotated, this);
+ view3D_canvas->Bind(EVT_GLCANVAS_INSTANCE_ROTATED, [this](SimpleEvent&) { update(); });
+ view3D_canvas->Bind(EVT_GLCANVAS_INSTANCE_SCALED, [this](SimpleEvent&) { update(); });
+ view3D_canvas->Bind(EVT_GLCANVAS_ENABLE_ACTION_BUTTONS, [this](Event<bool>& evt) { this->sidebar->enable_buttons(evt.data); });
+ view3D_canvas->Bind(EVT_GLCANVAS_UPDATE_GEOMETRY, &priv::on_update_geometry, this);
+ view3D_canvas->Bind(EVT_GLCANVAS_MOUSE_DRAGGING_FINISHED, &priv::on_3dcanvas_mouse_dragging_finished, this);
+ view3D_canvas->Bind(EVT_GLCANVAS_TAB, [this](SimpleEvent&) { select_next_view_3D(); });
+ view3D_canvas->Bind(EVT_GLCANVAS_RESETGIZMOS, [this](SimpleEvent&) { reset_all_gizmos(); });
+ view3D_canvas->Bind(EVT_GLCANVAS_UNDO, [this](SimpleEvent&) { this->undo(); });
+ view3D_canvas->Bind(EVT_GLCANVAS_REDO, [this](SimpleEvent&) { this->redo(); });
+ view3D_canvas->Bind(EVT_GLCANVAS_COLLAPSE_SIDEBAR, [this](SimpleEvent&) { this->q->collapse_sidebar(!this->q->is_sidebar_collapsed()); });
+ view3D_canvas->Bind(EVT_GLCANVAS_RESET_LAYER_HEIGHT_PROFILE, [this](SimpleEvent&) { this->view3D->get_canvas3d()->reset_layer_height_profile(); });
+ view3D_canvas->Bind(EVT_GLCANVAS_ADAPTIVE_LAYER_HEIGHT_PROFILE, [this](Event<float>& evt) { this->view3D->get_canvas3d()->adaptive_layer_height_profile(evt.data); });
+ view3D_canvas->Bind(EVT_GLCANVAS_SMOOTH_LAYER_HEIGHT_PROFILE, [this](HeightProfileSmoothEvent& evt) { this->view3D->get_canvas3d()->smooth_layer_height_profile(evt.data); });
+ view3D_canvas->Bind(EVT_GLCANVAS_RELOAD_FROM_DISK, [this](SimpleEvent&) { this->reload_all_from_disk(); });
+
+ // 3DScene/Toolbar:
+ view3D_canvas->Bind(EVT_GLTOOLBAR_ADD, &priv::on_action_add, this);
+ view3D_canvas->Bind(EVT_GLTOOLBAR_DELETE, [q](SimpleEvent&) { q->remove_selected(); });
+ view3D_canvas->Bind(EVT_GLTOOLBAR_DELETE_ALL, [q](SimpleEvent&) { q->reset_with_confirm(); });
+ view3D_canvas->Bind(EVT_GLTOOLBAR_ARRANGE, [this](SimpleEvent&) { this->q->arrange(); });
+ view3D_canvas->Bind(EVT_GLTOOLBAR_COPY, [q](SimpleEvent&) { q->copy_selection_to_clipboard(); });
+ view3D_canvas->Bind(EVT_GLTOOLBAR_PASTE, [q](SimpleEvent&) { q->paste_from_clipboard(); });
+ view3D_canvas->Bind(EVT_GLTOOLBAR_MORE, [q](SimpleEvent&) { q->increase_instances(); });
+ view3D_canvas->Bind(EVT_GLTOOLBAR_FEWER, [q](SimpleEvent&) { q->decrease_instances(); });
+ view3D_canvas->Bind(EVT_GLTOOLBAR_SPLIT_OBJECTS, &priv::on_action_split_objects, this);
+ view3D_canvas->Bind(EVT_GLTOOLBAR_SPLIT_VOLUMES, &priv::on_action_split_volumes, this);
+ view3D_canvas->Bind(EVT_GLTOOLBAR_LAYERSEDITING, &priv::on_action_layersediting, this);
+ }
+ view3D_canvas->Bind(EVT_GLCANVAS_UPDATE_BED_SHAPE, [q](SimpleEvent&) { q->set_bed_shape(); });
// Preview events:
preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_QUESTION_MARK, [this](SimpleEvent&) { wxGetApp().keyboard_shortcuts(); });
- preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_UPDATE_BED_SHAPE, [this](SimpleEvent&)
- {
- set_bed_shape(config->option<ConfigOptionPoints>("bed_shape")->values,
- config->option<ConfigOptionString>("bed_custom_texture")->value,
- config->option<ConfigOptionString>("bed_custom_model")->value);
+ preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_UPDATE_BED_SHAPE, [q](SimpleEvent&) { q->set_bed_shape(); });
+ if (wxGetApp().is_editor()) {
+ preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_TAB, [this](SimpleEvent&) { select_next_view_3D(); });
+ preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_COLLAPSE_SIDEBAR, [this](SimpleEvent&) { this->q->collapse_sidebar(!this->q->is_sidebar_collapsed()); });
+ }
+ preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_JUMP_TO, [this](wxKeyEvent& evt) { preview->jump_layers_slider(evt); });
+#if ENABLE_ARROW_KEYS_WITH_SLIDERS
+ preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_MOVE_SLIDERS, [this](wxKeyEvent& evt) {
+ preview->move_layers_slider(evt);
+ preview->move_moves_slider(evt);
});
- preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_TAB, [this](SimpleEvent&) { select_next_view_3D(); });
- preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_MOVE_DOUBLE_SLIDER, [this](wxKeyEvent& evt) { preview->move_double_slider(evt); });
- preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_EDIT_COLOR_CHANGE, [this](wxKeyEvent& evt) { preview->edit_double_slider(evt); });
-
- q->Bind(EVT_SLICING_COMPLETED, &priv::on_slicing_completed, this);
- q->Bind(EVT_PROCESS_COMPLETED, &priv::on_process_completed, this);
- q->Bind(EVT_GLVIEWTOOLBAR_3D, [q](SimpleEvent&) { q->select_view_3D("3D"); });
- q->Bind(EVT_GLVIEWTOOLBAR_PREVIEW, [q](SimpleEvent&) { q->select_view_3D("Preview"); });
+#else
+ preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_MOVE_LAYERS_SLIDER, [this](wxKeyEvent& evt) { preview->move_layers_slider(evt); });
+#endif // ENABLE_ARROW_KEYS_WITH_SLIDERS
+ preview->get_wxglcanvas()->Bind(EVT_GLCANVAS_EDIT_COLOR_CHANGE, [this](wxKeyEvent& evt) { preview->edit_layers_slider(evt); });
+ if (wxGetApp().is_gcode_viewer())
+ preview->Bind(EVT_GLCANVAS_RELOAD_FROM_DISK, [this](SimpleEvent&) { this->q->reload_gcode_from_disk(); });
+
+ if (wxGetApp().is_editor()) {
+ q->Bind(EVT_SLICING_COMPLETED, &priv::on_slicing_completed, this);
+ q->Bind(EVT_PROCESS_COMPLETED, &priv::on_process_completed, this);
+ q->Bind(EVT_EXPORT_BEGAN, &priv::on_export_began, this);
+ q->Bind(EVT_GLVIEWTOOLBAR_3D, [q](SimpleEvent&) { q->select_view_3D("3D"); });
+ q->Bind(EVT_GLVIEWTOOLBAR_PREVIEW, [q](SimpleEvent&) { q->select_view_3D("Preview"); });
+ }
// Drop target:
q->SetDropTarget(new PlaterDropTarget(q)); // if my understanding is right, wxWindow takes the owenership
-
- update_ui_from_settings();
q->Layout();
- set_current_panel(view3D);
+ set_current_panel(wxGetApp().is_editor() ? static_cast<wxPanel*>(view3D) : static_cast<wxPanel*>(preview));
+ if (wxGetApp().is_gcode_viewer())
+ preview->hide_layers_slider();
// updates camera type from .ini file
+ camera.enable_update_config_on_type_change(true);
camera.set_type(get_config("use_perspective_camera"));
// Load the 3DConnexion device database.
@@ -2197,29 +2107,77 @@ Plater::priv::priv(Plater *q, MainFrame *main_frame)
// is one of the 3D Mouse vendors (3DConnexion or Logitech).
this->q->Bind(EVT_HID_DEVICE_ATTACHED, [this](HIDDeviceAttachedEvent &evt) {
mouse3d_controller.device_attached(evt.data);
- });
+ });
+#if ENABLE_CTRL_M_ON_WINDOWS
+ this->q->Bind(EVT_HID_DEVICE_DETACHED, [this](HIDDeviceAttachedEvent& evt) {
+ mouse3d_controller.device_detached(evt.data);
+ });
+#endif // ENABLE_CTRL_M_ON_WINDOWS
#endif /* _WIN32 */
- this->q->Bind(EVT_REMOVABLE_DRIVE_EJECTED, [this](RemovableDriveEjectEvent &evt) {
- if (evt.data.second) {
- this->show_action_buttons(this->ready_to_slice);
- Slic3r::GUI::show_info(this->q, (boost::format(_utf8(L("Unmounting successful. The device %s(%s) can now be safely removed from the computer.")))
- % evt.data.first.name % evt.data.first.path).str());
- } else
- Slic3r::GUI::show_info(this->q, (boost::format(_utf8(L("Ejecting of device %s(%s) has failed.")))
- % evt.data.first.name % evt.data.first.path).str());
- });
- this->q->Bind(EVT_REMOVABLE_DRIVES_CHANGED, [this](RemovableDrivesChangedEvent &) { this->show_action_buttons(this->ready_to_slice); });
- // Start the background thread and register this window as a target for update events.
- wxGetApp().removable_drive_manager()->init(this->q);
+ notification_manager = new NotificationManager(this->q);
+ if (wxGetApp().is_editor()) {
+ this->q->Bind(EVT_EJECT_DRIVE_NOTIFICAION_CLICKED, [this](EjectDriveNotificationClickedEvent&) { this->q->eject_drive(); });
+ this->q->Bind(EVT_EXPORT_GCODE_NOTIFICAION_CLICKED, [this](ExportGcodeNotificationClickedEvent&) { this->q->export_gcode(true); });
+ this->q->Bind(EVT_PRESET_UPDATE_AVAILABLE_CLICKED, [this](PresetUpdateAvailableClickedEvent&) { wxGetApp().get_preset_updater()->on_update_notification_confirm(); });
+ this->q->Bind(EVT_REMOVABLE_DRIVE_EJECTED, [this, q](RemovableDriveEjectEvent &evt) {
+ if (evt.data.second) {
+ this->show_action_buttons(this->ready_to_slice);
+ notification_manager->close_notification_of_type(NotificationType::ExportFinished);
+ notification_manager->push_notification(NotificationType::CustomNotification,
+ NotificationManager::NotificationLevel::RegularNotification,
+ format(_L("Successfully unmounted. The device %s(%s) can now be safely removed from the computer."), evt.data.first.name, evt.data.first.path)
+ );
+ } else {
+ notification_manager->push_notification(NotificationType::CustomNotification,
+ NotificationManager::NotificationLevel::ErrorNotification,
+ format(_L("Ejecting of device %s(%s) has failed."), evt.data.first.name, evt.data.first.path)
+ );
+ }
+ });
+ this->q->Bind(EVT_REMOVABLE_DRIVES_CHANGED, [this, q](RemovableDrivesChangedEvent &) {
+ this->show_action_buttons(this->ready_to_slice);
+ // Close notification ExportingFinished but only if last export was to removable
+ notification_manager->device_ejected();
+ });
+ // Start the background thread and register this window as a target for update events.
+ wxGetApp().removable_drive_manager()->init(this->q);
#ifdef _WIN32
- // Trigger enumeration of removable media on Win32 notification.
- this->q->Bind(EVT_VOLUME_ATTACHED, [this](VolumeAttachedEvent &evt) { wxGetApp().removable_drive_manager()->volumes_changed(); });
- this->q->Bind(EVT_VOLUME_DETACHED, [this](VolumeDetachedEvent &evt) { wxGetApp().removable_drive_manager()->volumes_changed(); });
+ // Trigger enumeration of removable media on Win32 notification.
+ this->q->Bind(EVT_VOLUME_ATTACHED, [this](VolumeAttachedEvent &evt) { wxGetApp().removable_drive_manager()->volumes_changed(); });
+ this->q->Bind(EVT_VOLUME_DETACHED, [this](VolumeDetachedEvent &evt) { wxGetApp().removable_drive_manager()->volumes_changed(); });
#endif /* _WIN32 */
+ }
// Initialize the Undo / Redo stack with a first snapshot.
- this->take_snapshot(_(L("New Project")));
+ this->take_snapshot(_L("New Project"));
+
+#if ENABLE_DRAG_AND_DROP_FIX
+ this->q->Bind(EVT_LOAD_MODEL_OTHER_INSTANCE, [this](LoadFromOtherInstanceEvent& evt) {
+ BOOST_LOG_TRIVIAL(trace) << "Received load from other instance event.";
+ wxArrayString input_files;
+ for (size_t i = 0; i < evt.data.size(); ++i) {
+ input_files.push_back(from_u8(evt.data[i].string()));
+ }
+ wxGetApp().mainframe->Raise();
+ this->q->load_files(input_files);
+ });
+#else
+ this->q->Bind(EVT_LOAD_MODEL_OTHER_INSTANCE, [this](LoadFromOtherInstanceEvent &evt) {
+ BOOST_LOG_TRIVIAL(trace) << "Received load from other instance event.";
+ this->load_files(evt.data, true, true);
+ });
+#endif // ENABLE_DRAG_AND_DROP_FIX
+ this->q->Bind(EVT_INSTANCE_GO_TO_FRONT, [this](InstanceGoToFrontEvent &) {
+ bring_instance_forward();
+ });
+ wxGetApp().other_instance_message_handler()->init(this->q);
+
+ // collapse sidebar according to saved value
+ if (wxGetApp().is_editor()) {
+ bool is_collapsed = wxGetApp().app_config->get("collapsed_sidebar") == "1";
+ sidebar->collapse(is_collapsed);
+ }
}
Plater::priv::~priv()
@@ -2267,6 +2225,8 @@ void Plater::priv::select_view_3D(const std::string& name)
set_current_panel(view3D);
else if (name == "Preview")
set_current_panel(preview);
+
+ wxGetApp().update_ui_from_settings(false);
}
void Plater::priv::select_next_view_3D()
@@ -2277,6 +2237,20 @@ void Plater::priv::select_next_view_3D()
set_current_panel(view3D);
}
+void Plater::priv::collapse_sidebar(bool collapse)
+{
+ sidebar->collapse(collapse);
+
+ // Now update the tooltip in the toolbar.
+ std::string new_tooltip = collapse
+ ? _utf8(L("Expand sidebar"))
+ : _utf8(L("Collapse sidebar"));
+ new_tooltip += " [Shift+Tab]";
+ int id = collapse_toolbar.get_item_id("collapse_sidebar");
+ collapse_toolbar.set_tooltip(id, new_tooltip);
+}
+
+
void Plater::priv::reset_all_gizmos()
{
view3D->get_canvas3d()->reset_all_gizmos();
@@ -2284,14 +2258,23 @@ void Plater::priv::reset_all_gizmos()
// Called after the Preferences dialog is closed and the program settings are saved.
// Update the UI based on the current preferences.
-void Plater::priv::update_ui_from_settings()
+void Plater::priv::update_ui_from_settings(bool apply_free_camera_correction)
{
camera.set_type(wxGetApp().app_config->get("use_perspective_camera"));
- if (wxGetApp().app_config->get("use_free_camera") != "1")
+ if (apply_free_camera_correction && wxGetApp().app_config->get("use_free_camera") != "1")
camera.recover_from_free_camera();
view3D->get_canvas3d()->update_ui_from_settings();
preview->get_canvas3d()->update_ui_from_settings();
+
+ sidebar->update_ui_from_settings();
+}
+
+// Called after the print technology was changed.
+// Update the tooltips for "Switch to Settings" button in maintoolbar
+void Plater::priv::update_main_toolbar_tooltips()
+{
+ view3D->get_canvas3d()->update_tooltip_for_settings_item_in_main_toolbar();
}
std::shared_ptr<ProgressStatusBar> Plater::priv::statusbar()
@@ -2317,7 +2300,7 @@ BoundingBox Plater::priv::scaled_bed_shape_bb() const
return bed_shape.bounding_box();
}
-std::vector<size_t> Plater::priv::load_files(const std::vector<fs::path>& input_files, bool load_model, bool load_config)
+std::vector<size_t> Plater::priv::load_files(const std::vector<fs::path>& input_files, bool load_model, bool load_config, bool imperial_units/* = false*/)
{
if (input_files.empty()) { return std::vector<size_t>(); }
@@ -2333,18 +2316,18 @@ std::vector<size_t> Plater::priv::load_files(const std::vector<fs::path>& input_
}
}
- const auto loading = _(L("Loading")) + dots;
- wxProgressDialog dlg(loading, loading);
+ const auto loading = _L("Loading") + dots;
+ wxProgressDialog dlg(loading, "", 100, q, wxPD_AUTO_HIDE);
dlg.Pulse();
auto *new_model = (!load_model || one_by_one) ? nullptr : new Slic3r::Model();
std::vector<size_t> obj_idxs;
- for (size_t i = 0; i < input_files.size(); i++) {
+ for (size_t i = 0; i < input_files.size(); ++i) {
const auto &path = input_files[i];
const auto filename = path.filename();
- const auto dlg_info = from_u8((boost::format(_utf8(L("Processing input file %s"))) % from_path(filename)).str()) + "\n";
- dlg.Update(100 * i / input_files.size(), dlg_info);
+ const auto dlg_info = _L("Loading file") + ": " + from_path(filename);
+ dlg.Update(static_cast<int>(100.0f * static_cast<float>(i) / static_cast<float>(input_files.size())), dlg_info);
const bool type_3mf = std::regex_match(path.string(), pattern_3mf);
const bool type_zip_amf = !type_3mf && std::regex_match(path.string(), pattern_zip_amf);
@@ -2371,9 +2354,9 @@ std::vector<size_t> Plater::priv::load_files(const std::vector<fs::path>& input_
if (object->volumes.size() > 1)
{
Slic3r::GUI::show_info(nullptr,
- _(L("You cannot load SLA project with a multi-part object on the bed")) + "\n\n" +
- _(L("Please check your object list before preset changing.")),
- _(L("Attention!")));
+ _L("You cannot load SLA project with a multi-part object on the bed") + "\n\n" +
+ _L("Please check your object list before preset changing."),
+ _L("Attention!"));
return obj_idxs;
}
}
@@ -2393,7 +2376,10 @@ std::vector<size_t> Plater::priv::load_files(const std::vector<fs::path>& input_
if (!config.empty()) {
Preset::normalize(config);
wxGetApp().preset_bundle->load_config_model(filename.string(), std::move(config));
- wxGetApp().load_current_presets();
+ if (printer_technology == ptFFF)
+ CustomGCode::update_custom_gcode_per_print_z_from_config(model.custom_gcode_per_print_z, &wxGetApp().preset_bundle->project_config);
+ // For exporting from the amf/3mf we shouldn't check printer_presets for the containing information about "Print Host upload"
+ wxGetApp().load_current_presets(false);
is_project_file = true;
}
wxGetApp().app_config->update_config_dir(path.parent_path().string());
@@ -2414,21 +2400,40 @@ std::vector<size_t> Plater::priv::load_files(const std::vector<fs::path>& input_
{
// The model should now be initialized
- if (! is_project_file) {
+ auto convert_from_imperial_units = [](Model& model, bool only_small_volumes) {
+ model.convert_from_imperial_units(only_small_volumes);
+// wxGetApp().app_config->set("use_inches", "1");
+ wxGetApp().sidebar().update_ui_from_settings();
+ };
+
+ if (!is_project_file) {
+ if (imperial_units)
+ // Convert even if the object is big.
+ convert_from_imperial_units(model, false);
+ else if (model.looks_like_imperial_units()) {
+ wxMessageDialog msg_dlg(q, format_wxstr(_L(
+ "Some object(s) in file %s looks like saved in inches.\n"
+ "Should I consider them as a saved in inches and convert them?"), from_path(filename)) + "\n",
+ _L("The object appears to be saved in inches"), wxICON_WARNING | wxYES | wxNO);
+ if (msg_dlg.ShowModal() == wxID_YES)
+ //FIXME up-scale only the small parts?
+ convert_from_imperial_units(model, true);
+ }
+
if (model.looks_like_multipart_object()) {
- wxMessageDialog msg_dlg(q, _(L(
+ wxMessageDialog msg_dlg(q, _L(
"This file contains several objects positioned at multiple heights.\n"
"Instead of considering them as multiple objects, should I consider\n"
- "this file as a single object having multiple parts?")) + "\n",
- _(L("Multi-part object detected")), wxICON_WARNING | wxYES | wxNO);
+ "this file as a single object having multiple parts?") + "\n",
+ _L("Multi-part object detected"), wxICON_WARNING | wxYES | wxNO);
if (msg_dlg.ShowModal() == wxID_YES) {
model.convert_multipart_object(nozzle_dmrs->values.size());
}
}
}
else if ((wxGetApp().get_mode() == comSimple) && (type_3mf || type_any_amf) && model_has_advanced_features(model)) {
- wxMessageDialog msg_dlg(q, _(L("This file cannot be loaded in a simple mode. Do you want to switch to an advanced mode?"))+"\n",
- _(L("Detected advanced data")), wxICON_WARNING | wxYES | wxNO);
+ wxMessageDialog msg_dlg(q, _L("This file cannot be loaded in a simple mode. Do you want to switch to an advanced mode?")+"\n",
+ _L("Detected advanced data"), wxICON_WARNING | wxYES | wxNO);
if (msg_dlg.ShowModal() == wxID_YES)
{
Slic3r::GUI::wxGetApp().save_mode(comAdvanced);
@@ -2450,8 +2455,8 @@ std::vector<size_t> Plater::priv::load_files(const std::vector<fs::path>& input_
for (auto obj : model.objects)
if ( obj->volumes.size()>1 ) {
Slic3r::GUI::show_error(nullptr,
- from_u8((boost::format(_utf8(L("You can't to add the object(s) from %s because of one or some of them is(are) multi-part")))
- % from_path(filename)).str()));
+ format_wxstr(_L("You can't to add the object(s) from %s because of one or some of them is(are) multi-part"),
+ from_path(filename)));
return obj_idxs;
}
}
@@ -2469,11 +2474,11 @@ std::vector<size_t> Plater::priv::load_files(const std::vector<fs::path>& input_
}
if (new_model != nullptr && new_model->objects.size() > 1) {
- wxMessageDialog msg_dlg(q, _(L(
+ wxMessageDialog msg_dlg(q, _L(
"Multiple objects were loaded for a multi-material printer.\n"
"Instead of considering them as multiple objects, should I consider\n"
- "these files to represent a single object having multiple parts?")) + "\n",
- _(L("Multi-part object detected")), wxICON_WARNING | wxYES | wxNO);
+ "these files to represent a single object having multiple parts?") + "\n",
+ _L("Multi-part object detected"), wxICON_WARNING | wxYES | wxNO);
if (msg_dlg.ShowModal() == wxID_YES) {
new_model->convert_multipart_object(nozzle_dmrs->values.size());
}
@@ -2486,7 +2491,7 @@ std::vector<size_t> Plater::priv::load_files(const std::vector<fs::path>& input_
{
wxGetApp().app_config->update_skein_dir(input_files[input_files.size() - 1].parent_path().string());
// XXX: Plater.pm had @loaded_files, but didn't seem to fill them with the filenames...
- statusbar()->set_status_text(_(L("Loaded")));
+ statusbar()->set_status_text(_L("Loaded"));
}
// automatic selection of added objects
@@ -2588,8 +2593,8 @@ std::vector<size_t> Plater::priv::load_model_objects(const ModelObjectPtrs &mode
if (scaled_down) {
GUI::show_info(q,
- _(L("Your object appears to be too large, so it was automatically scaled down to fit your print bed.")),
- _(L("Object too large?")));
+ _L("Your object appears to be too large, so it was automatically scaled down to fit your print bed."),
+ _L("Object too large?"));
}
for (const size_t idx : obj_idxs) {
@@ -2651,26 +2656,26 @@ wxString Plater::priv::get_export_file(GUI::FileType file_type)
case FT_STL:
{
output_file.replace_extension("stl");
- dlg_title = _(L("Export STL file:"));
+ dlg_title = _L("Export STL file:");
break;
}
case FT_AMF:
{
// XXX: Problem on OS X with double extension?
output_file.replace_extension("zip.amf");
- dlg_title = _(L("Export AMF file:"));
+ dlg_title = _L("Export AMF file:");
break;
}
case FT_3MF:
{
output_file.replace_extension("3mf");
- dlg_title = _(L("Save file as:"));
+ dlg_title = _L("Save file as:");
break;
}
case FT_OBJ:
{
output_file.replace_extension("obj");
- dlg_title = _(L("Export OBJ file:"));
+ dlg_title = _L("Export OBJ file:");
break;
}
default: break;
@@ -2735,30 +2740,24 @@ void Plater::priv::object_list_changed()
{
const bool export_in_progress = this->background_process.is_export_scheduled(); // || ! send_gcode_file.empty());
// XXX: is this right?
- const bool model_fits = view3D->check_volumes_outside_state() == ModelInstance::PVS_Inside;
+ const bool model_fits = view3D->check_volumes_outside_state() == ModelInstancePVS_Inside;
sidebar->enable_buttons(!model.objects.empty() && !export_in_progress && model_fits);
}
void Plater::priv::select_all()
{
-// this->take_snapshot(_(L("Select All")));
-
view3D->select_all();
this->sidebar->obj_list()->update_selections();
}
void Plater::priv::deselect_all()
{
-// this->take_snapshot(_(L("Deselect All")));
view3D->deselect_all();
}
void Plater::priv::remove(size_t obj_idx)
{
- // Prevent toolpaths preview from rendering while we modify the Print object
- preview->set_enabled(false);
-
if (view3D->is_layers_editing_enabled())
view3D->enable_layers_editing(false);
@@ -2772,7 +2771,7 @@ void Plater::priv::remove(size_t obj_idx)
void Plater::priv::delete_object_from_model(size_t obj_idx)
{
- wxString snapshot_label = _(L("Delete Object"));
+ wxString snapshot_label = _L("Delete Object");
if (! model.objects[obj_idx]->name.empty())
snapshot_label += ": " + wxString::FromUTF8(model.objects[obj_idx]->name.c_str());
Plater::TakeSnapshot snapshot(q, snapshot_label);
@@ -2783,16 +2782,18 @@ void Plater::priv::delete_object_from_model(size_t obj_idx)
void Plater::priv::reset()
{
- Plater::TakeSnapshot snapshot(q, _(L("Reset Project")));
+ Plater::TakeSnapshot snapshot(q, _L("Reset Project"));
- set_project_filename(wxEmptyString);
+ clear_warnings();
- // Prevent toolpaths preview from rendering while we modify the Print object
- preview->set_enabled(false);
+ set_project_filename(wxEmptyString);
if (view3D->is_layers_editing_enabled())
view3D->enable_layers_editing(false);
+ reset_gcode_toolpaths();
+ gcode_result.reset();
+
// Stop and reset the Print content.
this->background_process.reset();
model.clear_objects();
@@ -2812,45 +2813,12 @@ void Plater::priv::mirror(Axis axis)
view3D->mirror_selection(axis);
}
-void Plater::priv::arrange()
-{
- this->take_snapshot(_(L("Arrange")));
- m_ui_jobs.start(Jobs::Arrange);
-}
-
-void Plater::priv::hollow()
-{
- this->take_snapshot(_(L("Hollow")));
- m_ui_jobs.start(Jobs::Hollow);
-}
-
-// This method will find an optimal orientation for the currently selected item
-// Very similar in nature to the arrange method above...
-void Plater::priv::sla_optimize_rotation() {
- this->take_snapshot(_(L("Optimize Rotation")));
- m_ui_jobs.start(Jobs::Rotoptimize);
-}
-
-arrangement::BedShapeHint Plater::priv::get_bed_shape_hint() const {
-
- const auto *bed_shape_opt = config->opt<ConfigOptionPoints>("bed_shape");
- assert(bed_shape_opt);
-
- if (!bed_shape_opt) return {};
-
- auto &bedpoints = bed_shape_opt->values;
- Polyline bedpoly; bedpoly.points.reserve(bedpoints.size());
- for (auto &v : bedpoints) bedpoly.append(scaled(v));
-
- return arrangement::BedShapeHint(bedpoly);
-}
-
-void Plater::priv::find_new_position(const ModelInstancePtrs &instances,
+void Plater::find_new_position(const ModelInstancePtrs &instances,
coord_t min_d)
{
arrangement::ArrangePolygons movable, fixed;
-
- for (const ModelObject *mo : model.objects)
+
+ for (const ModelObject *mo : p->model.objects)
for (const ModelInstance *inst : mo->instances) {
auto it = std::find(instances.begin(), instances.end(), inst);
auto arrpoly = inst->get_arrange_polygon();
@@ -2860,168 +2828,19 @@ void Plater::priv::find_new_position(const ModelInstancePtrs &instances,
else
movable.emplace_back(std::move(arrpoly));
}
-
- if (updated_wipe_tower())
- fixed.emplace_back(wipetower.get_arrange_polygon());
-
- arrangement::arrange(movable, fixed, min_d, get_bed_shape_hint());
+
+ if (auto wt = get_wipe_tower_arrangepoly(*this))
+ fixed.emplace_back(*wt);
+
+ arrangement::arrange(movable, fixed, get_bed_shape(*config()),
+ arrangement::ArrangeParams{min_d});
for (size_t i = 0; i < instances.size(); ++i)
if (movable[i].bed_idx == 0)
- instances[i]->apply_arrange_result(movable[i].translation,
+ instances[i]->apply_arrange_result(movable[i].translation.cast<double>(),
movable[i].rotation);
}
-void Plater::priv::ArrangeJob::process() {
- static const auto arrangestr = _(L("Arranging"));
-
- // FIXME: I don't know how to obtain the minimum distance, it depends
- // on printer technology. I guess the following should work but it crashes.
- double dist = 6; // PrintConfig::min_object_distance(config);
- if (plater().printer_technology == ptFFF) {
- dist = PrintConfig::min_object_distance(plater().config);
- }
-
- coord_t min_d = scaled(dist);
- auto count = unsigned(m_selected.size() + m_unprintable.size());
- arrangement::BedShapeHint bedshape = plater().get_bed_shape_hint();
-
- auto stopfn = [this]() { return was_canceled(); };
-
- try {
- arrangement::arrange(m_selected, m_unselected, min_d, bedshape,
- [this, count](unsigned st) {
- st += m_unprintable.size();
- if (st > 0) update_status(int(count - st), arrangestr);
- }, stopfn);
- arrangement::arrange(m_unprintable, {}, min_d, bedshape,
- [this, count](unsigned st) {
- if (st > 0) update_status(int(count - st), arrangestr);
- }, stopfn);
- } catch (std::exception & /*e*/) {
- GUI::show_error(plater().q,
- _(L("Could not arrange model objects! "
- "Some geometries may be invalid.")));
- }
-
- // finalize just here.
- update_status(int(count),
- was_canceled() ? _(L("Arranging canceled."))
- : _(L("Arranging done.")));
-}
-
-void Plater::priv::RotoptimizeJob::process()
-{
- int obj_idx = plater().get_selected_object_idx();
- if (obj_idx < 0) { return; }
-
- ModelObject *o = plater().model.objects[size_t(obj_idx)];
-
- auto r = sla::find_best_rotation(
- *o,
- .005f,
- [this](unsigned s) {
- if (s < 100)
- update_status(int(s),
- _(L("Searching for optimal orientation")));
- },
- [this]() { return was_canceled(); });
-
-
- double mindist = 6.0; // FIXME
-
- if (!was_canceled()) {
- for(ModelInstance * oi : o->instances) {
- oi->set_rotation({r[X], r[Y], r[Z]});
-
- auto trmatrix = oi->get_transformation().get_matrix();
- Polygon trchull = o->convex_hull_2d(trmatrix);
-
- MinAreaBoundigBox rotbb(trchull, MinAreaBoundigBox::pcConvex);
- double r = rotbb.angle_to_X();
-
- // The box should be landscape
- if(rotbb.width() < rotbb.height()) r += PI / 2;
-
- Vec3d rt = oi->get_rotation(); rt(Z) += r;
-
- oi->set_rotation(rt);
- }
-
- plater().find_new_position(o->instances, scaled(mindist));
-
- // Correct the z offset of the object which was corrupted be
- // the rotation
- o->ensure_on_bed();
- }
-
- update_status(100,
- was_canceled() ? _(L("Orientation search canceled."))
- : _(L("Orientation found.")));
-}
-
-void Plater::priv::HollowJob::prepare()
-{
- const GLGizmosManager& gizmo_manager = plater().q->canvas3D()->get_gizmos_manager();
- const GLGizmoHollow* gizmo_hollow = dynamic_cast<const GLGizmoHollow*>(gizmo_manager.get_current());
- assert(gizmo_hollow);
- auto hlw_data = gizmo_hollow->get_hollowing_parameters();
- m_object_mesh = hlw_data.first;
- m_cfg = hlw_data.second;
- m_output_mesh.reset();
-}
-
-void Plater::priv::HollowJob::process()
-{
- sla::JobController ctl;
- ctl.stopcondition = [this]{ return was_canceled(); };
- ctl.statuscb = [this](unsigned st, const std::string &s) {
- if (st < 100) update_status(int(st), s);
- };
-
- std::unique_ptr<TriangleMesh> omesh =
- sla::generate_interior(*m_object_mesh, m_cfg, ctl);
-
- if (omesh && !omesh->empty()) {
- m_output_mesh.reset(new TriangleMesh{*m_object_mesh});
- m_output_mesh->merge(*omesh);
- m_output_mesh->require_shared_vertices();
-
- update_status(90, _(L("Indexing hollowed object")));
-
- m_output_raycaster.reset(new MeshRaycaster(*m_output_mesh));
-
- update_status(100, was_canceled() ? _(L("Hollowing cancelled.")) :
- _(L("Hollowing done.")));
- } else {
- update_status(100, _(L("Hollowing failed.")));
- }
-}
-
-void Plater::priv::HollowJob::finalize()
-{
- if (auto gizmo = get_gizmo()) {
- gizmo->update_mesh_raycaster(std::move(m_output_raycaster));
- gizmo->update_hollowed_mesh(std::move(m_output_mesh));
- }
-}
-
-GLGizmoHollow *Plater::priv::HollowJob::get_gizmo()
-{
- const GLGizmosManager& gizmo_manager = plater().q->canvas3D()->get_gizmos_manager();
- auto ret = dynamic_cast<GLGizmoHollow*>(gizmo_manager.get_current());
- assert(ret);
- return ret;
-}
-
-const GLGizmoHollow *Plater::priv::HollowJob::get_gizmo() const
-{
- const GLGizmosManager& gizmo_manager = plater().q->canvas3D()->get_gizmos_manager();
- auto ret = dynamic_cast<const GLGizmoHollow*>(gizmo_manager.get_current());
- assert(ret);
- return ret;
-}
-
void Plater::priv::split_object()
{
int obj_idx = get_selected_object_idx();
@@ -3035,7 +2854,7 @@ void Plater::priv::split_object()
if (current_model_object->volumes.size() > 1)
{
- Slic3r::GUI::warning_catcher(q, _(L("The selected object can't be split because it contains more than one volume/material.")));
+ Slic3r::GUI::warning_catcher(q, _L("The selected object can't be split because it contains more than one volume/material."));
return;
}
@@ -3043,10 +2862,10 @@ void Plater::priv::split_object()
ModelObjectPtrs new_objects;
current_model_object->split(&new_objects);
if (new_objects.size() == 1)
- Slic3r::GUI::warning_catcher(q, _(L("The selected object couldn't be split because it contains only one part.")));
+ Slic3r::GUI::warning_catcher(q, _L("The selected object couldn't be split because it contains only one part."));
else
{
- Plater::TakeSnapshot snapshot(q, _(L("Split to Objects")));
+ Plater::TakeSnapshot snapshot(q, _L("Split to Objects"));
unsigned int counter = 1;
for (ModelObject* m : new_objects)
@@ -3120,10 +2939,12 @@ unsigned int Plater::priv::update_background_process(bool force_validation, bool
this->sidebar->show_sliced_info_sizer(false);
// Reset preview canvases. If the print has been invalidated, the preview canvases will be cleared.
// Otherwise they will be just refreshed.
- if (this->preview != nullptr)
+ if (this->preview != nullptr) {
// If the preview is not visible, the following line just invalidates the preview,
// but the G-code paths or SLA preview are calculated first once the preview is made visible.
+ reset_gcode_toolpaths();
this->preview->reload_print();
+ }
// In FDM mode, we need to reload the 3D scene because of the wipe tower preview box.
// In SLA mode, we need to reload the 3D scene every time to show the support structures.
if (this->printer_technology == ptSLA || (this->printer_technology == ptFFF && this->config->opt_bool("wipe_tower")))
@@ -3136,22 +2957,13 @@ unsigned int Plater::priv::update_background_process(bool force_validation, bool
// The state of the Print changed, and it is non-zero. Let's validate it and give the user feedback on errors.
std::string err = this->background_process.validate();
if (err.empty()) {
+ notification_manager->set_all_slicing_errors_gray(true);
if (invalidated != Print::APPLY_STATUS_UNCHANGED && this->background_processing_enabled())
return_state |= UPDATE_BACKGROUND_PROCESS_RESTART;
} else {
- // The print is not valid.
- // Only show the error message immediately, if the top level parent of this window is active.
- auto p = dynamic_cast<wxWindow*>(this->q);
- while (p->GetParent())
- p = p->GetParent();
- auto *top_level_wnd = dynamic_cast<wxTopLevelWindow*>(p);
- if (! postpone_error_messages && top_level_wnd && top_level_wnd->IsActive()) {
- // The error returned from the Print needs to be translated into the local language.
- GUI::show_error(this->q, err);
- } else {
- // Show the error message once the main window gets activated.
- this->delayed_error_message = err;
- }
+ // The print is not valid.
+ // Show error as notification.
+ notification_manager->push_slicing_error_notification(err);
return_state |= UPDATE_BACKGROUND_PROCESS_INVALID;
}
} else if (! this->delayed_error_message.empty()) {
@@ -3159,6 +2971,13 @@ unsigned int Plater::priv::update_background_process(bool force_validation, bool
return_state |= UPDATE_BACKGROUND_PROCESS_INVALID;
}
+ //actualizate warnings
+ if (invalidated != Print::APPLY_STATUS_UNCHANGED) {
+ actualize_slicing_warnings(*this->background_process.current_print());
+ show_warning_dialog = false;
+ process_completed_with_error = false;
+ }
+
if (invalidated != Print::APPLY_STATUS_UNCHANGED && was_running && ! this->background_process.running() &&
(return_state & UPDATE_BACKGROUND_PROCESS_RESTART) == 0) {
// The background processing was killed and it will not be restarted.
@@ -3171,22 +2990,23 @@ unsigned int Plater::priv::update_background_process(bool force_validation, bool
if ((return_state & UPDATE_BACKGROUND_PROCESS_INVALID) != 0)
{
// Validation of the background data failed.
- const wxString invalid_str = _(L("Invalid data"));
+ const wxString invalid_str = _L("Invalid data");
for (auto btn : {ActionButtonType::abReslice, ActionButtonType::abSendGCode, ActionButtonType::abExport})
sidebar->set_btn_label(btn, invalid_str);
+ process_completed_with_error = true;
}
else
{
// Background data is valid.
if ((return_state & UPDATE_BACKGROUND_PROCESS_RESTART) != 0 ||
(return_state & UPDATE_BACKGROUND_PROCESS_REFRESH_SCENE) != 0 )
- this->statusbar()->set_status_text(_(L("Ready to slice")));
+ this->statusbar()->set_status_text(_L("Ready to slice"));
sidebar->set_btn_label(ActionButtonType::abExport, _(label_btn_export));
sidebar->set_btn_label(ActionButtonType::abSendGCode, _(label_btn_send));
const wxString slice_string = background_process.running() && wxGetApp().get_mode() == comSimple ?
- _(L("Slicing")) + dots : _(L("Slice now"));
+ _L("Slicing") + dots : _L("Slice now");
sidebar->set_btn_label(ActionButtonType::abReslice, slice_string);
if (background_process.finished())
@@ -3218,9 +3038,11 @@ bool Plater::priv::restart_background_process(unsigned int state)
// The print is valid and it can be started.
if (this->background_process.start()) {
this->statusbar()->set_cancel_callback([this]() {
- this->statusbar()->set_status_text(_(L("Cancelling")));
+ this->statusbar()->set_status_text(_L("Cancelling"));
this->background_process.stop();
});
+ if (!show_warning_dialog)
+ on_slicing_began();
return true;
}
}
@@ -3235,7 +3057,7 @@ void Plater::priv::export_gcode(fs::path output_path, bool output_path_on_remova
return;
if (background_process.is_export_scheduled()) {
- GUI::show_error(q, _(L("Another export job is currently running.")));
+ GUI::show_error(q, _L("Another export job is currently running."));
return;
}
@@ -3247,6 +3069,7 @@ void Plater::priv::export_gcode(fs::path output_path, bool output_path_on_remova
if ((state & priv::UPDATE_BACKGROUND_PROCESS_INVALID) != 0)
return;
+ show_warning_dialog = true;
if (! output_path.empty()) {
background_process.schedule_export(output_path.string(), output_path_on_removable_media);
} else {
@@ -3290,7 +3113,7 @@ void Plater::priv::update_sla_scene()
void Plater::priv::reload_from_disk()
{
- Plater::TakeSnapshot snapshot(q, _(L("Reload from disk")));
+ Plater::TakeSnapshot snapshot(q, _L("Reload from disk"));
const Selection& selection = get_selection();
@@ -3351,7 +3174,7 @@ void Plater::priv::reload_from_disk()
{
// ask user to select the missing file
fs::path search = missing_input_paths.back();
- wxString title = _(L("Please select the file to reload"));
+ wxString title = _L("Please select the file to reload");
#if defined(__APPLE__)
title += " (" + from_u8(search.filename().string()) + ")";
#endif // __APPLE__
@@ -3386,7 +3209,7 @@ void Plater::priv::reload_from_disk()
}
else
{
- wxString message = _(L("It is not allowed to change the file to reload")) + " (" + from_u8(search.filename().string()) + ").\n" + _(L("Do you want to retry")) + " ?";
+ wxString message = _L("It is not allowed to change the file to reload") + " (" + from_u8(search.filename().string()) + ").\n" + _L("Do you want to retry") + " ?";
wxMessageDialog dlg(q, message, wxMessageBoxCaptionStr, wxYES_NO | wxYES_DEFAULT | wxICON_QUESTION);
if (dlg.ShowModal() != wxID_YES)
return;
@@ -3404,7 +3227,7 @@ void Plater::priv::reload_from_disk()
const auto& path = input_paths[i].string();
wxBusyCursor wait;
- wxBusyInfo info(_(L("Reload from:")) + " " + from_u8(path), q->get_current_canvas3D()->get_wxglcanvas());
+ wxBusyInfo info(_L("Reload from:") + " " + from_u8(path), q->get_current_canvas3D()->get_wxglcanvas());
Model new_model;
try
@@ -3483,9 +3306,13 @@ void Plater::priv::reload_from_disk()
new_volume->set_material_id(old_volume->material_id());
new_volume->set_transformation(old_volume->get_transformation() * old_volume->source.transform);
new_volume->translate(new_volume->get_transformation().get_matrix(true) * (new_volume->source.mesh_offset - old_volume->source.mesh_offset));
+ if (old_volume->source.is_converted_from_inches)
+ new_volume->convert_from_imperial_units();
std::swap(old_model_object->volumes[sel_v.volume_idx], old_model_object->volumes.back());
old_model_object->delete_volume(old_model_object->volumes.size() - 1);
old_model_object->ensure_on_bed();
+
+ sla::reproject_points_and_holes(old_model_object);
}
}
}
@@ -3493,12 +3320,12 @@ void Plater::priv::reload_from_disk()
if (!fail_list.empty())
{
- wxString message = _(L("Unable to reload:")) + "\n";
+ wxString message = _L("Unable to reload:") + "\n";
for (const wxString& s : fail_list)
{
message += s + "\n";
}
- wxMessageDialog dlg(q, message, _(L("Error during reload")), wxOK | wxOK_DEFAULT | wxICON_WARNING);
+ wxMessageDialog dlg(q, message, _L("Error during reload"), wxOK | wxOK_DEFAULT | wxICON_WARNING);
dlg.ShowModal();
}
@@ -3517,7 +3344,7 @@ void Plater::priv::reload_all_from_disk()
if (model.objects.empty())
return;
- Plater::TakeSnapshot snapshot(q, _(L("Reload all from disk")));
+ Plater::TakeSnapshot snapshot(q, _L("Reload all from disk"));
Plater::SuppressSnapshots suppress(q);
Selection& selection = get_selection();
@@ -3538,9 +3365,54 @@ void Plater::priv::fix_through_netfabb(const int obj_idx, const int vol_idx/* =
if (obj_idx < 0)
return;
- Plater::TakeSnapshot snapshot(q, _(L("Fix Throught NetFabb")));
+ // Do not fix anything when a gizmo is open. There might be issues with updates
+ // and what is worse, the snapshot time would refer to the internal stack.
+ if (q->canvas3D()->get_gizmos_manager().get_current_type() != GLGizmosManager::Undefined) {
+ notification_manager->push_notification(
+ NotificationType::CustomSupportsAndSeamRemovedAfterRepair,
+ NotificationManager::NotificationLevel::RegularNotification,
+ _u8L("ERROR: Please close all manipulators available from "
+ "the left toolbar before fixing the mesh."));
+ return;
+ }
+
+ // size_t snapshot_time = undo_redo_stack().active_snapshot_time();
+ Plater::TakeSnapshot snapshot(q, _L("Fix through NetFabb"));
+
+ ModelObject* mo = model.objects[obj_idx];
- fix_model_by_win10_sdk_gui(*model.objects[obj_idx], vol_idx);
+ // If there are custom supports/seams, remove them. Fixed mesh
+ // may be different and they would make no sense.
+ bool paint_removed = false;
+ for (ModelVolume* mv : mo->volumes) {
+ paint_removed |= ! mv->supported_facets.empty() || ! mv->seam_facets.empty();
+ mv->supported_facets.clear();
+ mv->seam_facets.clear();
+ }
+ if (paint_removed) {
+ // snapshot_time is captured by copy so the lambda knows where to undo/redo to.
+ notification_manager->push_notification(
+ NotificationType::CustomSupportsAndSeamRemovedAfterRepair,
+ NotificationManager::NotificationLevel::RegularNotification,
+ _u8L("Custom supports and seams were removed after repairing the mesh."));
+// _u8L("Undo the repair"),
+// [this, snapshot_time](wxEvtHandler*){
+// // Make sure the snapshot is still available and that
+// // we are in the main stack and not in a gizmo-stack.
+// if (undo_redo_stack().has_undo_snapshot(snapshot_time)
+// && q->canvas3D()->get_gizmos_manager().get_current() == nullptr)
+// undo_redo_to(snapshot_time);
+// else
+// notification_manager->push_notification(
+// NotificationType::CustomSupportsAndSeamRemovedAfterRepair,
+// NotificationManager::NotificationLevel::RegularNotification,
+// _u8L("Cannot undo to before the mesh repair!"));
+// return true;
+// });
+ }
+
+ fix_model_by_win10_sdk_gui(*mo, vol_idx);
+ sla::reproject_points_and_holes(mo);
this->update();
this->object_list_changed();
this->schedule_background_process();
@@ -3558,16 +3430,14 @@ void Plater::priv::set_current_panel(wxPanel* panel)
if (current_panel == panel)
return;
+ wxPanel* old_panel = current_panel;
current_panel = panel;
// to reduce flickering when changing view, first set as visible the new current panel
- for (wxPanel* p : panels)
- {
- if (p == current_panel)
- {
+ for (wxPanel* p : panels) {
+ if (p == current_panel) {
#ifdef __WXMAC__
// On Mac we need also to force a render to avoid flickering when changing view
- if (force_render)
- {
+ if (force_render) {
if (p == view3D)
dynamic_cast<View3D*>(p)->get_canvas3d()->render();
else if (p == preview)
@@ -3578,21 +3448,22 @@ void Plater::priv::set_current_panel(wxPanel* panel)
}
}
// then set to invisible the other
- for (wxPanel* p : panels)
- {
+ for (wxPanel* p : panels) {
if (p != current_panel)
p->Hide();
}
panel_sizer->Layout();
- if (current_panel == view3D)
- {
- if (view3D->is_reload_delayed())
- {
+ if (current_panel == view3D) {
+ if (old_panel == preview)
+ preview->get_canvas3d()->unbind_event_handlers();
+
+ view3D->get_canvas3d()->bind_event_handlers();
+
+ if (view3D->is_reload_delayed()) {
// Delayed loading of the 3D scene.
- if (this->printer_technology == ptSLA)
- {
+ if (this->printer_technology == ptSLA) {
// Update the SLAPrint from the current Model, so that the reload_scene()
// pulls the correct data.
this->update_restart_background_process(true, false);
@@ -3603,13 +3474,19 @@ void Plater::priv::set_current_panel(wxPanel* panel)
// sets the canvas as dirty to force a render at the 1st idle event (wxWidgets IsShownOnScreen() is buggy and cannot be used reliably)
view3D->set_as_dirty();
view_toolbar.select_item("3D");
+ if(notification_manager != nullptr)
+ notification_manager->set_in_preview(false);
}
- else if (current_panel == preview)
- {
+ else if (current_panel == preview) {
+ if (old_panel == view3D)
+ view3D->get_canvas3d()->unbind_event_handlers();
+
+ preview->get_canvas3d()->bind_event_handlers();
+
// see: Plater::priv::object_list_changed()
// FIXME: it may be better to have a single function making this check and let it be called wherever needed
bool export_in_progress = this->background_process.is_export_scheduled();
- bool model_fits = view3D->check_volumes_outside_state() != ModelInstance::PVS_Partly_Outside;
+ bool model_fits = view3D->check_volumes_outside_state() != ModelInstancePVS_Partly_Outside;
if (!model.objects.empty() && !export_in_progress && model_fits)
this->q->reslice();
// keeps current gcode preview, if any
@@ -3617,6 +3494,8 @@ void Plater::priv::set_current_panel(wxPanel* panel)
preview->set_as_dirty();
view_toolbar.select_item("Preview");
+ if (notification_manager != nullptr)
+ notification_manager->set_in_preview(true);
}
current_panel->SetFocusFromKbd();
@@ -3625,7 +3504,15 @@ void Plater::priv::set_current_panel(wxPanel* panel)
void Plater::priv::on_select_preset(wxCommandEvent &evt)
{
auto preset_type = static_cast<Preset::Type>(evt.GetInt());
- auto *combo = static_cast<PresetComboBox*>(evt.GetEventObject());
+ auto *combo = static_cast<PlaterPresetComboBox*>(evt.GetEventObject());
+
+ // see https://github.com/prusa3d/PrusaSlicer/issues/3889
+ // Under OSX: in case of use of a same names written in different case (like "ENDER" and "Ender"),
+ // m_presets_choice->GetSelection() will return first item, because search in PopupListCtrl is case-insensitive.
+ // So, use GetSelection() from event parameter
+ // But in this function we couldn't use evt.GetSelection(), because m_commandInt is used for preset_type
+ // Thus, get selection in this way:
+ int selection = combo->FindString(evt.GetString(), true);
auto idx = combo->get_extruder_idx();
@@ -3636,32 +3523,49 @@ void Plater::priv::on_select_preset(wxCommandEvent &evt)
//! instead of
//! combo->GetStringSelection().ToUTF8().data());
- const std::string preset_name = wxGetApp().preset_bundle->get_preset_name_by_alias(preset_type,
- Preset::remove_suffix_modified(combo->GetString(combo->GetSelection()).ToUTF8().data()));
+ std::string preset_name = wxGetApp().preset_bundle->get_preset_name_by_alias(preset_type,
+ Preset::remove_suffix_modified(combo->GetString(selection).ToUTF8().data()));
if (preset_type == Preset::TYPE_FILAMENT) {
wxGetApp().preset_bundle->set_filament_preset(idx, preset_name);
}
+ bool select_preset = !combo->selection_is_changed_according_to_physical_printers();
// TODO: ?
if (preset_type == Preset::TYPE_FILAMENT && sidebar->is_multifilament()) {
// Only update the plater UI for the 2nd and other filaments.
- wxGetApp().preset_bundle->update_plater_filament_ui(idx, combo);
+ combo->update();
}
- else {
+ else if (select_preset) {
+ if (preset_type == Preset::TYPE_PRINTER) {
+ PhysicalPrinterCollection& physical_printers = wxGetApp().preset_bundle->physical_printers;
+ if(combo->is_selected_physical_printer())
+ preset_name = physical_printers.get_selected_printer_preset_name();
+ else
+ physical_printers.unselect_printer();
+ }
wxWindowUpdateLocker noUpdates(sidebar->presets_panel());
wxGetApp().get_tab(preset_type)->select_preset(preset_name);
}
// update plater with new config
- wxGetApp().plater()->on_config_change(wxGetApp().preset_bundle->full_config());
+ q->on_config_change(wxGetApp().preset_bundle->full_config());
+ if (preset_type == Preset::TYPE_PRINTER) {
/* Settings list can be changed after printer preset changing, so
* update all settings items for all item had it.
* Furthermore, Layers editing is implemented only for FFF printers
* and for SLA presets they should be deleted
*/
- if (preset_type == Preset::TYPE_PRINTER)
wxGetApp().obj_list()->update_object_list_by_printer_technology();
+ }
+
+#ifdef __WXMSW__
+ // From the Win 2004 preset combobox lose a focus after change the preset selection
+ // and that is why the up/down arrow doesn't work properly
+ // (see https://github.com/prusa3d/PrusaSlicer/issues/5531 ).
+ // So, set the focus to the combobox explicitly
+ combo->SetFocus();
+#endif
}
void Plater::priv::on_slicing_update(SlicingStatusEvent &evt)
@@ -3674,6 +3578,7 @@ void Plater::priv::on_slicing_update(SlicingStatusEvent &evt)
this->statusbar()->set_progress(evt.status.percent);
this->statusbar()->set_status_text(_(evt.status.text) + wxString::FromUTF8("…"));
+ //notification_manager->set_progress_bar_percentage("Slicing progress", (float)evt.status.percent / 100.0f);
}
if (evt.status.flags & (PrintBase::SlicingStatus::RELOAD_SCENE | PrintBase::SlicingStatus::RELOAD_SLA_SUPPORT_POINTS)) {
switch (this->printer_technology) {
@@ -3693,10 +3598,38 @@ void Plater::priv::on_slicing_update(SlicingStatusEvent &evt)
// Update the SLA preview. Only called if not RELOAD_SLA_SUPPORT_POINTS, as the block above will refresh the preview anyways.
this->preview->reload_print();
}
+
+ if (evt.status.flags & (PrintBase::SlicingStatus::UPDATE_PRINT_STEP_WARNINGS | PrintBase::SlicingStatus::UPDATE_PRINT_OBJECT_STEP_WARNINGS)) {
+ // Update notification center with warnings of object_id and its warning_step.
+ ObjectID object_id = evt.status.warning_object_id;
+ int warning_step = evt.status.warning_step;
+ PrintStateBase::StateWithWarnings state;
+ if (evt.status.flags & PrintBase::SlicingStatus::UPDATE_PRINT_STEP_WARNINGS) {
+ state = this->printer_technology == ptFFF ?
+ this->fff_print.step_state_with_warnings(static_cast<PrintStep>(warning_step)) :
+ this->sla_print.step_state_with_warnings(static_cast<SLAPrintStep>(warning_step));
+ } else if (this->printer_technology == ptFFF) {
+ const PrintObject *print_object = this->fff_print.get_object(object_id);
+ if (print_object)
+ state = print_object->step_state_with_warnings(static_cast<PrintObjectStep>(warning_step));
+ } else {
+ const SLAPrintObject *print_object = this->sla_print.get_object(object_id);
+ if (print_object)
+ state = print_object->step_state_with_warnings(static_cast<SLAPrintObjectStep>(warning_step));
+ }
+ // Now process state.warnings.
+ for (auto const& warning : state.warnings) {
+ if (warning.current) {
+ notification_manager->push_slicing_warning_notification(warning.message, false, object_id, warning_step);
+ add_warning(warning, object_id.id);
+ }
+ }
+ }
}
-void Plater::priv::on_slicing_completed(wxCommandEvent &)
+void Plater::priv::on_slicing_completed(wxCommandEvent & evt)
{
+ notification_manager->push_slicing_complete_notification(evt.GetInt(), is_sidebar_collapsed());
switch (this->printer_technology) {
case ptFFF:
this->update_fff_scene();
@@ -3709,9 +3642,66 @@ void Plater::priv::on_slicing_completed(wxCommandEvent &)
break;
default: break;
}
+
+}
+void Plater::priv::on_export_began(wxCommandEvent& evt)
+{
+ if (show_warning_dialog)
+ warnings_dialog();
+}
+void Plater::priv::on_slicing_began()
+{
+ clear_warnings();
+ notification_manager->close_notification_of_type(NotificationType::SlicingComplete);
+}
+void Plater::priv::add_warning(const Slic3r::PrintStateBase::Warning& warning, size_t oid)
+{
+ for (auto const& it : current_warnings) {
+ if (warning.message_id == it.first.message_id) {
+ if (warning.message_id != 0 || (warning.message_id == 0 && warning.message == it.first.message))
+ return;
+ }
+ }
+ current_warnings.emplace_back(std::pair<Slic3r::PrintStateBase::Warning, size_t>(warning, oid));
}
+void Plater::priv::actualize_slicing_warnings(const PrintBase &print)
+{
+ std::vector<ObjectID> ids = print.print_object_ids();
+ if (ids.empty()) {
+ clear_warnings();
+ return;
+ }
+ ids.emplace_back(print.id());
+ std::sort(ids.begin(), ids.end());
+ notification_manager->remove_slicing_warnings_of_released_objects(ids);
+ notification_manager->set_all_slicing_warnings_gray(true);
+}
+void Plater::priv::clear_warnings()
+{
+ notification_manager->close_slicing_errors_and_warnings();
+ this->current_warnings.clear();
+}
+bool Plater::priv::warnings_dialog()
+{
+ if (current_warnings.empty())
+ return true;
+ std::string text = _u8L("There are active warnings concerning sliced models:") + "\n";
+ bool empt = true;
+ for (auto const& it : current_warnings) {
+ int next_n = it.first.message.find_first_of('\n', 0);
+ text += "\n";
+ if (next_n != std::string::npos)
+ text += it.first.message.substr(0, next_n);
+ else
+ text += it.first.message;
+ }
+ //text += "\n\nDo you still wish to export?";
+ wxMessageDialog msg_wingow(this->q, text, wxString(SLIC3R_APP_NAME " ") + _L("generated warnings"), wxOK);
+ const auto res = msg_wingow.ShowModal();
+ return res == wxID_OK;
-void Plater::priv::on_process_completed(wxCommandEvent &evt)
+}
+void Plater::priv::on_process_completed(SlicingProcessCompletedEvent &evt)
{
// Stop the background task, wait until the thread goes into the "Idle" state.
// At this point of time the thread should be either finished or canceled,
@@ -3720,28 +3710,35 @@ void Plater::priv::on_process_completed(wxCommandEvent &evt)
this->statusbar()->reset_cancel_callback();
this->statusbar()->stop_busy();
- const bool canceled = evt.GetInt() < 0;
- const bool error = evt.GetInt() == 0;
- const bool success = evt.GetInt() > 0;
// Reset the "export G-code path" name, so that the automatic background processing will be enabled again.
this->background_process.reset_export();
-
- if (error) {
- wxString message = evt.GetString();
- if (message.IsEmpty())
- message = _(L("Export failed"));
- if (q->m_tracking_popup_menu)
- // We don't want to pop-up a message box when tracking a pop-up menu.
- // We postpone the error message instead.
- q->m_tracking_popup_menu_error_message = message;
- else
- show_error(q, message);
- this->statusbar()->set_status_text(message);
+ // This bool stops showing export finished notification even when process_completed_with_error is false
+ bool has_error = false;
+ if (evt.error()) {
+ std::pair<std::string, bool> message = evt.format_error_message();
+ if (evt.critical_error()) {
+ if (q->m_tracking_popup_menu)
+ // We don't want to pop-up a message box when tracking a pop-up menu.
+ // We postpone the error message instead.
+ q->m_tracking_popup_menu_error_message = message.first;
+ else
+ show_error(q, message.first, message.second);
+ } else
+ notification_manager->push_slicing_error_notification(message.first);
+ this->statusbar()->set_status_text(from_u8(message.first));
+ if (evt.invalidate_plater())
+ {
+ const wxString invalid_str = _L("Invalid data");
+ for (auto btn : { ActionButtonType::abReslice, ActionButtonType::abSendGCode, ActionButtonType::abExport })
+ sidebar->set_btn_label(btn, invalid_str);
+ process_completed_with_error = true;
+ }
+ has_error = true;
}
- if (canceled)
- this->statusbar()->set_status_text(_(L("Cancelled")));
+ if (evt.cancelled())
+ this->statusbar()->set_status_text(_L("Cancelled"));
- this->sidebar->show_sliced_info_sizer(success);
+ this->sidebar->show_sliced_info_sizer(evt.success());
// This updates the "Slice now", "Export G-code", "Arrange" buttons status.
// Namely, it refreshes the "Out of print bed" property of all the ModelObjects, and it enables
@@ -3762,15 +3759,23 @@ void Plater::priv::on_process_completed(wxCommandEvent &evt)
default: break;
}
-
- if (canceled) {
+ if (evt.cancelled()) {
if (wxGetApp().get_mode() == comSimple)
sidebar->set_btn_label(ActionButtonType::abReslice, "Slice now");
show_action_buttons(true);
+ } else {
+ if(wxGetApp().get_mode() == comSimple) {
+ show_action_buttons(false);
+ }
+ // If writing to removable drive was scheduled, show notification with eject button
+ if (exporting_status == ExportingStatus::EXPORTING_TO_REMOVABLE && !has_error) {
+ show_action_buttons(false);
+ notification_manager->push_exporting_finished_notification(last_output_path, last_output_dir_path, true);
+ wxGetApp().removable_drive_manager()->set_exporting_finished(true);
+ }else if (exporting_status == ExportingStatus::EXPORTING_TO_LOCAL && !has_error)
+ notification_manager->push_exporting_finished_notification(last_output_path, last_output_dir_path, false);
}
- else if (this->writing_to_removable_device || wxGetApp().get_mode() == comSimple)
- show_action_buttons(false);
- this->writing_to_removable_device = false;
+ exporting_status = ExportingStatus::NOT_EXPORTING;
}
void Plater::priv::on_layer_editing_toggled(bool enable)
@@ -3798,12 +3803,11 @@ void Plater::priv::on_action_split_volumes(SimpleEvent&)
void Plater::priv::on_action_layersediting(SimpleEvent&)
{
view3D->enable_layers_editing(!view3D->is_layers_editing_enabled());
+ notification_manager->set_move_from_overlay(view3D->is_layers_editing_enabled());
}
void Plater::priv::on_object_select(SimpleEvent& evt)
{
-// this->take_snapshot(_(L("Object Selection")));
-
wxGetApp().obj_list()->update_selections();
selection_changed();
}
@@ -3830,6 +3834,8 @@ void Plater::priv::on_right_click(RBtnEvent& evt)
if (evt.data.second)
return;
+ int menu_item_convert_unit_position = 11;
+
if (printer_technology == ptSLA)
menu = &sla_object_menu;
else
@@ -3839,8 +3845,11 @@ void Plater::priv::on_right_click(RBtnEvent& evt)
get_selection().is_single_full_object() ||
get_selection().is_multiple_full_instance();
menu = is_some_full_instances ? &object_menu : &part_menu;
+ if (!is_some_full_instances)
+ menu_item_convert_unit_position = 2;
}
+ sidebar->obj_list()->append_menu_item_convert_unit(menu, menu_item_convert_unit_position);
sidebar->obj_list()->append_menu_item_settings(menu);
if (printer_technology != ptSLA)
@@ -3853,7 +3862,7 @@ void Plater::priv::on_right_click(RBtnEvent& evt)
*/
const MenuIdentifier id = printer_technology == ptSLA ? miObjectSLA : miObjectFFF;
if (wxGetApp().get_mode() == comSimple) {
- if (menu->FindItem(_(L("Add instance"))) != wxNOT_FOUND)
+ if (menu->FindItem(_L("Add instance")) != wxNOT_FOUND)
{
/* Detach an items from the menu, but don't delete them
* so that they can be added back later
@@ -3865,7 +3874,7 @@ void Plater::priv::on_right_click(RBtnEvent& evt)
}
}
else {
- if (menu->FindItem(_(L("Add instance"))) == wxNOT_FOUND)
+ if (menu->FindItem(_L("Add instance")) == wxNOT_FOUND)
{
// Prepend items to the menu, if those aren't not there
menu->Prepend(items_set_number_of_copies[id]);
@@ -3939,7 +3948,6 @@ bool Plater::priv::init_object_menu()
return true;
}
-#if ENABLE_THUMBNAIL_GENERATOR
void Plater::priv::generate_thumbnail(ThumbnailData& data, unsigned int w, unsigned int h, bool printable_only, bool parts_only, bool show_bed, bool transparent_background)
{
view3D->get_canvas3d()->render_thumbnail(data, w, h, printable_only, parts_only, show_bed, transparent_background);
@@ -3957,7 +3965,6 @@ void Plater::priv::generate_thumbnails(ThumbnailsList& thumbnails, const Vec2ds&
thumbnails.pop_back();
}
}
-#endif // ENABLE_THUMBNAIL_GENERATOR
void Plater::priv::msw_rescale_object_menu()
{
@@ -3996,21 +4003,23 @@ void Plater::priv::set_project_filename(const wxString& filename)
bool Plater::priv::init_common_menu(wxMenu* menu, const bool is_part/* = false*/)
{
if (is_part) {
- append_menu_item(menu, wxID_ANY, _(L("Delete")) + "\tDel", _(L("Remove the selected object")),
+ append_menu_item(menu, wxID_ANY, _L("Delete") + "\tDel", _L("Remove the selected object"),
[this](wxCommandEvent&) { q->remove_selected(); }, "delete", nullptr, [this]() { return can_delete(); }, q);
- append_menu_item(menu, wxID_ANY, _(L("Reload from disk")), _(L("Reload the selected volumes from disk")),
+ append_menu_item(menu, wxID_ANY, _L("Reload from disk"), _L("Reload the selected volumes from disk"),
[this](wxCommandEvent&) { q->reload_from_disk(); }, "", menu, [this]() { return can_reload_from_disk(); }, q);
sidebar->obj_list()->append_menu_item_export_stl(menu);
}
else {
- wxMenuItem* item_increase = append_menu_item(menu, wxID_ANY, _(L("Add instance")) + "\t+", _(L("Add one more instance of the selected object")),
+ wxMenuItem* item_increase = append_menu_item(menu, wxID_ANY, _L("Add instance") + "\t+", _L("Add one more instance of the selected object"),
[this](wxCommandEvent&) { q->increase_instances(); }, "add_copies", nullptr, [this]() { return can_increase_instances(); }, q);
- wxMenuItem* item_decrease = append_menu_item(menu, wxID_ANY, _(L("Remove instance")) + "\t-", _(L("Remove one instance of the selected object")),
+ wxMenuItem* item_decrease = append_menu_item(menu, wxID_ANY, _L("Remove instance") + "\t-", _L("Remove one instance of the selected object"),
[this](wxCommandEvent&) { q->decrease_instances(); }, "remove_copies", nullptr, [this]() { return can_decrease_instances(); }, q);
- wxMenuItem* item_set_number_of_copies = append_menu_item(menu, wxID_ANY, _(L("Set number of instances")) + dots, _(L("Change the number of instances of the selected object")),
+ wxMenuItem* item_set_number_of_copies = append_menu_item(menu, wxID_ANY, _L("Set number of instances") + dots, _L("Change the number of instances of the selected object"),
[this](wxCommandEvent&) { q->set_number_of_copies(); }, "number_of_copies", nullptr, [this]() { return can_increase_instances(); }, q);
+ append_menu_item(menu, wxID_ANY, _L("Fill bed with instances") + dots, _L("Fill the remaining area of bed with instances of the selected object"),
+ [this](wxCommandEvent&) { q->fill_bed_with_instances(); }, "", nullptr, [this]() { return can_increase_instances(); }, q);
items_increase.push_back(item_increase);
@@ -4018,7 +4027,7 @@ bool Plater::priv::init_common_menu(wxMenu* menu, const bool is_part/* = false*/
items_set_number_of_copies.push_back(item_set_number_of_copies);
// Delete menu was moved to be after +/- instace to make it more difficult to be selected by mistake.
- append_menu_item(menu, wxID_ANY, _(L("Delete")) + "\tDel", _(L("Remove the selected object")),
+ append_menu_item(menu, wxID_ANY, _L("Delete") + "\tDel", _L("Remove the selected object"),
[this](wxCommandEvent&) { q->remove_selected(); }, "delete", nullptr, [this]() { return can_delete(); }, q);
menu->AppendSeparator();
@@ -4028,10 +4037,10 @@ bool Plater::priv::init_common_menu(wxMenu* menu, const bool is_part/* = false*/
wxMenuItem* menu_item_printable = sidebar->obj_list()->append_menu_item_printable(menu, q);
menu->AppendSeparator();
- append_menu_item(menu, wxID_ANY, _(L("Reload from disk")), _(L("Reload the selected object from disk")),
+ append_menu_item(menu, wxID_ANY, _L("Reload from disk"), _L("Reload the selected object from disk"),
[this](wxCommandEvent&) { reload_from_disk(); }, "", nullptr, [this]() { return can_reload_from_disk(); }, q);
- append_menu_item(menu, wxID_ANY, _(L("Export as STL")) + dots, _(L("Export the selected object as STL file")),
+ append_menu_item(menu, wxID_ANY, _L("Export as STL") + dots, _L("Export the selected object as STL file"),
[this](wxCommandEvent&) { q->export_stl(false, true); }, "", nullptr,
[this]() {
const Selection& selection = get_selection();
@@ -4040,6 +4049,9 @@ bool Plater::priv::init_common_menu(wxMenu* menu, const bool is_part/* = false*/
menu->AppendSeparator();
+ // "Scale to print volume" makes a sense just for whole object
+ sidebar->obj_list()->append_menu_item_scale_selection_to_fit_print_volume(menu);
+
q->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) {
const Selection& selection = get_selection();
int instance_idx = selection.get_instance_idx();
@@ -4054,20 +4066,18 @@ bool Plater::priv::init_common_menu(wxMenu* menu, const bool is_part/* = false*/
sidebar->obj_list()->append_menu_item_fix_through_netfabb(menu);
- sidebar->obj_list()->append_menu_item_scale_selection_to_fit_print_volume(menu);
-
wxMenu* mirror_menu = new wxMenu();
if (mirror_menu == nullptr)
return false;
- append_menu_item(mirror_menu, wxID_ANY, _(L("Along X axis")), _(L("Mirror the selected object along the X axis")),
+ append_menu_item(mirror_menu, wxID_ANY, _L("Along X axis"), _L("Mirror the selected object along the X axis"),
[this](wxCommandEvent&) { mirror(X); }, "mark_X", menu);
- append_menu_item(mirror_menu, wxID_ANY, _(L("Along Y axis")), _(L("Mirror the selected object along the Y axis")),
+ append_menu_item(mirror_menu, wxID_ANY, _L("Along Y axis"), _L("Mirror the selected object along the Y axis"),
[this](wxCommandEvent&) { mirror(Y); }, "mark_Y", menu);
- append_menu_item(mirror_menu, wxID_ANY, _(L("Along Z axis")), _(L("Mirror the selected object along the Z axis")),
+ append_menu_item(mirror_menu, wxID_ANY, _L("Along Z axis"), _L("Mirror the selected object along the Z axis"),
[this](wxCommandEvent&) { mirror(Z); }, "mark_Z", menu);
- append_submenu(menu, mirror_menu, wxID_ANY, _(L("Mirror")), _(L("Mirror the selected object")), "",
+ append_submenu(menu, mirror_menu, wxID_ANY, _L("Mirror"), _L("Mirror the selected object"), "",
[this]() { return can_mirror(); }, q);
return true;
@@ -4079,12 +4089,12 @@ bool Plater::priv::complit_init_object_menu()
if (split_menu == nullptr)
return false;
- append_menu_item(split_menu, wxID_ANY, _(L("To objects")), _(L("Split the selected object into individual objects")),
+ append_menu_item(split_menu, wxID_ANY, _L("To objects"), _L("Split the selected object into individual objects"),
[this](wxCommandEvent&) { split_object(); }, "split_object_SMALL", &object_menu, [this]() { return can_split(); }, q);
- append_menu_item(split_menu, wxID_ANY, _(L("To parts")), _(L("Split the selected object into individual sub-parts")),
+ append_menu_item(split_menu, wxID_ANY, _L("To parts"), _L("Split the selected object into individual sub-parts"),
[this](wxCommandEvent&) { split_volume(); }, "split_parts_SMALL", &object_menu, [this]() { return can_split(); }, q);
- append_submenu(&object_menu, split_menu, wxID_ANY, _(L("Split")), _(L("Split the selected object")), "",
+ append_submenu(&object_menu, split_menu, wxID_ANY, _L("Split"), _L("Split the selected object"), "",
[this]() { return can_split() && wxGetApp().get_mode() > comSimple; }, q);
object_menu.AppendSeparator();
@@ -4099,21 +4109,25 @@ bool Plater::priv::complit_init_object_menu()
bool Plater::priv::complit_init_sla_object_menu()
{
- append_menu_item(&sla_object_menu, wxID_ANY, _(L("Split")), _(L("Split the selected object into individual objects")),
+ append_menu_item(&sla_object_menu, wxID_ANY, _L("Split"), _L("Split the selected object into individual objects"),
[this](wxCommandEvent&) { split_object(); }, "split_object_SMALL", nullptr, [this]() { return can_split(); }, q);
sla_object_menu.AppendSeparator();
// Add the automatic rotation sub-menu
- append_menu_item(&sla_object_menu, wxID_ANY, _(L("Optimize orientation")), _(L("Optimize the rotation of the object for better print results.")),
- [this](wxCommandEvent&) { sla_optimize_rotation(); });
+ append_menu_item(
+ &sla_object_menu, wxID_ANY, _(L("Optimize orientation")),
+ _(L("Optimize the rotation of the object for better print results.")),
+ [this](wxCommandEvent &) {
+ m_ui_jobs.optimize_rotation();
+ });
return true;
}
bool Plater::priv::complit_init_part_menu()
{
- append_menu_item(&part_menu, wxID_ANY, _(L("Split")), _(L("Split the selected object into individual sub-parts")),
+ append_menu_item(&part_menu, wxID_ANY, _L("Split"), _L("Split the selected object into individual sub-parts"),
[this](wxCommandEvent&) { split_volume(); }, "split_parts_SMALL", nullptr, [this]() { return can_split(); }, q);
part_menu.AppendSeparator();
@@ -4137,8 +4151,29 @@ GLCanvas3D* Plater::priv::get_current_canvas3D()
return (current_panel == view3D) ? view3D->get_canvas3d() : ((current_panel == preview) ? preview->get_canvas3d() : nullptr);
}
+void Plater::priv::unbind_canvas_event_handlers()
+{
+ if (view3D != nullptr)
+ view3D->get_canvas3d()->unbind_event_handlers();
+
+ if (preview != nullptr)
+ preview->get_canvas3d()->unbind_event_handlers();
+}
+
+void Plater::priv::reset_canvas_volumes()
+{
+ if (view3D != nullptr)
+ view3D->get_canvas3d()->reset_volumes();
+
+ if (preview != nullptr)
+ preview->get_canvas3d()->reset_volumes();
+}
+
bool Plater::priv::init_view_toolbar()
{
+ if (wxGetApp().is_gcode_viewer())
+ return true;
+
if (view_toolbar.get_items_count() > 0)
// already initialized
return true;
@@ -4182,6 +4217,70 @@ bool Plater::priv::init_view_toolbar()
return true;
}
+bool Plater::priv::init_collapse_toolbar()
+{
+ if (wxGetApp().is_gcode_viewer())
+ return true;
+
+ if (collapse_toolbar.get_items_count() > 0)
+ // already initialized
+ return true;
+
+ BackgroundTexture::Metadata background_data;
+ background_data.filename = "toolbar_background.png";
+ background_data.left = 16;
+ background_data.top = 16;
+ background_data.right = 16;
+ background_data.bottom = 16;
+
+ if (!collapse_toolbar.init(background_data))
+ return false;
+
+ collapse_toolbar.set_layout_type(GLToolbar::Layout::Vertical);
+ collapse_toolbar.set_horizontal_orientation(GLToolbar::Layout::HO_Right);
+ collapse_toolbar.set_vertical_orientation(GLToolbar::Layout::VO_Top);
+ collapse_toolbar.set_border(5.0f);
+ collapse_toolbar.set_separator_size(5);
+ collapse_toolbar.set_gap_size(2);
+
+ GLToolbarItem::Data item;
+
+ item.name = "collapse_sidebar";
+ item.icon_filename = "collapse.svg";
+ item.sprite_id = 0;
+ item.left.action_callback = []() {
+ wxGetApp().plater()->collapse_sidebar(!wxGetApp().plater()->is_sidebar_collapsed());
+ };
+
+ if (!collapse_toolbar.add_item(item))
+ return false;
+
+ // Now "collapse" sidebar to current state. This is done so the tooltip
+ // is updated before the toolbar is first used.
+ wxGetApp().plater()->collapse_sidebar(wxGetApp().plater()->is_sidebar_collapsed());
+ return true;
+}
+
+void Plater::priv::update_preview_bottom_toolbar()
+{
+ preview->update_bottom_toolbar();
+}
+
+void Plater::priv::update_preview_moves_slider()
+{
+ preview->update_moves_slider();
+}
+
+void Plater::priv::enable_preview_moves_slider(bool enable)
+{
+ preview->enable_moves_slider(enable);
+}
+
+void Plater::priv::reset_gcode_toolpaths()
+{
+ preview->get_canvas3d()->reset_gcode_toolpaths();
+}
+
bool Plater::priv::can_set_instance_to_object() const
{
const int obj_idx = get_selected_object_idx();
@@ -4256,11 +4355,10 @@ bool Plater::priv::can_reload_from_disk() const
return !paths.empty();
}
-void Plater::priv::set_bed_shape(const Pointfs& shape, const std::string& custom_texture, const std::string& custom_model)
+void Plater::priv::set_bed_shape(const Pointfs& shape, const std::string& custom_texture, const std::string& custom_model, bool force_as_custom)
{
- bool new_shape = bed.set_shape(shape, custom_texture, custom_model);
- if (new_shape)
- {
+ bool new_shape = bed.set_shape(shape, custom_texture, custom_model, force_as_custom);
+ if (new_shape) {
if (view3D) view3D->bed_shape_changed();
if (preview) preview->bed_shape_changed();
}
@@ -4336,8 +4434,10 @@ void Plater::priv::show_action_buttons(const bool ready_to_slice) const
this->ready_to_slice = ready_to_slice;
wxWindowUpdateLocker noUpdater(sidebar);
- const auto prin_host_opt = config->option<ConfigOptionString>("print_host");
- const bool send_gcode_shown = prin_host_opt != nullptr && !prin_host_opt->value.empty();
+
+ DynamicPrintConfig* selected_printer_config = wxGetApp().preset_bundle->physical_printers.get_selected_printer_config();
+ const auto print_host_opt = selected_printer_config ? selected_printer_config->option<ConfigOptionString>("print_host") : nullptr;
+ const bool send_gcode_shown = print_host_opt != nullptr && !print_host_opt->value.empty();
// when a background processing is ON, export_btn and/or send_btn are showing
if (wxGetApp().app_config->get("background_processing") == "1")
@@ -4346,8 +4446,8 @@ void Plater::priv::show_action_buttons(const bool ready_to_slice) const
if (sidebar->show_reslice(false) |
sidebar->show_export(true) |
sidebar->show_send(send_gcode_shown) |
- sidebar->show_export_removable(removable_media_status.has_removable_drives) |
- sidebar->show_disconnect(removable_media_status.has_eject))
+ sidebar->show_export_removable(removable_media_status.has_removable_drives))
+// sidebar->show_eject(removable_media_status.has_eject))
sidebar->Layout();
}
else
@@ -4358,8 +4458,8 @@ void Plater::priv::show_action_buttons(const bool ready_to_slice) const
if (sidebar->show_reslice(ready_to_slice) |
sidebar->show_export(!ready_to_slice) |
sidebar->show_send(send_gcode_shown && !ready_to_slice) |
- sidebar->show_export_removable(!ready_to_slice && removable_media_status.has_removable_drives) |
- sidebar->show_disconnect(!ready_to_slice && removable_media_status.has_eject))
+ sidebar->show_export_removable(!ready_to_slice && removable_media_status.has_removable_drives))
+// sidebar->show_eject(!ready_to_slice && removable_media_status.has_eject))
sidebar->Layout();
}
}
@@ -4468,8 +4568,8 @@ void Plater::priv::undo_redo_to(std::vector<UndoRedo::Snapshot>::const_iterator
if (printer_technology_changed) {
// Switching the printer technology when jumping forwards / backwards in time. Switch to the last active printer profile of the other type.
std::string s_pt = (it_snapshot->snapshot_data.printer_technology == ptFFF) ? "FFF" : "SLA";
- if (! wxGetApp().check_unsaved_changes(from_u8((boost::format(_utf8(
- L("%1% printer was active at the time the target Undo / Redo snapshot was taken. Switching to %1% printer requires reloading of %1% presets."))) % s_pt).str())))
+ if (! wxGetApp().check_unsaved_changes(format_wxstr(_L(
+ "%1% printer was active at the time the target Undo / Redo snapshot was taken. Switching to %1% printer requires reloading of %1% presets."), s_pt)))
// Don't switch the profiles.
return;
}
@@ -4594,6 +4694,34 @@ void Plater::priv::update_after_undo_redo(const UndoRedo::Snapshot& snapshot, bo
BOOST_LOG_TRIVIAL(info) << "Undo / Redo snapshot reloaded. Undo / Redo stack memory: " << Slic3r::format_memsize_MB(this->undo_redo_stack().memsize()) << log_memory_info();
}
+void Plater::priv::bring_instance_forward() const
+{
+#ifdef __APPLE__
+ wxGetApp().other_instance_message_handler()->bring_instance_forward();
+ return;
+#endif //__APPLE__
+ if (main_frame == nullptr) {
+ BOOST_LOG_TRIVIAL(debug) << "Couldnt bring instance forward - mainframe is null";
+ return;
+ }
+ BOOST_LOG_TRIVIAL(debug) << "prusaslicer window going forward";
+ //this code maximize app window on Fedora
+ {
+ main_frame->Iconize(false);
+ if (main_frame->IsMaximized())
+ main_frame->Maximize(true);
+ else
+ main_frame->Maximize(false);
+ }
+ //this code maximize window on Ubuntu
+ {
+ main_frame->Restore();
+ wxGetApp().GetTopWindow()->SetFocus(); // focus on my window
+ wxGetApp().GetTopWindow()->Raise(); // bring window to front
+ wxGetApp().GetTopWindow()->Show(true); // show the window
+ }
+}
+
void Sidebar::set_btn_label(const ActionButtonType btn_type, const wxString& label) const
{
switch (btn_type)
@@ -4607,7 +4735,8 @@ void Sidebar::set_btn_label(const ActionButtonType btn_type, const wxString& lab
// Plater / Public
Plater::Plater(wxWindow *parent, MainFrame *main_frame)
- : wxPanel(parent), p(new priv(this, main_frame))
+ : wxPanel(parent, wxID_ANY, wxDefaultPosition, wxGetApp().get_min_size())
+ , p(new priv(this, main_frame))
{
// Initialization performed in the private c-tor
}
@@ -4644,7 +4773,7 @@ void Plater::load_project(const wxString& filename)
return;
// Take the Undo / Redo snapshot.
- Plater::TakeSnapshot snapshot(this, _(L("Load Project")) + ": " + wxString::FromUTF8(into_path(filename).stem().string().c_str()));
+ Plater::TakeSnapshot snapshot(this, _L("Load Project") + ": " + wxString::FromUTF8(into_path(filename).stem().string().c_str()));
p->reset();
@@ -4658,7 +4787,7 @@ void Plater::load_project(const wxString& filename)
p->set_project_filename(filename);
}
-void Plater::add_model()
+void Plater::add_model(bool imperial_units/* = false*/)
{
wxArrayString input_files;
wxGetApp().import_model(this, input_files);
@@ -4672,11 +4801,11 @@ void Plater::add_model()
wxString snapshot_label;
assert(! paths.empty());
if (paths.size() == 1) {
- snapshot_label = _(L("Import Object"));
+ snapshot_label = _L("Import Object");
snapshot_label += ": ";
snapshot_label += wxString::FromUTF8(paths.front().filename().string().c_str());
} else {
- snapshot_label = _(L("Import Objects"));
+ snapshot_label = _L("Import Objects");
snapshot_label += ": ";
snapshot_label += wxString::FromUTF8(paths.front().filename().string().c_str());
for (size_t i = 1; i < paths.size(); ++ i) {
@@ -4686,7 +4815,12 @@ void Plater::add_model()
}
Plater::TakeSnapshot snapshot(this, snapshot_label);
- load_files(paths, true, false);
+ load_files(paths, true, false, imperial_units);
+}
+
+void Plater::import_sl1_archive()
+{
+ p->m_ui_jobs.import_sla_arch();
}
void Plater::extract_config_from_project()
@@ -4702,23 +4836,256 @@ void Plater::extract_config_from_project()
load_files(input_paths, false, true);
}
-std::vector<size_t> Plater::load_files(const std::vector<fs::path>& input_files, bool load_model, bool load_config) { return p->load_files(input_files, load_model, load_config); }
+void Plater::load_gcode()
+{
+ // Ask user for a gcode file name.
+ wxString input_file;
+ wxGetApp().load_gcode(this, input_file);
+ // And finally load the gcode file.
+ load_gcode(input_file);
+}
+
+void Plater::load_gcode(const wxString& filename)
+{
+ if (! is_gcode_file(into_u8(filename)) || m_last_loaded_gcode == filename)
+ return;
+
+ m_last_loaded_gcode = filename;
+
+ // cleanup view before to start loading/processing
+ p->gcode_result.reset();
+ reset_gcode_toolpaths();
+ p->preview->reload_print(false);
+ p->get_current_canvas3D()->render();
+
+ wxBusyCursor wait;
+
+ // process gcode
+ GCodeProcessor processor;
+ processor.enable_producers(true);
+ processor.process_file(filename.ToUTF8().data(), false);
+ p->gcode_result = std::move(processor.extract_result());
+
+ // show results
+ p->preview->reload_print(false);
+ p->preview->get_canvas3d()->zoom_to_gcode();
+
+ if (p->preview->get_canvas3d()->get_gcode_layers_zs().empty()) {
+ wxMessageDialog(this, _L("The selected file") + ":\n" + filename + "\n" + _L("does not contain valid gcode."),
+ wxString(GCODEVIEWER_APP_NAME) + " - " + _L("Error while loading .gcode file"), wxCLOSE | wxICON_WARNING | wxCENTRE).ShowModal();
+ set_project_filename(wxEmptyString);
+ }
+ else
+ set_project_filename(filename);
+}
+
+void Plater::reload_gcode_from_disk()
+{
+ wxString filename(m_last_loaded_gcode);
+ m_last_loaded_gcode.clear();
+ load_gcode(filename);
+}
+
+void Plater::refresh_print()
+{
+ p->preview->refresh_print();
+}
+
+std::vector<size_t> Plater::load_files(const std::vector<fs::path>& input_files, bool load_model, bool load_config, bool imperial_units /*= false*/) { return p->load_files(input_files, load_model, load_config, imperial_units); }
// To be called when providing a list of files to the GUI slic3r on command line.
-std::vector<size_t> Plater::load_files(const std::vector<std::string>& input_files, bool load_model, bool load_config)
+std::vector<size_t> Plater::load_files(const std::vector<std::string>& input_files, bool load_model, bool load_config, bool imperial_units /*= false*/)
{
std::vector<fs::path> paths;
paths.reserve(input_files.size());
for (const std::string& path : input_files)
paths.emplace_back(path);
- return p->load_files(paths, load_model, load_config);
+ return p->load_files(paths, load_model, load_config, imperial_units);
+}
+
+#if ENABLE_DRAG_AND_DROP_FIX
+enum class LoadType : unsigned char
+{
+ Unknown,
+ OpenProject,
+ LoadGeometry,
+ LoadConfig
+};
+
+class ProjectDropDialog : public DPIDialog
+{
+ wxRadioBox* m_action{ nullptr };
+public:
+ ProjectDropDialog(const std::string& filename);
+
+ int get_action() const { return m_action->GetSelection() + 1; }
+
+protected:
+ void on_dpi_changed(const wxRect& suggested_rect) override;
+};
+
+ProjectDropDialog::ProjectDropDialog(const std::string& filename)
+ : DPIDialog(static_cast<wxWindow*>(wxGetApp().mainframe), wxID_ANY,
+ from_u8((boost::format(_utf8(L("%s - Drop project file"))) % SLIC3R_APP_NAME).str()), wxDefaultPosition,
+ wxDefaultSize, wxDEFAULT_DIALOG_STYLE)
+{
+ SetFont(wxGetApp().normal_font());
+
+ wxBoxSizer* main_sizer = new wxBoxSizer(wxVERTICAL);
+
+ const wxString choices[] = { _L("Open as project"),
+ _L("Import geometry only"),
+ _L("Import config only") };
+
+ main_sizer->Add(new wxStaticText(this, wxID_ANY,
+ _L("Select an action to apply to the file") + ": " + from_u8(filename)), 0, wxEXPAND | wxALL, 10);
+ m_action = new wxRadioBox(this, wxID_ANY, _L("Action"), wxDefaultPosition, wxDefaultSize,
+ WXSIZEOF(choices), choices, 0, wxRA_SPECIFY_ROWS);
+ int action = std::clamp(std::stoi(wxGetApp().app_config->get("drop_project_action")),
+ static_cast<int>(LoadType::OpenProject), static_cast<int>(LoadType::LoadConfig)) - 1;
+ m_action->SetSelection(action);
+ main_sizer->Add(m_action, 1, wxEXPAND | wxRIGHT | wxLEFT, 10);
+
+ wxBoxSizer* bottom_sizer = new wxBoxSizer(wxHORIZONTAL);
+ wxCheckBox* check = new wxCheckBox(this, wxID_ANY, _L("Don't show again"));
+ check->Bind(wxEVT_CHECKBOX, [this](wxCommandEvent& evt) {
+ wxGetApp().app_config->set("show_drop_project_dialog", evt.IsChecked() ? "0" : "1");
+ });
+
+ bottom_sizer->Add(check, 0, wxEXPAND | wxRIGHT, 5);
+ bottom_sizer->Add(CreateStdDialogButtonSizer(wxOK | wxCANCEL), 0, wxEXPAND | wxLEFT, 5);
+ main_sizer->Add(bottom_sizer, 0, wxEXPAND | wxALL, 10);
+
+ SetSizer(main_sizer);
+ main_sizer->SetSizeHints(this);
+}
+
+void ProjectDropDialog::on_dpi_changed(const wxRect& suggested_rect)
+{
+ const int em = em_unit();
+ SetMinSize(wxSize(65 * em, 30 * em));
+ Fit();
+ Refresh();
+}
+
+bool Plater::load_files(const wxArrayString& filenames)
+{
+ const std::regex pattern_drop(".*[.](stl|obj|amf|3mf|prusa)", std::regex::icase);
+ const std::regex pattern_gcode_drop(".*[.](gcode|g)", std::regex::icase);
+
+ std::vector<fs::path> paths;
+
+ // gcode viewer section
+ if (wxGetApp().is_gcode_viewer()) {
+ for (const auto& filename : filenames) {
+ fs::path path(into_path(filename));
+ if (std::regex_match(path.string(), pattern_gcode_drop))
+ paths.push_back(std::move(path));
+ }
+
+ if (paths.size() > 1) {
+ wxMessageDialog(static_cast<wxWindow*>(this), _L("You can open only one .gcode file at a time."),
+ wxString(SLIC3R_APP_NAME) + " - " + _L("Drag and drop G-code file"), wxCLOSE | wxICON_WARNING | wxCENTRE).ShowModal();
+ return false;
+ }
+ else if (paths.size() == 1) {
+ load_gcode(from_path(paths.front()));
+ return true;
+ }
+ return false;
+ }
+
+ // editor section
+ for (const auto& filename : filenames) {
+ fs::path path(into_path(filename));
+ if (std::regex_match(path.string(), pattern_drop))
+ paths.push_back(std::move(path));
+ else if (std::regex_match(path.string(), pattern_gcode_drop))
+ start_new_gcodeviewer(&filename);
+ else
+ continue;
+ }
+ if (paths.empty())
+ // Likely all paths processed were gcodes, for which a G-code viewer instance has hopefully been started.
+ return false;
+
+ // searches for project files
+ for (std::vector<fs::path>::const_reverse_iterator it = paths.rbegin(); it != paths.rend(); ++it) {
+ std::string filename = (*it).filename().string();
+ if (boost::algorithm::iends_with(filename, ".3mf") || boost::algorithm::iends_with(filename, ".amf")) {
+ LoadType load_type = LoadType::Unknown;
+ if (!model().objects.empty()) {
+ if (wxGetApp().app_config->get("show_drop_project_dialog") == "1") {
+ ProjectDropDialog dlg(filename);
+ if (dlg.ShowModal() == wxID_OK) {
+ int choice = dlg.get_action();
+ load_type = static_cast<LoadType>(choice);
+ wxGetApp().app_config->set("drop_project_action", std::to_string(choice));
+ }
+ }
+ else
+ load_type = static_cast<LoadType>(std::clamp(std::stoi(wxGetApp().app_config->get("drop_project_action")),
+ static_cast<int>(LoadType::OpenProject), static_cast<int>(LoadType::LoadConfig)));
+ }
+ else
+ load_type = LoadType::OpenProject;
+
+ if (load_type == LoadType::Unknown)
+ return false;
+
+ switch (load_type) {
+ case LoadType::OpenProject: {
+ load_project(from_path(*it));
+ break;
+ }
+ case LoadType::LoadGeometry: {
+ Plater::TakeSnapshot snapshot(this, _L("Import Object"));
+ std::vector<fs::path> in_paths;
+ in_paths.emplace_back(*it);
+ load_files(in_paths, true, false);
+ break;
+ }
+ case LoadType::LoadConfig: {
+ std::vector<fs::path> in_paths;
+ in_paths.emplace_back(*it);
+ load_files(in_paths, false, true);
+ break;
+ }
+ }
+
+ return true;
+ }
+ }
+
+ // other files
+ wxString snapshot_label;
+ assert(!paths.empty());
+ if (paths.size() == 1) {
+ snapshot_label = _L("Load File");
+ snapshot_label += ": ";
+ snapshot_label += wxString::FromUTF8(paths.front().filename().string().c_str());
+ }
+ else {
+ snapshot_label = _L("Load Files");
+ snapshot_label += ": ";
+ snapshot_label += wxString::FromUTF8(paths.front().filename().string().c_str());
+ for (size_t i = 1; i < paths.size(); ++i) {
+ snapshot_label += ", ";
+ snapshot_label += wxString::FromUTF8(paths[i].filename().string().c_str());
+ }
+ }
+ Plater::TakeSnapshot snapshot(this, snapshot_label);
+ load_files(paths);
+
+ return true;
}
+#endif // ENABLE_DRAG_AND_DROP_FIX
void Plater::update() { p->update(); }
void Plater::stop_jobs() { p->m_ui_jobs.stop_all(); }
-void Plater::update_ui_from_settings() { p->update_ui_from_settings(); }
+void Plater::update_ui_from_settings(bool apply_free_camera_correction) { p->update_ui_from_settings(apply_free_camera_correction); }
void Plater::select_view(const std::string& direction) { p->select_view(direction); }
@@ -4731,6 +5098,11 @@ bool Plater::is_view3D_shown() const { return p->is_view3D_shown(); }
bool Plater::are_view3D_labels_shown() const { return p->are_view3D_labels_shown(); }
void Plater::show_view3D_labels(bool show) { p->show_view3D_labels(show); }
+bool Plater::is_sidebar_collapsed() const { return p->is_sidebar_collapsed(); }
+void Plater::collapse_sidebar(bool show) { p->collapse_sidebar(show); }
+
+bool Plater::is_view3D_layers_editing_enabled() const { return p->is_view3D_layers_editing_enabled(); }
+
void Plater::select_all() { p->select_all(); }
void Plater::deselect_all() { p->deselect_all(); }
@@ -4738,7 +5110,7 @@ void Plater::remove(size_t obj_idx) { p->remove(obj_idx); }
void Plater::reset() { p->reset(); }
void Plater::reset_with_confirm()
{
- if (wxMessageDialog((wxWindow*)this, _(L("All objects will be removed, continue?")), wxString(SLIC3R_APP_NAME) + " - " + _(L("Delete all")), wxYES_NO | wxCANCEL | wxYES_DEFAULT | wxCENTRE).ShowModal() == wxID_YES)
+ if (wxMessageDialog(static_cast<wxWindow*>(this), _L("All objects will be removed, continue?"), wxString(SLIC3R_APP_NAME) + " - " + _L("Delete all"), wxYES_NO | wxCANCEL | wxYES_DEFAULT | wxCENTRE).ShowModal() == wxID_YES)
reset();
}
@@ -4746,7 +5118,7 @@ void Plater::delete_object_from_model(size_t obj_idx) { p->delete_object_from_mo
void Plater::remove_selected()
{
- Plater::TakeSnapshot snapshot(this, _(L("Delete Selected Objects")));
+ Plater::TakeSnapshot snapshot(this, _L("Delete Selected Objects"));
this->p->view3D->delete_selected();
}
@@ -4754,7 +5126,7 @@ void Plater::increase_instances(size_t num)
{
if (! can_increase_instances()) { return; }
- Plater::TakeSnapshot snapshot(this, _(L("Increase Instances")));
+ Plater::TakeSnapshot snapshot(this, _L("Increase Instances"));
int obj_idx = p->get_selected_object_idx();
@@ -4771,17 +5143,16 @@ void Plater::increase_instances(size_t num)
// p->print.get_object(obj_idx)->add_copy(Slic3r::to_2d(offset_vec));
}
- sidebar().obj_list()->increase_object_instances(obj_idx, was_one_instance ? num + 1 : num);
-
if (p->get_config("autocenter") == "1")
- p->arrange();
+ arrange();
p->update();
p->get_selection().add_instance(obj_idx, (int)model_object->instances.size() - 1);
- p->selection_changed();
+ sidebar().obj_list()->increase_object_instances(obj_idx, was_one_instance ? num + 1 : num);
+ p->selection_changed();
this->p->schedule_background_process();
}
@@ -4789,7 +5160,7 @@ void Plater::decrease_instances(size_t num)
{
if (! can_decrease_instances()) { return; }
- Plater::TakeSnapshot snapshot(this, _(L("Decrease Instances")));
+ Plater::TakeSnapshot snapshot(this, _L("Decrease Instances"));
int obj_idx = p->get_selected_object_idx();
@@ -4820,12 +5191,12 @@ void Plater::set_number_of_copies(/*size_t num*/)
ModelObject* model_object = p->model.objects[obj_idx];
- const int num = wxGetNumberFromUser( " ", _(L("Enter the number of copies:")),
- _(L("Copies of the selected object")), model_object->instances.size(), 0, 1000, this );
+ const int num = wxGetNumberFromUser( " ", _L("Enter the number of copies:"),
+ _L("Copies of the selected object"), model_object->instances.size(), 0, 1000, this );
if (num < 0)
return;
- Plater::TakeSnapshot snapshot(this, wxString::Format(_(L("Set numbers of copies to %d")), num));
+ Plater::TakeSnapshot snapshot(this, wxString::Format(_L("Set numbers of copies to %d"), num));
int diff = num - (int)model_object->instances.size();
if (diff > 0)
@@ -4834,6 +5205,11 @@ void Plater::set_number_of_copies(/*size_t num*/)
decrease_instances(-diff);
}
+void Plater::fill_bed_with_instances()
+{
+ p->m_ui_jobs.fill_bed();
+}
+
bool Plater::is_selection_empty() const
{
return p->get_selection().is_empty() || p->get_selection().is_wipe_tower();
@@ -4844,6 +5220,37 @@ void Plater::scale_selection_to_fit_print_volume()
p->scale_selection_to_fit_print_volume();
}
+void Plater::convert_unit(bool from_imperial_unit)
+{
+ std::vector<int> obj_idxs, volume_idxs;
+ wxGetApp().obj_list()->get_selection_indexes(obj_idxs, volume_idxs);
+ if (obj_idxs.empty() && volume_idxs.empty())
+ return;
+
+ TakeSnapshot snapshot(this, from_imperial_unit ? _L("Convert from imperial units") : _L("Revert conversion from imperial units"));
+ wxBusyCursor wait;
+
+ ModelObjectPtrs objects;
+ for (int obj_idx : obj_idxs) {
+ ModelObject *object = p->model.objects[obj_idx];
+ object->convert_units(objects, from_imperial_unit, volume_idxs);
+ remove(obj_idx);
+ }
+ p->load_model_objects(objects);
+
+ Selection& selection = p->view3D->get_canvas3d()->get_selection();
+ size_t last_obj_idx = p->model.objects.size() - 1;
+
+ if (volume_idxs.empty()) {
+ for (size_t i = 0; i < objects.size(); ++i)
+ selection.add_object((unsigned int)(last_obj_idx - i), i == 0);
+ }
+ else {
+ for (int vol_idx : volume_idxs)
+ selection.add_volume(last_obj_idx, vol_idx, 0, false);
+ }
+}
+
void Plater::cut(size_t obj_idx, size_t instance_idx, coordf_t z, bool keep_upper, bool keep_lower, bool rotate_lower)
{
wxCHECK_RET(obj_idx < p->model.objects.size(), "obj_idx out of bounds");
@@ -4855,7 +5262,7 @@ void Plater::cut(size_t obj_idx, size_t instance_idx, coordf_t z, bool keep_uppe
return;
}
- Plater::TakeSnapshot snapshot(this, _(L("Cut by Plane")));
+ Plater::TakeSnapshot snapshot(this, _L("Cut by Plane"));
wxBusyCursor wait;
const auto new_objects = object->cut(instance_idx, z, keep_upper, keep_lower, rotate_lower);
@@ -4876,6 +5283,9 @@ void Plater::export_gcode(bool prefer_removable)
if (p->model.objects.empty())
return;
+ if (p->process_completed_with_error)
+ return;
+
// If possible, remove accents from accented latin characters.
// This function is useful for generating file names to be processed by legacy firmwares.
fs::path default_output_file;
@@ -4886,9 +5296,12 @@ void Plater::export_gcode(bool prefer_removable)
if (state & priv::UPDATE_BACKGROUND_PROCESS_INVALID)
return;
default_output_file = this->p->background_process.output_filepath_for_project(into_path(get_project_filename(".3mf")));
- }
- catch (const std::exception &ex) {
- show_error(this, ex.what());
+ } catch (const Slic3r::PlaceholderParserError &ex) {
+ // Show the error with monospaced font.
+ show_error(this, ex.what(), true);
+ return;
+ } catch (const std::exception &ex) {
+ show_error(this, ex.what(), false);
return;
}
default_output_file = fs::path(Slic3r::fold_utf8_to_ascii(default_output_file.string()));
@@ -4906,7 +5319,7 @@ void Plater::export_gcode(bool prefer_removable)
fs::path output_path;
{
- wxFileDialog dlg(this, (printer_technology() == ptFFF) ? _(L("Save G-code file as:")) : _(L("Save SL1 file as:")),
+ wxFileDialog dlg(this, (printer_technology() == ptFFF) ? _L("Save G-code file as:") : _L("Save SL1 file as:"),
start_dir,
from_path(default_output_file.filename()),
GUI::file_wildcards((printer_technology() == ptFFF) ? FT_GCODE : FT_PNGZIP, default_output_file.extension().string()),
@@ -4918,12 +5331,16 @@ void Plater::export_gcode(bool prefer_removable)
if (! output_path.empty()) {
bool path_on_removable_media = removable_drive_manager.set_and_verify_last_save_path(output_path.string());
+ p->notification_manager->new_export_began(path_on_removable_media);
+ p->exporting_status = path_on_removable_media ? ExportingStatus::EXPORTING_TO_REMOVABLE : ExportingStatus::EXPORTING_TO_LOCAL;
+ p->last_output_path = output_path.string();
+ p->last_output_dir_path = output_path.parent_path().string();
p->export_gcode(output_path, path_on_removable_media, PrintHostJob());
// Storing a path to AppConfig either as path to removable media or a path to internal media.
// is_path_on_removable_drive() is called with the "true" parameter to update its internal database as the user may have shuffled the external drives
// while the dialog was open.
appconfig.update_last_output_dir(output_path.parent_path().string(), path_on_removable_media);
- p->writing_to_removable_device = path_on_removable_media;
+
}
}
@@ -5013,25 +5430,33 @@ void Plater::export_stl(bool extended, bool selection_only)
? Transform3d::Identity()
: object->model_object()->instances[instance_idx]->get_transformation().get_matrix();
+ TriangleMesh inst_mesh;
+
if (has_pad_mesh)
{
TriangleMesh inst_pad_mesh = pad_mesh;
inst_pad_mesh.transform(inst_transform, is_left_handed);
- mesh.merge(inst_pad_mesh);
+ inst_mesh.merge(inst_pad_mesh);
}
if (has_supports_mesh)
{
TriangleMesh inst_supports_mesh = supports_mesh;
inst_supports_mesh.transform(inst_transform, is_left_handed);
- mesh.merge(inst_supports_mesh);
+ inst_mesh.merge(inst_supports_mesh);
}
TriangleMesh inst_object_mesh = object->get_mesh_to_print();
inst_object_mesh.transform(mesh_trafo_inv);
inst_object_mesh.transform(inst_transform, is_left_handed);
- mesh.merge(inst_object_mesh);
+ inst_mesh.merge(inst_object_mesh);
+
+ // ensure that the instance lays on the bed
+ inst_mesh.translate(0.0f, 0.0f, -inst_mesh.bounding_box().min[2]);
+
+ // merge instance with global mesh
+ mesh.merge(inst_mesh);
if (one_inst_only)
break;
@@ -5041,7 +5466,7 @@ void Plater::export_stl(bool extended, bool selection_only)
}
Slic3r::store_stl(path_u8.c_str(), &mesh, true);
- p->statusbar()->set_status_text(from_u8((boost::format(_utf8(L("STL file exported to %s"))) % path).str()));
+ p->statusbar()->set_status_text(format_wxstr(_L("STL file exported to %s"), path));
}
void Plater::export_amf()
@@ -5058,10 +5483,10 @@ void Plater::export_amf()
bool full_pathnames = wxGetApp().app_config->get("export_sources_full_pathnames") == "1";
if (Slic3r::store_amf(path_u8.c_str(), &p->model, export_config ? &cfg : nullptr, full_pathnames)) {
// Success
- p->statusbar()->set_status_text(from_u8((boost::format(_utf8(L("AMF file exported to %s"))) % path).str()));
+ p->statusbar()->set_status_text(format_wxstr(_L("AMF file exported to %s"), path));
} else {
// Failure
- p->statusbar()->set_status_text(from_u8((boost::format(_utf8(L("Error exporting AMF file %s"))) % path).str()));
+ p->statusbar()->set_status_text(format_wxstr(_L("Error exporting AMF file %s"), path));
}
}
@@ -5086,20 +5511,16 @@ void Plater::export_3mf(const boost::filesystem::path& output_path)
const std::string path_u8 = into_u8(path);
wxBusyCursor wait;
bool full_pathnames = wxGetApp().app_config->get("export_sources_full_pathnames") == "1";
-#if ENABLE_THUMBNAIL_GENERATOR
ThumbnailData thumbnail_data;
p->generate_thumbnail(thumbnail_data, THUMBNAIL_SIZE_3MF.first, THUMBNAIL_SIZE_3MF.second, false, true, true, true);
if (Slic3r::store_3mf(path_u8.c_str(), &p->model, export_config ? &cfg : nullptr, full_pathnames, &thumbnail_data)) {
-#else
- if (Slic3r::store_3mf(path_u8.c_str(), &p->model, export_config ? &cfg : nullptr, full_pathnames)) {
-#endif // ENABLE_THUMBNAIL_GENERATOR
// Success
- p->statusbar()->set_status_text(from_u8((boost::format(_utf8(L("3MF file exported to %s"))) % path).str()));
+ p->statusbar()->set_status_text(format_wxstr(_L("3MF file exported to %s"), path));
p->set_project_filename(path);
}
else {
// Failure
- p->statusbar()->set_status_text(from_u8((boost::format(_utf8(L("Error exporting 3MF file %s"))) % path).str()));
+ p->statusbar()->set_status_text(format_wxstr(_L("Error exporting 3MF file %s"), path));
}
}
@@ -5131,13 +5552,12 @@ void Plater::export_toolpaths_to_obj() const
p->preview->get_canvas3d()->export_toolpaths_to_obj(into_u8(path).c_str());
}
-void Plater::hollow()
-{
- p->hollow();
-}
-
void Plater::reslice()
{
+ // There is "invalid data" button instead "slice now"
+ if (p->process_completed_with_error)
+ return;
+
// Stop arrange and (or) optimize rotation tasks.
this->stop_jobs();
@@ -5160,21 +5580,31 @@ void Plater::reslice()
if ((state & priv::UPDATE_BACKGROUND_PROCESS_INVALID) != 0)
return;
+ bool clean_gcode_toolpaths = true;
if (p->background_process.running())
{
if (wxGetApp().get_mode() == comSimple)
- p->sidebar->set_btn_label(ActionButtonType::abReslice, _(L("Slicing")) + dots);
+ p->sidebar->set_btn_label(ActionButtonType::abReslice, _L("Slicing") + dots);
else
{
- p->sidebar->set_btn_label(ActionButtonType::abReslice, _(L("Slice now")));
+ p->sidebar->set_btn_label(ActionButtonType::abReslice, _L("Slice now"));
p->show_action_buttons(false);
}
}
else if (!p->background_process.empty() && !p->background_process.idle())
p->show_action_buttons(true);
+ else
+ clean_gcode_toolpaths = false;
+
+ if (clean_gcode_toolpaths)
+ reset_gcode_toolpaths();
+#if ENABLE_PREVIEW_TYPE_CHANGE
+ p->preview->reload_print(!clean_gcode_toolpaths);
+#else
// update type of preview
- p->preview->update_view_type(true);
+ p->preview->update_view_type(!clean_gcode_toolpaths);
+#endif // ENABLE_PREVIEW_TYPE_CHANGE
}
void Plater::reslice_SLA_supports(const ModelObject &object, bool postpone_error_messages)
@@ -5215,10 +5645,14 @@ void Plater::reslice_SLA_until_step(SLAPrintObjectStep step, const ModelObject &
void Plater::send_gcode()
{
- if (p->model.objects.empty()) { return; }
+ // if physical_printer is selected, send gcode for this printer
+ DynamicPrintConfig* physical_printer_config = wxGetApp().preset_bundle->physical_printers.get_selected_printer_config();
+ if (! physical_printer_config || p->model.objects.empty())
+ return;
- PrintHostJob upload_job(p->config);
- if (upload_job.empty()) { return; }
+ PrintHostJob upload_job(physical_printer_config);
+ if (upload_job.empty())
+ return;
// Obtain default output path
fs::path default_output_file;
@@ -5229,18 +5663,28 @@ void Plater::send_gcode()
if (state & priv::UPDATE_BACKGROUND_PROCESS_INVALID)
return;
default_output_file = this->p->background_process.output_filepath_for_project(into_path(get_project_filename(".3mf")));
- }
- catch (const std::exception &ex) {
- show_error(this, ex.what());
+ } catch (const Slic3r::PlaceholderParserError& ex) {
+ // Show the error with monospaced font.
+ show_error(this, ex.what(), true);
+ return;
+ } catch (const std::exception& ex) {
+ show_error(this, ex.what(), false);
return;
}
default_output_file = fs::path(Slic3r::fold_utf8_to_ascii(default_output_file.string()));
- PrintHostSendDialog dlg(default_output_file, upload_job.printhost->can_start_print());
+ // Repetier specific: Query the server for the list of file groups.
+ wxArrayString groups;
+ {
+ wxBusyCursor wait;
+ upload_job.printhost->get_groups(groups);
+ }
+
+ PrintHostSendDialog dlg(default_output_file, upload_job.printhost->can_start_print(), groups);
if (dlg.ShowModal() == wxID_OK) {
upload_job.upload_data.upload_path = dlg.filename();
upload_job.upload_data.start_print = dlg.start_print();
-
+ upload_job.upload_data.group = dlg.group();
p->export_gcode(fs::path(), false, std::move(upload_job));
}
}
@@ -5304,6 +5748,18 @@ void Plater::undo_redo_topmost_string_getter(const bool is_undo, std::string& ou
out_text = "";
}
+bool Plater::search_string_getter(int idx, const char** label, const char** tooltip)
+{
+ const Search::OptionsSearcher& search_list = p->sidebar->get_searcher();
+
+ if (0 <= idx && (size_t)idx < search_list.size()) {
+ search_list[idx].get_marked_label_and_tooltip(label, tooltip);
+ return true;
+ }
+
+ return false;
+}
+
void Plater::on_extruders_change(size_t num_extruders)
{
auto& choices = sidebar().combos_filament();
@@ -5316,12 +5772,12 @@ void Plater::on_extruders_change(size_t num_extruders)
size_t i = choices.size();
while ( i < num_extruders )
{
- PresetComboBox* choice/*{ nullptr }*/;
+ PlaterPresetComboBox* choice/*{ nullptr }*/;
sidebar().init_filament_combo(&choice, i);
choices.push_back(choice);
// initialize selection
- wxGetApp().preset_bundle->update_plater_filament_ui(i, choice);
+ choice->update();
++i;
}
@@ -5363,9 +5819,14 @@ void Plater::on_config_change(const DynamicPrintConfig &config)
}
p->config->set_key_value(opt_key, config.option(opt_key)->clone());
- if (opt_key == "printer_technology")
+ if (opt_key == "printer_technology") {
this->set_printer_technology(config.opt_enum<PrinterTechnology>(opt_key));
- else if ((opt_key == "bed_shape") || (opt_key == "bed_custom_texture") || (opt_key == "bed_custom_model")) {
+ // print technology is changed, so we should to update a search list
+ p->sidebar->update_searcher();
+ p->sidebar->show_sliced_info_sizer(false);
+ p->reset_gcode_toolpaths();
+ }
+ else if (opt_key == "bed_shape" || opt_key == "bed_custom_texture" || opt_key == "bed_custom_model") {
bed_shape_changed = true;
update_scheduled = true;
}
@@ -5382,7 +5843,9 @@ void Plater::on_config_change(const DynamicPrintConfig &config)
}
else if(opt_key == "extruder_colour") {
update_scheduled = true;
+#if !ENABLE_PREVIEW_TYPE_CHANGE
p->preview->set_number_extruders(p->config->option<ConfigOptionStrings>(opt_key)->values.size());
+#endif // !ENABLE_PREVIEW_TYPE_CHANGE
p->sidebar->obj_list()->update_extruder_colors();
} else if(opt_key == "max_print_height") {
update_scheduled = true;
@@ -5395,9 +5858,7 @@ void Plater::on_config_change(const DynamicPrintConfig &config)
}
if (bed_shape_changed)
- p->set_bed_shape(p->config->option<ConfigOptionPoints>("bed_shape")->values,
- p->config->option<ConfigOptionString>("bed_custom_texture")->value,
- p->config->option<ConfigOptionString>("bed_custom_model")->value);
+ set_bed_shape();
if (update_scheduled)
update();
@@ -5408,9 +5869,14 @@ void Plater::on_config_change(const DynamicPrintConfig &config)
void Plater::set_bed_shape() const
{
- p->set_bed_shape(p->config->option<ConfigOptionPoints>("bed_shape")->values,
- p->config->option<ConfigOptionString>("bed_custom_texture")->value,
- p->config->option<ConfigOptionString>("bed_custom_model")->value);
+ set_bed_shape(p->config->option<ConfigOptionPoints>("bed_shape")->values,
+ p->config->option<ConfigOptionString>("bed_custom_texture")->value,
+ p->config->option<ConfigOptionString>("bed_custom_model")->value);
+}
+
+void Plater::set_bed_shape(const Pointfs& shape, const std::string& custom_texture, const std::string& custom_model, bool force_as_custom) const
+{
+ p->set_bed_shape(shape, custom_texture, custom_model, force_as_custom);
}
void Plater::force_filament_colors_update()
@@ -5452,50 +5918,53 @@ void Plater::force_print_bed_update()
void Plater::on_activate()
{
-#ifdef __linux__
+#if defined(__linux__) || defined(_WIN32)
wxWindow *focus_window = wxWindow::FindFocus();
// Activating the main frame, and no window has keyboard focus.
// Set the keyboard focus to the visible Canvas3D.
- if (this->p->view3D->IsShown() && (!focus_window || focus_window == this->p->view3D->get_wxglcanvas()))
- this->p->view3D->get_wxglcanvas()->SetFocus();
-
- else if (this->p->preview->IsShown() && (!focus_window || focus_window == this->p->view3D->get_wxglcanvas()))
- this->p->preview->get_wxglcanvas()->SetFocus();
+ if (this->p->view3D->IsShown() && wxWindow::FindFocus() != this->p->view3D->get_wxglcanvas())
+ CallAfter([this]() { this->p->view3D->get_wxglcanvas()->SetFocus(); });
+ else if (this->p->preview->IsShown() && wxWindow::FindFocus() != this->p->view3D->get_wxglcanvas())
+ CallAfter([this]() { this->p->preview->get_wxglcanvas()->SetFocus(); });
#endif
this->p->show_delayed_error_message();
}
// Get vector of extruder colors considering filament color, if extruder color is undefined.
-std::vector<std::string> Plater::get_extruder_colors_from_plater_config() const
+std::vector<std::string> Plater::get_extruder_colors_from_plater_config(const GCodeProcessor::Result* const result) const
{
- const Slic3r::DynamicPrintConfig* config = &wxGetApp().preset_bundle->printers.get_edited_preset().config;
- std::vector<std::string> extruder_colors;
- if (!config->has("extruder_colour")) // in case of a SLA print
- return extruder_colors;
+ if (wxGetApp().is_gcode_viewer() && result != nullptr)
+ return result->extruder_colors;
+ else {
+ const Slic3r::DynamicPrintConfig* config = &wxGetApp().preset_bundle->printers.get_edited_preset().config;
+ std::vector<std::string> extruder_colors;
+ if (!config->has("extruder_colour")) // in case of a SLA print
+ return extruder_colors;
- extruder_colors = (config->option<ConfigOptionStrings>("extruder_colour"))->values;
- if (!wxGetApp().plater())
- return extruder_colors;
+ extruder_colors = (config->option<ConfigOptionStrings>("extruder_colour"))->values;
+ if (!wxGetApp().plater())
+ return extruder_colors;
- const std::vector<std::string>& filament_colours = (p->config->option<ConfigOptionStrings>("filament_colour"))->values;
- for (size_t i = 0; i < extruder_colors.size(); ++i)
- if (extruder_colors[i] == "" && i < filament_colours.size())
- extruder_colors[i] = filament_colours[i];
+ const std::vector<std::string>& filament_colours = (p->config->option<ConfigOptionStrings>("filament_colour"))->values;
+ for (size_t i = 0; i < extruder_colors.size(); ++i)
+ if (extruder_colors[i] == "" && i < filament_colours.size())
+ extruder_colors[i] = filament_colours[i];
- return extruder_colors;
+ return extruder_colors;
+ }
}
/* Get vector of colors used for rendering of a Preview scene in "Color print" mode
* It consists of extruder colors and colors, saved in model.custom_gcode_per_print_z
*/
-std::vector<std::string> Plater::get_colors_for_color_print() const
+std::vector<std::string> Plater::get_colors_for_color_print(const GCodeProcessor::Result* const result) const
{
- std::vector<std::string> colors = get_extruder_colors_from_plater_config();
+ std::vector<std::string> colors = get_extruder_colors_from_plater_config(result);
colors.reserve(colors.size() + p->model.custom_gcode_per_print_z.gcodes.size());
for (const CustomGCode::Item& code : p->model.custom_gcode_per_print_z.gcodes)
- if (code.gcode == ColorChangeCode)
+ if (code.type == CustomGCode::ColorChange)
colors.emplace_back(code.color);
return colors;
@@ -5516,6 +5985,11 @@ bool Plater::is_export_gcode_scheduled() const
return p->background_process.is_export_scheduled();
}
+const Selection &Plater::get_selection() const
+{
+ return p->get_selection();
+}
+
int Plater::get_selected_object_idx()
{
return p->get_selected_object_idx();
@@ -5531,6 +6005,11 @@ GLCanvas3D* Plater::canvas3D()
return p->view3D->get_canvas3d();
}
+const GLCanvas3D* Plater::canvas3D() const
+{
+ return p->view3D->get_canvas3d();
+}
+
GLCanvas3D* Plater::get_current_canvas3D()
{
return p->get_current_canvas3D();
@@ -5541,20 +6020,38 @@ BoundingBoxf Plater::bed_shape_bb() const
return p->bed_shape_bb();
}
+void Plater::arrange()
+{
+ p->m_ui_jobs.arrange();
+}
+
void Plater::set_current_canvas_as_dirty()
{
p->set_current_canvas_as_dirty();
}
+void Plater::unbind_canvas_event_handlers()
+{
+ p->unbind_canvas_event_handlers();
+}
+
+void Plater::reset_canvas_volumes()
+{
+ p->reset_canvas_volumes();
+}
+
PrinterTechnology Plater::printer_technology() const
{
return p->printer_technology;
}
-void Plater::set_printer_technology(PrinterTechnology printer_technology)
+const DynamicPrintConfig * Plater::config() const { return p->config; }
+
+bool Plater::set_printer_technology(PrinterTechnology printer_technology)
{
p->printer_technology = printer_technology;
- if (p->background_process.select_technology(printer_technology)) {
+ bool ret = p->background_process.select_technology(printer_technology);
+ if (ret) {
// Update the active presets.
}
//FIXME for SLA synchronize
@@ -5563,8 +6060,14 @@ void Plater::set_printer_technology(PrinterTechnology printer_technology)
p->label_btn_export = printer_technology == ptFFF ? L("Export G-code") : L("Export");
p->label_btn_send = printer_technology == ptFFF ? L("Send G-code") : L("Send to printer");
- if (wxGetApp().mainframe)
+ if (wxGetApp().mainframe != nullptr)
wxGetApp().mainframe->update_menubar();
+
+ p->update_main_toolbar_tooltips();
+
+ p->sidebar->get_searcher().set_printer_technology(printer_technology);
+
+ return ret;
}
void Plater::changed_object(int obj_idx)
@@ -5637,7 +6140,10 @@ void Plater::show_action_buttons(const bool ready_to_slice) const { p->show_acti
void Plater::copy_selection_to_clipboard()
{
- if (can_copy_to_clipboard())
+ // At first try to copy selected values to the ObjectList's clipboard
+ // to check if Settings or Layers are selected in the list
+ // and then copy to 3DCanvas's clipboard if not
+ if (can_copy_to_clipboard() && !p->sidebar->obj_list()->copy_to_clipboard())
p->view3D->get_canvas3d()->get_selection().copy_to_clipboard();
}
@@ -5646,8 +6152,37 @@ void Plater::paste_from_clipboard()
if (!can_paste_from_clipboard())
return;
- Plater::TakeSnapshot snapshot(this, _(L("Paste From Clipboard")));
- p->view3D->get_canvas3d()->get_selection().paste_from_clipboard();
+ Plater::TakeSnapshot snapshot(this, _L("Paste From Clipboard"));
+
+ // At first try to paste values from the ObjectList's clipboard
+ // to check if Settings or Layers were copied
+ // and then paste from the 3DCanvas's clipboard if not
+ if (!p->sidebar->obj_list()->paste_from_clipboard())
+ p->view3D->get_canvas3d()->get_selection().paste_from_clipboard();
+}
+
+void Plater::search(bool plater_is_active)
+{
+ if (plater_is_active) {
+ // plater should be focused for correct navigation inside search window
+ this->SetFocus();
+
+ wxKeyEvent evt;
+#ifdef __APPLE__
+ evt.m_keyCode = 'f';
+#else /* __APPLE__ */
+ evt.m_keyCode = WXK_CONTROL_F;
+#endif /* __APPLE__ */
+ evt.SetControlDown(true);
+ canvas3D()->on_char(evt);
+ }
+ else
+ {
+ wxPoint pos = this->ClientToScreen(wxPoint(0, 0));
+ pos.x += em_unit(this) * 40;
+ pos.y += em_unit(this) * 4;
+ p->sidebar->get_searcher().search_dialog->Popup(pos);
+ }
}
void Plater::msw_rescale()
@@ -5664,11 +6199,37 @@ void Plater::msw_rescale()
GetParent()->Layout();
}
+void Plater::sys_color_changed()
+{
+ p->sidebar->sys_color_changed();
+
+ // msw_rescale_menu updates just icons, so use it
+ p->msw_rescale_object_menu();
+
+ Layout();
+ GetParent()->Layout();
+}
+
bool Plater::init_view_toolbar()
{
return p->init_view_toolbar();
}
+void Plater::enable_view_toolbar(bool enable)
+{
+ p->view_toolbar.set_enabled(enable);
+}
+
+bool Plater::init_collapse_toolbar()
+{
+ return p->init_collapse_toolbar();
+}
+
+void Plater::enable_collapse_toolbar(bool enable)
+{
+ p->collapse_toolbar.set_enabled(enable);
+}
+
const Camera& Plater::get_camera() const
{
return p->camera;
@@ -5679,6 +6240,69 @@ Camera& Plater::get_camera()
return p->camera;
}
+#if ENABLE_ENVIRONMENT_MAP
+void Plater::init_environment_texture()
+{
+ if (p->environment_texture.get_id() == 0)
+ p->environment_texture.load_from_file(resources_dir() + "/icons/Pmetal_001.png", false, GLTexture::SingleThreaded, false);
+}
+
+unsigned int Plater::get_environment_texture_id() const
+{
+ return p->environment_texture.get_id();
+}
+#endif // ENABLE_ENVIRONMENT_MAP
+
+const Bed3D& Plater::get_bed() const
+{
+ return p->bed;
+}
+
+Bed3D& Plater::get_bed()
+{
+ return p->bed;
+}
+
+const GLToolbar& Plater::get_view_toolbar() const
+{
+ return p->view_toolbar;
+}
+
+GLToolbar& Plater::get_view_toolbar()
+{
+ return p->view_toolbar;
+}
+
+const GLToolbar& Plater::get_collapse_toolbar() const
+{
+ return p->collapse_toolbar;
+}
+
+GLToolbar& Plater::get_collapse_toolbar()
+{
+ return p->collapse_toolbar;
+}
+
+void Plater::update_preview_bottom_toolbar()
+{
+ p->update_preview_bottom_toolbar();
+}
+
+void Plater::update_preview_moves_slider()
+{
+ p->update_preview_moves_slider();
+}
+
+void Plater::enable_preview_moves_slider(bool enable)
+{
+ p->enable_preview_moves_slider(enable);
+}
+
+void Plater::reset_gcode_toolpaths()
+{
+ p->reset_gcode_toolpaths();
+}
+
const Mouse3DController& Plater::get_mouse3d_controller() const
{
return p->mouse3d_controller;
@@ -5689,6 +6313,16 @@ Mouse3DController& Plater::get_mouse3d_controller()
return p->mouse3d_controller;
}
+const NotificationManager* Plater::get_notification_manager() const
+{
+ return p->notification_manager;
+}
+
+NotificationManager* Plater::get_notification_manager()
+{
+ return p->notification_manager;
+}
+
bool Plater::can_delete() const { return p->can_delete(); }
bool Plater::can_delete_all() const { return p->can_delete_all(); }
bool Plater::can_increase_instances() const { return p->can_increase_instances(); }
@@ -5704,7 +6338,7 @@ bool Plater::can_paste_from_clipboard() const
const Selection& selection = p->view3D->get_canvas3d()->get_selection();
const Selection::Clipboard& clipboard = selection.get_clipboard();
- if (clipboard.is_empty())
+ if (clipboard.is_empty() && p->sidebar->obj_list()->clipboard_is_empty())
return false;
if ((wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA) && !clipboard.is_sla_compliant())
@@ -5736,10 +6370,23 @@ bool Plater::can_undo() const { return p->undo_redo_stack().has_undo_snapshot();
bool Plater::can_redo() const { return p->undo_redo_stack().has_redo_snapshot(); }
bool Plater::can_reload_from_disk() const { return p->can_reload_from_disk(); }
const UndoRedo::Stack& Plater::undo_redo_stack_main() const { return p->undo_redo_stack_main(); }
+void Plater::clear_undo_redo_stack_main() { p->undo_redo_stack_main().clear(); }
void Plater::enter_gizmos_stack() { p->enter_gizmos_stack(); }
void Plater::leave_gizmos_stack() { p->leave_gizmos_stack(); }
bool Plater::inside_snapshot_capture() { return p->inside_snapshot_capture(); }
+#if ENABLE_RENDER_STATISTICS
+void Plater::toggle_render_statistic_dialog()
+{
+ p->show_render_statistic_dialog = !p->show_render_statistic_dialog;
+}
+
+bool Plater::is_render_statistic_dialog_visible() const
+{
+ return p->show_render_statistic_dialog;
+}
+#endif // ENABLE_RENDER_STATISTICS
+
// Wrapper around wxWindow::PopupMenu to suppress error messages popping out while tracking the popup menu.
bool Plater::PopupMenu(wxMenu *menu, const wxPoint& pos)
{
@@ -5758,6 +6405,10 @@ bool Plater::PopupMenu(wxMenu *menu, const wxPoint& pos)
}
return out;
}
+void Plater::bring_instance_forward()
+{
+ p->bring_instance_forward();
+}
SuppressBackgroundProcessingUpdate::SuppressBackgroundProcessingUpdate() :
m_was_scheduled(wxGetApp().plater()->is_background_process_update_scheduled())
diff --git a/src/slic3r/GUI/Plater.hpp b/src/slic3r/GUI/Plater.hpp
index 32709a4bd..5c7c6d7c9 100644
--- a/src/slic3r/GUI/Plater.hpp
+++ b/src/slic3r/GUI/Plater.hpp
@@ -6,18 +6,17 @@
#include <boost/filesystem/path.hpp>
#include <wx/panel.h>
-#include <wx/bmpcbox.h>
-#include "Preset.hpp"
+#include "Selection.hpp"
-#include "3DScene.hpp"
-#include "GLTexture.hpp"
-#include "wxExtensions.hpp"
+#include "libslic3r/Preset.hpp"
+#include "libslic3r/BoundingBox.hpp"
+#include "libslic3r/GCode/GCodeProcessor.hpp"
+#include "Jobs/Job.hpp"
+#include "Search.hpp"
class wxButton;
class ScalableButton;
-class wxBoxSizer;
-class wxGLCanvas;
class wxScrolledWindow;
class wxString;
@@ -25,14 +24,17 @@ namespace Slic3r {
class Model;
class ModelObject;
+class ModelInstance;
class Print;
class SLAPrint;
enum SLAPrintObjectStep : unsigned int;
+using ModelInstancePtrs = std::vector<ModelInstance*>;
+
namespace UndoRedo {
- class Stack;
- struct Snapshot;
-};
+ class Stack;
+ struct Snapshot;
+}
namespace GUI {
@@ -44,46 +46,17 @@ class ObjectLayers;
class ObjectList;
class GLCanvas3D;
class Mouse3DController;
+class NotificationManager;
+struct Camera;
+class Bed3D;
+class GLToolbar;
+class PlaterPresetComboBox;
using t_optgroups = std::vector <std::shared_ptr<ConfigOptionsGroup>>;
class Plater;
enum class ActionButtonType : int;
-class PresetComboBox : public PresetBitmapComboBox
-{
-public:
- PresetComboBox(wxWindow *parent, Preset::Type preset_type);
- ~PresetComboBox();
-
- ScalableButton* edit_btn { nullptr };
-
- enum LabelItemType {
- LABEL_ITEM_MARKER = 0xffffff01,
- LABEL_ITEM_WIZARD_PRINTERS,
- LABEL_ITEM_WIZARD_FILAMENTS,
- LABEL_ITEM_WIZARD_MATERIALS,
-
- LABEL_ITEM_MAX,
- };
-
- void set_label_marker(int item, LabelItemType label_item_type = LABEL_ITEM_MARKER);
- void set_extruder_idx(const int extr_idx) { extruder_idx = extr_idx; }
- int get_extruder_idx() const { return extruder_idx; }
- int em_unit() const { return m_em_unit; }
- void check_selection();
-
- void msw_rescale();
-
-private:
- typedef std::size_t Marker;
-
- Preset::Type preset_type;
- int last_selected;
- int extruder_idx = -1;
- int m_em_unit;
-};
-
class Sidebar : public wxPanel
{
ConfigOptionMode m_mode;
@@ -95,13 +68,17 @@ public:
Sidebar &operator=(const Sidebar &) = delete;
~Sidebar();
- void init_filament_combo(PresetComboBox **combo, const int extr_idx);
+ void init_filament_combo(PlaterPresetComboBox **combo, const int extr_idx);
void remove_unused_filament_combos(const size_t current_extruder_count);
void update_all_preset_comboboxes();
void update_presets(Slic3r::Preset::Type preset_type);
void update_mode_sizer() const;
+ void change_top_border_for_mode_sizer(bool increase_border);
void update_reslice_btn_tooltip() const;
void msw_rescale();
+ void sys_color_changed();
+ void search();
+ void jump_to_option(size_t selected);
ObjectManipulation* obj_manipul();
ObjectList* obj_list();
@@ -121,12 +98,20 @@ public:
bool show_reslice(bool show) const;
bool show_export(bool show) const;
bool show_send(bool show) const;
- bool show_disconnect(bool show)const;
+ bool show_eject(bool show)const;
bool show_export_removable(bool show) const;
+ bool get_eject_shown() const;
bool is_multifilament();
void update_mode();
+ bool is_collapsed();
+ void collapse(bool collapse);
+ void update_searcher();
+ void update_ui_from_settings();
+
+ std::vector<PlaterPresetComboBox*>& combos_filament();
+ Search::OptionsSearcher& get_searcher();
+ std::string& get_search_line();
- std::vector<PresetComboBox*>& combos_filament();
private:
struct priv;
std::unique_ptr<priv> p;
@@ -154,12 +139,23 @@ public:
void new_project();
void load_project();
void load_project(const wxString& filename);
- void add_model();
+ void add_model(bool imperial_units = false);
+ void import_sl1_archive();
void extract_config_from_project();
+ void load_gcode();
+ void load_gcode(const wxString& filename);
+ void reload_gcode_from_disk();
+ void refresh_print();
- std::vector<size_t> load_files(const std::vector<boost::filesystem::path>& input_files, bool load_model = true, bool load_config = true);
+ std::vector<size_t> load_files(const std::vector<boost::filesystem::path>& input_files, bool load_model = true, bool load_config = true, bool imperial_units = false);
// To be called when providing a list of files to the GUI slic3r on command line.
- std::vector<size_t> load_files(const std::vector<std::string>& input_files, bool load_model = true, bool load_config = true);
+ std::vector<size_t> load_files(const std::vector<std::string>& input_files, bool load_model = true, bool load_config = true, bool imperial_units = false);
+#if ENABLE_DRAG_AND_DROP_FIX
+ // to be called on drag and drop
+ bool load_files(const wxArrayString& filenames);
+#endif // ENABLE_DRAG_AND_DROP_FIX
+
+ const wxString& get_last_loaded_gcode() const { return m_last_loaded_gcode; }
void update();
void stop_jobs();
@@ -173,9 +169,14 @@ public:
bool are_view3D_labels_shown() const;
void show_view3D_labels(bool show);
+ bool is_sidebar_collapsed() const;
+ void collapse_sidebar(bool show);
+
+ bool is_view3D_layers_editing_enabled() const;
+
// Called after the Preferences dialog is closed and the program settings are saved.
// Update the UI based on the current preferences.
- void update_ui_from_settings();
+ void update_ui_from_settings(bool apply_free_camera_correction = true);
void select_all();
void deselect_all();
@@ -187,12 +188,14 @@ public:
void increase_instances(size_t num = 1);
void decrease_instances(size_t num = 1);
void set_number_of_copies(/*size_t num*/);
+ void fill_bed_with_instances();
bool is_selection_empty() const;
void scale_selection_to_fit_print_volume();
+ void convert_unit(bool from_imperial_unit);
void cut(size_t obj_idx, size_t instance_idx, coordf_t z, bool keep_upper = true, bool keep_lower = true, bool rotate_lower = false);
- void export_gcode(bool prefer_removable = true);
+ void export_gcode(bool prefer_removable);
void export_stl(bool extended = false, bool selection_only = false);
void export_amf();
void export_3mf(const boost::filesystem::path& output_path = boost::filesystem::path());
@@ -200,7 +203,6 @@ public:
void reload_all_from_disk();
bool has_toolpaths_to_export() const;
void export_toolpaths_to_obj() const;
- void hollow();
void reslice();
void reslice_SLA_supports(const ModelObject &object, bool postpone_error_messages = false);
void reslice_SLA_hollowing(const ModelObject &object, bool postpone_error_messages = false);
@@ -222,8 +224,10 @@ public:
void redo_to(int selection);
bool undo_redo_string_getter(const bool is_undo, int idx, const char** out_text);
void undo_redo_topmost_string_getter(const bool is_undo, std::string& out_text);
+ bool search_string_getter(int idx, const char** label, const char** tooltip);
// For the memory statistics.
const Slic3r::UndoRedo::Stack& undo_redo_stack_main() const;
+ void clear_undo_redo_stack_main();
// Enter / leave the Gizmos specific Undo / Redo stack. To be used by the SLA support point editing gizmo.
void enter_gizmos_stack();
void leave_gizmos_stack();
@@ -234,8 +238,8 @@ public:
void force_print_bed_update();
// On activating the parent window.
void on_activate();
- std::vector<std::string> get_extruder_colors_from_plater_config() const;
- std::vector<std::string> get_colors_for_color_print() const;
+ std::vector<std::string> get_extruder_colors_from_plater_config(const GCodeProcessor::Result* const result = nullptr) const;
+ std::vector<std::string> get_colors_for_color_print(const GCodeProcessor::Result* const result = nullptr) const;
void update_object_menu();
void show_action_buttons(const bool is_ready_to_slice) const;
@@ -244,20 +248,29 @@ public:
void set_project_filename(const wxString& filename);
bool is_export_gcode_scheduled() const;
-
+
+ const Selection& get_selection() const;
int get_selected_object_idx();
bool is_single_full_object_selection() const;
GLCanvas3D* canvas3D();
+ const GLCanvas3D * canvas3D() const;
GLCanvas3D* get_current_canvas3D();
BoundingBoxf bed_shape_bb() const;
+
+ void arrange();
+ void find_new_position(const ModelInstancePtrs &instances, coord_t min_d);
void set_current_canvas_as_dirty();
+ void unbind_canvas_event_handlers();
+ void reset_canvas_volumes();
PrinterTechnology printer_technology() const;
- void set_printer_technology(PrinterTechnology printer_technology);
+ const DynamicPrintConfig * config() const;
+ bool set_printer_technology(PrinterTechnology printer_technology);
void copy_selection_to_clipboard();
void paste_from_clipboard();
+ void search(bool plater_is_active);
bool can_delete() const;
bool can_delete_all() const;
@@ -276,17 +289,49 @@ public:
bool can_reload_from_disk() const;
void msw_rescale();
+ void sys_color_changed();
bool init_view_toolbar();
+ void enable_view_toolbar(bool enable);
+ bool init_collapse_toolbar();
+ void enable_collapse_toolbar(bool enable);
const Camera& get_camera() const;
Camera& get_camera();
+
+#if ENABLE_ENVIRONMENT_MAP
+ void init_environment_texture();
+ unsigned int get_environment_texture_id() const;
+#endif // ENABLE_ENVIRONMENT_MAP
+
+ const Bed3D& get_bed() const;
+ Bed3D& get_bed();
+
+ const GLToolbar& get_view_toolbar() const;
+ GLToolbar& get_view_toolbar();
+
+ const GLToolbar& get_collapse_toolbar() const;
+ GLToolbar& get_collapse_toolbar();
+
+ void update_preview_bottom_toolbar();
+ void update_preview_moves_slider();
+ void enable_preview_moves_slider(bool enable);
+
+ void reset_gcode_toolpaths();
+ void reset_last_loaded_gcode() { m_last_loaded_gcode = ""; }
+
const Mouse3DController& get_mouse3d_controller() const;
Mouse3DController& get_mouse3d_controller();
void set_bed_shape() const;
+ void set_bed_shape(const Pointfs& shape, const std::string& custom_texture, const std::string& custom_model, bool force_as_custom = false) const;
- // ROII wrapper for suppressing the Undo / Redo snapshot to be taken.
+ const NotificationManager* get_notification_manager() const;
+ NotificationManager* get_notification_manager();
+
+ void bring_instance_forward();
+
+ // ROII wrapper for suppressing the Undo / Redo snapshot to be taken.
class SuppressSnapshots
{
public:
@@ -321,6 +366,11 @@ public:
bool inside_snapshot_capture();
+#if ENABLE_RENDER_STATISTICS
+ void toggle_render_statistic_dialog();
+ bool is_render_statistic_dialog_visible() const;
+#endif // ENABLE_RENDER_STATISTICS
+
// Wrapper around wxWindow::PopupMenu to suppress error messages popping out while tracking the popup menu.
bool PopupMenu(wxMenu *menu, const wxPoint& pos = wxDefaultPosition);
bool PopupMenu(wxMenu *menu, int x, int y) { return this->PopupMenu(menu, wxPoint(x, y)); }
@@ -335,6 +385,8 @@ private:
bool m_tracking_popup_menu = false;
wxString m_tracking_popup_menu_error_message;
+ wxString m_last_loaded_gcode;
+
void suppress_snapshots();
void allow_snapshots();
@@ -350,6 +402,7 @@ private:
bool m_was_scheduled;
};
-}}
+} // namespace GUI
+} // namespace Slic3r
#endif
diff --git a/src/slic3r/GUI/Preferences.cpp b/src/slic3r/GUI/Preferences.cpp
index 1299d9a48..9c9ea8c4b 100644
--- a/src/slic3r/GUI/Preferences.cpp
+++ b/src/slic3r/GUI/Preferences.cpp
@@ -1,13 +1,16 @@
#include "Preferences.hpp"
-#include "AppConfig.hpp"
#include "OptionsGroup.hpp"
+#include "GUI_App.hpp"
+#include "Plater.hpp"
#include "I18N.hpp"
+#include "libslic3r/AppConfig.hpp"
+#include <wx/notebook.h>
namespace Slic3r {
namespace GUI {
PreferencesDialog::PreferencesDialog(wxWindow* parent) :
- DPIDialog(parent, wxID_ANY, _(L("Preferences")), wxDefaultPosition,
+ DPIDialog(parent, wxID_ANY, _L("Preferences"), wxDefaultPosition,
wxDefaultSize, wxDEFAULT_DIALOG_STYLE)
{
#ifdef __WXOSX__
@@ -16,89 +19,183 @@ PreferencesDialog::PreferencesDialog(wxWindow* parent) :
build();
}
-void PreferencesDialog::build()
+static std::shared_ptr<ConfigOptionsGroup>create_options_tab(const wxString& title, wxNotebook* tabs)
{
- auto app_config = get_app_config();
- m_optgroup_general = std::make_shared<ConfigOptionsGroup>(this, _(L("General")));
- m_optgroup_general->label_width = 40;
- m_optgroup_general->m_on_change = [this](t_config_option_key opt_key, boost::any value) {
- m_values[opt_key] = boost::any_cast<bool>(value) ? "1" : "0";
- };
+ wxPanel* tab = new wxPanel(tabs, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxBK_LEFT | wxTAB_TRAVERSAL);
+ tabs->AddPage(tab, title);
+ tab->SetFont(wxGetApp().normal_font());
- // TODO
-// $optgroup->append_single_option_line(Slic3r::GUI::OptionsGroup::Option->new(
-// opt_id = > 'version_check',
-// type = > 'bool',
-// label = > 'Check for updates',
-// tooltip = > 'If this is enabled, Slic3r will check for updates daily and display a reminder if a newer version is available.',
-// default = > $app_config->get("version_check") // 1,
-// readonly = > !wxTheApp->have_version_check,
-// ));
+ wxBoxSizer* sizer = new wxBoxSizer(wxVERTICAL);
+ sizer->SetSizeHints(tab);
+ tab->SetSizer(sizer);
- ConfigOptionDef def;
- def.label = L("Remember output directory");
- def.type = coBool;
- def.tooltip = L("If this is enabled, Slic3r will prompt the last output directory "
- "instead of the one containing the input files.");
- def.set_default_value(new ConfigOptionBool{ app_config->has("remember_output_path") ? app_config->get("remember_output_path") == "1" : true });
- Option option(def, "remember_output_path");
- m_optgroup_general->append_single_option_line(option);
+ std::shared_ptr<ConfigOptionsGroup> optgroup = std::make_shared<ConfigOptionsGroup>(tab);
+ optgroup->label_width = 40;
+ return optgroup;
+}
- def.label = L("Auto-center parts");
- def.type = coBool;
- def.tooltip = L("If this is enabled, Slic3r will auto-center objects "
- "around the print bed center.");
- def.set_default_value(new ConfigOptionBool{ app_config->get("autocenter") == "1" });
- option = Option (def,"autocenter");
- m_optgroup_general->append_single_option_line(option);
+static void activate_options_tab(std::shared_ptr<ConfigOptionsGroup> optgroup)
+{
+ optgroup->activate();
+ optgroup->update_visibility(comSimple);
+ wxBoxSizer* sizer = static_cast<wxBoxSizer*>(static_cast<wxPanel*>(optgroup->parent())->GetSizer());
+ sizer->Add(optgroup->sizer, 0, wxEXPAND | wxALL, 20);
+}
- def.label = L("Background processing");
- def.type = coBool;
- def.tooltip = L("If this is enabled, Slic3r will pre-process objects as soon "
- "as they\'re loaded in order to save time when exporting G-code.");
- def.set_default_value(new ConfigOptionBool{ app_config->get("background_processing") == "1" });
- option = Option (def,"background_processing");
- m_optgroup_general->append_single_option_line(option);
+void PreferencesDialog::build()
+{
+ SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
+ const wxFont& font = wxGetApp().normal_font();
+ SetFont(font);
- // Please keep in sync with ConfigWizard
- def.label = L("Check for application updates");
- def.type = coBool;
- def.tooltip = L("If enabled, PrusaSlicer will check for the new versions of itself online. When a new version becomes available a notification is displayed at the next application startup (never during program usage). This is only a notification mechanisms, no automatic installation is done.");
- def.set_default_value(new ConfigOptionBool(app_config->get("version_check") == "1"));
- option = Option (def, "version_check");
- m_optgroup_general->append_single_option_line(option);
+ auto app_config = get_app_config();
- // Please keep in sync with ConfigWizard
- def.label = L("Export sources full pathnames to 3mf and amf");
- def.type = coBool;
- def.tooltip = L("If enabled, allows the Reload from disk command to automatically find and load the files when invoked.");
- def.set_default_value(new ConfigOptionBool(app_config->get("export_sources_full_pathnames") == "1"));
- option = Option(def, "export_sources_full_pathnames");
- m_optgroup_general->append_single_option_line(option);
+ wxNotebook* tabs = new wxNotebook(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxNB_TOP | wxTAB_TRAVERSAL | wxNB_NOPAGETHEME);
- // Please keep in sync with ConfigWizard
- def.label = L("Update built-in Presets automatically");
- def.type = coBool;
- def.tooltip = L("If enabled, Slic3r downloads updates of built-in system presets in the background. These updates are downloaded into a separate temporary location. When a new preset version becomes available it is offered at application startup.");
- def.set_default_value(new ConfigOptionBool(app_config->get("preset_update") == "1"));
- option = Option (def, "preset_update");
- m_optgroup_general->append_single_option_line(option);
+ // Add "General" tab
+ m_optgroup_general = create_options_tab(_L("General"), tabs);
+ m_optgroup_general->m_on_change = [this](t_config_option_key opt_key, boost::any value) {
+ if (opt_key == "default_action_on_close_application" || opt_key == "default_action_on_select_preset")
+ m_values[opt_key] = boost::any_cast<bool>(value) ? "none" : "discard";
+ else
+ m_values[opt_key] = boost::any_cast<bool>(value) ? "1" : "0";
+ };
- def.label = L("Suppress \" - default - \" presets");
- def.type = coBool;
- def.tooltip = L("Suppress \" - default - \" presets in the Print / Filament / Printer "
- "selections once there are any other valid presets available.");
- def.set_default_value(new ConfigOptionBool{ app_config->get("no_defaults") == "1" });
- option = Option (def,"no_defaults");
- m_optgroup_general->append_single_option_line(option);
+ bool is_editor = wxGetApp().is_editor();
- def.label = L("Show incompatible print and filament presets");
- def.type = coBool;
- def.tooltip = L("When checked, the print and filament presets are shown in the preset editor "
- "even if they are marked as incompatible with the active printer");
- def.set_default_value(new ConfigOptionBool{ app_config->get("show_incompatible_presets") == "1" });
- option = Option (def,"show_incompatible_presets");
- m_optgroup_general->append_single_option_line(option);
+ ConfigOptionDef def;
+ Option option(def, "");
+ if (is_editor) {
+ def.label = L("Remember output directory");
+ def.type = coBool;
+ def.tooltip = L("If this is enabled, Slic3r will prompt the last output directory "
+ "instead of the one containing the input files.");
+ def.set_default_value(new ConfigOptionBool{ app_config->has("remember_output_path") ? app_config->get("remember_output_path") == "1" : true });
+ option = Option(def, "remember_output_path");
+ m_optgroup_general->append_single_option_line(option);
+
+ def.label = L("Auto-center parts");
+ def.type = coBool;
+ def.tooltip = L("If this is enabled, Slic3r will auto-center objects "
+ "around the print bed center.");
+ def.set_default_value(new ConfigOptionBool{ app_config->get("autocenter") == "1" });
+ option = Option(def, "autocenter");
+ m_optgroup_general->append_single_option_line(option);
+
+ def.label = L("Background processing");
+ def.type = coBool;
+ def.tooltip = L("If this is enabled, Slic3r will pre-process objects as soon "
+ "as they\'re loaded in order to save time when exporting G-code.");
+ def.set_default_value(new ConfigOptionBool{ app_config->get("background_processing") == "1" });
+ option = Option(def, "background_processing");
+ m_optgroup_general->append_single_option_line(option);
+
+ // Please keep in sync with ConfigWizard
+ def.label = L("Check for application updates");
+ def.type = coBool;
+ def.tooltip = L("If enabled, PrusaSlicer will check for the new versions of itself online. When a new version becomes available a notification is displayed at the next application startup (never during program usage). This is only a notification mechanisms, no automatic installation is done.");
+ def.set_default_value(new ConfigOptionBool(app_config->get("version_check") == "1"));
+ option = Option(def, "version_check");
+ m_optgroup_general->append_single_option_line(option);
+
+ // Please keep in sync with ConfigWizard
+ def.label = L("Export sources full pathnames to 3mf and amf");
+ def.type = coBool;
+ def.tooltip = L("If enabled, allows the Reload from disk command to automatically find and load the files when invoked.");
+ def.set_default_value(new ConfigOptionBool(app_config->get("export_sources_full_pathnames") == "1"));
+ option = Option(def, "export_sources_full_pathnames");
+ m_optgroup_general->append_single_option_line(option);
+
+#if ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+#ifdef _WIN32
+ // Please keep in sync with ConfigWizard
+ def.label = L("Associate .3mf files to PrusaSlicer");
+ def.type = coBool;
+ def.tooltip = L("If enabled, sets PrusaSlicer as default application to open .3mf files.");
+ def.set_default_value(new ConfigOptionBool(app_config->get("associate_3mf") == "1"));
+ option = Option(def, "associate_3mf");
+ m_optgroup_general->append_single_option_line(option);
+
+ def.label = L("Associate .stl files to PrusaSlicer");
+ def.type = coBool;
+ def.tooltip = L("If enabled, sets PrusaSlicer as default application to open .stl files.");
+ def.set_default_value(new ConfigOptionBool(app_config->get("associate_stl") == "1"));
+ option = Option(def, "associate_stl");
+ m_optgroup_general->append_single_option_line(option);
+#endif // _WIN32
+#endif // ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+
+ // Please keep in sync with ConfigWizard
+ def.label = L("Update built-in Presets automatically");
+ def.type = coBool;
+ def.tooltip = L("If enabled, Slic3r downloads updates of built-in system presets in the background. These updates are downloaded into a separate temporary location. When a new preset version becomes available it is offered at application startup.");
+ def.set_default_value(new ConfigOptionBool(app_config->get("preset_update") == "1"));
+ option = Option(def, "preset_update");
+ m_optgroup_general->append_single_option_line(option);
+
+ def.label = L("Suppress \" - default - \" presets");
+ def.type = coBool;
+ def.tooltip = L("Suppress \" - default - \" presets in the Print / Filament / Printer "
+ "selections once there are any other valid presets available.");
+ def.set_default_value(new ConfigOptionBool{ app_config->get("no_defaults") == "1" });
+ option = Option(def, "no_defaults");
+ m_optgroup_general->append_single_option_line(option);
+
+ def.label = L("Show incompatible print and filament presets");
+ def.type = coBool;
+ def.tooltip = L("When checked, the print and filament presets are shown in the preset editor "
+ "even if they are marked as incompatible with the active printer");
+ def.set_default_value(new ConfigOptionBool{ app_config->get("show_incompatible_presets") == "1" });
+ option = Option(def, "show_incompatible_presets");
+ m_optgroup_general->append_single_option_line(option);
+
+ def.label = L("Show drop project dialog");
+ def.type = coBool;
+ def.tooltip = L("When checked, whenever dragging and dropping a project file on the application, shows a dialog asking to select the action to take on the file to load.");
+ def.set_default_value(new ConfigOptionBool{ app_config->get("show_drop_project_dialog") == "1" });
+ option = Option(def, "show_drop_project_dialog");
+ m_optgroup_general->append_single_option_line(option);
+
+
+#if __APPLE__
+ def.label = L("Allow just a single PrusaSlicer instance");
+ def.type = coBool;
+ def.tooltip = L("On OSX there is always only one instance of app running by default. However it is allowed to run multiple instances of same app from the command line. In such case this settings will allow only one instance.");
+#else
+ def.label = L("Allow just a single PrusaSlicer instance");
+ def.type = coBool;
+ def.tooltip = L("If this is enabled, when starting PrusaSlicer and another instance of the same PrusaSlicer is already running, that instance will be reactivated instead.");
+#endif
+ def.set_default_value(new ConfigOptionBool{ app_config->has("single_instance") ? app_config->get("single_instance") == "1" : false });
+ option = Option(def, "single_instance");
+ m_optgroup_general->append_single_option_line(option);
+
+ def.label = L("Ask for unsaved changes when closing application");
+ def.type = coBool;
+ def.tooltip = L("When closing the application, always ask for unsaved changes");
+ def.set_default_value(new ConfigOptionBool{ app_config->get("default_action_on_close_application") == "none" });
+ option = Option(def, "default_action_on_close_application");
+ m_optgroup_general->append_single_option_line(option);
+
+ def.label = L("Ask for unsaved changes when selecting new preset");
+ def.type = coBool;
+ def.tooltip = L("Always ask for unsaved changes when selecting new preset");
+ def.set_default_value(new ConfigOptionBool{ app_config->get("default_action_on_select_preset") == "none" });
+ option = Option(def, "default_action_on_select_preset");
+ m_optgroup_general->append_single_option_line(option);
+ }
+#if ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
+#ifdef _WIN32
+ else {
+ def.label = L("Associate .gcode files to PrusaSlicer G-code Viewer");
+ def.type = coBool;
+ def.tooltip = L("If enabled, sets PrusaSlicer G-code Viewer as default application to open .gcode files.");
+ def.set_default_value(new ConfigOptionBool(app_config->get("associate_gcode") == "1"));
+ option = Option(def, "associate_gcode");
+ m_optgroup_general->append_single_option_line(option);
+ }
+#endif // _WIN32
+#endif // ENABLE_CUSTOMIZABLE_FILES_ASSOCIATION_ON_WIN
#if __APPLE__
def.label = L("Use Retina resolution for the 3D scene");
@@ -110,8 +207,29 @@ void PreferencesDialog::build()
m_optgroup_general->append_single_option_line(option);
#endif
- m_optgroup_camera = std::make_shared<ConfigOptionsGroup>(this, _(L("Camera")));
- m_optgroup_camera->label_width = 40;
+ // Show/Hide splash screen
+ def.label = L("Show splash screen");
+ def.type = coBool;
+ def.tooltip = L("Show splash screen");
+ def.set_default_value(new ConfigOptionBool{ app_config->get("show_splash_screen") == "1" });
+ option = Option(def, "show_splash_screen");
+ m_optgroup_general->append_single_option_line(option);
+
+#if ENABLE_CTRL_M_ON_WINDOWS
+#if defined(_WIN32) || defined(__APPLE__)
+ def.label = L("Enable support for legacy 3DConnexion devices");
+ def.type = coBool;
+ def.tooltip = L("If enabled, the legacy 3DConnexion devices settings dialog is available by pressing CTRL+M");
+ def.set_default_value(new ConfigOptionBool{ app_config->get("use_legacy_3DConnexion") == "1" });
+ option = Option(def, "use_legacy_3DConnexion");
+ m_optgroup_general->append_single_option_line(option);
+#endif // _WIN32 || __APPLE__
+#endif // ENABLE_CTRL_M_ON_WINDOWS
+
+ activate_options_tab(m_optgroup_general);
+
+ // Add "Camera" tab
+ m_optgroup_camera = create_options_tab(_L("Camera"), tabs);
m_optgroup_camera->m_on_change = [this](t_config_option_key opt_key, boost::any value) {
m_values[opt_key] = boost::any_cast<bool>(value) ? "1" : "0";
};
@@ -130,57 +248,144 @@ void PreferencesDialog::build()
option = Option(def, "use_free_camera");
m_optgroup_camera->append_single_option_line(option);
- m_optgroup_gui = std::make_shared<ConfigOptionsGroup>(this, _(L("GUI")));
- m_optgroup_gui->label_width = 40;
- m_optgroup_gui->m_on_change = [this](t_config_option_key opt_key, boost::any value) {
- m_values[opt_key] = boost::any_cast<bool>(value) ? "1" : "0";
+ def.label = L("Reverse direction of zoom with mouse wheel");
+ def.type = coBool;
+ def.tooltip = L("If enabled, reverses the direction of zoom with mouse wheel");
+ def.set_default_value(new ConfigOptionBool(app_config->get("reverse_mouse_wheel_zoom") == "1"));
+ option = Option(def, "reverse_mouse_wheel_zoom");
+ m_optgroup_camera->append_single_option_line(option);
+
+ activate_options_tab(m_optgroup_camera);
+
+ // Add "GUI" tab
+ m_optgroup_gui = create_options_tab(_L("GUI"), tabs);
+ m_optgroup_gui->m_on_change = [this, tabs](t_config_option_key opt_key, boost::any value) {
+ if (opt_key == "suppress_hyperlinks")
+ m_values[opt_key] = boost::any_cast<bool>(value) ? "1" : "";
+ else
+ m_values[opt_key] = boost::any_cast<bool>(value) ? "1" : "0";
+
if (opt_key == "use_custom_toolbar_size") {
m_icon_size_sizer->ShowItems(boost::any_cast<bool>(value));
+ m_optgroup_gui->parent()->Layout();
+ tabs->Layout();
this->layout();
}
};
- def.label = L("Use custom size for toolbar icons");
+ def.label = L("Sequential slider applied only to top layer");
def.type = coBool;
- def.tooltip = L("If enabled, you can change size of toolbar icons manually.");
- def.set_default_value(new ConfigOptionBool{ app_config->get("use_custom_toolbar_size") == "1" });
- option = Option(def, "use_custom_toolbar_size");
+ def.tooltip = L("If enabled, changes made using the sequential slider, in preview, apply only to gcode top layer. "
+ "If disabled, changes made using the sequential slider, in preview, apply to the whole gcode.");
+ def.set_default_value(new ConfigOptionBool{ app_config->get("seq_top_layer_only") == "1" });
+ option = Option(def, "seq_top_layer_only");
m_optgroup_gui->append_single_option_line(option);
- create_icon_size_slider();
- m_icon_size_sizer->ShowItems(app_config->get("use_custom_toolbar_size") == "1");
+ if (is_editor) {
+ def.label = L("Show sidebar collapse/expand button");
+ def.type = coBool;
+ def.tooltip = L("If enabled, the button for the collapse sidebar will be appeared in top right corner of the 3D Scene");
+ def.set_default_value(new ConfigOptionBool{ app_config->get("show_collapse_button") == "1" });
+ option = Option(def, "show_collapse_button");
+ m_optgroup_gui->append_single_option_line(option);
+
+ def.label = L("Suppress to open hyperlink in browser");
+ def.type = coBool;
+ def.tooltip = L("If enabled, the descriptions of configuration parameters in settings tabs wouldn't work as hyperlinks. "
+ "If disabled, the descriptions of configuration parameters in settings tabs will work as hyperlinks.");
+ def.set_default_value(new ConfigOptionBool{ app_config->get("suppress_hyperlinks") == "1" });
+ option = Option(def, "suppress_hyperlinks");
+ m_optgroup_gui->append_single_option_line(option);
+
+ def.label = L("Use custom size for toolbar icons");
+ def.type = coBool;
+ def.tooltip = L("If enabled, you can change size of toolbar icons manually.");
+ def.set_default_value(new ConfigOptionBool{ app_config->get("use_custom_toolbar_size") == "1" });
+ option = Option(def, "use_custom_toolbar_size");
+ m_optgroup_gui->append_single_option_line(option);
+ }
+
+ activate_options_tab(m_optgroup_gui);
- auto sizer = new wxBoxSizer(wxVERTICAL);
- sizer->Add(m_optgroup_general->sizer, 0, wxEXPAND | wxBOTTOM | wxLEFT | wxRIGHT, 10);
- sizer->Add(m_optgroup_camera->sizer, 0, wxEXPAND | wxBOTTOM | wxLEFT | wxRIGHT, 10);
- sizer->Add(m_optgroup_gui->sizer, 0, wxEXPAND | wxBOTTOM | wxLEFT | wxRIGHT, 10);
+ if (is_editor) {
+ create_icon_size_slider();
+ m_icon_size_sizer->ShowItems(app_config->get("use_custom_toolbar_size") == "1");
+
+ create_settings_mode_widget();
+ }
- SetFont(wxGetApp().normal_font());
+#if ENABLE_ENVIRONMENT_MAP
+ if (is_editor) {
+ // Add "Render" tab
+ m_optgroup_render = create_options_tab(_L("Render"), tabs);
+ m_optgroup_render->m_on_change = [this](t_config_option_key opt_key, boost::any value) {
+ m_values[opt_key] = boost::any_cast<bool>(value) ? "1" : "0";
+ };
+
+ def.label = L("Use environment map");
+ def.type = coBool;
+ def.tooltip = L("If enabled, renders object using the environment map.");
+ def.set_default_value(new ConfigOptionBool{ app_config->get("use_environment_map") == "1" });
+ option = Option(def, "use_environment_map");
+ m_optgroup_render->append_single_option_line(option);
+
+ activate_options_tab(m_optgroup_render);
+ }
+#endif // ENABLE_ENVIRONMENT_MAP
+
+ auto sizer = new wxBoxSizer(wxVERTICAL);
+ sizer->Add(tabs, 1, wxEXPAND | wxTOP | wxLEFT | wxRIGHT, 5);
auto buttons = CreateStdDialogButtonSizer(wxOK | wxCANCEL);
wxButton* btn = static_cast<wxButton*>(FindWindowById(wxID_OK, this));
btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { accept(); });
- sizer->Add(buttons, 0, wxALIGN_CENTER_HORIZONTAL | wxBOTTOM, 10);
+ sizer->Add(buttons, 0, wxALIGN_CENTER_HORIZONTAL | wxBOTTOM | wxTOP, 10);
SetSizer(sizer);
sizer->SetSizeHints(this);
+ this->CenterOnParent();
}
void PreferencesDialog::accept()
{
- if (m_values.find("no_defaults") != m_values.end()) {
- warning_catcher(this, wxString::Format(_(L("You need to restart %s to make the changes effective.")), SLIC3R_APP_NAME));
+ if (m_values.find("no_defaults") != m_values.end())
+ warning_catcher(this, wxString::Format(_L("You need to restart %s to make the changes effective."), SLIC3R_APP_NAME));
+
+ auto app_config = get_app_config();
+
+ m_seq_top_layer_only_changed = false;
+ if (auto it = m_values.find("seq_top_layer_only"); it != m_values.end())
+ m_seq_top_layer_only_changed = app_config->get("seq_top_layer_only") != it->second;
+
+ m_settings_layout_changed = false;
+ for (const std::string& key : { "old_settings_layout_mode",
+ "new_settings_layout_mode",
+ "dlg_settings_layout_mode" })
+ {
+ auto it = m_values.find(key);
+ if (it != m_values.end() && app_config->get(key) != it->second) {
+ m_settings_layout_changed = true;
+ break;
+ }
}
- auto app_config = get_app_config();
- for (std::map<std::string, std::string>::iterator it = m_values.begin(); it != m_values.end(); ++it) {
- app_config->set(it->first, it->second);
+ for (const std::string& key : {"default_action_on_close_application", "default_action_on_select_preset"}) {
+ auto it = m_values.find(key);
+ if (it != m_values.end() && it->second != "none" && app_config->get(key) != "none")
+ m_values.erase(it); // we shouldn't change value, if some of those parameters was selected, and then deselected
}
+ for (std::map<std::string, std::string>::iterator it = m_values.begin(); it != m_values.end(); ++it)
+ app_config->set(it->first, it->second);
+
+ app_config->save();
EndModal(wxID_OK);
- // Nothify the UI to update itself from the ini file.
- wxGetApp().update_ui_from_settings();
+ if (m_settings_layout_changed)
+ ;// application will be recreated after Preference dialog will be destroyed
+ else
+ // Nothify the UI to update itself from the ini file.
+ wxGetApp().update_ui_from_settings();
}
void PreferencesDialog::on_dpi_changed(const wxRect &suggested_rect)
@@ -212,14 +417,14 @@ void PreferencesDialog::create_icon_size_slider()
m_icon_size_sizer = new wxBoxSizer(wxHORIZONTAL);
- wxWindow* parent = m_optgroup_gui->ctrl_parent();
+ wxWindow* parent = m_optgroup_gui->parent();
if (isOSX)
// For correct rendering of the slider and value label under OSX
// we should use system default background
parent->SetBackgroundStyle(wxBG_STYLE_ERASE);
- auto label = new wxStaticText(parent, wxID_ANY, _(L("Icon size in a respect to the default size")) + " (%) :");
+ auto label = new wxStaticText(parent, wxID_ANY, _L("Icon size in a respect to the default size") + " (%) :");
m_icon_size_sizer->Add(label, 0, wxALIGN_CENTER_VERTICAL| wxRIGHT | (isOSX ? 0 : wxLEFT), em);
@@ -234,7 +439,7 @@ void PreferencesDialog::create_icon_size_slider()
slider->SetTickFreq(10);
slider->SetPageSize(10);
- slider->SetToolTip(_(L("Select toolbar icon size in respect to the default one.")));
+ slider->SetToolTip(_L("Select toolbar icon size in respect to the default one."));
m_icon_size_sizer->Add(slider, 1, wxEXPAND);
@@ -263,6 +468,36 @@ void PreferencesDialog::create_icon_size_slider()
m_optgroup_gui->sizer->Add(m_icon_size_sizer, 0, wxEXPAND | wxALL, em);
}
+void PreferencesDialog::create_settings_mode_widget()
+{
+ wxString choices[] = { _L("Old regular layout with the tab bar"),
+ _L("New layout, access via settings button in the top menu"),
+ _L("Settings in non-modal window") };
+
+ auto app_config = get_app_config();
+ int selection = app_config->get("old_settings_layout_mode") == "1" ? 0 :
+ app_config->get("new_settings_layout_mode") == "1" ? 1 :
+ app_config->get("dlg_settings_layout_mode") == "1" ? 2 : 0;
+
+ wxWindow* parent = m_optgroup_gui->parent();
+
+ m_layout_mode_box = new wxRadioBox(parent, wxID_ANY, _L("Layout Options"), wxDefaultPosition, wxDefaultSize,
+ WXSIZEOF(choices), choices, 3, wxRA_SPECIFY_ROWS);
+ m_layout_mode_box->SetFont(wxGetApp().normal_font());
+ m_layout_mode_box->SetSelection(selection);
+
+ m_layout_mode_box->Bind(wxEVT_RADIOBOX, [this](wxCommandEvent& e) {
+ int selection = e.GetSelection();
+ m_values["old_settings_layout_mode"] = boost::any_cast<bool>(selection == 0) ? "1" : "0";
+ m_values["new_settings_layout_mode"] = boost::any_cast<bool>(selection == 1) ? "1" : "0";
+ m_values["dlg_settings_layout_mode"] = boost::any_cast<bool>(selection == 2) ? "1" : "0";
+ });
+
+ auto sizer = new wxBoxSizer(wxHORIZONTAL);
+ sizer->Add(m_layout_mode_box, 1, wxALIGN_CENTER_VERTICAL);
+ m_optgroup_gui->sizer->Add(sizer, 0, wxEXPAND);
+}
+
} // GUI
-} // Slic3r \ No newline at end of file
+} // Slic3r
diff --git a/src/slic3r/GUI/Preferences.hpp b/src/slic3r/GUI/Preferences.hpp
index 35bf2b8c5..68574fbcc 100644
--- a/src/slic3r/GUI/Preferences.hpp
+++ b/src/slic3r/GUI/Preferences.hpp
@@ -7,6 +7,8 @@
#include <wx/dialog.h>
#include <map>
+class wxRadioBox;
+
namespace Slic3r {
namespace GUI {
@@ -18,12 +20,21 @@ class PreferencesDialog : public DPIDialog
std::shared_ptr<ConfigOptionsGroup> m_optgroup_general;
std::shared_ptr<ConfigOptionsGroup> m_optgroup_camera;
std::shared_ptr<ConfigOptionsGroup> m_optgroup_gui;
+#if ENABLE_ENVIRONMENT_MAP
+ std::shared_ptr<ConfigOptionsGroup> m_optgroup_render;
+#endif // ENABLE_ENVIRONMENT_MAP
wxSizer* m_icon_size_sizer;
+ wxRadioBox* m_layout_mode_box;
bool isOSX {false};
+ bool m_settings_layout_changed {false};
+ bool m_seq_top_layer_only_changed{ false };
public:
PreferencesDialog(wxWindow* parent);
~PreferencesDialog() {}
+ bool settings_layout_changed() const { return m_settings_layout_changed; }
+ bool seq_top_layer_only_changed() const { return m_seq_top_layer_only_changed; }
+
void build();
void accept();
@@ -31,6 +42,7 @@ protected:
void on_dpi_changed(const wxRect &suggested_rect) override;
void layout();
void create_icon_size_slider();
+ void create_settings_mode_widget();
};
} // GUI
diff --git a/src/slic3r/GUI/PresetComboBoxes.cpp b/src/slic3r/GUI/PresetComboBoxes.cpp
new file mode 100644
index 000000000..8dd35a591
--- /dev/null
+++ b/src/slic3r/GUI/PresetComboBoxes.cpp
@@ -0,0 +1,1099 @@
+#include "PresetComboBoxes.hpp"
+
+#include <cstddef>
+#include <vector>
+#include <string>
+#include <boost/algorithm/string.hpp>
+
+#include <wx/sizer.h>
+#include <wx/stattext.h>
+#include <wx/textctrl.h>
+#include <wx/button.h>
+#include <wx/statbox.h>
+#include <wx/colordlg.h>
+#include <wx/wupdlock.h>
+#include <wx/menu.h>
+
+#include "libslic3r/libslic3r.h"
+#include "libslic3r/PrintConfig.hpp"
+#include "libslic3r/PresetBundle.hpp"
+
+#include "GUI.hpp"
+#include "GUI_App.hpp"
+#include "Plater.hpp"
+#include "MainFrame.hpp"
+#include "format.hpp"
+#include "Tab.hpp"
+#include "ConfigWizard.hpp"
+#include "../Utils/ASCIIFolding.hpp"
+#include "../Utils/FixModelByWin10.hpp"
+#include "../Utils/UndoRedo.hpp"
+#include "BitmapCache.hpp"
+#include "PhysicalPrinterDialog.hpp"
+#include "SavePresetDialog.hpp"
+
+// A workaround for a set of issues related to text fitting into gtk widgets:
+// See e.g.: https://github.com/prusa3d/PrusaSlicer/issues/4584
+#if defined(__WXGTK20__) || defined(__WXGTK3__)
+ #include <glib-2.0/glib-object.h>
+ #include <pango-1.0/pango/pango-layout.h>
+ #include <gtk/gtk.h>
+#endif
+
+using Slic3r::GUI::format_wxstr;
+
+namespace Slic3r {
+namespace GUI {
+
+#define BORDER_W 10
+
+// ---------------------------------
+// *** PresetComboBox ***
+// ---------------------------------
+
+/* For PresetComboBox we use bitmaps that are created from images that are already scaled appropriately for Retina
+ * (Contrary to the intuition, the `scale` argument for Bitmap's constructor doesn't mean
+ * "please scale this to such and such" but rather
+ * "the wxImage is already sized for backing scale such and such". )
+ * Unfortunately, the constructor changes the size of wxBitmap too.
+ * Thus We need to use unscaled size value for bitmaps that we use
+ * to avoid scaled size of control items.
+ * For this purpose control drawing methods and
+ * control size calculation methods (virtual) are overridden.
+ **/
+
+PresetComboBox::PresetComboBox(wxWindow* parent, Preset::Type preset_type, const wxSize& size) :
+ wxBitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, size, 0, nullptr, wxCB_READONLY),
+ m_type(preset_type),
+ m_last_selected(wxNOT_FOUND),
+ m_em_unit(em_unit(this)),
+ m_preset_bundle(wxGetApp().preset_bundle)
+{
+ SetFont(wxGetApp().normal_font());
+#ifdef _WIN32
+ // Workaround for ignoring CBN_EDITCHANGE events, which are processed after the content of the combo box changes, so that
+ // the index of the item inside CBN_EDITCHANGE may no more be valid.
+ EnableTextChangedEvents(false);
+#endif /* _WIN32 */
+
+ switch (m_type)
+ {
+ case Preset::TYPE_PRINT: {
+ m_collection = &m_preset_bundle->prints;
+ m_main_bitmap_name = "cog";
+ break;
+ }
+ case Preset::TYPE_FILAMENT: {
+ m_collection = &m_preset_bundle->filaments;
+ m_main_bitmap_name = "spool";
+ break;
+ }
+ case Preset::TYPE_SLA_PRINT: {
+ m_collection = &m_preset_bundle->sla_prints;
+ m_main_bitmap_name = "cog";
+ break;
+ }
+ case Preset::TYPE_SLA_MATERIAL: {
+ m_collection = &m_preset_bundle->sla_materials;
+ m_main_bitmap_name = "resin";
+ break;
+ }
+ case Preset::TYPE_PRINTER: {
+ m_collection = &m_preset_bundle->printers;
+ m_main_bitmap_name = "printer";
+ break;
+ }
+ default: break;
+ }
+
+ m_bitmapCompatible = ScalableBitmap(this, "flag_green");
+ m_bitmapIncompatible = ScalableBitmap(this, "flag_red");
+
+ // parameters for an icon's drawing
+ fill_width_height();
+
+ Bind(wxEVT_MOUSEWHEEL, [this](wxMouseEvent& e) {
+ if (m_suppress_change)
+ e.StopPropagation();
+ else
+ e.Skip();
+ });
+ Bind(wxEVT_COMBOBOX_DROPDOWN, [this](wxCommandEvent&) { m_suppress_change = false; });
+ Bind(wxEVT_COMBOBOX_CLOSEUP, [this](wxCommandEvent&) { m_suppress_change = true; });
+
+ Bind(wxEVT_COMBOBOX, [this](wxCommandEvent& evt) {
+ // see https://github.com/prusa3d/PrusaSlicer/issues/3889
+ // Under OSX: in case of use of a same names written in different case (like "ENDER" and "Ender")
+ // m_presets_choice->GetSelection() will return first item, because search in PopupListCtrl is case-insensitive.
+ // So, use GetSelection() from event parameter
+ auto selected_item = evt.GetSelection();
+
+ auto marker = reinterpret_cast<Marker>(this->GetClientData(selected_item));
+ if (marker >= LABEL_ITEM_DISABLED && marker < LABEL_ITEM_MAX)
+ this->SetSelection(this->m_last_selected);
+ else if (on_selection_changed && (m_last_selected != selected_item || m_collection->current_is_dirty())) {
+ m_last_selected = selected_item;
+ on_selection_changed(selected_item);
+ evt.StopPropagation();
+ }
+ evt.Skip();
+ });
+}
+
+PresetComboBox::~PresetComboBox()
+{
+}
+
+BitmapCache& PresetComboBox::bitmap_cache()
+{
+ static BitmapCache bmps;
+ return bmps;
+}
+
+void PresetComboBox::set_label_marker(int item, LabelItemType label_item_type)
+{
+ this->SetClientData(item, (void*)label_item_type);
+}
+
+bool PresetComboBox::set_printer_technology(PrinterTechnology pt)
+{
+ if (printer_technology != pt) {
+ printer_technology = pt;
+ return true;
+ }
+ return false;
+}
+
+void PresetComboBox::invalidate_selection()
+{
+ m_last_selected = INT_MAX; // this value means that no one item is selected
+}
+
+void PresetComboBox::validate_selection(bool predicate/*=false*/)
+{
+ if (predicate ||
+ // just in case: mark m_last_selected as a first added element
+ m_last_selected == INT_MAX)
+ m_last_selected = GetCount() - 1;
+}
+
+void PresetComboBox::update_selection()
+{
+ /* If selected_preset_item is still equal to INT_MAX, it means that
+ * there is no presets added to the list.
+ * So, select last combobox item ("Add/Remove preset")
+ */
+ validate_selection();
+
+ SetSelection(m_last_selected);
+ SetToolTip(GetString(m_last_selected));
+
+// A workaround for a set of issues related to text fitting into gtk widgets:
+// See e.g.: https://github.com/prusa3d/PrusaSlicer/issues/4584
+#if defined(__WXGTK20__) || defined(__WXGTK3__)
+ GList* cells = gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(m_widget));
+
+ // 'cells' contains the GtkCellRendererPixBuf for the icon,
+ // 'cells->next' contains GtkCellRendererText for the text we need to ellipsize
+ if (!cells || !cells->next) return;
+
+ auto cell = static_cast<GtkCellRendererText *>(cells->next->data);
+
+ if (!cell) return;
+
+ g_object_set(G_OBJECT(cell), "ellipsize", PANGO_ELLIPSIZE_END, NULL);
+
+ // Only the list of cells must be freed, the renderer isn't ours to free
+ g_list_free(cells);
+#endif
+}
+
+void PresetComboBox::update(std::string select_preset_name)
+{
+ Freeze();
+ Clear();
+ invalidate_selection();
+
+ const std::deque<Preset>& presets = m_collection->get_presets();
+
+ std::map<wxString, std::pair<wxBitmap*, bool>> nonsys_presets;
+ std::map<wxString, wxBitmap*> incomp_presets;
+
+ wxString selected = "";
+ if (!presets.front().is_visible)
+ set_label_marker(Append(separator(L("System presets")), wxNullBitmap));
+
+ for (size_t i = presets.front().is_visible ? 0 : m_collection->num_default_presets(); i < presets.size(); ++i)
+ {
+ const Preset& preset = presets[i];
+ if (!preset.is_visible || !preset.is_compatible)
+ continue;
+
+ // marker used for disable incompatible printer models for the selected physical printer
+ bool is_enabled = m_type == Preset::TYPE_PRINTER && printer_technology != ptAny ? preset.printer_technology() == printer_technology : true;
+ if (select_preset_name.empty() && is_enabled)
+ select_preset_name = preset.name;
+
+ std::string bitmap_key = "cb";
+ if (m_type == Preset::TYPE_PRINTER) {
+ bitmap_key += "_printer";
+ if (preset.printer_technology() == ptSLA)
+ bitmap_key += "_sla";
+ }
+ std::string main_icon_name = m_type == Preset::TYPE_PRINTER && preset.printer_technology() == ptSLA ? "sla_printer" : m_main_bitmap_name;
+
+ wxBitmap* bmp = get_bmp(bitmap_key, main_icon_name, "lock_closed", is_enabled, preset.is_compatible, preset.is_system || preset.is_default);
+ assert(bmp);
+
+ if (!is_enabled)
+ incomp_presets.emplace(wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()), bmp);
+ else if (preset.is_default || preset.is_system)
+ {
+ Append(wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()), *bmp);
+ validate_selection(preset.name == select_preset_name);
+ }
+ else
+ {
+ nonsys_presets.emplace(wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()), std::pair<wxBitmap*, bool>(bmp, is_enabled));
+ if (preset.name == select_preset_name || (select_preset_name.empty() && is_enabled))
+ selected = wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str());
+ }
+ if (i + 1 == m_collection->num_default_presets())
+ set_label_marker(Append(separator(L("System presets")), wxNullBitmap));
+ }
+ if (!nonsys_presets.empty())
+ {
+ set_label_marker(Append(separator(L("User presets")), wxNullBitmap));
+ for (std::map<wxString, std::pair<wxBitmap*, bool>>::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) {
+ int item_id = Append(it->first, *it->second.first);
+ bool is_enabled = it->second.second;
+ if (!is_enabled)
+ set_label_marker(item_id, LABEL_ITEM_DISABLED);
+ validate_selection(it->first == selected);
+ }
+ }
+ if (!incomp_presets.empty())
+ {
+ set_label_marker(Append(separator(L("Incompatible presets")), wxNullBitmap));
+ for (std::map<wxString, wxBitmap*>::iterator it = incomp_presets.begin(); it != incomp_presets.end(); ++it) {
+ set_label_marker(Append(it->first, *it->second), LABEL_ITEM_DISABLED);
+ }
+ }
+
+ update_selection();
+ Thaw();
+}
+
+void PresetComboBox::edit_physical_printer()
+{
+ if (!m_preset_bundle->physical_printers.has_selection())
+ return;
+
+ PhysicalPrinterDialog dlg(this->GetParent(),this->GetString(this->GetSelection()));
+ if (dlg.ShowModal() == wxID_OK)
+ update();
+}
+
+void PresetComboBox::add_physical_printer()
+{
+ if (PhysicalPrinterDialog(this->GetParent(), wxEmptyString).ShowModal() == wxID_OK)
+ update();
+}
+
+bool PresetComboBox::del_physical_printer(const wxString& note_string/* = wxEmptyString*/)
+{
+ const std::string& printer_name = m_preset_bundle->physical_printers.get_selected_full_printer_name();
+ if (printer_name.empty())
+ return false;
+
+ wxString msg;
+ if (!note_string.IsEmpty())
+ msg += note_string + "\n";
+ msg += format_wxstr(_L("Are you sure you want to delete \"%1%\" printer?"), printer_name);
+
+ if (wxMessageDialog(this, msg, _L("Delete Physical Printer"), wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION).ShowModal() != wxID_YES)
+ return false;
+
+ m_preset_bundle->physical_printers.delete_selected_printer();
+
+ this->update();
+
+ if (dynamic_cast<PlaterPresetComboBox*>(this) != nullptr)
+ wxGetApp().get_tab(m_type)->update_preset_choice();
+ else if (dynamic_cast<TabPresetComboBox*>(this) != nullptr)
+ {
+ wxGetApp().get_tab(m_type)->update_btns_enabling();
+ wxGetApp().plater()->sidebar().update_presets(m_type);
+ }
+
+ return true;
+}
+
+void PresetComboBox::update()
+{
+ this->update(into_u8(this->GetString(this->GetSelection())));
+}
+
+void PresetComboBox::msw_rescale()
+{
+ m_em_unit = em_unit(this);
+
+ m_bitmapIncompatible.msw_rescale();
+ m_bitmapCompatible.msw_rescale();
+
+ // parameters for an icon's drawing
+ fill_width_height();
+
+ // update the control to redraw the icons
+ update();
+}
+
+void PresetComboBox::fill_width_height()
+{
+ // To avoid asserts, each added bitmap to wxBitmapCombobox should be the same size, so
+ // set a bitmap's height to m_bitmapCompatible->GetHeight() and norm_icon_width to m_bitmapCompatible->GetWidth()
+ icon_height = m_bitmapCompatible.GetBmpHeight();
+ norm_icon_width = m_bitmapCompatible.GetBmpWidth();
+
+ /* It's supposed that standard size of an icon is 16px*16px for 100% scaled display.
+ * So set sizes for solid_colored icons used for filament preset
+ * and scale them in respect to em_unit value
+ */
+ const float scale_f = (float)m_em_unit * 0.1f;
+
+ thin_icon_width = lroundf(8 * scale_f); // analogue to 8px;
+ wide_icon_width = norm_icon_width + thin_icon_width;
+
+ space_icon_width = lroundf(2 * scale_f);
+ thin_space_icon_width = 2 * space_icon_width;
+ wide_space_icon_width = 3 * space_icon_width;
+}
+
+wxString PresetComboBox::separator(const std::string& label)
+{
+ return wxString::FromUTF8(separator_head()) + _(label) + wxString::FromUTF8(separator_tail());
+}
+
+wxBitmap* PresetComboBox::get_bmp( std::string bitmap_key, bool wide_icons, const std::string& main_icon_name,
+ bool is_compatible/* = true*/, bool is_system/* = false*/, bool is_single_bar/* = false*/,
+ std::string filament_rgb/* = ""*/, std::string extruder_rgb/* = ""*/)
+{
+ // If the filament preset is not compatible and there is a "red flag" icon loaded, show it left
+ // to the filament color image.
+ if (wide_icons)
+ bitmap_key += is_compatible ? ",cmpt" : ",ncmpt";
+
+ bitmap_key += is_system ? ",syst" : ",nsyst";
+ bitmap_key += ",h" + std::to_string(icon_height);
+ if (wxGetApp().dark_mode())
+ bitmap_key += ",dark";
+
+ wxBitmap* bmp = bitmap_cache().find(bitmap_key);
+ if (bmp == nullptr) {
+ // Create the bitmap with color bars.
+ std::vector<wxBitmap> bmps;
+ if (wide_icons)
+ // Paint a red flag for incompatible presets.
+ bmps.emplace_back(is_compatible ? bitmap_cache().mkclear(norm_icon_width, icon_height) : m_bitmapIncompatible.bmp());
+
+ if (m_type == Preset::TYPE_FILAMENT && !filament_rgb.empty())
+ {
+ unsigned char rgb[3];
+ // Paint the color bars.
+ bitmap_cache().parse_color(filament_rgb, rgb);
+ bmps.emplace_back(bitmap_cache().mksolid(is_single_bar ? wide_icon_width : norm_icon_width, icon_height, rgb));
+ if (!is_single_bar) {
+ bitmap_cache().parse_color(extruder_rgb, rgb);
+ bmps.emplace_back(bitmap_cache().mksolid(thin_icon_width, icon_height, rgb));
+ }
+ // Paint a lock at the system presets.
+ bmps.emplace_back(bitmap_cache().mkclear(space_icon_width, icon_height));
+ }
+ else
+ {
+ // Paint the color bars.
+ bmps.emplace_back(bitmap_cache().mkclear(thin_space_icon_width, icon_height));
+ bmps.emplace_back(create_scaled_bitmap(main_icon_name));
+ // Paint a lock at the system presets.
+ bmps.emplace_back(bitmap_cache().mkclear(wide_space_icon_width, icon_height));
+ }
+ bmps.emplace_back(is_system ? create_scaled_bitmap("lock_closed") : bitmap_cache().mkclear(norm_icon_width, icon_height));
+ bmp = bitmap_cache().insert(bitmap_key, bmps);
+ }
+
+ return bmp;
+}
+
+wxBitmap* PresetComboBox::get_bmp( std::string bitmap_key, const std::string& main_icon_name, const std::string& next_icon_name,
+ bool is_enabled/* = true*/, bool is_compatible/* = true*/, bool is_system/* = false*/)
+{
+ bitmap_key += !is_enabled ? "_disabled" : "";
+ bitmap_key += is_compatible ? ",cmpt" : ",ncmpt";
+ bitmap_key += is_system ? ",syst" : ",nsyst";
+ bitmap_key += ",h" + std::to_string(icon_height);
+ if (wxGetApp().dark_mode())
+ bitmap_key += ",dark";
+
+ wxBitmap* bmp = bitmap_cache().find(bitmap_key);
+ if (bmp == nullptr) {
+ // Create the bitmap with color bars.
+ std::vector<wxBitmap> bmps;
+ bmps.emplace_back(m_type == Preset::TYPE_PRINTER ? create_scaled_bitmap(main_icon_name, this, 16, !is_enabled) :
+ is_compatible ? m_bitmapCompatible.bmp() : m_bitmapIncompatible.bmp());
+ // Paint a lock at the system presets.
+ bmps.emplace_back(is_system ? create_scaled_bitmap(next_icon_name, this, 16, !is_enabled) : bitmap_cache().mkclear(norm_icon_width, icon_height));
+ bmp = bitmap_cache().insert(bitmap_key, bmps);
+ }
+
+ return bmp;
+}
+
+bool PresetComboBox::is_selected_physical_printer()
+{
+ auto selected_item = this->GetSelection();
+ auto marker = reinterpret_cast<Marker>(this->GetClientData(selected_item));
+ return marker == LABEL_ITEM_PHYSICAL_PRINTER;
+}
+
+bool PresetComboBox::selection_is_changed_according_to_physical_printers()
+{
+ if (m_type != Preset::TYPE_PRINTER || !is_selected_physical_printer())
+ return false;
+
+ PhysicalPrinterCollection& physical_printers = m_preset_bundle->physical_printers;
+
+ std::string selected_string = this->GetString(this->GetSelection()).ToUTF8().data();
+
+ std::string old_printer_full_name, old_printer_preset;
+ if (physical_printers.has_selection()) {
+ old_printer_full_name = physical_printers.get_selected_full_printer_name();
+ old_printer_preset = physical_printers.get_selected_printer_preset_name();
+ }
+ else
+ old_printer_preset = m_collection->get_edited_preset().name;
+ // Select related printer preset on the Printer Settings Tab
+ physical_printers.select_printer(selected_string);
+ std::string preset_name = physical_printers.get_selected_printer_preset_name();
+
+ // if new preset wasn't selected, there is no need to call update preset selection
+ if (old_printer_preset == preset_name) {
+ // we need just to update according Plater<->Tab PresetComboBox
+ if (dynamic_cast<PlaterPresetComboBox*>(this)!=nullptr) {
+ wxGetApp().get_tab(m_type)->update_preset_choice();
+ // Synchronize config.ini with the current selections.
+ m_preset_bundle->export_selections(*wxGetApp().app_config);
+ }
+ else if (dynamic_cast<TabPresetComboBox*>(this)!=nullptr)
+ wxGetApp().sidebar().update_presets(m_type);
+
+ this->update();
+ return true;
+ }
+
+ Tab* tab = wxGetApp().get_tab(Preset::TYPE_PRINTER);
+ if (tab)
+ tab->select_preset(preset_name, false, old_printer_full_name);
+ return true;
+}
+
+#ifdef __APPLE__
+bool PresetComboBox::OnAddBitmap(const wxBitmap& bitmap)
+{
+ if (bitmap.IsOk())
+ {
+ // we should use scaled! size values of bitmap
+ int width = (int)bitmap.GetScaledWidth();
+ int height = (int)bitmap.GetScaledHeight();
+
+ if (m_usedImgSize.x < 0)
+ {
+ // If size not yet determined, get it from this image.
+ m_usedImgSize.x = width;
+ m_usedImgSize.y = height;
+
+ // Adjust control size to vertically fit the bitmap
+ wxWindow* ctrl = GetControl();
+ ctrl->InvalidateBestSize();
+ wxSize newSz = ctrl->GetBestSize();
+ wxSize sz = ctrl->GetSize();
+ if (newSz.y > sz.y)
+ ctrl->SetSize(sz.x, newSz.y);
+ else
+ DetermineIndent();
+ }
+
+ wxCHECK_MSG(width == m_usedImgSize.x && height == m_usedImgSize.y,
+ false,
+ "you can only add images of same size");
+
+ return true;
+ }
+
+ return false;
+}
+
+void PresetComboBox::OnDrawItem(wxDC& dc,
+ const wxRect& rect,
+ int item,
+ int flags) const
+{
+ const wxBitmap& bmp = *(static_cast<wxBitmap*>(m_bitmaps[item]));
+ if (bmp.IsOk())
+ {
+ // we should use scaled! size values of bitmap
+ wxCoord w = bmp.GetScaledWidth();
+ wxCoord h = bmp.GetScaledHeight();
+
+ const int imgSpacingLeft = 4;
+
+ // Draw the image centered
+ dc.DrawBitmap(bmp,
+ rect.x + (m_usedImgSize.x - w) / 2 + imgSpacingLeft,
+ rect.y + (rect.height - h) / 2,
+ true);
+ }
+
+ wxString text = GetString(item);
+ if (!text.empty())
+ dc.DrawText(text,
+ rect.x + m_imgAreaWidth + 1,
+ rect.y + (rect.height - dc.GetCharHeight()) / 2);
+}
+#endif
+
+
+// ---------------------------------
+// *** PlaterPresetComboBox ***
+// ---------------------------------
+
+PlaterPresetComboBox::PlaterPresetComboBox(wxWindow *parent, Preset::Type preset_type) :
+ PresetComboBox(parent, preset_type, wxSize(15 * wxGetApp().em_unit(), -1))
+{
+ Bind(wxEVT_COMBOBOX, [this](wxCommandEvent &evt) {
+ auto selected_item = evt.GetSelection();
+
+ auto marker = reinterpret_cast<Marker>(this->GetClientData(selected_item));
+ if (marker >= LABEL_ITEM_MARKER && marker < LABEL_ITEM_MAX) {
+ this->SetSelection(this->m_last_selected);
+ evt.StopPropagation();
+ if (marker == LABEL_ITEM_WIZARD_PRINTERS)
+ show_add_menu();
+ else
+ {
+ ConfigWizard::StartPage sp = ConfigWizard::SP_WELCOME;
+ switch (marker) {
+ case LABEL_ITEM_WIZARD_FILAMENTS: sp = ConfigWizard::SP_FILAMENTS; break;
+ case LABEL_ITEM_WIZARD_MATERIALS: sp = ConfigWizard::SP_MATERIALS; break;
+ default: break;
+ }
+ wxTheApp->CallAfter([sp]() { wxGetApp().run_wizard(ConfigWizard::RR_USER, sp); });
+ }
+ } else if (marker == LABEL_ITEM_PHYSICAL_PRINTER || this->m_last_selected != selected_item || m_collection->current_is_dirty() ) {
+ this->m_last_selected = selected_item;
+ evt.SetInt(this->m_type);
+ evt.Skip();
+ } else {
+ evt.StopPropagation();
+ }
+ });
+
+ if (m_type == Preset::TYPE_FILAMENT)
+ {
+ Bind(wxEVT_LEFT_DOWN, [this](wxMouseEvent &event) {
+ const Preset* selected_preset = m_collection->find_preset(m_preset_bundle->filament_presets[m_extruder_idx]);
+ // Wide icons are shown if the currently selected preset is not compatible with the current printer,
+ // and red flag is drown in front of the selected preset.
+ bool wide_icons = selected_preset && !selected_preset->is_compatible;
+ float scale = m_em_unit*0.1f;
+
+ int shifl_Left = wide_icons ? int(scale * 16 + 0.5) : 0;
+#if defined(wxBITMAPCOMBOBOX_OWNERDRAWN_BASED)
+ shifl_Left += int(scale * 4 + 0.5f); // IMAGE_SPACING_RIGHT = 4 for wxBitmapComboBox -> Space left of image
+#endif
+ int icon_right_pos = shifl_Left + int(scale * (24+4) + 0.5);
+ int mouse_pos = event.GetLogicalPosition(wxClientDC(this)).x;
+ if (mouse_pos < shifl_Left || mouse_pos > icon_right_pos ) {
+ // Let the combo box process the mouse click.
+ event.Skip();
+ return;
+ }
+
+ // Swallow the mouse click and open the color picker.
+
+ // get current color
+ DynamicPrintConfig* cfg = wxGetApp().get_tab(Preset::TYPE_PRINTER)->get_config();
+ auto colors = static_cast<ConfigOptionStrings*>(cfg->option("extruder_colour")->clone());
+ wxColour clr(colors->values[m_extruder_idx]);
+ if (!clr.IsOk())
+ clr = wxColour(0,0,0); // Don't set alfa to transparence
+
+ auto data = new wxColourData();
+ data->SetChooseFull(1);
+ data->SetColour(clr);
+
+ wxColourDialog dialog(this, data);
+ dialog.CenterOnParent();
+ if (dialog.ShowModal() == wxID_OK)
+ {
+ colors->values[m_extruder_idx] = dialog.GetColourData().GetColour().GetAsString(wxC2S_HTML_SYNTAX).ToStdString();
+
+ DynamicPrintConfig cfg_new = *cfg;
+ cfg_new.set_key_value("extruder_colour", colors);
+
+ wxGetApp().get_tab(Preset::TYPE_PRINTER)->load_config(cfg_new);
+ this->update();
+ wxGetApp().plater()->on_config_change(cfg_new);
+ }
+ });
+ }
+
+ edit_btn = new ScalableButton(parent, wxID_ANY, "cog");
+ edit_btn->SetToolTip(_L("Click to edit preset"));
+
+ edit_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent)
+ {
+ // In a case of a physical printer, for its editing open PhysicalPrinterDialog
+ if (m_type == Preset::TYPE_PRINTER/* && this->is_selected_physical_printer()*/) {
+ this->show_edit_menu();
+ return;
+ }
+
+ if (!switch_to_tab())
+ return;
+
+ /* In a case of a multi-material printing, for editing another Filament Preset
+ * it's needed to select this preset for the "Filament settings" Tab
+ */
+ if (m_type == Preset::TYPE_FILAMENT && wxGetApp().extruders_edited_cnt() > 1)
+ {
+ const std::string& selected_preset = GetString(GetSelection()).ToUTF8().data();
+
+ // Call select_preset() only if there is new preset and not just modified
+ if ( !boost::algorithm::ends_with(selected_preset, Preset::suffix_modified()) )
+ {
+ const std::string& preset_name = wxGetApp().preset_bundle->filaments.get_preset_name_by_alias(selected_preset);
+ wxGetApp().get_tab(m_type)->select_preset(preset_name);
+ }
+ }
+ });
+}
+
+PlaterPresetComboBox::~PlaterPresetComboBox()
+{
+ if (edit_btn)
+ edit_btn->Destroy();
+}
+
+bool PlaterPresetComboBox::switch_to_tab()
+{
+ Tab* tab = wxGetApp().get_tab(m_type);
+ if (!tab)
+ return false;
+
+ int page_id = wxGetApp().tab_panel()->FindPage(tab);
+ if (page_id == wxNOT_FOUND)
+ return false;
+
+ wxGetApp().tab_panel()->SetSelection(page_id);
+ // Switch to Settings NotePad
+ wxGetApp().mainframe->select_tab();
+ return true;
+}
+
+void PlaterPresetComboBox::show_add_menu()
+{
+ wxMenu* menu = new wxMenu();
+
+ append_menu_item(menu, wxID_ANY, _L("Add/Remove presets"), "",
+ [this](wxCommandEvent&) {
+ wxTheApp->CallAfter([]() { wxGetApp().run_wizard(ConfigWizard::RR_USER, ConfigWizard::SP_PRINTERS); });
+ }, "edit_uni", menu, []() { return true; }, wxGetApp().plater());
+
+ append_menu_item(menu, wxID_ANY, _L("Add physical printer"), "",
+ [this](wxCommandEvent&) {
+ PhysicalPrinterDialog dlg(this->GetParent(), wxEmptyString);
+ if (dlg.ShowModal() == wxID_OK)
+ update();
+ }, "edit_uni", menu, []() { return true; }, wxGetApp().plater());
+
+ wxGetApp().plater()->PopupMenu(menu);
+}
+
+void PlaterPresetComboBox::show_edit_menu()
+{
+ wxMenu* menu = new wxMenu();
+
+ append_menu_item(menu, wxID_ANY, _L("Edit preset"), "",
+ [this](wxCommandEvent&) { this->switch_to_tab(); }, "cog", menu, []() { return true; }, wxGetApp().plater());
+
+ if (this->is_selected_physical_printer()) {
+ append_menu_item(menu, wxID_ANY, _L("Edit physical printer"), "",
+ [this](wxCommandEvent&) { this->edit_physical_printer(); }, "cog", menu, []() { return true; }, wxGetApp().plater());
+
+ append_menu_item(menu, wxID_ANY, _L("Delete physical printer"), "",
+ [this](wxCommandEvent&) { this->del_physical_printer(); }, "cross", menu, []() { return true; }, wxGetApp().plater());
+ }
+ else
+ append_menu_item(menu, wxID_ANY, _L("Add/Remove presets"), "",
+ [this](wxCommandEvent&) {
+ wxTheApp->CallAfter([]() { wxGetApp().run_wizard(ConfigWizard::RR_USER, ConfigWizard::SP_PRINTERS); });
+ }, "edit_uni", menu, []() { return true; }, wxGetApp().plater());
+
+ append_menu_item(menu, wxID_ANY, _L("Add physical printer"), "",
+ [this](wxCommandEvent&) { this->add_physical_printer(); }, "edit_uni", menu, []() { return true; }, wxGetApp().plater());
+
+ wxGetApp().plater()->PopupMenu(menu);
+}
+
+// Only the compatible presets are shown.
+// If an incompatible preset is selected, it is shown as well.
+void PlaterPresetComboBox::update()
+{
+ if (m_type == Preset::TYPE_FILAMENT &&
+ (m_preset_bundle->printers.get_edited_preset().printer_technology() == ptSLA ||
+ m_preset_bundle->filament_presets.size() <= (size_t)m_extruder_idx) )
+ return;
+
+ // Otherwise fill in the list from scratch.
+ this->Freeze();
+ this->Clear();
+ invalidate_selection();
+
+ const Preset* selected_filament_preset;
+ std::string extruder_color;
+ if (m_type == Preset::TYPE_FILAMENT)
+ {
+ unsigned char rgb[3];
+ extruder_color = m_preset_bundle->printers.get_edited_preset().config.opt_string("extruder_colour", (unsigned int)m_extruder_idx);
+ if (!bitmap_cache().parse_color(extruder_color, rgb))
+ // Extruder color is not defined.
+ extruder_color.clear();
+ selected_filament_preset = m_collection->find_preset(m_preset_bundle->filament_presets[m_extruder_idx]);
+ assert(selected_filament_preset);
+ }
+
+ bool has_selection = m_collection->get_selected_idx() != size_t(-1);
+ const Preset* selected_preset = m_type == Preset::TYPE_FILAMENT ? selected_filament_preset : has_selection ? &m_collection->get_selected_preset() : nullptr;
+ // Show wide icons if the currently selected preset is not compatible with the current printer,
+ // and draw a red flag in front of the selected preset.
+ bool wide_icons = selected_preset && !selected_preset->is_compatible;
+
+ std::map<wxString, wxBitmap*> nonsys_presets;
+
+ wxString selected_user_preset = "";
+ wxString tooltip = "";
+ const std::deque<Preset>& presets = m_collection->get_presets();
+
+ if (!presets.front().is_visible)
+ this->set_label_marker(this->Append(separator(L("System presets")), wxNullBitmap));
+
+ for (size_t i = presets.front().is_visible ? 0 : m_collection->num_default_presets(); i < presets.size(); ++i)
+ {
+ const Preset& preset = presets[i];
+ bool is_selected = m_type == Preset::TYPE_FILAMENT ?
+ m_preset_bundle->filament_presets[m_extruder_idx] == preset.name :
+ // The case, when some physical printer is selected
+ m_type == Preset::TYPE_PRINTER && m_preset_bundle->physical_printers.has_selection() ? false :
+ i == m_collection->get_selected_idx();
+
+ if (!preset.is_visible || (!preset.is_compatible && !is_selected))
+ continue;
+
+ std::string bitmap_key, filament_rgb, extruder_rgb;
+ std::string bitmap_type_name = bitmap_key = m_type == Preset::TYPE_PRINTER && preset.printer_technology() == ptSLA ? "sla_printer" : m_main_bitmap_name;
+
+ bool single_bar = false;
+ if (m_type == Preset::TYPE_FILAMENT)
+ {
+ // Assign an extruder color to the selected item if the extruder color is defined.
+ filament_rgb = is_selected ? selected_filament_preset->config.opt_string("filament_colour", 0) :
+ preset.config.opt_string("filament_colour", 0);
+ extruder_rgb = (is_selected && !extruder_color.empty()) ? extruder_color : filament_rgb;
+ single_bar = filament_rgb == extruder_rgb;
+
+ bitmap_key += single_bar ? filament_rgb : filament_rgb + extruder_rgb;
+ }
+
+ wxBitmap* bmp = get_bmp(bitmap_key, wide_icons, bitmap_type_name,
+ preset.is_compatible, preset.is_system || preset.is_default,
+ single_bar, filament_rgb, extruder_rgb);
+ assert(bmp);
+
+ const std::string name = preset.alias.empty() ? preset.name : preset.alias;
+ if (preset.is_default || preset.is_system) {
+ Append(wxString::FromUTF8((name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()), *bmp);
+ validate_selection(is_selected);
+ if (is_selected)
+ tooltip = wxString::FromUTF8(preset.name.c_str());
+ }
+ else
+ {
+ nonsys_presets.emplace(wxString::FromUTF8((name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()), bmp);
+ if (is_selected) {
+ selected_user_preset = wxString::FromUTF8((name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str());
+ tooltip = wxString::FromUTF8(preset.name.c_str());
+ }
+ }
+ if (i + 1 == m_collection->num_default_presets())
+ set_label_marker(Append(separator(L("System presets")), wxNullBitmap));
+ }
+ if (!nonsys_presets.empty())
+ {
+ set_label_marker(Append(separator(L("User presets")), wxNullBitmap));
+ for (std::map<wxString, wxBitmap*>::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) {
+ Append(it->first, *it->second);
+ validate_selection(it->first == selected_user_preset);
+ }
+ }
+
+ if (m_type == Preset::TYPE_PRINTER)
+ {
+ // add Physical printers, if any exists
+ if (!m_preset_bundle->physical_printers.empty()) {
+ set_label_marker(Append(separator(L("Physical printers")), wxNullBitmap));
+ const PhysicalPrinterCollection& ph_printers = m_preset_bundle->physical_printers;
+
+ for (PhysicalPrinterCollection::ConstIterator it = ph_printers.begin(); it != ph_printers.end(); ++it) {
+ for (const std::string preset_name : it->get_preset_names()) {
+ Preset* preset = m_collection->find_preset(preset_name);
+ if (!preset)
+ continue;
+ std::string main_icon_name, bitmap_key = main_icon_name = preset->printer_technology() == ptSLA ? "sla_printer" : m_main_bitmap_name;
+ wxBitmap* bmp = get_bmp(main_icon_name, wide_icons, main_icon_name);
+ assert(bmp);
+
+ set_label_marker(Append(wxString::FromUTF8((it->get_full_name(preset_name) + (preset->is_dirty ? Preset::suffix_modified() : "")).c_str()), *bmp), LABEL_ITEM_PHYSICAL_PRINTER);
+ validate_selection(ph_printers.is_selected(it, preset_name));
+ }
+ }
+ }
+ }
+
+ if (m_type == Preset::TYPE_PRINTER || m_type == Preset::TYPE_FILAMENT || m_type == Preset::TYPE_SLA_MATERIAL) {
+ wxBitmap* bmp = get_bmp("edit_preset_list", wide_icons, "edit_uni");
+ assert(bmp);
+
+ if (m_type == Preset::TYPE_FILAMENT)
+ set_label_marker(Append(separator(L("Add/Remove filaments")), *bmp), LABEL_ITEM_WIZARD_FILAMENTS);
+ else if (m_type == Preset::TYPE_SLA_MATERIAL)
+ set_label_marker(Append(separator(L("Add/Remove materials")), *bmp), LABEL_ITEM_WIZARD_MATERIALS);
+ else
+ set_label_marker(Append(separator(L("Add/Remove printers")), *bmp), LABEL_ITEM_WIZARD_PRINTERS);
+ }
+
+ update_selection();
+ Thaw();
+
+ if (!tooltip.IsEmpty())
+ SetToolTip(tooltip);
+
+ // Update control min size after rescale (changed Display DPI under MSW)
+ if (GetMinWidth() != 20 * m_em_unit)
+ SetMinSize(wxSize(20 * m_em_unit, GetSize().GetHeight()));
+}
+
+void PlaterPresetComboBox::msw_rescale()
+{
+ PresetComboBox::msw_rescale();
+ edit_btn->msw_rescale();
+}
+
+
+// ---------------------------------
+// *** TabPresetComboBox ***
+// ---------------------------------
+
+TabPresetComboBox::TabPresetComboBox(wxWindow* parent, Preset::Type preset_type) :
+ PresetComboBox(parent, preset_type, wxSize(35 * wxGetApp().em_unit(), -1))
+{
+ Bind(wxEVT_COMBOBOX, [this](wxCommandEvent& evt) {
+ // see https://github.com/prusa3d/PrusaSlicer/issues/3889
+ // Under OSX: in case of use of a same names written in different case (like "ENDER" and "Ender")
+ // m_presets_choice->GetSelection() will return first item, because search in PopupListCtrl is case-insensitive.
+ // So, use GetSelection() from event parameter
+ auto selected_item = evt.GetSelection();
+
+ auto marker = reinterpret_cast<Marker>(this->GetClientData(selected_item));
+ if (marker >= LABEL_ITEM_DISABLED && marker < LABEL_ITEM_MAX) {
+ this->SetSelection(this->m_last_selected);
+ if (marker == LABEL_ITEM_WIZARD_PRINTERS)
+ wxTheApp->CallAfter([this]() {
+ wxGetApp().run_wizard(ConfigWizard::RR_USER, ConfigWizard::SP_PRINTERS);
+
+ // update combobox if its parent is a PhysicalPrinterDialog
+ PhysicalPrinterDialog* parent = dynamic_cast<PhysicalPrinterDialog*>(this->GetParent());
+ if (parent != nullptr)
+ update();
+ });
+ }
+ else if (on_selection_changed && (m_last_selected != selected_item || m_collection->current_is_dirty()) ) {
+ m_last_selected = selected_item;
+ on_selection_changed(selected_item);
+ }
+
+ evt.StopPropagation();
+#ifdef __WXMSW__
+ // From the Win 2004 preset combobox lose a focus after change the preset selection
+ // and that is why the up/down arrow doesn't work properly
+ // (see https://github.com/prusa3d/PrusaSlicer/issues/5531 ).
+ // So, set the focus to the combobox explicitly
+ this->SetFocus();
+#endif
+ });
+}
+
+// Update the choice UI from the list of presets.
+// If show_incompatible, all presets are shown, otherwise only the compatible presets are shown.
+// If an incompatible preset is selected, it is shown as well.
+void TabPresetComboBox::update()
+{
+ Freeze();
+ Clear();
+ invalidate_selection();
+
+ const std::deque<Preset>& presets = m_collection->get_presets();
+
+ std::map<wxString, std::pair<wxBitmap*, bool>> nonsys_presets;
+ wxString selected = "";
+ if (!presets.front().is_visible)
+ set_label_marker(Append(separator(L("System presets")), wxNullBitmap));
+ size_t idx_selected = m_collection->get_selected_idx();
+
+ if (m_type == Preset::TYPE_PRINTER && m_preset_bundle->physical_printers.has_selection()) {
+ std::string sel_preset_name = m_preset_bundle->physical_printers.get_selected_printer_preset_name();
+ Preset* preset = m_collection->find_preset(sel_preset_name);
+ if (!preset)
+ m_preset_bundle->physical_printers.unselect_printer();
+ }
+
+ for (size_t i = presets.front().is_visible ? 0 : m_collection->num_default_presets(); i < presets.size(); ++i)
+ {
+ const Preset& preset = presets[i];
+ if (!preset.is_visible || (!show_incompatible && !preset.is_compatible && i != idx_selected))
+ continue;
+
+ // marker used for disable incompatible printer models for the selected physical printer
+ bool is_enabled = true;
+
+ std::string bitmap_key = "tab";
+ if (m_type == Preset::TYPE_PRINTER) {
+ bitmap_key += "_printer";
+ if (preset.printer_technology() == ptSLA)
+ bitmap_key += "_sla";
+ }
+ std::string main_icon_name = m_type == Preset::TYPE_PRINTER && preset.printer_technology() == ptSLA ? "sla_printer" : m_main_bitmap_name;
+
+ wxBitmap* bmp = get_bmp(bitmap_key, main_icon_name, "lock_closed", is_enabled, preset.is_compatible, preset.is_system || preset.is_default);
+ assert(bmp);
+
+ if (preset.is_default || preset.is_system) {
+ int item_id = Append(wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()), *bmp);
+ if (!is_enabled)
+ set_label_marker(item_id, LABEL_ITEM_DISABLED);
+ validate_selection(i == idx_selected);
+ }
+ else
+ {
+ std::pair<wxBitmap*, bool> pair(bmp, is_enabled);
+ nonsys_presets.emplace(wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str()), std::pair<wxBitmap*, bool>(bmp, is_enabled));
+ if (i == idx_selected)
+ selected = wxString::FromUTF8((preset.name + (preset.is_dirty ? Preset::suffix_modified() : "")).c_str());
+ }
+ if (i + 1 == m_collection->num_default_presets())
+ set_label_marker(Append(separator(L("System presets")), wxNullBitmap));
+ }
+ if (!nonsys_presets.empty())
+ {
+ set_label_marker(Append(separator(L("User presets")), wxNullBitmap));
+ for (std::map<wxString, std::pair<wxBitmap*, bool>>::iterator it = nonsys_presets.begin(); it != nonsys_presets.end(); ++it) {
+ int item_id = Append(it->first, *it->second.first);
+ bool is_enabled = it->second.second;
+ if (!is_enabled)
+ set_label_marker(item_id, LABEL_ITEM_DISABLED);
+ validate_selection(it->first == selected);
+ }
+ }
+
+ if (m_type == Preset::TYPE_PRINTER)
+ {
+ // add Physical printers, if any exists
+ if (!m_preset_bundle->physical_printers.empty()) {
+ set_label_marker(Append(separator(L("Physical printers")), wxNullBitmap));
+ const PhysicalPrinterCollection& ph_printers = m_preset_bundle->physical_printers;
+
+ for (PhysicalPrinterCollection::ConstIterator it = ph_printers.begin(); it != ph_printers.end(); ++it) {
+ for (const std::string preset_name : it->get_preset_names()) {
+ Preset* preset = m_collection->find_preset(preset_name);
+ if (!preset)
+ continue;
+ std::string main_icon_name = preset->printer_technology() == ptSLA ? "sla_printer" : m_main_bitmap_name;
+
+ wxBitmap* bmp = get_bmp(main_icon_name, main_icon_name, "", true, true, false);
+ assert(bmp);
+
+ set_label_marker(Append(wxString::FromUTF8((it->get_full_name(preset_name) + (preset->is_dirty ? Preset::suffix_modified() : "")).c_str()), *bmp), LABEL_ITEM_PHYSICAL_PRINTER);
+ validate_selection(ph_printers.is_selected(it, preset_name));
+ }
+ }
+ }
+
+ // add "Add/Remove printers" item
+ std::string icon_name = "edit_uni";
+ wxBitmap* bmp = get_bmp("edit_preset_list, tab,", icon_name, "");
+ assert(bmp);
+
+ set_label_marker(Append(separator(L("Add/Remove printers")), *bmp), LABEL_ITEM_WIZARD_PRINTERS);
+ }
+
+ update_selection();
+ Thaw();
+}
+
+void TabPresetComboBox::msw_rescale()
+{
+ PresetComboBox::msw_rescale();
+ wxSize sz = wxSize(35 * m_em_unit, -1);
+ SetMinSize(sz);
+ SetSize(sz);
+}
+
+void TabPresetComboBox::update_dirty()
+{
+ // 1) Update the dirty flag of the current preset.
+ m_collection->update_dirty();
+
+ // 2) Update the labels.
+ wxWindowUpdateLocker noUpdates(this);
+ for (unsigned int ui_id = 0; ui_id < GetCount(); ++ui_id) {
+ auto marker = reinterpret_cast<Marker>(this->GetClientData(ui_id));
+ if (marker >= LABEL_ITEM_MARKER)
+ continue;
+
+ std::string old_label = GetString(ui_id).utf8_str().data();
+ std::string preset_name = Preset::remove_suffix_modified(old_label);
+ std::string ph_printer_name;
+
+ if (marker == LABEL_ITEM_PHYSICAL_PRINTER) {
+ ph_printer_name = PhysicalPrinter::get_short_name(preset_name);
+ preset_name = PhysicalPrinter::get_preset_name(preset_name);
+ }
+
+ const Preset* preset = m_collection->find_preset(preset_name, false);
+ if (preset) {
+ std::string new_label = preset->is_dirty ? preset->name + Preset::suffix_modified() : preset->name;
+
+ if (marker == LABEL_ITEM_PHYSICAL_PRINTER)
+ new_label = ph_printer_name + PhysicalPrinter::separator() + new_label;
+
+ if (old_label != new_label)
+ SetString(ui_id, wxString::FromUTF8(new_label.c_str()));
+ }
+ }
+#ifdef __APPLE__
+ // wxWidgets on OSX do not upload the text of the combo box line automatically.
+ // Force it to update by re-selecting.
+ SetSelection(GetSelection());
+#endif /* __APPLE __ */
+}
+
+}} // namespace Slic3r::GUI
diff --git a/src/slic3r/GUI/PresetComboBoxes.hpp b/src/slic3r/GUI/PresetComboBoxes.hpp
new file mode 100644
index 000000000..d3cc6277d
--- /dev/null
+++ b/src/slic3r/GUI/PresetComboBoxes.hpp
@@ -0,0 +1,198 @@
+#ifndef slic3r_PresetComboBoxes_hpp_
+#define slic3r_PresetComboBoxes_hpp_
+
+#include <wx/bmpcbox.h>
+#include <wx/gdicmn.h>
+
+#include "libslic3r/Preset.hpp"
+#include "wxExtensions.hpp"
+#include "GUI_Utils.hpp"
+
+class wxString;
+class wxTextCtrl;
+class wxStaticText;
+class ScalableButton;
+class wxBoxSizer;
+class wxComboBox;
+class wxStaticBitmap;
+class wxRadioBox;
+
+namespace Slic3r {
+
+namespace GUI {
+
+class BitmapCache;
+
+// ---------------------------------
+// *** PresetComboBox ***
+// ---------------------------------
+
+// BitmapComboBox used to presets list on Sidebar and Tabs
+class PresetComboBox : public wxBitmapComboBox
+{
+public:
+ PresetComboBox(wxWindow* parent, Preset::Type preset_type, const wxSize& size = wxDefaultSize);
+ ~PresetComboBox();
+
+ enum LabelItemType {
+ LABEL_ITEM_PHYSICAL_PRINTER = 0xffffff01,
+ LABEL_ITEM_DISABLED,
+ LABEL_ITEM_MARKER,
+ LABEL_ITEM_PHYSICAL_PRINTERS,
+ LABEL_ITEM_WIZARD_PRINTERS,
+ LABEL_ITEM_WIZARD_FILAMENTS,
+ LABEL_ITEM_WIZARD_MATERIALS,
+
+ LABEL_ITEM_MAX,
+ };
+
+ void set_label_marker(int item, LabelItemType label_item_type = LABEL_ITEM_MARKER);
+ bool set_printer_technology(PrinterTechnology pt);
+
+ void set_selection_changed_function(std::function<void(int)> sel_changed) { on_selection_changed = sel_changed; }
+
+ bool is_selected_physical_printer();
+
+ // Return true, if physical printer was selected
+ // and next internal selection was accomplished
+ bool selection_is_changed_according_to_physical_printers();
+
+ void update(std::string select_preset);
+
+ void edit_physical_printer();
+ void add_physical_printer();
+ bool del_physical_printer(const wxString& note_string = wxEmptyString);
+
+ virtual void update();
+ virtual void msw_rescale();
+
+protected:
+ typedef std::size_t Marker;
+ std::function<void(int)> on_selection_changed { nullptr };
+
+ Preset::Type m_type;
+ std::string m_main_bitmap_name;
+
+ PresetBundle* m_preset_bundle {nullptr};
+ PresetCollection* m_collection {nullptr};
+
+ // Caching bitmaps for the all bitmaps, used in preset comboboxes
+ static BitmapCache& bitmap_cache();
+
+ // Indicator, that the preset is compatible with the selected printer.
+ ScalableBitmap m_bitmapCompatible;
+ // Indicator, that the preset is NOT compatible with the selected printer.
+ ScalableBitmap m_bitmapIncompatible;
+
+ int m_last_selected;
+ int m_em_unit;
+ bool m_suppress_change { true };
+
+ // parameters for an icon's drawing
+ int icon_height;
+ int norm_icon_width;
+ int thin_icon_width;
+ int wide_icon_width;
+ int space_icon_width;
+ int thin_space_icon_width;
+ int wide_space_icon_width;
+
+ PrinterTechnology printer_technology {ptAny};
+
+ void invalidate_selection();
+ void validate_selection(bool predicate = false);
+ void update_selection();
+
+#ifdef __linux__
+ static const char* separator_head() { return "------- "; }
+ static const char* separator_tail() { return " -------"; }
+#else // __linux__
+ static const char* separator_head() { return "————— "; }
+ static const char* separator_tail() { return " —————"; }
+#endif // __linux__
+ static wxString separator(const std::string& label);
+
+ wxBitmap* get_bmp( std::string bitmap_key, bool wide_icons, const std::string& main_icon_name,
+ bool is_compatible = true, bool is_system = false, bool is_single_bar = false,
+ std::string filament_rgb = "", std::string extruder_rgb = "");
+
+ wxBitmap* get_bmp( std::string bitmap_key, const std::string& main_icon_name, const std::string& next_icon_name,
+ bool is_enabled = true, bool is_compatible = true, bool is_system = false);
+
+#ifdef __APPLE__
+ /* For PresetComboBox we use bitmaps that are created from images that are already scaled appropriately for Retina
+ * (Contrary to the intuition, the `scale` argument for Bitmap's constructor doesn't mean
+ * "please scale this to such and such" but rather
+ * "the wxImage is already sized for backing scale such and such". )
+ * Unfortunately, the constructor changes the size of wxBitmap too.
+ * Thus We need to use unscaled size value for bitmaps that we use
+ * to avoid scaled size of control items.
+ * For this purpose control drawing methods and
+ * control size calculation methods (virtual) are overridden.
+ **/
+ bool OnAddBitmap(const wxBitmap& bitmap) override;
+ void OnDrawItem(wxDC& dc, const wxRect& rect, int item, int flags) const override;
+#endif
+
+private:
+ void fill_width_height();
+};
+
+
+// ---------------------------------
+// *** PlaterPresetComboBox ***
+// ---------------------------------
+
+class PlaterPresetComboBox : public PresetComboBox
+{
+public:
+ PlaterPresetComboBox(wxWindow *parent, Preset::Type preset_type);
+ ~PlaterPresetComboBox();
+
+ ScalableButton* edit_btn { nullptr };
+
+ void set_extruder_idx(const int extr_idx) { m_extruder_idx = extr_idx; }
+ int get_extruder_idx() const { return m_extruder_idx; }
+
+ bool switch_to_tab();
+ void show_add_menu();
+ void show_edit_menu();
+
+ void update() override;
+ void msw_rescale() override;
+
+private:
+ int m_extruder_idx = -1;
+};
+
+
+// ---------------------------------
+// *** TabPresetComboBox ***
+// ---------------------------------
+
+class TabPresetComboBox : public PresetComboBox
+{
+ bool show_incompatible {false};
+ bool m_enable_all {false};
+
+public:
+ TabPresetComboBox(wxWindow *parent, Preset::Type preset_type);
+ ~TabPresetComboBox() {}
+ void set_show_incompatible_presets(bool show_incompatible_presets) {
+ show_incompatible = show_incompatible_presets;
+ }
+
+ void update() override;
+ void update_dirty();
+ void msw_rescale() override;
+
+ void set_enable_all(bool enable=true) { m_enable_all = enable; }
+
+ PresetCollection* presets() const { return m_collection; }
+ Preset::Type type() const { return m_type; }
+};
+
+} // namespace GUI
+} // namespace Slic3r
+
+#endif
diff --git a/src/slic3r/GUI/PresetHints.cpp b/src/slic3r/GUI/PresetHints.cpp
index 22fa09f6c..8efe832dd 100644
--- a/src/slic3r/GUI/PresetHints.cpp
+++ b/src/slic3r/GUI/PresetHints.cpp
@@ -4,12 +4,12 @@
#include "libslic3r/Slicing.hpp"
#include "libslic3r/libslic3r.h"
-#include "PresetBundle.hpp"
#include "PresetHints.hpp"
#include <wx/intl.h>
#include "GUI.hpp"
+#include "format.hpp"
#include "I18N.hpp"
namespace Slic3r {
@@ -19,40 +19,43 @@ std::string PresetHints::cooling_description(const Preset &preset)
{
std::string out;
- if (preset.config.opt_bool("cooling", 0)) {
+ bool cooling = preset.config.opt_bool("cooling", 0);
+ int fan_below_layer_time = preset.config.opt_int("fan_below_layer_time", 0);
+ int full_fan_speed_layer = preset.config.opt_int("full_fan_speed_layer", 0);
+
+ if (cooling) {
int slowdown_below_layer_time = preset.config.opt_int("slowdown_below_layer_time", 0);
int min_fan_speed = preset.config.opt_int("min_fan_speed", 0);
int max_fan_speed = preset.config.opt_int("max_fan_speed", 0);
int min_print_speed = int(preset.config.opt_float("min_print_speed", 0) + 0.5);
- int fan_below_layer_time = preset.config.opt_int("fan_below_layer_time", 0);
-
- out += (boost::format(_utf8(L("If estimated layer time is below ~%1%s, "
- "fan will run at %2%%% and print speed will be reduced "
- "so that no less than %3%s are spent on that layer "
- "(however, speed will never be reduced below %4%mm/s).")))
- % slowdown_below_layer_time % max_fan_speed % slowdown_below_layer_time % min_print_speed).str();
-
- if (fan_below_layer_time > slowdown_below_layer_time) {
- out += "\n" + (boost::format(_utf8(L("If estimated layer time is greater, but still below ~%1%s, "
- "fan will run at a proportionally decreasing speed between %2%%% and %3%%%.")))
- % fan_below_layer_time % max_fan_speed % min_fan_speed).str();
- }
- out += "\n" + _utf8(L("During the other layers, fan")) + " ";
- } else {
- out = _utf8(L("Fan")) + " ";
+
+ out += GUI::format(_L("If estimated layer time is below ~%1%s, "
+ "fan will run at %2%%% and print speed will be reduced "
+ "so that no less than %3%s are spent on that layer "
+ "(however, speed will never be reduced below %4%mm/s)."),
+ slowdown_below_layer_time, max_fan_speed, slowdown_below_layer_time, min_print_speed);
+ if (fan_below_layer_time > slowdown_below_layer_time)
+ out += "\n" +
+ GUI::format(_L("If estimated layer time is greater, but still below ~%1%s, "
+ "fan will run at a proportionally decreasing speed between %2%%% and %3%%%."),
+ fan_below_layer_time, max_fan_speed, min_fan_speed);
+ out += "\n";
}
if (preset.config.opt_bool("fan_always_on", 0)) {
int disable_fan_first_layers = preset.config.opt_int("disable_fan_first_layers", 0);
int min_fan_speed = preset.config.opt_int("min_fan_speed", 0);
- out += (boost::format(_utf8(L("will always run at %1%%%"))) % min_fan_speed).str() + " ";
-
- if (disable_fan_first_layers > 1)
- out += (boost::format(_utf8(L("except for the first %1% layers."))) % disable_fan_first_layers).str();
- else if (disable_fan_first_layers == 1)
- out += _utf8(L("except for the first layer."));
+ if (full_fan_speed_layer > disable_fan_first_layers + 1)
+ out += GUI::format(_L("Fan speed will be ramped from zero at layer %1% to %2%%% at layer %3%."), disable_fan_first_layers, min_fan_speed, full_fan_speed_layer);
+ else {
+ out += GUI::format(cooling ? _L("During the other layers, fan will always run at %1%%%") : _L("Fan will always run at %1%%%"), min_fan_speed) + " ";
+ if (disable_fan_first_layers > 1)
+ out += GUI::format(_L("except for the first %1% layers."), disable_fan_first_layers);
+ else if (disable_fan_first_layers == 1)
+ out += GUI::format(_L("except for the first layer."));
+ }
} else
- out += _utf8(L("will be turned off."));
+ out += cooling ? _u8L("During the other layers, fan will be turned off.") : _u8L("Fan will be turned off.");
return out;
}
@@ -296,9 +299,8 @@ std::string PresetHints::top_bottom_shell_thickness_explanation(const PresetBund
double bottom_solid_min_thickness = print_config.opt_float("bottom_solid_min_thickness");
double layer_height = print_config.opt_float("layer_height");
bool variable_layer_height = printer_config.opt_bool("variable_layer_height");
- //FIXME the following lines take into account the 1st extruder only.
+ //FIXME the following line takes into account the 1st extruder only.
double min_layer_height = variable_layer_height ? Slicing::min_layer_height_from_nozzle(printer_config, 1) : layer_height;
- double max_layer_height = variable_layer_height ? Slicing::max_layer_height_from_nozzle(printer_config, 1) : layer_height;
if (layer_height <= 0.f) {
out += _utf8(L("Top / bottom shell thickness hint: Not available due to invalid layer height."));
diff --git a/src/slic3r/GUI/PresetHints.hpp b/src/slic3r/GUI/PresetHints.hpp
index be049c2c8..a61310f40 100644
--- a/src/slic3r/GUI/PresetHints.hpp
+++ b/src/slic3r/GUI/PresetHints.hpp
@@ -3,7 +3,7 @@
#include <string>
-#include "PresetBundle.hpp"
+#include "libslic3r/PresetBundle.hpp"
namespace Slic3r {
diff --git a/src/slic3r/GUI/PrintHostDialogs.cpp b/src/slic3r/GUI/PrintHostDialogs.cpp
index bae60e47f..75f6d265d 100644
--- a/src/slic3r/GUI/PrintHostDialogs.cpp
+++ b/src/slic3r/GUI/PrintHostDialogs.cpp
@@ -15,11 +15,12 @@
#include "GUI.hpp"
#include "GUI_App.hpp"
-#include "AppConfig.hpp"
#include "MsgDialog.hpp"
#include "I18N.hpp"
#include "../Utils/PrintHost.hpp"
#include "wxExtensions.hpp"
+#include "MainFrame.hpp"
+#include "libslic3r/AppConfig.hpp"
namespace fs = boost::filesystem;
@@ -28,18 +29,20 @@ namespace GUI {
static const char *CONFIG_KEY_PATH = "printhost_path";
static const char *CONFIG_KEY_PRINT = "printhost_print";
+static const char *CONFIG_KEY_GROUP = "printhost_group";
-PrintHostSendDialog::PrintHostSendDialog(const fs::path &path, bool can_start_print)
- : MsgDialog(nullptr, _(L("Send G-Code to printer host")), _(L("Upload to Printer Host with the following filename:")), wxID_NONE)
+PrintHostSendDialog::PrintHostSendDialog(const fs::path &path, bool can_start_print, const wxArrayString &groups)
+ : MsgDialog(static_cast<wxWindow*>(wxGetApp().mainframe), _L("Send G-Code to printer host"), _L("Upload to Printer Host with the following filename:"), wxID_NONE)
, txt_filename(new wxTextCtrl(this, wxID_ANY))
- , box_print(can_start_print ? new wxCheckBox(this, wxID_ANY, _(L("Start printing after upload"))) : nullptr)
+ , box_print(can_start_print ? new wxCheckBox(this, wxID_ANY, _L("Start printing after upload")) : nullptr)
+ , combo_groups(!groups.IsEmpty() ? new wxComboBox(this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, groups, wxCB_READONLY) : nullptr)
{
#ifdef __APPLE__
txt_filename->OSXDisableAllSmartSubstitutions();
#endif
const AppConfig *app_config = wxGetApp().app_config;
- auto *label_dir_hint = new wxStaticText(this, wxID_ANY, _(L("Use forward slashes ( / ) as a directory separator if needed.")));
+ auto *label_dir_hint = new wxStaticText(this, wxID_ANY, _L("Use forward slashes ( / ) as a directory separator if needed."));
label_dir_hint->Wrap(CONTENT_WIDTH * wxGetApp().em_unit());
content_sizer->Add(txt_filename, 0, wxEXPAND);
@@ -49,10 +52,19 @@ PrintHostSendDialog::PrintHostSendDialog(const fs::path &path, bool can_start_pr
content_sizer->Add(box_print, 0, wxBOTTOM, 2*VERT_SPACING);
box_print->SetValue(app_config->get("recent", CONFIG_KEY_PRINT) == "1");
}
+
+ if (combo_groups != nullptr) {
+ // Repetier specific: Show a selection of file groups.
+ auto *label_group = new wxStaticText(this, wxID_ANY, _L("Group"));
+ content_sizer->Add(label_group);
+ content_sizer->Add(combo_groups, 0, wxBOTTOM, 2*VERT_SPACING);
+ wxString recent_group = from_u8(app_config->get("recent", CONFIG_KEY_GROUP));
+ if (! recent_group.empty())
+ combo_groups->SetValue(recent_group);
+ }
btn_sizer->Add(CreateStdDialogButtonSizer(wxOK | wxCANCEL));
-
wxString recent_path = from_u8(app_config->get("recent", CONFIG_KEY_PATH));
if (recent_path.Length() > 0 && recent_path[recent_path.Length() - 1] != '/') {
recent_path += '/';
@@ -64,8 +76,20 @@ PrintHostSendDialog::PrintHostSendDialog(const fs::path &path, bool can_start_pr
txt_filename->SetValue(recent_path);
txt_filename->SetFocus();
-
+
Fit();
+ CenterOnParent();
+
+#ifdef __linux__
+ // On Linux with GTK2 when text control lose the focus then selection (colored background) disappears but text color stay white
+ // and as a result the text is invisible with light mode
+ // see https://github.com/prusa3d/PrusaSlicer/issues/4532
+ // Workaround: Unselect text selection explicitly on kill focus
+ txt_filename->Bind(wxEVT_KILL_FOCUS, [this](wxEvent& e) {
+ e.Skip();
+ txt_filename->SetInsertionPoint(txt_filename->GetLastPosition());
+ }, txt_filename->GetId());
+#endif /* __linux__ */
Bind(wxEVT_SHOW, [=](const wxShowEvent &) {
// Another similar case where the function only works with EVT_SHOW + CallAfter,
@@ -86,6 +110,16 @@ bool PrintHostSendDialog::start_print() const
return box_print != nullptr ? box_print->GetValue() : false;
}
+std::string PrintHostSendDialog::group() const
+{
+ if (combo_groups == nullptr) {
+ return "";
+ } else {
+ wxString group = combo_groups->GetValue();
+ return into_u8(group);
+ }
+}
+
void PrintHostSendDialog::EndModal(int ret)
{
if (ret == wxID_OK) {
@@ -96,9 +130,15 @@ void PrintHostSendDialog::EndModal(int ret)
path.clear();
else
path = path.SubString(0, last_slash);
+
AppConfig *app_config = wxGetApp().app_config;
app_config->set("recent", CONFIG_KEY_PATH, into_u8(path));
app_config->set("recent", CONFIG_KEY_PRINT, start_print() ? "1" : "0");
+
+ if (combo_groups != nullptr) {
+ wxString group = combo_groups->GetValue();
+ app_config->set("recent", CONFIG_KEY_GROUP, into_u8(group));
+ }
}
MsgDialog::EndModal(ret);
@@ -133,32 +173,31 @@ wxEvent *PrintHostQueueDialog::Event::Clone() const
}
PrintHostQueueDialog::PrintHostQueueDialog(wxWindow *parent)
- : DPIDialog(parent, wxID_ANY, _(L("Print host upload queue")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
+ : DPIDialog(parent, wxID_ANY, _L("Print host upload queue"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
, on_progress_evt(this, EVT_PRINTHOST_PROGRESS, &PrintHostQueueDialog::on_progress, this)
, on_error_evt(this, EVT_PRINTHOST_ERROR, &PrintHostQueueDialog::on_error, this)
, on_cancel_evt(this, EVT_PRINTHOST_CANCEL, &PrintHostQueueDialog::on_cancel, this)
{
const auto em = GetTextExtent("m").x;
- SetSize(wxSize(HEIGHT * em, WIDTH * em));
-
auto *topsizer = new wxBoxSizer(wxVERTICAL);
job_list = new wxDataViewListCtrl(this, wxID_ANY);
// Note: Keep these in sync with Column
- job_list->AppendTextColumn(_(L("ID")), wxDATAVIEW_CELL_INERT);
- job_list->AppendProgressColumn(_(L("Progress")), wxDATAVIEW_CELL_INERT);
- job_list->AppendTextColumn(_(L("Status")), wxDATAVIEW_CELL_INERT);
- job_list->AppendTextColumn(_(L("Host")), wxDATAVIEW_CELL_INERT);
- job_list->AppendTextColumn(_(L("Filename")), wxDATAVIEW_CELL_INERT);
- job_list->AppendTextColumn(_(L("Error Message")), wxDATAVIEW_CELL_INERT, -1, wxALIGN_CENTER, wxDATAVIEW_COL_HIDDEN);
+ job_list->AppendTextColumn(_L("ID"), wxDATAVIEW_CELL_INERT);
+ job_list->AppendProgressColumn(_L("Progress"), wxDATAVIEW_CELL_INERT);
+ job_list->AppendTextColumn(_L("Status"), wxDATAVIEW_CELL_INERT);
+ job_list->AppendTextColumn(_L("Host"), wxDATAVIEW_CELL_INERT);
+ job_list->AppendTextColumn(_L("Filename"), wxDATAVIEW_CELL_INERT);
+ job_list->AppendTextColumn(_L("Error Message"), wxDATAVIEW_CELL_INERT, -1, wxALIGN_CENTER, wxDATAVIEW_COL_HIDDEN);
auto *btnsizer = new wxBoxSizer(wxHORIZONTAL);
- btn_cancel = new wxButton(this, wxID_DELETE, _(L("Cancel selected")));
+ btn_cancel = new wxButton(this, wxID_DELETE, _L("Cancel selected"));
btn_cancel->Disable();
- btn_error = new wxButton(this, wxID_ANY, _(L("Show error message")));
+ btn_error = new wxButton(this, wxID_ANY, _L("Show error message"));
btn_error->Disable();
- auto *btn_close = new wxButton(this, wxID_CANCEL, _(L("Close"))); // Note: The label needs to be present, otherwise we get accelerator bugs on Mac
+ // Note: The label needs to be present, otherwise we get accelerator bugs on Mac
+ auto *btn_close = new wxButton(this, wxID_CANCEL, _L("Close"));
btnsizer->Add(btn_cancel, 0, wxRIGHT, SPACING);
btnsizer->Add(btn_error, 0);
btnsizer->AddStretchSpacer();
@@ -168,6 +207,8 @@ PrintHostQueueDialog::PrintHostQueueDialog(wxWindow *parent)
topsizer->Add(btnsizer, 0, wxEXPAND);
SetSizer(topsizer);
+ SetSize(wxSize(HEIGHT * em, WIDTH * em));
+
job_list->Bind(wxEVT_DATAVIEW_SELECTION_CHANGED, [this](wxDataViewEvent&) { on_list_select(); });
btn_cancel->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) {
@@ -195,11 +236,13 @@ void PrintHostQueueDialog::append_job(const PrintHostJob &job)
wxVector<wxVariant> fields;
fields.push_back(wxVariant(wxString::Format("%d", job_list->GetItemCount() + 1)));
fields.push_back(wxVariant(0));
- fields.push_back(wxVariant(_(L("Enqueued"))));
+ fields.push_back(wxVariant(_L("Enqueued")));
fields.push_back(wxVariant(job.printhost->get_host()));
fields.push_back(wxVariant(job.upload_data.upload_path.string()));
fields.push_back(wxVariant(""));
job_list->AppendItem(fields, static_cast<wxUIntPtr>(ST_NEW));
+ // Both strings are UTF-8 encoded.
+ upload_names.emplace_back(job.printhost->get_host(), job.upload_data.upload_path.string());
}
void PrintHostQueueDialog::on_dpi_changed(const wxRect &suggested_rect)
@@ -226,12 +269,12 @@ void PrintHostQueueDialog::set_state(int idx, JobState state)
job_list->SetItemData(job_list->RowToItem(idx), static_cast<wxUIntPtr>(state));
switch (state) {
- case ST_NEW: job_list->SetValue(_(L("Enqueued")), idx, COL_STATUS); break;
- case ST_PROGRESS: job_list->SetValue(_(L("Uploading")), idx, COL_STATUS); break;
- case ST_ERROR: job_list->SetValue(_(L("Error")), idx, COL_STATUS); break;
- case ST_CANCELLING: job_list->SetValue(_(L("Cancelling")), idx, COL_STATUS); break;
- case ST_CANCELLED: job_list->SetValue(_(L("Cancelled")), idx, COL_STATUS); break;
- case ST_COMPLETED: job_list->SetValue(_(L("Completed")), idx, COL_STATUS); break;
+ case ST_NEW: job_list->SetValue(_L("Enqueued"), idx, COL_STATUS); break;
+ case ST_PROGRESS: job_list->SetValue(_L("Uploading"), idx, COL_STATUS); break;
+ case ST_ERROR: job_list->SetValue(_L("Error"), idx, COL_STATUS); break;
+ case ST_CANCELLING: job_list->SetValue(_L("Cancelling"), idx, COL_STATUS); break;
+ case ST_CANCELLED: job_list->SetValue(_L("Cancelled"), idx, COL_STATUS); break;
+ case ST_COMPLETED: job_list->SetValue(_L("Completed"), idx, COL_STATUS); break;
}
}
@@ -287,6 +330,17 @@ void PrintHostQueueDialog::on_cancel(Event &evt)
on_list_select();
}
-
-
+void PrintHostQueueDialog::get_active_jobs(std::vector<std::pair<std::string, std::string>>& ret)
+{
+ int ic = job_list->GetItemCount();
+ for (size_t i = 0; i < ic; i++)
+ {
+ auto item = job_list->RowToItem(i);
+ auto data = job_list->GetItemData(item);
+ JobState st = static_cast<JobState>(data);
+ if(st == JobState::ST_NEW || st == JobState::ST_PROGRESS)
+ ret.emplace_back(upload_names[i]);
+ }
+ //job_list->data
+}
}}
diff --git a/src/slic3r/GUI/PrintHostDialogs.hpp b/src/slic3r/GUI/PrintHostDialogs.hpp
index e5f96f2b6..1fda0db66 100644
--- a/src/slic3r/GUI/PrintHostDialogs.hpp
+++ b/src/slic3r/GUI/PrintHostDialogs.hpp
@@ -15,6 +15,7 @@
class wxButton;
class wxTextCtrl;
+class wxComboBox;
class wxCheckBox;
class wxDataViewListCtrl;
@@ -29,14 +30,16 @@ namespace GUI {
class PrintHostSendDialog : public GUI::MsgDialog
{
public:
- PrintHostSendDialog(const boost::filesystem::path &path, bool can_start_print);
+ PrintHostSendDialog(const boost::filesystem::path &path, bool can_start_print, const wxArrayString& groups);
boost::filesystem::path filename() const;
bool start_print() const;
+ std::string group() const;
virtual void EndModal(int ret) override;
private:
wxTextCtrl *txt_filename;
wxCheckBox *box_print;
+ wxComboBox *combo_groups;
};
@@ -61,7 +64,7 @@ public:
PrintHostQueueDialog(wxWindow *parent);
void append_job(const PrintHostJob &job);
-
+ void get_active_jobs(std::vector<std::pair<std::string, std::string>>& ret);
protected:
void on_dpi_changed(const wxRect &suggested_rect) override;
@@ -100,13 +103,14 @@ private:
void on_progress(Event&);
void on_error(Event&);
void on_cancel(Event&);
+ // This vector keep adress and filename of uploads. It is used when checking for running uploads during exit.
+ std::vector<std::pair<std::string, std::string>> upload_names;
};
wxDECLARE_EVENT(EVT_PRINTHOST_PROGRESS, PrintHostQueueDialog::Event);
wxDECLARE_EVENT(EVT_PRINTHOST_ERROR, PrintHostQueueDialog::Event);
wxDECLARE_EVENT(EVT_PRINTHOST_CANCEL, PrintHostQueueDialog::Event);
-
}}
#endif
diff --git a/src/slic3r/GUI/ProgressStatusBar.hpp b/src/slic3r/GUI/ProgressStatusBar.hpp
index faeb7a34e..15b10deeb 100644
--- a/src/slic3r/GUI/ProgressStatusBar.hpp
+++ b/src/slic3r/GUI/ProgressStatusBar.hpp
@@ -6,7 +6,7 @@
#include <functional>
#include <string>
-#include "ProgressIndicator.hpp"
+#include "Jobs/ProgressIndicator.hpp"
class wxTimer;
class wxGauge;
diff --git a/src/slic3r/GUI/RemovableDriveManager.cpp b/src/slic3r/GUI/RemovableDriveManager.cpp
index cdb1c1d45..b11cc8dd5 100644
--- a/src/slic3r/GUI/RemovableDriveManager.cpp
+++ b/src/slic3r/GUI/RemovableDriveManager.cpp
@@ -20,6 +20,7 @@
#include <glob.h>
#include <pwd.h>
#include <boost/filesystem.hpp>
+#include <boost/system/error_code.hpp>
#include <boost/filesystem/convenience.hpp>
#include <boost/process.hpp>
#endif
@@ -33,17 +34,19 @@ wxDEFINE_EVENT(EVT_REMOVABLE_DRIVES_CHANGED, RemovableDrivesChangedEvent);
#if _WIN32
std::vector<DriveData> RemovableDriveManager::search_for_removable_drives() const
{
- //get logical drives flags by letter in alphabetical order
+ // Get logical drives flags by letter in alphabetical order.
DWORD drives_mask = ::GetLogicalDrives();
// Allocate the buffers before the loop.
std::wstring volume_name;
std::wstring file_system_name;
- // Iterate the Windows drives from 'A' to 'Z'
+ // Iterate the Windows drives from 'C' to 'Z'
std::vector<DriveData> current_drives;
- for (size_t i = 0; i < 26; ++ i)
- if (drives_mask & (1 << i)) {
- std::string path { char('A' + i), ':' };
+ // Skip A and B drives.
+ drives_mask >>= 2;
+ for (char drive = 'C'; drive <= 'Z'; ++ drive, drives_mask >>= 1)
+ if (drives_mask & 1) {
+ std::string path { drive, ':' };
UINT drive_type = ::GetDriveTypeA(path.c_str());
// DRIVE_REMOVABLE on W are sd cards and usb thumbnails (not usb harddrives)
if (drive_type == DRIVE_REMOVABLE) {
@@ -79,7 +82,7 @@ void RemovableDriveManager::eject_drive()
#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS
this->update();
#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS
-
+ BOOST_LOG_TRIVIAL(info) << "Ejecting started";
tbb::mutex::scoped_lock lock(m_drives_mutex);
auto it_drive_data = this->find_last_save_path_drive_data();
if (it_drive_data != m_current_drives.end()) {
@@ -88,7 +91,7 @@ void RemovableDriveManager::eject_drive()
mpath = mpath.substr(0, mpath.size() - 1);
HANDLE handle = CreateFileW(boost::nowide::widen(mpath).c_str(), GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr);
if (handle == INVALID_HANDLE_VALUE) {
- std::cerr << "Ejecting " << mpath << " failed " << GetLastError() << " \n";
+ BOOST_LOG_TRIVIAL(error) << "Ejecting " << mpath << " failed (handle == INVALID_HANDLE_VALUE): " << GetLastError();
assert(m_callback_evt_handler);
if (m_callback_evt_handler)
wxPostEvent(m_callback_evt_handler, RemovableDriveEjectEvent(EVT_REMOVABLE_DRIVE_EJECTED, std::pair<DriveData, bool>(*it_drive_data, false)));
@@ -97,19 +100,22 @@ void RemovableDriveManager::eject_drive()
DWORD deviceControlRetVal(0);
//these 3 commands should eject device safely but they dont, the device does disappear from file explorer but the "device was safely remove" notification doesnt trigger.
//sd cards does trigger WM_DEVICECHANGE messege, usb drives dont
- DeviceIoControl(handle, FSCTL_LOCK_VOLUME, nullptr, 0, nullptr, 0, &deviceControlRetVal, nullptr);
- DeviceIoControl(handle, FSCTL_DISMOUNT_VOLUME, nullptr, 0, nullptr, 0, &deviceControlRetVal, nullptr);
+ BOOL e1 = DeviceIoControl(handle, FSCTL_LOCK_VOLUME, nullptr, 0, nullptr, 0, &deviceControlRetVal, nullptr);
+ BOOST_LOG_TRIVIAL(debug) << "FSCTL_LOCK_VOLUME " << e1 << " ; " << deviceControlRetVal << " ; " << GetLastError();
+ BOOL e2 = DeviceIoControl(handle, FSCTL_DISMOUNT_VOLUME, nullptr, 0, nullptr, 0, &deviceControlRetVal, nullptr);
+ BOOST_LOG_TRIVIAL(debug) << "FSCTL_DISMOUNT_VOLUME " << e2 << " ; " << deviceControlRetVal << " ; " << GetLastError();
// some implemenatations also calls IOCTL_STORAGE_MEDIA_REMOVAL here but it returns error to me
BOOL error = DeviceIoControl(handle, IOCTL_STORAGE_EJECT_MEDIA, nullptr, 0, nullptr, 0, &deviceControlRetVal, nullptr);
if (error == 0) {
CloseHandle(handle);
- BOOST_LOG_TRIVIAL(error) << "Ejecting " << mpath << " failed " << deviceControlRetVal << " " << GetLastError() << " \n";
+ BOOST_LOG_TRIVIAL(error) << "Ejecting " << mpath << " failed (IOCTL_STORAGE_EJECT_MEDIA)" << deviceControlRetVal << " " << GetLastError();
assert(m_callback_evt_handler);
if (m_callback_evt_handler)
wxPostEvent(m_callback_evt_handler, RemovableDriveEjectEvent(EVT_REMOVABLE_DRIVE_EJECTED, std::pair<DriveData, bool>(*it_drive_data, false)));
return;
}
CloseHandle(handle);
+ BOOST_LOG_TRIVIAL(info) << "Ejecting finished";
assert(m_callback_evt_handler);
if (m_callback_evt_handler)
wxPostEvent(m_callback_evt_handler, RemovableDriveEjectEvent(EVT_REMOVABLE_DRIVE_EJECTED, std::pair< DriveData, bool >(std::move(*it_drive_data), true)));
@@ -182,8 +188,9 @@ namespace search_for_drives_internal
//if not same file system - could be removable drive
if (! compare_filesystem_id(path, parent_path)) {
//free space
- boost::filesystem::space_info si = boost::filesystem::space(path);
- if (si.available != 0) {
+ boost::system::error_code ec;
+ boost::filesystem::space_info si = boost::filesystem::space(path, ec);
+ if (!ec && si.available != 0) {
//user id
struct stat buf;
stat(path.c_str(), &buf);
@@ -254,29 +261,43 @@ void RemovableDriveManager::eject_drive()
#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS
this->update();
#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS
+#if __APPLE__
+ // If eject is still pending on the eject thread, wait until it finishes.
+ //FIXME while waiting for the eject thread to finish, the main thread is not pumping Cocoa messages, which may lead
+ // to blocking by the diskutil tool for a couple (up to 10) seconds. This is likely not critical, as the eject normally
+ // finishes quickly.
+ this->eject_thread_finish();
+#endif
- tbb::mutex::scoped_lock lock(m_drives_mutex);
- auto it_drive_data = this->find_last_save_path_drive_data();
- if (it_drive_data != m_current_drives.end()) {
- std::string correct_path(m_last_save_path);
-#ifndef __APPLE__
- for (size_t i = 0; i < correct_path.size(); ++i)
- if (correct_path[i]==' ') {
- correct_path = correct_path.insert(i,1,'\\');
- ++ i;
- }
+ BOOST_LOG_TRIVIAL(info) << "Ejecting started";
+
+ DriveData drive_data;
+ {
+ tbb::mutex::scoped_lock lock(m_drives_mutex);
+ auto it_drive_data = this->find_last_save_path_drive_data();
+ if (it_drive_data == m_current_drives.end())
+ return;
+ drive_data = *it_drive_data;
+ }
+
+ std::string correct_path(m_last_save_path);
+#if __APPLE__
+ // On Apple, run the eject asynchronously on a worker thread, see the discussion at GH issue #4844.
+ m_eject_thread = new boost::thread([this, correct_path, drive_data]()
#endif
+ {
//std::cout<<"Ejecting "<<(*it).name<<" from "<< correct_path<<"\n";
// there is no usable command in c++ so terminal command is used instead
// but neither triggers "succesful safe removal messege"
- BOOST_LOG_TRIVIAL(info) << "Ejecting started";
- boost::process::ipstream istd_err;
- boost::process::child child(
+
+ BOOST_LOG_TRIVIAL(info) << "Ejecting started";
+ boost::process::ipstream istd_err;
+ boost::process::child child(
#if __APPLE__
boost::process::search_path("diskutil"), "eject", correct_path.c_str(), (boost::process::std_out & boost::process::std_err) > istd_err);
- //Another option how to eject at mac. Currently not working.
- //used insted of system() command;
- //this->eject_device(correct_path);
+ //Another option how to eject at mac. Currently not working.
+ //used insted of system() command;
+ //this->eject_device(correct_path);
#else
boost::process::search_path("umount"), correct_path.c_str(), (boost::process::std_out & boost::process::std_err) > istd_err);
#endif
@@ -285,22 +306,38 @@ void RemovableDriveManager::eject_drive()
BOOST_LOG_TRIVIAL(trace) << line;
}
// wait for command to finnish (blocks ui thread)
- child.wait();
- int err = child.exit_code();
- if (err) {
- BOOST_LOG_TRIVIAL(error) << "Ejecting failed";
- assert(m_callback_evt_handler);
- if (m_callback_evt_handler)
- wxPostEvent(m_callback_evt_handler, RemovableDriveEjectEvent(EVT_REMOVABLE_DRIVE_EJECTED, std::pair<DriveData, bool>(*it_drive_data, false)));
- return;
- }
- BOOST_LOG_TRIVIAL(info) << "Ejecting finished";
-
+ std::error_code ec;
+ child.wait(ec);
+ bool success = false;
+ if (ec) {
+ // The wait call can fail, as it did in https://github.com/prusa3d/PrusaSlicer/issues/5507
+ // It can happen even in cases where the eject is sucessful, but better report it as failed.
+ // We did not find a way to reliably retrieve the exit code of the process.
+ BOOST_LOG_TRIVIAL(error) << "boost::process::child::wait() failed during Ejection. State of Ejection is unknown. Error code: " << ec.value();
+ } else {
+ int err = child.exit_code();
+ if (err) {
+ BOOST_LOG_TRIVIAL(error) << "Ejecting failed. Exit code: " << err;
+ } else {
+ BOOST_LOG_TRIVIAL(info) << "Ejecting finished";
+ success = true;
+ }
+ }
assert(m_callback_evt_handler);
if (m_callback_evt_handler)
- wxPostEvent(m_callback_evt_handler, RemovableDriveEjectEvent(EVT_REMOVABLE_DRIVE_EJECTED, std::pair<DriveData, bool>(std::move(*it_drive_data), true)));
- m_current_drives.erase(it_drive_data);
+ wxPostEvent(m_callback_evt_handler, RemovableDriveEjectEvent(EVT_REMOVABLE_DRIVE_EJECTED, std::pair<DriveData, bool>(drive_data, success)));
+ if (success) {
+ // Remove the drive_data from m_current drives, searching by value, not by pointer, as m_current_drives may get modified during
+ // asynchronous execution on m_eject_thread.
+ tbb::mutex::scoped_lock lock(m_drives_mutex);
+ auto it = std::find(m_current_drives.begin(), m_current_drives.end(), drive_data);
+ if (it != m_current_drives.end())
+ m_current_drives.erase(it);
+ }
}
+#if __APPLE__
+ );
+#endif // __APPLE__
}
std::string RemovableDriveManager::get_removable_drive_path(const std::string &path)
@@ -362,7 +399,11 @@ void RemovableDriveManager::init(wxEvtHandler *callback_evt_handler)
void RemovableDriveManager::shutdown()
{
#if __APPLE__
- this->unregister_window_osx();
+ // If eject is still pending on the eject thread, wait until it finishes.
+ //FIXME while waiting for the eject thread to finish, the main thread is not pumping Cocoa messages, which may lead
+ // to blocking by the diskutil tool for a couple (up to 10) seconds. This is likely not critical, as the eject normally
+ // finishes quickly.
+ this->eject_thread_finish();
#endif
#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS
@@ -389,8 +430,8 @@ bool RemovableDriveManager::set_and_verify_last_save_path(const std::string &pat
#ifndef REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS
this->update();
#endif // REMOVABLE_DRIVE_MANAGER_OS_CALLBACKS
-
m_last_save_path = this->get_removable_drive_from_path(path);
+ m_exporting_finished = false;
return ! m_last_save_path.empty();
}
@@ -405,6 +446,7 @@ RemovableDriveManager::RemovableDrivesStatus RemovableDriveManager::status()
}
if (! out.has_eject)
m_last_save_path.clear();
+ out.has_eject = out.has_eject && m_exporting_finished;
return out;
}
@@ -450,14 +492,8 @@ void RemovableDriveManager::thread_proc()
{
std::unique_lock<std::mutex> lck(m_thread_stop_mutex);
#ifdef _WIN32
- // Windows do not send an update on insert / eject of an SD card into an external SD card reader.
- // Windows also do not send an update on software eject of a FLASH drive.
- // We can likely use the Windows WMI API, but it will be quite time consuming to implement.
- // https://www.codeproject.com/Articles/10539/Making-WMI-Queries-In-C
- // https://docs.microsoft.com/en-us/windows/win32/wmisdk/wmi-start-page
- // https://docs.microsoft.com/en-us/windows/win32/wmisdk/com-api-for-wmi
- // https://docs.microsoft.com/en-us/windows/win32/wmisdk/example--receiving-event-notifications-through-wmi-
- m_thread_stop_condition.wait_for(lck, std::chrono::seconds(2), [this]{ return m_stop || m_wakeup; });
+ // Reacting to updates by WM_DEVICECHANGE and WM_USER_MEDIACHANGED
+ m_thread_stop_condition.wait(lck, [this]{ return m_stop || m_wakeup; });
#else
m_thread_stop_condition.wait_for(lck, std::chrono::seconds(2), [this]{ return m_stop; });
#endif
@@ -478,4 +514,15 @@ std::vector<DriveData>::const_iterator RemovableDriveManager::find_last_save_pat
[this](const DriveData &data){ return data.path == m_last_save_path; });
}
+#if __APPLE__
+void RemovableDriveManager::eject_thread_finish()
+{
+ if (m_eject_thread) {
+ m_eject_thread->join();
+ delete m_eject_thread;
+ m_eject_thread = nullptr;
+ }
+}
+#endif // __APPLE__
+
}} // namespace Slic3r::GUI
diff --git a/src/slic3r/GUI/RemovableDriveManager.hpp b/src/slic3r/GUI/RemovableDriveManager.hpp
index e1a8d6faf..f707b40c3 100644
--- a/src/slic3r/GUI/RemovableDriveManager.hpp
+++ b/src/slic3r/GUI/RemovableDriveManager.hpp
@@ -83,7 +83,7 @@ public:
// Public to be accessible from RemovableDriveManagerMM::on_device_unmount OSX notification handler.
// It would be better to make this method private and friend to RemovableDriveManagerMM, but RemovableDriveManagerMM is an ObjectiveC class.
void update();
-
+ void set_exporting_finished(bool b) { m_exporting_finished = b; }
#ifdef _WIN32
// Called by Win32 Volume arrived / detached callback.
void volumes_changed();
@@ -121,7 +121,9 @@ private:
std::vector<DriveData>::const_iterator find_last_save_path_drive_data() const;
// Set with set_and_verify_last_save_path() to a removable drive path to be ejected.
std::string m_last_save_path;
-
+ // Verifies that exporting was finished so drive can be ejected.
+ // Set false by set_and_verify_last_save_path() that is called just before exporting.
+ bool m_exporting_finished;
#if __APPLE__
void register_window_osx();
void unregister_window_osx();
@@ -130,6 +132,8 @@ private:
void eject_device(const std::string &path);
// Opaque pointer to RemovableDriveManagerMM
void *m_impl_osx;
+ boost::thread *m_eject_thread { nullptr };
+ void eject_thread_finish();
#endif
};
diff --git a/src/slic3r/GUI/SavePresetDialog.cpp b/src/slic3r/GUI/SavePresetDialog.cpp
new file mode 100644
index 000000000..65bd3acb9
--- /dev/null
+++ b/src/slic3r/GUI/SavePresetDialog.cpp
@@ -0,0 +1,379 @@
+#include "SavePresetDialog.hpp"
+
+#include <cstddef>
+#include <vector>
+#include <string>
+#include <boost/algorithm/string.hpp>
+
+#include <wx/sizer.h>
+#include <wx/stattext.h>
+#include <wx/wupdlock.h>
+
+#include "libslic3r/PresetBundle.hpp"
+
+#include "GUI.hpp"
+#include "GUI_App.hpp"
+#include "format.hpp"
+#include "Tab.hpp"
+
+using Slic3r::GUI::format_wxstr;
+
+namespace Slic3r {
+namespace GUI {
+
+#define BORDER_W 10
+
+
+//-----------------------------------------------
+// SavePresetDialog::Item
+//-----------------------------------------------
+
+SavePresetDialog::Item::Item(Preset::Type type, const std::string& suffix, wxBoxSizer* sizer, SavePresetDialog* parent):
+ m_type(type),
+ m_parent(parent)
+{
+ Tab* tab = wxGetApp().get_tab(m_type);
+ assert(tab);
+ m_presets = tab->get_presets();
+
+ const Preset& sel_preset = m_presets->get_selected_preset();
+ std::string preset_name = sel_preset.is_default ? "Untitled" :
+ sel_preset.is_system ? (boost::format(("%1% - %2%")) % sel_preset.name % suffix).str() :
+ sel_preset.name;
+
+ // if name contains extension
+ if (boost::iends_with(preset_name, ".ini")) {
+ size_t len = preset_name.length() - 4;
+ preset_name.resize(len);
+ }
+
+ std::vector<std::string> values;
+ for (const Preset& preset : *m_presets) {
+ if (preset.is_default || preset.is_system || preset.is_external)
+ continue;
+ values.push_back(preset.name);
+ }
+
+ wxStaticText* label_top = new wxStaticText(m_parent, wxID_ANY, from_u8((boost::format(_utf8(L("Save %s as:"))) % into_u8(tab->title())).str()));
+
+ m_valid_bmp = new wxStaticBitmap(m_parent, wxID_ANY, create_scaled_bitmap("tick_mark", m_parent));
+
+ m_combo = new wxComboBox(m_parent, wxID_ANY, from_u8(preset_name), wxDefaultPosition, wxSize(35 * wxGetApp().em_unit(), -1));
+ for (const std::string& value : values)
+ m_combo->Append(from_u8(value));
+
+ m_combo->Bind(wxEVT_TEXT, [this](wxCommandEvent&) { update(); });
+#ifdef __WXOSX__
+ // Under OSX wxEVT_TEXT wasn't invoked after change selection in combobox,
+ // So process wxEVT_COMBOBOX too
+ m_combo->Bind(wxEVT_COMBOBOX, [this](wxCommandEvent&) { update(); });
+#endif //__WXOSX__
+
+ m_valid_label = new wxStaticText(m_parent, wxID_ANY, "");
+ m_valid_label->SetFont(wxGetApp().bold_font());
+
+ wxBoxSizer* combo_sizer = new wxBoxSizer(wxHORIZONTAL);
+ combo_sizer->Add(m_valid_bmp, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, BORDER_W);
+ combo_sizer->Add(m_combo, 1, wxEXPAND, BORDER_W);
+
+ sizer->Add(label_top, 0, wxEXPAND | wxTOP| wxBOTTOM, BORDER_W);
+ sizer->Add(combo_sizer, 0, wxEXPAND | wxBOTTOM, BORDER_W);
+ sizer->Add(m_valid_label, 0, wxEXPAND | wxLEFT, 3*BORDER_W);
+
+ if (m_type == Preset::TYPE_PRINTER)
+ m_parent->add_info_for_edit_ph_printer(sizer);
+
+ update();
+}
+
+void SavePresetDialog::Item::update()
+{
+ m_preset_name = into_u8(m_combo->GetValue());
+
+ m_valid_type = Valid;
+ wxString info_line;
+
+ const char* unusable_symbols = "<>[]:/\\|?*\"";
+
+ const std::string unusable_suffix = PresetCollection::get_suffix_modified();//"(modified)";
+ for (size_t i = 0; i < std::strlen(unusable_symbols); i++) {
+ if (m_preset_name.find_first_of(unusable_symbols[i]) != std::string::npos) {
+ info_line = _L("The supplied name is not valid;") + "\n" +
+ _L("the following characters are not allowed:") + " " + unusable_symbols;
+ m_valid_type = NoValid;
+ break;
+ }
+ }
+
+ if (m_valid_type == Valid && m_preset_name.find(unusable_suffix) != std::string::npos) {
+ info_line = _L("The supplied name is not valid;") + "\n" +
+ _L("the following suffix is not allowed:") + "\n\t" +
+ from_u8(PresetCollection::get_suffix_modified());
+ m_valid_type = NoValid;
+ }
+
+ if (m_valid_type == Valid && m_preset_name == "- default -") {
+ info_line = _L("The supplied name is not available.");
+ m_valid_type = NoValid;
+ }
+
+ const Preset* existing = m_presets->find_preset(m_preset_name, false);
+ if (m_valid_type == Valid && existing && (existing->is_default || existing->is_system)) {
+ info_line = _L("Cannot overwrite a system profile.");
+ m_valid_type = NoValid;
+ }
+
+ if (m_valid_type == Valid && existing && (existing->is_external)) {
+ info_line = _L("Cannot overwrite an external profile.");
+ m_valid_type = NoValid;
+ }
+
+ if (m_valid_type == Valid && existing && m_preset_name != m_presets->get_selected_preset_name())
+ {
+ if (existing->is_compatible)
+ info_line = from_u8((boost::format(_u8L("Preset with name \"%1%\" already exists.")) % m_preset_name).str());
+ else
+ info_line = from_u8((boost::format(_u8L("Preset with name \"%1%\" already exists and is incompatible with selected printer.")) % m_preset_name).str());
+ info_line += "\n" + _L("Note: This preset will be replaced after saving");
+ m_valid_type = Warning;
+ }
+
+ if (m_valid_type == Valid && m_preset_name.empty()) {
+ info_line = _L("The name cannot be empty.");
+ m_valid_type = NoValid;
+ }
+
+ if (m_valid_type == Valid && m_preset_name.find_first_of(' ') == 0) {
+ info_line = _L("The name cannot start with space character.");
+ m_valid_type = NoValid;
+ }
+
+ if (m_valid_type == Valid && m_preset_name.find_last_of(' ') == m_preset_name.length()-1) {
+ info_line = _L("The name cannot end with space character.");
+ m_valid_type = NoValid;
+ }
+
+ m_valid_label->SetLabel(info_line);
+ m_valid_label->Show(!info_line.IsEmpty());
+
+ update_valid_bmp();
+
+ if (m_type == Preset::TYPE_PRINTER)
+ m_parent->update_info_for_edit_ph_printer(m_preset_name);
+
+ m_parent->layout();
+}
+
+void SavePresetDialog::Item::update_valid_bmp()
+{
+ std::string bmp_name = m_valid_type == Warning ? "exclamation" :
+ m_valid_type == NoValid ? "cross" : "tick_mark" ;
+ m_valid_bmp->SetBitmap(create_scaled_bitmap(bmp_name, m_parent));
+}
+
+void SavePresetDialog::Item::accept()
+{
+ if (m_valid_type == Warning)
+ m_presets->delete_preset(m_preset_name);
+}
+
+
+//-----------------------------------------------
+// SavePresetDialog
+//-----------------------------------------------
+
+SavePresetDialog::SavePresetDialog(wxWindow* parent, Preset::Type type, std::string suffix)
+ : DPIDialog(parent, wxID_ANY, _L("Save preset"), wxDefaultPosition, wxSize(45 * wxGetApp().em_unit(), 5 * wxGetApp().em_unit()), wxDEFAULT_DIALOG_STYLE | wxICON_WARNING | wxRESIZE_BORDER)
+{
+ build(std::vector<Preset::Type>{type}, suffix);
+}
+
+SavePresetDialog::SavePresetDialog(wxWindow* parent, std::vector<Preset::Type> types, std::string suffix)
+ : DPIDialog(parent, wxID_ANY, _L("Save preset"), wxDefaultPosition, wxSize(45 * wxGetApp().em_unit(), 5 * wxGetApp().em_unit()), wxDEFAULT_DIALOG_STYLE | wxICON_WARNING | wxRESIZE_BORDER)
+{
+ build(types, suffix);
+}
+
+SavePresetDialog::~SavePresetDialog()
+{
+ for (auto item : m_items) {
+ delete item;
+ }
+}
+
+void SavePresetDialog::build(std::vector<Preset::Type> types, std::string suffix)
+{
+ SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
+#if ENABLE_WX_3_1_3_DPI_CHANGED_EVENT && defined(__WXMSW__)
+ // ys_FIXME! temporary workaround for correct font scaling
+ // Because of from wxWidgets 3.1.3 auto rescaling is implemented for the Fonts,
+ // From the very beginning set dialog font to the wxSYS_DEFAULT_GUI_FONT
+ this->SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
+#endif // ENABLE_WX_3_1_3_DPI_CHANGED_EVENT
+
+ if (suffix.empty())
+ suffix = _CTX_utf8(L_CONTEXT("Copy", "PresetName"), "PresetName");
+
+ wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL);
+
+ m_presets_sizer = new wxBoxSizer(wxVERTICAL);
+
+ // Add first item
+ for (Preset::Type type : types)
+ AddItem(type, suffix);
+
+ // Add dialog's buttons
+ wxStdDialogButtonSizer* btns = this->CreateStdDialogButtonSizer(wxOK | wxCANCEL);
+ wxButton* btnOK = static_cast<wxButton*>(this->FindWindowById(wxID_OK, this));
+ btnOK->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { accept(); });
+ btnOK->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(enable_ok_btn()); });
+
+ topSizer->Add(m_presets_sizer, 0, wxEXPAND | wxALL, BORDER_W);
+ topSizer->Add(btns, 0, wxEXPAND | wxALL, BORDER_W);
+
+ SetSizer(topSizer);
+ topSizer->SetSizeHints(this);
+
+ this->CenterOnScreen();
+}
+
+void SavePresetDialog::AddItem(Preset::Type type, const std::string& suffix)
+{
+ m_items.emplace_back(new Item{type, suffix, m_presets_sizer, this});
+}
+
+std::string SavePresetDialog::get_name()
+{
+ return m_items.front()->preset_name();
+}
+
+std::string SavePresetDialog::get_name(Preset::Type type)
+{
+ for (const Item* item : m_items)
+ if (item->type() == type)
+ return item->preset_name();
+ return "";
+}
+
+bool SavePresetDialog::enable_ok_btn() const
+{
+ for (const Item* item : m_items)
+ if (!item->is_valid())
+ return false;
+
+ return true;
+}
+
+void SavePresetDialog::add_info_for_edit_ph_printer(wxBoxSizer* sizer)
+{
+ PhysicalPrinterCollection& printers = wxGetApp().preset_bundle->physical_printers;
+ m_ph_printer_name = printers.get_selected_printer_name();
+ m_old_preset_name = printers.get_selected_printer_preset_name();
+
+ wxString msg_text = from_u8((boost::format(_u8L("You have selected physical printer \"%1%\" \n"
+ "with related printer preset \"%2%\"")) %
+ m_ph_printer_name % m_old_preset_name).str());
+ m_label = new wxStaticText(this, wxID_ANY, msg_text);
+ m_label->SetFont(wxGetApp().bold_font());
+
+ wxString choices[] = {"","",""};
+
+ m_action_radio_box = new wxRadioBox(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize,
+ WXSIZEOF(choices), choices, 3, wxRA_SPECIFY_ROWS);
+ m_action_radio_box->SetSelection(0);
+ m_action_radio_box->Bind(wxEVT_RADIOBOX, [this](wxCommandEvent& e) {
+ m_action = (ActionType)e.GetSelection(); });
+ m_action = ChangePreset;
+
+ m_radio_sizer = new wxBoxSizer(wxHORIZONTAL);
+ m_radio_sizer->Add(m_action_radio_box, 1, wxEXPAND | wxTOP, 2*BORDER_W);
+
+ sizer->Add(m_label, 0, wxEXPAND | wxLEFT | wxTOP, 3*BORDER_W);
+ sizer->Add(m_radio_sizer, 1, wxEXPAND | wxLEFT, 3*BORDER_W);
+}
+
+void SavePresetDialog::update_info_for_edit_ph_printer(const std::string& preset_name)
+{
+ bool show = wxGetApp().preset_bundle->physical_printers.has_selection() && m_old_preset_name != preset_name;
+
+ m_label->Show(show);
+ m_radio_sizer->ShowItems(show);
+ if (!show) {
+ this->SetMinSize(wxSize(100,50));
+ return;
+ }
+
+ wxString msg_text = from_u8((boost::format(_u8L("What would you like to do with \"%1%\" preset after saving?")) % preset_name).str());
+ m_action_radio_box->SetLabel(msg_text);
+
+ wxString choices[] = { from_u8((boost::format(_u8L("Change \"%1%\" to \"%2%\" for this physical printer \"%3%\"")) % m_old_preset_name % preset_name % m_ph_printer_name).str()),
+ from_u8((boost::format(_u8L("Add \"%1%\" as a next preset for the the physical printer \"%2%\"")) % preset_name % m_ph_printer_name).str()),
+ from_u8((boost::format(_u8L("Just switch to \"%1%\" preset")) % preset_name).str()) };
+
+ int n = 0;
+ for(const wxString& label: choices)
+ m_action_radio_box->SetString(n++, label);
+}
+
+void SavePresetDialog::layout()
+{
+ this->Layout();
+ this->Fit();
+}
+
+void SavePresetDialog::on_dpi_changed(const wxRect& suggested_rect)
+{
+ const int& em = em_unit();
+
+ msw_buttons_rescale(this, em, { wxID_OK, wxID_CANCEL });
+
+ for (Item* item : m_items)
+ item->update_valid_bmp();
+
+ //const wxSize& size = wxSize(45 * em, 35 * em);
+ SetMinSize(/*size*/wxSize(100, 50));
+
+ Fit();
+ Refresh();
+}
+
+void SavePresetDialog::update_physical_printers(const std::string& preset_name)
+{
+ if (m_action == UndefAction)
+ return;
+
+ PhysicalPrinterCollection& physical_printers = wxGetApp().preset_bundle->physical_printers;
+ if (!physical_printers.has_selection())
+ return;
+
+ std::string printer_preset_name = physical_printers.get_selected_printer_preset_name();
+
+ if (m_action == Switch)
+ // unselect physical printer, if it was selected
+ physical_printers.unselect_printer();
+ else
+ {
+ PhysicalPrinter printer = physical_printers.get_selected_printer();
+
+ if (m_action == ChangePreset)
+ printer.delete_preset(printer_preset_name);
+
+ if (printer.add_preset(preset_name))
+ physical_printers.save_printer(printer);
+
+ physical_printers.select_printer(printer.get_full_name(preset_name));
+ }
+}
+
+void SavePresetDialog::accept()
+{
+ for (Item* item : m_items) {
+ item->accept();
+ if (item->type() == Preset::TYPE_PRINTER)
+ update_physical_printers(item->preset_name());
+ }
+
+ EndModal(wxID_OK);
+}
+
+}} // namespace Slic3r::GUI
diff --git a/src/slic3r/GUI/SavePresetDialog.hpp b/src/slic3r/GUI/SavePresetDialog.hpp
new file mode 100644
index 000000000..2b0c71a6b
--- /dev/null
+++ b/src/slic3r/GUI/SavePresetDialog.hpp
@@ -0,0 +1,103 @@
+#ifndef slic3r_SavePresetDialog_hpp_
+#define slic3r_SavePresetDialog_hpp_
+
+//#include <wx/gdicmn.h>
+
+#include "libslic3r/Preset.hpp"
+#include "wxExtensions.hpp"
+#include "GUI_Utils.hpp"
+
+class wxString;
+class wxStaticText;
+class wxComboBox;
+class wxRadioBox;
+class wxStaticBitmap;
+
+namespace Slic3r {
+
+namespace GUI {
+
+class SavePresetDialog : public DPIDialog
+{
+ enum ActionType
+ {
+ ChangePreset,
+ AddPreset,
+ Switch,
+ UndefAction
+ };
+
+ struct Item
+ {
+ enum ValidationType
+ {
+ Valid,
+ NoValid,
+ Warning
+ };
+
+ Item(Preset::Type type, const std::string& suffix, wxBoxSizer* sizer, SavePresetDialog* parent);
+
+ void update_valid_bmp();
+ void accept();
+
+ bool is_valid() const { return m_valid_type != NoValid; }
+ Preset::Type type() const { return m_type; }
+ std::string preset_name() const { return m_preset_name; }
+
+ private:
+ Preset::Type m_type;
+ ValidationType m_valid_type;
+ std::string m_preset_name;
+
+ SavePresetDialog* m_parent {nullptr};
+ wxStaticBitmap* m_valid_bmp {nullptr};
+ wxComboBox* m_combo {nullptr};
+ wxStaticText* m_valid_label {nullptr};
+
+ PresetCollection* m_presets {nullptr};
+
+ void update();
+ };
+
+ std::vector<Item*> m_items;
+
+ wxBoxSizer* m_presets_sizer {nullptr};
+ wxStaticText* m_label {nullptr};
+ wxRadioBox* m_action_radio_box {nullptr};
+ wxBoxSizer* m_radio_sizer {nullptr};
+ ActionType m_action {UndefAction};
+
+ std::string m_ph_printer_name;
+ std::string m_old_preset_name;
+
+public:
+
+ SavePresetDialog(wxWindow* parent, Preset::Type type, std::string suffix = "");
+ SavePresetDialog(wxWindow* parent, std::vector<Preset::Type> types, std::string suffix = "");
+ ~SavePresetDialog();
+
+ void AddItem(Preset::Type type, const std::string& suffix);
+
+ std::string get_name();
+ std::string get_name(Preset::Type type);
+
+ bool enable_ok_btn() const;
+ void add_info_for_edit_ph_printer(wxBoxSizer *sizer);
+ void update_info_for_edit_ph_printer(const std::string &preset_name);
+ void layout();
+
+protected:
+ void on_dpi_changed(const wxRect& suggested_rect) override;
+ void on_sys_color_changed() override {}
+
+private:
+ void build(std::vector<Preset::Type> types, std::string suffix = "");
+ void update_physical_printers(const std::string& preset_name);
+ void accept();
+};
+
+} // namespace GUI
+} // namespace Slic3r
+
+#endif
diff --git a/src/slic3r/GUI/Search.cpp b/src/slic3r/GUI/Search.cpp
new file mode 100644
index 000000000..d61fc05e0
--- /dev/null
+++ b/src/slic3r/GUI/Search.cpp
@@ -0,0 +1,670 @@
+#include "Search.hpp"
+
+#include <cstddef>
+#include <string>
+#include <boost/algorithm/string.hpp>
+#include <boost/optional.hpp>
+#include <boost/nowide/convert.hpp>
+
+#include "wx/dataview.h"
+
+#include "libslic3r/PrintConfig.hpp"
+#include "libslic3r/PresetBundle.hpp"
+#include "GUI_App.hpp"
+#include "Plater.hpp"
+#include "Tab.hpp"
+
+#define FTS_FUZZY_MATCH_IMPLEMENTATION
+#include "fts_fuzzy_match.h"
+
+#include "imgui/imconfig.h"
+
+using boost::optional;
+
+namespace Slic3r {
+
+using GUI::from_u8;
+using GUI::into_u8;
+
+namespace Search {
+
+static char marker_by_type(Preset::Type type, PrinterTechnology pt)
+{
+ switch(type) {
+ case Preset::TYPE_PRINT:
+ case Preset::TYPE_SLA_PRINT:
+ return ImGui::PrintIconMarker;
+ case Preset::TYPE_FILAMENT:
+ return ImGui::FilamentIconMarker;
+ case Preset::TYPE_SLA_MATERIAL:
+ return ImGui::MaterialIconMarker;
+ case Preset::TYPE_PRINTER:
+ return pt == ptSLA ? ImGui::PrinterSlaIconMarker : ImGui::PrinterIconMarker;
+ default:
+ return ' ';
+ }
+}
+
+void FoundOption::get_marked_label_and_tooltip(const char** label_, const char** tooltip_) const
+{
+ *label_ = marked_label.c_str();
+ *tooltip_ = tooltip.c_str();
+}
+
+template<class T>
+//void change_opt_key(std::string& opt_key, DynamicPrintConfig* config)
+void change_opt_key(std::string& opt_key, DynamicPrintConfig* config, int& cnt)
+{
+ T* opt_cur = static_cast<T*>(config->option(opt_key));
+ cnt = opt_cur->values.size();
+ return;
+
+ if (opt_cur->values.size() > 0)
+ opt_key += "#" + std::to_string(0);
+}
+
+void OptionsSearcher::append_options(DynamicPrintConfig* config, Preset::Type type, ConfigOptionMode mode)
+{
+ auto emplace = [this, type](const std::string opt_key, const wxString& label)
+ {
+ const GroupAndCategory& gc = groups_and_categories[opt_key];
+ if (gc.group.IsEmpty() || gc.category.IsEmpty())
+ return;
+
+ wxString suffix;
+ wxString suffix_local;
+ if (gc.category == "Machine limits") {
+ suffix = opt_key.back()=='1' ? L("Stealth") : L("Normal");
+ suffix_local = " " + _(suffix);
+ suffix = " " + suffix;
+ }
+
+ if (!label.IsEmpty())
+ options.emplace_back(Option{ boost::nowide::widen(opt_key), type,
+ (label + suffix).ToStdWstring(), (_(label) + suffix_local).ToStdWstring(),
+ gc.group.ToStdWstring(), _(gc.group).ToStdWstring(),
+ gc.category.ToStdWstring(), GUI::Tab::translate_category(gc.category, type).ToStdWstring() });
+ };
+
+ for (std::string opt_key : config->keys())
+ {
+ const ConfigOptionDef& opt = config->def()->options.at(opt_key);
+ if (opt.mode > mode)
+ continue;
+
+ int cnt = 0;
+
+ if ( (type == Preset::TYPE_SLA_MATERIAL || type == Preset::TYPE_PRINTER) && opt_key != "bed_shape" && opt_key != "thumbnails")
+ switch (config->option(opt_key)->type())
+ {
+ case coInts: change_opt_key<ConfigOptionInts >(opt_key, config, cnt); break;
+ case coBools: change_opt_key<ConfigOptionBools >(opt_key, config, cnt); break;
+ case coFloats: change_opt_key<ConfigOptionFloats >(opt_key, config, cnt); break;
+ case coStrings: change_opt_key<ConfigOptionStrings >(opt_key, config, cnt); break;
+ case coPercents:change_opt_key<ConfigOptionPercents >(opt_key, config, cnt); break;
+ case coPoints: change_opt_key<ConfigOptionPoints >(opt_key, config, cnt); break;
+ default: break;
+ }
+
+ wxString label = opt.full_label.empty() ? opt.label : opt.full_label;
+
+ if (cnt == 0)
+ emplace(opt_key, label);
+ else
+ for (int i = 0; i < cnt; ++i)
+ // ! It's very important to use "#". opt_key#n is a real option key used in GroupAndCategory
+ emplace(opt_key + "#" + std::to_string(i), label);
+ }
+}
+
+// Wrap a string with ColorMarkerStart and ColorMarkerEnd symbols
+static wxString wrap_string(const wxString& str)
+{
+ return wxString::Format("%c%s%c", ImGui::ColorMarkerStart, str, ImGui::ColorMarkerEnd);
+}
+
+// Mark a string using ColorMarkerStart and ColorMarkerEnd symbols
+static std::wstring mark_string(const std::wstring &str, const std::vector<uint16_t> &matches)
+{
+ std::wstring out;
+ if (matches.empty())
+ out = str;
+ else {
+ out.reserve(str.size() * 2);
+ if (matches.front() > 0)
+ out += str.substr(0, matches.front());
+ for (size_t i = 0;;) {
+ // Find the longest string of successive indices.
+ size_t j = i + 1;
+ while (j < matches.size() && matches[j] == matches[j - 1] + 1)
+ ++ j;
+ out += ImGui::ColorMarkerStart;
+ out += str.substr(matches[i], matches[j - 1] - matches[i] + 1);
+ out += ImGui::ColorMarkerEnd;
+ if (j == matches.size()) {
+ out += str.substr(matches[j - 1] + 1);
+ break;
+ }
+ out += str.substr(matches[j - 1] + 1, matches[j] - matches[j - 1] - 1);
+ i = j;
+ }
+ }
+ return out;
+}
+
+bool OptionsSearcher::search()
+{
+ return search(search_line, true);
+}
+
+static bool fuzzy_match(const std::wstring &search_pattern, const std::wstring &label, int& out_score, std::vector<uint16_t> &out_matches)
+{
+ uint16_t matches[fts::max_matches + 1]; // +1 for the stopper
+ int score;
+ if (fts::fuzzy_match(search_pattern.c_str(), label.c_str(), score, matches)) {
+ size_t cnt = 0;
+ for (; matches[cnt] != fts::stopper; ++cnt);
+ out_matches.assign(matches, matches + cnt);
+ out_score = score;
+ return true;
+ } else
+ return false;
+}
+
+bool OptionsSearcher::search(const std::string& search, bool force/* = false*/)
+{
+ if (search_line == search && !force)
+ return false;
+
+ found.clear();
+
+ bool full_list = search.empty();
+ std::wstring sep = L" : ";
+
+ auto get_label = [this, &sep](const Option& opt)
+ {
+ std::wstring out;
+ out += marker_by_type(opt.type, printer_technology);
+ const std::wstring *prev = nullptr;
+ for (const std::wstring * const s : {
+ view_params.category ? &opt.category_local : nullptr,
+ &opt.group_local, &opt.label_local })
+ if (s != nullptr && (prev == nullptr || *prev != *s)) {
+ if (out.size()>2)
+ out += sep;
+ out += *s;
+ prev = s;
+ }
+ return out;
+ };
+
+ auto get_label_english = [this, &sep](const Option& opt)
+ {
+ std::wstring out;
+ out += marker_by_type(opt.type, printer_technology);
+ const std::wstring*prev = nullptr;
+ for (const std::wstring * const s : {
+ view_params.category ? &opt.category : nullptr,
+ &opt.group, &opt.label })
+ if (s != nullptr && (prev == nullptr || *prev != *s)) {
+ if (out.size()>2)
+ out += sep;
+ out += *s;
+ prev = s;
+ }
+ return out;
+ };
+
+ auto get_tooltip = [this, &sep](const Option& opt)
+ {
+ return marker_by_type(opt.type, printer_technology) +
+ opt.category_local + sep +
+ opt.group_local + sep + opt.label_local;
+ };
+
+ std::vector<uint16_t> matches, matches2;
+ for (size_t i=0; i < options.size(); i++)
+ {
+ const Option &opt = options[i];
+ if (full_list) {
+ std::string label = into_u8(get_label(opt));
+ found.emplace_back(FoundOption{ label, label, boost::nowide::narrow(get_tooltip(opt)), i, 0 });
+ continue;
+ }
+
+ std::wstring wsearch = boost::nowide::widen(search);
+ boost::trim_left(wsearch);
+ std::wstring label = get_label(opt);
+ std::wstring label_english = get_label_english(opt);
+ int score = std::numeric_limits<int>::min();
+ int score2;
+ matches.clear();
+ fuzzy_match(wsearch, label, score, matches);
+ if (fuzzy_match(wsearch, opt.opt_key, score2, matches2) && score2 > score) {
+ for (fts::pos_type &pos : matches2)
+ pos += label.size() + 1;
+ label += L"(" + opt.opt_key + L")";
+ append(matches, matches2);
+ score = score2;
+ }
+ if (view_params.english && fuzzy_match(wsearch, label_english, score2, matches2) && score2 > score) {
+ label = std::move(label_english);
+ matches = std::move(matches2);
+ score = score2;
+ }
+ if (score > std::numeric_limits<int>::min()) {
+ label = mark_string(label, matches);
+ label += L" [" + std::to_wstring(score) + L"]";// add score value
+ std::string label_u8 = into_u8(label);
+ std::string label_plain = label_u8;
+
+#ifdef SUPPORTS_MARKUP
+ boost::replace_all(label_plain, std::string(1, char(ImGui::ColorMarkerStart)), "<b>");
+ boost::replace_all(label_plain, std::string(1, char(ImGui::ColorMarkerEnd)), "</b>");
+#else
+ boost::erase_all(label_plain, std::string(1, char(ImGui::ColorMarkerStart)));
+ boost::erase_all(label_plain, std::string(1, char(ImGui::ColorMarkerEnd)));
+#endif
+ found.emplace_back(FoundOption{ label_plain, label_u8, boost::nowide::narrow(get_tooltip(opt)), i, score });
+ }
+ }
+
+ if (!full_list)
+ sort_found();
+
+ if (search_line != search)
+ search_line = search;
+
+ return true;
+}
+
+OptionsSearcher::OptionsSearcher()
+{
+ search_dialog = new SearchDialog(this);
+}
+
+OptionsSearcher::~OptionsSearcher()
+{
+ if (search_dialog)
+ search_dialog->Destroy();
+}
+
+void OptionsSearcher::init(std::vector<InputInfo> input_values)
+{
+ options.clear();
+ for (auto i : input_values)
+ append_options(i.config, i.type, i.mode);
+ sort_options();
+
+ search(search_line, true);
+}
+
+void OptionsSearcher::apply(DynamicPrintConfig* config, Preset::Type type, ConfigOptionMode mode)
+{
+ if (options.empty())
+ return;
+
+ options.erase(std::remove_if(options.begin(), options.end(), [type](Option opt) {
+ return opt.type == type;
+ }), options.end());
+
+ append_options(config, type, mode);
+
+ sort_options();
+
+ search(search_line, true);
+}
+
+const Option& OptionsSearcher::get_option(size_t pos_in_filter) const
+{
+ assert(pos_in_filter != size_t(-1) && found[pos_in_filter].option_idx != size_t(-1));
+ return options[found[pos_in_filter].option_idx];
+}
+
+const Option& OptionsSearcher::get_option(const std::string& opt_key) const
+{
+ auto it = std::lower_bound(options.begin(), options.end(), Option({ boost::nowide::widen(opt_key) }));
+ assert(it != options.end());
+
+ return options[it - options.begin()];
+}
+
+void OptionsSearcher::add_key(const std::string& opt_key, const wxString& group, const wxString& category)
+{
+ groups_and_categories[opt_key] = GroupAndCategory{group, category};
+}
+
+
+//------------------------------------------
+// SearchDialog
+//------------------------------------------
+
+static const std::map<const char, int> icon_idxs = {
+ {ImGui::PrintIconMarker , 0},
+ {ImGui::PrinterIconMarker , 1},
+ {ImGui::PrinterSlaIconMarker, 2},
+ {ImGui::FilamentIconMarker , 3},
+ {ImGui::MaterialIconMarker , 4},
+};
+
+SearchDialog::SearchDialog(OptionsSearcher* searcher)
+ : GUI::DPIDialog(NULL, wxID_ANY, _L("Search"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER),
+ searcher(searcher)
+{
+ SetFont(GUI::wxGetApp().normal_font());
+ wxColour bgr_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
+ SetBackgroundColour(bgr_clr);
+
+ default_string = _L("Enter a search term");
+ int border = 10;
+ int em = em_unit();
+
+ search_line = new wxTextCtrl(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxTE_PROCESS_ENTER);
+
+ search_list = new wxDataViewCtrl(this, wxID_ANY, wxDefaultPosition, wxSize(em * 40, em * 30), wxDV_NO_HEADER | wxDV_SINGLE | wxBORDER_SIMPLE);
+ search_list_model = new SearchListModel(this);
+ search_list->AssociateModel(search_list_model);
+
+ search_list->AppendBitmapColumn("", SearchListModel::colIcon);
+
+ wxDataViewTextRenderer* const markupRenderer = new wxDataViewTextRenderer();
+
+#ifdef SUPPORTS_MARKUP
+ markupRenderer->EnableMarkup();
+#endif
+
+ search_list->AppendColumn(new wxDataViewColumn("", markupRenderer, SearchListModel::colMarkedText, wxCOL_WIDTH_AUTOSIZE, wxALIGN_LEFT));
+
+ search_list->GetColumn(SearchListModel::colIcon )->SetWidth(3 * em_unit());
+ search_list->GetColumn(SearchListModel::colMarkedText)->SetWidth(40 * em_unit());
+
+ wxBoxSizer* check_sizer = new wxBoxSizer(wxHORIZONTAL);
+
+ check_category = new wxCheckBox(this, wxID_ANY, _L("Category"));
+ if (GUI::wxGetApp().is_localized())
+ check_english = new wxCheckBox(this, wxID_ANY, _L("Search in English"));
+
+ wxStdDialogButtonSizer* cancel_btn = this->CreateStdDialogButtonSizer(wxCANCEL);
+
+ check_sizer->Add(new wxStaticText(this, wxID_ANY, _L("Use for search") + ":"), 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, border);
+ check_sizer->Add(check_category, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, border);
+ if (check_english)
+ check_sizer->Add(check_english, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT, border);
+ check_sizer->AddStretchSpacer(border);
+ check_sizer->Add(cancel_btn, 0, wxALIGN_CENTER_VERTICAL);
+
+ wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL);
+
+ topSizer->Add(search_line, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, border);
+ topSizer->Add(search_list, 1, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, border);
+ topSizer->Add(check_sizer, 0, wxEXPAND | wxALL, border);
+
+ search_line->Bind(wxEVT_TEXT, &SearchDialog::OnInputText, this);
+ search_line->Bind(wxEVT_LEFT_UP, &SearchDialog::OnLeftUpInTextCtrl, this);
+ // process wxEVT_KEY_DOWN to navigate inside search_list, if ArrowUp/Down was pressed
+ search_line->Bind(wxEVT_KEY_DOWN,&SearchDialog::OnKeyDown, this);
+
+ search_list->Bind(wxEVT_DATAVIEW_SELECTION_CHANGED, &SearchDialog::OnSelect, this);
+ search_list->Bind(wxEVT_DATAVIEW_ITEM_ACTIVATED, &SearchDialog::OnActivate, this);
+#ifdef __WXMSW__
+ search_list->GetMainWindow()->Bind(wxEVT_MOTION, &SearchDialog::OnMotion, this);
+ search_list->GetMainWindow()->Bind(wxEVT_LEFT_DOWN, &SearchDialog::OnLeftDown, this);
+#endif //__WXMSW__
+
+ // Under OSX mouse and key states didn't fill after wxEVT_DATAVIEW_SELECTION_CHANGED call
+ // As a result, we can't to identify what kind of actions was done
+ // So, under OSX is used OnKeyDown function to navigate inside the list
+#ifdef __APPLE__
+ search_list->Bind(wxEVT_KEY_DOWN, &SearchDialog::OnKeyDown, this);
+#endif
+
+ check_category->Bind(wxEVT_CHECKBOX, &SearchDialog::OnCheck, this);
+ if (check_english)
+ check_english ->Bind(wxEVT_CHECKBOX, &SearchDialog::OnCheck, this);
+
+// Bind(wxEVT_MOTION, &SearchDialog::OnMotion, this);
+ Bind(wxEVT_LEFT_DOWN, &SearchDialog::OnLeftDown, this);
+
+ SetSizer(topSizer);
+ topSizer->SetSizeHints(this);
+}
+
+void SearchDialog::Popup(wxPoint position /*= wxDefaultPosition*/)
+{
+ const std::string& line = searcher->search_string();
+ search_line->SetValue(line.empty() ? default_string : from_u8(line));
+ search_line->SetFocus();
+ search_line->SelectAll();
+
+ update_list();
+
+ const OptionViewParameters& params = searcher->view_params;
+ check_category->SetValue(params.category);
+ if (check_english)
+ check_english->SetValue(params.english);
+
+ this->SetPosition(position);
+ this->ShowModal();
+}
+
+void SearchDialog::ProcessSelection(wxDataViewItem selection)
+{
+ if (!selection.IsOk())
+ return;
+
+ GUI::wxGetApp().sidebar().jump_to_option(search_list_model->GetRow(selection));
+ this->EndModal(wxID_CLOSE);
+}
+
+void SearchDialog::OnInputText(wxCommandEvent&)
+{
+ search_line->SetInsertionPointEnd();
+
+ wxString input_string = search_line->GetValue();
+ if (input_string == default_string)
+ input_string.Clear();
+
+ searcher->search(into_u8(input_string));
+
+ update_list();
+}
+
+void SearchDialog::OnLeftUpInTextCtrl(wxEvent& event)
+{
+ if (search_line->GetValue() == default_string)
+ search_line->SetValue("");
+
+ event.Skip();
+}
+
+void SearchDialog::OnKeyDown(wxKeyEvent& event)
+{
+ int key = event.GetKeyCode();
+
+ // change selected item in the list
+ if (key == WXK_UP || key == WXK_DOWN)
+ {
+ // So, for the next correct navigation, set focus on the search_list
+ search_list->SetFocus();
+
+ auto item = search_list->GetSelection();
+
+ if (item.IsOk()) {
+ unsigned selection = search_list_model->GetRow(item);
+
+ if (key == WXK_UP && selection > 0)
+ selection--;
+ if (key == WXK_DOWN && selection < unsigned(search_list_model->GetCount() - 1))
+ selection++;
+
+ prevent_list_events = true;
+ search_list->Select(search_list_model->GetItem(selection));
+ prevent_list_events = false;
+ }
+ }
+ // process "Enter" pressed
+ else if (key == WXK_NUMPAD_ENTER || key == WXK_RETURN)
+ ProcessSelection(search_list->GetSelection());
+ else
+ event.Skip(); // !Needed to have EVT_CHAR generated as well
+}
+
+void SearchDialog::OnActivate(wxDataViewEvent& event)
+{
+ ProcessSelection(event.GetItem());
+}
+
+void SearchDialog::OnSelect(wxDataViewEvent& event)
+{
+ // To avoid selection update from Select() under osx
+ if (prevent_list_events)
+ return;
+
+ // Under OSX mouse and key states didn't fill after wxEVT_DATAVIEW_SELECTION_CHANGED call
+ // As a result, we can't to identify what kind of actions was done
+ // So, under OSX is used OnKeyDown function to navigate inside the list
+#ifndef __APPLE__
+ // wxEVT_DATAVIEW_SELECTION_CHANGED is processed, when selection is changed after mouse click or press the Up/Down arrows
+ // But this two cases should be processed in different way:
+ // Up/Down arrows -> leave it as it is (just a navigation)
+ // LeftMouseClick -> call the ProcessSelection function
+ if (wxGetMouseState().LeftIsDown())
+#endif //__APPLE__
+ ProcessSelection(search_list->GetSelection());
+}
+
+void SearchDialog::update_list()
+{
+ // Under OSX model->Clear invoke wxEVT_DATAVIEW_SELECTION_CHANGED, so
+ // set prevent_list_events to true already here
+ prevent_list_events = true;
+ search_list_model->Clear();
+
+ const std::vector<FoundOption>& filters = searcher->found_options();
+ for (const FoundOption& item : filters)
+ search_list_model->Prepend(item.label);
+
+ // select first item, if search_list
+ if (search_list_model->GetCount() > 0)
+ search_list->Select(search_list_model->GetItem(0));
+ prevent_list_events = false;
+}
+
+void SearchDialog::OnCheck(wxCommandEvent& event)
+{
+ OptionViewParameters& params = searcher->view_params;
+ if (check_english)
+ params.english = check_english->GetValue();
+ params.category = check_category->GetValue();
+
+ searcher->search();
+ update_list();
+}
+
+void SearchDialog::OnMotion(wxMouseEvent& event)
+{
+ wxDataViewItem item;
+ wxDataViewColumn* col;
+ wxWindow* win = this;
+#ifdef __WXMSW__
+ win = search_list;
+#endif
+ search_list->HitTest(wxGetMousePosition() - win->GetScreenPosition(), item, col);
+ search_list->Select(item);
+
+ event.Skip();
+}
+
+void SearchDialog::OnLeftDown(wxMouseEvent& event)
+{
+ ProcessSelection(search_list->GetSelection());
+}
+
+void SearchDialog::on_dpi_changed(const wxRect& suggested_rect)
+{
+ const int& em = em_unit();
+
+ search_list_model->msw_rescale();
+ search_list->GetColumn(SearchListModel::colIcon )->SetWidth(3 * em);
+ search_list->GetColumn(SearchListModel::colMarkedText)->SetWidth(45 * em);
+
+ msw_buttons_rescale(this, em, { wxID_CANCEL });
+
+ const wxSize& size = wxSize(40 * em, 30 * em);
+ SetMinSize(size);
+
+ Fit();
+ Refresh();
+}
+
+void SearchDialog::on_sys_color_changed()
+{
+ // msw_rescale updates just icons, so use it
+ search_list_model->msw_rescale();
+
+ Refresh();
+}
+
+// ----------------------------------------------------------------------------
+// SearchListModel
+// ----------------------------------------------------------------------------
+
+SearchListModel::SearchListModel(wxWindow* parent) : wxDataViewVirtualListModel(0)
+{
+ int icon_id = 0;
+ for (const std::string& icon : { "cog", "printer", "sla_printer", "spool", "resin" })
+ m_icon[icon_id++] = ScalableBitmap(parent, icon);
+}
+
+void SearchListModel::Clear()
+{
+ m_values.clear();
+ Reset(0);
+}
+
+void SearchListModel::Prepend(const std::string& label)
+{
+ const char icon_c = label.at(0);
+ int icon_idx = icon_idxs.at(icon_c);
+ wxString str = from_u8(label).Remove(0, 1);
+
+ m_values.emplace_back(str, icon_idx);
+
+ RowPrepended();
+}
+
+void SearchListModel::msw_rescale()
+{
+ for (ScalableBitmap& bmp : m_icon)
+ bmp.msw_rescale();
+}
+
+wxString SearchListModel::GetColumnType(unsigned int col) const
+{
+ if (col == colIcon)
+ return "wxBitmap";
+ return "string";
+}
+
+void SearchListModel::GetValueByRow(wxVariant& variant,
+ unsigned int row, unsigned int col) const
+{
+ switch (col)
+ {
+ case colIcon:
+ variant << m_icon[m_values[row].second].bmp();
+ break;
+ case colMarkedText:
+ variant = m_values[row].first;
+ break;
+ case colMax:
+ wxFAIL_MSG("invalid column");
+ default:
+ break;
+ }
+}
+
+
+}
+
+} // namespace Slic3r::GUI
diff --git a/src/slic3r/GUI/Search.hpp b/src/slic3r/GUI/Search.hpp
new file mode 100644
index 000000000..f8c9dffa6
--- /dev/null
+++ b/src/slic3r/GUI/Search.hpp
@@ -0,0 +1,218 @@
+#ifndef slic3r_SearchComboBox_hpp_
+#define slic3r_SearchComboBox_hpp_
+
+#include <vector>
+#include <map>
+
+#include <wx/panel.h>
+#include <wx/sizer.h>
+#include <wx/listctrl.h>
+
+#include <wx/combo.h>
+
+#include <wx/checkbox.h>
+#include <wx/dialog.h>
+
+#include "GUI_Utils.hpp"
+#include "wxExtensions.hpp"
+#include "libslic3r/Preset.hpp"
+
+
+namespace Slic3r {
+
+namespace Search{
+
+class SearchDialog;
+
+struct InputInfo
+{
+ DynamicPrintConfig* config {nullptr};
+ Preset::Type type {Preset::TYPE_INVALID};
+ ConfigOptionMode mode {comSimple};
+};
+
+struct GroupAndCategory {
+ wxString group;
+ wxString category;
+};
+
+struct Option {
+// bool operator<(const Option& other) const { return other.label > this->label; }
+ bool operator<(const Option& other) const { return other.opt_key > this->opt_key; }
+
+ // Fuzzy matching works at a character level. Thus matching with wide characters is a safer bet than with short characters,
+ // though for some languages (Chinese?) it may not work correctly.
+ std::wstring opt_key;
+ Preset::Type type {Preset::TYPE_INVALID};
+ std::wstring label;
+ std::wstring label_local;
+ std::wstring group;
+ std::wstring group_local;
+ std::wstring category;
+ std::wstring category_local;
+};
+
+struct FoundOption {
+ // UTF8 encoding, to be consumed by ImGUI by reference.
+ std::string label;
+ std::string marked_label;
+ std::string tooltip;
+ size_t option_idx {0};
+ int outScore {0};
+
+ // Returning pointers to contents of std::string members, to be used by ImGUI for rendering.
+ void get_marked_label_and_tooltip(const char** label, const char** tooltip) const;
+};
+
+struct OptionViewParameters
+{
+ bool category {false};
+ bool english {false};
+
+ int hovered_id {0};
+};
+
+class OptionsSearcher
+{
+ std::string search_line;
+ std::map<std::string, GroupAndCategory> groups_and_categories;
+ PrinterTechnology printer_technology;
+
+ std::vector<Option> options {};
+ std::vector<FoundOption> found {};
+
+ void append_options(DynamicPrintConfig* config, Preset::Type type, ConfigOptionMode mode);
+
+ void sort_options() {
+ std::sort(options.begin(), options.end(), [](const Option& o1, const Option& o2) {
+ return o1.label < o2.label; });
+ }
+ void sort_found() {
+ std::sort(found.begin(), found.end(), [](const FoundOption& f1, const FoundOption& f2) {
+ return f1.outScore > f2.outScore || (f1.outScore == f2.outScore && f1.label < f2.label); });
+ };
+
+ size_t options_size() const { return options.size(); }
+ size_t found_size() const { return found.size(); }
+
+public:
+ OptionViewParameters view_params;
+
+ SearchDialog* search_dialog { nullptr };
+
+ OptionsSearcher();
+ ~OptionsSearcher();
+
+ void init(std::vector<InputInfo> input_values);
+ void apply(DynamicPrintConfig *config,
+ Preset::Type type,
+ ConfigOptionMode mode);
+ bool search();
+ bool search(const std::string& search, bool force = false);
+
+ void add_key(const std::string& opt_key, const wxString& group, const wxString& category);
+
+ size_t size() const { return found_size(); }
+
+ const FoundOption& operator[](const size_t pos) const noexcept { return found[pos]; }
+ const Option& get_option(size_t pos_in_filter) const;
+ const Option& get_option(const std::string& opt_key) const;
+
+ const std::vector<FoundOption>& found_options() { return found; }
+ const GroupAndCategory& get_group_and_category (const std::string& opt_key) { return groups_and_categories[opt_key]; }
+ std::string& search_string() { return search_line; }
+
+ void set_printer_technology(PrinterTechnology pt) { printer_technology = pt; }
+
+ void sort_options_by_opt_key() {
+ std::sort(options.begin(), options.end(), [](const Option& o1, const Option& o2) {
+ return o1.opt_key < o2.opt_key; });
+ }
+};
+
+
+//------------------------------------------
+// SearchDialog
+//------------------------------------------
+class SearchListModel;
+class SearchDialog : public GUI::DPIDialog
+{
+ wxString search_str;
+ wxString default_string;
+
+ bool prevent_list_events {false};
+
+ wxTextCtrl* search_line { nullptr };
+ wxDataViewCtrl* search_list { nullptr };
+ SearchListModel* search_list_model { nullptr };
+ wxCheckBox* check_category { nullptr };
+ wxCheckBox* check_english { nullptr };
+
+ OptionsSearcher* searcher { nullptr };
+
+ void OnInputText(wxCommandEvent& event);
+ void OnLeftUpInTextCtrl(wxEvent& event);
+ void OnKeyDown(wxKeyEvent& event);
+
+ void OnActivate(wxDataViewEvent& event);
+ void OnSelect(wxDataViewEvent& event);
+
+ void OnCheck(wxCommandEvent& event);
+ void OnMotion(wxMouseEvent& event);
+ void OnLeftDown(wxMouseEvent& event);
+
+ void update_list();
+
+public:
+ SearchDialog(OptionsSearcher* searcher);
+ ~SearchDialog() {}
+
+ void Popup(wxPoint position = wxDefaultPosition);
+ void ProcessSelection(wxDataViewItem selection);
+
+protected:
+ void on_dpi_changed(const wxRect& suggested_rect) override;
+ void on_sys_color_changed() override;
+};
+
+
+// ----------------------------------------------------------------------------
+// SearchListModel
+// ----------------------------------------------------------------------------
+
+class SearchListModel : public wxDataViewVirtualListModel
+{
+ std::vector<std::pair<wxString, int>> m_values;
+ ScalableBitmap m_icon[5];
+
+public:
+ enum {
+ colIcon,
+ colMarkedText,
+ colMax
+ };
+
+ SearchListModel(wxWindow* parent);
+
+ // helper methods to change the model
+
+ void Clear();
+ void Prepend(const std::string& text);
+ void msw_rescale();
+
+ // implementation of base class virtuals to define model
+
+ unsigned int GetColumnCount() const override { return colMax; }
+ wxString GetColumnType(unsigned int col) const override;
+ void GetValueByRow(wxVariant& variant, unsigned int row, unsigned int col) const override;
+ bool GetAttrByRow(unsigned int row, unsigned int col, wxDataViewItemAttr& attr) const override { return true; }
+ bool SetValueByRow(const wxVariant& variant, unsigned int row, unsigned int col) override { return false; }
+};
+
+
+
+
+} // Search namespace
+}
+
+#endif //slic3r_SearchComboBox_hpp_
diff --git a/src/slic3r/GUI/Selection.cpp b/src/slic3r/GUI/Selection.cpp
index 146111f49..cdd3ebe85 100644
--- a/src/slic3r/GUI/Selection.cpp
+++ b/src/slic3r/GUI/Selection.cpp
@@ -1,20 +1,24 @@
#include "libslic3r/libslic3r.h"
#include "Selection.hpp"
+#include "3DScene.hpp"
#include "GLCanvas3D.hpp"
#include "GUI_App.hpp"
#include "GUI.hpp"
#include "GUI_ObjectManipulation.hpp"
#include "GUI_ObjectList.hpp"
#include "Gizmos/GLGizmoBase.hpp"
-#include "3DScene.hpp"
#include "Camera.hpp"
+#include "Plater.hpp"
+
+#include "libslic3r/Model.hpp"
#include <GL/glew.h>
#include <boost/algorithm/string/predicate.hpp>
+#include <boost/log/trivial.hpp>
-static const float UNIFORM_SCALE_COLOR[3] = { 1.0f, 0.38f, 0.0f };
+static const float UNIFORM_SCALE_COLOR[4] = { 0.923f, 0.504f, 0.264f, 1.0f };
namespace Slic3r {
namespace GUI {
@@ -54,7 +58,7 @@ bool Selection::Clipboard::is_sla_compliant() const
if (m_mode == Selection::Volume)
return false;
- for (const ModelObject* o : m_model.objects)
+ for (const ModelObject* o : m_model->objects)
{
if (o->is_multiparts())
return false;
@@ -69,6 +73,35 @@ bool Selection::Clipboard::is_sla_compliant() const
return true;
}
+Selection::Clipboard::Clipboard()
+{
+ m_model.reset(new Model);
+}
+
+void Selection::Clipboard::reset() {
+ m_model->clear_objects();
+}
+
+bool Selection::Clipboard::is_empty() const
+{
+ return m_model->objects.empty();
+}
+
+ModelObject* Selection::Clipboard::add_object()
+{
+ return m_model->add_object();
+}
+
+ModelObject* Selection::Clipboard::get_object(unsigned int id)
+{
+ return (id < (unsigned int)m_model->objects.size()) ? m_model->objects[id] : nullptr;
+}
+
+const ModelObjectPtrs& Selection::Clipboard::get_objects() const
+{
+ return m_model->objects;
+}
+
Selection::Selection()
: m_volumes(nullptr)
, m_model(nullptr)
@@ -76,7 +109,6 @@ Selection::Selection()
, m_mode(Instance)
, m_type(Empty)
, m_valid(false)
- , m_curved_arrow(16)
, m_scale_factor(1.0f)
{
this->set_bounding_boxes_dirty();
@@ -104,15 +136,8 @@ void Selection::set_volumes(GLVolumePtrs* volumes)
// Init shall be called from the OpenGL render function, so that the OpenGL context is initialized!
bool Selection::init()
{
- if (!m_arrow.init())
- return false;
-
- m_arrow.set_scale(5.0 * Vec3d::Ones());
-
- if (!m_curved_arrow.init())
- return false;
-
- m_curved_arrow.set_scale(5.0 * Vec3d::Ones());
+ m_arrow.init_from(straight_arrow(10.0f, 5.0f, 5.0f, 10.0f, 1.0f));
+ m_curved_arrow.init_from(circular_arrow(16, 10.0f, 5.0f, 10.0f, 5.0f, 1.0f));
return true;
}
@@ -440,6 +465,10 @@ void Selection::clear()
update_type();
this->set_bounding_boxes_dirty();
+ // this happens while the application is closing
+ if (wxGetApp().obj_manipul() == nullptr)
+ return;
+
// resets the cache in the sidebar
wxGetApp().obj_manipul()->reset_cache();
@@ -805,30 +834,21 @@ void Selection::flattening_rotate(const Vec3d& normal)
// We get the normal in untransformed coordinates. We must transform it using the instance matrix, find out
// how to rotate the instance so it faces downwards and do the rotation. All that for all selected instances.
// The function assumes that is_from_single_object() holds.
+ assert(Slic3r::is_approx(normal.norm(), 1.));
if (!m_valid)
return;
for (unsigned int i : m_list)
{
- Transform3d wst = m_cache.volumes_data[i].get_instance_scale_matrix();
- Vec3d scaling_factor = Vec3d(1. / wst(0, 0), 1. / wst(1, 1), 1. / wst(2, 2));
-
- Transform3d wmt = m_cache.volumes_data[i].get_instance_mirror_matrix();
- Vec3d mirror(wmt(0, 0), wmt(1, 1), wmt(2, 2));
-
- Vec3d rotation = Geometry::extract_euler_angles(m_cache.volumes_data[i].get_instance_rotation_matrix());
- Vec3d transformed_normal = Geometry::assemble_transform(Vec3d::Zero(), rotation, scaling_factor, mirror) * normal;
- transformed_normal.normalize();
-
- Vec3d axis = transformed_normal(2) > 0.999f ? Vec3d(1., 0., 0.) : Vec3d(transformed_normal.cross(Vec3d(0., 0., -1.)));
- axis.normalize();
-
- Transform3d extra_rotation = Transform3d::Identity();
- extra_rotation.rotate(Eigen::AngleAxisd(acos(-transformed_normal(2)), axis));
-
- Vec3d new_rotation = Geometry::extract_euler_angles(extra_rotation * m_cache.volumes_data[i].get_instance_rotation_matrix());
- (*m_volumes)[i]->set_instance_rotation(new_rotation);
+ // Normal transformed from the object coordinate space to the world coordinate space.
+ const auto &voldata = m_cache.volumes_data[i];
+ Vec3d tnormal = (Geometry::assemble_transform(
+ Vec3d::Zero(), voldata.get_instance_rotation(),
+ voldata.get_instance_scaling_factor().cwiseInverse(), voldata.get_instance_mirror()) * normal).normalized();
+ // Additional rotation to align tnormal with the down vector in the world coordinate space.
+ auto extra_rotation = Eigen::Quaterniond().setFromTwoVectors(tnormal, - Vec3d::UnitZ());
+ (*m_volumes)[i]->set_instance_rotation(Geometry::extract_euler_angles(extra_rotation.toRotationMatrix() * m_cache.volumes_data[i].get_instance_rotation_matrix()));
}
#if !DISABLE_INSTANCES_SYNCH
@@ -1223,40 +1243,40 @@ void Selection::render_center(bool gizmo_is_dragging) const
}
#endif // ENABLE_RENDER_SELECTION_CENTER
-void Selection::render_sidebar_hints(const std::string& sidebar_field, const Shader& shader) const
+void Selection::render_sidebar_hints(const std::string& sidebar_field) const
{
if (sidebar_field.empty())
return;
+ GLShaderProgram* shader = nullptr;
+
if (!boost::starts_with(sidebar_field, "layer"))
{
- shader.start_using();
+ shader = wxGetApp().get_shader("gouraud_light");
+ if (shader == nullptr)
+ return;
+
+ shader->start_using();
glsafe(::glClear(GL_DEPTH_BUFFER_BIT));
- glsafe(::glEnable(GL_LIGHTING));
}
glsafe(::glEnable(GL_DEPTH_TEST));
glsafe(::glPushMatrix());
- if (!boost::starts_with(sidebar_field, "layer"))
- {
+ if (!boost::starts_with(sidebar_field, "layer")) {
const Vec3d& center = get_bounding_box().center();
- if (is_single_full_instance() && !wxGetApp().obj_manipul()->get_world_coordinates())
- {
+ if (is_single_full_instance() && !wxGetApp().obj_manipul()->get_world_coordinates()) {
glsafe(::glTranslated(center(0), center(1), center(2)));
- if (!boost::starts_with(sidebar_field, "position"))
- {
+ if (!boost::starts_with(sidebar_field, "position")) {
Transform3d orient_matrix = Transform3d::Identity();
if (boost::starts_with(sidebar_field, "scale"))
orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true);
- else if (boost::starts_with(sidebar_field, "rotation"))
- {
+ else if (boost::starts_with(sidebar_field, "rotation")) {
if (boost::ends_with(sidebar_field, "x"))
orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true);
- else if (boost::ends_with(sidebar_field, "y"))
- {
+ else if (boost::ends_with(sidebar_field, "y")) {
const Vec3d& rotation = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_rotation();
if (rotation(0) == 0.0)
orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true);
@@ -1267,21 +1287,16 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field, const Sha
glsafe(::glMultMatrixd(orient_matrix.data()));
}
- }
- else if (is_single_volume() || is_single_modifier())
- {
+ } else if (is_single_volume() || is_single_modifier()) {
glsafe(::glTranslated(center(0), center(1), center(2)));
Transform3d orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true);
if (!boost::starts_with(sidebar_field, "position"))
orient_matrix = orient_matrix * (*m_volumes)[*m_list.begin()]->get_volume_transformation().get_matrix(true, false, true, true);
glsafe(::glMultMatrixd(orient_matrix.data()));
- }
- else
- {
+ } else {
glsafe(::glTranslated(center(0), center(1), center(2)));
- if (requires_local_axes())
- {
+ if (requires_local_axes()) {
Transform3d orient_matrix = (*m_volumes)[*m_list.begin()]->get_instance_transformation().get_matrix(true, false, true, true);
glsafe(::glMultMatrixd(orient_matrix.data()));
}
@@ -1292,20 +1307,15 @@ void Selection::render_sidebar_hints(const std::string& sidebar_field, const Sha
render_sidebar_position_hints(sidebar_field);
else if (boost::starts_with(sidebar_field, "rotation"))
render_sidebar_rotation_hints(sidebar_field);
- else if (boost::starts_with(sidebar_field, "scale"))
+ else if (boost::starts_with(sidebar_field, "scale") || boost::starts_with(sidebar_field, "size"))
render_sidebar_scale_hints(sidebar_field);
- else if (boost::starts_with(sidebar_field, "size"))
- render_sidebar_size_hints(sidebar_field);
else if (boost::starts_with(sidebar_field, "layer"))
render_sidebar_layers_hints(sidebar_field);
glsafe(::glPopMatrix());
if (!boost::starts_with(sidebar_field, "layer"))
- {
- glsafe(::glDisable(GL_LIGHTING));
- shader.stop_using();
- }
+ shader->stop_using();
}
bool Selection::requires_local_axes() const
@@ -1326,12 +1336,12 @@ void Selection::copy_to_clipboard()
ModelObject* dst_object = m_clipboard.add_object();
dst_object->name = src_object->name;
dst_object->input_file = src_object->input_file;
- static_cast<DynamicPrintConfig&>(dst_object->config) = static_cast<const DynamicPrintConfig&>(src_object->config);
+ dst_object->config.assign_config(src_object->config);
dst_object->sla_support_points = src_object->sla_support_points;
dst_object->sla_points_status = src_object->sla_points_status;
dst_object->sla_drain_holes = src_object->sla_drain_holes;
dst_object->layer_config_ranges = src_object->layer_config_ranges; // #ys_FIXME_experiment
- dst_object->layer_height_profile = src_object->layer_height_profile;
+ dst_object->layer_height_profile.assign(src_object->layer_height_profile);
dst_object->origin_translation = src_object->origin_translation;
for (int i : object.second)
@@ -1557,20 +1567,21 @@ void Selection::update_type()
}
else
{
+ unsigned int sla_volumes_count = 0;
+ // Note: sla_volumes_count is a count of the selected sla_volumes per object instead of per instance, like a model_volumes_count is
+ for (unsigned int i : m_list) {
+ if ((*m_volumes)[i]->volume_idx() < 0)
+ ++sla_volumes_count;
+ }
+
if (m_cache.content.size() == 1) // single object
{
const ModelObject* model_object = m_model->objects[m_cache.content.begin()->first];
unsigned int model_volumes_count = (unsigned int)model_object->volumes.size();
- unsigned int sla_volumes_count = 0;
- for (unsigned int i : m_list)
- {
- if ((*m_volumes)[i]->volume_idx() < 0)
- ++sla_volumes_count;
- }
- unsigned int volumes_count = model_volumes_count + sla_volumes_count;
+
unsigned int instances_count = (unsigned int)model_object->instances.size();
unsigned int selected_instances_count = (unsigned int)m_cache.content.begin()->second.size();
- if (volumes_count * instances_count == (unsigned int)m_list.size())
+ if (model_volumes_count * instances_count + sla_volumes_count == (unsigned int)m_list.size())
{
m_type = SingleFullObject;
// ensures the correct mode is selected
@@ -1578,7 +1589,7 @@ void Selection::update_type()
}
else if (selected_instances_count == 1)
{
- if (volumes_count == (unsigned int)m_list.size())
+ if (model_volumes_count + sla_volumes_count == (unsigned int)m_list.size())
{
m_type = SingleFullInstance;
// ensures the correct mode is selected
@@ -1601,7 +1612,7 @@ void Selection::update_type()
requires_disable = true;
}
}
- else if ((selected_instances_count > 1) && (selected_instances_count * volumes_count == (unsigned int)m_list.size()))
+ else if ((selected_instances_count > 1) && (selected_instances_count * model_volumes_count + sla_volumes_count == (unsigned int)m_list.size()))
{
m_type = MultipleFullInstance;
// ensures the correct mode is selected
@@ -1618,7 +1629,7 @@ void Selection::update_type()
unsigned int instances_count = (unsigned int)model_object->instances.size();
sels_cntr += volumes_count * instances_count;
}
- if (sels_cntr == (unsigned int)m_list.size())
+ if (sels_cntr + sla_volumes_count == (unsigned int)m_list.size())
{
m_type = MultipleFullObject;
// ensures the correct mode is selected
@@ -1907,57 +1918,85 @@ void Selection::render_bounding_box(const BoundingBoxf3& box, float* color) cons
void Selection::render_sidebar_position_hints(const std::string& sidebar_field) const
{
- if (boost::ends_with(sidebar_field, "x"))
- {
+ auto set_color = [](Axis axis) {
+ GLShaderProgram* shader = wxGetApp().get_current_shader();
+ if (shader != nullptr)
+ shader->set_uniform("uniform_color", AXES_COLOR[axis], 4);
+ };
+
+ if (boost::ends_with(sidebar_field, "x")) {
+ set_color(X);
glsafe(::glRotated(-90.0, 0.0, 0.0, 1.0));
- render_sidebar_position_hint(X);
- }
- else if (boost::ends_with(sidebar_field, "y"))
- render_sidebar_position_hint(Y);
- else if (boost::ends_with(sidebar_field, "z"))
- {
+ m_arrow.render();
+ } else if (boost::ends_with(sidebar_field, "y")) {
+ set_color(Y);
+ m_arrow.render();
+ } else if (boost::ends_with(sidebar_field, "z")) {
+ set_color(Z);
glsafe(::glRotated(90.0, 1.0, 0.0, 0.0));
- render_sidebar_position_hint(Z);
+ m_arrow.render();
}
}
void Selection::render_sidebar_rotation_hints(const std::string& sidebar_field) const
{
- if (boost::ends_with(sidebar_field, "x"))
- {
+ auto set_color = [](Axis axis) {
+ GLShaderProgram* shader = wxGetApp().get_current_shader();
+ if (shader != nullptr)
+ shader->set_uniform("uniform_color", AXES_COLOR[axis], 4);
+ };
+
+ auto render_sidebar_rotation_hint = [this]() {
+ m_curved_arrow.render();
+ glsafe(::glRotated(180.0, 0.0, 0.0, 1.0));
+ m_curved_arrow.render();
+ };
+
+ if (boost::ends_with(sidebar_field, "x")) {
+ set_color(X);
glsafe(::glRotated(90.0, 0.0, 1.0, 0.0));
- render_sidebar_rotation_hint(X);
- }
- else if (boost::ends_with(sidebar_field, "y"))
- {
+ render_sidebar_rotation_hint();
+ } else if (boost::ends_with(sidebar_field, "y")) {
+ set_color(Y);
glsafe(::glRotated(-90.0, 1.0, 0.0, 0.0));
- render_sidebar_rotation_hint(Y);
+ render_sidebar_rotation_hint();
+ } else if (boost::ends_with(sidebar_field, "z")) {
+ set_color(Z);
+ render_sidebar_rotation_hint();
}
- else if (boost::ends_with(sidebar_field, "z"))
- render_sidebar_rotation_hint(Z);
}
void Selection::render_sidebar_scale_hints(const std::string& sidebar_field) const
{
bool uniform_scale = requires_uniform_scale() || wxGetApp().obj_manipul()->get_uniform_scaling();
- if (boost::ends_with(sidebar_field, "x") || uniform_scale)
- {
+ auto render_sidebar_scale_hint = [this, uniform_scale](Axis axis) {
+ GLShaderProgram* shader = wxGetApp().get_current_shader();
+ if (shader != nullptr)
+ shader->set_uniform("uniform_color", uniform_scale ? UNIFORM_SCALE_COLOR : AXES_COLOR[axis], 4);
+
+ glsafe(::glTranslated(0.0, 5.0, 0.0));
+ m_arrow.render();
+
+ glsafe(::glTranslated(0.0, -10.0, 0.0));
+ glsafe(::glRotated(180.0, 0.0, 0.0, 1.0));
+ m_arrow.render();
+ };
+
+ if (boost::ends_with(sidebar_field, "x") || uniform_scale) {
glsafe(::glPushMatrix());
glsafe(::glRotated(-90.0, 0.0, 0.0, 1.0));
render_sidebar_scale_hint(X);
glsafe(::glPopMatrix());
}
- if (boost::ends_with(sidebar_field, "y") || uniform_scale)
- {
+ if (boost::ends_with(sidebar_field, "y") || uniform_scale) {
glsafe(::glPushMatrix());
render_sidebar_scale_hint(Y);
glsafe(::glPopMatrix());
}
- if (boost::ends_with(sidebar_field, "z") || uniform_scale)
- {
+ if (boost::ends_with(sidebar_field, "z") || uniform_scale) {
glsafe(::glPushMatrix());
glsafe(::glRotated(90.0, 1.0, 0.0, 0.0));
render_sidebar_scale_hint(Z);
@@ -1965,11 +2004,6 @@ void Selection::render_sidebar_scale_hints(const std::string& sidebar_field) con
}
}
-void Selection::render_sidebar_size_hints(const std::string& sidebar_field) const
-{
- render_sidebar_scale_hints(sidebar_field);
-}
-
void Selection::render_sidebar_layers_hints(const std::string& sidebar_field) const
{
static const double Margin = 10.0;
@@ -2042,37 +2076,6 @@ void Selection::render_sidebar_layers_hints(const std::string& sidebar_field) co
glsafe(::glDisable(GL_BLEND));
}
-void Selection::render_sidebar_position_hint(Axis axis) const
-{
- m_arrow.set_color(AXES_COLOR[axis], 3);
- m_arrow.render();
-}
-
-void Selection::render_sidebar_rotation_hint(Axis axis) const
-{
- m_curved_arrow.set_color(AXES_COLOR[axis], 3);
- m_curved_arrow.render();
-
- glsafe(::glRotated(180.0, 0.0, 0.0, 1.0));
- m_curved_arrow.render();
-}
-
-void Selection::render_sidebar_scale_hint(Axis axis) const
-{
- m_arrow.set_color(((requires_uniform_scale() || wxGetApp().obj_manipul()->get_uniform_scaling()) ? UNIFORM_SCALE_COLOR : AXES_COLOR[axis]), 3);
-
- glsafe(::glTranslated(0.0, 5.0, 0.0));
- m_arrow.render();
-
- glsafe(::glTranslated(0.0, -10.0, 0.0));
- glsafe(::glRotated(180.0, 0.0, 0.0, 1.0));
- m_arrow.render();
-}
-
-void Selection::render_sidebar_size_hint(Axis axis, double length) const
-{
-}
-
#ifndef NDEBUG
static bool is_rotation_xy_synchronized(const Vec3d &rot_xyz_from, const Vec3d &rot_xyz_to)
{
diff --git a/src/slic3r/GUI/Selection.hpp b/src/slic3r/GUI/Selection.hpp
index c27b4cc29..4da9e44a3 100644
--- a/src/slic3r/GUI/Selection.hpp
+++ b/src/slic3r/GUI/Selection.hpp
@@ -3,7 +3,7 @@
#include <set>
#include "libslic3r/Geometry.hpp"
-#include "3DScene.hpp"
+#include "GLModel.hpp"
#if ENABLE_RENDER_SELECTION_CENTER
class GLUquadric;
@@ -11,7 +11,20 @@ typedef class GLUquadric GLUquadricObj;
#endif // ENABLE_RENDER_SELECTION_CENTER
namespace Slic3r {
+
class Shader;
+class Model;
+class ModelObject;
+class GLVolume;
+class GLArrow;
+class GLCurvedArrow;
+class DynamicPrintConfig;
+class GLShaderProgram;
+
+using GLVolumePtrs = std::vector<GLVolume*>;
+using ModelObjectPtrs = std::vector<ModelObject*>;
+
+
namespace GUI {
class TransformationType
{
@@ -145,18 +158,23 @@ public:
class Clipboard
{
- Model m_model;
+ // Model is stored through a pointer to avoid including heavy Model.hpp.
+ // It is created in constructor.
+ std::unique_ptr<Model> m_model;
+
Selection::EMode m_mode;
public:
- void reset() { m_model.clear_objects(); }
- bool is_empty() const { return m_model.objects.empty(); }
+ Clipboard();
+
+ void reset();
+ bool is_empty() const;
bool is_sla_compliant() const;
- ModelObject* add_object() { return m_model.add_object(); }
- ModelObject* get_object(unsigned int id) { return (id < (unsigned int)m_model.objects.size()) ? m_model.objects[id] : nullptr; }
- const ModelObjectPtrs& get_objects() const { return m_model.objects; }
+ ModelObject* add_object();
+ ModelObject* get_object(unsigned int id);
+ const ModelObjectPtrs& get_objects() const;
Selection::EMode get_mode() const { return m_mode; }
void set_mode(Selection::EMode mode) { m_mode = mode; }
@@ -200,8 +218,9 @@ private:
#if ENABLE_RENDER_SELECTION_CENTER
GLUquadricObj* m_quadric;
#endif // ENABLE_RENDER_SELECTION_CENTER
- mutable GLArrow m_arrow;
- mutable GLCurvedArrow m_curved_arrow;
+
+ GLModel m_arrow;
+ GLModel m_curved_arrow;
mutable float m_scale_factor;
@@ -316,7 +335,7 @@ public:
#if ENABLE_RENDER_SELECTION_CENTER
void render_center(bool gizmo_is_dragging) const;
#endif // ENABLE_RENDER_SELECTION_CENTER
- void render_sidebar_hints(const std::string& sidebar_field, const Shader& shader) const;
+ void render_sidebar_hints(const std::string& sidebar_field) const;
bool requires_local_axes() const;
@@ -357,12 +376,7 @@ private:
void render_sidebar_position_hints(const std::string& sidebar_field) const;
void render_sidebar_rotation_hints(const std::string& sidebar_field) const;
void render_sidebar_scale_hints(const std::string& sidebar_field) const;
- void render_sidebar_size_hints(const std::string& sidebar_field) const;
void render_sidebar_layers_hints(const std::string& sidebar_field) const;
- void render_sidebar_position_hint(Axis axis) const;
- void render_sidebar_rotation_hint(Axis axis) const;
- void render_sidebar_scale_hint(Axis axis) const;
- void render_sidebar_size_hint(Axis axis, double length) const;
public:
enum SyncRotationType {
diff --git a/src/slic3r/GUI/SysInfoDialog.cpp b/src/slic3r/GUI/SysInfoDialog.cpp
index a1bae8742..8d9572b47 100644
--- a/src/slic3r/GUI/SysInfoDialog.cpp
+++ b/src/slic3r/GUI/SysInfoDialog.cpp
@@ -3,12 +3,16 @@
#include "3DScene.hpp"
#include "GUI.hpp"
#include "../Utils/UndoRedo.hpp"
+#include "Plater.hpp"
#include <string>
+#include <Eigen/Core>
+
#include <wx/clipbrd.h>
#include <wx/platinfo.h>
#include "GUI_App.hpp"
+#include "MainFrame.hpp"
#include "wxExtensions.hpp"
#ifdef _WIN32
@@ -31,9 +35,9 @@ std::string get_main_info(bool format_as_html)
std::string line_end = format_as_html ? "<br>" : "\n";
if (!format_as_html)
- out << b_start << SLIC3R_APP_NAME << b_end << line_end;
+ out << b_start << (wxGetApp().is_editor() ? SLIC3R_APP_NAME : GCODEVIEWER_APP_NAME) << b_end << line_end;
out << b_start << "Version: " << b_end << SLIC3R_VERSION << line_end;
- out << b_start << "Build: " << b_end << SLIC3R_BUILD_ID << line_end;
+ out << b_start << "Build: " << b_end << (wxGetApp().is_editor() ? SLIC3R_BUILD_ID : GCODEVIEWER_BUILD_ID) << line_end;
out << line_end;
out << b_start << "Operating System: " << b_end << wxPlatformInfo::Get().GetOperatingSystemFamilyName() << line_end;
out << b_start << "System Architecture: " << b_end << wxPlatformInfo::Get().GetArchName() << line_end;
@@ -75,7 +79,7 @@ std::string get_mem_info(bool format_as_html)
}
SysInfoDialog::SysInfoDialog()
- : DPIDialog(NULL, wxID_ANY, wxString(SLIC3R_APP_NAME) + " - " + _(L("System Information")), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER)
+ : DPIDialog(static_cast<wxWindow*>(wxGetApp().mainframe), wxID_ANY, (wxGetApp().is_editor() ? wxString(SLIC3R_APP_NAME) : wxString(GCODEVIEWER_APP_NAME)) + " - " + _L("System Information"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
{
wxColour bgr_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
SetBackgroundColour(bgr_clr);
@@ -88,7 +92,7 @@ SysInfoDialog::SysInfoDialog()
main_sizer->Add(hsizer, 1, wxEXPAND | wxALL, 10);
// logo
- m_logo_bmp = ScalableBitmap(this, "PrusaSlicer_192px.png", 192);
+ m_logo_bmp = ScalableBitmap(this, wxGetApp().is_editor() ? "PrusaSlicer_192px.png" : "PrusaSlicer-gcodeviewer_192px.png", 192);
m_logo = new wxStaticBitmap(this, wxID_ANY, m_logo_bmp.bmp());
hsizer->Add(m_logo, 0, wxALIGN_CENTER_VERTICAL);
@@ -97,7 +101,7 @@ SysInfoDialog::SysInfoDialog()
// title
{
- wxStaticText* title = new wxStaticText(this, wxID_ANY, SLIC3R_APP_NAME, wxDefaultPosition, wxDefaultSize);
+ wxStaticText* title = new wxStaticText(this, wxID_ANY, wxGetApp().is_editor() ? SLIC3R_APP_NAME : GCODEVIEWER_APP_NAME, wxDefaultPosition, wxDefaultSize);
wxFont title_font = wxGetApp().bold_font();
title_font.SetFamily(wxFONTFAMILY_ROMAN);
title_font.SetPointSize(22);
@@ -106,7 +110,7 @@ SysInfoDialog::SysInfoDialog()
}
// main_info_text
- wxFont font = wxGetApp().normal_font();
+ wxFont font = get_default_font(this);
const auto text_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
auto text_clr_str = wxString::Format(wxT("#%02X%02X%02X"), text_clr.Red(), text_clr.Green(), text_clr.Blue());
auto bgr_clr_str = wxString::Format(wxT("#%02X%02X%02X"), bgr_clr.Red(), bgr_clr.Green(), bgr_clr.Blue());
@@ -145,13 +149,13 @@ SysInfoDialog::SysInfoDialog()
"</font>"
"</body>"
"</html>", bgr_clr_str, text_clr_str, text_clr_str,
- get_mem_info(true) + "<br>" + _3DScene::get_gl_info(true, true));
+ get_mem_info(true) + "<br>" + wxGetApp().get_gl_info(true, true) + "<br>Eigen vectorization supported: " + Eigen::SimdInstructionSetsInUse());
m_opengl_info_html->SetPage(text);
main_sizer->Add(m_opengl_info_html, 1, wxEXPAND | wxBOTTOM, 15);
}
-
+
wxStdDialogButtonSizer* buttons = this->CreateStdDialogButtonSizer(wxOK);
- m_btn_copy_to_clipboard = new wxButton(this, wxID_ANY, _(L("Copy to Clipboard")), wxDefaultPosition, wxDefaultSize);
+ m_btn_copy_to_clipboard = new wxButton(this, wxID_ANY, _L("Copy to Clipboard"), wxDefaultPosition, wxDefaultSize);
buttons->Insert(0, m_btn_copy_to_clipboard, 0, wxLEFT, 5);
m_btn_copy_to_clipboard->Bind(wxEVT_BUTTON, &SysInfoDialog::onCopyToClipboard, this);
@@ -172,7 +176,7 @@ void SysInfoDialog::on_dpi_changed(const wxRect &suggested_rect)
m_logo_bmp.msw_rescale();
m_logo->SetBitmap(m_logo_bmp.bmp());
- wxFont font = GetFont();
+ wxFont font = get_default_font(this);
const int fs = font.GetPointSize() - 1;
int font_size[] = { static_cast<int>(fs*1.5), static_cast<int>(fs*1.4), static_cast<int>(fs*1.3), fs, fs, fs, fs };
@@ -198,7 +202,7 @@ void SysInfoDialog::on_dpi_changed(const wxRect &suggested_rect)
void SysInfoDialog::onCopyToClipboard(wxEvent &)
{
wxTheClipboard->Open();
- const auto text = get_main_info(false)+"\n"+_3DScene::get_gl_info(false, true);
+ const auto text = get_main_info(false) + "\n" + wxGetApp().get_gl_info(false, true);
wxTheClipboard->SetData(new wxTextDataObject(text));
wxTheClipboard->Close();
}
diff --git a/src/slic3r/GUI/Tab.cpp b/src/slic3r/GUI/Tab.cpp
index adfae9024..ccb82b011 100644
--- a/src/slic3r/GUI/Tab.cpp
+++ b/src/slic3r/GUI/Tab.cpp
@@ -1,15 +1,18 @@
// #include "libslic3r/GCodeSender.hpp"
#include "slic3r/Utils/Serial.hpp"
#include "Tab.hpp"
-#include "PresetBundle.hpp"
#include "PresetHints.hpp"
+#include "libslic3r/PresetBundle.hpp"
#include "libslic3r/Utils.hpp"
+#include "libslic3r/Model.hpp"
#include "slic3r/Utils/Http.hpp"
#include "slic3r/Utils/PrintHost.hpp"
#include "BonjourDialog.hpp"
#include "WipeTowerDialog.hpp"
#include "ButtonsDescription.hpp"
+#include "Search.hpp"
+#include "OG_CustomCtrl.hpp"
#include <wx/app.h>
#include <wx/button.h>
@@ -24,19 +27,75 @@
#include <wx/filedlg.h>
#include <boost/algorithm/string/predicate.hpp>
+#include <boost/algorithm/string/replace.hpp>
#include "wxExtensions.hpp"
+#include "PresetComboBoxes.hpp"
#include <wx/wupdlock.h>
#include "GUI_App.hpp"
#include "GUI_ObjectList.hpp"
-#include "ConfigWizard.hpp"
+#include "Plater.hpp"
+#include "MainFrame.hpp"
+#include "format.hpp"
+#include "PhysicalPrinterDialog.hpp"
+#include "UnsavedChangesDialog.hpp"
+#include "SavePresetDialog.hpp"
+
+#ifdef WIN32
+ #include <commctrl.h>
+#endif // WIN32
namespace Slic3r {
namespace GUI {
-wxDEFINE_EVENT(EVT_TAB_VALUE_CHANGED, wxCommandEvent);
-wxDEFINE_EVENT(EVT_TAB_PRESETS_CHANGED, SimpleEvent);
+void Tab::Highlighter::set_timer_owner(wxEvtHandler* owner, int timerid/* = wxID_ANY*/)
+{
+ m_timer.SetOwner(owner, timerid);
+}
+
+void Tab::Highlighter::init(std::pair<OG_CustomCtrl*, bool*> params)
+{
+ if (m_timer.IsRunning())
+ invalidate();
+ if (!params.first || !params.second)
+ return;
+
+ m_timer.Start(300, false);
+
+ m_custom_ctrl = params.first;
+ m_show_blink_ptr = params.second;
+
+ *m_show_blink_ptr = true;
+ m_custom_ctrl->Refresh();
+}
+
+void Tab::Highlighter::invalidate()
+{
+ m_timer.Stop();
+
+ if (m_custom_ctrl && m_show_blink_ptr) {
+ *m_show_blink_ptr = false;
+ m_custom_ctrl->Refresh();
+ m_show_blink_ptr = nullptr;
+ m_custom_ctrl = nullptr;
+ }
+
+ m_blink_counter = 0;
+}
+
+void Tab::Highlighter::blink()
+{
+ if (m_custom_ctrl && m_show_blink_ptr) {
+ *m_show_blink_ptr = !*m_show_blink_ptr;
+ m_custom_ctrl->Refresh();
+ }
+ else
+ return;
+
+ if ((++m_blink_counter) == 11)
+ invalidate();
+}
Tab::Tab(wxNotebook* parent, const wxString& title, Preset::Type type) :
m_parent(parent), m_title(title), m_type(type)
@@ -47,27 +106,33 @@ Tab::Tab(wxNotebook* parent, const wxString& title, Preset::Type type) :
m_compatible_printers.type = Preset::TYPE_PRINTER;
m_compatible_printers.key_list = "compatible_printers";
m_compatible_printers.key_condition = "compatible_printers_condition";
- m_compatible_printers.dialog_title = _(L("Compatible printers")).ToUTF8();
- m_compatible_printers.dialog_label = _(L("Select the printers this profile is compatible with.")).ToUTF8();
+ m_compatible_printers.dialog_title = _L("Compatible printers");
+ m_compatible_printers.dialog_label = _L("Select the printers this profile is compatible with.");
m_compatible_prints.type = Preset::TYPE_PRINT;
m_compatible_prints.key_list = "compatible_prints";
m_compatible_prints.key_condition = "compatible_prints_condition";
- m_compatible_prints.dialog_title = _(L("Compatible print profiles")).ToUTF8();
- m_compatible_prints.dialog_label = _(L("Select the print profiles this profile is compatible with.")).ToUTF8();
+ m_compatible_prints.dialog_title = _L("Compatible print profiles");
+ m_compatible_prints.dialog_label = _L("Select the print profiles this profile is compatible with.");
wxGetApp().tabs_list.push_back(this);
- m_em_unit = wxGetApp().em_unit();
+ m_em_unit = em_unit(m_parent); //wxGetApp().em_unit();
m_config_manipulation = get_config_manipulation();
Bind(wxEVT_SIZE, ([this](wxSizeEvent &evt) {
- for (auto page : m_pages)
- if (! page.get()->IsShown())
- page->layout_valid = false;
+ //for (auto page : m_pages)
+ // if (! page.get()->IsShown())
+ // page->layout_valid = false;
evt.Skip();
}));
+
+ m_highlighter.set_timer_owner(this, 0);
+ this->Bind(wxEVT_TIMER, [this](wxTimerEvent&)
+ {
+ m_highlighter.blink();
+ });
}
void Tab::set_type()
@@ -112,7 +177,18 @@ void Tab::create_preset_tab()
#endif //__WXOSX__
// preset chooser
- m_presets_choice = new PresetBitmapComboBox(panel, wxSize(35 * m_em_unit, -1));
+ m_presets_choice = new TabPresetComboBox(panel, m_type);
+ m_presets_choice->set_selection_changed_function([this](int selection) {
+ if (!m_presets_choice->selection_is_changed_according_to_physical_printers())
+ {
+ if (m_type == Preset::TYPE_PRINTER && !m_presets_choice->is_selected_physical_printer())
+ m_preset_bundle->physical_printers.unselect_printer();
+
+ // select preset
+ std::string preset_name = m_presets_choice->GetString(selection).ToUTF8().data();
+ select_preset(Preset::remove_suffix_modified(preset_name));
+ }
+ });
auto color = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
@@ -122,6 +198,8 @@ void Tab::create_preset_tab()
add_scaled_button(panel, &m_btn_save_preset, "save");
add_scaled_button(panel, &m_btn_delete_preset, "cross");
+ if (m_type == Preset::Type::TYPE_PRINTER)
+ add_scaled_button(panel, &m_btn_edit_ph_printer, "cog");
m_show_incompatible_presets = false;
add_scaled_bitmap(this, m_bmp_show_incompatible_presets, "flag_red");
@@ -132,22 +210,22 @@ void Tab::create_preset_tab()
// TRN "Save current Settings"
m_btn_save_preset->SetToolTip(from_u8((boost::format(_utf8(L("Save current %s"))) % m_title).str()));
m_btn_delete_preset->SetToolTip(_(L("Delete this preset")));
- m_btn_delete_preset->Disable();
+ m_btn_delete_preset->Hide();
add_scaled_button(panel, &m_question_btn, "question");
-
m_question_btn->SetToolTip(_(L("Hover the cursor over buttons to find more information \n"
"or click this button.")));
- // Determine the theme color of OS (dark or light)
- auto luma = wxGetApp().get_colour_approx_luma(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
+ add_scaled_button(panel, &m_search_btn, "search");
+ m_search_btn->SetToolTip(format_wxstr(_L("Search in settings [%1%]"), "Ctrl+F"));
+
// Bitmaps to be shown on the "Revert to system" aka "Lock to system" button next to each input field.
- add_scaled_bitmap(this, m_bmp_value_lock , luma >= 128 ? "lock_closed" : "lock_closed_white");
+ add_scaled_bitmap(this, m_bmp_value_lock , "lock_closed");
add_scaled_bitmap(this, m_bmp_value_unlock, "lock_open");
m_bmp_non_system = &m_bmp_white_bullet;
// Bitmaps to be shown on the "Undo user changes" button next to each input field.
add_scaled_bitmap(this, m_bmp_value_revert, "undo");
- add_scaled_bitmap(this, m_bmp_white_bullet, luma >= 128 ? "dot" : "dot_white");
+ add_scaled_bitmap(this, m_bmp_white_bullet, "dot");
fill_icon_descriptions();
set_tooltips_text();
@@ -169,6 +247,7 @@ void Tab::create_preset_tab()
}
}
}));
+ m_search_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent) { wxGetApp().plater()->search(false); });
// Colors for ui "decoration"
m_sys_label_clr = wxGetApp().get_label_clr_sys();
@@ -186,13 +265,19 @@ void Tab::create_preset_tab()
m_hsizer->Add(m_btn_save_preset, 0, wxALIGN_CENTER_VERTICAL);
m_hsizer->AddSpacer(int(4 * scale_factor));
m_hsizer->Add(m_btn_delete_preset, 0, wxALIGN_CENTER_VERTICAL);
- m_hsizer->AddSpacer(int(16 * scale_factor));
+ if (m_btn_edit_ph_printer) {
+ m_hsizer->AddSpacer(int(4 * scale_factor));
+ m_hsizer->Add(m_btn_edit_ph_printer, 0, wxALIGN_CENTER_VERTICAL);
+ }
+ m_hsizer->AddSpacer(int(/*16*/8 * scale_factor));
m_hsizer->Add(m_btn_hide_incompatible_presets, 0, wxALIGN_CENTER_VERTICAL);
- m_hsizer->AddSpacer(int(64 * scale_factor));
+ m_hsizer->AddSpacer(int(8 * scale_factor));
+ m_hsizer->Add(m_question_btn, 0, wxALIGN_CENTER_VERTICAL);
+ m_hsizer->AddSpacer(int(32 * scale_factor));
m_hsizer->Add(m_undo_to_sys_btn, 0, wxALIGN_CENTER_VERTICAL);
m_hsizer->Add(m_undo_btn, 0, wxALIGN_CENTER_VERTICAL);
m_hsizer->AddSpacer(int(32 * scale_factor));
- m_hsizer->Add(m_question_btn, 0, wxALIGN_CENTER_VERTICAL);
+ m_hsizer->Add(m_search_btn, 0, wxALIGN_CENTER_VERTICAL);
// m_hsizer->AddStretchSpacer(32);
// StretchSpacer has a strange behavior under OSX, so
// There is used just additional sizer for m_mode_sizer with right alignment
@@ -219,33 +304,46 @@ void Tab::create_preset_tab()
m_treectrl->AssignImageList(m_icons);
m_treectrl->AddRoot("root");
m_treectrl->SetIndent(0);
- m_disable_tree_sel_changed_event = 0;
- m_treectrl->Bind(wxEVT_TREE_SEL_CHANGED, &Tab::OnTreeSelChange, this);
+ // Delay processing of the following handler until the message queue is flushed.
+ // This helps to process all the cursor key events on Windows in the tree control,
+ // so that the cursor jumps to the last item.
+ m_treectrl->Bind(wxEVT_TREE_SEL_CHANGED, [this](wxTreeEvent&) {
+#ifdef __linux__
+ // Events queue is opposite On Linux. wxEVT_SET_FOCUS invokes after wxEVT_TREE_SEL_CHANGED,
+ // and a result wxEVT_KILL_FOCUS doesn't invoke for the TextCtrls.
+ // see https://github.com/prusa3d/PrusaSlicer/issues/5720
+ // So, call SetFocus explicitly for this control before changing of the selection
+ m_treectrl->SetFocus();
+#endif
+ if (!m_disable_tree_sel_changed_event && !m_pages.empty()) {
+ if (m_page_switch_running)
+ m_page_switch_planned = true;
+ else {
+ m_page_switch_running = true;
+ do {
+ m_page_switch_planned = false;
+ m_treectrl->Update();
+ } while (this->tree_sel_change_delayed());
+ m_page_switch_running = false;
+ }
+ }
+ });
+
m_treectrl->Bind(wxEVT_KEY_DOWN, &Tab::OnKeyDown, this);
- m_presets_choice->Bind(wxEVT_COMBOBOX, ([this](wxCommandEvent e) {
- //! Because of The MSW and GTK version of wxBitmapComboBox derived from wxComboBox,
- //! but the OSX version derived from wxOwnerDrawnCombo, instead of:
- //! select_preset(m_presets_choice->GetStringSelection().ToUTF8().data());
- //! we doing next:
- int selected_item = m_presets_choice->GetSelection();
- if (m_selected_preset_item == size_t(selected_item) && !m_presets->current_is_dirty())
- return;
- if (selected_item >= 0) {
- std::string selected_string = m_presets_choice->GetString(selected_item).ToUTF8().data();
- if (selected_string.find(PresetCollection::separator_head()) == 0
- /*selected_string == "------- System presets -------" ||
- selected_string == "------- User presets -------"*/) {
- m_presets_choice->SetSelection(m_selected_preset_item);
- if (wxString::FromUTF8(selected_string.c_str()) == PresetCollection::separator(L("Add a new printer")))
- wxTheApp->CallAfter([]() { wxGetApp().run_wizard(ConfigWizard::RR_USER); });
- return;
- }
- m_selected_preset_item = selected_item;
- select_preset(selected_string);
- }
- }));
+ // Initialize the page.
+#ifdef __WXOSX__
+ auto page_parent = m_tmp_panel;
+#else
+ auto page_parent = this;
+#endif
+
+ m_page_view = new wxScrolledWindow(page_parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
+ m_page_sizer = new wxBoxSizer(wxVERTICAL);
+ m_page_view->SetSizer(m_page_sizer);
+ m_page_view->SetScrollbars(1, 20, 1, 2);
+ m_hsizer->Add(m_page_view, 1, wxEXPAND | wxLEFT, 5);
m_btn_save_preset->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) { save_preset(); }));
m_btn_delete_preset->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e) { delete_preset(); }));
@@ -253,15 +351,23 @@ void Tab::create_preset_tab()
toggle_show_hide_incompatible();
}));
- // Fill cache for mode bitmaps
- m_mode_bitmap_cache.reserve(3);
- m_mode_bitmap_cache.push_back(ScalableBitmap(this, "mode_simple" , mode_icon_px_size()));
- m_mode_bitmap_cache.push_back(ScalableBitmap(this, "mode_advanced", mode_icon_px_size()));
- m_mode_bitmap_cache.push_back(ScalableBitmap(this, "mode_expert" , mode_icon_px_size()));
+ if (m_btn_edit_ph_printer)
+ m_btn_edit_ph_printer->Bind(wxEVT_BUTTON, [this](wxCommandEvent e) {
+ if (m_preset_bundle->physical_printers.has_selection())
+ m_presets_choice->edit_physical_printer();
+ else
+ m_presets_choice->add_physical_printer();
+ });
// Initialize the DynamicPrintConfig by default keys/values.
build();
+
+ // ys_FIXME: Following should not be needed, the function will be called later
+ // (update_mode->update_visibility->rebuild_page_tree). This does not work, during the
+ // second call of rebuild_page_tree m_treectrl->GetFirstVisibleItem(); returns zero
+ // for some unknown reason (and the page is not refreshed until user does a selection).
rebuild_page_tree();
+
m_completed = true;
}
@@ -271,7 +377,7 @@ void Tab::add_scaled_button(wxWindow* parent,
const wxString& label/* = wxEmptyString*/,
long style /*= wxBU_EXACTFIT | wxNO_BORDER*/)
{
- *btn = new ScalableButton(parent, wxID_ANY, icon_name, label, wxDefaultSize, wxDefaultPosition, style);
+ *btn = new ScalableButton(parent, wxID_ANY, icon_name, label, wxDefaultSize, wxDefaultPosition, style, true);
m_scaled_buttons.push_back(*btn);
}
@@ -305,6 +411,11 @@ Slic3r::GUI::PageShp Tab::add_options_page(const wxString& title, const std::str
icon_idx = ++m_icon_count;
m_icon_index[icon] = icon_idx;
}
+
+ if (m_category_icon.find(title) == m_category_icon.end()) {
+ // Add new category to the category_to_icon list.
+ m_category_icon[title] = icon;
+ }
}
// Initialize the page.
#ifdef __WXOSX__
@@ -312,16 +423,12 @@ Slic3r::GUI::PageShp Tab::add_options_page(const wxString& title, const std::str
#else
auto panel = this;
#endif
- PageShp page(new Page(panel, title, icon_idx, m_mode_bitmap_cache));
+ PageShp page(new Page(m_page_view, title, icon_idx));
// page->SetBackgroundStyle(wxBG_STYLE_SYSTEM);
#ifdef __WINDOWS__
// page->SetDoubleBuffered(true);
#endif //__WINDOWS__
- page->SetScrollbars(1, 20, 1, 2);
- page->Hide();
- m_hsizer->Add(page.get(), 1, wxEXPAND | wxLEFT, 5);
-
if (!is_extruder_pages)
m_pages.push_back(page);
@@ -329,21 +436,61 @@ Slic3r::GUI::PageShp Tab::add_options_page(const wxString& title, const std::str
return page;
}
+// Names of categories is save in English always. We translate them only for UI.
+// But category "Extruder n" can't be translated regularly (using _()), so
+// just for this category we should splite the title and translate "Extruder" word separately
+wxString Tab::translate_category(const wxString& title, Preset::Type preset_type)
+{
+ if (preset_type == Preset::TYPE_PRINTER && title.Contains("Extruder ")) {
+ return _("Extruder") + title.SubString(8, title.Last());
+ }
+ return _(title);
+}
+
void Tab::OnActivate()
{
-#ifdef __WXOSX__
wxWindowUpdateLocker noUpdates(this);
-
+#ifdef __WXOSX__
+// wxWindowUpdateLocker noUpdates(this);
auto size = GetSizer()->GetSize();
m_tmp_panel->GetSizer()->SetMinSize(size.x + m_size_move, size.y);
Fit();
m_size_move *= -1;
#endif // __WXOSX__
+
+#ifdef __WXMSW__
+ // Workaround for tooltips over Tree Controls displayed over excessively long
+ // tree control items, stealing the window focus.
+ //
+ // In case the Tab was reparented from the MainFrame to the floating dialog,
+ // the tooltip created by the Tree Control before reparenting is not reparented,
+ // but it still points to the MainFrame. If the tooltip pops up, the MainFrame
+ // is incorrectly focussed, stealing focus from the floating dialog.
+ //
+ // The workaround is to delete the tooltip control.
+ // Vojtech tried to reparent the tooltip control, but it did not work,
+ // and if the Tab was later reparented back to MainFrame, the tooltip was displayed
+ // at an incorrect position, therefore it is safer to just discard the tooltip control
+ // altogether.
+ HWND hwnd_tt = TreeView_GetToolTips(m_treectrl->GetHandle());
+ if (hwnd_tt) {
+ HWND hwnd_toplevel = find_toplevel_parent(m_treectrl)->GetHandle();
+ HWND hwnd_parent = ::GetParent(hwnd_tt);
+ if (hwnd_parent != hwnd_toplevel) {
+ ::DestroyWindow(hwnd_tt);
+ TreeView_SetToolTips(m_treectrl->GetHandle(), nullptr);
+ }
+ }
+#endif
+
+ // create controls on active page
+ activate_selected_page([](){});
+ m_hsizer->Layout();
+ Refresh();
}
void Tab::update_labels_colour()
{
-// Freeze();
//update options "decoration"
for (const auto opt : m_options_list)
{
@@ -358,20 +505,17 @@ void Tab::update_labels_colour()
else
color = &m_modified_label_clr;
}
- if (opt.first == "bed_shape" || opt.first == "compatible_prints" || opt.first == "compatible_printers") {
- wxStaticText* label = (m_colored_Labels.find(opt.first) == m_colored_Labels.end()) ? nullptr : m_colored_Labels.at(opt.first);
- if (label) {
- label->SetForegroundColour(*color);
- label->Refresh(true);
- }
+ if (opt.first == "bed_shape" || opt.first == "filament_ramming_parameters" ||
+ opt.first == "compatible_prints" || opt.first == "compatible_printers" ) {
+ if (m_colored_Label_colors.find(opt.first) != m_colored_Label_colors.end())
+ m_colored_Label_colors.at(opt.first) = *color;
continue;
}
Field* field = get_field(opt.first);
if (field == nullptr) continue;
- field->set_label_colour_force(color);
+ field->set_label_colour(color);
}
-// Thaw();
auto cur_item = m_treectrl->GetFirstVisibleItem();
if (!cur_item || !m_treectrl->IsVisible(cur_item))
@@ -380,7 +524,7 @@ void Tab::update_labels_colour()
auto title = m_treectrl->GetItemText(cur_item);
for (auto page : m_pages)
{
- if (page->title() != title)
+ if (translate_category(page->title(), m_type) != title)
continue;
const wxColor *clr = !page->m_is_nonsys_values ? &m_sys_label_clr :
@@ -394,42 +538,32 @@ void Tab::update_labels_colour()
}
}
-// Update UI according to changes
-void Tab::update_changed_ui()
+void Tab::decorate()
{
- if (m_postpone_update_ui)
- return;
-
- const bool deep_compare = (m_type == Slic3r::Preset::TYPE_PRINTER || m_type == Slic3r::Preset::TYPE_SLA_MATERIAL);
- auto dirty_options = m_presets->current_dirty_options(deep_compare);
- auto nonsys_options = m_presets->current_different_from_parent_options(deep_compare);
- if (m_type == Slic3r::Preset::TYPE_PRINTER) {
- TabPrinter* tab = static_cast<TabPrinter*>(this);
- if (tab->m_initial_extruders_count != tab->m_extruders_count)
- dirty_options.emplace_back("extruders_count");
- if (tab->m_sys_extruders_count != tab->m_extruders_count)
- nonsys_options.emplace_back("extruders_count");
- }
+ for (const auto opt : m_options_list)
+ {
+ Field* field = nullptr;
+ wxColour* colored_label_clr = nullptr;
- for (auto& it : m_options_list)
- it.second = m_opt_status_value;
+ if (opt.first == "bed_shape" || opt.first == "filament_ramming_parameters" ||
+ opt.first == "compatible_prints" || opt.first == "compatible_printers")
+ colored_label_clr = (m_colored_Label_colors.find(opt.first) == m_colored_Label_colors.end()) ? nullptr : &m_colored_Label_colors.at(opt.first);
- for (auto opt_key : dirty_options) m_options_list[opt_key] &= ~osInitValue;
- for (auto opt_key : nonsys_options) m_options_list[opt_key] &= ~osSystemValue;
+ if (!colored_label_clr) {
+ field = get_field(opt.first);
+ if (!field)
+ continue;
+ }
-// Freeze();
- //update options "decoration"
- for (const auto opt : m_options_list)
- {
bool is_nonsys_value = false;
bool is_modified_value = true;
- const ScalableBitmap *sys_icon = &m_bmp_value_lock;
- const ScalableBitmap *icon = &m_bmp_value_revert;
+ const ScalableBitmap* sys_icon = &m_bmp_value_lock;
+ const ScalableBitmap* icon = &m_bmp_value_revert;
- const wxColour *color = m_is_default_preset ? &m_default_text_clr : &m_sys_label_clr;
+ const wxColour* color = m_is_default_preset ? &m_default_text_clr : &m_sys_label_clr;
- const wxString *sys_tt = &m_tt_value_lock;
- const wxString *tt = &m_tt_value_revert;
+ const wxString* sys_tt = &m_tt_value_lock;
+ const wxString* tt = &m_tt_value_revert;
// value isn't equal to system value
if ((opt.second & osSystemValue) == 0) {
@@ -449,17 +583,12 @@ void Tab::update_changed_ui()
icon = &m_bmp_white_bullet;
tt = &m_tt_white_bullet;
}
- if (opt.first == "bed_shape" || opt.first == "compatible_prints" || opt.first == "compatible_printers") {
- wxStaticText* label = (m_colored_Labels.find(opt.first) == m_colored_Labels.end()) ? nullptr : m_colored_Labels.at(opt.first);
- if (label) {
- label->SetForegroundColour(*color);
- label->Refresh(true);
- }
+
+ if (colored_label_clr) {
+ *colored_label_clr = *color;
continue;
}
-
- Field* field = get_field(opt.first);
- if (field == nullptr) continue;
+
field->m_is_nonsys_value = is_nonsys_value;
field->m_is_modified_value = is_modified_value;
field->set_undo_bitmap(icon);
@@ -468,7 +597,35 @@ void Tab::update_changed_ui()
field->set_undo_to_sys_tooltip(sys_tt);
field->set_label_colour(color);
}
-// Thaw();
+
+ if (m_active_page)
+ m_active_page->refresh();
+}
+
+// Update UI according to changes
+void Tab::update_changed_ui()
+{
+ if (m_postpone_update_ui)
+ return;
+
+ const bool deep_compare = (m_type == Slic3r::Preset::TYPE_PRINTER || m_type == Slic3r::Preset::TYPE_SLA_MATERIAL);
+ auto dirty_options = m_presets->current_dirty_options(deep_compare);
+ auto nonsys_options = m_presets->current_different_from_parent_options(deep_compare);
+ if (m_type == Slic3r::Preset::TYPE_PRINTER) {
+ TabPrinter* tab = static_cast<TabPrinter*>(this);
+ if (tab->m_initial_extruders_count != tab->m_extruders_count)
+ dirty_options.emplace_back("extruders_count");
+ if (tab->m_sys_extruders_count != tab->m_extruders_count)
+ nonsys_options.emplace_back("extruders_count");
+ }
+
+ for (auto& it : m_options_list)
+ it.second = m_opt_status_value;
+
+ for (auto opt_key : dirty_options) m_options_list[opt_key] &= ~osInitValue;
+ for (auto opt_key : nonsys_options) m_options_list[opt_key] &= ~osSystemValue;
+
+ decorate();
wxTheApp->CallAfter([this]() {
if (parent()) //To avoid a crash, parent should be exist for a moment of a tree updating
@@ -500,7 +657,7 @@ void TabPrinter::init_options_list()
for (const auto opt_key : m_config->keys())
{
- if (opt_key == "bed_shape") {
+ if (opt_key == "bed_shape" || opt_key == "thumbnails") {
m_options_list.emplace(opt_key, m_opt_status_value);
continue;
}
@@ -527,6 +684,21 @@ void TabPrinter::msw_rescale()
for (auto page : pages)
page->msw_rescale();
+ if (m_reset_to_filament_color)
+ m_reset_to_filament_color->msw_rescale();
+
+ Layout();
+}
+
+void TabPrinter::sys_color_changed()
+{
+ Tab::sys_color_changed();
+
+ // update missed options_groups
+ const std::vector<PageShp>& pages = m_printer_technology == ptFFF ? m_pages_sla : m_pages_fff;
+ for (auto page : pages)
+ page->sys_color_changed();
+
Layout();
}
@@ -579,17 +751,20 @@ void Tab::update_changed_tree_ui()
auto title = m_treectrl->GetItemText(cur_item);
for (auto page : m_pages)
{
- if (page->title() != title)
+ if (translate_category(page->title(), m_type) != title)
continue;
bool sys_page = true;
bool modified_page = false;
- if (title == _("General")) {
+ if (page->title() == "General") {
std::initializer_list<const char*> optional_keys{ "extruders_count", "bed_shape" };
for (auto &opt_key : optional_keys) {
get_sys_and_mod_flags(opt_key, sys_page, modified_page);
}
}
- if (title == _("Dependencies")) {
+ if (m_type == Preset::TYPE_FILAMENT && page->title() == "Advanced") {
+ get_sys_and_mod_flags("filament_ramming_parameters", sys_page, modified_page);
+ }
+ if (page->title() == "Dependencies") {
if (m_type == Slic3r::Preset::TYPE_PRINTER) {
sys_page = m_presets->get_selected_preset_parent() != nullptr;
modified_page = false;
@@ -603,8 +778,8 @@ void Tab::update_changed_tree_ui()
{
if (!sys_page && modified_page)
break;
- for (t_opt_map::iterator it = group->m_opt_map.begin(); it != group->m_opt_map.end(); ++it) {
- const std::string& opt_key = it->first;
+ for (const auto &kvp : group->opt_map()) {
+ const std::string& opt_key = kvp.first;
get_sys_and_mod_flags(opt_key, sys_page, modified_page);
}
}
@@ -642,6 +817,8 @@ void Tab::update_undo_buttons()
void Tab::on_roll_back_value(const bool to_sys /*= true*/)
{
+ if (!m_active_page) return;
+
int os;
if (to_sys) {
if (!m_is_nonsys_values) return;
@@ -654,49 +831,47 @@ void Tab::on_roll_back_value(const bool to_sys /*= true*/)
m_postpone_update_ui = true;
- auto selection = m_treectrl->GetItemText(m_treectrl->GetSelection());
- for (auto page : m_pages)
- if (page->title() == selection) {
- for (auto group : page->m_optgroups) {
- if (group->title == _("Capabilities")) {
- if ((m_options_list["extruders_count"] & os) == 0)
- to_sys ? group->back_to_sys_value("extruders_count") : group->back_to_initial_value("extruders_count");
- }
- if (group->title == _("Size and coordinates")) {
- if ((m_options_list["bed_shape"] & os) == 0) {
- to_sys ? group->back_to_sys_value("bed_shape") : group->back_to_initial_value("bed_shape");
- load_key_value("bed_shape", true/*some value*/, true);
- }
-
- }
- if (group->title == _("Profile dependencies")) {
- // "compatible_printers" option doesn't exists in Printer Settimgs Tab
- if (m_type != Preset::TYPE_PRINTER && (m_options_list["compatible_printers"] & os) == 0) {
- to_sys ? group->back_to_sys_value("compatible_printers") : group->back_to_initial_value("compatible_printers");
- load_key_value("compatible_printers", true/*some value*/, true);
-
- bool is_empty = m_config->option<ConfigOptionStrings>("compatible_printers")->values.empty();
- m_compatible_printers.checkbox->SetValue(is_empty);
- is_empty ? m_compatible_printers.btn->Disable() : m_compatible_printers.btn->Enable();
- }
- // "compatible_prints" option exists only in Filament Settimgs and Materials Tabs
- if ((m_type == Preset::TYPE_FILAMENT || m_type == Preset::TYPE_SLA_MATERIAL) && (m_options_list["compatible_prints"] & os) == 0) {
- to_sys ? group->back_to_sys_value("compatible_prints") : group->back_to_initial_value("compatible_prints");
- load_key_value("compatible_prints", true/*some value*/, true);
-
- bool is_empty = m_config->option<ConfigOptionStrings>("compatible_prints")->values.empty();
- m_compatible_prints.checkbox->SetValue(is_empty);
- is_empty ? m_compatible_prints.btn->Disable() : m_compatible_prints.btn->Enable();
- }
- }
- for (auto kvp : group->m_opt_map) {
- const std::string& opt_key = kvp.first;
- if ((m_options_list[opt_key] & os) == 0)
- to_sys ? group->back_to_sys_value(opt_key) : group->back_to_initial_value(opt_key);
- }
+ for (auto group : m_active_page->m_optgroups) {
+ if (group->title == "Capabilities") {
+ if ((m_options_list["extruders_count"] & os) == 0)
+ to_sys ? group->back_to_sys_value("extruders_count") : group->back_to_initial_value("extruders_count");
+ }
+ if (group->title == "Size and coordinates") {
+ if ((m_options_list["bed_shape"] & os) == 0) {
+ to_sys ? group->back_to_sys_value("bed_shape") : group->back_to_initial_value("bed_shape");
+ load_key_value("bed_shape", true/*some value*/, true);
}
- break;
}
+ if (group->title == "Toolchange parameters with single extruder MM printers") {
+ if ((m_options_list["filament_ramming_parameters"] & os) == 0)
+ to_sys ? group->back_to_sys_value("filament_ramming_parameters") : group->back_to_initial_value("filament_ramming_parameters");
+ }
+ if (group->title == "Profile dependencies") {
+ // "compatible_printers" option doesn't exists in Printer Settimgs Tab
+ if (m_type != Preset::TYPE_PRINTER && (m_options_list["compatible_printers"] & os) == 0) {
+ to_sys ? group->back_to_sys_value("compatible_printers") : group->back_to_initial_value("compatible_printers");
+ load_key_value("compatible_printers", true/*some value*/, true);
+
+ bool is_empty = m_config->option<ConfigOptionStrings>("compatible_printers")->values.empty();
+ m_compatible_printers.checkbox->SetValue(is_empty);
+ is_empty ? m_compatible_printers.btn->Disable() : m_compatible_printers.btn->Enable();
+ }
+ // "compatible_prints" option exists only in Filament Settimgs and Materials Tabs
+ if ((m_type == Preset::TYPE_FILAMENT || m_type == Preset::TYPE_SLA_MATERIAL) && (m_options_list["compatible_prints"] & os) == 0) {
+ to_sys ? group->back_to_sys_value("compatible_prints") : group->back_to_initial_value("compatible_prints");
+ load_key_value("compatible_prints", true/*some value*/, true);
+
+ bool is_empty = m_config->option<ConfigOptionStrings>("compatible_prints")->values.empty();
+ m_compatible_prints.checkbox->SetValue(is_empty);
+ is_empty ? m_compatible_prints.btn->Disable() : m_compatible_prints.btn->Enable();
+ }
+ }
+ for (const auto &kvp : group->opt_map()) {
+ const std::string& opt_key = kvp.first;
+ if ((m_options_list[opt_key] & os) == 0)
+ to_sys ? group->back_to_sys_value(opt_key) : group->back_to_initial_value(opt_key);
+ }
+ }
m_postpone_update_ui = false;
update_changed_ui();
@@ -706,14 +881,14 @@ void Tab::on_roll_back_value(const bool to_sys /*= true*/)
// comparing the selected preset config with $self->{config}.
void Tab::update_dirty()
{
- m_presets->update_dirty_ui(m_presets_choice);
+ m_presets_choice->update_dirty();
on_presets_changed();
update_changed_ui();
}
void Tab::update_tab_ui()
{
- m_selected_preset_item = m_presets->update_tab_ui(m_presets_choice, m_show_incompatible_presets, m_em_unit);
+ m_presets_choice->update();
}
// Load a provied DynamicConfig into the tab, modifying the active preset.
@@ -736,10 +911,8 @@ void Tab::load_config(const DynamicPrintConfig& config)
// Reload current $self->{config} (aka $self->{presets}->edited_preset->config) into the UI fields.
void Tab::reload_config()
{
-// Freeze();
- for (auto page : m_pages)
- page->reload_config();
-// Thaw();
+ if (m_active_page)
+ m_active_page->reload_config();
}
void Tab::update_mode()
@@ -758,16 +931,12 @@ void Tab::update_visibility()
{
Freeze(); // There is needed Freeze/Thaw to avoid a flashing after Show/Layout
- // m_detach_preset_btn will be shown always after call page->update_visibility()
- // So let save a "show state" of m_detach_preset_btn before update_visibility
- bool was_shown = m_detach_preset_btn->IsShown();
-
for (auto page : m_pages)
- page->update_visibility(m_mode);
- update_page_tree_visibility();
+ page->update_visibility(m_mode, page.get() == m_active_page);
+ rebuild_page_tree();
- // update visibility for detach_preset_btn
- m_detach_preset_btn->Show(was_shown);
+ if (this->m_type == Preset::TYPE_SLA_PRINT)
+ update_description_lines();
Layout();
Thaw();
@@ -775,22 +944,21 @@ void Tab::update_visibility()
void Tab::msw_rescale()
{
- m_em_unit = wxGetApp().em_unit();
+ m_em_unit = em_unit(m_parent);
m_mode_sizer->msw_rescale();
+ m_presets_choice->msw_rescale();
- m_presets_choice->SetSize(35 * m_em_unit, -1);
m_treectrl->SetMinSize(wxSize(20 * m_em_unit, -1));
- update_tab_ui();
-
// rescale buttons and cached bitmaps
for (const auto btn : m_scaled_buttons)
btn->msw_rescale();
for (const auto bmp : m_scaled_bitmaps)
bmp->msw_rescale();
- for (ScalableBitmap& bmp : m_mode_bitmap_cache)
- bmp.msw_rescale();
+
+ if (m_detach_preset_btn)
+ m_detach_preset_btn->msw_rescale();
// rescale icons for tree_ctrl
for (ScalableBitmap& bmp : m_scaled_icons_list)
@@ -803,34 +971,86 @@ void Tab::msw_rescale()
m_treectrl->AssignImageList(m_icons);
// rescale options_groups
- for (auto page : m_pages)
- page->msw_rescale();
+ if (m_active_page)
+ m_active_page->msw_rescale();
+
+ Layout();
+}
+
+void Tab::sys_color_changed()
+{
+ update_tab_ui();
+ m_presets_choice->msw_rescale();
+
+ // update buttons and cached bitmaps
+ for (const auto btn : m_scaled_buttons)
+ btn->msw_rescale();
+ for (const auto bmp : m_scaled_bitmaps)
+ bmp->msw_rescale();
+
+ // update icons for tree_ctrl
+ for (ScalableBitmap& bmp : m_scaled_icons_list)
+ bmp.msw_rescale();
+ // recreate and set new ImageList for tree_ctrl
+ m_icons->RemoveAll();
+ m_icons = new wxImageList(m_scaled_icons_list.front().bmp().GetWidth(), m_scaled_icons_list.front().bmp().GetHeight());
+ for (ScalableBitmap& bmp : m_scaled_icons_list)
+ m_icons->Add(bmp.bmp());
+ m_treectrl->AssignImageList(m_icons);
+
+ // Colors for ui "decoration"
+ m_sys_label_clr = wxGetApp().get_label_clr_sys();
+ m_modified_label_clr = wxGetApp().get_label_clr_modified();
+ update_labels_colour();
+
+ // update options_groups
+ if (m_active_page)
+ m_active_page->msw_rescale();
Layout();
}
Field* Tab::get_field(const t_config_option_key& opt_key, int opt_index/* = -1*/) const
{
+ return m_active_page ? m_active_page->get_field(opt_key, opt_index) : nullptr;
+}
+
+std::pair<OG_CustomCtrl*, bool*> Tab::get_custom_ctrl_with_blinking_ptr(const t_config_option_key& opt_key, int opt_index/* = -1*/)
+{
+ if (!m_active_page)
+ return {nullptr, nullptr};
+
+ std::pair<OG_CustomCtrl*, bool*> ret = {nullptr, nullptr};
+
+ for (auto opt_group : m_active_page->m_optgroups) {
+ ret = opt_group->get_custom_ctrl_with_blinking_ptr(opt_key, opt_index);
+ if (ret.first && ret.second)
+ break;
+ }
+ return ret;
+}
+
+Field* Tab::get_field(const t_config_option_key& opt_key, Page** selected_page, int opt_index/* = -1*/)
+{
Field* field = nullptr;
for (auto page : m_pages) {
field = page->get_field(opt_key, opt_index);
- if (field != nullptr)
+ if (field != nullptr) {
+ *selected_page = page.get();
return field;
+ }
}
return field;
}
-// Set a key/value pair on this page. Return true if the value has been modified.
-// Currently used for distributing extruders_count over preset pages of Slic3r::GUI::Tab::Printer
-// after a preset is loaded.
-bool Tab::set_value(const t_config_option_key& opt_key, const boost::any& value) {
- bool changed = false;
- for(auto page: m_pages) {
- if (page->set_value(opt_key, value))
- changed = true;
- }
- return changed;
-}
+void Tab::toggle_option(const std::string& opt_key, bool toggle, int opt_index/* = -1*/)
+{
+ if (!m_active_page)
+ return;
+ Field* field = m_active_page->get_field(opt_key, opt_index);
+ if (field)
+ field->toggle(toggle);
+};
// To be called by custom widgets, load a value into a config,
// update the preset selection boxes (the dirty flags)
@@ -844,7 +1064,7 @@ void Tab::load_key_value(const std::string& opt_key, const boost::any& value, bo
// Don't select another profile if this profile happens to become incompatible.
m_preset_bundle->update_compatible(PresetSelectCompatibleType::Never);
}
- m_presets->update_dirty_ui(m_presets_choice);
+ m_presets_choice->update_dirty();
on_presets_changed();
update();
}
@@ -883,7 +1103,7 @@ void Tab::on_value_change(const std::string& opt_key, const boost::any& value)
if (opt_key == "pad_around_object") {
for (PageShp &pg : m_pages) {
- Field * fld = pg->get_field(opt_key);
+ Field * fld = pg->get_field(opt_key); /// !!! ysFIXME ????
if (fld) fld->set_value(value, false);
}
}
@@ -925,6 +1145,65 @@ void Tab::update_wiping_button_visibility() {
}
}
+void Tab::activate_option(const std::string& opt_key, const wxString& category)
+{
+ wxString page_title = translate_category(category, m_type);
+
+ auto cur_item = m_treectrl->GetFirstVisibleItem();
+ if (!cur_item || !m_treectrl->IsVisible(cur_item))
+ return;
+
+ while (cur_item) {
+ auto title = m_treectrl->GetItemText(cur_item);
+ if (page_title != title) {
+ cur_item = m_treectrl->GetNextVisible(cur_item);
+ continue;
+ }
+
+ m_treectrl->SelectItem(cur_item);
+ break;
+ }
+
+ // we should to activate a tab with searched option, if it doesn't.
+ wxGetApp().mainframe->select_tab(this);
+ Field* field = get_field(opt_key);
+
+ // focused selected field
+ if (field)
+ field->getWindow()->SetFocus();
+ else if (category == "Single extruder MM setup") {
+ // When we show and hide "Single extruder MM setup" page,
+ // related options are still in the search list
+ // So, let's hightlighte a "single_extruder_multi_material" option,
+ // as a "way" to show hidden page again
+ field = get_field("single_extruder_multi_material");
+ if (field)
+ field->getWindow()->SetFocus();
+ }
+
+ m_highlighter.init(get_custom_ctrl_with_blinking_ptr(opt_key));
+}
+
+void Tab::apply_searcher()
+{
+ wxGetApp().sidebar().get_searcher().apply(m_config, m_type, m_mode);
+}
+
+void Tab::cache_config_diff(const std::vector<std::string>& selected_options)
+{
+ m_cache_config.apply_only(m_presets->get_edited_preset().config, selected_options);
+}
+
+void Tab::apply_config_from_cache()
+{
+ if (!m_cache_config.empty()) {
+ m_presets->get_edited_preset().config.apply(m_cache_config);
+ m_cache_config.clear();
+
+ update_dirty();
+ }
+}
+
// Call a callback to update the selection of presets on the plater:
// To update the content of the selection boxes,
@@ -939,14 +1218,16 @@ void Tab::on_presets_changed()
// Instead of PostEvent (EVT_TAB_PRESETS_CHANGED) just call update_presets
wxGetApp().plater()->sidebar().update_presets(m_type);
- update_preset_description_line();
// Printer selected at the Printer tab, update "compatible" marks at the print and filament selectors.
for (auto t: m_dependent_tabs)
{
+ Tab* tab = wxGetApp().get_tab(t);
// If the printer tells us that the print or filament/sla_material preset has been switched or invalidated,
// refresh the print or filament/sla_material tab page.
- wxGetApp().get_tab(t)->load_current_preset();
+ // But if there are options, moved from the previously selected preset, update them to edited preset
+ tab->apply_config_from_cache();
+ tab->load_current_preset();
}
// clear m_dependent_tabs after first update from select_preset()
// to avoid needless preset loading from update() function
@@ -960,7 +1241,8 @@ void Tab::build_preset_description_line(ConfigOptionsGroup* optgroup)
};
auto detach_preset_btn = [this](wxWindow* parent) {
- add_scaled_button(parent, &m_detach_preset_btn, "lock_open_sys", _(L("Detach from system preset")), wxBU_LEFT | wxBU_EXACTFIT);
+ m_detach_preset_btn = new ScalableButton(parent, wxID_ANY, "lock_open_sys", _L("Detach from system preset"),
+ wxDefaultSize, wxDefaultPosition, wxBU_LEFT | wxBU_EXACTFIT, true);
ScalableButton* btn = m_detach_preset_btn;
btn->SetFont(Slic3r::GUI::wxGetApp().normal_font());
@@ -1013,7 +1295,9 @@ void Tab::update_preset_description_line()
} else if (parent == nullptr) {
description_line = _(L("Current preset is inherited from the default preset."));
} else {
- description_line = _(L("Current preset is inherited from")) + ":\n\t" + parent->name;
+ std::string name = parent->name;
+ boost::replace_all(name, "&", "&&");
+ description_line = _(L("Current preset is inherited from")) + ":\n\t" + from_u8(name);
}
if (preset.is_default || preset.is_system)
@@ -1105,28 +1389,31 @@ void TabPrint::build()
m_presets = &m_preset_bundle->prints;
load_initial_data();
- auto page = add_options_page(_(L("Layers and perimeters")), "layers");
- auto optgroup = page->new_optgroup(_(L("Layer height")));
- optgroup->append_single_option_line("layer_height");
- optgroup->append_single_option_line("first_layer_height");
+ auto page = add_options_page(L("Layers and perimeters"), "layers");
+ wxString category_path = "layers-and-perimeters_1748#";
+ auto optgroup = page->new_optgroup(L("Layer height"));
+ optgroup->append_single_option_line("layer_height", category_path + "layer-height");
+ optgroup->append_single_option_line("first_layer_height", category_path + "first-layer-height");
- optgroup = page->new_optgroup(_(L("Vertical shells")));
- optgroup->append_single_option_line("perimeters");
- optgroup->append_single_option_line("spiral_vase");
+ optgroup = page->new_optgroup(L("Vertical shells"));
+ optgroup->append_single_option_line("perimeters", category_path + "perimeters");
+ optgroup->append_single_option_line("spiral_vase", category_path + "spiral-vase");
Line line { "", "" };
line.full_width = 1;
+ line.label_path = category_path + "recommended-thin-wall-thickness";
line.widget = [this](wxWindow* parent) {
return description_line_widget(parent, &m_recommended_thin_wall_thickness_description_line);
};
optgroup->append_line(line);
- optgroup = page->new_optgroup(_(L("Horizontal shells")));
- line = { _(L("Solid layers")), "" };
+ optgroup = page->new_optgroup(L("Horizontal shells"));
+ line = { L("Solid layers"), "" };
+ line.label_path = category_path + "solid-layers-top-bottom";
line.append_option(optgroup->get_option("top_solid_layers"));
line.append_option(optgroup->get_option("bottom_solid_layers"));
optgroup->append_line(line);
- line = { _(L("Minimum shell thickness")), "" };
+ line = { L("Minimum shell thickness"), "" };
line.append_option(optgroup->get_option("top_solid_min_thickness"));
line.append_option(optgroup->get_option("bottom_solid_min_thickness"));
optgroup->append_line(line);
@@ -1137,74 +1424,86 @@ void TabPrint::build()
};
optgroup->append_line(line);
- optgroup = page->new_optgroup(_(L("Quality (slower slicing)")));
- optgroup->append_single_option_line("extra_perimeters");
- optgroup->append_single_option_line("ensure_vertical_shell_thickness");
- optgroup->append_single_option_line("avoid_crossing_perimeters");
- optgroup->append_single_option_line("thin_walls");
- optgroup->append_single_option_line("overhangs");
-
- optgroup = page->new_optgroup(_(L("Advanced")));
- optgroup->append_single_option_line("seam_position");
- optgroup->append_single_option_line("external_perimeters_first");
-
- page = add_options_page(_(L("Infill")), "infill");
- optgroup = page->new_optgroup(_(L("Infill")));
- optgroup->append_single_option_line("fill_density");
- optgroup->append_single_option_line("fill_pattern");
- optgroup->append_single_option_line("top_fill_pattern");
- optgroup->append_single_option_line("bottom_fill_pattern");
-
- optgroup = page->new_optgroup(_(L("Reducing printing time")));
- optgroup->append_single_option_line("infill_every_layers");
- optgroup->append_single_option_line("infill_only_where_needed");
-
- optgroup = page->new_optgroup(_(L("Advanced")));
- optgroup->append_single_option_line("solid_infill_every_layers");
- optgroup->append_single_option_line("fill_angle");
- optgroup->append_single_option_line("solid_infill_below_area");
+ optgroup = page->new_optgroup(L("Quality (slower slicing)"));
+ optgroup->append_single_option_line("extra_perimeters", category_path + "extra-perimeters-if-needed");
+ optgroup->append_single_option_line("ensure_vertical_shell_thickness", category_path + "ensure-vertical-shell-thickness");
+ optgroup->append_single_option_line("avoid_crossing_perimeters", category_path + "avoid-crossing-perimeters");
+ optgroup->append_single_option_line("avoid_crossing_perimeters_max_detour", category_path + "avoid_crossing_perimeters_max_detour");
+ optgroup->append_single_option_line("thin_walls", category_path + "detect-thin-walls");
+ optgroup->append_single_option_line("overhangs", category_path + "detect-bridging-perimeters");
+
+ optgroup = page->new_optgroup(L("Advanced"));
+ optgroup->append_single_option_line("seam_position", category_path + "seam-position");
+ optgroup->append_single_option_line("external_perimeters_first", category_path + "external-perimeters-first");
+
+ page = add_options_page(L("Infill"), "infill");
+ category_path = "infill_42#";
+ optgroup = page->new_optgroup(L("Infill"));
+ optgroup->append_single_option_line("fill_density", category_path + "fill-density");
+ optgroup->append_single_option_line("fill_pattern", category_path + "fill-pattern");
+ optgroup->append_single_option_line("infill_anchor", category_path + "fill-pattern");
+ optgroup->append_single_option_line("infill_anchor_max", category_path + "fill-pattern");
+ optgroup->append_single_option_line("top_fill_pattern", category_path + "top-fill-pattern");
+ optgroup->append_single_option_line("bottom_fill_pattern", category_path + "bottom-fill-pattern");
+
+ optgroup = page->new_optgroup(L("Ironing"));
+ optgroup->append_single_option_line("ironing");
+ optgroup->append_single_option_line("ironing_type");
+ optgroup->append_single_option_line("ironing_flowrate");
+ optgroup->append_single_option_line("ironing_spacing");
+
+ optgroup = page->new_optgroup(L("Reducing printing time"));
+ optgroup->append_single_option_line("infill_every_layers", category_path + "combine-infill-every-x-layers");
+ optgroup->append_single_option_line("infill_only_where_needed", category_path + "only-infill-where-needed");
+
+ optgroup = page->new_optgroup(L("Advanced"));
+ optgroup->append_single_option_line("solid_infill_every_layers", category_path + "solid-infill-every-x-layers");
+ optgroup->append_single_option_line("fill_angle", category_path + "fill-angle");
+ optgroup->append_single_option_line("solid_infill_below_area", category_path + "solid-infill-threshold-area");
optgroup->append_single_option_line("bridge_angle");
optgroup->append_single_option_line("only_retract_when_crossing_perimeters");
optgroup->append_single_option_line("infill_first");
- page = add_options_page(_(L("Skirt and brim")), "skirt+brim");
- optgroup = page->new_optgroup(_(L("Skirt")));
- optgroup->append_single_option_line("skirts");
- optgroup->append_single_option_line("skirt_distance");
- optgroup->append_single_option_line("skirt_height");
- optgroup->append_single_option_line("draft_shield");
- optgroup->append_single_option_line("min_skirt_length");
-
- optgroup = page->new_optgroup(_(L("Brim")));
- optgroup->append_single_option_line("brim_width");
-
- page = add_options_page(_(L("Support material")), "support");
- optgroup = page->new_optgroup(_(L("Support material")));
- optgroup->append_single_option_line("support_material");
- optgroup->append_single_option_line("support_material_auto");
- optgroup->append_single_option_line("support_material_threshold");
- optgroup->append_single_option_line("support_material_enforce_layers");
-
- optgroup = page->new_optgroup(_(L("Raft")));
- optgroup->append_single_option_line("raft_layers");
+ page = add_options_page(L("Skirt and brim"), "skirt+brim");
+ category_path = "skirt-and-brim_133969#";
+ optgroup = page->new_optgroup(L("Skirt"));
+ optgroup->append_single_option_line("skirts", category_path + "skirt");
+ optgroup->append_single_option_line("skirt_distance", category_path + "skirt");
+ optgroup->append_single_option_line("skirt_height", category_path + "skirt");
+ optgroup->append_single_option_line("draft_shield", category_path + "skirt");
+ optgroup->append_single_option_line("min_skirt_length", category_path + "skirt");
+
+ optgroup = page->new_optgroup(L("Brim"));
+ optgroup->append_single_option_line("brim_width", category_path + "brim");
+
+ page = add_options_page(L("Support material"), "support");
+ category_path = "support-material_1698#";
+ optgroup = page->new_optgroup(L("Support material"));
+ optgroup->append_single_option_line("support_material", category_path + "generate-support-material");
+ optgroup->append_single_option_line("support_material_auto", category_path + "auto-generated-supports");
+ optgroup->append_single_option_line("support_material_threshold", category_path + "overhang-threshold");
+ optgroup->append_single_option_line("support_material_enforce_layers", category_path + "enforce-support-for-the-first");
+
+ optgroup = page->new_optgroup(L("Raft"));
+ optgroup->append_single_option_line("raft_layers", category_path + "raft-layers");
// # optgroup->append_single_option_line(get_option_("raft_contact_distance");
- optgroup = page->new_optgroup(_(L("Options for support material and raft")));
- optgroup->append_single_option_line("support_material_contact_distance");
- optgroup->append_single_option_line("support_material_pattern");
- optgroup->append_single_option_line("support_material_with_sheath");
- optgroup->append_single_option_line("support_material_spacing");
- optgroup->append_single_option_line("support_material_angle");
- optgroup->append_single_option_line("support_material_interface_layers");
- optgroup->append_single_option_line("support_material_interface_spacing");
- optgroup->append_single_option_line("support_material_interface_contact_loops");
- optgroup->append_single_option_line("support_material_buildplate_only");
- optgroup->append_single_option_line("support_material_xy_spacing");
- optgroup->append_single_option_line("dont_support_bridges");
- optgroup->append_single_option_line("support_material_synchronize_layers");
-
- page = add_options_page(_(L("Speed")), "time");
- optgroup = page->new_optgroup(_(L("Speed for print moves")));
+ optgroup = page->new_optgroup(L("Options for support material and raft"));
+ optgroup->append_single_option_line("support_material_contact_distance", category_path + "contact-z-distance");
+ optgroup->append_single_option_line("support_material_pattern", category_path + "pattern");
+ optgroup->append_single_option_line("support_material_with_sheath", category_path + "with-sheath-around-the-support");
+ optgroup->append_single_option_line("support_material_spacing", category_path + "pattern-spacing-0-inf");
+ optgroup->append_single_option_line("support_material_angle", category_path + "pattern-angle");
+ optgroup->append_single_option_line("support_material_interface_layers", category_path + "interface-layers");
+ optgroup->append_single_option_line("support_material_interface_spacing", category_path + "interface-pattern-spacing");
+ optgroup->append_single_option_line("support_material_interface_contact_loops", category_path + "interface-loops");
+ optgroup->append_single_option_line("support_material_buildplate_only", category_path + "support-on-build-plate-only");
+ optgroup->append_single_option_line("support_material_xy_spacing", category_path + "xy-separation-between-an-object-and-its-support");
+ optgroup->append_single_option_line("dont_support_bridges", category_path + "dont-support-bridges");
+ optgroup->append_single_option_line("support_material_synchronize_layers", category_path + "synchronize-with-object-layers");
+
+ page = add_options_page(L("Speed"), "time");
+ optgroup = page->new_optgroup(L("Speed for print moves"));
optgroup->append_single_option_line("perimeter_speed");
optgroup->append_single_option_line("small_perimeter_speed");
optgroup->append_single_option_line("external_perimeter_speed");
@@ -1215,41 +1514,42 @@ void TabPrint::build()
optgroup->append_single_option_line("support_material_interface_speed");
optgroup->append_single_option_line("bridge_speed");
optgroup->append_single_option_line("gap_fill_speed");
+ optgroup->append_single_option_line("ironing_speed");
- optgroup = page->new_optgroup(_(L("Speed for non-print moves")));
+ optgroup = page->new_optgroup(L("Speed for non-print moves"));
optgroup->append_single_option_line("travel_speed");
- optgroup = page->new_optgroup(_(L("Modifiers")));
+ optgroup = page->new_optgroup(L("Modifiers"));
optgroup->append_single_option_line("first_layer_speed");
- optgroup = page->new_optgroup(_(L("Acceleration control (advanced)")));
+ optgroup = page->new_optgroup(L("Acceleration control (advanced)"));
optgroup->append_single_option_line("perimeter_acceleration");
optgroup->append_single_option_line("infill_acceleration");
optgroup->append_single_option_line("bridge_acceleration");
optgroup->append_single_option_line("first_layer_acceleration");
optgroup->append_single_option_line("default_acceleration");
- optgroup = page->new_optgroup(_(L("Autospeed (advanced)")));
- optgroup->append_single_option_line("max_print_speed");
- optgroup->append_single_option_line("max_volumetric_speed");
+ optgroup = page->new_optgroup(L("Autospeed (advanced)"));
+ optgroup->append_single_option_line("max_print_speed", "max-volumetric-speed_127176");
+ optgroup->append_single_option_line("max_volumetric_speed", "max-volumetric-speed_127176");
#ifdef HAS_PRESSURE_EQUALIZER
optgroup->append_single_option_line("max_volumetric_extrusion_rate_slope_positive");
optgroup->append_single_option_line("max_volumetric_extrusion_rate_slope_negative");
#endif /* HAS_PRESSURE_EQUALIZER */
- page = add_options_page(_(L("Multiple Extruders")), "funnel");
- optgroup = page->new_optgroup(_(L("Extruders")));
+ page = add_options_page(L("Multiple Extruders"), "funnel");
+ optgroup = page->new_optgroup(L("Extruders"));
optgroup->append_single_option_line("perimeter_extruder");
optgroup->append_single_option_line("infill_extruder");
optgroup->append_single_option_line("solid_infill_extruder");
optgroup->append_single_option_line("support_material_extruder");
optgroup->append_single_option_line("support_material_interface_extruder");
- optgroup = page->new_optgroup(_(L("Ooze prevention")));
+ optgroup = page->new_optgroup(L("Ooze prevention"));
optgroup->append_single_option_line("ooze_prevention");
optgroup->append_single_option_line("standby_temperature_delta");
- optgroup = page->new_optgroup(_(L("Wipe tower")));
+ optgroup = page->new_optgroup(L("Wipe tower"));
optgroup->append_single_option_line("wipe_tower");
optgroup->append_single_option_line("wipe_tower_x");
optgroup->append_single_option_line("wipe_tower_y");
@@ -1259,11 +1559,11 @@ void TabPrint::build()
optgroup->append_single_option_line("wipe_tower_no_sparse_layers");
optgroup->append_single_option_line("single_extruder_multi_material_priming");
- optgroup = page->new_optgroup(_(L("Advanced")));
+ optgroup = page->new_optgroup(L("Advanced"));
optgroup->append_single_option_line("interface_shells");
- page = add_options_page(_(L("Advanced")), "wrench");
- optgroup = page->new_optgroup(_(L("Extrusion width")));
+ page = add_options_page(L("Advanced"), "wrench");
+ optgroup = page->new_optgroup(L("Extrusion width"));
optgroup->append_single_option_line("extrusion_width");
optgroup->append_single_option_line("first_layer_extrusion_width");
optgroup->append_single_option_line("perimeter_extrusion_width");
@@ -1273,53 +1573,53 @@ void TabPrint::build()
optgroup->append_single_option_line("top_infill_extrusion_width");
optgroup->append_single_option_line("support_material_extrusion_width");
- optgroup = page->new_optgroup(_(L("Overlap")));
+ optgroup = page->new_optgroup(L("Overlap"));
optgroup->append_single_option_line("infill_overlap");
- optgroup = page->new_optgroup(_(L("Flow")));
+ optgroup = page->new_optgroup(L("Flow"));
optgroup->append_single_option_line("bridge_flow_ratio");
- optgroup = page->new_optgroup(_(L("Slicing")));
+ optgroup = page->new_optgroup(L("Slicing"));
optgroup->append_single_option_line("slice_closing_radius");
optgroup->append_single_option_line("resolution");
optgroup->append_single_option_line("xy_size_compensation");
- optgroup->append_single_option_line("elefant_foot_compensation");
+ optgroup->append_single_option_line("elefant_foot_compensation", "elephant-foot-compensation_114487");
- optgroup = page->new_optgroup(_(L("Other")));
+ optgroup = page->new_optgroup(L("Other"));
optgroup->append_single_option_line("clip_multipart_objects");
- page = add_options_page(_(L("Output options")), "output+page_white");
- optgroup = page->new_optgroup(_(L("Sequential printing")));
- optgroup->append_single_option_line("complete_objects");
- line = { _(L("Extruder clearance (mm)")), "" };
+ page = add_options_page(L("Output options"), "output+page_white");
+ optgroup = page->new_optgroup(L("Sequential printing"));
+ optgroup->append_single_option_line("complete_objects", "sequential-printing_124589");
+ line = { L("Extruder clearance"), "" };
line.append_option(optgroup->get_option("extruder_clearance_radius"));
line.append_option(optgroup->get_option("extruder_clearance_height"));
optgroup->append_line(line);
- optgroup = page->new_optgroup(_(L("Output file")));
+ optgroup = page->new_optgroup(L("Output file"));
optgroup->append_single_option_line("gcode_comments");
optgroup->append_single_option_line("gcode_label_objects");
Option option = optgroup->get_option("output_filename_format");
option.opt.full_width = true;
optgroup->append_single_option_line(option);
- optgroup = page->new_optgroup(_(L("Post-processing scripts")), 0);
+ optgroup = page->new_optgroup(L("Post-processing scripts"), 0);
option = optgroup->get_option("post_process");
option.opt.full_width = true;
option.opt.height = 5;//50;
optgroup->append_single_option_line(option);
- page = add_options_page(_(L("Notes")), "note.png");
- optgroup = page->new_optgroup(_(L("Notes")), 0);
+ page = add_options_page(L("Notes"), "note.png");
+ optgroup = page->new_optgroup(L("Notes"), 0);
option = optgroup->get_option("notes");
option.opt.full_width = true;
option.opt.height = 25;//250;
optgroup->append_single_option_line(option);
- page = add_options_page(_(L("Dependencies")), "wrench.png");
- optgroup = page->new_optgroup(_(L("Profile dependencies")));
+ page = add_options_page(L("Dependencies"), "wrench.png");
+ optgroup = page->new_optgroup(L("Profile dependencies"));
- create_line_with_widget(optgroup.get(), "compatible_printers", [this](wxWindow* parent) {
+ create_line_with_widget(optgroup.get(), "compatible_printers", wxEmptyString, [this](wxWindow* parent) {
return compatible_widget_create(parent, m_compatible_printers);
});
@@ -1337,27 +1637,46 @@ void TabPrint::reload_config()
Tab::reload_config();
}
+void TabPrint::update_description_lines()
+{
+ Tab::update_description_lines();
+
+ if (m_preset_bundle->printers.get_selected_preset().printer_technology() == ptSLA)
+ return;
+
+ if (m_active_page && m_active_page->title() == "Layers and perimeters" &&
+ m_recommended_thin_wall_thickness_description_line && m_top_bottom_shell_thickness_explanation)
+ {
+ m_recommended_thin_wall_thickness_description_line->SetText(
+ from_u8(PresetHints::recommended_thin_wall_thickness(*m_preset_bundle)));
+ m_top_bottom_shell_thickness_explanation->SetText(
+ from_u8(PresetHints::top_bottom_shell_thickness_explanation(*m_preset_bundle)));
+ }
+}
+
+void TabPrint::toggle_options()
+{
+ if (!m_active_page) return;
+
+ m_config_manipulation.toggle_print_fff_options(m_config);
+}
+
void TabPrint::update()
{
if (m_preset_bundle->printers.get_selected_preset().printer_technology() == ptSLA)
return; // ys_FIXME
m_update_cnt++;
-// Freeze();
m_config_manipulation.update_print_fff_config(m_config, true);
- m_recommended_thin_wall_thickness_description_line->SetText(
- from_u8(PresetHints::recommended_thin_wall_thickness(*m_preset_bundle)));
- m_top_bottom_shell_thickness_explanation->SetText(
- from_u8(PresetHints::top_bottom_shell_thickness_explanation(*m_preset_bundle)));
+ update_description_lines();
Layout();
-// Thaw();
m_update_cnt--;
if (m_update_cnt==0) {
- m_config_manipulation.toggle_print_fff_options(m_config);
+ toggle_options();
// update() could be called during undo/redo execution
// Update of objectList can cause a crash in this case (because m_objects doesn't match ObjectList)
@@ -1368,19 +1687,18 @@ void TabPrint::update()
}
}
-void TabPrint::OnActivate()
+void TabPrint::clear_pages()
{
- m_recommended_thin_wall_thickness_description_line->SetText(
- from_u8(PresetHints::recommended_thin_wall_thickness(*m_preset_bundle)));
- m_top_bottom_shell_thickness_explanation->SetText(
- from_u8(PresetHints::top_bottom_shell_thickness_explanation(*m_preset_bundle)));
- Tab::OnActivate();
+ Tab::clear_pages();
+
+ m_recommended_thin_wall_thickness_description_line = nullptr;
+ m_top_bottom_shell_thickness_explanation = nullptr;
}
void TabFilament::add_filament_overrides_page()
{
- PageShp page = add_options_page(_(L("Filament Overrides")), "wrench");
- ConfigOptionsGroupShp optgroup = page->new_optgroup(_(L("Retraction")));
+ PageShp page = add_options_page(L("Filament Overrides"), "wrench");
+ ConfigOptionsGroupShp optgroup = page->new_optgroup(L("Retraction"));
auto append_single_option_line = [optgroup, this](const std::string& opt_key, int opt_index)
{
@@ -1434,12 +1752,11 @@ void TabFilament::add_filament_overrides_page()
void TabFilament::update_filament_overrides_page()
{
- const auto page_it = std::find_if(m_pages.begin(), m_pages.end(), [](const PageShp page) {return page->title() == _(L("Filament Overrides")); });
- if (page_it == m_pages.end())
+ if (!m_active_page || m_active_page->title() != "Filament Overrides")
return;
- PageShp page = *page_it;
+ Page* page = m_active_page;
- const auto og_it = std::find_if(page->m_optgroups.begin(), page->m_optgroups.end(), [](const ConfigOptionsGroupShp og) {return og->title == _(L("Retraction")); });
+ const auto og_it = std::find_if(page->m_optgroups.begin(), page->m_optgroups.end(), [](const ConfigOptionsGroupShp og) { return og->title == "Retraction"; });
if (og_it == page->m_optgroups.end())
return;
ConfigOptionsGroupShp optgroup = *og_it;
@@ -1481,27 +1798,41 @@ void TabFilament::build()
m_presets = &m_preset_bundle->filaments;
load_initial_data();
- auto page = add_options_page(_(L("Filament")), "spool.png");
- auto optgroup = page->new_optgroup(_(L("Filament")));
+ auto page = add_options_page(L("Filament"), "spool.png");
+ auto optgroup = page->new_optgroup(L("Filament"));
optgroup->append_single_option_line("filament_colour");
optgroup->append_single_option_line("filament_diameter");
optgroup->append_single_option_line("extrusion_multiplier");
optgroup->append_single_option_line("filament_density");
optgroup->append_single_option_line("filament_cost");
+ optgroup->append_single_option_line("filament_spool_weight");
- optgroup = page->new_optgroup(_(L("Temperature")) + wxString(" °C", wxConvUTF8));
- Line line = { _(L("Extruder")), "" };
+ optgroup->m_on_change = [this, optgroup](t_config_option_key opt_key, boost::any value)
+ {
+ update_dirty();
+ if (opt_key == "filament_spool_weight") {
+ // Change of this option influences for an update of "Sliced Info"
+ wxGetApp().sidebar().update_sliced_info_sizer();
+ wxGetApp().sidebar().Layout();
+ }
+ else
+ on_value_change(opt_key, value);
+ };
+
+ optgroup = page->new_optgroup(L("Temperature"));
+ Line line = { L("Nozzle"), "" };
line.append_option(optgroup->get_option("first_layer_temperature"));
line.append_option(optgroup->get_option("temperature"));
optgroup->append_line(line);
- line = { _(L("Bed")), "" };
+ line = { L("Bed"), "" };
line.append_option(optgroup->get_option("first_layer_bed_temperature"));
line.append_option(optgroup->get_option("bed_temperature"));
optgroup->append_line(line);
- page = add_options_page(_(L("Cooling")), "cooling");
- optgroup = page->new_optgroup(_(L("Enable")));
+ page = add_options_page(L("Cooling"), "cooling");
+ wxString category_path = "cooling_127569#";
+ optgroup = page->new_optgroup(L("Enable"));
optgroup->append_single_option_line("fan_always_on");
optgroup->append_single_option_line("cooling");
@@ -1512,30 +1843,32 @@ void TabFilament::build()
};
optgroup->append_line(line);
- optgroup = page->new_optgroup(_(L("Fan settings")));
- line = { _(L("Fan speed")), "" };
+ optgroup = page->new_optgroup(L("Fan settings"));
+ line = { L("Fan speed"), "" };
+ line.label_path = category_path + "fan-settings";
line.append_option(optgroup->get_option("min_fan_speed"));
line.append_option(optgroup->get_option("max_fan_speed"));
optgroup->append_line(line);
- optgroup->append_single_option_line("bridge_fan_speed");
- optgroup->append_single_option_line("disable_fan_first_layers");
+ optgroup->append_single_option_line("bridge_fan_speed", category_path + "fan-settings");
+ optgroup->append_single_option_line("disable_fan_first_layers", category_path + "fan-settings");
+ optgroup->append_single_option_line("full_fan_speed_layer", category_path + "fan-settings");
- optgroup = page->new_optgroup(_(L("Cooling thresholds")), 25);
- optgroup->append_single_option_line("fan_below_layer_time");
- optgroup->append_single_option_line("slowdown_below_layer_time");
- optgroup->append_single_option_line("min_print_speed");
+ optgroup = page->new_optgroup(L("Cooling thresholds"), 25);
+ optgroup->append_single_option_line("fan_below_layer_time", category_path + "cooling-thresholds");
+ optgroup->append_single_option_line("slowdown_below_layer_time", category_path + "cooling-thresholds");
+ optgroup->append_single_option_line("min_print_speed", category_path + "cooling-thresholds");
- page = add_options_page(_(L("Advanced")), "wrench");
- optgroup = page->new_optgroup(_(L("Filament properties")));
+ page = add_options_page(L("Advanced"), "wrench");
+ optgroup = page->new_optgroup(L("Filament properties"));
// Set size as all another fields for a better alignment
Option option = optgroup->get_option("filament_type");
option.opt.width = Field::def_width();
optgroup->append_single_option_line(option);
optgroup->append_single_option_line("filament_soluble");
- optgroup = page->new_optgroup(_(L("Print speed override")));
- optgroup->append_single_option_line("filament_max_volumetric_speed");
+ optgroup = page->new_optgroup(L("Print speed override"));
+ optgroup->append_single_option_line("filament_max_volumetric_speed", "max-volumetric-speed_127176");
line = { "", "" };
line.full_width = 1;
@@ -1544,10 +1877,10 @@ void TabFilament::build()
};
optgroup->append_line(line);
- optgroup = page->new_optgroup(_(L("Wipe tower parameters")));
+ optgroup = page->new_optgroup(L("Wipe tower parameters"));
optgroup->append_single_option_line("filament_minimal_purge_on_wipe_tower");
- optgroup = page->new_optgroup(_(L("Toolchange parameters with single extruder MM printers")));
+ optgroup = page->new_optgroup(L("Toolchange parameters with single extruder MM printers"));
optgroup->append_single_option_line("filament_loading_speed_start");
optgroup->append_single_option_line("filament_loading_speed");
optgroup->append_single_option_line("filament_unloading_speed_start");
@@ -1559,22 +1892,22 @@ void TabFilament::build()
optgroup->append_single_option_line("filament_cooling_initial_speed");
optgroup->append_single_option_line("filament_cooling_final_speed");
- line = optgroup->create_single_option_line("filament_ramming_parameters");// { _(L("Ramming")), "" };
- line.widget = [this](wxWindow* parent) {
+ create_line_with_widget(optgroup.get(), "filament_ramming_parameters", wxEmptyString, [this](wxWindow* parent) {
auto ramming_dialog_btn = new wxButton(parent, wxID_ANY, _(L("Ramming settings"))+dots, wxDefaultPosition, wxDefaultSize, wxBU_EXACTFIT);
ramming_dialog_btn->SetFont(Slic3r::GUI::wxGetApp().normal_font());
+ ramming_dialog_btn->SetSize(ramming_dialog_btn->GetBestSize());
auto sizer = new wxBoxSizer(wxHORIZONTAL);
sizer->Add(ramming_dialog_btn);
- ramming_dialog_btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent& e)
- {
+ ramming_dialog_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent& e) {
RammingDialog dlg(this,(m_config->option<ConfigOptionStrings>("filament_ramming_parameters"))->get_at(0));
- if (dlg.ShowModal() == wxID_OK)
- (m_config->option<ConfigOptionStrings>("filament_ramming_parameters"))->get_at(0) = dlg.get_parameters();
- }));
+ if (dlg.ShowModal() == wxID_OK) {
+ load_key_value("filament_ramming_parameters", dlg.get_parameters());
+ update_changed_ui();
+ }
+ });
return sizer;
- };
- optgroup->append_line(line);
+ });
add_filament_overrides_page();
@@ -1583,30 +1916,32 @@ void TabFilament::build()
const int gcode_field_height = 15; // 150
const int notes_field_height = 25; // 250
- page = add_options_page(_(L("Custom G-code")), "cog");
- optgroup = page->new_optgroup(_(L("Start G-code")), 0);
+ page = add_options_page(L("Custom G-code"), "cog");
+ optgroup = page->new_optgroup(L("Start G-code"), 0);
option = optgroup->get_option("start_filament_gcode");
option.opt.full_width = true;
+ option.opt.is_code = true;
option.opt.height = gcode_field_height;// 150;
optgroup->append_single_option_line(option);
- optgroup = page->new_optgroup(_(L("End G-code")), 0);
+ optgroup = page->new_optgroup(L("End G-code"), 0);
option = optgroup->get_option("end_filament_gcode");
option.opt.full_width = true;
+ option.opt.is_code = true;
option.opt.height = gcode_field_height;// 150;
optgroup->append_single_option_line(option);
- page = add_options_page(_(L("Notes")), "note.png");
- optgroup = page->new_optgroup(_(L("Notes")), 0);
+ page = add_options_page(L("Notes"), "note.png");
+ optgroup = page->new_optgroup(L("Notes"), 0);
optgroup->label_width = 0;
option = optgroup->get_option("filament_notes");
option.opt.full_width = true;
option.opt.height = notes_field_height;// 250;
optgroup->append_single_option_line(option);
- page = add_options_page(_(L("Dependencies")), "wrench.png");
- optgroup = page->new_optgroup(_(L("Profile dependencies")));
- create_line_with_widget(optgroup.get(), "compatible_printers", [this](wxWindow* parent) {
+ page = add_options_page(L("Dependencies"), "wrench.png");
+ optgroup = page->new_optgroup(L("Profile dependencies"));
+ create_line_with_widget(optgroup.get(), "compatible_printers", wxEmptyString, [this](wxWindow* parent) {
return compatible_widget_create(parent, m_compatible_printers);
});
@@ -1614,7 +1949,7 @@ void TabFilament::build()
option.opt.full_width = true;
optgroup->append_single_option_line(option);
- create_line_with_widget(optgroup.get(), "compatible_prints", [this](wxWindow* parent) {
+ create_line_with_widget(optgroup.get(), "compatible_prints", wxEmptyString, [this](wxWindow* parent) {
return compatible_widget_create(parent, m_compatible_prints);
});
@@ -1644,6 +1979,40 @@ void TabFilament::update_volumetric_flow_preset_hints()
m_volumetric_speed_description_line->SetText(text);
}
+void TabFilament::update_description_lines()
+{
+ Tab::update_description_lines();
+
+ if (!m_active_page)
+ return;
+
+ if (m_active_page->title() == "Cooling" && m_cooling_description_line)
+ m_cooling_description_line->SetText(from_u8(PresetHints::cooling_description(m_presets->get_edited_preset())));
+ if (m_active_page->title() == "Advanced" && m_volumetric_speed_description_line)
+ this->update_volumetric_flow_preset_hints();
+}
+
+void TabFilament::toggle_options()
+{
+ if (!m_active_page)
+ return;
+
+ if (m_active_page->title() == "Cooling")
+ {
+ bool cooling = m_config->opt_bool("cooling", 0);
+ bool fan_always_on = cooling || m_config->opt_bool("fan_always_on", 0);
+
+ for (auto el : { "max_fan_speed", "fan_below_layer_time", "slowdown_below_layer_time", "min_print_speed" })
+ toggle_option(el, cooling);
+
+ for (auto el : { "min_fan_speed", "disable_fan_first_layers", "full_fan_speed_layer" })
+ toggle_option(el, fan_always_on);
+ }
+
+ if (m_active_page->title() == "Filament Overrides")
+ update_filament_overrides_page();
+}
+
void TabFilament::update()
{
if (m_preset_bundle->printers.get_selected_preset().printer_technology() == ptSLA)
@@ -1651,21 +2020,10 @@ void TabFilament::update()
m_update_cnt++;
- wxString text = from_u8(PresetHints::cooling_description(m_presets->get_edited_preset()));
- m_cooling_description_line->SetText(text);
- this->update_volumetric_flow_preset_hints();
+ update_description_lines();
Layout();
- bool cooling = m_config->opt_bool("cooling", 0);
- bool fan_always_on = cooling || m_config->opt_bool("fan_always_on", 0);
-
- for (auto el : { "max_fan_speed", "fan_below_layer_time", "slowdown_below_layer_time", "min_print_speed" })
- get_field(el)->toggle(cooling);
-
- for (auto el : { "min_fan_speed", "disable_fan_first_layers" })
- get_field(el)->toggle(fan_always_on);
-
- update_filament_overrides_page();
+ toggle_options();
m_update_cnt--;
@@ -1673,15 +2031,17 @@ void TabFilament::update()
wxGetApp().mainframe->on_config_changed(m_config);
}
-void TabFilament::OnActivate()
+void TabFilament::clear_pages()
{
- this->update_volumetric_flow_preset_hints();
- Tab::OnActivate();
+ Tab::clear_pages();
+
+ m_volumetric_speed_description_line = nullptr;
+ m_cooling_description_line = nullptr;
}
-wxSizer* Tab::description_line_widget(wxWindow* parent, ogStaticText* *StaticText)
+wxSizer* Tab::description_line_widget(wxWindow* parent, ogStaticText* *StaticText, wxString text /*= wxEmptyString*/)
{
- *StaticText = new ogStaticText(parent, "");
+ *StaticText = new ogStaticText(parent, text);
// auto font = (new wxSystemSettings)->GetFont(wxSYS_DEFAULT_GUI_FONT);
(*StaticText)->SetFont(wxGetApp().normal_font());
@@ -1696,132 +2056,6 @@ bool Tab::current_preset_is_dirty()
return m_presets->current_is_dirty();
}
-void TabPrinter::build_printhost(ConfigOptionsGroup *optgroup)
-{
- const PrinterTechnology tech = m_presets->get_selected_preset().printer_technology();
-
- // Only offer the host type selection for FFF, for SLA it's always the SL1 printer (at the moment)
- if (tech == ptFFF) {
- optgroup->append_single_option_line("host_type");
- }
-
- auto printhost_browse = [=](wxWindow* parent) {
- add_scaled_button(parent, &m_printhost_browse_btn, "browse", _(L("Browse")) + " "+ dots, wxBU_LEFT | wxBU_EXACTFIT);
- ScalableButton* btn = m_printhost_browse_btn;
- btn->SetFont(Slic3r::GUI::wxGetApp().normal_font());
-
- auto sizer = new wxBoxSizer(wxHORIZONTAL);
- sizer->Add(btn);
-
- btn->Bind(wxEVT_BUTTON, [=](wxCommandEvent &e) {
- BonjourDialog dialog(parent, tech);
- if (dialog.show_and_lookup()) {
- optgroup->set_value("print_host", std::move(dialog.get_selected()), true);
- optgroup->get_field("print_host")->field_changed();
- }
- });
-
- return sizer;
- };
-
- auto print_host_test = [this](wxWindow* parent) {
- add_scaled_button(parent, &m_print_host_test_btn, "test", _(L("Test")), wxBU_LEFT | wxBU_EXACTFIT);
- ScalableButton* btn = m_print_host_test_btn;
- btn->SetFont(Slic3r::GUI::wxGetApp().normal_font());
- auto sizer = new wxBoxSizer(wxHORIZONTAL);
- sizer->Add(btn);
-
- btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) {
- std::unique_ptr<PrintHost> host(PrintHost::get_print_host(m_config));
- if (! host) {
- const wxString text = _(L("Could not get a valid Printer Host reference"));
- show_error(this, text);
- return;
- }
- wxString msg;
- if (host->test(msg)) {
- show_info(this, host->get_test_ok_msg(), _(L("Success!")));
- } else {
- show_error(this, host->get_test_failed_msg(msg));
- }
- });
-
- return sizer;
- };
-
- // Set a wider width for a better alignment
- Option option = optgroup->get_option("print_host");
- option.opt.width = Field::def_width_wider();
- Line host_line = optgroup->create_single_option_line(option);
- host_line.append_widget(printhost_browse);
- host_line.append_widget(print_host_test);
- optgroup->append_line(host_line);
- option = optgroup->get_option("printhost_apikey");
- option.opt.width = Field::def_width_wider();
- optgroup->append_single_option_line(option);
-
- const auto ca_file_hint = _utf8(L("HTTPS CA file is optional. It is only needed if you use HTTPS with a self-signed certificate."));
-
- if (Http::ca_file_supported()) {
- option = optgroup->get_option("printhost_cafile");
- option.opt.width = Field::def_width_wider();
- Line cafile_line = optgroup->create_single_option_line(option);
-
- auto printhost_cafile_browse = [this, optgroup] (wxWindow* parent) {
- auto btn = new wxButton(parent, wxID_ANY, " " + _(L("Browse"))+" " +dots, wxDefaultPosition, wxDefaultSize, wxBU_LEFT);
- btn->SetFont(Slic3r::GUI::wxGetApp().normal_font());
- btn->SetBitmap(create_scaled_bitmap("browse"));
- auto sizer = new wxBoxSizer(wxHORIZONTAL);
- sizer->Add(btn);
-
- btn->Bind(wxEVT_BUTTON, [this, optgroup] (wxCommandEvent e) {
- static const auto filemasks = _(L("Certificate files (*.crt, *.pem)|*.crt;*.pem|All files|*.*"));
- wxFileDialog openFileDialog(this, _(L("Open CA certificate file")), "", "", filemasks, wxFD_OPEN | wxFD_FILE_MUST_EXIST);
- if (openFileDialog.ShowModal() != wxID_CANCEL) {
- optgroup->set_value("printhost_cafile", std::move(openFileDialog.GetPath()), true);
- optgroup->get_field("printhost_cafile")->field_changed();
- }
- });
-
- return sizer;
- };
-
- cafile_line.append_widget(printhost_cafile_browse);
- optgroup->append_line(cafile_line);
-
- Line cafile_hint { "", "" };
- cafile_hint.full_width = 1;
- cafile_hint.widget = [this, ca_file_hint](wxWindow* parent) {
- auto txt = new wxStaticText(parent, wxID_ANY, ca_file_hint);
- auto sizer = new wxBoxSizer(wxHORIZONTAL);
- sizer->Add(txt);
- return sizer;
- };
- optgroup->append_line(cafile_hint);
- } else {
- Line line { "", "" };
- line.full_width = 1;
-
- line.widget = [ca_file_hint] (wxWindow* parent) {
- std::string info = _utf8(L("HTTPS CA File")) + ":\n\t" +
- (boost::format(_utf8(L("On this system, %s uses HTTPS certificates from the system Certificate Store or Keychain."))) % SLIC3R_APP_NAME).str() +
- "\n\t" + _utf8(L("To use a custom CA file, please import your CA file into Certificate Store / Keychain."));
-
- auto txt = new wxStaticText(parent, wxID_ANY, from_u8((boost::format("%1%\n\n\t%2%") % info % ca_file_hint).str()));
-/* % (boost::format(_utf8(L("HTTPS CA File:\n\
- \tOn this system, %s uses HTTPS certificates from the system Certificate Store or Keychain.\n\
- \tTo use a custom CA file, please import your CA file into Certificate Store / Keychain."))) % SLIC3R_APP_NAME).str()
- % std::string(ca_file_hint.ToUTF8())).str()));
-*/ txt->SetFont(Slic3r::GUI::wxGetApp().normal_font());
- auto sizer = new wxBoxSizer(wxHORIZONTAL);
- sizer->Add(txt, 1, wxEXPAND);
- return sizer;
- };
-
- optgroup->append_line(line);
- }
-}
-
void TabPrinter::build()
{
m_presets = &m_preset_bundle->printers;
@@ -1832,6 +2066,27 @@ void TabPrinter::build()
m_presets->get_selected_preset().printer_technology() == ptSLA ? build_sla() : build_fff();
}
+void TabPrinter::build_print_host_upload_group(Page* page)
+{
+ ConfigOptionsGroupShp optgroup = page->new_optgroup(L("Print Host upload"));
+
+ wxString description_line_text = _L(""
+ "Note: All parameters from this group are moved to the Physical Printer settings (see changelog).\n\n"
+ "A new Physical Printer profile is created by clicking on the \"cog\" icon right of the Printer profiles combo box, "
+ "by selecting the \"Add physical printer\" item in the Printer combo box. The Physical Printer profile editor opens "
+ "also when clicking on the \"cog\" icon in the Printer settings tab. The Physical Printer profiles are being stored "
+ "into PrusaSlicer/physical_printer directory.");
+
+ Line line = { "", "" };
+ line.full_width = 1;
+ line.widget = [this, description_line_text](wxWindow* parent) {
+ return description_line_widget(parent, m_presets->get_selected_preset().printer_technology() == ptFFF ?
+ &m_fff_print_host_upload_description_line : &m_sla_print_host_upload_description_line,
+ description_line_text);
+ };
+ optgroup->append_line(line);
+}
+
void TabPrinter::build_fff()
{
if (!m_pages.empty())
@@ -1847,17 +2102,17 @@ void TabPrinter::build_fff()
m_sys_extruders_count = parent_preset == nullptr ? 0 :
static_cast<const ConfigOptionFloats*>(parent_preset->config.option("nozzle_diameter"))->values.size();
- auto page = add_options_page(_(L("General")), "printer");
- auto optgroup = page->new_optgroup(_(L("Size and coordinates")));
+ auto page = add_options_page(L("General"), "printer");
+ auto optgroup = page->new_optgroup(L("Size and coordinates"));
- create_line_with_widget(optgroup.get(), "bed_shape", [this](wxWindow* parent) {
+ create_line_with_widget(optgroup.get(), "bed_shape", "custom-svg-and-png-bed-textures_124612", [this](wxWindow* parent) {
return create_bed_shape_widget(parent);
});
optgroup->append_single_option_line("max_print_height");
optgroup->append_single_option_line("z_offset");
- optgroup = page->new_optgroup(_(L("Capabilities")));
+ optgroup = page->new_optgroup(L("Capabilities"));
ConfigOptionDef def;
def.type = coInt,
def.set_default_value(new ConfigOptionInt(1));
@@ -1919,59 +2174,15 @@ void TabPrinter::build_fff()
});
};
+ build_print_host_upload_group(page.get());
-#if 0
- if (!m_no_controller)
- {
- optgroup = page->new_optgroup(_(L("USB/Serial connection")));
- line = {_(L("Serial port")), ""};
- Option serial_port = optgroup->get_option("serial_port");
- serial_port.side_widget = ([this](wxWindow* parent) {
- auto btn = new wxBitmapButton(parent, wxID_ANY, wxBitmap(from_u8(Slic3r::var("arrow_rotate_clockwise.png")), wxBITMAP_TYPE_PNG),
- wxDefaultPosition, wxDefaultSize, wxBORDER_NONE);
- btn->SetToolTip(_(L("Rescan serial ports")));
- auto sizer = new wxBoxSizer(wxHORIZONTAL);
- sizer->Add(btn);
-
- btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent e) {update_serial_ports(); });
- return sizer;
- });
- auto serial_test = [this](wxWindow* parent) {
- auto btn = m_serial_test_btn = new wxButton(parent, wxID_ANY,
- _(L("Test")), wxDefaultPosition, wxDefaultSize, wxBU_LEFT | wxBU_EXACTFIT);
- btn->SetFont(Slic3r::GUI::small_font());
- btn->SetBitmap(wxBitmap(from_u8(Slic3r::var("wrench.png")), wxBITMAP_TYPE_PNG));
- auto sizer = new wxBoxSizer(wxHORIZONTAL);
- sizer->Add(btn);
-
- btn->Bind(wxEVT_BUTTON, [this, parent](wxCommandEvent e) {
- auto sender = Slic3r::make_unique<GCodeSender>();
- auto res = sender->connect(
- m_config->opt_string("serial_port"),
- m_config->opt_int("serial_speed")
- );
- if (res && sender->wait_connected()) {
- show_info(parent, _(L("Connection to printer works correctly.")), _(L("Success!")));
- }
- else {
- show_error(parent, _(L("Connection failed.")));
- }
- });
- return sizer;
- };
-
- line.append_option(serial_port);
- line.append_option(optgroup->get_option("serial_speed"));
- line.append_widget(serial_test);
- optgroup->append_line(line);
- }
-#endif
+ optgroup = page->new_optgroup(L("Firmware"));
+ optgroup->append_single_option_line("gcode_flavor");
- optgroup = page->new_optgroup(_(L("Print Host upload")));
- build_printhost(optgroup.get());
+ option = optgroup->get_option("thumbnails");
+ option.opt.full_width = true;
+ optgroup->append_single_option_line(option);
- optgroup = page->new_optgroup(_(L("Firmware")));
- optgroup->append_single_option_line("gcode_flavor");
optgroup->append_single_option_line("silent_mode");
optgroup->append_single_option_line("remaining_times");
@@ -1990,7 +2201,7 @@ void TabPrinter::build_fff()
});
};
- optgroup = page->new_optgroup(_(L("Advanced")));
+ optgroup = page->new_optgroup(L("Advanced"));
optgroup->append_single_option_line("use_relative_e_distances");
optgroup->append_single_option_line("use_firmware_retraction");
optgroup->append_single_option_line("use_volumetric_e");
@@ -1998,81 +2209,100 @@ void TabPrinter::build_fff()
const int gcode_field_height = 15; // 150
const int notes_field_height = 25; // 250
- page = add_options_page(_(L("Custom G-code")), "cog");
- optgroup = page->new_optgroup(_(L("Start G-code")), 0);
+ page = add_options_page(L("Custom G-code"), "cog");
+ optgroup = page->new_optgroup(L("Start G-code"), 0);
option = optgroup->get_option("start_gcode");
option.opt.full_width = true;
+ option.opt.is_code = true;
option.opt.height = gcode_field_height;//150;
optgroup->append_single_option_line(option);
- optgroup = page->new_optgroup(_(L("End G-code")), 0);
+ optgroup = page->new_optgroup(L("End G-code"), 0);
option = optgroup->get_option("end_gcode");
option.opt.full_width = true;
+ option.opt.is_code = true;
option.opt.height = gcode_field_height;//150;
optgroup->append_single_option_line(option);
- optgroup = page->new_optgroup(_(L("Before layer change G-code")), 0);
+ optgroup = page->new_optgroup(L("Before layer change G-code"), 0);
option = optgroup->get_option("before_layer_gcode");
option.opt.full_width = true;
+ option.opt.is_code = true;
option.opt.height = gcode_field_height;//150;
optgroup->append_single_option_line(option);
- optgroup = page->new_optgroup(_(L("After layer change G-code")), 0);
+ optgroup = page->new_optgroup(L("After layer change G-code"), 0);
option = optgroup->get_option("layer_gcode");
option.opt.full_width = true;
+ option.opt.is_code = true;
option.opt.height = gcode_field_height;//150;
optgroup->append_single_option_line(option);
- optgroup = page->new_optgroup(_(L("Tool change G-code")), 0);
+ optgroup = page->new_optgroup(L("Tool change G-code"), 0);
option = optgroup->get_option("toolchange_gcode");
option.opt.full_width = true;
+ option.opt.is_code = true;
option.opt.height = gcode_field_height;//150;
optgroup->append_single_option_line(option);
- optgroup = page->new_optgroup(_(L("Between objects G-code (for sequential printing)")), 0);
+ optgroup = page->new_optgroup(L("Between objects G-code (for sequential printing)"), 0);
option = optgroup->get_option("between_objects_gcode");
option.opt.full_width = true;
+ option.opt.is_code = true;
+ option.opt.height = gcode_field_height;//150;
+ optgroup->append_single_option_line(option);
+
+ optgroup = page->new_optgroup(L("Color Change G-code"), 0);
+ option = optgroup->get_option("color_change_gcode");
+ option.opt.is_code = true;
+ option.opt.height = gcode_field_height;//150;
+ optgroup->append_single_option_line(option);
+
+ optgroup = page->new_optgroup(L("Pause Print G-code"), 0);
+ option = optgroup->get_option("pause_print_gcode");
+ option.opt.is_code = true;
option.opt.height = gcode_field_height;//150;
optgroup->append_single_option_line(option);
- page = add_options_page(_(L("Notes")), "note.png");
- optgroup = page->new_optgroup(_(L("Notes")), 0);
+ optgroup = page->new_optgroup(L("Template Custom G-code"), 0);
+ option = optgroup->get_option("template_custom_gcode");
+ option.opt.is_code = true;
+ option.opt.height = gcode_field_height;//150;
+ optgroup->append_single_option_line(option);
+
+ page = add_options_page(L("Notes"), "note.png");
+ optgroup = page->new_optgroup(L("Notes"), 0);
option = optgroup->get_option("printer_notes");
option.opt.full_width = true;
option.opt.height = notes_field_height;//250;
optgroup->append_single_option_line(option);
- page = add_options_page(_(L("Dependencies")), "wrench.png");
- optgroup = page->new_optgroup(_(L("Profile dependencies")));
+ page = add_options_page(L("Dependencies"), "wrench.png");
+ optgroup = page->new_optgroup(L("Profile dependencies"));
build_preset_description_line(optgroup.get());
build_unregular_pages();
-
-#if 0
- if (!m_no_controller)
- update_serial_ports();
-#endif
}
void TabPrinter::build_sla()
{
if (!m_pages.empty())
m_pages.resize(0);
- auto page = add_options_page(_(L("General")), "printer");
- auto optgroup = page->new_optgroup(_(L("Size and coordinates")));
+ auto page = add_options_page(L("General"), "printer");
+ auto optgroup = page->new_optgroup(L("Size and coordinates"));
- create_line_with_widget(optgroup.get(), "bed_shape", [this](wxWindow* parent) {
+ create_line_with_widget(optgroup.get(), "bed_shape", "custom-svg-and-png-bed-textures_124612", [this](wxWindow* parent) {
return create_bed_shape_widget(parent);
});
optgroup->append_single_option_line("max_print_height");
- optgroup = page->new_optgroup(_(L("Display")));
+ optgroup = page->new_optgroup(L("Display"));
optgroup->append_single_option_line("display_width");
optgroup->append_single_option_line("display_height");
auto option = optgroup->get_option("display_pixels_x");
- Line line = { _(option.opt.full_label), "" };
+ Line line = { option.opt.full_label, "" };
line.append_option(option);
line.append_option(optgroup->get_option("display_pixels_y"));
optgroup->append_line(line);
@@ -2082,15 +2312,15 @@ void TabPrinter::build_sla()
optgroup->append_single_option_line("display_mirror_x");
optgroup->append_single_option_line("display_mirror_y");
- optgroup = page->new_optgroup(_(L("Tilt")));
- line = { _(L("Tilt time")), "" };
+ optgroup = page->new_optgroup(L("Tilt"));
+ line = { L("Tilt time"), "" };
line.append_option(optgroup->get_option("fast_tilt_time"));
line.append_option(optgroup->get_option("slow_tilt_time"));
optgroup->append_line(line);
optgroup->append_single_option_line("area_fill");
- optgroup = page->new_optgroup(_(L("Corrections")));
- line = Line{ _(m_config->def()->get("relative_correction")->full_label), "" };
+ optgroup = page->new_optgroup(L("Corrections"));
+ line = Line{ m_config->def()->get("relative_correction")->full_label, "" };
// std::vector<std::string> axes{ "X", "Y", "Z" };
std::vector<std::string> axes{ "XY", "Z" };
int id = 0;
@@ -2106,37 +2336,29 @@ void TabPrinter::build_sla()
optgroup->append_single_option_line("elefant_foot_min_width");
optgroup->append_single_option_line("gamma_correction");
- optgroup = page->new_optgroup(_(L("Exposure")));
+ optgroup = page->new_optgroup(L("Exposure"));
optgroup->append_single_option_line("min_exposure_time");
optgroup->append_single_option_line("max_exposure_time");
optgroup->append_single_option_line("min_initial_exposure_time");
optgroup->append_single_option_line("max_initial_exposure_time");
- optgroup = page->new_optgroup(_(L("Print Host upload")));
- build_printhost(optgroup.get());
+ build_print_host_upload_group(page.get());
const int notes_field_height = 25; // 250
- page = add_options_page(_(L("Notes")), "note.png");
- optgroup = page->new_optgroup(_(L("Notes")), 0);
+ page = add_options_page(L("Notes"), "note.png");
+ optgroup = page->new_optgroup(L("Notes"), 0);
option = optgroup->get_option("printer_notes");
option.opt.full_width = true;
option.opt.height = notes_field_height;//250;
optgroup->append_single_option_line(option);
- page = add_options_page(_(L("Dependencies")), "wrench.png");
- optgroup = page->new_optgroup(_(L("Profile dependencies")));
+ page = add_options_page(L("Dependencies"), "wrench.png");
+ optgroup = page->new_optgroup(L("Profile dependencies"));
build_preset_description_line(optgroup.get());
}
-void TabPrinter::update_serial_ports()
-{
- Field *field = get_field("serial_port");
- Choice *choice = static_cast<Choice *>(field);
- choice->set_values(Utils::scan_serial_ports());
-}
-
void TabPrinter::extruders_count_changed(size_t extruders_count)
{
bool is_count_changed = false;
@@ -2164,7 +2386,7 @@ void TabPrinter::extruders_count_changed(size_t extruders_count)
void TabPrinter::append_option_line(ConfigOptionsGroupShp optgroup, const std::string opt_key)
{
auto option = optgroup->get_option(opt_key, 0);
- auto line = Line{ _(option.opt.full_label), "" };
+ auto line = Line{ option.opt.full_label, "" };
line.append_option(option);
if (m_use_silent_mode)
line.append_option(optgroup->get_option(opt_key, 1));
@@ -2173,18 +2395,27 @@ void TabPrinter::append_option_line(ConfigOptionsGroupShp optgroup, const std::s
PageShp TabPrinter::build_kinematics_page()
{
- auto page = add_options_page(_(L("Machine limits")), "cog", true);
+ auto page = add_options_page(L("Machine limits"), "cog", true);
- if (m_use_silent_mode) {
+ auto optgroup = page->new_optgroup(L("General"));
+ {
+ optgroup->append_single_option_line("machine_limits_usage");
+ Line line { "", "" };
+ line.full_width = 1;
+ line.widget = [this](wxWindow* parent) {
+ return description_line_widget(parent, &m_machine_limits_description_line);
+ };
+ optgroup->append_line(line);
+ }
+
+ if (m_use_silent_mode) {
// Legend for OptionsGroups
auto optgroup = page->new_optgroup("");
- optgroup->set_show_modified_btns_val(false);
- optgroup->label_width = 23;// 230;
auto line = Line{ "", "" };
ConfigOptionDef def;
def.type = coString;
- def.width = 15;
+ def.width = Field::def_width();
def.gui_type = "legend";
def.mode = comAdvanced;
def.tooltip = L("Values in this column are for Normal mode");
@@ -2202,24 +2433,24 @@ PageShp TabPrinter::build_kinematics_page()
}
std::vector<std::string> axes{ "x", "y", "z", "e" };
- auto optgroup = page->new_optgroup(_(L("Maximum feedrates")));
+ optgroup = page->new_optgroup(L("Maximum feedrates"));
for (const std::string &axis : axes) {
append_option_line(optgroup, "machine_max_feedrate_" + axis);
}
- optgroup = page->new_optgroup(_(L("Maximum accelerations")));
+ optgroup = page->new_optgroup(L("Maximum accelerations"));
for (const std::string &axis : axes) {
append_option_line(optgroup, "machine_max_acceleration_" + axis);
}
append_option_line(optgroup, "machine_max_acceleration_extruding");
append_option_line(optgroup, "machine_max_acceleration_retracting");
- optgroup = page->new_optgroup(_(L("Jerk limits")));
+ optgroup = page->new_optgroup(L("Jerk limits"));
for (const std::string &axis : axes) {
append_option_line(optgroup, "machine_max_jerk_" + axis);
}
- optgroup = page->new_optgroup(_(L("Minimum feedrates")));
+ optgroup = page->new_optgroup(L("Minimum feedrates"));
append_option_line(optgroup, "machine_min_extruding_rate");
append_option_line(optgroup, "machine_min_travel_rate");
@@ -2247,18 +2478,18 @@ void TabPrinter::build_unregular_pages()
/* Workaround for correct layout of controls inside the created page:
* In some _strange_ way we should we should imitate page resizing.
*/
- auto layout_page = [this](PageShp page)
+/* auto layout_page = [this](PageShp page)
{
const wxSize& sz = page->GetSize();
page->SetSize(sz.x + 1, sz.y + 1);
page->SetSize(sz);
- };
+ };*/
#endif //__WXMSW__
// Add/delete Kinematics page according to is_marlin_flavor
size_t existed_page = 0;
for (size_t i = n_before_extruders; i < m_pages.size(); ++i) // first make sure it's not there already
- if (m_pages[i]->title().find(_(L("Machine limits"))) != std::string::npos) {
+ if (m_pages[i]->title().find(L("Machine limits")) != std::string::npos) {
if (!is_marlin_flavor || m_rebuild_kinematics_page)
m_pages.erase(m_pages.begin() + i);
else
@@ -2269,7 +2500,7 @@ void TabPrinter::build_unregular_pages()
if (existed_page < n_before_extruders && is_marlin_flavor) {
auto page = build_kinematics_page();
#ifdef __WXMSW__
- layout_page(page);
+// layout_page(page);
#endif
m_pages.insert(m_pages.begin() + n_before_extruders, page);
}
@@ -2283,7 +2514,7 @@ void TabPrinter::build_unregular_pages()
{
// if we have a single extruder MM setup, add a page with configuration options:
for (size_t i = 0; i < m_pages.size(); ++i) // first make sure it's not there already
- if (m_pages[i]->title().find(_(L("Single extruder MM setup"))) != std::string::npos) {
+ if (m_pages[i]->title().find(L("Single extruder MM setup")) != std::string::npos) {
m_pages.erase(m_pages.begin() + i);
break;
}
@@ -2291,8 +2522,8 @@ void TabPrinter::build_unregular_pages()
}
if (m_extruders_count > 1 && m_config->opt_bool("single_extruder_multi_material") && !m_has_single_extruder_MM_page) {
// create a page, but pretend it's an extruder page, so we can add it to m_pages ourselves
- auto page = add_options_page(_(L("Single extruder MM setup")), "printer", true);
- auto optgroup = page->new_optgroup(_(L("Single extruder multimaterial parameters")));
+ auto page = add_options_page(L("Single extruder MM setup"), "printer", true);
+ auto optgroup = page->new_optgroup(L("Single extruder multimaterial parameters"));
optgroup->append_single_option_line("cooling_tube_retraction");
optgroup->append_single_option_line("cooling_tube_length");
optgroup->append_single_option_line("parking_pos_retraction");
@@ -2305,12 +2536,12 @@ void TabPrinter::build_unregular_pages()
// Build missed extruder pages
for (auto extruder_idx = m_extruders_count_old; extruder_idx < m_extruders_count; ++extruder_idx) {
//# build page
- const wxString& page_name = wxString::Format(_(L("Extruder %d")), int(extruder_idx + 1));
+ const wxString& page_name = wxString::Format("Extruder %d", int(extruder_idx + 1));
auto page = add_options_page(page_name, "funnel", true);
m_pages.insert(m_pages.begin() + n_before_extruders + extruder_idx, page);
- auto optgroup = page->new_optgroup(_(L("Size")));
- optgroup->append_single_option_line("nozzle_diameter", extruder_idx);
+ auto optgroup = page->new_optgroup(L("Size"));
+ optgroup->append_single_option_line("nozzle_diameter", wxEmptyString, extruder_idx);
optgroup->m_on_change = [this, extruder_idx](const t_config_option_key& opt_key, boost::any value)
{
@@ -2347,41 +2578,42 @@ void TabPrinter::build_unregular_pages()
update();
};
- optgroup = page->new_optgroup(_(L("Layer height limits")));
- optgroup->append_single_option_line("min_layer_height", extruder_idx);
- optgroup->append_single_option_line("max_layer_height", extruder_idx);
+ optgroup = page->new_optgroup(L("Layer height limits"));
+ optgroup->append_single_option_line("min_layer_height", wxEmptyString, extruder_idx);
+ optgroup->append_single_option_line("max_layer_height", wxEmptyString, extruder_idx);
- optgroup = page->new_optgroup(_(L("Position (for multi-extruder printers)")));
- optgroup->append_single_option_line("extruder_offset", extruder_idx);
+ optgroup = page->new_optgroup(L("Position (for multi-extruder printers)"));
+ optgroup->append_single_option_line("extruder_offset", wxEmptyString, extruder_idx);
- optgroup = page->new_optgroup(_(L("Retraction")));
- optgroup->append_single_option_line("retract_length", extruder_idx);
- optgroup->append_single_option_line("retract_lift", extruder_idx);
- Line line = { _(L("Only lift Z")), "" };
+ optgroup = page->new_optgroup(L("Retraction"));
+ optgroup->append_single_option_line("retract_length", wxEmptyString, extruder_idx);
+ optgroup->append_single_option_line("retract_lift", wxEmptyString, extruder_idx);
+ Line line = { L("Only lift Z"), "" };
line.append_option(optgroup->get_option("retract_lift_above", extruder_idx));
line.append_option(optgroup->get_option("retract_lift_below", extruder_idx));
optgroup->append_line(line);
- optgroup->append_single_option_line("retract_speed", extruder_idx);
- optgroup->append_single_option_line("deretract_speed", extruder_idx);
- optgroup->append_single_option_line("retract_restart_extra", extruder_idx);
- optgroup->append_single_option_line("retract_before_travel", extruder_idx);
- optgroup->append_single_option_line("retract_layer_change", extruder_idx);
- optgroup->append_single_option_line("wipe", extruder_idx);
- optgroup->append_single_option_line("retract_before_wipe", extruder_idx);
+ optgroup->append_single_option_line("retract_speed", wxEmptyString, extruder_idx);
+ optgroup->append_single_option_line("deretract_speed", wxEmptyString, extruder_idx);
+ optgroup->append_single_option_line("retract_restart_extra", wxEmptyString, extruder_idx);
+ optgroup->append_single_option_line("retract_before_travel", wxEmptyString, extruder_idx);
+ optgroup->append_single_option_line("retract_layer_change", wxEmptyString, extruder_idx);
+ optgroup->append_single_option_line("wipe", wxEmptyString, extruder_idx);
+ optgroup->append_single_option_line("retract_before_wipe", wxEmptyString, extruder_idx);
- optgroup = page->new_optgroup(_(L("Retraction when tool is disabled (advanced settings for multi-extruder setups)")));
- optgroup->append_single_option_line("retract_length_toolchange", extruder_idx);
- optgroup->append_single_option_line("retract_restart_extra_toolchange", extruder_idx);
+ optgroup = page->new_optgroup(L("Retraction when tool is disabled (advanced settings for multi-extruder setups)"));
+ optgroup->append_single_option_line("retract_length_toolchange", wxEmptyString, extruder_idx);
+ optgroup->append_single_option_line("retract_restart_extra_toolchange", wxEmptyString, extruder_idx);
- optgroup = page->new_optgroup(_(L("Preview")));
+ optgroup = page->new_optgroup(L("Preview"));
auto reset_to_filament_color = [this, extruder_idx](wxWindow* parent) {
- add_scaled_button(parent, &m_reset_to_filament_color, "undo",
- _(L("Reset to Filament Color")), wxBU_LEFT | wxBU_EXACTFIT);
+ m_reset_to_filament_color = new ScalableButton(parent, wxID_ANY, "undo", _L("Reset to Filament Color"),
+ wxDefaultSize, wxDefaultPosition, wxBU_LEFT | wxBU_EXACTFIT, true);
ScalableButton* btn = m_reset_to_filament_color;
btn->SetFont(Slic3r::GUI::wxGetApp().normal_font());
+ btn->SetSize(btn->GetBestSize());
auto sizer = new wxBoxSizer(wxHORIZONTAL);
sizer->Add(btn);
@@ -2400,12 +2632,12 @@ void TabPrinter::build_unregular_pages()
return sizer;
};
- line = optgroup->create_single_option_line("extruder_colour", extruder_idx);
+ line = optgroup->create_single_option_line("extruder_colour", wxEmptyString, extruder_idx);
line.append_widget(reset_to_filament_color);
optgroup->append_line(line);
#ifdef __WXMSW__
- layout_page(page);
+// layout_page(page);
#endif
}
@@ -2421,6 +2653,9 @@ void TabPrinter::build_unregular_pages()
// Reload preset pages with current configuration values
reload_config();
+
+ // apply searcher with current configuration
+ apply_searcher();
}
// this gets executed after preset is loaded and before GUI fields are updated
@@ -2429,7 +2664,6 @@ void TabPrinter::on_preset_loaded()
// update the extruders count field
auto *nozzle_diameter = dynamic_cast<const ConfigOptionFloats*>(m_config->option("nozzle_diameter"));
size_t extruders_count = nozzle_diameter->values.size();
- set_value("extruders_count", int(extruders_count));
// update the GUI field according to the number of nozzle diameters supplied
extruders_count_changed(extruders_count);
}
@@ -2441,9 +2675,8 @@ void TabPrinter::update_pages()
if (new_printer_technology == m_printer_technology)
return;
- // hide all old pages
- for (auto& el : m_pages)
- el.get()->Hide();
+ //clear all active pages before switching
+ clear_pages();
// set m_pages to m_pages_(technology before changing)
m_printer_technology == ptFFF ? m_pages.swap(m_pages_fff) : m_pages.swap(m_pages_sla);
@@ -2473,95 +2706,89 @@ void TabPrinter::update_pages()
rebuild_page_tree();
}
-void TabPrinter::update()
+void TabPrinter::reload_config()
{
- m_update_cnt++;
- m_presets->get_edited_preset().printer_technology() == ptFFF ? update_fff() : update_sla();
- m_update_cnt--;
+ Tab::reload_config();
- if (m_update_cnt == 0)
- wxGetApp().mainframe->on_config_changed(m_config);
+ // "extruders_count" doesn't update from the update_config(),
+ // so update it implicitly
+ if (m_active_page && m_active_page->title() == "General")
+ m_active_page->set_value("extruders_count", int(m_extruders_count));
}
-void TabPrinter::update_fff()
+void TabPrinter::activate_selected_page(std::function<void()> throw_if_canceled)
{
-// Freeze();
+ Tab::activate_selected_page(throw_if_canceled);
- bool en;
- auto serial_speed = get_field("serial_speed");
- if (serial_speed != nullptr) {
- en = !m_config->opt_string("serial_port").empty();
- get_field("serial_speed")->toggle(en);
- if (m_config->opt_int("serial_speed") != 0 && en)
- m_serial_test_btn->Enable();
- else
- m_serial_test_btn->Disable();
- }
-
- {
- std::unique_ptr<PrintHost> host(PrintHost::get_print_host(m_config));
- m_print_host_test_btn->Enable(!m_config->opt_string("print_host").empty() && host->can_test());
- m_printhost_browse_btn->Enable(host->has_auto_discovery());
- }
-
- bool have_multiple_extruders = m_extruders_count > 1;
- get_field("toolchange_gcode")->toggle(have_multiple_extruders);
- get_field("single_extruder_multi_material")->toggle(have_multiple_extruders);
+ // "extruders_count" doesn't update from the update_config(),
+ // so update it implicitly
+ if (m_active_page && m_active_page->title() == "General")
+ m_active_page->set_value("extruders_count", int(m_extruders_count));
+}
- bool is_marlin_flavor = m_config->option<ConfigOptionEnum<GCodeFlavor>>("gcode_flavor")->value == gcfMarlin;
+void TabPrinter::clear_pages()
+{
+ Tab::clear_pages();
+ m_reset_to_filament_color = nullptr;
+}
- {
- Field *sm = get_field("silent_mode");
- if (! is_marlin_flavor)
- // Disable silent mode for non-marlin firmwares.
- get_field("silent_mode")->toggle(false);
- if (is_marlin_flavor)
- sm->enable();
- else
- sm->disable();
- }
+void TabPrinter::toggle_options()
+{
+ if (!m_active_page || m_presets->get_edited_preset().printer_technology() == ptSLA)
+ return;
- if (m_use_silent_mode != m_config->opt_bool("silent_mode")) {
- m_rebuild_kinematics_page = true;
- m_use_silent_mode = m_config->opt_bool("silent_mode");
+ bool have_multiple_extruders = m_extruders_count > 1;
+ if (m_active_page->title() == "Custom G-code")
+ toggle_option("toolchange_gcode", have_multiple_extruders);
+ if (m_active_page->title() == "General") {
+ toggle_option("single_extruder_multi_material", have_multiple_extruders);
+
+ bool is_marlin_flavor = m_config->option<ConfigOptionEnum<GCodeFlavor>>("gcode_flavor")->value == gcfMarlin;
+ // Disable silent mode for non-marlin firmwares.
+ toggle_option("silent_mode", is_marlin_flavor);
}
- for (size_t i = 0; i < m_extruders_count; ++i) {
+ wxString extruder_number;
+ long val;
+ if (m_active_page->title().StartsWith("Extruder ", &extruder_number) && extruder_number.ToLong(&val) &&
+ val > 0 && (size_t)val <= m_extruders_count)
+ {
+ size_t i = size_t(val - 1);
bool have_retract_length = m_config->opt_float("retract_length", i) > 0;
// when using firmware retraction, firmware decides retraction length
bool use_firmware_retraction = m_config->opt_bool("use_firmware_retraction");
- get_field("retract_length", i)->toggle(!use_firmware_retraction);
+ toggle_option("retract_length", !use_firmware_retraction, i);
// user can customize travel length if we have retraction length or we"re using
// firmware retraction
- get_field("retract_before_travel", i)->toggle(have_retract_length || use_firmware_retraction);
+ toggle_option("retract_before_travel", have_retract_length || use_firmware_retraction, i);
// user can customize other retraction options if retraction is enabled
bool retraction = (have_retract_length || use_firmware_retraction);
std::vector<std::string> vec = { "retract_lift", "retract_layer_change" };
for (auto el : vec)
- get_field(el, i)->toggle(retraction);
+ toggle_option(el, retraction, i);
// retract lift above / below only applies if using retract lift
vec.resize(0);
vec = { "retract_lift_above", "retract_lift_below" };
for (auto el : vec)
- get_field(el, i)->toggle(retraction && m_config->opt_float("retract_lift", i) > 0);
+ toggle_option(el, retraction && (m_config->opt_float("retract_lift", i) > 0), i);
// some options only apply when not using firmware retraction
vec.resize(0);
vec = { "retract_speed", "deretract_speed", "retract_before_wipe", "retract_restart_extra", "wipe" };
for (auto el : vec)
- get_field(el, i)->toggle(retraction && !use_firmware_retraction);
+ toggle_option(el, retraction && !use_firmware_retraction, i);
bool wipe = m_config->opt_bool("wipe", i);
- get_field("retract_before_wipe", i)->toggle(wipe);
+ toggle_option("retract_before_wipe", wipe, i);
if (use_firmware_retraction && wipe) {
wxMessageDialog dialog(parent(),
_(L("The Wipe option is not available when using the Firmware Retraction mode.\n"
- "\nShall I disable it in order to enable Firmware Retraction?")),
+ "\nShall I disable it in order to enable Firmware Retraction?")),
_(L("Firmware Retraction")), wxICON_WARNING | wxYES | wxNO);
DynamicPrintConfig new_conf = *m_config;
@@ -2577,14 +2804,45 @@ void TabPrinter::update_fff()
load_config(new_conf);
}
- get_field("retract_length_toolchange", i)->toggle(have_multiple_extruders);
+ toggle_option("retract_length_toolchange", have_multiple_extruders, i);
bool toolchange_retraction = m_config->opt_float("retract_length_toolchange", i) > 0;
- get_field("retract_restart_extra_toolchange", i)->toggle
- (have_multiple_extruders && toolchange_retraction);
+ toggle_option("retract_restart_extra_toolchange", have_multiple_extruders && toolchange_retraction, i);
}
-// Thaw();
+ if (m_active_page->title() == "Machine limits" && m_machine_limits_description_line) {
+ assert(m_config->option<ConfigOptionEnum<GCodeFlavor>>("gcode_flavor")->value == gcfMarlin);
+ const auto *machine_limits_usage = m_config->option<ConfigOptionEnum<MachineLimitsUsage>>("machine_limits_usage");
+ bool enabled = machine_limits_usage->value != MachineLimitsUsage::Ignore;
+ bool silent_mode = m_config->opt_bool("silent_mode");
+ int max_field = silent_mode ? 2 : 1;
+ for (const std::string &opt : Preset::machine_limits_options())
+ for (int i = 0; i < max_field; ++ i)
+ toggle_option(opt, enabled, i);
+ update_machine_limits_description(machine_limits_usage->value);
+ }
+}
+
+void TabPrinter::update()
+{
+ m_update_cnt++;
+ m_presets->get_edited_preset().printer_technology() == ptFFF ? update_fff() : update_sla();
+ m_update_cnt--;
+
+ Layout();
+
+ if (m_update_cnt == 0)
+ wxGetApp().mainframe->on_config_changed(m_config);
+}
+
+void TabPrinter::update_fff()
+{
+ if (m_use_silent_mode != m_config->opt_bool("silent_mode")) {
+ m_rebuild_kinematics_page = true;
+ m_use_silent_mode = m_config->opt_bool("silent_mode");
+ }
+
+ toggle_options();
}
void TabPrinter::update_sla()
@@ -2604,7 +2862,7 @@ void Tab::load_current_preset()
{
const Preset& preset = m_presets->get_edited_preset();
- (preset.is_default || preset.is_system) ? m_btn_delete_preset->Disable() : m_btn_delete_preset->Enable(true);
+ update_btns_enabling();
update();
if (m_type == Slic3r::Preset::TYPE_PRINTER) {
@@ -2639,6 +2897,13 @@ void Tab::load_current_preset()
const PrinterTechnology printer_technology = m_presets->get_edited_preset().printer_technology();
if (printer_technology != static_cast<TabPrinter*>(this)->m_printer_technology)
{
+ // The change of the technology requires to remove some of unrelated Tabs
+ // During this action, wxNoteBook::RemovePage invoke wxEVT_NOTEBOOK_PAGE_CHANGED
+ // and as a result a function select_active_page() is called fron Tab::OnActive()
+ // But we don't need it. So, to avoid activation of the page, set m_active_page to NULL
+ // till unusable Tabs will be deleted
+ Page* tmp_page = m_active_page;
+ m_active_page = nullptr;
for (auto tab : wxGetApp().tabs_list) {
if (tab->type() == Preset::TYPE_PRINTER) // Printer tab is shown every time
continue;
@@ -2657,10 +2922,11 @@ void Tab::load_current_preset()
}
}
static_cast<TabPrinter*>(this)->m_printer_technology = printer_technology;
+ m_active_page = tmp_page;
}
on_presets_changed();
if (printer_technology == ptFFF) {
- static_cast<TabPrinter*>(this)->m_initial_extruders_count = static_cast<TabPrinter*>(this)->m_extruders_count;
+ static_cast<TabPrinter*>(this)->m_initial_extruders_count = static_cast<const ConfigOptionFloats*>(m_presets->get_selected_preset().config.option("nozzle_diameter"))->values.size(); //static_cast<TabPrinter*>(this)->m_extruders_count;
const Preset* parent_preset = m_presets->get_selected_preset_parent();
static_cast<TabPrinter*>(this)->m_sys_extruders_count = parent_preset == nullptr ? 0 :
static_cast<const ConfigOptionFloats*>(parent_preset->config.option("nozzle_diameter"))->values.size();
@@ -2690,61 +2956,57 @@ void Tab::rebuild_page_tree()
const auto selected = sel_item ? m_treectrl->GetItemText(sel_item) : "";
const auto rootItem = m_treectrl->GetRootItem();
- auto have_selection = 0;
+ wxTreeItemId item;
+
+ // Delete/Append events invoke wxEVT_TREE_SEL_CHANGED event.
+ // To avoid redundant clear/activate functions call
+ // suppress activate page before page_tree rebuilding
+ m_disable_tree_sel_changed_event = true;
m_treectrl->DeleteChildren(rootItem);
+
for (auto p : m_pages)
{
- auto itemId = m_treectrl->AppendItem(rootItem, p->title(), p->iconID());
+ if (!p->get_show())
+ continue;
+ auto itemId = m_treectrl->AppendItem(rootItem, translate_category(p->title(), m_type), p->iconID());
m_treectrl->SetItemTextColour(itemId, p->get_item_colour());
- if (p->title() == selected) {
- m_treectrl->SelectItem(itemId);
- have_selection = 1;
- }
+ if (translate_category(p->title(), m_type) == selected)
+ item = itemId;
}
-
- if (!have_selection) {
+ if (!item) {
// this is triggered on first load, so we don't disable the sel change event
- auto item = m_treectrl->GetFirstVisibleItem();
- if (item) {
- m_treectrl->SelectItem(item);
- }
+ item = m_treectrl->GetFirstVisibleItem();
}
+
+ // allow activate page before selection of a page_tree item
+ m_disable_tree_sel_changed_event = false;
+ if (item)
+ m_treectrl->SelectItem(item);
}
-void Tab::update_page_tree_visibility()
+void Tab::update_btns_enabling()
{
- const auto sel_item = m_treectrl->GetSelection();
- const auto selected = sel_item ? m_treectrl->GetItemText(sel_item) : "";
- const auto rootItem = m_treectrl->GetRootItem();
-
- auto have_selection = 0;
- m_treectrl->DeleteChildren(rootItem);
- for (auto p : m_pages)
- {
- if (!p->get_show())
- continue;
- auto itemId = m_treectrl->AppendItem(rootItem, p->title(), p->iconID());
- m_treectrl->SetItemTextColour(itemId, p->get_item_colour());
- if (p->title() == selected) {
- m_treectrl->SelectItem(itemId);
- have_selection = 1;
- }
- }
+ // we can delete any preset from the physical printer
+ // and any user preset
+ const Preset& preset = m_presets->get_edited_preset();
+ m_btn_delete_preset->Show(m_type == Preset::TYPE_PRINTER && m_preset_bundle->physical_printers.has_selection() ||
+ !preset.is_default && !preset.is_system);
- if (!have_selection) {
- // this is triggered on first load, so we don't disable the sel change event
- auto item = m_treectrl->GetFirstVisibleItem();
- if (item) {
- m_treectrl->SelectItem(item);
- }
- }
+ if (m_btn_edit_ph_printer)
+ m_btn_edit_ph_printer->SetToolTip( m_preset_bundle->physical_printers.has_selection() ?
+ _L("Edit physical printer") : _L("Add physical printer"));
+}
+void Tab::update_preset_choice()
+{
+ m_presets_choice->update();
+ update_btns_enabling();
}
// Called by the UI combo box when the user switches profiles, and also to delete the current profile.
// Select a preset by a name.If !defined(name), then the default preset is selected.
// If the current profile is modified, user is asked to save the changes.
-void Tab::select_preset(std::string preset_name, bool delete_current)
+void Tab::select_preset(std::string preset_name, bool delete_current /*=false*/, const std::string& last_selected_ph_printer_name/* =""*/)
{
if (preset_name.empty()) {
if (delete_current) {
@@ -2770,7 +3032,7 @@ void Tab::select_preset(std::string preset_name, bool delete_current)
bool canceled = false;
bool technology_changed = false;
m_dependent_tabs.clear();
- if (current_dirty && ! may_discard_current_dirty_preset()) {
+ if (current_dirty && ! may_discard_current_dirty_preset(nullptr, preset_name)) {
canceled = true;
} else if (print_tab) {
// Before switching the print profile to a new one, verify, whether the currently active filament or SLA material
@@ -2852,7 +3114,21 @@ void Tab::select_preset(std::string preset_name, bool delete_current)
}
if (canceled) {
+ if (m_type == Preset::TYPE_PRINTER) {
+ if (!last_selected_ph_printer_name.empty() &&
+ m_presets->get_edited_preset().name == PhysicalPrinter::get_preset_name(last_selected_ph_printer_name)) {
+ // If preset selection was canceled and previously was selected physical printer, we should select it back
+ m_preset_bundle->physical_printers.select_printer(last_selected_ph_printer_name);
+ }
+ if (m_preset_bundle->physical_printers.has_selection()) {
+ // If preset selection was canceled and physical printer was selected
+ // we must disable selection marker for the physical printers
+ m_preset_bundle->physical_printers.unselect_printer();
+ }
+ }
+
update_tab_ui();
+
// Trigger the on_presets_changed event so that we also restore the previous value in the plater selector,
// if this action was initiated from the plater.
on_presets_changed();
@@ -2894,6 +3170,14 @@ void Tab::select_preset(std::string preset_name, bool delete_current)
else if (printer_technology == ptSLA && m_dependent_tabs.front() != Preset::Type::TYPE_SLA_PRINT)
m_dependent_tabs = { Preset::Type::TYPE_SLA_PRINT, Preset::Type::TYPE_SLA_MATERIAL };
}
+
+ // check and apply extruders count for printer preset
+ if (m_type == Preset::TYPE_PRINTER)
+ static_cast<TabPrinter*>(this)->apply_extruder_cnt_from_cache();
+
+ // check if there is something in the cache to move to the new selected preset
+ apply_config_from_cache();
+
load_current_preset();
}
}
@@ -2903,41 +3187,56 @@ void Tab::select_preset(std::string preset_name, bool delete_current)
bool Tab::may_discard_current_dirty_preset(PresetCollection* presets /*= nullptr*/, const std::string& new_printer_name /*= ""*/)
{
if (presets == nullptr) presets = m_presets;
- // Display a dialog showing the dirty options in a human readable form.
- const Preset& old_preset = presets->get_edited_preset();
- std::string type_name = presets->name();
- wxString tab = " ";
- wxString name = old_preset.is_default ?
- from_u8((boost::format(_utf8(L("Default preset (%s)"))) % _utf8(type_name)).str()) :
- from_u8((boost::format(_utf8(L("Preset (%s)"))) % _utf8(type_name)).str()) + "\n" + tab + old_preset.name;
-
- // Collect descriptions of the dirty options.
- wxString changes;
- for (const std::string &opt_key : presets->current_dirty_options()) {
- const ConfigOptionDef &opt = m_config->def()->options.at(opt_key);
- /*std::string*/wxString name = "";
- if (! opt.category.empty())
- name += _(opt.category) + " > ";
- name += !opt.full_label.empty() ?
- _(opt.full_label) :
- _(opt.label);
- changes += tab + /*from_u8*/(name) + "\n";
- }
- // Show a confirmation dialog with the list of dirty options.
- wxString message = name + "\n\n";
- if (new_printer_name.empty())
- message += _(L("has the following unsaved changes:"));
- else {
- message += (m_type == Slic3r::Preset::TYPE_PRINTER) ?
- _(L("is not compatible with printer")) :
- _(L("is not compatible with print profile"));
- message += wxString("\n") + tab + from_u8(new_printer_name) + "\n\n";
- message += _(L("and it has the following unsaved changes:"));
+
+ UnsavedChangesDialog dlg(m_type, presets, new_printer_name);
+ if (wxGetApp().app_config->get("default_action_on_select_preset") == "none" && dlg.ShowModal() == wxID_CANCEL)
+ return false;
+
+ if (dlg.save_preset()) // save selected changes
+ {
+ const std::vector<std::string>& unselected_options = dlg.get_unselected_options(presets->type());
+ const std::string& name = dlg.get_preset_name();
+
+ if (m_type == presets->type()) // save changes for the current preset from this tab
+ {
+ // revert unselected options to the old values
+ presets->get_edited_preset().config.apply_only(presets->get_selected_preset().config, unselected_options);
+ save_preset(name);
+ }
+ else
+ {
+ m_preset_bundle->save_changes_for_preset(name, presets->type(), unselected_options);
+
+ // If filament preset is saved for multi-material printer preset,
+ // there are cases when filament comboboxs are updated for old (non-modified) colors,
+ // but in full_config a filament_colors option aren't.
+ if (presets->type() == Preset::TYPE_FILAMENT && wxGetApp().extruders_edited_cnt() > 1)
+ wxGetApp().plater()->force_filament_colors_update();
+ }
}
- wxMessageDialog confirm(parent(),
- message + "\n" + changes + "\n\n" + _(L("Discard changes and continue anyway?")),
- _(L("Unsaved Changes")), wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION);
- return confirm.ShowModal() == wxID_YES;
+ else if (dlg.transfer_changes()) // move selected changes
+ {
+ std::vector<std::string> selected_options = dlg.get_selected_options();
+ if (m_type == presets->type()) // move changes for the current preset from this tab
+ {
+ if (m_type == Preset::TYPE_PRINTER) {
+ auto it = std::find(selected_options.begin(), selected_options.end(), "extruders_count");
+ if (it != selected_options.end()) {
+ // erase "extruders_count" option from the list
+ selected_options.erase(it);
+ // cache the extruders count
+ static_cast<TabPrinter*>(this)->cache_extruder_cnt();
+ }
+ }
+
+ // copy selected options to the cache from edited preset
+ cache_config_diff(selected_options);
+ }
+ else
+ wxGetApp().get_tab(presets->type())->cache_config_diff(selected_options);
+ }
+
+ return true;
}
// If we are switching from the FFF-preset to the SLA, we should to control the printed objects if they have a part(s).
@@ -2955,14 +3254,48 @@ bool Tab::may_switch_to_SLA_preset()
return true;
}
-void Tab::OnTreeSelChange(wxTreeEvent& event)
+void Tab::clear_pages()
{
- if (m_disable_tree_sel_changed_event)
+ // invalidated highlighter, if any exists
+ m_highlighter.invalidate();
+ m_page_sizer->Clear(true);
+ // clear pages from the controlls
+ for (auto p : m_pages)
+ p->clear();
+
+ // nulling pointers
+ m_parent_preset_description_line = nullptr;
+ m_detach_preset_btn = nullptr;
+
+ m_compatible_printers.checkbox = nullptr;
+ m_compatible_printers.btn = nullptr;
+
+ m_compatible_prints.checkbox = nullptr;
+ m_compatible_prints.btn = nullptr;
+}
+
+void Tab::update_description_lines()
+{
+ if (m_active_page && m_active_page->title() == "Dependencies" && m_parent_preset_description_line)
+ update_preset_description_line();
+}
+
+void Tab::activate_selected_page(std::function<void()> throw_if_canceled)
+{
+ if (!m_active_page)
return;
-// There is a bug related to Ubuntu overlay scrollbars, see https://github.com/prusa3d/PrusaSlicer/issues/898 and https://github.com/prusa3d/PrusaSlicer/issues/952.
-// The issue apparently manifests when Show()ing a window with overlay scrollbars while the UI is frozen. For this reason,
-// we will Thaw the UI prematurely on Linux. This means destroing the no_updates object prematurely.
+ m_active_page->activate(m_mode, throw_if_canceled);
+ update_changed_ui();
+ update_description_lines();
+ toggle_options();
+}
+
+bool Tab::tree_sel_change_delayed()
+{
+ // There is a bug related to Ubuntu overlay scrollbars, see https://github.com/prusa3d/PrusaSlicer/issues/898 and https://github.com/prusa3d/PrusaSlicer/issues/952.
+ // The issue apparently manifests when Show()ing a window with overlay scrollbars while the UI is frozen. For this reason,
+ // we will Thaw the UI prematurely on Linux. This means destroing the no_updates object prematurely.
#ifdef __linux__
std::unique_ptr<wxWindowUpdateLocker> no_updates(new wxWindowUpdateLocker(this));
#else
@@ -2970,44 +3303,60 @@ void Tab::OnTreeSelChange(wxTreeEvent& event)
* so on Window is no needed to call a Freeze/Thaw functions.
* But under OSX (builds compiled with MacOSX10.14.sdk) wxStaticBitmap rendering is broken without Freeze/Thaw call.
*/
-#ifdef __WXOSX__
- wxWindowUpdateLocker noUpdates(this);
-#endif
+//#ifdef __WXOSX__ // Use Freeze/Thaw to avoid flickering during clear/activate new page
+ wxWindowUpdateLocker noUpdates(this);
+//#endif
#endif
- if (m_pages.empty())
- return;
-
Page* page = nullptr;
const auto sel_item = m_treectrl->GetSelection();
const auto selection = sel_item ? m_treectrl->GetItemText(sel_item) : "";
for (auto p : m_pages)
- if (p->title() == selection)
+ if (translate_category(p->title(), m_type) == selection)
{
page = p.get();
m_is_nonsys_values = page->m_is_nonsys_values;
m_is_modified_values = page->m_is_modified_values;
break;
}
- if (page == nullptr) return;
+ if (page == nullptr || m_active_page == page)
+ return false;
- for (auto& el : m_pages)
-// if (el.get()->IsShown()) {
- el.get()->Hide();
-// break;
-// }
+ // clear pages from the controls
+ m_active_page = page;
+
+ auto throw_if_canceled = std::function<void()>([this](){
+#ifdef WIN32
+ wxCheckForInterrupt(m_treectrl);
+ if (m_page_switch_planned)
+ throw UIBuildCanceled();
+#endif // WIN32
+ });
- #ifdef __linux__
- no_updates.reset(nullptr);
- #endif
+ try {
+ clear_pages();
+ throw_if_canceled();
+
+ if (wxGetApp().mainframe!=nullptr && wxGetApp().mainframe->is_active_and_shown_tab(this))
+ activate_selected_page(throw_if_canceled);
+
+ #ifdef __linux__
+ no_updates.reset(nullptr);
+ #endif
+
+ update_undo_buttons();
+ throw_if_canceled();
- update_undo_buttons();
- page->Show();
-// if (! page->layout_valid) {
- page->layout_valid = true;
m_hsizer->Layout();
+ throw_if_canceled();
Refresh();
-// }
+ } catch (const UIBuildCanceled&) {
+ if (m_active_page)
+ m_active_page->clear();
+ return true;
+ }
+
+ return false;
}
void Tab::OnKeyDown(wxKeyEvent& event)
@@ -3022,7 +3371,7 @@ void Tab::OnKeyDown(wxKeyEvent& event)
// This removes the "dirty" flag of the preset, possibly creates a new preset under a new name,
// and activates the new preset.
// Wizard calls save_preset with a name "My Settings", otherwise no name is provided and this method
-// opens a Slic3r::GUI::SavePresetWindow dialog.
+// opens a Slic3r::GUI::SavePresetDialog dialog.
void Tab::save_preset(std::string name /*= ""*/, bool detach)
{
// since buttons(and choices too) don't get focus on Mac, we set focus manually
@@ -3030,59 +3379,11 @@ void Tab::save_preset(std::string name /*= ""*/, bool detach)
// focus currently.is there anything better than this ?
//! m_treectrl->OnSetFocus();
- std::string suffix = detach ? _utf8(L("Detached")) : _CTX_utf8(L_CONTEXT("Copy", "PresetName"), "PresetName");
-
if (name.empty()) {
- const Preset &preset = m_presets->get_selected_preset();
- auto default_name = preset.is_default ? "Untitled" :
-// preset.is_system ? (boost::format(_CTX_utf8(L_CONTEXT("%1% - Copy", "PresetName"), "PresetName")) % preset.name).str() :
- preset.is_system ? (boost::format(("%1% - %2%")) % preset.name % suffix).str() :
- preset.name;
-
- bool have_extention = boost::iends_with(default_name, ".ini");
- if (have_extention) {
- size_t len = default_name.length()-4;
- default_name.resize(len);
- }
- //[map $_->name, grep !$_->default && !$_->external, @{$self->{presets}}],
- std::vector<std::string> values;
- for (size_t i = 0; i < m_presets->size(); ++i) {
- const Preset &preset = m_presets->preset(i);
- if (preset.is_default || preset.is_system || preset.is_external)
- continue;
- values.push_back(preset.name);
- }
-
- SavePresetWindow dlg(parent());
- dlg.build(title(), default_name, values);
+ SavePresetDialog dlg(m_parent, m_type, detach ? _u8L("Detached") : "");
if (dlg.ShowModal() != wxID_OK)
return;
name = dlg.get_name();
- if (name == "") {
- show_error(this, _(L("The supplied name is empty. It can't be saved.")));
- return;
- }
- const Preset *existing = m_presets->find_preset(name, false);
- if (existing && (existing->is_default || existing->is_system)) {
- show_error(this, _(L("Cannot overwrite a system profile.")));
- return;
- }
- if (existing && (existing->is_external)) {
- show_error(this, _(L("Cannot overwrite an external profile.")));
- return;
- }
- if (existing && name != preset.name)
- {
- wxString msg_text = GUI::from_u8((boost::format(_utf8(L("Preset with name \"%1%\" already exists."))) % name).str());
- msg_text += "\n" + _(L("Replace?"));
- wxMessageDialog dialog(nullptr, msg_text, _(L("Warning")), wxICON_WARNING | wxYES | wxNO);
-
- if (dialog.ShowModal() == wxID_NO)
- return;
-
- // Remove the preset from the list.
- m_presets->delete_preset(name);
- }
}
// Save the preset into Slic3r::data_dir / presets / section_name / preset_name.ini
@@ -3095,7 +3396,7 @@ void Tab::save_preset(std::string name /*= ""*/, bool detach)
// Update the selection boxes at the plater.
on_presets_changed();
// If current profile is saved, "delete preset" button have to be enabled
- m_btn_delete_preset->Enable(true);
+ m_btn_delete_preset->Show();
if (m_type == Preset::TYPE_PRINTER)
static_cast<TabPrinter*>(this)->m_initial_extruders_count = static_cast<TabPrinter*>(this)->m_extruders_count;
@@ -3113,28 +3414,28 @@ void Tab::save_preset(std::string name /*= ""*/, bool detach)
wxGetApp().plater()->force_filament_colors_update();
{
- // Profile compatiblity is updated first when the profile is saved.
- // Update profile selection combo boxes at the depending tabs to reflect modifications in profile compatibility.
- std::vector<Preset::Type> dependent;
- switch (m_type) {
- case Preset::TYPE_PRINT:
- dependent = { Preset::TYPE_FILAMENT };
- break;
- case Preset::TYPE_SLA_PRINT:
- dependent = { Preset::TYPE_SLA_MATERIAL };
- break;
- case Preset::TYPE_PRINTER:
+ // Profile compatiblity is updated first when the profile is saved.
+ // Update profile selection combo boxes at the depending tabs to reflect modifications in profile compatibility.
+ std::vector<Preset::Type> dependent;
+ switch (m_type) {
+ case Preset::TYPE_PRINT:
+ dependent = { Preset::TYPE_FILAMENT };
+ break;
+ case Preset::TYPE_SLA_PRINT:
+ dependent = { Preset::TYPE_SLA_MATERIAL };
+ break;
+ case Preset::TYPE_PRINTER:
if (static_cast<const TabPrinter*>(this)->m_printer_technology == ptFFF)
dependent = { Preset::TYPE_PRINT, Preset::TYPE_FILAMENT };
else
dependent = { Preset::TYPE_SLA_PRINT, Preset::TYPE_SLA_MATERIAL };
- break;
+ break;
default:
- break;
- }
- for (Preset::Type preset_type : dependent)
- wxGetApp().get_tab(preset_type)->update_tab_ui();
- }
+ break;
+ }
+ for (Preset::Type preset_type : dependent)
+ wxGetApp().get_tab(preset_type)->update_tab_ui();
+ }
}
// Called for a currently selected preset.
@@ -3144,13 +3445,73 @@ void Tab::delete_preset()
// Don't let the user delete the ' - default - ' configuration.
std::string action = current_preset.is_external ? _utf8(L("remove")) : _utf8(L("delete"));
// TRN remove/delete
- const wxString msg = from_u8((boost::format(_utf8(L("Are you sure you want to %1% the selected preset?"))) % action).str());
+
+ PhysicalPrinterCollection& physical_printers = m_preset_bundle->physical_printers;
+ wxString msg;
+ if (m_presets_choice->is_selected_physical_printer())
+ {
+ PhysicalPrinter& printer = physical_printers.get_selected_printer();
+ if (printer.preset_names.size() == 1) {
+ if (m_presets_choice->del_physical_printer(_L("It's a last preset for this physical printer.")))
+ Layout();
+ return;
+ }
+
+ msg = format_wxstr(_L("Are you sure you want to delete \"%1%\" preset from the physical printer \"%2%\"?"), current_preset.name, printer.name);
+ }
+ else
+ {
+ if (m_type == Preset::TYPE_PRINTER && !physical_printers.empty())
+ {
+ // Check preset for delete in physical printers
+ // Ask a customer about next action, if there is a printer with just one preset and this preset is equal to delete
+ std::vector<std::string> ph_printers = physical_printers.get_printers_with_preset(current_preset.name);
+ std::vector<std::string> ph_printers_only = physical_printers.get_printers_with_only_preset(current_preset.name);
+
+ if (!ph_printers.empty()) {
+ msg += _L("The physical printer(s) below is based on the preset, you are going to delete.");
+ for (const std::string& printer : ph_printers)
+ msg += "\n \"" + from_u8(printer) + "\",";
+ msg.RemoveLast();
+ msg += "\n" + _L("Note, that selected preset will be deleted from this/those printer(s) too.")+ "\n\n";
+ }
+
+ if (!ph_printers_only.empty()) {
+ msg += _L("The physical printer(s) below is based only on the preset, you are going to delete.");
+ for (const std::string& printer : ph_printers_only)
+ msg += "\n \"" + from_u8(printer) + "\",";
+ msg.RemoveLast();
+ msg += "\n" + _L("Note, that this/those printer(s) will be deleted after deleting of the selected preset.") + "\n\n";
+ }
+ }
+
+ msg += from_u8((boost::format(_u8L("Are you sure you want to %1% the selected preset?")) % action).str());
+ }
+
action = current_preset.is_external ? _utf8(L("Remove")) : _utf8(L("Delete"));
// TRN Remove/Delete
wxString title = from_u8((boost::format(_utf8(L("%1% Preset"))) % action).str()); //action + _(L(" Preset"));
if (current_preset.is_default ||
wxID_YES != wxMessageDialog(parent(), msg, title, wxYES_NO | wxNO_DEFAULT | wxICON_QUESTION).ShowModal())
return;
+
+ // if we just delete preset from the physical printer
+ if (m_presets_choice->is_selected_physical_printer()) {
+ PhysicalPrinter& printer = physical_printers.get_selected_printer();
+
+ // just delete this preset from the current physical printer
+ printer.delete_preset(m_presets->get_edited_preset().name);
+ // select first from the possible presets for this printer
+ physical_printers.select_printer(printer);
+
+ this->select_preset(physical_printers.get_selected_printer_preset_name());
+ return;
+ }
+
+ // delete selected preset from printers and printer, if it's needed
+ if (m_type == Preset::TYPE_PRINTER && !physical_printers.empty())
+ physical_printers.delete_preset_from_printers(current_preset.name);
+
// Select will handle of the preset dependencies, of saving & closing the depending profiles, and
// finally of deleting the preset.
this->select_preset("", true);
@@ -3159,6 +3520,7 @@ void Tab::delete_preset()
void Tab::toggle_show_hide_incompatible()
{
m_show_incompatible_presets = !m_show_incompatible_presets;
+ m_presets_choice->set_show_incompatible_presets(m_show_incompatible_presets);
update_show_hide_incompatible_button();
update_tab_ui();
}
@@ -3192,13 +3554,16 @@ void Tab::update_ui_from_settings()
}
}
-void Tab::create_line_with_widget(ConfigOptionsGroup* optgroup, const std::string& opt_key, widget_t widget)
+void Tab::create_line_with_widget(ConfigOptionsGroup* optgroup, const std::string& opt_key, const wxString& path, widget_t widget)
{
Line line = optgroup->create_single_option_line(opt_key);
line.widget = widget;
+ line.label_path = path;
- m_colored_Labels[opt_key] = nullptr;
- optgroup->append_line(line, &m_colored_Labels[opt_key]);
+ m_colored_Label_colors[opt_key] = m_default_text_clr;
+ line.full_Label_color = &m_colored_Label_colors[opt_key];
+
+ optgroup->append_line(line);
}
// Return a callback to create a Tab widget to mark the preferences as compatible / incompatible to the current printer.
@@ -3206,8 +3571,10 @@ wxSizer* Tab::compatible_widget_create(wxWindow* parent, PresetDependencies &dep
{
deps.checkbox = new wxCheckBox(parent, wxID_ANY, _(L("All")));
deps.checkbox->SetFont(Slic3r::GUI::wxGetApp().normal_font());
- add_scaled_button(parent, &deps.btn, "printer_white", from_u8((boost::format(" %s %s") % _utf8(L("Set")) % std::string(dots.ToUTF8())).str()), wxBU_LEFT | wxBU_EXACTFIT);
+ deps.btn = new ScalableButton(parent, wxID_ANY, "printer", from_u8((boost::format(" %s %s") % _utf8(L("Set")) % std::string(dots.ToUTF8())).str()),
+ wxDefaultSize, wxDefaultPosition, wxBU_LEFT | wxBU_EXACTFIT, true);
deps.btn->SetFont(Slic3r::GUI::wxGetApp().normal_font());
+ deps.btn->SetSize(deps.btn->GetBestSize());
auto sizer = new wxBoxSizer(wxHORIZONTAL);
sizer->Add((deps.checkbox), 0, wxALIGN_CENTER_VERTICAL);
@@ -3269,18 +3636,20 @@ wxSizer* Tab::compatible_widget_create(wxWindow* parent, PresetDependencies &dep
this->update_changed_ui();
}
}));
+
return sizer;
}
// Return a callback to create a TabPrinter widget to edit bed shape
wxSizer* TabPrinter::create_bed_shape_widget(wxWindow* parent)
{
- ScalableButton* btn;
- add_scaled_button(parent, &btn, "printer_white", " " + _(L("Set")) + " " + dots, wxBU_LEFT | wxBU_EXACTFIT);
+ ScalableButton* btn = new ScalableButton(parent, wxID_ANY, "printer", " " + _(L("Set")) + " " + dots,
+ wxDefaultSize, wxDefaultPosition, wxBU_LEFT | wxBU_EXACTFIT, true);
btn->SetFont(wxGetApp().normal_font());
+ btn->SetSize(btn->GetBestSize());
auto sizer = new wxBoxSizer(wxHORIZONTAL);
- sizer->Add(btn);
+ sizer->Add(btn, 0, wxALIGN_CENTER_VERTICAL);
btn->Bind(wxEVT_BUTTON, ([this](wxCommandEvent e)
{
@@ -3302,15 +3671,67 @@ wxSizer* TabPrinter::create_bed_shape_widget(wxWindow* parent)
}
}));
+ // may be it is not a best place, but
+ // add information about Category/Grope for "bed_custom_texture" and "bed_custom_model" as a copy from "bed_shape" option
+ {
+ Search::OptionsSearcher& searcher = wxGetApp().sidebar().get_searcher();
+ const Search::GroupAndCategory& gc = searcher.get_group_and_category("bed_shape");
+ searcher.add_key("bed_custom_texture", gc.group, gc.category);
+ searcher.add_key("bed_custom_model", gc.group, gc.category);
+ }
+
return sizer;
}
+void TabPrinter::cache_extruder_cnt()
+{
+ if (m_presets->get_edited_preset().printer_technology() == ptSLA)
+ return;
+
+ m_cache_extruder_count = m_extruders_count;
+}
+
+void TabPrinter::apply_extruder_cnt_from_cache()
+{
+ if (m_presets->get_edited_preset().printer_technology() == ptSLA)
+ return;
+
+ if (m_cache_extruder_count > 0) {
+ m_presets->get_edited_preset().set_num_extruders(m_cache_extruder_count);
+ m_cache_extruder_count = 0;
+ }
+}
+
+void TabPrinter::update_machine_limits_description(const MachineLimitsUsage usage)
+{
+ wxString text;
+ switch (usage) {
+ case MachineLimitsUsage::EmitToGCode:
+ text = _L("Machine limits will be emitted to G-code and used to estimate print time.");
+ break;
+ case MachineLimitsUsage::TimeEstimateOnly:
+ text = _L("Machine limits will NOT be emitted to G-code, however they will be used to estimate print time, "
+ "which may therefore not be accurate as the printer may apply a different set of machine limits.");
+ break;
+ case MachineLimitsUsage::Ignore:
+ text = _L("Machine limits are not set, therefore the print time estimate may not be accurate.");
+ break;
+ default: assert(false);
+ }
+ m_machine_limits_description_line->SetText(text);
+}
+
void Tab::compatible_widget_reload(PresetDependencies &deps)
{
+ Field* field = this->get_field(deps.key_condition);
+ if (!field)
+ return;
+
bool has_any = ! m_config->option<ConfigOptionStrings>(deps.key_list)->values.empty();
has_any ? deps.btn->Enable() : deps.btn->Disable();
deps.checkbox->SetValue(! has_any);
- this->get_field(deps.key_condition)->toggle(! has_any);
+
+ field->toggle(! has_any);
}
void Tab::fill_icon_descriptions()
@@ -3371,27 +3792,70 @@ void Tab::set_tooltips_text()
"Click to reset current value to the last saved preset."));
}
+Page::Page(wxWindow* parent, const wxString& title, int iconID) :
+ m_parent(parent),
+ m_title(title),
+ m_iconID(iconID)
+{
+ m_vsizer = (wxBoxSizer*)parent->GetSizer();
+ m_item_color = &wxGetApp().get_label_clr_default();
+}
+
void Page::reload_config()
{
for (auto group : m_optgroups)
group->reload_config();
}
-void Page::update_visibility(ConfigOptionMode mode)
+void Page::update_visibility(ConfigOptionMode mode, bool update_contolls_visibility)
{
bool ret_val = false;
- for (auto group : m_optgroups)
- ret_val = group->update_visibility(mode) || ret_val;
+ for (auto group : m_optgroups) {
+ ret_val = (update_contolls_visibility ?
+ group->update_visibility(mode) : // update visibility for all controlls in group
+ group->is_visible(mode) // just detect visibility for the group
+ ) || ret_val;
+ }
m_show = ret_val;
}
+void Page::activate(ConfigOptionMode mode, std::function<void()> throw_if_canceled)
+{
+ for (auto group : m_optgroups) {
+ if (!group->activate(throw_if_canceled))
+ continue;
+ m_vsizer->Add(group->sizer, 0, wxEXPAND | (group->is_legend_line() ? (wxLEFT|wxTOP) : wxALL), 10);
+ group->update_visibility(mode);
+ group->reload_config();
+ throw_if_canceled();
+ }
+}
+
+void Page::clear()
+{
+ for (auto group : m_optgroups)
+ group->clear();
+}
+
void Page::msw_rescale()
{
for (auto group : m_optgroups)
group->msw_rescale();
}
+void Page::sys_color_changed()
+{
+ for (auto group : m_optgroups)
+ group->sys_color_changed();
+}
+
+void Page::refresh()
+{
+ for (auto group : m_optgroups)
+ group->refresh();
+}
+
Field* Page::get_field(const t_config_option_key& opt_key, int opt_index /*= -1*/) const
{
Field* field = nullptr;
@@ -3407,7 +3871,7 @@ bool Page::set_value(const t_config_option_key& opt_key, const boost::any& value
bool changed = false;
for(auto optgroup: m_optgroups) {
if (optgroup->set_value(opt_key, value))
- changed = 1 ;
+ changed = true ;
}
return changed;
}
@@ -3415,29 +3879,16 @@ bool Page::set_value(const t_config_option_key& opt_key, const boost::any& value
// package Slic3r::GUI::Tab::Page;
ConfigOptionsGroupShp Page::new_optgroup(const wxString& title, int noncommon_label_width /*= -1*/)
{
- auto extra_column = [this](wxWindow* parent, const Line& line)
- {
- std::string bmp_name;
- const std::vector<Option>& options = line.get_options();
- int mode_id = int(options[0].opt.mode);
- const wxBitmap& bitmap = options.size() == 0 || options[0].opt.gui_type == "legend" ? wxNullBitmap :
- m_mode_bitmap_cache[mode_id].bmp();
- auto bmp = new wxStaticBitmap(parent, wxID_ANY, bitmap);
- bmp->SetClientData((void*)&m_mode_bitmap_cache[mode_id]);
-
- bmp->SetBackgroundStyle(wxBG_STYLE_PAINT);
- return bmp;
- };
-
//! config_ have to be "right"
- ConfigOptionsGroupShp optgroup = std::make_shared<ConfigOptionsGroup>(this, title, m_config, true, extra_column);
+ ConfigOptionsGroupShp optgroup = std::make_shared<ConfigOptionsGroup>(m_parent, title, m_config, true);
+ optgroup->set_config_category(m_title.ToStdString());
if (noncommon_label_width >= 0)
optgroup->label_width = noncommon_label_width;
#ifdef __WXOSX__
- auto tab = GetParent()->GetParent();
+ auto tab = parent()->GetParent()->GetParent();// GetParent()->GetParent();
#else
- auto tab = GetParent();
+ auto tab = parent()->GetParent();// GetParent();
#endif
optgroup->m_on_change = [this, tab](t_config_option_key opt_key, boost::any value) {
//! This function will be called from OptionGroup.
@@ -3471,79 +3922,19 @@ ConfigOptionsGroupShp Page::new_optgroup(const wxString& title, int noncommon_la
ctrl->SetBitmap(reinterpret_cast<ScalableBitmap*>(ctrl->GetClientData())->bmp());
};
- vsizer()->Add(optgroup->sizer, 0, wxEXPAND | wxALL, 10);
m_optgroups.push_back(optgroup);
return optgroup;
}
-void SavePresetWindow::build(const wxString& title, const std::string& default_name, std::vector<std::string> &values)
-{
- // TRN Preset
- auto text = new wxStaticText(this, wxID_ANY, from_u8((boost::format(_utf8(L("Save %s as:"))) % into_u8(title)).str()),
- wxDefaultPosition, wxDefaultSize);
- m_combo = new wxComboBox(this, wxID_ANY, from_u8(default_name),
- wxDefaultPosition, wxDefaultSize, 0, 0, wxTE_PROCESS_ENTER);
- for (auto value : values)
- m_combo->Append(from_u8(value));
- auto buttons = CreateStdDialogButtonSizer(wxOK | wxCANCEL);
-
- auto sizer = new wxBoxSizer(wxVERTICAL);
- sizer->Add(text, 0, wxEXPAND | wxALL, 10);
- sizer->Add(m_combo, 0, wxEXPAND | wxLEFT | wxRIGHT, 10);
- sizer->Add(buttons, 0, wxALIGN_CENTER_HORIZONTAL | wxALL, 10);
-
- wxButton* btn = static_cast<wxButton*>(FindWindowById(wxID_OK, this));
- btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent&) { accept(); });
- m_combo->Bind(wxEVT_TEXT_ENTER, [this](wxCommandEvent&) { accept(); });
-
- SetSizer(sizer);
- sizer->SetSizeHints(this);
-}
-
-void SavePresetWindow::accept()
-{
- m_chosen_name = normalize_utf8_nfc(m_combo->GetValue().ToUTF8());
- if (!m_chosen_name.empty()) {
- const char* unusable_symbols = "<>[]:/\\|?*\"";
- bool is_unusable_symbol = false;
- bool is_unusable_suffix = false;
- const std::string unusable_suffix = PresetCollection::get_suffix_modified();//"(modified)";
- for (size_t i = 0; i < std::strlen(unusable_symbols); i++) {
- if (m_chosen_name.find_first_of(unusable_symbols[i]) != std::string::npos) {
- is_unusable_symbol = true;
- break;
- }
- }
- if (m_chosen_name.find(unusable_suffix) != std::string::npos)
- is_unusable_suffix = true;
-
- if (is_unusable_symbol) {
- show_error(this,_(L("The supplied name is not valid;")) + "\n" +
- _(L("the following characters are not allowed:")) + " " + unusable_symbols);
- }
- else if (is_unusable_suffix) {
- show_error(this,_(L("The supplied name is not valid;")) + "\n" +
- _(L("the following suffix is not allowed:")) + "\n\t" +
- wxString::FromUTF8(unusable_suffix.c_str()));
- }
- else if (m_chosen_name == "- default -") {
- show_error(this, _(L("The supplied name is not available.")));
- }
- else {
- EndModal(wxID_OK);
- }
- }
-}
-
void TabSLAMaterial::build()
{
m_presets = &m_preset_bundle->sla_materials;
load_initial_data();
- auto page = add_options_page(_(L("Material")), "resin");
+ auto page = add_options_page(L("Material"), "resin");
- auto optgroup = page->new_optgroup(_(L("Material")));
+ auto optgroup = page->new_optgroup(L("Material"));
optgroup->append_single_option_line("bottle_cost");
optgroup->append_single_option_line("bottle_volume");
optgroup->append_single_option_line("bottle_weight");
@@ -3575,19 +3966,19 @@ void TabSLAMaterial::build()
wxGetApp().sidebar().Layout();
};
- optgroup = page->new_optgroup(_(L("Layers")));
+ optgroup = page->new_optgroup(L("Layers"));
optgroup->append_single_option_line("initial_layer_height");
- optgroup = page->new_optgroup(_(L("Exposure")));
+ optgroup = page->new_optgroup(L("Exposure"));
optgroup->append_single_option_line("exposure_time");
optgroup->append_single_option_line("initial_exposure_time");
- optgroup = page->new_optgroup(_(L("Corrections")));
+ optgroup = page->new_optgroup(L("Corrections"));
std::vector<std::string> corrections = {"material_correction"};
// std::vector<std::string> axes{ "X", "Y", "Z" };
std::vector<std::string> axes{ "XY", "Z" };
for (auto& opt_key : corrections) {
- auto line = Line{ _(m_config->def()->get(opt_key)->full_label), "" };
+ auto line = Line{ m_config->def()->get(opt_key)->full_label, "" };
int id = 0;
for (auto& axis : axes) {
auto opt = optgroup->get_option(opt_key, id);
@@ -3598,18 +3989,18 @@ void TabSLAMaterial::build()
optgroup->append_line(line);
}
- page = add_options_page(_(L("Notes")), "note.png");
- optgroup = page->new_optgroup(_(L("Notes")), 0);
+ page = add_options_page(L("Notes"), "note.png");
+ optgroup = page->new_optgroup(L("Notes"), 0);
optgroup->label_width = 0;
Option option = optgroup->get_option("material_notes");
option.opt.full_width = true;
option.opt.height = 25;//250;
optgroup->append_single_option_line(option);
- page = add_options_page(_(L("Dependencies")), "wrench.png");
- optgroup = page->new_optgroup(_(L("Profile dependencies")));
+ page = add_options_page(L("Dependencies"), "wrench.png");
+ optgroup = page->new_optgroup(L("Profile dependencies"));
- create_line_with_widget(optgroup.get(), "compatible_printers", [this](wxWindow* parent) {
+ create_line_with_widget(optgroup.get(), "compatible_printers", wxEmptyString, [this](wxWindow* parent) {
return compatible_widget_create(parent, m_compatible_printers);
});
@@ -3617,7 +4008,7 @@ void TabSLAMaterial::build()
option.opt.full_width = true;
optgroup->append_single_option_line(option);
- create_line_with_widget(optgroup.get(), "compatible_prints", [this](wxWindow* parent) {
+ create_line_with_widget(optgroup.get(), "compatible_prints", wxEmptyString, [this](wxWindow* parent) {
return compatible_widget_create(parent, m_compatible_prints);
});
@@ -3655,23 +4046,24 @@ void TabSLAPrint::build()
m_presets = &m_preset_bundle->sla_prints;
load_initial_data();
- auto page = add_options_page(_(L("Layers and perimeters")), "layers");
+ auto page = add_options_page(L("Layers and perimeters"), "layers");
- auto optgroup = page->new_optgroup(_(L("Layers")));
+ auto optgroup = page->new_optgroup(L("Layers"));
optgroup->append_single_option_line("layer_height");
optgroup->append_single_option_line("faded_layers");
- page = add_options_page(_(L("Supports")), "support"/*"sla_supports"*/);
- optgroup = page->new_optgroup(_(L("Supports")));
+ page = add_options_page(L("Supports"), "support"/*"sla_supports"*/);
+ optgroup = page->new_optgroup(L("Supports"));
optgroup->append_single_option_line("supports_enable");
- optgroup = page->new_optgroup(_(L("Support head")));
+ optgroup = page->new_optgroup(L("Support head"));
optgroup->append_single_option_line("support_head_front_diameter");
optgroup->append_single_option_line("support_head_penetration");
optgroup->append_single_option_line("support_head_width");
- optgroup = page->new_optgroup(_(L("Support pillar")));
+ optgroup = page->new_optgroup(L("Support pillar"));
optgroup->append_single_option_line("support_pillar_diameter");
+ optgroup->append_single_option_line("support_small_pillar_diameter_percent");
optgroup->append_single_option_line("support_max_bridges_on_pillar");
optgroup->append_single_option_line("support_pillar_connection_mode");
@@ -3683,20 +4075,26 @@ void TabSLAPrint::build()
optgroup->append_single_option_line("support_base_safety_distance");
// Mirrored parameter from Pad page for toggling elevation on the same page
- optgroup->append_single_option_line("pad_around_object");
optgroup->append_single_option_line("support_object_elevation");
- optgroup = page->new_optgroup(_(L("Connection of the support sticks and junctions")));
+ Line line{ "", "" };
+ line.full_width = 1;
+ line.widget = [this](wxWindow* parent) {
+ return description_line_widget(parent, &m_support_object_elevation_description_line);
+ };
+ optgroup->append_line(line);
+
+ optgroup = page->new_optgroup(L("Connection of the support sticks and junctions"));
optgroup->append_single_option_line("support_critical_angle");
optgroup->append_single_option_line("support_max_bridge_length");
optgroup->append_single_option_line("support_max_pillar_link_distance");
- optgroup = page->new_optgroup(_(L("Automatic generation")));
+ optgroup = page->new_optgroup(L("Automatic generation"));
optgroup->append_single_option_line("support_points_density_relative");
optgroup->append_single_option_line("support_points_minimal_distance");
- page = add_options_page(_(L("Pad")), "pad");
- optgroup = page->new_optgroup(_(L("Pad")));
+ page = add_options_page(L("Pad"), "pad");
+ optgroup = page->new_optgroup(L("Pad"));
optgroup->append_single_option_line("pad_enable");
optgroup->append_single_option_line("pad_wall_thickness");
optgroup->append_single_option_line("pad_wall_height");
@@ -3713,27 +4111,27 @@ void TabSLAPrint::build()
optgroup->append_single_option_line("pad_object_connector_width");
optgroup->append_single_option_line("pad_object_connector_penetration");
- page = add_options_page(_(L("Hollowing")), "hollowing");
- optgroup = page->new_optgroup(_(L("Hollowing")));
+ page = add_options_page(L("Hollowing"), "hollowing");
+ optgroup = page->new_optgroup(L("Hollowing"));
optgroup->append_single_option_line("hollowing_enable");
optgroup->append_single_option_line("hollowing_min_thickness");
optgroup->append_single_option_line("hollowing_quality");
optgroup->append_single_option_line("hollowing_closing_distance");
- page = add_options_page(_(L("Advanced")), "wrench");
- optgroup = page->new_optgroup(_(L("Slicing")));
+ page = add_options_page(L("Advanced"), "wrench");
+ optgroup = page->new_optgroup(L("Slicing"));
optgroup->append_single_option_line("slice_closing_radius");
- page = add_options_page(_(L("Output options")), "output+page_white");
- optgroup = page->new_optgroup(_(L("Output file")));
+ page = add_options_page(L("Output options"), "output+page_white");
+ optgroup = page->new_optgroup(L("Output file"));
Option option = optgroup->get_option("output_filename_format");
option.opt.full_width = true;
optgroup->append_single_option_line(option);
- page = add_options_page(_(L("Dependencies")), "wrench");
- optgroup = page->new_optgroup(_(L("Profile dependencies")));
+ page = add_options_page(L("Dependencies"), "wrench");
+ optgroup = page->new_optgroup(L("Profile dependencies"));
- create_line_with_widget(optgroup.get(), "compatible_printers", [this](wxWindow* parent) {
+ create_line_with_widget(optgroup.get(), "compatible_printers", wxEmptyString, [this](wxWindow* parent) {
return compatible_widget_create(parent, m_compatible_printers);
});
@@ -3751,6 +4149,34 @@ void TabSLAPrint::reload_config()
Tab::reload_config();
}
+void TabSLAPrint::update_description_lines()
+{
+ Tab::update_description_lines();
+
+ if (m_active_page && m_active_page->title() == "Supports")
+ {
+ bool is_visible = m_config->def()->get("support_object_elevation")->mode <= m_mode;
+ if (m_support_object_elevation_description_line)
+ {
+ m_support_object_elevation_description_line->Show(is_visible);
+ if (is_visible)
+ {
+ bool elev = !m_config->opt_bool("pad_enable") || !m_config->opt_bool("pad_around_object");
+ m_support_object_elevation_description_line->SetText(elev ? "" :
+ from_u8((boost::format(_u8L("\"%1%\" is disabled because \"%2%\" is on in \"%3%\" category.\n"
+ "To enable \"%1%\", please switch off \"%2%\""))
+ % _L("Object elevation") % _L("Pad around object") % _L("Pad")).str()));
+ }
+ }
+ }
+}
+
+void TabSLAPrint::toggle_options()
+{
+ if (m_active_page)
+ m_config_manipulation.toggle_print_sla_options(m_config);
+}
+
void TabSLAPrint::update()
{
if (m_preset_bundle->printers.get_selected_preset().printer_technology() == ptFFF)
@@ -3759,10 +4185,14 @@ void TabSLAPrint::update()
m_update_cnt++;
m_config_manipulation.update_print_sla_config(m_config, true);
+
+ update_description_lines();
+ Layout();
+
m_update_cnt--;
if (m_update_cnt == 0) {
- m_config_manipulation.toggle_print_sla_options(m_config);
+ toggle_options();
// update() could be called during undo/redo execution
// Update of objectList can cause a crash in this case (because m_objects doesn't match ObjectList)
@@ -3773,6 +4203,13 @@ void TabSLAPrint::update()
}
}
+void TabSLAPrint::clear_pages()
+{
+ Tab::clear_pages();
+
+ m_support_object_elevation_description_line = nullptr;
+}
+
ConfigManipulation Tab::get_config_manipulation()
{
auto load_config = [this]()
@@ -3783,15 +4220,15 @@ ConfigManipulation Tab::get_config_manipulation()
update();
};
- auto get_field_ = [this](const t_config_option_key& opt_key, int opt_index) {
- return get_field(opt_key, opt_index);
+ auto cb_toggle_field = [this](const t_config_option_key& opt_key, bool toggle, int opt_index) {
+ return toggle_option(opt_key, toggle, opt_index);
};
auto cb_value_change = [this](const std::string& opt_key, const boost::any& value) {
return on_value_change(opt_key, value);
};
- return ConfigManipulation(load_config, get_field_, cb_value_change);
+ return ConfigManipulation(load_config, cb_toggle_field, cb_value_change);
}
diff --git a/src/slic3r/GUI/Tab.hpp b/src/slic3r/GUI/Tab.hpp
index e2b00dc40..927787933 100644
--- a/src/slic3r/GUI/Tab.hpp
+++ b/src/slic3r/GUI/Tab.hpp
@@ -33,15 +33,19 @@
#include "Event.hpp"
#include "wxExtensions.hpp"
#include "ConfigManipulation.hpp"
+#include "OptionsGroup.hpp"
+#include "libslic3r/Preset.hpp"
namespace Slic3r {
namespace GUI {
+class TabPresetComboBox;
+class OG_CustomCtrl;
// Single Tab page containing a{ vsizer } of{ optgroups }
// package Slic3r::GUI::Tab::Page;
using ConfigOptionsGroupShp = std::shared_ptr<ConfigOptionsGroup>;
-class Page : public wxScrolledWindow
+class Page// : public wxScrolledWindow
{
wxWindow* m_parent;
wxString m_title;
@@ -49,26 +53,12 @@ class Page : public wxScrolledWindow
wxBoxSizer* m_vsizer;
bool m_show = true;
public:
- Page(wxWindow* parent, const wxString title, const int iconID, const std::vector<ScalableBitmap>& mode_bmp_cache) :
- m_parent(parent),
- m_title(title),
- m_iconID(iconID),
- m_mode_bitmap_cache(mode_bmp_cache)
- {
- Create(m_parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
- m_vsizer = new wxBoxSizer(wxVERTICAL);
- m_item_color = &wxGetApp().get_label_clr_default();
- SetSizer(m_vsizer);
- }
+ Page(wxWindow* parent, const wxString& title, int iconID);
~Page() {}
bool m_is_modified_values{ false };
bool m_is_nonsys_values{ true };
- // Delayed layout after resizing the main window.
- bool layout_valid = false;
- const std::vector<ScalableBitmap>& m_mode_bitmap_cache;
-
public:
std::vector <ConfigOptionsGroupShp> m_optgroups;
DynamicPrintConfig* m_config;
@@ -79,8 +69,12 @@ public:
size_t iconID() const { return m_iconID; }
void set_config(DynamicPrintConfig* config_in) { m_config = config_in; }
void reload_config();
- void update_visibility(ConfigOptionMode mode);
+ void update_visibility(ConfigOptionMode mode, bool update_contolls_visibility);
+ void activate(ConfigOptionMode mode, std::function<void()> throw_if_canceled);
+ void clear();
void msw_rescale();
+ void sys_color_changed();
+ void refresh();
Field* get_field(const t_config_option_key& opt_key, int opt_index = -1) const;
bool set_value(const t_config_option_key& opt_key, const boost::any& value);
ConfigOptionsGroupShp new_optgroup(const wxString& title, int noncommon_label_width = -1);
@@ -104,10 +98,6 @@ protected:
};
-wxDECLARE_EVENT(EVT_TAB_VALUE_CHANGED, wxCommandEvent);
-wxDECLARE_EVENT(EVT_TAB_PRESETS_CHANGED, SimpleEvent);
-
-
using PageShp = std::shared_ptr<Page>;
class Tab: public wxPanel
{
@@ -120,16 +110,21 @@ protected:
Preset::Type m_type;
std::string m_name;
const wxString m_title;
- PresetBitmapComboBox* m_presets_choice;
+ TabPresetComboBox* m_presets_choice;
+ ScalableButton* m_search_btn;
ScalableButton* m_btn_save_preset;
ScalableButton* m_btn_delete_preset;
+ ScalableButton* m_btn_edit_ph_printer {nullptr};
ScalableButton* m_btn_hide_incompatible_presets;
wxBoxSizer* m_hsizer;
wxBoxSizer* m_left_sizer;
wxTreeCtrl* m_treectrl;
wxImageList* m_icons;
- ModeSizer* m_mode_sizer;
+ wxScrolledWindow* m_page_view {nullptr};
+ wxBoxSizer* m_page_sizer {nullptr};
+
+ ModeSizer* m_mode_sizer;
struct PresetDependencies {
Preset::Type type = Preset::TYPE_INVALID;
@@ -137,8 +132,8 @@ protected:
ScalableButton *btn = nullptr;
std::string key_list; // "compatible_printers"
std::string key_condition;
- std::string dialog_title;
- std::string dialog_label;
+ wxString dialog_title;
+ wxString dialog_label;
};
PresetDependencies m_compatible_printers;
PresetDependencies m_compatible_prints;
@@ -169,7 +164,6 @@ protected:
std::vector<ScalableButton*> m_scaled_buttons = {};
std::vector<ScalableBitmap*> m_scaled_bitmaps = {};
std::vector<ScalableBitmap> m_scaled_icons_list = {};
- std::vector<ScalableBitmap> m_mode_bitmap_cache = {};
// Colors for ui "decoration"
wxColour m_sys_label_clr;
@@ -197,8 +191,10 @@ protected:
int m_icon_count;
std::map<std::string, size_t> m_icon_index; // Map from an icon file name to its index
+ std::map<wxString, std::string> m_category_icon; // Map from a category name to an icon file name
std::vector<PageShp> m_pages;
- bool m_disable_tree_sel_changed_event;
+ Page* m_active_page {nullptr};
+ bool m_disable_tree_sel_changed_event {false};
bool m_show_incompatible_presets;
std::vector<Preset::Type> m_dependent_tabs;
@@ -212,8 +208,6 @@ protected:
bool m_is_nonsys_values{ true };
bool m_postpone_update_ui {false};
- size_t m_selected_preset_item{ 0 };
-
void set_type();
int m_em_unit;
@@ -221,17 +215,38 @@ protected:
bool m_completed { false };
ConfigOptionMode m_mode = comExpert; // to correct first Tab update_visibility() set mode to Expert
+ struct Highlighter
+ {
+ void set_timer_owner(wxEvtHandler* owner, int timerid = wxID_ANY);
+ void init(std::pair<OG_CustomCtrl*, bool*>);
+ void blink();
+ void invalidate();
+
+ private:
+ OG_CustomCtrl* m_custom_ctrl {nullptr};
+ bool* m_show_blink_ptr{nullptr};
+ int m_blink_counter {0};
+ wxTimer m_timer;
+ }
+ m_highlighter;
+
+ DynamicPrintConfig m_cache_config;
+
+
+ bool m_page_switch_running = false;
+ bool m_page_switch_planned = false;
+
public:
PresetBundle* m_preset_bundle;
bool m_show_btn_incompatible_presets = false;
PresetCollection* m_presets;
DynamicPrintConfig* m_config;
- ogStaticText* m_parent_preset_description_line;
+ ogStaticText* m_parent_preset_description_line = nullptr;
ScalableButton* m_detach_preset_btn = nullptr;
- // map of option name -> wxStaticText (colored label, associated with option)
+ // map of option name -> wxColour (color of the colored label, associated with option)
// Used for options which don't have corresponded field
- std::map<std::string, wxStaticText*> m_colored_Labels;
+ std::map<std::string, wxColour> m_colored_Label_colors;
// Counter for the updating (because of an update() function can have a recursive behavior):
// 1. increase value from the very beginning of an update() function
@@ -261,12 +276,17 @@ public:
void update_ui_items_related_on_parent_preset(const Preset* selected_preset_parent);
void load_current_preset();
void rebuild_page_tree();
- void update_page_tree_visibility();
- // Select a new preset, possibly delete the current one.
- void select_preset(std::string preset_name = "", bool delete_current = false);
+ void update_btns_enabling();
+ void update_preset_choice();
+ // Select a new preset, possibly delete the current one.
+ void select_preset(std::string preset_name = "", bool delete_current = false, const std::string& last_selected_ph_printer_name = "");
bool may_discard_current_dirty_preset(PresetCollection* presets = nullptr, const std::string& new_printer_name = "");
bool may_switch_to_SLA_preset();
+ virtual void clear_pages();
+ virtual void update_description_lines();
+ virtual void activate_selected_page(std::function<void()> throw_if_canceled);
+
void OnTreeSelChange(wxTreeEvent& event);
void OnKeyDown(wxKeyEvent& event);
@@ -276,6 +296,7 @@ public:
void update_show_hide_incompatible_button();
void update_ui_from_settings();
void update_labels_colour();
+ void decorate();
void update_changed_ui();
void get_sys_and_mod_flags(const std::string& opt_key, bool& sys_page, bool& modified_page);
void update_changed_tree_ui();
@@ -284,11 +305,13 @@ public:
void on_roll_back_value(const bool to_sys = false);
PageShp add_options_page(const wxString& title, const std::string& icon, bool is_extruder_pages = false);
+ static wxString translate_category(const wxString& title, Preset::Type preset_type);
virtual void OnActivate();
virtual void on_preset_loaded() {}
virtual void build() = 0;
virtual void update() = 0;
+ virtual void toggle_options() = 0;
virtual void init_options_list();
void load_initial_data();
void update_dirty();
@@ -298,25 +321,36 @@ public:
void update_mode();
void update_visibility();
virtual void msw_rescale();
+ virtual void sys_color_changed();
Field* get_field(const t_config_option_key& opt_key, int opt_index = -1) const;
- bool set_value(const t_config_option_key& opt_key, const boost::any& value);
- wxSizer* description_line_widget(wxWindow* parent, ogStaticText** StaticText);
+ std::pair<OG_CustomCtrl*, bool*> get_custom_ctrl_with_blinking_ptr(const t_config_option_key& opt_key, int opt_index = -1);
+
+ Field* get_field(const t_config_option_key &opt_key, Page** selected_page, int opt_index = -1);
+ void toggle_option(const std::string& opt_key, bool toggle, int opt_index = -1);
+ wxSizer* description_line_widget(wxWindow* parent, ogStaticText** StaticText, wxString text = wxEmptyString);
bool current_preset_is_dirty();
DynamicPrintConfig* get_config() { return m_config; }
PresetCollection* get_presets() { return m_presets; }
- size_t get_selected_preset_item() { return m_selected_preset_item; }
void on_value_change(const std::string& opt_key, const boost::any& value);
void update_wiping_button_visibility();
+ void activate_option(const std::string& opt_key, const wxString& category);
+ void apply_searcher();
+ void cache_config_diff(const std::vector<std::string>& selected_options);
+ void apply_config_from_cache();
+
+ const std::map<wxString, std::string>& get_category_icon_map() { return m_category_icon; }
protected:
- void create_line_with_widget(ConfigOptionsGroup* optgroup, const std::string& opt_key, widget_t widget);
+ void create_line_with_widget(ConfigOptionsGroup* optgroup, const std::string& opt_key, const wxString& path, widget_t widget);
wxSizer* compatible_widget_create(wxWindow* parent, PresetDependencies &deps);
void compatible_widget_reload(PresetDependencies &deps);
void load_key_value(const std::string& opt_key, const boost::any& value, bool saved_value = false);
+ // return true if cancelled
+ bool tree_sel_change_delayed();
void on_presets_changed();
void build_preset_description_line(ConfigOptionsGroup* optgroup);
void update_preset_description_line();
@@ -336,21 +370,25 @@ public:
Tab(parent, _(L("Print Settings")), Slic3r::Preset::TYPE_PRINT) {}
~TabPrint() {}
- ogStaticText* m_recommended_thin_wall_thickness_description_line = nullptr;
- ogStaticText* m_top_bottom_shell_thickness_explanation = nullptr;
- bool m_support_material_overhangs_queried = false;
-
void build() override;
void reload_config() override;
+ void update_description_lines() override;
+ void toggle_options() override;
void update() override;
- void OnActivate() override;
+ void clear_pages() override;
bool supports_printer_technology(const PrinterTechnology tech) override { return tech == ptFFF; }
+
+private:
+ ogStaticText* m_recommended_thin_wall_thickness_description_line = nullptr;
+ ogStaticText* m_top_bottom_shell_thickness_explanation = nullptr;
+ bool m_support_material_overhangs_queried = false;
};
class TabFilament : public Tab
{
- ogStaticText* m_volumetric_speed_description_line;
- ogStaticText* m_cooling_description_line;
+private:
+ ogStaticText* m_volumetric_speed_description_line {nullptr};
+ ogStaticText* m_cooling_description_line {nullptr};
void add_filament_overrides_page();
void update_filament_overrides_page();
@@ -365,32 +403,37 @@ public:
void build() override;
void reload_config() override;
+ void update_description_lines() override;
+ void toggle_options() override;
void update() override;
- void OnActivate() override;
+ void clear_pages() override;
bool supports_printer_technology(const PrinterTechnology tech) override { return tech == ptFFF; }
};
class TabPrinter : public Tab
{
+private:
bool m_has_single_extruder_MM_page = false;
bool m_use_silent_mode = false;
void append_option_line(ConfigOptionsGroupShp optgroup, const std::string opt_key);
bool m_rebuild_kinematics_page = false;
+ ogStaticText* m_machine_limits_description_line {nullptr};
+ void update_machine_limits_description(const MachineLimitsUsage usage);
+
+ ogStaticText* m_fff_print_host_upload_description_line {nullptr};
+ ogStaticText* m_sla_print_host_upload_description_line {nullptr};
std::vector<PageShp> m_pages_fff;
std::vector<PageShp> m_pages_sla;
- void build_printhost(ConfigOptionsGroup *optgroup);
public:
- wxButton* m_serial_test_btn = nullptr;
- ScalableButton* m_print_host_test_btn = nullptr;
- ScalableButton* m_printhost_browse_btn = nullptr;
ScalableButton* m_reset_to_filament_color = nullptr;
size_t m_extruders_count;
size_t m_extruders_count_old = 0;
size_t m_initial_extruders_count;
size_t m_sys_extruders_count;
+ size_t m_cache_extruder_count = 0;
PrinterTechnology m_printer_technology = ptFFF;
@@ -400,22 +443,29 @@ public:
~TabPrinter() {}
void build() override;
+ void build_print_host_upload_group(Page* page);
void build_fff();
void build_sla();
+ void reload_config() override;
+ void activate_selected_page(std::function<void()> throw_if_canceled) override;
+ void clear_pages() override;
+ void toggle_options() override;
void update() override;
void update_fff();
void update_sla();
void update_pages(); // update m_pages according to printer technology
- void update_serial_ports();
void extruders_count_changed(size_t extruders_count);
PageShp build_kinematics_page();
void build_unregular_pages();
void on_preset_loaded() override;
void init_options_list() override;
void msw_rescale() override;
+ void sys_color_changed() override;
bool supports_printer_technology(const PrinterTechnology /* tech */) override { return true; }
wxSizer* create_bed_shape_widget(wxWindow* parent);
+ void cache_extruder_cnt();
+ void apply_extruder_cnt_from_cache();
};
class TabSLAMaterial : public Tab
@@ -428,6 +478,7 @@ public:
void build() override;
void reload_config() override;
+ void toggle_options() override {};
void update() override;
void init_options_list() override;
bool supports_printer_technology(const PrinterTechnology tech) override { return tech == ptSLA; }
@@ -440,27 +491,18 @@ public:
// Tab(parent, _(L("Print Settings")), L("sla_print")) {}
Tab(parent, _(L("Print Settings")), Slic3r::Preset::TYPE_SLA_PRINT) {}
~TabSLAPrint() {}
+
+ ogStaticText* m_support_object_elevation_description_line = nullptr;
+
void build() override;
void reload_config() override;
+ void update_description_lines() override;
+ void toggle_options() override;
void update() override;
-// void init_options_list() override;
+ void clear_pages() override;
bool supports_printer_technology(const PrinterTechnology tech) override { return tech == ptSLA; }
};
-class SavePresetWindow :public wxDialog
-{
-public:
- SavePresetWindow(wxWindow* parent) :wxDialog(parent, wxID_ANY, _(L("Save preset"))) {}
- ~SavePresetWindow() {}
-
- std::string m_chosen_name;
- wxComboBox* m_combo;
-
- void build(const wxString& title, const std::string& default_name, std::vector<std::string> &values);
- void accept();
- std::string get_name() { return m_chosen_name; }
-};
-
} // GUI
} // Slic3r
diff --git a/src/slic3r/GUI/UnsavedChangesDialog.cpp b/src/slic3r/GUI/UnsavedChangesDialog.cpp
new file mode 100644
index 000000000..b4b38b4bd
--- /dev/null
+++ b/src/slic3r/GUI/UnsavedChangesDialog.cpp
@@ -0,0 +1,1219 @@
+#include "UnsavedChangesDialog.hpp"
+
+#include <cstddef>
+#include <string>
+#include <vector>
+#include <boost/algorithm/string.hpp>
+#include <boost/optional.hpp>
+#include <boost/nowide/convert.hpp>
+
+#include "libslic3r/PrintConfig.hpp"
+#include "libslic3r/PresetBundle.hpp"
+#include "format.hpp"
+#include "GUI_App.hpp"
+#include "Plater.hpp"
+#include "Tab.hpp"
+#include "ExtraRenderers.hpp"
+#include "wxExtensions.hpp"
+#include "SavePresetDialog.hpp"
+#include "MainFrame.hpp"
+
+//#define FTS_FUZZY_MATCH_IMPLEMENTATION
+//#include "fts_fuzzy_match.h"
+
+#include "BitmapCache.hpp"
+
+using boost::optional;
+
+#ifdef __linux__
+#define wxLinux true
+#else
+#define wxLinux false
+#endif
+
+namespace Slic3r {
+
+namespace GUI {
+
+// ----------------------------------------------------------------------------
+// ModelNode: a node inside UnsavedChangesModel
+// ----------------------------------------------------------------------------
+
+static const std::map<Preset::Type, std::string> type_icon_names = {
+ {Preset::TYPE_PRINT, "cog" },
+ {Preset::TYPE_SLA_PRINT, "cog" },
+ {Preset::TYPE_FILAMENT, "spool" },
+ {Preset::TYPE_SLA_MATERIAL, "resin" },
+ {Preset::TYPE_PRINTER, "printer" },
+};
+
+static std::string get_icon_name(Preset::Type type, PrinterTechnology pt) {
+ return pt == ptSLA && type == Preset::TYPE_PRINTER ? "sla_printer" : type_icon_names.at(type);
+}
+
+static std::string def_text_color()
+{
+ wxColour def_colour = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT);
+ auto clr_str = wxString::Format(wxT("#%02X%02X%02X"), def_colour.Red(), def_colour.Green(), def_colour.Blue());
+ return clr_str.ToStdString();
+}
+static std::string grey = "#808080";
+static std::string orange = "#ed6b21";
+
+static void color_string(wxString& str, const std::string& color)
+{
+#if defined(SUPPORTS_MARKUP) && !defined(__APPLE__)
+ str = from_u8((boost::format("<span color=\"%1%\">%2%</span>") % color % into_u8(str)).str());
+#endif
+}
+
+static void make_string_bold(wxString& str)
+{
+#if defined(SUPPORTS_MARKUP) && !defined(__APPLE__)
+ str = from_u8((boost::format("<b>%1%</b>") % into_u8(str)).str());
+#endif
+}
+
+// preset(root) node
+ModelNode::ModelNode(Preset::Type preset_type, wxWindow* parent_win, const wxString& text, const std::string& icon_name) :
+ m_parent_win(parent_win),
+ m_parent(nullptr),
+ m_preset_type(preset_type),
+ m_icon_name(icon_name),
+ m_text(text)
+{
+ UpdateIcons();
+}
+
+// category node
+ModelNode::ModelNode(ModelNode* parent, const wxString& text, const std::string& icon_name) :
+ m_parent_win(parent->m_parent_win),
+ m_parent(parent),
+ m_icon_name(icon_name),
+ m_text(text)
+{
+ UpdateIcons();
+}
+
+// group node
+ModelNode::ModelNode(ModelNode* parent, const wxString& text) :
+ m_parent_win(parent->m_parent_win),
+ m_parent(parent),
+ m_text(text),
+ m_icon_name("dot_small")
+{
+ UpdateIcons();
+}
+
+#ifdef __linux__
+wxIcon ModelNode::get_bitmap(const wxString& color)
+#else
+wxBitmap ModelNode::get_bitmap(const wxString& color)
+#endif // __linux__
+{
+ /* It's supposed that standard size of an icon is 48px*16px for 100% scaled display.
+ * So set sizes for solid_colored icons used for filament preset
+ * and scale them in respect to em_unit value
+ */
+ const double em = em_unit(m_parent_win);
+ const int icon_width = lround(6.4 * em);
+ const int icon_height = lround(1.6 * em);
+
+ BitmapCache bmp_cache;
+ unsigned char rgb[3];
+ BitmapCache::parse_color(into_u8(color), rgb);
+ // there is no need to scale created solid bitmap
+#ifndef __linux__
+ return bmp_cache.mksolid(icon_width, icon_height, rgb, true);
+#else
+ wxIcon icon;
+ icon.CopyFromBitmap(bmp_cache.mksolid(icon_width, icon_height, rgb, true));
+ return icon;
+#endif // __linux__
+}
+
+// option node
+ModelNode::ModelNode(ModelNode* parent, const wxString& text, const wxString& old_value, const wxString& new_value) :
+ m_parent(parent),
+ m_old_color(old_value.StartsWith("#") ? old_value : ""),
+ m_new_color(new_value.StartsWith("#") ? new_value : ""),
+ m_container(false),
+ m_text(text),
+ m_icon_name("empty"),
+ m_old_value(old_value),
+ m_new_value(new_value)
+{
+ // check if old/new_value is color
+ if (m_old_color.IsEmpty()) {
+ if (!m_new_color.IsEmpty())
+ m_old_value = _L("Undef");
+ }
+ else {
+ m_old_color_bmp = get_bitmap(m_old_color);
+ m_old_value.Clear();
+ }
+
+ if (m_new_color.IsEmpty()) {
+ if (!m_old_color.IsEmpty())
+ m_new_value = _L("Undef");
+ }
+ else {
+ m_new_color_bmp = get_bitmap(m_new_color);
+ m_new_value.Clear();
+ }
+
+ // "color" strings
+ color_string(m_old_value, def_text_color());
+ color_string(m_new_value, orange);
+
+ UpdateIcons();
+}
+
+void ModelNode::UpdateEnabling()
+{
+ auto change_text_color = [](wxString& str, const std::string& clr_from, const std::string& clr_to)
+ {
+#if defined(SUPPORTS_MARKUP) && !defined(__APPLE__)
+ std::string old_val = into_u8(str);
+ boost::replace_all(old_val, clr_from, clr_to);
+ str = from_u8(old_val);
+#endif
+ };
+
+ if (!m_toggle) {
+ change_text_color(m_text, def_text_color(), grey);
+ change_text_color(m_old_value, def_text_color(), grey);
+ change_text_color(m_new_value, orange,grey);
+ }
+ else {
+ change_text_color(m_text, grey, def_text_color());
+ change_text_color(m_old_value, grey, def_text_color());
+ change_text_color(m_new_value, grey, orange);
+ }
+ // update icons for the colors
+ UpdateIcons();
+}
+
+void ModelNode::UpdateIcons()
+{
+ // update icons for the colors, if any exists
+ if (!m_old_color.IsEmpty())
+ m_old_color_bmp = get_bitmap(m_toggle ? m_old_color : grey);
+ if (!m_new_color.IsEmpty())
+ m_new_color_bmp = get_bitmap(m_toggle ? m_new_color : grey);
+
+ // update main icon, if any exists
+ if (m_icon_name.empty())
+ return;
+
+#ifdef __linux__
+ m_icon.CopyFromBitmap(create_scaled_bitmap(m_icon_name, m_parent_win, 16, !m_toggle));
+#else
+ m_icon = create_scaled_bitmap(m_icon_name, m_parent_win, 16, !m_toggle);
+#endif //__linux__
+}
+
+
+// ----------------------------------------------------------------------------
+// UnsavedChangesModel
+// ----------------------------------------------------------------------------
+
+UnsavedChangesModel::UnsavedChangesModel(wxWindow* parent) :
+ m_parent_win(parent)
+{
+}
+
+UnsavedChangesModel::~UnsavedChangesModel()
+{
+ for (ModelNode* preset_node : m_preset_nodes)
+ delete preset_node;
+}
+
+wxDataViewItem UnsavedChangesModel::AddPreset(Preset::Type type, wxString preset_name, PrinterTechnology pt)
+{
+ // "color" strings
+ color_string(preset_name, def_text_color());
+ make_string_bold(preset_name);
+
+ auto preset = new ModelNode(type, m_parent_win, preset_name, get_icon_name(type, pt));
+ m_preset_nodes.emplace_back(preset);
+
+ wxDataViewItem child((void*)preset);
+ wxDataViewItem parent(nullptr);
+
+ ItemAdded(parent, child);
+ return child;
+}
+
+ModelNode* UnsavedChangesModel::AddOption(ModelNode* group_node, wxString option_name, wxString old_value, wxString new_value)
+{
+ group_node->Append(std::make_unique<ModelNode>(group_node, option_name, old_value, new_value));
+ ModelNode* option = group_node->GetChildren().back().get();
+ wxDataViewItem group_item = wxDataViewItem((void*)group_node);
+ ItemAdded(group_item, wxDataViewItem((void*)option));
+
+ m_ctrl->Expand(group_item);
+ return option;
+}
+
+ModelNode* UnsavedChangesModel::AddOptionWithGroup(ModelNode* category_node, wxString group_name, wxString option_name, wxString old_value, wxString new_value)
+{
+ category_node->Append(std::make_unique<ModelNode>(category_node, group_name));
+ ModelNode* group_node = category_node->GetChildren().back().get();
+ ItemAdded(wxDataViewItem((void*)category_node), wxDataViewItem((void*)group_node));
+
+ return AddOption(group_node, option_name, old_value, new_value);
+}
+
+ModelNode* UnsavedChangesModel::AddOptionWithGroupAndCategory(ModelNode* preset_node, wxString category_name, wxString group_name,
+ wxString option_name, wxString old_value, wxString new_value, const std::string category_icon_name)
+{
+ preset_node->Append(std::make_unique<ModelNode>(preset_node, category_name, category_icon_name));
+ ModelNode* category_node = preset_node->GetChildren().back().get();
+ ItemAdded(wxDataViewItem((void*)preset_node), wxDataViewItem((void*)category_node));
+
+ return AddOptionWithGroup(category_node, group_name, option_name, old_value, new_value);
+}
+
+wxDataViewItem UnsavedChangesModel::AddOption(Preset::Type type, wxString category_name, wxString group_name, wxString option_name,
+ wxString old_value, wxString new_value, const std::string category_icon_name)
+{
+ // "color" strings
+ color_string(category_name, def_text_color());
+ color_string(group_name, def_text_color());
+ color_string(option_name, def_text_color());
+
+ // "make" strings bold
+ make_string_bold(category_name);
+ make_string_bold(group_name);
+
+ // add items
+ for (ModelNode* preset : m_preset_nodes)
+ if (preset->type() == type)
+ {
+ for (std::unique_ptr<ModelNode> &category : preset->GetChildren())
+ if (category->text() == category_name)
+ {
+ for (std::unique_ptr<ModelNode> &group : category->GetChildren())
+ if (group->text() == group_name)
+ return wxDataViewItem((void*)AddOption(group.get(), option_name, old_value, new_value));
+
+ return wxDataViewItem((void*)AddOptionWithGroup(category.get(), group_name, option_name, old_value, new_value));
+ }
+
+ return wxDataViewItem((void*)AddOptionWithGroupAndCategory(preset, category_name, group_name, option_name, old_value, new_value, category_icon_name));
+ }
+
+ return wxDataViewItem(nullptr);
+}
+
+static void update_children(ModelNode* parent)
+{
+ if (parent->IsContainer()) {
+ bool toggle = parent->IsToggled();
+ for (std::unique_ptr<ModelNode> &child : parent->GetChildren()) {
+ child->Toggle(toggle);
+ child->UpdateEnabling();
+ update_children(child.get());
+ }
+ }
+}
+
+static void update_parents(ModelNode* node)
+{
+ ModelNode* parent = node->GetParent();
+ if (parent) {
+ bool toggle = false;
+ for (std::unique_ptr<ModelNode> &child : parent->GetChildren()) {
+ if (child->IsToggled()) {
+ toggle = true;
+ break;
+ }
+ }
+ parent->Toggle(toggle);
+ parent->UpdateEnabling();
+ update_parents(parent);
+ }
+}
+
+void UnsavedChangesModel::UpdateItemEnabling(wxDataViewItem item)
+{
+ assert(item.IsOk());
+ ModelNode* node = static_cast<ModelNode*>(item.GetID());
+ node->UpdateEnabling();
+
+ update_children(node);
+ update_parents(node);
+}
+
+bool UnsavedChangesModel::IsEnabledItem(const wxDataViewItem& item)
+{
+ assert(item.IsOk());
+ ModelNode* node = static_cast<ModelNode*>(item.GetID());
+ return node->IsToggled();
+}
+
+void UnsavedChangesModel::GetValue(wxVariant& variant, const wxDataViewItem& item, unsigned int col) const
+{
+ assert(item.IsOk());
+
+ ModelNode* node = static_cast<ModelNode*>(item.GetID());
+ switch (col)
+ {
+ case colToggle:
+ variant = node->m_toggle;
+ break;
+#ifdef __linux__
+ case colIconText:
+ variant << wxDataViewIconText(node->m_text, node->m_icon);
+ break;
+ case colOldValue:
+ variant << wxDataViewIconText(node->m_old_value, node->m_old_color_bmp);
+ break;
+ case colNewValue:
+ variant << wxDataViewIconText(node->m_new_value, node->m_new_color_bmp);
+ break;
+#else
+ case colIconText:
+ variant << DataViewBitmapText(node->m_text, node->m_icon);
+ break;
+ case colOldValue:
+ variant << DataViewBitmapText(node->m_old_value, node->m_old_color_bmp);
+ break;
+ case colNewValue:
+ variant << DataViewBitmapText(node->m_new_value, node->m_new_color_bmp);
+ break;
+#endif //__linux__
+
+ default:
+ wxLogError("UnsavedChangesModel::GetValue: wrong column %d", col);
+ }
+}
+
+bool UnsavedChangesModel::SetValue(const wxVariant& variant, const wxDataViewItem& item, unsigned int col)
+{
+ assert(item.IsOk());
+
+ ModelNode* node = static_cast<ModelNode*>(item.GetID());
+ switch (col)
+ {
+ case colToggle:
+ node->m_toggle = variant.GetBool();
+ return true;
+#ifdef __linux__
+ case colIconText: {
+ wxDataViewIconText data;
+ data << variant;
+ node->m_icon = data.GetIcon();
+ node->m_text = data.GetText();
+ return true; }
+ case colOldValue: {
+ wxDataViewIconText data;
+ data << variant;
+ node->m_old_color_bmp = data.GetIcon();
+ node->m_old_value = data.GetText();
+ return true; }
+ case colNewValue: {
+ wxDataViewIconText data;
+ data << variant;
+ node->m_new_color_bmp = data.GetIcon();
+ node->m_new_value = data.GetText();
+ return true; }
+#else
+ case colIconText: {
+ DataViewBitmapText data;
+ data << variant;
+ node->m_icon = data.GetBitmap();
+ node->m_text = data.GetText();
+ return true; }
+ case colOldValue: {
+ DataViewBitmapText data;
+ data << variant;
+ node->m_old_color_bmp = data.GetBitmap();
+ node->m_old_value = data.GetText();
+ return true; }
+ case colNewValue: {
+ DataViewBitmapText data;
+ data << variant;
+ node->m_new_color_bmp = data.GetBitmap();
+ node->m_new_value = data.GetText();
+ return true; }
+#endif //__linux__
+ default:
+ wxLogError("UnsavedChangesModel::SetValue: wrong column");
+ }
+ return false;
+}
+
+bool UnsavedChangesModel::IsEnabled(const wxDataViewItem& item, unsigned int col) const
+{
+ assert(item.IsOk());
+ if (col == colToggle)
+ return true;
+
+ // disable unchecked nodes
+ return (static_cast<ModelNode*>(item.GetID()))->IsToggled();
+}
+
+wxDataViewItem UnsavedChangesModel::GetParent(const wxDataViewItem& item) const
+{
+ // the invisible root node has no parent
+ if (!item.IsOk())
+ return wxDataViewItem(nullptr);
+
+ ModelNode* node = static_cast<ModelNode*>(item.GetID());
+
+ // "MyMusic" also has no parent
+ if (node->IsRoot())
+ return wxDataViewItem(nullptr);
+
+ return wxDataViewItem((void*)node->GetParent());
+}
+
+bool UnsavedChangesModel::IsContainer(const wxDataViewItem& item) const
+{
+ // the invisble root node can have children
+ if (!item.IsOk())
+ return true;
+
+ ModelNode* node = static_cast<ModelNode*>(item.GetID());
+ return node->IsContainer();
+}
+
+unsigned int UnsavedChangesModel::GetChildren(const wxDataViewItem& parent, wxDataViewItemArray& array) const
+{
+ ModelNode* node = (ModelNode*)parent.GetID();
+ if (!node) {
+ for (auto preset_node : m_preset_nodes)
+ array.Add(wxDataViewItem((void*)preset_node));
+ return m_preset_nodes.size();
+ }
+
+ for (std::unique_ptr<ModelNode> &child : node->GetChildren())
+ array.Add(wxDataViewItem((void*)child.get()));
+
+ return node->GetChildCount();
+}
+
+
+wxString UnsavedChangesModel::GetColumnType(unsigned int col) const
+{
+ switch (col)
+ {
+ case colToggle:
+ return "bool";
+ case colIconText:
+ case colOldValue:
+ case colNewValue:
+ default:
+ return "DataViewBitmapText";//"string";
+ }
+}
+
+static void rescale_children(ModelNode* parent)
+{
+ if (parent->IsContainer()) {
+ for (std::unique_ptr<ModelNode> &child : parent->GetChildren()) {
+ child->UpdateIcons();
+ rescale_children(child.get());
+ }
+ }
+}
+
+void UnsavedChangesModel::Rescale()
+{
+ for (ModelNode* node : m_preset_nodes) {
+ node->UpdateIcons();
+ rescale_children(node);
+ }
+}
+
+
+//------------------------------------------
+// UnsavedChangesDialog
+//------------------------------------------
+
+UnsavedChangesDialog::UnsavedChangesDialog(const wxString& header)
+ : DPIDialog(static_cast<wxWindow*>(wxGetApp().mainframe), wxID_ANY, _L("PrusaSlicer is closing: Unsaved Changes"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
+{
+ m_app_config_key = "default_action_on_close_application";
+
+ build(Preset::TYPE_INVALID, nullptr, "", header);
+
+ const std::string& def_action = wxGetApp().app_config->get(m_app_config_key);
+ if (def_action == "none")
+ this->CenterOnScreen();
+ else {
+ m_exit_action = def_action == ActSave ? Action::Save : Action::Discard;
+ if (m_exit_action == Action::Save)
+ save(nullptr);
+ }
+}
+
+UnsavedChangesDialog::UnsavedChangesDialog(Preset::Type type, PresetCollection* dependent_presets, const std::string& new_selected_preset)
+ : DPIDialog(static_cast<wxWindow*>(wxGetApp().mainframe), wxID_ANY, _L("Switching Presets: Unsaved Changes"), wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
+{
+ m_app_config_key = "default_action_on_select_preset";
+
+ build(type, dependent_presets, new_selected_preset);
+
+ const std::string& def_action = wxGetApp().app_config->get(m_app_config_key);
+ if (def_action == "none") {
+ if (wxGetApp().mainframe->is_dlg_layout() && wxGetApp().mainframe->m_settings_dialog.HasFocus())
+ this->SetPosition(wxGetApp().mainframe->m_settings_dialog.GetPosition());
+ this->CenterOnScreen();
+ }
+ else {
+ m_exit_action = def_action == ActTransfer ? Action::Transfer :
+ def_action == ActSave ? Action::Save : Action::Discard;
+ const PresetCollection& printers = wxGetApp().preset_bundle->printers;
+ if (m_exit_action == Action::Save ||
+ (m_exit_action == Action::Transfer && dependent_presets && (type == dependent_presets->type() ?
+ dependent_presets->get_edited_preset().printer_technology() != dependent_presets->find_preset(new_selected_preset)->printer_technology() :
+ printers.get_edited_preset().printer_technology() != printers.find_preset(new_selected_preset)->printer_technology())) )
+ save(dependent_presets);
+ }
+}
+
+void UnsavedChangesDialog::build(Preset::Type type, PresetCollection* dependent_presets, const std::string& new_selected_preset, const wxString& header)
+{
+ wxColour bgr_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
+ SetBackgroundColour(bgr_clr);
+
+#if ENABLE_WX_3_1_3_DPI_CHANGED_EVENT && defined(__WXMSW__)
+ // ys_FIXME! temporary workaround for correct font scaling
+ // Because of from wxWidgets 3.1.3 auto rescaling is implemented for the Fonts,
+ // From the very beginning set dialog font to the wxSYS_DEFAULT_GUI_FONT
+ this->SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT));
+#endif // ENABLE_WX_3_1_3_DPI_CHANGED_EVENT
+
+ int border = 10;
+ int em = em_unit();
+
+ m_action_line = new wxStaticText(this, wxID_ANY, "");
+ m_action_line->SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Bold());
+
+ m_tree = new wxDataViewCtrl(this, wxID_ANY, wxDefaultPosition, wxSize(em * 60, em * 30), wxBORDER_SIMPLE | wxDV_VARIABLE_LINE_HEIGHT | wxDV_ROW_LINES);
+ m_tree_model = new UnsavedChangesModel(this);
+ m_tree->AssociateModel(m_tree_model);
+ m_tree_model->SetAssociatedControl(m_tree);
+
+ m_tree->AppendToggleColumn(L"\u2714", UnsavedChangesModel::colToggle, wxDATAVIEW_CELL_ACTIVATABLE, (wxLinux ? 8 : 6) * em);
+
+ auto append_bmp_text_column = [this](const wxString& label, unsigned model_column, int width, bool set_expander = false)
+ {
+#ifdef __linux__
+ wxDataViewIconTextRenderer* rd = new wxDataViewIconTextRenderer();
+#ifdef SUPPORTS_MARKUP
+ rd->EnableMarkup(true);
+#endif
+ wxDataViewColumn* column = new wxDataViewColumn(label, rd, model_column, width, wxALIGN_TOP, wxDATAVIEW_COL_RESIZABLE | wxDATAVIEW_CELL_INERT);
+#else
+ wxDataViewColumn* column = new wxDataViewColumn(label, new BitmapTextRenderer(true, wxDATAVIEW_CELL_INERT), model_column, width, wxALIGN_TOP, wxDATAVIEW_COL_RESIZABLE);
+#endif //__linux__
+ m_tree->AppendColumn(column);
+ if (set_expander)
+ m_tree->SetExpanderColumn(column);
+ };
+
+ append_bmp_text_column("" , UnsavedChangesModel::colIconText, 28 * em);
+ append_bmp_text_column(_L("Old Value"), UnsavedChangesModel::colOldValue, 12 * em);
+ append_bmp_text_column(_L("New Value"), UnsavedChangesModel::colNewValue, 12 * em);
+
+ m_tree->Bind(wxEVT_DATAVIEW_ITEM_VALUE_CHANGED, &UnsavedChangesDialog::item_value_changed, this);
+ m_tree->Bind(wxEVT_DATAVIEW_ITEM_CONTEXT_MENU, &UnsavedChangesDialog::context_menu, this);
+
+ // Add Buttons
+ wxFont btn_font = this->GetFont().Scaled(1.4f);
+ wxBoxSizer* buttons = new wxBoxSizer(wxHORIZONTAL);
+
+ auto add_btn = [this, buttons, btn_font, dependent_presets](ScalableButton** btn, int& btn_id, const std::string& icon_name, Action close_act, const wxString& label, bool process_enable = true)
+ {
+ *btn = new ScalableButton(this, btn_id = NewControlId(), icon_name, label, wxDefaultSize, wxDefaultPosition, wxBORDER_DEFAULT, true, 24);
+
+ buttons->Add(*btn, 1, wxLEFT, 5);
+ (*btn)->SetFont(btn_font);
+
+ (*btn)->Bind(wxEVT_BUTTON, [this, close_act, dependent_presets](wxEvent&) {
+ update_config(close_act);
+ if (close_act == Action::Save && !save(dependent_presets))
+ return;
+ close(close_act);
+ });
+ if (process_enable)
+ (*btn)->Bind(wxEVT_UPDATE_UI, [this](wxUpdateUIEvent& evt) { evt.Enable(!m_empty_selection); });
+ (*btn)->Bind(wxEVT_LEAVE_WINDOW, [this](wxMouseEvent& e) { show_info_line(Action::Undef); e.Skip(); });
+ };
+
+ const PresetCollection& printers = wxGetApp().preset_bundle->printers;
+ if (dependent_presets && (type == dependent_presets->type() ?
+ dependent_presets->get_edited_preset().printer_technology() == dependent_presets->find_preset(new_selected_preset)->printer_technology() :
+ printers.get_edited_preset().printer_technology() == printers.find_preset(new_selected_preset)->printer_technology()))
+ add_btn(&m_transfer_btn, m_move_btn_id, "paste_menu", Action::Transfer, _L("Transfer"));
+ add_btn(&m_discard_btn, m_continue_btn_id, dependent_presets ? "switch_presets" : "exit", Action::Discard, _L("Discard"), false);
+ add_btn(&m_save_btn, m_save_btn_id, "save", Action::Save, _L("Save"));
+
+ ScalableButton* cancel_btn = new ScalableButton(this, wxID_CANCEL, "cross", _L("Cancel"), wxDefaultSize, wxDefaultPosition, wxBORDER_DEFAULT, true, 24);
+ buttons->Add(cancel_btn, 1, wxLEFT|wxRIGHT, 5);
+ cancel_btn->SetFont(btn_font);
+ cancel_btn->Bind(wxEVT_BUTTON, [this](wxEvent&) { this->EndModal(wxID_CANCEL); });
+
+ m_info_line = new wxStaticText(this, wxID_ANY, "");
+ m_info_line->SetFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT).Bold());
+ m_info_line->Hide();
+
+ m_remember_choice = new wxCheckBox(this, wxID_ANY, _L("Remember my choice"));
+ m_remember_choice->SetValue(wxGetApp().app_config->get(m_app_config_key) != "none");
+ m_remember_choice->Bind(wxEVT_CHECKBOX, [type, this](wxCommandEvent& evt)
+ {
+ if (!evt.IsChecked())
+ return;
+ wxString preferences_item = type == Preset::TYPE_INVALID ? _L("Ask for unsaved changes when closing application") :
+ _L("Ask for unsaved changes when selecting new preset");
+ wxString msg =
+ _L("PrusaSlicer will remember your action.") + "\n\n" +
+ (type == Preset::TYPE_INVALID ?
+ _L("You will not be asked about the unsaved changes the next time you close PrusaSlicer.") :
+ _L("You will not be asked about the unsaved changes the next time you switch a preset.")) + "\n\n" +
+ format_wxstr(_L("Visit \"Preferences\" and check \"%1%\"\nto be asked about unsaved changes again."), preferences_item);
+
+ wxMessageDialog dialog(nullptr, msg, _L("PrusaSlicer: Don't ask me again"), wxOK | wxCANCEL | wxICON_INFORMATION);
+ if (dialog.ShowModal() == wxID_CANCEL)
+ m_remember_choice->SetValue(false);
+ });
+
+ wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL);
+
+ topSizer->Add(m_action_line,0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, border);
+ topSizer->Add(m_tree, 1, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, border);
+ topSizer->Add(m_info_line, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, 2*border);
+ topSizer->Add(buttons, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, border);
+ topSizer->Add(m_remember_choice, 0, wxEXPAND | wxALL, border);
+
+ update(type, dependent_presets, new_selected_preset, header);
+
+ SetSizer(topSizer);
+ topSizer->SetSizeHints(this);
+
+ show_info_line(Action::Undef);
+}
+
+void UnsavedChangesDialog::item_value_changed(wxDataViewEvent& event)
+{
+ if (event.GetColumn() != UnsavedChangesModel::colToggle)
+ return;
+
+ wxDataViewItem item = event.GetItem();
+
+ m_tree_model->UpdateItemEnabling(item);
+ m_tree->Refresh();
+
+ // update an enabling of the "save/move" buttons
+ m_empty_selection = get_selected_options().empty();
+}
+
+void UnsavedChangesDialog::context_menu(wxDataViewEvent& event)
+{
+ if (!m_has_long_strings)
+ return;
+
+ wxDataViewItem item = event.GetItem();
+ if (!item)
+ {
+ wxPoint mouse_pos = wxGetMousePosition() - m_tree->GetScreenPosition();
+ wxDataViewColumn* col = nullptr;
+ m_tree->HitTest(mouse_pos, item, col);
+
+ if (!item)
+ item = m_tree->GetSelection();
+
+ if (!item)
+ return;
+ }
+
+ auto it = m_items_map.find(item);
+ if (it == m_items_map.end() || !it->second.is_long)
+ return;
+ FullCompareDialog(it->second.opt_name, it->second.old_val, it->second.new_val).ShowModal();
+}
+
+void UnsavedChangesDialog::show_info_line(Action action, std::string preset_name)
+{
+ if (action == Action::Undef && !m_has_long_strings)
+ m_info_line->Hide();
+ else {
+ wxString text;
+ if (action == Action::Undef)
+ text = _L("Some fields are too long to fit. Right mouse click reveals the full text.");
+ else if (action == Action::Discard)
+ text = _L("All settings changes will be discarded.");
+ else {
+ if (preset_name.empty())
+ text = action == Action::Save ? _L("Save the selected options.") : _L("Transfer the selected settings to the newly selected preset.");
+ else
+ text = format_wxstr(
+ action == Action::Save ?
+ _L("Save the selected options to preset \"%1%\".") :
+ _L("Transfer the selected options to the newly selected preset \"%1%\"."),
+ preset_name);
+ //text += "\n" + _L("Unselected options will be reverted.");
+ }
+ m_info_line->SetLabel(text);
+ m_info_line->Show();
+ }
+
+ Layout();
+ Refresh();
+}
+
+void UnsavedChangesDialog::update_config(Action action)
+{
+ if (!m_remember_choice->GetValue())
+ return;
+
+ std::string act = action == Action::Transfer ? ActTransfer :
+ action == Action::Discard ? ActDiscard : ActSave;
+ wxGetApp().app_config->set(m_app_config_key, act);
+}
+
+void UnsavedChangesDialog::close(Action action)
+{
+ m_exit_action = action;
+ this->EndModal(wxID_CLOSE);
+}
+
+bool UnsavedChangesDialog::save(PresetCollection* dependent_presets)
+{
+ names_and_types.clear();
+
+ // save one preset
+ if (dependent_presets) {
+ const Preset& preset = dependent_presets->get_edited_preset();
+ std::string name = preset.name;
+
+ // for system/default/external presets we should take an edited name
+ if (preset.is_system || preset.is_default || preset.is_external) {
+ SavePresetDialog save_dlg(this, preset.type);
+ if (save_dlg.ShowModal() != wxID_OK) {
+ m_exit_action = Action::Discard;
+ return false;
+ }
+ name = save_dlg.get_name();
+ }
+
+ names_and_types.emplace_back(make_pair(name, preset.type));
+ }
+ // save all presets
+ else
+ {
+ std::vector<Preset::Type> types_for_save;
+
+ PrinterTechnology printer_technology = wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology();
+
+ for (Tab* tab : wxGetApp().tabs_list)
+ if (tab->supports_printer_technology(printer_technology) && tab->current_preset_is_dirty()) {
+ const Preset& preset = tab->get_presets()->get_edited_preset();
+ if (preset.is_system || preset.is_default || preset.is_external)
+ types_for_save.emplace_back(preset.type);
+
+ names_and_types.emplace_back(make_pair(preset.name, preset.type));
+ }
+
+
+ if (!types_for_save.empty()) {
+ SavePresetDialog save_dlg(this, types_for_save);
+ if (save_dlg.ShowModal() != wxID_OK) {
+ m_exit_action = Action::Discard;
+ return false;
+ }
+
+ for (std::pair<std::string, Preset::Type>& nt : names_and_types) {
+ const std::string& name = save_dlg.get_name(nt.second);
+ if (!name.empty())
+ nt.first = name;
+ }
+ }
+ }
+ return true;
+}
+
+template<class T>
+wxString get_string_from_enum(const std::string& opt_key, const DynamicPrintConfig& config, bool is_infill = false)
+{
+ const ConfigOptionDef& def = config.def()->options.at(opt_key);
+ const std::vector<std::string>& names = def.enum_labels;//ConfigOptionEnum<T>::get_enum_names();
+ T val = config.option<ConfigOptionEnum<T>>(opt_key)->value;
+
+ // Each infill doesn't use all list of infill declared in PrintConfig.hpp.
+ // So we should "convert" val to the correct one
+ if (is_infill) {
+ for (auto key_val : *def.enum_keys_map)
+ if ((int)key_val.second == (int)val) {
+ auto it = std::find(def.enum_values.begin(), def.enum_values.end(), key_val.first);
+ if (it == def.enum_values.end())
+ return "";
+ return from_u8(_utf8(names[it - def.enum_values.begin()]));
+ }
+ return _L("Undef");
+ }
+ return from_u8(_utf8(names[static_cast<int>(val)]));
+}
+
+static int get_id_from_opt_key(std::string opt_key)
+{
+ int pos = opt_key.find("#");
+ if (pos > 0) {
+ boost::erase_head(opt_key, pos + 1);
+ return atoi(opt_key.c_str());
+ }
+ return 0;
+}
+
+static std::string get_pure_opt_key(std::string opt_key)
+{
+ int pos = opt_key.find("#");
+ if (pos > 0)
+ boost::erase_tail(opt_key, opt_key.size() - pos);
+ return opt_key;
+}
+
+static wxString get_string_value(std::string opt_key, const DynamicPrintConfig& config)
+{
+ int opt_idx = get_id_from_opt_key(opt_key);
+ opt_key = get_pure_opt_key(opt_key);
+
+ if (config.option(opt_key)->is_nil())
+ return _L("N/A");
+
+ wxString out;
+
+ const ConfigOptionDef* opt = config.def()->get(opt_key);
+ bool is_nullable = opt->nullable;
+
+ switch (opt->type) {
+ case coInt:
+ return from_u8((boost::format("%1%") % config.opt_int(opt_key)).str());
+ case coInts: {
+ int val = is_nullable ?
+ config.opt<ConfigOptionIntsNullable>(opt_key)->get_at(opt_idx) :
+ config.opt<ConfigOptionInts>(opt_key)->get_at(opt_idx);
+ return from_u8((boost::format("%1%") % val).str());
+ }
+ case coBool:
+ return config.opt_bool(opt_key) ? "true" : "false";
+ case coBools: {
+ bool val = is_nullable ?
+ config.opt<ConfigOptionBoolsNullable>(opt_key)->get_at(opt_idx) :
+ config.opt<ConfigOptionBools>(opt_key)->get_at(opt_idx);
+ return val ? "true" : "false";
+ }
+ case coPercent:
+ return from_u8((boost::format("%1%%%") % int(config.optptr(opt_key)->getFloat())).str());
+ case coPercents: {
+ double val = is_nullable ?
+ config.opt<ConfigOptionPercentsNullable>(opt_key)->get_at(opt_idx) :
+ config.opt<ConfigOptionPercents>(opt_key)->get_at(opt_idx);
+ return from_u8((boost::format("%1%%%") % int(val)).str());
+ }
+ case coFloat:
+ return double_to_string(config.opt_float(opt_key));
+ case coFloats: {
+ double val = is_nullable ?
+ config.opt<ConfigOptionFloatsNullable>(opt_key)->get_at(opt_idx) :
+ config.opt<ConfigOptionFloats>(opt_key)->get_at(opt_idx);
+ return double_to_string(val);
+ }
+ case coString:
+ return from_u8(config.opt_string(opt_key));
+ case coStrings: {
+ const ConfigOptionStrings* strings = config.opt<ConfigOptionStrings>(opt_key);
+ if (strings) {
+ if (opt_key == "compatible_printers" || opt_key == "compatible_prints") {
+ if (strings->empty())
+ return _L("All");
+ for (size_t id = 0; id < strings->size(); id++)
+ out += from_u8(strings->get_at(id)) + "\n";
+ out.RemoveLast(1);
+ return out;
+ }
+ if (!strings->empty())
+ return from_u8(strings->get_at(opt_idx));
+ }
+ break;
+ }
+ case coFloatOrPercent: {
+ const ConfigOptionFloatOrPercent* opt = config.opt<ConfigOptionFloatOrPercent>(opt_key);
+ if (opt)
+ out = double_to_string(opt->value) + (opt->percent ? "%" : "");
+ return out;
+ }
+ case coEnum: {
+ if (opt_key == "top_fill_pattern" ||
+ opt_key == "bottom_fill_pattern" ||
+ opt_key == "fill_pattern")
+ return get_string_from_enum<InfillPattern>(opt_key, config, true);
+ if (opt_key == "gcode_flavor")
+ return get_string_from_enum<GCodeFlavor>(opt_key, config);
+ if (opt_key == "machine_limits_usage")
+ return get_string_from_enum<MachineLimitsUsage>(opt_key, config);
+ if (opt_key == "ironing_type")
+ return get_string_from_enum<IroningType>(opt_key, config);
+ if (opt_key == "support_material_pattern")
+ return get_string_from_enum<SupportMaterialPattern>(opt_key, config);
+ if (opt_key == "seam_position")
+ return get_string_from_enum<SeamPosition>(opt_key, config);
+ if (opt_key == "display_orientation")
+ return get_string_from_enum<SLADisplayOrientation>(opt_key, config);
+ if (opt_key == "support_pillar_connection_mode")
+ return get_string_from_enum<SLAPillarConnectionMode>(opt_key, config);
+ break;
+ }
+ case coPoints: {
+ if (opt_key == "bed_shape") {
+ BedShape shape(*config.option<ConfigOptionPoints>(opt_key));
+ return shape.get_full_name_with_params();
+ }
+ if (opt_key == "thumbnails")
+ return get_thumbnails_string(config.option<ConfigOptionPoints>(opt_key)->values);
+
+ Vec2d val = config.opt<ConfigOptionPoints>(opt_key)->get_at(opt_idx);
+ return from_u8((boost::format("[%1%]") % ConfigOptionPoint(val).serialize()).str());
+ }
+ default:
+ break;
+ }
+ return out;
+}
+
+wxString UnsavedChangesDialog::get_short_string(wxString full_string)
+{
+ int max_len = 30;
+ if (full_string.IsEmpty() || full_string.StartsWith("#") ||
+ (full_string.Find("\n") == wxNOT_FOUND && full_string.Length() < max_len))
+ return full_string;
+
+ m_has_long_strings = true;
+
+ int n_pos = full_string.Find("\n");
+ if (n_pos != wxNOT_FOUND && n_pos < max_len)
+ max_len = n_pos;
+
+ full_string.Truncate(max_len);
+ return full_string + dots;
+}
+
+void UnsavedChangesDialog::update(Preset::Type type, PresetCollection* dependent_presets, const std::string& new_selected_preset, const wxString& header)
+{
+ PresetCollection* presets = dependent_presets;
+
+ // activate buttons and labels
+ m_save_btn ->Bind(wxEVT_ENTER_WINDOW, [this, presets] (wxMouseEvent& e) { show_info_line(Action::Save, presets ? presets->get_selected_preset().name : ""); e.Skip(); });
+ if (m_transfer_btn) {
+ bool is_empty_name = type != dependent_presets->type();
+ m_transfer_btn ->Bind(wxEVT_ENTER_WINDOW, [this, new_selected_preset, is_empty_name] (wxMouseEvent& e) { show_info_line(Action::Transfer, is_empty_name ? "" : new_selected_preset); e.Skip(); });
+ }
+ m_discard_btn ->Bind(wxEVT_ENTER_WINDOW, [this] (wxMouseEvent& e) { show_info_line(Action::Discard); e.Skip(); });
+
+
+ if (type == Preset::TYPE_INVALID) {
+ m_action_line->SetLabel(header + "\n" + _L("The following presets were modified:"));
+ }
+ else {
+ wxString action_msg;
+ if (type == dependent_presets->type()) {
+ action_msg = format_wxstr(_L("Preset \"%1%\" has the following unsaved changes:"), presets->get_edited_preset().name);
+ }
+ else {
+ action_msg = format_wxstr(type == Preset::TYPE_PRINTER ?
+ _L("Preset \"%1%\" is not compatible with the new printer profile and it has the following unsaved changes:") :
+ _L("Preset \"%1%\" is not compatible with the new print profile and it has the following unsaved changes:"),
+ presets->get_edited_preset().name);
+ }
+ m_action_line->SetLabel(action_msg);
+ }
+
+ update_tree(type, presets);
+}
+
+void UnsavedChangesDialog::update_tree(Preset::Type type, PresetCollection* presets_)
+{
+ Search::OptionsSearcher& searcher = wxGetApp().sidebar().get_searcher();
+ searcher.sort_options_by_opt_key();
+
+ // list of the presets with unsaved changes
+ std::vector<PresetCollection*> presets_list;
+ if (type == Preset::TYPE_INVALID)
+ {
+ PrinterTechnology printer_technology = wxGetApp().preset_bundle->printers.get_edited_preset().printer_technology();
+
+ for (Tab* tab : wxGetApp().tabs_list)
+ if (tab->supports_printer_technology(printer_technology) && tab->current_preset_is_dirty())
+ presets_list.emplace_back(tab->get_presets());
+ }
+ else
+ presets_list.emplace_back(presets_);
+
+ // Display a dialog showing the dirty options in a human readable form.
+ for (PresetCollection* presets : presets_list)
+ {
+ const DynamicPrintConfig& old_config = presets->get_selected_preset().config;
+ const PrinterTechnology& old_pt = presets->get_selected_preset().printer_technology();
+ const DynamicPrintConfig& new_config = presets->get_edited_preset().config;
+ type = presets->type();
+
+ const std::map<wxString, std::string>& category_icon_map = wxGetApp().get_tab(type)->get_category_icon_map();
+
+ m_tree_model->AddPreset(type, from_u8(presets->get_edited_preset().name), old_pt);
+
+ // Collect dirty options.
+ const bool deep_compare = (type == Preset::TYPE_PRINTER || type == Preset::TYPE_SLA_MATERIAL);
+ auto dirty_options = presets->current_dirty_options(deep_compare);
+
+ // process changes of extruders count
+ if (type == Preset::TYPE_PRINTER && old_pt == ptFFF &&
+ old_config.opt<ConfigOptionStrings>("extruder_colour")->values.size() != new_config.opt<ConfigOptionStrings>("extruder_colour")->values.size()) {
+ wxString local_label = _L("Extruders count");
+ wxString old_val = from_u8((boost::format("%1%") % old_config.opt<ConfigOptionStrings>("extruder_colour")->values.size()).str());
+ wxString new_val = from_u8((boost::format("%1%") % new_config.opt<ConfigOptionStrings>("extruder_colour")->values.size()).str());
+
+ ItemData item_data = { "extruders_count", local_label, old_val, new_val, type };
+ m_items_map.emplace(m_tree_model->AddOption(type, _L("General"), _L("Capabilities"), local_label, old_val, new_val, category_icon_map.at("General")), item_data);
+
+ }
+
+ for (const std::string& opt_key : dirty_options) {
+ const Search::Option& option = searcher.get_option(opt_key);
+ if (option.opt_key != boost::nowide::widen(opt_key)) {
+ // When founded option isn't the correct one.
+ // It can be for dirty_options: "default_print_profile", "printer_model", "printer_settings_id",
+ // because of they don't exist in searcher
+ continue;
+ }
+
+ ItemData item_data = { opt_key, option.label_local, get_string_value(opt_key, old_config), get_string_value(opt_key, new_config), type };
+
+ wxString old_val = get_short_string(item_data.old_val);
+ wxString new_val = get_short_string(item_data.new_val);
+ if (old_val != item_data.old_val || new_val != item_data.new_val)
+ item_data.is_long = true;
+
+ m_items_map.emplace(m_tree_model->AddOption(type, option.category_local, option.group_local, option.label_local, old_val, new_val, category_icon_map.at(option.category)), item_data);
+ }
+ }
+}
+
+std::vector<std::string> UnsavedChangesDialog::get_unselected_options(Preset::Type type)
+{
+ std::vector<std::string> ret;
+
+ for (auto item : m_items_map) {
+ if (item.second.opt_key == "extruders_count")
+ continue;
+ if (item.second.type == type && !m_tree_model->IsEnabledItem(item.first))
+ ret.emplace_back(get_pure_opt_key(item.second.opt_key));
+ }
+
+ return ret;
+}
+
+std::vector<std::string> UnsavedChangesDialog::get_selected_options()
+{
+ std::vector<std::string> ret;
+
+ for (auto item : m_items_map)
+ if (m_tree_model->IsEnabledItem(item.first))
+ ret.emplace_back(get_pure_opt_key(item.second.opt_key));
+
+ return ret;
+}
+
+void UnsavedChangesDialog::on_dpi_changed(const wxRect& suggested_rect)
+{
+ int em = em_unit();
+
+ msw_buttons_rescale(this, em, { wxID_CANCEL, m_save_btn_id, m_move_btn_id, m_continue_btn_id });
+ for (auto btn : { m_save_btn, m_transfer_btn, m_discard_btn } )
+ if (btn) btn->msw_rescale();
+
+ const wxSize& size = wxSize(80 * em, 30 * em);
+ SetMinSize(size);
+
+ m_tree->GetColumn(UnsavedChangesModel::colToggle )->SetWidth(6 * em);
+ m_tree->GetColumn(UnsavedChangesModel::colIconText)->SetWidth(30 * em);
+ m_tree->GetColumn(UnsavedChangesModel::colOldValue)->SetWidth(20 * em);
+ m_tree->GetColumn(UnsavedChangesModel::colNewValue)->SetWidth(20 * em);
+
+ m_tree_model->Rescale();
+ m_tree->Refresh();
+
+ Fit();
+ Refresh();
+}
+
+void UnsavedChangesDialog::on_sys_color_changed()
+{
+ for (auto btn : { m_save_btn, m_transfer_btn, m_discard_btn } )
+ btn->msw_rescale();
+ // msw_rescale updates just icons, so use it
+ m_tree_model->Rescale();
+ m_tree->Refresh();
+
+ Refresh();
+}
+
+
+//------------------------------------------
+// FullCompareDialog
+//------------------------------------------
+
+FullCompareDialog::FullCompareDialog(const wxString& option_name, const wxString& old_value, const wxString& new_value)
+ : wxDialog(nullptr, wxID_ANY, option_name, wxDefaultPosition, wxDefaultSize, wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER)
+{
+ wxColour bgr_clr = wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW);
+ SetBackgroundColour(bgr_clr);
+
+ int border = 10;
+
+ wxStaticBoxSizer* sizer = new wxStaticBoxSizer(wxVERTICAL, this);
+
+ wxFlexGridSizer* grid_sizer = new wxFlexGridSizer(2, 2, 1, 0);
+ grid_sizer->SetFlexibleDirection(wxBOTH);
+ grid_sizer->AddGrowableCol(0,1);
+ grid_sizer->AddGrowableCol(1,1);
+ grid_sizer->AddGrowableRow(1,1);
+
+ auto add_header = [grid_sizer, border, this](wxString label) {
+ wxStaticText* text = new wxStaticText(this, wxID_ANY, label);
+ text->SetFont(this->GetFont().Bold());
+ grid_sizer->Add(text, 0, wxALL, border);
+ };
+
+ auto add_value = [grid_sizer, border, this](wxString label, bool is_colored = false) {
+ wxTextCtrl* text = new wxTextCtrl(this, wxID_ANY, label, wxDefaultPosition, wxSize(300, -1), wxTE_MULTILINE | wxTE_READONLY | wxBORDER_NONE | wxTE_RICH);
+ text->SetStyle(0, label.Len(), wxTextAttr(is_colored ? wxColour(orange) : wxNullColour, wxNullColour, this->GetFont()));
+ grid_sizer->Add(text, 1, wxALL | wxEXPAND, border);
+ };
+
+ add_header(_L("Old value"));
+ add_header(_L("New value"));
+ add_value(old_value);
+ add_value(new_value, true);
+
+ sizer->Add(grid_sizer, 1, wxEXPAND);
+
+ wxStdDialogButtonSizer* buttons = this->CreateStdDialogButtonSizer(wxOK);
+
+ wxBoxSizer* topSizer = new wxBoxSizer(wxVERTICAL);
+
+ topSizer->Add(sizer, 1, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, border);
+ topSizer->Add(buttons, 0, wxEXPAND | wxALL, border);
+
+ SetSizer(topSizer);
+ topSizer->SetSizeHints(this);
+}
+
+
+
+}
+
+} // namespace Slic3r::GUI
diff --git a/src/slic3r/GUI/UnsavedChangesDialog.hpp b/src/slic3r/GUI/UnsavedChangesDialog.hpp
new file mode 100644
index 000000000..232802b66
--- /dev/null
+++ b/src/slic3r/GUI/UnsavedChangesDialog.hpp
@@ -0,0 +1,276 @@
+#ifndef slic3r_UnsavedChangesDialog_hpp_
+#define slic3r_UnsavedChangesDialog_hpp_
+
+#include <wx/dataview.h>
+#include <map>
+#include <vector>
+
+#include "GUI_Utils.hpp"
+#include "wxExtensions.hpp"
+#include "libslic3r/Preset.hpp"
+
+class ScalableButton;
+class wxStaticText;
+
+namespace Slic3r {
+namespace GUI{
+
+// ----------------------------------------------------------------------------
+// ModelNode: a node inside UnsavedChangesModel
+// ----------------------------------------------------------------------------
+
+class ModelNode;
+using ModelNodePtrArray = std::vector<std::unique_ptr<ModelNode>>;
+
+// On all of 3 different platforms Bitmap+Text icon column looks different
+// because of Markup text is missed or not implemented.
+// As a temporary workaround, we will use:
+// MSW - DataViewBitmapText (our custom renderer wxBitmap + wxString, supported Markup text)
+// OSX - -//-, but Markup text is not implemented right now
+// GTK - wxDataViewIconText (wxWidgets for GTK renderer wxIcon + wxString, supported Markup text)
+class ModelNode
+{
+ wxWindow* m_parent_win{ nullptr };
+
+ ModelNode* m_parent;
+ ModelNodePtrArray m_children;
+ wxBitmap m_empty_bmp;
+ Preset::Type m_preset_type {Preset::TYPE_INVALID};
+
+ std::string m_icon_name;
+ // saved values for colors if they exist
+ wxString m_old_color;
+ wxString m_new_color;
+
+ // TODO/FIXME:
+ // the GTK version of wxDVC (in particular wxDataViewCtrlInternal::ItemAdded)
+ // needs to know in advance if a node is or _will be_ a container.
+ // Thus implementing:
+ // bool IsContainer() const
+ // { return m_children.size()>0; }
+ // doesn't work with wxGTK when UnsavedChangesModel::AddToClassical is called
+ // AND the classical node was removed (a new node temporary without children
+ // would be added to the control)
+ bool m_container {true};
+
+#ifdef __linux__
+ wxIcon get_bitmap(const wxString& color);
+#else
+ wxBitmap get_bitmap(const wxString& color);
+#endif //__linux__
+
+public:
+
+ bool m_toggle {true};
+#ifdef __linux__
+ wxIcon m_icon;
+ wxIcon m_old_color_bmp;
+ wxIcon m_new_color_bmp;
+#else
+ wxBitmap m_icon;
+ wxBitmap m_old_color_bmp;
+ wxBitmap m_new_color_bmp;
+#endif //__linux__
+ wxString m_text;
+ wxString m_old_value;
+ wxString m_new_value;
+
+ // preset(root) node
+ ModelNode(Preset::Type preset_type, wxWindow* parent_win, const wxString& text, const std::string& icon_name);
+
+ // category node
+ ModelNode(ModelNode* parent, const wxString& text, const std::string& icon_name);
+
+ // group node
+ ModelNode(ModelNode* parent, const wxString& text);
+
+ // option node
+ ModelNode(ModelNode* parent, const wxString& text, const wxString& old_value, const wxString& new_value);
+
+ bool IsContainer() const { return m_container; }
+ bool IsToggled() const { return m_toggle; }
+ void Toggle(bool toggle = true) { m_toggle = toggle; }
+ bool IsRoot() const { return m_parent == nullptr; }
+ Preset::Type type() const { return m_preset_type; }
+ const wxString& text() const { return m_text; }
+
+ ModelNode* GetParent() { return m_parent; }
+ ModelNodePtrArray& GetChildren() { return m_children; }
+ ModelNode* GetNthChild(unsigned int n) { return m_children[n].get(); }
+ unsigned int GetChildCount() const { return m_children.size(); }
+
+ void Append(std::unique_ptr<ModelNode> child) { m_children.emplace_back(std::move(child)); }
+
+ void UpdateEnabling();
+ void UpdateIcons();
+};
+
+
+// ----------------------------------------------------------------------------
+// UnsavedChangesModel
+// ----------------------------------------------------------------------------
+
+class UnsavedChangesModel : public wxDataViewModel
+{
+ wxWindow* m_parent_win { nullptr };
+ std::vector<ModelNode*> m_preset_nodes;
+
+ wxDataViewCtrl* m_ctrl{ nullptr };
+
+ ModelNode *AddOption(ModelNode *group_node,
+ wxString option_name,
+ wxString old_value,
+ wxString new_value);
+ ModelNode *AddOptionWithGroup(ModelNode *category_node,
+ wxString group_name,
+ wxString option_name,
+ wxString old_value,
+ wxString new_value);
+ ModelNode *AddOptionWithGroupAndCategory(ModelNode *preset_node,
+ wxString category_name,
+ wxString group_name,
+ wxString option_name,
+ wxString old_value,
+ wxString new_value,
+ const std::string category_icon_name);
+
+public:
+ enum {
+ colToggle,
+ colIconText,
+ colOldValue,
+ colNewValue,
+ colMax
+ };
+
+ UnsavedChangesModel(wxWindow* parent);
+ ~UnsavedChangesModel();
+
+ void SetAssociatedControl(wxDataViewCtrl* ctrl) { m_ctrl = ctrl; }
+
+ wxDataViewItem AddPreset(Preset::Type type, wxString preset_name, PrinterTechnology pt);
+ wxDataViewItem AddOption(Preset::Type type, wxString category_name, wxString group_name, wxString option_name,
+ wxString old_value, wxString new_value, const std::string category_icon_name);
+
+ void UpdateItemEnabling(wxDataViewItem item);
+ bool IsEnabledItem(const wxDataViewItem& item);
+
+ unsigned int GetColumnCount() const override { return colMax; }
+ wxString GetColumnType(unsigned int col) const override;
+ void Rescale();
+
+ wxDataViewItem GetParent(const wxDataViewItem& item) const override;
+ unsigned int GetChildren(const wxDataViewItem& parent, wxDataViewItemArray& array) const override;
+
+ void GetValue(wxVariant& variant, const wxDataViewItem& item, unsigned int col) const override;
+ bool SetValue(const wxVariant& variant, const wxDataViewItem& item, unsigned int col) override;
+
+ bool IsEnabled(const wxDataViewItem& item, unsigned int col) const override;
+ bool IsContainer(const wxDataViewItem& item) const override;
+ // Is the container just a header or an item with all columns
+ // In our case it is an item with all columns
+ bool HasContainerColumns(const wxDataViewItem& WXUNUSED(item)) const override { return true; }
+};
+
+
+//------------------------------------------
+// UnsavedChangesDialog
+//------------------------------------------
+class UnsavedChangesDialog : public DPIDialog
+{
+ wxDataViewCtrl* m_tree { nullptr };
+ UnsavedChangesModel* m_tree_model { nullptr };
+
+ ScalableButton* m_save_btn { nullptr };
+ ScalableButton* m_transfer_btn { nullptr };
+ ScalableButton* m_discard_btn { nullptr };
+ wxStaticText* m_action_line { nullptr };
+ wxStaticText* m_info_line { nullptr };
+ wxCheckBox* m_remember_choice { nullptr };
+
+ bool m_empty_selection { false };
+ bool m_has_long_strings { false };
+ int m_save_btn_id { wxID_ANY };
+ int m_move_btn_id { wxID_ANY };
+ int m_continue_btn_id { wxID_ANY };
+
+ std::string m_app_config_key;
+
+ enum class Action {
+ Undef,
+ Transfer,
+ Discard,
+ Save
+ };
+
+ static constexpr char ActTransfer[] = "transfer";
+ static constexpr char ActDiscard[] = "discard";
+ static constexpr char ActSave[] = "save";
+
+ // selected action after Dialog closing
+ Action m_exit_action {Action::Undef};
+
+ struct ItemData
+ {
+ std::string opt_key;
+ wxString opt_name;
+ wxString old_val;
+ wxString new_val;
+ Preset::Type type;
+ bool is_long {false};
+ };
+ // tree items related to the options
+ std::map<wxDataViewItem, ItemData> m_items_map;
+
+ // preset names which are modified in SavePresetDialog and related types
+ std::vector<std::pair<std::string, Preset::Type>> names_and_types;
+
+public:
+ UnsavedChangesDialog(const wxString& header);
+ UnsavedChangesDialog(Preset::Type type, PresetCollection* dependent_presets, const std::string& new_selected_preset);
+ ~UnsavedChangesDialog() {}
+
+ wxString get_short_string(wxString full_string);
+
+ void build(Preset::Type type, PresetCollection* dependent_presets, const std::string& new_selected_preset, const wxString& header = "");
+ void update(Preset::Type type, PresetCollection* dependent_presets, const std::string& new_selected_preset, const wxString& header);
+ void update_tree(Preset::Type type, PresetCollection *presets);
+ void item_value_changed(wxDataViewEvent &event);
+ void context_menu(wxDataViewEvent &event);
+ void show_info_line(Action action, std::string preset_name = "");
+ void update_config(Action action);
+ void close(Action action);
+ bool save(PresetCollection* dependent_presets);
+
+ bool save_preset() const { return m_exit_action == Action::Save; }
+ bool transfer_changes() const { return m_exit_action == Action::Transfer; }
+ bool discard() const { return m_exit_action == Action::Discard; }
+
+ // get full bundle of preset names and types for saving
+ const std::vector<std::pair<std::string, Preset::Type>>& get_names_and_types() { return names_and_types; }
+ // short version of the previous function, for the case, when just one preset is modified
+ std::string get_preset_name() { return names_and_types[0].first; }
+
+ std::vector<std::string> get_unselected_options(Preset::Type type);
+ std::vector<std::string> get_selected_options();
+
+protected:
+ void on_dpi_changed(const wxRect& suggested_rect) override;
+ void on_sys_color_changed() override;
+};
+
+
+//------------------------------------------
+// FullCompareDialog
+//------------------------------------------
+class FullCompareDialog : public wxDialog
+{
+public:
+ FullCompareDialog(const wxString& option_name, const wxString& old_value, const wxString& new_value);
+ ~FullCompareDialog() {}
+};
+
+}
+}
+
+#endif //slic3r_UnsavedChangesDialog_hpp_
diff --git a/src/slic3r/GUI/UpdateDialogs.cpp b/src/slic3r/GUI/UpdateDialogs.cpp
index b3b35d68d..97a3e3880 100644
--- a/src/slic3r/GUI/UpdateDialogs.cpp
+++ b/src/slic3r/GUI/UpdateDialogs.cpp
@@ -25,7 +25,7 @@ namespace Slic3r {
namespace GUI {
-static const char* URL_CHANGELOG = "http://files.prusa3d.com/?latest=slicer-stable&lng=%1%";
+static const char* URL_CHANGELOG = "https://files.prusa3d.com/?latest=slicer-stable&lng=%1%";
static const char* URL_DOWNLOAD = "https://www.prusa3d.com/downloads&lng=%1%";
static const char* URL_DEV = "https://github.com/prusa3d/PrusaSlicer/releases/tag/version_%1%";
diff --git a/src/slic3r/GUI/format.hpp b/src/slic3r/GUI/format.hpp
new file mode 100644
index 000000000..894803917
--- /dev/null
+++ b/src/slic3r/GUI/format.hpp
@@ -0,0 +1,73 @@
+#ifndef slic3r_GUI_format_hpp_
+#define slic3r_GUI_format_hpp_
+
+// Functional wrapper around boost::format.
+// One day we may replace this wrapper with C++20 format
+// https://en.cppreference.com/w/cpp/utility/format/format
+// though C++20 format uses a different template pattern for position independent parameters.
+// This wrapper also manages implicit conversion from wxString to UTF8 and format_wxstr() variants are provided to format into wxString.
+
+#include <libslic3r/format.hpp>
+
+namespace Slic3r {
+namespace GUI {
+
+// Format input mixing UTF8 encoded strings (const char*, std::string) and wxStrings, return a wxString.
+template<typename... TArgs>
+inline wxString format_wxstr(const char* fmt, TArgs&&... args) {
+ boost::format message(fmt);
+ return wxString::FromUTF8(Slic3r::internal::format::format_recursive(message, std::forward<TArgs>(args)...).c_str());
+}
+template<typename... TArgs>
+inline wxString format_wxstr(const std::string& fmt, TArgs&&... args) {
+ boost::format message(fmt);
+ return wxString::FromUTF8(Slic3r::internal::format::format_recursive(message, std::forward<TArgs>(args)...).c_str());
+}
+template<typename... TArgs>
+inline wxString format_wxstr(const wxString& fmt, TArgs&&... args) {
+ return format_wxstr(fmt.ToUTF8().data(), std::forward<TArgs>(args)...);
+}
+template<typename... TArgs>
+inline std::string format(const wxString& fmt, TArgs&&... args) {
+ return Slic3r::format(fmt.ToUTF8().data(), std::forward<TArgs>(args)...);
+}
+
+} // namespace GUI
+
+namespace internal {
+ namespace format {
+ // Wrapper around wxScopedCharBuffer to indicate that the content is UTF8 formatted.
+ struct utf8_buffer {
+ // wxScopedCharBuffer is reference counted, therefore copying by value is cheap.
+ wxScopedCharBuffer data;
+ };
+ // Accept wxString and convert it to UTF8 to be processed by Slic3r::format().
+ inline const utf8_buffer cook(const wxString &arg) {
+ return utf8_buffer { arg.ToUTF8() };
+ }
+ // Vojtech seemingly does not understand perfect forwarding:
+ // Why Slic3r::internal::format::cook(T&& arg) is taken for non-const wxString reference?
+ inline const utf8_buffer cook(wxString &arg) {
+ return utf8_buffer { arg.ToUTF8() };
+ }
+ inline const utf8_buffer cook(wxString &&arg) {
+ return utf8_buffer{ arg.ToUTF8() };
+ }
+ }
+}
+
+} // namespace Slic3r
+
+namespace boost {
+ namespace io {
+ namespace detail {
+ // Adaptor for boost::format to accept wxString converted to UTF8.
+ inline std::ostream& operator<<(std::ostream& os, const Slic3r::internal::format::utf8_buffer& str) {
+ os << str.data.data();
+ return os;
+ }
+ }
+ }
+}
+
+#endif /* slic3r_GUI_format_hpp_ */
diff --git a/src/slic3r/GUI/fts_fuzzy_match.h b/src/slic3r/GUI/fts_fuzzy_match.h
new file mode 100644
index 000000000..4dd206aac
--- /dev/null
+++ b/src/slic3r/GUI/fts_fuzzy_match.h
@@ -0,0 +1,260 @@
+// LICENSE
+//
+// This software is dual-licensed to the public domain and under the following
+// license: you are granted a perpetual, irrevocable license to copy, modify,
+// publish, and distribute this file as you see fit.
+//
+// VERSION
+// 0.2.0 (2017-02-18) Scored matches perform exhaustive search for best score
+// 0.1.0 (2016-03-28) Initial release
+//
+// AUTHOR
+// Forrest Smith
+//
+// NOTES
+// Compiling
+// You MUST add '#define FTS_FUZZY_MATCH_IMPLEMENTATION' before including this header in ONE source file to create implementation.
+//
+// fuzzy_match_simple(...)
+// Returns true if each character in pattern is found sequentially within str
+//
+// fuzzy_match(...)
+// Returns true if pattern is found AND calculates a score.
+// Performs exhaustive search via recursion to find all possible matches and match with highest score.
+// Scores values have no intrinsic meaning. Possible score range is not normalized and varies with pattern.
+// Recursion is limited internally (default=10) to prevent degenerate cases (pattern="aaaaaa" str="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaa")
+// Uses uint8_t for match indices. Therefore patterns are limited to max_matches characters.
+// Score system should be tuned for YOUR use case. Words, sentences, file names, or method names all prefer different tuning.
+
+
+#ifndef FTS_FUZZY_MATCH_H
+#define FTS_FUZZY_MATCH_H
+
+
+#include <cstdint> // uint8_t
+#include <ctype.h> // ::tolower, ::toupper
+#include <cstring> // memcpy
+
+#include <cstdio>
+
+#include "../Utils/ASCIIFolding.hpp"
+
+// Public interface
+namespace fts {
+ using char_type = wchar_t;
+ using pos_type = uint16_t;
+ static constexpr pos_type stopper = pos_type(-1);
+ static constexpr int max_matches = 255;
+
+ static bool fuzzy_match(char_type const * pattern, char_type const * str, int & outScore);
+ static bool fuzzy_match(char_type const * pattern, char_type const * str, int & outScore, pos_type * matches);
+}
+
+#ifdef FTS_FUZZY_MATCH_IMPLEMENTATION
+namespace fts {
+
+ // Forward declarations for "private" implementation
+ namespace fuzzy_internal {
+ static bool fuzzy_match_recursive(const char_type * pattern, const char_type * str, int & outScore, const char_type * const strBegin,
+ pos_type const * srcMatches, pos_type * newMatches, int nextMatch,
+ int recursionCount, const int recursionLimit);
+ static void copy_matches(pos_type * dst, pos_type const* src);
+ }
+
+ // Public interface
+ static bool fuzzy_match(char_type const * pattern, char_type const * str, int & outScore) {
+ pos_type matches[max_matches + 1]; // with the room for the stopper
+ matches[0] = stopper;
+ return fuzzy_match(pattern, str, outScore, matches);
+ }
+
+ static bool fuzzy_match(char_type const * pattern, char_type const * str, int & outScore, pos_type * matches) {
+ int recursionCount = 0;
+ static constexpr int recursionLimit = 10;
+ return fuzzy_internal::fuzzy_match_recursive(pattern, str, outScore, str, nullptr, matches, 0, recursionCount, recursionLimit);
+ }
+
+ // Private implementation
+ static bool fuzzy_internal::fuzzy_match_recursive(
+ // Pattern to match over str.
+ const char_type * pattern,
+ // Text to match the pattern over.
+ const char_type * str,
+ // Score of the pattern matching str. Output variable.
+ int & outScore,
+ // The very start of str, for calculating indices of matches and for calculating matches from the start of the input string.
+ const char_type * const strBegin,
+ // Matches when entering this function.
+ pos_type const * srcMatches,
+ // Output matches.
+ pos_type * matches,
+ // Number of matched characters stored in srcMatches when entering this function, also tracking the successive matches.
+ int nextMatch,
+ // Recursion count is input / output to track the maximum depth reached.
+ // Was given by reference &recursionCount, see discussion in https://github.com/forrestthewoods/lib_fts/issues/21
+// int & recursionCount,
+ int recursionCount,
+ const int recursionLimit)
+ {
+ // Count recursions
+ if (++ recursionCount >= recursionLimit)
+ return false;
+
+ // Detect end of strings
+ if (*pattern == '\0' || *str == '\0')
+ return false;
+
+ // Recursion params
+ bool recursiveMatch = false;
+ pos_type bestRecursiveMatches[max_matches + 1]; // with the room for the stopper
+ int bestRecursiveScore = 0;
+
+ // Loop through pattern and str looking for a match
+ bool first_match = true;
+ while (*pattern != '\0' && *str != '\0') {
+
+ int num_matched = std::tolower(*pattern) == std::tolower(*str) ? 1 : 0;
+ bool folded_match = false;
+ if (! num_matched) {
+ wchar_t tmp[4];
+ wchar_t *end = Slic3r::fold_to_ascii(*str, tmp);
+ wchar_t *c = tmp;
+ for (const wchar_t* d = pattern; c != end && *d != 0 && std::towlower(*c) == std::towlower(*d); ++c, ++d);
+ if (c == end) {
+ folded_match = true;
+ num_matched = end - tmp;
+ }
+ }
+
+ // Found match
+ if (num_matched) {
+
+ // Supplied matches buffer was too short
+ if (nextMatch + num_matched > max_matches)
+ return false;
+
+ // "Copy-on-Write" srcMatches into matches
+ if (first_match && srcMatches) {
+ memcpy(matches, srcMatches, sizeof(pos_type) * (nextMatch + 1)); // including the stopper
+ first_match = false;
+ }
+
+ // Recursive call that "skips" this match
+ pos_type recursiveMatches[max_matches + 1]; // with the room for the stopper
+ int recursiveScore;
+ if (fuzzy_match_recursive(pattern, str + 1, recursiveScore, strBegin, matches, recursiveMatches, nextMatch, recursionCount, recursionLimit)) {
+
+ // Pick best recursive score
+ if (!recursiveMatch || recursiveScore > bestRecursiveScore) {
+ copy_matches(bestRecursiveMatches, recursiveMatches);
+ bestRecursiveScore = recursiveScore;
+ }
+ recursiveMatch = true;
+ }
+
+ // Advance
+ matches[nextMatch++] = (pos_type)(str - strBegin);
+ // Write a stopper sign.
+ matches[nextMatch] = stopper;
+ // Advance pattern by the number of matched characters (could be more if ASCII folding triggers in).
+ pattern += num_matched;
+ }
+ ++str;
+ }
+
+ // Determine if full pattern was matched
+ bool matched = *pattern == '\0';
+
+ // Calculate score
+ if (matched) {
+ static constexpr int sequential_bonus = 15; // bonus for adjacent matches
+ static constexpr int separator_bonus = 30; // bonus if match occurs after a separator
+ static constexpr int camel_bonus = 30; // bonus if match is uppercase and prev is lower
+ static constexpr int first_letter_bonus = 15; // bonus if the first letter is matched
+
+ static constexpr int leading_letter_penalty = -5; // penalty applied for every letter in str before the first match
+ static constexpr int max_leading_letter_penalty = -15; // maximum penalty for leading letters
+ static constexpr int unmatched_letter_penalty = -1; // penalty for every letter that doesn't matter
+
+ // Iterate str to end
+ while (*str != '\0')
+ ++str;
+
+ // Initialize score
+ outScore = 100;
+
+ // Start of the first group that contains matches[0].
+ const char_type *group_start = strBegin + matches[0];
+ for (const char_type *c = group_start; c >= strBegin && *c != ':'; -- c)
+ if (*c != ' ' && *c != '\t')
+ group_start = c;
+
+ // Apply leading letter penalty or bonus.
+ outScore += matches[0] == int(group_start - strBegin) ?
+ first_letter_bonus :
+ std::max((matches[0] - int(group_start - strBegin)) * leading_letter_penalty, max_leading_letter_penalty);
+
+ // Apply unmatched letters after the end penalty
+// outScore += (int(str - group_start) - matches[nextMatch-1] + 1) * unmatched_letter_penalty;
+ // Apply unmatched penalty
+ outScore += (int(str - group_start) - nextMatch) * unmatched_letter_penalty;
+
+ // Apply ordering bonuses
+ int sequential_state = sequential_bonus;
+ for (int i = 0; i < nextMatch; ++i) {
+ pos_type currIdx = matches[i];
+
+ // Check for bonuses based on neighbor character value
+ if (currIdx > 0) {
+ if (i > 0 && currIdx == matches[i - 1] + 1) {
+ // Sequential
+ outScore += sequential_state;
+ // Exponential grow of the sequential bonus.
+ sequential_state = std::min(5 * sequential_bonus, sequential_state + sequential_state / 3);
+ } else {
+ // Reset the sequential bonus exponential grow.
+ sequential_state = sequential_bonus;
+ }
+ char_type prev = strBegin[currIdx - 1];
+/*
+ // Camel case
+ if (std::islower(prev) && std::isupper(strBegin[currIdx]))
+ outScore += camel_bonus;
+*/
+ // Separator
+ if (prev == '_' || prev == ' ')
+ outScore += separator_bonus;
+ }
+ }
+ }
+
+ // Return best result
+ if (recursiveMatch && (!matched || bestRecursiveScore > outScore)) {
+ // Recursive score is better than "this"
+ copy_matches(matches, bestRecursiveMatches);
+ outScore = bestRecursiveScore;
+ return true;
+ }
+ else if (matched) {
+ // "this" score is better than recursive
+ return true;
+ }
+ else {
+ // no match
+ return false;
+ }
+ }
+
+ // Copy matches up to a stopper.
+ static void fuzzy_internal::copy_matches(pos_type * dst, pos_type const* src)
+ {
+ while (*src != stopper)
+ *dst++ = *src++;
+ *dst = stopper;
+ }
+
+} // namespace fts
+
+#endif // FTS_FUZZY_MATCH_IMPLEMENTATION
+
+#endif // FTS_FUZZY_MATCH_H
diff --git a/src/slic3r/GUI/wxExtensions.cpp b/src/slic3r/GUI/wxExtensions.cpp
index c9f1de168..e2566e3f9 100644
--- a/src/slic3r/GUI/wxExtensions.cpp
+++ b/src/slic3r/GUI/wxExtensions.cpp
@@ -13,9 +13,11 @@
#include "GUI_ObjectList.hpp"
#include "I18N.hpp"
#include "GUI_Utils.hpp"
+#include "Plater.hpp"
#include "../Utils/MacDarkMode.hpp"
-#ifndef __WXGTK__// msw_menuitem_bitmaps is used for MSW and OSX
+#ifndef __linux__
+// msw_menuitem_bitmaps is used for MSW and OSX
static std::map<int, std::string> msw_menuitem_bitmaps;
#ifdef __WXMSW__
void msw_rescale_menu(wxMenu* menu)
@@ -58,7 +60,7 @@ void enable_menu_item(wxUpdateUIEvent& evt, std::function<bool()> const cb_condi
wxMenuItem* append_menu_item(wxMenu* menu, int id, const wxString& string, const wxString& description,
std::function<void(wxCommandEvent& event)> cb, const wxBitmap& icon, wxEvtHandler* event_handler,
- std::function<bool()> const cb_condition, wxWindow* parent)
+ std::function<bool()> const cb_condition, wxWindow* parent, int insert_pos/* = wxNOT_FOUND*/)
{
if (id == wxID_ANY)
id = wxNewId();
@@ -67,7 +69,10 @@ wxMenuItem* append_menu_item(wxMenu* menu, int id, const wxString& string, const
if (icon.IsOk()) {
item->SetBitmap(icon);
}
- menu->Append(item);
+ if (insert_pos == wxNOT_FOUND)
+ menu->Append(item);
+ else
+ menu->Insert(insert_pos, item);
#ifdef __WXMSW__
if (event_handler != nullptr && event_handler != menu)
@@ -86,7 +91,7 @@ wxMenuItem* append_menu_item(wxMenu* menu, int id, const wxString& string, const
wxMenuItem* append_menu_item(wxMenu* menu, int id, const wxString& string, const wxString& description,
std::function<void(wxCommandEvent& event)> cb, const std::string& icon, wxEvtHandler* event_handler,
- std::function<bool()> const cb_condition, wxWindow* parent)
+ std::function<bool()> const cb_condition, wxWindow* parent, int insert_pos/* = wxNOT_FOUND*/)
{
if (id == wxID_ANY)
id = wxNewId();
@@ -98,7 +103,7 @@ wxMenuItem* append_menu_item(wxMenu* menu, int id, const wxString& string, const
msw_menuitem_bitmaps[id] = icon;
#endif /* __WXMSW__ */
- return append_menu_item(menu, id, string, description, cb, bmp, event_handler, cb_condition, parent);
+ return append_menu_item(menu, id, string, description, cb, bmp, event_handler, cb_condition, parent, insert_pos);
}
wxMenuItem* append_submenu(wxMenu* menu, wxMenu* sub_menu, int id, const wxString& string, const wxString& description, const std::string& icon,
@@ -173,7 +178,6 @@ wxMenuItem* append_menu_check_item(wxMenu* menu, int id, const wxString& string,
const unsigned int wxCheckListBoxComboPopup::DefaultWidth = 200;
const unsigned int wxCheckListBoxComboPopup::DefaultHeight = 200;
-const unsigned int wxCheckListBoxComboPopup::DefaultItemHeight = 18;
bool wxCheckListBoxComboPopup::Create(wxWindow* parent)
{
@@ -197,17 +201,22 @@ wxString wxCheckListBoxComboPopup::GetStringValue() const
wxSize wxCheckListBoxComboPopup::GetAdjustedSize(int minWidth, int prefHeight, int maxHeight)
{
- // matches owner wxComboCtrl's width
- // and sets height dinamically in dependence of contained items count
+ // set width dinamically in dependence of items text
+ // and set height dinamically in dependence of items count
wxComboCtrl* cmb = GetComboCtrl();
- if (cmb != nullptr)
- {
+ if (cmb != nullptr) {
wxSize size = GetComboCtrl()->GetSize();
unsigned int count = GetCount();
- if (count > 0)
- size.SetHeight(count * DefaultItemHeight);
+ if (count > 0) {
+ int max_width = size.x;
+ for (unsigned int i = 0; i < count; ++i) {
+ max_width = std::max(max_width, 60 + GetTextExtent(GetString(i)).x);
+ }
+ size.SetWidth(max_width);
+ size.SetHeight(count * cmb->GetCharHeight());
+ }
else
size.SetHeight(DefaultHeight);
@@ -299,94 +308,6 @@ void wxCheckListBoxComboPopup::OnListBoxSelection(wxCommandEvent& evt)
}
-namespace Slic3r {
-namespace GUI {
-
-// *** PresetBitmapComboBox ***
-
-/* For PresetBitmapComboBox we use bitmaps that are created from images that are already scaled appropriately for Retina
- * (Contrary to the intuition, the `scale` argument for Bitmap's constructor doesn't mean
- * "please scale this to such and such" but rather
- * "the wxImage is already sized for backing scale such and such". )
- * Unfortunately, the constructor changes the size of wxBitmap too.
- * Thus We need to use unscaled size value for bitmaps that we use
- * to avoid scaled size of control items.
- * For this purpose control drawing methods and
- * control size calculation methods (virtual) are overridden.
- **/
-
-PresetBitmapComboBox::PresetBitmapComboBox(wxWindow* parent, const wxSize& size) :
- wxBitmapComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, size, 0, nullptr, wxCB_READONLY)
-{}
-
-#ifdef __APPLE__
-bool PresetBitmapComboBox::OnAddBitmap(const wxBitmap& bitmap)
-{
- if (bitmap.IsOk())
- {
- // we should use scaled! size values of bitmap
- int width = (int)bitmap.GetScaledWidth();
- int height = (int)bitmap.GetScaledHeight();
-
- if (m_usedImgSize.x < 0)
- {
- // If size not yet determined, get it from this image.
- m_usedImgSize.x = width;
- m_usedImgSize.y = height;
-
- // Adjust control size to vertically fit the bitmap
- wxWindow* ctrl = GetControl();
- ctrl->InvalidateBestSize();
- wxSize newSz = ctrl->GetBestSize();
- wxSize sz = ctrl->GetSize();
- if (newSz.y > sz.y)
- ctrl->SetSize(sz.x, newSz.y);
- else
- DetermineIndent();
- }
-
- wxCHECK_MSG(width == m_usedImgSize.x && height == m_usedImgSize.y,
- false,
- "you can only add images of same size");
-
- return true;
- }
-
- return false;
-}
-
-void PresetBitmapComboBox::OnDrawItem(wxDC& dc,
- const wxRect& rect,
- int item,
- int flags) const
-{
- const wxBitmap& bmp = *(wxBitmap*)m_bitmaps[item];
- if (bmp.IsOk())
- {
- // we should use scaled! size values of bitmap
- wxCoord w = bmp.GetScaledWidth();
- wxCoord h = bmp.GetScaledHeight();
-
- const int imgSpacingLeft = 4;
-
- // Draw the image centered
- dc.DrawBitmap(bmp,
- rect.x + (m_usedImgSize.x - w) / 2 + imgSpacingLeft,
- rect.y + (rect.height - h) / 2,
- true);
- }
-
- wxString text = GetString(item);
- if (!text.empty())
- dc.DrawText(text,
- rect.x + m_imgAreaWidth + 1,
- rect.y + (rect.height - dc.GetCharHeight()) / 2);
-}
-#endif
-}
-}
-
-
// *** wxDataViewTreeCtrlComboPopup ***
const unsigned int wxDataViewTreeCtrlComboPopup::DefaultWidth = 270;
@@ -519,7 +440,7 @@ wxBitmap create_scaled_bitmap( const std::string& bmp_name_in,
if (bmp == nullptr) {
// Neither SVG nor PNG has been found, raise error
- throw std::runtime_error("Could not load bitmap: " + bmp_name);
+ throw Slic3r::RuntimeError("Could not load bitmap: " + bmp_name);
}
return *bmp;
@@ -736,7 +657,15 @@ void ModeButton::focus_button(const bool focus)
Slic3r::GUI::wxGetApp().normal_font();
SetFont(new_font);
- SetForegroundColour(wxSystemSettings::GetColour(focus ? wxSYS_COLOUR_BTNTEXT : wxSYS_COLOUR_BTNSHADOW));
+ SetForegroundColour(wxSystemSettings::GetColour(focus ? wxSYS_COLOUR_BTNTEXT :
+#if defined (__linux__) && defined (__WXGTK3__)
+ wxSYS_COLOUR_GRAYTEXT
+#elif defined (__linux__) && defined (__WXGTK2__)
+ wxSYS_COLOUR_BTNTEXT
+#else
+ wxSYS_COLOUR_BTNSHADOW
+#endif
+ ));
Refresh();
Update();
@@ -754,7 +683,8 @@ ModeSizer::ModeSizer(wxWindow *parent, int hgap/* = 0*/) :
std::vector < std::pair < wxString, std::string >> buttons = {
{_(L("Simple")), "mode_simple"},
- {_(L("Advanced")), "mode_advanced"},
+// {_(L("Advanced")), "mode_advanced"},
+ {_CTX(L_CONTEXT("Advanced", "Mode"), "Mode"), "mode_advanced"},
{_(L("Expert")), "mode_expert"},
};
@@ -778,6 +708,17 @@ void ModeSizer::SetMode(const int mode)
m_mode_btns[m]->SetState(int(m) == mode);
}
+void ModeSizer::set_items_flag(int flag)
+{
+ for (wxSizerItem* item : this->GetChildren())
+ item->SetFlag(flag);
+}
+
+void ModeSizer::set_items_border(int border)
+{
+ for (wxSizerItem* item : this->GetChildren())
+ item->SetBorder(border);
+}
void ModeSizer::msw_rescale()
{
@@ -817,11 +758,12 @@ void MenuWithSeparators::SetSecondSeparator()
// ----------------------------------------------------------------------------
ScalableBitmap::ScalableBitmap( wxWindow *parent,
const std::string& icon_name/* = ""*/,
- const int px_cnt/* = 16*/):
+ const int px_cnt/* = 16*/,
+ const bool grayscale/* = false*/):
m_parent(parent), m_icon_name(icon_name),
m_px_cnt(px_cnt)
{
- m_bmp = create_scaled_bitmap(icon_name, parent, px_cnt);
+ m_bmp = create_scaled_bitmap(icon_name, parent, px_cnt, grayscale);
}
wxSize ScalableBitmap::GetBmpSize() const
@@ -854,7 +796,7 @@ int ScalableBitmap::GetBmpHeight() const
void ScalableBitmap::msw_rescale()
{
- m_bmp = create_scaled_bitmap(m_icon_name, m_parent, m_px_cnt);
+ m_bmp = create_scaled_bitmap(m_icon_name, m_parent, m_px_cnt, m_grayscale);
}
// ----------------------------------------------------------------------------
@@ -867,9 +809,13 @@ ScalableButton::ScalableButton( wxWindow * parent,
const wxString& label /* = wxEmptyString*/,
const wxSize& size /* = wxDefaultSize*/,
const wxPoint& pos /* = wxDefaultPosition*/,
- long style /*= wxBU_EXACTFIT | wxNO_BORDER*/) :
+ long style /*= wxBU_EXACTFIT | wxNO_BORDER*/,
+ bool use_default_disabled_bitmap/* = false*/,
+ int bmp_px_cnt/* = 16*/) :
+ m_parent(parent),
m_current_icon_name(icon_name),
- m_parent(parent)
+ m_use_default_disabled_bitmap (use_default_disabled_bitmap),
+ m_px_cnt(bmp_px_cnt)
{
Create(parent, id, label, pos, size, style);
#ifdef __WXMSW__
@@ -877,7 +823,9 @@ ScalableButton::ScalableButton( wxWindow * parent,
SetBackgroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOW));
#endif // __WXMSW__
- SetBitmap(create_scaled_bitmap(icon_name, parent));
+ SetBitmap(create_scaled_bitmap(icon_name, parent, m_px_cnt));
+ if (m_use_default_disabled_bitmap)
+ SetBitmapDisabled(create_scaled_bitmap(m_current_icon_name, m_parent, m_px_cnt, true));
if (size != wxDefaultSize)
{
@@ -927,11 +875,19 @@ int ScalableButton::GetBitmapHeight()
#endif
}
+void ScalableButton::UseDefaultBitmapDisabled()
+{
+ m_use_default_disabled_bitmap = true;
+ SetBitmapDisabled(create_scaled_bitmap(m_current_icon_name, m_parent, m_px_cnt, true));
+}
+
void ScalableButton::msw_rescale()
{
SetBitmap(create_scaled_bitmap(m_current_icon_name, m_parent, m_px_cnt));
if (!m_disabled_icon_name.empty())
SetBitmapDisabled(create_scaled_bitmap(m_disabled_icon_name, m_parent, m_px_cnt));
+ else if (m_use_default_disabled_bitmap)
+ SetBitmapDisabled(create_scaled_bitmap(m_current_icon_name, m_parent, m_px_cnt, true));
if (m_width > 0 || m_height>0)
{
@@ -942,5 +898,40 @@ void ScalableButton::msw_rescale()
}
+// ----------------------------------------------------------------------------
+// BlinkingBitmap
+// ----------------------------------------------------------------------------
+
+BlinkingBitmap::BlinkingBitmap(wxWindow* parent, const std::string& icon_name) :
+ wxStaticBitmap(parent, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize(int(1.6 * Slic3r::GUI::wxGetApp().em_unit()), -1))
+{
+ bmp = ScalableBitmap(parent, icon_name);
+}
+
+void BlinkingBitmap::msw_rescale()
+{
+ bmp.msw_rescale();
+ this->SetSize(bmp.GetBmpSize());
+ this->SetMinSize(bmp.GetBmpSize());
+}
+
+void BlinkingBitmap::invalidate()
+{
+ this->SetBitmap(wxNullBitmap);
+}
+
+void BlinkingBitmap::activate()
+{
+ this->SetBitmap(bmp.bmp());
+ show = true;
+}
+
+void BlinkingBitmap::blink()
+{
+ show = !show;
+ this->SetBitmap(show ? bmp.bmp() : wxNullBitmap);
+}
+
+
diff --git a/src/slic3r/GUI/wxExtensions.hpp b/src/slic3r/GUI/wxExtensions.hpp
index 38d726ad3..4f5204775 100644
--- a/src/slic3r/GUI/wxExtensions.hpp
+++ b/src/slic3r/GUI/wxExtensions.hpp
@@ -8,6 +8,7 @@
#include <wx/sizer.h>
#include <wx/menu.h>
#include <wx/bmpcbox.h>
+#include <wx/statbmp.h>
#include <vector>
#include <functional>
@@ -21,10 +22,10 @@ inline void msw_rescale_menu(wxMenu* /* menu */) {}
wxMenuItem* append_menu_item(wxMenu* menu, int id, const wxString& string, const wxString& description,
std::function<void(wxCommandEvent& event)> cb, const wxBitmap& icon, wxEvtHandler* event_handler = nullptr,
- std::function<bool()> const cb_condition = []() { return true;}, wxWindow* parent = nullptr);
+ std::function<bool()> const cb_condition = []() { return true;}, wxWindow* parent = nullptr, int insert_pos = wxNOT_FOUND);
wxMenuItem* append_menu_item(wxMenu* menu, int id, const wxString& string, const wxString& description,
std::function<void(wxCommandEvent& event)> cb, const std::string& icon = "", wxEvtHandler* event_handler = nullptr,
- std::function<bool()> const cb_condition = []() { return true; }, wxWindow* parent = nullptr);
+ std::function<bool()> const cb_condition = []() { return true; }, wxWindow* parent = nullptr, int insert_pos = wxNOT_FOUND);
wxMenuItem* append_submenu(wxMenu* menu, wxMenu* sub_menu, int id, const wxString& string, const wxString& description,
const std::string& icon = "",
@@ -62,7 +63,6 @@ class wxCheckListBoxComboPopup : public wxCheckListBox, public wxComboPopup
{
static const unsigned int DefaultWidth;
static const unsigned int DefaultHeight;
- static const unsigned int DefaultItemHeight;
wxString m_text;
@@ -94,37 +94,6 @@ public:
void OnListBoxSelection(wxCommandEvent& evt);
};
-namespace Slic3r {
-namespace GUI {
-// *** PresetBitmapComboBox ***
-
-// BitmapComboBox used to presets list on Sidebar and Tabs
-class PresetBitmapComboBox: public wxBitmapComboBox
-{
-public:
- PresetBitmapComboBox(wxWindow* parent, const wxSize& size = wxDefaultSize);
- ~PresetBitmapComboBox() {}
-
-#ifdef __APPLE__
-protected:
- /* For PresetBitmapComboBox we use bitmaps that are created from images that are already scaled appropriately for Retina
- * (Contrary to the intuition, the `scale` argument for Bitmap's constructor doesn't mean
- * "please scale this to such and such" but rather
- * "the wxImage is already sized for backing scale such and such". )
- * Unfortunately, the constructor changes the size of wxBitmap too.
- * Thus We need to use unscaled size value for bitmaps that we use
- * to avoid scaled size of control items.
- * For this purpose control drawing methods and
- * control size calculation methods (virtual) are overridden.
- **/
- virtual bool OnAddBitmap(const wxBitmap& bitmap) override;
- virtual void OnDrawItem(wxDC& dc, const wxRect& rect, int item, int flags) const override;
-#endif
-};
-
-}
-}
-
// *** wxDataViewTreeCtrlComboBox ***
@@ -160,7 +129,8 @@ public:
ScalableBitmap() {};
ScalableBitmap( wxWindow *parent,
const std::string& icon_name = "",
- const int px_cnt = 16);
+ const int px_cnt = 16,
+ const bool grayscale = false);
~ScalableBitmap() {}
@@ -181,6 +151,7 @@ private:
wxBitmap m_bmp = wxBitmap();
std::string m_icon_name = "";
int m_px_cnt {16};
+ bool m_grayscale {false};
};
@@ -238,7 +209,9 @@ public:
const wxString& label = wxEmptyString,
const wxSize& size = wxDefaultSize,
const wxPoint& pos = wxDefaultPosition,
- long style = wxBU_EXACTFIT | wxNO_BORDER);
+ long style = wxBU_EXACTFIT | wxNO_BORDER,
+ bool use_default_disabled_bitmap = false,
+ int bmp_px_cnt = 16);
ScalableButton(
wxWindow * parent,
@@ -252,6 +225,7 @@ public:
void SetBitmap_(const ScalableBitmap& bmp);
void SetBitmapDisabled_(const ScalableBitmap &bmp);
int GetBitmapHeight();
+ void UseDefaultBitmapDisabled();
void msw_rescale();
@@ -262,6 +236,8 @@ private:
int m_width {-1}; // should be multiplied to em_unit
int m_height{-1}; // should be multiplied to em_unit
+ bool m_use_default_disabled_bitmap {false};
+
// bitmap dimensions
int m_px_cnt{ 16 };
};
@@ -322,6 +298,9 @@ public:
void SetMode(const /*ConfigOptionMode*/int mode);
+ void set_items_flag(int flag);
+ void set_items_border(int border);
+
void msw_rescale();
private:
@@ -355,5 +334,30 @@ private:
};
+// ----------------------------------------------------------------------------
+// BlinkingBitmap
+// ----------------------------------------------------------------------------
+
+class BlinkingBitmap : public wxStaticBitmap
+{
+public:
+ BlinkingBitmap() {};
+ BlinkingBitmap(wxWindow* parent, const std::string& icon_name = "search_blink");
+
+ ~BlinkingBitmap() {}
+
+ void msw_rescale();
+ void invalidate();
+ void activate();
+ void blink();
+
+ const wxBitmap& get_bmp() const { return bmp.bmp(); }
+
+private:
+ ScalableBitmap bmp;
+ bool show {false};
+};
+
+
#endif // slic3r_GUI_wxExtensions_hpp_
diff --git a/src/slic3r/Utils/ASCIIFolding.cpp b/src/slic3r/Utils/ASCIIFolding.cpp
index c61fe2902..4bd902c6d 100644
--- a/src/slic3r/Utils/ASCIIFolding.cpp
+++ b/src/slic3r/Utils/ASCIIFolding.cpp
@@ -5,12 +5,16 @@
#include <locale>
#include <boost/locale/encoding_utf.hpp>
+namespace Slic3r {
+
// Based on http://svn.apache.org/repos/asf/lucene/java/tags/lucene_solr_4_5_1/lucene/analysis/common/src/java/org/apache/lucene/analysis/miscellaneous/ASCIIFoldingFilter.java
-template<typename OUTPUT_ITERATOR>
-static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
+// Convert the input UNICODE character to a string of maximum 4 output ASCII characters.
+// Return the end of the string written to the output.
+// The output buffer must be at least 4 characters long.
+wchar_t* fold_to_ascii(wchar_t c, wchar_t *out)
{
if (c < 0x080) {
- *out = c;
+ *out ++ = c;
} else {
switch (c) {
case L'\u00C0': // [LATIN CAPITAL LETTER A WITH GRAVE]
@@ -47,7 +51,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u1EB6': // [LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW]
case L'\u24B6': // [CIRCLED LATIN CAPITAL LETTER A]
case L'\uFF21': // [FULLWIDTH LATIN CAPITAL LETTER A]
- *out = 'A';
+ *out ++ = 'A';
break;
case L'\u00E0': // [LATIN SMALL LETTER A WITH GRAVE]
case L'\u00E1': // [LATIN SMALL LETTER A WITH ACUTE]
@@ -90,68 +94,68 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u2C65': // [LATIN SMALL LETTER A WITH STROKE]
case L'\u2C6F': // [LATIN CAPITAL LETTER TURNED A]
case L'\uFF41': // [FULLWIDTH LATIN SMALL LETTER A]
- *out = 'a';
+ *out ++ = 'a';
break;
case L'\uA732': // [LATIN CAPITAL LETTER AA]
- *out = 'A';
- *out = 'A';
+ *out ++ = 'A';
+ *out ++ = 'A';
break;
case L'\u00C6': // [LATIN CAPITAL LETTER AE]
case L'\u01E2': // [LATIN CAPITAL LETTER AE WITH MACRON]
case L'\u01FC': // [LATIN CAPITAL LETTER AE WITH ACUTE]
case L'\u1D01': // [LATIN LETTER SMALL CAPITAL AE]
- *out = 'A';
- *out = 'E';
+ *out ++ = 'A';
+ *out ++ = 'E';
break;
case L'\uA734': // [LATIN CAPITAL LETTER AO]
- *out = 'A';
- *out = 'O';
+ *out ++ = 'A';
+ *out ++ = 'O';
break;
case L'\uA736': // [LATIN CAPITAL LETTER AU]
- *out = 'A';
- *out = 'U';
+ *out ++ = 'A';
+ *out ++ = 'U';
break;
case L'\uA738': // [LATIN CAPITAL LETTER AV]
case L'\uA73A': // [LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR]
- *out = 'A';
- *out = 'V';
+ *out ++ = 'A';
+ *out ++ = 'V';
break;
case L'\uA73C': // [LATIN CAPITAL LETTER AY]
- *out = 'A';
- *out = 'Y';
+ *out ++ = 'A';
+ *out ++ = 'Y';
break;
case L'\u249C': // [PARENTHESIZED LATIN SMALL LETTER A]
- *out = '(';
- *out = 'a';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 'a';
+ *out ++ = ')';
break;
case L'\uA733': // [LATIN SMALL LETTER AA]
- *out = 'a';
- *out = 'a';
+ *out ++ = 'a';
+ *out ++ = 'a';
break;
case L'\u00E6': // [LATIN SMALL LETTER AE]
case L'\u01E3': // [LATIN SMALL LETTER AE WITH MACRON]
case L'\u01FD': // [LATIN SMALL LETTER AE WITH ACUTE]
case L'\u1D02': // [LATIN SMALL LETTER TURNED AE]
- *out = 'a';
- *out = 'e';
+ *out ++ = 'a';
+ *out ++ = 'e';
break;
case L'\uA735': // [LATIN SMALL LETTER AO]
- *out = 'a';
- *out = 'o';
+ *out ++ = 'a';
+ *out ++ = 'o';
break;
case L'\uA737': // [LATIN SMALL LETTER AU]
- *out = 'a';
- *out = 'u';
+ *out ++ = 'a';
+ *out ++ = 'u';
break;
case L'\uA739': // [LATIN SMALL LETTER AV]
case L'\uA73B': // [LATIN SMALL LETTER AV WITH HORIZONTAL BAR]
- *out = 'a';
- *out = 'v';
+ *out ++ = 'a';
+ *out ++ = 'v';
break;
case L'\uA73D': // [LATIN SMALL LETTER AY]
- *out = 'a';
- *out = 'y';
+ *out ++ = 'a';
+ *out ++ = 'y';
break;
case L'\u0181': // [LATIN CAPITAL LETTER B WITH HOOK]
case L'\u0182': // [LATIN CAPITAL LETTER B WITH TOPBAR]
@@ -163,7 +167,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u1E06': // [LATIN CAPITAL LETTER B WITH LINE BELOW]
case L'\u24B7': // [CIRCLED LATIN CAPITAL LETTER B]
case L'\uFF22': // [FULLWIDTH LATIN CAPITAL LETTER B]
- *out = 'B';
+ *out ++ = 'B';
break;
case L'\u0180': // [LATIN SMALL LETTER B WITH STROKE]
case L'\u0183': // [LATIN SMALL LETTER B WITH TOPBAR]
@@ -175,12 +179,12 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u1E07': // [LATIN SMALL LETTER B WITH LINE BELOW]
case L'\u24D1': // [CIRCLED LATIN SMALL LETTER B]
case L'\uFF42': // [FULLWIDTH LATIN SMALL LETTER B]
- *out = 'b';
+ *out ++ = 'b';
break;
case L'\u249D': // [PARENTHESIZED LATIN SMALL LETTER B]
- *out = '(';
- *out = 'b';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 'b';
+ *out ++ = ')';
break;
case L'\u00C7': // [LATIN CAPITAL LETTER C WITH CEDILLA]
case L'\u0106': // [LATIN CAPITAL LETTER C WITH ACUTE]
@@ -194,7 +198,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u1E08': // [LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE]
case L'\u24B8': // [CIRCLED LATIN CAPITAL LETTER C]
case L'\uFF23': // [FULLWIDTH LATIN CAPITAL LETTER C]
- *out = 'C';
+ *out ++ = 'C';
break;
case L'\u00E7': // [LATIN SMALL LETTER C WITH CEDILLA]
case L'\u0107': // [LATIN SMALL LETTER C WITH ACUTE]
@@ -210,12 +214,12 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\uA73E': // [LATIN CAPITAL LETTER REVERSED C WITH DOT]
case L'\uA73F': // [LATIN SMALL LETTER REVERSED C WITH DOT]
case L'\uFF43': // [FULLWIDTH LATIN SMALL LETTER C]
- *out = 'c';
+ *out ++ = 'c';
break;
case L'\u249E': // [PARENTHESIZED LATIN SMALL LETTER C]
- *out = '(';
- *out = 'c';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 'c';
+ *out ++ = ')';
break;
case L'\u00D0': // [LATIN CAPITAL LETTER ETH]
case L'\u010E': // [LATIN CAPITAL LETTER D WITH CARON]
@@ -233,7 +237,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u24B9': // [CIRCLED LATIN CAPITAL LETTER D]
case L'\uA779': // [LATIN CAPITAL LETTER INSULAR D]
case L'\uFF24': // [FULLWIDTH LATIN CAPITAL LETTER D]
- *out = 'D';
+ *out ++ = 'D';
break;
case L'\u00F0': // [LATIN SMALL LETTER ETH]
case L'\u010F': // [LATIN SMALL LETTER D WITH CARON]
@@ -253,33 +257,33 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u24D3': // [CIRCLED LATIN SMALL LETTER D]
case L'\uA77A': // [LATIN SMALL LETTER INSULAR D]
case L'\uFF44': // [FULLWIDTH LATIN SMALL LETTER D]
- *out = 'd';
+ *out ++ = 'd';
break;
case L'\u01C4': // [LATIN CAPITAL LETTER DZ WITH CARON]
case L'\u01F1': // [LATIN CAPITAL LETTER DZ]
- *out = 'D';
- *out = 'Z';
+ *out ++ = 'D';
+ *out ++ = 'Z';
break;
case L'\u01C5': // [LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON]
case L'\u01F2': // [LATIN CAPITAL LETTER D WITH SMALL LETTER Z]
- *out = 'D';
- *out = 'z';
+ *out ++ = 'D';
+ *out ++ = 'z';
break;
case L'\u249F': // [PARENTHESIZED LATIN SMALL LETTER D]
- *out = '(';
- *out = 'd';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 'd';
+ *out ++ = ')';
break;
case L'\u0238': // [LATIN SMALL LETTER DB DIGRAPH]
- *out = 'd';
- *out = 'b';
+ *out ++ = 'd';
+ *out ++ = 'b';
break;
case L'\u01C6': // [LATIN SMALL LETTER DZ WITH CARON]
case L'\u01F3': // [LATIN SMALL LETTER DZ]
case L'\u02A3': // [LATIN SMALL LETTER DZ DIGRAPH]
case L'\u02A5': // [LATIN SMALL LETTER DZ DIGRAPH WITH CURL]
- *out = 'd';
- *out = 'z';
+ *out ++ = 'd';
+ *out ++ = 'z';
break;
case L'\u00C8': // [LATIN CAPITAL LETTER E WITH GRAVE]
case L'\u00C9': // [LATIN CAPITAL LETTER E WITH ACUTE]
@@ -313,7 +317,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u24BA': // [CIRCLED LATIN CAPITAL LETTER E]
case L'\u2C7B': // [LATIN LETTER SMALL CAPITAL TURNED E]
case L'\uFF25': // [FULLWIDTH LATIN CAPITAL LETTER E]
- *out = 'E';
+ *out ++ = 'E';
break;
case L'\u00E8': // [LATIN SMALL LETTER E WITH GRAVE]
case L'\u00E9': // [LATIN SMALL LETTER E WITH ACUTE]
@@ -356,12 +360,12 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u24D4': // [CIRCLED LATIN SMALL LETTER E]
case L'\u2C78': // [LATIN SMALL LETTER E WITH NOTCH]
case L'\uFF45': // [FULLWIDTH LATIN SMALL LETTER E]
- *out = 'e';
+ *out ++ = 'e';
break;
case L'\u24A0': // [PARENTHESIZED LATIN SMALL LETTER E]
- *out = '(';
- *out = 'e';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 'e';
+ *out ++ = ')';
break;
case L'\u0191': // [LATIN CAPITAL LETTER F WITH HOOK]
case L'\u1E1E': // [LATIN CAPITAL LETTER F WITH DOT ABOVE]
@@ -370,7 +374,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\uA77B': // [LATIN CAPITAL LETTER INSULAR F]
case L'\uA7FB': // [LATIN EPIGRAPHIC LETTER REVERSED F]
case L'\uFF26': // [FULLWIDTH LATIN CAPITAL LETTER F]
- *out = 'F';
+ *out ++ = 'F';
break;
case L'\u0192': // [LATIN SMALL LETTER F WITH HOOK]
case L'\u1D6E': // [LATIN SMALL LETTER F WITH MIDDLE TILDE]
@@ -380,34 +384,34 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u24D5': // [CIRCLED LATIN SMALL LETTER F]
case L'\uA77C': // [LATIN SMALL LETTER INSULAR F]
case L'\uFF46': // [FULLWIDTH LATIN SMALL LETTER F]
- *out = 'f';
+ *out ++ = 'f';
break;
case L'\u24A1': // [PARENTHESIZED LATIN SMALL LETTER F]
- *out = '(';
- *out = 'f';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 'f';
+ *out ++ = ')';
break;
case L'\uFB00': // [LATIN SMALL LIGATURE FF]
- *out = 'f';
- *out = 'f';
+ *out ++ = 'f';
+ *out ++ = 'f';
break;
case L'\uFB03': // [LATIN SMALL LIGATURE FFI]
- *out = 'f';
- *out = 'f';
- *out = 'i';
+ *out ++ = 'f';
+ *out ++ = 'f';
+ *out ++ = 'i';
break;
case L'\uFB04': // [LATIN SMALL LIGATURE FFL]
- *out = 'f';
- *out = 'f';
- *out = 'l';
+ *out ++ = 'f';
+ *out ++ = 'f';
+ *out ++ = 'l';
break;
case L'\uFB01': // [LATIN SMALL LIGATURE FI]
- *out = 'f';
- *out = 'i';
+ *out ++ = 'f';
+ *out ++ = 'i';
break;
case L'\uFB02': // [LATIN SMALL LIGATURE FL]
- *out = 'f';
- *out = 'l';
+ *out ++ = 'f';
+ *out ++ = 'l';
break;
case L'\u011C': // [LATIN CAPITAL LETTER G WITH CIRCUMFLEX]
case L'\u011E': // [LATIN CAPITAL LETTER G WITH BREVE]
@@ -426,7 +430,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\uA77D': // [LATIN CAPITAL LETTER INSULAR G]
case L'\uA77E': // [LATIN CAPITAL LETTER TURNED INSULAR G]
case L'\uFF27': // [FULLWIDTH LATIN CAPITAL LETTER G]
- *out = 'G';
+ *out ++ = 'G';
break;
case L'\u011D': // [LATIN SMALL LETTER G WITH CIRCUMFLEX]
case L'\u011F': // [LATIN SMALL LETTER G WITH BREVE]
@@ -442,12 +446,12 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u24D6': // [CIRCLED LATIN SMALL LETTER G]
case L'\uA77F': // [LATIN SMALL LETTER TURNED INSULAR G]
case L'\uFF47': // [FULLWIDTH LATIN SMALL LETTER G]
- *out = 'g';
+ *out ++ = 'g';
break;
case L'\u24A2': // [PARENTHESIZED LATIN SMALL LETTER G]
- *out = '(';
- *out = 'g';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 'g';
+ *out ++ = ')';
break;
case L'\u0124': // [LATIN CAPITAL LETTER H WITH CIRCUMFLEX]
case L'\u0126': // [LATIN CAPITAL LETTER H WITH STROKE]
@@ -462,7 +466,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u2C67': // [LATIN CAPITAL LETTER H WITH DESCENDER]
case L'\u2C75': // [LATIN CAPITAL LETTER HALF H]
case L'\uFF28': // [FULLWIDTH LATIN CAPITAL LETTER H]
- *out = 'H';
+ *out ++ = 'H';
break;
case L'\u0125': // [LATIN SMALL LETTER H WITH CIRCUMFLEX]
case L'\u0127': // [LATIN SMALL LETTER H WITH STROKE]
@@ -481,20 +485,20 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u2C68': // [LATIN SMALL LETTER H WITH DESCENDER]
case L'\u2C76': // [LATIN SMALL LETTER HALF H]
case L'\uFF48': // [FULLWIDTH LATIN SMALL LETTER H]
- *out = 'h';
+ *out ++ = 'h';
break;
case L'\u01F6': // [LATIN CAPITAL LETTER HWAIR]
- *out = 'H';
- *out = 'V';
+ *out ++ = 'H';
+ *out ++ = 'V';
break;
case L'\u24A3': // [PARENTHESIZED LATIN SMALL LETTER H]
- *out = '(';
- *out = 'h';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 'h';
+ *out ++ = ')';
break;
case L'\u0195': // [LATIN SMALL LETTER HV]
- *out = 'h';
- *out = 'v';
+ *out ++ = 'h';
+ *out ++ = 'v';
break;
case L'\u00CC': // [LATIN CAPITAL LETTER I WITH GRAVE]
case L'\u00CD': // [LATIN CAPITAL LETTER I WITH ACUTE]
@@ -519,7 +523,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u24BE': // [CIRCLED LATIN CAPITAL LETTER I]
case L'\uA7FE': // [LATIN EPIGRAPHIC LETTER I LONGA]
case L'\uFF29': // [FULLWIDTH LATIN CAPITAL LETTER I]
- *out = 'I';
+ *out ++ = 'I';
break;
case L'\u00EC': // [LATIN SMALL LETTER I WITH GRAVE]
case L'\u00ED': // [LATIN SMALL LETTER I WITH ACUTE]
@@ -545,27 +549,27 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u2071': // [SUPERSCRIPT LATIN SMALL LETTER I]
case L'\u24D8': // [CIRCLED LATIN SMALL LETTER I]
case L'\uFF49': // [FULLWIDTH LATIN SMALL LETTER I]
- *out = 'i';
+ *out ++ = 'i';
break;
case L'\u0132': // [LATIN CAPITAL LIGATURE IJ]
- *out = 'I';
- *out = 'J';
+ *out ++ = 'I';
+ *out ++ = 'J';
break;
case L'\u24A4': // [PARENTHESIZED LATIN SMALL LETTER I]
- *out = '(';
- *out = 'i';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 'i';
+ *out ++ = ')';
break;
case L'\u0133': // [LATIN SMALL LIGATURE IJ]
- *out = 'i';
- *out = 'j';
+ *out ++ = 'i';
+ *out ++ = 'j';
break;
case L'\u0134': // [LATIN CAPITAL LETTER J WITH CIRCUMFLEX]
case L'\u0248': // [LATIN CAPITAL LETTER J WITH STROKE]
case L'\u1D0A': // [LATIN LETTER SMALL CAPITAL J]
case L'\u24BF': // [CIRCLED LATIN CAPITAL LETTER J]
case L'\uFF2A': // [FULLWIDTH LATIN CAPITAL LETTER J]
- *out = 'J';
+ *out ++ = 'J';
break;
case L'\u0135': // [LATIN SMALL LETTER J WITH CIRCUMFLEX]
case L'\u01F0': // [LATIN SMALL LETTER J WITH CARON]
@@ -577,12 +581,12 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u24D9': // [CIRCLED LATIN SMALL LETTER J]
case L'\u2C7C': // [LATIN SUBSCRIPT SMALL LETTER J]
case L'\uFF4A': // [FULLWIDTH LATIN SMALL LETTER J]
- *out = 'j';
+ *out ++ = 'j';
break;
case L'\u24A5': // [PARENTHESIZED LATIN SMALL LETTER J]
- *out = '(';
- *out = 'j';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 'j';
+ *out ++ = ')';
break;
case L'\u0136': // [LATIN CAPITAL LETTER K WITH CEDILLA]
case L'\u0198': // [LATIN CAPITAL LETTER K WITH HOOK]
@@ -597,7 +601,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\uA742': // [LATIN CAPITAL LETTER K WITH DIAGONAL STROKE]
case L'\uA744': // [LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE]
case L'\uFF2B': // [FULLWIDTH LATIN CAPITAL LETTER K]
- *out = 'K';
+ *out ++ = 'K';
break;
case L'\u0137': // [LATIN SMALL LETTER K WITH CEDILLA]
case L'\u0199': // [LATIN SMALL LETTER K WITH HOOK]
@@ -613,12 +617,12 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\uA743': // [LATIN SMALL LETTER K WITH DIAGONAL STROKE]
case L'\uA745': // [LATIN SMALL LETTER K WITH STROKE AND DIAGONAL STROKE]
case L'\uFF4B': // [FULLWIDTH LATIN SMALL LETTER K]
- *out = 'k';
+ *out ++ = 'k';
break;
case L'\u24A6': // [PARENTHESIZED LATIN SMALL LETTER K]
- *out = '(';
- *out = 'k';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 'k';
+ *out ++ = ')';
break;
case L'\u0139': // [LATIN CAPITAL LETTER L WITH ACUTE]
case L'\u013B': // [LATIN CAPITAL LETTER L WITH CEDILLA]
@@ -639,7 +643,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\uA748': // [LATIN CAPITAL LETTER L WITH HIGH STROKE]
case L'\uA780': // [LATIN CAPITAL LETTER TURNED L]
case L'\uFF2C': // [FULLWIDTH LATIN CAPITAL LETTER L]
- *out = 'L';
+ *out ++ = 'L';
break;
case L'\u013A': // [LATIN SMALL LETTER L WITH ACUTE]
case L'\u013C': // [LATIN SMALL LETTER L WITH CEDILLA]
@@ -662,40 +666,40 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\uA749': // [LATIN SMALL LETTER L WITH HIGH STROKE]
case L'\uA781': // [LATIN SMALL LETTER TURNED L]
case L'\uFF4C': // [FULLWIDTH LATIN SMALL LETTER L]
- *out = 'l';
+ *out ++ = 'l';
break;
case L'\u01C7': // [LATIN CAPITAL LETTER LJ]
- *out = 'L';
- *out = 'J';
+ *out ++ = 'L';
+ *out ++ = 'J';
break;
case L'\u1EFA': // [LATIN CAPITAL LETTER MIDDLE-WELSH LL]
- *out = 'L';
- *out = 'L';
+ *out ++ = 'L';
+ *out ++ = 'L';
break;
case L'\u01C8': // [LATIN CAPITAL LETTER L WITH SMALL LETTER J]
- *out = 'L';
- *out = 'j';
+ *out ++ = 'L';
+ *out ++ = 'j';
break;
case L'\u24A7': // [PARENTHESIZED LATIN SMALL LETTER L]
- *out = '(';
- *out = 'l';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 'l';
+ *out ++ = ')';
break;
case L'\u01C9': // [LATIN SMALL LETTER LJ]
- *out = 'l';
- *out = 'j';
+ *out ++ = 'l';
+ *out ++ = 'j';
break;
case L'\u1EFB': // [LATIN SMALL LETTER MIDDLE-WELSH LL]
- *out = 'l';
- *out = 'l';
+ *out ++ = 'l';
+ *out ++ = 'l';
break;
case L'\u02AA': // [LATIN SMALL LETTER LS DIGRAPH]
- *out = 'l';
- *out = 's';
+ *out ++ = 'l';
+ *out ++ = 's';
break;
case L'\u02AB': // [LATIN SMALL LETTER LZ DIGRAPH]
- *out = 'l';
- *out = 'z';
+ *out ++ = 'l';
+ *out ++ = 'z';
break;
case L'\u019C': // [LATIN CAPITAL LETTER TURNED M]
case L'\u1D0D': // [LATIN LETTER SMALL CAPITAL M]
@@ -707,7 +711,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\uA7FD': // [LATIN EPIGRAPHIC LETTER INVERTED M]
case L'\uA7FF': // [LATIN EPIGRAPHIC LETTER ARCHAIC M]
case L'\uFF2D': // [FULLWIDTH LATIN CAPITAL LETTER M]
- *out = 'M';
+ *out ++ = 'M';
break;
case L'\u026F': // [LATIN SMALL LETTER TURNED M]
case L'\u0270': // [LATIN SMALL LETTER TURNED M WITH LONG LEG]
@@ -719,12 +723,12 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u1E43': // [LATIN SMALL LETTER M WITH DOT BELOW]
case L'\u24DC': // [CIRCLED LATIN SMALL LETTER M]
case L'\uFF4D': // [FULLWIDTH LATIN SMALL LETTER M]
- *out = 'm';
+ *out ++ = 'm';
break;
case L'\u24A8': // [PARENTHESIZED LATIN SMALL LETTER M]
- *out = '(';
- *out = 'm';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 'm';
+ *out ++ = ')';
break;
case L'\u00D1': // [LATIN CAPITAL LETTER N WITH TILDE]
case L'\u0143': // [LATIN CAPITAL LETTER N WITH ACUTE]
@@ -742,7 +746,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u1E4A': // [LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW]
case L'\u24C3': // [CIRCLED LATIN CAPITAL LETTER N]
case L'\uFF2E': // [FULLWIDTH LATIN CAPITAL LETTER N]
- *out = 'N';
+ *out ++ = 'N';
break;
case L'\u00F1': // [LATIN SMALL LETTER N WITH TILDE]
case L'\u0144': // [LATIN SMALL LETTER N WITH ACUTE]
@@ -764,24 +768,24 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u207F': // [SUPERSCRIPT LATIN SMALL LETTER N]
case L'\u24DD': // [CIRCLED LATIN SMALL LETTER N]
case L'\uFF4E': // [FULLWIDTH LATIN SMALL LETTER N]
- *out = 'n';
+ *out ++ = 'n';
break;
case L'\u01CA': // [LATIN CAPITAL LETTER NJ]
- *out = 'N';
- *out = 'J';
+ *out ++ = 'N';
+ *out ++ = 'J';
break;
case L'\u01CB': // [LATIN CAPITAL LETTER N WITH SMALL LETTER J]
- *out = 'N';
- *out = 'j';
+ *out ++ = 'N';
+ *out ++ = 'j';
break;
case L'\u24A9': // [PARENTHESIZED LATIN SMALL LETTER N]
- *out = '(';
- *out = 'n';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 'n';
+ *out ++ = ')';
break;
case L'\u01CC': // [LATIN SMALL LETTER NJ]
- *out = 'n';
- *out = 'j';
+ *out ++ = 'n';
+ *out ++ = 'j';
break;
case L'\u00D2': // [LATIN CAPITAL LETTER O WITH GRAVE]
case L'\u00D3': // [LATIN CAPITAL LETTER O WITH ACUTE]
@@ -827,7 +831,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\uA74A': // [LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY]
case L'\uA74C': // [LATIN CAPITAL LETTER O WITH LOOP]
case L'\uFF2F': // [FULLWIDTH LATIN CAPITAL LETTER O]
- *out = 'O';
+ *out ++ = 'O';
break;
case L'\u00F2': // [LATIN SMALL LETTER O WITH GRAVE]
case L'\u00F3': // [LATIN SMALL LETTER O WITH ACUTE]
@@ -876,39 +880,39 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\uA74B': // [LATIN SMALL LETTER O WITH LONG STROKE OVERLAY]
case L'\uA74D': // [LATIN SMALL LETTER O WITH LOOP]
case L'\uFF4F': // [FULLWIDTH LATIN SMALL LETTER O]
- *out = 'o';
+ *out ++ = 'o';
break;
case L'\u0152': // [LATIN CAPITAL LIGATURE OE]
case L'\u0276': // [LATIN LETTER SMALL CAPITAL OE]
- *out = 'O';
- *out = 'E';
+ *out ++ = 'O';
+ *out ++ = 'E';
break;
case L'\uA74E': // [LATIN CAPITAL LETTER OO]
- *out = 'O';
- *out = 'O';
+ *out ++ = 'O';
+ *out ++ = 'O';
break;
case L'\u0222': // [LATIN CAPITAL LETTER OU]
case L'\u1D15': // [LATIN LETTER SMALL CAPITAL OU]
- *out = 'O';
- *out = 'U';
+ *out ++ = 'O';
+ *out ++ = 'U';
break;
case L'\u24AA': // [PARENTHESIZED LATIN SMALL LETTER O]
- *out = '(';
- *out = 'o';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 'o';
+ *out ++ = ')';
break;
case L'\u0153': // [LATIN SMALL LIGATURE OE]
case L'\u1D14': // [LATIN SMALL LETTER TURNED OE]
- *out = 'o';
- *out = 'e';
+ *out ++ = 'o';
+ *out ++ = 'e';
break;
case L'\uA74F': // [LATIN SMALL LETTER OO]
- *out = 'o';
- *out = 'o';
+ *out ++ = 'o';
+ *out ++ = 'o';
break;
case L'\u0223': // [LATIN SMALL LETTER OU]
- *out = 'o';
- *out = 'u';
+ *out ++ = 'o';
+ *out ++ = 'u';
break;
case L'\u01A4': // [LATIN CAPITAL LETTER P WITH HOOK]
case L'\u1D18': // [LATIN LETTER SMALL CAPITAL P]
@@ -920,7 +924,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\uA752': // [LATIN CAPITAL LETTER P WITH FLOURISH]
case L'\uA754': // [LATIN CAPITAL LETTER P WITH SQUIRREL TAIL]
case L'\uFF30': // [FULLWIDTH LATIN CAPITAL LETTER P]
- *out = 'P';
+ *out ++ = 'P';
break;
case L'\u01A5': // [LATIN SMALL LETTER P WITH HOOK]
case L'\u1D71': // [LATIN SMALL LETTER P WITH MIDDLE TILDE]
@@ -934,19 +938,19 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\uA755': // [LATIN SMALL LETTER P WITH SQUIRREL TAIL]
case L'\uA7FC': // [LATIN EPIGRAPHIC LETTER REVERSED P]
case L'\uFF50': // [FULLWIDTH LATIN SMALL LETTER P]
- *out = 'p';
+ *out ++ = 'p';
break;
case L'\u24AB': // [PARENTHESIZED LATIN SMALL LETTER P]
- *out = '(';
- *out = 'p';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 'p';
+ *out ++ = ')';
break;
case L'\u024A': // [LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL]
case L'\u24C6': // [CIRCLED LATIN CAPITAL LETTER Q]
case L'\uA756': // [LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER]
case L'\uA758': // [LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE]
case L'\uFF31': // [FULLWIDTH LATIN CAPITAL LETTER Q]
- *out = 'Q';
+ *out ++ = 'Q';
break;
case L'\u0138': // [LATIN SMALL LETTER KRA]
case L'\u024B': // [LATIN SMALL LETTER Q WITH HOOK TAIL]
@@ -955,16 +959,16 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\uA757': // [LATIN SMALL LETTER Q WITH STROKE THROUGH DESCENDER]
case L'\uA759': // [LATIN SMALL LETTER Q WITH DIAGONAL STROKE]
case L'\uFF51': // [FULLWIDTH LATIN SMALL LETTER Q]
- *out = 'q';
+ *out ++ = 'q';
break;
case L'\u24AC': // [PARENTHESIZED LATIN SMALL LETTER Q]
- *out = '(';
- *out = 'q';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 'q';
+ *out ++ = ')';
break;
case L'\u0239': // [LATIN SMALL LETTER QP DIGRAPH]
- *out = 'q';
- *out = 'p';
+ *out ++ = 'q';
+ *out ++ = 'p';
break;
case L'\u0154': // [LATIN CAPITAL LETTER R WITH ACUTE]
case L'\u0156': // [LATIN CAPITAL LETTER R WITH CEDILLA]
@@ -985,7 +989,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\uA75A': // [LATIN CAPITAL LETTER R ROTUNDA]
case L'\uA782': // [LATIN CAPITAL LETTER INSULAR R]
case L'\uFF32': // [FULLWIDTH LATIN CAPITAL LETTER R]
- *out = 'R';
+ *out ++ = 'R';
break;
case L'\u0155': // [LATIN SMALL LETTER R WITH ACUTE]
case L'\u0157': // [LATIN SMALL LETTER R WITH CEDILLA]
@@ -1009,12 +1013,12 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\uA75B': // [LATIN SMALL LETTER R ROTUNDA]
case L'\uA783': // [LATIN SMALL LETTER INSULAR R]
case L'\uFF52': // [FULLWIDTH LATIN SMALL LETTER R]
- *out = 'r';
+ *out ++ = 'r';
break;
case L'\u24AD': // [PARENTHESIZED LATIN SMALL LETTER R]
- *out = '(';
- *out = 'r';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 'r';
+ *out ++ = ')';
break;
case L'\u015A': // [LATIN CAPITAL LETTER S WITH ACUTE]
case L'\u015C': // [LATIN CAPITAL LETTER S WITH CIRCUMFLEX]
@@ -1030,7 +1034,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\uA731': // [LATIN LETTER SMALL CAPITAL S]
case L'\uA785': // [LATIN SMALL LETTER INSULAR S]
case L'\uFF33': // [FULLWIDTH LATIN CAPITAL LETTER S]
- *out = 'S';
+ *out ++ = 'S';
break;
case L'\u015B': // [LATIN SMALL LETTER S WITH ACUTE]
case L'\u015D': // [LATIN SMALL LETTER S WITH CIRCUMFLEX]
@@ -1052,24 +1056,24 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u24E2': // [CIRCLED LATIN SMALL LETTER S]
case L'\uA784': // [LATIN CAPITAL LETTER INSULAR S]
case L'\uFF53': // [FULLWIDTH LATIN SMALL LETTER S]
- *out = 's';
+ *out ++ = 's';
break;
case L'\u1E9E': // [LATIN CAPITAL LETTER SHARP S]
- *out = 'S';
- *out = 'S';
+ *out ++ = 'S';
+ *out ++ = 'S';
break;
case L'\u24AE': // [PARENTHESIZED LATIN SMALL LETTER S]
- *out = '(';
- *out = 's';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 's';
+ *out ++ = ')';
break;
case L'\u00DF': // [LATIN SMALL LETTER SHARP S]
- *out = 's';
- *out = 's';
+ *out ++ = 's';
+ *out ++ = 's';
break;
case L'\uFB06': // [LATIN SMALL LIGATURE ST]
- *out = 's';
- *out = 't';
+ *out ++ = 's';
+ *out ++ = 't';
break;
case L'\u0162': // [LATIN CAPITAL LETTER T WITH CEDILLA]
case L'\u0164': // [LATIN CAPITAL LETTER T WITH CARON]
@@ -1086,7 +1090,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u24C9': // [CIRCLED LATIN CAPITAL LETTER T]
case L'\uA786': // [LATIN CAPITAL LETTER INSULAR T]
case L'\uFF34': // [FULLWIDTH LATIN CAPITAL LETTER T]
- *out = 'T';
+ *out ++ = 'T';
break;
case L'\u0163': // [LATIN SMALL LETTER T WITH CEDILLA]
case L'\u0165': // [LATIN SMALL LETTER T WITH CARON]
@@ -1106,39 +1110,39 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u24E3': // [CIRCLED LATIN SMALL LETTER T]
case L'\u2C66': // [LATIN SMALL LETTER T WITH DIAGONAL STROKE]
case L'\uFF54': // [FULLWIDTH LATIN SMALL LETTER T]
- *out = 't';
+ *out ++ = 't';
break;
case L'\u00DE': // [LATIN CAPITAL LETTER THORN]
case L'\uA766': // [LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER]
- *out = 'T';
- *out = 'H';
+ *out ++ = 'T';
+ *out ++ = 'H';
break;
case L'\uA728': // [LATIN CAPITAL LETTER TZ]
- *out = 'T';
- *out = 'Z';
+ *out ++ = 'T';
+ *out ++ = 'Z';
break;
case L'\u24AF': // [PARENTHESIZED LATIN SMALL LETTER T]
- *out = '(';
- *out = 't';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 't';
+ *out ++ = ')';
break;
case L'\u02A8': // [LATIN SMALL LETTER TC DIGRAPH WITH CURL]
- *out = 't';
- *out = 'c';
+ *out ++ = 't';
+ *out ++ = 'c';
break;
case L'\u00FE': // [LATIN SMALL LETTER THORN]
case L'\u1D7A': // [LATIN SMALL LETTER TH WITH STRIKETHROUGH]
case L'\uA767': // [LATIN SMALL LETTER THORN WITH STROKE THROUGH DESCENDER]
- *out = 't';
- *out = 'h';
+ *out ++ = 't';
+ *out ++ = 'h';
break;
case L'\u02A6': // [LATIN SMALL LETTER TS DIGRAPH]
- *out = 't';
- *out = 's';
+ *out ++ = 't';
+ *out ++ = 's';
break;
case L'\uA729': // [LATIN SMALL LETTER TZ]
- *out = 't';
- *out = 'z';
+ *out ++ = 't';
+ *out ++ = 'z';
break;
case L'\u00D9': // [LATIN CAPITAL LETTER U WITH GRAVE]
case L'\u00DA': // [LATIN CAPITAL LETTER U WITH ACUTE]
@@ -1175,7 +1179,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u1EF0': // [LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW]
case L'\u24CA': // [CIRCLED LATIN CAPITAL LETTER U]
case L'\uFF35': // [FULLWIDTH LATIN CAPITAL LETTER U]
- *out = 'U';
+ *out ++ = 'U';
break;
case L'\u00F9': // [LATIN SMALL LETTER U WITH GRAVE]
case L'\u00FA': // [LATIN SMALL LETTER U WITH ACUTE]
@@ -1212,16 +1216,16 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u1EF1': // [LATIN SMALL LETTER U WITH HORN AND DOT BELOW]
case L'\u24E4': // [CIRCLED LATIN SMALL LETTER U]
case L'\uFF55': // [FULLWIDTH LATIN SMALL LETTER U]
- *out = 'u';
+ *out ++ = 'u';
break;
case L'\u24B0': // [PARENTHESIZED LATIN SMALL LETTER U]
- *out = '(';
- *out = 'u';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 'u';
+ *out ++ = ')';
break;
case L'\u1D6B': // [LATIN SMALL LETTER UE]
- *out = 'u';
- *out = 'e';
+ *out ++ = 'u';
+ *out ++ = 'e';
break;
case L'\u01B2': // [LATIN CAPITAL LETTER V WITH HOOK]
case L'\u0245': // [LATIN CAPITAL LETTER TURNED V]
@@ -1233,7 +1237,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\uA75E': // [LATIN CAPITAL LETTER V WITH DIAGONAL STROKE]
case L'\uA768': // [LATIN CAPITAL LETTER VEND]
case L'\uFF36': // [FULLWIDTH LATIN CAPITAL LETTER V]
- *out = 'V';
+ *out ++ = 'V';
break;
case L'\u028B': // [LATIN SMALL LETTER V WITH HOOK]
case L'\u028C': // [LATIN SMALL LETTER TURNED V]
@@ -1246,20 +1250,20 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u2C74': // [LATIN SMALL LETTER V WITH CURL]
case L'\uA75F': // [LATIN SMALL LETTER V WITH DIAGONAL STROKE]
case L'\uFF56': // [FULLWIDTH LATIN SMALL LETTER V]
- *out = 'v';
+ *out ++ = 'v';
break;
case L'\uA760': // [LATIN CAPITAL LETTER VY]
- *out = 'V';
- *out = 'Y';
+ *out ++ = 'V';
+ *out ++ = 'Y';
break;
case L'\u24B1': // [PARENTHESIZED LATIN SMALL LETTER V]
- *out = '(';
- *out = 'v';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 'v';
+ *out ++ = ')';
break;
case L'\uA761': // [LATIN SMALL LETTER VY]
- *out = 'v';
- *out = 'y';
+ *out ++ = 'v';
+ *out ++ = 'y';
break;
case L'\u0174': // [LATIN CAPITAL LETTER W WITH CIRCUMFLEX]
case L'\u01F7': // [LATIN CAPITAL LETTER WYNN]
@@ -1272,7 +1276,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u24CC': // [CIRCLED LATIN CAPITAL LETTER W]
case L'\u2C72': // [LATIN CAPITAL LETTER W WITH HOOK]
case L'\uFF37': // [FULLWIDTH LATIN CAPITAL LETTER W]
- *out = 'W';
+ *out ++ = 'W';
break;
case L'\u0175': // [LATIN SMALL LETTER W WITH CIRCUMFLEX]
case L'\u01BF': // [LATIN LETTER WYNN]
@@ -1286,18 +1290,18 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u24E6': // [CIRCLED LATIN SMALL LETTER W]
case L'\u2C73': // [LATIN SMALL LETTER W WITH HOOK]
case L'\uFF57': // [FULLWIDTH LATIN SMALL LETTER W]
- *out = 'w';
+ *out ++ = 'w';
break;
case L'\u24B2': // [PARENTHESIZED LATIN SMALL LETTER W]
- *out = '(';
- *out = 'w';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 'w';
+ *out ++ = ')';
break;
case L'\u1E8A': // [LATIN CAPITAL LETTER X WITH DOT ABOVE]
case L'\u1E8C': // [LATIN CAPITAL LETTER X WITH DIAERESIS]
case L'\u24CD': // [CIRCLED LATIN CAPITAL LETTER X]
case L'\uFF38': // [FULLWIDTH LATIN CAPITAL LETTER X]
- *out = 'X';
+ *out ++ = 'X';
break;
case L'\u1D8D': // [LATIN SMALL LETTER X WITH PALATAL HOOK]
case L'\u1E8B': // [LATIN SMALL LETTER X WITH DOT ABOVE]
@@ -1305,12 +1309,12 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u2093': // [LATIN SUBSCRIPT SMALL LETTER X]
case L'\u24E7': // [CIRCLED LATIN SMALL LETTER X]
case L'\uFF58': // [FULLWIDTH LATIN SMALL LETTER X]
- *out = 'x';
+ *out ++ = 'x';
break;
case L'\u24B3': // [PARENTHESIZED LATIN SMALL LETTER X]
- *out = '(';
- *out = 'x';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 'x';
+ *out ++ = ')';
break;
case L'\u00DD': // [LATIN CAPITAL LETTER Y WITH ACUTE]
case L'\u0176': // [LATIN CAPITAL LETTER Y WITH CIRCUMFLEX]
@@ -1327,7 +1331,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u1EFE': // [LATIN CAPITAL LETTER Y WITH LOOP]
case L'\u24CE': // [CIRCLED LATIN CAPITAL LETTER Y]
case L'\uFF39': // [FULLWIDTH LATIN CAPITAL LETTER Y]
- *out = 'Y';
+ *out ++ = 'Y';
break;
case L'\u00FD': // [LATIN SMALL LETTER Y WITH ACUTE]
case L'\u00FF': // [LATIN SMALL LETTER Y WITH DIAERESIS]
@@ -1345,12 +1349,12 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u1EFF': // [LATIN SMALL LETTER Y WITH LOOP]
case L'\u24E8': // [CIRCLED LATIN SMALL LETTER Y]
case L'\uFF59': // [FULLWIDTH LATIN SMALL LETTER Y]
- *out = 'y';
+ *out ++ = 'y';
break;
case L'\u24B4': // [PARENTHESIZED LATIN SMALL LETTER Y]
- *out = '(';
- *out = 'y';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 'y';
+ *out ++ = ')';
break;
case L'\u0179': // [LATIN CAPITAL LETTER Z WITH ACUTE]
case L'\u017B': // [LATIN CAPITAL LETTER Z WITH DOT ABOVE]
@@ -1366,7 +1370,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u2C6B': // [LATIN CAPITAL LETTER Z WITH DESCENDER]
case L'\uA762': // [LATIN CAPITAL LETTER VISIGOTHIC Z]
case L'\uFF3A': // [FULLWIDTH LATIN CAPITAL LETTER Z]
- *out = 'Z';
+ *out ++ = 'Z';
break;
case L'\u017A': // [LATIN SMALL LETTER Z WITH ACUTE]
case L'\u017C': // [LATIN SMALL LETTER Z WITH DOT ABOVE]
@@ -1386,19 +1390,19 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u2C6C': // [LATIN SMALL LETTER Z WITH DESCENDER]
case L'\uA763': // [LATIN SMALL LETTER VISIGOTHIC Z]
case L'\uFF5A': // [FULLWIDTH LATIN SMALL LETTER Z]
- *out = 'z';
+ *out ++ = 'z';
break;
case L'\u24B5': // [PARENTHESIZED LATIN SMALL LETTER Z]
- *out = '(';
- *out = 'z';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = 'z';
+ *out ++ = ')';
break;
case L'\u2070': // [SUPERSCRIPT ZERO]
case L'\u2080': // [SUBSCRIPT ZERO]
case L'\u24EA': // [CIRCLED DIGIT ZERO]
case L'\u24FF': // [NEGATIVE CIRCLED DIGIT ZERO]
case L'\uFF10': // [FULLWIDTH DIGIT ZERO]
- *out = '0';
+ *out ++ = '0';
break;
case L'\u00B9': // [SUPERSCRIPT ONE]
case L'\u2081': // [SUBSCRIPT ONE]
@@ -1408,16 +1412,16 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u2780': // [DINGBAT CIRCLED SANS-SERIF DIGIT ONE]
case L'\u278A': // [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE]
case L'\uFF11': // [FULLWIDTH DIGIT ONE]
- *out = '1';
+ *out ++ = '1';
break;
case L'\u2488': // [DIGIT ONE FULL STOP]
- *out = '1';
- *out = '.';
+ *out ++ = '1';
+ *out ++ = '.';
break;
case L'\u2474': // [PARENTHESIZED DIGIT ONE]
- *out = '(';
- *out = '1';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = '1';
+ *out ++ = ')';
break;
case L'\u00B2': // [SUPERSCRIPT TWO]
case L'\u2082': // [SUBSCRIPT TWO]
@@ -1427,16 +1431,16 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u2781': // [DINGBAT CIRCLED SANS-SERIF DIGIT TWO]
case L'\u278B': // [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO]
case L'\uFF12': // [FULLWIDTH DIGIT TWO]
- *out = '2';
+ *out ++ = '2';
break;
case L'\u2489': // [DIGIT TWO FULL STOP]
- *out = '2';
- *out = '.';
+ *out ++ = '2';
+ *out ++ = '.';
break;
case L'\u2475': // [PARENTHESIZED DIGIT TWO]
- *out = '(';
- *out = '2';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = '2';
+ *out ++ = ')';
break;
case L'\u00B3': // [SUPERSCRIPT THREE]
case L'\u2083': // [SUBSCRIPT THREE]
@@ -1446,16 +1450,16 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u2782': // [DINGBAT CIRCLED SANS-SERIF DIGIT THREE]
case L'\u278C': // [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE]
case L'\uFF13': // [FULLWIDTH DIGIT THREE]
- *out = '3';
+ *out ++ = '3';
break;
case L'\u248A': // [DIGIT THREE FULL STOP]
- *out = '3';
- *out = '.';
+ *out ++ = '3';
+ *out ++ = '.';
break;
case L'\u2476': // [PARENTHESIZED DIGIT THREE]
- *out = '(';
- *out = '3';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = '3';
+ *out ++ = ')';
break;
case L'\u2074': // [SUPERSCRIPT FOUR]
case L'\u2084': // [SUBSCRIPT FOUR]
@@ -1465,16 +1469,16 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u2783': // [DINGBAT CIRCLED SANS-SERIF DIGIT FOUR]
case L'\u278D': // [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR]
case L'\uFF14': // [FULLWIDTH DIGIT FOUR]
- *out = '4';
+ *out ++ = '4';
break;
case L'\u248B': // [DIGIT FOUR FULL STOP]
- *out = '4';
- *out = '.';
+ *out ++ = '4';
+ *out ++ = '.';
break;
case L'\u2477': // [PARENTHESIZED DIGIT FOUR]
- *out = '(';
- *out = '4';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = '4';
+ *out ++ = ')';
break;
case L'\u2075': // [SUPERSCRIPT FIVE]
case L'\u2085': // [SUBSCRIPT FIVE]
@@ -1484,16 +1488,16 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u2784': // [DINGBAT CIRCLED SANS-SERIF DIGIT FIVE]
case L'\u278E': // [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE]
case L'\uFF15': // [FULLWIDTH DIGIT FIVE]
- *out = '5';
+ *out ++ = '5';
break;
case L'\u248C': // [DIGIT FIVE FULL STOP]
- *out = '5';
- *out = '.';
+ *out ++ = '5';
+ *out ++ = '.';
break;
case L'\u2478': // [PARENTHESIZED DIGIT FIVE]
- *out = '(';
- *out = '5';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = '5';
+ *out ++ = ')';
break;
case L'\u2076': // [SUPERSCRIPT SIX]
case L'\u2086': // [SUBSCRIPT SIX]
@@ -1503,16 +1507,16 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u2785': // [DINGBAT CIRCLED SANS-SERIF DIGIT SIX]
case L'\u278F': // [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX]
case L'\uFF16': // [FULLWIDTH DIGIT SIX]
- *out = '6';
+ *out ++ = '6';
break;
case L'\u248D': // [DIGIT SIX FULL STOP]
- *out = '6';
- *out = '.';
+ *out ++ = '6';
+ *out ++ = '.';
break;
case L'\u2479': // [PARENTHESIZED DIGIT SIX]
- *out = '(';
- *out = '6';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = '6';
+ *out ++ = ')';
break;
case L'\u2077': // [SUPERSCRIPT SEVEN]
case L'\u2087': // [SUBSCRIPT SEVEN]
@@ -1522,16 +1526,16 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u2786': // [DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN]
case L'\u2790': // [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN]
case L'\uFF17': // [FULLWIDTH DIGIT SEVEN]
- *out = '7';
+ *out ++ = '7';
break;
case L'\u248E': // [DIGIT SEVEN FULL STOP]
- *out = '7';
- *out = '.';
+ *out ++ = '7';
+ *out ++ = '.';
break;
case L'\u247A': // [PARENTHESIZED DIGIT SEVEN]
- *out = '(';
- *out = '7';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = '7';
+ *out ++ = ')';
break;
case L'\u2078': // [SUPERSCRIPT EIGHT]
case L'\u2088': // [SUBSCRIPT EIGHT]
@@ -1541,16 +1545,16 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u2787': // [DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT]
case L'\u2791': // [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT]
case L'\uFF18': // [FULLWIDTH DIGIT EIGHT]
- *out = '8';
+ *out ++ = '8';
break;
case L'\u248F': // [DIGIT EIGHT FULL STOP]
- *out = '8';
- *out = '.';
+ *out ++ = '8';
+ *out ++ = '.';
break;
case L'\u247B': // [PARENTHESIZED DIGIT EIGHT]
- *out = '(';
- *out = '8';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = '8';
+ *out ++ = ')';
break;
case L'\u2079': // [SUPERSCRIPT NINE]
case L'\u2089': // [SUBSCRIPT NINE]
@@ -1560,195 +1564,195 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u2788': // [DINGBAT CIRCLED SANS-SERIF DIGIT NINE]
case L'\u2792': // [DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE]
case L'\uFF19': // [FULLWIDTH DIGIT NINE]
- *out = '9';
+ *out ++ = '9';
break;
case L'\u2490': // [DIGIT NINE FULL STOP]
- *out = '9';
- *out = '.';
+ *out ++ = '9';
+ *out ++ = '.';
break;
case L'\u247C': // [PARENTHESIZED DIGIT NINE]
- *out = '(';
- *out = '9';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = '9';
+ *out ++ = ')';
break;
case L'\u2469': // [CIRCLED NUMBER TEN]
case L'\u24FE': // [DOUBLE CIRCLED NUMBER TEN]
case L'\u277F': // [DINGBAT NEGATIVE CIRCLED NUMBER TEN]
case L'\u2789': // [DINGBAT CIRCLED SANS-SERIF NUMBER TEN]
case L'\u2793': // [DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN]
- *out = '1';
- *out = '0';
+ *out ++ = '1';
+ *out ++ = '0';
break;
case L'\u2491': // [NUMBER TEN FULL STOP]
- *out = '1';
- *out = '0';
- *out = '.';
+ *out ++ = '1';
+ *out ++ = '0';
+ *out ++ = '.';
break;
case L'\u247D': // [PARENTHESIZED NUMBER TEN]
- *out = '(';
- *out = '1';
- *out = '0';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = '1';
+ *out ++ = '0';
+ *out ++ = ')';
break;
case L'\u246A': // [CIRCLED NUMBER ELEVEN]
case L'\u24EB': // [NEGATIVE CIRCLED NUMBER ELEVEN]
- *out = '1';
- *out = '1';
+ *out ++ = '1';
+ *out ++ = '1';
break;
case L'\u2492': // [NUMBER ELEVEN FULL STOP]
- *out = '1';
- *out = '1';
- *out = '.';
+ *out ++ = '1';
+ *out ++ = '1';
+ *out ++ = '.';
break;
case L'\u247E': // [PARENTHESIZED NUMBER ELEVEN]
- *out = '(';
- *out = '1';
- *out = '1';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = '1';
+ *out ++ = '1';
+ *out ++ = ')';
break;
case L'\u246B': // [CIRCLED NUMBER TWELVE]
case L'\u24EC': // [NEGATIVE CIRCLED NUMBER TWELVE]
- *out = '1';
- *out = '2';
+ *out ++ = '1';
+ *out ++ = '2';
break;
case L'\u2493': // [NUMBER TWELVE FULL STOP]
- *out = '1';
- *out = '2';
- *out = '.';
+ *out ++ = '1';
+ *out ++ = '2';
+ *out ++ = '.';
break;
case L'\u247F': // [PARENTHESIZED NUMBER TWELVE]
- *out = '(';
- *out = '1';
- *out = '2';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = '1';
+ *out ++ = '2';
+ *out ++ = ')';
break;
case L'\u246C': // [CIRCLED NUMBER THIRTEEN]
case L'\u24ED': // [NEGATIVE CIRCLED NUMBER THIRTEEN]
- *out = '1';
- *out = '3';
+ *out ++ = '1';
+ *out ++ = '3';
break;
case L'\u2494': // [NUMBER THIRTEEN FULL STOP]
- *out = '1';
- *out = '3';
- *out = '.';
+ *out ++ = '1';
+ *out ++ = '3';
+ *out ++ = '.';
break;
case L'\u2480': // [PARENTHESIZED NUMBER THIRTEEN]
- *out = '(';
- *out = '1';
- *out = '3';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = '1';
+ *out ++ = '3';
+ *out ++ = ')';
break;
case L'\u246D': // [CIRCLED NUMBER FOURTEEN]
case L'\u24EE': // [NEGATIVE CIRCLED NUMBER FOURTEEN]
- *out = '1';
- *out = '4';
+ *out ++ = '1';
+ *out ++ = '4';
break;
case L'\u2495': // [NUMBER FOURTEEN FULL STOP]
- *out = '1';
- *out = '4';
- *out = '.';
+ *out ++ = '1';
+ *out ++ = '4';
+ *out ++ = '.';
break;
case L'\u2481': // [PARENTHESIZED NUMBER FOURTEEN]
- *out = '(';
- *out = '1';
- *out = '4';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = '1';
+ *out ++ = '4';
+ *out ++ = ')';
break;
case L'\u246E': // [CIRCLED NUMBER FIFTEEN]
case L'\u24EF': // [NEGATIVE CIRCLED NUMBER FIFTEEN]
- *out = '1';
- *out = '5';
+ *out ++ = '1';
+ *out ++ = '5';
break;
case L'\u2496': // [NUMBER FIFTEEN FULL STOP]
- *out = '1';
- *out = '5';
- *out = '.';
+ *out ++ = '1';
+ *out ++ = '5';
+ *out ++ = '.';
break;
case L'\u2482': // [PARENTHESIZED NUMBER FIFTEEN]
- *out = '(';
- *out = '1';
- *out = '5';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = '1';
+ *out ++ = '5';
+ *out ++ = ')';
break;
case L'\u246F': // [CIRCLED NUMBER SIXTEEN]
case L'\u24F0': // [NEGATIVE CIRCLED NUMBER SIXTEEN]
- *out = '1';
- *out = '6';
+ *out ++ = '1';
+ *out ++ = '6';
break;
case L'\u2497': // [NUMBER SIXTEEN FULL STOP]
- *out = '1';
- *out = '6';
- *out = '.';
+ *out ++ = '1';
+ *out ++ = '6';
+ *out ++ = '.';
break;
case L'\u2483': // [PARENTHESIZED NUMBER SIXTEEN]
- *out = '(';
- *out = '1';
- *out = '6';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = '1';
+ *out ++ = '6';
+ *out ++ = ')';
break;
case L'\u2470': // [CIRCLED NUMBER SEVENTEEN]
case L'\u24F1': // [NEGATIVE CIRCLED NUMBER SEVENTEEN]
- *out = '1';
- *out = '7';
+ *out ++ = '1';
+ *out ++ = '7';
break;
case L'\u2498': // [NUMBER SEVENTEEN FULL STOP]
- *out = '1';
- *out = '7';
- *out = '.';
+ *out ++ = '1';
+ *out ++ = '7';
+ *out ++ = '.';
break;
case L'\u2484': // [PARENTHESIZED NUMBER SEVENTEEN]
- *out = '(';
- *out = '1';
- *out = '7';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = '1';
+ *out ++ = '7';
+ *out ++ = ')';
break;
case L'\u2471': // [CIRCLED NUMBER EIGHTEEN]
case L'\u24F2': // [NEGATIVE CIRCLED NUMBER EIGHTEEN]
- *out = '1';
- *out = '8';
+ *out ++ = '1';
+ *out ++ = '8';
break;
case L'\u2499': // [NUMBER EIGHTEEN FULL STOP]
- *out = '1';
- *out = '8';
- *out = '.';
+ *out ++ = '1';
+ *out ++ = '8';
+ *out ++ = '.';
break;
case L'\u2485': // [PARENTHESIZED NUMBER EIGHTEEN]
- *out = '(';
- *out = '1';
- *out = '8';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = '1';
+ *out ++ = '8';
+ *out ++ = ')';
break;
case L'\u2472': // [CIRCLED NUMBER NINETEEN]
case L'\u24F3': // [NEGATIVE CIRCLED NUMBER NINETEEN]
- *out = '1';
- *out = '9';
+ *out ++ = '1';
+ *out ++ = '9';
break;
case L'\u249A': // [NUMBER NINETEEN FULL STOP]
- *out = '1';
- *out = '9';
- *out = '.';
+ *out ++ = '1';
+ *out ++ = '9';
+ *out ++ = '.';
break;
case L'\u2486': // [PARENTHESIZED NUMBER NINETEEN]
- *out = '(';
- *out = '1';
- *out = '9';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = '1';
+ *out ++ = '9';
+ *out ++ = ')';
break;
case L'\u2473': // [CIRCLED NUMBER TWENTY]
case L'\u24F4': // [NEGATIVE CIRCLED NUMBER TWENTY]
- *out = '2';
- *out = '0';
+ *out ++ = '2';
+ *out ++ = '0';
break;
case L'\u249B': // [NUMBER TWENTY FULL STOP]
- *out = '2';
- *out = '0';
- *out = '.';
+ *out ++ = '2';
+ *out ++ = '0';
+ *out ++ = '.';
break;
case L'\u2487': // [PARENTHESIZED NUMBER TWENTY]
- *out = '(';
- *out = '2';
- *out = '0';
- *out = ')';
+ *out ++ = '(';
+ *out ++ = '2';
+ *out ++ = '0';
+ *out ++ = ')';
break;
case L'\u00AB': // [LEFT-POINTING DOUBLE ANGLE QUOTATION MARK]
case L'\u00BB': // [RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK]
@@ -1762,7 +1766,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u276E': // [HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT]
case L'\u276F': // [HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT]
case L'\uFF02': // [FULLWIDTH QUOTATION MARK]
- *out = '"';
+ *out ++ = '"';
break;
case L'\u2018': // [LEFT SINGLE QUOTATION MARK]
case L'\u2019': // [RIGHT SINGLE QUOTATION MARK]
@@ -1775,7 +1779,7 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u275B': // [HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT]
case L'\u275C': // [HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT]
case L'\uFF07': // [FULLWIDTH APOSTROPHE]
- *out = '\'';
+ *out ++ = '\'';
break;
case L'\u2010': // [HYPHEN]
case L'\u2011': // [NON-BREAKING HYPHEN]
@@ -1785,149 +1789,158 @@ static void fold_to_ascii(wchar_t c, OUTPUT_ITERATOR out)
case L'\u207B': // [SUPERSCRIPT MINUS]
case L'\u208B': // [SUBSCRIPT MINUS]
case L'\uFF0D': // [FULLWIDTH HYPHEN-MINUS]
- *out = '-';
+ *out ++ = '-';
break;
case L'\u2045': // [LEFT SQUARE BRACKET WITH QUILL]
case L'\u2772': // [LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT]
case L'\uFF3B': // [FULLWIDTH LEFT SQUARE BRACKET]
- *out = '[';
+ *out ++ = '[';
break;
case L'\u2046': // [RIGHT SQUARE BRACKET WITH QUILL]
case L'\u2773': // [LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT]
case L'\uFF3D': // [FULLWIDTH RIGHT SQUARE BRACKET]
- *out = ']';
+ *out ++ = ']';
break;
case L'\u207D': // [SUPERSCRIPT LEFT PARENTHESIS]
case L'\u208D': // [SUBSCRIPT LEFT PARENTHESIS]
case L'\u2768': // [MEDIUM LEFT PARENTHESIS ORNAMENT]
case L'\u276A': // [MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT]
case L'\uFF08': // [FULLWIDTH LEFT PARENTHESIS]
- *out = '(';
+ *out ++ = '(';
break;
case L'\u2E28': // [LEFT DOUBLE PARENTHESIS]
- *out = '(';
- *out = '(';
+ *out ++ = '(';
+ *out ++ = '(';
break;
case L'\u207E': // [SUPERSCRIPT RIGHT PARENTHESIS]
case L'\u208E': // [SUBSCRIPT RIGHT PARENTHESIS]
case L'\u2769': // [MEDIUM RIGHT PARENTHESIS ORNAMENT]
case L'\u276B': // [MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT]
case L'\uFF09': // [FULLWIDTH RIGHT PARENTHESIS]
- *out = ')';
+ *out ++ = ')';
break;
case L'\u2E29': // [RIGHT DOUBLE PARENTHESIS]
- *out = ')';
- *out = ')';
+ *out ++ = ')';
+ *out ++ = ')';
break;
case L'\u276C': // [MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT]
case L'\u2770': // [HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT]
case L'\uFF1C': // [FULLWIDTH LESS-THAN SIGN]
- *out = '<';
+ *out ++ = '<';
break;
case L'\u276D': // [MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT]
case L'\u2771': // [HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT]
case L'\uFF1E': // [FULLWIDTH GREATER-THAN SIGN]
- *out = '>';
+ *out ++ = '>';
break;
case L'\u2774': // [MEDIUM LEFT CURLY BRACKET ORNAMENT]
case L'\uFF5B': // [FULLWIDTH LEFT CURLY BRACKET]
- *out = '{';
+ *out ++ = '{';
break;
case L'\u2775': // [MEDIUM RIGHT CURLY BRACKET ORNAMENT]
case L'\uFF5D': // [FULLWIDTH RIGHT CURLY BRACKET]
- *out = '}';
+ *out ++ = '}';
break;
case L'\u207A': // [SUPERSCRIPT PLUS SIGN]
case L'\u208A': // [SUBSCRIPT PLUS SIGN]
case L'\uFF0B': // [FULLWIDTH PLUS SIGN]
- *out = '+';
+ *out ++ = '+';
break;
case L'\u207C': // [SUPERSCRIPT EQUALS SIGN]
case L'\u208C': // [SUBSCRIPT EQUALS SIGN]
case L'\uFF1D': // [FULLWIDTH EQUALS SIGN]
- *out = '=';
+ *out ++ = '=';
break;
case L'\uFF01': // [FULLWIDTH EXCLAMATION MARK]
- *out = '!';
+ *out ++ = '!';
break;
case L'\u203C': // [DOUBLE EXCLAMATION MARK]
- *out = '!';
- *out = '!';
+ *out ++ = '!';
+ *out ++ = '!';
break;
case L'\u2049': // [EXCLAMATION QUESTION MARK]
- *out = '!';
- *out = '?';
+ *out ++ = '!';
+ *out ++ = '?';
break;
case L'\uFF03': // [FULLWIDTH NUMBER SIGN]
- *out = '#';
+ *out ++ = '#';
break;
case L'\uFF04': // [FULLWIDTH DOLLAR SIGN]
- *out = '$';
+ *out ++ = '$';
break;
case L'\u2052': // [COMMERCIAL MINUS SIGN]
case L'\uFF05': // [FULLWIDTH PERCENT SIGN]
- *out = '%';
+ *out ++ = '%';
break;
case L'\uFF06': // [FULLWIDTH AMPERSAND]
- *out = '&';
+ *out ++ = '&';
break;
case L'\u204E': // [LOW ASTERISK]
case L'\uFF0A': // [FULLWIDTH ASTERISK]
- *out = '*';
+ *out ++ = '*';
break;
case L'\uFF0C': // [FULLWIDTH COMMA]
- *out = ',';
+ *out ++ = ',';
break;
case L'\uFF0E': // [FULLWIDTH FULL STOP]
- *out = '.';
+ *out ++ = '.';
break;
case L'\u2044': // [FRACTION SLASH]
case L'\uFF0F': // [FULLWIDTH SOLIDUS]
- *out = '/';
+ *out ++ = '/';
break;
case L'\uFF1A': // [FULLWIDTH COLON]
- *out = ':';
+ *out ++ = ':';
break;
case L'\u204F': // [REVERSED SEMICOLON]
case L'\uFF1B': // [FULLWIDTH SEMICOLON]
- *out = ';';
+ *out ++ = ';';
break;
case L'\uFF1F': // [FULLWIDTH QUESTION MARK]
- *out = '?';
+ *out ++ = '?';
break;
case L'\u2047': // [DOUBLE QUESTION MARK]
- *out = '?';
- *out = '?';
+ *out ++ = '?';
+ *out ++ = '?';
break;
case L'\u2048': // [QUESTION EXCLAMATION MARK]
- *out = '?';
- *out = '!';
+ *out ++ = '?';
+ *out ++ = '!';
break;
case L'\uFF20': // [FULLWIDTH COMMERCIAL AT]
- *out = '@';
+ *out ++ = '@';
break;
case L'\uFF3C': // [FULLWIDTH REVERSE SOLIDUS]
- *out = '\\';
+ *out ++ = '\\';
break;
case L'\u2038': // [CARET]
case L'\uFF3E': // [FULLWIDTH CIRCUMFLEX ACCENT]
- *out = '^';
+ *out ++ = '^';
break;
case L'\uFF3F': // [FULLWIDTH LOW LINE]
- *out = '_';
+ *out ++ = '_';
break;
case L'\u2053': // [SWUNG DASH]
case L'\uFF5E': // [FULLWIDTH TILDE]
- *out = '~';
+ *out ++ = '~';
break;
default:
- *out = c;
+ *out ++ = c;
break;
}
}
+
+ // Return end of the output string.
+ return out;
}
-namespace Slic3r {
+static void fold_to_ascii(wchar_t c, std::back_insert_iterator<std::wstring>& out)
+{
+ wchar_t tmp[4];
+ wchar_t *end = fold_to_ascii(c, tmp);
+ for (wchar_t *it = tmp; it != end; ++ it)
+ *out = *it;
+}
std::string fold_utf8_to_ascii(const std::string &src)
{
@@ -1940,15 +1953,5 @@ std::string fold_utf8_to_ascii(const std::string &src)
return boost::locale::conv::utf_to_utf<char>(dst.c_str(), dst.c_str() + dst.size());
}
-std::string fold_utf8_to_ascii(const char *src)
-{
- std::wstring wstr = boost::locale::conv::utf_to_utf<wchar_t>(src, src + strlen(src));
- std::wstring dst;
- dst.reserve(wstr.size());
- auto out = std::back_insert_iterator<std::wstring>(dst);
- for (wchar_t c : wstr)
- fold_to_ascii(c, out);
- return boost::locale::conv::utf_to_utf<char>(dst.c_str(), dst.c_str() + dst.size());
-}
-}; // namespace Slic3r
+} // namespace Slic3r
diff --git a/src/slic3r/Utils/ASCIIFolding.hpp b/src/slic3r/Utils/ASCIIFolding.hpp
index 55f56482d..0a4aff3da 100644
--- a/src/slic3r/Utils/ASCIIFolding.hpp
+++ b/src/slic3r/Utils/ASCIIFolding.hpp
@@ -7,9 +7,13 @@ namespace Slic3r {
// If possible, remove accents from accented latin characters.
// This function is useful for generating file names to be processed by legacy firmwares.
-extern std::string fold_utf8_to_ascii(const char *src);
-extern std::string fold_utf8_to_ascii(const std::string &src);
+extern std::string fold_utf8_to_ascii(const std::string &src);
-}; // namespace Slic3r
+// Convert the input UNICODE character to a string of maximum 4 output ASCII characters.
+// Return the end of the string written to the output.
+// The output buffer must be at least 4 characters long.
+extern wchar_t* fold_to_ascii(wchar_t c, wchar_t *out);
+
+} // namespace Slic3r
#endif /* slic3r_ASCIIFolding_hpp_ */
diff --git a/src/slic3r/Utils/AstroBox.hpp b/src/slic3r/Utils/AstroBox.hpp
index 38542275c..f24018b1b 100644
--- a/src/slic3r/Utils/AstroBox.hpp
+++ b/src/slic3r/Utils/AstroBox.hpp
@@ -28,7 +28,7 @@ public:
bool can_test() const override { return true; }
bool can_start_print() const override { return true; }
std::string get_host() const override { return host; }
-
+
protected:
bool validate_version_text(const boost::optional<std::string> &version_text) const;
diff --git a/src/slic3r/Utils/Duet.cpp b/src/slic3r/Utils/Duet.cpp
index 4536dd217..ba93603a1 100644
--- a/src/slic3r/Utils/Duet.cpp
+++ b/src/slic3r/Utils/Duet.cpp
@@ -36,12 +36,10 @@ const char* Duet::get_name() const { return "Duet"; }
bool Duet::test(wxString &msg) const
{
- bool connected = connect(msg);
- if (connected) {
- disconnect();
- }
+ auto connectionType = connect(msg);
+ disconnect(connectionType);
- return connected;
+ return connectionType != ConnectionType::error;
}
wxString Duet::get_test_ok_msg () const
@@ -59,33 +57,39 @@ wxString Duet::get_test_failed_msg (wxString &msg) const
bool Duet::upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn) const
{
wxString connect_msg;
- if (!connect(connect_msg)) {
+ auto connectionType = connect(connect_msg);
+ if (connectionType == ConnectionType::error) {
error_fn(std::move(connect_msg));
return false;
}
bool res = true;
+ bool dsf = (connectionType == ConnectionType::dsf);
- auto upload_cmd = get_upload_url(upload_data.upload_path.string());
+ auto upload_cmd = get_upload_url(upload_data.upload_path.string(), connectionType);
BOOST_LOG_TRIVIAL(info) << boost::format("Duet: Uploading file %1%, filepath: %2%, print: %3%, command: %4%")
% upload_data.source_path
% upload_data.upload_path
% upload_data.start_print
% upload_cmd;
- auto http = Http::post(std::move(upload_cmd));
- http.set_post_body(upload_data.source_path)
- .on_complete([&](std::string body, unsigned status) {
+ auto http = (dsf ? Http::put(std::move(upload_cmd)) : Http::post(std::move(upload_cmd)));
+ if (dsf) {
+ http.set_put_body(upload_data.source_path);
+ } else {
+ http.set_post_body(upload_data.source_path);
+ }
+ http.on_complete([&](std::string body, unsigned status) {
BOOST_LOG_TRIVIAL(debug) << boost::format("Duet: File uploaded: HTTP %1%: %2%") % status % body;
- int err_code = get_err_code_from_body(body);
+ int err_code = dsf ? (status == 201 ? 0 : 1) : get_err_code_from_body(body);
if (err_code != 0) {
BOOST_LOG_TRIVIAL(error) << boost::format("Duet: Request completed but error code was received: %1%") % err_code;
error_fn(format_error(body, L("Unknown error occured"), 0));
res = false;
} else if (upload_data.start_print) {
wxString errormsg;
- res = start_print(errormsg, upload_data.upload_path.string());
+ res = start_print(errormsg, upload_data.upload_path.string(), connectionType);
if (! res) {
error_fn(std::move(errormsg));
}
@@ -106,20 +110,28 @@ bool Duet::upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn e
})
.perform_sync();
- disconnect();
+ disconnect(connectionType);
return res;
}
-bool Duet::connect(wxString &msg) const
+Duet::ConnectionType Duet::connect(wxString &msg) const
{
- bool res = false;
- auto url = get_connect_url();
+ auto res = ConnectionType::error;
+ auto url = get_connect_url(false);
auto http = Http::get(std::move(url));
http.on_error([&](std::string body, std::string error, unsigned status) {
- BOOST_LOG_TRIVIAL(error) << boost::format("Duet: Error connecting: %1%, HTTP %2%, body: `%3%`") % error % status % body;
- msg = format_error(body, error, status);
+ auto dsfUrl = get_connect_url(true);
+ auto dsfHttp = Http::get(std::move(dsfUrl));
+ dsfHttp.on_error([&](std::string body, std::string error, unsigned status) {
+ BOOST_LOG_TRIVIAL(error) << boost::format("Duet: Error connecting: %1%, HTTP %2%, body: `%3%`") % error % status % body;
+ msg = format_error(body, error, status);
+ })
+ .on_complete([&](std::string body, unsigned) {
+ res = ConnectionType::dsf;
+ })
+ .perform_sync();
})
.on_complete([&](std::string body, unsigned) {
BOOST_LOG_TRIVIAL(debug) << boost::format("Duet: Got: %1%") % body;
@@ -127,7 +139,7 @@ bool Duet::connect(wxString &msg) const
int err_code = get_err_code_from_body(body);
switch (err_code) {
case 0:
- res = true;
+ res = ConnectionType::rrf;
break;
case 1:
msg = format_error(body, L("Wrong password"), 0);
@@ -146,8 +158,12 @@ bool Duet::connect(wxString &msg) const
return res;
}
-void Duet::disconnect() const
+void Duet::disconnect(ConnectionType connectionType) const
{
+ // we don't need to disconnect from DSF or if it failed anyway
+ if (connectionType != ConnectionType::rrf) {
+ return;
+ }
auto url = (boost::format("%1%rr_disconnect")
% get_base_url()).str();
@@ -159,20 +175,33 @@ void Duet::disconnect() const
.perform_sync();
}
-std::string Duet::get_upload_url(const std::string &filename) const
+std::string Duet::get_upload_url(const std::string &filename, ConnectionType connectionType) const
{
- return (boost::format("%1%rr_upload?name=0:/gcodes/%2%&%3%")
- % get_base_url()
- % Http::url_encode(filename)
- % timestamp_str()).str();
+ assert(connectionType != ConnectionType::error);
+
+ if (connectionType == ConnectionType::dsf) {
+ return (boost::format("%1%machine/file/gcodes/%2%")
+ % get_base_url()
+ % Http::url_encode(filename)).str();
+ } else {
+ return (boost::format("%1%rr_upload?name=0:/gcodes/%2%&%3%")
+ % get_base_url()
+ % Http::url_encode(filename)
+ % timestamp_str()).str();
+ }
}
-std::string Duet::get_connect_url() const
+std::string Duet::get_connect_url(const bool dsfUrl) const
{
- return (boost::format("%1%rr_connect?password=%2%&%3%")
- % get_base_url()
- % (password.empty() ? "reprap" : password)
- % timestamp_str()).str();
+ if (dsfUrl) {
+ return (boost::format("%1%machine/status")
+ % get_base_url()).str();
+ } else {
+ return (boost::format("%1%rr_connect?password=%2%&%3%")
+ % get_base_url()
+ % (password.empty() ? "reprap" : password)
+ % timestamp_str()).str();
+ }
}
std::string Duet::get_base_url() const
@@ -201,15 +230,27 @@ std::string Duet::timestamp_str() const
return std::string(buffer);
}
-bool Duet::start_print(wxString &msg, const std::string &filename) const
+bool Duet::start_print(wxString &msg, const std::string &filename, ConnectionType connectionType) const
{
+ assert(connectionType != ConnectionType::error);
+
bool res = false;
+ bool dsf = (connectionType == ConnectionType::dsf);
- auto url = (boost::format("%1%rr_gcode?gcode=M32%%20\"%2%\"")
+ auto url = dsf
+ ? (boost::format("%1%machine/code")
+ % get_base_url()).str()
+ : (boost::format("%1%rr_gcode?gcode=M32%%20\"0:/gcodes/%2%\"")
% get_base_url()
% Http::url_encode(filename)).str();
- auto http = Http::get(std::move(url));
+ auto http = (dsf ? Http::post(std::move(url)) : Http::get(std::move(url)));
+ if (dsf) {
+ http.set_post_body(
+ (boost::format("M32 \"0:/gcodes/%1%\"")
+ % filename).str()
+ );
+ }
http.on_error([&](std::string body, std::string error, unsigned status) {
BOOST_LOG_TRIVIAL(error) << boost::format("Duet: Error starting print: %1%, HTTP %2%, body: `%3%`") % error % status % body;
msg = format_error(body, error, status);
diff --git a/src/slic3r/Utils/Duet.hpp b/src/slic3r/Utils/Duet.hpp
index 702efbddb..e5aec548b 100644
--- a/src/slic3r/Utils/Duet.hpp
+++ b/src/slic3r/Utils/Duet.hpp
@@ -14,7 +14,7 @@ class Http;
class Duet : public PrintHost
{
public:
- Duet(DynamicPrintConfig *config);
+ explicit Duet(DynamicPrintConfig *config);
~Duet() override = default;
const char* get_name() const override;
@@ -27,18 +27,19 @@ public:
bool can_test() const override { return true; }
bool can_start_print() const override { return true; }
std::string get_host() const override { return host; }
-
+
private:
+ enum class ConnectionType { rrf, dsf, error };
std::string host;
std::string password;
- std::string get_upload_url(const std::string &filename) const;
- std::string get_connect_url() const;
+ std::string get_upload_url(const std::string &filename, ConnectionType connectionType) const;
+ std::string get_connect_url(const bool dsfUrl) const;
std::string get_base_url() const;
std::string timestamp_str() const;
- bool connect(wxString &msg) const;
- void disconnect() const;
- bool start_print(wxString &msg, const std::string &filename) const;
+ ConnectionType connect(wxString &msg) const;
+ void disconnect(ConnectionType connectionType) const;
+ bool start_print(wxString &msg, const std::string &filename, ConnectionType connectionType) const;
int get_err_code_from_body(const std::string &body) const;
};
diff --git a/src/slic3r/Utils/FixModelByWin10.cpp b/src/slic3r/Utils/FixModelByWin10.cpp
index 0de526432..bcab6daaf 100644
--- a/src/slic3r/Utils/FixModelByWin10.cpp
+++ b/src/slic3r/Utils/FixModelByWin10.cpp
@@ -30,10 +30,10 @@
#include "libslic3r/Model.hpp"
#include "libslic3r/Print.hpp"
+#include "libslic3r/PresetBundle.hpp"
#include "libslic3r/Format/3mf.hpp"
#include "../GUI/GUI.hpp"
#include "../GUI/I18N.hpp"
-#include "../GUI/PresetBundle.hpp"
#include <wx/msgdlg.h>
#include <wx/progdlg.h>
@@ -209,10 +209,10 @@ typedef std::function<void (const char * /* message */, unsigned /* progress */)
void fix_model_by_win10_sdk(const std::string &path_src, const std::string &path_dst, ProgressFn on_progress, ThrowOnCancelFn throw_on_cancel)
{
if (! is_windows10())
- throw std::runtime_error("fix_model_by_win10_sdk called on non Windows 10 system");
+ throw Slic3r::RuntimeError("fix_model_by_win10_sdk called on non Windows 10 system");
if (! winrt_load_runtime_object_library())
- throw std::runtime_error("Failed to initialize the WinRT library.");
+ throw Slic3r::RuntimeError("Failed to initialize the WinRT library.");
HRESULT hr = (*s_RoInitialize)(RO_INIT_MULTITHREADED);
{
@@ -232,7 +232,7 @@ void fix_model_by_win10_sdk(const std::string &path_src, const std::string &path
if (status == AsyncStatus::Completed)
hr = modelAsync->GetResults(model.GetAddressOf());
else
- throw std::runtime_error(L("Failed loading the input model."));
+ throw Slic3r::RuntimeError(L("Failed loading the input model."));
Microsoft::WRL::ComPtr<ABI::Windows::Foundation::Collections::IVector<ABI::Windows::Graphics::Printing3D::Printing3DMesh*>> meshes;
hr = model->get_Meshes(meshes.GetAddressOf());
@@ -245,7 +245,7 @@ void fix_model_by_win10_sdk(const std::string &path_src, const std::string &path
hr = model->RepairAsync(repairAsync.GetAddressOf());
status = winrt_async_await(repairAsync, throw_on_cancel);
if (status != AsyncStatus::Completed)
- throw std::runtime_error(L("Mesh repair failed."));
+ throw Slic3r::RuntimeError(L("Mesh repair failed."));
repairAsync->GetResults();
on_progress(L("Loading repaired model"), 60);
@@ -260,14 +260,14 @@ void fix_model_by_win10_sdk(const std::string &path_src, const std::string &path
hr = printing3d3mfpackage->SaveModelToPackageAsync(model.Get(), saveToPackageAsync.GetAddressOf());
status = winrt_async_await(saveToPackageAsync, throw_on_cancel);
if (status != AsyncStatus::Completed)
- throw std::runtime_error(L("Saving mesh into the 3MF container failed."));
+ throw Slic3r::RuntimeError(L("Saving mesh into the 3MF container failed."));
hr = saveToPackageAsync->GetResults();
Microsoft::WRL::ComPtr<ABI::Windows::Foundation::IAsyncOperation<ABI::Windows::Storage::Streams::IRandomAccessStream*>> generatorStreamAsync;
hr = printing3d3mfpackage->SaveAsync(generatorStreamAsync.GetAddressOf());
status = winrt_async_await(generatorStreamAsync, throw_on_cancel);
if (status != AsyncStatus::Completed)
- throw std::runtime_error(L("Saving mesh into the 3MF container failed."));
+ throw Slic3r::RuntimeError(L("Saving mesh into the 3MF container failed."));
Microsoft::WRL::ComPtr<ABI::Windows::Storage::Streams::IRandomAccessStream> generatorStream;
hr = generatorStreamAsync->GetResults(generatorStream.GetAddressOf());
@@ -299,7 +299,7 @@ void fix_model_by_win10_sdk(const std::string &path_src, const std::string &path
hr = inputStream->ReadAsync(buffer.Get(), 65536 * 2048, ABI::Windows::Storage::Streams::InputStreamOptions_ReadAhead, asyncRead.GetAddressOf());
status = winrt_async_await(asyncRead, throw_on_cancel);
if (status != AsyncStatus::Completed)
- throw std::runtime_error(L("Saving mesh into the 3MF container failed."));
+ throw Slic3r::RuntimeError(L("Saving mesh into the 3MF container failed."));
hr = buffer->get_Length(&length);
if (length == 0)
break;
@@ -337,8 +337,8 @@ void fix_model_by_win10_sdk_gui(ModelObject &model_object, int volume_idx)
// Open a progress dialog.
wxProgressDialog progress_dialog(
- _(L("Model fixing")),
- _(L("Exporting model...")),
+ _L("Model fixing"),
+ _L("Exporting model") + "...",
100, nullptr, wxPD_AUTO_HIDE | wxPD_APP_MODAL | wxPD_CAN_ABORT);
// Executing the calculation in a background thread, so that the COM context could be created with its own threading model.
// (It seems like wxWidgets initialize the COM contex as single threaded and we need a multi-threaded context).
@@ -365,7 +365,7 @@ void fix_model_by_win10_sdk_gui(ModelObject &model_object, int volume_idx)
model_object->add_instance();
if (!Slic3r::store_3mf(path_src.string().c_str(), &model, nullptr, false)) {
boost::filesystem::remove(path_src);
- throw std::runtime_error(L("Export of a temporary 3mf file failed"));
+ throw Slic3r::RuntimeError(L("Export of a temporary 3mf file failed"));
}
model.clear_objects();
model.clear_materials();
@@ -380,15 +380,15 @@ void fix_model_by_win10_sdk_gui(ModelObject &model_object, int volume_idx)
bool loaded = Slic3r::load_3mf(path_dst.string().c_str(), &config, &model, false);
boost::filesystem::remove(path_dst);
if (! loaded)
- throw std::runtime_error(L("Import of the repaired 3mf file failed"));
+ throw Slic3r::RuntimeError(L("Import of the repaired 3mf file failed"));
if (model.objects.size() == 0)
- throw std::runtime_error(L("Repaired 3MF file does not contain any object"));
+ throw Slic3r::RuntimeError(L("Repaired 3MF file does not contain any object"));
if (model.objects.size() > 1)
- throw std::runtime_error(L("Repaired 3MF file contains more than one object"));
+ throw Slic3r::RuntimeError(L("Repaired 3MF file contains more than one object"));
if (model.objects.front()->volumes.size() == 0)
- throw std::runtime_error(L("Repaired 3MF file does not contain any volume"));
+ throw Slic3r::RuntimeError(L("Repaired 3MF file does not contain any volume"));
if (model.objects.front()->volumes.size() > 1)
- throw std::runtime_error(L("Repaired 3MF file contains more than one volume"));
+ throw Slic3r::RuntimeError(L("Repaired 3MF file contains more than one volume"));
meshes_repaired.emplace_back(std::move(model.objects.front()->volumes.front()->mesh()));
}
for (size_t i = 0; i < volumes.size(); ++ i) {
diff --git a/src/slic3r/Utils/FlashAir.cpp b/src/slic3r/Utils/FlashAir.cpp
index bca331e84..22eaddece 100644
--- a/src/slic3r/Utils/FlashAir.cpp
+++ b/src/slic3r/Utils/FlashAir.cpp
@@ -70,7 +70,7 @@ wxString FlashAir::get_test_ok_msg () const
wxString FlashAir::get_test_failed_msg (wxString &msg) const
{
- return GUI::from_u8((boost::format("%s: %s")
+ return GUI::from_u8((boost::format("%s: %s\n%s")
% _utf8(L("Could not connect to FlashAir"))
% std::string(msg.ToUTF8())
% _utf8(L("Note: FlashAir with firmware 2.00.02 or newer and activated upload function is required."))).str());
@@ -182,8 +182,6 @@ std::string FlashAir::timestamp_str() const
auto t = std::time(nullptr);
auto tm = *std::localtime(&t);
- const char *name = get_name();
-
unsigned long fattime = ((tm.tm_year - 80) << 25) |
((tm.tm_mon + 1) << 21) |
(tm.tm_mday << 16) |
diff --git a/src/slic3r/Utils/FlashAir.hpp b/src/slic3r/Utils/FlashAir.hpp
index 40af48da1..181405d46 100644
--- a/src/slic3r/Utils/FlashAir.hpp
+++ b/src/slic3r/Utils/FlashAir.hpp
@@ -28,7 +28,7 @@ public:
bool can_test() const override { return true; }
bool can_start_print() const override { return false; }
std::string get_host() const override { return host; }
-
+
private:
std::string host;
diff --git a/src/slic3r/Utils/Http.cpp b/src/slic3r/Utils/Http.cpp
index 69301547c..94a8c9a56 100644
--- a/src/slic3r/Utils/Http.cpp
+++ b/src/slic3r/Utils/Http.cpp
@@ -7,12 +7,21 @@
#include <sstream>
#include <exception>
#include <boost/filesystem/fstream.hpp>
+#include <boost/filesystem/path.hpp>
+#include <boost/filesystem.hpp>
#include <boost/format.hpp>
+#include <boost/log/trivial.hpp>
#include <curl/curl.h>
-#include "libslic3r/libslic3r.h"
-#include "libslic3r/Utils.hpp"
+#ifdef OPENSSL_CERT_OVERRIDE
+#include <openssl/x509.h>
+#endif
+
+#include <libslic3r/libslic3r.h>
+#include <libslic3r/Utils.hpp>
+#include <slic3r/GUI/I18N.hpp>
+#include <slic3r/GUI/format.hpp>
namespace fs = boost::filesystem;
@@ -22,14 +31,75 @@ namespace Slic3r {
// Private
-class CurlGlobalInit
-{
- static const CurlGlobalInit instance;
+struct CurlGlobalInit
+{
+ static std::unique_ptr<CurlGlobalInit> instance;
+ std::string message;
+
+ CurlGlobalInit()
+ {
+#ifdef OPENSSL_CERT_OVERRIDE // defined if SLIC3R_STATIC=ON
+
+ // Look for a set of distro specific directories. Don't change the
+ // order: https://bugzilla.redhat.com/show_bug.cgi?id=1053882
+ static const char * CA_BUNDLES[] = {
+ "/etc/pki/tls/certs/ca-bundle.crt", // Fedora/RHEL 6
+ "/etc/ssl/certs/ca-certificates.crt", // Debian/Ubuntu/Gentoo etc.
+ "/usr/share/ssl/certs/ca-bundle.crt",
+ "/usr/local/share/certs/ca-root-nss.crt", // FreeBSD
+ "/etc/ssl/cert.pem",
+ "/etc/ssl/ca-bundle.pem" // OpenSUSE Tumbleweed
+ };
+
+ namespace fs = boost::filesystem;
+ // Env var name for the OpenSSL CA bundle (SSL_CERT_FILE nomally)
+ const char *const SSL_CA_FILE = X509_get_default_cert_file_env();
+ const char * ssl_cafile = ::getenv(SSL_CA_FILE);
+
+ if (!ssl_cafile)
+ ssl_cafile = X509_get_default_cert_file();
+
+ int replace = true;
+ if (!ssl_cafile || !fs::exists(fs::path(ssl_cafile))) {
+ const char * bundle = nullptr;
+ for (const char * b : CA_BUNDLES) {
+ if (fs::exists(fs::path(b))) {
+ ::setenv(SSL_CA_FILE, bundle = b, replace);
+ break;
+ }
+ }
+
+ if (!bundle)
+ message = _u8L("Could not detect system SSL certificate store. "
+ "PrusaSlicer will be unable to establish secure "
+ "network connections.");
+ else
+ message = Slic3r::GUI::format(
+ _L("PrusaSlicer detected system SSL certificate store in: %1%"),
+ bundle);
+
+ message += "\n" + Slic3r::GUI::format(
+ _L("To specify the system certificate store manually, please "
+ "set the %1% environment variable to the correct CA bundle "
+ "and restart the application."),
+ SSL_CA_FILE);
+ }
+
+#endif // OPENSSL_CERT_OVERRIDE
+
+ if (CURLcode ec = ::curl_global_init(CURL_GLOBAL_DEFAULT)) {
+ message += _u8L("CURL init has failed. PrusaSlicer will be unable to establish "
+ "network connections. See logs for additional details.");
+
+ BOOST_LOG_TRIVIAL(error) << ::curl_easy_strerror(ec);
+ }
+ }
- CurlGlobalInit() { ::curl_global_init(CURL_GLOBAL_DEFAULT); }
~CurlGlobalInit() { ::curl_global_cleanup(); }
};
+std::unique_ptr<CurlGlobalInit> CurlGlobalInit::instance;
+
struct Http::priv
{
enum {
@@ -50,6 +120,7 @@ struct Http::priv
std::string error_buffer; // Used for CURLOPT_ERRORBUFFER
size_t limit;
bool cancel;
+ std::unique_ptr<fs::ifstream> putFile;
std::thread io_thread;
Http::CompleteFn completefn;
@@ -68,6 +139,8 @@ struct Http::priv
void set_timeout_connect(long timeout);
void form_add_file(const char *name, const fs::path &path, const char* filename);
void set_post_body(const fs::path &path);
+ void set_post_body(const std::string &body);
+ void set_put_body(const fs::path &path);
std::string curl_error(CURLcode curlcode);
std::string body_size_error();
@@ -83,8 +156,10 @@ Http::priv::priv(const std::string &url)
, limit(0)
, cancel(false)
{
+ Http::tls_global_init();
+
if (curl == nullptr) {
- throw std::runtime_error(std::string("Could not construct Curl object"));
+ throw Slic3r::RuntimeError(std::string("Could not construct Curl object"));
}
set_timeout_connect(DEFAULT_TIMEOUT_CONNECT);
@@ -205,11 +280,28 @@ void Http::priv::form_add_file(const char *name, const fs::path &path, const cha
}
}
+//FIXME may throw! Is the caller aware of it?
void Http::priv::set_post_body(const fs::path &path)
{
std::ifstream file(path.string());
std::string file_content { std::istreambuf_iterator<char>(file), std::istreambuf_iterator<char>() };
- postfields = file_content;
+ postfields = std::move(file_content);
+}
+
+void Http::priv::set_post_body(const std::string &body)
+{
+ postfields = body;
+}
+
+void Http::priv::set_put_body(const fs::path &path)
+{
+ boost::system::error_code ec;
+ boost::uintmax_t filesize = file_size(path, ec);
+ if (!ec) {
+ putFile = std::make_unique<fs::ifstream>(path);
+ ::curl_easy_setopt(curl, CURLOPT_READDATA, (void *) (putFile.get()));
+ ::curl_easy_setopt(curl, CURLOPT_INFILESIZE, filesize);
+ }
}
std::string Http::priv::curl_error(CURLcode curlcode)
@@ -263,6 +355,8 @@ void Http::priv::http_perform()
CURLcode res = ::curl_easy_perform(curl);
+ putFile.reset();
+
if (res != CURLE_OK) {
if (res == CURLE_ABORTED_BY_CALLBACK) {
if (cancel) {
@@ -301,6 +395,7 @@ Http::Http(Http &&other) : p(std::move(other.p)) {}
Http::~Http()
{
+ assert(! p || ! p->putFile);
if (p && p->io_thread.joinable()) {
p->io_thread.detach();
}
@@ -343,6 +438,25 @@ Http& Http::remove_header(std::string name)
return *this;
}
+// Authorization by HTTP digest, based on RFC2617.
+Http& Http::auth_digest(const std::string &user, const std::string &password)
+{
+ curl_easy_setopt(p->curl, CURLOPT_USERNAME, user.c_str());
+ curl_easy_setopt(p->curl, CURLOPT_PASSWORD, password.c_str());
+ curl_easy_setopt(p->curl, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);
+
+ return *this;
+}
+
+Http& Http::auth_basic(const std::string &user, const std::string &password)
+{
+ curl_easy_setopt(p->curl, CURLOPT_USERNAME, user.c_str());
+ curl_easy_setopt(p->curl, CURLOPT_PASSWORD, password.c_str());
+ curl_easy_setopt(p->curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
+
+ return *this;
+}
+
Http& Http::ca_file(const std::string &name)
{
if (p && priv::ca_file_supported(p->curl)) {
@@ -383,6 +497,18 @@ Http& Http::set_post_body(const fs::path &path)
return *this;
}
+Http& Http::set_post_body(const std::string &body)
+{
+ if (p) { p->set_post_body(body); }
+ return *this;
+}
+
+Http& Http::set_put_body(const fs::path &path)
+{
+ if (p) { p->set_put_body(path);}
+ return *this;
+}
+
Http& Http::on_complete(CompleteFn fn)
{
if (p) { p->completefn = std::move(fn); }
@@ -437,12 +563,38 @@ Http Http::post(std::string url)
return http;
}
+Http Http::put(std::string url)
+{
+ Http http{std::move(url)};
+ curl_easy_setopt(http.p->curl, CURLOPT_UPLOAD, 1L);
+ return http;
+}
+
bool Http::ca_file_supported()
{
::CURL *curl = ::curl_easy_init();
bool res = priv::ca_file_supported(curl);
if (curl != nullptr) { ::curl_easy_cleanup(curl); }
- return res;
+ return res;
+}
+
+std::string Http::tls_global_init()
+{
+ if (!CurlGlobalInit::instance)
+ CurlGlobalInit::instance = std::make_unique<CurlGlobalInit>();
+
+ return CurlGlobalInit::instance->message;
+}
+
+std::string Http::tls_system_cert_store()
+{
+ std::string ret;
+
+#ifdef OPENSSL_CERT_OVERRIDE
+ ret = ::getenv(X509_get_default_cert_file_env());
+#endif
+
+ return ret;
}
std::string Http::url_encode(const std::string &str)
diff --git a/src/slic3r/Utils/Http.hpp b/src/slic3r/Utils/Http.hpp
index 076fa4a0c..f34a27fbc 100644
--- a/src/slic3r/Utils/Http.hpp
+++ b/src/slic3r/Utils/Http.hpp
@@ -49,6 +49,7 @@ public:
// for a GET and a POST request respectively.
static Http get(std::string url);
static Http post(std::string url);
+ static Http put(std::string url);
~Http();
Http(const Http &) = delete;
@@ -64,6 +65,10 @@ public:
Http& header(std::string name, const std::string &value);
// Removes a header field.
Http& remove_header(std::string name);
+ // Authorization by HTTP digest, based on RFC2617.
+ Http& auth_digest(const std::string &user, const std::string &password);
+ // Basic HTTP authorization
+ Http& auth_basic(const std::string &user, const std::string &password);
// Sets a CA certificate file for usage with HTTPS. This is only supported on some backends,
// specifically, this is supported with OpenSSL and NOT supported with Windows and OS X native certificate store.
// See also ca_file_supported().
@@ -80,6 +85,16 @@ public:
// This can be used for hosts which do not support multipart requests.
Http& set_post_body(const boost::filesystem::path &path);
+ // Set the POST request body.
+ // The data is used verbatim, it is not additionally encoded in any way.
+ // This can be used for hosts which do not support multipart requests.
+ Http& set_post_body(const std::string &body);
+
+ // Set the file contents as a PUT request body.
+ // The data is used verbatim, it is not additionally encoded in any way.
+ // This can be used for hosts which do not support multipart requests.
+ Http& set_put_body(const boost::filesystem::path &path);
+
// Callback called on HTTP request complete
Http& on_complete(CompleteFn fn);
// Callback called on an error occuring at any stage of the requests: Url parsing, DNS lookup,
@@ -101,6 +116,10 @@ public:
// Tells whether current backend supports seting up a CA file using ca_file()
static bool ca_file_supported();
+ // Return empty string on success or error message on fail.
+ static std::string tls_global_init();
+ static std::string tls_system_cert_store();
+
// converts the given string to an url_encoded_string
static std::string url_encode(const std::string &str);
private:
diff --git a/src/slic3r/Utils/OctoPrint.cpp b/src/slic3r/Utils/OctoPrint.cpp
index ee87f822f..fad45f822 100644
--- a/src/slic3r/Utils/OctoPrint.cpp
+++ b/src/slic3r/Utils/OctoPrint.cpp
@@ -11,7 +11,6 @@
#include <wx/progdlg.h>
-#include "libslic3r/PrintConfig.hpp"
#include "slic3r/GUI/I18N.hpp"
#include "slic3r/GUI/GUI.hpp"
#include "Http.hpp"
@@ -170,6 +169,13 @@ std::string OctoPrint::make_url(const std::string &path) const
}
}
+SL1Host::SL1Host(DynamicPrintConfig *config) :
+ OctoPrint(config),
+ authorization_type(dynamic_cast<const ConfigOptionEnum<AuthorizationType>*>(config->option("printhost_authorization_type"))->value),
+ username(config->opt_string("printhost_user")),
+ password(config->opt_string("printhost_password"))
+{
+}
// SL1Host
const char* SL1Host::get_name() const { return "SL1Host"; }
@@ -191,4 +197,20 @@ bool SL1Host::validate_version_text(const boost::optional<std::string> &version_
return version_text ? boost::starts_with(*version_text, "Prusa SLA") : false;
}
+void SL1Host::set_auth(Http &http) const
+{
+ switch (authorization_type) {
+ case atKeyPassword:
+ http.header("X-Api-Key", get_apikey());
+ break;
+ case atUserPassword:
+ http.auth_digest(username, password);
+ break;
+ }
+
+ if (! get_cafile().empty()) {
+ http.ca_file(get_cafile());
+ }
+}
+
}
diff --git a/src/slic3r/Utils/OctoPrint.hpp b/src/slic3r/Utils/OctoPrint.hpp
index 965019d85..ed1c61bd6 100644
--- a/src/slic3r/Utils/OctoPrint.hpp
+++ b/src/slic3r/Utils/OctoPrint.hpp
@@ -6,6 +6,7 @@
#include <boost/optional.hpp>
#include "PrintHost.hpp"
+#include "libslic3r/PrintConfig.hpp"
namespace Slic3r {
@@ -29,6 +30,8 @@ public:
bool can_test() const override { return true; }
bool can_start_print() const override { return true; }
std::string get_host() const override { return host; }
+ const std::string& get_apikey() const { return apikey; }
+ const std::string& get_cafile() const { return cafile; }
protected:
virtual bool validate_version_text(const boost::optional<std::string> &version_text) const;
@@ -38,14 +41,14 @@ private:
std::string apikey;
std::string cafile;
- void set_auth(Http &http) const;
+ virtual void set_auth(Http &http) const;
std::string make_url(const std::string &path) const;
};
class SL1Host: public OctoPrint
{
public:
- SL1Host(DynamicPrintConfig *config) : OctoPrint(config) {}
+ SL1Host(DynamicPrintConfig *config);
~SL1Host() override = default;
const char* get_name() const override;
@@ -56,6 +59,15 @@ public:
protected:
bool validate_version_text(const boost::optional<std::string> &version_text) const override;
+
+private:
+ void set_auth(Http &http) const override;
+
+ // Host authorization type.
+ AuthorizationType authorization_type;
+ // username and password for HTTP Digest Authentization (RFC RFC2617)
+ std::string username;
+ std::string password;
};
}
diff --git a/src/slic3r/Utils/PresetUpdater.cpp b/src/slic3r/Utils/PresetUpdater.cpp
index d7c2aea3a..60dfe05c7 100644
--- a/src/slic3r/Utils/PresetUpdater.cpp
+++ b/src/slic3r/Utils/PresetUpdater.cpp
@@ -17,13 +17,17 @@
#include <wx/msgdlg.h>
#include "libslic3r/libslic3r.h"
+#include "libslic3r/format.hpp"
#include "libslic3r/Utils.hpp"
+#include "libslic3r/PresetBundle.hpp"
#include "slic3r/GUI/GUI.hpp"
#include "slic3r/GUI/I18N.hpp"
-#include "slic3r/GUI/PresetBundle.hpp"
#include "slic3r/GUI/UpdateDialogs.hpp"
#include "slic3r/GUI/ConfigWizard.hpp"
#include "slic3r/GUI/GUI_App.hpp"
+#include "slic3r/GUI/Plater.hpp"
+#include "slic3r/GUI/format.hpp"
+#include "slic3r/GUI/NotificationManager.hpp"
#include "slic3r/Utils/Http.hpp"
#include "slic3r/Config/Version.hpp"
#include "slic3r/Config/Snapshot.hpp"
@@ -54,7 +58,7 @@ void copy_file_fix(const fs::path &source, const fs::path &target)
{
static const auto perms = fs::owner_read | fs::owner_write | fs::group_read | fs::others_read; // aka 644
- BOOST_LOG_TRIVIAL(debug) << boost::format("PresetUpdater: Copying %1% -> %2%") % source % target;
+ BOOST_LOG_TRIVIAL(debug) << format("PresetUpdater: Copying %1% -> %2%", source, target);
// Make sure the file has correct permission both before and after we copy over it
if (fs::exists(target)) {
@@ -151,6 +155,9 @@ struct PresetUpdater::priv
bool cancel;
std::thread thread;
+ bool has_waiting_updates { false };
+ Updates waiting_updates;
+
priv();
void set_download_prefs(AppConfig *app_config);
@@ -162,6 +169,7 @@ struct PresetUpdater::priv
void check_install_indices() const;
Updates get_config_updates(const Semver& old_slic3r_version) const;
void perform_updates(Updates &&updates, bool snapshot = true) const;
+ void set_waiting_updates(Updates u);
};
PresetUpdater::priv::priv()
@@ -190,12 +198,12 @@ bool PresetUpdater::priv::get_file(const std::string &url, const fs::path &targe
{
bool res = false;
fs::path tmp_path = target_path;
- tmp_path += (boost::format(".%1%%2%") % get_current_pid() % TMP_EXTENSION).str();
+ tmp_path += format(".%1%%2%", get_current_pid(), TMP_EXTENSION);
- BOOST_LOG_TRIVIAL(info) << boost::format("Get: `%1%`\n\t-> `%2%`\n\tvia tmp path `%3%`")
- % url
- % target_path.string()
- % tmp_path.string();
+ BOOST_LOG_TRIVIAL(info) << format("Get: `%1%`\n\t-> `%2%`\n\tvia tmp path `%3%`",
+ url,
+ target_path.string(),
+ tmp_path.string());
Http::get(url)
.on_progress([this](Http::Progress, bool &cancel) {
@@ -203,10 +211,10 @@ bool PresetUpdater::priv::get_file(const std::string &url, const fs::path &targe
})
.on_error([&](std::string body, std::string error, unsigned http_status) {
(void)body;
- BOOST_LOG_TRIVIAL(error) << boost::format("Error getting: `%1%`: HTTP %2%, %3%")
- % url
- % http_status
- % error;
+ BOOST_LOG_TRIVIAL(error) << format("Error getting: `%1%`: HTTP %2%, %3%",
+ url,
+ http_status,
+ error);
})
.on_complete([&](std::string body, unsigned /* http_status */) {
fs::fstream file(tmp_path, std::ios::out | std::ios::binary | std::ios::trunc);
@@ -235,7 +243,7 @@ void PresetUpdater::priv::sync_version() const
{
if (! enabled_version_check) { return; }
- BOOST_LOG_TRIVIAL(info) << boost::format("Downloading %1% online version from: `%2%`") % SLIC3R_APP_NAME % version_check_url;
+ BOOST_LOG_TRIVIAL(info) << format("Downloading %1% online version from: `%2%`", SLIC3R_APP_NAME, version_check_url);
Http::get(version_check_url)
.size_limit(SLIC3R_VERSION_BODY_MAX)
@@ -244,10 +252,10 @@ void PresetUpdater::priv::sync_version() const
})
.on_error([&](std::string body, std::string error, unsigned http_status) {
(void)body;
- BOOST_LOG_TRIVIAL(error) << boost::format("Error getting: `%1%`: HTTP %2%, %3%")
- % version_check_url
- % http_status
- % error;
+ BOOST_LOG_TRIVIAL(error) << format("Error getting: `%1%`: HTTP %2%, %3%",
+ version_check_url,
+ http_status,
+ error);
})
.on_complete([&](std::string body, unsigned /* http_status */) {
boost::trim(body);
@@ -257,11 +265,11 @@ void PresetUpdater::priv::sync_version() const
}
if (! Semver::parse(body)) {
- BOOST_LOG_TRIVIAL(warning) << boost::format("Received invalid contents from `%1%`: Not a correct semver: `%2%`") % SLIC3R_APP_NAME % body;
+ BOOST_LOG_TRIVIAL(warning) << format("Received invalid contents from `%1%`: Not a correct semver: `%2%`", SLIC3R_APP_NAME, body);
return;
}
- BOOST_LOG_TRIVIAL(info) << boost::format("Got %1% online version: `%2%`. Sending to GUI thread...") % SLIC3R_APP_NAME % body;
+ BOOST_LOG_TRIVIAL(info) << format("Got %1% online version: `%2%`. Sending to GUI thread...", SLIC3R_APP_NAME, body);
wxCommandEvent* evt = new wxCommandEvent(EVT_SLIC3R_VERSION_ONLINE);
evt->SetString(GUI::from_u8(body));
@@ -301,7 +309,8 @@ void PresetUpdater::priv::sync_config(const VendorMap vendors)
const std::string idx_path = (cache_path / (vendor.id + ".idx")).string();
const std::string idx_path_temp = idx_path + "-update";
//check if idx_url is leading to our site
- if (! boost::starts_with(idx_url, "http://files.prusa3d.com/wp-content/uploads/repository/"))
+ if (! boost::starts_with(idx_url, "http://files.prusa3d.com/wp-content/uploads/repository/") &&
+ ! boost::starts_with(idx_url, "https://files.prusa3d.com/wp-content/uploads/repository/"))
{
BOOST_LOG_TRIVIAL(warning) << "unsafe url path for vendor \"" << vendor.name << "\" rejected: " << idx_url;
continue;
@@ -315,15 +324,23 @@ void PresetUpdater::priv::sync_config(const VendorMap vendors)
try {
new_index.load(idx_path_temp);
} catch (const std::exception & /* err */) {
- BOOST_LOG_TRIVIAL(error) << boost::format("Could not load downloaded index %1% for vendor %2%: invalid index?") % idx_path_temp % vendor.name;
+ BOOST_LOG_TRIVIAL(error) << format("Could not load downloaded index %1% for vendor %2%: invalid index?", idx_path_temp, vendor.name);
continue;
}
if (new_index.version() < index.version()) {
- BOOST_LOG_TRIVIAL(warning) << boost::format("The downloaded index %1% for vendor %2% is older than the active one. Ignoring the downloaded index.") % idx_path_temp % vendor.name;
+ BOOST_LOG_TRIVIAL(warning) << format("The downloaded index %1% for vendor %2% is older than the active one. Ignoring the downloaded index.", idx_path_temp, vendor.name);
continue;
}
Slic3r::rename_file(idx_path_temp, idx_path);
- index = std::move(new_index);
+ //if we rename path we need to change it in Index object too or create the object again
+ //index = std::move(new_index);
+ try {
+ index.load(idx_path);
+ }
+ catch (const std::exception& /* err */) {
+ BOOST_LOG_TRIVIAL(error) << format("Could not load downloaded index %1% for vendor %2%: invalid index?", idx_path, vendor.name);
+ continue;
+ }
if (cancel)
return;
}
@@ -331,22 +348,22 @@ void PresetUpdater::priv::sync_config(const VendorMap vendors)
// See if a there's a new version to download
const auto recommended_it = index.recommended();
if (recommended_it == index.end()) {
- BOOST_LOG_TRIVIAL(error) << boost::format("No recommended version for vendor: %1%, invalid index?") % vendor.name;
+ BOOST_LOG_TRIVIAL(error) << format("No recommended version for vendor: %1%, invalid index?", vendor.name);
continue;
}
const auto recommended = recommended_it->config_version;
- BOOST_LOG_TRIVIAL(debug) << boost::format("Got index for vendor: %1%: current version: %2%, recommended version: %3%")
- % vendor.name
- % vendor.config_version.to_string()
- % recommended.to_string();
+ BOOST_LOG_TRIVIAL(debug) << format("Got index for vendor: %1%: current version: %2%, recommended version: %3%",
+ vendor.name,
+ vendor.config_version.to_string(),
+ recommended.to_string());
if (vendor.config_version >= recommended) { continue; }
// Download a fresh bundle
BOOST_LOG_TRIVIAL(info) << "Downloading new bundle for vendor: " << vendor.name;
- const auto bundle_url = (boost::format("%1%/%2%.ini") % vendor.config_update_url % recommended.to_string()).str();
+ const auto bundle_url = format("%1%/%2%.ini", vendor.config_update_url, recommended.to_string());
const auto bundle_path = cache_path / (vendor.id + ".ini");
if (! get_file(bundle_url, bundle_path)) { continue; }
if (cancel) { return; }
@@ -394,7 +411,7 @@ Updates PresetUpdater::priv::get_config_updates(const Semver &old_slic3r_version
auto bundle_path_idx = vendor_path / idx.path().filename();
if (! fs::exists(bundle_path)) {
- BOOST_LOG_TRIVIAL(info) << boost::format("Confing bundle not installed for vendor %1%, skipping: ") % idx.vendor();
+ BOOST_LOG_TRIVIAL(info) << format("Confing bundle not installed for vendor %1%, skipping: ", idx.vendor());
continue;
}
@@ -405,7 +422,7 @@ Updates PresetUpdater::priv::get_config_updates(const Semver &old_slic3r_version
// from the internet, or installed / updated from the installation resources.
auto recommended = idx.recommended();
if (recommended == idx.end()) {
- BOOST_LOG_TRIVIAL(error) << boost::format("No recommended version for vendor: %1%, invalid index? Giving up.") % idx.vendor();
+ BOOST_LOG_TRIVIAL(error) << format("No recommended version for vendor: %1%, invalid index? Giving up.", idx.vendor());
// XXX: what should be done here?
continue;
}
@@ -413,15 +430,15 @@ Updates PresetUpdater::priv::get_config_updates(const Semver &old_slic3r_version
const auto ver_current = idx.find(vp.config_version);
const bool ver_current_found = ver_current != idx.end();
- BOOST_LOG_TRIVIAL(debug) << boost::format("Vendor: %1%, version installed: %2%%3%, version cached: %4%")
- % vp.name
- % vp.config_version.to_string()
- % (ver_current_found ? "" : " (not found in index!)")
- % recommended->config_version.to_string();
+ BOOST_LOG_TRIVIAL(debug) << format("Vendor: %1%, version installed: %2%%3%, version cached: %4%",
+ vp.name,
+ vp.config_version.to_string(),
+ (ver_current_found ? "" : " (not found in index!)"),
+ recommended->config_version.to_string());
if (! ver_current_found) {
// Any published config shall be always found in the latest config index.
- auto message = (boost::format("Preset bundle `%1%` version not found in index: %2%") % idx.vendor() % vp.config_version.to_string()).str();
+ auto message = format("Preset bundle `%1%` version not found in index: %2%", idx.vendor(), vp.config_version.to_string());
BOOST_LOG_TRIVIAL(error) << message;
GUI::show_error(nullptr, message);
continue;
@@ -440,7 +457,7 @@ Updates PresetUpdater::priv::get_config_updates(const Semver &old_slic3r_version
}
if (recommended->config_version < vp.config_version) {
- BOOST_LOG_TRIVIAL(warning) << (boost::format("Recommended config version for the currently running PrusaSlicer is older than the currently installed config for vendor %1%. This should not happen.") % idx.vendor()).str();
+ BOOST_LOG_TRIVIAL(warning) << format("Recommended config version for the currently running PrusaSlicer is older than the currently installed config for vendor %1%. This should not happen.", idx.vendor());
continue;
}
@@ -482,7 +499,7 @@ Updates PresetUpdater::priv::get_config_updates(const Semver &old_slic3r_version
found = true;
}
} catch (const std::exception &ex) {
- BOOST_LOG_TRIVIAL(info) << boost::format("Failed to load the config bundle `%1%`: %2%") % path_in_cache.string() % ex.what();
+ BOOST_LOG_TRIVIAL(info) << format("Failed to load the config bundle `%1%`: %2%", path_in_cache.string(), ex.what());
}
}
@@ -496,13 +513,13 @@ Updates PresetUpdater::priv::get_config_updates(const Semver &old_slic3r_version
try {
rsrc_vp = VendorProfile::from_ini(path_in_rsrc, false);
} catch (const std::exception &ex) {
- BOOST_LOG_TRIVIAL(info) << boost::format("Cannot load the config bundle at `%1%`: %2%") % path_in_rsrc.string() % ex.what();
+ BOOST_LOG_TRIVIAL(info) << format("Cannot load the config bundle at `%1%`: %2%", path_in_rsrc.string(), ex.what());
}
if (rsrc_vp.valid()) {
try {
rsrc_idx.load(path_idx_in_rsrc);
} catch (const std::exception &ex) {
- BOOST_LOG_TRIVIAL(info) << boost::format("Cannot load the config index at `%1%`: %2%") % path_idx_in_rsrc.string() % ex.what();
+ BOOST_LOG_TRIVIAL(info) << format("Cannot load the config index at `%1%`: %2%", path_idx_in_rsrc.string(), ex.what());
}
recommended = rsrc_idx.recommended();
if (recommended != rsrc_idx.end() && recommended->config_version == rsrc_vp.config_version && recommended->config_version > vp.config_version) {
@@ -510,8 +527,8 @@ Updates PresetUpdater::priv::get_config_updates(const Semver &old_slic3r_version
bundle_path_idx_to_install = path_idx_in_rsrc;
found = true;
} else {
- BOOST_LOG_TRIVIAL(warning) << (boost::format("The recommended config version for vendor `%1%` in resources does not match the recommended\n"
- " config version for this version of PrusaSlicer. Corrupted installation?") % idx.vendor()).str();
+ BOOST_LOG_TRIVIAL(warning) << format("The recommended config version for vendor `%1%` in resources does not match the recommended\n"
+ " config version for this version of PrusaSlicer. Corrupted installation?", idx.vendor());
}
}
}
@@ -526,14 +543,14 @@ Updates PresetUpdater::priv::get_config_updates(const Semver &old_slic3r_version
existing_idx.load(bundle_path_idx);
// Find a recommended config bundle version for the slic3r version last executed. This makes sure that a config bundle update will not be missed
// when upgrading an application. On the other side, the user will be bugged every time he will switch between slic3r versions.
- const auto existing_recommended = existing_idx.recommended(old_slic3r_version);
- /*if (existing_recommended != existing_idx.end() && recommended->config_version == existing_recommended->config_version) {
+ /*const auto existing_recommended = existing_idx.recommended(old_slic3r_version);
+ if (existing_recommended != existing_idx.end() && recommended->config_version == existing_recommended->config_version) {
// The user has already seen (and presumably rejected) this update
- BOOST_LOG_TRIVIAL(info) << boost::format("Downloaded index for `%1%` is the same as installed one, not offering an update.") % idx.vendor();
+ BOOST_LOG_TRIVIAL(info) << format("Downloaded index for `%1%` is the same as installed one, not offering an update.",idx.vendor());
continue;
}*/
} catch (const std::exception &err) {
- BOOST_LOG_TRIVIAL(error) << boost::format("Cannot load the installed index at `%1%`: %2%") % bundle_path_idx % err.what();
+ BOOST_LOG_TRIVIAL(error) << format("Cannot load the installed index at `%1%`: %2%", bundle_path_idx, err.what());
}
}
@@ -542,10 +559,10 @@ Updates PresetUpdater::priv::get_config_updates(const Semver &old_slic3r_version
{
const auto recommended_snap = SnapshotDB::singleton().snapshot_with_vendor_preset(vp.name, recommended->config_version);
if (recommended_snap != SnapshotDB::singleton().end()) {
- BOOST_LOG_TRIVIAL(info) << boost::format("Bundle update %1% %2% already found in snapshot %3%, skipping...")
- % vp.name
- % recommended->config_version.to_string()
- % recommended_snap->id;
+ BOOST_LOG_TRIVIAL(info) << format("Bundle update %1% %2% already found in snapshot %3%, skipping...",
+ vp.name,
+ recommended->config_version.to_string(),
+ recommended_snap->id);
continue;
}
}
@@ -555,9 +572,9 @@ Updates PresetUpdater::priv::get_config_updates(const Semver &old_slic3r_version
// offered updates and to not offer the same update again if it was cancelled by the user.
copy_file_fix(bundle_path_idx_to_install, bundle_path_idx);
} else {
- BOOST_LOG_TRIVIAL(warning) << boost::format("Index for vendor %1% indicates update (%2%) but the new bundle was found neither in cache nor resources")
- % idx.vendor()
- % recommended->config_version.to_string();
+ BOOST_LOG_TRIVIAL(warning) << format("Index for vendor %1% indicates update (%2%) but the new bundle was found neither in cache nor resources",
+ idx.vendor(),
+ recommended->config_version.to_string());
}
}
@@ -572,7 +589,7 @@ void PresetUpdater::priv::perform_updates(Updates &&updates, bool snapshot) cons
SnapshotDB::singleton().take_snapshot(*GUI::wxGetApp().app_config, Snapshot::SNAPSHOT_DOWNGRADE);
}
- BOOST_LOG_TRIVIAL(info) << boost::format("Deleting %1% incompatible bundles") % updates.incompats.size();
+ BOOST_LOG_TRIVIAL(info) << format("Deleting %1% incompatible bundles", updates.incompats.size());
for (auto &incompat : updates.incompats) {
BOOST_LOG_TRIVIAL(info) << '\t' << incompat;
@@ -587,7 +604,7 @@ void PresetUpdater::priv::perform_updates(Updates &&updates, bool snapshot) cons
SnapshotDB::singleton().take_snapshot(*GUI::wxGetApp().app_config, Snapshot::SNAPSHOT_UPGRADE);
}
- BOOST_LOG_TRIVIAL(info) << boost::format("Performing %1% updates") % updates.updates.size();
+ BOOST_LOG_TRIVIAL(info) << format("Performing %1% updates", updates.updates.size());
for (const auto &update : updates.updates) {
BOOST_LOG_TRIVIAL(info) << '\t' << update;
@@ -597,8 +614,7 @@ void PresetUpdater::priv::perform_updates(Updates &&updates, bool snapshot) cons
PresetBundle bundle;
bundle.load_configbundle(update.source.string(), PresetBundle::LOAD_CFGBNDLE_SYSTEM);
- BOOST_LOG_TRIVIAL(info) << boost::format("Deleting %1% conflicting presets")
- % (bundle.prints.size() + bundle.filaments.size() + bundle.printers.size());
+ BOOST_LOG_TRIVIAL(info) << format("Deleting %1% conflicting presets", bundle.prints.size() + bundle.filaments.size() + bundle.printers.size());
auto preset_remover = [](const Preset &preset) {
BOOST_LOG_TRIVIAL(info) << '\t' << preset.file;
@@ -611,8 +627,8 @@ void PresetUpdater::priv::perform_updates(Updates &&updates, bool snapshot) cons
// Also apply the `obsolete_presets` property, removing obsolete ini files
- BOOST_LOG_TRIVIAL(info) << boost::format("Deleting %1% obsolete presets")
- % (bundle.obsolete_presets.prints.size() + bundle.obsolete_presets.filaments.size() + bundle.obsolete_presets.printers.size());
+ BOOST_LOG_TRIVIAL(info) << format("Deleting %1% obsolete presets",
+ bundle.obsolete_presets.prints.size() + bundle.obsolete_presets.filaments.size() + bundle.obsolete_presets.printers.size());
auto obsolete_remover = [](const char *subdir, const std::string &preset) {
auto path = fs::path(Slic3r::data_dir()) / subdir / preset;
@@ -630,6 +646,12 @@ void PresetUpdater::priv::perform_updates(Updates &&updates, bool snapshot) cons
}
}
+void PresetUpdater::priv::set_waiting_updates(Updates u)
+{
+ waiting_updates = u;
+ has_waiting_updates = true;
+}
+
PresetUpdater::PresetUpdater() :
p(new priv())
{}
@@ -688,13 +710,13 @@ void PresetUpdater::slic3r_update_notify()
}
}
-PresetUpdater::UpdateResult PresetUpdater::config_update(const Semver &old_slic3r_version) const
+PresetUpdater::UpdateResult PresetUpdater::config_update(const Semver& old_slic3r_version, bool no_notification) const
{
- if (! p->enabled_config_update) { return R_NOOP; }
+ if (! p->enabled_config_update) { return R_NOOP; }
auto updates = p->get_config_updates(old_slic3r_version);
if (updates.incompats.size() > 0) {
- BOOST_LOG_TRIVIAL(info) << boost::format("%1% bundles incompatible. Asking for action...") % updates.incompats.size();
+ BOOST_LOG_TRIVIAL(info) << format("%1% bundles incompatible. Asking for action...", updates.incompats.size());
std::unordered_map<std::string, wxString> incompats_map;
for (const auto &incompat : updates.incompats) {
@@ -702,15 +724,14 @@ PresetUpdater::UpdateResult PresetUpdater::config_update(const Semver &old_slic3
const auto max_slic3r = incompat.version.max_slic3r_version;
wxString restrictions;
if (min_slic3r != Semver::zero() && max_slic3r != Semver::inf()) {
- restrictions = GUI::from_u8((boost::format(_utf8(L("requires min. %s and max. %s")))
- % min_slic3r.to_string()
- % max_slic3r.to_string()).str()
- );
+ restrictions = GUI::format_wxstr(_L("requires min. %s and max. %s"),
+ min_slic3r.to_string(),
+ max_slic3r.to_string());
} else if (min_slic3r != Semver::zero()) {
- restrictions = GUI::from_u8((boost::format(_utf8(L("requires min. %s"))) % min_slic3r.to_string()).str());
+ restrictions = GUI::format_wxstr(_L("requires min. %s"), min_slic3r.to_string());
BOOST_LOG_TRIVIAL(debug) << "Bundle is not downgrade, user will now have to do whole wizard. This should not happen.";
} else {
- restrictions = GUI::from_u8((boost::format(_utf8(L("requires max. %s"))) % max_slic3r.to_string()).str());
+ restrictions = GUI::format_wxstr(_L("requires max. %s"), max_slic3r.to_string());
}
incompats_map.emplace(std::make_pair(incompat.vendor, std::move(restrictions)));
@@ -742,13 +763,13 @@ PresetUpdater::UpdateResult PresetUpdater::config_update(const Semver &old_slic3
for (const auto& update : updates.updates) {
incompatible_version = (update.forced_update ? true : incompatible_version);
//td::cout << update.forced_update << std::endl;
- //BOOST_LOG_TRIVIAL(info) << boost::format("Update requires higher version.");
+ //BOOST_LOG_TRIVIAL(info) << format("Update requires higher version.");
}
//forced update
if(incompatible_version)
{
- BOOST_LOG_TRIVIAL(info) << boost::format("Update of %1% bundles available. At least one requires higher version of Slicer.") % updates.updates.size();
+ BOOST_LOG_TRIVIAL(info) << format("Update of %1% bundles available. At least one requires higher version of Slicer.", updates.updates.size());
std::vector<GUI::MsgUpdateForced::Update> updates_msg;
for (const auto& update : updates.updates) {
@@ -778,30 +799,38 @@ PresetUpdater::UpdateResult PresetUpdater::config_update(const Semver &old_slic3
}
// regular update
- BOOST_LOG_TRIVIAL(info) << boost::format("Update of %1% bundles available. Asking for confirmation ...") % updates.updates.size();
+ if (no_notification) {
+ BOOST_LOG_TRIVIAL(info) << format("Update of %1% bundles available. Asking for confirmation ...", p->waiting_updates.updates.size());
- std::vector<GUI::MsgUpdateConfig::Update> updates_msg;
- for (const auto &update : updates.updates) {
- std::string changelog_url = update.version.config_version.prerelease() == nullptr ? update.changelog_url : std::string();
- updates_msg.emplace_back(update.vendor, update.version.config_version, update.version.comment, std::move(changelog_url));
- }
+ std::vector<GUI::MsgUpdateConfig::Update> updates_msg;
+ for (const auto& update : updates.updates) {
+ std::string changelog_url = update.version.config_version.prerelease() == nullptr ? update.changelog_url : std::string();
+ updates_msg.emplace_back(update.vendor, update.version.config_version, update.version.comment, std::move(changelog_url));
+ }
- GUI::MsgUpdateConfig dlg(updates_msg);
+ GUI::MsgUpdateConfig dlg(updates_msg);
- const auto res = dlg.ShowModal();
- if (res == wxID_OK) {
- BOOST_LOG_TRIVIAL(debug) << "User agreed to perform the update";
- p->perform_updates(std::move(updates));
+ const auto res = dlg.ShowModal();
+ if (res == wxID_OK) {
+ BOOST_LOG_TRIVIAL(debug) << "User agreed to perform the update";
+ p->perform_updates(std::move(updates));
- // Reload global configuration
- auto *app_config = GUI::wxGetApp().app_config;
- GUI::wxGetApp().preset_bundle->load_presets(*app_config);
- GUI::wxGetApp().load_current_presets();
- return R_UPDATE_INSTALLED;
+ // Reload global configuration
+ auto* app_config = GUI::wxGetApp().app_config;
+ GUI::wxGetApp().preset_bundle->load_presets(*app_config);
+ GUI::wxGetApp().load_current_presets();
+ return R_UPDATE_INSTALLED;
+ }
+ else {
+ BOOST_LOG_TRIVIAL(info) << "User refused the update";
+ return R_UPDATE_REJECT;
+ }
} else {
- BOOST_LOG_TRIVIAL(info) << "User refused the update";
- return R_UPDATE_REJECT;
+ p->set_waiting_updates(updates);
+ GUI::wxGetApp().plater()->get_notification_manager()->push_notification(GUI::NotificationType::PresetUpdateAvailable);
}
+
+ // MsgUpdateConfig will show after the notificaation is clicked
} else {
BOOST_LOG_TRIVIAL(info) << "No configuration updates available.";
}
@@ -813,7 +842,7 @@ void PresetUpdater::install_bundles_rsrc(std::vector<std::string> bundles, bool
{
Updates updates;
- BOOST_LOG_TRIVIAL(info) << boost::format("Installing %1% bundles from resources ...") % bundles.size();
+ BOOST_LOG_TRIVIAL(info) << format("Installing %1% bundles from resources ...", bundles.size());
for (const auto &bundle : bundles) {
auto path_in_rsrc = (p->rsrc_path / bundle).replace_extension(".ini");
@@ -824,5 +853,37 @@ void PresetUpdater::install_bundles_rsrc(std::vector<std::string> bundles, bool
p->perform_updates(std::move(updates), snapshot);
}
+void PresetUpdater::on_update_notification_confirm()
+{
+ if (!p->has_waiting_updates)
+ return;
+ BOOST_LOG_TRIVIAL(info) << format("Update of %1% bundles available. Asking for confirmation ...", p->waiting_updates.updates.size());
+
+ std::vector<GUI::MsgUpdateConfig::Update> updates_msg;
+ for (const auto& update : p->waiting_updates.updates) {
+ std::string changelog_url = update.version.config_version.prerelease() == nullptr ? update.changelog_url : std::string();
+ updates_msg.emplace_back(update.vendor, update.version.config_version, update.version.comment, std::move(changelog_url));
+ }
+
+ GUI::MsgUpdateConfig dlg(updates_msg);
+
+ const auto res = dlg.ShowModal();
+ if (res == wxID_OK) {
+ BOOST_LOG_TRIVIAL(debug) << "User agreed to perform the update";
+ p->perform_updates(std::move(p->waiting_updates));
+
+ // Reload global configuration
+ auto* app_config = GUI::wxGetApp().app_config;
+ GUI::wxGetApp().preset_bundle->load_presets(*app_config);
+ GUI::wxGetApp().load_current_presets();
+ p->has_waiting_updates = false;
+ //return R_UPDATE_INSTALLED;
+ }
+ else {
+ BOOST_LOG_TRIVIAL(info) << "User refused the update";
+ //return R_UPDATE_REJECT;
+ }
+
+}
}
diff --git a/src/slic3r/Utils/PresetUpdater.hpp b/src/slic3r/Utils/PresetUpdater.hpp
index e18695828..0ca363c61 100644
--- a/src/slic3r/Utils/PresetUpdater.hpp
+++ b/src/slic3r/Utils/PresetUpdater.hpp
@@ -35,16 +35,20 @@ public:
R_INCOMPAT_CONFIGURED,
R_UPDATE_INSTALLED,
R_UPDATE_REJECT,
+ R_UPDATE_NOTIFICATION
};
// If updating is enabled, check if updates are available in cache, if so, ask about installation.
// A false return value implies Slic3r should exit due to incompatibility of configuration.
// Providing old slic3r version upgrade profiles on upgrade of an application even in case
// that the config index installed from the Internet is equal to the index contained in the installation package.
- UpdateResult config_update(const Semver &old_slic3r_version) const;
+ // no_notification = force modal textbox, otherwise some cases only shows notification
+ UpdateResult config_update(const Semver &old_slic3r_version, bool no_notification) const;
// "Update" a list of bundles from resources (behaves like an online update).
void install_bundles_rsrc(std::vector<std::string> bundles, bool snapshot = true) const;
+
+ void on_update_notification_confirm();
private:
struct priv;
std::unique_ptr<priv> p;
diff --git a/src/slic3r/Utils/PrintHost.cpp b/src/slic3r/Utils/PrintHost.cpp
index 0a49b7815..589679e47 100644
--- a/src/slic3r/Utils/PrintHost.cpp
+++ b/src/slic3r/Utils/PrintHost.cpp
@@ -9,6 +9,7 @@
#include <wx/string.h>
#include <wx/app.h>
+#include <wx/arrstr.h>
#include "libslic3r/PrintConfig.hpp"
#include "libslic3r/Channel.hpp"
@@ -16,6 +17,7 @@
#include "Duet.hpp"
#include "FlashAir.hpp"
#include "AstroBox.hpp"
+#include "Repetier.hpp"
#include "../GUI/PrintHostDialogs.hpp"
namespace fs = boost::filesystem;
@@ -47,6 +49,7 @@ PrintHost* PrintHost::get_print_host(DynamicPrintConfig *config)
case htDuet: return new Duet(config);
case htFlashAir: return new FlashAir(config);
case htAstroBox: return new AstroBox(config);
+ case htRepetier: return new Repetier(config);
default: return nullptr;
}
} else {
@@ -272,5 +275,4 @@ void PrintHostJobQueue::cancel(size_t id)
p->channel_cancels.push(id);
}
-
}
diff --git a/src/slic3r/Utils/PrintHost.hpp b/src/slic3r/Utils/PrintHost.hpp
index e0aeb463c..35a870b29 100644
--- a/src/slic3r/Utils/PrintHost.hpp
+++ b/src/slic3r/Utils/PrintHost.hpp
@@ -10,6 +10,7 @@
#include "Http.hpp"
+class wxArrayString;
namespace Slic3r {
@@ -20,6 +21,9 @@ struct PrintHostUpload
{
boost::filesystem::path source_path;
boost::filesystem::path upload_path;
+
+ std::string group;
+
bool start_print = false;
};
@@ -41,8 +45,15 @@ public:
virtual bool has_auto_discovery() const = 0;
virtual bool can_test() const = 0;
virtual bool can_start_print() const = 0;
+ // A print host usually does not support multiple printers, with the exception of Repetier server.
+ virtual bool supports_multiple_printers() const { return false; }
virtual std::string get_host() const = 0;
+ // Support for Repetier server multiple groups & printers. Not supported by other print hosts.
+ // Returns false if not supported. May throw HostNetworkError.
+ virtual bool get_groups(wxArrayString & /* groups */) const { return false; }
+ virtual bool get_printers(wxArrayString & /* printers */) const { return false; }
+
static PrintHost* get_print_host(DynamicPrintConfig *config);
protected:
diff --git a/src/slic3r/Utils/Process.cpp b/src/slic3r/Utils/Process.cpp
new file mode 100644
index 000000000..a12fd6647
--- /dev/null
+++ b/src/slic3r/Utils/Process.cpp
@@ -0,0 +1,167 @@
+#include "Process.hpp"
+
+#include <libslic3r/AppConfig.hpp>
+
+#include "../GUI/GUI.hpp"
+// for file_wildcards()
+#include "../GUI/GUI_App.hpp"
+// localization
+#include "../GUI/I18N.hpp"
+
+#include <iostream>
+#include <fstream>
+
+#include <boost/filesystem.hpp>
+#include <boost/log/trivial.hpp>
+
+// For starting another PrusaSlicer instance on OSX.
+// Fails to compile on Windows on the build server.
+#ifdef __APPLE__
+ #include <boost/process/spawn.hpp>
+ #include <boost/process/args.hpp>
+#endif
+
+#include <wx/stdpaths.h>
+
+namespace Slic3r {
+namespace GUI {
+
+enum class NewSlicerInstanceType {
+ Slicer,
+ GCodeViewer
+};
+
+// Start a new Slicer process instance either in a Slicer mode or in a G-code mode.
+// Optionally load a 3MF, STL or a G-code on start.
+static void start_new_slicer_or_gcodeviewer(const NewSlicerInstanceType instance_type, const std::vector<wxString> paths_to_open, bool single_instance)
+{
+#ifdef _WIN32
+ wxString path;
+ wxFileName::SplitPath(wxStandardPaths::Get().GetExecutablePath(), &path, nullptr, nullptr, wxPATH_NATIVE);
+ path += "\\";
+ path += (instance_type == NewSlicerInstanceType::Slicer) ? "prusa-slicer.exe" : "prusa-gcodeviewer.exe";
+ std::vector<const wchar_t*> args;
+ args.reserve(4);
+ args.emplace_back(path.wc_str());
+ if (!paths_to_open.empty()) {
+ for (const auto& file : paths_to_open)
+ args.emplace_back(file);
+ }
+ if (instance_type == NewSlicerInstanceType::Slicer && single_instance)
+ args.emplace_back(L"--single-instance");
+ args.emplace_back(nullptr);
+ BOOST_LOG_TRIVIAL(info) << "Trying to spawn a new slicer \"" << into_u8(path) << "\"";
+ // Don't call with wxEXEC_HIDE_CONSOLE, PrusaSlicer in GUI mode would just show the splash screen. It would not open the main window though, it would
+ // just hang in the background.
+ if (wxExecute(const_cast<wchar_t**>(args.data()), wxEXEC_ASYNC) <= 0)
+ BOOST_LOG_TRIVIAL(error) << "Failed to spawn a new slicer \"" << into_u8(path);
+#else
+ // Own executable path.
+ boost::filesystem::path bin_path = into_path(wxStandardPaths::Get().GetExecutablePath());
+#if defined(__APPLE__)
+ {
+ // Maybe one day we will be able to run PrusaGCodeViewer, but for now the Apple notarization
+ // process refuses Apps with multiple binaries and Vojtech does not know any workaround.
+ // ((instance_type == NewSlicerInstanceType::Slicer) ? "PrusaSlicer" : "PrusaGCodeViewer");
+ // Just run PrusaSlicer and give it a --gcodeviewer parameter.
+ bin_path = bin_path.parent_path() / "PrusaSlicer";
+ // On Apple the wxExecute fails, thus we use boost::process instead.
+ BOOST_LOG_TRIVIAL(info) << "Trying to spawn a new slicer \"" << bin_path.string() << "\"";
+ try {
+ std::vector<std::string> args;
+ if (instance_type == NewSlicerInstanceType::GCodeViewer)
+ args.emplace_back("--gcodeviewer");
+ if (!paths_to_open.empty()) {
+ for (const auto& file : paths_to_open)
+ args.emplace_back(into_u8(file));
+ }
+ if (instance_type == NewSlicerInstanceType::Slicer && single_instance)
+ args.emplace_back("--single-instance");
+ boost::process::spawn(bin_path, args);
+ // boost::process::spawn() sets SIGCHLD to SIGIGN for the child process, thus if a child PrusaSlicer spawns another
+ // subprocess and the subrocess dies, the child PrusaSlicer will not receive information on end of subprocess
+ // (posix waitpid() call will always fail).
+ // https://jmmv.dev/2008/10/boostprocess-and-sigchld.html
+ // The child instance of PrusaSlicer has to reset SIGCHLD to its default, so that posix waitpid() and similar continue to work.
+ // See GH issue #5507
+ }
+ catch (const std::exception& ex) {
+ BOOST_LOG_TRIVIAL(error) << "Failed to spawn a new slicer \"" << bin_path.string() << "\": " << ex.what();
+ }
+ }
+#else // Linux or Unix
+ {
+ std::vector<const char*> args;
+ args.reserve(3);
+#ifdef __linux__
+ static const char* gcodeviewer_param = "--gcodeviewer";
+ {
+ // If executed by an AppImage, start the AppImage, not the main process.
+ // see https://docs.appimage.org/packaging-guide/environment-variables.html#id2
+ const char* appimage_binary = std::getenv("APPIMAGE");
+ if (appimage_binary) {
+ args.emplace_back(appimage_binary);
+ if (instance_type == NewSlicerInstanceType::GCodeViewer)
+ args.emplace_back(gcodeviewer_param);
+ }
+ }
+#endif // __linux__
+ std::string my_path;
+ if (args.empty()) {
+ // Binary path was not set to the AppImage in the Linux specific block above, call the application directly.
+ my_path = (bin_path.parent_path() / ((instance_type == NewSlicerInstanceType::Slicer) ? "prusa-slicer" : "prusa-gcodeviewer")).string();
+ args.emplace_back(my_path.c_str());
+ }
+ std::string to_open;
+ if (!paths_to_open.empty()) {
+ for (const auto& file : paths_to_open) {
+ to_open = into_u8(file);
+ args.emplace_back(to_open.c_str());
+ }
+ }
+ if (instance_type == NewSlicerInstanceType::Slicer && single_instance)
+ args.emplace_back("--single-instance");
+ args.emplace_back(nullptr);
+ BOOST_LOG_TRIVIAL(info) << "Trying to spawn a new slicer \"" << args[0] << "\"";
+ if (wxExecute(const_cast<char**>(args.data()), wxEXEC_ASYNC | wxEXEC_MAKE_GROUP_LEADER) <= 0)
+ BOOST_LOG_TRIVIAL(error) << "Failed to spawn a new slicer \"" << args[0];
+ }
+#endif // Linux or Unix
+#endif // Win32
+}
+static void start_new_slicer_or_gcodeviewer(const NewSlicerInstanceType instance_type, const wxString* path_to_open, bool single_instance)
+{
+ std::vector<wxString> paths;
+ if (path_to_open != nullptr)
+ paths.emplace_back(path_to_open->wc_str());
+ start_new_slicer_or_gcodeviewer(instance_type, paths, single_instance);
+}
+
+void start_new_slicer(const wxString *path_to_open, bool single_instance)
+{
+ start_new_slicer_or_gcodeviewer(NewSlicerInstanceType::Slicer, path_to_open, single_instance);
+}
+void start_new_slicer(const std::vector<wxString>& files, bool single_instance)
+{
+ start_new_slicer_or_gcodeviewer(NewSlicerInstanceType::Slicer, files, single_instance);
+}
+
+void start_new_gcodeviewer(const wxString *path_to_open)
+{
+ start_new_slicer_or_gcodeviewer(NewSlicerInstanceType::GCodeViewer, path_to_open, false);
+}
+
+void start_new_gcodeviewer_open_file(wxWindow *parent)
+{
+ wxFileDialog dialog(parent ? parent : wxGetApp().GetTopWindow(),
+ _L("Open G-code file:"),
+ from_u8(wxGetApp().app_config->get_last_dir()), wxString(),
+ file_wildcards(FT_GCODE), wxFD_OPEN | wxFD_FILE_MUST_EXIST);
+ if (dialog.ShowModal() == wxID_OK) {
+ wxString path = dialog.GetPath();
+ start_new_gcodeviewer(&path);
+ }
+}
+
+} // namespace GUI
+} // namespace Slic3r
diff --git a/src/slic3r/Utils/Process.hpp b/src/slic3r/Utils/Process.hpp
new file mode 100644
index 000000000..494b222eb
--- /dev/null
+++ b/src/slic3r/Utils/Process.hpp
@@ -0,0 +1,25 @@
+#ifndef GUI_PROCESS_HPP
+#define GUI_PROCESS_HPP
+
+#include <vector>
+
+
+class wxWindow;
+class wxString;
+
+namespace Slic3r {
+namespace GUI {
+
+// Start a new slicer instance, optionally with a file to open.
+void start_new_slicer(const wxString *path_to_open = nullptr, bool single_instance = false);
+void start_new_slicer(const std::vector<wxString>& files, bool single_instance = false);
+
+// Start a new G-code viewer instance, optionally with a file to open.
+void start_new_gcodeviewer(const wxString *path_to_open = nullptr);
+// Open a file dialog, ask the user to select a new G-code to open, start a new G-code viewer.
+void start_new_gcodeviewer_open_file(wxWindow *parent = nullptr);
+
+} // namespace GUI
+} // namespace Slic3r
+
+#endif // GUI_PROCESS_HPP
diff --git a/src/slic3r/Utils/Profile.hpp b/src/slic3r/Utils/Profile.hpp
new file mode 100644
index 000000000..5fb1e3116
--- /dev/null
+++ b/src/slic3r/Utils/Profile.hpp
@@ -0,0 +1,19 @@
+#ifndef slic3r_GUI_Profile_hpp_
+#define slic3r_GUI_Profile_hpp_
+
+// Profiling support using the Shiny intrusive profiler
+//#define SLIC3R_PROFILE_GUI
+#if defined(SLIC3R_PROFILE) && defined(SLIC3R_PROFILE_GUI)
+ #include <Shiny/Shiny.h>
+ #define SLIC3R_GUI_PROFILE_FUNC() PROFILE_FUNC()
+ #define SLIC3R_GUI_PROFILE_BLOCK(name) PROFILE_BLOCK(name)
+ #define SLIC3R_GUI_PROFILE_UPDATE() PROFILE_UPDATE()
+ #define SLIC3R_GUI_PROFILE_OUTPUT(x) PROFILE_OUTPUT(x)
+#else
+ #define SLIC3R_GUI_PROFILE_FUNC()
+ #define SLIC3R_GUI_PROFILE_BLOCK(name)
+ #define SLIC3R_GUI_PROFILE_UPDATE()
+ #define SLIC3R_GUI_PROFILE_OUTPUT(x)
+#endif
+
+#endif // slic3r_GUI_Profile_hpp_
diff --git a/src/slic3r/Utils/Repetier.cpp b/src/slic3r/Utils/Repetier.cpp
new file mode 100644
index 000000000..115ea010e
--- /dev/null
+++ b/src/slic3r/Utils/Repetier.cpp
@@ -0,0 +1,268 @@
+#include "Repetier.hpp"
+
+#include <algorithm>
+#include <sstream>
+#include <exception>
+#include <boost/foreach.hpp>
+#include <boost/format.hpp>
+#include <boost/log/trivial.hpp>
+#include <boost/property_tree/ptree.hpp>
+#include <boost/property_tree/json_parser.hpp>
+#include <boost/algorithm/string/predicate.hpp>
+
+#include <wx/progdlg.h>
+
+
+#include "libslic3r/PrintConfig.hpp"
+#include "slic3r/GUI/I18N.hpp"
+#include "slic3r/GUI/GUI.hpp"
+#include "slic3r/GUI/format.hpp"
+#include "Http.hpp"
+
+
+namespace fs = boost::filesystem;
+namespace pt = boost::property_tree;
+
+
+namespace Slic3r {
+
+Repetier::Repetier(DynamicPrintConfig *config) :
+ host(config->opt_string("print_host")),
+ apikey(config->opt_string("printhost_apikey")),
+ cafile(config->opt_string("printhost_cafile")),
+ port(config->opt_string("printhost_port"))
+{}
+
+const char* Repetier::get_name() const { return "Repetier"; }
+
+bool Repetier::test(wxString &msg) const
+{
+ // Since the request is performed synchronously here,
+ // it is ok to refer to `msg` from within the closure
+
+ const char *name = get_name();
+
+ bool res = true;
+ auto url = make_url("printer/info");
+
+ BOOST_LOG_TRIVIAL(info) << boost::format("%1%: List version at: %2%") % name % url;
+
+ auto http = Http::get(std::move(url));
+ set_auth(http);
+
+ http.on_error([&](std::string body, std::string error, unsigned status) {
+ BOOST_LOG_TRIVIAL(error) << boost::format("%1%: Error getting version: %2%, HTTP %3%, body: `%4%`") % name % error % status % body;
+ res = false;
+ msg = format_error(body, error, status);
+ })
+ .on_complete([&, this](std::string body, unsigned) {
+ BOOST_LOG_TRIVIAL(debug) << boost::format("%1%: Got version: %2%") % name % body;
+
+ try {
+ std::stringstream ss(body);
+ pt::ptree ptree;
+ pt::read_json(ss, ptree);
+
+ const auto text = ptree.get_optional<std::string>("name");
+ res = validate_version_text(text);
+ if (! res) {
+ msg = GUI::from_u8((boost::format(_utf8(L("Mismatched type of print host: %s"))) % (text ? *text : "Repetier")).str());
+ }
+ }
+ catch (const std::exception &) {
+ res = false;
+ msg = "Could not parse server response";
+ }
+ })
+ .perform_sync();
+
+ return res;
+}
+
+wxString Repetier::get_test_ok_msg () const
+{
+ return _(L("Connection to Repetier works correctly."));
+}
+
+wxString Repetier::get_test_failed_msg (wxString &msg) const
+{
+ return GUI::from_u8((boost::format("%s: %s\n\n%s")
+ % _utf8(L("Could not connect to Repetier"))
+ % std::string(msg.ToUTF8())
+ % _utf8(L("Note: Repetier version at least 0.90.0 is required."))).str());
+}
+
+bool Repetier::upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn) const
+{
+ const char *name = get_name();
+
+ const auto upload_filename = upload_data.upload_path.filename();
+ const auto upload_parent_path = upload_data.upload_path.parent_path();
+
+ wxString test_msg;
+ if (! test(test_msg)) {
+ error_fn(std::move(test_msg));
+ return false;
+ }
+
+ bool res = true;
+
+ auto url = make_url((boost::format("printer/model/%1%") % port).str());
+
+ BOOST_LOG_TRIVIAL(info) << boost::format("%1%: Uploading file %2% at %3%, filename: %4%, path: %5%, print: %6%, group: %7%")
+ % name
+ % upload_data.source_path
+ % url
+ % upload_filename.string()
+ % upload_parent_path.string()
+ % upload_data.start_print
+ % upload_data.group;
+
+ auto http = Http::post(std::move(url));
+ set_auth(http);
+
+ if (! upload_data.group.empty() && upload_data.group != _utf8(L("Default"))) {
+ http.form_add("group", upload_data.group);
+ }
+
+ http.form_add("a", "upload")
+ .form_add_file("filename", upload_data.source_path.string(), upload_filename.string())
+ .on_complete([&](std::string body, unsigned status) {
+ BOOST_LOG_TRIVIAL(debug) << boost::format("%1%: File uploaded: HTTP %2%: %3%") % name % status % body;
+ })
+ .on_error([&](std::string body, std::string error, unsigned status) {
+ BOOST_LOG_TRIVIAL(error) << boost::format("%1%: Error uploading file: %2%, HTTP %3%, body: `%4%`") % name % error % status % body;
+ error_fn(format_error(body, error, status));
+ res = false;
+ })
+ .on_progress([&](Http::Progress progress, bool &cancel) {
+ prorgess_fn(std::move(progress), cancel);
+ if (cancel) {
+ // Upload was canceled
+ BOOST_LOG_TRIVIAL(info) << "Repetier: Upload canceled";
+ res = false;
+ }
+ })
+ .perform_sync();
+
+ return res;
+}
+
+bool Repetier::validate_version_text(const boost::optional<std::string> &version_text) const
+{
+ return version_text ? boost::starts_with(*version_text, "Repetier") : true;
+}
+
+void Repetier::set_auth(Http &http) const
+{
+ http.header("X-Api-Key", apikey);
+
+ if (! cafile.empty()) {
+ http.ca_file(cafile);
+ }
+}
+
+std::string Repetier::make_url(const std::string &path) const
+{
+ if (host.find("http://") == 0 || host.find("https://") == 0) {
+ if (host.back() == '/') {
+ return (boost::format("%1%%2%") % host % path).str();
+ } else {
+ return (boost::format("%1%/%2%") % host % path).str();
+ }
+ } else {
+ return (boost::format("http://%1%/%2%") % host % path).str();
+ }
+}
+
+bool Repetier::get_groups(wxArrayString& groups) const
+{
+ bool res = true;
+
+ const char *name = get_name();
+ auto url = make_url((boost::format("printer/api/%1%") % port).str());
+
+ BOOST_LOG_TRIVIAL(info) << boost::format("%1%: Get groups at: %2%") % name % url;
+
+ auto http = Http::get(std::move(url));
+ set_auth(http);
+ http.form_add("a", "listModelGroups");
+ http.on_error([&](std::string body, std::string error, unsigned status) {
+ BOOST_LOG_TRIVIAL(error) << boost::format("%1%: Error getting version: %2%, HTTP %3%, body: `%4%`") % name % error % status % body;
+ })
+ .on_complete([&, this](std::string body, unsigned) {
+ BOOST_LOG_TRIVIAL(debug) << boost::format("%1%: Got groups: %2%") % name % body;
+
+ try {
+ std::stringstream ss(body);
+ pt::ptree ptree;
+ pt::read_json(ss, ptree);
+
+ BOOST_FOREACH(boost::property_tree::ptree::value_type &v, ptree.get_child("groupNames.")) {
+ if (v.second.data() == "#") {
+ groups.push_back(_utf8(L("Default")));
+ } else {
+ // Is it safe to assume that the data are utf-8 encoded?
+ groups.push_back(GUI::from_u8(v.second.data()));
+ }
+ }
+ }
+ catch (const std::exception &) {
+ //msg = "Could not parse server response";
+ res = false;
+ }
+ })
+ .perform_sync();
+
+ return res;
+}
+
+bool Repetier::get_printers(wxArrayString& printers) const
+{
+ const char *name = get_name();
+
+ bool res = true;
+ auto url = make_url("printer/list");
+
+ BOOST_LOG_TRIVIAL(info) << boost::format("%1%: List printers at: %2%") % name % url;
+
+ auto http = Http::get(std::move(url));
+ set_auth(http);
+
+ http.on_error([&](std::string body, std::string error, unsigned status) {
+ BOOST_LOG_TRIVIAL(error) << boost::format("%1%: Error listing printers: %2%, HTTP %3%, body: `%4%`") % name % error % status % body;
+ res = false;
+ })
+ .on_complete([&, this](std::string body, unsigned http_status) {
+ BOOST_LOG_TRIVIAL(debug) << boost::format("%1%: Got printers: %2%, HTTP status: %3%") % name % body % http_status;
+
+ if (http_status != 200)
+ throw HostNetworkError(GUI::format(_L("HTTP status: %1%\nMessage body: \"%2%\""), http_status, body));
+
+ std::stringstream ss(body);
+ pt::ptree ptree;
+ try {
+ pt::read_json(ss, ptree);
+ } catch (const pt::ptree_error &err) {
+ throw HostNetworkError(GUI::format(_L("Parsing of host response failed.\nMessage body: \"%1%\"\nError: \"%2%\""), body, err.what()));
+ }
+
+ const auto error = ptree.get_optional<std::string>("error");
+ if (error)
+ throw HostNetworkError(*error);
+
+ try {
+ BOOST_FOREACH(boost::property_tree::ptree::value_type &v, ptree.get_child("data.")) {
+ const auto port = v.second.get<std::string>("slug");
+ printers.push_back(Slic3r::GUI::from_u8(port));
+ }
+ } catch (const std::exception &err) {
+ throw HostNetworkError(GUI::format(_L("Enumeration of host printers failed.\nMessage body: \"%1%\"\nError: \"%2%\""), body, err.what()));
+ }
+ })
+ .perform_sync();
+
+ return res;
+}
+
+}
diff --git a/src/slic3r/Utils/Repetier.hpp b/src/slic3r/Utils/Repetier.hpp
new file mode 100644
index 000000000..d94d7ec56
--- /dev/null
+++ b/src/slic3r/Utils/Repetier.hpp
@@ -0,0 +1,52 @@
+#ifndef slic3r_Repetier_hpp_
+#define slic3r_Repetier_hpp_
+
+#include <string>
+#include <wx/string.h>
+#include <boost/optional.hpp>
+
+#include "PrintHost.hpp"
+
+
+namespace Slic3r {
+
+class DynamicPrintConfig;
+class Http;
+
+class Repetier : public PrintHost
+{
+public:
+ Repetier(DynamicPrintConfig *config);
+ ~Repetier() override = default;
+
+ const char* get_name() const;
+
+ bool test(wxString &curl_msg) const override;
+ wxString get_test_ok_msg () const override;
+ wxString get_test_failed_msg (wxString &msg) const override;
+ bool upload(PrintHostUpload upload_data, ProgressFn prorgess_fn, ErrorFn error_fn) const override;
+ bool has_auto_discovery() const override { return false; }
+ bool can_test() const override { return true; }
+ bool can_start_print() const override { return false; }
+ bool supports_multiple_printers() const override { return true; }
+ std::string get_host() const override { return host; }
+
+ bool get_groups(wxArrayString &groups) const override;
+ bool get_printers(wxArrayString &printers) const override;
+
+protected:
+ virtual bool validate_version_text(const boost::optional<std::string> &version_text) const;
+
+private:
+ std::string host;
+ std::string apikey;
+ std::string cafile;
+ std::string port;
+
+ void set_auth(Http &http) const;
+ std::string make_url(const std::string &path) const;
+};
+
+}
+
+#endif
diff --git a/src/slic3r/Utils/Serial.cpp b/src/slic3r/Utils/Serial.cpp
index 737e76c0b..4db1acc6b 100644
--- a/src/slic3r/Utils/Serial.cpp
+++ b/src/slic3r/Utils/Serial.cpp
@@ -1,5 +1,7 @@
#include "Serial.hpp"
+#include "libslic3r/Exception.hpp"
+
#include <algorithm>
#include <string>
#include <vector>
@@ -298,7 +300,7 @@ void Serial::set_baud_rate(unsigned baud_rate)
auto handle_errno = [](int retval) {
if (retval != 0) {
- throw std::runtime_error(
+ throw Slic3r::RuntimeError(
(boost::format("Could not set baud rate: %1%") % strerror(errno)).str()
);
}
@@ -311,7 +313,7 @@ void Serial::set_baud_rate(unsigned baud_rate)
speed_t newSpeed = baud_rate;
handle_errno(::ioctl(handle, IOSSIOSPEED, &newSpeed));
handle_errno(::tcsetattr(handle, TCSANOW, &ios));
-#elif __linux
+#elif __linux__
/* The following definitions are kindly borrowed from:
/usr/include/asm-generic/termbits.h
@@ -346,7 +348,7 @@ void Serial::set_baud_rate(unsigned baud_rate)
handle_errno(::cfsetspeed(&ios, baud_rate));
handle_errno(::tcsetattr(handle, TCSAFLUSH, &ios));
#else
- throw std::runtime_error("Custom baud rates are not currently supported on this OS");
+ throw Slic3r::RuntimeError("Custom baud rates are not currently supported on this OS");
#endif
}
}
@@ -358,7 +360,7 @@ void Serial::set_DTR(bool on)
auto handle = native_handle();
#if defined(_WIN32) && !defined(__SYMBIAN32__)
if (! EscapeCommFunction(handle, on ? SETDTR : CLRDTR)) {
- throw std::runtime_error("Could not set serial port DTR");
+ throw Slic3r::RuntimeError("Could not set serial port DTR");
}
#else
int status;
@@ -369,7 +371,7 @@ void Serial::set_DTR(bool on)
}
}
- throw std::runtime_error(
+ throw Slic3r::RuntimeError(
(boost::format("Could not set serial port DTR: %1%") % strerror(errno)).str()
);
#endif
diff --git a/src/slic3r/Utils/Thread.hpp b/src/slic3r/Utils/Thread.hpp
deleted file mode 100644
index e9c76d2ab..000000000
--- a/src/slic3r/Utils/Thread.hpp
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef THREAD_HPP
-#define THREAD_HPP
-
-#include <utility>
-#include <boost/thread.hpp>
-
-namespace Slic3r {
-
-template<class Fn>
-inline boost::thread create_thread(boost::thread::attributes &attrs, Fn &&fn)
-{
- // Duplicating the stack allocation size of Thread Building Block worker
- // threads of the thread pool: allocate 4MB on a 64bit system, allocate 2MB
- // on a 32bit system by default.
-
- attrs.set_stack_size((sizeof(void*) == 4) ? (2048 * 1024) : (4096 * 1024));
- return boost::thread{attrs, std::forward<Fn>(fn)};
-}
-
-template<class Fn> inline boost::thread create_thread(Fn &&fn)
-{
- boost::thread::attributes attrs;
- return create_thread(attrs, std::forward<Fn>(fn));
-}
-
-}
-
-#endif // THREAD_HPP
diff --git a/src/slic3r/Utils/UndoRedo.cpp b/src/slic3r/Utils/UndoRedo.cpp
index 9c8d7a8c6..d82d9e31d 100644
--- a/src/slic3r/Utils/UndoRedo.cpp
+++ b/src/slic3r/Utils/UndoRedo.cpp
@@ -17,7 +17,7 @@
#define CEREAL_FUTURE_EXPERIMENTAL
#include <cereal/archives/adapters.hpp>
-#include <libslic3r/Config.hpp>
+#include <libslic3r/PrintConfig.hpp>
#include <libslic3r/ObjectID.hpp>
#include <libslic3r/Utils.hpp>
@@ -36,6 +36,15 @@
namespace Slic3r {
namespace UndoRedo {
+#ifdef SLIC3R_UNDOREDO_DEBUG
+static inline std::string ptr_to_string(const void* ptr)
+{
+ char buf[64];
+ sprintf(buf, "%p", ptr);
+ return buf;
+}
+#endif
+
SnapshotData::SnapshotData() : printer_technology(ptUnknown), flags(0), layer_range_idx(-1)
{
}
@@ -307,7 +316,11 @@ private:
size_t size;
char data[1];
+ // The serialized data matches the data stored here.
bool matches(const std::string& rhs) { return this->size == rhs.size() && memcmp(this->data, rhs.data(), this->size) == 0; }
+
+ // The timestamp matches the timestamp serialized in the data stored here.
+ bool matches_timestamp(uint64_t timestamp) { assert(timestamp > 0); assert(this->size > 8); return memcmp(this->data, &timestamp, 8) == 0; }
};
Interval m_interval;
@@ -350,7 +363,8 @@ public:
size_t size() const { return m_data->size; }
size_t refcnt() const { return m_data->refcnt; }
bool matches(const std::string& data) { return m_data->matches(data); }
- size_t memsize() const {
+ bool matches_timestamp(uint64_t timestamp) { return m_data->matches_timestamp(timestamp); }
+ size_t memsize() const {
return m_data->refcnt == 1 ?
// Count just the size of the snapshot data.
m_data->size :
@@ -363,15 +377,6 @@ private:
MutableHistoryInterval& operator=(const MutableHistoryInterval &rhs);
};
-#ifdef SLIC3R_UNDOREDO_DEBUG
-static inline std::string ptr_to_string(const void* ptr)
-{
- char buf[64];
- sprintf(buf, "%p", ptr);
- return buf;
-}
-#endif
-
// Smaller objects (Model, ModelObject, ModelInstance, ModelVolume, DynamicPrintConfig)
// are mutable and there is not tracking of the changes, therefore a snapshot needs to be
// taken every time and compared to the previous data at the Undo / Redo stack.
@@ -398,6 +403,27 @@ public:
return memsize;
}
+ // If an object provides a reliable timestamp and the object serializes the timestamp first,
+ // then we may just check the validity of the timestamp against the last snapshot without
+ // having to serialize the whole object. This reduces the amount of serialization and memcmp
+ // when taking a snapshot.
+ bool try_save_timestamp(size_t active_snapshot_time, size_t current_time, uint64_t timestamp) {
+ assert(m_history.empty() || m_history.back().end() <= active_snapshot_time);
+ if (! m_history.empty() && m_history.back().matches_timestamp(timestamp)) {
+ if (m_history.back().end() < active_snapshot_time)
+ // Share the previous data by reference counting.
+ m_history.emplace_back(Interval(current_time, current_time + 1), m_history.back());
+ else {
+ assert(m_history.back().end() == active_snapshot_time);
+ // Just extend the last interval using the old data.
+ m_history.back().extend_end(current_time + 1);
+ }
+ return true;
+ }
+ // The timestamp is not valid, the caller has to call this->save() with the serialized data.
+ return false;
+ }
+
void save(size_t active_snapshot_time, size_t current_time, const std::string &data) {
assert(m_history.empty() || m_history.back().end() <= active_snapshot_time);
if (m_history.empty() || m_history.back().end() < active_snapshot_time) {
@@ -522,6 +548,7 @@ public:
void load_snapshot(size_t timestamp, Slic3r::Model& model, Slic3r::GUI::GLGizmosManager& gizmos);
bool has_undo_snapshot() const;
+ bool has_undo_snapshot(size_t time_to_load) const;
bool has_redo_snapshot() const;
bool undo(Slic3r::Model &model, const Slic3r::GUI::Selection &selection, Slic3r::GUI::GLGizmosManager &gizmos, const SnapshotData &snapshot_data, size_t jump_to_time);
bool redo(Slic3r::Model &model, Slic3r::GUI::GLGizmosManager &gizmos, size_t jump_to_time);
@@ -749,13 +776,23 @@ template<typename T> ObjectID StackImpl::save_mutable_object(const T &object)
if (it_object_history == m_objects.end())
it_object_history = m_objects.insert(it_object_history, std::make_pair(object.id(), std::unique_ptr<MutableObjectHistory<T>>(new MutableObjectHistory<T>())));
auto *object_history = static_cast<MutableObjectHistory<T>*>(it_object_history->second.get());
- // Then serialize the object into a string.
- std::ostringstream oss;
+ bool needs_to_save = true;
{
- Slic3r::UndoRedo::OutputArchive archive(*this, oss);
- archive(object);
+ // If the timestamp returned is non zero, then it is considered reliable.
+ // The caller is supposed to serialize the timestamp first.
+ uint64_t timestamp = object.timestamp();
+ if (timestamp > 0)
+ needs_to_save = ! object_history->try_save_timestamp(m_active_snapshot_time, m_current_time, timestamp);
+ }
+ if (needs_to_save) {
+ // Serialize the object into a string.
+ std::ostringstream oss;
+ {
+ Slic3r::UndoRedo::OutputArchive archive(*this, oss);
+ archive(object);
+ }
+ object_history->save(m_active_snapshot_time, m_current_time, oss.str());
}
- object_history->save(m_active_snapshot_time, m_current_time, oss.str());
return object.id();
}
@@ -847,7 +884,7 @@ void StackImpl::load_snapshot(size_t timestamp, Slic3r::Model& model, Slic3r::GU
// Find the snapshot by time. It must exist.
const auto it_snapshot = std::lower_bound(m_snapshots.begin(), m_snapshots.end(), Snapshot(timestamp));
if (it_snapshot == m_snapshots.end() || it_snapshot->timestamp != timestamp)
- throw std::runtime_error((boost::format("Snapshot with timestamp %1% does not exist") % timestamp).str());
+ throw Slic3r::RuntimeError((boost::format("Snapshot with timestamp %1% does not exist") % timestamp).str());
m_active_snapshot_time = timestamp;
model.clear_objects();
@@ -871,6 +908,11 @@ bool StackImpl::has_undo_snapshot() const
return -- it != m_snapshots.begin();
}
+bool StackImpl::has_undo_snapshot(size_t time_to_load) const
+{
+ return time_to_load < m_active_snapshot_time && std::binary_search(m_snapshots.begin(), m_snapshots.end(), Snapshot(time_to_load));
+}
+
bool StackImpl::has_redo_snapshot() const
{
assert(this->valid());
@@ -1047,6 +1089,7 @@ void Stack::release_least_recently_used() { pimpl->release_least_recently_used()
void Stack::take_snapshot(const std::string& snapshot_name, const Slic3r::Model& model, const Slic3r::GUI::Selection& selection, const Slic3r::GUI::GLGizmosManager& gizmos, const SnapshotData &snapshot_data)
{ pimpl->take_snapshot(snapshot_name, model, selection, gizmos, snapshot_data); }
bool Stack::has_undo_snapshot() const { return pimpl->has_undo_snapshot(); }
+bool Stack::has_undo_snapshot(size_t time_to_load) const { return pimpl->has_undo_snapshot(time_to_load); }
bool Stack::has_redo_snapshot() const { return pimpl->has_redo_snapshot(); }
bool Stack::undo(Slic3r::Model& model, const Slic3r::GUI::Selection& selection, Slic3r::GUI::GLGizmosManager& gizmos, const SnapshotData &snapshot_data, size_t time_to_load)
{ return pimpl->undo(model, selection, gizmos, snapshot_data, time_to_load); }
diff --git a/src/slic3r/Utils/UndoRedo.hpp b/src/slic3r/Utils/UndoRedo.hpp
index 2901eaceb..e120c4f79 100644
--- a/src/slic3r/Utils/UndoRedo.hpp
+++ b/src/slic3r/Utils/UndoRedo.hpp
@@ -107,6 +107,8 @@ public:
// To be queried to enable / disable the Undo / Redo buttons at the UI.
bool has_undo_snapshot() const;
bool has_redo_snapshot() const;
+ // To query whether one can undo to a snapshot. Useful for notifications, that want to Undo a specific operation.
+ bool has_undo_snapshot(size_t time_to_load) const;
// Roll back the time. If time_to_load is SIZE_MAX, the previous snapshot is activated.
// Undoing an action may need to take a snapshot of the current application state, so that redo to the current state is possible.
diff --git a/src/slic3r/pchheader.hpp b/src/slic3r/pchheader.hpp
index 3b321d960..ebdabe836 100644
--- a/src/slic3r/pchheader.hpp
+++ b/src/slic3r/pchheader.hpp
@@ -183,3 +183,7 @@
#include "libslic3r/BoundingBox.hpp"
#include "libslic3r/ClipperUtils.hpp"
#include "libslic3r/libslic3r.h"
+
+#ifdef _WIN32
+#include "GUI/format.hpp"
+#endif // _WIN32
diff --git a/t/shells.t b/t/shells.t
index c40131590..47b5c8881 100644
--- a/t/shells.t
+++ b/t/shells.t
@@ -234,6 +234,7 @@ use Slic3r::Test;
$config->set('first_layer_height', '100%');
$config->set('layer_height', 0.4);
$config->set('start_gcode', '');
+# $config->set('use_relative_e_distances', 1);
$config->validate;
my $print = Slic3r::Test::init_print('20mm_cube', config => $config);
@@ -269,7 +270,12 @@ use Slic3r::Test;
my $total_dist_XY = sum(map $_->[1], @this_layer);
$sum_of_partial_z_equals_to_layer_height = 1
- if abs(sum(map $_->[0], @this_layer) - $config->layer_height) > epsilon;
+ if abs(sum(map $_->[0], @this_layer) - $config->layer_height) >
+ # The first segment on the 2nd layer has extrusion interpolated from zero
+ # and the 1st segment has such a low extrusion assigned, that it is effectively zero, thus the move
+ # is considered non-extruding and a higher epsilon is required.
+ ($z_moves == 2 ? 0.0021 : epsilon);
+ #printf ("Total height: %f, layer height: %f, good: %d\n", sum(map $_->[0], @this_layer), $config->layer_height, $sum_of_partial_z_equals_to_layer_height);
foreach my $segment (@this_layer) {
# check that segment's dist_Z is proportioned to its dist_XY
@@ -281,6 +287,7 @@ use Slic3r::Test;
} elsif ($info->{extruding} && $info->{dist_XY} > 0) {
$horizontal_extrusions = 1
if $info->{dist_Z} == 0;
+ #printf("Pushing dist_z: %f, dist_xy: %f\n", $info->{dist_Z}, $info->{dist_XY});
push @this_layer, [ $info->{dist_Z}, $info->{dist_XY} ];
}
}
diff --git a/tests/catch2/catch.hpp b/tests/catch2/catch.hpp
index 5feb2a4be..282d1562c 100644
--- a/tests/catch2/catch.hpp
+++ b/tests/catch2/catch.hpp
@@ -1,9 +1,9 @@
/*
- * Catch v2.9.2
- * Generated: 2019-08-08 13:35:12.279703
+ * Catch v2.13.3
+ * Generated: 2020-10-31 18:20:31.045274
* ----------------------------------------------------------
* This file has been merged from multiple headers. Please don't edit it directly
- * Copyright (c) 2019 Two Blue Cubes Ltd. All rights reserved.
+ * Copyright (c) 2020 Two Blue Cubes Ltd. All rights reserved.
*
* Distributed under the Boost Software License, Version 1.0. (See accompanying
* file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
@@ -14,8 +14,8 @@
#define CATCH_VERSION_MAJOR 2
-#define CATCH_VERSION_MINOR 9
-#define CATCH_VERSION_PATCH 2
+#define CATCH_VERSION_MINOR 13
+#define CATCH_VERSION_PATCH 3
#ifdef __clang__
# pragma clang system_header
@@ -132,36 +132,51 @@ namespace Catch {
#endif
-#if defined(CATCH_CPP17_OR_GREATER)
-# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS
+// We have to avoid both ICC and Clang, because they try to mask themselves
+// as gcc, and we want only GCC in this block
+#if defined(__GNUC__) && !defined(__clang__) && !defined(__ICC) && !defined(__CUDACC__)
+# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic push" )
+# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "GCC diagnostic pop" )
+
+# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__)
+
#endif
-#ifdef __clang__
+#if defined(__clang__)
+
+# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic push" )
+# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION _Pragma( "clang diagnostic pop" )
+
+// As of this writing, IBM XL's implementation of __builtin_constant_p has a bug
+// which results in calls to destructors being emitted for each temporary,
+// without a matching initialization. In practice, this can result in something
+// like `std::string::~string` being called on an uninitialized value.
+//
+// For example, this code will likely segfault under IBM XL:
+// ```
+// REQUIRE(std::string("12") + "34" == "1234")
+// ```
+//
+// Therefore, `CATCH_INTERNAL_IGNORE_BUT_WARN` is not implemented.
+# if !defined(__ibmxl__) && !defined(__CUDACC__)
+# define CATCH_INTERNAL_IGNORE_BUT_WARN(...) (void)__builtin_constant_p(__VA_ARGS__) /* NOLINT(cppcoreguidelines-pro-type-vararg, hicpp-vararg) */
+# endif
+
+# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
+ _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \
+ _Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"")
+
+# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \
+ _Pragma( "clang diagnostic ignored \"-Wparentheses\"" )
-# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
- _Pragma( "clang diagnostic push" ) \
- _Pragma( "clang diagnostic ignored \"-Wexit-time-destructors\"" ) \
- _Pragma( "clang diagnostic ignored \"-Wglobal-constructors\"")
-# define CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \
- _Pragma( "clang diagnostic pop" )
-
-# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \
- _Pragma( "clang diagnostic push" ) \
- _Pragma( "clang diagnostic ignored \"-Wparentheses\"" )
-# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \
- _Pragma( "clang diagnostic pop" )
-
-# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \
- _Pragma( "clang diagnostic push" ) \
- _Pragma( "clang diagnostic ignored \"-Wunused-variable\"" )
-# define CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS \
- _Pragma( "clang diagnostic pop" )
-
-# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \
- _Pragma( "clang diagnostic push" ) \
- _Pragma( "clang diagnostic ignored \"-Wgnu-zero-variadic-macro-arguments\"" )
-# define CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS \
- _Pragma( "clang diagnostic pop" )
+# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \
+ _Pragma( "clang diagnostic ignored \"-Wunused-variable\"" )
+
+# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \
+ _Pragma( "clang diagnostic ignored \"-Wgnu-zero-variadic-macro-arguments\"" )
+
+# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
+ _Pragma( "clang diagnostic ignored \"-Wunused-template\"" )
#endif // __clang__
@@ -186,6 +201,7 @@ namespace Catch {
// Android somehow still does not support std::to_string
#if defined(__ANDROID__)
# define CATCH_INTERNAL_CONFIG_NO_CPP11_TO_STRING
+# define CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE
#endif
////////////////////////////////////////////////////////////////////////////////
@@ -219,11 +235,10 @@ namespace Catch {
////////////////////////////////////////////////////////////////////////////////
// Visual C++
-#ifdef _MSC_VER
+#if defined(_MSC_VER)
-# if _MSC_VER >= 1900 // Visual Studio 2015 or newer
-# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS
-# endif
+# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION __pragma( warning(push) )
+# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION __pragma( warning(pop) )
// Universal Windows platform does not support SEH
// Or console colours (or console at all...)
@@ -236,9 +251,12 @@ namespace Catch {
// MSVC traditional preprocessor needs some workaround for __VA_ARGS__
// _MSVC_TRADITIONAL == 0 means new conformant preprocessor
// _MSVC_TRADITIONAL == 1 means old traditional non-conformant preprocessor
-# if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL)
-# define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
-# endif
+# if !defined(__clang__) // Handle Clang masquerading for msvc
+# if !defined(_MSVC_TRADITIONAL) || (defined(_MSVC_TRADITIONAL) && _MSVC_TRADITIONAL)
+# define CATCH_INTERNAL_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
+# endif // MSVC_TRADITIONAL
+# endif // __clang__
+
#endif // _MSC_VER
#if defined(_REENTRANT) || defined(_MSC_VER)
@@ -286,49 +304,46 @@ namespace Catch {
#define CATCH_CONFIG_COLOUR_NONE
#endif
-////////////////////////////////////////////////////////////////////////////////
-// Check if string_view is available and usable
-// The check is split apart to work around v140 (VS2015) preprocessor issue...
-#if defined(__has_include)
-#if __has_include(<string_view>) && defined(CATCH_CPP17_OR_GREATER)
-# define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW
-#endif
+#if !defined(_GLIBCXX_USE_C99_MATH_TR1)
+#define CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER
#endif
-////////////////////////////////////////////////////////////////////////////////
-// Check if optional is available and usable
-#if defined(__has_include)
-# if __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER)
-# define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL
-# endif // __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER)
-#endif // __has_include
-
-////////////////////////////////////////////////////////////////////////////////
-// Check if byte is available and usable
-#if defined(__has_include)
-# if __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER)
-# define CATCH_INTERNAL_CONFIG_CPP17_BYTE
-# endif // __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER)
-#endif // __has_include
-
-////////////////////////////////////////////////////////////////////////////////
-// Check if variant is available and usable
+// Various stdlib support checks that require __has_include
#if defined(__has_include)
-# if __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER)
-# if defined(__clang__) && (__clang_major__ < 8)
- // work around clang bug with libstdc++ https://bugs.llvm.org/show_bug.cgi?id=31852
- // fix should be in clang 8, workaround in libstdc++ 8.2
-# include <ciso646>
-# if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9)
-# define CATCH_CONFIG_NO_CPP17_VARIANT
-# else
-# define CATCH_INTERNAL_CONFIG_CPP17_VARIANT
-# endif // defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9)
-# else
-# define CATCH_INTERNAL_CONFIG_CPP17_VARIANT
-# endif // defined(__clang__) && (__clang_major__ < 8)
-# endif // __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER)
-#endif // __has_include
+ // Check if string_view is available and usable
+ #if __has_include(<string_view>) && defined(CATCH_CPP17_OR_GREATER)
+ # define CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW
+ #endif
+
+ // Check if optional is available and usable
+ # if __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER)
+ # define CATCH_INTERNAL_CONFIG_CPP17_OPTIONAL
+ # endif // __has_include(<optional>) && defined(CATCH_CPP17_OR_GREATER)
+
+ // Check if byte is available and usable
+ # if __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER)
+ # include <cstddef>
+ # if __cpp_lib_byte > 0
+ # define CATCH_INTERNAL_CONFIG_CPP17_BYTE
+ # endif
+ # endif // __has_include(<cstddef>) && defined(CATCH_CPP17_OR_GREATER)
+
+ // Check if variant is available and usable
+ # if __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER)
+ # if defined(__clang__) && (__clang_major__ < 8)
+ // work around clang bug with libstdc++ https://bugs.llvm.org/show_bug.cgi?id=31852
+ // fix should be in clang 8, workaround in libstdc++ 8.2
+ # include <ciso646>
+ # if defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9)
+ # define CATCH_CONFIG_NO_CPP17_VARIANT
+ # else
+ # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT
+ # endif // defined(__GLIBCXX__) && defined(_GLIBCXX_RELEASE) && (_GLIBCXX_RELEASE < 9)
+ # else
+ # define CATCH_INTERNAL_CONFIG_CPP17_VARIANT
+ # endif // defined(__clang__) && (__clang_major__ < 8)
+ # endif // __has_include(<variant>) && defined(CATCH_CPP17_OR_GREATER)
+#endif // defined(__has_include)
#if defined(CATCH_INTERNAL_CONFIG_COUNTER) && !defined(CATCH_CONFIG_NO_COUNTER) && !defined(CATCH_CONFIG_COUNTER)
# define CATCH_CONFIG_COUNTER
@@ -353,10 +368,6 @@ namespace Catch {
# define CATCH_CONFIG_CPP17_OPTIONAL
#endif
-#if defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) && !defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS)
-# define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS
-#endif
-
#if defined(CATCH_INTERNAL_CONFIG_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_NO_CPP17_STRING_VIEW) && !defined(CATCH_CONFIG_CPP17_STRING_VIEW)
# define CATCH_CONFIG_CPP17_STRING_VIEW
#endif
@@ -389,21 +400,49 @@ namespace Catch {
# define CATCH_CONFIG_USE_ASYNC
#endif
+#if defined(CATCH_INTERNAL_CONFIG_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_NO_ANDROID_LOGWRITE) && !defined(CATCH_CONFIG_ANDROID_LOGWRITE)
+# define CATCH_CONFIG_ANDROID_LOGWRITE
+#endif
+
+#if defined(CATCH_INTERNAL_CONFIG_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_NO_GLOBAL_NEXTAFTER) && !defined(CATCH_CONFIG_GLOBAL_NEXTAFTER)
+# define CATCH_CONFIG_GLOBAL_NEXTAFTER
+#endif
+
+// Even if we do not think the compiler has that warning, we still have
+// to provide a macro that can be used by the code.
+#if !defined(CATCH_INTERNAL_START_WARNINGS_SUPPRESSION)
+# define CATCH_INTERNAL_START_WARNINGS_SUPPRESSION
+#endif
+#if !defined(CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION)
+# define CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
+#endif
#if !defined(CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS)
# define CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS
-# define CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS
#endif
#if !defined(CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS)
# define CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS
-# define CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS
#endif
#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS)
# define CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS
-# define CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS
#endif
#if !defined(CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS)
# define CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS
-# define CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS
+#endif
+
+// The goal of this macro is to avoid evaluation of the arguments, but
+// still have the compiler warn on problems inside...
+#if !defined(CATCH_INTERNAL_IGNORE_BUT_WARN)
+# define CATCH_INTERNAL_IGNORE_BUT_WARN(...)
+#endif
+
+#if defined(__APPLE__) && defined(__apple_build_version__) && (__clang_major__ < 10)
+# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
+#elif defined(__clang__) && (__clang_major__ < 5)
+# undef CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
+#endif
+
+#if !defined(CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS)
+# define CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS
#endif
#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
@@ -468,7 +507,7 @@ namespace Catch {
SourceLineInfo( SourceLineInfo&& ) noexcept = default;
SourceLineInfo& operator = ( SourceLineInfo&& ) noexcept = default;
- bool empty() const noexcept;
+ bool empty() const noexcept { return file[0] == '\0'; }
bool operator == ( SourceLineInfo const& other ) const noexcept;
bool operator < ( SourceLineInfo const& other ) const noexcept;
@@ -509,9 +548,10 @@ namespace Catch {
} // end namespace Catch
#define CATCH_REGISTER_TAG_ALIAS( alias, spec ) \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
namespace{ Catch::RegistrarForTagAliases INTERNAL_CATCH_UNIQUE_NAME( AutoRegisterTagAlias )( alias, spec, CATCH_INTERNAL_LINEINFO ); } \
- CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
// end catch_tag_alias_autoregistrar.h
// start catch_test_registry.h
@@ -551,53 +591,30 @@ namespace Catch {
#include <cstddef>
#include <string>
#include <iosfwd>
+#include <cassert>
namespace Catch {
/// A non-owning string class (similar to the forthcoming std::string_view)
/// Note that, because a StringRef may be a substring of another string,
- /// it may not be null terminated. c_str() must return a null terminated
- /// string, however, and so the StringRef will internally take ownership
- /// (taking a copy), if necessary. In theory this ownership is not externally
- /// visible - but it does mean (substring) StringRefs should not be shared between
- /// threads.
+ /// it may not be null terminated.
class StringRef {
public:
using size_type = std::size_t;
+ using const_iterator = const char*;
private:
- friend struct StringRefTestAccess;
-
- char const* m_start;
- size_type m_size;
-
- char* m_data = nullptr;
-
- void takeOwnership();
-
static constexpr char const* const s_empty = "";
- public: // construction/ assignment
- StringRef() noexcept
- : StringRef( s_empty, 0 )
- {}
-
- StringRef( StringRef const& other ) noexcept
- : m_start( other.m_start ),
- m_size( other.m_size )
- {}
+ char const* m_start = s_empty;
+ size_type m_size = 0;
- StringRef( StringRef&& other ) noexcept
- : m_start( other.m_start ),
- m_size( other.m_size ),
- m_data( other.m_data )
- {
- other.m_data = nullptr;
- }
+ public: // construction
+ constexpr StringRef() noexcept = default;
StringRef( char const* rawChars ) noexcept;
- StringRef( char const* rawChars, size_type size ) noexcept
+ constexpr StringRef( char const* rawChars, size_type size ) noexcept
: m_start( rawChars ),
m_size( size )
{}
@@ -607,101 +624,64 @@ namespace Catch {
m_size( stdString.size() )
{}
- ~StringRef() noexcept {
- delete[] m_data;
- }
-
- auto operator = ( StringRef const &other ) noexcept -> StringRef& {
- delete[] m_data;
- m_data = nullptr;
- m_start = other.m_start;
- m_size = other.m_size;
- return *this;
+ explicit operator std::string() const {
+ return std::string(m_start, m_size);
}
- operator std::string() const;
-
- void swap( StringRef& other ) noexcept;
-
public: // operators
auto operator == ( StringRef const& other ) const noexcept -> bool;
- auto operator != ( StringRef const& other ) const noexcept -> bool;
+ auto operator != (StringRef const& other) const noexcept -> bool {
+ return !(*this == other);
+ }
- auto operator[] ( size_type index ) const noexcept -> char;
+ auto operator[] ( size_type index ) const noexcept -> char {
+ assert(index < m_size);
+ return m_start[index];
+ }
public: // named queries
- auto empty() const noexcept -> bool {
+ constexpr auto empty() const noexcept -> bool {
return m_size == 0;
}
- auto size() const noexcept -> size_type {
+ constexpr auto size() const noexcept -> size_type {
return m_size;
}
- auto numberOfCharacters() const noexcept -> size_type;
+ // Returns the current start pointer. If the StringRef is not
+ // null-terminated, throws std::domain_exception
auto c_str() const -> char const*;
public: // substrings and searches
- auto substr( size_type start, size_type size ) const noexcept -> StringRef;
+ // Returns a substring of [start, start + length).
+ // If start + length > size(), then the substring is [start, size()).
+ // If start > size(), then the substring is empty.
+ auto substr( size_type start, size_type length ) const noexcept -> StringRef;
- // Returns the current start pointer.
- // Note that the pointer can change when if the StringRef is a substring
- auto currentData() const noexcept -> char const*;
+ // Returns the current start pointer. May not be null-terminated.
+ auto data() const noexcept -> char const*;
- private: // ownership queries - may not be consistent between calls
- auto isOwned() const noexcept -> bool;
- auto isSubstring() const noexcept -> bool;
- };
+ constexpr auto isNullTerminated() const noexcept -> bool {
+ return m_start[m_size] == '\0';
+ }
- auto operator + ( StringRef const& lhs, StringRef const& rhs ) -> std::string;
- auto operator + ( StringRef const& lhs, char const* rhs ) -> std::string;
- auto operator + ( char const* lhs, StringRef const& rhs ) -> std::string;
+ public: // iterators
+ constexpr const_iterator begin() const { return m_start; }
+ constexpr const_iterator end() const { return m_start + m_size; }
+ };
auto operator += ( std::string& lhs, StringRef const& sr ) -> std::string&;
auto operator << ( std::ostream& os, StringRef const& sr ) -> std::ostream&;
- inline auto operator "" _sr( char const* rawChars, std::size_t size ) noexcept -> StringRef {
+ constexpr auto operator "" _sr( char const* rawChars, std::size_t size ) noexcept -> StringRef {
return StringRef( rawChars, size );
}
-
} // namespace Catch
-inline auto operator "" _catch_sr( char const* rawChars, std::size_t size ) noexcept -> Catch::StringRef {
+constexpr auto operator "" _catch_sr( char const* rawChars, std::size_t size ) noexcept -> Catch::StringRef {
return Catch::StringRef( rawChars, size );
}
// end catch_stringref.h
-// start catch_type_traits.hpp
-
-
-#include <type_traits>
-
-namespace Catch{
-
-#ifdef CATCH_CPP17_OR_GREATER
- template <typename...>
- inline constexpr auto is_unique = std::true_type{};
-
- template <typename T, typename... Rest>
- inline constexpr auto is_unique<T, Rest...> = std::bool_constant<
- (!std::is_same_v<T, Rest> && ...) && is_unique<Rest...>
- >{};
-#else
-
-template <typename...>
-struct is_unique : std::true_type{};
-
-template <typename T0, typename T1, typename... Rest>
-struct is_unique<T0, T1, Rest...> : std::integral_constant
-<bool,
- !std::is_same<T0, T1>::value
- && is_unique<T0, Rest...>::value
- && is_unique<T1, Rest...>::value
->{};
-
-#endif
-}
-
-// end catch_type_traits.hpp
// start catch_preprocessor.hpp
@@ -786,7 +766,7 @@ struct is_unique<T0, T1, Rest...> : std::integral_constant
#define INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_0, _1, _2, _3) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_3_ARG(_1, _2, _3)
#define INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_0, _1, _2, _3, _4) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_4_ARG(_1, _2, _3, _4)
#define INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_0, _1, _2, _3, _4, _5) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_5_ARG(_1, _2, _3, _4, _5)
-#define INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_0, _1, _2, _3, _4, _5, _6) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_1, _2, _4, _5, _6)
+#define INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_0, _1, _2, _3, _4, _5, _6) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_6_ARG(_1, _2, _3, _4, _5, _6)
#define INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_0, _1, _2, _3, _4, _5, _6, _7) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_7_ARG(_1, _2, _3, _4, _5, _6, _7)
#define INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_8_ARG(_1, _2, _3, _4, _5, _6, _7, _8)
#define INTERNAL_CATCH_REMOVE_PARENS_10_ARG(_0, _1, _2, _3, _4, _5, _6, _7, _8, _9) INTERNAL_CATCH_REMOVE_PARENS(_0), INTERNAL_CATCH_REMOVE_PARENS_9_ARG(_1, _2, _3, _4, _5, _6, _7, _8, _9)
@@ -798,35 +778,49 @@ struct is_unique<T0, T1, Rest...> : std::integral_constant
template<typename...> struct TypeList {};\
template<typename...Ts>\
constexpr auto get_wrapper() noexcept -> TypeList<Ts...> { return {}; }\
+ template<template<typename...> class...> struct TemplateTypeList{};\
+ template<template<typename...> class...Cs>\
+ constexpr auto get_wrapper() noexcept -> TemplateTypeList<Cs...> { return {}; }\
+ template<typename...>\
+ struct append;\
+ template<typename...>\
+ struct rewrap;\
+ template<template<typename...> class, typename...>\
+ struct create;\
+ template<template<typename...> class, typename>\
+ struct convert;\
\
- template<template<typename...> class L1, typename...E1, template<typename...> class L2, typename...E2> \
- constexpr auto append(L1<E1...>, L2<E2...>) noexcept -> L1<E1...,E2...> { return {}; }\
+ template<typename T> \
+ struct append<T> { using type = T; };\
template< template<typename...> class L1, typename...E1, template<typename...> class L2, typename...E2, typename...Rest>\
- constexpr auto append(L1<E1...>, L2<E2...>, Rest...) noexcept -> decltype(append(L1<E1...,E2...>{}, Rest{}...)) { return {}; }\
+ struct append<L1<E1...>, L2<E2...>, Rest...> { using type = typename append<L1<E1...,E2...>, Rest...>::type; };\
template< template<typename...> class L1, typename...E1, typename...Rest>\
- constexpr auto append(L1<E1...>, TypeList<mpl_::na>, Rest...) noexcept -> L1<E1...> { return {}; }\
+ struct append<L1<E1...>, TypeList<mpl_::na>, Rest...> { using type = L1<E1...>; };\
\
template< template<typename...> class Container, template<typename...> class List, typename...elems>\
- constexpr auto rewrap(List<elems...>) noexcept -> TypeList<Container<elems...>> { return {}; }\
+ struct rewrap<TemplateTypeList<Container>, List<elems...>> { using type = TypeList<Container<elems...>>; };\
template< template<typename...> class Container, template<typename...> class List, class...Elems, typename...Elements>\
- constexpr auto rewrap(List<Elems...>,Elements...) noexcept -> decltype(append(TypeList<Container<Elems...>>{}, rewrap<Container>(Elements{}...))) { return {}; }\
+ struct rewrap<TemplateTypeList<Container>, List<Elems...>, Elements...> { using type = typename append<TypeList<Container<Elems...>>, typename rewrap<TemplateTypeList<Container>, Elements...>::type>::type; };\
\
template<template <typename...> class Final, template< typename...> class...Containers, typename...Types>\
- constexpr auto create(TypeList<Types...>) noexcept -> decltype(append(Final<>{}, rewrap<Containers>(Types{}...)...)) { return {}; }\
+ struct create<Final, TemplateTypeList<Containers...>, TypeList<Types...>> { using type = typename append<Final<>, typename rewrap<TemplateTypeList<Containers>, Types...>::type...>::type; };\
template<template <typename...> class Final, template <typename...> class List, typename...Ts>\
- constexpr auto convert(List<Ts...>) noexcept -> decltype(append(Final<>{},TypeList<Ts>{}...)) { return {}; }
+ struct convert<Final, List<Ts...>> { using type = typename append<Final<>,TypeList<Ts>...>::type; };
#define INTERNAL_CATCH_NTTP_1(signature, ...)\
template<INTERNAL_CATCH_REMOVE_PARENS(signature)> struct Nttp{};\
template<INTERNAL_CATCH_REMOVE_PARENS(signature)>\
constexpr auto get_wrapper() noexcept -> Nttp<__VA_ARGS__> { return {}; } \
+ template<template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...> struct NttpTemplateTypeList{};\
+ template<template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...Cs>\
+ constexpr auto get_wrapper() noexcept -> NttpTemplateTypeList<Cs...> { return {}; } \
\
template< template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class Container, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class List, INTERNAL_CATCH_REMOVE_PARENS(signature)>\
- constexpr auto rewrap(List<__VA_ARGS__>) noexcept -> TypeList<Container<__VA_ARGS__>> { return {}; }\
+ struct rewrap<NttpTemplateTypeList<Container>, List<__VA_ARGS__>> { using type = TypeList<Container<__VA_ARGS__>>; };\
template< template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class Container, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class List, INTERNAL_CATCH_REMOVE_PARENS(signature), typename...Elements>\
- constexpr auto rewrap(List<__VA_ARGS__>,Elements...elems) noexcept -> decltype(append(TypeList<Container<__VA_ARGS__>>{}, rewrap<Container>(elems...))) { return {}; }\
+ struct rewrap<NttpTemplateTypeList<Container>, List<__VA_ARGS__>, Elements...> { using type = typename append<TypeList<Container<__VA_ARGS__>>, typename rewrap<NttpTemplateTypeList<Container>, Elements...>::type>::type; };\
template<template <typename...> class Final, template<INTERNAL_CATCH_REMOVE_PARENS(signature)> class...Containers, typename...Types>\
- constexpr auto create(TypeList<Types...>) noexcept -> decltype(append(Final<>{}, rewrap<Containers>(Types{}...)...)) { return {}; }
+ struct create<Final, NttpTemplateTypeList<Containers...>, TypeList<Types...>> { using type = typename append<Final<>, typename rewrap<NttpTemplateTypeList<Containers>, Types...>::type...>::type; };
#define INTERNAL_CATCH_DECLARE_SIG_TEST0(TestName)
#define INTERNAL_CATCH_DECLARE_SIG_TEST1(TestName, signature)\
@@ -922,22 +916,33 @@ struct is_unique<T0, T1, Rest...> : std::integral_constant
#include <type_traits>
namespace Catch {
-template<typename T>
-struct always_false : std::false_type {};
+ template<typename T>
+ struct always_false : std::false_type {};
+
+ template <typename> struct true_given : std::true_type {};
+ struct is_callable_tester {
+ template <typename Fun, typename... Args>
+ true_given<decltype(std::declval<Fun>()(std::declval<Args>()...))> static test(int);
+ template <typename...>
+ std::false_type static test(...);
+ };
-template <typename> struct true_given : std::true_type {};
-struct is_callable_tester {
- template <typename Fun, typename... Args>
- true_given<decltype(std::declval<Fun>()(std::declval<Args>()...))> static test(int);
- template <typename...>
- std::false_type static test(...);
-};
+ template <typename T>
+ struct is_callable;
-template <typename T>
-struct is_callable;
+ template <typename Fun, typename... Args>
+ struct is_callable<Fun(Args...)> : decltype(is_callable_tester::test<Fun, Args...>(0)) {};
-template <typename Fun, typename... Args>
-struct is_callable<Fun(Args...)> : decltype(is_callable_tester::test<Fun, Args...>(0)) {};
+#if defined(__cpp_lib_is_invocable) && __cpp_lib_is_invocable >= 201703
+ // std::result_of is deprecated in C++17 and removed in C++20. Hence, it is
+ // replaced with std::invoke_result here.
+ template <typename Func, typename... U>
+ using FunctionReturnType = std::remove_reference_t<std::remove_cv_t<std::invoke_result_t<Func, U...>>>;
+#else
+ // Keep ::type here because we still support C++11
+ template <typename Func, typename... U>
+ using FunctionReturnType = typename std::remove_reference<typename std::remove_cv<typename std::result_of<Func(U...)>::type>::type>::type;
+#endif
} // namespace Catch
@@ -1036,21 +1041,24 @@ struct AutoReg : NonCopyable {
///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_TESTCASE2( TestName, ... ) \
static void TestName(); \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( &TestName ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); } /* NOLINT */ \
- CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
static void TestName()
#define INTERNAL_CATCH_TESTCASE( ... ) \
INTERNAL_CATCH_TESTCASE2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), __VA_ARGS__ )
///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_METHOD_AS_TEST_CASE( QualifiedMethod, ... ) \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
namespace{ Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( &QualifiedMethod ), CATCH_INTERNAL_LINEINFO, "&" #QualifiedMethod, Catch::NameAndTags{ __VA_ARGS__ } ); } /* NOLINT */ \
- CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_TEST_CASE_METHOD2( TestName, ClassName, ... )\
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
namespace{ \
struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName) { \
@@ -1058,21 +1066,24 @@ struct AutoReg : NonCopyable {
}; \
Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar ) ( Catch::makeTestInvoker( &TestName::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \
} \
- CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
void TestName::test()
#define INTERNAL_CATCH_TEST_CASE_METHOD( ClassName, ... ) \
INTERNAL_CATCH_TEST_CASE_METHOD2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_S_T____ ), ClassName, __VA_ARGS__ )
///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_REGISTER_TESTCASE( Function, ... ) \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
Catch::AutoReg INTERNAL_CATCH_UNIQUE_NAME( autoRegistrar )( Catch::makeTestInvoker( Function ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ __VA_ARGS__ } ); /* NOLINT */ \
- CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_2(TestName, TestFunc, Name, Tags, Signature, ... )\
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \
+ CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
INTERNAL_CATCH_DECLARE_SIG_TEST(TestFunc, INTERNAL_CATCH_REMOVE_PARENS(Signature));\
namespace {\
namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){\
@@ -1085,7 +1096,7 @@ struct AutoReg : NonCopyable {
int index = 0; \
constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};\
using expander = int[];\
- (void)expander{(reg_test(Types{}, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++, 0)... };/* NOLINT */ \
+ (void)expander{(reg_test(Types{}, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++)... };/* NOLINT */ \
}\
};\
static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\
@@ -1094,8 +1105,7 @@ struct AutoReg : NonCopyable {
}();\
}\
}\
- CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \
- CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS \
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
INTERNAL_CATCH_DEFINE_SIG_TEST(TestFunc,INTERNAL_CATCH_REMOVE_PARENS(Signature))
#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
@@ -1115,8 +1125,10 @@ struct AutoReg : NonCopyable {
#endif
#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE2(TestName, TestFuncName, Name, Tags, Signature, TmplTypes, TypesList) \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \
+ CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
template<typename TestType> static void TestFuncName(); \
namespace {\
namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName) { \
@@ -1130,19 +1142,18 @@ struct AutoReg : NonCopyable {
constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};\
constexpr char const* types_list[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TypesList))};\
constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);\
- (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFuncName<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index / num_types]) + "<" + std::string(types_list[index % num_types]) + ">", Tags } ), index++, 0)... };/* NOLINT */\
+ (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFuncName<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index / num_types]) + "<" + std::string(types_list[index % num_types]) + ">", Tags } ), index++)... };/* NOLINT */\
} \
}; \
static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \
- using TestInit = decltype(create<TestName, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>(TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>{})); \
+ using TestInit = typename create<TestName, decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>()), TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>>::type; \
TestInit t; \
t.reg_tests(); \
return 0; \
}(); \
} \
} \
- CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \
- CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS \
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
template<typename TestType> \
static void TestFuncName()
@@ -1163,7 +1174,9 @@ struct AutoReg : NonCopyable {
#endif
#define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2(TestName, TestFunc, Name, Tags, TmplList)\
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
+ CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
template<typename TestType> static void TestFunc(); \
namespace {\
namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){\
@@ -1173,17 +1186,17 @@ struct AutoReg : NonCopyable {
void reg_tests() { \
int index = 0; \
using expander = int[]; \
- (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFunc<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name " - " + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + " - " + std::to_string(index), Tags } ), index++, 0)... };/* NOLINT */\
+ (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestFunc<Types> ), CATCH_INTERNAL_LINEINFO, Catch::StringRef(), Catch::NameAndTags{ Name " - " + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + " - " + std::to_string(index), Tags } ), index++)... };/* NOLINT */\
} \
};\
static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){ \
- using TestInit = decltype(convert<TestName>(std::declval<TmplList>())); \
+ using TestInit = typename convert<TestName, TmplList>::type; \
TestInit t; \
t.reg_tests(); \
return 0; \
- }(); \
+ }(); \
}}\
- CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
template<typename TestType> \
static void TestFunc()
@@ -1191,8 +1204,10 @@ struct AutoReg : NonCopyable {
INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_2( INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____ ), INTERNAL_CATCH_UNIQUE_NAME( ____C_A_T_C_H____T_E_M_P_L_A_T_E____T_E_S_T____F_U_N_C____ ), Name, Tags, TmplList )
#define INTERNAL_CATCH_TEMPLATE_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, Signature, ... ) \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \
+ CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
namespace {\
namespace INTERNAL_CATCH_MAKE_NAMESPACE(TestName){ \
INTERNAL_CATCH_TYPE_GEN\
@@ -1205,7 +1220,7 @@ struct AutoReg : NonCopyable {
int index = 0; \
constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, __VA_ARGS__)};\
using expander = int[];\
- (void)expander{(reg_test(Types{}, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++, 0)... };/* NOLINT */ \
+ (void)expander{(reg_test(Types{}, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index]), Tags } ), index++)... };/* NOLINT */ \
}\
};\
static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\
@@ -1214,8 +1229,7 @@ struct AutoReg : NonCopyable {
}();\
}\
}\
- CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS\
- CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS\
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
INTERNAL_CATCH_DEFINE_SIG_TEST_METHOD(TestName, INTERNAL_CATCH_REMOVE_PARENS(Signature))
#ifndef CATCH_CONFIG_TRADITIONAL_MSVC_PREPROCESSOR
@@ -1235,8 +1249,10 @@ struct AutoReg : NonCopyable {
#endif
#define INTERNAL_CATCH_TEMPLATE_PRODUCT_TEST_CASE_METHOD_2(TestNameClass, TestName, ClassName, Name, Tags, Signature, TmplTypes, TypesList)\
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
CATCH_INTERNAL_SUPPRESS_ZERO_VARIADIC_WARNINGS \
+ CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
template<typename TestType> \
struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName <TestType>) { \
void test();\
@@ -1253,19 +1269,18 @@ struct AutoReg : NonCopyable {
constexpr char const* tmpl_types[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes))};\
constexpr char const* types_list[] = {CATCH_REC_LIST(INTERNAL_CATCH_STRINGIZE_WITHOUT_PARENS, INTERNAL_CATCH_REMOVE_PARENS(TypesList))};\
constexpr auto num_types = sizeof(types_list) / sizeof(types_list[0]);\
- (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index / num_types]) + "<" + std::string(types_list[index % num_types]) + ">", Tags } ), index++, 0)... };/* NOLINT */ \
+ (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name " - " + std::string(tmpl_types[index / num_types]) + "<" + std::string(types_list[index % num_types]) + ">", Tags } ), index++)... };/* NOLINT */ \
}\
};\
static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\
- using TestInit = decltype(create<TestNameClass, INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>(TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>{}));\
+ using TestInit = typename create<TestNameClass, decltype(get_wrapper<INTERNAL_CATCH_REMOVE_PARENS(TmplTypes)>()), TypeList<INTERNAL_CATCH_MAKE_TYPE_LISTS_FROM_TYPES(INTERNAL_CATCH_REMOVE_PARENS(TypesList))>>::type;\
TestInit t;\
t.reg_tests();\
return 0;\
}(); \
}\
}\
- CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \
- CATCH_INTERNAL_UNSUPPRESS_ZERO_VARIADIC_WARNINGS \
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
template<typename TestType> \
void TestName<TestType>::test()
@@ -1286,7 +1301,9 @@ struct AutoReg : NonCopyable {
#endif
#define INTERNAL_CATCH_TEMPLATE_LIST_TEST_CASE_METHOD_2( TestNameClass, TestName, ClassName, Name, Tags, TmplList) \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
+ CATCH_INTERNAL_SUPPRESS_UNUSED_TEMPLATE_WARNINGS \
template<typename TestType> \
struct TestName : INTERNAL_CATCH_REMOVE_PARENS(ClassName <TestType>) { \
void test();\
@@ -1299,17 +1316,17 @@ struct AutoReg : NonCopyable {
void reg_tests(){\
int index = 0;\
using expander = int[];\
- (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name " - " + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + " - " + std::to_string(index), Tags } ), index++, 0)... };/* NOLINT */ \
+ (void)expander{(Catch::AutoReg( Catch::makeTestInvoker( &TestName<Types>::test ), CATCH_INTERNAL_LINEINFO, #ClassName, Catch::NameAndTags{ Name " - " + std::string(INTERNAL_CATCH_STRINGIZE(TmplList)) + " - " + std::to_string(index), Tags } ), index++)... };/* NOLINT */ \
}\
};\
static int INTERNAL_CATCH_UNIQUE_NAME( globalRegistrar ) = [](){\
- using TestInit = decltype(convert<TestNameClass>(std::declval<TmplList>()));\
+ using TestInit = typename convert<TestNameClass, TmplList>::type;\
TestInit t;\
t.reg_tests();\
return 0;\
}(); \
}}\
- CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
template<typename TestType> \
void TestName<TestType>::test()
@@ -1415,7 +1432,7 @@ namespace Catch {
auto makeStream( StringRef const &filename ) -> IStream const*;
- class ReusableStringStream {
+ class ReusableStringStream : NonCopyable {
std::size_t m_index;
std::ostream* m_oss;
public:
@@ -1443,7 +1460,7 @@ namespace Catch {
namespace Detail {
struct EnumInfo {
StringRef m_name;
- std::vector<std::pair<int, std::string>> m_values;
+ std::vector<std::pair<int, StringRef>> m_values;
~EnumInfo();
@@ -1458,6 +1475,7 @@ namespace Catch {
template<typename E>
Detail::EnumInfo const& registerEnum( StringRef enumName, StringRef allEnums, std::initializer_list<E> values ) {
+ static_assert(sizeof(int) >= sizeof(E), "Cannot serialize enum to int");
std::vector<int> intValues;
intValues.reserve( values.size() );
for( auto enumValue : values )
@@ -1539,9 +1557,9 @@ namespace Catch {
template<typename T>
class IsStreamInsertable {
- template<typename SS, typename TT>
+ template<typename Stream, typename U>
static auto test(int)
- -> decltype(std::declval<SS&>() << std::declval<TT>(), std::true_type());
+ -> decltype(std::declval<Stream&>() << std::declval<U>(), std::true_type());
template<typename, typename>
static auto test(...)->std::false_type;
@@ -1802,8 +1820,8 @@ namespace Catch {
#endif
namespace Detail {
- template<typename InputIterator>
- std::string rangeToString(InputIterator first, InputIterator last) {
+ template<typename InputIterator, typename Sentinel = InputIterator>
+ std::string rangeToString(InputIterator first, Sentinel last) {
ReusableStringStream rss;
rss << "{ ";
if (first != last) {
@@ -1961,20 +1979,27 @@ namespace Catch {
#endif // CATCH_CONFIG_ENABLE_VARIANT_STRINGMAKER
namespace Catch {
- struct not_this_one {}; // Tag type for detecting which begin/ end are being selected
-
- // Import begin/ end from std here so they are considered alongside the fallback (...) overloads in this namespace
+ // Import begin/ end from std here
using std::begin;
using std::end;
- not_this_one begin( ... );
- not_this_one end( ... );
+ namespace detail {
+ template <typename...>
+ struct void_type {
+ using type = void;
+ };
+
+ template <typename T, typename = void>
+ struct is_range_impl : std::false_type {
+ };
+
+ template <typename T>
+ struct is_range_impl<T, typename void_type<decltype(begin(std::declval<T>()))>::type> : std::true_type {
+ };
+ } // namespace detail
template <typename T>
- struct is_range {
- static const bool value =
- !std::is_same<decltype(begin(std::declval<T>())), not_this_one>::value &&
- !std::is_same<decltype(end(std::declval<T>())), not_this_one>::value;
+ struct is_range : detail::is_range_impl<T> {
};
#if defined(_MANAGED) // Managed types are never ranges
@@ -2144,7 +2169,7 @@ namespace Catch { \
template<> struct StringMaker<enumName> { \
static std::string convert( enumName value ) { \
static const auto& enumInfo = ::Catch::getMutableRegistryHub().getMutableEnumValuesRegistry().registerEnum( #enumName, #__VA_ARGS__, { __VA_ARGS__ } ); \
- return enumInfo.lookup( static_cast<int>( value ) ); \
+ return static_cast<std::string>(enumInfo.lookup( static_cast<int>( value ) )); \
} \
}; \
}
@@ -2342,6 +2367,18 @@ namespace Catch {
auto operator <= ( RhsT const& rhs ) -> BinaryExpr<LhsT, RhsT const&> const {
return { static_cast<bool>(m_lhs <= rhs), m_lhs, "<=", rhs };
}
+ template <typename RhsT>
+ auto operator | (RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {
+ return { static_cast<bool>(m_lhs | rhs), m_lhs, "|", rhs };
+ }
+ template <typename RhsT>
+ auto operator & (RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {
+ return { static_cast<bool>(m_lhs & rhs), m_lhs, "&", rhs };
+ }
+ template <typename RhsT>
+ auto operator ^ (RhsT const& rhs) -> BinaryExpr<LhsT, RhsT const&> const {
+ return { static_cast<bool>(m_lhs ^ rhs), m_lhs, "^", rhs };
+ }
template<typename RhsT>
auto operator && ( RhsT const& ) -> BinaryExpr<LhsT, RhsT const&> const {
@@ -2422,7 +2459,7 @@ namespace Catch {
virtual void sectionEnded( SectionEndInfo const& endInfo ) = 0;
virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) = 0;
- virtual auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& = 0;
+ virtual auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& = 0;
#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
virtual void benchmarkPreparing( std::string const& name ) = 0;
@@ -2660,15 +2697,16 @@ namespace Catch {
///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_TEST( macroName, resultDisposition, ... ) \
do { \
+ CATCH_INTERNAL_IGNORE_BUT_WARN(__VA_ARGS__); \
Catch::AssertionHandler catchAssertionHandler( macroName##_catch_sr, CATCH_INTERNAL_LINEINFO, CATCH_INTERNAL_STRINGIFY(__VA_ARGS__), resultDisposition ); \
INTERNAL_CATCH_TRY { \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
CATCH_INTERNAL_SUPPRESS_PARENTHESES_WARNINGS \
catchAssertionHandler.handleExpr( Catch::Decomposer() <= __VA_ARGS__ ); \
- CATCH_INTERNAL_UNSUPPRESS_PARENTHESES_WARNINGS \
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
} INTERNAL_CATCH_CATCH( catchAssertionHandler ) \
INTERNAL_CATCH_REACT( catchAssertionHandler ) \
- } while( (void)0, (false) && static_cast<bool>( !!(__VA_ARGS__) ) ) // the expression here is never evaluated at runtime but it forces the compiler to give it a look
- // The double negation silences MSVC's C4800 warning, the static_cast forces short-circuit evaluation if the type has overloaded &&.
+ } while( (void)0, (false) && static_cast<bool>( !!(__VA_ARGS__) ) )
///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_IF( macroName, resultDisposition, ... ) \
@@ -2885,14 +2923,16 @@ namespace Catch {
} // end namespace Catch
#define INTERNAL_CATCH_SECTION( ... ) \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \
if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, __VA_ARGS__ ) ) \
- CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
#define INTERNAL_CATCH_DYNAMIC_SECTION( ... ) \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
CATCH_INTERNAL_SUPPRESS_UNUSED_WARNINGS \
if( Catch::Section const& INTERNAL_CATCH_UNIQUE_NAME( catch_internal_Section ) = Catch::SectionInfo( CATCH_INTERNAL_LINEINFO, (Catch::ReusableStringStream() << __VA_ARGS__).str() ) ) \
- CATCH_INTERNAL_UNSUPPRESS_UNUSED_WARNINGS
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
// end catch_section.h
// start catch_interfaces_exception.h
@@ -2983,6 +3023,9 @@ namespace Catch {
{}
std::string translate( ExceptionTranslators::const_iterator it, ExceptionTranslators::const_iterator itEnd ) const override {
+#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
+ return "";
+#else
try {
if( it == itEnd )
std::rethrow_exception(std::current_exception());
@@ -2992,6 +3035,7 @@ namespace Catch {
catch( T& ex ) {
return m_translateFunction( ex );
}
+#endif
}
protected:
@@ -3010,9 +3054,10 @@ namespace Catch {
///////////////////////////////////////////////////////////////////////////////
#define INTERNAL_CATCH_TRANSLATE_EXCEPTION2( translatorName, signature ) \
static std::string translatorName( signature ); \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
namespace{ Catch::ExceptionTranslatorRegistrar INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionRegistrar )( &translatorName ); } \
- CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS \
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION \
static std::string translatorName( signature )
#define INTERNAL_CATCH_TRANSLATE_EXCEPTION( signature ) INTERNAL_CATCH_TRANSLATE_EXCEPTION2( INTERNAL_CATCH_UNIQUE_NAME( catch_internal_ExceptionTranslator ), signature )
@@ -3154,7 +3199,10 @@ namespace Catch {
bool contains( std::string const& s, std::string const& infix );
void toLowerInPlace( std::string& s );
std::string toLower( std::string const& s );
+ //! Returns a new string without whitespace at the start/end
std::string trim( std::string const& str );
+ //! Returns a substring of the original ref without whitespace. Beware lifetimes!
+ StringRef trim(StringRef ref);
// !!! Be aware, returns refs into original string - make sure original string outlives them
std::vector<StringRef> splitStringRef( StringRef str, char delimiter );
@@ -3256,9 +3304,10 @@ namespace Matchers {
return description;
}
- MatchAllOf<ArgT>& operator && ( MatcherBase<ArgT> const& other ) {
- m_matchers.push_back( &other );
- return *this;
+ MatchAllOf<ArgT> operator && ( MatcherBase<ArgT> const& other ) {
+ auto copy(*this);
+ copy.m_matchers.push_back( &other );
+ return copy;
}
std::vector<MatcherBase<ArgT> const*> m_matchers;
@@ -3289,9 +3338,10 @@ namespace Matchers {
return description;
}
- MatchAnyOf<ArgT>& operator || ( MatcherBase<ArgT> const& other ) {
- m_matchers.push_back( &other );
- return *this;
+ MatchAnyOf<ArgT> operator || ( MatcherBase<ArgT> const& other ) {
+ auto copy(*this);
+ copy.m_matchers.push_back( &other );
+ return copy;
}
std::vector<MatcherBase<ArgT> const*> m_matchers;
@@ -3335,10 +3385,34 @@ using Matchers::Impl::MatcherBase;
} // namespace Catch
// end catch_matchers.h
-// start catch_matchers_floating.h
+// start catch_matchers_exception.hpp
-#include <type_traits>
-#include <cmath>
+namespace Catch {
+namespace Matchers {
+namespace Exception {
+
+class ExceptionMessageMatcher : public MatcherBase<std::exception> {
+ std::string m_message;
+public:
+
+ ExceptionMessageMatcher(std::string const& message):
+ m_message(message)
+ {}
+
+ bool match(std::exception const& ex) const override;
+
+ std::string describe() const override;
+};
+
+} // namespace Exception
+
+Exception::ExceptionMessageMatcher Message(std::string const& message);
+
+} // namespace Matchers
+} // namespace Catch
+
+// end catch_matchers_exception.hpp
+// start catch_matchers_floating.h
namespace Catch {
namespace Matchers {
@@ -3357,22 +3431,43 @@ namespace Matchers {
};
struct WithinUlpsMatcher : MatcherBase<double> {
- WithinUlpsMatcher(double target, int ulps, FloatingPointKind baseType);
+ WithinUlpsMatcher(double target, uint64_t ulps, FloatingPointKind baseType);
bool match(double const& matchee) const override;
std::string describe() const override;
private:
double m_target;
- int m_ulps;
+ uint64_t m_ulps;
FloatingPointKind m_type;
};
+ // Given IEEE-754 format for floats and doubles, we can assume
+ // that float -> double promotion is lossless. Given this, we can
+ // assume that if we do the standard relative comparison of
+ // |lhs - rhs| <= epsilon * max(fabs(lhs), fabs(rhs)), then we get
+ // the same result if we do this for floats, as if we do this for
+ // doubles that were promoted from floats.
+ struct WithinRelMatcher : MatcherBase<double> {
+ WithinRelMatcher(double target, double epsilon);
+ bool match(double const& matchee) const override;
+ std::string describe() const override;
+ private:
+ double m_target;
+ double m_epsilon;
+ };
+
} // namespace Floating
// The following functions create the actual matcher objects.
// This allows the types to be inferred
- Floating::WithinUlpsMatcher WithinULP(double target, int maxUlpDiff);
- Floating::WithinUlpsMatcher WithinULP(float target, int maxUlpDiff);
+ Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlpDiff);
+ Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpDiff);
Floating::WithinAbsMatcher WithinAbs(double target, double margin);
+ Floating::WithinRelMatcher WithinRel(double target, double eps);
+ // defaults epsilon to 100*numeric_limits<double>::epsilon()
+ Floating::WithinRelMatcher WithinRel(double target);
+ Floating::WithinRelMatcher WithinRel(float target, float eps);
+ // defaults epsilon to 100*numeric_limits<float>::epsilon()
+ Floating::WithinRelMatcher WithinRel(float target);
} // namespace Matchers
} // namespace Catch
@@ -3503,12 +3598,12 @@ namespace Catch {
namespace Matchers {
namespace Vector {
- template<typename T>
- struct ContainsElementMatcher : MatcherBase<std::vector<T>> {
+ template<typename T, typename Alloc>
+ struct ContainsElementMatcher : MatcherBase<std::vector<T, Alloc>> {
ContainsElementMatcher(T const &comparator) : m_comparator( comparator) {}
- bool match(std::vector<T> const &v) const override {
+ bool match(std::vector<T, Alloc> const &v) const override {
for (auto const& el : v) {
if (el == m_comparator) {
return true;
@@ -3524,12 +3619,12 @@ namespace Matchers {
T const& m_comparator;
};
- template<typename T>
- struct ContainsMatcher : MatcherBase<std::vector<T>> {
+ template<typename T, typename AllocComp, typename AllocMatch>
+ struct ContainsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
- ContainsMatcher(std::vector<T> const &comparator) : m_comparator( comparator ) {}
+ ContainsMatcher(std::vector<T, AllocComp> const &comparator) : m_comparator( comparator ) {}
- bool match(std::vector<T> const &v) const override {
+ bool match(std::vector<T, AllocMatch> const &v) const override {
// !TBD: see note in EqualsMatcher
if (m_comparator.size() > v.size())
return false;
@@ -3551,18 +3646,18 @@ namespace Matchers {
return "Contains: " + ::Catch::Detail::stringify( m_comparator );
}
- std::vector<T> const& m_comparator;
+ std::vector<T, AllocComp> const& m_comparator;
};
- template<typename T>
- struct EqualsMatcher : MatcherBase<std::vector<T>> {
+ template<typename T, typename AllocComp, typename AllocMatch>
+ struct EqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
- EqualsMatcher(std::vector<T> const &comparator) : m_comparator( comparator ) {}
+ EqualsMatcher(std::vector<T, AllocComp> const &comparator) : m_comparator( comparator ) {}
- bool match(std::vector<T> const &v) const override {
+ bool match(std::vector<T, AllocMatch> const &v) const override {
// !TBD: This currently works if all elements can be compared using !=
// - a more general approach would be via a compare template that defaults
- // to using !=. but could be specialised for, e.g. std::vector<T> etc
+ // to using !=. but could be specialised for, e.g. std::vector<T, Alloc> etc
// - then just call that directly
if (m_comparator.size() != v.size())
return false;
@@ -3574,15 +3669,15 @@ namespace Matchers {
std::string describe() const override {
return "Equals: " + ::Catch::Detail::stringify( m_comparator );
}
- std::vector<T> const& m_comparator;
+ std::vector<T, AllocComp> const& m_comparator;
};
- template<typename T>
- struct ApproxMatcher : MatcherBase<std::vector<T>> {
+ template<typename T, typename AllocComp, typename AllocMatch>
+ struct ApproxMatcher : MatcherBase<std::vector<T, AllocMatch>> {
- ApproxMatcher(std::vector<T> const& comparator) : m_comparator( comparator ) {}
+ ApproxMatcher(std::vector<T, AllocComp> const& comparator) : m_comparator( comparator ) {}
- bool match(std::vector<T> const &v) const override {
+ bool match(std::vector<T, AllocMatch> const &v) const override {
if (m_comparator.size() != v.size())
return false;
for (std::size_t i = 0; i < v.size(); ++i)
@@ -3609,16 +3704,14 @@ namespace Matchers {
return *this;
}
- std::vector<T> const& m_comparator;
+ std::vector<T, AllocComp> const& m_comparator;
mutable Catch::Detail::Approx approx = Catch::Detail::Approx::custom();
};
- template<typename T>
- struct UnorderedEqualsMatcher : MatcherBase<std::vector<T>> {
- UnorderedEqualsMatcher(std::vector<T> const& target) : m_target(target) {}
- bool match(std::vector<T> const& vec) const override {
- // Note: This is a reimplementation of std::is_permutation,
- // because I don't want to include <algorithm> inside the common path
+ template<typename T, typename AllocComp, typename AllocMatch>
+ struct UnorderedEqualsMatcher : MatcherBase<std::vector<T, AllocMatch>> {
+ UnorderedEqualsMatcher(std::vector<T, AllocComp> const& target) : m_target(target) {}
+ bool match(std::vector<T, AllocMatch> const& vec) const override {
if (m_target.size() != vec.size()) {
return false;
}
@@ -3629,7 +3722,7 @@ namespace Matchers {
return "UnorderedEquals: " + ::Catch::Detail::stringify(m_target);
}
private:
- std::vector<T> const& m_target;
+ std::vector<T, AllocComp> const& m_target;
};
} // namespace Vector
@@ -3637,29 +3730,29 @@ namespace Matchers {
// The following functions create the actual matcher objects.
// This allows the types to be inferred
- template<typename T>
- Vector::ContainsMatcher<T> Contains( std::vector<T> const& comparator ) {
- return Vector::ContainsMatcher<T>( comparator );
+ template<typename T, typename AllocComp = std::allocator<T>, typename AllocMatch = AllocComp>
+ Vector::ContainsMatcher<T, AllocComp, AllocMatch> Contains( std::vector<T, AllocComp> const& comparator ) {
+ return Vector::ContainsMatcher<T, AllocComp, AllocMatch>( comparator );
}
- template<typename T>
- Vector::ContainsElementMatcher<T> VectorContains( T const& comparator ) {
- return Vector::ContainsElementMatcher<T>( comparator );
+ template<typename T, typename Alloc = std::allocator<T>>
+ Vector::ContainsElementMatcher<T, Alloc> VectorContains( T const& comparator ) {
+ return Vector::ContainsElementMatcher<T, Alloc>( comparator );
}
- template<typename T>
- Vector::EqualsMatcher<T> Equals( std::vector<T> const& comparator ) {
- return Vector::EqualsMatcher<T>( comparator );
+ template<typename T, typename AllocComp = std::allocator<T>, typename AllocMatch = AllocComp>
+ Vector::EqualsMatcher<T, AllocComp, AllocMatch> Equals( std::vector<T, AllocComp> const& comparator ) {
+ return Vector::EqualsMatcher<T, AllocComp, AllocMatch>( comparator );
}
- template<typename T>
- Vector::ApproxMatcher<T> Approx( std::vector<T> const& comparator ) {
- return Vector::ApproxMatcher<T>( comparator );
+ template<typename T, typename AllocComp = std::allocator<T>, typename AllocMatch = AllocComp>
+ Vector::ApproxMatcher<T, AllocComp, AllocMatch> Approx( std::vector<T, AllocComp> const& comparator ) {
+ return Vector::ApproxMatcher<T, AllocComp, AllocMatch>( comparator );
}
- template<typename T>
- Vector::UnorderedEqualsMatcher<T> UnorderedEquals(std::vector<T> const& target) {
- return Vector::UnorderedEqualsMatcher<T>(target);
+ template<typename T, typename AllocComp = std::allocator<T>, typename AllocMatch = AllocComp>
+ Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch> UnorderedEquals(std::vector<T, AllocComp> const& target) {
+ return Vector::UnorderedEqualsMatcher<T, AllocComp, AllocMatch>( target );
}
} // namespace Matchers
@@ -3797,13 +3890,13 @@ namespace Catch {
(Catch::ReusableStringStream() << __VA_ARGS__).str()
#define CATCH_INTERNAL_ERROR(...) \
- Catch::throw_logic_error(CATCH_MAKE_MSG( CATCH_INTERNAL_LINEINFO << ": Internal Catch2 error: " << __VA_ARGS__));
+ Catch::throw_logic_error(CATCH_MAKE_MSG( CATCH_INTERNAL_LINEINFO << ": Internal Catch2 error: " << __VA_ARGS__))
#define CATCH_ERROR(...) \
- Catch::throw_domain_error(CATCH_MAKE_MSG( __VA_ARGS__ ));
+ Catch::throw_domain_error(CATCH_MAKE_MSG( __VA_ARGS__ ))
#define CATCH_RUNTIME_ERROR(...) \
- Catch::throw_runtime_error(CATCH_MAKE_MSG( __VA_ARGS__ ));
+ Catch::throw_runtime_error(CATCH_MAKE_MSG( __VA_ARGS__ ))
#define CATCH_ENFORCE( condition, ... ) \
do{ if( !(condition) ) CATCH_ERROR( __VA_ARGS__ ); } while(false)
@@ -3855,7 +3948,6 @@ namespace Generators {
class SingleValueGenerator final : public IGenerator<T> {
T m_value;
public:
- SingleValueGenerator(T const& value) : m_value( value ) {}
SingleValueGenerator(T&& value) : m_value(std::move(value)) {}
T const& get() const override {
@@ -3869,7 +3961,7 @@ namespace Generators {
template<typename T>
class FixedValuesGenerator final : public IGenerator<T> {
static_assert(!std::is_same<T, bool>::value,
- "ValuesGenerator does not support bools because of std::vector<bool>"
+ "FixedValuesGenerator does not support bools because of std::vector<bool>"
"specialization, use SingleValue Generator instead.");
std::vector<T> m_values;
size_t m_idx = 0;
@@ -3918,21 +4010,21 @@ namespace Generators {
m_generators.emplace_back(std::move(generator));
}
void populate(T&& val) {
- m_generators.emplace_back(value(std::move(val)));
+ m_generators.emplace_back(value(std::forward<T>(val)));
}
template<typename U>
void populate(U&& val) {
- populate(T(std::move(val)));
+ populate(T(std::forward<U>(val)));
}
template<typename U, typename... Gs>
- void populate(U&& valueOrGenerator, Gs... moreGenerators) {
+ void populate(U&& valueOrGenerator, Gs &&... moreGenerators) {
populate(std::forward<U>(valueOrGenerator));
populate(std::forward<Gs>(moreGenerators)...);
}
public:
template <typename... Gs>
- Generators(Gs... moreGenerators) {
+ Generators(Gs &&... moreGenerators) {
m_generators.reserve(sizeof...(Gs));
populate(std::forward<Gs>(moreGenerators)...);
}
@@ -3963,7 +4055,7 @@ namespace Generators {
struct as {};
template<typename T, typename... Gs>
- auto makeGenerators( GeneratorWrapper<T>&& generator, Gs... moreGenerators ) -> Generators<T> {
+ auto makeGenerators( GeneratorWrapper<T>&& generator, Gs &&... moreGenerators ) -> Generators<T> {
return Generators<T>(std::move(generator), std::forward<Gs>(moreGenerators)...);
}
template<typename T>
@@ -3971,24 +4063,24 @@ namespace Generators {
return Generators<T>(std::move(generator));
}
template<typename T, typename... Gs>
- auto makeGenerators( T&& val, Gs... moreGenerators ) -> Generators<T> {
+ auto makeGenerators( T&& val, Gs &&... moreGenerators ) -> Generators<T> {
return makeGenerators( value( std::forward<T>( val ) ), std::forward<Gs>( moreGenerators )... );
}
template<typename T, typename U, typename... Gs>
- auto makeGenerators( as<T>, U&& val, Gs... moreGenerators ) -> Generators<T> {
+ auto makeGenerators( as<T>, U&& val, Gs &&... moreGenerators ) -> Generators<T> {
return makeGenerators( value( T( std::forward<U>( val ) ) ), std::forward<Gs>( moreGenerators )... );
}
- auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker&;
+ auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker&;
template<typename L>
// Note: The type after -> is weird, because VS2015 cannot parse
// the expression used in the typedef inside, when it is in
// return type. Yeah.
- auto generate( SourceLineInfo const& lineInfo, L const& generatorExpression ) -> decltype(std::declval<decltype(generatorExpression())>().get()) {
+ auto generate( StringRef generatorName, SourceLineInfo const& lineInfo, L const& generatorExpression ) -> decltype(std::declval<decltype(generatorExpression())>().get()) {
using UnderlyingType = typename decltype(generatorExpression())::type;
- IGeneratorTracker& tracker = acquireGeneratorTracker( lineInfo );
+ IGeneratorTracker& tracker = acquireGeneratorTracker( generatorName, lineInfo );
if (!tracker.hasGenerator()) {
tracker.setGenerator(pf::make_unique<Generators<UnderlyingType>>(generatorExpression()));
}
@@ -4001,11 +4093,17 @@ namespace Generators {
} // namespace Catch
#define GENERATE( ... ) \
- Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [ ]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } )
+ Catch::Generators::generate( INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)), \
+ CATCH_INTERNAL_LINEINFO, \
+ [ ]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace)
#define GENERATE_COPY( ... ) \
- Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [=]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } )
+ Catch::Generators::generate( INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)), \
+ CATCH_INTERNAL_LINEINFO, \
+ [=]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace)
#define GENERATE_REF( ... ) \
- Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [&]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } )
+ Catch::Generators::generate( INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)), \
+ CATCH_INTERNAL_LINEINFO, \
+ [&]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace)
// end catch_generators.hpp
// start catch_generators_generic.hpp
@@ -4171,18 +4269,7 @@ namespace Generators {
}
};
-#if defined(__cpp_lib_is_invocable) && __cpp_lib_is_invocable >= 201703
- // std::result_of is deprecated in C++17 and removed in C++20. Hence, it is
- // replaced with std::invoke_result here. Also *_t format is preferred over
- // typename *::type format.
- template <typename Func, typename U>
- using MapFunctionReturnType = std::remove_reference_t<std::remove_cv_t<std::invoke_result_t<Func, U>>>;
-#else
- template <typename Func, typename U>
- using MapFunctionReturnType = typename std::remove_reference<typename std::remove_cv<typename std::result_of<Func(U)>::type>::type>::type;
-#endif
-
- template <typename Func, typename U, typename T = MapFunctionReturnType<Func, U>>
+ template <typename Func, typename U, typename T = FunctionReturnType<Func, U>>
GeneratorWrapper<T> map(Func&& function, GeneratorWrapper<U>&& generator) {
return GeneratorWrapper<T>(
pf::make_unique<MapGenerator<T, U, Func>>(std::forward<Func>(function), std::move(generator))
@@ -4285,6 +4372,7 @@ namespace Catch {
{
if( !IMutableContext::currentContext )
IMutableContext::createContext();
+ // NOLINTNEXTLINE(clang-analyzer-core.uninitialized.UndefReturn)
return *IMutableContext::currentContext;
}
@@ -4294,6 +4382,9 @@ namespace Catch {
}
void cleanUpContext();
+
+ class SimplePcg32;
+ SimplePcg32& rng();
}
// end catch_context.h
@@ -4364,6 +4455,7 @@ namespace Catch {
} // end namespace Catch
// end catch_option.hpp
+#include <chrono>
#include <iosfwd>
#include <string>
#include <vector>
@@ -4421,6 +4513,7 @@ namespace Catch {
virtual int abortAfter() const = 0;
virtual bool showInvisibles() const = 0;
virtual ShowDurations::OrNot showDurations() const = 0;
+ virtual double minDuration() const = 0;
virtual TestSpec const& testSpec() const = 0;
virtual bool hasTestFilters() const = 0;
virtual std::vector<std::string> const& getTestsOrTags() const = 0;
@@ -4434,12 +4527,63 @@ namespace Catch {
virtual int benchmarkSamples() const = 0;
virtual double benchmarkConfidenceInterval() const = 0;
virtual unsigned int benchmarkResamples() const = 0;
+ virtual std::chrono::milliseconds benchmarkWarmupTime() const = 0;
};
using IConfigPtr = std::shared_ptr<IConfig const>;
}
// end catch_interfaces_config.h
+// start catch_random_number_generator.h
+
+#include <cstdint>
+
+namespace Catch {
+
+ // This is a simple implementation of C++11 Uniform Random Number
+ // Generator. It does not provide all operators, because Catch2
+ // does not use it, but it should behave as expected inside stdlib's
+ // distributions.
+ // The implementation is based on the PCG family (http://pcg-random.org)
+ class SimplePcg32 {
+ using state_type = std::uint64_t;
+ public:
+ using result_type = std::uint32_t;
+ static constexpr result_type (min)() {
+ return 0;
+ }
+ static constexpr result_type (max)() {
+ return static_cast<result_type>(-1);
+ }
+
+ // Provide some default initial state for the default constructor
+ SimplePcg32():SimplePcg32(0xed743cc4U) {}
+
+ explicit SimplePcg32(result_type seed_);
+
+ void seed(result_type seed_);
+ void discard(uint64_t skip);
+
+ result_type operator()();
+
+ private:
+ friend bool operator==(SimplePcg32 const& lhs, SimplePcg32 const& rhs);
+ friend bool operator!=(SimplePcg32 const& lhs, SimplePcg32 const& rhs);
+
+ // In theory we also need operator<< and operator>>
+ // In practice we do not use them, so we will skip them for now
+
+ std::uint64_t m_state;
+ // This part of the state determines which "stream" of the numbers
+ // is chosen -- we take it as a constant for Catch2, so we only
+ // need to deal with seeding the main state.
+ // Picked by reading 8 bytes from `/dev/random` :-)
+ static const std::uint64_t s_inc = (0x13ed0cc53f939476ULL << 1ULL) | 1ULL;
+ };
+
+} // end namespace Catch
+
+// end catch_random_number_generator.h
#include <random>
namespace Catch {
@@ -4447,14 +4591,13 @@ namespace Generators {
template <typename Float>
class RandomFloatingGenerator final : public IGenerator<Float> {
- // FIXME: What is the right seed?
- std::minstd_rand m_rand;
+ Catch::SimplePcg32& m_rng;
std::uniform_real_distribution<Float> m_dist;
Float m_current_number;
public:
RandomFloatingGenerator(Float a, Float b):
- m_rand(getCurrentContext().getConfig()->rngSeed()),
+ m_rng(rng()),
m_dist(a, b) {
static_cast<void>(next());
}
@@ -4463,20 +4606,20 @@ public:
return m_current_number;
}
bool next() override {
- m_current_number = m_dist(m_rand);
+ m_current_number = m_dist(m_rng);
return true;
}
};
template <typename Integer>
class RandomIntegerGenerator final : public IGenerator<Integer> {
- std::minstd_rand m_rand;
+ Catch::SimplePcg32& m_rng;
std::uniform_int_distribution<Integer> m_dist;
Integer m_current_number;
public:
RandomIntegerGenerator(Integer a, Integer b):
- m_rand(getCurrentContext().getConfig()->rngSeed()),
+ m_rng(rng()),
m_dist(a, b) {
static_cast<void>(next());
}
@@ -4485,7 +4628,7 @@ public:
return m_current_number;
}
bool next() override {
- m_current_number = m_dist(m_rand);
+ m_current_number = m_dist(m_rng);
return true;
}
};
@@ -4545,7 +4688,7 @@ public:
template <typename T>
GeneratorWrapper<T> range(T const& start, T const& end, T const& step) {
- static_assert(std::is_integral<T>::value && !std::is_same<T, bool>::value, "Type must be an integer");
+ static_assert(std::is_arithmetic<T>::value && !std::is_same<T, bool>::value, "Type must be numeric");
return GeneratorWrapper<T>(pf::make_unique<RangeGenerator<T>>(start, end, step));
}
@@ -4555,6 +4698,45 @@ GeneratorWrapper<T> range(T const& start, T const& end) {
return GeneratorWrapper<T>(pf::make_unique<RangeGenerator<T>>(start, end));
}
+template <typename T>
+class IteratorGenerator final : public IGenerator<T> {
+ static_assert(!std::is_same<T, bool>::value,
+ "IteratorGenerator currently does not support bools"
+ "because of std::vector<bool> specialization");
+
+ std::vector<T> m_elems;
+ size_t m_current = 0;
+public:
+ template <typename InputIterator, typename InputSentinel>
+ IteratorGenerator(InputIterator first, InputSentinel last):m_elems(first, last) {
+ if (m_elems.empty()) {
+ Catch::throw_exception(GeneratorException("IteratorGenerator received no valid values"));
+ }
+ }
+
+ T const& get() const override {
+ return m_elems[m_current];
+ }
+
+ bool next() override {
+ ++m_current;
+ return m_current != m_elems.size();
+ }
+};
+
+template <typename InputIterator,
+ typename InputSentinel,
+ typename ResultType = typename std::iterator_traits<InputIterator>::value_type>
+GeneratorWrapper<ResultType> from_range(InputIterator from, InputSentinel to) {
+ return GeneratorWrapper<ResultType>(pf::make_unique<IteratorGenerator<ResultType>>(from, to));
+}
+
+template <typename Container,
+ typename ResultType = typename Container::value_type>
+GeneratorWrapper<ResultType> from_range(Container const& cnt) {
+ return GeneratorWrapper<ResultType>(pf::make_unique<IteratorGenerator<ResultType>>(cnt.begin(), cnt.end()));
+}
+
} // namespace Generators
} // namespace Catch
@@ -4900,7 +5082,7 @@ namespace Catch
virtual bool matches( std::string const& str ) const;
private:
- std::string adjustCase( std::string const& str ) const;
+ std::string normaliseString( std::string const& str ) const;
CaseSensitive::Choice m_caseSensitivity;
WildcardPosition m_wildcard = NoWildcard;
std::string m_pattern;
@@ -4965,14 +5147,16 @@ namespace Catch {
std::vector<TestCase const*> tests;
};
using Matches = std::vector<FilterMatch>;
+ using vectorStrings = std::vector<std::string>;
bool hasFilters() const;
bool matches( TestCaseInfo const& testCase ) const;
Matches matchesByFilter( std::vector<TestCase> const& testCases, IConfig const& config ) const;
+ const vectorStrings & getInvalidArgs() const;
private:
std::vector<Filter> m_filters;
-
+ std::vector<std::string> m_invalidArgs;
friend class TestSpecParser;
};
}
@@ -5007,8 +5191,10 @@ namespace Catch {
class TestSpecParser {
enum Mode{ None, Name, QuotedName, Tag, EscapedName };
Mode m_mode = None;
+ Mode lastMode = None;
bool m_exclusion = false;
std::size_t m_pos = 0;
+ std::size_t m_realPatternPos = 0;
std::string m_arg;
std::string m_substring;
std::string m_patternName;
@@ -5024,7 +5210,7 @@ namespace Catch {
TestSpec testSpec();
private:
- void visitChar( char c );
+ bool visitChar( char c );
void startNewMode( Mode mode );
bool processNoneChar( char c );
void processNameChar( char c );
@@ -5032,30 +5218,24 @@ namespace Catch {
void endMode();
void escape();
bool isControlChar( char c ) const;
+ void saveLastMode();
+ void revertBackToLastMode();
+ void addFilter();
+ bool separate();
- template<typename T>
- void addPattern() {
- std::string token = m_patternName;
- for( std::size_t i = 0; i < m_escapeChars.size(); ++i )
- token = token.substr( 0, m_escapeChars[i] - i ) + token.substr( m_escapeChars[i] -i +1 );
- m_escapeChars.clear();
- if( startsWith( token, "exclude:" ) ) {
- m_exclusion = true;
- token = token.substr( 8 );
- }
- if( !token.empty() ) {
- TestSpec::PatternPtr pattern = std::make_shared<T>( token, m_substring );
- if( m_exclusion )
- pattern = std::make_shared<TestSpec::ExcludedPattern>( pattern );
- m_currentFilter.m_patterns.push_back( pattern );
- }
- m_substring.clear();
- m_patternName.clear();
- m_exclusion = false;
- m_mode = None;
+ // Handles common preprocessing of the pattern for name/tag patterns
+ std::string preprocessPattern();
+ // Adds the current pattern as a test name
+ void addNamePattern();
+ // Adds the current pattern as a tag
+ void addTagPattern();
+
+ inline void addCharToPattern(char c) {
+ m_substring += c;
+ m_patternName += c;
+ m_realPatternPos++;
}
- void addFilter();
};
TestSpec parseTestSpec( std::string const& arg );
@@ -5101,10 +5281,12 @@ namespace Catch {
unsigned int benchmarkSamples = 100;
double benchmarkConfidenceInterval = 0.95;
unsigned int benchmarkResamples = 100000;
+ std::chrono::milliseconds::rep benchmarkWarmupTime = 100;
Verbosity verbosity = Verbosity::Normal;
WarnAbout::What warnings = WarnAbout::Nothing;
ShowDurations::OrNot showDurations = ShowDurations::DefaultForReporter;
+ double minDuration = -1;
RunTests::InWhatOrder runOrder = RunTests::InDeclarationOrder;
UseColour::YesOrNo useColour = UseColour::Auto;
WaitForKeypress::When waitForKeypress = WaitForKeypress::Never;
@@ -5155,6 +5337,7 @@ namespace Catch {
bool warnAboutMissingAssertions() const override;
bool warnAboutNoTests() const override;
ShowDurations::OrNot showDurations() const override;
+ double minDuration() const override;
RunTests::InWhatOrder runOrder() const override;
unsigned int rngSeed() const override;
UseColour::YesOrNo useColour() const override;
@@ -5166,6 +5349,7 @@ namespace Catch {
int benchmarkSamples() const override;
double benchmarkConfidenceInterval() const override;
unsigned int benchmarkResamples() const override;
+ std::chrono::milliseconds benchmarkWarmupTime() const override;
private:
@@ -5463,6 +5647,8 @@ namespace Catch {
virtual void noMatchingTestCases( std::string const& spec ) = 0;
+ virtual void reportInvalidArguments(std::string const&) {}
+
virtual void testRunStarting( TestRunInfo const& testRunInfo ) = 0;
virtual void testGroupStarting( GroupInfo const& groupInfo ) = 0;
@@ -5529,6 +5715,9 @@ namespace Catch {
// Returns double formatted as %.3f (format expected on output)
std::string getFormattedDuration( double duration );
+ //! Should the reporter show
+ bool shouldShowDuration( IConfig const& config, double duration );
+
std::string serializeFilters( std::vector<std::string> const& container );
template<typename DerivedT>
@@ -5555,6 +5744,8 @@ namespace Catch {
void noMatchingTestCases(std::string const&) override {}
+ void reportInvalidArguments(std::string const&) override {}
+
void testRunStarting(TestRunInfo const& _testRunInfo) override {
currentTestRunInfo = _testRunInfo;
}
@@ -5889,14 +6080,16 @@ namespace Catch {
#if !defined(CATCH_CONFIG_DISABLE)
#define CATCH_REGISTER_REPORTER( name, reporterType ) \
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
namespace{ Catch::ReporterRegistrar<reporterType> catch_internal_RegistrarFor##reporterType( name ); } \
- CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
#define CATCH_REGISTER_LISTENER( listenerType ) \
- CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
- namespace{ Catch::ListenerRegistrar<listenerType> catch_internal_RegistrarFor##listenerType; } \
- CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION \
+ CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS \
+ namespace{ Catch::ListenerRegistrar<listenerType> catch_internal_RegistrarFor##listenerType; } \
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
#else // CATCH_CONFIG_DISABLE
#define CATCH_REGISTER_REPORTER(name, reporterType)
@@ -5918,8 +6111,6 @@ namespace Catch {
static std::string getDescription();
- ReporterPreferences getPreferences() const override;
-
void noMatchingTestCases(std::string const& spec) override;
void assertionStarting(AssertionInfo const&) override;
@@ -5958,6 +6149,8 @@ namespace Catch {
void noMatchingTestCases(std::string const& spec) override;
+ void reportInvalidArguments(std::string const&arg) override;
+
void assertionStarting(AssertionInfo const&) override;
bool assertionEnded(AssertionStats const& _assertionStats) override;
@@ -6017,6 +6210,14 @@ namespace Catch {
#include <vector>
namespace Catch {
+ enum class XmlFormatting {
+ None = 0x00,
+ Indent = 0x01,
+ Newline = 0x02,
+ };
+
+ XmlFormatting operator | (XmlFormatting lhs, XmlFormatting rhs);
+ XmlFormatting operator & (XmlFormatting lhs, XmlFormatting rhs);
class XmlEncode {
public:
@@ -6038,14 +6239,14 @@ namespace Catch {
class ScopedElement {
public:
- ScopedElement( XmlWriter* writer );
+ ScopedElement( XmlWriter* writer, XmlFormatting fmt );
ScopedElement( ScopedElement&& other ) noexcept;
ScopedElement& operator=( ScopedElement&& other ) noexcept;
~ScopedElement();
- ScopedElement& writeText( std::string const& text, bool indent = true );
+ ScopedElement& writeText( std::string const& text, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent );
template<typename T>
ScopedElement& writeAttribute( std::string const& name, T const& attribute ) {
@@ -6055,6 +6256,7 @@ namespace Catch {
private:
mutable XmlWriter* m_writer = nullptr;
+ XmlFormatting m_fmt;
};
XmlWriter( std::ostream& os = Catch::cout() );
@@ -6063,11 +6265,11 @@ namespace Catch {
XmlWriter( XmlWriter const& ) = delete;
XmlWriter& operator=( XmlWriter const& ) = delete;
- XmlWriter& startElement( std::string const& name );
+ XmlWriter& startElement( std::string const& name, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);
- ScopedElement scopedElement( std::string const& name );
+ ScopedElement scopedElement( std::string const& name, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);
- XmlWriter& endElement();
+ XmlWriter& endElement(XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);
XmlWriter& writeAttribute( std::string const& name, std::string const& attribute );
@@ -6080,9 +6282,9 @@ namespace Catch {
return writeAttribute( name, rss.str() );
}
- XmlWriter& writeText( std::string const& text, bool indent = true );
+ XmlWriter& writeText( std::string const& text, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);
- XmlWriter& writeComment( std::string const& text );
+ XmlWriter& writeComment(std::string const& text, XmlFormatting fmt = XmlFormatting::Newline | XmlFormatting::Indent);
void writeStylesheetRef( std::string const& url );
@@ -6092,6 +6294,8 @@ namespace Catch {
private:
+ void applyFormatting(XmlFormatting fmt);
+
void writeDeclaration();
void newlineIfNecessary();
@@ -6213,6 +6417,12 @@ namespace Catch {
#endif
#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
+// start catch_benchmarking_all.hpp
+
+// A proxy header that includes all of the benchmarking headers to allow
+// concise include of the benchmarking features. You should prefer the
+// individual includes in standard use.
+
// start catch_benchmark.hpp
// Benchmark
@@ -6348,20 +6558,18 @@ namespace Catch {
return {};
}
};
- template <typename Sig>
- using ResultOf_t = typename std::result_of<Sig>::type;
// invoke and not return void :(
template <typename Fun, typename... Args>
- CompleteType_t<ResultOf_t<Fun(Args...)>> complete_invoke(Fun&& fun, Args&&... args) {
- return CompleteInvoker<ResultOf_t<Fun(Args...)>>::invoke(std::forward<Fun>(fun), std::forward<Args>(args)...);
+ CompleteType_t<FunctionReturnType<Fun, Args...>> complete_invoke(Fun&& fun, Args&&... args) {
+ return CompleteInvoker<FunctionReturnType<Fun, Args...>>::invoke(std::forward<Fun>(fun), std::forward<Args>(args)...);
}
const std::string benchmarkErrorMsg = "a benchmark failed to run successfully";
} // namespace Detail
template <typename Fun>
- Detail::CompleteType_t<Detail::ResultOf_t<Fun()>> user_code(Fun&& fun) {
+ Detail::CompleteType_t<FunctionReturnType<Fun>> user_code(Fun&& fun) {
CATCH_TRY{
return Detail::complete_invoke(std::forward<Fun>(fun));
} CATCH_CATCH_ALL{
@@ -6606,8 +6814,8 @@ namespace Catch {
Result result;
int iterations;
};
- template <typename Clock, typename Sig>
- using TimingOf = Timing<ClockDuration<Clock>, Detail::CompleteType_t<Detail::ResultOf_t<Sig>>>;
+ template <typename Clock, typename Func, typename... Args>
+ using TimingOf = Timing<ClockDuration<Clock>, Detail::CompleteType_t<FunctionReturnType<Func, Args...>>>;
} // namespace Benchmark
} // namespace Catch
@@ -6618,7 +6826,7 @@ namespace Catch {
namespace Benchmark {
namespace Detail {
template <typename Clock, typename Fun, typename... Args>
- TimingOf<Clock, Fun(Args...)> measure(Fun&& fun, Args&&... args) {
+ TimingOf<Clock, Fun, Args...> measure(Fun&& fun, Args&&... args) {
auto start = Clock::now();
auto&& r = Detail::complete_invoke(fun, std::forward<Args>(args)...);
auto end = Clock::now();
@@ -6637,11 +6845,11 @@ namespace Catch {
namespace Benchmark {
namespace Detail {
template <typename Clock, typename Fun>
- TimingOf<Clock, Fun(int)> measure_one(Fun&& fun, int iters, std::false_type) {
+ TimingOf<Clock, Fun, int> measure_one(Fun&& fun, int iters, std::false_type) {
return Detail::measure<Clock>(fun, iters);
}
template <typename Clock, typename Fun>
- TimingOf<Clock, Fun(Chronometer)> measure_one(Fun&& fun, int iters, std::true_type) {
+ TimingOf<Clock, Fun, Chronometer> measure_one(Fun&& fun, int iters, std::true_type) {
Detail::ChronometerModel<Clock> meter;
auto&& result = Detail::complete_invoke(fun, Chronometer(meter, iters));
@@ -6658,7 +6866,7 @@ namespace Catch {
};
template <typename Clock, typename Fun>
- TimingOf<Clock, Fun(run_for_at_least_argument_t<Clock, Fun>)> run_for_at_least(ClockDuration<Clock> how_long, int seed, Fun&& fun) {
+ TimingOf<Clock, Fun, run_for_at_least_argument_t<Clock, Fun>> run_for_at_least(ClockDuration<Clock> how_long, int seed, Fun&& fun) {
auto iters = seed;
while (iters < (1 << 30)) {
auto&& Timing = measure_one<Clock>(fun, iters, is_callable<Fun(Chronometer)>());
@@ -6726,11 +6934,13 @@ namespace Catch {
#include <algorithm>
#include <functional>
#include <vector>
+#include <iterator>
#include <numeric>
#include <tuple>
#include <cmath>
#include <utility>
#include <cstddef>
+#include <random>
namespace Catch {
namespace Benchmark {
@@ -7080,10 +7290,10 @@ namespace Catch {
template <typename Clock>
ExecutionPlan<FloatDuration<Clock>> prepare(const IConfig &cfg, Environment<FloatDuration<Clock>> env) const {
auto min_time = env.clock_resolution.mean * Detail::minimum_ticks;
- auto run_time = std::max(min_time, std::chrono::duration_cast<decltype(min_time)>(Detail::warmup_time));
+ auto run_time = std::max(min_time, std::chrono::duration_cast<decltype(min_time)>(cfg.benchmarkWarmupTime()));
auto&& test = Detail::run_for_at_least<Clock>(std::chrono::duration_cast<ClockDuration<Clock>>(run_time), 1, fun);
int new_iters = static_cast<int>(std::ceil(min_time * test.iterations / test.elapsed));
- return { new_iters, test.elapsed / test.iterations * new_iters * cfg.benchmarkSamples(), fun, std::chrono::duration_cast<FloatDuration<Clock>>(Detail::warmup_time), Detail::warmup_iterations };
+ return { new_iters, test.elapsed / test.iterations * new_iters * cfg.benchmarkSamples(), fun, std::chrono::duration_cast<FloatDuration<Clock>>(cfg.benchmarkWarmupTime()), Detail::warmup_iterations };
}
template <typename Clock = default_clock>
@@ -7115,7 +7325,7 @@ namespace Catch {
});
auto analysis = Detail::analyse(*cfg, env, samples.begin(), samples.end());
- BenchmarkStats<std::chrono::duration<double, std::nano>> stats{ info, analysis.samples, analysis.mean, analysis.standard_deviation, analysis.outliers, analysis.outlier_variance };
+ BenchmarkStats<FloatDuration<Clock>> stats{ info, analysis.samples, analysis.mean, analysis.standard_deviation, analysis.outliers, analysis.outlier_variance };
getResultCapture().benchmarkEnded(stats);
} CATCH_CATCH_ALL{
@@ -7156,6 +7366,77 @@ namespace Catch {
BenchmarkName = [&]
// end catch_benchmark.hpp
+// start catch_constructor.hpp
+
+// Constructor and destructor helpers
+
+
+#include <type_traits>
+
+namespace Catch {
+ namespace Benchmark {
+ namespace Detail {
+ template <typename T, bool Destruct>
+ struct ObjectStorage
+ {
+ using TStorage = typename std::aligned_storage<sizeof(T), std::alignment_of<T>::value>::type;
+
+ ObjectStorage() : data() {}
+
+ ObjectStorage(const ObjectStorage& other)
+ {
+ new(&data) T(other.stored_object());
+ }
+
+ ObjectStorage(ObjectStorage&& other)
+ {
+ new(&data) T(std::move(other.stored_object()));
+ }
+
+ ~ObjectStorage() { destruct_on_exit<T>(); }
+
+ template <typename... Args>
+ void construct(Args&&... args)
+ {
+ new (&data) T(std::forward<Args>(args)...);
+ }
+
+ template <bool AllowManualDestruction = !Destruct>
+ typename std::enable_if<AllowManualDestruction>::type destruct()
+ {
+ stored_object().~T();
+ }
+
+ private:
+ // If this is a constructor benchmark, destruct the underlying object
+ template <typename U>
+ void destruct_on_exit(typename std::enable_if<Destruct, U>::type* = 0) { destruct<true>(); }
+ // Otherwise, don't
+ template <typename U>
+ void destruct_on_exit(typename std::enable_if<!Destruct, U>::type* = 0) { }
+
+ T& stored_object() {
+ return *static_cast<T*>(static_cast<void*>(&data));
+ }
+
+ T const& stored_object() const {
+ return *static_cast<T*>(static_cast<void*>(&data));
+ }
+
+ TStorage data;
+ };
+ }
+
+ template <typename T>
+ using storage_for = Detail::ObjectStorage<T, true>;
+
+ template <typename T>
+ using destructable_object = Detail::ObjectStorage<T, false>;
+ }
+}
+
+// end catch_constructor.hpp
+// end catch_benchmarking_all.hpp
#endif
#endif // ! CATCH_CONFIG_IMPL_ONLY
@@ -7183,23 +7464,37 @@ namespace TestCaseTracking {
SourceLineInfo location;
NameAndLocation( std::string const& _name, SourceLineInfo const& _location );
+ friend bool operator==(NameAndLocation const& lhs, NameAndLocation const& rhs) {
+ return lhs.name == rhs.name
+ && lhs.location == rhs.location;
+ }
};
- struct ITracker;
+ class ITracker;
using ITrackerPtr = std::shared_ptr<ITracker>;
- struct ITracker {
- virtual ~ITracker();
+ class ITracker {
+ NameAndLocation m_nameAndLocation;
+
+ public:
+ ITracker(NameAndLocation const& nameAndLoc) :
+ m_nameAndLocation(nameAndLoc)
+ {}
// static queries
- virtual NameAndLocation const& nameAndLocation() const = 0;
+ NameAndLocation const& nameAndLocation() const {
+ return m_nameAndLocation;
+ }
+
+ virtual ~ITracker();
// dynamic queries
virtual bool isComplete() const = 0; // Successfully completed or failed
virtual bool isSuccessfullyCompleted() const = 0;
virtual bool isOpen() const = 0; // Started but not complete
virtual bool hasChildren() const = 0;
+ virtual bool hasStarted() const = 0;
virtual ITracker& parent() = 0;
@@ -7254,7 +7549,6 @@ namespace TestCaseTracking {
};
using Children = std::vector<ITrackerPtr>;
- NameAndLocation m_nameAndLocation;
TrackerContext& m_ctx;
ITracker* m_parent;
Children m_children;
@@ -7263,11 +7557,13 @@ namespace TestCaseTracking {
public:
TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent );
- NameAndLocation const& nameAndLocation() const override;
bool isComplete() const override;
bool isSuccessfullyCompleted() const override;
bool isOpen() const override;
bool hasChildren() const override;
+ bool hasStarted() const override {
+ return m_runState != NotStarted;
+ }
void addChild( ITrackerPtr const& child ) override;
@@ -7292,6 +7588,7 @@ namespace TestCaseTracking {
class SectionTracker : public TrackerBase {
std::vector<std::string> m_filters;
+ std::string m_trimmed_name;
public:
SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent );
@@ -7305,6 +7602,10 @@ namespace TestCaseTracking {
void addInitialFilters( std::vector<std::string> const& filters );
void addNextFilters( std::vector<std::string> const& filters );
+ //! Returns filters active in this tracker
+ std::vector<std::string> const& getFilters() const;
+ //! Returns whitespace-trimmed name of the tracked section
+ std::string const& trimmedName() const;
};
} // namespace TestCaseTracking
@@ -7493,9 +7794,10 @@ namespace Catch {
}
bootstrap_analysis analyse_samples(double confidence_level, int n_resamples, std::vector<double>::iterator first, std::vector<double>::iterator last) {
+ CATCH_INTERNAL_START_WARNINGS_SUPPRESSION
CATCH_INTERNAL_SUPPRESS_GLOBALS_WARNINGS
static std::random_device entropy;
- CATCH_INTERNAL_UNSUPPRESS_GLOBALS_WARNINGS
+ CATCH_INTERNAL_STOP_WARNINGS_SUPPRESSION
auto n = static_cast<int>(last - first); // seriously, one can't use integral types without hell in C++
@@ -7583,7 +7885,8 @@ namespace Detail {
bool Approx::equalityComparisonImpl(const double other) const {
// First try with fixed margin, then compute margin based on epsilon, scale and Approx's value
// Thanks to Richard Harris for his help refining the scaled margin value
- return marginComparison(m_value, other, m_margin) || marginComparison(m_value, other, m_epsilon * (m_scale + std::fabs(m_value)));
+ return marginComparison(m_value, other, m_margin)
+ || marginComparison(m_value, other, m_epsilon * (m_scale + std::fabs(std::isinf(m_value)? 0 : m_value)));
}
void Approx::setMargin(double newMargin) {
@@ -7627,7 +7930,24 @@ namespace Catch {
#ifdef CATCH_PLATFORM_MAC
- #define CATCH_TRAP() __asm__("int $3\n" : : ) /* NOLINT */
+ #if defined(__i386__) || defined(__x86_64__)
+ #define CATCH_TRAP() __asm__("int $3\n" : : ) /* NOLINT */
+ #elif defined(__aarch64__)
+ #define CATCH_TRAP() __asm__(".inst 0xd4200000")
+ #endif
+
+#elif defined(CATCH_PLATFORM_IPHONE)
+
+ // use inline assembler
+ #if defined(__i386__) || defined(__x86_64__)
+ #define CATCH_TRAP() __asm__("int $3")
+ #elif defined(__aarch64__)
+ #define CATCH_TRAP() __asm__(".inst 0xd4200000")
+ #elif defined(__arm__) && !defined(__thumb__)
+ #define CATCH_TRAP() __asm__(".inst 0xe7f001f0")
+ #elif defined(__arm__) && defined(__thumb__)
+ #define CATCH_TRAP() __asm__(".inst 0xde01")
+ #endif
#elif defined(CATCH_PLATFORM_LINUX)
// If we can use inline assembler, do it because this allows us to break
@@ -7647,10 +7967,12 @@ namespace Catch {
#define CATCH_TRAP() DebugBreak()
#endif
-#ifdef CATCH_TRAP
- #define CATCH_BREAK_INTO_DEBUGGER() []{ if( Catch::isDebuggerActive() ) { CATCH_TRAP(); } }()
-#else
- #define CATCH_BREAK_INTO_DEBUGGER() []{}()
+#ifndef CATCH_BREAK_INTO_DEBUGGER
+ #ifdef CATCH_TRAP
+ #define CATCH_BREAK_INTO_DEBUGGER() []{ if( Catch::isDebuggerActive() ) { CATCH_TRAP(); } }()
+ #else
+ #define CATCH_BREAK_INTO_DEBUGGER() []{}()
+ #endif
#endif
// end catch_debugger.h
@@ -7797,7 +8119,7 @@ namespace Catch {
void sectionEnded( SectionEndInfo const& endInfo ) override;
void sectionEndedEarly( SectionEndInfo const& endInfo ) override;
- auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& override;
+ auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& override;
#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
void benchmarkPreparing( std::string const& name ) override;
@@ -7868,6 +8190,8 @@ namespace Catch {
bool m_includeSuccessfulResults;
};
+ void seedRng(IConfig const& config);
+ unsigned int rngSeed();
} // end namespace Catch
// end catch_run_context.h
@@ -8014,7 +8338,7 @@ namespace Catch {
}
bool AssertionResult::hasExpression() const {
- return m_info.capturedExpression[0] != 0;
+ return !m_info.capturedExpression.empty();
}
bool AssertionResult::hasMessage() const {
@@ -8022,16 +8346,22 @@ namespace Catch {
}
std::string AssertionResult::getExpression() const {
- if( isFalseTest( m_info.resultDisposition ) )
- return "!(" + m_info.capturedExpression + ")";
- else
- return m_info.capturedExpression;
+ // Possibly overallocating by 3 characters should be basically free
+ std::string expr; expr.reserve(m_info.capturedExpression.size() + 3);
+ if (isFalseTest(m_info.resultDisposition)) {
+ expr += "!(";
+ }
+ expr += m_info.capturedExpression;
+ if (isFalseTest(m_info.resultDisposition)) {
+ expr += ')';
+ }
+ return expr;
}
std::string AssertionResult::getExpressionInMacro() const {
std::string expr;
- if( m_info.macroName[0] == 0 )
- expr = m_info.capturedExpression;
+ if( m_info.macroName.empty() )
+ expr = static_cast<std::string>(m_info.capturedExpression);
else {
expr.reserve( m_info.macroName.size() + m_info.capturedExpression.size() + 4 );
expr += m_info.macroName;
@@ -8157,312 +8487,312 @@ namespace clara {
namespace TextFlow {
inline auto isWhitespace(char c) -> bool {
- static std::string chars = " \t\n\r";
- return chars.find(c) != std::string::npos;
+ static std::string chars = " \t\n\r";
+ return chars.find(c) != std::string::npos;
}
inline auto isBreakableBefore(char c) -> bool {
- static std::string chars = "[({<|";
- return chars.find(c) != std::string::npos;
+ static std::string chars = "[({<|";
+ return chars.find(c) != std::string::npos;
}
inline auto isBreakableAfter(char c) -> bool {
- static std::string chars = "])}>.,:;*+-=&/\\";
- return chars.find(c) != std::string::npos;
+ static std::string chars = "])}>.,:;*+-=&/\\";
+ return chars.find(c) != std::string::npos;
}
class Columns;
class Column {
- std::vector<std::string> m_strings;
- size_t m_width = CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH;
- size_t m_indent = 0;
- size_t m_initialIndent = std::string::npos;
+ std::vector<std::string> m_strings;
+ size_t m_width = CATCH_CLARA_TEXTFLOW_CONFIG_CONSOLE_WIDTH;
+ size_t m_indent = 0;
+ size_t m_initialIndent = std::string::npos;
public:
- class iterator {
- friend Column;
-
- Column const& m_column;
- size_t m_stringIndex = 0;
- size_t m_pos = 0;
-
- size_t m_len = 0;
- size_t m_end = 0;
- bool m_suffix = false;
-
- iterator(Column const& column, size_t stringIndex)
- : m_column(column),
- m_stringIndex(stringIndex) {}
-
- auto line() const -> std::string const& { return m_column.m_strings[m_stringIndex]; }
-
- auto isBoundary(size_t at) const -> bool {
- assert(at > 0);
- assert(at <= line().size());
-
- return at == line().size() ||
- (isWhitespace(line()[at]) && !isWhitespace(line()[at - 1])) ||
- isBreakableBefore(line()[at]) ||
- isBreakableAfter(line()[at - 1]);
- }
-
- void calcLength() {
- assert(m_stringIndex < m_column.m_strings.size());
-
- m_suffix = false;
- auto width = m_column.m_width - indent();
- m_end = m_pos;
- if (line()[m_pos] == '\n') {
- ++m_end;
- }
- while (m_end < line().size() && line()[m_end] != '\n')
- ++m_end;
-
- if (m_end < m_pos + width) {
- m_len = m_end - m_pos;
- } else {
- size_t len = width;
- while (len > 0 && !isBoundary(m_pos + len))
- --len;
- while (len > 0 && isWhitespace(line()[m_pos + len - 1]))
- --len;
-
- if (len > 0) {
- m_len = len;
- } else {
- m_suffix = true;
- m_len = width - 1;
- }
- }
- }
-
- auto indent() const -> size_t {
- auto initial = m_pos == 0 && m_stringIndex == 0 ? m_column.m_initialIndent : std::string::npos;
- return initial == std::string::npos ? m_column.m_indent : initial;
- }
-
- auto addIndentAndSuffix(std::string const &plain) const -> std::string {
- return std::string(indent(), ' ') + (m_suffix ? plain + "-" : plain);
- }
-
- public:
- using difference_type = std::ptrdiff_t;
- using value_type = std::string;
- using pointer = value_type * ;
- using reference = value_type & ;
- using iterator_category = std::forward_iterator_tag;
-
- explicit iterator(Column const& column) : m_column(column) {
- assert(m_column.m_width > m_column.m_indent);
- assert(m_column.m_initialIndent == std::string::npos || m_column.m_width > m_column.m_initialIndent);
- calcLength();
- if (m_len == 0)
- m_stringIndex++; // Empty string
- }
-
- auto operator *() const -> std::string {
- assert(m_stringIndex < m_column.m_strings.size());
- assert(m_pos <= m_end);
- return addIndentAndSuffix(line().substr(m_pos, m_len));
- }
-
- auto operator ++() -> iterator& {
- m_pos += m_len;
- if (m_pos < line().size() && line()[m_pos] == '\n')
- m_pos += 1;
- else
- while (m_pos < line().size() && isWhitespace(line()[m_pos]))
- ++m_pos;
-
- if (m_pos == line().size()) {
- m_pos = 0;
- ++m_stringIndex;
- }
- if (m_stringIndex < m_column.m_strings.size())
- calcLength();
- return *this;
- }
- auto operator ++(int) -> iterator {
- iterator prev(*this);
- operator++();
- return prev;
- }
-
- auto operator ==(iterator const& other) const -> bool {
- return
- m_pos == other.m_pos &&
- m_stringIndex == other.m_stringIndex &&
- &m_column == &other.m_column;
- }
- auto operator !=(iterator const& other) const -> bool {
- return !operator==(other);
- }
- };
- using const_iterator = iterator;
-
- explicit Column(std::string const& text) { m_strings.push_back(text); }
-
- auto width(size_t newWidth) -> Column& {
- assert(newWidth > 0);
- m_width = newWidth;
- return *this;
- }
- auto indent(size_t newIndent) -> Column& {
- m_indent = newIndent;
- return *this;
- }
- auto initialIndent(size_t newIndent) -> Column& {
- m_initialIndent = newIndent;
- return *this;
- }
-
- auto width() const -> size_t { return m_width; }
- auto begin() const -> iterator { return iterator(*this); }
- auto end() const -> iterator { return { *this, m_strings.size() }; }
-
- inline friend std::ostream& operator << (std::ostream& os, Column const& col) {
- bool first = true;
- for (auto line : col) {
- if (first)
- first = false;
- else
- os << "\n";
- os << line;
- }
- return os;
- }
-
- auto operator + (Column const& other)->Columns;
-
- auto toString() const -> std::string {
- std::ostringstream oss;
- oss << *this;
- return oss.str();
- }
+ class iterator {
+ friend Column;
+
+ Column const& m_column;
+ size_t m_stringIndex = 0;
+ size_t m_pos = 0;
+
+ size_t m_len = 0;
+ size_t m_end = 0;
+ bool m_suffix = false;
+
+ iterator(Column const& column, size_t stringIndex)
+ : m_column(column),
+ m_stringIndex(stringIndex) {}
+
+ auto line() const -> std::string const& { return m_column.m_strings[m_stringIndex]; }
+
+ auto isBoundary(size_t at) const -> bool {
+ assert(at > 0);
+ assert(at <= line().size());
+
+ return at == line().size() ||
+ (isWhitespace(line()[at]) && !isWhitespace(line()[at - 1])) ||
+ isBreakableBefore(line()[at]) ||
+ isBreakableAfter(line()[at - 1]);
+ }
+
+ void calcLength() {
+ assert(m_stringIndex < m_column.m_strings.size());
+
+ m_suffix = false;
+ auto width = m_column.m_width - indent();
+ m_end = m_pos;
+ if (line()[m_pos] == '\n') {
+ ++m_end;
+ }
+ while (m_end < line().size() && line()[m_end] != '\n')
+ ++m_end;
+
+ if (m_end < m_pos + width) {
+ m_len = m_end - m_pos;
+ } else {
+ size_t len = width;
+ while (len > 0 && !isBoundary(m_pos + len))
+ --len;
+ while (len > 0 && isWhitespace(line()[m_pos + len - 1]))
+ --len;
+
+ if (len > 0) {
+ m_len = len;
+ } else {
+ m_suffix = true;
+ m_len = width - 1;
+ }
+ }
+ }
+
+ auto indent() const -> size_t {
+ auto initial = m_pos == 0 && m_stringIndex == 0 ? m_column.m_initialIndent : std::string::npos;
+ return initial == std::string::npos ? m_column.m_indent : initial;
+ }
+
+ auto addIndentAndSuffix(std::string const &plain) const -> std::string {
+ return std::string(indent(), ' ') + (m_suffix ? plain + "-" : plain);
+ }
+
+ public:
+ using difference_type = std::ptrdiff_t;
+ using value_type = std::string;
+ using pointer = value_type * ;
+ using reference = value_type & ;
+ using iterator_category = std::forward_iterator_tag;
+
+ explicit iterator(Column const& column) : m_column(column) {
+ assert(m_column.m_width > m_column.m_indent);
+ assert(m_column.m_initialIndent == std::string::npos || m_column.m_width > m_column.m_initialIndent);
+ calcLength();
+ if (m_len == 0)
+ m_stringIndex++; // Empty string
+ }
+
+ auto operator *() const -> std::string {
+ assert(m_stringIndex < m_column.m_strings.size());
+ assert(m_pos <= m_end);
+ return addIndentAndSuffix(line().substr(m_pos, m_len));
+ }
+
+ auto operator ++() -> iterator& {
+ m_pos += m_len;
+ if (m_pos < line().size() && line()[m_pos] == '\n')
+ m_pos += 1;
+ else
+ while (m_pos < line().size() && isWhitespace(line()[m_pos]))
+ ++m_pos;
+
+ if (m_pos == line().size()) {
+ m_pos = 0;
+ ++m_stringIndex;
+ }
+ if (m_stringIndex < m_column.m_strings.size())
+ calcLength();
+ return *this;
+ }
+ auto operator ++(int) -> iterator {
+ iterator prev(*this);
+ operator++();
+ return prev;
+ }
+
+ auto operator ==(iterator const& other) const -> bool {
+ return
+ m_pos == other.m_pos &&
+ m_stringIndex == other.m_stringIndex &&
+ &m_column == &other.m_column;
+ }
+ auto operator !=(iterator const& other) const -> bool {
+ return !operator==(other);
+ }
+ };
+ using const_iterator = iterator;
+
+ explicit Column(std::string const& text) { m_strings.push_back(text); }
+
+ auto width(size_t newWidth) -> Column& {
+ assert(newWidth > 0);
+ m_width = newWidth;
+ return *this;
+ }
+ auto indent(size_t newIndent) -> Column& {
+ m_indent = newIndent;
+ return *this;
+ }
+ auto initialIndent(size_t newIndent) -> Column& {
+ m_initialIndent = newIndent;
+ return *this;
+ }
+
+ auto width() const -> size_t { return m_width; }
+ auto begin() const -> iterator { return iterator(*this); }
+ auto end() const -> iterator { return { *this, m_strings.size() }; }
+
+ inline friend std::ostream& operator << (std::ostream& os, Column const& col) {
+ bool first = true;
+ for (auto line : col) {
+ if (first)
+ first = false;
+ else
+ os << "\n";
+ os << line;
+ }
+ return os;
+ }
+
+ auto operator + (Column const& other)->Columns;
+
+ auto toString() const -> std::string {
+ std::ostringstream oss;
+ oss << *this;
+ return oss.str();
+ }
};
class Spacer : public Column {
public:
- explicit Spacer(size_t spaceWidth) : Column("") {
- width(spaceWidth);
- }
+ explicit Spacer(size_t spaceWidth) : Column("") {
+ width(spaceWidth);
+ }
};
class Columns {
- std::vector<Column> m_columns;
+ std::vector<Column> m_columns;
public:
- class iterator {
- friend Columns;
- struct EndTag {};
-
- std::vector<Column> const& m_columns;
- std::vector<Column::iterator> m_iterators;
- size_t m_activeIterators;
-
- iterator(Columns const& columns, EndTag)
- : m_columns(columns.m_columns),
- m_activeIterators(0) {
- m_iterators.reserve(m_columns.size());
-
- for (auto const& col : m_columns)
- m_iterators.push_back(col.end());
- }
-
- public:
- using difference_type = std::ptrdiff_t;
- using value_type = std::string;
- using pointer = value_type * ;
- using reference = value_type & ;
- using iterator_category = std::forward_iterator_tag;
-
- explicit iterator(Columns const& columns)
- : m_columns(columns.m_columns),
- m_activeIterators(m_columns.size()) {
- m_iterators.reserve(m_columns.size());
-
- for (auto const& col : m_columns)
- m_iterators.push_back(col.begin());
- }
-
- auto operator ==(iterator const& other) const -> bool {
- return m_iterators == other.m_iterators;
- }
- auto operator !=(iterator const& other) const -> bool {
- return m_iterators != other.m_iterators;
- }
- auto operator *() const -> std::string {
- std::string row, padding;
-
- for (size_t i = 0; i < m_columns.size(); ++i) {
- auto width = m_columns[i].width();
- if (m_iterators[i] != m_columns[i].end()) {
- std::string col = *m_iterators[i];
- row += padding + col;
- if (col.size() < width)
- padding = std::string(width - col.size(), ' ');
- else
- padding = "";
- } else {
- padding += std::string(width, ' ');
- }
- }
- return row;
- }
- auto operator ++() -> iterator& {
- for (size_t i = 0; i < m_columns.size(); ++i) {
- if (m_iterators[i] != m_columns[i].end())
- ++m_iterators[i];
- }
- return *this;
- }
- auto operator ++(int) -> iterator {
- iterator prev(*this);
- operator++();
- return prev;
- }
- };
- using const_iterator = iterator;
-
- auto begin() const -> iterator { return iterator(*this); }
- auto end() const -> iterator { return { *this, iterator::EndTag() }; }
-
- auto operator += (Column const& col) -> Columns& {
- m_columns.push_back(col);
- return *this;
- }
- auto operator + (Column const& col) -> Columns {
- Columns combined = *this;
- combined += col;
- return combined;
- }
-
- inline friend std::ostream& operator << (std::ostream& os, Columns const& cols) {
-
- bool first = true;
- for (auto line : cols) {
- if (first)
- first = false;
- else
- os << "\n";
- os << line;
- }
- return os;
- }
-
- auto toString() const -> std::string {
- std::ostringstream oss;
- oss << *this;
- return oss.str();
- }
+ class iterator {
+ friend Columns;
+ struct EndTag {};
+
+ std::vector<Column> const& m_columns;
+ std::vector<Column::iterator> m_iterators;
+ size_t m_activeIterators;
+
+ iterator(Columns const& columns, EndTag)
+ : m_columns(columns.m_columns),
+ m_activeIterators(0) {
+ m_iterators.reserve(m_columns.size());
+
+ for (auto const& col : m_columns)
+ m_iterators.push_back(col.end());
+ }
+
+ public:
+ using difference_type = std::ptrdiff_t;
+ using value_type = std::string;
+ using pointer = value_type * ;
+ using reference = value_type & ;
+ using iterator_category = std::forward_iterator_tag;
+
+ explicit iterator(Columns const& columns)
+ : m_columns(columns.m_columns),
+ m_activeIterators(m_columns.size()) {
+ m_iterators.reserve(m_columns.size());
+
+ for (auto const& col : m_columns)
+ m_iterators.push_back(col.begin());
+ }
+
+ auto operator ==(iterator const& other) const -> bool {
+ return m_iterators == other.m_iterators;
+ }
+ auto operator !=(iterator const& other) const -> bool {
+ return m_iterators != other.m_iterators;
+ }
+ auto operator *() const -> std::string {
+ std::string row, padding;
+
+ for (size_t i = 0; i < m_columns.size(); ++i) {
+ auto width = m_columns[i].width();
+ if (m_iterators[i] != m_columns[i].end()) {
+ std::string col = *m_iterators[i];
+ row += padding + col;
+ if (col.size() < width)
+ padding = std::string(width - col.size(), ' ');
+ else
+ padding = "";
+ } else {
+ padding += std::string(width, ' ');
+ }
+ }
+ return row;
+ }
+ auto operator ++() -> iterator& {
+ for (size_t i = 0; i < m_columns.size(); ++i) {
+ if (m_iterators[i] != m_columns[i].end())
+ ++m_iterators[i];
+ }
+ return *this;
+ }
+ auto operator ++(int) -> iterator {
+ iterator prev(*this);
+ operator++();
+ return prev;
+ }
+ };
+ using const_iterator = iterator;
+
+ auto begin() const -> iterator { return iterator(*this); }
+ auto end() const -> iterator { return { *this, iterator::EndTag() }; }
+
+ auto operator += (Column const& col) -> Columns& {
+ m_columns.push_back(col);
+ return *this;
+ }
+ auto operator + (Column const& col) -> Columns {
+ Columns combined = *this;
+ combined += col;
+ return combined;
+ }
+
+ inline friend std::ostream& operator << (std::ostream& os, Columns const& cols) {
+
+ bool first = true;
+ for (auto line : cols) {
+ if (first)
+ first = false;
+ else
+ os << "\n";
+ os << line;
+ }
+ return os;
+ }
+
+ auto toString() const -> std::string {
+ std::ostringstream oss;
+ oss << *this;
+ return oss.str();
+ }
};
inline auto Column::operator + (Column const& other) -> Columns {
- Columns cols;
- cols += *this;
- cols += other;
- return cols;
+ Columns cols;
+ cols += *this;
+ cols += other;
+ return cols;
}
}
@@ -8765,7 +9095,7 @@ namespace detail {
}
inline auto convertInto( std::string const &source, bool &target ) -> ParserResult {
std::string srcLC = source;
- std::transform( srcLC.begin(), srcLC.end(), srcLC.begin(), []( char c ) { return static_cast<char>( std::tolower(c) ); } );
+ std::transform( srcLC.begin(), srcLC.end(), srcLC.begin(), []( unsigned char c ) { return static_cast<char>( std::tolower(c) ); } );
if (srcLC == "y" || srcLC == "1" || srcLC == "true" || srcLC == "yes" || srcLC == "on")
target = true;
else if (srcLC == "n" || srcLC == "0" || srcLC == "false" || srcLC == "no" || srcLC == "off")
@@ -8921,7 +9251,7 @@ namespace detail {
template<typename T>
auto operator|( T const &other ) const -> Parser;
- template<typename T>
+ template<typename T>
auto operator+( T const &other ) const -> Parser;
};
@@ -9413,9 +9743,14 @@ namespace Catch {
if( !line.empty() && !startsWith( line, '#' ) ) {
if( !startsWith( line, '"' ) )
line = '"' + line + '"';
- config.testsOrTags.push_back( line + ',' );
+ config.testsOrTags.push_back( line );
+ config.testsOrTags.emplace_back( "," );
}
}
+ //Remove comma in the end
+ if(!config.testsOrTags.empty())
+ config.testsOrTags.erase( config.testsOrTags.end()-1 );
+
return ParserResult::ok( ParseResultType::Matched );
};
auto const setTestOrder = [&]( std::string const& order ) {
@@ -9450,14 +9785,16 @@ namespace Catch {
};
auto const setWaitForKeypress = [&]( std::string const& keypress ) {
auto keypressLc = toLower( keypress );
- if( keypressLc == "start" )
+ if (keypressLc == "never")
+ config.waitForKeypress = WaitForKeypress::Never;
+ else if( keypressLc == "start" )
config.waitForKeypress = WaitForKeypress::BeforeStart;
else if( keypressLc == "exit" )
config.waitForKeypress = WaitForKeypress::BeforeExit;
else if( keypressLc == "both" )
config.waitForKeypress = WaitForKeypress::BeforeStartAndExit;
else
- return ParserResult::runtimeError( "keypress argument must be one of: start, exit or both. '" + keypress + "' not recognised" );
+ return ParserResult::runtimeError( "keypress argument must be one of: never, start, exit or both. '" + keypress + "' not recognised" );
return ParserResult::ok( ParseResultType::Matched );
};
auto const setVerbosity = [&]( std::string const& verbosity ) {
@@ -9527,6 +9864,9 @@ namespace Catch {
| Opt( [&]( bool flag ) { config.showDurations = flag ? ShowDurations::Always : ShowDurations::Never; }, "yes|no" )
["-d"]["--durations"]
( "show test durations" )
+ | Opt( config.minDuration, "seconds" )
+ ["-D"]["--min-duration"]
+ ( "show test durations for tests taking at least the given number of seconds" )
| Opt( loadTestNamesFromFile, "filename" )
["-f"]["--input-file"]
( "load test names to run from a file" )
@@ -9557,7 +9897,7 @@ namespace Catch {
| Opt( config.libIdentify )
["--libidentify"]
( "report name and version according to libidentify standard" )
- | Opt( setWaitForKeypress, "start|exit|both" )
+ | Opt( setWaitForKeypress, "never|start|exit|both" )
["--wait-for-keypress"]
( "waits for a keypress before exiting" )
| Opt( config.benchmarkSamples, "samples" )
@@ -9572,7 +9912,10 @@ namespace Catch {
| Opt( config.benchmarkNoAnalysis )
["--benchmark-no-analysis"]
( "perform only measurements; do not perform any analysis" )
- | Arg( config.testsOrTags, "test name|pattern|tags" )
+ | Opt( config.benchmarkWarmupTime, "benchmarkWarmupTime" )
+ ["--benchmark-warmup-time"]
+ ( "amount of time in milliseconds spent on warming up each test (default: 100)" )
+ | Arg( config.testsOrTags, "test name|pattern|tags" )
( "which test or tests to use" );
return cli;
@@ -9587,9 +9930,6 @@ namespace Catch {
namespace Catch {
- bool SourceLineInfo::empty() const noexcept {
- return file[0] == '\0';
- }
bool SourceLineInfo::operator == ( SourceLineInfo const& other ) const noexcept {
return line == other.line && (file == other.file || std::strcmp(file, other.file) == 0);
}
@@ -9625,11 +9965,23 @@ namespace Catch {
: m_data( data ),
m_stream( openStream() )
{
+ // We need to trim filter specs to avoid trouble with superfluous
+ // whitespace (esp. important for bdd macros, as those are manually
+ // aligned with whitespace).
+
+ for (auto& elem : m_data.testsOrTags) {
+ elem = trim(elem);
+ }
+ for (auto& elem : m_data.sectionsToRun) {
+ elem = trim(elem);
+ }
+
TestSpecParser parser(ITagAliasRegistry::get());
- if (!data.testsOrTags.empty()) {
+ if (!m_data.testsOrTags.empty()) {
m_hasTestFilters = true;
- for( auto const& testOrTags : data.testsOrTags )
- parser.parse( testOrTags );
+ for (auto const& testOrTags : m_data.testsOrTags) {
+ parser.parse(testOrTags);
+ }
}
m_testSpec = parser.testSpec();
}
@@ -9662,6 +10014,7 @@ namespace Catch {
bool Config::warnAboutMissingAssertions() const { return !!(m_data.warnings & WarnAbout::NoAssertions); }
bool Config::warnAboutNoTests() const { return !!(m_data.warnings & WarnAbout::NoTests); }
ShowDurations::OrNot Config::showDurations() const { return m_data.showDurations; }
+ double Config::minDuration() const { return m_data.minDuration; }
RunTests::InWhatOrder Config::runOrder() const { return m_data.runOrder; }
unsigned int Config::rngSeed() const { return m_data.rngSeed; }
UseColour::YesOrNo Config::useColour() const { return m_data.useColour; }
@@ -9670,10 +10023,11 @@ namespace Catch {
bool Config::showInvisibles() const { return m_data.showInvisibles; }
Verbosity Config::verbosity() const { return m_data.verbosity; }
- bool Config::benchmarkNoAnalysis() const { return m_data.benchmarkNoAnalysis; }
- int Config::benchmarkSamples() const { return m_data.benchmarkSamples; }
- double Config::benchmarkConfidenceInterval() const { return m_data.benchmarkConfidenceInterval; }
- unsigned int Config::benchmarkResamples() const { return m_data.benchmarkResamples; }
+ bool Config::benchmarkNoAnalysis() const { return m_data.benchmarkNoAnalysis; }
+ int Config::benchmarkSamples() const { return m_data.benchmarkSamples; }
+ double Config::benchmarkConfidenceInterval() const { return m_data.benchmarkConfidenceInterval; }
+ unsigned int Config::benchmarkResamples() const { return m_data.benchmarkResamples; }
+ std::chrono::milliseconds Config::benchmarkWarmupTime() const { return std::chrono::milliseconds(m_data.benchmarkWarmupTime); }
IStream const* Config::openStream() {
return Catch::makeStream(m_data.outputFilename);
@@ -9714,7 +10068,7 @@ namespace Catch {
};
struct NoColourImpl : IColourImpl {
- void use( Colour::Code ) {}
+ void use( Colour::Code ) override {}
static IColourImpl* instance() {
static NoColourImpl s_instance;
@@ -9846,7 +10200,7 @@ namespace {
bool useColourOnPlatform() {
return
-#ifdef CATCH_PLATFORM_MAC
+#if defined(CATCH_PLATFORM_MAC) || defined(CATCH_PLATFORM_IPHONE)
!isDebuggerActive() &&
#endif
#if !(defined(__DJGPP__) && defined(__STRICT_ANSI__))
@@ -9887,13 +10241,13 @@ namespace Catch {
namespace Catch {
Colour::Colour( Code _colourCode ) { use( _colourCode ); }
- Colour::Colour( Colour&& rhs ) noexcept {
- m_moved = rhs.m_moved;
- rhs.m_moved = true;
+ Colour::Colour( Colour&& other ) noexcept {
+ m_moved = other.m_moved;
+ other.m_moved = true;
}
- Colour& Colour::operator=( Colour&& rhs ) noexcept {
- m_moved = rhs.m_moved;
- rhs.m_moved = true;
+ Colour& Colour::operator=( Colour&& other ) noexcept {
+ m_moved = other.m_moved;
+ other.m_moved = true;
return *this;
}
@@ -9905,7 +10259,7 @@ namespace Catch {
// However, under some conditions it does happen (see #1626),
// and this change is small enough that we can let practicality
// triumph over purity in this case.
- if (impl != NULL) {
+ if (impl != nullptr) {
impl->use( _colourCode );
}
}
@@ -9974,6 +10328,12 @@ namespace Catch {
IContext::~IContext() = default;
IMutableContext::~IMutableContext() = default;
Context::~Context() = default;
+
+ SimplePcg32& rng() {
+ static SimplePcg32 s_rng;
+ return s_rng;
+ }
+
}
// end catch_context.cpp
// start catch_debug_console.cpp
@@ -9987,12 +10347,12 @@ namespace Catch {
}
// end catch_debug_console.h
-#if defined(__ANDROID__)
+#if defined(CATCH_CONFIG_ANDROID_LOGWRITE)
#include <android/log.h>
namespace Catch {
void writeToDebugConsole( std::string const& text ) {
- __android_log_print( ANDROID_LOG_DEBUG, "Catch", text.c_str() );
+ __android_log_write( ANDROID_LOG_DEBUG, "Catch", text.c_str() );
}
}
@@ -10017,10 +10377,9 @@ namespace Catch {
// end catch_debug_console.cpp
// start catch_debugger.cpp
-#ifdef CATCH_PLATFORM_MAC
+#if defined(CATCH_PLATFORM_MAC) || defined(CATCH_PLATFORM_IPHONE)
-# include <assert.h>
-# include <stdbool.h>
+# include <cassert>
# include <sys/types.h>
# include <unistd.h>
# include <cstddef>
@@ -10193,7 +10552,7 @@ namespace Catch {
EnumInfo const& registerEnum( StringRef enumName, StringRef allEnums, std::vector<int> const& values) override;
};
- std::vector<std::string> parseEnums( StringRef enums );
+ std::vector<StringRef> parseEnums( StringRef enums );
} // Detail
@@ -10210,13 +10569,25 @@ namespace Catch {
namespace Detail {
- std::vector<std::string> parseEnums( StringRef enums ) {
+ namespace {
+ // Extracts the actual name part of an enum instance
+ // In other words, it returns the Blue part of Bikeshed::Colour::Blue
+ StringRef extractInstanceName(StringRef enumInstance) {
+ // Find last occurence of ":"
+ size_t name_start = enumInstance.size();
+ while (name_start > 0 && enumInstance[name_start - 1] != ':') {
+ --name_start;
+ }
+ return enumInstance.substr(name_start, enumInstance.size() - name_start);
+ }
+ }
+
+ std::vector<StringRef> parseEnums( StringRef enums ) {
auto enumValues = splitStringRef( enums, ',' );
- std::vector<std::string> parsed;
+ std::vector<StringRef> parsed;
parsed.reserve( enumValues.size() );
for( auto const& enumValue : enumValues ) {
- auto identifiers = splitStringRef( enumValue, ':' );
- parsed.push_back( Catch::trim( identifiers.back() ) );
+ parsed.push_back(trim(extractInstanceName(enumValue)));
}
return parsed;
}
@@ -10228,7 +10599,7 @@ namespace Catch {
if( valueToName.first == value )
return valueToName.second;
}
- return "{** unexpected enum value **}";
+ return "{** unexpected enum value **}"_sr;
}
std::unique_ptr<EnumInfo> makeEnumInfo( StringRef enumName, StringRef allValueNames, std::vector<int> const& values ) {
@@ -10240,16 +10611,14 @@ namespace Catch {
assert( valueNames.size() == values.size() );
std::size_t i = 0;
for( auto value : values )
- enumInfo->m_values.push_back({ value, valueNames[i++] });
+ enumInfo->m_values.emplace_back(value, valueNames[i++]);
return enumInfo;
}
EnumInfo const& EnumValuesRegistry::registerEnum( StringRef enumName, StringRef allValueNames, std::vector<int> const& values ) {
- auto enumInfo = makeEnumInfo( enumName, allValueNames, values );
- EnumInfo* raw = enumInfo.get();
- m_enumInfos.push_back( std::move( enumInfo ) );
- return *raw;
+ m_enumInfos.push_back(makeEnumInfo(enumName, allValueNames, values));
+ return *m_enumInfos.back();
}
} // Detail
@@ -10527,22 +10896,6 @@ namespace Catch {
// end catch_fatal_condition.cpp
// start catch_generators.cpp
-// start catch_random_number_generator.h
-
-#include <algorithm>
-#include <random>
-
-namespace Catch {
-
- struct IConfig;
-
- std::mt19937& rng();
- void seedRng( IConfig const& config );
- unsigned int rngSeed();
-
-}
-
-// end catch_random_number_generator.h
#include <limits>
#include <set>
@@ -10558,8 +10911,8 @@ namespace Generators {
GeneratorUntypedBase::~GeneratorUntypedBase() {}
- auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& {
- return getResultCapture().acquireGeneratorTracker( lineInfo );
+ auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& {
+ return getResultCapture().acquireGeneratorTracker( generatorName, lineInfo );
}
} // namespace Generators
@@ -10615,6 +10968,8 @@ namespace Catch {
void noMatchingTestCases( std::string const& spec ) override;
+ void reportInvalidArguments(std::string const&arg) override;
+
static std::set<Verbosity> getSupportedVerbosities();
#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
@@ -10832,7 +11187,7 @@ namespace Catch {
namespace Catch {
std::size_t listTests( Config const& config ) {
- TestSpec testSpec = config.testSpec();
+ TestSpec const& testSpec = config.testSpec();
if( config.hasTestFilters() )
Catch::cout() << "Matching test cases:\n";
else {
@@ -10866,7 +11221,7 @@ namespace Catch {
}
std::size_t listTestsNamesOnly( Config const& config ) {
- TestSpec testSpec = config.testSpec();
+ TestSpec const& testSpec = config.testSpec();
std::size_t matchedTests = 0;
std::vector<TestCase> matchedTestCases = filterTests( getAllTestCasesSorted( config ), testSpec, config );
for( auto const& testCaseInfo : matchedTestCases ) {
@@ -10904,7 +11259,7 @@ namespace Catch {
}
std::size_t listTags( Config const& config ) {
- TestSpec testSpec = config.testSpec();
+ TestSpec const& testSpec = config.testSpec();
if( config.hasTestFilters() )
Catch::cout() << "Tags for matching test cases:\n";
else {
@@ -10998,6 +11353,29 @@ using Matchers::Impl::MatcherBase;
} // namespace Catch
// end catch_matchers.cpp
+// start catch_matchers_exception.cpp
+
+namespace Catch {
+namespace Matchers {
+namespace Exception {
+
+bool ExceptionMessageMatcher::match(std::exception const& ex) const {
+ return ex.what() == m_message;
+}
+
+std::string ExceptionMessageMatcher::describe() const {
+ return "exception message matches \"" + m_message + "\"";
+}
+
+}
+Exception::ExceptionMessageMatcher Message(std::string const& message) {
+ return Exception::ExceptionMessageMatcher(message);
+}
+
+// namespace Exception
+} // namespace Matchers
+} // namespace Catch
+// end catch_matchers_exception.cpp
// start catch_matchers_floating.cpp
// start catch_polyfills.hpp
@@ -11026,85 +11404,100 @@ namespace Catch {
} // end namespace Catch
// end catch_to_string.hpp
+#include <algorithm>
+#include <cmath>
#include <cstdlib>
#include <cstdint>
#include <cstring>
#include <sstream>
+#include <type_traits>
#include <iomanip>
#include <limits>
namespace Catch {
-namespace Matchers {
-namespace Floating {
-enum class FloatingPointKind : uint8_t {
- Float,
- Double
-};
-}
-}
-}
-
namespace {
-template <typename T>
-struct Converter;
-
-template <>
-struct Converter<float> {
- static_assert(sizeof(float) == sizeof(int32_t), "Important ULP matcher assumption violated");
- Converter(float f) {
+ int32_t convert(float f) {
+ static_assert(sizeof(float) == sizeof(int32_t), "Important ULP matcher assumption violated");
+ int32_t i;
std::memcpy(&i, &f, sizeof(f));
+ return i;
}
- int32_t i;
-};
-template <>
-struct Converter<double> {
- static_assert(sizeof(double) == sizeof(int64_t), "Important ULP matcher assumption violated");
- Converter(double d) {
+ int64_t convert(double d) {
+ static_assert(sizeof(double) == sizeof(int64_t), "Important ULP matcher assumption violated");
+ int64_t i;
std::memcpy(&i, &d, sizeof(d));
+ return i;
}
- int64_t i;
-};
-template <typename T>
-auto convert(T t) -> Converter<T> {
- return Converter<T>(t);
-}
+ template <typename FP>
+ bool almostEqualUlps(FP lhs, FP rhs, uint64_t maxUlpDiff) {
+ // Comparison with NaN should always be false.
+ // This way we can rule it out before getting into the ugly details
+ if (Catch::isnan(lhs) || Catch::isnan(rhs)) {
+ return false;
+ }
-template <typename FP>
-bool almostEqualUlps(FP lhs, FP rhs, int maxUlpDiff) {
- // Comparison with NaN should always be false.
- // This way we can rule it out before getting into the ugly details
- if (Catch::isnan(lhs) || Catch::isnan(rhs)) {
- return false;
+ auto lc = convert(lhs);
+ auto rc = convert(rhs);
+
+ if ((lc < 0) != (rc < 0)) {
+ // Potentially we can have +0 and -0
+ return lhs == rhs;
+ }
+
+ auto ulpDiff = std::abs(lc - rc);
+ return static_cast<uint64_t>(ulpDiff) <= maxUlpDiff;
}
- auto lc = convert(lhs);
- auto rc = convert(rhs);
+#if defined(CATCH_CONFIG_GLOBAL_NEXTAFTER)
- if ((lc.i < 0) != (rc.i < 0)) {
- // Potentially we can have +0 and -0
- return lhs == rhs;
+ float nextafter(float x, float y) {
+ return ::nextafterf(x, y);
}
- auto ulpDiff = std::abs(lc.i - rc.i);
- return ulpDiff <= maxUlpDiff;
-}
+ double nextafter(double x, double y) {
+ return ::nextafter(x, y);
+ }
+
+#endif // ^^^ CATCH_CONFIG_GLOBAL_NEXTAFTER ^^^
template <typename FP>
-FP step(FP start, FP direction, int steps) {
- for (int i = 0; i < steps; ++i) {
+FP step(FP start, FP direction, uint64_t steps) {
+ for (uint64_t i = 0; i < steps; ++i) {
+#if defined(CATCH_CONFIG_GLOBAL_NEXTAFTER)
+ start = Catch::nextafter(start, direction);
+#else
start = std::nextafter(start, direction);
+#endif
}
return start;
}
+// Performs equivalent check of std::fabs(lhs - rhs) <= margin
+// But without the subtraction to allow for INFINITY in comparison
+bool marginComparison(double lhs, double rhs, double margin) {
+ return (lhs + margin >= rhs) && (rhs + margin >= lhs);
+}
+
+template <typename FloatingPoint>
+void write(std::ostream& out, FloatingPoint num) {
+ out << std::scientific
+ << std::setprecision(std::numeric_limits<FloatingPoint>::max_digits10 - 1)
+ << num;
+}
+
} // end anonymous namespace
-namespace Catch {
namespace Matchers {
namespace Floating {
+
+ enum class FloatingPointKind : uint8_t {
+ Float,
+ Double
+ };
+
WithinAbsMatcher::WithinAbsMatcher(double target, double margin)
:m_target{ target }, m_margin{ margin } {
CATCH_ENFORCE(margin >= 0, "Invalid margin: " << margin << '.'
@@ -11121,10 +11514,11 @@ namespace Floating {
return "is within " + ::Catch::Detail::stringify(m_margin) + " of " + ::Catch::Detail::stringify(m_target);
}
- WithinUlpsMatcher::WithinUlpsMatcher(double target, int ulps, FloatingPointKind baseType)
+ WithinUlpsMatcher::WithinUlpsMatcher(double target, uint64_t ulps, FloatingPointKind baseType)
:m_target{ target }, m_ulps{ ulps }, m_type{ baseType } {
- CATCH_ENFORCE(ulps >= 0, "Invalid ULP setting: " << ulps << '.'
- << " ULPs have to be non-negative.");
+ CATCH_ENFORCE(m_type == FloatingPointKind::Double
+ || m_ulps < (std::numeric_limits<uint32_t>::max)(),
+ "Provided ULP is impossibly large for a float comparison.");
}
#if defined(__clang__)
@@ -11151,36 +11545,57 @@ namespace Floating {
std::string WithinUlpsMatcher::describe() const {
std::stringstream ret;
- ret << "is within " << m_ulps << " ULPs of " << ::Catch::Detail::stringify(m_target);
+ ret << "is within " << m_ulps << " ULPs of ";
if (m_type == FloatingPointKind::Float) {
+ write(ret, static_cast<float>(m_target));
ret << 'f';
+ } else {
+ write(ret, m_target);
}
ret << " ([";
- ret << std::fixed << std::setprecision(std::numeric_limits<double>::max_digits10);
if (m_type == FloatingPointKind::Double) {
- ret << step(m_target, static_cast<double>(-INFINITY), m_ulps)
- << ", "
- << step(m_target, static_cast<double>(INFINITY), m_ulps);
+ write(ret, step(m_target, static_cast<double>(-INFINITY), m_ulps));
+ ret << ", ";
+ write(ret, step(m_target, static_cast<double>( INFINITY), m_ulps));
} else {
- ret << step<float>(static_cast<float>(m_target), -INFINITY, m_ulps)
- << ", "
- << step<float>(static_cast<float>(m_target), INFINITY, m_ulps);
+ // We have to cast INFINITY to float because of MinGW, see #1782
+ write(ret, step(static_cast<float>(m_target), static_cast<float>(-INFINITY), m_ulps));
+ ret << ", ";
+ write(ret, step(static_cast<float>(m_target), static_cast<float>( INFINITY), m_ulps));
}
ret << "])";
return ret.str();
- //return "is within " + Catch::to_string(m_ulps) + " ULPs of " + ::Catch::Detail::stringify(m_target) + ((m_type == FloatingPointKind::Float)? "f" : "");
+ }
+
+ WithinRelMatcher::WithinRelMatcher(double target, double epsilon):
+ m_target(target),
+ m_epsilon(epsilon){
+ CATCH_ENFORCE(m_epsilon >= 0., "Relative comparison with epsilon < 0 does not make sense.");
+ CATCH_ENFORCE(m_epsilon < 1., "Relative comparison with epsilon >= 1 does not make sense.");
+ }
+
+ bool WithinRelMatcher::match(double const& matchee) const {
+ const auto relMargin = m_epsilon * (std::max)(std::fabs(matchee), std::fabs(m_target));
+ return marginComparison(matchee, m_target,
+ std::isinf(relMargin)? 0 : relMargin);
+ }
+
+ std::string WithinRelMatcher::describe() const {
+ Catch::ReusableStringStream sstr;
+ sstr << "and " << m_target << " are within " << m_epsilon * 100. << "% of each other";
+ return sstr.str();
}
}// namespace Floating
-Floating::WithinUlpsMatcher WithinULP(double target, int maxUlpDiff) {
+Floating::WithinUlpsMatcher WithinULP(double target, uint64_t maxUlpDiff) {
return Floating::WithinUlpsMatcher(target, maxUlpDiff, Floating::FloatingPointKind::Double);
}
-Floating::WithinUlpsMatcher WithinULP(float target, int maxUlpDiff) {
+Floating::WithinUlpsMatcher WithinULP(float target, uint64_t maxUlpDiff) {
return Floating::WithinUlpsMatcher(target, maxUlpDiff, Floating::FloatingPointKind::Float);
}
@@ -11188,6 +11603,22 @@ Floating::WithinAbsMatcher WithinAbs(double target, double margin) {
return Floating::WithinAbsMatcher(target, margin);
}
+Floating::WithinRelMatcher WithinRel(double target, double eps) {
+ return Floating::WithinRelMatcher(target, eps);
+}
+
+Floating::WithinRelMatcher WithinRel(double target) {
+ return Floating::WithinRelMatcher(target, std::numeric_limits<double>::epsilon() * 100);
+}
+
+Floating::WithinRelMatcher WithinRel(float target, float eps) {
+ return Floating::WithinRelMatcher(target, eps);
+}
+
+Floating::WithinRelMatcher WithinRel(float target) {
+ return Floating::WithinRelMatcher(target, std::numeric_limits<float>::epsilon() * 100);
+}
+
} // namespace Matchers
} // namespace Catch
@@ -11368,10 +11799,10 @@ namespace Catch {
Capturer::Capturer( StringRef macroName, SourceLineInfo const& lineInfo, ResultWas::OfType resultType, StringRef names ) {
auto trimmed = [&] (size_t start, size_t end) {
- while (names[start] == ',' || isspace(names[start])) {
+ while (names[start] == ',' || isspace(static_cast<unsigned char>(names[start]))) {
++start;
}
- while (names[end] == ',' || isspace(names[end])) {
+ while (names[end] == ',' || isspace(static_cast<unsigned char>(names[end]))) {
--end;
}
return names.substr(start, end - start + 1);
@@ -11410,17 +11841,17 @@ namespace Catch {
pos = skipq(pos, c);
break;
case ',':
- if (start != pos && openings.size() == 0) {
+ if (start != pos && openings.empty()) {
m_messages.emplace_back(macroName, lineInfo, resultType);
- m_messages.back().message = trimmed(start, pos);
+ m_messages.back().message = static_cast<std::string>(trimmed(start, pos));
m_messages.back().message += " := ";
start = pos;
}
}
}
- assert(openings.size() == 0 && "Mismatched openings");
+ assert(openings.empty() && "Mismatched openings");
m_messages.emplace_back(macroName, lineInfo, resultType);
- m_messages.back().message = trimmed(start, names.size() - 1);
+ m_messages.back().message = static_cast<std::string>(trimmed(start, names.size() - 1));
m_messages.back().message += " := ";
}
Capturer::~Capturer() {
@@ -11606,7 +12037,7 @@ namespace Catch {
if (tmpnam_s(m_buffer)) {
CATCH_RUNTIME_ERROR("Could not get a temp filename");
}
- if (fopen_s(&m_file, m_buffer, "w")) {
+ if (fopen_s(&m_file, m_buffer, "w+")) {
char buffer[100];
if (strerror_s(buffer, errno)) {
CATCH_RUNTIME_ERROR("Could not translate errno to a string");
@@ -11714,20 +12145,61 @@ namespace Catch {
namespace Catch {
- std::mt19937& rng() {
- static std::mt19937 s_rng;
- return s_rng;
+namespace {
+
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable:4146) // we negate uint32 during the rotate
+#endif
+ // Safe rotr implementation thanks to John Regehr
+ uint32_t rotate_right(uint32_t val, uint32_t count) {
+ const uint32_t mask = 31;
+ count &= mask;
+ return (val >> count) | (val << (-count & mask));
+ }
+
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif
+
+}
+
+ SimplePcg32::SimplePcg32(result_type seed_) {
+ seed(seed_);
+ }
+
+ void SimplePcg32::seed(result_type seed_) {
+ m_state = 0;
+ (*this)();
+ m_state += seed_;
+ (*this)();
}
- void seedRng( IConfig const& config ) {
- if( config.rngSeed() != 0 ) {
- std::srand( config.rngSeed() );
- rng().seed( config.rngSeed() );
+ void SimplePcg32::discard(uint64_t skip) {
+ // We could implement this to run in O(log n) steps, but this
+ // should suffice for our use case.
+ for (uint64_t s = 0; s < skip; ++s) {
+ static_cast<void>((*this)());
}
}
- unsigned int rngSeed() {
- return getCurrentContext().getConfig()->rngSeed();
+ SimplePcg32::result_type SimplePcg32::operator()() {
+ // prepare the output value
+ const uint32_t xorshifted = static_cast<uint32_t>(((m_state >> 18u) ^ m_state) >> 27u);
+ const auto output = rotate_right(xorshifted, m_state >> 59u);
+
+ // advance state
+ m_state = m_state * 6364136223846793005ULL + s_inc;
+
+ return output;
+ }
+
+ bool operator==(SimplePcg32 const& lhs, SimplePcg32 const& rhs) {
+ return lhs.m_state == rhs.m_state;
+ }
+
+ bool operator!=(SimplePcg32 const& lhs, SimplePcg32 const& rhs) {
+ return lhs.m_state != rhs.m_state;
}
}
// end catch_random_number_generator.cpp
@@ -11860,11 +12332,13 @@ namespace Catch {
namespace Catch {
class StartupExceptionRegistry {
+#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
public:
void add(std::exception_ptr const& exception) noexcept;
std::vector<std::exception_ptr> const& getExceptions() const noexcept;
private:
std::vector<std::exception_ptr> m_exceptions;
+#endif
};
} // end namespace Catch
@@ -11947,7 +12421,11 @@ namespace Catch {
m_tagAliasRegistry.add( alias, tag, lineInfo );
}
void registerStartupException() noexcept override {
+#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
m_exceptionRegistry.add(std::current_exception());
+#else
+ CATCH_INTERNAL_ERROR("Attempted to register active exception under CATCH_CONFIG_DISABLE_EXCEPTIONS!");
+#endif
}
IMutableEnumValuesRegistry& getMutableEnumValuesRegistry() override {
return m_enumValuesRegistry;
@@ -12051,17 +12529,32 @@ namespace Catch {
std::shared_ptr<GeneratorTracker> tracker;
ITracker& currentTracker = ctx.currentTracker();
- if( TestCaseTracking::ITrackerPtr childTracker = currentTracker.findChild( nameAndLocation ) ) {
+ // Under specific circumstances, the generator we want
+ // to acquire is also the current tracker. If this is
+ // the case, we have to avoid looking through current
+ // tracker's children, and instead return the current
+ // tracker.
+ // A case where this check is important is e.g.
+ // for (int i = 0; i < 5; ++i) {
+ // int n = GENERATE(1, 2);
+ // }
+ //
+ // without it, the code above creates 5 nested generators.
+ if (currentTracker.nameAndLocation() == nameAndLocation) {
+ auto thisTracker = currentTracker.parent().findChild(nameAndLocation);
+ assert(thisTracker);
+ assert(thisTracker->isGeneratorTracker());
+ tracker = std::static_pointer_cast<GeneratorTracker>(thisTracker);
+ } else if ( TestCaseTracking::ITrackerPtr childTracker = currentTracker.findChild( nameAndLocation ) ) {
assert( childTracker );
assert( childTracker->isGeneratorTracker() );
tracker = std::static_pointer_cast<GeneratorTracker>( childTracker );
- }
- else {
+ } else {
tracker = std::make_shared<GeneratorTracker>( nameAndLocation, ctx, &currentTracker );
currentTracker.addChild( tracker );
}
- if( !ctx.completedCycle() && !tracker->isComplete() ) {
+ if( !tracker->isComplete() ) {
tracker->open();
}
@@ -12075,8 +12568,68 @@ namespace Catch {
}
void close() override {
TrackerBase::close();
- // Generator interface only finds out if it has another item on atual move
- if (m_runState == CompletedSuccessfully && m_generator->next()) {
+ // If a generator has a child (it is followed by a section)
+ // and none of its children have started, then we must wait
+ // until later to start consuming its values.
+ // This catches cases where `GENERATE` is placed between two
+ // `SECTION`s.
+ // **The check for m_children.empty cannot be removed**.
+ // doing so would break `GENERATE` _not_ followed by `SECTION`s.
+ const bool should_wait_for_child = [&]() {
+ // No children -> nobody to wait for
+ if ( m_children.empty() ) {
+ return false;
+ }
+ // If at least one child started executing, don't wait
+ if ( std::find_if(
+ m_children.begin(),
+ m_children.end(),
+ []( TestCaseTracking::ITrackerPtr tracker ) {
+ return tracker->hasStarted();
+ } ) != m_children.end() ) {
+ return false;
+ }
+
+ // No children have started. We need to check if they _can_
+ // start, and thus we should wait for them, or they cannot
+ // start (due to filters), and we shouldn't wait for them
+ auto* parent = m_parent;
+ // This is safe: there is always at least one section
+ // tracker in a test case tracking tree
+ while ( !parent->isSectionTracker() ) {
+ parent = &( parent->parent() );
+ }
+ assert( parent &&
+ "Missing root (test case) level section" );
+
+ auto const& parentSection =
+ static_cast<SectionTracker&>( *parent );
+ auto const& filters = parentSection.getFilters();
+ // No filters -> no restrictions on running sections
+ if ( filters.empty() ) {
+ return true;
+ }
+
+ for ( auto const& child : m_children ) {
+ if ( child->isSectionTracker() &&
+ std::find( filters.begin(),
+ filters.end(),
+ static_cast<SectionTracker&>( *child )
+ .trimmedName() ) !=
+ filters.end() ) {
+ return true;
+ }
+ }
+ return false;
+ }();
+
+ // This check is a bit tricky, because m_generator->next()
+ // has a side-effect, where it consumes generator's current
+ // value, but we do not want to invoke the side-effect if
+ // this generator is still waiting for any child to start.
+ if ( should_wait_for_child ||
+ ( m_runState == CompletedSuccessfully &&
+ m_generator->next() ) ) {
m_children.clear();
m_runState = Executing;
}
@@ -12212,10 +12765,10 @@ namespace Catch {
return true;
}
- auto RunContext::acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& {
+ auto RunContext::acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& {
using namespace Generators;
- GeneratorTracker& tracker = GeneratorTracker::acquire( m_trackerContext, TestCaseTracking::NameAndLocation( "generator", lineInfo ) );
- assert( tracker.isOpen() );
+ GeneratorTracker& tracker = GeneratorTracker::acquire(m_trackerContext,
+ TestCaseTracking::NameAndLocation( static_cast<std::string>(generatorName), lineInfo ) );
m_lastAssertionInfo.lineInfo = lineInfo;
return tracker;
}
@@ -12258,17 +12811,17 @@ namespace Catch {
#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
void RunContext::benchmarkPreparing(std::string const& name) {
- m_reporter->benchmarkPreparing(name);
- }
+ m_reporter->benchmarkPreparing(name);
+ }
void RunContext::benchmarkStarting( BenchmarkInfo const& info ) {
m_reporter->benchmarkStarting( info );
}
void RunContext::benchmarkEnded( BenchmarkStats<> const& stats ) {
m_reporter->benchmarkEnded( stats );
}
- void RunContext::benchmarkFailed(std::string const & error) {
- m_reporter->benchmarkFailed(error);
- }
+ void RunContext::benchmarkFailed(std::string const & error) {
+ m_reporter->benchmarkFailed(error);
+ }
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING
void RunContext::pushScopedMessage(MessageInfo const & message) {
@@ -12304,7 +12857,7 @@ namespace Catch {
// Don't rebuild the result -- the stringification itself can cause more fatal errors
// Instead, fake a result data.
AssertionResultData tempResult( ResultWas::FatalErrorCondition, { false } );
- tempResult.message = message;
+ tempResult.message = static_cast<std::string>(message);
AssertionResult result(m_lastAssertionInfo, tempResult);
assertionEnded(result);
@@ -12467,7 +13020,7 @@ namespace Catch {
m_lastAssertionInfo = info;
AssertionResultData data( resultType, LazyExpression( false ) );
- data.message = message;
+ data.message = static_cast<std::string>(message);
AssertionResult assertionResult{ m_lastAssertionInfo, data };
assertionEnded( assertionResult );
if( !assertionResult.isOk() )
@@ -12530,6 +13083,18 @@ namespace Catch {
else
CATCH_INTERNAL_ERROR("No result capture instance");
}
+
+ void seedRng(IConfig const& config) {
+ if (config.rngSeed() != 0) {
+ std::srand(config.rngSeed());
+ rng().seed(config.rngSeed());
+ }
+ }
+
+ unsigned int rngSeed() {
+ return getCurrentContext().getConfig()->rngSeed();
+ }
+
}
// end catch_run_context.cpp
// start catch_section.cpp
@@ -12701,8 +13266,9 @@ namespace Catch {
{
auto const& allTestCases = getAllTestCasesSorted(*m_config);
m_matches = m_config->testSpec().matchesByFilter(allTestCases, *m_config);
+ auto const& invalidArgs = m_config->testSpec().getInvalidArgs();
- if (m_matches.empty()) {
+ if (m_matches.empty() && invalidArgs.empty()) {
for (auto const& test : allTestCases)
if (!test.isHidden())
m_tests.emplace(&test);
@@ -12713,6 +13279,7 @@ namespace Catch {
}
Totals execute() {
+ auto const& invalidArgs = m_config->testSpec().getInvalidArgs();
Totals totals;
m_context.testGroupStarting(m_config->name(), 1, 1);
for (auto const& testCase : m_tests) {
@@ -12728,6 +13295,12 @@ namespace Catch {
totals.error = -1;
}
}
+
+ if (!invalidArgs.empty()) {
+ for (auto const& invalidArg: invalidArgs)
+ m_context.reporter().reportInvalidArguments(invalidArg);
+ }
+
m_context.testGroupEnded(m_config->name(), totals, 1, 1);
return totals;
}
@@ -12808,7 +13381,7 @@ namespace Catch {
}
void Session::libIdentify() {
Catch::cout()
- << std::left << std::setw(16) << "description: " << "A Catch test executable\n"
+ << std::left << std::setw(16) << "description: " << "A Catch2 test executable\n"
<< std::left << std::setw(16) << "category: " << "testframework\n"
<< std::left << std::setw(16) << "framework: " << "Catch Test\n"
<< std::left << std::setw(16) << "version: " << libraryVersion() << std::endl;
@@ -12845,11 +13418,11 @@ namespace Catch {
char **utf8Argv = new char *[ argc ];
for ( int i = 0; i < argc; ++i ) {
- int bufSize = WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, NULL, 0, NULL, NULL );
+ int bufSize = WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, nullptr, 0, nullptr, nullptr );
utf8Argv[ i ] = new char[ bufSize ];
- WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, utf8Argv[i], bufSize, NULL, NULL );
+ WideCharToMultiByte( CP_UTF8, 0, argv[i], -1, utf8Argv[i], bufSize, nullptr, nullptr );
}
int returnCode = applyCommandLine( argc, utf8Argv );
@@ -12969,6 +13542,7 @@ namespace Catch {
// end catch_singletons.cpp
// start catch_startup_exception_registry.cpp
+#if !defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
namespace Catch {
void StartupExceptionRegistry::add( std::exception_ptr const& exception ) noexcept {
CATCH_TRY {
@@ -12984,6 +13558,7 @@ void StartupExceptionRegistry::add( std::exception_ptr const& exception ) noexce
}
} // end namespace Catch
+#endif
// end catch_startup_exception_registry.cpp
// start catch_stream.cpp
@@ -13168,7 +13743,7 @@ namespace Catch {
namespace {
char toLowerCh(char c) {
- return static_cast<char>( std::tolower( c ) );
+ return static_cast<char>( std::tolower( static_cast<unsigned char>(c) ) );
}
}
@@ -13203,6 +13778,18 @@ namespace Catch {
return start != std::string::npos ? str.substr( start, 1+end-start ) : std::string();
}
+ StringRef trim(StringRef ref) {
+ const auto is_ws = [](char c) {
+ return c == ' ' || c == '\t' || c == '\n' || c == '\r';
+ };
+ size_t real_begin = 0;
+ while (real_begin < ref.size() && is_ws(ref[real_begin])) { ++real_begin; }
+ size_t real_end = ref.size();
+ while (real_end > real_begin && is_ws(ref[real_end - 1])) { --real_end; }
+
+ return ref.substr(real_begin, real_end - real_begin);
+ }
+
bool replaceInPlace( std::string& str, std::string const& replaceThis, std::string const& withThis ) {
bool replaced = false;
std::size_t i = str.find( replaceThis );
@@ -13248,124 +13835,46 @@ namespace Catch {
// end catch_string_manip.cpp
// start catch_stringref.cpp
-#if defined(__clang__)
-# pragma clang diagnostic push
-# pragma clang diagnostic ignored "-Wexit-time-destructors"
-#endif
-
+#include <algorithm>
#include <ostream>
#include <cstring>
#include <cstdint>
-namespace {
- const uint32_t byte_2_lead = 0xC0;
- const uint32_t byte_3_lead = 0xE0;
- const uint32_t byte_4_lead = 0xF0;
-}
-
namespace Catch {
StringRef::StringRef( char const* rawChars ) noexcept
: StringRef( rawChars, static_cast<StringRef::size_type>(std::strlen(rawChars) ) )
{}
- StringRef::operator std::string() const {
- return std::string( m_start, m_size );
- }
-
- void StringRef::swap( StringRef& other ) noexcept {
- std::swap( m_start, other.m_start );
- std::swap( m_size, other.m_size );
- std::swap( m_data, other.m_data );
- }
-
auto StringRef::c_str() const -> char const* {
- if( !isSubstring() )
- return m_start;
-
- const_cast<StringRef *>( this )->takeOwnership();
- return m_data;
- }
- auto StringRef::currentData() const noexcept -> char const* {
+ CATCH_ENFORCE(isNullTerminated(), "Called StringRef::c_str() on a non-null-terminated instance");
return m_start;
}
-
- auto StringRef::isOwned() const noexcept -> bool {
- return m_data != nullptr;
- }
- auto StringRef::isSubstring() const noexcept -> bool {
- return m_start[m_size] != '\0';
+ auto StringRef::data() const noexcept -> char const* {
+ return m_start;
}
- void StringRef::takeOwnership() {
- if( !isOwned() ) {
- m_data = new char[m_size+1];
- memcpy( m_data, m_start, m_size );
- m_data[m_size] = '\0';
- }
- }
auto StringRef::substr( size_type start, size_type size ) const noexcept -> StringRef {
- if( start < m_size )
- return StringRef( m_start+start, size );
- else
+ if (start < m_size) {
+ return StringRef(m_start + start, (std::min)(m_size - start, size));
+ } else {
return StringRef();
- }
- auto StringRef::operator == ( StringRef const& other ) const noexcept -> bool {
- return
- size() == other.size() &&
- (std::strncmp( m_start, other.m_start, size() ) == 0);
- }
- auto StringRef::operator != ( StringRef const& other ) const noexcept -> bool {
- return !operator==( other );
- }
-
- auto StringRef::operator[](size_type index) const noexcept -> char {
- return m_start[index];
- }
-
- auto StringRef::numberOfCharacters() const noexcept -> size_type {
- size_type noChars = m_size;
- // Make adjustments for uft encodings
- for( size_type i=0; i < m_size; ++i ) {
- char c = m_start[i];
- if( ( c & byte_2_lead ) == byte_2_lead ) {
- noChars--;
- if (( c & byte_3_lead ) == byte_3_lead )
- noChars--;
- if( ( c & byte_4_lead ) == byte_4_lead )
- noChars--;
- }
}
- return noChars;
}
-
- auto operator + ( StringRef const& lhs, StringRef const& rhs ) -> std::string {
- std::string str;
- str.reserve( lhs.size() + rhs.size() );
- str += lhs;
- str += rhs;
- return str;
- }
- auto operator + ( StringRef const& lhs, const char* rhs ) -> std::string {
- return std::string( lhs ) + std::string( rhs );
- }
- auto operator + ( char const* lhs, StringRef const& rhs ) -> std::string {
- return std::string( lhs ) + std::string( rhs );
+ auto StringRef::operator == ( StringRef const& other ) const noexcept -> bool {
+ return m_size == other.m_size
+ && (std::memcmp( m_start, other.m_start, m_size ) == 0);
}
auto operator << ( std::ostream& os, StringRef const& str ) -> std::ostream& {
- return os.write(str.currentData(), str.size());
+ return os.write(str.data(), str.size());
}
auto operator+=( std::string& lhs, StringRef const& rhs ) -> std::string& {
- lhs.append(rhs.currentData(), rhs.size());
+ lhs.append(rhs.data(), rhs.size());
return lhs;
}
} // namespace Catch
-
-#if defined(__clang__)
-# pragma clang diagnostic pop
-#endif
// end catch_stringref.cpp
// start catch_tag_alias.cpp
@@ -13484,8 +13993,7 @@ namespace Catch {
std::vector<std::string> tags;
std::string desc, tag;
bool inTag = false;
- std::string _descOrTags = nameAndTags.tags;
- for (char c : _descOrTags) {
+ for (char c : nameAndTags.tags) {
if( !inTag ) {
if( c == '[' )
inTag = true;
@@ -13515,10 +14023,11 @@ namespace Catch {
}
}
if( isHidden ) {
- tags.push_back( "." );
+ // Add all "hidden" tags to make them behave identically
+ tags.insert( tags.end(), { ".", "!hide" } );
}
- TestCaseInfo info( nameAndTags.name, _className, desc, tags, _lineInfo );
+ TestCaseInfo info( static_cast<std::string>(nameAndTags.name), _className, desc, tags, _lineInfo );
return TestCase( _testCase, std::move(info) );
}
@@ -13610,27 +14119,77 @@ namespace Catch {
// end catch_test_case_info.cpp
// start catch_test_case_registry_impl.cpp
+#include <algorithm>
#include <sstream>
namespace Catch {
- std::vector<TestCase> sortTests( IConfig const& config, std::vector<TestCase> const& unsortedTestCases ) {
+ namespace {
+ struct TestHasher {
+ explicit TestHasher(Catch::SimplePcg32& rng_instance) {
+ basis = rng_instance();
+ basis <<= 32;
+ basis |= rng_instance();
+ }
+
+ uint64_t basis;
- std::vector<TestCase> sorted = unsortedTestCases;
+ uint64_t operator()(TestCase const& t) const {
+ // Modified FNV-1a hash
+ static constexpr uint64_t prime = 1099511628211;
+ uint64_t hash = basis;
+ for (const char c : t.name) {
+ hash ^= c;
+ hash *= prime;
+ }
+ return hash;
+ }
+ };
+ } // end unnamed namespace
+ std::vector<TestCase> sortTests( IConfig const& config, std::vector<TestCase> const& unsortedTestCases ) {
switch( config.runOrder() ) {
- case RunTests::InLexicographicalOrder:
- std::sort( sorted.begin(), sorted.end() );
- break;
- case RunTests::InRandomOrder:
- seedRng( config );
- std::shuffle( sorted.begin(), sorted.end(), rng() );
- break;
case RunTests::InDeclarationOrder:
// already in declaration order
break;
+
+ case RunTests::InLexicographicalOrder: {
+ std::vector<TestCase> sorted = unsortedTestCases;
+ std::sort( sorted.begin(), sorted.end() );
+ return sorted;
+ }
+
+ case RunTests::InRandomOrder: {
+ seedRng( config );
+ TestHasher h( rng() );
+
+ using hashedTest = std::pair<uint64_t, TestCase const*>;
+ std::vector<hashedTest> indexed_tests;
+ indexed_tests.reserve( unsortedTestCases.size() );
+
+ for (auto const& testCase : unsortedTestCases) {
+ indexed_tests.emplace_back(h(testCase), &testCase);
+ }
+
+ std::sort(indexed_tests.begin(), indexed_tests.end(),
+ [](hashedTest const& lhs, hashedTest const& rhs) {
+ if (lhs.first == rhs.first) {
+ return lhs.second->name < rhs.second->name;
+ }
+ return lhs.first < rhs.first;
+ });
+
+ std::vector<TestCase> sorted;
+ sorted.reserve( indexed_tests.size() );
+
+ for (auto const& hashed : indexed_tests) {
+ sorted.emplace_back(*hashed.second);
+ }
+
+ return sorted;
+ }
}
- return sorted;
+ return unsortedTestCases;
}
bool isThrowSafe( TestCase const& testCase, IConfig const& config ) {
@@ -13699,7 +14258,7 @@ namespace Catch {
}
std::string extractClassName( StringRef const& classOrQualifiedMethodName ) {
- std::string className = classOrQualifiedMethodName;
+ std::string className(classOrQualifiedMethodName);
if( startsWith( className, '&' ) )
{
std::size_t lastColons = className.rfind( "::" );
@@ -13767,15 +14326,12 @@ namespace TestCaseTracking {
m_currentTracker = tracker;
}
- TrackerBase::TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent )
- : m_nameAndLocation( nameAndLocation ),
+ TrackerBase::TrackerBase( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent ):
+ ITracker(nameAndLocation),
m_ctx( ctx ),
m_parent( parent )
{}
- NameAndLocation const& TrackerBase::nameAndLocation() const {
- return m_nameAndLocation;
- }
bool TrackerBase::isComplete() const {
return m_runState == CompletedSuccessfully || m_runState == Failed;
}
@@ -13876,7 +14432,8 @@ namespace TestCaseTracking {
}
SectionTracker::SectionTracker( NameAndLocation const& nameAndLocation, TrackerContext& ctx, ITracker* parent )
- : TrackerBase( nameAndLocation, ctx, parent )
+ : TrackerBase( nameAndLocation, ctx, parent ),
+ m_trimmed_name(trim(nameAndLocation.name))
{
if( parent ) {
while( !parent->isSectionTracker() )
@@ -13890,12 +14447,12 @@ namespace TestCaseTracking {
bool SectionTracker::isComplete() const {
bool complete = true;
- if ((m_filters.empty() || m_filters[0] == "") ||
- std::find(m_filters.begin(), m_filters.end(),
- m_nameAndLocation.name) != m_filters.end())
+ if (m_filters.empty()
+ || m_filters[0] == ""
+ || std::find(m_filters.begin(), m_filters.end(), m_trimmed_name) != m_filters.end()) {
complete = TrackerBase::isComplete();
+ }
return complete;
-
}
bool SectionTracker::isSectionTracker() const { return true; }
@@ -13919,20 +14476,29 @@ namespace TestCaseTracking {
}
void SectionTracker::tryOpen() {
- if( !isComplete() && (m_filters.empty() || m_filters[0].empty() || m_filters[0] == m_nameAndLocation.name ) )
+ if( !isComplete() )
open();
}
void SectionTracker::addInitialFilters( std::vector<std::string> const& filters ) {
if( !filters.empty() ) {
- m_filters.push_back(""); // Root - should never be consulted
- m_filters.push_back(""); // Test Case - not a section filter
+ m_filters.reserve( m_filters.size() + filters.size() + 2 );
+ m_filters.emplace_back(""); // Root - should never be consulted
+ m_filters.emplace_back(""); // Test Case - not a section filter
m_filters.insert( m_filters.end(), filters.begin(), filters.end() );
}
}
void SectionTracker::addNextFilters( std::vector<std::string> const& filters ) {
if( filters.size() > 1 )
- m_filters.insert( m_filters.end(), ++filters.begin(), filters.end() );
+ m_filters.insert( m_filters.end(), filters.begin()+1, filters.end() );
+ }
+
+ std::vector<std::string> const& SectionTracker::getFilters() const {
+ return m_filters;
+ }
+
+ std::string const& SectionTracker::trimmedName() const {
+ return m_trimmed_name;
}
} // namespace TestCaseTracking
@@ -14000,7 +14566,7 @@ namespace Catch {
{}
bool TestSpec::NamePattern::matches( TestCaseInfo const& testCase ) const {
- return m_wildcardPattern.matches( toLower( testCase.name ) );
+ return m_wildcardPattern.matches( testCase.name );
}
TestSpec::TagPattern::TagPattern( std::string const& tag, std::string const& filterString )
@@ -14055,6 +14621,10 @@ namespace Catch {
return matches;
}
+ const TestSpec::vectorStrings& TestSpec::getInvalidArgs() const{
+ return (m_invalidArgs);
+ }
+
}
// end catch_test_spec.cpp
// start catch_test_spec_parser.cpp
@@ -14070,8 +14640,14 @@ namespace Catch {
m_escapeChars.clear();
m_substring.reserve(m_arg.size());
m_patternName.reserve(m_arg.size());
+ m_realPatternPos = 0;
+
for( m_pos = 0; m_pos < m_arg.size(); ++m_pos )
- visitChar( m_arg[m_pos] );
+ //if visitChar fails
+ if( !visitChar( m_arg[m_pos] ) ){
+ m_testSpec.m_invalidArgs.push_back(arg);
+ break;
+ }
endMode();
return *this;
}
@@ -14079,35 +14655,41 @@ namespace Catch {
addFilter();
return m_testSpec;
}
- void TestSpecParser::visitChar( char c ) {
- if( c == ',' ) {
- endMode();
- addFilter();
- return;
+ bool TestSpecParser::visitChar( char c ) {
+ if( (m_mode != EscapedName) && (c == '\\') ) {
+ escape();
+ addCharToPattern(c);
+ return true;
+ }else if((m_mode != EscapedName) && (c == ',') ) {
+ return separate();
}
switch( m_mode ) {
case None:
if( processNoneChar( c ) )
- return;
+ return true;
break;
case Name:
processNameChar( c );
break;
case EscapedName:
endMode();
- break;
+ addCharToPattern(c);
+ return true;
default:
case Tag:
case QuotedName:
if( processOtherChar( c ) )
- return;
+ return true;
break;
}
m_substring += c;
- if( !isControlChar( c ) )
+ if( !isControlChar( c ) ) {
m_patternName += c;
+ m_realPatternPos++;
+ }
+ return true;
}
// Two of the processing methods return true to signal the caller to return
// without adding the given character to the current pattern strings
@@ -14124,9 +14706,6 @@ namespace Catch {
case '"':
startNewMode( QuotedName );
return false;
- case '\\':
- escape();
- return true;
default:
startNewMode( Name );
return false;
@@ -14155,19 +14734,21 @@ namespace Catch {
switch( m_mode ) {
case Name:
case QuotedName:
- return addPattern<TestSpec::NamePattern>();
+ return addNamePattern();
case Tag:
- return addPattern<TestSpec::TagPattern>();
+ return addTagPattern();
case EscapedName:
- return startNewMode( Name );
+ revertBackToLastMode();
+ return;
case None:
default:
return startNewMode( None );
}
}
void TestSpecParser::escape() {
+ saveLastMode();
m_mode = EscapedName;
- m_escapeChars.push_back( m_pos );
+ m_escapeChars.push_back(m_realPatternPos);
}
bool TestSpecParser::isControlChar( char c ) const {
switch( m_mode ) {
@@ -14193,6 +14774,86 @@ namespace Catch {
}
}
+ void TestSpecParser::saveLastMode() {
+ lastMode = m_mode;
+ }
+
+ void TestSpecParser::revertBackToLastMode() {
+ m_mode = lastMode;
+ }
+
+ bool TestSpecParser::separate() {
+ if( (m_mode==QuotedName) || (m_mode==Tag) ){
+ //invalid argument, signal failure to previous scope.
+ m_mode = None;
+ m_pos = m_arg.size();
+ m_substring.clear();
+ m_patternName.clear();
+ m_realPatternPos = 0;
+ return false;
+ }
+ endMode();
+ addFilter();
+ return true; //success
+ }
+
+ std::string TestSpecParser::preprocessPattern() {
+ std::string token = m_patternName;
+ for (std::size_t i = 0; i < m_escapeChars.size(); ++i)
+ token = token.substr(0, m_escapeChars[i] - i) + token.substr(m_escapeChars[i] - i + 1);
+ m_escapeChars.clear();
+ if (startsWith(token, "exclude:")) {
+ m_exclusion = true;
+ token = token.substr(8);
+ }
+
+ m_patternName.clear();
+ m_realPatternPos = 0;
+
+ return token;
+ }
+
+ void TestSpecParser::addNamePattern() {
+ auto token = preprocessPattern();
+
+ if (!token.empty()) {
+ TestSpec::PatternPtr pattern = std::make_shared<TestSpec::NamePattern>(token, m_substring);
+ if (m_exclusion)
+ pattern = std::make_shared<TestSpec::ExcludedPattern>(pattern);
+ m_currentFilter.m_patterns.push_back(pattern);
+ }
+ m_substring.clear();
+ m_exclusion = false;
+ m_mode = None;
+ }
+
+ void TestSpecParser::addTagPattern() {
+ auto token = preprocessPattern();
+
+ if (!token.empty()) {
+ // If the tag pattern is the "hide and tag" shorthand (e.g. [.foo])
+ // we have to create a separate hide tag and shorten the real one
+ if (token.size() > 1 && token[0] == '.') {
+ token.erase(token.begin());
+ TestSpec::PatternPtr pattern = std::make_shared<TestSpec::TagPattern>(".", m_substring);
+ if (m_exclusion) {
+ pattern = std::make_shared<TestSpec::ExcludedPattern>(pattern);
+ }
+ m_currentFilter.m_patterns.push_back(pattern);
+ }
+
+ TestSpec::PatternPtr pattern = std::make_shared<TestSpec::TagPattern>(token, m_substring);
+
+ if (m_exclusion) {
+ pattern = std::make_shared<TestSpec::ExcludedPattern>(pattern);
+ }
+ m_currentFilter.m_patterns.push_back(pattern);
+ }
+ m_substring.clear();
+ m_exclusion = false;
+ m_mode = None;
+ }
+
TestSpec parseTestSpec( std::string const& arg ) {
return TestSpecParser( ITagAliasRegistry::get() ).parse( arg ).testSpec();
}
@@ -14294,13 +14955,11 @@ namespace Detail {
enum Arch { Big, Little };
static Arch which() {
- union _{
- int asInt;
- char asChar[sizeof (int)];
- } u;
-
- u.asInt = 1;
- return ( u.asChar[sizeof(int)-1] == 1 ) ? Big : Little;
+ int one = 1;
+ // If the lowest byte we read is non-zero, we can assume
+ // that little endian format is used.
+ auto value = *reinterpret_cast<char*>(&one);
+ return value ? Little : Big;
}
};
}
@@ -14576,11 +15235,48 @@ namespace Catch {
// end catch_totals.cpp
// start catch_uncaught_exceptions.cpp
+// start catch_config_uncaught_exceptions.hpp
+
+// Copyright Catch2 Authors
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// https://www.boost.org/LICENSE_1_0.txt)
+
+// SPDX-License-Identifier: BSL-1.0
+
+#ifndef CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP
+#define CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP
+
+#if defined(_MSC_VER)
+# if _MSC_VER >= 1900 // Visual Studio 2015 or newer
+# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS
+# endif
+#endif
+
+#include <exception>
+
+#if defined(__cpp_lib_uncaught_exceptions) \
+ && !defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS)
+
+# define CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS
+#endif // __cpp_lib_uncaught_exceptions
+
+#if defined(CATCH_INTERNAL_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS) \
+ && !defined(CATCH_CONFIG_NO_CPP17_UNCAUGHT_EXCEPTIONS) \
+ && !defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS)
+
+# define CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS
+#endif
+
+#endif // CATCH_CONFIG_UNCAUGHT_EXCEPTIONS_HPP
+// end catch_config_uncaught_exceptions.hpp
#include <exception>
namespace Catch {
bool uncaught_exceptions() {
-#if defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS)
+#if defined(CATCH_CONFIG_DISABLE_EXCEPTIONS)
+ return false;
+#elif defined(CATCH_CONFIG_CPP17_UNCAUGHT_EXCEPTIONS)
return std::uncaught_exceptions() > 0;
#else
return std::uncaught_exception();
@@ -14620,7 +15316,7 @@ namespace Catch {
}
Version const& libraryVersion() {
- static Version version( 2, 9, 2, "", 0 );
+ static Version version( 2, 13, 3, "", 0 );
return version;
}
@@ -14628,14 +15324,12 @@ namespace Catch {
// end catch_version.cpp
// start catch_wildcard_pattern.cpp
-#include <sstream>
-
namespace Catch {
WildcardPattern::WildcardPattern( std::string const& pattern,
CaseSensitive::Choice caseSensitivity )
: m_caseSensitivity( caseSensitivity ),
- m_pattern( adjustCase( pattern ) )
+ m_pattern( normaliseString( pattern ) )
{
if( startsWith( m_pattern, '*' ) ) {
m_pattern = m_pattern.substr( 1 );
@@ -14650,28 +15344,27 @@ namespace Catch {
bool WildcardPattern::matches( std::string const& str ) const {
switch( m_wildcard ) {
case NoWildcard:
- return m_pattern == adjustCase( str );
+ return m_pattern == normaliseString( str );
case WildcardAtStart:
- return endsWith( adjustCase( str ), m_pattern );
+ return endsWith( normaliseString( str ), m_pattern );
case WildcardAtEnd:
- return startsWith( adjustCase( str ), m_pattern );
+ return startsWith( normaliseString( str ), m_pattern );
case WildcardAtBothEnds:
- return contains( adjustCase( str ), m_pattern );
+ return contains( normaliseString( str ), m_pattern );
default:
CATCH_INTERNAL_ERROR( "Unknown enum" );
}
}
- std::string WildcardPattern::adjustCase( std::string const& str ) const {
- return m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str;
+ std::string WildcardPattern::normaliseString( std::string const& str ) const {
+ return trim( m_caseSensitivity == CaseSensitive::No ? toLower( str ) : str );
}
}
// end catch_wildcard_pattern.cpp
// start catch_xmlwriter.cpp
#include <iomanip>
-
-using uchar = unsigned char;
+#include <type_traits>
namespace Catch {
@@ -14711,8 +15404,30 @@ namespace {
os.flags(f);
}
+ bool shouldNewline(XmlFormatting fmt) {
+ return !!(static_cast<std::underlying_type<XmlFormatting>::type>(fmt & XmlFormatting::Newline));
+ }
+
+ bool shouldIndent(XmlFormatting fmt) {
+ return !!(static_cast<std::underlying_type<XmlFormatting>::type>(fmt & XmlFormatting::Indent));
+ }
+
} // anonymous namespace
+ XmlFormatting operator | (XmlFormatting lhs, XmlFormatting rhs) {
+ return static_cast<XmlFormatting>(
+ static_cast<std::underlying_type<XmlFormatting>::type>(lhs) |
+ static_cast<std::underlying_type<XmlFormatting>::type>(rhs)
+ );
+ }
+
+ XmlFormatting operator & (XmlFormatting lhs, XmlFormatting rhs) {
+ return static_cast<XmlFormatting>(
+ static_cast<std::underlying_type<XmlFormatting>::type>(lhs) &
+ static_cast<std::underlying_type<XmlFormatting>::type>(rhs)
+ );
+ }
+
XmlEncode::XmlEncode( std::string const& str, ForWhat forWhat )
: m_str( str ),
m_forWhat( forWhat )
@@ -14723,7 +15438,7 @@ namespace {
// (see: http://www.w3.org/TR/xml/#syntax)
for( std::size_t idx = 0; idx < m_str.size(); ++ idx ) {
- uchar c = m_str[idx];
+ unsigned char c = m_str[idx];
switch (c) {
case '<': os << "&lt;"; break;
case '&': os << "&amp;"; break;
@@ -14783,7 +15498,7 @@ namespace {
bool valid = true;
uint32_t value = headerValue(c);
for (std::size_t n = 1; n < encBytes; ++n) {
- uchar nc = m_str[idx + n];
+ unsigned char nc = m_str[idx + n];
valid &= ((nc & 0xC0) == 0x80);
value = (value << 6) | (nc & 0x3F);
}
@@ -14817,13 +15532,17 @@ namespace {
return os;
}
- XmlWriter::ScopedElement::ScopedElement( XmlWriter* writer )
- : m_writer( writer )
+ XmlWriter::ScopedElement::ScopedElement( XmlWriter* writer, XmlFormatting fmt )
+ : m_writer( writer ),
+ m_fmt(fmt)
{}
XmlWriter::ScopedElement::ScopedElement( ScopedElement&& other ) noexcept
- : m_writer( other.m_writer ){
+ : m_writer( other.m_writer ),
+ m_fmt(other.m_fmt)
+ {
other.m_writer = nullptr;
+ other.m_fmt = XmlFormatting::None;
}
XmlWriter::ScopedElement& XmlWriter::ScopedElement::operator=( ScopedElement&& other ) noexcept {
if ( m_writer ) {
@@ -14831,16 +15550,19 @@ namespace {
}
m_writer = other.m_writer;
other.m_writer = nullptr;
+ m_fmt = other.m_fmt;
+ other.m_fmt = XmlFormatting::None;
return *this;
}
XmlWriter::ScopedElement::~ScopedElement() {
- if( m_writer )
- m_writer->endElement();
+ if (m_writer) {
+ m_writer->endElement(m_fmt);
+ }
}
- XmlWriter::ScopedElement& XmlWriter::ScopedElement::writeText( std::string const& text, bool indent ) {
- m_writer->writeText( text, indent );
+ XmlWriter::ScopedElement& XmlWriter::ScopedElement::writeText( std::string const& text, XmlFormatting fmt ) {
+ m_writer->writeText( text, fmt );
return *this;
}
@@ -14850,37 +15572,47 @@ namespace {
}
XmlWriter::~XmlWriter() {
- while( !m_tags.empty() )
+ while (!m_tags.empty()) {
endElement();
+ }
+ newlineIfNecessary();
}
- XmlWriter& XmlWriter::startElement( std::string const& name ) {
+ XmlWriter& XmlWriter::startElement( std::string const& name, XmlFormatting fmt ) {
ensureTagClosed();
newlineIfNecessary();
- m_os << m_indent << '<' << name;
+ if (shouldIndent(fmt)) {
+ m_os << m_indent;
+ m_indent += " ";
+ }
+ m_os << '<' << name;
m_tags.push_back( name );
- m_indent += " ";
m_tagIsOpen = true;
+ applyFormatting(fmt);
return *this;
}
- XmlWriter::ScopedElement XmlWriter::scopedElement( std::string const& name ) {
- ScopedElement scoped( this );
- startElement( name );
+ XmlWriter::ScopedElement XmlWriter::scopedElement( std::string const& name, XmlFormatting fmt ) {
+ ScopedElement scoped( this, fmt );
+ startElement( name, fmt );
return scoped;
}
- XmlWriter& XmlWriter::endElement() {
- newlineIfNecessary();
- m_indent = m_indent.substr( 0, m_indent.size()-2 );
+ XmlWriter& XmlWriter::endElement(XmlFormatting fmt) {
+ m_indent = m_indent.substr(0, m_indent.size() - 2);
+
if( m_tagIsOpen ) {
m_os << "/>";
m_tagIsOpen = false;
+ } else {
+ newlineIfNecessary();
+ if (shouldIndent(fmt)) {
+ m_os << m_indent;
+ }
+ m_os << "</" << m_tags.back() << ">";
}
- else {
- m_os << m_indent << "</" << m_tags.back() << ">";
- }
- m_os << std::endl;
+ m_os << std::flush;
+ applyFormatting(fmt);
m_tags.pop_back();
return *this;
}
@@ -14896,22 +15628,26 @@ namespace {
return *this;
}
- XmlWriter& XmlWriter::writeText( std::string const& text, bool indent ) {
+ XmlWriter& XmlWriter::writeText( std::string const& text, XmlFormatting fmt) {
if( !text.empty() ){
bool tagWasOpen = m_tagIsOpen;
ensureTagClosed();
- if( tagWasOpen && indent )
+ if (tagWasOpen && shouldIndent(fmt)) {
m_os << m_indent;
+ }
m_os << XmlEncode( text );
- m_needsNewline = true;
+ applyFormatting(fmt);
}
return *this;
}
- XmlWriter& XmlWriter::writeComment( std::string const& text ) {
+ XmlWriter& XmlWriter::writeComment( std::string const& text, XmlFormatting fmt) {
ensureTagClosed();
- m_os << m_indent << "<!--" << text << "-->";
- m_needsNewline = true;
+ if (shouldIndent(fmt)) {
+ m_os << m_indent;
+ }
+ m_os << "<!--" << text << "-->";
+ applyFormatting(fmt);
return *this;
}
@@ -14927,11 +15663,16 @@ namespace {
void XmlWriter::ensureTagClosed() {
if( m_tagIsOpen ) {
- m_os << ">" << std::endl;
+ m_os << '>' << std::flush;
+ newlineIfNecessary();
m_tagIsOpen = false;
}
}
+ void XmlWriter::applyFormatting(XmlFormatting fmt) {
+ m_needsNewline = shouldNewline(fmt);
+ }
+
void XmlWriter::writeDeclaration() {
m_os << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
}
@@ -14977,6 +15718,17 @@ namespace Catch {
return std::string(buffer);
}
+ bool shouldShowDuration( IConfig const& config, double duration ) {
+ if ( config.showDurations() == ShowDurations::Always ) {
+ return true;
+ }
+ if ( config.showDurations() == ShowDurations::Never ) {
+ return false;
+ }
+ const double min = config.minDuration();
+ return min >= 0 && duration >= min;
+ }
+
std::string serializeFilters( std::vector<std::string> const& container ) {
ReusableStringStream oss;
bool first = true;
@@ -15243,10 +15995,6 @@ private:
return "Reports test results on a single line, suitable for IDEs";
}
- ReporterPreferences CompactReporter::getPreferences() const {
- return m_reporterPrefs;
- }
-
void CompactReporter::noMatchingTestCases( std::string const& spec ) {
stream << "No test cases matched '" << spec << '\'' << std::endl;
}
@@ -15273,8 +16021,9 @@ private:
}
void CompactReporter::sectionEnded(SectionStats const& _sectionStats) {
- if (m_config->showDurations() == ShowDurations::Always) {
- stream << getFormattedDuration(_sectionStats.durationInSeconds) << " s: " << _sectionStats.sectionInfo.name << std::endl;
+ double dur = _sectionStats.durationInSeconds;
+ if ( shouldShowDuration( *m_config, dur ) ) {
+ stream << getFormattedDuration( dur ) << " s: " << _sectionStats.sectionInfo.name << std::endl;
}
}
@@ -15486,15 +16235,11 @@ class Duration {
static const uint64_t s_nanosecondsInASecond = 1000 * s_nanosecondsInAMillisecond;
static const uint64_t s_nanosecondsInAMinute = 60 * s_nanosecondsInASecond;
- uint64_t m_inNanoseconds;
+ double m_inNanoseconds;
Unit m_units;
public:
- explicit Duration(double inNanoseconds, Unit units = Unit::Auto)
- : Duration(static_cast<uint64_t>(inNanoseconds), units) {
- }
-
- explicit Duration(uint64_t inNanoseconds, Unit units = Unit::Auto)
+ explicit Duration(double inNanoseconds, Unit units = Unit::Auto)
: m_inNanoseconds(inNanoseconds),
m_units(units) {
if (m_units == Unit::Auto) {
@@ -15523,7 +16268,7 @@ public:
case Unit::Minutes:
return m_inNanoseconds / static_cast<double>(s_nanosecondsInAMinute);
default:
- return static_cast<double>(m_inNanoseconds);
+ return m_inNanoseconds;
}
}
auto unitsAsString() const -> std::string {
@@ -15544,7 +16289,7 @@ public:
}
friend auto operator << (std::ostream& os, Duration const& duration) -> std::ostream& {
- return os << duration.value() << " " << duration.unitsAsString();
+ return os << duration.value() << ' ' << duration.unitsAsString();
}
};
} // end anon namespace
@@ -15570,15 +16315,15 @@ public:
m_isOpen = true;
*this << RowBreak();
- Columns headerCols;
- Spacer spacer(2);
- for (auto const& info : m_columnInfos) {
- headerCols += Column(info.name).width(static_cast<std::size_t>(info.width - 2));
- headerCols += spacer;
- }
- m_os << headerCols << "\n";
+ Columns headerCols;
+ Spacer spacer(2);
+ for (auto const& info : m_columnInfos) {
+ headerCols += Column(info.name).width(static_cast<std::size_t>(info.width - 2));
+ headerCols += spacer;
+ }
+ m_os << headerCols << '\n';
- m_os << Catch::getLineOfChars<'-'>() << "\n";
+ m_os << Catch::getLineOfChars<'-'>() << '\n';
}
}
void close() {
@@ -15597,30 +16342,29 @@ public:
friend TablePrinter& operator << (TablePrinter& tp, ColumnBreak) {
auto colStr = tp.m_oss.str();
- // This takes account of utf8 encodings
- auto strSize = Catch::StringRef(colStr).numberOfCharacters();
+ const auto strSize = colStr.size();
tp.m_oss.str("");
tp.open();
if (tp.m_currentColumn == static_cast<int>(tp.m_columnInfos.size() - 1)) {
tp.m_currentColumn = -1;
- tp.m_os << "\n";
+ tp.m_os << '\n';
}
tp.m_currentColumn++;
auto colInfo = tp.m_columnInfos[tp.m_currentColumn];
- auto padding = (strSize + 2 < static_cast<std::size_t>(colInfo.width))
- ? std::string(colInfo.width - (strSize + 2), ' ')
+ auto padding = (strSize + 1 < static_cast<std::size_t>(colInfo.width))
+ ? std::string(colInfo.width - (strSize + 1), ' ')
: std::string();
if (colInfo.justification == ColumnInfo::Left)
- tp.m_os << colStr << padding << " ";
+ tp.m_os << colStr << padding << ' ';
else
- tp.m_os << padding << colStr << " ";
+ tp.m_os << padding << colStr << ' ';
return tp;
}
friend TablePrinter& operator << (TablePrinter& tp, RowBreak) {
if (tp.m_currentColumn > 0) {
- tp.m_os << "\n";
+ tp.m_os << '\n';
tp.m_currentColumn = -1;
}
return tp;
@@ -15630,12 +16374,26 @@ public:
ConsoleReporter::ConsoleReporter(ReporterConfig const& config)
: StreamingReporterBase(config),
m_tablePrinter(new TablePrinter(config.stream(),
- {
- { "benchmark name", CATCH_CONFIG_CONSOLE_WIDTH - 32, ColumnInfo::Left },
- { "samples mean std dev", 14, ColumnInfo::Right },
- { "iterations low mean low std dev", 14, ColumnInfo::Right },
- { "estimated high mean high std dev", 14, ColumnInfo::Right }
- })) {}
+ [&config]() -> std::vector<ColumnInfo> {
+ if (config.fullConfig()->benchmarkNoAnalysis())
+ {
+ return{
+ { "benchmark name", CATCH_CONFIG_CONSOLE_WIDTH - 43, ColumnInfo::Left },
+ { " samples", 14, ColumnInfo::Right },
+ { " iterations", 14, ColumnInfo::Right },
+ { " mean", 14, ColumnInfo::Right }
+ };
+ }
+ else
+ {
+ return{
+ { "benchmark name", CATCH_CONFIG_CONSOLE_WIDTH - 43, ColumnInfo::Left },
+ { "samples mean std dev", 14, ColumnInfo::Right },
+ { "iterations low mean low std dev", 14, ColumnInfo::Right },
+ { "estimated high mean high std dev", 14, ColumnInfo::Right }
+ };
+ }
+ }())) {}
ConsoleReporter::~ConsoleReporter() = default;
std::string ConsoleReporter::getDescription() {
@@ -15646,6 +16404,10 @@ void ConsoleReporter::noMatchingTestCases(std::string const& spec) {
stream << "No test cases matched '" << spec << '\'' << std::endl;
}
+void ConsoleReporter::reportInvalidArguments(std::string const&arg){
+ stream << "Invalid Filter: " << arg << std::endl;
+}
+
void ConsoleReporter::assertionStarting(AssertionInfo const&) {}
bool ConsoleReporter::assertionEnded(AssertionStats const& _assertionStats) {
@@ -15681,8 +16443,9 @@ void ConsoleReporter::sectionEnded(SectionStats const& _sectionStats) {
stream << "\nNo assertions in test case";
stream << " '" << _sectionStats.sectionInfo.name << "'\n" << std::endl;
}
- if (m_config->showDurations() == ShowDurations::Always) {
- stream << getFormattedDuration(_sectionStats.durationInSeconds) << " s: " << _sectionStats.sectionInfo.name << std::endl;
+ double dur = _sectionStats.durationInSeconds;
+ if (shouldShowDuration(*m_config, dur)) {
+ stream << getFormattedDuration(dur) << " s: " << _sectionStats.sectionInfo.name << std::endl;
}
if (m_headerPrinted) {
m_headerPrinted = false;
@@ -15692,40 +16455,48 @@ void ConsoleReporter::sectionEnded(SectionStats const& _sectionStats) {
#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
void ConsoleReporter::benchmarkPreparing(std::string const& name) {
- lazyPrintWithoutClosingBenchmarkTable();
+ lazyPrintWithoutClosingBenchmarkTable();
- auto nameCol = Column(name).width(static_cast<std::size_t>(m_tablePrinter->columnInfos()[0].width - 2));
+ auto nameCol = Column(name).width(static_cast<std::size_t>(m_tablePrinter->columnInfos()[0].width - 2));
- bool firstLine = true;
- for (auto line : nameCol) {
- if (!firstLine)
- (*m_tablePrinter) << ColumnBreak() << ColumnBreak() << ColumnBreak();
- else
- firstLine = false;
+ bool firstLine = true;
+ for (auto line : nameCol) {
+ if (!firstLine)
+ (*m_tablePrinter) << ColumnBreak() << ColumnBreak() << ColumnBreak();
+ else
+ firstLine = false;
- (*m_tablePrinter) << line << ColumnBreak();
- }
+ (*m_tablePrinter) << line << ColumnBreak();
+ }
}
void ConsoleReporter::benchmarkStarting(BenchmarkInfo const& info) {
- (*m_tablePrinter) << info.samples << ColumnBreak()
- << info.iterations << ColumnBreak()
- << Duration(info.estimatedDuration) << ColumnBreak();
+ (*m_tablePrinter) << info.samples << ColumnBreak()
+ << info.iterations << ColumnBreak();
+ if (!m_config->benchmarkNoAnalysis())
+ (*m_tablePrinter) << Duration(info.estimatedDuration) << ColumnBreak();
}
void ConsoleReporter::benchmarkEnded(BenchmarkStats<> const& stats) {
- (*m_tablePrinter) << ColumnBreak()
- << Duration(stats.mean.point.count()) << ColumnBreak()
- << Duration(stats.mean.lower_bound.count()) << ColumnBreak()
- << Duration(stats.mean.upper_bound.count()) << ColumnBreak() << ColumnBreak()
- << Duration(stats.standardDeviation.point.count()) << ColumnBreak()
- << Duration(stats.standardDeviation.lower_bound.count()) << ColumnBreak()
- << Duration(stats.standardDeviation.upper_bound.count()) << ColumnBreak() << ColumnBreak() << ColumnBreak() << ColumnBreak() << ColumnBreak();
+ if (m_config->benchmarkNoAnalysis())
+ {
+ (*m_tablePrinter) << Duration(stats.mean.point.count()) << ColumnBreak();
+ }
+ else
+ {
+ (*m_tablePrinter) << ColumnBreak()
+ << Duration(stats.mean.point.count()) << ColumnBreak()
+ << Duration(stats.mean.lower_bound.count()) << ColumnBreak()
+ << Duration(stats.mean.upper_bound.count()) << ColumnBreak() << ColumnBreak()
+ << Duration(stats.standardDeviation.point.count()) << ColumnBreak()
+ << Duration(stats.standardDeviation.lower_bound.count()) << ColumnBreak()
+ << Duration(stats.standardDeviation.upper_bound.count()) << ColumnBreak() << ColumnBreak() << ColumnBreak() << ColumnBreak() << ColumnBreak();
+ }
}
void ConsoleReporter::benchmarkFailed(std::string const& error) {
- Colour colour(Colour::Red);
+ Colour colour(Colour::Red);
(*m_tablePrinter)
- << "Benchmark failed (" << error << ")"
+ << "Benchmark failed (" << error << ')'
<< ColumnBreak() << RowBreak();
}
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING
@@ -15807,11 +16578,9 @@ void ConsoleReporter::printTestCaseAndSectionHeader() {
SourceLineInfo lineInfo = m_sectionStack.back().lineInfo;
- if (!lineInfo.empty()) {
- stream << getLineOfChars<'-'>() << '\n';
- Colour colourGuard(Colour::FileName);
- stream << lineInfo << '\n';
- }
+ stream << getLineOfChars<'-'>() << '\n';
+ Colour colourGuard(Colour::FileName);
+ stream << lineInfo << '\n';
stream << getLineOfChars<'.'>() << '\n' << std::endl;
}
@@ -15936,8 +16705,10 @@ void ConsoleReporter::printSummaryDivider() {
}
void ConsoleReporter::printTestFilters() {
- if (m_config->testSpec().hasFilters())
- stream << Colour(Colour::BrightYellow) << "Filters: " << serializeFilters( m_config->getTestsOrTags() ) << '\n';
+ if (m_config->testSpec().hasFilters()) {
+ Colour guard(Colour::BrightYellow);
+ stream << "Filters: " << serializeFilters(m_config->getTestsOrTags()) << '\n';
+ }
}
CATCH_REGISTER_REPORTER("console", ConsoleReporter)
@@ -16087,8 +16858,8 @@ namespace Catch {
for( auto const& child : groupNode.children )
writeTestCase( *child );
- xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite ), false );
- xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite ), false );
+ xml.scopedElement( "system-out" ).writeText( trim( stdOutForSuite ), XmlFormatting::Newline );
+ xml.scopedElement( "system-err" ).writeText( trim( stdErrForSuite ), XmlFormatting::Newline );
}
void JunitReporter::writeTestCase( TestCaseNode const& testCaseNode ) {
@@ -16133,13 +16904,18 @@ namespace Catch {
xml.writeAttribute( "name", name );
}
xml.writeAttribute( "time", ::Catch::Detail::stringify( sectionNode.stats.durationInSeconds ) );
+ // This is not ideal, but it should be enough to mimic gtest's
+ // junit output.
+ // Ideally the JUnit reporter would also handle `skipTest`
+ // events and write those out appropriately.
+ xml.writeAttribute( "status", "run" );
writeAssertions( sectionNode );
if( !sectionNode.stdOut.empty() )
- xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), false );
+ xml.scopedElement( "system-out" ).writeText( trim( sectionNode.stdOut ), XmlFormatting::Newline );
if( !sectionNode.stdErr.empty() )
- xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), false );
+ xml.scopedElement( "system-err" ).writeText( trim( sectionNode.stdErr ), XmlFormatting::Newline );
}
for( auto const& childNode : sectionNode.childSections )
if( className.empty() )
@@ -16163,11 +16939,7 @@ namespace Catch {
elementName = "error";
break;
case ResultWas::ExplicitFailure:
- elementName = "failure";
- break;
case ResultWas::ExpressionFailed:
- elementName = "failure";
- break;
case ResultWas::DidntThrowException:
elementName = "failure";
break;
@@ -16185,10 +16957,25 @@ namespace Catch {
XmlWriter::ScopedElement e = xml.scopedElement( elementName );
- xml.writeAttribute( "message", result.getExpandedExpression() );
+ xml.writeAttribute( "message", result.getExpression() );
xml.writeAttribute( "type", result.getTestMacroName() );
ReusableStringStream rss;
+ if (stats.totals.assertions.total() > 0) {
+ rss << "FAILED" << ":\n";
+ if (result.hasExpression()) {
+ rss << " ";
+ rss << result.getExpressionInMacro();
+ rss << '\n';
+ }
+ if (result.hasExpandedExpression()) {
+ rss << "with expansion:\n";
+ rss << Column(result.getExpandedExpression()).indent(2) << '\n';
+ }
+ } else {
+ rss << '\n';
+ }
+
if( !result.getMessage().empty() )
rss << result.getMessage() << '\n';
for( auto const& msg : stats.infoMessages )
@@ -16196,7 +16983,7 @@ namespace Catch {
rss << msg.message << '\n';
rss << "at " << result.getSourceInfo();
- xml.writeText( rss.str(), false );
+ xml.writeText( rss.str(), XmlFormatting::Newline );
}
}
@@ -16240,13 +17027,20 @@ namespace Catch {
m_reporter->noMatchingTestCases( spec );
}
+ void ListeningReporter::reportInvalidArguments(std::string const&arg){
+ for ( auto const& listener : m_listeners ) {
+ listener->reportInvalidArguments( arg );
+ }
+ m_reporter->reportInvalidArguments( arg );
+ }
+
#if defined(CATCH_CONFIG_ENABLE_BENCHMARKING)
void ListeningReporter::benchmarkPreparing( std::string const& name ) {
- for (auto const& listener : m_listeners) {
- listener->benchmarkPreparing(name);
- }
- m_reporter->benchmarkPreparing(name);
- }
+ for (auto const& listener : m_listeners) {
+ listener->benchmarkPreparing(name);
+ }
+ m_reporter->benchmarkPreparing(name);
+ }
void ListeningReporter::benchmarkStarting( BenchmarkInfo const& benchmarkInfo ) {
for ( auto const& listener : m_listeners ) {
listener->benchmarkStarting( benchmarkInfo );
@@ -16260,12 +17054,12 @@ namespace Catch {
m_reporter->benchmarkEnded( benchmarkStats );
}
- void ListeningReporter::benchmarkFailed( std::string const& error ) {
- for (auto const& listener : m_listeners) {
- listener->benchmarkFailed(error);
- }
- m_reporter->benchmarkFailed(error);
- }
+ void ListeningReporter::benchmarkFailed( std::string const& error ) {
+ for (auto const& listener : m_listeners) {
+ listener->benchmarkFailed(error);
+ }
+ m_reporter->benchmarkFailed(error);
+ }
#endif // CATCH_CONFIG_ENABLE_BENCHMARKING
void ListeningReporter::testRunStarting( TestRunInfo const& testRunInfo ) {
@@ -16535,9 +17329,9 @@ namespace Catch {
e.writeAttribute( "durationInSeconds", m_testCaseTimer.getElapsedSeconds() );
if( !testCaseStats.stdOut.empty() )
- m_xml.scopedElement( "StdOut" ).writeText( trim( testCaseStats.stdOut ), false );
+ m_xml.scopedElement( "StdOut" ).writeText( trim( testCaseStats.stdOut ), XmlFormatting::Newline );
if( !testCaseStats.stdErr.empty() )
- m_xml.scopedElement( "StdErr" ).writeText( trim( testCaseStats.stdErr ), false );
+ m_xml.scopedElement( "StdErr" ).writeText( trim( testCaseStats.stdErr ), XmlFormatting::Newline );
m_xml.endElement();
}
@@ -16549,6 +17343,10 @@ namespace Catch {
.writeAttribute( "successes", testGroupStats.totals.assertions.passed )
.writeAttribute( "failures", testGroupStats.totals.assertions.failed )
.writeAttribute( "expectedFailures", testGroupStats.totals.assertions.failedButOk );
+ m_xml.scopedElement( "OverallResultsCases")
+ .writeAttribute( "successes", testGroupStats.totals.testCases.passed )
+ .writeAttribute( "failures", testGroupStats.totals.testCases.failed )
+ .writeAttribute( "expectedFailures", testGroupStats.totals.testCases.failedButOk );
m_xml.endElement();
}
@@ -16558,6 +17356,10 @@ namespace Catch {
.writeAttribute( "successes", testRunStats.totals.assertions.passed )
.writeAttribute( "failures", testRunStats.totals.assertions.failed )
.writeAttribute( "expectedFailures", testRunStats.totals.assertions.failedButOk );
+ m_xml.scopedElement( "OverallResultsCases")
+ .writeAttribute( "successes", testRunStats.totals.testCases.passed )
+ .writeAttribute( "failures", testRunStats.totals.testCases.failed )
+ .writeAttribute( "expectedFailures", testRunStats.totals.testCases.failedButOk );
m_xml.endElement();
}
@@ -16571,16 +17373,16 @@ namespace Catch {
m_xml.writeAttribute("samples", info.samples)
.writeAttribute("resamples", info.resamples)
.writeAttribute("iterations", info.iterations)
- .writeAttribute("clockResolution", static_cast<uint64_t>(info.clockResolution))
- .writeAttribute("estimatedDuration", static_cast<uint64_t>(info.estimatedDuration))
+ .writeAttribute("clockResolution", info.clockResolution)
+ .writeAttribute("estimatedDuration", info.estimatedDuration)
.writeComment("All values in nano seconds");
}
void XmlReporter::benchmarkEnded(BenchmarkStats<> const& benchmarkStats) {
m_xml.startElement("mean")
- .writeAttribute("value", static_cast<uint64_t>(benchmarkStats.mean.point.count()))
- .writeAttribute("lowerBound", static_cast<uint64_t>(benchmarkStats.mean.lower_bound.count()))
- .writeAttribute("upperBound", static_cast<uint64_t>(benchmarkStats.mean.upper_bound.count()))
+ .writeAttribute("value", benchmarkStats.mean.point.count())
+ .writeAttribute("lowerBound", benchmarkStats.mean.lower_bound.count())
+ .writeAttribute("upperBound", benchmarkStats.mean.upper_bound.count())
.writeAttribute("ci", benchmarkStats.mean.confidence_interval);
m_xml.endElement();
m_xml.startElement("standardDeviation")
@@ -16631,7 +17433,7 @@ namespace Catch {
#ifndef __OBJC__
-#if defined(CATCH_CONFIG_WCHAR) && defined(WIN32) && defined(_UNICODE) && !defined(DO_NOT_USE_WMAIN)
+#if defined(CATCH_CONFIG_WCHAR) && defined(CATCH_PLATFORM_WINDOWS) && defined(_UNICODE) && !defined(DO_NOT_USE_WMAIN)
// Standard C/C++ Win32 Unicode wmain entry point
extern "C" int wmain (int argc, wchar_t * argv[], wchar_t * []) {
#else
diff --git a/tests/fff_print/CMakeLists.txt b/tests/fff_print/CMakeLists.txt
index 75a9c3137..c69e722af 100644
--- a/tests/fff_print/CMakeLists.txt
+++ b/tests/fff_print/CMakeLists.txt
@@ -19,5 +19,9 @@ add_executable(${_TEST_NAME}_tests
target_link_libraries(${_TEST_NAME}_tests test_common libslic3r)
set_property(TARGET ${_TEST_NAME}_tests PROPERTY FOLDER "tests")
+if (WIN32)
+ prusaslicer_copy_dlls(${_TEST_NAME}_tests)
+endif()
+
# catch_discover_tests(${_TEST_NAME}_tests TEST_PREFIX "${_TEST_NAME}: ")
add_test(${_TEST_NAME}_tests ${_TEST_NAME}_tests ${CATCH_EXTRA_ARGS})
diff --git a/tests/fff_print/test_data.cpp b/tests/fff_print/test_data.cpp
index b3c16f4b0..d55f9f061 100644
--- a/tests/fff_print/test_data.cpp
+++ b/tests/fff_print/test_data.cpp
@@ -12,6 +12,7 @@
#include <boost/nowide/cstdio.hpp>
#include <boost/filesystem.hpp>
+#include <libslic3r/ModelArrange.hpp>
using namespace std;
@@ -52,91 +53,91 @@ TriangleMesh mesh(TestMesh m)
break;
case TestMesh::cube_with_hole:
mesh = TriangleMesh(
- { Vec3d(0,0,0), Vec3d(0,0,10), Vec3d(0,20,0), Vec3d(0,20,10), Vec3d(20,0,0), Vec3d(20,0,10), Vec3d(5,5,0), Vec3d(15,5,0), Vec3d(5,15,0), Vec3d(20,20,0), Vec3d(15,15,0), Vec3d(20,20,10), Vec3d(5,5,10), Vec3d(5,15,10), Vec3d(15,5,10), Vec3d(15,15,10) },
- { Vec3crd(0,1,2), Vec3crd(2,1,3), Vec3crd(1,0,4), Vec3crd(5,1,4), Vec3crd(6,7,4), Vec3crd(8,2,9), Vec3crd(0,2,8), Vec3crd(10,8,9), Vec3crd(0,8,6), Vec3crd(0,6,4), Vec3crd(4,7,9), Vec3crd(7,10,9), Vec3crd(2,3,9), Vec3crd(9,3,11), Vec3crd(12,1,5), Vec3crd(13,3,12), Vec3crd(14,12,5), Vec3crd(3,1,12), Vec3crd(11,3,13), Vec3crd(11,15,5), Vec3crd(11,13,15), Vec3crd(15,14,5), Vec3crd(5,4,9), Vec3crd(11,5,9), Vec3crd(8,13,12), Vec3crd(6,8,12), Vec3crd(10,15,13), Vec3crd(8,10,13), Vec3crd(15,10,14), Vec3crd(14,10,7), Vec3crd(14,7,12), Vec3crd(12,7,6) });
+ { {0,0,0}, {0,0,10}, {0,20,0}, {0,20,10}, {20,0,0}, {20,0,10}, {5,5,0}, {15,5,0}, {5,15,0}, {20,20,0}, {15,15,0}, {20,20,10}, {5,5,10}, {5,15,10}, {15,5,10}, {15,15,10} },
+ { {0,1,2}, {2,1,3}, {1,0,4}, {5,1,4}, {6,7,4}, {8,2,9}, {0,2,8}, {10,8,9}, {0,8,6}, {0,6,4}, {4,7,9}, {7,10,9}, {2,3,9}, {9,3,11}, {12,1,5}, {13,3,12}, {14,12,5}, {3,1,12}, {11,3,13}, {11,15,5}, {11,13,15}, {15,14,5}, {5,4,9}, {11,5,9}, {8,13,12}, {6,8,12}, {10,15,13}, {8,10,13}, {15,10,14}, {14,10,7}, {14,7,12}, {12,7,6} });
break;
case TestMesh::cube_with_concave_hole:
mesh = TriangleMesh(
- { Vec3d(-10,-10,-5), Vec3d(-10,-10,5), Vec3d(-10,10,-5), Vec3d(-10,10,5), Vec3d(10,-10,-5), Vec3d(10,-10,5), Vec3d(-5,-5,-5), Vec3d(5,-5,-5), Vec3d(5,5,-5), Vec3d(5,10,-5), Vec3d(-5,5,-5), Vec3d(3.06161699911402e-16,5,-5), Vec3d(5,0,-5), Vec3d(0,0,-5), Vec3d(10,5,-5), Vec3d(5,10,5), Vec3d(-5,-5,5), Vec3d(5,0,5), Vec3d(5,-5,5), Vec3d(-5,5,5), Vec3d(10,5,5), Vec3d(5,5,5), Vec3d(3.06161699911402e-16,5,5), Vec3d(0,0,5) },
- { Vec3crd(0,1,2), Vec3crd(2,1,3), Vec3crd(1,0,4), Vec3crd(5,1,4), Vec3crd(6,7,4), Vec3crd(8,2,9), Vec3crd(10,2,11), Vec3crd(11,12,13), Vec3crd(0,2,10), Vec3crd(0,10,6), Vec3crd(0,6,4), Vec3crd(11,2,8), Vec3crd(4,7,12), Vec3crd(4,12,8), Vec3crd(12,11,8), Vec3crd(14,4,8), Vec3crd(2,3,9), Vec3crd(9,3,15), Vec3crd(16,1,5), Vec3crd(17,18,5), Vec3crd(19,3,16), Vec3crd(20,21,5), Vec3crd(18,16,5), Vec3crd(3,1,16), Vec3crd(22,3,19), Vec3crd(21,3,22), Vec3crd(21,17,5), Vec3crd(21,22,17), Vec3crd(21,15,3), Vec3crd(23,17,22), Vec3crd(5,4,14), Vec3crd(20,5,14), Vec3crd(20,14,21), Vec3crd(21,14,8), Vec3crd(9,15,21), Vec3crd(8,9,21), Vec3crd(10,19,16), Vec3crd(6,10,16), Vec3crd(11,22,19), Vec3crd(10,11,19), Vec3crd(13,23,11), Vec3crd(11,23,22), Vec3crd(23,13,12), Vec3crd(17,23,12), Vec3crd(17,12,18), Vec3crd(18,12,7), Vec3crd(18,7,16), Vec3crd(16,7,6) });
+ { {-10,-10,-5}, {-10,-10,5}, {-10,10,-5}, {-10,10,5}, {10,-10,-5}, {10,-10,5}, {-5,-5,-5}, {5,-5,-5}, {5,5,-5}, {5,10,-5}, {-5,5,-5}, Vec3d(3.06161699911402e-16,5,-5), {5,0,-5}, {0,0,-5}, {10,5,-5}, {5,10,5}, {-5,-5,5}, {5,0,5}, {5,-5,5}, {-5,5,5}, {10,5,5}, {5,5,5}, Vec3d(3.06161699911402e-16,5,5), {0,0,5} },
+ { {0,1,2}, {2,1,3}, {1,0,4}, {5,1,4}, {6,7,4}, {8,2,9}, {10,2,11}, {11,12,13}, {0,2,10}, {0,10,6}, {0,6,4}, {11,2,8}, {4,7,12}, {4,12,8}, {12,11,8}, {14,4,8}, {2,3,9}, {9,3,15}, {16,1,5}, {17,18,5}, {19,3,16}, {20,21,5}, {18,16,5}, {3,1,16}, {22,3,19}, {21,3,22}, {21,17,5}, {21,22,17}, {21,15,3}, {23,17,22}, {5,4,14}, {20,5,14}, {20,14,21}, {21,14,8}, {9,15,21}, {8,9,21}, {10,19,16}, {6,10,16}, {11,22,19}, {10,11,19}, {13,23,11}, {11,23,22}, {23,13,12}, {17,23,12}, {17,12,18}, {18,12,7}, {18,7,16}, {16,7,6} });
break;
case TestMesh::V:
mesh = TriangleMesh(
- { Vec3d(-14,0,20), Vec3d(-14,15,20), Vec3d(0,0,0), Vec3d(0,15,0), Vec3d(-4,0,20), Vec3d(-4,15,20), Vec3d(5,0,7.14286), Vec3d(10,0,0), Vec3d(24,0,20), Vec3d(14,0,20), Vec3d(10,15,0), Vec3d(5,15,7.14286), Vec3d(14,15,20), Vec3d(24,15,20) },
- { Vec3crd(0,1,2), Vec3crd(2,1,3), Vec3crd(1,0,4), Vec3crd(5,1,4), Vec3crd(4,0,2), Vec3crd(6,4,2), Vec3crd(7,6,2), Vec3crd(8,9,7), Vec3crd(9,6,7), Vec3crd(2,3,7), Vec3crd(7,3,10), Vec3crd(1,5,3), Vec3crd(3,5,11), Vec3crd(11,12,13), Vec3crd(11,13,3), Vec3crd(3,13,10), Vec3crd(5,4,6), Vec3crd(11,5,6), Vec3crd(6,9,11), Vec3crd(11,9,12), Vec3crd(12,9,8), Vec3crd(13,12,8), Vec3crd(8,7,10), Vec3crd(13,8,10) });
+ { {-14,0,20}, {-14,15,20}, {0,0,0}, {0,15,0}, {-4,0,20}, {-4,15,20}, {5,0,7.14286}, {10,0,0}, {24,0,20}, {14,0,20}, {10,15,0}, {5,15,7.14286}, {14,15,20}, {24,15,20} },
+ { {0,1,2}, {2,1,3}, {1,0,4}, {5,1,4}, {4,0,2}, {6,4,2}, {7,6,2}, {8,9,7}, {9,6,7}, {2,3,7}, {7,3,10}, {1,5,3}, {3,5,11}, {11,12,13}, {11,13,3}, {3,13,10}, {5,4,6}, {11,5,6}, {6,9,11}, {11,9,12}, {12,9,8}, {13,12,8}, {8,7,10}, {13,8,10} });
break;
case TestMesh::L:
mesh = TriangleMesh(
- { Vec3d(0,10,0), Vec3d(0,10,10), Vec3d(0,20,0), Vec3d(0,20,10), Vec3d(10,10,0), Vec3d(10,10,10), Vec3d(20,20,0), Vec3d(20,0,0), Vec3d(10,0,0), Vec3d(20,20,10), Vec3d(10,0,10), Vec3d(20,0,10) },
- { Vec3crd(0,1,2), Vec3crd(2,1,3), Vec3crd(4,5,1), Vec3crd(0,4,1), Vec3crd(0,2,4), Vec3crd(4,2,6), Vec3crd(4,6,7), Vec3crd(4,7,8), Vec3crd(2,3,6), Vec3crd(6,3,9), Vec3crd(3,1,5), Vec3crd(9,3,5), Vec3crd(10,11,5), Vec3crd(11,9,5), Vec3crd(5,4,10), Vec3crd(10,4,8), Vec3crd(10,8,7), Vec3crd(11,10,7), Vec3crd(11,7,6), Vec3crd(9,11,6) });
+ { {0,10,0}, {0,10,10}, {0,20,0}, {0,20,10}, {10,10,0}, {10,10,10}, {20,20,0}, {20,0,0}, {10,0,0}, {20,20,10}, {10,0,10}, {20,0,10} },
+ { {0,1,2}, {2,1,3}, {4,5,1}, {0,4,1}, {0,2,4}, {4,2,6}, {4,6,7}, {4,7,8}, {2,3,6}, {6,3,9}, {3,1,5}, {9,3,5}, {10,11,5}, {11,9,5}, {5,4,10}, {10,4,8}, {10,8,7}, {11,10,7}, {11,7,6}, {9,11,6} });
break;
case TestMesh::overhang:
mesh = TriangleMesh(
- { Vec3d(1364.68505859375,614.398010253906,20.002498626709), Vec3d(1389.68505859375,614.398010253906,20.002498626709), Vec3d(1377.18505859375,589.398986816406,20.002498626709), Vec3d(1389.68505859375,589.398986816406,20.002498626709), Vec3d(1389.68505859375,564.398986816406,20.0014991760254), Vec3d(1364.68505859375,589.398986816406,20.002498626709), Vec3d(1364.68505859375,564.398986816406,20.0014991760254), Vec3d(1360.93505859375,589.398986816406,17.0014991760254), Vec3d(1360.93505859375,585.64697265625,17.0014991760254), Vec3d(1357.18505859375,564.398986816406,17.0014991760254), Vec3d(1364.68505859375,589.398986816406,17.0014991760254), Vec3d(1364.68505859375,571.899963378906,17.0014991760254), Vec3d(1364.68505859375,564.398986816406,17.0014991760254), Vec3d(1348.43603515625,564.398986816406,17.0014991760254), Vec3d(1352.80908203125,589.398986816406,17.0014991760254), Vec3d(1357.18408203125,589.398986816406,17.0014991760254), Vec3d(1357.18310546875,614.398010253906,17.0014991760254), Vec3d(1364.68505859375,606.89599609375,17.0014991760254), Vec3d(1364.68505859375,614.398010253906,17.0014991760254), Vec3d(1352.18603515625,564.398986816406,20.0014991760254), Vec3d(1363.65405273438,589.398986816406,23.3004989624023), Vec3d(1359.46704101562,589.398986816406,23.3004989624023), Vec3d(1358.37109375,564.398986816406,23.3004989624023), Vec3d(1385.56103515625,564.398986816406,23.3004989624023), Vec3d(1373.06311035156,589.398986816406,23.3004989624023), Vec3d(1368.80810546875,564.398986816406,23.3004989624023), Vec3d(1387.623046875,589.398986816406,23.3004989624023), Vec3d(1387.623046875,585.276000976562,23.3004989624023), Vec3d(1389.68505859375,589.398986816406,23.3004989624023), Vec3d(1389.68505859375,572.64599609375,23.3004989624023), Vec3d(1389.68505859375,564.398986816406,23.3004989624023), Vec3d(1367.77709960938,589.398986816406,23.3004989624023), Vec3d(1366.7470703125,564.398986816406,23.3004989624023), Vec3d(1354.31201171875,589.398986816406,23.3004989624023), Vec3d(1352.18603515625,564.398986816406,23.3004989624023), Vec3d(1389.68505859375,614.398010253906,23.3004989624023), Vec3d(1377.31701660156,614.398010253906,23.3004989624023), Vec3d(1381.43908691406,589.398986816406,23.3004989624023), Vec3d(1368.80700683594,614.398010253906,23.3004989624023), Vec3d(1368.80810546875,589.398986816406,23.3004989624023), Vec3d(1356.43908691406,614.398010253906,23.3004989624023), Vec3d(1357.40502929688,589.398986816406,23.3004989624023), Vec3d(1360.56201171875,614.398010253906,23.3004989624023), Vec3d(1348.705078125,614.398010253906,23.3004989624023), Vec3d(1350.44506835938,589.398986816406,23.3004989624023), Vec3d(1389.68505859375,606.153015136719,23.3004989624023), Vec3d(1347.35205078125,589.398986816406,23.3004989624023), Vec3d(1346.56005859375,589.398986816406,23.3004989624023), Vec3d(1346.56005859375,594.159912109375,17.0014991760254), Vec3d(1346.56005859375,589.398986816406,17.0014991760254), Vec3d(1346.56005859375,605.250427246094,23.3004989624023), Vec3d(1346.56005859375,614.398010253906,23.3004989624023), Vec3d(1346.56005859375,614.398010253906,20.8258285522461), Vec3d(1346.56005859375,614.398010253906,17.0014991760254), Vec3d(1346.56005859375,564.398986816406,19.10133934021), Vec3d(1346.56005859375,567.548583984375,23.3004989624023), Vec3d(1346.56005859375,564.398986816406,17.0020332336426), Vec3d(1346.56005859375,564.398986816406,23.0018501281738), Vec3d(1346.56005859375,564.398986816406,23.3004989624023), Vec3d(1346.56005859375,575.118957519531,17.0014991760254), Vec3d(1346.56005859375,574.754028320312,23.3004989624023) },
- { Vec3crd(0,1,2), Vec3crd(2,3,4), Vec3crd(2,5,0), Vec3crd(4,6,2), Vec3crd(2,6,5), Vec3crd(2,1,3), Vec3crd(7,8,9), Vec3crd(10,9,8), Vec3crd(11,9,10), Vec3crd(12,9,11), Vec3crd(9,13,14), Vec3crd(7,15,16), Vec3crd(10,17,0), Vec3crd(10,0,5), Vec3crd(12,11,6), Vec3crd(18,16,0), Vec3crd(6,19,13), Vec3crd(6,13,9), Vec3crd(9,12,6), Vec3crd(17,18,0), Vec3crd(11,10,5), Vec3crd(11,5,6), Vec3crd(14,16,15), Vec3crd(17,7,18), Vec3crd(16,18,7), Vec3crd(14,15,9), Vec3crd(7,9,15), Vec3crd(7,17,8), Vec3crd(10,8,17), Vec3crd(20,21,22), Vec3crd(23,24,25), Vec3crd(26,23,27), Vec3crd(28,27,23), Vec3crd(29,28,23), Vec3crd(30,29,23), Vec3crd(25,31,32), Vec3crd(22,33,34), Vec3crd(35,36,37), Vec3crd(24,38,39), Vec3crd(21,40,41), Vec3crd(38,42,20), Vec3crd(33,43,44), Vec3crd(6,4,23), Vec3crd(6,23,25), Vec3crd(36,35,1), Vec3crd(1,0,38), Vec3crd(1,38,36), Vec3crd(29,30,4), Vec3crd(25,32,6), Vec3crd(40,42,0), Vec3crd(35,45,1), Vec3crd(4,3,28), Vec3crd(4,28,29), Vec3crd(3,1,45), Vec3crd(3,45,28), Vec3crd(22,34,19), Vec3crd(19,6,32), Vec3crd(19,32,22), Vec3crd(42,38,0), Vec3crd(30,23,4), Vec3crd(0,16,43), Vec3crd(0,43,40), Vec3crd(24,37,36), Vec3crd(38,24,36), Vec3crd(24,23,37), Vec3crd(37,23,26), Vec3crd(22,32,20), Vec3crd(20,32,31), Vec3crd(33,41,40), Vec3crd(43,33,40), Vec3crd(45,35,26), Vec3crd(37,26,35), Vec3crd(33,44,34), Vec3crd(44,43,46), Vec3crd(20,42,21), Vec3crd(40,21,42), Vec3crd(31,39,38), Vec3crd(20,31,38), Vec3crd(33,22,41), Vec3crd(21,41,22), Vec3crd(31,25,39), Vec3crd(24,39,25), Vec3crd(26,27,45), Vec3crd(28,45,27), Vec3crd(47,48,49), Vec3crd(47,50,48), Vec3crd(51,48,50), Vec3crd(52,48,51), Vec3crd(53,48,52), Vec3crd(54,55,56), Vec3crd(57,55,54), Vec3crd(58,55,57), Vec3crd(49,59,47), Vec3crd(60,56,55), Vec3crd(59,56,60), Vec3crd(60,47,59), Vec3crd(48,53,16), Vec3crd(56,13,19), Vec3crd(54,56,19), Vec3crd(56,59,13), Vec3crd(59,49,14), Vec3crd(59,14,13), Vec3crd(49,48,16), Vec3crd(49,16,14), Vec3crd(44,46,60), Vec3crd(44,60,55), Vec3crd(51,50,43), Vec3crd(19,34,58), Vec3crd(19,58,57), Vec3crd(53,52,16), Vec3crd(43,16,52), Vec3crd(43,52,51), Vec3crd(57,54,19), Vec3crd(47,60,46), Vec3crd(55,58,34), Vec3crd(55,34,44), Vec3crd(50,47,46), Vec3crd(50,46,43) });
+ { {1364.68505859375,614.398010253906,20.002498626709}, {1389.68505859375,614.398010253906,20.002498626709}, {1377.18505859375,589.398986816406,20.002498626709}, {1389.68505859375,589.398986816406,20.002498626709}, {1389.68505859375,564.398986816406,20.0014991760254}, {1364.68505859375,589.398986816406,20.002498626709}, {1364.68505859375,564.398986816406,20.0014991760254}, {1360.93505859375,589.398986816406,17.0014991760254}, {1360.93505859375,585.64697265625,17.0014991760254}, {1357.18505859375,564.398986816406,17.0014991760254}, {1364.68505859375,589.398986816406,17.0014991760254}, {1364.68505859375,571.899963378906,17.0014991760254}, {1364.68505859375,564.398986816406,17.0014991760254}, {1348.43603515625,564.398986816406,17.0014991760254}, {1352.80908203125,589.398986816406,17.0014991760254}, {1357.18408203125,589.398986816406,17.0014991760254}, {1357.18310546875,614.398010253906,17.0014991760254}, {1364.68505859375,606.89599609375,17.0014991760254}, {1364.68505859375,614.398010253906,17.0014991760254}, {1352.18603515625,564.398986816406,20.0014991760254}, {1363.65405273438,589.398986816406,23.3004989624023}, {1359.46704101562,589.398986816406,23.3004989624023}, {1358.37109375,564.398986816406,23.3004989624023}, {1385.56103515625,564.398986816406,23.3004989624023}, {1373.06311035156,589.398986816406,23.3004989624023}, {1368.80810546875,564.398986816406,23.3004989624023}, {1387.623046875,589.398986816406,23.3004989624023}, {1387.623046875,585.276000976562,23.3004989624023}, {1389.68505859375,589.398986816406,23.3004989624023}, {1389.68505859375,572.64599609375,23.3004989624023}, {1389.68505859375,564.398986816406,23.3004989624023}, {1367.77709960938,589.398986816406,23.3004989624023}, {1366.7470703125,564.398986816406,23.3004989624023}, {1354.31201171875,589.398986816406,23.3004989624023}, {1352.18603515625,564.398986816406,23.3004989624023}, {1389.68505859375,614.398010253906,23.3004989624023}, {1377.31701660156,614.398010253906,23.3004989624023}, {1381.43908691406,589.398986816406,23.3004989624023}, {1368.80700683594,614.398010253906,23.3004989624023}, {1368.80810546875,589.398986816406,23.3004989624023}, {1356.43908691406,614.398010253906,23.3004989624023}, {1357.40502929688,589.398986816406,23.3004989624023}, {1360.56201171875,614.398010253906,23.3004989624023}, {1348.705078125,614.398010253906,23.3004989624023}, {1350.44506835938,589.398986816406,23.3004989624023}, {1389.68505859375,606.153015136719,23.3004989624023}, {1347.35205078125,589.398986816406,23.3004989624023}, {1346.56005859375,589.398986816406,23.3004989624023}, {1346.56005859375,594.159912109375,17.0014991760254}, {1346.56005859375,589.398986816406,17.0014991760254}, {1346.56005859375,605.250427246094,23.3004989624023}, {1346.56005859375,614.398010253906,23.3004989624023}, {1346.56005859375,614.398010253906,20.8258285522461}, {1346.56005859375,614.398010253906,17.0014991760254}, {1346.56005859375,564.398986816406,19.10133934021}, {1346.56005859375,567.548583984375,23.3004989624023}, {1346.56005859375,564.398986816406,17.0020332336426}, {1346.56005859375,564.398986816406,23.0018501281738}, {1346.56005859375,564.398986816406,23.3004989624023}, {1346.56005859375,575.118957519531,17.0014991760254}, {1346.56005859375,574.754028320312,23.3004989624023} },
+ { {0,1,2}, {2,3,4}, {2,5,0}, {4,6,2}, {2,6,5}, {2,1,3}, {7,8,9}, {10,9,8}, {11,9,10}, {12,9,11}, {9,13,14}, {7,15,16}, {10,17,0}, {10,0,5}, {12,11,6}, {18,16,0}, {6,19,13}, {6,13,9}, {9,12,6}, {17,18,0}, {11,10,5}, {11,5,6}, {14,16,15}, {17,7,18}, {16,18,7}, {14,15,9}, {7,9,15}, {7,17,8}, {10,8,17}, {20,21,22}, {23,24,25}, {26,23,27}, {28,27,23}, {29,28,23}, {30,29,23}, {25,31,32}, {22,33,34}, {35,36,37}, {24,38,39}, {21,40,41}, {38,42,20}, {33,43,44}, {6,4,23}, {6,23,25}, {36,35,1}, {1,0,38}, {1,38,36}, {29,30,4}, {25,32,6}, {40,42,0}, {35,45,1}, {4,3,28}, {4,28,29}, {3,1,45}, {3,45,28}, {22,34,19}, {19,6,32}, {19,32,22}, {42,38,0}, {30,23,4}, {0,16,43}, {0,43,40}, {24,37,36}, {38,24,36}, {24,23,37}, {37,23,26}, {22,32,20}, {20,32,31}, {33,41,40}, {43,33,40}, {45,35,26}, {37,26,35}, {33,44,34}, {44,43,46}, {20,42,21}, {40,21,42}, {31,39,38}, {20,31,38}, {33,22,41}, {21,41,22}, {31,25,39}, {24,39,25}, {26,27,45}, {28,45,27}, {47,48,49}, {47,50,48}, {51,48,50}, {52,48,51}, {53,48,52}, {54,55,56}, {57,55,54}, {58,55,57}, {49,59,47}, {60,56,55}, {59,56,60}, {60,47,59}, {48,53,16}, {56,13,19}, {54,56,19}, {56,59,13}, {59,49,14}, {59,14,13}, {49,48,16}, {49,16,14}, {44,46,60}, {44,60,55}, {51,50,43}, {19,34,58}, {19,58,57}, {53,52,16}, {43,16,52}, {43,52,51}, {57,54,19}, {47,60,46}, {55,58,34}, {55,34,44}, {50,47,46}, {50,46,43} });
break;
case TestMesh::_40x10:
mesh = TriangleMesh(
- { Vec3d(12.8680295944214,29.5799007415771,12), Vec3d(11.7364797592163,29.8480796813965,12), Vec3d(11.1571502685547,29.5300102233887,12), Vec3d(10.5814504623413,29.9830799102783,12), Vec3d(10,29.6000003814697,12), Vec3d(9.41855144500732,29.9830799102783,12), Vec3d(8.84284687042236,29.5300102233887,12), Vec3d(8.26351833343506,29.8480796813965,12), Vec3d(7.70256900787354,29.3210391998291,12), Vec3d(7.13196802139282,29.5799007415771,12), Vec3d(6.59579277038574,28.9761600494385,12), Vec3d(6.03920221328735,29.1821594238281,12), Vec3d(5.53865718841553,28.5003795623779,12), Vec3d(5,28.6602592468262,12), Vec3d(4.54657793045044,27.9006500244141,12), Vec3d(4.02841377258301,28.0212306976318,12), Vec3d(3.63402199745178,27.1856994628906,12), Vec3d(3.13758301734924,27.2737407684326,12), Vec3d(2.81429696083069,26.3659801483154,12), Vec3d(2.33955597877502,26.4278793334961,12), Vec3d(2.0993549823761,25.4534206390381,12), Vec3d(1.64512205123901,25.4950904846191,12), Vec3d(1.49962198734283,24.4613399505615,12), Vec3d(1.0636739730835,24.4879894256592,12), Vec3d(1.02384400367737,23.4042091369629,12), Vec3d(0.603073298931122,23.4202003479004,12), Vec3d(0.678958415985107,22.2974300384521,12), Vec3d(0.269550800323486,22.3061599731445,12), Vec3d(0.469994693994522,21.1571502685547,12), Vec3d(0.067615881562233,21.1609306335449,12), Vec3d(0.399999290704727,20,12), Vec3d(0,20,12), Vec3d(0.399999290704727,5,12), Vec3d(0,5,12), Vec3d(0.456633001565933,4.2804012298584,12), Vec3d(0.0615576282143593,4.21782684326172,12), Vec3d(0.625140011310577,3.5785219669342,12), Vec3d(0.244717106223106,3.45491504669189,12), Vec3d(0.901369392871857,2.91164398193359,12), Vec3d(0.544967114925385,2.73004698753357,12), Vec3d(1.27852201461792,2.29618692398071,12), Vec3d(0.954914808273315,2.06107401847839,12), Vec3d(1.74730801582336,1.74730801582336,12), Vec3d(1.46446597576141,1.46446597576141,12), Vec3d(2.29618692398071,1.27852201461792,12), Vec3d(2.06107401847839,0.954914808273315,12), Vec3d(2.91164398193359,0.901369392871857,12), Vec3d(2.73004698753357,0.544967114925385,12), Vec3d(3.5785219669342,0.625140011310577,12), Vec3d(3.45491504669189,0.244717106223106,12), Vec3d(4.2804012298584,0.456633001565933,12), Vec3d(4.21782684326172,0.0615576282143593,12), Vec3d(5,0.399999290704727,12), Vec3d(5,0,12), Vec3d(19.6000003814697,0.399999290704727,12), Vec3d(20,0,12), Vec3d(19.6000003814697,20,12), Vec3d(20,20,12), Vec3d(19.5300102233887,21.1571502685547,12), Vec3d(19.9323806762695,21.1609306335449,12), Vec3d(19.3210391998291,22.2974300384521,12), Vec3d(19.7304496765137,22.3061599731445,12), Vec3d(18.9761600494385,23.4042091369629,12), Vec3d(19.3969306945801,23.4202003479004,12), Vec3d(18.5003795623779,24.4613399505615,12), Vec3d(18.9363307952881,24.4879894256592,12), Vec3d(17.9006500244141,25.4534206390381,12), Vec3d(18.3548793792725,25.4950904846191,12), Vec3d(17.1856994628906,26.3659801483154,12), Vec3d(17.6604404449463,26.4278793334961,12), Vec3d(16.3659801483154,27.1856994628906,12), Vec3d(16.862419128418,27.2737407684326,12), Vec3d(15.4534196853638,27.9006500244141,12), Vec3d(15.9715900421143,28.0212306976318,12), Vec3d(14.4613399505615,28.5003795623779,12), Vec3d(15,28.6602592468262,12), Vec3d(13.4042100906372,28.9761600494385,12), Vec3d(13.9608001708984,29.1821594238281,12), Vec3d(12.2974300384521,29.3210391998291,12), Vec3d(7.13196802139282,29.5799007415771,0), Vec3d(8.26351833343506,29.8480796813965,0), Vec3d(8.84284687042236,29.5300102233887,0), Vec3d(9.41855144500732,29.9830799102783,0), Vec3d(10,29.6000003814697,0), Vec3d(10.5814504623413,29.9830799102783,0), Vec3d(11.1571502685547,29.5300102233887,0), Vec3d(11.7364797592163,29.8480796813965,0), Vec3d(12.2974300384521,29.3210391998291,0), Vec3d(12.8680295944214,29.5799007415771,0), Vec3d(13.4042100906372,28.9761600494385,0), Vec3d(13.9608001708984,29.1821594238281,0), Vec3d(14.4613399505615,28.5003795623779,0), Vec3d(15,28.6602592468262,0), Vec3d(15.4534196853638,27.9006500244141,0), Vec3d(15.9715900421143,28.0212306976318,0), Vec3d(16.3659801483154,27.1856994628906,0), Vec3d(16.862419128418,27.2737407684326,0), Vec3d(17.1856994628906,26.3659801483154,0), Vec3d(17.6604404449463,26.4278793334961,0), Vec3d(17.9006500244141,25.4534206390381,0), Vec3d(18.3548793792725,25.4950904846191,0), Vec3d(18.5003795623779,24.4613399505615,0), Vec3d(18.9363307952881,24.4879894256592,0), Vec3d(18.9761600494385,23.4042091369629,0), Vec3d(19.3969306945801,23.4202003479004,0), Vec3d(19.3210391998291,22.2974300384521,0), Vec3d(19.7304496765137,22.3061599731445,0), Vec3d(19.5300102233887,21.1571502685547,0), Vec3d(19.9323806762695,21.1609306335449,0), Vec3d(19.6000003814697,20,0), Vec3d(20,20,0), Vec3d(19.6000003814697,0.399999290704727,0), Vec3d(20,0,0), Vec3d(5,0.399999290704727,0), Vec3d(5,0,0), Vec3d(4.2804012298584,0.456633001565933,0), Vec3d(4.21782684326172,0.0615576282143593,0), Vec3d(3.5785219669342,0.625140011310577,0), Vec3d(3.45491504669189,0.244717106223106,0), Vec3d(2.91164398193359,0.901369392871857,0), Vec3d(2.73004698753357,0.544967114925385,0), Vec3d(2.29618692398071,1.27852201461792,0), Vec3d(2.06107401847839,0.954914808273315,0), Vec3d(1.74730801582336,1.74730801582336,0), Vec3d(1.46446597576141,1.46446597576141,0), Vec3d(1.27852201461792,2.29618692398071,0), Vec3d(0.954914808273315,2.06107401847839,0), Vec3d(0.901369392871857,2.91164398193359,0), Vec3d(0.544967114925385,2.73004698753357,0), Vec3d(0.625140011310577,3.5785219669342,0), Vec3d(0.244717106223106,3.45491504669189,0), Vec3d(0.456633001565933,4.2804012298584,0), Vec3d(0.0615576282143593,4.21782684326172,0), Vec3d(0.399999290704727,5,0), Vec3d(0,5,0), Vec3d(0.399999290704727,20,0), Vec3d(0,20,0), Vec3d(0.469994693994522,21.1571502685547,0), Vec3d(0.067615881562233,21.1609306335449,0), Vec3d(0.678958415985107,22.2974300384521,0), Vec3d(0.269550800323486,22.3061599731445,0), Vec3d(1.02384400367737,23.4042091369629,0), Vec3d(0.603073298931122,23.4202003479004,0), Vec3d(1.49962198734283,24.4613399505615,0), Vec3d(1.0636739730835,24.4879894256592,0), Vec3d(2.0993549823761,25.4534206390381,0), Vec3d(1.64512205123901,25.4950904846191,0), Vec3d(2.81429696083069,26.3659801483154,0), Vec3d(2.33955597877502,26.4278793334961,0), Vec3d(3.63402199745178,27.1856994628906,0), Vec3d(3.13758301734924,27.2737407684326,0), Vec3d(4.54657793045044,27.9006500244141,0), Vec3d(4.02841377258301,28.0212306976318,0), Vec3d(5.53865718841553,28.5003795623779,0), Vec3d(5,28.6602592468262,0), Vec3d(6.59579277038574,28.9761600494385,0), Vec3d(6.03920221328735,29.1821594238281,0), Vec3d(7.70256900787354,29.3210391998291,0) },
- { Vec3crd(0,1,2), Vec3crd(2,1,3), Vec3crd(2,3,4), Vec3crd(4,3,5), Vec3crd(4,5,6), Vec3crd(6,5,7), Vec3crd(6,7,8), Vec3crd(8,7,9), Vec3crd(8,9,10), Vec3crd(10,9,11), Vec3crd(10,11,12), Vec3crd(12,11,13), Vec3crd(12,13,14), Vec3crd(14,13,15), Vec3crd(14,15,16), Vec3crd(16,15,17), Vec3crd(16,17,18), Vec3crd(18,17,19), Vec3crd(18,19,20), Vec3crd(20,19,21), Vec3crd(20,21,22), Vec3crd(22,21,23), Vec3crd(22,23,24), Vec3crd(24,23,25), Vec3crd(24,25,26), Vec3crd(26,25,27), Vec3crd(26,27,28), Vec3crd(28,27,29), Vec3crd(28,29,30), Vec3crd(30,29,31), Vec3crd(30,31,32), Vec3crd(32,31,33), Vec3crd(32,33,34), Vec3crd(34,33,35), Vec3crd(34,35,36), Vec3crd(36,35,37), Vec3crd(36,37,38), Vec3crd(38,37,39), Vec3crd(38,39,40), Vec3crd(40,39,41), Vec3crd(40,41,42), Vec3crd(42,41,43), Vec3crd(42,43,44), Vec3crd(44,43,45), Vec3crd(44,45,46), Vec3crd(46,45,47), Vec3crd(46,47,48), Vec3crd(48,47,49), Vec3crd(48,49,50), Vec3crd(50,49,51), Vec3crd(50,51,52), Vec3crd(52,51,53), Vec3crd(52,53,54), Vec3crd(54,53,55), Vec3crd(54,55,56), Vec3crd(56,55,57), Vec3crd(56,57,58), Vec3crd(58,57,59), Vec3crd(58,59,60), Vec3crd(60,59,61), Vec3crd(60,61,62), Vec3crd(62,61,63), Vec3crd(62,63,64), Vec3crd(64,63,65), Vec3crd(64,65,66), Vec3crd(66,65,67), Vec3crd(66,67,68), Vec3crd(68,67,69), Vec3crd(68,69,70), Vec3crd(70,69,71), Vec3crd(70,71,72), Vec3crd(72,71,73), Vec3crd(72,73,74), Vec3crd(74,73,75), Vec3crd(74,75,76), Vec3crd(76,75,77), Vec3crd(76,77,78), Vec3crd(78,77,0), Vec3crd(78,0,2), Vec3crd(79,80,81), Vec3crd(81,80,82), Vec3crd(81,82,83), Vec3crd(83,82,84), Vec3crd(83,84,85), Vec3crd(85,84,86), Vec3crd(85,86,87), Vec3crd(87,86,88), Vec3crd(87,88,89), Vec3crd(89,88,90), Vec3crd(89,90,91), Vec3crd(91,90,92), Vec3crd(91,92,93), Vec3crd(93,92,94), Vec3crd(93,94,95), Vec3crd(95,94,96), Vec3crd(95,96,97), Vec3crd(97,96,98), Vec3crd(97,98,99), Vec3crd(99,98,100), Vec3crd(99,100,101), Vec3crd(101,100,102), Vec3crd(101,102,103), Vec3crd(103,102,104), Vec3crd(103,104,105), Vec3crd(105,104,106), Vec3crd(105,106,107), Vec3crd(107,106,108), Vec3crd(107,108,109), Vec3crd(109,108,110), Vec3crd(109,110,111), Vec3crd(111,110,112), Vec3crd(111,112,113), Vec3crd(113,112,114), Vec3crd(113,114,115), Vec3crd(115,114,116), Vec3crd(115,116,117), Vec3crd(117,116,118), Vec3crd(117,118,119), Vec3crd(119,118,120), Vec3crd(119,120,121), Vec3crd(121,120,122), Vec3crd(121,122,123), Vec3crd(123,122,124), Vec3crd(123,124,125), Vec3crd(125,124,126), Vec3crd(125,126,127), Vec3crd(127,126,128), Vec3crd(127,128,129), Vec3crd(129,128,130), Vec3crd(129,130,131), Vec3crd(131,130,132), Vec3crd(131,132,133), Vec3crd(133,132,134), Vec3crd(133,134,135), Vec3crd(135,134,136), Vec3crd(135,136,137), Vec3crd(137,136,138), Vec3crd(137,138,139), Vec3crd(139,138,140), Vec3crd(139,140,141), Vec3crd(141,140,142), Vec3crd(141,142,143), Vec3crd(143,142,144), Vec3crd(143,144,145), Vec3crd(145,144,146), Vec3crd(145,146,147), Vec3crd(147,146,148), Vec3crd(147,148,149), Vec3crd(149,148,150), Vec3crd(149,150,151), Vec3crd(151,150,152), Vec3crd(151,152,153), Vec3crd(153,152,154), Vec3crd(153,154,155), Vec3crd(155,154,156), Vec3crd(155,156,157), Vec3crd(157,156,79), Vec3crd(157,79,81), Vec3crd(57,110,108), Vec3crd(57,108,59), Vec3crd(59,108,106), Vec3crd(59,106,61), Vec3crd(61,106,104), Vec3crd(61,104,63), Vec3crd(63,104,102), Vec3crd(63,102,65), Vec3crd(65,102,100), Vec3crd(65,100,67), Vec3crd(67,100,98), Vec3crd(67,98,69), Vec3crd(69,98,96), Vec3crd(69,96,71), Vec3crd(71,96,94), Vec3crd(71,94,73), Vec3crd(73,94,92), Vec3crd(73,92,75), Vec3crd(75,92,90), Vec3crd(75,90,77), Vec3crd(77,90,88), Vec3crd(77,88,0), Vec3crd(0,88,86), Vec3crd(0,86,1), Vec3crd(1,86,84), Vec3crd(1,84,3), Vec3crd(3,84,82), Vec3crd(3,82,5), Vec3crd(5,82,80), Vec3crd(5,80,7), Vec3crd(7,80,79), Vec3crd(7,79,9), Vec3crd(9,79,156), Vec3crd(9,156,11), Vec3crd(11,156,154), Vec3crd(11,154,13), Vec3crd(13,154,152), Vec3crd(13,152,15), Vec3crd(15,152,150), Vec3crd(15,150,17), Vec3crd(17,150,148), Vec3crd(17,148,19), Vec3crd(19,148,146), Vec3crd(19,146,21), Vec3crd(21,146,144), Vec3crd(21,144,23), Vec3crd(23,144,142), Vec3crd(23,142,25), Vec3crd(25,142,140), Vec3crd(25,140,27), Vec3crd(27,140,138), Vec3crd(27,138,29), Vec3crd(29,138,136), Vec3crd(29,136,31), Vec3crd(33,31,134), Vec3crd(134,31,136), Vec3crd(33,134,132), Vec3crd(33,132,35), Vec3crd(35,132,130), Vec3crd(35,130,37), Vec3crd(37,130,128), Vec3crd(37,128,39), Vec3crd(39,128,126), Vec3crd(39,126,41), Vec3crd(41,126,124), Vec3crd(41,124,43), Vec3crd(43,124,122), Vec3crd(43,122,45), Vec3crd(45,122,120), Vec3crd(45,120,47), Vec3crd(47,120,118), Vec3crd(47,118,49), Vec3crd(49,118,116), Vec3crd(49,116,51), Vec3crd(51,116,114), Vec3crd(51,114,53), Vec3crd(55,53,112), Vec3crd(112,53,114), Vec3crd(57,55,110), Vec3crd(110,55,112), Vec3crd(30,135,137), Vec3crd(30,137,28), Vec3crd(28,137,139), Vec3crd(28,139,26), Vec3crd(26,139,141), Vec3crd(26,141,24), Vec3crd(24,141,143), Vec3crd(24,143,22), Vec3crd(22,143,145), Vec3crd(22,145,20), Vec3crd(20,145,147), Vec3crd(20,147,18), Vec3crd(18,147,149), Vec3crd(18,149,16), Vec3crd(16,149,151), Vec3crd(16,151,14), Vec3crd(14,151,153), Vec3crd(14,153,12), Vec3crd(12,153,155), Vec3crd(12,155,10), Vec3crd(10,155,157), Vec3crd(10,157,8), Vec3crd(8,157,81), Vec3crd(8,81,6), Vec3crd(6,81,83), Vec3crd(6,83,4), Vec3crd(4,83,85), Vec3crd(4,85,2), Vec3crd(2,85,87), Vec3crd(2,87,78), Vec3crd(78,87,89), Vec3crd(78,89,76), Vec3crd(76,89,91), Vec3crd(76,91,74), Vec3crd(74,91,93), Vec3crd(74,93,72), Vec3crd(72,93,95), Vec3crd(72,95,70), Vec3crd(70,95,97), Vec3crd(70,97,68), Vec3crd(68,97,99), Vec3crd(68,99,66), Vec3crd(66,99,101), Vec3crd(66,101,64), Vec3crd(64,101,103), Vec3crd(64,103,62), Vec3crd(62,103,105), Vec3crd(62,105,60), Vec3crd(60,105,107), Vec3crd(60,107,58), Vec3crd(58,107,109), Vec3crd(58,109,56), Vec3crd(30,32,135), Vec3crd(135,32,133), Vec3crd(52,113,115), Vec3crd(52,115,50), Vec3crd(50,115,117), Vec3crd(50,117,48), Vec3crd(48,117,119), Vec3crd(48,119,46), Vec3crd(46,119,121), Vec3crd(46,121,44), Vec3crd(44,121,123), Vec3crd(44,123,42), Vec3crd(42,123,125), Vec3crd(42,125,40), Vec3crd(40,125,127), Vec3crd(40,127,38), Vec3crd(38,127,129), Vec3crd(38,129,36), Vec3crd(36,129,131), Vec3crd(36,131,34), Vec3crd(34,131,133), Vec3crd(34,133,32), Vec3crd(52,54,113), Vec3crd(113,54,111), Vec3crd(54,56,111), Vec3crd(111,56,109) });
+ { {12.8680295944214,29.5799007415771,12}, {11.7364797592163,29.8480796813965,12}, {11.1571502685547,29.5300102233887,12}, {10.5814504623413,29.9830799102783,12}, {10,29.6000003814697,12}, {9.41855144500732,29.9830799102783,12}, {8.84284687042236,29.5300102233887,12}, {8.26351833343506,29.8480796813965,12}, {7.70256900787354,29.3210391998291,12}, {7.13196802139282,29.5799007415771,12}, {6.59579277038574,28.9761600494385,12}, {6.03920221328735,29.1821594238281,12}, {5.53865718841553,28.5003795623779,12}, {5,28.6602592468262,12}, {4.54657793045044,27.9006500244141,12}, {4.02841377258301,28.0212306976318,12}, {3.63402199745178,27.1856994628906,12}, {3.13758301734924,27.2737407684326,12}, {2.81429696083069,26.3659801483154,12}, {2.33955597877502,26.4278793334961,12}, {2.0993549823761,25.4534206390381,12}, {1.64512205123901,25.4950904846191,12}, {1.49962198734283,24.4613399505615,12}, {1.0636739730835,24.4879894256592,12}, {1.02384400367737,23.4042091369629,12}, {0.603073298931122,23.4202003479004,12}, {0.678958415985107,22.2974300384521,12}, {0.269550800323486,22.3061599731445,12}, {0.469994693994522,21.1571502685547,12}, {0.067615881562233,21.1609306335449,12}, {0.399999290704727,20,12}, {0,20,12}, {0.399999290704727,5,12}, {0,5,12}, {0.456633001565933,4.2804012298584,12}, {0.0615576282143593,4.21782684326172,12}, {0.625140011310577,3.5785219669342,12}, {0.244717106223106,3.45491504669189,12}, {0.901369392871857,2.91164398193359,12}, {0.544967114925385,2.73004698753357,12}, {1.27852201461792,2.29618692398071,12}, {0.954914808273315,2.06107401847839,12}, {1.74730801582336,1.74730801582336,12}, {1.46446597576141,1.46446597576141,12}, {2.29618692398071,1.27852201461792,12}, {2.06107401847839,0.954914808273315,12}, {2.91164398193359,0.901369392871857,12}, {2.73004698753357,0.544967114925385,12}, {3.5785219669342,0.625140011310577,12}, {3.45491504669189,0.244717106223106,12}, {4.2804012298584,0.456633001565933,12}, {4.21782684326172,0.0615576282143593,12}, {5,0.399999290704727,12}, {5,0,12}, {19.6000003814697,0.399999290704727,12}, {20,0,12}, {19.6000003814697,20,12}, {20,20,12}, {19.5300102233887,21.1571502685547,12}, {19.9323806762695,21.1609306335449,12}, {19.3210391998291,22.2974300384521,12}, {19.7304496765137,22.3061599731445,12}, {18.9761600494385,23.4042091369629,12}, {19.3969306945801,23.4202003479004,12}, {18.5003795623779,24.4613399505615,12}, {18.9363307952881,24.4879894256592,12}, {17.9006500244141,25.4534206390381,12}, {18.3548793792725,25.4950904846191,12}, {17.1856994628906,26.3659801483154,12}, {17.6604404449463,26.4278793334961,12}, {16.3659801483154,27.1856994628906,12}, {16.862419128418,27.2737407684326,12}, {15.4534196853638,27.9006500244141,12}, {15.9715900421143,28.0212306976318,12}, {14.4613399505615,28.5003795623779,12}, {15,28.6602592468262,12}, {13.4042100906372,28.9761600494385,12}, {13.9608001708984,29.1821594238281,12}, {12.2974300384521,29.3210391998291,12}, {7.13196802139282,29.5799007415771,0}, {8.26351833343506,29.8480796813965,0}, {8.84284687042236,29.5300102233887,0}, {9.41855144500732,29.9830799102783,0}, {10,29.6000003814697,0}, {10.5814504623413,29.9830799102783,0}, {11.1571502685547,29.5300102233887,0}, {11.7364797592163,29.8480796813965,0}, {12.2974300384521,29.3210391998291,0}, {12.8680295944214,29.5799007415771,0}, {13.4042100906372,28.9761600494385,0}, {13.9608001708984,29.1821594238281,0}, {14.4613399505615,28.5003795623779,0}, {15,28.6602592468262,0}, {15.4534196853638,27.9006500244141,0}, {15.9715900421143,28.0212306976318,0}, {16.3659801483154,27.1856994628906,0}, {16.862419128418,27.2737407684326,0}, {17.1856994628906,26.3659801483154,0}, {17.6604404449463,26.4278793334961,0}, {17.9006500244141,25.4534206390381,0}, {18.3548793792725,25.4950904846191,0}, {18.5003795623779,24.4613399505615,0}, {18.9363307952881,24.4879894256592,0}, {18.9761600494385,23.4042091369629,0}, {19.3969306945801,23.4202003479004,0}, {19.3210391998291,22.2974300384521,0}, {19.7304496765137,22.3061599731445,0}, {19.5300102233887,21.1571502685547,0}, {19.9323806762695,21.1609306335449,0}, {19.6000003814697,20,0}, {20,20,0}, {19.6000003814697,0.399999290704727,0}, {20,0,0}, {5,0.399999290704727,0}, {5,0,0}, {4.2804012298584,0.456633001565933,0}, {4.21782684326172,0.0615576282143593,0}, {3.5785219669342,0.625140011310577,0}, {3.45491504669189,0.244717106223106,0}, {2.91164398193359,0.901369392871857,0}, {2.73004698753357,0.544967114925385,0}, {2.29618692398071,1.27852201461792,0}, {2.06107401847839,0.954914808273315,0}, {1.74730801582336,1.74730801582336,0}, {1.46446597576141,1.46446597576141,0}, {1.27852201461792,2.29618692398071,0}, {0.954914808273315,2.06107401847839,0}, {0.901369392871857,2.91164398193359,0}, {0.544967114925385,2.73004698753357,0}, {0.625140011310577,3.5785219669342,0}, {0.244717106223106,3.45491504669189,0}, {0.456633001565933,4.2804012298584,0}, {0.0615576282143593,4.21782684326172,0}, {0.399999290704727,5,0}, {0,5,0}, {0.399999290704727,20,0}, {0,20,0}, {0.469994693994522,21.1571502685547,0}, {0.067615881562233,21.1609306335449,0}, {0.678958415985107,22.2974300384521,0}, {0.269550800323486,22.3061599731445,0}, {1.02384400367737,23.4042091369629,0}, {0.603073298931122,23.4202003479004,0}, {1.49962198734283,24.4613399505615,0}, {1.0636739730835,24.4879894256592,0}, {2.0993549823761,25.4534206390381,0}, {1.64512205123901,25.4950904846191,0}, {2.81429696083069,26.3659801483154,0}, {2.33955597877502,26.4278793334961,0}, {3.63402199745178,27.1856994628906,0}, {3.13758301734924,27.2737407684326,0}, {4.54657793045044,27.9006500244141,0}, {4.02841377258301,28.0212306976318,0}, {5.53865718841553,28.5003795623779,0}, {5,28.6602592468262,0}, {6.59579277038574,28.9761600494385,0}, {6.03920221328735,29.1821594238281,0}, {7.70256900787354,29.3210391998291,0} },
+ { {0,1,2}, {2,1,3}, {2,3,4}, {4,3,5}, {4,5,6}, {6,5,7}, {6,7,8}, {8,7,9}, {8,9,10}, {10,9,11}, {10,11,12}, {12,11,13}, {12,13,14}, {14,13,15}, {14,15,16}, {16,15,17}, {16,17,18}, {18,17,19}, {18,19,20}, {20,19,21}, {20,21,22}, {22,21,23}, {22,23,24}, {24,23,25}, {24,25,26}, {26,25,27}, {26,27,28}, {28,27,29}, {28,29,30}, {30,29,31}, {30,31,32}, {32,31,33}, {32,33,34}, {34,33,35}, {34,35,36}, {36,35,37}, {36,37,38}, {38,37,39}, {38,39,40}, {40,39,41}, {40,41,42}, {42,41,43}, {42,43,44}, {44,43,45}, {44,45,46}, {46,45,47}, {46,47,48}, {48,47,49}, {48,49,50}, {50,49,51}, {50,51,52}, {52,51,53}, {52,53,54}, {54,53,55}, {54,55,56}, {56,55,57}, {56,57,58}, {58,57,59}, {58,59,60}, {60,59,61}, {60,61,62}, {62,61,63}, {62,63,64}, {64,63,65}, {64,65,66}, {66,65,67}, {66,67,68}, {68,67,69}, {68,69,70}, {70,69,71}, {70,71,72}, {72,71,73}, {72,73,74}, {74,73,75}, {74,75,76}, {76,75,77}, {76,77,78}, {78,77,0}, {78,0,2}, {79,80,81}, {81,80,82}, {81,82,83}, {83,82,84}, {83,84,85}, {85,84,86}, {85,86,87}, {87,86,88}, {87,88,89}, {89,88,90}, {89,90,91}, {91,90,92}, {91,92,93}, {93,92,94}, {93,94,95}, {95,94,96}, {95,96,97}, {97,96,98}, {97,98,99}, {99,98,100}, {99,100,101}, {101,100,102}, {101,102,103}, {103,102,104}, {103,104,105}, {105,104,106}, {105,106,107}, {107,106,108}, {107,108,109}, {109,108,110}, {109,110,111}, {111,110,112}, {111,112,113}, {113,112,114}, {113,114,115}, {115,114,116}, {115,116,117}, {117,116,118}, {117,118,119}, {119,118,120}, {119,120,121}, {121,120,122}, {121,122,123}, {123,122,124}, {123,124,125}, {125,124,126}, {125,126,127}, {127,126,128}, {127,128,129}, {129,128,130}, {129,130,131}, {131,130,132}, {131,132,133}, {133,132,134}, {133,134,135}, {135,134,136}, {135,136,137}, {137,136,138}, {137,138,139}, {139,138,140}, {139,140,141}, {141,140,142}, {141,142,143}, {143,142,144}, {143,144,145}, {145,144,146}, {145,146,147}, {147,146,148}, {147,148,149}, {149,148,150}, {149,150,151}, {151,150,152}, {151,152,153}, {153,152,154}, {153,154,155}, {155,154,156}, {155,156,157}, {157,156,79}, {157,79,81}, {57,110,108}, {57,108,59}, {59,108,106}, {59,106,61}, {61,106,104}, {61,104,63}, {63,104,102}, {63,102,65}, {65,102,100}, {65,100,67}, {67,100,98}, {67,98,69}, {69,98,96}, {69,96,71}, {71,96,94}, {71,94,73}, {73,94,92}, {73,92,75}, {75,92,90}, {75,90,77}, {77,90,88}, {77,88,0}, {0,88,86}, {0,86,1}, {1,86,84}, {1,84,3}, {3,84,82}, {3,82,5}, {5,82,80}, {5,80,7}, {7,80,79}, {7,79,9}, {9,79,156}, {9,156,11}, {11,156,154}, {11,154,13}, {13,154,152}, {13,152,15}, {15,152,150}, {15,150,17}, {17,150,148}, {17,148,19}, {19,148,146}, {19,146,21}, {21,146,144}, {21,144,23}, {23,144,142}, {23,142,25}, {25,142,140}, {25,140,27}, {27,140,138}, {27,138,29}, {29,138,136}, {29,136,31}, {33,31,134}, {134,31,136}, {33,134,132}, {33,132,35}, {35,132,130}, {35,130,37}, {37,130,128}, {37,128,39}, {39,128,126}, {39,126,41}, {41,126,124}, {41,124,43}, {43,124,122}, {43,122,45}, {45,122,120}, {45,120,47}, {47,120,118}, {47,118,49}, {49,118,116}, {49,116,51}, {51,116,114}, {51,114,53}, {55,53,112}, {112,53,114}, {57,55,110}, {110,55,112}, {30,135,137}, {30,137,28}, {28,137,139}, {28,139,26}, {26,139,141}, {26,141,24}, {24,141,143}, {24,143,22}, {22,143,145}, {22,145,20}, {20,145,147}, {20,147,18}, {18,147,149}, {18,149,16}, {16,149,151}, {16,151,14}, {14,151,153}, {14,153,12}, {12,153,155}, {12,155,10}, {10,155,157}, {10,157,8}, {8,157,81}, {8,81,6}, {6,81,83}, {6,83,4}, {4,83,85}, {4,85,2}, {2,85,87}, {2,87,78}, {78,87,89}, {78,89,76}, {76,89,91}, {76,91,74}, {74,91,93}, {74,93,72}, {72,93,95}, {72,95,70}, {70,95,97}, {70,97,68}, {68,97,99}, {68,99,66}, {66,99,101}, {66,101,64}, {64,101,103}, {64,103,62}, {62,103,105}, {62,105,60}, {60,105,107}, {60,107,58}, {58,107,109}, {58,109,56}, {30,32,135}, {135,32,133}, {52,113,115}, {52,115,50}, {50,115,117}, {50,117,48}, {48,117,119}, {48,119,46}, {46,119,121}, {46,121,44}, {44,121,123}, {44,123,42}, {42,123,125}, {42,125,40}, {40,125,127}, {40,127,38}, {38,127,129}, {38,129,36}, {36,129,131}, {36,131,34}, {34,131,133}, {34,133,32}, {52,54,113}, {113,54,111}, {54,56,111}, {111,56,109} });
break;
case TestMesh::sloping_hole:
mesh = TriangleMesh(
- { Vec3d(-20,-20,-5), Vec3d(-20,-20,5), Vec3d(-20,20,-5), Vec3d(-20,20,5), Vec3d(20,-20,-5), Vec3d(20,-20,5), Vec3d(4.46294021606445,7.43144989013672,-5), Vec3d(20,20,-5), Vec3d(-19.1420993804932,0,-5), Vec3d(-18.8330993652344,-2.07911992073059,-5), Vec3d(-17.9195003509521,-4.06736993789673,-5), Vec3d(-16.4412002563477,-5.87785005569458,-5), Vec3d(-14.4629001617432,-7.43144989013672,-5), Vec3d(-12.0711002349854,-8.66024971008301,-5), Vec3d(-9.37016010284424,-9.51056003570557,-5), Vec3d(-3.5217399597168,-9.94521999359131,-5), Vec3d(-6.4782600402832,-9.94521999359131,-5), Vec3d(-0.629840016365051,-9.51056003570557,-5), Vec3d(2.07106995582581,-8.66024971008301,-5), Vec3d(6.44122982025146,-5.87785005569458,-5), Vec3d(4.46294021606445,-7.43144989013672,-5), Vec3d(-12.0711002349854,8.66024971008301,-5), Vec3d(-9.37016010284424,9.51056003570557,-5), Vec3d(7.91947984695435,-4.06736993789673,-5), Vec3d(8.83310031890869,-2.07911992073059,-5), Vec3d(-6.4782600402832,9.94521999359131,-5), Vec3d(-0.629840016365051,9.51056003570557,-5), Vec3d(2.07106995582581,8.66024971008301,-5), Vec3d(9.14214038848877,0,-5), Vec3d(8.83310031890869,2.07911992073059,-5), Vec3d(-3.5217399597168,9.94521999359131,-5), Vec3d(7.91947984695435,4.06736993789673,-5), Vec3d(6.44122982025146,5.87785005569458,-5), Vec3d(-14.4629001617432,7.43144989013672,-5), Vec3d(-16.4412002563477,5.87785005569458,-5), Vec3d(-17.9195003509521,4.06736993789673,-5), Vec3d(-18.8330993652344,2.07911992073059,-5), Vec3d(20,20,5), Vec3d(3.5217399597168,-9.94521999359131,5), Vec3d(-8.83310031890869,-2.07911992073059,5), Vec3d(-9.14214038848877,0,5), Vec3d(-8.83310031890869,2.07911992073059,5), Vec3d(6.4782600402832,-9.94521999359131,5), Vec3d(-7.91947984695435,4.06736993789673,5), Vec3d(-6.44122982025146,5.87785005569458,5), Vec3d(-4.46294021606445,7.43144989013672,5), Vec3d(-2.07106995582581,8.66024971008301,5), Vec3d(0.629840016365051,9.51056003570557,5), Vec3d(12.0711002349854,-8.66024971008301,5), Vec3d(9.37016010284424,-9.51056003570557,5), Vec3d(3.5217399597168,9.94521999359131,5), Vec3d(6.4782600402832,9.94521999359131,5), Vec3d(9.37016010284424,9.51056003570557,5), Vec3d(12.0711002349854,8.66024971008301,5), Vec3d(14.4629001617432,7.43144989013672,5), Vec3d(16.4412002563477,-5.87785005569458,5), Vec3d(14.4629001617432,-7.43144989013672,5), Vec3d(16.4412002563477,5.87785005569458,5), Vec3d(17.9195003509521,4.06736993789673,5), Vec3d(18.8330993652344,-2.07911992073059,5), Vec3d(17.9195003509521,-4.06736993789673,5), Vec3d(18.8330993652344,2.07911992073059,5), Vec3d(19.1420993804932,0,5), Vec3d(0.629840016365051,-9.51056003570557,5), Vec3d(-2.07106995582581,-8.66024971008301,5), Vec3d(-4.46294021606445,-7.43144989013672,5), Vec3d(-6.44122982025146,-5.87785005569458,5), Vec3d(-7.91947984695435,-4.06736993789673,5) },
- { Vec3crd(0,1,2), Vec3crd(2,1,3), Vec3crd(1,0,4), Vec3crd(5,1,4), Vec3crd(6,2,7), Vec3crd(0,2,8), Vec3crd(0,8,9), Vec3crd(0,9,10), Vec3crd(0,10,11), Vec3crd(0,11,12), Vec3crd(0,12,13), Vec3crd(0,13,4), Vec3crd(13,14,4), Vec3crd(15,4,16), Vec3crd(17,4,15), Vec3crd(18,4,17), Vec3crd(19,4,20), Vec3crd(18,20,4), Vec3crd(21,2,22), Vec3crd(4,19,23), Vec3crd(4,23,7), Vec3crd(23,24,7), Vec3crd(22,2,25), Vec3crd(26,2,27), Vec3crd(28,29,7), Vec3crd(25,2,30), Vec3crd(29,31,7), Vec3crd(30,2,26), Vec3crd(31,32,7), Vec3crd(27,2,6), Vec3crd(32,6,7), Vec3crd(28,7,24), Vec3crd(33,2,21), Vec3crd(34,2,33), Vec3crd(35,2,34), Vec3crd(36,2,35), Vec3crd(8,2,36), Vec3crd(16,4,14), Vec3crd(2,3,7), Vec3crd(7,3,37), Vec3crd(38,1,5), Vec3crd(3,1,39), Vec3crd(3,39,40), Vec3crd(3,40,41), Vec3crd(42,38,5), Vec3crd(3,41,43), Vec3crd(3,43,44), Vec3crd(37,3,45), Vec3crd(37,45,46), Vec3crd(37,46,47), Vec3crd(48,49,5), Vec3crd(37,47,50), Vec3crd(49,42,5), Vec3crd(37,50,51), Vec3crd(37,51,52), Vec3crd(37,52,53), Vec3crd(37,53,54), Vec3crd(55,56,5), Vec3crd(37,54,57), Vec3crd(37,57,58), Vec3crd(59,60,5), Vec3crd(37,58,61), Vec3crd(37,62,5), Vec3crd(37,61,62), Vec3crd(62,59,5), Vec3crd(60,55,5), Vec3crd(63,1,38), Vec3crd(64,1,63), Vec3crd(65,1,64), Vec3crd(66,1,65), Vec3crd(67,1,66), Vec3crd(39,1,67), Vec3crd(44,45,3), Vec3crd(56,48,5), Vec3crd(5,4,7), Vec3crd(37,5,7), Vec3crd(41,40,36), Vec3crd(36,40,8), Vec3crd(39,9,40), Vec3crd(40,9,8), Vec3crd(43,41,35), Vec3crd(35,41,36), Vec3crd(44,43,34), Vec3crd(34,43,35), Vec3crd(33,45,44), Vec3crd(34,33,44), Vec3crd(21,46,45), Vec3crd(33,21,45), Vec3crd(22,47,46), Vec3crd(21,22,46), Vec3crd(25,50,47), Vec3crd(22,25,47), Vec3crd(30,51,50), Vec3crd(25,30,50), Vec3crd(26,52,51), Vec3crd(30,26,51), Vec3crd(27,53,52), Vec3crd(26,27,52), Vec3crd(6,54,53), Vec3crd(27,6,53), Vec3crd(32,57,54), Vec3crd(6,32,54), Vec3crd(31,58,57), Vec3crd(32,31,57), Vec3crd(29,61,58), Vec3crd(31,29,58), Vec3crd(28,62,61), Vec3crd(29,28,61), Vec3crd(59,62,28), Vec3crd(24,59,28), Vec3crd(60,59,24), Vec3crd(23,60,24), Vec3crd(55,60,23), Vec3crd(19,55,23), Vec3crd(55,19,56), Vec3crd(56,19,20), Vec3crd(56,20,48), Vec3crd(48,20,18), Vec3crd(48,18,49), Vec3crd(49,18,17), Vec3crd(49,17,42), Vec3crd(42,17,15), Vec3crd(42,15,38), Vec3crd(38,15,16), Vec3crd(38,16,63), Vec3crd(63,16,14), Vec3crd(63,14,64), Vec3crd(64,14,13), Vec3crd(64,13,65), Vec3crd(65,13,12), Vec3crd(65,12,66), Vec3crd(66,12,11), Vec3crd(66,11,67), Vec3crd(67,11,10), Vec3crd(67,10,39), Vec3crd(39,10,9) });
+ { {-20,-20,-5}, {-20,-20,5}, {-20,20,-5}, {-20,20,5}, {20,-20,-5}, {20,-20,5}, {4.46294021606445,7.43144989013672,-5}, {20,20,-5}, {-19.1420993804932,0,-5}, {-18.8330993652344,-2.07911992073059,-5}, {-17.9195003509521,-4.06736993789673,-5}, {-16.4412002563477,-5.87785005569458,-5}, {-14.4629001617432,-7.43144989013672,-5}, {-12.0711002349854,-8.66024971008301,-5}, {-9.37016010284424,-9.51056003570557,-5}, {-3.5217399597168,-9.94521999359131,-5}, {-6.4782600402832,-9.94521999359131,-5}, {-0.629840016365051,-9.51056003570557,-5}, {2.07106995582581,-8.66024971008301,-5}, {6.44122982025146,-5.87785005569458,-5}, {4.46294021606445,-7.43144989013672,-5}, {-12.0711002349854,8.66024971008301,-5}, {-9.37016010284424,9.51056003570557,-5}, {7.91947984695435,-4.06736993789673,-5}, {8.83310031890869,-2.07911992073059,-5}, {-6.4782600402832,9.94521999359131,-5}, {-0.629840016365051,9.51056003570557,-5}, {2.07106995582581,8.66024971008301,-5}, {9.14214038848877,0,-5}, {8.83310031890869,2.07911992073059,-5}, {-3.5217399597168,9.94521999359131,-5}, {7.91947984695435,4.06736993789673,-5}, {6.44122982025146,5.87785005569458,-5}, {-14.4629001617432,7.43144989013672,-5}, {-16.4412002563477,5.87785005569458,-5}, {-17.9195003509521,4.06736993789673,-5}, {-18.8330993652344,2.07911992073059,-5}, {20,20,5}, {3.5217399597168,-9.94521999359131,5}, {-8.83310031890869,-2.07911992073059,5}, {-9.14214038848877,0,5}, {-8.83310031890869,2.07911992073059,5}, {6.4782600402832,-9.94521999359131,5}, {-7.91947984695435,4.06736993789673,5}, {-6.44122982025146,5.87785005569458,5}, {-4.46294021606445,7.43144989013672,5}, {-2.07106995582581,8.66024971008301,5}, {0.629840016365051,9.51056003570557,5}, {12.0711002349854,-8.66024971008301,5}, {9.37016010284424,-9.51056003570557,5}, {3.5217399597168,9.94521999359131,5}, {6.4782600402832,9.94521999359131,5}, {9.37016010284424,9.51056003570557,5}, {12.0711002349854,8.66024971008301,5}, {14.4629001617432,7.43144989013672,5}, {16.4412002563477,-5.87785005569458,5}, {14.4629001617432,-7.43144989013672,5}, {16.4412002563477,5.87785005569458,5}, {17.9195003509521,4.06736993789673,5}, {18.8330993652344,-2.07911992073059,5}, {17.9195003509521,-4.06736993789673,5}, {18.8330993652344,2.07911992073059,5}, {19.1420993804932,0,5}, {0.629840016365051,-9.51056003570557,5}, {-2.07106995582581,-8.66024971008301,5}, {-4.46294021606445,-7.43144989013672,5}, {-6.44122982025146,-5.87785005569458,5}, {-7.91947984695435,-4.06736993789673,5} },
+ { {0,1,2}, {2,1,3}, {1,0,4}, {5,1,4}, {6,2,7}, {0,2,8}, {0,8,9}, {0,9,10}, {0,10,11}, {0,11,12}, {0,12,13}, {0,13,4}, {13,14,4}, {15,4,16}, {17,4,15}, {18,4,17}, {19,4,20}, {18,20,4}, {21,2,22}, {4,19,23}, {4,23,7}, {23,24,7}, {22,2,25}, {26,2,27}, {28,29,7}, {25,2,30}, {29,31,7}, {30,2,26}, {31,32,7}, {27,2,6}, {32,6,7}, {28,7,24}, {33,2,21}, {34,2,33}, {35,2,34}, {36,2,35}, {8,2,36}, {16,4,14}, {2,3,7}, {7,3,37}, {38,1,5}, {3,1,39}, {3,39,40}, {3,40,41}, {42,38,5}, {3,41,43}, {3,43,44}, {37,3,45}, {37,45,46}, {37,46,47}, {48,49,5}, {37,47,50}, {49,42,5}, {37,50,51}, {37,51,52}, {37,52,53}, {37,53,54}, {55,56,5}, {37,54,57}, {37,57,58}, {59,60,5}, {37,58,61}, {37,62,5}, {37,61,62}, {62,59,5}, {60,55,5}, {63,1,38}, {64,1,63}, {65,1,64}, {66,1,65}, {67,1,66}, {39,1,67}, {44,45,3}, {56,48,5}, {5,4,7}, {37,5,7}, {41,40,36}, {36,40,8}, {39,9,40}, {40,9,8}, {43,41,35}, {35,41,36}, {44,43,34}, {34,43,35}, {33,45,44}, {34,33,44}, {21,46,45}, {33,21,45}, {22,47,46}, {21,22,46}, {25,50,47}, {22,25,47}, {30,51,50}, {25,30,50}, {26,52,51}, {30,26,51}, {27,53,52}, {26,27,52}, {6,54,53}, {27,6,53}, {32,57,54}, {6,32,54}, {31,58,57}, {32,31,57}, {29,61,58}, {31,29,58}, {28,62,61}, {29,28,61}, {59,62,28}, {24,59,28}, {60,59,24}, {23,60,24}, {55,60,23}, {19,55,23}, {55,19,56}, {56,19,20}, {56,20,48}, {48,20,18}, {48,18,49}, {49,18,17}, {49,17,42}, {42,17,15}, {42,15,38}, {38,15,16}, {38,16,63}, {63,16,14}, {63,14,64}, {64,14,13}, {64,13,65}, {65,13,12}, {65,12,66}, {66,12,11}, {66,11,67}, {67,11,10}, {67,10,39}, {39,10,9} });
break;
case TestMesh::ipadstand:
mesh = TriangleMesh(
- { Vec3d(17.4344673156738,-2.69879599481136e-16,9.5), Vec3d(14.2814798355103,10,9.5), Vec3d(0,0,9.5), Vec3d(31.7159481048584,10,9.5), Vec3d(62.2344741821289,2.06667568800577e-16,20), Vec3d(31.7159481048584,10,20), Vec3d(17.4344673156738,-2.69879599481136e-16,20), Vec3d(62.2344741821289,10,20), Vec3d(98.2079696655273,10,0), Vec3d(98.2079696655273,8.56525380796383e-16,10), Vec3d(98.2079696655273,0,0), Vec3d(98.2079696655273,10,20), Vec3d(98.2079696655273,0,20), Vec3d(81.6609649658203,-4.39753856997999e-16,10), Vec3d(90.0549850463867,10,10), Vec3d(78.5079803466797,10,10), Vec3d(93.2079696655273,8.56525380796383e-16,10), Vec3d(14.2814798355103,10,20), Vec3d(0,0,20), Vec3d(87.4344711303711,2.81343962782118e-15,20), Vec3d(84.2814788818359,10,20), Vec3d(0,10,20), Vec3d(0,0,0), Vec3d(0,10,0), Vec3d(62.2344741821289,2.06667568800577e-16,30), Vec3d(66.9609756469727,10,30), Vec3d(62.2344741821289,10,30), Vec3d(70.1139602661133,8.5525763717214e-16,30), Vec3d(67.7053375244141,10,28.7107200622559), Vec3d(71.6787109375,1.24046736339707e-15,27.2897701263428) },
- { Vec3crd(0,1,2), Vec3crd(1,0,3), Vec3crd(4,5,6), Vec3crd(5,4,7), Vec3crd(8,9,10), Vec3crd(9,11,12), Vec3crd(11,9,8), Vec3crd(13,14,15), Vec3crd(14,13,16), Vec3crd(17,2,1), Vec3crd(2,17,18), Vec3crd(19,11,20), Vec3crd(11,19,12), Vec3crd(17,21,18), Vec3crd(21,2,18), Vec3crd(2,21,22), Vec3crd(22,21,23), Vec3crd(8,22,23), Vec3crd(22,8,10), Vec3crd(24,25,26), Vec3crd(25,24,27), Vec3crd(23,1,8), Vec3crd(1,23,21), Vec3crd(1,21,17), Vec3crd(5,15,3), Vec3crd(15,5,7), Vec3crd(15,7,28), Vec3crd(28,7,26), Vec3crd(28,26,25), Vec3crd(8,14,11), Vec3crd(14,8,3), Vec3crd(3,8,1), Vec3crd(14,3,15), Vec3crd(11,14,20), Vec3crd(26,4,24), Vec3crd(4,26,7), Vec3crd(12,16,9), Vec3crd(16,12,19), Vec3crd(29,4,13), Vec3crd(4,29,24), Vec3crd(24,29,27), Vec3crd(9,22,10), Vec3crd(22,9,0), Vec3crd(0,9,16), Vec3crd(0,16,13), Vec3crd(0,13,6), Vec3crd(6,13,4), Vec3crd(2,22,0), Vec3crd(19,14,16), Vec3crd(14,19,20), Vec3crd(15,29,13), Vec3crd(29,25,27), Vec3crd(25,29,15), Vec3crd(25,15,28), Vec3crd(6,3,0), Vec3crd(3,6,5) });
+ { Vec3d(17.4344673156738,-2.69879599481136e-16,9.5), {14.2814798355103,10,9.5}, {0,0,9.5}, {31.7159481048584,10,9.5}, Vec3d(62.2344741821289,2.06667568800577e-16,20), {31.7159481048584,10,20}, Vec3d(17.4344673156738,-2.69879599481136e-16,20), {62.2344741821289,10,20}, {98.2079696655273,10,0}, Vec3d(98.2079696655273,8.56525380796383e-16,10), {98.2079696655273,0,0}, {98.2079696655273,10,20}, {98.2079696655273,0,20}, Vec3d(81.6609649658203,-4.39753856997999e-16,10), {90.0549850463867,10,10}, {78.5079803466797,10,10}, Vec3d(93.2079696655273,8.56525380796383e-16,10), {14.2814798355103,10,20}, {0,0,20}, Vec3d(87.4344711303711,2.81343962782118e-15,20), {84.2814788818359,10,20}, {0,10,20}, {0,0,0}, {0,10,0}, Vec3d(62.2344741821289,2.06667568800577e-16,30), {66.9609756469727,10,30}, {62.2344741821289,10,30}, Vec3d(70.1139602661133,8.5525763717214e-16,30), {67.7053375244141,10,28.7107200622559}, Vec3d(71.6787109375,1.24046736339707e-15,27.2897701263428) },
+ { {0,1,2}, {1,0,3}, {4,5,6}, {5,4,7}, {8,9,10}, {9,11,12}, {11,9,8}, {13,14,15}, {14,13,16}, {17,2,1}, {2,17,18}, {19,11,20}, {11,19,12}, {17,21,18}, {21,2,18}, {2,21,22}, {22,21,23}, {8,22,23}, {22,8,10}, {24,25,26}, {25,24,27}, {23,1,8}, {1,23,21}, {1,21,17}, {5,15,3}, {15,5,7}, {15,7,28}, {28,7,26}, {28,26,25}, {8,14,11}, {14,8,3}, {3,8,1}, {14,3,15}, {11,14,20}, {26,4,24}, {4,26,7}, {12,16,9}, {16,12,19}, {29,4,13}, {4,29,24}, {24,29,27}, {9,22,10}, {22,9,0}, {0,9,16}, {0,16,13}, {0,13,6}, {6,13,4}, {2,22,0}, {19,14,16}, {14,19,20}, {15,29,13}, {29,25,27}, {25,29,15}, {25,15,28}, {6,3,0}, {3,6,5} });
break;
case TestMesh::A:
mesh = TriangleMesh(
- { Vec3d(513.075988769531,51.6074333190918,36.0009002685547), Vec3d(516.648803710938,51.7324333190918,36.0009002685547), Vec3d(513.495178222656,51.7324333190918,36.0009002685547), Vec3d(489.391204833984,51.4824333190918,24.0011005401611), Vec3d(488.928588867188,51.7324333190918,24.0011005401611), Vec3d(492.06201171875,51.7324333190918,24.0011005401611), Vec3d(496.840393066406,51.2324333190918,24.0011005401611), Vec3d(495.195404052734,51.7324333190918,24.0011005401611), Vec3d(498.981994628906,51.7324333190918,24.0011005401611), Vec3d(506.966613769531,51.6074333190918,24.0011005401611), Vec3d(510.342010498047,51.7324333190918,24.0011005401611), Vec3d(507.163818359375,51.6074333190918,24.0011005401611), Vec3d(512.515380859375,54.7190322875977,36.0009002685547), Vec3d(514.161987304688,54.5058326721191,36.0009002685547), Vec3d(493.06201171875,54.7190322875977,36.0009002685547), Vec3d(495.195404052734,51.7324333190918,36.0009002685547), Vec3d(496.195404052734,54.7190322875977,36.0009002685547), Vec3d(497.195404052734,57.7058334350586,36.0009002685547), Vec3d(500.851989746094,60.2658309936523,36.0009002685547), Vec3d(498.915405273438,62.8258323669434,36.0009002685547), Vec3d(506.701995849609,62.8258323669434,36.0009002685547), Vec3d(503.648590087891,60.2658309936523,36.0009002685547), Vec3d(508.381805419922,57.7058334350586,36.0009002685547), Vec3d(496.418792724609,60.052433013916,36.0009002685547), Vec3d(506.515197753906,72.2124328613281,36.0009002685547), Vec3d(502.808807373047,74.5324325561523,36.0009002685547), Vec3d(503.781982421875,71.6058349609375,36.0009002685547), Vec3d(515.358764648438,55.4658317565918,36.0009002685547), Vec3d(499.375183105469,76.9058380126953,36.0009002685547), Vec3d(501.168792724609,78.0658340454102,36.0009002685547), Vec3d(504.568786621094,78.0658340454102,36.0009002685547), Vec3d(506.32861328125,81.599235534668,36.0009002685547), Vec3d(502.928588867188,81.599235534668,36.0009002685547), Vec3d(499.528594970703,81.599235534668,36.0009002685547), Vec3d(498.20361328125,77.8658294677734,36.0009002685547), Vec3d(495.195404052734,51.7324333190918,30.0011005401611), Vec3d(498.981994628906,51.7324333190918,27.0011005401611), Vec3d(506.555206298828,51.7324333190918,33.0009002685547), Vec3d(506.555206298828,51.7324333190918,36.0009002685547), Vec3d(510.342010498047,51.7324333190918,36.0009002685547), Vec3d(512.515380859375,54.7190322875977,24.0011005401611), Vec3d(509.361999511719,54.7190322875977,24.0011005401611), Vec3d(508.381805419922,57.7058334350586,24.0011005401611), Vec3d(506.701995849609,62.8258323669434,24.0011005401611), Vec3d(509.188812255859,60.052433013916,24.0011005401611), Vec3d(493.06201171875,54.7190322875977,24.0011005401611), Vec3d(503.648590087891,60.2658309936523,24.0011005401611), Vec3d(500.851989746094,60.2658309936523,24.0011005401611), Vec3d(498.915405273438,62.8258323669434,24.0011005401611), Vec3d(502.808807373047,62.8258323669434,24.0011005401611), Vec3d(491.425201416016,54.5058326721191,24.0011005401611), Vec3d(506.421813964844,76.9058380126953,24.0011005401611), Vec3d(502.808807373047,74.5324325561523,24.0011005401611), Vec3d(504.568786621094,78.0658340454102,24.0011005401611), Vec3d(506.32861328125,81.599235534668,24.0011005401611), Vec3d(507.618804931641,77.8658294677734,24.0011005401611), Vec3d(499.221801757812,72.2124328613281,24.0011005401611), Vec3d(501.835388183594,71.6058349609375,24.0011005401611), Vec3d(501.168792724609,78.0658340454102,24.0011005401611), Vec3d(499.528594970703,81.599235534668,24.0011005401611), Vec3d(502.048583984375,79.8324356079102,24.0011005401611), Vec3d(490.253601074219,55.4658317565918,24.0011005401611), Vec3d(488.928588867188,51.7324333190918,30.0011005401611), Vec3d(488.928588867188,51.7324333190918,36.0009002685547), Vec3d(490.253601074219,55.4658317565918,31.5009002685547), Vec3d(498.20361328125,77.8658294677734,34.5009002685547), Vec3d(508.381805419922,57.7058334350586,30.0011005401611), Vec3d(505.585388183594,57.7058334350586,27.0011005401611), Vec3d(502.788818359375,57.7058334350586,36.0009002685547), Vec3d(499.992004394531,57.7058334350586,33.0009002685547), Vec3d(509.851989746094,53.2258338928223,33.0009002685547), Vec3d(509.361999511719,54.7190322875977,36.0009002685547), Vec3d(508.871795654297,56.2124328613281,27.0011005401611), Vec3d(496.695404052734,56.2124328613281,33.0009002685547), Vec3d(495.695404052734,53.2258338928223,27.0011005401611), Vec3d(506.32861328125,81.599235534668,30.0011005401611), Vec3d(507.618804931641,77.8658294677734,25.5011005401611), Vec3d(515.358764648438,55.4658317565918,34.5009002685547), Vec3d(501.228607177734,81.599235534668,33.0009002685547), Vec3d(504.628601074219,81.599235534668,27.0011005401611), Vec3d(503.781982421875,71.6058349609375,33.0009002685547), Vec3d(502.808807373047,74.5324325561523,30.0011005401611), Vec3d(498.915405273438,62.8258323669434,30.0011005401611), Vec3d(500.861999511719,62.8258323669434,27.0011005401611), Vec3d(502.808807373047,62.8258323669434,36.0009002685547), Vec3d(504.755187988281,62.8258323669434,33.0009002685547), Vec3d(501.835388183594,71.6058349609375,33.0009002685547), Vec3d(499.888793945312,65.7524337768555,33.0009002685547), Vec3d(499.888793945312,65.7524337768555,36.0009002685547), Vec3d(513.128601074219,51.4824333190918,36.0009002685547), Vec3d(513.075988769531,51.6074333190918,24.0011005401611), Vec3d(516.648803710938,51.7324333190918,24.0011005401611), Vec3d(513.128601074219,51.4824333190918,24.0011005401611), Vec3d(513.495178222656,51.7324333190918,24.0011005401611), Vec3d(506.966613769531,51.6074333190918,36.0009002685547), Vec3d(507.163818359375,51.6074333190918,36.0009002685547), Vec3d(490.337799072266,51.4824333190918,24.0011005401611), Vec3d(489.391204833984,51.4824333190918,36.0009002685547), Vec3d(492.06201171875,51.7324333190918,36.0009002685547), Vec3d(490.337799072266,51.4824333190918,36.0009002685547), Vec3d(513.233764648438,51.2324333190918,24.0011005401611), Vec3d(513.233764648438,51.2324333190918,36.0009002685547), Vec3d(504.773803710938,51.4824333190918,36.0009002685547), Vec3d(504.773803710938,51.4824333190918,24.0011005401611), Vec3d(489.266998291016,51.2324333190918,24.0011005401611), Vec3d(489.266998291016,51.2324333190918,36.0009002685547), Vec3d(490.253601074219,55.4658317565918,25.5011005401611), Vec3d(499.528594970703,81.599235534668,30.0011005401611), Vec3d(498.20361328125,77.8658294677734,31.5009002685547), Vec3d(515.358764648438,55.4658317565918,28.5011005401611), Vec3d(515.358764648438,55.4658317565918,25.5011005401611), Vec3d(495.246795654297,61.0124320983887,36.0009002685547), Vec3d(490.253601074219,55.4658317565918,34.5009002685547), Vec3d(490.253601074219,55.4658317565918,36.0009002685547), Vec3d(494.228607177734,66.6658325195312,24.0011005401611), Vec3d(499.068786621094,67.5192337036133,24.0011005401611), Vec3d(498.20361328125,77.8658294677734,25.5011005401611), Vec3d(498.20361328125,77.8658294677734,24.0011005401611), Vec3d(506.608795166016,67.5192337036133,36.0009002685547), Vec3d(509.09521484375,64.7458343505859,36.0009002685547), Vec3d(507.618804931641,77.8658294677734,34.5009002685547), Vec3d(507.618804931641,77.8658294677734,36.0009002685547), Vec3d(510.385406494141,61.0124320983887,24.0011005401611), Vec3d(515.358764648438,55.4658317565918,24.0011005401611), Vec3d(489.32861328125,47.7324333190918,31.5009002685547), Vec3d(492.95361328125,47.7324333190918,33.5634994506836), Vec3d(489.32861328125,47.7324333190918,34.5009002685547), Vec3d(489.32861328125,47.7324333190918,28.5011005401611), Vec3d(489.32861328125,47.7324333190918,25.5011005401611), Vec3d(492.95361328125,47.7324333190918,26.4385013580322), Vec3d(492.95361328125,47.7324333190918,30.5635013580322), Vec3d(492.95361328125,47.7324333190918,32.0634994506836), Vec3d(492.95361328125,47.7324333190918,31.3135013580322), Vec3d(492.95361328125,47.7324333190918,35.4384994506836), Vec3d(489.32861328125,47.7324333190918,36.0009002685547), Vec3d(492.95361328125,47.7324333190918,34.3134994506836), Vec3d(492.95361328125,47.7324333190918,34.6884994506836), Vec3d(492.95361328125,47.7324333190918,27.9385013580322), Vec3d(492.95361328125,47.7324333190918,28.6885013580322), Vec3d(492.95361328125,47.7324333190918,29.0635013580322), Vec3d(489.32861328125,47.7324333190918,24.0011005401611), Vec3d(492.95361328125,47.7324333190918,24.5635013580322), Vec3d(492.95361328125,47.7324333190918,25.6885013580322), Vec3d(492.95361328125,47.7324333190918,25.3135013580322), Vec3d(492.95361328125,47.7324333190918,24.1885013580322), Vec3d(492.95361328125,47.7324333190918,24.0011005401611), Vec3d(513.443786621094,50.7324333190918,24.0011005401611), Vec3d(492.95361328125,47.7324333190918,35.8134994506836), Vec3d(492.95361328125,47.7324333190918,36.0009002685547), Vec3d(513.443786621094,50.7324333190918,36.0009002685547), Vec3d(506.350402832031,51.4824333190918,36.0009002685547), Vec3d(506.350402832031,51.4824333190918,24.0011005401611), Vec3d(492.743804931641,48.2324333190918,24.0011005401611), Vec3d(492.638793945312,48.4824333190918,24.0011005401611), Vec3d(492.743804931641,48.2324333190918,36.0009002685547), Vec3d(492.638793945312,48.4824333190918,36.0009002685547), Vec3d(490.089599609375,50.9824333190918,36.0009002685547), Vec3d(490.089599609375,50.9824333190918,24.0011005401611), Vec3d(510.342010498047,51.7324333190918,30.0011005401611), Vec3d(499.068786621094,67.5192337036133,36.0009002685547), Vec3d(494.228607177734,66.6658325195312,36.0009002685547), Vec3d(499.375183105469,76.9058380126953,24.0011005401611), Vec3d(506.421813964844,76.9058380126953,36.0009002685547), Vec3d(506.608795166016,67.5192337036133,24.0011005401611), Vec3d(505.728607177734,65.7524337768555,24.0011005401611), Vec3d(509.09521484375,64.7458343505859,24.0011005401611), Vec3d(506.701995849609,62.8258323669434,30.0011005401611), Vec3d(505.728607177734,65.7524337768555,27.0011005401611), Vec3d(501.835388183594,71.6058349609375,27.0011005401611), Vec3d(499.888793945312,65.7524337768555,27.0011005401611), Vec3d(494.228607177734,66.6658325195312,30.0011005401611), Vec3d(495.553588867188,70.3992309570312,28.5011005401611), Vec3d(492.903594970703,62.9324340820312,28.5011005401611), Vec3d(495.553588867188,70.3992309570312,31.5009002685547), Vec3d(492.903594970703,62.9324340820312,31.5009002685547), Vec3d(511.488800048828,66.6658325195312,24.0011005401611), Vec3d(511.488800048828,66.6658325195312,30.0011005401611), Vec3d(512.778564453125,62.9324340820312,28.5011005401611), Vec3d(515.358764648438,55.4658317565918,31.5009002685547), Vec3d(507.618804931641,77.8658294677734,31.5009002685547), Vec3d(510.198791503906,70.3992309570312,28.5011005401611), Vec3d(511.488800048828,66.6658325195312,36.0009002685547), Vec3d(512.778564453125,62.9324340820312,31.5009002685547), Vec3d(510.198791503906,70.3992309570312,31.5009002685547), Vec3d(502.788818359375,57.7058334350586,24.0011005401611), Vec3d(497.195404052734,57.7058334350586,30.0011005401611), Vec3d(492.903594970703,62.9324340820312,34.5009002685547), Vec3d(492.903594970703,62.9324340820312,36.0009002685547), Vec3d(495.553588867188,70.3992309570312,24.0011005401611), Vec3d(496.725189208984,69.4392318725586,24.0011005401611), Vec3d(495.553588867188,70.3992309570312,25.5011005401611), Vec3d(495.246795654297,61.0124320983887,24.0011005401611), Vec3d(492.903594970703,62.9324340820312,25.5011005401611), Vec3d(492.903594970703,62.9324340820312,24.0011005401611), Vec3d(495.553588867188,70.3992309570312,36.0009002685547), Vec3d(496.725189208984,69.4392318725586,36.0009002685547), Vec3d(495.553588867188,70.3992309570312,34.5009002685547), Vec3d(510.198791503906,70.3992309570312,36.0009002685547), Vec3d(509.002014160156,69.4392318725586,36.0009002685547), Vec3d(510.198791503906,70.3992309570312,34.5009002685547), Vec3d(512.778564453125,62.9324340820312,25.5011005401611), Vec3d(512.778564453125,62.9324340820312,24.0011005401611), Vec3d(510.198791503906,70.3992309570312,24.0011005401611), Vec3d(509.002014160156,69.4392318725586,24.0011005401611), Vec3d(510.198791503906,70.3992309570312,25.5011005401611), Vec3d(510.385406494141,61.0124320983887,36.0009002685547), Vec3d(512.778564453125,62.9324340820312,34.5009002685547), Vec3d(512.778564453125,62.9324340820312,36.0009002685547), Vec3d(496.840393066406,51.2324333190918,36.0009002685547), Vec3d(498.981994628906,51.7324333190918,36.0009002685547), Vec3d(498.981994628906,51.7324333190918,33.0009002685547), Vec3d(506.555206298828,51.7324333190918,24.0011005401611), Vec3d(506.555206298828,51.7324333190918,27.0011005401611), Vec3d(503.82861328125,47.7324333190918,30.7509002685547), Vec3d(507.45361328125,47.7324333190918,32.8134994506836), Vec3d(503.82861328125,47.7324333190918,33.7509002685547), Vec3d(503.82861328125,47.7324333190918,29.2511005401611), Vec3d(503.82861328125,47.7324333190918,26.2511005401611), Vec3d(507.45361328125,47.7324333190918,27.1885013580322), Vec3d(493.921813964844,57.2792320251465,36.0009002685547), Vec3d(491.425201416016,54.5058326721191,36.0009002685547), Vec3d(497.195404052734,57.7058334350586,24.0011005401611), Vec3d(496.418792724609,60.052433013916,24.0011005401611), Vec3d(509.188812255859,60.052433013916,36.0009002685547), Vec3d(511.675415039062,57.2792320251465,24.0011005401611), Vec3d(514.161987304688,54.5058326721191,24.0011005401611), Vec3d(507.45361328125,47.7324333190918,34.3134994506836), Vec3d(503.82861328125,47.7324333190918,35.2509002685547), Vec3d(507.45361328125,47.7324333190918,25.6885013580322), Vec3d(503.82861328125,47.7324333190918,24.7511005401611), Vec3d(500.20361328125,47.7324333190918,31.6885013580322), Vec3d(500.20361328125,47.7324333190918,28.3135013580322), Vec3d(500.20361328125,47.7324333190918,30.1885013580322), Vec3d(507.45361328125,47.7324333190918,29.8135013580322), Vec3d(507.45361328125,47.7324333190918,31.3135013580322), Vec3d(507.45361328125,47.7324333190918,30.5635013580322), Vec3d(503.82861328125,47.7324333190918,36.0009002685547), Vec3d(507.45361328125,47.7324333190918,35.4384994506836), Vec3d(507.45361328125,47.7324333190918,35.0634994506836), Vec3d(507.45361328125,47.7324333190918,28.6885013580322), Vec3d(507.45361328125,47.7324333190918,29.4385013580322), Vec3d(503.82861328125,47.7324333190918,24.0011005401611), Vec3d(507.45361328125,47.7324333190918,24.5635013580322), Vec3d(507.45361328125,47.7324333190918,24.9385013580322), Vec3d(500.20361328125,47.7324333190918,34.6884994506836), Vec3d(500.20361328125,47.7324333190918,33.1884994506836), Vec3d(500.20361328125,47.7324333190918,33.9384994506836), Vec3d(500.20361328125,47.7324333190918,25.3135013580322), Vec3d(500.20361328125,47.7324333190918,26.8135013580322), Vec3d(500.20361328125,47.7324333190918,26.0635013580322), Vec3d(500.20361328125,47.7324333190918,30.9385013580322), Vec3d(500.20361328125,47.7324333190918,35.0634994506836), Vec3d(500.20361328125,47.7324333190918,35.4384994506836), Vec3d(500.20361328125,47.7324333190918,29.0635013580322), Vec3d(500.20361328125,47.7324333190918,29.4385013580322), Vec3d(500.20361328125,47.7324333190918,24.9385013580322), Vec3d(500.20361328125,47.7324333190918,24.5635013580322), Vec3d(507.45361328125,47.7324333190918,24.1885013580322), Vec3d(507.45361328125,47.7324333190918,24.0011005401611), Vec3d(513.86376953125,49.7324333190918,24.0011005401611), Vec3d(507.45361328125,47.7324333190918,35.8134994506836), Vec3d(507.45361328125,47.7324333190918,36.0009002685547), Vec3d(513.86376953125,49.7324333190918,36.0009002685547), Vec3d(500.20361328125,47.7324333190918,24.1885013580322), Vec3d(500.20361328125,47.7324333190918,24.0011005401611), Vec3d(502.988800048828,49.7324333190918,24.0011005401611), Vec3d(500.20361328125,47.7324333190918,35.8134994506836), Vec3d(500.20361328125,47.7324333190918,36.0009002685547), Vec3d(502.988800048828,49.7324333190918,36.0009002685547), Vec3d(504.755187988281,62.8258323669434,27.0011005401611), Vec3d(499.205383300781,51.2324333190918,36.0009002685547), Vec3d(498.786193847656,51.1074333190918,36.0009002685547), Vec3d(502.358795166016,51.2324333190918,36.0009002685547), Vec3d(499.205383300781,51.2324333190918,24.0011005401611), Vec3d(502.358795166016,51.2324333190918,24.0011005401611), Vec3d(498.786193847656,51.1074333190918,24.0011005401611), Vec3d(502.568786621094,50.7324333190918,24.0011005401611), Vec3d(505.931213378906,51.3574333190918,24.0011005401611), Vec3d(509.503601074219,51.4824333190918,24.0011005401611), Vec3d(502.568786621094,50.7324333190918,36.0009002685547), Vec3d(505.931213378906,51.3574333190918,36.0009002685547), Vec3d(509.503601074219,51.4824333190918,36.0009002685547), Vec3d(499.048583984375,50.4824333190918,36.0009002685547), Vec3d(492.428588867188,48.9824333190918,36.0009002685547), Vec3d(499.048583984375,50.4824333190918,24.0011005401611), Vec3d(492.428588867188,48.9824333190918,24.0011005401611), Vec3d(506.088806152344,50.9824333190918,24.0011005401611), Vec3d(506.036010742188,51.1074333190918,24.0011005401611), Vec3d(506.088806152344,50.9824333190918,36.0009002685547), Vec3d(506.036010742188,51.1074333190918,36.0009002685547), Vec3d(498.891204833984,50.8574333190918,36.0009002685547), Vec3d(498.943786621094,50.7324333190918,36.0009002685547), Vec3d(498.891204833984,50.8574333190918,24.0011005401611), Vec3d(498.943786621094,50.7324333190918,24.0011005401611), Vec3d(499.573608398438,49.2324333190918,24.0011005401611), Vec3d(499.783813476562,48.7324333190918,24.0011005401611), Vec3d(499.573608398438,49.2324333190918,36.0009002685547), Vec3d(499.783813476562,48.7324333190918,36.0009002685547), Vec3d(506.403594970703,50.2324333190918,24.0011005401611), Vec3d(506.298797607422,50.4824333190918,24.0011005401611), Vec3d(506.403594970703,50.2324333190918,36.0009002685547), Vec3d(506.298797607422,50.4824333190918,36.0009002685547), Vec3d(501.228607177734,81.599235534668,27.0011005401611), Vec3d(502.928588867188,81.599235534668,24.0011005401611), Vec3d(499.2587890625,49.9824333190918,36.0009002685547), Vec3d(499.363800048828,49.7324333190918,36.0009002685547), Vec3d(499.2587890625,49.9824333190918,24.0011005401611), Vec3d(499.363800048828,49.7324333190918,24.0011005401611), Vec3d(496.695404052734,56.2124328613281,27.0011005401611), Vec3d(496.195404052734,54.7190322875977,24.0011005401611), Vec3d(509.851989746094,53.2258338928223,27.0011005401611), Vec3d(493.464782714844,51.1074333190918,36.0009002685547), Vec3d(493.464782714844,51.1074333190918,24.0011005401611), Vec3d(502.768798828125,51.7324333190918,24.0011005401611), Vec3d(500.215789794922,51.3574333190918,24.0011005401611), Vec3d(497.628601074219,51.2324333190918,24.0011005401611), Vec3d(502.768798828125,51.7324333190918,36.0009002685547), Vec3d(500.215789794922,51.3574333190918,36.0009002685547), Vec3d(497.628601074219,51.2324333190918,36.0009002685547), Vec3d(507.033813476562,48.7324333190918,24.0011005401611), Vec3d(506.823791503906,49.2324333190918,24.0011005401611), Vec3d(507.033813476562,48.7324333190918,36.0009002685547), Vec3d(506.823791503906,49.2324333190918,36.0009002685547), Vec3d(494.4501953125,51.1074333190918,24.0011005401611), Vec3d(494.4501953125,51.1074333190918,36.0009002685547), Vec3d(500.807006835938,51.3574333190918,36.0009002685547), Vec3d(503.591186523438,51.4824333190918,36.0009002685547), Vec3d(503.591186523438,51.4824333190918,24.0011005401611), Vec3d(500.807006835938,51.3574333190918,24.0011005401611), Vec3d(505.728607177734,65.7524337768555,36.0009002685547), Vec3d(505.728607177734,65.7524337768555,33.0009002685547), Vec3d(499.221801757812,72.2124328613281,36.0009002685547), Vec3d(501.835388183594,71.6058349609375,36.0009002685547), Vec3d(506.515197753906,72.2124328613281,24.0011005401611), Vec3d(503.781982421875,71.6058349609375,24.0011005401611), Vec3d(503.781982421875,71.6058349609375,27.0011005401611), Vec3d(499.888793945312,65.7524337768555,24.0011005401611), Vec3d(495.695404052734,53.2258338928223,33.0009002685547), Vec3d(516.648803710938,51.7324333190918,30.0011005401611), Vec3d(498.20361328125,77.8658294677734,28.5011005401611), Vec3d(505.585388183594,57.7058334350586,33.0009002685547), Vec3d(508.871795654297,56.2124328613281,33.0009002685547), Vec3d(499.992004394531,57.7058334350586,27.0011005401611), Vec3d(504.628601074219,81.599235534668,33.0009002685547), Vec3d(500.861999511719,62.8258323669434,33.0009002685547), Vec3d(496.878601074219,74.1324310302734,27.0011005401611), Vec3d(496.878601074219,74.1324310302734,33.0009002685547), Vec3d(491.57861328125,59.199031829834,27.0011005401611), Vec3d(490.253601074219,55.4658317565918,28.5011005401611), Vec3d(491.57861328125,59.199031829834,33.0009002685547), Vec3d(514.068786621094,59.199031829834,27.0011005401611), Vec3d(514.068786621094,59.199031829834,33.0009002685547), Vec3d(508.908813476562,74.1324310302734,27.0011005401611), Vec3d(507.618804931641,77.8658294677734,28.5011005401611), Vec3d(508.908813476562,74.1324310302734,33.0009002685547), Vec3d(491.271789550781,50.9824333190918,36.0009002685547), Vec3d(490.877807617188,50.9824333190918,36.0009002685547), Vec3d(491.271789550781,50.9824333190918,24.0011005401611), Vec3d(490.877807617188,50.9824333190918,24.0011005401611), Vec3d(495.213806152344,50.9824333190918,36.0009002685547), Vec3d(493.636993408203,50.9824333190918,36.0009002685547), Vec3d(495.213806152344,50.9824333190918,24.0011005401611), Vec3d(493.636993408203,50.9824333190918,24.0011005401611), Vec3d(503.985412597656,51.4824333190918,36.0009002685547), Vec3d(503.985412597656,51.4824333190918,24.0011005401611), Vec3d(511.675415039062,57.2792320251465,36.0009002685547), Vec3d(493.921813964844,57.2792320251465,24.0011005401611), Vec3d(502.768798828125,51.7324333190918,30.0011005401611), Vec3d(506.555206298828,51.7324333190918,30.0011005401611), Vec3d(498.981994628906,51.7324333190918,30.0011005401611), Vec3d(492.848815917969,50.9824333190918,24.0011005401611), Vec3d(492.848815917969,50.9824333190918,36.0009002685547), Vec3d(500.861999511719,68.6792297363281,36.0009002685547), Vec3d(500.861999511719,68.6792297363281,24.0011005401611), Vec3d(496.878601074219,74.1324310302734,24.0011005401611), Vec3d(496.878601074219,74.1324310302734,36.0009002685547), Vec3d(504.755187988281,68.6792297363281,24.0011005401611), Vec3d(504.755187988281,68.6792297363281,36.0009002685547), Vec3d(508.908813476562,74.1324310302734,36.0009002685547), Vec3d(508.908813476562,74.1324310302734,24.0011005401611), Vec3d(505.728607177734,65.7524337768555,30.0011005401611), Vec3d(504.755187988281,68.6792297363281,30.0011005401611), Vec3d(503.781982421875,71.6058349609375,30.0011005401611), Vec3d(500.861999511719,68.6792297363281,30.0011005401611), Vec3d(499.888793945312,65.7524337768555,30.0011005401611), Vec3d(501.835388183594,71.6058349609375,30.0011005401611), Vec3d(491.57861328125,59.199031829834,24.0011005401611), Vec3d(491.57861328125,59.199031829834,36.0009002685547), Vec3d(514.068786621094,59.199031829834,36.0009002685547), Vec3d(514.068786621094,59.199031829834,24.0011005401611), Vec3d(511.07861328125,47.7324333190918,34.8759002685547), Vec3d(511.07861328125,47.7324333190918,31.8759002685547), Vec3d(514.70361328125,47.7324333190918,33.9384994506836), Vec3d(511.07861328125,47.7324333190918,25.1261005401611), Vec3d(514.70361328125,47.7324333190918,26.0635013580322), Vec3d(511.07861328125,47.7324333190918,28.1261005401611), Vec3d(502.788818359375,57.7058334350586,30.0011005401611), Vec3d(502.048583984375,79.8324356079102,36.0009002685547), Vec3d(514.70361328125,47.7324333190918,30.9385013580322), Vec3d(511.07861328125,47.7324333190918,30.3759002685547), Vec3d(514.70361328125,47.7324333190918,29.0635013580322), Vec3d(511.07861328125,47.7324333190918,29.6261005401611), Vec3d(496.57861328125,47.7324333190918,31.1259002685547), Vec3d(496.57861328125,47.7324333190918,32.6259002685547), Vec3d(496.57861328125,47.7324333190918,34.1259002685547), Vec3d(496.57861328125,47.7324333190918,28.8761005401611), Vec3d(496.57861328125,47.7324333190918,27.3761005401611), Vec3d(496.57861328125,47.7324333190918,25.8761005401611), Vec3d(496.57861328125,47.7324333190918,29.6261005401611), Vec3d(514.70361328125,47.7324333190918,35.4384994506836), Vec3d(511.07861328125,47.7324333190918,35.6259002685547), Vec3d(514.70361328125,47.7324333190918,24.5635013580322), Vec3d(511.07861328125,47.7324333190918,24.3761005401611), Vec3d(496.57861328125,47.7324333190918,34.8759002685547), Vec3d(496.57861328125,47.7324333190918,25.1261005401611), Vec3d(496.57861328125,47.7324333190918,35.6259002685547), Vec3d(496.57861328125,47.7324333190918,24.3761005401611), Vec3d(511.07861328125,47.7324333190918,36.0009002685547), Vec3d(511.07861328125,47.7324333190918,24.0011005401611), Vec3d(514.70361328125,47.7324333190918,30.1885013580322), Vec3d(514.70361328125,47.7324333190918,35.8134994506836), Vec3d(514.70361328125,47.7324333190918,29.8135013580322), Vec3d(514.70361328125,47.7324333190918,24.1885013580322), Vec3d(496.57861328125,47.7324333190918,36.0009002685547), Vec3d(496.57861328125,47.7324333190918,24.0011005401611), Vec3d(510.238800048828,49.7324333190918,24.0011005401611), Vec3d(510.238800048828,49.7324333190918,36.0009002685547), Vec3d(514.70361328125,47.7324333190918,24.0011005401611), Vec3d(514.70361328125,47.7324333190918,36.0009002685547), Vec3d(496.158813476562,48.7324333190918,36.0009002685547), Vec3d(496.158813476562,48.7324333190918,24.0011005401611), Vec3d(502.808807373047,62.8258323669434,30.0011005401611), Vec3d(509.608795166016,51.2324333190918,24.0011005401611), Vec3d(509.608795166016,51.2324333190918,36.0009002685547), Vec3d(491.641204833984,50.8574333190918,24.0011005401611), Vec3d(495.423797607422,50.4824333190918,36.0009002685547), Vec3d(495.423797607422,50.4824333190918,24.0011005401611), Vec3d(491.641204833984,50.8574333190918,36.0009002685547), Vec3d(495.528594970703,50.2324333190918,24.0011005401611), Vec3d(492.0087890625,49.9824333190918,24.0011005401611), Vec3d(509.818786621094,50.7324333190918,24.0011005401611), Vec3d(495.948608398438,49.2324333190918,36.0009002685547), Vec3d(495.528594970703,50.2324333190918,36.0009002685547), Vec3d(495.948608398438,49.2324333190918,24.0011005401611), Vec3d(509.818786621094,50.7324333190918,36.0009002685547), Vec3d(492.0087890625,49.9824333190918,36.0009002685547), Vec3d(491.956207275391,50.1074333190918,24.0011005401611), Vec3d(491.956207275391,50.1074333190918,36.0009002685547), Vec3d(502.928588867188,81.599235534668,30.0011005401611), Vec3d(491.851013183594,50.3574333190918,36.0009002685547), Vec3d(491.851013183594,50.3574333190918,24.0011005401611), Vec3d(496.195404052734,54.7190322875977,30.0011005401611), Vec3d(509.361999511719,54.7190322875977,30.0011005401611), Vec3d(488.632598876953,51.7256317138672,30.0011005401611), Vec3d(488.632598876953,51.7256317138672,29.5091018676758), Vec3d(488.632598876953,51.7188339233398,24.0011005401611), Vec3d(488.632598876953,51.7256317138672,27.4929008483887), Vec3d(488.632598876953,51.7324333190918,30.0011005401611), Vec3d(488.632598876953,51.7324333190918,29.0175018310547), Vec3d(488.632598876953,51.7324333190918,24.9847011566162), Vec3d(488.632598876953,51.7324333190918,24.0011005401611), Vec3d(488.632598876953,51.7188339233398,30.0011005401611), Vec3d(488.632598876953,51.7176322937012,24.0011005401611), Vec3d(488.632598876953,51.7182312011719,30.0011005401611), Vec3d(488.632598876953,51.7176322937012,30.0011005401611), Vec3d(488.632598876953,51.715030670166,24.0011005401611), Vec3d(488.632598876953,51.7162322998047,30.0011005401611), Vec3d(488.632598876953,50.761833190918,24.0011005401611), Vec3d(488.632598876953,50.7578315734863,24.0011005401611), Vec3d(488.632598876953,50.7598342895508,30.0011005401611), Vec3d(488.632598876953,50.7522315979004,24.0011005401611), Vec3d(488.632598876953,49.7838325500488,24.0011005401611), Vec3d(488.632598876953,50.2680320739746,30.0011005401611), Vec3d(488.632598876953,51.7046318054199,24.0011005401611), Vec3d(488.632598876953,51.709831237793,30.0011005401611), Vec3d(488.632598876953,50.9120330810547,24.0011005401611), Vec3d(488.632598876953,50.8882331848145,24.0011005401611), Vec3d(488.632598876953,50.9002304077148,30.0011005401611), Vec3d(488.632598876953,47.7324333190918,24.0370998382568), Vec3d(488.632598876953,48.5612335205078,30.0011005401611), Vec3d(488.632598876953,47.7324333190918,24.0011005401611), Vec3d(488.632598876953,47.7324333190918,24.1091003417969), Vec3d(488.632598876953,48.5612335205078,30.0189018249512), Vec3d(488.632598876953,47.7324333190918,25.3211002349854), Vec3d(488.632598876953,48.5612335205078,30.0551013946533), Vec3d(488.632598876953,47.7324333190918,25.4651012420654), Vec3d(488.632598876953,48.5612335205078,30.6609001159668), Vec3d(488.632598876953,47.7324333190918,25.5371017456055), Vec3d(488.632598876953,48.5612335205078,30.7329006195068), Vec3d(488.632598876953,47.7324333190918,25.6091003417969), Vec3d(488.632598876953,48.5612335205078,30.7689018249512), Vec3d(488.632598876953,47.7324333190918,25.8971004486084), Vec3d(488.632598876953,48.5612335205078,30.8051013946533), Vec3d(488.632598876953,47.7324333190918,28.321102142334), Vec3d(488.632598876953,48.5612335205078,30.9491004943848), Vec3d(488.632598876953,47.7324333190918,28.4651012420654), Vec3d(488.632598876953,48.5612335205078,32.1609001159668), Vec3d(488.632598876953,47.7324333190918,28.5371017456055), Vec3d(488.632598876953,48.5612335205078,32.2329025268555), Vec3d(488.632598876953,47.7324333190918,28.6811008453369), Vec3d(488.632598876953,48.5612335205078,32.2689018249512), Vec3d(488.632598876953,47.7324333190918,31.1049003601074), Vec3d(488.632598876953,48.5612335205078,32.3411026000977), Vec3d(488.632598876953,47.7324333190918,31.3929004669189), Vec3d(488.632598876953,49.3900299072266,36.0009002685547), Vec3d(488.632598876953,47.7324333190918,31.536901473999), Vec3d(488.632598876953,47.7324333190918,31.6809005737305), Vec3d(488.632598876953,47.7324333190918,34.1049003601074), Vec3d(488.632598876953,47.7324333190918,34.3929023742676), Vec3d(488.632598876953,47.7324333190918,34.464900970459), Vec3d(488.632598876953,47.7324333190918,34.5369033813477), Vec3d(488.632598876953,47.7324333190918,34.6809005737305), Vec3d(488.632598876953,47.7324333190918,35.8929023742676), Vec3d(488.632598876953,47.7324333190918,35.964900970459), Vec3d(488.632598876953,47.7324333190918,36.0009002685547), Vec3d(488.632598876953,50.8816299438477,24.0011005401611), Vec3d(488.632598876953,50.8850326538086,30.0011005401611), Vec3d(488.632598876953,49.7480316162109,24.0011005401611), Vec3d(488.632598876953,49.7426300048828,24.0011005401611), Vec3d(488.632598876953,49.745231628418,30.0011005401611), Vec3d(488.632598876953,49.7592315673828,24.0011005401611), Vec3d(488.632598876953,49.7536315917969,30.0011005401611), Vec3d(488.632598876953,49.3900299072266,24.0011005401611), Vec3d(488.632598876953,49.5664329528809,30.0011005401611), Vec3d(488.632598876953,50.8786315917969,24.0011005401611), Vec3d(488.632598876953,50.7764320373535,24.0011005401611), Vec3d(488.632598876953,50.8274307250977,30.0011005401611), Vec3d(488.632598876953,50.7550315856934,30.0011005401611), Vec3d(488.632598876953,50.7692337036133,30.0011005401611), Vec3d(488.632598876953,50.9284324645996,24.0011005401611), Vec3d(488.632598876953,50.9202308654785,30.0011005401611), Vec3d(488.632598876953,51.1788330078125,24.0011005401611), Vec3d(488.632598876953,51.139232635498,24.0011005401611), Vec3d(488.632598876953,51.1590309143066,30.0011005401611), Vec3d(488.632598876953,51.2324333190918,24.0011005401611), Vec3d(488.632598876953,51.2056312561035,30.0011005401611), Vec3d(488.632598876953,51.4340324401855,24.0011005401611), Vec3d(488.632598876953,51.3946304321289,24.0011005401611), Vec3d(488.632598876953,51.4142303466797,30.0011005401611), Vec3d(488.632598876953,51.4498329162598,24.0011005401611), Vec3d(488.632598876953,51.5772323608398,30.0011005401611), Vec3d(488.632598876953,51.4418334960938,30.0011005401611), Vec3d(488.632598876953,51.3136329650879,30.0011005401611), Vec3d(488.632598876953,49.7714309692383,30.0011005401611), Vec3d(488.632598876953,51.0338325500488,30.0011005401611), Vec3d(488.632598876953,50.8816299438477,30.0011005401611), Vec3d(488.632598876953,50.8800315856934,30.0011005401611), Vec3d(488.632598876953,51.7188339233398,36.0009002685547), Vec3d(488.632598876953,51.7176322937012,36.0009002685547), Vec3d(488.632598876953,49.3900299072266,30.0011005401611), Vec3d(488.632598876953,50.7522315979004,30.0011005401611), Vec3d(488.632598876953,50.7522315979004,36.0009002685547), Vec3d(488.632598876953,49.7426300048828,30.0011005401611), Vec3d(488.632598876953,49.7426300048828,36.0009002685547), Vec3d(488.632598876953,49.7480316162109,30.0011005401611), Vec3d(488.632598876953,49.7480316162109,36.0009002685547), Vec3d(488.632598876953,51.715030670166,30.0011005401611), Vec3d(488.632598876953,51.715030670166,36.0009002685547), Vec3d(488.632598876953,50.7578315734863,30.0011005401611), Vec3d(488.632598876953,50.7578315734863,36.0009002685547), Vec3d(488.632598876953,50.761833190918,30.0011005401611), Vec3d(488.632598876953,50.761833190918,36.0009002685547), Vec3d(488.632598876953,50.8882331848145,30.0011005401611), Vec3d(488.632598876953,50.8882331848145,36.0009002685547), Vec3d(488.632598876953,49.7592315673828,30.0011005401611), Vec3d(488.632598876953,49.7592315673828,36.0009002685547), Vec3d(488.632598876953,51.1788330078125,30.0011005401611), Vec3d(488.632598876953,51.1788330078125,36.0009002685547), Vec3d(488.632598876953,50.9120330810547,30.0011005401611), Vec3d(488.632598876953,50.9120330810547,36.0009002685547), Vec3d(488.632598876953,51.4498329162598,30.0011005401611), Vec3d(488.632598876953,51.4498329162598,36.0009002685547), Vec3d(488.632598876953,51.7046318054199,30.0011005401611), Vec3d(488.632598876953,51.7046318054199,36.0009002685547), Vec3d(488.632598876953,51.2324333190918,30.0011005401611), Vec3d(488.632598876953,51.2324333190918,36.0009002685547), Vec3d(488.632598876953,51.3946304321289,30.0011005401611), Vec3d(488.632598876953,51.3946304321289,36.0009002685547), Vec3d(488.632598876953,51.4340324401855,30.0011005401611), Vec3d(488.632598876953,51.4340324401855,36.0009002685547), Vec3d(488.632598876953,49.7838325500488,30.0011005401611), Vec3d(488.632598876953,49.7838325500488,36.0009002685547), Vec3d(488.632598876953,50.7764320373535,30.0011005401611), Vec3d(488.632598876953,50.7764320373535,36.0009002685547), Vec3d(488.632598876953,51.139232635498,30.0011005401611), Vec3d(488.632598876953,51.139232635498,36.0009002685547), Vec3d(488.632598876953,50.9284324645996,30.0011005401611), Vec3d(488.632598876953,50.9284324645996,36.0009002685547), Vec3d(488.632598876953,50.8816299438477,36.0009002685547), Vec3d(488.632598876953,50.8786315917969,30.0011005401611), Vec3d(488.632598876953,50.8786315917969,36.0009002685547), Vec3d(488.632598876953,51.7324333190918,35.0173034667969), Vec3d(488.632598876953,51.7324333190918,36.0009002685547), Vec3d(488.632598876953,51.7324333190918,30.9847011566162), Vec3d(517.188415527344,51.7140884399414,24.0011005401611), Vec3d(517.188415527344,51.7140884399414,36.0009002685547), Vec3d(517.188415527344,50.4475173950195,24.0011005401611), Vec3d(517.188415527344,51.7324333190918,35.3734130859375), Vec3d(517.188415527344,51.7324333190918,36.0009002685547), Vec3d(517.188415527344,51.7324333190918,34.1185760498047), Vec3d(517.188415527344,51.7324333190918,31.88330078125), Vec3d(517.188415527344,51.7324333190918,30.0011005401611), Vec3d(517.188415527344,51.7324333190918,28.1187744140625), Vec3d(517.188415527344,51.7324333190918,25.8834266662598), Vec3d(517.188415527344,51.7324333190918,24.6285915374756), Vec3d(517.188415527344,51.7324333190918,24.0011005401611), Vec3d(517.188415527344,47.7324333190918,24.0600452423096), Vec3d(517.188415527344,47.7324333190918,24.0011005401611), Vec3d(517.188415527344,50.4475173950195,36.0009002685547), Vec3d(517.188415527344,47.7324333190918,24.1779975891113), Vec3d(517.188415527344,47.7324333190918,24.6498031616211), Vec3d(517.188415527344,47.7324333190918,28.7625770568848), Vec3d(517.188415527344,47.7324333190918,29.7061901092529), Vec3d(517.188415527344,47.7324333190918,29.9420928955078), Vec3d(517.188415527344,47.7324333190918,30.0600452423096), Vec3d(517.188415527344,47.7324333190918,30.2959480285645), Vec3d(517.188415527344,47.7324333190918,31.2395629882812), Vec3d(517.188415527344,47.7324333190918,35.3521995544434), Vec3d(517.188415527344,47.7324333190918,35.8240051269531), Vec3d(517.188415527344,47.7324333190918,35.9419555664062), Vec3d(517.188415527344,47.7324333190918,36.0009002685547) },
- { Vec3crd(0,1,2), Vec3crd(3,4,5), Vec3crd(6,7,8), Vec3crd(9,10,11), Vec3crd(12,2,1), Vec3crd(12,1,13), Vec3crd(14,15,16), Vec3crd(17,18,19), Vec3crd(20,21,22), Vec3crd(17,19,23), Vec3crd(24,25,26), Vec3crd(27,13,1), Vec3crd(28,25,29), Vec3crd(30,31,32), Vec3crd(28,33,34), Vec3crd(35,36,7), Vec3crd(37,38,39), Vec3crd(40,10,41), Vec3crd(42,43,44), Vec3crd(45,5,4), Vec3crd(46,47,48), Vec3crd(46,48,49), Vec3crd(45,4,50), Vec3crd(51,52,53), Vec3crd(51,54,55), Vec3crd(56,52,57), Vec3crd(58,59,60), Vec3crd(61,50,4), Vec3crd(62,63,64), Vec3crd(65,34,33), Vec3crd(66,67,42), Vec3crd(68,17,69), Vec3crd(70,71,22), Vec3crd(66,42,72), Vec3crd(73,16,15), Vec3crd(35,7,74), Vec3crd(75,76,54), Vec3crd(77,27,1), Vec3crd(78,32,31), Vec3crd(75,54,79), Vec3crd(80,26,25), Vec3crd(81,80,25), Vec3crd(82,83,48), Vec3crd(84,20,85), Vec3crd(81,25,86), Vec3crd(87,88,19), Vec3crd(0,89,1), Vec3crd(90,91,92), Vec3crd(90,10,93), Vec3crd(38,94,39), Vec3crd(94,95,39), Vec3crd(3,7,96), Vec3crd(97,15,98), Vec3crd(97,99,15), Vec3crd(92,91,100), Vec3crd(89,101,1), Vec3crd(102,39,95), Vec3crd(103,11,10), Vec3crd(104,96,7), Vec3crd(105,15,99), Vec3crd(106,61,4), Vec3crd(107,108,33), Vec3crd(76,55,54), Vec3crd(109,91,110), Vec3crd(111,23,19), Vec3crd(112,63,113), Vec3crd(114,115,48), Vec3crd(116,59,117), Vec3crd(118,20,119), Vec3crd(120,31,121), Vec3crd(122,44,43), Vec3crd(110,91,123), Vec3crd(124,125,126), Vec3crd(127,128,129), Vec3crd(127,130,124), Vec3crd(131,124,132), Vec3crd(126,133,134), Vec3crd(135,136,126), Vec3crd(137,138,127), Vec3crd(139,127,138), Vec3crd(128,140,141), Vec3crd(142,128,143), Vec3crd(144,140,145), Vec3crd(100,91,146), Vec3crd(147,148,134), Vec3crd(101,149,1), Vec3crd(102,150,39), Vec3crd(103,10,151), Vec3crd(145,140,152), Vec3crd(152,140,153), Vec3crd(148,154,134), Vec3crd(154,155,134), Vec3crd(156,15,105), Vec3crd(157,104,7), Vec3crd(36,8,7), Vec3crd(158,37,39), Vec3crd(159,19,88), Vec3crd(160,19,159), Vec3crd(161,59,58), Vec3crd(161,117,59), Vec3crd(162,31,30), Vec3crd(162,121,31), Vec3crd(163,43,164), Vec3crd(163,165,43), Vec3crd(166,167,43), Vec3crd(167,164,43), Vec3crd(168,57,52), Vec3crd(82,48,169), Vec3crd(114,170,171), Vec3crd(108,65,33), Vec3crd(64,63,112), Vec3crd(114,172,170), Vec3crd(160,173,170), Vec3crd(171,170,173), Vec3crd(172,174,170), Vec3crd(160,170,174), Vec3crd(175,176,177), Vec3crd(178,77,1), Vec3crd(179,31,120), Vec3crd(175,180,176), Vec3crd(181,182,176), Vec3crd(177,176,182), Vec3crd(180,183,176), Vec3crd(181,176,183), Vec3crd(184,42,67), Vec3crd(185,69,17), Vec3crd(160,111,19), Vec3crd(186,187,160), Vec3crd(188,189,114), Vec3crd(190,188,114), Vec3crd(114,48,191), Vec3crd(192,114,193), Vec3crd(194,160,195), Vec3crd(196,160,194), Vec3crd(197,198,181), Vec3crd(199,197,181), Vec3crd(122,43,165), Vec3crd(200,201,175), Vec3crd(202,175,203), Vec3crd(204,175,202), Vec3crd(205,119,20), Vec3crd(206,181,207), Vec3crd(208,209,15), Vec3crd(210,15,209), Vec3crd(211,10,9), Vec3crd(212,10,211), Vec3crd(213,214,215), Vec3crd(216,217,218), Vec3crd(219,14,17), Vec3crd(113,63,220), Vec3crd(221,222,48), Vec3crd(191,48,222), Vec3crd(22,223,20), Vec3crd(205,20,223), Vec3crd(224,40,42), Vec3crd(123,91,225), Vec3crd(214,226,215), Vec3crd(227,215,226), Vec3crd(218,217,228), Vec3crd(229,228,217), Vec3crd(215,230,213), Vec3crd(125,135,126), Vec3crd(217,216,231), Vec3crd(129,128,142), Vec3crd(216,213,232), Vec3crd(130,132,124), Vec3crd(213,216,233), Vec3crd(234,213,235), Vec3crd(236,227,237), Vec3crd(238,237,227), Vec3crd(239,240,216), Vec3crd(233,216,240), Vec3crd(241,242,229), Vec3crd(243,229,242), Vec3crd(215,227,244), Vec3crd(245,215,246), Vec3crd(217,247,229), Vec3crd(248,249,217), Vec3crd(232,213,250), Vec3crd(230,250,213), Vec3crd(133,147,134), Vec3crd(244,227,251), Vec3crd(236,252,227), Vec3crd(251,227,252), Vec3crd(231,216,253), Vec3crd(254,253,216), Vec3crd(141,140,144), Vec3crd(247,255,229), Vec3crd(241,229,256), Vec3crd(255,256,229), Vec3crd(257,241,258), Vec3crd(259,146,91), Vec3crd(260,261,236), Vec3crd(262,1,149), Vec3crd(263,264,241), Vec3crd(265,241,264), Vec3crd(266,236,267), Vec3crd(268,267,236), Vec3crd(49,48,83), Vec3crd(166,43,269), Vec3crd(270,271,272), Vec3crd(273,274,275), Vec3crd(276,274,277), Vec3crd(278,151,10), Vec3crd(279,280,272), Vec3crd(281,39,150), Vec3crd(272,282,279), Vec3crd(155,283,134), Vec3crd(274,276,284), Vec3crd(153,140,285), Vec3crd(286,276,287), Vec3crd(265,276,286), Vec3crd(288,289,279), Vec3crd(268,288,279), Vec3crd(290,291,272), Vec3crd(271,290,272), Vec3crd(292,274,293), Vec3crd(275,274,292), Vec3crd(294,265,295), Vec3crd(276,265,294), Vec3crd(296,297,268), Vec3crd(279,296,268), Vec3crd(241,265,298), Vec3crd(298,265,299), Vec3crd(236,300,268), Vec3crd(300,301,268), Vec3crd(107,33,78), Vec3crd(302,303,59), Vec3crd(304,305,279), Vec3crd(282,304,279), Vec3crd(306,276,307), Vec3crd(284,276,306), Vec3crd(185,17,73), Vec3crd(308,309,221), Vec3crd(158,39,70), Vec3crd(310,41,10), Vec3crd(15,311,208), Vec3crd(7,6,312), Vec3crd(313,314,6), Vec3crd(315,6,314), Vec3crd(316,208,317), Vec3crd(318,317,208), Vec3crd(258,241,319), Vec3crd(319,241,320), Vec3crd(261,321,236), Vec3crd(321,322,236), Vec3crd(6,315,323), Vec3crd(208,324,318), Vec3crd(270,325,318), Vec3crd(326,318,325), Vec3crd(327,328,315), Vec3crd(273,315,328), Vec3crd(118,329,20), Vec3crd(330,20,329), Vec3crd(331,332,25), Vec3crd(86,25,332), Vec3crd(333,334,52), Vec3crd(335,52,334), Vec3crd(115,336,48), Vec3crd(169,48,336), Vec3crd(62,106,4), Vec3crd(35,15,210), Vec3crd(35,337,15), Vec3crd(158,10,212), Vec3crd(158,310,10), Vec3crd(338,178,1), Vec3crd(339,59,116), Vec3crd(107,302,59), Vec3crd(66,22,340), Vec3crd(66,341,22), Vec3crd(185,221,342), Vec3crd(185,308,221), Vec3crd(75,31,179), Vec3crd(75,343,31), Vec3crd(166,20,330), Vec3crd(166,85,20), Vec3crd(81,52,335), Vec3crd(81,168,52), Vec3crd(82,19,344), Vec3crd(82,87,19), Vec3crd(108,339,345), Vec3crd(346,108,345), Vec3crd(64,347,348), Vec3crd(349,347,64), Vec3crd(178,109,350), Vec3crd(351,178,350), Vec3crd(179,352,353), Vec3crd(354,352,179), Vec3crd(355,208,356), Vec3crd(356,208,311), Vec3crd(357,358,6), Vec3crd(358,312,6), Vec3crd(68,22,21), Vec3crd(68,340,22), Vec3crd(221,48,47), Vec3crd(184,342,221), Vec3crd(359,270,360), Vec3crd(318,360,270), Vec3crd(361,362,273), Vec3crd(315,273,362), Vec3crd(272,102,270), Vec3crd(363,270,102), Vec3crd(274,273,103), Vec3crd(364,103,273), Vec3crd(21,19,18), Vec3crd(21,20,84), Vec3crd(184,46,42), Vec3crd(43,42,46), Vec3crd(12,22,71), Vec3crd(365,22,12), Vec3crd(14,98,15), Vec3crd(14,220,63), Vec3crd(40,93,10), Vec3crd(40,225,91), Vec3crd(45,221,309), Vec3crd(366,221,45), Vec3crd(313,367,212), Vec3crd(212,367,368), Vec3crd(36,369,367), Vec3crd(313,36,367), Vec3crd(316,37,367), Vec3crd(37,368,367), Vec3crd(210,367,369), Vec3crd(316,367,210), Vec3crd(362,370,315), Vec3crd(370,323,315), Vec3crd(360,318,371), Vec3crd(371,318,324), Vec3crd(372,331,159), Vec3crd(159,195,160), Vec3crd(373,115,56), Vec3crd(115,114,189), Vec3crd(52,56,161), Vec3crd(374,161,56), Vec3crd(25,28,331), Vec3crd(375,331,28), Vec3crd(376,333,163), Vec3crd(163,203,175), Vec3crd(377,118,24), Vec3crd(118,181,198), Vec3crd(25,24,162), Vec3crd(378,162,24), Vec3crd(52,51,333), Vec3crd(379,333,51), Vec3crd(167,380,381), Vec3crd(376,167,381), Vec3crd(377,381,330), Vec3crd(330,381,380), Vec3crd(335,381,382), Vec3crd(376,381,335), Vec3crd(373,383,169), Vec3crd(169,383,384), Vec3crd(168,385,383), Vec3crd(373,168,383), Vec3crd(372,87,383), Vec3crd(87,384,383), Vec3crd(377,80,381), Vec3crd(80,382,381), Vec3crd(86,383,385), Vec3crd(372,383,86), Vec3crd(106,348,347), Vec3crd(386,106,347), Vec3crd(375,65,346), Vec3crd(108,346,65), Vec3crd(64,112,349), Vec3crd(387,349,112), Vec3crd(171,190,114), Vec3crd(346,345,171), Vec3crd(374,190,345), Vec3crd(171,345,190), Vec3crd(349,172,347), Vec3crd(172,114,192), Vec3crd(386,347,192), Vec3crd(172,192,347), Vec3crd(173,160,196), Vec3crd(171,173,346), Vec3crd(375,346,196), Vec3crd(173,196,346), Vec3crd(172,349,174), Vec3crd(174,186,160), Vec3crd(387,186,349), Vec3crd(174,349,186), Vec3crd(64,348,62), Vec3crd(106,62,348), Vec3crd(108,107,339), Vec3crd(59,339,107), Vec3crd(374,345,116), Vec3crd(339,116,345), Vec3crd(76,353,352), Vec3crd(379,76,352), Vec3crd(388,77,351), Vec3crd(178,351,77), Vec3crd(179,120,354), Vec3crd(378,354,120), Vec3crd(177,200,175), Vec3crd(351,350,177), Vec3crd(389,200,350), Vec3crd(177,350,200), Vec3crd(354,180,352), Vec3crd(180,175,204), Vec3crd(379,352,204), Vec3crd(180,204,352), Vec3crd(182,181,206), Vec3crd(177,182,351), Vec3crd(388,351,206), Vec3crd(182,206,351), Vec3crd(180,354,183), Vec3crd(183,199,181), Vec3crd(378,199,354), Vec3crd(183,354,199), Vec3crd(91,109,338), Vec3crd(178,338,109), Vec3crd(76,75,353), Vec3crd(179,353,75), Vec3crd(389,350,110), Vec3crd(109,110,350), Vec3crd(390,391,392), Vec3crd(393,394,395), Vec3crd(224,122,389), Vec3crd(122,175,201), Vec3crd(365,388,205), Vec3crd(205,207,181), Vec3crd(66,340,396), Vec3crd(68,396,340), Vec3crd(184,396,342), Vec3crd(185,342,396), Vec3crd(66,396,67), Vec3crd(184,67,396), Vec3crd(68,69,396), Vec3crd(185,396,69), Vec3crd(219,111,387), Vec3crd(111,160,187), Vec3crd(366,386,191), Vec3crd(191,193,114), Vec3crd(150,272,280), Vec3crd(102,272,150), Vec3crd(151,277,274), Vec3crd(103,151,274), Vec3crd(161,374,117), Vec3crd(116,117,374), Vec3crd(366,61,386), Vec3crd(106,386,61), Vec3crd(111,187,387), Vec3crd(186,387,187), Vec3crd(56,188,374), Vec3crd(190,374,188), Vec3crd(191,386,193), Vec3crd(192,193,386), Vec3crd(331,375,194), Vec3crd(196,194,375), Vec3crd(28,34,375), Vec3crd(65,375,34), Vec3crd(219,387,113), Vec3crd(112,113,387), Vec3crd(224,389,123), Vec3crd(110,123,389), Vec3crd(51,55,379), Vec3crd(76,379,55), Vec3crd(24,197,378), Vec3crd(199,378,197), Vec3crd(122,201,389), Vec3crd(200,389,201), Vec3crd(333,379,202), Vec3crd(204,202,379), Vec3crd(205,388,207), Vec3crd(206,207,388), Vec3crd(365,27,388), Vec3crd(77,388,27), Vec3crd(162,378,121), Vec3crd(120,121,378), Vec3crd(162,30,25), Vec3crd(30,29,25), Vec3crd(51,53,54), Vec3crd(303,60,59), Vec3crd(28,29,33), Vec3crd(29,397,33), Vec3crd(161,58,52), Vec3crd(53,52,58), Vec3crd(21,84,19), Vec3crd(84,344,19), Vec3crd(46,49,43), Vec3crd(49,269,43), Vec3crd(208,316,209), Vec3crd(210,209,316), Vec3crd(327,313,211), Vec3crd(212,211,313), Vec3crd(36,35,369), Vec3crd(210,369,35), Vec3crd(37,158,368), Vec3crd(212,368,158), Vec3crd(6,8,313), Vec3crd(36,313,8), Vec3crd(326,38,316), Vec3crd(37,316,38), Vec3crd(392,391,398), Vec3crd(399,398,391), Vec3crd(394,400,395), Vec3crd(401,395,400), Vec3crd(390,214,391), Vec3crd(214,213,234), Vec3crd(393,395,218), Vec3crd(218,239,216), Vec3crd(402,230,403), Vec3crd(230,215,245), Vec3crd(125,124,131), Vec3crd(404,125,403), Vec3crd(405,406,231), Vec3crd(231,248,217), Vec3crd(129,137,127), Vec3crd(407,406,129), Vec3crd(130,127,139), Vec3crd(402,130,408), Vec3crd(194,195,331), Vec3crd(159,331,195), Vec3crd(115,189,56), Vec3crd(188,56,189), Vec3crd(14,219,220), Vec3crd(113,220,219), Vec3crd(45,50,366), Vec3crd(61,366,50), Vec3crd(221,366,222), Vec3crd(191,222,366), Vec3crd(17,23,219), Vec3crd(111,219,23), Vec3crd(118,198,24), Vec3crd(197,24,198), Vec3crd(202,203,333), Vec3crd(163,333,203), Vec3crd(40,224,225), Vec3crd(123,225,224), Vec3crd(12,13,365), Vec3crd(27,365,13), Vec3crd(22,365,223), Vec3crd(205,223,365), Vec3crd(42,44,224), Vec3crd(122,224,44), Vec3crd(399,391,234), Vec3crd(214,234,391), Vec3crd(401,239,395), Vec3crd(218,395,239), Vec3crd(214,390,226), Vec3crd(226,238,227), Vec3crd(218,228,393), Vec3crd(228,229,243), Vec3crd(401,399,233), Vec3crd(233,235,213), Vec3crd(392,409,390), Vec3crd(410,390,409), Vec3crd(394,393,411), Vec3crd(412,411,393), Vec3crd(402,403,131), Vec3crd(125,131,403), Vec3crd(405,137,406), Vec3crd(129,406,137), Vec3crd(405,408,139), Vec3crd(130,139,408), Vec3crd(230,245,403), Vec3crd(404,403,245), Vec3crd(231,406,248), Vec3crd(407,248,406), Vec3crd(232,254,216), Vec3crd(402,408,232), Vec3crd(413,404,244), Vec3crd(244,246,215), Vec3crd(414,247,407), Vec3crd(247,217,249), Vec3crd(133,126,136), Vec3crd(415,133,413), Vec3crd(141,143,128), Vec3crd(416,414,141), Vec3crd(410,238,390), Vec3crd(226,390,238), Vec3crd(412,393,243), Vec3crd(228,243,393), Vec3crd(233,399,235), Vec3crd(234,235,399), Vec3crd(237,260,236), Vec3crd(238,410,237), Vec3crd(417,260,410), Vec3crd(237,410,260), Vec3crd(239,401,240), Vec3crd(233,240,401), Vec3crd(242,241,257), Vec3crd(243,242,412), Vec3crd(418,412,257), Vec3crd(242,257,412), Vec3crd(401,419,399), Vec3crd(398,399,419), Vec3crd(417,410,420), Vec3crd(409,420,410), Vec3crd(400,421,401), Vec3crd(419,401,421), Vec3crd(418,422,412), Vec3crd(411,412,422), Vec3crd(413,135,404), Vec3crd(125,404,135), Vec3crd(414,407,142), Vec3crd(129,142,407), Vec3crd(130,402,132), Vec3crd(131,132,402), Vec3crd(133,136,413), Vec3crd(135,413,136), Vec3crd(423,147,415), Vec3crd(133,415,147), Vec3crd(137,405,138), Vec3crd(139,138,405), Vec3crd(141,414,143), Vec3crd(142,143,414), Vec3crd(424,416,144), Vec3crd(141,144,416), Vec3crd(405,254,408), Vec3crd(232,408,254), Vec3crd(244,404,246), Vec3crd(245,246,404), Vec3crd(247,249,407), Vec3crd(248,407,249), Vec3crd(232,250,402), Vec3crd(230,402,250), Vec3crd(415,413,251), Vec3crd(244,251,413), Vec3crd(252,236,266), Vec3crd(251,252,415), Vec3crd(423,415,266), Vec3crd(252,266,415), Vec3crd(231,253,405), Vec3crd(254,405,253), Vec3crd(416,255,414), Vec3crd(247,414,255), Vec3crd(256,263,241), Vec3crd(255,416,256), Vec3crd(424,263,416), Vec3crd(256,416,263), Vec3crd(257,258,418), Vec3crd(425,418,258), Vec3crd(260,417,261), Vec3crd(426,261,417), Vec3crd(422,418,427), Vec3crd(427,259,91), Vec3crd(420,428,417), Vec3crd(428,1,262), Vec3crd(147,423,148), Vec3crd(429,148,423), Vec3crd(263,424,264), Vec3crd(264,295,265), Vec3crd(266,267,423), Vec3crd(267,268,297), Vec3crd(144,145,424), Vec3crd(430,424,145), Vec3crd(49,431,269), Vec3crd(166,269,431), Vec3crd(82,431,83), Vec3crd(49,83,431), Vec3crd(84,85,431), Vec3crd(166,431,85), Vec3crd(82,344,431), Vec3crd(84,431,344), Vec3crd(432,278,90), Vec3crd(10,90,278), Vec3crd(433,0,281), Vec3crd(39,281,0), Vec3crd(362,361,434), Vec3crd(435,271,359), Vec3crd(270,359,271), Vec3crd(436,361,275), Vec3crd(273,275,361), Vec3crd(360,437,359), Vec3crd(277,287,276), Vec3crd(151,278,277), Vec3crd(280,279,289), Vec3crd(150,280,281), Vec3crd(436,438,439), Vec3crd(439,285,140), Vec3crd(90,92,432), Vec3crd(440,432,92), Vec3crd(282,272,291), Vec3crd(441,282,442), Vec3crd(284,293,274), Vec3crd(443,438,284), Vec3crd(278,432,286), Vec3crd(286,299,265), Vec3crd(281,288,433), Vec3crd(288,268,301), Vec3crd(0,433,89), Vec3crd(444,89,433), Vec3crd(435,445,442), Vec3crd(445,134,283), Vec3crd(439,446,436), Vec3crd(361,436,446), Vec3crd(442,290,435), Vec3crd(271,435,290), Vec3crd(438,436,292), Vec3crd(275,292,436), Vec3crd(445,435,447), Vec3crd(359,447,435), Vec3crd(286,287,278), Vec3crd(277,278,287), Vec3crd(288,281,289), Vec3crd(280,289,281), Vec3crd(145,152,430), Vec3crd(443,430,152), Vec3crd(148,429,154), Vec3crd(441,154,429), Vec3crd(424,430,294), Vec3crd(294,307,276), Vec3crd(423,296,429), Vec3crd(296,279,305), Vec3crd(425,440,100), Vec3crd(92,100,440), Vec3crd(290,442,291), Vec3crd(282,291,442), Vec3crd(292,293,438), Vec3crd(284,438,293), Vec3crd(298,320,241), Vec3crd(432,440,298), Vec3crd(300,236,322), Vec3crd(433,300,444), Vec3crd(426,101,444), Vec3crd(89,444,101), Vec3crd(107,448,302), Vec3crd(302,79,54), Vec3crd(78,31,343), Vec3crd(107,78,448), Vec3crd(75,79,448), Vec3crd(302,448,79), Vec3crd(78,343,448), Vec3crd(75,448,343), Vec3crd(427,418,259), Vec3crd(425,259,418), Vec3crd(428,262,417), Vec3crd(426,417,262), Vec3crd(437,449,359), Vec3crd(447,359,449), Vec3crd(434,361,450), Vec3crd(446,450,361), Vec3crd(32,33,397), Vec3crd(78,33,32), Vec3crd(53,303,54), Vec3crd(302,54,303), Vec3crd(152,153,443), Vec3crd(438,443,153), Vec3crd(429,304,441), Vec3crd(282,441,304), Vec3crd(430,443,306), Vec3crd(284,306,443), Vec3crd(154,441,155), Vec3crd(442,155,441), Vec3crd(298,299,432), Vec3crd(286,432,299), Vec3crd(300,433,301), Vec3crd(288,301,433), Vec3crd(185,451,308), Vec3crd(308,74,7), Vec3crd(73,15,337), Vec3crd(185,73,451), Vec3crd(35,74,451), Vec3crd(308,451,74), Vec3crd(73,337,451), Vec3crd(35,451,337), Vec3crd(158,452,310), Vec3crd(310,72,42), Vec3crd(70,22,341), Vec3crd(158,70,452), Vec3crd(66,72,452), Vec3crd(310,452,72), Vec3crd(70,341,452), Vec3crd(66,452,341), Vec3crd(313,327,314), Vec3crd(315,314,327), Vec3crd(316,317,326), Vec3crd(318,326,317), Vec3crd(15,156,311), Vec3crd(356,311,156), Vec3crd(7,312,157), Vec3crd(358,157,312), Vec3crd(211,9,327), Vec3crd(364,327,9), Vec3crd(38,326,94), Vec3crd(363,94,326), Vec3crd(294,295,424), Vec3crd(264,424,295), Vec3crd(296,423,297), Vec3crd(267,297,423), Vec3crd(262,149,426), Vec3crd(101,426,149), Vec3crd(258,319,425), Vec3crd(440,425,319), Vec3crd(261,426,321), Vec3crd(444,321,426), Vec3crd(259,425,146), Vec3crd(100,146,425), Vec3crd(306,307,430), Vec3crd(294,430,307), Vec3crd(304,429,305), Vec3crd(296,305,429), Vec3crd(319,320,440), Vec3crd(298,440,320), Vec3crd(321,444,322), Vec3crd(300,322,444), Vec3crd(445,283,442), Vec3crd(155,442,283), Vec3crd(439,438,285), Vec3crd(153,285,438), Vec3crd(17,68,18), Vec3crd(21,18,68), Vec3crd(46,184,47), Vec3crd(221,47,184), Vec3crd(102,95,363), Vec3crd(94,363,95), Vec3crd(9,11,364), Vec3crd(103,364,11), Vec3crd(6,323,357), Vec3crd(370,357,323), Vec3crd(371,324,355), Vec3crd(208,355,324), Vec3crd(270,363,325), Vec3crd(326,325,363), Vec3crd(327,364,328), Vec3crd(273,328,364), Vec3crd(0,2,39), Vec3crd(12,39,2), Vec3crd(90,93,91), Vec3crd(40,91,93), Vec3crd(14,16,17), Vec3crd(73,17,16), Vec3crd(45,309,7), Vec3crd(308,7,309), Vec3crd(12,71,39), Vec3crd(70,39,71), Vec3crd(40,41,42), Vec3crd(310,42,41), Vec3crd(97,98,63), Vec3crd(14,63,98), Vec3crd(3,5,7), Vec3crd(45,7,5), Vec3crd(118,377,329), Vec3crd(330,329,377), Vec3crd(331,372,332), Vec3crd(86,332,372), Vec3crd(333,376,334), Vec3crd(335,334,376), Vec3crd(115,373,336), Vec3crd(169,336,373), Vec3crd(167,166,380), Vec3crd(330,380,166), Vec3crd(80,81,382), Vec3crd(335,382,81), Vec3crd(86,385,81), Vec3crd(168,81,385), Vec3crd(169,384,82), Vec3crd(87,82,384), Vec3crd(159,88,372), Vec3crd(87,372,88), Vec3crd(163,164,376), Vec3crd(167,376,164), Vec3crd(24,26,377), Vec3crd(80,377,26), Vec3crd(56,57,373), Vec3crd(168,373,57), Vec3crd(32,397,30), Vec3crd(29,30,397), Vec3crd(58,60,53), Vec3crd(303,53,60), Vec3crd(205,181,119), Vec3crd(118,119,181), Vec3crd(163,175,165), Vec3crd(122,165,175), Vec3crd(453,454,455), Vec3crd(454,456,455), Vec3crd(457,455,456), Vec3crd(458,455,457), Vec3crd(459,455,458), Vec3crd(460,455,459), Vec3crd(461,462,463), Vec3crd(464,465,466), Vec3crd(467,468,469), Vec3crd(470,471,472), Vec3crd(465,473,474), Vec3crd(475,476,477), Vec3crd(478,479,480), Vec3crd(481,482,478), Vec3crd(483,484,481), Vec3crd(485,486,483), Vec3crd(487,488,485), Vec3crd(489,490,487), Vec3crd(491,492,489), Vec3crd(493,494,491), Vec3crd(495,496,493), Vec3crd(497,498,495), Vec3crd(499,500,497), Vec3crd(501,502,499), Vec3crd(503,504,501), Vec3crd(505,504,503), Vec3crd(506,504,505), Vec3crd(507,504,506), Vec3crd(508,504,507), Vec3crd(509,504,508), Vec3crd(510,504,509), Vec3crd(511,504,510), Vec3crd(512,504,511), Vec3crd(513,504,512), Vec3crd(514,504,513), Vec3crd(476,515,516), Vec3crd(517,518,519), Vec3crd(520,517,521), Vec3crd(518,522,523), Vec3crd(522,480,479), Vec3crd(524,525,526), Vec3crd(468,470,527), Vec3crd(525,467,528), Vec3crd(529,475,530), Vec3crd(531,532,533), Vec3crd(534,531,535), Vec3crd(536,537,538), Vec3crd(473,539,540), Vec3crd(539,536,541), Vec3crd(537,534,542), Vec3crd(471,520,543), Vec3crd(532,529,544), Vec3crd(545,524,546), Vec3crd(453,461,547), Vec3crd(463,464,548), Vec3crd(523,549,504), Vec3crd(527,550,551), Vec3crd(519,552,553), Vec3crd(521,554,555), Vec3crd(466,556,557), Vec3crd(469,558,559), Vec3crd(528,560,561), Vec3crd(477,562,563), Vec3crd(543,564,565), Vec3crd(535,566,567), Vec3crd(530,568,569), Vec3crd(540,570,571), Vec3crd(474,572,573), Vec3crd(542,574,575), Vec3crd(538,576,577), Vec3crd(541,578,579), Vec3crd(472,580,581), Vec3crd(526,582,583), Vec3crd(533,584,585), Vec3crd(544,586,587), Vec3crd(516,545,588), Vec3crd(588,589,590), Vec3crd(455,460,4), Vec3crd(591,592,63), Vec3crd(462,455,4), Vec3crd(592,547,63), Vec3crd(547,548,63), Vec3crd(465,462,4), Vec3crd(548,557,63), Vec3crd(127,124,501), Vec3crd(127,501,499), Vec3crd(505,503,124), Vec3crd(124,126,507), Vec3crd(124,507,506), Vec3crd(509,508,126), Vec3crd(126,134,512), Vec3crd(126,512,511), Vec3crd(510,509,126), Vec3crd(128,127,493), Vec3crd(128,493,491), Vec3crd(497,495,127), Vec3crd(489,487,128), Vec3crd(140,128,483), Vec3crd(140,483,481), Vec3crd(487,485,128), Vec3crd(478,480,140), Vec3crd(480,522,140), Vec3crd(514,513,134), Vec3crd(504,514,134), Vec3crd(551,581,437), Vec3crd(471,470,434), Vec3crd(445,447,555), Vec3crd(445,555,553), Vec3crd(134,445,553), Vec3crd(134,553,504), Vec3crd(446,439,518), Vec3crd(446,518,517), Vec3crd(439,140,522), Vec3crd(439,522,518), Vec3crd(515,476,358), Vec3crd(563,588,356), Vec3crd(557,573,63), Vec3crd(473,465,4), Vec3crd(437,360,559), Vec3crd(437,559,551), Vec3crd(360,371,561), Vec3crd(360,561,559), Vec3crd(362,434,470), Vec3crd(362,470,468), Vec3crd(370,362,468), Vec3crd(370,468,467), Vec3crd(499,497,127), Vec3crd(506,505,124), Vec3crd(495,493,127), Vec3crd(513,512,134), Vec3crd(481,478,140), Vec3crd(447,449,565), Vec3crd(447,565,555), Vec3crd(450,446,517), Vec3crd(450,517,520), Vec3crd(356,156,569), Vec3crd(356,569,563), Vec3crd(157,358,476), Vec3crd(157,476,475), Vec3crd(357,370,467), Vec3crd(357,467,525), Vec3crd(371,355,583), Vec3crd(371,583,561), Vec3crd(460,459,4), Vec3crd(63,62,593), Vec3crd(63,593,591), Vec3crd(62,4,459), Vec3crd(62,459,458), Vec3crd(532,531,104), Vec3crd(531,534,104), Vec3crd(567,585,105), Vec3crd(575,567,105), Vec3crd(4,3,539), Vec3crd(4,539,473), Vec3crd(536,539,3), Vec3crd(97,63,573), Vec3crd(97,573,571), Vec3crd(571,579,97), Vec3crd(99,97,579), Vec3crd(99,579,577), Vec3crd(105,99,577), Vec3crd(105,577,575), Vec3crd(96,104,534), Vec3crd(96,534,537), Vec3crd(3,96,537), Vec3crd(3,537,536), Vec3crd(503,501,124), Vec3crd(508,507,126), Vec3crd(491,489,128), Vec3crd(511,510,126), Vec3crd(485,483,128), Vec3crd(434,450,520), Vec3crd(434,520,471), Vec3crd(449,437,581), Vec3crd(449,581,565), Vec3crd(156,105,585), Vec3crd(156,585,587), Vec3crd(587,569,156), Vec3crd(104,157,529), Vec3crd(104,529,532), Vec3crd(475,529,157), Vec3crd(590,583,355), Vec3crd(355,356,588), Vec3crd(355,588,590), Vec3crd(358,357,524), Vec3crd(358,524,515), Vec3crd(525,524,357), Vec3crd(458,457,62), Vec3crd(457,593,62), Vec3crd(479,478,482), Vec3crd(479,504,549), Vec3crd(479,482,504), Vec3crd(482,481,484), Vec3crd(472,551,550), Vec3crd(581,551,472), Vec3crd(482,484,504), Vec3crd(484,483,486), Vec3crd(523,553,552), Vec3crd(504,553,523), Vec3crd(540,573,572), Vec3crd(571,573,540), Vec3crd(544,585,584), Vec3crd(587,585,544), Vec3crd(542,577,576), Vec3crd(575,577,542), Vec3crd(526,590,589), Vec3crd(583,590,526), Vec3crd(535,575,574), Vec3crd(567,575,535), Vec3crd(533,567,566), Vec3crd(585,567,533), Vec3crd(538,579,578), Vec3crd(577,579,538), Vec3crd(543,581,580), Vec3crd(565,581,543), Vec3crd(477,569,568), Vec3crd(563,569,477), Vec3crd(530,587,586), Vec3crd(569,587,530), Vec3crd(541,571,570), Vec3crd(579,571,541), Vec3crd(528,583,582), Vec3crd(561,583,528), Vec3crd(591,453,592), Vec3crd(547,592,453), Vec3crd(521,565,564), Vec3crd(555,565,521), Vec3crd(474,557,556), Vec3crd(573,557,474), Vec3crd(516,563,562), Vec3crd(588,563,516), Vec3crd(519,555,554), Vec3crd(553,555,519), Vec3crd(527,559,558), Vec3crd(551,559,527), Vec3crd(469,561,560), Vec3crd(559,561,469), Vec3crd(462,461,455), Vec3crd(453,455,461), Vec3crd(461,463,547), Vec3crd(548,547,463), Vec3crd(465,464,462), Vec3crd(463,462,464), Vec3crd(464,466,548), Vec3crd(557,548,466), Vec3crd(469,560,467), Vec3crd(528,467,560), Vec3crd(472,550,470), Vec3crd(527,470,550), Vec3crd(474,556,465), Vec3crd(466,465,556), Vec3crd(477,568,475), Vec3crd(530,475,568), Vec3crd(516,562,476), Vec3crd(477,476,562), Vec3crd(519,554,517), Vec3crd(521,517,554), Vec3crd(521,564,520), Vec3crd(543,520,564), Vec3crd(523,552,518), Vec3crd(519,518,552), Vec3crd(479,549,522), Vec3crd(523,522,549), Vec3crd(526,589,524), Vec3crd(589,546,524), Vec3crd(527,558,468), Vec3crd(469,468,558), Vec3crd(528,582,525), Vec3crd(526,525,582), Vec3crd(530,586,529), Vec3crd(544,529,586), Vec3crd(533,566,531), Vec3crd(535,531,566), Vec3crd(535,574,534), Vec3crd(542,534,574), Vec3crd(538,578,536), Vec3crd(541,536,578), Vec3crd(540,572,473), Vec3crd(474,473,572), Vec3crd(541,570,539), Vec3crd(540,539,570), Vec3crd(542,576,537), Vec3crd(538,537,576), Vec3crd(543,580,471), Vec3crd(472,471,580), Vec3crd(544,584,532), Vec3crd(533,532,584), Vec3crd(524,545,515), Vec3crd(516,515,545), Vec3crd(545,546,588), Vec3crd(589,588,546), Vec3crd(453,591,454), Vec3crd(593,454,591), Vec3crd(484,486,504), Vec3crd(486,485,488), Vec3crd(486,488,504), Vec3crd(488,487,490), Vec3crd(488,490,504), Vec3crd(490,489,492), Vec3crd(490,492,504), Vec3crd(492,491,494), Vec3crd(492,494,504), Vec3crd(494,493,496), Vec3crd(494,496,504), Vec3crd(496,495,498), Vec3crd(496,498,504), Vec3crd(498,497,500), Vec3crd(498,500,504), Vec3crd(500,499,502), Vec3crd(500,502,504), Vec3crd(501,504,502), Vec3crd(454,593,456), Vec3crd(457,456,593), Vec3crd(594,595,596), Vec3crd(597,598,594), Vec3crd(599,597,594), Vec3crd(600,599,594), Vec3crd(601,600,594), Vec3crd(602,601,594), Vec3crd(603,602,594), Vec3crd(604,603,594), Vec3crd(605,604,594), Vec3crd(606,607,608), Vec3crd(609,606,608), Vec3crd(610,609,608), Vec3crd(611,610,608), Vec3crd(612,611,608), Vec3crd(613,612,608), Vec3crd(614,613,608), Vec3crd(615,614,608), Vec3crd(616,615,608), Vec3crd(617,616,608), Vec3crd(618,617,608), Vec3crd(619,618,608), Vec3crd(620,619,608), Vec3crd(596,608,607), Vec3crd(595,594,598), Vec3crd(608,596,595), Vec3crd(605,594,91), Vec3crd(91,338,602), Vec3crd(91,602,603), Vec3crd(598,597,1), Vec3crd(594,596,91), Vec3crd(608,595,1), Vec3crd(595,598,1), Vec3crd(616,617,392), Vec3crd(610,611,394), Vec3crd(419,421,613), Vec3crd(419,613,614), Vec3crd(422,427,607), Vec3crd(422,607,606), Vec3crd(427,91,596), Vec3crd(427,596,607), Vec3crd(428,420,619), Vec3crd(428,619,620), Vec3crd(1,428,620), Vec3crd(1,620,608), Vec3crd(420,409,618), Vec3crd(420,618,619), Vec3crd(411,422,606), Vec3crd(411,606,609), Vec3crd(398,419,614), Vec3crd(398,614,615), Vec3crd(421,400,612), Vec3crd(421,612,613), Vec3crd(409,392,617), Vec3crd(409,617,618), Vec3crd(394,411,609), Vec3crd(394,609,610), Vec3crd(604,605,91), Vec3crd(338,1,599), Vec3crd(338,599,600), Vec3crd(392,398,615), Vec3crd(392,615,616), Vec3crd(400,394,611), Vec3crd(400,611,612), Vec3crd(603,604,91), Vec3crd(601,602,338), Vec3crd(597,599,1), Vec3crd(600,601,338) });
+ { {513.075988769531,51.6074333190918,36.0009002685547}, {516.648803710938,51.7324333190918,36.0009002685547}, {513.495178222656,51.7324333190918,36.0009002685547}, {489.391204833984,51.4824333190918,24.0011005401611}, {488.928588867188,51.7324333190918,24.0011005401611}, {492.06201171875,51.7324333190918,24.0011005401611}, {496.840393066406,51.2324333190918,24.0011005401611}, {495.195404052734,51.7324333190918,24.0011005401611}, {498.981994628906,51.7324333190918,24.0011005401611}, {506.966613769531,51.6074333190918,24.0011005401611}, {510.342010498047,51.7324333190918,24.0011005401611}, {507.163818359375,51.6074333190918,24.0011005401611}, {512.515380859375,54.7190322875977,36.0009002685547}, {514.161987304688,54.5058326721191,36.0009002685547}, {493.06201171875,54.7190322875977,36.0009002685547}, {495.195404052734,51.7324333190918,36.0009002685547}, {496.195404052734,54.7190322875977,36.0009002685547}, {497.195404052734,57.7058334350586,36.0009002685547}, {500.851989746094,60.2658309936523,36.0009002685547}, {498.915405273438,62.8258323669434,36.0009002685547}, {506.701995849609,62.8258323669434,36.0009002685547}, {503.648590087891,60.2658309936523,36.0009002685547}, {508.381805419922,57.7058334350586,36.0009002685547}, {496.418792724609,60.052433013916,36.0009002685547}, {506.515197753906,72.2124328613281,36.0009002685547}, {502.808807373047,74.5324325561523,36.0009002685547}, {503.781982421875,71.6058349609375,36.0009002685547}, {515.358764648438,55.4658317565918,36.0009002685547}, {499.375183105469,76.9058380126953,36.0009002685547}, {501.168792724609,78.0658340454102,36.0009002685547}, {504.568786621094,78.0658340454102,36.0009002685547}, {506.32861328125,81.599235534668,36.0009002685547}, {502.928588867188,81.599235534668,36.0009002685547}, {499.528594970703,81.599235534668,36.0009002685547}, {498.20361328125,77.8658294677734,36.0009002685547}, {495.195404052734,51.7324333190918,30.0011005401611}, {498.981994628906,51.7324333190918,27.0011005401611}, {506.555206298828,51.7324333190918,33.0009002685547}, {506.555206298828,51.7324333190918,36.0009002685547}, {510.342010498047,51.7324333190918,36.0009002685547}, {512.515380859375,54.7190322875977,24.0011005401611}, {509.361999511719,54.7190322875977,24.0011005401611}, {508.381805419922,57.7058334350586,24.0011005401611}, {506.701995849609,62.8258323669434,24.0011005401611}, {509.188812255859,60.052433013916,24.0011005401611}, {493.06201171875,54.7190322875977,24.0011005401611}, {503.648590087891,60.2658309936523,24.0011005401611}, {500.851989746094,60.2658309936523,24.0011005401611}, {498.915405273438,62.8258323669434,24.0011005401611}, {502.808807373047,62.8258323669434,24.0011005401611}, {491.425201416016,54.5058326721191,24.0011005401611}, {506.421813964844,76.9058380126953,24.0011005401611}, {502.808807373047,74.5324325561523,24.0011005401611}, {504.568786621094,78.0658340454102,24.0011005401611}, {506.32861328125,81.599235534668,24.0011005401611}, {507.618804931641,77.8658294677734,24.0011005401611}, {499.221801757812,72.2124328613281,24.0011005401611}, {501.835388183594,71.6058349609375,24.0011005401611}, {501.168792724609,78.0658340454102,24.0011005401611}, {499.528594970703,81.599235534668,24.0011005401611}, {502.048583984375,79.8324356079102,24.0011005401611}, {490.253601074219,55.4658317565918,24.0011005401611}, {488.928588867188,51.7324333190918,30.0011005401611}, {488.928588867188,51.7324333190918,36.0009002685547}, {490.253601074219,55.4658317565918,31.5009002685547}, {498.20361328125,77.8658294677734,34.5009002685547}, {508.381805419922,57.7058334350586,30.0011005401611}, {505.585388183594,57.7058334350586,27.0011005401611}, {502.788818359375,57.7058334350586,36.0009002685547}, {499.992004394531,57.7058334350586,33.0009002685547}, {509.851989746094,53.2258338928223,33.0009002685547}, {509.361999511719,54.7190322875977,36.0009002685547}, {508.871795654297,56.2124328613281,27.0011005401611}, {496.695404052734,56.2124328613281,33.0009002685547}, {495.695404052734,53.2258338928223,27.0011005401611}, {506.32861328125,81.599235534668,30.0011005401611}, {507.618804931641,77.8658294677734,25.5011005401611}, {515.358764648438,55.4658317565918,34.5009002685547}, {501.228607177734,81.599235534668,33.0009002685547}, {504.628601074219,81.599235534668,27.0011005401611}, {503.781982421875,71.6058349609375,33.0009002685547}, {502.808807373047,74.5324325561523,30.0011005401611}, {498.915405273438,62.8258323669434,30.0011005401611}, {500.861999511719,62.8258323669434,27.0011005401611}, {502.808807373047,62.8258323669434,36.0009002685547}, {504.755187988281,62.8258323669434,33.0009002685547}, {501.835388183594,71.6058349609375,33.0009002685547}, {499.888793945312,65.7524337768555,33.0009002685547}, {499.888793945312,65.7524337768555,36.0009002685547}, {513.128601074219,51.4824333190918,36.0009002685547}, {513.075988769531,51.6074333190918,24.0011005401611}, {516.648803710938,51.7324333190918,24.0011005401611}, {513.128601074219,51.4824333190918,24.0011005401611}, {513.495178222656,51.7324333190918,24.0011005401611}, {506.966613769531,51.6074333190918,36.0009002685547}, {507.163818359375,51.6074333190918,36.0009002685547}, {490.337799072266,51.4824333190918,24.0011005401611}, {489.391204833984,51.4824333190918,36.0009002685547}, {492.06201171875,51.7324333190918,36.0009002685547}, {490.337799072266,51.4824333190918,36.0009002685547}, {513.233764648438,51.2324333190918,24.0011005401611}, {513.233764648438,51.2324333190918,36.0009002685547}, {504.773803710938,51.4824333190918,36.0009002685547}, {504.773803710938,51.4824333190918,24.0011005401611}, {489.266998291016,51.2324333190918,24.0011005401611}, {489.266998291016,51.2324333190918,36.0009002685547}, {490.253601074219,55.4658317565918,25.5011005401611}, {499.528594970703,81.599235534668,30.0011005401611}, {498.20361328125,77.8658294677734,31.5009002685547}, {515.358764648438,55.4658317565918,28.5011005401611}, {515.358764648438,55.4658317565918,25.5011005401611}, {495.246795654297,61.0124320983887,36.0009002685547}, {490.253601074219,55.4658317565918,34.5009002685547}, {490.253601074219,55.4658317565918,36.0009002685547}, {494.228607177734,66.6658325195312,24.0011005401611}, {499.068786621094,67.5192337036133,24.0011005401611}, {498.20361328125,77.8658294677734,25.5011005401611}, {498.20361328125,77.8658294677734,24.0011005401611}, {506.608795166016,67.5192337036133,36.0009002685547}, {509.09521484375,64.7458343505859,36.0009002685547}, {507.618804931641,77.8658294677734,34.5009002685547}, {507.618804931641,77.8658294677734,36.0009002685547}, {510.385406494141,61.0124320983887,24.0011005401611}, {515.358764648438,55.4658317565918,24.0011005401611}, {489.32861328125,47.7324333190918,31.5009002685547}, {492.95361328125,47.7324333190918,33.5634994506836}, {489.32861328125,47.7324333190918,34.5009002685547}, {489.32861328125,47.7324333190918,28.5011005401611}, {489.32861328125,47.7324333190918,25.5011005401611}, {492.95361328125,47.7324333190918,26.4385013580322}, {492.95361328125,47.7324333190918,30.5635013580322}, {492.95361328125,47.7324333190918,32.0634994506836}, {492.95361328125,47.7324333190918,31.3135013580322}, {492.95361328125,47.7324333190918,35.4384994506836}, {489.32861328125,47.7324333190918,36.0009002685547}, {492.95361328125,47.7324333190918,34.3134994506836}, {492.95361328125,47.7324333190918,34.6884994506836}, {492.95361328125,47.7324333190918,27.9385013580322}, {492.95361328125,47.7324333190918,28.6885013580322}, {492.95361328125,47.7324333190918,29.0635013580322}, {489.32861328125,47.7324333190918,24.0011005401611}, {492.95361328125,47.7324333190918,24.5635013580322}, {492.95361328125,47.7324333190918,25.6885013580322}, {492.95361328125,47.7324333190918,25.3135013580322}, {492.95361328125,47.7324333190918,24.1885013580322}, {492.95361328125,47.7324333190918,24.0011005401611}, {513.443786621094,50.7324333190918,24.0011005401611}, {492.95361328125,47.7324333190918,35.8134994506836}, {492.95361328125,47.7324333190918,36.0009002685547}, {513.443786621094,50.7324333190918,36.0009002685547}, {506.350402832031,51.4824333190918,36.0009002685547}, {506.350402832031,51.4824333190918,24.0011005401611}, {492.743804931641,48.2324333190918,24.0011005401611}, {492.638793945312,48.4824333190918,24.0011005401611}, {492.743804931641,48.2324333190918,36.0009002685547}, {492.638793945312,48.4824333190918,36.0009002685547}, {490.089599609375,50.9824333190918,36.0009002685547}, {490.089599609375,50.9824333190918,24.0011005401611}, {510.342010498047,51.7324333190918,30.0011005401611}, {499.068786621094,67.5192337036133,36.0009002685547}, {494.228607177734,66.6658325195312,36.0009002685547}, {499.375183105469,76.9058380126953,24.0011005401611}, {506.421813964844,76.9058380126953,36.0009002685547}, {506.608795166016,67.5192337036133,24.0011005401611}, {505.728607177734,65.7524337768555,24.0011005401611}, {509.09521484375,64.7458343505859,24.0011005401611}, {506.701995849609,62.8258323669434,30.0011005401611}, {505.728607177734,65.7524337768555,27.0011005401611}, {501.835388183594,71.6058349609375,27.0011005401611}, {499.888793945312,65.7524337768555,27.0011005401611}, {494.228607177734,66.6658325195312,30.0011005401611}, {495.553588867188,70.3992309570312,28.5011005401611}, {492.903594970703,62.9324340820312,28.5011005401611}, {495.553588867188,70.3992309570312,31.5009002685547}, {492.903594970703,62.9324340820312,31.5009002685547}, {511.488800048828,66.6658325195312,24.0011005401611}, {511.488800048828,66.6658325195312,30.0011005401611}, {512.778564453125,62.9324340820312,28.5011005401611}, {515.358764648438,55.4658317565918,31.5009002685547}, {507.618804931641,77.8658294677734,31.5009002685547}, {510.198791503906,70.3992309570312,28.5011005401611}, {511.488800048828,66.6658325195312,36.0009002685547}, {512.778564453125,62.9324340820312,31.5009002685547}, {510.198791503906,70.3992309570312,31.5009002685547}, {502.788818359375,57.7058334350586,24.0011005401611}, {497.195404052734,57.7058334350586,30.0011005401611}, {492.903594970703,62.9324340820312,34.5009002685547}, {492.903594970703,62.9324340820312,36.0009002685547}, {495.553588867188,70.3992309570312,24.0011005401611}, {496.725189208984,69.4392318725586,24.0011005401611}, {495.553588867188,70.3992309570312,25.5011005401611}, {495.246795654297,61.0124320983887,24.0011005401611}, {492.903594970703,62.9324340820312,25.5011005401611}, {492.903594970703,62.9324340820312,24.0011005401611}, {495.553588867188,70.3992309570312,36.0009002685547}, {496.725189208984,69.4392318725586,36.0009002685547}, {495.553588867188,70.3992309570312,34.5009002685547}, {510.198791503906,70.3992309570312,36.0009002685547}, {509.002014160156,69.4392318725586,36.0009002685547}, {510.198791503906,70.3992309570312,34.5009002685547}, {512.778564453125,62.9324340820312,25.5011005401611}, {512.778564453125,62.9324340820312,24.0011005401611}, {510.198791503906,70.3992309570312,24.0011005401611}, {509.002014160156,69.4392318725586,24.0011005401611}, {510.198791503906,70.3992309570312,25.5011005401611}, {510.385406494141,61.0124320983887,36.0009002685547}, {512.778564453125,62.9324340820312,34.5009002685547}, {512.778564453125,62.9324340820312,36.0009002685547}, {496.840393066406,51.2324333190918,36.0009002685547}, {498.981994628906,51.7324333190918,36.0009002685547}, {498.981994628906,51.7324333190918,33.0009002685547}, {506.555206298828,51.7324333190918,24.0011005401611}, {506.555206298828,51.7324333190918,27.0011005401611}, {503.82861328125,47.7324333190918,30.7509002685547}, {507.45361328125,47.7324333190918,32.8134994506836}, {503.82861328125,47.7324333190918,33.7509002685547}, {503.82861328125,47.7324333190918,29.2511005401611}, {503.82861328125,47.7324333190918,26.2511005401611}, {507.45361328125,47.7324333190918,27.1885013580322}, {493.921813964844,57.2792320251465,36.0009002685547}, {491.425201416016,54.5058326721191,36.0009002685547}, {497.195404052734,57.7058334350586,24.0011005401611}, {496.418792724609,60.052433013916,24.0011005401611}, {509.188812255859,60.052433013916,36.0009002685547}, {511.675415039062,57.2792320251465,24.0011005401611}, {514.161987304688,54.5058326721191,24.0011005401611}, {507.45361328125,47.7324333190918,34.3134994506836}, {503.82861328125,47.7324333190918,35.2509002685547}, {507.45361328125,47.7324333190918,25.6885013580322}, {503.82861328125,47.7324333190918,24.7511005401611}, {500.20361328125,47.7324333190918,31.6885013580322}, {500.20361328125,47.7324333190918,28.3135013580322}, {500.20361328125,47.7324333190918,30.1885013580322}, {507.45361328125,47.7324333190918,29.8135013580322}, {507.45361328125,47.7324333190918,31.3135013580322}, {507.45361328125,47.7324333190918,30.5635013580322}, {503.82861328125,47.7324333190918,36.0009002685547}, {507.45361328125,47.7324333190918,35.4384994506836}, {507.45361328125,47.7324333190918,35.0634994506836}, {507.45361328125,47.7324333190918,28.6885013580322}, {507.45361328125,47.7324333190918,29.4385013580322}, {503.82861328125,47.7324333190918,24.0011005401611}, {507.45361328125,47.7324333190918,24.5635013580322}, {507.45361328125,47.7324333190918,24.9385013580322}, {500.20361328125,47.7324333190918,34.6884994506836}, {500.20361328125,47.7324333190918,33.1884994506836}, {500.20361328125,47.7324333190918,33.9384994506836}, {500.20361328125,47.7324333190918,25.3135013580322}, {500.20361328125,47.7324333190918,26.8135013580322}, {500.20361328125,47.7324333190918,26.0635013580322}, {500.20361328125,47.7324333190918,30.9385013580322}, {500.20361328125,47.7324333190918,35.0634994506836}, {500.20361328125,47.7324333190918,35.4384994506836}, {500.20361328125,47.7324333190918,29.0635013580322}, {500.20361328125,47.7324333190918,29.4385013580322}, {500.20361328125,47.7324333190918,24.9385013580322}, {500.20361328125,47.7324333190918,24.5635013580322}, {507.45361328125,47.7324333190918,24.1885013580322}, {507.45361328125,47.7324333190918,24.0011005401611}, {513.86376953125,49.7324333190918,24.0011005401611}, {507.45361328125,47.7324333190918,35.8134994506836}, {507.45361328125,47.7324333190918,36.0009002685547}, {513.86376953125,49.7324333190918,36.0009002685547}, {500.20361328125,47.7324333190918,24.1885013580322}, {500.20361328125,47.7324333190918,24.0011005401611}, {502.988800048828,49.7324333190918,24.0011005401611}, {500.20361328125,47.7324333190918,35.8134994506836}, {500.20361328125,47.7324333190918,36.0009002685547}, {502.988800048828,49.7324333190918,36.0009002685547}, {504.755187988281,62.8258323669434,27.0011005401611}, {499.205383300781,51.2324333190918,36.0009002685547}, {498.786193847656,51.1074333190918,36.0009002685547}, {502.358795166016,51.2324333190918,36.0009002685547}, {499.205383300781,51.2324333190918,24.0011005401611}, {502.358795166016,51.2324333190918,24.0011005401611}, {498.786193847656,51.1074333190918,24.0011005401611}, {502.568786621094,50.7324333190918,24.0011005401611}, {505.931213378906,51.3574333190918,24.0011005401611}, {509.503601074219,51.4824333190918,24.0011005401611}, {502.568786621094,50.7324333190918,36.0009002685547}, {505.931213378906,51.3574333190918,36.0009002685547}, {509.503601074219,51.4824333190918,36.0009002685547}, {499.048583984375,50.4824333190918,36.0009002685547}, {492.428588867188,48.9824333190918,36.0009002685547}, {499.048583984375,50.4824333190918,24.0011005401611}, {492.428588867188,48.9824333190918,24.0011005401611}, {506.088806152344,50.9824333190918,24.0011005401611}, {506.036010742188,51.1074333190918,24.0011005401611}, {506.088806152344,50.9824333190918,36.0009002685547}, {506.036010742188,51.1074333190918,36.0009002685547}, {498.891204833984,50.8574333190918,36.0009002685547}, {498.943786621094,50.7324333190918,36.0009002685547}, {498.891204833984,50.8574333190918,24.0011005401611}, {498.943786621094,50.7324333190918,24.0011005401611}, {499.573608398438,49.2324333190918,24.0011005401611}, {499.783813476562,48.7324333190918,24.0011005401611}, {499.573608398438,49.2324333190918,36.0009002685547}, {499.783813476562,48.7324333190918,36.0009002685547}, {506.403594970703,50.2324333190918,24.0011005401611}, {506.298797607422,50.4824333190918,24.0011005401611}, {506.403594970703,50.2324333190918,36.0009002685547}, {506.298797607422,50.4824333190918,36.0009002685547}, {501.228607177734,81.599235534668,27.0011005401611}, {502.928588867188,81.599235534668,24.0011005401611}, {499.2587890625,49.9824333190918,36.0009002685547}, {499.363800048828,49.7324333190918,36.0009002685547}, {499.2587890625,49.9824333190918,24.0011005401611}, {499.363800048828,49.7324333190918,24.0011005401611}, {496.695404052734,56.2124328613281,27.0011005401611}, {496.195404052734,54.7190322875977,24.0011005401611}, {509.851989746094,53.2258338928223,27.0011005401611}, {493.464782714844,51.1074333190918,36.0009002685547}, {493.464782714844,51.1074333190918,24.0011005401611}, {502.768798828125,51.7324333190918,24.0011005401611}, {500.215789794922,51.3574333190918,24.0011005401611}, {497.628601074219,51.2324333190918,24.0011005401611}, {502.768798828125,51.7324333190918,36.0009002685547}, {500.215789794922,51.3574333190918,36.0009002685547}, {497.628601074219,51.2324333190918,36.0009002685547}, {507.033813476562,48.7324333190918,24.0011005401611}, {506.823791503906,49.2324333190918,24.0011005401611}, {507.033813476562,48.7324333190918,36.0009002685547}, {506.823791503906,49.2324333190918,36.0009002685547}, {494.4501953125,51.1074333190918,24.0011005401611}, {494.4501953125,51.1074333190918,36.0009002685547}, {500.807006835938,51.3574333190918,36.0009002685547}, {503.591186523438,51.4824333190918,36.0009002685547}, {503.591186523438,51.4824333190918,24.0011005401611}, {500.807006835938,51.3574333190918,24.0011005401611}, {505.728607177734,65.7524337768555,36.0009002685547}, {505.728607177734,65.7524337768555,33.0009002685547}, {499.221801757812,72.2124328613281,36.0009002685547}, {501.835388183594,71.6058349609375,36.0009002685547}, {506.515197753906,72.2124328613281,24.0011005401611}, {503.781982421875,71.6058349609375,24.0011005401611}, {503.781982421875,71.6058349609375,27.0011005401611}, {499.888793945312,65.7524337768555,24.0011005401611}, {495.695404052734,53.2258338928223,33.0009002685547}, {516.648803710938,51.7324333190918,30.0011005401611}, {498.20361328125,77.8658294677734,28.5011005401611}, {505.585388183594,57.7058334350586,33.0009002685547}, {508.871795654297,56.2124328613281,33.0009002685547}, {499.992004394531,57.7058334350586,27.0011005401611}, {504.628601074219,81.599235534668,33.0009002685547}, {500.861999511719,62.8258323669434,33.0009002685547}, {496.878601074219,74.1324310302734,27.0011005401611}, {496.878601074219,74.1324310302734,33.0009002685547}, {491.57861328125,59.199031829834,27.0011005401611}, {490.253601074219,55.4658317565918,28.5011005401611}, {491.57861328125,59.199031829834,33.0009002685547}, {514.068786621094,59.199031829834,27.0011005401611}, {514.068786621094,59.199031829834,33.0009002685547}, {508.908813476562,74.1324310302734,27.0011005401611}, {507.618804931641,77.8658294677734,28.5011005401611}, {508.908813476562,74.1324310302734,33.0009002685547}, {491.271789550781,50.9824333190918,36.0009002685547}, {490.877807617188,50.9824333190918,36.0009002685547}, {491.271789550781,50.9824333190918,24.0011005401611}, {490.877807617188,50.9824333190918,24.0011005401611}, {495.213806152344,50.9824333190918,36.0009002685547}, {493.636993408203,50.9824333190918,36.0009002685547}, {495.213806152344,50.9824333190918,24.0011005401611}, {493.636993408203,50.9824333190918,24.0011005401611}, {503.985412597656,51.4824333190918,36.0009002685547}, {503.985412597656,51.4824333190918,24.0011005401611}, {511.675415039062,57.2792320251465,36.0009002685547}, {493.921813964844,57.2792320251465,24.0011005401611}, {502.768798828125,51.7324333190918,30.0011005401611}, {506.555206298828,51.7324333190918,30.0011005401611}, {498.981994628906,51.7324333190918,30.0011005401611}, {492.848815917969,50.9824333190918,24.0011005401611}, {492.848815917969,50.9824333190918,36.0009002685547}, {500.861999511719,68.6792297363281,36.0009002685547}, {500.861999511719,68.6792297363281,24.0011005401611}, {496.878601074219,74.1324310302734,24.0011005401611}, {496.878601074219,74.1324310302734,36.0009002685547}, {504.755187988281,68.6792297363281,24.0011005401611}, {504.755187988281,68.6792297363281,36.0009002685547}, {508.908813476562,74.1324310302734,36.0009002685547}, {508.908813476562,74.1324310302734,24.0011005401611}, {505.728607177734,65.7524337768555,30.0011005401611}, {504.755187988281,68.6792297363281,30.0011005401611}, {503.781982421875,71.6058349609375,30.0011005401611}, {500.861999511719,68.6792297363281,30.0011005401611}, {499.888793945312,65.7524337768555,30.0011005401611}, {501.835388183594,71.6058349609375,30.0011005401611}, {491.57861328125,59.199031829834,24.0011005401611}, {491.57861328125,59.199031829834,36.0009002685547}, {514.068786621094,59.199031829834,36.0009002685547}, {514.068786621094,59.199031829834,24.0011005401611}, {511.07861328125,47.7324333190918,34.8759002685547}, {511.07861328125,47.7324333190918,31.8759002685547}, {514.70361328125,47.7324333190918,33.9384994506836}, {511.07861328125,47.7324333190918,25.1261005401611}, {514.70361328125,47.7324333190918,26.0635013580322}, {511.07861328125,47.7324333190918,28.1261005401611}, {502.788818359375,57.7058334350586,30.0011005401611}, {502.048583984375,79.8324356079102,36.0009002685547}, {514.70361328125,47.7324333190918,30.9385013580322}, {511.07861328125,47.7324333190918,30.3759002685547}, {514.70361328125,47.7324333190918,29.0635013580322}, {511.07861328125,47.7324333190918,29.6261005401611}, {496.57861328125,47.7324333190918,31.1259002685547}, {496.57861328125,47.7324333190918,32.6259002685547}, {496.57861328125,47.7324333190918,34.1259002685547}, {496.57861328125,47.7324333190918,28.8761005401611}, {496.57861328125,47.7324333190918,27.3761005401611}, {496.57861328125,47.7324333190918,25.8761005401611}, {496.57861328125,47.7324333190918,29.6261005401611}, {514.70361328125,47.7324333190918,35.4384994506836}, {511.07861328125,47.7324333190918,35.6259002685547}, {514.70361328125,47.7324333190918,24.5635013580322}, {511.07861328125,47.7324333190918,24.3761005401611}, {496.57861328125,47.7324333190918,34.8759002685547}, {496.57861328125,47.7324333190918,25.1261005401611}, {496.57861328125,47.7324333190918,35.6259002685547}, {496.57861328125,47.7324333190918,24.3761005401611}, {511.07861328125,47.7324333190918,36.0009002685547}, {511.07861328125,47.7324333190918,24.0011005401611}, {514.70361328125,47.7324333190918,30.1885013580322}, {514.70361328125,47.7324333190918,35.8134994506836}, {514.70361328125,47.7324333190918,29.8135013580322}, {514.70361328125,47.7324333190918,24.1885013580322}, {496.57861328125,47.7324333190918,36.0009002685547}, {496.57861328125,47.7324333190918,24.0011005401611}, {510.238800048828,49.7324333190918,24.0011005401611}, {510.238800048828,49.7324333190918,36.0009002685547}, {514.70361328125,47.7324333190918,24.0011005401611}, {514.70361328125,47.7324333190918,36.0009002685547}, {496.158813476562,48.7324333190918,36.0009002685547}, {496.158813476562,48.7324333190918,24.0011005401611}, {502.808807373047,62.8258323669434,30.0011005401611}, {509.608795166016,51.2324333190918,24.0011005401611}, {509.608795166016,51.2324333190918,36.0009002685547}, {491.641204833984,50.8574333190918,24.0011005401611}, {495.423797607422,50.4824333190918,36.0009002685547}, {495.423797607422,50.4824333190918,24.0011005401611}, {491.641204833984,50.8574333190918,36.0009002685547}, {495.528594970703,50.2324333190918,24.0011005401611}, {492.0087890625,49.9824333190918,24.0011005401611}, {509.818786621094,50.7324333190918,24.0011005401611}, {495.948608398438,49.2324333190918,36.0009002685547}, {495.528594970703,50.2324333190918,36.0009002685547}, {495.948608398438,49.2324333190918,24.0011005401611}, {509.818786621094,50.7324333190918,36.0009002685547}, {492.0087890625,49.9824333190918,36.0009002685547}, {491.956207275391,50.1074333190918,24.0011005401611}, {491.956207275391,50.1074333190918,36.0009002685547}, {502.928588867188,81.599235534668,30.0011005401611}, {491.851013183594,50.3574333190918,36.0009002685547}, {491.851013183594,50.3574333190918,24.0011005401611}, {496.195404052734,54.7190322875977,30.0011005401611}, {509.361999511719,54.7190322875977,30.0011005401611}, {488.632598876953,51.7256317138672,30.0011005401611}, {488.632598876953,51.7256317138672,29.5091018676758}, {488.632598876953,51.7188339233398,24.0011005401611}, {488.632598876953,51.7256317138672,27.4929008483887}, {488.632598876953,51.7324333190918,30.0011005401611}, {488.632598876953,51.7324333190918,29.0175018310547}, {488.632598876953,51.7324333190918,24.9847011566162}, {488.632598876953,51.7324333190918,24.0011005401611}, {488.632598876953,51.7188339233398,30.0011005401611}, {488.632598876953,51.7176322937012,24.0011005401611}, {488.632598876953,51.7182312011719,30.0011005401611}, {488.632598876953,51.7176322937012,30.0011005401611}, {488.632598876953,51.715030670166,24.0011005401611}, {488.632598876953,51.7162322998047,30.0011005401611}, {488.632598876953,50.761833190918,24.0011005401611}, {488.632598876953,50.7578315734863,24.0011005401611}, {488.632598876953,50.7598342895508,30.0011005401611}, {488.632598876953,50.7522315979004,24.0011005401611}, {488.632598876953,49.7838325500488,24.0011005401611}, {488.632598876953,50.2680320739746,30.0011005401611}, {488.632598876953,51.7046318054199,24.0011005401611}, {488.632598876953,51.709831237793,30.0011005401611}, {488.632598876953,50.9120330810547,24.0011005401611}, {488.632598876953,50.8882331848145,24.0011005401611}, {488.632598876953,50.9002304077148,30.0011005401611}, {488.632598876953,47.7324333190918,24.0370998382568}, {488.632598876953,48.5612335205078,30.0011005401611}, {488.632598876953,47.7324333190918,24.0011005401611}, {488.632598876953,47.7324333190918,24.1091003417969}, {488.632598876953,48.5612335205078,30.0189018249512}, {488.632598876953,47.7324333190918,25.3211002349854}, {488.632598876953,48.5612335205078,30.0551013946533}, {488.632598876953,47.7324333190918,25.4651012420654}, {488.632598876953,48.5612335205078,30.6609001159668}, {488.632598876953,47.7324333190918,25.5371017456055}, {488.632598876953,48.5612335205078,30.7329006195068}, {488.632598876953,47.7324333190918,25.6091003417969}, {488.632598876953,48.5612335205078,30.7689018249512}, {488.632598876953,47.7324333190918,25.8971004486084}, {488.632598876953,48.5612335205078,30.8051013946533}, {488.632598876953,47.7324333190918,28.321102142334}, {488.632598876953,48.5612335205078,30.9491004943848}, {488.632598876953,47.7324333190918,28.4651012420654}, {488.632598876953,48.5612335205078,32.1609001159668}, {488.632598876953,47.7324333190918,28.5371017456055}, {488.632598876953,48.5612335205078,32.2329025268555}, {488.632598876953,47.7324333190918,28.6811008453369}, {488.632598876953,48.5612335205078,32.2689018249512}, {488.632598876953,47.7324333190918,31.1049003601074}, {488.632598876953,48.5612335205078,32.3411026000977}, {488.632598876953,47.7324333190918,31.3929004669189}, {488.632598876953,49.3900299072266,36.0009002685547}, {488.632598876953,47.7324333190918,31.536901473999}, {488.632598876953,47.7324333190918,31.6809005737305}, {488.632598876953,47.7324333190918,34.1049003601074}, {488.632598876953,47.7324333190918,34.3929023742676}, {488.632598876953,47.7324333190918,34.464900970459}, {488.632598876953,47.7324333190918,34.5369033813477}, {488.632598876953,47.7324333190918,34.6809005737305}, {488.632598876953,47.7324333190918,35.8929023742676}, {488.632598876953,47.7324333190918,35.964900970459}, {488.632598876953,47.7324333190918,36.0009002685547}, {488.632598876953,50.8816299438477,24.0011005401611}, {488.632598876953,50.8850326538086,30.0011005401611}, {488.632598876953,49.7480316162109,24.0011005401611}, {488.632598876953,49.7426300048828,24.0011005401611}, {488.632598876953,49.745231628418,30.0011005401611}, {488.632598876953,49.7592315673828,24.0011005401611}, {488.632598876953,49.7536315917969,30.0011005401611}, {488.632598876953,49.3900299072266,24.0011005401611}, {488.632598876953,49.5664329528809,30.0011005401611}, {488.632598876953,50.8786315917969,24.0011005401611}, {488.632598876953,50.7764320373535,24.0011005401611}, {488.632598876953,50.8274307250977,30.0011005401611}, {488.632598876953,50.7550315856934,30.0011005401611}, {488.632598876953,50.7692337036133,30.0011005401611}, {488.632598876953,50.9284324645996,24.0011005401611}, {488.632598876953,50.9202308654785,30.0011005401611}, {488.632598876953,51.1788330078125,24.0011005401611}, {488.632598876953,51.139232635498,24.0011005401611}, {488.632598876953,51.1590309143066,30.0011005401611}, {488.632598876953,51.2324333190918,24.0011005401611}, {488.632598876953,51.2056312561035,30.0011005401611}, {488.632598876953,51.4340324401855,24.0011005401611}, {488.632598876953,51.3946304321289,24.0011005401611}, {488.632598876953,51.4142303466797,30.0011005401611}, {488.632598876953,51.4498329162598,24.0011005401611}, {488.632598876953,51.5772323608398,30.0011005401611}, {488.632598876953,51.4418334960938,30.0011005401611}, {488.632598876953,51.3136329650879,30.0011005401611}, {488.632598876953,49.7714309692383,30.0011005401611}, {488.632598876953,51.0338325500488,30.0011005401611}, {488.632598876953,50.8816299438477,30.0011005401611}, {488.632598876953,50.8800315856934,30.0011005401611}, {488.632598876953,51.7188339233398,36.0009002685547}, {488.632598876953,51.7176322937012,36.0009002685547}, {488.632598876953,49.3900299072266,30.0011005401611}, {488.632598876953,50.7522315979004,30.0011005401611}, {488.632598876953,50.7522315979004,36.0009002685547}, {488.632598876953,49.7426300048828,30.0011005401611}, {488.632598876953,49.7426300048828,36.0009002685547}, {488.632598876953,49.7480316162109,30.0011005401611}, {488.632598876953,49.7480316162109,36.0009002685547}, {488.632598876953,51.715030670166,30.0011005401611}, {488.632598876953,51.715030670166,36.0009002685547}, {488.632598876953,50.7578315734863,30.0011005401611}, {488.632598876953,50.7578315734863,36.0009002685547}, {488.632598876953,50.761833190918,30.0011005401611}, {488.632598876953,50.761833190918,36.0009002685547}, {488.632598876953,50.8882331848145,30.0011005401611}, {488.632598876953,50.8882331848145,36.0009002685547}, {488.632598876953,49.7592315673828,30.0011005401611}, {488.632598876953,49.7592315673828,36.0009002685547}, {488.632598876953,51.1788330078125,30.0011005401611}, {488.632598876953,51.1788330078125,36.0009002685547}, {488.632598876953,50.9120330810547,30.0011005401611}, {488.632598876953,50.9120330810547,36.0009002685547}, {488.632598876953,51.4498329162598,30.0011005401611}, {488.632598876953,51.4498329162598,36.0009002685547}, {488.632598876953,51.7046318054199,30.0011005401611}, {488.632598876953,51.7046318054199,36.0009002685547}, {488.632598876953,51.2324333190918,30.0011005401611}, {488.632598876953,51.2324333190918,36.0009002685547}, {488.632598876953,51.3946304321289,30.0011005401611}, {488.632598876953,51.3946304321289,36.0009002685547}, {488.632598876953,51.4340324401855,30.0011005401611}, {488.632598876953,51.4340324401855,36.0009002685547}, {488.632598876953,49.7838325500488,30.0011005401611}, {488.632598876953,49.7838325500488,36.0009002685547}, {488.632598876953,50.7764320373535,30.0011005401611}, {488.632598876953,50.7764320373535,36.0009002685547}, {488.632598876953,51.139232635498,30.0011005401611}, {488.632598876953,51.139232635498,36.0009002685547}, {488.632598876953,50.9284324645996,30.0011005401611}, {488.632598876953,50.9284324645996,36.0009002685547}, {488.632598876953,50.8816299438477,36.0009002685547}, {488.632598876953,50.8786315917969,30.0011005401611}, {488.632598876953,50.8786315917969,36.0009002685547}, {488.632598876953,51.7324333190918,35.0173034667969}, {488.632598876953,51.7324333190918,36.0009002685547}, {488.632598876953,51.7324333190918,30.9847011566162}, {517.188415527344,51.7140884399414,24.0011005401611}, {517.188415527344,51.7140884399414,36.0009002685547}, {517.188415527344,50.4475173950195,24.0011005401611}, {517.188415527344,51.7324333190918,35.3734130859375}, {517.188415527344,51.7324333190918,36.0009002685547}, {517.188415527344,51.7324333190918,34.1185760498047}, {517.188415527344,51.7324333190918,31.88330078125}, {517.188415527344,51.7324333190918,30.0011005401611}, {517.188415527344,51.7324333190918,28.1187744140625}, {517.188415527344,51.7324333190918,25.8834266662598}, {517.188415527344,51.7324333190918,24.6285915374756}, {517.188415527344,51.7324333190918,24.0011005401611}, {517.188415527344,47.7324333190918,24.0600452423096}, {517.188415527344,47.7324333190918,24.0011005401611}, {517.188415527344,50.4475173950195,36.0009002685547}, {517.188415527344,47.7324333190918,24.1779975891113}, {517.188415527344,47.7324333190918,24.6498031616211}, {517.188415527344,47.7324333190918,28.7625770568848}, {517.188415527344,47.7324333190918,29.7061901092529}, {517.188415527344,47.7324333190918,29.9420928955078}, {517.188415527344,47.7324333190918,30.0600452423096}, {517.188415527344,47.7324333190918,30.2959480285645}, {517.188415527344,47.7324333190918,31.2395629882812}, {517.188415527344,47.7324333190918,35.3521995544434}, {517.188415527344,47.7324333190918,35.8240051269531}, {517.188415527344,47.7324333190918,35.9419555664062}, {517.188415527344,47.7324333190918,36.0009002685547} },
+ { {0,1,2}, {3,4,5}, {6,7,8}, {9,10,11}, {12,2,1}, {12,1,13}, {14,15,16}, {17,18,19}, {20,21,22}, {17,19,23}, {24,25,26}, {27,13,1}, {28,25,29}, {30,31,32}, {28,33,34}, {35,36,7}, {37,38,39}, {40,10,41}, {42,43,44}, {45,5,4}, {46,47,48}, {46,48,49}, {45,4,50}, {51,52,53}, {51,54,55}, {56,52,57}, {58,59,60}, {61,50,4}, {62,63,64}, {65,34,33}, {66,67,42}, {68,17,69}, {70,71,22}, {66,42,72}, {73,16,15}, {35,7,74}, {75,76,54}, {77,27,1}, {78,32,31}, {75,54,79}, {80,26,25}, {81,80,25}, {82,83,48}, {84,20,85}, {81,25,86}, {87,88,19}, {0,89,1}, {90,91,92}, {90,10,93}, {38,94,39}, {94,95,39}, {3,7,96}, {97,15,98}, {97,99,15}, {92,91,100}, {89,101,1}, {102,39,95}, {103,11,10}, {104,96,7}, {105,15,99}, {106,61,4}, {107,108,33}, {76,55,54}, {109,91,110}, {111,23,19}, {112,63,113}, {114,115,48}, {116,59,117}, {118,20,119}, {120,31,121}, {122,44,43}, {110,91,123}, {124,125,126}, {127,128,129}, {127,130,124}, {131,124,132}, {126,133,134}, {135,136,126}, {137,138,127}, {139,127,138}, {128,140,141}, {142,128,143}, {144,140,145}, {100,91,146}, {147,148,134}, {101,149,1}, {102,150,39}, {103,10,151}, {145,140,152}, {152,140,153}, {148,154,134}, {154,155,134}, {156,15,105}, {157,104,7}, {36,8,7}, {158,37,39}, {159,19,88}, {160,19,159}, {161,59,58}, {161,117,59}, {162,31,30}, {162,121,31}, {163,43,164}, {163,165,43}, {166,167,43}, {167,164,43}, {168,57,52}, {82,48,169}, {114,170,171}, {108,65,33}, {64,63,112}, {114,172,170}, {160,173,170}, {171,170,173}, {172,174,170}, {160,170,174}, {175,176,177}, {178,77,1}, {179,31,120}, {175,180,176}, {181,182,176}, {177,176,182}, {180,183,176}, {181,176,183}, {184,42,67}, {185,69,17}, {160,111,19}, {186,187,160}, {188,189,114}, {190,188,114}, {114,48,191}, {192,114,193}, {194,160,195}, {196,160,194}, {197,198,181}, {199,197,181}, {122,43,165}, {200,201,175}, {202,175,203}, {204,175,202}, {205,119,20}, {206,181,207}, {208,209,15}, {210,15,209}, {211,10,9}, {212,10,211}, {213,214,215}, {216,217,218}, {219,14,17}, {113,63,220}, {221,222,48}, {191,48,222}, {22,223,20}, {205,20,223}, {224,40,42}, {123,91,225}, {214,226,215}, {227,215,226}, {218,217,228}, {229,228,217}, {215,230,213}, {125,135,126}, {217,216,231}, {129,128,142}, {216,213,232}, {130,132,124}, {213,216,233}, {234,213,235}, {236,227,237}, {238,237,227}, {239,240,216}, {233,216,240}, {241,242,229}, {243,229,242}, {215,227,244}, {245,215,246}, {217,247,229}, {248,249,217}, {232,213,250}, {230,250,213}, {133,147,134}, {244,227,251}, {236,252,227}, {251,227,252}, {231,216,253}, {254,253,216}, {141,140,144}, {247,255,229}, {241,229,256}, {255,256,229}, {257,241,258}, {259,146,91}, {260,261,236}, {262,1,149}, {263,264,241}, {265,241,264}, {266,236,267}, {268,267,236}, {49,48,83}, {166,43,269}, {270,271,272}, {273,274,275}, {276,274,277}, {278,151,10}, {279,280,272}, {281,39,150}, {272,282,279}, {155,283,134}, {274,276,284}, {153,140,285}, {286,276,287}, {265,276,286}, {288,289,279}, {268,288,279}, {290,291,272}, {271,290,272}, {292,274,293}, {275,274,292}, {294,265,295}, {276,265,294}, {296,297,268}, {279,296,268}, {241,265,298}, {298,265,299}, {236,300,268}, {300,301,268}, {107,33,78}, {302,303,59}, {304,305,279}, {282,304,279}, {306,276,307}, {284,276,306}, {185,17,73}, {308,309,221}, {158,39,70}, {310,41,10}, {15,311,208}, {7,6,312}, {313,314,6}, {315,6,314}, {316,208,317}, {318,317,208}, {258,241,319}, {319,241,320}, {261,321,236}, {321,322,236}, {6,315,323}, {208,324,318}, {270,325,318}, {326,318,325}, {327,328,315}, {273,315,328}, {118,329,20}, {330,20,329}, {331,332,25}, {86,25,332}, {333,334,52}, {335,52,334}, {115,336,48}, {169,48,336}, {62,106,4}, {35,15,210}, {35,337,15}, {158,10,212}, {158,310,10}, {338,178,1}, {339,59,116}, {107,302,59}, {66,22,340}, {66,341,22}, {185,221,342}, {185,308,221}, {75,31,179}, {75,343,31}, {166,20,330}, {166,85,20}, {81,52,335}, {81,168,52}, {82,19,344}, {82,87,19}, {108,339,345}, {346,108,345}, {64,347,348}, {349,347,64}, {178,109,350}, {351,178,350}, {179,352,353}, {354,352,179}, {355,208,356}, {356,208,311}, {357,358,6}, {358,312,6}, {68,22,21}, {68,340,22}, {221,48,47}, {184,342,221}, {359,270,360}, {318,360,270}, {361,362,273}, {315,273,362}, {272,102,270}, {363,270,102}, {274,273,103}, {364,103,273}, {21,19,18}, {21,20,84}, {184,46,42}, {43,42,46}, {12,22,71}, {365,22,12}, {14,98,15}, {14,220,63}, {40,93,10}, {40,225,91}, {45,221,309}, {366,221,45}, {313,367,212}, {212,367,368}, {36,369,367}, {313,36,367}, {316,37,367}, {37,368,367}, {210,367,369}, {316,367,210}, {362,370,315}, {370,323,315}, {360,318,371}, {371,318,324}, {372,331,159}, {159,195,160}, {373,115,56}, {115,114,189}, {52,56,161}, {374,161,56}, {25,28,331}, {375,331,28}, {376,333,163}, {163,203,175}, {377,118,24}, {118,181,198}, {25,24,162}, {378,162,24}, {52,51,333}, {379,333,51}, {167,380,381}, {376,167,381}, {377,381,330}, {330,381,380}, {335,381,382}, {376,381,335}, {373,383,169}, {169,383,384}, {168,385,383}, {373,168,383}, {372,87,383}, {87,384,383}, {377,80,381}, {80,382,381}, {86,383,385}, {372,383,86}, {106,348,347}, {386,106,347}, {375,65,346}, {108,346,65}, {64,112,349}, {387,349,112}, {171,190,114}, {346,345,171}, {374,190,345}, {171,345,190}, {349,172,347}, {172,114,192}, {386,347,192}, {172,192,347}, {173,160,196}, {171,173,346}, {375,346,196}, {173,196,346}, {172,349,174}, {174,186,160}, {387,186,349}, {174,349,186}, {64,348,62}, {106,62,348}, {108,107,339}, {59,339,107}, {374,345,116}, {339,116,345}, {76,353,352}, {379,76,352}, {388,77,351}, {178,351,77}, {179,120,354}, {378,354,120}, {177,200,175}, {351,350,177}, {389,200,350}, {177,350,200}, {354,180,352}, {180,175,204}, {379,352,204}, {180,204,352}, {182,181,206}, {177,182,351}, {388,351,206}, {182,206,351}, {180,354,183}, {183,199,181}, {378,199,354}, {183,354,199}, {91,109,338}, {178,338,109}, {76,75,353}, {179,353,75}, {389,350,110}, {109,110,350}, {390,391,392}, {393,394,395}, {224,122,389}, {122,175,201}, {365,388,205}, {205,207,181}, {66,340,396}, {68,396,340}, {184,396,342}, {185,342,396}, {66,396,67}, {184,67,396}, {68,69,396}, {185,396,69}, {219,111,387}, {111,160,187}, {366,386,191}, {191,193,114}, {150,272,280}, {102,272,150}, {151,277,274}, {103,151,274}, {161,374,117}, {116,117,374}, {366,61,386}, {106,386,61}, {111,187,387}, {186,387,187}, {56,188,374}, {190,374,188}, {191,386,193}, {192,193,386}, {331,375,194}, {196,194,375}, {28,34,375}, {65,375,34}, {219,387,113}, {112,113,387}, {224,389,123}, {110,123,389}, {51,55,379}, {76,379,55}, {24,197,378}, {199,378,197}, {122,201,389}, {200,389,201}, {333,379,202}, {204,202,379}, {205,388,207}, {206,207,388}, {365,27,388}, {77,388,27}, {162,378,121}, {120,121,378}, {162,30,25}, {30,29,25}, {51,53,54}, {303,60,59}, {28,29,33}, {29,397,33}, {161,58,52}, {53,52,58}, {21,84,19}, {84,344,19}, {46,49,43}, {49,269,43}, {208,316,209}, {210,209,316}, {327,313,211}, {212,211,313}, {36,35,369}, {210,369,35}, {37,158,368}, {212,368,158}, {6,8,313}, {36,313,8}, {326,38,316}, {37,316,38}, {392,391,398}, {399,398,391}, {394,400,395}, {401,395,400}, {390,214,391}, {214,213,234}, {393,395,218}, {218,239,216}, {402,230,403}, {230,215,245}, {125,124,131}, {404,125,403}, {405,406,231}, {231,248,217}, {129,137,127}, {407,406,129}, {130,127,139}, {402,130,408}, {194,195,331}, {159,331,195}, {115,189,56}, {188,56,189}, {14,219,220}, {113,220,219}, {45,50,366}, {61,366,50}, {221,366,222}, {191,222,366}, {17,23,219}, {111,219,23}, {118,198,24}, {197,24,198}, {202,203,333}, {163,333,203}, {40,224,225}, {123,225,224}, {12,13,365}, {27,365,13}, {22,365,223}, {205,223,365}, {42,44,224}, {122,224,44}, {399,391,234}, {214,234,391}, {401,239,395}, {218,395,239}, {214,390,226}, {226,238,227}, {218,228,393}, {228,229,243}, {401,399,233}, {233,235,213}, {392,409,390}, {410,390,409}, {394,393,411}, {412,411,393}, {402,403,131}, {125,131,403}, {405,137,406}, {129,406,137}, {405,408,139}, {130,139,408}, {230,245,403}, {404,403,245}, {231,406,248}, {407,248,406}, {232,254,216}, {402,408,232}, {413,404,244}, {244,246,215}, {414,247,407}, {247,217,249}, {133,126,136}, {415,133,413}, {141,143,128}, {416,414,141}, {410,238,390}, {226,390,238}, {412,393,243}, {228,243,393}, {233,399,235}, {234,235,399}, {237,260,236}, {238,410,237}, {417,260,410}, {237,410,260}, {239,401,240}, {233,240,401}, {242,241,257}, {243,242,412}, {418,412,257}, {242,257,412}, {401,419,399}, {398,399,419}, {417,410,420}, {409,420,410}, {400,421,401}, {419,401,421}, {418,422,412}, {411,412,422}, {413,135,404}, {125,404,135}, {414,407,142}, {129,142,407}, {130,402,132}, {131,132,402}, {133,136,413}, {135,413,136}, {423,147,415}, {133,415,147}, {137,405,138}, {139,138,405}, {141,414,143}, {142,143,414}, {424,416,144}, {141,144,416}, {405,254,408}, {232,408,254}, {244,404,246}, {245,246,404}, {247,249,407}, {248,407,249}, {232,250,402}, {230,402,250}, {415,413,251}, {244,251,413}, {252,236,266}, {251,252,415}, {423,415,266}, {252,266,415}, {231,253,405}, {254,405,253}, {416,255,414}, {247,414,255}, {256,263,241}, {255,416,256}, {424,263,416}, {256,416,263}, {257,258,418}, {425,418,258}, {260,417,261}, {426,261,417}, {422,418,427}, {427,259,91}, {420,428,417}, {428,1,262}, {147,423,148}, {429,148,423}, {263,424,264}, {264,295,265}, {266,267,423}, {267,268,297}, {144,145,424}, {430,424,145}, {49,431,269}, {166,269,431}, {82,431,83}, {49,83,431}, {84,85,431}, {166,431,85}, {82,344,431}, {84,431,344}, {432,278,90}, {10,90,278}, {433,0,281}, {39,281,0}, {362,361,434}, {435,271,359}, {270,359,271}, {436,361,275}, {273,275,361}, {360,437,359}, {277,287,276}, {151,278,277}, {280,279,289}, {150,280,281}, {436,438,439}, {439,285,140}, {90,92,432}, {440,432,92}, {282,272,291}, {441,282,442}, {284,293,274}, {443,438,284}, {278,432,286}, {286,299,265}, {281,288,433}, {288,268,301}, {0,433,89}, {444,89,433}, {435,445,442}, {445,134,283}, {439,446,436}, {361,436,446}, {442,290,435}, {271,435,290}, {438,436,292}, {275,292,436}, {445,435,447}, {359,447,435}, {286,287,278}, {277,278,287}, {288,281,289}, {280,289,281}, {145,152,430}, {443,430,152}, {148,429,154}, {441,154,429}, {424,430,294}, {294,307,276}, {423,296,429}, {296,279,305}, {425,440,100}, {92,100,440}, {290,442,291}, {282,291,442}, {292,293,438}, {284,438,293}, {298,320,241}, {432,440,298}, {300,236,322}, {433,300,444}, {426,101,444}, {89,444,101}, {107,448,302}, {302,79,54}, {78,31,343}, {107,78,448}, {75,79,448}, {302,448,79}, {78,343,448}, {75,448,343}, {427,418,259}, {425,259,418}, {428,262,417}, {426,417,262}, {437,449,359}, {447,359,449}, {434,361,450}, {446,450,361}, {32,33,397}, {78,33,32}, {53,303,54}, {302,54,303}, {152,153,443}, {438,443,153}, {429,304,441}, {282,441,304}, {430,443,306}, {284,306,443}, {154,441,155}, {442,155,441}, {298,299,432}, {286,432,299}, {300,433,301}, {288,301,433}, {185,451,308}, {308,74,7}, {73,15,337}, {185,73,451}, {35,74,451}, {308,451,74}, {73,337,451}, {35,451,337}, {158,452,310}, {310,72,42}, {70,22,341}, {158,70,452}, {66,72,452}, {310,452,72}, {70,341,452}, {66,452,341}, {313,327,314}, {315,314,327}, {316,317,326}, {318,326,317}, {15,156,311}, {356,311,156}, {7,312,157}, {358,157,312}, {211,9,327}, {364,327,9}, {38,326,94}, {363,94,326}, {294,295,424}, {264,424,295}, {296,423,297}, {267,297,423}, {262,149,426}, {101,426,149}, {258,319,425}, {440,425,319}, {261,426,321}, {444,321,426}, {259,425,146}, {100,146,425}, {306,307,430}, {294,430,307}, {304,429,305}, {296,305,429}, {319,320,440}, {298,440,320}, {321,444,322}, {300,322,444}, {445,283,442}, {155,442,283}, {439,438,285}, {153,285,438}, {17,68,18}, {21,18,68}, {46,184,47}, {221,47,184}, {102,95,363}, {94,363,95}, {9,11,364}, {103,364,11}, {6,323,357}, {370,357,323}, {371,324,355}, {208,355,324}, {270,363,325}, {326,325,363}, {327,364,328}, {273,328,364}, {0,2,39}, {12,39,2}, {90,93,91}, {40,91,93}, {14,16,17}, {73,17,16}, {45,309,7}, {308,7,309}, {12,71,39}, {70,39,71}, {40,41,42}, {310,42,41}, {97,98,63}, {14,63,98}, {3,5,7}, {45,7,5}, {118,377,329}, {330,329,377}, {331,372,332}, {86,332,372}, {333,376,334}, {335,334,376}, {115,373,336}, {169,336,373}, {167,166,380}, {330,380,166}, {80,81,382}, {335,382,81}, {86,385,81}, {168,81,385}, {169,384,82}, {87,82,384}, {159,88,372}, {87,372,88}, {163,164,376}, {167,376,164}, {24,26,377}, {80,377,26}, {56,57,373}, {168,373,57}, {32,397,30}, {29,30,397}, {58,60,53}, {303,53,60}, {205,181,119}, {118,119,181}, {163,175,165}, {122,165,175}, {453,454,455}, {454,456,455}, {457,455,456}, {458,455,457}, {459,455,458}, {460,455,459}, {461,462,463}, {464,465,466}, {467,468,469}, {470,471,472}, {465,473,474}, {475,476,477}, {478,479,480}, {481,482,478}, {483,484,481}, {485,486,483}, {487,488,485}, {489,490,487}, {491,492,489}, {493,494,491}, {495,496,493}, {497,498,495}, {499,500,497}, {501,502,499}, {503,504,501}, {505,504,503}, {506,504,505}, {507,504,506}, {508,504,507}, {509,504,508}, {510,504,509}, {511,504,510}, {512,504,511}, {513,504,512}, {514,504,513}, {476,515,516}, {517,518,519}, {520,517,521}, {518,522,523}, {522,480,479}, {524,525,526}, {468,470,527}, {525,467,528}, {529,475,530}, {531,532,533}, {534,531,535}, {536,537,538}, {473,539,540}, {539,536,541}, {537,534,542}, {471,520,543}, {532,529,544}, {545,524,546}, {453,461,547}, {463,464,548}, {523,549,504}, {527,550,551}, {519,552,553}, {521,554,555}, {466,556,557}, {469,558,559}, {528,560,561}, {477,562,563}, {543,564,565}, {535,566,567}, {530,568,569}, {540,570,571}, {474,572,573}, {542,574,575}, {538,576,577}, {541,578,579}, {472,580,581}, {526,582,583}, {533,584,585}, {544,586,587}, {516,545,588}, {588,589,590}, {455,460,4}, {591,592,63}, {462,455,4}, {592,547,63}, {547,548,63}, {465,462,4}, {548,557,63}, {127,124,501}, {127,501,499}, {505,503,124}, {124,126,507}, {124,507,506}, {509,508,126}, {126,134,512}, {126,512,511}, {510,509,126}, {128,127,493}, {128,493,491}, {497,495,127}, {489,487,128}, {140,128,483}, {140,483,481}, {487,485,128}, {478,480,140}, {480,522,140}, {514,513,134}, {504,514,134}, {551,581,437}, {471,470,434}, {445,447,555}, {445,555,553}, {134,445,553}, {134,553,504}, {446,439,518}, {446,518,517}, {439,140,522}, {439,522,518}, {515,476,358}, {563,588,356}, {557,573,63}, {473,465,4}, {437,360,559}, {437,559,551}, {360,371,561}, {360,561,559}, {362,434,470}, {362,470,468}, {370,362,468}, {370,468,467}, {499,497,127}, {506,505,124}, {495,493,127}, {513,512,134}, {481,478,140}, {447,449,565}, {447,565,555}, {450,446,517}, {450,517,520}, {356,156,569}, {356,569,563}, {157,358,476}, {157,476,475}, {357,370,467}, {357,467,525}, {371,355,583}, {371,583,561}, {460,459,4}, {63,62,593}, {63,593,591}, {62,4,459}, {62,459,458}, {532,531,104}, {531,534,104}, {567,585,105}, {575,567,105}, {4,3,539}, {4,539,473}, {536,539,3}, {97,63,573}, {97,573,571}, {571,579,97}, {99,97,579}, {99,579,577}, {105,99,577}, {105,577,575}, {96,104,534}, {96,534,537}, {3,96,537}, {3,537,536}, {503,501,124}, {508,507,126}, {491,489,128}, {511,510,126}, {485,483,128}, {434,450,520}, {434,520,471}, {449,437,581}, {449,581,565}, {156,105,585}, {156,585,587}, {587,569,156}, {104,157,529}, {104,529,532}, {475,529,157}, {590,583,355}, {355,356,588}, {355,588,590}, {358,357,524}, {358,524,515}, {525,524,357}, {458,457,62}, {457,593,62}, {479,478,482}, {479,504,549}, {479,482,504}, {482,481,484}, {472,551,550}, {581,551,472}, {482,484,504}, {484,483,486}, {523,553,552}, {504,553,523}, {540,573,572}, {571,573,540}, {544,585,584}, {587,585,544}, {542,577,576}, {575,577,542}, {526,590,589}, {583,590,526}, {535,575,574}, {567,575,535}, {533,567,566}, {585,567,533}, {538,579,578}, {577,579,538}, {543,581,580}, {565,581,543}, {477,569,568}, {563,569,477}, {530,587,586}, {569,587,530}, {541,571,570}, {579,571,541}, {528,583,582}, {561,583,528}, {591,453,592}, {547,592,453}, {521,565,564}, {555,565,521}, {474,557,556}, {573,557,474}, {516,563,562}, {588,563,516}, {519,555,554}, {553,555,519}, {527,559,558}, {551,559,527}, {469,561,560}, {559,561,469}, {462,461,455}, {453,455,461}, {461,463,547}, {548,547,463}, {465,464,462}, {463,462,464}, {464,466,548}, {557,548,466}, {469,560,467}, {528,467,560}, {472,550,470}, {527,470,550}, {474,556,465}, {466,465,556}, {477,568,475}, {530,475,568}, {516,562,476}, {477,476,562}, {519,554,517}, {521,517,554}, {521,564,520}, {543,520,564}, {523,552,518}, {519,518,552}, {479,549,522}, {523,522,549}, {526,589,524}, {589,546,524}, {527,558,468}, {469,468,558}, {528,582,525}, {526,525,582}, {530,586,529}, {544,529,586}, {533,566,531}, {535,531,566}, {535,574,534}, {542,534,574}, {538,578,536}, {541,536,578}, {540,572,473}, {474,473,572}, {541,570,539}, {540,539,570}, {542,576,537}, {538,537,576}, {543,580,471}, {472,471,580}, {544,584,532}, {533,532,584}, {524,545,515}, {516,515,545}, {545,546,588}, {589,588,546}, {453,591,454}, {593,454,591}, {484,486,504}, {486,485,488}, {486,488,504}, {488,487,490}, {488,490,504}, {490,489,492}, {490,492,504}, {492,491,494}, {492,494,504}, {494,493,496}, {494,496,504}, {496,495,498}, {496,498,504}, {498,497,500}, {498,500,504}, {500,499,502}, {500,502,504}, {501,504,502}, {454,593,456}, {457,456,593}, {594,595,596}, {597,598,594}, {599,597,594}, {600,599,594}, {601,600,594}, {602,601,594}, {603,602,594}, {604,603,594}, {605,604,594}, {606,607,608}, {609,606,608}, {610,609,608}, {611,610,608}, {612,611,608}, {613,612,608}, {614,613,608}, {615,614,608}, {616,615,608}, {617,616,608}, {618,617,608}, {619,618,608}, {620,619,608}, {596,608,607}, {595,594,598}, {608,596,595}, {605,594,91}, {91,338,602}, {91,602,603}, {598,597,1}, {594,596,91}, {608,595,1}, {595,598,1}, {616,617,392}, {610,611,394}, {419,421,613}, {419,613,614}, {422,427,607}, {422,607,606}, {427,91,596}, {427,596,607}, {428,420,619}, {428,619,620}, {1,428,620}, {1,620,608}, {420,409,618}, {420,618,619}, {411,422,606}, {411,606,609}, {398,419,614}, {398,614,615}, {421,400,612}, {421,612,613}, {409,392,617}, {409,617,618}, {394,411,609}, {394,609,610}, {604,605,91}, {338,1,599}, {338,599,600}, {392,398,615}, {392,615,616}, {400,394,611}, {400,611,612}, {603,604,91}, {601,602,338}, {597,599,1}, {600,601,338} });
break;
case TestMesh::gt2_teeth:
mesh = TriangleMesh(
- { Vec3d(15.8899993896484,19.444055557251,2.67489433288574), Vec3d(15.9129991531372,19.1590557098389,2.67489433288574), Vec3d(15.9039993286133,19.1500549316406,2.67489433288574), Vec3d(15.9489994049072,19.2490558624268,2.67489433288574), Vec3d(15.9579992294312,19.3570556640625,2.67489433288574), Vec3d(15.8819999694824,18.690055847168,2.67489433288574), Vec3d(15.8319997787476,17.7460556030273,2.67489433288574), Vec3d(15.8489999771118,18.819055557251,2.67489433288574), Vec3d(15.8589992523193,17.7190551757812,2.67489433288574), Vec3d(15.8769998550415,19.0490550994873,2.67489433288574), Vec3d(15.7529993057251,17.8080558776855,2.67489433288574), Vec3d(15.7869997024536,19.5010547637939,2.67489433288574), Vec3d(14.0329990386963,18.7170543670654,2.67489433288574), Vec3d(13.9599990844727,18.7460556030273,2.67489433288574), Vec3d(13.9869995117188,20.2840557098389,2.67489433288574), Vec3d(14.2029991149902,20.149055480957,2.67489433288574), Vec3d(14.1939992904663,19.9560546875,2.67489433288574), Vec3d(14.1939992904663,20.1670551300049,2.67489433288574), Vec3d(14.2119998931885,20.0590553283691,2.67489433288574), Vec3d(12.1899995803833,19.1840553283691,2.67489433288574), Vec3d(12.096999168396,19.1950550079346,2.67489433288574), Vec3d(12.1099996566772,20.6690559387207,2.67489433288574), Vec3d(11.382999420166,19.9750556945801,2.67489433288574), Vec3d(11.2599992752075,19.2490558624268,2.67489433288574), Vec3d(11.2369995117188,19.9320545196533,2.67489433288574), Vec3d(11.5349998474121,20.0640544891357,2.67489433288574), Vec3d(11.6259994506836,20.1550559997559,2.67489433288574), Vec3d(11.6829986572266,20.2390556335449,2.67489433288574), Vec3d(11.7369995117188,20.3570556640625,2.67489433288574), Vec3d(11.8449993133545,20.645055770874,2.67489433288574), Vec3d(11.7729988098145,20.4640560150146,2.67489433288574), Vec3d(11.7799987792969,20.5370559692383,9.41389465332031), Vec3d(11.7639999389648,20.4470558166504,2.67489433288574), Vec3d(11.9559993743896,20.6810550689697,2.67489433288574), Vec3d(12.3079996109009,20.6020545959473,2.67489433288574), Vec3d(12.1959991455078,19.1860542297363,2.67489433288574), Vec3d(12.2059993743896,20.6540546417236,2.67489433288574), Vec3d(12.3489990234375,20.3740558624268,2.67489433288574), Vec3d(12.3579998016357,20.2750549316406,2.67489433288574), Vec3d(12.3669996261597,20.266056060791,2.67489433288574), Vec3d(12.3849992752075,20.1670551300049,2.67489433288574), Vec3d(12.4269990921021,20.0680541992188,2.67489433288574), Vec3d(12.5029993057251,19.9540557861328,2.67489433288574), Vec3d(12.6169996261597,19.8550548553467,2.67489433288574), Vec3d(12.7449989318848,19.7800559997559,2.67489433288574), Vec3d(12.7629995346069,19.7800559997559,2.67489433288574), Vec3d(12.8799991607666,19.7350559234619,2.67489433288574), Vec3d(13.0369997024536,19.7250556945801,2.67489433288574), Vec3d(13.0149993896484,19.0340557098389,2.67489433288574), Vec3d(11.1699991226196,19.2580547332764,2.67489433288574), Vec3d(11.0959987640381,19.2580547332764,2.67489433288574), Vec3d(11.1209993362427,19.9230556488037,2.67489433288574), Vec3d(13.0599994659424,19.024055480957,2.67489433288574), Vec3d(14.9049997329712,18.3170547485352,2.67489433288574), Vec3d(14.8779993057251,18.3400554656982,2.67489433288574), Vec3d(14.8779993057251,19.149055480957,2.67489433288574), Vec3d(13.3039989471436,19.77805519104,2.67489433288574), Vec3d(13.1589994430542,18.9890556335449,2.67489433288574), Vec3d(13.1559991836548,19.7350559234619,2.67489433288574), Vec3d(13.4269990921021,19.8600559234619,2.67489433288574), Vec3d(13.5339994430542,19.9700546264648,2.67389440536499), Vec3d(13.6359996795654,20.1220550537109,2.67489433288574), Vec3d(13.6359996795654,20.1400547027588,2.67489433288574), Vec3d(13.6719989776611,20.2210559844971,2.67489433288574), Vec3d(13.6899995803833,20.2300548553467,2.67489433288574), Vec3d(13.7509994506836,20.3010559082031,2.67489433288574), Vec3d(13.8539991378784,20.3180541992188,2.67489433288574), Vec3d(14.8329992294312,18.3580551147461,2.67489433288574), Vec3d(14.1849994659424,19.8530559539795,2.67489433288574), Vec3d(14.0769996643066,18.7000541687012,2.67489433288574), Vec3d(14.1099996566772,20.2400550842285,2.67489433288574), Vec3d(14.2009992599487,19.6230545043945,2.67489433288574), Vec3d(14.2729997634888,19.4670543670654,2.67489433288574), Vec3d(14.3379993438721,19.3790550231934,2.67489433288574), Vec3d(14.4549999237061,19.2770557403564,2.67489433288574), Vec3d(14.5899991989136,19.2040557861328,2.67489433288574), Vec3d(14.6079998016357,19.2040557861328,2.67489433288574), Vec3d(14.7209997177124,19.1600551605225,2.67489433288574), Vec3d(15.1379995346069,19.210054397583,2.67489433288574), Vec3d(14.9949998855591,18.2680549621582,2.67489433288574), Vec3d(15.0029993057251,19.1580543518066,2.67489433288574), Vec3d(15.2369995117188,19.2760543823242,2.67489433288574), Vec3d(15.3779993057251,19.4060554504395,2.67489433288574), Vec3d(15.4539995193481,19.520055770874,2.67489433288574), Vec3d(15.471999168396,19.52805519104,2.67489433288574), Vec3d(15.5449991226196,19.5830554962158,2.67489433288574), Vec3d(15.6529998779297,19.573055267334,2.67489433288574), Vec3d(15.7059993743896,17.8360557556152,2.67489433288574), Vec3d(15.9449996948242,18.5560550689697,2.67489433288574), Vec3d(15.8589992523193,18.9380550384521,2.67489433288574), Vec3d(14.9589996337891,18.2950553894043,2.67489433288574), Vec3d(15.7779998779297,19.5100555419922,2.67489433288574), Vec3d(14.0049991607666,20.2750549316406,2.67489433288574), Vec3d(12.3489990234375,20.5000553131104,2.67489433288574), Vec3d(13.0689992904663,19.0150547027588,2.67489433288574), Vec3d(13.0999994277954,19.0100555419922,2.67489433288574), Vec3d(15.9489994049072,19.3670558929443,9.41489505767822), Vec3d(15.9489994049072,19.2490558624268,9.41489505767822), Vec3d(15.75,17.8080558776855,9.41489505767822), Vec3d(15.6639995574951,19.5710544586182,9.41489505767822), Vec3d(15.5709991455078,17.9260559082031,9.41489505767822), Vec3d(15.8769998550415,18.690055847168,9.41489505767822), Vec3d(15.8499994277954,18.8170547485352,9.41489505767822), Vec3d(15.9459991455078,18.5520553588867,9.41489505767822), Vec3d(15.914999961853,17.6890544891357,9.41489505767822), Vec3d(15.3999996185303,19.4290542602539,9.41489505767822), Vec3d(15.3099994659424,19.339054107666,9.41489505767822), Vec3d(15.3729991912842,18.0440559387207,9.41489505767822), Vec3d(15.4579992294312,19.5170555114746,9.41489505767822), Vec3d(15.5469999313354,19.5820541381836,9.41489505767822), Vec3d(13.2309989929199,19.7610549926758,9.41489505767822), Vec3d(13.168999671936,19.7360553741455,9.41489505767822), Vec3d(13.096999168396,19.0140552520752,9.41489505767822), Vec3d(13.1999988555908,18.9870548248291,9.41489505767822), Vec3d(15.1399993896484,19.2080554962158,9.41489505767822), Vec3d(15.0159997940063,19.1600551605225,9.41489505767822), Vec3d(14.9859991073608,18.2770557403564,9.41489505767822), Vec3d(15.1749992370605,18.1690559387207,9.41489505767822), Vec3d(15.9039993286133,19.1320552825928,9.41489505767822), Vec3d(15.8949995040894,19.4460544586182,9.41489505767822), Vec3d(15.8769998550415,19.0420551300049,9.41489505767822), Vec3d(12.2169990539551,20.6500549316406,9.41489505767822), Vec3d(11.9379997253418,20.6810550689697,9.41489505767822), Vec3d(11.8629989624023,19.2130546569824,9.41489505767822), Vec3d(12.096999168396,19.1950550079346,9.41489505767822), Vec3d(14.1669998168945,18.6640548706055,9.41489505767822), Vec3d(14.1039991378784,20.2460556030273,9.41489505767822), Vec3d(13.9849996566772,18.7360553741455,9.41489505767822), Vec3d(14.7349996566772,19.1590557098389,9.41489505767822), Vec3d(14.5849990844727,19.2050552368164,9.41489505767822), Vec3d(14.5719995498657,18.4850559234619,9.41489505767822), Vec3d(14.1939992904663,19.6760559082031,9.41489505767822), Vec3d(14.1849994659424,19.9330558776855,9.41489505767822), Vec3d(14.1759996414185,18.6640548706055,9.41489505767822), Vec3d(14.261999130249,19.4890556335449,9.41489505767822), Vec3d(14.3539991378784,19.3610553741455,9.41489505767822), Vec3d(14.3559989929199,18.5830554962158,9.41489505767822), Vec3d(11.6039991378784,20.1250553131104,9.41489505767822), Vec3d(11.5209999084473,20.0520553588867,9.41489505767822), Vec3d(11.4209995269775,19.2480545043945,9.41489505767822), Vec3d(11.6989994049072,20.2690544128418,9.41389465332031), Vec3d(11.7609996795654,20.4310550689697,9.41489505767822), Vec3d(11.8359994888306,19.2130546569824,9.41489505767822), Vec3d(14.1889991760254,20.1710548400879,9.41489505767822), Vec3d(13.9689998626709,20.2840557098389,9.41489505767822), Vec3d(13.8739995956421,20.315055847168,9.41489505767822), Vec3d(13.7799997329712,18.8080558776855,9.41489505767822), Vec3d(13.9869995117188,20.2750549316406,9.41489505767822), Vec3d(12.3129997253418,20.5980548858643,9.41489505767822), Vec3d(12.3399991989136,20.5090560913086,9.41489505767822), Vec3d(12.3489990234375,20.3830547332764,9.41489505767822), Vec3d(12.3599996566772,20.2680549621582,9.41489505767822), Vec3d(12.3849992752075,20.1850547790527,9.41489505767822), Vec3d(12.3849992752075,20.1670551300049,9.41489505767822), Vec3d(12.4249992370605,20.065055847168,9.41489505767822), Vec3d(12.4729995727539,19.1350555419922,9.41489505767822), Vec3d(14.4399995803833,19.2900543212891,9.41489505767822), Vec3d(14.3649997711182,18.5740547180176,9.41489505767822), Vec3d(13.5729999542236,20.0310554504395,9.41489505767822), Vec3d(13.4889993667603,19.9140548706055,9.41489505767822), Vec3d(13.5639991760254,18.8710556030273,9.41489505767822), Vec3d(13.6389999389648,20.1310558319092,9.41489505767822), Vec3d(13.6719989776611,20.2130546569824,9.41489505767822), Vec3d(13.75,20.3020553588867,9.41489505767822), Vec3d(12.7399997711182,19.7810554504395,9.41489505767822), Vec3d(12.6189994812012,19.8520545959473,9.41489505767822), Vec3d(12.5799999237061,19.1200542449951,9.41489505767822), Vec3d(12.8349990844727,19.069055557251,9.41489505767822), Vec3d(11.2669992446899,19.9350547790527,9.41489505767822), Vec3d(11.1029987335205,19.9230556488037,9.41489505767822), Vec3d(11.0209999084473,19.2600555419922,9.41489505767822), Vec3d(11.3819999694824,19.9710559844971,9.41489505767822), Vec3d(13.418999671936,19.8530559539795,9.41489505767822), Vec3d(13.4329996109009,18.9160556793213,9.41489505767822), Vec3d(11.8399991989136,20.6430549621582,9.41489505767822), Vec3d(13.3119993209839,19.7800559997559,9.41489505767822), Vec3d(15.2189998626709,19.2600555419922,9.41489505767822), Vec3d(15.1839990615845,18.1600551605225,9.41489505767822), Vec3d(15.3639993667603,18.0520553588867,9.41489505767822), Vec3d(13.0189990997314,19.7250556945801,9.41489505767822), Vec3d(12.8949995040894,19.7350559234619,9.41489505767822), Vec3d(15.9039993286133,19.1500549316406,9.41489505767822), Vec3d(15.7699995040894,19.5140552520752,9.41489505767822), Vec3d(15.8589992523193,18.9340553283691,9.41489505767822), Vec3d(14.1939992904663,19.9510555267334,9.41489505767822), Vec3d(14.2119998931885,20.0630550384521,9.41489505767822), Vec3d(14.8589992523193,19.149055480957,9.41489505767822), Vec3d(14.8159999847412,18.3670558929443,9.41489505767822), Vec3d(14.8959999084473,18.3220558166504,9.41489505767822), Vec3d(12.5189990997314,19.9360542297363,9.41489505767822), Vec3d(11.0209999084473,19.9290542602539,9.41489505767822), Vec3d(11.0209999084473,19.2530555725098,2.67489433288574), Vec3d(11.0209999084473,19.9300556182861,2.67489433288574), Vec3d(15.9799995422363,18.505931854248,5.58724021911621), Vec3d(15.9799995422363,18.5044555664062,9.41489505767822), Vec3d(15.9799995422363,18.5041732788086,2.67489433288574), Vec3d(15.9799995422363,18.1684837341309,2.67489433288574), Vec3d(15.9799995422363,18.1288299560547,9.41489505767822), Vec3d(15.9799995422363,17.9876575469971,2.67489433288574), Vec3d(15.9799995422363,17.6247596740723,3.91620373725891), Vec3d(15.9799995422363,17.6247596740723,2.67489433288574), Vec3d(15.9799995422363,17.6254329681396,4.32245063781738), Vec3d(15.9799995422363,17.8920269012451,9.41489505767822), Vec3d(15.9799995422363,17.8795108795166,2.67489433288574), Vec3d(15.9799995422363,17.629810333252,4.58585262298584), Vec3d(15.9799995422363,17.6336059570312,5.27938556671143), Vec3d(15.9799995422363,17.8311748504639,2.67489433288574), Vec3d(15.9799995422363,17.638355255127,9.41489505767822), Vec3d(15.9799995422363,17.6346111297607,5.98653984069824), Vec3d(15.9799995422363,17.8728256225586,2.67489433288574), Vec3d(15.9799995422363,18.2221603393555,2.67489433288574) },
- { Vec3crd(0,1,2), Vec3crd(0,3,1), Vec3crd(0,4,3), Vec3crd(5,6,7), Vec3crd(8,6,5), Vec3crd(2,9,0), Vec3crd(6,10,11), Vec3crd(12,13,14), Vec3crd(15,16,17), Vec3crd(18,16,15), Vec3crd(19,20,21), Vec3crd(22,23,24), Vec3crd(25,23,22), Vec3crd(26,23,25), Vec3crd(27,23,26), Vec3crd(28,23,27), Vec3crd(29,30,31), Vec3crd(29,32,30), Vec3crd(29,28,32), Vec3crd(33,28,29), Vec3crd(33,23,28), Vec3crd(21,23,33), Vec3crd(20,23,21), Vec3crd(34,35,36), Vec3crd(37,35,34), Vec3crd(38,35,37), Vec3crd(39,35,38), Vec3crd(40,35,39), Vec3crd(41,35,40), Vec3crd(42,35,41), Vec3crd(43,35,42), Vec3crd(44,35,43), Vec3crd(45,35,44), Vec3crd(46,35,45), Vec3crd(47,35,46), Vec3crd(48,35,47), Vec3crd(49,50,51), Vec3crd(52,48,47), Vec3crd(23,49,24), Vec3crd(53,54,55), Vec3crd(56,57,58), Vec3crd(59,57,56), Vec3crd(60,57,59), Vec3crd(61,57,60), Vec3crd(62,57,61), Vec3crd(63,57,62), Vec3crd(64,57,63), Vec3crd(65,57,64), Vec3crd(66,57,65), Vec3crd(13,57,66), Vec3crd(54,67,55), Vec3crd(68,69,70), Vec3crd(71,69,68), Vec3crd(72,69,71), Vec3crd(73,69,72), Vec3crd(74,69,73), Vec3crd(75,69,74), Vec3crd(76,69,75), Vec3crd(77,69,76), Vec3crd(67,69,77), Vec3crd(70,16,68), Vec3crd(70,17,16), Vec3crd(78,79,80), Vec3crd(81,79,78), Vec3crd(82,79,81), Vec3crd(83,79,82), Vec3crd(84,79,83), Vec3crd(85,79,84), Vec3crd(86,79,85), Vec3crd(87,79,86), Vec3crd(88,8,5), Vec3crd(11,7,6), Vec3crd(11,89,7), Vec3crd(11,9,89), Vec3crd(11,0,9), Vec3crd(55,90,53), Vec3crd(55,79,90), Vec3crd(55,80,79), Vec3crd(91,11,10), Vec3crd(92,69,12), Vec3crd(92,70,69), Vec3crd(34,93,37), Vec3crd(47,94,52), Vec3crd(47,95,94), Vec3crd(47,57,95), Vec3crd(47,58,57), Vec3crd(51,24,49), Vec3crd(21,35,19), Vec3crd(21,36,35), Vec3crd(14,92,12), Vec3crd(86,10,87), Vec3crd(86,91,10), Vec3crd(77,55,67), Vec3crd(66,14,13), Vec3crd(96,97,4), Vec3crd(98,99,100), Vec3crd(101,102,98), Vec3crd(103,101,98), Vec3crd(104,103,98), Vec3crd(105,106,107), Vec3crd(108,105,107), Vec3crd(109,108,107), Vec3crd(100,109,107), Vec3crd(110,111,112), Vec3crd(113,110,112), Vec3crd(114,115,116), Vec3crd(117,114,116), Vec3crd(118,119,120), Vec3crd(121,122,123), Vec3crd(124,121,123), Vec3crd(125,126,127), Vec3crd(128,129,130), Vec3crd(131,132,133), Vec3crd(71,131,133), Vec3crd(134,71,133), Vec3crd(135,134,133), Vec3crd(136,135,133), Vec3crd(137,138,139), Vec3crd(140,137,139), Vec3crd(141,140,139), Vec3crd(142,31,141), Vec3crd(142,141,139), Vec3crd(143,126,132), Vec3crd(144,145,146), Vec3crd(147,144,146), Vec3crd(127,147,146), Vec3crd(148,121,124), Vec3crd(149,148,124), Vec3crd(150,149,124), Vec3crd(151,150,124), Vec3crd(152,151,124), Vec3crd(153,152,124), Vec3crd(154,153,124), Vec3crd(155,154,124), Vec3crd(129,156,157), Vec3crd(130,129,157), Vec3crd(158,159,160), Vec3crd(161,158,160), Vec3crd(162,161,160), Vec3crd(163,162,160), Vec3crd(146,163,160), Vec3crd(164,165,166), Vec3crd(167,164,166), Vec3crd(168,169,170), Vec3crd(171,168,170), Vec3crd(139,171,170), Vec3crd(159,172,173), Vec3crd(123,174,142), Vec3crd(175,110,113), Vec3crd(173,175,113), Vec3crd(106,176,177), Vec3crd(178,106,177), Vec3crd(179,180,167), Vec3crd(112,179,167), Vec3crd(175,173,172), Vec3crd(119,118,181), Vec3crd(119,181,97), Vec3crd(119,97,96), Vec3crd(182,98,102), Vec3crd(182,102,183), Vec3crd(182,183,120), Vec3crd(182,120,119), Vec3crd(143,132,184), Vec3crd(184,185,143), Vec3crd(147,127,126), Vec3crd(174,123,122), Vec3crd(159,173,160), Vec3crd(126,125,133), Vec3crd(126,133,132), Vec3crd(186,187,188), Vec3crd(186,188,116), Vec3crd(186,116,115), Vec3crd(99,98,182), Vec3crd(109,100,99), Vec3crd(106,178,107), Vec3crd(114,117,177), Vec3crd(114,177,176), Vec3crd(128,130,187), Vec3crd(128,187,186), Vec3crd(135,136,157), Vec3crd(135,157,156), Vec3crd(163,146,145), Vec3crd(164,167,180), Vec3crd(179,112,111), Vec3crd(171,139,138), Vec3crd(189,155,166), Vec3crd(189,166,165), Vec3crd(149,150,93), Vec3crd(154,155,189), Vec3crd(31,142,174), Vec3crd(114,176,78), Vec3crd(81,78,176), Vec3crd(7,89,183), Vec3crd(89,9,120), Vec3crd(89,120,183), Vec3crd(78,80,114), Vec3crd(176,106,81), Vec3crd(88,5,103), Vec3crd(183,102,7), Vec3crd(118,120,9), Vec3crd(9,2,181), Vec3crd(9,181,118), Vec3crd(115,114,80), Vec3crd(82,81,106), Vec3crd(101,103,5), Vec3crd(102,101,5), Vec3crd(5,7,102), Vec3crd(97,181,2), Vec3crd(2,1,97), Vec3crd(1,3,97), Vec3crd(80,55,115), Vec3crd(172,159,59), Vec3crd(59,56,172), Vec3crd(3,4,97), Vec3crd(4,0,96), Vec3crd(105,108,82), Vec3crd(186,115,55), Vec3crd(82,106,105), Vec3crd(83,82,108), Vec3crd(60,59,159), Vec3crd(175,172,56), Vec3crd(119,96,0), Vec3crd(0,11,119), Vec3crd(108,109,84), Vec3crd(84,83,108), Vec3crd(55,77,186), Vec3crd(56,58,110), Vec3crd(56,110,175), Vec3crd(60,159,158), Vec3crd(11,91,182), Vec3crd(182,119,11), Vec3crd(91,86,182), Vec3crd(85,84,109), Vec3crd(86,85,99), Vec3crd(128,186,77), Vec3crd(58,111,110), Vec3crd(158,161,60), Vec3crd(26,25,137), Vec3crd(138,137,25), Vec3crd(99,182,86), Vec3crd(109,99,85), Vec3crd(77,76,128), Vec3crd(58,47,111), Vec3crd(61,60,161), Vec3crd(137,140,26), Vec3crd(27,26,140), Vec3crd(25,22,138), Vec3crd(129,128,76), Vec3crd(76,75,129), Vec3crd(75,74,129), Vec3crd(74,73,156), Vec3crd(73,72,135), Vec3crd(68,16,184), Vec3crd(68,184,132), Vec3crd(16,18,185), Vec3crd(161,162,62), Vec3crd(62,61,161), Vec3crd(179,111,47), Vec3crd(171,138,22), Vec3crd(156,129,74), Vec3crd(135,156,73), Vec3crd(134,135,72), Vec3crd(72,71,134), Vec3crd(68,132,131), Vec3crd(185,184,16), Vec3crd(18,15,185), Vec3crd(63,62,162), Vec3crd(28,27,140), Vec3crd(22,24,171), Vec3crd(71,68,131), Vec3crd(15,17,143), Vec3crd(15,143,185), Vec3crd(17,70,143), Vec3crd(70,92,126), Vec3crd(162,163,64), Vec3crd(64,63,162), Vec3crd(180,179,47), Vec3crd(47,46,180), Vec3crd(140,141,28), Vec3crd(168,171,24), Vec3crd(126,143,70), Vec3crd(92,14,147), Vec3crd(147,126,92), Vec3crd(14,66,144), Vec3crd(14,144,147), Vec3crd(65,64,163), Vec3crd(66,65,145), Vec3crd(46,45,180), Vec3crd(32,28,141), Vec3crd(24,51,168), Vec3crd(145,144,66), Vec3crd(163,145,65), Vec3crd(164,180,45), Vec3crd(45,44,164), Vec3crd(44,43,164), Vec3crd(43,42,165), Vec3crd(38,37,151), Vec3crd(150,151,37), Vec3crd(37,93,150), Vec3crd(141,31,30), Vec3crd(30,32,141), Vec3crd(169,168,51), Vec3crd(165,164,43), Vec3crd(189,165,42), Vec3crd(42,41,189), Vec3crd(40,39,152), Vec3crd(40,152,153), Vec3crd(151,152,39), Vec3crd(39,38,151), Vec3crd(93,34,149), Vec3crd(154,189,41), Vec3crd(153,154,41), Vec3crd(41,40,153), Vec3crd(148,149,34), Vec3crd(34,36,148), Vec3crd(36,21,121), Vec3crd(31,174,29), Vec3crd(121,148,36), Vec3crd(21,33,122), Vec3crd(21,122,121), Vec3crd(33,29,122), Vec3crd(174,122,29), Vec3crd(116,188,53), Vec3crd(104,98,10), Vec3crd(87,10,98), Vec3crd(98,100,87), Vec3crd(79,87,100), Vec3crd(79,100,107), Vec3crd(90,79,107), Vec3crd(90,107,178), Vec3crd(178,177,90), Vec3crd(53,90,177), Vec3crd(53,177,117), Vec3crd(117,116,53), Vec3crd(54,53,188), Vec3crd(54,188,187), Vec3crd(67,54,187), Vec3crd(67,187,130), Vec3crd(69,67,130), Vec3crd(69,130,157), Vec3crd(12,69,157), Vec3crd(12,157,136), Vec3crd(136,133,12), Vec3crd(12,133,125), Vec3crd(125,127,12), Vec3crd(13,12,127), Vec3crd(127,146,13), Vec3crd(57,13,146), Vec3crd(57,146,160), Vec3crd(95,57,160), Vec3crd(95,160,173), Vec3crd(173,113,95), Vec3crd(94,95,113), Vec3crd(113,112,94), Vec3crd(52,94,112), Vec3crd(48,52,112), Vec3crd(112,167,48), Vec3crd(35,48,167), Vec3crd(35,167,166), Vec3crd(19,35,166), Vec3crd(139,170,50), Vec3crd(50,49,139), Vec3crd(166,155,19), Vec3crd(20,19,155), Vec3crd(155,124,20), Vec3crd(23,20,124), Vec3crd(23,124,123), Vec3crd(49,23,123), Vec3crd(49,123,142), Vec3crd(142,139,49), Vec3crd(190,191,170), Vec3crd(192,191,190), Vec3crd(191,192,51), Vec3crd(191,51,50), Vec3crd(170,169,190), Vec3crd(169,51,192), Vec3crd(169,192,190), Vec3crd(170,191,50), Vec3crd(193,194,195), Vec3crd(196,197,198), Vec3crd(199,200,201), Vec3crd(198,202,203), Vec3crd(204,201,200), Vec3crd(205,204,200), Vec3crd(206,207,208), Vec3crd(206,208,205), Vec3crd(206,205,200), Vec3crd(207,206,209), Vec3crd(207,209,203), Vec3crd(207,203,202), Vec3crd(202,198,197), Vec3crd(197,196,210), Vec3crd(197,210,195), Vec3crd(197,195,194), Vec3crd(8,88,195), Vec3crd(8,195,210), Vec3crd(210,196,8), Vec3crd(196,198,8), Vec3crd(198,203,8), Vec3crd(203,209,8), Vec3crd(209,206,8), Vec3crd(206,200,8), Vec3crd(202,197,104), Vec3crd(207,202,104), Vec3crd(103,104,197), Vec3crd(103,197,194), Vec3crd(193,195,88), Vec3crd(88,103,194), Vec3crd(88,194,193), Vec3crd(200,199,8), Vec3crd(199,201,8), Vec3crd(204,205,6), Vec3crd(6,8,201), Vec3crd(6,201,204), Vec3crd(10,6,205), Vec3crd(10,205,208), Vec3crd(104,10,208), Vec3crd(104,208,207) });
+ { {15.8899993896484,19.444055557251,2.67489433288574}, {15.9129991531372,19.1590557098389,2.67489433288574}, {15.9039993286133,19.1500549316406,2.67489433288574}, {15.9489994049072,19.2490558624268,2.67489433288574}, {15.9579992294312,19.3570556640625,2.67489433288574}, {15.8819999694824,18.690055847168,2.67489433288574}, {15.8319997787476,17.7460556030273,2.67489433288574}, {15.8489999771118,18.819055557251,2.67489433288574}, {15.8589992523193,17.7190551757812,2.67489433288574}, {15.8769998550415,19.0490550994873,2.67489433288574}, {15.7529993057251,17.8080558776855,2.67489433288574}, {15.7869997024536,19.5010547637939,2.67489433288574}, {14.0329990386963,18.7170543670654,2.67489433288574}, {13.9599990844727,18.7460556030273,2.67489433288574}, {13.9869995117188,20.2840557098389,2.67489433288574}, {14.2029991149902,20.149055480957,2.67489433288574}, {14.1939992904663,19.9560546875,2.67489433288574}, {14.1939992904663,20.1670551300049,2.67489433288574}, {14.2119998931885,20.0590553283691,2.67489433288574}, {12.1899995803833,19.1840553283691,2.67489433288574}, {12.096999168396,19.1950550079346,2.67489433288574}, {12.1099996566772,20.6690559387207,2.67489433288574}, {11.382999420166,19.9750556945801,2.67489433288574}, {11.2599992752075,19.2490558624268,2.67489433288574}, {11.2369995117188,19.9320545196533,2.67489433288574}, {11.5349998474121,20.0640544891357,2.67489433288574}, {11.6259994506836,20.1550559997559,2.67489433288574}, {11.6829986572266,20.2390556335449,2.67489433288574}, {11.7369995117188,20.3570556640625,2.67489433288574}, {11.8449993133545,20.645055770874,2.67489433288574}, {11.7729988098145,20.4640560150146,2.67489433288574}, {11.7799987792969,20.5370559692383,9.41389465332031}, {11.7639999389648,20.4470558166504,2.67489433288574}, {11.9559993743896,20.6810550689697,2.67489433288574}, {12.3079996109009,20.6020545959473,2.67489433288574}, {12.1959991455078,19.1860542297363,2.67489433288574}, {12.2059993743896,20.6540546417236,2.67489433288574}, {12.3489990234375,20.3740558624268,2.67489433288574}, {12.3579998016357,20.2750549316406,2.67489433288574}, {12.3669996261597,20.266056060791,2.67489433288574}, {12.3849992752075,20.1670551300049,2.67489433288574}, {12.4269990921021,20.0680541992188,2.67489433288574}, {12.5029993057251,19.9540557861328,2.67489433288574}, {12.6169996261597,19.8550548553467,2.67489433288574}, {12.7449989318848,19.7800559997559,2.67489433288574}, {12.7629995346069,19.7800559997559,2.67489433288574}, {12.8799991607666,19.7350559234619,2.67489433288574}, {13.0369997024536,19.7250556945801,2.67489433288574}, {13.0149993896484,19.0340557098389,2.67489433288574}, {11.1699991226196,19.2580547332764,2.67489433288574}, {11.0959987640381,19.2580547332764,2.67489433288574}, {11.1209993362427,19.9230556488037,2.67489433288574}, {13.0599994659424,19.024055480957,2.67489433288574}, {14.9049997329712,18.3170547485352,2.67489433288574}, {14.8779993057251,18.3400554656982,2.67489433288574}, {14.8779993057251,19.149055480957,2.67489433288574}, {13.3039989471436,19.77805519104,2.67489433288574}, {13.1589994430542,18.9890556335449,2.67489433288574}, {13.1559991836548,19.7350559234619,2.67489433288574}, {13.4269990921021,19.8600559234619,2.67489433288574}, {13.5339994430542,19.9700546264648,2.67389440536499}, {13.6359996795654,20.1220550537109,2.67489433288574}, {13.6359996795654,20.1400547027588,2.67489433288574}, {13.6719989776611,20.2210559844971,2.67489433288574}, {13.6899995803833,20.2300548553467,2.67489433288574}, {13.7509994506836,20.3010559082031,2.67489433288574}, {13.8539991378784,20.3180541992188,2.67489433288574}, {14.8329992294312,18.3580551147461,2.67489433288574}, {14.1849994659424,19.8530559539795,2.67489433288574}, {14.0769996643066,18.7000541687012,2.67489433288574}, {14.1099996566772,20.2400550842285,2.67489433288574}, {14.2009992599487,19.6230545043945,2.67489433288574}, {14.2729997634888,19.4670543670654,2.67489433288574}, {14.3379993438721,19.3790550231934,2.67489433288574}, {14.4549999237061,19.2770557403564,2.67489433288574}, {14.5899991989136,19.2040557861328,2.67489433288574}, {14.6079998016357,19.2040557861328,2.67489433288574}, {14.7209997177124,19.1600551605225,2.67489433288574}, {15.1379995346069,19.210054397583,2.67489433288574}, {14.9949998855591,18.2680549621582,2.67489433288574}, {15.0029993057251,19.1580543518066,2.67489433288574}, {15.2369995117188,19.2760543823242,2.67489433288574}, {15.3779993057251,19.4060554504395,2.67489433288574}, {15.4539995193481,19.520055770874,2.67489433288574}, {15.471999168396,19.52805519104,2.67489433288574}, {15.5449991226196,19.5830554962158,2.67489433288574}, {15.6529998779297,19.573055267334,2.67489433288574}, {15.7059993743896,17.8360557556152,2.67489433288574}, {15.9449996948242,18.5560550689697,2.67489433288574}, {15.8589992523193,18.9380550384521,2.67489433288574}, {14.9589996337891,18.2950553894043,2.67489433288574}, {15.7779998779297,19.5100555419922,2.67489433288574}, {14.0049991607666,20.2750549316406,2.67489433288574}, {12.3489990234375,20.5000553131104,2.67489433288574}, {13.0689992904663,19.0150547027588,2.67489433288574}, {13.0999994277954,19.0100555419922,2.67489433288574}, {15.9489994049072,19.3670558929443,9.41489505767822}, {15.9489994049072,19.2490558624268,9.41489505767822}, {15.75,17.8080558776855,9.41489505767822}, {15.6639995574951,19.5710544586182,9.41489505767822}, {15.5709991455078,17.9260559082031,9.41489505767822}, {15.8769998550415,18.690055847168,9.41489505767822}, {15.8499994277954,18.8170547485352,9.41489505767822}, {15.9459991455078,18.5520553588867,9.41489505767822}, {15.914999961853,17.6890544891357,9.41489505767822}, {15.3999996185303,19.4290542602539,9.41489505767822}, {15.3099994659424,19.339054107666,9.41489505767822}, {15.3729991912842,18.0440559387207,9.41489505767822}, {15.4579992294312,19.5170555114746,9.41489505767822}, {15.5469999313354,19.5820541381836,9.41489505767822}, {13.2309989929199,19.7610549926758,9.41489505767822}, {13.168999671936,19.7360553741455,9.41489505767822}, {13.096999168396,19.0140552520752,9.41489505767822}, {13.1999988555908,18.9870548248291,9.41489505767822}, {15.1399993896484,19.2080554962158,9.41489505767822}, {15.0159997940063,19.1600551605225,9.41489505767822}, {14.9859991073608,18.2770557403564,9.41489505767822}, {15.1749992370605,18.1690559387207,9.41489505767822}, {15.9039993286133,19.1320552825928,9.41489505767822}, {15.8949995040894,19.4460544586182,9.41489505767822}, {15.8769998550415,19.0420551300049,9.41489505767822}, {12.2169990539551,20.6500549316406,9.41489505767822}, {11.9379997253418,20.6810550689697,9.41489505767822}, {11.8629989624023,19.2130546569824,9.41489505767822}, {12.096999168396,19.1950550079346,9.41489505767822}, {14.1669998168945,18.6640548706055,9.41489505767822}, {14.1039991378784,20.2460556030273,9.41489505767822}, {13.9849996566772,18.7360553741455,9.41489505767822}, {14.7349996566772,19.1590557098389,9.41489505767822}, {14.5849990844727,19.2050552368164,9.41489505767822}, {14.5719995498657,18.4850559234619,9.41489505767822}, {14.1939992904663,19.6760559082031,9.41489505767822}, {14.1849994659424,19.9330558776855,9.41489505767822}, {14.1759996414185,18.6640548706055,9.41489505767822}, {14.261999130249,19.4890556335449,9.41489505767822}, {14.3539991378784,19.3610553741455,9.41489505767822}, {14.3559989929199,18.5830554962158,9.41489505767822}, {11.6039991378784,20.1250553131104,9.41489505767822}, {11.5209999084473,20.0520553588867,9.41489505767822}, {11.4209995269775,19.2480545043945,9.41489505767822}, {11.6989994049072,20.2690544128418,9.41389465332031}, {11.7609996795654,20.4310550689697,9.41489505767822}, {11.8359994888306,19.2130546569824,9.41489505767822}, {14.1889991760254,20.1710548400879,9.41489505767822}, {13.9689998626709,20.2840557098389,9.41489505767822}, {13.8739995956421,20.315055847168,9.41489505767822}, {13.7799997329712,18.8080558776855,9.41489505767822}, {13.9869995117188,20.2750549316406,9.41489505767822}, {12.3129997253418,20.5980548858643,9.41489505767822}, {12.3399991989136,20.5090560913086,9.41489505767822}, {12.3489990234375,20.3830547332764,9.41489505767822}, {12.3599996566772,20.2680549621582,9.41489505767822}, {12.3849992752075,20.1850547790527,9.41489505767822}, {12.3849992752075,20.1670551300049,9.41489505767822}, {12.4249992370605,20.065055847168,9.41489505767822}, {12.4729995727539,19.1350555419922,9.41489505767822}, {14.4399995803833,19.2900543212891,9.41489505767822}, {14.3649997711182,18.5740547180176,9.41489505767822}, {13.5729999542236,20.0310554504395,9.41489505767822}, {13.4889993667603,19.9140548706055,9.41489505767822}, {13.5639991760254,18.8710556030273,9.41489505767822}, {13.6389999389648,20.1310558319092,9.41489505767822}, {13.6719989776611,20.2130546569824,9.41489505767822}, {13.75,20.3020553588867,9.41489505767822}, {12.7399997711182,19.7810554504395,9.41489505767822}, {12.6189994812012,19.8520545959473,9.41489505767822}, {12.5799999237061,19.1200542449951,9.41489505767822}, {12.8349990844727,19.069055557251,9.41489505767822}, {11.2669992446899,19.9350547790527,9.41489505767822}, {11.1029987335205,19.9230556488037,9.41489505767822}, {11.0209999084473,19.2600555419922,9.41489505767822}, {11.3819999694824,19.9710559844971,9.41489505767822}, {13.418999671936,19.8530559539795,9.41489505767822}, {13.4329996109009,18.9160556793213,9.41489505767822}, {11.8399991989136,20.6430549621582,9.41489505767822}, {13.3119993209839,19.7800559997559,9.41489505767822}, {15.2189998626709,19.2600555419922,9.41489505767822}, {15.1839990615845,18.1600551605225,9.41489505767822}, {15.3639993667603,18.0520553588867,9.41489505767822}, {13.0189990997314,19.7250556945801,9.41489505767822}, {12.8949995040894,19.7350559234619,9.41489505767822}, {15.9039993286133,19.1500549316406,9.41489505767822}, {15.7699995040894,19.5140552520752,9.41489505767822}, {15.8589992523193,18.9340553283691,9.41489505767822}, {14.1939992904663,19.9510555267334,9.41489505767822}, {14.2119998931885,20.0630550384521,9.41489505767822}, {14.8589992523193,19.149055480957,9.41489505767822}, {14.8159999847412,18.3670558929443,9.41489505767822}, {14.8959999084473,18.3220558166504,9.41489505767822}, {12.5189990997314,19.9360542297363,9.41489505767822}, {11.0209999084473,19.9290542602539,9.41489505767822}, {11.0209999084473,19.2530555725098,2.67489433288574}, {11.0209999084473,19.9300556182861,2.67489433288574}, {15.9799995422363,18.505931854248,5.58724021911621}, {15.9799995422363,18.5044555664062,9.41489505767822}, {15.9799995422363,18.5041732788086,2.67489433288574}, {15.9799995422363,18.1684837341309,2.67489433288574}, {15.9799995422363,18.1288299560547,9.41489505767822}, {15.9799995422363,17.9876575469971,2.67489433288574}, {15.9799995422363,17.6247596740723,3.91620373725891}, {15.9799995422363,17.6247596740723,2.67489433288574}, {15.9799995422363,17.6254329681396,4.32245063781738}, {15.9799995422363,17.8920269012451,9.41489505767822}, {15.9799995422363,17.8795108795166,2.67489433288574}, {15.9799995422363,17.629810333252,4.58585262298584}, {15.9799995422363,17.6336059570312,5.27938556671143}, {15.9799995422363,17.8311748504639,2.67489433288574}, {15.9799995422363,17.638355255127,9.41489505767822}, {15.9799995422363,17.6346111297607,5.98653984069824}, {15.9799995422363,17.8728256225586,2.67489433288574}, {15.9799995422363,18.2221603393555,2.67489433288574} },
+ { {0,1,2}, {0,3,1}, {0,4,3}, {5,6,7}, {8,6,5}, {2,9,0}, {6,10,11}, {12,13,14}, {15,16,17}, {18,16,15}, {19,20,21}, {22,23,24}, {25,23,22}, {26,23,25}, {27,23,26}, {28,23,27}, {29,30,31}, {29,32,30}, {29,28,32}, {33,28,29}, {33,23,28}, {21,23,33}, {20,23,21}, {34,35,36}, {37,35,34}, {38,35,37}, {39,35,38}, {40,35,39}, {41,35,40}, {42,35,41}, {43,35,42}, {44,35,43}, {45,35,44}, {46,35,45}, {47,35,46}, {48,35,47}, {49,50,51}, {52,48,47}, {23,49,24}, {53,54,55}, {56,57,58}, {59,57,56}, {60,57,59}, {61,57,60}, {62,57,61}, {63,57,62}, {64,57,63}, {65,57,64}, {66,57,65}, {13,57,66}, {54,67,55}, {68,69,70}, {71,69,68}, {72,69,71}, {73,69,72}, {74,69,73}, {75,69,74}, {76,69,75}, {77,69,76}, {67,69,77}, {70,16,68}, {70,17,16}, {78,79,80}, {81,79,78}, {82,79,81}, {83,79,82}, {84,79,83}, {85,79,84}, {86,79,85}, {87,79,86}, {88,8,5}, {11,7,6}, {11,89,7}, {11,9,89}, {11,0,9}, {55,90,53}, {55,79,90}, {55,80,79}, {91,11,10}, {92,69,12}, {92,70,69}, {34,93,37}, {47,94,52}, {47,95,94}, {47,57,95}, {47,58,57}, {51,24,49}, {21,35,19}, {21,36,35}, {14,92,12}, {86,10,87}, {86,91,10}, {77,55,67}, {66,14,13}, {96,97,4}, {98,99,100}, {101,102,98}, {103,101,98}, {104,103,98}, {105,106,107}, {108,105,107}, {109,108,107}, {100,109,107}, {110,111,112}, {113,110,112}, {114,115,116}, {117,114,116}, {118,119,120}, {121,122,123}, {124,121,123}, {125,126,127}, {128,129,130}, {131,132,133}, {71,131,133}, {134,71,133}, {135,134,133}, {136,135,133}, {137,138,139}, {140,137,139}, {141,140,139}, {142,31,141}, {142,141,139}, {143,126,132}, {144,145,146}, {147,144,146}, {127,147,146}, {148,121,124}, {149,148,124}, {150,149,124}, {151,150,124}, {152,151,124}, {153,152,124}, {154,153,124}, {155,154,124}, {129,156,157}, {130,129,157}, {158,159,160}, {161,158,160}, {162,161,160}, {163,162,160}, {146,163,160}, {164,165,166}, {167,164,166}, {168,169,170}, {171,168,170}, {139,171,170}, {159,172,173}, {123,174,142}, {175,110,113}, {173,175,113}, {106,176,177}, {178,106,177}, {179,180,167}, {112,179,167}, {175,173,172}, {119,118,181}, {119,181,97}, {119,97,96}, {182,98,102}, {182,102,183}, {182,183,120}, {182,120,119}, {143,132,184}, {184,185,143}, {147,127,126}, {174,123,122}, {159,173,160}, {126,125,133}, {126,133,132}, {186,187,188}, {186,188,116}, {186,116,115}, {99,98,182}, {109,100,99}, {106,178,107}, {114,117,177}, {114,177,176}, {128,130,187}, {128,187,186}, {135,136,157}, {135,157,156}, {163,146,145}, {164,167,180}, {179,112,111}, {171,139,138}, {189,155,166}, {189,166,165}, {149,150,93}, {154,155,189}, {31,142,174}, {114,176,78}, {81,78,176}, {7,89,183}, {89,9,120}, {89,120,183}, {78,80,114}, {176,106,81}, {88,5,103}, {183,102,7}, {118,120,9}, {9,2,181}, {9,181,118}, {115,114,80}, {82,81,106}, {101,103,5}, {102,101,5}, {5,7,102}, {97,181,2}, {2,1,97}, {1,3,97}, {80,55,115}, {172,159,59}, {59,56,172}, {3,4,97}, {4,0,96}, {105,108,82}, {186,115,55}, {82,106,105}, {83,82,108}, {60,59,159}, {175,172,56}, {119,96,0}, {0,11,119}, {108,109,84}, {84,83,108}, {55,77,186}, {56,58,110}, {56,110,175}, {60,159,158}, {11,91,182}, {182,119,11}, {91,86,182}, {85,84,109}, {86,85,99}, {128,186,77}, {58,111,110}, {158,161,60}, {26,25,137}, {138,137,25}, {99,182,86}, {109,99,85}, {77,76,128}, {58,47,111}, {61,60,161}, {137,140,26}, {27,26,140}, {25,22,138}, {129,128,76}, {76,75,129}, {75,74,129}, {74,73,156}, {73,72,135}, {68,16,184}, {68,184,132}, {16,18,185}, {161,162,62}, {62,61,161}, {179,111,47}, {171,138,22}, {156,129,74}, {135,156,73}, {134,135,72}, {72,71,134}, {68,132,131}, {185,184,16}, {18,15,185}, {63,62,162}, {28,27,140}, {22,24,171}, {71,68,131}, {15,17,143}, {15,143,185}, {17,70,143}, {70,92,126}, {162,163,64}, {64,63,162}, {180,179,47}, {47,46,180}, {140,141,28}, {168,171,24}, {126,143,70}, {92,14,147}, {147,126,92}, {14,66,144}, {14,144,147}, {65,64,163}, {66,65,145}, {46,45,180}, {32,28,141}, {24,51,168}, {145,144,66}, {163,145,65}, {164,180,45}, {45,44,164}, {44,43,164}, {43,42,165}, {38,37,151}, {150,151,37}, {37,93,150}, {141,31,30}, {30,32,141}, {169,168,51}, {165,164,43}, {189,165,42}, {42,41,189}, {40,39,152}, {40,152,153}, {151,152,39}, {39,38,151}, {93,34,149}, {154,189,41}, {153,154,41}, {41,40,153}, {148,149,34}, {34,36,148}, {36,21,121}, {31,174,29}, {121,148,36}, {21,33,122}, {21,122,121}, {33,29,122}, {174,122,29}, {116,188,53}, {104,98,10}, {87,10,98}, {98,100,87}, {79,87,100}, {79,100,107}, {90,79,107}, {90,107,178}, {178,177,90}, {53,90,177}, {53,177,117}, {117,116,53}, {54,53,188}, {54,188,187}, {67,54,187}, {67,187,130}, {69,67,130}, {69,130,157}, {12,69,157}, {12,157,136}, {136,133,12}, {12,133,125}, {125,127,12}, {13,12,127}, {127,146,13}, {57,13,146}, {57,146,160}, {95,57,160}, {95,160,173}, {173,113,95}, {94,95,113}, {113,112,94}, {52,94,112}, {48,52,112}, {112,167,48}, {35,48,167}, {35,167,166}, {19,35,166}, {139,170,50}, {50,49,139}, {166,155,19}, {20,19,155}, {155,124,20}, {23,20,124}, {23,124,123}, {49,23,123}, {49,123,142}, {142,139,49}, {190,191,170}, {192,191,190}, {191,192,51}, {191,51,50}, {170,169,190}, {169,51,192}, {169,192,190}, {170,191,50}, {193,194,195}, {196,197,198}, {199,200,201}, {198,202,203}, {204,201,200}, {205,204,200}, {206,207,208}, {206,208,205}, {206,205,200}, {207,206,209}, {207,209,203}, {207,203,202}, {202,198,197}, {197,196,210}, {197,210,195}, {197,195,194}, {8,88,195}, {8,195,210}, {210,196,8}, {196,198,8}, {198,203,8}, {203,209,8}, {209,206,8}, {206,200,8}, {202,197,104}, {207,202,104}, {103,104,197}, {103,197,194}, {193,195,88}, {88,103,194}, {88,194,193}, {200,199,8}, {199,201,8}, {204,205,6}, {6,8,201}, {6,201,204}, {10,6,205}, {10,205,208}, {104,10,208}, {104,208,207} });
break;
case TestMesh::pyramid:
mesh = TriangleMesh(
- { Vec3d(10,10,40), Vec3d(0,0,0), Vec3d(20,0,0), Vec3d(20,20,0), Vec3d(0,20,0) },
- { Vec3crd(0,1,2), Vec3crd(0,3,4), Vec3crd(3,1,4), Vec3crd(1,3,2), Vec3crd(3,0,2), Vec3crd(4,1,0) });
+ { {10,10,40}, {0,0,0}, {20,0,0}, {20,20,0}, {0,20,0} },
+ { {0,1,2}, {0,3,4}, {3,1,4}, {1,3,2}, {3,0,2}, {4,1,0} });
break;
case TestMesh::two_hollow_squares:
mesh = TriangleMesh(
- { Vec3d(66.7133483886719,104.286666870117,0), Vec3d(66.7133483886719,95.7133331298828,0), Vec3d(65.6666870117188,94.6666717529297,0), Vec3d(75.2866821289062,95.7133331298828,0), Vec3d(76.3333435058594,105.333335876465,0), Vec3d(76.3333435058594,94.6666717529297,0), Vec3d(65.6666870117188,105.33332824707,0), Vec3d(75.2866821289062,104.286666870117,0), Vec3d(71.1066818237305,104.58666229248,2.79999995231628), Vec3d(66.4133529663086,104.58666229248,2.79999995231628), Vec3d(75.5866851806641,104.58666229248,2.79999995231628), Vec3d(66.4133529663086,99.8933334350586,2.79999995231628), Vec3d(66.4133529663086,95.4133377075195,2.79999995231628), Vec3d(71.1066818237305,95.4133377075195,2.79999995231628), Vec3d(75.5866851806641,95.4133377075195,2.79999995231628), Vec3d(75.5866851806641,100.106666564941,2.79999995231628), Vec3d(74.5400161743164,103.540000915527,2.79999995231628), Vec3d(70.0320129394531,103.540000915527,2.79999995231628), Vec3d(67.4600067138672,103.540000915527,2.79999995231628), Vec3d(67.4600067138672,100.968002319336,2.79999995231628), Vec3d(67.4600067138672,96.4599990844727,2.79999995231628), Vec3d(74.5400161743164,99.0319976806641,2.79999995231628), Vec3d(74.5400161743164,96.4599990844727,2.79999995231628), Vec3d(70.0320129394531,96.4599990844727,2.79999995231628), Vec3d(123.666717529297,94.6666717529297,0), Vec3d(134.333312988281,94.6666717529297,0), Vec3d(124.413360595703,95.4133377075195,2.79999995231628), Vec3d(129.106674194336,95.4133377075195,2.79999995231628), Vec3d(133.586669921875,95.4133377075195,2.79999995231628), Vec3d(123.666717529297,105.33332824707,0), Vec3d(124.413360595703,104.58666229248,2.79999995231628), Vec3d(124.413360595703,99.8933334350586,2.79999995231628), Vec3d(134.333312988281,105.33332824707,0), Vec3d(129.106674194336,104.58666229248,2.79999995231628), Vec3d(133.586669921875,104.58666229248,2.79999995231628), Vec3d(133.586669921875,100.106666564941,2.79999995231628), Vec3d(124.713317871094,104.286666870117,0), Vec3d(124.713317871094,95.7133331298828,0), Vec3d(133.286712646484,95.7133331298828,0), Vec3d(133.286712646484,104.286666870117,0), Vec3d(132.540023803711,103.540000915527,2.79999995231628), Vec3d(128.032028198242,103.540008544922,2.79999995231628), Vec3d(125.460006713867,103.540000915527,2.79999995231628), Vec3d(125.460006713867,100.968002319336,2.79999995231628), Vec3d(125.460006713867,96.4599990844727,2.79999995231628), Vec3d(132.540023803711,99.0319976806641,2.79999995231628), Vec3d(132.540023803711,96.4599990844727,2.79999995231628), Vec3d(128.032028198242,96.4599990844727,2.79999995231628) },
- { Vec3crd(0,1,2), Vec3crd(3,4,5), Vec3crd(6,4,0), Vec3crd(6,0,2), Vec3crd(2,1,5), Vec3crd(7,4,3), Vec3crd(1,3,5), Vec3crd(0,4,7), Vec3crd(4,6,8), Vec3crd(6,9,8), Vec3crd(4,8,10), Vec3crd(6,2,9), Vec3crd(2,11,9), Vec3crd(2,12,11), Vec3crd(2,5,12), Vec3crd(5,13,12), Vec3crd(5,14,13), Vec3crd(4,10,15), Vec3crd(5,4,14), Vec3crd(4,15,14), Vec3crd(7,16,17), Vec3crd(0,7,18), Vec3crd(7,17,18), Vec3crd(1,19,20), Vec3crd(1,0,19), Vec3crd(0,18,19), Vec3crd(7,3,21), Vec3crd(3,22,21), Vec3crd(7,21,16), Vec3crd(3,23,22), Vec3crd(3,1,23), Vec3crd(1,20,23), Vec3crd(24,25,26), Vec3crd(25,27,26), Vec3crd(25,28,27), Vec3crd(29,24,30), Vec3crd(24,31,30), Vec3crd(24,26,31), Vec3crd(32,29,33), Vec3crd(29,30,33), Vec3crd(32,33,34), Vec3crd(32,34,35), Vec3crd(25,32,28), Vec3crd(32,35,28), Vec3crd(36,37,24), Vec3crd(38,32,25), Vec3crd(29,32,36), Vec3crd(29,36,24), Vec3crd(24,37,25), Vec3crd(39,32,38), Vec3crd(37,38,25), Vec3crd(36,32,39), Vec3crd(39,40,41), Vec3crd(36,39,42), Vec3crd(39,41,42), Vec3crd(37,43,44), Vec3crd(37,36,43), Vec3crd(36,42,43), Vec3crd(39,38,45), Vec3crd(38,46,45), Vec3crd(39,45,40), Vec3crd(38,47,46), Vec3crd(38,37,47), Vec3crd(37,44,47), Vec3crd(16,8,9), Vec3crd(16,10,8), Vec3crd(10,16,15), Vec3crd(15,16,21), Vec3crd(22,15,21), Vec3crd(15,22,14), Vec3crd(22,23,14), Vec3crd(23,20,14), Vec3crd(17,16,9), Vec3crd(18,17,9), Vec3crd(19,18,9), Vec3crd(19,9,11), Vec3crd(19,11,20), Vec3crd(13,14,20), Vec3crd(20,11,12), Vec3crd(13,20,12), Vec3crd(41,40,30), Vec3crd(42,41,30), Vec3crd(43,42,30), Vec3crd(43,30,31), Vec3crd(43,31,44), Vec3crd(27,28,44), Vec3crd(44,31,26), Vec3crd(27,44,26), Vec3crd(40,33,30), Vec3crd(40,34,33), Vec3crd(34,40,35), Vec3crd(35,40,45), Vec3crd(46,35,45), Vec3crd(35,46,28), Vec3crd(46,47,28), Vec3crd(47,44,28) });
+ { {66.7133483886719,104.286666870117,0}, {66.7133483886719,95.7133331298828,0}, {65.6666870117188,94.6666717529297,0}, {75.2866821289062,95.7133331298828,0}, {76.3333435058594,105.333335876465,0}, {76.3333435058594,94.6666717529297,0}, {65.6666870117188,105.33332824707,0}, {75.2866821289062,104.286666870117,0}, {71.1066818237305,104.58666229248,2.79999995231628}, {66.4133529663086,104.58666229248,2.79999995231628}, {75.5866851806641,104.58666229248,2.79999995231628}, {66.4133529663086,99.8933334350586,2.79999995231628}, {66.4133529663086,95.4133377075195,2.79999995231628}, {71.1066818237305,95.4133377075195,2.79999995231628}, {75.5866851806641,95.4133377075195,2.79999995231628}, {75.5866851806641,100.106666564941,2.79999995231628}, {74.5400161743164,103.540000915527,2.79999995231628}, {70.0320129394531,103.540000915527,2.79999995231628}, {67.4600067138672,103.540000915527,2.79999995231628}, {67.4600067138672,100.968002319336,2.79999995231628}, {67.4600067138672,96.4599990844727,2.79999995231628}, {74.5400161743164,99.0319976806641,2.79999995231628}, {74.5400161743164,96.4599990844727,2.79999995231628}, {70.0320129394531,96.4599990844727,2.79999995231628}, {123.666717529297,94.6666717529297,0}, {134.333312988281,94.6666717529297,0}, {124.413360595703,95.4133377075195,2.79999995231628}, {129.106674194336,95.4133377075195,2.79999995231628}, {133.586669921875,95.4133377075195,2.79999995231628}, {123.666717529297,105.33332824707,0}, {124.413360595703,104.58666229248,2.79999995231628}, {124.413360595703,99.8933334350586,2.79999995231628}, {134.333312988281,105.33332824707,0}, {129.106674194336,104.58666229248,2.79999995231628}, {133.586669921875,104.58666229248,2.79999995231628}, {133.586669921875,100.106666564941,2.79999995231628}, {124.713317871094,104.286666870117,0}, {124.713317871094,95.7133331298828,0}, {133.286712646484,95.7133331298828,0}, {133.286712646484,104.286666870117,0}, {132.540023803711,103.540000915527,2.79999995231628}, {128.032028198242,103.540008544922,2.79999995231628}, {125.460006713867,103.540000915527,2.79999995231628}, {125.460006713867,100.968002319336,2.79999995231628}, {125.460006713867,96.4599990844727,2.79999995231628}, {132.540023803711,99.0319976806641,2.79999995231628}, {132.540023803711,96.4599990844727,2.79999995231628}, {128.032028198242,96.4599990844727,2.79999995231628} },
+ { {0,1,2}, {3,4,5}, {6,4,0}, {6,0,2}, {2,1,5}, {7,4,3}, {1,3,5}, {0,4,7}, {4,6,8}, {6,9,8}, {4,8,10}, {6,2,9}, {2,11,9}, {2,12,11}, {2,5,12}, {5,13,12}, {5,14,13}, {4,10,15}, {5,4,14}, {4,15,14}, {7,16,17}, {0,7,18}, {7,17,18}, {1,19,20}, {1,0,19}, {0,18,19}, {7,3,21}, {3,22,21}, {7,21,16}, {3,23,22}, {3,1,23}, {1,20,23}, {24,25,26}, {25,27,26}, {25,28,27}, {29,24,30}, {24,31,30}, {24,26,31}, {32,29,33}, {29,30,33}, {32,33,34}, {32,34,35}, {25,32,28}, {32,35,28}, {36,37,24}, {38,32,25}, {29,32,36}, {29,36,24}, {24,37,25}, {39,32,38}, {37,38,25}, {36,32,39}, {39,40,41}, {36,39,42}, {39,41,42}, {37,43,44}, {37,36,43}, {36,42,43}, {39,38,45}, {38,46,45}, {39,45,40}, {38,47,46}, {38,37,47}, {37,44,47}, {16,8,9}, {16,10,8}, {10,16,15}, {15,16,21}, {22,15,21}, {15,22,14}, {22,23,14}, {23,20,14}, {17,16,9}, {18,17,9}, {19,18,9}, {19,9,11}, {19,11,20}, {13,14,20}, {20,11,12}, {13,20,12}, {41,40,30}, {42,41,30}, {43,42,30}, {43,30,31}, {43,31,44}, {27,28,44}, {44,31,26}, {27,44,26}, {40,33,30}, {40,34,33}, {34,40,35}, {35,40,45}, {46,35,45}, {35,46,28}, {46,47,28}, {47,44,28} });
break;
case TestMesh::small_dorito:
mesh = TriangleMesh(
- { Vec3d(6.00058937072754,-22.9982089996338,0), Vec3d(22.0010242462158,-49.9998741149902,0), Vec3d(-9.99957847595215,-49.999870300293,0), Vec3d(6.00071382522583,-32.2371635437012,28.0019245147705), Vec3d(11.1670551300049,-37.9727020263672,18.9601669311523), Vec3d(6.00060224533081,-26.5392456054688,10.7321853637695) },
- { Vec3crd(0,1,2), Vec3crd(3,4,5), Vec3crd(2,1,4), Vec3crd(2,4,3), Vec3crd(2,3,5), Vec3crd(2,5,0), Vec3crd(5,4,1), Vec3crd(5,1,0) });
+ { {6.00058937072754,-22.9982089996338,0}, {22.0010242462158,-49.9998741149902,0}, {-9.99957847595215,-49.999870300293,0}, {6.00071382522583,-32.2371635437012,28.0019245147705}, {11.1670551300049,-37.9727020263672,18.9601669311523}, {6.00060224533081,-26.5392456054688,10.7321853637695} },
+ { {0,1,2}, {3,4,5}, {2,1,4}, {2,4,3}, {2,3,5}, {2,5,0}, {5,4,1}, {5,1,0} });
break;
case TestMesh::bridge:
mesh = TriangleMesh(
- { Vec3d(75,84.5,8), Vec3d(125,84.5,8), Vec3d(75,94.5,8), Vec3d(120,84.5,5), Vec3d(125,94.5,8), Vec3d(75,84.5,0), Vec3d(80,84.5,5), Vec3d(125,84.5,0), Vec3d(125,94.5,0), Vec3d(80,94.5,5), Vec3d(75,94.5,0), Vec3d(120,94.5,5), Vec3d(120,84.5,0), Vec3d(80,94.5,0), Vec3d(80,84.5,0), Vec3d(120,94.5,0) },
- { Vec3crd(0,1,2), Vec3crd(1,0,3), Vec3crd(2,1,4), Vec3crd(2,5,0), Vec3crd(0,6,3), Vec3crd(1,3,7), Vec3crd(1,8,4), Vec3crd(4,9,2), Vec3crd(10,5,2), Vec3crd(5,6,0), Vec3crd(6,11,3), Vec3crd(3,12,7), Vec3crd(7,8,1), Vec3crd(4,8,11), Vec3crd(4,11,9), Vec3crd(9,10,2), Vec3crd(10,13,5), Vec3crd(14,6,5), Vec3crd(9,11,6), Vec3crd(11,12,3), Vec3crd(12,8,7), Vec3crd(11,8,15), Vec3crd(13,10,9), Vec3crd(5,13,14), Vec3crd(14,13,6), Vec3crd(6,13,9), Vec3crd(15,12,11), Vec3crd(15,8,12) });
+ { {75,84.5,8}, {125,84.5,8}, {75,94.5,8}, {120,84.5,5}, {125,94.5,8}, {75,84.5,0}, {80,84.5,5}, {125,84.5,0}, {125,94.5,0}, {80,94.5,5}, {75,94.5,0}, {120,94.5,5}, {120,84.5,0}, {80,94.5,0}, {80,84.5,0}, {120,94.5,0} },
+ { {0,1,2}, {1,0,3}, {2,1,4}, {2,5,0}, {0,6,3}, {1,3,7}, {1,8,4}, {4,9,2}, {10,5,2}, {5,6,0}, {6,11,3}, {3,12,7}, {7,8,1}, {4,8,11}, {4,11,9}, {9,10,2}, {10,13,5}, {14,6,5}, {9,11,6}, {11,12,3}, {12,8,7}, {11,8,15}, {13,10,9}, {5,13,14}, {14,13,6}, {6,13,9}, {15,12,11}, {15,8,12} });
break;
case TestMesh::bridge_with_hole:
mesh = TriangleMesh(
- { Vec3d(75,69.5,8), Vec3d(80,76.9091644287109,8), Vec3d(75,94.5,8), Vec3d(125,69.5,8), Vec3d(120,76.9091644287109,8), Vec3d(120,87.0908355712891,8), Vec3d(80,87.0908355712891,8), Vec3d(125,94.5,8), Vec3d(80,87.0908355712891,5), Vec3d(120,87.0908355712891,5), Vec3d(125,94.5,0), Vec3d(120,69.5,0), Vec3d(120,94.5,0), Vec3d(125,69.5,0), Vec3d(120,94.5,5), Vec3d(80,94.5,5), Vec3d(80,94.5,0), Vec3d(75,94.5,0), Vec3d(80,69.5,5), Vec3d(80,69.5,0), Vec3d(80,76.9091644287109,5), Vec3d(120,69.5,5), Vec3d(75,69.5,0), Vec3d(120,76.9091644287109,5) },
- { Vec3crd(0,1,2), Vec3crd(1,0,3), Vec3crd(1,3,4), Vec3crd(4,3,5), Vec3crd(2,6,7), Vec3crd(6,2,1), Vec3crd(7,6,5), Vec3crd(7,5,3), Vec3crd(5,8,9), Vec3crd(8,5,6), Vec3crd(10,11,12), Vec3crd(11,10,13), Vec3crd(14,8,15), Vec3crd(8,14,9), Vec3crd(2,16,17), Vec3crd(16,2,15), Vec3crd(15,2,14), Vec3crd(14,10,12), Vec3crd(10,14,7), Vec3crd(7,14,2), Vec3crd(16,18,19), Vec3crd(18,16,20), Vec3crd(20,16,1), Vec3crd(1,16,8), Vec3crd(8,16,15), Vec3crd(6,1,8), Vec3crd(3,11,13), Vec3crd(11,3,21), Vec3crd(21,3,18), Vec3crd(18,22,19), Vec3crd(22,18,0), Vec3crd(0,18,3), Vec3crd(16,22,17), Vec3crd(22,16,19), Vec3crd(2,22,0), Vec3crd(22,2,17), Vec3crd(5,23,4), Vec3crd(23,11,21), Vec3crd(11,23,12), Vec3crd(12,23,9), Vec3crd(9,23,5), Vec3crd(12,9,14), Vec3crd(23,18,20), Vec3crd(18,23,21), Vec3crd(10,3,13), Vec3crd(3,10,7), Vec3crd(1,23,20), Vec3crd(23,1,4) });
+ { {75,69.5,8}, {80,76.9091644287109,8}, {75,94.5,8}, {125,69.5,8}, {120,76.9091644287109,8}, {120,87.0908355712891,8}, {80,87.0908355712891,8}, {125,94.5,8}, {80,87.0908355712891,5}, {120,87.0908355712891,5}, {125,94.5,0}, {120,69.5,0}, {120,94.5,0}, {125,69.5,0}, {120,94.5,5}, {80,94.5,5}, {80,94.5,0}, {75,94.5,0}, {80,69.5,5}, {80,69.5,0}, {80,76.9091644287109,5}, {120,69.5,5}, {75,69.5,0}, {120,76.9091644287109,5} },
+ { {0,1,2}, {1,0,3}, {1,3,4}, {4,3,5}, {2,6,7}, {6,2,1}, {7,6,5}, {7,5,3}, {5,8,9}, {8,5,6}, {10,11,12}, {11,10,13}, {14,8,15}, {8,14,9}, {2,16,17}, {16,2,15}, {15,2,14}, {14,10,12}, {10,14,7}, {7,14,2}, {16,18,19}, {18,16,20}, {20,16,1}, {1,16,8}, {8,16,15}, {6,1,8}, {3,11,13}, {11,3,21}, {21,3,18}, {18,22,19}, {22,18,0}, {0,18,3}, {16,22,17}, {22,16,19}, {2,22,0}, {22,2,17}, {5,23,4}, {23,11,21}, {11,23,12}, {12,23,9}, {9,23,5}, {12,9,14}, {23,18,20}, {18,23,21}, {10,3,13}, {3,10,7}, {1,23,20}, {23,1,4} });
break;
case TestMesh::step:
mesh = TriangleMesh(
- { Vec3d(0,20,5), Vec3d(0,20,0), Vec3d(0,0,5), Vec3d(0,0,0), Vec3d(20,0,0), Vec3d(20,0,5), Vec3d(1,19,5), Vec3d(1,1,5), Vec3d(19,1,5), Vec3d(20,20,5), Vec3d(19,19,5), Vec3d(20,20,0), Vec3d(19,19,10), Vec3d(1,19,10), Vec3d(1,1,10), Vec3d(19,1,10) },
- { Vec3crd(0,1,2), Vec3crd(1,3,2), Vec3crd(3,4,5), Vec3crd(2,3,5), Vec3crd(6,0,2), Vec3crd(6,2,7), Vec3crd(5,8,7), Vec3crd(5,7,2), Vec3crd(9,10,8), Vec3crd(9,8,5), Vec3crd(9,0,6), Vec3crd(9,6,10), Vec3crd(9,11,1), Vec3crd(9,1,0), Vec3crd(3,1,11), Vec3crd(4,3,11), Vec3crd(5,11,9), Vec3crd(5,4,11), Vec3crd(12,10,6), Vec3crd(12,6,13), Vec3crd(6,7,14), Vec3crd(13,6,14), Vec3crd(7,8,15), Vec3crd(14,7,15), Vec3crd(15,8,10), Vec3crd(15,10,12), Vec3crd(12,13,14), Vec3crd(12,14,15) });
+ { {0,20,5}, {0,20,0}, {0,0,5}, {0,0,0}, {20,0,0}, {20,0,5}, {1,19,5}, {1,1,5}, {19,1,5}, {20,20,5}, {19,19,5}, {20,20,0}, {19,19,10}, {1,19,10}, {1,1,10}, {19,1,10} },
+ { {0,1,2}, {1,3,2}, {3,4,5}, {2,3,5}, {6,0,2}, {6,2,7}, {5,8,7}, {5,7,2}, {9,10,8}, {9,8,5}, {9,0,6}, {9,6,10}, {9,11,1}, {9,1,0}, {3,1,11}, {4,3,11}, {5,11,9}, {5,4,11}, {12,10,6}, {12,6,13}, {6,7,14}, {13,6,14}, {7,8,15}, {14,7,15}, {15,8,10}, {15,10,12}, {12,13,14}, {12,14,15} });
break;
case TestMesh::slopy_cube:
mesh = TriangleMesh(
- { Vec3d(-10,-10,0), Vec3d(-10,-10,20), Vec3d(-10,10,0), Vec3d(-10,10,20), Vec3d(0,-10,10), Vec3d(10,-10,0), Vec3d(2.92893,-10,10), Vec3d(10,-10,2.92893), Vec3d(0,-10,20), Vec3d(10,10,0), Vec3d(0,10,10), Vec3d(0,10,20), Vec3d(2.92893,10,10), Vec3d(10,10,2.92893) },
- { Vec3crd(0,1,2), Vec3crd(2,1,3), Vec3crd(4,0,5), Vec3crd(4,1,0), Vec3crd(6,4,7), Vec3crd(7,4,5), Vec3crd(4,8,1), Vec3crd(0,2,5), Vec3crd(5,2,9), Vec3crd(2,10,9), Vec3crd(10,3,11), Vec3crd(2,3,10), Vec3crd(9,10,12), Vec3crd(13,9,12), Vec3crd(3,1,8), Vec3crd(11,3,8), Vec3crd(10,11,8), Vec3crd(4,10,8), Vec3crd(6,12,10), Vec3crd(4,6,10), Vec3crd(7,13,12), Vec3crd(6,7,12), Vec3crd(7,5,9), Vec3crd(13,7,9) });
+ { {-10,-10,0}, {-10,-10,20}, {-10,10,0}, {-10,10,20}, {0,-10,10}, {10,-10,0}, {2.92893,-10,10}, {10,-10,2.92893}, {0,-10,20}, {10,10,0}, {0,10,10}, {0,10,20}, {2.92893,10,10}, {10,10,2.92893} },
+ { {0,1,2}, {2,1,3}, {4,0,5}, {4,1,0}, {6,4,7}, {7,4,5}, {4,8,1}, {0,2,5}, {5,2,9}, {2,10,9}, {10,3,11}, {2,3,10}, {9,10,12}, {13,9,12}, {3,1,8}, {11,3,8}, {10,11,8}, {4,10,8}, {6,12,10}, {4,6,10}, {7,13,12}, {6,7,12}, {7,5,9}, {13,7,9} });
break;
default:
- throw std::invalid_argument("Slic3r::Test::mesh(): called with invalid mesh ID");
+ throw Slic3r::InvalidArgument("Slic3r::Test::mesh(): called with invalid mesh ID");
break;
}
@@ -161,14 +162,13 @@ void init_print(std::vector<TriangleMesh> &&meshes, Slic3r::Print &print, Slic3r
if (verbose_gcode())
config.set_key_value("gcode_comments", new ConfigOptionBool(true));
- for (const TriangleMesh &t : meshes) {
+ for (const TriangleMesh &t : meshes) {
ModelObject *object = model.add_object();
object->name += "object.stl";
object->add_volume(std::move(t));
object->add_instance();
}
- model.arrange_objects(PrintConfig::min_object_distance(&config));
- model.center_instances_around_point(Slic3r::Vec2d(100, 100));
+ arrange_objects(model, InfiniteBed{}, ArrangeParams{ scaled(min_object_distance(config))});
for (ModelObject *mo : model.objects) {
mo->ensure_on_bed();
print.auto_assign_extruders(mo);
@@ -244,8 +244,8 @@ std::string gcode(Print & print)
boost::filesystem::path temp = boost::filesystem::unique_path();
print.set_status_silent();
print.process();
- print.export_gcode(temp.string(), nullptr);
- std::ifstream t(temp.string());
+ print.export_gcode(temp.string(), nullptr, nullptr);
+ std::ifstream t(temp.string());
std::string str((std::istreambuf_iterator<char>(t)), std::istreambuf_iterator<char>());
boost::nowide::remove(temp.string().c_str());
return str;
diff --git a/tests/fff_print/test_model.cpp b/tests/fff_print/test_model.cpp
index 3378a8363..23c4a2d9a 100644
--- a/tests/fff_print/test_model.cpp
+++ b/tests/fff_print/test_model.cpp
@@ -2,6 +2,7 @@
#include "libslic3r/libslic3r.h"
#include "libslic3r/Model.hpp"
+#include "libslic3r/ModelArrange.hpp"
#include <boost/nowide/cstdio.hpp>
#include <boost/filesystem.hpp>
@@ -41,8 +42,7 @@ SCENARIO("Model construction", "[Model]") {
}
}
model_object->add_instance();
- model.arrange_objects(PrintConfig::min_object_distance(&config));
- model.center_instances_around_point(Slic3r::Vec2d(100, 100));
+ arrange_objects(model, InfiniteBed{scaled(Vec2d(100, 100))}, ArrangeParams{scaled(min_object_distance(config))});
model_object->ensure_on_bed();
print.auto_assign_extruders(model_object);
THEN("Print works?") {
@@ -50,8 +50,8 @@ SCENARIO("Model construction", "[Model]") {
print.apply(model, config);
print.process();
boost::filesystem::path temp = boost::filesystem::unique_path();
- print.export_gcode(temp.string(), nullptr);
- REQUIRE(boost::filesystem::exists(temp));
+ print.export_gcode(temp.string(), nullptr, nullptr);
+ REQUIRE(boost::filesystem::exists(temp));
REQUIRE(boost::filesystem::is_regular_file(temp));
REQUIRE(boost::filesystem::file_size(temp) > 0);
boost::nowide::remove(temp.string().c_str());
diff --git a/tests/fff_print/test_print.cpp b/tests/fff_print/test_print.cpp
index 484e6018e..3250443ed 100644
--- a/tests/fff_print/test_print.cpp
+++ b/tests/fff_print/test_print.cpp
@@ -2,6 +2,7 @@
#include "libslic3r/libslic3r.h"
#include "libslic3r/Print.hpp"
+#include "libslic3r/Layer.hpp"
#include "test_data.hpp"
diff --git a/tests/fff_print/test_printobject.cpp b/tests/fff_print/test_printobject.cpp
index e7c441e8c..84df95201 100644
--- a/tests/fff_print/test_printobject.cpp
+++ b/tests/fff_print/test_printobject.cpp
@@ -2,6 +2,7 @@
#include "libslic3r/libslic3r.h"
#include "libslic3r/Print.hpp"
+#include "libslic3r/Layer.hpp"
#include "test_data.hpp"
diff --git a/tests/fff_print/test_support_material.cpp b/tests/fff_print/test_support_material.cpp
index 0a38d138e..01d858132 100644
--- a/tests/fff_print/test_support_material.cpp
+++ b/tests/fff_print/test_support_material.cpp
@@ -1,6 +1,7 @@
#include <catch2/catch.hpp>
#include "libslic3r/GCodeReader.hpp"
+#include "libslic3r/Layer.hpp"
#include "test_data.hpp" // get access to init_print, etc
@@ -22,6 +23,7 @@ SCENARIO("SupportMaterial: support_layers_z and contact_distance", "[SupportMate
// Box h = 20mm, hole bottom at 5mm, hole height 10mm (top edge at 15mm).
TriangleMesh mesh = Slic3r::Test::mesh(Slic3r::Test::TestMesh::cube_with_hole);
mesh.rotate_x(float(M_PI / 2));
+// mesh.write_binary("d:\\temp\\cube_with_hole.stl");
auto check = [](Slic3r::Print &print, bool &first_support_layer_height_ok, bool &layer_height_minimum_ok, bool &layer_height_maximum_ok, bool &top_spacing_ok)
{
@@ -75,7 +77,8 @@ SCENARIO("SupportMaterial: support_layers_z and contact_distance", "[SupportMate
{ "support_material", 1 },
{ "layer_height", 0.2 },
{ "first_layer_height", 0.4 },
- });
+ { "dont_support_bridges", false },
+ });
bool a, b, c, d;
check(print, a, b, c, d);
THEN("First layer height is honored") { REQUIRE(a == true); }
@@ -89,7 +92,8 @@ SCENARIO("SupportMaterial: support_layers_z and contact_distance", "[SupportMate
{ "support_material", 1 },
{ "layer_height", 0.2 },
{ "first_layer_height", 0.3 },
- });
+ { "dont_support_bridges", false },
+ });
bool a, b, c, d;
check(print, a, b, c, d);
THEN("First layer height is honored") { REQUIRE(a == true); }
@@ -103,7 +107,8 @@ SCENARIO("SupportMaterial: support_layers_z and contact_distance", "[SupportMate
{ "support_material", 1 },
{ "layer_height", 0.2 },
{ "first_layer_height", 0.3 },
- });
+ { "dont_support_bridges", false },
+ });
bool a, b, c, d;
check(print, a, b, c, d);
THEN("First layer height is honored") { REQUIRE(a == true); }
diff --git a/tests/fff_print/test_trianglemesh.cpp b/tests/fff_print/test_trianglemesh.cpp
index 9598a3c5a..233b0e515 100644
--- a/tests/fff_print/test_trianglemesh.cpp
+++ b/tests/fff_print/test_trianglemesh.cpp
@@ -18,8 +18,8 @@ using namespace std;
SCENARIO( "TriangleMesh: Basic mesh statistics") {
GIVEN( "A 20mm cube, built from constexpr std::array" ) {
- std::vector<Vec3d> vertices { Vec3d(20,20,0), Vec3d(20,0,0), Vec3d(0,0,0), Vec3d(0,20,0), Vec3d(20,20,20), Vec3d(0,20,20), Vec3d(0,0,20), Vec3d(20,0,20) };
- std::vector<Vec3crd> facets { Vec3crd(0,1,2), Vec3crd(0,2,3), Vec3crd(4,5,6), Vec3crd(4,6,7), Vec3crd(0,4,7), Vec3crd(0,7,1), Vec3crd(1,7,6), Vec3crd(1,6,2), Vec3crd(2,6,5), Vec3crd(2,5,3), Vec3crd(4,0,3), Vec3crd(4,3,5) };
+ std::vector<Vec3d> vertices { {20,20,0}, {20,0,0}, {0,0,0}, {0,20,0}, {20,20,20}, {0,20,20}, {0,0,20}, {20,0,20} };
+ std::vector<Vec3i> facets { {0,1,2}, {0,2,3}, {4,5,6}, {4,6,7}, {0,4,7}, {0,7,1}, {1,7,6}, {1,6,2}, {2,6,5}, {2,5,3}, {4,0,3}, {4,3,5} };
TriangleMesh cube(vertices, facets);
cube.repair();
@@ -68,8 +68,8 @@ SCENARIO( "TriangleMesh: Basic mesh statistics") {
}
GIVEN( "A 20mm cube with one corner on the origin") {
- const std::vector<Vec3d> vertices { Vec3d(20,20,0), Vec3d(20,0,0), Vec3d(0,0,0), Vec3d(0,20,0), Vec3d(20,20,20), Vec3d(0,20,20), Vec3d(0,0,20), Vec3d(20,0,20) };
- const std::vector<Vec3crd> facets { Vec3crd(0,1,2), Vec3crd(0,2,3), Vec3crd(4,5,6), Vec3crd(4,6,7), Vec3crd(0,4,7), Vec3crd(0,7,1), Vec3crd(1,7,6), Vec3crd(1,6,2), Vec3crd(2,6,5), Vec3crd(2,5,3), Vec3crd(4,0,3), Vec3crd(4,3,5) };
+ const std::vector<Vec3d> vertices { {20,20,0}, {20,0,0}, {0,0,0}, {0,20,0}, {20,20,20}, {0,20,20}, {0,0,20}, {20,0,20} };
+ const std::vector<Vec3i> facets { {0,1,2}, {0,2,3}, {4,5,6}, {4,6,7}, {0,4,7}, {0,7,1}, {1,7,6}, {1,6,2}, {2,6,5}, {2,5,3}, {4,0,3}, {4,3,5} };
TriangleMesh cube(vertices, facets);
cube.repair();
@@ -121,8 +121,8 @@ SCENARIO( "TriangleMesh: Basic mesh statistics") {
SCENARIO( "TriangleMesh: Transformation functions affect mesh as expected.") {
GIVEN( "A 20mm cube with one corner on the origin") {
- const std::vector<Vec3d> vertices { Vec3d(20,20,0), Vec3d(20,0,0), Vec3d(0,0,0), Vec3d(0,20,0), Vec3d(20,20,20), Vec3d(0,20,20), Vec3d(0,0,20), Vec3d(20,0,20) };
- const std::vector<Vec3crd> facets { Vec3crd(0,1,2), Vec3crd(0,2,3), Vec3crd(4,5,6), Vec3crd(4,6,7), Vec3crd(0,4,7), Vec3crd(0,7,1), Vec3crd(1,7,6), Vec3crd(1,6,2), Vec3crd(2,6,5), Vec3crd(2,5,3), Vec3crd(4,0,3), Vec3crd(4,3,5) };
+ const std::vector<Vec3d> vertices { {20,20,0}, {20,0,0}, {0,0,0}, {0,20,0}, {20,20,20}, {0,20,20}, {0,0,20}, {20,0,20} };
+ const std::vector<Vec3i> facets { {0,1,2}, {0,2,3}, {4,5,6}, {4,6,7}, {0,4,7}, {0,7,1}, {1,7,6}, {1,6,2}, {2,6,5}, {2,5,3}, {4,0,3}, {4,3,5} };
TriangleMesh cube(vertices, facets);
cube.repair();
@@ -184,8 +184,8 @@ SCENARIO( "TriangleMesh: Transformation functions affect mesh as expected.") {
SCENARIO( "TriangleMesh: slice behavior.") {
GIVEN( "A 20mm cube with one corner on the origin") {
- const std::vector<Vec3d> vertices { Vec3d(20,20,0), Vec3d(20,0,0), Vec3d(0,0,0), Vec3d(0,20,0), Vec3d(20,20,20), Vec3d(0,20,20), Vec3d(0,0,20), Vec3d(20,0,20) };
- const std::vector<Vec3crd> facets { Vec3crd(0,1,2), Vec3crd(0,2,3), Vec3crd(4,5,6), Vec3crd(4,6,7), Vec3crd(0,4,7), Vec3crd(0,7,1), Vec3crd(1,7,6), Vec3crd(1,6,2), Vec3crd(2,6,5), Vec3crd(2,5,3), Vec3crd(4,0,3), Vec3crd(4,3,5) };
+ const std::vector<Vec3d> vertices { {20,20,0}, {20,0,0}, {0,0,0}, {0,20,0}, {20,20,20}, {0,20,20}, {0,0,20}, {20,0,20} };
+ const std::vector<Vec3i> facets { {0,1,2}, {0,2,3}, {4,5,6}, {4,6,7}, {0,4,7}, {0,7,1}, {1,7,6}, {1,6,2}, {2,6,5}, {2,5,3}, {4,0,3}, {4,3,5} };
TriangleMesh cube(vertices, facets);
cube.repair();
@@ -205,8 +205,8 @@ SCENARIO( "TriangleMesh: slice behavior.") {
}
}
GIVEN( "A STL with an irregular shape.") {
- const std::vector<Vec3d> vertices {Vec3d(0,0,0),Vec3d(0,0,20),Vec3d(0,5,0),Vec3d(0,5,20),Vec3d(50,0,0),Vec3d(50,0,20),Vec3d(15,5,0),Vec3d(35,5,0),Vec3d(15,20,0),Vec3d(50,5,0),Vec3d(35,20,0),Vec3d(15,5,10),Vec3d(50,5,20),Vec3d(35,5,10),Vec3d(35,20,10),Vec3d(15,20,10)};
- const std::vector<Vec3crd> facets {Vec3crd(0,1,2),Vec3crd(2,1,3),Vec3crd(1,0,4),Vec3crd(5,1,4),Vec3crd(0,2,4),Vec3crd(4,2,6),Vec3crd(7,6,8),Vec3crd(4,6,7),Vec3crd(9,4,7),Vec3crd(7,8,10),Vec3crd(2,3,6),Vec3crd(11,3,12),Vec3crd(7,12,9),Vec3crd(13,12,7),Vec3crd(6,3,11),Vec3crd(11,12,13),Vec3crd(3,1,5),Vec3crd(12,3,5),Vec3crd(5,4,9),Vec3crd(12,5,9),Vec3crd(13,7,10),Vec3crd(14,13,10),Vec3crd(8,15,10),Vec3crd(10,15,14),Vec3crd(6,11,8),Vec3crd(8,11,15),Vec3crd(15,11,13),Vec3crd(14,15,13)};
+ const std::vector<Vec3d> vertices {{0,0,0},{0,0,20},{0,5,0},{0,5,20},{50,0,0},{50,0,20},{15,5,0},{35,5,0},{15,20,0},{50,5,0},{35,20,0},{15,5,10},{50,5,20},{35,5,10},{35,20,10},{15,20,10}};
+ const std::vector<Vec3i> facets {{0,1,2},{2,1,3},{1,0,4},{5,1,4},{0,2,4},{4,2,6},{7,6,8},{4,6,7},{9,4,7},{7,8,10},{2,3,6},{11,3,12},{7,12,9},{13,12,7},{6,3,11},{11,12,13},{3,1,5},{12,3,5},{5,4,9},{12,5,9},{13,7,10},{14,13,10},{8,15,10},{10,15,14},{6,11,8},{8,11,15},{15,11,13},{14,15,13}};
TriangleMesh cube(vertices, facets);
cube.repair();
@@ -277,7 +277,6 @@ SCENARIO( "make_xxx functions produce meshes.") {
GIVEN("make_sphere() function") {
WHEN("make_sphere() is called with arguments 10, PI / 3") {
TriangleMesh sph = make_sphere(10, PI / 243.0);
- double angle = (2.0*PI / floor(2.0*PI / (PI / 243.0)));
THEN("Resulting mesh has one point at 0,0,-10 and one at 0,0,10") {
const std::vector<stl_vertex> &verts = sph.its.vertices;
REQUIRE(std::count_if(verts.begin(), verts.end(), [](const Vec3f& t) { return is_approx(t, Vec3f(0.f, 0.f, 10.f)); } ) == 1);
@@ -295,8 +294,8 @@ SCENARIO( "make_xxx functions produce meshes.") {
SCENARIO( "TriangleMesh: split functionality.") {
GIVEN( "A 20mm cube with one corner on the origin") {
- const std::vector<Vec3d> vertices { Vec3d(20,20,0), Vec3d(20,0,0), Vec3d(0,0,0), Vec3d(0,20,0), Vec3d(20,20,20), Vec3d(0,20,20), Vec3d(0,0,20), Vec3d(20,0,20) };
- const std::vector<Vec3crd> facets { Vec3crd(0,1,2), Vec3crd(0,2,3), Vec3crd(4,5,6), Vec3crd(4,6,7), Vec3crd(0,4,7), Vec3crd(0,7,1), Vec3crd(1,7,6), Vec3crd(1,6,2), Vec3crd(2,6,5), Vec3crd(2,5,3), Vec3crd(4,0,3), Vec3crd(4,3,5) };
+ const std::vector<Vec3d> vertices { {20,20,0}, {20,0,0}, {0,0,0}, {0,20,0}, {20,20,20}, {0,20,20}, {0,0,20}, {20,0,20} };
+ const std::vector<Vec3i> facets { {0,1,2}, {0,2,3}, {4,5,6}, {4,6,7}, {0,4,7}, {0,7,1}, {1,7,6}, {1,6,2}, {2,6,5}, {2,5,3}, {4,0,3}, {4,3,5} };
TriangleMesh cube(vertices, facets);
cube.repair();
@@ -309,8 +308,8 @@ SCENARIO( "TriangleMesh: split functionality.") {
}
}
GIVEN( "Two 20mm cubes, each with one corner on the origin, merged into a single TriangleMesh") {
- const std::vector<Vec3d> vertices { Vec3d(20,20,0), Vec3d(20,0,0), Vec3d(0,0,0), Vec3d(0,20,0), Vec3d(20,20,20), Vec3d(0,20,20), Vec3d(0,0,20), Vec3d(20,0,20) };
- const std::vector<Vec3crd> facets { Vec3crd(0,1,2), Vec3crd(0,2,3), Vec3crd(4,5,6), Vec3crd(4,6,7), Vec3crd(0,4,7), Vec3crd(0,7,1), Vec3crd(1,7,6), Vec3crd(1,6,2), Vec3crd(2,6,5), Vec3crd(2,5,3), Vec3crd(4,0,3), Vec3crd(4,3,5) };
+ const std::vector<Vec3d> vertices { {20,20,0}, {20,0,0}, {0,0,0}, {0,20,0}, {20,20,20}, {0,20,20}, {0,0,20}, {20,0,20} };
+ const std::vector<Vec3i> facets { {0,1,2}, {0,2,3}, {4,5,6}, {4,6,7}, {0,4,7}, {0,7,1}, {1,7,6}, {1,6,2}, {2,6,5}, {2,5,3}, {4,0,3}, {4,3,5} };
TriangleMesh cube(vertices, facets);
cube.repair();
@@ -330,8 +329,8 @@ SCENARIO( "TriangleMesh: split functionality.") {
SCENARIO( "TriangleMesh: Mesh merge functions") {
GIVEN( "Two 20mm cubes, each with one corner on the origin") {
- const std::vector<Vec3d> vertices { Vec3d(20,20,0), Vec3d(20,0,0), Vec3d(0,0,0), Vec3d(0,20,0), Vec3d(20,20,20), Vec3d(0,20,20), Vec3d(0,0,20), Vec3d(20,0,20) };
- const std::vector<Vec3crd> facets { Vec3crd(0,1,2), Vec3crd(0,2,3), Vec3crd(4,5,6), Vec3crd(4,6,7), Vec3crd(0,4,7), Vec3crd(0,7,1), Vec3crd(1,7,6), Vec3crd(1,6,2), Vec3crd(2,6,5), Vec3crd(2,5,3), Vec3crd(4,0,3), Vec3crd(4,3,5) };
+ const std::vector<Vec3d> vertices { {20,20,0}, {20,0,0}, {0,0,0}, {0,20,0}, {20,20,20}, {0,20,20}, {0,0,20}, {20,0,20} };
+ const std::vector<Vec3i> facets { {0,1,2}, {0,2,3}, {4,5,6}, {4,6,7}, {0,4,7}, {0,7,1}, {1,7,6}, {1,6,2}, {2,6,5}, {2,5,3}, {4,0,3}, {4,3,5} };
TriangleMesh cube(vertices, facets);
cube.repair();
@@ -350,8 +349,8 @@ SCENARIO( "TriangleMesh: Mesh merge functions") {
SCENARIO( "TriangleMeshSlicer: Cut behavior.") {
GIVEN( "A 20mm cube with one corner on the origin") {
- const std::vector<Vec3d> vertices { Vec3d(20,20,0), Vec3d(20,0,0), Vec3d(0,0,0), Vec3d(0,20,0), Vec3d(20,20,20), Vec3d(0,20,20), Vec3d(0,0,20), Vec3d(20,0,20) };
- const std::vector<Vec3crd> facets { Vec3crd(0,1,2), Vec3crd(0,2,3), Vec3crd(4,5,6), Vec3crd(4,6,7), Vec3crd(0,4,7), Vec3crd(0,7,1), Vec3crd(1,7,6), Vec3crd(1,6,2), Vec3crd(2,6,5), Vec3crd(2,5,3), Vec3crd(4,0,3), Vec3crd(4,3,5) };
+ const std::vector<Vec3d> vertices { {20,20,0}, {20,0,0}, {0,0,0}, {0,20,0}, {20,20,20}, {0,20,20}, {0,0,20}, {20,0,20} };
+ const std::vector<Vec3i> facets { {0,1,2}, {0,2,3}, {4,5,6}, {4,6,7}, {0,4,7}, {0,7,1}, {1,7,6}, {1,6,2}, {2,6,5}, {2,5,3}, {4,0,3}, {4,3,5} };
TriangleMesh cube(vertices, facets);
cube.repair();
diff --git a/tests/libnest2d/libnest2d_tests_main.cpp b/tests/libnest2d/libnest2d_tests_main.cpp
index c7259ae53..a0f192460 100644
--- a/tests/libnest2d/libnest2d_tests_main.cpp
+++ b/tests/libnest2d/libnest2d_tests_main.cpp
@@ -1,6 +1,7 @@
#include <catch_main.hpp>
#include <fstream>
+#include <cstdint>
#include <libnest2d/libnest2d.hpp>
#include "printer_parts.hpp"
@@ -472,32 +473,30 @@ TEST_CASE("ArrangeRectanglesLoose", "[Nesting]")
namespace {
using namespace libnest2d;
-template<long long SCALE = 1, class Bin>
-void exportSVG(std::vector<std::reference_wrapper<Item>>& result, const Bin& bin, int idx = 0) {
- std::string loc = "out";
+template<int64_t SCALE = 1, class It>
+void exportSVG(const char *loc, It from, It to) {
- static std::string svg_header =
- R"raw(<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+ static const char* svg_header =
+R"raw(<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.0//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg height="500" width="500" xmlns="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
)raw";
- int i = idx;
- auto r = result;
// for(auto r : result) {
- std::fstream out(loc + std::to_string(i) + ".svg", std::fstream::out);
+ std::fstream out(loc, std::fstream::out);
if(out.is_open()) {
out << svg_header;
- Item rbin( RectangleItem(bin.width(), bin.height()) );
- for(unsigned j = 0; j < rbin.vertexCount(); j++) {
- auto v = rbin.vertex(j);
- setY(v, -getY(v)/SCALE + 500 );
- setX(v, getX(v)/SCALE);
- rbin.setVertex(j, v);
- }
- out << shapelike::serialize<Formats::SVG>(rbin.rawShape()) << std::endl;
- for(Item& sh : r) {
- Item tsh(sh.transformedShape());
+// Item rbin( RectangleItem(bin.width(), bin.height()) );
+// for(unsigned j = 0; j < rbin.vertexCount(); j++) {
+// auto v = rbin.vertex(j);
+// setY(v, -getY(v)/SCALE + 500 );
+// setX(v, getX(v)/SCALE);
+// rbin.setVertex(j, v);
+// }
+// out << shapelike::serialize<Formats::SVG>(rbin.rawShape()) << std::endl;
+ for(auto it = from; it != to; ++it) {
+ const Item &itm = *it;
+ Item tsh(itm.transformedShape());
for(unsigned j = 0; j < tsh.vertexCount(); j++) {
auto v = tsh.vertex(j);
setY(v, -getY(v)/SCALE + 500);
@@ -509,10 +508,16 @@ void exportSVG(std::vector<std::reference_wrapper<Item>>& result, const Bin& bin
out << "\n</svg>" << std::endl;
}
out.close();
-
+
// i++;
// }
}
+
+template<int64_t SCALE = 1>
+void exportSVG(std::vector<std::reference_wrapper<Item>>& result, int idx = 0) {
+ exportSVG((std::string("out") + std::to_string(idx) + ".svg").c_str(),
+ result.begin(), result.end());
+}
}
TEST_CASE("BottomLeftStressTest", "[Geometry]") {
@@ -541,7 +546,7 @@ TEST_CASE("BottomLeftStressTest", "[Geometry]") {
valid = (valid && !r1.isInside(r2) && !r2.isInside(r1));
if(!valid) {
std::cout << "error index: " << i << std::endl;
- exportSVG(result, bin, i);
+ exportSVG<SCALE>(result, i);
}
REQUIRE(valid);
} else {
@@ -894,7 +899,7 @@ void testNfp(const std::vector<ItemPair>& testdata) {
int TEST_CASEcase = 0;
- auto& exportfun = exportSVG<SCALE, Box>;
+ auto& exportfun = exportSVG<SCALE>;
auto onetest = [&](Item& orbiter, Item& stationary, unsigned /*testidx*/){
TEST_CASEcase++;
@@ -941,7 +946,7 @@ void testNfp(const std::vector<ItemPair>& testdata) {
std::ref(stationary), std::ref(tmp), std::ref(infp)
};
- exportfun(inp, bin, TEST_CASEcase*i++);
+ exportfun(inp, TEST_CASEcase*i++);
}
REQUIRE(touching);
@@ -1096,3 +1101,91 @@ TEST_CASE("MinAreaBBWithRotatingCalipers", "[Geometry]") {
REQUIRE(succ);
}
}
+
+template<class It> MultiPolygon merged_pile(It from, It to, int bin_id)
+{
+ MultiPolygon pile;
+ pile.reserve(size_t(to - from));
+
+ for (auto it = from; it != to; ++it) {
+ if (it->binId() == bin_id) pile.emplace_back(it->transformedShape());
+ }
+
+ return nfp::merge(pile);
+}
+
+TEST_CASE("Test for bed center distance optimization", "[Nesting], [NestKernels]")
+{
+ static const constexpr ClipperLib::cInt W = 10000000;
+
+ // Get the input items and define the bin.
+ std::vector<RectangleItem> input(9, {W, W});
+
+ auto bin = Box::infinite();
+
+ NfpPlacer::Config pconfig;
+
+ pconfig.object_function = [](const Item &item) -> double {
+ return pl::magnsq<PointImpl, double>(item.boundingBox().center());
+ };
+
+ size_t bins = nest(input, bin, 0, NestConfig{pconfig});
+
+ REQUIRE(bins == 1);
+
+ // Gather the items into piles of arranged polygons...
+ MultiPolygon pile;
+ pile.reserve(input.size());
+
+ for (auto &itm : input) {
+ REQUIRE(itm.binId() == 0);
+ pile.emplace_back(itm.transformedShape());
+ }
+
+ MultiPolygon m = merged_pile(input.begin(), input.end(), 0);
+
+ REQUIRE(m.size() == 1);
+
+ REQUIRE(sl::area(m) == Approx(9. * W * W));
+}
+
+TEST_CASE("Test for biggest bounding box area", "[Nesting], [NestKernels]")
+{
+ static const constexpr ClipperLib::cInt W = 10000000;
+ static const constexpr size_t N = 100;
+
+ // Get the input items and define the bin.
+ std::vector<RectangleItem> input(N, {W, W});
+
+ auto bin = Box::infinite();
+
+ NfpPlacer::Config pconfig;
+ pconfig.rotations = {0.};
+ Box pile_box;
+ pconfig.before_packing =
+ [&pile_box](const MultiPolygon &pile,
+ const _ItemGroup<PolygonImpl> &/*packed_items*/,
+ const _ItemGroup<PolygonImpl> &/*remaining_items*/) {
+ pile_box = sl::boundingBox(pile);
+ };
+
+ pconfig.object_function = [&pile_box](const Item &item) -> double {
+ Box b = sl::boundingBox(item.boundingBox(), pile_box);
+ double area = b.area<double>() / (W * W);
+ return -area;
+ };
+
+ size_t bins = nest(input, bin, 0, NestConfig{pconfig});
+
+ // To debug:
+ exportSVG<1000000>("out", input.begin(), input.end());
+
+ REQUIRE(bins == 1);
+
+ MultiPolygon pile = merged_pile(input.begin(), input.end(), 0);
+ Box bb = sl::boundingBox(pile);
+
+ // Here the result shall be a stairway of boxes
+ REQUIRE(pile.size() == N);
+ REQUIRE(bb.area() == N * N * W * W);
+}
diff --git a/tests/libslic3r/CMakeLists.txt b/tests/libslic3r/CMakeLists.txt
index 2353414f9..501af0c6f 100644
--- a/tests/libslic3r/CMakeLists.txt
+++ b/tests/libslic3r/CMakeLists.txt
@@ -3,6 +3,7 @@ get_filename_component(_TEST_NAME ${CMAKE_CURRENT_LIST_DIR} NAME)
add_executable(${_TEST_NAME}_tests
${_TEST_NAME}_tests.cpp
test_3mf.cpp
+ test_aabbindirect.cpp
test_clipper_offset.cpp
test_clipper_utils.cpp
test_config.cpp
@@ -11,9 +12,14 @@ add_executable(${_TEST_NAME}_tests
test_placeholder_parser.cpp
test_polygon.cpp
test_stl.cpp
- test_meshsimplify.cpp
- test_meshboolean.cpp
- test_timeutils.cpp
+ test_meshsimplify.cpp
+ test_meshboolean.cpp
+ test_marchingsquares.cpp
+ test_timeutils.cpp
+ test_voronoi.cpp
+ test_optimizers.cpp
+ test_png_io.cpp
+ test_timeutils.cpp
)
if (TARGET OpenVDB::openvdb)
diff --git a/tests/libslic3r/test_aabbindirect.cpp b/tests/libslic3r/test_aabbindirect.cpp
new file mode 100644
index 000000000..c0792a943
--- /dev/null
+++ b/tests/libslic3r/test_aabbindirect.cpp
@@ -0,0 +1,61 @@
+#include <catch2/catch.hpp>
+#include <test_utils.hpp>
+
+#include <libslic3r/TriangleMesh.hpp>
+#include <libslic3r/AABBTreeIndirect.hpp>
+
+using namespace Slic3r;
+
+TEST_CASE("Building a tree over a box, ray caster and closest query", "[AABBIndirect]")
+{
+ TriangleMesh tmesh = make_cube(1., 1., 1.);
+ tmesh.repair();
+
+ auto tree = AABBTreeIndirect::build_aabb_tree_over_indexed_triangle_set(tmesh.its.vertices, tmesh.its.indices);
+ REQUIRE(! tree.empty());
+
+ igl::Hit hit;
+ bool intersected = AABBTreeIndirect::intersect_ray_first_hit(
+ tmesh.its.vertices, tmesh.its.indices,
+ tree,
+ Vec3d(0.5, 0.5, -5.),
+ Vec3d(0., 0., 1.),
+ hit);
+
+ REQUIRE(intersected);
+ REQUIRE(hit.t == Approx(5.));
+
+ std::vector<igl::Hit> hits;
+ bool intersected2 = AABBTreeIndirect::intersect_ray_all_hits(
+ tmesh.its.vertices, tmesh.its.indices,
+ tree,
+ Vec3d(0.3, 0.5, -5.),
+ Vec3d(0., 0., 1.),
+ hits);
+ REQUIRE(intersected2);
+ REQUIRE(hits.size() == 2);
+ REQUIRE(hits.front().t == Approx(5.));
+ REQUIRE(hits.back().t == Approx(6.));
+
+ size_t hit_idx;
+ Vec3d closest_point;
+ double squared_distance = AABBTreeIndirect::squared_distance_to_indexed_triangle_set(
+ tmesh.its.vertices, tmesh.its.indices,
+ tree,
+ Vec3d(0.3, 0.5, -5.),
+ hit_idx, closest_point);
+ REQUIRE(squared_distance == Approx(5. * 5.));
+ REQUIRE(closest_point.x() == Approx(0.3));
+ REQUIRE(closest_point.y() == Approx(0.5));
+ REQUIRE(closest_point.z() == Approx(0.));
+
+ squared_distance = AABBTreeIndirect::squared_distance_to_indexed_triangle_set(
+ tmesh.its.vertices, tmesh.its.indices,
+ tree,
+ Vec3d(0.3, 0.5, 5.),
+ hit_idx, closest_point);
+ REQUIRE(squared_distance == Approx(4. * 4.));
+ REQUIRE(closest_point.x() == Approx(0.3));
+ REQUIRE(closest_point.y() == Approx(0.5));
+ REQUIRE(closest_point.z() == Approx(1.));
+}
diff --git a/tests/libslic3r/test_clipper_offset.cpp b/tests/libslic3r/test_clipper_offset.cpp
index f40856a63..8209d99bf 100644
--- a/tests/libslic3r/test_clipper_offset.cpp
+++ b/tests/libslic3r/test_clipper_offset.cpp
@@ -15,7 +15,7 @@ SCENARIO("Constant offset", "[ClipperUtils]") {
coord_t s = 1000000;
GIVEN("20mm box") {
ExPolygon box20mm;
- box20mm.contour.points = { { 0, 0 }, { 20 * s, 0 }, { 20 * s, 20 * s}, { 0, 20 * s} };
+ box20mm.contour.points = { Vec2crd{ 0, 0 }, Vec2crd{ 20 * s, 0 }, Vec2crd{ 20 * s, 20 * s}, Vec2crd{ 0, 20 * s} };
std::vector<float> deltas_plus(box20mm.contour.points.size(), 1. * s);
std::vector<float> deltas_minus(box20mm.contour.points.size(), - 1. * s);
Polygons output;
@@ -87,8 +87,8 @@ SCENARIO("Constant offset", "[ClipperUtils]") {
GIVEN("20mm box with 10mm hole") {
ExPolygon box20mm;
- box20mm.contour.points = { { 0, 0 }, { 20 * s, 0 }, { 20 * s, 20 * s}, { 0, 20 * s} };
- box20mm.holes.emplace_back(Slic3r::Polygon({ { 5 * s, 5 * s }, { 5 * s, 15 * s}, { 15 * s, 15 * s}, { 15 * s, 5 * s } }));
+ box20mm.contour.points = { Vec2crd{ 0, 0 }, Vec2crd{ 20 * s, 0 }, Vec2crd{ 20 * s, 20 * s}, Vec2crd{ 0, 20 * s} };
+ box20mm.holes.emplace_back(Slic3r::Polygon({ Vec2crd{ 5 * s, 5 * s }, Vec2crd{ 5 * s, 15 * s}, Vec2crd{ 15 * s, 15 * s}, Vec2crd{ 15 * s, 5 * s } }));
std::vector<float> deltas_plus(box20mm.contour.points.size(), 1. * s);
std::vector<float> deltas_minus(box20mm.contour.points.size(), -1. * s);
ExPolygons output;
@@ -164,7 +164,7 @@ SCENARIO("Constant offset", "[ClipperUtils]") {
GIVEN("20mm right angle triangle") {
ExPolygon triangle20mm;
- triangle20mm.contour.points = { { 0, 0 }, { 20 * s, 0 }, { 0, 20 * s} };
+ triangle20mm.contour.points = { Vec2crd{ 0, 0 }, Vec2crd{ 20 * s, 0 }, Vec2crd{ 0, 20 * s } };
Polygons output;
double offset = 1.;
// Angle of the sharp corner bisector.
diff --git a/tests/libslic3r/test_clipper_utils.cpp b/tests/libslic3r/test_clipper_utils.cpp
index 69e9d0efb..a660b29cb 100644
--- a/tests/libslic3r/test_clipper_utils.cpp
+++ b/tests/libslic3r/test_clipper_utils.cpp
@@ -246,7 +246,7 @@ TEST_CASE("Traversing Clipper PolyTree", "[ClipperUtils]") {
// Create a polygon representing unit box
Polygon unitbox;
const auto UNIT = coord_t(1. / SCALING_FACTOR);
- unitbox.points = {{0, 0}, {UNIT, 0}, {UNIT, UNIT}, {0, UNIT}};
+ unitbox.points = { Vec2crd{0, 0}, Vec2crd{UNIT, 0}, Vec2crd{UNIT, UNIT}, Vec2crd{0, UNIT}};
Polygon box_frame = unitbox;
box_frame.scale(20, 10);
diff --git a/tests/libslic3r/test_config.cpp b/tests/libslic3r/test_config.cpp
index 85055aa65..c3f17def2 100644
--- a/tests/libslic3r/test_config.cpp
+++ b/tests/libslic3r/test_config.cpp
@@ -98,21 +98,21 @@ SCENARIO("Config accessor functions perform as expected.", "[Config]") {
}
}
WHEN("A string option is set through the string interface") {
- config.set("printhost_apikey", "100");
+ config.set("end_gcode", "100");
THEN("The underlying value is set correctly.") {
- REQUIRE(config.opt<ConfigOptionString>("printhost_apikey")->value == "100");
+ REQUIRE(config.opt<ConfigOptionString>("end_gcode")->value == "100");
}
}
WHEN("A string option is set through the integer interface") {
- config.set("printhost_apikey", 100);
+ config.set("end_gcode", 100);
THEN("The underlying value is set correctly.") {
- REQUIRE(config.opt<ConfigOptionString>("printhost_apikey")->value == "100");
+ REQUIRE(config.opt<ConfigOptionString>("end_gcode")->value == "100");
}
}
WHEN("A string option is set through the double interface") {
- config.set("printhost_apikey", 100.5);
+ config.set("end_gcode", 100.5);
THEN("The underlying value is set correctly.") {
- REQUIRE(config.opt<ConfigOptionString>("printhost_apikey")->value == std::to_string(100.5));
+ REQUIRE(config.opt<ConfigOptionString>("end_gcode")->value == std::to_string(100.5));
}
}
WHEN("A float or percent is set as a percent through the string interface.") {
diff --git a/tests/libslic3r/test_elephant_foot_compensation.cpp b/tests/libslic3r/test_elephant_foot_compensation.cpp
index 616c0c6ad..a571e8d03 100644
--- a/tests/libslic3r/test_elephant_foot_compensation.cpp
+++ b/tests/libslic3r/test_elephant_foot_compensation.cpp
@@ -519,7 +519,7 @@ SCENARIO("Elephant foot compensation", "[ElephantFoot]") {
// Rectangle
ExPolygon expoly;
coord_t scaled_w = coord_t(scale_(10));
- expoly.contour.points = { { 0, 0 }, { 0, scaled_w, }, { scaled_w, scaled_w }, { scaled_w, 0 } };
+ expoly.contour.points = { Vec2crd{ 0, 0 }, Vec2crd{ 0, scaled_w, }, Vec2crd{ scaled_w, scaled_w }, Vec2crd{ scaled_w, 0 } };
// Narrow part
ExPolygon expoly2;
coord_t scaled_h = coord_t(scale_(0.8));
diff --git a/tests/libslic3r/test_geometry.cpp b/tests/libslic3r/test_geometry.cpp
index 6f2bd1c39..24e0908cc 100644
--- a/tests/libslic3r/test_geometry.cpp
+++ b/tests/libslic3r/test_geometry.cpp
@@ -168,21 +168,21 @@ SCENARIO("Circle Fit, TaubinFit with Newton's method", "[Geometry]") {
WHEN("Circle fit is called on the entire array") {
Vec2d result_center(0,0);
- result_center = Geometry::circle_taubin_newton(sample);
+ result_center = Geometry::circle_center_taubin_newton(sample);
THEN("A center point of -6,0 is returned.") {
REQUIRE(is_approx(result_center, expected_center));
}
}
WHEN("Circle fit is called on the first four points") {
Vec2d result_center(0,0);
- result_center = Geometry::circle_taubin_newton(sample.cbegin(), sample.cbegin()+4);
+ result_center = Geometry::circle_center_taubin_newton(sample.cbegin(), sample.cbegin()+4);
THEN("A center point of -6,0 is returned.") {
REQUIRE(is_approx(result_center, expected_center));
}
}
WHEN("Circle fit is called on the middle four points") {
Vec2d result_center(0,0);
- result_center = Geometry::circle_taubin_newton(sample.cbegin()+2, sample.cbegin()+6);
+ result_center = Geometry::circle_center_taubin_newton(sample.cbegin()+2, sample.cbegin()+6);
THEN("A center point of -6,0 is returned.") {
REQUIRE(is_approx(result_center, expected_center));
}
@@ -199,21 +199,21 @@ SCENARIO("Circle Fit, TaubinFit with Newton's method", "[Geometry]") {
WHEN("Circle fit is called on the entire array") {
Vec2d result_center(0,0);
- result_center = Geometry::circle_taubin_newton(sample);
+ result_center = Geometry::circle_center_taubin_newton(sample);
THEN("A center point of 3,9 is returned.") {
REQUIRE(is_approx(result_center, expected_center));
}
}
WHEN("Circle fit is called on the first four points") {
Vec2d result_center(0,0);
- result_center = Geometry::circle_taubin_newton(sample.cbegin(), sample.cbegin()+4);
+ result_center = Geometry::circle_center_taubin_newton(sample.cbegin(), sample.cbegin()+4);
THEN("A center point of 3,9 is returned.") {
REQUIRE(is_approx(result_center, expected_center));
}
}
WHEN("Circle fit is called on the middle four points") {
Vec2d result_center(0,0);
- result_center = Geometry::circle_taubin_newton(sample.cbegin()+2, sample.cbegin()+6);
+ result_center = Geometry::circle_center_taubin_newton(sample.cbegin()+2, sample.cbegin()+6);
THEN("A center point of 3,9 is returned.") {
REQUIRE(is_approx(result_center, expected_center));
}
@@ -230,21 +230,21 @@ SCENARIO("Circle Fit, TaubinFit with Newton's method", "[Geometry]") {
WHEN("Circle fit is called on the entire array") {
Point result_center(0,0);
- result_center = Geometry::circle_taubin_newton(sample);
+ result_center = Geometry::circle_center_taubin_newton(sample);
THEN("A center point of scaled 3,9 is returned.") {
REQUIRE(is_approx(result_center, expected_center));
}
}
WHEN("Circle fit is called on the first four points") {
Point result_center(0,0);
- result_center = Geometry::circle_taubin_newton(sample.cbegin(), sample.cbegin()+4);
+ result_center = Geometry::circle_center_taubin_newton(sample.cbegin(), sample.cbegin()+4);
THEN("A center point of scaled 3,9 is returned.") {
REQUIRE(is_approx(result_center, expected_center));
}
}
WHEN("Circle fit is called on the middle four points") {
Point result_center(0,0);
- result_center = Geometry::circle_taubin_newton(sample.cbegin()+2, sample.cbegin()+6);
+ result_center = Geometry::circle_center_taubin_newton(sample.cbegin()+2, sample.cbegin()+6);
THEN("A center point of scaled 3,9 is returned.") {
REQUIRE(is_approx(result_center, expected_center));
}
diff --git a/tests/libslic3r/test_marchingsquares.cpp b/tests/libslic3r/test_marchingsquares.cpp
new file mode 100644
index 000000000..e9e016157
--- /dev/null
+++ b/tests/libslic3r/test_marchingsquares.cpp
@@ -0,0 +1,376 @@
+#define NOMINMAX
+
+#include <catch2/catch.hpp>
+#include <test_utils.hpp>
+
+#include <fstream>
+
+#include <libslic3r/MarchingSquares.hpp>
+#include <libslic3r/SLA/RasterToPolygons.hpp>
+
+#include <libslic3r/SLA/AGGRaster.hpp>
+#include <libslic3r/MTUtils.hpp>
+#include <libslic3r/SVG.hpp>
+#include <libslic3r/ClipperUtils.hpp>
+
+#include <libslic3r/TriangulateWall.hpp>
+#include <libslic3r/Tesselate.hpp>
+#include <libslic3r/SlicesToTriangleMesh.hpp>
+#include <libslic3r/SLA/Contour3D.hpp>
+
+using namespace Slic3r;
+
+static double area(const sla::RasterBase::PixelDim &pxd)
+{
+ return pxd.w_mm * pxd.h_mm;
+}
+
+static Slic3r::sla::RasterGrayscaleAA create_raster(
+ const sla::RasterBase::Resolution &res,
+ double disp_w = 100.,
+ double disp_h = 100.)
+{
+ sla::RasterBase::PixelDim pixdim{disp_w / res.width_px, disp_h / res.height_px};
+
+ auto bb = BoundingBox({0, 0}, {scaled(disp_w), scaled(disp_h)});
+ sla::RasterBase::Trafo trafo;
+ trafo.center_x = bb.center().x();
+ trafo.center_y = bb.center().y();
+
+ return sla::RasterGrayscaleAA{res, pixdim, trafo, agg::gamma_threshold(.5)};
+}
+
+static ExPolygon square(double a, Point center = {0, 0})
+{
+ ExPolygon poly;
+ coord_t V = scaled(a / 2.);
+
+ poly.contour.points = {{-V, -V}, {V, -V}, {V, V}, {-V, V}};
+ poly.translate(center.x(), center.y());
+
+ return poly;
+}
+
+static ExPolygon square_with_hole(double a, Point center = {0, 0})
+{
+ ExPolygon poly = square(a);
+
+ poly.holes.emplace_back();
+ coord_t V = scaled(a / 4.);
+ poly.holes.front().points = {{-V, V}, {V, V}, {V, -V}, {-V, -V}};
+
+ poly.translate(center.x(), center.y());
+
+ return poly;
+}
+
+static ExPolygons circle_with_hole(double r, Point center = {0, 0}) {
+
+ ExPolygon poly;
+
+ std::vector<double> pis = linspace_vector(0., 2 * PI, 100);
+
+ coord_t rs = scaled(r);
+ for (double phi : pis) {
+ poly.contour.points.emplace_back(rs * std::cos(phi), rs * std::sin(phi));
+ }
+
+ poly.holes.emplace_back(poly.contour);
+ poly.holes.front().reverse();
+ for (auto &p : poly.holes.front().points) p /= 2;
+
+ poly.translate(center.x(), center.y());
+
+ return {poly};
+}
+
+static const Vec2i W4x4 = {4, 4};
+static const Vec2i W2x2 = {2, 2};
+
+template<class Rst>
+static void test_expolys(Rst && rst,
+ const ExPolygons & ref,
+ Vec2i window,
+ const std::string &name = "test")
+{
+ for (const ExPolygon &expoly : ref) rst.draw(expoly);
+
+ std::fstream out(name + ".png", std::ios::out);
+ out << rst.encode(sla::PNGRasterEncoder{});
+ out.close();
+
+ ExPolygons extracted = sla::raster_to_polygons(rst, window);
+
+ SVG svg(name + ".svg");
+ svg.draw(extracted);
+ svg.draw(ref, "green");
+ svg.Close();
+
+ double max_rel_err = 0.1;
+ sla::RasterBase::PixelDim pxd = rst.pixel_dimensions();
+ double max_abs_err = area(pxd) * scaled(1.) * scaled(1.);
+
+ BoundingBox ref_bb;
+ for (auto &expoly : ref) ref_bb.merge(expoly.contour.bounding_box());
+
+ double max_displacement = 4. * (std::pow(pxd.h_mm, 2) + std::pow(pxd.w_mm, 2));
+ max_displacement *= scaled<double>(1.) * scaled(1.);
+
+ REQUIRE(extracted.size() == ref.size());
+ for (size_t i = 0; i < ref.size(); ++i) {
+ REQUIRE(extracted[i].contour.is_counter_clockwise());
+ REQUIRE(extracted[i].holes.size() == ref[i].holes.size());
+
+ for (auto &h : extracted[i].holes) REQUIRE(h.is_clockwise());
+
+ double refa = ref[i].area();
+ double abs_err = std::abs(extracted[i].area() - refa);
+ double rel_err = abs_err / refa;
+
+ REQUIRE((rel_err <= max_rel_err || abs_err <= max_abs_err));
+
+ BoundingBox bb;
+ for (auto &expoly : extracted) bb.merge(expoly.contour.bounding_box());
+
+ Point d = bb.center() - ref_bb.center();
+ REQUIRE(double(d.transpose() * d) <= max_displacement);
+ }
+}
+
+TEST_CASE("Empty raster should result in empty polygons", "[MarchingSquares]") {
+ sla::RasterGrayscaleAAGammaPower rst{{}, {}, {}};
+ ExPolygons extracted = sla::raster_to_polygons(rst);
+ REQUIRE(extracted.size() == 0);
+}
+
+TEST_CASE("Marching squares directions", "[MarchingSquares]") {
+ marchsq::Coord crd{1, 1};
+
+ REQUIRE(step(crd, marchsq::__impl::Dir::left).r == 1);
+ REQUIRE(step(crd, marchsq::__impl::Dir::left).c == 0);
+
+ REQUIRE(step(crd, marchsq::__impl::Dir::down).r == 2);
+ REQUIRE(step(crd, marchsq::__impl::Dir::down).c == 1);
+
+ REQUIRE(step(crd, marchsq::__impl::Dir::right).r == 1);
+ REQUIRE(step(crd, marchsq::__impl::Dir::right).c == 2);
+
+ REQUIRE(step(crd, marchsq::__impl::Dir::up).r == 0);
+ REQUIRE(step(crd, marchsq::__impl::Dir::up).c == 1);
+}
+
+TEST_CASE("Fully covered raster should result in a rectangle", "[MarchingSquares]") {
+ auto rst = create_raster({4, 4}, 4., 4.);
+
+ ExPolygon rect = square(4);
+
+ SECTION("Full accuracy") {
+ test_expolys(rst, {rect}, W2x2, "fully_covered_full_acc");
+ }
+
+ SECTION("Half accuracy") {
+ test_expolys(rst, {rect}, W4x4, "fully_covered_half_acc");
+ }
+}
+
+TEST_CASE("4x4 raster with one ring", "[MarchingSquares]") {
+
+ sla::RasterBase::PixelDim pixdim{1, 1};
+
+ // We need one additional row and column to detect edges
+ sla::RasterGrayscaleAA rst{{4, 4}, pixdim, {}, agg::gamma_threshold(.5)};
+
+ // Draw a triangle from individual pixels
+ rst.draw(square(1., {0500000, 0500000}));
+ rst.draw(square(1., {1500000, 0500000}));
+ rst.draw(square(1., {2500000, 0500000}));
+
+ rst.draw(square(1., {1500000, 1500000}));
+ rst.draw(square(1., {2500000, 1500000}));
+
+ rst.draw(square(1., {2500000, 2500000}));
+
+ std::fstream out("4x4.png", std::ios::out);
+ out << rst.encode(sla::PNGRasterEncoder{});
+ out.close();
+
+ ExPolygons extracted = sla::raster_to_polygons(rst);
+
+ SVG svg("4x4.svg");
+ svg.draw(extracted);
+ svg.Close();
+
+ REQUIRE(extracted.size() == 1);
+}
+
+TEST_CASE("4x4 raster with two rings", "[MarchingSquares]") {
+
+ sla::RasterBase::PixelDim pixdim{1, 1};
+
+ // We need one additional row and column to detect edges
+ sla::RasterGrayscaleAA rst{{5, 5}, pixdim, {}, agg::gamma_threshold(.5)};
+
+ SECTION("Ambiguous case with 'ac' square") {
+
+ // Draw a triangle from individual pixels
+ rst.draw(square(1., {3500000, 2500000}));
+ rst.draw(square(1., {3500000, 3500000}));
+ rst.draw(square(1., {2500000, 3500000}));
+
+ rst.draw(square(1., {2500000, 1500000}));
+ rst.draw(square(1., {1500000, 1500000}));
+ rst.draw(square(1., {1500000, 2500000}));
+
+ std::fstream out("4x4_ac.png", std::ios::out);
+ out << rst.encode(sla::PNGRasterEncoder{});
+ out.close();
+
+ ExPolygons extracted = sla::raster_to_polygons(rst);
+
+ SVG svg("4x4_ac.svg");
+ svg.draw(extracted);
+ svg.Close();
+
+ REQUIRE(extracted.size() == 2);
+ }
+
+ SECTION("Ambiguous case with 'bd' square") {
+
+ // Draw a triangle from individual pixels
+ rst.draw(square(1., {3500000, 1500000}));
+ rst.draw(square(1., {3500000, 2500000}));
+ rst.draw(square(1., {2500000, 1500000}));
+
+ rst.draw(square(1., {1500000, 2500000}));
+ rst.draw(square(1., {1500000, 3500000}));
+ rst.draw(square(1., {2500000, 3500000}));
+
+ std::fstream out("4x4_bd.png", std::ios::out);
+ out << rst.encode(sla::PNGRasterEncoder{});
+ out.close();
+
+ ExPolygons extracted = sla::raster_to_polygons(rst);
+
+ SVG svg("4x4_bd.svg");
+ svg.draw(extracted);
+ svg.Close();
+
+ REQUIRE(extracted.size() == 2);
+ }
+}
+
+TEST_CASE("Square with hole in the middle", "[MarchingSquares]") {
+ using namespace Slic3r;
+
+ ExPolygons inp = {square_with_hole(50.)};
+
+ SECTION("Proportional raster, 1x1 mm pixel size, full accuracy") {
+ test_expolys(create_raster({100, 100}, 100., 100.), inp, W2x2, "square_with_hole_proportional_1x1_mm_px_full");
+ }
+
+ SECTION("Proportional raster, 1x1 mm pixel size, half accuracy") {
+ test_expolys(create_raster({100, 100}, 100., 100.), inp, W4x4, "square_with_hole_proportional_1x1_mm_px_half");
+ }
+
+ SECTION("Landscape raster, 1x1 mm pixel size, full accuracy") {
+ test_expolys(create_raster({150, 100}, 150., 100.), inp, W2x2, "square_with_hole_landsc_1x1_mm_px_full");
+ }
+
+ SECTION("Landscape raster, 1x1 mm pixel size, half accuracy") {
+ test_expolys(create_raster({150, 100}, 150., 100.), inp, W4x4, "square_with_hole_landsc_1x1_mm_px_half");
+ }
+
+ SECTION("Portrait raster, 1x1 mm pixel size, full accuracy") {
+ test_expolys(create_raster({100, 150}, 100., 150.), inp, W2x2, "square_with_hole_portrait_1x1_mm_px_full");
+ }
+
+ SECTION("Portrait raster, 1x1 mm pixel size, half accuracy") {
+ test_expolys(create_raster({100, 150}, 100., 150.), inp, W4x4, "square_with_hole_portrait_1x1_mm_px_half");
+ }
+
+ SECTION("Proportional raster, 2x2 mm pixel size, full accuracy") {
+ test_expolys(create_raster({200, 200}, 100., 100.), inp, W2x2, "square_with_hole_proportional_2x2_mm_px_full");
+ }
+
+ SECTION("Proportional raster, 2x2 mm pixel size, half accuracy") {
+ test_expolys(create_raster({200, 200}, 100., 100.), inp, W4x4, "square_with_hole_proportional_2x2_mm_px_half");
+ }
+
+ SECTION("Proportional raster, 0.5x0.5 mm pixel size, full accuracy") {
+ test_expolys(create_raster({50, 50}, 100., 100.), inp, W2x2, "square_with_hole_proportional_0.5x0.5_mm_px_full");
+ }
+
+ SECTION("Proportional raster, 0.5x0.5 mm pixel size, half accuracy") {
+ test_expolys(create_raster({50, 50}, 100., 100.), inp, W4x4, "square_with_hole_proportional_0.5x0.5_mm_px_half");
+ }
+}
+
+TEST_CASE("Circle with hole in the middle", "[MarchingSquares]") {
+ using namespace Slic3r;
+
+ test_expolys(create_raster({1000, 1000}), circle_with_hole(25.), W2x2, "circle_with_hole");
+}
+
+static void recreate_object_from_rasters(const std::string &objname, float lh) {
+ TriangleMesh mesh = load_model(objname);
+
+ auto bb = mesh.bounding_box();
+ Vec3f tr = -bb.center().cast<float>();
+ mesh.translate(tr.x(), tr.y(), tr.z());
+ bb = mesh.bounding_box();
+
+ std::vector<ExPolygons> layers;
+ slice_mesh(mesh, grid(float(bb.min.z()) + lh, float(bb.max.z()), lh), layers, 0.f, []{});
+
+ sla::RasterBase::Resolution res{2560, 1440};
+ double disp_w = 120.96;
+ double disp_h = 68.04;
+
+ size_t cntr = 0;
+ for (ExPolygons &layer : layers) {
+ auto rst = create_raster(res, disp_w, disp_h);
+
+ for (ExPolygon &island : layer) {
+ rst.draw(island);
+ }
+
+#ifndef NDEBUG
+ std::fstream out(objname + std::to_string(cntr) + ".png", std::ios::out);
+ out << rst.encode(sla::PNGRasterEncoder{});
+ out.close();
+#endif
+
+ ExPolygons layer_ = sla::raster_to_polygons(rst);
+// float delta = scaled(std::min(rst.pixel_dimensions().h_mm,
+// rst.pixel_dimensions().w_mm)) / 2;
+
+// layer_ = expolygons_simplify(layer_, delta);
+
+#ifndef NDEBUG
+ SVG svg(objname + std::to_string(cntr) + ".svg", BoundingBox(Point{0, 0}, Point{scaled(disp_w), scaled(disp_h)}));
+ svg.draw(layer_);
+ svg.draw(layer, "green");
+ svg.Close();
+#endif
+
+ double layera = 0., layera_ = 0.;
+ for (auto &p : layer) layera += p.area();
+ for (auto &p : layer_) layera_ += p.area();
+#ifndef NDEBUG
+ std::cout << cntr++ << std::endl;
+#endif
+ double diff = std::abs(layera_ - layera);
+ REQUIRE((diff <= 0.1 * layera || diff < scaled<double>(1.) * scaled<double>(1.)));
+
+ layer = std::move(layer_);
+ }
+
+ TriangleMesh out = slices_to_triangle_mesh(layers, bb.min.z(), double(lh), double(lh));
+
+ out.require_shared_vertices();
+ out.WriteOBJFile("out_from_rasters.obj");
+}
+
+TEST_CASE("Recreate object from rasters", "[SL1Import]") {
+ recreate_object_from_rasters("frog_legs.obj", 0.05f);
+}
diff --git a/tests/libslic3r/test_optimizers.cpp b/tests/libslic3r/test_optimizers.cpp
new file mode 100644
index 000000000..6e84f6a69
--- /dev/null
+++ b/tests/libslic3r/test_optimizers.cpp
@@ -0,0 +1,59 @@
+#include <catch2/catch.hpp>
+#include <test_utils.hpp>
+
+#include <libslic3r/Optimize/BruteforceOptimizer.hpp>
+
+#include <libslic3r/Optimize/NLoptOptimizer.hpp>
+
+void check_opt_result(double score, double ref, double abs_err, double rel_err)
+{
+ double abs_diff = std::abs(score - ref);
+ double rel_diff = std::abs(abs_diff / std::abs(ref));
+
+ bool abs_reached = abs_diff < abs_err;
+ bool rel_reached = rel_diff < rel_err;
+ bool precision_reached = abs_reached || rel_reached;
+ REQUIRE(precision_reached);
+}
+
+template<class Opt> void test_sin(Opt &&opt)
+{
+ using namespace Slic3r::opt;
+
+ auto optfunc = [](const auto &in) {
+ auto [phi] = in;
+
+ return std::sin(phi);
+ };
+
+ auto init = initvals({PI});
+ auto optbounds = bounds({ {0., 2 * PI}});
+
+ Result result_min = opt.to_min().optimize(optfunc, init, optbounds);
+ Result result_max = opt.to_max().optimize(optfunc, init, optbounds);
+
+ check_opt_result(result_min.score, -1., 1e-2, 1e-4);
+ check_opt_result(result_max.score, 1., 1e-2, 1e-4);
+}
+
+template<class Opt> void test_sphere_func(Opt &&opt)
+{
+ using namespace Slic3r::opt;
+
+ Result result = opt.to_min().optimize([](const auto &in) {
+ auto [x, y] = in;
+
+ return x * x + y * y + 1.;
+ }, initvals({.6, -0.2}), bounds({{-1., 1.}, {-1., 1.}}));
+
+ check_opt_result(result.score, 1., 1e-2, 1e-4);
+}
+
+TEST_CASE("Test brute force optimzer for basic 1D and 2D functions", "[Opt]") {
+ using namespace Slic3r::opt;
+
+ Optimizer<AlgBruteForce> opt;
+
+ test_sin(opt);
+ test_sphere_func(opt);
+}
diff --git a/tests/libslic3r/test_png_io.cpp b/tests/libslic3r/test_png_io.cpp
new file mode 100644
index 000000000..b4fcd6255
--- /dev/null
+++ b/tests/libslic3r/test_png_io.cpp
@@ -0,0 +1,55 @@
+#define NOMINMAX
+#include <catch2/catch.hpp>
+
+#include <numeric>
+
+#include "libslic3r/PNGReadWrite.hpp"
+#include "libslic3r/SLA/AGGRaster.hpp"
+#include "libslic3r/BoundingBox.hpp"
+
+using namespace Slic3r;
+
+static sla::RasterGrayscaleAA create_raster(const sla::RasterBase::Resolution &res)
+{
+ sla::RasterBase::PixelDim pixdim{1., 1.};
+
+ auto bb = BoundingBox({0, 0}, {scaled(1.), scaled(1.)});
+ sla::RasterBase::Trafo trafo;
+ trafo.center_x = bb.center().x();
+ trafo.center_y = bb.center().y();
+
+ return sla::RasterGrayscaleAA{res, pixdim, trafo, agg::gamma_threshold(.5)};
+}
+
+TEST_CASE("PNG read", "[PNG]") {
+ auto rst = create_raster({100, 100});
+
+ size_t rstsum = 0;
+ for (size_t r = 0; r < rst.resolution().height_px; ++r)
+ for (size_t c = 0; c < rst.resolution().width_px; ++c)
+ rstsum += rst.read_pixel(c, r);
+
+ SECTION("Correct png buffer should be recognized as such.") {
+ auto enc_rst = rst.encode(sla::PNGRasterEncoder{});
+ REQUIRE(Slic3r::png::is_png({enc_rst.data(), enc_rst.size()}));
+ }
+
+ SECTION("Fake png buffer should be recognized as such.") {
+ std::vector<uint8_t> fake(10, '\0');
+ REQUIRE(!Slic3r::png::is_png({fake.data(), fake.size()}));
+ }
+
+ SECTION("Decoded PNG buffer resolution should match the original") {
+ auto enc_rst = rst.encode(sla::PNGRasterEncoder{});
+
+ png::ImageGreyscale img;
+ png::decode_png({enc_rst.data(), enc_rst.size()}, img);
+
+ REQUIRE(img.rows == rst.resolution().height_px);
+ REQUIRE(img.cols == rst.resolution().width_px);
+
+ size_t sum = std::accumulate(img.buf.begin(), img.buf.end(), size_t(0));
+
+ REQUIRE(sum == rstsum);
+ }
+}
diff --git a/tests/libslic3r/test_voronoi.cpp b/tests/libslic3r/test_voronoi.cpp
new file mode 100644
index 000000000..b847a890b
--- /dev/null
+++ b/tests/libslic3r/test_voronoi.cpp
@@ -0,0 +1,1397 @@
+#include <catch2/catch.hpp>
+#include <test_utils.hpp>
+
+#include <libslic3r/Polygon.hpp>
+#include <libslic3r/Polyline.hpp>
+#include <libslic3r/EdgeGrid.hpp>
+#include <libslic3r/Geometry.hpp>
+
+#include <libslic3r/VoronoiOffset.hpp>
+
+#include <numeric>
+
+// #define VORONOI_DEBUG_OUT
+
+#ifdef VORONOI_DEBUG_OUT
+#include <libslic3r/VoronoiVisualUtils.hpp>
+#endif
+
+using boost::polygon::voronoi_builder;
+using boost::polygon::voronoi_diagram;
+
+using namespace Slic3r;
+
+using VD = Geometry::VoronoiDiagram;
+
+// https://svn.boost.org/trac10/ticket/12067
+// This bug seems to be confirmed.
+// Vojtech supposes that there may be no Voronoi edges produced for
+// the 1st and last sweep line positions.
+TEST_CASE("Voronoi missing edges - points 12067", "[Voronoi]")
+{
+ Points pts {
+ { -10, -20 },
+ { 10, -20 },
+ { 5, 0 },
+ { 10, 20 },
+ { -10, 20 },
+ { -5, 0 }
+ };
+
+ // Construction of the Voronoi Diagram.
+ VD vd;
+ construct_voronoi(pts.begin(), pts.end(), &vd);
+
+#ifdef VORONOI_DEBUG_OUT
+ dump_voronoi_to_svg(debug_out_path("voronoi-pts.svg").c_str(),
+ vd, pts, Lines());
+#endif
+
+// REQUIRE(closest_point.z() == Approx(1.));
+}
+
+// https://svn.boost.org/trac10/ticket/12707
+// This issue is confirmed, there are no self intersections in the polygon.
+// A minimal test case is created at the end of this test,
+// a new issue opened with the minimal test case:
+// https://github.com/boostorg/polygon/issues/43
+TEST_CASE("Voronoi missing edges - Alessandro gapfill 12707", "[Voronoi]")
+{
+ Lines lines0 {
+ { { 42127548, 699996}, { 42127548, 10135750 } },
+ { { 42127548, 10135750}, { 50487352, 10135750 } },
+ { { 50487352, 10135750}, { 50487352, 699995 } },
+ { { 50487352, 699995}, { 51187348, 0 } },
+ { { 51187348, 0}, { 64325952, 0 } },
+ { { 64325952, 0}, { 64325952, 699996 } },
+ { { 64325952, 699996}, { 51187348, 699996 } },
+ { { 51187348, 699996}, { 51187348, 10835701 } },
+ { { 51187348, 10835701}, { 41427552, 10835701 } },
+ { { 41427552, 10835701}, { 41427552, 699996 } },
+ { { 41427552, 699996}, { 28664848, 699996 } },
+ { { 28664848, 699996}, { 28664848, 10835701 } },
+ { { 28664848, 10835701}, { 19280052, 10835701 } },
+ { { 19280052, 10835701}, { 27964852, 699996 } },
+ { { 27964852, 699996}, { 28664848, 0 } },
+ { { 28664848, 0}, { 41427551, 0 } },
+ { { 41427551, 0}, { 42127548, 699996 } }
+ };
+
+ Lines lines1 {
+ { { 42127548, 699996}, { 42127548, 10135750 } },
+ { { 42127548, 10135750}, { 50487352, 10135750 } },
+ { { 50487352, 10135750}, { 50487352, 699995 } },
+ { { 50487352, 699995}, { 51187348, 0 } },
+ { { 51187348, 0}, { 51187348, 10835701 } },
+ { { 51187348, 10835701}, { 41427552, 10835701 } },
+ { { 41427552, 10835701}, { 41427552, 699996 } },
+ { { 41427552, 699996}, { 28664848, 699996 } },
+ { { 28664848, 699996}, { 28664848, 10835701 } },
+ { { 28664848, 10835701}, { 19280052, 10835701 } },
+ { { 19280052, 10835701}, { 27964852, 699996 } },
+ { { 27964852, 699996}, { 28664848, 0 } },
+ { { 28664848, 0}, { 41427551, 0 } },
+ { { 41427551, 0}, { 42127548, 699996 } }
+ };
+
+ Lines lines2 {
+ { { 42127548, 699996}, { 42127548, 10135750 } },
+ { { 42127548, 10135750}, { 50487352, 10135750 } },
+ { { 50487352, 10135750}, { 50487352, 699995 } },
+ { { 50487352, 699995}, { 51187348, 0 } },
+ { { 51187348, 0}, { 51187348, 10835701 } },
+ { { 51187348, 10835701}, { 41427552, 10835701 } },
+ { { 41427552, 10835701}, { 41427552, 699996 } },
+ { { 41427552, 699996}, { 28664848, 699996 } },
+ { { 28664848, 699996}, { 28664848, 10835701 } },
+ { { 28664848, 10835701}, { 19280052, 10835701 } },
+ { { 19280052, 10835701}, { 28664848, 0 } },
+ { { 28664848, 0}, { 41427551, 0 } },
+ { { 41427551, 0}, { 42127548, 699996 } }
+ };
+
+ Lines lines3 {
+ { { 42127548, 699996}, { 42127548, 10135750 } },
+ { { 42127548, 10135750}, { 50487352, 10135750 } },
+ { { 50487352, 10135750}, { 50487352, 699995 } },
+ { { 50487352, 699995}, { 51187348, 0 } },
+ { { 51187348, 0}, { 51187348, 10835701 } },
+ { { 51187348, 10835701}, { 41427552, 10835701 } },
+ { { 41427552, 10835701}, { 41427552, 699996 } },
+ { { 41427552, 699996}, { 41427551, 0 } },
+ { { 41427551, 0}, { 42127548, 699996 } }
+ };
+
+ Lines lines4 {
+ { { 42127548, 699996}, { 42127548, 10135750 } },
+ { { 42127548, 10135750}, { 50487352, 10135750 } },
+ { { 50487352, 10135750}, { 50487352, 699995 } },
+ { { 50487352, 699995}, { 51187348, 0 } },
+ { { 51187348, 0}, { 51187348, 10835701 } },
+ { { 51187348, 10835701}, { 41427552, 10835701 } },
+ { { 41427552, 10835701}, { 41427551, 0 } },
+ { { 41427551, 0}, { 42127548, 699996 } }
+ };
+
+ Lines lines = to_lines(Polygon {
+ { 0, 10000000},
+ { 700000, 1}, // it has to be 1, higher number, zero or -1 work.
+ { 700000, 9000000},
+ { 9100000, 9000000},
+ { 9100000, 0},
+ {10000000, 10000000}
+ });
+
+ Polygon poly;
+ std::mt19937 gen;
+ std::uniform_int_distribution<coord_t> dist(-100, 100);
+ for (size_t i = 0; i < lines.size(); ++ i) {
+ Line &l1 = lines[i];
+ Line &l2 = lines[(i + 1) % lines.size()];
+ REQUIRE(l1.b.x() == l2.a.x());
+ REQUIRE(l1.b.y() == l2.a.y());
+#if 0
+ // Wiggle the points a bit to find out whether this fixes the voronoi diagram for this particular polygon.
+ l1.b.x() = (l2.a.x() += dist(gen));
+ l1.b.y() = (l2.a.y() += dist(gen));
+#endif
+ poly.points.emplace_back(l1.a);
+ }
+
+ REQUIRE(intersecting_edges({ poly }).empty());
+
+ VD vd;
+ construct_voronoi(lines.begin(), lines.end(), &vd);
+
+#ifdef VORONOI_DEBUG_OUT
+ dump_voronoi_to_svg(debug_out_path("voronoi-lines.svg").c_str(),
+ vd, Points(), lines);
+#endif
+}
+
+// https://svn.boost.org/trac10/ticket/12903
+// division by zero reported, but this issue is most likely a non-issue, as it produces an infinity for the interval of validity
+// of the floating point calculation, therefore forcing a recalculation with extended accuracy.
+TEST_CASE("Voronoi division by zero 12903", "[Voronoi]")
+{
+ Points pts { { 1, 1 }, { 3, 1 }, { 1, 3 }, { 3, 3 },
+ { -1, 1 }, { 1, -1 }, { 5, 1 }, { 3, -1 },
+ { -1, 3 }, { 1, 5 }, { 5, 3 }, { 3, 5 } };
+ {
+ auto pts2 { pts };
+ std::sort(pts2.begin(), pts2.end(), [](auto &l, auto &r) { return (l.x() == r.x()) ? l.y() < r.y() : l.x() < r.x(); });
+ // No point removed -> no duplicate.
+ REQUIRE(std::unique(pts2.begin(), pts2.end()) == pts2.end());
+ }
+
+ VD vd;
+ construct_voronoi(pts.begin(), pts.end(), &vd);
+
+#ifdef VORONOI_DEBUG_OUT
+ // Scale the voronoi vertices and input points, so that the dump_voronoi_to_svg will display them correctly.
+ for (auto &pt : vd.vertices()) {
+ const_cast<double&>(pt.x()) = scale_(pt.x());
+ const_cast<double&>(pt.y()) = scale_(pt.y());
+ }
+ for (auto &pt : pts)
+ pt = Point::new_scale(pt.x(), pt.y());
+ dump_voronoi_to_svg(debug_out_path("voronoi-div-by-zero.svg").c_str(), vd, pts, Lines());
+#endif
+}
+
+// https://svn.boost.org/trac10/ticket/12139
+// Funny sample from a dental industry?
+// Vojtech confirms this test fails and rightly so, because the input data contain self intersections.
+// This test is suppressed.
+TEST_CASE("Voronoi NaN coordinates 12139", "[Voronoi][!hide][!mayfail]")
+{
+ Lines lines = {
+ { { 260500,1564400 }, { 261040,1562960 } },
+ { { 261040,1562960 }, { 260840,1561780 } },
+ { { 260840,1561780 }, { 262620,1561480 } },
+ { { 262620,1561480 }, { 263160,1561220 } },
+ { { 263160,1561220 }, { 264100,1563259 } },
+ { { 264100,1563259 }, { 262380,1566980 } },
+ { { 262380,1566980 }, { 260500,1564400 } },
+ { { 137520,1851640 }, { 132160,1851100 } },
+ { { 132160,1851100 }, { 126460,1848779 } },
+ { { 126460,1848779 }, { 123960,1847320 } },
+ { { 123960,1847320 }, { 120960,1844559 } },
+ { { 120960,1844559 }, { 119640,1843040 } },
+ { { 119640,1843040 }, { 118320,1840900 } },
+ { { 118320,1840900 }, { 117920,1838120 } },
+ { { 117920,1838120 }, { 118219,1833340 } },
+ { { 118219,1833340 }, { 116180,1835000 } },
+ { { 116180,1835000 }, { 115999,1834820 } },
+ { { 115999,1834820 }, { 114240,1836340 } },
+ { { 114240,1836340 }, { 112719,1837260 } },
+ { { 112719,1837260 }, { 109460,1838239 } },
+ { { 109460,1838239 }, { 103639,1837480 } },
+ { { 103639,1837480 }, { 99819,1835460 } },
+ { { 99819,1835460 }, { 96320,1834260 } },
+ { { 96320,1834260 }, { 95339,1834260 } },
+ { { 95339,1834260 }, { 93660,1833720 } },
+ { { 93660,1833720 }, { 90719,1833300 } },
+ { { 90719,1833300 }, { 87860,1831660 } },
+ { { 87860,1831660 }, { 84580,1830499 } },
+ { { 84580,1830499 }, { 79780,1827419 } },
+ { { 79780,1827419 }, { 76020,1824280 } },
+ { { 76020,1824280 }, { 73680,1821180 } },
+ { { 73680,1821180 }, { 72560,1818960 } },
+ { { 72560,1818960 }, { 71699,1817719 } },
+ { { 71699,1817719 }, { 70280,1814260 } },
+ { { 70280,1814260 }, { 69460,1811060 } },
+ { { 69460,1811060 }, { 69659,1807320 } },
+ { { 69659,1807320 }, { 69640,1803300 } },
+ { { 69640,1803300 }, { 69360,1799780 } },
+ { { 69360,1799780 }, { 69320,1796720 } },
+ { { 69320,1796720 }, { 69640,1793980 } },
+ { { 69640,1793980 }, { 70160,1791780 } },
+ { { 70160,1791780 }, { 72460,1784879 } },
+ { { 72460,1784879 }, { 74420,1780780 } },
+ { { 74420,1780780 }, { 76500,1772899 } },
+ { { 76500,1772899 }, { 76760,1769359 } },
+ { { 76760,1769359 }, { 76480,1766259 } },
+ { { 76480,1766259 }, { 76839,1760360 } },
+ { { 76839,1760360 }, { 77539,1756680 } },
+ { { 77539,1756680 }, { 80540,1748140 } },
+ { { 80540,1748140 }, { 84200,1742619 } },
+ { { 84200,1742619 }, { 90900,1735220 } },
+ { { 90900,1735220 }, { 94159,1732679 } },
+ { { 94159,1732679 }, { 101259,1729559 } },
+ { { 101259,1729559 }, { 107299,1727939 } },
+ { { 107299,1727939 }, { 110979,1727919 } },
+ { { 110979,1727919 }, { 113499,1727240 } },
+ { { 113499,1727240 }, { 113619,1727359 } },
+ { { 113619,1727359 }, { 114280,1727280 } },
+ { { 114280,1727280 }, { 131440,1732560 } },
+ { { 131440,1732560 }, { 118140,1727119 } },
+ { { 118140,1727119 }, { 117120,1723759 } },
+ { { 117120,1723759 }, { 113840,1720660 } },
+ { { 113840,1720660 }, { 111399,1716760 } },
+ { { 111399,1716760 }, { 109700,1712979 } },
+ { { 109700,1712979 }, { 108879,1708400 } },
+ { { 108879,1708400 }, { 108060,1696360 } },
+ { { 108060,1696360 }, { 110040,1687760 } },
+ { { 110040,1687760 }, { 112140,1682480 } },
+ { { 112140,1682480 }, { 112540,1681780 } },
+ { { 112540,1681780 }, { 115260,1678320 } },
+ { { 115260,1678320 }, { 118720,1675320 } },
+ { { 118720,1675320 }, { 126100,1670980 } },
+ { { 126100,1670980 }, { 132400,1668080 } },
+ { { 132400,1668080 }, { 136700,1667440 } },
+ { { 136700,1667440 }, { 142440,1667159 } },
+ { { 142440,1667159 }, { 143340,1666720 } },
+ { { 143340,1666720 }, { 138679,1661319 } },
+ { { 138679,1661319 }, { 137240,1657480 } },
+ { { 137240,1657480 }, { 136760,1650739 } },
+ { { 136760,1650739 }, { 136780,1647339 } },
+ { { 136780,1647339 }, { 135940,1644280 } },
+ { { 135940,1644280 }, { 136000,1640820 } },
+ { { 136000,1640820 }, { 135480,1638020 } },
+ { { 135480,1638020 }, { 137060,1634220 } },
+ { { 137060,1634220 }, { 136320,1631340 } },
+ { { 136320,1631340 }, { 134620,1629700 } },
+ { { 134620,1629700 }, { 132460,1628199 } },
+ { { 132460,1628199 }, { 132299,1627860 } },
+ { { 132299,1627860 }, { 138360,1618020 } },
+ { { 138360,1618020 }, { 142440,1611859 } },
+ { { 142440,1611859 }, { 143180,1611299 } },
+ { { 143180,1611299 }, { 144000,1611259 } },
+ { { 144000,1611259 }, { 145960,1612540 } },
+ { { 145960,1612540 }, { 146720,1613700 } },
+ { { 146720,1613700 }, { 147700,1613539 } },
+ { { 147700,1613539 }, { 148520,1614039 } },
+ { { 148520,1614039 }, { 149840,1613740 } },
+ { { 149840,1613740 }, { 150620,1614079 } },
+ { { 150620,1614079 }, { 154760,1612740 } },
+ { { 154760,1612740 }, { 159000,1608420 } },
+ { { 159000,1608420 }, { 161120,1606780 } },
+ { { 161120,1606780 }, { 164060,1605139 } },
+ { { 164060,1605139 }, { 168079,1603620 } },
+ { { 168079,1603620 }, { 170240,1603400 } },
+ { { 170240,1603400 }, { 172400,1603499 } },
+ { { 172400,1603499 }, { 194440,1613740 } },
+ { { 194440,1613740 }, { 195880,1616460 } },
+ { { 195880,1616460 }, { 197060,1618140 } },
+ { { 197060,1618140 }, { 198039,1617860 } },
+ { { 198039,1617860 }, { 198739,1618900 } },
+ { { 198739,1618900 }, { 200259,1619200 } },
+ { { 200259,1619200 }, { 201940,1618920 } },
+ { { 201940,1618920 }, { 201700,1617139 } },
+ { { 201700,1617139 }, { 203860,1618179 } },
+ { { 203860,1618179 }, { 203500,1617540 } },
+ { { 203500,1617540 }, { 205000,1616579 } },
+ { { 205000,1616579 }, { 206780,1615020 } },
+ { { 206780,1615020 }, { 210159,1614059 } },
+ { { 210159,1614059 }, { 217080,1611080 } },
+ { { 217080,1611080 }, { 219200,1611579 } },
+ { { 219200,1611579 }, { 223219,1610980 } },
+ { { 223219,1610980 }, { 224580,1610540 } },
+ { { 224580,1610540 }, { 227460,1611440 } },
+ { { 227460,1611440 }, { 229359,1611859 } },
+ { { 229359,1611859 }, { 230620,1612580 } },
+ { { 230620,1612580 }, { 232340,1614460 } },
+ { { 232340,1614460 }, { 232419,1617040 } },
+ { { 232419,1617040 }, { 231740,1619480 } },
+ { { 231740,1619480 }, { 231880,1624899 } },
+ { { 231880,1624899 }, { 231540,1625820 } },
+ { { 231540,1625820 }, { 231700,1627079 } },
+ { { 231700,1627079 }, { 231320,1628239 } },
+ { { 231320,1628239 }, { 231420,1636080 } },
+ { { 231420,1636080 }, { 231099,1637200 } },
+ { { 231099,1637200 }, { 228660,1643280 } },
+ { { 228660,1643280 }, { 227699,1644960 } },
+ { { 227699,1644960 }, { 226080,1651140 } },
+ { { 226080,1651140 }, { 225259,1653420 } },
+ { { 225259,1653420 }, { 225159,1655399 } },
+ { { 225159,1655399 }, { 223760,1659260 } },
+ { { 223760,1659260 }, { 219860,1666360 } },
+ { { 219860,1666360 }, { 219180,1667220 } },
+ { { 219180,1667220 }, { 212580,1673680 } },
+ { { 212580,1673680 }, { 207880,1676460 } },
+ { { 207880,1676460 }, { 205560,1677560 } },
+ { { 205560,1677560 }, { 199700,1678920 } },
+ { { 199700,1678920 }, { 195280,1679420 } },
+ { { 195280,1679420 }, { 193939,1679879 } },
+ { { 193939,1679879 }, { 188780,1679440 } },
+ { { 188780,1679440 }, { 188100,1679639 } },
+ { { 188100,1679639 }, { 186680,1679339 } },
+ { { 186680,1679339 }, { 184760,1679619 } },
+ { { 184760,1679619 }, { 183520,1681440 } },
+ { { 183520,1681440 }, { 183860,1682200 } },
+ { { 183860,1682200 }, { 186620,1686120 } },
+ { { 186620,1686120 }, { 190380,1688380 } },
+ { { 190380,1688380 }, { 192780,1690739 } },
+ { { 192780,1690739 }, { 195860,1694839 } },
+ { { 195860,1694839 }, { 196620,1696539 } },
+ { { 196620,1696539 }, { 197540,1701819 } },
+ { { 197540,1701819 }, { 198939,1705699 } },
+ { { 198939,1705699 }, { 198979,1711819 } },
+ { { 198979,1711819 }, { 198240,1716900 } },
+ { { 198240,1716900 }, { 197440,1720139 } },
+ { { 197440,1720139 }, { 195340,1724639 } },
+ { { 195340,1724639 }, { 194040,1726140 } },
+ { { 194040,1726140 }, { 192559,1728239 } },
+ { { 192559,1728239 }, { 187780,1732339 } },
+ { { 187780,1732339 }, { 182519,1735520 } },
+ { { 182519,1735520 }, { 181239,1736140 } },
+ { { 181239,1736140 }, { 177340,1737619 } },
+ { { 177340,1737619 }, { 175439,1738140 } },
+ { { 175439,1738140 }, { 171380,1738880 } },
+ { { 171380,1738880 }, { 167860,1739059 } },
+ { { 167860,1739059 }, { 166040,1738920 } },
+ { { 166040,1738920 }, { 163680,1738539 } },
+ { { 163680,1738539 }, { 157660,1736859 } },
+ { { 157660,1736859 }, { 154900,1735460 } },
+ { { 154900,1735460 }, { 151420,1735159 } },
+ { { 151420,1735159 }, { 142100,1736160 } },
+ { { 142100,1736160 }, { 140880,1735920 } },
+ { { 140880,1735920 }, { 142820,1736859 } },
+ { { 142820,1736859 }, { 144080,1737240 } },
+ { { 144080,1737240 }, { 144280,1737460 } },
+ { { 144280,1737460 }, { 144239,1738120 } },
+ { { 144239,1738120 }, { 144980,1739420 } },
+ { { 144980,1739420 }, { 146340,1741039 } },
+ { { 146340,1741039 }, { 147160,1741720 } },
+ { { 147160,1741720 }, { 154260,1745800 } },
+ { { 154260,1745800 }, { 156560,1746879 } },
+ { { 156560,1746879 }, { 165180,1752679 } },
+ { { 165180,1752679 }, { 168240,1755860 } },
+ { { 168240,1755860 }, { 170940,1759260 } },
+ { { 170940,1759260 }, { 173440,1762079 } },
+ { { 173440,1762079 }, { 174540,1764079 } },
+ { { 174540,1764079 }, { 176479,1766640 } },
+ { { 176479,1766640 }, { 178900,1768960 } },
+ { { 178900,1768960 }, { 180819,1772780 } },
+ { { 180819,1772780 }, { 181479,1776859 } },
+ { { 181479,1776859 }, { 181660,1788499 } },
+ { { 181660,1788499 }, { 181460,1791740 } },
+ { { 181460,1791740 }, { 181160,1792840 } },
+ { { 181160,1792840 }, { 179580,1797180 } },
+ { { 179580,1797180 }, { 174620,1808960 } },
+ { { 174620,1808960 }, { 174100,1809839 } },
+ { { 174100,1809839 }, { 171660,1812419 } },
+ { { 171660,1812419 }, { 169639,1813840 } },
+ { { 169639,1813840 }, { 168880,1814720 } },
+ { { 168880,1814720 }, { 168960,1815980 } },
+ { { 168960,1815980 }, { 169979,1819160 } },
+ { { 169979,1819160 }, { 170080,1820159 } },
+ { { 170080,1820159 }, { 168280,1830540 } },
+ { { 168280,1830540 }, { 167580,1832200 } },
+ { { 167580,1832200 }, { 165679,1835720 } },
+ { { 165679,1835720 }, { 164720,1836819 } },
+ { { 164720,1836819 }, { 161840,1841740 } },
+ { { 161840,1841740 }, { 159880,1843519 } },
+ { { 159880,1843519 }, { 158959,1844120 } },
+ { { 158959,1844120 }, { 154960,1847500 } },
+ { { 154960,1847500 }, { 152140,1848580 } },
+ { { 152140,1848580 }, { 150440,1849520 } },
+ { { 150440,1849520 }, { 144940,1850980 } },
+ { { 144940,1850980 }, { 138340,1851700 } },
+ { { 138340,1851700 }, { 137520,1851640 } },
+ { { 606940,1873860 }, { 602860,1872460 } },
+ { { 602860,1872460 }, { 600680,1871539 } },
+ { { 600680,1871539 }, { 599300,1870640 } },
+ { { 599300,1870640 }, { 598120,1869579 } },
+ { { 598120,1869579 }, { 594680,1867180 } },
+ { { 594680,1867180 }, { 589680,1861460 } },
+ { { 589680,1861460 }, { 586300,1855020 } },
+ { { 586300,1855020 }, { 584700,1848060 } },
+ { { 584700,1848060 }, { 585199,1843499 } },
+ { { 585199,1843499 }, { 584000,1842079 } },
+ { { 584000,1842079 }, { 582900,1841480 } },
+ { { 582900,1841480 }, { 581020,1839899 } },
+ { { 581020,1839899 }, { 579440,1838040 } },
+ { { 579440,1838040 }, { 577840,1834299 } },
+ { { 577840,1834299 }, { 576160,1831859 } },
+ { { 576160,1831859 }, { 574540,1828499 } },
+ { { 574540,1828499 }, { 572140,1822860 } },
+ { { 572140,1822860 }, { 570180,1815219 } },
+ { { 570180,1815219 }, { 570080,1812280 } },
+ { { 570080,1812280 }, { 570340,1808300 } },
+ { { 570340,1808300 }, { 570160,1807119 } },
+ { { 570160,1807119 }, { 570140,1804039 } },
+ { { 570140,1804039 }, { 571640,1796660 } },
+ { { 571640,1796660 }, { 571740,1794680 } },
+ { { 571740,1794680 }, { 572279,1794039 } },
+ { { 572279,1794039 }, { 575480,1788300 } },
+ { { 575480,1788300 }, { 576379,1787419 } },
+ { { 576379,1787419 }, { 577020,1786120 } },
+ { { 577020,1786120 }, { 578000,1785100 } },
+ { { 578000,1785100 }, { 579960,1783720 } },
+ { { 579960,1783720 }, { 581420,1782079 } },
+ { { 581420,1782079 }, { 585480,1778440 } },
+ { { 585480,1778440 }, { 586680,1777079 } },
+ { { 586680,1777079 }, { 590520,1774639 } },
+ { { 590520,1774639 }, { 592440,1773199 } },
+ { { 592440,1773199 }, { 595160,1772260 } },
+ { { 595160,1772260 }, { 598079,1770920 } },
+ { { 598079,1770920 }, { 601420,1769019 } },
+ { { 601420,1769019 }, { 606400,1767280 } },
+ { { 606400,1767280 }, { 607320,1766620 } },
+ { { 607320,1766620 }, { 605760,1766460 } },
+ { { 605760,1766460 }, { 604420,1766780 } },
+ { { 604420,1766780 }, { 601660,1766579 } },
+ { { 601660,1766579 }, { 597160,1766980 } },
+ { { 597160,1766980 }, { 591420,1766720 } },
+ { { 591420,1766720 }, { 585360,1765460 } },
+ { { 585360,1765460 }, { 578540,1763680 } },
+ { { 578540,1763680 }, { 574020,1761599 } },
+ { { 574020,1761599 }, { 572520,1760560 } },
+ { { 572520,1760560 }, { 570959,1759000 } },
+ { { 570959,1759000 }, { 566580,1755620 } },
+ { { 566580,1755620 }, { 563820,1752000 } },
+ { { 563820,1752000 }, { 563140,1751380 } },
+ { { 563140,1751380 }, { 560800,1747899 } },
+ { { 560800,1747899 }, { 558640,1742280 } },
+ { { 558640,1742280 }, { 557860,1741620 } },
+ { { 557860,1741620 }, { 555820,1739099 } },
+ { { 555820,1739099 }, { 553920,1737540 } },
+ { { 553920,1737540 }, { 551900,1735179 } },
+ { { 551900,1735179 }, { 551180,1733880 } },
+ { { 551180,1733880 }, { 549540,1729559 } },
+ { { 549540,1729559 }, { 548860,1720720 } },
+ { { 548860,1720720 }, { 549080,1719099 } },
+ { { 549080,1719099 }, { 548200,1714700 } },
+ { { 548200,1714700 }, { 547560,1713860 } },
+ { { 547560,1713860 }, { 544500,1711259 } },
+ { { 544500,1711259 }, { 543939,1709780 } },
+ { { 543939,1709780 }, { 544520,1705439 } },
+ { { 544520,1705439 }, { 543520,1701519 } },
+ { { 543520,1701519 }, { 543920,1699319 } },
+ { { 543920,1699319 }, { 546360,1697440 } },
+ { { 546360,1697440 }, { 546680,1695419 } },
+ { { 546680,1695419 }, { 545600,1694180 } },
+ { { 545600,1694180 }, { 543220,1692000 } },
+ { { 543220,1692000 }, { 538260,1685139 } },
+ { { 538260,1685139 }, { 537540,1683000 } },
+ { { 537540,1683000 }, { 537020,1682220 } },
+ { { 537020,1682220 }, { 535560,1675940 } },
+ { { 535560,1675940 }, { 535940,1671220 } },
+ { { 535940,1671220 }, { 536320,1669379 } },
+ { { 536320,1669379 }, { 535420,1666400 } },
+ { { 535420,1666400 }, { 533540,1664460 } },
+ { { 533540,1664460 }, { 530720,1662860 } },
+ { { 530720,1662860 }, { 529240,1662260 } },
+ { { 529240,1662260 }, { 528780,1659160 } },
+ { { 528780,1659160 }, { 528820,1653560 } },
+ { { 528820,1653560 }, { 529779,1650900 } },
+ { { 529779,1650900 }, { 536760,1640840 } },
+ { { 536760,1640840 }, { 540360,1636120 } },
+ { { 540360,1636120 }, { 541160,1635380 } },
+ { { 541160,1635380 }, { 544719,1629480 } },
+ { { 544719,1629480 }, { 545319,1626140 } },
+ { { 545319,1626140 }, { 543560,1623740 } },
+ { { 543560,1623740 }, { 539880,1620739 } },
+ { { 539880,1620739 }, { 533400,1617300 } },
+ { { 533400,1617300 }, { 527840,1613020 } },
+ { { 527840,1613020 }, { 525200,1611579 } },
+ { { 525200,1611579 }, { 524360,1610800 } },
+ { { 524360,1610800 }, { 517320,1605739 } },
+ { { 517320,1605739 }, { 516240,1604240 } },
+ { { 516240,1604240 }, { 515220,1602000 } },
+ { { 515220,1602000 }, { 514079,1594240 } },
+ { { 514079,1594240 }, { 513740,1581460 } },
+ { { 513740,1581460 }, { 514660,1577359 } },
+ { { 514660,1577359 }, { 514660,1576380 } },
+ { { 514660,1576380 }, { 514199,1575380 } },
+ { { 514199,1575380 }, { 514680,1572860 } },
+ { { 514680,1572860 }, { 513440,1573940 } },
+ { { 513440,1573940 }, { 512399,1575580 } },
+ { { 512399,1575580 }, { 511620,1576220 } },
+ { { 511620,1576220 }, { 507840,1581880 } },
+ { { 507840,1581880 }, { 504600,1584579 } },
+ { { 504600,1584579 }, { 502440,1584599 } },
+ { { 502440,1584599 }, { 499060,1584059 } },
+ { { 499060,1584059 }, { 498019,1581960 } },
+ { { 498019,1581960 }, { 497819,1581240 } },
+ { { 497819,1581240 }, { 498019,1576039 } },
+ { { 498019,1576039 }, { 497539,1574740 } },
+ { { 497539,1574740 }, { 495459,1574460 } },
+ { { 495459,1574460 }, { 492320,1575600 } },
+ { { 492320,1575600 }, { 491040,1576360 } },
+ { { 491040,1576360 }, { 490080,1575640 } },
+ { { 490080,1575640 }, { 490020,1575040 } },
+ { { 490020,1575040 }, { 490220,1574400 } },
+ { { 490220,1574400 }, { 490819,1573440 } },
+ { { 490819,1573440 }, { 492680,1568259 } },
+ { { 492680,1568259 }, { 492920,1566799 } },
+ { { 492920,1566799 }, { 495760,1563660 } },
+ { { 495760,1563660 }, { 496100,1562139 } },
+ { { 496100,1562139 }, { 497879,1560240 } },
+ { { 497879,1560240 }, { 497059,1558020 } },
+ { { 497059,1558020 }, { 495620,1557399 } },
+ { { 495620,1557399 }, { 494800,1556839 } },
+ { { 494800,1556839 }, { 493500,1555479 } },
+ { { 493500,1555479 }, { 491860,1554100 } },
+ { { 491860,1554100 }, { 487840,1552139 } },
+ { { 487840,1552139 }, { 485900,1551720 } },
+ { { 485900,1551720 }, { 483639,1555439 } },
+ { { 483639,1555439 }, { 482080,1556480 } },
+ { { 482080,1556480 }, { 480200,1556259 } },
+ { { 480200,1556259 }, { 478519,1556259 } },
+ { { 478519,1556259 }, { 474020,1554019 } },
+ { { 474020,1554019 }, { 472660,1551539 } },
+ { { 472660,1551539 }, { 471260,1549899 } },
+ { { 471260,1549899 }, { 470459,1548020 } },
+ { { 470459,1548020 }, { 469920,1545479 } },
+ { { 469920,1545479 }, { 469079,1542939 } },
+ { { 469079,1542939 }, { 469120,1541799 } },
+ { { 469120,1541799 }, { 465840,1537139 } },
+ { { 465840,1537139 }, { 463360,1539059 } },
+ { { 463360,1539059 }, { 459680,1546900 } },
+ { { 459680,1546900 }, { 458439,1547160 } },
+ { { 458439,1547160 }, { 456480,1549319 } },
+ { { 456480,1549319 }, { 454160,1551400 } },
+ { { 454160,1551400 }, { 452819,1550820 } },
+ { { 452819,1550820 }, { 451699,1549839 } },
+ { { 451699,1549839 }, { 449620,1548440 } },
+ { { 449620,1548440 }, { 449419,1548080 } },
+ { { 449419,1548080 }, { 447879,1547720 } },
+ { { 447879,1547720 }, { 446540,1546819 } },
+ { { 446540,1546819 }, { 445720,1545640 } },
+ { { 445720,1545640 }, { 444800,1545100 } },
+ { { 444800,1545100 }, { 443500,1542899 } },
+ { { 443500,1542899 }, { 443320,1541799 } },
+ { { 443320,1541799 }, { 443519,1540220 } },
+ { { 443519,1540220 }, { 445060,1537099 } },
+ { { 445060,1537099 }, { 445840,1533040 } },
+ { { 445840,1533040 }, { 442720,1529079 } },
+ { { 442720,1529079 }, { 442479,1528360 } },
+ { { 442479,1528360 }, { 436820,1529240 } },
+ { { 436820,1529240 }, { 436279,1529200 } },
+ { { 436279,1529200 }, { 433280,1529859 } },
+ { { 433280,1529859 }, { 420220,1529899 } },
+ { { 420220,1529899 }, { 414740,1528539 } },
+ { { 414740,1528539 }, { 411340,1527960 } },
+ { { 411340,1527960 }, { 406860,1524660 } },
+ { { 406860,1524660 }, { 405379,1523080 } },
+ { { 405379,1523080 }, { 403639,1520320 } },
+ { { 403639,1520320 }, { 402040,1517220 } },
+ { { 402040,1517220 }, { 400519,1517059 } },
+ { { 400519,1517059 }, { 399180,1516720 } },
+ { { 399180,1516720 }, { 395300,1515179 } },
+ { { 395300,1515179 }, { 394780,1515080 } },
+ { { 394780,1515080 }, { 394759,1515900 } },
+ { { 394759,1515900 }, { 394339,1516579 } },
+ { { 394339,1516579 }, { 393200,1516640 } },
+ { { 393200,1516640 }, { 392599,1521799 } },
+ { { 392599,1521799 }, { 391699,1525200 } },
+ { { 391699,1525200 }, { 391040,1525600 } },
+ { { 391040,1525600 }, { 390540,1526500 } },
+ { { 390540,1526500 }, { 388999,1527939 } },
+ { { 388999,1527939 }, { 387059,1531100 } },
+ { { 387059,1531100 }, { 386540,1531440 } },
+ { { 386540,1531440 }, { 382140,1531839 } },
+ { { 382140,1531839 }, { 377360,1532619 } },
+ { { 377360,1532619 }, { 375640,1532220 } },
+ { { 375640,1532220 }, { 372580,1531019 } },
+ { { 372580,1531019 }, { 371079,1529019 } },
+ { { 371079,1529019 }, { 367280,1526039 } },
+ { { 367280,1526039 }, { 366460,1521900 } },
+ { { 366460,1521900 }, { 364320,1516400 } },
+ { { 364320,1516400 }, { 363779,1515780 } },
+ { { 363779,1515780 }, { 362220,1515320 } },
+ { { 362220,1515320 }, { 361979,1515060 } },
+ { { 361979,1515060 }, { 360820,1515739 } },
+ { { 360820,1515739 }, { 353360,1518620 } },
+ { { 353360,1518620 }, { 347840,1520080 } },
+ { { 347840,1520080 }, { 342399,1521140 } },
+ { { 342399,1521140 }, { 334899,1523380 } },
+ { { 334899,1523380 }, { 333220,1523400 } },
+ { { 333220,1523400 }, { 332599,1522919 } },
+ { { 332599,1522919 }, { 329780,1521640 } },
+ { { 329780,1521640 }, { 325360,1521220 } },
+ { { 325360,1521220 }, { 319000,1520999 } },
+ { { 319000,1520999 }, { 316180,1520240 } },
+ { { 316180,1520240 }, { 312700,1518960 } },
+ { { 312700,1518960 }, { 310520,1517679 } },
+ { { 310520,1517679 }, { 309280,1517260 } },
+ { { 309280,1517260 }, { 306440,1515040 } },
+ { { 306440,1515040 }, { 304140,1512780 } },
+ { { 304140,1512780 }, { 301640,1509720 } },
+ { { 301640,1509720 }, { 301500,1509879 } },
+ { { 301500,1509879 }, { 300320,1509059 } },
+ { { 300320,1509059 }, { 299140,1507339 } },
+ { { 299140,1507339 }, { 297340,1502659 } },
+ { { 297340,1502659 }, { 298960,1508280 } },
+ { { 298960,1508280 }, { 299120,1509299 } },
+ { { 299120,1509299 }, { 298720,1510100 } },
+ { { 298720,1510100 }, { 298420,1512240 } },
+ { { 298420,1512240 }, { 297420,1514540 } },
+ { { 297420,1514540 }, { 296900,1515340 } },
+ { { 296900,1515340 }, { 294780,1517500 } },
+ { { 294780,1517500 }, { 293040,1518380 } },
+ { { 293040,1518380 }, { 289140,1521360 } },
+ { { 289140,1521360 }, { 283600,1523300 } },
+ { { 283600,1523300 }, { 280140,1525220 } },
+ { { 280140,1525220 }, { 279620,1525679 } },
+ { { 279620,1525679 }, { 274960,1527379 } },
+ { { 274960,1527379 }, { 273440,1528819 } },
+ { { 273440,1528819 }, { 269840,1532840 } },
+ { { 269840,1532840 }, { 264800,1536240 } },
+ { { 264800,1536240 }, { 261199,1540419 } },
+ { { 261199,1540419 }, { 257359,1541400 } },
+ { { 257359,1541400 }, { 250460,1539299 } },
+ { { 250460,1539299 }, { 250240,1539400 } },
+ { { 250240,1539400 }, { 249840,1540460 } },
+ { { 249840,1540460 }, { 249779,1541140 } },
+ { { 249779,1541140 }, { 248482,1539783 } },
+ { { 248482,1539783 }, { 251320,1544120 } },
+ { { 251320,1544120 }, { 252500,1548320 } },
+ { { 252500,1548320 }, { 252519,1549740 } },
+ { { 252519,1549740 }, { 253000,1553140 } },
+ { { 253000,1553140 }, { 252920,1556539 } },
+ { { 252920,1556539 }, { 253160,1556700 } },
+ { { 253160,1556700 }, { 254019,1558220 } },
+ { { 254019,1558220 }, { 253039,1559339 } },
+ { { 253039,1559339 }, { 252300,1561920 } },
+ { { 252300,1561920 }, { 251080,1565260 } },
+ { { 251080,1565260 }, { 251120,1566160 } },
+ { { 251120,1566160 }, { 249979,1570240 } },
+ { { 249979,1570240 }, { 248799,1575380 } },
+ { { 248799,1575380 }, { 247180,1579520 } },
+ { { 247180,1579520 }, { 243380,1588440 } },
+ { { 243380,1588440 }, { 241700,1591780 } },
+ { { 241700,1591780 }, { 240280,1593080 } },
+ { { 240280,1593080 }, { 231859,1598380 } },
+ { { 231859,1598380 }, { 228840,1600060 } },
+ { { 228840,1600060 }, { 226420,1601080 } },
+ { { 226420,1601080 }, { 223620,1601940 } },
+ { { 223620,1601940 }, { 220919,1603819 } },
+ { { 220919,1603819 }, { 219599,1604420 } },
+ { { 219599,1604420 }, { 218380,1605200 } },
+ { { 218380,1605200 }, { 213219,1607260 } },
+ { { 213219,1607260 }, { 210040,1607740 } },
+ { { 210040,1607740 }, { 186439,1596440 } },
+ { { 186439,1596440 }, { 185159,1594559 } },
+ { { 185159,1594559 }, { 182239,1588300 } },
+ { { 182239,1588300 }, { 181040,1585380 } },
+ { { 181040,1585380 }, { 180380,1578580 } },
+ { { 180380,1578580 }, { 180679,1573220 } },
+ { { 180679,1573220 }, { 181220,1568539 } },
+ { { 181220,1568539 }, { 181859,1565020 } },
+ { { 181859,1565020 }, { 184499,1555500 } },
+ { { 184499,1555500 }, { 183480,1558160 } },
+ { { 183480,1558160 }, { 182600,1561700 } },
+ { { 182600,1561700 }, { 171700,1554359 } },
+ { { 171700,1554359 }, { 176880,1545920 } },
+ { { 176880,1545920 }, { 189940,1529000 } },
+ { { 189940,1529000 }, { 200040,1535759 } },
+ { { 200040,1535759 }, { 207559,1531660 } },
+ { { 207559,1531660 }, { 218039,1527520 } },
+ { { 218039,1527520 }, { 222360,1526640 } },
+ { { 222360,1526640 }, { 225439,1526440 } },
+ { { 225439,1526440 }, { 231160,1527079 } },
+ { { 231160,1527079 }, { 232300,1527399 } },
+ { { 232300,1527399 }, { 236579,1529140 } },
+ { { 236579,1529140 }, { 238139,1529120 } },
+ { { 238139,1529120 }, { 238799,1529319 } },
+ { { 238799,1529319 }, { 240999,1531780 } },
+ { { 240999,1531780 }, { 238280,1528799 } },
+ { { 238280,1528799 }, { 236900,1523840 } },
+ { { 236900,1523840 }, { 236800,1522700 } },
+ { { 236800,1522700 }, { 235919,1518880 } },
+ { { 235919,1518880 }, { 236080,1514299 } },
+ { { 236080,1514299 }, { 238260,1508380 } },
+ { { 238260,1508380 }, { 240119,1505159 } },
+ { { 240119,1505159 }, { 233319,1496360 } },
+ { { 233319,1496360 }, { 239140,1490759 } },
+ { { 239140,1490759 }, { 258760,1478080 } },
+ { { 258760,1478080 }, { 263940,1484760 } },
+ { { 263940,1484760 }, { 263460,1485159 } },
+ { { 263460,1485159 }, { 265960,1483519 } },
+ { { 265960,1483519 }, { 270380,1482020 } },
+ { { 270380,1482020 }, { 272880,1481420 } },
+ { { 272880,1481420 }, { 275700,1481400 } },
+ { { 275700,1481400 }, { 278380,1481740 } },
+ { { 278380,1481740 }, { 281220,1482979 } },
+ { { 281220,1482979 }, { 284680,1484859 } },
+ { { 284680,1484859 }, { 285979,1486140 } },
+ { { 285979,1486140 }, { 290220,1489100 } },
+ { { 290220,1489100 }, { 292680,1489520 } },
+ { { 292680,1489520 }, { 293280,1490240 } },
+ { { 293280,1490240 }, { 293140,1489160 } },
+ { { 293140,1489160 }, { 293280,1488580 } },
+ { { 293280,1488580 }, { 294100,1486980 } },
+ { { 294100,1486980 }, { 294580,1484960 } },
+ { { 294580,1484960 }, { 295680,1481660 } },
+ { { 295680,1481660 }, { 297840,1477339 } },
+ { { 297840,1477339 }, { 302240,1472280 } },
+ { { 302240,1472280 }, { 307120,1469000 } },
+ { { 307120,1469000 }, { 314500,1466340 } },
+ { { 314500,1466340 }, { 324979,1464740 } },
+ { { 324979,1464740 }, { 338999,1462059 } },
+ { { 338999,1462059 }, { 345599,1461579 } },
+ { { 345599,1461579 }, { 349020,1461620 } },
+ { { 349020,1461620 }, { 353420,1461160 } },
+ { { 353420,1461160 }, { 357000,1461500 } },
+ { { 357000,1461500 }, { 359860,1461579 } },
+ { { 359860,1461579 }, { 364520,1462740 } },
+ { { 364520,1462740 }, { 367280,1464000 } },
+ { { 367280,1464000 }, { 372020,1467560 } },
+ { { 372020,1467560 }, { 373999,1469980 } },
+ { { 373999,1469980 }, { 375580,1472240 } },
+ { { 375580,1472240 }, { 376680,1474460 } },
+ { { 376680,1474460 }, { 377259,1478620 } },
+ { { 377259,1478620 }, { 379279,1480880 } },
+ { { 379279,1480880 }, { 379260,1481600 } },
+ { { 379260,1481600 }, { 378760,1482000 } },
+ { { 378760,1482000 }, { 379300,1482040 } },
+ { { 379300,1482040 }, { 380220,1482460 } },
+ { { 380220,1482460 }, { 380840,1483020 } },
+ { { 380840,1483020 }, { 385519,1482600 } },
+ { { 385519,1482600 }, { 386019,1482320 } },
+ { { 386019,1482320 }, { 386499,1481600 } },
+ { { 386499,1481600 }, { 386540,1480139 } },
+ { { 386540,1480139 }, { 387500,1478220 } },
+ { { 387500,1478220 }, { 388280,1476100 } },
+ { { 388280,1476100 }, { 390060,1473000 } },
+ { { 390060,1473000 }, { 393659,1469460 } },
+ { { 393659,1469460 }, { 396540,1467860 } },
+ { { 396540,1467860 }, { 401260,1466040 } },
+ { { 401260,1466040 }, { 406200,1465100 } },
+ { { 406200,1465100 }, { 410920,1465439 } },
+ { { 410920,1465439 }, { 420659,1467399 } },
+ { { 420659,1467399 }, { 433500,1471480 } },
+ { { 433500,1471480 }, { 441340,1473540 } },
+ { { 441340,1473540 }, { 448620,1475139 } },
+ { { 448620,1475139 }, { 450720,1475880 } },
+ { { 450720,1475880 }, { 453299,1477059 } },
+ { { 453299,1477059 }, { 456620,1478940 } },
+ { { 456620,1478940 }, { 458480,1480399 } },
+ { { 458480,1480399 }, { 461100,1482780 } },
+ { { 461100,1482780 }, { 463820,1486519 } },
+ { { 463820,1486519 }, { 464780,1488199 } },
+ { { 464780,1488199 }, { 466579,1493960 } },
+ { { 466579,1493960 }, { 467120,1497700 } },
+ { { 467120,1497700 }, { 466999,1500280 } },
+ { { 466999,1500280 }, { 467300,1502580 } },
+ { { 467300,1502580 }, { 467399,1505280 } },
+ { { 467399,1505280 }, { 466979,1506920 } },
+ { { 466979,1506920 }, { 467920,1504780 } },
+ { { 467920,1504780 }, { 468159,1505040 } },
+ { { 468159,1505040 }, { 469400,1504859 } },
+ { { 469400,1504859 }, { 470300,1505540 } },
+ { { 470300,1505540 }, { 471240,1505200 } },
+ { { 471240,1505200 }, { 471579,1504280 } },
+ { { 471579,1504280 }, { 473939,1502379 } },
+ { { 473939,1502379 }, { 476860,1500200 } },
+ { { 476860,1500200 }, { 479800,1498620 } },
+ { { 479800,1498620 }, { 480840,1498120 } },
+ { { 480840,1498120 }, { 485220,1497480 } },
+ { { 485220,1497480 }, { 489979,1497460 } },
+ { { 489979,1497460 }, { 494899,1498700 } },
+ { { 494899,1498700 }, { 500099,1501320 } },
+ { { 500099,1501320 }, { 501439,1501839 } },
+ { { 501439,1501839 }, { 503400,1502939 } },
+ { { 503400,1502939 }, { 510760,1508340 } },
+ { { 510760,1508340 }, { 513640,1510920 } },
+ { { 513640,1510920 }, { 518579,1514599 } },
+ { { 518579,1514599 }, { 519020,1515260 } },
+ { { 519020,1515260 }, { 520700,1516480 } },
+ { { 520700,1516480 }, { 524960,1521480 } },
+ { { 524960,1521480 }, { 526820,1524820 } },
+ { { 526820,1524820 }, { 528280,1527820 } },
+ { { 528280,1527820 }, { 529120,1533120 } },
+ { { 529120,1533120 }, { 528820,1537139 } },
+ { { 528820,1537139 }, { 527020,1543920 } },
+ { { 527020,1543920 }, { 526959,1546780 } },
+ { { 526959,1546780 }, { 526420,1548060 } },
+ { { 526420,1548060 }, { 527020,1547919 } },
+ { { 527020,1547919 }, { 527620,1548160 } },
+ { { 527620,1548160 }, { 528980,1548020 } },
+ { { 528980,1548020 }, { 535180,1544980 } },
+ { { 535180,1544980 }, { 540860,1542979 } },
+ { { 540860,1542979 }, { 546480,1542720 } },
+ { { 546480,1542720 }, { 547420,1542860 } },
+ { { 547420,1542860 }, { 551800,1544140 } },
+ { { 551800,1544140 }, { 558740,1547939 } },
+ { { 558740,1547939 }, { 569920,1556259 } },
+ { { 569920,1556259 }, { 573660,1560220 } },
+ { { 573660,1560220 }, { 573040,1559500 } },
+ { { 573040,1559500 }, { 574740,1559220 } },
+ { { 574740,1559220 }, { 588480,1562899 } },
+ { { 588480,1562899 }, { 585180,1576019 } },
+ { { 585180,1576019 }, { 583440,1577979 } },
+ { { 583440,1577979 }, { 584280,1582399 } },
+ { { 584280,1582399 }, { 584520,1588960 } },
+ { { 584520,1588960 }, { 583420,1601620 } },
+ { { 583420,1601620 }, { 582840,1603880 } },
+ { { 582840,1603880 }, { 579860,1611400 } },
+ { { 579860,1611400 }, { 577980,1614579 } },
+ { { 577980,1614579 }, { 577380,1616080 } },
+ { { 577380,1616080 }, { 563800,1621579 } },
+ { { 563800,1621579 }, { 561320,1622320 } },
+ { { 561320,1622320 }, { 565080,1621960 } },
+ { { 565080,1621960 }, { 571680,1620780 } },
+ { { 571680,1620780 }, { 583260,1628340 } },
+ { { 583260,1628340 }, { 583100,1630399 } },
+ { { 583100,1630399 }, { 582200,1632160 } },
+ { { 582200,1632160 }, { 595380,1627020 } },
+ { { 595380,1627020 }, { 597400,1627320 } },
+ { { 597400,1627320 }, { 602240,1628459 } },
+ { { 602240,1628459 }, { 605660,1630260 } },
+ { { 605660,1630260 }, { 610319,1634140 } },
+ { { 610319,1634140 }, { 612340,1636319 } },
+ { { 612340,1636319 }, { 614820,1638020 } },
+ { { 614820,1638020 }, { 616460,1638740 } },
+ { { 616460,1638740 }, { 620420,1639500 } },
+ { { 620420,1639500 }, { 623000,1639280 } },
+ { { 623000,1639280 }, { 624459,1639359 } },
+ { { 624459,1639359 }, { 626180,1640159 } },
+ { { 626180,1640159 }, { 627279,1640940 } },
+ { { 627279,1640940 }, { 629980,1643759 } },
+ { { 629980,1643759 }, { 632380,1648000 } },
+ { { 632380,1648000 }, { 635020,1654800 } },
+ { { 635020,1654800 }, { 636320,1659140 } },
+ { { 636320,1659140 }, { 636680,1663620 } },
+ { { 636680,1663620 }, { 636180,1665780 } },
+ { { 636180,1665780 }, { 630620,1669720 } },
+ { { 630620,1669720 }, { 628760,1672979 } },
+ { { 628760,1672979 }, { 627540,1676859 } },
+ { { 627540,1676859 }, { 627040,1680699 } },
+ { { 627040,1680699 }, { 624700,1686500 } },
+ { { 624700,1686500 }, { 623260,1688799 } },
+ { { 623260,1688799 }, { 619620,1693799 } },
+ { { 619620,1693799 }, { 621720,1694859 } },
+ { { 621720,1694859 }, { 624940,1694379 } },
+ { { 624940,1694379 }, { 627120,1695600 } },
+ { { 627120,1695600 }, { 627740,1696120 } },
+ { { 627740,1696120 }, { 631120,1697460 } },
+ { { 631120,1697460 }, { 633980,1698340 } },
+ { { 633980,1698340 }, { 638380,1700460 } },
+ { { 638380,1700460 }, { 642660,1703300 } },
+ { { 642660,1703300 }, { 643620,1704140 } },
+ { { 643620,1704140 }, { 646300,1707000 } },
+ { { 646300,1707000 }, { 649060,1710880 } },
+ { { 649060,1710880 }, { 651160,1714879 } },
+ { { 651160,1714879 }, { 651740,1716559 } },
+ { { 651740,1716559 }, { 653139,1722619 } },
+ { { 653139,1722619 }, { 653020,1728320 } },
+ { { 653020,1728320 }, { 652719,1731420 } },
+ { { 652719,1731420 }, { 651619,1736360 } },
+ { { 651619,1736360 }, { 649819,1743160 } },
+ { { 649819,1743160 }, { 646440,1749059 } },
+ { { 646440,1749059 }, { 645219,1750399 } },
+ { { 645219,1750399 }, { 643959,1752679 } },
+ { { 643959,1752679 }, { 643959,1753740 } },
+ { { 643959,1753740 }, { 642140,1754240 } },
+ { { 642140,1754240 }, { 643760,1754099 } },
+ { { 643760,1754099 }, { 644320,1754280 } },
+ { { 644320,1754280 }, { 645000,1754879 } },
+ { { 645000,1754879 }, { 646940,1755620 } },
+ { { 646940,1755620 }, { 654779,1757820 } },
+ { { 654779,1757820 }, { 661100,1761559 } },
+ { { 661100,1761559 }, { 664099,1763980 } },
+ { { 664099,1763980 }, { 668220,1768480 } },
+ { { 668220,1768480 }, { 671920,1773640 } },
+ { { 671920,1773640 }, { 674939,1779540 } },
+ { { 674939,1779540 }, { 677760,1782440 } },
+ { { 677760,1782440 }, { 679080,1785739 } },
+ { { 679080,1785739 }, { 678780,1788100 } },
+ { { 678780,1788100 }, { 678020,1791500 } },
+ { { 678020,1791500 }, { 677120,1793600 } },
+ { { 677120,1793600 }, { 676860,1795800 } },
+ { { 676860,1795800 }, { 676440,1797320 } },
+ { { 676440,1797320 }, { 676459,1798519 } },
+ { { 676459,1798519 }, { 675620,1800159 } },
+ { { 675620,1800159 }, { 675520,1801019 } },
+ { { 675520,1801019 }, { 673360,1804899 } },
+ { { 673360,1804899 }, { 672740,1807079 } },
+ { { 672740,1807079 }, { 673300,1809260 } },
+ { { 673300,1809260 }, { 674539,1811019 } },
+ { { 674539,1811019 }, { 675499,1812020 } },
+ { { 675499,1812020 }, { 677660,1817240 } },
+ { { 677660,1817240 }, { 679659,1824280 } },
+ { { 679659,1824280 }, { 680380,1828779 } },
+ { { 680380,1828779 }, { 679519,1837999 } },
+ { { 679519,1837999 }, { 677940,1844379 } },
+ { { 677940,1844379 }, { 676940,1846900 } },
+ { { 676940,1846900 }, { 675479,1849379 } },
+ { { 675479,1849379 }, { 674000,1851200 } },
+ { { 674000,1851200 }, { 671380,1853480 } },
+ { { 671380,1853480 }, { 667019,1855240 } },
+ { { 667019,1855240 }, { 662540,1856060 } },
+ { { 662540,1856060 }, { 660960,1856599 } },
+ { { 660960,1856599 }, { 656240,1857020 } },
+ { { 656240,1857020 }, { 655600,1856960 } },
+ { { 655600,1856960 }, { 652839,1855880 } },
+ { { 652839,1855880 }, { 652019,1855840 } },
+ { { 652019,1855840 }, { 651459,1855060 } },
+ { { 651459,1855060 }, { 652179,1854359 } },
+ { { 652179,1854359 }, { 652019,1849919 } },
+ { { 652019,1849919 }, { 650620,1846920 } },
+ { { 650620,1846920 }, { 647299,1844540 } },
+ { { 647299,1844540 }, { 644500,1843819 } },
+ { { 644500,1843819 }, { 641860,1844859 } },
+ { { 641860,1844859 }, { 641059,1845340 } },
+ { { 641059,1845340 }, { 638860,1845820 } },
+ { { 638860,1845820 }, { 638000,1845820 } },
+ { { 638000,1845820 }, { 636340,1845479 } },
+ { { 636340,1845479 }, { 634980,1844800 } },
+ { { 634980,1844800 }, { 632660,1842979 } },
+ { { 632660,1842979 }, { 631140,1841120 } },
+ { { 631140,1841120 }, { 629140,1839520 } },
+ { { 629140,1839520 }, { 626640,1839540 } },
+ { { 626640,1839540 }, { 624159,1840739 } },
+ { { 624159,1840739 }, { 623820,1841380 } },
+ { { 623820,1841380 }, { 622440,1842719 } },
+ { { 622440,1842719 }, { 622100,1843680 } },
+ { { 622100,1843680 }, { 623780,1846100 } },
+ { { 623780,1846100 }, { 624580,1846920 } },
+ { { 624580,1846920 }, { 626120,1856720 } },
+ { { 626120,1856720 }, { 627440,1860000 } },
+ { { 627440,1860000 }, { 628000,1864299 } },
+ { { 628000,1864299 }, { 627380,1865999 } },
+ { { 627380,1865999 }, { 626260,1867580 } },
+ { { 626260,1867580 }, { 623660,1869520 } },
+ { { 623660,1869520 }, { 618680,1872780 } },
+ { { 618680,1872780 }, { 617699,1873140 } },
+ { { 617699,1873140 }, { 612000,1874160 } },
+ { { 612000,1874160 }, { 609840,1874220 } },
+ { { 609840,1874220 }, { 606940,1873860 } },
+ { { 136680,1926960 }, { 135500,1926360 } },
+ { { 135500,1926360 }, { 137360,1923060 } },
+ { { 137360,1923060 }, { 139500,1918559 } },
+ { { 139500,1918559 }, { 140780,1913239 } },
+ { { 140780,1913239 }, { 139600,1913020 } },
+ { { 139600,1913020 }, { 127380,1923600 } },
+ { { 127380,1923600 }, { 122800,1926059 } },
+ { { 122800,1926059 }, { 118879,1927719 } },
+ { { 118879,1927719 }, { 114420,1928300 } },
+ { { 114420,1928300 }, { 111480,1927020 } },
+ { { 111480,1927020 }, { 110619,1925399 } },
+ { { 110619,1925399 }, { 109620,1924200 } },
+ { { 109620,1924200 }, { 108860,1922780 } },
+ { { 108860,1922780 }, { 108479,1920999 } },
+ { { 108479,1920999 }, { 106600,1918080 } },
+ { { 106600,1918080 }, { 106220,1917740 } },
+ { { 106220,1917740 }, { 105199,1916960 } },
+ { { 105199,1916960 }, { 101460,1914859 } },
+ { { 101460,1914859 }, { 99480,1914379 } },
+ { { 99480,1914379 }, { 97179,1913499 } },
+ { { 97179,1913499 }, { 94900,1911100 } },
+ { { 94900,1911100 }, { 94100,1909639 } },
+ { { 94100,1909639 }, { 93379,1907740 } },
+ { { 93379,1907740 }, { 93960,1898259 } },
+ { { 93960,1898259 }, { 93739,1896460 } },
+ { { 93739,1896460 }, { 94299,1893080 } },
+ { { 94299,1893080 }, { 97240,1883440 } },
+ { { 97240,1883440 }, { 99799,1879780 } },
+ { { 99799,1879780 }, { 100400,1878120 } },
+ { { 100400,1878120 }, { 100199,1877200 } },
+ { { 100199,1877200 }, { 98940,1877460 } },
+ { { 98940,1877460 }, { 96320,1878480 } },
+ { { 96320,1878480 }, { 86020,1881039 } },
+ { { 86020,1881039 }, { 84340,1881080 } },
+ { { 84340,1881080 }, { 76780,1882600 } },
+ { { 76780,1882600 }, { 74380,1883580 } },
+ { { 74380,1883580 }, { 72679,1884019 } },
+ { { 72679,1884019 }, { 70900,1885940 } },
+ { { 70900,1885940 }, { 71240,1888340 } },
+ { { 71240,1888340 }, { 72720,1889940 } },
+ { { 72720,1889940 }, { 74640,1891360 } },
+ { { 74640,1891360 }, { 75620,1893179 } },
+ { { 75620,1893179 }, { 77140,1895340 } },
+ { { 77140,1895340 }, { 81040,1899500 } },
+ { { 81040,1899500 }, { 82760,1900380 } },
+ { { 82760,1900380 }, { 83720,1902300 } },
+ { { 83720,1902300 }, { 85459,1903700 } },
+ { { 85459,1903700 }, { 86960,1905940 } },
+ { { 86960,1905940 }, { 88280,1913020 } },
+ { { 88280,1913020 }, { 88160,1913539 } },
+ { { 88160,1913539 }, { 88020,1913860 } },
+ { { 88020,1913860 }, { 86080,1915200 } },
+ { { 86080,1915200 }, { 85660,1916740 } },
+ { { 85660,1916740 }, { 83899,1918799 } },
+ { { 83899,1918799 }, { 79360,1921160 } },
+ { { 79360,1921160 }, { 76400,1923140 } },
+ { { 76400,1923140 }, { 70800,1926180 } },
+ { { 70800,1926180 }, { 64460,1927659 } },
+ { { 64460,1927659 }, { 60880,1927820 } },
+ { { 60880,1927820 }, { 55780,1925580 } },
+ { { 55780,1925580 }, { 54940,1925040 } },
+ { { 54940,1925040 }, { 52199,1921700 } },
+ { { 52199,1921700 }, { 49680,1916579 } },
+ { { 49680,1916579 }, { 48719,1914180 } },
+ { { 48719,1914180 }, { 48620,1913080 } },
+ { { 48620,1913080 }, { 47640,1909120 } },
+ { { 47640,1909120 }, { 48280,1899319 } },
+ { { 48280,1899319 }, { 49140,1895600 } },
+ { { 49140,1895600 }, { 50320,1892899 } },
+ { { 50320,1892899 }, { 51559,1890640 } },
+ { { 51559,1890640 }, { 52140,1889960 } },
+ { { 52140,1889960 }, { 54640,1887999 } },
+ { { 54640,1887999 }, { 55639,1886500 } },
+ { { 55639,1886500 }, { 55720,1885080 } },
+ { { 55720,1885080 }, { 55439,1883220 } },
+ { { 55439,1883220 }, { 54640,1882159 } },
+ { { 54640,1882159 }, { 54100,1880300 } },
+ { { 54100,1880300 }, { 52479,1874079 } },
+ { { 52479,1874079 }, { 51700,1869000 } },
+ { { 51700,1869000 }, { 51600,1865419 } },
+ { { 51600,1865419 }, { 51720,1859820 } },
+ { { 51720,1859820 }, { 52160,1857260 } },
+ { { 52160,1857260 }, { 52539,1856120 } },
+ { { 52539,1856120 }, { 57240,1845720 } },
+ { { 57240,1845720 }, { 58280,1844400 } },
+ { { 58280,1844400 }, { 60639,1840820 } },
+ { { 60639,1840820 }, { 65580,1835540 } },
+ { { 65580,1835540 }, { 68340,1833340 } },
+ { { 68340,1833340 }, { 71660,1831480 } },
+ { { 71660,1831480 }, { 73460,1829960 } },
+ { { 73460,1829960 }, { 75200,1829319 } },
+ { { 75200,1829319 }, { 77200,1828960 } },
+ { { 77200,1828960 }, { 78640,1828920 } },
+ { { 78640,1828920 }, { 111780,1842700 } },
+ { { 111780,1842700 }, { 112800,1843480 } },
+ { { 112800,1843480 }, { 113879,1844879 } },
+ { { 113879,1844879 }, { 116379,1847379 } },
+ { { 116379,1847379 }, { 116360,1847580 } },
+ { { 116360,1847580 }, { 117100,1848799 } },
+ { { 117100,1848799 }, { 120160,1851799 } },
+ { { 120160,1851799 }, { 121860,1852320 } },
+ { { 121860,1852320 }, { 124280,1852679 } },
+ { { 124280,1852679 }, { 128920,1854659 } },
+ { { 128920,1854659 }, { 130840,1856360 } },
+ { { 130840,1856360 }, { 133520,1859460 } },
+ { { 133520,1859460 }, { 135079,1860860 } },
+ { { 135079,1860860 }, { 137280,1864440 } },
+ { { 137280,1864440 }, { 142980,1872899 } },
+ { { 142980,1872899 }, { 144600,1875840 } },
+ { { 144600,1875840 }, { 147240,1883480 } },
+ { { 147240,1883480 }, { 147460,1886539 } },
+ { { 147460,1886539 }, { 147660,1886920 } },
+ { { 147660,1886920 }, { 148399,1891720 } },
+ { { 148399,1891720 }, { 148820,1896799 } },
+ { { 148820,1896799 }, { 148399,1898880 } },
+ { { 148399,1898880 }, { 148799,1899420 } },
+ { { 148799,1899420 }, { 150520,1898539 } },
+ { { 150520,1898539 }, { 154760,1892760 } },
+ { { 154760,1892760 }, { 156580,1889240 } },
+ { { 156580,1889240 }, { 156940,1888900 } },
+ { { 156940,1888900 }, { 157540,1889540 } },
+ { { 157540,1889540 }, { 156860,1896819 } },
+ { { 156860,1896819 }, { 155639,1903940 } },
+ { { 155639,1903940 }, { 153679,1908100 } },
+ { { 153679,1908100 }, { 152859,1909039 } },
+ { { 152859,1909039 }, { 149660,1915580 } },
+ { { 149660,1915580 }, { 148000,1918600 } },
+ { { 148000,1918600 }, { 141640,1926980 } },
+ { { 141640,1926980 }, { 140060,1927899 } },
+ { { 140060,1927899 }, { 136960,1929019 } },
+ { { 136960,1929019 }, { 136680,1926960 } },
+ { { 627100,1941519 }, { 625120,1940060 } },
+ { { 625120,1940060 }, { 614580,1934680 } },
+ { { 614580,1934680 }, { 608780,1929319 } },
+ { { 608780,1929319 }, { 607400,1927679 } },
+ { { 607400,1927679 }, { 606160,1925920 } },
+ { { 606160,1925920 }, { 604480,1922240 } },
+ { { 604480,1922240 }, { 602420,1916819 } },
+ { { 602420,1916819 }, { 602279,1915260 } },
+ { { 602279,1915260 }, { 602880,1907960 } },
+ { { 602880,1907960 }, { 604140,1902719 } },
+ { { 604140,1902719 }, { 605880,1898539 } },
+ { { 605880,1898539 }, { 606640,1897399 } },
+ { { 606640,1897399 }, { 609680,1894420 } },
+ { { 609680,1894420 }, { 611099,1893640 } },
+ { { 611099,1893640 }, { 616099,1890340 } },
+ { { 616099,1890340 }, { 617520,1889160 } },
+ { { 617520,1889160 }, { 620220,1885540 } },
+ { { 620220,1885540 }, { 624480,1882260 } },
+ { { 624480,1882260 }, { 628660,1880280 } },
+ { { 628660,1880280 }, { 632520,1879659 } },
+ { { 632520,1879659 }, { 637760,1879859 } },
+ { { 637760,1879859 }, { 640899,1881500 } },
+ { { 640899,1881500 }, { 644220,1883980 } },
+ { { 644220,1883980 }, { 643900,1890860 } },
+ { { 643900,1890860 }, { 643060,1894160 } },
+ { { 643060,1894160 }, { 642459,1900320 } },
+ { { 642459,1900320 }, { 642400,1903120 } },
+ { { 642400,1903120 }, { 643819,1908519 } },
+ { { 643819,1908519 }, { 644700,1912560 } },
+ { { 644700,1912560 }, { 644640,1916380 } },
+ { { 644640,1916380 }, { 644959,1918600 } },
+ { { 644959,1918600 }, { 642540,1925620 } },
+ { { 642540,1925620 }, { 642439,1926640 } },
+ { { 642439,1926640 }, { 641860,1928300 } },
+ { { 641860,1928300 }, { 638700,1932939 } },
+ { { 638700,1932939 }, { 634820,1934200 } },
+ { { 634820,1934200 }, { 631980,1936539 } },
+ { { 631980,1936539 }, { 630160,1940600 } },
+ { { 630160,1940600 }, { 627740,1941640 } },
+ { { 627740,1941640 }, { 627400,1941660 } },
+ { { 627400,1941660 }, { 627100,1941519 } }
+ };
+
+#if 0
+ // Verify whether two any two non-neighbor line segments intersect. They should not, otherwise the Voronoi builder
+ // is not guaranteed to succeed.
+ for (size_t i = 0; i < lines.size(); ++ i)
+ for (size_t j = i + 1; j < lines.size(); ++ j) {
+ Point &ip1 = lines[i].a;
+ Point &ip2 = lines[i].b;
+ Point &jp1 = lines[j].a;
+ Point &jp2 = lines[j].b;
+ if (&ip1 != &jp2 && &jp1 != &ip2) {
+ REQUIRE(! Slic3r::Geometry::segments_intersect(ip1, ip2, jp1, jp2));
+ }
+ }
+#endif
+
+ VD vd;
+ construct_voronoi(lines.begin(), lines.end(), &vd);
+
+ for (const auto& edge : vd.edges())
+ if (edge.is_finite()) {
+ auto v0 = edge.vertex0();
+ auto v1 = edge.vertex1();
+ REQUIRE((v0->x() == 0 || std::isnormal(v0->x())));
+ REQUIRE((v0->y() == 0 || std::isnormal(v0->y())));
+ REQUIRE((v1->x() == 0 || std::isnormal(v1->x())));
+ REQUIRE((v1->y() == 0 || std::isnormal(v1->y())));
+ }
+
+#ifdef VORONOI_DEBUG_OUT
+ dump_voronoi_to_svg(debug_out_path("voronoi-NaNs.svg").c_str(),
+ vd, Points(), lines, Polygons(), Lines(), 0.015);
+#endif
+}
+
+struct OffsetTest {
+ double distance;
+ size_t num_outer;
+ size_t num_inner;
+};
+
+TEST_CASE("Voronoi offset", "[VoronoiOffset]")
+{
+ Polygons poly_with_hole = { Polygon {
+ { 0, 10000000},
+ { 700000, 0},
+ { 700000, 9000000},
+ { 9100000, 9000000},
+ { 9100000, 0},
+ {10000000, 10000000}
+ }
+ };
+
+ double area = std::accumulate(poly_with_hole.begin(), poly_with_hole.end(), 0., [](double a, auto &poly){ return a + poly.area(); });
+ REQUIRE(area > 0.);
+
+ VD vd;
+ Lines lines = to_lines(poly_with_hole);
+ construct_voronoi(lines.begin(), lines.end(), &vd);
+
+ for (const OffsetTest &ot : {
+ OffsetTest { scale_(0.2), 1, 1 },
+ OffsetTest { scale_(0.4), 1, 1 },
+ OffsetTest { scale_(0.5), 1, 1 },
+ OffsetTest { scale_(0.505), 1, 2 },
+ OffsetTest { scale_(0.51), 1, 2 },
+ OffsetTest { scale_(0.52), 1, 1 },
+ OffsetTest { scale_(0.53), 1, 1 },
+ OffsetTest { scale_(0.54), 1, 1 },
+ OffsetTest { scale_(0.55), 1, 0 }
+ }) {
+
+ Polygons offsetted_polygons_out = voronoi_offset(vd, lines, ot.distance, scale_(0.005));
+ REQUIRE(offsetted_polygons_out.size() == ot.num_outer);
+
+#ifdef VORONOI_DEBUG_OUT
+ dump_voronoi_to_svg(debug_out_path("voronoi-offset-out-%lf.svg", ot.distance).c_str(),
+ vd, Points(), lines, offsetted_polygons_out);
+#endif
+
+ Polygons offsetted_polygons_in = voronoi_offset(vd, lines, - ot.distance, scale_(0.005));
+ REQUIRE(offsetted_polygons_in.size() == ot.num_inner);
+
+#ifdef VORONOI_DEBUG_OUT
+ dump_voronoi_to_svg(debug_out_path("voronoi-offset-in-%lf.svg", ot.distance).c_str(),
+ vd, Points(), lines, offsetted_polygons_in);
+#endif
+ }
+}
+
+TEST_CASE("Voronoi offset 2", "[VoronoiOffset]")
+{
+ coord_t mm = coord_t(scale_(1.));
+ Polygons poly = {
+ Polygon {
+ { 0, 0 },
+ { 1, 0 },
+ { 1, 1 },
+ { 2, 1 },
+ { 2, 0 },
+ { 3, 0 },
+ { 3, 2 },
+ { 0, 2 }
+ },
+ Polygon {
+ { 0, - 1 - 2 },
+ { 3, - 1 - 2 },
+ { 3, - 1 - 0 },
+ { 2, - 1 - 0 },
+ { 2, - 1 - 1 },
+ { 1, - 1 - 1 },
+ { 1, - 1 - 0 },
+ { 0, - 1 - 0 }
+ },
+ };
+ for (Polygon &p : poly)
+ for (Point &pt : p.points)
+ pt *= mm;
+
+ double area = std::accumulate(poly.begin(), poly.end(), 0., [](double a, auto &poly){ return a + poly.area(); });
+ REQUIRE(area > 0.);
+
+ VD vd;
+ Lines lines = to_lines(poly);
+ construct_voronoi(lines.begin(), lines.end(), &vd);
+
+ for (const OffsetTest &ot : {
+ OffsetTest { scale_(0.2), 2, 2 },
+ OffsetTest { scale_(0.4), 2, 2 },
+ OffsetTest { scale_(0.45), 2, 2 },
+ OffsetTest { scale_(0.48), 2, 2 },
+//FIXME Exact intersections of an Offset curve with any Voronoi vertex are not handled correctly yet.
+// OffsetTest { scale_(0.5), 2, 2 },
+ OffsetTest { scale_(0.505), 2, 4 },
+ OffsetTest { scale_(0.7), 2, 0 },
+ OffsetTest { scale_(0.8), 1, 0 }
+ }) {
+
+ Polygons offsetted_polygons_out = voronoi_offset(vd, lines, ot.distance, scale_(0.005));
+#ifdef VORONOI_DEBUG_OUT
+ dump_voronoi_to_svg(debug_out_path("voronoi-offset2-out-%lf.svg", ot.distance).c_str(),
+ vd, Points(), lines, offsetted_polygons_out);
+#endif
+ REQUIRE(offsetted_polygons_out.size() == ot.num_outer);
+
+ Polygons offsetted_polygons_in = voronoi_offset(vd, lines, - ot.distance, scale_(0.005));
+#ifdef VORONOI_DEBUG_OUT
+ dump_voronoi_to_svg(debug_out_path("voronoi-offset2-in-%lf.svg", ot.distance).c_str(),
+ vd, Points(), lines, offsetted_polygons_in);
+#endif
+ REQUIRE(offsetted_polygons_in.size() == ot.num_inner);
+ }
+}
+
+TEST_CASE("Voronoi offset 3", "[VoronoiOffset]")
+{
+ coord_t mm = coord_t(scale_(1.));
+ Polygons poly = {
+ Polygon {
+ { 0, 0 },
+ { 2, 0 },
+ { 2, 1 },
+ { 3, 1 },
+ { 3, 0 },
+ { 5, 0 },
+ { 5, 2 },
+ { 4, 2 },
+ { 4, 3 },
+ { 1, 3 },
+ { 1, 2 },
+ { 0, 2 }
+ },
+ Polygon {
+ { 0, -1 - 2 },
+ { 1, -1 - 2 },
+ { 1, -1 - 3 },
+ { 4, -1 - 3 },
+ { 4, -1 - 2 },
+ { 5, -1 - 2 },
+ { 5, -1 - 0 },
+ { 3, -1 - 0 },
+ { 3, -1 - 1 },
+ { 2, -1 - 1 },
+ { 2, -1 - 0 },
+ { 0, -1 - 0 }
+ },
+ };
+ for (Polygon &p : poly) {
+ REQUIRE(p.area() > 0.);
+ for (Point &pt : p.points)
+ pt *= mm;
+ }
+
+ VD vd;
+ Lines lines = to_lines(poly);
+ construct_voronoi(lines.begin(), lines.end(), &vd);
+
+ for (const OffsetTest &ot : {
+ OffsetTest { scale_(0.2), 2, 2 },
+ OffsetTest { scale_(0.4), 2, 2 },
+ OffsetTest { scale_(0.49), 2, 2 },
+//FIXME this fails
+// OffsetTest { scale_(0.5), 2, 2 },
+ OffsetTest { scale_(0.51), 2, 2 },
+ OffsetTest { scale_(0.56), 2, 2 },
+ OffsetTest { scale_(0.6), 2, 2 },
+ OffsetTest { scale_(0.7), 2, 2 },
+ OffsetTest { scale_(0.8), 1, 6 },
+ OffsetTest { scale_(0.9), 1, 6 },
+ OffsetTest { scale_(0.99), 1, 6 },
+//FIXME this fails
+// OffsetTest { scale_(1.0), 1, 6 },
+ OffsetTest { scale_(1.01), 1, 0 },
+ }) {
+
+ Polygons offsetted_polygons_out = voronoi_offset(vd, lines, ot.distance, scale_(0.005));
+#ifdef VORONOI_DEBUG_OUT
+ dump_voronoi_to_svg(debug_out_path("voronoi-offset2-out-%lf.svg", ot.distance).c_str(),
+ vd, Points(), lines, offsetted_polygons_out);
+#endif
+ REQUIRE(offsetted_polygons_out.size() == ot.num_outer);
+
+ Polygons offsetted_polygons_in = voronoi_offset(vd, lines, - ot.distance, scale_(0.005));
+#ifdef VORONOI_DEBUG_OUT
+ dump_voronoi_to_svg(debug_out_path("voronoi-offset2-in-%lf.svg", ot.distance).c_str(),
+ vd, Points(), lines, offsetted_polygons_in);
+#endif
+ REQUIRE(offsetted_polygons_in.size() == ot.num_inner);
+ }
+}
diff --git a/tests/sla_print/CMakeLists.txt b/tests/sla_print/CMakeLists.txt
index 9d47f3ae4..dc583f1a1 100644
--- a/tests/sla_print/CMakeLists.txt
+++ b/tests/sla_print/CMakeLists.txt
@@ -1,7 +1,8 @@
get_filename_component(_TEST_NAME ${CMAKE_CURRENT_LIST_DIR} NAME)
-add_executable(${_TEST_NAME}_tests ${_TEST_NAME}_tests_main.cpp
- sla_print_tests.cpp
+add_executable(${_TEST_NAME}_tests ${_TEST_NAME}_tests_main.cpp
+ sla_print_tests.cpp
sla_test_utils.hpp sla_test_utils.cpp
+ sla_supptgen_tests.cpp
sla_raycast_tests.cpp)
target_link_libraries(${_TEST_NAME}_tests test_common libslic3r)
set_property(TARGET ${_TEST_NAME}_tests PROPERTY FOLDER "tests")
diff --git a/tests/sla_print/sla_print_tests.cpp b/tests/sla_print/sla_print_tests.cpp
index 10f5742d3..bdd5731dc 100644
--- a/tests/sla_print/sla_print_tests.cpp
+++ b/tests/sla_print/sla_print_tests.cpp
@@ -1,9 +1,13 @@
#include <unordered_set>
#include <unordered_map>
#include <random>
+#include <cstdint>
#include "sla_test_utils.hpp"
+#include <libslic3r/SLA/SupportTreeMesher.hpp>
+#include <libslic3r/SLA/Concurrency.hpp>
+
namespace {
const char *const BELOW_PAD_TEST_OBJECTS[] = {
@@ -37,9 +41,9 @@ TEST_CASE("Support point generator should be deterministic if seeded",
"[SLASupportGeneration], [SLAPointGen]") {
TriangleMesh mesh = load_model("A_upsidedown.obj");
- sla::EigenMesh3D emesh{mesh};
+ sla::IndexedMesh emesh{mesh};
- sla::SupportConfig supportcfg;
+ sla::SupportTreeConfig supportcfg;
sla::SupportPointGenerator::Config autogencfg;
autogencfg.head_diameter = float(2 * supportcfg.head_front_radius_mm);
sla::SupportPointGenerator point_gen{emesh, autogencfg, [] {}, [](int) {}};
@@ -60,7 +64,7 @@ TEST_CASE("Support point generator should be deterministic if seeded",
point_gen.execute(slices, slicegrid);
auto get_chksum = [](const std::vector<sla::SupportPoint> &pts){
- long long chksum = 0;
+ int64_t chksum = 0;
for (auto &pt : pts) {
auto p = scaled(pt.pos);
chksum += p.x() + p.y() + p.z();
@@ -69,7 +73,7 @@ TEST_CASE("Support point generator should be deterministic if seeded",
return chksum;
};
- long long checksum = get_chksum(point_gen.output());
+ int64_t checksum = get_chksum(point_gen.output());
size_t ptnum = point_gen.output().size();
REQUIRE(point_gen.output().size() > 0);
@@ -124,14 +128,14 @@ TEST_CASE("WingedPadAroundObjectIsValid", "[SLASupportGeneration]") {
}
TEST_CASE("ElevatedSupportGeometryIsValid", "[SLASupportGeneration]") {
- sla::SupportConfig supportcfg;
- supportcfg.object_elevation_mm = 5.;
+ sla::SupportTreeConfig supportcfg;
+ supportcfg.object_elevation_mm = 10.;
- for (auto fname : SUPPORT_TEST_MODELS) test_supports(fname);
+ for (auto fname : SUPPORT_TEST_MODELS) test_supports(fname, supportcfg);
}
TEST_CASE("FloorSupportGeometryIsValid", "[SLASupportGeneration]") {
- sla::SupportConfig supportcfg;
+ sla::SupportTreeConfig supportcfg;
supportcfg.object_elevation_mm = 0;
for (auto &fname: SUPPORT_TEST_MODELS) test_supports(fname, supportcfg);
@@ -139,7 +143,7 @@ TEST_CASE("FloorSupportGeometryIsValid", "[SLASupportGeneration]") {
TEST_CASE("ElevatedSupportsDoNotPierceModel", "[SLASupportGeneration]") {
- sla::SupportConfig supportcfg;
+ sla::SupportTreeConfig supportcfg;
for (auto fname : SUPPORT_TEST_MODELS)
test_support_model_collision(fname, supportcfg);
@@ -147,26 +151,19 @@ TEST_CASE("ElevatedSupportsDoNotPierceModel", "[SLASupportGeneration]") {
TEST_CASE("FloorSupportsDoNotPierceModel", "[SLASupportGeneration]") {
- sla::SupportConfig supportcfg;
+ sla::SupportTreeConfig supportcfg;
supportcfg.object_elevation_mm = 0;
for (auto fname : SUPPORT_TEST_MODELS)
test_support_model_collision(fname, supportcfg);
}
-TEST_CASE("DefaultRasterShouldBeEmpty", "[SLARasterOutput]") {
- sla::Raster raster;
- REQUIRE(raster.empty());
-}
-
TEST_CASE("InitializedRasterShouldBeNONEmpty", "[SLARasterOutput]") {
// Default Prusa SL1 display parameters
- sla::Raster::Resolution res{2560, 1440};
- sla::Raster::PixelDim pixdim{120. / res.width_px, 68. / res.height_px};
+ sla::RasterBase::Resolution res{2560, 1440};
+ sla::RasterBase::PixelDim pixdim{120. / res.width_px, 68. / res.height_px};
- sla::Raster raster;
- raster.reset(res, pixdim);
- REQUIRE_FALSE(raster.empty());
+ sla::RasterGrayscaleAAGammaPower raster(res, pixdim, {}, 1.);
REQUIRE(raster.resolution().width_px == res.width_px);
REQUIRE(raster.resolution().height_px == res.height_px);
REQUIRE(raster.pixel_dimensions().w_mm == Approx(pixdim.w_mm));
@@ -174,13 +171,14 @@ TEST_CASE("InitializedRasterShouldBeNONEmpty", "[SLARasterOutput]") {
}
TEST_CASE("MirroringShouldBeCorrect", "[SLARasterOutput]") {
- sla::Raster::TMirroring mirrorings[] = {sla::Raster::NoMirror,
- sla::Raster::MirrorX,
- sla::Raster::MirrorY,
- sla::Raster::MirrorXY};
+ sla::RasterBase::TMirroring mirrorings[] = {sla::RasterBase::NoMirror,
+ sla::RasterBase::MirrorX,
+ sla::RasterBase::MirrorY,
+ sla::RasterBase::MirrorXY};
+
+ sla::RasterBase::Orientation orientations[] =
+ {sla::RasterBase::roLandscape, sla::RasterBase::roPortrait};
- sla::Raster::Orientation orientations[] = {sla::Raster::roLandscape,
- sla::Raster::roPortrait};
for (auto orientation : orientations)
for (auto &mirror : mirrorings)
check_raster_transformations(orientation, mirror);
@@ -189,10 +187,11 @@ TEST_CASE("MirroringShouldBeCorrect", "[SLARasterOutput]") {
TEST_CASE("RasterizedPolygonAreaShouldMatch", "[SLARasterOutput]") {
double disp_w = 120., disp_h = 68.;
- sla::Raster::Resolution res{2560, 1440};
- sla::Raster::PixelDim pixdim{disp_w / res.width_px, disp_h / res.height_px};
+ sla::RasterBase::Resolution res{2560, 1440};
+ sla::RasterBase::PixelDim pixdim{disp_w / res.width_px, disp_h / res.height_px};
- sla::Raster raster{res, pixdim};
+ double gamma = 1.;
+ sla::RasterGrayscaleAAGammaPower raster(res, pixdim, {}, gamma);
auto bb = BoundingBox({0, 0}, {scaled(disp_w), scaled(disp_h)});
ExPolygon poly = square_with_hole(10.);
@@ -215,6 +214,13 @@ TEST_CASE("RasterizedPolygonAreaShouldMatch", "[SLARasterOutput]") {
diff = std::abs(a - ra);
REQUIRE(diff <= predict_error(poly, pixdim));
+
+ sla::RasterGrayscaleAA raster0(res, pixdim, {}, [](double) { return 0.; });
+ REQUIRE(raster_pxsum(raster0) == 0);
+
+ raster0.draw(poly);
+ ra = raster_white_area(raster);
+ REQUIRE(raster_pxsum(raster0) == 0);
}
TEST_CASE("Triangle mesh conversions should be correct", "[SLAConversions]")
@@ -226,3 +232,23 @@ TEST_CASE("Triangle mesh conversions should be correct", "[SLAConversions]")
cntr.from_obj(infile);
}
}
+
+TEST_CASE("halfcone test", "[halfcone]") {
+ sla::DiffBridge br{Vec3d{1., 1., 1.}, Vec3d{10., 10., 10.}, 0.25, 0.5};
+
+ TriangleMesh m = sla::to_triangle_mesh(sla::get_mesh(br, 45));
+
+ m.require_shared_vertices();
+ m.WriteOBJFile("Halfcone.obj");
+}
+
+TEST_CASE("Test concurrency")
+{
+ std::vector<double> vals = grid(0., 100., 10.);
+
+ double ref = std::accumulate(vals.begin(), vals.end(), 0.);
+
+ double s = sla::ccr_par::reduce(vals.begin(), vals.end(), 0., std::plus<double>{});
+
+ REQUIRE(s == Approx(ref));
+}
diff --git a/tests/sla_print/sla_raycast_tests.cpp b/tests/sla_print/sla_raycast_tests.cpp
index 74c799472..b56909280 100644
--- a/tests/sla_print/sla_raycast_tests.cpp
+++ b/tests/sla_print/sla_raycast_tests.cpp
@@ -1,7 +1,7 @@
#include <catch2/catch.hpp>
#include <test_utils.hpp>
-#include <libslic3r/SLA/EigenMesh3D.hpp>
+#include <libslic3r/SLA/IndexedMesh.hpp>
#include <libslic3r/SLA/Hollowing.hpp>
#include "sla_test_utils.hpp"
@@ -39,7 +39,7 @@ TEST_CASE("Raycaster - find intersections of a line and cylinder")
REQUIRE(std::abs(out[1].first - std::sqrt(72.f)) < 0.001f);
}
-
+#ifdef SLIC3R_HOLE_RAYCASTER
// Create a simple scene with a 20mm cube and a big hole in the front wall
// with 5mm radius. Then shoot rays from interesting positions and see where
// they land.
@@ -65,7 +65,7 @@ TEST_CASE("Raycaster with loaded drillholes", "[sla_raycast]")
cube.merge(*cube_inside);
cube.require_shared_vertices();
- sla::EigenMesh3D emesh{cube};
+ sla::IndexedMesh emesh{cube};
emesh.load_holes(holes);
Vec3d s = center.cast<double>();
@@ -94,3 +94,4 @@ TEST_CASE("Raycaster with loaded drillholes", "[sla_raycast]")
// Check for support tree correctness
test_support_model_collision("20mm_cube.obj", {}, hcfg, holes);
}
+#endif
diff --git a/tests/sla_print/sla_supptgen_tests.cpp b/tests/sla_print/sla_supptgen_tests.cpp
new file mode 100644
index 000000000..ee9013a44
--- /dev/null
+++ b/tests/sla_print/sla_supptgen_tests.cpp
@@ -0,0 +1,146 @@
+#include <catch2/catch.hpp>
+#include <test_utils.hpp>
+
+#include <libslic3r/ExPolygon.hpp>
+#include <libslic3r/BoundingBox.hpp>
+
+#include "sla_test_utils.hpp"
+
+namespace Slic3r { namespace sla {
+
+TEST_CASE("Overhanging point should be supported", "[SupGen]") {
+
+ // Pyramid with 45 deg slope
+ TriangleMesh mesh = make_pyramid(10.f, 10.f);
+ mesh.rotate_y(PI);
+ mesh.require_shared_vertices();
+ mesh.WriteOBJFile("Pyramid.obj");
+
+ sla::SupportPoints pts = calc_support_pts(mesh);
+
+ // The overhang, which is the upside-down pyramid's edge
+ Vec3f overh{0., 0., -10.};
+
+ REQUIRE(!pts.empty());
+
+ float dist = (overh - pts.front().pos).norm();
+
+ for (const auto &pt : pts)
+ dist = std::min(dist, (overh - pt.pos).norm());
+
+ // Should require exactly one support point at the overhang
+ REQUIRE(pts.size() > 0);
+ REQUIRE(dist < 1.f);
+}
+
+double min_point_distance(const sla::SupportPoints &pts)
+{
+ sla::PointIndex index;
+
+ for (size_t i = 0; i < pts.size(); ++i)
+ index.insert(pts[i].pos.cast<double>(), i);
+
+ auto d = std::numeric_limits<double>::max();
+ index.foreach([&d, &index](const sla::PointIndexEl &el) {
+ auto res = index.nearest(el.first, 2);
+ for (const sla::PointIndexEl &r : res)
+ if (r.second != el.second)
+ d = std::min(d, (el.first - r.first).norm());
+ });
+
+ return d;
+}
+
+TEST_CASE("Overhanging horizontal surface should be supported", "[SupGen]") {
+ double width = 10., depth = 10., height = 1.;
+
+ TriangleMesh mesh = make_cube(width, depth, height);
+ mesh.translate(0., 0., 5.); // lift up
+ mesh.require_shared_vertices();
+ mesh.WriteOBJFile("Cuboid.obj");
+
+ sla::SupportPointGenerator::Config cfg;
+ sla::SupportPoints pts = calc_support_pts(mesh, cfg);
+
+ double mm2 = width * depth;
+
+ REQUIRE(!pts.empty());
+ REQUIRE(pts.size() * cfg.support_force() > mm2 * cfg.tear_pressure());
+ REQUIRE(min_point_distance(pts) >= cfg.minimal_distance);
+}
+
+template<class M> auto&& center_around_bb(M &&mesh)
+{
+ auto bb = mesh.bounding_box();
+ mesh.translate(-bb.center().template cast<float>());
+
+ return std::forward<M>(mesh);
+}
+
+TEST_CASE("Overhanging edge should be supported", "[SupGen]") {
+ float width = 10.f, depth = 10.f, height = 5.f;
+
+ TriangleMesh mesh = make_prism(width, depth, height);
+ mesh.rotate_y(PI); // rotate on its back
+ mesh.translate(0., 0., height);
+ mesh.require_shared_vertices();
+ mesh.WriteOBJFile("Prism.obj");
+
+ sla::SupportPointGenerator::Config cfg;
+ sla::SupportPoints pts = calc_support_pts(mesh, cfg);
+
+ Linef3 overh{ {0.f, -depth / 2.f, 0.f}, {0.f, depth / 2.f, 0.f}};
+
+ // Get all the points closer that 1 mm to the overhanging edge:
+ sla::SupportPoints overh_pts; overh_pts.reserve(pts.size());
+
+ std::copy_if(pts.begin(), pts.end(), std::back_inserter(overh_pts),
+ [&overh](const sla::SupportPoint &pt){
+ return line_alg::distance_to(overh, Vec3d{pt.pos.cast<double>()}) < 1.;
+ });
+
+ REQUIRE(overh_pts.size() * cfg.support_force() > overh.length() * cfg.tear_pressure());
+ double ddiff = min_point_distance(pts) - cfg.minimal_distance;
+ REQUIRE(ddiff > - 0.1 * cfg.minimal_distance);
+}
+
+TEST_CASE("Hollowed cube should be supported from the inside", "[SupGen][Hollowed]") {
+ TriangleMesh mesh = make_cube(20., 20., 20.);
+
+ hollow_mesh(mesh, HollowingConfig{});
+
+ mesh.WriteOBJFile("cube_hollowed.obj");
+
+ auto bb = mesh.bounding_box();
+ auto h = float(bb.max.z() - bb.min.z());
+ Vec3f mv = bb.center().cast<float>() - Vec3f{0.f, 0.f, 0.5f * h};
+ mesh.translate(-mv);
+ mesh.require_shared_vertices();
+
+ sla::SupportPointGenerator::Config cfg;
+ sla::SupportPoints pts = calc_support_pts(mesh, cfg);
+ sla::remove_bottom_points(pts, mesh.bounding_box().min.z() + EPSILON);
+
+ REQUIRE(!pts.empty());
+}
+
+TEST_CASE("Two parallel plates should be supported", "[SupGen][Hollowed]")
+{
+ double width = 20., depth = 20., height = 1.;
+
+ TriangleMesh mesh = center_around_bb(make_cube(width + 5., depth + 5., height));
+ TriangleMesh mesh_high = center_around_bb(make_cube(width, depth, height));
+ mesh_high.translate(0., 0., 10.); // lift up
+ mesh.merge(mesh_high);
+ mesh.require_shared_vertices();
+
+ mesh.WriteOBJFile("parallel_plates.obj");
+
+ sla::SupportPointGenerator::Config cfg;
+ sla::SupportPoints pts = calc_support_pts(mesh, cfg);
+ sla::remove_bottom_points(pts, mesh.bounding_box().min.z() + EPSILON);
+
+ REQUIRE(!pts.empty());
+}
+
+}} // namespace Slic3r::sla
diff --git a/tests/sla_print/sla_test_utils.cpp b/tests/sla_print/sla_test_utils.cpp
index a844b2eae..653221cd3 100644
--- a/tests/sla_print/sla_test_utils.cpp
+++ b/tests/sla_print/sla_test_utils.cpp
@@ -1,13 +1,14 @@
#include "sla_test_utils.hpp"
+#include "libslic3r/SLA/AGGRaster.hpp"
void test_support_model_collision(const std::string &obj_filename,
- const sla::SupportConfig &input_supportcfg,
+ const sla::SupportTreeConfig &input_supportcfg,
const sla::HollowingConfig &hollowingcfg,
const sla::DrainHoles &drainholes)
{
SupportByproducts byproducts;
- sla::SupportConfig supportcfg = input_supportcfg;
+ sla::SupportTreeConfig supportcfg = input_supportcfg;
// Set head penetration to a small negative value which should ensure that
// the supports will not touch the model body.
@@ -37,7 +38,10 @@ void test_support_model_collision(const std::string &obj_filename,
Polygons intersections = intersection(sup_slice, mod_slice);
- notouch = notouch && intersections.empty();
+ double pinhead_r = scaled(input_supportcfg.head_front_radius_mm);
+
+ // TODO:: make it strict without a threshold of PI * pihead_radius ^ 2
+ notouch = notouch && area(intersections) < PI * pinhead_r * pinhead_r;
}
/*if (!notouch) */export_failed_case(support_slices, byproducts);
@@ -68,11 +72,12 @@ void export_failed_case(const std::vector<ExPolygons> &support_slices, const Sup
m.merge(byproducts.input_mesh);
m.repair();
m.require_shared_vertices();
- m.WriteOBJFile(byproducts.obj_fname.c_str());
+ m.WriteOBJFile((Catch::getResultCapture().getCurrentTestName() + "_" +
+ byproducts.obj_fname).c_str());
}
void test_supports(const std::string &obj_filename,
- const sla::SupportConfig &supportcfg,
+ const sla::SupportTreeConfig &supportcfg,
const sla::HollowingConfig &hollowingcfg,
const sla::DrainHoles &drainholes,
SupportByproducts &out)
@@ -103,9 +108,14 @@ void test_supports(const std::string &obj_filename,
// Create the special index-triangle mesh with spatial indexing which
// is the input of the support point and support mesh generators
- sla::EigenMesh3D emesh{mesh};
+ sla::IndexedMesh emesh{mesh};
+
+#ifdef SLIC3R_HOLE_RAYCASTER
if (hollowingcfg.enabled)
emesh.load_holes(drainholes);
+#endif
+
+ // TODO: do the cgal hole cutting...
// Create the support point generator
sla::SupportPointGenerator::Config autogencfg;
@@ -123,8 +133,7 @@ void test_supports(const std::string &obj_filename,
// If there is no elevation, support points shall be removed from the
// bottom of the object.
if (std::abs(supportcfg.object_elevation_mm) < EPSILON) {
- sla::remove_bottom_points(support_points, zmin,
- supportcfg.base_height_mm);
+ sla::remove_bottom_points(support_points, zmin + supportcfg.base_height_mm);
} else {
// Should be support points at least on the bottom of the model
REQUIRE_FALSE(support_points.empty());
@@ -135,7 +144,8 @@ void test_supports(const std::string &obj_filename,
// Generate the actual support tree
sla::SupportTreeBuilder treebuilder;
- treebuilder.build(sla::SupportableMesh{emesh, support_points, supportcfg});
+ sla::SupportableMesh sm{emesh, support_points, supportcfg};
+ sla::SupportTreeBuildsteps::execute(treebuilder, sm);
check_support_tree_integrity(treebuilder, supportcfg);
@@ -151,8 +161,8 @@ void test_supports(const std::string &obj_filename,
if (std::abs(supportcfg.object_elevation_mm) < EPSILON)
allowed_zmin = zmin - 2 * supportcfg.head_back_radius_mm;
- REQUIRE(obb.min.z() >= allowed_zmin);
- REQUIRE(obb.max.z() <= zmax);
+ REQUIRE(obb.min.z() >= Approx(allowed_zmin));
+ REQUIRE(obb.max.z() <= Approx(zmax));
// Move out the support tree into the byproducts, we can examine it further
// in various tests.
@@ -162,15 +172,15 @@ void test_supports(const std::string &obj_filename,
}
void check_support_tree_integrity(const sla::SupportTreeBuilder &stree,
- const sla::SupportConfig &cfg)
+ const sla::SupportTreeConfig &cfg)
{
double gnd = stree.ground_level;
double H1 = cfg.max_solo_pillar_height_mm;
double H2 = cfg.max_dual_pillar_height_mm;
for (const sla::Head &head : stree.heads()) {
- REQUIRE((!head.is_valid() || head.pillar_id != sla::ID_UNSET ||
- head.bridge_id != sla::ID_UNSET));
+ REQUIRE((!head.is_valid() || head.pillar_id != sla::SupportTreeNode::ID_UNSET ||
+ head.bridge_id != sla::SupportTreeNode::ID_UNSET));
}
for (const sla::Pillar &pillar : stree.pillars()) {
@@ -198,7 +208,7 @@ void check_support_tree_integrity(const sla::SupportTreeBuilder &stree,
};
for (auto &bridge : stree.bridges()) chck_bridge(bridge, max_bridgelen);
- REQUIRE(max_bridgelen <= cfg.max_bridge_length_mm);
+ REQUIRE(max_bridgelen <= Approx(cfg.max_bridge_length_mm));
max_bridgelen = 0;
for (auto &bridge : stree.crossbridges()) chck_bridge(bridge, max_bridgelen);
@@ -293,18 +303,19 @@ void check_validity(const TriangleMesh &input_mesh, int flags)
}
}
-void check_raster_transformations(sla::Raster::Orientation o, sla::Raster::TMirroring mirroring)
+void check_raster_transformations(sla::RasterBase::Orientation o, sla::RasterBase::TMirroring mirroring)
{
double disp_w = 120., disp_h = 68.;
- sla::Raster::Resolution res{2560, 1440};
- sla::Raster::PixelDim pixdim{disp_w / res.width_px, disp_h / res.height_px};
+ sla::RasterBase::Resolution res{2560, 1440};
+ sla::RasterBase::PixelDim pixdim{disp_w / res.width_px, disp_h / res.height_px};
auto bb = BoundingBox({0, 0}, {scaled(disp_w), scaled(disp_h)});
- sla::Raster::Trafo trafo{o, mirroring};
- trafo.origin_x = bb.center().x();
- trafo.origin_y = bb.center().y();
+ sla::RasterBase::Trafo trafo{o, mirroring};
+ trafo.center_x = bb.center().x();
+ trafo.center_y = bb.center().y();
+ double gamma = 1.;
- sla::Raster raster{res, pixdim, trafo};
+ sla::RasterGrayscaleAAGammaPower raster{res, pixdim, trafo, gamma};
// create box of size 32x32 pixels (not 1x1 to avoid antialiasing errors)
coord_t pw = 32 * coord_t(std::ceil(scaled<double>(pixdim.w_mm)));
@@ -319,7 +330,7 @@ void check_raster_transformations(sla::Raster::Orientation o, sla::Raster::TMirr
// Now calculate the position of the translated box according to output
// trafo.
- if (o == sla::Raster::Orientation::roPortrait) expected_box.rotate(PI / 2.);
+ if (o == sla::RasterBase::Orientation::roPortrait) expected_box.rotate(PI / 2.);
if (mirroring[X])
for (auto &p : expected_box.contour.points) p.x() = -p.x();
@@ -340,10 +351,9 @@ void check_raster_transformations(sla::Raster::Orientation o, sla::Raster::TMirr
auto px = raster.read_pixel(w, h);
if (px != FullWhite) {
- sla::PNGImage img;
std::fstream outf("out.png", std::ios::out);
- outf << img.serialize(raster);
+ outf << raster.encode(sla::PNGRasterEncoder());
}
REQUIRE(px == FullWhite);
@@ -361,9 +371,21 @@ ExPolygon square_with_hole(double v)
return poly;
}
-double raster_white_area(const sla::Raster &raster)
+long raster_pxsum(const sla::RasterGrayscaleAA &raster)
{
- if (raster.empty()) return std::nan("");
+ auto res = raster.resolution();
+ long a = 0;
+
+ for (size_t x = 0; x < res.width_px; ++x)
+ for (size_t y = 0; y < res.height_px; ++y)
+ a += raster.read_pixel(x, y);
+
+ return a;
+}
+
+double raster_white_area(const sla::RasterGrayscaleAA &raster)
+{
+ if (raster.resolution().pixels() == 0) return std::nan("");
auto res = raster.resolution();
double a = 0;
@@ -377,7 +399,7 @@ double raster_white_area(const sla::Raster &raster)
return a;
}
-double predict_error(const ExPolygon &p, const sla::Raster::PixelDim &pd)
+double predict_error(const ExPolygon &p, const sla::RasterBase::PixelDim &pd)
{
auto lines = p.lines();
double pix_err = pixel_area(FullWhite, pd) / 2.;
@@ -392,3 +414,71 @@ double predict_error(const ExPolygon &p, const sla::Raster::PixelDim &pd)
return error;
}
+
+
+// Make a 3D pyramid
+TriangleMesh make_pyramid(float base, float height)
+{
+ float a = base / 2.f;
+
+ TriangleMesh mesh(
+ {
+ {-a, -a, 0}, {a, -a, 0}, {a, a, 0},
+ {-a, a, 0}, {0.f, 0.f, height}
+ },
+ {
+ {0, 1, 2},
+ {0, 2, 3},
+ {0, 1, 4},
+ {1, 2, 4},
+ {2, 3, 4},
+ {3, 0, 4}
+ });
+
+ mesh.repair();
+
+ return mesh;
+}
+
+ TriangleMesh make_prism(double width, double length, double height)
+{
+ // We need two upward facing triangles
+
+ double x = width / 2., y = length / 2.;
+
+ TriangleMesh mesh(
+ {
+ {-x, -y, 0.}, {x, -y, 0.}, {0., -y, height},
+ {-x, y, 0.}, {x, y, 0.}, {0., y, height},
+ },
+ {
+ {0, 1, 2}, // side 1
+ {4, 3, 5}, // side 2
+ {1, 4, 2}, {2, 4, 5}, // roof 1
+ {0, 2, 5}, {0, 5, 3}, // roof 2
+ {3, 4, 1}, {3, 1, 0} // bottom
+ });
+
+ return mesh;
+}
+
+sla::SupportPoints calc_support_pts(
+ const TriangleMesh & mesh,
+ const sla::SupportPointGenerator::Config &cfg)
+{
+ // Prepare the slice grid and the slices
+ std::vector<ExPolygons> slices;
+ auto bb = cast<float>(mesh.bounding_box());
+ std::vector<float> heights = grid(bb.min.z(), bb.max.z(), 0.1f);
+ slice_mesh(mesh, heights, slices, CLOSING_RADIUS, [] {});
+
+ // Prepare the support point calculator
+ sla::IndexedMesh emesh{mesh};
+ sla::SupportPointGenerator spgen{emesh, cfg, []{}, [](int){}};
+
+ // Calculate the support points
+ spgen.seed(0);
+ spgen.execute(slices, heights);
+
+ return spgen.output();
+}
diff --git a/tests/sla_print/sla_test_utils.hpp b/tests/sla_print/sla_test_utils.hpp
index f3727bd39..d10a85b25 100644
--- a/tests/sla_print/sla_test_utils.hpp
+++ b/tests/sla_print/sla_test_utils.hpp
@@ -16,7 +16,7 @@
#include "libslic3r/SLA/SupportTreeBuilder.hpp"
#include "libslic3r/SLA/SupportTreeBuildsteps.hpp"
#include "libslic3r/SLA/SupportPointGenerator.hpp"
-#include "libslic3r/SLA/Raster.hpp"
+#include "libslic3r/SLA/AGGRaster.hpp"
#include "libslic3r/SLA/ConcaveHull.hpp"
#include "libslic3r/MTUtils.hpp"
@@ -67,16 +67,16 @@ struct SupportByproducts
const constexpr float CLOSING_RADIUS = 0.005f;
void check_support_tree_integrity(const sla::SupportTreeBuilder &stree,
- const sla::SupportConfig &cfg);
+ const sla::SupportTreeConfig &cfg);
void test_supports(const std::string &obj_filename,
- const sla::SupportConfig &supportcfg,
+ const sla::SupportTreeConfig &supportcfg,
const sla::HollowingConfig &hollowingcfg,
const sla::DrainHoles &drainholes,
SupportByproducts &out);
inline void test_supports(const std::string &obj_filename,
- const sla::SupportConfig &supportcfg,
+ const sla::SupportTreeConfig &supportcfg,
SupportByproducts &out)
{
sla::HollowingConfig hcfg;
@@ -85,7 +85,7 @@ inline void test_supports(const std::string &obj_filename,
}
inline void test_supports(const std::string &obj_filename,
- const sla::SupportConfig &supportcfg = {})
+ const sla::SupportTreeConfig &supportcfg = {})
{
SupportByproducts byproducts;
test_supports(obj_filename, supportcfg, byproducts);
@@ -97,13 +97,13 @@ void export_failed_case(const std::vector<ExPolygons> &support_slices,
void test_support_model_collision(
const std::string &obj_filename,
- const sla::SupportConfig &input_supportcfg,
+ const sla::SupportTreeConfig &input_supportcfg,
const sla::HollowingConfig &hollowingcfg,
const sla::DrainHoles &drainholes);
inline void test_support_model_collision(
const std::string &obj_filename,
- const sla::SupportConfig &input_supportcfg = {})
+ const sla::SupportTreeConfig &input_supportcfg = {})
{
sla::HollowingConfig hcfg;
hcfg.enabled = false;
@@ -170,18 +170,28 @@ static constexpr const TPixel FullBlack = 0;
template <class A, int N> constexpr int arraysize(const A (&)[N]) { return N; }
-void check_raster_transformations(sla::Raster::Orientation o,
- sla::Raster::TMirroring mirroring);
+void check_raster_transformations(sla::RasterBase::Orientation o,
+ sla::RasterBase::TMirroring mirroring);
ExPolygon square_with_hole(double v);
-inline double pixel_area(TPixel px, const sla::Raster::PixelDim &pxdim)
+inline double pixel_area(TPixel px, const sla::RasterBase::PixelDim &pxdim)
{
return (pxdim.h_mm * pxdim.w_mm) * px * 1. / (FullWhite - FullBlack);
}
-double raster_white_area(const sla::Raster &raster);
+double raster_white_area(const sla::RasterGrayscaleAA &raster);
+long raster_pxsum(const sla::RasterGrayscaleAA &raster);
-double predict_error(const ExPolygon &p, const sla::Raster::PixelDim &pd);
+double predict_error(const ExPolygon &p, const sla::RasterBase::PixelDim &pd);
+
+// Make a 3D pyramid
+TriangleMesh make_pyramid(float base, float height);
+
+TriangleMesh make_prism(double width, double length, double height);
+
+sla::SupportPoints calc_support_pts(
+ const TriangleMesh & mesh,
+ const sla::SupportPointGenerator::Config &cfg = {});
#endif // SLA_TEST_UTILS_HPP
diff --git a/tests/slic3rutils/slic3rutils_tests_main.cpp b/tests/slic3rutils/slic3rutils_tests_main.cpp
index b82114976..06989c5ee 100644
--- a/tests/slic3rutils/slic3rutils_tests_main.cpp
+++ b/tests/slic3rutils/slic3rutils_tests_main.cpp
@@ -2,7 +2,7 @@
#include "slic3r/Utils/Http.hpp"
-TEST_CASE("Http", "[Http][NotWorking]") {
+TEST_CASE("Check SSL certificates paths", "[Http][NotWorking]") {
Slic3r::Http g = Slic3r::Http::get("https://github.com/");
@@ -20,3 +20,41 @@ TEST_CASE("Http", "[Http][NotWorking]") {
REQUIRE(status == 200);
}
+TEST_CASE("Http digest authentication", "[Http][NotWorking]") {
+ Slic3r::Http g = Slic3r::Http::get("https://jigsaw.w3.org/HTTP/Digest/");
+
+ g.auth_digest("guest", "guest");
+
+ unsigned status = 0;
+ g.on_error([&status](std::string, std::string, unsigned http_status) {
+ status = http_status;
+ });
+
+ g.on_complete([&status](std::string /* body */, unsigned http_status){
+ status = http_status;
+ });
+
+ g.perform_sync();
+
+ REQUIRE(status == 200);
+}
+
+TEST_CASE("Http basic authentication", "[Http][NotWorking]") {
+ Slic3r::Http g = Slic3r::Http::get("https://jigsaw.w3.org/HTTP/Basic/");
+
+ g.auth_basic("guest", "guest");
+
+ unsigned status = 0;
+ g.on_error([&status](std::string, std::string, unsigned http_status) {
+ status = http_status;
+ });
+
+ g.on_complete([&status](std::string /* body */, unsigned http_status){
+ status = http_status;
+ });
+
+ g.perform_sync();
+
+ REQUIRE(status == 200);
+}
+
diff --git a/version.inc b/version.inc
index 15c0ab845..1a848cd6f 100644
--- a/version.inc
+++ b/version.inc
@@ -3,7 +3,7 @@
set(SLIC3R_APP_NAME "PrusaSlicer")
set(SLIC3R_APP_KEY "PrusaSlicer")
-set(SLIC3R_VERSION "2.2.0")
+set(SLIC3R_VERSION "2.3.0")
set(SLIC3R_BUILD_ID "PrusaSlicer-${SLIC3R_VERSION}+UNKNOWN")
-set(SLIC3R_RC_VERSION "2,2,0,0")
-set(SLIC3R_RC_VERSION_DOTS "2.2.0.0")
+set(SLIC3R_RC_VERSION "2,3,0,0")
+set(SLIC3R_RC_VERSION_DOTS "2.3.0.0")
diff --git a/xs/CMakeLists.txt b/xs/CMakeLists.txt
index a59a19936..962e2e04d 100644
--- a/xs/CMakeLists.txt
+++ b/xs/CMakeLists.txt
@@ -62,7 +62,6 @@ set(XS_XSP_FILES
${XSP_DIR}/Layer.xsp
${XSP_DIR}/Line.xsp
${XSP_DIR}/Model.xsp
- ${XSP_DIR}/MotionPlanner.xsp
${XSP_DIR}/PerimeterGenerator.xsp
${XSP_DIR}/PlaceholderParser.xsp
${XSP_DIR}/Point.xsp
@@ -185,6 +184,16 @@ if (MSVC)
string(REPLACE "/" "\\" PROPS_CMAKE_SOURCE_DIR "${CMAKE_SOURCE_DIR}")
configure_file("../cmake/msvc/xs.wperl.props.in" "${CMAKE_BINARY_DIR}/xs.wperl.props" NEWLINE_STYLE CRLF)
set_target_properties(XS PROPERTIES VS_USER_PROPS "${CMAKE_BINARY_DIR}/xs.wperl.props")
+
+ if ("${CMAKE_SIZEOF_VOID_P}" STREQUAL "8")
+ set(_bits 64)
+ elseif ("${CMAKE_SIZEOF_VOID_P}" STREQUAL "4")
+ set(_bits 32)
+ endif ()
+ add_custom_command(TARGET XS POST_BUILD
+ COMMAND ${CMAKE_COMMAND} -E copy ${TOP_LEVEL_PROJECT_DIR}/deps/GMP/gmp/lib/win${_bits}/libgmp-10.dll "${PERL_LOCAL_LIB_ARCH_DIR}/auto/Slic3r/XS/"
+ COMMENT "Installing gmp runtime into the local-lib directory ..."
+ VERBATIM)
endif()
# Installation
diff --git a/xs/lib/Slic3r/XS.pm b/xs/lib/Slic3r/XS.pm
index 3073d068e..fa4dde43a 100644
--- a/xs/lib/Slic3r/XS.pm
+++ b/xs/lib/Slic3r/XS.pm
@@ -145,7 +145,6 @@ package Slic3r::Filler;
sub fill_surface {
my ($self, $surface, %args) = @_;
$self->set_density($args{density}) if defined($args{density});
- $self->set_dont_connect($args{dont_connect}) if defined($args{dont_connect});
$self->set_dont_adjust($args{dont_adjust}) if defined($args{dont_adjust});
$self->set_complete($args{complete}) if defined($args{complete});
return $self->_fill_surface($surface);
diff --git a/xs/main.xs.in b/xs/main.xs.in
index 3523d569e..c10f432d8 100644
--- a/xs/main.xs.in
+++ b/xs/main.xs.in
@@ -5,7 +5,7 @@
// #include <libslic3r/GCodeSender.hpp>
#ifdef __cplusplus
-extern "C" {
+/* extern "C" { */
#endif
#include "EXTERN.h"
#include "perl.h"
@@ -14,7 +14,7 @@ extern "C" {
#undef do_open
#undef do_close
#ifdef __cplusplus
-}
+/* } */
#endif
#ifdef _WIN32
diff --git a/xs/src/perlglue.cpp b/xs/src/perlglue.cpp
index c3cd7e616..aec6ceb6a 100644
--- a/xs/src/perlglue.cpp
+++ b/xs/src/perlglue.cpp
@@ -8,15 +8,12 @@ REGISTER_CLASS(ExPolygonCollection, "ExPolygon::Collection");
REGISTER_CLASS(ExtrusionMultiPath, "ExtrusionMultiPath");
REGISTER_CLASS(ExtrusionPath, "ExtrusionPath");
REGISTER_CLASS(ExtrusionLoop, "ExtrusionLoop");
-// there is no ExtrusionLoop::Collection or ExtrusionEntity::Collection
REGISTER_CLASS(ExtrusionEntityCollection, "ExtrusionPath::Collection");
REGISTER_CLASS(ExtrusionSimulator, "ExtrusionSimulator");
REGISTER_CLASS(Filler, "Filler");
REGISTER_CLASS(Flow, "Flow");
REGISTER_CLASS(CoolingBuffer, "GCode::CoolingBuffer");
REGISTER_CLASS(GCode, "GCode");
-REGISTER_CLASS(GCodePreviewData, "GCode::PreviewData");
-// REGISTER_CLASS(GCodeSender, "GCode::Sender");
REGISTER_CLASS(Layer, "Layer");
REGISTER_CLASS(SupportLayer, "Layer::Support");
REGISTER_CLASS(LayerRegion, "Layer::Region");
@@ -35,7 +32,6 @@ REGISTER_CLASS(ModelMaterial, "Model::Material");
REGISTER_CLASS(ModelObject, "Model::Object");
REGISTER_CLASS(ModelVolume, "Model::Volume");
REGISTER_CLASS(ModelInstance, "Model::Instance");
-REGISTER_CLASS(MotionPlanner, "MotionPlanner");
REGISTER_CLASS(BoundingBox, "Geometry::BoundingBox");
REGISTER_CLASS(BoundingBoxf, "Geometry::BoundingBoxf");
REGISTER_CLASS(BoundingBoxf3, "Geometry::BoundingBoxf3");
diff --git a/xs/src/xsinit.h b/xs/src/xsinit.h
index f14e1262d..2082dfb88 100644
--- a/xs/src/xsinit.h
+++ b/xs/src/xsinit.h
@@ -40,7 +40,7 @@
// #include <libslic3r.h>
#ifdef SLIC3RXS
-extern "C" {
+// extern "C" {
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"
@@ -88,7 +88,7 @@ extern "C" {
#undef Zero
#undef Packet
#undef _
-}
+// }
#endif
#include <ClipperUtils.hpp>
diff --git a/xs/t/15_config.t b/xs/t/15_config.t
index 1f9fc939b..55b679101 100644
--- a/xs/t/15_config.t
+++ b/xs/t/15_config.t
@@ -219,7 +219,7 @@ foreach my $config (Slic3r::Config->new, Slic3r::Config::Static::new_FullPrintCo
my $config = Slic3r::Config->new;
$config->set('extruder', 2);
$config->set('perimeter_extruder', 3);
- $config->normalize;
+ $config->normalize_fdm;
ok !$config->has('extruder'), 'extruder option is removed after normalize()';
is $config->get('infill_extruder'), 2, 'undefined extruder is populated with default extruder';
is $config->get('perimeter_extruder'), 3, 'defined extruder is not overwritten by default extruder';
@@ -228,7 +228,7 @@ foreach my $config (Slic3r::Config->new, Slic3r::Config::Static::new_FullPrintCo
{
my $config = Slic3r::Config->new;
$config->set('infill_extruder', 2);
- $config->normalize;
+ $config->normalize_fdm;
is $config->get('solid_infill_extruder'), 2, 'undefined solid infill extruder is populated with infill extruder';
}
@@ -236,7 +236,7 @@ foreach my $config (Slic3r::Config->new, Slic3r::Config::Static::new_FullPrintCo
my $config = Slic3r::Config->new;
$config->set('spiral_vase', 1);
$config->set('retract_layer_change', [1,0]);
- $config->normalize;
+ $config->normalize_fdm;
is_deeply $config->get('retract_layer_change'), [0,0], 'retract_layer_change is disabled with spiral_vase';
}
diff --git a/xs/t/18_motionplanner.t b/xs/t/18_motionplanner.t
deleted file mode 100644
index dfcfec67f..000000000
--- a/xs/t/18_motionplanner.t
+++ /dev/null
@@ -1,92 +0,0 @@
-#!/usr/bin/perl
-
-use strict;
-use warnings;
-
-BEGIN {
- use FindBin;
- use lib "$FindBin::Bin/../../lib";
-}
-
-use Slic3r::XS;
-use Test::More tests => 20;
-
-my $square = Slic3r::Polygon->new( # ccw
- [100, 100],
- [200, 100],
- [200, 200],
- [100, 200],
-);
-my $hole_in_square = Slic3r::Polygon->new( # cw
- [140, 140],
- [140, 160],
- [160, 160],
- [160, 140],
-);
-$_->scale(1/0.000001) for $square, $hole_in_square;
-
-my $expolygon = Slic3r::ExPolygon->new($square, $hole_in_square);
-
-{
- my $mp = Slic3r::MotionPlanner->new([ $expolygon ]);
- isa_ok $mp, 'Slic3r::MotionPlanner';
-
- my $from = Slic3r::Point->new(120, 120);
- my $to = Slic3r::Point->new(180,180);
- $_->scale(1/0.000001) for $from, $to;
- my $path = $mp->shortest_path($from, $to);
- ok $path->is_valid(), 'return path is valid';
- ok $path->length > Slic3r::Line->new($from, $to)->length, 'path length is greater than straight line';
- ok $path->first_point->coincides_with($from), 'first path point coincides with initial point';
- ok $path->last_point->coincides_with($to), 'last path point coincides with destination point';
- ok $expolygon->contains_polyline($path), 'path is fully contained in expolygon';
-}
-
-{
- my $mp = Slic3r::MotionPlanner->new([ $expolygon ]);
- isa_ok $mp, 'Slic3r::MotionPlanner';
-
- my $from = Slic3r::Point->new(80, 100);
- my $to = Slic3r::Point->new(220,200);
- $_->scale(1/0.000001) for $from, $to;
-
- my $path = $mp->shortest_path($from, $to);
- ok $path->is_valid(), 'return path is valid';
- ok $path->length > Slic3r::Line->new($from, $to)->length, 'path length is greater than straight line';
- ok $path->first_point->coincides_with($from), 'first path point coincides with initial point';
- ok $path->last_point->coincides_with($to), 'last path point coincides with destination point';
- is scalar(@{ Slic3r::Geometry::Clipper::intersection_pl([$path], [@$expolygon]) }), 0, 'path has no intersection with expolygon';
-}
-
-{
- my $expolygon2 = $expolygon->clone;
- $expolygon2->translate(300/0.000001, 0);
- my $mp = Slic3r::MotionPlanner->new([ $expolygon, $expolygon2 ]);
- isa_ok $mp, 'Slic3r::MotionPlanner';
-
- my $from = Slic3r::Point->new(120, 120);
- my $to = Slic3r::Point->new(120 + 300, 120);
- $_->scale(1/0.000001) for $from, $to;
- ok $expolygon->contains_point($from), 'start point is contained in first expolygon';
- ok $expolygon2->contains_point($to), 'end point is contained in second expolygon';
- my $path = $mp->shortest_path($from, $to);
- ok $path->is_valid(), 'return path is valid';
-}
-
-{
- my $expolygons = [
- Slic3r::ExPolygon->new([[123800962,89330311],[123959159,89699438],[124000004,89898430],[124000012,110116427],[123946510,110343065],[123767391,110701303],[123284087,111000001],[102585791,111000009],[102000004,110414223],[102000004,89585787],[102585790,89000000],[123300022,88999993]]),
- Slic3r::ExPolygon->new([[97800954,89330311],[97959151,89699438],[97999996,89898430],[98000004,110116427],[97946502,110343065],[97767383,110701303],[97284079,111000001],[76585783,111000009],[75999996,110414223],[75999996,89585787],[76585782,89000000],[97300014,88999993]]),
- ];
- my $mp = Slic3r::MotionPlanner->new($expolygons);
- isa_ok $mp, 'Slic3r::MotionPlanner';
-
- my $from = Slic3r::Point->new(79120520, 107839491);
- my $to = Slic3r::Point->new(104664164, 108335852);
- ok $expolygons->[1]->contains_point($from), 'start point is contained in second expolygon';
- ok $expolygons->[0]->contains_point($to), 'end point is contained in first expolygon';
- my $path = $mp->shortest_path($from, $to);
- ok $path->is_valid(), 'return path is valid';
-}
-
-__END__
diff --git a/xs/xsp/Config.xsp b/xs/xsp/Config.xsp
index 435dda5a2..b8f996797 100644
--- a/xs/xsp/Config.xsp
+++ b/xs/xsp/Config.xsp
@@ -48,9 +48,9 @@
%code{% THIS->apply(*other, true); %};
%name{get_keys} std::vector<std::string> keys();
void erase(t_config_option_key opt_key);
- void normalize();
+ void normalize_fdm();
%name{setenv} void setenv_();
- double min_object_distance() %code{% PrintConfig cfg; cfg.apply(*THIS, true); RETVAL = cfg.min_object_distance(); %};
+ double min_object_distance() %code{% RETVAL = Slic3r::min_object_distance(*THIS); %};
static DynamicPrintConfig* load(char *path)
%code%{
auto config = new DynamicPrintConfig();
@@ -114,7 +114,7 @@
}
%};
%name{setenv} void setenv_();
- double min_object_distance() %code{% RETVAL = PrintConfig::min_object_distance(THIS); %};
+ double min_object_distance() %code{% RETVAL = Slic3r::min_object_distance(*THIS); %};
static StaticPrintConfig* load(char *path)
%code%{
auto config = new FullPrintConfig();
diff --git a/xs/xsp/Filler.xsp b/xs/xsp/Filler.xsp
index 647d851eb..2ea2b34d5 100644
--- a/xs/xsp/Filler.xsp
+++ b/xs/xsp/Filler.xsp
@@ -34,12 +34,8 @@
void set_density(float density)
%code{% THIS->params.density = density; %};
- void set_dont_connect(bool dont_connect)
- %code{% THIS->params.dont_connect = dont_connect; %};
void set_dont_adjust(bool dont_adjust)
%code{% THIS->params.dont_adjust = dont_adjust; %};
- void set_complete(bool complete)
- %code{% THIS->params.complete = complete; %};
PolylineCollection* _fill_surface(Surface *surface)
%code{%
diff --git a/xs/xsp/GCode.xsp b/xs/xsp/GCode.xsp
index 9e04edd4c..4545984bb 100644
--- a/xs/xsp/GCode.xsp
+++ b/xs/xsp/GCode.xsp
@@ -4,7 +4,6 @@
#include <xsinit.h>
#include "libslic3r/GCode.hpp"
#include "libslic3r/GCode/CoolingBuffer.hpp"
-#include "libslic3r/GCode/PreviewData.hpp"
%}
%name{Slic3r::GCode::CoolingBuffer} class CoolingBuffer {
@@ -26,14 +25,6 @@
croak("%s\n", e.what());
}
%};
- void do_export_w_preview(Print *print, const char *path, GCodePreviewData *preview_data)
- %code%{
- try {
- THIS->do_export(print, path, preview_data);
- } catch (std::exception& e) {
- croak("%s\n", e.what());
- }
- %};
Ref<Vec2d> origin()
%code{% RETVAL = &(THIS->origin()); %};
@@ -59,27 +50,3 @@
Ref<StaticPrintConfig> config()
%code{% RETVAL = const_cast<StaticPrintConfig*>(static_cast<const StaticPrintConfig*>(static_cast<const PrintObjectConfig*>(&THIS->config()))); %};
};
-
-%name{Slic3r::GCode::PreviewData} class GCodePreviewData {
- GCodePreviewData();
- ~GCodePreviewData();
- void reset();
- bool empty() const;
- void set_type(int type)
- %code%{
- if ((0 <= type) && (type < GCodePreviewData::Extrusion::Num_View_Types))
- THIS->extrusion.view_type = (GCodePreviewData::Extrusion::EViewType)type;
- %};
- int type() %code%{ RETVAL = (int)THIS->extrusion.view_type; %};
- void set_extrusion_flags(int flags)
- %code%{ THIS->extrusion.role_flags = (unsigned int)flags; %};
- void set_travel_visible(bool visible)
- %code%{ THIS->travel.is_visible = visible; %};
- void set_retractions_visible(bool visible)
- %code%{ THIS->retraction.is_visible = visible; %};
- void set_unretractions_visible(bool visible)
- %code%{ THIS->unretraction.is_visible = visible; %};
- void set_shells_visible(bool visible)
- %code%{ THIS->shell.is_visible = visible; %};
- void set_extrusion_paths_colors(std::vector<std::string> colors);
-};
diff --git a/xs/xsp/Geometry.xsp b/xs/xsp/Geometry.xsp
index 5d6454e8a..e44d16949 100644
--- a/xs/xsp/Geometry.xsp
+++ b/xs/xsp/Geometry.xsp
@@ -13,7 +13,7 @@ Pointfs arrange(size_t total_parts, Vec2d* part, coordf_t dist, BoundingBoxf* bb
%code{%
Pointfs points;
if (! Slic3r::Geometry::arrange(total_parts, *part, dist, bb, points))
- CONFESS(PRINTF_ZU " parts won't fit in your print area!\n", total_parts);
+ CONFESS("%zu parts won't fit in your print area!\n", total_parts);
RETVAL = points;
%};
diff --git a/xs/xsp/Layer.xsp b/xs/xsp/Layer.xsp
index 6ca953f82..fdcc26eb6 100644
--- a/xs/xsp/Layer.xsp
+++ b/xs/xsp/Layer.xsp
@@ -70,7 +70,8 @@
%code%{ RETVAL = dynamic_cast<SupportLayer*>(THIS); %};
void make_slices();
- void merge_slices();
+ void backup_untyped_slices();
+ void restore_untyped_slices();
void make_perimeters();
void make_fills();
diff --git a/xs/xsp/Model.xsp b/xs/xsp/Model.xsp
index 35b1c01ce..93067ebe3 100644
--- a/xs/xsp/Model.xsp
+++ b/xs/xsp/Model.xsp
@@ -3,6 +3,7 @@
%{
#include <xsinit.h>
#include "libslic3r/Model.hpp"
+#include "libslic3r/ModelArrange.hpp"
#include "libslic3r/Print.hpp"
#include "libslic3r/PrintConfig.hpp"
#include "libslic3r/Slicing.hpp"
@@ -11,7 +12,7 @@
#include "libslic3r/Format/OBJ.hpp"
#include "libslic3r/Format/PRUS.hpp"
#include "libslic3r/Format/STL.hpp"
-#include "slic3r/GUI/PresetBundle.hpp"
+#include "libslic3r/PresetBundle.hpp"
%}
%name{Slic3r::Model} class Model {
@@ -80,9 +81,9 @@
ModelObjectPtrs* objects()
%code%{ RETVAL = &THIS->objects; %};
- bool arrange_objects(double dist, BoundingBoxf* bb = NULL);
- void duplicate(unsigned int copies_num, double dist, BoundingBoxf* bb = NULL);
- void duplicate_objects(unsigned int copies_num, double dist, BoundingBoxf* bb = NULL);
+ bool arrange_objects(double dist, BoundingBoxf* bb = NULL) %code%{ ArrangeParams ap{scaled(dist)}; if (bb) arrange_objects(*THIS, scaled(*bb), ap); else arrange_objects(*THIS, InfiniteBed{}, ap); %};
+ void duplicate(unsigned int copies_num, double dist, BoundingBoxf* bb = NULL) %code%{ ArrangeParams ap{scaled(dist)}; if (bb) duplicate(*THIS, copies_num, scaled(*bb), ap); else duplicate(*THIS, copies_num, InfiniteBed{}, ap); %};
+ void duplicate_objects(unsigned int copies_num, double dist, BoundingBoxf* bb = NULL) %code%{ ArrangeParams ap{scaled(dist)}; if (bb) duplicate_objects(*THIS, copies_num, scaled(*bb), ap); else duplicate_objects(*THIS, copies_num, InfiniteBed{}, ap); %};
void duplicate_objects_grid(unsigned int x, unsigned int y, double dist);
bool looks_like_multipart_object() const;
@@ -117,7 +118,7 @@ load_stl(CLASS, path, object_name)
%code%{ RETVAL = THIS->get_model(); %};
Ref<DynamicPrintConfig> config()
- %code%{ RETVAL = &THIS->config; %};
+ %code%{ RETVAL = &const_cast<DynamicPrintConfig&>(THIS->config.get()); %};
std::string get_attribute(std::string name)
%code%{ if (THIS->attributes.find(name) != THIS->attributes.end()) RETVAL = THIS->attributes[name]; %};
@@ -201,7 +202,7 @@ ModelMaterial::attributes()
void set_input_file(std::string value)
%code%{ THIS->input_file = value; %};
Ref<DynamicPrintConfig> config()
- %code%{ RETVAL = &THIS->config; %};
+ %code%{ RETVAL = &const_cast<DynamicPrintConfig&>(THIS->config.get()); %};
Ref<Model> model()
%code%{ RETVAL = THIS->get_model(); %};
@@ -247,7 +248,7 @@ ModelMaterial::attributes()
Ref<ModelMaterial> material();
Ref<DynamicPrintConfig> config()
- %code%{ RETVAL = &THIS->config; %};
+ %code%{ RETVAL = &const_cast<DynamicPrintConfig&>(THIS->config.get()); %};
Ref<TriangleMesh> mesh()
%code%{ RETVAL = &THIS->mesh(); %};
diff --git a/xs/xsp/MotionPlanner.xsp b/xs/xsp/MotionPlanner.xsp
deleted file mode 100644
index d93ed09ea..000000000
--- a/xs/xsp/MotionPlanner.xsp
+++ /dev/null
@@ -1,15 +0,0 @@
-%module{Slic3r::XS};
-
-%{
-#include <xsinit.h>
-#include "libslic3r/MotionPlanner.hpp"
-%}
-
-%name{Slic3r::MotionPlanner} class MotionPlanner {
- MotionPlanner(ExPolygons islands);
- ~MotionPlanner();
-
- int islands_count();
- Clone<Polyline> shortest_path(Point* from, Point* to)
- %code%{ RETVAL = THIS->shortest_path(*from, *to); %};
-};
diff --git a/xs/xsp/PerimeterGenerator.xsp b/xs/xsp/PerimeterGenerator.xsp
index 07059de61..a2f589d0b 100644
--- a/xs/xsp/PerimeterGenerator.xsp
+++ b/xs/xsp/PerimeterGenerator.xsp
@@ -3,6 +3,7 @@
%{
#include <xsinit.h>
#include "libslic3r/PerimeterGenerator.hpp"
+#include "libslic3r/Layer.hpp"
%}
%name{Slic3r::Layer::PerimeterGenerator} class PerimeterGenerator {
@@ -15,6 +16,7 @@
dynamic_cast<PrintRegionConfig*>(region_config),
dynamic_cast<PrintObjectConfig*>(object_config),
dynamic_cast<PrintConfig*>(print_config),
+ false,
loops, gap_fill, fill_surfaces); %};
~PerimeterGenerator();
diff --git a/xs/xsp/Print.xsp b/xs/xsp/Print.xsp
index 0952513ca..d9872aa7e 100644
--- a/xs/xsp/Print.xsp
+++ b/xs/xsp/Print.xsp
@@ -76,10 +76,10 @@ _constant()
%code%{ RETVAL = const_cast<ExtrusionEntityCollection*>(&THIS->skirt()); %};
Ref<ExtrusionEntityCollection> brim()
%code%{ RETVAL = const_cast<ExtrusionEntityCollection*>(&THIS->brim()); %};
- std::string estimated_normal_print_time()
- %code%{ RETVAL = THIS->print_statistics().estimated_normal_print_time; %};
- std::string estimated_silent_print_time()
- %code%{ RETVAL = THIS->print_statistics().estimated_silent_print_time; %};
+// std::string estimated_normal_print_time()
+// %code%{ RETVAL = THIS->print_statistics().estimated_normal_print_time; %};
+// std::string estimated_silent_print_time()
+// %code%{ RETVAL = THIS->print_statistics().estimated_silent_print_time; %};
double total_used_filament()
%code%{ RETVAL = THIS->print_statistics().total_used_filament; %};
double total_extruded_volume()
@@ -139,7 +139,18 @@ _constant()
%};
bool apply(Model *model, DynamicPrintConfig* config)
- %code%{ RETVAL = THIS->apply(*model, *config); %};
+ %code%{
+ // Touching every config as the Perl bindings does not correctly export ModelConfig,
+ // therefore the configs have often invalid timestamps.
+ for (auto obj : model->objects) {
+ obj->config.touch();
+ for (auto vol : obj->volumes)
+ vol->config.touch();
+ }
+ for (auto mat : model->materials)
+ mat.second->config.touch();
+ RETVAL = THIS->apply(*model, *config);
+ %};
bool has_infinite_skirt();
std::vector<unsigned int> extruders() const;
int validate() %code%{
diff --git a/xs/xsp/my.map b/xs/xsp/my.map
index fd50d2975..2ecff6e3f 100644
--- a/xs/xsp/my.map
+++ b/xs/xsp/my.map
@@ -191,18 +191,6 @@ GCode* O_OBJECT_SLIC3R
Ref<GCode> O_OBJECT_SLIC3R_T
Clone<GCode> O_OBJECT_SLIC3R_T
-GCodePreviewData* O_OBJECT_SLIC3R
-Ref<GCodePreviewData> O_OBJECT_SLIC3R_T
-Clone<GCodePreviewData> O_OBJECT_SLIC3R_T
-
-MotionPlanner* O_OBJECT_SLIC3R
-Ref<MotionPlanner> O_OBJECT_SLIC3R_T
-Clone<MotionPlanner> O_OBJECT_SLIC3R_T
-
-// GCodeSender* O_OBJECT_SLIC3R
-// Ref<GCodeSender> O_OBJECT_SLIC3R_T
-// Clone<GCodeSender> O_OBJECT_SLIC3R_T
-
BridgeDetector* O_OBJECT_SLIC3R
Ref<BridgeDetector> O_OBJECT_SLIC3R_T
Clone<BridgeDetector> O_OBJECT_SLIC3R_T
diff --git a/xs/xsp/typemap.xspt b/xs/xsp/typemap.xspt
index 7e277703b..2d364628e 100644
--- a/xs/xsp/typemap.xspt
+++ b/xs/xsp/typemap.xspt
@@ -97,12 +97,6 @@
%typemap{PolylineCollection*};
%typemap{Ref<PolylineCollection>}{simple};
%typemap{Clone<PolylineCollection>}{simple};
-%typemap{MotionPlanner*};
-%typemap{Ref<MotionPlanner>}{simple};
-%typemap{Clone<MotionPlanner>}{simple};
-// %typemap{GCodeSender*};
-// %typemap{Ref<GCodeSender>}{simple};
-// %typemap{Clone<GCodeSender>}{simple};
%typemap{BridgeDetector*};
%typemap{Ref<BridgeDetector>}{simple};
%typemap{Clone<BridgeDetector>}{simple};
@@ -155,9 +149,9 @@
%typemap{Ref<GCode>}{simple};
%typemap{Clone<GCode>}{simple};
-%typemap{GCodePreviewData*};
-%typemap{Ref<GCodePreviewData>}{simple};
-%typemap{Clone<GCodePreviewData>}{simple};
+//%typemap{GCodePreviewData*};
+//%typemap{Ref<GCodePreviewData>}{simple};
+//%typemap{Clone<GCodePreviewData>}{simple};
%typemap{Points};
%typemap{Pointfs};